[
  {
    "path": ".editorconfig",
    "content": "# http://editorconfig.org\n\nroot = true\n\n[*]\nend_of_line = lf\ninsert_final_newline = false\n\n[*.{js,ts,html}]\ncharset = utf-8\nindent_style = tab\nindent_size = 4\n\n[*.{js,ts}]\ntrim_trailing_whitespace = true"
  },
  {
    "path": ".gitattributes",
    "content": "# Set the default behavior, in case people don't have core.autocrlf set.\n* text=auto"
  },
  {
    "path": ".github/contributing.md",
    "content": "# t3d.js Contributing Guide\n\n## Issue Reporting Guidelines\n\nWelcome to use [Github](https://github.com/uinosoft/t3d.js/issues) to report a issues, request a feature, or ask a question.\n\n## Pull Request Guidelines\n\n- Don't send PRs to the `master` branch, send them to the `dev` branch instead.\n- Make sure your code lints (`npm run lint` ...).\n- Branch naming convention: use kebab naming, and start with `build|ci|docs|feat|fix|perf|refactor|test`, for example: `refactor-addons-pmrem`.\n- It's OK to have multiple small commits as you work on the PR - GitHub can automatically squash them before merging.\n\n## Development Setup\n\nYou will need [Node.js](https://nodejs.org), and NPM (which comes with Node.js) installed on your computer.\n\nAfter cloning the repository, run `npm install` to install all dependencies.\n\n## Scripts\n\n- `npm run build` - Build the core library to `build/t3d.js` and `build/t3d.module.js`\n- `npm run dev` - This will watch the source files and rebuild the library whenever they change\n- `npm run doc` - This will build the api documentation to `docs/`\n- `npm run lint` - This will lint the source files using ESLint\n- `npm run server` - This will start a local server where you can view the examples or docs\n\n## Git Commit Message Convention\n\nCurrently follows [Angular's commit convention](https://github.com/angular/angular/blob/main/CONTRIBUTING.md#commit).\n\n## Code Formatting\n\nCurrently, we use eslint to perform code specification and style checks to ensure code uniformity.\n\nYou can use npm scripts to lint the code, but it is more recommended to use an editor plug-in for automatic code formatting.\n\nIf you use VSCode, you can install the [ESLint](https://marketplace.visualstudio.com/items?itemName=dbaeumer.vscode-eslint) plug-in and enable the auto-fix option in the settings:\n\n````json\n{\n  \"editor.codeActionsOnSave\": {\n      \"source.fixAll.eslint\": true\n  }\n}\n````\n\n## Naming Conventions\n\n- Variable names use camelCase notation, for example: `camera`, `renderer`.\n- Class file name, class name uses camel case nomenclature, for example: `OrbitControls.js`, `OrbitControls`.\n- Use kebab naming for folder names, for example: `kebab`, `kebab-case`.\n\n## Comments\n\nWe use [JSDoc](https://jsdoc.app/) to generate api documentation, so all the public methods and properties should be documented with JSDoc.\n\n## Project Structure\n\nA overview of project structure:\n\n```bash\n├─ 📁 .github/            # Github related files\n│  ├─ 📁 workflows/       # Github ci workflows\n|  ├─ 📄 contributing.md  # Contributing guide\n├─ 📁 build/              # Build output\n├─ 📁 docs/               # Documentation output (not tracked by git)\n├─ 📁 examples/           # Examples\n│  ├─ 📁 jsm/             # Addons for t3d.js, exported to `t3d/addons/`\n├─ 📂 node_modules/       # Dependencies (not tracked by git)\n│  ├─ 📁 rollup           # Rollup dependencies\n│  └─ 📁 ...              # Other dependencies (@eslint, @jsdoc, etc.)\n├─ 📁 src/                # Source code for core package\n│  ├─ 📁 ...              # The core source files in sub category\n│  ├─ 📄 main.js          # The entry root, export all modules from /src\n├─ 📁 tests/              # Tests\n├─ 📁 tools/              # Some build tools\n│  ├─ 📄 doc.config.json  # JSDoc config\n│  ├─ 📄 ...              # Other tools\n├─ 📄 .editorconfig       # Editor config\n├─ 📄 .eslintrc.cjs       # ESLint config\n├─ 📄 .gitignore          # Git ignore\n├─ 📄 icon.jpg            # Icon for t3d.js\n├─ 📄 LICENSE             # License\n├─ 📄 package.json        # Package.json for core package\n├─ 📄 README.md           # Readme\n└─ 📄 rollup.config.js    # Rollup config\n```\n\n## Credits\n\nThank you to all the people who have already contributed to t3d.js!\n\n<a href=\"https://github.com/uinosoft/t3d.js/graphs/contributors\">\n  <img src=\"https://contrib.rocks/image?repo=uinosoft/t3d.js\" />\n</a>\n"
  },
  {
    "path": ".github/workflows/deploy-to-pages.yml",
    "content": "name: Deploy examples and docs to Pages\n\non:\n  push:\n    branches: ['dev']\n    paths-ignore:\n      - 'build/**'\n\n  workflow_dispatch:\n\npermissions:\n  contents: read\n  pages: write\n  id-token: write\n\nconcurrency:\n  group: 'pages'\n  cancel-in-progress: true\n\njobs:\n  build:\n    name: 'Build job'\n    runs-on: ubuntu-latest\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v4\n      - name: Setup Node\n        uses: actions/setup-node@v4\n        with:\n          node-version: 20\n          cache: 'npm'\n      - name: Install Packages\n        run: npm ci\n      - name: Build Docs\n        run: npm run doc\n      - name: Setup Pages\n        uses: actions/configure-pages@v5\n      - name: Upload artifact\n        uses: actions/upload-pages-artifact@v3\n        with:\n          path: '.'\n  deploy:\n    environment:\n      name: github-pages\n      url: ${{ steps.deployment.outputs.page_url }}\n    runs-on: ubuntu-latest\n    needs: build\n    steps:\n      - name: Deploy to GitHub Pages\n        id: deployment\n        uses: actions/deploy-pages@v4\n"
  },
  {
    "path": ".gitignore",
    "content": ".DS_Store\n*.swp\n\n# Editor directories and files\n.vscode/*\n!.vscode/extensions.json\n.idea\n.project\n*.suo\n*.ntvs*\n*.njsproj\n*.sln\n*.user\n.vs/\n*.sw?\n\n# Logs\nnpm-debug.log\n\n/docs\n\n**/node_modules\n*.local\n.jshintrc"
  },
  {
    "path": ".vscode/extensions.json",
    "content": "{\n  \"recommendations\": [\n    \"dbaeumer.vscode-eslint\"\n  ]\n}\n"
  },
  {
    "path": "LICENSE",
    "content": "BSD 3-Clause License\n\nCopyright (c) 2021-present, uino\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n1. Redistributions of source code must retain the above copyright notice, this\n   list of conditions and the following disclaimer.\n\n2. Redistributions in binary form must reproduce the above copyright notice,\n   this list of conditions and the following disclaimer in the documentation\n   and/or other materials provided with the distribution.\n\n3. Neither the name of the copyright holder nor the names of its\n   contributors may be used to endorse or promote products derived from\n   this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\nFOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\nDAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\nSERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\nCAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\nOR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
  },
  {
    "path": "README.md",
    "content": "# ThingJS 3D Engine\n\n[![NPM Package][npm]][npm-url]\n![npm-size][npm-size-url]\n[![Issues][issues-badge]][issues-badge-url]\n[![DeepScan grade][deepscan]][deepscan-url]\n[![Discord][discord]][discord-url]\n[![Ask DeepWiki](https://deepwiki.com/badge.svg)](https://deepwiki.com/uinosoft/t3d.js)\n\n![Engine Screenshot](./screenshot.png)\n\nThingJS 3D Engine (t3d) is a lightweight, web-first, and extendable 3D rendering library. It is used by ThingJS for web3d rendering, but can also be used as a standalone library.\n\nt3d's API borrows the look and feel of three.js—familiar and easy to use—but it is not fully compatible or a drop-in replacement. It keeps a simple, flexible design while adding modern features and extra hooks for real‑time workflows, such as customizable rendering callbacks for finer control and post‑processing, clustered lighting for scalable many‑light scenes, light groups for organizing reusable lights, and other performance-minded optimizations.\n\n[Examples](https://uinosoft.github.io/t3d.js/examples/) &mdash;\n[Docs](https://uinosoft.github.io/t3d.js/docs/) &mdash;\n[Discord](https://discord.gg/urB54PPXc4)\n\n## Import\n\nUse `t3d.js` or `t3d.min.js` in your page:\n\n````html\n<script src=\"t3d.min.js\"></script>\n````\n\nor import as es6 module:\n\n````javascript\nimport * as t3d from 't3d.module.js';\n````\n\n## Npm\n\nt3d is published on npm. To install, use:\n\n````\nnpm install t3d --save\n````\n\nThis will allow you to import t3d entirely using:\n\n````javascript\nimport * as t3d from 't3d';\n````\n\nor individual classes using:\n\n````javascript\nimport { Scene, Renderer } from 't3d';\n````\n\nSince v0.2.0, the JavaScript files in `examples/jsm` can be imported like this:\n\n````javascript\nimport { OrbitControls } from 't3d/addons/controls/OrbitControls.js';\n````\n\n## CDN\n\n* https://unpkg.com/t3d@latest/build/t3d.min.js\n* https://unpkg.com/t3d@latest/build/t3d.module.js\n\n* https://cdn.jsdelivr.net/npm/t3d@latest/build/t3d.min.js\n* https://cdn.jsdelivr.net/npm/t3d@latest/build/t3d.module.min.js\n\n## Quick Start\n\nCreate a simple rotating cube with PBR materials:\n\n````javascript\n// Initialize renderer with WebGL2\nconst width = window.innerWidth || 2;\nconst height = window.innerHeight || 2;\n\nconst canvas = document.createElement('canvas');\ncanvas.width = width;\ncanvas.height = height;\ndocument.body.appendChild(canvas);\n\n// Create WebGL2 context and renderer\nconst gl = canvas.getContext('webgl2', {\n  antialias: true,\n  alpha: false\n});\nconst renderer = new t3d.WebGLRenderer(gl);\nconst screenRenderTarget = new t3d.ScreenRenderTarget(canvas);\nscreenRenderTarget.setColorClearValue(0.1, 0.1, 0.1, 1);\n\n// Create scene\nconst scene = new t3d.Scene();\n\n// Create mesh with PBR material\nconst geometry = new t3d.BoxGeometry(8, 8, 8);\nconst material = new t3d.PBRMaterial();\nconst mesh = new t3d.Mesh(geometry, material);\nscene.add(mesh);\n\n// Add lighting\nconst ambientLight = new t3d.AmbientLight(0xffffff);\nscene.add(ambientLight);\n\nconst directionalLight = new t3d.DirectionalLight(0xffffff);\ndirectionalLight.position.set(-5, 5, 5);\ndirectionalLight.lookAt(new t3d.Vector3(), new t3d.Vector3(0, 1, 0));\nscene.add(directionalLight);\n\n// Set up camera\nconst camera = new t3d.Camera();\ncamera.position.set(0, 10, 30);\ncamera.lookAt(new t3d.Vector3(0, 0, 0), new t3d.Vector3(0, 1, 0));\ncamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 1000);\nscene.add(camera);\n\n// Animation loop\nfunction loop(count) {\n  requestAnimationFrame(loop);\n\n  // Rotate cube\n  mesh.euler.y = count / 1000 * .5;\n\n  scene.updateMatrix();\n  scene.updateRenderStates(camera);\n  scene.updateRenderQueue(camera);\n\n  renderer.renderScene(scene, camera, screenRenderTarget);\n}\nrequestAnimationFrame(loop);\n````\n\n## Extensions\n\n* [t3d-effect-composer](https://github.com/uinosoft/t3d-effect-composer) - Post Effects extension for t3d.js.\n* [t3d-particle](https://github.com/uinosoft/t3d-particle) - This is a particle system developed based on t3d.js.\n* [t3d-pano](https://github.com/uinosoft/t3d-pano) - Panorama extension for t3d.\n* [t3d-3dtiles](https://github.com/uinosoft/t3d-3dtiles) - A 3dtile extension based on t3d.js.\n* [t3d-dynamic-sky](https://github.com/uinosoft/t3d-dynamic-sky) - Dynamic sky addon for t3d.\n* [t3d-gaussian-splatting](https://github.com/uinosoft/t3d-gaussian-splatting) - A t3d-based implementation of 3D Gaussian Splatting.\n\n## Tools\n\n* [t3d-model-viewer](https://uinosoft.github.io/t3d-model-viewer/) - A Model Viewer based on t3d.js and t3d-effect-composer.\n* [t3d-particle-editor](https://uinosoft.github.io/t3d-particle/editor) - A particle editor based on t3d.js and t3d-particle.\n* [t3d-ibl-baker](https://uinosoft.github.io/t3d-ibl-baker/) - This is a simple tool to bake IBL maps for t3d.\n\n## Contributing\n\nPlease make sure to read the [Contributing Guide](./.github/contributing.md) before making a pull request.\n\n[npm]: https://img.shields.io/npm/v/t3d\n[npm-url]: https://www.npmjs.com/package/t3d\n[npm-size-url]: https://img.shields.io/bundlephobia/minzip/t3d\n[issues-badge]: https://img.shields.io/github/issues/uinosoft/t3d.js.svg\n[issues-badge-url]: https://github.com/uinosoft/t3d.js/issues\n[deepscan]: https://deepscan.io/api/teams/20241/projects/25542/branches/800776/badge/grade.svg\n[deepscan-url]: https://deepscan.io/dashboard#view=project&tid=20241&pid=25542&bid=800776\n[discord]: https://img.shields.io/discord/1069800954494464043\n[discord-url]: https://discord.gg/urB54PPXc4"
  },
  {
    "path": "build/t3d.js",
    "content": "/**\n * @license\n * Copyright 2021-present uino\n * SPDX-License-Identifier: BSD-3-Clause\n */\n(function (global, factory) {\n\ttypeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :\n\ttypeof define === 'function' && define.amd ? define(['exports'], factory) :\n\t(global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.t3d = {}));\n})(this, (function (exports) { 'use strict';\n\n\t/**\n\t * An utility class for mathematical operations.\n\t */\n\tclass MathUtils {\n\t\t/**\n\t\t * Method for generate uuid.\n\t\t * http://stackoverflow.com/questions/105034/how-to-create-a-guid-uuid-in-javascript/21963136#21963136\n\t\t * @returns {string} - The uuid.\n\t\t */\n\t\tstatic generateUUID() {\n\t\t\tconst d0 = Math.random() * 0xffffffff | 0;\n\t\t\tconst d1 = Math.random() * 0xffffffff | 0;\n\t\t\tconst d2 = Math.random() * 0xffffffff | 0;\n\t\t\tconst d3 = Math.random() * 0xffffffff | 0;\n\t\t\tconst uuid = _lut[d0 & 0xff] + _lut[d0 >> 8 & 0xff] + _lut[d0 >> 16 & 0xff] + _lut[d0 >> 24 & 0xff] + '-' + _lut[d1 & 0xff] + _lut[d1 >> 8 & 0xff] + '-' + _lut[d1 >> 16 & 0x0f | 0x40] + _lut[d1 >> 24 & 0xff] + '-' + _lut[d2 & 0x3f | 0x80] + _lut[d2 >> 8 & 0xff] + '-' + _lut[d2 >> 16 & 0xff] + _lut[d2 >> 24 & 0xff] + _lut[d3 & 0xff] + _lut[d3 >> 8 & 0xff] + _lut[d3 >> 16 & 0xff] + _lut[d3 >> 24 & 0xff];\n\n\t\t\t// .toUpperCase() here flattens concatenated strings to save heap memory space.\n\t\t\treturn uuid.toUpperCase();\n\t\t}\n\n\t\t/**\n\t\t * Returns a value linearly interpolated from two known points based on the given interval - t = 0 will return x and t = 1 will return y.\n\t\t * @param {number} x - The first value.\n\t\t * @param {number} y - The second value.\n\t\t * @param {number} t - The interpolation factor.\n\t\t * @returns {number} - The interpolated value.\n\t\t */\n\t\tstatic lerp(x, y, t) {\n\t\t\treturn x + (y - x) * t;\n\t\t}\n\n\t\t/**\n\t\t * Clamps the value to be between min and max.\n\t\t * @param {number} value - Value to be clamped.\n\t\t * @param {number} min - The minimum value.\n\t\t * @param {number} max - The maximum value.\n\t\t * @returns {number} - The clamped value.\n\t\t */\n\t\tstatic clamp(value, min, max) {\n\t\t\treturn Math.max(min, Math.min(max, value));\n\t\t}\n\n\t\t/**\n\t\t * Compute euclidean modulo of m % n.\n\t\t * Refer to: https://en.wikipedia.org/wiki/Modulo_operation\n\t\t * @param {number} n - The dividend.\n\t\t * @param {number} m - The divisor.\n\t\t * @returns {number} - The result of the modulo operation.\n\t\t */\n\t\tstatic euclideanModulo(n, m) {\n\t\t\treturn (n % m + m) % m;\n\t\t}\n\n\t\t/**\n\t\t * Performs a linear mapping from range `<a1, a2>` to range `<b1, b2>`\n\t\t * for the given value.\n\t\t * @param {number} x - The value to be mapped.\n\t\t * @param {number} a1 - Minimum value for range A.\n\t\t * @param {number} a2 - Maximum value for range A.\n\t\t * @param {number} b1 - Minimum value for range B.\n\t\t * @param {number} b2 - Maximum value for range B.\n\t\t * @returns {number} The mapped value.\n\t\t */\n\t\tstatic mapLinear(x, a1, a2, b1, b2) {\n\t\t\treturn b1 + (x - a1) * (b2 - b1) / (a2 - a1);\n\t\t}\n\n\t\t/**\n\t\t * Is this number a power of two.\n\t\t * @param {number} value - The input number.\n\t\t * @returns {boolean} - Is this number a power of two.\n\t\t */\n\t\tstatic isPowerOfTwo(value) {\n\t\t\treturn (value & value - 1) === 0 && value !== 0;\n\t\t}\n\n\t\t/**\n\t\t * Return the nearest power of two number of this number.\n\t\t * @param {number} value - The input number.\n\t\t * @returns {number} - The result number.\n\t\t */\n\t\tstatic nearestPowerOfTwo(value) {\n\t\t\treturn Math.pow(2, Math.round(Math.log(value) / Math.LN2));\n\t\t}\n\n\t\t/**\n\t\t * Return the next power of two number of this number.\n\t\t * @param {number} value - The input number.\n\t\t * @returns {number} - The result number.\n\t\t */\n\t\tstatic nextPowerOfTwo(value) {\n\t\t\tvalue--;\n\t\t\tvalue |= value >> 1;\n\t\t\tvalue |= value >> 2;\n\t\t\tvalue |= value >> 4;\n\t\t\tvalue |= value >> 8;\n\t\t\tvalue |= value >> 16;\n\t\t\tvalue++;\n\t\t\treturn value;\n\t\t}\n\n\t\t/**\n\t\t * Return the next power of two square size of this number.\n\t\t * This method is usually used to calculate the minimum 2d texture size based on the pixel length.\n\t\t * @param {number} value - The input number.\n\t\t * @returns {number} - The result size.\n\t\t */\n\t\tstatic nextPowerOfTwoSquareSize(value) {\n\t\t\treturn this.nextPowerOfTwo(Math.ceil(Math.sqrt(value)));\n\t\t}\n\n\t\t/**\n\t\t * Denormalizes a value based on the type of the provided array.\n\t\t * @param {number} value - The value to be denormalized.\n\t\t * @param {TypedArray} array - The typed array to determine the normalization factor.\n\t\t * @returns {number} - The denormalized value.\n\t\t * @throws {Error} - Throws an error if the array type is invalid.\n\t\t */\n\t\tstatic denormalize(value, array) {\n\t\t\tswitch (array.constructor) {\n\t\t\t\tcase Float32Array:\n\t\t\t\t\treturn value;\n\t\t\t\tcase Uint32Array:\n\t\t\t\t\treturn value / 4294967295.0;\n\t\t\t\tcase Uint16Array:\n\t\t\t\t\treturn value / 65535.0;\n\t\t\t\tcase Uint8Array:\n\t\t\t\t\treturn value / 255.0;\n\t\t\t\tcase Int32Array:\n\t\t\t\t\treturn Math.max(value / 2147483647.0, -1);\n\t\t\t\tcase Int16Array:\n\t\t\t\t\treturn Math.max(value / 32767.0, -1);\n\t\t\t\tcase Int8Array:\n\t\t\t\t\treturn Math.max(value / 127.0, -1);\n\t\t\t\tdefault:\n\t\t\t\t\tthrow new Error('Invalid component type.');\n\t\t\t}\n\t\t}\n\n\t\t/**\n\t\t * Normalizes a value based on the type of the provided array.\n\t\t * @param {number} value - The value to be normalized.\n\t\t * @param {TypedArray} array - The typed array to determine the normalization factor.\n\t\t * @returns {number} - The normalized value.\n\t\t * @throws {Error} - Throws an error if the array type is invalid.\n\t\t */\n\t\tstatic normalize(value, array) {\n\t\t\tswitch (array.constructor) {\n\t\t\t\tcase Float32Array:\n\t\t\t\t\treturn value;\n\t\t\t\tcase Uint32Array:\n\t\t\t\t\treturn Math.round(value * 4294967295.0);\n\t\t\t\tcase Uint16Array:\n\t\t\t\t\treturn Math.round(value * 65535.0);\n\t\t\t\tcase Uint8Array:\n\t\t\t\t\treturn Math.round(value * 255.0);\n\t\t\t\tcase Int32Array:\n\t\t\t\t\treturn Math.round(value * 2147483647.0);\n\t\t\t\tcase Int16Array:\n\t\t\t\t\treturn Math.round(value * 32767.0);\n\t\t\t\tcase Int8Array:\n\t\t\t\t\treturn Math.round(value * 127.0);\n\t\t\t\tdefault:\n\t\t\t\t\tthrow new Error('Invalid component type.');\n\t\t\t}\n\t\t}\n\n\t\t/**\n\t\t * Converts float to half float.\n\t\t * @param {number} val - The float value.\n\t\t * @returns {number} - The half float value.\n\t\t */\n\t\tstatic toHalfFloat(val) {\n\t\t\tif (Math.abs(val) > 65504) {\n\t\t\t\tconsole.warn('MathUtils.toHalfFloat(): Value out of range.');\n\t\t\t\tval = this.clamp(val, -65504, 65504);\n\t\t\t}\n\t\t\t_tables.floatView[0] = val;\n\t\t\tconst f = _tables.uint32View[0];\n\t\t\tconst e = f >> 23 & 0x1ff;\n\t\t\treturn _tables.baseTable[e] + ((f & 0x007fffff) >> _tables.shiftTable[e]);\n\t\t}\n\n\t\t/**\n\t\t * Converts half float to float.\n\t\t * @param {number} val - The half float value.\n\t\t * @returns {number} - The float value.\n\t\t */\n\t\tstatic fromHalfFloat(val) {\n\t\t\tconst m = val >> 10;\n\t\t\t_tables.uint32View[0] = _tables.mantissaTable[_tables.offsetTable[m] + (val & 0x3ff)] + _tables.exponentTable[m];\n\t\t\treturn _tables.floatView[0];\n\t\t}\n\t}\n\tconst _lut = [];\n\tfor (let i = 0; i < 256; i++) {\n\t\t_lut[i] = (i < 16 ? '0' : '') + i.toString(16);\n\t}\n\n\t// Fast Half Float Conversions, http://www.fox-toolkit.org/ftp/fasthalffloatconversion.pdf\n\n\tconst _tables = _generateTables();\n\tfunction _generateTables() {\n\t\t// float32 to float16 helpers\n\n\t\tconst buffer = new ArrayBuffer(4);\n\t\tconst floatView = new Float32Array(buffer);\n\t\tconst uint32View = new Uint32Array(buffer);\n\t\tconst baseTable = new Uint32Array(512);\n\t\tconst shiftTable = new Uint32Array(512);\n\t\tfor (let i = 0; i < 256; ++i) {\n\t\t\tconst e = i - 127;\n\t\t\tif (e < -27) {\n\t\t\t\t// very small number (0, -0)\n\t\t\t\tbaseTable[i] = 0x0000;\n\t\t\t\tbaseTable[i | 0x100] = 0x8000;\n\t\t\t\tshiftTable[i] = 24;\n\t\t\t\tshiftTable[i | 0x100] = 24;\n\t\t\t} else if (e < -14) {\n\t\t\t\t// small number (denorm)\n\t\t\t\tbaseTable[i] = 0x0400 >> -e - 14;\n\t\t\t\tbaseTable[i | 0x100] = 0x0400 >> -e - 14 | 0x8000;\n\t\t\t\tshiftTable[i] = -e - 1;\n\t\t\t\tshiftTable[i | 0x100] = -e - 1;\n\t\t\t} else if (e <= 15) {\n\t\t\t\t// normal number\n\t\t\t\tbaseTable[i] = e + 15 << 10;\n\t\t\t\tbaseTable[i | 0x100] = e + 15 << 10 | 0x8000;\n\t\t\t\tshiftTable[i] = 13;\n\t\t\t\tshiftTable[i | 0x100] = 13;\n\t\t\t} else if (e < 128) {\n\t\t\t\t// large number (Infinity, -Infinity)\n\t\t\t\tbaseTable[i] = 0x7c00;\n\t\t\t\tbaseTable[i | 0x100] = 0xfc00;\n\t\t\t\tshiftTable[i] = 24;\n\t\t\t\tshiftTable[i | 0x100] = 24;\n\t\t\t} else {\n\t\t\t\t// stay (NaN, Infinity, -Infinity)\n\t\t\t\tbaseTable[i] = 0x7c00;\n\t\t\t\tbaseTable[i | 0x100] = 0xfc00;\n\t\t\t\tshiftTable[i] = 13;\n\t\t\t\tshiftTable[i | 0x100] = 13;\n\t\t\t}\n\t\t}\n\n\t\t// float16 to float32 helpers\n\n\t\tconst mantissaTable = new Uint32Array(2048);\n\t\tconst exponentTable = new Uint32Array(64);\n\t\tconst offsetTable = new Uint32Array(64);\n\t\tfor (let i = 1; i < 1024; ++i) {\n\t\t\tlet m = i << 13; // zero pad mantissa bits\n\t\t\tlet e = 0; // zero exponent\n\n\t\t\t// normalized\n\t\t\twhile ((m & 0x00800000) === 0) {\n\t\t\t\tm <<= 1;\n\t\t\t\te -= 0x00800000; // decrement exponent\n\t\t\t}\n\t\t\tm &= -8388609; // clear leading 1 bit\n\t\t\te += 0x38800000; // adjust bias\n\n\t\t\tmantissaTable[i] = m | e;\n\t\t}\n\t\tfor (let i = 1024; i < 2048; ++i) {\n\t\t\tmantissaTable[i] = 0x38000000 + (i - 1024 << 13);\n\t\t}\n\t\tfor (let i = 1; i < 31; ++i) {\n\t\t\texponentTable[i] = i << 23;\n\t\t}\n\t\texponentTable[31] = 0x47800000;\n\t\texponentTable[32] = 0x80000000;\n\t\tfor (let i = 33; i < 63; ++i) {\n\t\t\texponentTable[i] = 0x80000000 + (i - 32 << 23);\n\t\t}\n\t\texponentTable[63] = 0xc7800000;\n\t\tfor (let i = 1; i < 64; ++i) {\n\t\t\tif (i !== 32) {\n\t\t\t\toffsetTable[i] = 1024;\n\t\t\t}\n\t\t}\n\t\treturn {\n\t\t\tfloatView: floatView,\n\t\t\tuint32View: uint32View,\n\t\t\tbaseTable: baseTable,\n\t\t\tshiftTable: shiftTable,\n\t\t\tmantissaTable: mantissaTable,\n\t\t\texponentTable: exponentTable,\n\t\t\toffsetTable: offsetTable\n\t\t};\n\t}\n\n\t/**\n\t * Class representing a 3D vector.\n\t */\n\tclass Vector3 {\n\t\t/**\n\t\t * Constructs a new 3D vector.\n\t\t * @param {number} [x=0] - The x value of this vector.\n\t\t * @param {number} [y=0] - The y value of this vector.\n\t\t * @param {number} [z=0] - The z value of this vector.\n\t\t */\n\t\tconstructor(x = 0, y = 0, z = 0) {\n\t\t\t/**\n\t\t\t * The x value of this vector.\n\t\t\t * @type {number}\n\t\t\t */\n\t\t\tthis.x = x;\n\n\t\t\t/**\n\t\t\t * The y value of this vector.\n\t\t\t * @type {number}\n\t\t\t */\n\t\t\tthis.y = y;\n\n\t\t\t/**\n\t\t\t * The z value of this vector.\n\t\t\t * @type {number}\n\t\t\t */\n\t\t\tthis.z = z;\n\t\t}\n\n\t\t/**\n\t\t * Sets the vector components.\n\t\t * @param {number} x - The value of the x component.\n\t\t * @param {number} y - The value of the y component.\n\t\t * @param {number} z - The value of the z component.\n\t\t * @returns {Vector3} A reference to this vector.\n\t\t */\n\t\tset(x = 0, y = 0, z = 0) {\n\t\t\tthis.x = x;\n\t\t\tthis.y = y;\n\t\t\tthis.z = z;\n\t\t\treturn this;\n\t\t}\n\n\t\t/**\n\t\t * Sets the vector components to the same value.\n\t\t * @param {number} scalar - The value to set for all vector components.\n\t\t * @returns {Vector3} A reference to this vector.\n\t\t */\n\t\tsetScalar(scalar) {\n\t\t\tthis.x = scalar;\n\t\t\tthis.y = scalar;\n\t\t\tthis.z = scalar;\n\t\t\treturn this;\n\t\t}\n\n\t\t/**\n\t\t * Returns a new vector with copied values from this instance.\n\t\t * @returns {Vector3} A clone of this instance.\n\t\t */\n\t\tclone() {\n\t\t\treturn new Vector3(this.x, this.y, this.z);\n\t\t}\n\n\t\t/**\n\t\t * Copies the values of the given vector to this instance.\n\t\t * @param {Vector3} v - The vector to copy.\n\t\t * @returns {Vector3} A reference to this vector.\n\t\t */\n\t\tcopy(v) {\n\t\t\tthis.x = v.x;\n\t\t\tthis.y = v.y;\n\t\t\tthis.z = v.z;\n\t\t\treturn this;\n\t\t}\n\n\t\t/**\n\t\t * Adds the given vector to this instance.\n\t\t * @param {Vector3} v - The vector to add.\n\t\t * @returns {Vector3} A reference to this vector.\n\t\t */\n\t\tadd(v) {\n\t\t\tthis.x += v.x;\n\t\t\tthis.y += v.y;\n\t\t\tthis.z += v.z;\n\t\t\treturn this;\n\t\t}\n\n\t\t/**\n\t\t * Adds the given scalar value to all components of this instance.\n\t\t * @param {number} s - The scalar to add.\n\t\t * @returns {Vector3} A reference to this vector.\n\t\t */\n\t\taddScalar(s) {\n\t\t\tthis.x += s;\n\t\t\tthis.y += s;\n\t\t\tthis.z += s;\n\t\t\treturn this;\n\t\t}\n\n\t\t/**\n\t\t * Adds the given vectors and stores the result in this instance.\n\t\t * @param {Vector3} a - The first vector.\n\t\t * @param {Vector3} b - The second vector.\n\t\t * @returns {Vector3} A reference to this vector.\n\t\t */\n\t\taddVectors(a, b) {\n\t\t\tthis.x = a.x + b.x;\n\t\t\tthis.y = a.y + b.y;\n\t\t\tthis.z = a.z + b.z;\n\t\t\treturn this;\n\t\t}\n\n\t\t/**\n\t\t * Adds the given vector scaled by the given factor to this instance.\n\t\t * @param {Vector3|Vector4} v - The vector.\n\t\t * @param {number} s - The factor that scales `v`.\n\t\t * @returns {Vector3} A reference to this vector.\n\t\t */\n\t\taddScaledVector(v, s) {\n\t\t\tthis.x += v.x * s;\n\t\t\tthis.y += v.y * s;\n\t\t\tthis.z += v.z * s;\n\t\t\treturn this;\n\t\t}\n\n\t\t/**\n\t\t * Subtracts the given vector from this instance.\n\t\t * @param {Vector3} v - The vector to subtract.\n\t\t * @returns {Vector3} A reference to this vector.\n\t\t */\n\t\tsub(v) {\n\t\t\tthis.x -= v.x;\n\t\t\tthis.y -= v.y;\n\t\t\tthis.z -= v.z;\n\t\t\treturn this;\n\t\t}\n\n\t\t/**\n\t\t * Subtracts the given vectors and stores the result in this instance.\n\t\t * @param {Vector3} a - The first vector.\n\t\t * @param {Vector3} b - The second vector.\n\t\t * @returns {Vector3} A reference to this vector.\n\t\t */\n\t\tsubVectors(a, b) {\n\t\t\tthis.x = a.x - b.x;\n\t\t\tthis.y = a.y - b.y;\n\t\t\tthis.z = a.z - b.z;\n\t\t\treturn this;\n\t\t}\n\n\t\t/**\n\t\t * Multiplies the given vector with this instance.\n\t\t * @param {Vector3} v - The vector to multiply.\n\t\t * @returns {Vector3} A reference to this vector.\n\t\t */\n\t\tmultiply(v) {\n\t\t\tthis.x *= v.x;\n\t\t\tthis.y *= v.y;\n\t\t\tthis.z *= v.z;\n\t\t\treturn this;\n\t\t}\n\n\t\t/**\n\t\t * Multiplies the given scalar value with all components of this instance.\n\t\t * @param {number} scalar - The scalar to multiply.\n\t\t * @returns {Vector3} A reference to this vector.\n\t\t */\n\t\tmultiplyScalar(scalar) {\n\t\t\tthis.x *= scalar;\n\t\t\tthis.y *= scalar;\n\t\t\tthis.z *= scalar;\n\t\t\treturn this;\n\t\t}\n\n\t\t/**\n\t\t * Multiplies this vector with the given 3x3 matrix.\n\t\t * @param {Matrix3} m - The 3x3 matrix.\n\t\t * @returns {Vector3} A reference to this vector.\n\t\t */\n\t\tapplyMatrix3(m) {\n\t\t\tconst x = this.x,\n\t\t\t\ty = this.y,\n\t\t\t\tz = this.z;\n\t\t\tconst e = m.elements;\n\t\t\tthis.x = e[0] * x + e[3] * y + e[6] * z;\n\t\t\tthis.y = e[1] * x + e[4] * y + e[7] * z;\n\t\t\tthis.z = e[2] * x + e[5] * y + e[8] * z;\n\t\t\treturn this;\n\t\t}\n\n\t\t/**\n\t\t * Multiplies this vector (with an implicit 1 in the 4th dimension) by m, and\n\t\t * divides by perspective.\n\t\t * @param {Matrix4} m - The matrix to apply.\n\t\t * @returns {Vector3} A reference to this vector.\n\t\t */\n\t\tapplyMatrix4(m) {\n\t\t\tconst x = this.x,\n\t\t\t\ty = this.y,\n\t\t\t\tz = this.z;\n\t\t\tconst e = m.elements;\n\t\t\tconst w = 1 / (e[3] * x + e[7] * y + e[11] * z + e[15]);\n\t\t\tthis.x = (e[0] * x + e[4] * y + e[8] * z + e[12]) * w;\n\t\t\tthis.y = (e[1] * x + e[5] * y + e[9] * z + e[13]) * w;\n\t\t\tthis.z = (e[2] * x + e[6] * y + e[10] * z + e[14]) * w;\n\t\t\treturn this;\n\t\t}\n\n\t\t/**\n\t\t * Applies the given Quaternion to this vector.\n\t\t * @param {Quaternion} q - The Quaternion.\n\t\t * @returns {Vector3} A reference to this vector.\n\t\t */\n\t\tapplyQuaternion(q) {\n\t\t\tconst x = this.x,\n\t\t\t\ty = this.y,\n\t\t\t\tz = this.z;\n\t\t\tconst qx = q._x,\n\t\t\t\tqy = q._y,\n\t\t\t\tqz = q._z,\n\t\t\t\tqw = q._w;\n\n\t\t\t// calculate quat * vector\n\n\t\t\tconst ix = qw * x + qy * z - qz * y;\n\t\t\tconst iy = qw * y + qz * x - qx * z;\n\t\t\tconst iz = qw * z + qx * y - qy * x;\n\t\t\tconst iw = -qx * x - qy * y - qz * z;\n\n\t\t\t// calculate result * inverse quat\n\n\t\t\tthis.x = ix * qw + iw * -qx + iy * -qz - iz * -qy;\n\t\t\tthis.y = iy * qw + iw * -qy + iz * -qx - ix * -qz;\n\t\t\tthis.z = iz * qw + iw * -qz + ix * -qy - iy * -qx;\n\t\t\treturn this;\n\t\t}\n\n\t\t/**\n\t\t * Projects this vector from world space into the camera's normalized\n\t\t * device coordinate (NDC) space.\n\t\t * @param {Camera} camera - The camera.\n\t\t * @returns {Vector3} A reference to this vector.\n\t\t */\n\t\tproject(camera) {\n\t\t\treturn this.applyMatrix4(camera.projectionViewMatrix);\n\t\t}\n\n\t\t/**\n\t\t * Unprojects this vector from the camera's normalized device coordinate (NDC)\n\t\t * space into world space.\n\t\t * @param {Camera} camera - The camera.\n\t\t * @returns {Vector3} A reference to this vector.\n\t\t */\n\t\tunproject(camera) {\n\t\t\treturn this.applyMatrix4(camera.projectionMatrixInverse).applyMatrix4(camera.worldMatrix);\n\t\t}\n\n\t\t/**\n\t\t * Transforms the direction of this vector by a matrix (the upper left 3 x 3\n\t\t * subset of the given 4x4 matrix and then normalizes the result.\n\t\t * @param {Matrix4} m - The matrix.\n\t\t * @returns {Vector3} A reference to this vector.\n\t\t */\n\t\ttransformDirection(m) {\n\t\t\t// input: Matrix4 affine matrix\n\t\t\t// vector interpreted as a direction\n\n\t\t\tconst x = this.x,\n\t\t\t\ty = this.y,\n\t\t\t\tz = this.z;\n\t\t\tconst e = m.elements;\n\t\t\tthis.x = e[0] * x + e[4] * y + e[8] * z;\n\t\t\tthis.y = e[1] * x + e[5] * y + e[9] * z;\n\t\t\tthis.z = e[2] * x + e[6] * y + e[10] * z;\n\t\t\treturn this.normalize();\n\t\t}\n\n\t\t/**\n\t\t * If this vector's x, y or z value is greater than the given vector's x, y or z\n\t\t * value, replace that value with the corresponding min value.\n\t\t * @param {Vector3} v - The vector.\n\t\t * @returns {Vector3} A reference to this vector.\n\t\t */\n\t\tmin(v) {\n\t\t\tthis.x = Math.min(this.x, v.x);\n\t\t\tthis.y = Math.min(this.y, v.y);\n\t\t\tthis.z = Math.min(this.z, v.z);\n\t\t\treturn this;\n\t\t}\n\n\t\t/**\n\t\t * If this vector's x, y or z value is less than the given vector's x, y or z\n\t\t * value, replace that value with the corresponding max value.\n\t\t * @param {Vector3} v - The vector.\n\t\t * @returns {Vector3} A reference to this vector.\n\t\t */\n\t\tmax(v) {\n\t\t\tthis.x = Math.max(this.x, v.x);\n\t\t\tthis.y = Math.max(this.y, v.y);\n\t\t\tthis.z = Math.max(this.z, v.z);\n\t\t\treturn this;\n\t\t}\n\n\t\t/**\n\t\t * Inverts this vector - i.e. sets x = -x, y = -y and z = -z.\n\t\t * @returns {Vector3} A reference to this vector.\n\t\t */\n\t\tnegate() {\n\t\t\tthis.x = -this.x;\n\t\t\tthis.y = -this.y;\n\t\t\tthis.z = -this.z;\n\t\t\treturn this;\n\t\t}\n\n\t\t/**\n\t\t * Calculates the dot product of the given vector with this instance.\n\t\t * @param {Vector3} v - The vector to compute the dot product with.\n\t\t * @returns {number} The result of the dot product.\n\t\t */\n\t\tdot(v) {\n\t\t\treturn this.x * v.x + this.y * v.y + this.z * v.z;\n\t\t}\n\n\t\t/**\n\t\t * Computes the square of the Euclidean length (straight-line length) from\n\t\t * (0, 0, 0) to (x, y, z). If you are comparing the lengths of vectors, you should\n\t\t * compare the length squared instead as it is slightly more efficient to calculate.\n\t\t * @returns {number} The square length of this vector.\n\t\t */\n\t\tgetLengthSquared() {\n\t\t\treturn this.x * this.x + this.y * this.y + this.z * this.z;\n\t\t}\n\n\t\t/**\n\t\t * Computes the\tEuclidean length (straight-line length) from (0, 0, 0) to (x, y, z).\n\t\t * @returns {number} The length of this vector.\n\t\t */\n\t\tgetLength() {\n\t\t\treturn Math.sqrt(this.getLengthSquared());\n\t\t}\n\n\t\t/**\n\t\t * Converts this vector to a unit vector - that is, sets it equal to a vector\n\t\t * with the same direction as this one, but with a vector length of `1`.\n\t\t * @param {number} [thickness=1]\n\t\t * @returns {Vector3} A reference to this vector.\n\t\t */\n\t\tnormalize(thickness = 1) {\n\t\t\tconst length = this.getLength() || 1;\n\t\t\tconst invLength = thickness / length;\n\t\t\tthis.x *= invLength;\n\t\t\tthis.y *= invLength;\n\t\t\tthis.z *= invLength;\n\t\t\treturn this;\n\t\t}\n\n\t\t/**\n\t\t * Linearly interpolates between the given vector and this instance, where\n\t\t * alpha is the percent distance along the line - alpha = 0 will be this\n\t\t * vector, and alpha = 1 will be the given one.\n\t\t * @param {Vector3} v - The vector to interpolate towards.\n\t\t * @param {number} alpha - The interpolation factor, typically in the closed interval `[0, 1]`.\n\t\t * @returns {Vector3} A reference to this vector.\n\t\t */\n\t\tlerp(v, alpha) {\n\t\t\tthis.x += (v.x - this.x) * alpha;\n\t\t\tthis.y += (v.y - this.y) * alpha;\n\t\t\tthis.z += (v.z - this.z) * alpha;\n\t\t\treturn this;\n\t\t}\n\n\t\t/**\n\t\t * Linearly interpolates between the given vectors, where alpha is the percent\n\t\t * distance along the line - alpha = 0 will be first vector, and alpha = 1 will\n\t\t * be the second one. The result is stored in this instance.\n\t\t * @param {Vector3} v1 - The first vector.\n\t\t * @param {Vector3} v2 - The second vector.\n\t\t * @param {number} alpha - The interpolation factor, typically in the closed interval `[0, 1]`.\n\t\t * @returns {Vector3} A reference to this vector.\n\t\t */\n\t\tlerpVectors(v1, v2, alpha) {\n\t\t\tthis.x = v1.x + (v2.x - v1.x) * alpha;\n\t\t\tthis.y = v1.y + (v2.y - v1.y) * alpha;\n\t\t\tthis.z = v1.z + (v2.z - v1.z) * alpha;\n\t\t\treturn this;\n\t\t}\n\n\t\t/**\n\t\t * Calculates the cross product of the given vector with this instance.\n\t\t * @param {Vector3} v - The vector to compute the cross product with.\n\t\t * @returns {Vector3} The result of the cross product.\n\t\t */\n\t\tcross(v) {\n\t\t\treturn this.crossVectors(this, v);\n\t\t}\n\n\t\t/**\n\t\t * Calculates the cross product of the given vectors and stores the result\n\t\t * in this instance.\n\t\t * @param {Vector3} a - The first vector.\n\t\t * @param {Vector3} b - The second vector.\n\t\t * @returns {Vector3} A reference to this vector.\n\t\t */\n\t\tcrossVectors(a, b) {\n\t\t\tconst ax = a.x,\n\t\t\t\tay = a.y,\n\t\t\t\taz = a.z;\n\t\t\tconst bx = b.x,\n\t\t\t\tby = b.y,\n\t\t\t\tbz = b.z;\n\t\t\tthis.x = ay * bz - az * by;\n\t\t\tthis.y = az * bx - ax * bz;\n\t\t\tthis.z = ax * by - ay * bx;\n\t\t\treturn this;\n\t\t}\n\n\t\t/**\n\t\t * Reflects this vector off a plane orthogonal to the given normal vector.\n\t\t * @param {Vector3} normal - The (normalized) normal vector.\n\t\t * @returns {Vector3} A reference to this vector.\n\t\t */\n\t\treflect(normal) {\n\t\t\treturn this.sub(_vector$2.copy(normal).multiplyScalar(2 * this.dot(normal)));\n\t\t}\n\n\t\t/**\n\t\t * Scales this vector along the given direction vector by the given scale factor.\n\t\t * @param {Vector3} direction - The (normalized) direction vector to scale along.\n\t\t * @param {number} scale - The scale factor.\n\t\t * @returns {Vector3} A reference to this vector.\n\t\t */\n\t\tscaleAlong(direction, scale) {\n\t\t\t_vector$2.copy(direction).multiplyScalar(this.dot(direction));\n\t\t\treturn this.sub(_vector$2).addScaledVector(_vector$2, scale);\n\t\t}\n\n\t\t/**\n\t\t * Returns the angle between the given vector and this instance in radians.\n\t\t * @param {Vector3} v - The vector to compute the angle with.\n\t\t * @returns {number} The angle in radians.\n\t\t */\n\t\tangleTo(v) {\n\t\t\tconst denominator = Math.sqrt(this.getLengthSquared() * v.getLengthSquared());\n\t\t\tif (denominator === 0) return Math.PI / 2;\n\t\t\tconst theta = this.dot(v) / denominator;\n\n\t\t\t// clamp, to handle numerical problems\n\n\t\t\treturn Math.acos(MathUtils.clamp(theta, -1, 1));\n\t\t}\n\n\t\t/**\n\t\t * Computes the distance from the given vector to this instance.\n\t\t * @param {Vector3} v - The vector to compute the distance to.\n\t\t * @returns {number} The distance.\n\t\t */\n\t\tdistanceTo(v) {\n\t\t\treturn Math.sqrt(this.distanceToSquared(v));\n\t\t}\n\n\t\t/**\n\t\t * Computes the squared distance from the given vector to this instance.\n\t\t * If you are just comparing the distance with another distance, you should compare\n\t\t * the distance squared instead as it is slightly more efficient to calculate.\n\t\t * @param {Vector3} v - The vector to compute the squared distance to.\n\t\t * @returns {number} The squared distance.\n\t\t */\n\t\tdistanceToSquared(v) {\n\t\t\tconst dx = this.x - v.x,\n\t\t\t\tdy = this.y - v.y,\n\t\t\t\tdz = this.z - v.z;\n\t\t\treturn dx * dx + dy * dy + dz * dz;\n\t\t}\n\n\t\t/**\n\t\t * Sets the vector components from the given spherical coordinates.\n\t\t * @param {Spherical} s - The spherical coordinates.\n\t\t * @returns {Vector3} A reference to this vector.\n\t\t */\n\t\tsetFromSpherical(s) {\n\t\t\tconst sinPhiRadius = Math.sin(s.phi) * s.radius;\n\t\t\tthis.x = sinPhiRadius * Math.sin(s.theta);\n\t\t\tthis.y = Math.cos(s.phi) * s.radius;\n\t\t\tthis.z = sinPhiRadius * Math.cos(s.theta);\n\t\t\treturn this;\n\t\t}\n\n\t\t/**\n\t\t * Sets the vector components to the position elements of the\n\t\t * given transformation matrix.\n\t\t * @param {Matrix4} m - The 4x4 matrix.\n\t\t * @returns {Vector3} A reference to this vector.\n\t\t */\n\t\tsetFromMatrixPosition(m) {\n\t\t\tconst e = m.elements;\n\t\t\tthis.x = e[12];\n\t\t\tthis.y = e[13];\n\t\t\tthis.z = e[14];\n\t\t\treturn this;\n\t\t}\n\n\t\t/**\n\t\t * Sets the vector components to the scale elements of the\n\t\t * given transformation matrix.\n\t\t * @param {Matrix4} m - The 4x4 matrix.\n\t\t * @returns {Vector3} A reference to this vector.\n\t\t */\n\t\tsetFromMatrixScale(m) {\n\t\t\tconst sx = this.setFromMatrixColumn(m, 0).getLength();\n\t\t\tconst sy = this.setFromMatrixColumn(m, 1).getLength();\n\t\t\tconst sz = this.setFromMatrixColumn(m, 2).getLength();\n\t\t\treturn this.set(sx, sy, sz);\n\t\t}\n\n\t\t/**\n\t\t * Sets the vector components from the specified matrix column.\n\t\t * @param {Matrix4} m - The 4x4 matrix.\n\t\t * @param {number} index - The column index.\n\t\t * @returns {Vector3} A reference to this vector.\n\t\t */\n\t\tsetFromMatrixColumn(m, index) {\n\t\t\treturn this.fromArray(m.elements, index * 4);\n\t\t}\n\n\t\t/**\n\t\t * Returns `true` if this vector is equal with the given one.\n\t\t * @param {Vector3} v - The vector to test for equality.\n\t\t * @returns {boolean} Whether this vector is equal with the given one.\n\t\t */\n\t\tequals(v) {\n\t\t\treturn v.x === this.x && v.y === this.y && v.z === this.z;\n\t\t}\n\n\t\t/**\n\t\t * Sets this vector's x value to be `array[ offset ]`, y value to be `array[ offset + 1 ]`\n\t\t * and z value to be `array[ offset + 2 ]`.\n\t\t * @param {Array<number>} array - An array holding the vector component values.\n\t\t * @param {number} [offset=0] - The offset into the array.\n\t\t * @param {boolean} [denormalize=false] - If true, denormalize the values, and array should be a typed array.\n\t\t * @returns {Vector3} A reference to this vector.\n\t\t */\n\t\tfromArray(array, offset = 0, denormalize = false) {\n\t\t\tlet x = array[offset],\n\t\t\t\ty = array[offset + 1],\n\t\t\t\tz = array[offset + 2];\n\t\t\tif (denormalize) {\n\t\t\t\tx = MathUtils.denormalize(x, array);\n\t\t\t\ty = MathUtils.denormalize(y, array);\n\t\t\t\tz = MathUtils.denormalize(z, array);\n\t\t\t}\n\t\t\tthis.x = x;\n\t\t\tthis.y = y;\n\t\t\tthis.z = z;\n\t\t\treturn this;\n\t\t}\n\n\t\t/**\n\t\t * Writes the components of this vector to the given array. If no array is provided,\n\t\t * the method returns a new instance.\n\t\t * @param {Array<number>} [array=[]] - The target array holding the vector components.\n\t\t * @param {number} [offset=0] - Index of the first element in the array.\n\t\t * @param {boolean} [normalize=false] - if true, normalize the values, and array should be a typed array.\n\t\t * @returns {Array<number>} The vector components.\n\t\t */\n\t\ttoArray(array = [], offset = 0, normalize = false) {\n\t\t\tlet x = this.x,\n\t\t\t\ty = this.y,\n\t\t\t\tz = this.z;\n\t\t\tif (normalize) {\n\t\t\t\tx = MathUtils.normalize(x, array);\n\t\t\t\ty = MathUtils.normalize(y, array);\n\t\t\t\tz = MathUtils.normalize(z, array);\n\t\t\t}\n\t\t\tarray[offset] = x;\n\t\t\tarray[offset + 1] = y;\n\t\t\tarray[offset + 2] = z;\n\t\t\treturn array;\n\t\t}\n\t\t*[Symbol.iterator]() {\n\t\t\tyield this.x;\n\t\t\tyield this.y;\n\t\t\tyield this.z;\n\t\t}\n\t}\n\n\t/**\n\t * This flag can be used for type testing.\n\t * @readonly\n\t * @type {boolean}\n\t * @default true\n\t */\n\tVector3.prototype.isVector3 = true;\n\tconst _vector$2 = new Vector3();\n\n\t/**\n\t * Represents a 4x4 matrix.\n\t */\n\tclass Matrix4 {\n\t\t/**\n\t\t * Constructs a new 4x4 matrix.\n\t\t */\n\t\tconstructor() {\n\t\t\t/**\n\t\t\t * A column-major list of matrix values.\n\t\t\t * @type {Array<number>}\n\t\t\t */\n\t\t\tthis.elements = [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1];\n\t\t}\n\n\t\t/**\n\t\t * Sets the elements of the matrix.The arguments are supposed to be\n\t\t * in row-major order.\n\t\t * @param {number} [n11] - 1-1 matrix element.\n\t\t * @param {number} [n12] - 1-2 matrix element.\n\t\t * @param {number} [n13] - 1-3 matrix element.\n\t\t * @param {number} [n14] - 1-4 matrix element.\n\t\t * @param {number} [n21] - 2-1 matrix element.\n\t\t * @param {number} [n22] - 2-2 matrix element.\n\t\t * @param {number} [n23] - 2-3 matrix element.\n\t\t * @param {number} [n24] - 2-4 matrix element.\n\t\t * @param {number} [n31] - 3-1 matrix element.\n\t\t * @param {number} [n32] - 3-2 matrix element.\n\t\t * @param {number} [n33] - 3-3 matrix element.\n\t\t * @param {number} [n34] - 3-4 matrix element.\n\t\t * @param {number} [n41] - 4-1 matrix element.\n\t\t * @param {number} [n42] - 4-2 matrix element.\n\t\t * @param {number} [n43] - 4-3 matrix element.\n\t\t * @param {number} [n44] - 4-4 matrix element.\n\t\t * @returns {Matrix4} A reference to this matrix.\n\t\t */\n\t\tset(n11, n12, n13, n14, n21, n22, n23, n24, n31, n32, n33, n34, n41, n42, n43, n44) {\n\t\t\tconst ele = this.elements;\n\t\t\tele[0] = n11;\n\t\t\tele[4] = n12;\n\t\t\tele[8] = n13;\n\t\t\tele[12] = n14;\n\t\t\tele[1] = n21;\n\t\t\tele[5] = n22;\n\t\t\tele[9] = n23;\n\t\t\tele[13] = n24;\n\t\t\tele[2] = n31;\n\t\t\tele[6] = n32;\n\t\t\tele[10] = n33;\n\t\t\tele[14] = n34;\n\t\t\tele[3] = n41;\n\t\t\tele[7] = n42;\n\t\t\tele[11] = n43;\n\t\t\tele[15] = n44;\n\t\t\treturn this;\n\t\t}\n\n\t\t/**\n\t\t * Sets this matrix to the 4x4 identity matrix.\n\t\t * @returns {Matrix4} A reference to this matrix.\n\t\t */\n\t\tidentity() {\n\t\t\treturn this.set(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n\t\t}\n\n\t\t/**\n\t\t * Checks if the matrix is an identity matrix.\n\t\t * @returns {boolean} - True if the matrix is an identity matrix, false otherwise.\n\t\t */\n\t\tisIdentity() {\n\t\t\tconst te = this.elements;\n\t\t\treturn te[0] === 1 && te[4] === 0 && te[8] === 0 && te[12] === 0 && te[1] === 0 && te[5] === 1 && te[9] === 0 && te[13] === 0 && te[2] === 0 && te[6] === 0 && te[10] === 1 && te[14] === 0 && te[3] === 0 && te[7] === 0 && te[11] === 0 && te[15] === 1;\n\t\t}\n\n\t\t/**\n\t\t * Returns a matrix with copied values from this instance.\n\t\t * @returns {Matrix4} A clone of this instance.\n\t\t */\n\t\tclone() {\n\t\t\treturn new Matrix4().fromArray(this.elements);\n\t\t}\n\n\t\t/**\n\t\t * Copies the values of the given matrix to this instance.\n\t\t * @param {Matrix4} m - The matrix to copy.\n\t\t * @returns {Matrix4} A reference to this matrix.\n\t\t */\n\t\tcopy(m) {\n\t\t\tconst te = this.elements;\n\t\t\tconst me = m.elements;\n\t\t\tte[0] = me[0];\n\t\t\tte[1] = me[1];\n\t\t\tte[2] = me[2];\n\t\t\tte[3] = me[3];\n\t\t\tte[4] = me[4];\n\t\t\tte[5] = me[5];\n\t\t\tte[6] = me[6];\n\t\t\tte[7] = me[7];\n\t\t\tte[8] = me[8];\n\t\t\tte[9] = me[9];\n\t\t\tte[10] = me[10];\n\t\t\tte[11] = me[11];\n\t\t\tte[12] = me[12];\n\t\t\tte[13] = me[13];\n\t\t\tte[14] = me[14];\n\t\t\tte[15] = me[15];\n\t\t\treturn this;\n\t\t}\n\n\t\t/**\n\t\t * Set the upper 3x3 elements of this matrix to the values of given 3x3 matrix.\n\t\t * @param {Matrix3} m - The 3x3 matrix.\n\t\t * @returns {Matrix4} A reference to this matrix.\n\t\t */\n\t\tsetFromMatrix3(m) {\n\t\t\tconst me = m.elements;\n\t\t\treturn this.set(me[0], me[3], me[6], 0, me[1], me[4], me[7], 0, me[2], me[5], me[8], 0, 0, 0, 0, 1);\n\t\t}\n\n\t\t/**\n\t\t * Extracts the basis of this matrix into the three axis vectors provided.\n\t\t * @param {Vector3} xAxis - The basis's x axis.\n\t\t * @param {Vector3} yAxis - The basis's y axis.\n\t\t * @param {Vector3} zAxis - The basis's z axis.\n\t\t * @returns {Matrix4} A reference to this matrix.\n\t\t */\n\t\textractBasis(xAxis, yAxis, zAxis) {\n\t\t\txAxis.setFromMatrixColumn(this, 0);\n\t\t\tyAxis.setFromMatrixColumn(this, 1);\n\t\t\tzAxis.setFromMatrixColumn(this, 2);\n\t\t\treturn this;\n\t\t}\n\n\t\t/**\n\t\t * Sets the given basis vectors to this matrix.\n\t\t * @param {Vector3} xAxis - The basis's x axis.\n\t\t * @param {Vector3} yAxis - The basis's y axis.\n\t\t * @param {Vector3} zAxis - The basis's z axis.\n\t\t * @returns {Matrix4} A reference to this matrix.\n\t\t */\n\t\tmakeBasis(xAxis, yAxis, zAxis) {\n\t\t\tthis.set(xAxis.x, yAxis.x, zAxis.x, 0, xAxis.y, yAxis.y, zAxis.y, 0, xAxis.z, yAxis.z, zAxis.z, 0, 0, 0, 0, 1);\n\t\t\treturn this;\n\t\t}\n\n\t\t/**\n\t\t * Extracts the rotation component of the given matrix\n\t\t * into this matrix's rotation component.\n\t\t *\n\t\t * Note: This method does not support reflection matrices.\n\t\t * @param {Matrix4} m - The matrix.\n\t\t * @returns {Matrix4} A reference to this matrix.\n\t\t */\n\t\textractRotation(m) {\n\t\t\tconst te = this.elements;\n\t\t\tconst me = m.elements;\n\t\t\tconst scaleX = 1 / _vec3_1$6.setFromMatrixColumn(m, 0).getLength();\n\t\t\tconst scaleY = 1 / _vec3_1$6.setFromMatrixColumn(m, 1).getLength();\n\t\t\tconst scaleZ = 1 / _vec3_1$6.setFromMatrixColumn(m, 2).getLength();\n\t\t\tte[0] = me[0] * scaleX;\n\t\t\tte[1] = me[1] * scaleX;\n\t\t\tte[2] = me[2] * scaleX;\n\t\t\tte[3] = 0;\n\t\t\tte[4] = me[4] * scaleY;\n\t\t\tte[5] = me[5] * scaleY;\n\t\t\tte[6] = me[6] * scaleY;\n\t\t\tte[7] = 0;\n\t\t\tte[8] = me[8] * scaleZ;\n\t\t\tte[9] = me[9] * scaleZ;\n\t\t\tte[10] = me[10] * scaleZ;\n\t\t\tte[11] = 0;\n\t\t\tte[12] = 0;\n\t\t\tte[13] = 0;\n\t\t\tte[14] = 0;\n\t\t\tte[15] = 1;\n\t\t\treturn this;\n\t\t}\n\n\t\t/**\n\t\t * Sets the rotation component (the upper left 3x3 matrix) of this matrix to\n\t\t * the rotation specified by the given Euler angles. The rest of\n\t\t * the matrix is set to the identity. Depending on the {@link Euler#order},\n\t\t * there are six possible outcomes. See [this page]{@link https://en.wikipedia.org/wiki/Euler_angles#Rotation_matrix}\n\t\t * for a complete list.\n\t\t * @param {Euler} euler - The Euler angles.\n\t\t * @returns {Matrix4} A reference to this matrix.\n\t\t */\n\t\tmakeRotationFromEuler(euler) {\n\t\t\tconst te = this.elements;\n\t\t\tconst x = euler.x,\n\t\t\t\ty = euler.y,\n\t\t\t\tz = euler.z;\n\t\t\tconst a = Math.cos(x),\n\t\t\t\tb = Math.sin(x);\n\t\t\tconst c = Math.cos(y),\n\t\t\t\td = Math.sin(y);\n\t\t\tconst e = Math.cos(z),\n\t\t\t\tf = Math.sin(z);\n\t\t\tif (euler.order === 'XYZ') {\n\t\t\t\tconst ae = a * e,\n\t\t\t\t\taf = a * f,\n\t\t\t\t\tbe = b * e,\n\t\t\t\t\tbf = b * f;\n\t\t\t\tte[0] = c * e;\n\t\t\t\tte[4] = -c * f;\n\t\t\t\tte[8] = d;\n\t\t\t\tte[1] = af + be * d;\n\t\t\t\tte[5] = ae - bf * d;\n\t\t\t\tte[9] = -b * c;\n\t\t\t\tte[2] = bf - ae * d;\n\t\t\t\tte[6] = be + af * d;\n\t\t\t\tte[10] = a * c;\n\t\t\t} else if (euler.order === 'YXZ') {\n\t\t\t\tconst ce = c * e,\n\t\t\t\t\tcf = c * f,\n\t\t\t\t\tde = d * e,\n\t\t\t\t\tdf = d * f;\n\t\t\t\tte[0] = ce + df * b;\n\t\t\t\tte[4] = de * b - cf;\n\t\t\t\tte[8] = a * d;\n\t\t\t\tte[1] = a * f;\n\t\t\t\tte[5] = a * e;\n\t\t\t\tte[9] = -b;\n\t\t\t\tte[2] = cf * b - de;\n\t\t\t\tte[6] = df + ce * b;\n\t\t\t\tte[10] = a * c;\n\t\t\t} else if (euler.order === 'ZXY') {\n\t\t\t\tconst ce = c * e,\n\t\t\t\t\tcf = c * f,\n\t\t\t\t\tde = d * e,\n\t\t\t\t\tdf = d * f;\n\t\t\t\tte[0] = ce - df * b;\n\t\t\t\tte[4] = -a * f;\n\t\t\t\tte[8] = de + cf * b;\n\t\t\t\tte[1] = cf + de * b;\n\t\t\t\tte[5] = a * e;\n\t\t\t\tte[9] = df - ce * b;\n\t\t\t\tte[2] = -a * d;\n\t\t\t\tte[6] = b;\n\t\t\t\tte[10] = a * c;\n\t\t\t} else if (euler.order === 'ZYX') {\n\t\t\t\tconst ae = a * e,\n\t\t\t\t\taf = a * f,\n\t\t\t\t\tbe = b * e,\n\t\t\t\t\tbf = b * f;\n\t\t\t\tte[0] = c * e;\n\t\t\t\tte[4] = be * d - af;\n\t\t\t\tte[8] = ae * d + bf;\n\t\t\t\tte[1] = c * f;\n\t\t\t\tte[5] = bf * d + ae;\n\t\t\t\tte[9] = af * d - be;\n\t\t\t\tte[2] = -d;\n\t\t\t\tte[6] = b * c;\n\t\t\t\tte[10] = a * c;\n\t\t\t} else if (euler.order === 'YZX') {\n\t\t\t\tconst ac = a * c,\n\t\t\t\t\tad = a * d,\n\t\t\t\t\tbc = b * c,\n\t\t\t\t\tbd = b * d;\n\t\t\t\tte[0] = c * e;\n\t\t\t\tte[4] = bd - ac * f;\n\t\t\t\tte[8] = bc * f + ad;\n\t\t\t\tte[1] = f;\n\t\t\t\tte[5] = a * e;\n\t\t\t\tte[9] = -b * e;\n\t\t\t\tte[2] = -d * e;\n\t\t\t\tte[6] = ad * f + bc;\n\t\t\t\tte[10] = ac - bd * f;\n\t\t\t} else if (euler.order === 'XZY') {\n\t\t\t\tconst ac = a * c,\n\t\t\t\t\tad = a * d,\n\t\t\t\t\tbc = b * c,\n\t\t\t\t\tbd = b * d;\n\t\t\t\tte[0] = c * e;\n\t\t\t\tte[4] = -f;\n\t\t\t\tte[8] = d * e;\n\t\t\t\tte[1] = ac * f + bd;\n\t\t\t\tte[5] = a * e;\n\t\t\t\tte[9] = ad * f - bc;\n\t\t\t\tte[2] = bc * f - ad;\n\t\t\t\tte[6] = b * e;\n\t\t\t\tte[10] = bd * f + ac;\n\t\t\t}\n\n\t\t\t// bottom row\n\t\t\tte[3] = 0;\n\t\t\tte[7] = 0;\n\t\t\tte[11] = 0;\n\n\t\t\t// last column\n\t\t\tte[12] = 0;\n\t\t\tte[13] = 0;\n\t\t\tte[14] = 0;\n\t\t\tte[15] = 1;\n\t\t\treturn this;\n\t\t}\n\n\t\t/**\n\t\t * Sets the rotation component of this matrix to the rotation specified by q, as outlined here.\n\t\t * @param {Quaternion} q\n\t\t * @returns {Matrix4}\n\t\t */\n\t\tmakeRotationFromQuaternion(q) {\n\t\t\treturn this.compose(_zero, q, _one);\n\t\t}\n\n\t\t/**\n\t\t * Constructs a rotation matrix, looking from eye towards center oriented by the up vector.\n\t\t * @param {Vector3} eye - The eye vector.\n\t\t * @param {Vector3} target - The target vector.\n\t\t * @param {Vector3} up - The up vector.\n\t\t * @returns {Matrix4} A reference to this matrix.\n\t\t */\n\t\tlookAtRH(eye, target, up) {\n\t\t\tconst te = this.elements;\n\t\t\t_z.subVectors(eye, target);\n\t\t\tif (_z.getLengthSquared() === 0) {\n\t\t\t\t// eye and target are in the same position\n\t\t\t\t_z.z = 1;\n\t\t\t}\n\t\t\t_z.normalize();\n\t\t\t_x.crossVectors(up, _z);\n\t\t\tif (_x.getLengthSquared() === 0) {\n\t\t\t\t// up and z are parallel\n\n\t\t\t\tif (Math.abs(up.z) === 1) {\n\t\t\t\t\t_z.x += 0.0001;\n\t\t\t\t} else {\n\t\t\t\t\t_z.z += 0.0001;\n\t\t\t\t}\n\t\t\t\t_z.normalize();\n\t\t\t\t_x.crossVectors(up, _z);\n\t\t\t}\n\t\t\t_x.normalize();\n\t\t\t_y.crossVectors(_z, _x);\n\t\t\tte[0] = _x.x;\n\t\t\tte[4] = _y.x;\n\t\t\tte[8] = _z.x;\n\t\t\tte[1] = _x.y;\n\t\t\tte[5] = _y.y;\n\t\t\tte[9] = _z.y;\n\t\t\tte[2] = _x.z;\n\t\t\tte[6] = _y.z;\n\t\t\tte[10] = _z.z;\n\t\t\treturn this;\n\t\t}\n\n\t\t/**\n\t\t * Post-multiplies this matrix by the given 4x4 matrix.\n\t\t * @param {Matrix4} m - The matrix to multiply with.\n\t\t * @returns {Matrix4} A reference to this matrix.\n\t\t */\n\t\tmultiply(m) {\n\t\t\treturn this.multiplyMatrices(this, m);\n\t\t}\n\n\t\t/**\n\t\t * Pre-multiplies this matrix by the given 4x4 matrix.\n\t\t * @param {Matrix4} m - The matrix to multiply with.\n\t\t * @returns {Matrix4} A reference to this matrix.\n\t\t */\n\t\tpremultiply(m) {\n\t\t\treturn this.multiplyMatrices(m, this);\n\t\t}\n\n\t\t/**\n\t\t * Multiples the given 4x4 matrices and stores the result\n\t\t * in this matrix.\n\t\t * @param {Matrix4} a - The first matrix.\n\t\t * @param {Matrix4} b - The second matrix.\n\t\t * @returns {Matrix4} A reference to this matrix.\n\t\t */\n\t\tmultiplyMatrices(a, b) {\n\t\t\tconst ae = a.elements;\n\t\t\tconst be = b.elements;\n\t\t\tconst te = this.elements;\n\t\t\tconst a11 = ae[0],\n\t\t\t\ta12 = ae[4],\n\t\t\t\ta13 = ae[8],\n\t\t\t\ta14 = ae[12];\n\t\t\tconst a21 = ae[1],\n\t\t\t\ta22 = ae[5],\n\t\t\t\ta23 = ae[9],\n\t\t\t\ta24 = ae[13];\n\t\t\tconst a31 = ae[2],\n\t\t\t\ta32 = ae[6],\n\t\t\t\ta33 = ae[10],\n\t\t\t\ta34 = ae[14];\n\t\t\tconst a41 = ae[3],\n\t\t\t\ta42 = ae[7],\n\t\t\t\ta43 = ae[11],\n\t\t\t\ta44 = ae[15];\n\t\t\tconst b11 = be[0],\n\t\t\t\tb12 = be[4],\n\t\t\t\tb13 = be[8],\n\t\t\t\tb14 = be[12];\n\t\t\tconst b21 = be[1],\n\t\t\t\tb22 = be[5],\n\t\t\t\tb23 = be[9],\n\t\t\t\tb24 = be[13];\n\t\t\tconst b31 = be[2],\n\t\t\t\tb32 = be[6],\n\t\t\t\tb33 = be[10],\n\t\t\t\tb34 = be[14];\n\t\t\tconst b41 = be[3],\n\t\t\t\tb42 = be[7],\n\t\t\t\tb43 = be[11],\n\t\t\t\tb44 = be[15];\n\t\t\tte[0] = a11 * b11 + a12 * b21 + a13 * b31 + a14 * b41;\n\t\t\tte[4] = a11 * b12 + a12 * b22 + a13 * b32 + a14 * b42;\n\t\t\tte[8] = a11 * b13 + a12 * b23 + a13 * b33 + a14 * b43;\n\t\t\tte[12] = a11 * b14 + a12 * b24 + a13 * b34 + a14 * b44;\n\t\t\tte[1] = a21 * b11 + a22 * b21 + a23 * b31 + a24 * b41;\n\t\t\tte[5] = a21 * b12 + a22 * b22 + a23 * b32 + a24 * b42;\n\t\t\tte[9] = a21 * b13 + a22 * b23 + a23 * b33 + a24 * b43;\n\t\t\tte[13] = a21 * b14 + a22 * b24 + a23 * b34 + a24 * b44;\n\t\t\tte[2] = a31 * b11 + a32 * b21 + a33 * b31 + a34 * b41;\n\t\t\tte[6] = a31 * b12 + a32 * b22 + a33 * b32 + a34 * b42;\n\t\t\tte[10] = a31 * b13 + a32 * b23 + a33 * b33 + a34 * b43;\n\t\t\tte[14] = a31 * b14 + a32 * b24 + a33 * b34 + a34 * b44;\n\t\t\tte[3] = a41 * b11 + a42 * b21 + a43 * b31 + a44 * b41;\n\t\t\tte[7] = a41 * b12 + a42 * b22 + a43 * b32 + a44 * b42;\n\t\t\tte[11] = a41 * b13 + a42 * b23 + a43 * b33 + a44 * b43;\n\t\t\tte[15] = a41 * b14 + a42 * b24 + a43 * b34 + a44 * b44;\n\t\t\treturn this;\n\t\t}\n\n\t\t/**\n\t\t * Computes and returns the determinant of this matrix.\n\t\t * Based on the method outlined [here]{@link http://www.euclideanspace.com/maths/algebra/matrix/functions/inverse/fourD/index.html}.\n\t\t * @returns {number} The determinant.\n\t\t */\n\t\tdeterminant() {\n\t\t\tconst te = this.elements;\n\t\t\tconst n11 = te[0],\n\t\t\t\tn12 = te[4],\n\t\t\t\tn13 = te[8],\n\t\t\t\tn14 = te[12];\n\t\t\tconst n21 = te[1],\n\t\t\t\tn22 = te[5],\n\t\t\t\tn23 = te[9],\n\t\t\t\tn24 = te[13];\n\t\t\tconst n31 = te[2],\n\t\t\t\tn32 = te[6],\n\t\t\t\tn33 = te[10],\n\t\t\t\tn34 = te[14];\n\t\t\tconst n41 = te[3],\n\t\t\t\tn42 = te[7],\n\t\t\t\tn43 = te[11],\n\t\t\t\tn44 = te[15];\n\n\t\t\t// TODO: make this more efficient\n\n\t\t\treturn n41 * (+n14 * n23 * n32 - n13 * n24 * n32 - n14 * n22 * n33 + n12 * n24 * n33 + n13 * n22 * n34 - n12 * n23 * n34) + n42 * (+n11 * n23 * n34 - n11 * n24 * n33 + n14 * n21 * n33 - n13 * n21 * n34 + n13 * n24 * n31 - n14 * n23 * n31) + n43 * (+n11 * n24 * n32 - n11 * n22 * n34 - n14 * n21 * n32 + n12 * n21 * n34 + n14 * n22 * n31 - n12 * n24 * n31) + n44 * (-n13 * n22 * n31 - n11 * n23 * n32 + n11 * n22 * n33 + n13 * n21 * n32 - n12 * n21 * n33 + n12 * n23 * n31);\n\t\t}\n\n\t\t/**\n\t\t * Transposes this matrix in place.\n\t\t * @returns {Matrix4} A reference to this matrix.\n\t\t */\n\t\ttranspose() {\n\t\t\tconst te = this.elements;\n\t\t\tlet tmp;\n\t\t\ttmp = te[1];\n\t\t\tte[1] = te[4];\n\t\t\tte[4] = tmp;\n\t\t\ttmp = te[2];\n\t\t\tte[2] = te[8];\n\t\t\tte[8] = tmp;\n\t\t\ttmp = te[6];\n\t\t\tte[6] = te[9];\n\t\t\tte[9] = tmp;\n\t\t\ttmp = te[3];\n\t\t\tte[3] = te[12];\n\t\t\tte[12] = tmp;\n\t\t\ttmp = te[7];\n\t\t\tte[7] = te[13];\n\t\t\tte[13] = tmp;\n\t\t\ttmp = te[11];\n\t\t\tte[11] = te[14];\n\t\t\tte[14] = tmp;\n\t\t\treturn this;\n\t\t}\n\n\t\t/**\n\t\t * Sets the position component for this matrix from the given vector,\n\t\t * without affecting the rest of the matrix.\n\t\t * @param {number|Vector3} x - The x component of the vector or alternatively the vector object.\n\t\t * @param {number} y - The y component of the vector.\n\t\t * @param {number} z - The z component of the vector.\n\t\t * @returns {Matrix4} A reference to this matrix.\n\t\t */\n\t\tsetPosition(x, y, z) {\n\t\t\tconst te = this.elements;\n\t\t\tif (x.isVector3) {\n\t\t\t\tte[12] = x.x;\n\t\t\t\tte[13] = x.y;\n\t\t\t\tte[14] = x.z;\n\t\t\t} else {\n\t\t\t\tte[12] = x;\n\t\t\t\tte[13] = y;\n\t\t\t\tte[14] = z;\n\t\t\t}\n\t\t\treturn this;\n\t\t}\n\n\t\t/**\n\t\t * Inverts this matrix, using the [analytic method]{@link https://en.wikipedia.org/wiki/Invertible_matrix#Analytic_solution}.\n\t\t * You can not invert with a determinant of zero. If you attempt this, the method produces\n\t\t * a zero matrix instead.\n\t\t * @returns {Matrix4} A reference to this matrix.\n\t\t */\n\t\tinvert() {\n\t\t\t// based on http://www.euclideanspace.com/maths/algebra/matrix/functions/inverse/fourD/index.htm\n\t\t\tconst te = this.elements,\n\t\t\t\tn11 = te[0],\n\t\t\t\tn21 = te[1],\n\t\t\t\tn31 = te[2],\n\t\t\t\tn41 = te[3],\n\t\t\t\tn12 = te[4],\n\t\t\t\tn22 = te[5],\n\t\t\t\tn32 = te[6],\n\t\t\t\tn42 = te[7],\n\t\t\t\tn13 = te[8],\n\t\t\t\tn23 = te[9],\n\t\t\t\tn33 = te[10],\n\t\t\t\tn43 = te[11],\n\t\t\t\tn14 = te[12],\n\t\t\t\tn24 = te[13],\n\t\t\t\tn34 = te[14],\n\t\t\t\tn44 = te[15],\n\t\t\t\tt11 = n23 * n34 * n42 - n24 * n33 * n42 + n24 * n32 * n43 - n22 * n34 * n43 - n23 * n32 * n44 + n22 * n33 * n44,\n\t\t\t\tt12 = n14 * n33 * n42 - n13 * n34 * n42 - n14 * n32 * n43 + n12 * n34 * n43 + n13 * n32 * n44 - n12 * n33 * n44,\n\t\t\t\tt13 = n13 * n24 * n42 - n14 * n23 * n42 + n14 * n22 * n43 - n12 * n24 * n43 - n13 * n22 * n44 + n12 * n23 * n44,\n\t\t\t\tt14 = n14 * n23 * n32 - n13 * n24 * n32 - n14 * n22 * n33 + n12 * n24 * n33 + n13 * n22 * n34 - n12 * n23 * n34;\n\t\t\tconst det = n11 * t11 + n21 * t12 + n31 * t13 + n41 * t14;\n\t\t\tif (det === 0) return this.set(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);\n\t\t\tconst detInv = 1 / det;\n\t\t\tte[0] = t11 * detInv;\n\t\t\tte[1] = (n24 * n33 * n41 - n23 * n34 * n41 - n24 * n31 * n43 + n21 * n34 * n43 + n23 * n31 * n44 - n21 * n33 * n44) * detInv;\n\t\t\tte[2] = (n22 * n34 * n41 - n24 * n32 * n41 + n24 * n31 * n42 - n21 * n34 * n42 - n22 * n31 * n44 + n21 * n32 * n44) * detInv;\n\t\t\tte[3] = (n23 * n32 * n41 - n22 * n33 * n41 - n23 * n31 * n42 + n21 * n33 * n42 + n22 * n31 * n43 - n21 * n32 * n43) * detInv;\n\t\t\tte[4] = t12 * detInv;\n\t\t\tte[5] = (n13 * n34 * n41 - n14 * n33 * n41 + n14 * n31 * n43 - n11 * n34 * n43 - n13 * n31 * n44 + n11 * n33 * n44) * detInv;\n\t\t\tte[6] = (n14 * n32 * n41 - n12 * n34 * n41 - n14 * n31 * n42 + n11 * n34 * n42 + n12 * n31 * n44 - n11 * n32 * n44) * detInv;\n\t\t\tte[7] = (n12 * n33 * n41 - n13 * n32 * n41 + n13 * n31 * n42 - n11 * n33 * n42 - n12 * n31 * n43 + n11 * n32 * n43) * detInv;\n\t\t\tte[8] = t13 * detInv;\n\t\t\tte[9] = (n14 * n23 * n41 - n13 * n24 * n41 - n14 * n21 * n43 + n11 * n24 * n43 + n13 * n21 * n44 - n11 * n23 * n44) * detInv;\n\t\t\tte[10] = (n12 * n24 * n41 - n14 * n22 * n41 + n14 * n21 * n42 - n11 * n24 * n42 - n12 * n21 * n44 + n11 * n22 * n44) * detInv;\n\t\t\tte[11] = (n13 * n22 * n41 - n12 * n23 * n41 - n13 * n21 * n42 + n11 * n23 * n42 + n12 * n21 * n43 - n11 * n22 * n43) * detInv;\n\t\t\tte[12] = t14 * detInv;\n\t\t\tte[13] = (n13 * n24 * n31 - n14 * n23 * n31 + n14 * n21 * n33 - n11 * n24 * n33 - n13 * n21 * n34 + n11 * n23 * n34) * detInv;\n\t\t\tte[14] = (n14 * n22 * n31 - n12 * n24 * n31 - n14 * n21 * n32 + n11 * n24 * n32 + n12 * n21 * n34 - n11 * n22 * n34) * detInv;\n\t\t\tte[15] = (n12 * n23 * n31 - n13 * n22 * n31 + n13 * n21 * n32 - n11 * n23 * n32 - n12 * n21 * n33 + n11 * n22 * n33) * detInv;\n\t\t\treturn this;\n\t\t}\n\n\t\t/**\n\t\t * Gets the maximum scale value of the three axes.\n\t\t * @returns {number} The maximum scale.\n\t\t */\n\t\tgetMaxScaleOnAxis() {\n\t\t\tconst te = this.elements;\n\t\t\tconst scaleXSq = te[0] * te[0] + te[1] * te[1] + te[2] * te[2];\n\t\t\tconst scaleYSq = te[4] * te[4] + te[5] * te[5] + te[6] * te[6];\n\t\t\tconst scaleZSq = te[8] * te[8] + te[9] * te[9] + te[10] * te[10];\n\t\t\treturn Math.sqrt(Math.max(scaleXSq, scaleYSq, scaleZSq));\n\t\t}\n\n\t\t/**\n\t\t * Sets this matrix as a translation transform from the given vector.\n\t\t * @param {number|Vector3} x - The amount to translate in the X axis or alternatively a translation vector.\n\t\t * @param {number} y - The amount to translate in the Y axis.\n\t\t * @param {number} z - The amount to translate in the z axis.\n\t\t * @returns {Matrix4} A reference to this matrix.\n\t\t */\n\t\tmakeTranslation(x, y, z) {\n\t\t\tif (x.isVector3) {\n\t\t\t\tthis.set(1, 0, 0, x.x, 0, 1, 0, x.y, 0, 0, 1, x.z, 0, 0, 0, 1);\n\t\t\t} else {\n\t\t\t\tthis.set(1, 0, 0, x, 0, 1, 0, y, 0, 0, 1, z, 0, 0, 0, 1);\n\t\t\t}\n\t\t\treturn this;\n\t\t}\n\n\t\t/**\n\t\t * Sets this matrix as a rotational transformation around the given axis by\n\t\t * the given angle.\n\t\t * This is a somewhat controversial but mathematically sound alternative to\n\t\t * rotating via Quaternions. See the discussion [here]{@link https://www.gamedev.net/articles/programming/math-and-physics/do-we-really-need-quaternions-r1199}.\n\t\t * @param {Vector3} axis - The normalized rotation axis.\n\t\t * @param {number} angle - The rotation in radians.\n\t\t * @returns {Matrix4} A reference to this matrix.\n\t\t */\n\t\tmakeRotationAxis(axis, angle) {\n\t\t\t// Based on http://www.gamedev.net/reference/articles/article1199.asp\n\n\t\t\tconst c = Math.cos(angle);\n\t\t\tconst s = Math.sin(angle);\n\t\t\tconst t = 1 - c;\n\t\t\tconst x = axis.x,\n\t\t\t\ty = axis.y,\n\t\t\t\tz = axis.z;\n\t\t\tconst tx = t * x,\n\t\t\t\tty = t * y;\n\t\t\treturn this.set(tx * x + c, tx * y - s * z, tx * z + s * y, 0, tx * y + s * z, ty * y + c, ty * z - s * x, 0, tx * z - s * y, ty * z + s * x, t * z * z + c, 0, 0, 0, 0, 1);\n\t\t}\n\n\t\t/**\n\t\t * Sets this matrix as a scale transformation.\n\t\t * @param {number} x - The amount to scale in the X axis.\n\t\t * @param {number} y - The amount to scale in the Y axis.\n\t\t * @param {number} z - The amount to scale in the Z axis.\n\t\t * @returns {Matrix4} A reference to this matrix.\n\t\t */\n\t\tmakeScale(x, y, z) {\n\t\t\treturn this.set(x, 0, 0, 0, 0, y, 0, 0, 0, 0, z, 0, 0, 0, 0, 1);\n\t\t}\n\n\t\t/**\n\t\t * Sets this matrix to the transformation composed of the given position,\n\t\t * rotation (Quaternion) and scale.\n\t\t * @param {Vector3} position - The position vector.\n\t\t * @param {Quaternion} quaternion - The rotation as a Quaternion.\n\t\t * @param {Vector3} scale - The scale vector.\n\t\t * @returns {Matrix4} A reference to this matrix.\n\t\t */\n\t\tcompose(position, quaternion, scale) {\n\t\t\tconst te = this.elements;\n\t\t\tconst x = quaternion._x,\n\t\t\t\ty = quaternion._y,\n\t\t\t\tz = quaternion._z,\n\t\t\t\tw = quaternion._w;\n\t\t\tconst x2 = x + x,\n\t\t\t\ty2 = y + y,\n\t\t\t\tz2 = z + z;\n\t\t\tconst xx = x * x2,\n\t\t\t\txy = x * y2,\n\t\t\t\txz = x * z2;\n\t\t\tconst yy = y * y2,\n\t\t\t\tyz = y * z2,\n\t\t\t\tzz = z * z2;\n\t\t\tconst wx = w * x2,\n\t\t\t\twy = w * y2,\n\t\t\t\twz = w * z2;\n\t\t\tconst sx = scale.x,\n\t\t\t\tsy = scale.y,\n\t\t\t\tsz = scale.z;\n\t\t\tte[0] = (1 - (yy + zz)) * sx;\n\t\t\tte[1] = (xy + wz) * sx;\n\t\t\tte[2] = (xz - wy) * sx;\n\t\t\tte[3] = 0;\n\t\t\tte[4] = (xy - wz) * sy;\n\t\t\tte[5] = (1 - (xx + zz)) * sy;\n\t\t\tte[6] = (yz + wx) * sy;\n\t\t\tte[7] = 0;\n\t\t\tte[8] = (xz + wy) * sz;\n\t\t\tte[9] = (yz - wx) * sz;\n\t\t\tte[10] = (1 - (xx + yy)) * sz;\n\t\t\tte[11] = 0;\n\t\t\tte[12] = position.x;\n\t\t\tte[13] = position.y;\n\t\t\tte[14] = position.z;\n\t\t\tte[15] = 1;\n\t\t\treturn this;\n\t\t}\n\n\t\t/**\n\t\t * Decomposes this matrix into its position, rotation and scale components\n\t\t * and provides the result in the given objects.\n\t\t * Note: Not all matrices are decomposable in this way. For example, if an\n\t\t * object has a non-uniformly scaled parent, then the object's world matrix\n\t\t * may not be decomposable, and this method may not be appropriate.\n\t\t * @param {Vector3} position - The position vector.\n\t\t * @param {Quaternion} quaternion - The rotation as a Quaternion.\n\t\t * @param {Vector3} scale - The scale vector.\n\t\t * @returns {Matrix4} A reference to this matrix.\n\t\t */\n\t\tdecompose(position, quaternion, scale) {\n\t\t\tconst te = this.elements;\n\t\t\tlet sx = _vec3_1$6.set(te[0], te[1], te[2]).getLength();\n\t\t\tconst sy = _vec3_1$6.set(te[4], te[5], te[6]).getLength();\n\t\t\tconst sz = _vec3_1$6.set(te[8], te[9], te[10]).getLength();\n\n\t\t\t// if determine is negative, we need to invert one scale\n\t\t\tconst det = this.determinant();\n\t\t\tif (det < 0) {\n\t\t\t\tsx = -sx;\n\t\t\t}\n\t\t\tposition.x = te[12];\n\t\t\tposition.y = te[13];\n\t\t\tposition.z = te[14];\n\n\t\t\t// scale the rotation part\n\t\t\t_mat4_1$3.copy(this);\n\t\t\tconst invSX = 1 / sx;\n\t\t\tconst invSY = 1 / sy;\n\t\t\tconst invSZ = 1 / sz;\n\t\t\t_mat4_1$3.elements[0] *= invSX;\n\t\t\t_mat4_1$3.elements[1] *= invSX;\n\t\t\t_mat4_1$3.elements[2] *= invSX;\n\t\t\t_mat4_1$3.elements[4] *= invSY;\n\t\t\t_mat4_1$3.elements[5] *= invSY;\n\t\t\t_mat4_1$3.elements[6] *= invSY;\n\t\t\t_mat4_1$3.elements[8] *= invSZ;\n\t\t\t_mat4_1$3.elements[9] *= invSZ;\n\t\t\t_mat4_1$3.elements[10] *= invSZ;\n\t\t\tquaternion.setFromRotationMatrix(_mat4_1$3);\n\t\t\tscale.x = sx;\n\t\t\tscale.y = sy;\n\t\t\tscale.z = sz;\n\t\t\treturn this;\n\t\t}\n\n\t\t/**\n\t\t * Returns `true` if this matrix is equal with the given one.\n\t\t * @param {Matrix4} matrix - The matrix to test for equality.\n\t\t * @returns {boolean} Whether this matrix is equal with the given one.\n\t\t */\n\t\tequals(matrix) {\n\t\t\tconst te = this.elements;\n\t\t\tconst me = matrix.elements;\n\t\t\tfor (let i = 0; i < 16; i++) {\n\t\t\t\tif (te[i] !== me[i]) return false;\n\t\t\t}\n\t\t\treturn true;\n\t\t}\n\n\t\t/**\n\t\t * Sets the elements of the matrix from the given array.\n\t\t * @param {Array<number>} array - The matrix elements in column-major order.\n\t\t * @param {number} [offset=0] - Index of the first element in the array.\n\t\t * @returns {Matrix4} A reference to this matrix.\n\t\t */\n\t\tfromArray(array, offset = 0) {\n\t\t\tfor (let i = 0; i < 16; i++) {\n\t\t\t\tthis.elements[i] = array[i + offset];\n\t\t\t}\n\t\t\treturn this;\n\t\t}\n\n\t\t/**\n\t\t * Writes the elements of this matrix to the given array. If no array is provided,\n\t\t * the method returns a new instance.\n\t\t * @param {Array<number>} [array=[]] - The target array holding the matrix elements in column-major order.\n\t\t * @param {number} [offset=0] - Index of the first element in the array.\n\t\t * @returns {Array<number>} The matrix elements in column-major order.\n\t\t */\n\t\ttoArray(array = [], offset = 0) {\n\t\t\tconst te = this.elements;\n\t\t\tarray[offset] = te[0];\n\t\t\tarray[offset + 1] = te[1];\n\t\t\tarray[offset + 2] = te[2];\n\t\t\tarray[offset + 3] = te[3];\n\t\t\tarray[offset + 4] = te[4];\n\t\t\tarray[offset + 5] = te[5];\n\t\t\tarray[offset + 6] = te[6];\n\t\t\tarray[offset + 7] = te[7];\n\t\t\tarray[offset + 8] = te[8];\n\t\t\tarray[offset + 9] = te[9];\n\t\t\tarray[offset + 10] = te[10];\n\t\t\tarray[offset + 11] = te[11];\n\t\t\tarray[offset + 12] = te[12];\n\t\t\tarray[offset + 13] = te[13];\n\t\t\tarray[offset + 14] = te[14];\n\t\t\tarray[offset + 15] = te[15];\n\t\t\treturn array;\n\t\t}\n\n\t\t/**\n\t\t * Linearly interpolates between two matrix4.\n\t\t * @param {Matrix4} m1\n\t\t * @param {Matrix4} m2\n\t\t * @param {number} ratio\n\t\t * @returns {Matrix4}\n\t\t */\n\t\tlerpMatrices(m1, m2, ratio) {\n\t\t\tif (ratio === 0) return this.copy(m1);\n\t\t\tif (ratio === 1) return this.copy(m2);\n\t\t\tconst te = this.elements,\n\t\t\t\tte1 = m1.elements,\n\t\t\t\tte2 = m2.elements;\n\t\t\tfor (let i = 0; i < 16; i++) {\n\t\t\t\tte[i] = te1[i] * (1 - ratio) + te2[i] * ratio;\n\t\t\t}\n\t\t\treturn this;\n\t\t}\n\t}\n\n\t/**\n\t * This flag can be used for type testing.\n\t * @readonly\n\t * @type {boolean}\n\t * @default true\n\t */\n\tMatrix4.prototype.isMatrix4 = true;\n\tconst _vec3_1$6 = new Vector3();\n\tconst _mat4_1$3 = new Matrix4();\n\tconst _zero = new Vector3(0, 0, 0);\n\tconst _one = new Vector3(1, 1, 1);\n\tconst _x = new Vector3();\n\tconst _y = new Vector3();\n\tconst _z = new Vector3();\n\n\t/**\n\t * Class for representing a Quaternion.\n\t */\n\tclass Quaternion {\n\t\t/**\n\t\t * Constructs a new quaternion.\n\t\t * @param {number} [x=0] - The x value of this quaternion.\n\t\t * @param {number} [y=0] - The y value of this quaternion.\n\t\t * @param {number} [z=0] - The z value of this quaternion.\n\t\t * @param {number} [w=1] - The w value of this quaternion.\n\t\t */\n\t\tconstructor(x = 0, y = 0, z = 0, w = 1) {\n\t\t\tthis._x = x;\n\t\t\tthis._y = y;\n\t\t\tthis._z = z;\n\t\t\tthis._w = w;\n\t\t}\n\n\t\t/**\n\t\t * Interpolates between two quaternions via SLERP. This implementation assumes the\n\t\t * quaternion data are managed in flat arrays.\n\t\t * @param {Array<number>} dst - The destination array.\n\t\t * @param {number} dstOffset - An offset into the destination array.\n\t\t * @param {Array<number>} src0 - The source array of the first quaternion.\n\t\t * @param {number} srcOffset0 - An offset into the first source array.\n\t\t * @param {Array<number>} src1 -\tThe source array of the second quaternion.\n\t\t * @param {number} srcOffset1 - An offset into the second source array.\n\t\t * @param {number} t - The interpolation factor in the range `[0,1]`.\n\t\t * @see {@link Quaternion#slerp}\n\t\t */\n\t\tstatic slerpFlat(dst, dstOffset, src0, srcOffset0, src1, srcOffset1, t) {\n\t\t\tlet x0 = src0[srcOffset0 + 0],\n\t\t\t\ty0 = src0[srcOffset0 + 1],\n\t\t\t\tz0 = src0[srcOffset0 + 2],\n\t\t\t\tw0 = src0[srcOffset0 + 3];\n\t\t\tlet x1 = src1[srcOffset1 + 0],\n\t\t\t\ty1 = src1[srcOffset1 + 1],\n\t\t\t\tz1 = src1[srcOffset1 + 2],\n\t\t\t\tw1 = src1[srcOffset1 + 3];\n\t\t\tif (t <= 0) {\n\t\t\t\tdst[dstOffset + 0] = x0;\n\t\t\t\tdst[dstOffset + 1] = y0;\n\t\t\t\tdst[dstOffset + 2] = z0;\n\t\t\t\tdst[dstOffset + 3] = w0;\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (t >= 1) {\n\t\t\t\tdst[dstOffset + 0] = x1;\n\t\t\t\tdst[dstOffset + 1] = y1;\n\t\t\t\tdst[dstOffset + 2] = z1;\n\t\t\t\tdst[dstOffset + 3] = w1;\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (w0 !== w1 || x0 !== x1 || y0 !== y1 || z0 !== z1) {\n\t\t\t\tlet dot = x0 * x1 + y0 * y1 + z0 * z1 + w0 * w1;\n\t\t\t\tif (dot < 0) {\n\t\t\t\t\tx1 = -x1;\n\t\t\t\t\ty1 = -y1;\n\t\t\t\t\tz1 = -z1;\n\t\t\t\t\tw1 = -w1;\n\t\t\t\t\tdot = -dot;\n\t\t\t\t}\n\t\t\t\tlet s = 1 - t;\n\t\t\t\tif (dot < 0.9995) {\n\t\t\t\t\t// slerp\n\n\t\t\t\t\tconst theta = Math.acos(dot);\n\t\t\t\t\tconst sin = Math.sin(theta);\n\t\t\t\t\ts = Math.sin(s * theta) / sin;\n\t\t\t\t\tt = Math.sin(t * theta) / sin;\n\t\t\t\t\tx0 = x0 * s + x1 * t;\n\t\t\t\t\ty0 = y0 * s + y1 * t;\n\t\t\t\t\tz0 = z0 * s + z1 * t;\n\t\t\t\t\tw0 = w0 * s + w1 * t;\n\t\t\t\t} else {\n\t\t\t\t\t// for small angles, lerp then normalize\n\n\t\t\t\t\tx0 = x0 * s + x1 * t;\n\t\t\t\t\ty0 = y0 * s + y1 * t;\n\t\t\t\t\tz0 = z0 * s + z1 * t;\n\t\t\t\t\tw0 = w0 * s + w1 * t;\n\t\t\t\t\tconst f = 1 / Math.sqrt(x0 * x0 + y0 * y0 + z0 * z0 + w0 * w0);\n\t\t\t\t\tx0 *= f;\n\t\t\t\t\ty0 *= f;\n\t\t\t\t\tz0 *= f;\n\t\t\t\t\tw0 *= f;\n\t\t\t\t}\n\t\t\t}\n\t\t\tdst[dstOffset] = x0;\n\t\t\tdst[dstOffset + 1] = y0;\n\t\t\tdst[dstOffset + 2] = z0;\n\t\t\tdst[dstOffset + 3] = w0;\n\t\t}\n\n\t\t/**\n\t\t * Multiplies two quaternions. This implementation assumes the quaternion data are managed\n\t\t * in flat arrays.\n\t\t * @param {Array<number>} dst - The destination array.\n\t\t * @param {number} dstOffset - An offset into the destination array.\n\t\t * @param {Array<number>} src0 - The source array of the first quaternion.\n\t\t * @param {number} srcOffset0 - An offset into the first source array.\n\t\t * @param {Array<number>} src1 -\tThe source array of the second quaternion.\n\t\t * @param {number} srcOffset1 - An offset into the second source array.\n\t\t * @returns {Array<number>} The destination array.\n\t\t * @see {@link Quaternion#multiplyQuaternions}\n\t\t */\n\t\tstatic multiplyQuaternionsFlat(dst, dstOffset, src0, srcOffset0, src1, srcOffset1) {\n\t\t\tconst x0 = src0[srcOffset0];\n\t\t\tconst y0 = src0[srcOffset0 + 1];\n\t\t\tconst z0 = src0[srcOffset0 + 2];\n\t\t\tconst w0 = src0[srcOffset0 + 3];\n\t\t\tconst x1 = src1[srcOffset1];\n\t\t\tconst y1 = src1[srcOffset1 + 1];\n\t\t\tconst z1 = src1[srcOffset1 + 2];\n\t\t\tconst w1 = src1[srcOffset1 + 3];\n\t\t\tdst[dstOffset] = x0 * w1 + w0 * x1 + y0 * z1 - z0 * y1;\n\t\t\tdst[dstOffset + 1] = y0 * w1 + w0 * y1 + z0 * x1 - x0 * z1;\n\t\t\tdst[dstOffset + 2] = z0 * w1 + w0 * z1 + x0 * y1 - y0 * x1;\n\t\t\tdst[dstOffset + 3] = w0 * w1 - x0 * x1 - y0 * y1 - z0 * z1;\n\t\t\treturn dst;\n\t\t}\n\n\t\t/**\n\t\t * The x value of this quaternion.\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tget x() {\n\t\t\treturn this._x;\n\t\t}\n\t\tset x(value) {\n\t\t\tthis._x = value;\n\t\t\tthis.onChangeCallback();\n\t\t}\n\n\t\t/**\n\t\t * The y value of this quaternion.\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tget y() {\n\t\t\treturn this._y;\n\t\t}\n\t\tset y(value) {\n\t\t\tthis._y = value;\n\t\t\tthis.onChangeCallback();\n\t\t}\n\n\t\t/**\n\t\t * The z value of this quaternion.\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tget z() {\n\t\t\treturn this._z;\n\t\t}\n\t\tset z(value) {\n\t\t\tthis._z = value;\n\t\t\tthis.onChangeCallback();\n\t\t}\n\n\t\t/**\n\t\t * The w value of this quaternion.\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tget w() {\n\t\t\treturn this._w;\n\t\t}\n\t\tset w(value) {\n\t\t\tthis._w = value;\n\t\t\tthis.onChangeCallback();\n\t\t}\n\n\t\t/**\n\t\t * Sets the quaternion components.\n\t\t * @param {number} x - The x value of this quaternion.\n\t\t * @param {number} y - The y value of this quaternion.\n\t\t * @param {number} z - The z value of this quaternion.\n\t\t * @param {number} w - The w value of this quaternion.\n\t\t * @returns {Quaternion} A reference to this quaternion.\n\t\t */\n\t\tset(x, y, z, w) {\n\t\t\tthis._x = x;\n\t\t\tthis._y = y;\n\t\t\tthis._z = z;\n\t\t\tthis._w = w;\n\t\t\tthis.onChangeCallback();\n\t\t\treturn this;\n\t\t}\n\n\t\t/**\n\t\t * Returns a new quaternion with copied values from this instance.\n\t\t * @returns {Quaternion} A clone of this instance.\n\t\t */\n\t\tclone() {\n\t\t\treturn new Quaternion(this._x, this._y, this._z, this._w);\n\t\t}\n\n\t\t/**\n\t\t * Copies the values of the given quaternion to this instance.\n\t\t * @param {Quaternion} quaternion - The quaternion to copy.\n\t\t * @returns {Quaternion} A reference to this quaternion.\n\t\t */\n\t\tcopy(quaternion) {\n\t\t\tthis._x = quaternion.x;\n\t\t\tthis._y = quaternion.y;\n\t\t\tthis._z = quaternion.z;\n\t\t\tthis._w = quaternion.w;\n\t\t\tthis.onChangeCallback();\n\t\t\treturn this;\n\t\t}\n\n\t\t/**\n\t\t * Sets this quaternion from the rotation specified by the given\n\t\t * Euler angles.\n\t\t * @param {Euler} euler - The Euler angles.\n\t\t * @param {boolean} [update=true] - Whether the internal `onChange` callback should be executed or not.\n\t\t * @returns {Quaternion} A reference to this quaternion.\n\t\t */\n\t\tsetFromEuler(euler, update = true) {\n\t\t\tconst c1 = Math.cos(euler._x / 2);\n\t\t\tconst c2 = Math.cos(euler._y / 2);\n\t\t\tconst c3 = Math.cos(euler._z / 2);\n\t\t\tconst s1 = Math.sin(euler._x / 2);\n\t\t\tconst s2 = Math.sin(euler._y / 2);\n\t\t\tconst s3 = Math.sin(euler._z / 2);\n\t\t\tconst order = euler._order;\n\t\t\tif (order === 'XYZ') {\n\t\t\t\tthis._x = s1 * c2 * c3 + c1 * s2 * s3;\n\t\t\t\tthis._y = c1 * s2 * c3 - s1 * c2 * s3;\n\t\t\t\tthis._z = c1 * c2 * s3 + s1 * s2 * c3;\n\t\t\t\tthis._w = c1 * c2 * c3 - s1 * s2 * s3;\n\t\t\t} else if (order === 'YXZ') {\n\t\t\t\tthis._x = s1 * c2 * c3 + c1 * s2 * s3;\n\t\t\t\tthis._y = c1 * s2 * c3 - s1 * c2 * s3;\n\t\t\t\tthis._z = c1 * c2 * s3 - s1 * s2 * c3;\n\t\t\t\tthis._w = c1 * c2 * c3 + s1 * s2 * s3;\n\t\t\t} else if (order === 'ZXY') {\n\t\t\t\tthis._x = s1 * c2 * c3 - c1 * s2 * s3;\n\t\t\t\tthis._y = c1 * s2 * c3 + s1 * c2 * s3;\n\t\t\t\tthis._z = c1 * c2 * s3 + s1 * s2 * c3;\n\t\t\t\tthis._w = c1 * c2 * c3 - s1 * s2 * s3;\n\t\t\t} else if (order === 'ZYX') {\n\t\t\t\tthis._x = s1 * c2 * c3 - c1 * s2 * s3;\n\t\t\t\tthis._y = c1 * s2 * c3 + s1 * c2 * s3;\n\t\t\t\tthis._z = c1 * c2 * s3 - s1 * s2 * c3;\n\t\t\t\tthis._w = c1 * c2 * c3 + s1 * s2 * s3;\n\t\t\t} else if (order === 'YZX') {\n\t\t\t\tthis._x = s1 * c2 * c3 + c1 * s2 * s3;\n\t\t\t\tthis._y = c1 * s2 * c3 + s1 * c2 * s3;\n\t\t\t\tthis._z = c1 * c2 * s3 - s1 * s2 * c3;\n\t\t\t\tthis._w = c1 * c2 * c3 - s1 * s2 * s3;\n\t\t\t} else if (order === 'XZY') {\n\t\t\t\tthis._x = s1 * c2 * c3 - c1 * s2 * s3;\n\t\t\t\tthis._y = c1 * s2 * c3 - s1 * c2 * s3;\n\t\t\t\tthis._z = c1 * c2 * s3 + s1 * s2 * c3;\n\t\t\t\tthis._w = c1 * c2 * c3 + s1 * s2 * s3;\n\t\t\t}\n\t\t\tif (update === true) this.onChangeCallback();\n\t\t\treturn this;\n\t\t}\n\n\t\t/**\n\t\t * Sets this quaternion from the given axis and angle.\n\t\t * @param {Vector3} axis - The normalized axis.\n\t\t * @param {number} angle - The angle in radians.\n\t\t * @returns {Quaternion} A reference to this quaternion.\n\t\t */\n\t\tsetFromAxisAngle(axis, angle) {\n\t\t\t// http://www.euclideanspace.com/maths/geometry/rotations/conversions/angleToQuaternion/index.htm\n\n\t\t\tconst halfAngle = angle / 2,\n\t\t\t\ts = Math.sin(halfAngle);\n\t\t\tthis._x = axis.x * s;\n\t\t\tthis._y = axis.y * s;\n\t\t\tthis._z = axis.z * s;\n\t\t\tthis._w = Math.cos(halfAngle);\n\t\t\tthis.onChangeCallback();\n\t\t\treturn this;\n\t\t}\n\n\t\t/**\n\t\t * Sets this quaternion from the given rotation matrix.\n\t\t * @param {Matrix4} m - A 4x4 matrix of which the upper 3x3 of matrix is a pure rotation matrix (i.e. unscaled).\n\t\t * @returns {Quaternion} A reference to this quaternion.\n\t\t */\n\t\tsetFromRotationMatrix(m) {\n\t\t\t// http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToQuaternion/index.htm\n\n\t\t\t// assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)\n\n\t\t\tconst te = m.elements,\n\t\t\t\tm11 = te[0],\n\t\t\t\tm12 = te[4],\n\t\t\t\tm13 = te[8],\n\t\t\t\tm21 = te[1],\n\t\t\t\tm22 = te[5],\n\t\t\t\tm23 = te[9],\n\t\t\t\tm31 = te[2],\n\t\t\t\tm32 = te[6],\n\t\t\t\tm33 = te[10],\n\t\t\t\ttrace = m11 + m22 + m33;\n\t\t\tlet s;\n\t\t\tif (trace > 0) {\n\t\t\t\ts = 0.5 / Math.sqrt(trace + 1.0);\n\t\t\t\tthis._w = 0.25 / s;\n\t\t\t\tthis._x = (m32 - m23) * s;\n\t\t\t\tthis._y = (m13 - m31) * s;\n\t\t\t\tthis._z = (m21 - m12) * s;\n\t\t\t} else if (m11 > m22 && m11 > m33) {\n\t\t\t\ts = 2.0 * Math.sqrt(1.0 + m11 - m22 - m33);\n\t\t\t\tthis._w = (m32 - m23) / s;\n\t\t\t\tthis._x = 0.25 * s;\n\t\t\t\tthis._y = (m12 + m21) / s;\n\t\t\t\tthis._z = (m13 + m31) / s;\n\t\t\t} else if (m22 > m33) {\n\t\t\t\ts = 2.0 * Math.sqrt(1.0 + m22 - m11 - m33);\n\t\t\t\tthis._w = (m13 - m31) / s;\n\t\t\t\tthis._x = (m12 + m21) / s;\n\t\t\t\tthis._y = 0.25 * s;\n\t\t\t\tthis._z = (m23 + m32) / s;\n\t\t\t} else {\n\t\t\t\ts = 2.0 * Math.sqrt(1.0 + m33 - m11 - m22);\n\t\t\t\tthis._w = (m21 - m12) / s;\n\t\t\t\tthis._x = (m13 + m31) / s;\n\t\t\t\tthis._y = (m23 + m32) / s;\n\t\t\t\tthis._z = 0.25 * s;\n\t\t\t}\n\t\t\tthis.onChangeCallback();\n\t\t\treturn this;\n\t\t}\n\n\t\t/**\n\t\t * Sets this quaternion to the rotation required to rotate the direction vector\n\t\t * `vFrom` to the direction vector `vTo`.\n\t\t * @param {Vector3} vFrom - The first (normalized) direction vector.\n\t\t * @param {Vector3} vTo - The second (normalized) direction vector.\n\t\t * @returns {Quaternion} A reference to this quaternion.\n\t\t */\n\t\tsetFromUnitVectors(vFrom, vTo) {\n\t\t\t// assumes direction vectors vFrom and vTo are normalized\n\n\t\t\tlet r = vFrom.dot(vTo) + 1;\n\t\t\tif (r < 1e-8) {\n\t\t\t\t// vFrom and vTo point in opposite directions\n\n\t\t\t\tr = 0;\n\t\t\t\tif (Math.abs(vFrom.x) > Math.abs(vFrom.z)) {\n\t\t\t\t\tthis._x = -vFrom.y;\n\t\t\t\t\tthis._y = vFrom.x;\n\t\t\t\t\tthis._z = 0;\n\t\t\t\t\tthis._w = r;\n\t\t\t\t} else {\n\t\t\t\t\tthis._x = 0;\n\t\t\t\t\tthis._y = -vFrom.z;\n\t\t\t\t\tthis._z = vFrom.y;\n\t\t\t\t\tthis._w = r;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// crossVectors(vFrom, vTo); // inlined to avoid cyclic dependency on Vector3\n\n\t\t\t\tthis._x = vFrom.y * vTo.z - vFrom.z * vTo.y;\n\t\t\t\tthis._y = vFrom.z * vTo.x - vFrom.x * vTo.z;\n\t\t\t\tthis._z = vFrom.x * vTo.y - vFrom.y * vTo.x;\n\t\t\t\tthis._w = r;\n\t\t\t}\n\t\t\treturn this.normalize();\n\t\t}\n\n\t\t/**\n\t\t * Returns the angle between this quaternion and the given one in radians.\n\t\t * @param {Quaternion} q - The quaternion to compute the angle with.\n\t\t * @returns {number} The angle in radians.\n\t\t */\n\t\tangleTo(q) {\n\t\t\treturn 2 * Math.acos(Math.abs(MathUtils.clamp(this.dot(q), -1, 1)));\n\t\t}\n\n\t\t/**\n\t\t * Sets this quaternion to the identity quaternion; that is, to the\n\t\t * quaternion that represents \"no rotation\".\n\t\t * @returns {Quaternion} A reference to this quaternion.\n\t\t */\n\t\tidentity() {\n\t\t\treturn this.set(0, 0, 0, 1);\n\t\t}\n\n\t\t/**\n\t\t * Returns the rotational conjugate of this quaternion. The conjugate of a\n\t\t * quaternion represents the same rotation in the opposite direction about\n\t\t * the rotational axis.\n\t\t * @returns {Quaternion} A reference to this quaternion.\n\t\t */\n\t\tconjugate() {\n\t\t\tthis._x *= -1;\n\t\t\tthis._y *= -1;\n\t\t\tthis._z *= -1;\n\t\t\tthis.onChangeCallback();\n\t\t\treturn this;\n\t\t}\n\n\t\t/**\n\t\t * Calculates the dot product of this quaternion and the given one.\n\t\t * @param {Quaternion} v - The quaternion to compute the dot product with.\n\t\t * @returns {number} The result of the dot product.\n\t\t */\n\t\tdot(v) {\n\t\t\treturn this._x * v._x + this._y * v._y + this._z * v._z + this._w * v._w;\n\t\t}\n\n\t\t/**\n\t\t * Computes the squared Euclidean length (straight-line length) of this quaternion,\n\t\t * considered as a 4 dimensional vector. This can be useful if you are comparing the\n\t\t * lengths of two quaternions, as this is a slightly more efficient calculation than\n\t\t * {@link Quaternion#length}.\n\t\t * @returns {number} The squared Euclidean length.\n\t\t */\n\t\tlengthSq() {\n\t\t\treturn this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w;\n\t\t}\n\n\t\t/**\n\t\t * Computes the Euclidean length (straight-line length) of this quaternion,\n\t\t * considered as a 4 dimensional vector.\n\t\t * @returns {number} The Euclidean length.\n\t\t */\n\t\tlength() {\n\t\t\treturn Math.sqrt(this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w);\n\t\t}\n\n\t\t/**\n\t\t * Normalizes this quaternion - that is, calculated the quaternion that performs\n\t\t * the same rotation as this one, but has a length equal to `1`.\n\t\t * @returns {Quaternion} A reference to this quaternion.\n\t\t */\n\t\tnormalize() {\n\t\t\tlet l = this.length();\n\t\t\tif (l === 0) {\n\t\t\t\tthis._x = 0;\n\t\t\t\tthis._y = 0;\n\t\t\t\tthis._z = 0;\n\t\t\t\tthis._w = 1;\n\t\t\t} else {\n\t\t\t\tl = 1 / l;\n\t\t\t\tthis._x = this._x * l;\n\t\t\t\tthis._y = this._y * l;\n\t\t\t\tthis._z = this._z * l;\n\t\t\t\tthis._w = this._w * l;\n\t\t\t}\n\t\t\tthis.onChangeCallback();\n\t\t\treturn this;\n\t\t}\n\n\t\t/**\n\t\t * Multiplies this quaternion by the given one.\n\t\t * @param {Quaternion} q - The quaternion.\n\t\t * @returns {Quaternion} A reference to this quaternion.\n\t\t */\n\t\tmultiply(q) {\n\t\t\treturn this.multiplyQuaternions(this, q);\n\t\t}\n\n\t\t/**\n\t\t * Pre-multiplies this quaternion by the given one.\n\t\t * @param {Quaternion} q - The quaternion.\n\t\t * @returns {Quaternion} A reference to this quaternion.\n\t\t */\n\t\tpremultiply(q) {\n\t\t\treturn this.multiplyQuaternions(q, this);\n\t\t}\n\n\t\t/**\n\t\t * Multiplies the given quaternions and stores the result in this instance.\n\t\t * @param {Quaternion} a - The first quaternion.\n\t\t * @param {Quaternion} b - The second quaternion.\n\t\t * @returns {Quaternion} A reference to this quaternion.\n\t\t */\n\t\tmultiplyQuaternions(a, b) {\n\t\t\t// from http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/code/index.htm\n\n\t\t\tconst qax = a._x,\n\t\t\t\tqay = a._y,\n\t\t\t\tqaz = a._z,\n\t\t\t\tqaw = a._w;\n\t\t\tconst qbx = b._x,\n\t\t\t\tqby = b._y,\n\t\t\t\tqbz = b._z,\n\t\t\t\tqbw = b._w;\n\t\t\tthis._x = qax * qbw + qaw * qbx + qay * qbz - qaz * qby;\n\t\t\tthis._y = qay * qbw + qaw * qby + qaz * qbx - qax * qbz;\n\t\t\tthis._z = qaz * qbw + qaw * qbz + qax * qby - qay * qbx;\n\t\t\tthis._w = qaw * qbw - qax * qbx - qay * qby - qaz * qbz;\n\t\t\tthis.onChangeCallback();\n\t\t\treturn this;\n\t\t}\n\n\t\t/**\n\t\t * Linearly interpolates between two quaternions.\n\t\t * @param {Quaternion} q1\n\t\t * @param {Quaternion} q2\n\t\t * @param {number} ratio\n\t\t * @returns {Quaternion}\n\t\t */\n\t\tlerpQuaternions(q1, q2, ratio) {\n\t\t\tif (ratio === 0) return this.copy(q1);\n\t\t\tif (ratio === 1) return this.copy(q2);\n\t\t\tconst w1 = q1._w,\n\t\t\t\tx1 = q1._x,\n\t\t\t\ty1 = q1._y,\n\t\t\t\tz1 = q1._z;\n\t\t\tlet w2 = q2._w,\n\t\t\t\tx2 = q2._x,\n\t\t\t\ty2 = q2._y,\n\t\t\t\tz2 = q2._z;\n\t\t\tconst dot = w1 * w2 + x1 * x2 + y1 * y2 + z1 * z2;\n\n\t\t\t// shortest direction\n\t\t\tif (dot < 0) {\n\t\t\t\tw2 = -w2;\n\t\t\t\tx2 = -x2;\n\t\t\t\ty2 = -y2;\n\t\t\t\tz2 = -z2;\n\t\t\t}\n\t\t\tthis._w = w1 + ratio * (w2 - w1);\n\t\t\tthis._x = x1 + ratio * (x2 - x1);\n\t\t\tthis._y = y1 + ratio * (y2 - y1);\n\t\t\tthis._z = z1 + ratio * (z2 - z1);\n\t\t\tconst len = 1.0 / Math.sqrt(this._w * this._w + this._x * this._x + this._y * this._y + this._z * this._z);\n\t\t\tthis._w *= len;\n\t\t\tthis._x *= len;\n\t\t\tthis._y *= len;\n\t\t\tthis._z *= len;\n\t\t\tthis.onChangeCallback();\n\t\t\treturn this;\n\t\t}\n\n\t\t/**\n\t\t * Performs a spherical linear interpolation between quaternions.\n\t\t * @param {Quaternion} qb - The target quaternion.\n\t\t * @param {number} t - The interpolation factor in the closed interval `[0, 1]`.\n\t\t * @returns {Quaternion} A reference to this quaternion.\n\t\t */\n\t\tslerp(qb, t) {\n\t\t\tif (t <= 0) return this;\n\t\t\tif (t >= 1) return this.copy(qb); // copy calls onChangeCallback()\n\n\t\t\tlet x = qb._x,\n\t\t\t\ty = qb._y,\n\t\t\t\tz = qb._z,\n\t\t\t\tw = qb._w;\n\t\t\tlet dot = this.dot(qb);\n\t\t\tif (dot < 0) {\n\t\t\t\tx = -x;\n\t\t\t\ty = -y;\n\t\t\t\tz = -z;\n\t\t\t\tw = -w;\n\t\t\t\tdot = -dot;\n\t\t\t}\n\t\t\tlet s = 1 - t;\n\t\t\tif (dot < 0.9995) {\n\t\t\t\t// slerp\n\n\t\t\t\tconst theta = Math.acos(dot);\n\t\t\t\tconst sin = Math.sin(theta);\n\t\t\t\ts = Math.sin(s * theta) / sin;\n\t\t\t\tt = Math.sin(t * theta) / sin;\n\t\t\t\tthis._x = this._x * s + x * t;\n\t\t\t\tthis._y = this._y * s + y * t;\n\t\t\t\tthis._z = this._z * s + z * t;\n\t\t\t\tthis._w = this._w * s + w * t;\n\t\t\t\tthis.onChangeCallback();\n\t\t\t} else {\n\t\t\t\t// for small angles, lerp then normalize\n\n\t\t\t\tthis._x = this._x * s + x * t;\n\t\t\t\tthis._y = this._y * s + y * t;\n\t\t\t\tthis._z = this._z * s + z * t;\n\t\t\t\tthis._w = this._w * s + w * t;\n\t\t\t\tthis.normalize(); // normalize calls onChangeCallback()\n\t\t\t}\n\t\t\treturn this;\n\t\t}\n\n\t\t/**\n\t\t * Performs a spherical linear interpolation between the given quaternions\n\t\t * and stores the result in this quaternion.\n\t\t * @param {Quaternion} qa - The source quaternion.\n\t\t * @param {Quaternion} qb - The target quaternion.\n\t\t * @param {number} t - The interpolation factor in the closed interval `[0, 1]`.\n\t\t * @returns {Quaternion} A reference to this quaternion.\n\t\t */\n\t\tslerpQuaternions(qa, qb, t) {\n\t\t\treturn this.copy(qa).slerp(qb, t);\n\t\t}\n\n\t\t/**\n\t\t * Returns `true` if this quaternion is equal with the given one.\n\t\t * @param {Quaternion} quaternion - The quaternion to test for equality.\n\t\t * @returns {boolean} Whether this quaternion is equal with the given one.\n\t\t */\n\t\tequals(quaternion) {\n\t\t\treturn quaternion._x === this._x && quaternion._y === this._y && quaternion._z === this._z && quaternion._w === this._w;\n\t\t}\n\n\t\t/**\n\t\t * Sets this quaternion's components from the given array.\n\t\t * @param {Array<number>} array - An array holding the quaternion component values.\n\t\t * @param {number} [offset=0] - The offset into the array.\n\t\t * @param {boolean} [denormalize=false] - If true, denormalize the values, and array should be a typed array.\n\t\t * @returns {Quaternion} A reference to this quaternion.\n\t\t */\n\t\tfromArray(array, offset = 0, denormalize = false) {\n\t\t\tlet x = array[offset],\n\t\t\t\ty = array[offset + 1],\n\t\t\t\tz = array[offset + 2],\n\t\t\t\tw = array[offset + 3];\n\t\t\tif (denormalize) {\n\t\t\t\tx = MathUtils.denormalize(x, array);\n\t\t\t\ty = MathUtils.denormalize(y, array);\n\t\t\t\tz = MathUtils.denormalize(z, array);\n\t\t\t\tw = MathUtils.denormalize(w, array);\n\t\t\t}\n\t\t\tthis._x = x;\n\t\t\tthis._y = y;\n\t\t\tthis._z = z;\n\t\t\tthis._w = w;\n\t\t\tthis.onChangeCallback();\n\t\t\treturn this;\n\t\t}\n\n\t\t/**\n\t\t * Writes the components of this quaternion to the given array. If no array is provided,\n\t\t * the method returns a new instance.\n\t\t * @param {Array<number>} [array=[]] - The target array holding the quaternion components.\n\t\t * @param {number} [offset=0] - Index of the first element in the array.\n\t\t * @param {boolean} [normalize=false] - If true, normalize the values, and array should be a typed array.\n\t\t * @returns {Quaternion} The quaternion components.\n\t\t */\n\t\ttoArray(array = [], offset = 0, normalize = false) {\n\t\t\tlet x = this._x,\n\t\t\t\ty = this._y,\n\t\t\t\tz = this._z,\n\t\t\t\tw = this._w;\n\t\t\tif (normalize) {\n\t\t\t\tx = MathUtils.normalize(x, array);\n\t\t\t\ty = MathUtils.normalize(y, array);\n\t\t\t\tz = MathUtils.normalize(z, array);\n\t\t\t\tw = MathUtils.normalize(w, array);\n\t\t\t}\n\t\t\tarray[offset] = x;\n\t\t\tarray[offset + 1] = y;\n\t\t\tarray[offset + 2] = z;\n\t\t\tarray[offset + 3] = w;\n\t\t\treturn array;\n\t\t}\n\n\t\t/**\n\t\t * Convert the current quaternion to a matrix4.\n\t\t * @param {Matrix4} target - The target matrix to write the quaternion data to.\n\t\t * @returns {Matrix4} The target matrix with the quaternion data written to it.\n\t\t */\n\t\ttoMatrix4(target = new Matrix4()) {\n\t\t\tconst ele = target.elements;\n\t\t\tconst xy2 = 2.0 * this._x * this._y,\n\t\t\t\txz2 = 2.0 * this._x * this._z,\n\t\t\t\txw2 = 2.0 * this._x * this._w;\n\t\t\tconst yz2 = 2.0 * this._y * this._z,\n\t\t\t\tyw2 = 2.0 * this._y * this._w,\n\t\t\t\tzw2 = 2.0 * this._z * this._w;\n\t\t\tconst xx = this._x * this._x,\n\t\t\t\tyy = this._y * this._y,\n\t\t\t\tzz = this._z * this._z,\n\t\t\t\tww = this._w * this._w;\n\t\t\tele[0] = xx - yy - zz + ww;\n\t\t\tele[4] = xy2 - zw2;\n\t\t\tele[8] = xz2 + yw2;\n\t\t\tele[12] = 0;\n\t\t\tele[1] = xy2 + zw2;\n\t\t\tele[5] = -xx + yy - zz + ww;\n\t\t\tele[9] = yz2 - xw2;\n\t\t\tele[13] = 0;\n\t\t\tele[2] = xz2 - yw2;\n\t\t\tele[6] = yz2 + xw2;\n\t\t\tele[10] = -xx - yy + zz + ww;\n\t\t\tele[14] = 0;\n\t\t\tele[3] = 0.0;\n\t\t\tele[7] = 0.0;\n\t\t\tele[11] = 0;\n\t\t\tele[15] = 1;\n\t\t\treturn target;\n\t\t}\n\n\t\t/**\n\t\t * Registers a callback that is called whenever the quaternion's\n\t\t * angle value changes.\n\t\t * @param {Function} callback - When the Quaternion angle value changes, the callback method is triggered\n\t\t * @returns {Quaternion} A reference to this quaternion.\n\t\t */\n\t\tonChange(callback) {\n\t\t\tthis.onChangeCallback = callback;\n\t\t\treturn this;\n\t\t}\n\t\tonChangeCallback() {}\n\t\t*[Symbol.iterator]() {\n\t\t\tyield this._x;\n\t\t\tyield this._y;\n\t\t\tyield this._z;\n\t\t\tyield this._w;\n\t\t}\n\t}\n\n\t/**\n\t * This flag can be used for type testing.\n\t * @readonly\n\t * @type {boolean}\n\t * @default true\n\t */\n\tQuaternion.prototype.isQuaternion = true;\n\n\t/**\n\t * Interpolant serves as the base class for all interpolation algorithms.\n\t * It defines a set of static methods that are intended to be invoked by a keyframe track for the purpose of interpolation.\n\t * @abstract\n\t */\n\tclass KeyframeInterpolant {\n\t\t/**\n\t\t * Get the value size for keyframe values.\n\t\t * @returns {number} - the value size.\n\t\t */\n\t\tstatic getValueSize() {\n\t\t\treturn this.values.length / this.times.length;\n\t\t}\n\n\t\t/**\n\t\t * Interpolate the value for the specified time.\n\t\t * @param {number} index0 - the index of the first keyframe.\n\t\t * @param {number} ratio - the ratio (0-1) of the time passed between the first keyframe and the next keyframe.\n\t\t * @param {number} duration - the duration time between the first keyframe and the next keyframe.\n\t\t * @param {Array} outBuffer - the output buffer to store the interpolated value.\n\t\t * @returns {Array} - the output buffer to store the interpolated value.\n\t\t */\n\t\tstatic interpolate(index0, ratio, duration, outBuffer) {\n\t\t\tthrow new Error('Interpolant: call to abstract method');\n\t\t}\n\n\t\t/**\n\t\t * Copy the value for the specified index.\n\t\t * @param {number} index - the index of the keyframe.\n\t\t * @param {Array} outBuffer - the output buffer to store the copied value.\n\t\t * @returns {Array} - the output buffer to store the copied value.\n\t\t */\n\t\tstatic copyValue(index, outBuffer) {\n\t\t\tconst values = this.values,\n\t\t\t\tvalueSize = this.valueSize,\n\t\t\t\toffset = valueSize * index;\n\t\t\tfor (let i = 0; i < valueSize; i++) {\n\t\t\t\toutBuffer[i] = values[offset + i];\n\t\t\t}\n\t\t\treturn outBuffer;\n\t\t}\n\t}\n\n\t/**\n\t * Step (Discrete) interpolation of keyframe values.\n\t * @extends KeyframeInterpolant\n\t */\n\tclass StepInterpolant extends KeyframeInterpolant {\n\t\tstatic interpolate(index0, ratio, duration, outBuffer) {\n\t\t\tconst values = this.values,\n\t\t\t\tvalueSize = this.valueSize,\n\t\t\t\toffset = valueSize * index0;\n\t\t\tfor (let i = 0; i < valueSize; i++) {\n\t\t\t\toutBuffer[i] = values[offset + i];\n\t\t\t}\n\t\t\treturn outBuffer;\n\t\t}\n\t}\n\n\t/**\n\t * Linear interpolation of keyframe values.\n\t * @extends KeyframeInterpolant\n\t */\n\tclass LinearInterpolant extends KeyframeInterpolant {\n\t\tstatic interpolate(index0, ratio, duration, outBuffer) {\n\t\t\tconst values = this.values,\n\t\t\t\tvalueSize = this.valueSize,\n\t\t\t\toffset0 = index0 * valueSize,\n\t\t\t\toffset1 = (index0 + 1) * valueSize;\n\t\t\tlet value1, value2;\n\t\t\tfor (let i = 0; i < valueSize; i++) {\n\t\t\t\tvalue1 = values[offset0 + i];\n\t\t\t\tvalue2 = values[offset1 + i];\n\t\t\t\tif (value1 !== undefined && value2 !== undefined) {\n\t\t\t\t\toutBuffer[i] = value1 * (1 - ratio) + value2 * ratio;\n\t\t\t\t} else {\n\t\t\t\t\toutBuffer[i] = value1;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn outBuffer;\n\t\t}\n\t}\n\n\t/**\n\t * Quaternion Linear interpolation of keyframe values.\n\t * @extends KeyframeInterpolant\n\t */\n\tclass QuaternionLinearInterpolant extends KeyframeInterpolant {\n\t\tstatic interpolate(index0, ratio, duration, outBuffer) {\n\t\t\tconst values = this.values,\n\t\t\t\tvalueSize = this.valueSize;\n\t\t\tQuaternion.slerpFlat(outBuffer, 0, values, index0 * valueSize, values, (index0 + 1) * valueSize, ratio);\n\t\t\treturn outBuffer;\n\t\t}\n\t}\n\n\t/**\n\t * Cubic spline interpolation of keyframe values.\n\t * @extends KeyframeInterpolant\n\t */\n\tclass CubicSplineInterpolant extends KeyframeInterpolant {\n\t\tstatic getValueSize() {\n\t\t\treturn this.values.length / this.times.length / 3;\n\t\t}\n\t\tstatic interpolate(index0, ratio, duration, outBuffer) {\n\t\t\tconst values = this.values,\n\t\t\t\tvalueSize = this.valueSize,\n\t\t\t\tvalueSize2 = valueSize * 2,\n\t\t\t\tvalueSize3 = valueSize * 3,\n\t\t\t\trr = ratio * ratio,\n\t\t\t\trrr = rr * ratio,\n\t\t\t\toffset0 = index0 * valueSize3,\n\t\t\t\toffset1 = offset0 + valueSize3,\n\t\t\t\ts2 = -2 * rrr + 3 * rr,\n\t\t\t\ts3 = rrr - rr,\n\t\t\t\ts0 = 1 - s2,\n\t\t\t\ts1 = s3 - rr + ratio;\n\n\t\t\t// Layout of keyframe output values for CUBICSPLINE animations:\n\t\t\t//\t [ inTangent_1, splineVertex_1, outTangent_1, inTangent_2, splineVertex_2, ... ]\n\t\t\tfor (let i = 0; i < valueSize; i++) {\n\t\t\t\tconst p0 = values[offset0 + i + valueSize],\n\t\t\t\t\t// splineVertex_k\n\t\t\t\t\tm0 = values[offset0 + i + valueSize2] * duration,\n\t\t\t\t\t// outTangent_k * (t_k+1 - t_k)\n\t\t\t\t\tp1 = values[offset1 + i + valueSize],\n\t\t\t\t\t// splineVertex_k+1\n\t\t\t\t\tm1 = values[offset1 + i] * duration; // inTangent_k+1 * (t_k+1 - t_k)\n\n\t\t\t\toutBuffer[i] = s0 * p0 + s1 * m0 + s2 * p1 + s3 * m1;\n\t\t\t}\n\t\t\treturn outBuffer;\n\t\t}\n\t\tstatic copyValue(index, outBuffer) {\n\t\t\tconst values = this.values,\n\t\t\t\tvalueSize = this.valueSize,\n\t\t\t\toffset = valueSize * index * 3 + valueSize;\n\t\t\tfor (let i = 0; i < valueSize; i++) {\n\t\t\t\toutBuffer[i] = values[offset + i];\n\t\t\t}\n\t\t\treturn outBuffer;\n\t\t}\n\t}\n\n\t/**\n\t * Quaternion Cubic spline interpolation of keyframe values.\n\t * @extends CubicSplineInterpolant\n\t */\n\tclass QuaternionCubicSplineInterpolant extends CubicSplineInterpolant {\n\t\tstatic interpolate(index0, ratio, duration, outBuffer) {\n\t\t\tconst result = super.interpolate(index0, ratio, duration, outBuffer);\n\t\t\t_q.fromArray(result).normalize().toArray(result);\n\t\t\treturn result;\n\t\t}\n\t}\n\tconst _q = new Quaternion();\n\n\t/**\n\t * Base class for property track.\n\t * @abstract\n\t */\n\tclass KeyframeTrack {\n\t\t/**\n\t\t * @param {Object3D|Material} target\n\t\t * @param {string} propertyPath\n\t\t * @param {Array} times\n\t\t * @param {Array} values\n\t\t * @param {KeyframeInterpolant.constructor} [interpolant=LinearInterpolant]\n\t\t */\n\t\tconstructor(target, propertyPath, times, values, interpolant = LinearInterpolant) {\n\t\t\tthis.target = target;\n\t\t\tthis.propertyPath = propertyPath;\n\t\t\tthis.name = this.target.uuid + '.' + propertyPath;\n\t\t\tthis.times = times;\n\t\t\tthis.values = values;\n\t\t\tthis.valueSize = 0;\n\t\t\tthis.interpolant = null;\n\n\t\t\t// since 0.2.2, remove this after few versions later\n\t\t\tif (interpolant === true) {\n\t\t\t\tinterpolant = LinearInterpolant;\n\t\t\t} else if (interpolant === false) {\n\t\t\t\tinterpolant = StepInterpolant;\n\t\t\t}\n\t\t\tthis.setInterpolant(interpolant);\n\t\t}\n\n\t\t/**\n\t\t * Set interpolant for this keyframe track.\n\t\t * @param {KeyframeInterpolant.constructor} interpolant\n\t\t * @returns {KeyframeTrack}\n\t\t */\n\t\tsetInterpolant(interpolant) {\n\t\t\tthis.valueSize = interpolant.getValueSize.call(this);\n\t\t\tthis.interpolant = interpolant;\n\t\t\treturn this;\n\t\t}\n\n\t\t/**\n\t\t * Get value at time.\n\t\t * The value will be interpolated by interpolant if time is between keyframes.\n\t\t * @param {number} t - time\n\t\t * @param {Array} outBuffer - output buffer\n\t\t * @returns {Array} output buffer\n\t\t */\n\t\tgetValue(t, outBuffer) {\n\t\t\tconst interpolant = this.interpolant,\n\t\t\t\ttimes = this.times,\n\t\t\t\ttl = times.length;\n\t\t\tif (t <= times[0]) {\n\t\t\t\treturn interpolant.copyValue.call(this, 0, outBuffer);\n\t\t\t} else if (t >= times[tl - 1]) {\n\t\t\t\treturn interpolant.copyValue.call(this, tl - 1, outBuffer);\n\t\t\t}\n\n\t\t\t// TODO use index cache for better performance\n\t\t\t// https://github.com/mrdoob/three.js/blob/dev/src/math/Interpolant.js\n\t\t\tlet i0 = tl - 1;\n\t\t\twhile (t < times[i0] && i0 > 0) {\n\t\t\t\ti0--;\n\t\t\t}\n\t\t\tconst duration = times[i0 + 1] - times[i0];\n\t\t\tconst ratio = (t - times[i0]) / duration;\n\t\t\treturn interpolant.interpolate.call(this, i0, ratio, duration, outBuffer);\n\t\t}\n\t}\n\n\t/**\n\t * Used for boolean property track.\n\t * @extends KeyframeTrack\n\t */\n\tclass BooleanKeyframeTrack extends KeyframeTrack {\n\t\t/**\n\t\t * @param {Object3D} target\n\t\t * @param {string} propertyPath\n\t\t * @param {Array} times\n\t\t * @param {Array} values\n\t\t * @param {KeyframeInterpolant.constructor} [interpolant=StepInterpolant]\n\t\t */\n\t\tconstructor(target, propertyPath, times, values, interpolant = StepInterpolant) {\n\t\t\t// since 0.2.2, remove this after few versions later\n\t\t\tif (interpolant === true) {\n\t\t\t\tinterpolant = StepInterpolant;\n\t\t\t}\n\t\t\tsuper(target, propertyPath, times, values, interpolant);\n\t\t}\n\t}\n\n\t/**\n\t * @readonly\n\t * @type {string}\n\t * @default 'bool'\n\t */\n\tBooleanKeyframeTrack.prototype.valueTypeName = 'bool';\n\n\t/**\n\t * Used for color property track.\n\t * @extends KeyframeTrack\n\t */\n\tclass ColorKeyframeTrack extends KeyframeTrack {\n\t\t/**\n\t\t * @param {Object3D} target\n\t\t * @param {string} propertyPath\n\t\t * @param {Array} times\n\t\t * @param {Array} values\n\t\t * @param {KeyframeInterpolant.constructor} [interpolant=LinearInterpolant]\n\t\t */\n\t\tconstructor(target, propertyPath, times, values, interpolant) {\n\t\t\tsuper(target, propertyPath, times, values, interpolant);\n\t\t}\n\t}\n\n\t/**\n\t * @readonly\n\t * @type {string}\n\t * @default 'color'\n\t */\n\tColorKeyframeTrack.prototype.valueTypeName = 'color';\n\n\t/**\n\t * Used for number property track.\n\t * @extends KeyframeTrack\n\t */\n\tclass NumberKeyframeTrack extends KeyframeTrack {\n\t\t/**\n\t\t * @param {Object3D} target\n\t\t * @param {string} propertyPath\n\t\t * @param {Array} times\n\t\t * @param {Array} values\n\t\t * @param {KeyframeInterpolant.constructor} [interpolant=LinearInterpolant]\n\t\t */\n\t\tconstructor(target, propertyPath, times, values, interpolant) {\n\t\t\tsuper(target, propertyPath, times, values, interpolant);\n\t\t}\n\t}\n\n\t/**\n\t * @readonly\n\t * @type {string}\n\t * @default 'number'\n\t */\n\tNumberKeyframeTrack.prototype.valueTypeName = 'number';\n\n\t/**\n\t * Used for quaternion property track.\n\t * @extends KeyframeTrack\n\t */\n\tclass QuaternionKeyframeTrack extends KeyframeTrack {\n\t\t/**\n\t\t * @param {Object3D} target\n\t\t * @param {string} propertyPath\n\t\t * @param {Array} times\n\t\t * @param {Array} values\n\t\t * @param {KeyframeInterpolant.constructor} [interpolant=QuaternionLinearInterpolant]\n\t\t */\n\t\tconstructor(target, propertyPath, times, values, interpolant = QuaternionLinearInterpolant) {\n\t\t\t// since 0.2.2, remove this after few versions later\n\t\t\tif (interpolant === true) {\n\t\t\t\tinterpolant = QuaternionLinearInterpolant;\n\t\t\t}\n\t\t\tsuper(target, propertyPath, times, values, interpolant);\n\t\t}\n\t}\n\n\t/**\n\t * @readonly\n\t * @type {string}\n\t * @default 'quaternion'\n\t */\n\tQuaternionKeyframeTrack.prototype.valueTypeName = 'quaternion';\n\n\t/**\n\t * Used for string property track.\n\t * @extends KeyframeTrack\n\t */\n\tclass StringKeyframeTrack extends KeyframeTrack {\n\t\t/**\n\t\t * @param {Object3D} target\n\t\t * @param {string} propertyPath\n\t\t * @param {Array} times\n\t\t * @param {Array} values\n\t\t * @param {KeyframeInterpolant.constructor} [interpolant=StepInterpolant]\n\t\t */\n\t\tconstructor(target, propertyPath, times, values, interpolant = StepInterpolant) {\n\t\t\t// since 0.2.2, remove this after few versions later\n\t\t\tif (interpolant === true) {\n\t\t\t\tinterpolant = StepInterpolant;\n\t\t\t}\n\t\t\tsuper(target, propertyPath, times, values, interpolant);\n\t\t}\n\t}\n\n\t/**\n\t * @readonly\n\t * @type {string}\n\t * @default 'string'\n\t */\n\tStringKeyframeTrack.prototype.valueTypeName = 'string';\n\n\t/**\n\t * Used for vector property track.\n\t * @extends KeyframeTrack\n\t */\n\tclass VectorKeyframeTrack extends KeyframeTrack {\n\t\t/**\n\t\t * @param {Object3D} target\n\t\t * @param {string} propertyPath\n\t\t * @param {Array} times\n\t\t * @param {Array} values\n\t\t * @param {KeyframeInterpolant.constructor} [interpolant=LinearInterpolant]\n\t\t */\n\t\tconstructor(target, propertyPath, times, values, interpolant) {\n\t\t\tsuper(target, propertyPath, times, values, interpolant);\n\t\t}\n\t}\n\n\t/**\n\t * @readonly\n\t * @type {string}\n\t * @default 'vector'\n\t */\n\tVectorKeyframeTrack.prototype.valueTypeName = 'vector';\n\n\t/**\n\t * Enum for material Type.\n\t * @readonly\n\t * @enum {string}\n\t */\n\tconst MATERIAL_TYPE = {\n\t\tBASIC: 'basic',\n\t\tLAMBERT: 'lambert',\n\t\tPHONG: 'phong',\n\t\tPBR: 'pbr',\n\t\tPBR2: 'pbr2',\n\t\tPOINT: 'point',\n\t\tLINE: 'line',\n\t\tSHADER: 'shader',\n\t\tDEPTH: 'depth',\n\t\tDISTANCE: 'distance'\n\t};\n\n\t/**\n\t * Enum for blend Type.\n\t * @readonly\n\t * @enum {string}\n\t */\n\tconst BLEND_TYPE = {\n\t\tNONE: 'none',\n\t\tNORMAL: 'normal',\n\t\tADD: 'add',\n\t\tSUB: 'sub',\n\t\tMUL: 'mul',\n\t\tCUSTOM: 'custom'\n\t};\n\n\t/**\n\t * Enum for blend equation.\n\t * @readonly\n\t * @enum {number}\n\t */\n\tconst BLEND_EQUATION = {\n\t\tADD: 100,\n\t\tSUBTRACT: 101,\n\t\tREVERSE_SUBTRACT: 102,\n\t\t/** Only webgl2 */\n\t\tMIN: 103,\n\t\tMAX: 104\n\t};\n\n\t/**\n\t * Enum for blend factor.\n\t * @readonly\n\t * @enum {number}\n\t */\n\tconst BLEND_FACTOR = {\n\t\tZERO: 200,\n\t\tONE: 201,\n\t\tSRC_COLOR: 202,\n\t\tSRC_ALPHA: 203,\n\t\tSRC_ALPHA_SATURATE: 204,\n\t\tDST_COLOR: 205,\n\t\tDST_ALPHA: 206,\n\t\tONE_MINUS_SRC_COLOR: 207,\n\t\tONE_MINUS_SRC_ALPHA: 208,\n\t\tONE_MINUS_DST_COLOR: 209,\n\t\tONE_MINUS_DST_ALPHA: 210\n\t};\n\n\t/**\n\t * Enum for cull face Type.\n\t * @readonly\n\t * @enum {string}\n\t */\n\tconst CULL_FACE_TYPE = {\n\t\tNONE: 'none',\n\t\tFRONT: 'front',\n\t\tBACK: 'back',\n\t\tFRONT_AND_BACK: 'front_and_back'\n\t};\n\n\t/**\n\t * Enum for draw side.\n\t * @readonly\n\t * @enum {string}\n\t */\n\tconst DRAW_SIDE = {\n\t\tFRONT: 'front',\n\t\tBACK: 'back',\n\t\tDOUBLE: 'double'\n\t};\n\n\t/**\n\t * Enum for shading side.\n\t * @readonly\n\t * @enum {string}\n\t */\n\tconst SHADING_TYPE = {\n\t\tSMOOTH_SHADING: 'smooth_shading',\n\t\tFLAT_SHADING: 'flat_shading'\n\t};\n\n\t/**\n\t * Enum for pixel format.\n\t * @readonly\n\t * @enum {number}\n\t */\n\tconst PIXEL_FORMAT = {\n\t\tDEPTH_COMPONENT: 1000,\n\t\tDEPTH_STENCIL: 1001,\n\t\tSTENCIL_INDEX8: 1002,\n\t\tALPHA: 1003,\n\t\tRED: 1004,\n\t\tRGB: 1005,\n\t\tRGBA: 1006,\n\t\tLUMINANCE: 1007,\n\t\tLUMINANCE_ALPHA: 1008,\n\t\t/** Only webgl2 */\n\t\tRED_INTEGER: 1010,\n\t\tRG: 1011,\n\t\tRG_INTEGER: 1012,\n\t\tRGB_INTEGER: 1013,\n\t\tRGBA_INTEGER: 1014,\n\t\t/** Only internal formats and webgl2 */\n\t\tR32F: 1100,\n\t\tR16F: 1101,\n\t\tR8: 1102,\n\t\tRG32F: 1103,\n\t\tRG16F: 1104,\n\t\tRG8: 1105,\n\t\tRGB32F: 1106,\n\t\tRGB16F: 1107,\n\t\tRGB8: 1108,\n\t\tRGBA32F: 1109,\n\t\tRGBA16F: 1110,\n\t\tRGBA8: 1111,\n\t\tRGBA4: 1112,\n\t\tRGB5_A1: 1113,\n\t\tDEPTH_COMPONENT32F: 1114,\n\t\tDEPTH_COMPONENT24: 1115,\n\t\tDEPTH_COMPONENT16: 1116,\n\t\tDEPTH24_STENCIL8: 1117,\n\t\tDEPTH32F_STENCIL8: 1118,\n\t\tR11F_G11F_B10F: 1119,\n\t\t/** For compressed texture formats */\n\t\tRGB_S3TC_DXT1: 1200,\n\t\tRGBA_S3TC_DXT1: 1201,\n\t\tRGBA_S3TC_DXT3: 1202,\n\t\tRGBA_S3TC_DXT5: 1203,\n\t\tRGB_PVRTC_4BPPV1: 1204,\n\t\tRGB_PVRTC_2BPPV1: 1205,\n\t\tRGBA_PVRTC_4BPPV1: 1206,\n\t\tRGBA_PVRTC_2BPPV1: 1207,\n\t\tRGB_ETC1: 1208,\n\t\tRGBA_ASTC_4x4: 1209,\n\t\tRGBA_BPTC: 1210,\n\t\tRGB_BPTC_SIGNED_FORMAT: 1211,\n\t\tRGB_BPTC_UNSIGNED_FORMAT: 1212\n\t};\n\n\t/**\n\t * Enum for pixel Type.\n\t * @readonly\n\t * @enum {number}\n\t */\n\tconst PIXEL_TYPE = {\n\t\tUNSIGNED_BYTE: 1500,\n\t\tUNSIGNED_SHORT_5_6_5: 1501,\n\t\tUNSIGNED_SHORT_4_4_4_4: 1502,\n\t\tUNSIGNED_SHORT_5_5_5_1: 1503,\n\t\tUNSIGNED_SHORT: 1504,\n\t\tUNSIGNED_INT: 1505,\n\t\tUNSIGNED_INT_24_8: 1506,\n\t\tFLOAT: 1507,\n\t\tHALF_FLOAT: 1508,\n\t\tFLOAT_32_UNSIGNED_INT_24_8_REV: 1509,\n\t\tBYTE: 1510,\n\t\tSHORT: 1511,\n\t\tINT: 1512\n\t};\n\n\t/**\n\t * Enum for texture filter.\n\t * @readonly\n\t * @enum {number}\n\t */\n\tconst TEXTURE_FILTER = {\n\t\tNEAREST: 1600,\n\t\tLINEAR: 1601,\n\t\tNEAREST_MIPMAP_NEAREST: 1602,\n\t\tLINEAR_MIPMAP_NEAREST: 1603,\n\t\tNEAREST_MIPMAP_LINEAR: 1604,\n\t\tLINEAR_MIPMAP_LINEAR: 1605\n\t};\n\n\t/**\n\t * Enum for texture wrap.\n\t * @readonly\n\t * @enum {number}\n\t */\n\tconst TEXTURE_WRAP = {\n\t\tREPEAT: 1700,\n\t\tCLAMP_TO_EDGE: 1701,\n\t\tMIRRORED_REPEAT: 1702\n\t};\n\n\t/**\n\t * Enum for compare function.\n\t * @readonly\n\t * @enum {number}\n\t */\n\tconst COMPARE_FUNC = {\n\t\tLEQUAL: 0x0203,\n\t\tGEQUAL: 0x0206,\n\t\tLESS: 0x0201,\n\t\tGREATER: 0x0204,\n\t\tEQUAL: 0x0202,\n\t\tNOTEQUAL: 0x0205,\n\t\tALWAYS: 0x0207,\n\t\tNEVER: 0x0200\n\t};\n\n\t/**\n\t * Enum for operation.\n\t * @readonly\n\t * @enum {number}\n\t */\n\tconst OPERATION = {\n\t\tKEEP: 0x1E00,\n\t\tREPLACE: 0x1E01,\n\t\tINCR: 0x1E02,\n\t\tDECR: 0x1E03,\n\t\tINVERT: 0x150A,\n\t\tINCR_WRAP: 0x8507,\n\t\tDECR_WRAP: 0x8508\n\t};\n\n\t/**\n\t * Enum for Shadow Type.\n\t * @readonly\n\t * @enum {string}\n\t */\n\tconst SHADOW_TYPE = {\n\t\tHARD: 'hard',\n\t\tPOISSON_SOFT: 'poisson_soft',\n\t\tVOGEL5_SOFT: 'vogel5_soft',\n\t\tPCF3_SOFT: 'pcf3_soft',\n\t\tPCF5_SOFT: 'pcf5_soft',\n\t\t/** Only webgl2 */\n\t\tPCSS16_SOFT: 'pcss16_soft',\n\t\tPCSS32_SOFT: 'pcss32_soft',\n\t\tPCSS64_SOFT: 'pcss64_soft'\n\t};\n\n\t/**\n\t * Enum for Texel Encoding Type.\n\t * @readonly\n\t * @enum {string}\n\t */\n\tconst TEXEL_ENCODING_TYPE = {\n\t\tLINEAR: 'linear',\n\t\tSRGB: 'sRGB',\n\t\tGAMMA: 'Gamma'\n\t};\n\n\t/**\n\t * Enum for Envmap Combine Type.\n\t * @readonly\n\t * @enum {string}\n\t */\n\tconst ENVMAP_COMBINE_TYPE = {\n\t\tMULTIPLY: 'ENVMAP_BLENDING_MULTIPLY',\n\t\tMIX: 'ENVMAP_BLENDING_MIX',\n\t\tADD: 'ENVMAP_BLENDING_ADD'\n\t};\n\n\t/**\n\t * Enum for Draw Mode.\n\t * @readonly\n\t * @enum {number}\n\t */\n\tconst DRAW_MODE = {\n\t\tPOINTS: 0,\n\t\tLINES: 1,\n\t\tLINE_LOOP: 2,\n\t\tLINE_STRIP: 3,\n\t\tTRIANGLES: 4,\n\t\tTRIANGLE_STRIP: 5,\n\t\tTRIANGLE_FAN: 6\n\t};\n\n\t/**\n\t * Enum for Vertex Color.\n\t * @readonly\n\t * @enum {number}\n\t */\n\tconst VERTEX_COLOR = {\n\t\tNONE: 0,\n\t\tRGB: 1,\n\t\tRGBA: 2\n\t};\n\n\t/**\n\t * Enum for ATTACHMENT\n\t * @readonly\n\t * @enum {number}\n\t */\n\tconst ATTACHMENT = {\n\t\tCOLOR_ATTACHMENT0: 2000,\n\t\tCOLOR_ATTACHMENT1: 2001,\n\t\tCOLOR_ATTACHMENT2: 2002,\n\t\tCOLOR_ATTACHMENT3: 2003,\n\t\tCOLOR_ATTACHMENT4: 2004,\n\t\tCOLOR_ATTACHMENT5: 2005,\n\t\tCOLOR_ATTACHMENT6: 2006,\n\t\tCOLOR_ATTACHMENT7: 2007,\n\t\tCOLOR_ATTACHMENT8: 2008,\n\t\tCOLOR_ATTACHMENT9: 2009,\n\t\tCOLOR_ATTACHMENT10: 2010,\n\t\tCOLOR_ATTACHMENT11: 2011,\n\t\tCOLOR_ATTACHMENT12: 2012,\n\t\tCOLOR_ATTACHMENT13: 2013,\n\t\tCOLOR_ATTACHMENT14: 2014,\n\t\tCOLOR_ATTACHMENT15: 2015,\n\t\tDEPTH_ATTACHMENT: 2020,\n\t\tSTENCIL_ATTACHMENT: 2021,\n\t\tDEPTH_STENCIL_ATTACHMENT: 2030\n\t};\n\n\t/**\n\t * Enum for BUFFER_USAGE\n\t * @readonly\n\t * @enum {number}\n\t */\n\tconst BUFFER_USAGE = {\n\t\tSTREAM_DRAW: 35040,\n\t\tSTREAM_READ: 35041,\n\t\tSTREAM_COPY: 35042,\n\t\tSTATIC_DRAW: 35044,\n\t\tSTATIC_READ: 35045,\n\t\tSTATIC_COPY: 35046,\n\t\tDYNAMIC_DRAW: 35048,\n\t\tDYNAMIC_READ: 35049,\n\t\tDYNAMIC_COPY: 35050\n\t};\n\n\t/**\n\t * Enum for QUERYSET_TYPE\n\t * @readonly\n\t * @enum {number}\n\t */\n\tconst QUERYSET_TYPE = {\n\t\tOCCLUSION: 8000,\n\t\tTIMESTAMP: 8001\n\t};\n\n\t/**\n\t * JavaScript events for custom objects.\n\t */\n\tclass EventDispatcher {\n\t\t/**\n\t\t * Adds a listener to an event type.\n\t\t * @param {string} type - The type of event to listen to.\n\t\t * @param {Function} listener - The function that gets called when the event is fired.\n\t\t */\n\t\taddEventListener(type, listener) {\n\t\t\tif (this._listeners === undefined) this._listeners = {};\n\t\t\tconst listeners = this._listeners;\n\t\t\tif (listeners[type] === undefined) {\n\t\t\t\tlisteners[type] = [];\n\t\t\t}\n\t\t\tif (listeners[type].indexOf(listener) === -1) {\n\t\t\t\tlisteners[type].push(listener);\n\t\t\t}\n\t\t}\n\n\t\t/**\n\t\t * Removes a listener from an event type.\n\t\t * @param {string} type - The type of the listener that gets removed.\n\t\t * @param {Function} listener - The listener function that gets removed.\n\t\t */\n\t\tremoveEventListener(type, listener) {\n\t\t\tconst listeners = this._listeners;\n\t\t\tif (listeners === undefined) return;\n\t\t\tconst listenerArray = listeners[type];\n\t\t\tif (listenerArray !== undefined) {\n\t\t\t\tconst index = listenerArray.indexOf(listener);\n\t\t\t\tif (index !== -1) {\n\t\t\t\t\tlistenerArray.splice(index, 1);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t/**\n\t\t * Fire an event.\n\t\t * @param {object} event - The event that gets fired.\n\t\t */\n\t\tdispatchEvent(event) {\n\t\t\tconst listeners = this._listeners;\n\t\t\tif (listeners === undefined) return;\n\t\t\tconst listenerArray = listeners[event.type];\n\t\t\tif (listenerArray !== undefined) {\n\t\t\t\tevent.target = this;\n\n\t\t\t\t// Make a copy, in case listeners are removed while iterating.\n\t\t\t\tconst array = listenerArray.slice(0);\n\t\t\t\tfor (let i = 0, l = array.length; i < l; i++) {\n\t\t\t\t\tarray[i].call(this, event);\n\t\t\t\t}\n\t\t\t\tevent.target = null;\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * AnimationAction wraps AnimationClip and is mainly responsible for the update logic of time.\n\t * You can extend other functions by inheriting this class, such as repeat playback, pingpang, etc.\n\t * And since this class inherits from EventDispatcher, animation events can also be extended.\n\t * @extends EventDispatcher\n\t */\n\tclass AnimationAction extends EventDispatcher {\n\t\t/**\n\t\t * @param {KeyframeClip} clip - The keyframe clip for this action.\n\t\t */\n\t\tconstructor(clip) {\n\t\t\tsuper();\n\n\t\t\t/**\n\t\t\t * The keyframe clip for this action.\n\t\t\t * @type {KeyframeClip}\n\t\t\t */\n\t\t\tthis.clip = clip;\n\n\t\t\t/**\n\t\t\t * The degree of influence of this action (in the interval [0, 1]).\n\t\t\t * Values can be used to blend between several actions.\n\t\t\t * @type {number}\n\t\t\t * @default 0\n\t\t\t */\n\t\t\tthis.weight = 0;\n\n\t\t\t/**\n\t\t\t * The local time of this action (in seconds).\n\t\t\t * @type {number}\n\t\t\t */\n\t\t\tthis.time = 0;\n\n\t\t\t/**\n\t\t\t * The blend mode for this action, currently only two values BLEND_TYPE.NORMAL and BLEND_TYPE.ADD are available.\n\t\t\t * @type {BLEND_TYPE}\n\t\t\t * @default {BLEND_TYPE.NORMAL}\n\t\t\t */\n\t\t\tthis.blendMode = BLEND_TYPE.NORMAL;\n\t\t}\n\n\t\t/**\n\t\t * Update time.\n\t\t * @param {number} deltaTime - The delta time in seconds.\n\t\t */\n\t\tupdate(deltaTime) {\n\t\t\tthis.time += deltaTime;\n\t\t\tconst endTime = this.clip.duration;\n\t\t\tif (endTime === 0) {\n\t\t\t\tthis.time = 0;\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (this.time > endTime) {\n\t\t\t\tthis.time = this.time % endTime;\n\t\t\t}\n\t\t\tif (this.time < 0) {\n\t\t\t\tthis.time = this.time % endTime + endTime;\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * This holds a reference to a real property in the scene graph; used internally.\n\t * Binding property and value, mixer for multiple values.\n\t */\n\tclass PropertyBindingMixer {\n\t\t/**\n\t\t * @param {Object3D|Material} target\n\t\t * @param {string} propertyPath\n\t\t * @param {string} typeName - vector/bool/string/quaternion/number/color\n\t\t * @param {number} valueSize\n\t\t */\n\t\tconstructor(target, propertyPath, typeName, valueSize) {\n\t\t\tthis.target = null;\n\t\t\tthis.property = '';\n\t\t\tthis.parseBinding(target, propertyPath);\n\t\t\tthis.valueSize = valueSize;\n\t\t\tlet BufferType = Float64Array;\n\t\t\tlet mixFunction, mixFunctionAdditive, setIdentity;\n\t\t\tswitch (typeName) {\n\t\t\t\tcase 'quaternion':\n\t\t\t\t\tmixFunction = slerp;\n\t\t\t\t\tmixFunctionAdditive = slerpAdditive;\n\t\t\t\t\tsetIdentity = setIdentityQuaternion;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'string':\n\t\t\t\tcase 'bool':\n\t\t\t\t\tBufferType = Array;\n\t\t\t\t\tmixFunction = select;\n\t\t\t\t\tmixFunctionAdditive = select;\n\t\t\t\t\tsetIdentity = setIdentityOther;\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tmixFunction = lerp;\n\t\t\t\t\tmixFunctionAdditive = lerpAdditive;\n\t\t\t\t\tsetIdentity = setIdentityNumeric;\n\t\t\t}\n\n\t\t\t// [ incoming | accu | orig | addAccu ]\n\t\t\tthis.buffer = new BufferType(valueSize * 4);\n\t\t\tthis._mixBufferFunction = mixFunction;\n\t\t\tthis._mixBufferFunctionAdditive = mixFunctionAdditive;\n\t\t\tthis._setIdentity = setIdentity;\n\t\t\tthis.cumulativeWeight = 0;\n\t\t\tthis.cumulativeWeightAdditive = 0;\n\n\t\t\t// cache whether the bound property should be treated as an array-like value\n\t\t\t// (treat existing arrays or types with toArray/fromArray as array bindings,\n\t\t\t//\tor when valueSize > 1)\n\t\t\tconst boundValue = this.target && this.target[this.property];\n\t\t\tthis._isArrayProperty = this.valueSize > 1 || Array.isArray(boundValue) || boundValue && (typeof boundValue.toArray === 'function' || typeof boundValue.fromArray === 'function');\n\t\t}\n\t\tparseBinding(target, propertyPath) {\n\t\t\tpropertyPath = propertyPath.split('.');\n\t\t\tif (propertyPath.length > 1) {\n\t\t\t\tlet property = target[propertyPath[0]];\n\t\t\t\tfor (let index = 1; index < propertyPath.length - 1; index++) {\n\t\t\t\t\tproperty = property[propertyPath[index]];\n\t\t\t\t}\n\t\t\t\tthis.property = propertyPath[propertyPath.length - 1];\n\t\t\t\tthis.target = property;\n\t\t\t} else {\n\t\t\t\tthis.property = propertyPath[0];\n\t\t\t\tthis.target = target;\n\t\t\t}\n\t\t}\n\n\t\t/**\n\t\t * Remember the state of the bound property and copy it to both accus.\n\t\t */\n\t\tsaveOriginalState() {\n\t\t\tconst buffer = this.buffer,\n\t\t\t\tstride = this.valueSize,\n\t\t\t\toriginalValueOffset = stride * 2;\n\n\t\t\t// get value\n\t\t\tif (this._isArrayProperty) {\n\t\t\t\tif (this.target[this.property].toArray) {\n\t\t\t\t\tthis.target[this.property].toArray(buffer, originalValueOffset);\n\t\t\t\t} else {\n\t\t\t\t\tsetArray(buffer, this.target[this.property], originalValueOffset, stride);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tthis.target[this.property] = buffer[originalValueOffset];\n\t\t\t}\n\n\t\t\t// accu[0..1] := orig -- initially detect changes against the original\n\t\t\tfor (let i = stride, e = originalValueOffset; i !== e; ++i) {\n\t\t\t\tbuffer[i] = buffer[originalValueOffset + i % stride];\n\t\t\t}\n\n\t\t\t// Add to identify for additive\n\t\t\tthis._setIdentity(buffer, stride * 3, stride, originalValueOffset);\n\t\t\tthis.cumulativeWeight = 0;\n\t\t\tthis.cumulativeWeightAdditive = 0;\n\t\t}\n\n\t\t/**\n\t\t * Apply the state previously taken via 'saveOriginalState' to the binding.\n\t\t */\n\t\trestoreOriginalState() {\n\t\t\tconst buffer = this.buffer,\n\t\t\t\tstride = this.valueSize,\n\t\t\t\toriginalValueOffset = stride * 2;\n\n\t\t\t// accu[0..1] := orig -- initially detect changes against the original\n\t\t\tfor (let i = stride, e = originalValueOffset; i !== e; ++i) {\n\t\t\t\tbuffer[i] = buffer[originalValueOffset + i % stride];\n\t\t\t}\n\t\t\tthis.apply();\n\t\t}\n\n\t\t/**\n\t\t * Accumulate value.\n\t\t * @param {number} weight\n\t\t */\n\t\taccumulate(weight) {\n\t\t\tconst buffer = this.buffer,\n\t\t\t\tstride = this.valueSize,\n\t\t\t\toffset = stride;\n\t\t\tlet currentWeight = this.cumulativeWeight;\n\t\t\tif (currentWeight === 0) {\n\t\t\t\tfor (let i = 0; i !== stride; ++i) {\n\t\t\t\t\tbuffer[offset + i] = buffer[i];\n\t\t\t\t}\n\t\t\t\tcurrentWeight = weight;\n\t\t\t} else {\n\t\t\t\tcurrentWeight += weight;\n\t\t\t\tconst mix = weight / currentWeight;\n\t\t\t\tthis._mixBufferFunction(buffer, offset, 0, mix, stride);\n\t\t\t}\n\t\t\tthis.cumulativeWeight = currentWeight;\n\t\t}\n\n\t\t/**\n\t\t * Additive Accumulate value.\n\t\t * @param {number} weight\n\t\t */\n\t\taccumulateAdditive(weight) {\n\t\t\tconst buffer = this.buffer,\n\t\t\t\tstride = this.valueSize,\n\t\t\t\toffset = stride * 3;\n\t\t\tif (this.cumulativeWeightAdditive === 0) {\n\t\t\t\tthis._setIdentity(buffer, offset, stride, stride * 2);\n\t\t\t}\n\t\t\tthis._mixBufferFunctionAdditive(buffer, offset, 0, weight, stride);\n\t\t\tthis.cumulativeWeightAdditive += weight;\n\t\t}\n\n\t\t/**\n\t\t * Apply to scene graph.\n\t\t */\n\t\tapply() {\n\t\t\tconst buffer = this.buffer,\n\t\t\t\tstride = this.valueSize,\n\t\t\t\tweight = this.cumulativeWeight,\n\t\t\t\tweightAdditive = this.cumulativeWeightAdditive;\n\t\t\tthis.cumulativeWeight = 0;\n\t\t\tthis.cumulativeWeightAdditive = 0;\n\t\t\tif (weight < 1) {\n\t\t\t\t// accuN := accuN + original * ( 1 - cumulativeWeight )\n\t\t\t\tconst originalValueOffset = stride * 2;\n\t\t\t\tthis._mixBufferFunction(buffer, stride, originalValueOffset, 1 - weight, stride);\n\t\t\t}\n\t\t\tif (weightAdditive > 0) {\n\t\t\t\t// accuN := accuN + additive accuN\n\t\t\t\tthis._mixBufferFunctionAdditive(buffer, stride, 3 * stride, 1, stride);\n\t\t\t}\n\n\t\t\t// set value\n\t\t\tif (this._isArrayProperty) {\n\t\t\t\tif (this.target[this.property].fromArray) {\n\t\t\t\t\tthis.target[this.property].fromArray(buffer, stride);\n\t\t\t\t} else {\n\t\t\t\t\tgetArray(this.target[this.property], buffer, stride, stride);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tthis.target[this.property] = buffer[stride];\n\t\t\t}\n\t\t\tif (this.target.isTransformUV) {\n\t\t\t\tthis.target.needsUpdate = true;\n\t\t\t}\n\t\t}\n\t}\n\n\t// Mix functions\n\n\tfunction select(buffer, dstOffset, srcOffset, t, stride) {\n\t\tif (t >= 0.5) {\n\t\t\tfor (let i = 0; i !== stride; ++i) {\n\t\t\t\tbuffer[dstOffset + i] = buffer[srcOffset + i];\n\t\t\t}\n\t\t}\n\t}\n\tfunction slerp(buffer, dstOffset, srcOffset, t) {\n\t\tQuaternion.slerpFlat(buffer, dstOffset, buffer, dstOffset, buffer, srcOffset, t);\n\t}\n\tconst tempQuternionBuffer = new Float64Array(4);\n\tfunction slerpAdditive(buffer, dstOffset, srcOffset, t) {\n\t\t// Store result in tempQuternionBuffer\n\t\tQuaternion.multiplyQuaternionsFlat(tempQuternionBuffer, 0, buffer, dstOffset, buffer, srcOffset);\n\t\t// Slerp to the result\n\t\tQuaternion.slerpFlat(buffer, dstOffset, buffer, dstOffset, tempQuternionBuffer, 0, t);\n\t}\n\tfunction lerp(buffer, dstOffset, srcOffset, t, stride) {\n\t\tconst s = 1 - t;\n\t\tfor (let i = 0; i !== stride; ++i) {\n\t\t\tconst j = dstOffset + i;\n\t\t\tbuffer[j] = buffer[j] * s + buffer[srcOffset + i] * t;\n\t\t}\n\t}\n\tfunction lerpAdditive(buffer, dstOffset, srcOffset, t, stride) {\n\t\tfor (let i = 0; i !== stride; ++i) {\n\t\t\tconst j = dstOffset + i;\n\t\t\tbuffer[j] = buffer[j] + buffer[srcOffset + i] * t;\n\t\t}\n\t}\n\n\t// identity\n\tfunction setIdentityNumeric(buffer, offset, stride) {\n\t\tfor (let i = 0; i < stride; i++) {\n\t\t\tbuffer[offset + i] = 0;\n\t\t}\n\t}\n\tfunction setIdentityQuaternion(buffer, offset) {\n\t\tsetIdentityNumeric(buffer, offset, 3);\n\t\tbuffer[offset + 3] = 1;\n\t}\n\tfunction setIdentityOther(buffer, offset, stride, copyOffset) {\n\t\tfor (let i = 0; i < stride; i++) {\n\t\t\tbuffer[offset + i] = buffer[copyOffset + i];\n\t\t}\n\t}\n\n\t// get array\n\tfunction getArray(target, source, stride, count) {\n\t\tfor (let i = 0; i < count; i++) {\n\t\t\ttarget[i] = source[stride + i];\n\t\t}\n\t}\n\tfunction setArray(target, source, stride, count) {\n\t\tfor (let i = 0; i < count; i++) {\n\t\t\ttarget[stride + i] = source[i];\n\t\t}\n\t}\n\n\t/**\n\t * The AnimationMixer is a player for animations on a particular object in the scene.\n\t * When multiple objects in the scene are animated independently, one AnimationMixer may be used for each object.\n\t */\n\tclass AnimationMixer {\n\t\tconstructor() {\n\t\t\tthis._actions = [];\n\t\t\tthis._bindings = {};\n\t\t}\n\n\t\t/**\n\t\t * Add an action to this mixer.\n\t\t * @param {AnimationAction} action - The action to add.\n\t\t */\n\t\taddAction(action) {\n\t\t\tif (this._actions.indexOf(action) !== -1) {\n\t\t\t\tconsole.warn('AnimationMixer.addAction(): already has the action, clip name is <' + action.clip.name + '>.');\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthis._actions.push(action);\n\t\t\tconst tracks = action.clip.tracks;\n\t\t\tfor (let i = 0; i < tracks.length; i++) {\n\t\t\t\tconst track = tracks[i];\n\t\t\t\tconst trackName = track.name;\n\t\t\t\tif (!this._bindings[trackName]) {\n\t\t\t\t\tconst binding = new PropertyBindingMixer(track.target, track.propertyPath, track.valueTypeName, track.valueSize);\n\t\t\t\t\tthis._bindings[trackName] = {\n\t\t\t\t\t\tbinding,\n\t\t\t\t\t\treferenceCount: 0,\n\t\t\t\t\t\tactive: false,\n\t\t\t\t\t\tcachedActive: false\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tthis._bindings[trackName].referenceCount++;\n\t\t\t}\n\t\t}\n\n\t\t/**\n\t\t * Remove an action from this mixer.\n\t\t * @param {AnimationAction} action - The action to be removed.\n\t\t */\n\t\tremoveAction(action) {\n\t\t\tconst index = this._actions.indexOf(action);\n\t\t\tif (index === -1) {\n\t\t\t\tconsole.warn('AnimationMixer.removeAction(): action not found in this mixer, clip name is <' + action.clip.name + '>.');\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (action.weight > 0) {\n\t\t\t\tconsole.warn('AnimationMixer.removeAction(): make sure action\\'s weight is zero before removing it.');\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthis._actions.splice(index, 1);\n\t\t\tconst tracks = action.clip.tracks;\n\t\t\tfor (let i = 0; i < tracks.length; i++) {\n\t\t\t\tconst trackName = tracks[i].name;\n\t\t\t\tconst bindingInfo = this._bindings[trackName];\n\t\t\t\tif (bindingInfo) {\n\t\t\t\t\tif (--bindingInfo.referenceCount <= 0) {\n\t\t\t\t\t\tif (bindingInfo.cachedActive) {\n\t\t\t\t\t\t\tbindingInfo.binding.restoreOriginalState();\n\t\t\t\t\t\t}\n\t\t\t\t\t\tdelete this._bindings[trackName];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t/**\n\t\t * Whether has this action.\n\t\t * @param {AnimationAction} action - The action.\n\t\t * @returns {boolean}\n\t\t */\n\t\thasAction(action) {\n\t\t\treturn this._actions.indexOf(action) > -1;\n\t\t}\n\n\t\t/**\n\t\t * Get all actions.\n\t\t * @returns {AnimationAction[]}\n\t\t */\n\t\tgetActions() {\n\t\t\treturn this._actions;\n\t\t}\n\n\t\t/**\n\t\t * Advances the global mixer time and updates the animation.\n\t\t * @param {number} deltaTime - The delta time in seconds.\n\t\t */\n\t\tupdate(deltaTime) {\n\t\t\t// Mark active to false for all bindings.\n\n\t\t\tfor (const bindingName in this._bindings) {\n\t\t\t\tthis._bindings[bindingName].active = false;\n\t\t\t}\n\n\t\t\t// Update the time of actions with a weight greater than 1\n\t\t\t// And accumulate those bindings\n\n\t\t\tfor (let i = 0, l = this._actions.length; i < l; i++) {\n\t\t\t\tconst action = this._actions[i];\n\t\t\t\tif (action.weight > 0) {\n\t\t\t\t\taction.update(deltaTime);\n\t\t\t\t\tconst tracks = action.clip.tracks;\n\t\t\t\t\tfor (let j = 0, tl = tracks.length; j < tl; j++) {\n\t\t\t\t\t\tconst track = tracks[j];\n\t\t\t\t\t\tconst bindingInfo = this._bindings[track.name];\n\t\t\t\t\t\tconst binding = bindingInfo.binding;\n\t\t\t\t\t\tbindingInfo.active = true;\n\t\t\t\t\t\tif (!bindingInfo.cachedActive) {\n\t\t\t\t\t\t\tbindingInfo.binding.saveOriginalState();\n\t\t\t\t\t\t\tbindingInfo.cachedActive = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t\ttrack.getValue(action.time, binding.buffer);\n\t\t\t\t\t\tif (action.blendMode === BLEND_TYPE.ADD) {\n\t\t\t\t\t\t\tbinding.accumulateAdditive(action.weight);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tbinding.accumulate(action.weight);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Apply all bindings.\n\n\t\t\tfor (const bindingName in this._bindings) {\n\t\t\t\tconst bindingInfo = this._bindings[bindingName];\n\t\t\t\tif (bindingInfo.active) {\n\t\t\t\t\tbindingInfo.binding.apply();\n\t\t\t\t} else {\n\t\t\t\t\tif (bindingInfo.cachedActive) {\n\t\t\t\t\t\tbindingInfo.binding.restoreOriginalState();\n\t\t\t\t\t\tbindingInfo.cachedActive = false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * An KeyframeClip is a reusable set of keyframe tracks which represent an animation.\n\t */\n\tclass KeyframeClip {\n\t\t/**\n\t\t * @param {string} [name=''] - A name for this clip.\n\t\t * @param {KeyframeTrack[]} [tracks=[]] - An array of KeyframeTracks.\n\t\t * @param {number} [duration] - The duration of this clip (in seconds). If not passed, the duration will be calculated from the passed tracks array.\n\t\t */\n\t\tconstructor(name = '', tracks = [], duration = -1) {\n\t\t\t/**\n\t\t\t * A name for this clip.\n\t\t\t * @type {string}\n\t\t\t */\n\t\t\tthis.name = name;\n\n\t\t\t/**\n\t\t\t * An array of KeyframeTracks.\n\t\t\t * @type {KeyframeTrack[]}\n\t\t\t */\n\t\t\tthis.tracks = tracks;\n\n\t\t\t/**\n\t\t\t * The duration of this clip (in seconds).\n\t\t\t * If a negative value is passed, the duration will be calculated from the passed tracks array.\n\t\t\t * @type {number}\n\t\t\t */\n\t\t\tthis.duration = duration;\n\t\t\tif (this.duration < 0) {\n\t\t\t\tthis.resetDuration();\n\t\t\t}\n\t\t}\n\n\t\t/**\n\t\t * Sets the duration of the clip to the duration of its longest KeyframeTrack.\n\t\t * @returns {KeyframeClip}\n\t\t */\n\t\tresetDuration() {\n\t\t\tconst tracks = this.tracks;\n\t\t\tlet duration = 0;\n\t\t\tfor (let i = 0, l = tracks.length; i < l; i++) {\n\t\t\t\tconst track = tracks[i];\n\t\t\t\tduration = Math.max(duration, track.times[track.times.length - 1]);\n\t\t\t}\n\t\t\tthis.duration = duration;\n\t\t\treturn this;\n\t\t}\n\t}\n\n\t/**\n\t * Handles and keeps track of loaded and pending data. A default global\n\t * instance of this class is created and used by loaders if not supplied\n\t * manually.\n\t * In general that should be sufficient, however there are times when it can\n\t * be useful to have separate loaders - for example if you want to show\n\t * separate loading bars for objects and textures.\n\t * ```js\n\t * const manager = new LoadingManager(\n\t *\t () => console.log('All items loaded!'),\n\t *\t (url, itemsLoaded, itemsTotal) => {\n\t *\t\t console.log(`Loaded ${itemsLoaded} of ${itemsTotal} items`);\n\t *\t },\n\t *\t url => console.error(`Error loading ${url}`)\n\t * );\n\t * ```\n\t */\n\tclass LoadingManager {\n\t\t/**\n\t\t * Constructs a new loading manager.\n\t\t * @param {Function} [onLoad] - Executes when all items have been loaded.\n\t\t * @param {Function} [onProgress] - Executes when single items have been loaded.\n\t\t * @param {Function} [onError] - Executes when an error occurs.\n\t\t */\n\t\tconstructor(onLoad, onProgress, onError) {\n\t\t\tthis.isLoading = false;\n\t\t\tthis.itemsLoaded = 0;\n\t\t\tthis.itemsTotal = 0;\n\t\t\tthis.urlModifier = undefined;\n\n\t\t\t/**\n\t\t\t * Executes when an item starts loading.\n\t\t\t * @type {Function|undefined}\n\t\t\t * @default undefined\n\t\t\t */\n\t\t\tthis.onStart = undefined;\n\n\t\t\t/**\n\t\t\t * Executes when all items have been loaded.\n\t\t\t * @type {Function|undefined}\n\t\t\t * @default undefined\n\t\t\t */\n\t\t\tthis.onLoad = onLoad;\n\n\t\t\t/**\n\t\t\t * Executes when single items have been loaded.\n\t\t\t * @type {Function|undefined}\n\t\t\t * @default undefined\n\t\t\t */\n\t\t\tthis.onProgress = onProgress;\n\n\t\t\t/**\n\t\t\t * Executes when an error occurs.\n\t\t\t * @type {Function|undefined}\n\t\t\t * @default undefined\n\t\t\t */\n\t\t\tthis.onError = onError;\n\t\t}\n\n\t\t/**\n\t\t * This should be called by any loader using the manager when the loader\n\t\t * starts loading an item.\n\t\t * @param {string} url - The URL to load.\n\t\t */\n\t\titemStart(url) {\n\t\t\tthis.itemsTotal++;\n\t\t\tif (this.isLoading === false) {\n\t\t\t\tif (this.onStart !== undefined) {\n\t\t\t\t\tthis.onStart(url, this.itemsLoaded, this.itemsTotal);\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.isLoading = true;\n\t\t}\n\n\t\t/**\n\t\t * This should be called by any loader using the manager when the loader\n\t\t * ended loading an item.\n\t\t * @param {string} url - The URL of the loaded item.\n\t\t */\n\t\titemEnd(url) {\n\t\t\tthis.itemsLoaded++;\n\t\t\tif (this.onProgress !== undefined) {\n\t\t\t\tthis.onProgress(url, this.itemsLoaded, this.itemsTotal);\n\t\t\t}\n\t\t\tif (this.itemsLoaded === this.itemsTotal) {\n\t\t\t\tthis.isLoading = false;\n\t\t\t\tif (this.onLoad !== undefined) {\n\t\t\t\t\tthis.onLoad();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t/**\n\t\t * This should be called by any loader using the manager when the loader\n\t\t * encounters an error when loading an item.\n\t\t * @param {string} url - The URL of the item that produces an error.\n\t\t */\n\t\titemError(url) {\n\t\t\tif (this.onError !== undefined) {\n\t\t\t\tthis.onError(url);\n\t\t\t}\n\t\t}\n\n\t\t/**\n\t\t * Given a URL, uses the URL modifier callback (if any) and returns a\n\t\t * resolved URL. If no URL modifier is set, returns the original URL.\n\t\t * @param {string} url - The URL to load.\n\t\t * @returns {string} The resolved URL.\n\t\t */\n\t\tresolveURL(url) {\n\t\t\tif (this.urlModifier) {\n\t\t\t\treturn this.urlModifier(url);\n\t\t\t}\n\t\t\treturn url;\n\t\t}\n\n\t\t/**\n\t\t * If provided, the callback will be passed each resource URL before a\n\t\t * request is sent. The callback may return the original URL, or a new URL to\n\t\t * override loading behavior. This behavior can be used to load assets from\n\t\t * .ZIP files, drag-and-drop APIs, and Data URIs.\n\t\t * @param {Function} transform - URL modifier callback. Called with an URL and must return a resolved URL.\n\t\t * @returns {LoadingManager} A reference to this loading manager.\n\t\t * @example\n\t\t * const blobs = { 'fish.gltf': blob1, 'diffuse.png': blob2, 'normal.png': blob3 };\n\t\t *\n\t\t * const manager = new LoadingManager();\n\t\t *\n\t\t * // Initialize loading manager with URL callback.\n\t\t * const objectURLs = [];\n\t\t * manager.setURLModifier(url => {\n\t\t * \t url = URL.createObjectURL(blobs[url]);\n\t\t * \t objectURLs.push(url);\n\t\t * \t return url;\n\t\t * });\n\t\t *\n\t\t * // Load as usual, then revoke the blob URLs.\n\t\t * const loader = new GLTFLoader(manager);\n\t\t * loader.load('fish.gltf', gltf => {\n\t\t * \t scene.add(gltf.scene);\n\t\t * \t objectURLs.forEach(url => URL.revokeObjectURL(url));\n\t\t * });\n\t\t */\n\t\tsetURLModifier(transform) {\n\t\t\tthis.urlModifier = transform;\n\t\t\treturn this;\n\t\t}\n\t}\n\n\t/**\n\t * The global default loading manager.\n\t * @type {LoadingManager}\n\t */\n\tconst DefaultLoadingManager = new LoadingManager();\n\n\t/**\n\t * Abstract base class for loaders.\n\t * @abstract\n\t */\n\tclass Loader {\n\t\t/**\n\t\t * Constructs a new Loader.\n\t\t * @param {LoadingManager} [manager=DefaultLoadingManager] - The loading manager.\n\t\t */\n\t\tconstructor(manager) {\n\t\t\t/**\n\t\t\t * The loading manager.\n\t\t\t * @type {LoadingManager}\n\t\t\t * @default DefaultLoadingManager\n\t\t\t */\n\t\t\tthis.manager = manager !== undefined ? manager : DefaultLoadingManager;\n\n\t\t\t/**\n\t\t\t * The crossOrigin string to implement CORS for loading the url from a\n\t\t\t * different domain that allows CORS.\n\t\t\t * @type {string}\n\t\t\t * @default 'anonymous'\n\t\t\t */\n\t\t\tthis.crossOrigin = 'anonymous';\n\n\t\t\t/**\n\t\t\t * Whether the XMLHttpRequest uses credentials.\n\t\t\t * @type {boolean}\n\t\t\t * @default false\n\t\t\t */\n\t\t\tthis.withCredentials = false;\n\n\t\t\t/**\n\t\t\t * The base path from which the asset will be loaded.\n\t\t\t * @type {string}\n\t\t\t * @default ''\n\t\t\t */\n\t\t\tthis.path = '';\n\n\t\t\t/**\n\t\t\t * The [request header]{@link https://developer.mozilla.org/en-US/docs/Glossary/Request_header}\n\t\t\t * used in HTTP request.\n\t\t\t * @type {object}\n\t\t\t * @default {}\n\t\t\t */\n\t\t\tthis.requestHeader = {};\n\t\t}\n\n\t\t/**\n\t\t * This method needs to be implement by all concrete loaders.\n\t\t * It holds the logic for loading the asset from the backend.\n\t\t * @param {string} url - The path/URL of the file to be loaded.\n\t\t * @param {Function} onLoad - Executed when the loading process has been finished.\n\t\t * @param {onProgressCallback} [onProgress] - Executed while the loading is in progress.\n\t\t * @param {onErrorCallback} [onError] - Executed when errors occur.\n\t\t */\n\t\tload(url, onLoad, onProgress, onError) {}\n\n\t\t/**\n\t\t * A async version of {@link Loader#load}.\n\t\t * @param {string} url - The path/URL of the file to be loaded.\n\t\t * @param {Function} [onProgress] - Executed while the loading is in progress.\n\t\t * @returns {Promise} A Promise that resolves when the asset has been loaded.\n\t\t */\n\t\tloadAsync(url, onProgress) {\n\t\t\tconst scope = this;\n\t\t\treturn new Promise(function (resolve, reject) {\n\t\t\t\tscope.load(url, resolve, onProgress, reject);\n\t\t\t});\n\t\t}\n\n\t\t/**\n\t\t * Sets the `crossOrigin` String to implement CORS for loading the URL\n\t\t * from a different domain that allows CORS.\n\t\t * @param {string} crossOrigin - The `crossOrigin` value.\n\t\t * @returns {Loader} A reference to this instance.\n\t\t */\n\t\tsetCrossOrigin(crossOrigin) {\n\t\t\tthis.crossOrigin = crossOrigin;\n\t\t\treturn this;\n\t\t}\n\n\t\t/**\n\t\t * Whether the XMLHttpRequest uses credentials such as cookies, authorization\n\t\t * headers or TLS client certificates, see [XMLHttpRequest.withCredentials]{@link https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/withCredentials}.\n\t\t * Note: This setting has no effect if you are loading files locally or from the same domain.\n\t\t * @param {boolean} value - The `withCredentials` value.\n\t\t * @returns {Loader} A reference to this instance.\n\t\t */\n\t\tsetWithCredentials(value) {\n\t\t\tthis.withCredentials = value;\n\t\t\treturn this;\n\t\t}\n\n\t\t/**\n\t\t * Sets the base path for the asset.\n\t\t * @param {string} path - The base path.\n\t\t * @returns {Loader} A reference to this instance.\n\t\t */\n\t\tsetPath(path) {\n\t\t\tthis.path = path;\n\t\t\treturn this;\n\t\t}\n\n\t\t/**\n\t\t * Sets the given request header.\n\t\t * @param {object} requestHeader - A [request header]{@link https://developer.mozilla.org/en-US/docs/Glossary/Request_header}\n\t\t * for configuring the HTTP request.\n\t\t * @returns {Loader} A reference to this instance.\n\t\t */\n\t\tsetRequestHeader(requestHeader) {\n\t\t\tthis.requestHeader = requestHeader;\n\t\t\treturn this;\n\t\t}\n\t}\n\n\t/**\n\t * A low level class for loading resources with the Fetch API, used internally by\n\t * most loaders. It can also be used directly to load any file type that does\n\t * not have a loader.\n\t * ```js\n\t * const loader = new FileLoader();\n\t * const data = await loader.loadAsync('example.txt');\n\t * ```\n\t * @extends Loader\n\t */\n\tclass FileLoader extends Loader {\n\t\t/**\n\t\t * Constructs a new file loader.\n\t\t * @param {LoadingManager} [manager] - The loading manager.\n\t\t */\n\t\tconstructor(manager) {\n\t\t\tsuper(manager);\n\n\t\t\t/**\n\t\t\t * The expected response type. See {@link FileLoader.setResponseType}.\n\t\t\t * @type {'arraybuffer'|'blob'|'document'|'json'|''}\n\t\t\t * @default ''\n\t\t\t */\n\t\t\tthis.responseType = '';\n\n\t\t\t/**\n\t\t\t * The expected mimeType. See {@link FileLoader.setMimeType}.\n\t\t\t * @type {string}\n\t\t\t * @default ''\n\t\t\t */\n\t\t\tthis.mimeType = '';\n\t\t}\n\n\t\t/**\n\t\t * Starts loading from the given URL and pass the loaded response to the `onLoad()` callback.\n\t\t * @param {string} url — The path/URL of the file to be loaded. This can also be a data URI.\n\t\t * @param {Function} [onLoad] — Executed when the loading process has been finished. The argument is the loaded data.\n\t\t * @param {onProgressCallback} [onProgress] — Executed while the loading is in progress.\n\t\t * @param {onErrorCallback} [onError] — Executed when errors occur.\n\t\t */\n\t\tload(url, onLoad, onProgress, onError) {\n\t\t\tif (url === undefined) url = '';\n\t\t\tif (this.path != undefined) url = this.path + url;\n\t\t\turl = this.manager.resolveURL(url);\n\n\t\t\t// create request\n\t\t\tconst req = new Request(url, {\n\t\t\t\theaders: new Headers(this.requestHeader),\n\t\t\t\tcredentials: this.withCredentials ? 'include' : 'same-origin'\n\t\t\t\t// An abort controller could be added within a future PR\n\t\t\t});\n\n\t\t\t// record states ( avoid data race )\n\t\t\tconst mimeType = this.mimeType;\n\t\t\tconst responseType = this.responseType;\n\n\t\t\t// start the fetch\n\t\t\tfetch(req).then(response => {\n\t\t\t\tif (response.status === 200 || response.status === 0) {\n\t\t\t\t\t// Some browsers return HTTP Status 0 when using non-http protocol\n\t\t\t\t\t// e.g. 'file://' or 'data://'. Handle as success.\n\n\t\t\t\t\tif (response.status === 0) {\n\t\t\t\t\t\tconsole.warn('FileLoader: HTTP Status 0 received.');\n\t\t\t\t\t}\n\n\t\t\t\t\t// Workaround: Checking if response.body === undefined for Alipay browser #23548\n\n\t\t\t\t\tif (typeof ReadableStream === 'undefined' || response.body === undefined || response.body.getReader === undefined) {\n\t\t\t\t\t\treturn response;\n\t\t\t\t\t}\n\t\t\t\t\tconst reader = response.body.getReader();\n\n\t\t\t\t\t// Nginx needs X-File-Size check\n\t\t\t\t\t// https://serverfault.com/questions/482875/why-does-nginx-remove-content-length-header-for-chunked-content\n\t\t\t\t\tconst contentLength = response.headers.get('X-File-Size') || response.headers.get('Content-Length');\n\t\t\t\t\tconst total = contentLength ? parseInt(contentLength) : 0;\n\t\t\t\t\tconst lengthComputable = total !== 0;\n\t\t\t\t\tlet loaded = 0;\n\n\t\t\t\t\t// periodically read data into the new stream tracking while download progress\n\t\t\t\t\tconst stream = new ReadableStream({\n\t\t\t\t\t\tstart(controller) {\n\t\t\t\t\t\t\treadData();\n\t\t\t\t\t\t\tfunction readData() {\n\t\t\t\t\t\t\t\treader.read().then(({\n\t\t\t\t\t\t\t\t\tdone,\n\t\t\t\t\t\t\t\t\tvalue\n\t\t\t\t\t\t\t\t}) => {\n\t\t\t\t\t\t\t\t\tif (done) {\n\t\t\t\t\t\t\t\t\t\tcontroller.close();\n\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\tloaded += value.byteLength;\n\t\t\t\t\t\t\t\t\t\tconst event = new ProgressEvent('progress', {\n\t\t\t\t\t\t\t\t\t\t\tlengthComputable,\n\t\t\t\t\t\t\t\t\t\t\tloaded,\n\t\t\t\t\t\t\t\t\t\t\ttotal\n\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t\tif (onProgress) onProgress(event);\n\t\t\t\t\t\t\t\t\t\tcontroller.enqueue(value);\n\t\t\t\t\t\t\t\t\t\treadData();\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}, error => {\n\t\t\t\t\t\t\t\t\tcontroller.error(error);\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t\treturn new Response(stream);\n\t\t\t\t} else {\n\t\t\t\t\tthrow new HttpError(`fetch for \"${response.url}\" responded with ${response.status}: ${response.statusText}`, response);\n\t\t\t\t}\n\t\t\t}).then(response => {\n\t\t\t\tswitch (responseType) {\n\t\t\t\t\tcase 'arraybuffer':\n\t\t\t\t\t\treturn response.arrayBuffer();\n\t\t\t\t\tcase 'blob':\n\t\t\t\t\t\treturn response.blob();\n\t\t\t\t\tcase 'document':\n\t\t\t\t\t\treturn response.text().then(text => {\n\t\t\t\t\t\t\tconst parser = new DOMParser();\n\t\t\t\t\t\t\treturn parser.parseFromString(text, mimeType);\n\t\t\t\t\t\t});\n\t\t\t\t\tcase 'json':\n\t\t\t\t\t\treturn response.json();\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tif (mimeType === '') {\n\t\t\t\t\t\t\treturn response.text();\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// sniff encoding\n\t\t\t\t\t\t\tconst re = /charset=\"?([^;\"\\s]*)\"?/i;\n\t\t\t\t\t\t\tconst exec = re.exec(mimeType);\n\t\t\t\t\t\t\tconst label = exec && exec[1] ? exec[1].toLowerCase() : undefined;\n\t\t\t\t\t\t\tconst decoder = new TextDecoder(label);\n\t\t\t\t\t\t\treturn response.arrayBuffer().then(ab => decoder.decode(ab));\n\t\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}).then(data => {\n\t\t\t\tif (onLoad) onLoad(data);\n\t\t\t}).catch(err => {\n\t\t\t\tonError && onError(err);\n\t\t\t\tthis.manager.itemError(url);\n\t\t\t}).finally(() => {\n\t\t\t\tthis.manager.itemEnd(url);\n\t\t\t});\n\t\t\tthis.manager.itemStart(url);\n\t\t}\n\n\t\t/**\n\t\t * Sets the expected response type.\n\t\t * @param {'arraybuffer'|'blob'|'document'|'json'|''} value - The response type.\n\t\t * @returns {FileLoader} A reference to this file loader.\n\t\t */\n\t\tsetResponseType(value) {\n\t\t\tthis.responseType = value;\n\t\t\treturn this;\n\t\t}\n\n\t\t/**\n\t\t * Sets the expected mime type of the loaded file.\n\t\t * @param {string} value - The mime type.\n\t\t * @returns {FileLoader} A reference to this file loader.\n\t\t */\n\t\tsetMimeType(value) {\n\t\t\tthis.mimeType = value;\n\t\t\treturn this;\n\t\t}\n\t}\n\tclass HttpError extends Error {\n\t\tconstructor(message, response) {\n\t\t\tsuper(message);\n\t\t\tthis.response = response;\n\t\t}\n\t}\n\n\t/**\n\t * A loader for loading images. The class loads images with the HTML `Image` API.\n\t * Please note that 'ImageLoader' not support progress events.\n\t * ```js\n\t * const loader = new ImageLoader();\n\t * const image = await loader.loadAsync('image.png');\n\t * ```\n\t * @extends Loader\n\t */\n\tclass ImageLoader extends Loader {\n\t\t/**\n\t\t * Constructs a new image loader.\n\t\t * @param {LoadingManager} [manager] - The loading manager.\n\t\t */\n\t\tconstructor(manager) {\n\t\t\tsuper(manager);\n\t\t}\n\n\t\t/**\n\t\t * Starts loading from the given URL and passes the loaded image\n\t\t * to the `onLoad()` callback. The method also returns a new `Image` object which can\n\t\t * directly be used for texture creation. If you do it this way, the texture\n\t\t * may pop up in your scene once the respective loading process is finished.\n\t\t * @param {string} url - The path/URL of the file to be loaded. This can also be a data URI.\n\t\t * @param {Function} [onLoad] - Executed when the loading process has been finished. The argument is an `HTMLImageElement`.\n\t\t * @param {onProgressCallback} [onProgress] - Unsupported in this loader.\n\t\t * @param {onErrorCallback} [onError] - Executed when errors occur.\n\t\t * @returns {HTMLImageElement} The image.\n\t\t */\n\t\tload(url, onLoad, onProgress, onError) {\n\t\t\tif (url === undefined) url = '';\n\t\t\tif (this.path !== undefined) url = this.path + url;\n\t\t\turl = this.manager.resolveURL(url);\n\t\t\tconst scope = this;\n\t\t\tconst image = document.createElementNS('http://www.w3.org/1999/xhtml', 'img');\n\t\t\tfunction onImageLoad() {\n\t\t\t\tremoveEventListeners();\n\t\t\t\tif (onLoad) onLoad(this);\n\t\t\t\tscope.manager.itemEnd(url);\n\t\t\t}\n\t\t\tfunction onImageError(event) {\n\t\t\t\tremoveEventListeners();\n\t\t\t\tif (onError) onError(event);\n\t\t\t\tscope.manager.itemError(url);\n\t\t\t\tscope.manager.itemEnd(url);\n\t\t\t}\n\t\t\tfunction removeEventListeners() {\n\t\t\t\timage.removeEventListener('load', onImageLoad, false);\n\t\t\t\timage.removeEventListener('error', onImageError, false);\n\t\t\t}\n\t\t\timage.addEventListener('load', onImageLoad, false);\n\t\t\timage.addEventListener('error', onImageError, false);\n\t\t\tif (url.slice(0, 5) !== 'data:') {\n\t\t\t\tif (this.crossOrigin !== undefined) image.crossOrigin = this.crossOrigin;\n\t\t\t}\n\t\t\tscope.manager.itemStart(url);\n\t\t\timage.src = url;\n\t\t\treturn image;\n\t\t}\n\t}\n\n\t/**\n\t * The vector 2 class\n\t */\n\tclass Vector2 {\n\t\t/**\n\t\t * @param {number} [x=0] - the x value of this vector.\n\t\t * @param {number} [y=0] - the y value of this vector.\n\t\t */\n\t\tconstructor(x = 0, y = 0) {\n\t\t\tthis.x = x;\n\t\t\tthis.y = y;\n\t\t}\n\n\t\t/**\n\t\t * Sets the x and y components of this vector.\n\t\t * @param {number} x\n\t\t * @param {number} y\n\t\t * @returns {Vector2}\n\t\t */\n\t\tset(x = 0, y = 0) {\n\t\t\tthis.x = x;\n\t\t\tthis.y = y;\n\t\t\treturn this;\n\t\t}\n\n\t\t/**\n\t\t * Sets this vector to be the vector linearly interpolated between v1 and v2\n\t\t * where ratio is the percent distance along the line connecting the two vectors\n\t\t * - ratio = 0 will be v1, and ratio = 1 will be v2.\n\t\t * @param {Vector2} v1 - the starting Vector2.\n\t\t * @param {Vector2} v2 - Vector2 to interpolate towards.\n\t\t * @param {number} ratio - interpolation factor, typically in the closed interval [0, 1].\n\t\t * @returns {Vector2}\n\t\t */\n\t\tlerpVectors(v1, v2, ratio) {\n\t\t\treturn this.subVectors(v2, v1).multiplyScalar(ratio).add(v1);\n\t\t}\n\n\t\t/**\n\t\t * If this vector's x or y value is greater than v's x or y value, replace that value with the corresponding min value.\n\t\t * @param {Vector2} v\n\t\t * @returns {Vector2}\n\t\t */\n\t\tmin(v) {\n\t\t\tthis.x = Math.min(this.x, v.x);\n\t\t\tthis.y = Math.min(this.y, v.y);\n\t\t\treturn this;\n\t\t}\n\n\t\t/**\n\t\t * If this vector's x or y value is less than v's x or y value, replace that value with the corresponding max value.\n\t\t * @param {Vector2} v\n\t\t * @returns {Vector2}\n\t\t */\n\t\tmax(v) {\n\t\t\tthis.x = Math.max(this.x, v.x);\n\t\t\tthis.y = Math.max(this.y, v.y);\n\t\t\treturn this;\n\t\t}\n\n\t\t/**\n\t\t * Computes the Euclidean length (straight-line length) from (0, 0) to (x, y).\n\t\t * @returns {number}\n\t\t */\n\t\tgetLength() {\n\t\t\treturn Math.sqrt(this.getLengthSquared());\n\t\t}\n\n\t\t/**\n\t\t * Computes the square of the Euclidean length (straight-line length) from (0, 0) to (x, y).\n\t\t * If you are comparing the lengths of vectors, you should compare the length squared instead\n\t\t * as it is slightly more efficient to calculate.\n\t\t * @returns {number}\n\t\t */\n\t\tgetLengthSquared() {\n\t\t\treturn this.x * this.x + this.y * this.y;\n\t\t}\n\n\t\t/**\n\t\t * Converts this vector to a unit vector - that is, sets it equal to a vector with the same direction as this one, but length 1.\n\t\t * @param {number} [thickness=1]\n\t\t * @returns {Vector2}\n\t\t */\n\t\tnormalize(thickness = 1) {\n\t\t\tconst length = this.getLength() || 1;\n\t\t\tconst invLength = thickness / length;\n\t\t\tthis.x *= invLength;\n\t\t\tthis.y *= invLength;\n\t\t\treturn this;\n\t\t}\n\n\t\t/**\n\t\t * Subtracts v from the vector.\n\t\t * @param {Vector2} a\n\t\t * @param {Vector2} target - the result vector2\n\t\t * @returns {Vector2}\n\t\t */\n\t\tsubtract(a, target = new Vector2()) {\n\t\t\treturn target.set(this.x - a.x, this.y - a.y);\n\t\t}\n\n\t\t/**\n\t\t * Subtracts v from this vector.\n\t\t * @param {Vector2} v\n\t\t * @returns {Vector2}\n\t\t */\n\t\tsub(v) {\n\t\t\tthis.x -= v.x;\n\t\t\tthis.y -= v.y;\n\t\t\treturn this;\n\t\t}\n\n\t\t/**\n\t\t * Copies the values of the passed Vector2's x and y properties to this Vector2.\n\t\t * @param {Vector2} v\n\t\t * @returns {Vector2}\n\t\t */\n\t\tcopy(v) {\n\t\t\tthis.x = v.x;\n\t\t\tthis.y = v.y;\n\t\t\treturn this;\n\t\t}\n\n\t\t/**\n\t\t * Sets this vector to a + b.\n\t\t * @param {Vector2} a\n\t\t * @param {Vector2} b\n\t\t * @returns {Vector2}\n\t\t */\n\t\taddVectors(a, b) {\n\t\t\tthis.x = a.x + b.x;\n\t\t\tthis.y = a.y + b.y;\n\t\t\treturn this;\n\t\t}\n\n\t\t/**\n\t\t * Sets this vector to a - b.\n\t\t * @param {Vector2} a\n\t\t * @param {Vector2} b\n\t\t * @returns {Vector2}\n\t\t */\n\t\tsubVectors(a, b) {\n\t\t\tthis.x = a.x - b.x;\n\t\t\tthis.y = a.y - b.y;\n\t\t\treturn this;\n\t\t}\n\n\t\t/**\n\t\t * Multiplies this vector by scalar.\n\t\t * @param {number} scalar\n\t\t * @returns {Vector2}\n\t\t */\n\t\tmultiplyScalar(scalar) {\n\t\t\tthis.x *= scalar;\n\t\t\tthis.y *= scalar;\n\t\t\treturn this;\n\t\t}\n\n\t\t/**\n\t\t * Computes the squared distance from this vector to v. If you are just comparing the distance with\n\t\t * another distance, you should compare the distance squared instead as it is slightly more efficient to calculate.\n\t\t * @param {Vector2} v\n\t\t * @returns {number}\n\t\t */\n\t\tdistanceToSquared(v) {\n\t\t\tconst dx = this.x - v.x,\n\t\t\t\tdy = this.y - v.y;\n\t\t\treturn dx * dx + dy * dy;\n\t\t}\n\n\t\t/**\n\t\t * Computes the distance from this vector to v.\n\t\t * @param {Vector2} v\n\t\t * @returns {number}\n\t\t */\n\t\tdistanceTo(v) {\n\t\t\treturn Math.sqrt(this.distanceToSquared(v));\n\t\t}\n\n\t\t/**\n\t\t * Sets this vector's x value to be array[ offset ] and y value to be array[ offset + 1 ].\n\t\t * @param {number[]} array - the source array.\n\t\t * @param {number} [offset=0] - offset into the array.\n\t\t * @param {boolean} [denormalize=false] - if true, denormalize the values, and array should be a typed array.\n\t\t * @returns {Vector2}\n\t\t */\n\t\tfromArray(array, offset = 0, denormalize = false) {\n\t\t\tlet x = array[offset],\n\t\t\t\ty = array[offset + 1];\n\t\t\tif (denormalize) {\n\t\t\t\tx = MathUtils.denormalize(x, array);\n\t\t\t\ty = MathUtils.denormalize(y, array);\n\t\t\t}\n\t\t\tthis.x = x;\n\t\t\tthis.y = y;\n\t\t\treturn this;\n\t\t}\n\n\t\t/**\n\t\t * Sets this array[ offset ] value to be vector's x and array[ offset + 1 ] to be vector's y.\n\t\t * @param {number[]} [array] - the target array.\n\t\t * @param {number} [offset=0] - offset into the array.\n\t\t * @param {boolean} [normalize=false] - if true, normalize the values, and array should be a typed array.\n\t\t * @returns {number[]}\n\t\t */\n\t\ttoArray(array = [], offset = 0, normalize = false) {\n\t\t\tlet x = this.x,\n\t\t\t\ty = this.y;\n\t\t\tif (normalize) {\n\t\t\t\tx = MathUtils.normalize(x, array);\n\t\t\t\ty = MathUtils.normalize(y, array);\n\t\t\t}\n\t\t\tarray[offset] = x;\n\t\t\tarray[offset + 1] = y;\n\t\t\treturn array;\n\t\t}\n\n\t\t/**\n\t\t * Adds v to this vector.\n\t\t * @param {Vector2} v\n\t\t * @returns {Vector2}\n\t\t */\n\t\tadd(v) {\n\t\t\tthis.x += v.x;\n\t\t\tthis.y += v.y;\n\t\t\treturn this;\n\t\t}\n\n\t\t/**\n\t\t * Computes the angle in radians of this vector with respect to the positive x-axis.\n\t\t * @returns {number}\n\t\t */\n\t\tangle() {\n\t\t\t// computes the angle in radians with respect to the positive x-axis\n\n\t\t\t// let angle = Math.atan2(this.y, this.x);\n\t\t\t// if (angle < 0) angle += 2 * Math.PI;\n\t\t\t// return angle;\n\n\t\t\treturn Math.atan2(-this.y, -this.x) + Math.PI;\n\t\t}\n\n\t\t/**\n\t\t * Inverts this vector - i.e. sets x = -x, y = -y.\n\t\t * @returns {Vector2}\n\t\t */\n\t\tnegate() {\n\t\t\tthis.x = -this.x;\n\t\t\tthis.y = -this.y;\n\t\t\treturn this;\n\t\t}\n\n\t\t/**\n\t\t * Calculate the dot product of this vector and v.\n\t\t * @param {Vector2} a\n\t\t * @returns {number}\n\t\t */\n\t\tdot(a) {\n\t\t\treturn this.x * a.x + this.y * a.y;\n\t\t}\n\n\t\t/**\n\t\t * Checks for strict equality of this vector and v.\n\t\t * @param {Vector2} v\n\t\t * @returns {boolean}\n\t\t */\n\t\tequals(v) {\n\t\t\treturn v.x === this.x && v.y === this.y;\n\t\t}\n\n\t\t/**\n\t\t * Returns a new Vector2 with the same x and y values as this one.\n\t\t * @returns {Vector2}\n\t\t */\n\t\tclone() {\n\t\t\treturn new Vector2(this.x, this.y);\n\t\t}\n\t\t*[Symbol.iterator]() {\n\t\t\tyield this.x;\n\t\t\tyield this.y;\n\t\t}\n\t}\n\n\t/**\n\t * This flag can be used for type testing.\n\t * @readonly\n\t * @type {boolean}\n\t * @default true\n\t */\n\tVector2.prototype.isVector2 = true;\n\n\t/**\n\t * Represents an axis-aligned bounding box (AABB) in 2D space.\n\t */\n\tclass Box2 {\n\t\t/**\n\t\t * @param {Vector2} min - (optional) Vector2 representing the lower (x, y) boundary of the box.\n\t\t * \t\t\t\t\t\t\t\tDefault is ( + Infinity, + Infinity ).\n\t\t * @param {Vector2} max - (optional) Vector2 representing the upper (x, y) boundary of the box.\n\t\t * \t\t\t\t\t\t\t\tDefault is ( - Infinity, - Infinity ).\n\t\t */\n\t\tconstructor(min, max) {\n\t\t\tthis.min = min !== undefined ? min : new Vector2(+Infinity, +Infinity);\n\t\t\tthis.max = max !== undefined ? max : new Vector2(-Infinity, -Infinity);\n\t\t}\n\n\t\t/**\n\t\t * @param {number} x1\n\t\t * @param {number} y1\n\t\t * @param {number} x2\n\t\t * @param {number} y2\n\t\t */\n\t\tset(x1, y1, x2, y2) {\n\t\t\tthis.min.set(x1, y1);\n\t\t\tthis.max.set(x2, y2);\n\t\t}\n\n\t\t/**\n\t\t * Returns a new Box2 with the same min and max as this one.\n\t\t * @returns {Box2}\n\t\t */\n\t\tclone() {\n\t\t\treturn new Box2().copy(this);\n\t\t}\n\n\t\t/**\n\t\t * Copies the min and max from box to this box.\n\t\t * @param {Box2} box\n\t\t * @returns {Box2}\n\t\t */\n\t\tcopy(box) {\n\t\t\tthis.min.copy(box.min);\n\t\t\tthis.max.copy(box.max);\n\t\t\treturn this;\n\t\t}\n\t}\n\n\t/**\n\t * This flag can be used for type testing.\n\t * @readonly\n\t * @type {boolean}\n\t * @default true\n\t */\n\tBox2.prototype.isBox2 = true;\n\n\t/**\n\t * Represents an axis-aligned bounding box (AABB) in 3D space.\n\t */\n\tclass Box3 {\n\t\t/**\n\t\t * @param {Vector3} min - (optional) Vector3 representing the lower (x, y, z) boundary of the box.\n\t\t * \t\t\t\t\t\t\t\tDefault is ( + Infinity, + Infinity, + Infinity ).\n\t\t * @param {Vector3} max - (optional) Vector3 representing the upper (x, y, z) boundary of the box.\n\t\t * \t\t\t\t\t\t\t\tDefault is ( - Infinity, - Infinity, - Infinity ).\n\t\t */\n\t\tconstructor(min, max) {\n\t\t\tthis.min = min !== undefined ? min : new Vector3(+Infinity, +Infinity, +Infinity);\n\t\t\tthis.max = max !== undefined ? max : new Vector3(-Infinity, -Infinity, -Infinity);\n\t\t}\n\n\t\t/**\n\t\t * Sets the lower and upper (x, y, z) boundaries of this box.\n\t\t * @param {Vector3} min - Vector3 representing the lower (x, y, z) boundary of the box.\n\t\t * @param {Vector3} max - Vector3 representing the lower upper (x, y, z) boundary of the box.\n\t\t */\n\t\tset(min, max) {\n\t\t\tthis.min.copy(min);\n\t\t\tthis.max.copy(max);\n\t\t}\n\n\t\t/**\n\t\t * Sets the upper and lower bounds of this box to include all of the points in points.\n\t\t * @param {Vector3[]} points - Array of Vector3s that the resulting box will contain.\n\t\t * @returns {Box3}\n\t\t */\n\t\tsetFromPoints(points) {\n\t\t\tthis.makeEmpty();\n\t\t\tfor (let i = 0, il = points.length; i < il; i++) {\n\t\t\t\tthis.expandByPoint(points[i]);\n\t\t\t}\n\t\t\treturn this;\n\t\t}\n\n\t\t/**\n\t\t * Makes this box empty.\n\t\t * @returns {Box3}\n\t\t */\n\t\tmakeEmpty() {\n\t\t\tthis.min.x = this.min.y = this.min.z = +Infinity;\n\t\t\tthis.max.x = this.max.y = this.max.z = -Infinity;\n\t\t\treturn this;\n\t\t}\n\n\t\t/**\n\t\t * Expands the boundaries of this box to include point.\n\t\t * @param {Vector3} point - Vector3 that should be included in the box.\n\t\t * @returns {Box3}\n\t\t */\n\t\texpandByPoint(point) {\n\t\t\tthis.min.min(point);\n\t\t\tthis.max.max(point);\n\t\t\treturn this;\n\t\t}\n\n\t\t/**\n\t\t * Expands each dimension of the box by scalar. If negative, the dimensions of the box will be contracted.\n\t\t * @param {number} scalar - Distance to expand the box by.\n\t\t * @returns {Box3}\n\t\t */\n\t\texpandByScalar(scalar) {\n\t\t\tthis.min.addScalar(-scalar);\n\t\t\tthis.max.addScalar(scalar);\n\t\t\treturn this;\n\t\t}\n\n\t\t/**\n\t\t * Expands the boundaries of this box to include box3.\n\t\t * @param {Box3} box3 - Box that will be unioned with this box.\n\t\t * @returns {Box3}\n\t\t */\n\t\texpandByBox3(box3) {\n\t\t\tthis.min.min(box3.min);\n\t\t\tthis.max.max(box3.max);\n\t\t\treturn this;\n\t\t}\n\n\t\t/**\n\t\t * Sets the upper and lower bounds of this box to include all of the data in array.\n\t\t * @param {number[]} array - An array of position data that the resulting box will envelop.\n\t\t * @param {number} [gap=3] - The number of elements between the start of each position in the array.\n\t\t * @param {number} [offset=0] - The offset in each gap where the position data starts.\n\t\t * @param {boolean} [denormalize=false] - Whether to denormalize the values in the array.\n\t\t * @returns {Box3} A reference to this box.\n\t\t */\n\t\tsetFromArray(array, gap = 3, offset = 0, denormalize = false) {\n\t\t\tlet minX = +Infinity;\n\t\t\tlet minY = +Infinity;\n\t\t\tlet minZ = +Infinity;\n\t\t\tlet maxX = -Infinity;\n\t\t\tlet maxY = -Infinity;\n\t\t\tlet maxZ = -Infinity;\n\t\t\tfor (let i = 0, l = array.length; i < l; i += gap) {\n\t\t\t\tlet x = array[i + offset];\n\t\t\t\tlet y = array[i + offset + 1];\n\t\t\t\tlet z = array[i + offset + 2];\n\t\t\t\tif (denormalize) {\n\t\t\t\t\tx = MathUtils.denormalize(x, array);\n\t\t\t\t\ty = MathUtils.denormalize(y, array);\n\t\t\t\t\tz = MathUtils.denormalize(z, array);\n\t\t\t\t}\n\t\t\t\tif (x < minX) minX = x;\n\t\t\t\tif (y < minY) minY = y;\n\t\t\t\tif (z < minZ) minZ = z;\n\t\t\t\tif (x > maxX) maxX = x;\n\t\t\t\tif (y > maxY) maxY = y;\n\t\t\t\tif (z > maxZ) maxZ = z;\n\t\t\t}\n\t\t\tthis.min.set(minX, minY, minZ);\n\t\t\tthis.max.set(maxX, maxY, maxZ);\n\t\t\treturn this;\n\t\t}\n\n\t\t/**\n\t\t * Clamps the point within the bounds of this box.\n\t\t * @param {Vector3} point - Vector3 to clamp.\n\t\t * @param {Vector3} target - Vector3 to store the result in.\n\t\t * @returns {Vector3}\n\t\t */\n\t\tclampPoint(point, target) {\n\t\t\treturn target.copy(point).min(this.max).max(this.min);\n\t\t}\n\n\t\t/**\n\t\t * Returns the distance from any edge of this box to the specified point.\n\t\t * If the point lies inside of this box, the distance will be 0.\n\t\t * @param {Vector3} point - Vector3 to measure the distance to.\n\t\t * @returns {number}\n\t\t */\n\t\tdistanceToPoint(point) {\n\t\t\treturn this.clampPoint(point, _vec3_1$5).distanceTo(point);\n\t\t}\n\n\t\t/**\n\t\t * Returns aMinimum Bounding Sphere for the box.\n\t\t * @param {Sphere} target — the result will be copied into this Sphere.\n\t\t * @returns {Sphere}\n\t\t */\n\t\tgetBoundingSphere(target) {\n\t\t\tif (this.isEmpty()) {\n\t\t\t\ttarget.makeEmpty();\n\t\t\t} else {\n\t\t\t\tthis.getCenter(target.center);\n\t\t\t\ttarget.radius = this.getSize(_vec3_1$5).getLength() * 0.5;\n\t\t\t}\n\t\t\treturn target;\n\t\t}\n\n\t\t/**\n\t\t * Returns true if this box includes zero points within its bounds.\n\t\t * @returns {boolean}\n\t\t */\n\t\tisEmpty() {\n\t\t\t// this is a more robust check for empty than ( volume <= 0 ) because volume can get positive with two negative axes\n\t\t\treturn this.max.x < this.min.x || this.max.y < this.min.y || this.max.z < this.min.z;\n\t\t}\n\n\t\t/**\n\t\t * Returns true if this box and box share the same lower and upper bounds.\n\t\t * @param {Box3} box - Box to compare with this one.\n\t\t * @returns {boolean}\n\t\t */\n\t\tequals(box) {\n\t\t\treturn box.min.equals(this.min) && box.max.equals(this.max);\n\t\t}\n\n\t\t/**\n\t\t * Returns the center point of the box as a Vector3.\n\t\t * @param {Vector3} target - the result will be copied into this Vector3.\n\t\t * @returns {Vector3}\n\t\t */\n\t\tgetCenter(target = new Vector3()) {\n\t\t\treturn this.isEmpty() ? target.set(0, 0, 0) : target.addVectors(this.min, this.max).multiplyScalar(0.5);\n\t\t}\n\n\t\t/**\n\t\t * Returns the width, height and depth of this box.\n\t\t * @param {Vector3} target - the result will be copied into this Vector3.\n\t\t * @returns {Vector3}\n\t\t */\n\t\tgetSize(target = new Vector3()) {\n\t\t\treturn this.isEmpty() ? target.set(0, 0, 0) : target.subVectors(this.max, this.min);\n\t\t}\n\n\t\t/**\n\t\t * Get the 8 corner points of the bounding box, the order is as follows:\n\t\t *\t 7-------3\n\t\t *\t/|\t\t\t/|\n\t\t * 4-------0 |\n\t\t * | |\t\t | |\n\t\t * | 6-----|-2\n\t\t * |/\t\t\t|/\n\t\t * 5-------1\n\t\t * @param {Vector3[]} points - The array to store the points.\n\t\t * @returns {Vector3[]} The array of points.\n\t\t */\n\t\tgetPoints(points) {\n\t\t\tconst minX = this.min.x,\n\t\t\t\tminY = this.min.y,\n\t\t\t\tminZ = this.min.z;\n\t\t\tconst maxX = this.max.x,\n\t\t\t\tmaxY = this.max.y,\n\t\t\t\tmaxZ = this.max.z;\n\t\t\tpoints[0].set(maxX, maxY, maxZ);\n\t\t\tpoints[1].set(maxX, minY, maxZ);\n\t\t\tpoints[2].set(maxX, minY, minZ);\n\t\t\tpoints[3].set(maxX, maxY, minZ);\n\t\t\tpoints[4].set(minX, maxY, maxZ);\n\t\t\tpoints[5].set(minX, minY, maxZ);\n\t\t\tpoints[6].set(minX, minY, minZ);\n\t\t\tpoints[7].set(minX, maxY, minZ);\n\t\t\treturn points;\n\t\t}\n\n\t\t/**\n\t\t * Computes the union of this box and box,\n\t\t * setting the upper bound of this box to the greater of the two boxes' upper bounds and the lower bound of this box to the lesser of the two boxes' lower bounds.\n\t\t * @param {Box3} box - Box that will be unioned with this box.\n\t\t * @returns {Box3}\n\t\t */\n\t\tunion(box) {\n\t\t\tthis.min.min(box.min);\n\t\t\tthis.max.max(box.max);\n\t\t\treturn this;\n\t\t}\n\n\t\t/**\n\t\t * Transforms this Box3 with the supplied matrix.\n\t\t * @param {Matrix4} matrix - The Matrix4 to apply\n\t\t * @returns {Box3}\n\t\t */\n\t\tapplyMatrix4(matrix) {\n\t\t\t// transform of empty box is an empty box.\n\t\t\tif (this.isEmpty()) return this;\n\n\t\t\t// NOTE: I am using a binary pattern to specify all 2^3 combinations below\n\t\t\t_points[0].set(this.min.x, this.min.y, this.min.z).applyMatrix4(matrix); // 000\n\t\t\t_points[1].set(this.min.x, this.min.y, this.max.z).applyMatrix4(matrix); // 001\n\t\t\t_points[2].set(this.min.x, this.max.y, this.min.z).applyMatrix4(matrix); // 010\n\t\t\t_points[3].set(this.min.x, this.max.y, this.max.z).applyMatrix4(matrix); // 011\n\t\t\t_points[4].set(this.max.x, this.min.y, this.min.z).applyMatrix4(matrix); // 100\n\t\t\t_points[5].set(this.max.x, this.min.y, this.max.z).applyMatrix4(matrix); // 101\n\t\t\t_points[6].set(this.max.x, this.max.y, this.min.z).applyMatrix4(matrix); // 110\n\t\t\t_points[7].set(this.max.x, this.max.y, this.max.z).applyMatrix4(matrix); // 111\n\n\t\t\tthis.setFromPoints(_points);\n\t\t\treturn this;\n\t\t}\n\n\t\t/**\n\t\t * Returns true if the specified point lies within or on the boundaries of this box.\n\t\t * @param {Vector3} point - Vector3 to check for inclusion.\n\t\t * @returns {boolean}\n\t\t */\n\t\tcontainsPoint(point) {\n\t\t\treturn point.x < this.min.x || point.x > this.max.x || point.y < this.min.y || point.y > this.max.y || point.z < this.min.z || point.z > this.max.z ? false : true;\n\t\t}\n\n\t\t/**\n\t\t * Determines whether or not this box intersects triangle.\n\t\t * @param {Triangle} triangle - Triangle to check for intersection against.\n\t\t * @returns {boolean}\n\t\t */\n\t\tintersectsTriangle(triangle) {\n\t\t\tif (this.isEmpty()) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\t// compute box center and extents\n\t\t\tthis.getCenter(_center);\n\t\t\t_extents.subVectors(this.max, _center);\n\n\t\t\t// translate triangle to aabb origin\n\t\t\t_v0$1.subVectors(triangle.a, _center);\n\t\t\t_v1$1.subVectors(triangle.b, _center);\n\t\t\t_v2$1.subVectors(triangle.c, _center);\n\n\t\t\t// compute edge vectors for triangle\n\t\t\t_f0.subVectors(_v1$1, _v0$1);\n\t\t\t_f1.subVectors(_v2$1, _v1$1);\n\t\t\t_f2.subVectors(_v0$1, _v2$1);\n\n\t\t\t// test against axes that are given by cross product combinations of the edges of the triangle and the edges of the aabb\n\t\t\t// make an axis testing of each of the 3 sides of the aabb against each of the 3 sides of the triangle = 9 axis of separation\n\t\t\t// axis_ij = u_i x f_j (u0, u1, u2 = face normals of aabb = x,y,z axes vectors since aabb is axis aligned)\n\t\t\tlet axes = [0, -_f0.z, _f0.y, 0, -_f1.z, _f1.y, 0, -_f2.z, _f2.y, _f0.z, 0, -_f0.x, _f1.z, 0, -_f1.x, _f2.z, 0, -_f2.x, -_f0.y, _f0.x, 0, -_f1.y, _f1.x, 0, -_f2.y, _f2.x, 0];\n\t\t\tif (!satForAxes(axes, _v0$1, _v1$1, _v2$1, _extents)) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\t// test 3 face normals from the aabb\n\t\t\taxes = [1, 0, 0, 0, 1, 0, 0, 0, 1];\n\t\t\tif (!satForAxes(axes, _v0$1, _v1$1, _v2$1, _extents)) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\t// finally testing the face normal of the triangle\n\t\t\t// use already existing triangle edge vectors here\n\t\t\t_triangleNormal.crossVectors(_f0, _f1);\n\t\t\taxes = [_triangleNormal.x, _triangleNormal.y, _triangleNormal.z];\n\t\t\treturn satForAxes(axes, _v0$1, _v1$1, _v2$1, _extents);\n\t\t}\n\n\t\t/**\n\t\t * Returns a new Box3 with the same min and max as this one.\n\t\t * @returns {Box3}\n\t\t */\n\t\tclone() {\n\t\t\treturn new Box3().copy(this);\n\t\t}\n\n\t\t/**\n\t\t * Copies the min and max from box to this box.\n\t\t * @param {Box3} box - Box3 to copy.\n\t\t * @returns {Box3}\n\t\t */\n\t\tcopy(box) {\n\t\t\tthis.min.copy(box.min);\n\t\t\tthis.max.copy(box.max);\n\t\t\treturn this;\n\t\t}\n\t}\n\n\t/**\n\t * This flag can be used for type testing.\n\t * @readonly\n\t * @type {boolean}\n\t * @default true\n\t */\n\tBox3.prototype.isBox3 = true;\n\tconst _points = [new Vector3(), new Vector3(), new Vector3(), new Vector3(), new Vector3(), new Vector3(), new Vector3(), new Vector3()];\n\tconst _vec3_1$5 = new Vector3();\n\n\t// triangle centered vertices\n\n\tconst _v0$1 = new Vector3();\n\tconst _v1$1 = new Vector3();\n\tconst _v2$1 = new Vector3();\n\n\t// triangle edge vectors\n\n\tconst _f0 = new Vector3();\n\tconst _f1 = new Vector3();\n\tconst _f2 = new Vector3();\n\tconst _center = new Vector3();\n\tconst _extents = new Vector3();\n\tconst _triangleNormal = new Vector3();\n\tconst _testAxis = new Vector3();\n\tfunction satForAxes(axes, v0, v1, v2, extents) {\n\t\tfor (let i = 0, j = axes.length - 3; i <= j; i += 3) {\n\t\t\t_testAxis.fromArray(axes, i);\n\t\t\t// project the aabb onto the separating axis\n\t\t\tconst r = extents.x * Math.abs(_testAxis.x) + extents.y * Math.abs(_testAxis.y) + extents.z * Math.abs(_testAxis.z);\n\t\t\t// project all 3 vertices of the triangle onto the separating axis\n\t\t\tconst p0 = v0.dot(_testAxis);\n\t\t\tconst p1 = v1.dot(_testAxis);\n\t\t\tconst p2 = v2.dot(_testAxis);\n\t\t\t// actual test, basically see if either of the most extreme of the triangle points intersects r\n\t\t\tif (Math.max(-Math.max(p0, p1, p2), Math.min(p0, p1, p2)) > r) {\n\t\t\t\t// points of the projected triangle are outside the projected half-length of the aabb\n\t\t\t\t// the axis is separating and we can exit\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t\treturn true;\n\t}\n\n\t/**\n\t * A Color3 instance is represented by RGB components.\n\t */\n\tclass Color3 {\n\t\t/**\n\t\t * Constructs a new three-component color.\n\t\t * @param {number} [r] - The red component of the color. If `g` and `b` are not provided, it can be a hexadecimal triplet.\n\t\t * @param {number} [g] - The green component.\n\t\t * @param {number} [b] - The blue component.\n\t\t */\n\t\tconstructor(r, g, b) {\n\t\t\t/**\n\t\t\t * The red component.\n\t\t\t * @type {number}\n\t\t\t * @default 0\n\t\t\t */\n\t\t\tthis.r = 0;\n\n\t\t\t/**\n\t\t\t * The green component.\n\t\t\t * @type {number}\n\t\t\t * @default 0\n\t\t\t */\n\t\t\tthis.g = 0;\n\n\t\t\t/**\n\t\t\t * The blue component.\n\t\t\t * @type {number}\n\t\t\t * @default 0\n\t\t\t */\n\t\t\tthis.b = 0;\n\t\t\tif (g === undefined && b === undefined) {\n\t\t\t\tthis.setHex(r);\n\t\t\t} else {\n\t\t\t\tthis.setRGB(r, g, b);\n\t\t\t}\n\t\t}\n\n\t\t/**\n\t\t * Sets this color from a hexadecimal value.\n\t\t * @param {number} hex - The hexadecimal value.\n\t\t * @returns {Color3} A reference to this color.\n\t\t */\n\t\tsetHex(hex) {\n\t\t\thex = Math.floor(hex);\n\t\t\tthis.r = (hex >> 16 & 255) / 255;\n\t\t\tthis.g = (hex >> 8 & 255) / 255;\n\t\t\tthis.b = (hex & 255) / 255;\n\t\t\treturn this;\n\t\t}\n\n\t\t/**\n\t\t * Sets this color from RGB values.\n\t\t * @param {number} r - Red channel value between 0.0 and 1.0.\n\t\t * @param {number} g - Green channel value between 0.0 and 1.0.\n\t\t * @param {number} b - Blue channel value between 0.0 and 1.0.\n\t\t * @returns {Color3} A reference to this color.\n\t\t */\n\t\tsetRGB(r, g, b) {\n\t\t\tthis.r = r;\n\t\t\tthis.g = g;\n\t\t\tthis.b = b;\n\t\t\treturn this;\n\t\t}\n\n\t\t/**\n\t\t * Set this color from HSL values.\n\t\t * @param {number} h - Hue value between 0.0 and 1.0.\n\t\t * @param {number} s - Saturation value between 0.0 and 1.0.\n\t\t * @param {number} l - Lightness value between 0.0 and 1.0.\n\t\t * @returns {Color3} A reference to this color.\n\t\t */\n\t\tsetHSL(h, s, l) {\n\t\t\t// h,s,l ranges are in 0.0 - 1.0\n\t\t\th = MathUtils.euclideanModulo(h, 1);\n\t\t\ts = MathUtils.clamp(s, 0, 1);\n\t\t\tl = MathUtils.clamp(l, 0, 1);\n\t\t\tif (s === 0) {\n\t\t\t\tthis.r = this.g = this.b = l;\n\t\t\t} else {\n\t\t\t\tconst p = l <= 0.5 ? l * (1 + s) : l + s - l * s;\n\t\t\t\tconst q = 2 * l - p;\n\t\t\t\tthis.r = hue2rgb(q, p, h + 1 / 3);\n\t\t\t\tthis.g = hue2rgb(q, p, h);\n\t\t\t\tthis.b = hue2rgb(q, p, h - 1 / 3);\n\t\t\t}\n\t\t\treturn this;\n\t\t}\n\n\t\t/**\n\t\t * Returns a new color with copied values from this instance.\n\t\t * @returns {Color3} A clone of this instance.\n\t\t */\n\t\tclone() {\n\t\t\treturn new this.constructor(this.r, this.g, this.b);\n\t\t}\n\n\t\t/**\n\t\t * Copies the values of the given color to this instance.\n\t\t * @param {Color3} color - The color to copy.\n\t\t * @returns {Color3} A reference to this color.\n\t\t */\n\t\tcopy(color) {\n\t\t\tthis.r = color.r;\n\t\t\tthis.g = color.g;\n\t\t\tthis.b = color.b;\n\t\t\treturn this;\n\t\t}\n\n\t\t/**\n\t\t * Converts this color from sRGB space to linear space.\n\t\t * @returns {Color3} A reference to this color.\n\t\t */\n\t\tconvertSRGBToLinear() {\n\t\t\tthis.r = SRGBToLinear(this.r);\n\t\t\tthis.g = SRGBToLinear(this.g);\n\t\t\tthis.b = SRGBToLinear(this.b);\n\t\t\treturn this;\n\t\t}\n\n\t\t/**\n\t\t * Converts this color from linear space to sRGB space.\n\t\t * @returns {Color3} A reference to this color.\n\t\t */\n\t\tconvertLinearToSRGB() {\n\t\t\tthis.r = LinearToSRGB(this.r);\n\t\t\tthis.g = LinearToSRGB(this.g);\n\t\t\tthis.b = LinearToSRGB(this.b);\n\t\t\treturn this;\n\t\t}\n\n\t\t/**\n\t\t * Returns the hexadecimal value of this color.\n\t\t * @returns {number} The hexadecimal value.\n\t\t */\n\t\tgetHex() {\n\t\t\treturn MathUtils.clamp(this.r * 255, 0, 255) << 16 ^ MathUtils.clamp(this.g * 255, 0, 255) << 8 ^ MathUtils.clamp(this.b * 255, 0, 255) << 0;\n\t\t}\n\n\t\t/**\n\t\t * Linearly interpolates this color's RGB values toward the RGB values of the\n\t\t * given color. The alpha argument can be thought of as the ratio between\n\t\t * the two colors, where 0.0 is this color and 1.0 is the first argument.\n\t\t * @param {Color3} color - The color to converge on.\n\t\t * @param {number} alpha - The interpolation factor in the closed interval [0,1].\n\t\t * @returns {Color3} A reference to this color.\n\t\t */\n\t\tlerp(color, alpha) {\n\t\t\treturn this.lerpColors(this, color, alpha);\n\t\t}\n\n\t\t/**\n\t\t * Linearly interpolates between the given colors and stores the result in this instance.\n\t\t * The alpha argument can be thought of as the ratio between the two colors, where 0.0\n\t\t * is the first and 1.0 is the second color.\n\t\t * @param {Color3} color1 - The first color.\n\t\t * @param {Color3} color2 - The second color.\n\t\t * @param {number} alpha - The interpolation factor in the closed interval [0,1].\n\t\t * @returns {Color3} A reference to this color.\n\t\t */\n\t\tlerpColors(color1, color2, alpha) {\n\t\t\tthis.r = MathUtils.lerp(color1.r, color2.r, alpha);\n\t\t\tthis.g = MathUtils.lerp(color1.g, color2.g, alpha);\n\t\t\tthis.b = MathUtils.lerp(color1.b, color2.b, alpha);\n\t\t\treturn this;\n\t\t}\n\n\t\t/**\n\t\t * Sets this color's RGB components from the given array.\n\t\t * @param {number[]} array - An array holding the RGB values.\n\t\t * @param {number} [offset=0] - The offset into the array.\n\t\t * @param {boolean} [denormalize=false] - If true, denormalize the values, and array should be a typed array.\n\t\t * @returns {Color3} A reference to this color.\n\t\t */\n\t\tfromArray(array, offset = 0, denormalize = false) {\n\t\t\tlet r = array[offset],\n\t\t\t\tg = array[offset + 1],\n\t\t\t\tb = array[offset + 2];\n\t\t\tif (denormalize) {\n\t\t\t\tr = MathUtils.denormalize(r, array);\n\t\t\t\tg = MathUtils.denormalize(g, array);\n\t\t\t\tb = MathUtils.denormalize(b, array);\n\t\t\t}\n\t\t\tthis.r = r;\n\t\t\tthis.g = g;\n\t\t\tthis.b = b;\n\t\t\treturn this;\n\t\t}\n\n\t\t/**\n\t\t * Writes the RGB components of this color to the given array. If no array is provided,\n\t\t * the method returns a new instance.\n\t\t * @param {number[]} [array=[]] - The target array holding the color components.\n\t\t * @param {number} [offset=0] - Index of the first element in the array.\n\t\t * @param {boolean} [normalize=false] - If true, normalize the values, and array should be a typed array.\n\t\t * @returns {number[]} The color components.\n\t\t */\n\t\ttoArray(array = [], offset = 0, normalize = false) {\n\t\t\tlet r = this.r,\n\t\t\t\tg = this.g,\n\t\t\t\tb = this.b;\n\t\t\tif (normalize) {\n\t\t\t\tr = MathUtils.normalize(r, array);\n\t\t\t\tg = MathUtils.normalize(g, array);\n\t\t\t\tb = MathUtils.normalize(b, array);\n\t\t\t}\n\t\t\tarray[offset] = r;\n\t\t\tarray[offset + 1] = g;\n\t\t\tarray[offset + 2] = b;\n\t\t\treturn array;\n\t\t}\n\t\t*[Symbol.iterator]() {\n\t\t\tyield this.r;\n\t\t\tyield this.g;\n\t\t\tyield this.b;\n\t\t}\n\t}\n\n\t/**\n\t * This flag can be used for type testing.\n\t * @readonly\n\t * @type {boolean}\n\t * @default true\n\t */\n\tColor3.prototype.isColor3 = true;\n\tfunction hue2rgb(p, q, t) {\n\t\tif (t < 0) t += 1;\n\t\tif (t > 1) t -= 1;\n\t\tif (t < 1 / 6) return p + (q - p) * 6 * t;\n\t\tif (t < 1 / 2) return q;\n\t\tif (t < 2 / 3) return p + (q - p) * 6 * (2 / 3 - t);\n\t\treturn p;\n\t}\n\tfunction SRGBToLinear(c) {\n\t\treturn c < 0.04045 ? c * 0.0773993808 : Math.pow(c * 0.9478672986 + 0.0521327014, 2.4);\n\t}\n\tfunction LinearToSRGB(c) {\n\t\treturn c < 0.0031308 ? c * 12.92 : 1.055 * Math.pow(c, 0.41666) - 0.055;\n\t}\n\n\t/**\n\t * A Color4 instance is represented by RGBA components.\n\t */\n\tclass Color4 {\n\t\t/**\n\t\t * Constructs a new four-component color.\n\t\t * @param {number} [r=0] - The red value.\n\t\t * @param {number} [g=0] - The green value.\n\t\t * @param {number} [b=0] - The blue value.\n\t\t * @param {number} [a=1] - The alpha value.\n\t\t */\n\t\tconstructor(r = 0, g = 0, b = 0, a = 1) {\n\t\t\t/**\n\t\t\t * The red component.\n\t\t\t * @type {number}\n\t\t\t * @default 0\n\t\t\t */\n\t\t\tthis.r = r;\n\n\t\t\t/**\n\t\t\t * The green component.\n\t\t\t * @type {number}\n\t\t\t * @default 0\n\t\t\t */\n\t\t\tthis.g = g;\n\n\t\t\t/**\n\t\t\t * The blue component.\n\t\t\t * @type {number}\n\t\t\t * @default 0\n\t\t\t */\n\t\t\tthis.b = b;\n\n\t\t\t/**\n\t\t\t * The alpha component.\n\t\t\t * @type {number}\n\t\t\t * @default 1\n\t\t\t */\n\t\t\tthis.a = a;\n\t\t}\n\n\t\t/**\n\t\t * Sets this color from RGBA values.\n\t\t * @param {number} r - Red channel value between 0.0 and 1.0.\n\t\t * @param {number} g - Green channel value between 0.0 and 1.0.\n\t\t * @param {number} b - Blue channel value between 0.0 and 1.0.\n\t\t * @param {number} a - Alpha channel value between 0.0 and 1.0.\n\t\t * @returns {Color4} A reference to this color.\n\t\t */\n\t\tsetRGBA(r, g, b, a) {\n\t\t\tthis.r = r;\n\t\t\tthis.g = g;\n\t\t\tthis.b = b;\n\t\t\tthis.a = a;\n\t\t\treturn this;\n\t\t}\n\n\t\t/**\n\t\t * Returns a new color with copied values from this instance.\n\t\t * @returns {Color4} A clone of this instance.\n\t\t */\n\t\tclone() {\n\t\t\treturn new Color4(this.r, this.g, this.b, this.a);\n\t\t}\n\n\t\t/**\n\t\t * Copies the values of the given color to this instance.\n\t\t * @param {Color4} color - The color to copy.\n\t\t * @returns {Color4} A clone of this instance.\n\t\t */\n\t\tcopy(color) {\n\t\t\tthis.r = color.r;\n\t\t\tthis.g = color.g;\n\t\t\tthis.b = color.b;\n\t\t\tthis.a = color.a;\n\t\t\treturn this;\n\t\t}\n\n\t\t/**\n\t\t * Sets this color's RGBA components from the given array.\n\t\t * @param {number[]} array - An array holding the RGBA values.\n\t\t * @param {number} [offset=0] - The offset into the array.\n\t\t * @param {boolean} [denormalize=false] - If true, denormalize the values, and array should be a typed array.\n\t\t * @returns {Color4} A reference to this color.\n\t\t */\n\t\tfromArray(array, offset = 0, denormalize = false) {\n\t\t\tlet r = array[offset],\n\t\t\t\tg = array[offset + 1],\n\t\t\t\tb = array[offset + 2],\n\t\t\t\ta = array[offset + 3];\n\t\t\tif (denormalize) {\n\t\t\t\tr = MathUtils.denormalize(r, array);\n\t\t\t\tg = MathUtils.denormalize(g, array);\n\t\t\t\tb = MathUtils.denormalize(b, array);\n\t\t\t\ta = MathUtils.denormalize(a, array);\n\t\t\t}\n\t\t\tthis.r = r;\n\t\t\tthis.g = g;\n\t\t\tthis.b = b;\n\t\t\tthis.a = a;\n\t\t\treturn this;\n\t\t}\n\n\t\t/**\n\t\t * Writes the RGBA components of this color to the given array. If no array is provided,\n\t\t * the method returns a new instance.\n\t\t * @param {number[]} [array=[]] - The target array holding the color components.\n\t\t * @param {number} [offset=0] - Index of the first element in the array.\n\t\t * @param {boolean} [normalize=false] - If true, normalize the values, and array should be a typed array.\n\t\t * @returns {number[]} The color components.\n\t\t */\n\t\ttoArray(array = [], offset = 0, normalize = false) {\n\t\t\tlet r = this.r,\n\t\t\t\tg = this.g,\n\t\t\t\tb = this.b,\n\t\t\t\ta = this.a;\n\t\t\tif (normalize) {\n\t\t\t\tr = MathUtils.normalize(r, array);\n\t\t\t\tg = MathUtils.normalize(g, array);\n\t\t\t\tb = MathUtils.normalize(b, array);\n\t\t\t\ta = MathUtils.normalize(a, array);\n\t\t\t}\n\t\t\tarray[offset] = r;\n\t\t\tarray[offset + 1] = g;\n\t\t\tarray[offset + 2] = b;\n\t\t\tarray[offset + 3] = a;\n\t\t\treturn array;\n\t\t}\n\t\t*[Symbol.iterator]() {\n\t\t\tyield this.r;\n\t\t\tyield this.g;\n\t\t\tyield this.b;\n\t\t\tyield this.a;\n\t\t}\n\t}\n\n\t/**\n\t * This flag can be used for type testing.\n\t * @readonly\n\t * @type {boolean}\n\t * @default true\n\t */\n\tColor4.prototype.isColor4 = true;\n\n\tconst _matrix$1 = new Matrix4();\n\n\t/**\n\t * Euler class.\n\t */\n\tclass Euler {\n\t\t/**\n\t\t * @param {number} [x=0]\n\t\t * @param {number} [y=0]\n\t\t * @param {number} [z=0]\n\t\t * @param {string} [order=Euler.DefaultOrder]\n\t\t */\n\t\tconstructor(x = 0, y = 0, z = 0, order = Euler.DefaultOrder) {\n\t\t\tthis._x = x;\n\t\t\tthis._y = y;\n\t\t\tthis._z = z;\n\t\t\tthis._order = order;\n\t\t}\n\n\t\t/**\n\t\t * @type {number}\n\t\t */\n\t\tget x() {\n\t\t\treturn this._x;\n\t\t}\n\n\t\t/**\n\t\t * @type {number}\n\t\t */\n\t\tset x(value) {\n\t\t\tthis._x = value;\n\t\t\tthis.onChangeCallback();\n\t\t}\n\n\t\t/**\n\t\t * @type {number}\n\t\t */\n\t\tget y() {\n\t\t\treturn this._y;\n\t\t}\n\n\t\t/**\n\t\t * @type {number}\n\t\t */\n\t\tset y(value) {\n\t\t\tthis._y = value;\n\t\t\tthis.onChangeCallback();\n\t\t}\n\n\t\t/**\n\t\t * @type {number}\n\t\t */\n\t\tget z() {\n\t\t\treturn this._z;\n\t\t}\n\n\t\t/**\n\t\t * @type {number}\n\t\t */\n\t\tset z(value) {\n\t\t\tthis._z = value;\n\t\t\tthis.onChangeCallback();\n\t\t}\n\n\t\t/**\n\t\t * @type {string}\n\t\t */\n\t\tget order() {\n\t\t\treturn this._order;\n\t\t}\n\n\t\t/**\n\t\t * @type {string}\n\t\t */\n\t\tset order(value) {\n\t\t\tthis._order = value;\n\t\t\tthis.onChangeCallback();\n\t\t}\n\n\t\t/**\n\t\t * Returns a new Euler with the same parameters as this one.\n\t\t * @returns {Euler}\n\t\t */\n\t\tclone() {\n\t\t\treturn new Euler(this._x, this._y, this._z, this._order);\n\t\t}\n\n\t\t/**\n\t\t * Copies value of euler to this euler.\n\t\t * @param {Euler} euler\n\t\t * @returns {Euler}\n\t\t */\n\t\tcopy(euler) {\n\t\t\tthis._x = euler._x;\n\t\t\tthis._y = euler._y;\n\t\t\tthis._z = euler._z;\n\t\t\tthis._order = euler._order;\n\t\t\tthis.onChangeCallback();\n\t\t\treturn this;\n\t\t}\n\n\t\t/**\n\t\t * @param {number} x - the angle of the x axis in radians.\n\t\t * @param {number} y - the angle of the y axis in radians.\n\t\t * @param {number} z - the angle of the z axis in radians.\n\t\t * @param {string} order - (optional) a string representing the order that the rotations are applied.\n\t\t * @returns {Euler}\n\t\t */\n\t\tset(x = 0, y = 0, z = 0, order = this._order) {\n\t\t\tthis._x = x;\n\t\t\tthis._y = y;\n\t\t\tthis._z = z;\n\t\t\tthis._order = order;\n\t\t\tthis.onChangeCallback();\n\t\t\treturn this;\n\t\t}\n\n\t\t/**\n\t\t * Sets the angles of this euler transform from a pure rotation matrix based on the orientation specified by order.\n\t\t * @param {Matrix4} m - a Matrix4 of which the upper 3x3 of matrix is a pure rotation matrix\n\t\t * @param {string} order - (optional) a string representing the order that the rotations are applied.\n\t\t * @param {boolean} [update=true] - Whether to notify Euler angle has changed\n\t\t * @returns {Euler}\n\t\t */\n\t\tsetFromRotationMatrix(m, order = this._order, update = true) {\n\t\t\t// assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)\n\n\t\t\tconst te = m.elements;\n\t\t\tconst m11 = te[0],\n\t\t\t\tm12 = te[4],\n\t\t\t\tm13 = te[8];\n\t\t\tconst m21 = te[1],\n\t\t\t\tm22 = te[5],\n\t\t\t\tm23 = te[9];\n\t\t\tconst m31 = te[2],\n\t\t\t\tm32 = te[6],\n\t\t\t\tm33 = te[10];\n\t\t\tif (order === 'XYZ') {\n\t\t\t\tthis._y = Math.asin(MathUtils.clamp(m13, -1, 1));\n\t\t\t\tif (Math.abs(m13) < 0.99999) {\n\t\t\t\t\tthis._x = Math.atan2(-m23, m33);\n\t\t\t\t\tthis._z = Math.atan2(-m12, m11);\n\t\t\t\t} else {\n\t\t\t\t\tthis._x = Math.atan2(m32, m22);\n\t\t\t\t\tthis._z = 0;\n\t\t\t\t}\n\t\t\t} else if (order === 'YXZ') {\n\t\t\t\tthis._x = Math.asin(-MathUtils.clamp(m23, -1, 1));\n\t\t\t\tif (Math.abs(m23) < 0.99999) {\n\t\t\t\t\tthis._y = Math.atan2(m13, m33);\n\t\t\t\t\tthis._z = Math.atan2(m21, m22);\n\t\t\t\t} else {\n\t\t\t\t\tthis._y = Math.atan2(-m31, m11);\n\t\t\t\t\tthis._z = 0;\n\t\t\t\t}\n\t\t\t} else if (order === 'ZXY') {\n\t\t\t\tthis._x = Math.asin(MathUtils.clamp(m32, -1, 1));\n\t\t\t\tif (Math.abs(m32) < 0.99999) {\n\t\t\t\t\tthis._y = Math.atan2(-m31, m33);\n\t\t\t\t\tthis._z = Math.atan2(-m12, m22);\n\t\t\t\t} else {\n\t\t\t\t\tthis._y = 0;\n\t\t\t\t\tthis._z = Math.atan2(m21, m11);\n\t\t\t\t}\n\t\t\t} else if (order === 'ZYX') {\n\t\t\t\tthis._y = Math.asin(-MathUtils.clamp(m31, -1, 1));\n\t\t\t\tif (Math.abs(m31) < 0.99999) {\n\t\t\t\t\tthis._x = Math.atan2(m32, m33);\n\t\t\t\t\tthis._z = Math.atan2(m21, m11);\n\t\t\t\t} else {\n\t\t\t\t\tthis._x = 0;\n\t\t\t\t\tthis._z = Math.atan2(-m12, m22);\n\t\t\t\t}\n\t\t\t} else if (order === 'YZX') {\n\t\t\t\tthis._z = Math.asin(MathUtils.clamp(m21, -1, 1));\n\t\t\t\tif (Math.abs(m21) < 0.99999) {\n\t\t\t\t\tthis._x = Math.atan2(-m23, m22);\n\t\t\t\t\tthis._y = Math.atan2(-m31, m11);\n\t\t\t\t} else {\n\t\t\t\t\tthis._x = 0;\n\t\t\t\t\tthis._y = Math.atan2(m13, m33);\n\t\t\t\t}\n\t\t\t} else if (order === 'XZY') {\n\t\t\t\tthis._z = Math.asin(-MathUtils.clamp(m12, -1, 1));\n\t\t\t\tif (Math.abs(m12) < 0.99999) {\n\t\t\t\t\tthis._x = Math.atan2(m32, m22);\n\t\t\t\t\tthis._y = Math.atan2(m13, m11);\n\t\t\t\t} else {\n\t\t\t\t\tthis._x = Math.atan2(-m23, m33);\n\t\t\t\t\tthis._y = 0;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tconsole.warn('given unsupported order: ' + order);\n\t\t\t}\n\t\t\tthis._order = order;\n\t\t\tif (update === true) this.onChangeCallback();\n\t\t\treturn this;\n\t\t}\n\n\t\t/**\n\t\t * Sets the angles of this euler transform from a normalized quaternion based on the orientation specified by order.\n\t\t * @param {Quaternion} q - a normalized quaternion.\n\t\t * @param {string} order - (optional) a string representing the order that the rotations are applied.\n\t\t * @param {boolean} [update=true] - Whether to notify Euler angle has changed\n\t\t * @returns {Euler}\n\t\t */\n\t\tsetFromQuaternion(q, order, update) {\n\t\t\tq.toMatrix4(_matrix$1);\n\t\t\treturn this.setFromRotationMatrix(_matrix$1, order, update);\n\t\t}\n\n\t\t/**\n\t\t * @param {Function} callback - When the Euler angle value changes, the callback method is triggered\n\t\t * @returns {Euler}\n\t\t */\n\t\tonChange(callback) {\n\t\t\tthis.onChangeCallback = callback;\n\t\t\treturn this;\n\t\t}\n\t\tonChangeCallback() {}\n\t\t*[Symbol.iterator]() {\n\t\t\tyield this._x;\n\t\t\tyield this._y;\n\t\t\tyield this._z;\n\t\t\tyield this._order;\n\t\t}\n\t}\n\n\t/**\n\t * This flag can be used for type testing.\n\t * @readonly\n\t * @type {boolean}\n\t * @default true\n\t */\n\tEuler.prototype.isEuler = true;\n\n\t/**\n\t * The order in which to apply rotations.\n\t * @readonly\n\t */\n\tEuler.RotationOrders = ['XYZ', 'YZX', 'ZXY', 'XZY', 'YXZ', 'ZYX'];\n\n\t/**\n\t * The default order in which to apply rotations.\n\t * @readonly\n\t */\n\tEuler.DefaultOrder = 'XYZ';\n\n\t/**\n\t * The 3x3 matrix class.\n\t */\n\tclass Matrix3 {\n\t\t/**\n\t\t * Create a 3x3 matrix.\n\t\t */\n\t\tconstructor() {\n\t\t\tthis.elements = [1, 0, 0, 0, 1, 0, 0, 0, 1];\n\t\t}\n\n\t\t/**\n\t\t * Sets the 3x3 matrix values to the given row-major sequence of values.\n\t\t * @param {number} n11 - value to put in row 1, col 1.\n\t\t * @param {number} n12 - value to put in row 1, col 2.\n\t\t * @param {number} n13 - value to put in row 1, col 3.\n\t\t * @param {number} n21 - value to put in row 2, col 1.\n\t\t * @param {number} n22 - value to put in row 2, col 2.\n\t\t * @param {number} n23 - value to put in row 2, col 3.\n\t\t * @param {number} n31 - value to put in row 3, col 1.\n\t\t * @param {number} n32 - value to put in row 3, col 2.\n\t\t * @param {number} n33 - value to put in row 3, col 3.\n\t\t * @returns {Matrix3}\n\t\t */\n\t\tset(n11, n12, n13, n21, n22, n23, n31, n32, n33) {\n\t\t\tconst ele = this.elements;\n\t\t\tele[0] = n11;\n\t\t\tele[3] = n12;\n\t\t\tele[6] = n13;\n\t\t\tele[1] = n21;\n\t\t\tele[4] = n22;\n\t\t\tele[7] = n23;\n\t\t\tele[2] = n31;\n\t\t\tele[5] = n32;\n\t\t\tele[8] = n33;\n\t\t\treturn this;\n\t\t}\n\n\t\t/**\n\t\t * Resets this matrix to the 3x3 identity matrix\n\t\t * @returns {Matrix3}\n\t\t */\n\t\tidentity() {\n\t\t\treturn this.set(1, 0, 0, 0, 1, 0, 0, 0, 1);\n\t\t}\n\n\t\t/**\n\t\t * Checks if the matrix is an identity matrix.\n\t\t * @returns {boolean} - True if the matrix is an identity matrix, false otherwise.\n\t\t */\n\t\tisIdentity() {\n\t\t\tconst te = this.elements;\n\t\t\treturn te[0] === 1 && te[3] === 0 && te[6] === 0 && te[1] === 0 && te[4] === 1 && te[7] === 0 && te[2] === 0 && te[5] === 0 && te[8] === 1;\n\t\t}\n\n\t\t/**\n\t\t * Computes and returns the determinant of this matrix.\n\t\t * @returns {number} The determinant.\n\t\t */\n\t\tdeterminant() {\n\t\t\tconst te = this.elements;\n\t\t\tconst a = te[0],\n\t\t\t\tb = te[1],\n\t\t\t\tc = te[2],\n\t\t\t\td = te[3],\n\t\t\t\te = te[4],\n\t\t\t\tf = te[5],\n\t\t\t\tg = te[6],\n\t\t\t\th = te[7],\n\t\t\t\ti = te[8];\n\t\t\treturn a * e * i - a * f * h - b * d * i + b * f * g + c * d * h - c * e * g;\n\t\t}\n\n\t\t/**\n\t\t * Inverts this matrix, using the [analytic method]{@link https://en.wikipedia.org/wiki/Invertible_matrix#Analytic_solution}.\n\t\t * You can not invert with a determinant of zero. If you attempt this, the method produces\n\t\t * a zero matrix instead.\n\t\t * @returns {Matrix3} A reference to this matrix.\n\t\t */\n\t\tinvert() {\n\t\t\tconst te = this.elements,\n\t\t\t\tn11 = te[0],\n\t\t\t\tn21 = te[1],\n\t\t\t\tn31 = te[2],\n\t\t\t\tn12 = te[3],\n\t\t\t\tn22 = te[4],\n\t\t\t\tn32 = te[5],\n\t\t\t\tn13 = te[6],\n\t\t\t\tn23 = te[7],\n\t\t\t\tn33 = te[8],\n\t\t\t\tt11 = n33 * n22 - n32 * n23,\n\t\t\t\tt12 = n32 * n13 - n33 * n12,\n\t\t\t\tt13 = n23 * n12 - n22 * n13,\n\t\t\t\tdet = n11 * t11 + n21 * t12 + n31 * t13;\n\t\t\tif (det === 0) return this.set(0, 0, 0, 0, 0, 0, 0, 0, 0);\n\t\t\tconst detInv = 1 / det;\n\t\t\tte[0] = t11 * detInv;\n\t\t\tte[1] = (n31 * n23 - n33 * n21) * detInv;\n\t\t\tte[2] = (n32 * n21 - n31 * n22) * detInv;\n\t\t\tte[3] = t12 * detInv;\n\t\t\tte[4] = (n33 * n11 - n31 * n13) * detInv;\n\t\t\tte[5] = (n31 * n12 - n32 * n11) * detInv;\n\t\t\tte[6] = t13 * detInv;\n\t\t\tte[7] = (n21 * n13 - n23 * n11) * detInv;\n\t\t\tte[8] = (n22 * n11 - n21 * n12) * detInv;\n\t\t\treturn this;\n\t\t}\n\n\t\t/**\n\t\t * Transposes this matrix in place.\n\t\t * @returns {Matrix3}\n\t\t */\n\t\ttranspose() {\n\t\t\tlet tmp;\n\t\t\tconst m = this.elements;\n\t\t\ttmp = m[1];\n\t\t\tm[1] = m[3];\n\t\t\tm[3] = tmp;\n\t\t\ttmp = m[2];\n\t\t\tm[2] = m[6];\n\t\t\tm[6] = tmp;\n\t\t\ttmp = m[5];\n\t\t\tm[5] = m[7];\n\t\t\tm[7] = tmp;\n\t\t\treturn this;\n\t\t}\n\n\t\t/**\n\t\t * Return true if this matrix and m are equal.\n\t\t * @param {Matrix3} matrix\n\t\t * @returns {boolean}\n\t\t */\n\t\tequals(matrix) {\n\t\t\tconst te = this.elements;\n\t\t\tconst me = matrix.elements;\n\t\t\tfor (let i = 0; i < 9; i++) {\n\t\t\t\tif (te[i] !== me[i]) return false;\n\t\t\t}\n\t\t\treturn true;\n\t\t}\n\n\t\t/**\n\t\t * Sets the elements of this matrix based on an array in column-major format.\n\t\t * @param {number[]} array\n\t\t * @param {number} [offset=0]\n\t\t * @returns {Matrix3}\n\t\t */\n\t\tfromArray(array, offset = 0) {\n\t\t\tfor (let i = 0; i < 9; i++) {\n\t\t\t\tthis.elements[i] = array[i + offset];\n\t\t\t}\n\t\t\treturn this;\n\t\t}\n\n\t\t/**\n\t\t * Writes the elements of this matrix to an array in column-major format.\n\t\t * @param {number[]} [array]\n\t\t * @param {number} [offset=0]\n\t\t * @returns {number[]}\n\t\t */\n\t\ttoArray(array = [], offset = 0) {\n\t\t\tconst te = this.elements;\n\t\t\tarray[offset] = te[0];\n\t\t\tarray[offset + 1] = te[1];\n\t\t\tarray[offset + 2] = te[2];\n\t\t\tarray[offset + 3] = te[3];\n\t\t\tarray[offset + 4] = te[4];\n\t\t\tarray[offset + 5] = te[5];\n\t\t\tarray[offset + 6] = te[6];\n\t\t\tarray[offset + 7] = te[7];\n\t\t\tarray[offset + 8] = te[8];\n\t\t\treturn array;\n\t\t}\n\n\t\t/**\n\t\t * Creates a new Matrix3 and with identical elements to this one.\n\t\t * @returns {Matrix3}\n\t\t */\n\t\tclone() {\n\t\t\treturn new Matrix3().fromArray(this.elements);\n\t\t}\n\n\t\t/**\n\t\t * Copies the elements of matrix m into this matrix.\n\t\t * @param {Matrix3} m\n\t\t * @returns {Matrix3}\n\t\t */\n\t\tcopy(m) {\n\t\t\tconst te = this.elements;\n\t\t\tconst me = m.elements;\n\t\t\tte[0] = me[0];\n\t\t\tte[1] = me[1];\n\t\t\tte[2] = me[2];\n\t\t\tte[3] = me[3];\n\t\t\tte[4] = me[4];\n\t\t\tte[5] = me[5];\n\t\t\tte[6] = me[6];\n\t\t\tte[7] = me[7];\n\t\t\tte[8] = me[8];\n\t\t\treturn this;\n\t\t}\n\n\t\t/**\n\t\t * Post-multiplies this matrix by m.\n\t\t * @param {Matrix3} m\n\t\t * @returns {Matrix3}\n\t\t */\n\t\tmultiply(m) {\n\t\t\treturn this.multiplyMatrices(this, m);\n\t\t}\n\n\t\t/**\n\t\t * Pre-multiplies this matrix by m.\n\t\t * @param {Matrix3} m\n\t\t * @returns {Matrix3}\n\t\t */\n\t\tpremultiply(m) {\n\t\t\treturn this.multiplyMatrices(m, this);\n\t\t}\n\n\t\t/**\n\t\t * Sets this matrix to a x b.\n\t\t * @param {Matrix3} a\n\t\t * @param {Matrix3} b\n\t\t * @returns {Matrix3}\n\t\t */\n\t\tmultiplyMatrices(a, b) {\n\t\t\tconst ae = a.elements;\n\t\t\tconst be = b.elements;\n\t\t\tconst te = this.elements;\n\t\t\tconst a11 = ae[0],\n\t\t\t\ta12 = ae[3],\n\t\t\t\ta13 = ae[6];\n\t\t\tconst a21 = ae[1],\n\t\t\t\ta22 = ae[4],\n\t\t\t\ta23 = ae[7];\n\t\t\tconst a31 = ae[2],\n\t\t\t\ta32 = ae[5],\n\t\t\t\ta33 = ae[8];\n\t\t\tconst b11 = be[0],\n\t\t\t\tb12 = be[3],\n\t\t\t\tb13 = be[6];\n\t\t\tconst b21 = be[1],\n\t\t\t\tb22 = be[4],\n\t\t\t\tb23 = be[7];\n\t\t\tconst b31 = be[2],\n\t\t\t\tb32 = be[5],\n\t\t\t\tb33 = be[8];\n\t\t\tte[0] = a11 * b11 + a12 * b21 + a13 * b31;\n\t\t\tte[3] = a11 * b12 + a12 * b22 + a13 * b32;\n\t\t\tte[6] = a11 * b13 + a12 * b23 + a13 * b33;\n\t\t\tte[1] = a21 * b11 + a22 * b21 + a23 * b31;\n\t\t\tte[4] = a21 * b12 + a22 * b22 + a23 * b32;\n\t\t\tte[7] = a21 * b13 + a22 * b23 + a23 * b33;\n\t\t\tte[2] = a31 * b11 + a32 * b21 + a33 * b31;\n\t\t\tte[5] = a31 * b12 + a32 * b22 + a33 * b32;\n\t\t\tte[8] = a31 * b13 + a32 * b23 + a33 * b33;\n\t\t\treturn this;\n\t\t}\n\n\t\t/**\n\t\t * Transform 2D\n\t\t * @param {number} x - position.x\n\t\t * @param {number} y - position.y\n\t\t * @param {number} scaleX - scale.x\n\t\t * @param {number} scaleY - scale.y\n\t\t * @param {number} rotation - rotation\n\t\t * @param {number} anchorX - anchor.x\n\t\t * @param {number} anchorY - anchor.y\n\t\t * @returns {Matrix3}\n\t\t */\n\t\ttransform(x, y, scaleX, scaleY, rotation, anchorX, anchorY) {\n\t\t\tconst te = this.elements;\n\t\t\tconst cr = Math.cos(rotation);\n\t\t\tconst sr = Math.sin(rotation);\n\t\t\tte[0] = cr * scaleX;\n\t\t\tte[3] = -sr * scaleY;\n\t\t\tte[6] = x;\n\t\t\tte[1] = sr * scaleX;\n\t\t\tte[4] = cr * scaleY;\n\t\t\tte[7] = y;\n\t\t\tte[2] = 0;\n\t\t\tte[5] = 0;\n\t\t\tte[8] = 1;\n\t\t\tif (anchorX || anchorY) {\n\t\t\t\t// prepend the anchor offset:\n\t\t\t\tte[6] -= anchorX * te[0] + anchorY * te[3];\n\t\t\t\tte[7] -= anchorX * te[1] + anchorY * te[4];\n\t\t\t}\n\t\t\treturn this;\n\t\t}\n\n\t\t/**\n\t\t * Set the transformation matrix of uv coordinates\n\t\t * @param {number} tx\n\t\t * @param {number} ty\n\t\t * @param {number} sx\n\t\t * @param {number} sy\n\t\t * @param {number} rotation\n\t\t * @param {number} cx\n\t\t * @param {number} cy\n\t\t * @returns {Matrix3}\n\t\t */\n\t\tsetUvTransform(tx, ty, sx, sy, rotation, cx, cy) {\n\t\t\tconst c = Math.cos(rotation);\n\t\t\tconst s = Math.sin(rotation);\n\t\t\treturn this.set(sx * c, sx * s, -sx * (c * cx + s * cy) + cx + tx, -sy * s, sy * c, -sy * (-s * cx + c * cy) + cy + ty, 0, 0, 1);\n\t\t}\n\n\t\t/**\n\t\t * Sets the matri3 planes from the matrix4.\n\t\t * @param {Matrix4} m\n\t\t * @returns {Matrix3}\n\t\t */\n\t\tsetFromMatrix4(m) {\n\t\t\tconst me = m.elements;\n\t\t\treturn this.set(me[0], me[4], me[8], me[1], me[5], me[9], me[2], me[6], me[10]);\n\t\t}\n\n\t\t/**\n\t\t * Extracts the basis vectors from the matrix.\n\t\t * @param {Vector3} xAxis\n\t\t * @param {Vector3} yAxis\n\t\t * @param {Vector3} zAxis\n\t\t * @returns {Matrix3}\n\t\t */\n\t\textractBasis(xAxis, yAxis, zAxis) {\n\t\t\tconst te = this.elements;\n\t\t\txAxis.fromArray(te);\n\t\t\tyAxis.fromArray(te, 3);\n\t\t\tzAxis.fromArray(te, 6);\n\t\t\treturn this;\n\t\t}\n\t}\n\n\t/**\n\t * This flag can be used for type testing.\n\t * @readonly\n\t * @type {boolean}\n\t * @default true\n\t */\n\tMatrix3.prototype.isMatrix3 = true;\n\n\tconst _vec3_1$4 = new Vector3();\n\tconst _vec3_2$1 = new Vector3();\n\tconst _mat3_1$1 = new Matrix3();\n\n\t/**\n\t * A two dimensional surface that extends infinitely in 3d space,\n\t * represented in Hessian normal form by a unit length normal vector and a constant.\n\t */\n\tclass Plane {\n\t\t/**\n\t\t * Constructs a new Plane.\n\t\t * @param {Vector3} [normal=Vector3(1, 0, 0)] - A unit length Vector3 defining the normal of the plane.\n\t\t * @param {number} [constant=0] - The signed distance from the origin to the plane.\n\t\t */\n\t\tconstructor(normal = new Vector3(1, 0, 0), constant = 0) {\n\t\t\tthis.normal = normal;\n\t\t\tthis.constant = constant;\n\t\t}\n\n\t\t/**\n\t\t * Solve a system of equations to find the point where the three planes intersect.\n\t\t * @param {Plane} p1 - The first plane.\n\t\t * @param {Plane} p2 - The second plane.\n\t\t * @param {Plane} p3 - The third plane.\n\t\t * @param {Vector3} target - The result will be copied into this Vector3.\n\t\t * @returns {Vector3}\n\t\t */\n\t\tstatic intersectPlanes(p1, p2, p3, target) {\n\t\t\t// Create the matrix using the normals of the planes as rows\n\t\t\t_mat3_1$1.set(p1.normal.x, p1.normal.y, p1.normal.z, p2.normal.x, p2.normal.y, p2.normal.z, p3.normal.x, p3.normal.y, p3.normal.z);\n\n\t\t\t// Create the vector using the constants of the planes\n\t\t\ttarget.set(-p1.constant, -p2.constant, -p3.constant);\n\n\t\t\t// Solve for X by applying the inverse matrix to vector\n\t\t\ttarget.applyMatrix3(_mat3_1$1.invert());\n\t\t\treturn target;\n\t\t}\n\n\t\t/**\n\t\t * Sets this plane's normal and constant properties by copying the values from the given normal.\n\t\t * @param {Vector3} normal - a unit length Vector3 defining the normal of the plane.\n\t\t * @param {number} constant - the signed distance from the origin to the plane. Default is 0.\n\t\t * @returns {Plane}\n\t\t */\n\t\tset(normal, constant) {\n\t\t\tthis.normal.copy(normal);\n\t\t\tthis.constant = constant;\n\t\t\treturn this;\n\t\t}\n\n\t\t/**\n\t\t * Set the individual components that define the plane.\n\t\t * @param {number} x - x value of the unit length normal vector.\n\t\t * @param {number} y - y value of the unit length normal vector.\n\t\t * @param {number} z - z value of the unit length normal vector.\n\t\t * @param {number} w - the value of the plane's constant property.\n\t\t * @returns {Plane}\n\t\t */\n\t\tsetComponents(x, y, z, w) {\n\t\t\tthis.normal.set(x, y, z);\n\t\t\tthis.constant = w;\n\t\t\treturn this;\n\t\t}\n\n\t\t/**\n\t\t * Sets the plane's properties as defined by a normal and an arbitrary coplanar point.\n\t\t * @param {Vector3} normal - a unit length Vector3 defining the normal of the plane.\n\t\t * @param {Vector3} point - Vector3\n\t\t * @returns {Plane}\n\t\t */\n\t\tsetFromNormalAndCoplanarPoint(normal, point) {\n\t\t\tthis.normal.copy(normal);\n\t\t\tthis.constant = -point.dot(this.normal);\n\t\t\treturn this;\n\t\t}\n\n\t\t/**\n\t\t * Defines the plane based on the 3 provided points.\n\t\t * The winding order is assumed to be counter-clockwise, and determines the direction of the normal.\n\t\t * @param {Vector3} a - first point on the plane.\n\t\t * @param {Vector3} b - second point on the plane.\n\t\t * @param {Vector3} c - third point on the plane.\n\t\t * @returns {Plane}\n\t\t */\n\t\tsetFromCoplanarPoints(a, b, c) {\n\t\t\tconst normal = _vec3_1$4.subVectors(c, b).cross(_vec3_2$1.subVectors(a, b)).normalize();\n\t\t\t// Q: should an error be thrown if normal is zero (e.g. degenerate plane)?\n\t\t\tthis.setFromNormalAndCoplanarPoint(normal, a);\n\t\t\treturn this;\n\t\t}\n\n\t\t/**\n\t\t * Normalizes the normal vector, and adjusts the constant value accordingly.\n\t\t * @returns {Plane}\n\t\t */\n\t\tnormalize() {\n\t\t\t// Note: will lead to a divide by zero if the plane is invalid.\n\n\t\t\tconst inverseNormalLength = 1.0 / this.normal.getLength();\n\t\t\tthis.normal.multiplyScalar(inverseNormalLength);\n\t\t\tthis.constant *= inverseNormalLength;\n\t\t\treturn this;\n\t\t}\n\n\t\t/**\n\t\t * Returns the signed distance from the point to the plane.\n\t\t * @param {Vector3} point\n\t\t * @returns {number}\n\t\t */\n\t\tdistanceToPoint(point) {\n\t\t\treturn this.normal.dot(point) + this.constant;\n\t\t}\n\n\t\t/**\n\t\t * Projects a point onto the plane.\n\t\t * @param {Vector3} point - the Vector3 to project onto the plane.\n\t\t * @param {Vector3} [target] - the result will be copied into this Vector3.\n\t\t * @returns {Vector3}\n\t\t */\n\t\tprojectPoint(point, target = new Vector3()) {\n\t\t\treturn target.copy(point).addScaledVector(this.normal, -this.distanceToPoint(point));\n\t\t}\n\n\t\t/**\n\t\t * Reflects a point through the plane.\n\t\t * @param {Vector3} point - the Vector3 to reflect through the plane.\n\t\t * @param {Vector3} [target] - the result will be copied into this Vector3.\n\t\t * @returns {Vector3}\n\t\t */\n\t\tmirrorPoint(point, target = new Vector3()) {\n\t\t\tconst distance = this.distanceToPoint(point);\n\t\t\treturn target.copy(point).addScaledVector(this.normal, -2 * distance);\n\t\t}\n\n\t\t/**\n\t\t * Returns a Vector3 coplanar to the plane, by calculating the projection of the normal vector at the origin onto the plane.\n\t\t * @param {Vector3} [target]\n\t\t * @returns {Vector3}\n\t\t */\n\t\tcoplanarPoint(target = new Vector3()) {\n\t\t\treturn target.copy(this.normal).multiplyScalar(-this.constant);\n\t\t}\n\n\t\t/**\n\t\t * Returns a new plane with the same normal and constant as this one.\n\t\t * @returns {Plane}\n\t\t */\n\t\tclone() {\n\t\t\treturn new Plane().copy(this);\n\t\t}\n\n\t\t/**\n\t\t * Copies the values of the passed plane's normal and constant properties to this plane.\n\t\t * @param {Plane} plane\n\t\t * @returns {Plane}\n\t\t */\n\t\tcopy(plane) {\n\t\t\tthis.normal.copy(plane.normal);\n\t\t\tthis.constant = plane.constant;\n\t\t\treturn this;\n\t\t}\n\n\t\t/**\n\t\t * Apply a Matrix4 to the plane. The matrix must be an affine, homogeneous transform.\n\t\t * @param {Matrix4} matrix - the Matrix4 to apply.\n\t\t * @param {Matrix3} [optionalNormalMatrix] - (optional) pre-computed normal Matrix3 of the Matrix4 being applied.\n\t\t * @returns {Plane}\n\t\t */\n\t\tapplyMatrix4(matrix, optionalNormalMatrix) {\n\t\t\tconst normalMatrix = optionalNormalMatrix || _mat3_1$1.setFromMatrix4(matrix).invert().transpose();\n\t\t\tconst referencePoint = this.coplanarPoint(_vec3_1$4).applyMatrix4(matrix);\n\t\t\tconst normal = this.normal.applyMatrix3(normalMatrix).normalize();\n\t\t\tthis.constant = -referencePoint.dot(normal);\n\t\t\treturn this;\n\t\t}\n\t}\n\n\t/**\n\t * This flag can be used for type testing.\n\t * @readonly\n\t * @type {boolean}\n\t * @default true\n\t */\n\tPlane.prototype.isPlane = true;\n\n\tconst _vec3_1$3 = new Vector3();\n\tconst _mat3_1 = new Matrix3();\n\n\t/**\n\t * Frustums are used to determine what is inside the camera's field of view.\n\t * They help speed up the rendering process - objects which lie outside a camera's frustum can safely be excluded from rendering.\n\t */\n\tclass Frustum {\n\t\t/**\n\t\t * @param {Plane} p0 - (optional) defaults to a new Plane.\n\t\t * @param {Plane} p1 - (optional) defaults to a new Plane.\n\t\t * @param {Plane} p2 - (optional) defaults to a new Plane.\n\t\t * @param {Plane} p3 - (optional) defaults to a new Plane.\n\t\t * @param {Plane} p4 - (optional) defaults to a new Plane.\n\t\t * @param {Plane} p5 - (optional) defaults to a new Plane.\n\t\t */\n\t\tconstructor(p0 = new Plane(), p1 = new Plane(), p2 = new Plane(), p3 = new Plane(), p4 = new Plane(), p5 = new Plane()) {\n\t\t\tthis.planes = [p0, p1, p2, p3, p4, p5];\n\t\t}\n\n\t\t/**\n\t\t * Sets the frustum from the passed planes. No plane order is implied.\n\t\t * @param {Plane} p0 - (optional) defaults to a new Plane.\n\t\t * @param {Plane} p1 - (optional) defaults to a new Plane.\n\t\t * @param {Plane} p2 - (optional) defaults to a new Plane.\n\t\t * @param {Plane} p3 - (optional) defaults to a new Plane.\n\t\t * @param {Plane} p4 - (optional) defaults to a new Plane.\n\t\t * @param {Plane} p5 - (optional) defaults to a new Plane.\n\t\t * @returns {Frustum}\n\t\t */\n\t\tset(p0, p1, p2, p3, p4, p5) {\n\t\t\tconst planes = this.planes;\n\t\t\tplanes[0].copy(p0);\n\t\t\tplanes[1].copy(p1);\n\t\t\tplanes[2].copy(p2);\n\t\t\tplanes[3].copy(p3);\n\t\t\tplanes[4].copy(p4);\n\t\t\tplanes[5].copy(p5);\n\t\t\treturn this;\n\t\t}\n\n\t\t/**\n\t\t * Sets the frustum planes from the matrix.\n\t\t * @param {Matrix4} m - a Matrix4 used to set the planes\n\t\t * @returns {Frustum}\n\t\t */\n\t\tsetFromMatrix(m) {\n\t\t\tconst planes = this.planes;\n\t\t\tconst me = m.elements;\n\t\t\tconst me0 = me[0],\n\t\t\t\tme1 = me[1],\n\t\t\t\tme2 = me[2],\n\t\t\t\tme3 = me[3];\n\t\t\tconst me4 = me[4],\n\t\t\t\tme5 = me[5],\n\t\t\t\tme6 = me[6],\n\t\t\t\tme7 = me[7];\n\t\t\tconst me8 = me[8],\n\t\t\t\tme9 = me[9],\n\t\t\t\tme10 = me[10],\n\t\t\t\tme11 = me[11];\n\t\t\tconst me12 = me[12],\n\t\t\t\tme13 = me[13],\n\t\t\t\tme14 = me[14],\n\t\t\t\tme15 = me[15];\n\t\t\tplanes[0].setComponents(me3 - me0, me7 - me4, me11 - me8, me15 - me12).normalize();\n\t\t\tplanes[1].setComponents(me3 + me0, me7 + me4, me11 + me8, me15 + me12).normalize();\n\t\t\tplanes[2].setComponents(me3 + me1, me7 + me5, me11 + me9, me15 + me13).normalize();\n\t\t\tplanes[3].setComponents(me3 - me1, me7 - me5, me11 - me9, me15 - me13).normalize();\n\t\t\tplanes[4].setComponents(me3 - me2, me7 - me6, me11 - me10, me15 - me14).normalize();\n\t\t\tplanes[5].setComponents(me3 + me2, me7 + me6, me11 + me10, me15 + me14).normalize();\n\t\t\treturn this;\n\t\t}\n\n\t\t/**\n\t\t * Return true if sphere intersects with this frustum.\n\t\t * @param {Sphere} sphere - Sphere to check for intersection.\n\t\t * @returns {boolean}\n\t\t */\n\t\tintersectsSphere(sphere) {\n\t\t\tconst planes = this.planes;\n\t\t\tconst center = sphere.center;\n\t\t\tconst negRadius = -sphere.radius;\n\t\t\tfor (let i = 0; i < 6; i++) {\n\t\t\t\tconst distance = planes[i].distanceToPoint(center);\n\t\t\t\tif (distance < negRadius) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t}\n\n\t\t/**\n\t\t * Return true if box intersects with this frustum.\n\t\t * @param {Box3} box - Box3 to check for intersection.\n\t\t * @returns {boolean}\n\t\t */\n\t\tintersectsBox(box) {\n\t\t\tconst planes = this.planes;\n\t\t\tfor (let i = 0; i < 6; i++) {\n\t\t\t\tconst plane = planes[i];\n\n\t\t\t\t// corner at max distance\n\n\t\t\t\t_vec3_1$3.x = plane.normal.x > 0 ? box.max.x : box.min.x;\n\t\t\t\t_vec3_1$3.y = plane.normal.y > 0 ? box.max.y : box.min.y;\n\t\t\t\t_vec3_1$3.z = plane.normal.z > 0 ? box.max.z : box.min.z;\n\n\t\t\t\t// if both outside plane, no intersection\n\n\t\t\t\tif (plane.distanceToPoint(_vec3_1$3) < 0) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t}\n\n\t\t/**\n\t\t * Apply a matrix4x4 to the frustum.\n\t\t * @param {Matrix4} matrix - Matrix4 to apply to the frustum.\n\t\t * @returns {Frustum}\n\t\t */\n\t\tapplyMatrix4(matrix) {\n\t\t\tconst planes = this.planes;\n\t\t\tconst normalMatrix = _mat3_1.setFromMatrix4(matrix).invert().transpose();\n\t\t\tfor (let i = 0; i < 6; i++) {\n\t\t\t\tplanes[i].applyMatrix4(matrix, normalMatrix);\n\t\t\t}\n\t\t\treturn this;\n\t\t}\n\n\t\t/**\n\t\t * Return a new Frustum with the same parameters as this one.\n\t\t * @returns {Frustum}\n\t\t */\n\t\tclone() {\n\t\t\treturn new this.constructor().copy(this);\n\t\t}\n\n\t\t/**\n\t\t * Copies the properties of the passed frustum into this one.\n\t\t * @param {Frustum} frustum - The frustum to copy\n\t\t * @returns {Frustum}\n\t\t */\n\t\tcopy(frustum) {\n\t\t\tconst planes = this.planes;\n\t\t\tfor (let i = 0; i < 6; i++) {\n\t\t\t\tplanes[i].copy(frustum.planes[i]);\n\t\t\t}\n\t\t\treturn this;\n\t\t}\n\t}\n\n\t/**\n\t * This flag can be used for type testing.\n\t * @readonly\n\t * @type {boolean}\n\t * @default true\n\t */\n\tFrustum.prototype.isFrustum = true;\n\n\tconst _vec3_1$2 = new Vector3();\n\tconst _diff = new Vector3();\n\tconst _edge1 = new Vector3();\n\tconst _edge2 = new Vector3();\n\tconst _normal = new Vector3();\n\n\t/**\n\t * A ray that emits from an origin in a certain direction. This is used by\n\t * {@link Raycaster} to assist with raycasting. Raycasting is used for\n\t * mouse picking (working out what objects in the 3D space the mouse is over)\n\t * amongst other things.\n\t */\n\tclass Ray {\n\t\t/**\n\t\t * Constructs a new ray.\n\t\t * @param {Vector3} [origin=(0,0,0)] - The origin of the ray.\n\t\t * @param {Vector3} [direction=(0,0,-1)] - The (normalized) direction of the ray.\n\t\t */\n\t\tconstructor(origin = new Vector3(), direction = new Vector3(0, 0, -1)) {\n\t\t\t/**\n\t\t\t * The origin of the ray.\n\t\t\t * @type {Vector3}\n\t\t\t */\n\t\t\tthis.origin = origin;\n\n\t\t\t/**\n\t\t\t * The (normalized) direction of the ray.\n\t\t\t * @type {Vector3}\n\t\t\t */\n\t\t\tthis.direction = direction;\n\t\t}\n\n\t\t/**\n\t\t * Sets the ray's components by copying the given values.\n\t\t * @param {Vector3} origin - The origin.\n\t\t * @param {Vector3} direction - The direction.\n\t\t * @returns {Ray} A reference to this ray.\n\t\t */\n\t\tset(origin, direction) {\n\t\t\tthis.origin.copy(origin);\n\t\t\tthis.direction.copy(direction);\n\t\t\treturn this;\n\t\t}\n\n\t\t/**\n\t\t * Copies the values of the given ray to this instance.\n\t\t * @param {Ray} ray - The ray to copy.\n\t\t * @returns {Ray} A reference to this ray.\n\t\t */\n\t\tcopy(ray) {\n\t\t\tthis.origin.copy(ray.origin);\n\t\t\tthis.direction.copy(ray.direction);\n\t\t\treturn this;\n\t\t}\n\n\t\t/**\n\t\t * Returns a vector that is located at a given distance along this ray.\n\t\t * @param {number} t - The distance along the ray to retrieve a position for.\n\t\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t\t * @returns {Vector3} A position on the ray.\n\t\t */\n\t\tat(t, target = new Vector3()) {\n\t\t\treturn target.copy(this.origin).addScaledVector(this.direction, t);\n\t\t}\n\n\t\t/**\n\t\t * Shift the origin of this ray along its direction by the given distance.\n\t\t * @param {number} t - The distance along the ray to interpolate.\n\t\t * @returns {Ray} A reference to this ray.\n\t\t */\n\t\trecast(t) {\n\t\t\tthis.origin.copy(this.at(t, _vec3_1$2));\n\t\t\treturn this;\n\t\t}\n\n\t\t/**\n\t\t * Returns the point along this ray that is closest to the given point.\n\t\t * @param {Vector3} point - A point in 3D space to get the closet location on the ray for.\n\t\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t\t * @returns {Vector3} The closest point on this ray.\n\t\t */\n\t\tclosestPointToPoint(point, target) {\n\t\t\ttarget.subVectors(point, this.origin);\n\t\t\tconst directionDistance = target.dot(this.direction);\n\t\t\tif (directionDistance < 0) {\n\t\t\t\treturn target.copy(this.origin);\n\t\t\t}\n\t\t\treturn target.copy(this.origin).addScaledVector(this.direction, directionDistance);\n\t\t}\n\n\t\t/**\n\t\t * Returns the distance of the closest approach between this ray and the given point.\n\t\t * @param {Vector3} point - A point in 3D space to compute the distance to.\n\t\t * @returns {number} The distance.\n\t\t */\n\t\tdistanceToPoint(point) {\n\t\t\treturn Math.sqrt(this.distanceSqToPoint(point));\n\t\t}\n\n\t\t/**\n\t\t * Returns the squared distance of the closest approach between this ray and the given point.\n\t\t * @param {Vector3} point - A point in 3D space to compute the distance to.\n\t\t * @returns {number} The squared distance.\n\t\t */\n\t\tdistanceSqToPoint(point) {\n\t\t\tconst directionDistance = _vec3_1$2.subVectors(point, this.origin).dot(this.direction);\n\t\t\tif (directionDistance < 0) {\n\t\t\t\treturn this.origin.distanceToSquared(point);\n\t\t\t}\n\t\t\t_vec3_1$2.copy(this.direction).multiplyScalar(directionDistance).add(this.origin);\n\t\t\treturn _vec3_1$2.distanceToSquared(point);\n\t\t}\n\n\t\t/**\n\t\t * Intersects this ray with the given sphere, returning the intersection\n\t\t * point or `null` if there is no intersection.\n\t\t * @param {Sphere} sphere - The sphere to intersect.\n\t\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t\t * @returns {?Vector3} The intersection point.\n\t\t */\n\t\tintersectSphere(sphere, target) {\n\t\t\t_vec3_1$2.subVectors(sphere.center, this.origin);\n\t\t\tconst tca = _vec3_1$2.dot(this.direction);\n\t\t\tconst d2 = _vec3_1$2.dot(_vec3_1$2) - tca * tca;\n\t\t\tconst radius2 = sphere.radius * sphere.radius;\n\t\t\tif (d2 > radius2) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\tconst thc = Math.sqrt(radius2 - d2);\n\n\t\t\t// t0 = first intersect point - entrance on front of sphere\n\t\t\tconst t0 = tca - thc;\n\n\t\t\t// t1 = second intersect point - exit point on back of sphere\n\t\t\tconst t1 = tca + thc;\n\n\t\t\t// test to see if both t0 and t1 are behind the ray - if so, return null\n\t\t\tif (t0 < 0 && t1 < 0) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\t// test to see if t0 is behind the ray:\n\t\t\t// if it is, the ray is inside the sphere, so return the second exit point scaled by t1,\n\t\t\t// in order to always return an intersect point that is in front of the ray.\n\t\t\tif (t0 < 0) {\n\t\t\t\treturn this.at(t1, target);\n\t\t\t}\n\n\t\t\t// else t0 is in front of the ray, so return the first collision point scaled by t0\n\t\t\treturn this.at(t0, target);\n\t\t}\n\n\t\t/**\n\t\t * Returns `true` if this ray intersects with the given sphere.\n\t\t * @param {Sphere} sphere - The sphere to intersect.\n\t\t * @returns {boolean} Whether this ray intersects with the given sphere or not.\n\t\t */\n\t\tintersectsSphere(sphere) {\n\t\t\tif (sphere.radius < 0) return false; // handle empty spheres\n\t\t\treturn this.distanceSqToPoint(sphere.center) <= sphere.radius * sphere.radius;\n\t\t}\n\n\t\t/**\n\t\t * Computes the distance from the ray's origin to the given plane. Returns `null` if the ray\n\t\t * does not intersect with the plane.\n\t\t * @param {Plane} plane - The plane to compute the distance to.\n\t\t * @returns {?number} Whether this ray intersects with the given sphere or not.\n\t\t */\n\t\tdistanceToPlane(plane) {\n\t\t\tconst denominator = plane.normal.dot(this.direction);\n\t\t\tif (denominator === 0) {\n\t\t\t\t// line is coplanar, return origin\n\t\t\t\tif (plane.distanceToPoint(this.origin) === 0) {\n\t\t\t\t\treturn 0;\n\t\t\t\t}\n\n\t\t\t\t// Null is preferable to undefined since undefined means.... it is undefined\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\tconst t = -(this.origin.dot(plane.normal) + plane.constant) / denominator;\n\n\t\t\t// Return if the ray never intersects the plane\n\t\t\treturn t >= 0 ? t : null;\n\t\t}\n\n\t\t/**\n\t\t * Intersects this ray with the given plane, returning the intersection\n\t\t * point or `null` if there is no intersection.\n\t\t * @param {Plane} plane - The plane to intersect.\n\t\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t\t * @returns {?Vector3} The intersection point.\n\t\t */\n\t\tintersectPlane(plane, target) {\n\t\t\tconst t = this.distanceToPlane(plane);\n\t\t\tif (t === null) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\treturn this.at(t, target);\n\t\t}\n\n\t\t/**\n\t\t * Returns `true` if this ray intersects with the given plane.\n\t\t * @param {Plane} plane - The plane to intersect.\n\t\t * @returns {boolean} Whether this ray intersects with the given plane or not.\n\t\t */\n\t\tintersectsPlane(plane) {\n\t\t\t// check if the ray lies on the plane first\n\t\t\tconst distToPoint = plane.distanceToPoint(this.origin);\n\t\t\tif (distToPoint === 0) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tconst denominator = plane.normal.dot(this.direction);\n\t\t\tif (denominator * distToPoint < 0) {\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\t// ray origin is behind the plane (and is pointing behind it)\n\t\t\treturn false;\n\t\t}\n\n\t\t/**\n\t\t * Intersects this ray with the given bounding box, returning the intersection\n\t\t * point or `null` if there is no intersection.\n\t\t * @param {Box3} box - The box to intersect.\n\t\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t\t * @returns {?Vector3} The intersection point.\n\t\t */\n\t\tintersectBox(box, target) {\n\t\t\tlet tmin, tmax, tymin, tymax, tzmin, tzmax;\n\t\t\tconst invdirx = 1 / this.direction.x,\n\t\t\t\tinvdiry = 1 / this.direction.y,\n\t\t\t\tinvdirz = 1 / this.direction.z;\n\t\t\tconst origin = this.origin;\n\t\t\tif (invdirx >= 0) {\n\t\t\t\ttmin = (box.min.x - origin.x) * invdirx;\n\t\t\t\ttmax = (box.max.x - origin.x) * invdirx;\n\t\t\t} else {\n\t\t\t\ttmin = (box.max.x - origin.x) * invdirx;\n\t\t\t\ttmax = (box.min.x - origin.x) * invdirx;\n\t\t\t}\n\t\t\tif (invdiry >= 0) {\n\t\t\t\ttymin = (box.min.y - origin.y) * invdiry;\n\t\t\t\ttymax = (box.max.y - origin.y) * invdiry;\n\t\t\t} else {\n\t\t\t\ttymin = (box.max.y - origin.y) * invdiry;\n\t\t\t\ttymax = (box.min.y - origin.y) * invdiry;\n\t\t\t}\n\t\t\tif (tmin > tymax || tymin > tmax) return null;\n\n\t\t\t// These lines also handle the case where tmin or tmax is NaN\n\t\t\t// (result of 0 * Infinity). x !== x returns true if x is NaN\n\n\t\t\tif (tymin > tmin || tmin !== tmin) tmin = tymin;\n\t\t\tif (tymax < tmax || tmax !== tmax) tmax = tymax;\n\t\t\tif (invdirz >= 0) {\n\t\t\t\ttzmin = (box.min.z - origin.z) * invdirz;\n\t\t\t\ttzmax = (box.max.z - origin.z) * invdirz;\n\t\t\t} else {\n\t\t\t\ttzmin = (box.max.z - origin.z) * invdirz;\n\t\t\t\ttzmax = (box.min.z - origin.z) * invdirz;\n\t\t\t}\n\t\t\tif (tmin > tzmax || tzmin > tmax) return null;\n\t\t\tif (tzmin > tmin || tmin !== tmin) tmin = tzmin;\n\t\t\tif (tzmax < tmax || tmax !== tmax) tmax = tzmax;\n\n\t\t\t// return point closest to the ray (positive side)\n\n\t\t\tif (tmax < 0) return null;\n\t\t\treturn this.at(tmin >= 0 ? tmin : tmax, target);\n\t\t}\n\n\t\t/**\n\t\t * Returns `true` if this ray intersects with the given box.\n\t\t * @param {Box3} box - The box to intersect.\n\t\t * @returns {boolean} Whether this ray intersects with the given box or not.\n\t\t */\n\t\tintersectsBox(box) {\n\t\t\treturn this.intersectBox(box, _vec3_1$2) !== null;\n\t\t}\n\n\t\t/**\n\t\t * Intersects this ray with the given triangle, returning the intersection\n\t\t * point or `null` if there is no intersection.\n\t\t * @param {Vector3} a - The first vertex of the triangle.\n\t\t * @param {Vector3} b - The second vertex of the triangle.\n\t\t * @param {Vector3} c - The third vertex of the triangle.\n\t\t * @param {boolean} backfaceCulling - Whether to use backface culling or not.\n\t\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t\t * @returns {?Vector3} The intersection point.\n\t\t */\n\t\tintersectTriangle(a, b, c, backfaceCulling, target) {\n\t\t\t// Compute the offset origin, edges, and normal.\n\n\t\t\t// from https://github.com/pmjoniak/GeometricTools/blob/master/GTEngine/Include/Mathematics/GteIntrRay3Triangle3.h\n\n\t\t\t_edge1.subVectors(b, a);\n\t\t\t_edge2.subVectors(c, a);\n\t\t\t_normal.crossVectors(_edge1, _edge2);\n\n\t\t\t// Solve Q + t*D = b1*E1 + b2*E2 (Q = kDiff, D = ray direction,\n\t\t\t// E1 = kEdge1, E2 = kEdge2, N = Cross(E1,E2)) by\n\t\t\t//\t |Dot(D,N)|*b1 = sign(Dot(D,N))*Dot(D,Cross(Q,E2))\n\t\t\t//\t |Dot(D,N)|*b2 = sign(Dot(D,N))*Dot(D,Cross(E1,Q))\n\t\t\t//\t |Dot(D,N)|*t = -sign(Dot(D,N))*Dot(Q,N)\n\t\t\tlet DdN = this.direction.dot(_normal);\n\t\t\tlet sign;\n\t\t\tif (DdN > 0) {\n\t\t\t\tif (backfaceCulling) return null;\n\t\t\t\tsign = 1;\n\t\t\t} else if (DdN < 0) {\n\t\t\t\tsign = -1;\n\t\t\t\tDdN = -DdN;\n\t\t\t} else {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\t_diff.subVectors(this.origin, a);\n\t\t\tconst DdQxE2 = sign * this.direction.dot(_edge2.crossVectors(_diff, _edge2));\n\n\t\t\t// b1 < 0, no intersection\n\t\t\tif (DdQxE2 < 0) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\tconst DdE1xQ = sign * this.direction.dot(_edge1.cross(_diff));\n\n\t\t\t// b2 < 0, no intersection\n\t\t\tif (DdE1xQ < 0) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\t// b1+b2 > 1, no intersection\n\t\t\tif (DdQxE2 + DdE1xQ > DdN) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\t// Line intersects triangle, check if ray does.\n\t\t\tconst QdN = -sign * _diff.dot(_normal);\n\n\t\t\t// t < 0, no intersection\n\t\t\tif (QdN < 0) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\t// Ray intersects triangle.\n\t\t\treturn this.at(QdN / DdN, target);\n\t\t}\n\n\t\t/**\n\t\t * Transforms this ray with the given 4x4 transformation matrix.\n\t\t * @param {Matrix4} matrix4 - The transformation matrix.\n\t\t * @returns {Ray} A reference to this ray.\n\t\t */\n\t\tapplyMatrix4(matrix4) {\n\t\t\tthis.origin.applyMatrix4(matrix4);\n\t\t\tthis.direction.transformDirection(matrix4);\n\t\t\treturn this;\n\t\t}\n\n\t\t/**\n\t\t * Returns `true` if this ray is equal with the given one.\n\t\t * @param {Ray} ray - The ray to test for equality.\n\t\t * @returns {boolean} Whether this ray is equal with the given one.\n\t\t */\n\t\tequals(ray) {\n\t\t\treturn ray.origin.equals(this.origin) && ray.direction.equals(this.direction);\n\t\t}\n\n\t\t/**\n\t\t * Returns a new ray with copied values from this instance.\n\t\t * @returns {Ray} A clone of this instance.\n\t\t */\n\t\tclone() {\n\t\t\treturn new this.constructor().copy(this);\n\t\t}\n\t}\n\n\t/**\n\t * This flag can be used for type testing.\n\t * @readonly\n\t * @type {boolean}\n\t * @default true\n\t */\n\tRay.prototype.isRay = true;\n\n\tconst _box3_1 = new Box3();\n\tconst _vec3_1$1 = new Vector3();\n\tconst _vec3_2 = new Vector3();\n\n\t/**\n\t * A sphere defined by a center and radius.\n\t */\n\tclass Sphere {\n\t\t/**\n\t\t * @param {Vector3} [center=Vector3(0, 0, 0)] - center of the sphere.\n\t\t * @param {number} [radius=-1] - radius of the sphere.\n\t\t */\n\t\tconstructor(center = new Vector3(), radius = -1) {\n\t\t\tthis.center = center;\n\t\t\tthis.radius = radius;\n\t\t}\n\n\t\t/**\n\t\t * Sets the center and radius properties of this sphere.\n\t\t * @param {Vector3} center - center of the sphere.\n\t\t * @param {number} radius - radius of the sphere.\n\t\t * @returns {Sphere}\n\t\t */\n\t\tset(center, radius) {\n\t\t\tthis.center.copy(center);\n\t\t\tthis.radius = radius;\n\t\t\treturn this;\n\t\t}\n\n\t\t/**\n\t\t * Computes the minimum bounding sphere for an array of points.\n\t\t * If optionalCenteris given, it is used as the sphere's center.\n\t\t * Otherwise, the center of the axis-aligned bounding box encompassing points is calculated.\n\t\t * @param {Vector3[]} points - an Array of Vector3 positions.\n\t\t * @param {Vector3} [optionalCenter] - the center of the sphere.\n\t\t * @returns {Sphere}\n\t\t */\n\t\tsetFromPoints(points, optionalCenter) {\n\t\t\tconst center = this.center;\n\t\t\tif (optionalCenter !== undefined) {\n\t\t\t\tcenter.copy(optionalCenter);\n\t\t\t} else {\n\t\t\t\t_box3_1.setFromPoints(points).getCenter(center);\n\t\t\t}\n\t\t\tlet maxRadiusSq = 0;\n\t\t\tfor (let i = 0, il = points.length; i < il; i++) {\n\t\t\t\tmaxRadiusSq = Math.max(maxRadiusSq, center.distanceToSquared(points[i]));\n\t\t\t}\n\t\t\tthis.radius = Math.sqrt(maxRadiusSq);\n\t\t\treturn this;\n\t\t}\n\n\t\t/**\n\t\t * Computes the minimum bounding sphere for an array of points.\n\t\t * @param {number[]} array - An Array of position data that the resulting sphere will envelop.\n\t\t * @param {number} [gap=3] - The number of elements between the start of each position in the array.\n\t\t * @param {number} [offset=0] - The offset in each gap where the position data starts.\n\t\t * @param {boolean} [denormalize=false] - whether to denormalize the values in the array.\n\t\t * @returns {Sphere} A reference to this sphere.\n\t\t */\n\t\tsetFromArray(array, gap = 3, offset = 0, denormalize = false) {\n\t\t\tconst center = this.center;\n\t\t\t_box3_1.setFromArray(array, gap, offset, denormalize).getCenter(center);\n\t\t\tlet maxRadiusSq = 0;\n\t\t\tfor (let i = 0, l = array.length; i < l; i += gap) {\n\t\t\t\t_vec3_1$1.fromArray(array, i + offset, denormalize);\n\t\t\t\tmaxRadiusSq = Math.max(maxRadiusSq, center.distanceToSquared(_vec3_1$1));\n\t\t\t}\n\t\t\tthis.radius = Math.sqrt(maxRadiusSq);\n\t\t\treturn this;\n\t\t}\n\n\t\t/**\n\t\t * Transforms this sphere with the provided Matrix4.\n\t\t * @param {Matrix4} matrix - the Matrix4 to apply\n\t\t * @returns {Matrix4}\n\t\t */\n\t\tapplyMatrix4(matrix) {\n\t\t\tthis.center.applyMatrix4(matrix);\n\t\t\tthis.radius = this.radius * matrix.getMaxScaleOnAxis();\n\t\t\treturn this;\n\t\t}\n\n\t\t/**\n\t\t * Returns aMinimum Bounding Box for the sphere.\n\t\t * @param {Box3} target — the result will be copied into this Box3.\n\t\t * @returns {Box3}\n\t\t */\n\t\tgetBoundingBox(target) {\n\t\t\tif (this.isEmpty()) {\n\t\t\t\t// Empty sphere produces empty bounding box\n\t\t\t\ttarget.makeEmpty();\n\t\t\t\treturn target;\n\t\t\t}\n\t\t\ttarget.set(this.center, this.center);\n\t\t\ttarget.expandByScalar(this.radius);\n\t\t\treturn target;\n\t\t}\n\n\t\t/**\n\t\t * Checks to see if the sphere is empty (the radius set to a negative number).\n\t\t * Spheres with a radius of 0 contain only their center point and are not considered to be empty.\n\t\t * @returns {boolean}\n\t\t */\n\t\tisEmpty() {\n\t\t\treturn this.radius < 0;\n\t\t}\n\n\t\t/**\n\t\t * Makes the sphere empty by setting center to (0, 0, 0) and radius to -1.\n\t\t * @returns {Sphere}\n\t\t */\n\t\tmakeEmpty() {\n\t\t\tthis.center.set(0, 0, 0);\n\t\t\tthis.radius = -1;\n\t\t\treturn this;\n\t\t}\n\n\t\t/**\n\t\t * Checks to see if the sphere contains the provided point inclusive of the surface of the sphere.\n\t\t * @param {Vector3} point - The point to check for containment.\n\t\t * @returns {boolean}\n\t\t */\n\t\tcontainsPoint(point) {\n\t\t\treturn point.distanceToSquared(this.center) <= this.radius * this.radius;\n\t\t}\n\n\t\t/**\n\t\t * Returns the closest distance from the boundary of the sphere to the point.\n\t\t * If the sphere contains the point, the distance will be negative.\n\t\t * @param {Vector3} point - The point to calculate the distance to.\n\t\t * @returns {number}\n\t\t */\n\t\tdistanceToPoint(point) {\n\t\t\treturn point.distanceTo(this.center) - this.radius;\n\t\t}\n\n\t\t/**\n\t\t * Expands the boundaries of this sphere to include point.\n\t\t * @param {Vector3} point - The vector3 that should be included in the sphere.\n\t\t * @returns {Sphere}\n\t\t */\n\t\texpandByPoint(point) {\n\t\t\tif (this.isEmpty()) {\n\t\t\t\tthis.center.copy(point);\n\t\t\t\tthis.radius = 0;\n\t\t\t\treturn this;\n\t\t\t}\n\t\t\t_vec3_1$1.subVectors(point, this.center);\n\t\t\tconst lengthSq = _vec3_1$1.getLengthSquared();\n\t\t\tif (lengthSq > this.radius * this.radius) {\n\t\t\t\t// calculate the minimal sphere\n\t\t\t\tconst length = Math.sqrt(lengthSq);\n\t\t\t\tconst delta = (length - this.radius) * 0.5;\n\t\t\t\tthis.center.addScaledVector(_vec3_1$1, delta / length);\n\t\t\t\tthis.radius += delta;\n\t\t\t}\n\t\t\treturn this;\n\t\t}\n\n\t\t/**\n\t\t * Expands this sphere to enclose both the original sphere and the given sphere.\n\t\t * @param {Sphere} sphere - The sphere to include.\n\t\t * @returns {Sphere} A reference to this sphere.\n\t\t */\n\t\tunion(sphere) {\n\t\t\tif (sphere.isEmpty()) {\n\t\t\t\treturn this;\n\t\t\t}\n\t\t\tif (this.isEmpty()) {\n\t\t\t\tthis.copy(sphere);\n\t\t\t\treturn this;\n\t\t\t}\n\t\t\tif (this.center.equals(sphere.center)) {\n\t\t\t\tthis.radius = Math.max(this.radius, sphere.radius);\n\t\t\t} else {\n\t\t\t\t_vec3_2.subVectors(sphere.center, this.center).normalize().multiplyScalar(sphere.radius);\n\t\t\t\tthis.expandByPoint(_vec3_1$1.addVectors(sphere.center, _vec3_2));\n\t\t\t\tthis.expandByPoint(_vec3_1$1.addVectors(sphere.center, _vec3_2));\n\t\t\t}\n\t\t\treturn this;\n\t\t}\n\n\t\t/**\n\t\t * Returns a new sphere with the same center and radius as this one.\n\t\t * @returns {Sphere}\n\t\t */\n\t\tclone() {\n\t\t\treturn new Sphere().copy(this);\n\t\t}\n\n\t\t/**\n\t\t * Copies the values of the passed sphere's center and radius properties to this sphere.\n\t\t * @param {Sphere} sphere\n\t\t * @returns {Sphere}\n\t\t */\n\t\tcopy(sphere) {\n\t\t\tthis.center.copy(sphere.center);\n\t\t\tthis.radius = sphere.radius;\n\t\t\treturn this;\n\t\t}\n\t}\n\n\t/**\n\t * This flag can be used for type testing.\n\t * @readonly\n\t * @type {boolean}\n\t * @default true\n\t */\n\tSphere.prototype.isSphere = true;\n\n\t/**\n\t * Ref: https://en.wikipedia.org/wiki/Spherical_coordinate_system\n\t *\n\t * The poles (phi) are at the positive and negative y axis.\n\t * The equator starts at positive z.\n\t */\n\tclass Spherical {\n\t\t/**\n\t\t * @param {number} [radius=1] - the radius, or the Euclidean distance (straight-line distance) from the point to the origin. Default is 1.0.\n\t\t * @param {number} [phi=0] - - polar angle in radians from the y (up) axis. Default is 0.\n\t\t * @param {number} [theta=0] - - equator angle in radians around the y (up) axis. Default is 0.\n\t\t */\n\t\tconstructor(radius = 1, phi = 0, theta = 0) {\n\t\t\tthis.radius = radius;\n\t\t\tthis.phi = phi; // up / down towards top and bottom pole\n\t\t\tthis.theta = theta; // around the equator of the sphere\n\t\t}\n\n\t\t/**\n\t\t * Sets values of this spherical's radius, phi and theta properties.\n\t\t * @param {number} radius\n\t\t * @param {number} phi\n\t\t * @param {number} theta\n\t\t * @returns {Spherical}\n\t\t */\n\t\tset(radius, phi, theta) {\n\t\t\tthis.radius = radius;\n\t\t\tthis.phi = phi;\n\t\t\tthis.theta = theta;\n\t\t\treturn this;\n\t\t}\n\n\t\t/**\n\t\t * Copies the values of the passed Spherical's radius, phi and theta properties to this spherical.\n\t\t * @param {Spherical} other\n\t\t * @returns {Spherical}\n\t\t */\n\t\tcopy(other) {\n\t\t\tthis.radius = other.radius;\n\t\t\tthis.phi = other.phi;\n\t\t\tthis.theta = other.theta;\n\t\t\treturn this;\n\t\t}\n\n\t\t/**\n\t\t * Returns a new spherical with the same radius, phi and theta properties as this one.\n\t\t * @returns {Spherical}\n\t\t */\n\t\tclone() {\n\t\t\treturn new Spherical().copy(this);\n\t\t}\n\n\t\t/**\n\t\t * Restrict phi to be betwee EPS and PI-EPS.\n\t\t * @returns {Spherical}\n\t\t */\n\t\tmakeSafe() {\n\t\t\tconst EPS = 0.000001;\n\t\t\tthis.phi = MathUtils.clamp(this.phi, EPS, Math.PI - EPS);\n\t\t\treturn this;\n\t\t}\n\n\t\t/**\n\t\t * Sets values of this spherical's radius, phi and theta properties from the Vector3.\n\t\t * @param {Vector3} vec3\n\t\t * @returns {Spherical}\n\t\t */\n\t\tsetFromVector3(vec3) {\n\t\t\tthis.radius = vec3.getLength();\n\t\t\tif (this.radius === 0) {\n\t\t\t\tthis.theta = 0;\n\t\t\t\tthis.phi = 0;\n\t\t\t} else {\n\t\t\t\tthis.theta = Math.atan2(vec3.x, vec3.z); // equator angle around y-up axis\n\t\t\t\tthis.phi = Math.acos(MathUtils.clamp(vec3.y / this.radius, -1, 1)); // polar angle\n\t\t\t}\n\t\t\treturn this;\n\t\t}\n\t}\n\n\t/**\n\t * This flag can be used for type testing.\n\t * @readonly\n\t * @type {boolean}\n\t * @default true\n\t */\n\tSpherical.prototype.isSpherical = true;\n\n\t/**\n\t * Primary reference: https://graphics.stanford.edu/papers/envmap/envmap.pdf\n\t * Secondary reference: https://www.ppsloan.org/publications/StupidSH36.pdf\n\t * 3-band SH defined by 9 coefficients.\n\t */\n\tclass SphericalHarmonics3 {\n\t\t/**\n\t\t * Creates a new instance of SphericalHarmonics3.\n\t\t */\n\t\tconstructor() {\n\t\t\t/**\n\t\t\t * An array holding the (9) SH coefficients.\n\t\t\t * A single coefficient is represented as an instance of Vector3.\n\t\t\t * @type {Array}\n\t\t\t */\n\t\t\tthis.coefficients = [];\n\t\t\tfor (let i = 0; i < 9; i++) {\n\t\t\t\tthis.coefficients.push(new Vector3());\n\t\t\t}\n\t\t}\n\n\t\t/**\n\t\t * Set this sphericalHarmonics3 value.\n\t\t * @param {Vector3[]} coefficients An array of SH coefficients.\n\t\t * @returns {SphericalHarmonics3}\n\t\t */\n\t\tset(coefficients) {\n\t\t\tfor (let i = 0; i < 9; i++) {\n\t\t\t\tthis.coefficients[i].copy(coefficients[i]);\n\t\t\t}\n\t\t\treturn this;\n\t\t}\n\n\t\t/**\n\t\t * Sets all SH coefficients to 0.\n\t\t * @returns {SphericalHarmonics3}\n\t\t */\n\t\tzero() {\n\t\t\tfor (let i = 0; i < 9; i++) {\n\t\t\t\tthis.coefficients[i].set(0, 0, 0);\n\t\t\t}\n\t\t\treturn this;\n\t\t}\n\n\t\t/**\n\t\t * Returns the radiance in the direction of the given normal.\n\t\t * @param {Vector3} normal - The normal vector (assumed to be unit length).\n\t\t * @param {Vector3} target - The result vector.\n\t\t * @returns {Vector3}\n\t\t */\n\t\tgetAt(normal, target) {\n\t\t\t// normal is assumed to be unit length\n\n\t\t\tconst x = normal.x,\n\t\t\t\ty = normal.y,\n\t\t\t\tz = normal.z;\n\t\t\tconst coeff = this.coefficients;\n\n\t\t\t// band 0\n\t\t\ttarget.copy(coeff[0]).multiplyScalar(0.282095);\n\n\t\t\t// band 1\n\t\t\ttarget.addScaledVector(coeff[1], 0.488603 * y);\n\t\t\ttarget.addScaledVector(coeff[2], 0.488603 * z);\n\t\t\ttarget.addScaledVector(coeff[3], 0.488603 * x);\n\n\t\t\t// band 2\n\t\t\ttarget.addScaledVector(coeff[4], 1.092548 * (x * y));\n\t\t\ttarget.addScaledVector(coeff[5], 1.092548 * (y * z));\n\t\t\ttarget.addScaledVector(coeff[6], 0.315392 * (3.0 * z * z - 1.0));\n\t\t\ttarget.addScaledVector(coeff[7], 1.092548 * (x * z));\n\t\t\ttarget.addScaledVector(coeff[8], 0.546274 * (x * x - y * y));\n\t\t\treturn target;\n\t\t}\n\n\t\t/**\n\t\t * Reference: https://graphics.stanford.edu/papers/envmap/envmap.pdf\n\t\t * Returns the irradiance (radiance convolved with cosine lobe) in the direction of the given normal.\n\t\t * @param {Vector3} normal - The normal vector (assumed to be unit length).\n\t\t * @param {Vector3} target - The result vector.\n\t\t * @returns {Vector3}\n\t\t */\n\t\tgetIrradianceAt(normal, target) {\n\t\t\t// normal is assumed to be unit length\n\n\t\t\tconst x = normal.x,\n\t\t\t\ty = normal.y,\n\t\t\t\tz = normal.z;\n\t\t\tconst coeff = this.coefficients;\n\n\t\t\t// band 0\n\t\t\ttarget.copy(coeff[0]).multiplyScalar(0.886227); // π * 0.282095\n\n\t\t\t// band 1\n\t\t\ttarget.addScaledVector(coeff[1], 2.0 * 0.511664 * y); // ( 2 * π / 3 ) * 0.488603\n\t\t\ttarget.addScaledVector(coeff[2], 2.0 * 0.511664 * z);\n\t\t\ttarget.addScaledVector(coeff[3], 2.0 * 0.511664 * x);\n\n\t\t\t// band 2\n\t\t\ttarget.addScaledVector(coeff[4], 2.0 * 0.429043 * x * y); // ( π / 4 ) * 1.092548\n\t\t\ttarget.addScaledVector(coeff[5], 2.0 * 0.429043 * y * z);\n\t\t\ttarget.addScaledVector(coeff[6], 0.743125 * z * z - 0.247708); // ( π / 4 ) * 0.315392 * 3\n\t\t\ttarget.addScaledVector(coeff[7], 2.0 * 0.429043 * x * z);\n\t\t\ttarget.addScaledVector(coeff[8], 0.429043 * (x * x - y * y)); // ( π / 4 ) * 0.546274\n\n\t\t\treturn target;\n\t\t}\n\n\t\t/**\n\t\t * Adds the given SH to this instance.\n\t\t * @param {SphericalHarmonics3} sh - The SH to add.\n\t\t * @returns {SphericalHarmonics3}\n\t\t */\n\t\tadd(sh) {\n\t\t\tfor (let i = 0; i < 9; i++) {\n\t\t\t\tthis.coefficients[i].add(sh.coefficients[i]);\n\t\t\t}\n\t\t\treturn this;\n\t\t}\n\n\t\t/**\n\t\t * A convenience method for performing .add() and .scale() at once.\n\t\t * @param {SphericalHarmonics3} sh - The SH to add.\n\t\t * @param {Vector3} s - The scale factor.\n\t\t * @returns {SphericalHarmonics3}\n\t\t */\n\t\taddScaledSH(sh, s) {\n\t\t\tfor (let i = 0; i < 9; i++) {\n\t\t\t\tthis.coefficients[i].addScaledVector(sh.coefficients[i], s);\n\t\t\t}\n\t\t\treturn this;\n\t\t}\n\n\t\t/**\n\t\t * Multiply the s to this SphericalHarmonics3.\n\t\t * @param {number} s - The scale factor.\n\t\t * @returns {SphericalHarmonics3}\n\t\t */\n\t\tscale(s) {\n\t\t\tfor (let i = 0; i < 9; i++) {\n\t\t\t\tthis.coefficients[i].multiplyScalar(s);\n\t\t\t}\n\t\t\treturn this;\n\t\t}\n\n\t\t/**\n\t\t * Linear interpolates between the given SH and this instance by the given alpha factor.\n\t\t * Sets this coefficients vector to be the vector linearly interpolated between v1 and v2\n\t\t * where alpha is the percent distance along the line connecting the two vectors\n\t\t * - alpha = 0 will be v1, and alpha = 1 will be v2.\n\t\t * @param {SphericalHarmonics3} sh - The SH to interpolate with.\n\t\t * @param {number} alpha - The alpha factor.\n\t\t * @returns {SphericalHarmonics3}\n\t\t */\n\t\tlerp(sh, alpha) {\n\t\t\tfor (let i = 0; i < 9; i++) {\n\t\t\t\tthis.coefficients[i].lerpVectors(this.coefficients[i], sh.coefficients[i], alpha);\n\t\t\t}\n\t\t\treturn this;\n\t\t}\n\n\t\t/**\n\t\t * Returns true if the given SH and this instance have equal coefficients.\n\t\t * @param {SphericalHarmonics3} sh - The SH to compare with.\n\t\t * @returns {boolean}\n\t\t */\n\t\tequals(sh) {\n\t\t\tfor (let i = 0; i < 9; i++) {\n\t\t\t\tif (!this.coefficients[i].equals(sh.coefficients[i])) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t}\n\n\t\t/**\n\t\t * Copies the given SH to this instance.\n\t\t * @param {SphericalHarmonics3} sh - The SH to compare with.\n\t\t * @returns {SphericalHarmonics3}\n\t\t */\n\t\tcopy(sh) {\n\t\t\treturn this.set(sh.coefficients);\n\t\t}\n\n\t\t/**\n\t\t * Returns a new instance of SphericalHarmonics3 with equal coefficients.\n\t\t * @returns {SphericalHarmonics3}\n\t\t */\n\t\tclone() {\n\t\t\treturn new this.constructor().copy(this);\n\t\t}\n\n\t\t/**\n\t\t * Sets the coefficients of this instance from the given array.\n\t\t * @param {number[]} array - The array holding the numbers of the SH coefficients.\n\t\t * @param {number} [offset=0] - The array offset.\n\t\t * @returns {SphericalHarmonics3}\n\t\t */\n\t\tfromArray(array, offset = 0) {\n\t\t\tconst coefficients = this.coefficients;\n\t\t\tfor (let i = 0; i < 9; i++) {\n\t\t\t\tcoefficients[i].fromArray(array, offset + i * 3);\n\t\t\t}\n\t\t\treturn this;\n\t\t}\n\n\t\t/**\n\t\t * Returns an array with the coefficients, or copies them into the provided array.\n\t\t * The coefficients are represented as numbers.\n\t\t * @param {number[]} [array] - The target array.\n\t\t * @param {number} [offset=0] - The array offset.\n\t\t * @returns {number[]}\n\t\t */\n\t\ttoArray(array = [], offset = 0) {\n\t\t\tconst coefficients = this.coefficients;\n\t\t\tfor (let i = 0; i < 9; i++) {\n\t\t\t\tcoefficients[i].toArray(array, offset + i * 3);\n\t\t\t}\n\t\t\treturn array;\n\t\t}\n\n\t\t/**\n\t\t * Computes the SH basis for the given normal vector.\n\t\t * @param {Vector3} normal - The normal vector (assumed to be unit length).\n\t\t * @param {number[]} shBasis - The resulting SH basis.\n\t\t */\n\t\tstatic getBasisAt(normal, shBasis) {\n\t\t\t// normal is assumed to be unit length\n\n\t\t\tconst x = normal.x,\n\t\t\t\ty = normal.y,\n\t\t\t\tz = normal.z;\n\n\t\t\t// band 0\n\t\t\tshBasis[0] = 0.282095;\n\n\t\t\t// band 1\n\t\t\tshBasis[1] = 0.488603 * y;\n\t\t\tshBasis[2] = 0.488603 * z;\n\t\t\tshBasis[3] = 0.488603 * x;\n\n\t\t\t// band 2\n\t\t\tshBasis[4] = 1.092548 * x * y;\n\t\t\tshBasis[5] = 1.092548 * y * z;\n\t\t\tshBasis[6] = 0.315392 * (3 * z * z - 1);\n\t\t\tshBasis[7] = 1.092548 * x * z;\n\t\t\tshBasis[8] = 0.546274 * (x * x - y * y);\n\t\t}\n\t}\n\n\t/**\n\t * This flag can be used for type testing.\n\t * @readonly\n\t * @type {boolean}\n\t * @default true\n\t */\n\tSphericalHarmonics3.prototype.isSphericalHarmonics3 = true;\n\n\tconst _v0 = new Vector3();\n\tconst _v1 = new Vector3();\n\tconst _v2 = new Vector3();\n\tconst _v3 = new Vector3();\n\n\t/**\n\t * A geometric triangle as defined by three Vector3s representing its three corners.\n\t */\n\tclass Triangle {\n\t\t/**\n\t\t * @param {Vector3} [a] - the first corner of the triangle. Default is a Vector3 at (0, 0, 0).\n\t\t * @param {Vector3} [b] - the second corner of the triangle. Default is a Vector3 at (0, 0, 0).\n\t\t * @param {Vector3} [c] - the final corner of the triangle. Default is a Vector3 at (0, 0, 0).\n\t\t */\n\t\tconstructor(a = new Vector3(), b = new Vector3(), c = new Vector3()) {\n\t\t\tthis.a = a;\n\t\t\tthis.b = b;\n\t\t\tthis.c = c;\n\t\t}\n\n\t\t/**\n\t\t * Calculate the normal vector of the triangle.\n\t\t * @param {Vector3} a\n\t\t * @param {Vector3} b\n\t\t * @param {Vector3} c\n\t\t * @param {Vector3} [optionalTarget]\n\t\t * @returns {Vector3}\n\t\t */\n\t\tstatic normal(a, b, c, optionalTarget) {\n\t\t\tconst result = optionalTarget || new Vector3();\n\t\t\tresult.subVectors(c, b);\n\t\t\t_v0.subVectors(a, b);\n\t\t\tresult.cross(_v0);\n\t\t\tconst resultLengthSq = result.getLengthSquared();\n\t\t\tif (resultLengthSq > 0) {\n\t\t\t\treturn result.multiplyScalar(1 / Math.sqrt(resultLengthSq));\n\t\t\t}\n\t\t\treturn result.set(0, 0, 0);\n\t\t}\n\n\t\t/**\n\t\t * static/instance method to calculate barycentric coordinates.\n\t\t * based on: http://www.blackpawn.com/texts/pointinpoly/default.html\n\t\t * @param {Vector3} point - Vector3\n\t\t * @param {Vector3} a\n\t\t * @param {Vector3} b\n\t\t * @param {Vector3} c\n\t\t * @param {Vector3} [target] - the result will be copied into this Vector3.\n\t\t * @returns {Vector3}\n\t\t */\n\t\tstatic barycoordFromPoint(point, a, b, c, target) {\n\t\t\t_v0.subVectors(c, a);\n\t\t\t_v1.subVectors(b, a);\n\t\t\t_v2.subVectors(point, a);\n\t\t\tconst dot00 = _v0.dot(_v0);\n\t\t\tconst dot01 = _v0.dot(_v1);\n\t\t\tconst dot02 = _v0.dot(_v2);\n\t\t\tconst dot11 = _v1.dot(_v1);\n\t\t\tconst dot12 = _v1.dot(_v2);\n\t\t\tconst denom = dot00 * dot11 - dot01 * dot01;\n\t\t\tconst result = target || new Vector3();\n\n\t\t\t// collinear or singular triangle\n\t\t\tif (denom === 0) {\n\t\t\t\t// arbitrary location outside of triangle?\n\t\t\t\t// not sure if this is the best idea, maybe should be returning undefined\n\t\t\t\treturn result.set(-2, -1, -1);\n\t\t\t}\n\t\t\tconst invDenom = 1 / denom;\n\t\t\tconst u = (dot11 * dot02 - dot01 * dot12) * invDenom;\n\t\t\tconst v = (dot00 * dot12 - dot01 * dot02) * invDenom;\n\n\t\t\t// barycentric coordinates must always sum to 1\n\t\t\treturn result.set(1 - u - v, v, u);\n\t\t}\n\n\t\t/**\n\t\t * Returns true if the passed point, when projected onto the plane of the triangle, lies within the triangle.\n\t\t * @param {Vector3} point\n\t\t * @param {Vector3} a\n\t\t * @param {Vector3} b\n\t\t * @param {Vector3} c\n\t\t * @returns {Vector3}\n\t\t */\n\t\tstatic containsPoint(point, a, b, c) {\n\t\t\tthis.barycoordFromPoint(point, a, b, c, _v3);\n\t\t\treturn _v3.x >= 0 && _v3.y >= 0 && _v3.x + _v3.y <= 1;\n\t\t}\n\n\t\t/**\n\t\t * Sets the triangle's a, b and c properties to the passed vector3s.\n\t\t * @param {Vector3} a\n\t\t * @param {Vector3} b\n\t\t * @param {Vector3} c\n\t\t * @returns {Triangle}\n\t\t */\n\t\tset(a, b, c) {\n\t\t\tthis.a.copy(a);\n\t\t\tthis.b.copy(b);\n\t\t\tthis.c.copy(c);\n\t\t\treturn this;\n\t\t}\n\t}\n\n\t/**\n\t * This flag can be used for type testing.\n\t * @readonly\n\t * @type {boolean}\n\t * @default true\n\t */\n\tTriangle.prototype.isTriangle = true;\n\n\t/**\n\t * The vector 4 class\n\t */\n\tclass Vector4 {\n\t\t/**\n\t\t * @param {number} [x=0] - the x value of this vector.\n\t\t * @param {number} [y=0] - the y value of this vector.\n\t\t * @param {number} [z=0] - the z value of this vector.\n\t\t * @param {number} [w=1] - the w value of this vector.\n\t\t */\n\t\tconstructor(x = 0, y = 0, z = 0, w = 1) {\n\t\t\tthis.x = x;\n\t\t\tthis.y = y;\n\t\t\tthis.z = z;\n\t\t\tthis.w = w;\n\t\t}\n\n\t\t/**\n\t\t * Sets this vector to be the vector linearly interpolated between v1 and v2\n\t\t * where ratio is the percent distance along the line connecting the two vectors\n\t\t * - ratio = 0 will be v1, and ratio = 1 will be v2.\n\t\t * @param {Vector4} v1 - the starting Vector4.\n\t\t * @param {Vector4} v2 - Vector4 to interpolate towards.\n\t\t * @param {number} ratio - interpolation factor, typically in the closed interval [0, 1].\n\t\t * @returns {Vector4}\n\t\t */\n\t\tlerpVectors(v1, v2, ratio) {\n\t\t\treturn this.subVectors(v2, v1).multiplyScalar(ratio).add(v1);\n\t\t}\n\n\t\t/**\n\t\t * Sets the x, y, z and w components of this vector.\n\t\t * @param {number} x\n\t\t * @param {number} y\n\t\t * @param {number} z\n\t\t * @param {number} w\n\t\t * @returns {Vector4}\n\t\t */\n\t\tset(x = 0, y = 0, z = 0, w = 1) {\n\t\t\tthis.x = x;\n\t\t\tthis.y = y;\n\t\t\tthis.z = z;\n\t\t\tthis.w = w;\n\t\t\treturn this;\n\t\t}\n\n\t\t/**\n\t\t * Converts this vector to a unit vector - that is, sets it equal to a vector with the same direction as this one, but length 1.\n\t\t * @returns {Vector4}\n\t\t */\n\t\tnormalize() {\n\t\t\treturn this.multiplyScalar(1 / (this.getLength() || 1));\n\t\t}\n\n\t\t/**\n\t\t * Multiplies this vector by scalar s.\n\t\t * @param {number} scalar\n\t\t * @returns {Vector4}\n\t\t */\n\t\tmultiplyScalar(scalar) {\n\t\t\tthis.x *= scalar;\n\t\t\tthis.y *= scalar;\n\t\t\tthis.z *= scalar;\n\t\t\tthis.w *= scalar;\n\t\t\treturn this;\n\t\t}\n\n\t\t/**\n\t\t * Calculates the dot product of this vector and v.\n\t\t * @param {Vector4} v\n\t\t * @returns {Vector4}\n\t\t */\n\t\tdot(v) {\n\t\t\treturn this.x * v.x + this.y * v.y + this.z * v.z + this.w * v.w;\n\t\t}\n\n\t\t/**\n\t\t * Computes the square of the Euclidean length (straight-line length) from (0, 0, 0, 0) to (x, y, z, w).\n\t\t * If you are comparing the lengths of vectors, you should compare the length squared instead\n\t\t * as it is slightly more efficient to calculate.\n\t\t * @returns {number}\n\t\t */\n\t\tgetLengthSquared() {\n\t\t\treturn this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w;\n\t\t}\n\n\t\t/**\n\t\t * Computes the Euclidean length (straight-line length) from (0, 0, 0, 0) to (x, y, z, w).\n\t\t * @returns {number}\n\t\t */\n\t\tgetLength() {\n\t\t\treturn Math.sqrt(this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w);\n\t\t}\n\n\t\t/**\n\t\t * Computes the {@link https://en.wikipedia.org/wiki/Taxicab_geometry|Manhattan length}\tfrom (0, 0, 0, 0) to (x, y, z, w).\n\t\t * @returns {number}\n\t\t */\n\t\tgetManhattanLength() {\n\t\t\treturn Math.abs(this.x) + Math.abs(this.y) + Math.abs(this.z) + Math.abs(this.w);\n\t\t}\n\n\t\t/**\n\t\t * Multiplies this vector by 4 x 4 m.\n\t\t * @param {Matrix4} m\n\t\t * @returns {Vector4}\n\t\t */\n\t\tapplyMatrix4(m) {\n\t\t\tconst x = this.x,\n\t\t\t\ty = this.y,\n\t\t\t\tz = this.z,\n\t\t\t\tw = this.w;\n\t\t\tconst e = m.elements;\n\t\t\tthis.x = e[0] * x + e[4] * y + e[8] * z + e[12] * w;\n\t\t\tthis.y = e[1] * x + e[5] * y + e[9] * z + e[13] * w;\n\t\t\tthis.z = e[2] * x + e[6] * y + e[10] * z + e[14] * w;\n\t\t\tthis.w = e[3] * x + e[7] * y + e[11] * z + e[15] * w;\n\t\t\treturn this;\n\t\t}\n\n\t\t/**\n\t\t * Sets this vector to the position represented by the matrix m.\n\t\t * @param {Matrix4} m\n\t\t * @returns {Vector4}\n\t\t */\n\t\tsetFromMatrixPosition(m) {\n\t\t\tconst e = m.elements;\n\t\t\tthis.x = e[12];\n\t\t\tthis.y = e[13];\n\t\t\tthis.z = e[14];\n\t\t\tthis.w = e[15];\n\t\t\treturn this;\n\t\t}\n\n\t\t/**\n\t\t * Checks for strict equality of this vector and v.\n\t\t * @param {Vector4} v\n\t\t * @returns {boolean}\n\t\t */\n\t\tequals(v) {\n\t\t\treturn v.x === this.x && v.y === this.y && v.z === this.z && v.w === this.w;\n\t\t}\n\n\t\t/**\n\t\t * Adds v to this vector.\n\t\t * @param {Vector4} v\n\t\t * @returns {Vector4}\n\t\t */\n\t\tadd(v) {\n\t\t\tthis.x += v.x;\n\t\t\tthis.y += v.y;\n\t\t\tthis.z += v.z;\n\t\t\tthis.w += v.w;\n\t\t\treturn this;\n\t\t}\n\n\t\t/**\n\t\t * Multiplies this vector by v.\n\t\t * @param {Vector4} v\n\t\t * @returns {Vector4}\n\t\t */\n\t\tmultiply(v) {\n\t\t\tthis.x *= v.x;\n\t\t\tthis.y *= v.y;\n\t\t\tthis.z *= v.z;\n\t\t\tthis.w *= v.w;\n\t\t\treturn this;\n\t\t}\n\n\t\t/**\n\t\t * Sets this vector to a - b.\n\t\t * @param {Vector4} a\n\t\t * @param {Vector4} b\n\t\t * @returns {Vector4}\n\t\t */\n\t\tsubVectors(a, b) {\n\t\t\tthis.x = a.x - b.x;\n\t\t\tthis.y = a.y - b.y;\n\t\t\tthis.z = a.z - b.z;\n\t\t\tthis.w = a.w - b.w;\n\t\t\treturn this;\n\t\t}\n\n\t\t/**\n\t\t * Sets this vector's x value to be array[ offset + 0 ],\n\t\t * y value to be array[ offset + 1 ] z value to be array[ offset + 2 ]\n\t\t * and w value to be array[ offset + 3 ].\n\t\t * @param {number[]} array - the source array.\n\t\t * @param {number} [offset=0] - offset into the array.\n\t\t * @param {boolean} [denormalize=false] - if true, denormalize the values, and array should be a typed array.\n\t\t * @returns {Vector4}\n\t\t */\n\t\tfromArray(array, offset = 0, denormalize = false) {\n\t\t\tlet x = array[offset],\n\t\t\t\ty = array[offset + 1],\n\t\t\t\tz = array[offset + 2],\n\t\t\t\tw = array[offset + 3];\n\t\t\tif (denormalize) {\n\t\t\t\tx = MathUtils.denormalize(x, array);\n\t\t\t\ty = MathUtils.denormalize(y, array);\n\t\t\t\tz = MathUtils.denormalize(z, array);\n\t\t\t\tw = MathUtils.denormalize(w, array);\n\t\t\t}\n\t\t\tthis.x = x;\n\t\t\tthis.y = y;\n\t\t\tthis.z = z;\n\t\t\tthis.w = w;\n\t\t\treturn this;\n\t\t}\n\n\t\t/**\n\t\t * Returns an array [x, y, z, w], or copies x, y, z and w into the provided array.\n\t\t * @param {number[]} [array] - array to store this vector to. If this is not provided, a new array will be created.\n\t\t * @param {number} [offset=0] - offset into the array.\n\t\t * @param {boolean} [normalize=false] - if true, normalize the values, and array should be a typed array.\n\t\t * @returns {number[]}\n\t\t */\n\t\ttoArray(array = [], offset = 0, normalize = false) {\n\t\t\tlet x = this.x,\n\t\t\t\ty = this.y,\n\t\t\t\tz = this.z,\n\t\t\t\tw = this.w;\n\t\t\tif (normalize) {\n\t\t\t\tx = MathUtils.normalize(x, array);\n\t\t\t\ty = MathUtils.normalize(y, array);\n\t\t\t\tz = MathUtils.normalize(z, array);\n\t\t\t\tw = MathUtils.normalize(w, array);\n\t\t\t}\n\t\t\tarray[offset] = x;\n\t\t\tarray[offset + 1] = y;\n\t\t\tarray[offset + 2] = z;\n\t\t\tarray[offset + 3] = w;\n\t\t\treturn array;\n\t\t}\n\n\t\t/**\n\t\t * Rounds the x, y, z and w values of this vector to the nearest integer value.\n\t\t * @returns {Vector4}\n\t\t */\n\t\tround() {\n\t\t\tthis.x = Math.round(this.x);\n\t\t\tthis.y = Math.round(this.y);\n\t\t\tthis.z = Math.round(this.z);\n\t\t\tthis.w = Math.round(this.w);\n\t\t\treturn this;\n\t\t}\n\n\t\t/**\n\t\t * Returns a new Vector4 with the same x, y, z and w values as this one.\n\t\t * @returns {Vector4}\n\t\t */\n\t\tclone() {\n\t\t\treturn new Vector4(this.x, this.y, this.z, this.w);\n\t\t}\n\n\t\t/**\n\t\t * Copies the values of the passed Vector4's x, y, z and w properties to this Vector4.\n\t\t * @param {Vector4} v\n\t\t * @returns {Vector4}\n\t\t */\n\t\tcopy(v) {\n\t\t\tthis.x = v.x;\n\t\t\tthis.y = v.y;\n\t\t\tthis.z = v.z;\n\t\t\tthis.w = v.w !== undefined ? v.w : 1;\n\t\t\treturn this;\n\t\t}\n\t\t*[Symbol.iterator]() {\n\t\t\tyield this.x;\n\t\t\tyield this.y;\n\t\t\tyield this.z;\n\t\t\tyield this.w;\n\t\t}\n\t}\n\n\t/**\n\t * This flag can be used for type testing.\n\t * @readonly\n\t * @type {boolean}\n\t * @default true\n\t */\n\tVector4.prototype.isVector4 = true;\n\n\t/**\n\t * Clone uniforms.\n\t * @function\n\t * @name cloneUniforms\n\t * @param {object} uniforms_src - The input uniforms.\n\t * @returns {object} - The output uniforms.\n\t */\n\tfunction cloneUniforms(uniforms_src) {\n\t\tconst uniforms_dst = {};\n\t\tfor (const name in uniforms_src) {\n\t\t\tconst uniform_src = uniforms_src[name];\n\t\t\tif (Array.isArray(uniform_src) || ArrayBuffer.isView(uniform_src)) {\n\t\t\t\tuniforms_dst[name] = uniform_src.slice();\n\t\t\t} else {\n\t\t\t\tuniforms_dst[name] = uniform_src;\n\t\t\t}\n\t\t}\n\t\treturn uniforms_dst;\n\t}\n\n\t/**\n\t * Clone json.\n\t * This is faster than JSON.parse(JSON.stringify()).\n\t * @function\n\t * @name cloneJson\n\t * @param {object} obj - The input json.\n\t * @returns {object} - The output json.\n\t */\n\tfunction cloneJson(obj) {\n\t\tconst newObj = Array.isArray(obj) ? [] : {};\n\t\tif (obj && typeof obj === 'object') {\n\t\t\tfor (const key in obj) {\n\t\t\t\tif (obj.hasOwnProperty(key)) {\n\t\t\t\t\tnewObj[key] = obj[key] && typeof obj[key] === 'object' ? cloneJson(obj[key]) : obj[key];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn newObj;\n\t}\n\n\tlet _object3DId = 0;\n\tconst _mat4_1$2 = new Matrix4();\n\n\t/**\n\t * This is the base class for most objects,\n\t * and provides a set of properties and methods for manipulating objects in 3D space.\n\t */\n\tclass Object3D {\n\t\tconstructor() {\n\t\t\t/**\n\t\t\t * Unique number for this object instance.\n\t\t\t * @readonly\n\t\t\t * @type {number}\n\t\t\t */\n\t\t\tthis.id = _object3DId++;\n\n\t\t\t/**\n\t\t\t * UUID of this object instance.\n\t\t\t * This gets automatically assigned, so this shouldn't be edited.\n\t\t\t * @type {string}\n\t\t\t */\n\t\t\tthis.uuid = MathUtils.generateUUID();\n\n\t\t\t/**\n\t\t\t * Optional name of the object (doesn't need to be unique).\n\t\t\t * @type {string}\n\t\t\t * @default \"\"\n\t\t\t */\n\t\t\tthis.name = '';\n\n\t\t\t/**\n\t\t\t * A Vector3 representing the object's local position.\n\t\t\t * @type {Vector3}\n\t\t\t * @default Vector3(0, 0, 0)\n\t\t\t */\n\t\t\tthis.position = new Vector3();\n\n\t\t\t/**\n\t\t\t * The object's local scale.\n\t\t\t * @type {Vector3}\n\t\t\t * @default Vector3(1, 1, 1)\n\t\t\t */\n\t\t\tthis.scale = new Vector3(1, 1, 1);\n\n\t\t\t/**\n\t\t\t * Object's local rotation as an {@link Euler}, in radians.\n\t\t\t * @type {Euler}\n\t\t\t * @default Euler(0, 0, 0)\n\t\t\t */\n\t\t\tthis.euler = new Euler();\n\n\t\t\t/**\n\t\t\t * Object's local rotation as a {@link Quaternion}.\n\t\t\t * @type {Quaternion}\n\t\t\t * @default Quaternion(0, 0, 0, 1)\n\t\t\t */\n\t\t\tthis.quaternion = new Quaternion();\n\n\t\t\t// bind euler and quaternion\n\t\t\tconst euler = this.euler,\n\t\t\t\tquaternion = this.quaternion;\n\t\t\teuler.onChange(function () {\n\t\t\t\tquaternion.setFromEuler(euler, false);\n\t\t\t});\n\t\t\tquaternion.onChange(function () {\n\t\t\t\teuler.setFromQuaternion(quaternion, undefined, false);\n\t\t\t});\n\n\t\t\t/**\n\t\t\t * The local transform matrix.\n\t\t\t * @type {Matrix4}\n\t\t\t */\n\t\t\tthis.matrix = new Matrix4();\n\n\t\t\t/**\n\t\t\t * The global transform of the object.\n\t\t\t * If the Object3D has no parent, then it's identical to the local transform {@link Object3D#matrix}.\n\t\t\t * @type {Matrix4}\n\t\t\t */\n\t\t\tthis.worldMatrix = new Matrix4();\n\n\t\t\t/**\n\t\t\t * Object's parent in the scene graph.\n\t\t\t * An object can have at most one parent.\n\t\t\t * @type {Object3D[]}\n\t\t\t */\n\t\t\tthis.children = new Array();\n\n\t\t\t/**\n\t\t\t * Object's parent in the scene graph.\n\t\t\t * An object can have at most one parent.\n\t\t\t * @type {Object3D}\n\t\t\t */\n\t\t\tthis.parent = null;\n\n\t\t\t/**\n\t\t\t * Whether the object gets rendered into shadow map.\n\t\t\t * @type {boolean}\n\t\t\t * @default false\n\t\t\t */\n\t\t\tthis.castShadow = false;\n\n\t\t\t/**\n\t\t\t * Whether the material receives shadows.\n\t\t\t * @type {boolean}\n\t\t\t * @default false\n\t\t\t */\n\t\t\tthis.receiveShadow = false;\n\n\t\t\t/**\n\t\t\t * Defines shadow map type.\n\t\t\t * Note: In webgl1 or {@link Scene#disableShadowSampler} is true, soft shadow types will fallback to POISSON_SOFT without warning.\n\t\t\t * Note: Point light only support POISSON_SOFT for now.\n\t\t\t * @type {SHADOW_TYPE}\n\t\t\t * @default SHADOW_TYPE.PCF3_SOFT\n\t\t\t */\n\t\t\tthis.shadowType = SHADOW_TYPE.PCF3_SOFT;\n\n\t\t\t/**\n\t\t\t * When this is set, it checks every frame if the object is in the frustum of the camera before rendering the object.\n\t\t\t * Otherwise the object gets rendered every frame even if it isn't visible.\n\t\t\t * @type {boolean}\n\t\t\t * @default true\n\t\t\t */\n\t\t\tthis.frustumCulled = true;\n\n\t\t\t/**\n\t\t\t * Object gets rendered if true.\n\t\t\t * @type {boolean}\n\t\t\t * @default true\n\t\t\t */\n\t\t\tthis.visible = true;\n\n\t\t\t/**\n\t\t\t * This value allows the default rendering order of scene graph objects to be overridden although opaque and transparent objects remain sorted independently.\n\t\t\t * Sorting is from lowest to highest renderOrder.\n\t\t\t * @type {number}\n\t\t\t * @default 0\n\t\t\t */\n\t\t\tthis.renderOrder = 0;\n\n\t\t\t/**\n\t\t\t * Render layer of this object.\n\t\t\t * RenderQueue will dispatch all renderable objects to the corresponding RenderQueueLayer according to object.renderLayer.\n\t\t\t * @type {number}\n\t\t\t * @default 0\n\t\t\t */\n\t\t\tthis.renderLayer = 0;\n\n\t\t\t/**\n\t\t\t * Whether it can be collected into the Render Queue.\n\t\t\t * @type {boolean}\n\t\t\t * @default true\n\t\t\t */\n\t\t\tthis.renderable = true;\n\n\t\t\t/**\n\t\t\t * An object that can be used to store custom data about the {@link Object3D}.\n\t\t\t * It should not hold references to functions as these will not be cloned.\n\t\t\t * @type {object}\n\t\t\t * @default {}\n\t\t\t */\n\t\t\tthis.userData = {};\n\n\t\t\t/**\n\t\t\t * When this is set, it calculates the matrix of position, (rotation or quaternion) and scale every frame and also recalculates the worldMatrix property.\n\t\t\t * @type {boolean}\n\t\t\t * @default true\n\t\t\t */\n\t\t\tthis.matrixAutoUpdate = true;\n\n\t\t\t/**\n\t\t\t * When this is set, it calculates the matrix in that frame and resets this property to false.\n\t\t\t * @type {boolean}\n\t\t\t * @default true\n\t\t\t */\n\t\t\tthis.matrixNeedsUpdate = true;\n\n\t\t\t/**\n\t\t\t * When this is set, it calculates the world matrix in that frame and resets this property to false.\n\t\t\t * @type {boolean}\n\t\t\t * @default true\n\t\t\t */\n\t\t\tthis.worldMatrixNeedsUpdate = true;\n\t\t}\n\n\t\t/**\n\t\t * An optional callback that is executed immediately before the Object3D is rendered.\n\t\t */\n\t\tonBeforeRender() {}\n\n\t\t/**\n\t\t * An optional callback that is executed immediately after the Object3D is rendered.\n\t\t */\n\t\tonAfterRender() {}\n\n\t\t/**\n\t\t * Add object as child of this object.\n\t\t * @param {Object3D} object\n\t\t */\n\t\tadd(object) {\n\t\t\tif (object === this) {\n\t\t\t\tconsole.error('Object3D.add: object can\\'t be added as a child of itself.', object);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (object.parent !== null) {\n\t\t\t\tobject.parent.remove(object);\n\t\t\t}\n\t\t\tobject.parent = this;\n\t\t\tthis.children.push(object);\n\t\t\tobject.worldMatrixNeedsUpdate = true;\n\t\t}\n\n\t\t/**\n\t\t * Remove object as child of this object.\n\t\t * @param {Object3D} object\n\t\t */\n\t\tremove(object) {\n\t\t\tconst index = this.children.indexOf(object);\n\t\t\tif (index !== -1) {\n\t\t\t\tobject.parent = null;\n\t\t\t\tthis.children.splice(index, 1);\n\t\t\t\tobject.worldMatrixNeedsUpdate = true;\n\t\t\t}\n\t\t}\n\n\t\t/**\n\t\t * Searches through the object's children and returns the first with a matching name.\n\t\t * Note that for most objects the name is an empty string by default.\n\t\t * You will have to set it manually to make use of this method.\n\t\t * @param {string} name - String to match to the children's {@link Object3D#name} property.\n\t\t * @returns {Object3D}\n\t\t */\n\t\tgetObjectByName(name) {\n\t\t\treturn this.getObjectByProperty('name', name);\n\t\t}\n\n\t\t/**\n\t\t * Searches through the object's children and returns the first with a property that matches the value given.\n\t\t * @param {string} name - the property name to search for.\n\t\t * @param {number} value - value of the given property.\n\t\t * @returns {Object3D}\n\t\t */\n\t\tgetObjectByProperty(name, value) {\n\t\t\tif (this[name] === value) return this;\n\t\t\tfor (let i = 0, l = this.children.length; i < l; i++) {\n\t\t\t\tconst child = this.children[i];\n\t\t\t\tconst object = child.getObjectByProperty(name, value);\n\t\t\t\tif (object !== undefined) {\n\t\t\t\t\treturn object;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn undefined;\n\t\t}\n\n\t\t/**\n\t\t * Update the local transform.\n\t\t * @param {boolean} force\n\t\t */\n\t\tupdateMatrix(force) {\n\t\t\tif (this.matrixAutoUpdate || this.matrixNeedsUpdate) {\n\t\t\t\tthis.matrix.compose(this.position, this.quaternion, this.scale);\n\t\t\t\tthis.matrixNeedsUpdate = false;\n\t\t\t\tthis.worldMatrixNeedsUpdate = true;\n\t\t\t}\n\t\t\tif (this.worldMatrixNeedsUpdate || force) {\n\t\t\t\tthis.worldMatrix.copy(this.matrix);\n\t\t\t\tif (this.parent) {\n\t\t\t\t\tconst parentMatrix = this.parent.worldMatrix;\n\t\t\t\t\tthis.worldMatrix.premultiply(parentMatrix);\n\t\t\t\t}\n\t\t\t\tthis.worldMatrixNeedsUpdate = false;\n\t\t\t\tforce = true;\n\t\t\t}\n\t\t\tconst children = this.children;\n\t\t\tfor (let i = 0, l = children.length; i < l; i++) {\n\t\t\t\tchildren[i].updateMatrix(force);\n\t\t\t}\n\t\t}\n\n\t\t/**\n\t\t * Returns a vector representing the direction of object's positive z-axis in world space.\n\t\t * This call must be after {@link Object3D#updateMatrix}.\n\t\t * @param {Vector3} [optionalTarget] — the result will be copied into this Vector3.\n\t\t * @returns {Vector3} - the result.\n\t\t */\n\t\tgetWorldDirection(optionalTarget = new Vector3()) {\n\t\t\tconst e = this.worldMatrix.elements;\n\t\t\treturn optionalTarget.set(e[8], e[9], e[10]).normalize();\n\t\t}\n\n\t\t/**\n\t\t * Rotates the object to face a point in local space.\n\t\t * @param {Vector3} target - A vector representing a position in local space.\n\t\t * @param {Vector3} up — A vector representing the up direction in local space.\n\t\t */\n\t\tlookAt(target, up) {\n\t\t\t_mat4_1$2.lookAtRH(target, this.position, up);\n\t\t\tthis.quaternion.setFromRotationMatrix(_mat4_1$2);\n\t\t}\n\n\t\t/**\n\t\t * Method to get intersections between a casted ray and this object.\n\t\t * @abstract\n\t\t * @param {Ray} ray - The {@link Ray} instance.\n\t\t * @param {Array} intersects - output intersects array.\n\t\t */\n\t\traycast(ray, intersects) {}\n\n\t\t/**\n\t\t * Executes the callback on this object and all descendants.\n\t\t * @param {Function} callback - A function with as first argument an object3D object.\n\t\t */\n\t\ttraverse(callback) {\n\t\t\tcallback(this);\n\t\t\tconst children = this.children;\n\t\t\tfor (let i = 0, l = children.length; i < l; i++) {\n\t\t\t\tchildren[i].traverse(callback);\n\t\t\t}\n\t\t}\n\n\t\t/**\n\t\t * Returns a clone of this object and optionally all descendants.\n\t\t * @param {Function} [recursive=true] - if true, descendants of the object are also cloned.\n\t\t * @returns {Object3D}\n\t\t */\n\t\tclone(recursive) {\n\t\t\treturn new this.constructor().copy(this, recursive);\n\t\t}\n\n\t\t/**\n\t\t * Copy the given object into this object.\n\t\t * @param {Object3D} source - The object to be copied.\n\t\t * @param {boolean} [recursive=true] - if true, descendants of the object are also copied.\n\t\t * @returns {Object3D}\n\t\t */\n\t\tcopy(source, recursive = true) {\n\t\t\tthis.name = source.name;\n\t\t\tthis.position.copy(source.position);\n\t\t\tthis.quaternion.copy(source.quaternion);\n\t\t\tthis.scale.copy(source.scale);\n\t\t\tthis.matrix.copy(source.matrix);\n\t\t\tthis.worldMatrix.copy(source.worldMatrix);\n\t\t\tthis.castShadow = source.castShadow;\n\t\t\tthis.receiveShadow = source.receiveShadow;\n\t\t\tthis.shadowType = source.shadowType;\n\t\t\tthis.frustumCulled = source.frustumCulled;\n\t\t\tthis.visible = source.visible;\n\t\t\tthis.renderOrder = source.renderOrder;\n\t\t\tthis.renderLayer = source.renderLayer;\n\t\t\tthis.renderable = source.renderable;\n\t\t\tthis.userData = cloneJson(source.userData);\n\t\t\tif (recursive === true) {\n\t\t\t\tfor (let i = 0; i < source.children.length; i++) {\n\t\t\t\t\tconst child = source.children[i];\n\t\t\t\t\tthis.add(child.clone());\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn this;\n\t\t}\n\t}\n\n\t/**\n\t * This flag can be used for type testing.\n\t * @readonly\n\t * @type {boolean}\n\t * @default true\n\t */\n\tObject3D.prototype.isObject3D = true;\n\n\tconst _plane_1 = new Plane();\n\tlet _sceneDataId = 0;\n\n\t/**\n\t * SceneData collect all render states about scene, Including lights.\n\t */\n\tclass SceneData {\n\t\tconstructor() {\n\t\t\tthis.id = _sceneDataId++;\n\t\t\tthis.version = 0;\n\t\t\tthis.useAnchorMatrix = false;\n\t\t\tthis.anchorMatrix = new Matrix4();\n\t\t\tthis.anchorMatrixInverse = new Matrix4();\n\t\t\tthis.disableShadowSampler = false;\n\t\t\tthis.logarithmicDepthBuffer = false;\n\t\t\tthis.fog = null;\n\t\t\tthis.environment = null;\n\t\t\tthis.envDiffuseIntensity = 1;\n\t\t\tthis.envSpecularIntensity = 1;\n\t\t\tthis.clippingPlanesData = new Float32Array([]);\n\t\t\tthis.numClippingPlanes = 0;\n\t\t}\n\n\t\t/**\n\t\t * Update scene data.\n\t\t * @param {Scene} scene\n\t\t */\n\t\tupdate(scene) {\n\t\t\tthis.useAnchorMatrix = !scene.anchorMatrix.isIdentity();\n\t\t\tthis.anchorMatrix.copy(scene.anchorMatrix);\n\t\t\tthis.anchorMatrixInverse.copy(scene.anchorMatrix).invert();\n\t\t\tthis.disableShadowSampler = scene.disableShadowSampler;\n\t\t\tthis.logarithmicDepthBuffer = scene.logarithmicDepthBuffer;\n\t\t\tthis.fog = scene.fog;\n\t\t\tthis.environment = scene.environment;\n\t\t\tthis.envDiffuseIntensity = scene.envDiffuseIntensity;\n\t\t\tthis.envSpecularIntensity = scene.envSpecularIntensity;\n\t\t\tif (this.clippingPlanesData.length < scene.clippingPlanes.length * 4) {\n\t\t\t\tthis.clippingPlanesData = new Float32Array(scene.clippingPlanes.length * 4);\n\t\t\t}\n\t\t\tthis.setClippingPlanesData(scene.clippingPlanes, this.clippingPlanesData);\n\t\t\tthis.numClippingPlanes = scene.clippingPlanes.length;\n\t\t\tthis.version++;\n\t\t}\n\t\tsetClippingPlanesData(clippingPlanes, clippingPlanesData) {\n\t\t\tfor (let i = 0; i < clippingPlanes.length; i++) {\n\t\t\t\t_plane_1.copy(clippingPlanes[i]);\n\t\t\t\tif (this.useAnchorMatrix) {\n\t\t\t\t\t_plane_1.applyMatrix4(this.anchorMatrixInverse);\n\t\t\t\t}\n\t\t\t\tclippingPlanesData[i * 4 + 0] = _plane_1.normal.x;\n\t\t\t\tclippingPlanesData[i * 4 + 1] = _plane_1.normal.y;\n\t\t\t\tclippingPlanesData[i * 4 + 2] = _plane_1.normal.z;\n\t\t\t\tclippingPlanesData[i * 4 + 3] = _plane_1.constant;\n\t\t\t}\n\t\t\treturn clippingPlanesData;\n\t\t}\n\t}\n\n\t/**\n\t * Abstract base class for lights\n\t * - The light's direction is defined as the 3-vector (0.0, 0,0, -1.0), that is, an untransformed light points down the -Z axis.\n\t * - all other light types inherit the properties and methods described here.\n\t * @abstract\n\t * @extends Object3D\n\t */\n\tclass Light extends Object3D {\n\t\t/**\n\t\t * @param {number} [color=0xffffff]\n\t\t * @param {number} [intensity=1]\n\t\t */\n\t\tconstructor(color = 0xffffff, intensity = 1) {\n\t\t\tsuper();\n\n\t\t\t/**\n\t\t\t * Color of the light.\n\t\t\t * @type {Color3}\n\t\t\t * @default Color3(0xffffff)\n\t\t\t */\n\t\t\tthis.color = new Color3(color);\n\n\t\t\t/**\n\t\t\t * The light's intensity, or strength.\n\t\t\t * @type {number}\n\t\t\t * @default 1\n\t\t\t */\n\t\t\tthis.intensity = intensity;\n\n\t\t\t/**\n\t\t\t * Group mask of the light, indicating which lighting group the light belongs to. Default is 1 (binary 0001), meaning the light belongs to lighting group 0.\n\t\t\t * For example, to make the light effective in both lighting group 0 and lighting group 1, set groupMask to 3 (binary 0011).\n\t\t\t * Used in conjunction with {@link Material#lightingGroup}.\n\t\t\t * @type {number}\n\t\t\t * @default 1\n\t\t\t */\n\t\t\tthis.groupMask = 1;\n\t\t}\n\n\t\t/**\n\t\t * Set light direction, this func will set quaternion of this light.\n\t\t * @param {Vector3} target - The target that the light look at.\n\t\t * @param {Vector3} up - The up direction of the light.\n\t\t */\n\t\tlookAt(target, up) {\n\t\t\t_mat4_1$1.lookAtRH(this.position, target, up);\n\t\t\tthis.quaternion.setFromRotationMatrix(_mat4_1$1);\n\t\t}\n\n\t\t/**\n\t\t * Copies properties from the source light into this one.\n\t\t * @param {Light} source - The source light.\n\t\t * @returns {Light} - This light.\n\t\t */\n\t\tcopy(source) {\n\t\t\tsuper.copy(source);\n\t\t\tthis.color.copy(source.color);\n\t\t\tthis.intensity = source.intensity;\n\t\t\tthis.groupMask = source.groupMask;\n\t\t\treturn this;\n\t\t}\n\t}\n\n\t/**\n\t * This flag can be used for type testing.\n\t * @readonly\n\t * @type {boolean}\n\t * @default true\n\t */\n\tLight.prototype.isLight = true;\n\tconst _mat4_1$1 = new Matrix4();\n\n\t/**\n\t * RectAreaLight emits light uniformly across the face a rectangular plane.\n\t * This light can be used to simulate light sources such as bright windows or strip lighting.\n\t * Important Notes:\n\t * - There is no shadow support.\n\t * - Only PBRMaterial are supported.\n\t * - You have to set LTC1 and LTC2 in RectAreaLight before using it.\n\t * @extends Light\n\t */\n\tclass RectAreaLight extends Light {\n\t\t/**\n\t\t * @param {number} [color=0xffffff]\n\t\t * @param {number} [intensity=1]\n\t\t * @param {number} [width=10]\n\t\t * @param {number} [height=10]\n\t\t */\n\t\tconstructor(color, intensity, width = 10, height = 10) {\n\t\t\tsuper(color, intensity);\n\n\t\t\t/**\n\t\t\t * The width of the light.\n\t\t\t * @type {number}\n\t\t\t * @default 10\n\t\t\t */\n\t\t\tthis.width = width;\n\n\t\t\t/**\n\t\t\t * The height of the light.\n\t\t\t * @type {number}\n\t\t\t * @default 10\n\t\t\t */\n\t\t\tthis.height = height;\n\t\t}\n\n\t\t/**\n\t\t * The light's power.\n\t\t * Power is the luminous power of the light measured in lumens (lm).\n\t\t * Changing the power will also change the light's intensity.\n\t\t * @type {number}\n\t\t */\n\t\tget power() {\n\t\t\t// compute the light's luminous power (in lumens) from its intensity (in nits)\n\t\t\treturn this.intensity * this.width * this.height * Math.PI;\n\t\t}\n\t\tset power(power) {\n\t\t\t// set the light's intensity (in nits) from the desired luminous power (in lumens)\n\t\t\tthis.intensity = power / (this.width * this.height * Math.PI);\n\t\t}\n\t\tcopy(source) {\n\t\t\tsuper.copy(source);\n\t\t\tthis.width = source.width;\n\t\t\tthis.height = source.height;\n\t\t\treturn this;\n\t\t}\n\t}\n\n\t/**\n\t * This flag can be used for type testing.\n\t * @readonly\n\t * @type {boolean}\n\t * @default true\n\t */\n\tRectAreaLight.prototype.isRectAreaLight = true;\n\n\t/**\n\t * The first LTC (Linearly Transformed Cosines).\n\t * If you want to use RectAreaLight, you have to set this before using it.\n\t * @type {null | Texture2D}\n\t */\n\tRectAreaLight.LTC1 = null;\n\n\t/**\n\t * The second LTC (Linearly Transformed Cosines).\n\t * If you want to use RectAreaLight, you have to set this before using it.\n\t * @type {null | Texture2D}\n\t */\n\tRectAreaLight.LTC2 = null;\n\n\tclass LightingGroup extends EventDispatcher {\n\t\tconstructor() {\n\t\t\tsuper();\n\t\t\tthis.id = _lightingGroupId++;\n\n\t\t\t// Light collection array\n\n\t\t\tthis.lights = [];\n\n\t\t\t// Data caches\n\n\t\t\tthis.ambient = new Float32Array([0, 0, 0]);\n\t\t\tthis.sh = new Float32Array(27);\n\t\t\tthis.hemisphere = [];\n\t\t\tthis.directional = [];\n\t\t\tthis.directionalShadow = [];\n\t\t\tthis.directionalShadowMap = [];\n\t\t\tthis.directionalShadowDepthMap = [];\n\t\t\tthis.directionalShadowMatrix = new Float32Array(0);\n\t\t\tthis.point = [];\n\t\t\tthis.pointShadow = [];\n\t\t\tthis.pointShadowMap = [];\n\t\t\tthis.pointShadowMatrix = new Float32Array(0);\n\t\t\tthis.spot = [];\n\t\t\tthis.spotShadow = [];\n\t\t\tthis.spotShadowMap = [];\n\t\t\tthis.spotShadowDepthMap = [];\n\t\t\tthis.spotShadowMatrix = new Float32Array(0);\n\t\t\tthis.rectArea = [];\n\t\t\tthis.LTC1 = null;\n\t\t\tthis.LTC2 = null;\n\n\t\t\t// Status\n\n\t\t\tthis.useAmbient = false;\n\t\t\tthis.useSphericalHarmonics = false;\n\t\t\tthis.hemisNum = 0;\n\t\t\tthis.directsNum = 0;\n\t\t\tthis.pointsNum = 0;\n\t\t\tthis.spotsNum = 0;\n\t\t\tthis.rectAreaNum = 0;\n\t\t\tthis.directShadowNum = 0;\n\t\t\tthis.pointShadowNum = 0;\n\t\t\tthis.spotShadowNum = 0;\n\t\t\tthis.totalNum = 0;\n\t\t\tthis.shadowsNum = 0;\n\n\t\t\t// Version\n\n\t\t\tthis.version = 0;\n\t\t}\n\t\tbegin() {\n\t\t\tthis.totalNum = 0;\n\t\t\tthis.shadowsNum = 0;\n\t\t}\n\t\tpush(light, shadow) {\n\t\t\tthis.lights[this.totalNum++] = light;\n\t\t\tif (shadow) {\n\t\t\t\tthis.shadowsNum++;\n\t\t\t}\n\t\t}\n\t\tend(sceneData) {\n\t\t\tthis.lights.length = this.totalNum;\n\t\t\tthis._setupCache(sceneData);\n\t\t\tthis.version++;\n\t\t}\n\t\tdispose() {\n\t\t\tthis.dispatchEvent({\n\t\t\t\ttype: 'dispose'\n\t\t\t});\n\t\t}\n\t\t_setupCache(sceneData) {\n\t\t\tfor (let i = 0; i < 3; i++) {\n\t\t\t\tthis.ambient[i] = 0;\n\t\t\t}\n\t\t\tfor (let i = 0; i < this.sh.length; i++) {\n\t\t\t\tthis.sh[i] = 0;\n\t\t\t}\n\t\t\tthis.useAmbient = false;\n\t\t\tthis.useSphericalHarmonics = false;\n\t\t\tthis.hemisNum = 0;\n\t\t\tthis.directsNum = 0;\n\t\t\tthis.pointsNum = 0;\n\t\t\tthis.spotsNum = 0;\n\t\t\tthis.rectAreaNum = 0;\n\t\t\tthis.directShadowNum = 0;\n\t\t\tthis.pointShadowNum = 0;\n\t\t\tthis.spotShadowNum = 0;\n\t\t\tthis.LTC1 = null;\n\t\t\tthis.LTC2 = null;\n\n\t\t\t// Setup Uniforms\n\n\t\t\tfor (let i = 0, l = this.lights.length; i < l; i++) {\n\t\t\t\tconst light = this.lights[i];\n\t\t\t\tif (light.isAmbientLight) {\n\t\t\t\t\tthis._doAddAmbientLight(light);\n\t\t\t\t} else if (light.isHemisphereLight) {\n\t\t\t\t\tthis._doAddHemisphereLight(light, sceneData);\n\t\t\t\t} else if (light.isDirectionalLight) {\n\t\t\t\t\tthis._doAddDirectLight(light, sceneData);\n\t\t\t\t} else if (light.isPointLight) {\n\t\t\t\t\tthis._doAddPointLight(light, sceneData);\n\t\t\t\t} else if (light.isSpotLight) {\n\t\t\t\t\tthis._doAddSpotLight(light, sceneData);\n\t\t\t\t} else if (light.isSphericalHarmonicsLight) {\n\t\t\t\t\tthis._doAddSphericalHarmonicsLight(light);\n\t\t\t\t} else if (light.isRectAreaLight) {\n\t\t\t\t\tthis._doAddRectAreaLight(light, sceneData);\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst directShadowNum = this.directShadowNum;\n\t\t\tif (directShadowNum > 0) {\n\t\t\t\tthis.directionalShadowMap.length = directShadowNum;\n\t\t\t\tthis.directionalShadowDepthMap.length = directShadowNum;\n\t\t\t\ttempDirectionalShadowMatrices.length = directShadowNum;\n\t\t\t\tif (this.directionalShadowMatrix.length !== directShadowNum * 16) {\n\t\t\t\t\tthis.directionalShadowMatrix = new Float32Array(directShadowNum * 16);\n\t\t\t\t}\n\t\t\t\tfor (let i = 0; i < directShadowNum; i++) {\n\t\t\t\t\ttempDirectionalShadowMatrices[i].toArray(this.directionalShadowMatrix, i * 16);\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst pointShadowNum = this.pointShadowNum;\n\t\t\tif (pointShadowNum > 0) {\n\t\t\t\tthis.pointShadowMap.length = pointShadowNum;\n\t\t\t\ttempPointShadowMatrices.length = pointShadowNum;\n\t\t\t\tif (this.pointShadowMatrix.length !== pointShadowNum * 16) {\n\t\t\t\t\tthis.pointShadowMatrix = new Float32Array(pointShadowNum * 16);\n\t\t\t\t}\n\t\t\t\tfor (let i = 0; i < pointShadowNum; i++) {\n\t\t\t\t\ttempPointShadowMatrices[i].toArray(this.pointShadowMatrix, i * 16);\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst spotShadowNum = this.spotShadowNum;\n\t\t\tif (spotShadowNum > 0) {\n\t\t\t\tthis.spotShadowMap.length = spotShadowNum;\n\t\t\t\tthis.spotShadowDepthMap.length = spotShadowNum;\n\t\t\t\ttempSpotShadowMatrices.length = spotShadowNum;\n\t\t\t\tif (this.spotShadowMatrix.length !== spotShadowNum * 16) {\n\t\t\t\t\tthis.spotShadowMatrix = new Float32Array(spotShadowNum * 16);\n\t\t\t\t}\n\t\t\t\tfor (let i = 0; i < spotShadowNum; i++) {\n\t\t\t\t\ttempSpotShadowMatrices[i].toArray(this.spotShadowMatrix, i * 16);\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (this.rectAreaNum > 0) {\n\t\t\t\tthis.LTC1 = RectAreaLight.LTC1;\n\t\t\t\tthis.LTC2 = RectAreaLight.LTC2;\n\t\t\t}\n\t\t}\n\t\t_doAddAmbientLight(object) {\n\t\t\tconst intensity = object.intensity;\n\t\t\tconst color = object.color;\n\t\t\tthis.ambient[0] += color.r * intensity;\n\t\t\tthis.ambient[1] += color.g * intensity;\n\t\t\tthis.ambient[2] += color.b * intensity;\n\t\t\tthis.useAmbient = true;\n\t\t}\n\t\t_doAddSphericalHarmonicsLight(object) {\n\t\t\tconst intensity = object.intensity;\n\t\t\tconst sh = object.sh.coefficients;\n\t\t\tfor (let i = 0; i < sh.length; i += 1) {\n\t\t\t\tthis.sh[i * 3] += sh[i].x * intensity;\n\t\t\t\tthis.sh[i * 3 + 1] += sh[i].y * intensity;\n\t\t\t\tthis.sh[i * 3 + 2] += sh[i].z * intensity;\n\t\t\t}\n\t\t\tthis.useSphericalHarmonics = true;\n\t\t}\n\t\t_doAddHemisphereLight(object, sceneData) {\n\t\t\tconst intensity = object.intensity;\n\t\t\tconst skyColor = object.color;\n\t\t\tconst groundColor = object.groundColor;\n\t\t\tconst useAnchorMatrix = sceneData.useAnchorMatrix;\n\t\t\tconst cache = getLightCache(object);\n\t\t\tcache.skyColor[0] = skyColor.r * intensity;\n\t\t\tcache.skyColor[1] = skyColor.g * intensity;\n\t\t\tcache.skyColor[2] = skyColor.b * intensity;\n\t\t\tcache.groundColor[0] = groundColor.r * intensity;\n\t\t\tcache.groundColor[1] = groundColor.g * intensity;\n\t\t\tcache.groundColor[2] = groundColor.b * intensity;\n\t\t\tconst e = object.worldMatrix.elements;\n\t\t\tconst direction = helpVector3.set(e[4], e[5], e[6]).normalize();\n\t\t\tif (useAnchorMatrix) {\n\t\t\t\tdirection.transformDirection(sceneData.anchorMatrixInverse);\n\t\t\t}\n\t\t\tdirection.toArray(cache.direction);\n\t\t\tthis.hemisphere[this.hemisNum++] = cache;\n\t\t}\n\t\t_doAddDirectLight(object, sceneData) {\n\t\t\tconst intensity = object.intensity;\n\t\t\tconst color = object.color;\n\t\t\tconst useAnchorMatrix = sceneData.useAnchorMatrix;\n\t\t\tconst cache = getLightCache(object);\n\t\t\tcache.color[0] = color.r * intensity;\n\t\t\tcache.color[1] = color.g * intensity;\n\t\t\tcache.color[2] = color.b * intensity;\n\t\t\tconst direction = object.getWorldDirection(helpVector3);\n\t\t\tif (useAnchorMatrix) {\n\t\t\t\tdirection.transformDirection(sceneData.anchorMatrixInverse);\n\t\t\t}\n\t\t\tdirection.multiplyScalar(-1).toArray(cache.direction);\n\t\t\tif (object.castShadow) {\n\t\t\t\tconst shadow = object.shadow;\n\t\t\t\tconst shadowCache = getShadowCache(object);\n\t\t\t\tshadowCache.shadowBias[0] = shadow.bias;\n\t\t\t\tshadowCache.shadowBias[1] = shadow.normalBias;\n\t\t\t\tshadowCache.shadowMapSize[0] = shadow.mapSize.x;\n\t\t\t\tshadowCache.shadowMapSize[1] = shadow.mapSize.y;\n\t\t\t\tshadowCache.shadowParams[0] = shadow.radius;\n\t\t\t\tshadowCache.shadowParams[1] = shadow.frustumEdgeFalloff;\n\t\t\t\tthis.directionalShadow[this.directShadowNum++] = shadowCache;\n\t\t\t\tshadow.update(object);\n\t\t\t\tshadow.updateMatrix();\n\t\t\t\tif (useAnchorMatrix) {\n\t\t\t\t\tshadow.matrix.multiply(sceneData.anchorMatrix);\n\t\t\t\t}\n\t\t\t\tthis.directionalShadowMap[this.directsNum] = shadow.map;\n\t\t\t\tthis.directionalShadowDepthMap[this.directsNum] = shadow.depthMap;\n\t\t\t\ttempDirectionalShadowMatrices[this.directsNum] = shadow.matrix;\n\t\t\t}\n\t\t\tthis.directional[this.directsNum++] = cache;\n\t\t}\n\t\t_doAddPointLight(object, sceneData) {\n\t\t\tconst intensity = object.intensity;\n\t\t\tconst color = object.color;\n\t\t\tconst distance = object.distance;\n\t\t\tconst decay = object.decay;\n\t\t\tconst useAnchorMatrix = sceneData.useAnchorMatrix;\n\t\t\tconst cache = getLightCache(object);\n\t\t\tcache.color[0] = color.r * intensity;\n\t\t\tcache.color[1] = color.g * intensity;\n\t\t\tcache.color[2] = color.b * intensity;\n\t\t\tcache.distance = distance;\n\t\t\tcache.decay = decay;\n\t\t\tconst position = helpVector3.setFromMatrixPosition(object.worldMatrix);\n\t\t\tif (useAnchorMatrix) {\n\t\t\t\tposition.applyMatrix4(sceneData.anchorMatrixInverse);\n\t\t\t}\n\t\t\tcache.position[0] = position.x;\n\t\t\tcache.position[1] = position.y;\n\t\t\tcache.position[2] = position.z;\n\t\t\tif (object.castShadow) {\n\t\t\t\tconst shadow = object.shadow;\n\t\t\t\tconst shadowCache = getShadowCache(object);\n\t\t\t\tshadowCache.shadowBias[0] = shadow.bias;\n\t\t\t\tshadowCache.shadowBias[1] = shadow.normalBias;\n\t\t\t\tshadowCache.shadowMapSize[0] = shadow.mapSize.x;\n\t\t\t\tshadowCache.shadowMapSize[1] = shadow.mapSize.y;\n\t\t\t\tshadowCache.shadowParams[0] = shadow.radius;\n\t\t\t\tshadowCache.shadowParams[1] = 0;\n\t\t\t\tshadowCache.shadowCameraRange[0] = shadow.cameraNear;\n\t\t\t\tshadowCache.shadowCameraRange[1] = shadow.cameraFar;\n\t\t\t\tthis.pointShadow[this.pointShadowNum++] = shadowCache;\n\t\t\t\tshadow.update(object, 0);\n\t\t\t\tshadow.matrix.makeTranslation(-position.x, -position.y, -position.z); // for point light\n\n\t\t\t\tthis.pointShadowMap[this.pointsNum] = shadow.map;\n\t\t\t\ttempPointShadowMatrices[this.pointsNum] = shadow.matrix;\n\t\t\t}\n\t\t\tthis.point[this.pointsNum++] = cache;\n\t\t}\n\t\t_doAddSpotLight(object, sceneData) {\n\t\t\tconst intensity = object.intensity;\n\t\t\tconst color = object.color;\n\t\t\tconst distance = object.distance;\n\t\t\tconst decay = object.decay;\n\t\t\tconst useAnchorMatrix = sceneData.useAnchorMatrix;\n\t\t\tconst cache = getLightCache(object);\n\t\t\tcache.color[0] = color.r * intensity;\n\t\t\tcache.color[1] = color.g * intensity;\n\t\t\tcache.color[2] = color.b * intensity;\n\t\t\tcache.distance = distance;\n\t\t\tcache.decay = decay;\n\t\t\tconst position = helpVector3.setFromMatrixPosition(object.worldMatrix);\n\t\t\tif (useAnchorMatrix) {\n\t\t\t\tposition.applyMatrix4(sceneData.anchorMatrixInverse);\n\t\t\t}\n\t\t\tcache.position[0] = position.x;\n\t\t\tcache.position[1] = position.y;\n\t\t\tcache.position[2] = position.z;\n\t\t\tconst direction = object.getWorldDirection(helpVector3);\n\t\t\tif (useAnchorMatrix) {\n\t\t\t\tdirection.transformDirection(sceneData.anchorMatrixInverse);\n\t\t\t}\n\t\t\tdirection.multiplyScalar(-1).toArray(cache.direction);\n\t\t\tconst coneCos = Math.cos(object.angle);\n\t\t\tconst penumbraCos = Math.cos(object.angle * (1 - object.penumbra));\n\t\t\tcache.coneCos = coneCos;\n\t\t\tcache.penumbraCos = penumbraCos;\n\t\t\tif (object.castShadow) {\n\t\t\t\tconst shadow = object.shadow;\n\t\t\t\tconst shadowCache = getShadowCache(object);\n\t\t\t\tshadowCache.shadowBias[0] = shadow.bias;\n\t\t\t\tshadowCache.shadowBias[1] = shadow.normalBias;\n\t\t\t\tshadowCache.shadowMapSize[0] = shadow.mapSize.x;\n\t\t\t\tshadowCache.shadowMapSize[1] = shadow.mapSize.y;\n\t\t\t\tshadowCache.shadowParams[0] = shadow.radius;\n\t\t\t\tshadowCache.shadowParams[1] = shadow.frustumEdgeFalloff;\n\t\t\t\tthis.spotShadow[this.spotShadowNum++] = shadowCache;\n\t\t\t\tshadow.update(object);\n\t\t\t\tshadow.updateMatrix();\n\t\t\t\tif (useAnchorMatrix) {\n\t\t\t\t\tshadow.matrix.multiply(sceneData.anchorMatrix);\n\t\t\t\t}\n\t\t\t\tthis.spotShadowMap[this.spotsNum] = shadow.map;\n\t\t\t\tthis.spotShadowDepthMap[this.spotsNum] = shadow.depthMap;\n\t\t\t\ttempSpotShadowMatrices[this.spotsNum] = shadow.matrix;\n\t\t\t}\n\t\t\tthis.spot[this.spotsNum++] = cache;\n\t\t}\n\t\t_doAddRectAreaLight(object, sceneData) {\n\t\t\tconst intensity = object.intensity;\n\t\t\tconst color = object.color;\n\t\t\tconst halfHeight = object.height;\n\t\t\tconst halfWidth = object.width;\n\t\t\tconst useAnchorMatrix = sceneData.useAnchorMatrix;\n\t\t\tconst cache = getLightCache(object);\n\t\t\tcache.color[0] = color.r * intensity;\n\t\t\tcache.color[1] = color.g * intensity;\n\t\t\tcache.color[2] = color.b * intensity;\n\t\t\tconst position = helpVector3.setFromMatrixPosition(object.worldMatrix);\n\t\t\tif (useAnchorMatrix) {\n\t\t\t\tposition.applyMatrix4(sceneData.anchorMatrixInverse);\n\t\t\t}\n\t\t\tcache.position[0] = position.x;\n\t\t\tcache.position[1] = position.y;\n\t\t\tcache.position[2] = position.z;\n\n\t\t\t// extract rotation of light to derive width/height half vectors\n\t\t\thelpMatrix4$1.copy(object.worldMatrix);\n\t\t\tif (useAnchorMatrix) {\n\t\t\t\thelpMatrix4$1.premultiply(sceneData.anchorMatrixInverse);\n\t\t\t}\n\t\t\thelpMatrix4$1.extractRotation(helpMatrix4$1);\n\t\t\tconst halfWidthPos = helpVector3.set(halfWidth * 0.5, 0.0, 0.0);\n\t\t\thalfWidthPos.applyMatrix4(helpMatrix4$1);\n\t\t\tcache.halfWidth[0] = halfWidthPos.x;\n\t\t\tcache.halfWidth[1] = halfWidthPos.y;\n\t\t\tcache.halfWidth[2] = halfWidthPos.z;\n\t\t\tconst halfHeightPos = helpVector3.set(0.0, halfHeight * 0.5, 0.0);\n\t\t\thalfHeightPos.applyMatrix4(helpMatrix4$1);\n\t\t\tcache.halfHeight[0] = halfHeightPos.x;\n\t\t\tcache.halfHeight[1] = halfHeightPos.y;\n\t\t\tcache.halfHeight[2] = halfHeightPos.z;\n\t\t\tthis.rectArea[this.rectAreaNum++] = cache;\n\t\t}\n\t}\n\n\t// Variables\n\n\tlet _lightingGroupId = 0;\n\tconst helpVector3 = new Vector3();\n\tconst helpMatrix4$1 = new Matrix4();\n\tconst tempDirectionalShadowMatrices = [];\n\tconst tempPointShadowMatrices = [];\n\tconst tempSpotShadowMatrices = [];\n\n\t// Light caches\n\n\tconst lightCaches = new WeakMap();\n\tfunction getLightCache(light) {\n\t\tif (lightCaches.has(light)) {\n\t\t\treturn lightCaches.get(light);\n\t\t}\n\t\tlet cache;\n\t\tif (light.isHemisphereLight) {\n\t\t\tcache = {\n\t\t\t\tdirection: new Float32Array(3),\n\t\t\t\tskyColor: new Float32Array([0, 0, 0]),\n\t\t\t\tgroundColor: new Float32Array([0, 0, 0])\n\t\t\t};\n\t\t} else if (light.isDirectionalLight) {\n\t\t\tcache = {\n\t\t\t\tdirection: new Float32Array(3),\n\t\t\t\tcolor: new Float32Array([0, 0, 0])\n\t\t\t};\n\t\t} else if (light.isPointLight) {\n\t\t\tcache = {\n\t\t\t\tposition: new Float32Array(3),\n\t\t\t\tcolor: new Float32Array([0, 0, 0]),\n\t\t\t\tdistance: 0,\n\t\t\t\tdecay: 0\n\t\t\t};\n\t\t} else if (light.isSpotLight) {\n\t\t\tcache = {\n\t\t\t\tposition: new Float32Array(3),\n\t\t\t\tdirection: new Float32Array(3),\n\t\t\t\tcolor: new Float32Array([0, 0, 0]),\n\t\t\t\tdistance: 0,\n\t\t\t\tconeCos: 0,\n\t\t\t\tpenumbraCos: 0,\n\t\t\t\tdecay: 0\n\t\t\t};\n\t\t} else if (light.isRectAreaLight) {\n\t\t\tcache = {\n\t\t\t\tposition: new Float32Array(3),\n\t\t\t\tcolor: new Float32Array([0, 0, 0]),\n\t\t\t\thalfWidth: new Float32Array(3),\n\t\t\t\thalfHeight: new Float32Array(3)\n\t\t\t};\n\t\t}\n\t\tlightCaches.set(light, cache);\n\t\treturn cache;\n\t}\n\n\t// Shadow caches\n\n\tconst shadowCaches = new WeakMap();\n\tfunction getShadowCache(light) {\n\t\tif (shadowCaches.has(light)) {\n\t\t\treturn shadowCaches.get(light);\n\t\t}\n\t\tlet cache;\n\t\tif (light.isDirectionalLight) {\n\t\t\tcache = {\n\t\t\t\tshadowBias: new Float32Array(2),\n\t\t\t\t// [bias, normalBias]\n\t\t\t\tshadowMapSize: new Float32Array(2),\n\t\t\t\t// [width, height]\n\t\t\t\tshadowParams: new Float32Array(2) // [radius, frustumEdgeFalloff]\n\t\t\t};\n\t\t} else if (light.isPointLight) {\n\t\t\tcache = {\n\t\t\t\tshadowBias: new Float32Array(2),\n\t\t\t\t// [bias, normalBias]\n\t\t\t\tshadowMapSize: new Float32Array(2),\n\t\t\t\t// [width, height]\n\t\t\t\tshadowParams: new Float32Array(2),\n\t\t\t\t// [radius, 0]\n\t\t\t\tshadowCameraRange: new Float32Array(2) // [cameraNear, cameraFar]\n\t\t\t};\n\t\t} else if (light.isSpotLight) {\n\t\t\tcache = {\n\t\t\t\tshadowBias: new Float32Array(2),\n\t\t\t\t// [bias, normalBias]\n\t\t\t\tshadowMapSize: new Float32Array(2),\n\t\t\t\t// [width, height]\n\t\t\t\tshadowParams: new Float32Array(2) // [radius, frustumEdgeFalloff]\n\t\t\t};\n\t\t}\n\t\tshadowCaches.set(light, cache);\n\t\treturn cache;\n\t}\n\n\tclass LightingData {\n\t\tconstructor() {\n\t\t\tthis.lightsArray = [];\n\t\t\tthis.shadowsNum = 0;\n\t\t\tthis.groupList = [];\n\t\t\tthis.groupList.push(new LightingGroup()); // create default group 0\n\n\t\t\tthis._locked = true;\n\t\t}\n\t\tgetGroup(id) {\n\t\t\treturn this.groupList[id];\n\t\t}\n\t\tsetMaxGroupCount(max) {\n\t\t\tmax = Math.max(1, max); // at least one group\n\n\t\t\tconst groupList = this.groupList;\n\t\t\tconst oldMax = groupList.length;\n\t\t\tif (max < oldMax) {\n\t\t\t\tfor (let i = max; i < oldMax; i++) {\n\t\t\t\t\tgroupList[i].dispose();\n\t\t\t\t}\n\t\t\t\tgroupList.length = max;\n\t\t\t} else if (max > oldMax) {\n\t\t\t\tfor (let i = oldMax; i < max; i++) {\n\t\t\t\t\tgroupList.push(new LightingGroup());\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tbegin() {\n\t\t\tif (!this._locked) {\n\t\t\t\tconsole.warn('LightingData: begin() called without end().');\n\t\t\t}\n\t\t\tthis.lightsArray.length = 0;\n\t\t\tthis.shadowsNum = 0;\n\t\t\tthis._locked = false;\n\t\t}\n\t\tcollect(light) {\n\t\t\tif (this._locked) return;\n\t\t\tthis.lightsArray.push(light);\n\t\t\tif (castShadow(light)) {\n\t\t\t\tthis.shadowsNum++;\n\t\t\t}\n\t\t}\n\t\tend(sceneData) {\n\t\t\tconst lightsArray = this.lightsArray;\n\t\t\tconst shadowsNum = this.shadowsNum;\n\t\t\tconst groupList = this.groupList;\n\t\t\tlightsArray.sort(shadowCastingLightsFirst);\n\t\t\tlet i, l;\n\t\t\tfor (i = 0, l = groupList.length; i < l; i++) {\n\t\t\t\tgroupList[i].begin();\n\t\t\t}\n\t\t\tfor (i = 0, l = lightsArray.length; i < l; i++) {\n\t\t\t\tthis._distribute(lightsArray[i], i < shadowsNum);\n\t\t\t}\n\t\t\tfor (i = 0, l = groupList.length; i < l; i++) {\n\t\t\t\tgroupList[i].end(sceneData);\n\t\t\t}\n\t\t\tthis._locked = true;\n\t\t}\n\t\t_distribute(light, shadow) {\n\t\t\tconst groupMask = light.groupMask;\n\t\t\tconst groupList = this.groupList;\n\n\t\t\t// optimize for single group\n\t\t\tif (groupList.length === 1 && groupMask & 1) {\n\t\t\t\tgroupList[0].push(light, shadow);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tfor (let i = 0, l = groupList.length; i < l; i++) {\n\t\t\t\tconst mask = 1 << i;\n\t\t\t\tif (groupMask < mask) break;\n\t\t\t\tif (groupMask & mask) {\n\t\t\t\t\tgroupList[i].push(light, shadow);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\tfunction shadowCastingLightsFirst(lightA, lightB) {\n\t\tconst a = castShadow(lightA) ? 1 : 0;\n\t\tconst b = castShadow(lightB) ? 1 : 0;\n\t\treturn b - a;\n\t}\n\tfunction castShadow(light) {\n\t\treturn light.shadow && light.castShadow;\n\t}\n\n\tfunction _isPerspectiveMatrix$1(m) {\n\t\treturn m.elements[11] === -1;\n\t}\n\tlet _cameraDataId = 0;\n\n\t/**\n\t * RenderStates collect all render states about scene and camera.\n\t */\n\tclass RenderStates {\n\t\tconstructor(sceneData, lightingData) {\n\t\t\tthis.scene = sceneData;\n\t\t\tthis.lighting = lightingData;\n\t\t\tthis.camera = {\n\t\t\t\tid: _cameraDataId++,\n\t\t\t\tversion: 0,\n\t\t\t\tnear: 0,\n\t\t\t\tfar: 0,\n\t\t\t\tposition: new Vector3(),\n\t\t\t\tlogDepthCameraNear: 0,\n\t\t\t\tlogDepthBufFC: 0,\n\t\t\t\tviewMatrix: new Matrix4(),\n\t\t\t\tprojectionMatrix: new Matrix4(),\n\t\t\t\tprojectionViewMatrix: new Matrix4(),\n\t\t\t\trect: new Vector4(0, 0, 1, 1)\n\t\t\t};\n\t\t\tthis.gammaFactor = 2.0;\n\t\t\tthis.outputEncoding = TEXEL_ENCODING_TYPE.LINEAR;\n\t\t}\n\n\t\t/**\n\t\t * Update render states about camera.\n\t\t * @param {Camera} camera\n\t\t */\n\t\tupdateCamera(camera) {\n\t\t\tconst sceneData = this.scene;\n\t\t\tconst cameraData = this.camera;\n\t\t\tconst projectionMatrix = camera.projectionMatrix;\n\t\t\tlet cameraNear = 0,\n\t\t\t\tcameraFar = 0;\n\t\t\tif (_isPerspectiveMatrix$1(projectionMatrix)) {\n\t\t\t\tcameraNear = projectionMatrix.elements[14] / (projectionMatrix.elements[10] - 1);\n\t\t\t\tcameraFar = projectionMatrix.elements[14] / (projectionMatrix.elements[10] + 1);\n\t\t\t} else {\n\t\t\t\tcameraNear = (projectionMatrix.elements[14] + 1) / projectionMatrix.elements[10];\n\t\t\t\tcameraFar = (projectionMatrix.elements[14] - 1) / projectionMatrix.elements[10];\n\t\t\t}\n\t\t\tcameraData.near = cameraNear;\n\t\t\tcameraData.far = cameraFar;\n\t\t\tif (sceneData.logarithmicDepthBuffer) {\n\t\t\t\tcameraData.logDepthCameraNear = cameraNear;\n\t\t\t\tcameraData.logDepthBufFC = 2.0 / (Math.log(cameraFar - cameraNear + 1.0) * Math.LOG2E);\n\t\t\t} else {\n\t\t\t\tcameraData.logDepthCameraNear = 0;\n\t\t\t\tcameraData.logDepthBufFC = 0;\n\t\t\t}\n\t\t\tcameraData.position.setFromMatrixPosition(camera.worldMatrix);\n\t\t\tif (sceneData.useAnchorMatrix) {\n\t\t\t\tcameraData.position.applyMatrix4(sceneData.anchorMatrixInverse);\n\t\t\t}\n\t\t\tcameraData.viewMatrix.copy(camera.viewMatrix);\n\t\t\tif (sceneData.useAnchorMatrix) {\n\t\t\t\tcameraData.viewMatrix.multiply(sceneData.anchorMatrix);\n\t\t\t}\n\t\t\tcameraData.projectionMatrix.copy(projectionMatrix);\n\t\t\tcameraData.projectionViewMatrix.copy(projectionMatrix).multiply(cameraData.viewMatrix);\n\t\t\tcameraData.rect.copy(camera.rect);\n\t\t\tcameraData.version++;\n\t\t\tthis.gammaFactor = camera.gammaFactor;\n\t\t\tthis.outputEncoding = camera.outputEncoding;\n\t\t}\n\t}\n\n\t/**\n\t * RenderQueueLayer holds all the renderable objects.\n\t * Now has an opaque list and a transparent list.\n\t */\n\tclass RenderQueueLayer {\n\t\t/**\n\t\t * @param {number} id - layer id.\n\t\t */\n\t\tconstructor(id) {\n\t\t\tthis.id = id;\n\t\t\tthis.opaque = [];\n\t\t\tthis.opaqueCount = 0;\n\t\t\tthis.transparent = [];\n\t\t\tthis.transparentCount = 0;\n\t\t\tthis._cache = [];\n\t\t\tthis._cacheIndex = 0;\n\t\t\tthis._lastCacheIndex = 0;\n\t\t\tthis.opaqueSortCompareFn = defaultOpaqueSortCompare;\n\t\t\tthis.transparentSortCompareFn = defaultTransparentSortCompare;\n\t\t}\n\t\tbegin() {\n\t\t\tthis._cacheIndex = 0;\n\t\t\tthis.opaqueCount = 0;\n\t\t\tthis.transparentCount = 0;\n\t\t}\n\t\tend() {\n\t\t\tthis.opaque.length = this.opaqueCount;\n\t\t\tthis.transparent.length = this.transparentCount;\n\n\t\t\t// Clear references from inactive renderables in the list\n\t\t\tconst cacheIndex = this._cacheIndex,\n\t\t\t\tlastCacheIndex = this._lastCacheIndex;\n\t\t\tif (lastCacheIndex > cacheIndex) {\n\t\t\t\tconst cache = this._cache;\n\t\t\t\tfor (let i = cacheIndex; i < lastCacheIndex; i++) {\n\t\t\t\t\tconst renderable = cache[i];\n\t\t\t\t\trenderable.object = null;\n\t\t\t\t\trenderable.geometry = null;\n\t\t\t\t\trenderable.material = null;\n\t\t\t\t\trenderable.group = null;\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis._lastCacheIndex = cacheIndex;\n\t\t}\n\t\taddRenderable(object, geometry, material, z, group) {\n\t\t\tconst cache = this._cache;\n\t\t\tlet renderable = cache[this._cacheIndex];\n\t\t\tif (renderable === undefined) {\n\t\t\t\trenderable = {\n\t\t\t\t\tobject: object,\n\t\t\t\t\tgeometry: geometry,\n\t\t\t\t\tmaterial: material,\n\t\t\t\t\tz: z,\n\t\t\t\t\trenderOrder: object.renderOrder,\n\t\t\t\t\tgroup: group\n\t\t\t\t};\n\t\t\t\tcache[this._cacheIndex] = renderable;\n\t\t\t} else {\n\t\t\t\trenderable.object = object;\n\t\t\t\trenderable.geometry = geometry;\n\t\t\t\trenderable.material = material;\n\t\t\t\trenderable.z = z;\n\t\t\t\trenderable.renderOrder = object.renderOrder;\n\t\t\t\trenderable.group = group;\n\t\t\t}\n\t\t\tif (material.transparent) {\n\t\t\t\tthis.transparent[this.transparentCount] = renderable;\n\t\t\t\tthis.transparentCount++;\n\t\t\t} else {\n\t\t\t\tthis.opaque[this.opaqueCount] = renderable;\n\t\t\t\tthis.opaqueCount++;\n\t\t\t}\n\t\t\tthis._cacheIndex++;\n\t\t}\n\t\tsort() {\n\t\t\tthis.opaque.sort(this.opaqueSortCompareFn);\n\t\t\tquickSort(this.transparent, 0, this.transparent.length, this.transparentSortCompareFn);\n\t\t}\n\t}\n\tfunction defaultOpaqueSortCompare(a, b) {\n\t\tif (a.renderOrder !== b.renderOrder) {\n\t\t\treturn a.renderOrder - b.renderOrder;\n\t\t} else if (a.material.id !== b.material.id) {\n\t\t\treturn a.material.id - b.material.id;\n\t\t} else {\n\t\t\treturn a.id - b.id;\n\t\t}\n\t}\n\tfunction defaultTransparentSortCompare(a, b) {\n\t\tif (a.renderOrder !== b.renderOrder) {\n\t\t\treturn a.renderOrder - b.renderOrder;\n\t\t} else if (a.z !== b.z) {\n\t\t\treturn b.z - a.z;\n\t\t} else if (a.material.id !== b.material.id) {\n\t\t\t// fix Unstable sort below chrome version 7.0\n\t\t\t// if render same object with different materials\n\t\t\treturn a.material.id - b.material.id;\n\t\t} else {\n\t\t\treturn a.id - b.id;\n\t\t}\n\t}\n\n\t// Reference github.com/ant-galaxy/oasis-engine/blob/main/packages/core/src/RenderPipeline/RenderQueue.ts\n\t// quickSort is faster when sorting highly randomized arrays,\n\t// but for sorting lowly randomized arrays, Array.prototype.sort is faster,\n\t// so quickSort is more suitable for transparent list sorting.\n\n\tfunction quickSort(a, from, to, compareFunc) {\n\t\twhile (true) {\n\t\t\t// Insertion sort is faster for short arrays.\n\t\t\tif (to - from <= 10) {\n\t\t\t\tinsertionSort(a, from, to, compareFunc);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst third_index = from + to >> 1;\n\t\t\t// Find a pivot as the median of first, last and middle element.\n\t\t\tlet v0 = a[from];\n\t\t\tlet v1 = a[to - 1];\n\t\t\tlet v2 = a[third_index];\n\t\t\tconst c01 = compareFunc(v0, v1);\n\t\t\tif (c01 > 0) {\n\t\t\t\tconst tmp = v0;\n\t\t\t\tv0 = v1;\n\t\t\t\tv1 = tmp;\n\t\t\t}\n\t\t\tconst c02 = compareFunc(v0, v2);\n\t\t\tif (c02 >= 0) {\n\t\t\t\tconst tmp = v0;\n\t\t\t\tv0 = v2;\n\t\t\t\tv2 = v1;\n\t\t\t\tv1 = tmp;\n\t\t\t} else {\n\t\t\t\tconst c12 = compareFunc(v1, v2);\n\t\t\t\tif (c12 > 0) {\n\t\t\t\t\tconst tmp = v1;\n\t\t\t\t\tv1 = v2;\n\t\t\t\t\tv2 = tmp;\n\t\t\t\t}\n\t\t\t}\n\t\t\ta[from] = v0;\n\t\t\ta[to - 1] = v2;\n\t\t\tconst pivot = v1;\n\t\t\tlet low_end = from + 1; // Upper bound of elements lower than pivot.\n\t\t\tlet high_start = to - 1; // Lower bound of elements greater than pivot.\n\t\t\ta[third_index] = a[low_end];\n\t\t\ta[low_end] = pivot;\n\n\t\t\t// From low_end to i are elements equal to pivot.\n\t\t\t// From i to high_start are elements that haven't been compared yet.\n\t\t\tpartition: for (let i = low_end + 1; i < high_start; i++) {\n\t\t\t\tlet element = a[i];\n\t\t\t\tlet order = compareFunc(element, pivot);\n\t\t\t\tif (order < 0) {\n\t\t\t\t\ta[i] = a[low_end];\n\t\t\t\t\ta[low_end] = element;\n\t\t\t\t\tlow_end++;\n\t\t\t\t} else if (order > 0) {\n\t\t\t\t\tdo {\n\t\t\t\t\t\thigh_start--;\n\t\t\t\t\t\tif (high_start == i) break partition;\n\t\t\t\t\t\tconst top_elem = a[high_start];\n\t\t\t\t\t\torder = compareFunc(top_elem, pivot);\n\t\t\t\t\t} while (order > 0);\n\t\t\t\t\ta[i] = a[high_start];\n\t\t\t\t\ta[high_start] = element;\n\t\t\t\t\tif (order < 0) {\n\t\t\t\t\t\telement = a[i];\n\t\t\t\t\t\ta[i] = a[low_end];\n\t\t\t\t\t\ta[low_end] = element;\n\t\t\t\t\t\tlow_end++;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (to - high_start < low_end - from) {\n\t\t\t\tquickSort(a, high_start, to, compareFunc);\n\t\t\t\tto = low_end;\n\t\t\t} else {\n\t\t\t\tquickSort(a, from, low_end, compareFunc);\n\t\t\t\tfrom = high_start;\n\t\t\t}\n\t\t}\n\t}\n\tfunction insertionSort(a, from, to, compareFunc) {\n\t\tfor (let i = from + 1; i < to; i++) {\n\t\t\tlet j;\n\t\t\tconst element = a[i];\n\t\t\tfor (j = i - 1; j >= from; j--) {\n\t\t\t\tconst tmp = a[j];\n\t\t\t\tconst order = compareFunc(tmp, element);\n\t\t\t\tif (order > 0) {\n\t\t\t\t\ta[j + 1] = tmp;\n\t\t\t\t} else {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\ta[j + 1] = element;\n\t\t}\n\t}\n\n\t/**\n\t * RenderQueue is used to collect all renderable items, lights and skeletons from the scene.\n\t * Renderable items will be dispatched to the corresponding RenderQueueLayer according to the object's renderLayer property.\n\t */\n\tclass RenderQueue {\n\t\tconstructor() {\n\t\t\tthis.layerMap = new Map();\n\t\t\tthis.layerList = [];\n\t\t\tthis.skeletons = new Set();\n\n\t\t\t// to optimize the performance of the next push, cache the last layer used\n\t\t\tthis._lastLayer = this.createLayer(0);\n\t\t}\n\t\tbegin() {\n\t\t\tfor (let i = 0, l = this.layerList.length; i < l; i++) {\n\t\t\t\tthis.layerList[i].begin();\n\t\t\t}\n\t\t\tthis.skeletons.clear();\n\t\t}\n\t\tend() {\n\t\t\tfor (let i = 0, l = this.layerList.length; i < l; i++) {\n\t\t\t\tthis.layerList[i].end();\n\t\t\t\tthis.layerList[i].sort();\n\t\t\t}\n\t\t}\n\t\tpush(object, camera) {\n\t\t\t// collect skeleton if exists\n\t\t\tif (object.skeleton) {\n\t\t\t\tthis.skeletons.add(object.skeleton);\n\t\t\t}\n\t\t\t_vec4.setFromMatrixPosition(object.worldMatrix).applyMatrix4(camera.projectionViewMatrix);\n\t\t\tconst clipZ = _vec4.z;\n\t\t\tconst layerId = object.renderLayer || 0;\n\t\t\tlet layer = this._lastLayer;\n\t\t\tif (layer.id !== layerId) {\n\t\t\t\tlayer = this.layerMap.get(layerId);\n\t\t\t\tif (!layer) {\n\t\t\t\t\tlayer = this.createLayer(layerId);\n\t\t\t\t}\n\t\t\t\tthis._lastLayer = layer;\n\t\t\t}\n\t\t\tif (Array.isArray(object.material)) {\n\t\t\t\tconst groups = object.geometry.groups;\n\t\t\t\tfor (let i = 0; i < groups.length; i++) {\n\t\t\t\t\tconst group = groups[i];\n\t\t\t\t\tconst groupMaterial = object.material[group.materialIndex];\n\t\t\t\t\tif (groupMaterial) {\n\t\t\t\t\t\tlayer.addRenderable(object, object.geometry, groupMaterial, clipZ, group);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tlayer.addRenderable(object, object.geometry, object.material, clipZ);\n\t\t\t}\n\t\t}\n\n\t\t/**\n\t\t * Set a render queue layer.\n\t\t * @param {number} id - The layer id.\n\t\t * @param {RenderQueueLayer} layer - The layer to set.\n\t\t */\n\t\tsetLayer(id, layer) {\n\t\t\tthis.layerMap.set(id, layer);\n\t\t\tthis.layerList.push(layer);\n\t\t\tthis.layerList.sort(sortLayer);\n\t\t}\n\n\t\t/**\n\t\t * Create and set a render queue layer.\n\t\t * @param {number} id - The layer id.\n\t\t * @returns {RenderQueueLayer}\n\t\t */\n\t\tcreateLayer(id) {\n\t\t\tconst layer = new RenderQueueLayer(id);\n\t\t\tthis.setLayer(id, layer);\n\t\t\treturn layer;\n\t\t}\n\n\t\t/**\n\t\t * Get the render queue layer.\n\t\t * @param {number} id - The layer id.\n\t\t * @returns {RenderQueueLayer}\n\t\t */\n\t\tgetLayer(id) {\n\t\t\treturn this.layerMap.get(id);\n\t\t}\n\n\t\t/**\n\t\t * Remove the render queue layer.\n\t\t * @param {number} id - The layer id.\n\t\t */\n\t\tremoveLayer(id) {\n\t\t\tconst layer = this.layerMap.get(id);\n\t\t\tif (layer) {\n\t\t\t\tthis.layerMap.delete(id);\n\t\t\t\tconst index = this.layerList.indexOf(layer);\n\t\t\t\tif (index !== -1) {\n\t\t\t\t\tthis.layerList.splice(index, 1);\n\t\t\t\t}\n\t\t\t\tif (this._lastLayer === id) {\n\t\t\t\t\tthis._lastLayer = null;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\tconst _vec4 = new Vector4();\n\tfunction sortLayer(a, b) {\n\t\treturn a.id - b.id;\n\t}\n\n\t/**\n\t * RenderCollector traverses the scene graph and collects all necessary rendering information.\n\t * It manages scene data, lighting data, and per-camera render states/queues.\n\t */\n\tclass RenderCollector {\n\t\t/**\n\t\t * Creates a new RenderCollector instance.\n\t\t * In most cases, RenderCollector does not need to be created manually,\n\t\t * as Scene will automatically create one. See {@link Scene#collector}.\n\t\t */\n\t\tconstructor() {\n\t\t\t// collects scene and lighting data for single scene\n\n\t\t\tthis.sceneData = new SceneData();\n\t\t\tthis.lightingData = new LightingData();\n\n\t\t\t// collects render states and render queues for each camera\n\n\t\t\tthis._renderStatesMap = new WeakMap();\n\t\t\tthis._renderQueueMap = new WeakMap();\n\n\t\t\t// internal states\n\n\t\t\tthis._lightingNeedsUpdate = true;\n\t\t\tthis._skeletonVersion = 1;\n\t\t\tconst _boundingSphere = new Sphere();\n\n\t\t\t/**\n\t\t\t * Visibility checking function called during scene traversal.\n\t\t\t * Determines whether an object should be included in the render queue.\n\t\t\t * Can be overridden to implement custom culling logic (LOD, distance, etc.).\n\t\t\t * @param {Object3D} object - The object to test for visibility.\n\t\t\t * @param {Camera} camera - The camera to test against.\n\t\t\t * @returns {boolean} True if the object should be rendered, false to cull it.\n\t\t\t * @type {Function}\n\t\t\t * @example\n\t\t\t * // Custom visibility check that always returns true\n\t\t\t * collector.checkVisibility = function(object, camera) {\n\t\t\t *\t\t return true;\n\t\t\t * };\n\t\t\t */\n\t\t\tthis.checkVisibility = function (object, camera) {\n\t\t\t\tif (!object.renderable) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\tif (!object.frustumCulled || !camera.frustumCulled) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\t_boundingSphere.copy(object.geometry.boundingSphere).applyMatrix4(object.worldMatrix);\n\t\t\t\treturn camera.frustum.intersectsSphere(_boundingSphere);\n\t\t\t};\n\t\t}\n\n\t\t/**\n\t\t * Setting this property to `true` indicates the lighting data needs to be updated.\n\t\t * Lighting data updates are triggered by the {@link RenderCollector#traverseAndCollect} method.\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t * @param {boolean} value\n\t\t */\n\t\tset lightingNeedsUpdate(value) {\n\t\t\tif (value) {\n\t\t\t\tthis._lightingNeedsUpdate = true;\n\t\t\t}\n\t\t}\n\n\t\t/**\n\t\t * Setting this property to `true` indicates all skeletons in the scene should be updated.\n\t\t * Skeleton updates are triggered by the {@link RenderCollector#traverseAndCollect} method.\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t * @param {boolean} value\n\t\t */\n\t\tset skeletonNeedsUpdate(value) {\n\t\t\tif (value) {\n\t\t\t\tthis._skeletonVersion++;\n\t\t\t}\n\t\t}\n\n\t\t/**\n\t\t * Get the RenderStates for the scene and camera.\n\t\t * If the RenderStates for the camera does not exist, it will be created.\n\t\t * @param {Camera} camera - The render camera.\n\t\t * @returns {RenderStates} The target render states.\n\t\t */\n\t\tgetRenderStates(camera) {\n\t\t\tlet renderStates = this._renderStatesMap.get(camera);\n\t\t\tif (!renderStates) {\n\t\t\t\t// every camera has its own RenderStates\n\t\t\t\t// but they share the same scene and lighting data\n\t\t\t\trenderStates = new RenderStates(this.sceneData, this.lightingData);\n\t\t\t\tthis._renderStatesMap.set(camera, renderStates);\n\t\t\t}\n\t\t\treturn renderStates;\n\t\t}\n\n\t\t/**\n\t\t * Get the RenderQueue for the scene and camera.\n\t\t * If the RenderQueue for the camera does not exist, it will be created.\n\t\t * @param {Camera} camera - The render camera.\n\t\t * @returns {RenderQueue} The target render queue.\n\t\t */\n\t\tgetRenderQueue(camera) {\n\t\t\tlet renderQueue = this._renderQueueMap.get(camera);\n\t\t\tif (!renderQueue) {\n\t\t\t\trenderQueue = new RenderQueue();\n\t\t\t\tthis._renderQueueMap.set(camera, renderQueue);\n\t\t\t}\n\t\t\treturn renderQueue;\n\t\t}\n\n\t\t/**\n\t\t * Traverse the scene and collect all renderable objects, lights and skeletons.\n\t\t * This method will update the RenderQueue and RenderStates for the camera.\n\t\t * @param {Scene} scene - The scene to traverse.\n\t\t * @param {Camera} camera - The camera to collect renderable objects for.\n\t\t * @returns {RenderQueue} The collected render queue.\n\t\t */\n\t\ttraverseAndCollect(scene, camera) {\n\t\t\tconst sceneData = this.sceneData;\n\t\t\tconst lightingData = this.lightingData;\n\t\t\tconst lightingNeedsUpdate = this._lightingNeedsUpdate;\n\t\t\tconst renderQueue = this.getRenderQueue(camera);\n\t\t\tif (lightingNeedsUpdate) {\n\t\t\t\tlightingData.begin();\n\t\t\t}\n\t\t\trenderQueue.begin();\n\t\t\tthis._traverseAndCollect(scene, camera, renderQueue);\n\t\t\trenderQueue.end();\n\t\t\tif (lightingNeedsUpdate) {\n\t\t\t\tlightingData.end(sceneData);\n\t\t\t\tthis._lightingNeedsUpdate = false;\n\t\t\t}\n\n\t\t\t// Since skeletons may be referenced by different mesh,\n\t\t\t// it is necessary to collect skeletons in the scene in order to avoid repeated updates.\n\t\t\t// For IOS platform, we should try to avoid repeated texture updates within one frame,\n\t\t\t// otherwise the performance will be seriously degraded.\n\t\t\tconst skeletonVersion = this._skeletonVersion;\n\t\t\tfor (const skeleton of _skeletons) {\n\t\t\t\t// Skeleton version ensures uncollected skeletons will be updated in subsequent frames\n\t\t\t\tif (skeleton._version !== skeletonVersion) {\n\t\t\t\t\tskeleton.updateBones(sceneData);\n\t\t\t\t\tskeleton._version = skeletonVersion;\n\t\t\t\t}\n\t\t\t}\n\t\t\t_skeletons.clear();\n\t\t\treturn renderQueue;\n\t\t}\n\t\t_traverseAndCollect(object, camera, renderQueue) {\n\t\t\tif (!object.visible) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (object.isMesh) {\n\t\t\t\tif (this.checkVisibility(object, camera)) {\n\t\t\t\t\trenderQueue.push(object, camera);\n\t\t\t\t\tif (object.skeleton) {\n\t\t\t\t\t\t_skeletons.add(object.skeleton);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else if (object.isLight) {\n\t\t\t\tthis.lightingData.collect(object);\n\t\t\t}\n\t\t\tconst children = object.children;\n\t\t\tfor (let i = 0, l = children.length; i < l; i++) {\n\t\t\t\tthis._traverseAndCollect(children[i], camera, renderQueue);\n\t\t\t}\n\t\t}\n\t}\n\tconst _skeletons = new Set();\n\n\t/**\n\t * Scenes allow you to set up what and where is to be rendered,\n\t * this is where you place objects, lights and cameras.\n\t * @extends Object3D\n\t */\n\tclass Scene extends Object3D {\n\t\t/**\n\t\t * Create a scene.\n\t\t */\n\t\tconstructor() {\n\t\t\tsuper();\n\n\t\t\t/**\n\t\t\t * A {@link Fog} instance defining the type of fog that affects everything rendered in the scene.\n\t\t\t * @type {Fog}\n\t\t\t * @default null\n\t\t\t */\n\t\t\tthis.fog = null;\n\n\t\t\t/**\n\t\t\t * Sets the environment map for all materials in the scene.\n\t\t\t * However, it's not possible to overwrite an existing texture assigned to Material.envMap.\n\t\t\t * @type {TextureCube | null}\n\t\t\t * @default null\n\t\t\t */\n\t\t\tthis.environment = null;\n\n\t\t\t/**\n\t\t\t * The diffuse intensity of the environment map.\n\t\t\t * @type {number}\n\t\t\t * @default 1\n\t\t\t */\n\t\t\tthis.envDiffuseIntensity = 1;\n\n\t\t\t/**\n\t\t\t * The specular intensity of the environment map.\n\t\t\t * This value is multiplied with the envMapIntensity of the material to get the final intensity.\n\t\t\t * @type {number}\n\t\t\t * @default 1\n\t\t\t */\n\t\t\tthis.envSpecularIntensity = 1;\n\n\t\t\t/**\n\t\t\t * User-defined clipping planes specified as {@link Plane} objects in world space.\n\t\t\t * These planes apply to the scene.\n\t\t\t * Points in space whose dot product with the plane is negative are cut away.\n\t\t\t * @type {Plane[]}\n\t\t\t * @default []\n\t\t\t */\n\t\t\tthis.clippingPlanes = [];\n\n\t\t\t/**\n\t\t\t * Defines whether disable shadow sampler feature.\n\t\t\t * Shader with sampler2DShadow uniforms may cause unknown error on some android phones, set disableShadowSampler to true to avoid these bugs.\n\t\t\t * When this property is set to true, soft shadow types will fallback to POISSON_SOFT without warning.\n\t\t\t * @type {boolean}\n\t\t\t * @default false\n\t\t\t */\n\t\t\tthis.disableShadowSampler = false;\n\n\t\t\t/**\n\t\t\t * whether to use a logarithmic depth buffer. It may be neccesary to use this if dealing with huge differences in scale in a single scene.\n\t\t\t * Note that this setting uses gl_FragDepth if available which disables the Early Fragment Test optimization and can cause a decrease in performance.\n\t\t\t * @type {boolean}\n\t\t\t * @default false\n\t\t\t */\n\t\t\tthis.logarithmicDepthBuffer = false;\n\n\t\t\t/**\n\t\t\t * The anchor matrix of the world coordinate system.\n\t\t\t * If it is not an identity matrix, the actual lighting calculating and the world position in the shader, will be in the anchor coordinate system.\n\t\t\t * By setting this property, you can solve the floating point precision problem caused by the rendering object far away from the origin of the world coordinate system.\n\t\t\t * In addition, by setting the rotation, it can also repair the direction of the reflection.\n\t\t\t * @type {Matrix4}\n\t\t\t */\n\t\t\tthis.anchorMatrix = new Matrix4();\n\n\t\t\t/**\n\t\t\t * A {@link RenderCollector} instance for this scene.\n\t\t\t * @type {RenderCollector}\n\t\t\t */\n\t\t\tthis.collector = new RenderCollector();\n\t\t}\n\n\t\t/**\n\t\t * The maximum number of lighting groups.\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tset maxLightingGroups(value) {\n\t\t\tthis.collector.lightingData.setMaxGroupCount(value);\n\t\t}\n\t\tget maxLightingGroups() {\n\t\t\treturn this.collector.lightingData.groupList.length;\n\t\t}\n\n\t\t/**\n\t\t * Get {@link RenderStates} for the scene and camera.\n\t\t * The RenderStates will be updated by calling {@link Scene#updateRenderStates}.\n\t\t * The light data in RenderStates will be empty unless calling {@link Scene#updateRenderQueue}.\n\t\t * @param {Camera} camera - The camera.\n\t\t * @returns {RenderQueue} - The target render queue.\n\t\t */\n\t\tgetRenderStates(camera) {\n\t\t\treturn this.collector.getRenderStates(camera);\n\t\t}\n\n\t\t/**\n\t\t * Get {@link RenderQueue} for the scene and camera.\n\t\t * The RenderQueue will be updated by calling {@link Scene#updateRenderQueue}.\n\t\t * @param {Camera} camera - The camera.\n\t\t * @returns {RenderQueue} - The target render queue.\n\t\t */\n\t\tgetRenderQueue(camera) {\n\t\t\treturn this.collector.getRenderQueue(camera);\n\t\t}\n\n\t\t/**\n\t\t * Update {@link RenderStates} for the scene and camera.\n\t\t * The lighting data in RenderStates will be empty unless calling {@link Scene#updateRenderQueue}.\n\t\t * @param {Camera} camera - The camera.\n\t\t * @param {boolean} [updateScene=true] - Whether to update scene data.\n\t\t * @returns {RenderStates} - The result render states.\n\t\t */\n\t\tupdateRenderStates(camera, updateScene = true) {\n\t\t\tconst collector = this.collector;\n\t\t\tif (updateScene) {\n\t\t\t\tcollector.sceneData.update(this);\n\t\t\t}\n\t\t\tconst renderStates = collector.getRenderStates(camera);\n\t\t\trenderStates.updateCamera(camera);\n\t\t\treturn renderStates;\n\t\t}\n\n\t\t/**\n\t\t * Update {@link RenderQueue} for the scene and camera.\n\t\t * Collect all visible meshes (and lights) from scene graph, and push meshes to render queue.\n\t\t * Light data will be stored in RenderStates.\n\t\t * @param {Camera} camera - The camera.\n\t\t * @param {boolean} [collectLights=true] - Whether to collect light data.\n\t\t * @param {boolean} [updateSkeletons=true] - Whether to update skeletons.\n\t\t * @returns {RenderQueue} - The result render queue.\n\t\t */\n\t\tupdateRenderQueue(camera, collectLights = true, updateSkeletons = true) {\n\t\t\tconst collector = this.collector;\n\t\t\tcollector.lightingNeedsUpdate = collectLights;\n\t\t\tcollector.skeletonNeedsUpdate = updateSkeletons;\n\t\t\treturn collector.traverseAndCollect(this, camera);\n\t\t}\n\t}\n\n\t/**\n\t * This flag can be used for type testing.\n\t * @readonly\n\t * @type {boolean}\n\t * @default true\n\t */\n\tScene.prototype.isScene = true;\n\n\t/**\n\t * Base camera projection class. All projection types should inherit from this.\n\t * Should not be instantiated directly; subclasses must implement matrix calculation.\n\t * @abstract\n\t */\n\tclass CameraProjection {\n\t\t/**\n\t\t * Creates a CameraProjection instance.\n\t\t */\n\t\tconstructor() {\n\t\t\tthis._matrix = new Matrix4();\n\t\t\tthis._dirty = true;\n\t\t}\n\n\t\t/**\n\t\t * Get the current projection matrix.\n\t\t * @returns {Matrix4} The projection matrix.\n\t\t */\n\t\tget matrix() {\n\t\t\tif (this._dirty) {\n\t\t\t\tthis._updateMatrix();\n\t\t\t}\n\t\t\treturn this._matrix;\n\t\t}\n\n\t\t/**\n\t\t * Copy parameters from another CameraProjection. Should be implemented by subclasses.\n\t\t * @param {CameraProjection} source The source projection object.\n\t\t * @returns {CameraProjection} this\n\t\t */\n\t\tcopy(source) {\n\t\t\tconsole.warn('CameraProjection: copy() must be implemented in subclass.');\n\t\t\treturn this;\n\t\t}\n\n\t\t/**\n\t\t * Clone this projection object.\n\t\t * @returns {CameraProjection} A new projection object.\n\t\t */\n\t\tclone() {\n\t\t\treturn new this.constructor().copy(this);\n\t\t}\n\n\t\t/**\n\t\t * Update the projection matrix. Should be implemented by subclasses.\n\t\t * @protected\n\t\t */\n\t\t_updateMatrix() {\n\t\t\tconsole.warn('CameraProjection: _updateMatrix() must be implemented in subclass.');\n\t\t\tthis._dirty = false;\n\t\t}\n\t}\n\n\t/**\n\t * Perspective projection camera class.\n\t * Generates a perspective projection matrix based on field of view, aspect ratio, near and far planes.\n\t * Field of view is specified in degrees.\n\t */\n\tclass PerspectiveProjection extends CameraProjection {\n\t\t/**\n\t\t * Creates a PerspectiveProjection instance.\n\t\t * @param {number} [fov=50] Vertical field of view in degrees.\n\t\t * @param {number} [aspect=1] Aspect ratio (width / height).\n\t\t * @param {number} [near=0.1] Near clipping plane.\n\t\t * @param {number} [far=2000] Far clipping plane.\n\t\t */\n\t\tconstructor(fov = 50, aspect = 1, near = 0.1, far = 2000) {\n\t\t\tsuper();\n\t\t\tthis._fov = fov;\n\t\t\tthis._aspect = aspect;\n\t\t\tthis._near = near;\n\t\t\tthis._far = far;\n\t\t}\n\n\t\t/**\n\t\t * The vertical field of view in degrees.\n\t\t * @type {number}\n\t\t * @default 50\n\t\t */\n\t\tset fov(value) {\n\t\t\tthis._fov = value;\n\t\t\tthis._dirty = true;\n\t\t}\n\t\tget fov() {\n\t\t\treturn this._fov;\n\t\t}\n\n\t\t/**\n\t\t * The aspect ratio (width / height).\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tset aspect(value) {\n\t\t\tthis._aspect = value;\n\t\t\tthis._dirty = true;\n\t\t}\n\t\tget aspect() {\n\t\t\treturn this._aspect;\n\t\t}\n\n\t\t/**\n\t\t * The near clipping plane.\n\t\t * @type {number}\n\t\t * @default 0.1\n\t\t */\n\t\tset near(value) {\n\t\t\tthis._near = value;\n\t\t\tthis._dirty = true;\n\t\t}\n\t\tget near() {\n\t\t\treturn this._near;\n\t\t}\n\n\t\t/**\n\t\t * The far clipping plane.\n\t\t * @type {number}\n\t\t * @default 2000\n\t\t */\n\t\tset far(value) {\n\t\t\tthis._far = value;\n\t\t\tthis._dirty = true;\n\t\t}\n\t\tget far() {\n\t\t\treturn this._far;\n\t\t}\n\n\t\t/**\n\t\t * Sets all perspective parameters at once.\n\t\t * @param {number} fov Vertical field of view in degrees.\n\t\t * @param {number} aspect Aspect ratio (width / height).\n\t\t * @param {number} near Near clipping plane.\n\t\t * @param {number} far Far clipping plane.\n\t\t * @returns {PerspectiveProjection} this\n\t\t */\n\t\tset(fov, aspect, near, far) {\n\t\t\tthis._fov = fov;\n\t\t\tthis._aspect = aspect;\n\t\t\tthis._near = near;\n\t\t\tthis._far = far;\n\t\t\tthis._dirty = true;\n\t\t\treturn this;\n\t\t}\n\n\t\t/**\n\t\t * Copies the parameters from another PerspectiveProjection.\n\t\t * @param {PerspectiveProjection} source\n\t\t * @returns {PerspectiveProjection} this\n\t\t */\n\t\tcopy(source) {\n\t\t\tthis._fov = source._fov;\n\t\t\tthis._aspect = source._aspect;\n\t\t\tthis._near = source._near;\n\t\t\tthis._far = source._far;\n\t\t\tthis._dirty = true;\n\t\t\treturn this;\n\t\t}\n\n\t\t/**\n\t\t * Updates the perspective projection matrix.\n\t\t * @protected\n\t\t */\n\t\t_updateMatrix() {\n\t\t\tconst fov = this._fov * Math.PI / 180,\n\t\t\t\taspect = this._aspect,\n\t\t\t\tnear = this._near,\n\t\t\t\tfar = this._far;\n\t\t\tconst f = 1 / Math.tan(fov / 2);\n\t\t\tthis._matrix.set(f / aspect, 0, 0, 0, 0, f, 0, 0, 0, 0, (far + near) / (near - far), 2 * far * near / (near - far), 0, 0, -1, 0);\n\t\t\tthis._dirty = false;\n\t\t}\n\t}\n\n\t/**\n\t * Orthographic projection camera class.\n\t * Generates an orthographic projection matrix based on left, right, top, bottom, near, and far planes.\n\t */\n\tclass OrthographicProjection extends CameraProjection {\n\t\t/**\n\t\t * Creates an OrthographicProjection instance.\n\t\t * @param {number} [left=-1] Left plane of the orthographic box.\n\t\t * @param {number} [right=1] Right plane of the orthographic box.\n\t\t * @param {number} [top=1] Top plane of the orthographic box.\n\t\t * @param {number} [bottom=-1] Bottom plane of the orthographic box.\n\t\t * @param {number} [near=0.1] Near clipping plane.\n\t\t * @param {number} [far=2000] Far clipping plane.\n\t\t */\n\t\tconstructor(left = -1, right = 1, top = 1, bottom = -1, near = 0.1, far = 2000) {\n\t\t\tsuper();\n\t\t\tthis._left = left;\n\t\t\tthis._right = right;\n\t\t\tthis._top = top;\n\t\t\tthis._bottom = bottom;\n\t\t\tthis._near = near;\n\t\t\tthis._far = far;\n\t\t}\n\n\t\t/**\n\t\t * The left plane of the orthographic box.\n\t\t * @type {number}\n\t\t * @default -1\n\t\t */\n\t\tset left(value) {\n\t\t\tthis._left = value;\n\t\t\tthis._dirty = true;\n\t\t}\n\t\tget left() {\n\t\t\treturn this._left;\n\t\t}\n\n\t\t/**\n\t\t * The right plane of the orthographic box.\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tset right(value) {\n\t\t\tthis._right = value;\n\t\t\tthis._dirty = true;\n\t\t}\n\t\tget right() {\n\t\t\treturn this._right;\n\t\t}\n\n\t\t/**\n\t\t * The top plane of the orthographic box.\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tset top(value) {\n\t\t\tthis._top = value;\n\t\t\tthis._dirty = true;\n\t\t}\n\t\tget top() {\n\t\t\treturn this._top;\n\t\t}\n\n\t\t/**\n\t\t * The bottom plane of the orthographic box.\n\t\t * @type {number}\n\t\t * @default -1\n\t\t */\n\t\tset bottom(value) {\n\t\t\tthis._bottom = value;\n\t\t\tthis._dirty = true;\n\t\t}\n\t\tget bottom() {\n\t\t\treturn this._bottom;\n\t\t}\n\n\t\t/**\n\t\t * The near clipping plane.\n\t\t * @type {number}\n\t\t * @default 0.1\n\t\t */\n\t\tset near(value) {\n\t\t\tthis._near = value;\n\t\t\tthis._dirty = true;\n\t\t}\n\t\tget near() {\n\t\t\treturn this._near;\n\t\t}\n\n\t\t/**\n\t\t * The far clipping plane.\n\t\t * @type {number}\n\t\t * @default 2000\n\t\t */\n\t\tset far(value) {\n\t\t\tthis._far = value;\n\t\t\tthis._dirty = true;\n\t\t}\n\t\tget far() {\n\t\t\treturn this._far;\n\t\t}\n\n\t\t/**\n\t\t * Sets all orthographic parameters at once.\n\t\t * @param {number} left The left plane of the orthographic box.\n\t\t * @param {number} right The right plane of the orthographic box.\n\t\t * @param {number} top The top plane of the orthographic box.\n\t\t * @param {number} bottom The bottom plane of the orthographic box.\n\t\t * @param {number} near The near clipping plane.\n\t\t * @param {number} far The far clipping plane.\n\t\t * @returns {OrthographicProjection} this\n\t\t */\n\t\tset(left, right, top, bottom, near, far) {\n\t\t\tthis._left = left;\n\t\t\tthis._right = right;\n\t\t\tthis._top = top;\n\t\t\tthis._bottom = bottom;\n\t\t\tthis._near = near;\n\t\t\tthis._far = far;\n\t\t\tthis._dirty = true;\n\t\t\treturn this;\n\t\t}\n\n\t\t/**\n\t\t * Sets the orthographic box size by width and height, centered at (0, 0).\n\t\t * @param {number} width The width of the orthographic box.\n\t\t * @param {number} height The height of the orthographic box.\n\t\t * @returns {OrthographicProjection} this\n\t\t */\n\t\tsetSize(width, height) {\n\t\t\tthis._left = -width / 2;\n\t\t\tthis._right = width / 2;\n\t\t\tthis._top = height / 2;\n\t\t\tthis._bottom = -height / 2;\n\t\t\tthis._dirty = true;\n\t\t\treturn this;\n\t\t}\n\n\t\t/**\n\t\t * Copies the parameters from another OrthographicProjection.\n\t\t * @param {OrthographicProjection} source\n\t\t * @returns {OrthographicProjection} this\n\t\t */\n\t\tcopy(source) {\n\t\t\tthis._left = source._left;\n\t\t\tthis._right = source._right;\n\t\t\tthis._top = source._top;\n\t\t\tthis._bottom = source._bottom;\n\t\t\tthis._near = source._near;\n\t\t\tthis._far = source._far;\n\t\t\tthis._dirty = true;\n\t\t\treturn this;\n\t\t}\n\n\t\t/**\n\t\t * Updates the orthographic projection matrix.\n\t\t * @protected\n\t\t */\n\t\t_updateMatrix() {\n\t\t\tconst left = this._left,\n\t\t\t\tright = this._right,\n\t\t\t\tbottom = this._bottom,\n\t\t\t\ttop = this._top,\n\t\t\t\tnear = this._near,\n\t\t\t\tfar = this._far;\n\t\t\tthis._matrix.set(2 / (right - left), 0, 0, -(right + left) / (right - left), 0, 2 / (top - bottom), 0, -(top + bottom) / (top - bottom), 0, 0, -2 / (far - near), -(far + near) / (far - near), 0, 0, 0, 1);\n\t\t\tthis._dirty = false;\n\t\t}\n\t}\n\n\t/**\n\t * The camera used for rendering a 3D scene.\n\t * The camera's direction is defined as the 3-vector (0.0, 0,0, -1.0), that is, an untransformed camera points down the -Z axis.\n\t * @extends Object3D\n\t */\n\tclass Camera extends Object3D {\n\t\t/**\n\t\t * Create a camera.\n\t\t */\n\t\tconstructor() {\n\t\t\tsuper();\n\n\t\t\t/**\n\t\t\t * This is the inverse of worldMatrix.\n\t\t\t * The matrix may be different from the value passed in the shader, scene.anchorMatrix is not considered here.\n\t\t\t * @type {Matrix4}\n\t\t\t */\n\t\t\tthis.viewMatrix = new Matrix4();\n\n\t\t\t/**\n\t\t\t * This is the matrix which contains the projection.\n\t\t\t * @type {Matrix4}\n\t\t\t */\n\t\t\tthis.projectionMatrix = new Matrix4();\n\n\t\t\t/**\n\t\t\t * This is the matrix which contains the projection.\n\t\t\t * @type {Matrix4}\n\t\t\t */\n\t\t\tthis.projectionMatrixInverse = new Matrix4();\n\n\t\t\t/**\n\t\t\t * This is the matrix which contains the projection and view matrix.\n\t\t\t * The matrix may be different from the value passed in the shader, scene.anchorMatrix is not considered here.\n\t\t\t * @type {Matrix4}\n\t\t\t */\n\t\t\tthis.projectionViewMatrix = new Matrix4();\n\n\t\t\t/**\n\t\t\t * The frustum of the camera.\n\t\t\t * @type {Frustum}\n\t\t\t */\n\t\t\tthis.frustum = new Frustum();\n\n\t\t\t/**\n\t\t\t * The factor of gamma.\n\t\t\t * @type {number}\n\t\t\t * @default 2.0\n\t\t\t */\n\t\t\tthis.gammaFactor = 2.0;\n\n\t\t\t/**\n\t\t\t * Output pixel encoding.\n\t\t\t * @type {TEXEL_ENCODING_TYPE}\n\t\t\t * @default TEXEL_ENCODING_TYPE.LINEAR\n\t\t\t */\n\t\t\tthis.outputEncoding = TEXEL_ENCODING_TYPE.LINEAR;\n\n\t\t\t/**\n\t\t\t * Where on the screen is the camera rendered in normalized coordinates.\n\t\t\t * The values in rect range from zero (left/bottom) to one (right/top).\n\t\t\t * @type {Vector4}\n\t\t\t * @default Vector4(0, 0, 1, 1)\n\t\t\t */\n\t\t\tthis.rect = new Vector4(0, 0, 1, 1);\n\n\t\t\t/**\n\t\t\t * When this is set, it checks every frame if objects are in the frustum of the camera before rendering objects.\n\t\t\t * Otherwise objects gets rendered every frame even if it isn't visible.\n\t\t\t * @type {boolean}\n\t\t\t * @default true\n\t\t\t */\n\t\t\tthis.frustumCulled = true;\n\t\t}\n\n\t\t/**\n\t\t * Set view by look at, this func will set quaternion of this camera.\n\t\t * @param {Vector3} target - The target that the camera look at.\n\t\t * @param {Vector3} up - The up direction of the camera.\n\t\t */\n\t\tlookAt(target, up) {\n\t\t\t_mat4_1.lookAtRH(this.position, target, up);\n\t\t\tthis.quaternion.setFromRotationMatrix(_mat4_1);\n\t\t}\n\n\t\t/**\n\t\t * Set orthographic projection matrix.\n\t\t * @param {number} left Camera frustum left plane.\n\t\t * @param {number} right Camera frustum right plane.\n\t\t * @param {number} bottom Camera frustum bottom plane.\n\t\t * @param {number} top Camera frustum top plane.\n\t\t * @param {number} near Camera frustum near plane.\n\t\t * @param {number} far Camera frustum far plane.\n\t\t * @deprecated Use OrthographicProjection instead.\n\t\t */\n\t\tsetOrtho(left, right, bottom, top, near, far) {\n\t\t\t_orthographicProjection.set(left, right, top, bottom, near, far);\n\t\t\tthis.setProjectionMatrix(_orthographicProjection.matrix);\n\t\t}\n\n\t\t/**\n\t\t * Set perspective projection matrix.\n\t\t * @param {number} fov Camera frustum vertical field of view.\n\t\t * @param {number} aspect Camera frustum aspect ratio.\n\t\t * @param {number} near Camera frustum near plane.\n\t\t * @param {number} far Camera frustum far plane.\n\t\t * @deprecated Use PerspectiveProjection instead.\n\t\t */\n\t\tsetPerspective(fov, aspect, near, far) {\n\t\t\t_perspectiveProjection.set(fov * 180 / Math.PI, aspect, near, far);\n\t\t\tthis.setProjectionMatrix(_perspectiveProjection.matrix);\n\t\t}\n\n\t\t/**\n\t\t * Set the projection matrix.\n\t\t * @param {Matrix4} matrix The projection matrix.\n\t\t */\n\t\tsetProjectionMatrix(matrix) {\n\t\t\tthis.projectionMatrix.copy(matrix);\n\t\t\tthis.projectionMatrixInverse.copy(this.projectionMatrix).invert();\n\t\t}\n\t\tgetWorldDirection(optionalTarget = new Vector3()) {\n\t\t\treturn super.getWorldDirection(optionalTarget).negate();\n\t\t}\n\t\tupdateMatrix(force) {\n\t\t\tObject3D.prototype.updateMatrix.call(this, force);\n\t\t\tthis.viewMatrix.copy(this.worldMatrix).invert(); // update view matrix\n\n\t\t\tthis.projectionViewMatrix.multiplyMatrices(this.projectionMatrix, this.viewMatrix); // get PV matrix\n\t\t\tthis.frustum.setFromMatrix(this.projectionViewMatrix); // update frustum\n\t\t}\n\t\tcopy(source, recursive) {\n\t\t\tObject3D.prototype.copy.call(this, source, recursive);\n\t\t\tthis.viewMatrix.copy(source.viewMatrix);\n\t\t\tthis.projectionMatrix.copy(source.projectionMatrix);\n\t\t\tthis.projectionMatrixInverse.copy(source.projectionMatrixInverse);\n\t\t\tthis.frustum.copy(source.frustum);\n\t\t\tthis.gammaFactor = source.gammaFactor;\n\t\t\tthis.outputEncoding = source.outputEncoding;\n\t\t\tthis.rect.copy(source.rect);\n\t\t\tthis.frustumCulled = source.frustumCulled;\n\t\t\treturn this;\n\t\t}\n\t}\n\n\t/**\n\t * This flag can be used for type testing.\n\t * @readonly\n\t * @type {boolean}\n\t * @default true\n\t */\n\tCamera.prototype.isCamera = true;\n\tconst _mat4_1 = new Matrix4();\n\tconst _perspectiveProjection = new PerspectiveProjection();\n\tconst _orthographicProjection = new OrthographicProjection();\n\n\tconst _sphere = new Sphere();\n\tconst _inverseMatrix = new Matrix4();\n\tconst _ray = new Ray();\n\tconst _barycoord = new Vector3();\n\tconst _vA = new Vector3();\n\tconst _vB = new Vector3();\n\tconst _vC = new Vector3();\n\tconst _tempA = new Vector3();\n\tconst _morphA = new Vector3();\n\tconst _uvA = new Vector2();\n\tconst _uvB = new Vector2();\n\tconst _uvC = new Vector2();\n\tconst _intersectionPoint = new Vector3();\n\tconst _intersectionPointWorld = new Vector3();\n\n\t/**\n\t * Class representing triangular polygon mesh based objects.\n\t * Also serves as a base for other classes such as {@link SkinnedMesh}.\n\t * @extends Object3D\n\t */\n\tclass Mesh extends Object3D {\n\t\t/**\n\t\t * @param {Geometry} geometry — an instance of {@link Geometry}.\n\t\t * @param {Material} material - a single or an array of {@link Material}.\n\t\t */\n\t\tconstructor(geometry, material) {\n\t\t\tsuper();\n\n\t\t\t/**\n\t\t\t * an instance of {@link Geometry}.\n\t\t\t * @type {Geometry}\n\t\t\t */\n\t\t\tthis.geometry = geometry;\n\n\t\t\t/**\n\t\t\t * a single or an array of {@link Material}.\n\t\t\t * @type {Material|Material[]}\n\t\t\t */\n\t\t\tthis.material = material;\n\n\t\t\t/**\n\t\t\t * An array of weights typically from 0-1 that specify how much of the morph is applied.\n\t\t\t * @type {number[] | null}\n\t\t\t * @default null\n\t\t\t */\n\t\t\tthis.morphTargetInfluences = null;\n\t\t}\n\n\t\t/**\n\t\t * Get the local-space position of the vertex at the given index,\n\t\t * taking into account the current animation state of both morph targets and skinning.\n\t\t * @param {number} index - The index of the vertex.\n\t\t * @param {Vector3} target - The target vector.\n\t\t * @returns {Vector3} The target vector.\n\t\t */\n\t\tgetVertexPosition(index, target) {\n\t\t\tconst geometry = this.geometry;\n\t\t\tconst position = geometry.getAttribute('a_Position');\n\t\t\tconst morphPosition = geometry.morphAttributes.position;\n\t\t\ttarget.fromArray(position.buffer.array, index * position.buffer.stride + position.offset);\n\t\t\tconst morphInfluences = this.morphTargetInfluences;\n\t\t\tif (morphPosition && morphInfluences) {\n\t\t\t\t_morphA.set(0, 0, 0);\n\t\t\t\tfor (let i = 0, il = morphPosition.length; i < il; i++) {\n\t\t\t\t\tconst influence = morphInfluences[i];\n\t\t\t\t\tconst morphAttribute = morphPosition[i];\n\t\t\t\t\tif (influence === 0) continue;\n\t\t\t\t\t_tempA.fromArray(morphAttribute.buffer.array, index * morphAttribute.buffer.stride + morphAttribute.offset);\n\t\t\t\t\t_morphA.addScaledVector(_tempA, influence);\n\t\t\t\t}\n\t\t\t\ttarget.add(_morphA);\n\t\t\t}\n\t\t\treturn target;\n\t\t}\n\t\traycast(ray, intersects) {\n\t\t\tconst geometry = this.geometry;\n\t\t\tconst material = this.material;\n\t\t\tconst worldMatrix = this.worldMatrix;\n\t\t\t_sphere.copy(geometry.boundingSphere);\n\t\t\t_sphere.applyMatrix4(worldMatrix);\n\t\t\tif (!ray.intersectsSphere(_sphere)) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t_inverseMatrix.copy(worldMatrix).invert();\n\t\t\t_ray.copy(ray).applyMatrix4(_inverseMatrix);\n\t\t\tif (!_ray.intersectsBox(geometry.boundingBox)) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst position = geometry.getAttribute('a_Position');\n\t\t\tif (!position) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst uv = geometry.getAttribute('a_Uv');\n\t\t\tconst groups = geometry.groups;\n\t\t\tlet intersection;\n\t\t\tif (geometry.index) {\n\t\t\t\tconst index = geometry.index.buffer.array;\n\t\t\t\tif (Array.isArray(material)) {\n\t\t\t\t\tfor (let i = 0, il = groups.length; i < il; i++) {\n\t\t\t\t\t\tconst group = groups[i];\n\t\t\t\t\t\tconst groupMaterial = material[group.materialIndex];\n\t\t\t\t\t\tconst start = group.start;\n\t\t\t\t\t\tconst end = Math.min(index.length, group.start + group.count);\n\t\t\t\t\t\tfor (let j = start, jl = end; j < jl; j += 3) {\n\t\t\t\t\t\t\tconst a = index[j];\n\t\t\t\t\t\t\tconst b = index[j + 1];\n\t\t\t\t\t\t\tconst c = index[j + 2];\n\t\t\t\t\t\t\tintersection = checkGeometryIntersection(this, groupMaterial, ray, _ray, uv, a, b, c);\n\t\t\t\t\t\t\tif (intersection) {\n\t\t\t\t\t\t\t\tintersection.faceIndex = Math.floor(i / 3);\n\t\t\t\t\t\t\t\tintersection.face.materialIndex = group.materialIndex;\n\t\t\t\t\t\t\t\tintersects.push(intersection);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tfor (let i = 0, il = index.length; i < il; i += 3) {\n\t\t\t\t\t\tconst a = index[i];\n\t\t\t\t\t\tconst b = index[i + 1];\n\t\t\t\t\t\tconst c = index[i + 2];\n\t\t\t\t\t\tintersection = checkGeometryIntersection(this, material, ray, _ray, uv, a, b, c);\n\t\t\t\t\t\tif (intersection) {\n\t\t\t\t\t\t\tintersection.faceIndex = Math.floor(i / 3);\n\t\t\t\t\t\t\tintersects.push(intersection);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (Array.isArray(material)) {\n\t\t\t\t\tfor (let i = 0, il = groups.length; i < il; i++) {\n\t\t\t\t\t\tconst group = groups[i];\n\t\t\t\t\t\tconst groupMaterial = material[group.materialIndex];\n\t\t\t\t\t\tconst start = group.start;\n\t\t\t\t\t\tconst end = Math.min(position.buffer.count, group.start + group.count);\n\t\t\t\t\t\tfor (let j = start, jl = end; j < jl; j += 3) {\n\t\t\t\t\t\t\tconst a = j;\n\t\t\t\t\t\t\tconst b = j + 1;\n\t\t\t\t\t\t\tconst c = j + 2;\n\t\t\t\t\t\t\tintersection = checkGeometryIntersection(this, groupMaterial, ray, _ray, uv, a, b, c);\n\t\t\t\t\t\t\tif (intersection) {\n\t\t\t\t\t\t\t\tintersection.faceIndex = Math.floor(i / 3);\n\t\t\t\t\t\t\t\tintersection.face.materialIndex = group.materialIndex;\n\t\t\t\t\t\t\t\tintersects.push(intersection);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tfor (let i = 0, il = position.buffer.count; i < il; i += 3) {\n\t\t\t\t\t\tconst a = i;\n\t\t\t\t\t\tconst b = i + 1;\n\t\t\t\t\t\tconst c = i + 2;\n\t\t\t\t\t\tintersection = checkGeometryIntersection(this, material, ray, _ray, uv, a, b, c);\n\t\t\t\t\t\tif (intersection) {\n\t\t\t\t\t\t\tintersection.faceIndex = Math.floor(i / 3);\n\t\t\t\t\t\t\tintersects.push(intersection);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tcopy(source) {\n\t\t\tsuper.copy(source);\n\t\t\tif (source.morphTargetInfluences) {\n\t\t\t\tthis.morphTargetInfluences = source.morphTargetInfluences.slice();\n\t\t\t}\n\t\t\treturn this;\n\t\t}\n\t\tclone() {\n\t\t\treturn new this.constructor(this.geometry, this.material).copy(this);\n\t\t}\n\t}\n\n\t/**\n\t * This flag can be used for type testing.\n\t * @readonly\n\t * @type {boolean}\n\t * @default true\n\t */\n\tMesh.prototype.isMesh = true;\n\tfunction checkGeometryIntersection(object, material, ray, _ray, uv, a, b, c) {\n\t\tobject.getVertexPosition(a, _vA);\n\t\tobject.getVertexPosition(b, _vB);\n\t\tobject.getVertexPosition(c, _vC);\n\t\tconst intersection = checkIntersection(object, material, ray, _ray, _vA, _vB, _vC, _intersectionPoint);\n\t\tif (intersection) {\n\t\t\tlet array;\n\t\t\tlet bufferStride;\n\t\t\tlet attributeOffset;\n\t\t\tif (uv) {\n\t\t\t\tarray = uv.buffer.array;\n\t\t\t\tbufferStride = uv.buffer.stride;\n\t\t\t\tattributeOffset = uv.offset;\n\t\t\t\t_uvA.fromArray(array, a * bufferStride + attributeOffset);\n\t\t\t\t_uvB.fromArray(array, b * bufferStride + attributeOffset);\n\t\t\t\t_uvC.fromArray(array, c * bufferStride + attributeOffset);\n\t\t\t\tintersection.uv = uvIntersection(_intersectionPoint, _vA, _vB, _vC, _uvA, _uvB, _uvC);\n\t\t\t}\n\t\t\tconst face = {\n\t\t\t\ta: a,\n\t\t\t\tb: b,\n\t\t\t\tc: c,\n\t\t\t\tnormal: new Vector3()\n\t\t\t};\n\t\t\tTriangle.normal(_vA, _vB, _vC, face.normal);\n\t\t\tintersection.face = face;\n\t\t}\n\t\treturn intersection;\n\t}\n\tfunction uvIntersection(point, p1, p2, p3, uv1, uv2, uv3) {\n\t\tTriangle.barycoordFromPoint(point, p1, p2, p3, _barycoord);\n\t\tuv1.multiplyScalar(_barycoord.x);\n\t\tuv2.multiplyScalar(_barycoord.y);\n\t\tuv3.multiplyScalar(_barycoord.z);\n\t\tuv1.add(uv2).add(uv3);\n\t\treturn uv1.clone();\n\t}\n\tfunction checkIntersection(object, material, ray, localRay, pA, pB, pC, point) {\n\t\tlet intersect;\n\t\tif (material.side === DRAW_SIDE.BACK) {\n\t\t\tintersect = localRay.intersectTriangle(pC, pB, pA, true, point);\n\t\t} else {\n\t\t\tintersect = localRay.intersectTriangle(pA, pB, pC, material.side !== DRAW_SIDE.DOUBLE, point);\n\t\t}\n\t\tif (intersect === null) return null;\n\t\t_intersectionPointWorld.copy(point);\n\t\t_intersectionPointWorld.applyMatrix4(object.worldMatrix);\n\t\tconst distance = ray.origin.distanceTo(_intersectionPointWorld);\n\t\treturn {\n\t\t\tdistance: distance,\n\t\t\tpoint: _intersectionPointWorld.clone(),\n\t\t\tobject: object\n\t\t};\n\t}\n\n\t/**\n\t * The Attribute add structural information to Buffer.\n\t * This class stores data for an attribute (such as vertex positions, face indices, normals, colors, UVs, and any custom attributes ) associated with a Geometry, which allows for more efficient passing of data to the GPU.\n\t * Data is stored as vectors of any length (defined by size).\n\t */\n\tclass Attribute {\n\t\t/**\n\t\t * @param {Buffer} buffer - The Buffer instance passed in the constructor.\n\t\t * @param {number} [size=buffer.stride] - The number of values of the array that should be associated with a particular vertex. For instance, if this attribute is storing a 3-component vector (such as a position, normal, or color), then size should be 3.\n\t\t * @param {number} [offset=0] - The offset in the underlying array buffer where an item starts.\n\t\t * @param {boolean} [normalized=false] - Indicates how the underlying data in the buffer maps to the values in the GLSL shader code.\n\t\t */\n\t\tconstructor(buffer, size = buffer.stride, offset = 0, normalized = false) {\n\t\t\t/**\n\t\t\t * The Buffer instance passed in the constructor.\n\t\t\t * @type {Buffer}\n\t\t\t */\n\t\t\tthis.buffer = buffer;\n\n\t\t\t/**\n\t\t\t * The number of values of the buffer that should be associated with the attribute.\n\t\t\t * @type {number}\n\t\t\t * @default buffer.stride\n\t\t\t */\n\t\t\tthis.size = size;\n\n\t\t\t/**\n\t\t\t * The offset in the underlying buffer where an item starts.\n\t\t\t * @type {number}\n\t\t\t * @default 0\n\t\t\t */\n\t\t\tthis.offset = offset;\n\n\t\t\t/**\n\t\t\t * Indicates how the underlying data in the buffer maps to the values in the GLSL shader code.\n\t\t\t * @type {boolean}\n\t\t\t * @default false\n\t\t\t */\n\t\t\tthis.normalized = normalized;\n\n\t\t\t/**\n\t\t\t * Instance cadence, the number of instances drawn for each vertex in the buffer, non-instance attributes must be 0.\n\t\t\t * @type {number}\n\t\t\t * @default 0\n\t\t\t */\n\t\t\tthis.divisor = 0;\n\t\t}\n\n\t\t/**\n\t\t * Copy the parameters from the passed attribute.\n\t\t * @param {Attribute} source - The attribute to be copied.\n\t\t * @returns {Attribute}\n\t\t */\n\t\tcopy(source) {\n\t\t\tthis.buffer = source.buffer;\n\t\t\tthis.size = source.size;\n\t\t\tthis.offset = source.offset;\n\t\t\tthis.normalized = source.normalized;\n\t\t\tthis.divisor = source.divisor;\n\t\t\treturn this;\n\t\t}\n\n\t\t/**\n\t\t * Return a new attribute with the same parameters as this attribute.\n\t\t * @param {object} buffers - A WeakMap to save shared buffers.\n\t\t * @returns {Attribute}\n\t\t */\n\t\tclone(buffers) {\n\t\t\tlet attribute;\n\t\t\tif (!buffers) {\n\t\t\t\tconsole.warn('Attribute.clone(): now requires a WeakMap as an argument to save shared buffers.');\n\t\t\t\tattribute = new Attribute(this.buffer.clone(), this.size, this.offset, this.normalized);\n\t\t\t\tattribute.divisor = this.divisor;\n\t\t\t\treturn attribute;\n\t\t\t}\n\t\t\tif (!buffers.has(this.buffer)) {\n\t\t\t\tbuffers.set(this.buffer, this.buffer.clone());\n\t\t\t}\n\t\t\tattribute = new Attribute(buffers.get(this.buffer), this.size, this.offset, this.normalized);\n\t\t\tattribute.divisor = this.divisor;\n\t\t\treturn attribute;\n\t\t}\n\t}\n\n\t/**\n\t * The Buffer contain the data that is used for the geometry of 3D models, animations, and skinning.\n\t */\n\tclass Buffer {\n\t\t/**\n\t\t * @param {TypedArray} array -- A typed array with a shared buffer. Stores the geometry data.\n\t\t * @param {number} stride -- The number of typed-array elements per vertex.\n\t\t */\n\t\tconstructor(array, stride) {\n\t\t\t/**\n\t\t\t * A typed array with a shared buffer.\n\t\t\t * Stores the geometry data.\n\t\t\t * @type {TypedArray}\n\t\t\t */\n\t\t\tthis.array = array;\n\n\t\t\t/**\n\t\t\t * The number of typed-array elements per vertex.\n\t\t\t * @type {number}\n\t\t\t */\n\t\t\tthis.stride = stride;\n\n\t\t\t/**\n\t\t\t * Gives the total number of elements in the array.\n\t\t\t * @type {number}\n\t\t\t */\n\t\t\tthis.count = array !== undefined ? array.length / stride : 0;\n\n\t\t\t/**\n\t\t\t * Defines the intended usage pattern of the data store for optimization purposes.\n\t\t\t * Corresponds to the usage parameter of WebGLRenderingContext.bufferData().\n\t\t\t * @type {BUFFER_USAGE}\n\t\t\t * @default BUFFER_USAGE.STATIC_DRAW\n\t\t\t */\n\t\t\tthis.usage = BUFFER_USAGE.STATIC_DRAW;\n\n\t\t\t/**\n\t\t\t * Object containing offset and count.\n\t\t\t * @type {object}\n\t\t\t * @default { offset: 0, count: - 1 }\n\t\t\t */\n\t\t\tthis.updateRange = {\n\t\t\t\toffset: 0,\n\t\t\t\tcount: -1\n\t\t\t};\n\n\t\t\t/**\n\t\t\t * A version number, incremented every time the data is changed.\n\t\t\t * @type {number}\n\t\t\t * @default 0\n\t\t\t */\n\t\t\tthis.version = 0;\n\t\t}\n\n\t\t/**\n\t\t * A callback function that is executed after the Renderer has transferred the attribute array data to the GPU.\n\t\t */\n\t\tonUploadCallback() {}\n\n\t\t/**\n\t\t * Copies another Buffer to this Buffer.\n\t\t * @param {Buffer} source - The buffer to be copied.\n\t\t * @returns {Buffer}\n\t\t */\n\t\tcopy(source) {\n\t\t\tthis.array = new source.array.constructor(source.array);\n\t\t\tthis.stride = source.stride;\n\t\t\tthis.count = source.array.length / this.stride;\n\t\t\tthis.usage = source.usage;\n\t\t\treturn this;\n\t\t}\n\n\t\t/**\n\t\t * Return a copy of this buffer.\n\t\t * @returns {Buffer}\n\t\t */\n\t\tclone() {\n\t\t\tconst array = new this.array.constructor(this.array);\n\t\t\tconst ib = new Buffer(array, this.stride);\n\t\t\tib.usage = this.usage;\n\t\t\treturn ib;\n\t\t}\n\t}\n\n\tlet _geometryId = 0;\n\tconst _vector$1 = new Vector3();\n\tconst _offset = new Vector3();\n\tconst _sum = new Vector3();\n\tconst _box3 = new Box3();\n\tconst _boxMorphTargets = new Box3();\n\n\t/**\n\t * An efficient representation of mesh, line, or point geometry.\n\t * Includes vertex positions, face indices, normals, colors, UVs, and custom attributes within buffers, reducing the cost of passing all this data to the GPU.\n\t * To read and edit data in {@link Geometry#attributes}.\n\t * @extends EventDispatcher\n\t */\n\tclass Geometry extends EventDispatcher {\n\t\t/**\n\t\t * Create a geometry.\n\t\t */\n\t\tconstructor() {\n\t\t\tsuper();\n\n\t\t\t/**\n\t\t\t * Unique number for this geometry instance.\n\t\t\t * @readonly\n\t\t\t * @type {number}\n\t\t\t */\n\t\t\tthis.id = _geometryId++;\n\n\t\t\t/**\n\t\t\t * UUID of this geometry instance.\n\t\t\t * This gets automatically assigned, so this shouldn't be edited.\n\t\t\t * @readonly\n\t\t\t * @type {string}\n\t\t\t */\n\t\t\tthis.uuid = MathUtils.generateUUID();\n\n\t\t\t/**\n\t\t\t * This hashmap has as id the name of the attribute to be set and as value the buffer to set it to.\n\t\t\t * Rather than accessing this property directly, use {@link Geometry#addAttribute} and {@link Geometry#getAttribute} to access attributes of this geometry.\n\t\t\t * @type {object}\n\t\t\t */\n\t\t\tthis.attributes = {};\n\n\t\t\t/**\n\t\t\t * Hashmap of Attributes Array for morph targets.\n\t\t\t * @type {object}\n\t\t\t */\n\t\t\tthis.morphAttributes = {};\n\n\t\t\t/**\n\t\t\t * Allows for vertices to be re-used across multiple triangles; this is called using \"indexed triangles\" and each triangle is associated with the indices of three vertices.\n\t\t\t * This attribute therefore stores the index of each vertex for each triangular face.\n\t\t\t * If this attribute is not set, the renderer assumes that each three contiguous positions represent a single triangle.\n\t\t\t * @type {Attribute | null}\n\t\t\t */\n\t\t\tthis.index = null;\n\n\t\t\t/**\n\t\t\t * Bounding box for the bufferGeometry, which can be calculated with {@link Geometry#computeBoundingBox}.\n\t\t\t * @type {Box3}\n\t\t\t * @default Box3()\n\t\t\t */\n\t\t\tthis.boundingBox = new Box3();\n\n\t\t\t/**\n\t\t\t * Bounding sphere for the bufferGeometry, which can be calculated with {@link Geometry#computeBoundingSphere}.\n\t\t\t * @type {Sphere}\n\t\t\t * @default Sphere()\n\t\t\t */\n\t\t\tthis.boundingSphere = new Sphere();\n\n\t\t\t/**\n\t\t\t * Split the geometry into groups, each of which will be rendered in a separate WebGL draw call. This allows an array of materials to be used with the geometry.\n\t\t\t * Each group is an object of the form: { start: Integer, count: Integer, materialIndex: Integer },\n\t\t\t * or { multiDrawStarts: Integer[], multiDrawCounts: Integer[], multiDrawCount: Integer, materialIndex: Integer } if multiDraw is available.\n\t\t\t * @type {Array}\n\t\t\t * @default []\n\t\t\t */\n\t\t\tthis.groups = [];\n\n\t\t\t/**\n\t\t\t * The number of instances to be rendered. If set to -1 (default), instanced rendering is disabled.\n\t\t\t * This property is used for instanced rendering, where multiple copies of the geometry\n\t\t\t * are drawn with a single draw call.\n\t\t\t * @type {number}\n\t\t\t * @default -1\n\t\t\t */\n\t\t\tthis.instanceCount = -1;\n\n\t\t\t/**\n\t\t\t * A version number, incremented every time the attribute object or index object changes to mark VAO drity.\n\t\t\t * @type {number}\n\t\t\t * @default 0\n\t\t\t */\n\t\t\tthis.version = 0;\n\t\t}\n\n\t\t/**\n\t\t * Adds an attribute to this geometry.\n\t\t * Use this rather than the attributes property.\n\t\t * @param {string} name\n\t\t * @param {Attribute} attribute\n\t\t */\n\t\taddAttribute(name, attribute) {\n\t\t\tthis.attributes[name] = attribute;\n\t\t}\n\n\t\t/**\n\t\t * Returns the attribute with the specified name.\n\t\t * @param {string} name\n\t\t * @returns {Attribute}\n\t\t */\n\t\tgetAttribute(name) {\n\t\t\treturn this.attributes[name];\n\t\t}\n\n\t\t/**\n\t\t * Removes the attribute with the specified name.\n\t\t * @param {string} name\n\t\t */\n\t\tremoveAttribute(name) {\n\t\t\tdelete this.attributes[name];\n\t\t}\n\n\t\t/**\n\t\t * Set the {@link Geometry#index} buffer.\n\t\t * @param {Array | Attribute | null} index\n\t\t */\n\t\tsetIndex(index) {\n\t\t\tif (Array.isArray(index)) {\n\t\t\t\tconst typedArray = new (arrayMax(index) > 65535 ? Uint32Array : Uint16Array)(index);\n\t\t\t\tthis.index = new Attribute(new Buffer(typedArray, 1));\n\t\t\t} else {\n\t\t\t\tthis.index = index;\n\t\t\t}\n\t\t}\n\n\t\t/**\n\t\t * Adds a group to this geometry; see the {@link Geometry#groups} for details.\n\t\t * @param {number} start\n\t\t * @param {number} count\n\t\t * @param {number} [materialIndex=0]\n\t\t */\n\t\taddGroup(start, count, materialIndex = 0) {\n\t\t\tthis.groups.push({\n\t\t\t\tstart: start,\n\t\t\t\tcount: count,\n\t\t\t\tmaterialIndex: materialIndex\n\t\t\t});\n\t\t}\n\n\t\t/**\n\t\t * Clears all groups.\n\t\t */\n\t\tclearGroups() {\n\t\t\tthis.groups = [];\n\t\t}\n\n\t\t/**\n\t\t * Computes bounding box of the geometry, updating {@link Geometry#boundingBox}.\n\t\t * Bounding boxes aren't computed by default. They need to be explicitly computed.\n\t\t */\n\t\tcomputeBoundingBox() {\n\t\t\tconst position = this.attributes['a_Position'] || this.attributes['position'];\n\t\t\tif (position) {\n\t\t\t\tthis.boundingBox.setFromArray(position.buffer.array, position.buffer.stride, position.offset, position.normalized);\n\t\t\t}\n\t\t\tconst morphAttributesPosition = this.morphAttributes.position;\n\t\t\tif (morphAttributesPosition) {\n\t\t\t\tfor (let i = 0; i < morphAttributesPosition.length; i++) {\n\t\t\t\t\tconst morphAttribute = morphAttributesPosition[i];\n\t\t\t\t\t_box3.setFromArray(morphAttribute.buffer.array, morphAttribute.buffer.stride, morphAttribute.offset, morphAttribute.normalized);\n\t\t\t\t\t_vector$1.addVectors(this.boundingBox.min, _box3.min);\n\t\t\t\t\tthis.boundingBox.expandByPoint(_vector$1);\n\t\t\t\t\t_vector$1.addVectors(this.boundingBox.max, _box3.max);\n\t\t\t\t\tthis.boundingBox.expandByPoint(_vector$1);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t/**\n\t\t * Computes bounding sphere of the geometry, updating {@link Geometry#boundingSphere}.\n\t\t * Bounding spheres aren't computed by default. They need to be explicitly computed.\n\t\t */\n\t\tcomputeBoundingSphere() {\n\t\t\tconst position = this.attributes['a_Position'] || this.attributes['position'];\n\t\t\tconst morphAttributesPosition = this.morphAttributes.position;\n\t\t\tif (!position) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst bufferStride = position.buffer.stride;\n\t\t\tconst positionOffset = position.offset;\n\t\t\tif (morphAttributesPosition) {\n\t\t\t\t_box3.setFromArray(position.buffer.array, bufferStride, positionOffset, position.normalized);\n\t\t\t\tfor (let i = 0; i < morphAttributesPosition.length; i++) {\n\t\t\t\t\tconst morphAttribute = morphAttributesPosition[i];\n\t\t\t\t\t_boxMorphTargets.setFromArray(morphAttribute.buffer.array, morphAttribute.buffer.stride, morphAttribute.offset, morphAttribute.normalized);\n\t\t\t\t\t_vector$1.addVectors(_box3.min, _boxMorphTargets.min);\n\t\t\t\t\t_box3.expandByPoint(_vector$1);\n\t\t\t\t\t_vector$1.addVectors(_box3.max, _boxMorphTargets.max);\n\t\t\t\t\t_box3.expandByPoint(_vector$1);\n\t\t\t\t}\n\t\t\t\tconst center = this.boundingSphere.center;\n\t\t\t\t_box3.getCenter(center);\n\t\t\t\tlet maxRadiusSq = 0;\n\t\t\t\tfor (let i = 0; i < position.buffer.count; i++) {\n\t\t\t\t\t_offset.fromArray(position.buffer.array, i * bufferStride + positionOffset);\n\t\t\t\t\tmaxRadiusSq = center.distanceToSquared(_offset);\n\t\t\t\t\tfor (let j = 0; j < morphAttributesPosition.length; j++) {\n\t\t\t\t\t\tconst morphAttribute = morphAttributesPosition[j];\n\t\t\t\t\t\t_vector$1.fromArray(morphAttribute.buffer.array, i * morphAttribute.buffer.stride + morphAttribute.offset);\n\t\t\t\t\t\t_sum.addVectors(_offset, _vector$1);\n\t\t\t\t\t\tconst offsetLengthSq = center.distanceToSquared(_sum);\n\n\t\t\t\t\t\t// TODO The maximum radius cannot be obtained here\n\t\t\t\t\t\tif (offsetLengthSq > maxRadiusSq) {\n\t\t\t\t\t\t\tmaxRadiusSq = offsetLengthSq;\n\t\t\t\t\t\t\t_offset.add(_vector$1);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tthis.boundingSphere.radius = Math.sqrt(maxRadiusSq);\n\t\t\t} else {\n\t\t\t\tthis.boundingSphere.setFromArray(position.buffer.array, bufferStride, positionOffset, position.normalized);\n\t\t\t}\n\t\t}\n\n\t\t/**\n\t\t * Disposes the object from memory.\n\t\t * You need to call this when you want the BufferGeometry removed while the application is running.\n\t\t */\n\t\tdispose() {\n\t\t\tthis.dispatchEvent({\n\t\t\t\ttype: 'dispose'\n\t\t\t});\n\t\t}\n\n\t\t/**\n\t\t * Copies another Geometry to this Geometry.\n\t\t * @param {Geometry} source - The geometry to be copied.\n\t\t * @returns {Geometry}\n\t\t */\n\t\tcopy(source) {\n\t\t\tlet name, i, l;\n\n\t\t\t// reset\n\n\t\t\tthis.index = null;\n\t\t\tthis.attributes = {};\n\t\t\tthis.morphAttributes = {};\n\t\t\tthis.groups = [];\n\t\t\tconst buffers = new WeakMap(); // used for storing cloned, shared buffers\n\n\t\t\t// index\n\n\t\t\tconst index = source.index;\n\t\t\tif (index !== null) {\n\t\t\t\tthis.setIndex(index.clone(buffers));\n\t\t\t}\n\n\t\t\t// attributes\n\n\t\t\tconst attributes = source.attributes;\n\t\t\tfor (name in attributes) {\n\t\t\t\tconst attribute = attributes[name];\n\t\t\t\tthis.addAttribute(name, attribute.clone(buffers));\n\t\t\t}\n\n\t\t\t// morph attributes\n\n\t\t\tconst morphAttributes = source.morphAttributes;\n\t\t\tfor (name in morphAttributes) {\n\t\t\t\tconst array = [];\n\t\t\t\tconst morphAttribute = morphAttributes[name]; // morphAttribute: array of Float32BufferAttributes\n\n\t\t\t\tfor (i = 0, l = morphAttribute.length; i < l; i++) {\n\t\t\t\t\tarray.push(morphAttribute[i].clone(buffers));\n\t\t\t\t}\n\t\t\t\tthis.morphAttributes[name] = array;\n\t\t\t}\n\n\t\t\t// groups\n\n\t\t\tconst groups = source.groups;\n\t\t\tfor (i = 0, l = groups.length; i < l; i++) {\n\t\t\t\tconst group = groups[i];\n\t\t\t\tthis.addGroup(group.start, group.count, group.materialIndex);\n\t\t\t}\n\n\t\t\t// boundings\n\t\t\tthis.boundingBox.copy(source.boundingBox);\n\t\t\tthis.boundingSphere.copy(source.boundingSphere);\n\n\t\t\t// instance count\n\t\t\tthis.instanceCount = source.instanceCount;\n\t\t\treturn this;\n\t\t}\n\n\t\t/**\n\t\t * Creates a clone of this Geometry.\n\t\t * @returns {Geometry}\n\t\t */\n\t\tclone() {\n\t\t\treturn new Geometry().copy(this);\n\t\t}\n\t}\n\tfunction arrayMax(array) {\n\t\tif (array.length === 0) return -Infinity;\n\t\tlet max = array[0];\n\t\tfor (let i = 1, l = array.length; i < l; ++i) {\n\t\t\tif (array[i] > max) max = array[i];\n\t\t}\n\t\treturn max;\n\t}\n\n\t/**\n\t * A transform object for UV coordinates.\n\t * @extends Matrix3\n\t */\n\tclass TransformUV extends Matrix3 {\n\t\t/**\n\t\t * Create a new TransformUV object.\n\t\t */\n\t\tconstructor() {\n\t\t\tsuper();\n\t\t\tthis.offset = new Vector2(0, 0);\n\t\t\tthis.scale = new Vector2(1, 1);\n\t\t\tthis.center = new Vector2(0, 0);\n\t\t\tthis.rotation = 0;\n\t\t\tthis.needsUpdate = false;\n\t\t}\n\n\t\t/**\n\t\t * Update the matrix for UV transformation based on the offset, scale, rotation and center.\n\t\t * If needsUpdate is false, this method will do nothing.\n\t\t * @returns {TransformUV} This object.\n\t\t */\n\t\tupdate() {\n\t\t\tif (!this.needsUpdate) return this;\n\t\t\tthis.needsUpdate = false;\n\t\t\tthis.updateMatrix();\n\t\t\treturn this;\n\t\t}\n\n\t\t/**\n\t\t * Update the matrix for UV transformation based on the offset, scale, rotation and center.\n\t\t * This method will always update the matrix regardless of the needsUpdate flag.\n\t\t * @returns {TransformUV} This object.\n\t\t */\n\t\tupdateMatrix() {\n\t\t\treturn this.setUvTransform(this.offset.x, this.offset.y, this.scale.x, this.scale.y, this.rotation, this.center.x, this.center.y);\n\t\t}\n\n\t\t/**\n\t\t * Copy the properties of another TransformUV object.\n\t\t * @param {TransformUV|Matrix3} source - The object to copy the properties from.\n\t\t * @returns {TransformUV} This object.\n\t\t */\n\t\tcopy(source) {\n\t\t\tsuper.copy(source);\n\n\t\t\t// in case source is only a Matrix3 object (without additional properties)\n\t\t\tif (!source.isTransformUV) return this;\n\t\t\tthis.offset.copy(source.offset);\n\t\t\tthis.scale.copy(source.scale);\n\t\t\tthis.center.copy(source.center);\n\t\t\tthis.rotation = source.rotation;\n\t\t\tthis.needsUpdate = source.needsUpdate;\n\t\t\treturn this;\n\t\t}\n\n\t\t/**\n\t\t * Clone this TransformUV object.\n\t\t * @returns {TransformUV} The cloned object.\n\t\t */\n\t\tclone() {\n\t\t\treturn new this.constructor().copy(this);\n\t\t}\n\t}\n\n\t/**\n\t * This flag can be used for type testing.\n\t * @readonly\n\t * @type {boolean}\n\t * @default true\n\t */\n\tTransformUV.prototype.isTransformUV = true;\n\n\tlet _materialId = 0;\n\n\t/**\n\t * Abstract base class for materials.\n\t * Materials describe the appearance of {@link Object3D}.\n\t * They are defined in a (mostly) renderer-independent way, so you don't have to rewrite materials if you decide to use a different renderer.\n\t * The following properties and methods are inherited by all other material types (although they may have different defaults).\n\t * @abstract\n\t * @extends EventDispatcher\n\t */\n\tclass Material extends EventDispatcher {\n\t\tconstructor() {\n\t\t\tsuper();\n\n\t\t\t/**\n\t\t\t * Unique number for this material instance.\n\t\t\t * @readonly\n\t\t\t * @type {number}\n\t\t\t */\n\t\t\tthis.id = _materialId++;\n\n\t\t\t/**\n\t\t\t * UUID of this material instance.\n\t\t\t * This gets automatically assigned, so this shouldn't be edited.\n\t\t\t * @type {string}\n\t\t\t */\n\t\t\tthis.uuid = MathUtils.generateUUID();\n\n\t\t\t/**\n\t\t\t * Type of the material.\n\t\t\t * @type {MATERIAL_TYPE}\n\t\t\t * @default MATERIAL_TYPE.SHADER\n\t\t\t */\n\t\t\tthis.type = MATERIAL_TYPE.SHADER;\n\n\t\t\t/**\n\t\t\t * Custom shader name. This naming can help ShaderMaterial to optimize the length of the index hash string.\n\t\t\t * It is valid only when the material type is MATERIAL_TYPE.SHADER.\n\t\t\t * Otherwise, if the material is a built-in type, the name of the shader will always be equal to the material type.\n\t\t\t * @type {string}\n\t\t\t * @default \"\"\n\t\t\t */\n\t\t\tthis.shaderName = '';\n\n\t\t\t/**\n\t\t\t * Custom defines of the shader.\n\t\t\t * Only valid when the material type is MATERIAL_TYPE.SHADER.\n\t\t\t * @type {object}\n\t\t\t * @default {}\n\t\t\t */\n\t\t\tthis.defines = {};\n\n\t\t\t/**\n\t\t\t * Custom uniforms of the shader.\n\t\t\t * Only valid when the material type is MATERIAL_TYPE.SHADER.\n\t\t\t * @type {object}\n\t\t\t * @default {}\n\t\t\t */\n\t\t\tthis.uniforms = {};\n\n\t\t\t/**\n\t\t\t * Custom GLSL code for vertex shader.\n\t\t\t * Only valid when the material type is MATERIAL_TYPE.SHADER.\n\t\t\t * @type {string}\n\t\t\t * @default \"\"\n\t\t\t */\n\t\t\tthis.vertexShader = '';\n\n\t\t\t/**\n\t\t\t * Custom GLSL code for fragment shader.\n\t\t\t * Only valid when the material type is MATERIAL_TYPE.SHADER.\n\t\t\t * @type {string}\n\t\t\t * @default \"\"\n\t\t\t */\n\t\t\tthis.fragmentShader = '';\n\n\t\t\t/**\n\t\t\t * Override the renderer's default precision for this material.\n\t\t\t * Can be \"highp\", \"mediump\" or \"lowp\".\n\t\t\t * @type {string}\n\t\t\t * @default null\n\t\t\t */\n\t\t\tthis.precision = null;\n\n\t\t\t/**\n\t\t\t * The bitmask of UV coordinate channels to use for the external texture.\n\t\t\t * This will be combined with the internal UV coordinate mask collected from the renderer by default.\n\t\t\t * Finally, it will be used to determine which UV coordinate attribute to use and to generate the shader code.\n\t\t\t * @type {number}\n\t\t\t * @default 0\n\t\t\t */\n\t\t\tthis.extUvCoordMask = 0;\n\n\t\t\t/**\n\t\t\t * Defines whether this material is transparent.\n\t\t\t * This has an effect on rendering as transparent objects need special treatment and are rendered after non-transparent objects.\n\t\t\t * When set to true, the extent to which the material is transparent is controlled by setting it's blending property.\n\t\t\t * @type {boolean}\n\t\t\t * @default false\n\t\t\t */\n\t\t\tthis.transparent = false;\n\n\t\t\t/**\n\t\t\t * Which blending to use when displaying objects with this material.\n\t\t\t * This must be set to BLEND_TYPE.CUSTOM to use custom blendSrc, blendDst or blendEquation.\n\t\t\t * @type {BLEND_TYPE}\n\t\t\t * @default BLEND_TYPE.NORMAL\n\t\t\t */\n\t\t\tthis.blending = BLEND_TYPE.NORMAL;\n\n\t\t\t/**\n\t\t\t * Blending source.\n\t\t\t * The {@link Material#blending} must be set to BLEND_TYPE.CUSTOM for this to have any effect.\n\t\t\t * @type {BLEND_FACTOR}\n\t\t\t * @default BLEND_FACTOR.SRC_ALPHA\n\t\t\t */\n\t\t\tthis.blendSrc = BLEND_FACTOR.SRC_ALPHA;\n\n\t\t\t/**\n\t\t\t * Blending destination.\n\t\t\t * The {@link Material#blending} must be set to BLEND_TYPE.CUSTOM for this to have any effect.\n\t\t\t * @type {BLEND_FACTOR}\n\t\t\t * @default BLEND_FACTOR.ONE_MINUS_SRC_ALPHA\n\t\t\t */\n\t\t\tthis.blendDst = BLEND_FACTOR.ONE_MINUS_SRC_ALPHA;\n\n\t\t\t/**\n\t\t\t * Blending equation to use when applying blending.\n\t\t\t * The {@link Material#blending} must be set to BLEND_TYPE.CUSTOM for this to have any effect.\n\t\t\t * @type {BLEND_EQUATION}\n\t\t\t * @default BLEND_EQUATION.ADD\n\t\t\t */\n\t\t\tthis.blendEquation = BLEND_EQUATION.ADD;\n\n\t\t\t/**\n\t\t\t * The transparency of the {@link Material#blendSrc}.\n\t\t\t * The {@link Material#blending} must be set to BLEND_TYPE.CUSTOM for this to have any effect.\n\t\t\t * @type {BLEND_FACTOR}\n\t\t\t * @default null\n\t\t\t */\n\t\t\tthis.blendSrcAlpha = null;\n\n\t\t\t/**\n\t\t\t * The transparency of the {@link Material#blendDst}.\n\t\t\t * The {@link Material#blending} must be set to BLEND_TYPE.CUSTOM for this to have any effect.\n\t\t\t * @type {BLEND_FACTOR}\n\t\t\t * @default null\n\t\t\t */\n\t\t\tthis.blendDstAlpha = null;\n\n\t\t\t/**\n\t\t\t * The tranparency of the {@link Material#blendEquation}.\n\t\t\t * The {@link Material#blending} must be set to BLEND_TYPE.CUSTOM for this to have any effect.\n\t\t\t * @type {BLEND_EQUATION}\n\t\t\t * @default null\n\t\t\t */\n\t\t\tthis.blendEquationAlpha = null;\n\n\t\t\t/**\n\t\t\t * Whether to premultiply the alpha (transparency) value.\n\t\t\t * @type {boolean}\n\t\t\t * @default false\n\t\t\t */\n\t\t\tthis.premultipliedAlpha = false;\n\n\t\t\t/**\n\t\t\t * Defines whether vertex coloring is used.\n\t\t\t * @type {VERTEX_COLOR}\n\t\t\t * @default VERTEX_COLOR.NONE\n\t\t\t */\n\t\t\tthis.vertexColors = VERTEX_COLOR.NONE;\n\n\t\t\t/**\n\t\t\t * Defines whether precomputed vertex tangents, which must be provided in a vec4 \"tangent\" attribute, are used.\n\t\t\t * When disabled, tangents are derived automatically.\n\t\t\t * Using precomputed tangents will give more accurate normal map details in some cases, such as with mirrored UVs.\n\t\t\t * @type {boolean}\n\t\t\t * @default false\n\t\t\t */\n\t\t\tthis.vertexTangents = false;\n\n\t\t\t/**\n\t\t\t * Float in the range of 0.0 - 1.0 indicating how transparent the material is.\n\t\t\t * A value of 0.0 indicates fully transparent, 1.0 is fully opaque.\n\t\t\t * @type {number}\n\t\t\t * @default 1\n\t\t\t */\n\t\t\tthis.opacity = 1;\n\n\t\t\t/**\n\t\t\t * The diffuse color.\n\t\t\t * @type {Color3}\n\t\t\t * @default Color3(0xffffff)\n\t\t\t */\n\t\t\tthis.diffuse = new Color3(0xffffff);\n\n\t\t\t/**\n\t\t\t * The diffuse map.\n\t\t\t * @type {Texture2D}\n\t\t\t * @default null\n\t\t\t */\n\t\t\tthis.diffuseMap = null;\n\n\t\t\t/**\n\t\t\t * Define the UV chanel for the diffuse map to use starting from 0 and defaulting to 0.\n\t\t\t * @type {number}\n\t\t\t * @default 0\n\t\t\t */\n\t\t\tthis.diffuseMapCoord = 0;\n\n\t\t\t/**\n\t\t\t * The uv-transform matrix of diffuse map.\n\t\t\t * This will also affect other maps that cannot be individually specified uv transform, such as normalMap, bumpMap, etc.\n\t\t\t * @type {TransformUV}\n\t\t\t * @default TransformUV()\n\t\t\t */\n\t\t\tthis.diffuseMapTransform = new TransformUV();\n\n\t\t\t/**\n\t\t\t * The alpha map.\n\t\t\t * @type {Texture2D}\n\t\t\t * @default null\n\t\t\t */\n\t\t\tthis.alphaMap = null;\n\n\t\t\t/**\n\t\t\t * Define the UV chanel for the alpha map to use starting from 0 and defaulting to 0.\n\t\t\t * @type {number}\n\t\t\t * @default 0\n\t\t\t */\n\t\t\tthis.alphaMapCoord = 0;\n\n\t\t\t/**\n\t\t\t * The uv-transform matrix of alpha map.\n\t\t\t * @type {TransformUV}\n\t\t\t * @default TransformUV()\n\t\t\t */\n\t\t\tthis.alphaMapTransform = new TransformUV();\n\n\t\t\t/**\n\t\t\t * Emissive (light) color of the material, essentially a solid color unaffected by other lighting.\n\t\t\t * @type {Color3}\n\t\t\t * @default Color3(0x000000)\n\t\t\t */\n\t\t\tthis.emissive = new Color3(0x000000);\n\n\t\t\t/**\n\t\t\t * Set emissive (glow) map.\n\t\t\t * The emissive map color is modulated by the emissive color.\n\t\t\t * If you have an emissive map, be sure to set the emissive color to something other than black.\n\t\t\t * @type {Texture2D}\n\t\t\t * @default null\n\t\t\t */\n\t\t\tthis.emissiveMap = null;\n\n\t\t\t/**\n\t\t\t * Define the UV chanel for the emissive map to use starting from 0 and defaulting to 0.\n\t\t\t * @type {number}\n\t\t\t * @default 0\n\t\t\t */\n\t\t\tthis.emissiveMapCoord = 0;\n\n\t\t\t/**\n\t\t\t * The uv-transform matrix of emissive map.\n\t\t\t * @type {TransformUV}\n\t\t\t * @default TransformUV()\n\t\t\t */\n\t\t\tthis.emissiveMapTransform = new TransformUV();\n\n\t\t\t/**\n\t\t\t * The red channel of this texture is used as the ambient occlusion map.\n\t\t\t * @type {Texture2D}\n\t\t\t * @default null\n\t\t\t */\n\t\t\tthis.aoMap = null;\n\n\t\t\t/**\n\t\t\t * Intensity of the ambient occlusion effect.\n\t\t\t * @type {number}\n\t\t\t * @default 1\n\t\t\t */\n\t\t\tthis.aoMapIntensity = 1.0;\n\n\t\t\t/**\n\t\t\t * Define the UV chanel for the ao map to use starting from 0 and defaulting to 0.\n\t\t\t * @type {number}\n\t\t\t * @default 0\n\t\t\t */\n\t\t\tthis.aoMapCoord = 0;\n\n\t\t\t/**\n\t\t\t * The uv-transform matrix of ao map.\n\t\t\t * @type {TransformUV}\n\t\t\t * @default TransformUV()\n\t\t\t */\n\t\t\tthis.aoMapTransform = new TransformUV();\n\n\t\t\t/**\n\t\t\t * The normal map.\n\t\t\t * @type {Texture2D}\n\t\t\t * @default null\n\t\t\t */\n\t\t\tthis.normalMap = null;\n\n\t\t\t/**\n\t\t\t * How much the normal map affects the material. Typical ranges are 0-1.\n\t\t\t * @type {Vector2}\n\t\t\t * @default Vector2(1,1)\n\t\t\t */\n\t\t\tthis.normalScale = new Vector2(1, 1);\n\n\t\t\t/**\n\t\t\t * The texture to create a bump map.\n\t\t\t * The black and white values map to the perceived depth in relation to the lights. Bump doesn't actually affect the geometry of the object, only the lighting.\n\t\t\t * @type {Texture2D}\n\t\t\t * @default null\n\t\t\t */\n\t\t\tthis.bumpMap = null;\n\n\t\t\t/**\n\t\t\t * How much the bump map affects the material.\n\t\t\t * Typical ranges are 0-1.\n\t\t\t * @type {number}\n\t\t\t * @default 1\n\t\t\t */\n\t\t\tthis.bumpScale = 1;\n\n\t\t\t/**\n\t\t\t * The environment map.\n\t\t\t * If set to undefined, then the material will not inherit envMap from scene.environment.\n\t\t\t * @type {TextureCube|null|undefined}\n\t\t\t * @default null\n\t\t\t */\n\t\t\tthis.envMap = null;\n\n\t\t\t/**\n\t\t\t * Scales the effect of the environment map by multiplying its color.\n\t\t\t * This can effect both the diffuse and specular components of environment map.\n\t\t\t * @type {number}\n\t\t\t * @default 1\n\t\t\t */\n\t\t\tthis.envMapIntensity = 1;\n\n\t\t\t/**\n\t\t\t * How to combine the result of the surface's color with the environment map, if any.\n\t\t\t * This has no effect in a {@link PBRMaterial}.\n\t\t\t * @type {ENVMAP_COMBINE_TYPE}\n\t\t\t * @default ENVMAP_COMBINE_TYPE.MULTIPLY\n\t\t\t */\n\t\t\tthis.envMapCombine = ENVMAP_COMBINE_TYPE.MULTIPLY;\n\n\t\t\t/**\n\t\t\t * Which depth function to use. See the {@link COMPARE_FUNC} constants for all possible values.\n\t\t\t * @type {COMPARE_FUNC}\n\t\t\t * @default COMPARE_FUNC.LEQUAL\n\t\t\t */\n\t\t\tthis.depthFunc = COMPARE_FUNC.LEQUAL;\n\n\t\t\t/**\n\t\t\t * Whether to have depth test enabled when rendering this material.\n\t\t\t * @type {boolean}\n\t\t\t * @default true\n\t\t\t */\n\t\t\tthis.depthTest = true;\n\n\t\t\t/**\n\t\t\t * Whether rendering this material has any effect on the depth buffer.\n\t\t\t * When drawing 2D overlays it can be useful to disable the depth writing in order to layer several things together without creating z-index artifacts.\n\t\t\t * @type {boolean}\n\t\t\t * @default true\n\t\t\t */\n\t\t\tthis.depthWrite = true;\n\n\t\t\t/**\n\t\t\t * Whether to render the material's color.\n\t\t\t * This can be used in conjunction with a mesh's renderOrder property to create invisible objects that occlude other objects.\n\t\t\t * @type {boolean}\n\t\t\t * @default true\n\t\t\t */\n\t\t\tthis.colorWrite = true;\n\n\t\t\t/**\n\t\t\t * Whether stencil operations are performed against the stencil buffer.\n\t\t\t * In order to perform writes or comparisons against the stencil buffer this value must be true.\n\t\t\t * @type {boolean}\n\t\t\t * @default false\n\t\t\t */\n\t\t\tthis.stencilTest = false;\n\n\t\t\t/**\n\t\t\t * The bit mask to use when writing to the stencil buffer.\n\t\t\t * @type {number}\n\t\t\t * @default 0xFF\n\t\t\t */\n\t\t\tthis.stencilWriteMask = 0xff;\n\n\t\t\t/**\n\t\t\t * The stencil comparison function to use.\n\t\t\t * See the {@link COMPARE_FUNC} constants for all possible values.\n\t\t\t * @type {COMPARE_FUNC}\n\t\t\t * @default COMPARE_FUNC.ALWAYS\n\t\t\t */\n\t\t\tthis.stencilFunc = COMPARE_FUNC.ALWAYS;\n\n\t\t\t/**\n\t\t\t * The value to use when performing stencil comparisons or stencil operations.\n\t\t\t * @type {number}\n\t\t\t * @default 0\n\t\t\t */\n\t\t\tthis.stencilRef = 0;\n\n\t\t\t/**\n\t\t\t * The bit mask to use when comparing against the stencil buffer.\n\t\t\t * @type {number}\n\t\t\t * @default 0xFF\n\t\t\t */\n\t\t\tthis.stencilFuncMask = 0xff;\n\n\t\t\t/**\n\t\t\t * Which stencil operation to perform when the comparison function returns false.\n\t\t\t * See the {@link OPERATION} constants for all possible values.\n\t\t\t * @type {OPERATION}\n\t\t\t * @default OPERATION.KEEP\n\t\t\t */\n\t\t\tthis.stencilFail = OPERATION.KEEP;\n\n\t\t\t/**\n\t\t\t * Which stencil operation to perform when the comparison function returns true but the depth test fails.\n\t\t\t * See the {@link OPERATION} constants for all possible values.\n\t\t\t * @type {OPERATION}\n\t\t\t * @default OPERATION.KEEP\n\t\t\t */\n\t\t\tthis.stencilZFail = OPERATION.KEEP;\n\n\t\t\t/**\n\t\t\t * Which stencil operation to perform when the comparison function returns true and the depth test passes.\n\t\t\t * See the {@link OPERATION} constants for all possible values.\n\t\t\t * @type {OPERATION}\n\t\t\t * @default OPERATION.KEEP\n\t\t\t */\n\t\t\tthis.stencilZPass = OPERATION.KEEP;\n\n\t\t\t/**\n\t\t\t * The stencil comparison function to use.\n\t\t\t * See the {@link COMPARE_FUNC} constants for all possible values.\n\t\t\t * You can explicitly specify the two-sided stencil function state by defining stencilFuncBack, stencilRefBack and stencilFuncMaskBack.\n\t\t\t * @type {COMPARE_FUNC|null}\n\t\t\t * @default null\n\t\t\t */\n\t\t\tthis.stencilFuncBack = null;\n\n\t\t\t/**\n\t\t\t * The value to use when performing stencil comparisons or stencil operations.\n\t\t\t * You can explicitly specify the two-sided stencil function state by defining stencilFuncBack, stencilRefBack and stencilFuncMaskBack.\n\t\t\t * @type {number | null}\n\t\t\t * @default null\n\t\t\t */\n\t\t\tthis.stencilRefBack = null;\n\n\t\t\t/**\n\t\t\t * The bit mask to use when comparing against the stencil buffer.\n\t\t\t * You can explicitly specify the two-sided stencil function state by defining stencilFuncBack, stencilRefBack and stencilFuncMaskBack.\n\t\t\t * @type {number | null}\n\t\t\t * @default null\n\t\t\t */\n\t\t\tthis.stencilFuncMaskBack = null;\n\n\t\t\t/**\n\t\t\t * Which stencil operation to perform when the comparison function returns false.\n\t\t\t * See the {@link OPERATION} constants for all possible values.\n\t\t\t * You can explicitly specify the two-sided stencil op state by defining stencilFailBack, stencilZFailBack and stencilZPassBack.\n\t\t\t * @type {OPERATION|null}\n\t\t\t * @default null\n\t\t\t */\n\t\t\tthis.stencilFailBack = null;\n\n\t\t\t/**\n\t\t\t * Which stencil operation to perform when the comparison function returns true but the depth test fails.\n\t\t\t * See the {@link OPERATION} constants for all possible values.\n\t\t\t * You can explicitly specify the two-sided stencil op state by defining stencilFailBack, stencilZFailBack and stencilZPassBack.\n\t\t\t * @type {OPERATION|null}\n\t\t\t * @default null\n\t\t\t */\n\t\t\tthis.stencilZFailBack = null;\n\n\t\t\t/**\n\t\t\t * Which stencil operation to perform when the comparison function returns true and the depth test passes.\n\t\t\t * See the {@link OPERATION} constants for all possible values.\n\t\t\t * You can explicitly specify the two-sided stencil op state by defining stencilFailBack, stencilZFailBack and stencilZPassBack.\n\t\t\t * @type {OPERATION|null}\n\t\t\t * @default null\n\t\t\t */\n\t\t\tthis.stencilZPassBack = null;\n\n\t\t\t/**\n\t\t\t * User-defined clipping planes specified as Plane objects in world space.\n\t\t\t * These planes apply to the objects this material is attached to.\n\t\t\t * Points in space whose signed distance to the plane is negative are clipped (not rendered).\n\t\t\t * @type {Plane[]}\n\t\t\t * @default null\n\t\t\t */\n\t\t\tthis.clippingPlanes = null;\n\n\t\t\t/**\n\t\t\t * Sets the alpha value to be used when running an alpha test.\n\t\t\t * The material will not be renderered if the opacity is lower than this value.\n\t\t\t * @type {number}\n\t\t\t * @default 0\n\t\t\t */\n\t\t\tthis.alphaTest = 0;\n\n\t\t\t/**\n\t\t\t * Enables alpha to coverage.\n\t\t\t * Can only be used when MSAA is enabled.\n\t\t\t * @type {boolean}\n\t\t\t * @default false\n\t\t\t */\n\t\t\tthis.alphaToCoverage = false;\n\n\t\t\t/**\n\t\t\t * Defines which side of faces will be rendered - front, back or double.\n\t\t\t * @type {DRAW_SIDE}\n\t\t\t * @default DRAW_SIDE.FRONT\n\t\t\t */\n\t\t\tthis.side = DRAW_SIDE.FRONT;\n\n\t\t\t/**\n\t\t\t * Whether to use polygon offset.\n\t\t\t * This corresponds to the GL_POLYGON_OFFSET_FILL WebGL feature.\n\t\t\t * @type {boolean}\n\t\t\t * @default false\n\t\t\t */\n\t\t\tthis.polygonOffset = false;\n\n\t\t\t/**\n\t\t\t * Sets the polygon offset factor.\n\t\t\t * @type {number}\n\t\t\t * @default 0\n\t\t\t */\n\t\t\tthis.polygonOffsetFactor = 0;\n\n\t\t\t/**\n\t\t\t * Sets the polygon offset units.\n\t\t\t * @type {number}\n\t\t\t * @default 0\n\t\t\t */\n\t\t\tthis.polygonOffsetUnits = 0;\n\n\t\t\t/**\n\t\t\t * Define whether the material is rendered with flat shading or smooth shading.\n\t\t\t * @type {SHADING_TYPE}\n\t\t\t * @default SHADING_TYPE.SMOOTH_SHADING\n\t\t\t */\n\t\t\tthis.shading = SHADING_TYPE.SMOOTH_SHADING;\n\n\t\t\t/**\n\t\t\t * Whether to apply dithering to the color to remove the appearance of banding.\n\t\t\t * @type {boolean}\n\t\t\t * @default false\n\t\t\t */\n\t\t\tthis.dithering = false;\n\n\t\t\t/**\n\t\t\t * Whether the material is affected by lights.\n\t\t\t * If set true, renderer will try to upload light uniforms.\n\t\t\t * @type {boolean}\n\t\t\t * @default false\n\t\t\t */\n\t\t\tthis.acceptLight = false;\n\n\t\t\t/**\n\t\t\t * The lighting group of the material.\n\t\t\t * Used in conjunction with {@link Light#groupMask}.\n\t\t\t * @type {number}\n\t\t\t * @default 0\n\t\t\t */\n\t\t\tthis.lightingGroup = 0;\n\n\t\t\t/**\n\t\t\t * Whether the material is affected by fog.\n\t\t\t * @type {boolean}\n\t\t\t * @default true\n\t\t\t */\n\t\t\tthis.fog = true;\n\n\t\t\t/**\n\t\t\t * Determines how the mesh triangles are constructed from the vertices.\n\t\t\t * @type {DRAW_MODE}\n\t\t\t * @default DRAW_MODE.TRIANGLES\n\t\t\t */\n\t\t\tthis.drawMode = DRAW_MODE.TRIANGLES;\n\n\t\t\t/**\n\t\t\t * Whether the material uniforms need to be updated every draw call.\n\t\t\t * If set false, the material uniforms are only updated once per frame , this can help optimize performance.\n\t\t\t * @type {boolean}\n\t\t\t * @default true\n\t\t\t */\n\t\t\tthis.forceUpdateUniforms = true;\n\n\t\t\t/**\n\t\t\t * Specifies that the material needs to be recompiled.\n\t\t\t * This property is automatically set to true when instancing a new material.\n\t\t\t * @type {boolean}\n\t\t\t * @default true\n\t\t\t */\n\t\t\tthis.needsUpdate = true;\n\t\t}\n\n\t\t/**\n\t\t * Copy the parameters from the passed material into this material.\n\t\t * @param {Material} source - The material to be copied.\n\t\t * @returns {Material}\n\t\t */\n\t\tcopy(source) {\n\t\t\tthis.shaderName = source.shaderName;\n\t\t\tthis.defines = Object.assign({}, source.defines);\n\t\t\tthis.uniforms = cloneUniforms(source.uniforms);\n\t\t\tthis.vertexShader = source.vertexShader;\n\t\t\tthis.fragmentShader = source.fragmentShader;\n\t\t\tthis.precision = source.precision;\n\t\t\tthis.extUvCoordMask = source.extUvCoordMask;\n\t\t\tthis.transparent = source.transparent;\n\t\t\tthis.blending = source.blending;\n\t\t\tthis.blendSrc = source.blendSrc;\n\t\t\tthis.blendDst = source.blendDst;\n\t\t\tthis.blendEquation = source.blendEquation;\n\t\t\tthis.blendSrcAlpha = source.blendSrcAlpha;\n\t\t\tthis.blendDstAlpha = source.blendDstAlpha;\n\t\t\tthis.blendEquationAlpha = source.blendEquationAlpha;\n\t\t\tthis.premultipliedAlpha = source.premultipliedAlpha;\n\t\t\tthis.vertexColors = source.vertexColors;\n\t\t\tthis.vertexTangents = source.vertexTangents;\n\t\t\tthis.opacity = source.opacity;\n\t\t\tthis.diffuse.copy(source.diffuse);\n\t\t\tthis.diffuseMap = source.diffuseMap;\n\t\t\tthis.diffuseMapCoord = source.diffuseMapCoord;\n\t\t\tthis.diffuseMapTransform.copy(source.diffuseMapTransform);\n\t\t\tthis.alphaMap = source.alphaMap;\n\t\t\tthis.alphaMapCoord = source.alphaMapCoord;\n\t\t\tthis.alphaMapTransform.copy(source.alphaMapTransform);\n\t\t\tthis.emissive.copy(source.emissive);\n\t\t\tthis.emissiveMap = source.emissiveMap;\n\t\t\tthis.emissiveMapCoord = source.emissiveMapCoord;\n\t\t\tthis.emissiveMapTransform.copy(source.emissiveMapTransform);\n\t\t\tthis.aoMap = source.aoMap;\n\t\t\tthis.aoMapIntensity = source.aoMapIntensity;\n\t\t\tthis.aoMapCoord = source.aoMapCoord;\n\t\t\tthis.aoMapTransform.copy(source.aoMapTransform);\n\t\t\tthis.normalMap = source.normalMap;\n\t\t\tthis.normalScale.copy(source.normalScale);\n\t\t\tthis.bumpMap = source.bumpMap;\n\t\t\tthis.bumpScale = source.bumpScale;\n\t\t\tthis.envMap = source.envMap;\n\t\t\tthis.envMapIntensity = source.envMapIntensity;\n\t\t\tthis.envMapCombine = source.envMapCombine;\n\t\t\tthis.depthFunc = source.depthFunc;\n\t\t\tthis.depthTest = source.depthTest;\n\t\t\tthis.depthWrite = source.depthWrite;\n\t\t\tthis.colorWrite = source.colorWrite;\n\t\t\tthis.stencilTest = source.stencilTest;\n\t\t\tthis.stencilWriteMask = source.stencilWriteMask;\n\t\t\tthis.stencilFunc = source.stencilFunc;\n\t\t\tthis.stencilRef = source.stencilRef;\n\t\t\tthis.stencilFuncMask = source.stencilFuncMask;\n\t\t\tthis.stencilFail = source.stencilFail;\n\t\t\tthis.stencilZFail = source.stencilZFail;\n\t\t\tthis.stencilZPass = source.stencilZPass;\n\t\t\tthis.stencilFuncBack = source.stencilFuncBack;\n\t\t\tthis.stencilRefBack = source.stencilRefBack;\n\t\t\tthis.stencilFuncMaskBack = source.stencilFuncMaskBack;\n\t\t\tthis.stencilFailBack = source.stencilFailBack;\n\t\t\tthis.stencilZFailBack = source.stencilZFailBack;\n\t\t\tthis.stencilZPassBack = source.stencilZPassBack;\n\t\t\tthis.clippingPlanes = source.clippingPlanes;\n\t\t\tthis.alphaTest = source.alphaTest;\n\t\t\tthis.alphaToCoverage = source.alphaToCoverage;\n\t\t\tthis.side = source.side;\n\t\t\tthis.polygonOffset = source.polygonOffset;\n\t\t\tthis.polygonOffsetFactor = source.polygonOffsetFactor;\n\t\t\tthis.polygonOffsetUnits = source.polygonOffsetUnits;\n\t\t\tthis.shading = source.shading;\n\t\t\tthis.dithering = source.dithering;\n\t\t\tthis.acceptLight = source.acceptLight;\n\t\t\tthis.lightingGroup = source.lightingGroup;\n\t\t\tthis.fog = source.fog;\n\t\t\tthis.drawMode = source.drawMode;\n\t\t\treturn this;\n\t\t}\n\n\t\t/**\n\t\t * Return a new material with the same parameters as this material.\n\t\t * @returns {Material}\n\t\t */\n\t\tclone() {\n\t\t\treturn new this.constructor().copy(this);\n\t\t}\n\n\t\t/**\n\t\t * This disposes the material.\n\t\t * Textures of a material don't get disposed. These needs to be disposed by Texture.\n\t\t */\n\t\tdispose() {\n\t\t\tthis.dispatchEvent({\n\t\t\t\ttype: 'dispose'\n\t\t\t});\n\t\t}\n\t}\n\n\t/**\n\t * A material rendered with custom shaders.\n\t * A shader is a small program written in GLSL that runs on the GPU.\n\t * @extends Material\n\t */\n\tclass ShaderMaterial extends Material {\n\t\t/**\n\t\t * @param {object} shader - Shader object for the shader material.\n\t\t * @param {string} shader.name - Name of the shader.\n\t\t * @param {object} shader.defines - Defines of the shader.\n\t\t * @param {object} shader.uniforms - Uniforms of the shader.\n\t\t * @param {string} shader.vertexShader - Vertex shader GLSL code.\n\t\t * @param {string} shader.fragmentShader - Fragment shader GLSL code.\n\t\t */\n\t\tconstructor(shader) {\n\t\t\tsuper();\n\n\t\t\t// Set values\n\t\t\tif (shader) {\n\t\t\t\tthis.shaderName = shader.name;\n\t\t\t\tObject.assign(this.defines, shader.defines);\n\t\t\t\tthis.uniforms = cloneUniforms(shader.uniforms);\n\t\t\t\tthis.vertexShader = shader.vertexShader;\n\t\t\t\tthis.fragmentShader = shader.fragmentShader;\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Shader post pass.\n\t */\n\tclass ShaderPostPass {\n\t\t/**\n\t\t * @param {object} shader - Shader object for the shader material.\n\t\t * @param {string} shader.name - Name of the shader.\n\t\t * @param {object} shader.defines - Defines of the shader.\n\t\t * @param {object} shader.uniforms - Uniforms of the shader.\n\t\t * @param {string} shader.vertexShader - Vertex shader GLSL code.\n\t\t * @param {string} shader.fragmentShader - Fragment shader GLSL code.\n\t\t */\n\t\tconstructor(shader) {\n\t\t\tconst scene = new Scene();\n\t\t\tconst camera = this.camera = new Camera();\n\t\t\tcamera.frustumCulled = false;\n\t\t\tcamera.position.set(0, 0, 1);\n\t\t\tcamera.lookAt(new Vector3(0, 0, 0), new Vector3(0, 1, 0));\n\t\t\tcamera.setOrtho(-1, 1, -1, 1, 0.1, 2);\n\t\t\tscene.add(camera);\n\t\t\tconst geometry = this.geometry = new Geometry(); // fullscreen triangle\n\t\t\tgeometry.addAttribute('a_Position', new Attribute(new Buffer(new Float32Array([-1, 3, 0, -1, -1, 0, 3, -1, 0]), 3)));\n\t\t\tgeometry.addAttribute('a_Uv', new Attribute(new Buffer(new Float32Array([0, 2, 0, 0, 2, 0]), 2)));\n\t\t\tconst material = this.material = new ShaderMaterial(shader);\n\t\t\tthis.uniforms = material.uniforms;\n\t\t\tconst plane = new Mesh(geometry, material);\n\t\t\tplane.frustumCulled = false;\n\t\t\tscene.add(plane);\n\n\t\t\t// static scene\n\n\t\t\tscene.updateMatrix();\n\t\t\tthis.renderStates = scene.updateRenderStates(camera);\n\t\t\tconst renderQueue = scene.updateRenderQueue(camera, false, false);\n\t\t\tthis.renderQueueLayer = renderQueue.layerList[0];\n\t\t\tthis.renderConfig = {};\n\t\t}\n\n\t\t/**\n\t\t * Render the post pass.\n\t\t * @param {ThinRenderer} renderer - The renderer.\n\t\t * @param {RenderTarget} renderTarget - The render target.\n\t\t */\n\t\trender(renderer, renderTarget) {\n\t\t\trenderer.beginRender(renderTarget);\n\t\t\trenderer.renderRenderableList(this.renderQueueLayer.opaque, this.renderStates, this.renderConfig);\n\t\t\trenderer.endRender();\n\t\t}\n\n\t\t/**\n\t\t * Dispose the post pass.\n\t\t */\n\t\tdispose() {\n\t\t\tthis.geometry.dispose();\n\t\t\tthis.material.dispose();\n\t\t}\n\t}\n\n\t/**\n\t * A material for drawing geometry by depth.\n\t * Depth is based off of the camera near and far plane. White is nearest, black is farthest.\n\t * @extends Material\n\t */\n\tclass DepthMaterial extends Material {\n\t\t/**\n\t\t * Create a DepthMaterial.\n\t\t */\n\t\tconstructor() {\n\t\t\tsuper();\n\t\t\tthis.type = MATERIAL_TYPE.DEPTH;\n\n\t\t\t/**\n\t\t\t * Encoding for depth packing.\n\t\t\t * @type {boolean}\n\t\t\t * @default false\n\t\t\t */\n\t\t\tthis.packToRGBA = false;\n\t\t}\n\t}\n\n\t/**\n\t * A material for drawing geometry by distance.\n\t * @extends Material\n\t */\n\tclass DistanceMaterial extends Material {\n\t\t/**\n\t\t * Create a DistanceMaterial.\n\t\t */\n\t\tconstructor() {\n\t\t\tsuper();\n\t\t\tthis.type = MATERIAL_TYPE.DISTANCE;\n\t\t}\n\t}\n\n\t/**\n\t * Shadow map pass.\n\t */\n\tclass ShadowMapPass {\n\t\tconstructor() {\n\t\t\t/**\n\t\t\t * Get depth material function.\n\t\t\t * Override this to use custom depth material.\n\t\t\t * @type {Function}\n\t\t\t */\n\t\t\tthis.getDepthMaterial = _getDepthMaterial;\n\n\t\t\t/**\n\t\t\t * Get distance material function.\n\t\t\t * Override this to use custom distance material.\n\t\t\t * @type {Function}\n\t\t\t */\n\t\t\tthis.getDistanceMaterial = _getDistanceMaterial;\n\n\t\t\t/**\n\t\t\t * Define which render layers will produce shadows.\n\t\t\t * If the value is Null, it means that all render layers will produce shadows.\n\t\t\t * @type {null | Array}\n\t\t\t * @default null\n\t\t\t */\n\t\t\tthis.shadowLayers = null;\n\n\t\t\t/**\n\t\t\t * Whether transparent objects can cast shadows.\n\t\t\t * @type {boolean}\n\t\t\t * @default false\n\t\t\t */\n\t\t\tthis.transparentShadow = false;\n\t\t\tconst state = {\n\t\t\t\tisPointLight: false,\n\t\t\t\tlight: null\n\t\t\t};\n\t\t\tthis._state = state;\n\t\t\tconst that = this;\n\t\t\tthis._renderOptions = {\n\t\t\t\tgetGeometry: null,\n\t\t\t\tgetMaterial: function (renderable) {\n\t\t\t\t\treturn state.isPointLight ? that.getDistanceMaterial(renderable, state.light) : that.getDepthMaterial(renderable, state.light);\n\t\t\t\t},\n\t\t\t\tifRender: function (renderable) {\n\t\t\t\t\treturn state.light.groupMask & 1 << renderable.material.lightingGroup && renderable.object.castShadow;\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\n\t\t/**\n\t\t * Get geometry function for shadow render options.\n\t\t * @type {null | Function}\n\t\t */\n\t\tset getGeometry(func) {\n\t\t\tif (func) {\n\t\t\t\tthis._renderOptions.getGeometry = func;\n\t\t\t} else {\n\t\t\t\tdelete this._renderOptions.getGeometry;\n\t\t\t}\n\t\t}\n\t\tget getGeometry() {\n\t\t\treturn this._renderOptions.getGeometry;\n\t\t}\n\n\t\t/**\n\t\t * The if render function for shadow render options.\n\t\t * @type {Function}\n\t\t */\n\t\tset ifRender(func) {\n\t\t\tif (func) {\n\t\t\t\tthis._renderOptions.ifRender = func;\n\t\t\t} else {\n\t\t\t\tdelete this._renderOptions.ifRender;\n\t\t\t}\n\t\t}\n\t\tget ifRender() {\n\t\t\treturn this._renderOptions.ifRender;\n\t\t}\n\n\t\t/**\n\t\t * Render shadow map.\n\t\t * @param {ThinRenderer} renderer\n\t\t * @param {Scene} scene\n\t\t */\n\t\trender(renderer, scene) {\n\t\t\t// @deprecated\n\t\t\t// This can be deleted when renderer.setClearColor is completely removed.\n\t\t\toldClearColor.copy(renderer.getClearColor());\n\t\t\tconst lightingData = scene.collector.lightingData;\n\t\t\tconst lightsArray = lightingData.lightsArray;\n\t\t\tconst shadowsNum = lightingData.shadowsNum;\n\t\t\tfor (let i = 0; i < shadowsNum; i++) {\n\t\t\t\tconst light = lightsArray[i];\n\t\t\t\tconst shadow = light.shadow;\n\t\t\t\tif (shadow.autoUpdate === false && shadow.needsUpdate === false) continue;\n\t\t\t\tconst camera = shadow.camera;\n\t\t\t\tconst shadowTarget = shadow.renderTarget;\n\t\t\t\tconst isPointLight = light.isPointLight;\n\t\t\t\tconst faces = isPointLight ? 6 : 1;\n\t\t\t\tthis._state.isPointLight = isPointLight;\n\t\t\t\tthis._state.light = light;\n\t\t\t\tconst renderOptions = this._renderOptions;\n\t\t\t\tshadow.prepareDepthMap(!scene.disableShadowSampler, renderer.capabilities);\n\t\t\t\tfor (let j = 0; j < faces; j++) {\n\t\t\t\t\tif (isPointLight) {\n\t\t\t\t\t\tshadow.update(light, j);\n\t\t\t\t\t\tshadowTarget.activeLayer = j;\n\t\t\t\t\t}\n\t\t\t\t\tshadowTarget.setColorClearValue(1, 1, 1, 1).setClear(true, true, false);\n\t\t\t\t\tconst renderStates = scene.updateRenderStates(camera, j === 0);\n\t\t\t\t\tconst renderQueue = scene.updateRenderQueue(camera, false, false);\n\t\t\t\t\trenderer.beginRender(shadowTarget);\n\t\t\t\t\tfor (let k = 0; k < renderQueue.layerList.length; k++) {\n\t\t\t\t\t\tconst renderQueueLayer = renderQueue.layerList[k];\n\t\t\t\t\t\tif (this.shadowLayers !== null && this.shadowLayers.indexOf(renderQueueLayer.id) === -1) continue;\n\t\t\t\t\t\trenderer.renderRenderableList(renderQueueLayer.opaque, renderStates, renderOptions);\n\t\t\t\t\t\tif (this.transparentShadow) {\n\t\t\t\t\t\t\trenderer.renderRenderableList(renderQueueLayer.transparent, renderStates, renderOptions);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\trenderer.endRender();\n\t\t\t\t}\n\t\t\t\tshadow.needsUpdate = false;\n\t\t\t}\n\n\t\t\t// @deprecated\n\t\t\t// This can be deleted when renderer.setClearColor is completely removed.\n\t\t\trenderer.setClearColor(oldClearColor.x, oldClearColor.y, oldClearColor.z, oldClearColor.w);\n\t\t}\n\t}\n\tconst oldClearColor = new Vector4();\n\tconst shadowSide = {\n\t\t'front': DRAW_SIDE.BACK,\n\t\t'back': DRAW_SIDE.FRONT,\n\t\t'double': DRAW_SIDE.DOUBLE\n\t};\n\tconst depthMaterials = {};\n\tconst distanceMaterials = {};\n\tfunction _getDepthMaterial(renderable, light) {\n\t\tconst useSkinning = !!renderable.object.skeleton;\n\t\tconst useMorphing = renderable.geometry.morphAttributes.position && renderable.geometry.morphAttributes.position.length > 0;\n\t\tconst clippingPlanes = renderable.material.clippingPlanes;\n\t\tconst numClippingPlanes = clippingPlanes && clippingPlanes.length > 0 ? clippingPlanes.length : 0;\n\t\tconst index = useMorphing << 0 | useSkinning << 1;\n\t\tlet materials = depthMaterials[index];\n\t\tif (materials === undefined) {\n\t\t\tmaterials = {};\n\t\t\tdepthMaterials[index] = materials;\n\t\t}\n\t\tlet material = materials[numClippingPlanes];\n\t\tif (material === undefined) {\n\t\t\tmaterial = new DepthMaterial();\n\t\t\tmaterial.packToRGBA = true;\n\t\t\tmaterials[numClippingPlanes] = material;\n\t\t}\n\t\tmaterial.side = shadowSide[renderable.material.side];\n\t\tmaterial.clippingPlanes = renderable.material.clippingPlanes;\n\t\tmaterial.drawMode = renderable.material.drawMode;\n\t\treturn material;\n\t}\n\tfunction _getDistanceMaterial(renderable, light) {\n\t\tconst useSkinning = !!renderable.object.skeleton;\n\t\tconst useMorphing = renderable.geometry.morphAttributes.position && renderable.geometry.morphAttributes.position.length > 0;\n\t\tconst clippingPlanes = renderable.material.clippingPlanes;\n\t\tconst numClippingPlanes = clippingPlanes && clippingPlanes.length > 0 ? clippingPlanes.length : 0;\n\t\tconst index = useMorphing << 0 | useSkinning << 1;\n\t\tlet materials = distanceMaterials[index];\n\t\tif (materials === undefined) {\n\t\t\tmaterials = {};\n\t\t\tdistanceMaterials[index] = materials;\n\t\t}\n\t\tlet material = materials[numClippingPlanes];\n\t\tif (material === undefined) {\n\t\t\tmaterial = new DistanceMaterial();\n\t\t\tmaterials[numClippingPlanes] = material;\n\t\t}\n\t\tmaterial.side = shadowSide[renderable.material.side];\n\t\tmaterial.uniforms['nearDistance'] = light.shadow.cameraNear;\n\t\tmaterial.uniforms['farDistance'] = light.shadow.cameraFar;\n\t\tmaterial.clippingPlanes = renderable.material.clippingPlanes;\n\t\tmaterial.drawMode = renderable.material.drawMode;\n\t\treturn material;\n\t}\n\n\t/**\n\t * PropertyMap is a helper class for storing properties on objects.\n\t * Instead of using a Map, we store the property map directly on the object itself,\n\t * which provides better lookup performance.\n\t * This is generally used to store the gpu resources corresponding to objects.\n\t */\n\tclass PropertyMap {\n\t\t/**\n\t\t * Create a new PropertyMap.\n\t\t * @param {string} prefix - The prefix of the properties name.\n\t\t */\n\t\tconstructor(prefix) {\n\t\t\tthis._key = prefix + '$';\n\t\t\tthis._count = 0;\n\t\t}\n\n\t\t/**\n\t\t * Get the properties of the object.\n\t\t * If the object does not have properties, create a new one.\n\t\t * @param {object} object - The object to get properties.\n\t\t * @returns {object} - The properties of the object.\n\t\t */\n\t\tget(object) {\n\t\t\tconst key = this._key;\n\t\t\tlet properties = object[key];\n\t\t\tif (properties === undefined) {\n\t\t\t\tproperties = {};\n\t\t\t\tobject[key] = properties;\n\t\t\t\tthis._count++;\n\t\t\t}\n\t\t\treturn properties;\n\t\t}\n\n\t\t/**\n\t\t * Delete the properties of the object.\n\t\t * @param {object} object - The object to delete properties.\n\t\t */\n\t\tdelete(object) {\n\t\t\tconst key = this._key;\n\t\t\tconst properties = object[key];\n\t\t\tif (properties) {\n\t\t\t\tthis._count--;\n\t\t\t\tdelete object[key];\n\t\t\t}\n\t\t}\n\n\t\t/**\n\t\t * Get the number of objects that have properties.\n\t\t * @returns {number} - The number of objects that have properties.\n\t\t */\n\t\tsize() {\n\t\t\treturn this._count;\n\t\t}\n\t}\n\n\t/**\n\t * Render info collector.\n\t * If you want to collect information about the rendering of this frame,\n\t * pass an instance of RenderInfo to RenderOption when calling renderRenderableList.\n\t */\n\tclass RenderInfo {\n\t\tconstructor() {\n\t\t\tconst render = {\n\t\t\t\tcalls: 0,\n\t\t\t\ttriangles: 0,\n\t\t\t\tlines: 0,\n\t\t\t\tpoints: 0\n\t\t\t};\n\n\t\t\t// A series of function use for collect information.\n\t\t\tconst updateFuncs = [function updatePoints(instanceCount, count) {\n\t\t\t\trender.points += instanceCount * count;\n\t\t\t}, function updateLines(instanceCount, count) {\n\t\t\t\trender.lines += instanceCount * (count / 2);\n\t\t\t}, function updateLineLoop(instanceCount, count) {\n\t\t\t\trender.lines += instanceCount * count;\n\t\t\t}, function updateLineStrip(instanceCount, count) {\n\t\t\t\trender.lines += instanceCount * (count - 1);\n\t\t\t}, function updateTriangles(instanceCount, count) {\n\t\t\t\trender.triangles += instanceCount * (count / 3);\n\t\t\t}, function updateTriangleStrip(instanceCount, count) {\n\t\t\t\trender.triangles += instanceCount * (count - 2);\n\t\t\t}, function updateTriangleFan(instanceCount, count) {\n\t\t\t\trender.triangles += instanceCount * (count - 2);\n\t\t\t}];\n\n\t\t\t/**\n\t\t\t * Method of update render info.\n\t\t\t * This method will be executed after each draw.\n\t\t\t * @private\n\t\t\t * @param {number} count\n\t\t\t * @param {DRAW_MODE} mode\n\t\t\t * @param {number} instanceCount\n\t\t\t */\n\t\t\tthis.update = function (count, mode, instanceCount) {\n\t\t\t\trender.calls++;\n\t\t\t\tupdateFuncs[mode](instanceCount, count);\n\t\t\t};\n\n\t\t\t/**\n\t\t\t * Reset the render info.\n\t\t\t * Call this method whenever you have finished to render a single frame.\n\t\t\t */\n\t\t\tthis.reset = function () {\n\t\t\t\trender.calls = 0;\n\t\t\t\trender.triangles = 0;\n\t\t\t\trender.lines = 0;\n\t\t\t\trender.points = 0;\n\t\t\t};\n\n\t\t\t/**\n\t\t\t * A series of statistical information of rendering process, include calls, triangles, lines and points.\n\t\t\t * @type {object}\n\t\t\t */\n\t\t\tthis.render = render;\n\t\t}\n\t}\n\n\tlet _rendererId = 0;\n\n\t/**\n\t * Base class for WebGL and WebGPU renderers.\n\t */\n\tclass ThinRenderer {\n\t\tconstructor() {\n\t\t\t/**\n\t\t\t * The unique id of this renderer.\n\t\t\t * This will be incremented when the context is lost and restored.\n\t\t\t * @readonly\n\t\t\t * @type {number}\n\t\t\t */\n\t\t\tthis.id = 0; // assigned in init method\n\n\t\t\t/**\n\t\t\t * The Rendering Context privided by canvas.\n\t\t\t * @type {WebGLRenderingContext|WebGPURenderingContext}\n\t\t\t */\n\t\t\tthis.context = null; // assigned in init method\n\n\t\t\t/**\n\t\t\t * An object containing details about the capabilities of the current RenderingContext.\n\t\t\t * @type {object}\n\t\t\t */\n\t\t\tthis.capabilities = {};\n\n\t\t\t/**\n\t\t\t * The shader compiler options.\n\t\t\t * @type {object}\n\t\t\t * @property {boolean} checkErrors - Whether to use error checking when compiling shaders, defaults to true.\n\t\t\t * @property {boolean} compileAsynchronously - Whether to compile shaders asynchronously, defaults to false.\n\t\t\t * @property {number} maxMaterialPrograms - The maximum number of programs that one material can cache, defaults to 5.\n\t\t\t */\n\t\t\tthis.shaderCompileOptions = {\n\t\t\t\tcheckErrors: true,\n\t\t\t\tcompileAsynchronously: false,\n\t\t\t\tmaxMaterialPrograms: 5\n\t\t\t};\n\n\t\t\t/**\n\t\t\t * The lighting options.\n\t\t\t * @type {object}\n\t\t\t * @property {object} clustered - The clustered lighting options.\n\t\t\t * @property {boolean} clustered.enabled - Whether to use clustered lighting, defaults to false.\n\t\t\t * @property {number} clustered.maxClusterLights - The maximum number of lights, defaults to 1024.\n\t\t\t * @property {boolean} clustered.useFloatPrecision - Whether the lights are stored as floats, defaults to false (half floats).\n\t\t\t * @property {Vector3} clustered.gridDimensions - The number of cells in each dimension, defaults to Vector3(16, 8, 32).\n\t\t\t * @property {number} clustered.maxLightsPerCell - The maximum number of lights per cell, defaults to 256.\n\t\t\t * @property {Vector2} clustered.zClip - The near and far clipping planes for the cells, defaults to Vector2(-1, -1) (clip based on camera near and far planes).\n\t\t\t * @property {number} clustered.version - The version of the clustered lighting options. If the options change, the version should be incremented, defaults to 0.\n\t\t\t */\n\t\t\tthis.lightingOptions = {\n\t\t\t\tclustered: {\n\t\t\t\t\tenabled: false,\n\t\t\t\t\tmaxClusterLights: 1024,\n\t\t\t\t\tuseFloatPrecision: false,\n\t\t\t\t\tgridDimensions: new Vector3(16, 8, 32),\n\t\t\t\t\tmaxLightsPerCell: 256,\n\t\t\t\t\tzClip: new Vector2(-1, -1),\n\t\t\t\t\tversion: 0\n\t\t\t\t}\n\t\t\t};\n\t\t\tthis._passInfo = {\n\t\t\t\t// Whether the renderer is in the process of pass rendering.\n\t\t\t\t// If true, means that the beginRender method has been called but the endRender method has not been called.\n\t\t\t\tenabled: false,\n\t\t\t\t// The pass rendering count\n\t\t\t\tcount: 0\n\t\t\t};\n\t\t}\n\n\t\t/**\n\t\t * Initialize this renderer with a rendering context.\n\t\t * This method is called automatically by {@link WebGLRenderer} constructor when a context is provided.\n\t\t * For WebGPURenderer, you must call this method manually and wait for the promise to resolve.\n\t\t * @param {WebGLRenderingContext|WebGPURenderingContext} context - The rendering context.\n\t\t * @param {object} [options] - The options for initializing this renderer.\n\t\t * @returns {Promise<ThinRenderer>} A promise that resolves when initialization completes.\n\t\t */\n\t\tinit(context, options = {}) {}\n\n\t\t/**\n\t\t * Begin rendering.\n\t\t * @param {RenderTargetBase} renderTarget - The render target to render to.\n\t\t */\n\t\tbeginRender(renderTarget) {\n\t\t\tthis._passInfo.enabled = true;\n\t\t}\n\n\t\t/**\n\t\t * End rendering.\n\t\t */\n\t\tendRender() {\n\t\t\tthis._passInfo.enabled = false;\n\t\t\tthis._passInfo.count++;\n\t\t}\n\n\t\t/**\n\t\t * @typedef {object} RenderOptions - The render options for renderRenderableItem and renderRenderableList methods.\n\t\t * @property {Function} getGeometry - (Optional) Get renderable geometry.\n\t\t * @property {Function} getMaterial - (Optional) Get renderable material.\n\t\t * @property {Function} beforeRender - (Optional) Before render each renderable item.\n\t\t * @property {Function} afterRender - (Optional) After render each renderable item.\n\t\t * @property {Function} ifRender - (Optional) If render the renderable item.\n\t\t * @property {RenderInfo} renderInfo - (Optional) Render info for collect information.\n\t\t * @property {boolean} onlyCompile - (Optional) Only compile shader, do not render.\n\t\t */\n\n\t\t/**\n\t\t * Render a single renderable item with render states.\n\t\t * @param {object} renderable - The renderable item.\n\t\t * @param {RenderStates} renderStates - The render states.\n\t\t * @param {RenderOptions} [options] - The render options for this render task.\n\t\t */\n\t\trenderRenderableItem(renderable, renderStates, options) {}\n\n\t\t/**\n\t\t * Render a single renderable list with render states.\n\t\t * @param {Array} renderables - Array of renderable.\n\t\t * @param {RenderStates} renderStates - Render states.\n\t\t * @param {RenderOptions} [options] - The render options for this render task.\n\t\t */\n\t\trenderRenderableList(renderables, renderStates, options = {}) {\n\t\t\tfor (let i = 0, l = renderables.length; i < l; i++) {\n\t\t\t\tthis.renderRenderableItem(renderables[i], renderStates, options);\n\t\t\t}\n\t\t}\n\n\t\t/**\n\t\t * Render a scene with a particular camera.\n\t\t * This method will render all layers in scene's RenderQueue by default.\n\t\t * If you need a customized rendering process, it is recommended to use renderRenderableList method.\n\t\t * @param {Scene} scene - The scene to render.\n\t\t * @param {Camera} camera - The camera used to render the scene.\n\t\t * @param {RenderTargetBase} renderTarget - The render target to render to.\n\t\t * @param {RenderOptions} [options] - The render options for this scene render task.\n\t\t */\n\t\trenderScene(scene, camera, renderTarget, options = {}) {\n\t\t\t// Compatibility handling: if there are only 3 arguments,\n\t\t\t// and the third is not a RenderTarget, treat it as options.\n\t\t\tif (arguments.length === 3 && (!renderTarget || !renderTarget.isRenderTarget)) {\n\t\t\t\toptions = renderTarget;\n\t\t\t\trenderTarget = null;\n\t\t\t}\n\t\t\tconst renderStates = scene.getRenderStates(camera);\n\t\t\tconst renderQueue = scene.getRenderQueue(camera);\n\t\t\tthis.beginRender(renderTarget);\n\t\t\tlet renderQueueLayer;\n\t\t\tfor (let i = 0, l = renderQueue.layerList.length; i < l; i++) {\n\t\t\t\trenderQueueLayer = renderQueue.layerList[i];\n\t\t\t\tthis.renderRenderableList(renderQueueLayer.opaque, renderStates, options);\n\t\t\t\tthis.renderRenderableList(renderQueueLayer.transparent, renderStates, options);\n\t\t\t}\n\t\t\tthis.endRender();\n\t\t}\n\n\t\t/**\n\t\t * Copy a frame buffer to another.\n\t\t * This copy process can be used to perform multi-sampling (MSAA).\n\t\t * @param {RenderTargetBase} read - The source renderTarget.\n\t\t * @param {RenderTargetBase} draw - The destination renderTarget.\n\t\t * @param {boolean} [color=true] - Copy color buffer.\n\t\t * @param {boolean} [depth=true] - Copy depth buffer.\n\t\t * @param {boolean} [stencil=true] - Copy stencil buffer.\n\t\t */\n\t\tblitRenderTarget(read, draw, color = true, depth = true, stencil = true) {}\n\n\t\t/**\n\t\t * Generate mipmaps for the texture you pass in.\n\t\t * @param {TextureBase} texture - The texture to update.\n\t\t */\n\t\tgenerateMipmaps(texture) {}\n\n\t\t/**\n\t\t * Read pixels from a texture.\n\t\t * This is an asynchronous operation. See {@link ThinRenderer#readTexturePixelsSync} for the synchronous version.\n\t\t * @param {TextureBase} texture - The texture to read from.\n\t\t * @param {number} x - The x coordinate of the rectangle to read from.\n\t\t * @param {number} y - The y coordinate of the rectangle to read from.\n\t\t * @param {number} width - The width of the rectangle to read from.\n\t\t * @param {number} height - The height of the rectangle to read from.\n\t\t * @param {TypedArray} buffer - The buffer to store the pixel data.\n\t\t * @param {number} [zIndex=0] - For CubeTexture, the face index; for Texture3D/TextureArray, the layer/slice index.\n\t\t * @param {number} [mipLevel=0] - The mip level to read.\n\t\t * @returns {Promise<TypedArray>} A promise that resolves with the passed in buffer after it has been filled with the pixel data.\n\t\t */\n\t\treadTexturePixels(texture, x, y, width, height, buffer, zIndex = 0, mipLevel = 0) {}\n\n\t\t/**\n\t\t * Read pixels from a texture.\n\t\t * This is a synchronous operation. See {@link ThinRenderer#readTexturePixels} for the asynchronous version.\n\t\t * @param {TextureBase} texture - The texture to read from.\n\t\t * @param {number} x - The x coordinate of the rectangle to read from.\n\t\t * @param {number} y - The y coordinate of the rectangle to read from.\n\t\t * @param {number} width - The width of the rectangle to read from.\n\t\t * @param {number} height - The height of the rectangle to read from.\n\t\t * @param {TypedArray} buffer - The buffer to store the pixel data.\n\t\t * @param {number} [zIndex=0] - For CubeTexture, the face index; for Texture3D/TextureArray, the layer/slice index.\n\t\t * @param {number} [mipLevel=0] - The mip level to read.\n\t\t * @returns {TypedArray} The passed in buffer after it has been filled with the pixel data.\n\t\t */\n\t\treadTexturePixelsSync(texture, x, y, width, height, buffer, zIndex = 0, mipLevel = 0) {}\n\n\t\t/**\n\t\t * Reset vertex array object bindings.\n\t\t * @param {boolean} [force=false] - Whether clear the current vertex array object.\n\t\t */\n\t\tresetVertexArrayBindings(force) {}\n\n\t\t/**\n\t\t * Reset all render states cached in this renderer.\n\t\t * This is useful when you use multiple renderers in one application.\n\t\t */\n\t\tresetState() {}\n\n\t\t/**\n\t\t * Begin an occlusion query.\n\t\t * @param {number} index - The query index in the current occlusion query set.\n\t\t */\n\t\tbeginOcclusionQuery(index) {}\n\n\t\t/**\n\t\t * End the current occlusion query.\n\t\t */\n\t\tendOcclusionQuery() {}\n\n\t\t/**\n\t\t * Read back the results of a query set.\n\t\t * This is an asynchronous operation.\n\t\t * @param {QuerySet} querySet - The query set to read from.\n\t\t * @param {Array|TypedArray} dstBuffer - The buffer to store the results.\n\t\t * @param {number} [firstQuery=0] - The first query index to read.\n\t\t * @param {number} [queryCount=querySet.count] - The number of queries to read.\n\t\t * @returns {Promise<Array|TypedArray>} A promise that resolves with the passed in buffer after it has been filled with the results.\n\t\t */\n\t\treadQuerySetResults(querySet, dstBuffer, firstQuery = 0, queryCount = querySet.count) {}\n\n\t\t/**\n\t\t * Used for context lost and restored.\n\t\t * @protected\n\t\t * @returns {number}\n\t\t */\n\t\tincreaseId() {\n\t\t\tthis.id = _rendererId++;\n\t\t\treturn this.id;\n\t\t}\n\t}\n\n\t/**\n\t * Linear fog.\n\t */\n\tclass Fog {\n\t\t/**\n\t\t * @param {number} [color=0x000000] - The color of the fog.\n\t\t * @param {number} [near=1] - The near clip of the fog.\n\t\t * @param {number} [far=1000] - The far clip of the fog.\n\t\t */\n\t\tconstructor(color = 0x000000, near = 1, far = 1000) {\n\t\t\t/**\n\t\t\t * The color of the fog.\n\t\t\t * @type {Color3}\n\t\t\t * @default Color3(0x000000)\n\t\t\t */\n\t\t\tthis.color = new Color3(color);\n\n\t\t\t/**\n\t\t\t * The near clip of the fog.\n\t\t\t * @type {number}\n\t\t\t * @default 1\n\t\t\t */\n\t\t\tthis.near = near;\n\n\t\t\t/**\n\t\t\t * The far clip of the fog.\n\t\t\t * @type {number}\n\t\t\t * @default 1000\n\t\t\t */\n\t\t\tthis.far = far;\n\t\t}\n\t}\n\n\t/**\n\t * This flag can be used for type testing.\n\t * @readonly\n\t * @type {boolean}\n\t * @default true\n\t */\n\tFog.prototype.isFog = true;\n\n\t/**\n\t * Exp2 fog.\n\t */\n\tclass FogExp2 {\n\t\t/**\n\t\t * @param {number} [color=0x000000] - The color of the fog.\n\t\t * @param {number} [density=0.00025] - The density of the exp2 fog.\n\t\t */\n\t\tconstructor(color = 0x000000, density = 0.00025) {\n\t\t\t/**\n\t\t\t * The color of the fog.\n\t\t\t * @type {Color3}\n\t\t\t * @default Color3(0x000000)\n\t\t\t */\n\t\t\tthis.color = new Color3(color);\n\n\t\t\t/**\n\t\t\t * The density of the exp2 fog.\n\t\t\t * @type {number}\n\t\t\t * @default 0.00025\n\t\t\t */\n\t\t\tthis.density = density;\n\t\t}\n\t}\n\n\t/**\n\t * This flag can be used for type testing.\n\t * @readonly\n\t * @type {boolean}\n\t * @default true\n\t */\n\tFogExp2.prototype.isFogExp2 = true;\n\n\t/**\n\t * BoxGeometry is the quadrilateral primitive geometry class.\n\t * It is typically used for creating a cube or irregular quadrilateral of the dimensions provided with the 'width', 'height', and 'depth' constructor arguments.\n\t * @extends Geometry\n\t */\n\tclass BoxGeometry extends Geometry {\n\t\t/**\n\t\t * @param {number} [width=1] - Width of the sides on the X axis.\n\t\t * @param {number} [height=1] - Height of the sides on the Y axis.\n\t\t * @param {number} [depth=1] - Depth of the sides on the Z axis.\n\t\t * @param {number} [widthSegments=1] - Number of segmented faces along the width of the sides.\n\t\t * @param {number} [heightSegments=1] - Number of segmented faces along the height of the sides.\n\t\t * @param {number} [depthSegments=1] - Number of segmented faces along the depth of the sides.\n\t\t */\n\t\tconstructor(width = 1, height = 1, depth = 1, widthSegments = 1, heightSegments = 1, depthSegments = 1) {\n\t\t\tsuper();\n\t\t\tconst scope = this;\n\n\t\t\t// segments\n\n\t\t\twidthSegments = Math.floor(widthSegments);\n\t\t\theightSegments = Math.floor(heightSegments);\n\t\t\tdepthSegments = Math.floor(depthSegments);\n\n\t\t\t// buffers\n\n\t\t\tconst indices = [];\n\t\t\tconst vertices = [];\n\t\t\tconst normals = [];\n\t\t\tconst uvs = [];\n\n\t\t\t// helper variables\n\n\t\t\tlet numberOfVertices = 0;\n\t\t\tlet groupStart = 0;\n\n\t\t\t// build each side of the box geometry\n\n\t\t\tbuildPlane('z', 'y', 'x', -1, -1, depth, height, width, depthSegments, heightSegments, 0); // px\n\t\t\tbuildPlane('z', 'y', 'x', 1, -1, depth, height, -width, depthSegments, heightSegments, 1); // nx\n\t\t\tbuildPlane('x', 'z', 'y', 1, 1, width, depth, height, widthSegments, depthSegments, 2); // py\n\t\t\tbuildPlane('x', 'z', 'y', 1, -1, width, depth, -height, widthSegments, depthSegments, 3); // ny\n\t\t\tbuildPlane('x', 'y', 'z', 1, -1, width, height, depth, widthSegments, heightSegments, 4); // pz\n\t\t\tbuildPlane('x', 'y', 'z', -1, -1, width, height, -depth, widthSegments, heightSegments, 5); // nz\n\n\t\t\t// build geometry\n\n\t\t\tthis.setIndex(new Attribute(new Buffer(vertices.length / 3 > 65536 ? new Uint32Array(indices) : new Uint16Array(indices), 1)));\n\t\t\tthis.addAttribute('a_Position', new Attribute(new Buffer(new Float32Array(vertices), 3)));\n\t\t\tthis.addAttribute('a_Normal', new Attribute(new Buffer(new Float32Array(normals), 3)));\n\t\t\tthis.addAttribute('a_Uv', new Attribute(new Buffer(new Float32Array(uvs), 2)));\n\t\t\tfunction buildPlane(u, v, w, udir, vdir, width, height, depth, gridX, gridY, materialIndex) {\n\t\t\t\tconst segmentWidth = width / gridX;\n\t\t\t\tconst segmentHeight = height / gridY;\n\t\t\t\tconst widthHalf = width / 2;\n\t\t\t\tconst heightHalf = height / 2;\n\t\t\t\tconst depthHalf = depth / 2;\n\t\t\t\tconst gridX1 = gridX + 1;\n\t\t\t\tconst gridY1 = gridY + 1;\n\t\t\t\tlet vertexCounter = 0;\n\t\t\t\tlet groupCount = 0;\n\t\t\t\tconst vector = new Vector3();\n\n\t\t\t\t// generate vertices, normals and uvs\n\n\t\t\t\tfor (let iy = 0; iy < gridY1; iy++) {\n\t\t\t\t\tconst y = iy * segmentHeight - heightHalf;\n\t\t\t\t\tfor (let ix = 0; ix < gridX1; ix++) {\n\t\t\t\t\t\tconst x = ix * segmentWidth - widthHalf;\n\n\t\t\t\t\t\t// set values to correct vector component\n\n\t\t\t\t\t\tvector[u] = x * udir;\n\t\t\t\t\t\tvector[v] = y * vdir;\n\t\t\t\t\t\tvector[w] = depthHalf;\n\n\t\t\t\t\t\t// now apply vector to vertex buffer\n\n\t\t\t\t\t\tvertices.push(vector.x, vector.y, vector.z);\n\n\t\t\t\t\t\t// set values to correct vector component\n\n\t\t\t\t\t\tvector[u] = 0;\n\t\t\t\t\t\tvector[v] = 0;\n\t\t\t\t\t\tvector[w] = depth > 0 ? 1 : -1;\n\n\t\t\t\t\t\t// now apply vector to normal buffer\n\n\t\t\t\t\t\tnormals.push(vector.x, vector.y, vector.z);\n\n\t\t\t\t\t\t// uvs\n\n\t\t\t\t\t\tuvs.push(ix / gridX);\n\t\t\t\t\t\tuvs.push(1 - iy / gridY);\n\n\t\t\t\t\t\t// counters\n\n\t\t\t\t\t\tvertexCounter += 1;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// indices\n\n\t\t\t\t// 1. you need three indices to draw a single face\n\t\t\t\t// 2. a single segment consists of two faces\n\t\t\t\t// 3. so we need to generate six (2*3) indices per segment\n\n\t\t\t\tfor (let iy = 0; iy < gridY; iy++) {\n\t\t\t\t\tfor (let ix = 0; ix < gridX; ix++) {\n\t\t\t\t\t\tconst a = numberOfVertices + ix + gridX1 * iy;\n\t\t\t\t\t\tconst b = numberOfVertices + ix + gridX1 * (iy + 1);\n\t\t\t\t\t\tconst c = numberOfVertices + (ix + 1) + gridX1 * (iy + 1);\n\t\t\t\t\t\tconst d = numberOfVertices + (ix + 1) + gridX1 * iy;\n\n\t\t\t\t\t\t// faces\n\n\t\t\t\t\t\tindices.push(a, b, d);\n\t\t\t\t\t\tindices.push(b, c, d);\n\n\t\t\t\t\t\t// increase counter\n\n\t\t\t\t\t\tgroupCount += 6;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// add a group to the geometry. this will ensure multi material support\n\n\t\t\t\tscope.addGroup(groupStart, groupCount, materialIndex);\n\n\t\t\t\t// calculate new start value for groups\n\n\t\t\t\tgroupStart += groupCount;\n\n\t\t\t\t// update total number of vertices\n\n\t\t\t\tnumberOfVertices += vertexCounter;\n\t\t\t}\n\t\t\tthis.computeBoundingBox();\n\t\t\tthis.computeBoundingSphere();\n\t\t}\n\t}\n\n\t/**\n\t * A class for generating cylinder geometries.\n\t * @extends Geometry\n\t */\n\tclass CylinderGeometry extends Geometry {\n\t\t/**\n\t\t * @param {number} [radiusTop=1] — Radius of the cylinder at the top.\n\t\t * @param {number} [radiusBottom=1] — Radius of the cylinder at the bottom.\n\t\t * @param {number} [height=1] — Height of the cylinder.\n\t\t * @param {number} [radialSegments=8] — Number of segmented faces around the circumference of the cylinder.\n\t\t * @param {number} [heightSegments=1] — Number of rows of faces along the height of the cylinder.\n\t\t * @param {number} [openEnded=false] — A Boolean indicating whether the ends of the cylinder are open or capped. Default is false, meaning capped.\n\t\t * @param {number} [thetaStart=0] — Start angle for first segment, default = 0 (three o'clock position).\n\t\t * @param {number} [thetaLength=2*Pi] — The central angle, often called theta, of the circular sector. The default is 2*Pi, which makes for a complete cylinder.\n\t\t */\n\t\tconstructor(radiusTop = 1, radiusBottom = 1, height = 1, radialSegments = 8, heightSegments = 1, openEnded = false, thetaStart = 0, thetaLength = Math.PI * 2) {\n\t\t\tsuper();\n\t\t\tconst scope = this;\n\t\t\tradialSegments = Math.floor(radialSegments);\n\t\t\theightSegments = Math.floor(heightSegments);\n\n\t\t\t// buffers\n\n\t\t\tconst indices = [];\n\t\t\tconst vertices = [];\n\t\t\tconst normals = [];\n\t\t\tconst uvs = [];\n\n\t\t\t// helper variables\n\n\t\t\tlet index = 0;\n\t\t\tconst indexArray = [];\n\t\t\tconst halfHeight = height / 2;\n\t\t\tlet groupStart = 0;\n\n\t\t\t// generate geometry\n\n\t\t\tgenerateTorso();\n\t\t\tif (openEnded === false) {\n\t\t\t\tif (radiusTop > 0) generateCap(true);\n\t\t\t\tif (radiusBottom > 0) generateCap(false);\n\t\t\t}\n\n\t\t\t// build geometry\n\n\t\t\tthis.setIndex(new Attribute(new Buffer(vertices.length / 3 > 65536 ? new Uint32Array(indices) : new Uint16Array(indices), 1)));\n\t\t\tthis.addAttribute('a_Position', new Attribute(new Buffer(new Float32Array(vertices), 3)));\n\t\t\tthis.addAttribute('a_Normal', new Attribute(new Buffer(new Float32Array(normals), 3)));\n\t\t\tthis.addAttribute('a_Uv', new Attribute(new Buffer(new Float32Array(uvs), 2)));\n\t\t\tfunction generateTorso() {\n\t\t\t\tconst normal = new Vector3();\n\t\t\t\tconst vertex = new Vector3();\n\t\t\t\tlet groupCount = 0;\n\t\t\t\tlet x, y;\n\n\t\t\t\t// this will be used to calculate the normal\n\t\t\t\tconst slope = (radiusBottom - radiusTop) / height;\n\n\t\t\t\t// generate vertices, normals and uvs\n\n\t\t\t\tfor (y = 0; y <= heightSegments; y++) {\n\t\t\t\t\tconst indexRow = [];\n\t\t\t\t\tconst v = y / heightSegments;\n\n\t\t\t\t\t// calculate the radius of the current row\n\n\t\t\t\t\tconst radius = v * (radiusBottom - radiusTop) + radiusTop;\n\t\t\t\t\tfor (x = 0; x <= radialSegments; x++) {\n\t\t\t\t\t\tconst u = x / radialSegments;\n\t\t\t\t\t\tconst theta = u * thetaLength + thetaStart;\n\t\t\t\t\t\tconst sinTheta = Math.sin(theta);\n\t\t\t\t\t\tconst cosTheta = Math.cos(theta);\n\n\t\t\t\t\t\t// vertex\n\n\t\t\t\t\t\tvertex.x = radius * sinTheta;\n\t\t\t\t\t\tvertex.y = -v * height + halfHeight;\n\t\t\t\t\t\tvertex.z = radius * cosTheta;\n\t\t\t\t\t\tvertices.push(vertex.x, vertex.y, vertex.z);\n\n\t\t\t\t\t\t// normal\n\n\t\t\t\t\t\tnormal.set(sinTheta, slope, cosTheta).normalize();\n\t\t\t\t\t\tnormals.push(normal.x, normal.y, normal.z);\n\n\t\t\t\t\t\t// uv\n\n\t\t\t\t\t\tuvs.push(u, 1 - v);\n\n\t\t\t\t\t\t// save index of vertex in respective row\n\n\t\t\t\t\t\tindexRow.push(index++);\n\t\t\t\t\t}\n\n\t\t\t\t\t// now save vertices of the row in our index array\n\n\t\t\t\t\tindexArray.push(indexRow);\n\t\t\t\t}\n\n\t\t\t\t// generate indices\n\n\t\t\t\tfor (x = 0; x < radialSegments; x++) {\n\t\t\t\t\tfor (y = 0; y < heightSegments; y++) {\n\t\t\t\t\t\t// we use the index array to access the correct indices\n\n\t\t\t\t\t\tconst a = indexArray[y][x];\n\t\t\t\t\t\tconst b = indexArray[y + 1][x];\n\t\t\t\t\t\tconst c = indexArray[y + 1][x + 1];\n\t\t\t\t\t\tconst d = indexArray[y][x + 1];\n\n\t\t\t\t\t\t// faces\n\n\t\t\t\t\t\tif (radiusTop > 0 || y !== 0) {\n\t\t\t\t\t\t\tindices.push(a, b, d);\n\t\t\t\t\t\t\tgroupCount += 3;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (radiusBottom > 0 || y !== heightSegments - 1) {\n\t\t\t\t\t\t\tindices.push(b, c, d);\n\t\t\t\t\t\t\tgroupCount += 3;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// add a group to the geometry. this will ensure multi material support\n\n\t\t\t\tscope.addGroup(groupStart, groupCount, 0);\n\n\t\t\t\t// calculate new start value for groups\n\n\t\t\t\tgroupStart += groupCount;\n\t\t\t}\n\t\t\tfunction generateCap(top) {\n\t\t\t\t// save the index of the first center vertex\n\t\t\t\tconst centerIndexStart = index;\n\t\t\t\tconst uv = new Vector2();\n\t\t\t\tconst vertex = new Vector3();\n\t\t\t\tlet groupCount = 0;\n\t\t\t\tlet x;\n\t\t\t\tconst radius = top === true ? radiusTop : radiusBottom;\n\t\t\t\tconst sign = top === true ? 1 : -1;\n\n\t\t\t\t// first we generate the center vertex data of the cap.\n\t\t\t\t// because the geometry needs one set of uvs per face,\n\t\t\t\t// we must generate a center vertex per face/segment\n\n\t\t\t\tfor (x = 1; x <= radialSegments; x++) {\n\t\t\t\t\t// vertex\n\n\t\t\t\t\tvertices.push(0, halfHeight * sign, 0);\n\n\t\t\t\t\t// normal\n\n\t\t\t\t\tnormals.push(0, sign, 0);\n\n\t\t\t\t\t// uv\n\n\t\t\t\t\tuvs.push(0.5, 0.5);\n\n\t\t\t\t\t// increase index\n\n\t\t\t\t\tindex++;\n\t\t\t\t}\n\n\t\t\t\t// save the index of the last center vertex\n\t\t\t\tconst centerIndexEnd = index;\n\n\t\t\t\t// now we generate the surrounding vertices, normals and uvs\n\n\t\t\t\tfor (x = 0; x <= radialSegments; x++) {\n\t\t\t\t\tconst u = x / radialSegments;\n\t\t\t\t\tconst theta = u * thetaLength + thetaStart;\n\t\t\t\t\tconst cosTheta = Math.cos(theta);\n\t\t\t\t\tconst sinTheta = Math.sin(theta);\n\n\t\t\t\t\t// vertex\n\n\t\t\t\t\tvertex.x = radius * sinTheta;\n\t\t\t\t\tvertex.y = halfHeight * sign;\n\t\t\t\t\tvertex.z = radius * cosTheta;\n\t\t\t\t\tvertices.push(vertex.x, vertex.y, vertex.z);\n\n\t\t\t\t\t// normal\n\n\t\t\t\t\tnormals.push(0, sign, 0);\n\n\t\t\t\t\t// uv\n\n\t\t\t\t\tuv.x = cosTheta * 0.5 + 0.5;\n\t\t\t\t\tuv.y = sinTheta * 0.5 * sign + 0.5;\n\t\t\t\t\tuvs.push(uv.x, uv.y);\n\n\t\t\t\t\t// increase index\n\n\t\t\t\t\tindex++;\n\t\t\t\t}\n\n\t\t\t\t// generate indices\n\n\t\t\t\tfor (x = 0; x < radialSegments; x++) {\n\t\t\t\t\tconst c = centerIndexStart + x;\n\t\t\t\t\tconst i = centerIndexEnd + x;\n\t\t\t\t\tif (top === true) {\n\t\t\t\t\t\t// face top\n\t\t\t\t\t\tindices.push(i, i + 1, c);\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// face bottom\n\t\t\t\t\t\tindices.push(i + 1, i, c);\n\t\t\t\t\t}\n\t\t\t\t\tgroupCount += 3;\n\t\t\t\t}\n\n\t\t\t\t// add a group to the geometry. this will ensure multi material support\n\n\t\t\t\tscope.addGroup(groupStart, groupCount, top === true ? 1 : 2);\n\n\t\t\t\t// calculate new start value for groups\n\n\t\t\t\tgroupStart += groupCount;\n\t\t\t}\n\t\t\tthis.computeBoundingBox();\n\t\t\tthis.computeBoundingSphere();\n\t\t}\n\t}\n\n\t/**\n\t * A class for generating plane geometries.\n\t * @extends Geometry\n\t */\n\tclass PlaneGeometry extends Geometry {\n\t\t/**\n\t\t * @param {number} [width=1] — Width along the X axis.\n\t\t * @param {number} [height=1] — Height along the Y axis.\n\t\t * @param {number} [widthSegments=1]\n\t\t * @param {number} [heightSegments=1]\n\t\t */\n\t\tconstructor(width = 1, height = 1, widthSegments = 1, heightSegments = 1) {\n\t\t\tsuper();\n\t\t\tconst width_half = width / 2;\n\t\t\tconst height_half = height / 2;\n\t\t\tconst gridX = Math.floor(widthSegments);\n\t\t\tconst gridY = Math.floor(heightSegments);\n\t\t\tconst gridX1 = gridX + 1;\n\t\t\tconst gridY1 = gridY + 1;\n\t\t\tconst segment_width = width / gridX;\n\t\t\tconst segment_height = height / gridY;\n\t\t\tlet ix, iy;\n\n\t\t\t// buffers\n\n\t\t\tconst indices = [];\n\t\t\tconst vertices = [];\n\t\t\tconst normals = [];\n\t\t\tconst uvs = [];\n\n\t\t\t// generate vertices, normals and uvs\n\n\t\t\tfor (iy = 0; iy < gridY1; iy++) {\n\t\t\t\tconst y = iy * segment_height - height_half;\n\t\t\t\tfor (ix = 0; ix < gridX1; ix++) {\n\t\t\t\t\tconst x = ix * segment_width - width_half;\n\t\t\t\t\tvertices.push(x, 0, y);\n\t\t\t\t\tnormals.push(0, 1, 0);\n\t\t\t\t\tuvs.push(ix / gridX);\n\t\t\t\t\tuvs.push(1 - iy / gridY);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// indices\n\n\t\t\tfor (iy = 0; iy < gridY; iy++) {\n\t\t\t\tfor (ix = 0; ix < gridX; ix++) {\n\t\t\t\t\tconst a = ix + gridX1 * iy;\n\t\t\t\t\tconst b = ix + gridX1 * (iy + 1);\n\t\t\t\t\tconst c = ix + 1 + gridX1 * (iy + 1);\n\t\t\t\t\tconst d = ix + 1 + gridX1 * iy;\n\n\t\t\t\t\t// faces\n\n\t\t\t\t\tindices.push(a, b, d);\n\t\t\t\t\tindices.push(b, c, d);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// build geometry\n\n\t\t\tthis.setIndex(new Attribute(new Buffer(vertices.length / 3 > 65536 ? new Uint32Array(indices) : new Uint16Array(indices), 1)));\n\t\t\tthis.addAttribute('a_Position', new Attribute(new Buffer(new Float32Array(vertices), 3)));\n\t\t\tthis.addAttribute('a_Normal', new Attribute(new Buffer(new Float32Array(normals), 3)));\n\t\t\tthis.addAttribute('a_Uv', new Attribute(new Buffer(new Float32Array(uvs), 2)));\n\t\t\tthis.computeBoundingBox();\n\t\t\tthis.computeBoundingSphere();\n\t\t}\n\t}\n\n\t/**\n\t * A class for generating sphere geometries.\n\t * The geometry is created by sweeping and calculating vertexes around the Y axis (horizontal sweep) and the Z axis (vertical sweep).\n\t * Thus, incomplete spheres (akin to 'sphere slices') can be created through the use of different values of phiStart, phiLength, thetaStart and thetaLength, in order to define the points in which we start (or end) calculating those vertices.\n\t * @extends Geometry\n\t */\n\tclass SphereGeometry extends Geometry {\n\t\t/**\n\t\t * @param {number} [radius=1] — sphere radius. Default is 1.\n\t\t * @param {number} [widthSegments=8] — number of horizontal segments. Minimum value is 3, and the default is 8.\n\t\t * @param {number} [heightSegments=6] — number of vertical segments. Minimum value is 2, and the default is 6.\n\t\t * @param {number} [phiStart=0] — specify horizontal starting angle. Default is 0.\n\t\t * @param {number} [phiLength=Math.PI*2] — specify horizontal sweep angle size. Default is Math.PI * 2.\n\t\t * @param {number} [thetaStart=0] — specify vertical starting angle. Default is 0.\n\t\t * @param {number} [thetaLength=Math.PI] — specify vertical sweep angle size. Default is Math.PI.\n\t\t */\n\t\tconstructor(radius = 1, widthSegments = 8, heightSegments = 6, phiStart = 0, phiLength = Math.PI * 2, thetaStart = 0, thetaLength = Math.PI) {\n\t\t\tsuper();\n\t\t\twidthSegments = Math.max(3, Math.floor(widthSegments));\n\t\t\theightSegments = Math.max(2, Math.floor(heightSegments));\n\t\t\tconst thetaEnd = thetaStart + thetaLength;\n\t\t\tlet ix, iy;\n\t\t\tlet index = 0;\n\t\t\tconst grid = [];\n\t\t\tconst vertex = new Vector3();\n\t\t\tconst normal = new Vector3();\n\n\t\t\t// buffers\n\n\t\t\tconst indices = [];\n\t\t\tconst vertices = [];\n\t\t\tconst normals = [];\n\t\t\tconst uvs = [];\n\n\t\t\t// generate vertices, normals and uvs\n\n\t\t\tfor (iy = 0; iy <= heightSegments; iy++) {\n\t\t\t\tconst verticesRow = [];\n\t\t\t\tconst v = iy / heightSegments;\n\n\t\t\t\t// special case for the poles\n\t\t\t\t// https://github.com/mrdoob/three.js/pull/16043\n\n\t\t\t\tlet uOffset = 0;\n\t\t\t\tif (iy == 0 && thetaStart == 0) {\n\t\t\t\t\tuOffset = 0.5 / widthSegments;\n\t\t\t\t} else if (iy == heightSegments && thetaEnd == Math.PI) {\n\t\t\t\t\tuOffset = -0.5 / widthSegments;\n\t\t\t\t}\n\t\t\t\tfor (ix = 0; ix <= widthSegments; ix++) {\n\t\t\t\t\tconst u = ix / widthSegments;\n\n\t\t\t\t\t// vertex\n\n\t\t\t\t\tvertex.x = -radius * Math.cos(phiStart + u * phiLength) * Math.sin(thetaStart + v * thetaLength);\n\t\t\t\t\tvertex.y = radius * Math.cos(thetaStart + v * thetaLength);\n\t\t\t\t\tvertex.z = radius * Math.sin(phiStart + u * phiLength) * Math.sin(thetaStart + v * thetaLength);\n\t\t\t\t\tvertices.push(vertex.x, vertex.y, vertex.z);\n\n\t\t\t\t\t// normal\n\n\t\t\t\t\tnormal.copy(vertex).normalize();\n\t\t\t\t\tnormals.push(normal.x, normal.y, normal.z);\n\n\t\t\t\t\t// uv\n\n\t\t\t\t\tuvs.push(u + uOffset, 1 - v);\n\t\t\t\t\tverticesRow.push(index++);\n\t\t\t\t}\n\t\t\t\tgrid.push(verticesRow);\n\t\t\t}\n\n\t\t\t// indices\n\n\t\t\tfor (iy = 0; iy < heightSegments; iy++) {\n\t\t\t\tfor (ix = 0; ix < widthSegments; ix++) {\n\t\t\t\t\tconst a = grid[iy][ix + 1];\n\t\t\t\t\tconst b = grid[iy][ix];\n\t\t\t\t\tconst c = grid[iy + 1][ix];\n\t\t\t\t\tconst d = grid[iy + 1][ix + 1];\n\t\t\t\t\tif (iy !== 0 || thetaStart > 0) indices.push(a, b, d);\n\t\t\t\t\tif (iy !== heightSegments - 1 || thetaEnd < Math.PI) indices.push(b, c, d);\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.setIndex(new Attribute(new Buffer(vertices.length / 3 > 65536 ? new Uint32Array(indices) : new Uint16Array(indices), 1)));\n\t\t\tthis.addAttribute('a_Position', new Attribute(new Buffer(new Float32Array(vertices), 3)));\n\t\t\tthis.addAttribute('a_Normal', new Attribute(new Buffer(new Float32Array(normals), 3)));\n\t\t\tthis.addAttribute('a_Uv', new Attribute(new Buffer(new Float32Array(uvs), 2)));\n\t\t\tthis.computeBoundingBox();\n\t\t\tthis.computeBoundingSphere();\n\t\t}\n\t}\n\n\t/**\n\t * Creates a torus knot, the particular shape of which is defined by a pair of coprime integers, p and q.\n\t * If p and q are not coprime, the result will be a torus link.\n\t * @extends Geometry\n\t */\n\tclass TorusKnotGeometry extends Geometry {\n\t\t/**\n\t\t * @param {number} [radius=1] — Radius of the torus. Default is 1.\n\t\t * @param {number} [tube=0.4] — Radius of the tube. Default is 0.4.\n\t\t * @param {number} [tubularSegments=64] — Default is 64.\n\t\t * @param {number} [radialSegments=8] — Default is 8.\n\t\t * @param {number} [p=2] — This value determines, how many times the geometry winds around its axis of rotational symmetry. Default is 2.\n\t\t * @param {number} [q=3] — This value determines, how many times the geometry winds around a circle in the interior of the torus. Default is 3.\n\t\t */\n\t\tconstructor(radius = 1, tube = 0.4, tubularSegments = 64, radialSegments = 8, p = 2, q = 3) {\n\t\t\tsuper();\n\t\t\ttubularSegments = Math.floor(tubularSegments);\n\t\t\tradialSegments = Math.floor(radialSegments);\n\n\t\t\t// buffers\n\n\t\t\tconst indices = [];\n\t\t\tconst vertices = [];\n\t\t\tconst normals = [];\n\t\t\tconst uvs = [];\n\n\t\t\t// helper variables\n\n\t\t\tlet i, j;\n\t\t\tconst vertex = new Vector3();\n\t\t\tconst normal = new Vector3();\n\t\t\tconst P1 = new Vector3();\n\t\t\tconst P2 = new Vector3();\n\t\t\tconst B = new Vector3();\n\t\t\tconst T = new Vector3();\n\t\t\tconst N = new Vector3();\n\n\t\t\t// generate vertices, normals and uvs\n\n\t\t\tfor (i = 0; i <= tubularSegments; ++i) {\n\t\t\t\t// the radian \"u\" is used to calculate the position on the torus curve of the current tubular segement\n\n\t\t\t\tconst u = i / tubularSegments * p * Math.PI * 2;\n\n\t\t\t\t// now we calculate two points. P1 is our current position on the curve, P2 is a little farther ahead.\n\t\t\t\t// these points are used to create a special \"coordinate space\", which is necessary to calculate the correct vertex positions\n\n\t\t\t\tcalculatePositionOnCurve(u, p, q, radius, P1);\n\t\t\t\tcalculatePositionOnCurve(u + 0.01, p, q, radius, P2);\n\n\t\t\t\t// calculate orthonormal basis\n\n\t\t\t\tT.subVectors(P2, P1);\n\t\t\t\tN.addVectors(P2, P1);\n\t\t\t\tB.crossVectors(T, N);\n\t\t\t\tN.crossVectors(B, T);\n\n\t\t\t\t// normalize B, N. T can be ignored, we don't use it\n\n\t\t\t\tB.normalize();\n\t\t\t\tN.normalize();\n\t\t\t\tfor (j = 0; j <= radialSegments; ++j) {\n\t\t\t\t\t// now calculate the vertices. they are nothing more than an extrusion of the torus curve.\n\t\t\t\t\t// because we extrude a shape in the xy-plane, there is no need to calculate a z-value.\n\n\t\t\t\t\tconst v = j / radialSegments * Math.PI * 2;\n\t\t\t\t\tconst cx = -tube * Math.cos(v);\n\t\t\t\t\tconst cy = tube * Math.sin(v);\n\n\t\t\t\t\t// now calculate the final vertex position.\n\t\t\t\t\t// first we orient the extrusion with our basis vectos, then we add it to the current position on the curve\n\n\t\t\t\t\tvertex.x = P1.x + (cx * N.x + cy * B.x);\n\t\t\t\t\tvertex.y = P1.y + (cx * N.y + cy * B.y);\n\t\t\t\t\tvertex.z = P1.z + (cx * N.z + cy * B.z);\n\t\t\t\t\tvertices.push(vertex.x, vertex.y, vertex.z);\n\n\t\t\t\t\t// normal (P1 is always the center/origin of the extrusion, thus we can use it to calculate the normal)\n\n\t\t\t\t\tnormal.subVectors(vertex, P1).normalize();\n\t\t\t\t\tnormals.push(normal.x, normal.y, normal.z);\n\n\t\t\t\t\t// uv\n\n\t\t\t\t\tuvs.push(i / tubularSegments);\n\t\t\t\t\tuvs.push(j / radialSegments);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// generate indices\n\n\t\t\tfor (j = 1; j <= tubularSegments; j++) {\n\t\t\t\tfor (i = 1; i <= radialSegments; i++) {\n\t\t\t\t\t// indices\n\n\t\t\t\t\tconst a = (radialSegments + 1) * (j - 1) + (i - 1);\n\t\t\t\t\tconst b = (radialSegments + 1) * j + (i - 1);\n\t\t\t\t\tconst c = (radialSegments + 1) * j + i;\n\t\t\t\t\tconst d = (radialSegments + 1) * (j - 1) + i;\n\n\t\t\t\t\t// faces\n\n\t\t\t\t\tindices.push(a, b, d);\n\t\t\t\t\tindices.push(b, c, d);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// build geometry\n\n\t\t\tthis.setIndex(new Attribute(new Buffer(vertices.length / 3 > 65536 ? new Uint32Array(indices) : new Uint16Array(indices), 1)));\n\t\t\tthis.addAttribute('a_Position', new Attribute(new Buffer(new Float32Array(vertices), 3)));\n\t\t\tthis.addAttribute('a_Normal', new Attribute(new Buffer(new Float32Array(normals), 3)));\n\t\t\tthis.addAttribute('a_Uv', new Attribute(new Buffer(new Float32Array(uvs), 2)));\n\t\t\tthis.computeBoundingBox();\n\t\t\tthis.computeBoundingSphere();\n\n\t\t\t// this function calculates the current position on the torus curve\n\n\t\t\tfunction calculatePositionOnCurve(u, p, q, radius, position) {\n\t\t\t\tconst cu = Math.cos(u);\n\t\t\t\tconst su = Math.sin(u);\n\t\t\t\tconst quOverP = q / p * u;\n\t\t\t\tconst cs = Math.cos(quOverP);\n\t\t\t\tposition.x = radius * (2 + cs) * 0.5 * cu;\n\t\t\t\tposition.y = radius * (2 + cs) * su * 0.5;\n\t\t\t\tposition.z = radius * Math.sin(quOverP) * 0.5;\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * A material for drawing geometries in a simple shaded (flat or wireframe) way.\n\t * This material is not affected by lights.\n\t * @extends Material\n\t */\n\tclass BasicMaterial extends Material {\n\t\t/**\n\t\t * Create a BasicMaterial.\n\t\t */\n\t\tconstructor() {\n\t\t\tsuper();\n\t\t\tthis.type = MATERIAL_TYPE.BASIC;\n\t\t}\n\t}\n\n\t/**\n\t * A material for non-shiny surfaces, without specular highlights.\n\t * The material uses a non-physically based Lambertian model for calculating reflectance.\n\t * This can simulate some surfaces (such as untreated wood or stone) well, but cannot simulate shiny surfaces with specular highlights (such as varnished wood).\n\t * @extends Material\n\t */\n\tclass LambertMaterial extends Material {\n\t\t/**\n\t\t * Create a LambertMaterial.\n\t\t */\n\t\tconstructor() {\n\t\t\tsuper();\n\t\t\tthis.type = MATERIAL_TYPE.LAMBERT;\n\n\t\t\t/**\n\t\t\t * @default true\n\t\t\t */\n\t\t\tthis.acceptLight = true;\n\t\t}\n\t}\n\n\t/**\n\t * A material for drawing wireframe-style geometries.\n\t * @extends Material\n\t */\n\tclass LineMaterial extends Material {\n\t\t/**\n\t\t * Create a LineMaterial.\n\t\t */\n\t\tconstructor() {\n\t\t\tsuper();\n\t\t\tthis.type = MATERIAL_TYPE.LINE;\n\n\t\t\t/**\n\t\t\t * Controls line thickness.\n\t\t\t * Due to limitations of the OpenGL Core Profile with the WebGL renderer on most platforms linewidth will always be 1 regardless of the set value.\n\t\t\t * @type {number}\n\t\t\t * @default 1\n\t\t\t */\n\t\t\tthis.lineWidth = 1;\n\n\t\t\t/**\n\t\t\t * Set draw mode to LINES / LINE_LOOP / LINE_STRIP\n\t\t\t * @type {DRAW_MODE}\n\t\t\t * @default DRAW_MODE.LINES\n\t\t\t */\n\t\t\tthis.drawMode = DRAW_MODE.LINES;\n\t\t}\n\t\tcopy(source) {\n\t\t\tsuper.copy(source);\n\t\t\tthis.lineWidth = source.lineWidth;\n\t\t\treturn this;\n\t\t}\n\t}\n\n\t/**\n\t * A standard physically based material, using Specular-Glossiness workflow.\n\t * Physically based rendering (PBR) has recently become the standard in many 3D applications, such as Unity, Unreal and 3D Studio Max.\n\t * This approach differs from older approaches in that instead of using approximations for the way in which light interacts with a surface, a physically correct model is used.\n\t * The idea is that, instead of tweaking materials to look good under specific lighting, a material can\tbe created that will react 'correctly' under all lighting scenarios.\n\t * @extends Material\n\t */\n\tclass PBR2Material extends Material {\n\t\t/**\n\t\t * Create a PBR2Material.\n\t\t */\n\t\tconstructor() {\n\t\t\tsuper();\n\t\t\tthis.type = MATERIAL_TYPE.PBR2;\n\n\t\t\t/**\n\t\t\t * Specular color of the material.\n\t\t\t * @type {number}\n\t\t\t * @default 0.5\n\t\t\t */\n\t\t\tthis.specular = new Color3(0x111111);\n\n\t\t\t/**\n\t\t\t * Glossiness of the material.\n\t\t\t * @type {number}\n\t\t\t * @default 0.5\n\t\t\t */\n\t\t\tthis.glossiness = 0.5;\n\n\t\t\t/**\n\t\t\t * The RGB channel of this texture is used to alter the specular of the material.\n\t\t\t * @type {Texture2D}\n\t\t\t * @default null\n\t\t\t */\n\t\t\tthis.specularMap = null;\n\n\t\t\t/**\n\t\t\t * The A channel of this texture is used to alter the glossiness of the material.\n\t\t\t * @type {Texture2D}\n\t\t\t * @default null\n\t\t\t */\n\t\t\tthis.glossinessMap = null;\n\n\t\t\t/**\n\t\t\t * @default true\n\t\t\t */\n\t\t\tthis.acceptLight = true;\n\t\t}\n\t\tcopy(source) {\n\t\t\tsuper.copy(source);\n\t\t\tthis.specular = source.specular;\n\t\t\tthis.glossiness = source.glossiness;\n\t\t\tthis.specularMap = source.specularMap;\n\t\t\tthis.glossinessMap = source.glossinessMap;\n\t\t\treturn this;\n\t\t}\n\t}\n\n\t/**\n\t * A standard physically based material, using Metallic-Roughness workflow.\n\t * Physically based rendering (PBR) has recently become the standard in many 3D applications, such as Unity, Unreal and 3D Studio Max.\n\t * This approach differs from older approaches in that instead of using approximations for the way in which light interacts with a surface, a physically correct model is used.\n\t * The idea is that, instead of tweaking materials to look good under specific lighting, a material can\tbe created that will react 'correctly' under all lighting scenarios.\n\t * @extends Material\n\t */\n\tclass PBRMaterial extends Material {\n\t\t/**\n\t\t * Create a PBRMaterial.\n\t\t */\n\t\tconstructor() {\n\t\t\tsuper();\n\t\t\tthis.type = MATERIAL_TYPE.PBR;\n\n\t\t\t/**\n\t\t\t * How rough the material appears. 0.0 means a smooth mirror reflection, 1.0 means fully diffuse.\n\t\t\t * If roughnessMap is also provided, both values are multiplied.\n\t\t\t * @type {number}\n\t\t\t * @default 0.5\n\t\t\t */\n\t\t\tthis.roughness = 0.5;\n\n\t\t\t/**\n\t\t\t * How much the material is like a metal.\n\t\t\t * Non-metallic materials such as wood or stone use 0.0, metallic use 1.0, with nothing (usually) in between.\n\t\t\t * A value between 0.0 and 1.0 could be used for a rusty metal look. If metalnessMap is also provided, both values are multiplied.\n\t\t\t * @type {number}\n\t\t\t * @default 0.5\n\t\t\t */\n\t\t\tthis.metalness = 0.5;\n\n\t\t\t/**\n\t\t\t * The green channel of this texture is used to alter the roughness of the material.\n\t\t\t * @type {Texture2D}\n\t\t\t * @default null\n\t\t\t */\n\t\t\tthis.roughnessMap = null;\n\n\t\t\t/**\n\t\t\t * The blue channel of this texture is used to alter the metalness of the material.\n\t\t\t * @type {Texture2D}\n\t\t\t * @default null\n\t\t\t */\n\t\t\tthis.metalnessMap = null;\n\n\t\t\t/**\n\t\t\t * The strength of a clearcoat layer on a material surface.\n\t\t\t * When clearcoatFactor is set to 0.0, it indicates that there is no clearcoat present.\n\t\t\t * When it is set to 1.0, it indicates a very strong clearcoat that-\n\t\t\t * will cause the reflection and refraction effects on the surface of the object to become more prominent.\n\t\t\t * @type {number}\n\t\t\t * @default 0.0\n\t\t\t */\n\t\t\tthis.clearcoat = 0.0;\n\n\t\t\t/**\n\t\t\t * A texture property that allows for the modulation of the strength or roughness of the clearcoat layer.\n\t\t\t * @type {Texture2D}\n\t\t\t * @default null\n\t\t\t */\n\t\t\tthis.clearcoatMap = null;\n\n\t\t\t/**\n\t\t\t * The roughness of a clearcoat layer on a material surface.\n\t\t\t * When clearcoatRoughness is set to 0.0, the clearcoat layer will appear perfectly smooth and reflective-\n\t\t\t * and 0.0 represents a rough, textured clearcoat layer.\n\t\t\t * Adjusting the clearcoatRoughness can achieve a wide range of effects and create more realistic materials.\n\t\t\t * @type {number}\n\t\t\t * @default 0.0\n\t\t\t */\n\t\t\tthis.clearcoatRoughness = 0.0;\n\n\t\t\t/**\n\t\t\t * A texture that will be applied to the clearcoat layer of a material to simulate the roughness of the surface.\n\t\t\t * @type {Texture2D}\n\t\t\t * @default null\n\t\t\t */\n\t\t\tthis.clearcoatRoughnessMap = null;\n\n\t\t\t/**\n\t\t\t * Adjust the normal map's strength or intensity.\n\t\t\t * Affect the amount of bumpiness or surface detail that is visible on the clearcoat layer.\n\t\t\t * Typical ranges are 0-1.\n\t\t\t * @type {number}\n\t\t\t * @default 1\n\t\t\t */\n\t\t\tthis.clearcoatNormalScale = new Vector2(1, 1);\n\n\t\t\t/**\n\t\t\t * The texture that modulates the clearcoat layer's surface normal.\n\t\t\t * @type {Texture2D}\n\t\t\t * @default null\n\t\t\t */\n\t\t\tthis.clearcoatNormalMap = null;\n\n\t\t\t/**\n\t\t\t * @default true\n\t\t\t */\n\t\t\tthis.acceptLight = true;\n\t\t}\n\t\tcopy(source) {\n\t\t\tsuper.copy(source);\n\t\t\tthis.roughness = source.roughness;\n\t\t\tthis.metalness = source.metalness;\n\t\t\tthis.roughnessMap = source.roughnessMap;\n\t\t\tthis.metalnessMap = source.metalnessMap;\n\t\t\tthis.clearcoat = source.clearcoat;\n\t\t\tthis.clearcoatMap = source.clearcoatMap;\n\t\t\tthis.clearcoatRoughness = source.clearcoatRoughness;\n\t\t\tthis.clearcoatRoughnessMap = source.clearcoatRoughnessMap;\n\t\t\tthis.clearcoatNormalScale.copy(source.clearcoatNormalScale);\n\t\t\treturn this;\n\t\t}\n\t}\n\n\t/**\n\t * A material for shiny surfaces with specular highlights.\n\t * The material uses a non-physically based Blinn-Phong model for calculating reflectance.\n\t * Unlike the Lambertian model used in the {@link LambertMaterial} this can simulate shiny surfaces with specular highlights (such as varnished wood).\n\t * @extends Material\n\t */\n\tclass PhongMaterial extends Material {\n\t\t/**\n\t\t * Create a PhongMaterial.\n\t\t */\n\t\tconstructor() {\n\t\t\tsuper();\n\t\t\tthis.type = MATERIAL_TYPE.PHONG;\n\n\t\t\t/**\n\t\t\t * How shiny the {@link PhongMaterial#specular} highlight is; a higher value gives a sharper highlight.\n\t\t\t * @type {number}\n\t\t\t * @default 30\n\t\t\t */\n\t\t\tthis.shininess = 30;\n\n\t\t\t/**\n\t\t\t * Specular color of the material.\n\t\t\t * This defines how shiny the material is and the color of its shine.\n\t\t\t * @type {Color3}\n\t\t\t * @default Color(0x111111)\n\t\t\t */\n\t\t\tthis.specular = new Color3(0x111111);\n\n\t\t\t/**\n\t\t\t * The specular map value affects both how much the specular surface highlight contributes and how much of the environment map affects the surface.\n\t\t\t * @type {Texture2D}\n\t\t\t * @default null\n\t\t\t */\n\t\t\tthis.specularMap = null;\n\n\t\t\t/**\n\t\t\t * @default true\n\t\t\t */\n\t\t\tthis.acceptLight = true;\n\t\t}\n\t\tcopy(source) {\n\t\t\tsuper.copy(source);\n\t\t\tthis.shininess = source.shininess;\n\t\t\tthis.specular.copy(source.specular);\n\t\t\tthis.specularMap = source.specularMap;\n\t\t\treturn this;\n\t\t}\n\t}\n\n\t/**\n\t * The default material used by Points.\n\t * @extends Material\n\t */\n\tclass PointsMaterial extends Material {\n\t\t/**\n\t\t * Create a PointsMaterial.\n\t\t */\n\t\tconstructor() {\n\t\t\tsuper();\n\t\t\tthis.type = MATERIAL_TYPE.POINT;\n\n\t\t\t/**\n\t\t\t * Sets the size of the points.\n\t\t\t * @type {number}\n\t\t\t * @default 1\n\t\t\t */\n\t\t\tthis.size = 1;\n\n\t\t\t/**\n\t\t\t * Specify whether points' size is attenuated by the camera depth. (Perspective camera only.)\n\t\t\t * @type {boolean}\n\t\t\t * @default true\n\t\t\t */\n\t\t\tthis.sizeAttenuation = true;\n\n\t\t\t/**\n\t\t\t * Set draw mode to POINTS.\n\t\t\t * @type {DRAW_MODE}\n\t\t\t * @default DRAW_MODE.POINTS\n\t\t\t */\n\t\t\tthis.drawMode = DRAW_MODE.POINTS;\n\t\t}\n\t\tcopy(source) {\n\t\t\tsuper.copy(source);\n\t\t\tthis.size = source.size;\n\t\t\tthis.sizeAttenuation = source.sizeAttenuation;\n\t\t\treturn this;\n\t\t}\n\t}\n\n\t/**\n\t * RenderTargetBase is an abstract class representing a rendering target,\n\t * which encapsulates the configuration for a render pass,\n\t * including clear states, attachments, and other rendering parameters.\n\t * @extends EventDispatcher\n\t * @abstract\n\t */\n\tclass RenderTargetBase extends EventDispatcher {\n\t\tconstructor(width, height) {\n\t\t\tsuper();\n\n\t\t\t/**\n\t\t\t * The width of the render target.\n\t\t\t * @type {number}\n\t\t\t */\n\t\t\tthis.width = width;\n\n\t\t\t/**\n\t\t\t * The height of the render target.\n\t\t\t * @type {number}\n\t\t\t */\n\t\t\tthis.height = height;\n\n\t\t\t/**\n\t\t\t * Whether to clear the color buffer before rendering to this render target.\n\t\t\t * @type {boolean}\n\t\t\t * @default true\n\t\t\t */\n\t\t\tthis.clearColor = true;\n\n\t\t\t/**\n\t\t\t * Whether to clear the depth buffer before rendering to this render target.\n\t\t\t * @type {boolean}\n\t\t\t * @default true\n\t\t\t */\n\t\t\tthis.clearDepth = true;\n\n\t\t\t/**\n\t\t\t * Whether to clear the stencil buffer before rendering to this render target.\n\t\t\t * @type {boolean}\n\t\t\t * @default true\n\t\t\t */\n\t\t\tthis.clearStencil = true;\n\n\t\t\t/**\n\t\t\t * Clear color value.\n\t\t\t * @type {Color4}\n\t\t\t */\n\t\t\tthis.colorClearValue = new Color4(0, 0, 0, 0);\n\n\t\t\t/**\n\t\t\t * Clear depth value.\n\t\t\t * @type {number}\n\t\t\t * @default 1\n\t\t\t */\n\t\t\tthis.depthClearValue = 1;\n\n\t\t\t/**\n\t\t\t * Clear stencil value.\n\t\t\t * @type {number}\n\t\t\t * @default 0\n\t\t\t */\n\t\t\tthis.stencilClearValue = 0;\n\n\t\t\t/**\n\t\t\t * A querySet that will store the occlusion query results. If null, occlusion queries are disabled.\n\t\t\t * @type {QuerySet|null}\n\t\t\t * @default null\n\t\t\t */\n\t\t\tthis.occlusionQuerySet = null;\n\n\t\t\t/**\n\t\t\t * An array of objects defining where and when timestamp query values will be written.\n\t\t\t * @type {object}\n\t\t\t * @property {QuerySet|null} querySet - A timestamp querySet. If null, timestamp queries are disabled.\n\t\t\t * @property {number} beginningOfPassWriteIndex - A number specifying the query index in querySet where the timestamp at the beginning of the render pass will be written.\n\t\t\t * @property {number} endOfPassWriteIndex - A number specifying the query index in querySet where the timestamp at the end of the render pass will be written.\n\t\t\t */\n\t\t\tthis.timestampWrites = {\n\t\t\t\tquerySet: null,\n\t\t\t\tbeginningOfPassWriteIndex: 0,\n\t\t\t\tendOfPassWriteIndex: 1\n\t\t\t};\n\t\t}\n\n\t\t/**\n\t\t * Resize the render target to the specified dimensions.\n\t\t * @abstract\n\t\t */\n\t\tresize() {\n\t\t\tthrow new Error('RenderTargetBase: resize method must be implemented by subclass');\n\t\t}\n\n\t\t/**\n\t\t * Dispose the render target.\n\t\t * @abstract\n\t\t */\n\t\tdispose() {\n\t\t\tthrow new Error('RenderTargetBase: dispose method must be implemented by subclass');\n\t\t}\n\n\t\t/**\n\t\t * Sets the clear state.\n\t\t * @param {boolean} [color] - Whether to clear the color buffer.\n\t\t * @param {boolean} [depth] - Whether to clear the depth buffer.\n\t\t * @param {boolean} [stencil] - Whether to clear the stencil buffer.\n\t\t * @returns {RenderTargetBase} A reference to this render target.\n\t\t */\n\t\tsetClear(color, depth, stencil) {\n\t\t\tthis.clearColor = color !== undefined ? color : this.clearColor;\n\t\t\tthis.clearDepth = depth !== undefined ? depth : this.clearDepth;\n\t\t\tthis.clearStencil = stencil !== undefined ? stencil : this.clearStencil;\n\t\t\treturn this;\n\t\t}\n\n\t\t/**\n\t\t * Sets the clear values.\n\t\t * @param {number} r - Red channel value between 0.0 and 1.0.\n\t\t * @param {number} g - Green channel value between 0.0 and 1.0.\n\t\t * @param {number} b - Blue channel value between 0.0 and 1.0.\n\t\t * @param {number} a - Alpha channel value between 0.0 and 1.0.\n\t\t * @returns {RenderTargetBase} A reference to this render target.\n\t\t */\n\t\tsetColorClearValue(r, g, b, a) {\n\t\t\tthis.colorClearValue.setRGBA(r, g, b, a);\n\t\t\treturn this;\n\t\t}\n\n\t\t/**\n\t\t * Sets the clear depth value.\n\t\t * @param {number} depth - The depth value.\n\t\t * @returns {RenderTargetBase} A reference to this render target.\n\t\t */\n\t\tsetDepthClearValue(depth) {\n\t\t\tthis.depthClearValue = depth;\n\t\t\treturn this;\n\t\t}\n\n\t\t/**\n\t\t * Sets the clear stencil value.\n\t\t * @param {number} stencil - The stencil value.\n\t\t * @returns {RenderTargetBase} A reference to this render target.\n\t\t */\n\t\tsetStencilClearValue(stencil) {\n\t\t\tthis.stencilClearValue = stencil;\n\t\t\treturn this;\n\t\t}\n\n\t\t/**\n\t\t * Sets the occlusion query set.\n\t\t * @param {QuerySet|null} querySet - The occlusion query set. If null, occlusion queries are disabled.\n\t\t * @returns {RenderTargetBase} A reference to this render target.\n\t\t */\n\t\tsetOcclusionQuerySet(querySet) {\n\t\t\tthis.occlusionQuerySet = querySet;\n\t\t\treturn this;\n\t\t}\n\n\t\t/**\n\t\t * Sets the timestamp query set and the query indices.\n\t\t * @param {QuerySet|null} querySet - The timestamp query set. If null, timestamp queries are disabled.\n\t\t * @param {number} [beginIndex=0] - The query index in querySet where the timestamp at the beginning of the render pass will be written.\n\t\t * @param {number} [endIndex=1] - The query index in querySet where the timestamp at the end of the render pass will be written.\n\t\t * @returns {RenderTargetBase} A reference to this render target.\n\t\t */\n\t\tsetTimestampWrites(querySet, beginIndex = 0, endIndex = 1) {\n\t\t\tthis.timestampWrites.querySet = querySet;\n\t\t\tthis.timestampWrites.beginningOfPassWriteIndex = beginIndex;\n\t\t\tthis.timestampWrites.endOfPassWriteIndex = endIndex;\n\t\t\treturn this;\n\t\t}\n\t}\n\n\t/**\n\t * This flag can be used for type testing.\n\t * @readonly\n\t * @type {boolean}\n\t * @default true\n\t */\n\tRenderTargetBase.prototype.isRenderTarget = true;\n\n\t/**\n\t * Render Buffer can be attached to RenderTarget.\n\t * @extends EventDispatcher\n\t */\n\tclass RenderBuffer extends EventDispatcher {\n\t\t/**\n\t\t * @param {number} width - The width of the render buffer.\n\t\t * @param {number} height - The height of the render buffer.\n\t\t * @param {PIXEL_FORMAT} [format=PIXEL_FORMAT.RGBA8] - The internal format of the render buffer.\n\t\t * @param {number} [multipleSampling=0] - If bigger than zero, this renderBuffer will support multipleSampling. (Only usable in WebGL 2.0)\n\t\t */\n\t\tconstructor(width, height, format = PIXEL_FORMAT.RGBA8, multipleSampling = 0) {\n\t\t\tsuper();\n\n\t\t\t/**\n\t\t\t * The width of the render buffer.\n\t\t\t * @type {number}\n\t\t\t */\n\t\t\tthis.width = width;\n\n\t\t\t/**\n\t\t\t * The height of the render buffer.\n\t\t\t * @type {number}\n\t\t\t */\n\t\t\tthis.height = height;\n\n\t\t\t/**\n\t\t\t * Render buffer texel storage data format.\n\t\t\t * DEPTH_COMPONENT16: for depth attachments.\n\t\t\t * DEPTH_STENCIL: for depth stencil attachments.\n\t\t\t * RGBA8：for multiple sampled color attachments.\n\t\t\t * DEPTH_COMPONENT16: for multiple sampled depth attachments.\n\t\t\t * DEPTH24_STENCIL8: for multiple sampled depth stencil attachments.\n\t\t\t * @type {PIXEL_FORMAT}\n\t\t\t * @default PIXEL_FORMAT.RGBA8\n\t\t\t */\n\t\t\tthis.format = format;\n\n\t\t\t/**\n\t\t\t * If bigger than zero, this renderBuffer will support multipleSampling. (Only usable in WebGL 2.0)\n\t\t\t * A Render Target's attachments must have the same multipleSampling value.\n\t\t\t * Texture can't be attached to the same render target with a multiple sampled render buffer.\n\t\t\t * Max support 8.\n\t\t\t * @type {number}\n\t\t\t * @default 0\n\t\t\t */\n\t\t\tthis.multipleSampling = multipleSampling;\n\t\t}\n\n\t\t/**\n\t\t * Resize the render buffer.\n\t\t * @param {number} width - The width of the render buffer.\n\t\t * @param {number} height - The height of the render buffer.\n\t\t * @returns {boolean} - If size changed.\n\t\t */\n\t\tresize(width, height) {\n\t\t\tif (this.width !== width || this.height !== height) {\n\t\t\t\tthis.dispose();\n\t\t\t\tthis.width = width;\n\t\t\t\tthis.height = height;\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\treturn false;\n\t\t}\n\n\t\t/**\n\t\t * Returns a clone of this render buffer.\n\t\t * @returns {RenderBuffer}\n\t\t */\n\t\tclone() {\n\t\t\treturn new this.constructor().copy(this);\n\t\t}\n\n\t\t/**\n\t\t * Copy the given render buffer into this render buffer.\n\t\t * @param {RenderBuffer} source - The render buffer to be copied.\n\t\t * @returns {RenderBuffer}\n\t\t */\n\t\tcopy(source) {\n\t\t\tthis.format = source.format;\n\t\t\tthis.multipleSampling = source.multipleSampling;\n\t\t\treturn this;\n\t\t}\n\n\t\t/**\n\t\t * Dispatches a dispose event.\n\t\t */\n\t\tdispose() {\n\t\t\tthis.dispatchEvent({\n\t\t\t\ttype: 'dispose'\n\t\t\t});\n\t\t}\n\t}\n\n\t/**\n\t * This flag can be used for type testing.\n\t * @readonly\n\t * @type {boolean}\n\t * @default true\n\t */\n\tRenderBuffer.prototype.isRenderBuffer = true;\n\n\tlet _textureId = 0;\n\n\t/**\n\t * Create a texture to apply to a surface or as a reflection or refraction map.\n\t * @abstract\n\t * @extends EventDispatcher\n\t */\n\tclass TextureBase extends EventDispatcher {\n\t\tconstructor() {\n\t\t\tsuper();\n\n\t\t\t/**\n\t\t\t * Unique number for this texture instance.\n\t\t\t * @readonly\n\t\t\t * @type {number}\n\t\t\t */\n\t\t\tthis.id = _textureId++;\n\n\t\t\t/**\n\t\t\t * An object that can be used to store custom data about the {@link TextureBase}.\n\t\t\t * It should not hold references to functions as these will not be cloned.\n\t\t\t * @type {object}\n\t\t\t * @default {}\n\t\t\t */\n\t\t\tthis.userData = {};\n\n\t\t\t/**\n\t\t\t * Array of user-specified mipmaps (optional).\n\t\t\t * @type {HTMLImageElement[] | object[]}\n\t\t\t * @default []\n\t\t\t */\n\t\t\tthis.mipmaps = [];\n\n\t\t\t/**\n\t\t\t * WebGLTexture border.\n\t\t\t * See {@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/texImage2D WebGLTexture texImage2D()}.\n\t\t\t * Must be zero.\n\t\t\t * @type {number}\n\t\t\t */\n\t\t\tthis.border = 0;\n\n\t\t\t/**\n\t\t\t * WebGLTexture texel data format.\n\t\t\t * @type {PIXEL_FORMAT}\n\t\t\t * @default PIXEL_FORMAT.RGBA\n\t\t\t */\n\t\t\tthis.format = PIXEL_FORMAT.RGBA;\n\n\t\t\t/**\n\t\t\t * The default value is null, the texture's internal format will be obtained using a combination of .format and .type.\n\t\t\t * Users can also specify a specific internalFormat.\n\t\t\t * @type {null | PIXEL_FORMAT}\n\t\t\t * @default null\n\t\t\t */\n\t\t\tthis.internalformat = null;\n\n\t\t\t/**\n\t\t\t * WebGLTexture texel data type.\n\t\t\t * @type {PIXEL_TYPE}\n\t\t\t * @default PIXEL_TYPE.UNSIGNED_BYTE\n\t\t\t */\n\t\t\tthis.type = PIXEL_TYPE.UNSIGNED_BYTE;\n\n\t\t\t/**\n\t\t\t * How the texture is sampled when a texel covers more than one pixel.\n\t\t\t * @type {TEXTURE_FILTER}\n\t\t\t * @default TEXTURE_FILTER.LINEAR\n\t\t\t */\n\t\t\tthis.magFilter = TEXTURE_FILTER.LINEAR;\n\n\t\t\t/**\n\t\t\t * How the texture is sampled when a texel covers less than one pixel.\n\t\t\t * @type {TEXTURE_FILTER}\n\t\t\t * @default TEXTURE_FILTER.LINEAR_MIPMAP_LINEAR\n\t\t\t */\n\t\t\tthis.minFilter = TEXTURE_FILTER.LINEAR_MIPMAP_LINEAR;\n\n\t\t\t/**\n\t\t\t * This defines how the texture is wrapped horizontally and corresponds to U in UV mapping.\n\t\t\t * @type {TEXTURE_WRAP}\n\t\t\t * @default TEXTURE_WRAP.CLAMP_TO_EDGE\n\t\t\t */\n\t\t\tthis.wrapS = TEXTURE_WRAP.CLAMP_TO_EDGE;\n\n\t\t\t/**\n\t\t\t * This defines how the texture is wrapped vertically and corresponds to V in UV mapping.\n\t\t\t * @type {TEXTURE_WRAP}\n\t\t\t * @default TEXTURE_WRAP.CLAMP_TO_EDGE\n\t\t\t */\n\t\t\tthis.wrapT = TEXTURE_WRAP.CLAMP_TO_EDGE;\n\n\t\t\t/**\n\t\t\t * The number of samples taken along the axis through the pixel that has the highest density of texels.\n\t\t\t * A higher value gives a less blurry result than a basic mipmap, at the cost of more texture samples being used.\n\t\t\t * Use {@link WebGLcapabilities#maxAnisotropy} to find the maximum valid anisotropy value for the GPU; this value is usually a power of 2.\n\t\t\t * @type {number}\n\t\t\t * @default 1\n\t\t\t */\n\t\t\tthis.anisotropy = 1;\n\n\t\t\t/**\n\t\t\t * Use for shadow sampler (WebGL 2.0 Only).\n\t\t\t * @type {COMPARE_FUNC | undefined}\n\t\t\t * @default undefined\n\t\t\t */\n\t\t\tthis.compare = undefined;\n\n\t\t\t/**\n\t\t\t * Whether to generate mipmaps (if possible) for a texture.\n\t\t\t * Set this to false if you are creating mipmaps manually.\n\t\t\t * @type {boolean}\n\t\t\t * @default true\n\t\t\t */\n\t\t\tthis.generateMipmaps = true;\n\n\t\t\t/**\n\t\t\t * texture pixel encoding.\n\t\t\t * @type {TEXEL_ENCODING_TYPE}\n\t\t\t * @default TEXEL_ENCODING_TYPE.LINEAR\n\t\t\t */\n\t\t\tthis.encoding = TEXEL_ENCODING_TYPE.LINEAR;\n\n\t\t\t/**\n\t\t\t * If set to true, the texture is flipped along the vertical axis when uploaded to the GPU.\n\t\t\t * Default is true to flips the image's Y axis to match the WebGL texture coordinate space.\n\t\t\t * Note that this property has no effect for ImageBitmap. You need to configure on bitmap creation instead.\n\t\t\t * @type {boolean}\n\t\t\t * @default true\n\t\t\t */\n\t\t\tthis.flipY = true;\n\n\t\t\t/**\n\t\t\t * If set to true, the alpha channel, if present, is multiplied into the color channels when the texture is uploaded to the GPU.\n\t\t\t * Note that this property has no effect for ImageBitmap. You need to configure on bitmap creation instead.\n\t\t\t * @type {boolean}\n\t\t\t * @default false\n\t\t\t */\n\t\t\tthis.premultiplyAlpha = false;\n\n\t\t\t/**\n\t\t\t * Specifies the alignment requirements for the start of each pixel row in memory.\n\t\t\t * The allowable values are 1 (byte-alignment), 2 (rows aligned to even-numbered bytes), 4 (word-alignment), and 8 (rows start on double-word boundaries).\n\t\t\t * @type {number}\n\t\t\t * @default 4\n\t\t\t */\n\t\t\tthis.unpackAlignment = 4;\n\n\t\t\t/**\n\t\t\t * version code increse if texture changed.\n\t\t\t * if version is still 0, this texture will be skiped.\n\t\t\t * @type {number}\n\t\t\t * @default 0\n\t\t\t */\n\t\t\tthis.version = 0;\n\t\t}\n\n\t\t/**\n\t\t * Returns a clone of this texture.\n\t\t * @returns {TextureBase}\n\t\t */\n\t\tclone() {\n\t\t\treturn new this.constructor().copy(this);\n\t\t}\n\n\t\t/**\n\t\t * Copy the given texture into this texture.\n\t\t * @param {TextureBase} source - The texture to be copied.\n\t\t * @returns {TextureBase}\n\t\t */\n\t\tcopy(source) {\n\t\t\tthis.userData = cloneJson(source.userData);\n\t\t\tthis.mipmaps = source.mipmaps.slice(0);\n\t\t\tthis.border = source.border;\n\t\t\tthis.format = source.format;\n\t\t\tthis.internalformat = source.internalformat;\n\t\t\tthis.type = source.type;\n\t\t\tthis.magFilter = source.magFilter;\n\t\t\tthis.minFilter = source.minFilter;\n\t\t\tthis.wrapS = source.wrapS;\n\t\t\tthis.wrapT = source.wrapT;\n\t\t\tthis.anisotropy = source.anisotropy;\n\t\t\tthis.compare = source.compare;\n\t\t\tthis.generateMipmaps = source.generateMipmaps;\n\t\t\tthis.encoding = source.encoding;\n\t\t\tthis.flipY = source.flipY;\n\t\t\tthis.premultiplyAlpha = source.premultiplyAlpha;\n\t\t\tthis.unpackAlignment = source.unpackAlignment;\n\t\t\tthis.version = source.version;\n\t\t\treturn this;\n\t\t}\n\n\t\t/**\n\t\t * Dispatches a dispose event.\n\t\t */\n\t\tdispose() {\n\t\t\tthis.dispatchEvent({\n\t\t\t\ttype: 'dispose'\n\t\t\t});\n\t\t\tthis.version = 0;\n\t\t}\n\n\t\t/**\n\t\t * Resize the texture for use as a render target attachment.\n\t\t * @param {number} width - The new width of the texture.\n\t\t * @param {number} height - The new height of the texture.\n\t\t * @param {number} [depth] - The new depth of the texture.\n\t\t * Only {@link Texture3D} and {@link Texture2DArray} will use this parameter.\n\t\t * If not specified, the depth will not be changed.\n\t\t */\n\t\tresizeAsAttachment(width, height, depth) {}\n\t}\n\n\t/**\n\t * This flag can be used for type testing.\n\t * @readonly\n\t * @type {boolean}\n\t * @default true\n\t */\n\tTextureBase.prototype.isTexture = true;\n\n\t/**\n\t * Creates a 2d texture.\n\t * @extends TextureBase\n\t */\n\tclass Texture2D extends TextureBase {\n\t\tconstructor() {\n\t\t\tsuper();\n\n\t\t\t/**\n\t\t\t * Image data for this texture.\n\t\t\t * @type {null | HTMLImageElement | HTMLCanvasElement | HTMLVideoElement | ImageBitmap | object}\n\t\t\t * @default null\n\t\t\t */\n\t\t\tthis.image = null;\n\t\t}\n\n\t\t/**\n\t\t * Copy the given 2d texture into this texture.\n\t\t * @param {Texture2D} source - The 2d texture to be copied.\n\t\t * @returns {Texture2D}\n\t\t */\n\t\tcopy(source) {\n\t\t\tsuper.copy(source);\n\t\t\tthis.image = source.image;\n\t\t\treturn this;\n\t\t}\n\n\t\t/**\n\t\t * @override\n\t\t */\n\t\tresizeAsAttachment(width, height) {\n\t\t\tif (this.image && this.image.rtt) {\n\t\t\t\tif (this.image.width !== width || this.image.height !== height) {\n\t\t\t\t\tthis.version++;\n\t\t\t\t\tthis.image.width = width;\n\t\t\t\t\tthis.image.height = height;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tthis.version++;\n\t\t\t\tthis.image = {\n\t\t\t\t\trtt: true,\n\t\t\t\t\tdata: null,\n\t\t\t\t\twidth,\n\t\t\t\t\theight\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * This flag can be used for type testing.\n\t * @readonly\n\t * @type {boolean}\n\t * @default true\n\t */\n\tTexture2D.prototype.isTexture2D = true;\n\n\t/**\n\t * Creates a cube texture.\n\t * @extends TextureBase\n\t */\n\tclass TextureCube extends TextureBase {\n\t\tconstructor() {\n\t\t\tsuper();\n\n\t\t\t/**\n\t\t\t * Images data for this texture.\n\t\t\t * @type {HTMLImageElement[]}\n\t\t\t * @default []\n\t\t\t */\n\t\t\tthis.images = [];\n\n\t\t\t/**\n\t\t\t * @default false\n\t\t\t */\n\t\t\tthis.flipY = false;\n\t\t}\n\n\t\t/**\n\t\t * Copy the given cube texture into this texture.\n\t\t * @param {TextureCube} source - The cube texture to be copied.\n\t\t * @returns {TextureCube}\n\t\t */\n\t\tcopy(source) {\n\t\t\tsuper.copy(source);\n\t\t\tthis.images = source.images.slice(0);\n\t\t\treturn this;\n\t\t}\n\n\t\t/**\n\t\t * @override\n\t\t */\n\t\tresizeAsAttachment(width, height) {\n\t\t\tlet changed = false;\n\t\t\tfor (let i = 0; i < 6; i++) {\n\t\t\t\tif (this.images[i] && this.images[i].rtt) {\n\t\t\t\t\tif (this.images[i].width !== width || this.images[i].height !== height) {\n\t\t\t\t\t\tthis.images[i].width = width;\n\t\t\t\t\t\tthis.images[i].height = height;\n\t\t\t\t\t\tchanged = true;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tthis.images[i] = {\n\t\t\t\t\t\trtt: true,\n\t\t\t\t\t\tdata: null,\n\t\t\t\t\t\twidth,\n\t\t\t\t\t\theight\n\t\t\t\t\t};\n\t\t\t\t\tchanged = true;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (changed) {\n\t\t\t\tthis.version++;\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * This flag can be used for type testing.\n\t * @readonly\n\t * @type {boolean}\n\t * @default true\n\t */\n\tTextureCube.prototype.isTextureCube = true;\n\n\t/**\n\t * Creates a 3D texture. (WebGL 2.0)\n\t * @extends TextureBase\n\t */\n\tclass Texture3D extends TextureBase {\n\t\tconstructor() {\n\t\t\tsuper();\n\n\t\t\t/**\n\t\t\t * Image data for this texture.\n\t\t\t * @type {object}\n\t\t\t */\n\t\t\tthis.image = {\n\t\t\t\tdata: new Uint8Array([255, 255, 255, 255, 255, 255, 255, 255]),\n\t\t\t\twidth: 2,\n\t\t\t\theight: 2,\n\t\t\t\tdepth: 2\n\t\t\t};\n\n\t\t\t/**\n\t\t\t * This defines how the texture is wrapped in the depth direction.\n\t\t\t * @type {TEXTURE_WRAP}\n\t\t\t * @default TEXTURE_WRAP.CLAMP_TO_EDGE\n\t\t\t */\n\t\t\tthis.wrapR = TEXTURE_WRAP.CLAMP_TO_EDGE;\n\n\t\t\t/**\n\t\t\t * @default PIXEL_FORMAT.RED\n\t\t\t */\n\t\t\tthis.format = PIXEL_FORMAT.RED;\n\n\t\t\t/**\n\t\t\t * @default PIXEL_TYPE.UNSIGNED_BYTE\n\t\t\t */\n\t\t\tthis.type = PIXEL_TYPE.UNSIGNED_BYTE;\n\n\t\t\t/**\n\t\t\t * @default TEXTURE_FILTER.NEAREST\n\t\t\t */\n\t\t\tthis.magFilter = TEXTURE_FILTER.NEAREST;\n\n\t\t\t/**\n\t\t\t * @default TEXTURE_FILTER.NEAREST\n\t\t\t */\n\t\t\tthis.minFilter = TEXTURE_FILTER.NEAREST;\n\n\t\t\t/**\n\t\t\t * @default false\n\t\t\t */\n\t\t\tthis.generateMipmaps = false;\n\n\t\t\t/**\n\t\t\t * @default false\n\t\t\t */\n\t\t\tthis.flipY = false;\n\n\t\t\t/**\n\t\t\t * @default 1\n\t\t\t */\n\t\t\tthis.unpackAlignment = 1;\n\t\t}\n\n\t\t/**\n\t\t * Copy the given 3d texture into this texture.\n\t\t * @param {Texture3D} source - The 3d texture to be copied.\n\t\t * @returns {Texture3D}\n\t\t */\n\t\tcopy(source) {\n\t\t\tsuper.copy(source);\n\t\t\tthis.image = source.image;\n\t\t\treturn this;\n\t\t}\n\n\t\t/**\n\t\t * @override\n\t\t */\n\t\tresizeAsAttachment(width, height, depth) {\n\t\t\tconst resizeDepth = depth !== undefined;\n\t\t\tif (this.image && this.image.rtt) {\n\t\t\t\tif (this.image.width !== width || this.image.height !== height || resizeDepth && this.image.depth !== depth) {\n\t\t\t\t\tthis.version++;\n\t\t\t\t\tthis.image.width = width;\n\t\t\t\t\tthis.image.height = height;\n\t\t\t\t\tif (resizeDepth) this.image.depth = depth;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tthis.version++;\n\t\t\t\tconst oldDepth = this.image && this.image.depth ? this.image.depth : 1;\n\t\t\t\tthis.image = {\n\t\t\t\t\trtt: true,\n\t\t\t\t\tdata: null,\n\t\t\t\t\twidth,\n\t\t\t\t\theight,\n\t\t\t\t\tdepth: resizeDepth ? depth : oldDepth\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * This flag can be used for type testing.\n\t * @readonly\n\t * @type {boolean}\n\t * @default true\n\t */\n\tTexture3D.prototype.isTexture3D = true;\n\n\t/**\n\t * Creates a 2d texture. (WebGL 2.0)\n\t * @extends TextureBase\n\t */\n\tclass Texture2DArray extends TextureBase {\n\t\tconstructor() {\n\t\t\tsuper();\n\n\t\t\t/**\n\t\t\t * Image data for this texture.\n\t\t\t * @type {object}\n\t\t\t * @default null\n\t\t\t */\n\t\t\tthis.image = {\n\t\t\t\tdata: new Uint8Array([255, 255, 255, 255, 255, 255, 255, 255]),\n\t\t\t\twidth: 2,\n\t\t\t\theight: 2,\n\t\t\t\tdepth: 2\n\t\t\t};\n\n\t\t\t/**\n\t\t\t * @default PIXEL_FORMAT.RED\n\t\t\t */\n\t\t\tthis.format = PIXEL_FORMAT.RED;\n\n\t\t\t/**\n\t\t\t * @default TEXTURE_FILTER.NEAREST\n\t\t\t */\n\t\t\tthis.magFilter = TEXTURE_FILTER.NEAREST;\n\n\t\t\t/**\n\t\t\t * @default TEXTURE_FILTER.NEAREST\n\t\t\t */\n\t\t\tthis.minFilter = TEXTURE_FILTER.NEAREST;\n\n\t\t\t/**\n\t\t\t * @default false\n\t\t\t */\n\t\t\tthis.generateMipmaps = false;\n\n\t\t\t/**\n\t\t\t * @default false\n\t\t\t */\n\t\t\tthis.flipY = false;\n\n\t\t\t/**\n\t\t\t * @default 1\n\t\t\t */\n\t\t\tthis.unpackAlignment = 1;\n\n\t\t\t/**\n\t\t\t * A set of all layers which need to be updated in the texture.\n\t\t\t * @type {Set}\n\t\t\t */\n\t\t\tthis.layerUpdates = new Set();\n\t\t}\n\n\t\t/**\n\t\t * Copy the given 2d texture into this texture.\n\t\t * @param {Texture2DArray} source - The 2d texture to be copied.\n\t\t * @returns {Texture2DArray}\n\t\t */\n\t\tcopy(source) {\n\t\t\tsuper.copy(source);\n\t\t\tthis.image = source.image;\n\t\t\treturn this;\n\t\t}\n\n\t\t/**\n\t\t * @override\n\t\t */\n\t\tresizeAsAttachment(width, height, depth) {\n\t\t\tconst resizeDepth = depth !== undefined;\n\t\t\tif (this.image && this.image.rtt) {\n\t\t\t\tif (this.image.width !== width || this.image.height !== height || resizeDepth && this.image.depth !== depth) {\n\t\t\t\t\tthis.version++;\n\t\t\t\t\tthis.image.width = width;\n\t\t\t\t\tthis.image.height = height;\n\t\t\t\t\tif (resizeDepth) this.image.depth = depth;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tthis.version++;\n\t\t\t\tconst oldDepth = this.image && this.image.depth ? this.image.depth : 1;\n\t\t\t\tthis.image = {\n\t\t\t\t\trtt: true,\n\t\t\t\t\tdata: null,\n\t\t\t\t\twidth,\n\t\t\t\t\theight,\n\t\t\t\t\tdepth: resizeDepth ? depth : oldDepth\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * This flag can be used for type testing.\n\t * @readonly\n\t * @type {boolean}\n\t * @default true\n\t */\n\tTexture2DArray.prototype.isTexture2DArray = true;\n\n\t/**\n\t * Render Target that render to offscreen textures or renderbuffers.\n\t * @extends RenderTargetBase\n\t */\n\tclass OffscreenRenderTarget extends RenderTargetBase {\n\t\t/**\n\t\t * Create a new OffscreenRenderTarget.\n\t\t * @param {number} width - The width of the render target.\n\t\t * @param {number} height - The height of the render target.\n\t\t */\n\t\tconstructor(width, height) {\n\t\t\tsuper(width, height);\n\n\t\t\t/**\n\t\t\t * The active layer index for rendering.\n\t\t\t * For cube render targets, this represents the active cube face.\n\t\t\t * @type {number}\n\t\t\t * @default 0\n\t\t\t */\n\t\t\tthis.activeLayer = 0;\n\n\t\t\t/**\n\t\t\t * The active mipmap level for rendering.\n\t\t\t * Not supported in WebGL1.\n\t\t\t * @type {number}\n\t\t\t * @default 0\n\t\t\t */\n\t\t\tthis.activeMipmapLevel = 0;\n\t\t\tthis._attachments = {};\n\t\t}\n\n\t\t/**\n\t\t * Resize the render target to the specified dimensions.\n\t\t * This will resize all attached attachments.\n\t\t * @param {number} width - The new width of the render target.\n\t\t * @param {number} height - The new height of the render target.\n\t\t * @param {number} [depth] - **DEPRECATED**: Depth parameter is no longer used.\n\t\t * Individual textures manage their own depth dimensions.\n\t\t */\n\t\tresize(width, height, depth) {\n\t\t\tif (arguments.length > 2) {\n\t\t\t\tconsole.warn('OffscreenRenderTarget.resize(): The depth parameter is deprecated. ' + 'RenderTarget no longer manages texture depth as it is not required by the rendering backend. ' + 'Use texture.resizeAsAttachment() directly to control texture dimensions.');\n\t\t\t}\n\t\t\tif (this.width === width && this.height === height) return;\n\t\t\tthis.width = width;\n\t\t\tthis.height = height;\n\t\t\tthis.dispose(false);\n\t\t\tfor (const attachment in this._attachments) {\n\t\t\t\tconst target = this._attachments[attachment];\n\t\t\t\tif (target.isTexture) {\n\t\t\t\t\ttarget.resizeAsAttachment(width, height);\n\t\t\t\t} else {\n\t\t\t\t\ttarget.resize(width, height);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t/**\n\t\t * Dispose the render target.\n\t\t * @param {boolean} [disposeAttachments=true] - Whether to dispose attachments as well.\n\t\t */\n\t\tdispose(disposeAttachments = true) {\n\t\t\tthis.dispatchEvent({\n\t\t\t\ttype: 'dispose'\n\t\t\t});\n\t\t\tif (disposeAttachments) {\n\t\t\t\tfor (const attachment in this._attachments) {\n\t\t\t\t\tthis._attachments[attachment].dispose();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t/**\n\t\t * Attach a texture(RTT) or renderbuffer to the framebuffer.\n\t\t * Notice: For now, dynamic Attachment during rendering is not supported.\n\t\t * @param\t{TextureBase|RenderBuffer} target - The texture or renderbuffer to attach.\n\t\t * @param\t{ATTACHMENT} [attachment=ATTACHMENT.COLOR_ATTACHMENT0] - The attachment point.\n\t\t * @returns {OffscreenRenderTarget} Self for chaining.\n\t\t */\n\t\tattach(target, attachment = ATTACHMENT.COLOR_ATTACHMENT0) {\n\t\t\tif (target.isTexture) {\n\t\t\t\ttarget.resizeAsAttachment(this.width, this.height);\n\t\t\t} else {\n\t\t\t\ttarget.resize(this.width, this.height);\n\t\t\t}\n\t\t\tthis._attachments[attachment] = target;\n\t\t\treturn this;\n\t\t}\n\n\t\t/**\n\t\t * Detach a texture(RTT) or renderbuffer.\n\t\t * @param\t{ATTACHMENT} [attachment=ATTACHMENT.COLOR_ATTACHMENT0] - The attachment point to detach.\n\t\t * @returns {OffscreenRenderTarget} Self for chaining.\n\t\t */\n\t\tdetach(attachment = ATTACHMENT.COLOR_ATTACHMENT0) {\n\t\t\tdelete this._attachments[attachment];\n\t\t\treturn this;\n\t\t}\n\n\t\t/**\n\t\t * Get the attached attachment at the specified attachment point.\n\t\t * @param\t{ATTACHMENT} [attachment=ATTACHMENT.COLOR_ATTACHMENT0] - The attachment point.\n\t\t * @returns {TextureBase|RenderBuffer|null} The attached texture or renderbuffer.\n\t\t */\n\t\tgetAttachment(attachment = ATTACHMENT.COLOR_ATTACHMENT0) {\n\t\t\treturn this._attachments[attachment] || null;\n\t\t}\n\n\t\t/**\n\t\t * The main texture attachment which is the first color attachment.\n\t\t * @type {TextureBase|null}\n\t\t */\n\t\tset texture(texture) {\n\t\t\tif (texture && texture.isTexture) {\n\t\t\t\tthis.attach(texture, ATTACHMENT.COLOR_ATTACHMENT0);\n\t\t\t} else {\n\t\t\t\tthis.detach(ATTACHMENT.COLOR_ATTACHMENT0);\n\t\t\t}\n\t\t}\n\t\tget texture() {\n\t\t\tconst target = this._attachments[ATTACHMENT.COLOR_ATTACHMENT0];\n\t\t\treturn target && target.isTexture ? target : null;\n\t\t}\n\n\t\t/**\n\t\t * An alias for {@link OffscreenRenderTarget#activeLayer}. Specifically represents\n\t\t * the currently rendered cube face (0-5) when using cube textures.\n\t\t * @type {number}\n\t\t */\n\t\tset activeCubeFace(value) {\n\t\t\tthis.activeLayer = value;\n\t\t}\n\t\tget activeCubeFace() {\n\t\t\treturn this.activeLayer;\n\t\t}\n\n\t\t/**\n\t\t * Create a simple offscreen render target with a color texture and\n\t\t * a depth-stencil renderbuffer.\n\t\t * @param {number} width - The width of the render target.\n\t\t * @param {number} height - The height of the render target.\n\t\t * @returns {OffscreenRenderTarget} The created offscreen render target.\n\t\t */\n\t\tstatic create2D(width, height) {\n\t\t\tconst renderTarget = new OffscreenRenderTarget(width, height);\n\t\t\trenderTarget.attach(new Texture2D(), ATTACHMENT.COLOR_ATTACHMENT0);\n\t\t\trenderTarget.attach(new RenderBuffer(width, height, PIXEL_FORMAT.DEPTH_STENCIL), ATTACHMENT.DEPTH_STENCIL_ATTACHMENT);\n\t\t\treturn renderTarget;\n\t\t}\n\n\t\t/**\n\t\t * Create a simple offscreen render target with a cube color texture and\n\t\t * a depth-stencil renderbuffer.\n\t\t * @param {number} width - The width of the render target.\n\t\t * @param {number} height - The height of the render target.\n\t\t * @returns {OffscreenRenderTarget} The created offscreen render target.\n\t\t */\n\t\tstatic createCube(width, height) {\n\t\t\tconst renderTarget = new OffscreenRenderTarget(width, height);\n\t\t\trenderTarget.attach(new TextureCube(), ATTACHMENT.COLOR_ATTACHMENT0);\n\t\t\trenderTarget.attach(new RenderBuffer(width, height, PIXEL_FORMAT.DEPTH_STENCIL), ATTACHMENT.DEPTH_STENCIL_ATTACHMENT);\n\t\t\treturn renderTarget;\n\t\t}\n\n\t\t/**\n\t\t * Create a simple offscreen render target with a 3D color texture.\n\t\t * Note: No depth-stencil attachment is created by default.\n\t\t * @param {number} width - The width of the render target.\n\t\t * @param {number} height - The height of the render target.\n\t\t * @param {number} depth - The depth of the 3D texture.\n\t\t * @returns {OffscreenRenderTarget} The created offscreen render target.\n\t\t */\n\t\tstatic create3D(width, height, depth) {\n\t\t\tconst renderTarget = new OffscreenRenderTarget(width, height);\n\t\t\tconst texture = new Texture3D();\n\t\t\ttexture.resizeAsAttachment(width, height, depth);\n\t\t\trenderTarget.attach(texture, ATTACHMENT.COLOR_ATTACHMENT0);\n\t\t\treturn renderTarget;\n\t\t}\n\n\t\t/**\n\t\t * Create a simple offscreen render target with a 2D array color texture.\n\t\t * Note: No depth-stencil attachment is created by default.\n\t\t * @param {number} width - The width of the render target.\n\t\t * @param {number} height - The height of the render target.\n\t\t * @param {number} depth - The depth of the 2D array texture (number of layers).\n\t\t * @returns {OffscreenRenderTarget} The created offscreen render target.\n\t\t */\n\t\tstatic create2DArray(width, height, depth) {\n\t\t\tconst renderTarget = new OffscreenRenderTarget(width, height);\n\t\t\tconst texture = new Texture2DArray();\n\t\t\ttexture.resizeAsAttachment(width, height, depth);\n\t\t\trenderTarget.attach(texture, ATTACHMENT.COLOR_ATTACHMENT0);\n\t\t\treturn renderTarget;\n\t\t}\n\t}\n\n\t/**\n\t * This flag can be used for type testing.\n\t * @readonly\n\t * @type {boolean}\n\t * @default true\n\t */\n\tOffscreenRenderTarget.prototype.isOffscreenRenderTarget = true;\n\n\t/**\n\t * Render Target that render to screen (canvas).\n\t * @extends RenderTargetBase\n\t */\n\tclass ScreenRenderTarget extends RenderTargetBase {\n\t\t/**\n\t\t * Create a new ScreenRenderTarget.\n\t\t * @param {HTMLCanvasElement} view - The canvas element which the Render Target rendered to.\n\t\t */\n\t\tconstructor(view) {\n\t\t\tsuper(view.width, view.height);\n\n\t\t\t/**\n\t\t\t * The canvas element which the Render Target rendered to.\n\t\t\t * @type {HTMLCanvasElement}\n\t\t\t */\n\t\t\tthis.view = view;\n\t\t}\n\n\t\t/**\n\t\t * Resizes the render target to the specified dimensions.\n\t\t * This method will set the width and height properties of the canvas.\n\t\t * @param {number} width - The width of the render target.\n\t\t * @param {number} height - The height of the render target.\n\t\t */\n\t\tresize(width, height) {\n\t\t\tthis.view.width = width;\n\t\t\tthis.view.height = height;\n\t\t\tthis.width = width;\n\t\t\tthis.height = height;\n\t\t}\n\n\t\t/**\n\t\t * Dispatches a dispose event.\n\t\t */\n\t\tdispose() {\n\t\t\tthis.dispatchEvent({\n\t\t\t\ttype: 'dispose'\n\t\t\t});\n\t\t}\n\t}\n\n\t/**\n\t * This flag can be used for type testing.\n\t * @readonly\n\t * @type {boolean}\n\t * @default true\n\t */\n\tScreenRenderTarget.prototype.isScreenRenderTarget = true;\n\n\tlet _querySetId = 0;\n\n\t/**\n\t * A QuerySet holds a set of queries of a particular type.\n\t * @extends EventDispatcher\n\t */\n\tclass QuerySet extends EventDispatcher {\n\t\t/**\n\t\t * Creates a new QuerySet.\n\t\t * @param {QUERYSET_TYPE} type - The type of the query set.\n\t\t * @param {number} count - The number of queries in the set.\n\t\t */\n\t\tconstructor(type, count) {\n\t\t\tsuper();\n\n\t\t\t/**\n\t\t\t * Unique number for this query set instance.\n\t\t\t * @readonly\n\t\t\t * @type {number}\n\t\t\t */\n\t\t\tthis.id = _querySetId++;\n\n\t\t\t/**\n\t\t\t * The name of the query set.\n\t\t\t * @type {string}\n\t\t\t * @default \"\"\n\t\t\t */\n\t\t\tthis.name = '';\n\n\t\t\t/**\n\t\t\t * The type of the query set.\n\t\t\t * @readonly\n\t\t\t * @type {QUERYSET_TYPE}\n\t\t\t */\n\t\t\tthis.type = type;\n\n\t\t\t/**\n\t\t\t * The max number of queries in the set.\n\t\t\t * @readonly\n\t\t\t * @type {number}\n\t\t\t */\n\t\t\tthis.count = count;\n\n\t\t\t/**\n\t\t\t * Indicates whether the query set operates in conservative mode.\n\t\t\t * This property only applies to occlusion query sets in WebGL renderer.\n\t\t\t * @type {boolean}\n\t\t\t * @default true\n\t\t\t */\n\t\t\tthis.conservative = true;\n\t\t}\n\n\t\t/**\n\t\t * Dispose this query set.\n\t\t */\n\t\tdispose() {\n\t\t\tthis.dispatchEvent({\n\t\t\t\ttype: 'dispose'\n\t\t\t});\n\t\t}\n\t}\n\n\t/**\n\t * This class is designed to assist with raycasting. Raycasting is used for\n\t * mouse picking (working out what objects in the 3d space the mouse is over)\n\t * amongst other things.\n\t */\n\tclass Raycaster {\n\t\t/**\n\t\t * Constructs a new raycaster.\n\t\t * @param {Vector3} origin — The origin vector where the ray casts from.\n\t\t * @param {Vector3} direction — The (normalized) direction vector that gives direction to the ray.\n\t\t */\n\t\tconstructor(origin, direction) {\n\t\t\t/**\n\t\t\t * The ray used for raycasting.\n\t\t\t * @type {Ray}\n\t\t\t */\n\t\t\tthis.ray = new Ray(origin, direction);\n\t\t}\n\n\t\t/**\n\t\t * Updates the ray with a new origin and direction by copying the values from the arguments.\n\t\t * @param {Vector3} origin — The origin vector where the ray casts from.\n\t\t * @param {Vector3} direction — The (normalized) direction vector that gives direction to the ray.\n\t\t */\n\t\tset(origin, direction) {\n\t\t\t// direction is assumed to be normalized (for accurate distance calculations)\n\t\t\tthis.ray.set(origin, direction);\n\t\t}\n\n\t\t/**\n\t\t * Uses the given coordinates and camera to compute a new origin and direction for the internal ray.\n\t\t * @param {Vector2} coords — 2D coordinates of the mouse, in normalized device coordinates (NDC).\n\t\t * X and Y components should be between `-1` and `1`.\n\t\t * @param {Camera} camera — The camera from which the ray should originate.\n\t\t */\n\t\tsetFromCamera(coords, camera) {\n\t\t\tif (camera.projectionMatrix.elements[11] === -1) {\n\t\t\t\t// perspective\n\t\t\t\tthis.ray.origin.setFromMatrixPosition(camera.worldMatrix);\n\t\t\t\tthis.ray.direction.set(coords.x, coords.y, 0.5).unproject(camera).sub(this.ray.origin).normalize();\n\t\t\t} else {\n\t\t\t\t// orthographic\n\t\t\t\t// set origin in plane of camera\n\t\t\t\t// projectionMatrix.elements[14] = (near + far) / (near - far)\n\t\t\t\tthis.ray.origin.set(coords.x, coords.y, camera.projectionMatrix.elements[14]).unproject(camera);\n\t\t\t\tthis.ray.direction.set(0, 0, -1).transformDirection(camera.worldMatrix);\n\t\t\t}\n\t\t}\n\n\t\t/**\n\t\t * Checks all intersection between the ray and the object with or without the\n\t\t * descendants. Intersections are returned sorted by distance, closest first.\n\t\t * An array of intersections is returned: [ { distance, point, face, faceIndex, object, uv }, ... ]\n\t\t * @param {Object3D} object — The 3D object to check for intersection with the ray.\n\t\t * @param {boolean} [recursive=false] — If set to `true`, it also checks all descendants.\n\t\t * Otherwise it only checks intersection with the object.\n\t\t * @param {object[]} [intersects=[]] - The target array that holds the result of the method.\n\t\t * @returns {object[]} An array holding the intersection points.\n\t\t */\n\t\tintersectObject(object, recursive = false, intersects = []) {\n\t\t\tintersect(object, this, intersects, recursive);\n\t\t\tintersects.sort(ascSort);\n\t\t\treturn intersects;\n\t\t}\n\n\t\t/**\n\t\t * Checks all intersection between the ray and the objects with or without\n\t\t * the descendants. Intersections are returned sorted by distance, closest first.\n\t\t * An array of intersections is returned: [ { distance, point, face, faceIndex, object, uv }, ... ]\n\t\t * @param {Object3D[]} objects — The 3D objects to check for intersection with the ray.\n\t\t * @param {boolean} [recursive=false] — If set to `true`, it also checks all descendants.\n\t\t * Otherwise it only checks intersection with the object.\n\t\t * @param {object[]} [intersects=[]] - The target array that holds the result of the method.\n\t\t * @returns {object[]} An array holding the intersection points.\n\t\t */\n\t\tintersectObjects(objects, recursive = false, intersects = []) {\n\t\t\tfor (let i = 0, l = objects.length; i < l; i++) {\n\t\t\t\tintersect(objects[i], this, intersects, recursive);\n\t\t\t}\n\t\t\tintersects.sort(ascSort);\n\t\t\treturn intersects;\n\t\t}\n\t}\n\tfunction ascSort(a, b) {\n\t\treturn a.distance - b.distance;\n\t}\n\tfunction intersect(object, raycaster, intersects, recursive) {\n\t\tlet propagate = true;\n\t\tconst result = object.raycast(raycaster.ray, intersects);\n\t\tif (result === false) propagate = false;\n\t\tif (propagate === true && recursive === true) {\n\t\t\tconst children = object.children;\n\t\t\tfor (let i = 0, l = children.length; i < l; i++) {\n\t\t\t\tintersect(children[i], raycaster, intersects, true);\n\t\t\t}\n\t\t}\n\t}\n\n\tconst _offsetMatrix = new Matrix4();\n\n\t/**\n\t * Use an array of bones to create a skeleton that can be used by a {@link SkinnedMesh}.\n\t */\n\tclass Skeleton {\n\t\t/**\n\t\t * @param {Bone[]} bones\n\t\t * @param {Matrix4[]} boneInverses\n\t\t */\n\t\tconstructor(bones, boneInverses) {\n\t\t\t/**\n\t\t\t * The array of bones.\n\t\t\t * @type {Bone[]}\n\t\t\t */\n\t\t\tthis.bones = bones.slice(0);\n\n\t\t\t/**\n\t\t\t * An array of Matrix4s that represent the inverse of the worldMatrix of the individual bones.\n\t\t\t * @type {Matrix4[]}\n\t\t\t */\n\t\t\tthis.boneInverses = boneInverses;\n\n\t\t\t/**\n\t\t\t * The array buffer holding the bone data.\n\t\t\t * @type {Float32Array}\n\t\t\t */\n\t\t\tthis.boneMatrices = new Float32Array(16 * this.bones.length);\n\n\t\t\t/**\n\t\t\t * The {@link Texture2D} holding the bone data when using a vertex texture.\n\t\t\t * Use vertex texture to update boneMatrices, by that way, we can use more bones on phone.\n\t\t\t * @type {Texture2D|undefined}\n\t\t\t * @default undefined\n\t\t\t */\n\t\t\tthis.boneTexture = undefined;\n\t\t\tthis._version = 0;\n\t\t}\n\n\t\t/**\n\t\t * Returns the skeleton to the base pose.\n\t\t */\n\t\tpose() {\n\t\t\tconst boneInverses = this.boneInverses;\n\t\t\tfor (let i = 0; i < this.bones.length; i++) {\n\t\t\t\tconst bone = this.bones[i];\n\t\t\t\tbone.worldMatrix.copy(boneInverses[i]).invert();\n\t\t\t}\n\t\t\tfor (let i = 0; i < this.bones.length; i++) {\n\t\t\t\tconst bone = this.bones[i];\n\t\t\t\tif (bone.parent && bone.parent.isBone) {\n\t\t\t\t\tbone.matrix.copy(bone.parent.worldMatrix).invert();\n\t\t\t\t\tbone.matrix.multiply(bone.worldMatrix);\n\t\t\t\t} else {\n\t\t\t\t\tbone.matrix.copy(bone.worldMatrix);\n\t\t\t\t}\n\t\t\t\tbone.matrix.decompose(bone.position, bone.quaternion, bone.scale);\n\t\t\t}\n\t\t}\n\n\t\t/**\n\t\t * Clone skeleton.\n\t\t * @returns {Skeleton}\n\t\t */\n\t\tclone() {\n\t\t\treturn new Skeleton(this.bones, this.boneInverses);\n\t\t}\n\n\t\t/**\n\t\t * Updates the boneMatrices and boneTexture after changing the bones.\n\t\t * This is called automatically if the skeleton is used with a SkinnedMesh.\n\t\t * @ignore\n\t\t */\n\t\tupdateBones(sceneData) {\n\t\t\tconst useAnchorMatrix = sceneData.useAnchorMatrix;\n\t\t\tconst anchorMatrixInverse = sceneData.anchorMatrixInverse;\n\t\t\tconst boneInverses = this.boneInverses;\n\t\t\tfor (let i = 0; i < this.bones.length; i++) {\n\t\t\t\tconst bone = this.bones[i];\n\t\t\t\t_offsetMatrix.multiplyMatrices(bone.worldMatrix, boneInverses[i]);\n\t\t\t\tif (useAnchorMatrix) {\n\t\t\t\t\t_offsetMatrix.premultiply(anchorMatrixInverse);\n\t\t\t\t}\n\t\t\t\t_offsetMatrix.toArray(this.boneMatrices, i * 16);\n\t\t\t}\n\t\t\tif (this.boneTexture !== undefined) {\n\t\t\t\tthis.boneTexture.version++;\n\t\t\t}\n\t\t}\n\t\tgenerateBoneTexture() {\n\t\t\tlet size = MathUtils.nextPowerOfTwoSquareSize(this.bones.length * 4);\n\t\t\tsize = Math.max(size, 4);\n\t\t\tconst boneMatrices = new Float32Array(size * size * 4);\n\t\t\tboneMatrices.set(this.boneMatrices);\n\t\t\tconst boneTexture = new Texture2D();\n\t\t\tboneTexture.image = {\n\t\t\t\tdata: boneMatrices,\n\t\t\t\twidth: size,\n\t\t\t\theight: size\n\t\t\t};\n\t\t\tboneTexture.format = PIXEL_FORMAT.RGBA;\n\t\t\tboneTexture.type = PIXEL_TYPE.FLOAT;\n\t\t\tboneTexture.magFilter = TEXTURE_FILTER.NEAREST;\n\t\t\tboneTexture.minFilter = TEXTURE_FILTER.NEAREST;\n\t\t\tboneTexture.generateMipmaps = false;\n\t\t\tboneTexture.flipY = false;\n\t\t\tthis.boneMatrices = boneMatrices;\n\t\t\tthis.boneTexture = boneTexture;\n\t\t}\n\t}\n\n\t/**\n\t * This light globally illuminates all objects in the scene equally.\n\t * This light cannot be used to cast shadows as it does not have a direction.\n\t * @extends Light\n\t */\n\tclass AmbientLight extends Light {\n\t\t/**\n\t\t * @param {number} [color=0xffffff]\n\t\t * @param {number} [intensity=1]\n\t\t */\n\t\tconstructor(color, intensity) {\n\t\t\tsuper(color, intensity);\n\t\t}\n\t}\n\n\t/**\n\t * This flag can be used for type testing.\n\t * @readonly\n\t * @type {boolean}\n\t * @default true\n\t */\n\tAmbientLight.prototype.isAmbientLight = true;\n\n\t/**\n\t * Serves as a base class for the other shadow classes.\n\t * @abstract\n\t */\n\tclass LightShadow {\n\t\tconstructor() {\n\t\t\t/**\n\t\t\t * The light's view of the world.\n\t\t\t * This is used to generate a depth map of the scene; objects behind other objects from the light's perspective will be in shadow.\n\t\t\t * @type {Camera}\n\t\t\t */\n\t\t\tthis.camera = new Camera();\n\n\t\t\t/**\n\t\t\t * Model to shadow camera space, to compute location and depth in shadow map. Stored in a {@link Matrix4}.\n\t\t\t * This is computed internally during rendering.\n\t\t\t * @type {Matrix4}\n\t\t\t */\n\t\t\tthis.matrix = new Matrix4();\n\n\t\t\t/**\n\t\t\t * Shadow map bias, how much to add or subtract from the normalized depth when deciding whether a surface is in shadow.\n\t\t\t * Very tiny adjustments here (in the order of 0.0001) may help reduce artefacts in shadows.\n\t\t\t * @type {number}\n\t\t\t * @default 0\n\t\t\t */\n\t\t\tthis.bias = 0;\n\n\t\t\t/**\n\t\t\t * Defines how much the position used to query the shadow map is offset along the object normal.\n\t\t\t * Increasing this value can be used to reduce shadow acne especially in large scenes where light shines onto geometry at a shallow angle.\n\t\t\t * The cost is that shadows may appear distorted.\n\t\t\t * @type {number}\n\t\t\t * @default 0\n\t\t\t */\n\t\t\tthis.normalBias = 0;\n\n\t\t\t/**\n\t\t\t * Setting this to values greater than 1 will blur the edges of the shadow.\n\t\t\t * High values will cause unwanted banding effects in the shadows - a greater mapSize will allow for a higher value to be used here before these effects become visible.\n\t\t\t * Note that this has no effect if the {@link Object3D#shadowType} is set to PCF or PCSS.\n\t\t\t * @type {number}\n\t\t\t * @default 1\n\t\t\t */\n\t\t\tthis.radius = 1;\n\n\t\t\t/**\n\t\t\t * Shadow camera near.\n\t\t\t * @type {number}\n\t\t\t * @default 1\n\t\t\t */\n\t\t\tthis.cameraNear = 1;\n\n\t\t\t/**\n\t\t\t * Shadow camera far.\n\t\t\t * @type {number}\n\t\t\t * @default 500\n\t\t\t */\n\t\t\tthis.cameraFar = 500;\n\n\t\t\t/**\n\t\t\t * A {@link Vector2} defining the width and height of the shadow map.\n\t\t\t * Higher values give better quality shadows at the cost of computation time.\n\t\t\t * Values must be powers of 2.\n\t\t\t * @type {Vector2}\n\t\t\t * @default Vector2(512, 512)\n\t\t\t */\n\t\t\tthis.mapSize = new Vector2(512, 512);\n\n\t\t\t/**\n\t\t\t * Enables automatic updates of the light's shadow.\n\t\t\t * If you do not require dynamic lighting / shadows, you may set this to false.\n\t\t\t * @type {boolean}\n\t\t\t * @default true\n\t\t\t */\n\t\t\tthis.autoUpdate = true;\n\n\t\t\t/**\n\t\t\t * When set to true, shadow maps will be updated in the next ShadowMapPass.render call.\n\t\t\t * If you have set .autoUpdate to false, you will need to set this property to true and then make a ShadowMapPass.render call to update the light's shadow.\n\t\t\t * @type {boolean}\n\t\t\t * @default false\n\t\t\t */\n\t\t\tthis.needsUpdate = false;\n\t\t\tthis.renderTarget = null;\n\t\t\tthis.map = null;\n\t\t\tthis.depthMap = null;\n\t\t}\n\t\tupdate(light, face) {}\n\t\tupdateMatrix() {\n\t\t\tconst matrix = this.matrix;\n\t\t\tconst camera = this.camera;\n\n\t\t\t// matrix * 0.5 + 0.5, after identity, range is 0 ~ 1 instead of -1 ~ 1\n\t\t\tmatrix.set(0.5, 0.0, 0.0, 0.5, 0.0, 0.5, 0.0, 0.5, 0.0, 0.0, 0.5, 0.5, 0.0, 0.0, 0.0, 1.0);\n\t\t\tmatrix.multiply(camera.projectionMatrix);\n\t\t\tmatrix.multiply(camera.viewMatrix);\n\t\t}\n\t\tcopy(source) {\n\t\t\tthis.camera.copy(source.camera);\n\t\t\tthis.matrix.copy(source.matrix);\n\t\t\tthis.bias = source.bias;\n\t\t\tthis.normalBias = source.normalBias;\n\t\t\tthis.radius = source.radius;\n\t\t\tthis.cameraNear = source.cameraNear;\n\t\t\tthis.cameraFar = source.cameraFar;\n\t\t\tthis.mapSize.copy(source.mapSize);\n\t\t\treturn this;\n\t\t}\n\t\tclone() {\n\t\t\treturn new this.constructor().copy(this);\n\t\t}\n\t\tprepareDepthMap(_enable, _capabilities) {}\n\t}\n\n\t/**\n\t * This is used internally by DirectionalLights for calculating shadows.\n\t * @extends LightShadow\n\t */\n\tclass DirectionalLightShadow extends LightShadow {\n\t\tconstructor() {\n\t\t\tsuper();\n\n\t\t\t/**\n\t\t\t * The cast shadow window size.\n\t\t\t * @type {number}\n\t\t\t * @default 500\n\t\t\t */\n\t\t\tthis.windowSize = 500;\n\n\t\t\t/**\n\t\t\t * Controls the extent to which the shadows fade out at the edge of the frustum.\n\t\t\t * If the value is greater than 0, the shadow fades out from center to all sides of shadow texture (radial fade out),\n\t\t\t * if the value is less than 0, the shadow will fade out from the y+ direction (vertical fade out).\n\t\t\t * @type {number}\n\t\t\t * @default 0\n\t\t\t */\n\t\t\tthis.frustumEdgeFalloff = 0.0;\n\t\t\tthis.renderTarget = OffscreenRenderTarget.create2D(this.mapSize.x, this.mapSize.y);\n\t\t\tconst map = this.renderTarget.texture;\n\t\t\tmap.generateMipmaps = false;\n\t\t\tmap.minFilter = TEXTURE_FILTER.NEAREST;\n\t\t\tmap.magFilter = TEXTURE_FILTER.NEAREST;\n\t\t\tconst depthTexture = new Texture2D();\n\t\t\tdepthTexture.type = PIXEL_TYPE.UNSIGNED_INT;\n\t\t\tdepthTexture.format = PIXEL_FORMAT.DEPTH_COMPONENT;\n\t\t\tdepthTexture.magFilter = TEXTURE_FILTER.LINEAR;\n\t\t\tdepthTexture.minFilter = TEXTURE_FILTER.LINEAR;\n\t\t\tdepthTexture.compare = COMPARE_FUNC.LESS;\n\t\t\tdepthTexture.generateMipmaps = false;\n\t\t\tconst depthBuffer = new RenderBuffer(this.mapSize.x, this.mapSize.y, PIXEL_FORMAT.DEPTH_COMPONENT16);\n\t\t\tthis.renderTarget.detach(ATTACHMENT.DEPTH_STENCIL_ATTACHMENT);\n\t\t\tthis.renderTarget.attach(depthBuffer, ATTACHMENT.DEPTH_ATTACHMENT);\n\t\t\tthis.map = map;\n\t\t\tthis.depthMap = depthTexture;\n\t\t\tthis._depthBuffer = depthBuffer;\n\t\t}\n\t\tupdate(light) {\n\t\t\tthis._updateCamera(light);\n\t\t\tif (this.mapSize.x !== this.renderTarget.width || this.mapSize.y !== this.renderTarget.height) {\n\t\t\t\tthis.renderTarget.resize(this.mapSize.x, this.mapSize.y);\n\t\t\t}\n\t\t}\n\t\t_updateCamera(light) {\n\t\t\tconst camera = this.camera;\n\t\t\tcamera.matrix.copy(light.worldMatrix);\n\t\t\tcamera.matrix.decompose(camera.position, camera.quaternion, camera.scale);\n\t\t\tcamera.updateMatrix();\n\t\t\tconst halfWindowSize = this.windowSize / 2;\n\t\t\tcamera.setOrtho(-halfWindowSize, halfWindowSize, -halfWindowSize, halfWindowSize, this.cameraNear, this.cameraFar);\n\t\t}\n\t\tcopy(source) {\n\t\t\tsuper.copy(source);\n\t\t\tthis.windowSize = source.windowSize;\n\t\t\tthis.frustumEdgeFalloff = source.frustumEdgeFalloff;\n\t\t\treturn this;\n\t\t}\n\t\tprepareDepthMap(enable, capabilities) {\n\t\t\tconst useDepthMap = enable && capabilities.version >= 2;\n\t\t\tconst renderTarget = this.renderTarget;\n\t\t\tconst attachments = renderTarget._attachments;\n\t\t\tconst depthMapAttached = attachments[ATTACHMENT.DEPTH_ATTACHMENT] === this.depthMap;\n\t\t\tif (useDepthMap === depthMapAttached) return;\n\t\t\tif (useDepthMap) {\n\t\t\t\tif (capabilities.getExtension('OES_texture_float_linear')) {\n\t\t\t\t\tthis.depthMap.type = PIXEL_TYPE.FLOAT;\n\t\t\t\t}\n\t\t\t\trenderTarget.dispose();\n\t\t\t\trenderTarget.attach(this.depthMap, ATTACHMENT.DEPTH_ATTACHMENT);\n\t\t\t} else {\n\t\t\t\trenderTarget.dispose();\n\t\t\t\trenderTarget.attach(this._depthBuffer, ATTACHMENT.DEPTH_ATTACHMENT);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * A light that gets emitted in a specific direction.\n\t * This light will behave as though it is infinitely far away and the rays produced from it are all parallel.\n\t * The common use case for this is to simulate daylight; the sun is far enough away that its position can be considered to be infinite, and all light rays coming from it are parallel.\n\t * This light can cast shadows - see the {@link DirectionalLightShadow} page for details.\n\t * @extends Light\n\t */\n\tclass DirectionalLight extends Light {\n\t\t/**\n\t\t * @param {number} [color=0xffffff]\n\t\t * @param {number} [intensity=1]\n\t\t */\n\t\tconstructor(color, intensity) {\n\t\t\tsuper(color, intensity);\n\n\t\t\t/**\n\t\t\t * A {@link DirectionalLightShadow} used to calculate shadows for this light.\n\t\t\t * @type {DirectionalLightShadow}\n\t\t\t * @default DirectionalLightShadow()\n\t\t\t */\n\t\t\tthis.shadow = new DirectionalLightShadow();\n\t\t}\n\t\tcopy(source) {\n\t\t\tsuper.copy(source);\n\t\t\tthis.shadow.copy(source.shadow);\n\t\t\treturn this;\n\t\t}\n\t}\n\n\t/**\n\t * This flag can be used for type testing.\n\t * @readonly\n\t * @type {boolean}\n\t * @default true\n\t */\n\tDirectionalLight.prototype.isDirectionalLight = true;\n\n\t/**\n\t * A light source positioned directly above the scene, with color fading from the sky color to the ground color.\n\t * This light cannot be used to cast shadows.\n\t * @extends Light\n\t */\n\tclass HemisphereLight extends Light {\n\t\t/**\n\t\t * @param {number} [skyColor=0xffffff] - Hexadecimal color of the sky.\n\t\t * @param {number} [groundColor=0xffffff] - Hexadecimal color of the ground.\n\t\t * @param {number} [intensity=1] - numeric value of the light's strength/intensity.\n\t\t */\n\t\tconstructor(skyColor, groundColor, intensity) {\n\t\t\tsuper(skyColor, intensity);\n\n\t\t\t/**\n\t\t\t * Color of the ground.\n\t\t\t * @type {Color3}\n\t\t\t * @default Color3(0xffffff)\n\t\t\t */\n\t\t\tthis.groundColor = new Color3(groundColor !== undefined ? groundColor : 0xffffff);\n\t\t}\n\t\tcopy(source) {\n\t\t\tsuper.copy(source);\n\t\t\tthis.groundColor.copy(source.groundColor);\n\t\t}\n\t}\n\n\t/**\n\t * This flag can be used for type testing.\n\t * @readonly\n\t * @type {boolean}\n\t * @default true\n\t */\n\tHemisphereLight.prototype.isHemisphereLight = true;\n\n\t/**\n\t * This is used internally by PointLights for calculating shadows.\n\t * @extends LightShadow\n\t */\n\tclass PointLightShadow extends LightShadow {\n\t\tconstructor() {\n\t\t\tsuper();\n\t\t\tthis.renderTarget = OffscreenRenderTarget.createCube(this.mapSize.x, this.mapSize.y);\n\t\t\tconst map = this.renderTarget.texture;\n\t\t\tmap.generateMipmaps = false;\n\t\t\tmap.minFilter = TEXTURE_FILTER.NEAREST;\n\t\t\tmap.magFilter = TEXTURE_FILTER.NEAREST;\n\t\t\tthis.map = map;\n\t\t\tthis._targets = [new Vector3(1, 0, 0), new Vector3(-1, 0, 0), new Vector3(0, 1, 0), new Vector3(0, -1, 0), new Vector3(0, 0, 1), new Vector3(0, 0, -1)];\n\t\t\tthis._ups = [new Vector3(0, -1, 0), new Vector3(0, -1, 0), new Vector3(0, 0, 1), new Vector3(0, 0, -1), new Vector3(0, -1, 0), new Vector3(0, -1, 0)];\n\t\t\tthis._lookTarget = new Vector3();\n\t\t}\n\t\tupdate(light, face) {\n\t\t\tthis._updateCamera(light, face);\n\t\t\tif (this.mapSize.x !== this.renderTarget.width || this.mapSize.y !== this.renderTarget.height) {\n\t\t\t\tthis.renderTarget.resize(this.mapSize.x, this.mapSize.y);\n\t\t\t}\n\t\t}\n\t\t_updateCamera(light, face) {\n\t\t\tconst camera = this.camera;\n\t\t\tconst lookTarget = this._lookTarget;\n\t\t\tconst targets = this._targets;\n\t\t\tconst ups = this._ups;\n\n\t\t\t// set camera position and lookAt(rotation)\n\t\t\tcamera.position.setFromMatrixPosition(light.worldMatrix);\n\t\t\tlookTarget.set(targets[face].x + camera.position.x, targets[face].y + camera.position.y, targets[face].z + camera.position.z);\n\t\t\tcamera.lookAt(lookTarget, ups[face]);\n\n\t\t\t// update view matrix\n\t\t\tcamera.updateMatrix();\n\n\t\t\t// update projection\n\t\t\tcamera.setPerspective(90 / 180 * Math.PI, 1, this.cameraNear, this.cameraFar);\n\t\t}\n\t}\n\n\t/**\n\t * A light that gets emitted from a single point in all directions.\n\t * A common use case for this is to replicate the light emitted from a bare lightbulb.\n\t * This light can cast shadows - see {@link PointLightShadow} page for details.\n\t * @extends Light\n\t */\n\tclass PointLight extends Light {\n\t\t/**\n\t\t * @param {number} [color=0xffffff]\n\t\t * @param {number} [intensity=1]\n\t\t * @param {number} [distance=200]\n\t\t * @param {number} [decay=1]\n\t\t */\n\t\tconstructor(color, intensity, distance, decay) {\n\t\t\tsuper(color, intensity);\n\n\t\t\t/**\n\t\t\t * The amount the light dims along the distance of the light.\n\t\t\t * @type {number}\n\t\t\t * @default 1\n\t\t\t */\n\t\t\tthis.decay = decay !== undefined ? decay : 1;\n\n\t\t\t/**\n\t\t\t * The distance from the light where the intensity is 0.\n\t\t\t * @type {number}\n\t\t\t * @default 200\n\t\t\t */\n\t\t\tthis.distance = distance !== undefined ? distance : 200;\n\n\t\t\t/**\n\t\t\t * A {@link PointLightShadow} used to calculate shadows for this light.\n\t\t\t * @type {PointLightShadow}\n\t\t\t * @default PointLightShadow()\n\t\t\t */\n\t\t\tthis.shadow = new PointLightShadow();\n\t\t}\n\t\tcopy(source) {\n\t\t\tsuper.copy(source);\n\t\t\tthis.shadow.copy(source.shadow);\n\t\t\treturn this;\n\t\t}\n\t}\n\n\t/**\n\t * This flag can be used for type testing.\n\t * @readonly\n\t * @type {boolean}\n\t * @default true\n\t */\n\tPointLight.prototype.isPointLight = true;\n\n\t/**\n\t * This light globally all objects in the scene equally.\n\t * This light depends on spherical harmonics.\n\t * @extends Light\n\t */\n\tclass SphericalHarmonicsLight extends Light {\n\t\t/**\n\t\t * Creates a new SphericalHarmonicsLight.\n\t\t * @param {SphericalHarmonics3} [sh = new SphericalHarmonics3()]\n\t\t * @param {number} [intensity = 1]\n\t\t */\n\t\tconstructor(sh = new SphericalHarmonics3(), intensity = 1) {\n\t\t\tsuper(undefined, intensity);\n\n\t\t\t/**\n\t\t\t * An instance of SphericalHarmonics3.\n\t\t\t * @type {SphericalHarmonics3}\n\t\t\t */\n\t\t\tthis.sh = sh;\n\t\t}\n\t\tcopy(source) {\n\t\t\tsuper.copy(source);\n\t\t\tthis.sh.copy(source.sh);\n\t\t\treturn this;\n\t\t}\n\t}\n\n\t/**\n\t * This flag can be used for type testing.\n\t * @readonly\n\t * @type {boolean}\n\t * @default true\n\t */\n\tSphericalHarmonicsLight.prototype.isSphericalHarmonicsLight = true;\n\n\t/**\n\t * This is used internally by SpotLights for calculating shadows.\n\t * @extends LightShadow\n\t */\n\tclass SpotLightShadow extends LightShadow {\n\t\tconstructor() {\n\t\t\tsuper();\n\n\t\t\t/**\n\t\t\t * Controls the extent to which the shadows fade out at the edge of the frustum.\n\t\t\t * @type {number}\n\t\t\t * @default 0\n\t\t\t */\n\t\t\tthis.frustumEdgeFalloff = 0.0;\n\t\t\tthis.renderTarget = OffscreenRenderTarget.create2D(this.mapSize.x, this.mapSize.y);\n\t\t\tconst map = this.renderTarget.texture;\n\t\t\tmap.generateMipmaps = false;\n\t\t\tmap.minFilter = TEXTURE_FILTER.NEAREST;\n\t\t\tmap.magFilter = TEXTURE_FILTER.NEAREST;\n\t\t\tconst depthTexture = new Texture2D();\n\t\t\tdepthTexture.type = PIXEL_TYPE.UNSIGNED_INT;\n\t\t\tdepthTexture.format = PIXEL_FORMAT.DEPTH_COMPONENT;\n\t\t\tdepthTexture.magFilter = TEXTURE_FILTER.LINEAR;\n\t\t\tdepthTexture.minFilter = TEXTURE_FILTER.LINEAR;\n\t\t\tdepthTexture.compare = COMPARE_FUNC.LESS;\n\t\t\tdepthTexture.generateMipmaps = false;\n\t\t\tconst depthBuffer = new RenderBuffer(this.mapSize.x, this.mapSize.y, PIXEL_FORMAT.DEPTH_COMPONENT16);\n\t\t\tthis.renderTarget.detach(ATTACHMENT.DEPTH_STENCIL_ATTACHMENT);\n\t\t\tthis.renderTarget.attach(depthBuffer, ATTACHMENT.DEPTH_ATTACHMENT);\n\t\t\tthis.map = map;\n\t\t\tthis.depthMap = depthTexture;\n\t\t\tthis._depthBuffer = depthBuffer;\n\t\t}\n\t\tupdate(light) {\n\t\t\tthis._updateCamera(light);\n\t\t\tif (this.mapSize.x !== this.renderTarget.width || this.mapSize.y !== this.renderTarget.height) {\n\t\t\t\tthis.renderTarget.resize(this.mapSize.x, this.mapSize.y);\n\t\t\t}\n\t\t}\n\t\t_updateCamera(light) {\n\t\t\tconst camera = this.camera;\n\t\t\tcamera.matrix.copy(light.worldMatrix);\n\t\t\tcamera.matrix.decompose(camera.position, camera.quaternion, camera.scale);\n\t\t\tcamera.updateMatrix();\n\t\t\tcamera.setPerspective(light.angle * 2, 1, this.cameraNear, this.cameraFar);\n\t\t}\n\t\tcopy(source) {\n\t\t\tsuper.copy(source);\n\t\t\tthis.frustumEdgeFalloff = source.frustumEdgeFalloff;\n\t\t\treturn this;\n\t\t}\n\t\tprepareDepthMap(enable, capabilities) {\n\t\t\tconst useDepthMap = enable && capabilities.version >= 2;\n\t\t\tconst renderTarget = this.renderTarget;\n\t\t\tconst attachments = renderTarget._attachments;\n\t\t\tconst depthMapAttached = attachments[ATTACHMENT.DEPTH_ATTACHMENT] === this.depthMap;\n\t\t\tif (useDepthMap === depthMapAttached) return;\n\t\t\tif (useDepthMap) {\n\t\t\t\tif (capabilities.getExtension('OES_texture_float_linear')) {\n\t\t\t\t\tthis.depthMap.type = PIXEL_TYPE.FLOAT;\n\t\t\t\t}\n\t\t\t\trenderTarget.dispose();\n\t\t\t\trenderTarget.attach(this.depthMap, ATTACHMENT.DEPTH_ATTACHMENT);\n\t\t\t} else {\n\t\t\t\trenderTarget.dispose();\n\t\t\t\trenderTarget.attach(this._depthBuffer, ATTACHMENT.DEPTH_ATTACHMENT);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * This light gets emitted from a single point in one direction, along a cone that increases in size the further from the light it gets.\n\t * This light can cast shadows - see the {@link SpotLightShadow} page for details.\n\t * @extends Light\n\t */\n\tclass SpotLight extends Light {\n\t\t/**\n\t\t * @param {number} [color=0xffffff]\n\t\t * @param {number} [intensity=1]\n\t\t * @param {number} [distance=200]\n\t\t * @param {number} [angle=Math.PI/6]\n\t\t * @param {number} [penumbra=0]\n\t\t * @param {number} [decay=1]\n\t\t */\n\t\tconstructor(color, intensity, distance, angle, penumbra, decay) {\n\t\t\tsuper(color, intensity);\n\n\t\t\t/**\n\t\t\t * The amount the light dims along the distance of the light.\n\t\t\t * @type {number}\n\t\t\t * @default 1\n\t\t\t */\n\t\t\tthis.decay = decay !== undefined ? decay : 1;\n\n\t\t\t/**\n\t\t\t * The distance from the light where the intensity is 0.\n\t\t\t * @type {number}\n\t\t\t * @default 200\n\t\t\t */\n\t\t\tthis.distance = distance !== undefined ? distance : 200;\n\n\t\t\t/**\n\t\t\t * Percent of the spotlight cone that is attenuated due to penumbra.\n\t\t\t * Takes values between zero and 1.\n\t\t\t * @type {number}\n\t\t\t * @default 0\n\t\t\t */\n\t\t\tthis.penumbra = penumbra !== undefined ? penumbra : 0;\n\n\t\t\t/**\n\t\t\t * Maximum extent of the spotlight, in radians, from its direction.\n\t\t\t * Should be no more than Math.PI/2.\n\t\t\t * @type {number}\n\t\t\t * @default Math.PI/6\n\t\t\t */\n\t\t\tthis.angle = angle !== undefined ? angle : Math.PI / 6;\n\n\t\t\t/**\n\t\t\t * A {@link SpotLightShadow} used to calculate shadows for this light.\n\t\t\t * @type {SpotLightShadow}\n\t\t\t * @default SpotLightShadow()\n\t\t\t */\n\t\t\tthis.shadow = new SpotLightShadow();\n\t\t}\n\t\tcopy(source) {\n\t\t\tsuper.copy(source);\n\t\t\tthis.shadow.copy(source.shadow);\n\t\t\treturn this;\n\t\t}\n\t}\n\n\t/**\n\t * This flag can be used for type testing.\n\t * @readonly\n\t * @type {boolean}\n\t * @default true\n\t */\n\tSpotLight.prototype.isSpotLight = true;\n\n\t/**\n\t * A bone which is part of a Skeleton.\n\t * The skeleton in turn is used by the SkinnedMesh.\n\t * Bones are almost identical to a blank Object3D.\n\t * Bone acturely is a joint.\n\t * The position means joint position.\n\t * Mesh transform is based this joint space.\n\t * @extends Object3D\n\t */\n\tclass Bone extends Object3D {\n\t\tconstructor() {\n\t\t\tsuper();\n\t\t}\n\t}\n\n\t/**\n\t * This flag can be used for type testing.\n\t * @readonly\n\t * @type {boolean}\n\t * @default true\n\t */\n\tBone.prototype.isBone = true;\n\n\t/**\n\t * A mesh that has a {@link Skeleton} with bones that can then be used to animate the vertices of the geometry.\n\t * The material must support skinning.\n\t * @extends Mesh\n\t */\n\tclass SkinnedMesh extends Mesh {\n\t\tconstructor(geometry, material) {\n\t\t\tsuper(geometry, material);\n\n\t\t\t/**\n\t\t\t * Skeleton created from the bones of the Geometry.\n\t\t\t * @type {Skeleton}\n\t\t\t */\n\t\t\tthis.skeleton = undefined;\n\n\t\t\t/**\n\t\t\t * Either \"attached\" or \"detached\".\n\t\t\t * \"attached\" uses the {@link SkinnedMesh#worldMatrix} property for the base transform matrix of the bones.\n\t\t\t * \"detached\" uses the {@link SkinnedMesh#bindMatrix}.\n\t\t\t * @type {string}\n\t\t\t * @default \"attached\"\n\t\t\t */\n\t\t\tthis.bindMode = 'attached';\n\n\t\t\t/**\n\t\t\t * The base matrix that is used for the bound bone transforms.\n\t\t\t * @type {Matrix4}\n\t\t\t */\n\t\t\tthis.bindMatrix = new Matrix4();\n\n\t\t\t/**\n\t\t\t * The base matrix that is used for resetting the bound bone transforms.\n\t\t\t * @type {Matrix4}\n\t\t\t */\n\t\t\tthis.bindMatrixInverse = new Matrix4();\n\t\t}\n\n\t\t/**\n\t\t * Bind a skeleton to the skinned mesh.\n\t\t * The bindMatrix gets saved to .bindMatrix property and the .bindMatrixInverse gets calculated.\n\t\t * @param {Skeleton} skeleton - Skeleton created from a Bones tree.\n\t\t * @param {Matrix4} [bindMatrix] - Matrix4 that represents the base transform of the skeleton.\n\t\t */\n\t\tbind(skeleton, bindMatrix) {\n\t\t\tthis.skeleton = skeleton;\n\t\t\tif (bindMatrix === undefined) {\n\t\t\t\tthis.updateMatrix();\n\t\t\t\tbindMatrix = this.worldMatrix;\n\t\t\t}\n\t\t\tthis.bindMatrix.copy(bindMatrix);\n\t\t\tthis.bindMatrixInverse.copy(bindMatrix).invert();\n\t\t}\n\t\tupdateMatrix(force) {\n\t\t\tsuper.updateMatrix(force);\n\t\t\tif (this.bindMode === 'attached') {\n\t\t\t\tthis.bindMatrixInverse.copy(this.worldMatrix).invert();\n\t\t\t} else if (this.bindMode === 'detached') {\n\t\t\t\tthis.bindMatrixInverse.copy(this.bindMatrix).invert();\n\t\t\t} else {\n\t\t\t\tconsole.warn('SkinnedMesh: Unrecognized bindMode: ' + this.bindMode);\n\t\t\t}\n\t\t}\n\t\tcopy(source) {\n\t\t\tsuper.copy(source);\n\t\t\tthis.bindMode = source.bindMode;\n\t\t\tthis.bindMatrix.copy(source.bindMatrix);\n\t\t\tthis.bindMatrixInverse.copy(source.bindMatrixInverse);\n\t\t\tthis.skeleton = source.skeleton;\n\t\t\treturn this;\n\t\t}\n\t\tgetVertexPosition(index, target) {\n\t\t\tsuper.getVertexPosition(index, target);\n\t\t\tthis.applyBoneTransform(index, target);\n\t\t\treturn target;\n\t\t}\n\n\t\t/**\n\t\t * Applies the bone transform associated with the given index to the given position vector.\n\t\t * Returns the updated vector.\n\t\t * @param {number} index - The index of the vertex.\n\t\t * @param {Vector3} target - The target vector.\n\t\t * @returns {Vector3} The target vector.\n\t\t */\n\t\tapplyBoneTransform(index, target) {\n\t\t\tconst skeleton = this.skeleton;\n\t\t\tconst geometry = this.geometry;\n\t\t\tconst skinIndex = geometry.attributes.skinIndex;\n\t\t\tconst skinWeight = geometry.attributes.skinWeight;\n\t\t\t_skinIndex.fromArray(skinIndex.buffer.array, index * skinIndex.size);\n\t\t\t_skinWeight.fromArray(skinWeight.buffer.array, index * skinWeight.size);\n\t\t\t_basePosition.copy(target).applyMatrix4(this.bindMatrix);\n\t\t\ttarget.set(0, 0, 0);\n\t\t\tfor (let i = 0; i < 4; i++) {\n\t\t\t\tconst weight = getComponent(_skinWeight, i);\n\t\t\t\tif (weight < Number.EPSILON) continue;\n\t\t\t\tconst boneIndex = getComponent(_skinIndex, i);\n\t\t\t\tif (!skeleton.bones[boneIndex]) continue;\n\t\t\t\t_matrix.multiplyMatrices(skeleton.bones[boneIndex].worldMatrix, skeleton.boneInverses[boneIndex]);\n\t\t\t\ttarget.addScaledVector(_vector.copy(_basePosition).applyMatrix4(_matrix), weight);\n\t\t\t}\n\t\t\treturn target.applyMatrix4(this.bindMatrixInverse);\n\t\t}\n\t}\n\n\t/**\n\t * This flag can be used for type testing.\n\t * @readonly\n\t * @type {boolean}\n\t * @default true\n\t */\n\tSkinnedMesh.prototype.isSkinnedMesh = true;\n\tconst _basePosition = new Vector3();\n\tconst _skinIndex = new Vector4();\n\tconst _skinWeight = new Vector4();\n\tconst _vector = new Vector3();\n\tconst _matrix = new Matrix4();\n\tfunction getComponent(vec, index) {\n\t\tswitch (index) {\n\t\t\tcase 0:\n\t\t\t\treturn vec.x;\n\t\t\tcase 1:\n\t\t\t\treturn vec.y;\n\t\t\tcase 2:\n\t\t\t\treturn vec.z;\n\t\t\tcase 3:\n\t\t\t\treturn vec.w;\n\t\t\tdefault:\n\t\t\t\tthrow new Error('index is out of range: ' + index);\n\t\t}\n\t}\n\n\tvar alphaTest_frag = \"#ifdef ALPHATEST\\n\\tif (outColor.a < u_AlphaTest) discard;\\n\\toutColor.a = u_Opacity;\\n#endif\";\n\n\tvar alphaTest_pars_frag = \"#ifdef ALPHATEST\\n\\tuniform float u_AlphaTest;\\n#endif\";\n\n\tvar aoMap_pars_frag = \"#ifdef USE_AOMAP\\n\\tuniform sampler2D aoMap;\\n\\tuniform float aoMapIntensity;\\n\\tvarying vec2 vAOMapUV;\\n#endif\";\n\n\tvar aoMap_pars_vert = \"#ifdef USE_AOMAP\\n\\tuniform mat3 aoMapUVTransform;\\n\\tvarying vec2 vAOMapUV;\\n#endif\";\n\n\tvar aoMap_vert = \"#ifdef USE_AOMAP\\n\\tvAOMapUV = (aoMapUVTransform * vec3(AOMAP_UV, 1.)).xy;\\n#endif\";\n\n\tvar aoMap_frag = \"\\n#ifdef USE_AOMAP\\n\t\tfloat ambientOcclusion = (texture2D(aoMap, vAOMapUV).r - 1.0) * aoMapIntensity + 1.0;\\n\t\t\\n\t\treflectedLight.indirectDiffuse *= ambientOcclusion;\\n\t\t#if defined(USE_ENV_MAP) && defined(USE_PBR)\\n\t\t\t\tfloat dotNV = saturate(dot(N, V));\\n\t\t\t\treflectedLight.indirectSpecular *= computeSpecularOcclusion(dotNV, ambientOcclusion, roughness);\\n\t\t#endif\\n#endif\";\n\n\tvar begin_frag = \"vec4 outColor = vec4(u_Color, u_Opacity);\";\n\n\tvar begin_vert = \"vec3 transformed = vec3(a_Position);\\nvec3 objectNormal = vec3(a_Normal);\\n#ifdef USE_TANGENT\\n\t\tvec3 objectTangent = vec3(a_Tangent.xyz);\\n#endif\";\n\n\tvar bsdfs = \"\\nvec3 BRDF_Diffuse_Lambert(vec3 diffuseColor) {\\n\t\treturn RECIPROCAL_PI * diffuseColor;\\n}\\nvec3 F_Schlick(const in vec3 specularColor, const in float dotLH) {\\n\\tfloat fresnel = exp2((-5.55473 * dotLH - 6.98316) * dotLH);\\n\\treturn (1.0 - specularColor) * fresnel + specularColor;\\n}\\nfloat D_BlinnPhong(const in float shininess, const in float dotNH) {\\n\\treturn RECIPROCAL_PI * (shininess * 0.5 + 1.0) * pow(dotNH, shininess);\\n}\\nfloat G_BlinnPhong_Implicit() {\\n\\treturn 0.25;\\n}\\nvec3 BRDF_Specular_BlinnPhong(vec3 specularColor, vec3 N, vec3 L, vec3 V, float shininess) {\\n\t\tvec3 H = normalize(L + V);\\n\t\tfloat dotNH = saturate(dot(N, H));\\n\t\tfloat dotLH = saturate(dot(L, H));\\n\t\tvec3 F = F_Schlick(specularColor, dotLH);\\n\t\tfloat G = G_BlinnPhong_Implicit();\\n\t\tfloat D = D_BlinnPhong(shininess, dotNH);\\n\t\treturn F * G * D;\\n}\\nfloat D_GGX(const in float alpha, const in float dotNH) {\\n\\tfloat a2 = pow2(alpha);\\n\\tfloat denom = pow2(dotNH) * (a2 - 1.0) + 1.0;\\treturn RECIPROCAL_PI * a2 / pow2(denom);\\n}\\nfloat G_GGX_SmithCorrelated(const in float alpha, const in float dotNL, const in float dotNV) {\\n\\tfloat a2 = pow2(alpha);\\n\\tfloat gv = dotNL * sqrt(a2 + (1.0 - a2) * pow2(dotNV));\\n\\tfloat gl = dotNV * sqrt(a2 + (1.0 - a2) * pow2(dotNL));\\n\\treturn 0.5 / max(gv + gl, EPSILON);\\n}\\nvec3 BRDF_Specular_GGX(vec3 specularColor, vec3 N, vec3 L, vec3 V, float roughness) {\\n\\tfloat alpha = pow2(roughness);\\n\\tvec3 H = normalize(L + V);\\n\\tfloat dotNL = saturate(dot(N, L));\\n\\tfloat dotNV = saturate(dot(N, V));\\n\\tfloat dotNH = saturate(dot(N, H));\\n\\tfloat dotLH = saturate(dot(L, H));\\n\\tvec3 F = F_Schlick(specularColor, dotLH);\\n\\tfloat G = G_GGX_SmithCorrelated(alpha, dotNL, dotNV);\\n\\tfloat D = D_GGX(alpha, dotNH);\\n\\treturn F * G * D;\\n}\\nvec2 integrateSpecularBRDF(const in float dotNV, const in float roughness) {\\n\\tconst vec4 c0 = vec4(-1, -0.0275, -0.572, 0.022);\\n\\tconst vec4 c1 = vec4(1, 0.0425, 1.04, -0.04);\\n\\tvec4 r = roughness * c0 + c1;\\n\\tfloat a004 = min(r.x * r.x, exp2(-9.28 * dotNV)) * r.x + r.y;\\n\\treturn vec2(-1.04, 1.04) * a004 + r.zw;\\n}\\nvec3 F_Schlick_RoughnessDependent(const in vec3 F0, const in float dotNV, const in float roughness) {\\n\\tfloat fresnel = exp2((-5.55473 * dotNV - 6.98316) * dotNV);\\n\\tvec3 Fr = max(vec3(1.0 - roughness), F0) - F0;\\n\\treturn Fr * fresnel + F0;\\n}\\nvec3 BRDF_Specular_GGX_Environment(const in vec3 N, const in vec3 V, const in vec3 specularColor, const in float roughness) {\\n\\tfloat dotNV = saturate(dot(N, V));\\n\\tvec2 brdf = integrateSpecularBRDF(dotNV, roughness);\\n\\treturn specularColor * brdf.x + brdf.y;\\n}\\nvoid BRDF_Specular_Multiscattering_Environment(const in vec3 N, const in vec3 V, const in vec3 specularColor, const in float roughness, inout vec3 singleScatter, inout vec3 multiScatter) {\\n\\tfloat dotNV = saturate(dot(N, V));\\n\\tvec3 F = F_Schlick_RoughnessDependent(specularColor, dotNV, roughness);\\n\\tvec2 brdf = integrateSpecularBRDF(dotNV, roughness);\\n\\tvec3 FssEss = F * brdf.x + brdf.y;\\n\\tfloat Ess = brdf.x + brdf.y;\\n\\tfloat Ems = 1.0 - Ess;\\n\\tvec3 Favg = specularColor + (1.0 - specularColor) * 0.047619;\\tvec3 Fms = FssEss * Favg / (1.0 - Ems * Favg);\\n\\tsingleScatter += FssEss;\\n\\tmultiScatter += Fms * Ems;\\n}\";\n\n\tvar bumpMap_pars_frag = \"#ifdef USE_BUMPMAP\\n\\tuniform sampler2D bumpMap;\\n\\tuniform float bumpScale;\\n\\tvec2 dHdxy_fwd(vec2 uv) {\\n\\t\\tvec2 dSTdx = dFdx( uv );\\n\\t\\tvec2 dSTdy = dFdy( uv );\\n\\t\\tfloat Hll = bumpScale * texture2D( bumpMap, uv ).x;\\n\\t\\tfloat dBx = bumpScale * texture2D( bumpMap, uv + dSTdx ).x - Hll;\\n\\t\\tfloat dBy = bumpScale * texture2D( bumpMap, uv + dSTdy ).x - Hll;\\n\\t\\treturn vec2( dBx, dBy );\\n\\t}\\n\\tvec3 perturbNormalArb( vec3 surf_pos, vec3 surf_norm, vec2 dHdxy) {\\n\\t\\tvec3 vSigmaX = vec3( dFdx( surf_pos.x ), dFdx( surf_pos.y ), dFdx( surf_pos.z ) );\\n\\t\\tvec3 vSigmaY = vec3( dFdy( surf_pos.x ), dFdy( surf_pos.y ), dFdy( surf_pos.z ) );\\n\\t\\tvec3 vN = surf_norm;\\n\\t\\tvec3 R1 = cross( vSigmaY, vN );\\n\\t\\tvec3 R2 = cross( vN, vSigmaX );\\n\\t\\tfloat fDet = dot( vSigmaX, R1 );\\n\\t\\tfDet *= ( float( gl_FrontFacing ) * 2.0 - 1.0 );\\n\\t\\tvec3 vGrad = sign( fDet ) * ( dHdxy.x * R1 + dHdxy.y * R2 );\\n\\t\\treturn normalize( abs( fDet ) * surf_norm - vGrad );\\n\\t}\\n#endif\";\n\n\tvar clippingPlanes_frag = \"\\n#if NUM_CLIPPING_PLANES > 0\\n\t\tvec4 plane;\\n\t\t#pragma unroll_loop_start\\n\t\tfor (int i = 0; i < NUM_CLIPPING_PLANES; i++) {\\n\t\t\t\tplane = clippingPlanes[i];\\n\t\t\t\tif ( dot( -v_modelPos, plane.xyz ) > plane.w ) discard;\\n\t\t}\\n\t\t#pragma unroll_loop_end\\n#endif\";\n\n\tvar clippingPlanes_pars_frag = \"#if NUM_CLIPPING_PLANES > 0\\n\t\tuniform vec4 clippingPlanes[ NUM_CLIPPING_PLANES ];\\n#endif\";\n\n\tvar color_frag = \"#ifdef USE_VCOLOR_RGB\\n\t\toutColor.rgb *= v_Color;\\n#endif\\n#ifdef USE_VCOLOR_RGBA\\n\t\toutColor *= v_Color;\\n#endif\";\n\n\tvar color_pars_frag = \"#ifdef USE_VCOLOR_RGB\\n\t\tvarying vec3 v_Color;\\n#endif\\n#ifdef USE_VCOLOR_RGBA\\n\t\tvarying vec4 v_Color;\\n#endif\";\n\n\tvar color_pars_vert = \"#ifdef USE_VCOLOR_RGB\\n\t\tattribute vec3 a_Color;\\n\t\tvarying vec3 v_Color;\\n#endif\\n#ifdef USE_VCOLOR_RGBA\\n\t\tattribute vec4 a_Color;\\n\t\tvarying vec4 v_Color;\\n#endif\";\n\n\tvar color_vert = \"#if defined(USE_VCOLOR_RGB) || defined(USE_VCOLOR_RGBA)\\n\t\tv_Color = a_Color;\\n#endif\";\n\n\tvar common_frag = \"uniform mat4 u_View;\\nuniform float u_Opacity;\\nuniform vec3 u_Color;\\nuniform vec3 u_CameraPosition;\\nbool isPerspectiveMatrix( mat4 m ) {\\n\\treturn m[ 2 ][ 3 ] == - 1.0;\\n}\\nstruct ReflectedLight {\\n\\tvec3 directDiffuse;\\n\\tvec3 directSpecular;\\n\\tvec3 indirectDiffuse;\\n\\tvec3 indirectSpecular;\\n};\";\n\n\tvar common_vert = \"attribute vec3 a_Position;\\nattribute vec3 a_Normal;\\n#ifdef USE_TANGENT\\n\\tattribute vec4 a_Tangent;\\n#endif\\n#include <transpose>\\n#include <inverse>\\nuniform mat4 u_Projection;\\nuniform mat4 u_View;\\nuniform mat4 u_Model;\\nuniform mat4 u_ProjectionView;\\nuniform vec3 u_CameraPosition;\\n#define EPSILON 1e-6\\n#ifdef USE_MORPHTARGETS\\n\t\tattribute vec3 morphTarget0;\\n\t\tattribute vec3 morphTarget1;\\n\t\tattribute vec3 morphTarget2;\\n\t\tattribute vec3 morphTarget3;\\n\t\t#ifdef USE_MORPHNORMALS\\n\t\t\\tattribute vec3 morphNormal0;\\n\t\t\\tattribute vec3 morphNormal1;\\n\t\t\\tattribute vec3 morphNormal2;\\n\t\t\\tattribute vec3 morphNormal3;\\n\t\t#else\\n\t\t\\tattribute vec3 morphTarget4;\\n\t\t\\tattribute vec3 morphTarget5;\\n\t\t\\tattribute vec3 morphTarget6;\\n\t\t\\tattribute vec3 morphTarget7;\\n\t\t#endif\\n#endif\\nbool isPerspectiveMatrix( mat4 m ) {\\n\\treturn m[ 2 ][ 3 ] == - 1.0;\\n}\";\n\n\tvar diffuseMap_frag = \"#ifdef USE_DIFFUSE_MAP\\n\t\toutColor *= mapTexelToLinear(texture2D(diffuseMap, vDiffuseMapUV));\\n#endif\";\n\n\tvar diffuseMap_pars_frag = \"#ifdef USE_DIFFUSE_MAP\\n\t\tuniform sampler2D diffuseMap;\\n\t\tvarying vec2 vDiffuseMapUV;\\n#endif\";\n\n\tvar diffuseMap_vert = \"#ifdef USE_DIFFUSE_MAP\\n\t\tvDiffuseMapUV = (uvTransform * vec3(DIFFUSEMAP_UV, 1.)).xy;\\n#endif\";\n\n\tvar diffuseMap_pars_vert = \"#ifdef USE_DIFFUSE_MAP\\n\t\tvarying vec2 vDiffuseMapUV;\\n#endif\";\n\n\tvar emissiveMap_frag = \"#ifdef USE_EMISSIVEMAP\\n\\tvec4 emissiveColor = emissiveMapTexelToLinear(texture2D(emissiveMap, vEmissiveMapUV));\\n\\ttotalEmissiveRadiance *= emissiveColor.rgb;\\n#endif\";\n\n\tvar emissiveMap_pars_frag = \"#ifdef USE_EMISSIVEMAP\\n\\tuniform sampler2D emissiveMap;\\n\\tvarying vec2 vEmissiveMapUV;\\n#endif\";\n\n\tvar emissiveMap_vert = \"#ifdef USE_EMISSIVEMAP\\n\\tvEmissiveMapUV = (emissiveMapUVTransform * vec3(EMISSIVEMAP_UV, 1.)).xy;\\n#endif\";\n\n\tvar emissiveMap_pars_vert = \"#ifdef USE_EMISSIVEMAP\\n\\tuniform mat3 emissiveMapUVTransform;\\n\\tvarying vec2 vEmissiveMapUV;\\n#endif\";\n\n\tvar encodings_frag = \"gl_FragColor = linearToOutputTexel(gl_FragColor);\";\n\n\tvar encodings_pars_frag = \"vec4 LinearToLinear(in vec4 value) {\\n\\treturn value;\\n}\\nvec4 GammaToLinear(in vec4 value, in float gammaFactor) {\\n\\treturn vec4(pow(value.xyz, vec3(gammaFactor)), value.w);\\n}\\nvec4 LinearToGamma(in vec4 value, in float gammaFactor) {\\n\\treturn vec4(pow(value.xyz, vec3(1.0 / gammaFactor)), value.w);\\n}\\nvec4 sRGBToLinear(in vec4 value) {\\n\\treturn vec4(mix(pow(value.rgb * 0.9478672986 + vec3(0.0521327014), vec3(2.4)), value.rgb * 0.0773993808, vec3(lessThanEqual(value.rgb, vec3(0.04045)))), value.w);\\n}\\nvec4 LinearTosRGB(in vec4 value) {\\n\\treturn vec4(mix(pow(value.rgb, vec3(0.41666)) * 1.055 - vec3(0.055), value.rgb * 12.92, vec3(lessThanEqual(value.rgb, vec3(0.0031308)))), value.w);\\n}\";\n\n\tvar end_frag = \"gl_FragColor = outColor;\";\n\n\tvar envMap_frag = \"#ifdef USE_ENV_MAP\\n\t\tvec3 envDir;\\n\t\t#ifdef USE_VERTEX_ENVDIR\\n\t\t\t\tenvDir = v_EnvDir;\\n\t\t#else\\n\t\t\t\tenvDir = reflect(normalize(v_modelPos - u_CameraPosition), N);\\n\t\t#endif\\n\t\tvec4 envColor = textureCube(envMap, vec3(envMapParams.z * envDir.x, envDir.yz));\\n\t\tenvColor = envMapTexelToLinear( envColor );\\n\t\t#ifdef ENVMAP_BLENDING_MULTIPLY\\n\\t\\toutColor = mix(outColor, envColor * outColor, envMapParams.y);\\n\\t#elif defined( ENVMAP_BLENDING_MIX )\\n\\t\\toutColor = mix(outColor, envColor, envMapParams.y);\\n\\t#elif defined( ENVMAP_BLENDING_ADD )\\n\\t\\toutColor += envColor * envMapParams.y;\\n\\t#endif\\n#endif\";\n\n\tvar envMap_pars_frag = \"#ifdef USE_ENV_MAP\\n\t\t#ifdef USE_VERTEX_ENVDIR\\n\t\t\t\tvarying vec3 v_EnvDir;\\n\t\t#endif\\n\t\tuniform samplerCube envMap;\\n\t\tuniform vec3 envMapParams;\\n\t\tuniform int maxMipLevel;\\n#endif\";\n\n\tvar envMap_pars_vert = \"#ifdef USE_ENV_MAP\\n\t\t#ifdef USE_VERTEX_ENVDIR\\n\t\t\t\tvarying vec3 v_EnvDir;\\n\t\t#endif\\n#endif\";\n\n\tvar envMap_vert = \"\\n#ifdef USE_ENV_MAP\\n\t\t#ifdef USE_VERTEX_ENVDIR\\n\t\t\t\tvec3 transformedNormal = (transposeMat4(inverseMat4(u_Model)) * vec4(objectNormal, 0.0)).xyz;\\n\t\t\t\ttransformedNormal = normalize(transformedNormal);\\n\t\t\t\tv_EnvDir = reflect(normalize(worldPosition.xyz - u_CameraPosition), transformedNormal);\\n\t\t#endif\\n#endif\";\n\n\tvar fog_frag = \"#ifdef USE_FOG\\n\t\tfloat depth = gl_FragCoord.z / gl_FragCoord.w;\\n\t\t#ifdef USE_EXP2_FOG\\n\t\t\t\tfloat fogFactor = 1.0 - exp(-u_FogDensity * u_FogDensity * depth * depth);\\n\t\t#else\\n\t\t\t\tfloat fogFactor = smoothstep(u_FogNear, u_FogFar, depth);\\n\t\t#endif\\n\t\tgl_FragColor.rgb = mix(gl_FragColor.rgb, u_FogColor, fogFactor);\\n#endif\";\n\n\tvar fog_pars_frag = \"#ifdef USE_FOG\\n\t\tuniform vec3 u_FogColor;\\n\t\t#ifdef USE_EXP2_FOG\\n\t\t\t\tuniform float u_FogDensity;\\n\t\t#else\\n\t\t\t\tuniform float u_FogNear;\\n\t\t\t\tuniform float u_FogFar;\\n\t\t#endif\\n#endif\";\n\n\tvar inverse = \"mat4 inverseMat4(mat4 m) {\\n\t\tfloat\\n\t\ta00 = m[0][0], a01 = m[0][1], a02 = m[0][2], a03 = m[0][3],\\n\t\ta10 = m[1][0], a11 = m[1][1], a12 = m[1][2], a13 = m[1][3],\\n\t\ta20 = m[2][0], a21 = m[2][1], a22 = m[2][2], a23 = m[2][3],\\n\t\ta30 = m[3][0], a31 = m[3][1], a32 = m[3][2], a33 = m[3][3],\\n\t\tb00 = a00 * a11 - a01 * a10,\\n\t\tb01 = a00 * a12 - a02 * a10,\\n\t\tb02 = a00 * a13 - a03 * a10,\\n\t\tb03 = a01 * a12 - a02 * a11,\\n\t\tb04 = a01 * a13 - a03 * a11,\\n\t\tb05 = a02 * a13 - a03 * a12,\\n\t\tb06 = a20 * a31 - a21 * a30,\\n\t\tb07 = a20 * a32 - a22 * a30,\\n\t\tb08 = a20 * a33 - a23 * a30,\\n\t\tb09 = a21 * a32 - a22 * a31,\\n\t\tb10 = a21 * a33 - a23 * a31,\\n\t\tb11 = a22 * a33 - a23 * a32,\\n\t\tdet = b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06;\\n\t\treturn mat4(\\n\t\t\t\ta11 * b11 - a12 * b10 + a13 * b09,\\n\t\t\t\ta02 * b10 - a01 * b11 - a03 * b09,\\n\t\t\t\ta31 * b05 - a32 * b04 + a33 * b03,\\n\t\t\t\ta22 * b04 - a21 * b05 - a23 * b03,\\n\t\t\t\ta12 * b08 - a10 * b11 - a13 * b07,\\n\t\t\t\ta00 * b11 - a02 * b08 + a03 * b07,\\n\t\t\t\ta32 * b02 - a30 * b05 - a33 * b01,\\n\t\t\t\ta20 * b05 - a22 * b02 + a23 * b01,\\n\t\t\t\ta10 * b10 - a11 * b08 + a13 * b06,\\n\t\t\t\ta01 * b08 - a00 * b10 - a03 * b06,\\n\t\t\t\ta30 * b04 - a31 * b02 + a33 * b00,\\n\t\t\t\ta21 * b02 - a20 * b04 - a23 * b00,\\n\t\t\t\ta11 * b07 - a10 * b09 - a12 * b06,\\n\t\t\t\ta00 * b09 - a01 * b07 + a02 * b06,\\n\t\t\t\ta31 * b01 - a30 * b03 - a32 * b00,\\n\t\t\t\ta20 * b03 - a21 * b01 + a22 * b00) / det;\\n}\";\n\n\tvar light_frag = \"\\n#if (defined(USE_PHONG) || defined(USE_PBR))\\n\t\tvec3 V = normalize(u_CameraPosition - v_modelPos);\\n#endif\\n#ifdef USE_PBR\\n\t\t#ifdef USE_PBR2\\n\t\t\t\tvec3 diffuseColor = outColor.xyz;\\n\t\t\t\tvec3 specularColor = specularFactor.xyz;\\n\t\t\t\tfloat roughness = max(1.0 - glossinessFactor, 0.0525);\\n\t\t#else\\n\t\t\t\tvec3 diffuseColor = outColor.xyz * (1.0 - metalnessFactor);\\n\t\t\t\tvec3 specularColor = mix(vec3(0.04), outColor.xyz, metalnessFactor);\\n\t\t\t\tfloat roughness = max(roughnessFactor, 0.0525);\\n\t\t#endif\\n\t\tvec3 dxy = max(abs(dFdx(geometryNormal)), abs(dFdy(geometryNormal)));\\n\t\tfloat geometryRoughness = max(max(dxy.x, dxy.y), dxy.z);\\n\t\troughness += geometryRoughness;\\n\t\troughness = min(roughness, 1.0);\\n\t\t#ifdef USE_CLEARCOAT\\n\t\t\t\tfloat clearcoat = u_Clearcoat;\\n\t\t\t\tfloat clearcoatRoughness = u_ClearcoatRoughness;\\n\t\t\t\t#ifdef USE_CLEARCOATMAP\\n\\t\\t\t\tclearcoat *= texture2D(clearcoatMap, v_Uv).x;\\n\t\t\t\t#endif\\n\t\t\t\t#ifdef USE_CLEARCOAT_ROUGHNESSMAP\\n\\t\\t\t\tclearcoatRoughness *= texture2D(clearcoatRoughnessMap, v_Uv).y;\\n\\t\t\t#endif\\n\t\t\t\tclearcoat = saturate(clearcoat);\\n\t\t\t\tclearcoatRoughness = max(clearcoatRoughness, 0.0525);\\n\\t\t\tclearcoatRoughness += geometryRoughness;\\n\\t\t\tclearcoatRoughness = min(clearcoatRoughness, 1.0);\\n\t\t#endif\\n#else\\n\t\tvec3 diffuseColor = outColor.xyz;\\n\t\t#ifdef USE_PHONG\\n\t\t\t\tvec3 specularColor = u_SpecularColor.xyz;\\n\t\t\t\tfloat shininess = u_Specular;\\n\t\t#endif\\n#endif\\nvec3 L;\\nfloat falloff;\\nfloat dotNL;\\nvec3 irradiance;\\nfloat clearcoatDHR;\\n#ifdef USE_CLEARCOAT\\n\t\tfloat ccDotNL;\\n\t\tvec3 ccIrradiance;\\n#endif\\n#if NUM_DIR_LIGHTS > 0\\n\t\t#pragma unroll_loop_start\\n\t\tfor (int i = 0; i < NUM_DIR_LIGHTS; i++) {\\n\t\t\t\tL = normalize(-u_Directional[i].direction);\\n\t\t\t\tfalloff = 1.0;\\n\t\t\t\t#if defined(USE_SHADOW) && (UNROLLED_LOOP_INDEX < NUM_DIR_SHADOWS)\\n\t\t\t\t\t\t#ifdef USE_PCSS_SOFT_SHADOW\\n\t\t\t\t\t\t\t\tfalloff *= getShadowWithPCSS(directionalDepthMap[i], directionalShadowMap[i], vDirectionalShadowCoord[i], u_DirectionalShadow[i].shadowMapSize, u_DirectionalShadow[i].shadowBias, u_DirectionalShadow[i].shadowParams);\\n\t\t\t\t\t\t#else\\n\t\t\t\t\t\t\t\tfalloff *= getShadow(directionalShadowMap[i], vDirectionalShadowCoord[i], u_DirectionalShadow[i].shadowMapSize, u_DirectionalShadow[i].shadowBias, u_DirectionalShadow[i].shadowParams);\\n\t\t\t\t\t\t#endif\\n\t\t\t\t#endif\\n\t\t\t\tdotNL = saturate(dot(N, L));\\n\t\t\t\tirradiance = u_Directional[i].color * falloff * dotNL * PI;\\n\t\t\t\t#ifdef USE_CLEARCOAT\t\t\t\t\\n\t\t\t\t\t\tccDotNL = saturate(dot(clearcoatNormal, L));\\n\t\t\t\t\t\tccIrradiance = ccDotNL * u_Directional[i].color * falloff\t* PI;\\n\t\t\t\t\t\tclearcoatDHR = clearcoat * clearcoatDHRApprox(clearcoatRoughness, ccDotNL);\\n\t\t\t\t\t\treflectedLight.directSpecular += ccIrradiance * clearcoat * BRDF_Specular_GGX(specularColor, clearcoatNormal, L, V, clearcoatRoughness);\\n\t\t\t\t#else\\n\t\t\t\t\t\tclearcoatDHR = 0.0;\\n\t\t\t\t#endif\\n\t\t\t\treflectedLight.directDiffuse += (1.0 - clearcoatDHR) * irradiance * BRDF_Diffuse_Lambert(diffuseColor);\\n\t\t\t\t#ifdef USE_PHONG\\n\t\t\t\t\t\treflectedLight.directSpecular += irradiance * BRDF_Specular_BlinnPhong(specularColor, N, L, V, shininess) * specularStrength;\\n\t\t\t\t#endif\\n\t\t\t\t#ifdef USE_PBR\\n\t\t\t\t\t\treflectedLight.directSpecular += (1.0 - clearcoatDHR) * irradiance * BRDF_Specular_GGX(specularColor, N, L, V, roughness);\\n\t\t\t\t#endif\\n\t\t}\\n\t\t#pragma unroll_loop_end\\n#endif\\n#if NUM_POINT_LIGHTS > 0\\n\t\tvec3 worldV;\\n\t\t#pragma unroll_loop_start\\n\t\tfor (int i = 0; i < NUM_POINT_LIGHTS; i++) {\\n\t\t\t\tworldV = v_modelPos - u_Point[i].position;\\n\t\t\t\tL = -worldV;\\n\t\t\t\tfalloff = pow(clamp(1. - length(L) / u_Point[i].distance, 0.0, 1.0), u_Point[i].decay);\\n\t\t\t\tL = normalize(L);\\n\t\t\t\t#if defined(USE_SHADOW) && (UNROLLED_LOOP_INDEX < NUM_POINT_SHADOWS)\\n\t\t\t\t\t\tfalloff *= getPointShadow(pointShadowMap[i], vPointShadowCoord[i], u_PointShadow[i].shadowMapSize, u_PointShadow[i].shadowBias, u_PointShadow[i].shadowParams, u_PointShadow[i].shadowCameraRange);\\n\t\t\t\t#endif\\n\t\t\t\tdotNL = saturate(dot(N, L));\\n\t\t\t\tirradiance = u_Point[i].color * falloff * dotNL * PI;\\n\t\t\t\t#ifdef USE_CLEARCOAT\t\t\t\t\\n\t\t\t\t\t\tccDotNL = saturate(dot(clearcoatNormal, L));\\n\t\t\t\t\t\tccIrradiance = ccDotNL *\tu_Point[i].color * falloff\t* PI;\\n\t\t\t\t\t\tclearcoatDHR = clearcoat * clearcoatDHRApprox(clearcoatRoughness, ccDotNL);\\n\t\t\t\t\t\treflectedLight.directSpecular += ccIrradiance * clearcoat * BRDF_Specular_GGX(specularColor, clearcoatNormal, L, V, clearcoatRoughness);\\n\t\t\t\t#else\\n\t\t\t\t\t\tclearcoatDHR = 0.0;\\n\t\t\t\t#endif\\n\t\t\t\treflectedLight.directDiffuse += (1.0 - clearcoatDHR) * irradiance * BRDF_Diffuse_Lambert(diffuseColor);\\n\t\t\t\t#ifdef USE_PHONG\\n\t\t\t\t\t\treflectedLight.directSpecular += irradiance * BRDF_Specular_BlinnPhong(specularColor, N, L, V, shininess) * specularStrength;\\n\t\t\t\t#endif\\n\t\t\t\t#ifdef USE_PBR\\n\t\t\t\t\t\treflectedLight.directSpecular += (1.0 - clearcoatDHR) * irradiance * BRDF_Specular_GGX(specularColor, N, L, V, roughness);\\n\t\t\t\t#endif\\n\t\t}\\n\t\t#pragma unroll_loop_end\\n#endif\\n#if NUM_SPOT_LIGHTS > 0\\n\t\tfloat lightDistance;\\n\t\tfloat angleCos;\\n\t\t#pragma unroll_loop_start\\n\t\tfor (int i = 0; i < NUM_SPOT_LIGHTS; i++) {\\n\t\t\t\tL = u_Spot[i].position - v_modelPos;\\n\t\t\t\tlightDistance = length(L);\\n\t\t\t\tL = normalize(L);\\n\t\t\t\tangleCos = dot(L, -normalize(u_Spot[i].direction));\\n\t\t\t\tfalloff = smoothstep(u_Spot[i].coneCos, u_Spot[i].penumbraCos, angleCos);\\n\t\t\t\tfalloff *= pow(clamp(1. - lightDistance / u_Spot[i].distance, 0.0, 1.0), u_Spot[i].decay);\\n\t\t\t\t#if defined(USE_SHADOW) && (UNROLLED_LOOP_INDEX < NUM_SPOT_SHADOWS)\\n\t\t\t\t\t\t#ifdef USE_PCSS_SOFT_SHADOW\\n\t\t\t\t\t\t\t\tfalloff *= getShadowWithPCSS(spotDepthMap[i], spotShadowMap[i], vSpotShadowCoord[i], u_SpotShadow[i].shadowMapSize, u_SpotShadow[i].shadowBias, u_SpotShadow[i].shadowParams);\\n\t\t\t\t\t\t#else\\n\t\t\t\t\t\t\t\tfalloff *= getShadow(spotShadowMap[i], vSpotShadowCoord[i], u_SpotShadow[i].shadowMapSize, u_SpotShadow[i].shadowBias, u_SpotShadow[i].shadowParams);\\n\t\t\t\t\t\t#endif\\n\t\t\t\t#endif\\n\t\t\t\tdotNL = saturate(dot(N, L));\\n\t\t\t\tirradiance = u_Spot[i].color * falloff * dotNL * PI;\\n\t\t\t\t#ifdef USE_CLEARCOAT\t\t\t\t\\n\t\t\t\t\t\tccDotNL = saturate(dot(clearcoatNormal, L));\\n\t\t\t\t\t\tccIrradiance = ccDotNL *\tu_Spot[i].color * falloff\t* PI;\\n\t\t\t\t\t\tclearcoatDHR = clearcoat * clearcoatDHRApprox(clearcoatRoughness, ccDotNL);\\n\t\t\t\t\t\treflectedLight.directSpecular += ccIrradiance * clearcoat * BRDF_Specular_GGX(specularColor, clearcoatNormal, L, V, clearcoatRoughness);\\n\t\t\t\t#else\\n\t\t\t\t\t\tclearcoatDHR = 0.0;\\n\t\t\t\t#endif\\n\t\t\t\treflectedLight.directDiffuse += (1.0 - clearcoatDHR) * irradiance * BRDF_Diffuse_Lambert(diffuseColor);\\n\t\t\t\t#ifdef USE_PHONG\\n\t\t\t\t\t\treflectedLight.directSpecular += irradiance * BRDF_Specular_BlinnPhong(specularColor, N, L, V, shininess) * specularStrength;\\n\t\t\t\t#endif\\n\t\t\t\t#ifdef USE_PBR\\n\t\t\t\t\t\treflectedLight.directSpecular += (1.0 - clearcoatDHR) * irradiance * BRDF_Specular_GGX(specularColor, N, L, V, roughness);\\n\t\t\t\t#endif\\n\t\t}\\n\t\t#pragma unroll_loop_end\\n#endif\\n#if NUM_RECT_AREA_LIGHTS > 0\\n\t\tvec3 RectAreaLightDirectSpecular;\\n\t\tvec3 RectAreaLightDirectDiffuse;\\n\t\tvec3 rectCoords[4];\\n\t\t#pragma unroll_loop_start\\n\t\tfor (int i = 0; i < NUM_RECT_AREA_LIGHTS; i++) {\\n\t\t\t\tLTC_RectCoords(u_RectArea[i].position, u_RectArea[i].halfWidth, u_RectArea[i].halfHeight, rectCoords);\\n\t\t\t\treflectedLight.directDiffuse += u_RectArea[i].color * LTC_Diffuse(diffuseColor, N, V, v_modelPos, rectCoords);\\n\t\t\t\t#ifdef USE_PBR\\n\t\t\t\t\t\treflectedLight.directSpecular += u_RectArea[i].color * LTC_Specular(specularColor, N, V, v_modelPos, rectCoords, roughness);\\n\t\t\t\t#endif\\n\t\t}\\n\t\t#pragma unroll_loop_end\\n#endif\\n#ifdef USE_CLUSTERED_LIGHTS\\n\t\tvec4 positionView = u_View * vec4(v_modelPos, 1.0);\\n\t\tfloat perspectiveFactor = step(0.0, cellsTransformFactors.z);\\n\t\tfloat halfFrustumHeight = -cellsTransformFactors.z * mix(1.0, positionView.z, perspectiveFactor);\\n\t\tfloat halfFrustumWidth = halfFrustumHeight * cellsTransformFactors.w;\\n\t\tvec3 cellCoords;\\n\t\tcellCoords.z = floor(log(-positionView.z) * cellsTransformFactors.x + cellsTransformFactors.y);\\n\t\tcellCoords.y = floor((positionView.y / (2.0 * halfFrustumHeight) + 0.5) * cells.y);\\n\t\tcellCoords.x = floor((positionView.x / (2.0 * halfFrustumWidth) + 0.5) * cells.x);\\n\t\tif(!(any(lessThan(cellCoords, vec3(0.0))) || any(greaterThanEqual(cellCoords, cells)))) {\\n\t\t\t\tfloat cellIndex = dot(cellsDotData, cellCoords);\\n\t\t\t\tfloat clusterV = floor(cellIndex * cellsTextureSize.y);\\n\t\t\t\tfloat clusterU = cellIndex - (clusterV * cellsTextureSize.x);\\n\t\t\t\tint size = textureSize(lightsTexture, 0).x;\\n\t\t\t\tClusteredPointLight clusteredPointLight;\\n\t\t\t\tClusteredSpotLight clusteredSpotLight;\\n\t\t\t\tvec3 clusteredLightColor;\\n\t\t\t\tfloat clusteredLightDistance;\\n\t\t\t\tfloat clusteredAngleCos;\\n\t\t\t\tfor (int lightCellIndex = 0; lightCellIndex < maxLightsPerCell; lightCellIndex++) {\\n\t\t\t\t\t\tfloat lightIndex = texelFetch(cellsTexture, ivec2(int(clusterU) + lightCellIndex, clusterV), 0).x;\\n\t\t\t\t\t\tif (lightIndex <= 0.0) break;\\n\t\t\t\t\t\tint lightOffset = int(lightIndex - 1.) * 4;\\n\t\t\t\t\t\tivec2 lightDataCoords = ivec2(lightOffset % size, lightOffset / size);\\n\t\t\t\t\t\tvec4 lightData0 = texelFetch(lightsTexture, lightDataCoords, 0);\\n\t\t\t\t\t\tif (lightData0.x == 1.0) {\\n\t\t\t\t\t\t\t\tgetPointLightFromTexture(lightDataCoords, lightData0, clusteredPointLight);\\n\t\t\t\t\t\t\t\tL = clusteredPointLight.position - v_modelPos;\\n\t\t\t\t\t\t\t\tclusteredLightDistance = length(L);\\n\t\t\t\t\t\t\t\tL = normalize(L);\\n\t\t\t\t\t\t\t\tfalloff = pow(clamp(1. - clusteredLightDistance / clusteredPointLight.distance, 0.0, 1.0), clusteredPointLight.decay);\\n\t\t\t\t\t\t\t\tclusteredLightColor = clusteredPointLight.color;\\n\t\t\t\t\t\t} else if (lightData0.x == 2.0) {\\n\t\t\t\t\t\t\t\tgetSpotLightFromTexture(lightDataCoords, lightData0, clusteredSpotLight);\\n\t\t\t\t\t\t\t\tL = clusteredSpotLight.position - v_modelPos;\\n\t\t\t\t\t\t\t\tclusteredLightDistance = length(L);\\n\t\t\t\t\t\t\t\tL = normalize(L);\\n\t\t\t\t\t\t\t\tclusteredAngleCos = dot(L, -normalize(clusteredSpotLight.direction));\\n\t\t\t\t\t\t\t\tfalloff = smoothstep(clusteredSpotLight.coneCos, clusteredSpotLight.penumbraCos, clusteredAngleCos);\\n\t\t\t\t\t\t\t\tfalloff *= pow(clamp(1. - clusteredLightDistance / clusteredSpotLight.distance, 0.0, 1.0), clusteredSpotLight.decay);\\n\t\t\t\t\t\t\t\tclusteredLightColor = clusteredSpotLight.color;\\n\t\t\t\t\t\t}\\n\t\t\t\t\t\tdotNL = saturate(dot(N, L));\\n\t\t\t\t\t\tirradiance = clusteredLightColor * falloff * dotNL * PI;\\n\t\t\t\t\t\t#ifdef USE_CLEARCOAT\\n\t\t\t\t\t\t\t\tccDotNL = saturate(dot(clearcoatNormal, L));\\n\t\t\t\t\t\t\t\tccIrradiance = ccDotNL * clusteredLightColor * falloff * PI;\\n\t\t\t\t\t\t\t\tclearcoatDHR = clearcoat * clearcoatDHRApprox(clearcoatRoughness, ccDotNL);\\n\t\t\t\t\t\t\t\treflectedLight.directSpecular += ccIrradiance * clearcoat * BRDF_Specular_GGX(specularColor, clearcoatNormal, L, V, clearcoatRoughness);\\n\t\t\t\t\t\t#else\\n\t\t\t\t\t\t\t\tclearcoatDHR = 0.0;\\n\t\t\t\t\t\t#endif\\n\t\t\t\t\t\treflectedLight.directDiffuse += (1.0 - clearcoatDHR) * irradiance * BRDF_Diffuse_Lambert(diffuseColor);\\n\t\t\t\t\t\t#ifdef USE_PHONG\\n\t\t\t\t\t\t\t\treflectedLight.directSpecular += irradiance * BRDF_Specular_BlinnPhong(specularColor, N, L, V, shininess) * specularStrength;\\n\t\t\t\t\t\t#endif\\n\t\t\t\t\t\t#ifdef USE_PBR\\n\t\t\t\t\t\t\t\treflectedLight.directSpecular += (1.0 - clearcoatDHR) * irradiance * BRDF_Specular_GGX(specularColor, N, L, V, roughness);\\n\t\t\t\t\t\t#endif\\n\t\t\t\t}\\n\t\t}\\n#endif\\nvec3 indirectIrradiance = vec3(0., 0., 0.);\t \\n#ifdef USE_AMBIENT_LIGHT\\n\t\tindirectIrradiance += u_AmbientLightColor * PI;\\n#endif\\n#ifdef USE_SPHERICALHARMONICS_LIGHT\\n\t\tindirectIrradiance += getLightProbeIrradiance(u_SphericalHarmonicsLightData, N);\\n#endif\\n#if NUM_HEMI_LIGHTS > 0\\n\t\tfloat hemiDiffuseWeight;\\n\t\t#pragma unroll_loop_start\\n\t\tfor (int i = 0; i < NUM_HEMI_LIGHTS; i++) {\\n\t\t\t\tL = normalize(u_Hemi[i].direction);\\n\t\t\t\tdotNL = dot(N, L);\\n\t\t\t\themiDiffuseWeight = 0.5 * dotNL + 0.5;\\n\t\t\t\tindirectIrradiance += mix(u_Hemi[i].groundColor, u_Hemi[i].skyColor, hemiDiffuseWeight) * PI;\\n\t\t}\\n\t\t#pragma unroll_loop_end\\n#endif\\nreflectedLight.indirectDiffuse += indirectIrradiance * BRDF_Diffuse_Lambert(diffuseColor);\\n#if defined(USE_ENV_MAP) && defined(USE_PBR)\\n\t\tvec3 iblIrradiance = vec3(0., 0., 0.);\\n\t\tvec3 indirectRadiance = vec3(0., 0., 0.);\\n\t\tvec3 clearcoatRadiance = vec3(0., 0., 0.);\\n\t\tvec3 envDir;\\n\t\t#ifdef USE_VERTEX_ENVDIR\\n\t\t\t\tenvDir = v_EnvDir;\\n\t\t#else\\n\t\t\t\tenvDir = reflect(normalize(v_modelPos - u_CameraPosition), N);\\n\t\t#endif\\n\t\tiblIrradiance += getLightProbeIndirectIrradiance(maxMipLevel, N);\\n\t\tindirectRadiance += getLightProbeIndirectRadiance(roughness, maxMipLevel, N, envDir);\\n\t\t#ifdef USE_CLEARCOAT\\n\t\t\t\tvec3 clearcoatDir = reflect(normalize(v_modelPos - u_CameraPosition), clearcoatNormal);\\n\t\t\t\tclearcoatRadiance += getLightProbeIndirectRadiance(clearcoatRoughness, maxMipLevel, clearcoatNormal, clearcoatDir);\\n\t\t#endif\\n\t\t#ifdef USE_CLEARCOAT\\n\t\t\t\tfloat ccDotNV = saturate(dot(clearcoatNormal, V));\\n\t\t\t\treflectedLight.indirectSpecular += clearcoatRadiance * clearcoat * BRDF_Specular_GGX_Environment(clearcoatNormal, V, specularColor, clearcoatRoughness);\\n\t\t\t\tccDotNL = ccDotNV;\\n\t\t\t\tclearcoatDHR = clearcoat * clearcoatDHRApprox(clearcoatRoughness, ccDotNL);\\n\t\t#else\\n\t\t\t\tclearcoatDHR = 0.0;\\n\t\t#endif\\n\t\tfloat clearcoatInv = 1.0 - clearcoatDHR;\\n\t\tvec3 singleScattering = vec3(0.0);\\n\t\tvec3 multiScattering = vec3(0.0);\\n\t\tvec3 cosineWeightedIrradiance = iblIrradiance * RECIPROCAL_PI;\\n\t\tBRDF_Specular_Multiscattering_Environment(N, V, specularColor, roughness, singleScattering, multiScattering);\\n\t\tvec3 diffuse = diffuseColor * (1.0 - (singleScattering + multiScattering));\\n\t\treflectedLight.indirectSpecular += clearcoatInv * indirectRadiance * singleScattering;\\n\t\treflectedLight.indirectSpecular += multiScattering * cosineWeightedIrradiance;\\n\t\treflectedLight.indirectDiffuse += diffuse * cosineWeightedIrradiance;\\n#endif\";\n\n\tvar light_pars_frag = \"#ifdef USE_AMBIENT_LIGHT\\n\t\tuniform vec3 u_AmbientLightColor;\\n#endif\\n#ifdef USE_SPHERICALHARMONICS_LIGHT\\n\t\tuniform vec3 u_SphericalHarmonicsLightData[9];\\n#endif\\n#ifdef USE_CLEARCOAT\\n\t\tfloat clearcoatDHRApprox(const in float roughness, const in float dotNL) {\\n\t\t\t\treturn 0.04 + (1.0 - 0.16) * (pow(1.0 - dotNL, 5.0) * pow(1.0 - roughness, 2.0));\\n\t\t}\\n#endif\\n#if NUM_HEMI_LIGHTS > 0\\n\t\tstruct HemisphereLight {\\n\t\t\t\tvec3 direction;\\n\t\t\t\tvec3 skyColor;\\n\\t\\tvec3 groundColor;\\n\t\t};\\n\t\tuniform HemisphereLight u_Hemi[NUM_HEMI_LIGHTS];\\n#endif\\n#if NUM_DIR_LIGHTS > 0\\n\t\tstruct DirectLight {\\n\t\t\t\tvec3 direction;\\n\t\t\t\tvec3 color;\\n\t\t};\\n\t\tuniform DirectLight u_Directional[NUM_DIR_LIGHTS];\\n#endif\\n#if NUM_POINT_LIGHTS > 0\\n\t\tstruct PointLight {\\n\t\t\t\tvec3 position;\\n\t\t\t\tvec3 color;\\n\t\t\t\tfloat distance;\\n\t\t\t\tfloat decay;\\n\t\t};\\n\t\tuniform PointLight u_Point[NUM_POINT_LIGHTS];\\n#endif\\n#if NUM_SPOT_LIGHTS > 0\\n\t\tstruct SpotLight {\\n\t\t\t\tvec3 position;\\n\t\t\t\tvec3 color;\\n\t\t\t\tfloat distance;\\n\t\t\t\tfloat decay;\\n\t\t\t\tfloat coneCos;\\n\t\t\t\tfloat penumbraCos;\\n\t\t\t\tvec3 direction;\\n\t\t};\\n\t\tuniform SpotLight u_Spot[NUM_SPOT_LIGHTS];\\n#endif\\n#if NUM_RECT_AREA_LIGHTS > 0\\n\t\tstruct RectAreaLight {\\n\t\t\t\tvec3 position;\\n\t\t\t\tvec3 color;\\n\\t\\tvec3 halfWidth;\\n\\t\\tvec3 halfHeight;\\n\t\t};\\n\t\tuniform RectAreaLight u_RectArea[NUM_RECT_AREA_LIGHTS];\\n\\tuniform sampler2D ltc_1;\\tuniform sampler2D ltc_2;\\n\t\tvoid LTC_RectCoords(const in vec3 lightPos, const in vec3 halfWidth, const in vec3 halfHeight, inout vec3 rectCoords[4]) {\\n\t\t\t\trectCoords[0] = lightPos + halfWidth - halfHeight;\t\t\t\trectCoords[1] = lightPos - halfWidth - halfHeight;\\n\t\t\t\trectCoords[2] = lightPos - halfWidth + halfHeight;\\n\t\t\t\trectCoords[3] = lightPos + halfWidth + halfHeight;\\n\t\t}\\n\t\tvec2 LTC_Uv(const in vec3 N, const in vec3 V, const in float roughness) {\\n\t\t\t\tconst float LUT_SIZE = 64.0; \\n\t\t\t\tconst float LUT_SCALE = (LUT_SIZE - 1.0) / LUT_SIZE;\\n\t\t\t\tconst float LUT_BIAS = 0.5 / LUT_SIZE;\\n\t\t\t\tfloat dotNV = saturate(dot(N, V));\\n\t\t\t\tvec2 uv = vec2(roughness, sqrt(1.0 - dotNV));\\n\t\t\t\tuv = uv * LUT_SCALE + LUT_BIAS;\\n\t\t\t\treturn uv;\\n\t\t}\\n\t\tvec3 LTC_EdgeVectorFormFactor(const in vec3 v1, const in vec3 v2) {\\n\t\t\t\tfloat x = dot(v1, v2);\\n\t\t\t\tfloat y = abs(x);\\n\t\t\t\tfloat a = 0.8543985 + (0.4965155 + 0.0145206 * y) * y;\\n\t\t\t\tfloat b = 3.4175940 + (4.1616724 + y) * y;\\n\t\t\t\tfloat v = a / b;\\n\t\t\t\tfloat theta_sintheta = (x > 0.0) ? v : 0.5 * inversesqrt(max(1.0 - x * x, 1e-7)) - v;\\n\t\t\t\treturn cross(v1, v2) * theta_sintheta;\\n\t\t}\\n\t\tfloat LTC_ClippedSphereFormFactor(const in vec3 f) {\\n\t\t\t\tfloat l = length(f);\\n\t\t\t\treturn max((l * l + f.z) / (l + 1.0), 0.0);\\n\t\t}\\n\t\tvec3 LTC_Evaluate(const in vec3 N, const in vec3 V, const in vec3 P, const in mat3 mInv, const in vec3 rectCoords[4]) {\\n\t\t\t\tvec3 v1 = rectCoords[1] - rectCoords[0];\\n\t\t\t\tvec3 v2 = rectCoords[3] - rectCoords[0];\\n\t\t\t\tvec3 lightNormal = cross(v1, v2);\\n\t\t\t\tif(dot(lightNormal, P - rectCoords[0]) < 0.0) return vec3(0.0);\\n\t\t\t\tvec3 T1, T2;\\n\t\t\t\tT1 = normalize(V - N * dot(V, N));\\n\t\t\t\tT2 = - cross(N, T1);\\n\t\t\t\tmat3 mat = mInv * mat3(\\n\t\t\t\t\t\tT1.x, T2.x, N.x,\\n\t\t\t\t\t\tT1.y, T2.y, N.y,\\n\t\t\t\t\t\tT1.z, T2.z, N.z\\n\t\t\t\t);\\n\t\t\t\tvec3 coords[4];\\n\t\t\t\tcoords[0] = mat * (rectCoords[0] - P);\\n\t\t\t\tcoords[1] = mat * (rectCoords[1] - P);\\n\t\t\t\tcoords[2] = mat * (rectCoords[2] - P);\\n\t\t\t\tcoords[3] = mat * (rectCoords[3] - P);\\n\t\t\t\tcoords[0] = normalize(coords[0]);\\n\t\t\t\tcoords[1] = normalize(coords[1]);\\n\t\t\t\tcoords[2] = normalize(coords[2]);\\n\t\t\t\tcoords[3] = normalize(coords[3]);\\n\t\t\t\tvec3 vectorFormFactor = vec3(0.0);\\n\t\t\t\tvectorFormFactor += LTC_EdgeVectorFormFactor(coords[0], coords[1]);\\n\t\t\t\tvectorFormFactor += LTC_EdgeVectorFormFactor(coords[1], coords[2]);\\n\t\t\t\tvectorFormFactor += LTC_EdgeVectorFormFactor(coords[2], coords[3]);\\n\t\t\t\tvectorFormFactor += LTC_EdgeVectorFormFactor(coords[3], coords[0]);\\n\t\t\t\tfloat result = LTC_ClippedSphereFormFactor(vectorFormFactor);\\n\t\t\t\treturn vec3(result);\\n\t\t}\\n\t\tvec3 LTC_Diffuse(const in vec3 diffuseColor, const in vec3 N, const in vec3 V, const in vec3 P, const in vec3 rectCoords[4]) {\\n\t\t\t\treturn diffuseColor * LTC_Evaluate(N, V, P, mat3(1.0), rectCoords);\\n\t\t}\\n\t\tvec3 LTC_Specular(const in vec3 specularColor, const in vec3 N, const in vec3 V, const in vec3 P, const in vec3 rectCoords[4], const in float roughness) {\\n\t\t\t\tvec2 ltc_uv = LTC_Uv(N, V, roughness);\\n\t\t\t\tvec4 t1 = texture2D(ltc_1, ltc_uv);\\n\t\t\t\tvec4 t2 = texture2D(ltc_2, ltc_uv);\\n\t\t\t\tmat3 mInv = mat3(\\n\t\t\t\t\t\tvec3(t1.x, 0, t1.y),\\n\t\t\t\t\t\tvec3(0, 1, 0),\\n\t\t\t\t\t\tvec3(t1.z, 0, t1.w)\\n\t\t\t\t);\\n\t\t\t\tvec3 fresnel = (specularColor * t2.x + (vec3(1.0) - specularColor) * t2.y);\\n\t\t\t\treturn fresnel * LTC_Evaluate(N, V, P, mInv, rectCoords);\\n\t\t}\\n#endif\\n#if defined(USE_PBR) && defined(USE_ENV_MAP)\\n\t\tvec3 getLightProbeIndirectIrradiance(const in int maxMIPLevel, const in vec3 N) {\\n\t\t\t\tvec3 coordVec = vec3(envMapParams.z * N.x, N.yz);\\n\t\t\\t#ifdef TEXTURE_LOD_EXT\\n\t\t\\t\\tvec4 envMapColor = textureCubeLodEXT(envMap, coordVec, float(maxMIPLevel));\\n\t\t\\t#else\\n\t\t\\t\\tvec4 envMapColor = textureCube(envMap, coordVec, float(maxMIPLevel));\\n\t\t\\t#endif\\n\t\t\t\tenvMapColor = envMapTexelToLinear(envMapColor);\\n\t\t\t\treturn PI * envMapColor.rgb * envMapParams.x;\\n\t\t}\\n\t\tfloat getSpecularMIPLevel(const in float roughness, const in int maxMIPLevel) {\\n\t\t\\tfloat maxMIPLevelScalar = float(maxMIPLevel);\\n\t\t\t\tfloat sigma = PI * roughness * roughness / (1.0 + roughness);\\n\t\t\t\tfloat desiredMIPLevel = maxMIPLevelScalar + log2(sigma);\\n\t\t\\treturn clamp(desiredMIPLevel, 0.0, maxMIPLevelScalar);\\n\t\t}\\n\t\tvec3 getLightProbeIndirectRadiance(const in float roughness, const in int maxMIPLevel, const in vec3 normal, const in vec3 envDir) {\\n\t\t\t\tfloat specularMIPLevel = getSpecularMIPLevel(roughness, maxMIPLevel);\\n\t\t\t\tvec3 coordVec = normalize(mix(envDir, normal, roughness * roughness));\\n\t\t\t\tcoordVec.x *= envMapParams.z;\\n\t\t\t\t#ifdef TEXTURE_LOD_EXT\\n\t\t\\t\\tvec4 envMapColor = textureCubeLodEXT(envMap, coordVec, specularMIPLevel);\\n\t\t\\t#else\\n\t\t\\t\\tvec4 envMapColor = textureCube(envMap, coordVec, specularMIPLevel);\\n\t\t\\t#endif\\n\t\t\t\tenvMapColor = envMapTexelToLinear(envMapColor);\\n\t\t\t\treturn envMapColor.rgb * envMapParams.y;\\n\t\t}\\n\t\tfloat computeSpecularOcclusion(const in float dotNV, const in float ambientOcclusion, const in float roughness) {\\n\t\t\\treturn saturate(pow(dotNV + ambientOcclusion, exp2(-16.0 * roughness - 1.0)) - 1.0 + ambientOcclusion);\\n\t\t}\\n#endif\\n#ifdef USE_SPHERICALHARMONICS_LIGHT\\n\t\tvec3 shGetIrradianceAt(in vec3 normal, in vec3 shCoefficients[9]) {\\n\t\t\t\tfloat x = normal.x, y = normal.y, z = normal.z;\\n\t\t\t\tvec3 result = shCoefficients[0] * 0.886227;\\n\t\t\t\tresult += shCoefficients[1] * 2.0 * 0.511664 * y;\\n\t\t\t\tresult += shCoefficients[2] * 2.0 * 0.511664 * z;\\n\t\t\t\tresult += shCoefficients[3] * 2.0 * 0.511664 * x;\\n\t\t\t\tresult += shCoefficients[4] * 2.0 * 0.429043 * x * y;\\n\t\t\t\tresult += shCoefficients[5] * 2.0 * 0.429043 * y * z;\\n\t\t\t\tresult += shCoefficients[6] * (0.743125 * z * z - 0.247708);\\n\t\t\t\tresult += shCoefficients[7] * 2.0 * 0.429043 * x * z;\\n\t\t\t\tresult += shCoefficients[8] * 0.429043 * (x * x - y * y);\\n\t\t\t\treturn result;\\n\t\t}\\n\t\tvec3 getLightProbeIrradiance(const in vec3 lightProbe[9], const in vec3 normal) {\\n\t\t\t\tvec3 irradiance = shGetIrradianceAt(normal, lightProbe);\\n\t\t\t\treturn irradiance;\\n\t\t}\\n#endif\\n#ifdef USE_CLUSTERED_LIGHTS\\n\t\tuniform vec3 cells;\\n\t\tuniform int maxLightsPerCell;\\n\t\tuniform vec3 cellsDotData;\\n\t\tuniform vec3 cellsTextureSize;\\n\t\tuniform vec4 cellsTransformFactors;\\n\t\tuniform sampler2D cellsTexture;\\n\t\tuniform sampler2D lightsTexture;\\n\t\tstruct ClusteredPointLight {\\n\t\t\t\tvec3 position;\\n\t\t\t\tvec3 color;\\n\t\t\t\tfloat distance;\\n\t\t\t\tfloat decay;\\n\t\t};\\n\t\tstruct ClusteredSpotLight {\\n\t\t\t\tvec3 position;\\n\t\t\t\tvec3 color;\\n\t\t\t\tfloat distance;\\n\t\t\t\tfloat decay;\\n\t\t\t\tvec3 direction;\\n\t\t\t\tfloat coneCos;\\n\t\t\t\tfloat penumbraCos;\\n\t\t};\\n\t\tvoid getPointLightFromTexture(ivec2 lightDataCoords, vec4 lightData0, inout ClusteredPointLight pointLight) {\\n\t\t\t\tvec4 lightData1 = texelFetch(lightsTexture, lightDataCoords + ivec2(1, 0), 0);\\n\t\t\t\tvec4 lightData2 = texelFetch(lightsTexture, lightDataCoords + ivec2(2, 0), 0);\\n\t\t\t\tpointLight.color = lightData1.xyz;\\n\t\t\t\tpointLight.decay = lightData1.w;\\n\t\t\t\tpointLight.position = lightData2.xyz;\\n\t\t\t\tpointLight.distance = lightData2.w;\\n\t\t}\\n\t\tvoid getSpotLightFromTexture(ivec2 lightDataCoords, vec4 lightData0, inout ClusteredSpotLight spotLight) {\\n\t\t\t\tvec4 lightData1 = texelFetch(lightsTexture, lightDataCoords + ivec2(1, 0), 0);\\n\t\t\t\tvec4 lightData2 = texelFetch(lightsTexture, lightDataCoords + ivec2(2, 0), 0);\\n\t\t\t\tvec4 lightData3 = texelFetch(lightsTexture, lightDataCoords + ivec2(3, 0), 0);\\n\t\t\t\tspotLight.color = lightData1.xyz;\\n\t\t\t\tspotLight.decay = lightData1.w;\\n\t\t\t\tspotLight.position = lightData2.xyz;\\n\t\t\t\tspotLight.distance = lightData2.w;\\n\t\t\t\tspotLight.direction = lightData3.xyz;\\n\t\t\t\tspotLight.coneCos = lightData3.w;\\n\t\t\t\tspotLight.penumbraCos = lightData0.y;\\n\t\t}\\n#endif\";\n\n\tvar alphamap_pars_frag = \"#ifdef USE_ALPHA_MAP\\n\\tuniform sampler2D alphaMap;\\n\\tvarying vec2 vAlphaMapUV;\\n#endif\";\n\n\tvar alphamap_frag = \"#ifdef USE_ALPHA_MAP\\n\\toutColor.a *= texture2D(alphaMap, vAlphaMapUV).g;\\n#endif\";\n\n\tvar alphamap_pars_vert = \"#ifdef USE_ALPHA_MAP\\n\t\tuniform mat3 alphaMapUVTransform;\\n\\tvarying vec2 vAlphaMapUV;\\n#endif\";\n\n\tvar alphamap_vert = \"#ifdef USE_ALPHA_MAP\\n\\tvAlphaMapUV = (alphaMapUVTransform * vec3(ALPHAMAP_UV, 1.)).xy;\\n#endif\";\n\n\tvar normalMap_pars_frag = \"#ifdef USE_NORMAL_MAP\\n\t\tuniform sampler2D normalMap;\\n\t\tuniform vec2 normalScale;\\n#endif\\n#if defined(USE_NORMAL_MAP) || defined(USE_CLEARCOAT_NORMALMAP)\\n\t\t#if defined(USE_TANGENT) && !defined(FLAT_SHADED)\\n\t\t\t\t#define USE_TBN\\n\t\t#else\\n\t\t\t\t#include <tsn>\\n\t\t#endif\\n#endif\";\n\n\tvar normal_frag = \"\\n#ifdef FLAT_SHADED\\n\t\tvec3 fdx = dFdx(v_modelPos);\\n\t\tvec3 fdy = dFdy(v_modelPos);\\n\t\tvec3 N = normalize(cross(fdx, fdy));\\n#else\\n\t\tvec3 N = normalize(v_Normal);\\n\t\t#ifdef DOUBLE_SIDED\\n\t\t\t\tN = N * (float(gl_FrontFacing) * 2.0 - 1.0);\\n\t\t#endif\\n#endif\\n#ifdef USE_TBN\\n\\tvec3 tangent = normalize(v_Tangent);\\n\\tvec3 bitangent = normalize(v_Bitangent);\\n\\t#ifdef DOUBLE_SIDED\\n\\t\\ttangent = tangent * (float(gl_FrontFacing) * 2.0 - 1.0);\\n\\t\\tbitangent = bitangent * (float(gl_FrontFacing) * 2.0 - 1.0);\\n\\t#endif\\n\\tmat3 tspace = mat3(tangent, bitangent, N);\\n#endif\\nvec3 geometryNormal = N;\\n#ifdef USE_NORMAL_MAP\\n\t\tvec3 mapN = texture2D(normalMap, v_Uv).rgb * 2.0 - 1.0;\\n\t\tmapN.xy *= normalScale;\\n\t\t#ifdef USE_TBN\\n\t\t\t\tN = normalize(tspace * mapN);\\n\t\t#else\\n\t\t\t\tmapN.xy *= (float(gl_FrontFacing) * 2.0 - 1.0);\\n\t\t\t\tN = normalize(tsn(N, v_modelPos, v_Uv) * mapN);\\n\t\t#endif\\n#elif defined(USE_BUMPMAP)\\n\t\tN = perturbNormalArb(v_modelPos, N, dHdxy_fwd(v_Uv));\\n#endif\\n#ifdef USE_CLEARCOAT\\n\\tvec3 clearcoatNormal = geometryNormal;\\n#endif\\n#ifdef USE_CLEARCOAT_NORMALMAP\\n\\tvec3 clearcoatMapN = texture2D(clearcoatNormalMap, v_Uv).xyz * 2.0 - 1.0;\\n\\tclearcoatMapN.xy *= clearcoatNormalScale;\\n\\t#ifdef USE_TBN\\n\\t\\tclearcoatNormal = normalize(tspace * clearcoatMapN);\\n\\t#else\\n\\t\\tclearcoatMapN.xy *= (float(gl_FrontFacing) * 2.0 - 1.0);\\n\\t\\tclearcoatNormal = normalize(tsn(clearcoatNormal, v_modelPos, v_Uv) * clearcoatMapN);\\n\\t#endif\\n#endif\";\n\n\tvar normal_pars_frag = \"#ifndef FLAT_SHADED\\n\t\tvarying vec3 v_Normal;\\n\t\t#ifdef USE_TANGENT\\n\t\t\t\tvarying vec3 v_Tangent;\\n\\t\\tvarying vec3 v_Bitangent;\\n\t\t#endif\\n#endif\";\n\n\tvar normal_pars_vert = \"#ifndef FLAT_SHADED\\n\t\tvarying vec3 v_Normal;\\n\t\t#ifdef USE_TANGENT\\n\t\t\t\tvarying vec3 v_Tangent;\\n\\t\\tvarying vec3 v_Bitangent;\\n\t\t#endif\\n#endif\";\n\n\tvar normal_vert = \"#ifndef FLAT_SHADED\\n\t\tv_Normal = (transposeMat4(inverseMat4(u_Model)) * vec4(objectNormal, 0.0)).xyz;\\n\t\t#ifdef FLIP_SIDED\\n\t\t\\tv_Normal = - v_Normal;\\n\t\t#endif\\n\t\t#ifdef USE_TANGENT\\n\t\t\t\tv_Tangent = (transposeMat4(inverseMat4(u_Model)) * vec4(objectTangent, 0.0)).xyz;\\n\t\t\t\t#ifdef FLIP_SIDED\\n\t\t\t\t\t\tv_Tangent = - v_Tangent;\\n\t\t\t\t#endif\\n\t\t\t\tv_Bitangent = normalize(cross(v_Normal, v_Tangent) * a_Tangent.w);\\n\t\t#endif\\n#endif\";\n\n\tvar packing = \"const float PackUpscale = 256. / 255.;const float UnpackDownscale = 255. / 256.;\\nconst vec3 PackFactors = vec3( 256. * 256. * 256., 256. * 256.,\t256. );\\nconst vec4 UnpackFactors = UnpackDownscale / vec4( PackFactors, 1. );\\nconst float ShiftRight8 = 1. / 256.;\\nvec4 packDepthToRGBA( const in float v ) {\\n\t\tvec4 r = vec4( fract( v * PackFactors ), v );\\n\t\tr.yzw -= r.xyz * ShiftRight8;\t\treturn r * PackUpscale;\\n}\\nfloat unpackRGBAToDepth( const in vec4 v ) {\\n\t\treturn dot( v, UnpackFactors );\\n}\";\n\n\tvar premultipliedAlpha_frag = \"#ifdef USE_PREMULTIPLIED_ALPHA\\n\t\tgl_FragColor.rgb = gl_FragColor.rgb * gl_FragColor.a;\\n#endif\";\n\n\tvar pvm_vert = \"vec4 worldPosition = u_Model * vec4(transformed, 1.0);\\ngl_Position = u_ProjectionView * worldPosition;\";\n\n\tvar dithering_frag = \"#if defined( DITHERING )\\n\\tgl_FragColor.rgb = dithering( gl_FragColor.rgb );\\n#endif\";\n\n\tvar dithering_pars_frag = \"#if defined( DITHERING )\\n\\tvec3 dithering( vec3 color ) {\\n\\t\\tfloat grid_position = rand( gl_FragCoord.xy );\\n\\t\\tvec3 dither_shift_RGB = vec3( 0.25 / 255.0, -0.25 / 255.0, 0.25 / 255.0 );\\n\\t\\tdither_shift_RGB = mix( 2.0 * dither_shift_RGB, -2.0 * dither_shift_RGB, grid_position );\\n\\t\\treturn color + dither_shift_RGB;\\n\\t}\\n#endif\";\n\n\tvar shadow = \"#ifdef USE_SHADOW_SAMPLER\\n\t\tfloat computeShadow(sampler2DShadow shadowMap, vec3 shadowCoord) {\\n\t\t\t\treturn texture2D( shadowMap, shadowCoord );\\n\t\t}\\n#else\\n\t\tfloat computeShadow(sampler2D shadowMap, vec3 shadowCoord) {\\n\t\t\t\treturn step(shadowCoord.z, unpackRGBAToDepth(texture2D(shadowMap, shadowCoord.xy)));\\n\t\t}\\n#endif\\n#ifdef USE_POISSON_SOFT_SHADOW\\n\t\tfloat computeShadowWithPCF(sampler2DShadow shadowMap, vec3 shadowCoord, vec2 shadowMapSizeAndInverse, vec2 shadowParams) {\\n\t\t\t\tfloat texelSize = shadowParams.x * 0.5 * shadowMapSizeAndInverse.y;\\n\t\t\t\tvec3 poissonDisk[4];\\n\t\t\t\tpoissonDisk[0] = vec3(-0.94201624, -0.39906216, 0);\\n\t\t\t\tpoissonDisk[1] = vec3(0.94558609, -0.76890725, 0);\\n\t\t\t\tpoissonDisk[2] = vec3(-0.094184101, -0.92938870, 0);\\n\t\t\t\tpoissonDisk[3] = vec3(0.34495938, 0.29387760, 0);\\n\t\t\t\treturn computeShadow(shadowMap, shadowCoord + poissonDisk[0] * texelSize) * 0.25 +\\n\t\t\t\t\t\tcomputeShadow(shadowMap, shadowCoord + poissonDisk[1] * texelSize) * 0.25 +\\n\t\t\t\t\t\tcomputeShadow(shadowMap, shadowCoord + poissonDisk[2] * texelSize) * 0.25 +\\n\t\t\t\t\t\tcomputeShadow(shadowMap, shadowCoord + poissonDisk[3] * texelSize) * 0.25;\\n\t\t}\\n#elif defined(USE_VOGEL5_SOFT_SHADOW)\\n\t\tfloat interleavedGradientNoise(vec2 position) {\\n\t\t\t\treturn fract(52.9829189 * fract(dot(position, vec2(0.06711056, 0.00583715))));\\n\t\t}\\n\t\tvec2 vogelDiskSample(int sampleIndex, int samplesCount, float phi) {\\n\t\t\t\tconst float goldenAngle = 2.399963229728653;\\n\t\t\t\tfloat r = sqrt((float(sampleIndex) + 0.5) / float(samplesCount));\\n\t\t\t\tfloat theta = float(sampleIndex) * goldenAngle + phi;\\n\t\t\t\treturn vec2(cos(theta), sin(theta)) * r;\\n\t\t}\\n\t\tfloat computeShadowWithPCF(sampler2DShadow shadowMap, vec3 shadowCoord, vec2 shadowMapSizeAndInverse, vec2 shadowParams) {\\n\t\t\t\tfloat radius = shadowParams.x * shadowMapSizeAndInverse.y;\\n\t\t\t\tfloat phi = interleavedGradientNoise(gl_FragCoord.xy) * 6.28318530718;\\n\t\t\t\tfloat shadow = 0.0;\\n\t\t\t\tshadow += computeShadow(shadowMap, vec3(shadowCoord.xy + vogelDiskSample(0, 5, phi) * radius, shadowCoord.z));\\n\t\t\t\tshadow += computeShadow(shadowMap, vec3(shadowCoord.xy + vogelDiskSample(1, 5, phi) * radius, shadowCoord.z));\\n\t\t\t\tshadow += computeShadow(shadowMap, vec3(shadowCoord.xy + vogelDiskSample(2, 5, phi) * radius, shadowCoord.z));\\n\t\t\t\tshadow += computeShadow(shadowMap, vec3(shadowCoord.xy + vogelDiskSample(3, 5, phi) * radius, shadowCoord.z));\\n\t\t\t\tshadow += computeShadow(shadowMap, vec3(shadowCoord.xy + vogelDiskSample(4, 5, phi) * radius, shadowCoord.z));\\n\t\t\t\treturn shadow * 0.2;\\n\t\t}\\n#elif defined(USE_PCF3_SOFT_SHADOW)\\n\t\tfloat computeShadowWithPCF(sampler2DShadow shadowSampler, vec3 shadowCoord, vec2 shadowMapSizeAndInverse, vec2 shadowParams) {\\n\t\t\t\tvec2 uv = shadowCoord.xy * shadowMapSizeAndInverse.x;\t\t\t\tuv += 0.5;\t\t\t\tvec2 st = fract(uv);\t\t\t\tvec2 base_uv = floor(uv) - 0.5;\t\t\t\tbase_uv *= shadowMapSizeAndInverse.y;\\n\t\t\t\tvec2 uvw0 = 3. - 2. * st;\\n\t\t\t\tvec2 uvw1 = 1. + 2. * st;\\n\t\t\t\tvec2 u = vec2((2. - st.x) / uvw0.x - 1., st.x / uvw1.x + 1.) * shadowMapSizeAndInverse.y;\\n\t\t\t\tvec2 v = vec2((2. - st.y) / uvw0.y - 1., st.y / uvw1.y + 1.) * shadowMapSizeAndInverse.y;\\n\t\t\t\tfloat shadow = 0.;\\n\t\t\t\tshadow += uvw0.x * uvw0.y * computeShadow(shadowSampler, vec3(base_uv.xy + vec2(u[0], v[0]), shadowCoord.z));\\n\t\t\t\tshadow += uvw1.x * uvw0.y * computeShadow(shadowSampler, vec3(base_uv.xy + vec2(u[1], v[0]), shadowCoord.z));\\n\t\t\t\tshadow += uvw0.x * uvw1.y * computeShadow(shadowSampler, vec3(base_uv.xy + vec2(u[0], v[1]), shadowCoord.z));\\n\t\t\t\tshadow += uvw1.x * uvw1.y * computeShadow(shadowSampler, vec3(base_uv.xy + vec2(u[1], v[1]), shadowCoord.z));\\n\t\t\t\tshadow = shadow / 16.;\\n\t\t\t\treturn shadow;\\n\t\t}\\n#elif defined(USE_PCF5_SOFT_SHADOW)\\n\t\tfloat computeShadowWithPCF(sampler2DShadow shadowSampler, vec3 shadowCoord, vec2 shadowMapSizeAndInverse, vec2 shadowParams) {\\n\t\t\t\tvec2 uv = shadowCoord.xy * shadowMapSizeAndInverse.x;\t\t\t\tuv += 0.5;\t\t\t\tvec2 st = fract(uv);\t\t\t\tvec2 base_uv = floor(uv) - 0.5;\t\t\t\tbase_uv *= shadowMapSizeAndInverse.y;\\n\t\t\t\tvec2 uvw0 = 4. - 3. * st;\\n\t\t\t\tvec2 uvw1 = vec2(7.);\\n\t\t\t\tvec2 uvw2 = 1. + 3. * st;\\n\t\t\t\tvec3 u = vec3((3. - 2. * st.x) / uvw0.x - 2., (3. + st.x) / uvw1.x, st.x / uvw2.x + 2.) * shadowMapSizeAndInverse.y;\\n\t\t\t\tvec3 v = vec3((3. - 2. * st.y) / uvw0.y - 2., (3. + st.y) / uvw1.y, st.y / uvw2.y + 2.) * shadowMapSizeAndInverse.y;\\n\t\t\t\tfloat shadow = 0.;\\n\t\t\t\tshadow += uvw0.x * uvw0.y * computeShadow(shadowSampler, vec3(base_uv.xy + vec2(u[0], v[0]), shadowCoord.z));\\n\t\t\t\tshadow += uvw1.x * uvw0.y * computeShadow(shadowSampler, vec3(base_uv.xy + vec2(u[1], v[0]), shadowCoord.z));\\n\t\t\t\tshadow += uvw2.x * uvw0.y * computeShadow(shadowSampler, vec3(base_uv.xy + vec2(u[2], v[0]), shadowCoord.z));\\n\t\t\t\tshadow += uvw0.x * uvw1.y * computeShadow(shadowSampler, vec3(base_uv.xy + vec2(u[0], v[1]), shadowCoord.z));\\n\t\t\t\tshadow += uvw1.x * uvw1.y * computeShadow(shadowSampler, vec3(base_uv.xy + vec2(u[1], v[1]), shadowCoord.z));\\n\t\t\t\tshadow += uvw2.x * uvw1.y * computeShadow(shadowSampler, vec3(base_uv.xy + vec2(u[2], v[1]), shadowCoord.z));\\n\t\t\t\tshadow += uvw0.x * uvw2.y * computeShadow(shadowSampler, vec3(base_uv.xy + vec2(u[0], v[2]), shadowCoord.z));\\n\t\t\t\tshadow += uvw1.x * uvw2.y * computeShadow(shadowSampler, vec3(base_uv.xy + vec2(u[1], v[2]), shadowCoord.z));\\n\t\t\t\tshadow += uvw2.x * uvw2.y * computeShadow(shadowSampler, vec3(base_uv.xy + vec2(u[2], v[2]), shadowCoord.z));\\n\t\t\t\tshadow = shadow / 144.;\\n\t\t\t\treturn shadow;\\n\t\t}\\n#else\\n\t\tfloat computeShadowWithPCF(sampler2DShadow shadowSampler, vec3 shadowCoord,\tvec2 shadowMapSizeAndInverse, vec2 shadowParams) {\\n\t\t\t\treturn computeShadow(shadowSampler, shadowCoord);\\n\t\t}\\n#endif\\nfloat computeFallOff(float value, vec2 clipSpace, float frustumEdgeFalloff) {\\n\t\tfloat factor = mix(clipSpace.y * abs(clipSpace.y), dot(clipSpace, clipSpace), step(0., frustumEdgeFalloff));\\n\t\tfloat mask = smoothstep(1.0 - abs(frustumEdgeFalloff), 1.00000012, clamp(factor, 0., 1.));\\n\t\treturn mix(value, 1.0, mask);\\n}\\nfloat getShadow(sampler2DShadow shadowMap, vec4 shadowCoord, vec2 shadowMapSize, vec2 shadowBias, vec2 shadowParams) {\\n\t\tshadowCoord.xyz /= shadowCoord.w;\\n\t\tshadowCoord.z += shadowBias.x;\\n\t\tbvec4 inFrustumVec = bvec4 (shadowCoord.x >= 0.0, shadowCoord.x <= 1.0, shadowCoord.y >= 0.0, shadowCoord.y <= 1.0);\\n\t\tbool inFrustum = all(inFrustumVec);\\n\t\tbvec2 frustumTestVec = bvec2(inFrustum, shadowCoord.z <= 1.0);\\n\t\tbool frustumTest = all(frustumTestVec);\\n\t\tfloat shadow = 1.0;\\n\t\tif (frustumTest) {\\n\t\t\t\tvec2 shadowMapSizeAndInverse = vec2(shadowMapSize.x, 1. / shadowMapSize.x);\\n\t\t\t\tshadow = computeShadowWithPCF(shadowMap, shadowCoord.xyz, shadowMapSizeAndInverse, shadowParams);\\n\t\t\t\tshadow = computeFallOff(shadow, shadowCoord.xy * 2. - 1., shadowParams.y);\\n\t\t}\\n\t\treturn shadow;\\n}\\nfloat textureCubeCompare(samplerCube depths, vec3 uv, float compare) {\\n\t\treturn step(compare, unpackRGBAToDepth(textureCube(depths, uv)));\\n}\\nfloat getPointShadow(samplerCube shadowMap, vec4 shadowCoord, vec2 shadowMapSize, vec2 shadowBias, vec2 shadowParams, vec2 shadowCameraRange) {\\n\t\tfloat shadow = 1.0;\\n\t\tvec3 lightToPosition = shadowCoord.xyz;\\n\t\tfloat lightToPositionLength = length(lightToPosition);\\n\t\tif (lightToPositionLength - shadowCameraRange.y <= 0.0 && lightToPositionLength - shadowCameraRange.x >= 0.0) {\\n\t\t\t\tfloat dp = (lightToPositionLength - shadowCameraRange.x) / (shadowCameraRange.y - shadowCameraRange.x);\\n\t\t\t\tdp += shadowBias.x;\\n\\t\\tvec3 bd3D = normalize(lightToPosition);\\n\t\t\t\t#ifdef USE_HARD_SHADOW\\n\t\t\t\t\t\tshadow = textureCubeCompare(shadowMap, bd3D, dp);\\n\t\t\t\t#else\\n\t\t\t\t\t\tfloat texelSize = shadowParams.x * 0.5 / shadowMapSize.x;\\n\t\t\t\t\t\tvec2 offset = vec2(-1.0, 1.0) * texelSize;\\n\t\t\t\t\t\tshadow = (\\n\t\t\t\t\t\t\t\ttextureCubeCompare(shadowMap, bd3D + offset.xyy, dp) +\\n\t\t\t\t\t\t\t\ttextureCubeCompare(shadowMap, bd3D + offset.yyy, dp) +\\n\t\t\t\t\t\t\t\ttextureCubeCompare(shadowMap, bd3D + offset.xyx, dp) +\\n\t\t\t\t\t\t\t\ttextureCubeCompare(shadowMap, bd3D + offset.yyx, dp) +\\n\t\t\t\t\t\t\t\ttextureCubeCompare(shadowMap, bd3D, dp) +\\n\t\t\t\t\t\t\t\ttextureCubeCompare(shadowMap, bd3D + offset.xxy, dp) +\\n\t\t\t\t\t\t\t\ttextureCubeCompare(shadowMap, bd3D + offset.yxy, dp) +\\n\t\t\t\t\t\t\t\ttextureCubeCompare(shadowMap, bd3D + offset.xxx, dp) +\\n\t\t\t\t\t\t\t\ttextureCubeCompare(shadowMap, bd3D + offset.yxx, dp)\\n\t\t\t\t\t\t) * (1.0 / 9.0);\\n\t\t\t\t#endif\\n\t\t}\\n\t\treturn shadow;\\n}\\n#ifdef USE_PCSS_SOFT_SHADOW\\n\t\tconst vec3 PoissonSamplers32[64] = vec3[64](\\n\t\t\t\tvec3(0.06407013, 0.05409927, 0.),\\n\t\t\t\tvec3(0.7366577, 0.5789394, 0.),\\n\t\t\t\tvec3(-0.6270542, -0.5320278, 0.),\\n\t\t\t\tvec3(-0.4096107, 0.8411095, 0.),\\n\t\t\t\tvec3(0.6849564, -0.4990818, 0.),\\n\t\t\t\tvec3(-0.874181, -0.04579735, 0.),\\n\t\t\t\tvec3(0.9989998, 0.0009880066, 0.),\\n\t\t\t\tvec3(-0.004920578, -0.9151649, 0.),\\n\t\t\t\tvec3(0.1805763, 0.9747483, 0.),\\n\t\t\t\tvec3(-0.2138451, 0.2635818, 0.),\\n\t\t\t\tvec3(0.109845, 0.3884785, 0.),\\n\t\t\t\tvec3(0.06876755, -0.3581074, 0.),\\n\t\t\t\tvec3(0.374073, -0.7661266, 0.),\\n\t\t\t\tvec3(0.3079132, -0.1216763, 0.),\\n\t\t\t\tvec3(-0.3794335, -0.8271583, 0.),\\n\t\t\t\tvec3(-0.203878, -0.07715034, 0.),\\n\t\t\t\tvec3(0.5912697, 0.1469799, 0.),\\n\t\t\t\tvec3(-0.88069, 0.3031784, 0.),\\n\t\t\t\tvec3(0.5040108, 0.8283722, 0.),\\n\t\t\t\tvec3(-0.5844124, 0.5494877, 0.),\\n\t\t\t\tvec3(0.6017799, -0.1726654, 0.),\\n\t\t\t\tvec3(-0.5554981, 0.1559997, 0.),\\n\t\t\t\tvec3(-0.3016369, -0.3900928, 0.),\\n\t\t\t\tvec3(-0.5550632, -0.1723762, 0.),\\n\t\t\t\tvec3(0.925029, 0.2995041, 0.),\\n\t\t\t\tvec3(-0.2473137, 0.5538505, 0.),\\n\t\t\t\tvec3(0.9183037, -0.2862392, 0.),\\n\t\t\t\tvec3(0.2469421, 0.6718712, 0.),\\n\t\t\t\tvec3(0.3916397, -0.4328209, 0.),\\n\t\t\t\tvec3(-0.03576927, -0.6220032, 0.),\\n\t\t\t\tvec3(-0.04661255, 0.7995201, 0.),\\n\t\t\t\tvec3(0.4402924, 0.3640312, 0.),\\n\t\t\t\tvec3(0., 0., 0.),\\n\t\t\t\tvec3(0., 0., 0.),\\n\t\t\t\tvec3(0., 0., 0.),\\n\t\t\t\tvec3(0., 0., 0.),\\n\t\t\t\tvec3(0., 0., 0.),\\n\t\t\t\tvec3(0., 0., 0.),\\n\t\t\t\tvec3(0., 0., 0.),\\n\t\t\t\tvec3(0., 0., 0.),\\n\t\t\t\tvec3(0., 0., 0.),\\n\t\t\t\tvec3(0., 0., 0.),\\n\t\t\t\tvec3(0., 0., 0.),\\n\t\t\t\tvec3(0., 0., 0.),\\n\t\t\t\tvec3(0., 0., 0.),\\n\t\t\t\tvec3(0., 0., 0.),\\n\t\t\t\tvec3(0., 0., 0.),\\n\t\t\t\tvec3(0., 0., 0.),\\n\t\t\t\tvec3(0., 0., 0.),\\n\t\t\t\tvec3(0., 0., 0.),\\n\t\t\t\tvec3(0., 0., 0.),\\n\t\t\t\tvec3(0., 0., 0.),\\n\t\t\t\tvec3(0., 0., 0.),\\n\t\t\t\tvec3(0., 0., 0.),\\n\t\t\t\tvec3(0., 0., 0.),\\n\t\t\t\tvec3(0., 0., 0.),\\n\t\t\t\tvec3(0., 0., 0.),\\n\t\t\t\tvec3(0., 0., 0.),\\n\t\t\t\tvec3(0., 0., 0.),\\n\t\t\t\tvec3(0., 0., 0.),\\n\t\t\t\tvec3(0., 0., 0.),\\n\t\t\t\tvec3(0., 0., 0.),\\n\t\t\t\tvec3(0., 0., 0.),\\n\t\t\t\tvec3(0., 0., 0.)\\n\t\t);\\n\t\tconst vec3 PoissonSamplers64[64] = vec3[64](\\n\t\t\t\tvec3(-0.613392, 0.617481, 0.),\\n\t\t\t\tvec3(0.170019, -0.040254, 0.),\\n\t\t\t\tvec3(-0.299417, 0.791925, 0.),\\n\t\t\t\tvec3(0.645680, 0.493210, 0.),\\n\t\t\t\tvec3(-0.651784, 0.717887, 0.),\\n\t\t\t\tvec3(0.421003, 0.027070, 0.),\\n\t\t\t\tvec3(-0.817194, -0.271096, 0.),\\n\t\t\t\tvec3(-0.705374, -0.668203, 0.),\\n\t\t\t\tvec3(0.977050, -0.108615, 0.),\\n\t\t\t\tvec3(0.063326, 0.142369, 0.),\\n\t\t\t\tvec3(0.203528, 0.214331, 0.),\\n\t\t\t\tvec3(-0.667531, 0.326090, 0.),\\n\t\t\t\tvec3(-0.098422, -0.295755, 0.),\\n\t\t\t\tvec3(-0.885922, 0.215369, 0.),\\n\t\t\t\tvec3(0.566637, 0.605213, 0.),\\n\t\t\t\tvec3(0.039766, -0.396100, 0.),\\n\t\t\t\tvec3(0.751946, 0.453352, 0.),\\n\t\t\t\tvec3(0.078707, -0.715323, 0.),\\n\t\t\t\tvec3(-0.075838, -0.529344, 0.),\\n\t\t\t\tvec3(0.724479, -0.580798, 0.),\\n\t\t\t\tvec3(0.222999, -0.215125, 0.),\\n\t\t\t\tvec3(-0.467574, -0.405438, 0.),\\n\t\t\t\tvec3(-0.248268, -0.814753, 0.),\\n\t\t\t\tvec3(0.354411, -0.887570, 0.),\\n\t\t\t\tvec3(0.175817, 0.382366, 0.),\\n\t\t\t\tvec3(0.487472, -0.063082, 0.),\\n\t\t\t\tvec3(-0.084078, 0.898312, 0.),\\n\t\t\t\tvec3(0.488876, -0.783441, 0.),\\n\t\t\t\tvec3(0.470016, 0.217933, 0.),\\n\t\t\t\tvec3(-0.696890, -0.549791, 0.),\\n\t\t\t\tvec3(-0.149693, 0.605762, 0.),\\n\t\t\t\tvec3(0.034211, 0.979980, 0.),\\n\t\t\t\tvec3(0.503098, -0.308878, 0.),\\n\t\t\t\tvec3(-0.016205, -0.872921, 0.),\\n\t\t\t\tvec3(0.385784, -0.393902, 0.),\\n\t\t\t\tvec3(-0.146886, -0.859249, 0.),\\n\t\t\t\tvec3(0.643361, 0.164098, 0.),\\n\t\t\t\tvec3(0.634388, -0.049471, 0.),\\n\t\t\t\tvec3(-0.688894, 0.007843, 0.),\\n\t\t\t\tvec3(0.464034, -0.188818, 0.),\\n\t\t\t\tvec3(-0.440840, 0.137486, 0.),\\n\t\t\t\tvec3(0.364483, 0.511704, 0.),\\n\t\t\t\tvec3(0.034028, 0.325968, 0.),\\n\t\t\t\tvec3(0.099094, -0.308023, 0.),\\n\t\t\t\tvec3(0.693960, -0.366253, 0.),\\n\t\t\t\tvec3(0.678884, -0.204688, 0.),\\n\t\t\t\tvec3(0.001801, 0.780328, 0.),\\n\t\t\t\tvec3(0.145177, -0.898984, 0.),\\n\t\t\t\tvec3(0.062655, -0.611866, 0.),\\n\t\t\t\tvec3(0.315226, -0.604297, 0.),\\n\t\t\t\tvec3(-0.780145, 0.486251, 0.),\\n\t\t\t\tvec3(-0.371868, 0.882138, 0.),\\n\t\t\t\tvec3(0.200476, 0.494430, 0.),\\n\t\t\t\tvec3(-0.494552, -0.711051, 0.),\\n\t\t\t\tvec3(0.612476, 0.705252, 0.),\\n\t\t\t\tvec3(-0.578845, -0.768792, 0.),\\n\t\t\t\tvec3(-0.772454, -0.090976, 0.),\\n\t\t\t\tvec3(0.504440, 0.372295, 0.),\\n\t\t\t\tvec3(0.155736, 0.065157, 0.),\\n\t\t\t\tvec3(0.391522, 0.849605, 0.),\\n\t\t\t\tvec3(-0.620106, -0.328104, 0.),\\n\t\t\t\tvec3(0.789239, -0.419965, 0.),\\n\t\t\t\tvec3(-0.545396, 0.538133, 0.),\\n\t\t\t\tvec3(-0.178564, -0.596057, 0.)\\n\t\t);\\n\t\tfloat getRand(vec2 seed) {\\n\t\t\t\treturn fract(sin(dot(seed.xy ,vec2(12.9898,78.233))) * 43758.5453);\\n\t\t}\\n\t\tfloat computeShadowWithPCSS(sampler2D depthSampler, sampler2DShadow shadowSampler, vec3 shadowCoord, float shadowMapSizeInverse, float lightSizeUV, int searchTapCount, int pcfTapCount, vec3[64] poissonSamplers) {\\n\t\t\t\tfloat depthMetric = shadowCoord.z;\\n\t\t\t\tfloat blockerDepth = 0.0;\\n\t\t\t\tfloat sumBlockerDepth = 0.0;\\n\t\t\t\tfloat numBlocker = 0.0;\\n\t\t\t\tfor (int i = 0; i < searchTapCount; i++) {\\n\t\t\t\t\t\tblockerDepth = unpackRGBAToDepth(texture(depthSampler, shadowCoord.xy + (lightSizeUV * shadowMapSizeInverse * PoissonSamplers32[i].xy)));\\n\t\t\t\t\t\tif (blockerDepth < depthMetric) {\\n\t\t\t\t\t\t\t\tsumBlockerDepth += blockerDepth;\\n\t\t\t\t\t\t\t\tnumBlocker++;\\n\t\t\t\t\t\t}\\n\t\t\t\t}\\n\t\t\t\tif (numBlocker < 1.0) {\\n\t\t\t\t\t\treturn 1.0;\\n\t\t\t\t}\\n\t\t\t\tfloat avgBlockerDepth = sumBlockerDepth / numBlocker;\\n\t\t\t\tfloat AAOffset = shadowMapSizeInverse * 10.;\\n\t\t\t\tfloat penumbraRatio = ((depthMetric - avgBlockerDepth) + AAOffset);\\n\t\t\t\tfloat filterRadius = penumbraRatio * lightSizeUV * shadowMapSizeInverse;\\n\t\t\t\tfloat random = getRand(shadowCoord.xy);\t\t\t\tfloat rotationAngle = random * 3.1415926;\\n\t\t\t\tvec2 rotationVector = vec2(cos(rotationAngle), sin(rotationAngle));\\n\t\t\t\tfloat shadow = 0.;\\n\t\t\t\tfor (int i = 0; i < pcfTapCount; i++) {\\n\t\t\t\t\t\tvec3 offset = poissonSamplers[i];\\n\t\t\t\t\t\toffset = vec3(offset.x * rotationVector.x - offset.y * rotationVector.y, offset.y * rotationVector.x + offset.x * rotationVector.y, 0.);\\n\t\t\t\t\t\tshadow += texture(shadowSampler, shadowCoord + offset * filterRadius);\\n\t\t\t\t}\\n\t\t\t\tshadow /= float(pcfTapCount);\\n\t\t\t\tshadow = mix(shadow, 1., depthMetric - avgBlockerDepth);\\n\t\t\t\treturn shadow;\\n\t\t}\\n\t\tfloat getShadowWithPCSS(sampler2D depthSampler, sampler2DShadow shadowMap, vec4 shadowCoord, vec2 shadowMapSize, vec2 shadowBias, vec2 shadowParams) {\\n\t\t\t\tshadowCoord.xyz /= shadowCoord.w;\\n\t\t\t\tshadowCoord.z += shadowBias.x;\\n\t\t\t\tbvec4 inFrustumVec = bvec4 (shadowCoord.x >= 0.0, shadowCoord.x <= 1.0, shadowCoord.y >= 0.0, shadowCoord.y <= 1.0);\\n\t\t\t\tbool inFrustum = all(inFrustumVec);\\n\t\t\t\tbvec2 frustumTestVec = bvec2(inFrustum, shadowCoord.z <= 1.0);\\n\t\t\t\tbool frustumTest = all(frustumTestVec);\\n\t\t\t\tfloat shadow = 1.0;\\n\t\t\t\tif (frustumTest) {\\n\t\t\t\t\t\t#ifdef USE_PCSS16_SOFT_SHADOW\\n\t\t\t\t\t\t\t\tshadow = computeShadowWithPCSS(depthSampler, shadowMap, shadowCoord.xyz, 1. / shadowMapSize.x, 0.1 * shadowMapSize.x, 16, 16, PoissonSamplers32);\\n\t\t\t\t\t\t#else\\n\t\t\t\t\t\t\t\t#ifdef USE_PCSS32_SOFT_SHADOW\\n\t\t\t\t\t\t\t\t\t\tshadow = computeShadowWithPCSS(depthSampler, shadowMap, shadowCoord.xyz, 1. / shadowMapSize.x, 0.1 * shadowMapSize.x, 16, 32, PoissonSamplers32);\\n\t\t\t\t\t\t\t\t#else\\n\t\t\t\t\t\t\t\t\t\tshadow = computeShadowWithPCSS(depthSampler, shadowMap, shadowCoord.xyz, 1. / shadowMapSize.x, 0.1 * shadowMapSize.x, 32, 64, PoissonSamplers64);\\n\t\t\t\t\t\t\t\t#endif\\n\t\t\t\t\t\t#endif\\n\t\t\t\t\t\tshadow = computeFallOff(shadow, shadowCoord.xy * 2. - 1., shadowParams.y);\\n\t\t\t\t}\\n\t\t\t\treturn shadow;\\n\t\t}\\n#endif\";\n\n\tvar shadowMap_frag = \"#ifdef USE_SHADOW\\n#endif\";\n\n\tvar shadowMap_pars_frag = \"#ifdef USE_SHADOW\\n\\t#if NUM_DIR_SHADOWS > 0\\n\\t\\tuniform sampler2DShadow directionalShadowMap[NUM_DIR_SHADOWS];\\n\\t\\tvarying vec4 vDirectionalShadowCoord[NUM_DIR_SHADOWS];\\n\\t\\t#ifdef USE_PCSS_SOFT_SHADOW\\n\\t\\t\\tuniform sampler2D directionalDepthMap[NUM_DIR_SHADOWS];\\n\\t\\t#endif\\n\\t\\tstruct DirectLightShadow {\\n\\t\\t\\tvec2 shadowBias;\\n\\t\\t\\tvec2 shadowMapSize;\\n\\t\\t\\tvec2 shadowParams;\\n\\t\\t};\\n\\t\\tuniform DirectLightShadow u_DirectionalShadow[NUM_DIR_SHADOWS];\\n\\t#endif\\n\\t#if NUM_POINT_SHADOWS > 0\\n\\t\\tuniform samplerCube pointShadowMap[NUM_POINT_SHADOWS];\\n\\t\\tvarying vec4 vPointShadowCoord[NUM_POINT_SHADOWS];\\n\\t\\tstruct PointLightShadow {\\n\\t\\t\\tvec2 shadowBias;\\n\\t\\t\\tvec2 shadowMapSize;\\n\\t\\t\\tvec2 shadowParams;\\n\\t\\t\\tvec2 shadowCameraRange;\\n\\t\\t\\tfloat shadowCameraNear;\\n\\t\\t\\tfloat shadowCameraFar;\\n\\t\\t};\\n\\t\\tuniform PointLightShadow u_PointShadow[NUM_POINT_SHADOWS];\\n\\t#endif\\n\\t#if NUM_SPOT_SHADOWS > 0\\n\\t\\tuniform sampler2DShadow spotShadowMap[NUM_SPOT_SHADOWS];\\n\\t\\tvarying vec4 vSpotShadowCoord[NUM_SPOT_SHADOWS];\\n\\t\\t#ifdef USE_PCSS_SOFT_SHADOW\\n\\t\\t\\tuniform sampler2D spotDepthMap[NUM_SPOT_SHADOWS];\\n\\t\\t#endif\\n\\t\\tstruct SpotLightShadow {\\n\\t\\t\\tvec2 shadowBias;\\n\\t\\t\\tvec2 shadowMapSize;\\n\\t\\t\\tvec2 shadowParams;\\n\\t\\t};\\n\\t\\tuniform SpotLightShadow u_SpotShadow[NUM_SPOT_SHADOWS];\\n\\t#endif\\n\\t#include <packing>\\n\\t#include <shadow>\\n#endif\";\n\n\tvar shadowMap_pars_vert = \"#ifdef USE_SHADOW\\n\\t#if NUM_DIR_SHADOWS > 0\\n\\t\\tuniform mat4 directionalShadowMatrix[NUM_DIR_SHADOWS];\\n\\t\\tvarying vec4 vDirectionalShadowCoord[NUM_DIR_SHADOWS];\\n\\t\\tstruct DirectLightShadow {\\n\\t\\t\\tvec2 shadowBias;\\n\\t\\t\\tvec2 shadowMapSize;\\n\\t\\t\\tvec2 shadowParams;\\n\\t\\t};\\n\\t\\tuniform DirectLightShadow u_DirectionalShadow[NUM_DIR_SHADOWS];\\n\\t#endif\\n\\t#if NUM_POINT_SHADOWS > 0\\n\\t\\tuniform mat4 pointShadowMatrix[NUM_POINT_SHADOWS];\\n\\t\\tvarying vec4 vPointShadowCoord[NUM_POINT_SHADOWS];\\n\\t\\tstruct PointLightShadow {\\n\\t\\t\\tvec2 shadowBias;\\n\\t\\t\\tvec2 shadowMapSize;\\n\\t\\t\\tvec2 shadowParams;\\n\\t\\t\\tvec2 shadowCameraRange;\\n\\t\\t\\tfloat shadowCameraNear;\\n\\t\\t\\tfloat shadowCameraFar;\\n\\t\\t};\\n\\t\\tuniform PointLightShadow u_PointShadow[NUM_POINT_SHADOWS];\\n\\t#endif\\n\\t#if NUM_SPOT_SHADOWS > 0\\n\\t\\tuniform mat4 spotShadowMatrix[NUM_SPOT_SHADOWS];\\n\\t\\tvarying vec4 vSpotShadowCoord[NUM_SPOT_SHADOWS];\\n\\t\\tstruct SpotLightShadow {\\n\\t\\t\\tvec2 shadowBias;\\n\\t\\t\\tvec2 shadowMapSize;\\n\\t\\t\\tvec2 shadowParams;\\n\\t\\t};\\n\\t\\tuniform SpotLightShadow u_SpotShadow[NUM_SPOT_SHADOWS];\\n\\t#endif\\n#endif\";\n\n\tvar shadowMap_vert = \"\\n#ifdef USE_SHADOW\\n\\tvec3 shadowWorldNormal = (transposeMat4(inverseMat4(u_Model)) * vec4(objectNormal, 0.0)).xyz;\\n\\tshadowWorldNormal = normalize(shadowWorldNormal);\\n\\t#ifdef FLIP_SIDED\\n\\t\\tshadowWorldNormal = -shadowWorldNormal;\\n\\t#endif\\n\\tvec4 shadowWorldPosition;\\n\\t#if NUM_DIR_SHADOWS > 0\\n\\t\\t#pragma unroll_loop_start\\n\\t\\tfor (int i = 0; i < NUM_DIR_SHADOWS; i++) {\\n\\t\\t\\tshadowWorldPosition = worldPosition + vec4(shadowWorldNormal * u_DirectionalShadow[i].shadowBias[1], 0);\\n\\t\\t\\tvDirectionalShadowCoord[i] = directionalShadowMatrix[i] * shadowWorldPosition;\\n\\t\\t}\\n\\t\\t#pragma unroll_loop_end\\n\\t#endif\\n\\t#if NUM_POINT_SHADOWS > 0\\n\\t\\t#pragma unroll_loop_start\\n\\t\\tfor (int i = 0; i < NUM_POINT_SHADOWS; i++) {\\n\\t\\t\\tshadowWorldPosition = worldPosition + vec4(shadowWorldNormal * u_PointShadow[i].shadowBias[1], 0);\\n\\t\\t\\tvPointShadowCoord[i] = pointShadowMatrix[i] * shadowWorldPosition;\\n\\t\\t}\\n\\t\\t#pragma unroll_loop_end\\n\\t#endif\\n\\t#if NUM_SPOT_SHADOWS > 0\\n\\t\\t#pragma unroll_loop_start\\n\\t\\tfor (int i = 0; i < NUM_SPOT_SHADOWS; i++) {\\n\\t\\t\\tshadowWorldPosition = worldPosition + vec4(shadowWorldNormal * u_SpotShadow[i].shadowBias[1], 0);\\n\\t\\t\\tvSpotShadowCoord[i] = spotShadowMatrix[i] * shadowWorldPosition;\\n\\t\\t}\\n\\t\\t#pragma unroll_loop_end\\n\\t#endif\\n#endif\";\n\n\tvar morphnormal_vert = \"#ifdef USE_MORPHNORMALS\\n\\tobjectNormal += morphNormal0 * morphTargetInfluences[ 0 ];\\n\\tobjectNormal += morphNormal1 * morphTargetInfluences[ 1 ];\\n\\tobjectNormal += morphNormal2 * morphTargetInfluences[ 2 ];\\n\\tobjectNormal += morphNormal3 * morphTargetInfluences[ 3 ];\\n#endif\";\n\n\tvar morphtarget_pars_vert = \"#ifdef USE_MORPHTARGETS\\n\\t#ifndef USE_MORPHNORMALS\\n\\tuniform float morphTargetInfluences[ 8 ];\\n\\t#else\\n\\tuniform float morphTargetInfluences[ 4 ];\\n\\t#endif\\n#endif\";\n\n\tvar morphtarget_vert = \"#ifdef USE_MORPHTARGETS\\n\\ttransformed += morphTarget0 * morphTargetInfluences[ 0 ];\\n\\ttransformed += morphTarget1 * morphTargetInfluences[ 1 ];\\n\\ttransformed += morphTarget2 * morphTargetInfluences[ 2 ];\\n\\ttransformed += morphTarget3 * morphTargetInfluences[ 3 ];\\n\\t#ifndef USE_MORPHNORMALS\\n\t\t\t\ttransformed += morphTarget4 * morphTargetInfluences[ 4 ];\\n\t\t\t\ttransformed += morphTarget5 * morphTargetInfluences[ 5 ];\\n\t\t\t\ttransformed += morphTarget6 * morphTargetInfluences[ 6 ];\\n\t\t\t\ttransformed += morphTarget7 * morphTargetInfluences[ 7 ];\\n\\t#endif\\n#endif\";\n\n\tvar skinning_pars_vert = \"#ifdef USE_SKINNING\\n\t\tattribute vec4 skinIndex;\\n\\tattribute vec4 skinWeight;\\n\t\tuniform mat4 bindMatrix;\\n\\tuniform mat4 bindMatrixInverse;\\n\t\t#ifdef BONE_TEXTURE\\n\t\t\t\tuniform sampler2D boneTexture;\\n\t\t\t\tuniform int boneTextureSize;\\n\t\t\t\tmat4 getBoneMatrix( const in float i ) {\\n\t\t\t\t\t\tfloat j = i * 4.0;\\n\t\t\t\t\t\tfloat x = mod( j, float( boneTextureSize ) );\\n\t\t\t\t\t\tfloat y = floor( j / float( boneTextureSize ) );\\n\t\t\t\t\t\tfloat dx = 1.0 / float( boneTextureSize );\\n\t\t\t\t\t\tfloat dy = 1.0 / float( boneTextureSize );\\n\t\t\t\t\t\ty = dy * ( y + 0.5 );\\n\t\t\t\t\t\tvec4 v1 = texture2D( boneTexture, vec2( dx * ( x + 0.5 ), y ) );\\n\t\t\t\t\t\tvec4 v2 = texture2D( boneTexture, vec2( dx * ( x + 1.5 ), y ) );\\n\t\t\t\t\t\tvec4 v3 = texture2D( boneTexture, vec2( dx * ( x + 2.5 ), y ) );\\n\t\t\t\t\t\tvec4 v4 = texture2D( boneTexture, vec2( dx * ( x + 3.5 ), y ) );\\n\t\t\t\t\t\tmat4 bone = mat4( v1, v2, v3, v4 );\\n\t\t\t\t\t\treturn bone;\\n\t\t\t\t}\\n\t\t#else\\n\t\t\t\tuniform mat4 boneMatrices[MAX_BONES];\\n\t\t\t\tmat4 getBoneMatrix(const in float i) {\\n\t\t\t\t\t\tmat4 bone = boneMatrices[int(i)];\\n\t\t\t\t\t\treturn bone;\\n\t\t\t\t}\\n\t\t#endif\\n#endif\";\n\n\tvar skinning_vert = \"#ifdef USE_SKINNING\\n\t\tmat4 boneMatX = getBoneMatrix( skinIndex.x );\\n\t\tmat4 boneMatY = getBoneMatrix( skinIndex.y );\\n\t\tmat4 boneMatZ = getBoneMatrix( skinIndex.z );\\n\t\tmat4 boneMatW = getBoneMatrix( skinIndex.w );\\n\t\tvec4 skinVertex = bindMatrix * vec4(transformed, 1.0);\\n\t\tvec4 skinned = vec4( 0.0 );\\n\\tskinned += boneMatX * skinVertex * skinWeight.x;\\n\\tskinned += boneMatY * skinVertex * skinWeight.y;\\n\\tskinned += boneMatZ * skinVertex * skinWeight.z;\\n\\tskinned += boneMatW * skinVertex * skinWeight.w;\\n\\tskinned = bindMatrixInverse * skinned;\\n\t\ttransformed = skinned.xyz / skinned.w;\\n#endif\";\n\n\tvar skinnormal_vert = \"#ifdef USE_SKINNING\\n\t\tmat4 skinMatrix = mat4( 0.0 );\\n\t\tskinMatrix += skinWeight.x * boneMatX;\\n\t\tskinMatrix += skinWeight.y * boneMatY;\\n\t\tskinMatrix += skinWeight.z * boneMatZ;\\n\t\tskinMatrix += skinWeight.w * boneMatW;\\n\t\tskinMatrix = bindMatrixInverse * skinMatrix * bindMatrix;\\n\t\tobjectNormal = vec4( skinMatrix * vec4( objectNormal, 0.0 ) ).xyz;\\n\t\t#ifdef USE_TANGENT\\n\\t\\tobjectTangent = vec4( skinMatrix * vec4( objectTangent, 0.0 ) ).xyz;\\n\\t#endif\\n#endif\";\n\n\tvar specularMap_frag = \"float specularStrength;\\n#ifdef USE_SPECULARMAP\\n\\tvec4 texelSpecular = texture2D( specularMap, v_Uv );\\n\\tspecularStrength = texelSpecular.r;\\n#else\\n\\tspecularStrength = 1.0;\\n#endif\";\n\n\tvar specularMap_pars_frag = \"#ifdef USE_SPECULARMAP\\n\\tuniform sampler2D specularMap;\\n#endif\";\n\n\tvar transpose = \"mat4 transposeMat4(mat4 inMatrix) {\\n\t\tvec4 i0 = inMatrix[0];\\n\t\tvec4 i1 = inMatrix[1];\\n\t\tvec4 i2 = inMatrix[2];\\n\t\tvec4 i3 = inMatrix[3];\\n\t\tmat4 outMatrix = mat4(\\n\t\t\t\tvec4(i0.x, i1.x, i2.x, i3.x),\\n\t\t\t\tvec4(i0.y, i1.y, i2.y, i3.y),\\n\t\t\t\tvec4(i0.z, i1.z, i2.z, i3.z),\\n\t\t\t\tvec4(i0.w, i1.w, i2.w, i3.w)\\n\t\t);\\n\t\treturn outMatrix;\\n}\";\n\n\tvar tsn = \"mat3 tsn(vec3 N, vec3 V, vec2 uv) {\\n\t\tvec3 q0 = dFdx(V.xyz);\\n\t\tvec3 q1 = dFdy(V.xyz);\\n\t\tvec2 st0 = dFdx(uv.xy);\\n\t\tvec2 st1 = dFdy(uv.xy);\\n\t\tfloat scale = sign(st1.y * st0.x - st0.y * st1.x);\\n\t\tvec3 S = normalize((q0 * st1.y - q1 * st0.y) * scale);\\n\t\tvec3 T = normalize((-q0 * st1.x + q1 * st0.x) * scale);\\n\t\treturn mat3(S, T, N);\\n}\";\n\n\tvar uv_pars_frag = \"#ifdef USE_UV1\\n\t\tvarying vec2 v_Uv;\\n#endif\";\n\n\tvar uv_pars_vert = \"#if defined(USE_UV) || defined(USE_UV1)\\n\t\tuniform mat3 uvTransform;\\n#endif\\n#ifdef USE_UV1\\n\t\tattribute vec2 a_Uv;\\n\t\tvarying vec2 v_Uv;\\n#endif\";\n\n\tvar uv_vert = \"#ifdef USE_UV1\\n\t\tv_Uv = (uvTransform * vec3(a_Uv, 1.)).xy;\\n#endif\";\n\n\tvar modelPos_pars_frag = \"varying vec3 v_modelPos;\";\n\n\tvar modelPos_pars_vert = \"varying vec3 v_modelPos;\";\n\n\tvar modelPos_vert = \"\\nv_modelPos = worldPosition.xyz;\";\n\n\tvar logdepthbuf_frag = \"#if defined( USE_LOGDEPTHBUF ) && defined( USE_LOGDEPTHBUF_EXT )\\n\\tgl_FragDepthEXT = vIsPerspective == 0.0 ? gl_FragCoord.z : log2( vFragDepth ) * logDepthBufFC * 0.5;\\n#endif\";\n\n\tvar logdepthbuf_pars_frag = \"#if defined( USE_LOGDEPTHBUF ) && defined( USE_LOGDEPTHBUF_EXT )\\n\\tuniform float logDepthBufFC;\\n\\tvarying float vFragDepth;\\n\\tvarying float vIsPerspective;\\n#endif\";\n\n\tvar logdepthbuf_pars_vert = \"#ifdef USE_LOGDEPTHBUF\\n\\t#ifdef USE_LOGDEPTHBUF_EXT\\n\\t\\tuniform float logDepthCameraNear;\\n\\t\\tvarying float vFragDepth;\\n\\t\\tvarying float vIsPerspective;\\n\\t#else\\n\\t\\tuniform float logDepthBufFC;\\n\\t\\tuniform float logDepthCameraNear;\\n\\t#endif\\n#endif\";\n\n\tvar logdepthbuf_vert = \"#ifdef USE_LOGDEPTHBUF\\n\\t#ifdef USE_LOGDEPTHBUF_EXT\\n\\t\\tvFragDepth = 1.0 + gl_Position.w - logDepthCameraNear;\\n\\t\\tvIsPerspective = float( isPerspectiveMatrix( u_Projection ) );\\n\\t#else\\n\\t\\tif ( isPerspectiveMatrix( u_Projection ) ) {\\n\\t\\t\\tgl_Position.z = log2( max( EPSILON, gl_Position.w - logDepthCameraNear + 1.0 ) ) * logDepthBufFC - 1.0;\\n\\t\\t\\tgl_Position.z *= gl_Position.w;\\n\\t\\t}\\n\\t#endif\\n#endif\";\n\n\tvar clearcoat_pars_frag = \"#ifdef USE_CLEARCOAT\\n\\tuniform float u_Clearcoat;\\n\\tuniform float u_ClearcoatRoughness;\\n#endif\\n#ifdef USE_CLEARCOATMAP\\n\\tuniform sampler2D clearcoatMap;\\n#endif\\n#ifdef USE_CLEARCOAT_ROUGHNESSMAP\\n\\tuniform sampler2D clearcoatRoughnessMap;\\n#endif\\n#ifdef USE_CLEARCOAT_NORMALMAP\\n\\tuniform sampler2D clearcoatNormalMap;\\n\\tuniform vec2 clearcoatNormalScale;\\n#endif\";\n\n\tconst ShaderChunk = {\n\t\talphaTest_frag: alphaTest_frag,\n\t\talphaTest_pars_frag: alphaTest_pars_frag,\n\t\taoMap_pars_frag: aoMap_pars_frag,\n\t\taoMap_pars_vert: aoMap_pars_vert,\n\t\taoMap_vert: aoMap_vert,\n\t\taoMap_frag: aoMap_frag,\n\t\tbegin_frag: begin_frag,\n\t\tbegin_vert: begin_vert,\n\t\tbsdfs: bsdfs,\n\t\tbumpMap_pars_frag: bumpMap_pars_frag,\n\t\tclippingPlanes_frag: clippingPlanes_frag,\n\t\tclippingPlanes_pars_frag: clippingPlanes_pars_frag,\n\t\tcolor_frag: color_frag,\n\t\tcolor_pars_frag: color_pars_frag,\n\t\tcolor_pars_vert: color_pars_vert,\n\t\tcolor_vert: color_vert,\n\t\tcommon_frag: common_frag,\n\t\tcommon_vert: common_vert,\n\t\tdiffuseMap_frag: diffuseMap_frag,\n\t\tdiffuseMap_pars_frag: diffuseMap_pars_frag,\n\t\tdiffuseMap_vert: diffuseMap_vert,\n\t\tdiffuseMap_pars_vert: diffuseMap_pars_vert,\n\t\temissiveMap_frag: emissiveMap_frag,\n\t\temissiveMap_pars_frag: emissiveMap_pars_frag,\n\t\temissiveMap_vert: emissiveMap_vert,\n\t\temissiveMap_pars_vert: emissiveMap_pars_vert,\n\t\tencodings_frag: encodings_frag,\n\t\tencodings_pars_frag: encodings_pars_frag,\n\t\tend_frag: end_frag,\n\t\tenvMap_frag: envMap_frag,\n\t\tenvMap_pars_frag: envMap_pars_frag,\n\t\tenvMap_pars_vert: envMap_pars_vert,\n\t\tenvMap_vert: envMap_vert,\n\t\tfog_frag: fog_frag,\n\t\tfog_pars_frag: fog_pars_frag,\n\t\tinverse: inverse,\n\t\tlight_frag: light_frag,\n\t\tlight_pars_frag: light_pars_frag,\n\t\talphamap_pars_frag: alphamap_pars_frag,\n\t\talphamap_frag: alphamap_frag,\n\t\talphamap_pars_vert: alphamap_pars_vert,\n\t\talphamap_vert: alphamap_vert,\n\t\tnormalMap_pars_frag: normalMap_pars_frag,\n\t\tnormal_frag: normal_frag,\n\t\tnormal_pars_frag: normal_pars_frag,\n\t\tnormal_pars_vert: normal_pars_vert,\n\t\tnormal_vert: normal_vert,\n\t\tpacking: packing,\n\t\tpremultipliedAlpha_frag: premultipliedAlpha_frag,\n\t\tpvm_vert: pvm_vert,\n\t\tdithering_frag: dithering_frag,\n\t\tdithering_pars_frag: dithering_pars_frag,\n\t\tshadow: shadow,\n\t\tshadowMap_frag: shadowMap_frag,\n\t\tshadowMap_pars_frag: shadowMap_pars_frag,\n\t\tshadowMap_pars_vert: shadowMap_pars_vert,\n\t\tshadowMap_vert: shadowMap_vert,\n\t\tmorphnormal_vert: morphnormal_vert,\n\t\tmorphtarget_pars_vert: morphtarget_pars_vert,\n\t\tmorphtarget_vert: morphtarget_vert,\n\t\tskinning_pars_vert: skinning_pars_vert,\n\t\tskinning_vert: skinning_vert,\n\t\tskinnormal_vert: skinnormal_vert,\n\t\tspecularMap_frag: specularMap_frag,\n\t\tspecularMap_pars_frag: specularMap_pars_frag,\n\t\ttranspose: transpose,\n\t\ttsn: tsn,\n\t\tuv_pars_frag: uv_pars_frag,\n\t\tuv_pars_vert: uv_pars_vert,\n\t\tuv_vert: uv_vert,\n\t\tmodelPos_pars_frag: modelPos_pars_frag,\n\t\tmodelPos_pars_vert: modelPos_pars_vert,\n\t\tmodelPos_vert: modelPos_vert,\n\t\tlogdepthbuf_frag: logdepthbuf_frag,\n\t\tlogdepthbuf_pars_frag: logdepthbuf_pars_frag,\n\t\tlogdepthbuf_pars_vert: logdepthbuf_pars_vert,\n\t\tlogdepthbuf_vert: logdepthbuf_vert,\n\t\tclearcoat_pars_frag: clearcoat_pars_frag\n\t};\n\n\tvar basic_frag = \"#include <common_frag>\\n#include <uv_pars_frag>\\n#include <color_pars_frag>\\n#include <diffuseMap_pars_frag>\\n#include <alphamap_pars_frag>\\n#include <alphaTest_pars_frag>\\n#include <modelPos_pars_frag>\\n#if defined(USE_ENV_MAP) && !defined(USE_VERTEX_ENVDIR)\\n\t\t#include <normalMap_pars_frag>\\n\t\t#include <normal_pars_frag>\t\t\\n#endif\\n#include <envMap_pars_frag>\\n#include <aoMap_pars_frag>\\n#include <fog_pars_frag>\\n#include <logdepthbuf_pars_frag>\\n#include <clippingPlanes_pars_frag>\\nvoid main() {\\n\t\t#include <clippingPlanes_frag>\\n\t\t#include <logdepthbuf_frag>\\n\t\t#include <begin_frag>\\n\t\t#include <color_frag>\\n\t\t#include <diffuseMap_frag>\\n\t\t#include <alphamap_frag>\\n\t\t#include <alphaTest_frag>\\n\t\tReflectedLight reflectedLight = ReflectedLight(vec3(0.0), vec3(0.0), vec3(0.0), vec3(0.0));\\n\t\treflectedLight.indirectDiffuse += vec3(1.0);\\n\t\t#include <aoMap_frag>\\n\t\treflectedLight.indirectDiffuse *= outColor.xyz;\\n\t\toutColor.xyz = reflectedLight.indirectDiffuse;\\n\t\t#if defined(USE_ENV_MAP) && !defined(USE_VERTEX_ENVDIR)\\n\t\t\t\t#include <normal_frag>\\n\t\t#endif\\n\t\t#include <envMap_frag>\\n\t\t#include <end_frag>\\n\t\t#include <encodings_frag>\\n\t\t#include <premultipliedAlpha_frag>\\n\t\t#include <fog_frag>\\n}\";\n\n\tvar basic_vert = \"#include <common_vert>\\n#include <uv_pars_vert>\\n#include <color_pars_vert>\\n#include <diffuseMap_pars_vert>\\n#include <modelPos_pars_vert>\\n#if defined(USE_ENV_MAP) && !defined(USE_VERTEX_ENVDIR)\\n\t\t#include <normal_pars_vert>\\n#endif\\n#include <envMap_pars_vert>\\n#include <aoMap_pars_vert>\\n#include <alphamap_pars_vert>\\n#include <morphtarget_pars_vert>\\n#include <skinning_pars_vert>\\n#include <logdepthbuf_pars_vert>\\nvoid main() {\\n\t\t#include <begin_vert>\\n\t\t#include <morphtarget_vert>\\n\t\t#include <skinning_vert>\\n\t\t#include <pvm_vert>\\n\t\t#include <logdepthbuf_vert>\\n\t\t#include <uv_vert>\\n\t\t#include <color_vert>\\n\t\t#include <diffuseMap_vert>\\n\t\t#include <modelPos_vert>\\n\t\t#ifdef USE_ENV_MAP\\n\t\t\t\t#include <morphnormal_vert>\\n\t\t\t\t#include <skinnormal_vert>\\n\t\t\t\t#ifndef USE_VERTEX_ENVDIR\\n\t\t\t\t\t\t#include <normal_vert>\\n\t\t\t\t#endif\t\\n\t\t#endif\\n\t\t#include <envMap_vert>\\n\t\t#include <aoMap_vert>\\n\t\t#include <alphamap_vert>\\n}\";\n\n\tvar depth_frag = \"#include <common_frag>\\n#include <diffuseMap_pars_frag>\\n#include <alphaTest_pars_frag>\\n#include <modelPos_pars_frag>\\n#include <uv_pars_frag>\\n#include <packing>\\n#include <logdepthbuf_pars_frag>\\n#include <clippingPlanes_pars_frag>\\nvoid main() {\\n\t\t#include <clippingPlanes_frag>\\n\t\t#if defined(USE_DIFFUSE_MAP) && defined(ALPHATEST)\\n\t\t\t\tvec4 texelColor = texture2D( diffuseMap, v_Uv );\\n\t\t\t\tfloat alpha = texelColor.a * u_Opacity;\\n\t\t\t\tif(alpha < u_AlphaTest) discard;\\n\t\t#endif\\n\t\t#include <logdepthbuf_frag>\\n\t\t\\n\t\t#ifdef DEPTH_PACKING_RGBA\\n\t\t\t\tgl_FragColor = packDepthToRGBA(gl_FragCoord.z);\\n\t\t#else\\n\t\t\t\tgl_FragColor = vec4( vec3( 1.0 - gl_FragCoord.z ), u_Opacity );\\n\t\t#endif\\n}\";\n\n\tvar depth_vert = \"#include <common_vert>\\n#include <morphtarget_pars_vert>\\n#include <skinning_pars_vert>\\n#include <uv_pars_vert>\\n#include <modelPos_pars_vert>\\n#include <logdepthbuf_pars_vert>\\nvoid main() {\\n\t\t#include <uv_vert>\\n\t\t#include <begin_vert>\\n\t\t#include <morphtarget_vert>\\n\t\t#include <skinning_vert>\\n\t\t#include <pvm_vert>\\n\t\t#include <logdepthbuf_vert>\\n\t\t#include <modelPos_vert>\\n}\";\n\n\tvar distance_frag = \"#include <common_frag>\\nuniform float nearDistance;\\nuniform float farDistance;\\n#include <modelPos_pars_frag>\\n#include <packing>\\n#include <clippingPlanes_pars_frag>\\nvoid main() {\\n\t\t#include <clippingPlanes_frag>\\n\t\t\\n\t\tfloat dist = length( v_modelPos - u_CameraPosition );\\n\\tdist = ( dist - nearDistance ) / ( farDistance - nearDistance );\\n\\tdist = saturate( dist );\\n\t\tgl_FragColor = packDepthToRGBA(dist);\\n}\";\n\n\tvar distance_vert = \"#include <common_vert>\\n#include <modelPos_pars_vert>\\n#include <morphtarget_pars_vert>\\n#include <skinning_pars_vert>\\nvoid main() {\\n\t\t#include <begin_vert>\\n\t\t#include <morphtarget_vert>\\n\t\t#include <skinning_vert>\\n\t\t#include <pvm_vert>\\n\t\t#include <modelPos_vert>\\n}\";\n\n\tvar lambert_frag = \"#define USE_LAMBERT\\n#include <common_frag>\\n#include <dithering_pars_frag>\\nuniform vec3 emissive;\\n#include <uv_pars_frag>\\n#include <color_pars_frag>\\n#include <diffuseMap_pars_frag>\\n#include <normalMap_pars_frag>\\n#include <alphamap_pars_frag>\\n#include <alphaTest_pars_frag>\\n#include <bumpMap_pars_frag>\\n#include <light_pars_frag>\\n#include <normal_pars_frag>\\n#include <modelPos_pars_frag>\\n#include <bsdfs>\\n#include <envMap_pars_frag>\\n#include <aoMap_pars_frag>\\n#include <shadowMap_pars_frag>\\n#include <fog_pars_frag>\\n#include <emissiveMap_pars_frag>\\n#include <logdepthbuf_pars_frag>\\n#include <clippingPlanes_pars_frag>\\nvoid main() {\\n\t\t#include <clippingPlanes_frag>\\n\t\t#include <logdepthbuf_frag>\\n\t\t#include <begin_frag>\\n\t\t#include <color_frag>\\n\t\t#include <diffuseMap_frag>\\n\t\t#include <alphamap_frag>\\n\t\t#include <alphaTest_frag>\\n\t\t#include <normal_frag>\\n\t\tReflectedLight reflectedLight = ReflectedLight(vec3(0.0), vec3(0.0), vec3(0.0), vec3(0.0));\\n\t\t#include <light_frag>\\n\t\t#include <aoMap_frag>\\n\t\toutColor.xyz = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse;\\n\t\t#include <envMap_frag>\\n\t\t#include <shadowMap_frag>\\n\t\tvec3 totalEmissiveRadiance = emissive;\\n\t\t#include <emissiveMap_frag>\\n\t\toutColor.xyz += totalEmissiveRadiance;\\n\t\t#include <end_frag>\\n\t\t#include <encodings_frag>\\n\t\t#include <premultipliedAlpha_frag>\\n\t\t#include <fog_frag>\\n\t\t#include <dithering_frag>\\n}\";\n\n\tvar lambert_vert = \"#define USE_LAMBERT\\n#include <common_vert>\\n#include <normal_pars_vert>\\n#include <uv_pars_vert>\\n#include <color_pars_vert>\\n#include <diffuseMap_pars_vert>\\n#include <modelPos_pars_vert>\\n#include <envMap_pars_vert>\\n#include <aoMap_pars_vert>\\n#include <alphamap_pars_vert>\\n#include <emissiveMap_pars_vert>\\n#include <shadowMap_pars_vert>\\n#include <morphtarget_pars_vert>\\n#include <skinning_pars_vert>\\n#include <logdepthbuf_pars_vert>\\nvoid main() {\\n\t\t#include <begin_vert>\\n\t\t#include <morphtarget_vert>\\n\t\t#include <morphnormal_vert>\\n\t\t#include <skinning_vert>\\n\t\t#include <skinnormal_vert>\\n\t\t#include <pvm_vert>\\n\t\t#include <normal_vert>\\n\t\t#include <logdepthbuf_vert>\\n\t\t#include <uv_vert>\\n\t\t#include <color_vert>\\n\t\t#include <diffuseMap_vert>\\n\t\t#include <modelPos_vert>\\n\t\t#include <envMap_vert>\\n\t\t#include <aoMap_vert>\\n\t\t#include <alphamap_vert>\\n\t\t#include <emissiveMap_vert>\\n\t\t#include <shadowMap_vert>\\n}\";\n\n\tvar normaldepth_frag = \"#include <common_frag>\\n#include <diffuseMap_pars_frag>\\n#include <alphaTest_pars_frag>\\n#include <uv_pars_frag>\\n#include <packing>\\n#include <normal_pars_frag>\\n#include <logdepthbuf_pars_frag>\\nvoid main() {\\n\t\t#if defined(USE_DIFFUSE_MAP) && defined(ALPHATEST)\\n\t\t\t\tvec4 texelColor = texture2D( diffuseMap, v_Uv );\\n\t\t\t\tfloat alpha = texelColor.a * u_Opacity;\\n\t\t\t\tif(alpha < u_AlphaTest) discard;\\n\t\t#endif\\n\t\t#include <logdepthbuf_frag>\\n\t\tvec4 packedNormalDepth;\\n\t\tpackedNormalDepth.xyz = normalize(v_Normal) * 0.5 + 0.5;\\n\t\tpackedNormalDepth.w = gl_FragCoord.z;\\n\t\tgl_FragColor = packedNormalDepth;\\n}\";\n\n\tvar normaldepth_vert = \"#include <common_vert>\\n#include <morphtarget_pars_vert>\\n#include <skinning_pars_vert>\\n#include <normal_pars_vert>\\n#include <uv_pars_vert>\\n#include <logdepthbuf_pars_vert>\\nvoid main() {\\n\t\t#include <uv_vert>\\n\t\t#include <begin_vert>\\n\t\t#include <morphtarget_vert>\\n\t\t#include <morphnormal_vert>\\n\t\t#include <skinning_vert>\\n\t\t#include <skinnormal_vert>\\n\t\t#include <normal_vert>\\n\t\t#include <pvm_vert>\\n\t\t#include <logdepthbuf_vert>\\n}\";\n\n\tvar pbr_frag = \"#define USE_PBR\\n#include <common_frag>\\n#include <dithering_pars_frag>\\nuniform float u_Metalness;\\n#ifdef USE_METALNESSMAP\\n\\tuniform sampler2D metalnessMap;\\n#endif\\nuniform float u_Roughness;\\n#ifdef USE_ROUGHNESSMAP\\n\\tuniform sampler2D roughnessMap;\\n#endif\\nuniform vec3 emissive;\\n#include <uv_pars_frag>\\n#include <color_pars_frag>\\n#include <diffuseMap_pars_frag>\\n#include <alphamap_pars_frag>\\n#include <alphaTest_pars_frag>\\n#include <normalMap_pars_frag>\\n#include <bumpMap_pars_frag>\\n#include <envMap_pars_frag>\\n#include <aoMap_pars_frag>\\n#include <light_pars_frag>\\n#include <normal_pars_frag>\\n#include <clearcoat_pars_frag>\\n#include <modelPos_pars_frag>\\n#include <bsdfs>\\n#include <shadowMap_pars_frag>\\n#include <fog_pars_frag>\\n#include <emissiveMap_pars_frag>\\n#include <logdepthbuf_pars_frag>\\n#include <clippingPlanes_pars_frag>\\nvoid main() {\\n\t\t#include <clippingPlanes_frag>\\n\t\t#include <logdepthbuf_frag>\\n\t\t#include <begin_frag>\\n\t\t#include <color_frag>\\n\t\t#include <diffuseMap_frag>\\n\t\t#include <alphamap_frag>\\n\t\t#include <alphaTest_frag>\\n\t\t#include <normal_frag>\\n\t\tfloat roughnessFactor = u_Roughness;\\n\t\t#ifdef USE_ROUGHNESSMAP\\n\t\t\\tvec4 texelRoughness = texture2D( roughnessMap, v_Uv );\\n\t\t\\troughnessFactor *= texelRoughness.g;\\n\t\t#endif\\n\t\tfloat metalnessFactor = u_Metalness;\\n\t\t#ifdef USE_METALNESSMAP\\n\t\t\\tvec4 texelMetalness = texture2D( metalnessMap, v_Uv );\\n\t\t\\tmetalnessFactor *= texelMetalness.b;\\n\t\t#endif\\n\t\tReflectedLight reflectedLight = ReflectedLight(vec3(0.0), vec3(0.0), vec3(0.0), vec3(0.0));\\n\t\t#include <light_frag>\\n\t\t#include <aoMap_frag>\\n\t\toutColor.xyz = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular;\\n\t\t#include <shadowMap_frag>\\n\t\tvec3 totalEmissiveRadiance = emissive;\\n\t\t#include <emissiveMap_frag>\\n\t\toutColor.xyz += totalEmissiveRadiance;\\n\t\t#include <end_frag>\\n\t\t#include <encodings_frag>\\n\t\t#include <premultipliedAlpha_frag>\\n\t\t#include <fog_frag>\\n\t\t#include <dithering_frag>\\n}\";\n\n\tvar pbr2_frag = \"#define USE_PBR\\n#define USE_PBR2\\n#include <common_frag>\\n#include <dithering_pars_frag>\\nuniform vec3 u_SpecularColor;\\n#ifdef USE_SPECULARMAP\\n\\tuniform sampler2D specularMap;\\n#endif\\nuniform float glossiness;\\n#ifdef USE_GLOSSINESSMAP\\n\\tuniform sampler2D glossinessMap;\\n#endif\\nuniform vec3 emissive;\\n#include <uv_pars_frag>\\n#include <color_pars_frag>\\n#include <diffuseMap_pars_frag>\\n#include <alphamap_pars_frag>\\n#include <alphaTest_pars_frag>\\n#include <normalMap_pars_frag>\\n#include <bumpMap_pars_frag>\\n#include <envMap_pars_frag>\\n#include <aoMap_pars_frag>\\n#include <light_pars_frag>\\n#include <normal_pars_frag>\\n#include <modelPos_pars_frag>\\n#include <bsdfs>\\n#include <shadowMap_pars_frag>\\n#include <fog_pars_frag>\\n#include <emissiveMap_pars_frag>\\n#include <logdepthbuf_pars_frag>\\n#include <clippingPlanes_pars_frag>\\nvoid main() {\\n\t\t#include <clippingPlanes_frag>\\n\t\t#include <logdepthbuf_frag>\\n\t\t#include <begin_frag>\\n\t\t#include <color_frag>\\n\t\t#include <diffuseMap_frag>\\n\t\t#include <alphamap_frag>\\n\t\t#include <alphaTest_frag>\\n\t\t#include <normal_frag>\\n\t\tvec3 specularFactor = u_SpecularColor;\\n\t\t#ifdef USE_SPECULARMAP\\n\t\t\t\tvec4 texelSpecular = texture2D(specularMap, v_Uv);\\n\t\t\t\ttexelSpecular = sRGBToLinear(texelSpecular);\\n\t\t\t\tspecularFactor *= texelSpecular.rgb;\\n\t\t#endif\\n\t\tfloat glossinessFactor = glossiness;\\n\t\t#ifdef USE_GLOSSINESSMAP\\n\t\t\t\tvec4 texelGlossiness = texture2D(glossinessMap, v_Uv);\\n\t\t\t\tglossinessFactor *= texelGlossiness.a;\\n\t\t#endif\\n\t\tReflectedLight reflectedLight = ReflectedLight(vec3(0.0), vec3(0.0), vec3(0.0), vec3(0.0));\\n\t\t#include <light_frag>\\n\t\t#include <aoMap_frag>\\n\t\toutColor.xyz = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular;\\n\t\t#include <shadowMap_frag>\\n\t\tvec3 totalEmissiveRadiance = emissive;\\n\t\t#include <emissiveMap_frag>\\n\t\toutColor.xyz += totalEmissiveRadiance;\\n\t\t#include <end_frag>\\n\t\t#include <encodings_frag>\\n\t\t#include <premultipliedAlpha_frag>\\n\t\t#include <fog_frag>\\n\t\t#include <dithering_frag>\\n}\";\n\n\tvar pbr_vert = \"#define USE_PBR\\n#include <common_vert>\\n#include <normal_pars_vert>\\n#include <uv_pars_vert>\\n#include <color_pars_vert>\\n#include <diffuseMap_pars_vert>\\n#include <modelPos_pars_vert>\\n#include <envMap_pars_vert>\\n#include <aoMap_pars_vert>\\n#include <alphamap_pars_vert>\\n#include <emissiveMap_pars_vert>\\n#include <shadowMap_pars_vert>\\n#include <morphtarget_pars_vert>\\n#include <skinning_pars_vert>\\n#include <logdepthbuf_pars_vert>\\nvoid main() {\\n\t\t#include <begin_vert>\\n\t\t#include <morphtarget_vert>\\n\t\t#include <morphnormal_vert>\\n\t\t#include <skinning_vert>\\n\t\t#include <skinnormal_vert>\\n\t\t#include <pvm_vert>\\n\t\t#include <normal_vert>\\n\t\t#include <logdepthbuf_vert>\\n\t\t#include <uv_vert>\\n\t\t#include <color_vert>\\n\t\t#include <diffuseMap_vert>\\n\t\t#include <modelPos_vert>\\n\t\t#include <envMap_vert>\\n\t\t#include <aoMap_vert>\\n\t\t#include <alphamap_vert>\\n\t\t#include <emissiveMap_vert>\\n\t\t#include <shadowMap_vert>\\n}\";\n\n\tvar phong_frag = \"#define USE_PHONG\\n#include <common_frag>\\n#include <dithering_pars_frag>\\nuniform float u_Specular;\\nuniform vec3 u_SpecularColor;\\n#include <specularMap_pars_frag>\\nuniform vec3 emissive;\\n#include <uv_pars_frag>\\n#include <color_pars_frag>\\n#include <diffuseMap_pars_frag>\\n#include <alphamap_pars_frag>\\n#include <alphaTest_pars_frag>\\n#include <normalMap_pars_frag>\\n#include <bumpMap_pars_frag>\\n#include <light_pars_frag>\\n#include <normal_pars_frag>\\n#include <modelPos_pars_frag>\\n#include <bsdfs>\\n#include <envMap_pars_frag>\\n#include <aoMap_pars_frag>\\n#include <shadowMap_pars_frag>\\n#include <fog_pars_frag>\\n#include <emissiveMap_pars_frag>\\n#include <logdepthbuf_pars_frag>\\n#include <clippingPlanes_pars_frag>\\nvoid main() {\\n\t\t#include <clippingPlanes_frag>\\n\t\t#include <logdepthbuf_frag>\\n\t\t#include <begin_frag>\\n\t\t#include <color_frag>\\n\t\t#include <diffuseMap_frag>\\n\t\t#include <alphamap_frag>\\n\t\t#include <alphaTest_frag>\\n\t\t#include <normal_frag>\\n\t\t#include <specularMap_frag>\\n\t\tReflectedLight reflectedLight = ReflectedLight(vec3(0.0), vec3(0.0), vec3(0.0), vec3(0.0));\\n\t\t#include <light_frag>\\n\t\t#include <aoMap_frag>\\n\t\toutColor.xyz = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular;\\n\t\t#include <envMap_frag>\\n\t\t#include <shadowMap_frag>\\n\t\tvec3 totalEmissiveRadiance = emissive;\\n\t\t#include <emissiveMap_frag>\\n\t\toutColor.xyz += totalEmissiveRadiance;\\n\t\t#include <end_frag>\\n\t\t#include <encodings_frag>\\n\t\t#include <premultipliedAlpha_frag>\\n\t\t#include <fog_frag>\\n\t\t#include <dithering_frag>\\n}\";\n\n\tvar phong_vert = \"#define USE_PHONG\\n#include <common_vert>\\n#include <normal_pars_vert>\\n#include <uv_pars_vert>\\n#include <color_pars_vert>\\n#include <diffuseMap_pars_vert>\\n#include <modelPos_pars_vert>\\n#include <envMap_pars_vert>\\n#include <aoMap_pars_vert>\\n#include <alphamap_pars_vert>\\n#include <emissiveMap_pars_vert>\\n#include <shadowMap_pars_vert>\\n#include <morphtarget_pars_vert>\\n#include <skinning_pars_vert>\\n#include <logdepthbuf_pars_vert>\\nvoid main() {\\n\t\t#include <begin_vert>\\n\t\t#include <morphtarget_vert>\\n\t\t#include <morphnormal_vert>\\n\t\t#include <skinning_vert>\\n\t\t#include <skinnormal_vert>\\n\t\t#include <pvm_vert>\\n\t\t#include <normal_vert>\\n\t\t#include <logdepthbuf_vert>\\n\t\t#include <uv_vert>\\n\t\t#include <color_vert>\\n\t\t#include <diffuseMap_vert>\\n\t\t#include <modelPos_vert>\\n\t\t#include <envMap_vert>\\n\t\t#include <aoMap_vert>\\n\t\t#include <alphamap_vert>\\n\t\t#include <emissiveMap_vert>\\n\t\t#include <shadowMap_vert>\\n}\";\n\n\tvar point_frag = \"#include <common_frag>\\n#include <color_pars_frag>\\n#include <diffuseMap_pars_frag>\\n#include <fog_pars_frag>\\n#include <logdepthbuf_pars_frag>\\nvoid main() {\\n\t\t#include <begin_frag>\\n\t\t#include <color_frag>\\n\t\t#include <logdepthbuf_frag>\\n\t\t#ifdef USE_DIFFUSE_MAP\\n\t\t\t\toutColor *= texture2D(diffuseMap, vec2(gl_PointCoord.x, 1.0 - gl_PointCoord.y));\\n\t\t#endif\\n\t\t#include <end_frag>\\n\t\t#include <encodings_frag>\\n\t\t#include <premultipliedAlpha_frag>\\n\t\t#include <fog_frag>\\n}\";\n\n\tvar point_vert = \"#include <common_vert>\\n#include <color_pars_vert>\\n#include <logdepthbuf_pars_vert>\\nuniform float u_PointSize;\\nuniform vec2 u_RenderTargetSize;\\nvoid main() {\\n\t\t#include <begin_vert>\\n\t\t#include <pvm_vert>\\n\t\t#include <color_vert>\\n\t\tvec4 mvPosition = u_View * u_Model * vec4(transformed, 1.0);\\n\t\t#ifdef USE_SIZEATTENUATION\\n\t\t\t\tgl_PointSize = u_PointSize * (u_RenderTargetSize.y * 0.5 / -mvPosition.z);\\n\t\t#else\\n\t\t\t\tgl_PointSize = u_PointSize;\\n\t\t#endif\\n\t\t#include <logdepthbuf_vert>\\n}\";\n\n\tconst ShaderLib = {\n\t\tbasic_frag: basic_frag,\n\t\tbasic_vert: basic_vert,\n\t\tdepth_frag: depth_frag,\n\t\tdepth_vert: depth_vert,\n\t\tdistance_frag: distance_frag,\n\t\tdistance_vert: distance_vert,\n\t\tlambert_frag: lambert_frag,\n\t\tlambert_vert: lambert_vert,\n\t\tnormaldepth_frag: normaldepth_frag,\n\t\tnormaldepth_vert: normaldepth_vert,\n\t\tpbr_frag: pbr_frag,\n\t\tpbr_vert: pbr_vert,\n\t\tpbr2_frag: pbr2_frag,\n\t\tpbr2_vert: pbr_vert,\n\t\tphong_frag: phong_frag,\n\t\tphong_vert: phong_vert,\n\t\tpoint_frag: point_frag,\n\t\tpoint_vert: point_vert\n\t};\n\n\tclass WebGLAttribute {\n\t\tconstructor(gl, program, attributeData) {\n\t\t\tthis.gl = gl;\n\t\t\tthis.name = attributeData.name;\n\t\t\tthis.type = attributeData.type;\n\t\t\tthis.size = attributeData.size;\n\t\t\tthis.location = gl.getAttribLocation(program, this.name);\n\t\t\tthis.count = getAttributeCount(gl, this.type);\n\t\t\tthis.format = getAttributeFormat(gl, this.type);\n\t\t\tthis.locationSize = 1;\n\t\t\tif (this.type === gl.FLOAT_MAT2) this.locationSize = 2;\n\t\t\tif (this.type === gl.FLOAT_MAT3) this.locationSize = 3;\n\t\t\tif (this.type === gl.FLOAT_MAT4) this.locationSize = 4;\n\t\t}\n\t}\n\tfunction getAttributeCount(gl, type) {\n\t\tswitch (type) {\n\t\t\tcase gl.FLOAT:\n\t\t\tcase gl.INT:\n\t\t\tcase gl.UNSIGNED_INT:\n\t\t\t\treturn 1;\n\t\t\tcase gl.FLOAT_VEC2:\n\t\t\tcase gl.INT_VEC2:\n\t\t\t\treturn 2;\n\t\t\tcase gl.FLOAT_VEC3:\n\t\t\tcase gl.INT_VEC3:\n\t\t\t\treturn 3;\n\t\t\tcase gl.FLOAT_VEC4:\n\t\t\tcase gl.INT_VEC4:\n\t\t\t\treturn 4;\n\t\t\tcase gl.FLOAT_MAT2:\n\t\t\t\treturn 4;\n\t\t\tcase gl.FLOAT_MAT3:\n\t\t\t\treturn 9;\n\t\t\tcase gl.FLOAT_MAT4:\n\t\t\t\treturn 16;\n\t\t\tdefault:\n\t\t\t\treturn 0;\n\t\t}\n\t}\n\tfunction getAttributeFormat(gl, type) {\n\t\tswitch (type) {\n\t\t\tcase gl.FLOAT:\n\t\t\tcase gl.FLOAT_VEC2:\n\t\t\tcase gl.FLOAT_VEC3:\n\t\t\tcase gl.FLOAT_VEC4:\n\t\t\tcase gl.FLOAT_MAT2:\n\t\t\tcase gl.FLOAT_MAT3:\n\t\t\tcase gl.FLOAT_MAT4:\n\t\t\t\treturn gl.FLOAT;\n\t\t\tcase gl.INT:\n\t\t\tcase gl.INT_VEC2:\n\t\t\tcase gl.INT_VEC3:\n\t\t\tcase gl.INT_VEC4:\n\t\t\t\treturn gl.INT;\n\t\t\tcase gl.UNSIGNED_INT:\n\t\t\t\treturn gl.UNSIGNED_INT;\n\t\t\tdefault:\n\t\t\t\treturn gl.FLOAT;\n\t\t}\n\t}\n\n\tclass WebGLCapabilities {\n\t\tconstructor(gl) {\n\t\t\tthis._gl = gl;\n\t\t\tthis._extensions = {};\n\n\t\t\t// webgl version\n\n\t\t\tthis.version = parseFloat(/^WebGL (\\d)/.exec(gl.getParameter(gl.VERSION))[1]);\n\n\t\t\t// texture filter anisotropic extension\n\t\t\t// this extension is available to both, WebGL1 and WebGL2 contexts.\n\n\t\t\tconst anisotropyExt = this.getExtension('EXT_texture_filter_anisotropic');\n\t\t\tthis.anisotropyExt = anisotropyExt;\n\t\t\tthis.maxAnisotropy = anisotropyExt !== null ? gl.getParameter(anisotropyExt.MAX_TEXTURE_MAX_ANISOTROPY_EXT) : 1;\n\n\t\t\t// query extension\n\n\t\t\tlet timerQuery = null,\n\t\t\t\tcanUseTimestamp = false;\n\t\t\ttry {\n\t\t\t\tif (this.version > 1) {\n\t\t\t\t\ttimerQuery = this.getExtension('EXT_disjoint_timer_query_webgl2');\n\t\t\t\t\tif (timerQuery) {\n\t\t\t\t\t\tcanUseTimestamp = !!gl.getQuery(timerQuery.TIMESTAMP_EXT, timerQuery.QUERY_COUNTER_BITS_EXT);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\ttimerQuery = this.getExtension('EXT_disjoint_timer_query');\n\t\t\t\t\tif (timerQuery) {\n\t\t\t\t\t\tcanUseTimestamp = !!timerQuery.getQueryEXT(timerQuery.TIMESTAMP_EXT, timerQuery.QUERY_COUNTER_BITS_EXT);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} catch (err) {\n\t\t\t\tconsole.warn(err);\n\t\t\t}\n\t\t\tthis.timerQuery = timerQuery;\n\t\t\tthis.canUseTimestamp = canUseTimestamp;\n\n\t\t\t// parallel_shader_compile\n\n\t\t\tthis.parallelShaderCompileExt = this.getExtension('KHR_parallel_shader_compile');\n\n\t\t\t// others\n\n\t\t\tthis.maxPrecision = getMaxPrecision(gl, 'highp');\n\t\t\tthis.maxTextures = gl.getParameter(gl.MAX_TEXTURE_IMAGE_UNITS);\n\t\t\tthis.maxVertexTextures = gl.getParameter(gl.MAX_VERTEX_TEXTURE_IMAGE_UNITS);\n\t\t\tthis.maxTextureSize = gl.getParameter(gl.MAX_TEXTURE_SIZE);\n\t\t\tthis.maxCubemapSize = gl.getParameter(gl.MAX_CUBE_MAP_TEXTURE_SIZE);\n\t\t\tthis.maxVertexUniformVectors = gl.getParameter(gl.MAX_VERTEX_UNIFORM_VECTORS);\n\t\t\tthis.maxSamples = this.version > 1 ? gl.getParameter(gl.MAX_SAMPLES) : 1;\n\t\t\tthis.lineWidthRange = gl.getParameter(gl.ALIASED_LINE_WIDTH_RANGE);\n\t\t}\n\t\tgetExtension(name) {\n\t\t\tconst gl = this._gl;\n\t\t\tconst extensions = this._extensions;\n\t\t\tif (extensions[name] !== undefined) {\n\t\t\t\treturn extensions[name];\n\t\t\t}\n\t\t\tlet ext = null;\n\t\t\tfor (const prefix of vendorPrefixes) {\n\t\t\t\text = gl.getExtension(prefix + name);\n\t\t\t\tif (ext) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\textensions[name] = ext;\n\t\t\treturn ext;\n\t\t}\n\t}\n\tconst vendorPrefixes = ['', 'WEBKIT_', 'MOZ_'];\n\tfunction getMaxPrecision(gl, precision) {\n\t\tif (precision === 'highp') {\n\t\t\tif (gl.getShaderPrecisionFormat(gl.VERTEX_SHADER, gl.HIGH_FLOAT).precision > 0 && gl.getShaderPrecisionFormat(gl.FRAGMENT_SHADER, gl.HIGH_FLOAT).precision > 0) {\n\t\t\t\treturn 'highp';\n\t\t\t}\n\t\t\tprecision = 'mediump';\n\t\t}\n\t\tif (precision === 'mediump') {\n\t\t\tif (gl.getShaderPrecisionFormat(gl.VERTEX_SHADER, gl.MEDIUM_FLOAT).precision > 0 && gl.getShaderPrecisionFormat(gl.FRAGMENT_SHADER, gl.MEDIUM_FLOAT).precision > 0) {\n\t\t\t\treturn 'mediump';\n\t\t\t}\n\t\t}\n\t\treturn 'lowp';\n\t}\n\n\t// This class handles buffer creation and updating for geometries.\n\tclass WebGLGeometries extends PropertyMap {\n\t\tconstructor(prefix, gl, buffers, vertexArrayBindings) {\n\t\t\tsuper(prefix);\n\t\t\tthis._gl = gl;\n\t\t\tthis._buffers = buffers;\n\t\t\tthis._vertexArrayBindings = vertexArrayBindings;\n\t\t\tconst that = this;\n\t\t\tfunction onGeometryDispose(event) {\n\t\t\t\tconst geometry = event.target;\n\t\t\t\tconst geometryProperties = that.get(geometry);\n\t\t\t\tgeometry.removeEventListener('dispose', onGeometryDispose);\n\t\t\t\tif (geometry.index !== null) {\n\t\t\t\t\tbuffers.removeBuffer(geometry.index.buffer);\n\t\t\t\t}\n\t\t\t\tfor (const name in geometry.attributes) {\n\t\t\t\t\tbuffers.removeBuffer(geometry.attributes[name].buffer);\n\t\t\t\t}\n\t\t\t\tfor (const name in geometry.morphAttributes) {\n\t\t\t\t\tconst array = geometry.morphAttributes[name];\n\t\t\t\t\tfor (let i = 0, l = array.length; i < l; i++) {\n\t\t\t\t\t\tbuffers.removeBuffer(array[i].buffer);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tvertexArrayBindings.releaseByGeometry(geometry);\n\t\t\t\tgeometryProperties.created = false;\n\t\t\t\tthat.delete(geometry);\n\t\t\t}\n\t\t\tthis._onGeometryDispose = onGeometryDispose;\n\t\t}\n\t\tsetGeometry(geometry, passInfo) {\n\t\t\tconst gl = this._gl;\n\t\t\tconst buffers = this._buffers;\n\t\t\tconst geometryProperties = this.get(geometry);\n\n\t\t\t// If in pass rendering, skip the geometry if it has been set in this pass.\n\t\t\tif (geometryProperties.pass === passInfo.count) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tgeometryProperties.pass = passInfo.count;\n\t\t\tif (!geometryProperties.created) {\n\t\t\t\tgeometry.addEventListener('dispose', this._onGeometryDispose);\n\t\t\t\tgeometryProperties.created = true;\n\t\t\t}\n\t\t\tif (geometry.index !== null) {\n\t\t\t\tbuffers.setBuffer(geometry.index.buffer, gl.ELEMENT_ARRAY_BUFFER, this._vertexArrayBindings);\n\t\t\t}\n\t\t\tfor (const name in geometry.attributes) {\n\t\t\t\tbuffers.setBuffer(geometry.attributes[name].buffer, gl.ARRAY_BUFFER);\n\t\t\t}\n\t\t\tfor (const name in geometry.morphAttributes) {\n\t\t\t\tconst array = geometry.morphAttributes[name];\n\t\t\t\tfor (let i = 0, l = array.length; i < l; i++) {\n\t\t\t\t\tbuffers.setBuffer(array[i].buffer, gl.ARRAY_BUFFER);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn geometryProperties;\n\t\t}\n\t}\n\n\t// Build-in uniforms\n\n\tconst internalUniforms = {\n\t\t'u_Model': [1, null],\n\t\t'u_Projection': [2, function (cameraData) {\n\t\t\tthis.set(cameraData.projectionMatrix.elements);\n\t\t}],\n\t\t'u_View': [2, function (cameraData) {\n\t\t\tthis.set(cameraData.viewMatrix.elements);\n\t\t}],\n\t\t'u_ProjectionView': [2, function (cameraData) {\n\t\t\tthis.set(cameraData.projectionViewMatrix.elements);\n\t\t}],\n\t\t'u_CameraPosition': [2, function (cameraData) {\n\t\t\tthis.setValue(cameraData.position.x, cameraData.position.y, cameraData.position.z);\n\t\t}],\n\t\t'logDepthBufFC': [2, function (cameraData) {\n\t\t\tthis.set(cameraData.logDepthBufFC);\n\t\t}],\n\t\t'logDepthCameraNear': [2, function (cameraData) {\n\t\t\tthis.set(cameraData.logDepthCameraNear);\n\t\t}],\n\t\t'u_FogColor': [3, function (sceneData) {\n\t\t\tconst color = sceneData.fog.color;\n\t\t\tthis.setValue(color.r, color.g, color.b);\n\t\t}],\n\t\t'u_FogDensity': [3, function (sceneData) {\n\t\t\tthis.set(sceneData.fog.density);\n\t\t}],\n\t\t'u_FogNear': [3, function (sceneData) {\n\t\t\tthis.set(sceneData.fog.near);\n\t\t}],\n\t\t'u_FogFar': [3, function (sceneData) {\n\t\t\tthis.set(sceneData.fog.far);\n\t\t}],\n\t\t'u_Color': [4, function (material, textures) {\n\t\t\tconst color = material.diffuse;\n\t\t\tthis.setValue(color.r, color.g, color.b);\n\t\t}],\n\t\t'u_Opacity': [4, function (material, textures) {\n\t\t\tthis.set(material.opacity);\n\t\t}],\n\t\t'u_AlphaTest': [4, function (material, textures) {\n\t\t\tthis.set(material.alphaTest);\n\t\t}],\n\t\t'diffuseMap': [4, function (material, textures) {\n\t\t\tthis.set(material.diffuseMap, textures);\n\t\t}],\n\t\t'alphaMap': [4, function (material, textures) {\n\t\t\tthis.set(material.alphaMap, textures);\n\t\t}],\n\t\t'alphaMapUVTransform': [4, function (material, textures) {\n\t\t\tconst transform = material.alphaMapTransform;\n\t\t\ttransform.isTransformUV && transform.update();\n\t\t\tthis.set(transform.elements);\n\t\t}],\n\t\t'normalMap': [4, function (material, textures) {\n\t\t\tthis.set(material.normalMap, textures);\n\t\t}],\n\t\t'normalScale': [4, function (material, textures) {\n\t\t\tthis.setValue(material.normalScale.x, material.normalScale.y);\n\t\t}],\n\t\t'bumpMap': [4, function (material, textures) {\n\t\t\tthis.set(material.bumpMap, textures);\n\t\t}],\n\t\t'bumpScale': [4, function (material, textures) {\n\t\t\tthis.set(material.bumpScale);\n\t\t}],\n\t\t'cubeMap': [4, function (material, textures) {\n\t\t\tthis.set(material.cubeMap, textures);\n\t\t}],\n\t\t'u_Specular': [4, function (material, textures) {\n\t\t\tthis.set(material.shininess);\n\t\t}],\n\t\t'u_SpecularColor': [4, function (material, textures) {\n\t\t\tconst color = material.specular;\n\t\t\tthis.setValue(color.r, color.g, color.b);\n\t\t}],\n\t\t'specularMap': [4, function (material, textures) {\n\t\t\tthis.set(material.specularMap, textures);\n\t\t}],\n\t\t'aoMap': [4, function (material, textures) {\n\t\t\tthis.set(material.aoMap, textures);\n\t\t}],\n\t\t'aoMapIntensity': [4, function (material, textures) {\n\t\t\tthis.set(material.aoMapIntensity);\n\t\t}],\n\t\t'aoMapUVTransform': [4, function (material, textures) {\n\t\t\tconst transform = material.aoMapTransform;\n\t\t\ttransform.isTransformUV && transform.update();\n\t\t\tthis.set(transform.elements);\n\t\t}],\n\t\t'u_Roughness': [4, function (material, textures) {\n\t\t\tthis.set(material.roughness);\n\t\t}],\n\t\t'roughnessMap': [4, function (material, textures) {\n\t\t\tthis.set(material.roughnessMap, textures);\n\t\t}],\n\t\t'u_Metalness': [4, function (material, textures) {\n\t\t\tthis.set(material.metalness);\n\t\t}],\n\t\t'metalnessMap': [4, function (material, textures) {\n\t\t\tthis.set(material.metalnessMap, textures);\n\t\t}],\n\t\t'u_Clearcoat': [4, function (material, textures) {\n\t\t\tthis.set(material.clearcoat);\n\t\t}],\n\t\t'u_ClearcoatRoughness': [4, function (material, textures) {\n\t\t\tthis.set(material.clearcoatRoughness);\n\t\t}],\n\t\t'clearcoatMap': [4, function (material, textures) {\n\t\t\tthis.set(material.clearcoatMap, textures);\n\t\t}],\n\t\t'clearcoatRoughnessMap': [4, function (material, textures) {\n\t\t\tthis.set(material.clearcoatRoughnessMap, textures);\n\t\t}],\n\t\t'clearcoatNormalMap': [4, function (material, textures) {\n\t\t\tthis.set(material.clearcoatNormalMap, textures);\n\t\t}],\n\t\t'clearcoatNormalScale': [4, function (material, textures) {\n\t\t\tthis.setValue(material.clearcoatNormalScale.x, material.clearcoatNormalScale.y);\n\t\t}],\n\t\t'glossiness': [4, function (material, textures) {\n\t\t\tthis.set(material.glossiness);\n\t\t}],\n\t\t'glossinessMap': [4, function (material, textures) {\n\t\t\tthis.set(material.glossinessMap, textures);\n\t\t}],\n\t\t'emissive': [4, function (material, textures) {\n\t\t\tconst color = material.emissive;\n\t\t\tthis.setValue(color.r, color.g, color.b);\n\t\t}],\n\t\t'emissiveMap': [4, function (material, textures) {\n\t\t\tthis.set(material.emissiveMap, textures);\n\t\t}],\n\t\t'emissiveMapUVTransform': [4, function (material, textures) {\n\t\t\tconst transform = material.emissiveMapTransform;\n\t\t\ttransform.isTransformUV && transform.update();\n\t\t\tthis.set(transform.elements);\n\t\t}],\n\t\t'uvTransform': [4, function (material, textures) {\n\t\t\tconst transform = material.diffuseMapTransform;\n\t\t\ttransform.isTransformUV && transform.update();\n\t\t\tthis.set(transform.elements);\n\t\t}],\n\t\t'u_PointSize': [4, function (material, textures) {\n\t\t\tthis.set(material.size);\n\t\t}],\n\t\t'envMap': [5, function (envData, textures) {\n\t\t\tthis.set(envData.map, textures);\n\t\t}],\n\t\t'envMapParams': [5, function (envData, textures) {\n\t\t\tthis.setValue(envData.diffuse, envData.specular, envData.map.images[0] && envData.map.images[0].rtt ? 1 : -1);\n\t\t}],\n\t\t'maxMipLevel': [5, function (envData, textures) {\n\t\t\tthis.set(textures.get(envData.map).__maxMipLevel || 8);\n\t\t}]\n\t};\n\n\t// Empty textures\n\n\tconst emptyTexture = new Texture2D();\n\temptyTexture.image = {\n\t\tdata: new Uint8Array([1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1]),\n\t\twidth: 2,\n\t\theight: 2\n\t};\n\temptyTexture.magFilter = TEXTURE_FILTER.NEAREST;\n\temptyTexture.minFilter = TEXTURE_FILTER.NEAREST;\n\temptyTexture.generateMipmaps = false;\n\temptyTexture.version++;\n\tconst emptyShadowTexture = new Texture2D();\n\temptyShadowTexture.image = {\n\t\tdata: null,\n\t\twidth: 2,\n\t\theight: 2\n\t};\n\temptyShadowTexture.version++;\n\temptyShadowTexture.type = PIXEL_TYPE.FLOAT_32_UNSIGNED_INT_24_8_REV;\n\temptyShadowTexture.format = PIXEL_FORMAT.DEPTH_STENCIL;\n\temptyShadowTexture.magFilter = TEXTURE_FILTER.NEAREST;\n\temptyShadowTexture.minFilter = TEXTURE_FILTER.NEAREST;\n\temptyShadowTexture.compare = COMPARE_FUNC.LESS;\n\temptyShadowTexture.generateMipmaps = false;\n\temptyShadowTexture.version++;\n\tconst emptyTexture3d = new Texture3D();\n\tconst emptyTexture2dArray = new Texture2DArray();\n\tconst emptyCubeTexture = new TextureCube();\n\n\t// Array helpers\n\n\tfunction arraysEqual(a, b) {\n\t\tif (a.length !== b.length) return false;\n\t\tfor (let i = 0, l = a.length; i < l; i++) {\n\t\t\tif (a[i] !== b[i]) return false;\n\t\t}\n\t\treturn true;\n\t}\n\tfunction copyArray(a, b) {\n\t\tfor (let i = 0, l = b.length; i < l; i++) {\n\t\t\ta[i] = b[i];\n\t\t}\n\t}\n\n\t// Texture unit allocation\n\n\tconst arrayCacheI32 = [];\n\tfunction allocTexUnits(textures, n) {\n\t\tlet r = arrayCacheI32[n];\n\t\tif (r === undefined) {\n\t\t\tr = new Int32Array(n);\n\t\t\tarrayCacheI32[n] = r;\n\t\t}\n\t\tfor (let i = 0; i !== n; ++i) {\n\t\t\tr[i] = textures.allocTexUnit();\n\t\t}\n\t\treturn r;\n\t}\n\n\t// Helper to pick the right setter for uniform\n\n\tfunction generateSetter(uniform, pureArray) {\n\t\tconst gl = uniform.gl;\n\t\tconst type = uniform.type;\n\t\tconst location = uniform.location;\n\t\tconst cache = uniform.cache;\n\t\tswitch (type) {\n\t\t\tcase gl.FLOAT:\n\t\t\t\tuniform.setValue = function (value) {\n\t\t\t\t\tif (cache[0] === value) return;\n\t\t\t\t\tgl.uniform1f(location, value);\n\t\t\t\t\tcache[0] = value;\n\t\t\t\t};\n\t\t\t\tif (pureArray) {\n\t\t\t\t\tuniform.set = function (value) {\n\t\t\t\t\t\tif (arraysEqual(cache, value)) return;\n\t\t\t\t\t\tgl.uniform1fv(location, value);\n\t\t\t\t\t\tcopyArray(cache, value);\n\t\t\t\t\t};\n\t\t\t\t} else {\n\t\t\t\t\tuniform.set = uniform.setValue;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase gl.SAMPLER_2D:\n\t\t\tcase gl.SAMPLER_2D_SHADOW:\n\t\t\tcase gl.INT_SAMPLER_2D:\n\t\t\tcase gl.UNSIGNED_INT_SAMPLER_2D:\n\t\t\t\tuniform.setValue = function (value, textures) {\n\t\t\t\t\tconst unit = textures.allocTexUnit();\n\t\t\t\t\ttextures.setTexture(value || (type === gl.SAMPLER_2D_SHADOW ? emptyShadowTexture : emptyTexture), unit);\n\t\t\t\t\tif (cache[0] === unit) return;\n\t\t\t\t\tgl.uniform1i(location, unit);\n\t\t\t\t\tcache[0] = unit;\n\t\t\t\t};\n\t\t\t\tif (pureArray) {\n\t\t\t\t\tuniform.set = function (value, textures) {\n\t\t\t\t\t\tconst n = value.length;\n\t\t\t\t\t\tconst units = allocTexUnits(textures, n);\n\t\t\t\t\t\tfor (let i = 0; i !== n; ++i) {\n\t\t\t\t\t\t\ttextures.setTexture(value[i] || (type === gl.SAMPLER_2D_SHADOW ? emptyShadowTexture : emptyTexture), units[i]);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (arraysEqual(cache, units)) return;\n\t\t\t\t\t\tgl.uniform1iv(location, units);\n\t\t\t\t\t\tcopyArray(cache, units);\n\t\t\t\t\t};\n\t\t\t\t} else {\n\t\t\t\t\tuniform.set = uniform.setValue;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase gl.SAMPLER_2D_ARRAY:\n\t\t\tcase gl.SAMPLER_2D_ARRAY_SHADOW:\n\t\t\tcase gl.INT_SAMPLER_2D_ARRAY:\n\t\t\tcase gl.UNSIGNED_INT_SAMPLER_2D_ARRAY:\n\t\t\t\tuniform.setValue = function (value, textures) {\n\t\t\t\t\tconst unit = textures.allocTexUnit();\n\t\t\t\t\ttextures.setTexture(value || emptyTexture2dArray, unit);\n\t\t\t\t\tif (cache[0] === unit) return;\n\t\t\t\t\tgl.uniform1i(location, unit);\n\t\t\t\t\tcache[0] = unit;\n\t\t\t\t};\n\t\t\t\tif (pureArray) {\n\t\t\t\t\tuniform.set = function (value, textures) {\n\t\t\t\t\t\tconst n = value.length;\n\t\t\t\t\t\tconst units = allocTexUnits(textures, n);\n\t\t\t\t\t\tfor (let i = 0; i !== n; ++i) {\n\t\t\t\t\t\t\ttextures.setTexture(value[i] || emptyTexture2dArray, units[i]);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (arraysEqual(cache, units)) return;\n\t\t\t\t\t\tgl.uniform1iv(location, units);\n\t\t\t\t\t\tcopyArray(cache, units);\n\t\t\t\t\t};\n\t\t\t\t} else {\n\t\t\t\t\tuniform.set = uniform.setValue;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase gl.SAMPLER_CUBE:\n\t\t\tcase gl.SAMPLER_CUBE_SHADOW:\n\t\t\t\tuniform.setValue = function (value, textures) {\n\t\t\t\t\tconst unit = textures.allocTexUnit();\n\t\t\t\t\ttextures.setTexture(value || emptyCubeTexture, unit);\n\t\t\t\t\tif (cache[0] === unit) return;\n\t\t\t\t\tgl.uniform1i(location, unit);\n\t\t\t\t\tcache[0] = unit;\n\t\t\t\t};\n\t\t\t\tif (pureArray) {\n\t\t\t\t\tuniform.set = function (value, textures) {\n\t\t\t\t\t\tconst n = value.length;\n\t\t\t\t\t\tconst units = allocTexUnits(textures, n);\n\t\t\t\t\t\tfor (let i = 0; i !== n; ++i) {\n\t\t\t\t\t\t\ttextures.setTexture(value[i] || emptyCubeTexture, units[i]);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (arraysEqual(cache, units)) return;\n\t\t\t\t\t\tgl.uniform1iv(location, units);\n\t\t\t\t\t\tcopyArray(cache, units);\n\t\t\t\t\t};\n\t\t\t\t} else {\n\t\t\t\t\tuniform.set = uniform.setValue;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase gl.SAMPLER_3D:\n\t\t\t\tuniform.setValue = function (value, textures) {\n\t\t\t\t\tconst unit = textures.allocTexUnit();\n\t\t\t\t\ttextures.setTexture(value || emptyTexture3d, unit);\n\t\t\t\t\tif (cache[0] === unit) return;\n\t\t\t\t\tgl.uniform1i(location, unit);\n\t\t\t\t\tcache[0] = unit;\n\t\t\t\t};\n\t\t\t\tif (pureArray) {\n\t\t\t\t\tuniform.set = function (value, textures) {\n\t\t\t\t\t\tconst n = value.length;\n\t\t\t\t\t\tconst units = allocTexUnits(textures, n);\n\t\t\t\t\t\tfor (let i = 0; i !== n; ++i) {\n\t\t\t\t\t\t\ttextures.setTexture(value[i] || emptyTexture3d, units[i]);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (arraysEqual(cache, units)) return;\n\t\t\t\t\t\tgl.uniform1iv(location, units);\n\t\t\t\t\t\tcopyArray(cache, units);\n\t\t\t\t\t};\n\t\t\t\t} else {\n\t\t\t\t\tuniform.set = uniform.setValue;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase gl.BOOL:\n\t\t\tcase gl.INT:\n\t\t\t\tuniform.setValue = function (value) {\n\t\t\t\t\tif (cache[0] === value) return;\n\t\t\t\t\tgl.uniform1i(location, value);\n\t\t\t\t\tcache[0] = value;\n\t\t\t\t};\n\t\t\t\tif (pureArray) {\n\t\t\t\t\tuniform.set = function (value) {\n\t\t\t\t\t\tif (arraysEqual(cache, value)) return;\n\t\t\t\t\t\tgl.uniform1iv(location, value);\n\t\t\t\t\t\tcopyArray(cache, value);\n\t\t\t\t\t};\n\t\t\t\t} else {\n\t\t\t\t\tuniform.set = uniform.setValue;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase gl.FLOAT_VEC2:\n\t\t\t\tuniform.setValue = function (p1, p2) {\n\t\t\t\t\tif (cache[0] !== p1 || cache[1] !== p2) {\n\t\t\t\t\t\tgl.uniform2f(location, p1, p2);\n\t\t\t\t\t\tcache[0] = p1;\n\t\t\t\t\t\tcache[1] = p2;\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t\tuniform.set = function (value) {\n\t\t\t\t\tif (arraysEqual(cache, value)) return;\n\t\t\t\t\tgl.uniform2fv(location, value);\n\t\t\t\t\tcopyArray(cache, value);\n\t\t\t\t};\n\t\t\t\tbreak;\n\t\t\tcase gl.BOOL_VEC2:\n\t\t\tcase gl.INT_VEC2:\n\t\t\t\tuniform.setValue = function (p1, p2) {\n\t\t\t\t\tif (cache[0] !== p1 || cache[1] !== p2) {\n\t\t\t\t\t\tgl.uniform2i(location, p1, p2);\n\t\t\t\t\t\tcache[0] = p1;\n\t\t\t\t\t\tcache[1] = p2;\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t\tuniform.set = function (value) {\n\t\t\t\t\tif (arraysEqual(cache, value)) return;\n\t\t\t\t\tgl.uniform2iv(location, value);\n\t\t\t\t\tcopyArray(cache, value);\n\t\t\t\t};\n\t\t\t\tbreak;\n\t\t\tcase gl.FLOAT_VEC3:\n\t\t\t\tuniform.setValue = function (p1, p2, p3) {\n\t\t\t\t\tif (cache[0] !== p1 || cache[1] !== p2 || cache[2] !== p3) {\n\t\t\t\t\t\tgl.uniform3f(location, p1, p2, p3);\n\t\t\t\t\t\tcache[0] = p1;\n\t\t\t\t\t\tcache[1] = p2;\n\t\t\t\t\t\tcache[2] = p3;\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t\tuniform.set = function (value) {\n\t\t\t\t\tif (arraysEqual(cache, value)) return;\n\t\t\t\t\tgl.uniform3fv(location, value);\n\t\t\t\t\tcopyArray(cache, value);\n\t\t\t\t};\n\t\t\t\tbreak;\n\t\t\tcase gl.BOOL_VEC3:\n\t\t\tcase gl.INT_VEC3:\n\t\t\t\tuniform.setValue = function (p1, p2, p3) {\n\t\t\t\t\tif (cache[0] !== p1 || cache[1] !== p2 || cache[2] !== p3) {\n\t\t\t\t\t\tgl.uniform3i(location, p1, p2, p3);\n\t\t\t\t\t\tcache[0] = p1;\n\t\t\t\t\t\tcache[1] = p2;\n\t\t\t\t\t\tcache[2] = p3;\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t\tuniform.set = function (value) {\n\t\t\t\t\tif (arraysEqual(cache, value)) return;\n\t\t\t\t\tgl.uniform3iv(location, value);\n\t\t\t\t\tcopyArray(cache, value);\n\t\t\t\t};\n\t\t\t\tbreak;\n\t\t\tcase gl.FLOAT_VEC4:\n\t\t\t\tuniform.setValue = function (p1, p2, p3, p4) {\n\t\t\t\t\tif (cache[0] !== p1 || cache[1] !== p2 || cache[2] !== p3 || cache[3] !== p4) {\n\t\t\t\t\t\tgl.uniform4f(location, p1, p2, p3, p4);\n\t\t\t\t\t\tcache[0] = p1;\n\t\t\t\t\t\tcache[1] = p2;\n\t\t\t\t\t\tcache[2] = p3;\n\t\t\t\t\t\tcache[3] = p4;\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t\tuniform.set = function (value) {\n\t\t\t\t\tif (arraysEqual(cache, value)) return;\n\t\t\t\t\tgl.uniform4fv(location, value);\n\t\t\t\t\tcopyArray(cache, value);\n\t\t\t\t};\n\t\t\t\tbreak;\n\t\t\tcase gl.BOOL_VEC4:\n\t\t\tcase gl.INT_VEC4:\n\t\t\t\tuniform.setValue = function (p1, p2, p3, p4) {\n\t\t\t\t\tif (cache[0] !== p1 || cache[1] !== p2 || cache[2] !== p3 || cache[3] !== p4) {\n\t\t\t\t\t\tgl.uniform4i(location, p1, p2, p3, p4);\n\t\t\t\t\t\tcache[0] = p1;\n\t\t\t\t\t\tcache[1] = p2;\n\t\t\t\t\t\tcache[2] = p3;\n\t\t\t\t\t\tcache[3] = p4;\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t\tuniform.set = function (value) {\n\t\t\t\t\tif (arraysEqual(cache, value)) return;\n\t\t\t\t\tgl.uniform4iv(location, value);\n\t\t\t\t\tcopyArray(cache, value);\n\t\t\t\t};\n\t\t\t\tbreak;\n\t\t\tcase gl.FLOAT_MAT2:\n\t\t\t\tif (pureArray) {\n\t\t\t\t\tuniform.setValue = uniform.set = function (value) {\n\t\t\t\t\t\tif (arraysEqual(cache, value)) return;\n\t\t\t\t\t\tgl.uniformMatrix2fv(location, false, value);\n\t\t\t\t\t\tcopyArray(cache, value);\n\t\t\t\t\t};\n\t\t\t\t} else {\n\t\t\t\t\tuniform.setValue = uniform.set = function (value) {\n\t\t\t\t\t\tif (cache[0] !== value[0] || cache[1] !== value[1] || cache[2] !== value[2] || cache[3] !== value[3]) {\n\t\t\t\t\t\t\tgl.uniformMatrix2fv(location, false, value);\n\t\t\t\t\t\t\tcache[0] = value[0];\n\t\t\t\t\t\t\tcache[1] = value[1];\n\t\t\t\t\t\t\tcache[2] = value[2];\n\t\t\t\t\t\t\tcache[3] = value[3];\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase gl.FLOAT_MAT3:\n\t\t\t\tif (pureArray) {\n\t\t\t\t\tuniform.setValue = uniform.set = function (value) {\n\t\t\t\t\t\tif (arraysEqual(cache, value)) return;\n\t\t\t\t\t\tgl.uniformMatrix3fv(location, false, value);\n\t\t\t\t\t\tcopyArray(cache, value);\n\t\t\t\t\t};\n\t\t\t\t} else {\n\t\t\t\t\tuniform.setValue = uniform.set = function (value) {\n\t\t\t\t\t\tif (cache[0] !== value[0] || cache[1] !== value[1] || cache[2] !== value[2] || cache[3] !== value[3] || cache[4] !== value[4] || cache[5] !== value[5] || cache[6] !== value[6] || cache[7] !== value[7] || cache[8] !== value[8]) {\n\t\t\t\t\t\t\tgl.uniformMatrix3fv(location, false, value);\n\t\t\t\t\t\t\tcache[0] = value[0];\n\t\t\t\t\t\t\tcache[1] = value[1];\n\t\t\t\t\t\t\tcache[2] = value[2];\n\t\t\t\t\t\t\tcache[3] = value[3];\n\t\t\t\t\t\t\tcache[4] = value[4];\n\t\t\t\t\t\t\tcache[5] = value[5];\n\t\t\t\t\t\t\tcache[6] = value[6];\n\t\t\t\t\t\t\tcache[7] = value[7];\n\t\t\t\t\t\t\tcache[8] = value[8];\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase gl.FLOAT_MAT4:\n\t\t\t\tif (pureArray) {\n\t\t\t\t\tuniform.setValue = uniform.set = function (value) {\n\t\t\t\t\t\tif (arraysEqual(cache, value)) return;\n\t\t\t\t\t\tgl.uniformMatrix4fv(location, false, value);\n\t\t\t\t\t\tcopyArray(cache, value);\n\t\t\t\t\t};\n\t\t\t\t} else {\n\t\t\t\t\tuniform.setValue = uniform.set = function (value) {\n\t\t\t\t\t\tif (cache[0] !== value[0] || cache[1] !== value[1] || cache[2] !== value[2] || cache[3] !== value[3] || cache[4] !== value[4] || cache[5] !== value[5] || cache[6] !== value[6] || cache[7] !== value[7] || cache[8] !== value[8] || cache[9] !== value[9] || cache[10] !== value[10] || cache[11] !== value[11] || cache[12] !== value[12] || cache[13] !== value[13] || cache[14] !== value[14] || cache[15] !== value[15]) {\n\t\t\t\t\t\t\tgl.uniformMatrix4fv(location, false, value);\n\t\t\t\t\t\t\tcache[0] = value[0];\n\t\t\t\t\t\t\tcache[1] = value[1];\n\t\t\t\t\t\t\tcache[2] = value[2];\n\t\t\t\t\t\t\tcache[3] = value[3];\n\t\t\t\t\t\t\tcache[4] = value[4];\n\t\t\t\t\t\t\tcache[5] = value[5];\n\t\t\t\t\t\t\tcache[6] = value[6];\n\t\t\t\t\t\t\tcache[7] = value[7];\n\t\t\t\t\t\t\tcache[8] = value[8];\n\t\t\t\t\t\t\tcache[9] = value[9];\n\t\t\t\t\t\t\tcache[10] = value[10];\n\t\t\t\t\t\t\tcache[11] = value[11];\n\t\t\t\t\t\t\tcache[12] = value[12];\n\t\t\t\t\t\t\tcache[13] = value[13];\n\t\t\t\t\t\t\tcache[14] = value[14];\n\t\t\t\t\t\t\tcache[15] = value[15];\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\t// --- Uniform Classes ---\n\n\tclass SingleUniform {\n\t\tconstructor(gl, id, activeInfo, location) {\n\t\t\tthis.gl = gl;\n\t\t\tthis.id = id;\n\t\t\tthis.type = activeInfo.type;\n\n\t\t\t// this.size = activeInfo.size; // always be 1\n\n\t\t\tthis.location = location;\n\t\t\tthis.setValue = undefined;\n\t\t\tthis.set = undefined;\n\t\t\tthis.cache = [];\n\t\t\tgenerateSetter(this);\n\n\t\t\t// internal\n\n\t\t\tthis.internalGroup = 0;\n\t\t\tthis.internalFun = null;\n\t\t\tconst internal = internalUniforms[id];\n\t\t\tif (internal) {\n\t\t\t\tthis.internalGroup = internal[0];\n\t\t\t\tthis.internalFun = internal[1];\n\t\t\t}\n\t\t}\n\t}\n\tclass PureArrayUniform {\n\t\tconstructor(gl, id, activeInfo, location) {\n\t\t\tthis.gl = gl;\n\t\t\tthis.id = id;\n\t\t\tthis.type = activeInfo.type;\n\t\t\tthis.size = activeInfo.size;\n\t\t\tthis.location = location;\n\t\t\tthis.setValue = undefined;\n\t\t\tthis.set = undefined;\n\t\t\tthis.cache = [];\n\t\t\tgenerateSetter(this, true);\n\t\t}\n\t}\n\tclass UniformContainer {\n\t\tconstructor() {\n\t\t\tthis.seq = [];\n\t\t\tthis.map = {};\n\t\t}\n\t}\n\tclass StructuredUniform extends UniformContainer {\n\t\tconstructor(id) {\n\t\t\tsuper();\n\t\t\tthis.id = id;\n\t\t}\n\t\tset(value, textures) {\n\t\t\tconst seq = this.seq;\n\t\t\tfor (let i = 0, n = seq.length; i !== n; ++i) {\n\t\t\t\tconst u = seq[i];\n\t\t\t\tu.set(value[u.id], textures);\n\t\t\t}\n\t\t}\n\t}\n\n\t// --- Top-level ---\n\n\t// Parser - builds up the property tree from the path strings\n\n\tconst RePathPart = /(\\w+)(\\])?(\\[|\\.)?/g;\n\n\t// extracts\n\t// \t- the identifier (member name or array index)\n\t//\t- followed by an optional right bracket (found when array index)\n\t//\t- followed by an optional left bracket or dot (type of subscript)\n\t//\n\t// Note: These portions can be read in a non-overlapping fashion and\n\t// allow straightforward parsing of the hierarchy that WebGL encodes\n\t// in the uniform names.\n\n\tfunction addUniform(container, uniformObject) {\n\t\tcontainer.seq.push(uniformObject);\n\t\tcontainer.map[uniformObject.id] = uniformObject;\n\t}\n\n\t// https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/getActiveUniform\n\tfunction parseUniform(gl, activeInfo, location, container) {\n\t\tconst path = activeInfo.name,\n\t\t\tpathLength = path.length;\n\n\t\t// reset RegExp object, because of the early exit of a previous run\n\t\tRePathPart.lastIndex = 0;\n\t\twhile (true) {\n\t\t\tconst match = RePathPart.exec(path),\n\t\t\t\tmatchEnd = RePathPart.lastIndex;\n\t\t\tlet id = match[1];\n\t\t\tconst idIsIndex = match[2] === ']',\n\t\t\t\tsubscript = match[3];\n\t\t\tif (idIsIndex) id = id | 0; // convert to integer\n\n\t\t\tif (subscript === undefined || subscript === '[' && matchEnd + 2 === pathLength) {\n\t\t\t\t// bare name or \"pure\" bottom-level array \"[0]\" suffix\n\t\t\t\taddUniform(container, subscript === undefined ? new SingleUniform(gl, id, activeInfo, location) : new PureArrayUniform(gl, id, activeInfo, location));\n\t\t\t\tbreak;\n\t\t\t} else {\n\t\t\t\t// step into inner node / create it in case it doesn't exist\n\t\t\t\tconst map = container.map;\n\t\t\t\tlet next = map[id];\n\t\t\t\tif (next === undefined) {\n\t\t\t\t\tnext = new StructuredUniform(id);\n\t\t\t\t\taddUniform(container, next);\n\t\t\t\t}\n\t\t\t\tcontainer = next;\n\t\t\t}\n\t\t}\n\t}\n\n\t// Root Container\n\n\tclass WebGLUniforms extends UniformContainer {\n\t\tconstructor(gl, program) {\n\t\t\tsuper();\n\t\t\tconst n = gl.getProgramParameter(program, gl.ACTIVE_UNIFORMS);\n\t\t\tfor (let i = 0; i < n; ++i) {\n\t\t\t\tconst info = gl.getActiveUniform(program, i),\n\t\t\t\t\taddr = gl.getUniformLocation(program, info.name);\n\t\t\t\tparseUniform(gl, info, addr, this);\n\t\t\t}\n\t\t}\n\t\tset(name, value, textures) {\n\t\t\tconst u = this.map[name];\n\t\t\tif (u !== undefined) u.set(value, textures);\n\t\t}\n\t\thas(name) {\n\t\t\treturn !!this.map[name];\n\t\t}\n\t}\n\n\tlet programIdCount = 0;\n\tclass WebGLProgram {\n\t\tconstructor(gl, vshader, fshader) {\n\t\t\tthis.gl = gl;\n\t\t\tthis.vshaderSource = vshader;\n\t\t\tthis.fshaderSource = fshader;\n\t\t\tthis.id = programIdCount++;\n\t\t\tthis.usedTimes = 1;\n\t\t\tthis.code = '';\n\t\t\tthis.name = '';\n\t\t\tthis.lightId = -1;\n\t\t\tthis.lightVersion = -1;\n\t\t\tthis.cameraId = -1;\n\t\t\tthis.cameraVersion = -1;\n\t\t\tthis.sceneId = -1;\n\t\t\tthis.sceneVersion = -1;\n\t\t\tthis.program;\n\t\t\tthis._checkErrors = true;\n\t\t\tthis._compileAsynchronously = false;\n\t\t\tthis._status = 0;\n\t\t\tlet program, vertexShader, fragmentShader;\n\n\t\t\t// compile program\n\t\t\tthis.compile = function (options) {\n\t\t\t\t// create shaders\n\n\t\t\t\tvertexShader = loadShader(gl, gl.VERTEX_SHADER, vshader);\n\t\t\t\tfragmentShader = loadShader(gl, gl.FRAGMENT_SHADER, fshader);\n\n\t\t\t\t// create a program object\n\n\t\t\t\tprogram = gl.createProgram();\n\t\t\t\tgl.attachShader(program, vertexShader);\n\t\t\t\tgl.attachShader(program, fragmentShader);\n\t\t\t\tgl.linkProgram(program);\n\t\t\t\tthis.program = program;\n\n\t\t\t\t// set properties\n\n\t\t\t\tthis._checkErrors = options.checkErrors;\n\t\t\t\tthis._compileAsynchronously = options.compileAsynchronously;\n\t\t\t\tthis._status = 1;\n\n\t\t\t\t// here we can delete shaders,\n\t\t\t\t// according to the documentation: https://www.opengl.org/sdk/docs/man/html/glLinkProgram.xhtml\n\n\t\t\t\tgl.deleteShader(vertexShader);\n\t\t\t\tgl.deleteShader(fragmentShader);\n\t\t\t};\n\n\t\t\t// check if program is ready to be used\n\t\t\tthis.isReady = function (parallelShaderCompileExt) {\n\t\t\t\tif (this._status === 1) {\n\t\t\t\t\tif (this._compileAsynchronously && parallelShaderCompileExt) {\n\t\t\t\t\t\tif (gl.getProgramParameter(program, parallelShaderCompileExt.COMPLETION_STATUS_KHR)) {\n\t\t\t\t\t\t\tthis._status = 2;\n\t\t\t\t\t\t\tthis._tryCheckErrors();\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis._status = 2;\n\t\t\t\t\t\tthis._tryCheckErrors();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn this._status === 2;\n\t\t\t};\n\t\t\tthis._tryCheckErrors = function () {\n\t\t\t\tif (!this._checkErrors) return;\n\t\t\t\tif (gl.getProgramParameter(program, gl.LINK_STATUS) === false) {\n\t\t\t\t\tconst programLog = gl.getProgramInfoLog(program).trim();\n\t\t\t\t\tconst vertexErrors = getShaderErrors(gl, vertexShader, 'VERTEX');\n\t\t\t\t\tconst fragmentErrors = getShaderErrors(gl, fragmentShader, 'FRAGMENT');\n\t\t\t\t\tthis.program = undefined;\n\t\t\t\t\tthis._status = 0;\n\t\t\t\t\tconsole.error('Shader Error ' + gl.getError() + ' - ' + 'VALIDATE_STATUS ' + gl.getProgramParameter(program, gl.VALIDATE_STATUS) + '\\n\\n' + 'Shader Name: ' + this.name + '\\n' + 'Program Info Log: ' + programLog + '\\n' + vertexErrors + '\\n' + fragmentErrors);\n\t\t\t\t}\n\t\t\t};\n\n\t\t\t// set up caching for uniforms\n\n\t\t\tlet cachedUniforms;\n\t\t\tthis.getUniforms = function () {\n\t\t\t\tif (cachedUniforms === undefined) {\n\t\t\t\t\tcachedUniforms = new WebGLUniforms(gl, program);\n\t\t\t\t}\n\t\t\t\treturn cachedUniforms;\n\t\t\t};\n\n\t\t\t// set up caching for attributes\n\n\t\t\tlet cachedAttributes;\n\t\t\tthis.getAttributes = function () {\n\t\t\t\tif (cachedAttributes === undefined) {\n\t\t\t\t\tcachedAttributes = extractAttributes(gl, program);\n\t\t\t\t}\n\t\t\t\treturn cachedAttributes;\n\t\t\t};\n\n\t\t\t// free program\n\n\t\t\tthis.dispose = function () {\n\t\t\t\tgl.deleteProgram(program);\n\t\t\t\tthis.program = undefined;\n\t\t\t\tthis._status = 0;\n\t\t\t};\n\t\t}\n\t}\n\tfunction handleSource(string, errorLine) {\n\t\tconst lines = string.split('\\n');\n\t\tconst lines2 = [];\n\t\tconst from = Math.max(errorLine - 6, 0);\n\t\tconst to = Math.min(errorLine + 6, lines.length);\n\t\tfor (let i = from; i < to; i++) {\n\t\t\tconst line = i + 1;\n\t\t\tlines2.push(`${line === errorLine ? '>' : ' '} ${line}: ${lines[i]}`);\n\t\t}\n\t\treturn lines2.join('\\n');\n\t}\n\tfunction loadShader(gl, type, source) {\n\t\tconst shader = gl.createShader(type);\n\t\tgl.shaderSource(shader, source);\n\t\tgl.compileShader(shader);\n\t\treturn shader;\n\t}\n\tfunction getShaderErrors(gl, shader, type) {\n\t\tconst status = gl.getShaderParameter(shader, gl.COMPILE_STATUS);\n\t\tconst errors = gl.getShaderInfoLog(shader).trim();\n\t\tif (status && errors === '') return '';\n\t\tconst errorMatches = /ERROR: 0:(\\d+)/.exec(errors);\n\t\tif (errorMatches) {\n\t\t\t// --enable-privileged-webgl-extension\n\t\t\t// console.log( '**' + type + '**', gl.getExtension( 'WEBGL_debug_shaders' ).getTranslatedShaderSource( shader ) );\n\n\t\t\tconst errorLine = parseInt(errorMatches[1]);\n\t\t\treturn type + '\\n\\n' + errors + '\\n\\n' + handleSource(gl.getShaderSource(shader), errorLine);\n\t\t} else {\n\t\t\treturn errors;\n\t\t}\n\t}\n\n\t// extract attributes\n\tfunction extractAttributes(gl, program) {\n\t\tconst attributes = {};\n\t\tconst totalAttributes = gl.getProgramParameter(program, gl.ACTIVE_ATTRIBUTES);\n\t\tfor (let i = 0; i < totalAttributes; i++) {\n\t\t\tconst attribData = gl.getActiveAttrib(program, i);\n\t\t\tattributes[attribData.name] = new WebGLAttribute(gl, program, attribData);\n\t\t}\n\t\treturn attributes;\n\t}\n\n\tclass WebGLPrograms {\n\t\tconstructor(gl, state, capabilities) {\n\t\t\tthis._gl = gl;\n\t\t\tthis._state = state;\n\t\t\tthis._capabilities = capabilities;\n\t\t\tthis._programs = [];\n\t\t}\n\t\tgetProgram(material, props, programCode, compileOptions) {\n\t\t\tconst programs = this._programs;\n\t\t\tlet program;\n\t\t\tfor (let p = 0, pl = programs.length; p < pl; p++) {\n\t\t\t\tconst programInfo = programs[p];\n\t\t\t\tif (programInfo.code === programCode) {\n\t\t\t\t\tprogram = programInfo;\n\t\t\t\t\t++program.usedTimes;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (program === undefined) {\n\t\t\t\tconst customDefines = generateDefines(material.defines);\n\t\t\t\tconst vertexShader = ShaderLib[material.type + '_vert'] || material.vertexShader || ShaderLib.basic_vert;\n\t\t\t\tconst fragmentShader = ShaderLib[material.type + '_frag'] || material.fragmentShader || ShaderLib.basic_frag;\n\t\t\t\tprogram = createProgram(this._gl, customDefines, props, vertexShader, fragmentShader);\n\t\t\t\tprogram.name = props.shaderName;\n\t\t\t\tprogram.compile(compileOptions);\n\t\t\t\tprogram.code = programCode;\n\t\t\t\tprograms.push(program);\n\t\t\t}\n\t\t\treturn program;\n\t\t}\n\t\treleaseProgram(program) {\n\t\t\tif (--program.usedTimes === 0) {\n\t\t\t\tconst programs = this._programs;\n\n\t\t\t\t// Remove from unordered set\n\t\t\t\tconst index = programs.indexOf(program);\n\t\t\t\tprograms[index] = programs[programs.length - 1];\n\t\t\t\tprograms.pop();\n\n\t\t\t\t// Free WebGL resources\n\t\t\t\tprogram.dispose(this._gl);\n\t\t\t}\n\t\t}\n\t\tgenerateProps(material, object, lightingState, renderStates) {\n\t\t\tconst state = this._state;\n\t\t\tconst capabilities = this._capabilities;\n\t\t\tconst fog = material.fog ? renderStates.scene.fog : null;\n\t\t\tconst envMap = material.envMap !== undefined ? material.envMap || renderStates.scene.environment : null;\n\t\t\tconst logarithmicDepthBuffer = renderStates.scene.logarithmicDepthBuffer;\n\t\t\tconst disableShadowSampler = renderStates.scene.disableShadowSampler;\n\t\t\tconst numClippingPlanes = material.clippingPlanes && material.clippingPlanes.length > 0 ? material.clippingPlanes.length : renderStates.scene.numClippingPlanes;\n\t\t\tconst HAS_CLEARCOAT = material.clearcoat > 0;\n\t\t\tconst HAS_DIFFUSEMAP = !!material.diffuseMap;\n\t\t\tconst HAS_ALPHAMAP = !!material.alphaMap;\n\t\t\tconst HAS_EMISSIVEMAP = !!material.emissiveMap;\n\t\t\tconst HAS_AOMAP = !!material.aoMap;\n\t\t\tconst HAS_NORMALMAP = !!material.normalMap;\n\t\t\tconst HAS_BUMPMAP = !!material.bumpMap;\n\t\t\tconst HAS_SPECULARMAP = !!material.specularMap;\n\t\t\tconst HAS_ROUGHNESSMAP = !!material.roughnessMap;\n\t\t\tconst HAS_METALNESSMAP = !!material.metalnessMap;\n\t\t\tconst HAS_GLOSSINESSMAP = !!material.glossinessMap;\n\t\t\tconst HAS_ENVMAP = !!envMap;\n\t\t\tconst HAS_CLEARCOATMAP = HAS_CLEARCOAT && !!material.clearcoatMap;\n\t\t\tconst HAS_CLEARCOAT_ROUGHNESSMAP = HAS_CLEARCOAT && !!material.clearcoatRoughnessMap;\n\t\t\tconst HAS_CLEARCOAT_NORMALMAP = HAS_CLEARCOAT && !!material.clearcoatNormalMap;\n\t\t\t_activeMapCoords = material.extUvCoordMask; // reset\n\n\t\t\tconst props = {}; // cache this props?\n\n\t\t\tprops.shaderName = material.type === MATERIAL_TYPE.SHADER && material.shaderName ? material.shaderName : material.type;\n\n\t\t\t// capabilities\n\n\t\t\tprops.version = capabilities.version;\n\t\t\tprops.precision = material.precision || capabilities.maxPrecision;\n\t\t\tprops.useStandardDerivatives = capabilities.version >= 2 || !!capabilities.getExtension('OES_standard_derivatives') || !!capabilities.getExtension('GL_OES_standard_derivatives');\n\t\t\tprops.useShaderTextureLOD = capabilities.version >= 2 || !!capabilities.getExtension('EXT_shader_texture_lod');\n\n\t\t\t// maps\n\n\t\t\tprops.useDiffuseMap = HAS_DIFFUSEMAP;\n\t\t\tprops.useAlphaMap = HAS_ALPHAMAP;\n\t\t\tprops.useEmissiveMap = HAS_EMISSIVEMAP;\n\t\t\tprops.useAOMap = HAS_AOMAP;\n\t\t\tprops.useNormalMap = HAS_NORMALMAP;\n\t\t\tprops.useBumpMap = HAS_BUMPMAP;\n\t\t\tprops.useSpecularMap = HAS_SPECULARMAP;\n\t\t\tprops.useRoughnessMap = HAS_ROUGHNESSMAP;\n\t\t\tprops.useMetalnessMap = HAS_METALNESSMAP;\n\t\t\tprops.useGlossinessMap = HAS_GLOSSINESSMAP;\n\t\t\tprops.useEnvMap = HAS_ENVMAP;\n\t\t\tprops.envMapCombine = HAS_ENVMAP && material.envMapCombine;\n\t\t\tprops.useClearcoat = HAS_CLEARCOAT;\n\t\t\tprops.useClearcoatMap = HAS_CLEARCOATMAP;\n\t\t\tprops.useClearcoatRoughnessMap = HAS_CLEARCOAT_ROUGHNESSMAP;\n\t\t\tprops.useClearcoatNormalMap = HAS_CLEARCOAT_NORMALMAP;\n\t\t\tprops.diffuseMapUv = HAS_DIFFUSEMAP && getUVChannel(material.diffuseMapCoord);\n\t\t\tprops.alphaMapUv = HAS_ALPHAMAP && getUVChannel(material.alphaMapCoord);\n\t\t\tprops.emissiveMapUv = HAS_EMISSIVEMAP && getUVChannel(material.emissiveMapCoord);\n\t\t\tprops.aoMapUv = HAS_AOMAP && getUVChannel(material.aoMapCoord);\n\t\t\tif (HAS_NORMALMAP || HAS_BUMPMAP || HAS_SPECULARMAP || HAS_ROUGHNESSMAP || HAS_METALNESSMAP || HAS_GLOSSINESSMAP || HAS_CLEARCOATMAP || HAS_CLEARCOAT_ROUGHNESSMAP || HAS_CLEARCOAT_NORMALMAP) {\n\t\t\t\t_activeMapCoords |= 1 << 0; // these maps use uv coord 0 by default\n\t\t\t}\n\t\t\tprops.activeMapCoords = _activeMapCoords;\n\n\t\t\t// lights\n\n\t\t\tlightingState.setProgramProps(props, object.receiveShadow);\n\t\t\tprops.useShadowSampler = capabilities.version >= 2 && !disableShadowSampler;\n\t\t\tprops.shadowType = object.shadowType;\n\t\t\tif (!props.useShadowSampler && (props.shadowType == SHADOW_TYPE.PCF3_SOFT || props.shadowType == SHADOW_TYPE.PCF5_SOFT || props.shadowType == SHADOW_TYPE.PCSS16_SOFT || props.shadowType == SHADOW_TYPE.PCSS32_SOFT || props.shadowType == SHADOW_TYPE.PCSS64_SOFT)) {\n\t\t\t\tprops.shadowType = SHADOW_TYPE.VOGEL5_SOFT;\n\t\t\t\tif (props.useShadow) {\n\t\t\t\t\tconsole.warn('WebGLPrograms: PCF and PCSS shadow type need shadow sampler support, falling back to VOGEL5_SOFT.');\n\t\t\t\t}\n\t\t\t}\n\t\t\tprops.dithering = material.dithering;\n\n\t\t\t// encoding\n\n\t\t\tconst currentRenderTarget = state.currentRenderTarget;\n\t\t\tprops.gammaFactor = renderStates.gammaFactor;\n\t\t\tprops.outputEncoding = currentRenderTarget.texture ? getTextureEncodingFromMap(currentRenderTarget.texture) : renderStates.outputEncoding;\n\t\t\tprops.diffuseMapEncoding = getTextureEncodingFromMap(material.diffuseMap || material.cubeMap);\n\t\t\tprops.envMapEncoding = getTextureEncodingFromMap(envMap);\n\t\t\tprops.emissiveMapEncoding = getTextureEncodingFromMap(material.emissiveMap);\n\n\t\t\t// other\n\n\t\t\tprops.alphaTest = material.alphaTest > 0;\n\t\t\tprops.premultipliedAlpha = material.premultipliedAlpha;\n\t\t\tprops.useVertexColors = material.vertexColors;\n\t\t\tprops.useVertexTangents = !!material.normalMap && material.vertexTangents;\n\t\t\tprops.numClippingPlanes = numClippingPlanes;\n\t\t\tprops.flatShading = material.shading === SHADING_TYPE.FLAT_SHADING;\n\t\t\tprops.fog = !!fog;\n\t\t\tprops.fogExp2 = !!fog && fog.isFogExp2;\n\t\t\tprops.sizeAttenuation = material.sizeAttenuation;\n\t\t\tprops.doubleSided = material.side === DRAW_SIDE.DOUBLE;\n\t\t\tprops.flipSided = material.side === DRAW_SIDE.BACK;\n\t\t\tprops.packDepthToRGBA = material.packToRGBA;\n\t\t\tprops.logarithmicDepthBuffer = !!logarithmicDepthBuffer;\n\t\t\tprops.rendererExtensionFragDepth = capabilities.version >= 2 || !!capabilities.getExtension('EXT_frag_depth');\n\n\t\t\t// morph targets\n\n\t\t\tprops.morphTargets = !!object.morphTargetInfluences;\n\t\t\tprops.morphNormals = !!object.morphTargetInfluences && object.geometry.morphAttributes.normal;\n\n\t\t\t// skinned mesh\n\n\t\t\tconst useSkinning = object.isSkinnedMesh && object.skeleton;\n\t\t\tconst maxVertexUniformVectors = capabilities.maxVertexUniformVectors;\n\t\t\tconst useVertexTexture = capabilities.maxVertexTextures > 0 && (!!capabilities.getExtension('OES_texture_float') || capabilities.version >= 2);\n\t\t\tlet maxBones = 0;\n\t\t\tif (useVertexTexture) {\n\t\t\t\tmaxBones = 1024;\n\t\t\t} else {\n\t\t\t\tmaxBones = object.skeleton ? object.skeleton.bones.length : 0;\n\t\t\t\tif (maxBones * 16 > maxVertexUniformVectors) {\n\t\t\t\t\tconsole.warn('Program: too many bones (' + maxBones + '), current cpu only support ' + Math.floor(maxVertexUniformVectors / 16) + ' bones!!');\n\t\t\t\t\tmaxBones = Math.floor(maxVertexUniformVectors / 16);\n\t\t\t\t}\n\t\t\t}\n\t\t\tprops.useSkinning = useSkinning;\n\t\t\tprops.bonesNum = maxBones;\n\t\t\tprops.useVertexTexture = useVertexTexture;\n\t\t\treturn props;\n\t\t}\n\t\tgenerateProgramCode(props, material) {\n\t\t\tlet code = '';\n\t\t\tfor (const key in props) {\n\t\t\t\tcode += props[key] + '_';\n\t\t\t}\n\t\t\tfor (const name in material.defines) {\n\t\t\t\tcode += name + '_' + material.defines[name] + '_';\n\t\t\t}\n\n\t\t\t// If the material type is SHADER and there is no shader Name,\n\t\t\t// use the entire shader code as part of the signature\n\t\t\tif (material.type === MATERIAL_TYPE.SHADER && !material.shaderName) {\n\t\t\t\tcode += material.vertexShader;\n\t\t\t\tcode += material.fragmentShader;\n\t\t\t}\n\t\t\treturn code;\n\t\t}\n\t}\n\n\t// Helper functions\n\n\tfunction generateDefines(defines) {\n\t\tconst chunks = [];\n\t\tfor (const name in defines) {\n\t\t\tconst value = defines[name];\n\t\t\tif (value === false) continue;\n\t\t\tchunks.push('#define ' + name + ' ' + value);\n\t\t}\n\t\treturn chunks.join('\\n');\n\t}\n\tlet _activeMapCoords = 0; // bit mask\n\n\tfunction getUVChannel(coord) {\n\t\t_activeMapCoords |= 1 << coord;\n\t\tif (coord === 0) return 'a_Uv';\n\t\treturn `a_Uv${coord + 1}`; // a_Uv2, a_Uv3, a_Uv4, ...\n\t}\n\tfunction getTextureEncodingFromMap(map) {\n\t\tlet encoding;\n\t\tif (!map) {\n\t\t\tencoding = TEXEL_ENCODING_TYPE.LINEAR;\n\t\t} else if (map.encoding) {\n\t\t\tencoding = map.encoding;\n\t\t}\n\t\treturn encoding;\n\t}\n\tfunction getEncodingComponents(encoding) {\n\t\tswitch (encoding) {\n\t\t\tcase TEXEL_ENCODING_TYPE.LINEAR:\n\t\t\t\treturn ['Linear', '(value)'];\n\t\t\tcase TEXEL_ENCODING_TYPE.SRGB:\n\t\t\t\treturn ['sRGB', '(value)'];\n\t\t\tcase TEXEL_ENCODING_TYPE.GAMMA:\n\t\t\t\treturn ['Gamma', '(value, float(GAMMA_FACTOR))'];\n\t\t\tdefault:\n\t\t\t\tconsole.error('unsupported encoding: ' + encoding);\n\t\t}\n\t}\n\tfunction getTexelDecodingFunction(functionName, encoding) {\n\t\tconst components = getEncodingComponents(encoding);\n\t\treturn 'vec4 ' + functionName + '(vec4 value) { return ' + components[0] + 'ToLinear' + components[1] + '; }';\n\t}\n\tfunction getTexelEncodingFunction(functionName, encoding) {\n\t\tconst components = getEncodingComponents(encoding);\n\t\treturn 'vec4 ' + functionName + '(vec4 value) { return LinearTo' + components[0] + components[1] + '; }';\n\t}\n\tfunction uvAttributes(activeMapCoords) {\n\t\tlet str = '';\n\t\tfor (let i = 1; i < 8; i++) {\n\t\t\t// skip uv0\n\t\t\tif (activeMapCoords & 1 << i) {\n\t\t\t\tstr += 'attribute vec2 a_Uv' + (i + 1) + ';';\n\t\t\t\tif (i !== 7) str += '\\n';\n\t\t\t}\n\t\t}\n\t\treturn str;\n\t}\n\tconst shadowDefines = {\n\t\t[SHADOW_TYPE.HARD]: '#define USE_HARD_SHADOW',\n\t\t[SHADOW_TYPE.POISSON_SOFT]: '#define USE_POISSON_SOFT_SHADOW',\n\t\t[SHADOW_TYPE.VOGEL5_SOFT]: '#define USE_VOGEL5_SOFT_SHADOW',\n\t\t[SHADOW_TYPE.PCF3_SOFT]: '#define USE_PCF3_SOFT_SHADOW',\n\t\t[SHADOW_TYPE.PCF5_SOFT]: '#define USE_PCF5_SOFT_SHADOW',\n\t\t[SHADOW_TYPE.PCSS16_SOFT]: ['#define USE_PCSS16_SOFT_SHADOW', '#define USE_PCSS_SOFT_SHADOW'].join('\\n'),\n\t\t[SHADOW_TYPE.PCSS32_SOFT]: ['#define USE_PCSS32_SOFT_SHADOW', '#define USE_PCSS_SOFT_SHADOW'].join('\\n'),\n\t\t[SHADOW_TYPE.PCSS64_SOFT]: ['#define USE_PCSS64_SOFT_SHADOW', '#define USE_PCSS_SOFT_SHADOW'].join('\\n')\n\t};\n\tfunction getShadowTypeDefines(shadowType) {\n\t\tif (shadowDefines[shadowType]) {\n\t\t\treturn shadowDefines[shadowType];\n\t\t} else {\n\t\t\tconsole.warn('unsupported shadow type: ' + shadowType);\n\t\t\treturn shadowDefines[SHADOW_TYPE.HARD];\n\t\t}\n\t}\n\tfunction createProgram(gl, defines, props, vertex, fragment) {\n\t\tlet prefixVertex = ['precision ' + props.precision + ' float;', 'precision ' + props.precision + ' int;',\n\t\t// depth texture may have precision problem on iOS device.\n\t\t'precision ' + props.precision + ' sampler2D;', props.version >= 2 ? 'precision ' + props.precision + ' isampler2D;' : '', props.version >= 2 ? 'precision ' + props.precision + ' usampler2D;' : '', '#define SHADER_NAME ' + props.shaderName, defines, props.version >= 2 ? '#define WEBGL2' : '',\n\t\t// maps\n\n\t\tprops.useDiffuseMap ? '#define USE_DIFFUSE_MAP' : '', props.useAlphaMap ? '#define USE_ALPHA_MAP' : '', props.useEmissiveMap ? '#define USE_EMISSIVEMAP' : '', props.useAOMap ? '#define USE_AOMAP' : '', props.useNormalMap ? '#define USE_NORMAL_MAP' : '', props.useBumpMap ? '#define USE_BUMPMAP' : '', props.useSpecularMap ? '#define USE_SPECULARMAP' : '', props.useRoughnessMap ? '#define USE_ROUGHNESSMAP' : '', props.useMetalnessMap ? '#define USE_METALNESSMAP' : '', props.useGlossinessMap ? '#define USE_GLOSSINESSMAP' : '', props.useEnvMap ? '#define USE_ENV_MAP' : '', props.diffuseMapUv ? '#define DIFFUSEMAP_UV ' + props.diffuseMapUv : '', props.alphaMapUv ? '#define ALPHAMAP_UV ' + props.alphaMapUv : '', props.emissiveMapUv ? '#define EMISSIVEMAP_UV ' + props.emissiveMapUv : '', props.aoMapUv ? '#define AOMAP_UV ' + props.aoMapUv : '', props.activeMapCoords > 0 ? '#define USE_UV' : '', props.activeMapCoords & 1 ? '#define USE_UV1' : '', uvAttributes(props.activeMapCoords),\n\t\t// lights\n\n\t\tprops.useAmbientLight ? '#define USE_AMBIENT_LIGHT' : '', props.useSphericalHarmonicsLight ? '#define USE_SPHERICALHARMONICS_LIGHT' : '', props.useShadow ? '#define USE_SHADOW' : '',\n\t\t// other\n\n\t\tprops.useVertexColors == VERTEX_COLOR.RGB ? '#define USE_VCOLOR_RGB' : '', props.useVertexColors == VERTEX_COLOR.RGBA ? '#define USE_VCOLOR_RGBA' : '', props.useVertexTangents ? '#define USE_TANGENT' : '', props.flatShading ? '#define FLAT_SHADED' : '', props.fog ? '#define USE_FOG' : '', props.sizeAttenuation ? '#define USE_SIZEATTENUATION' : '', props.flipSided ? '#define FLIP_SIDED' : '', props.logarithmicDepthBuffer ? '#define USE_LOGDEPTHBUF' : '', props.logarithmicDepthBuffer && props.rendererExtensionFragDepth ? '#define USE_LOGDEPTHBUF_EXT' : '',\n\t\t// morph targets\n\n\t\tprops.morphTargets ? '#define USE_MORPHTARGETS' : '', props.morphNormals && props.flatShading === false ? '#define USE_MORPHNORMALS' : '',\n\t\t// skinned mesh\n\n\t\tprops.useSkinning ? '#define USE_SKINNING' : '', props.bonesNum > 0 ? '#define MAX_BONES ' + props.bonesNum : '', props.useVertexTexture ? '#define BONE_TEXTURE' : '', '\\n'].filter(filterEmptyLine).join('\\n');\n\t\tlet prefixFragment = [\n\t\t// use dfdx and dfdy must enable OES_standard_derivatives\n\t\tprops.useStandardDerivatives && props.version < 2 ? '#extension GL_OES_standard_derivatives : enable' : '', props.useShaderTextureLOD && props.version < 2 ? '#extension GL_EXT_shader_texture_lod : enable' : '', props.logarithmicDepthBuffer && props.rendererExtensionFragDepth && props.version < 2 ? '#extension GL_EXT_frag_depth : enable' : '', 'precision ' + props.precision + ' float;', 'precision ' + props.precision + ' int;',\n\t\t// depth texture may have precision problem on iOS device.\n\t\t'precision ' + props.precision + ' sampler2D;', props.version >= 2 ? 'precision ' + props.precision + ' isampler2D;' : '', props.version >= 2 ? 'precision ' + props.precision + ' usampler2D;' : '', props.version >= 2 ? 'precision ' + props.precision + ' sampler2DShadow;' : '', props.version >= 2 ? 'precision ' + props.precision + ' samplerCubeShadow;' : '', '#define SHADER_NAME ' + props.shaderName, '#define PI 3.14159265359', '#define EPSILON 1e-6', 'float pow2(const in float x) { return x * x; }', '#define LOG2 1.442695', '#define RECIPROCAL_PI 0.31830988618', '#define saturate(a) clamp(a, 0.0, 1.0)', '#define whiteCompliment(a) (1.0 - saturate(a))',\n\t\t// expects values in the range of [0,1] x [0,1], returns values in the [0,1] range.\n\t\t// do not collapse into a single function per: http://byteblacksmith.com/improvements-to-the-canonical-one-liner-glsl-rand-for-opengl-es-2-0/\n\t\t'highp float rand(const in vec2 uv) {', '\tconst highp float a = 12.9898, b = 78.233, c = 43758.5453;', '\thighp float dt = dot(uv.xy, vec2(a, b)), sn = mod(dt, PI);', '\treturn fract(sin(sn) * c);', '}', defines, props.version >= 2 ? '#define WEBGL2' : '', props.useShadowSampler ? '#define USE_SHADOW_SAMPLER' : '#define sampler2DShadow sampler2D', props.useShaderTextureLOD ? '#define TEXTURE_LOD_EXT' : '',\n\t\t// maps\n\n\t\tprops.useDiffuseMap ? '#define USE_DIFFUSE_MAP' : '', props.useAlphaMap ? '#define USE_ALPHA_MAP' : '', props.useEmissiveMap ? '#define USE_EMISSIVEMAP' : '', props.useAOMap ? '#define USE_AOMAP' : '', props.useNormalMap ? '#define USE_NORMAL_MAP' : '', props.useBumpMap ? '#define USE_BUMPMAP' : '', props.useSpecularMap ? '#define USE_SPECULARMAP' : '', props.useRoughnessMap ? '#define USE_ROUGHNESSMAP' : '', props.useMetalnessMap ? '#define USE_METALNESSMAP' : '', props.useGlossinessMap ? '#define USE_GLOSSINESSMAP' : '', props.useEnvMap ? '#define USE_ENV_MAP' : '', props.envMapCombine ? '#define ' + props.envMapCombine : '', props.useClearcoat ? '#define USE_CLEARCOAT' : '', props.useClearcoatMap ? '#define USE_CLEARCOATMAP' : '', props.useClearcoatRoughnessMap ? '#define USE_CLEARCOAT_ROUGHNESSMAP' : '', props.useClearcoatNormalMap ? '#define USE_CLEARCOAT_NORMALMAP' : '', props.activeMapCoords & 1 ? '#define USE_UV1' : '',\n\t\t// lights\n\n\t\tprops.useAmbientLight ? '#define USE_AMBIENT_LIGHT' : '', props.useSphericalHarmonicsLight ? '#define USE_SPHERICALHARMONICS_LIGHT' : '', props.useClusteredLights ? '#define USE_CLUSTERED_LIGHTS' : '', props.useShadow ? '#define USE_SHADOW' : '', getShadowTypeDefines(props.shadowType), props.dithering ? '#define DITHERING' : '',\n\t\t// encoding\n\n\t\tShaderChunk['encodings_pars_frag'], '#define GAMMA_FACTOR ' + props.gammaFactor, getTexelEncodingFunction('linearToOutputTexel', props.outputEncoding), getTexelDecodingFunction('mapTexelToLinear', props.diffuseMapEncoding), props.useEnvMap ? getTexelDecodingFunction('envMapTexelToLinear', props.envMapEncoding) : '', props.useEmissiveMap ? getTexelDecodingFunction('emissiveMapTexelToLinear', props.emissiveMapEncoding) : '',\n\t\t// other\n\n\t\tprops.alphaTest ? '#define ALPHATEST' : '', props.premultipliedAlpha ? '#define USE_PREMULTIPLIED_ALPHA' : '', props.useVertexColors == VERTEX_COLOR.RGB ? '#define USE_VCOLOR_RGB' : '', props.useVertexColors == VERTEX_COLOR.RGBA ? '#define USE_VCOLOR_RGBA' : '', props.useVertexTangents ? '#define USE_TANGENT' : '', props.flatShading ? '#define FLAT_SHADED' : '', props.fog ? '#define USE_FOG' : '', props.fogExp2 ? '#define USE_EXP2_FOG' : '', props.doubleSided ? '#define DOUBLE_SIDED' : '', props.packDepthToRGBA ? '#define DEPTH_PACKING_RGBA' : '', props.logarithmicDepthBuffer ? '#define USE_LOGDEPTHBUF' : '', props.logarithmicDepthBuffer && props.rendererExtensionFragDepth ? '#define USE_LOGDEPTHBUF_EXT' : '', '\\n'].filter(filterEmptyLine).join('\\n');\n\t\tlet vshader = vertex;\n\t\tlet fshader = fragment;\n\t\tvshader = parseIncludes(vshader);\n\t\tfshader = parseIncludes(fshader);\n\t\tvshader = replaceLightNums(vshader, props);\n\t\tfshader = replaceLightNums(fshader, props);\n\t\tvshader = replaceClippingPlaneNums(vshader, props);\n\t\tfshader = replaceClippingPlaneNums(fshader, props);\n\t\tvshader = unrollLoops(vshader);\n\t\tfshader = unrollLoops(fshader);\n\n\t\t// enable glsl version 300 es for webgl ^2.0\n\t\tif (props.version > 1) {\n\t\t\t// extract vertex extensions and insert after version strings later\n\t\t\t// because it must be at the top of the shader\n\t\t\tconst vertexExtensions = vshader.match(extensionPattern);\n\t\t\tif (vertexExtensions) {\n\t\t\t\tvshader = vshader.replace(extensionPattern, '');\n\t\t\t}\n\t\t\tprefixVertex = ['#version 300 es', vertexExtensions ? vertexExtensions.join('\\n') : '', '#define attribute in', '#define varying out', '#define texture2D texture'].join('\\n') + '\\n' + prefixVertex;\n\t\t\tfshader = fshader.replace('#extension GL_EXT_draw_buffers : require', '');\n\n\t\t\t// replace gl_FragData by layout\n\t\t\tlet i = 0;\n\t\t\tconst layout = [];\n\t\t\twhile (fshader.indexOf('gl_FragData[' + i + ']') > -1) {\n\t\t\t\tfshader = fshader.replace('gl_FragData[' + i + ']', 'pc_fragData' + i);\n\t\t\t\tlayout.push('layout(location = ' + i + ') out highp vec4 pc_fragData' + i + ';');\n\t\t\t\ti++;\n\t\t\t}\n\t\t\tprefixFragment = ['#version 300 es', '#define varying in', fshader.indexOf('layout') > -1 || layout.length > 0 ? '' : 'out highp vec4 pc_fragColor;', '#define gl_FragColor pc_fragColor', '#define gl_FragDepthEXT gl_FragDepth', '#define texture2D texture', '#define textureCube texture', '#define texture2DProj textureProj', '#define texture2DLodEXT textureLod', '#define texture2DProjLodEXT textureProjLod', '#define textureCubeLodEXT textureLod', '#define texture2DGradEXT textureGrad', '#define texture2DProjGradEXT textureProjGrad', '#define textureCubeGradEXT textureGrad', layout.join('\\n')].join('\\n') + '\\n' + prefixFragment;\n\t\t}\n\t\tvshader = prefixVertex + vshader;\n\t\tfshader = prefixFragment + fshader;\n\t\treturn new WebGLProgram(gl, vshader, fshader);\n\t}\n\tconst parseIncludes = function (string) {\n\t\tconst pattern = /#include +<([\\w\\d.]+)>/g;\n\t\tfunction replace(match, include) {\n\t\t\tconst replace = ShaderChunk[include];\n\t\t\tif (replace === undefined) {\n\t\t\t\tthrow new Error('Can not resolve #include <' + include + '>');\n\t\t\t}\n\t\t\treturn parseIncludes(replace);\n\t\t}\n\t\treturn string.replace(pattern, replace);\n\t};\n\tfunction filterEmptyLine(string) {\n\t\treturn string !== '';\n\t}\n\tfunction replaceLightNums(string, parameters) {\n\t\treturn string.replace(/NUM_HEMI_LIGHTS/g, parameters.hemisphereLightNum).replace(/NUM_DIR_LIGHTS/g, parameters.directLightNum).replace(/NUM_SPOT_LIGHTS/g, parameters.spotLightNum).replace(/NUM_POINT_LIGHTS/g, parameters.pointLightNum).replace(/NUM_RECT_AREA_LIGHTS/g, parameters.rectAreaLightNum).replace(/NUM_DIR_SHADOWS/g, parameters.directShadowNum).replace(/NUM_SPOT_SHADOWS/g, parameters.spotShadowNum).replace(/NUM_POINT_SHADOWS/g, parameters.pointShadowNum);\n\t}\n\tfunction replaceClippingPlaneNums(string, parameters) {\n\t\treturn string.replace(/NUM_CLIPPING_PLANES/g, parameters.numClippingPlanes);\n\t}\n\tconst unrollLoopPattern = /#pragma unroll_loop_start\\s+for\\s*\\(\\s*int\\s+i\\s*=\\s*(\\d+)\\s*;\\s*i\\s*<\\s*(\\d+)\\s*;\\s*i\\s*\\+\\+\\s*\\)\\s*{([\\s\\S]+?)}\\s+#pragma unroll_loop_end/g;\n\tfunction loopReplacer(match, start, end, snippet) {\n\t\tlet string = '';\n\t\tfor (let i = parseInt(start); i < parseInt(end); i++) {\n\t\t\tstring += snippet.replace(/\\[\\s*i\\s*\\]/g, '[' + i + ']').replace(/UNROLLED_LOOP_INDEX/g, i);\n\t\t}\n\t\treturn string;\n\t}\n\tfunction unrollLoops(string) {\n\t\treturn string.replace(unrollLoopPattern, loopReplacer);\n\t}\n\tconst extensionPattern = /#extension .*/g;\n\n\tclass WebGLQuerySets extends PropertyMap {\n\t\tconstructor(prefix, gl, capabilities) {\n\t\t\tsuper(prefix);\n\t\t\tthis._gl = gl;\n\t\t\tthis._capabilities = capabilities;\n\t\t\tconst timerQuery = capabilities.timerQuery;\n\t\t\tconst that = this;\n\t\t\tfunction onQuerySetDispose(event) {\n\t\t\t\tconst querySet = event.target;\n\t\t\t\tconst querySetProperties = that.get(querySet);\n\t\t\t\tquerySet.removeEventListener('dispose', onQuerySetDispose);\n\t\t\t\tif (querySetProperties._queriesGL) {\n\t\t\t\t\tconst queriesGL = querySetProperties._queriesGL;\n\t\t\t\t\tqueriesGL.forEach(queryGL => {\n\t\t\t\t\t\tif (queryGL) {\n\t\t\t\t\t\t\tif (capabilities.version > 1) {\n\t\t\t\t\t\t\t\tgl.deleteQuery(queryGL);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\ttimerQuery.deleteQueryEXT(queryGL);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tquerySetProperties._isDisposed = true;\n\t\t\t\tthat.delete(querySet);\n\t\t\t}\n\t\t\tthis._onQuerySetDispose = onQuerySetDispose;\n\t\t\tthis._checkResultAvailable = capabilities.version > 1 ? queryGL => gl.getQueryParameter(queryGL, gl.QUERY_RESULT_AVAILABLE) : queryGL => timerQuery.getQueryObjectEXT(queryGL, timerQuery.QUERY_RESULT_AVAILABLE_EXT);\n\t\t\tthis._getQueryResult = capabilities.version > 1 ? queryGL => gl.getQueryParameter(queryGL, gl.QUERY_RESULT) : queryGL => timerQuery.getQueryObjectEXT(queryGL, timerQuery.QUERY_RESULT_EXT);\n\t\t}\n\t\tsetQuerySet(querySet) {\n\t\t\tconst querySetProperties = this.get(querySet);\n\t\t\tif (querySetProperties._queriesGL === undefined) {\n\t\t\t\tquerySet.addEventListener('dispose', this._onQuerySetDispose);\n\t\t\t\tquerySetProperties._queriesGL = new Array(querySet.count).fill(null);\n\t\t\t\tquerySetProperties._valueCache = new Array(querySet.count).fill(0);\n\t\t\t\tquerySetProperties._valueCacheValid = new Array(querySet.count).fill(true);\n\t\t\t\tconst gl = this._gl;\n\t\t\t\tconst capabilities = this._capabilities;\n\t\t\t\tif (querySet.type === QUERYSET_TYPE.OCCLUSION) {\n\t\t\t\t\tquerySetProperties._targetGL = querySet.conservative ? gl.ANY_SAMPLES_PASSED_CONSERVATIVE : gl.ANY_SAMPLES_PASSED;\n\t\t\t\t} else {\n\t\t\t\t\t// If timestamp is supported, this variable will not be used,\n\t\t\t\t\t// so it is okay to set it to TIME_ELAPSED_EXT here.\n\t\t\t\t\tquerySetProperties._targetGL = capabilities.timerQuery.TIME_ELAPSED_EXT;\n\t\t\t\t}\n\t\t\t\tquerySetProperties._activeIndex = -1;\n\t\t\t\tquerySetProperties._reading = false;\n\t\t\t}\n\t\t}\n\t\tbeginQuery(querySet, index) {\n\t\t\tconst gl = this._gl;\n\t\t\tconst querySetProperties = this.get(querySet);\n\t\t\tif (querySetProperties._reading) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst queryGL = this._getQueryGLByIndex(querySetProperties._queriesGL, index);\n\t\t\tif (this._capabilities.version > 1) {\n\t\t\t\tgl.beginQuery(querySetProperties._targetGL, queryGL);\n\t\t\t} else {\n\t\t\t\tthis._capabilities.timerQuery.beginQueryEXT(querySetProperties._targetGL, queryGL);\n\t\t\t}\n\t\t\tquerySetProperties._activeIndex = index;\n\t\t}\n\t\tendQuery(querySet) {\n\t\t\tconst querySetProperties = this.get(querySet);\n\t\t\tif (querySetProperties._reading || querySetProperties._activeIndex < 0) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (this._capabilities.version > 1) {\n\t\t\t\tthis._gl.endQuery(querySetProperties._targetGL);\n\t\t\t} else {\n\t\t\t\tthis._capabilities.timerQuery.endQueryEXT(querySetProperties._targetGL);\n\t\t\t}\n\t\t\tquerySetProperties._valueCacheValid[querySetProperties._activeIndex] = false;\n\t\t\tquerySetProperties._activeIndex = -1;\n\t\t}\n\t\tqueryCounter(querySet, index) {\n\t\t\tconst capabilities = this._capabilities;\n\t\t\tconst timerQuery = capabilities.timerQuery;\n\t\t\tconst querySetProperties = this.get(querySet);\n\t\t\tif (querySetProperties._reading) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst queryGL = this._getQueryGLByIndex(querySetProperties._queriesGL, index);\n\t\t\ttimerQuery.queryCounterEXT(queryGL, timerQuery.TIMESTAMP_EXT);\n\t\t\tquerySetProperties._valueCacheValid[index] = false;\n\t\t}\n\t\treadQuerySetResults(querySet, dstBuffer, firstQuery, queryCount) {\n\t\t\tconst querySetProperties = this.get(querySet);\n\t\t\tquerySetProperties._reading = true;\n\t\t\treturn new Promise((resolve, reject) => {\n\t\t\t\tconst checkQueries = () => {\n\t\t\t\t\tif (querySetProperties._isDisposed) {\n\t\t\t\t\t\treject(new Error('QuerySet has been disposed'));\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tlet completed = true;\n\t\t\t\t\ttry {\n\t\t\t\t\t\tfor (let i = firstQuery; i < queryCount; i++) {\n\t\t\t\t\t\t\tconst queryGL = querySetProperties._queriesGL[i];\n\t\t\t\t\t\t\tconst valueCacheValid = querySetProperties._valueCacheValid[i];\n\t\t\t\t\t\t\tif (!valueCacheValid) {\n\t\t\t\t\t\t\t\tif (this._checkResultAvailable(queryGL)) {\n\t\t\t\t\t\t\t\t\tconst result = this._getQueryResult(queryGL);\n\t\t\t\t\t\t\t\t\tquerySetProperties._valueCache[i] = result;\n\t\t\t\t\t\t\t\t\tquerySetProperties._valueCacheValid[i] = true;\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tcompleted = false;\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\tfor (let i = firstQuery; i < queryCount; i++) {\n\t\t\t\t\t\t\tquerySetProperties._valueCacheValid[i] = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tquerySetProperties._reading = false;\n\t\t\t\t\t\treject(e);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tif (completed) {\n\t\t\t\t\t\tfor (let i = firstQuery; i < queryCount; i++) {\n\t\t\t\t\t\t\tdstBuffer[i - firstQuery] = querySetProperties._valueCache[i];\n\t\t\t\t\t\t}\n\t\t\t\t\t\tquerySetProperties._reading = false;\n\t\t\t\t\t\tresolve(dstBuffer);\n\t\t\t\t\t} else {\n\t\t\t\t\t\trequestAnimationFrame(checkQueries);\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t\tcheckQueries();\n\t\t\t});\n\t\t}\n\t\t_getQueryGLByIndex(queriesGL, index) {\n\t\t\tlet queryGL = queriesGL[index];\n\t\t\tif (!queryGL) {\n\t\t\t\tconst gl = this._gl;\n\t\t\t\tconst capabilities = this._capabilities;\n\t\t\t\tqueryGL = capabilities.version > 1 ? gl.createQuery() : capabilities.timerQuery.createQueryEXT();\n\t\t\t\tqueriesGL[index] = queryGL;\n\t\t\t}\n\t\t\treturn queryGL;\n\t\t}\n\t}\n\n\tclass WebGLConstants {\n\t\tconstructor(gl, capabilities) {\n\t\t\tthis._gl = gl;\n\t\t\tthis._capabilities = capabilities;\n\t\t}\n\t\tgetGLType(type) {\n\t\t\tconst gl = this._gl;\n\t\t\tconst capabilities = this._capabilities;\n\t\t\tconst isWebGL2 = capabilities.version >= 2;\n\t\t\tif (type === PIXEL_TYPE.UNSIGNED_BYTE) return gl.UNSIGNED_BYTE;\n\t\t\tif (type === PIXEL_TYPE.UNSIGNED_SHORT_5_6_5) return gl.UNSIGNED_SHORT_5_6_5;\n\t\t\tif (type === PIXEL_TYPE.UNSIGNED_SHORT_4_4_4_4) return gl.UNSIGNED_SHORT_4_4_4_4;\n\t\t\tif (type === PIXEL_TYPE.UNSIGNED_SHORT_5_5_5_1) return gl.UNSIGNED_SHORT_5_5_5_1;\n\t\t\tlet extension;\n\t\t\tif (!isWebGL2) {\n\t\t\t\tif (type === PIXEL_TYPE.UNSIGNED_SHORT || type === PIXEL_TYPE.UNSIGNED_INT || type === PIXEL_TYPE.UNSIGNED_INT_24_8) {\n\t\t\t\t\textension = capabilities.getExtension('WEBGL_depth_texture');\n\t\t\t\t\tif (extension) {\n\t\t\t\t\t\tif (type === PIXEL_TYPE.UNSIGNED_SHORT) return gl.UNSIGNED_SHORT;\n\t\t\t\t\t\tif (type === PIXEL_TYPE.UNSIGNED_INT) return gl.UNSIGNED_INT;\n\t\t\t\t\t\tif (type === PIXEL_TYPE.UNSIGNED_INT_24_8) return extension.UNSIGNED_INT_24_8_WEBGL;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconsole.warn('extension WEBGL_depth_texture is not support.');\n\t\t\t\t\t\treturn null;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (type === PIXEL_TYPE.FLOAT) {\n\t\t\t\t\textension = capabilities.getExtension('OES_texture_float');\n\t\t\t\t\tif (extension) {\n\t\t\t\t\t\treturn gl.FLOAT;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconsole.warn('extension OES_texture_float is not support.');\n\t\t\t\t\t\treturn null;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (type === PIXEL_TYPE.HALF_FLOAT) {\n\t\t\t\t\textension = capabilities.getExtension('OES_texture_half_float');\n\t\t\t\t\tif (extension) {\n\t\t\t\t\t\treturn extension.HALF_FLOAT_OES;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconsole.warn('extension OES_texture_half_float is not support.');\n\t\t\t\t\t\treturn null;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (type === PIXEL_TYPE.UNSIGNED_SHORT) return gl.UNSIGNED_SHORT;\n\t\t\t\tif (type === PIXEL_TYPE.UNSIGNED_INT) return gl.UNSIGNED_INT;\n\t\t\t\tif (type === PIXEL_TYPE.UNSIGNED_INT_24_8) return gl.UNSIGNED_INT_24_8;\n\t\t\t\tif (type === PIXEL_TYPE.FLOAT) return gl.FLOAT;\n\t\t\t\tif (type === PIXEL_TYPE.HALF_FLOAT) return gl.HALF_FLOAT;\n\t\t\t\tif (type === PIXEL_TYPE.FLOAT_32_UNSIGNED_INT_24_8_REV) return gl.FLOAT_32_UNSIGNED_INT_24_8_REV;\n\t\t\t\tif (type === PIXEL_TYPE.BYTE) return gl.BYTE;\n\t\t\t\tif (type === PIXEL_TYPE.SHORT) return gl.SHORT;\n\t\t\t\tif (type === PIXEL_TYPE.INT) return gl.INT;\n\n\t\t\t\t// does not include:\n\t\t\t\t// UNSIGNED_INT_2_10_10_10_REV\n\t\t\t\t// UNSIGNED_INT_10F_11F_11F_REV\n\t\t\t\t// UNSIGNED_INT_5_9_9_9_REV\n\t\t\t}\n\t\t\treturn gl[type] !== undefined ? gl[type] : type;\n\t\t}\n\t\tgetGLFormat(format) {\n\t\t\tconst gl = this._gl;\n\t\t\tconst capabilities = this._capabilities;\n\t\t\tif (format === PIXEL_FORMAT.RGB) return gl.RGB;\n\t\t\tif (format === PIXEL_FORMAT.RGBA) return gl.RGBA;\n\t\t\tif (format === PIXEL_FORMAT.ALPHA) return gl.ALPHA;\n\t\t\tif (format === PIXEL_FORMAT.LUMINANCE) return gl.LUMINANCE;\n\t\t\tif (format === PIXEL_FORMAT.LUMINANCE_ALPHA) return gl.LUMINANCE_ALPHA;\n\t\t\tif (format === PIXEL_FORMAT.DEPTH_COMPONENT) return gl.DEPTH_COMPONENT;\n\t\t\tif (format === PIXEL_FORMAT.DEPTH_STENCIL) return gl.DEPTH_STENCIL;\n\t\t\tif (format === PIXEL_FORMAT.RED) return gl.RED;\n\t\t\tif (format === PIXEL_FORMAT.RED_INTEGER) return gl.RED_INTEGER;\n\t\t\tif (format === PIXEL_FORMAT.RG) return gl.RG;\n\t\t\tif (format === PIXEL_FORMAT.RG_INTEGER) return gl.RG_INTEGER;\n\t\t\tif (format === PIXEL_FORMAT.RGB_INTEGER) return gl.RGB_INTEGER;\n\t\t\tif (format === PIXEL_FORMAT.RGBA_INTEGER) return gl.RGBA_INTEGER;\n\t\t\tlet extension;\n\n\t\t\t// S3TC\n\t\t\tif (format === PIXEL_FORMAT.RGB_S3TC_DXT1 || format === PIXEL_FORMAT.RGBA_S3TC_DXT1 || format === PIXEL_FORMAT.RGBA_S3TC_DXT3 || format === PIXEL_FORMAT.RGBA_S3TC_DXT5) {\n\t\t\t\textension = capabilities.getExtension('WEBGL_compressed_texture_s3tc');\n\t\t\t\tif (extension) {\n\t\t\t\t\tif (format === PIXEL_FORMAT.RGB_S3TC_DXT1) return extension.COMPRESSED_RGB_S3TC_DXT1_EXT;\n\t\t\t\t\tif (format === PIXEL_FORMAT.RGBA_S3TC_DXT1) return extension.COMPRESSED_RGBA_S3TC_DXT1_EXT;\n\t\t\t\t\tif (format === PIXEL_FORMAT.RGBA_S3TC_DXT3) return extension.COMPRESSED_RGBA_S3TC_DXT3_EXT;\n\t\t\t\t\tif (format === PIXEL_FORMAT.RGBA_S3TC_DXT5) return extension.COMPRESSED_RGBA_S3TC_DXT5_EXT;\n\t\t\t\t} else {\n\t\t\t\t\tconsole.warn('extension WEBGL_compressed_texture_s3tc is not support.');\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// PVRTC\n\t\t\tif (format === PIXEL_FORMAT.RGB_PVRTC_4BPPV1 || format === PIXEL_FORMAT.RGB_PVRTC_2BPPV1 || format === PIXEL_FORMAT.RGBA_PVRTC_4BPPV1 || format === PIXEL_FORMAT.RGBA_PVRTC_2BPPV1) {\n\t\t\t\textension = capabilities.getExtension('WEBGL_compressed_texture_pvrtc');\n\t\t\t\tif (extension) {\n\t\t\t\t\tif (format === PIXEL_FORMAT.RGB_PVRTC_4BPPV1) return extension.COMPRESSED_RGB_PVRTC_4BPPV1_IMG;\n\t\t\t\t\tif (format === PIXEL_FORMAT.RGB_PVRTC_2BPPV1) return extension.COMPRESSED_RGB_PVRTC_2BPPV1_IMG;\n\t\t\t\t\tif (format === PIXEL_FORMAT.RGBA_PVRTC_4BPPV1) return extension.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG;\n\t\t\t\t\tif (format === PIXEL_FORMAT.RGBA_PVRTC_2BPPV1) return extension.COMPRESSED_RGBA_PVRTC_2BPPV1_IMG;\n\t\t\t\t} else {\n\t\t\t\t\tconsole.warn('extension WEBGL_compressed_texture_pvrtc is not support.');\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// ETC1\n\t\t\tif (format === PIXEL_FORMAT.RGB_ETC1) {\n\t\t\t\textension = capabilities.getExtension('WEBGL_compressed_texture_etc1');\n\t\t\t\tif (extension) {\n\t\t\t\t\treturn extension.COMPRESSED_RGB_ETC1_WEBGL;\n\t\t\t\t} else {\n\t\t\t\t\tconsole.warn('extension WEBGL_compressed_texture_etc1 is not support.');\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// ASTC\n\t\t\tif (format === PIXEL_FORMAT.RGBA_ASTC_4x4) {\n\t\t\t\textension = capabilities.getExtension('WEBGL_compressed_texture_astc');\n\t\t\t\tif (extension) {\n\t\t\t\t\treturn extension.COMPRESSED_RGBA_ASTC_4x4_KHR;\n\t\t\t\t} else {\n\t\t\t\t\tconsole.warn('extension WEBGL_compressed_texture_astc is not support.');\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// BPTC\n\t\t\tif (format === PIXEL_FORMAT.RGBA_BPTC || format === PIXEL_FORMAT.RGB_BPTC_SIGNED_FORMAT || format === PIXEL_FORMAT.RGB_BPTC_UNSIGNED_FORMAT) {\n\t\t\t\textension = capabilities.getExtension('EXT_texture_compression_bptc');\n\t\t\t\tif (extension) {\n\t\t\t\t\tif (format === PIXEL_FORMAT.RGBA_BPTC) return extension.COMPRESSED_RGBA_BPTC_UNORM_EXT;\n\t\t\t\t\tif (format === PIXEL_FORMAT.RGB_BPTC_SIGNED_FORMAT) return extension.COMPRESSED_RGB_BPTC_SIGNED_FLOAT_EXT;\n\t\t\t\t\tif (format === PIXEL_FORMAT.RGB_BPTC_UNSIGNED_FORMAT) return extension.COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_EXT;\n\t\t\t\t} else {\n\t\t\t\t\tconsole.warn('extension EXT_texture_compression_bptc is not support.');\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn gl[format] !== undefined ? gl[format] : format;\n\t\t}\n\t\tgetGLInternalFormat(internalFormat) {\n\t\t\tconst gl = this._gl;\n\t\t\tconst capabilities = this._capabilities;\n\t\t\tconst isWebGL2 = capabilities.version >= 2;\n\t\t\tif (internalFormat === PIXEL_FORMAT.RGBA4) return gl.RGBA4;\n\t\t\tif (internalFormat === PIXEL_FORMAT.RGB5_A1) return gl.RGB5_A1;\n\t\t\tif (internalFormat === PIXEL_FORMAT.DEPTH_COMPONENT16) return gl.DEPTH_COMPONENT16;\n\t\t\tif (internalFormat === PIXEL_FORMAT.STENCIL_INDEX8) return gl.STENCIL_INDEX8;\n\t\t\tif (internalFormat === PIXEL_FORMAT.DEPTH_STENCIL) return gl.DEPTH_STENCIL;\n\n\t\t\t// does not include:\n\t\t\t// RGB565\n\n\t\t\tlet extension;\n\t\t\tif (!isWebGL2) {\n\t\t\t\tif (internalFormat === PIXEL_FORMAT.RGBA32F || internalFormat === PIXEL_FORMAT.RGB32F) {\n\t\t\t\t\textension = capabilities.getExtension('WEBGL_color_buffer_float');\n\t\t\t\t\tif (extension) {\n\t\t\t\t\t\tif (internalFormat === PIXEL_FORMAT.RGBA32F) return extension.RGBA32F_EXT;\n\t\t\t\t\t\tif (internalFormat === PIXEL_FORMAT.RGB32F) return extension.RGB32F_EXT;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconsole.warn('extension WEBGL_color_buffer_float is not support.');\n\t\t\t\t\t\treturn null;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (internalFormat === PIXEL_FORMAT.R8) return gl.R8;\n\t\t\t\tif (internalFormat === PIXEL_FORMAT.RG8) return gl.RG8;\n\t\t\t\tif (internalFormat === PIXEL_FORMAT.RGB8) return gl.RGB8;\n\t\t\t\tif (internalFormat === PIXEL_FORMAT.RGBA8) return gl.RGBA8;\n\t\t\t\tif (internalFormat === PIXEL_FORMAT.DEPTH_COMPONENT24) return gl.DEPTH_COMPONENT24;\n\t\t\t\tif (internalFormat === PIXEL_FORMAT.DEPTH_COMPONENT32F) return gl.DEPTH_COMPONENT32F;\n\t\t\t\tif (internalFormat === PIXEL_FORMAT.DEPTH24_STENCIL8) return gl.DEPTH24_STENCIL8;\n\t\t\t\tif (internalFormat === PIXEL_FORMAT.DEPTH32F_STENCIL8) return gl.DEPTH32F_STENCIL8;\n\n\t\t\t\t// does not include:\n\t\t\t\t// R8UI R8I R16UI R16I R32UI R32I RG8UI RG8I RG16UI RG16I RG32UI RG32I SRGB8_ALPHA8\n\t\t\t\t// RGB10_A2 RGBA8UI RGBA8I RGB10_A2UI RGBA16UI RGBA16I RGBA32I RGBA32UI\n\n\t\t\t\tif (internalFormat === PIXEL_FORMAT.R16F || internalFormat === PIXEL_FORMAT.RG16F || internalFormat === PIXEL_FORMAT.RGB16F || internalFormat === PIXEL_FORMAT.RGBA16F || internalFormat === PIXEL_FORMAT.R32F || internalFormat === PIXEL_FORMAT.RG32F || internalFormat === PIXEL_FORMAT.RGB32F || internalFormat === PIXEL_FORMAT.RGBA32F || internalFormat === PIXEL_FORMAT.R11F_G11F_B10F) {\n\t\t\t\t\textension = capabilities.getExtension('EXT_color_buffer_float');\n\t\t\t\t\tif (extension) {\n\t\t\t\t\t\tif (internalFormat === PIXEL_FORMAT.R16F) return gl.R16F;\n\t\t\t\t\t\tif (internalFormat === PIXEL_FORMAT.RG16F) return gl.RG16F;\n\t\t\t\t\t\tif (internalFormat === PIXEL_FORMAT.RGB16F) return gl.RGB16F;\n\t\t\t\t\t\tif (internalFormat === PIXEL_FORMAT.RGBA16F) return gl.RGBA16F;\n\t\t\t\t\t\tif (internalFormat === PIXEL_FORMAT.R32F) return gl.R32F;\n\t\t\t\t\t\tif (internalFormat === PIXEL_FORMAT.RG32F) return gl.RG32F;\n\t\t\t\t\t\tif (internalFormat === PIXEL_FORMAT.RGB32F) return gl.RGB32F;\n\t\t\t\t\t\tif (internalFormat === PIXEL_FORMAT.RGBA32F) return gl.RGBA32F;\n\t\t\t\t\t\tif (internalFormat === PIXEL_FORMAT.R11F_G11F_B10F) return gl.R11F_G11F_B10F;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconsole.warn('extension EXT_color_buffer_float is not support.');\n\t\t\t\t\t\treturn null;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn gl[internalFormat] !== undefined ? gl[internalFormat] : internalFormat;\n\t\t}\n\t}\n\n\tfunction createTexture(gl, type, target, count) {\n\t\tconst data = new Uint8Array(4); // 4 is required to match default unpack alignment of 4.\n\t\tconst texture = gl.createTexture();\n\t\tgl.bindTexture(type, texture);\n\t\tgl.texParameteri(type, gl.TEXTURE_MIN_FILTER, gl.NEAREST);\n\t\tgl.texParameteri(type, gl.TEXTURE_MAG_FILTER, gl.NEAREST);\n\t\tfor (let i = 0; i < count; i++) {\n\t\t\tgl.texImage2D(target + i, 0, gl.RGBA, 1, 1, 0, gl.RGBA, gl.UNSIGNED_BYTE, data);\n\t\t}\n\t\treturn texture;\n\t}\n\tfunction ColorBuffer(gl) {\n\t\tlet locked = false;\n\t\tconst color = new Vector4();\n\t\tlet currentColorMask = null;\n\t\tconst currentColorClear = new Vector4(0, 0, 0, 0);\n\t\treturn {\n\t\t\tsetMask: function (colorMask) {\n\t\t\t\tif (currentColorMask !== colorMask && !locked) {\n\t\t\t\t\tgl.colorMask(colorMask, colorMask, colorMask, colorMask);\n\t\t\t\t\tcurrentColorMask = colorMask;\n\t\t\t\t}\n\t\t\t},\n\t\t\tsetLocked: function (lock) {\n\t\t\t\tlocked = lock;\n\t\t\t},\n\t\t\tsetClear: function (r, g, b, a, premultipliedAlpha) {\n\t\t\t\tif (premultipliedAlpha === true) {\n\t\t\t\t\tr *= a;\n\t\t\t\t\tg *= a;\n\t\t\t\t\tb *= a;\n\t\t\t\t}\n\t\t\t\tcolor.set(r, g, b, a);\n\t\t\t\tif (currentColorClear.equals(color) === false) {\n\t\t\t\t\tgl.clearColor(r, g, b, a);\n\t\t\t\t\tcurrentColorClear.copy(color);\n\t\t\t\t}\n\t\t\t},\n\t\t\tgetClear: function () {\n\t\t\t\treturn currentColorClear;\n\t\t\t},\n\t\t\treset: function () {\n\t\t\t\tlocked = false;\n\t\t\t\tcurrentColorMask = null;\n\t\t\t\tcurrentColorClear.set(-1, 0, 0, 0); // set to invalid state\n\t\t\t}\n\t\t};\n\t}\n\tfunction DepthBuffer(gl, state) {\n\t\tlet locked = false;\n\t\tlet currentDepthMask = null;\n\t\tlet currentDepthFunc = null;\n\t\tlet currentDepthClear = null;\n\t\treturn {\n\t\t\tsetTest: function (depthTest) {\n\t\t\t\tif (depthTest) {\n\t\t\t\t\tstate.enable(gl.DEPTH_TEST);\n\t\t\t\t} else {\n\t\t\t\t\tstate.disable(gl.DEPTH_TEST);\n\t\t\t\t}\n\t\t\t},\n\t\t\tsetMask: function (depthMask) {\n\t\t\t\tif (currentDepthMask !== depthMask && !locked) {\n\t\t\t\t\tgl.depthMask(depthMask);\n\t\t\t\t\tcurrentDepthMask = depthMask;\n\t\t\t\t}\n\t\t\t},\n\t\t\tsetFunc: function (depthFunc) {\n\t\t\t\tif (currentDepthFunc !== depthFunc) {\n\t\t\t\t\tgl.depthFunc(depthFunc);\n\t\t\t\t\tcurrentDepthFunc = depthFunc;\n\t\t\t\t}\n\t\t\t},\n\t\t\tsetLocked: function (lock) {\n\t\t\t\tlocked = lock;\n\t\t\t},\n\t\t\tsetClear: function (depth) {\n\t\t\t\tif (currentDepthClear !== depth) {\n\t\t\t\t\tgl.clearDepth(depth);\n\t\t\t\t\tcurrentDepthClear = depth;\n\t\t\t\t}\n\t\t\t},\n\t\t\treset: function () {\n\t\t\t\tlocked = false;\n\t\t\t\tcurrentDepthMask = null;\n\t\t\t\tcurrentDepthFunc = null;\n\t\t\t\tcurrentDepthClear = null;\n\t\t\t}\n\t\t};\n\t}\n\tfunction StencilBuffer(gl, state) {\n\t\tlet locked = false;\n\t\tlet currentStencilMask = null;\n\t\tlet currentStencilFunc = null;\n\t\tlet currentStencilRef = null;\n\t\tlet currentStencilFuncMask = null;\n\t\tlet currentStencilFail = null;\n\t\tlet currentStencilZFail = null;\n\t\tlet currentStencilZPass = null;\n\t\tlet currentStencilFuncBack = null;\n\t\tlet currentStencilRefBack = null;\n\t\tlet currentStencilFuncMaskBack = null;\n\t\tlet currentStencilFailBack = null;\n\t\tlet currentStencilZFailBack = null;\n\t\tlet currentStencilZPassBack = null;\n\t\tlet currentStencilClear = null;\n\t\treturn {\n\t\t\tsetTest: function (stencilTest) {\n\t\t\t\tif (stencilTest) {\n\t\t\t\t\tstate.enable(gl.STENCIL_TEST);\n\t\t\t\t} else {\n\t\t\t\t\tstate.disable(gl.STENCIL_TEST);\n\t\t\t\t}\n\t\t\t},\n\t\t\tsetMask: function (stencilMask) {\n\t\t\t\tif (currentStencilMask !== stencilMask && !locked) {\n\t\t\t\t\tgl.stencilMask(stencilMask);\n\t\t\t\t\tcurrentStencilMask = stencilMask;\n\t\t\t\t}\n\t\t\t},\n\t\t\tsetFunc: function (stencilFunc, stencilRef, stencilMask, stencilFuncBack, stencilRefBack, stencilMaskBack) {\n\t\t\t\tif (currentStencilFunc !== stencilFunc || currentStencilRef !== stencilRef || currentStencilFuncMask !== stencilMask || currentStencilFuncBack !== stencilFuncBack || currentStencilRefBack !== stencilRefBack || currentStencilFuncMaskBack !== stencilMaskBack) {\n\t\t\t\t\tif (stencilFuncBack === null || stencilRefBack === null || stencilMaskBack === null) {\n\t\t\t\t\t\tgl.stencilFunc(stencilFunc, stencilRef, stencilMask);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tgl.stencilFuncSeparate(gl.FRONT, stencilFunc, stencilRef, stencilMask);\n\t\t\t\t\t\tgl.stencilFuncSeparate(gl.BACK, stencilFuncBack, stencilRefBack, stencilMaskBack);\n\t\t\t\t\t}\n\t\t\t\t\tcurrentStencilFunc = stencilFunc;\n\t\t\t\t\tcurrentStencilRef = stencilRef;\n\t\t\t\t\tcurrentStencilFuncMask = stencilMask;\n\t\t\t\t\tcurrentStencilFuncBack = stencilFuncBack;\n\t\t\t\t\tcurrentStencilRefBack = stencilRefBack;\n\t\t\t\t\tcurrentStencilFuncMaskBack = stencilMaskBack;\n\t\t\t\t}\n\t\t\t},\n\t\t\tsetOp: function (stencilFail, stencilZFail, stencilZPass, stencilFailBack, stencilZFailBack, stencilZPassBack) {\n\t\t\t\tif (currentStencilFail !== stencilFail || currentStencilZFail !== stencilZFail || currentStencilZPass !== stencilZPass || currentStencilFailBack !== stencilFailBack || currentStencilZFailBack !== stencilZFailBack || currentStencilZPassBack !== stencilZPassBack) {\n\t\t\t\t\tif (stencilFailBack === null || stencilZFailBack === null || stencilZPassBack === null) {\n\t\t\t\t\t\tgl.stencilOp(stencilFail, stencilZFail, stencilZPass);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tgl.stencilOpSeparate(gl.FRONT, stencilFail, stencilZFail, stencilZPass);\n\t\t\t\t\t\tgl.stencilOpSeparate(gl.BACK, stencilFailBack, stencilZFailBack, stencilZPassBack);\n\t\t\t\t\t}\n\t\t\t\t\tcurrentStencilFail = stencilFail;\n\t\t\t\t\tcurrentStencilZFail = stencilZFail;\n\t\t\t\t\tcurrentStencilZPass = stencilZPass;\n\t\t\t\t\tcurrentStencilFailBack = stencilFailBack;\n\t\t\t\t\tcurrentStencilZFailBack = stencilZFailBack;\n\t\t\t\t\tcurrentStencilZPassBack = stencilZPassBack;\n\t\t\t\t}\n\t\t\t},\n\t\t\tsetLocked: function (lock) {\n\t\t\t\tlocked = lock;\n\t\t\t},\n\t\t\tsetClear: function (stencil) {\n\t\t\t\tif (currentStencilClear !== stencil) {\n\t\t\t\t\tgl.clearStencil(stencil);\n\t\t\t\t\tcurrentStencilClear = stencil;\n\t\t\t\t}\n\t\t\t},\n\t\t\treset: function () {\n\t\t\t\tlocked = false;\n\t\t\t\tcurrentStencilMask = null;\n\t\t\t\tcurrentStencilFunc = null;\n\t\t\t\tcurrentStencilRef = null;\n\t\t\t\tcurrentStencilFuncMask = null;\n\t\t\t\tcurrentStencilFail = null;\n\t\t\t\tcurrentStencilZFail = null;\n\t\t\t\tcurrentStencilZPass = null;\n\t\t\t\tcurrentStencilFuncBack = null;\n\t\t\t\tcurrentStencilRefBack = null;\n\t\t\t\tcurrentStencilFuncMaskBack = null;\n\t\t\t\tcurrentStencilFailBack = null;\n\t\t\t\tcurrentStencilZFailBack = null;\n\t\t\t\tcurrentStencilZPassBack = null;\n\t\t\t\tcurrentStencilClear = null;\n\t\t\t}\n\t\t};\n\t}\n\tclass WebGLState {\n\t\tconstructor(gl, capabilities) {\n\t\t\tthis.gl = gl;\n\t\t\tthis.capabilities = capabilities;\n\t\t\tthis.colorBuffer = new ColorBuffer(gl);\n\t\t\tthis.depthBuffer = new DepthBuffer(gl, this);\n\t\t\tthis.stencilBuffer = new StencilBuffer(gl, this);\n\t\t\tthis.states = {};\n\t\t\tthis.currentBlending = null;\n\t\t\tthis.currentBlendEquation = null;\n\t\t\tthis.currentBlendSrc = null;\n\t\t\tthis.currentBlendDst = null;\n\t\t\tthis.currentBlendEquationAlpha = null;\n\t\t\tthis.currentBlendSrcAlpha = null;\n\t\t\tthis.currentBlendDstAlpha = null;\n\t\t\tthis.currentPremultipliedAlpha = null;\n\t\t\tthis.currentFlipSided = false;\n\t\t\tthis.currentCullFace = null;\n\t\t\tconst viewportParam = gl.getParameter(gl.VIEWPORT);\n\t\t\tthis.currentViewport = new Vector4().fromArray(viewportParam);\n\t\t\tthis.currentLineWidth = null;\n\t\t\tthis.currentPolygonOffsetFactor = null;\n\t\t\tthis.currentPolygonOffsetUnits = null;\n\t\t\tthis.currentProgram = null;\n\t\t\tthis.currentBoundBuffers = {};\n\t\t\tthis.currentRenderTarget = null; // used in WebGLRenderTargets\n\n\t\t\tthis.currentTextureSlot = null;\n\t\t\tthis.currentBoundTextures = {};\n\t\t\tthis.emptyTextures = {};\n\t\t\tthis.emptyTextures[gl.TEXTURE_2D] = createTexture(gl, gl.TEXTURE_2D, gl.TEXTURE_2D, 1);\n\t\t\tthis.emptyTextures[gl.TEXTURE_CUBE_MAP] = createTexture(gl, gl.TEXTURE_CUBE_MAP, gl.TEXTURE_CUBE_MAP_POSITIVE_X, 6);\n\t\t\tthis.blendEquationToGL = {\n\t\t\t\t[BLEND_EQUATION.ADD]: gl.FUNC_ADD,\n\t\t\t\t[BLEND_EQUATION.SUBTRACT]: gl.FUNC_SUBTRACT,\n\t\t\t\t[BLEND_EQUATION.REVERSE_SUBTRACT]: gl.FUNC_REVERSE_SUBTRACT,\n\t\t\t\t[BLEND_EQUATION.MIN]: gl.MIN,\n\t\t\t\t[BLEND_EQUATION.MAX]: gl.MAX\n\t\t\t};\n\t\t\tthis.blendFactorToGL = {\n\t\t\t\t[BLEND_FACTOR.ZERO]: gl.ZERO,\n\t\t\t\t[BLEND_FACTOR.ONE]: gl.ONE,\n\t\t\t\t[BLEND_FACTOR.SRC_COLOR]: gl.SRC_COLOR,\n\t\t\t\t[BLEND_FACTOR.SRC_ALPHA]: gl.SRC_ALPHA,\n\t\t\t\t[BLEND_FACTOR.SRC_ALPHA_SATURATE]: gl.SRC_ALPHA_SATURATE,\n\t\t\t\t[BLEND_FACTOR.DST_COLOR]: gl.DST_COLOR,\n\t\t\t\t[BLEND_FACTOR.DST_ALPHA]: gl.DST_ALPHA,\n\t\t\t\t[BLEND_FACTOR.ONE_MINUS_SRC_COLOR]: gl.ONE_MINUS_SRC_COLOR,\n\t\t\t\t[BLEND_FACTOR.ONE_MINUS_SRC_ALPHA]: gl.ONE_MINUS_SRC_ALPHA,\n\t\t\t\t[BLEND_FACTOR.ONE_MINUS_DST_COLOR]: gl.ONE_MINUS_DST_COLOR,\n\t\t\t\t[BLEND_FACTOR.ONE_MINUS_DST_ALPHA]: gl.ONE_MINUS_DST_ALPHA\n\t\t\t};\n\n\t\t\t// init\n\n\t\t\tthis.colorBuffer.setClear(0, 0, 0, 1);\n\t\t\tthis.depthBuffer.setClear(1);\n\t\t\tthis.stencilBuffer.setClear(0);\n\t\t\tthis.depthBuffer.setTest(true);\n\t\t\tthis.depthBuffer.setFunc(COMPARE_FUNC.LEQUAL);\n\t\t\tthis.setFlipSided(false);\n\t\t\tthis.setCullFace(CULL_FACE_TYPE.BACK);\n\t\t}\n\t\tenable(id) {\n\t\t\tif (this.states[id] !== true) {\n\t\t\t\tthis.gl.enable(id);\n\t\t\t\tthis.states[id] = true;\n\t\t\t}\n\t\t}\n\t\tdisable(id) {\n\t\t\tif (this.states[id] !== false) {\n\t\t\t\tthis.gl.disable(id);\n\t\t\t\tthis.states[id] = false;\n\t\t\t}\n\t\t}\n\t\tsetBlending(blend, blendEquation, blendSrc, blendDst, blendEquationAlpha, blendSrcAlpha, blendDstAlpha, premultipliedAlpha) {\n\t\t\tconst gl = this.gl;\n\t\t\tif (blend === BLEND_TYPE.NONE) {\n\t\t\t\tthis.disable(gl.BLEND);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthis.enable(gl.BLEND);\n\t\t\tif (blend !== BLEND_TYPE.CUSTOM) {\n\t\t\t\tif (blend !== this.currentBlending || premultipliedAlpha !== this.currentPremultipliedAlpha) {\n\t\t\t\t\tif (this.currentBlendEquation !== BLEND_EQUATION.ADD || this.currentBlendEquationAlpha !== BLEND_EQUATION.ADD) {\n\t\t\t\t\t\tgl.blendEquation(gl.FUNC_ADD);\n\t\t\t\t\t\tthis.currentBlendEquation = BLEND_EQUATION.ADD;\n\t\t\t\t\t\tthis.currentBlendEquationAlpha = BLEND_EQUATION.ADD;\n\t\t\t\t\t}\n\t\t\t\t\tif (blend === BLEND_TYPE.NORMAL) {\n\t\t\t\t\t\tif (premultipliedAlpha) {\n\t\t\t\t\t\t\tgl.blendFuncSeparate(gl.ONE, gl.ONE_MINUS_SRC_ALPHA, gl.ONE, gl.ONE_MINUS_SRC_ALPHA);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tgl.blendFuncSeparate(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA, gl.ONE, gl.ONE_MINUS_SRC_ALPHA);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if (blend === BLEND_TYPE.ADD) {\n\t\t\t\t\t\tif (premultipliedAlpha) {\n\t\t\t\t\t\t\tgl.blendFunc(gl.ONE, gl.ONE);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tgl.blendFunc(gl.SRC_ALPHA, gl.ONE);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if (blend === BLEND_TYPE.SUB) {\n\t\t\t\t\t\tgl.blendFuncSeparate(gl.ZERO, gl.ONE_MINUS_SRC_COLOR, gl.ZERO, gl.ONE);\n\t\t\t\t\t} else if (blend === BLEND_TYPE.MUL) {\n\t\t\t\t\t\tif (premultipliedAlpha) {\n\t\t\t\t\t\t\tgl.blendFuncSeparate(gl.ZERO, gl.SRC_COLOR, gl.ZERO, gl.SRC_ALPHA);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tgl.blendFunc(gl.ZERO, gl.SRC_COLOR);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconsole.error('WebGLState: Invalid blending: ', blend);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tthis.currentBlendSrc = null;\n\t\t\t\tthis.currentBlendDst = null;\n\t\t\t\tthis.currentBlendSrcAlpha = null;\n\t\t\t\tthis.currentBlendDstAlpha = null;\n\t\t\t} else {\n\t\t\t\tblendEquationAlpha = blendEquationAlpha || blendEquation;\n\t\t\t\tblendSrcAlpha = blendSrcAlpha || blendSrc;\n\t\t\t\tblendDstAlpha = blendDstAlpha || blendDst;\n\t\t\t\tconst equationToGL = this.blendEquationToGL;\n\t\t\t\tconst factorToGL = this.blendFactorToGL;\n\t\t\t\tif (blendEquation !== this.currentBlendEquation || blendEquationAlpha !== this.currentBlendEquationAlpha) {\n\t\t\t\t\tgl.blendEquationSeparate(equationToGL[blendEquation], equationToGL[blendEquationAlpha]);\n\t\t\t\t\tthis.currentBlendEquation = blendEquation;\n\t\t\t\t\tthis.currentBlendEquationAlpha = blendEquationAlpha;\n\t\t\t\t}\n\t\t\t\tif (blendSrc !== this.currentBlendSrc || blendDst !== this.currentBlendDst || blendSrcAlpha !== this.currentBlendSrcAlpha || blendDstAlpha !== this.currentBlendDstAlpha) {\n\t\t\t\t\tgl.blendFuncSeparate(factorToGL[blendSrc], factorToGL[blendDst], factorToGL[blendSrcAlpha], factorToGL[blendDstAlpha]);\n\t\t\t\t\tthis.currentBlendSrc = blendSrc;\n\t\t\t\t\tthis.currentBlendDst = blendDst;\n\t\t\t\t\tthis.currentBlendSrcAlpha = blendSrcAlpha;\n\t\t\t\t\tthis.currentBlendDstAlpha = blendDstAlpha;\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.currentBlending = blend;\n\t\t\tthis.currentPremultipliedAlpha = premultipliedAlpha;\n\t\t}\n\t\tsetFlipSided(flipSided) {\n\t\t\tconst gl = this.gl;\n\t\t\tif (this.currentFlipSided !== flipSided) {\n\t\t\t\tif (flipSided) {\n\t\t\t\t\tgl.frontFace(gl.CW);\n\t\t\t\t} else {\n\t\t\t\t\tgl.frontFace(gl.CCW);\n\t\t\t\t}\n\t\t\t\tthis.currentFlipSided = flipSided;\n\t\t\t}\n\t\t}\n\t\tsetCullFace(cullFace) {\n\t\t\tconst gl = this.gl;\n\t\t\tif (cullFace !== CULL_FACE_TYPE.NONE) {\n\t\t\t\tthis.enable(gl.CULL_FACE);\n\t\t\t\tif (cullFace !== this.currentCullFace) {\n\t\t\t\t\tif (cullFace === CULL_FACE_TYPE.BACK) {\n\t\t\t\t\t\tgl.cullFace(gl.BACK);\n\t\t\t\t\t} else if (cullFace === CULL_FACE_TYPE.FRONT) {\n\t\t\t\t\t\tgl.cullFace(gl.FRONT);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tgl.cullFace(gl.FRONT_AND_BACK);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tthis.disable(gl.CULL_FACE);\n\t\t\t}\n\t\t\tthis.currentCullFace = cullFace;\n\t\t}\n\t\tviewport(viewport) {\n\t\t\tconst currentViewport = this.currentViewport;\n\t\t\tif (currentViewport.equals(viewport)) return;\n\t\t\tthis.gl.viewport(viewport.x, viewport.y, viewport.z, viewport.w);\n\t\t\tcurrentViewport.copy(viewport);\n\t\t}\n\t\tsetLineWidth(width) {\n\t\t\tif (width !== this.currentLineWidth) {\n\t\t\t\tconst lineWidthRange = this.capabilities.lineWidthRange;\n\t\t\t\tif (lineWidthRange[0] <= width && width <= lineWidthRange[1]) {\n\t\t\t\t\tthis.gl.lineWidth(width);\n\t\t\t\t} else {\n\t\t\t\t\tconsole.warn('GL_ALIASED_LINE_WIDTH_RANGE is [' + lineWidthRange[0] + ',' + lineWidthRange[1] + '], but set to ' + width + '.');\n\t\t\t\t}\n\t\t\t\tthis.currentLineWidth = width;\n\t\t\t}\n\t\t}\n\t\tsetPolygonOffset(polygonOffset, factor, units) {\n\t\t\tconst gl = this.gl;\n\t\t\tif (polygonOffset) {\n\t\t\t\tthis.enable(gl.POLYGON_OFFSET_FILL);\n\t\t\t\tif (this.currentPolygonOffsetFactor !== factor || this.currentPolygonOffsetUnits !== units) {\n\t\t\t\t\tgl.polygonOffset(factor, units);\n\t\t\t\t\tthis.currentPolygonOffsetFactor = factor;\n\t\t\t\t\tthis.currentPolygonOffsetUnits = units;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tthis.disable(gl.POLYGON_OFFSET_FILL);\n\t\t\t}\n\t\t}\n\t\tsetProgram(program) {\n\t\t\tif (this.currentProgram !== program) {\n\t\t\t\tthis.gl.useProgram(program.program);\n\t\t\t\tthis.currentProgram = program;\n\t\t\t}\n\t\t}\n\t\tbindBuffer(type, buffer) {\n\t\t\tconst gl = this.gl;\n\t\t\tconst boundBuffer = this.currentBoundBuffers[type];\n\t\t\tif (boundBuffer !== buffer) {\n\t\t\t\tgl.bindBuffer(type, buffer);\n\t\t\t\tthis.currentBoundBuffers[type] = buffer;\n\t\t\t}\n\t\t}\n\t\tactiveTexture(slot) {\n\t\t\tconst gl = this.gl;\n\t\t\tif (slot === undefined) {\n\t\t\t\tslot = gl.TEXTURE0 + this.capabilities.maxTextures - 1;\n\t\t\t}\n\t\t\tif (this.currentTextureSlot !== slot) {\n\t\t\t\tgl.activeTexture(slot);\n\t\t\t\tthis.currentTextureSlot = slot;\n\t\t\t}\n\t\t}\n\t\tbindTexture(type, texture) {\n\t\t\tconst gl = this.gl;\n\t\t\tif (this.currentTextureSlot === null) {\n\t\t\t\tthis.activeTexture();\n\t\t\t}\n\t\t\tlet boundTexture = this.currentBoundTextures[this.currentTextureSlot];\n\t\t\tif (boundTexture === undefined) {\n\t\t\t\tboundTexture = {\n\t\t\t\t\ttype: undefined,\n\t\t\t\t\ttexture: undefined\n\t\t\t\t};\n\t\t\t\tthis.currentBoundTextures[this.currentTextureSlot] = boundTexture;\n\t\t\t}\n\t\t\tif (boundTexture.type !== type || boundTexture.texture !== texture) {\n\t\t\t\tgl.bindTexture(type, texture || this.emptyTextures[type]);\n\t\t\t\tboundTexture.type = type;\n\t\t\t\tboundTexture.texture = texture;\n\t\t\t}\n\t\t}\n\t\treset() {\n\t\t\tconst gl = this.gl;\n\t\t\tgl.colorMask(true, true, true, true);\n\t\t\tgl.clearColor(0, 0, 0, 0);\n\t\t\tgl.depthMask(true);\n\t\t\tgl.depthFunc(gl.LESS);\n\t\t\tgl.clearDepth(1);\n\t\t\tgl.stencilMask(0xffffffff);\n\t\t\tgl.stencilFunc(gl.ALWAYS, 0, 0xffffffff);\n\t\t\tgl.stencilOp(gl.KEEP, gl.KEEP, gl.KEEP);\n\t\t\tgl.clearStencil(0);\n\t\t\tgl.disable(gl.BLEND);\n\t\t\tgl.disable(gl.CULL_FACE);\n\t\t\tgl.disable(gl.DEPTH_TEST);\n\t\t\tgl.disable(gl.POLYGON_OFFSET_FILL);\n\t\t\tgl.disable(gl.SCISSOR_TEST);\n\t\t\tgl.disable(gl.STENCIL_TEST);\n\t\t\tgl.disable(gl.SAMPLE_ALPHA_TO_COVERAGE);\n\t\t\tgl.blendEquation(gl.FUNC_ADD);\n\t\t\tgl.blendFunc(gl.ONE, gl.ZERO);\n\t\t\tgl.blendFuncSeparate(gl.ONE, gl.ZERO, gl.ONE, gl.ZERO);\n\t\t\tgl.cullFace(gl.BACK);\n\t\t\tgl.frontFace(gl.CCW);\n\n\t\t\t// gl.scissor(0, 0, gl.canvas.width, gl.canvas.height);\n\t\t\tgl.viewport(0, 0, gl.canvas.width, gl.canvas.height);\n\t\t\tgl.lineWidth(1);\n\t\t\tgl.polygonOffset(0, 0);\n\t\t\tgl.useProgram(null);\n\t\t\tgl.bindFramebuffer(gl.FRAMEBUFFER, null);\n\t\t\tgl.activeTexture(gl.TEXTURE0);\n\t\t\tthis.colorBuffer.reset();\n\t\t\tthis.depthBuffer.reset();\n\t\t\tthis.stencilBuffer.reset();\n\t\t\tthis.states = {};\n\t\t\tthis.currentBlending = null;\n\t\t\tthis.currentBlendEquation = null;\n\t\t\tthis.currentBlendSrc = null;\n\t\t\tthis.currentBlendDst = null;\n\t\t\tthis.currentBlendEquationAlpha = null;\n\t\t\tthis.currentBlendSrcAlpha = null;\n\t\t\tthis.currentBlendDstAlpha = null;\n\t\t\tthis.currentPremultipliedAlpha = null;\n\t\t\tthis.currentFlipSided = false;\n\t\t\tthis.currentCullFace = null;\n\t\t\tthis.currentViewport.set(0, 0, gl.canvas.width, gl.canvas.height);\n\t\t\tthis.currentLineWidth = null;\n\t\t\tthis.currentPolygonOffsetFactor = null;\n\t\t\tthis.currentPolygonOffsetUnits = null;\n\t\t\tthis.currentProgram = null;\n\t\t\tthis.currentBoundBuffers = {};\n\t\t\tthis.currentRenderTarget = null; // used in WebGLRenderTargets\n\n\t\t\tthis.currentTextureSlot = null;\n\t\t\tthis.currentBoundTextures = {};\n\t\t}\n\t\tsetMaterial(material, frontFaceCW) {\n\t\t\tthis.setCullFace(material.side === DRAW_SIDE.DOUBLE ? CULL_FACE_TYPE.NONE : CULL_FACE_TYPE.BACK);\n\t\t\tlet flipSided = material.side === DRAW_SIDE.BACK;\n\t\t\tif (frontFaceCW) flipSided = !flipSided;\n\t\t\tthis.setFlipSided(flipSided);\n\t\t\tif (material.blending === BLEND_TYPE.NORMAL && material.transparent === false) {\n\t\t\t\tthis.setBlending(BLEND_TYPE.NONE);\n\t\t\t} else {\n\t\t\t\tthis.setBlending(material.blending, material.blendEquation, material.blendSrc, material.blendDst, material.blendEquationAlpha, material.blendSrcAlpha, material.blendDstAlpha, material.premultipliedAlpha);\n\t\t\t}\n\t\t\tthis.depthBuffer.setFunc(material.depthFunc);\n\t\t\tthis.depthBuffer.setTest(material.depthTest);\n\t\t\tthis.depthBuffer.setMask(material.depthWrite);\n\t\t\tthis.colorBuffer.setMask(material.colorWrite);\n\t\t\tconst stencilTest = material.stencilTest;\n\t\t\tthis.stencilBuffer.setTest(stencilTest);\n\t\t\tif (stencilTest) {\n\t\t\t\tthis.stencilBuffer.setMask(material.stencilWriteMask);\n\t\t\t\tthis.stencilBuffer.setFunc(material.stencilFunc, material.stencilRef, material.stencilFuncMask, material.stencilFuncBack, material.stencilRefBack, material.stencilFuncMaskBack);\n\t\t\t\tthis.stencilBuffer.setOp(material.stencilFail, material.stencilZFail, material.stencilZPass, material.stencilFailBack, material.stencilZFailBack, material.stencilZPassBack);\n\t\t\t}\n\t\t\tthis.setPolygonOffset(material.polygonOffset, material.polygonOffsetFactor, material.polygonOffsetUnits);\n\t\t\tif (material.lineWidth !== undefined) {\n\t\t\t\tthis.setLineWidth(material.lineWidth);\n\t\t\t}\n\t\t\tmaterial.alphaToCoverage === true ? this.enable(this.gl.SAMPLE_ALPHA_TO_COVERAGE) : this.disable(this.gl.SAMPLE_ALPHA_TO_COVERAGE);\n\t\t}\n\t}\n\n\tclass WebGLTextures extends PropertyMap {\n\t\tconstructor(prefix, gl, state, capabilities, constants) {\n\t\t\tsuper(prefix);\n\t\t\tthis._gl = gl;\n\t\t\tthis._state = state;\n\t\t\tthis._capabilities = capabilities;\n\t\t\tthis._constants = constants;\n\t\t\tthis._usedTextureUnits = 0;\n\t\t\tconst that = this;\n\t\t\tfunction onTextureDispose(event) {\n\t\t\t\tconst texture = event.target;\n\t\t\t\tconst textureProperties = that.get(texture);\n\t\t\t\ttexture.removeEventListener('dispose', onTextureDispose);\n\t\t\t\tif (textureProperties.__webglTexture && !textureProperties.__external) {\n\t\t\t\t\tgl.deleteTexture(textureProperties.__webglTexture);\n\t\t\t\t}\n\t\t\t\tif (textureProperties.__readBuffer) {\n\t\t\t\t\tgl.deleteBuffer(textureProperties.__readBuffer);\n\t\t\t\t}\n\t\t\t\tthat.delete(texture);\n\t\t\t}\n\t\t\tthis._onTextureDispose = onTextureDispose;\n\t\t\tthis._wrappingToGL = {\n\t\t\t\t[TEXTURE_WRAP.REPEAT]: gl.REPEAT,\n\t\t\t\t[TEXTURE_WRAP.CLAMP_TO_EDGE]: gl.CLAMP_TO_EDGE,\n\t\t\t\t[TEXTURE_WRAP.MIRRORED_REPEAT]: gl.MIRRORED_REPEAT\n\t\t\t};\n\t\t\tthis._filterToGL = {\n\t\t\t\t[TEXTURE_FILTER.NEAREST]: gl.NEAREST,\n\t\t\t\t[TEXTURE_FILTER.LINEAR]: gl.LINEAR,\n\t\t\t\t[TEXTURE_FILTER.NEAREST_MIPMAP_NEAREST]: gl.NEAREST_MIPMAP_NEAREST,\n\t\t\t\t[TEXTURE_FILTER.LINEAR_MIPMAP_NEAREST]: gl.LINEAR_MIPMAP_NEAREST,\n\t\t\t\t[TEXTURE_FILTER.NEAREST_MIPMAP_LINEAR]: gl.NEAREST_MIPMAP_LINEAR,\n\t\t\t\t[TEXTURE_FILTER.LINEAR_MIPMAP_LINEAR]: gl.LINEAR_MIPMAP_LINEAR\n\t\t\t};\n\t\t}\n\t\tallocTexUnit() {\n\t\t\tconst textureUnit = this._usedTextureUnits++;\n\t\t\tif (textureUnit >= this._capabilities.maxTextures) {\n\t\t\t\tconsole.warn('trying to use ' + textureUnit + ' texture units while this GPU supports only ' + this._capabilities.maxTextures);\n\t\t\t}\n\t\t\treturn textureUnit;\n\t\t}\n\t\tresetTextureUnits() {\n\t\t\tthis._usedTextureUnits = 0;\n\t\t}\n\t\tsetTexture(texture, slot) {\n\t\t\tconst gl = this._gl;\n\t\t\tconst capabilities = this._capabilities;\n\t\t\tconst constants = this._constants;\n\t\t\tconst state = this._state;\n\t\t\tif ((texture.isTexture3D || texture.isTexture2DArray) && capabilities.version < 2) {\n\t\t\t\tconsole.warn('WebGLTextures: Texture3D/Texture2DArray is not supported in WebGL1.0.');\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (slot !== undefined) {\n\t\t\t\tslot = gl.TEXTURE0 + slot;\n\t\t\t}\n\t\t\tconst textureProperties = this.get(texture);\n\t\t\tconst textureTarget = getTextureTarget(gl, texture);\n\t\t\tconst hasImage = texture.isTextureCube ? texture.images.length === 6 : !!texture.image;\n\t\t\tlet singleImage = texture.isTextureCube ? texture.images[0] : texture.image;\n\t\t\tif (hasImage && textureProperties.__version !== texture.version\n\t\t\t// Do not initialize rtt texture, unless slot is undefined,\n\t\t\t// which means the caller just wants to bind the texture to the framebuffer, not use it for sampling.\n\t\t\t&& (!singleImage.rtt || slot === undefined)\n\t\t\t// Do not initialize external texture\n\t\t\t&& !textureProperties.__external) {\n\t\t\t\tif (textureProperties.__webglTexture === undefined) {\n\t\t\t\t\ttexture.addEventListener('dispose', this._onTextureDispose);\n\t\t\t\t\ttextureProperties.__webglTexture = gl.createTexture();\n\t\t\t\t\ttextureProperties.__webglTarget = textureTarget;\n\t\t\t\t}\n\t\t\t\tif (capabilities.version < 2 && texture.isTexture2D && !_isPowerOfTwo(singleImage) && textureNeedsPowerOfTwo(texture) && domCheck(singleImage)) {\n\t\t\t\t\tsingleImage = makePowerOf2(singleImage);\n\t\t\t\t}\n\t\t\t\tconst needFallback = capabilities.version < 2 && !_isPowerOfTwo(singleImage);\n\t\t\t\tconst uploadMipmaps = texture.mipmaps.length > 0 && !needFallback;\n\t\t\t\tconst glFormat = constants.getGLFormat(texture.format),\n\t\t\t\t\tglType = constants.getGLType(texture.type),\n\t\t\t\t\tglInternalFormat = texture.internalformat !== null ? constants.getGLInternalFormat(texture.internalformat) : getGLInternalFormat(gl, capabilities, glFormat, glType);\n\t\t\t\ttextureProperties.__glFormat = glFormat;\n\t\t\t\ttextureProperties.__glType = glType;\n\t\t\t\ttextureProperties.__glInternalFormat = glInternalFormat;\n\t\t\t\ttextureProperties.__width = singleImage.width;\n\t\t\t\ttextureProperties.__height = singleImage.height;\n\t\t\t\ttextureProperties.__maxMipLevel = uploadMipmaps ? texture.mipmaps.length - 1 : 0;\n\t\t\t\tstate.activeTexture(slot);\n\t\t\t\tstate.bindTexture(textureTarget, textureProperties.__webglTexture);\n\t\t\t\tgl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, texture.flipY);\n\t\t\t\tgl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, texture.premultiplyAlpha);\n\t\t\t\tgl.pixelStorei(gl.UNPACK_ALIGNMENT, texture.unpackAlignment);\n\t\t\t\tgl.pixelStorei(gl.UNPACK_COLORSPACE_CONVERSION_WEBGL, gl.NONE);\n\t\t\t\tthis._setTextureParameters(texture, textureTarget, needFallback);\n\t\t\t\tif (texture.isTexture2D) {\n\t\t\t\t\tthis._upload2DImage(texture, textureProperties, uploadMipmaps, singleImage);\n\t\t\t\t} else if (texture.isTextureCube) {\n\t\t\t\t\tthis._uploadCubeImages(texture, textureProperties, uploadMipmaps);\n\t\t\t\t} else if (texture.isTexture3D) {\n\t\t\t\t\tthis._upload3DImage(texture, textureProperties);\n\t\t\t\t} else if (texture.isTexture2DArray) {\n\t\t\t\t\tthis._upload2DArrayImage(texture, textureProperties);\n\t\t\t\t}\n\t\t\t\tif (texture.generateMipmaps && !uploadMipmaps && !needFallback) {\n\t\t\t\t\tthis.generateMipmaps(texture);\n\t\t\t\t}\n\t\t\t\ttextureProperties.__version = texture.version;\n\t\t\t\treturn textureProperties;\n\t\t\t}\n\t\t\tstate.activeTexture(slot);\n\t\t\tstate.bindTexture(textureTarget, textureProperties.__webglTexture);\n\t\t\treturn textureProperties;\n\t\t}\n\t\tgenerateMipmaps(texture) {\n\t\t\tconst gl = this._gl;\n\t\t\tconst textureProperties = this.get(texture);\n\t\t\tgl.generateMipmap(textureProperties.__webglTarget);\n\t\t\tconst width = textureProperties.__width,\n\t\t\t\theight = textureProperties.__height;\n\t\t\t// Note: Math.log( x ) * Math.LOG2E used instead of Math.log2( x ) which is not supported by IE11\n\t\t\ttextureProperties.__maxMipLevel = Math.log(Math.max(width, height)) * Math.LOG2E;\n\t\t}\n\t\tsetTextureExternal(texture, webglTexture) {\n\t\t\tconst gl = this._gl;\n\t\t\tconst textureProperties = this.get(texture);\n\t\t\tif (!textureProperties.__external) {\n\t\t\t\tif (textureProperties.__webglTexture) {\n\t\t\t\t\tgl.deleteTexture(textureProperties.__webglTexture);\n\t\t\t\t} else {\n\t\t\t\t\ttexture.addEventListener('dispose', this._onTextureDispose);\n\t\t\t\t}\n\t\t\t}\n\t\t\ttextureProperties.__webglTexture = webglTexture;\n\t\t\ttextureProperties.__external = true;\n\t\t}\n\t\t_setTextureParameters(texture, textureType, needFallback) {\n\t\t\tconst gl = this._gl;\n\t\t\tconst capabilities = this._capabilities;\n\t\t\tconst wrappingToGL = this._wrappingToGL;\n\t\t\tconst filterToGL = this._filterToGL;\n\t\t\tlet wrapS = texture.wrapS,\n\t\t\t\twrapT = texture.wrapT,\n\t\t\t\twrapR = texture.wrapR,\n\t\t\t\tmagFilter = texture.magFilter,\n\t\t\t\tminFilter = texture.minFilter;\n\n\t\t\t// fix for non power of 2 image in WebGL 1.0\n\t\t\tif (needFallback) {\n\t\t\t\twrapS = TEXTURE_WRAP.CLAMP_TO_EDGE;\n\t\t\t\twrapT = TEXTURE_WRAP.CLAMP_TO_EDGE;\n\t\t\t\tif (texture.isTexture3D) {\n\t\t\t\t\twrapR = TEXTURE_WRAP.CLAMP_TO_EDGE;\n\t\t\t\t}\n\t\t\t\tif (texture.wrapS !== TEXTURE_WRAP.CLAMP_TO_EDGE || texture.wrapT !== TEXTURE_WRAP.CLAMP_TO_EDGE) {\n\t\t\t\t\tconsole.warn('Texture is not power of two. Texture.wrapS and Texture.wrapT should be set to TEXTURE_WRAP.CLAMP_TO_EDGE.', texture);\n\t\t\t\t}\n\t\t\t\tmagFilter = filterFallback(texture.magFilter);\n\t\t\t\tminFilter = filterFallback(texture.minFilter);\n\t\t\t\tif (texture.minFilter !== TEXTURE_FILTER.NEAREST && texture.minFilter !== TEXTURE_FILTER.LINEAR || texture.magFilter !== TEXTURE_FILTER.NEAREST && texture.magFilter !== TEXTURE_FILTER.LINEAR) {\n\t\t\t\t\tconsole.warn('Texture is not power of two. Texture.minFilter and Texture.magFilter should be set to TEXTURE_FILTER.NEAREST or TEXTURE_FILTER.LINEAR.', texture);\n\t\t\t\t}\n\t\t\t}\n\t\t\tgl.texParameteri(textureType, gl.TEXTURE_WRAP_S, wrappingToGL[wrapS]);\n\t\t\tgl.texParameteri(textureType, gl.TEXTURE_WRAP_T, wrappingToGL[wrapT]);\n\t\t\tif (texture.isTexture3D) {\n\t\t\t\tgl.texParameteri(textureType, gl.TEXTURE_WRAP_R, wrappingToGL[wrapR]);\n\t\t\t}\n\t\t\tgl.texParameteri(textureType, gl.TEXTURE_MAG_FILTER, filterToGL[magFilter]);\n\t\t\tgl.texParameteri(textureType, gl.TEXTURE_MIN_FILTER, filterToGL[minFilter]);\n\n\t\t\t// anisotropy if EXT_texture_filter_anisotropic exist\n\t\t\tconst extension = capabilities.anisotropyExt;\n\t\t\tif (extension) {\n\t\t\t\tgl.texParameterf(textureType, extension.TEXTURE_MAX_ANISOTROPY_EXT, Math.min(texture.anisotropy, capabilities.maxAnisotropy));\n\t\t\t}\n\t\t\tif (capabilities.version >= 2) {\n\t\t\t\tif (texture.compare !== undefined) {\n\t\t\t\t\tgl.texParameteri(textureType, gl.TEXTURE_COMPARE_MODE, gl.COMPARE_REF_TO_TEXTURE);\n\t\t\t\t\tgl.texParameteri(textureType, gl.TEXTURE_COMPARE_FUNC, texture.compare);\n\t\t\t\t} else {\n\t\t\t\t\tgl.texParameteri(textureType, gl.TEXTURE_COMPARE_MODE, gl.NONE);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t_upload2DImage(texture, textureProperties, uploadMipmaps, image) {\n\t\t\tconst gl = this._gl;\n\t\t\tconst glTarget = textureProperties.__webglTarget,\n\t\t\t\tglFormat = textureProperties.__glFormat,\n\t\t\t\tglType = textureProperties.__glType,\n\t\t\t\tglInternalFormat = textureProperties.__glInternalFormat;\n\t\t\tif (domCheck(image)) {\n\t\t\t\tif (uploadMipmaps) {\n\t\t\t\t\tconst mipmaps = texture.mipmaps;\n\t\t\t\t\tfor (let level = 0, l = mipmaps.length; level < l; level++) {\n\t\t\t\t\t\tgl.texImage2D(glTarget, level, glInternalFormat, glFormat, glType, mipmaps[level]);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tgl.texImage2D(glTarget, 0, glInternalFormat, glFormat, glType, image);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (uploadMipmaps) {\n\t\t\t\t\tconst isCompressed = image.isCompressed;\n\t\t\t\t\tconst mipmaps = texture.mipmaps;\n\t\t\t\t\tlet mipmap;\n\t\t\t\t\tfor (let level = 0, l = mipmaps.length; level < l; level++) {\n\t\t\t\t\t\tmipmap = mipmaps[level];\n\t\t\t\t\t\tif (isCompressed) {\n\t\t\t\t\t\t\tgl.compressedTexImage2D(glTarget, level, glInternalFormat, mipmap.width, mipmap.height, 0, mipmap.data);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tgl.texImage2D(glTarget, level, glInternalFormat, mipmap.width, mipmap.height, texture.border, glFormat, glType, mipmap.data);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tgl.texImage2D(glTarget, 0, glInternalFormat, image.width, image.height, texture.border, glFormat, glType, image.data);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t_uploadCubeImages(texture, textureProperties, uploadMipmaps) {\n\t\t\tconst gl = this._gl;\n\t\t\tconst glFormat = textureProperties.__glFormat,\n\t\t\t\tglType = textureProperties.__glType,\n\t\t\t\tglInternalFormat = textureProperties.__glInternalFormat;\n\t\t\tconst images = texture.images;\n\t\t\tfor (let face = 0; face < 6; face++) {\n\t\t\t\tconst image = images[face];\n\t\t\t\tconst glTarget = gl.TEXTURE_CUBE_MAP_POSITIVE_X + face;\n\t\t\t\tif (domCheck(image)) {\n\t\t\t\t\tif (uploadMipmaps) {\n\t\t\t\t\t\tconst mipmaps = texture.mipmaps;\n\t\t\t\t\t\tfor (let level = 0, l = mipmaps.length; level < l; level++) {\n\t\t\t\t\t\t\tgl.texImage2D(glTarget, level, glInternalFormat, glFormat, glType, mipmaps[level][face]);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tgl.texImage2D(glTarget, 0, glInternalFormat, glFormat, glType, image);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tif (uploadMipmaps) {\n\t\t\t\t\t\tconst isCompressed = image.isCompressed;\n\t\t\t\t\t\tconst mipmaps = texture.mipmaps;\n\t\t\t\t\t\tlet mipmap;\n\t\t\t\t\t\tfor (let level = 0, l = mipmaps.length; level < l; level++) {\n\t\t\t\t\t\t\tmipmap = mipmaps[level][face];\n\t\t\t\t\t\t\tif (isCompressed) {\n\t\t\t\t\t\t\t\tgl.compressedTexImage2D(glTarget, level, glInternalFormat, mipmap.width, mipmap.height, 0, mipmap.data);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tgl.texImage2D(glTarget, level, glInternalFormat, mipmap.width, mipmap.height, texture.border, glFormat, glType, mipmap.data);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tgl.texImage2D(glTarget, 0, glInternalFormat, image.width, image.height, texture.border, glFormat, glType, image.data);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t_upload3DImage(texture, textureProperties) {\n\t\t\tconst gl = this._gl;\n\t\t\tconst glTarget = textureProperties.__webglTarget,\n\t\t\t\tglFormat = textureProperties.__glFormat,\n\t\t\t\tglType = textureProperties.__glType,\n\t\t\t\tglInternalFormat = textureProperties.__glInternalFormat;\n\t\t\tconst image = texture.image;\n\t\t\tgl.texImage3D(glTarget, 0, glInternalFormat, image.width, image.height, image.depth, texture.border, glFormat, glType, image.data);\n\t\t}\n\t\t_upload2DArrayImage(texture, textureProperties) {\n\t\t\tconst gl = this._gl;\n\t\t\tconst glTarget = textureProperties.__webglTarget,\n\t\t\t\tglFormat = textureProperties.__glFormat,\n\t\t\t\tglType = textureProperties.__glType,\n\t\t\t\tglInternalFormat = textureProperties.__glInternalFormat;\n\t\t\tconst image = texture.image;\n\t\t\tif (texture.layerUpdates.size > 0) {\n\t\t\t\tfor (const layerIndex of texture.layerUpdates) {\n\t\t\t\t\tconst layerByteLength = getByteLength(image.width, image.height, texture.format, texture.type);\n\t\t\t\t\tconst layerData = image.data.subarray(layerIndex * layerByteLength / image.data.BYTES_PER_ELEMENT, (layerIndex + 1) * layerByteLength / image.data.BYTES_PER_ELEMENT);\n\t\t\t\t\tgl.texSubImage3D(glTarget, 0, 0, 0, layerIndex, image.width, image.height, 1, glFormat, glType, layerData);\n\t\t\t\t}\n\t\t\t\ttexture.layerUpdates.clear();\n\t\t\t} else {\n\t\t\t\tgl.texImage3D(glTarget, 0, glInternalFormat, image.width, image.height, image.depth, texture.border, glFormat, glType, image.data);\n\t\t\t}\n\t\t}\n\t}\n\tfunction textureNeedsPowerOfTwo(texture) {\n\t\treturn texture.wrapS !== TEXTURE_WRAP.CLAMP_TO_EDGE || texture.wrapT !== TEXTURE_WRAP.CLAMP_TO_EDGE || texture.minFilter !== TEXTURE_FILTER.NEAREST && texture.minFilter !== TEXTURE_FILTER.LINEAR;\n\t}\n\tfunction filterFallback(filter) {\n\t\tif (filter === TEXTURE_FILTER.NEAREST || filter === TEXTURE_FILTER.NEAREST_MIPMAP_LINEAR || filter === TEXTURE_FILTER.NEAREST_MIPMAP_NEAREST) {\n\t\t\treturn TEXTURE_FILTER.NEAREST;\n\t\t}\n\t\treturn TEXTURE_FILTER.LINEAR;\n\t}\n\tfunction _isPowerOfTwo(image) {\n\t\treturn MathUtils.isPowerOfTwo(image.width) && MathUtils.isPowerOfTwo(image.height);\n\t}\n\tlet _canvas;\n\tfunction makePowerOf2(image) {\n\t\tif (_canvas === undefined) _canvas = document.createElementNS('http://www.w3.org/1999/xhtml', 'canvas');\n\t\t_canvas.width = MathUtils.nearestPowerOfTwo(image.width);\n\t\t_canvas.height = MathUtils.nearestPowerOfTwo(image.height);\n\t\tconst context = _canvas.getContext('2d');\n\t\tcontext.drawImage(image, 0, 0, _canvas.width, _canvas.height);\n\t\tconsole.warn('image is not power of two (' + image.width + 'x' + image.height + '). Resized to ' + _canvas.width + 'x' + _canvas.height, image);\n\t\treturn _canvas;\n\t}\n\tfunction getGLInternalFormat(gl, capabilities, glFormat, glType) {\n\t\tconst isWebGL2 = capabilities.version >= 2;\n\t\tif (isWebGL2 === false) return glFormat;\n\t\tlet glInternalFormat = glFormat;\n\t\tif (glFormat === gl.RED) {\n\t\t\tif (glType === gl.FLOAT) glInternalFormat = gl.R32F;\n\t\t\tif (glType === gl.HALF_FLOAT) glInternalFormat = gl.R16F;\n\t\t\tif (glType === gl.UNSIGNED_BYTE) glInternalFormat = gl.R8;\n\t\t}\n\t\tif (glFormat === gl.RG) {\n\t\t\tif (glType === gl.FLOAT) glInternalFormat = gl.RG32F;\n\t\t\tif (glType === gl.HALF_FLOAT) glInternalFormat = gl.RG16F;\n\t\t\tif (glType === gl.UNSIGNED_BYTE) glInternalFormat = gl.RG8;\n\t\t}\n\t\tif (glFormat === gl.RGB) {\n\t\t\tif (glType === gl.FLOAT) glInternalFormat = gl.RGB32F;\n\t\t\tif (glType === gl.HALF_FLOAT) glInternalFormat = gl.RGB16F;\n\t\t\tif (glType === gl.UNSIGNED_BYTE) glInternalFormat = gl.RGB8;\n\t\t}\n\t\tif (glFormat === gl.RGBA) {\n\t\t\tif (glType === gl.FLOAT) glInternalFormat = gl.RGBA32F;\n\t\t\tif (glType === gl.HALF_FLOAT) glInternalFormat = gl.RGBA16F;\n\t\t\tif (glType === gl.UNSIGNED_BYTE) glInternalFormat = gl.RGBA8;\n\t\t\tif (glType === gl.UNSIGNED_SHORT_4_4_4_4) glInternalFormat = gl.RGBA4;\n\t\t\tif (glType === gl.UNSIGNED_SHORT_5_5_5_1) glInternalFormat = gl.RGB5_A1;\n\t\t}\n\t\tif (glFormat === gl.DEPTH_COMPONENT || glFormat === gl.DEPTH_STENCIL) {\n\t\t\tglInternalFormat = gl.DEPTH_COMPONENT16;\n\t\t\tif (glType === gl.FLOAT) glInternalFormat = gl.DEPTH_COMPONENT32F;\n\t\t\tif (glType === gl.UNSIGNED_INT) glInternalFormat = gl.DEPTH_COMPONENT24;\n\t\t\tif (glType === gl.UNSIGNED_INT_24_8) glInternalFormat = gl.DEPTH24_STENCIL8;\n\t\t\tif (glType === gl.FLOAT_32_UNSIGNED_INT_24_8_REV) glInternalFormat = gl.DEPTH32F_STENCIL8;\n\t\t}\n\t\tif (glInternalFormat === gl.R16F || glInternalFormat === gl.R32F || glInternalFormat === gl.RG16F || glInternalFormat === gl.RG32F || glInternalFormat === gl.RGB16F || glInternalFormat === gl.RGB32F || glInternalFormat === gl.RGBA16F || glInternalFormat === gl.RGBA32F) {\n\t\t\tcapabilities.getExtension('EXT_color_buffer_float');\n\t\t}\n\t\treturn glInternalFormat;\n\t}\n\tfunction domCheck(image) {\n\t\treturn typeof HTMLImageElement !== 'undefined' && image instanceof HTMLImageElement || typeof HTMLCanvasElement !== 'undefined' && image instanceof HTMLCanvasElement || typeof HTMLVideoElement !== 'undefined' && image instanceof HTMLVideoElement || typeof ImageBitmap !== 'undefined' && image instanceof ImageBitmap;\n\t}\n\tfunction getByteLength(width, height, format, type) {\n\t\tconst typeByteLength = getTextureTypeByteLength(type);\n\t\tswitch (format) {\n\t\t\t// https://registry.khronos.org/OpenGL-Refpages/es3.0/html/glTexImage2D.xhtml\n\t\t\tcase PIXEL_FORMAT.ALPHA:\n\t\t\t\treturn width * height;\n\t\t\tcase PIXEL_FORMAT.LUMINANCE:\n\t\t\t\treturn width * height;\n\t\t\tcase PIXEL_FORMAT.LUMINANCE_ALPHA:\n\t\t\t\treturn width * height * 2;\n\t\t\tcase PIXEL_FORMAT.RED:\n\t\t\t\treturn width * height / typeByteLength.components * typeByteLength.byteLength;\n\t\t\tcase PIXEL_FORMAT.RED_INTEGER:\n\t\t\t\treturn width * height / typeByteLength.components * typeByteLength.byteLength;\n\t\t\tcase PIXEL_FORMAT.RG:\n\t\t\t\treturn width * height * 2 / typeByteLength.components * typeByteLength.byteLength;\n\t\t\tcase PIXEL_FORMAT.RG_INTEGER:\n\t\t\t\treturn width * height * 2 / typeByteLength.components * typeByteLength.byteLength;\n\t\t\tcase PIXEL_FORMAT.RGB:\n\t\t\t\treturn width * height * 3 / typeByteLength.components * typeByteLength.byteLength;\n\t\t\tcase PIXEL_FORMAT.RGBA:\n\t\t\t\treturn width * height * 4 / typeByteLength.components * typeByteLength.byteLength;\n\t\t\tcase PIXEL_FORMAT.RGBA_INTEGER:\n\t\t\t\treturn width * height * 4 / typeByteLength.components * typeByteLength.byteLength;\n\n\t\t\t// https://registry.khronos.org/webgl/extensions/WEBGL_compressed_texture_s3tc_srgb/\n\t\t\tcase PIXEL_FORMAT.RGB_S3TC_DXT1:\n\t\t\tcase PIXEL_FORMAT.RGBA_S3TC_DXT1:\n\t\t\t\treturn Math.floor((width + 3) / 4) * Math.floor((height + 3) / 4) * 8;\n\t\t\tcase PIXEL_FORMAT.RGBA_S3TC_DXT3:\n\t\t\tcase PIXEL_FORMAT.RGBA_S3TC_DXT5:\n\t\t\t\treturn Math.floor((width + 3) / 4) * Math.floor((height + 3) / 4) * 16;\n\n\t\t\t// https://registry.khronos.org/webgl/extensions/WEBGL_compressed_texture_pvrtc/\n\t\t\tcase PIXEL_FORMAT.RGB_PVRTC_2BPPV1:\n\t\t\tcase PIXEL_FORMAT.RGBA_PVRTC_2BPPV1:\n\t\t\t\treturn Math.max(width, 16) * Math.max(height, 8) / 4;\n\t\t\tcase PIXEL_FORMAT.RGB_PVRTC_4BPPV1:\n\t\t\tcase PIXEL_FORMAT.RGBA_PVRTC_4BPPV1:\n\t\t\t\treturn Math.max(width, 8) * Math.max(height, 8) / 2;\n\n\t\t\t// https://registry.khronos.org/webgl/extensions/WEBGL_compressed_texture_etc/\n\t\t\tcase PIXEL_FORMAT.RGB_ETC1:\n\t\t\t\treturn Math.floor((width + 3) / 4) * Math.floor((height + 3) / 4) * 8;\n\t\t\t// https://registry.khronos.org/webgl/extensions/WEBGL_compressed_texture_astc/\n\t\t\tcase PIXEL_FORMAT.RGBA_ASTC_4x4:\n\t\t\t\treturn Math.floor((width + 3) / 4) * Math.floor((height + 3) / 4) * 16;\n\t\t\t// https://registry.khronos.org/webgl/extensions/EXT_texture_compression_bptc/\n\t\t\tcase PIXEL_FORMAT.RGBA_BPTC:\n\t\t\t\treturn Math.ceil(width / 4) * Math.ceil(height / 4) * 16;\n\t\t}\n\t\tthrow new Error(`Unable to determine texture byte length for ${format} format.`);\n\t}\n\tconst _tempTypeByteLength = {\n\t\tbyteLength: 0,\n\t\tcomponents: 0\n\t};\n\tfunction getTextureTypeByteLength(type) {\n\t\tswitch (type) {\n\t\t\tcase PIXEL_TYPE.UNSIGNED_BYTE:\n\t\t\tcase PIXEL_TYPE.ByteType:\n\t\t\t\t_tempTypeByteLength.byteLength = 1;\n\t\t\t\t_tempTypeByteLength.components = 1;\n\t\t\t\treturn _tempTypeByteLength;\n\t\t\tcase PIXEL_TYPE.UNSIGNED_SHORT:\n\t\t\tcase PIXEL_TYPE.SHORT:\n\t\t\tcase PIXEL_TYPE.HALF_FLOAT:\n\t\t\t\t_tempTypeByteLength.byteLength = 2;\n\t\t\t\t_tempTypeByteLength.components = 1;\n\t\t\t\treturn _tempTypeByteLength;\n\t\t\tcase PIXEL_TYPE.UNSIGNED_SHORT_4_4_4_4:\n\t\t\tcase PIXEL_TYPE.UNSIGNED_SHORT_5_5_5_1:\n\t\t\t\t_tempTypeByteLength.byteLength = 2;\n\t\t\t\t_tempTypeByteLength.components = 4;\n\t\t\t\treturn _tempTypeByteLength;\n\t\t\tcase PIXEL_TYPE.UNSIGNED_INT:\n\t\t\tcase PIXEL_TYPE.INT:\n\t\t\tcase PIXEL_TYPE.FLOAT:\n\t\t\t\t_tempTypeByteLength.byteLength = 4;\n\t\t\t\t_tempTypeByteLength.components = 1;\n\t\t\t\treturn _tempTypeByteLength;\n\t\t}\n\t\tthrow new Error(`Unknown texture type ${type}.`);\n\t}\n\tfunction getTextureTarget(gl, texture) {\n\t\tif (texture.isTexture2D) {\n\t\t\treturn gl.TEXTURE_2D;\n\t\t} else if (texture.isTextureCube) {\n\t\t\treturn gl.TEXTURE_CUBE_MAP;\n\t\t} else if (texture.isTexture3D) {\n\t\t\treturn gl.TEXTURE_3D;\n\t\t} else if (texture.isTexture2DArray) {\n\t\t\treturn gl.TEXTURE_2D_ARRAY;\n\t\t} else {\n\t\t\treturn gl.TEXTURE_2D;\n\t\t}\n\t}\n\n\tclass WebGLRenderBuffers extends PropertyMap {\n\t\tconstructor(prefix, gl, capabilities, constants) {\n\t\t\tsuper(prefix);\n\t\t\tthis._gl = gl;\n\t\t\tthis._capabilities = capabilities;\n\t\t\tthis._constants = constants;\n\t\t\tconst that = this;\n\t\t\tfunction onRenderBufferDispose(event) {\n\t\t\t\tconst renderBuffer = event.target;\n\t\t\t\trenderBuffer.removeEventListener('dispose', onRenderBufferDispose);\n\t\t\t\tconst renderBufferProperties = that.get(renderBuffer);\n\t\t\t\tif (renderBufferProperties.__webglRenderbuffer && !renderBufferProperties.__external) {\n\t\t\t\t\tgl.deleteRenderbuffer(renderBufferProperties.__webglRenderbuffer);\n\t\t\t\t}\n\t\t\t\tthat.delete(renderBuffer);\n\t\t\t}\n\t\t\tthis._onRenderBufferDispose = onRenderBufferDispose;\n\t\t}\n\t\tsetRenderBuffer(renderBuffer) {\n\t\t\tconst gl = this._gl;\n\t\t\tconst capabilities = this._capabilities;\n\t\t\tconst constants = this._constants;\n\t\t\tconst renderBufferProperties = this.get(renderBuffer);\n\t\t\tif (renderBufferProperties.__webglRenderbuffer === undefined) {\n\t\t\t\trenderBuffer.addEventListener('dispose', this._onRenderBufferDispose);\n\t\t\t\trenderBufferProperties.__webglRenderbuffer = gl.createRenderbuffer();\n\t\t\t\tgl.bindRenderbuffer(gl.RENDERBUFFER, renderBufferProperties.__webglRenderbuffer);\n\t\t\t\tconst glFormat = constants.getGLInternalFormat(renderBuffer.format);\n\t\t\t\tif (renderBuffer.multipleSampling > 0) {\n\t\t\t\t\tif (capabilities.version < 2) {\n\t\t\t\t\t\tconsole.error('render buffer multipleSampling is not support in webgl 1.0.');\n\t\t\t\t\t}\n\t\t\t\t\tgl.renderbufferStorageMultisample(gl.RENDERBUFFER, Math.min(renderBuffer.multipleSampling, capabilities.maxSamples), glFormat, renderBuffer.width, renderBuffer.height);\n\t\t\t\t} else {\n\t\t\t\t\tgl.renderbufferStorage(gl.RENDERBUFFER, glFormat, renderBuffer.width, renderBuffer.height);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tgl.bindRenderbuffer(gl.RENDERBUFFER, renderBufferProperties.__webglRenderbuffer);\n\t\t\t}\n\t\t\treturn renderBufferProperties;\n\t\t}\n\t\tsetRenderBufferExternal(renderBuffer, webglRenderbuffer) {\n\t\t\tconst gl = this._gl;\n\t\t\tconst renderBufferProperties = this.get(renderBuffer);\n\t\t\tif (!renderBufferProperties.__external) {\n\t\t\t\tif (renderBufferProperties.__webglRenderbuffer) {\n\t\t\t\t\tgl.deleteRenderbuffer(renderBufferProperties.__webglRenderbuffer);\n\t\t\t\t} else {\n\t\t\t\t\trenderBuffer.addEventListener('dispose', this._onRenderBufferDispose);\n\t\t\t\t}\n\t\t\t}\n\t\t\trenderBufferProperties.__webglRenderbuffer = webglRenderbuffer;\n\t\t\trenderBufferProperties.__external = true;\n\t\t}\n\t}\n\n\tclass WebGLRenderTargets extends PropertyMap {\n\t\tconstructor(prefix, gl, state, capabilities, textures, renderBuffers, constants) {\n\t\t\tsuper(prefix);\n\t\t\tthis._gl = gl;\n\t\t\tthis._state = state;\n\t\t\tthis._capabilities = capabilities;\n\t\t\tthis._textures = textures;\n\t\t\tthis._renderBuffers = renderBuffers;\n\t\t\tthis._constants = constants;\n\t\t\tconst that = this;\n\t\t\tfunction onRenderTargetDispose(event) {\n\t\t\t\tconst renderTarget = event.target;\n\t\t\t\trenderTarget.removeEventListener('dispose', onRenderTargetDispose);\n\t\t\t\tconst renderTargetProperties = that.get(renderTarget);\n\t\t\t\tif (renderTargetProperties.__webglFramebuffer && !renderTargetProperties.__external) {\n\t\t\t\t\tgl.deleteFramebuffer(renderTargetProperties.__webglFramebuffer);\n\t\t\t\t}\n\t\t\t\tthat.delete(renderTarget);\n\t\t\t\tif (state.currentRenderTarget === renderTarget) {\n\t\t\t\t\tstate.currentRenderTarget = null;\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis._onRenderTargetDispose = onRenderTargetDispose;\n\t\t}\n\t\t_setupRenderTarget(renderTarget) {\n\t\t\tconst gl = this._gl;\n\t\t\tconst state = this._state;\n\t\t\tconst textures = this._textures;\n\t\t\tconst renderBuffers = this._renderBuffers;\n\t\t\tconst capabilities = this._capabilities;\n\t\t\tconst renderTargetProperties = this.get(renderTarget);\n\t\t\trenderTarget.addEventListener('dispose', this._onRenderTargetDispose);\n\t\t\tconst glFrameBuffer = gl.createFramebuffer();\n\t\t\tconst drawBuffers = [];\n\t\t\trenderTargetProperties.__webglFramebuffer = glFrameBuffer;\n\t\t\trenderTargetProperties.__drawBuffers = drawBuffers;\n\t\t\trenderTargetProperties.__currentActiveMipmapLevel = renderTarget.activeMipmapLevel;\n\t\t\trenderTargetProperties.__currentActiveLayer = renderTarget.activeLayer;\n\t\t\tgl.bindFramebuffer(gl.FRAMEBUFFER, glFrameBuffer);\n\t\t\tfor (const attachTarget in renderTarget._attachments) {\n\t\t\t\tconst glAttachTarget = attachTargetToGL[attachTarget];\n\t\t\t\tif (glAttachTarget === gl.DEPTH_ATTACHMENT || glAttachTarget === gl.DEPTH_STENCIL_ATTACHMENT) {\n\t\t\t\t\tif (capabilities.version < 2 && !capabilities.getExtension('WEBGL_depth_texture')) {\n\t\t\t\t\t\tconsole.warn('WebGLRenderTargets: extension WEBGL_depth_texture is not support.');\n\t\t\t\t\t}\n\t\t\t\t} else if (glAttachTarget !== gl.STENCIL_ATTACHMENT) {\n\t\t\t\t\tdrawBuffers.push(glAttachTarget);\n\t\t\t\t}\n\t\t\t\tconst attachment = renderTarget._attachments[attachTarget];\n\t\t\t\tif (attachment.isTexture) {\n\t\t\t\t\tconst textureProperties = textures.setTexture(attachment);\n\t\t\t\t\tif (attachment.isTexture2D) {\n\t\t\t\t\t\tgl.framebufferTexture2D(gl.FRAMEBUFFER, glAttachTarget, gl.TEXTURE_2D, textureProperties.__webglTexture, renderTarget.activeMipmapLevel);\n\t\t\t\t\t} else if (attachment.isTextureCube) {\n\t\t\t\t\t\tgl.framebufferTexture2D(gl.FRAMEBUFFER, glAttachTarget, gl.TEXTURE_CUBE_MAP_POSITIVE_X + renderTarget.activeLayer, textureProperties.__webglTexture, renderTarget.activeMipmapLevel);\n\t\t\t\t\t} else if (attachment.isTexture3D || attachment.isTexture2DArray) {\n\t\t\t\t\t\tgl.framebufferTextureLayer(gl.FRAMEBUFFER, glAttachTarget, textureProperties.__webglTexture, renderTarget.activeMipmapLevel, renderTarget.activeLayer);\n\t\t\t\t\t}\n\t\t\t\t\tstate.bindTexture(textureProperties.__webglTarget, null);\n\t\t\t\t} else {\n\t\t\t\t\tconst renderBufferProperties = renderBuffers.setRenderBuffer(attachment);\n\t\t\t\t\tgl.framebufferRenderbuffer(gl.FRAMEBUFFER, glAttachTarget, gl.RENDERBUFFER, renderBufferProperties.__webglRenderbuffer);\n\t\t\t\t}\n\t\t\t}\n\t\t\tdrawBuffers.sort(drawBufferSort);\n\t\t\tif (capabilities.version >= 2) {\n\t\t\t\tgl.drawBuffers(drawBuffers);\n\t\t\t} else if (capabilities.getExtension('WEBGL_draw_buffers')) {\n\t\t\t\tcapabilities.getExtension('WEBGL_draw_buffers').drawBuffersWEBGL(drawBuffers);\n\t\t\t}\n\t\t}\n\t\tsetRenderTarget(renderTarget) {\n\t\t\tconst gl = this._gl;\n\t\t\tconst state = this._state;\n\t\t\tconst textures = this._textures;\n\t\t\tlet renderTargetProperties;\n\t\t\tif (state.currentRenderTarget !== renderTarget) {\n\t\t\t\tif (renderTarget.isScreenRenderTarget) {\n\t\t\t\t\tgl.bindFramebuffer(gl.FRAMEBUFFER, null);\n\t\t\t\t} else {\n\t\t\t\t\trenderTargetProperties = this.get(renderTarget);\n\t\t\t\t\tif (renderTargetProperties.__webglFramebuffer === undefined) {\n\t\t\t\t\t\tthis._setupRenderTarget(renderTarget);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tgl.bindFramebuffer(gl.FRAMEBUFFER, renderTargetProperties.__webglFramebuffer);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tstate.currentRenderTarget = renderTarget;\n\t\t\t}\n\t\t\trenderTargetProperties = this.get(renderTarget);\n\t\t\tif (renderTargetProperties.__external) return;\n\t\t\tconst activeLayer = renderTarget.activeLayer;\n\t\t\tconst activeMipmapLevel = renderTarget.activeMipmapLevel;\n\t\t\tif (renderTargetProperties.__currentActiveLayer !== activeLayer || renderTargetProperties.__currentActiveMipmapLevel !== activeMipmapLevel) {\n\t\t\t\tfor (const attachTarget in renderTarget._attachments) {\n\t\t\t\t\tconst attachment = renderTarget._attachments[attachTarget];\n\t\t\t\t\tif (!attachment.isTexture) continue;\n\t\t\t\t\tconst textureProperties = textures.get(attachment);\n\t\t\t\t\tif (attachment.isTexture2D) {\n\t\t\t\t\t\tgl.framebufferTexture2D(gl.FRAMEBUFFER, attachTargetToGL[attachTarget], gl.TEXTURE_2D, textureProperties.__webglTexture, activeMipmapLevel);\n\t\t\t\t\t} else if (attachment.isTextureCube) {\n\t\t\t\t\t\tgl.framebufferTexture2D(gl.FRAMEBUFFER, attachTargetToGL[attachTarget], gl.TEXTURE_CUBE_MAP_POSITIVE_X + activeLayer, textureProperties.__webglTexture, activeMipmapLevel);\n\t\t\t\t\t} else if (attachment.isTexture3D || attachment.isTexture2DArray) {\n\t\t\t\t\t\tgl.framebufferTextureLayer(gl.FRAMEBUFFER, attachTargetToGL[attachTarget], textureProperties.__webglTexture, activeMipmapLevel, activeLayer);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\trenderTargetProperties.__currentActiveLayer = activeLayer;\n\t\t\t\trenderTargetProperties.__currentActiveMipmapLevel = activeMipmapLevel;\n\t\t\t}\n\t\t}\n\t\tblitRenderTarget(read, draw, color = true, depth = true, stencil = true) {\n\t\t\tconst gl = this._gl;\n\t\t\tconst state = this._state;\n\t\t\tconst capabilities = this._capabilities;\n\t\t\tif (capabilities.version < 2) {\n\t\t\t\tconsole.warn('WebGLRenderTargets: blitFramebuffer not support by WebGL' + capabilities.version);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tlet needRestoreFramebuffer = false;\n\t\t\tlet readBuffer = this.get(read).__webglFramebuffer;\n\t\t\tif (!readBuffer) {\n\t\t\t\tthis._setupRenderTarget(read);\n\t\t\t\treadBuffer = this.get(read).__webglFramebuffer;\n\t\t\t\tneedRestoreFramebuffer = true;\n\t\t\t}\n\t\t\tlet drawBuffer = this.get(draw).__webglFramebuffer;\n\t\t\tif (!drawBuffer) {\n\t\t\t\tthis._setupRenderTarget(draw);\n\t\t\t\tdrawBuffer = this.get(draw).__webglFramebuffer;\n\t\t\t\tneedRestoreFramebuffer = true;\n\t\t\t}\n\t\t\tif (needRestoreFramebuffer) {\n\t\t\t\t// restore framebuffer binding\n\t\t\t\tconst framebuffer = state.currentRenderTarget && !state.currentRenderTarget.isScreenRenderTarget ? this.get(state.currentRenderTarget).__webglFramebuffer : null;\n\t\t\t\tgl.bindFramebuffer(gl.FRAMEBUFFER, framebuffer);\n\t\t\t}\n\t\t\tgl.bindFramebuffer(gl.READ_FRAMEBUFFER, readBuffer);\n\t\t\tgl.bindFramebuffer(gl.DRAW_FRAMEBUFFER, drawBuffer);\n\t\t\tlet mask = 0;\n\t\t\tif (color) mask |= gl.COLOR_BUFFER_BIT;\n\t\t\tif (depth) mask |= gl.DEPTH_BUFFER_BIT;\n\t\t\tif (stencil) mask |= gl.STENCIL_BUFFER_BIT;\n\n\t\t\t// gl.clearBufferfv(gl.COLOR, 0, [0.0, 0.0, 0.0, 0.0]);\n\n\t\t\tgl.blitFramebuffer(0, 0, read.width, read.height, 0, 0, draw.width, draw.height, mask, gl.NEAREST);\n\t\t}\n\t\tsetFramebufferExternal(renderTarget, webglFramebuffer) {\n\t\t\tconst renderTargetProperties = this.get(renderTarget);\n\t\t\tif (!renderTargetProperties.__external) {\n\t\t\t\tif (renderTargetProperties.__webglFramebuffer) {\n\t\t\t\t\tthis._gl.deleteFramebuffer(renderTargetProperties.__webglFramebuffer);\n\t\t\t\t} else {\n\t\t\t\t\trenderTarget.addEventListener('dispose', this._onRenderTargetDispose);\n\t\t\t\t}\n\t\t\t}\n\t\t\trenderTargetProperties.__webglFramebuffer = webglFramebuffer;\n\t\t\trenderTargetProperties.__external = true;\n\t\t}\n\t}\n\tconst attachTargetToGL = {\n\t\t[ATTACHMENT.COLOR_ATTACHMENT0]: 0x8CE0,\n\t\t[ATTACHMENT.COLOR_ATTACHMENT1]: 0x8CE1,\n\t\t[ATTACHMENT.COLOR_ATTACHMENT2]: 0x8CE2,\n\t\t[ATTACHMENT.COLOR_ATTACHMENT3]: 0x8CE3,\n\t\t[ATTACHMENT.COLOR_ATTACHMENT4]: 0x8CE4,\n\t\t[ATTACHMENT.COLOR_ATTACHMENT5]: 0x8CE5,\n\t\t[ATTACHMENT.COLOR_ATTACHMENT6]: 0x8CE6,\n\t\t[ATTACHMENT.COLOR_ATTACHMENT7]: 0x8CE7,\n\t\t[ATTACHMENT.COLOR_ATTACHMENT8]: 0x8CE8,\n\t\t[ATTACHMENT.COLOR_ATTACHMENT9]: 0x8CE9,\n\t\t[ATTACHMENT.COLOR_ATTACHMENT10]: 0x8CEA,\n\t\t[ATTACHMENT.COLOR_ATTACHMENT11]: 0x8CEB,\n\t\t[ATTACHMENT.COLOR_ATTACHMENT12]: 0x8CEC,\n\t\t[ATTACHMENT.COLOR_ATTACHMENT13]: 0x8CED,\n\t\t[ATTACHMENT.COLOR_ATTACHMENT14]: 0x8CEE,\n\t\t[ATTACHMENT.COLOR_ATTACHMENT15]: 0x8CEF,\n\t\t[ATTACHMENT.DEPTH_ATTACHMENT]: 0x8D00,\n\t\t[ATTACHMENT.STENCIL_ATTACHMENT]: 0x8D20,\n\t\t[ATTACHMENT.DEPTH_STENCIL_ATTACHMENT]: 0x821A\n\t};\n\tfunction drawBufferSort(a, b) {\n\t\treturn a - b;\n\t}\n\n\tclass WebGLBuffers extends PropertyMap {\n\t\tconstructor(prefix, gl, capabilities) {\n\t\t\tsuper(prefix);\n\t\t\tthis._gl = gl;\n\t\t\tthis._capabilities = capabilities;\n\t\t}\n\t\tsetBuffer(buffer, bufferType, vertexArrayBindings) {\n\t\t\tconst bufferProperties = this.get(buffer);\n\t\t\tconst needCreate = bufferProperties.glBuffer === undefined;\n\t\t\tif (!needCreate && bufferProperties.version === buffer.version) return;\n\n\t\t\t// Avoid polluting the binding state\n\t\t\tif (vertexArrayBindings) {\n\t\t\t\tvertexArrayBindings.reset();\n\t\t\t}\n\t\t\tif (needCreate || bufferProperties.__external) {\n\t\t\t\t// Because Buffer does not have a dispose interface at present,\n\t\t\t\t// when the version increases, the external is automatically closed\n\t\t\t\tthis._createGLBuffer(bufferProperties, buffer, bufferType);\n\t\t\t} else {\n\t\t\t\tthis._updateGLBuffer(bufferProperties.glBuffer, buffer, bufferType);\n\t\t\t\tbufferProperties.version = buffer.version;\n\t\t\t}\n\t\t}\n\t\tremoveBuffer(buffer) {\n\t\t\tconst gl = this._gl;\n\t\t\tconst bufferProperties = this.get(buffer);\n\t\t\tif (bufferProperties.glBuffer && !bufferProperties.__external) {\n\t\t\t\tgl.deleteBuffer(bufferProperties.glBuffer);\n\t\t\t}\n\t\t\tthis.delete(buffer);\n\t\t}\n\t\tsetBufferExternal(buffer, webglBuffer) {\n\t\t\tconst gl = this._gl;\n\t\t\tconst bufferProperties = this.get(buffer);\n\t\t\tif (!bufferProperties.__external) {\n\t\t\t\tif (bufferProperties.glBuffer) {\n\t\t\t\t\tgl.deleteBuffer(bufferProperties.glBuffer);\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst type = getBufferType(gl, buffer.array);\n\t\t\tbufferProperties.glBuffer = webglBuffer;\n\t\t\tbufferProperties.type = type;\n\t\t\tbufferProperties.bytesPerElement = buffer.array.BYTES_PER_ELEMENT;\n\t\t\tbufferProperties.version = buffer.version;\n\t\t\tbufferProperties.__external = true;\n\t\t}\n\t\t_createGLBuffer(bufferProperties, buffer, bufferType) {\n\t\t\tconst gl = this._gl;\n\t\t\tconst array = buffer.array;\n\t\t\tconst usage = buffer.usage;\n\t\t\tconst glBuffer = gl.createBuffer();\n\t\t\tgl.bindBuffer(bufferType, glBuffer);\n\t\t\tgl.bufferData(bufferType, array, usage);\n\t\t\tbuffer.onUploadCallback();\n\t\t\tconst type = getBufferType(gl, array);\n\t\t\tbufferProperties.glBuffer = glBuffer;\n\t\t\tbufferProperties.type = type;\n\t\t\tbufferProperties.bytesPerElement = array.BYTES_PER_ELEMENT;\n\t\t\tbufferProperties.version = buffer.version;\n\t\t\tbufferProperties.__external = false;\n\t\t\tbuffer.updateRange.count = -1; // reset range\n\t\t}\n\t\t_updateGLBuffer(glBuffer, buffer, bufferType) {\n\t\t\tconst gl = this._gl;\n\t\t\tconst capabilities = this._capabilities;\n\t\t\tconst array = buffer.array;\n\t\t\tconst updateRange = buffer.updateRange;\n\t\t\tgl.bindBuffer(bufferType, glBuffer);\n\t\t\tif (updateRange.count === -1) {\n\t\t\t\t// Not using update ranges\n\t\t\t\tgl.bufferSubData(bufferType, 0, array);\n\t\t\t} else {\n\t\t\t\tif (capabilities.version >= 2) {\n\t\t\t\t\tgl.bufferSubData(bufferType, updateRange.offset * array.BYTES_PER_ELEMENT, array, updateRange.offset, updateRange.count);\n\t\t\t\t} else {\n\t\t\t\t\tgl.bufferSubData(bufferType, updateRange.offset * array.BYTES_PER_ELEMENT, array.subarray(updateRange.offset, updateRange.offset + updateRange.count));\n\t\t\t\t}\n\t\t\t\tupdateRange.count = -1; // reset range\n\t\t\t}\n\t\t}\n\t}\n\tfunction getBufferType(gl, array) {\n\t\tlet type;\n\t\tif (array instanceof Float32Array) {\n\t\t\ttype = gl.FLOAT;\n\t\t} else if (array instanceof Float64Array) {\n\t\t\tconsole.warn('Unsupported data buffer format: Float64Array.');\n\t\t} else if (array instanceof Uint16Array) {\n\t\t\ttype = gl.UNSIGNED_SHORT;\n\t\t} else if (array instanceof Int16Array) {\n\t\t\ttype = gl.SHORT;\n\t\t} else if (array instanceof Uint32Array) {\n\t\t\ttype = gl.UNSIGNED_INT;\n\t\t} else if (array instanceof Int32Array) {\n\t\t\ttype = gl.INT;\n\t\t} else if (array instanceof Int8Array) {\n\t\t\ttype = gl.BYTE;\n\t\t} else if (array instanceof Uint8Array) {\n\t\t\ttype = gl.UNSIGNED_BYTE;\n\t\t} else {\n\t\t\ttype = gl.FLOAT;\n\t\t}\n\t\treturn type;\n\t}\n\n\tclass WebGLMaterials extends PropertyMap {\n\t\tconstructor(prefix, programs, vertexArrayBindings) {\n\t\t\tsuper(prefix);\n\t\t\tconst that = this;\n\t\t\tfunction onMaterialDispose(event) {\n\t\t\t\tconst material = event.target;\n\t\t\t\tconst materialProperties = that.get(material);\n\t\t\t\tmaterial.removeEventListener('dispose', onMaterialDispose);\n\t\t\t\tconst programList = materialProperties.programList;\n\t\t\t\tif (programList !== undefined) {\n\t\t\t\t\tfor (let i = 0, l = programList.length; i < l; i++) {\n\t\t\t\t\t\tconst program = programList[i];\n\t\t\t\t\t\tvertexArrayBindings.releaseByProgram(program);\n\t\t\t\t\t\tprograms.releaseProgram(program);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tthat.delete(material);\n\t\t\t}\n\t\t\tthis._onMaterialDispose = onMaterialDispose;\n\t\t\tthis._programs = programs;\n\t\t\tthis._vertexArrayBindings = vertexArrayBindings;\n\t\t}\n\t\tsetMaterial(material) {\n\t\t\tconst materialProperties = this.get(material);\n\t\t\tif (materialProperties.programList === undefined) {\n\t\t\t\tmaterial.addEventListener('dispose', this._onMaterialDispose);\n\t\t\t\tmaterialProperties.programList = [];\n\t\t\t}\n\n\t\t\t// Set other material properties in renderer\n\n\t\t\treturn materialProperties;\n\t\t}\n\t\tupdateProgram(material, object, lightingState, renderStates, shaderCompileOptions) {\n\t\t\tconst programs = this._programs;\n\t\t\tconst vertexArrayBindings = this._vertexArrayBindings;\n\t\t\tconst materialProperties = this.get(material);\n\t\t\tconst props = programs.generateProps(material, object, lightingState, renderStates);\n\t\t\tconst programCode = programs.generateProgramCode(props, material);\n\t\t\tconst programList = materialProperties.programList;\n\t\t\tlet targetProgram = findProgram(programList, programCode);\n\t\t\tif (targetProgram === null) {\n\t\t\t\ttargetProgram = programs.getProgram(material, props, programCode, shaderCompileOptions);\n\t\t\t\tprogramList.unshift(targetProgram);\n\t\t\t\tif (programList.length > shaderCompileOptions.maxMaterialPrograms) {\n\t\t\t\t\t// release the last program\n\t\t\t\t\tconst lastProgram = programList.pop();\n\t\t\t\t\tvertexArrayBindings.releaseByProgram(lastProgram);\n\t\t\t\t\tprograms.releaseProgram(lastProgram);\n\t\t\t\t}\n\t\t\t}\n\t\t\tmaterialProperties.currentProgram = targetProgram;\n\t\t}\n\t}\n\tfunction findProgram(list, code) {\n\t\tlet index = 0,\n\t\t\ttarget = null;\n\t\tfor (let l = list.length; index < l; index++) {\n\t\t\tconst program = list[index];\n\t\t\tif (program.code === code) {\n\t\t\t\ttarget = program;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\t// move to the first\n\t\tif (target !== null && index > 0) {\n\t\t\tfor (let i = index; i > 0; i--) {\n\t\t\t\tlist[i] = list[i - 1];\n\t\t\t}\n\t\t\tlist[0] = target;\n\t\t}\n\t\treturn target;\n\t}\n\n\tconst emptyString = '';\n\tclass WebGLVertexArrayBindings extends PropertyMap {\n\t\tconstructor(prefix, gl, capabilities, buffers) {\n\t\t\tsuper(prefix);\n\t\t\tthis._gl = gl;\n\t\t\tthis._capabilities = capabilities;\n\t\t\tthis._buffers = buffers;\n\t\t\tthis._isWebGL2 = capabilities.version >= 2;\n\t\t\tthis._vaoExt = capabilities.getExtension('OES_vertex_array_object');\n\t\t\tthis._vaoCache = {}; // save vao cache here for releaseByProgram() method\n\t\t\tthis._currentGeometryProgram = '';\n\t\t\tthis._currentVAO = null;\n\t\t}\n\t\tsetup(object, geometry, program) {\n\t\t\tif (object.morphTargetInfluences) {\n\t\t\t\tthis.reset();\n\t\t\t\tthis._setupVertexAttributes(program, geometry);\n\t\t\t\tthis._currentGeometryProgram = emptyString;\n\t\t\t} else if (this._isWebGL2 || this._vaoExt) {\n\t\t\t\t// use VAO\n\t\t\t\tconst geometryProperties = this.get(geometry);\n\t\t\t\tif (geometryProperties._vaos === undefined) {\n\t\t\t\t\tgeometryProperties._vaos = {};\n\t\t\t\t\tthis._vaoCache[geometry.id] = geometryProperties._vaos;\n\t\t\t\t}\n\t\t\t\tlet vao = geometryProperties._vaos[program.id];\n\t\t\t\tif (!vao) {\n\t\t\t\t\tvao = geometryProperties._vaos[program.id] = {\n\t\t\t\t\t\tversion: -1,\n\t\t\t\t\t\tobject: this._createVAO()\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tthis._bindVAO(vao.object);\n\t\t\t\tif (vao.version !== geometry.version) {\n\t\t\t\t\tthis._setupVertexAttributes(program, geometry);\n\t\t\t\t\tvao.version = geometry.version;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tconst geometryProgram = program.id + '_' + geometry.id + '_' + geometry.version;\n\t\t\t\tif (geometryProgram !== this._currentGeometryProgram) {\n\t\t\t\t\tthis._setupVertexAttributes(program, geometry);\n\t\t\t\t\tthis._currentGeometryProgram = geometryProgram;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treleaseByGeometry(geometry) {\n\t\t\tconst geometryProperties = this.get(geometry);\n\t\t\tconst vaos = geometryProperties._vaos;\n\t\t\tif (vaos) {\n\t\t\t\tfor (const programId in vaos) {\n\t\t\t\t\tconst vao = vaos[programId];\n\t\t\t\t\tif (!vao) continue;\n\t\t\t\t\tthis._disposeVAO(vao.object);\n\t\t\t\t}\n\t\t\t\tdelete geometryProperties._vaos;\n\t\t\t\tdelete this._vaoCache[geometry.id];\n\t\t\t}\n\t\t}\n\t\treleaseByProgram(program) {\n\t\t\tfor (const geometryId in this._vaoCache) {\n\t\t\t\tconst vaos = this._vaoCache[geometryId];\n\t\t\t\tif (vaos) {\n\t\t\t\t\tconst vao = vaos[program.id];\n\t\t\t\t\tif (!vao) continue;\n\t\t\t\t\tthis._disposeVAO(vao.object);\n\t\t\t\t\tdelete vaos[program.id];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treset(force) {\n\t\t\tif (this._currentVAO !== null || force) {\n\t\t\t\tif (this._isWebGL2) {\n\t\t\t\t\tthis._gl.bindVertexArray(null);\n\t\t\t\t} else if (this._vaoExt) {\n\t\t\t\t\tthis._vaoExt.bindVertexArrayOES(null);\n\t\t\t\t}\n\t\t\t\tthis._currentVAO = null;\n\t\t\t}\n\t\t\tif (this._currentGeometryProgram !== emptyString) {\n\t\t\t\tthis._currentGeometryProgram = emptyString;\n\t\t\t}\n\t\t}\n\t\t_createVAO() {\n\t\t\tif (this._isWebGL2) {\n\t\t\t\treturn this._gl.createVertexArray();\n\t\t\t} else if (this._vaoExt) {\n\t\t\t\treturn this._vaoExt.createVertexArrayOES();\n\t\t\t}\n\t\t\treturn null;\n\t\t}\n\t\t_bindVAO(vao) {\n\t\t\tif (this._currentVAO !== vao) {\n\t\t\t\tif (this._isWebGL2) {\n\t\t\t\t\tthis._gl.bindVertexArray(vao);\n\t\t\t\t} else if (this._vaoExt) {\n\t\t\t\t\tthis._vaoExt.bindVertexArrayOES(vao);\n\t\t\t\t}\n\t\t\t\tthis._currentVAO = vao;\n\t\t\t}\n\t\t}\n\t\t_disposeVAO(vao) {\n\t\t\tif (this._isWebGL2) {\n\t\t\t\tthis._gl.deleteVertexArray(vao);\n\t\t\t} else if (this._vaoExt) {\n\t\t\t\tthis._vaoExt.deleteVertexArrayOES(vao);\n\t\t\t}\n\t\t}\n\t\t_setupVertexAttributes(program, geometry) {\n\t\t\tconst gl = this._gl;\n\t\t\tconst isWebGL2 = this._isWebGL2;\n\t\t\tconst attributes = program.getAttributes();\n\t\t\tconst capabilities = this._capabilities;\n\t\t\tconst buffers = this._buffers;\n\t\t\tfor (const key in attributes) {\n\t\t\t\tconst programAttribute = attributes[key];\n\t\t\t\tconst geometryAttribute = geometry.getAttribute(key);\n\t\t\t\tif (geometryAttribute) {\n\t\t\t\t\tconst size = geometryAttribute.size;\n\t\t\t\t\tif (programAttribute.count !== size) {\n\t\t\t\t\t\tconsole.warn('WebGLVertexArrayBindings: attribute ' + key + ' size not match! ' + programAttribute.count + ' : ' + size);\n\t\t\t\t\t}\n\t\t\t\t\tconst buffer = geometryAttribute.buffer;\n\t\t\t\t\tconst bufferProperties = buffers.get(buffer);\n\t\t\t\t\tconst type = bufferProperties.type;\n\t\t\t\t\tconst integer = isWebGL2 && (programAttribute.format === gl.INT || programAttribute.format === gl.UNSIGNED_INT);\n\t\t\t\t\tfor (let i = 0, l = programAttribute.locationSize; i < l; i++) {\n\t\t\t\t\t\tgl.enableVertexAttribArray(programAttribute.location + i);\n\t\t\t\t\t}\n\t\t\t\t\tif (geometryAttribute.divisor > 0) {\n\t\t\t\t\t\t// use instancing\n\t\t\t\t\t\tfor (let i = 0, l = programAttribute.locationSize; i < l; i++) {\n\t\t\t\t\t\t\tif (isWebGL2) {\n\t\t\t\t\t\t\t\tgl.vertexAttribDivisor(programAttribute.location + i, geometryAttribute.divisor);\n\t\t\t\t\t\t\t} else if (capabilities.getExtension('ANGLE_instanced_arrays')) {\n\t\t\t\t\t\t\t\tcapabilities.getExtension('ANGLE_instanced_arrays').vertexAttribDivisorANGLE(programAttribute.location + i, geometryAttribute.divisor);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tconsole.warn('vertexAttribDivisor not supported');\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tconst bytesPerElement = bufferProperties.bytesPerElement;\n\t\t\t\t\tconst glBuffer = bufferProperties.glBuffer;\n\t\t\t\t\tconst stride = buffer.stride;\n\t\t\t\t\tconst offset = geometryAttribute.offset;\n\t\t\t\t\tconst normalized = geometryAttribute.normalized;\n\t\t\t\t\tgl.bindBuffer(gl.ARRAY_BUFFER, glBuffer);\n\t\t\t\t\tif (programAttribute.count === stride && programAttribute.locationSize === 1) {\n\t\t\t\t\t\tthis._vertexAttribPointer(programAttribute.location, programAttribute.count, type, normalized, 0, 0, integer);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tfor (let i = 0; i < programAttribute.locationSize; i++) {\n\t\t\t\t\t\t\tthis._vertexAttribPointer(programAttribute.location + i, programAttribute.count / programAttribute.locationSize, type, normalized, bytesPerElement * stride, bytesPerElement * (offset + programAttribute.count / programAttribute.locationSize * i), integer);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// bind index if could\n\t\t\tif (geometry.index) {\n\t\t\t\tconst indexBufferProperties = buffers.get(geometry.index.buffer);\n\t\t\t\tgl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, indexBufferProperties.glBuffer);\n\t\t\t}\n\t\t}\n\t\t_vertexAttribPointer(index, size, type, normalized, stride, offset, integer) {\n\t\t\tconst gl = this._gl;\n\t\t\tif (integer) {\n\t\t\t\tgl.vertexAttribIPointer(index, size, type, stride, offset);\n\t\t\t} else {\n\t\t\t\tgl.vertexAttribPointer(index, size, type, normalized, stride, offset);\n\t\t\t}\n\t\t}\n\t}\n\n\tclass WebGLClusteredLighting {\n\t\tconstructor(options) {\n\t\t\tthis.lightsTexture = new LightsTexture();\n\t\t\tthis.lightsTexture.initLights(options.maxClusterLights, options.useFloatPrecision ? PIXEL_TYPE.FLOAT : PIXEL_TYPE.HALF_FLOAT);\n\t\t\tthis.cellsTexture = new CellsTexture();\n\t\t\tthis.cellsTexture.initCells(options.gridDimensions, options.maxLightsPerCell);\n\t\t\tthis._zClip = options.zClip.clone();\n\t\t\tthis._cellsTextureEmpty = false;\n\t\t\tthis.cellsTransform = {\n\t\t\t\tclips: [0, 0],\n\t\t\t\t// near, far\n\t\t\t\tfactors: [0, 0, 0, 0],\n\t\t\t\t// logFactor1, logFactor2, persp:tan(fov/2)|ortho:-height/2, aspect\n\t\t\t\tperspective: true\n\t\t\t};\n\t\t}\n\t\tdispose() {\n\t\t\tthis._cellsTextureEmpty = false;\n\t\t\tthis.cellsTexture.dispose();\n\t\t\tthis.lightsTexture.dispose();\n\t\t}\n\t\tsetOptions(options) {\n\t\t\tthis.lightsTexture.updateLights(options.maxClusterLights, options.useFloatPrecision ? PIXEL_TYPE.FLOAT : PIXEL_TYPE.HALF_FLOAT);\n\t\t\tthis.cellsTexture.updateCells(options.gridDimensions, options.maxLightsPerCell);\n\t\t\tthis._zClip.copy(options.zClip);\n\t\t}\n\t\tupdate(lightingGroup, cameraData, lightsNeedsUpdate = true) {\n\t\t\tthis._updateCellsTransform(cameraData);\n\t\t\tthis.cellsTexture.resetLightIndices();\n\t\t\tconst cellsTable = this.cellsTexture.cellsInfo.table;\n\t\t\tconst cellsTransform = this.cellsTransform;\n\t\t\tlet lightIndicesWritten = false;\n\t\t\tfor (let i = 0; i < lightingGroup.pointsNum; i++) {\n\t\t\t\tconst pointLight = lightingGroup.point[i];\n\t\t\t\tgetPointLightBoundingSphere(pointLight, _lightSphere);\n\t\t\t\t_lightSphere.center.applyMatrix4(cameraData.viewMatrix);\n\t\t\t\t_lightSphere.center.z *= -1;\n\t\t\t\tif (getCellsRange(_lightSphere, cellsTable, cellsTransform, _cellsRange)) {\n\t\t\t\t\tlightIndicesWritten = this.cellsTexture.setLightIndex(_cellsRange, i) || lightIndicesWritten;\n\t\t\t\t\tlightsNeedsUpdate && this.lightsTexture.setPointLight(i, pointLight);\n\t\t\t\t}\n\t\t\t}\n\t\t\tfor (let i = 0; i < lightingGroup.spotsNum; i++) {\n\t\t\t\tconst spotLight = lightingGroup.spot[i];\n\t\t\t\tgetSpotLightBoundingSphere(spotLight, _lightSphere);\n\t\t\t\t_lightSphere.center.applyMatrix4(cameraData.viewMatrix);\n\t\t\t\t_lightSphere.center.z *= -1;\n\t\t\t\tif (getCellsRange(_lightSphere, cellsTable, cellsTransform, _cellsRange)) {\n\t\t\t\t\tlightIndicesWritten = this.cellsTexture.setLightIndex(_cellsRange, i + lightingGroup.pointsNum) || lightIndicesWritten;\n\t\t\t\t\tlightsNeedsUpdate && this.lightsTexture.setSpotLight(i + lightingGroup.pointsNum, spotLight);\n\t\t\t\t}\n\t\t\t}\n\t\t\tlightIndicesWritten && lightsNeedsUpdate && this.lightsTexture.version++;\n\t\t\t(lightIndicesWritten || !this._cellsTextureEmpty) && this.cellsTexture.version++;\n\t\t\tthis._cellsTextureEmpty = !lightIndicesWritten;\n\t\t}\n\t\t_updateCellsTransform(cameraData) {\n\t\t\tconst {\n\t\t\t\tclips,\n\t\t\t\tfactors\n\t\t\t} = this.cellsTransform;\n\t\t\tthis._zClip.toArray(clips);\n\t\t\tclips[0] = clips[0] > 0 ? clips[0] : cameraData.near;\n\t\t\tclips[1] = clips[1] > 0 ? clips[1] : cameraData.far;\n\t\t\tconst cz = this.cellsTexture.cellsInfo.table[2];\n\t\t\tconst _logFarNear = Math.log(clips[1] / clips[0]);\n\t\t\tfactors[0] = cz / _logFarNear;\n\t\t\tfactors[1] = -cz * Math.log(clips[0]) / _logFarNear;\n\t\t\tconst perspective = _isPerspectiveMatrix(cameraData.projectionMatrix);\n\t\t\tconst elements = cameraData.projectionMatrix.elements;\n\t\t\tfactors[2] = (perspective ? 1 : -1) / elements[5]; // persp: tan(fov / 2), ortho: -height / 2\n\t\t\tfactors[3] = elements[5] / elements[0]; // aspect: (width / height)\n\n\t\t\tthis.cellsTransform.perspective = perspective;\n\t\t}\n\t}\n\tclass CellsTexture extends Texture2D {\n\t\tconstructor() {\n\t\t\tsuper();\n\t\t\tthis.format = PIXEL_FORMAT.RED;\n\t\t\tthis.type = PIXEL_TYPE.HALF_FLOAT;\n\t\t\tthis.magFilter = TEXTURE_FILTER.NEAREST;\n\t\t\tthis.minFilter = TEXTURE_FILTER.NEAREST;\n\t\t\tthis.generateMipmaps = false;\n\t\t\tthis.flipY = false;\n\t\t\tthis.unpackAlignment = 1;\n\t\t\tthis.cellsInfo = {\n\t\t\t\ttable: [],\n\t\t\t\tmaxLightsPerCell: 0,\n\t\t\t\ttextureSize: [],\n\t\t\t\tdotData: []\n\t\t\t};\n\t\t\tthis._counts = null;\n\t\t}\n\t\tinitCells(cellTable, maxLightsPerCell) {\n\t\t\tconst numCells = cellTable.x * cellTable.y * cellTable.z;\n\t\t\tconst numPixels = numCells * maxLightsPerCell;\n\n\t\t\t// TODO - better texture size calculation\n\t\t\tlet width = Math.ceil(Math.sqrt(numPixels));\n\t\t\twidth = Math.ceil(width / maxLightsPerCell) * maxLightsPerCell;\n\t\t\tconst height = Math.ceil(numPixels / width);\n\t\t\tconst data = new Uint16Array(width * height);\n\t\t\tthis.image = {\n\t\t\t\tdata,\n\t\t\t\twidth,\n\t\t\t\theight\n\t\t\t};\n\t\t\tcellTable.toArray(this.cellsInfo.table);\n\t\t\tthis.cellsInfo.maxLightsPerCell = maxLightsPerCell;\n\t\t\tthis.cellsInfo.textureSize[0] = width;\n\t\t\tthis.cellsInfo.textureSize[1] = 1 / width;\n\t\t\tthis.cellsInfo.textureSize[2] = 1 / height;\n\t\t\tthis.cellsInfo.dotData[0] = maxLightsPerCell;\n\t\t\tthis.cellsInfo.dotData[1] = cellTable.x * cellTable.z * maxLightsPerCell;\n\t\t\tthis.cellsInfo.dotData[2] = cellTable.x * maxLightsPerCell;\n\t\t\tthis._counts = new Int32Array(numCells);\n\t\t}\n\t\tupdateCells(cellTable, maxLightsPerCell) {\n\t\t\tconst cellsInfo = this.cellsInfo;\n\t\t\tif (_vec3_1.fromArray(cellsInfo.table).equals(cellTable) && cellsInfo.maxLightsPerCell === maxLightsPerCell) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthis.dispose();\n\t\t\tthis.initCells(cellTable, maxLightsPerCell);\n\t\t\tthis.version++;\n\t\t}\n\t\tresetLightIndices() {\n\t\t\tthis.image.data.fill(0);\n\t\t\tthis._counts.fill(0);\n\t\t}\n\t\tsetLightIndex(cellsRange, index) {\n\t\t\tconst data = this.image.data;\n\t\t\tconst counts = this._counts;\n\t\t\tconst {\n\t\t\t\ttable,\n\t\t\t\tmaxLightsPerCell\n\t\t\t} = this.cellsInfo;\n\t\t\tconst {\n\t\t\t\tmin,\n\t\t\t\tmax\n\t\t\t} = cellsRange;\n\t\t\tlet needsUpdate = false;\n\t\t\tfor (let x = min.x; x <= max.x; x++) {\n\t\t\t\tfor (let z = min.z; z <= max.z; z++) {\n\t\t\t\t\tfor (let y = min.y; y <= max.y; y++) {\n\t\t\t\t\t\tconst idx = x + table[0] * (z + y * table[2]);\n\t\t\t\t\t\tconst count = counts[idx];\n\t\t\t\t\t\tif (count < maxLightsPerCell) {\n\t\t\t\t\t\t\tconst offset = idx * maxLightsPerCell + count;\n\t\t\t\t\t\t\tdata[offset] = MathUtils.toHalfFloat(index + 1); // 0 is reserved for empty cell, so we offset by 1\n\t\t\t\t\t\t\tcounts[idx]++;\n\t\t\t\t\t\t\tneedsUpdate = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn needsUpdate;\n\t\t}\n\t}\n\tclass LightsTexture extends Texture2D {\n\t\tconstructor() {\n\t\t\tsuper();\n\t\t\tthis.format = PIXEL_FORMAT.RGBA;\n\t\t\tthis.magFilter = TEXTURE_FILTER.NEAREST;\n\t\t\tthis.minFilter = TEXTURE_FILTER.NEAREST;\n\t\t\tthis.generateMipmaps = false;\n\t\t\tthis.flipY = false;\n\t\t}\n\t\tinitLights(maxLights, type) {\n\t\t\tconst size = lightsTextureSize(maxLights);\n\t\t\tconst arrayType = type === PIXEL_TYPE.FLOAT ? Float32Array : Uint16Array;\n\t\t\tconst data = new arrayType(size * size * 4); // eslint-disable-line new-cap\n\n\t\t\tthis.image = {\n\t\t\t\tdata,\n\t\t\t\twidth: size,\n\t\t\t\theight: size\n\t\t\t};\n\t\t\tthis.type = type;\n\t\t}\n\t\tupdateLights(maxLights, type) {\n\t\t\tconst size = lightsTextureSize(maxLights);\n\t\t\tif (size === this.image.width && type === this.type) return;\n\t\t\tthis.dispose();\n\t\t\tthis.initLights(maxLights, type);\n\t\t\tthis.version++;\n\t\t}\n\t\tsetPointLight(index, lightInfo) {\n\t\t\tconst data = this.image.data;\n\t\t\tconst halfFloat = this.type === PIXEL_TYPE.HALF_FLOAT;\n\t\t\tconst start = index * LIGHT_STRIDE * 4;\n\t\t\tconst {\n\t\t\t\tcolor,\n\t\t\t\tdecay,\n\t\t\t\tposition,\n\t\t\t\tdistance\n\t\t\t} = lightInfo;\n\n\t\t\t// pixel 0 - R: lightType, G: -, B: -, A: -\n\n\t\t\tdata[start + 0 * 4 + 0] = halfFloat ? MathUtils.toHalfFloat(1) : 1;\n\n\t\t\t// pixel 1 - R: color.r, G: color.g, B: color.b, A: decay\n\n\t\t\tdata[start + 1 * 4 + 0] = halfFloat ? MathUtils.toHalfFloat(color[0]) : color[0];\n\t\t\tdata[start + 1 * 4 + 1] = halfFloat ? MathUtils.toHalfFloat(color[1]) : color[1];\n\t\t\tdata[start + 1 * 4 + 2] = halfFloat ? MathUtils.toHalfFloat(color[2]) : color[2];\n\t\t\tdata[start + 1 * 4 + 3] = halfFloat ? MathUtils.toHalfFloat(decay) : decay;\n\n\t\t\t// pixel 2 - R: position.x, G: position.y, B: position.z, A: distance\n\n\t\t\tdata[start + 2 * 4 + 0] = halfFloat ? MathUtils.toHalfFloat(position[0]) : position[0];\n\t\t\tdata[start + 2 * 4 + 1] = halfFloat ? MathUtils.toHalfFloat(position[1]) : position[1];\n\t\t\tdata[start + 2 * 4 + 2] = halfFloat ? MathUtils.toHalfFloat(position[2]) : position[2];\n\t\t\tdata[start + 2 * 4 + 3] = halfFloat ? MathUtils.toHalfFloat(distance) : distance;\n\n\t\t\t// pixel 3 - R: -, G: -, B: -, A: -\n\t\t}\n\t\tsetSpotLight(index, lightInfo) {\n\t\t\tconst data = this.image.data;\n\t\t\tconst halfFloat = this.type === PIXEL_TYPE.HALF_FLOAT;\n\t\t\tconst start = index * LIGHT_STRIDE * 4;\n\t\t\tconst {\n\t\t\t\tcolor,\n\t\t\t\tdecay,\n\t\t\t\tposition,\n\t\t\t\tdistance,\n\t\t\t\tdirection,\n\t\t\t\tconeCos,\n\t\t\t\tpenumbraCos\n\t\t\t} = lightInfo;\n\n\t\t\t// pixel 0 - R: lightType, G: penumbraCos, B: -, A: -\n\n\t\t\tdata[start + 0 * 4 + 0] = halfFloat ? MathUtils.toHalfFloat(2) : 2;\n\t\t\tdata[start + 0 * 4 + 1] = halfFloat ? MathUtils.toHalfFloat(penumbraCos) : penumbraCos;\n\n\t\t\t// pixel 1 - R: color.r, G: color.g, B: color.b, A: decay\n\n\t\t\tdata[start + 1 * 4 + 0] = halfFloat ? MathUtils.toHalfFloat(color[0]) : color[0];\n\t\t\tdata[start + 1 * 4 + 1] = halfFloat ? MathUtils.toHalfFloat(color[1]) : color[1];\n\t\t\tdata[start + 1 * 4 + 2] = halfFloat ? MathUtils.toHalfFloat(color[2]) : color[2];\n\t\t\tdata[start + 1 * 4 + 3] = halfFloat ? MathUtils.toHalfFloat(decay) : decay;\n\n\t\t\t// pixel 2 - R: position.x, G: position.y, B: position.z, A: distance\n\n\t\t\tdata[start + 2 * 4 + 0] = halfFloat ? MathUtils.toHalfFloat(position[0]) : position[0];\n\t\t\tdata[start + 2 * 4 + 1] = halfFloat ? MathUtils.toHalfFloat(position[1]) : position[1];\n\t\t\tdata[start + 2 * 4 + 2] = halfFloat ? MathUtils.toHalfFloat(position[2]) : position[2];\n\t\t\tdata[start + 2 * 4 + 3] = halfFloat ? MathUtils.toHalfFloat(distance) : distance;\n\n\t\t\t// pixel 3 - R: direction.x, G: direction.y, B: direction.z, A: coneCos\n\n\t\t\tdata[start + 3 * 4 + 0] = halfFloat ? MathUtils.toHalfFloat(direction[0]) : direction[0];\n\t\t\tdata[start + 3 * 4 + 1] = halfFloat ? MathUtils.toHalfFloat(direction[1]) : direction[1];\n\t\t\tdata[start + 3 * 4 + 2] = halfFloat ? MathUtils.toHalfFloat(direction[2]) : direction[2];\n\t\t\tdata[start + 3 * 4 + 3] = halfFloat ? MathUtils.toHalfFloat(coneCos) : coneCos;\n\t\t}\n\t}\n\tconst LIGHT_STRIDE = 4;\n\tconst _lightSphere = new Sphere();\n\tconst _cellsRange = new Box3();\n\tconst _vec3_1 = new Vector3();\n\tfunction getPointLightBoundingSphere(light, sphere) {\n\t\tsphere.center.fromArray(light.position);\n\t\tsphere.radius = light.distance;\n\t}\n\tfunction getSpotLightBoundingSphere(light, sphere) {\n\t\tif (light.coneCos < 0.70710678118) {\n\t\t\t// obtuse angle\n\t\t\t_vec3_1.fromArray(light.direction).multiplyScalar(light.distance * light.coneCos);\n\t\t\tsphere.center.fromArray(light.position).add(_vec3_1);\n\t\t\tsphere.radius = light.distance * Math.sqrt(1 - light.coneCos * light.coneCos);\n\t\t} else {\n\t\t\t_vec3_1.fromArray(light.direction).multiplyScalar(light.distance / (light.coneCos * 2));\n\t\t\tsphere.center.fromArray(light.position).add(_vec3_1);\n\t\t\tsphere.radius = light.distance / (light.coneCos * 2);\n\t\t}\n\t}\n\tfunction lightsTextureSize(maxLights) {\n\t\treturn Math.max(MathUtils.nextPowerOfTwo(Math.ceil(Math.sqrt(maxLights * LIGHT_STRIDE))), LIGHT_STRIDE);\n\t}\n\tfunction _isPerspectiveMatrix(m) {\n\t\treturn m.elements[11] === -1;\n\t}\n\tfunction getCellsRange(lightSphere, cellsTable, cellsTransform, cellsRange) {\n\t\tconst {\n\t\t\tcenter,\n\t\t\tradius\n\t\t} = lightSphere;\n\t\tconst {\n\t\t\tclips,\n\t\t\tfactors,\n\t\t\tperspective\n\t\t} = cellsTransform;\n\t\tlet zMin = center.z - radius;\n\t\tconst zMax = center.z + radius;\n\t\tif (zMin > clips[1] || zMax < clips[0]) {\n\t\t\treturn false;\n\t\t}\n\t\tzMin = Math.max(zMin, clips[0]);\n\t\tconst zStart = Math.floor(Math.log(zMin) * factors[0] + factors[1]);\n\t\tconst zEnd = Math.min(Math.floor(Math.log(zMax) * factors[0] + factors[1]), cellsTable[2] - 1);\n\t\tconst halfFrustumHeight = (perspective ? Math.abs(center.z) : -1) * factors[2];\n\t\tconst invH = 1 / (2 * halfFrustumHeight);\n\t\tconst yMin = (center.y - radius) * invH + 0.5;\n\t\tconst yMax = (center.y + radius) * invH + 0.5;\n\t\tif (yMin > 1 || yMax < 0) {\n\t\t\treturn false;\n\t\t}\n\t\tconst yStart = Math.max(Math.floor(yMin * cellsTable[1]), 0);\n\t\tconst yEnd = Math.min(Math.floor(yMax * cellsTable[1]), cellsTable[1] - 1);\n\t\tconst halfFrustumWidth = halfFrustumHeight * factors[3];\n\t\tconst invW = 1 / (2 * halfFrustumWidth);\n\t\tconst xMin = (center.x - radius) * invW + 0.5;\n\t\tconst xMax = (center.x + radius) * invW + 0.5;\n\t\tif (xMin > 1 || xMax < 0) {\n\t\t\treturn false;\n\t\t}\n\t\tconst xStart = Math.max(Math.floor(xMin * cellsTable[0]), 0);\n\t\tconst xEnd = Math.min(Math.floor(xMax * cellsTable[0]), cellsTable[0] - 1);\n\t\tcellsRange.min.set(xStart, yStart, zStart);\n\t\tcellsRange.max.set(xEnd, yEnd, zEnd);\n\t\treturn true;\n\t}\n\n\tclass WebGLLights extends PropertyMap {\n\t\tconstructor(prefix, capabilities, textures) {\n\t\t\tsuper(prefix);\n\t\t\tconst that = this;\n\t\t\tfunction onLightingGroupDispose(event) {\n\t\t\t\tconst lightingGroup = event.target;\n\t\t\t\tconst lightingProperties = that.get(lightingGroup);\n\t\t\t\tlightingGroup.removeEventListener('dispose', onLightingGroupDispose);\n\t\t\t\tif (lightingProperties.clustered) {\n\t\t\t\t\tlightingProperties.clustered.dispose();\n\t\t\t\t}\n\t\t\t\tthat.delete(lightingGroup);\n\t\t\t}\n\t\t\tthis._onLightingGroupDispose = onLightingGroupDispose;\n\t\t\tthis._capabilities = capabilities;\n\t\t\tthis._textures = textures;\n\t\t}\n\t\tsetLightingGroup(lightingGroup, passInfo, options, cameraData) {\n\t\t\tconst lightingProperties = this.get(lightingGroup);\n\n\t\t\t// Skip early if this lighting group has been set in this pass.\n\t\t\tif (lightingProperties.pass === passInfo.count) {\n\t\t\t\treturn lightingProperties;\n\t\t\t}\n\t\t\tlightingProperties.pass = passInfo.count;\n\t\t\tif (lightingProperties.state === undefined) {\n\t\t\t\tlightingGroup.addEventListener('dispose', this._onLightingGroupDispose);\n\t\t\t\tlightingProperties.state = new LightingState();\n\t\t\t\tlightingProperties.uploadVersion = 0;\n\t\t\t}\n\n\t\t\t// Skip early if this lighting group is empty\n\t\t\tif (lightingGroup.totalNum === 0) {\n\t\t\t\treturn lightingProperties;\n\t\t\t}\n\t\t\tconst clusteredOptions = options.clustered;\n\t\t\tconst clusteredEnabled = clusteredOptions.enabled;\n\t\t\tlet clusteredLightsChanged = false;\n\t\t\tif (lightingProperties.lightingVersion !== lightingGroup.version || lightingProperties.clusteredEnabled !== clusteredEnabled) {\n\t\t\t\tlightingProperties.state.update(lightingGroup, clusteredEnabled);\n\t\t\t\tlightingProperties.uploadVersion++;\n\t\t\t\tconst hasClusteredLights = lightingProperties.state._factor[10] > 0;\n\t\t\t\tlightingProperties.lightingVersion = lightingGroup.version;\n\t\t\t\tlightingProperties.clusteredEnabled = clusteredEnabled;\n\t\t\t\tlightingProperties.hasClusteredLights = hasClusteredLights;\n\t\t\t\tclusteredLightsChanged = hasClusteredLights;\n\n\t\t\t\t// prepare clustered lighting\n\n\t\t\t\tif (hasClusteredLights && !lightingProperties.clustered) {\n\t\t\t\t\tlightingProperties.clustered = new WebGLClusteredLighting(clusteredOptions);\n\t\t\t\t\tlightingProperties.clusteredOptionVersion = clusteredOptions.version;\n\t\t\t\t} else if (!clusteredEnabled && lightingProperties.clustered) {\n\t\t\t\t\tlightingProperties.clustered.dispose();\n\t\t\t\t\tdelete lightingProperties.clustered;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (lightingProperties.hasClusteredLights) {\n\t\t\t\tif (lightingProperties.clusteredOptionVersion !== clusteredOptions.version) {\n\t\t\t\t\tlightingProperties.clustered.setOptions(clusteredOptions);\n\t\t\t\t\tlightingProperties.clusteredOptionVersion = clusteredOptions.version;\n\t\t\t\t\tclusteredLightsChanged = true;\n\t\t\t\t}\n\t\t\t\tlet cameraChanged = false;\n\t\t\t\tif (lightingProperties.cameraId !== cameraData.id || lightingProperties.cameraVersion !== cameraData.version) {\n\t\t\t\t\tlightingProperties.cameraId = cameraData.id;\n\t\t\t\t\tlightingProperties.cameraVersion = cameraData.version;\n\t\t\t\t\tcameraChanged = true;\n\t\t\t\t}\n\t\t\t\tif (clusteredLightsChanged || cameraChanged) {\n\t\t\t\t\tlightingProperties.clustered.update(lightingGroup, cameraData, clusteredLightsChanged);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn lightingProperties;\n\t\t}\n\t\tuploadUniforms(program, lightingGroup, disableShadowSampler) {\n\t\t\tconst lightingGroupProperties = this.get(lightingGroup);\n\t\t\tlet refresh = false;\n\t\t\tif (program.lightId !== lightingGroup.id || program.lightVersion !== lightingGroupProperties.uploadVersion) {\n\t\t\t\trefresh = true;\n\t\t\t\tprogram.lightId = lightingGroup.id;\n\t\t\t\tprogram.lightVersion = lightingGroupProperties.uploadVersion;\n\t\t\t}\n\t\t\tconst uniforms = program.getUniforms();\n\t\t\tconst capabilities = this._capabilities;\n\t\t\tconst textures = this._textures;\n\t\t\tconst lightingFactor = lightingGroupProperties.state._factor;\n\t\t\tif (lightingFactor[0] && refresh) {\n\t\t\t\tuniforms.set('u_AmbientLightColor', lightingGroup.ambient);\n\t\t\t}\n\t\t\tif (lightingFactor[1] && refresh) {\n\t\t\t\tuniforms.set('u_SphericalHarmonicsLightData', lightingGroup.sh);\n\t\t\t}\n\t\t\tif (lightingFactor[2] > 0 && refresh) {\n\t\t\t\tuniforms.set('u_Hemi', lightingGroup.hemisphere);\n\t\t\t}\n\t\t\tif (lightingFactor[3] > 0) {\n\t\t\t\tif (refresh) uniforms.set('u_Directional', lightingGroup.directional);\n\t\t\t\tif (lightingFactor[7] > 0) {\n\t\t\t\t\tif (refresh) uniforms.set('u_DirectionalShadow', lightingGroup.directionalShadow);\n\t\t\t\t\tif (uniforms.has('directionalShadowMap')) {\n\t\t\t\t\t\tif (capabilities.version >= 2 && !disableShadowSampler) {\n\t\t\t\t\t\t\tuniforms.set('directionalShadowMap', lightingGroup.directionalShadowDepthMap, textures);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tuniforms.set('directionalShadowMap', lightingGroup.directionalShadowMap, textures);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tuniforms.set('directionalShadowMatrix', lightingGroup.directionalShadowMatrix);\n\t\t\t\t\t}\n\t\t\t\t\tif (uniforms.has('directionalDepthMap')) {\n\t\t\t\t\t\tuniforms.set('directionalDepthMap', lightingGroup.directionalShadowMap, textures);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (lightingFactor[4] > 0) {\n\t\t\t\tif (refresh) uniforms.set('u_Point', lightingGroup.point);\n\t\t\t\tif (lightingFactor[8] > 0) {\n\t\t\t\t\tif (refresh) uniforms.set('u_PointShadow', lightingGroup.pointShadow);\n\t\t\t\t\tif (uniforms.has('pointShadowMap')) {\n\t\t\t\t\t\tuniforms.set('pointShadowMap', lightingGroup.pointShadowMap, textures);\n\t\t\t\t\t\tuniforms.set('pointShadowMatrix', lightingGroup.pointShadowMatrix);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (lightingFactor[5] > 0) {\n\t\t\t\tif (refresh) uniforms.set('u_Spot', lightingGroup.spot);\n\t\t\t\tif (lightingFactor[9] > 0) {\n\t\t\t\t\tif (refresh) uniforms.set('u_SpotShadow', lightingGroup.spotShadow);\n\t\t\t\t\tif (uniforms.has('spotShadowMap')) {\n\t\t\t\t\t\tif (capabilities.version >= 2 && !disableShadowSampler) {\n\t\t\t\t\t\t\tuniforms.set('spotShadowMap', lightingGroup.spotShadowDepthMap, textures);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tuniforms.set('spotShadowMap', lightingGroup.spotShadowMap, textures);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tuniforms.set('spotShadowMatrix', lightingGroup.spotShadowMatrix);\n\t\t\t\t\t}\n\t\t\t\t\tif (uniforms.has('spotDepthMap')) {\n\t\t\t\t\t\tuniforms.set('spotDepthMap', lightingGroup.spotShadowMap, textures);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (lightingFactor[6] > 0) {\n\t\t\t\tif (refresh) uniforms.set('u_RectArea', lightingGroup.rectArea);\n\t\t\t\tif (lightingGroup.LTC1 && lightingGroup.LTC2) {\n\t\t\t\t\tuniforms.set('ltc_1', lightingGroup.LTC1, textures);\n\t\t\t\t\tuniforms.set('ltc_2', lightingGroup.LTC2, textures);\n\t\t\t\t} else {\n\t\t\t\t\tconsole.warn('WebGLRenderer: RectAreaLight.LTC1 and LTC2 need to be set before use.');\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (lightingFactor[10] > 0) {\n\t\t\t\tconst clusteredLighting = lightingGroupProperties.clustered;\n\t\t\t\tconst cellsInfo = clusteredLighting.cellsTexture.cellsInfo;\n\t\t\t\tuniforms.set('maxLightsPerCell', cellsInfo.maxLightsPerCell);\n\t\t\t\tuniforms.set('cells', cellsInfo.table);\n\t\t\t\tuniforms.set('cellsDotData', cellsInfo.dotData);\n\t\t\t\tuniforms.set('cellsTextureSize', cellsInfo.textureSize);\n\t\t\t\tuniforms.set('cellsTransformFactors', clusteredLighting.cellsTransform.factors);\n\t\t\t\tuniforms.set('lightsTexture', clusteredLighting.lightsTexture, textures);\n\t\t\t\tuniforms.set('cellsTexture', clusteredLighting.cellsTexture, textures);\n\t\t\t}\n\t\t}\n\t}\n\tclass LightingState {\n\t\tconstructor() {\n\t\t\tthis._factor = new Uint16Array(11);\n\t\t\tthis._totalNum = 0;\n\t\t\tthis._shadowsNum = 0;\n\t\t}\n\t\tupdate(lightingGroup, clusteredEnabled) {\n\t\t\tconst selfFactor = this._factor;\n\t\t\tselfFactor[0] = lightingGroup.useAmbient ? 1 : 0;\n\t\t\tselfFactor[1] = lightingGroup.useSphericalHarmonics ? 1 : 0;\n\t\t\tselfFactor[2] = lightingGroup.hemisNum;\n\t\t\tselfFactor[3] = lightingGroup.directsNum;\n\t\t\tselfFactor[4] = lightingGroup.pointsNum;\n\t\t\tselfFactor[5] = lightingGroup.spotsNum;\n\t\t\tselfFactor[6] = lightingGroup.rectAreaNum;\n\t\t\tselfFactor[7] = lightingGroup.directShadowNum;\n\t\t\tselfFactor[8] = lightingGroup.pointShadowNum;\n\t\t\tselfFactor[9] = lightingGroup.spotShadowNum;\n\t\t\tselfFactor[10] = 0;\n\t\t\tthis._totalNum = lightingGroup.totalNum;\n\t\t\tthis._shadowsNum = lightingGroup.shadowsNum;\n\t\t\tif (clusteredEnabled) {\n\t\t\t\tconst clusteredPointsNum = selfFactor[4] - selfFactor[8];\n\t\t\t\tconst clusteredSpotsNum = selfFactor[5] - selfFactor[9];\n\t\t\t\tselfFactor[4] = selfFactor[8];\n\t\t\t\tselfFactor[5] = selfFactor[9];\n\t\t\t\tselfFactor[10] = clusteredPointsNum + clusteredSpotsNum > 0 ? 1 : 0;\n\t\t\t}\n\t\t}\n\t\tcompare(factor) {\n\t\t\tif (!factor) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tconst selfFactor = this._factor;\n\t\t\tfor (let i = 0, l = factor.length; i < l; i++) {\n\t\t\t\tif (selfFactor[i] !== factor[i]) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t}\n\t\tcopyTo(factor) {\n\t\t\tconst selfFactor = this._factor;\n\t\t\tif (!factor) {\n\t\t\t\tfactor = new selfFactor.constructor(this._factor.length);\n\t\t\t}\n\t\t\tfactor.set(selfFactor);\n\t\t\treturn factor;\n\t\t}\n\t\thasLight() {\n\t\t\treturn this._totalNum > 0;\n\t\t}\n\t\thasShadow() {\n\t\t\treturn this._shadowsNum > 0;\n\t\t}\n\t\tsetProgramProps(props, receiveShadow) {\n\t\t\tconst selfFactor = this._factor;\n\t\t\tprops.useAmbientLight = selfFactor[0];\n\t\t\tprops.useSphericalHarmonicsLight = selfFactor[1];\n\t\t\tprops.hemisphereLightNum = selfFactor[2];\n\t\t\tprops.directLightNum = selfFactor[3];\n\t\t\tprops.pointLightNum = selfFactor[4];\n\t\t\tprops.spotLightNum = selfFactor[5];\n\t\t\tprops.rectAreaLightNum = selfFactor[6];\n\t\t\tprops.directShadowNum = receiveShadow ? selfFactor[7] : 0;\n\t\t\tprops.pointShadowNum = receiveShadow ? selfFactor[8] : 0;\n\t\t\tprops.spotShadowNum = receiveShadow ? selfFactor[9] : 0;\n\t\t\tprops.useClusteredLights = selfFactor[10];\n\t\t\tprops.useShadow = this._shadowsNum > 0 && receiveShadow;\n\t\t}\n\t}\n\n\tconst helpVector4 = new Vector4();\n\tconst helpMatrix3 = new Matrix3();\n\tconst helpMatrix4 = new Matrix4();\n\tconst influencesList = new WeakMap();\n\tconst morphInfluences = new Float32Array(8);\n\tconst _envData = {\n\t\tmap: null,\n\t\tdiffuse: 1,\n\t\tspecular: 1\n\t};\n\tlet _clippingPlanesData = new Float32Array([]);\n\tfunction defaultGetGeometry(renderable) {\n\t\treturn renderable.geometry;\n\t}\n\tfunction defaultGetMaterial(renderable) {\n\t\treturn renderable.material;\n\t}\n\tfunction defaultIfRender(renderable) {\n\t\treturn true;\n\t}\n\tconst _emptyLightingGroup = new LightingGroup();\n\tfunction getLightingGroup(lighting, material) {\n\t\tif (!material.acceptLight) {\n\t\t\treturn _emptyLightingGroup;\n\t\t}\n\t\tconst lightingGroup = lighting.getGroup(material.lightingGroup);\n\t\tif (lightingGroup && lightingGroup.totalNum > 0) {\n\t\t\treturn lightingGroup;\n\t\t}\n\t\treturn _emptyLightingGroup;\n\t}\n\tfunction clientWaitAsync(gl) {\n\t\tconst sync = gl.fenceSync(gl.SYNC_GPU_COMMANDS_COMPLETE, 0);\n\t\tgl.flush();\n\t\treturn new Promise(function (resolve, reject) {\n\t\t\tfunction test() {\n\t\t\t\tconst res = gl.clientWaitSync(sync, gl.SYNC_FLUSH_COMMANDS_BIT, 0);\n\t\t\t\tif (res === gl.WAIT_FAILED) {\n\t\t\t\t\tgl.deleteSync(sync);\n\t\t\t\t\treject();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (res === gl.TIMEOUT_EXPIRED) {\n\t\t\t\t\trequestAnimationFrame(test);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tgl.deleteSync(sync);\n\t\t\t\tresolve();\n\t\t\t}\n\t\t\ttest();\n\t\t});\n\t}\n\n\t/**\n\t * The WebGL renderer.\n\t * @extends ThinRenderer\n\t */\n\tclass WebGLRenderer extends ThinRenderer {\n\t\t/**\n\t\t * Create a WebGLRenderer.\n\t\t * @param {WebGLRenderingContext} [context] - The WebGL Rendering Context privided by canvas.\n\t\t * If not provided, you must call {@link WebGLRenderer.init} method with a valid context\n\t\t * before using this renderer.\n\t\t */\n\t\tconstructor(context) {\n\t\t\tsuper();\n\n\t\t\t/**\n\t\t\t * An object containing details about the capabilities of the current RenderingContext.\n\t\t\t * @type {WebGLCapabilities}\n\t\t\t */\n\t\t\tthis.capabilities = {};\n\t\t\tthis._textures = null;\n\t\t\tthis._renderBuffers = null;\n\t\t\tthis._renderTargets = null;\n\t\t\tthis._buffers = null;\n\t\t\tthis._geometries = null;\n\t\t\tthis._lights = null;\n\t\t\tthis._programs = null;\n\t\t\tthis._materials = null;\n\t\t\tthis._state = null;\n\t\t\tthis._vertexArrayBindings = null;\n\t\t\tif (context) {\n\t\t\t\tthis.init(context);\n\t\t\t}\n\n\t\t\t// Cache current material if beginRender is called.\n\t\t\tthis._currentMaterial = null;\n\t\t\tthis._currentOcclusionQuerySet = null;\n\t\t\tthis._currentTimestampWrites = {\n\t\t\t\tquerySet: null,\n\t\t\t\tbeginningOfPassWriteIndex: -1,\n\t\t\t\tendOfPassWriteIndex: -1\n\t\t\t};\n\t\t}\n\t\tinit(context, options = {}) {\n\t\t\tif (!context) {\n\t\t\t\tcontext = this.context;\n\t\t\t}\n\t\t\tif (!context) {\n\t\t\t\tthrow new Error('WebGLRenderer.init: context must be provided.');\n\t\t\t}\n\t\t\tthis.context = context;\n\t\t\tconst prefix = `_gl${this.increaseId()}`;\n\t\t\tconst capabilities = new WebGLCapabilities(context);\n\t\t\tconst constants = new WebGLConstants(context, capabilities);\n\t\t\tconst state = new WebGLState(context, capabilities);\n\t\t\tconst textures = new WebGLTextures(prefix, context, state, capabilities, constants);\n\t\t\tconst renderBuffers = new WebGLRenderBuffers(prefix, context, capabilities, constants);\n\t\t\tconst renderTargets = new WebGLRenderTargets(prefix, context, state, capabilities, textures, renderBuffers, constants);\n\t\t\tconst buffers = new WebGLBuffers(prefix, context, capabilities);\n\t\t\tconst vertexArrayBindings = new WebGLVertexArrayBindings(prefix, context, capabilities, buffers);\n\t\t\tconst geometries = new WebGLGeometries(prefix, context, buffers, vertexArrayBindings);\n\t\t\tconst lights = new WebGLLights(prefix, capabilities, textures);\n\t\t\tconst programs = new WebGLPrograms(context, state, capabilities);\n\t\t\tconst materials = new WebGLMaterials(prefix, programs, vertexArrayBindings);\n\t\t\tconst querySets = new WebGLQuerySets(prefix, context, capabilities);\n\t\t\tthis.capabilities = capabilities;\n\t\t\tthis._constants = constants;\n\t\t\tthis._textures = textures;\n\t\t\tthis._renderBuffers = renderBuffers;\n\t\t\tthis._renderTargets = renderTargets;\n\t\t\tthis._buffers = buffers;\n\t\t\tthis._geometries = geometries;\n\t\t\tthis._lights = lights;\n\t\t\tthis._programs = programs;\n\t\t\tthis._materials = materials;\n\t\t\tthis._state = state;\n\t\t\tthis._vertexArrayBindings = vertexArrayBindings;\n\t\t\tthis._querySets = querySets;\n\t\t\treturn Promise.resolve(this);\n\t\t}\n\t\tbeginRender(renderTarget) {\n\t\t\tsuper.beginRender(renderTarget);\n\t\t\tif (renderTarget) {\n\t\t\t\tthis._renderTargets.setRenderTarget(renderTarget);\n\t\t\t\tconst gl = this.context;\n\t\t\t\tconst state = this._state;\n\t\t\t\tlet clearBits = 0;\n\t\t\t\tif (renderTarget.clearColor) {\n\t\t\t\t\tstate.colorBuffer.setClear(renderTarget.colorClearValue.r, renderTarget.colorClearValue.g, renderTarget.colorClearValue.b, renderTarget.colorClearValue.a);\n\t\t\t\t\tclearBits |= gl.COLOR_BUFFER_BIT;\n\t\t\t\t}\n\t\t\t\tif (renderTarget.clearDepth) {\n\t\t\t\t\tstate.depthBuffer.setClear(renderTarget.depthClearValue);\n\t\t\t\t\tclearBits |= gl.DEPTH_BUFFER_BIT;\n\t\t\t\t}\n\t\t\t\tif (renderTarget.clearStencil) {\n\t\t\t\t\tstate.stencilBuffer.setClear(renderTarget.stencilClearValue);\n\t\t\t\t\tclearBits |= gl.STENCIL_BUFFER_BIT;\n\t\t\t\t}\n\t\t\t\tif (clearBits > 0) {\n\t\t\t\t\t// Prevent warning when bits is equal to zero\n\t\t\t\t\tgl.clear(clearBits);\n\t\t\t\t}\n\t\t\t\tthis._currentOcclusionQuerySet = renderTarget.occlusionQuerySet;\n\t\t\t\tthis._currentTimestampWrites.querySet = renderTarget.timestampWrites.querySet;\n\t\t\t\tthis._currentTimestampWrites.beginningOfPassWriteIndex = renderTarget.timestampWrites.beginningOfPassWriteIndex;\n\t\t\t\tthis._currentTimestampWrites.endOfPassWriteIndex = renderTarget.timestampWrites.endOfPassWriteIndex;\n\t\t\t}\n\t\t\tif (this._currentOcclusionQuerySet) {\n\t\t\t\tthis._querySets.setQuerySet(this._currentOcclusionQuerySet);\n\t\t\t}\n\t\t\tif (this._currentTimestampWrites.querySet) {\n\t\t\t\tthis._querySets.setQuerySet(this._currentTimestampWrites.querySet);\n\t\t\t\tif (this.capabilities.canUseTimestamp) {\n\t\t\t\t\tthis._querySets.queryCounter(this._currentTimestampWrites.querySet, this._currentTimestampWrites.beginningOfPassWriteIndex);\n\t\t\t\t} else {\n\t\t\t\t\t// fallback to use TIME_ELAPSED_EXT\n\t\t\t\t\tthis._querySets.beginQuery(this._currentTimestampWrites.querySet, this._currentTimestampWrites.endOfPassWriteIndex);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tendRender() {\n\t\t\tif (this._currentTimestampWrites.querySet) {\n\t\t\t\tif (this.capabilities.canUseTimestamp) {\n\t\t\t\t\tthis._querySets.queryCounter(this._currentTimestampWrites.querySet, this._currentTimestampWrites.endOfPassWriteIndex);\n\t\t\t\t} else {\n\t\t\t\t\t// fallback to use TIME_ELAPSED_EXT\n\t\t\t\t\tthis._querySets.endQuery(this._currentTimestampWrites.querySet);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Ensure depth buffer writing is enabled so it can be cleared on next render\n\t\t\tconst state = this._state;\n\t\t\tstate.depthBuffer.setTest(true);\n\t\t\tstate.depthBuffer.setMask(true);\n\t\t\tstate.colorBuffer.setMask(true);\n\t\t\tthis._currentMaterial = null;\n\n\t\t\t// Automatically clear the occlusion query set and timestamp writes\n\t\t\tthis._currentOcclusionQuerySet = null;\n\t\t\tthis._currentTimestampWrites.querySet = null;\n\t\t\tsuper.endRender();\n\t\t}\n\t\trenderRenderableItem(renderable, renderStates, options) {\n\t\t\tconst state = this._state;\n\t\t\tconst capabilities = this.capabilities;\n\t\t\tconst vertexArrayBindings = this._vertexArrayBindings;\n\t\t\tconst textures = this._textures;\n\t\t\tconst passInfo = this._passInfo;\n\t\t\tconst getGeometry = options.getGeometry || defaultGetGeometry;\n\t\t\tconst getMaterial = options.getMaterial || defaultGetMaterial;\n\t\t\tconst beforeRender = options.beforeRender;\n\t\t\tconst afterRender = options.afterRender;\n\t\t\tconst ifRender = options.ifRender || defaultIfRender;\n\t\t\tconst renderInfo = options.renderInfo;\n\t\t\tconst sceneData = renderStates.scene;\n\t\t\tconst cameraData = renderStates.camera;\n\t\t\tconst currentRenderTarget = state.currentRenderTarget;\n\t\t\tif (!ifRender(renderable)) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (!passInfo.enabled) {\n\t\t\t\tconsole.warn('WebGLRenderer: beginRender must be called before renderRenderableItem.');\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst object = renderable.object;\n\t\t\tconst material = getMaterial.call(this, renderable);\n\t\t\tconst geometry = getGeometry.call(this, renderable);\n\t\t\tconst group = renderable.group;\n\t\t\tconst fog = material.fog ? sceneData.fog : null;\n\t\t\tconst lightingGroup = getLightingGroup(renderStates.lighting, material);\n\t\t\tconst lightingState = this._lights.setLightingGroup(lightingGroup, passInfo, this.lightingOptions, cameraData).state;\n\t\t\tconst hasLighting = lightingState.hasLight();\n\t\t\tconst hasShadow = lightingState.hasShadow() && object.receiveShadow;\n\t\t\t_envData.map = material.envMap !== undefined ? material.envMap || sceneData.environment : null;\n\t\t\t_envData.diffuse = sceneData.envDiffuseIntensity * material.envMapIntensity;\n\t\t\t_envData.specular = sceneData.envSpecularIntensity * material.envMapIntensity;\n\t\t\tlet clippingPlanesData = sceneData.clippingPlanesData;\n\t\t\tlet numClippingPlanes = sceneData.numClippingPlanes;\n\t\t\tif (material.clippingPlanes && material.clippingPlanes.length > 0) {\n\t\t\t\tif (_clippingPlanesData.length < material.clippingPlanes.length * 4) {\n\t\t\t\t\t_clippingPlanesData = new Float32Array(material.clippingPlanes.length * 4);\n\t\t\t\t}\n\t\t\t\tclippingPlanesData = sceneData.setClippingPlanesData(material.clippingPlanes, _clippingPlanesData);\n\t\t\t\tnumClippingPlanes = material.clippingPlanes.length;\n\t\t\t}\n\t\t\tobject.onBeforeRender(renderable, material);\n\t\t\tbeforeRender && beforeRender.call(this, renderable, material);\n\n\t\t\t// Check material version\n\n\t\t\tconst materialProperties = this._materials.setMaterial(material);\n\t\t\tif (material.needsUpdate === false) {\n\t\t\t\tif (materialProperties.currentProgram === undefined) {\n\t\t\t\t\tmaterial.needsUpdate = true;\n\t\t\t\t} else if (materialProperties.fog !== fog) {\n\t\t\t\t\tmaterial.needsUpdate = true;\n\t\t\t\t} else if (materialProperties.envMap !== _envData.map) {\n\t\t\t\t\tmaterial.needsUpdate = true;\n\t\t\t\t} else if (materialProperties.numClippingPlanes !== numClippingPlanes) {\n\t\t\t\t\tmaterial.needsUpdate = true;\n\t\t\t\t} else if (materialProperties.logarithmicDepthBuffer !== sceneData.logarithmicDepthBuffer) {\n\t\t\t\t\tmaterial.needsUpdate = true;\n\t\t\t\t} else if (renderStates.outputEncoding !== materialProperties.outputEncoding || renderStates.gammaFactor !== materialProperties.gammaFactor) {\n\t\t\t\t\tmaterial.needsUpdate = true;\n\t\t\t\t} else if (capabilities.version > 1 && sceneData.disableShadowSampler !== materialProperties.disableShadowSampler) {\n\t\t\t\t\tmaterial.needsUpdate = true;\n\t\t\t\t} else {\n\t\t\t\t\tif (hasLighting !== materialProperties.hasLighting) {\n\t\t\t\t\t\tmaterial.needsUpdate = true;\n\t\t\t\t\t} else if (hasLighting) {\n\t\t\t\t\t\tif (!lightingState.compare(materialProperties.lightingFactors)) {\n\t\t\t\t\t\t\tmaterial.needsUpdate = true;\n\t\t\t\t\t\t} else if (hasShadow !== materialProperties.hasShadow) {\n\t\t\t\t\t\t\tmaterial.needsUpdate = true;\n\t\t\t\t\t\t} else if (hasShadow) {\n\t\t\t\t\t\t\tmaterial.needsUpdate = materialProperties.shadowType !== object.shadowType;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Update program if needed.\n\n\t\t\tif (material.needsUpdate) {\n\t\t\t\tthis._materials.updateProgram(material, object, lightingState, renderStates, this.shaderCompileOptions);\n\t\t\t\tmaterialProperties.fog = fog;\n\t\t\t\tmaterialProperties.envMap = _envData.map;\n\t\t\t\tmaterialProperties.logarithmicDepthBuffer = sceneData.logarithmicDepthBuffer;\n\t\t\t\tmaterialProperties.hasLighting = hasLighting;\n\t\t\t\tmaterialProperties.lightingFactors = lightingState.copyTo(materialProperties.lightingFactors);\n\t\t\t\tmaterialProperties.hasShadow = hasShadow;\n\t\t\t\tmaterialProperties.shadowType = object.shadowType;\n\t\t\t\tmaterialProperties.numClippingPlanes = numClippingPlanes;\n\t\t\t\tmaterialProperties.outputEncoding = renderStates.outputEncoding;\n\t\t\t\tmaterialProperties.gammaFactor = renderStates.gammaFactor;\n\t\t\t\tmaterialProperties.disableShadowSampler = sceneData.disableShadowSampler;\n\t\t\t\tmaterial.needsUpdate = false;\n\t\t\t}\n\t\t\tconst program = materialProperties.currentProgram;\n\t\t\tif (options.onlyCompile || !program.isReady(capabilities.parallelShaderCompileExt)) return;\n\t\t\tstate.setProgram(program);\n\t\t\tthis._geometries.setGeometry(geometry, passInfo);\n\n\t\t\t// update morph targets\n\t\t\tif (object.morphTargetInfluences) {\n\t\t\t\tthis._updateMorphtargets(object, geometry, program);\n\t\t\t}\n\t\t\tvertexArrayBindings.setup(object, geometry, program);\n\t\t\tlet refreshCamera = false;\n\t\t\tif (program.cameraId !== cameraData.id || program.cameraVersion !== cameraData.version) {\n\t\t\t\trefreshCamera = true;\n\t\t\t\tprogram.cameraId = cameraData.id;\n\t\t\t\tprogram.cameraVersion = cameraData.version;\n\t\t\t}\n\t\t\tlet refreshScene = false;\n\t\t\tif (program.sceneId !== sceneData.id || program.sceneVersion !== sceneData.version) {\n\t\t\t\trefreshScene = true;\n\t\t\t\tprogram.sceneId = sceneData.id;\n\t\t\t\tprogram.sceneVersion = sceneData.version;\n\t\t\t}\n\t\t\tlet refreshMaterial = true;\n\t\t\tif (!material.forceUpdateUniforms) {\n\t\t\t\tif (materialProperties.pass !== passInfo.count) {\n\t\t\t\t\tmaterialProperties.pass = passInfo.count;\n\t\t\t\t} else {\n\t\t\t\t\trefreshMaterial = this._currentMaterial !== material;\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis._currentMaterial = material;\n\t\t\tconst uniforms = program.getUniforms();\n\n\t\t\t// upload light uniforms\n\t\t\tif (hasLighting) {\n\t\t\t\tthis._lights.uploadUniforms(program, lightingGroup, sceneData.disableShadowSampler);\n\t\t\t}\n\n\t\t\t// upload bone matrices\n\t\t\tif (object.isSkinnedMesh) {\n\t\t\t\tthis._uploadSkeleton(uniforms, object, sceneData);\n\t\t\t}\n\n\t\t\t// upload other uniforms\n\t\t\tfor (let n = 0, ll = uniforms.seq.length; n < ll; n++) {\n\t\t\t\tconst uniform = uniforms.seq[n];\n\t\t\t\tconst key = uniform.id;\n\t\t\t\tconst internalGroup = uniform.internalGroup;\n\n\t\t\t\t// upload custom uniforms\n\t\t\t\tif (material.uniforms && material.uniforms[key] !== undefined) {\n\t\t\t\t\tuniform.set(material.uniforms[key], textures);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// u_Model: always upload this matrix\n\t\t\t\tif (internalGroup === 1) {\n\t\t\t\t\tlet modelMatrix = object.worldMatrix;\n\t\t\t\t\tif (sceneData.useAnchorMatrix) {\n\t\t\t\t\t\tmodelMatrix = helpMatrix4.copy(modelMatrix).premultiply(sceneData.anchorMatrixInverse);\n\t\t\t\t\t}\n\t\t\t\t\tuniform.set(modelMatrix.elements);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// uniforms about camera data\n\t\t\t\tif (internalGroup === 2 && refreshCamera) {\n\t\t\t\t\tuniform.internalFun(cameraData);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// uniforms about scene data\n\t\t\t\tif (internalGroup === 3 && refreshScene) {\n\t\t\t\t\tuniform.internalFun(sceneData);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// uniforms about material\n\t\t\t\tif (internalGroup === 4 && refreshMaterial) {\n\t\t\t\t\tuniform.internalFun(material, textures);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// uniforms about environment map\n\t\t\t\tif (internalGroup === 5) {\n\t\t\t\t\tuniform.internalFun(_envData, textures);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// other internal uniforms\n\t\t\t\tif (key === 'clippingPlanes') {\n\t\t\t\t\tuniform.set(clippingPlanesData);\n\t\t\t\t} else if (key === 'u_RenderTargetSize') {\n\t\t\t\t\tuniform.setValue(currentRenderTarget.width, currentRenderTarget.height);\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst frontFaceCW = helpMatrix3.setFromMatrix4(object.worldMatrix).determinant() < 0;\n\t\t\tstate.setMaterial(material, frontFaceCW);\n\t\t\tconst viewport = helpVector4.set(currentRenderTarget.width, currentRenderTarget.height, currentRenderTarget.width, currentRenderTarget.height).multiply(cameraData.rect);\n\t\t\tviewport.z -= viewport.x;\n\t\t\tviewport.w -= viewport.y;\n\t\t\tstate.viewport(viewport.round());\n\t\t\tthis._draw(geometry, material, group, renderInfo);\n\t\t\ttextures.resetTextureUnits();\n\t\t\tafterRender && afterRender.call(this, renderable);\n\t\t\tobject.onAfterRender(renderable);\n\t\t}\n\t\tblitRenderTarget(read, draw, color = true, depth = true, stencil = true) {\n\t\t\tthis._renderTargets.blitRenderTarget(read, draw, color, depth, stencil);\n\t\t}\n\t\tgenerateMipmaps(texture) {\n\t\t\tconst state = this._state;\n\t\t\tconst capabilities = this.capabilities;\n\t\t\tconst textures = this._textures;\n\t\t\tconst textureProperties = textures.get(texture);\n\t\t\tif (!textureProperties.__webglTexture) return;\n\t\t\tconst powerOfTwo = MathUtils.isPowerOfTwo(textureProperties.__width) && MathUtils.isPowerOfTwo(textureProperties.__height);\n\t\t\tif (texture.generateMipmaps && texture.minFilter !== TEXTURE_FILTER.NEAREST && texture.minFilter !== TEXTURE_FILTER.LINEAR && (powerOfTwo || capabilities.version >= 2)) {\n\t\t\t\tconst target = textureProperties.__webglTarget;\n\t\t\t\tstate.bindTexture(target, textureProperties.__webglTexture);\n\t\t\t\ttextures.generateMipmaps(texture);\n\t\t\t\tstate.bindTexture(target, null);\n\t\t\t}\n\t\t}\n\t\treadTexturePixels(texture, x, y, width, height, buffer, zIndex = 0, mipLevel = 0) {\n\t\t\tconst gl = this.context;\n\t\t\tconst constants = this._constants;\n\t\t\tconst state = this._state;\n\t\t\tconst renderTargets = this._renderTargets;\n\t\t\tconst textures = this._textures;\n\t\t\tif (!this._bindTextureToDummyFrameBuffer(texture, zIndex, mipLevel)) {\n\t\t\t\treturn Promise.reject('WebGLRenderer.readTexturePixels: Unsupported texture.');\n\t\t\t}\n\t\t\tconst glType = constants.getGLType(texture.type);\n\t\t\tconst glFormat = constants.getGLFormat(texture.format);\n\t\t\tconst textureProperties = textures.get(texture);\n\t\t\tif (textureProperties.__readBuffer === undefined) {\n\t\t\t\ttextureProperties.__readBuffer = gl.createBuffer();\n\t\t\t}\n\t\t\tgl.bindBuffer(gl.PIXEL_PACK_BUFFER, textureProperties.__readBuffer);\n\t\t\tgl.bufferData(gl.PIXEL_PACK_BUFFER, buffer.byteLength, gl.STREAM_READ);\n\t\t\tgl.readPixels(x, y, width, height, glFormat, glType, 0);\n\n\t\t\t// restore framebuffer binding\n\t\t\tconst framebuffer = state.currentRenderTarget && !state.currentRenderTarget.isScreenRenderTarget ? renderTargets.get(state.currentRenderTarget).__webglFramebuffer : null;\n\t\t\tgl.bindFramebuffer(gl.FRAMEBUFFER, framebuffer);\n\t\t\treturn clientWaitAsync(gl).then(() => {\n\t\t\t\tif (!textureProperties.__readBuffer) {\n\t\t\t\t\tthrow new Error('WebGLRenderer.readTexturePixels: Texture has been disposed.');\n\t\t\t\t}\n\t\t\t\tgl.bindBuffer(gl.PIXEL_PACK_BUFFER, textureProperties.__readBuffer);\n\t\t\t\tgl.getBufferSubData(gl.PIXEL_PACK_BUFFER, 0, buffer);\n\t\t\t\tgl.bindBuffer(gl.PIXEL_PACK_BUFFER, null);\n\t\t\t\treturn buffer;\n\t\t\t});\n\t\t}\n\t\treadTexturePixelsSync(texture, x, y, width, height, buffer, zIndex = 0, mipLevel = 0) {\n\t\t\tconst gl = this.context;\n\t\t\tconst constants = this._constants;\n\t\t\tconst state = this._state;\n\t\t\tconst renderTargets = this._renderTargets;\n\t\t\tif (!this._bindTextureToDummyFrameBuffer(texture, zIndex, mipLevel)) {\n\t\t\t\tconsole.warn('WebGLRenderer.readTexturePixels: Unsupported texture.');\n\t\t\t\treturn buffer;\n\t\t\t}\n\t\t\tconst glType = constants.getGLType(texture.type);\n\t\t\tconst glFormat = constants.getGLFormat(texture.format);\n\t\t\tgl.readPixels(x, y, width, height, glFormat, glType, buffer);\n\n\t\t\t// restore framebuffer binding\n\t\t\tconst framebuffer = state.currentRenderTarget && !state.currentRenderTarget.isScreenRenderTarget ? renderTargets.get(state.currentRenderTarget).__webglFramebuffer : null;\n\t\t\tgl.bindFramebuffer(gl.FRAMEBUFFER, framebuffer);\n\t\t\treturn buffer;\n\t\t}\n\t\tresetVertexArrayBindings(force) {\n\t\t\tthis._vertexArrayBindings.reset(force);\n\t\t}\n\t\tresetState() {\n\t\t\tthis._state.reset();\n\t\t}\n\t\tbeginOcclusionQuery(index) {\n\t\t\tconst querySet = this._currentOcclusionQuerySet;\n\t\t\tif (!querySet) return;\n\t\t\tthis._querySets.beginQuery(querySet, index);\n\t\t}\n\t\tendOcclusionQuery() {\n\t\t\tconst querySet = this._currentOcclusionQuerySet;\n\t\t\tif (!querySet) return;\n\t\t\tthis._querySets.endQuery(querySet);\n\t\t}\n\t\tasync readQuerySetResults(querySet, dstBuffer, firstQuery = 0, queryCount = querySet.count) {\n\t\t\treturn this._querySets.readQuerySetResults(querySet, dstBuffer, firstQuery, queryCount);\n\t\t}\n\n\t\t/**\n\t\t * Bind webglTexture to Texture.\n\t\t * @param {TextureBase} texture\n\t\t * @param {WebGLTexture} webglTexture\n\t\t */\n\t\tsetTextureExternal(texture, webglTexture) {\n\t\t\tthis._textures.setTextureExternal(texture, webglTexture);\n\t\t}\n\n\t\t/**\n\t\t * Bind webglRenderbuffer to RenderBuffer.\n\t\t * @param {RenderBuffer} renderBuffer\n\t\t * @param {WebGLRenderbuffer} webglRenderbuffer\n\t\t */\n\t\tsetRenderBufferExternal(renderBuffer, webglRenderbuffer) {\n\t\t\tthis._renderBuffers.setRenderBufferExternal(renderBuffer, webglRenderbuffer);\n\t\t}\n\n\t\t/**\n\t\t * Bind webglBuffer to Buffer.\n\t\t * @param {Buffer} buffer\n\t\t * @param {WebGLBuffer} webglBuffer\n\t\t */\n\t\tsetBufferExternal(buffer, webglBuffer) {\n\t\t\tthis._buffers.setBufferExternal(buffer, webglBuffer);\n\t\t}\n\n\t\t/**\n\t\t * Bind webglFramebuffer to RenderTarget.\n\t\t * @param {RenderTarget} renderTarget\n\t\t * @param {WebGLFramebuffer} webglFramebuffer\n\t\t */\n\t\tsetFramebufferExternal(renderTarget, webglFramebuffer) {\n\t\t\tthis._renderTargets.setFramebufferExternal(renderTarget, webglFramebuffer);\n\t\t}\n\t\t_uploadSkeleton(uniforms, object, sceneData) {\n\t\t\tif (object.skeleton && object.skeleton.bones.length > 0) {\n\t\t\t\tconst skeleton = object.skeleton;\n\t\t\t\tconst capabilities = this.capabilities;\n\t\t\t\tif (capabilities.maxVertexTextures > 0 && (!!capabilities.getExtension('OES_texture_float') || capabilities.version >= 2)) {\n\t\t\t\t\tif (skeleton.boneTexture === undefined) {\n\t\t\t\t\t\tskeleton.generateBoneTexture(capabilities.version >= 2);\n\t\t\t\t\t}\n\t\t\t\t\tuniforms.set('boneTexture', skeleton.boneTexture, this._textures);\n\t\t\t\t\tuniforms.set('boneTextureSize', skeleton.boneTexture.image.width);\n\t\t\t\t} else {\n\t\t\t\t\tuniforms.set('boneMatrices', skeleton.boneMatrices);\n\t\t\t\t}\n\t\t\t\tuniforms.set('bindMatrix', object.bindMatrix.elements);\n\t\t\t\thelpMatrix4.copy(object.bindMatrixInverse);\n\t\t\t\tif (sceneData.useAnchorMatrix) {\n\t\t\t\t\thelpMatrix4.multiply(sceneData.anchorMatrix); // convert to anchor space\n\t\t\t\t}\n\t\t\t\tuniforms.set('bindMatrixInverse', helpMatrix4.elements);\n\t\t\t}\n\t\t}\n\t\t_updateMorphtargets(object, geometry, program) {\n\t\t\tconst objectInfluences = object.morphTargetInfluences;\n\t\t\tif (!influencesList.has(geometry)) {\n\t\t\t\tinfluencesList.set(geometry, objectInfluences.slice(0));\n\t\t\t}\n\t\t\tconst morphTargets = geometry.morphAttributes.position;\n\t\t\tconst morphNormals = geometry.morphAttributes.normal;\n\n\t\t\t// Remove current morphAttributes\n\n\t\t\tconst influences = influencesList.get(geometry);\n\t\t\tfor (let i = 0; i < influences.length; i++) {\n\t\t\t\tconst influence = influences[i];\n\t\t\t\tif (influence !== 0) {\n\t\t\t\t\tif (morphTargets) geometry.removeAttribute('morphTarget' + i);\n\t\t\t\t\tif (morphNormals) geometry.removeAttribute('morphNormal' + i);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Collect influences\n\n\t\t\tfor (let i = 0; i < objectInfluences.length; i++) {\n\t\t\t\tinfluences[i] = objectInfluences[i];\n\t\t\t}\n\t\t\tinfluences.length = objectInfluences.length;\n\n\t\t\t// Add morphAttributes\n\n\t\t\tlet count = 0;\n\t\t\tfor (let i = 0; i < influences.length; i++) {\n\t\t\t\tconst influence = influences[i];\n\t\t\t\tif (influence > 0) {\n\t\t\t\t\tif (morphTargets) geometry.addAttribute('morphTarget' + count, morphTargets[i]);\n\t\t\t\t\tif (morphNormals) geometry.addAttribute('morphNormal' + count, morphNormals[i]);\n\t\t\t\t\tmorphInfluences[count] = influence;\n\t\t\t\t\tcount++;\n\t\t\t\t}\n\t\t\t}\n\t\t\tfor (; count < 8; count++) {\n\t\t\t\tmorphInfluences[count] = 0;\n\t\t\t}\n\t\t\tprogram.getUniforms().set('morphTargetInfluences', morphInfluences);\n\t\t}\n\t\t_draw(geometry, material, group, renderInfo) {\n\t\t\tconst gl = this.context;\n\t\t\tconst capabilities = this.capabilities;\n\t\t\tconst buffers = this._buffers;\n\t\t\tconst instanceCount = geometry.instanceCount;\n\t\t\tconst useInstancing = instanceCount >= 0;\n\t\t\tconst useGroup = !!group;\n\t\t\tconst useMultiDraw = useGroup && group.multiDrawCount !== undefined;\n\t\t\tconst useIndexBuffer = geometry.index !== null;\n\t\t\tlet drawStart = 0;\n\t\t\tlet drawCount = Infinity;\n\t\t\tif (!useMultiDraw) {\n\t\t\t\tconst position = geometry.getAttribute('a_Position');\n\t\t\t\tif (useIndexBuffer) {\n\t\t\t\t\tdrawCount = geometry.index.buffer.count;\n\t\t\t\t} else if (position) {\n\t\t\t\t\tdrawCount = position.buffer.count;\n\t\t\t\t}\n\t\t\t\tif (useGroup) {\n\t\t\t\t\tdrawStart = Math.max(drawStart, group.start);\n\t\t\t\t\tdrawCount = Math.min(drawCount, group.count);\n\t\t\t\t}\n\t\t\t\tif (drawCount < 0 || drawCount === Infinity) return;\n\t\t\t}\n\t\t\tif (useIndexBuffer) {\n\t\t\t\tconst indexBufferProperties = buffers.get(geometry.index.buffer);\n\t\t\t\tconst bytesPerElement = indexBufferProperties.bytesPerElement;\n\t\t\t\tconst type = indexBufferProperties.type;\n\t\t\t\tif (type === gl.UNSIGNED_INT) {\n\t\t\t\t\tif (capabilities.version < 2 && !capabilities.getExtension('OES_element_index_uint')) {\n\t\t\t\t\t\tconsole.warn('WebGLRenderer: draw elements type not support UNSIGNED_INT!');\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (useInstancing) {\n\t\t\t\t\tif (instanceCount <= 0) return;\n\t\t\t\t\tif (capabilities.version >= 2) {\n\t\t\t\t\t\tgl.drawElementsInstanced(material.drawMode, drawCount, type, drawStart * bytesPerElement, instanceCount);\n\t\t\t\t\t} else if (capabilities.getExtension('ANGLE_instanced_arrays')) {\n\t\t\t\t\t\tcapabilities.getExtension('ANGLE_instanced_arrays').drawElementsInstancedANGLE(material.drawMode, drawCount, type, drawStart * bytesPerElement, instanceCount);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconsole.warn('WebGLRenderer: using instanced draw but hardware does not support.');\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t} else if (useMultiDraw) {\n\t\t\t\t\tif (group.multiDrawCount <= 0) return;\n\t\t\t\t\tconst extension = capabilities.getExtension('WEBGL_multi_draw');\n\t\t\t\t\tif (!extension) {\n\t\t\t\t\t\tconsole.warn('WebGLRenderer: using multi draw but hardware does not support extension WEBGL_multi_draw.');\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\textension.multiDrawElementsWEBGL(material.drawMode, group.multiDrawCounts, 0, type, group.multiDrawStarts, 0, group.multiDrawCount);\n\t\t\t\t} else {\n\t\t\t\t\tgl.drawElements(material.drawMode, drawCount, type, drawStart * bytesPerElement);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (useInstancing) {\n\t\t\t\t\tif (instanceCount <= 0) return;\n\t\t\t\t\tif (capabilities.version >= 2) {\n\t\t\t\t\t\tgl.drawArraysInstanced(material.drawMode, drawStart, drawCount, instanceCount);\n\t\t\t\t\t} else if (capabilities.getExtension('ANGLE_instanced_arrays')) {\n\t\t\t\t\t\tcapabilities.getExtension('ANGLE_instanced_arrays').drawArraysInstancedANGLE(material.drawMode, drawStart, drawCount, instanceCount);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconsole.warn('WebGLRenderer: using instanced draw but hardware does not support.');\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t} else if (useMultiDraw) {\n\t\t\t\t\tif (group.multiDrawCount <= 0) return;\n\t\t\t\t\tconst extension = capabilities.getExtension('WEBGL_multi_draw');\n\t\t\t\t\tif (!extension) {\n\t\t\t\t\t\tconsole.warn('WebGLRenderer: using multi draw but hardware does not support extension WEBGL_multi_draw.');\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\textension.multiDrawArraysWEBGL(material.drawMode, group.multiDrawStarts, 0, group.multiDrawCounts, 0, group.multiDrawCount);\n\t\t\t\t} else {\n\t\t\t\t\tgl.drawArrays(material.drawMode, drawStart, drawCount);\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (renderInfo) {\n\t\t\t\tif (useMultiDraw) {\n\t\t\t\t\tdrawCount = 0;\n\t\t\t\t\tfor (let i = 0; i < group.multiDrawCount; i++) {\n\t\t\t\t\t\tdrawCount += group.multiDrawCounts[i];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\trenderInfo.update(drawCount, material.drawMode, instanceCount < 0 ? 1 : instanceCount);\n\t\t\t}\n\t\t}\n\t\t_bindTextureToDummyFrameBuffer(texture, zIndex, mipLevel) {\n\t\t\tif (!texture.isTexture) return false;\n\t\t\tconst gl = this.context;\n\t\t\tconst textures = this._textures;\n\t\t\tconst state = this._state;\n\t\t\tif (!this._dummyFrameBuffer) {\n\t\t\t\tthis._dummyFrameBuffer = gl.createFramebuffer();\n\t\t\t}\n\t\t\tgl.bindFramebuffer(gl.FRAMEBUFFER, this._dummyFrameBuffer);\n\t\t\tconst textureProperties = textures.setTexture(texture);\n\t\t\tif (texture.isTexture2D) {\n\t\t\t\tgl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, textureProperties.__webglTexture, mipLevel);\n\t\t\t} else if (texture.isTextureCube) {\n\t\t\t\tgl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_CUBE_MAP_POSITIVE_X + zIndex, textureProperties.__webglTexture, mipLevel);\n\t\t\t} else if (texture.isTexture3D || texture.isTexture2DArray) {\n\t\t\t\tgl.framebufferTextureLayer(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, textureProperties.__webglTexture, mipLevel, zIndex);\n\t\t\t}\n\t\t\tstate.bindTexture(textureProperties.__webglTarget, null);\n\t\t\treturn true;\n\t\t}\n\t}\n\n\tObject.defineProperties(WebGLRenderer.prototype, {\n\t\t// deprecated since 0.4.5\n\t\tasyncReadPixel: {\n\t\t\tconfigurable: true,\n\t\t\tget: function () {\n\t\t\t\tif (this._asyncReadPixel === undefined) {\n\t\t\t\t\tthis._asyncReadPixel = false;\n\t\t\t\t}\n\t\t\t\treturn this._asyncReadPixel;\n\t\t\t},\n\t\t\tset: function (value) {\n\t\t\t\tthis._asyncReadPixel = value;\n\t\t\t}\n\t\t}\n\t});\n\n\t// deprecated since 0.4.5, use readTexturePixels instead\n\tWebGLRenderer.prototype.readRenderTargetPixels = function (x, y, width, height, buffer) {\n\t\tconst state = this._state;\n\t\tconst renderTarget = state.currentRenderTarget;\n\t\tconst zIndex = renderTarget.activeLayer || renderTarget.activeLayer || 0;\n\t\tconst mipLevel = renderTarget.activeMipmapLevel || 0;\n\t\tif (renderTarget && renderTarget.texture) {\n\t\t\tif (x >= 0 && x <= renderTarget.width - width && y >= 0 && y <= renderTarget.height - height) {\n\t\t\t\tif (this.asyncReadPixel) {\n\t\t\t\t\treturn this.readTexturePixels(renderTarget.texture, x, y, width, height, buffer, zIndex, mipLevel);\n\t\t\t\t} else {\n\t\t\t\t\tthis.readTexturePixelsSync(renderTarget.texture, x, y, width, height, buffer, zIndex, mipLevel);\n\t\t\t\t\treturn Promise.resolve(buffer);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tconsole.warn('WebGLRenderer.readRenderTargetPixels: readPixels from renderTarget failed.');\n\t\treturn Promise.reject();\n\t};\n\n\t// deprecated since 0.5.1\n\tWebGLTextures.prototype.setTexture2D = function (texture, slot) {\n\t\t// console.warn('WebGLTextures: .setTexture2D() has been deprecated, use .setTexture() instead.');\n\t\treturn this.setTexture(texture, slot);\n\t};\n\tWebGLTextures.prototype.setTextureCube = function (texture, slot) {\n\t\t// console.warn('WebGLTextures: .setTextureCube() has been deprecated, use .setTexture() instead.');\n\t\treturn this.setTexture(texture, slot);\n\t};\n\tWebGLTextures.prototype.setTexture3D = function (texture, slot) {\n\t\t// console.warn('WebGLTextures: .setTexture3D() has been deprecated, use .setTexture() instead.');\n\t\treturn this.setTexture(texture, slot);\n\t};\n\tWebGLTextures.prototype.setTexture2DArray = function (texture, slot) {\n\t\t// console.warn('WebGLTextures: .setTexture2DArray() has been deprecated, use .setTexture() instead.');\n\t\treturn this.setTexture(texture, slot);\n\t};\n\tObject.defineProperties(Scene.prototype, {\n\t\t// deprecated since 0.2.7, add warning since 0.4.0\n\t\tenvironmentLightIntensity: {\n\t\t\tconfigurable: true,\n\t\t\tget: function () {\n\t\t\t\tconsole.warn('Scene: .environmentLightIntensity has been deprecated, use .envDiffuseIntensity instead.');\n\t\t\t\treturn this.envDiffuseIntensity;\n\t\t\t},\n\t\t\tset: function (value) {\n\t\t\t\tconsole.warn('Scene: .environmentLightIntensity has been deprecated, use .envDiffuseIntensity instead.');\n\t\t\t\tthis.envDiffuseIntensity = value;\n\t\t\t}\n\t\t},\n\t\t// deprecated since 0.4.0\n\t\t_lightData: {\n\t\t\tconfigurable: true,\n\t\t\tget: function () {\n\t\t\t\tconsole.warn('Scene: ._lightData has been deprecated since v0.4.0, use .collector.lightingData.getGroup(0) instead.');\n\t\t\t\treturn this.collector.lightingData.getGroup(0);\n\t\t\t}\n\t\t},\n\t\t// deprecated since 0.4.4\n\t\t_sceneData: {\n\t\t\tconfigurable: true,\n\t\t\tget: function () {\n\t\t\t\tconsole.warn('Scene: ._sceneData has been deprecated since v0.4.4, use .collector.sceneData instead.');\n\t\t\t\treturn this.collector.sceneData;\n\t\t\t}\n\t\t},\n\t\t// deprecated since 0.4.4\n\t\t_lightingData: {\n\t\t\tconfigurable: true,\n\t\t\tget: function () {\n\t\t\t\tconsole.warn('Scene: ._lightingData has been deprecated since v0.4.4, use .collector.lightingData instead.');\n\t\t\t\treturn this.collector.lightingData;\n\t\t\t}\n\t\t}\n\t});\n\tObject.defineProperties(RenderStates.prototype, {\n\t\t// deprecated since 0.4.0\n\t\tlights: {\n\t\t\tconfigurable: true,\n\t\t\tget: function () {\n\t\t\t\tconsole.warn('RenderStates: .lights has been deprecated since v0.4.0, use .lighting.getGroup(0) instead.');\n\t\t\t\treturn this.lighting.getGroup(0);\n\t\t\t}\n\t\t}\n\t});\n\n\t// deprecated since 0.2.8\n\n\tconst generateUUID = MathUtils.generateUUID;\n\tconst isPowerOfTwo = MathUtils.isPowerOfTwo;\n\tconst nearestPowerOfTwo = MathUtils.nearestPowerOfTwo;\n\tconst nextPowerOfTwo = MathUtils.nextPowerOfTwo;\n\n\t// deprecated since 0.4.3\n\tMatrix4.prototype.inverse = function () {\n\t\treturn this.invert();\n\t};\n\n\t// deprecated since 0.4.3\n\tMatrix4.prototype.getInverse = function (m) {\n\t\treturn this.copy(m).invert();\n\t};\n\n\t// deprecated since 0.4.3\n\tMatrix4.prototype.transform = function (position, scale, quaternion) {\n\t\treturn this.compose(position, quaternion, scale);\n\t};\n\n\t// deprecated since 0.4.3\n\tMatrix3.prototype.inverse = function () {\n\t\treturn this.invert();\n\t};\n\n\t// deprecated since 0.4.3\n\tMatrix3.prototype.getInverse = function (m) {\n\t\treturn this.copy(m).invert();\n\t};\n\n\t// deprecated since 0.4.3\n\tVector3.prototype.subtract = function (a, target = new Vector3()) {\n\t\treturn target.set(this.x - a.x, this.y - a.y, this.z - a.z);\n\t};\n\n\t// The old version of Query API has been deprecated since 0.4.4\n\n\tconst QUERY_TYPE = {\n\t\tANY_SAMPLES_PASSED: 7000,\n\t\tANY_SAMPLES_PASSED_CONSERVATIVE: 7001,\n\t\tTIME_ELAPSED: 7002\n\t};\n\tlet _queryId = 0;\n\tclass Query extends EventDispatcher {\n\t\tconstructor() {\n\t\t\tsuper();\n\t\t\tthis.id = _queryId++;\n\t\t}\n\t\tdispose() {\n\t\t\tthis.dispatchEvent({\n\t\t\t\ttype: 'dispose'\n\t\t\t});\n\t\t}\n\t}\n\tWebGLRenderer.prototype.beginQuery = function (query, target) {\n\t\tthis._queries.begin(query, target);\n\t};\n\tWebGLRenderer.prototype.endQuery = function (query) {\n\t\tthis._queries.end(query);\n\t};\n\tWebGLRenderer.prototype.queryCounter = function (query) {\n\t\tthis._queries.counter(query);\n\t};\n\tWebGLRenderer.prototype.isTimerQueryDisjoint = function (query) {\n\t\treturn this._queries.isTimerDisjoint(query);\n\t};\n\tWebGLRenderer.prototype.isQueryResultAvailable = function (query) {\n\t\treturn this._queries.isResultAvailable(query);\n\t};\n\tWebGLRenderer.prototype.getQueryResult = function (query) {\n\t\treturn this._queries.getResult(query);\n\t};\n\tObject.defineProperties(WebGLRenderer.prototype, {\n\t\t_queries: {\n\t\t\tconfigurable: true,\n\t\t\tget: function () {\n\t\t\t\tif (this.__queries === undefined) {\n\t\t\t\t\tthis.__queries = new WebGLQueries(`_gl${this.id}`, this.context, this.capabilities);\n\t\t\t\t}\n\t\t\t\treturn this.__queries;\n\t\t\t}\n\t\t}\n\t});\n\tclass WebGLQueries extends PropertyMap {\n\t\tconstructor(prefix, gl, capabilities) {\n\t\t\tsuper(prefix);\n\t\t\tthis._gl = gl;\n\t\t\tthis._capabilities = capabilities;\n\t\t\tconst timerQuery = capabilities.timerQuery;\n\t\t\tconst that = this;\n\t\t\tconst onQueryDispose = event => {\n\t\t\t\tconst query = event.target;\n\t\t\t\tconst queryProperties = that.get(query);\n\t\t\t\tquery.removeEventListener('dispose', onQueryDispose);\n\t\t\t\tif (queryProperties._webglQuery) {\n\t\t\t\t\tif (capabilities.version > 1) {\n\t\t\t\t\t\tgl.deleteQuery(queryProperties._webglQuery);\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttimerQuery.deleteQueryEXT(queryProperties._webglQuery);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tthat.delete(query);\n\t\t\t};\n\t\t\tthis._onQueryDispose = onQueryDispose;\n\t\t\tthis._typeToGL = {\n\t\t\t\t[QUERY_TYPE.ANY_SAMPLES_PASSED]: 0x8C2F,\n\t\t\t\t[QUERY_TYPE.ANY_SAMPLES_PASSED_CONSERVATIVE]: 0x8D6A,\n\t\t\t\t[QUERY_TYPE.TIME_ELAPSED]: 0x88BF\n\t\t\t};\n\t\t}\n\t\t_get(query) {\n\t\t\tconst capabilities = this._capabilities;\n\t\t\tconst queryProperties = this.get(query);\n\t\t\tif (queryProperties._webglQuery === undefined) {\n\t\t\t\tquery.addEventListener('dispose', this._onQueryDispose);\n\t\t\t\tqueryProperties._webglQuery = capabilities.version > 1 ? this._gl.createQuery() : capabilities.timerQuery.createQueryEXT();\n\t\t\t\tqueryProperties._target = null;\n\t\t\t\tqueryProperties._result = null;\n\t\t\t}\n\t\t\treturn queryProperties;\n\t\t}\n\t\tbegin(query, target) {\n\t\t\tconst capabilities = this._capabilities;\n\t\t\tconst typeToGL = this._typeToGL;\n\t\t\tconst queryProperties = this._get(query);\n\t\t\tif (capabilities.version > 1) {\n\t\t\t\tthis._gl.beginQuery(typeToGL[target], queryProperties._webglQuery);\n\t\t\t} else {\n\t\t\t\tcapabilities.timerQuery.beginQueryEXT(typeToGL[target], queryProperties._webglQuery);\n\t\t\t}\n\t\t\tqueryProperties._target = target;\n\t\t\tqueryProperties._result = null; // clear the last result.\n\t\t}\n\t\tend(query) {\n\t\t\tconst capabilities = this._capabilities;\n\t\t\tconst typeToGL = this._typeToGL;\n\t\t\tconst queryProperties = this._get(query);\n\t\t\tif (capabilities.version > 1) {\n\t\t\t\tthis._gl.endQuery(typeToGL[queryProperties._target]);\n\t\t\t} else {\n\t\t\t\tcapabilities.timerQuery.endQueryEXT(typeToGL[queryProperties._target]);\n\t\t\t}\n\t\t}\n\t\tcounter(query) {\n\t\t\tconst timerQuery = this._capabilities.timerQuery;\n\t\t\tconst queryProperties = this._get(query);\n\t\t\ttimerQuery.queryCounterEXT(queryProperties._webglQuery, timerQuery.TIMESTAMP_EXT);\n\t\t\tqueryProperties._target = timerQuery.TIMESTAMP_EXT;\n\t\t\tqueryProperties._result = null; // clear the last result.\n\t\t}\n\t\tisResultAvailable(query) {\n\t\t\tconst gl = this._gl;\n\t\t\tconst capabilities = this._capabilities;\n\t\t\tconst timerQuery = capabilities.timerQuery;\n\t\t\tconst queryProperties = this._get(query);\n\t\t\tlet available;\n\t\t\tif (capabilities.version > 1) {\n\t\t\t\tavailable = gl.getQueryParameter(queryProperties._webglQuery, gl.QUERY_RESULT_AVAILABLE);\n\t\t\t} else {\n\t\t\t\tavailable = timerQuery.getQueryObjectEXT(queryProperties._webglQuery, timerQuery.QUERY_RESULT_AVAILABLE);\n\t\t\t}\n\t\t\treturn available;\n\t\t}\n\t\tisTimerDisjoint() {\n\t\t\treturn this._gl.getParameter(this._capabilities.timerQuery.GPU_DISJOINT_EXT);\n\t\t}\n\t\tgetResult(query) {\n\t\t\tconst gl = this._gl;\n\t\t\tconst capabilities = this._capabilities;\n\t\t\tconst timerQuery = capabilities.timerQuery;\n\t\t\tconst queryProperties = this._get(query);\n\t\t\tif (queryProperties._result === null) {\n\t\t\t\tif (capabilities.version > 1) {\n\t\t\t\t\tqueryProperties._result = gl.getQueryParameter(queryProperties._webglQuery, gl.QUERY_RESULT);\n\t\t\t\t} else {\n\t\t\t\t\tqueryProperties._result = timerQuery.getQueryObjectEXT(queryProperties._webglQuery, timerQuery.QUERY_RESULT_EXT);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn queryProperties._result;\n\t\t}\n\t}\n\n\t// deprecated since 0.5.0\n\tWebGLRenderer.prototype.clear = function (color, depth, stencil) {\n\t\tconst gl = this.context;\n\t\tlet bits = 0;\n\t\tif (color === undefined || color) bits |= gl.COLOR_BUFFER_BIT;\n\t\tif (depth === undefined || depth) bits |= gl.DEPTH_BUFFER_BIT;\n\t\tif (stencil === undefined || stencil) bits |= gl.STENCIL_BUFFER_BIT;\n\t\tif (bits > 0) {\n\t\t\t// Prevent warning when bits is equal to zero\n\t\t\tgl.clear(bits);\n\t\t}\n\t};\n\n\t// deprecated since 0.5.0\n\tWebGLRenderer.prototype.setClearColor = function (r, g, b, a, premultipliedAlpha) {\n\t\tthis._state.colorBuffer.setClear(r, g, b, a, premultipliedAlpha);\n\t};\n\n\t// deprecated since 0.5.0\n\tWebGLRenderer.prototype.getClearColor = function () {\n\t\treturn this._state.colorBuffer.getClear();\n\t};\n\n\t// deprecated since 0.5.0\n\tWebGLRenderer.prototype.setRenderTarget = function (renderTarget) {\n\t\tthis._renderTargets.setRenderTarget(renderTarget);\n\t};\n\n\t// deprecated since 0.5.0\n\tWebGLRenderer.prototype.getRenderTarget = function () {\n\t\treturn this._state.currentRenderTarget;\n\t};\n\n\t// deprecated since 0.5.0\n\tWebGLRenderer.prototype.setOcclusionQuerySet = function (querySet) {\n\t\tthis._currentOcclusionQuerySet = querySet;\n\t};\n\n\t// deprecated since 0.5.0\n\tWebGLRenderer.prototype.setTimestampWrites = function (querySet, beginIndex = 0, endIndex = 1) {\n\t\tthis._currentTimestampWrites.querySet = querySet;\n\t\tthis._currentTimestampWrites.beginningOfPassWriteIndex = beginIndex;\n\t\tthis._currentTimestampWrites.endOfPassWriteIndex = endIndex;\n\t};\n\n\t// deprecated since 0.5.0\n\tWebGLRenderer.prototype.updateRenderTargetMipmap = function (renderTarget) {\n\t\tif (renderTarget.texture) {\n\t\t\tthis.generateMipmaps(renderTarget.texture);\n\t\t}\n\t};\n\tObject.defineProperties(OffscreenRenderTarget.prototype, {\n\t\t// deprecated since 0.5.0\n\t\tdepth: {\n\t\t\tconfigurable: true,\n\t\t\tget: function () {\n\t\t\t\tconsole.warn('OffscreenRenderTarget: .depth property is deprecated.');\n\t\t\t\treturn 1;\n\t\t\t}\n\t\t}\n\t});\n\n\t// deprecated since 0.5.0\n\tclass RenderTarget2D extends OffscreenRenderTarget {\n\t\tconstructor(width, height) {\n\t\t\tsuper(width, height);\n\t\t\tthis.attach(new Texture2D(), ATTACHMENT.COLOR_ATTACHMENT0);\n\t\t\tthis.attach(new RenderBuffer(width, height, PIXEL_FORMAT.DEPTH_STENCIL), ATTACHMENT.DEPTH_STENCIL_ATTACHMENT);\n\t\t}\n\t}\n\tRenderTarget2D.prototype.isRenderTarget2D = true;\n\n\t// deprecated since 0.5.0\n\tclass RenderTargetCube extends OffscreenRenderTarget {\n\t\tconstructor(width, height) {\n\t\t\tsuper(width, height);\n\t\t\tthis.attach(new TextureCube(), ATTACHMENT.COLOR_ATTACHMENT0);\n\t\t\tthis.attach(new RenderBuffer(width, height, PIXEL_FORMAT.DEPTH_STENCIL), ATTACHMENT.DEPTH_STENCIL_ATTACHMENT);\n\t\t}\n\t}\n\tRenderTargetCube.prototype.isRenderTargetCube = true;\n\n\t// deprecated since 0.5.0\n\tclass RenderTarget3D extends OffscreenRenderTarget {\n\t\tconstructor(width, height, depth) {\n\t\t\tsuper(width, height);\n\t\t\tconst texture = new Texture3D();\n\t\t\ttexture.resizeAsAttachment(width, height, depth);\n\t\t\tthis.attach(texture, ATTACHMENT.COLOR_ATTACHMENT0);\n\t\t}\n\t}\n\tRenderTarget3D.prototype.isRenderTarget3D = true;\n\n\t// deprecated since 0.5.0\n\tclass RenderTarget2DArray extends OffscreenRenderTarget {\n\t\tconstructor(width, height, depth) {\n\t\t\tsuper(width, height);\n\t\t\tconst texture = new Texture2DArray();\n\t\t\ttexture.resizeAsAttachment(width, height, depth);\n\t\t\tthis.attach(texture, ATTACHMENT.COLOR_ATTACHMENT0);\n\t\t}\n\t}\n\tRenderTarget2DArray.prototype.isRenderTarget2DArray = true;\n\n\t// deprecated since 0.5.0\n\tScreenRenderTarget.prototype.isRenderTargetBack = true;\n\n\texports.ATTACHMENT = ATTACHMENT;\n\texports.AmbientLight = AmbientLight;\n\texports.AnimationAction = AnimationAction;\n\texports.AnimationMixer = AnimationMixer;\n\texports.Attribute = Attribute;\n\texports.BLEND_EQUATION = BLEND_EQUATION;\n\texports.BLEND_FACTOR = BLEND_FACTOR;\n\texports.BLEND_TYPE = BLEND_TYPE;\n\texports.BUFFER_USAGE = BUFFER_USAGE;\n\texports.BasicMaterial = BasicMaterial;\n\texports.Bone = Bone;\n\texports.BooleanKeyframeTrack = BooleanKeyframeTrack;\n\texports.Box2 = Box2;\n\texports.Box3 = Box3;\n\texports.BoxGeometry = BoxGeometry;\n\texports.Buffer = Buffer;\n\texports.COMPARE_FUNC = COMPARE_FUNC;\n\texports.CULL_FACE_TYPE = CULL_FACE_TYPE;\n\texports.Camera = Camera;\n\texports.CameraProjection = CameraProjection;\n\texports.Color3 = Color3;\n\texports.Color4 = Color4;\n\texports.ColorKeyframeTrack = ColorKeyframeTrack;\n\texports.CubicSplineInterpolant = CubicSplineInterpolant;\n\texports.CylinderGeometry = CylinderGeometry;\n\texports.DRAW_MODE = DRAW_MODE;\n\texports.DRAW_SIDE = DRAW_SIDE;\n\texports.DefaultLoadingManager = DefaultLoadingManager;\n\texports.DepthMaterial = DepthMaterial;\n\texports.DirectionalLight = DirectionalLight;\n\texports.DirectionalLightShadow = DirectionalLightShadow;\n\texports.DistanceMaterial = DistanceMaterial;\n\texports.ENVMAP_COMBINE_TYPE = ENVMAP_COMBINE_TYPE;\n\texports.Euler = Euler;\n\texports.EventDispatcher = EventDispatcher;\n\texports.FileLoader = FileLoader;\n\texports.Fog = Fog;\n\texports.FogExp2 = FogExp2;\n\texports.Frustum = Frustum;\n\texports.Geometry = Geometry;\n\texports.HemisphereLight = HemisphereLight;\n\texports.ImageLoader = ImageLoader;\n\texports.KeyframeClip = KeyframeClip;\n\texports.KeyframeInterpolant = KeyframeInterpolant;\n\texports.KeyframeTrack = KeyframeTrack;\n\texports.LambertMaterial = LambertMaterial;\n\texports.Light = Light;\n\texports.LightShadow = LightShadow;\n\texports.LineMaterial = LineMaterial;\n\texports.LinearInterpolant = LinearInterpolant;\n\texports.Loader = Loader;\n\texports.LoadingManager = LoadingManager;\n\texports.MATERIAL_TYPE = MATERIAL_TYPE;\n\texports.Material = Material;\n\texports.MathUtils = MathUtils;\n\texports.Matrix3 = Matrix3;\n\texports.Matrix4 = Matrix4;\n\texports.Mesh = Mesh;\n\texports.NumberKeyframeTrack = NumberKeyframeTrack;\n\texports.OPERATION = OPERATION;\n\texports.Object3D = Object3D;\n\texports.OffscreenRenderTarget = OffscreenRenderTarget;\n\texports.OrthographicProjection = OrthographicProjection;\n\texports.PBR2Material = PBR2Material;\n\texports.PBRMaterial = PBRMaterial;\n\texports.PIXEL_FORMAT = PIXEL_FORMAT;\n\texports.PIXEL_TYPE = PIXEL_TYPE;\n\texports.PerspectiveProjection = PerspectiveProjection;\n\texports.PhongMaterial = PhongMaterial;\n\texports.Plane = Plane;\n\texports.PlaneGeometry = PlaneGeometry;\n\texports.PointLight = PointLight;\n\texports.PointLightShadow = PointLightShadow;\n\texports.PointsMaterial = PointsMaterial;\n\texports.PropertyBindingMixer = PropertyBindingMixer;\n\texports.PropertyMap = PropertyMap;\n\texports.QUERYSET_TYPE = QUERYSET_TYPE;\n\texports.QUERY_TYPE = QUERY_TYPE;\n\texports.Quaternion = Quaternion;\n\texports.QuaternionCubicSplineInterpolant = QuaternionCubicSplineInterpolant;\n\texports.QuaternionKeyframeTrack = QuaternionKeyframeTrack;\n\texports.QuaternionLinearInterpolant = QuaternionLinearInterpolant;\n\texports.Query = Query;\n\texports.QuerySet = QuerySet;\n\texports.Ray = Ray;\n\texports.Raycaster = Raycaster;\n\texports.RectAreaLight = RectAreaLight;\n\texports.RenderBuffer = RenderBuffer;\n\texports.RenderInfo = RenderInfo;\n\texports.RenderQueue = RenderQueue;\n\texports.RenderQueueLayer = RenderQueueLayer;\n\texports.RenderStates = RenderStates;\n\texports.RenderTarget2D = RenderTarget2D;\n\texports.RenderTarget2DArray = RenderTarget2DArray;\n\texports.RenderTarget3D = RenderTarget3D;\n\texports.RenderTargetBack = ScreenRenderTarget;\n\texports.RenderTargetBase = RenderTargetBase;\n\texports.RenderTargetCube = RenderTargetCube;\n\texports.SHADING_TYPE = SHADING_TYPE;\n\texports.SHADOW_TYPE = SHADOW_TYPE;\n\texports.Scene = Scene;\n\texports.SceneData = SceneData;\n\texports.ScreenRenderTarget = ScreenRenderTarget;\n\texports.ShaderChunk = ShaderChunk;\n\texports.ShaderLib = ShaderLib;\n\texports.ShaderMaterial = ShaderMaterial;\n\texports.ShaderPostPass = ShaderPostPass;\n\texports.ShadowMapPass = ShadowMapPass;\n\texports.Skeleton = Skeleton;\n\texports.SkinnedMesh = SkinnedMesh;\n\texports.Sphere = Sphere;\n\texports.SphereGeometry = SphereGeometry;\n\texports.Spherical = Spherical;\n\texports.SphericalHarmonics3 = SphericalHarmonics3;\n\texports.SphericalHarmonicsLight = SphericalHarmonicsLight;\n\texports.SpotLight = SpotLight;\n\texports.SpotLightShadow = SpotLightShadow;\n\texports.StepInterpolant = StepInterpolant;\n\texports.StringKeyframeTrack = StringKeyframeTrack;\n\texports.TEXEL_ENCODING_TYPE = TEXEL_ENCODING_TYPE;\n\texports.TEXTURE_FILTER = TEXTURE_FILTER;\n\texports.TEXTURE_WRAP = TEXTURE_WRAP;\n\texports.Texture2D = Texture2D;\n\texports.Texture2DArray = Texture2DArray;\n\texports.Texture3D = Texture3D;\n\texports.TextureBase = TextureBase;\n\texports.TextureCube = TextureCube;\n\texports.ThinRenderer = ThinRenderer;\n\texports.TorusKnotGeometry = TorusKnotGeometry;\n\texports.TransformUV = TransformUV;\n\texports.Triangle = Triangle;\n\texports.VERTEX_COLOR = VERTEX_COLOR;\n\texports.Vector2 = Vector2;\n\texports.Vector3 = Vector3;\n\texports.Vector4 = Vector4;\n\texports.VectorKeyframeTrack = VectorKeyframeTrack;\n\texports.WebGLAttribute = WebGLAttribute;\n\texports.WebGLCapabilities = WebGLCapabilities;\n\texports.WebGLGeometries = WebGLGeometries;\n\texports.WebGLProgram = WebGLProgram;\n\texports.WebGLPrograms = WebGLPrograms;\n\texports.WebGLQueries = WebGLQueries;\n\texports.WebGLQuerySets = WebGLQuerySets;\n\texports.WebGLRenderBuffers = WebGLRenderBuffers;\n\texports.WebGLRenderer = WebGLRenderer;\n\texports.WebGLState = WebGLState;\n\texports.WebGLTextures = WebGLTextures;\n\texports.WebGLUniforms = WebGLUniforms;\n\texports.cloneJson = cloneJson;\n\texports.cloneUniforms = cloneUniforms;\n\texports.generateUUID = generateUUID;\n\texports.isPowerOfTwo = isPowerOfTwo;\n\texports.nearestPowerOfTwo = nearestPowerOfTwo;\n\texports.nextPowerOfTwo = nextPowerOfTwo;\n\n}));\n"
  },
  {
    "path": "build/t3d.module.js",
    "content": "/**\n * @license\n * Copyright 2021-present uino\n * SPDX-License-Identifier: BSD-3-Clause\n */\n/**\n * An utility class for mathematical operations.\n */\nclass MathUtils {\n\n\t/**\n\t * Method for generate uuid.\n\t * http://stackoverflow.com/questions/105034/how-to-create-a-guid-uuid-in-javascript/21963136#21963136\n\t * @returns {string} - The uuid.\n\t */\n\tstatic generateUUID() {\n\t\tconst d0 = Math.random() * 0xffffffff | 0;\n\t\tconst d1 = Math.random() * 0xffffffff | 0;\n\t\tconst d2 = Math.random() * 0xffffffff | 0;\n\t\tconst d3 = Math.random() * 0xffffffff | 0;\n\t\tconst uuid = _lut[d0 & 0xff] + _lut[d0 >> 8 & 0xff] + _lut[d0 >> 16 & 0xff] + _lut[d0 >> 24 & 0xff] + '-' +\n\t\t\t_lut[d1 & 0xff] + _lut[d1 >> 8 & 0xff] + '-' + _lut[d1 >> 16 & 0x0f | 0x40] + _lut[d1 >> 24 & 0xff] + '-' +\n\t\t\t_lut[d2 & 0x3f | 0x80] + _lut[d2 >> 8 & 0xff] + '-' + _lut[d2 >> 16 & 0xff] + _lut[d2 >> 24 & 0xff] +\n\t\t\t_lut[d3 & 0xff] + _lut[d3 >> 8 & 0xff] + _lut[d3 >> 16 & 0xff] + _lut[d3 >> 24 & 0xff];\n\n\t\t// .toUpperCase() here flattens concatenated strings to save heap memory space.\n\t\treturn uuid.toUpperCase();\n\t}\n\n\t/**\n\t * Returns a value linearly interpolated from two known points based on the given interval - t = 0 will return x and t = 1 will return y.\n\t * @param {number} x - The first value.\n\t * @param {number} y - The second value.\n\t * @param {number} t - The interpolation factor.\n\t * @returns {number} - The interpolated value.\n\t */\n\tstatic lerp(x, y, t) {\n\t\treturn x + (y - x) * t;\n\t}\n\n\t/**\n\t * Clamps the value to be between min and max.\n\t * @param {number} value - Value to be clamped.\n\t * @param {number} min - The minimum value.\n\t * @param {number} max - The maximum value.\n\t * @returns {number} - The clamped value.\n\t */\n\tstatic clamp(value, min, max) {\n\t\treturn Math.max(min, Math.min(max, value));\n\t}\n\n\t/**\n\t * Compute euclidean modulo of m % n.\n\t * Refer to: https://en.wikipedia.org/wiki/Modulo_operation\n\t * @param {number} n - The dividend.\n\t * @param {number} m - The divisor.\n\t * @returns {number} - The result of the modulo operation.\n\t */\n\tstatic euclideanModulo(n, m) {\n\t\treturn ((n % m) + m) % m;\n\t}\n\n\t/**\n\t * Performs a linear mapping from range `<a1, a2>` to range `<b1, b2>`\n\t * for the given value.\n\t * @param {number} x - The value to be mapped.\n\t * @param {number} a1 - Minimum value for range A.\n\t * @param {number} a2 - Maximum value for range A.\n\t * @param {number} b1 - Minimum value for range B.\n\t * @param {number} b2 - Maximum value for range B.\n\t * @returns {number} The mapped value.\n\t */\n\tstatic mapLinear(x, a1, a2, b1, b2) {\n\t\treturn b1 + (x - a1) * (b2 - b1) / (a2 - a1);\n\t}\n\n\t/**\n\t * Is this number a power of two.\n\t * @param {number} value - The input number.\n\t * @returns {boolean} - Is this number a power of two.\n\t */\n\tstatic isPowerOfTwo(value) {\n\t\treturn (value & (value - 1)) === 0 && value !== 0;\n\t}\n\n\t/**\n\t * Return the nearest power of two number of this number.\n\t * @param {number} value - The input number.\n\t * @returns {number} - The result number.\n\t */\n\tstatic nearestPowerOfTwo(value) {\n\t\treturn Math.pow(2, Math.round(Math.log(value) / Math.LN2));\n\t}\n\n\t/**\n\t * Return the next power of two number of this number.\n\t * @param {number} value - The input number.\n\t * @returns {number} - The result number.\n\t */\n\tstatic nextPowerOfTwo(value) {\n\t\tvalue--;\n\t\tvalue |= value >> 1;\n\t\tvalue |= value >> 2;\n\t\tvalue |= value >> 4;\n\t\tvalue |= value >> 8;\n\t\tvalue |= value >> 16;\n\t\tvalue++;\n\n\t\treturn value;\n\t}\n\n\t/**\n\t * Return the next power of two square size of this number.\n\t * This method is usually used to calculate the minimum 2d texture size based on the pixel length.\n\t * @param {number} value - The input number.\n\t * @returns {number} - The result size.\n\t */\n\tstatic nextPowerOfTwoSquareSize(value) {\n\t\treturn this.nextPowerOfTwo(Math.ceil(Math.sqrt(value)));\n\t}\n\n\t/**\n\t * Denormalizes a value based on the type of the provided array.\n\t * @param {number} value - The value to be denormalized.\n\t * @param {TypedArray} array - The typed array to determine the normalization factor.\n\t * @returns {number} - The denormalized value.\n\t * @throws {Error} - Throws an error if the array type is invalid.\n\t */\n\tstatic denormalize(value, array) {\n\t\tswitch (array.constructor) {\n\t\t\tcase Float32Array:\n\t\t\t\treturn value;\n\t\t\tcase Uint32Array:\n\t\t\t\treturn value / 4294967295.0;\n\t\t\tcase Uint16Array:\n\t\t\t\treturn value / 65535.0;\n\t\t\tcase Uint8Array:\n\t\t\t\treturn value / 255.0;\n\t\t\tcase Int32Array:\n\t\t\t\treturn Math.max(value / 2147483647.0, -1);\n\t\t\tcase Int16Array:\n\t\t\t\treturn Math.max(value / 32767.0, -1);\n\t\t\tcase Int8Array:\n\t\t\t\treturn Math.max(value / 127.0, -1);\n\t\t\tdefault:\n\t\t\t\tthrow new Error('Invalid component type.');\n\t\t}\n\t}\n\n\t/**\n\t * Normalizes a value based on the type of the provided array.\n\t * @param {number} value - The value to be normalized.\n\t * @param {TypedArray} array - The typed array to determine the normalization factor.\n\t * @returns {number} - The normalized value.\n\t * @throws {Error} - Throws an error if the array type is invalid.\n\t */\n\tstatic normalize(value, array) {\n\t\tswitch (array.constructor) {\n\t\t\tcase Float32Array:\n\t\t\t\treturn value;\n\t\t\tcase Uint32Array:\n\t\t\t\treturn Math.round(value * 4294967295.0);\n\t\t\tcase Uint16Array:\n\t\t\t\treturn Math.round(value * 65535.0);\n\t\t\tcase Uint8Array:\n\t\t\t\treturn Math.round(value * 255.0);\n\t\t\tcase Int32Array:\n\t\t\t\treturn Math.round(value * 2147483647.0);\n\t\t\tcase Int16Array:\n\t\t\t\treturn Math.round(value * 32767.0);\n\t\t\tcase Int8Array:\n\t\t\t\treturn Math.round(value * 127.0);\n\t\t\tdefault:\n\t\t\t\tthrow new Error('Invalid component type.');\n\t\t}\n\t}\n\n\t/**\n\t * Converts float to half float.\n\t * @param {number} val - The float value.\n\t * @returns {number} - The half float value.\n\t */\n\tstatic toHalfFloat(val) {\n\t\tif (Math.abs(val) > 65504) {\n\t\t\tconsole.warn('MathUtils.toHalfFloat(): Value out of range.');\n\t\t\tval = this.clamp(val, -65504, 65504);\n\t\t}\n\n\t\t_tables.floatView[0] = val;\n\t\tconst f = _tables.uint32View[0];\n\t\tconst e = (f >> 23) & 0x1ff;\n\t\treturn _tables.baseTable[e] + ((f & 0x007fffff) >> _tables.shiftTable[e]);\n\t}\n\n\t/**\n\t * Converts half float to float.\n\t * @param {number} val - The half float value.\n\t * @returns {number} - The float value.\n\t */\n\tstatic fromHalfFloat(val) {\n\t\tconst m = val >> 10;\n\t\t_tables.uint32View[0] = _tables.mantissaTable[_tables.offsetTable[m] + (val & 0x3ff)] + _tables.exponentTable[m];\n\t\treturn _tables.floatView[0];\n\t}\n\n}\n\nconst _lut = [];\nfor (let i = 0; i < 256; i++) {\n\t_lut[i] = (i < 16 ? '0' : '') + (i).toString(16);\n}\n\n// Fast Half Float Conversions, http://www.fox-toolkit.org/ftp/fasthalffloatconversion.pdf\n\nconst _tables = _generateTables();\n\nfunction _generateTables() {\n\t// float32 to float16 helpers\n\n\tconst buffer = new ArrayBuffer(4);\n\tconst floatView = new Float32Array(buffer);\n\tconst uint32View = new Uint32Array(buffer);\n\n\tconst baseTable = new Uint32Array(512);\n\tconst shiftTable = new Uint32Array(512);\n\n\tfor (let i = 0; i < 256; ++i) {\n\t\tconst e = i - 127;\n\n\t\tif (e < -27) { // very small number (0, -0)\n\t\t\tbaseTable[i] = 0x0000;\n\t\t\tbaseTable[i | 0x100] = 0x8000;\n\t\t\tshiftTable[i] = 24;\n\t\t\tshiftTable[i | 0x100] = 24;\n\t\t} else if (e < -14) { // small number (denorm)\n\t\t\tbaseTable[i] = 0x0400 >> (-e - 14);\n\t\t\tbaseTable[i | 0x100] = (0x0400 >> (-e - 14)) | 0x8000;\n\t\t\tshiftTable[i] = -e - 1;\n\t\t\tshiftTable[i | 0x100] = -e - 1;\n\t\t} else if (e <= 15) { // normal number\n\t\t\tbaseTable[i] = (e + 15) << 10;\n\t\t\tbaseTable[i | 0x100] = ((e + 15) << 10) | 0x8000;\n\t\t\tshiftTable[i] = 13;\n\t\t\tshiftTable[i | 0x100] = 13;\n\t\t} else if (e < 128) { // large number (Infinity, -Infinity)\n\t\t\tbaseTable[i] = 0x7c00;\n\t\t\tbaseTable[i | 0x100] = 0xfc00;\n\t\t\tshiftTable[i] = 24;\n\t\t\tshiftTable[i | 0x100] = 24;\n\t\t} else { // stay (NaN, Infinity, -Infinity)\n\t\t\tbaseTable[i] = 0x7c00;\n\t\t\tbaseTable[i | 0x100] = 0xfc00;\n\t\t\tshiftTable[i] = 13;\n\t\t\tshiftTable[i | 0x100] = 13;\n\t\t}\n\t}\n\n\t// float16 to float32 helpers\n\n\tconst mantissaTable = new Uint32Array(2048);\n\tconst exponentTable = new Uint32Array(64);\n\tconst offsetTable = new Uint32Array(64);\n\n\tfor (let i = 1; i < 1024; ++i) {\n\t\tlet m = i << 13; // zero pad mantissa bits\n\t\tlet e = 0; // zero exponent\n\n\t\t// normalized\n\t\twhile ((m & 0x00800000) === 0) {\n\t\t\tm <<= 1;\n\t\t\te -= 0x00800000; // decrement exponent\n\t\t}\n\n\t\tm &= -8388609; // clear leading 1 bit\n\t\te += 0x38800000; // adjust bias\n\n\t\tmantissaTable[i] = m | e;\n\t}\n\n\tfor (let i = 1024; i < 2048; ++i) {\n\t\tmantissaTable[i] = 0x38000000 + ((i - 1024) << 13);\n\t}\n\n\tfor (let i = 1; i < 31; ++i) {\n\t\texponentTable[i] = i << 23;\n\t}\n\n\texponentTable[31] = 0x47800000;\n\texponentTable[32] = 0x80000000;\n\n\tfor (let i = 33; i < 63; ++i) {\n\t\texponentTable[i] = 0x80000000 + ((i - 32) << 23);\n\t}\n\n\texponentTable[63] = 0xc7800000;\n\n\tfor (let i = 1; i < 64; ++i) {\n\t\tif (i !== 32) {\n\t\t\toffsetTable[i] = 1024;\n\t\t}\n\t}\n\n\treturn {\n\t\tfloatView: floatView,\n\t\tuint32View: uint32View,\n\t\tbaseTable: baseTable,\n\t\tshiftTable: shiftTable,\n\t\tmantissaTable: mantissaTable,\n\t\texponentTable: exponentTable,\n\t\toffsetTable: offsetTable\n\t};\n}\n\n/**\n * Class representing a 3D vector.\n */\nclass Vector3 {\n\n\t/**\n\t * Constructs a new 3D vector.\n\t * @param {number} [x=0] - The x value of this vector.\n\t * @param {number} [y=0] - The y value of this vector.\n\t * @param {number} [z=0] - The z value of this vector.\n\t */\n\tconstructor(x = 0, y = 0, z = 0) {\n\t\t/**\n\t\t * The x value of this vector.\n\t\t * @type {number}\n\t\t */\n\t\tthis.x = x;\n\n\t\t/**\n\t\t * The y value of this vector.\n\t\t * @type {number}\n\t\t */\n\t\tthis.y = y;\n\n\t\t/**\n\t\t * The z value of this vector.\n\t\t * @type {number}\n\t\t */\n\t\tthis.z = z;\n\t}\n\n\t/**\n\t * Sets the vector components.\n\t * @param {number} x - The value of the x component.\n\t * @param {number} y - The value of the y component.\n\t * @param {number} z - The value of the z component.\n\t * @returns {Vector3} A reference to this vector.\n\t */\n\tset(x = 0, y = 0, z = 0) {\n\t\tthis.x = x;\n\t\tthis.y = y;\n\t\tthis.z = z;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the vector components to the same value.\n\t * @param {number} scalar - The value to set for all vector components.\n\t * @returns {Vector3} A reference to this vector.\n\t */\n\tsetScalar(scalar) {\n\t\tthis.x = scalar;\n\t\tthis.y = scalar;\n\t\tthis.z = scalar;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Returns a new vector with copied values from this instance.\n\t * @returns {Vector3} A clone of this instance.\n\t */\n\tclone() {\n\t\treturn new Vector3(this.x, this.y, this.z);\n\t}\n\n\t/**\n\t * Copies the values of the given vector to this instance.\n\t * @param {Vector3} v - The vector to copy.\n\t * @returns {Vector3} A reference to this vector.\n\t */\n\tcopy(v) {\n\t\tthis.x = v.x;\n\t\tthis.y = v.y;\n\t\tthis.z = v.z;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Adds the given vector to this instance.\n\t * @param {Vector3} v - The vector to add.\n\t * @returns {Vector3} A reference to this vector.\n\t */\n\tadd(v) {\n\t\tthis.x += v.x;\n\t\tthis.y += v.y;\n\t\tthis.z += v.z;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Adds the given scalar value to all components of this instance.\n\t * @param {number} s - The scalar to add.\n\t * @returns {Vector3} A reference to this vector.\n\t */\n\taddScalar(s) {\n\t\tthis.x += s;\n\t\tthis.y += s;\n\t\tthis.z += s;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Adds the given vectors and stores the result in this instance.\n\t * @param {Vector3} a - The first vector.\n\t * @param {Vector3} b - The second vector.\n\t * @returns {Vector3} A reference to this vector.\n\t */\n\taddVectors(a, b) {\n\t\tthis.x = a.x + b.x;\n\t\tthis.y = a.y + b.y;\n\t\tthis.z = a.z + b.z;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Adds the given vector scaled by the given factor to this instance.\n\t * @param {Vector3|Vector4} v - The vector.\n\t * @param {number} s - The factor that scales `v`.\n\t * @returns {Vector3} A reference to this vector.\n\t */\n\taddScaledVector(v, s) {\n\t\tthis.x += v.x * s;\n\t\tthis.y += v.y * s;\n\t\tthis.z += v.z * s;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Subtracts the given vector from this instance.\n\t * @param {Vector3} v - The vector to subtract.\n\t * @returns {Vector3} A reference to this vector.\n\t */\n\tsub(v) {\n\t\tthis.x -= v.x;\n\t\tthis.y -= v.y;\n\t\tthis.z -= v.z;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Subtracts the given vectors and stores the result in this instance.\n\t * @param {Vector3} a - The first vector.\n\t * @param {Vector3} b - The second vector.\n\t * @returns {Vector3} A reference to this vector.\n\t */\n\tsubVectors(a, b) {\n\t\tthis.x = a.x - b.x;\n\t\tthis.y = a.y - b.y;\n\t\tthis.z = a.z - b.z;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Multiplies the given vector with this instance.\n\t * @param {Vector3} v - The vector to multiply.\n\t * @returns {Vector3} A reference to this vector.\n\t */\n\tmultiply(v) {\n\t\tthis.x *= v.x;\n\t\tthis.y *= v.y;\n\t\tthis.z *= v.z;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Multiplies the given scalar value with all components of this instance.\n\t * @param {number} scalar - The scalar to multiply.\n\t * @returns {Vector3} A reference to this vector.\n\t */\n\tmultiplyScalar(scalar) {\n\t\tthis.x *= scalar;\n\t\tthis.y *= scalar;\n\t\tthis.z *= scalar;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Multiplies this vector with the given 3x3 matrix.\n\t * @param {Matrix3} m - The 3x3 matrix.\n\t * @returns {Vector3} A reference to this vector.\n\t */\n\tapplyMatrix3(m) {\n\t\tconst x = this.x, y = this.y, z = this.z;\n\t\tconst e = m.elements;\n\n\t\tthis.x = e[0] * x + e[3] * y + e[6] * z;\n\t\tthis.y = e[1] * x + e[4] * y + e[7] * z;\n\t\tthis.z = e[2] * x + e[5] * y + e[8] * z;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Multiplies this vector (with an implicit 1 in the 4th dimension) by m, and\n\t * divides by perspective.\n\t * @param {Matrix4} m - The matrix to apply.\n\t * @returns {Vector3} A reference to this vector.\n\t */\n\tapplyMatrix4(m) {\n\t\tconst x = this.x, y = this.y, z = this.z;\n\t\tconst e = m.elements;\n\n\t\tconst w = 1 / (e[3] * x + e[7] * y + e[11] * z + e[15]);\n\n\t\tthis.x = (e[0] * x + e[4] * y + e[8] * z + e[12]) * w;\n\t\tthis.y = (e[1] * x + e[5] * y + e[9] * z + e[13]) * w;\n\t\tthis.z = (e[2] * x + e[6] * y + e[10] * z + e[14]) * w;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Applies the given Quaternion to this vector.\n\t * @param {Quaternion} q - The Quaternion.\n\t * @returns {Vector3} A reference to this vector.\n\t */\n\tapplyQuaternion(q) {\n\t\tconst x = this.x, y = this.y, z = this.z;\n\t\tconst qx = q._x, qy = q._y, qz = q._z, qw = q._w;\n\n\t\t// calculate quat * vector\n\n\t\tconst ix = qw * x + qy * z - qz * y;\n\t\tconst iy = qw * y + qz * x - qx * z;\n\t\tconst iz = qw * z + qx * y - qy * x;\n\t\tconst iw = -qx * x - qy * y - qz * z;\n\n\t\t// calculate result * inverse quat\n\n\t\tthis.x = ix * qw + iw * -qx + iy * -qz - iz * -qy;\n\t\tthis.y = iy * qw + iw * -qy + iz * -qx - ix * -qz;\n\t\tthis.z = iz * qw + iw * -qz + ix * -qy - iy * -qx;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Projects this vector from world space into the camera's normalized\n\t * device coordinate (NDC) space.\n\t * @param {Camera} camera - The camera.\n\t * @returns {Vector3} A reference to this vector.\n\t */\n\tproject(camera) {\n\t\treturn this.applyMatrix4(camera.projectionViewMatrix);\n\t}\n\n\t/**\n\t * Unprojects this vector from the camera's normalized device coordinate (NDC)\n\t * space into world space.\n\t * @param {Camera} camera - The camera.\n\t * @returns {Vector3} A reference to this vector.\n\t */\n\tunproject(camera) {\n\t\treturn this.applyMatrix4(camera.projectionMatrixInverse).applyMatrix4(camera.worldMatrix);\n\t}\n\n\t/**\n\t * Transforms the direction of this vector by a matrix (the upper left 3 x 3\n\t * subset of the given 4x4 matrix and then normalizes the result.\n\t * @param {Matrix4} m - The matrix.\n\t * @returns {Vector3} A reference to this vector.\n\t */\n\ttransformDirection(m) {\n\t\t// input: Matrix4 affine matrix\n\t\t// vector interpreted as a direction\n\n\t\tconst x = this.x, y = this.y, z = this.z;\n\t\tconst e = m.elements;\n\n\t\tthis.x = e[0] * x + e[4] * y + e[8] * z;\n\t\tthis.y = e[1] * x + e[5] * y + e[9] * z;\n\t\tthis.z = e[2] * x + e[6] * y + e[10] * z;\n\n\t\treturn this.normalize();\n\t}\n\n\t/**\n\t * If this vector's x, y or z value is greater than the given vector's x, y or z\n\t * value, replace that value with the corresponding min value.\n\t * @param {Vector3} v - The vector.\n\t * @returns {Vector3} A reference to this vector.\n\t */\n\tmin(v) {\n\t\tthis.x = Math.min(this.x, v.x);\n\t\tthis.y = Math.min(this.y, v.y);\n\t\tthis.z = Math.min(this.z, v.z);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * If this vector's x, y or z value is less than the given vector's x, y or z\n\t * value, replace that value with the corresponding max value.\n\t * @param {Vector3} v - The vector.\n\t * @returns {Vector3} A reference to this vector.\n\t */\n\tmax(v) {\n\t\tthis.x = Math.max(this.x, v.x);\n\t\tthis.y = Math.max(this.y, v.y);\n\t\tthis.z = Math.max(this.z, v.z);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Inverts this vector - i.e. sets x = -x, y = -y and z = -z.\n\t * @returns {Vector3} A reference to this vector.\n\t */\n\tnegate() {\n\t\tthis.x = -this.x;\n\t\tthis.y = -this.y;\n\t\tthis.z = -this.z;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Calculates the dot product of the given vector with this instance.\n\t * @param {Vector3} v - The vector to compute the dot product with.\n\t * @returns {number} The result of the dot product.\n\t */\n\tdot(v) {\n\t\treturn this.x * v.x + this.y * v.y + this.z * v.z;\n\t}\n\n\t/**\n\t * Computes the square of the Euclidean length (straight-line length) from\n\t * (0, 0, 0) to (x, y, z). If you are comparing the lengths of vectors, you should\n\t * compare the length squared instead as it is slightly more efficient to calculate.\n\t * @returns {number} The square length of this vector.\n\t */\n\tgetLengthSquared() {\n\t\treturn this.x * this.x + this.y * this.y + this.z * this.z;\n\t}\n\n\t/**\n\t * Computes the  Euclidean length (straight-line length) from (0, 0, 0) to (x, y, z).\n\t * @returns {number} The length of this vector.\n\t */\n\tgetLength() {\n\t\treturn Math.sqrt(this.getLengthSquared());\n\t}\n\n\t/**\n\t * Converts this vector to a unit vector - that is, sets it equal to a vector\n\t * with the same direction as this one, but with a vector length of `1`.\n\t * @param {number} [thickness=1]\n\t * @returns {Vector3} A reference to this vector.\n\t */\n\tnormalize(thickness = 1) {\n\t\tconst length = this.getLength() || 1;\n\t\tconst invLength = thickness / length;\n\n\t\tthis.x *= invLength;\n\t\tthis.y *= invLength;\n\t\tthis.z *= invLength;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Linearly interpolates between the given vector and this instance, where\n\t * alpha is the percent distance along the line - alpha = 0 will be this\n\t * vector, and alpha = 1 will be the given one.\n\t * @param {Vector3} v - The vector to interpolate towards.\n\t * @param {number} alpha - The interpolation factor, typically in the closed interval `[0, 1]`.\n\t * @returns {Vector3} A reference to this vector.\n\t */\n\tlerp(v, alpha) {\n\t\tthis.x += (v.x - this.x) * alpha;\n\t\tthis.y += (v.y - this.y) * alpha;\n\t\tthis.z += (v.z - this.z) * alpha;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Linearly interpolates between the given vectors, where alpha is the percent\n\t * distance along the line - alpha = 0 will be first vector, and alpha = 1 will\n\t * be the second one. The result is stored in this instance.\n\t * @param {Vector3} v1 - The first vector.\n\t * @param {Vector3} v2 - The second vector.\n\t * @param {number} alpha - The interpolation factor, typically in the closed interval `[0, 1]`.\n\t * @returns {Vector3} A reference to this vector.\n\t */\n\tlerpVectors(v1, v2, alpha) {\n\t\tthis.x = v1.x + (v2.x - v1.x) * alpha;\n\t\tthis.y = v1.y + (v2.y - v1.y) * alpha;\n\t\tthis.z = v1.z + (v2.z - v1.z) * alpha;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Calculates the cross product of the given vector with this instance.\n\t * @param {Vector3} v - The vector to compute the cross product with.\n\t * @returns {Vector3} The result of the cross product.\n\t */\n\tcross(v) {\n\t\treturn this.crossVectors(this, v);\n\t}\n\n\t/**\n\t * Calculates the cross product of the given vectors and stores the result\n\t * in this instance.\n\t * @param {Vector3} a - The first vector.\n\t * @param {Vector3} b - The second vector.\n\t * @returns {Vector3} A reference to this vector.\n\t */\n\tcrossVectors(a, b) {\n\t\tconst ax = a.x, ay = a.y, az = a.z;\n\t\tconst bx = b.x, by = b.y, bz = b.z;\n\n\t\tthis.x = ay * bz - az * by;\n\t\tthis.y = az * bx - ax * bz;\n\t\tthis.z = ax * by - ay * bx;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Reflects this vector off a plane orthogonal to the given normal vector.\n\t * @param {Vector3} normal - The (normalized) normal vector.\n\t * @returns {Vector3} A reference to this vector.\n\t */\n\treflect(normal) {\n\t\treturn this.sub(_vector$2.copy(normal).multiplyScalar(2 * this.dot(normal)));\n\t}\n\n\t/**\n\t * Scales this vector along the given direction vector by the given scale factor.\n\t * @param {Vector3} direction - The (normalized) direction vector to scale along.\n\t * @param {number} scale - The scale factor.\n\t * @returns {Vector3} A reference to this vector.\n\t */\n\tscaleAlong(direction, scale) {\n\t\t_vector$2.copy(direction).multiplyScalar(this.dot(direction));\n\t\treturn this.sub(_vector$2).addScaledVector(_vector$2, scale);\n\t}\n\n\t/**\n\t * Returns the angle between the given vector and this instance in radians.\n\t * @param {Vector3} v - The vector to compute the angle with.\n\t * @returns {number} The angle in radians.\n\t */\n\tangleTo(v) {\n\t\tconst denominator = Math.sqrt(this.getLengthSquared() * v.getLengthSquared());\n\n\t\tif (denominator === 0) return Math.PI / 2;\n\n\t\tconst theta = this.dot(v) / denominator;\n\n\t\t// clamp, to handle numerical problems\n\n\t\treturn Math.acos(MathUtils.clamp(theta, -1, 1));\n\t}\n\n\t/**\n\t * Computes the distance from the given vector to this instance.\n\t * @param {Vector3} v - The vector to compute the distance to.\n\t * @returns {number} The distance.\n\t */\n\tdistanceTo(v) {\n\t\treturn Math.sqrt(this.distanceToSquared(v));\n\t}\n\n\t/**\n\t * Computes the squared distance from the given vector to this instance.\n\t * If you are just comparing the distance with another distance, you should compare\n\t * the distance squared instead as it is slightly more efficient to calculate.\n\t * @param {Vector3} v - The vector to compute the squared distance to.\n\t * @returns {number} The squared distance.\n\t */\n\tdistanceToSquared(v) {\n\t\tconst dx = this.x - v.x, dy = this.y - v.y, dz = this.z - v.z;\n\t\treturn dx * dx + dy * dy + dz * dz;\n\t}\n\n\t/**\n\t * Sets the vector components from the given spherical coordinates.\n\t * @param {Spherical} s - The spherical coordinates.\n\t * @returns {Vector3} A reference to this vector.\n\t */\n\tsetFromSpherical(s) {\n\t\tconst sinPhiRadius = Math.sin(s.phi) * s.radius;\n\n\t\tthis.x = sinPhiRadius * Math.sin(s.theta);\n\t\tthis.y = Math.cos(s.phi) * s.radius;\n\t\tthis.z = sinPhiRadius * Math.cos(s.theta);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the vector components to the position elements of the\n\t * given transformation matrix.\n\t * @param {Matrix4} m - The 4x4 matrix.\n\t * @returns {Vector3} A reference to this vector.\n\t */\n\tsetFromMatrixPosition(m) {\n\t\tconst e = m.elements;\n\n\t\tthis.x = e[12];\n\t\tthis.y = e[13];\n\t\tthis.z = e[14];\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the vector components to the scale elements of the\n\t * given transformation matrix.\n\t * @param {Matrix4} m - The 4x4 matrix.\n\t * @returns {Vector3} A reference to this vector.\n\t */\n\tsetFromMatrixScale(m) {\n\t\tconst sx = this.setFromMatrixColumn(m, 0).getLength();\n\t\tconst sy = this.setFromMatrixColumn(m, 1).getLength();\n\t\tconst sz = this.setFromMatrixColumn(m, 2).getLength();\n\t\treturn this.set(sx, sy, sz);\n\t}\n\n\t/**\n\t * Sets the vector components from the specified matrix column.\n\t * @param {Matrix4} m - The 4x4 matrix.\n\t * @param {number} index - The column index.\n\t * @returns {Vector3} A reference to this vector.\n\t */\n\tsetFromMatrixColumn(m, index) {\n\t\treturn this.fromArray(m.elements, index * 4);\n\t}\n\n\t/**\n\t * Returns `true` if this vector is equal with the given one.\n\t * @param {Vector3} v - The vector to test for equality.\n\t * @returns {boolean} Whether this vector is equal with the given one.\n\t */\n\tequals(v) {\n\t\treturn ((v.x === this.x) && (v.y === this.y) && (v.z === this.z));\n\t}\n\n\t/**\n\t * Sets this vector's x value to be `array[ offset ]`, y value to be `array[ offset + 1 ]`\n\t * and z value to be `array[ offset + 2 ]`.\n\t * @param {Array<number>} array - An array holding the vector component values.\n\t * @param {number} [offset=0] - The offset into the array.\n\t * @param {boolean} [denormalize=false] - If true, denormalize the values, and array should be a typed array.\n\t * @returns {Vector3} A reference to this vector.\n\t */\n\tfromArray(array, offset = 0, denormalize = false) {\n\t\tlet x = array[offset], y = array[offset + 1], z = array[offset + 2];\n\n\t\tif (denormalize) {\n\t\t\tx = MathUtils.denormalize(x, array);\n\t\t\ty = MathUtils.denormalize(y, array);\n\t\t\tz = MathUtils.denormalize(z, array);\n\t\t}\n\n\t\tthis.x = x;\n\t\tthis.y = y;\n\t\tthis.z = z;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Writes the components of this vector to the given array. If no array is provided,\n\t * the method returns a new instance.\n\t * @param {Array<number>} [array=[]] - The target array holding the vector components.\n\t * @param {number} [offset=0] - Index of the first element in the array.\n\t * @param {boolean} [normalize=false] - if true, normalize the values, and array should be a typed array.\n\t * @returns {Array<number>} The vector components.\n\t */\n\ttoArray(array = [], offset = 0, normalize = false) {\n\t\tlet x = this.x, y = this.y, z = this.z;\n\n\t\tif (normalize) {\n\t\t\tx = MathUtils.normalize(x, array);\n\t\t\ty = MathUtils.normalize(y, array);\n\t\t\tz = MathUtils.normalize(z, array);\n\t\t}\n\n\t\tarray[offset] = x;\n\t\tarray[offset + 1] = y;\n\t\tarray[offset + 2] = z;\n\n\t\treturn array;\n\t}\n\n\t* [Symbol.iterator]() {\n\t\tyield this.x;\n\t\tyield this.y;\n\t\tyield this.z;\n\t}\n\n}\n\n/**\n * This flag can be used for type testing.\n * @readonly\n * @type {boolean}\n * @default true\n */\nVector3.prototype.isVector3 = true;\n\nconst _vector$2 = new Vector3();\n\n/**\n * Represents a 4x4 matrix.\n */\nclass Matrix4 {\n\n\t/**\n\t * Constructs a new 4x4 matrix.\n\t */\n\tconstructor() {\n\t\t/**\n\t\t * A column-major list of matrix values.\n\t\t * @type {Array<number>}\n\t\t */\n\t\tthis.elements = [\n\t\t\t1, 0, 0, 0,\n\t\t\t0, 1, 0, 0,\n\t\t\t0, 0, 1, 0,\n\t\t\t0, 0, 0, 1\n\t\t];\n\t}\n\n\t/**\n\t * Sets the elements of the matrix.The arguments are supposed to be\n\t * in row-major order.\n\t * @param {number} [n11] - 1-1 matrix element.\n\t * @param {number} [n12] - 1-2 matrix element.\n\t * @param {number} [n13] - 1-3 matrix element.\n\t * @param {number} [n14] - 1-4 matrix element.\n\t * @param {number} [n21] - 2-1 matrix element.\n\t * @param {number} [n22] - 2-2 matrix element.\n\t * @param {number} [n23] - 2-3 matrix element.\n\t * @param {number} [n24] - 2-4 matrix element.\n\t * @param {number} [n31] - 3-1 matrix element.\n\t * @param {number} [n32] - 3-2 matrix element.\n\t * @param {number} [n33] - 3-3 matrix element.\n\t * @param {number} [n34] - 3-4 matrix element.\n\t * @param {number} [n41] - 4-1 matrix element.\n\t * @param {number} [n42] - 4-2 matrix element.\n\t * @param {number} [n43] - 4-3 matrix element.\n\t * @param {number} [n44] - 4-4 matrix element.\n\t * @returns {Matrix4} A reference to this matrix.\n\t */\n\tset(n11, n12, n13, n14, n21, n22, n23, n24, n31, n32, n33, n34, n41, n42, n43, n44) {\n\t\tconst ele = this.elements;\n\n\t\tele[0] = n11; ele[4] = n12; ele[8] = n13; ele[12] = n14;\n\t\tele[1] = n21; ele[5] = n22; ele[9] = n23; ele[13] = n24;\n\t\tele[2] = n31; ele[6] = n32; ele[10] = n33; ele[14] = n34;\n\t\tele[3] = n41; ele[7] = n42; ele[11] = n43; ele[15] = n44;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets this matrix to the 4x4 identity matrix.\n\t * @returns {Matrix4} A reference to this matrix.\n\t */\n\tidentity() {\n\t\treturn this.set(\n\t\t\t1, 0, 0, 0,\n\t\t\t0, 1, 0, 0,\n\t\t\t0, 0, 1, 0,\n\t\t\t0, 0, 0, 1\n\t\t);\n\t}\n\n\t/**\n\t * Checks if the matrix is an identity matrix.\n\t * @returns {boolean} - True if the matrix is an identity matrix, false otherwise.\n\t */\n\tisIdentity() {\n\t\tconst te = this.elements;\n\t\treturn te[0] === 1 && te[4] === 0 && te[8] === 0 && te[12] === 0\n\t\t\t&& te[1] === 0 && te[5] === 1 && te[9] === 0 && te[13] === 0\n\t\t\t&& te[2] === 0 && te[6] === 0 && te[10] === 1 && te[14] === 0\n\t\t\t&& te[3] === 0 && te[7] === 0 && te[11] === 0 && te[15] === 1;\n\t}\n\n\t/**\n\t * Returns a matrix with copied values from this instance.\n\t * @returns {Matrix4} A clone of this instance.\n\t */\n\tclone() {\n\t\treturn new Matrix4().fromArray(this.elements);\n\t}\n\n\t/**\n\t * Copies the values of the given matrix to this instance.\n\t * @param {Matrix4} m - The matrix to copy.\n\t * @returns {Matrix4} A reference to this matrix.\n\t */\n\tcopy(m) {\n\t\tconst te = this.elements;\n\t\tconst me = m.elements;\n\n\t\tte[0] = me[0]; te[1] = me[1]; te[2] = me[2]; te[3] = me[3];\n\t\tte[4] = me[4]; te[5] = me[5]; te[6] = me[6]; te[7] = me[7];\n\t\tte[8] = me[8]; te[9] = me[9]; te[10] = me[10]; te[11] = me[11];\n\t\tte[12] = me[12]; te[13] = me[13]; te[14] = me[14]; te[15] = me[15];\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Set the upper 3x3 elements of this matrix to the values of given 3x3 matrix.\n\t * @param {Matrix3} m - The 3x3 matrix.\n\t * @returns {Matrix4} A reference to this matrix.\n\t */\n\tsetFromMatrix3(m) {\n\t\tconst me = m.elements;\n\n\t\treturn this.set(\n\t\t\tme[0], me[3], me[6], 0,\n\t\t\tme[1], me[4], me[7], 0,\n\t\t\tme[2], me[5], me[8], 0,\n\t\t\t0, 0, 0, 1\n\t\t);\n\t}\n\n\t/**\n\t * Extracts the basis of this matrix into the three axis vectors provided.\n\t * @param {Vector3} xAxis - The basis's x axis.\n\t * @param {Vector3} yAxis - The basis's y axis.\n\t * @param {Vector3} zAxis - The basis's z axis.\n\t * @returns {Matrix4} A reference to this matrix.\n\t */\n\textractBasis(xAxis, yAxis, zAxis) {\n\t\txAxis.setFromMatrixColumn(this, 0);\n\t\tyAxis.setFromMatrixColumn(this, 1);\n\t\tzAxis.setFromMatrixColumn(this, 2);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the given basis vectors to this matrix.\n\t * @param {Vector3} xAxis - The basis's x axis.\n\t * @param {Vector3} yAxis - The basis's y axis.\n\t * @param {Vector3} zAxis - The basis's z axis.\n\t * @returns {Matrix4} A reference to this matrix.\n\t */\n\tmakeBasis(xAxis, yAxis, zAxis) {\n\t\tthis.set(\n\t\t\txAxis.x, yAxis.x, zAxis.x, 0,\n\t\t\txAxis.y, yAxis.y, zAxis.y, 0,\n\t\t\txAxis.z, yAxis.z, zAxis.z, 0,\n\t\t\t0, 0, 0, 1\n\t\t);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Extracts the rotation component of the given matrix\n\t * into this matrix's rotation component.\n\t *\n\t * Note: This method does not support reflection matrices.\n\t * @param {Matrix4} m - The matrix.\n\t * @returns {Matrix4} A reference to this matrix.\n\t */\n\textractRotation(m) {\n\t\tconst te = this.elements;\n\t\tconst me = m.elements;\n\n\t\tconst scaleX = 1 / _vec3_1$6.setFromMatrixColumn(m, 0).getLength();\n\t\tconst scaleY = 1 / _vec3_1$6.setFromMatrixColumn(m, 1).getLength();\n\t\tconst scaleZ = 1 / _vec3_1$6.setFromMatrixColumn(m, 2).getLength();\n\n\t\tte[0] = me[0] * scaleX;\n\t\tte[1] = me[1] * scaleX;\n\t\tte[2] = me[2] * scaleX;\n\t\tte[3] = 0;\n\n\t\tte[4] = me[4] * scaleY;\n\t\tte[5] = me[5] * scaleY;\n\t\tte[6] = me[6] * scaleY;\n\t\tte[7] = 0;\n\n\t\tte[8] = me[8] * scaleZ;\n\t\tte[9] = me[9] * scaleZ;\n\t\tte[10] = me[10] * scaleZ;\n\t\tte[11] = 0;\n\n\t\tte[12] = 0;\n\t\tte[13] = 0;\n\t\tte[14] = 0;\n\t\tte[15] = 1;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the rotation component (the upper left 3x3 matrix) of this matrix to\n\t * the rotation specified by the given Euler angles. The rest of\n\t * the matrix is set to the identity. Depending on the {@link Euler#order},\n\t * there are six possible outcomes. See [this page]{@link https://en.wikipedia.org/wiki/Euler_angles#Rotation_matrix}\n\t * for a complete list.\n\t * @param {Euler} euler - The Euler angles.\n\t * @returns {Matrix4} A reference to this matrix.\n\t */\n\tmakeRotationFromEuler(euler) {\n\t\tconst te = this.elements;\n\n\t\tconst x = euler.x, y = euler.y, z = euler.z;\n\t\tconst a = Math.cos(x), b = Math.sin(x);\n\t\tconst c = Math.cos(y), d = Math.sin(y);\n\t\tconst e = Math.cos(z), f = Math.sin(z);\n\n\t\tif (euler.order === 'XYZ') {\n\t\t\tconst ae = a * e, af = a * f, be = b * e, bf = b * f;\n\n\t\t\tte[0] = c * e;\n\t\t\tte[4] = -c * f;\n\t\t\tte[8] = d;\n\n\t\t\tte[1] = af + be * d;\n\t\t\tte[5] = ae - bf * d;\n\t\t\tte[9] = -b * c;\n\n\t\t\tte[2] = bf - ae * d;\n\t\t\tte[6] = be + af * d;\n\t\t\tte[10] = a * c;\n\t\t} else if (euler.order === 'YXZ') {\n\t\t\tconst ce = c * e, cf = c * f, de = d * e, df = d * f;\n\n\t\t\tte[0] = ce + df * b;\n\t\t\tte[4] = de * b - cf;\n\t\t\tte[8] = a * d;\n\n\t\t\tte[1] = a * f;\n\t\t\tte[5] = a * e;\n\t\t\tte[9] = -b;\n\n\t\t\tte[2] = cf * b - de;\n\t\t\tte[6] = df + ce * b;\n\t\t\tte[10] = a * c;\n\t\t} else if (euler.order === 'ZXY') {\n\t\t\tconst ce = c * e, cf = c * f, de = d * e, df = d * f;\n\n\t\t\tte[0] = ce - df * b;\n\t\t\tte[4] = -a * f;\n\t\t\tte[8] = de + cf * b;\n\n\t\t\tte[1] = cf + de * b;\n\t\t\tte[5] = a * e;\n\t\t\tte[9] = df - ce * b;\n\n\t\t\tte[2] = -a * d;\n\t\t\tte[6] = b;\n\t\t\tte[10] = a * c;\n\t\t} else if (euler.order === 'ZYX') {\n\t\t\tconst ae = a * e, af = a * f, be = b * e, bf = b * f;\n\n\t\t\tte[0] = c * e;\n\t\t\tte[4] = be * d - af;\n\t\t\tte[8] = ae * d + bf;\n\n\t\t\tte[1] = c * f;\n\t\t\tte[5] = bf * d + ae;\n\t\t\tte[9] = af * d - be;\n\n\t\t\tte[2] = -d;\n\t\t\tte[6] = b * c;\n\t\t\tte[10] = a * c;\n\t\t} else if (euler.order === 'YZX') {\n\t\t\tconst ac = a * c, ad = a * d, bc = b * c, bd = b * d;\n\n\t\t\tte[0] = c * e;\n\t\t\tte[4] = bd - ac * f;\n\t\t\tte[8] = bc * f + ad;\n\n\t\t\tte[1] = f;\n\t\t\tte[5] = a * e;\n\t\t\tte[9] = -b * e;\n\n\t\t\tte[2] = -d * e;\n\t\t\tte[6] = ad * f + bc;\n\t\t\tte[10] = ac - bd * f;\n\t\t} else if (euler.order === 'XZY') {\n\t\t\tconst ac = a * c, ad = a * d, bc = b * c, bd = b * d;\n\n\t\t\tte[0] = c * e;\n\t\t\tte[4] = -f;\n\t\t\tte[8] = d * e;\n\n\t\t\tte[1] = ac * f + bd;\n\t\t\tte[5] = a * e;\n\t\t\tte[9] = ad * f - bc;\n\n\t\t\tte[2] = bc * f - ad;\n\t\t\tte[6] = b * e;\n\t\t\tte[10] = bd * f + ac;\n\t\t}\n\n\t\t// bottom row\n\t\tte[3] = 0;\n\t\tte[7] = 0;\n\t\tte[11] = 0;\n\n\t\t// last column\n\t\tte[12] = 0;\n\t\tte[13] = 0;\n\t\tte[14] = 0;\n\t\tte[15] = 1;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the rotation component of this matrix to the rotation specified by q, as outlined here.\n\t * @param {Quaternion} q\n\t * @returns {Matrix4}\n\t */\n\tmakeRotationFromQuaternion(q) {\n\t\treturn this.compose(_zero, q, _one);\n\t}\n\n\t/**\n\t * Constructs a rotation matrix, looking from eye towards center oriented by the up vector.\n\t * @param {Vector3} eye - The eye vector.\n\t * @param {Vector3} target - The target vector.\n\t * @param {Vector3} up - The up vector.\n\t * @returns {Matrix4} A reference to this matrix.\n\t */\n\tlookAtRH(eye, target, up) {\n\t\tconst te = this.elements;\n\n\t\t_z.subVectors(eye, target);\n\n\t\tif (_z.getLengthSquared() === 0) {\n\t\t\t// eye and target are in the same position\n\t\t\t_z.z = 1;\n\t\t}\n\n\t\t_z.normalize();\n\t\t_x.crossVectors(up, _z);\n\n\t\tif (_x.getLengthSquared() === 0) {\n\t\t\t// up and z are parallel\n\n\t\t\tif (Math.abs(up.z) === 1) {\n\t\t\t\t_z.x += 0.0001;\n\t\t\t} else {\n\t\t\t\t_z.z += 0.0001;\n\t\t\t}\n\n\t\t\t_z.normalize();\n\t\t\t_x.crossVectors(up, _z);\n\t\t}\n\n\t\t_x.normalize();\n\t\t_y.crossVectors(_z, _x);\n\n\t\tte[0] = _x.x; te[4] = _y.x; te[8] = _z.x;\n\t\tte[1] = _x.y; te[5] = _y.y; te[9] = _z.y;\n\t\tte[2] = _x.z; te[6] = _y.z; te[10] = _z.z;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Post-multiplies this matrix by the given 4x4 matrix.\n\t * @param {Matrix4} m - The matrix to multiply with.\n\t * @returns {Matrix4} A reference to this matrix.\n\t */\n\tmultiply(m) {\n\t\treturn this.multiplyMatrices(this, m);\n\t}\n\n\t/**\n\t * Pre-multiplies this matrix by the given 4x4 matrix.\n\t * @param {Matrix4} m - The matrix to multiply with.\n\t * @returns {Matrix4} A reference to this matrix.\n\t */\n\tpremultiply(m) {\n\t\treturn this.multiplyMatrices(m, this);\n\t}\n\n\t/**\n\t * Multiples the given 4x4 matrices and stores the result\n\t * in this matrix.\n\t * @param {Matrix4} a - The first matrix.\n\t * @param {Matrix4} b - The second matrix.\n\t * @returns {Matrix4} A reference to this matrix.\n\t */\n\tmultiplyMatrices(a, b) {\n\t\tconst ae = a.elements;\n\t\tconst be = b.elements;\n\t\tconst te = this.elements;\n\n\t\tconst a11 = ae[0], a12 = ae[4], a13 = ae[8], a14 = ae[12];\n\t\tconst a21 = ae[1], a22 = ae[5], a23 = ae[9], a24 = ae[13];\n\t\tconst a31 = ae[2], a32 = ae[6], a33 = ae[10], a34 = ae[14];\n\t\tconst a41 = ae[3], a42 = ae[7], a43 = ae[11], a44 = ae[15];\n\n\t\tconst b11 = be[0], b12 = be[4], b13 = be[8], b14 = be[12];\n\t\tconst b21 = be[1], b22 = be[5], b23 = be[9], b24 = be[13];\n\t\tconst b31 = be[2], b32 = be[6], b33 = be[10], b34 = be[14];\n\t\tconst b41 = be[3], b42 = be[7], b43 = be[11], b44 = be[15];\n\n\t\tte[0] = a11 * b11 + a12 * b21 + a13 * b31 + a14 * b41;\n\t\tte[4] = a11 * b12 + a12 * b22 + a13 * b32 + a14 * b42;\n\t\tte[8] = a11 * b13 + a12 * b23 + a13 * b33 + a14 * b43;\n\t\tte[12] = a11 * b14 + a12 * b24 + a13 * b34 + a14 * b44;\n\n\t\tte[1] = a21 * b11 + a22 * b21 + a23 * b31 + a24 * b41;\n\t\tte[5] = a21 * b12 + a22 * b22 + a23 * b32 + a24 * b42;\n\t\tte[9] = a21 * b13 + a22 * b23 + a23 * b33 + a24 * b43;\n\t\tte[13] = a21 * b14 + a22 * b24 + a23 * b34 + a24 * b44;\n\n\t\tte[2] = a31 * b11 + a32 * b21 + a33 * b31 + a34 * b41;\n\t\tte[6] = a31 * b12 + a32 * b22 + a33 * b32 + a34 * b42;\n\t\tte[10] = a31 * b13 + a32 * b23 + a33 * b33 + a34 * b43;\n\t\tte[14] = a31 * b14 + a32 * b24 + a33 * b34 + a34 * b44;\n\n\t\tte[3] = a41 * b11 + a42 * b21 + a43 * b31 + a44 * b41;\n\t\tte[7] = a41 * b12 + a42 * b22 + a43 * b32 + a44 * b42;\n\t\tte[11] = a41 * b13 + a42 * b23 + a43 * b33 + a44 * b43;\n\t\tte[15] = a41 * b14 + a42 * b24 + a43 * b34 + a44 * b44;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Computes and returns the determinant of this matrix.\n\t * Based on the method outlined [here]{@link http://www.euclideanspace.com/maths/algebra/matrix/functions/inverse/fourD/index.html}.\n\t * @returns {number} The determinant.\n\t */\n\tdeterminant() {\n\t\tconst te = this.elements;\n\n\t\tconst n11 = te[0], n12 = te[4], n13 = te[8], n14 = te[12];\n\t\tconst n21 = te[1], n22 = te[5], n23 = te[9], n24 = te[13];\n\t\tconst n31 = te[2], n32 = te[6], n33 = te[10], n34 = te[14];\n\t\tconst n41 = te[3], n42 = te[7], n43 = te[11], n44 = te[15];\n\n\t\t// TODO: make this more efficient\n\n\t\treturn (\n\t\t\tn41 * (\n\t\t\t\t+n14 * n23 * n32\n\t\t\t\t- n13 * n24 * n32\n\t\t\t\t- n14 * n22 * n33\n\t\t\t\t+ n12 * n24 * n33\n\t\t\t\t+ n13 * n22 * n34\n\t\t\t\t- n12 * n23 * n34\n\t\t\t) +\n\t\t\tn42 * (\n\t\t\t\t+n11 * n23 * n34\n\t\t\t\t - n11 * n24 * n33\n\t\t\t\t + n14 * n21 * n33\n\t\t\t\t - n13 * n21 * n34\n\t\t\t\t + n13 * n24 * n31\n\t\t\t\t - n14 * n23 * n31\n\t\t\t) +\n\t\t\tn43 * (\n\t\t\t\t+n11 * n24 * n32\n\t\t\t\t - n11 * n22 * n34\n\t\t\t\t - n14 * n21 * n32\n\t\t\t\t + n12 * n21 * n34\n\t\t\t\t + n14 * n22 * n31\n\t\t\t\t - n12 * n24 * n31\n\t\t\t) +\n\t\t\tn44 * (\n\t\t\t\t-n13 * n22 * n31\n\t\t\t\t - n11 * n23 * n32\n\t\t\t\t + n11 * n22 * n33\n\t\t\t\t + n13 * n21 * n32\n\t\t\t\t - n12 * n21 * n33\n\t\t\t\t + n12 * n23 * n31\n\t\t\t)\n\t\t);\n\t}\n\n\t/**\n\t * Transposes this matrix in place.\n\t * @returns {Matrix4} A reference to this matrix.\n\t */\n\ttranspose() {\n\t\tconst te = this.elements;\n\t\tlet tmp;\n\n\t\ttmp = te[1]; te[1] = te[4]; te[4] = tmp;\n\t\ttmp = te[2]; te[2] = te[8]; te[8] = tmp;\n\t\ttmp = te[6]; te[6] = te[9]; te[9] = tmp;\n\n\t\ttmp = te[3]; te[3] = te[12]; te[12] = tmp;\n\t\ttmp = te[7]; te[7] = te[13]; te[13] = tmp;\n\t\ttmp = te[11]; te[11] = te[14]; te[14] = tmp;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the position component for this matrix from the given vector,\n\t * without affecting the rest of the matrix.\n\t * @param {number|Vector3} x - The x component of the vector or alternatively the vector object.\n\t * @param {number} y - The y component of the vector.\n\t * @param {number} z - The z component of the vector.\n\t * @returns {Matrix4} A reference to this matrix.\n\t */\n\tsetPosition(x, y, z) {\n\t\tconst te = this.elements;\n\n\t\tif (x.isVector3) {\n\t\t\tte[12] = x.x;\n\t\t\tte[13] = x.y;\n\t\t\tte[14] = x.z;\n\t\t} else {\n\t\t\tte[12] = x;\n\t\t\tte[13] = y;\n\t\t\tte[14] = z;\n\t\t}\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Inverts this matrix, using the [analytic method]{@link https://en.wikipedia.org/wiki/Invertible_matrix#Analytic_solution}.\n\t * You can not invert with a determinant of zero. If you attempt this, the method produces\n\t * a zero matrix instead.\n\t * @returns {Matrix4} A reference to this matrix.\n\t */\n\tinvert() {\n\t\t// based on http://www.euclideanspace.com/maths/algebra/matrix/functions/inverse/fourD/index.htm\n\t\tconst te = this.elements,\n\n\t\t\tn11 = te[0], n21 = te[1], n31 = te[2], n41 = te[3],\n\t\t\tn12 = te[4], n22 = te[5], n32 = te[6], n42 = te[7],\n\t\t\tn13 = te[8], n23 = te[9], n33 = te[10], n43 = te[11],\n\t\t\tn14 = te[12], n24 = te[13], n34 = te[14], n44 = te[15],\n\n\t\t\tt11 = n23 * n34 * n42 - n24 * n33 * n42 + n24 * n32 * n43 - n22 * n34 * n43 - n23 * n32 * n44 + n22 * n33 * n44,\n\t\t\tt12 = n14 * n33 * n42 - n13 * n34 * n42 - n14 * n32 * n43 + n12 * n34 * n43 + n13 * n32 * n44 - n12 * n33 * n44,\n\t\t\tt13 = n13 * n24 * n42 - n14 * n23 * n42 + n14 * n22 * n43 - n12 * n24 * n43 - n13 * n22 * n44 + n12 * n23 * n44,\n\t\t\tt14 = n14 * n23 * n32 - n13 * n24 * n32 - n14 * n22 * n33 + n12 * n24 * n33 + n13 * n22 * n34 - n12 * n23 * n34;\n\n\t\tconst det = n11 * t11 + n21 * t12 + n31 * t13 + n41 * t14;\n\n\t\tif (det === 0) return this.set(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);\n\n\t\tconst detInv = 1 / det;\n\n\t\tte[0] = t11 * detInv;\n\t\tte[1] = (n24 * n33 * n41 - n23 * n34 * n41 - n24 * n31 * n43 + n21 * n34 * n43 + n23 * n31 * n44 - n21 * n33 * n44) * detInv;\n\t\tte[2] = (n22 * n34 * n41 - n24 * n32 * n41 + n24 * n31 * n42 - n21 * n34 * n42 - n22 * n31 * n44 + n21 * n32 * n44) * detInv;\n\t\tte[3] = (n23 * n32 * n41 - n22 * n33 * n41 - n23 * n31 * n42 + n21 * n33 * n42 + n22 * n31 * n43 - n21 * n32 * n43) * detInv;\n\n\t\tte[4] = t12 * detInv;\n\t\tte[5] = (n13 * n34 * n41 - n14 * n33 * n41 + n14 * n31 * n43 - n11 * n34 * n43 - n13 * n31 * n44 + n11 * n33 * n44) * detInv;\n\t\tte[6] = (n14 * n32 * n41 - n12 * n34 * n41 - n14 * n31 * n42 + n11 * n34 * n42 + n12 * n31 * n44 - n11 * n32 * n44) * detInv;\n\t\tte[7] = (n12 * n33 * n41 - n13 * n32 * n41 + n13 * n31 * n42 - n11 * n33 * n42 - n12 * n31 * n43 + n11 * n32 * n43) * detInv;\n\n\t\tte[8] = t13 * detInv;\n\t\tte[9] = (n14 * n23 * n41 - n13 * n24 * n41 - n14 * n21 * n43 + n11 * n24 * n43 + n13 * n21 * n44 - n11 * n23 * n44) * detInv;\n\t\tte[10] = (n12 * n24 * n41 - n14 * n22 * n41 + n14 * n21 * n42 - n11 * n24 * n42 - n12 * n21 * n44 + n11 * n22 * n44) * detInv;\n\t\tte[11] = (n13 * n22 * n41 - n12 * n23 * n41 - n13 * n21 * n42 + n11 * n23 * n42 + n12 * n21 * n43 - n11 * n22 * n43) * detInv;\n\n\t\tte[12] = t14 * detInv;\n\t\tte[13] = (n13 * n24 * n31 - n14 * n23 * n31 + n14 * n21 * n33 - n11 * n24 * n33 - n13 * n21 * n34 + n11 * n23 * n34) * detInv;\n\t\tte[14] = (n14 * n22 * n31 - n12 * n24 * n31 - n14 * n21 * n32 + n11 * n24 * n32 + n12 * n21 * n34 - n11 * n22 * n34) * detInv;\n\t\tte[15] = (n12 * n23 * n31 - n13 * n22 * n31 + n13 * n21 * n32 - n11 * n23 * n32 - n12 * n21 * n33 + n11 * n22 * n33) * detInv;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Gets the maximum scale value of the three axes.\n\t * @returns {number} The maximum scale.\n\t */\n\tgetMaxScaleOnAxis() {\n\t\tconst te = this.elements;\n\n\t\tconst scaleXSq = te[0] * te[0] + te[1] * te[1] + te[2] * te[2];\n\t\tconst scaleYSq = te[4] * te[4] + te[5] * te[5] + te[6] * te[6];\n\t\tconst scaleZSq = te[8] * te[8] + te[9] * te[9] + te[10] * te[10];\n\n\t\treturn Math.sqrt(Math.max(scaleXSq, scaleYSq, scaleZSq));\n\t}\n\n\t/**\n\t * Sets this matrix as a translation transform from the given vector.\n\t * @param {number|Vector3} x - The amount to translate in the X axis or alternatively a translation vector.\n\t * @param {number} y - The amount to translate in the Y axis.\n\t * @param {number} z - The amount to translate in the z axis.\n\t * @returns {Matrix4} A reference to this matrix.\n\t */\n\tmakeTranslation(x, y, z) {\n\t\tif (x.isVector3) {\n\t\t\tthis.set(\n\n\t\t\t\t1, 0, 0, x.x,\n\t\t\t\t0, 1, 0, x.y,\n\t\t\t\t0, 0, 1, x.z,\n\t\t\t\t0, 0, 0, 1\n\n\t\t\t);\n\t\t} else {\n\t\t\tthis.set(\n\n\t\t\t\t1, 0, 0, x,\n\t\t\t\t0, 1, 0, y,\n\t\t\t\t0, 0, 1, z,\n\t\t\t\t0, 0, 0, 1\n\n\t\t\t);\n\t\t}\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets this matrix as a rotational transformation around the given axis by\n\t * the given angle.\n\t * This is a somewhat controversial but mathematically sound alternative to\n\t * rotating via Quaternions. See the discussion [here]{@link https://www.gamedev.net/articles/programming/math-and-physics/do-we-really-need-quaternions-r1199}.\n\t * @param {Vector3} axis - The normalized rotation axis.\n\t * @param {number} angle - The rotation in radians.\n\t * @returns {Matrix4} A reference to this matrix.\n\t */\n\tmakeRotationAxis(axis, angle) {\n\t\t// Based on http://www.gamedev.net/reference/articles/article1199.asp\n\n\t\tconst c = Math.cos(angle);\n\t\tconst s = Math.sin(angle);\n\t\tconst t = 1 - c;\n\t\tconst x = axis.x, y = axis.y, z = axis.z;\n\t\tconst tx = t * x, ty = t * y;\n\n\t\treturn this.set(\n\t\t\ttx * x + c, tx * y - s * z, tx * z + s * y, 0,\n\t\t\ttx * y + s * z, ty * y + c, ty * z - s * x, 0,\n\t\t\ttx * z - s * y, ty * z + s * x, t * z * z + c, 0,\n\t\t\t0, 0, 0, 1\n\t\t);\n\t}\n\n\t/**\n\t * Sets this matrix as a scale transformation.\n\t * @param {number} x - The amount to scale in the X axis.\n\t * @param {number} y - The amount to scale in the Y axis.\n\t * @param {number} z - The amount to scale in the Z axis.\n\t * @returns {Matrix4} A reference to this matrix.\n\t */\n\tmakeScale(x, y, z) {\n\t\treturn this.set(\n\t\t\tx, 0, 0, 0,\n\t\t\t0, y, 0, 0,\n\t\t\t0, 0, z, 0,\n\t\t\t0, 0, 0, 1\n\t\t);\n\t}\n\n\t/**\n\t * Sets this matrix to the transformation composed of the given position,\n\t * rotation (Quaternion) and scale.\n\t * @param {Vector3} position - The position vector.\n\t * @param {Quaternion} quaternion - The rotation as a Quaternion.\n\t * @param {Vector3} scale - The scale vector.\n\t * @returns {Matrix4} A reference to this matrix.\n\t */\n\tcompose(position, quaternion, scale) {\n\t\tconst te = this.elements;\n\n\t\tconst x = quaternion._x, y = quaternion._y, z = quaternion._z, w = quaternion._w;\n\t\tconst x2 = x + x,\ty2 = y + y, z2 = z + z;\n\t\tconst xx = x * x2, xy = x * y2, xz = x * z2;\n\t\tconst yy = y * y2, yz = y * z2, zz = z * z2;\n\t\tconst wx = w * x2, wy = w * y2, wz = w * z2;\n\n\t\tconst sx = scale.x, sy = scale.y, sz = scale.z;\n\n\t\tte[0] = (1 - (yy + zz)) * sx;\n\t\tte[1] = (xy + wz) * sx;\n\t\tte[2] = (xz - wy) * sx;\n\t\tte[3] = 0;\n\n\t\tte[4] = (xy - wz) * sy;\n\t\tte[5] = (1 - (xx + zz)) * sy;\n\t\tte[6] = (yz + wx) * sy;\n\t\tte[7] = 0;\n\n\t\tte[8] = (xz + wy) * sz;\n\t\tte[9] = (yz - wx) * sz;\n\t\tte[10] = (1 - (xx + yy)) * sz;\n\t\tte[11] = 0;\n\n\t\tte[12] = position.x;\n\t\tte[13] = position.y;\n\t\tte[14] = position.z;\n\t\tte[15] = 1;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Decomposes this matrix into its position, rotation and scale components\n\t * and provides the result in the given objects.\n\t * Note: Not all matrices are decomposable in this way. For example, if an\n\t * object has a non-uniformly scaled parent, then the object's world matrix\n\t * may not be decomposable, and this method may not be appropriate.\n\t * @param {Vector3} position - The position vector.\n\t * @param {Quaternion} quaternion - The rotation as a Quaternion.\n\t * @param {Vector3} scale - The scale vector.\n\t * @returns {Matrix4} A reference to this matrix.\n\t */\n\tdecompose(position, quaternion, scale) {\n\t\tconst te = this.elements;\n\n\t\tlet sx = _vec3_1$6.set(te[0], te[1], te[2]).getLength();\n\t\tconst sy = _vec3_1$6.set(te[4], te[5], te[6]).getLength();\n\t\tconst sz = _vec3_1$6.set(te[8], te[9], te[10]).getLength();\n\n\t\t// if determine is negative, we need to invert one scale\n\t\tconst det = this.determinant();\n\t\tif (det < 0) {\n\t\t\tsx = -sx;\n\t\t}\n\n\t\tposition.x = te[12];\n\t\tposition.y = te[13];\n\t\tposition.z = te[14];\n\n\t\t// scale the rotation part\n\t\t_mat4_1$3.copy(this);\n\n\t\tconst invSX = 1 / sx;\n\t\tconst invSY = 1 / sy;\n\t\tconst invSZ = 1 / sz;\n\n\t\t_mat4_1$3.elements[0] *= invSX;\n\t\t_mat4_1$3.elements[1] *= invSX;\n\t\t_mat4_1$3.elements[2] *= invSX;\n\n\t\t_mat4_1$3.elements[4] *= invSY;\n\t\t_mat4_1$3.elements[5] *= invSY;\n\t\t_mat4_1$3.elements[6] *= invSY;\n\n\t\t_mat4_1$3.elements[8] *= invSZ;\n\t\t_mat4_1$3.elements[9] *= invSZ;\n\t\t_mat4_1$3.elements[10] *= invSZ;\n\n\t\tquaternion.setFromRotationMatrix(_mat4_1$3);\n\n\t\tscale.x = sx;\n\t\tscale.y = sy;\n\t\tscale.z = sz;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Returns `true` if this matrix is equal with the given one.\n\t * @param {Matrix4} matrix - The matrix to test for equality.\n\t * @returns {boolean} Whether this matrix is equal with the given one.\n\t */\n\tequals(matrix) {\n\t\tconst te = this.elements;\n\t\tconst me = matrix.elements;\n\n\t\tfor (let i = 0; i < 16; i++) {\n\t\t\tif (te[i] !== me[i]) return false;\n\t\t}\n\n\t\treturn true;\n\t}\n\n\t/**\n\t * Sets the elements of the matrix from the given array.\n\t * @param {Array<number>} array - The matrix elements in column-major order.\n\t * @param {number} [offset=0] - Index of the first element in the array.\n\t * @returns {Matrix4} A reference to this matrix.\n\t */\n\tfromArray(array, offset = 0) {\n\t\tfor (let i = 0; i < 16; i++) {\n\t\t\tthis.elements[i] = array[i + offset];\n\t\t}\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Writes the elements of this matrix to the given array. If no array is provided,\n\t * the method returns a new instance.\n\t * @param {Array<number>} [array=[]] - The target array holding the matrix elements in column-major order.\n\t * @param {number} [offset=0] - Index of the first element in the array.\n\t * @returns {Array<number>} The matrix elements in column-major order.\n\t */\n\ttoArray(array = [], offset = 0) {\n\t\tconst te = this.elements;\n\n\t\tarray[offset] = te[0];\n\t\tarray[offset + 1] = te[1];\n\t\tarray[offset + 2] = te[2];\n\t\tarray[offset + 3] = te[3];\n\n\t\tarray[offset + 4] = te[4];\n\t\tarray[offset + 5] = te[5];\n\t\tarray[offset + 6] = te[6];\n\t\tarray[offset + 7] = te[7];\n\n\t\tarray[offset + 8] = te[8];\n\t\tarray[offset + 9] = te[9];\n\t\tarray[offset + 10] = te[10];\n\t\tarray[offset + 11] = te[11];\n\n\t\tarray[offset + 12] = te[12];\n\t\tarray[offset + 13] = te[13];\n\t\tarray[offset + 14] = te[14];\n\t\tarray[offset + 15] = te[15];\n\n\t\treturn array;\n\t}\n\n\t/**\n\t * Linearly interpolates between two matrix4.\n\t * @param {Matrix4} m1\n\t * @param {Matrix4} m2\n\t * @param {number} ratio\n\t * @returns {Matrix4}\n\t */\n\tlerpMatrices(m1, m2, ratio) {\n\t\tif (ratio === 0) return this.copy(m1);\n\t\tif (ratio === 1) return this.copy(m2);\n\n\t\tconst te = this.elements,\n\t\t\tte1 = m1.elements,\n\t\t\tte2 = m2.elements;\n\n\t\tfor (let i = 0; i < 16; i++) {\n\t\t\tte[i] = te1[i] * (1 - ratio) + te2[i] * ratio;\n\t\t}\n\n\t\treturn this;\n\t}\n\n}\n\n/**\n * This flag can be used for type testing.\n * @readonly\n * @type {boolean}\n * @default true\n */\nMatrix4.prototype.isMatrix4 = true;\n\nconst _vec3_1$6 = new Vector3();\nconst _mat4_1$3 = new Matrix4();\nconst _zero = new Vector3(0, 0, 0);\nconst _one = new Vector3(1, 1, 1);\nconst _x = new Vector3();\nconst _y = new Vector3();\nconst _z = new Vector3();\n\n/**\n * Class for representing a Quaternion.\n */\nclass Quaternion {\n\n\t/**\n\t * Constructs a new quaternion.\n\t * @param {number} [x=0] - The x value of this quaternion.\n\t * @param {number} [y=0] - The y value of this quaternion.\n\t * @param {number} [z=0] - The z value of this quaternion.\n\t * @param {number} [w=1] - The w value of this quaternion.\n\t */\n\tconstructor(x = 0, y = 0, z = 0, w = 1) {\n\t\tthis._x = x;\n\t\tthis._y = y;\n\t\tthis._z = z;\n\t\tthis._w = w;\n\t}\n\n\t/**\n\t * Interpolates between two quaternions via SLERP. This implementation assumes the\n\t * quaternion data are managed in flat arrays.\n\t * @param {Array<number>} dst - The destination array.\n\t * @param {number} dstOffset - An offset into the destination array.\n\t * @param {Array<number>} src0 - The source array of the first quaternion.\n\t * @param {number} srcOffset0 - An offset into the first source array.\n\t * @param {Array<number>} src1 -  The source array of the second quaternion.\n\t * @param {number} srcOffset1 - An offset into the second source array.\n\t * @param {number} t - The interpolation factor in the range `[0,1]`.\n\t * @see {@link Quaternion#slerp}\n\t */\n\tstatic slerpFlat(dst, dstOffset, src0, srcOffset0, src1, srcOffset1, t) {\n\t\tlet x0 = src0[srcOffset0 + 0],\n\t\t\ty0 = src0[srcOffset0 + 1],\n\t\t\tz0 = src0[srcOffset0 + 2],\n\t\t\tw0 = src0[srcOffset0 + 3];\n\n\t\tlet x1 = src1[srcOffset1 + 0],\n\t\t\ty1 = src1[srcOffset1 + 1],\n\t\t\tz1 = src1[srcOffset1 + 2],\n\t\t\tw1 = src1[srcOffset1 + 3];\n\n\t\tif (t <= 0) {\n\t\t\tdst[dstOffset + 0] = x0;\n\t\t\tdst[dstOffset + 1] = y0;\n\t\t\tdst[dstOffset + 2] = z0;\n\t\t\tdst[dstOffset + 3] = w0;\n\n\t\t\treturn;\n\t\t}\n\n\t\tif (t >= 1) {\n\t\t\tdst[dstOffset + 0] = x1;\n\t\t\tdst[dstOffset + 1] = y1;\n\t\t\tdst[dstOffset + 2] = z1;\n\t\t\tdst[dstOffset + 3] = w1;\n\n\t\t\treturn;\n\t\t}\n\n\t\tif (w0 !== w1 || x0 !== x1 || y0 !== y1 || z0 !== z1) {\n\t\t\tlet dot = x0 * x1 + y0 * y1 + z0 * z1 + w0 * w1;\n\n\t\t\tif (dot < 0) {\n\t\t\t\tx1 = -x1;\n\t\t\t\ty1 = -y1;\n\t\t\t\tz1 = -z1;\n\t\t\t\tw1 = -w1;\n\n\t\t\t\tdot = -dot;\n\t\t\t}\n\n\t\t\tlet s = 1 - t;\n\n\t\t\tif (dot < 0.9995) {\n\t\t\t\t// slerp\n\n\t\t\t\tconst theta = Math.acos(dot);\n\t\t\t\tconst sin = Math.sin(theta);\n\n\t\t\t\ts = Math.sin(s * theta) / sin;\n\t\t\t\tt = Math.sin(t * theta) / sin;\n\n\t\t\t\tx0 = x0 * s + x1 * t;\n\t\t\t\ty0 = y0 * s + y1 * t;\n\t\t\t\tz0 = z0 * s + z1 * t;\n\t\t\t\tw0 = w0 * s + w1 * t;\n\t\t\t} else {\n\t\t\t\t// for small angles, lerp then normalize\n\n\t\t\t\tx0 = x0 * s + x1 * t;\n\t\t\t\ty0 = y0 * s + y1 * t;\n\t\t\t\tz0 = z0 * s + z1 * t;\n\t\t\t\tw0 = w0 * s + w1 * t;\n\n\t\t\t\tconst f = 1 / Math.sqrt(x0 * x0 + y0 * y0 + z0 * z0 + w0 * w0);\n\n\t\t\t\tx0 *= f;\n\t\t\t\ty0 *= f;\n\t\t\t\tz0 *= f;\n\t\t\t\tw0 *= f;\n\t\t\t}\n\t\t}\n\n\t\tdst[dstOffset] = x0;\n\t\tdst[dstOffset + 1] = y0;\n\t\tdst[dstOffset + 2] = z0;\n\t\tdst[dstOffset + 3] = w0;\n\t}\n\n\t/**\n\t * Multiplies two quaternions. This implementation assumes the quaternion data are managed\n\t * in flat arrays.\n\t * @param {Array<number>} dst - The destination array.\n\t * @param {number} dstOffset - An offset into the destination array.\n\t * @param {Array<number>} src0 - The source array of the first quaternion.\n\t * @param {number} srcOffset0 - An offset into the first source array.\n\t * @param {Array<number>} src1 -  The source array of the second quaternion.\n\t * @param {number} srcOffset1 - An offset into the second source array.\n\t * @returns {Array<number>} The destination array.\n\t * @see {@link Quaternion#multiplyQuaternions}\n\t */\n\tstatic multiplyQuaternionsFlat(dst, dstOffset, src0, srcOffset0, src1, srcOffset1) {\n\t\tconst x0 = src0[srcOffset0];\n\t\tconst y0 = src0[srcOffset0 + 1];\n\t\tconst z0 = src0[srcOffset0 + 2];\n\t\tconst w0 = src0[srcOffset0 + 3];\n\n\t\tconst x1 = src1[srcOffset1];\n\t\tconst y1 = src1[srcOffset1 + 1];\n\t\tconst z1 = src1[srcOffset1 + 2];\n\t\tconst w1 = src1[srcOffset1 + 3];\n\n\t\tdst[dstOffset] = x0 * w1 + w0 * x1 + y0 * z1 - z0 * y1;\n\t\tdst[dstOffset + 1] = y0 * w1 + w0 * y1 + z0 * x1 - x0 * z1;\n\t\tdst[dstOffset + 2] = z0 * w1 + w0 * z1 + x0 * y1 - y0 * x1;\n\t\tdst[dstOffset + 3] = w0 * w1 - x0 * x1 - y0 * y1 - z0 * z1;\n\n\t\treturn dst;\n\t}\n\n\t/**\n\t * The x value of this quaternion.\n\t * @type {number}\n\t * @default 0\n\t */\n\tget x() {\n\t\treturn this._x;\n\t}\n\n\tset x(value) {\n\t\tthis._x = value;\n\t\tthis.onChangeCallback();\n\t}\n\n\t/**\n\t * The y value of this quaternion.\n\t * @type {number}\n\t * @default 0\n\t */\n\tget y() {\n\t\treturn this._y;\n\t}\n\n\tset y(value) {\n\t\tthis._y = value;\n\t\tthis.onChangeCallback();\n\t}\n\n\t/**\n\t * The z value of this quaternion.\n\t * @type {number}\n\t * @default 0\n\t */\n\tget z() {\n\t\treturn this._z;\n\t}\n\n\tset z(value) {\n\t\tthis._z = value;\n\t\tthis.onChangeCallback();\n\t}\n\n\t/**\n\t * The w value of this quaternion.\n\t * @type {number}\n\t * @default 1\n\t */\n\tget w() {\n\t\treturn this._w;\n\t}\n\n\tset w(value) {\n\t\tthis._w = value;\n\t\tthis.onChangeCallback();\n\t}\n\n\t/**\n\t * Sets the quaternion components.\n\t * @param {number} x - The x value of this quaternion.\n\t * @param {number} y - The y value of this quaternion.\n\t * @param {number} z - The z value of this quaternion.\n\t * @param {number} w - The w value of this quaternion.\n\t * @returns {Quaternion} A reference to this quaternion.\n\t */\n\tset(x, y, z, w) {\n\t\tthis._x = x;\n\t\tthis._y = y;\n\t\tthis._z = z;\n\t\tthis._w = w;\n\n\t\tthis.onChangeCallback();\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Returns a new quaternion with copied values from this instance.\n\t * @returns {Quaternion} A clone of this instance.\n\t */\n\tclone() {\n\t\treturn new Quaternion(this._x, this._y, this._z, this._w);\n\t}\n\n\t/**\n\t * Copies the values of the given quaternion to this instance.\n\t * @param {Quaternion} quaternion - The quaternion to copy.\n\t * @returns {Quaternion} A reference to this quaternion.\n\t */\n\tcopy(quaternion) {\n\t\tthis._x = quaternion.x;\n\t\tthis._y = quaternion.y;\n\t\tthis._z = quaternion.z;\n\t\tthis._w = quaternion.w;\n\n\t\tthis.onChangeCallback();\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets this quaternion from the rotation specified by the given\n\t * Euler angles.\n\t * @param {Euler} euler - The Euler angles.\n\t * @param {boolean} [update=true] - Whether the internal `onChange` callback should be executed or not.\n\t * @returns {Quaternion} A reference to this quaternion.\n\t */\n\tsetFromEuler(euler, update = true) {\n\t\tconst c1 = Math.cos(euler._x / 2);\n\t\tconst c2 = Math.cos(euler._y / 2);\n\t\tconst c3 = Math.cos(euler._z / 2);\n\t\tconst s1 = Math.sin(euler._x / 2);\n\t\tconst s2 = Math.sin(euler._y / 2);\n\t\tconst s3 = Math.sin(euler._z / 2);\n\n\t\tconst order = euler._order;\n\n\t\tif (order === 'XYZ') {\n\t\t\tthis._x = s1 * c2 * c3 + c1 * s2 * s3;\n\t\t\tthis._y = c1 * s2 * c3 - s1 * c2 * s3;\n\t\t\tthis._z = c1 * c2 * s3 + s1 * s2 * c3;\n\t\t\tthis._w = c1 * c2 * c3 - s1 * s2 * s3;\n\t\t} else if (order === 'YXZ') {\n\t\t\tthis._x = s1 * c2 * c3 + c1 * s2 * s3;\n\t\t\tthis._y = c1 * s2 * c3 - s1 * c2 * s3;\n\t\t\tthis._z = c1 * c2 * s3 - s1 * s2 * c3;\n\t\t\tthis._w = c1 * c2 * c3 + s1 * s2 * s3;\n\t\t} else if (order === 'ZXY') {\n\t\t\tthis._x = s1 * c2 * c3 - c1 * s2 * s3;\n\t\t\tthis._y = c1 * s2 * c3 + s1 * c2 * s3;\n\t\t\tthis._z = c1 * c2 * s3 + s1 * s2 * c3;\n\t\t\tthis._w = c1 * c2 * c3 - s1 * s2 * s3;\n\t\t} else if (order === 'ZYX') {\n\t\t\tthis._x = s1 * c2 * c3 - c1 * s2 * s3;\n\t\t\tthis._y = c1 * s2 * c3 + s1 * c2 * s3;\n\t\t\tthis._z = c1 * c2 * s3 - s1 * s2 * c3;\n\t\t\tthis._w = c1 * c2 * c3 + s1 * s2 * s3;\n\t\t} else if (order === 'YZX') {\n\t\t\tthis._x = s1 * c2 * c3 + c1 * s2 * s3;\n\t\t\tthis._y = c1 * s2 * c3 + s1 * c2 * s3;\n\t\t\tthis._z = c1 * c2 * s3 - s1 * s2 * c3;\n\t\t\tthis._w = c1 * c2 * c3 - s1 * s2 * s3;\n\t\t} else if (order === 'XZY') {\n\t\t\tthis._x = s1 * c2 * c3 - c1 * s2 * s3;\n\t\t\tthis._y = c1 * s2 * c3 - s1 * c2 * s3;\n\t\t\tthis._z = c1 * c2 * s3 + s1 * s2 * c3;\n\t\t\tthis._w = c1 * c2 * c3 + s1 * s2 * s3;\n\t\t}\n\n\t\tif (update === true) this.onChangeCallback();\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets this quaternion from the given axis and angle.\n\t * @param {Vector3} axis - The normalized axis.\n\t * @param {number} angle - The angle in radians.\n\t * @returns {Quaternion} A reference to this quaternion.\n\t */\n\tsetFromAxisAngle(axis, angle) {\n\t\t// http://www.euclideanspace.com/maths/geometry/rotations/conversions/angleToQuaternion/index.htm\n\n\t\tconst halfAngle = angle / 2, s = Math.sin(halfAngle);\n\n\t\tthis._x = axis.x * s;\n\t\tthis._y = axis.y * s;\n\t\tthis._z = axis.z * s;\n\t\tthis._w = Math.cos(halfAngle);\n\n\t\tthis.onChangeCallback();\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets this quaternion from the given rotation matrix.\n\t * @param {Matrix4} m - A 4x4 matrix of which the upper 3x3 of matrix is a pure rotation matrix (i.e. unscaled).\n\t * @returns {Quaternion} A reference to this quaternion.\n\t */\n\tsetFromRotationMatrix(m) {\n\t\t// http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToQuaternion/index.htm\n\n\t\t// assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)\n\n\t\tconst te = m.elements,\n\n\t\t\tm11 = te[0], m12 = te[4], m13 = te[8],\n\t\t\tm21 = te[1], m22 = te[5], m23 = te[9],\n\t\t\tm31 = te[2], m32 = te[6], m33 = te[10],\n\n\t\t\ttrace = m11 + m22 + m33;\n\n\t\tlet\ts;\n\n\t\tif (trace > 0) {\n\t\t\ts = 0.5 / Math.sqrt(trace + 1.0);\n\n\t\t\tthis._w = 0.25 / s;\n\t\t\tthis._x = (m32 - m23) * s;\n\t\t\tthis._y = (m13 - m31) * s;\n\t\t\tthis._z = (m21 - m12) * s;\n\t\t} else if (m11 > m22 && m11 > m33) {\n\t\t\ts = 2.0 * Math.sqrt(1.0 + m11 - m22 - m33);\n\n\t\t\tthis._w = (m32 - m23) / s;\n\t\t\tthis._x = 0.25 * s;\n\t\t\tthis._y = (m12 + m21) / s;\n\t\t\tthis._z = (m13 + m31) / s;\n\t\t} else if (m22 > m33) {\n\t\t\ts = 2.0 * Math.sqrt(1.0 + m22 - m11 - m33);\n\n\t\t\tthis._w = (m13 - m31) / s;\n\t\t\tthis._x = (m12 + m21) / s;\n\t\t\tthis._y = 0.25 * s;\n\t\t\tthis._z = (m23 + m32) / s;\n\t\t} else {\n\t\t\ts = 2.0 * Math.sqrt(1.0 + m33 - m11 - m22);\n\n\t\t\tthis._w = (m21 - m12) / s;\n\t\t\tthis._x = (m13 + m31) / s;\n\t\t\tthis._y = (m23 + m32) / s;\n\t\t\tthis._z = 0.25 * s;\n\t\t}\n\n\t\tthis.onChangeCallback();\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets this quaternion to the rotation required to rotate the direction vector\n\t * `vFrom` to the direction vector `vTo`.\n\t * @param {Vector3} vFrom - The first (normalized) direction vector.\n\t * @param {Vector3} vTo - The second (normalized) direction vector.\n\t * @returns {Quaternion} A reference to this quaternion.\n\t */\n\tsetFromUnitVectors(vFrom, vTo) {\n\t\t// assumes direction vectors vFrom and vTo are normalized\n\n\t\tlet r = vFrom.dot(vTo) + 1;\n\n\t\tif (r < 1e-8) {\n\t\t\t// vFrom and vTo point in opposite directions\n\n\t\t\tr = 0;\n\n\t\t\tif (Math.abs(vFrom.x) > Math.abs(vFrom.z)) {\n\t\t\t\tthis._x = -vFrom.y;\n\t\t\t\tthis._y = vFrom.x;\n\t\t\t\tthis._z = 0;\n\t\t\t\tthis._w = r;\n\t\t\t} else {\n\t\t\t\tthis._x = 0;\n\t\t\t\tthis._y = -vFrom.z;\n\t\t\t\tthis._z = vFrom.y;\n\t\t\t\tthis._w = r;\n\t\t\t}\n\t\t} else {\n\t\t\t// crossVectors(vFrom, vTo); // inlined to avoid cyclic dependency on Vector3\n\n\t\t\tthis._x = vFrom.y * vTo.z - vFrom.z * vTo.y;\n\t\t\tthis._y = vFrom.z * vTo.x - vFrom.x * vTo.z;\n\t\t\tthis._z = vFrom.x * vTo.y - vFrom.y * vTo.x;\n\t\t\tthis._w = r;\n\t\t}\n\n\t\treturn this.normalize();\n\t}\n\n\t/**\n\t * Returns the angle between this quaternion and the given one in radians.\n\t * @param {Quaternion} q - The quaternion to compute the angle with.\n\t * @returns {number} The angle in radians.\n\t */\n\tangleTo(q) {\n\t\treturn 2 * Math.acos(Math.abs(MathUtils.clamp(this.dot(q), -1, 1)));\n\t}\n\n\t/**\n\t * Sets this quaternion to the identity quaternion; that is, to the\n\t * quaternion that represents \"no rotation\".\n\t * @returns {Quaternion} A reference to this quaternion.\n\t */\n\tidentity() {\n\t\treturn this.set(0, 0, 0, 1);\n\t}\n\n\t/**\n\t * Returns the rotational conjugate of this quaternion. The conjugate of a\n\t * quaternion represents the same rotation in the opposite direction about\n\t * the rotational axis.\n\t * @returns {Quaternion} A reference to this quaternion.\n\t */\n\tconjugate() {\n\t\tthis._x *= -1;\n\t\tthis._y *= -1;\n\t\tthis._z *= -1;\n\n\t\tthis.onChangeCallback();\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Calculates the dot product of this quaternion and the given one.\n\t * @param {Quaternion} v - The quaternion to compute the dot product with.\n\t * @returns {number} The result of the dot product.\n\t */\n\tdot(v) {\n\t\treturn this._x * v._x + this._y * v._y + this._z * v._z + this._w * v._w;\n\t}\n\n\t/**\n\t * Computes the squared Euclidean length (straight-line length) of this quaternion,\n\t * considered as a 4 dimensional vector. This can be useful if you are comparing the\n\t * lengths of two quaternions, as this is a slightly more efficient calculation than\n\t * {@link Quaternion#length}.\n\t * @returns {number} The squared Euclidean length.\n\t */\n\tlengthSq() {\n\t\treturn this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w;\n\t}\n\n\t/**\n\t * Computes the Euclidean length (straight-line length) of this quaternion,\n\t * considered as a 4 dimensional vector.\n\t * @returns {number} The Euclidean length.\n\t */\n\tlength() {\n\t\treturn Math.sqrt(this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w);\n\t}\n\n\t/**\n\t * Normalizes this quaternion - that is, calculated the quaternion that performs\n\t * the same rotation as this one, but has a length equal to `1`.\n\t * @returns {Quaternion} A reference to this quaternion.\n\t */\n\tnormalize() {\n\t\tlet l = this.length();\n\n\t\tif (l === 0) {\n\t\t\tthis._x = 0;\n\t\t\tthis._y = 0;\n\t\t\tthis._z = 0;\n\t\t\tthis._w = 1;\n\t\t} else {\n\t\t\tl = 1 / l;\n\n\t\t\tthis._x = this._x * l;\n\t\t\tthis._y = this._y * l;\n\t\t\tthis._z = this._z * l;\n\t\t\tthis._w = this._w * l;\n\t\t}\n\n\t\tthis.onChangeCallback();\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Multiplies this quaternion by the given one.\n\t * @param {Quaternion} q - The quaternion.\n\t * @returns {Quaternion} A reference to this quaternion.\n\t */\n\tmultiply(q) {\n\t\treturn this.multiplyQuaternions(this, q);\n\t}\n\n\t/**\n\t * Pre-multiplies this quaternion by the given one.\n\t * @param {Quaternion} q - The quaternion.\n\t * @returns {Quaternion} A reference to this quaternion.\n\t */\n\tpremultiply(q) {\n\t\treturn this.multiplyQuaternions(q, this);\n\t}\n\n\t/**\n\t * Multiplies the given quaternions and stores the result in this instance.\n\t * @param {Quaternion} a - The first quaternion.\n\t * @param {Quaternion} b - The second quaternion.\n\t * @returns {Quaternion} A reference to this quaternion.\n\t */\n\tmultiplyQuaternions(a, b) {\n\t\t// from http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/code/index.htm\n\n\t\tconst qax = a._x, qay = a._y, qaz = a._z, qaw = a._w;\n\t\tconst qbx = b._x, qby = b._y, qbz = b._z, qbw = b._w;\n\n\t\tthis._x = qax * qbw + qaw * qbx + qay * qbz - qaz * qby;\n\t\tthis._y = qay * qbw + qaw * qby + qaz * qbx - qax * qbz;\n\t\tthis._z = qaz * qbw + qaw * qbz + qax * qby - qay * qbx;\n\t\tthis._w = qaw * qbw - qax * qbx - qay * qby - qaz * qbz;\n\n\t\tthis.onChangeCallback();\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Linearly interpolates between two quaternions.\n\t * @param {Quaternion} q1\n\t * @param {Quaternion} q2\n\t * @param {number} ratio\n\t * @returns {Quaternion}\n\t */\n\tlerpQuaternions(q1, q2, ratio) {\n\t\tif (ratio === 0) return this.copy(q1);\n\t\tif (ratio === 1) return this.copy(q2);\n\n\t\tconst w1 = q1._w, x1 = q1._x, y1 = q1._y, z1 = q1._z;\n\t\tlet w2 = q2._w, x2 = q2._x, y2 = q2._y, z2 = q2._z;\n\n\t\tconst dot = w1 * w2 + x1 * x2 + y1 * y2 + z1 * z2;\n\n\t\t// shortest direction\n\t\tif (dot < 0) {\n\t\t\tw2 = -w2;\n\t\t\tx2 = -x2;\n\t\t\ty2 = -y2;\n\t\t\tz2 = -z2;\n\t\t}\n\n\t\tthis._w = w1 + ratio * (w2 - w1);\n\t\tthis._x = x1 + ratio * (x2 - x1);\n\t\tthis._y = y1 + ratio * (y2 - y1);\n\t\tthis._z = z1 + ratio * (z2 - z1);\n\n\t\tconst len = 1.0 / Math.sqrt(this._w * this._w + this._x * this._x + this._y * this._y + this._z * this._z);\n\n\t\tthis._w *= len;\n\t\tthis._x *= len;\n\t\tthis._y *= len;\n\t\tthis._z *= len;\n\n\t\tthis.onChangeCallback();\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Performs a spherical linear interpolation between quaternions.\n\t * @param {Quaternion} qb - The target quaternion.\n\t * @param {number} t - The interpolation factor in the closed interval `[0, 1]`.\n\t * @returns {Quaternion} A reference to this quaternion.\n\t */\n\tslerp(qb, t) {\n\t\tif (t <= 0) return this;\n\n\t\tif (t >= 1) return this.copy(qb); // copy calls onChangeCallback()\n\n\t\tlet x = qb._x, y = qb._y, z = qb._z, w = qb._w;\n\n\t\tlet dot = this.dot(qb);\n\n\t\tif (dot < 0) {\n\t\t\tx = -x;\n\t\t\ty = -y;\n\t\t\tz = -z;\n\t\t\tw = -w;\n\n\t\t\tdot = -dot;\n\t\t}\n\n\t\tlet s = 1 - t;\n\n\t\tif (dot < 0.9995) {\n\t\t\t// slerp\n\n\t\t\tconst theta = Math.acos(dot);\n\t\t\tconst sin = Math.sin(theta);\n\n\t\t\ts = Math.sin(s * theta) / sin;\n\t\t\tt = Math.sin(t * theta) / sin;\n\n\t\t\tthis._x = this._x * s + x * t;\n\t\t\tthis._y = this._y * s + y * t;\n\t\t\tthis._z = this._z * s + z * t;\n\t\t\tthis._w = this._w * s + w * t;\n\n\t\t\tthis.onChangeCallback();\n\t\t} else {\n\t\t\t// for small angles, lerp then normalize\n\n\t\t\tthis._x = this._x * s + x * t;\n\t\t\tthis._y = this._y * s + y * t;\n\t\t\tthis._z = this._z * s + z * t;\n\t\t\tthis._w = this._w * s + w * t;\n\n\t\t\tthis.normalize(); // normalize calls onChangeCallback()\n\t\t}\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Performs a spherical linear interpolation between the given quaternions\n\t * and stores the result in this quaternion.\n\t * @param {Quaternion} qa - The source quaternion.\n\t * @param {Quaternion} qb - The target quaternion.\n\t * @param {number} t - The interpolation factor in the closed interval `[0, 1]`.\n\t * @returns {Quaternion} A reference to this quaternion.\n\t */\n\tslerpQuaternions(qa, qb, t) {\n\t\treturn this.copy(qa).slerp(qb, t);\n\t}\n\n\t/**\n\t * Returns `true` if this quaternion is equal with the given one.\n\t * @param {Quaternion} quaternion - The quaternion to test for equality.\n\t * @returns {boolean} Whether this quaternion is equal with the given one.\n\t */\n\tequals(quaternion) {\n\t\treturn (quaternion._x === this._x) && (quaternion._y === this._y) && (quaternion._z === this._z) && (quaternion._w === this._w);\n\t}\n\n\t/**\n\t * Sets this quaternion's components from the given array.\n\t * @param {Array<number>} array - An array holding the quaternion component values.\n\t * @param {number} [offset=0] - The offset into the array.\n\t * @param {boolean} [denormalize=false] - If true, denormalize the values, and array should be a typed array.\n\t * @returns {Quaternion} A reference to this quaternion.\n\t */\n\tfromArray(array, offset = 0, denormalize = false) {\n\t\tlet x = array[offset], y = array[offset + 1],\n\t\t\tz = array[offset + 2], w = array[offset + 3];\n\n\t\tif (denormalize) {\n\t\t\tx = MathUtils.denormalize(x, array);\n\t\t\ty = MathUtils.denormalize(y, array);\n\t\t\tz = MathUtils.denormalize(z, array);\n\t\t\tw = MathUtils.denormalize(w, array);\n\t\t}\n\n\t\tthis._x = x;\n\t\tthis._y = y;\n\t\tthis._z = z;\n\t\tthis._w = w;\n\n\t\tthis.onChangeCallback();\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Writes the components of this quaternion to the given array. If no array is provided,\n\t * the method returns a new instance.\n\t * @param {Array<number>} [array=[]] - The target array holding the quaternion components.\n\t * @param {number} [offset=0] - Index of the first element in the array.\n\t * @param {boolean} [normalize=false] - If true, normalize the values, and array should be a typed array.\n\t * @returns {Quaternion} The quaternion components.\n\t */\n\ttoArray(array = [], offset = 0, normalize = false) {\n\t\tlet x = this._x, y = this._y,\n\t\t\tz = this._z, w = this._w;\n\n\t\tif (normalize) {\n\t\t\tx = MathUtils.normalize(x, array);\n\t\t\ty = MathUtils.normalize(y, array);\n\t\t\tz = MathUtils.normalize(z, array);\n\t\t\tw = MathUtils.normalize(w, array);\n\t\t}\n\n\t\tarray[offset] = x;\n\t\tarray[offset + 1] = y;\n\t\tarray[offset + 2] = z;\n\t\tarray[offset + 3] = w;\n\n\t\treturn array;\n\t}\n\n\t/**\n\t * Convert the current quaternion to a matrix4.\n\t * @param {Matrix4} target - The target matrix to write the quaternion data to.\n\t * @returns {Matrix4} The target matrix with the quaternion data written to it.\n\t */\n\ttoMatrix4(target = new Matrix4()) {\n\t\tconst ele = target.elements;\n\n\t\tconst xy2 = 2.0 * this._x * this._y, xz2 = 2.0 * this._x * this._z, xw2 = 2.0 * this._x * this._w;\n\t\tconst yz2 = 2.0 * this._y * this._z, yw2 = 2.0 * this._y * this._w, zw2 = 2.0 * this._z * this._w;\n\t\tconst xx = this._x * this._x, yy = this._y * this._y, zz = this._z * this._z, ww = this._w * this._w;\n\n\t\tele[0] = xx - yy - zz + ww;\n\t\tele[4] = xy2 - zw2;\n\t\tele[8] = xz2 + yw2;\n\t\tele[12] = 0;\n\t\tele[1] = xy2 + zw2;\n\t\tele[5] = -xx + yy - zz + ww;\n\t\tele[9] = yz2 - xw2;\n\t\tele[13] = 0;\n\t\tele[2] = xz2 - yw2;\n\t\tele[6] = yz2 + xw2;\n\t\tele[10] = -xx - yy + zz + ww;\n\t\tele[14] = 0;\n\t\tele[3] = 0.0;\n\t\tele[7] = 0.0;\n\t\tele[11] = 0;\n\t\tele[15] = 1;\n\n\t\treturn target;\n\t}\n\n\t/**\n\t * Registers a callback that is called whenever the quaternion's\n\t * angle value changes.\n\t * @param {Function} callback - When the Quaternion angle value changes, the callback method is triggered\n\t * @returns {Quaternion} A reference to this quaternion.\n\t */\n\tonChange(callback) {\n\t\tthis.onChangeCallback = callback;\n\t\treturn this;\n\t}\n\n\tonChangeCallback() {}\n\n\t* [Symbol.iterator]() {\n\t\tyield this._x;\n\t\tyield this._y;\n\t\tyield this._z;\n\t\tyield this._w;\n\t}\n\n}\n\n/**\n * This flag can be used for type testing.\n * @readonly\n * @type {boolean}\n * @default true\n */\nQuaternion.prototype.isQuaternion = true;\n\n/**\n * Interpolant serves as the base class for all interpolation algorithms.\n * It defines a set of static methods that are intended to be invoked by a keyframe track for the purpose of interpolation.\n * @abstract\n */\nclass KeyframeInterpolant {\n\n\t/**\n\t * Get the value size for keyframe values.\n\t * @returns {number} - the value size.\n\t */\n\tstatic getValueSize() {\n\t\treturn this.values.length / this.times.length;\n\t}\n\n\t/**\n\t * Interpolate the value for the specified time.\n\t * @param {number} index0 - the index of the first keyframe.\n\t * @param {number} ratio - the ratio (0-1) of the time passed between the first keyframe and the next keyframe.\n\t * @param {number} duration - the duration time between the first keyframe and the next keyframe.\n\t * @param {Array} outBuffer - the output buffer to store the interpolated value.\n\t * @returns {Array} - the output buffer to store the interpolated value.\n\t */\n\tstatic interpolate(index0, ratio, duration, outBuffer) {\n\t\tthrow new Error('Interpolant: call to abstract method');\n\t}\n\n\t/**\n\t * Copy the value for the specified index.\n\t * @param {number} index - the index of the keyframe.\n\t * @param {Array} outBuffer - the output buffer to store the copied value.\n\t * @returns {Array} - the output buffer to store the copied value.\n\t */\n\tstatic copyValue(index, outBuffer) {\n\t\tconst values = this.values,\n\t\t\tvalueSize = this.valueSize,\n\t\t\toffset = valueSize * index;\n\n\t\tfor (let i = 0; i < valueSize; i++) {\n\t\t\toutBuffer[i] = values[offset + i];\n\t\t}\n\n\t\treturn outBuffer;\n\t}\n\n}\n\n/**\n * Step (Discrete) interpolation of keyframe values.\n * @extends KeyframeInterpolant\n */\nclass StepInterpolant extends KeyframeInterpolant {\n\n\tstatic interpolate(index0, ratio, duration, outBuffer) {\n\t\tconst values = this.values,\n\t\t\tvalueSize = this.valueSize,\n\t\t\toffset = valueSize * index0;\n\n\t\tfor (let i = 0; i < valueSize; i++) {\n\t\t\toutBuffer[i] = values[offset + i];\n\t\t}\n\n\t\treturn outBuffer;\n\t}\n\n}\n\n/**\n * Linear interpolation of keyframe values.\n * @extends KeyframeInterpolant\n */\nclass LinearInterpolant extends KeyframeInterpolant {\n\n\tstatic interpolate(index0, ratio, duration, outBuffer) {\n\t\tconst values = this.values,\n\t\t\tvalueSize = this.valueSize,\n\n\t\t\toffset0 = index0 * valueSize,\n\t\t\toffset1 = (index0 + 1) * valueSize;\n\n\t\tlet value1, value2;\n\n\t\tfor (let i = 0; i < valueSize; i++) {\n\t\t\tvalue1 = values[offset0 + i];\n\t\t\tvalue2 = values[offset1 + i];\n\n\t\t\tif (value1 !== undefined && value2 !== undefined) {\n\t\t\t\toutBuffer[i] = value1 * (1 - ratio) + value2 * ratio;\n\t\t\t} else {\n\t\t\t\toutBuffer[i] = value1;\n\t\t\t}\n\t\t}\n\n\t\treturn outBuffer;\n\t}\n\n}\n\n/**\n * Quaternion Linear interpolation of keyframe values.\n * @extends KeyframeInterpolant\n */\nclass QuaternionLinearInterpolant extends KeyframeInterpolant {\n\n\tstatic interpolate(index0, ratio, duration, outBuffer) {\n\t\tconst values = this.values,\n\t\t\tvalueSize = this.valueSize;\n\n\t\tQuaternion.slerpFlat(outBuffer, 0, values, index0 * valueSize, values, (index0 + 1) * valueSize, ratio);\n\n\t\treturn outBuffer;\n\t}\n\n}\n\n/**\n * Cubic spline interpolation of keyframe values.\n * @extends KeyframeInterpolant\n */\nclass CubicSplineInterpolant extends KeyframeInterpolant {\n\n\tstatic getValueSize() {\n\t\treturn this.values.length / this.times.length / 3;\n\t}\n\n\tstatic interpolate(index0, ratio, duration, outBuffer) {\n\t\tconst values = this.values,\n\t\t\tvalueSize = this.valueSize,\n\n\t\t\tvalueSize2 = valueSize * 2,\n\t\t\tvalueSize3 = valueSize * 3,\n\n\t\t\trr = ratio * ratio,\n\t\t\trrr = rr * ratio,\n\n\t\t\toffset0 = index0 * valueSize3,\n\t\t\toffset1 = offset0 + valueSize3,\n\n\t\t\ts2 = -2 * rrr + 3 * rr,\n\t\t\ts3 = rrr - rr,\n\t\t\ts0 = 1 - s2,\n\t\t\ts1 = s3 - rr + ratio;\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 < valueSize; i++) {\n\t\t\tconst p0 = values[offset0 + i + valueSize], // splineVertex_k\n\t\t\t\tm0 = values[offset0 + i + valueSize2] * duration, // outTangent_k * (t_k+1 - t_k)\n\t\t\t\tp1 = values[offset1 + i + valueSize], // splineVertex_k+1\n\t\t\t\tm1 = values[offset1 + i] * duration; // inTangent_k+1 * (t_k+1 - t_k)\n\n\t\t\toutBuffer[i] = s0 * p0 + s1 * m0 + s2 * p1 + s3 * m1;\n\t\t}\n\n\t\treturn outBuffer;\n\t}\n\n\tstatic copyValue(index, outBuffer) {\n\t\tconst values = this.values,\n\t\t\tvalueSize = this.valueSize,\n\t\t\toffset = valueSize * index * 3 + valueSize;\n\n\t\tfor (let i = 0; i < valueSize; i++) {\n\t\t\toutBuffer[i] = values[offset + i];\n\t\t}\n\n\t\treturn outBuffer;\n\t}\n\n}\n\n/**\n * Quaternion Cubic spline interpolation of keyframe values.\n * @extends CubicSplineInterpolant\n */\nclass QuaternionCubicSplineInterpolant extends CubicSplineInterpolant {\n\n\tstatic interpolate(index0, ratio, duration, outBuffer) {\n\t\tconst result = super.interpolate(index0, ratio, duration, outBuffer);\n\n\t\t_q.fromArray(result).normalize().toArray(result);\n\n\t\treturn result;\n\t}\n\n}\n\nconst _q = new Quaternion();\n\n/**\n * Base class for property track.\n * @abstract\n */\nclass KeyframeTrack {\n\n\t/**\n\t * @param {Object3D|Material} target\n\t * @param {string} propertyPath\n\t * @param {Array} times\n\t * @param {Array} values\n\t * @param {KeyframeInterpolant.constructor} [interpolant=LinearInterpolant]\n\t */\n\tconstructor(target, propertyPath, times, values, interpolant = LinearInterpolant) {\n\t\tthis.target = target;\n\t\tthis.propertyPath = propertyPath;\n\n\t\tthis.name = this.target.uuid + '.' + propertyPath;\n\n\t\tthis.times = times;\n\t\tthis.values = values;\n\n\t\tthis.valueSize = 0;\n\t\tthis.interpolant = null;\n\n\t\t// since 0.2.2, remove this after few versions later\n\t\tif (interpolant === true) {\n\t\t\tinterpolant = LinearInterpolant;\n\t\t} else if (interpolant === false) {\n\t\t\tinterpolant = StepInterpolant;\n\t\t}\n\n\t\tthis.setInterpolant(interpolant);\n\t}\n\n\t/**\n\t * Set interpolant for this keyframe track.\n\t * @param {KeyframeInterpolant.constructor} interpolant\n\t * @returns {KeyframeTrack}\n\t */\n\tsetInterpolant(interpolant) {\n\t\tthis.valueSize = interpolant.getValueSize.call(this);\n\t\tthis.interpolant = interpolant;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Get value at time.\n\t * The value will be interpolated by interpolant if time is between keyframes.\n\t * @param {number} t - time\n\t * @param {Array} outBuffer - output buffer\n\t * @returns {Array} output buffer\n\t */\n\tgetValue(t, outBuffer) {\n\t\tconst interpolant = this.interpolant,\n\t\t\ttimes = this.times,\n\t\t\ttl = times.length;\n\n\t\tif (t <= times[0]) {\n\t\t\treturn interpolant.copyValue.call(this, 0, outBuffer);\n\t\t} else if (t >= times[tl - 1]) {\n\t\t\treturn interpolant.copyValue.call(this, tl - 1, outBuffer);\n\t\t}\n\n\t\t// TODO use index cache for better performance\n\t\t// https://github.com/mrdoob/three.js/blob/dev/src/math/Interpolant.js\n\t\tlet i0 = tl - 1;\n\t\twhile (t < times[i0] && i0 > 0) {\n\t\t\ti0--;\n\t\t}\n\n\t\tconst duration = times[i0 + 1] - times[i0];\n\t\tconst ratio = (t - times[i0]) / duration;\n\t\treturn interpolant.interpolate.call(this, i0, ratio, duration, outBuffer);\n\t}\n\n}\n\n/**\n * Used for boolean property track.\n * @extends KeyframeTrack\n */\nclass BooleanKeyframeTrack extends KeyframeTrack {\n\n\t/**\n\t * @param {Object3D} target\n\t * @param {string} propertyPath\n\t * @param {Array} times\n\t * @param {Array} values\n\t * @param {KeyframeInterpolant.constructor} [interpolant=StepInterpolant]\n\t */\n\tconstructor(target, propertyPath, times, values, interpolant = StepInterpolant) {\n\t\t// since 0.2.2, remove this after few versions later\n\t\tif (interpolant === true) {\n\t\t\tinterpolant = StepInterpolant;\n\t\t}\n\n\t\tsuper(target, propertyPath, times, values, interpolant);\n\t}\n\n}\n\n/**\n * @readonly\n * @type {string}\n * @default 'bool'\n */\nBooleanKeyframeTrack.prototype.valueTypeName = 'bool';\n\n/**\n * Used for color property track.\n * @extends KeyframeTrack\n */\nclass ColorKeyframeTrack extends KeyframeTrack {\n\n\t/**\n\t * @param {Object3D} target\n\t * @param {string} propertyPath\n\t * @param {Array} times\n\t * @param {Array} values\n\t * @param {KeyframeInterpolant.constructor} [interpolant=LinearInterpolant]\n\t */\n\tconstructor(target, propertyPath, times, values, interpolant) {\n\t\tsuper(target, propertyPath, times, values, interpolant);\n\t}\n\n}\n\n/**\n * @readonly\n * @type {string}\n * @default 'color'\n */\nColorKeyframeTrack.prototype.valueTypeName = 'color';\n\n/**\n * Used for number property track.\n * @extends KeyframeTrack\n */\nclass NumberKeyframeTrack extends KeyframeTrack {\n\n\t/**\n\t * @param {Object3D} target\n\t * @param {string} propertyPath\n\t * @param {Array} times\n\t * @param {Array} values\n\t * @param {KeyframeInterpolant.constructor} [interpolant=LinearInterpolant]\n\t */\n\tconstructor(target, propertyPath, times, values, interpolant) {\n\t\tsuper(target, propertyPath, times, values, interpolant);\n\t}\n\n}\n\n/**\n * @readonly\n * @type {string}\n * @default 'number'\n */\nNumberKeyframeTrack.prototype.valueTypeName = 'number';\n\n/**\n * Used for quaternion property track.\n * @extends KeyframeTrack\n */\nclass QuaternionKeyframeTrack extends KeyframeTrack {\n\n\t/**\n\t * @param {Object3D} target\n\t * @param {string} propertyPath\n\t * @param {Array} times\n\t * @param {Array} values\n\t * @param {KeyframeInterpolant.constructor} [interpolant=QuaternionLinearInterpolant]\n\t */\n\tconstructor(target, propertyPath, times, values, interpolant = QuaternionLinearInterpolant) {\n\t\t// since 0.2.2, remove this after few versions later\n\t\tif (interpolant === true) {\n\t\t\tinterpolant = QuaternionLinearInterpolant;\n\t\t}\n\n\t\tsuper(target, propertyPath, times, values, interpolant);\n\t}\n\n}\n\n/**\n * @readonly\n * @type {string}\n * @default 'quaternion'\n */\nQuaternionKeyframeTrack.prototype.valueTypeName = 'quaternion';\n\n/**\n * Used for string property track.\n * @extends KeyframeTrack\n */\nclass StringKeyframeTrack extends KeyframeTrack {\n\n\t/**\n\t * @param {Object3D} target\n\t * @param {string} propertyPath\n\t * @param {Array} times\n\t * @param {Array} values\n\t * @param {KeyframeInterpolant.constructor} [interpolant=StepInterpolant]\n\t */\n\tconstructor(target, propertyPath, times, values, interpolant = StepInterpolant) {\n\t\t// since 0.2.2, remove this after few versions later\n\t\tif (interpolant === true) {\n\t\t\tinterpolant = StepInterpolant;\n\t\t}\n\n\t\tsuper(target, propertyPath, times, values, interpolant);\n\t}\n\n}\n\n/**\n * @readonly\n * @type {string}\n * @default 'string'\n */\nStringKeyframeTrack.prototype.valueTypeName = 'string';\n\n/**\n * Used for vector property track.\n * @extends KeyframeTrack\n */\nclass VectorKeyframeTrack extends KeyframeTrack {\n\n\t/**\n\t * @param {Object3D} target\n\t * @param {string} propertyPath\n\t * @param {Array} times\n\t * @param {Array} values\n\t * @param {KeyframeInterpolant.constructor} [interpolant=LinearInterpolant]\n\t */\n\tconstructor(target, propertyPath, times, values, interpolant) {\n\t\tsuper(target, propertyPath, times, values, interpolant);\n\t}\n\n}\n\n/**\n * @readonly\n * @type {string}\n * @default 'vector'\n */\nVectorKeyframeTrack.prototype.valueTypeName = 'vector';\n\n/**\n * Enum for material Type.\n * @readonly\n * @enum {string}\n */\nconst MATERIAL_TYPE = {\n\tBASIC: 'basic',\n\tLAMBERT: 'lambert',\n\tPHONG: 'phong',\n\tPBR: 'pbr',\n\tPBR2: 'pbr2',\n\tPOINT: 'point',\n\tLINE: 'line',\n\tSHADER: 'shader',\n\tDEPTH: 'depth',\n\tDISTANCE: 'distance'\n};\n\n/**\n * Enum for blend Type.\n * @readonly\n * @enum {string}\n */\nconst BLEND_TYPE = {\n\tNONE: 'none',\n\tNORMAL: 'normal',\n\tADD: 'add',\n\tSUB: 'sub',\n\tMUL: 'mul',\n\tCUSTOM: 'custom'\n};\n\n/**\n * Enum for blend equation.\n * @readonly\n * @enum {number}\n */\nconst BLEND_EQUATION = {\n\tADD: 100,\n\tSUBTRACT: 101,\n\tREVERSE_SUBTRACT: 102,\n\t/** Only webgl2 */\n\tMIN: 103,\n\tMAX: 104\n};\n\n/**\n * Enum for blend factor.\n * @readonly\n * @enum {number}\n */\nconst BLEND_FACTOR = {\n\tZERO: 200,\n\tONE: 201,\n\tSRC_COLOR: 202,\n\tSRC_ALPHA: 203,\n\tSRC_ALPHA_SATURATE: 204,\n\tDST_COLOR: 205,\n\tDST_ALPHA: 206,\n\tONE_MINUS_SRC_COLOR: 207,\n\tONE_MINUS_SRC_ALPHA: 208,\n\tONE_MINUS_DST_COLOR: 209,\n\tONE_MINUS_DST_ALPHA: 210\n};\n\n/**\n * Enum for cull face Type.\n * @readonly\n * @enum {string}\n */\nconst CULL_FACE_TYPE = {\n\tNONE: 'none',\n\tFRONT: 'front',\n\tBACK: 'back',\n\tFRONT_AND_BACK: 'front_and_back'\n};\n\n/**\n * Enum for draw side.\n * @readonly\n * @enum {string}\n */\nconst DRAW_SIDE = {\n\tFRONT: 'front',\n\tBACK: 'back',\n\tDOUBLE: 'double'\n};\n\n/**\n * Enum for shading side.\n * @readonly\n * @enum {string}\n */\nconst SHADING_TYPE = {\n\tSMOOTH_SHADING: 'smooth_shading',\n\tFLAT_SHADING: 'flat_shading'\n};\n\n/**\n * Enum for pixel format.\n * @readonly\n * @enum {number}\n */\nconst PIXEL_FORMAT = {\n\tDEPTH_COMPONENT: 1000,\n\tDEPTH_STENCIL: 1001,\n\tSTENCIL_INDEX8: 1002,\n\tALPHA: 1003,\n\tRED: 1004,\n\tRGB: 1005,\n\tRGBA: 1006,\n\tLUMINANCE: 1007,\n\tLUMINANCE_ALPHA: 1008,\n\t/** Only webgl2 */\n\tRED_INTEGER: 1010,\n\tRG: 1011,\n\tRG_INTEGER: 1012,\n\tRGB_INTEGER: 1013,\n\tRGBA_INTEGER: 1014,\n\t/** Only internal formats and webgl2 */\n\tR32F: 1100,\n\tR16F: 1101,\n\tR8: 1102,\n\tRG32F: 1103,\n\tRG16F: 1104,\n\tRG8: 1105,\n\tRGB32F: 1106,\n\tRGB16F: 1107,\n\tRGB8: 1108,\n\tRGBA32F: 1109,\n\tRGBA16F: 1110,\n\tRGBA8: 1111,\n\tRGBA4: 1112,\n\tRGB5_A1: 1113,\n\tDEPTH_COMPONENT32F: 1114,\n\tDEPTH_COMPONENT24: 1115,\n\tDEPTH_COMPONENT16: 1116,\n\tDEPTH24_STENCIL8: 1117,\n\tDEPTH32F_STENCIL8: 1118,\n\tR11F_G11F_B10F: 1119,\n\t/** For compressed texture formats */\n\tRGB_S3TC_DXT1: 1200,\n\tRGBA_S3TC_DXT1: 1201,\n\tRGBA_S3TC_DXT3: 1202,\n\tRGBA_S3TC_DXT5: 1203,\n\tRGB_PVRTC_4BPPV1: 1204,\n\tRGB_PVRTC_2BPPV1: 1205,\n\tRGBA_PVRTC_4BPPV1: 1206,\n\tRGBA_PVRTC_2BPPV1: 1207,\n\tRGB_ETC1: 1208,\n\tRGBA_ASTC_4x4: 1209,\n\tRGBA_BPTC: 1210,\n\tRGB_BPTC_SIGNED_FORMAT: 1211,\n\tRGB_BPTC_UNSIGNED_FORMAT: 1212\n};\n\n/**\n * Enum for pixel Type.\n * @readonly\n * @enum {number}\n */\nconst PIXEL_TYPE = {\n\tUNSIGNED_BYTE: 1500,\n\tUNSIGNED_SHORT_5_6_5: 1501,\n\tUNSIGNED_SHORT_4_4_4_4:\t1502,\n\tUNSIGNED_SHORT_5_5_5_1: 1503,\n\tUNSIGNED_SHORT: 1504,\n\tUNSIGNED_INT: 1505,\n\tUNSIGNED_INT_24_8: 1506,\n\tFLOAT: 1507,\n\tHALF_FLOAT: 1508,\n\tFLOAT_32_UNSIGNED_INT_24_8_REV: 1509,\n\tBYTE: 1510,\n\tSHORT: 1511,\n\tINT: 1512\n};\n\n/**\n * Enum for texture filter.\n * @readonly\n * @enum {number}\n */\nconst TEXTURE_FILTER = {\n\tNEAREST: 1600,\n\tLINEAR: 1601,\n\tNEAREST_MIPMAP_NEAREST: 1602,\n\tLINEAR_MIPMAP_NEAREST: 1603,\n\tNEAREST_MIPMAP_LINEAR: 1604,\n\tLINEAR_MIPMAP_LINEAR: 1605\n};\n\n/**\n * Enum for texture wrap.\n * @readonly\n * @enum {number}\n */\nconst TEXTURE_WRAP = {\n\tREPEAT:\t1700,\n\tCLAMP_TO_EDGE: 1701,\n\tMIRRORED_REPEAT: 1702\n};\n\n/**\n * Enum for compare function.\n * @readonly\n * @enum {number}\n */\nconst COMPARE_FUNC = {\n\tLEQUAL: 0x0203,\n\tGEQUAL: 0x0206,\n\tLESS: 0x0201,\n\tGREATER: 0x0204,\n\tEQUAL: 0x0202,\n\tNOTEQUAL: 0x0205,\n\tALWAYS: 0x0207,\n\tNEVER: 0x0200\n};\n\n/**\n * Enum for operation.\n * @readonly\n * @enum {number}\n */\nconst OPERATION = {\n\tKEEP: 0x1E00,\n\tREPLACE: 0x1E01,\n\tINCR: 0x1E02,\n\tDECR: 0x1E03,\n\tINVERT: 0x150A,\n\tINCR_WRAP: 0x8507,\n\tDECR_WRAP: 0x8508\n};\n\n/**\n * Enum for Shadow Type.\n * @readonly\n * @enum {string}\n */\nconst SHADOW_TYPE = {\n\tHARD: 'hard',\n\tPOISSON_SOFT: 'poisson_soft',\n\tVOGEL5_SOFT: 'vogel5_soft',\n\tPCF3_SOFT: 'pcf3_soft',\n\tPCF5_SOFT: 'pcf5_soft',\n\t/** Only webgl2 */\n\tPCSS16_SOFT: 'pcss16_soft',\n\tPCSS32_SOFT: 'pcss32_soft',\n\tPCSS64_SOFT: 'pcss64_soft'\n};\n\n/**\n * Enum for Texel Encoding Type.\n * @readonly\n * @enum {string}\n */\nconst TEXEL_ENCODING_TYPE = {\n\tLINEAR: 'linear',\n\tSRGB: 'sRGB',\n\tGAMMA: 'Gamma'\n};\n\n/**\n * Enum for Envmap Combine Type.\n * @readonly\n * @enum {string}\n */\nconst ENVMAP_COMBINE_TYPE = {\n\tMULTIPLY: 'ENVMAP_BLENDING_MULTIPLY',\n\tMIX: 'ENVMAP_BLENDING_MIX',\n\tADD: 'ENVMAP_BLENDING_ADD'\n};\n\n/**\n * Enum for Draw Mode.\n * @readonly\n * @enum {number}\n */\nconst DRAW_MODE = {\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};\n\n/**\n * Enum for Vertex Color.\n * @readonly\n * @enum {number}\n */\nconst VERTEX_COLOR = {\n\tNONE: 0,\n\tRGB: 1,\n\tRGBA: 2\n};\n\n/**\n * Enum for ATTACHMENT\n * @readonly\n * @enum {number}\n */\nconst ATTACHMENT = {\n\tCOLOR_ATTACHMENT0: 2000,\n\tCOLOR_ATTACHMENT1: 2001,\n\tCOLOR_ATTACHMENT2: 2002,\n\tCOLOR_ATTACHMENT3: 2003,\n\tCOLOR_ATTACHMENT4: 2004,\n\tCOLOR_ATTACHMENT5: 2005,\n\tCOLOR_ATTACHMENT6: 2006,\n\tCOLOR_ATTACHMENT7: 2007,\n\tCOLOR_ATTACHMENT8: 2008,\n\tCOLOR_ATTACHMENT9: 2009,\n\tCOLOR_ATTACHMENT10: 2010,\n\tCOLOR_ATTACHMENT11: 2011,\n\tCOLOR_ATTACHMENT12: 2012,\n\tCOLOR_ATTACHMENT13: 2013,\n\tCOLOR_ATTACHMENT14: 2014,\n\tCOLOR_ATTACHMENT15: 2015,\n\tDEPTH_ATTACHMENT: 2020,\n\tSTENCIL_ATTACHMENT: 2021,\n\tDEPTH_STENCIL_ATTACHMENT: 2030\n};\n\n/**\n * Enum for BUFFER_USAGE\n * @readonly\n * @enum {number}\n */\nconst BUFFER_USAGE = {\n\tSTREAM_DRAW: 35040,\n\tSTREAM_READ: 35041,\n\tSTREAM_COPY: 35042,\n\tSTATIC_DRAW: 35044,\n\tSTATIC_READ: 35045,\n\tSTATIC_COPY: 35046,\n\tDYNAMIC_DRAW: 35048,\n\tDYNAMIC_READ: 35049,\n\tDYNAMIC_COPY: 35050\n};\n\n/**\n * Enum for QUERYSET_TYPE\n * @readonly\n * @enum {number}\n */\nconst QUERYSET_TYPE = {\n\tOCCLUSION: 8000,\n\tTIMESTAMP: 8001\n};\n\n/**\n * JavaScript events for custom objects.\n */\nclass EventDispatcher {\n\n\t/**\n\t * Adds a listener to an event type.\n\t * @param {string} type - The type of event to listen to.\n\t * @param {Function} listener - The function that gets called when the event is fired.\n\t */\n\taddEventListener(type, listener) {\n\t\tif (this._listeners === undefined) this._listeners = {};\n\n\t\tconst listeners = this._listeners;\n\n\t\tif (listeners[type] === undefined) {\n\t\t\tlisteners[type] = [];\n\t\t}\n\n\t\tif (listeners[type].indexOf(listener) === -1) {\n\t\t\tlisteners[type].push(listener);\n\t\t}\n\t}\n\n\t/**\n\t * Removes a listener from an event type.\n\t * @param {string} type - The type of the listener that gets removed.\n\t * @param {Function} listener - The listener function that gets removed.\n\t */\n\tremoveEventListener(type, listener) {\n\t\tconst listeners = this._listeners;\n\n\t\tif (listeners === undefined) return;\n\n\t\tconst listenerArray = listeners[type];\n\n\t\tif (listenerArray !== undefined) {\n\t\t\tconst index = listenerArray.indexOf(listener);\n\n\t\t\tif (index !== -1) {\n\t\t\t\tlistenerArray.splice(index, 1);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Fire an event.\n\t * @param {object} event - The event that gets fired.\n\t */\n\tdispatchEvent(event) {\n\t\tconst listeners = this._listeners;\n\n\t\tif (listeners === undefined) return;\n\n\t\tconst listenerArray = listeners[event.type];\n\n\t\tif (listenerArray !== undefined) {\n\t\t\tevent.target = this;\n\n\t\t\t// Make a copy, in case listeners are removed while iterating.\n\t\t\tconst array = listenerArray.slice(0);\n\n\t\t\tfor (let i = 0, l = array.length; i < l; i++) {\n\t\t\t\tarray[i].call(this, event);\n\t\t\t}\n\n\t\t\tevent.target = null;\n\t\t}\n\t}\n\n}\n\n/**\n * AnimationAction wraps AnimationClip and is mainly responsible for the update logic of time.\n * You can extend other functions by inheriting this class, such as repeat playback, pingpang, etc.\n * And since this class inherits from EventDispatcher, animation events can also be extended.\n * @extends EventDispatcher\n */\nclass AnimationAction extends EventDispatcher {\n\n\t/**\n\t * @param {KeyframeClip} clip - The keyframe clip for this action.\n\t */\n\tconstructor(clip) {\n\t\tsuper();\n\n\t\t/**\n\t\t * The keyframe clip for this action.\n\t\t * @type {KeyframeClip}\n\t\t */\n\t\tthis.clip = clip;\n\n\t\t/**\n\t\t * The degree of influence of this action (in the interval [0, 1]).\n\t\t * Values can be used to blend between several actions.\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.weight = 0;\n\n\t\t/**\n\t\t * The local time of this action (in seconds).\n\t\t * @type {number}\n\t\t */\n\t\tthis.time = 0;\n\n\t\t/**\n\t\t * The blend mode for this action, currently only two values BLEND_TYPE.NORMAL and BLEND_TYPE.ADD are available.\n\t\t * @type {BLEND_TYPE}\n\t\t * @default {BLEND_TYPE.NORMAL}\n\t\t */\n\t\tthis.blendMode = BLEND_TYPE.NORMAL;\n\t}\n\n\t/**\n\t * Update time.\n\t * @param {number} deltaTime - The delta time in seconds.\n\t */\n\tupdate(deltaTime) {\n\t\tthis.time += deltaTime;\n\n\t\tconst endTime = this.clip.duration;\n\n\t\tif (endTime === 0) {\n\t\t\tthis.time = 0;\n\t\t\treturn;\n\t\t}\n\n\t\tif (this.time > endTime) {\n\t\t\tthis.time = this.time % endTime;\n\t\t}\n\n\t\tif (this.time < 0) {\n\t\t\tthis.time = this.time % endTime + endTime;\n\t\t}\n\t}\n\n}\n\n/**\n * This holds a reference to a real property in the scene graph; used internally.\n * Binding property and value, mixer for multiple values.\n */\nclass PropertyBindingMixer {\n\n\t/**\n\t * @param {Object3D|Material} target\n\t * @param {string} propertyPath\n\t * @param {string} typeName - vector/bool/string/quaternion/number/color\n\t * @param {number} valueSize\n\t */\n\tconstructor(target, propertyPath, typeName, valueSize) {\n\t\tthis.target = null;\n\n\t\tthis.property = '';\n\n\t\tthis.parseBinding(target, propertyPath);\n\n\t\tthis.valueSize = valueSize;\n\n\t\tlet BufferType = Float64Array;\n\t\tlet mixFunction, mixFunctionAdditive, setIdentity;\n\n\t\tswitch (typeName) {\n\t\t\tcase 'quaternion':\n\t\t\t\tmixFunction = slerp;\n\t\t\t\tmixFunctionAdditive = slerpAdditive;\n\t\t\t\tsetIdentity = setIdentityQuaternion;\n\t\t\t\tbreak;\n\t\t\tcase 'string':\n\t\t\tcase 'bool':\n\t\t\t\tBufferType = Array;\n\t\t\t\tmixFunction = select;\n\t\t\t\tmixFunctionAdditive = select;\n\t\t\t\tsetIdentity = setIdentityOther;\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tmixFunction = lerp;\n\t\t\t\tmixFunctionAdditive = lerpAdditive;\n\t\t\t\tsetIdentity = setIdentityNumeric;\n\t\t}\n\n\t\t// [ incoming | accu | orig | addAccu ]\n\t\tthis.buffer = new BufferType(valueSize * 4);\n\n\t\tthis._mixBufferFunction = mixFunction;\n\t\tthis._mixBufferFunctionAdditive = mixFunctionAdditive;\n\t\tthis._setIdentity = setIdentity;\n\n\t\tthis.cumulativeWeight = 0;\n\t\tthis.cumulativeWeightAdditive = 0;\n\n\t\t// cache whether the bound property should be treated as an array-like value\n\t\t// (treat existing arrays or types with toArray/fromArray as array bindings,\n\t\t//  or when valueSize > 1)\n\t\tconst boundValue = this.target && this.target[this.property];\n\t\tthis._isArrayProperty = this.valueSize > 1 ||\n\t\t\tArray.isArray(boundValue) ||\n\t\t\t(boundValue && (typeof boundValue.toArray === 'function' || typeof boundValue.fromArray === 'function'));\n\t}\n\n\tparseBinding(target, propertyPath) {\n\t\tpropertyPath = propertyPath.split('.');\n\n\t\tif (propertyPath.length > 1) {\n\t\t\tlet property = target[propertyPath[0]];\n\n\t\t\tfor (let index = 1; index < propertyPath.length - 1; index++) {\n\t\t\t\tproperty = property[propertyPath[index]];\n\t\t\t}\n\n\t\t\tthis.property = propertyPath[propertyPath.length - 1];\n\t\t\tthis.target = property;\n\t\t} else {\n\t\t\tthis.property = propertyPath[0];\n\t\t\tthis.target = target;\n\t\t}\n\t}\n\n\t/**\n\t * Remember the state of the bound property and copy it to both accus.\n\t */\n\tsaveOriginalState() {\n\t\tconst buffer = this.buffer,\n\t\t\tstride = this.valueSize,\n\t\t\toriginalValueOffset = stride * 2;\n\n\t\t// get value\n\t\tif (this._isArrayProperty) {\n\t\t\tif (this.target[this.property].toArray) {\n\t\t\t\tthis.target[this.property].toArray(buffer, originalValueOffset);\n\t\t\t} else {\n\t\t\t\tsetArray(buffer, this.target[this.property], originalValueOffset, stride);\n\t\t\t}\n\t\t} else {\n\t\t\tthis.target[this.property] = buffer[originalValueOffset];\n\t\t}\n\n\t\t// accu[0..1] := orig -- initially detect changes against the original\n\t\tfor (let i = stride, e = originalValueOffset; i !== e; ++i) {\n\t\t\tbuffer[i] = buffer[originalValueOffset + (i % stride)];\n\t\t}\n\n\t\t// Add to identify for additive\n\t\tthis._setIdentity(buffer, stride * 3, stride, originalValueOffset);\n\n\t\tthis.cumulativeWeight = 0;\n\t\tthis.cumulativeWeightAdditive = 0;\n\t}\n\n\t/**\n\t * Apply the state previously taken via 'saveOriginalState' to the binding.\n\t */\n\trestoreOriginalState() {\n\t\tconst buffer = this.buffer,\n\t\t\tstride = this.valueSize,\n\t\t\toriginalValueOffset = stride * 2;\n\n\t\t// accu[0..1] := orig -- initially detect changes against the original\n\t\tfor (let i = stride, e = originalValueOffset; i !== e; ++i) {\n\t\t\tbuffer[i] = buffer[originalValueOffset + (i % stride)];\n\t\t}\n\n\t\tthis.apply();\n\t}\n\n\t/**\n\t * Accumulate value.\n\t * @param {number} weight\n\t */\n\taccumulate(weight) {\n\t\tconst buffer = this.buffer,\n\t\t\tstride = this.valueSize,\n\t\t\toffset = stride;\n\n\t\tlet currentWeight = this.cumulativeWeight;\n\n\t\tif (currentWeight === 0) {\n\t\t\tfor (let i = 0; i !== stride; ++i) {\n\t\t\t\tbuffer[offset + i] = buffer[i];\n\t\t\t}\n\n\t\t\tcurrentWeight = weight;\n\t\t} else {\n\t\t\tcurrentWeight += weight;\n\t\t\tconst mix = weight / currentWeight;\n\t\t\tthis._mixBufferFunction(buffer, offset, 0, mix, stride);\n\t\t}\n\n\t\tthis.cumulativeWeight = currentWeight;\n\t}\n\n\t/**\n\t * Additive Accumulate value.\n\t * @param {number} weight\n\t */\n\taccumulateAdditive(weight) {\n\t\tconst buffer = this.buffer,\n\t\t\tstride = this.valueSize,\n\t\t\toffset = stride * 3;\n\n\t\tif (this.cumulativeWeightAdditive === 0) {\n\t\t\tthis._setIdentity(buffer, offset, stride, stride * 2);\n\t\t}\n\n\t\tthis._mixBufferFunctionAdditive(buffer, offset, 0, weight, stride);\n\n\t\tthis.cumulativeWeightAdditive += weight;\n\t}\n\n\t/**\n\t * Apply to scene graph.\n\t */\n\tapply() {\n\t\tconst buffer = this.buffer,\n\t\t\tstride = this.valueSize,\n\t\t\tweight = this.cumulativeWeight,\n\t\t\tweightAdditive = this.cumulativeWeightAdditive;\n\n\t\tthis.cumulativeWeight = 0;\n\t\tthis.cumulativeWeightAdditive = 0;\n\n\t\tif (weight < 1) {\n\t\t\t// accuN := accuN + original * ( 1 - cumulativeWeight )\n\t\t\tconst originalValueOffset = stride * 2;\n\t\t\tthis._mixBufferFunction(buffer, stride, originalValueOffset, 1 - weight, stride);\n\t\t}\n\n\t\tif (weightAdditive > 0) {\n\t\t\t// accuN := accuN + additive accuN\n\t\t\tthis._mixBufferFunctionAdditive(buffer, stride, 3 * stride, 1, stride);\n\t\t}\n\n\t\t// set value\n\t\tif (this._isArrayProperty) {\n\t\t\tif (this.target[this.property].fromArray) {\n\t\t\t\tthis.target[this.property].fromArray(buffer, stride);\n\t\t\t} else {\n\t\t\t\tgetArray(this.target[this.property], buffer, stride, stride);\n\t\t\t}\n\t\t} else {\n\t\t\tthis.target[this.property] = buffer[stride];\n\t\t}\n\n\t\tif (this.target.isTransformUV) {\n\t\t\tthis.target.needsUpdate = true;\n\t\t}\n\t}\n\n}\n\n// Mix functions\n\nfunction select(buffer, dstOffset, srcOffset, t, stride) {\n\tif (t >= 0.5) {\n\t\tfor (let i = 0; i !== stride; ++i) {\n\t\t\tbuffer[dstOffset + i] = buffer[srcOffset + i];\n\t\t}\n\t}\n}\n\nfunction slerp(buffer, dstOffset, srcOffset, t) {\n\tQuaternion.slerpFlat(buffer, dstOffset, buffer, dstOffset, buffer, srcOffset, t);\n}\n\nconst tempQuternionBuffer = new Float64Array(4);\nfunction slerpAdditive(buffer, dstOffset, srcOffset, t) {\n\t// Store result in tempQuternionBuffer\n\tQuaternion.multiplyQuaternionsFlat(tempQuternionBuffer, 0, buffer, dstOffset, buffer, srcOffset);\n\t// Slerp to the result\n\tQuaternion.slerpFlat(buffer, dstOffset, buffer, dstOffset, tempQuternionBuffer, 0, t);\n}\n\nfunction lerp(buffer, dstOffset, srcOffset, t, stride) {\n\tconst s = 1 - t;\n\n\tfor (let i = 0; i !== stride; ++i) {\n\t\tconst j = dstOffset + i;\n\n\t\tbuffer[j] = buffer[j] * s + buffer[srcOffset + i] * t;\n\t}\n}\n\nfunction lerpAdditive(buffer, dstOffset, srcOffset, t, stride) {\n\tfor (let i = 0; i !== stride; ++i) {\n\t\tconst j = dstOffset + i;\n\n\t\tbuffer[j] = buffer[j] + buffer[srcOffset + i] * t;\n\t}\n}\n\n// identity\nfunction setIdentityNumeric(buffer, offset, stride) {\n\tfor (let i = 0; i < stride; i++) {\n\t\tbuffer[offset + i] = 0;\n\t}\n}\n\nfunction setIdentityQuaternion(buffer, offset) {\n\tsetIdentityNumeric(buffer, offset, 3);\n\tbuffer[offset + 3] = 1;\n}\n\nfunction setIdentityOther(buffer, offset, stride, copyOffset) {\n\tfor (let i = 0; i < stride; i++) {\n\t\tbuffer[offset + i] = buffer[copyOffset + i];\n\t}\n}\n\n// get array\nfunction getArray(target, source, stride, count) {\n\tfor (let i = 0; i < count; i++) {\n\t\ttarget[i] = source[stride + i];\n\t}\n}\n\nfunction setArray(target, source, stride, count) {\n\tfor (let i = 0; i < count; i++) {\n\t\ttarget[stride + i] = source[i];\n\t}\n}\n\n/**\n * The AnimationMixer is a player for animations on a particular object in the scene.\n * When multiple objects in the scene are animated independently, one AnimationMixer may be used for each object.\n */\nclass AnimationMixer {\n\n\tconstructor() {\n\t\tthis._actions = [];\n\t\tthis._bindings = {};\n\t}\n\n\t/**\n\t * Add an action to this mixer.\n\t * @param {AnimationAction} action - The action to add.\n\t */\n\taddAction(action) {\n\t\tif (this._actions.indexOf(action) !== -1) {\n\t\t\tconsole.warn('AnimationMixer.addAction(): already has the action, clip name is <' + action.clip.name + '>.');\n\t\t\treturn;\n\t\t}\n\n\t\tthis._actions.push(action);\n\n\t\tconst tracks = action.clip.tracks;\n\n\t\tfor (let i = 0; i < tracks.length; i++) {\n\t\t\tconst track = tracks[i];\n\t\t\tconst trackName = track.name;\n\n\t\t\tif (!this._bindings[trackName]) {\n\t\t\t\tconst binding = new PropertyBindingMixer(track.target, track.propertyPath, track.valueTypeName, track.valueSize);\n\t\t\t\tthis._bindings[trackName] = { binding, referenceCount: 0, active: false, cachedActive: false };\n\t\t\t}\n\n\t\t\tthis._bindings[trackName].referenceCount++;\n\t\t}\n\t}\n\n\t/**\n\t * Remove an action from this mixer.\n\t * @param {AnimationAction} action - The action to be removed.\n\t */\n\tremoveAction(action) {\n\t\tconst index = this._actions.indexOf(action);\n\n\t\tif (index === -1) {\n\t\t\tconsole.warn('AnimationMixer.removeAction(): action not found in this mixer, clip name is <' + action.clip.name + '>.');\n\t\t\treturn;\n\t\t}\n\n\t\tif (action.weight > 0) {\n\t\t\tconsole.warn('AnimationMixer.removeAction(): make sure action\\'s weight is zero before removing it.');\n\t\t\treturn;\n\t\t}\n\n\t\tthis._actions.splice(index, 1);\n\n\t\tconst tracks = action.clip.tracks;\n\n\t\tfor (let i = 0; i < tracks.length; i++) {\n\t\t\tconst trackName = tracks[i].name;\n\t\t\tconst bindingInfo = this._bindings[trackName];\n\n\t\t\tif (bindingInfo) {\n\t\t\t\tif (--bindingInfo.referenceCount <= 0) {\n\t\t\t\t\tif (bindingInfo.cachedActive) {\n\t\t\t\t\t\tbindingInfo.binding.restoreOriginalState();\n\t\t\t\t\t}\n\t\t\t\t\tdelete this._bindings[trackName];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Whether has this action.\n\t * @param {AnimationAction} action - The action.\n\t * @returns {boolean}\n\t */\n\thasAction(action) {\n\t\treturn this._actions.indexOf(action) > -1;\n\t}\n\n\t/**\n\t * Get all actions.\n\t * @returns {AnimationAction[]}\n\t */\n\tgetActions() {\n\t\treturn this._actions;\n\t}\n\n\t/**\n\t * Advances the global mixer time and updates the animation.\n\t * @param {number} deltaTime - The delta time in seconds.\n\t */\n\tupdate(deltaTime) {\n\t\t// Mark active to false for all bindings.\n\n\t\tfor (const bindingName in this._bindings) {\n\t\t\tthis._bindings[bindingName].active = false;\n\t\t}\n\n\t\t// Update the time of actions with a weight greater than 1\n\t\t// And accumulate those bindings\n\n\t\tfor (let i = 0, l = this._actions.length; i < l; i++) {\n\t\t\tconst action = this._actions[i];\n\t\t\tif (action.weight > 0) {\n\t\t\t\taction.update(deltaTime);\n\n\t\t\t\tconst tracks = action.clip.tracks;\n\n\t\t\t\tfor (let j = 0, tl = tracks.length; j < tl; j++) {\n\t\t\t\t\tconst track = tracks[j];\n\t\t\t\t\tconst bindingInfo = this._bindings[track.name];\n\t\t\t\t\tconst binding = bindingInfo.binding;\n\n\t\t\t\t\tbindingInfo.active = true;\n\n\t\t\t\t\tif (!bindingInfo.cachedActive) {\n\t\t\t\t\t\tbindingInfo.binding.saveOriginalState();\n\t\t\t\t\t\tbindingInfo.cachedActive = true;\n\t\t\t\t\t}\n\n\t\t\t\t\ttrack.getValue(action.time, binding.buffer);\n\n\t\t\t\t\tif (action.blendMode === BLEND_TYPE.ADD) {\n\t\t\t\t\t\tbinding.accumulateAdditive(action.weight);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tbinding.accumulate(action.weight);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Apply all bindings.\n\n\t\tfor (const bindingName in this._bindings) {\n\t\t\tconst bindingInfo = this._bindings[bindingName];\n\t\t\tif (bindingInfo.active) {\n\t\t\t\tbindingInfo.binding.apply();\n\t\t\t} else {\n\t\t\t\tif (bindingInfo.cachedActive) {\n\t\t\t\t\tbindingInfo.binding.restoreOriginalState();\n\t\t\t\t\tbindingInfo.cachedActive = false;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n}\n\n/**\n * An KeyframeClip is a reusable set of keyframe tracks which represent an animation.\n */\nclass KeyframeClip {\n\n\t/**\n\t * @param {string} [name=''] - A name for this clip.\n\t * @param {KeyframeTrack[]} [tracks=[]] - An array of KeyframeTracks.\n\t * @param {number} [duration] - The duration of this clip (in seconds). If not passed, the duration will be calculated from the passed tracks array.\n\t */\n\tconstructor(name = '', tracks = [], duration = -1) {\n\t\t/**\n\t\t * A name for this clip.\n\t\t * @type {string}\n\t\t */\n\t\tthis.name = name;\n\n\t\t/**\n\t\t * An array of KeyframeTracks.\n\t\t * @type {KeyframeTrack[]}\n\t\t */\n\t\tthis.tracks = tracks;\n\n\t\t/**\n\t\t * The duration of this clip (in seconds).\n\t\t * If a negative value is passed, the duration will be calculated from the passed tracks array.\n\t\t * @type {number}\n\t\t */\n\t\tthis.duration = duration;\n\n\t\tif (this.duration < 0) {\n\t\t\tthis.resetDuration();\n\t\t}\n\t}\n\n\t/**\n\t * Sets the duration of the clip to the duration of its longest KeyframeTrack.\n\t * @returns {KeyframeClip}\n\t */\n\tresetDuration() {\n\t\tconst tracks = this.tracks;\n\t\tlet duration = 0;\n\n\t\tfor (let i = 0, l = tracks.length; i < l; i++) {\n\t\t\tconst track = tracks[i];\n\t\t\tduration = Math.max(duration, track.times[track.times.length - 1]);\n\t\t}\n\n\t\tthis.duration = duration;\n\n\t\treturn this;\n\t}\n\n}\n\n/**\n * Handles and keeps track of loaded and pending data. A default global\n * instance of this class is created and used by loaders if not supplied\n * manually.\n * In general that should be sufficient, however there are times when it can\n * be useful to have separate loaders - for example if you want to show\n * separate loading bars for objects and textures.\n * ```js\n * const manager = new LoadingManager(\n *   () => console.log('All items loaded!'),\n *   (url, itemsLoaded, itemsTotal) => {\n *     console.log(`Loaded ${itemsLoaded} of ${itemsTotal} items`);\n *   },\n *   url => console.error(`Error loading ${url}`)\n * );\n * ```\n */\nclass LoadingManager {\n\n\t/**\n\t * Constructs a new loading manager.\n\t * @param {Function} [onLoad] - Executes when all items have been loaded.\n\t * @param {Function} [onProgress] - Executes when single items have been loaded.\n\t * @param {Function} [onError] - Executes when an error occurs.\n\t */\n\tconstructor(onLoad, onProgress, onError) {\n\t\tthis.isLoading = false;\n\t\tthis.itemsLoaded = 0;\n\t\tthis.itemsTotal = 0;\n\t\tthis.urlModifier = undefined;\n\n\t\t/**\n\t\t * Executes when an item starts loading.\n\t\t * @type {Function|undefined}\n\t\t * @default undefined\n\t\t */\n\t\tthis.onStart = undefined;\n\n\t\t/**\n\t\t * Executes when all items have been loaded.\n\t\t * @type {Function|undefined}\n\t\t * @default undefined\n\t\t */\n\t\tthis.onLoad = onLoad;\n\n\t\t/**\n\t\t * Executes when single items have been loaded.\n\t\t * @type {Function|undefined}\n\t\t * @default undefined\n\t\t */\n\t\tthis.onProgress = onProgress;\n\n\t\t/**\n\t\t * Executes when an error occurs.\n\t\t * @type {Function|undefined}\n\t\t * @default undefined\n\t\t */\n\t\tthis.onError = onError;\n\t}\n\n\t/**\n\t * This should be called by any loader using the manager when the loader\n\t * starts loading an item.\n\t * @param {string} url - The URL to load.\n\t */\n\titemStart(url) {\n\t\tthis.itemsTotal++;\n\n\t\tif (this.isLoading === false) {\n\t\t\tif (this.onStart !== undefined) {\n\t\t\t\tthis.onStart(url, this.itemsLoaded, this.itemsTotal);\n\t\t\t}\n\t\t}\n\n\t\tthis.isLoading = true;\n\t}\n\n\t/**\n\t * This should be called by any loader using the manager when the loader\n\t * ended loading an item.\n\t * @param {string} url - The URL of the loaded item.\n\t */\n\titemEnd(url) {\n\t\tthis.itemsLoaded++;\n\n\t\tif (this.onProgress !== undefined) {\n\t\t\tthis.onProgress(url, this.itemsLoaded, this.itemsTotal);\n\t\t}\n\n\t\tif (this.itemsLoaded === this.itemsTotal) {\n\t\t\tthis.isLoading = false;\n\n\t\t\tif (this.onLoad !== undefined) {\n\t\t\t\tthis.onLoad();\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * This should be called by any loader using the manager when the loader\n\t * encounters an error when loading an item.\n\t * @param {string} url - The URL of the item that produces an error.\n\t */\n\titemError(url) {\n\t\tif (this.onError !== undefined) {\n\t\t\tthis.onError(url);\n\t\t}\n\t}\n\n\t/**\n\t * Given a URL, uses the URL modifier callback (if any) and returns a\n\t * resolved URL. If no URL modifier is set, returns the original URL.\n\t * @param {string} url - The URL to load.\n\t * @returns {string} The resolved URL.\n\t */\n\tresolveURL(url) {\n\t\tif (this.urlModifier) {\n\t\t\treturn this.urlModifier(url);\n\t\t}\n\n\t\treturn url;\n\t}\n\n\t/**\n\t * If provided, the callback will be passed each resource URL before a\n\t * request is sent. The callback may return the original URL, or a new URL to\n\t * override loading behavior. This behavior can be used to load assets from\n\t * .ZIP files, drag-and-drop APIs, and Data URIs.\n\t * @param {Function} transform - URL modifier callback. Called with an URL and must return a resolved URL.\n\t * @returns {LoadingManager} A reference to this loading manager.\n\t * @example\n\t * const blobs = { 'fish.gltf': blob1, 'diffuse.png': blob2, 'normal.png': blob3 };\n\t *\n\t * const manager = new LoadingManager();\n\t *\n\t * // Initialize loading manager with URL callback.\n\t * const objectURLs = [];\n\t * manager.setURLModifier(url => {\n\t * \t url = URL.createObjectURL(blobs[url]);\n\t * \t objectURLs.push(url);\n\t * \t return url;\n\t * });\n\t *\n\t * // Load as usual, then revoke the blob URLs.\n\t * const loader = new GLTFLoader(manager);\n\t * loader.load('fish.gltf', gltf => {\n\t * \t scene.add(gltf.scene);\n\t * \t objectURLs.forEach(url => URL.revokeObjectURL(url));\n\t * });\n\t */\n\tsetURLModifier(transform) {\n\t\tthis.urlModifier = transform;\n\t\treturn this;\n\t}\n\n}\n\n/**\n * The global default loading manager.\n * @type {LoadingManager}\n */\nconst DefaultLoadingManager = new LoadingManager();\n\n/**\n * Abstract base class for loaders.\n * @abstract\n */\nclass Loader {\n\n\t/**\n\t * Constructs a new Loader.\n\t * @param {LoadingManager} [manager=DefaultLoadingManager] - The loading manager.\n\t */\n\tconstructor(manager) {\n\t\t/**\n\t\t * The loading manager.\n\t\t * @type {LoadingManager}\n\t\t * @default DefaultLoadingManager\n\t\t */\n\t\tthis.manager = (manager !== undefined) ? manager : DefaultLoadingManager;\n\n\t\t/**\n\t\t * The crossOrigin string to implement CORS for loading the url from a\n\t\t * different domain that allows CORS.\n\t\t * @type {string}\n\t\t * @default 'anonymous'\n\t\t */\n\t\tthis.crossOrigin = 'anonymous';\n\n\t\t/**\n\t\t * Whether the XMLHttpRequest uses credentials.\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.withCredentials = false;\n\n\t\t/**\n\t\t * The base path from which the asset will be loaded.\n\t\t * @type {string}\n\t\t * @default ''\n\t\t */\n\t\tthis.path = '';\n\n\t\t/**\n\t\t * The [request header]{@link https://developer.mozilla.org/en-US/docs/Glossary/Request_header}\n\t\t * used in HTTP request.\n\t\t * @type {object}\n\t\t * @default {}\n\t\t */\n\t\tthis.requestHeader = {};\n\t}\n\n\t/**\n\t * This method needs to be implement by all concrete loaders.\n\t * It holds the logic for loading the asset from the backend.\n\t * @param {string} url - The path/URL of the file to be loaded.\n\t * @param {Function} onLoad - Executed when the loading process has been finished.\n\t * @param {onProgressCallback} [onProgress] - Executed while the loading is in progress.\n\t * @param {onErrorCallback} [onError] - Executed when errors occur.\n\t */\n\tload(url, onLoad, onProgress, onError) {}\n\n\t/**\n\t * A async version of {@link Loader#load}.\n\t * @param {string} url - The path/URL of the file to be loaded.\n\t * @param {Function} [onProgress] - Executed while the loading is in progress.\n\t * @returns {Promise} A Promise that resolves when the asset has been loaded.\n\t */\n\tloadAsync(url, onProgress) {\n\t\tconst scope = this;\n\t\treturn new Promise(function(resolve, reject) {\n\t\t\tscope.load(url, resolve, onProgress, reject);\n\t\t});\n\t}\n\n\t/**\n\t * Sets the `crossOrigin` String to implement CORS for loading the URL\n\t * from a different domain that allows CORS.\n\t * @param {string} crossOrigin - The `crossOrigin` value.\n\t * @returns {Loader} A reference to this instance.\n\t */\n\tsetCrossOrigin(crossOrigin) {\n\t\tthis.crossOrigin = crossOrigin;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Whether the XMLHttpRequest uses credentials such as cookies, authorization\n\t * headers or TLS client certificates, see [XMLHttpRequest.withCredentials]{@link https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/withCredentials}.\n\t * Note: This setting has no effect if you are loading files locally or from the same domain.\n\t * @param {boolean} value - The `withCredentials` value.\n\t * @returns {Loader} A reference to this instance.\n\t */\n\tsetWithCredentials(value) {\n\t\tthis.withCredentials = value;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the base path for the asset.\n\t * @param {string} path - The base path.\n\t * @returns {Loader} A reference to this instance.\n\t */\n\tsetPath(path) {\n\t\tthis.path = path;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the given request header.\n\t * @param {object} requestHeader - A [request header]{@link https://developer.mozilla.org/en-US/docs/Glossary/Request_header}\n\t * for configuring the HTTP request.\n\t * @returns {Loader} A reference to this instance.\n\t */\n\tsetRequestHeader(requestHeader) {\n\t\tthis.requestHeader = requestHeader;\n\t\treturn this;\n\t}\n\n}\n\n/**\n * A low level class for loading resources with the Fetch API, used internally by\n * most loaders. It can also be used directly to load any file type that does\n * not have a loader.\n * ```js\n * const loader = new FileLoader();\n * const data = await loader.loadAsync('example.txt');\n * ```\n * @extends Loader\n */\nclass FileLoader extends Loader {\n\n\t/**\n\t * Constructs a new file loader.\n\t * @param {LoadingManager} [manager] - The loading manager.\n\t */\n\tconstructor(manager) {\n\t\tsuper(manager);\n\n\t\t/**\n\t\t * The expected response type. See {@link FileLoader.setResponseType}.\n\t\t * @type {'arraybuffer'|'blob'|'document'|'json'|''}\n\t\t * @default ''\n\t\t */\n\t\tthis.responseType = '';\n\n\t\t/**\n\t\t * The expected mimeType. See {@link FileLoader.setMimeType}.\n\t\t * @type {string}\n\t\t * @default ''\n\t\t */\n\t\tthis.mimeType = '';\n\t}\n\n\t/**\n\t * Starts loading from the given URL and pass the loaded response to the `onLoad()` callback.\n\t * @param {string} url — The path/URL of the file to be loaded. This can also be a data URI.\n\t * @param {Function} [onLoad] — Executed when the loading process has been finished. The argument is the loaded data.\n\t * @param {onProgressCallback} [onProgress] — Executed while the loading is in progress.\n\t * @param {onErrorCallback} [onError] — Executed when errors occur.\n\t */\n\tload(url, onLoad, onProgress, onError) {\n\t\tif (url === undefined) url = '';\n\t\tif (this.path != undefined) url = this.path + url;\n\n\t\turl = this.manager.resolveURL(url);\n\n\t\t// create request\n\t\tconst req = new Request(url, {\n\t\t\theaders: new Headers(this.requestHeader),\n\t\t\tcredentials: this.withCredentials ? 'include' : 'same-origin'\n\t\t\t// An abort controller could be added within a future PR\n\t\t});\n\n\t\t// record states ( avoid data race )\n\t\tconst mimeType = this.mimeType;\n\t\tconst responseType = this.responseType;\n\n\t\t// start the fetch\n\t\tfetch(req)\n\t\t\t.then(response => {\n\t\t\t\tif (response.status === 200 || response.status === 0) {\n\t\t\t\t\t// Some browsers return HTTP Status 0 when using non-http protocol\n\t\t\t\t\t// e.g. 'file://' or 'data://'. Handle as success.\n\n\t\t\t\t\tif (response.status === 0) {\n\t\t\t\t\t\tconsole.warn('FileLoader: HTTP Status 0 received.');\n\t\t\t\t\t}\n\n\t\t\t\t\t// Workaround: Checking if response.body === undefined for Alipay browser #23548\n\n\t\t\t\t\tif (typeof ReadableStream === 'undefined' || response.body === undefined || response.body.getReader === undefined) {\n\t\t\t\t\t\treturn response;\n\t\t\t\t\t}\n\n\t\t\t\t\tconst reader = response.body.getReader();\n\n\t\t\t\t\t// Nginx needs X-File-Size check\n\t\t\t\t\t// https://serverfault.com/questions/482875/why-does-nginx-remove-content-length-header-for-chunked-content\n\t\t\t\t\tconst contentLength = response.headers.get('X-File-Size') || response.headers.get('Content-Length');\n\t\t\t\t\tconst total = contentLength ? parseInt(contentLength) : 0;\n\t\t\t\t\tconst lengthComputable = total !== 0;\n\t\t\t\t\tlet loaded = 0;\n\n\t\t\t\t\t// periodically read data into the new stream tracking while download progress\n\t\t\t\t\tconst stream = new ReadableStream({\n\t\t\t\t\t\tstart(controller) {\n\t\t\t\t\t\t\treadData();\n\n\t\t\t\t\t\t\tfunction readData() {\n\t\t\t\t\t\t\t\treader.read().then(({ done, value }) => {\n\t\t\t\t\t\t\t\t\tif (done) {\n\t\t\t\t\t\t\t\t\t\tcontroller.close();\n\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\tloaded += value.byteLength;\n\n\t\t\t\t\t\t\t\t\t\tconst event = new ProgressEvent('progress', { lengthComputable, loaded, total });\n\t\t\t\t\t\t\t\t\t\tif (onProgress) onProgress(event);\n\n\t\t\t\t\t\t\t\t\t\tcontroller.enqueue(value);\n\t\t\t\t\t\t\t\t\t\treadData();\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}, error => {\n\t\t\t\t\t\t\t\t\tcontroller.error(error);\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t});\n\n\t\t\t\t\treturn new Response(stream);\n\t\t\t\t} else {\n\t\t\t\t\tthrow new HttpError(`fetch for \"${response.url}\" responded with ${response.status}: ${response.statusText}`, response);\n\t\t\t\t}\n\t\t\t})\n\t\t\t.then(response => {\n\t\t\t\tswitch (responseType) {\n\t\t\t\t\tcase 'arraybuffer':\n\t\t\t\t\t\treturn response.arrayBuffer();\n\t\t\t\t\tcase 'blob':\n\t\t\t\t\t\treturn response.blob();\n\t\t\t\t\tcase 'document':\n\t\t\t\t\t\treturn response.text()\n\t\t\t\t\t\t\t.then(text => {\n\t\t\t\t\t\t\t\tconst parser = new DOMParser();\n\t\t\t\t\t\t\t\treturn parser.parseFromString(text, mimeType);\n\t\t\t\t\t\t\t});\n\t\t\t\t\tcase 'json':\n\t\t\t\t\t\treturn response.json();\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tif (mimeType === '') {\n\t\t\t\t\t\t\treturn response.text();\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// sniff encoding\n\t\t\t\t\t\t\tconst re = /charset=\"?([^;\"\\s]*)\"?/i;\n\t\t\t\t\t\t\tconst exec = re.exec(mimeType);\n\t\t\t\t\t\t\tconst label = exec && exec[1] ? exec[1].toLowerCase() : undefined;\n\t\t\t\t\t\t\tconst decoder = new TextDecoder(label);\n\t\t\t\t\t\t\treturn response.arrayBuffer().then(ab => decoder.decode(ab));\n\t\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t})\n\t\t\t.then(data => {\n\t\t\t\tif (onLoad) onLoad(data);\n\t\t\t})\n\t\t\t.catch(err => {\n\t\t\t\tonError && onError(err);\n\n\t\t\t\tthis.manager.itemError(url);\n\t\t\t})\n\t\t\t.finally(() => {\n\t\t\t\tthis.manager.itemEnd(url);\n\t\t\t});\n\n\t\tthis.manager.itemStart(url);\n\t}\n\n\t/**\n\t * Sets the expected response type.\n\t * @param {'arraybuffer'|'blob'|'document'|'json'|''} value - The response type.\n\t * @returns {FileLoader} A reference to this file loader.\n\t */\n\tsetResponseType(value) {\n\t\tthis.responseType = value;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the expected mime type of the loaded file.\n\t * @param {string} value - The mime type.\n\t * @returns {FileLoader} A reference to this file loader.\n\t */\n\tsetMimeType(value) {\n\t\tthis.mimeType = value;\n\t\treturn this;\n\t}\n\n}\n\nclass HttpError extends Error {\n\n\tconstructor(message, response) {\n\t\tsuper(message);\n\t\tthis.response = response;\n\t}\n\n}\n\n/**\n * A loader for loading images. The class loads images with the HTML `Image` API.\n * Please note that 'ImageLoader' not support progress events.\n * ```js\n * const loader = new ImageLoader();\n * const image = await loader.loadAsync('image.png');\n * ```\n * @extends Loader\n */\nclass ImageLoader extends Loader {\n\n\t/**\n\t * Constructs a new image loader.\n\t * @param {LoadingManager} [manager] - The loading manager.\n\t */\n\tconstructor(manager) {\n\t\tsuper(manager);\n\t}\n\n\t/**\n\t * Starts loading from the given URL and passes the loaded image\n\t * to the `onLoad()` callback. The method also returns a new `Image` object which can\n\t * directly be used for texture creation. If you do it this way, the texture\n\t * may pop up in your scene once the respective loading process is finished.\n\t * @param {string} url - The path/URL of the file to be loaded. This can also be a data URI.\n\t * @param {Function} [onLoad] - Executed when the loading process has been finished. The argument is an `HTMLImageElement`.\n\t * @param {onProgressCallback} [onProgress] - Unsupported in this loader.\n\t * @param {onErrorCallback} [onError] - Executed when errors occur.\n\t * @returns {HTMLImageElement} The image.\n\t */\n\tload(url, onLoad, onProgress, onError) {\n\t\tif (url === undefined) url = '';\n\t\tif (this.path !== undefined) url = this.path + url;\n\n\t\turl = this.manager.resolveURL(url);\n\n\t\tconst scope = this;\n\n\t\tconst image = document.createElementNS('http://www.w3.org/1999/xhtml', 'img');\n\n\t\tfunction onImageLoad() {\n\t\t\tremoveEventListeners();\n\n\t\t\tif (onLoad) onLoad(this);\n\n\t\t\tscope.manager.itemEnd(url);\n\t\t}\n\n\t\tfunction onImageError(event) {\n\t\t\tremoveEventListeners();\n\n\t\t\tif (onError) onError(event);\n\n\t\t\tscope.manager.itemError(url);\n\t\t\tscope.manager.itemEnd(url);\n\t\t}\n\n\t\tfunction removeEventListeners() {\n\t\t\timage.removeEventListener('load', onImageLoad, false);\n\t\t\timage.removeEventListener('error', onImageError, false);\n\t\t}\n\n\t\timage.addEventListener('load', onImageLoad, false);\n\t\timage.addEventListener('error', onImageError, false);\n\n\t\tif (url.slice(0, 5) !== 'data:') {\n\t\t\tif (this.crossOrigin !== undefined) image.crossOrigin = this.crossOrigin;\n\t\t}\n\n\t\tscope.manager.itemStart(url);\n\n\t\timage.src = url;\n\n\t\treturn image;\n\t}\n\n}\n\n/**\n * The vector 2 class\n */\nclass Vector2 {\n\n\t/**\n\t * @param {number} [x=0] - the x value of this vector.\n\t * @param {number} [y=0] - the y value of this vector.\n\t */\n\tconstructor(x = 0, y = 0) {\n\t\tthis.x = x;\n\t\tthis.y = y;\n\t}\n\n\t/**\n\t * Sets the x and y components of this vector.\n\t * @param {number} x\n\t * @param {number} y\n\t * @returns {Vector2}\n\t */\n\tset(x = 0, y = 0) {\n\t\tthis.x = x;\n\t\tthis.y = y;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets this vector to be the vector linearly interpolated between v1 and v2\n\t * where ratio is the percent distance along the line connecting the two vectors\n\t * - ratio = 0 will be v1, and ratio = 1 will be v2.\n\t * @param {Vector2} v1 - the starting Vector2.\n\t * @param {Vector2} v2 - Vector2 to interpolate towards.\n\t * @param {number} ratio - interpolation factor, typically in the closed interval [0, 1].\n\t * @returns {Vector2}\n\t */\n\tlerpVectors(v1, v2, ratio) {\n\t\treturn this.subVectors(v2, v1).multiplyScalar(ratio).add(v1);\n\t}\n\n\t/**\n\t * If this vector's x or y value is greater than v's x or y value, replace that value with the corresponding min value.\n\t * @param {Vector2} v\n\t * @returns {Vector2}\n\t */\n\tmin(v) {\n\t\tthis.x = Math.min(this.x, v.x);\n\t\tthis.y = Math.min(this.y, v.y);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * If this vector's x or y value is less than v's x or y value, replace that value with the corresponding max value.\n\t * @param {Vector2} v\n\t * @returns {Vector2}\n\t */\n\tmax(v) {\n\t\tthis.x = Math.max(this.x, v.x);\n\t\tthis.y = Math.max(this.y, v.y);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Computes the Euclidean length (straight-line length) from (0, 0) to (x, y).\n\t * @returns {number}\n\t */\n\tgetLength() {\n\t\treturn Math.sqrt(this.getLengthSquared());\n\t}\n\n\t/**\n\t * Computes the square of the Euclidean length (straight-line length) from (0, 0) to (x, y).\n\t * If you are comparing the lengths of vectors, you should compare the length squared instead\n\t * as it is slightly more efficient to calculate.\n\t * @returns {number}\n\t */\n\tgetLengthSquared() {\n\t\treturn this.x * this.x + this.y * this.y;\n\t}\n\n\t/**\n\t * Converts this vector to a unit vector - that is, sets it equal to a vector with the same direction as this one, but length 1.\n\t * @param {number} [thickness=1]\n\t * @returns {Vector2}\n\t */\n\tnormalize(thickness = 1) {\n\t\tconst length = this.getLength() || 1;\n\t\tconst invLength = thickness / length;\n\n\t\tthis.x *= invLength;\n\t\tthis.y *= invLength;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Subtracts v from the vector.\n\t * @param {Vector2} a\n\t * @param {Vector2} target - the result vector2\n\t * @returns {Vector2}\n\t */\n\tsubtract(a, target = new Vector2()) {\n\t\treturn target.set(this.x - a.x, this.y - a.y);\n\t}\n\n\t/**\n\t * Subtracts v from this vector.\n\t * @param {Vector2} v\n\t * @returns {Vector2}\n\t */\n\tsub(v) {\n\t\tthis.x -= v.x;\n\t\tthis.y -= v.y;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Copies the values of the passed Vector2's x and y properties to this Vector2.\n\t * @param {Vector2} v\n\t * @returns {Vector2}\n\t */\n\tcopy(v) {\n\t\tthis.x = v.x;\n\t\tthis.y = v.y;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets this vector to a + b.\n\t * @param {Vector2} a\n\t * @param {Vector2} b\n\t * @returns {Vector2}\n\t */\n\taddVectors(a, b) {\n\t\tthis.x = a.x + b.x;\n\t\tthis.y = a.y + b.y;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets this vector to a - b.\n\t * @param {Vector2} a\n\t * @param {Vector2} b\n\t * @returns {Vector2}\n\t */\n\tsubVectors(a, b) {\n\t\tthis.x = a.x - b.x;\n\t\tthis.y = a.y - b.y;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Multiplies this vector by scalar.\n\t * @param {number} scalar\n\t * @returns {Vector2}\n\t */\n\tmultiplyScalar(scalar) {\n\t\tthis.x *= scalar;\n\t\tthis.y *= scalar;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Computes the squared distance from this vector to v. If you are just comparing the distance with\n\t * another distance, you should compare the distance squared instead as it is slightly more efficient to calculate.\n\t * @param {Vector2} v\n\t * @returns {number}\n\t */\n\tdistanceToSquared(v) {\n\t\tconst dx = this.x - v.x,\n\t\t\tdy = this.y - v.y;\n\n\t\treturn dx * dx + dy * dy;\n\t}\n\n\t/**\n\t * Computes the distance from this vector to v.\n\t * @param {Vector2} v\n\t * @returns {number}\n\t */\n\tdistanceTo(v) {\n\t\treturn Math.sqrt(this.distanceToSquared(v));\n\t}\n\n\t/**\n\t * Sets this vector's x value to be array[ offset ] and y value to be array[ offset + 1 ].\n\t * @param {number[]} array - the source array.\n\t * @param {number} [offset=0] - offset into the array.\n\t * @param {boolean} [denormalize=false] - if true, denormalize the values, and array should be a typed array.\n\t * @returns {Vector2}\n\t */\n\tfromArray(array, offset = 0, denormalize = false) {\n\t\tlet x = array[offset], y = array[offset + 1];\n\n\t\tif (denormalize) {\n\t\t\tx = MathUtils.denormalize(x, array);\n\t\t\ty = MathUtils.denormalize(y, array);\n\t\t}\n\n\t\tthis.x = x;\n\t\tthis.y = y;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets this array[ offset ] value to be vector's x and array[ offset + 1 ] to be vector's y.\n\t * @param {number[]} [array] - the target array.\n\t * @param {number} [offset=0] - offset into the array.\n\t * @param {boolean} [normalize=false] - if true, normalize the values, and array should be a typed array.\n\t * @returns {number[]}\n\t */\n\ttoArray(array = [], offset = 0, normalize = false) {\n\t\tlet x = this.x, y = this.y;\n\n\t\tif (normalize) {\n\t\t\tx = MathUtils.normalize(x, array);\n\t\t\ty = MathUtils.normalize(y, array);\n\t\t}\n\n\t\tarray[offset] = x;\n\t\tarray[offset + 1] = y;\n\n\t\treturn array;\n\t}\n\n\t/**\n\t * Adds v to this vector.\n\t * @param {Vector2} v\n\t * @returns {Vector2}\n\t */\n\tadd(v) {\n\t\tthis.x += v.x;\n\t\tthis.y += v.y;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Computes the angle in radians of this vector with respect to the positive x-axis.\n\t * @returns {number}\n\t */\n\tangle() {\n\t\t// computes the angle in radians with respect to the positive x-axis\n\n\t\t// let angle = Math.atan2(this.y, this.x);\n\t\t// if (angle < 0) angle += 2 * Math.PI;\n\t\t// return angle;\n\n\t\treturn Math.atan2(-this.y, -this.x) + Math.PI;\n\t}\n\n\t/**\n\t * Inverts this vector - i.e. sets x = -x, y = -y.\n\t * @returns {Vector2}\n\t */\n\tnegate() {\n\t\tthis.x = -this.x;\n\t\tthis.y = -this.y;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Calculate the dot product of this vector and v.\n\t * @param {Vector2} a\n\t * @returns {number}\n\t */\n\tdot(a) {\n\t\treturn this.x * a.x + this.y * a.y;\n\t}\n\n\t/**\n\t * Checks for strict equality of this vector and v.\n\t * @param {Vector2} v\n\t * @returns {boolean}\n\t */\n\tequals(v) {\n\t\treturn ((v.x === this.x) && (v.y === this.y));\n\t}\n\n\t/**\n\t * Returns a new Vector2 with the same x and y values as this one.\n\t * @returns {Vector2}\n\t */\n\tclone() {\n\t\treturn new Vector2(this.x, this.y);\n\t}\n\n\t* [Symbol.iterator]() {\n\t\tyield this.x;\n\t\tyield this.y;\n\t}\n\n}\n\n/**\n * This flag can be used for type testing.\n * @readonly\n * @type {boolean}\n * @default true\n */\nVector2.prototype.isVector2 = true;\n\n/**\n * Represents an axis-aligned bounding box (AABB) in 2D space.\n */\nclass Box2 {\n\n\t/**\n\t * @param {Vector2} min - (optional) Vector2 representing the lower (x, y) boundary of the box.\n\t * \t\t\t\t\t\t\t\tDefault is ( + Infinity, + Infinity ).\n\t * @param {Vector2} max - (optional) Vector2 representing the upper (x, y) boundary of the box.\n\t * \t\t\t\t\t\t\t\tDefault is ( - Infinity, - Infinity ).\n\t */\n\tconstructor(min, max) {\n\t\tthis.min = (min !== undefined) ? min : new Vector2(+Infinity, +Infinity);\n\t\tthis.max = (max !== undefined) ? max : new Vector2(-Infinity, -Infinity);\n\t}\n\n\t/**\n\t * @param {number} x1\n\t * @param {number} y1\n\t * @param {number} x2\n\t * @param {number} y2\n\t */\n\tset(x1, y1, x2, y2) {\n\t\tthis.min.set(x1, y1);\n\t\tthis.max.set(x2, y2);\n\t}\n\n\t/**\n\t * Returns a new Box2 with the same min and max as this one.\n\t * @returns {Box2}\n\t */\n\tclone() {\n\t\treturn new Box2().copy(this);\n\t}\n\n\t/**\n\t * Copies the min and max from box to this box.\n\t * @param {Box2} box\n\t * @returns {Box2}\n\t */\n\tcopy(box) {\n\t\tthis.min.copy(box.min);\n\t\tthis.max.copy(box.max);\n\n\t\treturn this;\n\t}\n\n}\n\n/**\n * This flag can be used for type testing.\n * @readonly\n * @type {boolean}\n * @default true\n */\nBox2.prototype.isBox2 = true;\n\n/**\n * Represents an axis-aligned bounding box (AABB) in 3D space.\n */\nclass Box3 {\n\n\t/**\n\t * @param {Vector3} min - (optional) Vector3 representing the lower (x, y, z) boundary of the box.\n\t * \t\t\t\t\t\t\t\tDefault is ( + Infinity, + Infinity, + Infinity ).\n\t * @param {Vector3} max - (optional) Vector3 representing the upper (x, y, z) boundary of the box.\n\t * \t\t\t\t\t\t\t\tDefault is ( - Infinity, - Infinity, - Infinity ).\n\t */\n\tconstructor(min, max) {\n\t\tthis.min = (min !== undefined) ? min : new Vector3(+Infinity, +Infinity, +Infinity);\n\t\tthis.max = (max !== undefined) ? max : new Vector3(-Infinity, -Infinity, -Infinity);\n\t}\n\n\t/**\n\t * Sets the lower and upper (x, y, z) boundaries of this box.\n\t * @param {Vector3} min - Vector3 representing the lower (x, y, z) boundary of the box.\n\t * @param {Vector3} max - Vector3 representing the lower upper (x, y, z) boundary of the box.\n\t */\n\tset(min, max) {\n\t\tthis.min.copy(min);\n\t\tthis.max.copy(max);\n\t}\n\n\t/**\n\t * Sets the upper and lower bounds of this box to include all of the points in points.\n\t * @param {Vector3[]} points - Array of Vector3s that the resulting box will contain.\n\t * @returns {Box3}\n\t */\n\tsetFromPoints(points) {\n\t\tthis.makeEmpty();\n\n\t\tfor (let i = 0, il = points.length; i < il; i++) {\n\t\t\tthis.expandByPoint(points[i]);\n\t\t}\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Makes this box empty.\n\t * @returns {Box3}\n\t */\n\tmakeEmpty() {\n\t\tthis.min.x = this.min.y = this.min.z = +Infinity;\n\t\tthis.max.x = this.max.y = this.max.z = -Infinity;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Expands the boundaries of this box to include point.\n\t * @param {Vector3} point - Vector3 that should be included in the box.\n\t * @returns {Box3}\n\t */\n\texpandByPoint(point) {\n\t\tthis.min.min(point);\n\t\tthis.max.max(point);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Expands each dimension of the box by scalar. If negative, the dimensions of the box will be contracted.\n\t * @param {number} scalar - Distance to expand the box by.\n\t * @returns {Box3}\n\t */\n\texpandByScalar(scalar) {\n\t\tthis.min.addScalar(-scalar);\n\t\tthis.max.addScalar(scalar);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Expands the boundaries of this box to include box3.\n\t * @param {Box3} box3 - Box that will be unioned with this box.\n\t * @returns {Box3}\n\t */\n\texpandByBox3(box3) {\n\t\tthis.min.min(box3.min);\n\t\tthis.max.max(box3.max);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the upper and lower bounds of this box to include all of the data in array.\n\t * @param {number[]} array - An array of position data that the resulting box will envelop.\n\t * @param {number} [gap=3] - The number of elements between the start of each position in the array.\n\t * @param {number} [offset=0] - The offset in each gap where the position data starts.\n\t * @param {boolean} [denormalize=false] - Whether to denormalize the values in the array.\n\t * @returns {Box3} A reference to this box.\n\t */\n\tsetFromArray(array, gap = 3, offset = 0, denormalize = false) {\n\t\tlet minX = +Infinity;\n\t\tlet minY = +Infinity;\n\t\tlet minZ = +Infinity;\n\n\t\tlet maxX = -Infinity;\n\t\tlet maxY = -Infinity;\n\t\tlet maxZ = -Infinity;\n\n\t\tfor (let i = 0, l = array.length; i < l; i += gap) {\n\t\t\tlet x = array[i + offset];\n\t\t\tlet y = array[i + offset + 1];\n\t\t\tlet z = array[i + offset + 2];\n\n\t\t\tif (denormalize) {\n\t\t\t\tx = MathUtils.denormalize(x, array);\n\t\t\t\ty = MathUtils.denormalize(y, array);\n\t\t\t\tz = MathUtils.denormalize(z, array);\n\t\t\t}\n\n\t\t\tif (x < minX) minX = x;\n\t\t\tif (y < minY) minY = y;\n\t\t\tif (z < minZ) minZ = z;\n\n\t\t\tif (x > maxX) maxX = x;\n\t\t\tif (y > maxY) maxY = y;\n\t\t\tif (z > maxZ) maxZ = z;\n\t\t}\n\n\t\tthis.min.set(minX, minY, minZ);\n\t\tthis.max.set(maxX, maxY, maxZ);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Clamps the point within the bounds of this box.\n\t * @param {Vector3} point - Vector3 to clamp.\n\t * @param {Vector3} target - Vector3 to store the result in.\n\t * @returns {Vector3}\n\t */\n\tclampPoint(point, target) {\n\t\treturn target.copy(point).min(this.max).max(this.min);\n\t}\n\n\t/**\n\t * Returns the distance from any edge of this box to the specified point.\n\t * If the point lies inside of this box, the distance will be 0.\n\t * @param {Vector3} point - Vector3 to measure the distance to.\n\t * @returns {number}\n\t */\n\tdistanceToPoint(point) {\n\t\treturn this.clampPoint(point, _vec3_1$5).distanceTo(point);\n\t}\n\n\t/**\n\t * Returns aMinimum Bounding Sphere for the box.\n\t * @param {Sphere} target — the result will be copied into this Sphere.\n\t * @returns {Sphere}\n\t */\n\tgetBoundingSphere(target) {\n\t\tif (this.isEmpty()) {\n\t\t\ttarget.makeEmpty();\n\t\t} else {\n\t\t\tthis.getCenter(target.center);\n\t\t\ttarget.radius = this.getSize(_vec3_1$5).getLength() * 0.5;\n\t\t}\n\n\t\treturn target;\n\t}\n\n\t/**\n\t * Returns true if this box includes zero points within its bounds.\n\t * @returns {boolean}\n\t */\n\tisEmpty() {\n\t\t// this is a more robust check for empty than ( volume <= 0 ) because volume can get positive with two negative axes\n\t\treturn (this.max.x < this.min.x) || (this.max.y < this.min.y) || (this.max.z < this.min.z);\n\t}\n\n\t/**\n\t * Returns true if this box and box share the same lower and upper bounds.\n\t * @param {Box3} box - Box to compare with this one.\n\t * @returns {boolean}\n\t */\n\tequals(box) {\n\t\treturn box.min.equals(this.min) && box.max.equals(this.max);\n\t}\n\n\t/**\n\t * Returns the center point of the box as a Vector3.\n\t * @param {Vector3} target - the result will be copied into this Vector3.\n\t * @returns {Vector3}\n\t */\n\tgetCenter(target = new Vector3()) {\n\t\treturn this.isEmpty() ? target.set(0, 0, 0) : target.addVectors(this.min, this.max).multiplyScalar(0.5);\n\t}\n\n\t/**\n\t * Returns the width, height and depth of this box.\n\t * @param {Vector3} target - the result will be copied into this Vector3.\n\t * @returns {Vector3}\n\t */\n\tgetSize(target = new Vector3()) {\n\t\treturn this.isEmpty() ? target.set(0, 0, 0) : target.subVectors(this.max, this.min);\n\t}\n\n\t/**\n\t * Get the 8 corner points of the bounding box, the order is as follows:\n\t *   7-------3\n\t *  /|      /|\n\t * 4-------0 |\n\t * | |     | |\n\t * | 6-----|-2\n\t * |/      |/\n\t * 5-------1\n\t * @param {Vector3[]} points - The array to store the points.\n\t * @returns {Vector3[]} The array of points.\n\t */\n\tgetPoints(points) {\n\t\tconst minX = this.min.x, minY = this.min.y, minZ = this.min.z;\n\t\tconst maxX = this.max.x, maxY = this.max.y, maxZ = this.max.z;\n\n\t\tpoints[0].set(maxX, maxY, maxZ);\n\t\tpoints[1].set(maxX, minY, maxZ);\n\t\tpoints[2].set(maxX, minY, minZ);\n\t\tpoints[3].set(maxX, maxY, minZ);\n\t\tpoints[4].set(minX, maxY, maxZ);\n\t\tpoints[5].set(minX, minY, maxZ);\n\t\tpoints[6].set(minX, minY, minZ);\n\t\tpoints[7].set(minX, maxY, minZ);\n\n\t\treturn points;\n\t}\n\n\t/**\n\t * Computes the union of this box and box,\n\t * setting the upper bound of this box to the greater of the two boxes' upper bounds and the lower bound of this box to the lesser of the two boxes' lower bounds.\n\t * @param {Box3} box - Box that will be unioned with this box.\n\t * @returns {Box3}\n\t */\n\tunion(box) {\n\t\tthis.min.min(box.min);\n\t\tthis.max.max(box.max);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Transforms this Box3 with the supplied matrix.\n\t * @param {Matrix4} matrix - The Matrix4 to apply\n\t * @returns {Box3}\n\t */\n\tapplyMatrix4(matrix) {\n\t\t// transform of empty box is an empty box.\n\t\tif (this.isEmpty()) return this;\n\n\t\t// NOTE: I am using a binary pattern to specify all 2^3 combinations below\n\t\t_points[0].set(this.min.x, this.min.y, this.min.z).applyMatrix4(matrix); // 000\n\t\t_points[1].set(this.min.x, this.min.y, this.max.z).applyMatrix4(matrix); // 001\n\t\t_points[2].set(this.min.x, this.max.y, this.min.z).applyMatrix4(matrix); // 010\n\t\t_points[3].set(this.min.x, this.max.y, this.max.z).applyMatrix4(matrix); // 011\n\t\t_points[4].set(this.max.x, this.min.y, this.min.z).applyMatrix4(matrix); // 100\n\t\t_points[5].set(this.max.x, this.min.y, this.max.z).applyMatrix4(matrix); // 101\n\t\t_points[6].set(this.max.x, this.max.y, this.min.z).applyMatrix4(matrix); // 110\n\t\t_points[7].set(this.max.x, this.max.y, this.max.z).applyMatrix4(matrix); // 111\n\n\t\tthis.setFromPoints(_points);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Returns true if the specified point lies within or on the boundaries of this box.\n\t * @param {Vector3} point - Vector3 to check for inclusion.\n\t * @returns {boolean}\n\t */\n\tcontainsPoint(point) {\n\t\treturn point.x < this.min.x || point.x > this.max.x ||\n\t\t\tpoint.y < this.min.y || point.y > this.max.y ||\n\t\t\tpoint.z < this.min.z || point.z > this.max.z ? false : true;\n\t}\n\n\t/**\n\t * Determines whether or not this box intersects triangle.\n\t * @param {Triangle} triangle - Triangle to check for intersection against.\n\t * @returns {boolean}\n\t */\n\tintersectsTriangle(triangle) {\n\t\tif (this.isEmpty()) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// compute box center and extents\n\t\tthis.getCenter(_center);\n\t\t_extents.subVectors(this.max, _center);\n\n\t\t// translate triangle to aabb origin\n\t\t_v0$1.subVectors(triangle.a, _center);\n\t\t_v1$1.subVectors(triangle.b, _center);\n\t\t_v2$1.subVectors(triangle.c, _center);\n\n\t\t// compute edge vectors for triangle\n\t\t_f0.subVectors(_v1$1, _v0$1);\n\t\t_f1.subVectors(_v2$1, _v1$1);\n\t\t_f2.subVectors(_v0$1, _v2$1);\n\n\t\t// test against axes that are given by cross product combinations of the edges of the triangle and the edges of the aabb\n\t\t// make an axis testing of each of the 3 sides of the aabb against each of the 3 sides of the triangle = 9 axis of separation\n\t\t// axis_ij = u_i x f_j (u0, u1, u2 = face normals of aabb = x,y,z axes vectors since aabb is axis aligned)\n\t\tlet axes = [\n\t\t\t0, -_f0.z, _f0.y, 0, -_f1.z, _f1.y, 0, -_f2.z, _f2.y,\n\t\t\t_f0.z, 0, -_f0.x, _f1.z, 0, -_f1.x, _f2.z, 0, -_f2.x,\n\t\t\t-_f0.y, _f0.x, 0, -_f1.y, _f1.x, 0, -_f2.y, _f2.x, 0\n\t\t];\n\t\tif (!satForAxes(axes, _v0$1, _v1$1, _v2$1, _extents)) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// test 3 face normals from the aabb\n\t\taxes = [1, 0, 0, 0, 1, 0, 0, 0, 1];\n\t\tif (!satForAxes(axes, _v0$1, _v1$1, _v2$1, _extents)) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// finally testing the face normal of the triangle\n\t\t// use already existing triangle edge vectors here\n\t\t_triangleNormal.crossVectors(_f0, _f1);\n\t\taxes = [_triangleNormal.x, _triangleNormal.y, _triangleNormal.z];\n\n\t\treturn satForAxes(axes, _v0$1, _v1$1, _v2$1, _extents);\n\t}\n\n\t/**\n\t * Returns a new Box3 with the same min and max as this one.\n\t * @returns {Box3}\n\t */\n\tclone() {\n\t\treturn new Box3().copy(this);\n\t}\n\n\t/**\n\t * Copies the min and max from box to this box.\n\t * @param {Box3} box - Box3 to copy.\n\t * @returns {Box3}\n\t */\n\tcopy(box) {\n\t\tthis.min.copy(box.min);\n\t\tthis.max.copy(box.max);\n\n\t\treturn this;\n\t}\n\n}\n\n/**\n * This flag can be used for type testing.\n * @readonly\n * @type {boolean}\n * @default true\n */\nBox3.prototype.isBox3 = true;\n\nconst _points = [\n\tnew Vector3(),\n\tnew Vector3(),\n\tnew Vector3(),\n\tnew Vector3(),\n\tnew Vector3(),\n\tnew Vector3(),\n\tnew Vector3(),\n\tnew Vector3()\n];\n\nconst _vec3_1$5 = new Vector3();\n\n// triangle centered vertices\n\nconst _v0$1 = new Vector3();\nconst _v1$1 = new Vector3();\nconst _v2$1 = new Vector3();\n\n// triangle edge vectors\n\nconst _f0 = new Vector3();\nconst _f1 = new Vector3();\nconst _f2 = new Vector3();\n\nconst _center = new Vector3();\nconst _extents = new Vector3();\nconst _triangleNormal = new Vector3();\nconst _testAxis = new Vector3();\n\nfunction satForAxes(axes, v0, v1, v2, extents) {\n\tfor (let i = 0, j = axes.length - 3; i <= j; i += 3) {\n\t\t_testAxis.fromArray(axes, i);\n\t\t// project the aabb onto the separating axis\n\t\tconst r = extents.x * Math.abs(_testAxis.x) + extents.y * Math.abs(_testAxis.y) + extents.z * Math.abs(_testAxis.z);\n\t\t// project all 3 vertices of the triangle onto the separating axis\n\t\tconst p0 = v0.dot(_testAxis);\n\t\tconst p1 = v1.dot(_testAxis);\n\t\tconst p2 = v2.dot(_testAxis);\n\t\t// actual test, basically see if either of the most extreme of the triangle points intersects r\n\t\tif (Math.max(-Math.max(p0, p1, p2), Math.min(p0, p1, p2)) > r) {\n\t\t\t// points of the projected triangle are outside the projected half-length of the aabb\n\t\t\t// the axis is separating and we can exit\n\t\t\treturn false;\n\t\t}\n\t}\n\n\treturn true;\n}\n\n/**\n * A Color3 instance is represented by RGB components.\n */\nclass Color3 {\n\n\t/**\n\t * Constructs a new three-component color.\n\t * @param {number} [r] - The red component of the color. If `g` and `b` are not provided, it can be a hexadecimal triplet.\n\t * @param {number} [g] - The green component.\n\t * @param {number} [b] - The blue component.\n\t */\n\tconstructor(r, g, b) {\n\t\t/**\n\t\t * The red component.\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.r = 0;\n\n\t\t/**\n\t\t * The green component.\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.g = 0;\n\n\t\t/**\n\t\t * The blue component.\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.b = 0;\n\n\t\tif (g === undefined && b === undefined) {\n\t\t\tthis.setHex(r);\n\t\t} else {\n\t\t\tthis.setRGB(r, g, b);\n\t\t}\n\t}\n\n\t/**\n\t * Sets this color from a hexadecimal value.\n\t * @param {number} hex - The hexadecimal value.\n\t * @returns {Color3} A reference to this color.\n\t */\n\tsetHex(hex) {\n\t\thex = Math.floor(hex);\n\n\t\tthis.r = (hex >> 16 & 255) / 255;\n\t\tthis.g = (hex >> 8 & 255) / 255;\n\t\tthis.b = (hex & 255) / 255;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets this color from RGB values.\n\t * @param {number} r - Red channel value between 0.0 and 1.0.\n\t * @param {number} g - Green channel value between 0.0 and 1.0.\n\t * @param {number} b - Blue channel value between 0.0 and 1.0.\n\t * @returns {Color3} A reference to this color.\n\t */\n\tsetRGB(r, g, b) {\n\t\tthis.r = r;\n\t\tthis.g = g;\n\t\tthis.b = b;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Set this color from HSL values.\n\t * @param {number} h - Hue value between 0.0 and 1.0.\n\t * @param {number} s - Saturation value between 0.0 and 1.0.\n\t * @param {number} l - Lightness value between 0.0 and 1.0.\n\t * @returns {Color3} A reference to this color.\n\t */\n\tsetHSL(h, s, l) {\n\t\t// h,s,l ranges are in 0.0 - 1.0\n\t\th = MathUtils.euclideanModulo(h, 1);\n\t\ts = MathUtils.clamp(s, 0, 1);\n\t\tl = MathUtils.clamp(l, 0, 1);\n\n\t\tif (s === 0) {\n\t\t\tthis.r = this.g = this.b = l;\n\t\t} else {\n\t\t\tconst p = l <= 0.5 ? l * (1 + s) : l + s - (l * s);\n\t\t\tconst q = (2 * l) - p;\n\n\t\t\tthis.r = hue2rgb(q, p, h + 1 / 3);\n\t\t\tthis.g = hue2rgb(q, p, h);\n\t\t\tthis.b = hue2rgb(q, p, h - 1 / 3);\n\t\t}\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Returns a new color with copied values from this instance.\n\t * @returns {Color3} A clone of this instance.\n\t */\n\tclone() {\n\t\treturn new this.constructor(this.r, this.g, this.b);\n\t}\n\n\t/**\n\t * Copies the values of the given color to this instance.\n\t * @param {Color3} color - The color to copy.\n\t * @returns {Color3} A reference to this color.\n\t */\n\tcopy(color) {\n\t\tthis.r = color.r;\n\t\tthis.g = color.g;\n\t\tthis.b = color.b;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Converts this color from sRGB space to linear space.\n\t * @returns {Color3} A reference to this color.\n\t */\n\tconvertSRGBToLinear() {\n\t\tthis.r = SRGBToLinear(this.r);\n\t\tthis.g = SRGBToLinear(this.g);\n\t\tthis.b = SRGBToLinear(this.b);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Converts this color from linear space to sRGB space.\n\t * @returns {Color3} A reference to this color.\n\t */\n\tconvertLinearToSRGB() {\n\t\tthis.r = LinearToSRGB(this.r);\n\t\tthis.g = LinearToSRGB(this.g);\n\t\tthis.b = LinearToSRGB(this.b);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Returns the hexadecimal value of this color.\n\t * @returns {number} The hexadecimal value.\n\t */\n\tgetHex() {\n\t\treturn MathUtils.clamp(this.r * 255, 0, 255) << 16 ^ MathUtils.clamp(this.g * 255, 0, 255) << 8 ^ MathUtils.clamp(this.b * 255, 0, 255) << 0;\n\t}\n\n\t/**\n\t * Linearly interpolates this color's RGB values toward the RGB values of the\n\t * given color. The alpha argument can be thought of as the ratio between\n\t * the two colors, where 0.0 is this color and 1.0 is the first argument.\n\t * @param {Color3} color - The color to converge on.\n\t * @param {number} alpha - The interpolation factor in the closed interval [0,1].\n\t * @returns {Color3} A reference to this color.\n\t */\n\tlerp(color, alpha) {\n\t\treturn this.lerpColors(this, color, alpha);\n\t}\n\n\t/**\n\t * Linearly interpolates between the given colors and stores the result in this instance.\n\t * The alpha argument can be thought of as the ratio between the two colors, where 0.0\n\t * is the first and 1.0 is the second color.\n\t * @param {Color3} color1 - The first color.\n\t * @param {Color3} color2 - The second color.\n\t * @param {number} alpha - The interpolation factor in the closed interval [0,1].\n\t * @returns {Color3} A reference to this color.\n\t */\n\tlerpColors(color1, color2, alpha) {\n\t\tthis.r = MathUtils.lerp(color1.r, color2.r, alpha);\n\t\tthis.g = MathUtils.lerp(color1.g, color2.g, alpha);\n\t\tthis.b = MathUtils.lerp(color1.b, color2.b, alpha);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets this color's RGB components from the given array.\n\t * @param {number[]} array - An array holding the RGB values.\n\t * @param {number} [offset=0] - The offset into the array.\n\t * @param {boolean} [denormalize=false] - If true, denormalize the values, and array should be a typed array.\n\t * @returns {Color3} A reference to this color.\n\t */\n\tfromArray(array, offset = 0, denormalize = false) {\n\t\tlet r = array[offset], g = array[offset + 1], b = array[offset + 2];\n\n\t\tif (denormalize) {\n\t\t\tr = MathUtils.denormalize(r, array);\n\t\t\tg = MathUtils.denormalize(g, array);\n\t\t\tb = MathUtils.denormalize(b, array);\n\t\t}\n\n\t\tthis.r = r;\n\t\tthis.g = g;\n\t\tthis.b = b;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Writes the RGB components of this color to the given array. If no array is provided,\n\t * the method returns a new instance.\n\t * @param {number[]} [array=[]] - The target array holding the color components.\n\t * @param {number} [offset=0] - Index of the first element in the array.\n\t * @param {boolean} [normalize=false] - If true, normalize the values, and array should be a typed array.\n\t * @returns {number[]} The color components.\n\t */\n\ttoArray(array = [], offset = 0, normalize = false) {\n\t\tlet r = this.r, g = this.g, b = this.b;\n\n\t\tif (normalize) {\n\t\t\tr = MathUtils.normalize(r, array);\n\t\t\tg = MathUtils.normalize(g, array);\n\t\t\tb = MathUtils.normalize(b, array);\n\t\t}\n\n\t\tarray[offset] = r;\n\t\tarray[offset + 1] = g;\n\t\tarray[offset + 2] = b;\n\n\t\treturn array;\n\t}\n\n\t* [Symbol.iterator]() {\n\t\tyield this.r;\n\t\tyield this.g;\n\t\tyield this.b;\n\t}\n\n}\n\n/**\n * This flag can be used for type testing.\n * @readonly\n * @type {boolean}\n * @default true\n */\nColor3.prototype.isColor3 = true;\n\nfunction hue2rgb(p, q, t) {\n\tif (t < 0) t += 1;\n\tif (t > 1) t -= 1;\n\tif (t < 1 / 6) return p + (q - p) * 6 * t;\n\tif (t < 1 / 2) return q;\n\tif (t < 2 / 3) return p + (q - p) * 6 * (2 / 3 - t);\n\treturn p;\n}\n\nfunction SRGBToLinear(c) {\n\treturn (c < 0.04045) ? c * 0.0773993808 : Math.pow(c * 0.9478672986 + 0.0521327014, 2.4);\n}\n\nfunction LinearToSRGB(c) {\n\treturn (c < 0.0031308) ? c * 12.92 : 1.055 * (Math.pow(c, 0.41666)) - 0.055;\n}\n\n/**\n * A Color4 instance is represented by RGBA components.\n */\nclass Color4 {\n\n\t/**\n\t * Constructs a new four-component color.\n\t * @param {number} [r=0] - The red value.\n\t * @param {number} [g=0] - The green value.\n\t * @param {number} [b=0] - The blue value.\n\t * @param {number} [a=1] - The alpha value.\n\t */\n\tconstructor(r = 0, g = 0, b = 0, a = 1) {\n\t\t/**\n\t\t * The red component.\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.r = r;\n\n\t\t/**\n\t\t * The green component.\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.g = g;\n\n\t\t/**\n\t\t * The blue component.\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.b = b;\n\n\t\t/**\n\t\t * The alpha component.\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.a = a;\n\t}\n\n\t/**\n\t * Sets this color from RGBA values.\n\t * @param {number} r - Red channel value between 0.0 and 1.0.\n\t * @param {number} g - Green channel value between 0.0 and 1.0.\n\t * @param {number} b - Blue channel value between 0.0 and 1.0.\n\t * @param {number} a - Alpha channel value between 0.0 and 1.0.\n\t * @returns {Color4} A reference to this color.\n\t */\n\tsetRGBA(r, g, b, a) {\n\t\tthis.r = r;\n\t\tthis.g = g;\n\t\tthis.b = b;\n\t\tthis.a = a;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Returns a new color with copied values from this instance.\n\t * @returns {Color4} A clone of this instance.\n\t */\n\tclone() {\n\t\treturn new Color4(this.r, this.g, this.b, this.a);\n\t}\n\n\t/**\n\t * Copies the values of the given color to this instance.\n\t * @param {Color4} color - The color to copy.\n\t * @returns {Color4} A clone of this instance.\n\t */\n\tcopy(color) {\n\t\tthis.r = color.r;\n\t\tthis.g = color.g;\n\t\tthis.b = color.b;\n\t\tthis.a = color.a;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets this color's RGBA components from the given array.\n\t * @param {number[]} array - An array holding the RGBA values.\n\t * @param {number} [offset=0] - The offset into the array.\n\t * @param {boolean} [denormalize=false] - If true, denormalize the values, and array should be a typed array.\n\t * @returns {Color4} A reference to this color.\n\t */\n\tfromArray(array, offset = 0, denormalize = false) {\n\t\tlet r = array[offset], g = array[offset + 1], b = array[offset + 2], a = array[offset + 3];\n\n\t\tif (denormalize) {\n\t\t\tr = MathUtils.denormalize(r, array);\n\t\t\tg = MathUtils.denormalize(g, array);\n\t\t\tb = MathUtils.denormalize(b, array);\n\t\t\ta = MathUtils.denormalize(a, array);\n\t\t}\n\n\t\tthis.r = r;\n\t\tthis.g = g;\n\t\tthis.b = b;\n\t\tthis.a = a;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Writes the RGBA components of this color to the given array. If no array is provided,\n\t * the method returns a new instance.\n\t * @param {number[]} [array=[]] - The target array holding the color components.\n\t * @param {number} [offset=0] - Index of the first element in the array.\n\t * @param {boolean} [normalize=false] - If true, normalize the values, and array should be a typed array.\n\t * @returns {number[]} The color components.\n\t */\n\ttoArray(array = [], offset = 0, normalize = false) {\n\t\tlet r = this.r, g = this.g, b = this.b, a = this.a;\n\n\t\tif (normalize) {\n\t\t\tr = MathUtils.normalize(r, array);\n\t\t\tg = MathUtils.normalize(g, array);\n\t\t\tb = MathUtils.normalize(b, array);\n\t\t\ta = MathUtils.normalize(a, array);\n\t\t}\n\n\t\tarray[offset] = r;\n\t\tarray[offset + 1] = g;\n\t\tarray[offset + 2] = b;\n\t\tarray[offset + 3] = a;\n\n\t\treturn array;\n\t}\n\n\t* [Symbol.iterator]() {\n\t\tyield this.r;\n\t\tyield this.g;\n\t\tyield this.b;\n\t\tyield this.a;\n\t}\n\n}\n\n/**\n * This flag can be used for type testing.\n * @readonly\n * @type {boolean}\n * @default true\n */\nColor4.prototype.isColor4 = true;\n\nconst _matrix$1 = new Matrix4();\n\n/**\n * Euler class.\n */\nclass Euler {\n\n\t/**\n\t * @param {number} [x=0]\n\t * @param {number} [y=0]\n\t * @param {number} [z=0]\n\t * @param {string} [order=Euler.DefaultOrder]\n\t */\n\tconstructor(x = 0, y = 0, z = 0, order = Euler.DefaultOrder) {\n\t\tthis._x = x;\n\t\tthis._y = y;\n\t\tthis._z = z;\n\t\tthis._order = order;\n\t}\n\n\t/**\n\t * @type {number}\n\t */\n\tget x() {\n\t\treturn this._x;\n\t}\n\n\t/**\n\t * @type {number}\n\t */\n\tset x(value) {\n\t\tthis._x = value;\n\t\tthis.onChangeCallback();\n\t}\n\n\t/**\n\t * @type {number}\n\t */\n\tget y() {\n\t\treturn this._y;\n\t}\n\n\t/**\n\t * @type {number}\n\t */\n\tset y(value) {\n\t\tthis._y = value;\n\t\tthis.onChangeCallback();\n\t}\n\n\t/**\n\t * @type {number}\n\t */\n\tget z() {\n\t\treturn this._z;\n\t}\n\n\t/**\n\t * @type {number}\n\t */\n\tset z(value) {\n\t\tthis._z = value;\n\t\tthis.onChangeCallback();\n\t}\n\n\t/**\n\t * @type {string}\n\t */\n\tget order() {\n\t\treturn this._order;\n\t}\n\n\t/**\n\t * @type {string}\n\t */\n\tset order(value) {\n\t\tthis._order = value;\n\t\tthis.onChangeCallback();\n\t}\n\n\t/**\n\t * Returns a new Euler with the same parameters as this one.\n\t * @returns {Euler}\n\t */\n\tclone() {\n\t\treturn new Euler(this._x, this._y, this._z, this._order);\n\t}\n\n\t/**\n\t * Copies value of euler to this euler.\n\t * @param {Euler} euler\n\t * @returns {Euler}\n\t */\n\tcopy(euler) {\n\t\tthis._x = euler._x;\n\t\tthis._y = euler._y;\n\t\tthis._z = euler._z;\n\t\tthis._order = euler._order;\n\n\t\tthis.onChangeCallback();\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * @param {number} x - the angle of the x axis in radians.\n\t * @param {number} y - the angle of the y axis in radians.\n\t * @param {number} z - the angle of the z axis in radians.\n\t * @param {string} order - (optional) a string representing the order that the rotations are applied.\n\t * @returns {Euler}\n\t */\n\tset(x = 0, y = 0, z = 0, order = this._order) {\n\t\tthis._x = x;\n\t\tthis._y = y;\n\t\tthis._z = z;\n\t\tthis._order = order;\n\n\t\tthis.onChangeCallback();\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the angles of this euler transform from a pure rotation matrix based on the orientation specified by order.\n\t * @param {Matrix4} m - a Matrix4 of which the upper 3x3 of matrix is a pure rotation matrix\n\t * @param {string} order - (optional) a string representing the order that the rotations are applied.\n\t * @param {boolean} [update=true] - Whether to notify Euler angle has changed\n\t * @returns {Euler}\n\t */\n\tsetFromRotationMatrix(m, order = this._order, update = true) {\n\t\t// assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)\n\n\t\tconst te = m.elements;\n\t\tconst m11 = te[0], m12 = te[4], m13 = te[8];\n\t\tconst m21 = te[1], m22 = te[5], m23 = te[9];\n\t\tconst m31 = te[2], m32 = te[6], m33 = te[10];\n\n\t\tif (order === 'XYZ') {\n\t\t\tthis._y = Math.asin(MathUtils.clamp(m13, -1, 1));\n\n\t\t\tif (Math.abs(m13) < 0.99999) {\n\t\t\t\tthis._x = Math.atan2(-m23, m33);\n\t\t\t\tthis._z = Math.atan2(-m12, m11);\n\t\t\t} else {\n\t\t\t\tthis._x = Math.atan2(m32, m22);\n\t\t\t\tthis._z = 0;\n\t\t\t}\n\t\t} else if (order === 'YXZ') {\n\t\t\tthis._x = Math.asin(-MathUtils.clamp(m23, -1, 1));\n\n\t\t\tif (Math.abs(m23) < 0.99999) {\n\t\t\t\tthis._y = Math.atan2(m13, m33);\n\t\t\t\tthis._z = Math.atan2(m21, m22);\n\t\t\t} else {\n\t\t\t\tthis._y = Math.atan2(-m31, m11);\n\t\t\t\tthis._z = 0;\n\t\t\t}\n\t\t} else if (order === 'ZXY') {\n\t\t\tthis._x = Math.asin(MathUtils.clamp(m32, -1, 1));\n\n\t\t\tif (Math.abs(m32) < 0.99999) {\n\t\t\t\tthis._y = Math.atan2(-m31, m33);\n\t\t\t\tthis._z = Math.atan2(-m12, m22);\n\t\t\t} else {\n\t\t\t\tthis._y = 0;\n\t\t\t\tthis._z = Math.atan2(m21, m11);\n\t\t\t}\n\t\t} else if (order === 'ZYX') {\n\t\t\tthis._y = Math.asin(-MathUtils.clamp(m31, -1, 1));\n\n\t\t\tif (Math.abs(m31) < 0.99999) {\n\t\t\t\tthis._x = Math.atan2(m32, m33);\n\t\t\t\tthis._z = Math.atan2(m21, m11);\n\t\t\t} else {\n\t\t\t\tthis._x = 0;\n\t\t\t\tthis._z = Math.atan2(-m12, m22);\n\t\t\t}\n\t\t} else if (order === 'YZX') {\n\t\t\tthis._z = Math.asin(MathUtils.clamp(m21, -1, 1));\n\n\t\t\tif (Math.abs(m21) < 0.99999) {\n\t\t\t\tthis._x = Math.atan2(-m23, m22);\n\t\t\t\tthis._y = Math.atan2(-m31, m11);\n\t\t\t} else {\n\t\t\t\tthis._x = 0;\n\t\t\t\tthis._y = Math.atan2(m13, m33);\n\t\t\t}\n\t\t} else if (order === 'XZY') {\n\t\t\tthis._z = Math.asin(-MathUtils.clamp(m12, -1, 1));\n\n\t\t\tif (Math.abs(m12) < 0.99999) {\n\t\t\t\tthis._x = Math.atan2(m32, m22);\n\t\t\t\tthis._y = Math.atan2(m13, m11);\n\t\t\t} else {\n\t\t\t\tthis._x = Math.atan2(-m23, m33);\n\t\t\t\tthis._y = 0;\n\t\t\t}\n\t\t} else {\n\t\t\tconsole.warn('given unsupported order: ' + order);\n\t\t}\n\n\t\tthis._order = order;\n\n\t\tif (update === true) this.onChangeCallback();\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the angles of this euler transform from a normalized quaternion based on the orientation specified by order.\n\t * @param {Quaternion} q - a normalized quaternion.\n\t * @param {string} order - (optional) a string representing the order that the rotations are applied.\n\t * @param {boolean} [update=true] - Whether to notify Euler angle has changed\n\t * @returns {Euler}\n\t */\n\tsetFromQuaternion(q, order, update) {\n\t\tq.toMatrix4(_matrix$1);\n\t\treturn this.setFromRotationMatrix(_matrix$1, order, update);\n\t}\n\n\t/**\n\t * @param {Function} callback - When the Euler angle value changes, the callback method is triggered\n\t * @returns {Euler}\n\t */\n\tonChange(callback) {\n\t\tthis.onChangeCallback = callback;\n\t\treturn this;\n\t}\n\n\tonChangeCallback() {}\n\n\t* [Symbol.iterator]() {\n\t\tyield this._x;\n\t\tyield this._y;\n\t\tyield this._z;\n\t\tyield this._order;\n\t}\n\n}\n\n/**\n * This flag can be used for type testing.\n * @readonly\n * @type {boolean}\n * @default true\n */\nEuler.prototype.isEuler = true;\n\n/**\n * The order in which to apply rotations.\n * @readonly\n */\nEuler.RotationOrders = ['XYZ', 'YZX', 'ZXY', 'XZY', 'YXZ', 'ZYX'];\n\n/**\n * The default order in which to apply rotations.\n * @readonly\n */\nEuler.DefaultOrder = 'XYZ';\n\n/**\n * The 3x3 matrix class.\n */\nclass Matrix3 {\n\n\t/**\n\t * Create a 3x3 matrix.\n\t */\n\tconstructor() {\n\t\tthis.elements = [\n\t\t\t1, 0, 0,\n\t\t\t0, 1, 0,\n\t\t\t0, 0, 1\n\t\t];\n\t}\n\n\t/**\n\t * Sets the 3x3 matrix values to the given row-major sequence of values.\n\t * @param {number} n11 - value to put in row 1, col 1.\n\t * @param {number} n12 - value to put in row 1, col 2.\n\t * @param {number} n13 - value to put in row 1, col 3.\n\t * @param {number} n21 - value to put in row 2, col 1.\n\t * @param {number} n22 - value to put in row 2, col 2.\n\t * @param {number} n23 - value to put in row 2, col 3.\n\t * @param {number} n31 - value to put in row 3, col 1.\n\t * @param {number} n32 - value to put in row 3, col 2.\n\t * @param {number} n33 - value to put in row 3, col 3.\n\t * @returns {Matrix3}\n\t */\n\tset(n11, n12, n13,\n\t\tn21, n22, n23,\n\t\tn31, n32, n33) {\n\t\tconst ele = this.elements;\n\n\t\tele[0] = n11;\n\t\tele[3] = n12;\n\t\tele[6] = n13;\n\n\t\tele[1] = n21;\n\t\tele[4] = n22;\n\t\tele[7] = n23;\n\n\t\tele[2] = n31;\n\t\tele[5] = n32;\n\t\tele[8] = n33;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Resets this matrix to the 3x3 identity matrix\n\t * @returns {Matrix3}\n\t */\n\tidentity() {\n\t\treturn this.set(\n\t\t\t1, 0, 0,\n\t\t\t0, 1, 0,\n\t\t\t0, 0, 1\n\t\t);\n\t}\n\n\t/**\n\t * Checks if the matrix is an identity matrix.\n\t * @returns {boolean} - True if the matrix is an identity matrix, false otherwise.\n\t */\n\tisIdentity() {\n\t\tconst te = this.elements;\n\t\treturn te[0] === 1 && te[3] === 0 && te[6] === 0\n\t\t\t&& te[1] === 0 && te[4] === 1 && te[7] === 0\n\t\t\t&& te[2] === 0 && te[5] === 0 && te[8] === 1;\n\t}\n\n\t/**\n\t * Computes and returns the determinant of this matrix.\n\t * @returns {number} The determinant.\n\t */\n\tdeterminant() {\n\t\tconst te = this.elements;\n\n\t\tconst a = te[0], b = te[1], c = te[2],\n\t\t\td = te[3], e = te[4], f = te[5],\n\t\t\tg = te[6], h = te[7], i = te[8];\n\n\t\treturn a * e * i - a * f * h - b * d * i + b * f * g + c * d * h - c * e * g;\n\t}\n\n\t/**\n\t * Inverts this matrix, using the [analytic method]{@link https://en.wikipedia.org/wiki/Invertible_matrix#Analytic_solution}.\n\t * You can not invert with a determinant of zero. If you attempt this, the method produces\n\t * a zero matrix instead.\n\t * @returns {Matrix3} A reference to this matrix.\n\t */\n\tinvert() {\n\t\tconst te = this.elements,\n\n\t\t\tn11 = te[0], n21 = te[1], n31 = te[2],\n\t\t\tn12 = te[3], n22 = te[4], n32 = te[5],\n\t\t\tn13 = te[6], n23 = te[7], n33 = te[8],\n\n\t\t\tt11 = n33 * n22 - n32 * n23,\n\t\t\tt12 = n32 * n13 - n33 * n12,\n\t\t\tt13 = n23 * n12 - n22 * n13,\n\n\t\t\tdet = n11 * t11 + n21 * t12 + n31 * t13;\n\n\t\tif (det === 0) return this.set(0, 0, 0, 0, 0, 0, 0, 0, 0);\n\n\t\tconst detInv = 1 / det;\n\n\t\tte[0] = t11 * detInv;\n\t\tte[1] = (n31 * n23 - n33 * n21) * detInv;\n\t\tte[2] = (n32 * n21 - n31 * n22) * detInv;\n\n\t\tte[3] = t12 * detInv;\n\t\tte[4] = (n33 * n11 - n31 * n13) * detInv;\n\t\tte[5] = (n31 * n12 - n32 * n11) * detInv;\n\n\t\tte[6] = t13 * detInv;\n\t\tte[7] = (n21 * n13 - n23 * n11) * detInv;\n\t\tte[8] = (n22 * n11 - n21 * n12) * detInv;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Transposes this matrix in place.\n\t * @returns {Matrix3}\n\t */\n\ttranspose() {\n\t\tlet tmp;\n\t\tconst m = this.elements;\n\n\t\ttmp = m[1]; m[1] = m[3]; m[3] = tmp;\n\t\ttmp = m[2]; m[2] = m[6]; m[6] = tmp;\n\t\ttmp = m[5]; m[5] = m[7]; m[7] = tmp;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Return true if this matrix and m are equal.\n\t * @param {Matrix3} matrix\n\t * @returns {boolean}\n\t */\n\tequals(matrix) {\n\t\tconst te = this.elements;\n\t\tconst me = matrix.elements;\n\n\t\tfor (let i = 0; i < 9; i++) {\n\t\t\tif (te[i] !== me[i]) return false;\n\t\t}\n\n\t\treturn true;\n\t}\n\n\t/**\n\t * Sets the elements of this matrix based on an array in column-major format.\n\t * @param {number[]} array\n\t * @param {number} [offset=0]\n\t * @returns {Matrix3}\n\t */\n\tfromArray(array, offset = 0) {\n\t\tfor (let i = 0; i < 9; i++) {\n\t\t\tthis.elements[i] = array[i + offset];\n\t\t}\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Writes the elements of this matrix to an array in column-major format.\n\t * @param {number[]} [array]\n\t * @param {number} [offset=0]\n\t * @returns {number[]}\n\t */\n\ttoArray(array = [], offset = 0) {\n\t\tconst te = this.elements;\n\n\t\tarray[offset] = te[0];\n\t\tarray[offset + 1] = te[1];\n\t\tarray[offset + 2] = te[2];\n\n\t\tarray[offset + 3] = te[3];\n\t\tarray[offset + 4] = te[4];\n\t\tarray[offset + 5] = te[5];\n\n\t\tarray[offset + 6] = te[6];\n\t\tarray[offset + 7] = te[7];\n\t\tarray[offset + 8] = te[8];\n\n\t\treturn array;\n\t}\n\n\t/**\n\t * Creates a new Matrix3 and with identical elements to this one.\n\t * @returns {Matrix3}\n\t */\n\tclone() {\n\t\treturn new Matrix3().fromArray(this.elements);\n\t}\n\n\t/**\n\t * Copies the elements of matrix m into this matrix.\n\t * @param {Matrix3} m\n\t * @returns {Matrix3}\n\t */\n\tcopy(m) {\n\t\tconst te = this.elements;\n\t\tconst me = m.elements;\n\n\t\tte[0] = me[0]; te[1] = me[1]; te[2] = me[2];\n\t\tte[3] = me[3]; te[4] = me[4]; te[5] = me[5];\n\t\tte[6] = me[6]; te[7] = me[7]; te[8] = me[8];\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Post-multiplies this matrix by m.\n\t * @param {Matrix3} m\n\t * @returns {Matrix3}\n\t */\n\tmultiply(m) {\n\t\treturn this.multiplyMatrices(this, m);\n\t}\n\n\t/**\n\t * Pre-multiplies this matrix by m.\n\t * @param {Matrix3} m\n\t * @returns {Matrix3}\n\t */\n\tpremultiply(m) {\n\t\treturn this.multiplyMatrices(m, this);\n\t}\n\n\t/**\n\t * Sets this matrix to a x b.\n\t * @param {Matrix3} a\n\t * @param {Matrix3} b\n\t * @returns {Matrix3}\n\t */\n\tmultiplyMatrices(a, b) {\n\t\tconst ae = a.elements;\n\t\tconst be = b.elements;\n\t\tconst te = this.elements;\n\n\t\tconst a11 = ae[0], a12 = ae[3], a13 = ae[6];\n\t\tconst a21 = ae[1], a22 = ae[4], a23 = ae[7];\n\t\tconst a31 = ae[2], a32 = ae[5], a33 = ae[8];\n\n\t\tconst b11 = be[0], b12 = be[3], b13 = be[6];\n\t\tconst b21 = be[1], b22 = be[4], b23 = be[7];\n\t\tconst b31 = be[2], b32 = be[5], b33 = be[8];\n\n\t\tte[0] = a11 * b11 + a12 * b21 + a13 * b31;\n\t\tte[3] = a11 * b12 + a12 * b22 + a13 * b32;\n\t\tte[6] = a11 * b13 + a12 * b23 + a13 * b33;\n\n\t\tte[1] = a21 * b11 + a22 * b21 + a23 * b31;\n\t\tte[4] = a21 * b12 + a22 * b22 + a23 * b32;\n\t\tte[7] = a21 * b13 + a22 * b23 + a23 * b33;\n\n\t\tte[2] = a31 * b11 + a32 * b21 + a33 * b31;\n\t\tte[5] = a31 * b12 + a32 * b22 + a33 * b32;\n\t\tte[8] = a31 * b13 + a32 * b23 + a33 * b33;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Transform 2D\n\t * @param {number} x - position.x\n\t * @param {number} y - position.y\n\t * @param {number} scaleX - scale.x\n\t * @param {number} scaleY - scale.y\n\t * @param {number} rotation - rotation\n\t * @param {number} anchorX - anchor.x\n\t * @param {number} anchorY - anchor.y\n\t * @returns {Matrix3}\n\t */\n\ttransform(x, y, scaleX, scaleY, rotation, anchorX, anchorY) {\n\t\tconst te = this.elements;\n\n\t\tconst cr = Math.cos(rotation);\n\t\tconst sr = Math.sin(rotation);\n\n\t\tte[0] = cr * scaleX;\n\t\tte[3] = -sr * scaleY;\n\t\tte[6] = x;\n\n\t\tte[1] = sr * scaleX;\n\t\tte[4] = cr * scaleY;\n\t\tte[7] = y;\n\n\t\tte[2] = 0;\n\t\tte[5] = 0;\n\t\tte[8] = 1;\n\n\t\tif (anchorX || anchorY) {\n\t\t\t// prepend the anchor offset:\n\t\t\tte[6] -= anchorX * te[0] + anchorY * te[3];\n\t\t\tte[7] -= anchorX * te[1] + anchorY * te[4];\n\t\t}\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Set the transformation matrix of uv coordinates\n\t * @param {number} tx\n\t * @param {number} ty\n\t * @param {number} sx\n\t * @param {number} sy\n\t * @param {number} rotation\n\t * @param {number} cx\n\t * @param {number} cy\n\t * @returns {Matrix3}\n\t */\n\tsetUvTransform(tx, ty, sx, sy, rotation, cx, cy) {\n\t\tconst c = Math.cos(rotation);\n\t\tconst s = Math.sin(rotation);\n\n\t\treturn this.set(\n\t\t\tsx * c, sx * s, -sx * (c * cx + s * cy) + cx + tx,\n\t\t\t-sy * s, sy * c, -sy * (-s * cx + c * cy) + cy + ty,\n\t\t\t0, 0, 1\n\t\t);\n\t}\n\n\t/**\n\t * Sets the matri3 planes from the matrix4.\n\t * @param {Matrix4} m\n\t * @returns {Matrix3}\n\t */\n\tsetFromMatrix4(m) {\n\t\tconst me = m.elements;\n\n\t\treturn this.set(\n\t\t\tme[0], me[4], me[8],\n\t\t\tme[1], me[5], me[9],\n\t\t\tme[2], me[6], me[10]\n\t\t);\n\t}\n\n\t/**\n\t * Extracts the basis vectors from the matrix.\n\t * @param {Vector3} xAxis\n\t * @param {Vector3} yAxis\n\t * @param {Vector3} zAxis\n\t * @returns {Matrix3}\n\t */\n\textractBasis(xAxis, yAxis, zAxis) {\n\t\tconst te = this.elements;\n\n\t\txAxis.fromArray(te);\n\t\tyAxis.fromArray(te, 3);\n\t\tzAxis.fromArray(te, 6);\n\n\t\treturn this;\n\t}\n\n}\n\n/**\n * This flag can be used for type testing.\n * @readonly\n * @type {boolean}\n * @default true\n */\nMatrix3.prototype.isMatrix3 = true;\n\nconst _vec3_1$4 = new Vector3();\nconst _vec3_2$1 = new Vector3();\nconst _mat3_1$1 = new Matrix3();\n\n/**\n * A two dimensional surface that extends infinitely in 3d space,\n * represented in Hessian normal form by a unit length normal vector and a constant.\n */\nclass Plane {\n\n\t/**\n\t * Constructs a new Plane.\n\t * @param {Vector3} [normal=Vector3(1, 0, 0)] - A unit length Vector3 defining the normal of the plane.\n\t * @param {number} [constant=0] - The signed distance from the origin to the plane.\n\t */\n\tconstructor(normal = new Vector3(1, 0, 0), constant = 0) {\n\t\tthis.normal = normal;\n\t\tthis.constant = constant;\n\t}\n\n\t/**\n\t * Solve a system of equations to find the point where the three planes intersect.\n\t * @param {Plane} p1 - The first plane.\n\t * @param {Plane} p2 - The second plane.\n\t * @param {Plane} p3 - The third plane.\n\t * @param {Vector3} target - The result will be copied into this Vector3.\n\t * @returns {Vector3}\n\t */\n\tstatic intersectPlanes(p1, p2, p3, target) {\n\t\t// Create the matrix using the normals of the planes as rows\n\t\t_mat3_1$1.set(\n\t\t\tp1.normal.x, p1.normal.y, p1.normal.z,\n\t\t\tp2.normal.x, p2.normal.y, p2.normal.z,\n\t\t\tp3.normal.x, p3.normal.y, p3.normal.z\n\t\t);\n\n\t\t// Create the vector using the constants of the planes\n\t\ttarget.set(-p1.constant, -p2.constant, -p3.constant);\n\n\t\t// Solve for X by applying the inverse matrix to vector\n\t\ttarget.applyMatrix3(_mat3_1$1.invert());\n\n\t\treturn target;\n\t}\n\n\t/**\n\t * Sets this plane's normal and constant properties by copying the values from the given normal.\n\t * @param {Vector3} normal - a unit length Vector3 defining the normal of the plane.\n\t * @param {number} constant - the signed distance from the origin to the plane. Default is 0.\n\t * @returns {Plane}\n\t */\n\tset(normal, constant) {\n\t\tthis.normal.copy(normal);\n\t\tthis.constant = constant;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Set the individual components that define the plane.\n\t * @param {number} x - x value of the unit length normal vector.\n\t * @param {number} y - y value of the unit length normal vector.\n\t * @param {number} z - z value of the unit length normal vector.\n\t * @param {number} w - the value of the plane's constant property.\n\t * @returns {Plane}\n\t */\n\tsetComponents(x, y, z, w) {\n\t\tthis.normal.set(x, y, z);\n\t\tthis.constant = w;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the plane's properties as defined by a normal and an arbitrary coplanar point.\n\t * @param {Vector3} normal - a unit length Vector3 defining the normal of the plane.\n\t * @param {Vector3} point - Vector3\n\t * @returns {Plane}\n\t */\n\tsetFromNormalAndCoplanarPoint(normal, point) {\n\t\tthis.normal.copy(normal);\n\t\tthis.constant = -point.dot(this.normal);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Defines the plane based on the 3 provided points.\n\t * The winding order is assumed to be counter-clockwise, and determines the direction of the normal.\n\t * @param {Vector3} a - first point on the plane.\n\t * @param {Vector3} b - second point on the plane.\n\t * @param {Vector3} c - third point on the plane.\n\t * @returns {Plane}\n\t */\n\tsetFromCoplanarPoints(a, b, c) {\n\t\tconst normal = _vec3_1$4.subVectors(c, b).cross(_vec3_2$1.subVectors(a, b)).normalize();\n\t\t// Q: should an error be thrown if normal is zero (e.g. degenerate plane)?\n\t\tthis.setFromNormalAndCoplanarPoint(normal, a);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Normalizes the normal vector, and adjusts the constant value accordingly.\n\t * @returns {Plane}\n\t */\n\tnormalize() {\n\t\t// Note: will lead to a divide by zero if the plane is invalid.\n\n\t\tconst inverseNormalLength = 1.0 / this.normal.getLength();\n\t\tthis.normal.multiplyScalar(inverseNormalLength);\n\t\tthis.constant *= inverseNormalLength;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Returns the signed distance from the point to the plane.\n\t * @param {Vector3} point\n\t * @returns {number}\n\t */\n\tdistanceToPoint(point) {\n\t\treturn this.normal.dot(point) + this.constant;\n\t}\n\n\t/**\n\t * Projects a point onto the plane.\n\t * @param {Vector3} point - the Vector3 to project onto the plane.\n\t * @param {Vector3} [target] - the result will be copied into this Vector3.\n\t * @returns {Vector3}\n\t */\n\tprojectPoint(point, target = new Vector3()) {\n\t\treturn target.copy(point).addScaledVector(this.normal, -this.distanceToPoint(point));\n\t}\n\n\t/**\n\t * Reflects a point through the plane.\n\t * @param {Vector3} point - the Vector3 to reflect through the plane.\n\t * @param {Vector3} [target] - the result will be copied into this Vector3.\n\t * @returns {Vector3}\n\t */\n\tmirrorPoint(point, target = new Vector3()) {\n\t\tconst distance = this.distanceToPoint(point);\n\t\treturn target.copy(point).addScaledVector(this.normal, -2 * distance);\n\t}\n\n\t/**\n\t * Returns a Vector3 coplanar to the plane, by calculating the projection of the normal vector at the origin onto the plane.\n\t * @param {Vector3} [target]\n\t * @returns {Vector3}\n\t */\n\tcoplanarPoint(target = new Vector3()) {\n\t\treturn target.copy(this.normal).multiplyScalar(-this.constant);\n\t}\n\n\t/**\n\t * Returns a new plane with the same normal and constant as this one.\n\t * @returns {Plane}\n\t */\n\tclone() {\n\t\treturn new Plane().copy(this);\n\t}\n\n\t/**\n\t * Copies the values of the passed plane's normal and constant properties to this plane.\n\t * @param {Plane} plane\n\t * @returns {Plane}\n\t */\n\tcopy(plane) {\n\t\tthis.normal.copy(plane.normal);\n\t\tthis.constant = plane.constant;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Apply a Matrix4 to the plane. The matrix must be an affine, homogeneous transform.\n\t * @param {Matrix4} matrix - the Matrix4 to apply.\n\t * @param {Matrix3} [optionalNormalMatrix] - (optional) pre-computed normal Matrix3 of the Matrix4 being applied.\n\t * @returns {Plane}\n\t */\n\tapplyMatrix4(matrix, optionalNormalMatrix) {\n\t\tconst normalMatrix = optionalNormalMatrix || _mat3_1$1.setFromMatrix4(matrix).invert().transpose();\n\n\t\tconst referencePoint = this.coplanarPoint(_vec3_1$4).applyMatrix4(matrix);\n\n\t\tconst normal = this.normal.applyMatrix3(normalMatrix).normalize();\n\n\t\tthis.constant = -referencePoint.dot(normal);\n\n\t\treturn this;\n\t}\n\n}\n\n/**\n * This flag can be used for type testing.\n * @readonly\n * @type {boolean}\n * @default true\n */\nPlane.prototype.isPlane = true;\n\nconst _vec3_1$3 = new Vector3();\nconst _mat3_1 = new Matrix3();\n\n/**\n * Frustums are used to determine what is inside the camera's field of view.\n * They help speed up the rendering process - objects which lie outside a camera's frustum can safely be excluded from rendering.\n */\nclass Frustum {\n\n\t/**\n\t * @param {Plane} p0 - (optional) defaults to a new Plane.\n\t * @param {Plane} p1 - (optional) defaults to a new Plane.\n\t * @param {Plane} p2 - (optional) defaults to a new Plane.\n\t * @param {Plane} p3 - (optional) defaults to a new Plane.\n\t * @param {Plane} p4 - (optional) defaults to a new Plane.\n\t * @param {Plane} p5 - (optional) defaults to a new Plane.\n\t */\n\tconstructor(p0 = new Plane(), p1 = new Plane(), p2 = new Plane(), p3 = new Plane(), p4 = new Plane(), p5 = new Plane()) {\n\t\tthis.planes = [p0, p1, p2, p3, p4, p5];\n\t}\n\n\t/**\n\t * Sets the frustum from the passed planes. No plane order is implied.\n\t * @param {Plane} p0 - (optional) defaults to a new Plane.\n\t * @param {Plane} p1 - (optional) defaults to a new Plane.\n\t * @param {Plane} p2 - (optional) defaults to a new Plane.\n\t * @param {Plane} p3 - (optional) defaults to a new Plane.\n\t * @param {Plane} p4 - (optional) defaults to a new Plane.\n\t * @param {Plane} p5 - (optional) defaults to a new Plane.\n\t * @returns {Frustum}\n\t */\n\tset(p0, p1, p2, p3, p4, p5) {\n\t\tconst planes = this.planes;\n\n\t\tplanes[0].copy(p0);\n\t\tplanes[1].copy(p1);\n\t\tplanes[2].copy(p2);\n\t\tplanes[3].copy(p3);\n\t\tplanes[4].copy(p4);\n\t\tplanes[5].copy(p5);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the frustum planes from the matrix.\n\t * @param {Matrix4} m - a Matrix4 used to set the planes\n\t * @returns {Frustum}\n\t */\n\tsetFromMatrix(m) {\n\t\tconst planes = this.planes;\n\t\tconst me = m.elements;\n\t\tconst me0 = me[0],\n\t\t\tme1 = me[1],\n\t\t\tme2 = me[2],\n\t\t\tme3 = me[3];\n\t\tconst me4 = me[4],\n\t\t\tme5 = me[5],\n\t\t\tme6 = me[6],\n\t\t\tme7 = me[7];\n\t\tconst me8 = me[8],\n\t\t\tme9 = me[9],\n\t\t\tme10 = me[10],\n\t\t\tme11 = me[11];\n\t\tconst me12 = me[12],\n\t\t\tme13 = me[13],\n\t\t\tme14 = me[14],\n\t\t\tme15 = me[15];\n\n\t\tplanes[0].setComponents(me3 - me0, me7 - me4, me11 - me8, me15 - me12).normalize();\n\t\tplanes[1].setComponents(me3 + me0, me7 + me4, me11 + me8, me15 + me12).normalize();\n\t\tplanes[2].setComponents(me3 + me1, me7 + me5, me11 + me9, me15 + me13).normalize();\n\t\tplanes[3].setComponents(me3 - me1, me7 - me5, me11 - me9, me15 - me13).normalize();\n\t\tplanes[4].setComponents(me3 - me2, me7 - me6, me11 - me10, me15 - me14).normalize();\n\t\tplanes[5].setComponents(me3 + me2, me7 + me6, me11 + me10, me15 + me14).normalize();\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Return true if sphere intersects with this frustum.\n\t * @param {Sphere} sphere - Sphere to check for intersection.\n\t * @returns {boolean}\n\t */\n\tintersectsSphere(sphere) {\n\t\tconst planes = this.planes;\n\t\tconst center = sphere.center;\n\t\tconst negRadius = -sphere.radius;\n\n\t\tfor (let i = 0; i < 6; i++) {\n\t\t\tconst distance = planes[i].distanceToPoint(center);\n\n\t\t\tif (distance < negRadius) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\treturn true;\n\t}\n\n\t/**\n\t * Return true if box intersects with this frustum.\n\t * @param {Box3} box - Box3 to check for intersection.\n\t * @returns {boolean}\n\t */\n\tintersectsBox(box) {\n\t\tconst planes = this.planes;\n\n\t\tfor (let i = 0; i < 6; i++) {\n\t\t\tconst plane = planes[i];\n\n\t\t\t// corner at max distance\n\n\t\t\t_vec3_1$3.x = plane.normal.x > 0 ? box.max.x : box.min.x;\n\t\t\t_vec3_1$3.y = plane.normal.y > 0 ? box.max.y : box.min.y;\n\t\t\t_vec3_1$3.z = plane.normal.z > 0 ? box.max.z : box.min.z;\n\n\t\t\t// if both outside plane, no intersection\n\n\t\t\tif (plane.distanceToPoint(_vec3_1$3) < 0) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\treturn true;\n\t}\n\n\t/**\n\t * Apply a matrix4x4 to the frustum.\n\t * @param {Matrix4} matrix - Matrix4 to apply to the frustum.\n\t * @returns {Frustum}\n\t */\n\tapplyMatrix4(matrix) {\n\t\tconst planes = this.planes;\n\n\t\tconst normalMatrix = _mat3_1.setFromMatrix4(matrix).invert().transpose();\n\n\t\tfor (let i = 0; i < 6; i++) {\n\t\t\tplanes[i].applyMatrix4(matrix, normalMatrix);\n\t\t}\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Return a new Frustum with the same parameters as this one.\n\t * @returns {Frustum}\n\t */\n\tclone() {\n\t\treturn new this.constructor().copy(this);\n\t}\n\n\t/**\n\t * Copies the properties of the passed frustum into this one.\n\t * @param {Frustum} frustum - The frustum to copy\n\t * @returns {Frustum}\n\t */\n\tcopy(frustum) {\n\t\tconst planes = this.planes;\n\n\t\tfor (let i = 0; i < 6; i++) {\n\t\t\tplanes[i].copy(frustum.planes[i]);\n\t\t}\n\n\t\treturn this;\n\t}\n\n}\n\n/**\n * This flag can be used for type testing.\n * @readonly\n * @type {boolean}\n * @default true\n */\nFrustum.prototype.isFrustum = true;\n\nconst _vec3_1$2 = new Vector3();\n\nconst _diff = new Vector3();\nconst _edge1 = new Vector3();\nconst _edge2 = new Vector3();\nconst _normal = new Vector3();\n\n/**\n * A ray that emits from an origin in a certain direction. This is used by\n * {@link Raycaster} to assist with raycasting. Raycasting is used for\n * mouse picking (working out what objects in the 3D space the mouse is over)\n * amongst other things.\n */\nclass Ray {\n\n\t/**\n\t * Constructs a new ray.\n\t * @param {Vector3} [origin=(0,0,0)] - The origin of the ray.\n\t * @param {Vector3} [direction=(0,0,-1)] - The (normalized) direction of the ray.\n\t */\n\tconstructor(origin = new Vector3(), direction = new Vector3(0, 0, -1)) {\n\t\t/**\n\t\t * The origin of the ray.\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.origin = origin;\n\n\t\t/**\n\t\t * The (normalized) direction of the ray.\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.direction = direction;\n\t}\n\n\t/**\n\t * Sets the ray's components by copying the given values.\n\t * @param {Vector3} origin - The origin.\n\t * @param {Vector3} direction - The direction.\n\t * @returns {Ray} A reference to this ray.\n\t */\n\tset(origin, direction) {\n\t\tthis.origin.copy(origin);\n\t\tthis.direction.copy(direction);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Copies the values of the given ray to this instance.\n\t * @param {Ray} ray - The ray to copy.\n\t * @returns {Ray} A reference to this ray.\n\t */\n\tcopy(ray) {\n\t\tthis.origin.copy(ray.origin);\n\t\tthis.direction.copy(ray.direction);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Returns a vector that is located at a given distance along this ray.\n\t * @param {number} t - The distance along the ray to retrieve a position for.\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @returns {Vector3} A position on the ray.\n\t */\n\tat(t, target = new Vector3()) {\n\t\treturn target.copy(this.origin).addScaledVector(this.direction, t);\n\t}\n\n\t/**\n\t * Shift the origin of this ray along its direction by the given distance.\n\t * @param {number} t - The distance along the ray to interpolate.\n\t * @returns {Ray} A reference to this ray.\n\t */\n\trecast(t) {\n\t\tthis.origin.copy(this.at(t, _vec3_1$2));\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Returns the point along this ray that is closest to the given point.\n\t * @param {Vector3} point - A point in 3D space to get the closet location on the ray for.\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @returns {Vector3} The closest point on this ray.\n\t */\n\tclosestPointToPoint(point, target) {\n\t\ttarget.subVectors(point, this.origin);\n\n\t\tconst directionDistance = target.dot(this.direction);\n\n\t\tif (directionDistance < 0) {\n\t\t\treturn target.copy(this.origin);\n\t\t}\n\n\t\treturn target.copy(this.origin).addScaledVector(this.direction, directionDistance);\n\t}\n\n\t/**\n\t * Returns the distance of the closest approach between this ray and the given point.\n\t * @param {Vector3} point - A point in 3D space to compute the distance to.\n\t * @returns {number} The distance.\n\t */\n\tdistanceToPoint(point) {\n\t\treturn Math.sqrt(this.distanceSqToPoint(point));\n\t}\n\n\t/**\n\t * Returns the squared distance of the closest approach between this ray and the given point.\n\t * @param {Vector3} point - A point in 3D space to compute the distance to.\n\t * @returns {number} The squared distance.\n\t */\n\tdistanceSqToPoint(point) {\n\t\tconst directionDistance = _vec3_1$2.subVectors(point, this.origin).dot(this.direction);\n\n\t\tif (directionDistance < 0) {\n\t\t\treturn this.origin.distanceToSquared(point);\n\t\t}\n\n\t\t_vec3_1$2.copy(this.direction).multiplyScalar(directionDistance).add(this.origin);\n\n\t\treturn _vec3_1$2.distanceToSquared(point);\n\t}\n\n\t/**\n\t * Intersects this ray with the given sphere, returning the intersection\n\t * point or `null` if there is no intersection.\n\t * @param {Sphere} sphere - The sphere to intersect.\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @returns {?Vector3} The intersection point.\n\t */\n\tintersectSphere(sphere, target) {\n\t\t_vec3_1$2.subVectors(sphere.center, this.origin);\n\t\tconst tca = _vec3_1$2.dot(this.direction);\n\t\tconst d2 = _vec3_1$2.dot(_vec3_1$2) - tca * tca;\n\t\tconst radius2 = sphere.radius * sphere.radius;\n\n\t\tif (d2 > radius2) {\n\t\t\treturn null;\n\t\t}\n\n\t\tconst thc = Math.sqrt(radius2 - d2);\n\n\t\t// t0 = first intersect point - entrance on front of sphere\n\t\tconst t0 = tca - thc;\n\n\t\t// t1 = second intersect point - exit point on back of sphere\n\t\tconst t1 = tca + thc;\n\n\t\t// test to see if both t0 and t1 are behind the ray - if so, return null\n\t\tif (t0 < 0 && t1 < 0) {\n\t\t\treturn null;\n\t\t}\n\n\t\t// test to see if t0 is behind the ray:\n\t\t// if it is, the ray is inside the sphere, so return the second exit point scaled by t1,\n\t\t// in order to always return an intersect point that is in front of the ray.\n\t\tif (t0 < 0) {\n\t\t\treturn this.at(t1, target);\n\t\t}\n\n\t\t// else t0 is in front of the ray, so return the first collision point scaled by t0\n\t\treturn this.at(t0, target);\n\t}\n\n\t/**\n\t * Returns `true` if this ray intersects with the given sphere.\n\t * @param {Sphere} sphere - The sphere to intersect.\n\t * @returns {boolean} Whether this ray intersects with the given sphere or not.\n\t */\n\tintersectsSphere(sphere) {\n\t\tif (sphere.radius < 0) return false; // handle empty spheres\n\t\treturn this.distanceSqToPoint(sphere.center) <= (sphere.radius * sphere.radius);\n\t}\n\n\t/**\n\t * Computes the distance from the ray's origin to the given plane. Returns `null` if the ray\n\t * does not intersect with the plane.\n\t * @param {Plane} plane - The plane to compute the distance to.\n\t * @returns {?number} Whether this ray intersects with the given sphere or not.\n\t */\n\tdistanceToPlane(plane) {\n\t\tconst denominator = plane.normal.dot(this.direction);\n\n\t\tif (denominator === 0) {\n\t\t\t// line is coplanar, return origin\n\t\t\tif (plane.distanceToPoint(this.origin) === 0) {\n\t\t\t\treturn 0;\n\t\t\t}\n\n\t\t\t// Null is preferable to undefined since undefined means.... it is undefined\n\t\t\treturn null;\n\t\t}\n\n\t\tconst t = -(this.origin.dot(plane.normal) + plane.constant) / denominator;\n\n\t\t// Return if the ray never intersects the plane\n\t\treturn t >= 0 ? t : null;\n\t}\n\n\t/**\n\t * Intersects this ray with the given plane, returning the intersection\n\t * point or `null` if there is no intersection.\n\t * @param {Plane} plane - The plane to intersect.\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @returns {?Vector3} The intersection point.\n\t */\n\tintersectPlane(plane, target) {\n\t\tconst t = this.distanceToPlane(plane);\n\n\t\tif (t === null) {\n\t\t\treturn null;\n\t\t}\n\n\t\treturn this.at(t, target);\n\t}\n\n\t/**\n\t * Returns `true` if this ray intersects with the given plane.\n\t * @param {Plane} plane - The plane to intersect.\n\t * @returns {boolean} Whether this ray intersects with the given plane or not.\n\t */\n\tintersectsPlane(plane) {\n\t\t// check if the ray lies on the plane first\n\t\tconst distToPoint = plane.distanceToPoint(this.origin);\n\n\t\tif (distToPoint === 0) {\n\t\t\treturn true;\n\t\t}\n\n\t\tconst denominator = plane.normal.dot(this.direction);\n\n\t\tif (denominator * distToPoint < 0) {\n\t\t\treturn true;\n\t\t}\n\n\t\t// ray origin is behind the plane (and is pointing behind it)\n\t\treturn false;\n\t}\n\n\t/**\n\t * Intersects this ray with the given bounding box, returning the intersection\n\t * point or `null` if there is no intersection.\n\t * @param {Box3} box - The box to intersect.\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @returns {?Vector3} The intersection point.\n\t */\n\tintersectBox(box, target) {\n\t\tlet tmin, tmax, tymin, tymax, tzmin, tzmax;\n\n\t\tconst invdirx = 1 / this.direction.x,\n\t\t\tinvdiry = 1 / this.direction.y,\n\t\t\tinvdirz = 1 / this.direction.z;\n\n\t\tconst origin = this.origin;\n\n\t\tif (invdirx >= 0) {\n\t\t\ttmin = (box.min.x - origin.x) * invdirx;\n\t\t\ttmax = (box.max.x - origin.x) * invdirx;\n\t\t} else {\n\t\t\ttmin = (box.max.x - origin.x) * invdirx;\n\t\t\ttmax = (box.min.x - origin.x) * invdirx;\n\t\t}\n\n\t\tif (invdiry >= 0) {\n\t\t\ttymin = (box.min.y - origin.y) * invdiry;\n\t\t\ttymax = (box.max.y - origin.y) * invdiry;\n\t\t} else {\n\t\t\ttymin = (box.max.y - origin.y) * invdiry;\n\t\t\ttymax = (box.min.y - origin.y) * invdiry;\n\t\t}\n\n\t\tif ((tmin > tymax) || (tymin > tmax)) return null;\n\n\t\t// These lines also handle the case where tmin or tmax is NaN\n\t\t// (result of 0 * Infinity). x !== x returns true if x is NaN\n\n\t\tif (tymin > tmin || tmin !== tmin) tmin = tymin;\n\n\t\tif (tymax < tmax || tmax !== tmax) tmax = tymax;\n\n\t\tif (invdirz >= 0) {\n\t\t\ttzmin = (box.min.z - origin.z) * invdirz;\n\t\t\ttzmax = (box.max.z - origin.z) * invdirz;\n\t\t} else {\n\t\t\ttzmin = (box.max.z - origin.z) * invdirz;\n\t\t\ttzmax = (box.min.z - origin.z) * invdirz;\n\t\t}\n\n\t\tif ((tmin > tzmax) || (tzmin > tmax)) return null;\n\n\t\tif (tzmin > tmin || tmin !== tmin) tmin = tzmin;\n\n\t\tif (tzmax < tmax || tmax !== tmax) tmax = tzmax;\n\n\t\t// return point closest to the ray (positive side)\n\n\t\tif (tmax < 0) return null;\n\n\t\treturn this.at(tmin >= 0 ? tmin : tmax, target);\n\t}\n\n\t/**\n\t * Returns `true` if this ray intersects with the given box.\n\t * @param {Box3} box - The box to intersect.\n\t * @returns {boolean} Whether this ray intersects with the given box or not.\n\t */\n\tintersectsBox(box) {\n\t\treturn this.intersectBox(box, _vec3_1$2) !== null;\n\t}\n\n\t/**\n\t * Intersects this ray with the given triangle, returning the intersection\n\t * point or `null` if there is no intersection.\n\t * @param {Vector3} a - The first vertex of the triangle.\n\t * @param {Vector3} b - The second vertex of the triangle.\n\t * @param {Vector3} c - The third vertex of the triangle.\n\t * @param {boolean} backfaceCulling - Whether to use backface culling or not.\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @returns {?Vector3} The intersection point.\n\t */\n\tintersectTriangle(a, b, c, backfaceCulling, target) {\n\t\t// Compute the offset origin, edges, and normal.\n\n\t\t// from https://github.com/pmjoniak/GeometricTools/blob/master/GTEngine/Include/Mathematics/GteIntrRay3Triangle3.h\n\n\t\t_edge1.subVectors(b, a);\n\t\t_edge2.subVectors(c, a);\n\t\t_normal.crossVectors(_edge1, _edge2);\n\n\t\t// Solve Q + t*D = b1*E1 + b2*E2 (Q = kDiff, D = ray direction,\n\t\t// E1 = kEdge1, E2 = kEdge2, N = Cross(E1,E2)) by\n\t\t//   |Dot(D,N)|*b1 = sign(Dot(D,N))*Dot(D,Cross(Q,E2))\n\t\t//   |Dot(D,N)|*b2 = sign(Dot(D,N))*Dot(D,Cross(E1,Q))\n\t\t//   |Dot(D,N)|*t = -sign(Dot(D,N))*Dot(Q,N)\n\t\tlet DdN = this.direction.dot(_normal);\n\t\tlet sign;\n\n\t\tif (DdN > 0) {\n\t\t\tif (backfaceCulling) return null;\n\t\t\tsign = 1;\n\t\t} else if (DdN < 0) {\n\t\t\tsign = -1;\n\t\t\tDdN = -DdN;\n\t\t} else {\n\t\t\treturn null;\n\t\t}\n\n\t\t_diff.subVectors(this.origin, a);\n\t\tconst DdQxE2 = sign * this.direction.dot(_edge2.crossVectors(_diff, _edge2));\n\n\t\t// b1 < 0, no intersection\n\t\tif (DdQxE2 < 0) {\n\t\t\treturn null;\n\t\t}\n\n\t\tconst DdE1xQ = sign * this.direction.dot(_edge1.cross(_diff));\n\n\t\t// b2 < 0, no intersection\n\t\tif (DdE1xQ < 0) {\n\t\t\treturn null;\n\t\t}\n\n\t\t// b1+b2 > 1, no intersection\n\t\tif (DdQxE2 + DdE1xQ > DdN) {\n\t\t\treturn null;\n\t\t}\n\n\t\t// Line intersects triangle, check if ray does.\n\t\tconst QdN = -sign * _diff.dot(_normal);\n\n\t\t// t < 0, no intersection\n\t\tif (QdN < 0) {\n\t\t\treturn null;\n\t\t}\n\n\t\t// Ray intersects triangle.\n\t\treturn this.at(QdN / DdN, target);\n\t}\n\n\t/**\n\t * Transforms this ray with the given 4x4 transformation matrix.\n\t * @param {Matrix4} matrix4 - The transformation matrix.\n\t * @returns {Ray} A reference to this ray.\n\t */\n\tapplyMatrix4(matrix4) {\n\t\tthis.origin.applyMatrix4(matrix4);\n\t\tthis.direction.transformDirection(matrix4);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Returns `true` if this ray is equal with the given one.\n\t * @param {Ray} ray - The ray to test for equality.\n\t * @returns {boolean} Whether this ray is equal with the given one.\n\t */\n\tequals(ray) {\n\t\treturn ray.origin.equals(this.origin) && ray.direction.equals(this.direction);\n\t}\n\n\t/**\n\t * Returns a new ray with copied values from this instance.\n\t * @returns {Ray} A clone of this instance.\n\t */\n\tclone() {\n\t\treturn new this.constructor().copy(this);\n\t}\n\n}\n\n/**\n * This flag can be used for type testing.\n * @readonly\n * @type {boolean}\n * @default true\n */\nRay.prototype.isRay = true;\n\nconst _box3_1 = new Box3();\nconst _vec3_1$1 = new Vector3();\nconst _vec3_2 = new Vector3();\n\n/**\n * A sphere defined by a center and radius.\n */\nclass Sphere {\n\n\t/**\n\t * @param {Vector3} [center=Vector3(0, 0, 0)] - center of the sphere.\n\t * @param {number} [radius=-1] - radius of the sphere.\n\t */\n\tconstructor(center = new Vector3(), radius = -1) {\n\t\tthis.center = center;\n\t\tthis.radius = radius;\n\t}\n\n\t/**\n\t * Sets the center and radius properties of this sphere.\n\t * @param {Vector3} center - center of the sphere.\n\t * @param {number} radius - radius of the sphere.\n\t * @returns {Sphere}\n\t */\n\tset(center, radius) {\n\t\tthis.center.copy(center);\n\t\tthis.radius = radius;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Computes the minimum bounding sphere for an array of points.\n\t * If optionalCenteris given, it is used as the sphere's center.\n\t * Otherwise, the center of the axis-aligned bounding box encompassing points is calculated.\n\t * @param {Vector3[]} points - an Array of Vector3 positions.\n\t * @param {Vector3} [optionalCenter] - the center of the sphere.\n\t * @returns {Sphere}\n\t */\n\tsetFromPoints(points, optionalCenter) {\n\t\tconst center = this.center;\n\n\t\tif (optionalCenter !== undefined) {\n\t\t\tcenter.copy(optionalCenter);\n\t\t} else {\n\t\t\t_box3_1.setFromPoints(points).getCenter(center);\n\t\t}\n\n\t\tlet maxRadiusSq = 0;\n\n\t\tfor (let i = 0, il = points.length; i < il; i++) {\n\t\t\tmaxRadiusSq = Math.max(maxRadiusSq, center.distanceToSquared(points[i]));\n\t\t}\n\n\t\tthis.radius = Math.sqrt(maxRadiusSq);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Computes the minimum bounding sphere for an array of points.\n\t * @param {number[]} array - An Array of position data that the resulting sphere will envelop.\n\t * @param {number} [gap=3] - The number of elements between the start of each position in the array.\n\t * @param {number} [offset=0] - The offset in each gap where the position data starts.\n\t * @param {boolean} [denormalize=false] - whether to denormalize the values in the array.\n\t * @returns {Sphere} A reference to this sphere.\n\t */\n\tsetFromArray(array, gap = 3, offset = 0, denormalize = false) {\n\t\tconst center = this.center;\n\n\t\t_box3_1.setFromArray(array, gap, offset, denormalize).getCenter(center);\n\n\t\tlet maxRadiusSq = 0;\n\t\tfor (let i = 0, l = array.length; i < l; i += gap) {\n\t\t\t_vec3_1$1.fromArray(array, i + offset, denormalize);\n\t\t\tmaxRadiusSq = Math.max(maxRadiusSq, center.distanceToSquared(_vec3_1$1));\n\t\t}\n\t\tthis.radius = Math.sqrt(maxRadiusSq);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Transforms this sphere with the provided Matrix4.\n\t * @param {Matrix4} matrix - the Matrix4 to apply\n\t * @returns {Matrix4}\n\t */\n\tapplyMatrix4(matrix) {\n\t\tthis.center.applyMatrix4(matrix);\n\t\tthis.radius = this.radius * matrix.getMaxScaleOnAxis();\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Returns aMinimum Bounding Box for the sphere.\n\t * @param {Box3} target — the result will be copied into this Box3.\n\t * @returns {Box3}\n\t */\n\tgetBoundingBox(target) {\n\t\tif (this.isEmpty()) {\n\t\t\t// Empty sphere produces empty bounding box\n\t\t\ttarget.makeEmpty();\n\t\t\treturn target;\n\t\t}\n\n\t\ttarget.set(this.center, this.center);\n\t\ttarget.expandByScalar(this.radius);\n\n\t\treturn target;\n\t}\n\n\t/**\n\t * Checks to see if the sphere is empty (the radius set to a negative number).\n\t * Spheres with a radius of 0 contain only their center point and are not considered to be empty.\n\t * @returns {boolean}\n\t */\n\tisEmpty() {\n\t\treturn this.radius < 0;\n\t}\n\n\t/**\n\t * Makes the sphere empty by setting center to (0, 0, 0) and radius to -1.\n\t * @returns {Sphere}\n\t */\n\tmakeEmpty() {\n\t\tthis.center.set(0, 0, 0);\n\t\tthis.radius = -1;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Checks to see if the sphere contains the provided point inclusive of the surface of the sphere.\n\t * @param {Vector3} point - The point to check for containment.\n\t * @returns {boolean}\n\t */\n\tcontainsPoint(point) {\n\t\treturn (point.distanceToSquared(this.center) <= (this.radius * this.radius));\n\t}\n\n\t/**\n\t * Returns the closest distance from the boundary of the sphere to the point.\n\t * If the sphere contains the point, the distance will be negative.\n\t * @param {Vector3} point - The point to calculate the distance to.\n\t * @returns {number}\n\t */\n\tdistanceToPoint(point) {\n\t\treturn (point.distanceTo(this.center) - this.radius);\n\t}\n\n\t/**\n\t * Expands the boundaries of this sphere to include point.\n\t * @param {Vector3} point - The vector3 that should be included in the sphere.\n\t * @returns {Sphere}\n\t */\n\texpandByPoint(point) {\n\t\tif (this.isEmpty()) {\n\t\t\tthis.center.copy(point);\n\t\t\tthis.radius = 0;\n\t\t\treturn this;\n\t\t}\n\n\t\t_vec3_1$1.subVectors(point, this.center);\n\n\t\tconst lengthSq = _vec3_1$1.getLengthSquared();\n\n\t\tif (lengthSq > (this.radius * this.radius)) {\n\t\t\t// calculate the minimal sphere\n\t\t\tconst length = Math.sqrt(lengthSq);\n\t\t\tconst delta = (length - this.radius) * 0.5;\n\t\t\tthis.center.addScaledVector(_vec3_1$1, delta / length);\n\t\t\tthis.radius += delta;\n\t\t}\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Expands this sphere to enclose both the original sphere and the given sphere.\n\t * @param {Sphere} sphere - The sphere to include.\n\t * @returns {Sphere} A reference to this sphere.\n\t */\n\tunion(sphere) {\n\t\tif (sphere.isEmpty()) {\n\t\t\treturn this;\n\t\t}\n\n\t\tif (this.isEmpty()) {\n\t\t\tthis.copy(sphere);\n\n\t\t\treturn this;\n\t\t}\n\n\t\tif (this.center.equals(sphere.center)) {\n\t\t\tthis.radius = Math.max(this.radius, sphere.radius);\n\t\t} else {\n\t\t\t_vec3_2.subVectors(sphere.center, this.center).normalize().multiplyScalar(sphere.radius);\n\n\t\t\tthis.expandByPoint(_vec3_1$1.addVectors(sphere.center, _vec3_2));\n\n\t\t\tthis.expandByPoint(_vec3_1$1.addVectors(sphere.center, _vec3_2));\n\t\t}\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Returns a new sphere with the same center and radius as this one.\n\t * @returns {Sphere}\n\t */\n\tclone() {\n\t\treturn new Sphere().copy(this);\n\t}\n\n\t/**\n\t * Copies the values of the passed sphere's center and radius properties to this sphere.\n\t * @param {Sphere} sphere\n\t * @returns {Sphere}\n\t */\n\tcopy(sphere) {\n\t\tthis.center.copy(sphere.center);\n\t\tthis.radius = sphere.radius;\n\n\t\treturn this;\n\t}\n\n}\n\n/**\n * This flag can be used for type testing.\n * @readonly\n * @type {boolean}\n * @default true\n */\nSphere.prototype.isSphere = true;\n\n/**\n * Ref: https://en.wikipedia.org/wiki/Spherical_coordinate_system\n *\n * The poles (phi) are at the positive and negative y axis.\n * The equator starts at positive z.\n */\nclass Spherical {\n\n\t/**\n\t * @param {number} [radius=1] - the radius, or the Euclidean distance (straight-line distance) from the point to the origin. Default is 1.0.\n\t * @param {number} [phi=0] - - polar angle in radians from the y (up) axis. Default is 0.\n\t * @param {number} [theta=0] - - equator angle in radians around the y (up) axis. Default is 0.\n\t */\n\tconstructor(radius = 1, phi = 0, theta = 0) {\n\t\tthis.radius = radius;\n\t\tthis.phi = phi; // up / down towards top and bottom pole\n\t\tthis.theta = theta; // around the equator of the sphere\n\t}\n\n\t/**\n\t * Sets values of this spherical's radius, phi and theta properties.\n\t * @param {number} radius\n\t * @param {number} phi\n\t * @param {number} theta\n\t * @returns {Spherical}\n\t */\n\tset(radius, phi, theta) {\n\t\tthis.radius = radius;\n\t\tthis.phi = phi;\n\t\tthis.theta = theta;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Copies the values of the passed Spherical's radius, phi and theta properties to this spherical.\n\t * @param {Spherical} other\n\t * @returns {Spherical}\n\t */\n\tcopy(other) {\n\t\tthis.radius = other.radius;\n\t\tthis.phi = other.phi;\n\t\tthis.theta = other.theta;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Returns a new spherical with the same radius, phi and theta properties as this one.\n\t * @returns {Spherical}\n\t */\n\tclone() {\n\t\treturn new Spherical().copy(this);\n\t}\n\n\t/**\n\t * Restrict phi to be betwee EPS and PI-EPS.\n\t * @returns {Spherical}\n\t */\n\tmakeSafe() {\n\t\tconst EPS = 0.000001;\n\t\tthis.phi = MathUtils.clamp(this.phi, EPS, Math.PI - EPS);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets values of this spherical's radius, phi and theta properties from the Vector3.\n\t * @param {Vector3} vec3\n\t * @returns {Spherical}\n\t */\n\tsetFromVector3(vec3) {\n\t\tthis.radius = vec3.getLength();\n\n\t\tif (this.radius === 0) {\n\t\t\tthis.theta = 0;\n\t\t\tthis.phi = 0;\n\t\t} else {\n\t\t\tthis.theta = Math.atan2(vec3.x, vec3.z); // equator angle around y-up axis\n\t\t\tthis.phi = Math.acos(MathUtils.clamp(vec3.y / this.radius, -1, 1)); // polar angle\n\t\t}\n\n\t\treturn this;\n\t}\n\n}\n\n/**\n * This flag can be used for type testing.\n * @readonly\n * @type {boolean}\n * @default true\n */\nSpherical.prototype.isSpherical = true;\n\n/**\n * Primary reference: https://graphics.stanford.edu/papers/envmap/envmap.pdf\n * Secondary reference: https://www.ppsloan.org/publications/StupidSH36.pdf\n * 3-band SH defined by 9 coefficients.\n */\nclass SphericalHarmonics3 {\n\n\t/**\n\t * Creates a new instance of SphericalHarmonics3.\n\t */\n\tconstructor() {\n\t\t/**\n\t\t * An array holding the (9) SH coefficients.\n\t\t * A single coefficient is represented as an instance of Vector3.\n\t\t * @type {Array}\n\t\t */\n\t\tthis.coefficients = [];\n\n\t\tfor (let i = 0; i < 9; i++) {\n\t\t\tthis.coefficients.push(new Vector3());\n\t\t}\n\t}\n\n\t/**\n\t * Set this sphericalHarmonics3 value.\n\t * @param {Vector3[]} coefficients An array of SH coefficients.\n\t * @returns {SphericalHarmonics3}\n\t */\n\tset(coefficients) {\n\t\tfor (let i = 0; i < 9; i++) {\n\t\t\tthis.coefficients[i].copy(coefficients[i]);\n\t\t}\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets all SH coefficients to 0.\n\t * @returns {SphericalHarmonics3}\n\t */\n\tzero() {\n\t\tfor (let i = 0; i < 9; i++) {\n\t\t\tthis.coefficients[i].set(0, 0, 0);\n\t\t}\n\t\treturn this;\n\t}\n\n\t/**\n\t * Returns the radiance in the direction of the given normal.\n\t * @param {Vector3} normal - The normal vector (assumed to be unit length).\n\t * @param {Vector3} target - The result vector.\n\t * @returns {Vector3}\n\t */\n\tgetAt(normal, target) {\n\t\t// normal is assumed to be unit length\n\n\t\tconst x = normal.x, y = normal.y, z = normal.z;\n\n\t\tconst coeff = this.coefficients;\n\n\t\t// band 0\n\t\ttarget.copy(coeff[0]).multiplyScalar(0.282095);\n\n\t\t// band 1\n\t\ttarget.addScaledVector(coeff[1], 0.488603 * y);\n\t\ttarget.addScaledVector(coeff[2], 0.488603 * z);\n\t\ttarget.addScaledVector(coeff[3], 0.488603 * x);\n\n\t\t// band 2\n\t\ttarget.addScaledVector(coeff[4], 1.092548 * (x * y));\n\t\ttarget.addScaledVector(coeff[5], 1.092548 * (y * z));\n\t\ttarget.addScaledVector(coeff[6], 0.315392 * (3.0 * z * z - 1.0));\n\t\ttarget.addScaledVector(coeff[7], 1.092548 * (x * z));\n\t\ttarget.addScaledVector(coeff[8], 0.546274 * (x * x - y * y));\n\n\t\treturn target;\n\t}\n\n\t/**\n\t * Reference: https://graphics.stanford.edu/papers/envmap/envmap.pdf\n\t * Returns the irradiance (radiance convolved with cosine lobe) in the direction of the given normal.\n\t * @param {Vector3} normal - The normal vector (assumed to be unit length).\n\t * @param {Vector3} target - The result vector.\n\t * @returns {Vector3}\n\t */\n\tgetIrradianceAt(normal, target) {\n\t\t// normal is assumed to be unit length\n\n\t\tconst x = normal.x, y = normal.y, z = normal.z;\n\n\t\tconst coeff = this.coefficients;\n\n\t\t// band 0\n\t\ttarget.copy(coeff[0]).multiplyScalar(0.886227); // π * 0.282095\n\n\t\t// band 1\n\t\ttarget.addScaledVector(coeff[1], 2.0 * 0.511664 * y); // ( 2 * π / 3 ) * 0.488603\n\t\ttarget.addScaledVector(coeff[2], 2.0 * 0.511664 * z);\n\t\ttarget.addScaledVector(coeff[3], 2.0 * 0.511664 * x);\n\n\t\t// band 2\n\t\ttarget.addScaledVector(coeff[4], 2.0 * 0.429043 * x * y); // ( π / 4 ) * 1.092548\n\t\ttarget.addScaledVector(coeff[5], 2.0 * 0.429043 * y * z);\n\t\ttarget.addScaledVector(coeff[6], 0.743125 * z * z - 0.247708); // ( π / 4 ) * 0.315392 * 3\n\t\ttarget.addScaledVector(coeff[7], 2.0 * 0.429043 * x * z);\n\t\ttarget.addScaledVector(coeff[8], 0.429043 * (x * x - y * y)); // ( π / 4 ) * 0.546274\n\n\t\treturn target;\n\t}\n\n\t/**\n\t * Adds the given SH to this instance.\n\t * @param {SphericalHarmonics3} sh - The SH to add.\n\t * @returns {SphericalHarmonics3}\n\t */\n\tadd(sh) {\n\t\tfor (let i = 0; i < 9; i++) {\n\t\t\tthis.coefficients[i].add(sh.coefficients[i]);\n\t\t}\n\t\treturn this;\n\t}\n\n\t/**\n\t * A convenience method for performing .add() and .scale() at once.\n\t * @param {SphericalHarmonics3} sh - The SH to add.\n\t * @param {Vector3} s - The scale factor.\n\t * @returns {SphericalHarmonics3}\n\t */\n\taddScaledSH(sh, s) {\n\t\tfor (let i = 0; i < 9; i++) {\n\t\t\tthis.coefficients[i].addScaledVector(sh.coefficients[i], s);\n\t\t}\n\t\treturn this;\n\t}\n\n\t/**\n\t * Multiply the s to this SphericalHarmonics3.\n\t * @param {number} s - The scale factor.\n\t * @returns {SphericalHarmonics3}\n\t */\n\tscale(s) {\n\t\tfor (let i = 0; i < 9; i++) {\n\t\t\tthis.coefficients[i].multiplyScalar(s);\n\t\t}\n\t\treturn this;\n\t}\n\n\t/**\n\t * Linear interpolates between the given SH and this instance by the given alpha factor.\n\t * Sets this coefficients vector to be the vector linearly interpolated between v1 and v2\n\t * where alpha is the percent distance along the line connecting the two vectors\n\t * - alpha = 0 will be v1, and alpha = 1 will be v2.\n\t * @param {SphericalHarmonics3} sh - The SH to interpolate with.\n\t * @param {number} alpha - The alpha factor.\n\t * @returns {SphericalHarmonics3}\n\t */\n\tlerp(sh, alpha) {\n\t\tfor (let i = 0; i < 9; i++) {\n\t\t\tthis.coefficients[i].lerpVectors(this.coefficients[i], sh.coefficients[i], alpha);\n\t\t}\n\t\treturn this;\n\t}\n\n\t/**\n\t * Returns true if the given SH and this instance have equal coefficients.\n\t * @param {SphericalHarmonics3} sh - The SH to compare with.\n\t * @returns {boolean}\n\t */\n\tequals(sh) {\n\t\tfor (let i = 0; i < 9; i++) {\n\t\t\tif (!this.coefficients[i].equals(sh.coefficients[i])) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t\treturn true;\n\t}\n\n\t/**\n\t * Copies the given SH to this instance.\n\t * @param {SphericalHarmonics3} sh - The SH to compare with.\n\t * @returns {SphericalHarmonics3}\n\t */\n\tcopy(sh) {\n\t\treturn this.set(sh.coefficients);\n\t}\n\n\t/**\n\t * Returns a new instance of SphericalHarmonics3 with equal coefficients.\n\t * @returns {SphericalHarmonics3}\n\t */\n\tclone() {\n\t\treturn new this.constructor().copy(this);\n\t}\n\n\t/**\n\t * Sets the coefficients of this instance from the given array.\n\t * @param {number[]} array - The array holding the numbers of the SH coefficients.\n\t * @param {number} [offset=0] - The array offset.\n\t * @returns {SphericalHarmonics3}\n\t */\n\tfromArray(array, offset = 0) {\n\t\tconst coefficients = this.coefficients;\n\n\t\tfor (let i = 0; i < 9; i++) {\n\t\t\tcoefficients[i].fromArray(array, offset + (i * 3));\n\t\t}\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Returns an array with the coefficients, or copies them into the provided array.\n\t * The coefficients are represented as numbers.\n\t * @param {number[]} [array] - The target array.\n\t * @param {number} [offset=0] - The array offset.\n\t * @returns {number[]}\n\t */\n\ttoArray(array = [], offset = 0) {\n\t\tconst coefficients = this.coefficients;\n\n\t\tfor (let i = 0; i < 9; i++) {\n\t\t\tcoefficients[i].toArray(array, offset + (i * 3));\n\t\t}\n\n\t\treturn array;\n\t}\n\n\t/**\n\t * Computes the SH basis for the given normal vector.\n\t * @param {Vector3} normal - The normal vector (assumed to be unit length).\n\t * @param {number[]} shBasis - The resulting SH basis.\n\t */\n\tstatic getBasisAt(normal, shBasis) {\n\t\t// normal is assumed to be unit length\n\n\t\tconst x = normal.x, y = normal.y, z = normal.z;\n\n\t\t// band 0\n\t\tshBasis[0] = 0.282095;\n\n\t\t// band 1\n\t\tshBasis[1] = 0.488603 * y;\n\t\tshBasis[2] = 0.488603 * z;\n\t\tshBasis[3] = 0.488603 * x;\n\n\t\t// band 2\n\t\tshBasis[4] = 1.092548 * x * y;\n\t\tshBasis[5] = 1.092548 * y * z;\n\t\tshBasis[6] = 0.315392 * (3 * z * z - 1);\n\t\tshBasis[7] = 1.092548 * x * z;\n\t\tshBasis[8] = 0.546274 * (x * x - y * y);\n\t}\n\n}\n\n/**\n * This flag can be used for type testing.\n * @readonly\n * @type {boolean}\n * @default true\n */\nSphericalHarmonics3.prototype.isSphericalHarmonics3 = true;\n\nconst _v0 = new Vector3();\nconst _v1 = new Vector3();\nconst _v2 = new Vector3();\nconst _v3 = new Vector3();\n\n/**\n * A geometric triangle as defined by three Vector3s representing its three corners.\n */\nclass Triangle {\n\n\t/**\n\t * @param {Vector3} [a] - the first corner of the triangle. Default is a Vector3 at (0, 0, 0).\n\t * @param {Vector3} [b] - the second corner of the triangle. Default is a Vector3 at (0, 0, 0).\n\t * @param {Vector3} [c] - the final corner of the triangle. Default is a Vector3 at (0, 0, 0).\n\t */\n\tconstructor(a = new Vector3(), b = new Vector3(), c = new Vector3()) {\n\t\tthis.a = a;\n\t\tthis.b = b;\n\t\tthis.c = c;\n\t}\n\n\t/**\n\t * Calculate the normal vector of the triangle.\n\t * @param {Vector3} a\n\t * @param {Vector3} b\n\t * @param {Vector3} c\n\t * @param {Vector3} [optionalTarget]\n\t * @returns {Vector3}\n\t */\n\tstatic normal(a, b, c, optionalTarget) {\n\t\tconst result = optionalTarget || new Vector3();\n\n\t\tresult.subVectors(c, b);\n\t\t_v0.subVectors(a, b);\n\t\tresult.cross(_v0);\n\n\t\tconst resultLengthSq = result.getLengthSquared();\n\t\tif (resultLengthSq > 0) {\n\t\t\treturn result.multiplyScalar(1 / Math.sqrt(resultLengthSq));\n\t\t}\n\n\t\treturn result.set(0, 0, 0);\n\t}\n\n\t/**\n\t * static/instance method to calculate barycentric coordinates.\n\t * based on: http://www.blackpawn.com/texts/pointinpoly/default.html\n\t * @param {Vector3} point - Vector3\n\t * @param {Vector3} a\n\t * @param {Vector3} b\n\t * @param {Vector3} c\n\t * @param {Vector3} [target] - the result will be copied into this Vector3.\n\t * @returns {Vector3}\n\t */\n\tstatic barycoordFromPoint(point, a, b, c, target) {\n\t\t_v0.subVectors(c, a);\n\t\t_v1.subVectors(b, a);\n\t\t_v2.subVectors(point, a);\n\n\t\tconst dot00 = _v0.dot(_v0);\n\t\tconst dot01 = _v0.dot(_v1);\n\t\tconst dot02 = _v0.dot(_v2);\n\t\tconst dot11 = _v1.dot(_v1);\n\t\tconst dot12 = _v1.dot(_v2);\n\n\t\tconst denom = (dot00 * dot11 - dot01 * dot01);\n\n\t\tconst result = target || new Vector3();\n\n\t\t// collinear or singular triangle\n\t\tif (denom === 0) {\n\t\t\t// arbitrary location outside of triangle?\n\t\t\t// not sure if this is the best idea, maybe should be returning undefined\n\t\t\treturn result.set(-2, -1, -1);\n\t\t}\n\n\t\tconst invDenom = 1 / denom;\n\t\tconst u = (dot11 * dot02 - dot01 * dot12) * invDenom;\n\t\tconst v = (dot00 * dot12 - dot01 * dot02) * invDenom;\n\n\t\t// barycentric coordinates must always sum to 1\n\t\treturn result.set(1 - u - v, v, u);\n\t}\n\n\t/**\n\t * Returns true if the passed point, when projected onto the plane of the triangle, lies within the triangle.\n\t * @param {Vector3} point\n\t * @param {Vector3} a\n\t * @param {Vector3} b\n\t * @param {Vector3} c\n\t * @returns {Vector3}\n\t */\n\tstatic containsPoint(point, a, b, c) {\n\t\tthis.barycoordFromPoint(point, a, b, c, _v3);\n\t\treturn (_v3.x >= 0) && (_v3.y >= 0) && ((_v3.x + _v3.y) <= 1);\n\t}\n\n\t/**\n\t * Sets the triangle's a, b and c properties to the passed vector3s.\n\t * @param {Vector3} a\n\t * @param {Vector3} b\n\t * @param {Vector3} c\n\t * @returns {Triangle}\n\t */\n\tset(a, b, c) {\n\t\tthis.a.copy(a);\n\t\tthis.b.copy(b);\n\t\tthis.c.copy(c);\n\n\t\treturn this;\n\t}\n\n}\n\n/**\n * This flag can be used for type testing.\n * @readonly\n * @type {boolean}\n * @default true\n */\nTriangle.prototype.isTriangle = true;\n\n/**\n * The vector 4 class\n */\nclass Vector4 {\n\n\t/**\n\t * @param {number} [x=0] - the x value of this vector.\n\t * @param {number} [y=0] - the y value of this vector.\n\t * @param {number} [z=0] - the z value of this vector.\n\t * @param {number} [w=1] - the w value of this vector.\n\t */\n\tconstructor(x = 0, y = 0, z = 0, w = 1) {\n\t\tthis.x = x;\n\t\tthis.y = y;\n\t\tthis.z = z;\n\t\tthis.w = w;\n\t}\n\n\t/**\n\t * Sets this vector to be the vector linearly interpolated between v1 and v2\n\t * where ratio is the percent distance along the line connecting the two vectors\n\t * - ratio = 0 will be v1, and ratio = 1 will be v2.\n\t * @param {Vector4} v1 - the starting Vector4.\n\t * @param {Vector4} v2 - Vector4 to interpolate towards.\n\t * @param {number} ratio - interpolation factor, typically in the closed interval [0, 1].\n\t * @returns {Vector4}\n\t */\n\tlerpVectors(v1, v2, ratio) {\n\t\treturn this.subVectors(v2, v1).multiplyScalar(ratio).add(v1);\n\t}\n\n\t/**\n\t * Sets the x, y, z and w components of this vector.\n\t * @param {number} x\n\t * @param {number} y\n\t * @param {number} z\n\t * @param {number} w\n\t * @returns {Vector4}\n\t */\n\tset(x = 0, y = 0, z = 0, w = 1) {\n\t\tthis.x = x;\n\t\tthis.y = y;\n\t\tthis.z = z;\n\t\tthis.w = w;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Converts this vector to a unit vector - that is, sets it equal to a vector with the same direction as this one, but length 1.\n\t * @returns {Vector4}\n\t */\n\tnormalize() {\n\t\treturn this.multiplyScalar(1 / (this.getLength() || 1));\n\t}\n\n\t/**\n\t * Multiplies this vector by scalar s.\n\t * @param {number} scalar\n\t * @returns {Vector4}\n\t */\n\tmultiplyScalar(scalar) {\n\t\tthis.x *= scalar;\n\t\tthis.y *= scalar;\n\t\tthis.z *= scalar;\n\t\tthis.w *= scalar;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Calculates the dot product of this vector and v.\n\t * @param {Vector4} v\n\t * @returns {Vector4}\n\t */\n\tdot(v) {\n\t\treturn this.x * v.x + this.y * v.y + this.z * v.z + this.w * v.w;\n\t}\n\n\t/**\n\t * Computes the square of the Euclidean length (straight-line length) from (0, 0, 0, 0) to (x, y, z, w).\n\t * If you are comparing the lengths of vectors, you should compare the length squared instead\n\t * as it is slightly more efficient to calculate.\n\t * @returns {number}\n\t */\n\tgetLengthSquared() {\n\t\treturn this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w;\n\t}\n\n\t/**\n\t * Computes the Euclidean length (straight-line length) from (0, 0, 0, 0) to (x, y, z, w).\n\t * @returns {number}\n\t */\n\tgetLength() {\n\t\treturn Math.sqrt(this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w);\n\t}\n\n\t/**\n\t * Computes the {@link https://en.wikipedia.org/wiki/Taxicab_geometry|Manhattan length}  from (0, 0, 0, 0) to (x, y, z, w).\n\t * @returns {number}\n\t */\n\tgetManhattanLength() {\n\t\treturn Math.abs(this.x) + Math.abs(this.y) + Math.abs(this.z) + Math.abs(this.w);\n\t}\n\n\t/**\n\t * Multiplies this vector by 4 x 4 m.\n\t * @param {Matrix4} m\n\t * @returns {Vector4}\n\t */\n\tapplyMatrix4(m) {\n\t\tconst x = this.x, y = this.y, z = this.z, w = this.w;\n\t\tconst e = m.elements;\n\n\t\tthis.x = e[0] * x + e[4] * y + e[8] * z + e[12] * w;\n\t\tthis.y = e[1] * x + e[5] * y + e[9] * z + e[13] * w;\n\t\tthis.z = e[2] * x + e[6] * y + e[10] * z + e[14] * w;\n\t\tthis.w = e[3] * x + e[7] * y + e[11] * z + e[15] * w;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets this vector to the position represented by the matrix m.\n\t * @param {Matrix4} m\n\t * @returns {Vector4}\n\t */\n\tsetFromMatrixPosition(m) {\n\t\tconst e = m.elements;\n\n\t\tthis.x = e[12];\n\t\tthis.y = e[13];\n\t\tthis.z = e[14];\n\t\tthis.w = e[15];\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Checks for strict equality of this vector and v.\n\t * @param {Vector4} v\n\t * @returns {boolean}\n\t */\n\tequals(v) {\n\t\treturn ((v.x === this.x) && (v.y === this.y) && (v.z === this.z) && (v.w === this.w));\n\t}\n\n\t/**\n\t * Adds v to this vector.\n\t * @param {Vector4} v\n\t * @returns {Vector4}\n\t */\n\tadd(v) {\n\t\tthis.x += v.x;\n\t\tthis.y += v.y;\n\t\tthis.z += v.z;\n\t\tthis.w += v.w;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Multiplies this vector by v.\n\t * @param {Vector4} v\n\t * @returns {Vector4}\n\t */\n\tmultiply(v) {\n\t\tthis.x *= v.x;\n\t\tthis.y *= v.y;\n\t\tthis.z *= v.z;\n\t\tthis.w *= v.w;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets this vector to a - b.\n\t * @param {Vector4} a\n\t * @param {Vector4} b\n\t * @returns {Vector4}\n\t */\n\tsubVectors(a, b) {\n\t\tthis.x = a.x - b.x;\n\t\tthis.y = a.y - b.y;\n\t\tthis.z = a.z - b.z;\n\t\tthis.w = a.w - b.w;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets this vector's x value to be array[ offset + 0 ],\n\t * y value to be array[ offset + 1 ] z value to be array[ offset + 2 ]\n\t * and w value to be array[ offset + 3 ].\n\t * @param {number[]} array - the source array.\n\t * @param {number} [offset=0] - offset into the array.\n\t * @param {boolean} [denormalize=false] - if true, denormalize the values, and array should be a typed array.\n\t * @returns {Vector4}\n\t */\n\tfromArray(array, offset = 0, denormalize = false) {\n\t\tlet x = array[offset], y = array[offset + 1],\n\t\t\tz = array[offset + 2], w = array[offset + 3];\n\n\t\tif (denormalize) {\n\t\t\tx = MathUtils.denormalize(x, array);\n\t\t\ty = MathUtils.denormalize(y, array);\n\t\t\tz = MathUtils.denormalize(z, array);\n\t\t\tw = MathUtils.denormalize(w, array);\n\t\t}\n\n\t\tthis.x = x;\n\t\tthis.y = y;\n\t\tthis.z = z;\n\t\tthis.w = w;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Returns an array [x, y, z, w], or copies x, y, z and w into the provided array.\n\t * @param {number[]} [array] - array to store this vector to. If this is not provided, a new array will be created.\n\t * @param {number} [offset=0] - offset into the array.\n\t * @param {boolean} [normalize=false] - if true, normalize the values, and array should be a typed array.\n\t * @returns {number[]}\n\t */\n\ttoArray(array = [], offset = 0, normalize = false) {\n\t\tlet x = this.x, y = this.y,\n\t\t\tz = this.z, w = this.w;\n\n\t\tif (normalize) {\n\t\t\tx = MathUtils.normalize(x, array);\n\t\t\ty = MathUtils.normalize(y, array);\n\t\t\tz = MathUtils.normalize(z, array);\n\t\t\tw = MathUtils.normalize(w, array);\n\t\t}\n\n\t\tarray[offset] = x;\n\t\tarray[offset + 1] = y;\n\t\tarray[offset + 2] = z;\n\t\tarray[offset + 3] = w;\n\n\t\treturn array;\n\t}\n\n\t/**\n\t * Rounds the x, y, z and w values of this vector to the nearest integer value.\n\t * @returns {Vector4}\n\t */\n\tround() {\n\t\tthis.x = Math.round(this.x);\n\t\tthis.y = Math.round(this.y);\n\t\tthis.z = Math.round(this.z);\n\t\tthis.w = Math.round(this.w);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Returns a new Vector4 with the same x, y, z and w values as this one.\n\t * @returns {Vector4}\n\t */\n\tclone() {\n\t\treturn new Vector4(this.x, this.y, this.z, this.w);\n\t}\n\n\t/**\n\t * Copies the values of the passed Vector4's x, y, z and w properties to this Vector4.\n\t * @param {Vector4} v\n\t * @returns {Vector4}\n\t */\n\tcopy(v) {\n\t\tthis.x = v.x;\n\t\tthis.y = v.y;\n\t\tthis.z = v.z;\n\t\tthis.w = (v.w !== undefined) ? v.w : 1;\n\n\t\treturn this;\n\t}\n\n\t* [Symbol.iterator]() {\n\t\tyield this.x;\n\t\tyield this.y;\n\t\tyield this.z;\n\t\tyield this.w;\n\t}\n\n}\n\n/**\n * This flag can be used for type testing.\n * @readonly\n * @type {boolean}\n * @default true\n */\nVector4.prototype.isVector4 = true;\n\n/**\n * Clone uniforms.\n * @function\n * @name cloneUniforms\n * @param {object} uniforms_src - The input uniforms.\n * @returns {object} - The output uniforms.\n */\nfunction cloneUniforms(uniforms_src) {\n\tconst uniforms_dst = {};\n\n\tfor (const name in uniforms_src) {\n\t\tconst uniform_src = uniforms_src[name];\n\t\tif (Array.isArray(uniform_src) || ArrayBuffer.isView(uniform_src)) {\n\t\t\tuniforms_dst[name] = uniform_src.slice();\n\t\t} else {\n\t\t\tuniforms_dst[name] = uniform_src;\n\t\t}\n\t}\n\n\treturn uniforms_dst;\n}\n\n/**\n * Clone json.\n * This is faster than JSON.parse(JSON.stringify()).\n * @function\n * @name cloneJson\n * @param {object} obj - The input json.\n * @returns {object} - The output json.\n */\nfunction cloneJson(obj) {\n\tconst newObj = Array.isArray(obj) ? [] : {};\n\n\tif (obj && typeof obj === 'object') {\n\t\tfor (const key in obj) {\n\t\t\tif (obj.hasOwnProperty(key)) {\n\t\t\t\tnewObj[key] = (obj[key] && typeof obj[key] === 'object') ? cloneJson(obj[key]) : obj[key];\n\t\t\t}\n\t\t}\n\t}\n\n\treturn newObj;\n}\n\nlet _object3DId = 0;\n\nconst _mat4_1$2 = new Matrix4();\n\n/**\n * This is the base class for most objects,\n * and provides a set of properties and methods for manipulating objects in 3D space.\n */\nclass Object3D {\n\n\tconstructor() {\n\t\t/**\n\t\t * Unique number for this object instance.\n\t\t * @readonly\n\t\t * @type {number}\n\t\t */\n\t\tthis.id = _object3DId++;\n\n\t\t/**\n\t\t * UUID of this object instance.\n\t\t * This gets automatically assigned, so this shouldn't be edited.\n\t\t * @type {string}\n\t\t */\n\t\tthis.uuid = MathUtils.generateUUID();\n\n\t\t/**\n\t\t * Optional name of the object (doesn't need to be unique).\n\t\t * @type {string}\n\t\t * @default \"\"\n\t\t */\n\t\tthis.name = '';\n\n\t\t/**\n\t\t * A Vector3 representing the object's local position.\n\t\t * @type {Vector3}\n\t\t * @default Vector3(0, 0, 0)\n\t\t */\n\t\tthis.position = new Vector3();\n\n\t\t/**\n\t\t * The object's local scale.\n\t\t * @type {Vector3}\n\t\t * @default Vector3(1, 1, 1)\n\t\t */\n\t\tthis.scale = new Vector3(1, 1, 1);\n\n\t\t/**\n\t\t * Object's local rotation as an {@link Euler}, in radians.\n\t\t * @type {Euler}\n\t\t * @default Euler(0, 0, 0)\n\t\t */\n\t\tthis.euler = new Euler();\n\n\t\t/**\n\t\t * Object's local rotation as a {@link Quaternion}.\n\t\t * @type {Quaternion}\n\t\t * @default Quaternion(0, 0, 0, 1)\n\t\t */\n\t\tthis.quaternion = new Quaternion();\n\n\t\t// bind euler and quaternion\n\t\tconst euler = this.euler, quaternion = this.quaternion;\n\t\teuler.onChange(function() {\n\t\t\tquaternion.setFromEuler(euler, false);\n\t\t});\n\t\tquaternion.onChange(function() {\n\t\t\teuler.setFromQuaternion(quaternion, undefined, false);\n\t\t});\n\n\t\t/**\n\t\t * The local transform matrix.\n\t\t * @type {Matrix4}\n\t\t */\n\t\tthis.matrix = new Matrix4();\n\n\t\t/**\n\t\t * The global transform of the object.\n\t\t * If the Object3D has no parent, then it's identical to the local transform {@link Object3D#matrix}.\n\t\t * @type {Matrix4}\n\t\t */\n\t\tthis.worldMatrix = new Matrix4();\n\n\t\t/**\n\t\t * Object's parent in the scene graph.\n\t\t * An object can have at most one parent.\n\t\t * @type {Object3D[]}\n\t\t */\n\t\tthis.children = new Array();\n\n\t\t/**\n\t\t * Object's parent in the scene graph.\n\t\t * An object can have at most one parent.\n\t\t * @type {Object3D}\n\t\t */\n\t\tthis.parent = null;\n\n\t\t/**\n\t\t * Whether the object gets rendered into shadow map.\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.castShadow = false;\n\n\t\t/**\n\t\t * Whether the material receives shadows.\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.receiveShadow = false;\n\n\t\t/**\n\t\t * Defines shadow map type.\n\t\t * Note: In webgl1 or {@link Scene#disableShadowSampler} is true, soft shadow types will fallback to POISSON_SOFT without warning.\n\t\t * Note: Point light only support POISSON_SOFT for now.\n\t\t * @type {SHADOW_TYPE}\n\t\t * @default SHADOW_TYPE.PCF3_SOFT\n\t\t */\n\t\tthis.shadowType = SHADOW_TYPE.PCF3_SOFT;\n\n\t\t/**\n\t\t * When this is set, it checks every frame if the object is in the frustum of the camera before rendering the object.\n\t\t * Otherwise the object gets rendered every frame even if it isn't visible.\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.frustumCulled = true;\n\n\t\t/**\n\t\t * Object gets rendered if true.\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.visible = true;\n\n\t\t/**\n\t\t * This value allows the default rendering order of scene graph objects to be overridden although opaque and transparent objects remain sorted independently.\n\t\t * Sorting is from lowest to highest renderOrder.\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.renderOrder = 0;\n\n\t\t/**\n\t\t * Render layer of this object.\n\t\t * RenderQueue will dispatch all renderable objects to the corresponding RenderQueueLayer according to object.renderLayer.\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.renderLayer = 0;\n\n\t\t/**\n\t\t * Whether it can be collected into the Render Queue.\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.renderable = true;\n\n\t\t/**\n\t\t * An object that can be used to store custom data about the {@link Object3D}.\n\t\t * It should not hold references to functions as these will not be cloned.\n\t\t * @type {object}\n\t\t * @default {}\n\t\t */\n\t\tthis.userData = {};\n\n\t\t/**\n\t\t * When this is set, it calculates the matrix of position, (rotation or quaternion) and scale every frame and also recalculates the worldMatrix property.\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.matrixAutoUpdate = true;\n\n\t\t/**\n\t\t * When this is set, it calculates the matrix in that frame and resets this property to false.\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.matrixNeedsUpdate = true;\n\n\t\t/**\n\t\t * When this is set, it calculates the world matrix in that frame and resets this property to false.\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.worldMatrixNeedsUpdate = true;\n\t}\n\n\t/**\n\t * An optional callback that is executed immediately before the Object3D is rendered.\n\t */\n\tonBeforeRender() {}\n\n\t/**\n\t * An optional callback that is executed immediately after the Object3D is rendered.\n\t */\n\tonAfterRender() {}\n\n\t/**\n\t * Add object as child of this object.\n\t * @param {Object3D} object\n\t */\n\tadd(object) {\n\t\tif (object === this) {\n\t\t\tconsole.error('Object3D.add: object can\\'t be added as a child of itself.', object);\n\t\t\treturn;\n\t\t}\n\n\t\tif (object.parent !== null) {\n\t\t\tobject.parent.remove(object);\n\t\t}\n\n\t\tobject.parent = this;\n\t\tthis.children.push(object);\n\n\t\tobject.worldMatrixNeedsUpdate = true;\n\t}\n\n\t/**\n\t * Remove object as child of this object.\n\t * @param {Object3D} object\n\t */\n\tremove(object) {\n\t\tconst index = this.children.indexOf(object);\n\t\tif (index !== -1) {\n\t\t\tobject.parent = null;\n\t\t\tthis.children.splice(index, 1);\n\n\t\t\tobject.worldMatrixNeedsUpdate = true;\n\t\t}\n\t}\n\n\t/**\n\t * Searches through the object's children and returns the first with a matching name.\n\t * Note that for most objects the name is an empty string by default.\n\t * You will have to set it manually to make use of this method.\n\t * @param {string} name - String to match to the children's {@link Object3D#name} property.\n\t * @returns {Object3D}\n\t */\n\tgetObjectByName(name) {\n\t\treturn this.getObjectByProperty('name', name);\n\t}\n\n\t/**\n\t * Searches through the object's children and returns the first with a property that matches the value given.\n\t * @param {string} name - the property name to search for.\n\t * @param {number} value - value of the given property.\n\t * @returns {Object3D}\n\t */\n\tgetObjectByProperty(name, value) {\n\t\tif (this[name] === value) return this;\n\n\t\tfor (let i = 0, l = this.children.length; i < l; i++) {\n\t\t\tconst child = this.children[i];\n\t\t\tconst object = child.getObjectByProperty(name, value);\n\n\t\t\tif (object !== undefined) {\n\t\t\t\treturn object;\n\t\t\t}\n\t\t}\n\n\t\treturn undefined;\n\t}\n\n\t/**\n\t * Update the local transform.\n\t * @param {boolean} force\n\t */\n\tupdateMatrix(force) {\n\t\tif (this.matrixAutoUpdate || this.matrixNeedsUpdate) {\n\t\t\tthis.matrix.compose(this.position, this.quaternion, this.scale);\n\n\t\t\tthis.matrixNeedsUpdate = false;\n\t\t\tthis.worldMatrixNeedsUpdate = true;\n\t\t}\n\n\t\tif (this.worldMatrixNeedsUpdate || force) {\n\t\t\tthis.worldMatrix.copy(this.matrix);\n\n\t\t\tif (this.parent) {\n\t\t\t\tconst parentMatrix = this.parent.worldMatrix;\n\t\t\t\tthis.worldMatrix.premultiply(parentMatrix);\n\t\t\t}\n\n\t\t\tthis.worldMatrixNeedsUpdate = false;\n\t\t\tforce = true;\n\t\t}\n\n\t\tconst children = this.children;\n\t\tfor (let i = 0, l = children.length; i < l; i++) {\n\t\t\tchildren[i].updateMatrix(force);\n\t\t}\n\t}\n\n\t/**\n\t * Returns a vector representing the direction of object's positive z-axis in world space.\n\t * This call must be after {@link Object3D#updateMatrix}.\n\t * @param {Vector3} [optionalTarget] — the result will be copied into this Vector3.\n\t * @returns {Vector3} - the result.\n\t */\n\tgetWorldDirection(optionalTarget = new Vector3()) {\n\t\tconst e = this.worldMatrix.elements;\n\t\treturn optionalTarget.set(e[8], e[9], e[10]).normalize();\n\t}\n\n\t/**\n\t * Rotates the object to face a point in local space.\n\t * @param {Vector3} target - A vector representing a position in local space.\n\t * @param {Vector3} up — A vector representing the up direction in local space.\n\t */\n\tlookAt(target, up) {\n\t\t_mat4_1$2.lookAtRH(target, this.position, up);\n\t\tthis.quaternion.setFromRotationMatrix(_mat4_1$2);\n\t}\n\n\t/**\n\t * Method to get intersections between a casted ray and this object.\n\t * @abstract\n\t * @param {Ray} ray - The {@link Ray} instance.\n\t * @param {Array} intersects - output intersects array.\n\t */\n\traycast(ray, intersects) {\n\n\t}\n\n\t/**\n\t * Executes the callback on this object and all descendants.\n\t * @param {Function} callback - A function with as first argument an object3D object.\n\t */\n\ttraverse(callback) {\n\t\tcallback(this);\n\n\t\tconst children = this.children;\n\t\tfor (let i = 0, l = children.length; i < l; i++) {\n\t\t\tchildren[i].traverse(callback);\n\t\t}\n\t}\n\n\t/**\n\t * Returns a clone of this object and optionally all descendants.\n\t * @param {Function} [recursive=true] - if true, descendants of the object are also cloned.\n\t * @returns {Object3D}\n\t */\n\tclone(recursive) {\n\t\treturn new this.constructor().copy(this, recursive);\n\t}\n\n\t/**\n\t * Copy the given object into this object.\n\t * @param {Object3D} source - The object to be copied.\n\t * @param {boolean} [recursive=true] - if true, descendants of the object are also copied.\n\t * @returns {Object3D}\n\t */\n\tcopy(source, recursive = true) {\n\t\tthis.name = source.name;\n\n\t\tthis.position.copy(source.position);\n\t\tthis.quaternion.copy(source.quaternion);\n\t\tthis.scale.copy(source.scale);\n\n\t\tthis.matrix.copy(source.matrix);\n\t\tthis.worldMatrix.copy(source.worldMatrix);\n\n\t\tthis.castShadow = source.castShadow;\n\t\tthis.receiveShadow = source.receiveShadow;\n\t\tthis.shadowType = source.shadowType;\n\n\t\tthis.frustumCulled = source.frustumCulled;\n\t\tthis.visible = source.visible;\n\t\tthis.renderOrder = source.renderOrder;\n\t\tthis.renderLayer = source.renderLayer;\n\t\tthis.renderable = source.renderable;\n\n\t\tthis.userData = cloneJson(source.userData);\n\n\t\tif (recursive === true) {\n\t\t\tfor (let i = 0; i < source.children.length; i++) {\n\t\t\t\tconst child = source.children[i];\n\t\t\t\tthis.add(child.clone());\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t}\n\n}\n\n/**\n * This flag can be used for type testing.\n * @readonly\n * @type {boolean}\n * @default true\n */\nObject3D.prototype.isObject3D = true;\n\nconst _plane_1 = new Plane();\n\nlet _sceneDataId = 0;\n\n/**\n * SceneData collect all render states about scene, Including lights.\n */\nclass SceneData {\n\n\tconstructor() {\n\t\tthis.id = _sceneDataId++;\n\t\tthis.version = 0;\n\n\t\tthis.useAnchorMatrix = false;\n\t\tthis.anchorMatrix = new Matrix4();\n\t\tthis.anchorMatrixInverse = new Matrix4();\n\n\t\tthis.disableShadowSampler = false;\n\n\t\tthis.logarithmicDepthBuffer = false;\n\n\t\tthis.fog = null;\n\t\tthis.environment = null;\n\t\tthis.envDiffuseIntensity = 1;\n\t\tthis.envSpecularIntensity = 1;\n\t\tthis.clippingPlanesData = new Float32Array([]);\n\t\tthis.numClippingPlanes = 0;\n\t}\n\n\t/**\n\t * Update scene data.\n\t * @param {Scene} scene\n\t */\n\tupdate(scene) {\n\t\tthis.useAnchorMatrix = !scene.anchorMatrix.isIdentity();\n\t\tthis.anchorMatrix.copy(scene.anchorMatrix);\n\t\tthis.anchorMatrixInverse.copy(scene.anchorMatrix).invert();\n\n\t\tthis.disableShadowSampler = scene.disableShadowSampler;\n\n\t\tthis.logarithmicDepthBuffer = scene.logarithmicDepthBuffer;\n\n\t\tthis.fog = scene.fog;\n\n\t\tthis.environment = scene.environment;\n\t\tthis.envDiffuseIntensity = scene.envDiffuseIntensity;\n\t\tthis.envSpecularIntensity = scene.envSpecularIntensity;\n\n\t\tif (this.clippingPlanesData.length < scene.clippingPlanes.length * 4) {\n\t\t\tthis.clippingPlanesData = new Float32Array(scene.clippingPlanes.length * 4);\n\t\t}\n\t\tthis.setClippingPlanesData(scene.clippingPlanes, this.clippingPlanesData);\n\t\tthis.numClippingPlanes = scene.clippingPlanes.length;\n\n\t\tthis.version++;\n\t}\n\n\tsetClippingPlanesData(clippingPlanes, clippingPlanesData) {\n\t\tfor (let i = 0; i < clippingPlanes.length; i++) {\n\t\t\t_plane_1.copy(clippingPlanes[i]);\n\t\t\tif (this.useAnchorMatrix) {\n\t\t\t\t_plane_1.applyMatrix4(this.anchorMatrixInverse);\n\t\t\t}\n\t\t\tclippingPlanesData[i * 4 + 0] = _plane_1.normal.x;\n\t\t\tclippingPlanesData[i * 4 + 1] = _plane_1.normal.y;\n\t\t\tclippingPlanesData[i * 4 + 2] = _plane_1.normal.z;\n\t\t\tclippingPlanesData[i * 4 + 3] = _plane_1.constant;\n\t\t}\n\n\t\treturn clippingPlanesData;\n\t}\n\n}\n\n/**\n * Abstract base class for lights\n * - The light's direction is defined as the 3-vector (0.0, 0,0, -1.0), that is, an untransformed light points down the -Z axis.\n * - all other light types inherit the properties and methods described here.\n * @abstract\n * @extends Object3D\n */\nclass Light extends Object3D {\n\n\t/**\n\t * @param {number} [color=0xffffff]\n\t * @param {number} [intensity=1]\n\t */\n\tconstructor(color = 0xffffff, intensity = 1) {\n\t\tsuper();\n\n\t\t/**\n\t\t * Color of the light.\n\t\t * @type {Color3}\n\t\t * @default Color3(0xffffff)\n\t\t */\n\t\tthis.color = new Color3(color);\n\n\t\t/**\n\t\t * The light's intensity, or strength.\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.intensity = intensity;\n\n\t\t/**\n\t\t * Group mask of the light, indicating which lighting group the light belongs to. Default is 1 (binary 0001), meaning the light belongs to lighting group 0.\n\t\t * For example, to make the light effective in both lighting group 0 and lighting group 1, set groupMask to 3 (binary 0011).\n\t\t * Used in conjunction with {@link Material#lightingGroup}.\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.groupMask = 1;\n\t}\n\n\t/**\n\t * Set light direction, this func will set quaternion of this light.\n\t * @param {Vector3} target - The target that the light look at.\n\t * @param {Vector3} up - The up direction of the light.\n\t */\n\tlookAt(target, up) {\n\t\t_mat4_1$1.lookAtRH(this.position, target, up);\n\t\tthis.quaternion.setFromRotationMatrix(_mat4_1$1);\n\t}\n\n\t/**\n\t * Copies properties from the source light into this one.\n\t * @param {Light} source - The source light.\n\t * @returns {Light} - This light.\n\t */\n\tcopy(source) {\n\t\tsuper.copy(source);\n\n\t\tthis.color.copy(source.color);\n\t\tthis.intensity = source.intensity;\n\t\tthis.groupMask = source.groupMask;\n\n\t\treturn this;\n\t}\n\n}\n\n/**\n * This flag can be used for type testing.\n * @readonly\n * @type {boolean}\n * @default true\n */\nLight.prototype.isLight = true;\n\nconst _mat4_1$1 = new Matrix4();\n\n/**\n * RectAreaLight emits light uniformly across the face a rectangular plane.\n * This light can be used to simulate light sources such as bright windows or strip lighting.\n * Important Notes:\n * - There is no shadow support.\n * - Only PBRMaterial are supported.\n * - You have to set LTC1 and LTC2 in RectAreaLight before using it.\n * @extends Light\n */\nclass RectAreaLight extends Light {\n\n\t/**\n\t * @param {number} [color=0xffffff]\n\t * @param {number} [intensity=1]\n\t * @param {number} [width=10]\n\t * @param {number} [height=10]\n\t */\n\tconstructor(color, intensity, width = 10, height = 10) {\n\t\tsuper(color, intensity);\n\n\t\t/**\n\t\t * The width of the light.\n\t\t * @type {number}\n\t\t * @default 10\n\t\t */\n\t\tthis.width = width;\n\n\t\t/**\n\t\t * The height of the light.\n\t\t * @type {number}\n\t\t * @default 10\n\t\t */\n\t\tthis.height = height;\n\t}\n\n\t/**\n\t * The light's power.\n\t * Power is the luminous power of the light measured in lumens (lm).\n\t * Changing the power will also change the light's intensity.\n\t * @type {number}\n\t */\n\tget power() {\n\t\t// compute the light's luminous power (in lumens) from its intensity (in nits)\n\t\treturn this.intensity * this.width * this.height * Math.PI;\n\t}\n\n\tset power(power) {\n\t\t// set the light's intensity (in nits) from the desired luminous power (in lumens)\n\t\tthis.intensity = power / (this.width * this.height * Math.PI);\n\t}\n\n\tcopy(source) {\n\t\tsuper.copy(source);\n\n\t\tthis.width = source.width;\n\t\tthis.height = source.height;\n\n\t\treturn this;\n\t}\n\n}\n\n/**\n * This flag can be used for type testing.\n * @readonly\n * @type {boolean}\n * @default true\n */\nRectAreaLight.prototype.isRectAreaLight = true;\n\n/**\n * The first LTC (Linearly Transformed Cosines).\n * If you want to use RectAreaLight, you have to set this before using it.\n * @type {null | Texture2D}\n */\nRectAreaLight.LTC1 = null;\n\n/**\n * The second LTC (Linearly Transformed Cosines).\n * If you want to use RectAreaLight, you have to set this before using it.\n * @type {null | Texture2D}\n */\nRectAreaLight.LTC2 = null;\n\nclass LightingGroup extends EventDispatcher {\n\n\tconstructor() {\n\t\tsuper();\n\n\t\tthis.id = _lightingGroupId++;\n\n\t\t// Light collection array\n\n\t\tthis.lights = [];\n\n\t\t// Data caches\n\n\t\tthis.ambient = new Float32Array([0, 0, 0]);\n\n\t\tthis.sh = new Float32Array(27);\n\n\t\tthis.hemisphere = [];\n\n\t\tthis.directional = [];\n\t\tthis.directionalShadow = [];\n\t\tthis.directionalShadowMap = [];\n\t\tthis.directionalShadowDepthMap = [];\n\t\tthis.directionalShadowMatrix = new Float32Array(0);\n\n\t\tthis.point = [];\n\t\tthis.pointShadow = [];\n\t\tthis.pointShadowMap = [];\n\t\tthis.pointShadowMatrix = new Float32Array(0);\n\n\t\tthis.spot = [];\n\t\tthis.spotShadow = [];\n\t\tthis.spotShadowMap = [];\n\t\tthis.spotShadowDepthMap = [];\n\t\tthis.spotShadowMatrix = new Float32Array(0);\n\n\t\tthis.rectArea = [];\n\t\tthis.LTC1 = null;\n\t\tthis.LTC2 = null;\n\n\t\t// Status\n\n\t\tthis.useAmbient = false;\n\t\tthis.useSphericalHarmonics = false;\n\t\tthis.hemisNum = 0;\n\t\tthis.directsNum = 0;\n\t\tthis.pointsNum = 0;\n\t\tthis.spotsNum = 0;\n\t\tthis.rectAreaNum = 0;\n\t\tthis.directShadowNum = 0;\n\t\tthis.pointShadowNum = 0;\n\t\tthis.spotShadowNum = 0;\n\n\t\tthis.totalNum = 0;\n\t\tthis.shadowsNum = 0;\n\n\t\t// Version\n\n\t\tthis.version = 0;\n\t}\n\n\tbegin() {\n\t\tthis.totalNum = 0;\n\t\tthis.shadowsNum = 0;\n\t}\n\n\tpush(light, shadow) {\n\t\tthis.lights[this.totalNum++] = light;\n\n\t\tif (shadow) {\n\t\t\tthis.shadowsNum++;\n\t\t}\n\t}\n\n\tend(sceneData) {\n\t\tthis.lights.length = this.totalNum;\n\n\t\tthis._setupCache(sceneData);\n\n\t\tthis.version++;\n\t}\n\n\tdispose() {\n\t\tthis.dispatchEvent({ type: 'dispose' });\n\t}\n\n\t_setupCache(sceneData) {\n\t\tfor (let i = 0; i < 3; i++) {\n\t\t\tthis.ambient[i] = 0;\n\t\t}\n\t\tfor (let i = 0; i < this.sh.length; i++) {\n\t\t\tthis.sh[i] = 0;\n\t\t}\n\t\tthis.useAmbient = false;\n\t\tthis.useSphericalHarmonics = false;\n\t\tthis.hemisNum = 0;\n\t\tthis.directsNum = 0;\n\t\tthis.pointsNum = 0;\n\t\tthis.spotsNum = 0;\n\t\tthis.rectAreaNum = 0;\n\t\tthis.directShadowNum = 0;\n\t\tthis.pointShadowNum = 0;\n\t\tthis.spotShadowNum = 0;\n\n\t\tthis.LTC1 = null;\n\t\tthis.LTC2 = null;\n\n\t\t// Setup Uniforms\n\n\t\tfor (let i = 0, l = this.lights.length; i < l; i++) {\n\t\t\tconst light = this.lights[i];\n\t\t\tif (light.isAmbientLight) {\n\t\t\t\tthis._doAddAmbientLight(light);\n\t\t\t} else if (light.isHemisphereLight) {\n\t\t\t\tthis._doAddHemisphereLight(light, sceneData);\n\t\t\t} else if (light.isDirectionalLight) {\n\t\t\t\tthis._doAddDirectLight(light, sceneData);\n\t\t\t} else if (light.isPointLight) {\n\t\t\t\tthis._doAddPointLight(light, sceneData);\n\t\t\t} else if (light.isSpotLight) {\n\t\t\t\tthis._doAddSpotLight(light, sceneData);\n\t\t\t} else if (light.isSphericalHarmonicsLight) {\n\t\t\t\tthis._doAddSphericalHarmonicsLight(light);\n\t\t\t} else if (light.isRectAreaLight) {\n\t\t\t\tthis._doAddRectAreaLight(light, sceneData);\n\t\t\t}\n\t\t}\n\n\t\tconst directShadowNum = this.directShadowNum;\n\t\tif (directShadowNum > 0) {\n\t\t\tthis.directionalShadowMap.length = directShadowNum;\n\t\t\tthis.directionalShadowDepthMap.length = directShadowNum;\n\t\t\ttempDirectionalShadowMatrices.length = directShadowNum;\n\t\t\tif (this.directionalShadowMatrix.length !== directShadowNum * 16) {\n\t\t\t\tthis.directionalShadowMatrix = new Float32Array(directShadowNum * 16);\n\t\t\t}\n\t\t\tfor (let i = 0; i < directShadowNum; i++) {\n\t\t\t\ttempDirectionalShadowMatrices[i].toArray(this.directionalShadowMatrix, i * 16);\n\t\t\t}\n\t\t}\n\n\t\tconst pointShadowNum = this.pointShadowNum;\n\t\tif (pointShadowNum > 0) {\n\t\t\tthis.pointShadowMap.length = pointShadowNum;\n\t\t\ttempPointShadowMatrices.length = pointShadowNum;\n\t\t\tif (this.pointShadowMatrix.length !== pointShadowNum * 16) {\n\t\t\t\tthis.pointShadowMatrix = new Float32Array(pointShadowNum * 16);\n\t\t\t}\n\t\t\tfor (let i = 0; i < pointShadowNum; i++) {\n\t\t\t\ttempPointShadowMatrices[i].toArray(this.pointShadowMatrix, i * 16);\n\t\t\t}\n\t\t}\n\n\t\tconst spotShadowNum = this.spotShadowNum;\n\t\tif (spotShadowNum > 0) {\n\t\t\tthis.spotShadowMap.length = spotShadowNum;\n\t\t\tthis.spotShadowDepthMap.length = spotShadowNum;\n\t\t\ttempSpotShadowMatrices.length = spotShadowNum;\n\t\t\tif (this.spotShadowMatrix.length !== spotShadowNum * 16) {\n\t\t\t\tthis.spotShadowMatrix = new Float32Array(spotShadowNum * 16);\n\t\t\t}\n\t\t\tfor (let i = 0; i < spotShadowNum; i++) {\n\t\t\t\ttempSpotShadowMatrices[i].toArray(this.spotShadowMatrix, i * 16);\n\t\t\t}\n\t\t}\n\n\t\tif (this.rectAreaNum > 0) {\n\t\t\tthis.LTC1 = RectAreaLight.LTC1;\n\t\t\tthis.LTC2 = RectAreaLight.LTC2;\n\t\t}\n\t}\n\n\t_doAddAmbientLight(object) {\n\t\tconst intensity = object.intensity;\n\t\tconst color = object.color;\n\n\t\tthis.ambient[0] += color.r * intensity;\n\t\tthis.ambient[1] += color.g * intensity;\n\t\tthis.ambient[2] += color.b * intensity;\n\n\t\tthis.useAmbient = true;\n\t}\n\n\t_doAddSphericalHarmonicsLight(object) {\n\t\tconst intensity = object.intensity;\n\t\tconst sh = object.sh.coefficients;\n\t\tfor (let i = 0; i < sh.length; i += 1) {\n\t\t\tthis.sh[i * 3] += sh[i].x * intensity;\n\t\t\tthis.sh[i * 3 + 1] += sh[i].y * intensity;\n\t\t\tthis.sh[i * 3 + 2] += sh[i].z * intensity;\n\t\t}\n\n\t\tthis.useSphericalHarmonics = true;\n\t}\n\n\t_doAddHemisphereLight(object, sceneData) {\n\t\tconst intensity = object.intensity;\n\t\tconst skyColor = object.color;\n\t\tconst groundColor = object.groundColor;\n\n\t\tconst useAnchorMatrix = sceneData.useAnchorMatrix;\n\n\t\tconst cache = getLightCache(object);\n\n\t\tcache.skyColor[0] = skyColor.r * intensity;\n\t\tcache.skyColor[1] = skyColor.g * intensity;\n\t\tcache.skyColor[2] = skyColor.b * intensity;\n\n\t\tcache.groundColor[0] = groundColor.r * intensity;\n\t\tcache.groundColor[1] = groundColor.g * intensity;\n\t\tcache.groundColor[2] = groundColor.b * intensity;\n\n\t\tconst e = object.worldMatrix.elements;\n\t\tconst direction = helpVector3.set(e[4], e[5], e[6]).normalize();\n\t\tif (useAnchorMatrix) {\n\t\t\tdirection.transformDirection(sceneData.anchorMatrixInverse);\n\t\t}\n\n\t\tdirection.toArray(cache.direction);\n\n\t\tthis.hemisphere[this.hemisNum++] = cache;\n\t}\n\n\t_doAddDirectLight(object, sceneData) {\n\t\tconst intensity = object.intensity;\n\t\tconst color = object.color;\n\n\t\tconst useAnchorMatrix = sceneData.useAnchorMatrix;\n\n\t\tconst cache = getLightCache(object);\n\n\t\tcache.color[0] = color.r * intensity;\n\t\tcache.color[1] = color.g * intensity;\n\t\tcache.color[2] = color.b * intensity;\n\n\t\tconst direction = object.getWorldDirection(helpVector3);\n\t\tif (useAnchorMatrix) {\n\t\t\tdirection.transformDirection(sceneData.anchorMatrixInverse);\n\t\t}\n\n\t\tdirection.multiplyScalar(-1).toArray(cache.direction);\n\n\t\tif (object.castShadow) {\n\t\t\tconst shadow = object.shadow;\n\t\t\tconst shadowCache = getShadowCache(object);\n\n\t\t\tshadowCache.shadowBias[0] = shadow.bias;\n\t\t\tshadowCache.shadowBias[1] = shadow.normalBias;\n\t\t\tshadowCache.shadowMapSize[0] = shadow.mapSize.x;\n\t\t\tshadowCache.shadowMapSize[1] = shadow.mapSize.y;\n\t\t\tshadowCache.shadowParams[0] = shadow.radius;\n\t\t\tshadowCache.shadowParams[1] = shadow.frustumEdgeFalloff;\n\n\t\t\tthis.directionalShadow[this.directShadowNum++] = shadowCache;\n\n\t\t\tshadow.update(object);\n\t\t\tshadow.updateMatrix();\n\t\t\tif (useAnchorMatrix) {\n\t\t\t\tshadow.matrix.multiply(sceneData.anchorMatrix);\n\t\t\t}\n\n\t\t\tthis.directionalShadowMap[this.directsNum] = shadow.map;\n\t\t\tthis.directionalShadowDepthMap[this.directsNum] = shadow.depthMap;\n\t\t\ttempDirectionalShadowMatrices[this.directsNum] = shadow.matrix;\n\t\t}\n\n\t\tthis.directional[this.directsNum++] = cache;\n\t}\n\n\t_doAddPointLight(object, sceneData) {\n\t\tconst intensity = object.intensity;\n\t\tconst color = object.color;\n\t\tconst distance = object.distance;\n\t\tconst decay = object.decay;\n\n\t\tconst useAnchorMatrix = sceneData.useAnchorMatrix;\n\n\t\tconst cache = getLightCache(object);\n\n\t\tcache.color[0] = color.r * intensity;\n\t\tcache.color[1] = color.g * intensity;\n\t\tcache.color[2] = color.b * intensity;\n\n\t\tcache.distance = distance;\n\t\tcache.decay = decay;\n\n\t\tconst position = helpVector3.setFromMatrixPosition(object.worldMatrix);\n\t\tif (useAnchorMatrix) {\n\t\t\tposition.applyMatrix4(sceneData.anchorMatrixInverse);\n\t\t}\n\n\t\tcache.position[0] = position.x;\n\t\tcache.position[1] = position.y;\n\t\tcache.position[2] = position.z;\n\n\t\tif (object.castShadow) {\n\t\t\tconst shadow = object.shadow;\n\t\t\tconst shadowCache = getShadowCache(object);\n\n\t\t\tshadowCache.shadowBias[0] = shadow.bias;\n\t\t\tshadowCache.shadowBias[1] = shadow.normalBias;\n\t\t\tshadowCache.shadowMapSize[0] = shadow.mapSize.x;\n\t\t\tshadowCache.shadowMapSize[1] = shadow.mapSize.y;\n\t\t\tshadowCache.shadowParams[0] = shadow.radius;\n\t\t\tshadowCache.shadowParams[1] = 0;\n\t\t\tshadowCache.shadowCameraRange[0] = shadow.cameraNear;\n\t\t\tshadowCache.shadowCameraRange[1] = shadow.cameraFar;\n\n\t\t\tthis.pointShadow[this.pointShadowNum++] = shadowCache;\n\n\t\t\tshadow.update(object, 0);\n\t\t\tshadow.matrix.makeTranslation(-position.x, -position.y, -position.z); // for point light\n\n\t\t\tthis.pointShadowMap[this.pointsNum] = shadow.map;\n\t\t\ttempPointShadowMatrices[this.pointsNum] = shadow.matrix;\n\t\t}\n\n\t\tthis.point[this.pointsNum++] = cache;\n\t}\n\n\t_doAddSpotLight(object, sceneData) {\n\t\tconst intensity = object.intensity;\n\t\tconst color = object.color;\n\t\tconst distance = object.distance;\n\t\tconst decay = object.decay;\n\n\t\tconst useAnchorMatrix = sceneData.useAnchorMatrix;\n\n\t\tconst cache = getLightCache(object);\n\n\t\tcache.color[0] = color.r * intensity;\n\t\tcache.color[1] = color.g * intensity;\n\t\tcache.color[2] = color.b * intensity;\n\n\t\tcache.distance = distance;\n\t\tcache.decay = decay;\n\n\t\tconst position = helpVector3.setFromMatrixPosition(object.worldMatrix);\n\t\tif (useAnchorMatrix) {\n\t\t\tposition.applyMatrix4(sceneData.anchorMatrixInverse);\n\t\t}\n\n\t\tcache.position[0] = position.x;\n\t\tcache.position[1] = position.y;\n\t\tcache.position[2] = position.z;\n\n\t\tconst direction = object.getWorldDirection(helpVector3);\n\t\tif (useAnchorMatrix) {\n\t\t\tdirection.transformDirection(sceneData.anchorMatrixInverse);\n\t\t}\n\n\t\tdirection.multiplyScalar(-1).toArray(cache.direction);\n\n\t\tconst coneCos = Math.cos(object.angle);\n\t\tconst penumbraCos = Math.cos(object.angle * (1 - object.penumbra));\n\n\t\tcache.coneCos = coneCos;\n\t\tcache.penumbraCos = penumbraCos;\n\n\t\tif (object.castShadow) {\n\t\t\tconst shadow = object.shadow;\n\t\t\tconst shadowCache = getShadowCache(object);\n\n\t\t\tshadowCache.shadowBias[0] = shadow.bias;\n\t\t\tshadowCache.shadowBias[1] = shadow.normalBias;\n\t\t\tshadowCache.shadowMapSize[0] = shadow.mapSize.x;\n\t\t\tshadowCache.shadowMapSize[1] = shadow.mapSize.y;\n\t\t\tshadowCache.shadowParams[0] = shadow.radius;\n\t\t\tshadowCache.shadowParams[1] = shadow.frustumEdgeFalloff;\n\n\t\t\tthis.spotShadow[this.spotShadowNum++] = shadowCache;\n\n\t\t\tshadow.update(object);\n\t\t\tshadow.updateMatrix();\n\t\t\tif (useAnchorMatrix) {\n\t\t\t\tshadow.matrix.multiply(sceneData.anchorMatrix);\n\t\t\t}\n\n\t\t\tthis.spotShadowMap[this.spotsNum] = shadow.map;\n\t\t\tthis.spotShadowDepthMap[this.spotsNum] = shadow.depthMap;\n\t\t\ttempSpotShadowMatrices[this.spotsNum] = shadow.matrix;\n\t\t}\n\n\t\tthis.spot[this.spotsNum++] = cache;\n\t}\n\n\t_doAddRectAreaLight(object, sceneData) {\n\t\tconst intensity = object.intensity;\n\t\tconst color = object.color;\n\t\tconst halfHeight = object.height;\n\t\tconst halfWidth = object.width;\n\n\t\tconst useAnchorMatrix = sceneData.useAnchorMatrix;\n\n\t\tconst cache = getLightCache(object);\n\n\t\tcache.color[0] = color.r * intensity;\n\t\tcache.color[1] = color.g * intensity;\n\t\tcache.color[2] = color.b * intensity;\n\n\t\tconst position = helpVector3.setFromMatrixPosition(object.worldMatrix);\n\t\tif (useAnchorMatrix) {\n\t\t\tposition.applyMatrix4(sceneData.anchorMatrixInverse);\n\t\t}\n\n\t\tcache.position[0] = position.x;\n\t\tcache.position[1] = position.y;\n\t\tcache.position[2] = position.z;\n\n\t\t// extract rotation of light to derive width/height half vectors\n\t\thelpMatrix4$1.copy(object.worldMatrix);\n\t\tif (useAnchorMatrix) {\n\t\t\thelpMatrix4$1.premultiply(sceneData.anchorMatrixInverse);\n\t\t}\n\t\thelpMatrix4$1.extractRotation(helpMatrix4$1);\n\n\t\tconst halfWidthPos = helpVector3.set(halfWidth * 0.5, 0.0, 0.0);\n\t\thalfWidthPos.applyMatrix4(helpMatrix4$1);\n\t\tcache.halfWidth[0] = halfWidthPos.x;\n\t\tcache.halfWidth[1] = halfWidthPos.y;\n\t\tcache.halfWidth[2] = halfWidthPos.z;\n\n\t\tconst halfHeightPos = helpVector3.set(0.0, halfHeight * 0.5, 0.0);\n\t\thalfHeightPos.applyMatrix4(helpMatrix4$1);\n\t\tcache.halfHeight[0] = halfHeightPos.x;\n\t\tcache.halfHeight[1] = halfHeightPos.y;\n\t\tcache.halfHeight[2] = halfHeightPos.z;\n\n\t\tthis.rectArea[this.rectAreaNum++] = cache;\n\t}\n\n}\n\n// Variables\n\nlet _lightingGroupId = 0;\n\nconst helpVector3 = new Vector3();\nconst helpMatrix4$1 = new Matrix4();\n\nconst tempDirectionalShadowMatrices = [];\nconst tempPointShadowMatrices = [];\nconst tempSpotShadowMatrices = [];\n\n// Light caches\n\nconst lightCaches = new WeakMap();\n\nfunction getLightCache(light) {\n\tif (lightCaches.has(light)) {\n\t\treturn lightCaches.get(light);\n\t}\n\n\tlet cache;\n\n\tif (light.isHemisphereLight) {\n\t\tcache = {\n\t\t\tdirection: new Float32Array(3),\n\t\t\tskyColor: new Float32Array([0, 0, 0]),\n\t\t\tgroundColor: new Float32Array([0, 0, 0])\n\t\t};\n\t} else if (light.isDirectionalLight) {\n\t\tcache = {\n\t\t\tdirection: new Float32Array(3),\n\t\t\tcolor: new Float32Array([0, 0, 0])\n\t\t};\n\t} else if (light.isPointLight) {\n\t\tcache = {\n\t\t\tposition: new Float32Array(3),\n\t\t\tcolor: new Float32Array([0, 0, 0]),\n\t\t\tdistance: 0,\n\t\t\tdecay: 0\n\t\t};\n\t} else if (light.isSpotLight) {\n\t\tcache = {\n\t\t\tposition: new Float32Array(3),\n\t\t\tdirection: new Float32Array(3),\n\t\t\tcolor: new Float32Array([0, 0, 0]),\n\t\t\tdistance: 0,\n\t\t\tconeCos: 0,\n\t\t\tpenumbraCos: 0,\n\t\t\tdecay: 0\n\t\t};\n\t} else if (light.isRectAreaLight) {\n\t\tcache = {\n\t\t\tposition: new Float32Array(3),\n\t\t\tcolor: new Float32Array([0, 0, 0]),\n\t\t\thalfWidth: new Float32Array(3),\n\t\t\thalfHeight: new Float32Array(3)\n\t\t};\n\t}\n\n\n\tlightCaches.set(light, cache);\n\n\treturn cache;\n}\n\n// Shadow caches\n\nconst shadowCaches = new WeakMap();\n\nfunction getShadowCache(light) {\n\tif (shadowCaches.has(light)) {\n\t\treturn shadowCaches.get(light);\n\t}\n\n\tlet cache;\n\n\tif (light.isDirectionalLight) {\n\t\tcache = {\n\t\t\tshadowBias: new Float32Array(2), // [bias, normalBias]\n\t\t\tshadowMapSize: new Float32Array(2), // [width, height]\n\t\t\tshadowParams: new Float32Array(2) // [radius, frustumEdgeFalloff]\n\t\t};\n\t} else if (light.isPointLight) {\n\t\tcache = {\n\t\t\tshadowBias: new Float32Array(2), // [bias, normalBias]\n\t\t\tshadowMapSize: new Float32Array(2), // [width, height]\n\t\t\tshadowParams: new Float32Array(2), // [radius, 0]\n\t\t\tshadowCameraRange: new Float32Array(2) // [cameraNear, cameraFar]\n\t\t};\n\t} else if (light.isSpotLight) {\n\t\tcache = {\n\t\t\tshadowBias: new Float32Array(2), // [bias, normalBias]\n\t\t\tshadowMapSize: new Float32Array(2), // [width, height]\n\t\t\tshadowParams: new Float32Array(2) // [radius, frustumEdgeFalloff]\n\t\t};\n\t}\n\n\tshadowCaches.set(light, cache);\n\n\treturn cache;\n}\n\nclass LightingData {\n\n\tconstructor() {\n\t\tthis.lightsArray = [];\n\t\tthis.shadowsNum = 0;\n\n\t\tthis.groupList = [];\n\t\tthis.groupList.push(new LightingGroup()); // create default group 0\n\n\t\tthis._locked = true;\n\t}\n\n\tgetGroup(id) {\n\t\treturn this.groupList[id];\n\t}\n\n\tsetMaxGroupCount(max) {\n\t\tmax = Math.max(1, max); // at least one group\n\n\t\tconst groupList = this.groupList;\n\t\tconst oldMax = groupList.length;\n\n\t\tif (max < oldMax) {\n\t\t\tfor (let i = max; i < oldMax; i++) {\n\t\t\t\tgroupList[i].dispose();\n\t\t\t}\n\t\t\tgroupList.length = max;\n\t\t} else if (max > oldMax) {\n\t\t\tfor (let i = oldMax; i < max; i++) {\n\t\t\t\tgroupList.push(new LightingGroup());\n\t\t\t}\n\t\t}\n\t}\n\n\tbegin() {\n\t\tif (!this._locked) {\n\t\t\tconsole.warn('LightingData: begin() called without end().');\n\t\t}\n\n\t\tthis.lightsArray.length = 0;\n\t\tthis.shadowsNum = 0;\n\n\t\tthis._locked = false;\n\t}\n\n\tcollect(light) {\n\t\tif (this._locked) return;\n\n\t\tthis.lightsArray.push(light);\n\n\t\tif (castShadow(light)) {\n\t\t\tthis.shadowsNum++;\n\t\t}\n\t}\n\n\tend(sceneData) {\n\t\tconst lightsArray = this.lightsArray;\n\t\tconst shadowsNum = this.shadowsNum;\n\t\tconst groupList = this.groupList;\n\n\t\tlightsArray.sort(shadowCastingLightsFirst);\n\n\t\tlet i, l;\n\n\t\tfor (i = 0, l = groupList.length; i < l; i++) {\n\t\t\tgroupList[i].begin();\n\t\t}\n\n\t\tfor (i = 0, l = lightsArray.length; i < l; i++) {\n\t\t\tthis._distribute(lightsArray[i], i < shadowsNum);\n\t\t}\n\n\t\tfor (i = 0, l = groupList.length; i < l; i++) {\n\t\t\tgroupList[i].end(sceneData);\n\t\t}\n\n\t\tthis._locked = true;\n\t}\n\n\t_distribute(light, shadow) {\n\t\tconst groupMask = light.groupMask;\n\t\tconst groupList = this.groupList;\n\n\t\t// optimize for single group\n\t\tif (groupList.length === 1 && (groupMask & 1)) {\n\t\t\tgroupList[0].push(light, shadow);\n\t\t\treturn;\n\t\t}\n\n\t\tfor (let i = 0, l = groupList.length; i < l; i++) {\n\t\t\tconst mask = 1 << i;\n\n\t\t\tif (groupMask < mask) break;\n\n\t\t\tif (groupMask & mask) {\n\t\t\t\tgroupList[i].push(light, shadow);\n\t\t\t}\n\t\t}\n\t}\n\n}\n\nfunction shadowCastingLightsFirst(lightA, lightB) {\n\tconst a = castShadow(lightA) ? 1 : 0;\n\tconst b = castShadow(lightB) ? 1 : 0;\n\treturn b - a;\n}\n\nfunction castShadow(light) {\n\treturn light.shadow && light.castShadow;\n}\n\nfunction _isPerspectiveMatrix$1(m) {\n\treturn m.elements[11] === -1;\n}\n\nlet _cameraDataId = 0;\n\n/**\n * RenderStates collect all render states about scene and camera.\n */\nclass RenderStates {\n\n\tconstructor(sceneData, lightingData) {\n\t\tthis.scene = sceneData;\n\t\tthis.lighting = lightingData;\n\n\t\tthis.camera = {\n\t\t\tid: _cameraDataId++,\n\t\t\tversion: 0,\n\t\t\tnear: 0,\n\t\t\tfar: 0,\n\t\t\tposition: new Vector3(),\n\t\t\tlogDepthCameraNear: 0,\n\t\t\tlogDepthBufFC: 0,\n\t\t\tviewMatrix: new Matrix4(),\n\t\t\tprojectionMatrix: new Matrix4(),\n\t\t\tprojectionViewMatrix: new Matrix4(),\n\t\t\trect: new Vector4(0, 0, 1, 1)\n\t\t};\n\n\t\tthis.gammaFactor = 2.0;\n\t\tthis.outputEncoding = TEXEL_ENCODING_TYPE.LINEAR;\n\t}\n\n\t/**\n\t * Update render states about camera.\n\t * @param {Camera} camera\n\t */\n\tupdateCamera(camera) {\n\t\tconst sceneData = this.scene;\n\t\tconst cameraData = this.camera;\n\t\tconst projectionMatrix = camera.projectionMatrix;\n\n\t\tlet cameraNear = 0, cameraFar = 0;\n\t\tif (_isPerspectiveMatrix$1(projectionMatrix)) {\n\t\t\tcameraNear = projectionMatrix.elements[14] / (projectionMatrix.elements[10] - 1);\n\t\t\tcameraFar = projectionMatrix.elements[14] / (projectionMatrix.elements[10] + 1);\n\t\t} else {\n\t\t\tcameraNear = (projectionMatrix.elements[14] + 1) / projectionMatrix.elements[10];\n\t\t\tcameraFar = (projectionMatrix.elements[14] - 1) / projectionMatrix.elements[10];\n\t\t}\n\n\t\tcameraData.near = cameraNear;\n\t\tcameraData.far = cameraFar;\n\n\t\tif (sceneData.logarithmicDepthBuffer) {\n\t\t\tcameraData.logDepthCameraNear = cameraNear;\n\t\t\tcameraData.logDepthBufFC = 2.0 / (Math.log(cameraFar - cameraNear + 1.0) * Math.LOG2E);\n\t\t} else {\n\t\t\tcameraData.logDepthCameraNear = 0;\n\t\t\tcameraData.logDepthBufFC = 0;\n\t\t}\n\n\t\tcameraData.position.setFromMatrixPosition(camera.worldMatrix);\n\t\tif (sceneData.useAnchorMatrix) {\n\t\t\tcameraData.position.applyMatrix4(sceneData.anchorMatrixInverse);\n\t\t}\n\n\t\tcameraData.viewMatrix.copy(camera.viewMatrix);\n\t\tif (sceneData.useAnchorMatrix) {\n\t\t\tcameraData.viewMatrix.multiply(sceneData.anchorMatrix);\n\t\t}\n\n\t\tcameraData.projectionMatrix.copy(projectionMatrix);\n\t\tcameraData.projectionViewMatrix.copy(projectionMatrix).multiply(cameraData.viewMatrix);\n\n\t\tcameraData.rect.copy(camera.rect);\n\n\t\tcameraData.version++;\n\n\t\tthis.gammaFactor = camera.gammaFactor;\n\t\tthis.outputEncoding = camera.outputEncoding;\n\t}\n\n}\n\n/**\n * RenderQueueLayer holds all the renderable objects.\n * Now has an opaque list and a transparent list.\n */\nclass RenderQueueLayer {\n\n\t/**\n\t * @param {number} id - layer id.\n\t */\n\tconstructor(id) {\n\t\tthis.id = id;\n\n\t\tthis.opaque = [];\n\t\tthis.opaqueCount = 0;\n\n\t\tthis.transparent = [];\n\t\tthis.transparentCount = 0;\n\n\t\tthis._cache = [];\n\t\tthis._cacheIndex = 0;\n\t\tthis._lastCacheIndex = 0;\n\n\t\tthis.opaqueSortCompareFn = defaultOpaqueSortCompare;\n\t\tthis.transparentSortCompareFn = defaultTransparentSortCompare;\n\t}\n\n\tbegin() {\n\t\tthis._cacheIndex = 0;\n\n\t\tthis.opaqueCount = 0;\n\t\tthis.transparentCount = 0;\n\t}\n\n\tend() {\n\t\tthis.opaque.length = this.opaqueCount;\n\t\tthis.transparent.length = this.transparentCount;\n\n\t\t// Clear references from inactive renderables in the list\n\t\tconst cacheIndex = this._cacheIndex,\n\t\t\tlastCacheIndex = this._lastCacheIndex;\n\t\tif (lastCacheIndex > cacheIndex) {\n\t\t\tconst cache = this._cache;\n\t\t\tfor (let i = cacheIndex; i < lastCacheIndex; i++) {\n\t\t\t\tconst renderable = cache[i];\n\t\t\t\trenderable.object = null;\n\t\t\t\trenderable.geometry = null;\n\t\t\t\trenderable.material = null;\n\t\t\t\trenderable.group = null;\n\t\t\t}\n\t\t}\n\t\tthis._lastCacheIndex = cacheIndex;\n\t}\n\n\taddRenderable(object, geometry, material, z, group) {\n\t\tconst cache = this._cache;\n\n\t\tlet renderable = cache[this._cacheIndex];\n\n\t\tif (renderable === undefined) {\n\t\t\trenderable = {\n\t\t\t\tobject: object,\n\t\t\t\tgeometry: geometry,\n\t\t\t\tmaterial: material,\n\t\t\t\tz: z,\n\t\t\t\trenderOrder: object.renderOrder,\n\t\t\t\tgroup: group\n\t\t\t};\n\t\t\tcache[this._cacheIndex] = renderable;\n\t\t} else {\n\t\t\trenderable.object = object;\n\t\t\trenderable.geometry = geometry;\n\t\t\trenderable.material = material;\n\t\t\trenderable.z = z;\n\t\t\trenderable.renderOrder = object.renderOrder;\n\t\t\trenderable.group = group;\n\t\t}\n\n\t\tif (material.transparent) {\n\t\t\tthis.transparent[this.transparentCount] = renderable;\n\t\t\tthis.transparentCount++;\n\t\t} else {\n\t\t\tthis.opaque[this.opaqueCount] = renderable;\n\t\t\tthis.opaqueCount++;\n\t\t}\n\n\t\tthis._cacheIndex++;\n\t}\n\n\tsort() {\n\t\tthis.opaque.sort(this.opaqueSortCompareFn);\n\t\tquickSort(this.transparent, 0, this.transparent.length, this.transparentSortCompareFn);\n\t}\n\n}\n\nfunction defaultOpaqueSortCompare(a, b) {\n\tif (a.renderOrder !== b.renderOrder) {\n\t\treturn a.renderOrder - b.renderOrder;\n\t} else if (a.material.id !== b.material.id) {\n\t\treturn a.material.id - b.material.id;\n\t} else {\n\t\treturn a.id - b.id;\n\t}\n}\n\nfunction defaultTransparentSortCompare(a, b) {\n\tif (a.renderOrder !== b.renderOrder) {\n\t\treturn a.renderOrder - b.renderOrder;\n\t} else if (a.z !== b.z) {\n\t\treturn b.z - a.z;\n\t} else if (a.material.id !== b.material.id) {\n\t\t// fix Unstable sort below chrome version 7.0\n\t\t// if render same object with different materials\n\t\treturn a.material.id - b.material.id;\n\t} else {\n\t\treturn a.id - b.id;\n\t}\n}\n\n// Reference github.com/ant-galaxy/oasis-engine/blob/main/packages/core/src/RenderPipeline/RenderQueue.ts\n// quickSort is faster when sorting highly randomized arrays,\n// but for sorting lowly randomized arrays, Array.prototype.sort is faster,\n// so quickSort is more suitable for transparent list sorting.\n\nfunction quickSort(a, from, to, compareFunc) {\n\twhile (true) {\n\t\t// Insertion sort is faster for short arrays.\n\t\tif (to - from <= 10) {\n\t\t\tinsertionSort(a, from, to, compareFunc);\n\t\t\treturn;\n\t\t}\n\t\tconst third_index = (from + to) >> 1;\n\t\t// Find a pivot as the median of first, last and middle element.\n\t\tlet v0 = a[from];\n\t\tlet v1 = a[to - 1];\n\t\tlet v2 = a[third_index];\n\t\tconst c01 = compareFunc(v0, v1);\n\t\tif (c01 > 0) {\n\t\t\tconst tmp = v0;\n\t\t\tv0 = v1;\n\t\t\tv1 = tmp;\n\t\t}\n\t\tconst c02 = compareFunc(v0, v2);\n\t\tif (c02 >= 0) {\n\t\t\tconst tmp = v0;\n\t\t\tv0 = v2;\n\t\t\tv2 = v1;\n\t\t\tv1 = tmp;\n\t\t} else {\n\t\t\tconst c12 = compareFunc(v1, v2);\n\t\t\tif (c12 > 0) {\n\t\t\t\tconst tmp = v1;\n\t\t\t\tv1 = v2;\n\t\t\t\tv2 = tmp;\n\t\t\t}\n\t\t}\n\t\ta[from] = v0;\n\t\ta[to - 1] = v2;\n\t\tconst pivot = v1;\n\t\tlet low_end = from + 1; // Upper bound of elements lower than pivot.\n\t\tlet high_start = to - 1; // Lower bound of elements greater than pivot.\n\t\ta[third_index] = a[low_end];\n\t\ta[low_end] = pivot;\n\n\t\t// From low_end to i are elements equal to pivot.\n\t\t// From i to high_start are elements that haven't been compared yet.\n\t\tpartition: for (let i = low_end + 1; i < high_start; i++) {\n\t\t\tlet element = a[i];\n\t\t\tlet order = compareFunc(element, pivot);\n\t\t\tif (order < 0) {\n\t\t\t\ta[i] = a[low_end];\n\t\t\t\ta[low_end] = element;\n\t\t\t\tlow_end++;\n\t\t\t} else if (order > 0) {\n\t\t\t\tdo {\n\t\t\t\t\thigh_start--;\n\t\t\t\t\tif (high_start == i) break partition;\n\t\t\t\t\tconst top_elem = a[high_start];\n\t\t\t\t\torder = compareFunc(top_elem, pivot);\n\t\t\t\t} while (order > 0);\n\t\t\t\ta[i] = a[high_start];\n\t\t\t\ta[high_start] = element;\n\t\t\t\tif (order < 0) {\n\t\t\t\t\telement = a[i];\n\t\t\t\t\ta[i] = a[low_end];\n\t\t\t\t\ta[low_end] = element;\n\t\t\t\t\tlow_end++;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (to - high_start < low_end - from) {\n\t\t\tquickSort(a, high_start, to, compareFunc);\n\t\t\tto = low_end;\n\t\t} else {\n\t\t\tquickSort(a, from, low_end, compareFunc);\n\t\t\tfrom = high_start;\n\t\t}\n\t}\n}\n\nfunction insertionSort(a, from, to, compareFunc) {\n\tfor (let i = from + 1; i < to; i++) {\n\t\tlet j;\n\t\tconst element = a[i];\n\t\tfor (j = i - 1; j >= from; j--) {\n\t\t\tconst tmp = a[j];\n\t\t\tconst order = compareFunc(tmp, element);\n\t\t\tif (order > 0) {\n\t\t\t\ta[j + 1] = tmp;\n\t\t\t} else {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\ta[j + 1] = element;\n\t}\n}\n\n/**\n * RenderQueue is used to collect all renderable items, lights and skeletons from the scene.\n * Renderable items will be dispatched to the corresponding RenderQueueLayer according to the object's renderLayer property.\n */\nclass RenderQueue {\n\n\tconstructor() {\n\t\tthis.layerMap = new Map();\n\t\tthis.layerList = [];\n\n\t\tthis.skeletons = new Set();\n\n\t\t// to optimize the performance of the next push, cache the last layer used\n\t\tthis._lastLayer = this.createLayer(0);\n\t}\n\n\tbegin() {\n\t\tfor (let i = 0, l = this.layerList.length; i < l; i++) {\n\t\t\tthis.layerList[i].begin();\n\t\t}\n\n\t\tthis.skeletons.clear();\n\t}\n\n\tend() {\n\t\tfor (let i = 0, l = this.layerList.length; i < l; i++) {\n\t\t\tthis.layerList[i].end();\n\t\t\tthis.layerList[i].sort();\n\t\t}\n\t}\n\n\tpush(object, camera) {\n\t\t// collect skeleton if exists\n\t\tif (object.skeleton) {\n\t\t\tthis.skeletons.add(object.skeleton);\n\t\t}\n\n\t\t_vec4.setFromMatrixPosition(object.worldMatrix)\n\t\t\t.applyMatrix4(camera.projectionViewMatrix);\n\n\t\tconst clipZ = _vec4.z;\n\n\t\tconst layerId = object.renderLayer || 0;\n\n\t\tlet layer = this._lastLayer;\n\t\tif (layer.id !== layerId) {\n\t\t\tlayer = this.layerMap.get(layerId);\n\t\t\tif (!layer) {\n\t\t\t\tlayer = this.createLayer(layerId);\n\t\t\t}\n\t\t\tthis._lastLayer = layer;\n\t\t}\n\n\t\tif (Array.isArray(object.material)) {\n\t\t\tconst groups = object.geometry.groups;\n\n\t\t\tfor (let i = 0; i < groups.length; i++) {\n\t\t\t\tconst group = groups[i];\n\t\t\t\tconst groupMaterial = object.material[group.materialIndex];\n\t\t\t\tif (groupMaterial) {\n\t\t\t\t\tlayer.addRenderable(object, object.geometry, groupMaterial, clipZ, group);\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tlayer.addRenderable(object, object.geometry, object.material, clipZ);\n\t\t}\n\t}\n\n\t/**\n\t * Set a render queue layer.\n\t * @param {number} id - The layer id.\n\t * @param {RenderQueueLayer} layer - The layer to set.\n\t */\n\tsetLayer(id, layer) {\n\t\tthis.layerMap.set(id, layer);\n\t\tthis.layerList.push(layer);\n\t\tthis.layerList.sort(sortLayer);\n\t}\n\n\t/**\n\t * Create and set a render queue layer.\n\t * @param {number} id - The layer id.\n\t * @returns {RenderQueueLayer}\n\t */\n\tcreateLayer(id) {\n\t\tconst layer = new RenderQueueLayer(id);\n\t\tthis.setLayer(id, layer);\n\t\treturn layer;\n\t}\n\n\t/**\n\t * Get the render queue layer.\n\t * @param {number} id - The layer id.\n\t * @returns {RenderQueueLayer}\n\t */\n\tgetLayer(id) {\n\t\treturn this.layerMap.get(id);\n\t}\n\n\t/**\n\t * Remove the render queue layer.\n\t * @param {number} id - The layer id.\n\t */\n\tremoveLayer(id) {\n\t\tconst layer = this.layerMap.get(id);\n\n\t\tif (layer) {\n\t\t\tthis.layerMap.delete(id);\n\n\t\t\tconst index = this.layerList.indexOf(layer);\n\t\t\tif (index !== -1) {\n\t\t\t\tthis.layerList.splice(index, 1);\n\t\t\t}\n\n\t\t\tif (this._lastLayer === id) {\n\t\t\t\tthis._lastLayer = null;\n\t\t\t}\n\t\t}\n\t}\n\n}\n\nconst _vec4 = new Vector4();\n\nfunction sortLayer(a, b) {\n\treturn a.id - b.id;\n}\n\n/**\n * RenderCollector traverses the scene graph and collects all necessary rendering information.\n * It manages scene data, lighting data, and per-camera render states/queues.\n */\nclass RenderCollector {\n\n\t/**\n\t * Creates a new RenderCollector instance.\n\t * In most cases, RenderCollector does not need to be created manually,\n\t * as Scene will automatically create one. See {@link Scene#collector}.\n\t */\n\tconstructor() {\n\t\t// collects scene and lighting data for single scene\n\n\t\tthis.sceneData = new SceneData();\n\t\tthis.lightingData = new LightingData();\n\n\t\t// collects render states and render queues for each camera\n\n\t\tthis._renderStatesMap = new WeakMap();\n\t\tthis._renderQueueMap = new WeakMap();\n\n\t\t// internal states\n\n\t\tthis._lightingNeedsUpdate = true;\n\t\tthis._skeletonVersion = 1;\n\n\t\tconst _boundingSphere = new Sphere();\n\n\t\t/**\n\t\t * Visibility checking function called during scene traversal.\n\t\t * Determines whether an object should be included in the render queue.\n\t\t * Can be overridden to implement custom culling logic (LOD, distance, etc.).\n\t\t * @param {Object3D} object - The object to test for visibility.\n\t\t * @param {Camera} camera - The camera to test against.\n\t\t * @returns {boolean} True if the object should be rendered, false to cull it.\n\t\t * @type {Function}\n\t\t * @example\n\t\t * // Custom visibility check that always returns true\n\t\t * collector.checkVisibility = function(object, camera) {\n\t\t *     return true;\n\t\t * };\n\t\t */\n\t\tthis.checkVisibility = function(object, camera) {\n\t\t\tif (!object.renderable) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tif (!object.frustumCulled || !camera.frustumCulled) {\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\t_boundingSphere.copy(object.geometry.boundingSphere).applyMatrix4(object.worldMatrix);\n\n\t\t\treturn camera.frustum.intersectsSphere(_boundingSphere);\n\t\t};\n\t}\n\n\t/**\n\t * Setting this property to `true` indicates the lighting data needs to be updated.\n\t * Lighting data updates are triggered by the {@link RenderCollector#traverseAndCollect} method.\n\t * @type {boolean}\n\t * @default false\n\t * @param {boolean} value\n\t */\n\tset lightingNeedsUpdate(value) {\n\t\tif (value) {\n\t\t\tthis._lightingNeedsUpdate = true;\n\t\t}\n\t}\n\n\t/**\n\t * Setting this property to `true` indicates all skeletons in the scene should be updated.\n\t * Skeleton updates are triggered by the {@link RenderCollector#traverseAndCollect} method.\n\t * @type {boolean}\n\t * @default false\n\t * @param {boolean} value\n\t */\n\tset skeletonNeedsUpdate(value) {\n\t\tif (value) {\n\t\t\tthis._skeletonVersion++;\n\t\t}\n\t}\n\n\t/**\n\t * Get the RenderStates for the scene and camera.\n\t * If the RenderStates for the camera does not exist, it will be created.\n\t * @param {Camera} camera - The render camera.\n\t * @returns {RenderStates} The target render states.\n\t */\n\tgetRenderStates(camera) {\n\t\tlet renderStates = this._renderStatesMap.get(camera);\n\t\tif (!renderStates) {\n\t\t\t// every camera has its own RenderStates\n\t\t\t// but they share the same scene and lighting data\n\t\t\trenderStates = new RenderStates(this.sceneData, this.lightingData);\n\t\t\tthis._renderStatesMap.set(camera, renderStates);\n\t\t}\n\t\treturn renderStates;\n\t}\n\n\t/**\n\t * Get the RenderQueue for the scene and camera.\n\t * If the RenderQueue for the camera does not exist, it will be created.\n\t * @param {Camera} camera - The render camera.\n\t * @returns {RenderQueue} The target render queue.\n\t */\n\tgetRenderQueue(camera) {\n\t\tlet renderQueue = this._renderQueueMap.get(camera);\n\t\tif (!renderQueue) {\n\t\t\trenderQueue = new RenderQueue();\n\t\t\tthis._renderQueueMap.set(camera, renderQueue);\n\t\t}\n\t\treturn renderQueue;\n\t}\n\n\t/**\n\t * Traverse the scene and collect all renderable objects, lights and skeletons.\n\t * This method will update the RenderQueue and RenderStates for the camera.\n\t * @param {Scene} scene - The scene to traverse.\n\t * @param {Camera} camera - The camera to collect renderable objects for.\n\t * @returns {RenderQueue} The collected render queue.\n\t */\n\ttraverseAndCollect(scene, camera) {\n\t\tconst sceneData = this.sceneData;\n\t\tconst lightingData = this.lightingData;\n\n\t\tconst lightingNeedsUpdate = this._lightingNeedsUpdate;\n\n\t\tconst renderQueue = this.getRenderQueue(camera);\n\n\t\tif (lightingNeedsUpdate) {\n\t\t\tlightingData.begin();\n\t\t}\n\n\t\trenderQueue.begin();\n\n\t\tthis._traverseAndCollect(scene, camera, renderQueue);\n\n\t\trenderQueue.end();\n\n\t\tif (lightingNeedsUpdate) {\n\t\t\tlightingData.end(sceneData);\n\t\t\tthis._lightingNeedsUpdate = false;\n\t\t}\n\n\t\t// Since skeletons may be referenced by different mesh,\n\t\t// it is necessary to collect skeletons in the scene in order to avoid repeated updates.\n\t\t// For IOS platform, we should try to avoid repeated texture updates within one frame,\n\t\t// otherwise the performance will be seriously degraded.\n\t\tconst skeletonVersion = this._skeletonVersion;\n\t\tfor (const skeleton of _skeletons) {\n\t\t\t// Skeleton version ensures uncollected skeletons will be updated in subsequent frames\n\t\t\tif (skeleton._version !== skeletonVersion) {\n\t\t\t\tskeleton.updateBones(sceneData);\n\t\t\t\tskeleton._version = skeletonVersion;\n\t\t\t}\n\t\t}\n\t\t_skeletons.clear();\n\n\t\treturn renderQueue;\n\t}\n\n\t_traverseAndCollect(object, camera, renderQueue) {\n\t\tif (!object.visible) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (object.isMesh) {\n\t\t\tif (this.checkVisibility(object, camera)) {\n\t\t\t\trenderQueue.push(object, camera);\n\t\t\t\tif (object.skeleton) {\n\t\t\t\t\t_skeletons.add(object.skeleton);\n\t\t\t\t}\n\t\t\t}\n\t\t} else if (object.isLight) {\n\t\t\tthis.lightingData.collect(object);\n\t\t}\n\n\t\tconst children = object.children;\n\t\tfor (let i = 0, l = children.length; i < l; i++) {\n\t\t\tthis._traverseAndCollect(children[i], camera, renderQueue);\n\t\t}\n\t}\n\n}\n\nconst _skeletons = new Set();\n\n/**\n * Scenes allow you to set up what and where is to be rendered,\n * this is where you place objects, lights and cameras.\n * @extends Object3D\n */\nclass Scene extends Object3D {\n\n\t/**\n\t * Create a scene.\n\t */\n\tconstructor() {\n\t\tsuper();\n\n\t\t/**\n\t\t * A {@link Fog} instance defining the type of fog that affects everything rendered in the scene.\n\t\t * @type {Fog}\n\t\t * @default null\n\t\t */\n\t\tthis.fog = null;\n\n\t\t/**\n\t\t * Sets the environment map for all materials in the scene.\n\t\t * However, it's not possible to overwrite an existing texture assigned to Material.envMap.\n\t\t * @type {TextureCube | null}\n\t\t * @default null\n\t\t */\n\t\tthis.environment = null;\n\n\t\t/**\n\t\t * The diffuse intensity of the environment map.\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.envDiffuseIntensity = 1;\n\n\t\t/**\n\t\t * The specular intensity of the environment map.\n\t\t * This value is multiplied with the envMapIntensity of the material to get the final intensity.\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.envSpecularIntensity = 1;\n\n\t\t/**\n\t\t * User-defined clipping planes specified as {@link Plane} objects in world space.\n\t\t * These planes apply to the scene.\n\t\t * Points in space whose dot product with the plane is negative are cut away.\n\t\t * @type {Plane[]}\n\t\t * @default []\n\t\t */\n\t\tthis.clippingPlanes = [];\n\n\t\t/**\n\t\t * Defines whether disable shadow sampler feature.\n\t\t * Shader with sampler2DShadow uniforms may cause unknown error on some android phones, set disableShadowSampler to true to avoid these bugs.\n\t\t * When this property is set to true, soft shadow types will fallback to POISSON_SOFT without warning.\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.disableShadowSampler = false;\n\n\t\t/**\n\t\t * whether to use a logarithmic depth buffer. It may be neccesary to use this if dealing with huge differences in scale in a single scene.\n\t\t * Note that this setting uses gl_FragDepth if available which disables the Early Fragment Test optimization and can cause a decrease in performance.\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.logarithmicDepthBuffer = false;\n\n\t\t/**\n\t\t * The anchor matrix of the world coordinate system.\n\t\t * If it is not an identity matrix, the actual lighting calculating and the world position in the shader, will be in the anchor coordinate system.\n\t\t * By setting this property, you can solve the floating point precision problem caused by the rendering object far away from the origin of the world coordinate system.\n\t\t * In addition, by setting the rotation, it can also repair the direction of the reflection.\n\t\t * @type {Matrix4}\n\t\t */\n\t\tthis.anchorMatrix = new Matrix4();\n\n\t\t/**\n\t\t * A {@link RenderCollector} instance for this scene.\n\t\t * @type {RenderCollector}\n\t\t */\n\t\tthis.collector = new RenderCollector();\n\t}\n\n\t/**\n\t * The maximum number of lighting groups.\n\t * @type {number}\n\t * @default 1\n\t */\n\tset maxLightingGroups(value) {\n\t\tthis.collector.lightingData.setMaxGroupCount(value);\n\t}\n\tget maxLightingGroups() {\n\t\treturn this.collector.lightingData.groupList.length;\n\t}\n\n\t/**\n\t * Get {@link RenderStates} for the scene and camera.\n\t * The RenderStates will be updated by calling {@link Scene#updateRenderStates}.\n\t * The light data in RenderStates will be empty unless calling {@link Scene#updateRenderQueue}.\n\t * @param {Camera} camera - The camera.\n\t * @returns {RenderQueue} - The target render queue.\n\t */\n\tgetRenderStates(camera) {\n\t\treturn this.collector.getRenderStates(camera);\n\t}\n\n\t/**\n\t * Get {@link RenderQueue} for the scene and camera.\n\t * The RenderQueue will be updated by calling {@link Scene#updateRenderQueue}.\n\t * @param {Camera} camera - The camera.\n\t * @returns {RenderQueue} - The target render queue.\n\t */\n\tgetRenderQueue(camera) {\n\t\treturn this.collector.getRenderQueue(camera);\n\t}\n\n\t/**\n\t * Update {@link RenderStates} for the scene and camera.\n\t * The lighting data in RenderStates will be empty unless calling {@link Scene#updateRenderQueue}.\n\t * @param {Camera} camera - The camera.\n\t * @param {boolean} [updateScene=true] - Whether to update scene data.\n\t * @returns {RenderStates} - The result render states.\n\t */\n\tupdateRenderStates(camera, updateScene = true) {\n\t\tconst collector = this.collector;\n\n\t\tif (updateScene) {\n\t\t\tcollector.sceneData.update(this);\n\t\t}\n\n\t\tconst renderStates = collector.getRenderStates(camera);\n\n\t\trenderStates.updateCamera(camera);\n\n\t\treturn renderStates;\n\t}\n\n\t/**\n\t * Update {@link RenderQueue} for the scene and camera.\n\t * Collect all visible meshes (and lights) from scene graph, and push meshes to render queue.\n\t * Light data will be stored in RenderStates.\n\t * @param {Camera} camera - The camera.\n\t * @param {boolean} [collectLights=true] - Whether to collect light data.\n\t * @param {boolean} [updateSkeletons=true] - Whether to update skeletons.\n\t * @returns {RenderQueue} - The result render queue.\n\t */\n\tupdateRenderQueue(camera, collectLights = true, updateSkeletons = true) {\n\t\tconst collector = this.collector;\n\n\t\tcollector.lightingNeedsUpdate = collectLights;\n\t\tcollector.skeletonNeedsUpdate = updateSkeletons;\n\n\t\treturn collector.traverseAndCollect(this, camera);\n\t}\n\n}\n\n/**\n * This flag can be used for type testing.\n * @readonly\n * @type {boolean}\n * @default true\n */\nScene.prototype.isScene = true;\n\n/**\n * Base camera projection class. All projection types should inherit from this.\n * Should not be instantiated directly; subclasses must implement matrix calculation.\n * @abstract\n */\nclass CameraProjection {\n\n\t/**\n\t * Creates a CameraProjection instance.\n\t */\n\tconstructor() {\n\t\tthis._matrix = new Matrix4();\n\t\tthis._dirty = true;\n\t}\n\n\t/**\n\t * Get the current projection matrix.\n\t * @returns {Matrix4} The projection matrix.\n\t */\n\tget matrix() {\n\t\tif (this._dirty) {\n\t\t\tthis._updateMatrix();\n\t\t}\n\n\t\treturn this._matrix;\n\t}\n\n\t/**\n\t * Copy parameters from another CameraProjection. Should be implemented by subclasses.\n\t * @param {CameraProjection} source The source projection object.\n\t * @returns {CameraProjection} this\n\t */\n\tcopy(source) {\n\t\tconsole.warn('CameraProjection: copy() must be implemented in subclass.');\n\t\treturn this;\n\t}\n\n\t/**\n\t * Clone this projection object.\n\t * @returns {CameraProjection} A new projection object.\n\t */\n\tclone() {\n\t\treturn new this.constructor().copy(this);\n\t}\n\n\t/**\n\t * Update the projection matrix. Should be implemented by subclasses.\n\t * @protected\n\t */\n\t_updateMatrix() {\n\t\tconsole.warn('CameraProjection: _updateMatrix() must be implemented in subclass.');\n\t\tthis._dirty = false;\n\t}\n\n}\n\n/**\n * Perspective projection camera class.\n * Generates a perspective projection matrix based on field of view, aspect ratio, near and far planes.\n * Field of view is specified in degrees.\n */\nclass PerspectiveProjection extends CameraProjection {\n\n\t/**\n\t * Creates a PerspectiveProjection instance.\n\t * @param {number} [fov=50] Vertical field of view in degrees.\n\t * @param {number} [aspect=1] Aspect ratio (width / height).\n\t * @param {number} [near=0.1] Near clipping plane.\n\t * @param {number} [far=2000] Far clipping plane.\n\t */\n\tconstructor(fov = 50, aspect = 1, near = 0.1, far = 2000) {\n\t\tsuper();\n\n\t\tthis._fov = fov;\n\t\tthis._aspect = aspect;\n\t\tthis._near = near;\n\t\tthis._far = far;\n\t}\n\n\t/**\n\t * The vertical field of view in degrees.\n\t * @type {number}\n\t * @default 50\n\t */\n\tset fov(value) {\n\t\tthis._fov = value;\n\t\tthis._dirty = true;\n\t}\n\n\tget fov() {\n\t\treturn this._fov;\n\t}\n\n\t/**\n\t * The aspect ratio (width / height).\n\t * @type {number}\n\t * @default 1\n\t */\n\tset aspect(value) {\n\t\tthis._aspect = value;\n\t\tthis._dirty = true;\n\t}\n\n\tget aspect() {\n\t\treturn this._aspect;\n\t}\n\n\t/**\n\t * The near clipping plane.\n\t * @type {number}\n\t * @default 0.1\n\t */\n\tset near(value) {\n\t\tthis._near = value;\n\t\tthis._dirty = true;\n\t}\n\n\tget near() {\n\t\treturn this._near;\n\t}\n\n\t/**\n\t * The far clipping plane.\n\t * @type {number}\n\t * @default 2000\n\t */\n\tset far(value) {\n\t\tthis._far = value;\n\t\tthis._dirty = true;\n\t}\n\n\tget far() {\n\t\treturn this._far;\n\t}\n\n\t/**\n\t * Sets all perspective parameters at once.\n\t * @param {number} fov Vertical field of view in degrees.\n\t * @param {number} aspect Aspect ratio (width / height).\n\t * @param {number} near Near clipping plane.\n\t * @param {number} far Far clipping plane.\n\t * @returns {PerspectiveProjection} this\n\t */\n\tset(fov, aspect, near, far) {\n\t\tthis._fov = fov;\n\t\tthis._aspect = aspect;\n\t\tthis._near = near;\n\t\tthis._far = far;\n\t\tthis._dirty = true;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Copies the parameters from another PerspectiveProjection.\n\t * @param {PerspectiveProjection} source\n\t * @returns {PerspectiveProjection} this\n\t */\n\tcopy(source) {\n\t\tthis._fov = source._fov;\n\t\tthis._aspect = source._aspect;\n\t\tthis._near = source._near;\n\t\tthis._far = source._far;\n\t\tthis._dirty = true;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Updates the perspective projection matrix.\n\t * @protected\n\t */\n\t_updateMatrix() {\n\t\tconst fov = this._fov * Math.PI / 180, aspect = this._aspect, near = this._near, far = this._far;\n\t\tconst f = 1 / Math.tan(fov / 2);\n\t\tthis._matrix.set(\n\t\t\tf / aspect, 0, 0, 0,\n\t\t\t0, f, 0, 0,\n\t\t\t0, 0, (far + near) / (near - far), (2 * far * near) / (near - far),\n\t\t\t0, 0, -1, 0\n\t\t);\n\t\tthis._dirty = false;\n\t}\n\n}\n\n/**\n * Orthographic projection camera class.\n * Generates an orthographic projection matrix based on left, right, top, bottom, near, and far planes.\n */\nclass OrthographicProjection extends CameraProjection {\n\n\t/**\n\t * Creates an OrthographicProjection instance.\n\t * @param {number} [left=-1] Left plane of the orthographic box.\n\t * @param {number} [right=1] Right plane of the orthographic box.\n\t * @param {number} [top=1] Top plane of the orthographic box.\n\t * @param {number} [bottom=-1] Bottom plane of the orthographic box.\n\t * @param {number} [near=0.1] Near clipping plane.\n\t * @param {number} [far=2000] Far clipping plane.\n\t */\n\tconstructor(left = -1, right = 1, top = 1, bottom = -1, near = 0.1, far = 2000) {\n\t\tsuper();\n\n\t\tthis._left = left;\n\t\tthis._right = right;\n\t\tthis._top = top;\n\t\tthis._bottom = bottom;\n\t\tthis._near = near;\n\t\tthis._far = far;\n\t}\n\n\t/**\n\t * The left plane of the orthographic box.\n\t * @type {number}\n\t * @default -1\n\t */\n\tset left(value) {\n\t\tthis._left = value;\n\t\tthis._dirty = true;\n\t}\n\n\tget left() {\n\t\treturn this._left;\n\t}\n\n\t/**\n\t * The right plane of the orthographic box.\n\t * @type {number}\n\t * @default 1\n\t */\n\tset right(value) {\n\t\tthis._right = value;\n\t\tthis._dirty = true;\n\t}\n\n\tget right() {\n\t\treturn this._right;\n\t}\n\n\t/**\n\t * The top plane of the orthographic box.\n\t * @type {number}\n\t * @default 1\n\t */\n\tset top(value) {\n\t\tthis._top = value;\n\t\tthis._dirty = true;\n\t}\n\n\tget top() {\n\t\treturn this._top;\n\t}\n\n\t/**\n\t * The bottom plane of the orthographic box.\n\t * @type {number}\n\t * @default -1\n\t */\n\tset bottom(value) {\n\t\tthis._bottom = value;\n\t\tthis._dirty = true;\n\t}\n\n\tget bottom() {\n\t\treturn this._bottom;\n\t}\n\n\t/**\n\t * The near clipping plane.\n\t * @type {number}\n\t * @default 0.1\n\t */\n\tset near(value) {\n\t\tthis._near = value;\n\t\tthis._dirty = true;\n\t}\n\n\tget near() {\n\t\treturn this._near;\n\t}\n\n\t/**\n\t * The far clipping plane.\n\t * @type {number}\n\t * @default 2000\n\t */\n\tset far(value) {\n\t\tthis._far = value;\n\t\tthis._dirty = true;\n\t}\n\n\tget far() {\n\t\treturn this._far;\n\t}\n\n\t/**\n\t * Sets all orthographic parameters at once.\n\t * @param {number} left The left plane of the orthographic box.\n\t * @param {number} right The right plane of the orthographic box.\n\t * @param {number} top The top plane of the orthographic box.\n\t * @param {number} bottom The bottom plane of the orthographic box.\n\t * @param {number} near The near clipping plane.\n\t * @param {number} far The far clipping plane.\n\t * @returns {OrthographicProjection} this\n\t */\n\tset(left, right, top, bottom, near, far) {\n\t\tthis._left = left;\n\t\tthis._right = right;\n\t\tthis._top = top;\n\t\tthis._bottom = bottom;\n\t\tthis._near = near;\n\t\tthis._far = far;\n\t\tthis._dirty = true;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the orthographic box size by width and height, centered at (0, 0).\n\t * @param {number} width The width of the orthographic box.\n\t * @param {number} height The height of the orthographic box.\n\t * @returns {OrthographicProjection} this\n\t */\n\tsetSize(width, height) {\n\t\tthis._left = -width / 2;\n\t\tthis._right = width / 2;\n\t\tthis._top = height / 2;\n\t\tthis._bottom = -height / 2;\n\t\tthis._dirty = true;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Copies the parameters from another OrthographicProjection.\n\t * @param {OrthographicProjection} source\n\t * @returns {OrthographicProjection} this\n\t */\n\tcopy(source) {\n\t\tthis._left = source._left;\n\t\tthis._right = source._right;\n\t\tthis._top = source._top;\n\t\tthis._bottom = source._bottom;\n\t\tthis._near = source._near;\n\t\tthis._far = source._far;\n\t\tthis._dirty = true;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Updates the orthographic projection matrix.\n\t * @protected\n\t */\n\t_updateMatrix() {\n\t\tconst left = this._left, right = this._right, bottom = this._bottom, top = this._top, near = this._near, far = this._far;\n\t\tthis._matrix.set(\n\t\t\t2 / (right - left), 0, 0, -(right + left) / (right - left),\n\t\t\t0, 2 / (top - bottom), 0, -(top + bottom) / (top - bottom),\n\t\t\t0, 0, -2 / (far - near), -(far + near) / (far - near),\n\t\t\t0, 0, 0, 1\n\t\t);\n\t\tthis._dirty = false;\n\t}\n\n}\n\n/**\n * The camera used for rendering a 3D scene.\n * The camera's direction is defined as the 3-vector (0.0, 0,0, -1.0), that is, an untransformed camera points down the -Z axis.\n * @extends Object3D\n */\nclass Camera extends Object3D {\n\n\t/**\n\t * Create a camera.\n\t */\n\tconstructor() {\n\t\tsuper();\n\n\t\t/**\n\t\t * This is the inverse of worldMatrix.\n\t\t * The matrix may be different from the value passed in the shader, scene.anchorMatrix is not considered here.\n\t\t * @type {Matrix4}\n\t\t */\n\t\tthis.viewMatrix = new Matrix4();\n\n\t\t/**\n\t\t * This is the matrix which contains the projection.\n\t\t * @type {Matrix4}\n\t\t */\n\t\tthis.projectionMatrix = new Matrix4();\n\n\t\t/**\n\t\t * This is the matrix which contains the projection.\n\t\t * @type {Matrix4}\n\t\t */\n\t\tthis.projectionMatrixInverse = new Matrix4();\n\n\t\t/**\n\t\t * This is the matrix which contains the projection and view matrix.\n\t\t * The matrix may be different from the value passed in the shader, scene.anchorMatrix is not considered here.\n\t\t * @type {Matrix4}\n\t\t */\n\t\tthis.projectionViewMatrix = new Matrix4();\n\n\t\t/**\n\t\t * The frustum of the camera.\n\t\t * @type {Frustum}\n\t\t */\n\t\tthis.frustum = new Frustum();\n\n\t\t/**\n\t\t * The factor of gamma.\n\t\t * @type {number}\n\t\t * @default 2.0\n\t\t */\n\t\tthis.gammaFactor = 2.0;\n\n\t\t/**\n\t\t * Output pixel encoding.\n\t\t * @type {TEXEL_ENCODING_TYPE}\n\t\t * @default TEXEL_ENCODING_TYPE.LINEAR\n\t\t */\n\t\tthis.outputEncoding = TEXEL_ENCODING_TYPE.LINEAR;\n\n\t\t/**\n\t\t * Where on the screen is the camera rendered in normalized coordinates.\n\t\t * The values in rect range from zero (left/bottom) to one (right/top).\n\t\t * @type {Vector4}\n\t\t * @default Vector4(0, 0, 1, 1)\n\t\t */\n\t\tthis.rect = new Vector4(0, 0, 1, 1);\n\n\t\t/**\n\t\t * When this is set, it checks every frame if objects are in the frustum of the camera before rendering objects.\n\t\t * Otherwise objects gets rendered every frame even if it isn't visible.\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.frustumCulled = true;\n\t}\n\n\t/**\n\t * Set view by look at, this func will set quaternion of this camera.\n\t * @param {Vector3} target - The target that the camera look at.\n\t * @param {Vector3} up - The up direction of the camera.\n\t */\n\tlookAt(target, up) {\n\t\t_mat4_1.lookAtRH(this.position, target, up);\n\t\tthis.quaternion.setFromRotationMatrix(_mat4_1);\n\t}\n\n\t/**\n\t * Set orthographic projection matrix.\n\t * @param {number} left Camera frustum left plane.\n\t * @param {number} right Camera frustum right plane.\n\t * @param {number} bottom Camera frustum bottom plane.\n\t * @param {number} top Camera frustum top plane.\n\t * @param {number} near Camera frustum near plane.\n\t * @param {number} far Camera frustum far plane.\n\t * @deprecated Use OrthographicProjection instead.\n\t */\n\tsetOrtho(left, right, bottom, top, near, far) {\n\t\t_orthographicProjection.set(left, right, top, bottom, near, far);\n\t\tthis.setProjectionMatrix(_orthographicProjection.matrix);\n\t}\n\n\t/**\n\t * Set perspective projection matrix.\n\t * @param {number} fov Camera frustum vertical field of view.\n\t * @param {number} aspect Camera frustum aspect ratio.\n\t * @param {number} near Camera frustum near plane.\n\t * @param {number} far Camera frustum far plane.\n\t * @deprecated Use PerspectiveProjection instead.\n\t */\n\tsetPerspective(fov, aspect, near, far) {\n\t\t_perspectiveProjection.set(fov * 180 / Math.PI, aspect, near, far);\n\t\tthis.setProjectionMatrix(_perspectiveProjection.matrix);\n\t}\n\n\t/**\n\t * Set the projection matrix.\n\t * @param {Matrix4} matrix The projection matrix.\n\t */\n\tsetProjectionMatrix(matrix) {\n\t\tthis.projectionMatrix.copy(matrix);\n\t\tthis.projectionMatrixInverse.copy(this.projectionMatrix).invert();\n\t}\n\n\tgetWorldDirection(optionalTarget = new Vector3()) {\n\t\treturn super.getWorldDirection(optionalTarget).negate();\n\t}\n\n\tupdateMatrix(force) {\n\t\tObject3D.prototype.updateMatrix.call(this, force);\n\n\t\tthis.viewMatrix.copy(this.worldMatrix).invert(); // update view matrix\n\n\t\tthis.projectionViewMatrix.multiplyMatrices(this.projectionMatrix, this.viewMatrix); // get PV matrix\n\t\tthis.frustum.setFromMatrix(this.projectionViewMatrix); // update frustum\n\t}\n\n\tcopy(source, recursive) {\n\t\tObject3D.prototype.copy.call(this, source, recursive);\n\n\t\tthis.viewMatrix.copy(source.viewMatrix);\n\t\tthis.projectionMatrix.copy(source.projectionMatrix);\n\t\tthis.projectionMatrixInverse.copy(source.projectionMatrixInverse);\n\n\t\tthis.frustum.copy(source.frustum);\n\t\tthis.gammaFactor = source.gammaFactor;\n\t\tthis.outputEncoding = source.outputEncoding;\n\t\tthis.rect.copy(source.rect);\n\t\tthis.frustumCulled = source.frustumCulled;\n\n\t\treturn this;\n\t}\n\n}\n\n/**\n * This flag can be used for type testing.\n * @readonly\n * @type {boolean}\n * @default true\n */\nCamera.prototype.isCamera = true;\n\nconst _mat4_1 = new Matrix4();\nconst _perspectiveProjection = new PerspectiveProjection();\nconst _orthographicProjection = new OrthographicProjection();\n\nconst _sphere = new Sphere();\nconst _inverseMatrix = new Matrix4();\nconst _ray = new Ray();\n\nconst _barycoord = new Vector3();\n\nconst _vA = new Vector3();\nconst _vB = new Vector3();\nconst _vC = new Vector3();\n\nconst _tempA = new Vector3();\nconst _morphA = new Vector3();\n\nconst _uvA = new Vector2();\nconst _uvB = new Vector2();\nconst _uvC = new Vector2();\n\nconst _intersectionPoint = new Vector3();\nconst _intersectionPointWorld = new Vector3();\n\n/**\n * Class representing triangular polygon mesh based objects.\n * Also serves as a base for other classes such as {@link SkinnedMesh}.\n * @extends Object3D\n */\nclass Mesh extends Object3D {\n\n\t/**\n\t * @param {Geometry} geometry — an instance of {@link Geometry}.\n\t * @param {Material} material - a single or an array of {@link Material}.\n\t */\n\tconstructor(geometry, material) {\n\t\tsuper();\n\n\t\t/**\n\t\t * an instance of {@link Geometry}.\n\t\t * @type {Geometry}\n\t\t */\n\t\tthis.geometry = geometry;\n\n\t\t/**\n\t\t * a single or an array of {@link Material}.\n\t\t * @type {Material|Material[]}\n\t\t */\n\t\tthis.material = material;\n\n\t\t/**\n\t\t * An array of weights typically from 0-1 that specify how much of the morph is applied.\n\t\t * @type {number[] | null}\n\t\t * @default null\n\t\t */\n\t\tthis.morphTargetInfluences = null;\n\t}\n\n\t/**\n\t * Get the local-space position of the vertex at the given index,\n\t * taking into account the current animation state of both morph targets and skinning.\n\t * @param {number} index - The index of the vertex.\n\t * @param {Vector3} target - The target vector.\n\t * @returns {Vector3} The target vector.\n\t */\n\tgetVertexPosition(index, target) {\n\t\tconst geometry = this.geometry;\n\t\tconst position = geometry.getAttribute('a_Position');\n\t\tconst morphPosition = geometry.morphAttributes.position;\n\n\t\ttarget.fromArray(position.buffer.array, index * position.buffer.stride + position.offset);\n\n\t\tconst morphInfluences = this.morphTargetInfluences;\n\n\t\tif (morphPosition && morphInfluences) {\n\t\t\t_morphA.set(0, 0, 0);\n\n\t\t\tfor (let i = 0, il = morphPosition.length; i < il; i++) {\n\t\t\t\tconst influence = morphInfluences[i];\n\t\t\t\tconst morphAttribute = morphPosition[i];\n\n\t\t\t\tif (influence === 0) continue;\n\n\t\t\t\t_tempA.fromArray(morphAttribute.buffer.array, index * morphAttribute.buffer.stride + morphAttribute.offset);\n\n\t\t\t\t_morphA.addScaledVector(_tempA, influence);\n\t\t\t}\n\n\t\t\ttarget.add(_morphA);\n\t\t}\n\n\t\treturn target;\n\t}\n\n\traycast(ray, intersects) {\n\t\tconst geometry = this.geometry;\n\t\tconst material = this.material;\n\t\tconst worldMatrix = this.worldMatrix;\n\n\t\t_sphere.copy(geometry.boundingSphere);\n\t\t_sphere.applyMatrix4(worldMatrix);\n\t\tif (!ray.intersectsSphere(_sphere)) {\n\t\t\treturn;\n\t\t}\n\n\t\t_inverseMatrix.copy(worldMatrix).invert();\n\t\t_ray.copy(ray).applyMatrix4(_inverseMatrix);\n\n\t\tif (!_ray.intersectsBox(geometry.boundingBox)) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst position = geometry.getAttribute('a_Position');\n\n\t\tif (!position) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst uv = geometry.getAttribute('a_Uv');\n\t\tconst groups = geometry.groups;\n\n\t\tlet intersection;\n\n\t\tif (geometry.index) {\n\t\t\tconst index = geometry.index.buffer.array;\n\n\t\t\tif (Array.isArray(material)) {\n\t\t\t\tfor (let i = 0, il = groups.length; i < il; i++) {\n\t\t\t\t\tconst group = groups[i];\n\t\t\t\t\tconst groupMaterial = material[group.materialIndex];\n\n\t\t\t\t\tconst start = group.start;\n\t\t\t\t\tconst end = Math.min(index.length, group.start + group.count);\n\n\t\t\t\t\tfor (let j = start, jl = end; j < jl; j += 3) {\n\t\t\t\t\t\tconst a = index[j];\n\t\t\t\t\t\tconst b = index[j + 1];\n\t\t\t\t\t\tconst c = index[j + 2];\n\n\t\t\t\t\t\tintersection = checkGeometryIntersection(this, groupMaterial, ray, _ray, uv, a, b, c);\n\n\t\t\t\t\t\tif (intersection) {\n\t\t\t\t\t\t\tintersection.faceIndex = Math.floor(i / 3);\n\t\t\t\t\t\t\tintersection.face.materialIndex = group.materialIndex;\n\t\t\t\t\t\t\tintersects.push(intersection);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tfor (let i = 0, il = index.length; i < il; i += 3) {\n\t\t\t\t\tconst a = index[i];\n\t\t\t\t\tconst b = index[i + 1];\n\t\t\t\t\tconst c = index[i + 2];\n\n\t\t\t\t\tintersection = checkGeometryIntersection(this, material, ray, _ray, uv, a, b, c);\n\n\t\t\t\t\tif (intersection) {\n\t\t\t\t\t\tintersection.faceIndex = Math.floor(i / 3);\n\t\t\t\t\t\tintersects.push(intersection);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tif (Array.isArray(material)) {\n\t\t\t\tfor (let i = 0, il = groups.length; i < il; i++) {\n\t\t\t\t\tconst group = groups[i];\n\t\t\t\t\tconst groupMaterial = material[group.materialIndex];\n\n\t\t\t\t\tconst start = group.start;\n\t\t\t\t\tconst end = Math.min(position.buffer.count, group.start + group.count);\n\n\t\t\t\t\tfor (let j = start, jl = end; j < jl; j += 3) {\n\t\t\t\t\t\tconst a = j;\n\t\t\t\t\t\tconst b = j + 1;\n\t\t\t\t\t\tconst c = j + 2;\n\n\t\t\t\t\t\tintersection = checkGeometryIntersection(this, groupMaterial, ray, _ray, uv, a, b, c);\n\n\t\t\t\t\t\tif (intersection) {\n\t\t\t\t\t\t\tintersection.faceIndex = Math.floor(i / 3);\n\t\t\t\t\t\t\tintersection.face.materialIndex = group.materialIndex;\n\t\t\t\t\t\t\tintersects.push(intersection);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tfor (let i = 0, il = position.buffer.count; i < il; i += 3) {\n\t\t\t\t\tconst a = i;\n\t\t\t\t\tconst b = i + 1;\n\t\t\t\t\tconst c = i + 2;\n\n\t\t\t\t\tintersection = checkGeometryIntersection(this, material, ray, _ray, uv, a, b, c);\n\n\t\t\t\t\tif (intersection) {\n\t\t\t\t\t\tintersection.faceIndex = Math.floor(i / 3);\n\t\t\t\t\t\tintersects.push(intersection);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tcopy(source) {\n\t\tsuper.copy(source);\n\t\tif (source.morphTargetInfluences) {\n\t\t\tthis.morphTargetInfluences = source.morphTargetInfluences.slice();\n\t\t}\n\t\treturn this;\n\t}\n\n\tclone() {\n\t\treturn new this.constructor(this.geometry, this.material).copy(this);\n\t}\n\n}\n\n/**\n * This flag can be used for type testing.\n * @readonly\n * @type {boolean}\n * @default true\n */\nMesh.prototype.isMesh = true;\n\nfunction checkGeometryIntersection(object, material, ray, _ray, uv, a, b, c) {\n\tobject.getVertexPosition(a, _vA);\n\tobject.getVertexPosition(b, _vB);\n\tobject.getVertexPosition(c, _vC);\n\n\tconst intersection = checkIntersection(object, material, ray, _ray, _vA, _vB, _vC, _intersectionPoint);\n\n\tif (intersection) {\n\t\tlet array;\n\t\tlet bufferStride;\n\t\tlet attributeOffset;\n\n\t\tif (uv) {\n\t\t\tarray = uv.buffer.array;\n\t\t\tbufferStride = uv.buffer.stride;\n\t\t\tattributeOffset = uv.offset;\n\t\t\t_uvA.fromArray(array, a * bufferStride + attributeOffset);\n\t\t\t_uvB.fromArray(array, b * bufferStride + attributeOffset);\n\t\t\t_uvC.fromArray(array, c * bufferStride + attributeOffset);\n\n\t\t\tintersection.uv = uvIntersection(_intersectionPoint, _vA, _vB, _vC, _uvA, _uvB, _uvC);\n\t\t}\n\n\t\tconst face = {\n\t\t\ta: a,\n\t\t\tb: b,\n\t\t\tc: c,\n\t\t\tnormal: new Vector3()\n\t\t};\n\n\t\tTriangle.normal(_vA, _vB, _vC, face.normal);\n\n\t\tintersection.face = face;\n\t}\n\n\treturn intersection;\n}\n\nfunction uvIntersection(point, p1, p2, p3, uv1, uv2, uv3) {\n\tTriangle.barycoordFromPoint(point, p1, p2, p3, _barycoord);\n\n\tuv1.multiplyScalar(_barycoord.x);\n\tuv2.multiplyScalar(_barycoord.y);\n\tuv3.multiplyScalar(_barycoord.z);\n\n\tuv1.add(uv2).add(uv3);\n\n\treturn uv1.clone();\n}\n\nfunction checkIntersection(object, material, ray, localRay, pA, pB, pC, point) {\n\tlet intersect;\n\n\tif (material.side === DRAW_SIDE.BACK) {\n\t\tintersect = localRay.intersectTriangle(pC, pB, pA, true, point);\n\t} else {\n\t\tintersect = localRay.intersectTriangle(pA, pB, pC, material.side !== DRAW_SIDE.DOUBLE, point);\n\t}\n\n\tif (intersect === null) return null;\n\n\t_intersectionPointWorld.copy(point);\n\t_intersectionPointWorld.applyMatrix4(object.worldMatrix);\n\n\tconst distance = ray.origin.distanceTo(_intersectionPointWorld);\n\n\treturn {\n\t\tdistance: distance,\n\t\tpoint: _intersectionPointWorld.clone(),\n\t\tobject: object\n\t};\n}\n\n/**\n * The Attribute add structural information to Buffer.\n * This class stores data for an attribute (such as vertex positions, face indices, normals, colors, UVs, and any custom attributes ) associated with a Geometry, which allows for more efficient passing of data to the GPU.\n * Data is stored as vectors of any length (defined by size).\n */\nclass Attribute {\n\n\t/**\n\t * @param {Buffer} buffer - The Buffer instance passed in the constructor.\n\t * @param {number} [size=buffer.stride] - The number of values of the array that should be associated with a particular vertex. For instance, if this attribute is storing a 3-component vector (such as a position, normal, or color), then size should be 3.\n\t * @param {number} [offset=0] - The offset in the underlying array buffer where an item starts.\n\t * @param {boolean} [normalized=false] - Indicates how the underlying data in the buffer maps to the values in the GLSL shader code.\n\t */\n\tconstructor(buffer, size = buffer.stride, offset = 0, normalized = false) {\n\t\t/**\n\t\t * The Buffer instance passed in the constructor.\n\t\t * @type {Buffer}\n\t\t */\n\t\tthis.buffer = buffer;\n\n\t\t/**\n\t\t * The number of values of the buffer that should be associated with the attribute.\n\t\t * @type {number}\n\t\t * @default buffer.stride\n\t\t */\n\t\tthis.size = size;\n\n\t\t/**\n\t\t * The offset in the underlying buffer where an item starts.\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.offset = offset;\n\n\t\t/**\n\t\t * Indicates how the underlying data in the buffer maps to the values in the GLSL shader code.\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.normalized = normalized;\n\n\t\t/**\n\t\t * Instance cadence, the number of instances drawn for each vertex in the buffer, non-instance attributes must be 0.\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.divisor = 0;\n\t}\n\n\t/**\n\t * Copy the parameters from the passed attribute.\n\t * @param {Attribute} source - The attribute to be copied.\n\t * @returns {Attribute}\n\t */\n\tcopy(source) {\n\t\tthis.buffer = source.buffer;\n\t\tthis.size = source.size;\n\t\tthis.offset = source.offset;\n\t\tthis.normalized = source.normalized;\n\t\tthis.divisor = source.divisor;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Return a new attribute with the same parameters as this attribute.\n\t * @param {object} buffers - A WeakMap to save shared buffers.\n\t * @returns {Attribute}\n\t */\n\tclone(buffers) {\n\t\tlet attribute;\n\n\t\tif (!buffers) {\n\t\t\tconsole.warn('Attribute.clone(): now requires a WeakMap as an argument to save shared buffers.');\n\n\t\t\tattribute = new Attribute(this.buffer.clone(), this.size, this.offset, this.normalized);\n\t\t\tattribute.divisor = this.divisor;\n\t\t\treturn attribute;\n\t\t}\n\n\t\tif (!buffers.has(this.buffer)) {\n\t\t\tbuffers.set(this.buffer, this.buffer.clone());\n\t\t}\n\n\t\tattribute = new Attribute(buffers.get(this.buffer), this.size, this.offset, this.normalized);\n\t\tattribute.divisor = this.divisor;\n\t\treturn attribute;\n\t}\n\n}\n\n/**\n * The Buffer contain the data that is used for the geometry of 3D models, animations, and skinning.\n */\nclass Buffer {\n\n\t/**\n\t * @param {TypedArray} array -- A typed array with a shared buffer. Stores the geometry data.\n\t * @param {number} stride -- The number of typed-array elements per vertex.\n\t */\n\tconstructor(array, stride) {\n\t\t/**\n\t\t * A typed array with a shared buffer.\n\t\t * Stores the geometry data.\n\t\t * @type {TypedArray}\n\t\t */\n\t\tthis.array = array;\n\n\t\t/**\n\t\t * The number of typed-array elements per vertex.\n\t\t * @type {number}\n\t\t */\n\t\tthis.stride = stride;\n\n\t\t/**\n\t\t * Gives the total number of elements in the array.\n\t\t * @type {number}\n\t\t */\n\t\tthis.count = array !== undefined ? array.length / stride : 0;\n\n\t\t/**\n\t\t * Defines the intended usage pattern of the data store for optimization purposes.\n\t\t * Corresponds to the usage parameter of WebGLRenderingContext.bufferData().\n\t\t * @type {BUFFER_USAGE}\n\t\t * @default BUFFER_USAGE.STATIC_DRAW\n\t\t */\n\t\tthis.usage = BUFFER_USAGE.STATIC_DRAW;\n\n\t\t/**\n\t\t * Object containing offset and count.\n\t\t * @type {object}\n\t\t * @default { offset: 0, count: - 1 }\n\t\t */\n\t\tthis.updateRange = { offset: 0, count: -1 };\n\n\t\t/**\n\t\t * A version number, incremented every time the data is changed.\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.version = 0;\n\t}\n\n\t/**\n\t * A callback function that is executed after the Renderer has transferred the attribute array data to the GPU.\n\t */\n\tonUploadCallback() {}\n\n\t/**\n\t * Copies another Buffer to this Buffer.\n\t * @param {Buffer} source - The buffer to be copied.\n\t * @returns {Buffer}\n\t */\n\tcopy(source) {\n\t\tthis.array = new source.array.constructor(source.array);\n\t\tthis.stride = source.stride;\n\t\tthis.count = source.array.length / this.stride;\n\t\tthis.usage = source.usage;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Return a copy of this buffer.\n\t * @returns {Buffer}\n\t */\n\tclone() {\n\t\tconst array = new this.array.constructor(this.array);\n\t\tconst ib = new Buffer(array, this.stride);\n\t\tib.usage = this.usage;\n\t\treturn ib;\n\t}\n\n}\n\nlet _geometryId = 0;\n\nconst _vector$1 = new Vector3();\nconst _offset = new Vector3();\nconst _sum = new Vector3();\nconst _box3 = new Box3();\nconst _boxMorphTargets = new Box3();\n\n/**\n * An efficient representation of mesh, line, or point geometry.\n * Includes vertex positions, face indices, normals, colors, UVs, and custom attributes within buffers, reducing the cost of passing all this data to the GPU.\n * To read and edit data in {@link Geometry#attributes}.\n * @extends EventDispatcher\n */\nclass Geometry extends EventDispatcher {\n\n\t/**\n\t * Create a geometry.\n\t */\n\tconstructor() {\n\t\tsuper();\n\n\t\t/**\n\t\t * Unique number for this geometry instance.\n\t\t * @readonly\n\t\t * @type {number}\n\t\t */\n\t\tthis.id = _geometryId++;\n\n\t\t/**\n\t\t * UUID of this geometry instance.\n\t\t * This gets automatically assigned, so this shouldn't be edited.\n\t\t * @readonly\n\t\t * @type {string}\n\t\t */\n\t\tthis.uuid = MathUtils.generateUUID();\n\n\t\t/**\n\t\t * This hashmap has as id the name of the attribute to be set and as value the buffer to set it to.\n\t\t * Rather than accessing this property directly, use {@link Geometry#addAttribute} and {@link Geometry#getAttribute} to access attributes of this geometry.\n\t\t * @type {object}\n\t\t */\n\t\tthis.attributes = {};\n\n\t\t/**\n\t\t * Hashmap of Attributes Array for morph targets.\n\t\t * @type {object}\n\t\t */\n\t\tthis.morphAttributes = {};\n\n\t\t/**\n\t\t * Allows for vertices to be re-used across multiple triangles; this is called using \"indexed triangles\" and each triangle is associated with the indices of three vertices.\n\t\t * This attribute therefore stores the index of each vertex for each triangular face.\n\t\t * If this attribute is not set, the renderer assumes that each three contiguous positions represent a single triangle.\n\t\t * @type {Attribute | null}\n\t\t */\n\t\tthis.index = null;\n\n\t\t/**\n\t\t * Bounding box for the bufferGeometry, which can be calculated with {@link Geometry#computeBoundingBox}.\n\t\t * @type {Box3}\n\t\t * @default Box3()\n\t\t */\n\t\tthis.boundingBox = new Box3();\n\n\t\t/**\n\t\t * Bounding sphere for the bufferGeometry, which can be calculated with {@link Geometry#computeBoundingSphere}.\n\t\t * @type {Sphere}\n\t\t * @default Sphere()\n\t\t */\n\t\tthis.boundingSphere = new Sphere();\n\n\t\t/**\n\t\t * Split the geometry into groups, each of which will be rendered in a separate WebGL draw call. This allows an array of materials to be used with the geometry.\n\t\t * Each group is an object of the form: { start: Integer, count: Integer, materialIndex: Integer },\n\t\t * or { multiDrawStarts: Integer[], multiDrawCounts: Integer[], multiDrawCount: Integer, materialIndex: Integer } if multiDraw is available.\n\t\t * @type {Array}\n\t\t * @default []\n\t\t */\n\t\tthis.groups = [];\n\n\t\t/**\n\t\t * The number of instances to be rendered. If set to -1 (default), instanced rendering is disabled.\n\t\t * This property is used for instanced rendering, where multiple copies of the geometry\n\t\t * are drawn with a single draw call.\n\t\t * @type {number}\n\t\t * @default -1\n\t\t */\n\t\tthis.instanceCount = -1;\n\n\t\t/**\n\t\t * A version number, incremented every time the attribute object or index object changes to mark VAO drity.\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.version = 0;\n\t}\n\n\t/**\n\t * Adds an attribute to this geometry.\n\t * Use this rather than the attributes property.\n\t * @param {string} name\n\t * @param {Attribute} attribute\n\t */\n\taddAttribute(name, attribute) {\n\t\tthis.attributes[name] = attribute;\n\t}\n\n\t/**\n\t * Returns the attribute with the specified name.\n\t * @param {string} name\n\t * @returns {Attribute}\n\t */\n\tgetAttribute(name) {\n\t\treturn this.attributes[name];\n\t}\n\n\t/**\n\t * Removes the attribute with the specified name.\n\t * @param {string} name\n\t */\n\tremoveAttribute(name) {\n\t\tdelete this.attributes[name];\n\t}\n\n\t/**\n\t * Set the {@link Geometry#index} buffer.\n\t * @param {Array | Attribute | null} index\n\t */\n\tsetIndex(index) {\n\t\tif (Array.isArray(index)) {\n\t\t\tconst typedArray = new (arrayMax(index) > 65535 ? Uint32Array : Uint16Array)(index);\n\t\t\tthis.index = new Attribute(new Buffer(typedArray, 1));\n\t\t} else {\n\t\t\tthis.index = index;\n\t\t}\n\t}\n\n\t/**\n\t * Adds a group to this geometry; see the {@link Geometry#groups} for details.\n\t * @param {number} start\n\t * @param {number} count\n\t * @param {number} [materialIndex=0]\n\t */\n\taddGroup(start, count, materialIndex = 0) {\n\t\tthis.groups.push({\n\t\t\tstart: start,\n\t\t\tcount: count,\n\t\t\tmaterialIndex: materialIndex\n\t\t});\n\t}\n\n\t/**\n\t * Clears all groups.\n\t */\n\tclearGroups() {\n\t\tthis.groups = [];\n\t}\n\n\t/**\n\t * Computes bounding box of the geometry, updating {@link Geometry#boundingBox}.\n\t * Bounding boxes aren't computed by default. They need to be explicitly computed.\n\t */\n\tcomputeBoundingBox() {\n\t\tconst position = this.attributes['a_Position'] || this.attributes['position'];\n\n\t\tif (position) {\n\t\t\tthis.boundingBox.setFromArray(position.buffer.array, position.buffer.stride, position.offset, position.normalized);\n\t\t}\n\n\t\tconst morphAttributesPosition = this.morphAttributes.position;\n\n\t\tif (morphAttributesPosition) {\n\t\t\tfor (let i = 0; i < morphAttributesPosition.length; i++) {\n\t\t\t\tconst morphAttribute = morphAttributesPosition[i];\n\n\t\t\t\t_box3.setFromArray(morphAttribute.buffer.array, morphAttribute.buffer.stride, morphAttribute.offset, morphAttribute.normalized);\n\n\t\t\t\t_vector$1.addVectors(this.boundingBox.min, _box3.min);\n\t\t\t\tthis.boundingBox.expandByPoint(_vector$1);\n\n\t\t\t\t_vector$1.addVectors(this.boundingBox.max, _box3.max);\n\t\t\t\tthis.boundingBox.expandByPoint(_vector$1);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Computes bounding sphere of the geometry, updating {@link Geometry#boundingSphere}.\n\t * Bounding spheres aren't computed by default. They need to be explicitly computed.\n\t */\n\tcomputeBoundingSphere() {\n\t\tconst position = this.attributes['a_Position'] || this.attributes['position'];\n\t\tconst morphAttributesPosition = this.morphAttributes.position;\n\n\t\tif (!position) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst bufferStride = position.buffer.stride;\n\t\tconst positionOffset = position.offset;\n\n\t\tif (morphAttributesPosition) {\n\t\t\t_box3.setFromArray(position.buffer.array, bufferStride, positionOffset, position.normalized);\n\n\t\t\tfor (let i = 0; i < morphAttributesPosition.length; i++) {\n\t\t\t\tconst morphAttribute = morphAttributesPosition[i];\n\n\t\t\t\t_boxMorphTargets.setFromArray(morphAttribute.buffer.array, morphAttribute.buffer.stride, morphAttribute.offset, morphAttribute.normalized);\n\n\t\t\t\t_vector$1.addVectors(_box3.min, _boxMorphTargets.min);\n\t\t\t\t_box3.expandByPoint(_vector$1);\n\n\t\t\t\t_vector$1.addVectors(_box3.max, _boxMorphTargets.max);\n\t\t\t\t_box3.expandByPoint(_vector$1);\n\t\t\t}\n\n\t\t\tconst center = this.boundingSphere.center;\n\t\t\t_box3.getCenter(center);\n\n\t\t\tlet maxRadiusSq = 0;\n\n\t\t\tfor (let i = 0; i < position.buffer.count; i++) {\n\t\t\t\t_offset.fromArray(position.buffer.array, i * bufferStride + positionOffset);\n\n\t\t\t\tmaxRadiusSq = center.distanceToSquared(_offset);\n\n\t\t\t\tfor (let j = 0; j < morphAttributesPosition.length; j++) {\n\t\t\t\t\tconst morphAttribute = morphAttributesPosition[j];\n\n\t\t\t\t\t_vector$1.fromArray(morphAttribute.buffer.array, i * morphAttribute.buffer.stride + morphAttribute.offset);\n\n\t\t\t\t\t_sum.addVectors(_offset, _vector$1);\n\n\t\t\t\t\tconst offsetLengthSq = center.distanceToSquared(_sum);\n\n\t\t\t\t\t// TODO The maximum radius cannot be obtained here\n\t\t\t\t\tif (offsetLengthSq > maxRadiusSq) {\n\t\t\t\t\t\tmaxRadiusSq = offsetLengthSq;\n\t\t\t\t\t\t_offset.add(_vector$1);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis.boundingSphere.radius = Math.sqrt(maxRadiusSq);\n\t\t} else {\n\t\t\tthis.boundingSphere.setFromArray(position.buffer.array, bufferStride, positionOffset, position.normalized);\n\t\t}\n\t}\n\n\t/**\n\t * Disposes the object from memory.\n\t * You need to call this when you want the BufferGeometry removed while the application is running.\n\t */\n\tdispose() {\n\t\tthis.dispatchEvent({ type: 'dispose' });\n\t}\n\n\t/**\n\t * Copies another Geometry to this Geometry.\n\t * @param {Geometry} source - The geometry to be copied.\n\t * @returns {Geometry}\n\t */\n\tcopy(source) {\n\t\tlet name, i, l;\n\n\t\t// reset\n\n\t\tthis.index = null;\n\t\tthis.attributes = {};\n\t\tthis.morphAttributes = {};\n\t\tthis.groups = [];\n\t\tconst buffers = new WeakMap(); // used for storing cloned, shared buffers\n\n\t\t// index\n\n\t\tconst index = source.index;\n\n\t\tif (index !== null) {\n\t\t\tthis.setIndex(index.clone(buffers));\n\t\t}\n\n\t\t// attributes\n\n\t\tconst attributes = source.attributes;\n\n\t\tfor (name in attributes) {\n\t\t\tconst attribute = attributes[name];\n\t\t\tthis.addAttribute(name, attribute.clone(buffers));\n\t\t}\n\n\t\t// morph attributes\n\n\t\tconst morphAttributes = source.morphAttributes;\n\n\t\tfor (name in morphAttributes) {\n\t\t\tconst array = [];\n\t\t\tconst morphAttribute = morphAttributes[name]; // morphAttribute: array of Float32BufferAttributes\n\n\t\t\tfor (i = 0, l = morphAttribute.length; i < l; i++) {\n\t\t\t\tarray.push(morphAttribute[i].clone(buffers));\n\t\t\t}\n\n\t\t\tthis.morphAttributes[name] = array;\n\t\t}\n\n\t\t// groups\n\n\t\tconst groups = source.groups;\n\n\t\tfor (i = 0, l = groups.length; i < l; i++) {\n\t\t\tconst group = groups[i];\n\t\t\tthis.addGroup(group.start, group.count, group.materialIndex);\n\t\t}\n\n\t\t// boundings\n\t\tthis.boundingBox.copy(source.boundingBox);\n\t\tthis.boundingSphere.copy(source.boundingSphere);\n\n\t\t// instance count\n\t\tthis.instanceCount = source.instanceCount;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Creates a clone of this Geometry.\n\t * @returns {Geometry}\n\t */\n\tclone() {\n\t\treturn new Geometry().copy(this);\n\t}\n\n}\n\nfunction arrayMax(array) {\n\tif (array.length === 0) return -Infinity;\n\n\tlet max = array[0];\n\n\tfor (let i = 1, l = array.length; i < l; ++i) {\n\t\tif (array[i] > max) max = array[i];\n\t}\n\n\treturn max;\n}\n\n/**\n * A transform object for UV coordinates.\n * @extends Matrix3\n */\nclass TransformUV extends Matrix3 {\n\n\t/**\n\t * Create a new TransformUV object.\n\t */\n\tconstructor() {\n\t\tsuper();\n\n\t\tthis.offset = new Vector2(0, 0);\n\t\tthis.scale = new Vector2(1, 1);\n\t\tthis.center = new Vector2(0, 0);\n\t\tthis.rotation = 0;\n\n\t\tthis.needsUpdate = false;\n\t}\n\n\t/**\n\t * Update the matrix for UV transformation based on the offset, scale, rotation and center.\n\t * If needsUpdate is false, this method will do nothing.\n\t * @returns {TransformUV} This object.\n\t */\n\tupdate() {\n\t\tif (!this.needsUpdate) return this;\n\n\t\tthis.needsUpdate = false;\n\n\t\tthis.updateMatrix();\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Update the matrix for UV transformation based on the offset, scale, rotation and center.\n\t * This method will always update the matrix regardless of the needsUpdate flag.\n\t * @returns {TransformUV} This object.\n\t */\n\tupdateMatrix() {\n\t\treturn this.setUvTransform(\n\t\t\tthis.offset.x, this.offset.y,\n\t\t\tthis.scale.x, this.scale.y,\n\t\t\tthis.rotation,\n\t\t\tthis.center.x, this.center.y\n\t\t);\n\t}\n\n\t/**\n\t * Copy the properties of another TransformUV object.\n\t * @param {TransformUV|Matrix3} source - The object to copy the properties from.\n\t * @returns {TransformUV} This object.\n\t */\n\tcopy(source) {\n\t\tsuper.copy(source);\n\n\t\t// in case source is only a Matrix3 object (without additional properties)\n\t\tif (!source.isTransformUV) return this;\n\n\t\tthis.offset.copy(source.offset);\n\t\tthis.scale.copy(source.scale);\n\t\tthis.center.copy(source.center);\n\t\tthis.rotation = source.rotation;\n\n\t\tthis.needsUpdate = source.needsUpdate;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Clone this TransformUV object.\n\t * @returns {TransformUV} The cloned object.\n\t */\n\tclone() {\n\t\treturn new this.constructor().copy(this);\n\t}\n\n}\n\n/**\n * This flag can be used for type testing.\n * @readonly\n * @type {boolean}\n * @default true\n */\nTransformUV.prototype.isTransformUV = true;\n\nlet _materialId = 0;\n\n/**\n * Abstract base class for materials.\n * Materials describe the appearance of {@link Object3D}.\n * They are defined in a (mostly) renderer-independent way, so you don't have to rewrite materials if you decide to use a different renderer.\n * The following properties and methods are inherited by all other material types (although they may have different defaults).\n * @abstract\n * @extends EventDispatcher\n */\nclass Material extends EventDispatcher {\n\n\tconstructor() {\n\t\tsuper();\n\n\t\t/**\n\t\t * Unique number for this material instance.\n\t\t * @readonly\n\t\t * @type {number}\n\t\t */\n\t\tthis.id = _materialId++;\n\n\t\t/**\n\t\t * UUID of this material instance.\n\t\t * This gets automatically assigned, so this shouldn't be edited.\n\t\t * @type {string}\n\t\t */\n\t\tthis.uuid = MathUtils.generateUUID();\n\n\t\t/**\n\t\t * Type of the material.\n\t\t * @type {MATERIAL_TYPE}\n\t\t * @default MATERIAL_TYPE.SHADER\n\t\t */\n\t\tthis.type = MATERIAL_TYPE.SHADER;\n\n\t\t/**\n\t\t * Custom shader name. This naming can help ShaderMaterial to optimize the length of the index hash string.\n\t\t * It is valid only when the material type is MATERIAL_TYPE.SHADER.\n\t\t * Otherwise, if the material is a built-in type, the name of the shader will always be equal to the material type.\n\t\t * @type {string}\n\t\t * @default \"\"\n\t\t */\n\t\tthis.shaderName = '';\n\n\t\t/**\n\t\t * Custom defines of the shader.\n\t\t * Only valid when the material type is MATERIAL_TYPE.SHADER.\n\t\t * @type {object}\n\t\t * @default {}\n\t\t */\n\t\tthis.defines = {};\n\n\t\t/**\n\t\t * Custom uniforms of the shader.\n\t\t * Only valid when the material type is MATERIAL_TYPE.SHADER.\n\t\t * @type {object}\n\t\t * @default {}\n\t\t */\n\t\tthis.uniforms = {};\n\n\t\t/**\n\t\t * Custom GLSL code for vertex shader.\n\t\t * Only valid when the material type is MATERIAL_TYPE.SHADER.\n\t\t * @type {string}\n\t\t * @default \"\"\n\t\t */\n\t\tthis.vertexShader = '';\n\n\t\t/**\n\t\t * Custom GLSL code for fragment shader.\n\t\t * Only valid when the material type is MATERIAL_TYPE.SHADER.\n\t\t * @type {string}\n\t\t * @default \"\"\n\t\t */\n\t\tthis.fragmentShader = '';\n\n\t\t/**\n\t\t * Override the renderer's default precision for this material.\n\t\t * Can be \"highp\", \"mediump\" or \"lowp\".\n\t\t * @type {string}\n\t\t * @default null\n\t\t */\n\t\tthis.precision = null;\n\n\t\t/**\n\t\t * The bitmask of UV coordinate channels to use for the external texture.\n\t\t * This will be combined with the internal UV coordinate mask collected from the renderer by default.\n\t\t * Finally, it will be used to determine which UV coordinate attribute to use and to generate the shader code.\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.extUvCoordMask = 0;\n\n\t\t/**\n\t\t * Defines whether this material is transparent.\n\t\t * This has an effect on rendering as transparent objects need special treatment and are rendered after non-transparent objects.\n\t\t * When set to true, the extent to which the material is transparent is controlled by setting it's blending property.\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.transparent = false;\n\n\t\t/**\n\t\t * Which blending to use when displaying objects with this material.\n\t\t * This must be set to BLEND_TYPE.CUSTOM to use custom blendSrc, blendDst or blendEquation.\n\t\t * @type {BLEND_TYPE}\n\t\t * @default BLEND_TYPE.NORMAL\n\t\t */\n\t\tthis.blending = BLEND_TYPE.NORMAL;\n\n\t\t/**\n\t\t * Blending source.\n\t\t * The {@link Material#blending} must be set to BLEND_TYPE.CUSTOM for this to have any effect.\n\t\t * @type {BLEND_FACTOR}\n\t\t * @default BLEND_FACTOR.SRC_ALPHA\n\t\t */\n\t\tthis.blendSrc = BLEND_FACTOR.SRC_ALPHA;\n\n\t\t/**\n\t\t * Blending destination.\n\t\t * The {@link Material#blending} must be set to BLEND_TYPE.CUSTOM for this to have any effect.\n\t\t * @type {BLEND_FACTOR}\n\t\t * @default BLEND_FACTOR.ONE_MINUS_SRC_ALPHA\n\t\t */\n\t\tthis.blendDst = BLEND_FACTOR.ONE_MINUS_SRC_ALPHA;\n\n\t\t/**\n\t\t * Blending equation to use when applying blending.\n\t\t * The {@link Material#blending} must be set to BLEND_TYPE.CUSTOM for this to have any effect.\n\t\t * @type {BLEND_EQUATION}\n\t\t * @default BLEND_EQUATION.ADD\n\t\t */\n\t\tthis.blendEquation = BLEND_EQUATION.ADD;\n\n\t\t/**\n\t\t * The transparency of the {@link Material#blendSrc}.\n\t\t * The {@link Material#blending} must be set to BLEND_TYPE.CUSTOM for this to have any effect.\n\t\t * @type {BLEND_FACTOR}\n\t\t * @default null\n\t\t */\n\t\tthis.blendSrcAlpha = null;\n\n\t\t/**\n\t\t * The transparency of the {@link Material#blendDst}.\n\t\t * The {@link Material#blending} must be set to BLEND_TYPE.CUSTOM for this to have any effect.\n\t\t * @type {BLEND_FACTOR}\n\t\t * @default null\n\t\t */\n\t\tthis.blendDstAlpha = null;\n\n\t\t/**\n\t\t * The tranparency of the {@link Material#blendEquation}.\n\t\t * The {@link Material#blending} must be set to BLEND_TYPE.CUSTOM for this to have any effect.\n\t\t * @type {BLEND_EQUATION}\n\t\t * @default null\n\t\t */\n\t\tthis.blendEquationAlpha = null;\n\n\t\t/**\n\t\t * Whether to premultiply the alpha (transparency) value.\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.premultipliedAlpha = false;\n\n\t\t/**\n\t\t * Defines whether vertex coloring is used.\n\t\t * @type {VERTEX_COLOR}\n\t\t * @default VERTEX_COLOR.NONE\n\t\t */\n\t\tthis.vertexColors = VERTEX_COLOR.NONE;\n\n\t\t/**\n\t\t * Defines whether precomputed vertex tangents, which must be provided in a vec4 \"tangent\" attribute, are used.\n\t\t * When disabled, tangents are derived automatically.\n\t\t * Using precomputed tangents will give more accurate normal map details in some cases, such as with mirrored UVs.\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.vertexTangents = false;\n\n\t\t/**\n\t\t * Float in the range of 0.0 - 1.0 indicating how transparent the material is.\n\t\t * A value of 0.0 indicates fully transparent, 1.0 is fully opaque.\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.opacity = 1;\n\n\t\t/**\n\t\t * The diffuse color.\n\t\t * @type {Color3}\n\t\t * @default Color3(0xffffff)\n\t\t */\n\t\tthis.diffuse = new Color3(0xffffff);\n\n\t\t/**\n\t\t * The diffuse map.\n\t\t * @type {Texture2D}\n\t\t * @default null\n\t\t */\n\t\tthis.diffuseMap = null;\n\n\t\t/**\n\t\t * Define the UV chanel for the diffuse map to use starting from 0 and defaulting to 0.\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.diffuseMapCoord = 0;\n\n\t\t/**\n\t\t * The uv-transform matrix of diffuse map.\n\t\t * This will also affect other maps that cannot be individually specified uv transform, such as normalMap, bumpMap, etc.\n\t\t * @type {TransformUV}\n\t\t * @default TransformUV()\n\t\t */\n\t\tthis.diffuseMapTransform = new TransformUV();\n\n\t\t/**\n\t\t * The alpha map.\n\t\t * @type {Texture2D}\n\t\t * @default null\n\t\t */\n\t\tthis.alphaMap = null;\n\n\t\t/**\n\t\t * Define the UV chanel for the alpha map to use starting from 0 and defaulting to 0.\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.alphaMapCoord = 0;\n\n\t\t/**\n\t\t * The uv-transform matrix of alpha map.\n\t\t * @type {TransformUV}\n\t\t * @default TransformUV()\n\t\t */\n\t\tthis.alphaMapTransform = new TransformUV();\n\n\t\t/**\n\t\t * Emissive (light) color of the material, essentially a solid color unaffected by other lighting.\n\t\t * @type {Color3}\n\t\t * @default Color3(0x000000)\n\t\t */\n\t\tthis.emissive = new Color3(0x000000);\n\n\t\t/**\n\t\t * Set emissive (glow) map.\n\t\t * The emissive map color is modulated by the emissive color.\n\t\t * If you have an emissive map, be sure to set the emissive color to something other than black.\n\t\t * @type {Texture2D}\n\t\t * @default null\n\t\t */\n\t\tthis.emissiveMap = null;\n\n\t\t/**\n\t\t * Define the UV chanel for the emissive map to use starting from 0 and defaulting to 0.\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.emissiveMapCoord = 0;\n\n\t\t/**\n\t\t * The uv-transform matrix of emissive map.\n\t\t * @type {TransformUV}\n\t\t * @default TransformUV()\n\t\t */\n\t\tthis.emissiveMapTransform = new TransformUV();\n\n\t\t/**\n\t\t * The red channel of this texture is used as the ambient occlusion map.\n\t\t * @type {Texture2D}\n\t\t * @default null\n\t\t */\n\t\tthis.aoMap = null;\n\n\t\t/**\n\t\t * Intensity of the ambient occlusion effect.\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.aoMapIntensity = 1.0;\n\n\t\t/**\n\t\t * Define the UV chanel for the ao map to use starting from 0 and defaulting to 0.\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.aoMapCoord = 0;\n\n\t\t/**\n\t\t * The uv-transform matrix of ao map.\n\t\t * @type {TransformUV}\n\t\t * @default TransformUV()\n\t\t */\n\t\tthis.aoMapTransform = new TransformUV();\n\n\t\t/**\n\t\t * The normal map.\n\t\t * @type {Texture2D}\n\t\t * @default null\n\t\t */\n\t\tthis.normalMap = null;\n\n\t\t/**\n\t\t * How much the normal map affects the material. Typical ranges are 0-1.\n\t\t * @type {Vector2}\n\t\t * @default Vector2(1,1)\n\t\t */\n\t\tthis.normalScale = new Vector2(1, 1);\n\n\t\t/**\n\t\t * The texture to create a bump map.\n\t\t * The black and white values map to the perceived depth in relation to the lights. Bump doesn't actually affect the geometry of the object, only the lighting.\n\t\t * @type {Texture2D}\n\t\t * @default null\n\t\t */\n\t\tthis.bumpMap = null;\n\n\t\t/**\n\t\t * How much the bump map affects the material.\n\t\t * Typical ranges are 0-1.\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.bumpScale = 1;\n\n\t\t/**\n\t\t * The environment map.\n\t\t * If set to undefined, then the material will not inherit envMap from scene.environment.\n\t\t * @type {TextureCube|null|undefined}\n\t\t * @default null\n\t\t */\n\t\tthis.envMap = null;\n\n\t\t/**\n\t\t * Scales the effect of the environment map by multiplying its color.\n\t\t * This can effect both the diffuse and specular components of environment map.\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.envMapIntensity = 1;\n\n\t\t/**\n\t\t * How to combine the result of the surface's color with the environment map, if any.\n\t\t * This has no effect in a {@link PBRMaterial}.\n\t\t * @type {ENVMAP_COMBINE_TYPE}\n\t\t * @default ENVMAP_COMBINE_TYPE.MULTIPLY\n\t\t */\n\t\tthis.envMapCombine = ENVMAP_COMBINE_TYPE.MULTIPLY;\n\n\t\t/**\n\t\t * Which depth function to use. See the {@link COMPARE_FUNC} constants for all possible values.\n\t\t * @type {COMPARE_FUNC}\n\t\t * @default COMPARE_FUNC.LEQUAL\n\t\t */\n\t\tthis.depthFunc = COMPARE_FUNC.LEQUAL;\n\n\t\t/**\n\t\t * Whether to have depth test enabled when rendering this material.\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.depthTest = true;\n\n\t\t/**\n\t\t * Whether rendering this material has any effect on the depth buffer.\n\t\t * When drawing 2D overlays it can be useful to disable the depth writing in order to layer several things together without creating z-index artifacts.\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.depthWrite = true;\n\n\t\t/**\n\t\t * Whether to render the material's color.\n\t\t * This can be used in conjunction with a mesh's renderOrder property to create invisible objects that occlude other objects.\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.colorWrite = true;\n\n\t\t/**\n\t\t * Whether stencil operations are performed against the stencil buffer.\n\t\t * In order to perform writes or comparisons against the stencil buffer this value must be true.\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.stencilTest = false;\n\n\t\t/**\n\t\t * The bit mask to use when writing to the stencil buffer.\n\t\t * @type {number}\n\t\t * @default 0xFF\n\t\t */\n\t\tthis.stencilWriteMask = 0xff;\n\n\t\t/**\n\t\t * The stencil comparison function to use.\n\t\t * See the {@link COMPARE_FUNC} constants for all possible values.\n\t\t * @type {COMPARE_FUNC}\n\t\t * @default COMPARE_FUNC.ALWAYS\n\t\t */\n\t\tthis.stencilFunc = COMPARE_FUNC.ALWAYS;\n\n\t\t/**\n\t\t * The value to use when performing stencil comparisons or stencil operations.\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.stencilRef = 0;\n\n\t\t/**\n\t\t * The bit mask to use when comparing against the stencil buffer.\n\t\t * @type {number}\n\t\t * @default 0xFF\n\t\t */\n\t\tthis.stencilFuncMask = 0xff;\n\n\t\t/**\n\t\t * Which stencil operation to perform when the comparison function returns false.\n\t\t * See the {@link OPERATION} constants for all possible values.\n\t\t * @type {OPERATION}\n\t\t * @default OPERATION.KEEP\n\t\t */\n\t\tthis.stencilFail = OPERATION.KEEP;\n\n\t\t/**\n\t\t * Which stencil operation to perform when the comparison function returns true but the depth test fails.\n\t\t * See the {@link OPERATION} constants for all possible values.\n\t\t * @type {OPERATION}\n\t\t * @default OPERATION.KEEP\n\t\t */\n\t\tthis.stencilZFail = OPERATION.KEEP;\n\n\t\t/**\n\t\t * Which stencil operation to perform when the comparison function returns true and the depth test passes.\n\t\t * See the {@link OPERATION} constants for all possible values.\n\t\t * @type {OPERATION}\n\t\t * @default OPERATION.KEEP\n\t\t */\n\t\tthis.stencilZPass = OPERATION.KEEP;\n\n\t\t/**\n\t\t * The stencil comparison function to use.\n\t\t * See the {@link COMPARE_FUNC} constants for all possible values.\n\t\t * You can explicitly specify the two-sided stencil function state by defining stencilFuncBack, stencilRefBack and stencilFuncMaskBack.\n\t\t * @type {COMPARE_FUNC|null}\n\t\t * @default null\n\t\t */\n\t\tthis.stencilFuncBack = null;\n\n\t\t/**\n\t\t * The value to use when performing stencil comparisons or stencil operations.\n\t\t * You can explicitly specify the two-sided stencil function state by defining stencilFuncBack, stencilRefBack and stencilFuncMaskBack.\n\t\t * @type {number | null}\n\t\t * @default null\n\t\t */\n\t\tthis.stencilRefBack = null;\n\n\t\t/**\n\t\t * The bit mask to use when comparing against the stencil buffer.\n\t\t * You can explicitly specify the two-sided stencil function state by defining stencilFuncBack, stencilRefBack and stencilFuncMaskBack.\n\t\t * @type {number | null}\n\t\t * @default null\n\t\t */\n\t\tthis.stencilFuncMaskBack = null;\n\n\t\t/**\n\t\t * Which stencil operation to perform when the comparison function returns false.\n\t\t * See the {@link OPERATION} constants for all possible values.\n\t\t * You can explicitly specify the two-sided stencil op state by defining stencilFailBack, stencilZFailBack and stencilZPassBack.\n\t\t * @type {OPERATION|null}\n\t\t * @default null\n\t\t */\n\t\tthis.stencilFailBack = null;\n\n\t\t/**\n\t\t * Which stencil operation to perform when the comparison function returns true but the depth test fails.\n\t\t * See the {@link OPERATION} constants for all possible values.\n\t\t * You can explicitly specify the two-sided stencil op state by defining stencilFailBack, stencilZFailBack and stencilZPassBack.\n\t\t * @type {OPERATION|null}\n\t\t * @default null\n\t\t */\n\t\tthis.stencilZFailBack = null;\n\n\t\t/**\n\t\t * Which stencil operation to perform when the comparison function returns true and the depth test passes.\n\t\t * See the {@link OPERATION} constants for all possible values.\n\t\t * You can explicitly specify the two-sided stencil op state by defining stencilFailBack, stencilZFailBack and stencilZPassBack.\n\t\t * @type {OPERATION|null}\n\t\t * @default null\n\t\t */\n\t\tthis.stencilZPassBack = null;\n\n\t\t/**\n\t\t * User-defined clipping planes specified as Plane objects in world space.\n\t\t * These planes apply to the objects this material is attached to.\n\t\t * Points in space whose signed distance to the plane is negative are clipped (not rendered).\n\t\t * @type {Plane[]}\n\t\t * @default null\n\t\t */\n\t\tthis.clippingPlanes = null;\n\n\t\t/**\n\t\t * Sets the alpha value to be used when running an alpha test.\n\t\t * The material will not be renderered if the opacity is lower than this value.\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.alphaTest = 0;\n\n\t\t/**\n\t\t * Enables alpha to coverage.\n\t\t * Can only be used when MSAA is enabled.\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.alphaToCoverage = false;\n\n\t\t/**\n\t\t * Defines which side of faces will be rendered - front, back or double.\n\t\t * @type {DRAW_SIDE}\n\t\t * @default DRAW_SIDE.FRONT\n\t\t */\n\t\tthis.side = DRAW_SIDE.FRONT;\n\n\t\t/**\n\t\t * Whether to use polygon offset.\n\t\t * This corresponds to the GL_POLYGON_OFFSET_FILL WebGL feature.\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.polygonOffset = false;\n\n\t\t/**\n\t\t * Sets the polygon offset factor.\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.polygonOffsetFactor = 0;\n\n\t\t/**\n\t\t * Sets the polygon offset units.\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.polygonOffsetUnits = 0;\n\n\t\t/**\n\t\t * Define whether the material is rendered with flat shading or smooth shading.\n\t\t * @type {SHADING_TYPE}\n\t\t * @default SHADING_TYPE.SMOOTH_SHADING\n\t\t */\n\t\tthis.shading = SHADING_TYPE.SMOOTH_SHADING;\n\n\t\t/**\n\t\t * Whether to apply dithering to the color to remove the appearance of banding.\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.dithering = false;\n\n\t\t/**\n\t\t * Whether the material is affected by lights.\n\t\t * If set true, renderer will try to upload light uniforms.\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.acceptLight = false;\n\n\t\t/**\n\t\t * The lighting group of the material.\n\t\t * Used in conjunction with {@link Light#groupMask}.\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.lightingGroup = 0;\n\n\t\t/**\n\t\t * Whether the material is affected by fog.\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.fog = true;\n\n\t\t/**\n\t\t * Determines how the mesh triangles are constructed from the vertices.\n\t\t * @type {DRAW_MODE}\n\t\t * @default DRAW_MODE.TRIANGLES\n\t\t */\n\t\tthis.drawMode = DRAW_MODE.TRIANGLES;\n\n\t\t/**\n\t\t * Whether the material uniforms need to be updated every draw call.\n\t\t * If set false, the material uniforms are only updated once per frame , this can help optimize performance.\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.forceUpdateUniforms = true;\n\n\t\t/**\n\t\t * Specifies that the material needs to be recompiled.\n\t\t * This property is automatically set to true when instancing a new material.\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.needsUpdate = true;\n\t}\n\n\t/**\n\t * Copy the parameters from the passed material into this material.\n\t * @param {Material} source - The material to be copied.\n\t * @returns {Material}\n\t */\n\tcopy(source) {\n\t\tthis.shaderName = source.shaderName;\n\t\tthis.defines = Object.assign({}, source.defines);\n\t\tthis.uniforms = cloneUniforms(source.uniforms);\n\t\tthis.vertexShader = source.vertexShader;\n\t\tthis.fragmentShader = source.fragmentShader;\n\n\t\tthis.precision = source.precision;\n\t\tthis.extUvCoordMask = source.extUvCoordMask;\n\n\t\tthis.transparent = source.transparent;\n\t\tthis.blending = source.blending;\n\t\tthis.blendSrc = source.blendSrc;\n\t\tthis.blendDst = source.blendDst;\n\t\tthis.blendEquation = source.blendEquation;\n\t\tthis.blendSrcAlpha = source.blendSrcAlpha;\n\t\tthis.blendDstAlpha = source.blendDstAlpha;\n\t\tthis.blendEquationAlpha = source.blendEquationAlpha;\n\t\tthis.premultipliedAlpha = source.premultipliedAlpha;\n\t\tthis.vertexColors = source.vertexColors;\n\t\tthis.vertexTangents = source.vertexTangents;\n\n\t\tthis.opacity = source.opacity;\n\t\tthis.diffuse.copy(source.diffuse);\n\t\tthis.diffuseMap = source.diffuseMap;\n\t\tthis.diffuseMapCoord = source.diffuseMapCoord;\n\t\tthis.diffuseMapTransform.copy(source.diffuseMapTransform);\n\t\tthis.alphaMap = source.alphaMap;\n\t\tthis.alphaMapCoord = source.alphaMapCoord;\n\t\tthis.alphaMapTransform.copy(source.alphaMapTransform);\n\t\tthis.emissive.copy(source.emissive);\n\t\tthis.emissiveMap = source.emissiveMap;\n\t\tthis.emissiveMapCoord = source.emissiveMapCoord;\n\t\tthis.emissiveMapTransform.copy(source.emissiveMapTransform);\n\t\tthis.aoMap = source.aoMap;\n\t\tthis.aoMapIntensity = source.aoMapIntensity;\n\t\tthis.aoMapCoord = source.aoMapCoord;\n\t\tthis.aoMapTransform.copy(source.aoMapTransform);\n\t\tthis.normalMap = source.normalMap;\n\t\tthis.normalScale.copy(source.normalScale);\n\t\tthis.bumpMap = source.bumpMap;\n\t\tthis.bumpScale = source.bumpScale;\n\t\tthis.envMap = source.envMap;\n\t\tthis.envMapIntensity = source.envMapIntensity;\n\t\tthis.envMapCombine = source.envMapCombine;\n\n\t\tthis.depthFunc = source.depthFunc;\n\t\tthis.depthTest = source.depthTest;\n\t\tthis.depthWrite = source.depthWrite;\n\t\tthis.colorWrite = source.colorWrite;\n\n\t\tthis.stencilTest = source.stencilTest;\n\t\tthis.stencilWriteMask = source.stencilWriteMask;\n\n\t\tthis.stencilFunc = source.stencilFunc;\n\t\tthis.stencilRef = source.stencilRef;\n\t\tthis.stencilFuncMask = source.stencilFuncMask;\n\t\tthis.stencilFail = source.stencilFail;\n\t\tthis.stencilZFail = source.stencilZFail;\n\t\tthis.stencilZPass = source.stencilZPass;\n\n\t\tthis.stencilFuncBack = source.stencilFuncBack;\n\t\tthis.stencilRefBack = source.stencilRefBack;\n\t\tthis.stencilFuncMaskBack = source.stencilFuncMaskBack;\n\t\tthis.stencilFailBack = source.stencilFailBack;\n\t\tthis.stencilZFailBack = source.stencilZFailBack;\n\t\tthis.stencilZPassBack = source.stencilZPassBack;\n\n\t\tthis.clippingPlanes = source.clippingPlanes;\n\n\t\tthis.alphaTest = source.alphaTest;\n\t\tthis.alphaToCoverage = source.alphaToCoverage;\n\t\tthis.side = source.side;\n\t\tthis.polygonOffset = source.polygonOffset;\n\t\tthis.polygonOffsetFactor = source.polygonOffsetFactor;\n\t\tthis.polygonOffsetUnits = source.polygonOffsetUnits;\n\t\tthis.shading = source.shading;\n\t\tthis.dithering = source.dithering;\n\t\tthis.acceptLight = source.acceptLight;\n\t\tthis.lightingGroup = source.lightingGroup;\n\t\tthis.fog = source.fog;\n\t\tthis.drawMode = source.drawMode;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Return a new material with the same parameters as this material.\n\t * @returns {Material}\n\t */\n\tclone() {\n\t\treturn new this.constructor().copy(this);\n\t}\n\n\t/**\n\t * This disposes the material.\n\t * Textures of a material don't get disposed. These needs to be disposed by Texture.\n\t */\n\tdispose() {\n\t\tthis.dispatchEvent({ type: 'dispose' });\n\t}\n\n}\n\n/**\n * A material rendered with custom shaders.\n * A shader is a small program written in GLSL that runs on the GPU.\n * @extends Material\n */\nclass ShaderMaterial extends Material {\n\n\t/**\n\t * @param {object} shader - Shader object for the shader material.\n\t * @param {string} shader.name - Name of the shader.\n\t * @param {object} shader.defines - Defines of the shader.\n\t * @param {object} shader.uniforms - Uniforms of the shader.\n\t * @param {string} shader.vertexShader - Vertex shader GLSL code.\n\t * @param {string} shader.fragmentShader - Fragment shader GLSL code.\n\t */\n\tconstructor(shader) {\n\t\tsuper();\n\n\t\t// Set values\n\t\tif (shader) {\n\t\t\tthis.shaderName = shader.name;\n\t\t\tObject.assign(this.defines, shader.defines);\n\t\t\tthis.uniforms = cloneUniforms(shader.uniforms);\n\t\t\tthis.vertexShader = shader.vertexShader;\n\t\t\tthis.fragmentShader = shader.fragmentShader;\n\t\t}\n\t}\n\n}\n\n/**\n * Shader post pass.\n */\nclass ShaderPostPass {\n\n\t/**\n\t * @param {object} shader - Shader object for the shader material.\n\t * @param {string} shader.name - Name of the shader.\n\t * @param {object} shader.defines - Defines of the shader.\n\t * @param {object} shader.uniforms - Uniforms of the shader.\n\t * @param {string} shader.vertexShader - Vertex shader GLSL code.\n\t * @param {string} shader.fragmentShader - Fragment shader GLSL code.\n\t */\n\tconstructor(shader) {\n\t\tconst scene = new Scene();\n\n\t\tconst camera = this.camera = new Camera();\n\t\tcamera.frustumCulled = false;\n\t\tcamera.position.set(0, 0, 1);\n\t\tcamera.lookAt(new Vector3(0, 0, 0), new Vector3(0, 1, 0));\n\t\tcamera.setOrtho(-1, 1, -1, 1, 0.1, 2);\n\t\tscene.add(camera);\n\n\t\tconst geometry = this.geometry = new Geometry(); // fullscreen triangle\n\t\tgeometry.addAttribute('a_Position', new Attribute(new Buffer(new Float32Array([-1, 3, 0, -1, -1, 0, 3, -1, 0]), 3)));\n\t\tgeometry.addAttribute('a_Uv', new Attribute(new Buffer(new Float32Array([0, 2, 0, 0, 2, 0]), 2)));\n\n\t\tconst material = this.material = new ShaderMaterial(shader);\n\t\tthis.uniforms = material.uniforms;\n\n\t\tconst plane = new Mesh(geometry, material);\n\t\tplane.frustumCulled = false;\n\t\tscene.add(plane);\n\n\t\t// static scene\n\n\t\tscene.updateMatrix();\n\n\t\tthis.renderStates = scene.updateRenderStates(camera);\n\n\t\tconst renderQueue = scene.updateRenderQueue(camera, false, false);\n\t\tthis.renderQueueLayer = renderQueue.layerList[0];\n\n\t\tthis.renderConfig = {};\n\t}\n\n\t/**\n\t * Render the post pass.\n\t * @param {ThinRenderer} renderer - The renderer.\n\t * @param {RenderTarget} renderTarget - The render target.\n\t */\n\trender(renderer, renderTarget) {\n\t\trenderer.beginRender(renderTarget);\n\t\trenderer.renderRenderableList(this.renderQueueLayer.opaque, this.renderStates, this.renderConfig);\n\t\trenderer.endRender();\n\t}\n\n\t/**\n\t * Dispose the post pass.\n\t */\n\tdispose() {\n\t\tthis.geometry.dispose();\n\t\tthis.material.dispose();\n\t}\n\n}\n\n/**\n * A material for drawing geometry by depth.\n * Depth is based off of the camera near and far plane. White is nearest, black is farthest.\n * @extends Material\n */\nclass DepthMaterial extends Material {\n\n\t/**\n\t * Create a DepthMaterial.\n\t */\n\tconstructor() {\n\t\tsuper();\n\n\t\tthis.type = MATERIAL_TYPE.DEPTH;\n\n\t\t/**\n\t\t * Encoding for depth packing.\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.packToRGBA = false;\n\t}\n\n}\n\n/**\n * A material for drawing geometry by distance.\n * @extends Material\n */\nclass DistanceMaterial extends Material {\n\n\t/**\n\t * Create a DistanceMaterial.\n\t */\n\tconstructor() {\n\t\tsuper();\n\n\t\tthis.type = MATERIAL_TYPE.DISTANCE;\n\t}\n\n}\n\n/**\n * Shadow map pass.\n */\nclass ShadowMapPass {\n\n\tconstructor() {\n\t\t/**\n\t\t * Get depth material function.\n\t\t * Override this to use custom depth material.\n\t\t * @type {Function}\n\t\t */\n\t\tthis.getDepthMaterial = _getDepthMaterial;\n\n\t\t/**\n\t\t * Get distance material function.\n\t\t * Override this to use custom distance material.\n\t\t * @type {Function}\n\t\t */\n\t\tthis.getDistanceMaterial = _getDistanceMaterial;\n\n\t\t/**\n\t\t * Define which render layers will produce shadows.\n\t\t * If the value is Null, it means that all render layers will produce shadows.\n\t\t * @type {null | Array}\n\t\t * @default null\n\t\t */\n\t\tthis.shadowLayers = null;\n\n\t\t/**\n\t\t * Whether transparent objects can cast shadows.\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.transparentShadow = false;\n\n\t\tconst state = { isPointLight: false, light: null };\n\t\tthis._state = state;\n\n\t\tconst that = this;\n\t\tthis._renderOptions = {\n\t\t\tgetGeometry: null,\n\t\t\tgetMaterial: function(renderable) {\n\t\t\t\treturn state.isPointLight ? that.getDistanceMaterial(renderable, state.light) : that.getDepthMaterial(renderable, state.light);\n\t\t\t},\n\t\t\tifRender: function(renderable) {\n\t\t\t\treturn (state.light.groupMask & (1 << renderable.material.lightingGroup)) && renderable.object.castShadow;\n\t\t\t}\n\t\t};\n\t}\n\n\t/**\n\t * Get geometry function for shadow render options.\n\t * @type {null | Function}\n\t */\n\tset getGeometry(func) {\n\t\tif (func) {\n\t\t\tthis._renderOptions.getGeometry = func;\n\t\t} else {\n\t\t\tdelete this._renderOptions.getGeometry;\n\t\t}\n\t}\n\tget getGeometry() {\n\t\treturn this._renderOptions.getGeometry;\n\t}\n\n\t/**\n\t * The if render function for shadow render options.\n\t * @type {Function}\n\t */\n\tset ifRender(func) {\n\t\tif (func) {\n\t\t\tthis._renderOptions.ifRender = func;\n\t\t} else {\n\t\t\tdelete this._renderOptions.ifRender;\n\t\t}\n\t}\n\tget ifRender() {\n\t\treturn this._renderOptions.ifRender;\n\t}\n\n\t/**\n\t * Render shadow map.\n\t * @param {ThinRenderer} renderer\n\t * @param {Scene} scene\n\t */\n\trender(renderer, scene) {\n\t\t// @deprecated\n\t\t// This can be deleted when renderer.setClearColor is completely removed.\n\t\toldClearColor.copy(renderer.getClearColor());\n\n\t\tconst lightingData = scene.collector.lightingData;\n\t\tconst lightsArray = lightingData.lightsArray;\n\t\tconst shadowsNum = lightingData.shadowsNum;\n\n\t\tfor (let i = 0; i < shadowsNum; i++) {\n\t\t\tconst light = lightsArray[i];\n\t\t\tconst shadow = light.shadow;\n\n\t\t\tif (shadow.autoUpdate === false && shadow.needsUpdate === false) continue;\n\n\t\t\tconst camera = shadow.camera;\n\t\t\tconst shadowTarget = shadow.renderTarget;\n\t\t\tconst isPointLight = light.isPointLight;\n\t\t\tconst faces = isPointLight ? 6 : 1;\n\n\t\t\tthis._state.isPointLight = isPointLight;\n\t\t\tthis._state.light = light;\n\t\t\tconst renderOptions = this._renderOptions;\n\n\t\t\tshadow.prepareDepthMap(!scene.disableShadowSampler, renderer.capabilities);\n\n\t\t\tfor (let j = 0; j < faces; j++) {\n\t\t\t\tif (isPointLight) {\n\t\t\t\t\tshadow.update(light, j);\n\t\t\t\t\tshadowTarget.activeLayer = j;\n\t\t\t\t}\n\n\t\t\t\tshadowTarget\n\t\t\t\t\t.setColorClearValue(1, 1, 1, 1)\n\t\t\t\t\t.setClear(true, true, false);\n\n\t\t\t\tconst renderStates = scene.updateRenderStates(camera, j === 0);\n\t\t\t\tconst renderQueue = scene.updateRenderQueue(camera, false, false);\n\n\t\t\t\trenderer.beginRender(shadowTarget);\n\n\t\t\t\tfor (let k = 0; k < renderQueue.layerList.length; k++) {\n\t\t\t\t\tconst renderQueueLayer = renderQueue.layerList[k];\n\n\t\t\t\t\tif (this.shadowLayers !== null && this.shadowLayers.indexOf(renderQueueLayer.id) === -1) continue;\n\n\t\t\t\t\trenderer.renderRenderableList(renderQueueLayer.opaque, renderStates, renderOptions);\n\n\t\t\t\t\tif (this.transparentShadow) {\n\t\t\t\t\t\trenderer.renderRenderableList(renderQueueLayer.transparent, renderStates, renderOptions);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\trenderer.endRender();\n\t\t\t}\n\n\t\t\tshadow.needsUpdate = false;\n\t\t}\n\n\t\t// @deprecated\n\t\t// This can be deleted when renderer.setClearColor is completely removed.\n\t\trenderer.setClearColor(oldClearColor.x, oldClearColor.y, oldClearColor.z, oldClearColor.w);\n\t}\n\n}\n\nconst oldClearColor = new Vector4();\n\nconst shadowSide = { 'front': DRAW_SIDE.BACK, 'back': DRAW_SIDE.FRONT, 'double': DRAW_SIDE.DOUBLE };\n\nconst depthMaterials = {};\nconst distanceMaterials = {};\n\nfunction _getDepthMaterial(renderable, light) {\n\tconst useSkinning = !!renderable.object.skeleton;\n\tconst useMorphing = renderable.geometry.morphAttributes.position && renderable.geometry.morphAttributes.position.length > 0;\n\n\tconst clippingPlanes = renderable.material.clippingPlanes;\n\tconst numClippingPlanes = (clippingPlanes && clippingPlanes.length > 0) ? clippingPlanes.length : 0;\n\n\tconst index = useMorphing << 0 | useSkinning << 1;\n\n\tlet materials = depthMaterials[index];\n\n\tif (materials === undefined) {\n\t\tmaterials = {};\n\t\tdepthMaterials[index] = materials;\n\t}\n\n\tlet material = materials[numClippingPlanes];\n\n\tif (material === undefined) {\n\t\tmaterial = new DepthMaterial();\n\t\tmaterial.packToRGBA = true;\n\n\t\tmaterials[numClippingPlanes] = material;\n\t}\n\n\tmaterial.side = shadowSide[renderable.material.side];\n\tmaterial.clippingPlanes = renderable.material.clippingPlanes;\n\tmaterial.drawMode = renderable.material.drawMode;\n\n\treturn material;\n}\n\nfunction _getDistanceMaterial(renderable, light) {\n\tconst useSkinning = !!renderable.object.skeleton;\n\tconst useMorphing = renderable.geometry.morphAttributes.position && renderable.geometry.morphAttributes.position.length > 0;\n\n\tconst clippingPlanes = renderable.material.clippingPlanes;\n\tconst numClippingPlanes = (clippingPlanes && clippingPlanes.length > 0) ? clippingPlanes.length : 0;\n\n\tconst index = useMorphing << 0 | useSkinning << 1;\n\n\tlet materials = distanceMaterials[index];\n\n\tif (materials === undefined) {\n\t\tmaterials = {};\n\t\tdistanceMaterials[index] = materials;\n\t}\n\n\tlet material = materials[numClippingPlanes];\n\n\tif (material === undefined) {\n\t\tmaterial = new DistanceMaterial();\n\n\t\tmaterials[numClippingPlanes] = material;\n\t}\n\n\tmaterial.side = shadowSide[renderable.material.side];\n\tmaterial.uniforms['nearDistance'] = light.shadow.cameraNear;\n\tmaterial.uniforms['farDistance'] = light.shadow.cameraFar;\n\n\tmaterial.clippingPlanes = renderable.material.clippingPlanes;\n\tmaterial.drawMode = renderable.material.drawMode;\n\n\treturn material;\n}\n\n/**\n * PropertyMap is a helper class for storing properties on objects.\n * Instead of using a Map, we store the property map directly on the object itself,\n * which provides better lookup performance.\n * This is generally used to store the gpu resources corresponding to objects.\n */\nclass PropertyMap {\n\n\t/**\n\t * Create a new PropertyMap.\n\t * @param {string} prefix - The prefix of the properties name.\n\t */\n\tconstructor(prefix) {\n\t\tthis._key = prefix + '$';\n\t\tthis._count = 0;\n\t}\n\n\t/**\n\t * Get the properties of the object.\n\t * If the object does not have properties, create a new one.\n\t * @param {object} object - The object to get properties.\n\t * @returns {object} - The properties of the object.\n\t */\n\tget(object) {\n\t\tconst key = this._key;\n\t\tlet properties = object[key];\n\t\tif (properties === undefined) {\n\t\t\tproperties = {};\n\t\t\tobject[key] = properties;\n\t\t\tthis._count++;\n\t\t}\n\t\treturn properties;\n\t}\n\n\t/**\n\t * Delete the properties of the object.\n\t * @param {object} object - The object to delete properties.\n\t */\n\tdelete(object) {\n\t\tconst key = this._key;\n\t\tconst properties = object[key];\n\t\tif (properties) {\n\t\t\tthis._count--;\n\t\t\tdelete object[key];\n\t\t}\n\t}\n\n\t/**\n\t * Get the number of objects that have properties.\n\t * @returns {number} - The number of objects that have properties.\n\t */\n\tsize() {\n\t\treturn this._count;\n\t}\n\n}\n\n/**\n * Render info collector.\n * If you want to collect information about the rendering of this frame,\n * pass an instance of RenderInfo to RenderOption when calling renderRenderableList.\n */\nclass RenderInfo {\n\n\tconstructor() {\n\t\tconst render = {\n\t\t\tcalls: 0,\n\t\t\ttriangles: 0,\n\t\t\tlines: 0,\n\t\t\tpoints: 0\n\t\t};\n\n\t\t// A series of function use for collect information.\n\t\tconst updateFuncs = [\n\t\t\tfunction updatePoints(instanceCount, count) {\n\t\t\t\trender.points += instanceCount * count;\n\t\t\t},\n\t\t\tfunction updateLines(instanceCount, count) {\n\t\t\t\trender.lines += instanceCount * (count / 2);\n\t\t\t},\n\t\t\tfunction updateLineLoop(instanceCount, count) {\n\t\t\t\trender.lines += instanceCount * count;\n\t\t\t},\n\t\t\tfunction updateLineStrip(instanceCount, count) {\n\t\t\t\trender.lines += instanceCount * (count - 1);\n\t\t\t},\n\t\t\tfunction updateTriangles(instanceCount, count) {\n\t\t\t\trender.triangles += instanceCount * (count / 3);\n\t\t\t},\n\t\t\tfunction updateTriangleStrip(instanceCount, count) {\n\t\t\t\trender.triangles += instanceCount * (count - 2);\n\t\t\t},\n\t\t\tfunction updateTriangleFan(instanceCount, count) {\n\t\t\t\trender.triangles += instanceCount * (count - 2);\n\t\t\t}\n\t\t];\n\n\t\t/**\n\t\t * Method of update render info.\n\t\t * This method will be executed after each draw.\n\t\t * @private\n\t\t * @param {number} count\n\t\t * @param {DRAW_MODE} mode\n\t\t * @param {number} instanceCount\n\t\t */\n\t\tthis.update = function(count, mode, instanceCount) {\n\t\t\trender.calls++;\n\t\t\tupdateFuncs[mode](instanceCount, count);\n\t\t};\n\n\t\t/**\n\t\t * Reset the render info.\n\t\t * Call this method whenever you have finished to render a single frame.\n\t\t */\n\t\tthis.reset = function() {\n\t\t\trender.calls = 0;\n\t\t\trender.triangles = 0;\n\t\t\trender.lines = 0;\n\t\t\trender.points = 0;\n\t\t};\n\n\t\t/**\n\t\t * A series of statistical information of rendering process, include calls, triangles, lines and points.\n\t\t * @type {object}\n\t\t */\n\t\tthis.render = render;\n\t}\n\n}\n\nlet _rendererId = 0;\n\n/**\n * Base class for WebGL and WebGPU renderers.\n */\nclass ThinRenderer {\n\n\tconstructor() {\n\t\t/**\n\t\t * The unique id of this renderer.\n\t\t * This will be incremented when the context is lost and restored.\n\t\t * @readonly\n\t\t * @type {number}\n\t\t */\n\t\tthis.id = 0; // assigned in init method\n\n\t\t/**\n\t\t * The Rendering Context privided by canvas.\n\t\t * @type {WebGLRenderingContext|WebGPURenderingContext}\n\t\t */\n\t\tthis.context = null; // assigned in init method\n\n\t\t/**\n\t\t * An object containing details about the capabilities of the current RenderingContext.\n\t\t * @type {object}\n\t\t */\n\t\tthis.capabilities = {};\n\n\t\t/**\n\t\t * The shader compiler options.\n\t\t * @type {object}\n\t\t * @property {boolean} checkErrors - Whether to use error checking when compiling shaders, defaults to true.\n\t\t * @property {boolean} compileAsynchronously - Whether to compile shaders asynchronously, defaults to false.\n\t\t * @property {number} maxMaterialPrograms - The maximum number of programs that one material can cache, defaults to 5.\n\t\t */\n\t\tthis.shaderCompileOptions = {\n\t\t\tcheckErrors: true,\n\t\t\tcompileAsynchronously: false,\n\t\t\tmaxMaterialPrograms: 5\n\t\t};\n\n\t\t/**\n\t\t * The lighting options.\n\t\t * @type {object}\n\t\t * @property {object} clustered - The clustered lighting options.\n\t\t * @property {boolean} clustered.enabled - Whether to use clustered lighting, defaults to false.\n\t\t * @property {number} clustered.maxClusterLights - The maximum number of lights, defaults to 1024.\n\t\t * @property {boolean} clustered.useFloatPrecision - Whether the lights are stored as floats, defaults to false (half floats).\n\t\t * @property {Vector3} clustered.gridDimensions - The number of cells in each dimension, defaults to Vector3(16, 8, 32).\n\t\t * @property {number} clustered.maxLightsPerCell - The maximum number of lights per cell, defaults to 256.\n\t\t * @property {Vector2} clustered.zClip - The near and far clipping planes for the cells, defaults to Vector2(-1, -1) (clip based on camera near and far planes).\n\t\t * @property {number} clustered.version - The version of the clustered lighting options. If the options change, the version should be incremented, defaults to 0.\n\t\t */\n\t\tthis.lightingOptions = {\n\t\t\tclustered: {\n\t\t\t\tenabled: false,\n\t\t\t\tmaxClusterLights: 1024,\n\t\t\t\tuseFloatPrecision: false,\n\t\t\t\tgridDimensions: new Vector3(16, 8, 32),\n\t\t\t\tmaxLightsPerCell: 256,\n\t\t\t\tzClip: new Vector2(-1, -1),\n\t\t\t\tversion: 0\n\t\t\t}\n\t\t};\n\n\t\tthis._passInfo = {\n\t\t\t// Whether the renderer is in the process of pass rendering.\n\t\t\t// If true, means that the beginRender method has been called but the endRender method has not been called.\n\t\t\tenabled: false,\n\t\t\t// The pass rendering count\n\t\t\tcount: 0\n\t\t};\n\t}\n\n\t/**\n\t * Initialize this renderer with a rendering context.\n\t * This method is called automatically by {@link WebGLRenderer} constructor when a context is provided.\n\t * For WebGPURenderer, you must call this method manually and wait for the promise to resolve.\n\t * @param {WebGLRenderingContext|WebGPURenderingContext} context - The rendering context.\n\t * @param {object} [options] - The options for initializing this renderer.\n\t * @returns {Promise<ThinRenderer>} A promise that resolves when initialization completes.\n\t */\n\tinit(context, options = {}) {}\n\n\t/**\n\t * Begin rendering.\n\t * @param {RenderTargetBase} renderTarget - The render target to render to.\n\t */\n\tbeginRender(renderTarget) {\n\t\tthis._passInfo.enabled = true;\n\t}\n\n\t/**\n\t * End rendering.\n\t */\n\tendRender() {\n\t\tthis._passInfo.enabled = false;\n\t\tthis._passInfo.count++;\n\t}\n\n\t/**\n\t * @typedef {object} RenderOptions - The render options for renderRenderableItem and renderRenderableList methods.\n\t * @property {Function} getGeometry - (Optional) Get renderable geometry.\n\t * @property {Function} getMaterial - (Optional) Get renderable material.\n\t * @property {Function} beforeRender - (Optional) Before render each renderable item.\n\t * @property {Function} afterRender - (Optional) After render each renderable item.\n\t * @property {Function} ifRender - (Optional) If render the renderable item.\n\t * @property {RenderInfo} renderInfo - (Optional) Render info for collect information.\n\t * @property {boolean} onlyCompile - (Optional) Only compile shader, do not render.\n\t */\n\n\t/**\n\t * Render a single renderable item with render states.\n\t * @param {object} renderable - The renderable item.\n\t * @param {RenderStates} renderStates - The render states.\n\t * @param {RenderOptions} [options] - The render options for this render task.\n\t */\n\trenderRenderableItem(renderable, renderStates, options) {}\n\n\t/**\n\t * Render a single renderable list with render states.\n\t * @param {Array} renderables - Array of renderable.\n\t * @param {RenderStates} renderStates - Render states.\n\t * @param {RenderOptions} [options] - The render options for this render task.\n\t */\n\trenderRenderableList(renderables, renderStates, options = {}) {\n\t\tfor (let i = 0, l = renderables.length; i < l; i++) {\n\t\t\tthis.renderRenderableItem(renderables[i], renderStates, options);\n\t\t}\n\t}\n\n\t/**\n\t * Render a scene with a particular camera.\n\t * This method will render all layers in scene's RenderQueue by default.\n\t * If you need a customized rendering process, it is recommended to use renderRenderableList method.\n\t * @param {Scene} scene - The scene to render.\n\t * @param {Camera} camera - The camera used to render the scene.\n\t * @param {RenderTargetBase} renderTarget - The render target to render to.\n\t * @param {RenderOptions} [options] - The render options for this scene render task.\n\t */\n\trenderScene(scene, camera, renderTarget, options = {}) {\n\t\t// Compatibility handling: if there are only 3 arguments,\n\t\t// and the third is not a RenderTarget, treat it as options.\n\t\tif (arguments.length === 3 && (!renderTarget || !renderTarget.isRenderTarget)) {\n\t\t\toptions = renderTarget;\n\t\t\trenderTarget = null;\n\t\t}\n\n\t\tconst renderStates = scene.getRenderStates(camera);\n\t\tconst renderQueue = scene.getRenderQueue(camera);\n\n\t\tthis.beginRender(renderTarget);\n\n\t\tlet renderQueueLayer;\n\t\tfor (let i = 0, l = renderQueue.layerList.length; i < l; i++) {\n\t\t\trenderQueueLayer = renderQueue.layerList[i];\n\t\t\tthis.renderRenderableList(renderQueueLayer.opaque, renderStates, options);\n\t\t\tthis.renderRenderableList(renderQueueLayer.transparent, renderStates, options);\n\t\t}\n\n\t\tthis.endRender();\n\t}\n\n\t/**\n\t * Copy a frame buffer to another.\n\t * This copy process can be used to perform multi-sampling (MSAA).\n\t * @param {RenderTargetBase} read - The source renderTarget.\n\t * @param {RenderTargetBase} draw - The destination renderTarget.\n\t * @param {boolean} [color=true] - Copy color buffer.\n\t * @param {boolean} [depth=true] - Copy depth buffer.\n\t * @param {boolean} [stencil=true] - Copy stencil buffer.\n\t */\n\tblitRenderTarget(read, draw, color = true, depth = true, stencil = true) {}\n\n\t/**\n\t * Generate mipmaps for the texture you pass in.\n\t * @param {TextureBase} texture - The texture to update.\n\t */\n\tgenerateMipmaps(texture) {}\n\n\t/**\n\t * Read pixels from a texture.\n\t * This is an asynchronous operation. See {@link ThinRenderer#readTexturePixelsSync} for the synchronous version.\n\t * @param {TextureBase} texture - The texture to read from.\n\t * @param {number} x - The x coordinate of the rectangle to read from.\n\t * @param {number} y - The y coordinate of the rectangle to read from.\n\t * @param {number} width - The width of the rectangle to read from.\n\t * @param {number} height - The height of the rectangle to read from.\n\t * @param {TypedArray} buffer - The buffer to store the pixel data.\n\t * @param {number} [zIndex=0] - For CubeTexture, the face index; for Texture3D/TextureArray, the layer/slice index.\n\t * @param {number} [mipLevel=0] - The mip level to read.\n\t * @returns {Promise<TypedArray>} A promise that resolves with the passed in buffer after it has been filled with the pixel data.\n\t */\n\treadTexturePixels(texture, x, y, width, height, buffer, zIndex = 0, mipLevel = 0) {}\n\n\t/**\n\t * Read pixels from a texture.\n\t * This is a synchronous operation. See {@link ThinRenderer#readTexturePixels} for the asynchronous version.\n\t * @param {TextureBase} texture - The texture to read from.\n\t * @param {number} x - The x coordinate of the rectangle to read from.\n\t * @param {number} y - The y coordinate of the rectangle to read from.\n\t * @param {number} width - The width of the rectangle to read from.\n\t * @param {number} height - The height of the rectangle to read from.\n\t * @param {TypedArray} buffer - The buffer to store the pixel data.\n\t * @param {number} [zIndex=0] - For CubeTexture, the face index; for Texture3D/TextureArray, the layer/slice index.\n\t * @param {number} [mipLevel=0] - The mip level to read.\n\t * @returns {TypedArray} The passed in buffer after it has been filled with the pixel data.\n\t */\n\treadTexturePixelsSync(texture, x, y, width, height, buffer, zIndex = 0, mipLevel = 0) {}\n\n\t/**\n\t * Reset vertex array object bindings.\n\t * @param {boolean} [force=false] - Whether clear the current vertex array object.\n\t */\n\tresetVertexArrayBindings(force) {}\n\n\t/**\n\t * Reset all render states cached in this renderer.\n\t * This is useful when you use multiple renderers in one application.\n\t */\n\tresetState() {}\n\n\t/**\n\t * Begin an occlusion query.\n\t * @param {number} index - The query index in the current occlusion query set.\n\t */\n\tbeginOcclusionQuery(index) {}\n\n\t/**\n\t * End the current occlusion query.\n\t */\n\tendOcclusionQuery() {}\n\n\t/**\n\t * Read back the results of a query set.\n\t * This is an asynchronous operation.\n\t * @param {QuerySet} querySet - The query set to read from.\n\t * @param {Array|TypedArray} dstBuffer - The buffer to store the results.\n\t * @param {number} [firstQuery=0] - The first query index to read.\n\t * @param {number} [queryCount=querySet.count] - The number of queries to read.\n\t * @returns {Promise<Array|TypedArray>} A promise that resolves with the passed in buffer after it has been filled with the results.\n\t */\n\treadQuerySetResults(querySet, dstBuffer, firstQuery = 0, queryCount = querySet.count) {}\n\n\t/**\n\t * Used for context lost and restored.\n\t * @protected\n\t * @returns {number}\n\t */\n\tincreaseId() {\n\t\tthis.id = _rendererId++;\n\t\treturn this.id;\n\t}\n\n}\n\n/**\n * Linear fog.\n */\nclass Fog {\n\n\t/**\n\t * @param {number} [color=0x000000] - The color of the fog.\n\t * @param {number} [near=1] - The near clip of the fog.\n\t * @param {number} [far=1000] - The far clip of the fog.\n\t */\n\tconstructor(color = 0x000000, near = 1, far = 1000) {\n\t\t/**\n\t\t * The color of the fog.\n\t\t * @type {Color3}\n\t\t * @default Color3(0x000000)\n\t\t */\n\t\tthis.color = new Color3(color);\n\n\t\t/**\n\t\t * The near clip of the fog.\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.near = near;\n\n\t\t/**\n\t\t * The far clip of the fog.\n\t\t * @type {number}\n\t\t * @default 1000\n\t\t */\n\t\tthis.far = far;\n\t}\n\n}\n\n/**\n * This flag can be used for type testing.\n * @readonly\n * @type {boolean}\n * @default true\n */\nFog.prototype.isFog = true;\n\n/**\n * Exp2 fog.\n */\nclass FogExp2 {\n\n\t/**\n\t * @param {number} [color=0x000000] - The color of the fog.\n\t * @param {number} [density=0.00025] - The density of the exp2 fog.\n\t */\n\tconstructor(color = 0x000000, density = 0.00025) {\n\t\t/**\n\t\t * The color of the fog.\n\t\t * @type {Color3}\n\t\t * @default Color3(0x000000)\n\t\t */\n\t\tthis.color = new Color3(color);\n\n\t\t/**\n\t\t * The density of the exp2 fog.\n\t\t * @type {number}\n\t\t * @default 0.00025\n\t\t */\n\t\tthis.density = density;\n\t}\n\n}\n\n/**\n * This flag can be used for type testing.\n * @readonly\n * @type {boolean}\n * @default true\n */\nFogExp2.prototype.isFogExp2 = true;\n\n/**\n * BoxGeometry is the quadrilateral primitive geometry class.\n * It is typically used for creating a cube or irregular quadrilateral of the dimensions provided with the 'width', 'height', and 'depth' constructor arguments.\n * @extends Geometry\n */\nclass BoxGeometry extends Geometry {\n\n\t/**\n\t * @param {number} [width=1] - Width of the sides on the X axis.\n\t * @param {number} [height=1] - Height of the sides on the Y axis.\n\t * @param {number} [depth=1] - Depth of the sides on the Z axis.\n\t * @param {number} [widthSegments=1] - Number of segmented faces along the width of the sides.\n\t * @param {number} [heightSegments=1] - Number of segmented faces along the height of the sides.\n\t * @param {number} [depthSegments=1] - Number of segmented faces along the depth of the sides.\n\t */\n\tconstructor(width = 1, height = 1, depth = 1, widthSegments = 1, heightSegments = 1, depthSegments = 1) {\n\t\tsuper();\n\n\t\tconst scope = this;\n\n\t\t// segments\n\n\t\twidthSegments = Math.floor(widthSegments);\n\t\theightSegments = Math.floor(heightSegments);\n\t\tdepthSegments = Math.floor(depthSegments);\n\n\t\t// buffers\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\t// helper variables\n\n\t\tlet numberOfVertices = 0;\n\t\tlet groupStart = 0;\n\n\t\t// build each side of the box geometry\n\n\t\tbuildPlane('z', 'y', 'x', -1, -1, depth, height, width, depthSegments, heightSegments, 0); // px\n\t\tbuildPlane('z', 'y', 'x', 1, -1, depth, height, -width, depthSegments, heightSegments, 1); // nx\n\t\tbuildPlane('x', 'z', 'y', 1, 1, width, depth, height, widthSegments, depthSegments, 2); // py\n\t\tbuildPlane('x', 'z', 'y', 1, -1, width, depth, -height, widthSegments, depthSegments, 3); // ny\n\t\tbuildPlane('x', 'y', 'z', 1, -1, width, height, depth, widthSegments, heightSegments, 4); // pz\n\t\tbuildPlane('x', 'y', 'z', -1, -1, width, height, -depth, widthSegments, heightSegments, 5); // nz\n\n\t\t// build geometry\n\n\t\tthis.setIndex(new Attribute(new Buffer(\n\t\t\t(vertices.length / 3) > 65536 ? new Uint32Array(indices) : new Uint16Array(indices),\n\t\t\t1\n\t\t)));\n\t\tthis.addAttribute('a_Position', new Attribute(new Buffer(new Float32Array(vertices), 3)));\n\t\tthis.addAttribute('a_Normal', new Attribute(new Buffer(new Float32Array(normals), 3)));\n\t\tthis.addAttribute('a_Uv', new Attribute(new Buffer(new Float32Array(uvs), 2)));\n\n\t\tfunction buildPlane(u, v, w, udir, vdir, width, height, depth, gridX, gridY, materialIndex) {\n\t\t\tconst segmentWidth = width / gridX;\n\t\t\tconst segmentHeight = height / gridY;\n\n\t\t\tconst widthHalf = width / 2;\n\t\t\tconst heightHalf = height / 2;\n\t\t\tconst depthHalf = depth / 2;\n\n\t\t\tconst gridX1 = gridX + 1;\n\t\t\tconst gridY1 = gridY + 1;\n\n\t\t\tlet vertexCounter = 0;\n\t\t\tlet groupCount = 0;\n\n\t\t\tconst vector = new Vector3();\n\n\t\t\t// generate vertices, normals and uvs\n\n\t\t\tfor (let iy = 0; iy < gridY1; iy++) {\n\t\t\t\tconst y = iy * segmentHeight - heightHalf;\n\n\t\t\t\tfor (let ix = 0; ix < gridX1; ix++) {\n\t\t\t\t\tconst x = ix * segmentWidth - widthHalf;\n\n\t\t\t\t\t// set values to correct vector component\n\n\t\t\t\t\tvector[u] = x * udir;\n\t\t\t\t\tvector[v] = y * vdir;\n\t\t\t\t\tvector[w] = depthHalf;\n\n\t\t\t\t\t// now apply vector to vertex buffer\n\n\t\t\t\t\tvertices.push(vector.x, vector.y, vector.z);\n\n\t\t\t\t\t// set values to correct vector component\n\n\t\t\t\t\tvector[u] = 0;\n\t\t\t\t\tvector[v] = 0;\n\t\t\t\t\tvector[w] = depth > 0 ? 1 : -1;\n\n\t\t\t\t\t// now apply vector to normal buffer\n\n\t\t\t\t\tnormals.push(vector.x, vector.y, vector.z);\n\n\t\t\t\t\t// uvs\n\n\t\t\t\t\tuvs.push(ix / gridX);\n\t\t\t\t\tuvs.push(1 - (iy / gridY));\n\n\t\t\t\t\t// counters\n\n\t\t\t\t\tvertexCounter += 1;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// indices\n\n\t\t\t// 1. you need three indices to draw a single face\n\t\t\t// 2. a single segment consists of two faces\n\t\t\t// 3. so we need to generate six (2*3) indices per segment\n\n\t\t\tfor (let iy = 0; iy < gridY; iy++) {\n\t\t\t\tfor (let ix = 0; ix < gridX; ix++) {\n\t\t\t\t\tconst a = numberOfVertices + ix + gridX1 * iy;\n\t\t\t\t\tconst b = numberOfVertices + ix + gridX1 * (iy + 1);\n\t\t\t\t\tconst c = numberOfVertices + (ix + 1) + gridX1 * (iy + 1);\n\t\t\t\t\tconst d = numberOfVertices + (ix + 1) + gridX1 * iy;\n\n\t\t\t\t\t// faces\n\n\t\t\t\t\tindices.push(a, b, d);\n\t\t\t\t\tindices.push(b, c, d);\n\n\t\t\t\t\t// increase counter\n\n\t\t\t\t\tgroupCount += 6;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// add a group to the geometry. this will ensure multi material support\n\n\t\t\tscope.addGroup(groupStart, groupCount, materialIndex);\n\n\t\t\t// calculate new start value for groups\n\n\t\t\tgroupStart += groupCount;\n\n\t\t\t// update total number of vertices\n\n\t\t\tnumberOfVertices += vertexCounter;\n\t\t}\n\n\t\tthis.computeBoundingBox();\n\t\tthis.computeBoundingSphere();\n\t}\n\n}\n\n/**\n * A class for generating cylinder geometries.\n * @extends Geometry\n */\nclass CylinderGeometry extends Geometry {\n\n\t/**\n\t * @param {number} [radiusTop=1] — Radius of the cylinder at the top.\n\t * @param {number} [radiusBottom=1] — Radius of the cylinder at the bottom.\n\t * @param {number} [height=1] — Height of the cylinder.\n\t * @param {number} [radialSegments=8] — Number of segmented faces around the circumference of the cylinder.\n\t * @param {number} [heightSegments=1] — Number of rows of faces along the height of the cylinder.\n\t * @param {number} [openEnded=false] — A Boolean indicating whether the ends of the cylinder are open or capped. Default is false, meaning capped.\n\t * @param {number} [thetaStart=0] — Start angle for first segment, default = 0 (three o'clock position).\n\t * @param {number} [thetaLength=2*Pi] — The central angle, often called theta, of the circular sector. The default is 2*Pi, which makes for a complete cylinder.\n\t */\n\tconstructor(radiusTop = 1, radiusBottom = 1, height = 1, radialSegments = 8, heightSegments = 1, openEnded = false, thetaStart = 0, thetaLength = Math.PI * 2) {\n\t\tsuper();\n\n\t\tconst scope = this;\n\n\t\tradialSegments = Math.floor(radialSegments);\n\t\theightSegments = Math.floor(heightSegments);\n\n\t\t// buffers\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\t// helper variables\n\n\t\tlet index = 0;\n\t\tconst indexArray = [];\n\t\tconst halfHeight = height / 2;\n\t\tlet groupStart = 0;\n\n\t\t// generate geometry\n\n\t\tgenerateTorso();\n\n\t\tif (openEnded === false) {\n\t\t\tif (radiusTop > 0) generateCap(true);\n\t\t\tif (radiusBottom > 0) generateCap(false);\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex(new Attribute(new Buffer(\n\t\t\t(vertices.length / 3) > 65536 ? new Uint32Array(indices) : new Uint16Array(indices),\n\t\t\t1\n\t\t)));\n\t\tthis.addAttribute('a_Position', new Attribute(new Buffer(new Float32Array(vertices), 3)));\n\t\tthis.addAttribute('a_Normal', new Attribute(new Buffer(new Float32Array(normals), 3)));\n\t\tthis.addAttribute('a_Uv', new Attribute(new Buffer(new Float32Array(uvs), 2)));\n\n\t\tfunction generateTorso() {\n\t\t\tconst normal = new Vector3();\n\t\t\tconst vertex = new Vector3();\n\n\t\t\tlet groupCount = 0;\n\t\t\tlet x, y;\n\n\t\t\t// this will be used to calculate the normal\n\t\t\tconst slope = (radiusBottom - radiusTop) / height;\n\n\t\t\t// generate vertices, normals and uvs\n\n\t\t\tfor (y = 0; y <= heightSegments; y++) {\n\t\t\t\tconst indexRow = [];\n\n\t\t\t\tconst v = y / heightSegments;\n\n\t\t\t\t// calculate the radius of the current row\n\n\t\t\t\tconst radius = v * (radiusBottom - radiusTop) + radiusTop;\n\n\t\t\t\tfor (x = 0; x <= radialSegments; x++) {\n\t\t\t\t\tconst u = x / radialSegments;\n\n\t\t\t\t\tconst theta = u * thetaLength + thetaStart;\n\n\t\t\t\t\tconst sinTheta = Math.sin(theta);\n\t\t\t\t\tconst cosTheta = Math.cos(theta);\n\n\t\t\t\t\t// vertex\n\n\t\t\t\t\tvertex.x = radius * sinTheta;\n\t\t\t\t\tvertex.y = -v * height + halfHeight;\n\t\t\t\t\tvertex.z = radius * cosTheta;\n\t\t\t\t\tvertices.push(vertex.x, vertex.y, vertex.z);\n\n\t\t\t\t\t// normal\n\n\t\t\t\t\tnormal.set(sinTheta, slope, cosTheta).normalize();\n\t\t\t\t\tnormals.push(normal.x, normal.y, normal.z);\n\n\t\t\t\t\t// uv\n\n\t\t\t\t\tuvs.push(u, 1 - v);\n\n\t\t\t\t\t// save index of vertex in respective row\n\n\t\t\t\t\tindexRow.push(index++);\n\t\t\t\t}\n\n\t\t\t\t// now save vertices of the row in our index array\n\n\t\t\t\tindexArray.push(indexRow);\n\t\t\t}\n\n\t\t\t// generate indices\n\n\t\t\tfor (x = 0; x < radialSegments; x++) {\n\t\t\t\tfor (y = 0; y < heightSegments; y++) {\n\t\t\t\t\t// we use the index array to access the correct indices\n\n\t\t\t\t\tconst a = indexArray[y][x];\n\t\t\t\t\tconst b = indexArray[y + 1][x];\n\t\t\t\t\tconst c = indexArray[y + 1][x + 1];\n\t\t\t\t\tconst d = indexArray[y][x + 1];\n\n\t\t\t\t\t// faces\n\n\t\t\t\t\tif (radiusTop > 0 || y !== 0) {\n\t\t\t\t\t\tindices.push(a, b, d);\n\t\t\t\t\t\tgroupCount += 3;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (radiusBottom > 0 || y !== heightSegments - 1) {\n\t\t\t\t\t\tindices.push(b, c, d);\n\t\t\t\t\t\tgroupCount += 3;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// add a group to the geometry. this will ensure multi material support\n\n\t\t\tscope.addGroup(groupStart, groupCount, 0);\n\n\t\t\t// calculate new start value for groups\n\n\t\t\tgroupStart += groupCount;\n\t\t}\n\n\t\tfunction generateCap(top) {\n\t\t\t// save the index of the first center vertex\n\t\t\tconst centerIndexStart = index;\n\n\t\t\tconst uv = new Vector2();\n\t\t\tconst vertex = new Vector3();\n\n\t\t\tlet groupCount = 0;\n\t\t\tlet x;\n\n\t\t\tconst radius = (top === true) ? radiusTop : radiusBottom;\n\t\t\tconst sign = (top === true) ? 1 : -1;\n\n\t\t\t// first we generate the center vertex data of the cap.\n\t\t\t// because the geometry needs one set of uvs per face,\n\t\t\t// we must generate a center vertex per face/segment\n\n\t\t\tfor (x = 1; x <= radialSegments; x++) {\n\t\t\t\t// vertex\n\n\t\t\t\tvertices.push(0, halfHeight * sign, 0);\n\n\t\t\t\t// normal\n\n\t\t\t\tnormals.push(0, sign, 0);\n\n\t\t\t\t// uv\n\n\t\t\t\tuvs.push(0.5, 0.5);\n\n\t\t\t\t// increase index\n\n\t\t\t\tindex++;\n\t\t\t}\n\n\t\t\t// save the index of the last center vertex\n\t\t\tconst centerIndexEnd = index;\n\n\t\t\t// now we generate the surrounding vertices, normals and uvs\n\n\t\t\tfor (x = 0; x <= radialSegments; x++) {\n\t\t\t\tconst u = x / radialSegments;\n\t\t\t\tconst theta = u * thetaLength + thetaStart;\n\n\t\t\t\tconst cosTheta = Math.cos(theta);\n\t\t\t\tconst sinTheta = Math.sin(theta);\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertex.x = radius * sinTheta;\n\t\t\t\tvertex.y = halfHeight * sign;\n\t\t\t\tvertex.z = radius * cosTheta;\n\t\t\t\tvertices.push(vertex.x, vertex.y, vertex.z);\n\n\t\t\t\t// normal\n\n\t\t\t\tnormals.push(0, sign, 0);\n\n\t\t\t\t// uv\n\n\t\t\t\tuv.x = (cosTheta * 0.5) + 0.5;\n\t\t\t\tuv.y = (sinTheta * 0.5 * sign) + 0.5;\n\t\t\t\tuvs.push(uv.x, uv.y);\n\n\t\t\t\t// increase index\n\n\t\t\t\tindex++;\n\t\t\t}\n\n\t\t\t// generate indices\n\n\t\t\tfor (x = 0; x < radialSegments; x++) {\n\t\t\t\tconst c = centerIndexStart + x;\n\t\t\t\tconst i = centerIndexEnd + x;\n\n\t\t\t\tif (top === true) {\n\t\t\t\t\t// face top\n\t\t\t\t\tindices.push(i, i + 1, c);\n\t\t\t\t} else {\n\t\t\t\t\t// face bottom\n\t\t\t\t\tindices.push(i + 1, i, c);\n\t\t\t\t}\n\n\t\t\t\tgroupCount += 3;\n\t\t\t}\n\n\t\t\t// add a group to the geometry. this will ensure multi material support\n\n\t\t\tscope.addGroup(groupStart, groupCount, top === true ? 1 : 2);\n\n\t\t\t// calculate new start value for groups\n\n\t\t\tgroupStart += groupCount;\n\t\t}\n\n\t\tthis.computeBoundingBox();\n\t\tthis.computeBoundingSphere();\n\t}\n\n}\n\n/**\n * A class for generating plane geometries.\n * @extends Geometry\n */\nclass PlaneGeometry extends Geometry {\n\n\t/**\n\t * @param {number} [width=1] — Width along the X axis.\n\t * @param {number} [height=1] — Height along the Y axis.\n\t * @param {number} [widthSegments=1]\n\t * @param {number} [heightSegments=1]\n\t */\n\tconstructor(width = 1, height = 1, widthSegments = 1, heightSegments = 1) {\n\t\tsuper();\n\n\t\tconst width_half = width / 2;\n\t\tconst height_half = height / 2;\n\n\t\tconst gridX = Math.floor(widthSegments);\n\t\tconst gridY = Math.floor(heightSegments);\n\n\t\tconst gridX1 = gridX + 1;\n\t\tconst gridY1 = gridY + 1;\n\n\t\tconst segment_width = width / gridX;\n\t\tconst segment_height = height / gridY;\n\n\t\tlet ix, iy;\n\n\t\t// buffers\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\t// generate vertices, normals and uvs\n\n\t\tfor (iy = 0; iy < gridY1; iy++) {\n\t\t\tconst y = iy * segment_height - height_half;\n\n\t\t\tfor (ix = 0; ix < gridX1; ix++) {\n\t\t\t\tconst x = ix * segment_width - width_half;\n\n\t\t\t\tvertices.push(x, 0, y);\n\n\t\t\t\tnormals.push(0, 1, 0);\n\n\t\t\t\tuvs.push(ix / gridX);\n\t\t\t\tuvs.push(1 - (iy / gridY));\n\t\t\t}\n\t\t}\n\n\t\t// indices\n\n\t\tfor (iy = 0; iy < gridY; iy++) {\n\t\t\tfor (ix = 0; ix < gridX; ix++) {\n\t\t\t\tconst a = ix + gridX1 * iy;\n\t\t\t\tconst b = ix + gridX1 * (iy + 1);\n\t\t\t\tconst c = (ix + 1) + gridX1 * (iy + 1);\n\t\t\t\tconst d = (ix + 1) + gridX1 * iy;\n\n\t\t\t\t// faces\n\n\t\t\t\tindices.push(a, b, d);\n\t\t\t\tindices.push(b, c, d);\n\t\t\t}\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex(new Attribute(new Buffer(\n\t\t\t(vertices.length / 3) > 65536 ? new Uint32Array(indices) : new Uint16Array(indices),\n\t\t\t1\n\t\t)));\n\t\tthis.addAttribute('a_Position', new Attribute(new Buffer(new Float32Array(vertices), 3)));\n\t\tthis.addAttribute('a_Normal', new Attribute(new Buffer(new Float32Array(normals), 3)));\n\t\tthis.addAttribute('a_Uv', new Attribute(new Buffer(new Float32Array(uvs), 2)));\n\n\t\tthis.computeBoundingBox();\n\t\tthis.computeBoundingSphere();\n\t}\n\n}\n\n/**\n * A class for generating sphere geometries.\n * The geometry is created by sweeping and calculating vertexes around the Y axis (horizontal sweep) and the Z axis (vertical sweep).\n * Thus, incomplete spheres (akin to 'sphere slices') can be created through the use of different values of phiStart, phiLength, thetaStart and thetaLength, in order to define the points in which we start (or end) calculating those vertices.\n * @extends Geometry\n */\nclass SphereGeometry extends Geometry {\n\n\t/**\n\t * @param {number} [radius=1] — sphere radius. Default is 1.\n\t * @param {number} [widthSegments=8] — number of horizontal segments. Minimum value is 3, and the default is 8.\n\t * @param {number} [heightSegments=6] — number of vertical segments. Minimum value is 2, and the default is 6.\n\t * @param {number} [phiStart=0] — specify horizontal starting angle. Default is 0.\n\t * @param {number} [phiLength=Math.PI*2] — specify horizontal sweep angle size. Default is Math.PI * 2.\n\t * @param {number} [thetaStart=0] — specify vertical starting angle. Default is 0.\n\t * @param {number} [thetaLength=Math.PI] — specify vertical sweep angle size. Default is Math.PI.\n\t */\n\tconstructor(radius = 1, widthSegments = 8, heightSegments = 6, phiStart = 0, phiLength = Math.PI * 2, thetaStart = 0, thetaLength = Math.PI) {\n\t\tsuper();\n\n\t\twidthSegments = Math.max(3, Math.floor(widthSegments));\n\t\theightSegments = Math.max(2, Math.floor(heightSegments));\n\n\t\tconst thetaEnd = thetaStart + thetaLength;\n\n\t\tlet ix, iy;\n\n\t\tlet index = 0;\n\t\tconst grid = [];\n\n\t\tconst vertex = new Vector3();\n\t\tconst normal = new Vector3();\n\n\t\t// buffers\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\t// generate vertices, normals and uvs\n\n\t\tfor (iy = 0; iy <= heightSegments; iy++) {\n\t\t\tconst verticesRow = [];\n\n\t\t\tconst v = iy / heightSegments;\n\n\t\t\t// special case for the poles\n\t\t\t// https://github.com/mrdoob/three.js/pull/16043\n\n\t\t\tlet uOffset = 0;\n\n\t\t\tif (iy == 0 && thetaStart == 0) {\n\t\t\t\tuOffset = 0.5 / widthSegments;\n\t\t\t} else if (iy == heightSegments && thetaEnd == Math.PI) {\n\t\t\t\tuOffset = -0.5 / widthSegments;\n\t\t\t}\n\n\t\t\tfor (ix = 0; ix <= widthSegments; ix++) {\n\t\t\t\tconst u = ix / widthSegments;\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertex.x = -radius * Math.cos(phiStart + u * phiLength) * Math.sin(thetaStart + v * thetaLength);\n\t\t\t\tvertex.y = radius * Math.cos(thetaStart + v * thetaLength);\n\t\t\t\tvertex.z = radius * Math.sin(phiStart + u * phiLength) * Math.sin(thetaStart + v * thetaLength);\n\n\t\t\t\tvertices.push(vertex.x, vertex.y, vertex.z);\n\n\t\t\t\t// normal\n\n\t\t\t\tnormal.copy(vertex).normalize();\n\t\t\t\tnormals.push(normal.x, normal.y, normal.z);\n\n\t\t\t\t// uv\n\n\t\t\t\tuvs.push(u + uOffset, 1 - v);\n\n\t\t\t\tverticesRow.push(index++);\n\t\t\t}\n\n\t\t\tgrid.push(verticesRow);\n\t\t}\n\n\t\t// indices\n\n\t\tfor (iy = 0; iy < heightSegments; iy++) {\n\t\t\tfor (ix = 0; ix < widthSegments; ix++) {\n\t\t\t\tconst a = grid[iy][ix + 1];\n\t\t\t\tconst b = grid[iy][ix];\n\t\t\t\tconst c = grid[iy + 1][ix];\n\t\t\t\tconst d = grid[iy + 1][ix + 1];\n\n\t\t\t\tif (iy !== 0 || thetaStart > 0) indices.push(a, b, d);\n\t\t\t\tif (iy !== heightSegments - 1 || thetaEnd < Math.PI) indices.push(b, c, d);\n\t\t\t}\n\t\t}\n\n\t\tthis.setIndex(new Attribute(new Buffer(\n\t\t\t(vertices.length / 3) > 65536 ? new Uint32Array(indices) : new Uint16Array(indices),\n\t\t\t1\n\t\t)));\n\t\tthis.addAttribute('a_Position', new Attribute(new Buffer(new Float32Array(vertices), 3)));\n\t\tthis.addAttribute('a_Normal', new Attribute(new Buffer(new Float32Array(normals), 3)));\n\t\tthis.addAttribute('a_Uv', new Attribute(new Buffer(new Float32Array(uvs), 2)));\n\n\t\tthis.computeBoundingBox();\n\t\tthis.computeBoundingSphere();\n\t}\n\n}\n\n/**\n * Creates a torus knot, the particular shape of which is defined by a pair of coprime integers, p and q.\n * If p and q are not coprime, the result will be a torus link.\n * @extends Geometry\n */\nclass TorusKnotGeometry extends Geometry {\n\n\t/**\n\t * @param {number} [radius=1] — Radius of the torus. Default is 1.\n\t * @param {number} [tube=0.4] — Radius of the tube. Default is 0.4.\n\t * @param {number} [tubularSegments=64] — Default is 64.\n\t * @param {number} [radialSegments=8] — Default is 8.\n\t * @param {number} [p=2] — This value determines, how many times the geometry winds around its axis of rotational symmetry. Default is 2.\n\t * @param {number} [q=3] — This value determines, how many times the geometry winds around a circle in the interior of the torus. Default is 3.\n\t */\n\tconstructor(radius = 1, tube = 0.4, tubularSegments = 64, radialSegments = 8, p = 2, q = 3) {\n\t\tsuper();\n\n\t\ttubularSegments = Math.floor(tubularSegments);\n\t\tradialSegments = Math.floor(radialSegments);\n\n\t\t// buffers\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\t// helper variables\n\n\t\tlet i, j;\n\n\t\tconst vertex = new Vector3();\n\t\tconst normal = new Vector3();\n\n\t\tconst P1 = new Vector3();\n\t\tconst P2 = new Vector3();\n\n\t\tconst B = new Vector3();\n\t\tconst T = new Vector3();\n\t\tconst N = new Vector3();\n\n\t\t// generate vertices, normals and uvs\n\n\t\tfor (i = 0; i <= tubularSegments; ++i) {\n\t\t\t// the radian \"u\" is used to calculate the position on the torus curve of the current tubular segement\n\n\t\t\tconst u = i / tubularSegments * p * Math.PI * 2;\n\n\t\t\t// now we calculate two points. P1 is our current position on the curve, P2 is a little farther ahead.\n\t\t\t// these points are used to create a special \"coordinate space\", which is necessary to calculate the correct vertex positions\n\n\t\t\tcalculatePositionOnCurve(u, p, q, radius, P1);\n\t\t\tcalculatePositionOnCurve(u + 0.01, p, q, radius, P2);\n\n\t\t\t// calculate orthonormal basis\n\n\t\t\tT.subVectors(P2, P1);\n\t\t\tN.addVectors(P2, P1);\n\t\t\tB.crossVectors(T, N);\n\t\t\tN.crossVectors(B, T);\n\n\t\t\t// normalize B, N. T can be ignored, we don't use it\n\n\t\t\tB.normalize();\n\t\t\tN.normalize();\n\n\t\t\tfor (j = 0; j <= radialSegments; ++j) {\n\t\t\t\t// now calculate the vertices. they are nothing more than an extrusion of the torus curve.\n\t\t\t\t// because we extrude a shape in the xy-plane, there is no need to calculate a z-value.\n\n\t\t\t\tconst v = j / radialSegments * Math.PI * 2;\n\t\t\t\tconst cx = -tube * Math.cos(v);\n\t\t\t\tconst cy = tube * Math.sin(v);\n\n\t\t\t\t// now calculate the final vertex position.\n\t\t\t\t// first we orient the extrusion with our basis vectos, then we add it to the current position on the curve\n\n\t\t\t\tvertex.x = P1.x + (cx * N.x + cy * B.x);\n\t\t\t\tvertex.y = P1.y + (cx * N.y + cy * B.y);\n\t\t\t\tvertex.z = P1.z + (cx * N.z + cy * B.z);\n\n\t\t\t\tvertices.push(vertex.x, vertex.y, vertex.z);\n\n\t\t\t\t// normal (P1 is always the center/origin of the extrusion, thus we can use it to calculate the normal)\n\n\t\t\t\tnormal.subVectors(vertex, P1).normalize();\n\n\t\t\t\tnormals.push(normal.x, normal.y, normal.z);\n\n\t\t\t\t// uv\n\n\t\t\t\tuvs.push(i / tubularSegments);\n\t\t\t\tuvs.push(j / radialSegments);\n\t\t\t}\n\t\t}\n\n\t\t// generate indices\n\n\t\tfor (j = 1; j <= tubularSegments; j++) {\n\t\t\tfor (i = 1; i <= radialSegments; i++) {\n\t\t\t\t// indices\n\n\t\t\t\tconst a = (radialSegments + 1) * (j - 1) + (i - 1);\n\t\t\t\tconst b = (radialSegments + 1) * j + (i - 1);\n\t\t\t\tconst c = (radialSegments + 1) * j + i;\n\t\t\t\tconst d = (radialSegments + 1) * (j - 1) + i;\n\n\t\t\t\t// faces\n\n\t\t\t\tindices.push(a, b, d);\n\t\t\t\tindices.push(b, c, d);\n\t\t\t}\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex(new Attribute(new Buffer(\n\t\t\t(vertices.length / 3) > 65536 ? new Uint32Array(indices) : new Uint16Array(indices),\n\t\t\t1\n\t\t)));\n\t\tthis.addAttribute('a_Position', new Attribute(new Buffer(new Float32Array(vertices), 3)));\n\t\tthis.addAttribute('a_Normal', new Attribute(new Buffer(new Float32Array(normals), 3)));\n\t\tthis.addAttribute('a_Uv', new Attribute(new Buffer(new Float32Array(uvs), 2)));\n\n\t\tthis.computeBoundingBox();\n\t\tthis.computeBoundingSphere();\n\n\t\t// this function calculates the current position on the torus curve\n\n\t\tfunction calculatePositionOnCurve(u, p, q, radius, position) {\n\t\t\tconst cu = Math.cos(u);\n\t\t\tconst su = Math.sin(u);\n\t\t\tconst quOverP = q / p * u;\n\t\t\tconst cs = Math.cos(quOverP);\n\n\t\t\tposition.x = radius * (2 + cs) * 0.5 * cu;\n\t\t\tposition.y = radius * (2 + cs) * su * 0.5;\n\t\t\tposition.z = radius * Math.sin(quOverP) * 0.5;\n\t\t}\n\t}\n\n}\n\n/**\n * A material for drawing geometries in a simple shaded (flat or wireframe) way.\n * This material is not affected by lights.\n * @extends Material\n */\nclass BasicMaterial extends Material {\n\n\t/**\n\t * Create a BasicMaterial.\n\t */\n\tconstructor() {\n\t\tsuper();\n\n\t\tthis.type = MATERIAL_TYPE.BASIC;\n\t}\n\n}\n\n/**\n * A material for non-shiny surfaces, without specular highlights.\n * The material uses a non-physically based Lambertian model for calculating reflectance.\n * This can simulate some surfaces (such as untreated wood or stone) well, but cannot simulate shiny surfaces with specular highlights (such as varnished wood).\n * @extends Material\n */\nclass LambertMaterial extends Material {\n\n\t/**\n\t * Create a LambertMaterial.\n\t */\n\tconstructor() {\n\t\tsuper();\n\n\t\tthis.type = MATERIAL_TYPE.LAMBERT;\n\n\t\t/**\n\t\t * @default true\n\t\t */\n\t\tthis.acceptLight = true;\n\t}\n\n}\n\n/**\n * A material for drawing wireframe-style geometries.\n * @extends Material\n */\nclass LineMaterial extends Material {\n\n\t/**\n\t * Create a LineMaterial.\n\t */\n\tconstructor() {\n\t\tsuper();\n\n\t\tthis.type = MATERIAL_TYPE.LINE;\n\n\t\t/**\n\t\t * Controls line thickness.\n\t\t * Due to limitations of the OpenGL Core Profile with the WebGL renderer on most platforms linewidth will always be 1 regardless of the set value.\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.lineWidth = 1;\n\n\t\t/**\n\t\t * Set draw mode to LINES / LINE_LOOP / LINE_STRIP\n\t\t * @type {DRAW_MODE}\n\t\t * @default DRAW_MODE.LINES\n\t\t */\n\t\tthis.drawMode = DRAW_MODE.LINES;\n\t}\n\n\tcopy(source) {\n\t\tsuper.copy(source);\n\n\t\tthis.lineWidth = source.lineWidth;\n\n\t\treturn this;\n\t}\n\n}\n\n/**\n * A standard physically based material, using Specular-Glossiness workflow.\n * Physically based rendering (PBR) has recently become the standard in many 3D applications, such as Unity, Unreal and 3D Studio Max.\n * This approach differs from older approaches in that instead of using approximations for the way in which light interacts with a surface, a physically correct model is used.\n * The idea is that, instead of tweaking materials to look good under specific lighting, a material can\tbe created that will react 'correctly' under all lighting scenarios.\n * @extends Material\n */\nclass PBR2Material extends Material {\n\n\t/**\n\t * Create a PBR2Material.\n\t */\n\tconstructor() {\n\t\tsuper();\n\n\t\tthis.type = MATERIAL_TYPE.PBR2;\n\n\t\t/**\n\t\t * Specular color of the material.\n\t\t * @type {number}\n\t\t * @default 0.5\n\t\t */\n\t\tthis.specular = new Color3(0x111111);\n\n\t\t/**\n\t\t * Glossiness of the material.\n\t\t * @type {number}\n\t\t * @default 0.5\n\t\t */\n\t\tthis.glossiness = 0.5;\n\n\t\t/**\n\t\t * The RGB channel of this texture is used to alter the specular of the material.\n\t\t * @type {Texture2D}\n\t\t * @default null\n\t\t */\n\t\tthis.specularMap = null;\n\n\t\t/**\n\t\t * The A channel of this texture is used to alter the glossiness of the material.\n\t\t * @type {Texture2D}\n\t\t * @default null\n\t\t */\n\t\tthis.glossinessMap = null;\n\n\t\t/**\n\t\t * @default true\n\t\t */\n\t\tthis.acceptLight = true;\n\t}\n\n\tcopy(source) {\n\t\tsuper.copy(source);\n\n\t\tthis.specular = source.specular;\n\t\tthis.glossiness = source.glossiness;\n\t\tthis.specularMap = source.specularMap;\n\t\tthis.glossinessMap = source.glossinessMap;\n\n\t\treturn this;\n\t}\n\n}\n\n/**\n * A standard physically based material, using Metallic-Roughness workflow.\n * Physically based rendering (PBR) has recently become the standard in many 3D applications, such as Unity, Unreal and 3D Studio Max.\n * This approach differs from older approaches in that instead of using approximations for the way in which light interacts with a surface, a physically correct model is used.\n * The idea is that, instead of tweaking materials to look good under specific lighting, a material can\tbe created that will react 'correctly' under all lighting scenarios.\n * @extends Material\n */\nclass PBRMaterial extends Material {\n\n\t/**\n\t * Create a PBRMaterial.\n\t */\n\tconstructor() {\n\t\tsuper();\n\n\t\tthis.type = MATERIAL_TYPE.PBR;\n\n\t\t/**\n\t\t * How rough the material appears. 0.0 means a smooth mirror reflection, 1.0 means fully diffuse.\n\t\t * If roughnessMap is also provided, both values are multiplied.\n\t\t * @type {number}\n\t\t * @default 0.5\n\t\t */\n\t\tthis.roughness = 0.5;\n\n\t\t/**\n\t\t * How much the material is like a metal.\n\t\t * Non-metallic materials such as wood or stone use 0.0, metallic use 1.0, with nothing (usually) in between.\n\t\t * A value between 0.0 and 1.0 could be used for a rusty metal look. If metalnessMap is also provided, both values are multiplied.\n\t\t * @type {number}\n\t\t * @default 0.5\n\t\t */\n\t\tthis.metalness = 0.5;\n\n\t\t/**\n\t\t * The green channel of this texture is used to alter the roughness of the material.\n\t\t * @type {Texture2D}\n\t\t * @default null\n\t\t */\n\t\tthis.roughnessMap = null;\n\n\t\t/**\n\t\t * The blue channel of this texture is used to alter the metalness of the material.\n\t\t * @type {Texture2D}\n\t\t * @default null\n\t\t */\n\t\tthis.metalnessMap = null;\n\n\t\t/**\n\t\t * The strength of a clearcoat layer on a material surface.\n\t\t * When clearcoatFactor is set to 0.0, it indicates that there is no clearcoat present.\n\t\t * When it is set to 1.0, it indicates a very strong clearcoat that-\n\t\t * will cause the reflection and refraction effects on the surface of the object to become more prominent.\n\t\t * @type {number}\n\t\t * @default 0.0\n\t\t */\n\t\tthis.clearcoat = 0.0;\n\n\t\t/**\n\t\t * A texture property that allows for the modulation of the strength or roughness of the clearcoat layer.\n\t\t * @type {Texture2D}\n\t\t * @default null\n\t\t */\n\t\tthis.clearcoatMap = null;\n\n\t\t/**\n\t\t * The roughness of a clearcoat layer on a material surface.\n\t\t * When clearcoatRoughness is set to 0.0, the clearcoat layer will appear perfectly smooth and reflective-\n\t\t * and 0.0 represents a rough, textured clearcoat layer.\n\t\t * Adjusting the clearcoatRoughness can achieve a wide range of effects and create more realistic materials.\n\t\t * @type {number}\n\t\t * @default 0.0\n\t\t */\n\t\tthis.clearcoatRoughness = 0.0;\n\n\t\t/**\n\t\t * A texture that will be applied to the clearcoat layer of a material to simulate the roughness of the surface.\n\t\t * @type {Texture2D}\n\t\t * @default null\n\t\t */\n\t\tthis.clearcoatRoughnessMap = null;\n\n\t\t/**\n\t\t * Adjust the normal map's strength or intensity.\n\t\t * Affect the amount of bumpiness or surface detail that is visible on the clearcoat layer.\n\t\t * Typical ranges are 0-1.\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.clearcoatNormalScale = new Vector2(1, 1);\n\n\t\t/**\n\t\t * The texture that modulates the clearcoat layer's surface normal.\n\t\t * @type {Texture2D}\n\t\t * @default null\n\t\t */\n\t\tthis.clearcoatNormalMap = null;\n\n\t\t/**\n\t\t * @default true\n\t\t */\n\t\tthis.acceptLight = true;\n\t}\n\n\tcopy(source) {\n\t\tsuper.copy(source);\n\n\t\tthis.roughness = source.roughness;\n\t\tthis.metalness = source.metalness;\n\t\tthis.roughnessMap = source.roughnessMap;\n\t\tthis.metalnessMap = source.metalnessMap;\n\n\t\tthis.clearcoat = source.clearcoat;\n\t\tthis.clearcoatMap = source.clearcoatMap;\n\t\tthis.clearcoatRoughness = source.clearcoatRoughness;\n\t\tthis.clearcoatRoughnessMap = source.clearcoatRoughnessMap;\n\t\tthis.clearcoatNormalScale.copy(source.clearcoatNormalScale);\n\n\t\treturn this;\n\t}\n\n}\n\n/**\n * A material for shiny surfaces with specular highlights.\n * The material uses a non-physically based Blinn-Phong model for calculating reflectance.\n * Unlike the Lambertian model used in the {@link LambertMaterial} this can simulate shiny surfaces with specular highlights (such as varnished wood).\n * @extends Material\n */\nclass PhongMaterial extends Material {\n\n\t/**\n\t * Create a PhongMaterial.\n\t */\n\tconstructor() {\n\t\tsuper();\n\n\t\tthis.type = MATERIAL_TYPE.PHONG;\n\n\t\t/**\n\t\t * How shiny the {@link PhongMaterial#specular} highlight is; a higher value gives a sharper highlight.\n\t\t * @type {number}\n\t\t * @default 30\n\t\t */\n\t\tthis.shininess = 30;\n\n\t\t/**\n\t\t * Specular color of the material.\n\t\t * This defines how shiny the material is and the color of its shine.\n\t\t * @type {Color3}\n\t\t * @default Color(0x111111)\n\t\t */\n\t\tthis.specular = new Color3(0x111111);\n\n\t\t/**\n\t\t * The specular map value affects both how much the specular surface highlight contributes and how much of the environment map affects the surface.\n\t\t * @type {Texture2D}\n\t\t * @default null\n\t\t */\n\t\tthis.specularMap = null;\n\n\t\t/**\n\t\t * @default true\n\t\t */\n\t\tthis.acceptLight = true;\n\t}\n\n\tcopy(source) {\n\t\tsuper.copy(source);\n\n\t\tthis.shininess = source.shininess;\n\t\tthis.specular.copy(source.specular);\n\t\tthis.specularMap = source.specularMap;\n\n\t\treturn this;\n\t}\n\n}\n\n/**\n * The default material used by Points.\n * @extends Material\n */\nclass PointsMaterial extends Material {\n\n\t/**\n\t * Create a PointsMaterial.\n\t */\n\tconstructor() {\n\t\tsuper();\n\n\t\tthis.type = MATERIAL_TYPE.POINT;\n\n\t\t/**\n\t\t * Sets the size of the points.\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.size = 1;\n\n\t\t/**\n\t\t * Specify whether points' size is attenuated by the camera depth. (Perspective camera only.)\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.sizeAttenuation = true;\n\n\t\t/**\n\t\t * Set draw mode to POINTS.\n\t\t * @type {DRAW_MODE}\n\t\t * @default DRAW_MODE.POINTS\n\t\t */\n\t\tthis.drawMode = DRAW_MODE.POINTS;\n\t}\n\n\tcopy(source) {\n\t\tsuper.copy(source);\n\n\t\tthis.size = source.size;\n\t\tthis.sizeAttenuation = source.sizeAttenuation;\n\n\t\treturn this;\n\t}\n\n}\n\n/**\n * RenderTargetBase is an abstract class representing a rendering target,\n * which encapsulates the configuration for a render pass,\n * including clear states, attachments, and other rendering parameters.\n * @extends EventDispatcher\n * @abstract\n */\nclass RenderTargetBase extends EventDispatcher {\n\n\tconstructor(width, height) {\n\t\tsuper();\n\n\t\t/**\n\t\t * The width of the render target.\n\t\t * @type {number}\n\t\t */\n\t\tthis.width = width;\n\n\t\t/**\n\t\t * The height of the render target.\n\t\t * @type {number}\n\t\t */\n\t\tthis.height = height;\n\n\t\t/**\n\t\t * Whether to clear the color buffer before rendering to this render target.\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.clearColor = true;\n\n\t\t/**\n\t\t * Whether to clear the depth buffer before rendering to this render target.\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.clearDepth = true;\n\n\t\t/**\n\t\t * Whether to clear the stencil buffer before rendering to this render target.\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.clearStencil = true;\n\n\t\t/**\n\t\t * Clear color value.\n\t\t * @type {Color4}\n\t\t */\n\t\tthis.colorClearValue = new Color4(0, 0, 0, 0);\n\n\t\t/**\n\t\t * Clear depth value.\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.depthClearValue = 1;\n\n\t\t/**\n\t\t * Clear stencil value.\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.stencilClearValue = 0;\n\n\t\t/**\n\t\t * A querySet that will store the occlusion query results. If null, occlusion queries are disabled.\n\t\t * @type {QuerySet|null}\n\t\t * @default null\n\t\t */\n\t\tthis.occlusionQuerySet = null;\n\n\t\t/**\n\t\t * An array of objects defining where and when timestamp query values will be written.\n\t\t * @type {object}\n\t\t * @property {QuerySet|null} querySet - A timestamp querySet. If null, timestamp queries are disabled.\n\t\t * @property {number} beginningOfPassWriteIndex - A number specifying the query index in querySet where the timestamp at the beginning of the render pass will be written.\n\t\t * @property {number} endOfPassWriteIndex - A number specifying the query index in querySet where the timestamp at the end of the render pass will be written.\n\t\t */\n\t\tthis.timestampWrites = {\n\t\t\tquerySet: null,\n\t\t\tbeginningOfPassWriteIndex: 0,\n\t\t\tendOfPassWriteIndex: 1\n\t\t};\n\t}\n\n\t/**\n\t * Resize the render target to the specified dimensions.\n\t * @abstract\n\t */\n\tresize() {\n\t\tthrow new Error('RenderTargetBase: resize method must be implemented by subclass');\n\t}\n\n\t/**\n\t * Dispose the render target.\n\t * @abstract\n\t */\n\tdispose() {\n\t\tthrow new Error('RenderTargetBase: dispose method must be implemented by subclass');\n\t}\n\n\t/**\n\t * Sets the clear state.\n\t * @param {boolean} [color] - Whether to clear the color buffer.\n\t * @param {boolean} [depth] - Whether to clear the depth buffer.\n\t * @param {boolean} [stencil] - Whether to clear the stencil buffer.\n\t * @returns {RenderTargetBase} A reference to this render target.\n\t */\n\tsetClear(color, depth, stencil) {\n\t\tthis.clearColor = color !== undefined ? color : this.clearColor;\n\t\tthis.clearDepth = depth !== undefined ? depth : this.clearDepth;\n\t\tthis.clearStencil = stencil !== undefined ? stencil : this.clearStencil;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the clear values.\n\t * @param {number} r - Red channel value between 0.0 and 1.0.\n\t * @param {number} g - Green channel value between 0.0 and 1.0.\n\t * @param {number} b - Blue channel value between 0.0 and 1.0.\n\t * @param {number} a - Alpha channel value between 0.0 and 1.0.\n\t * @returns {RenderTargetBase} A reference to this render target.\n\t */\n\tsetColorClearValue(r, g, b, a) {\n\t\tthis.colorClearValue.setRGBA(r, g, b, a);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the clear depth value.\n\t * @param {number} depth - The depth value.\n\t * @returns {RenderTargetBase} A reference to this render target.\n\t */\n\tsetDepthClearValue(depth) {\n\t\tthis.depthClearValue = depth;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the clear stencil value.\n\t * @param {number} stencil - The stencil value.\n\t * @returns {RenderTargetBase} A reference to this render target.\n\t */\n\tsetStencilClearValue(stencil) {\n\t\tthis.stencilClearValue = stencil;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the occlusion query set.\n\t * @param {QuerySet|null} querySet - The occlusion query set. If null, occlusion queries are disabled.\n\t * @returns {RenderTargetBase} A reference to this render target.\n\t */\n\tsetOcclusionQuerySet(querySet) {\n\t\tthis.occlusionQuerySet = querySet;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the timestamp query set and the query indices.\n\t * @param {QuerySet|null} querySet - The timestamp query set. If null, timestamp queries are disabled.\n\t * @param {number} [beginIndex=0] - The query index in querySet where the timestamp at the beginning of the render pass will be written.\n\t * @param {number} [endIndex=1] - The query index in querySet where the timestamp at the end of the render pass will be written.\n\t * @returns {RenderTargetBase} A reference to this render target.\n\t */\n\tsetTimestampWrites(querySet, beginIndex = 0, endIndex = 1) {\n\t\tthis.timestampWrites.querySet = querySet;\n\t\tthis.timestampWrites.beginningOfPassWriteIndex = beginIndex;\n\t\tthis.timestampWrites.endOfPassWriteIndex = endIndex;\n\t\treturn this;\n\t}\n\n}\n\n/**\n * This flag can be used for type testing.\n * @readonly\n * @type {boolean}\n * @default true\n */\nRenderTargetBase.prototype.isRenderTarget = true;\n\n/**\n * Render Buffer can be attached to RenderTarget.\n * @extends EventDispatcher\n */\nclass RenderBuffer extends EventDispatcher {\n\n\t/**\n\t * @param {number} width - The width of the render buffer.\n\t * @param {number} height - The height of the render buffer.\n\t * @param {PIXEL_FORMAT} [format=PIXEL_FORMAT.RGBA8] - The internal format of the render buffer.\n\t * @param {number} [multipleSampling=0] - If bigger than zero, this renderBuffer will support multipleSampling. (Only usable in WebGL 2.0)\n\t */\n\tconstructor(width, height, format = PIXEL_FORMAT.RGBA8, multipleSampling = 0) {\n\t\tsuper();\n\n\t\t/**\n\t\t * The width of the render buffer.\n\t\t * @type {number}\n\t\t */\n\t\tthis.width = width;\n\n\t\t/**\n\t\t * The height of the render buffer.\n\t\t * @type {number}\n\t\t */\n\t\tthis.height = height;\n\n\t\t/**\n\t\t * Render buffer texel storage data format.\n\t\t * DEPTH_COMPONENT16: for depth attachments.\n\t\t * DEPTH_STENCIL: for depth stencil attachments.\n\t\t * RGBA8：for multiple sampled color attachments.\n\t\t * DEPTH_COMPONENT16: for multiple sampled depth attachments.\n\t\t * DEPTH24_STENCIL8: for multiple sampled depth stencil attachments.\n\t\t * @type {PIXEL_FORMAT}\n\t\t * @default PIXEL_FORMAT.RGBA8\n\t\t */\n\t\tthis.format = format;\n\n\t\t/**\n\t\t * If bigger than zero, this renderBuffer will support multipleSampling. (Only usable in WebGL 2.0)\n\t\t * A Render Target's attachments must have the same multipleSampling value.\n\t\t * Texture can't be attached to the same render target with a multiple sampled render buffer.\n\t\t * Max support 8.\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.multipleSampling = multipleSampling;\n\t}\n\n\t/**\n\t * Resize the render buffer.\n\t * @param {number} width - The width of the render buffer.\n\t * @param {number} height - The height of the render buffer.\n\t * @returns {boolean} - If size changed.\n\t */\n\tresize(width, height) {\n\t\tif (this.width !== width || this.height !== height) {\n\t\t\tthis.dispose();\n\t\t\tthis.width = width;\n\t\t\tthis.height = height;\n\n\t\t\treturn true;\n\t\t}\n\n\t\treturn false;\n\t}\n\n\t/**\n\t * Returns a clone of this render buffer.\n\t * @returns {RenderBuffer}\n\t */\n\tclone() {\n\t\treturn new this.constructor().copy(this);\n\t}\n\n\t/**\n\t * Copy the given render buffer into this render buffer.\n\t * @param {RenderBuffer} source - The render buffer to be copied.\n\t * @returns {RenderBuffer}\n\t */\n\tcopy(source) {\n\t\tthis.format = source.format;\n\t\tthis.multipleSampling = source.multipleSampling;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Dispatches a dispose event.\n\t */\n\tdispose() {\n\t\tthis.dispatchEvent({ type: 'dispose' });\n\t}\n\n}\n\n/**\n * This flag can be used for type testing.\n * @readonly\n * @type {boolean}\n * @default true\n */\nRenderBuffer.prototype.isRenderBuffer = true;\n\nlet _textureId = 0;\n\n/**\n * Create a texture to apply to a surface or as a reflection or refraction map.\n * @abstract\n * @extends EventDispatcher\n */\nclass TextureBase extends EventDispatcher {\n\n\tconstructor() {\n\t\tsuper();\n\n\t\t/**\n\t\t * Unique number for this texture instance.\n\t\t * @readonly\n\t\t * @type {number}\n\t\t */\n\t\tthis.id = _textureId++;\n\n\t\t/**\n\t\t * An object that can be used to store custom data about the {@link TextureBase}.\n\t\t * It should not hold references to functions as these will not be cloned.\n\t\t * @type {object}\n\t\t * @default {}\n\t\t */\n\t\tthis.userData = {};\n\n\t\t/**\n\t\t * Array of user-specified mipmaps (optional).\n\t\t * @type {HTMLImageElement[] | object[]}\n\t\t * @default []\n\t\t */\n\t\tthis.mipmaps = [];\n\n\t\t/**\n\t\t * WebGLTexture border.\n\t\t * See {@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/texImage2D WebGLTexture texImage2D()}.\n\t\t * Must be zero.\n\t\t * @type {number}\n\t\t */\n\t\tthis.border = 0;\n\n\t\t/**\n\t\t * WebGLTexture texel data format.\n\t\t * @type {PIXEL_FORMAT}\n\t\t * @default PIXEL_FORMAT.RGBA\n\t\t */\n\t\tthis.format = PIXEL_FORMAT.RGBA;\n\n\t\t/**\n\t\t * The default value is null, the texture's internal format will be obtained using a combination of .format and .type.\n\t\t * Users can also specify a specific internalFormat.\n\t\t * @type {null | PIXEL_FORMAT}\n\t\t * @default null\n\t\t */\n\t\tthis.internalformat = null;\n\n\t\t/**\n\t\t * WebGLTexture texel data type.\n\t\t * @type {PIXEL_TYPE}\n\t\t * @default PIXEL_TYPE.UNSIGNED_BYTE\n\t\t */\n\t\tthis.type = PIXEL_TYPE.UNSIGNED_BYTE;\n\n\t\t/**\n\t\t * How the texture is sampled when a texel covers more than one pixel.\n\t\t * @type {TEXTURE_FILTER}\n\t\t * @default TEXTURE_FILTER.LINEAR\n\t\t */\n\t\tthis.magFilter = TEXTURE_FILTER.LINEAR;\n\n\t\t/**\n\t\t * How the texture is sampled when a texel covers less than one pixel.\n\t\t * @type {TEXTURE_FILTER}\n\t\t * @default TEXTURE_FILTER.LINEAR_MIPMAP_LINEAR\n\t\t */\n\t\tthis.minFilter = TEXTURE_FILTER.LINEAR_MIPMAP_LINEAR;\n\n\t\t/**\n\t\t * This defines how the texture is wrapped horizontally and corresponds to U in UV mapping.\n\t\t * @type {TEXTURE_WRAP}\n\t\t * @default TEXTURE_WRAP.CLAMP_TO_EDGE\n\t\t */\n\t\tthis.wrapS = TEXTURE_WRAP.CLAMP_TO_EDGE;\n\n\t\t/**\n\t\t * This defines how the texture is wrapped vertically and corresponds to V in UV mapping.\n\t\t * @type {TEXTURE_WRAP}\n\t\t * @default TEXTURE_WRAP.CLAMP_TO_EDGE\n\t\t */\n\t\tthis.wrapT = TEXTURE_WRAP.CLAMP_TO_EDGE;\n\n\t\t/**\n\t\t * The number of samples taken along the axis through the pixel that has the highest density of texels.\n\t\t * A higher value gives a less blurry result than a basic mipmap, at the cost of more texture samples being used.\n\t\t * Use {@link WebGLcapabilities#maxAnisotropy} to find the maximum valid anisotropy value for the GPU; this value is usually a power of 2.\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.anisotropy = 1;\n\n\t\t/**\n\t\t * Use for shadow sampler (WebGL 2.0 Only).\n\t\t * @type {COMPARE_FUNC | undefined}\n\t\t * @default undefined\n\t\t */\n\t\tthis.compare = undefined;\n\n\t\t/**\n\t\t * Whether to generate mipmaps (if possible) for a texture.\n\t\t * Set this to false if you are creating mipmaps manually.\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.generateMipmaps = true;\n\n\t\t/**\n\t\t * texture pixel encoding.\n\t\t * @type {TEXEL_ENCODING_TYPE}\n\t\t * @default TEXEL_ENCODING_TYPE.LINEAR\n\t\t */\n\t\tthis.encoding = TEXEL_ENCODING_TYPE.LINEAR;\n\n\t\t/**\n\t\t * If set to true, the texture is flipped along the vertical axis when uploaded to the GPU.\n\t\t * Default is true to flips the image's Y axis to match the WebGL texture coordinate space.\n\t\t * Note that this property has no effect for ImageBitmap. You need to configure on bitmap creation instead.\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.flipY = true;\n\n\t\t/**\n\t\t * If set to true, the alpha channel, if present, is multiplied into the color channels when the texture is uploaded to the GPU.\n\t\t * Note that this property has no effect for ImageBitmap. You need to configure on bitmap creation instead.\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.premultiplyAlpha = false;\n\n\t\t/**\n\t\t * Specifies the alignment requirements for the start of each pixel row in memory.\n\t\t * The allowable values are 1 (byte-alignment), 2 (rows aligned to even-numbered bytes), 4 (word-alignment), and 8 (rows start on double-word boundaries).\n\t\t * @type {number}\n\t\t * @default 4\n\t\t */\n\t\tthis.unpackAlignment = 4;\n\n\t\t/**\n\t\t * version code increse if texture changed.\n\t\t * if version is still 0, this texture will be skiped.\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.version = 0;\n\t}\n\n\t/**\n\t * Returns a clone of this texture.\n\t * @returns {TextureBase}\n\t */\n\tclone() {\n\t\treturn new this.constructor().copy(this);\n\t}\n\n\t/**\n\t * Copy the given texture into this texture.\n\t * @param {TextureBase} source - The texture to be copied.\n\t * @returns {TextureBase}\n\t */\n\tcopy(source) {\n\t\tthis.userData = cloneJson(source.userData);\n\n\t\tthis.mipmaps = source.mipmaps.slice(0);\n\n\t\tthis.border = source.border;\n\t\tthis.format = source.format;\n\t\tthis.internalformat = source.internalformat;\n\t\tthis.type = source.type;\n\t\tthis.magFilter = source.magFilter;\n\t\tthis.minFilter = source.minFilter;\n\t\tthis.wrapS = source.wrapS;\n\t\tthis.wrapT = source.wrapT;\n\t\tthis.anisotropy = source.anisotropy;\n\t\tthis.compare = source.compare;\n\t\tthis.generateMipmaps = source.generateMipmaps;\n\t\tthis.encoding = source.encoding;\n\t\tthis.flipY = source.flipY;\n\t\tthis.premultiplyAlpha = source.premultiplyAlpha;\n\t\tthis.unpackAlignment = source.unpackAlignment;\n\n\t\tthis.version = source.version;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Dispatches a dispose event.\n\t */\n\tdispose() {\n\t\tthis.dispatchEvent({ type: 'dispose' });\n\n\t\tthis.version = 0;\n\t}\n\n\t/**\n\t * Resize the texture for use as a render target attachment.\n\t * @param {number} width - The new width of the texture.\n\t * @param {number} height - The new height of the texture.\n\t * @param {number} [depth] - The new depth of the texture.\n\t * Only {@link Texture3D} and {@link Texture2DArray} will use this parameter.\n\t * If not specified, the depth will not be changed.\n\t */\n\tresizeAsAttachment(width, height, depth) {}\n\n}\n\n/**\n * This flag can be used for type testing.\n * @readonly\n * @type {boolean}\n * @default true\n */\nTextureBase.prototype.isTexture = true;\n\n/**\n * Creates a 2d texture.\n * @extends TextureBase\n */\nclass Texture2D extends TextureBase {\n\n\tconstructor() {\n\t\tsuper();\n\n\t\t/**\n\t\t * Image data for this texture.\n\t\t * @type {null | HTMLImageElement | HTMLCanvasElement | HTMLVideoElement | ImageBitmap | object}\n\t\t * @default null\n\t\t */\n\t\tthis.image = null;\n\t}\n\n\t/**\n\t * Copy the given 2d texture into this texture.\n\t * @param {Texture2D} source - The 2d texture to be copied.\n\t * @returns {Texture2D}\n\t */\n\tcopy(source) {\n\t\tsuper.copy(source);\n\n\t\tthis.image = source.image;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * @override\n\t */\n\tresizeAsAttachment(width, height) {\n\t\tif (this.image && this.image.rtt) {\n\t\t\tif (this.image.width !== width || this.image.height !== height) {\n\t\t\t\tthis.version++;\n\t\t\t\tthis.image.width = width;\n\t\t\t\tthis.image.height = height;\n\t\t\t}\n\t\t} else {\n\t\t\tthis.version++;\n\t\t\tthis.image = { rtt: true, data: null, width, height };\n\t\t}\n\t}\n\n}\n\n/**\n * This flag can be used for type testing.\n * @readonly\n * @type {boolean}\n * @default true\n */\nTexture2D.prototype.isTexture2D = true;\n\n/**\n * Creates a cube texture.\n * @extends TextureBase\n */\nclass TextureCube extends TextureBase {\n\n\tconstructor() {\n\t\tsuper();\n\n\t\t/**\n\t\t * Images data for this texture.\n\t\t * @type {HTMLImageElement[]}\n\t\t * @default []\n\t\t */\n\t\tthis.images = [];\n\n\t\t/**\n\t\t * @default false\n\t\t */\n\t\tthis.flipY = false;\n\t}\n\n\t/**\n\t * Copy the given cube texture into this texture.\n\t * @param {TextureCube} source - The cube texture to be copied.\n\t * @returns {TextureCube}\n\t */\n\tcopy(source) {\n\t\tsuper.copy(source);\n\n\t\tthis.images = source.images.slice(0);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * @override\n\t */\n\tresizeAsAttachment(width, height) {\n\t\tlet changed = false;\n\n\t\tfor (let i = 0; i < 6; i++) {\n\t\t\tif (this.images[i] && this.images[i].rtt) {\n\t\t\t\tif (this.images[i].width !== width || this.images[i].height !== height) {\n\t\t\t\t\tthis.images[i].width = width;\n\t\t\t\t\tthis.images[i].height = height;\n\t\t\t\t\tchanged = true;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tthis.images[i] = { rtt: true, data: null, width, height };\n\t\t\t\tchanged = true;\n\t\t\t}\n\t\t}\n\n\t\tif (changed) {\n\t\t\tthis.version++;\n\t\t}\n\t}\n\n}\n\n/**\n * This flag can be used for type testing.\n * @readonly\n * @type {boolean}\n * @default true\n */\nTextureCube.prototype.isTextureCube = true;\n\n/**\n * Creates a 3D texture. (WebGL 2.0)\n * @extends TextureBase\n */\nclass Texture3D extends TextureBase {\n\n\tconstructor() {\n\t\tsuper();\n\n\t\t/**\n\t\t * Image data for this texture.\n\t\t * @type {object}\n\t\t */\n\t\tthis.image = { data: new Uint8Array([255, 255, 255, 255, 255, 255, 255, 255]), width: 2, height: 2, depth: 2 };\n\n\t\t/**\n\t\t * This defines how the texture is wrapped in the depth direction.\n\t\t * @type {TEXTURE_WRAP}\n\t\t * @default TEXTURE_WRAP.CLAMP_TO_EDGE\n\t\t */\n\t\tthis.wrapR = TEXTURE_WRAP.CLAMP_TO_EDGE;\n\n\t\t/**\n\t\t * @default PIXEL_FORMAT.RED\n\t\t */\n\t\tthis.format = PIXEL_FORMAT.RED;\n\n\t\t/**\n\t\t * @default PIXEL_TYPE.UNSIGNED_BYTE\n\t\t */\n\t\tthis.type = PIXEL_TYPE.UNSIGNED_BYTE;\n\n\t\t/**\n\t\t * @default TEXTURE_FILTER.NEAREST\n\t\t */\n\t\tthis.magFilter = TEXTURE_FILTER.NEAREST;\n\n\t\t/**\n\t\t * @default TEXTURE_FILTER.NEAREST\n\t\t */\n\t\tthis.minFilter = TEXTURE_FILTER.NEAREST;\n\n\t\t/**\n\t\t * @default false\n\t\t */\n\t\tthis.generateMipmaps = false;\n\n\t\t/**\n\t\t * @default false\n\t\t */\n\t\tthis.flipY = false;\n\n\t\t/**\n\t\t * @default 1\n\t\t */\n\t\tthis.unpackAlignment = 1;\n\t}\n\n\t/**\n\t * Copy the given 3d texture into this texture.\n\t * @param {Texture3D} source - The 3d texture to be copied.\n\t * @returns {Texture3D}\n\t */\n\tcopy(source) {\n\t\tsuper.copy(source);\n\n\t\tthis.image = source.image;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * @override\n\t */\n\tresizeAsAttachment(width, height, depth) {\n\t\tconst resizeDepth = depth !== undefined;\n\n\t\tif (this.image && this.image.rtt) {\n\t\t\tif (\n\t\t\t\tthis.image.width !== width\n\t\t\t\t|| this.image.height !== height\n\t\t\t\t|| (resizeDepth && this.image.depth !== depth)\n\t\t\t) {\n\t\t\t\tthis.version++;\n\t\t\t\tthis.image.width = width;\n\t\t\t\tthis.image.height = height;\n\t\t\t\tif (resizeDepth) this.image.depth = depth;\n\t\t\t}\n\t\t} else {\n\t\t\tthis.version++;\n\t\t\tconst oldDepth = (this.image && this.image.depth) ? this.image.depth : 1;\n\t\t\tthis.image = {\n\t\t\t\trtt: true, data: null, width, height,\n\t\t\t\tdepth: resizeDepth ? depth : oldDepth\n\t\t\t};\n\t\t}\n\t}\n\n}\n\n/**\n * This flag can be used for type testing.\n * @readonly\n * @type {boolean}\n * @default true\n */\nTexture3D.prototype.isTexture3D = true;\n\n/**\n * Creates a 2d texture. (WebGL 2.0)\n * @extends TextureBase\n */\nclass Texture2DArray extends TextureBase {\n\n\tconstructor() {\n\t\tsuper();\n\n\t\t/**\n\t\t * Image data for this texture.\n\t\t * @type {object}\n\t\t * @default null\n\t\t */\n\t\tthis.image = { data: new Uint8Array([255, 255, 255, 255, 255, 255, 255, 255]), width: 2, height: 2, depth: 2 };\n\n\t\t/**\n\t\t * @default PIXEL_FORMAT.RED\n\t\t */\n\t\tthis.format = PIXEL_FORMAT.RED;\n\n\t\t/**\n\t\t * @default TEXTURE_FILTER.NEAREST\n\t\t */\n\t\tthis.magFilter = TEXTURE_FILTER.NEAREST;\n\n\t\t/**\n\t\t * @default TEXTURE_FILTER.NEAREST\n\t\t */\n\t\tthis.minFilter = TEXTURE_FILTER.NEAREST;\n\n\t\t/**\n\t\t * @default false\n\t\t */\n\t\tthis.generateMipmaps = false;\n\n\t\t/**\n\t\t * @default false\n\t\t */\n\t\tthis.flipY = false;\n\n\t\t/**\n\t\t * @default 1\n\t\t */\n\t\tthis.unpackAlignment = 1;\n\n\t\t/**\n\t\t * A set of all layers which need to be updated in the texture.\n\t\t * @type {Set}\n\t\t */\n\t\tthis.layerUpdates = new Set();\n\t}\n\n\t/**\n\t * Copy the given 2d texture into this texture.\n\t * @param {Texture2DArray} source - The 2d texture to be copied.\n\t * @returns {Texture2DArray}\n\t */\n\tcopy(source) {\n\t\tsuper.copy(source);\n\n\t\tthis.image = source.image;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * @override\n\t */\n\tresizeAsAttachment(width, height, depth) {\n\t\tconst resizeDepth = depth !== undefined;\n\n\t\tif (this.image && this.image.rtt) {\n\t\t\tif (\n\t\t\t\tthis.image.width !== width\n\t\t\t\t|| this.image.height !== height\n\t\t\t\t|| (resizeDepth && this.image.depth !== depth)\n\t\t\t) {\n\t\t\t\tthis.version++;\n\t\t\t\tthis.image.width = width;\n\t\t\t\tthis.image.height = height;\n\t\t\t\tif (resizeDepth) this.image.depth = depth;\n\t\t\t}\n\t\t} else {\n\t\t\tthis.version++;\n\t\t\tconst oldDepth = (this.image && this.image.depth) ? this.image.depth : 1;\n\t\t\tthis.image = {\n\t\t\t\trtt: true, data: null, width, height,\n\t\t\t\tdepth: resizeDepth ? depth : oldDepth\n\t\t\t};\n\t\t}\n\t}\n\n}\n\n/**\n * This flag can be used for type testing.\n * @readonly\n * @type {boolean}\n * @default true\n */\nTexture2DArray.prototype.isTexture2DArray = true;\n\n/**\n * Render Target that render to offscreen textures or renderbuffers.\n * @extends RenderTargetBase\n */\nclass OffscreenRenderTarget extends RenderTargetBase {\n\n\t/**\n\t * Create a new OffscreenRenderTarget.\n\t * @param {number} width - The width of the render target.\n\t * @param {number} height - The height of the render target.\n\t */\n\tconstructor(width, height) {\n\t\tsuper(width, height);\n\n\t\t/**\n\t\t * The active layer index for rendering.\n\t\t * For cube render targets, this represents the active cube face.\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.activeLayer = 0;\n\n\t\t/**\n\t\t * The active mipmap level for rendering.\n\t\t * Not supported in WebGL1.\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.activeMipmapLevel = 0;\n\n\t\tthis._attachments = {};\n\t}\n\n\t/**\n\t * Resize the render target to the specified dimensions.\n\t * This will resize all attached attachments.\n\t * @param {number} width - The new width of the render target.\n\t * @param {number} height - The new height of the render target.\n\t * @param {number} [depth] - **DEPRECATED**: Depth parameter is no longer used.\n\t * Individual textures manage their own depth dimensions.\n\t */\n\tresize(width, height, depth) {\n\t\tif (arguments.length > 2) {\n\t\t\tconsole.warn('OffscreenRenderTarget.resize(): The depth parameter is deprecated. ' +\n\t\t\t\t'RenderTarget no longer manages texture depth as it is not required by the rendering backend. ' +\n\t\t\t\t'Use texture.resizeAsAttachment() directly to control texture dimensions.');\n\t\t}\n\n\t\tif (this.width === width && this.height === height) return;\n\n\t\tthis.width = width;\n\t\tthis.height = height;\n\n\t\tthis.dispose(false);\n\n\t\tfor (const attachment in this._attachments) {\n\t\t\tconst target = this._attachments[attachment];\n\n\t\t\tif (target.isTexture) {\n\t\t\t\ttarget.resizeAsAttachment(width, height);\n\t\t\t} else {\n\t\t\t\ttarget.resize(width, height);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Dispose the render target.\n\t * @param {boolean} [disposeAttachments=true] - Whether to dispose attachments as well.\n\t */\n\tdispose(disposeAttachments = true) {\n\t\tthis.dispatchEvent({ type: 'dispose' });\n\n\t\tif (disposeAttachments) {\n\t\t\tfor (const attachment in this._attachments) {\n\t\t\t\tthis._attachments[attachment].dispose();\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Attach a texture(RTT) or renderbuffer to the framebuffer.\n\t * Notice: For now, dynamic Attachment during rendering is not supported.\n\t * @param  {TextureBase|RenderBuffer} target - The texture or renderbuffer to attach.\n\t * @param  {ATTACHMENT} [attachment=ATTACHMENT.COLOR_ATTACHMENT0] - The attachment point.\n\t * @returns {OffscreenRenderTarget} Self for chaining.\n\t */\n\tattach(target, attachment = ATTACHMENT.COLOR_ATTACHMENT0) {\n\t\tif (target.isTexture) {\n\t\t\ttarget.resizeAsAttachment(this.width, this.height);\n\t\t} else {\n\t\t\ttarget.resize(this.width, this.height);\n\t\t}\n\n\t\tthis._attachments[attachment] = target;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Detach a texture(RTT) or renderbuffer.\n\t * @param  {ATTACHMENT} [attachment=ATTACHMENT.COLOR_ATTACHMENT0] - The attachment point to detach.\n\t * @returns {OffscreenRenderTarget} Self for chaining.\n\t */\n\tdetach(attachment = ATTACHMENT.COLOR_ATTACHMENT0) {\n\t\tdelete this._attachments[attachment];\n\t\treturn this;\n\t}\n\n\t/**\n\t * Get the attached attachment at the specified attachment point.\n\t * @param  {ATTACHMENT} [attachment=ATTACHMENT.COLOR_ATTACHMENT0] - The attachment point.\n\t * @returns {TextureBase|RenderBuffer|null} The attached texture or renderbuffer.\n\t */\n\tgetAttachment(attachment = ATTACHMENT.COLOR_ATTACHMENT0) {\n\t\treturn this._attachments[attachment] || null;\n\t}\n\n\t/**\n\t * The main texture attachment which is the first color attachment.\n\t * @type {TextureBase|null}\n\t */\n\tset texture(texture) {\n\t\tif (texture && texture.isTexture) {\n\t\t\tthis.attach(texture, ATTACHMENT.COLOR_ATTACHMENT0);\n\t\t} else {\n\t\t\tthis.detach(ATTACHMENT.COLOR_ATTACHMENT0);\n\t\t}\n\t}\n\n\tget texture() {\n\t\tconst target = this._attachments[ATTACHMENT.COLOR_ATTACHMENT0];\n\t\treturn target && target.isTexture ? target : null;\n\t}\n\n\t/**\n\t * An alias for {@link OffscreenRenderTarget#activeLayer}. Specifically represents\n\t * the currently rendered cube face (0-5) when using cube textures.\n\t * @type {number}\n\t */\n\tset activeCubeFace(value) {\n\t\tthis.activeLayer = value;\n\t}\n\n\tget activeCubeFace() {\n\t\treturn this.activeLayer;\n\t}\n\n\t/**\n\t * Create a simple offscreen render target with a color texture and\n\t * a depth-stencil renderbuffer.\n\t * @param {number} width - The width of the render target.\n\t * @param {number} height - The height of the render target.\n\t * @returns {OffscreenRenderTarget} The created offscreen render target.\n\t */\n\tstatic create2D(width, height) {\n\t\tconst renderTarget = new OffscreenRenderTarget(width, height);\n\t\trenderTarget.attach(new Texture2D(), ATTACHMENT.COLOR_ATTACHMENT0);\n\t\trenderTarget.attach(new RenderBuffer(width, height, PIXEL_FORMAT.DEPTH_STENCIL), ATTACHMENT.DEPTH_STENCIL_ATTACHMENT);\n\t\treturn renderTarget;\n\t}\n\n\t/**\n\t * Create a simple offscreen render target with a cube color texture and\n\t * a depth-stencil renderbuffer.\n\t * @param {number} width - The width of the render target.\n\t * @param {number} height - The height of the render target.\n\t * @returns {OffscreenRenderTarget} The created offscreen render target.\n\t */\n\tstatic createCube(width, height) {\n\t\tconst renderTarget = new OffscreenRenderTarget(width, height);\n\t\trenderTarget.attach(new TextureCube(), ATTACHMENT.COLOR_ATTACHMENT0);\n\t\trenderTarget.attach(new RenderBuffer(width, height, PIXEL_FORMAT.DEPTH_STENCIL), ATTACHMENT.DEPTH_STENCIL_ATTACHMENT);\n\t\treturn renderTarget;\n\t}\n\n\t/**\n\t * Create a simple offscreen render target with a 3D color texture.\n\t * Note: No depth-stencil attachment is created by default.\n\t * @param {number} width - The width of the render target.\n\t * @param {number} height - The height of the render target.\n\t * @param {number} depth - The depth of the 3D texture.\n\t * @returns {OffscreenRenderTarget} The created offscreen render target.\n\t */\n\tstatic create3D(width, height, depth) {\n\t\tconst renderTarget = new OffscreenRenderTarget(width, height);\n\t\tconst texture = new Texture3D();\n\t\ttexture.resizeAsAttachment(width, height, depth);\n\t\trenderTarget.attach(texture, ATTACHMENT.COLOR_ATTACHMENT0);\n\t\treturn renderTarget;\n\t}\n\n\t/**\n\t * Create a simple offscreen render target with a 2D array color texture.\n\t * Note: No depth-stencil attachment is created by default.\n\t * @param {number} width - The width of the render target.\n\t * @param {number} height - The height of the render target.\n\t * @param {number} depth - The depth of the 2D array texture (number of layers).\n\t * @returns {OffscreenRenderTarget} The created offscreen render target.\n\t */\n\tstatic create2DArray(width, height, depth) {\n\t\tconst renderTarget = new OffscreenRenderTarget(width, height);\n\t\tconst texture = new Texture2DArray();\n\t\ttexture.resizeAsAttachment(width, height, depth);\n\t\trenderTarget.attach(texture, ATTACHMENT.COLOR_ATTACHMENT0);\n\t\treturn renderTarget;\n\t}\n\n}\n\n/**\n * This flag can be used for type testing.\n * @readonly\n * @type {boolean}\n * @default true\n */\nOffscreenRenderTarget.prototype.isOffscreenRenderTarget = true;\n\n/**\n * Render Target that render to screen (canvas).\n * @extends RenderTargetBase\n */\nclass ScreenRenderTarget extends RenderTargetBase {\n\n\t/**\n\t * Create a new ScreenRenderTarget.\n\t * @param {HTMLCanvasElement} view - The canvas element which the Render Target rendered to.\n\t */\n\tconstructor(view) {\n\t\tsuper(view.width, view.height);\n\n\t\t/**\n\t\t * The canvas element which the Render Target rendered to.\n\t\t * @type {HTMLCanvasElement}\n\t\t */\n\t\tthis.view = view;\n\t}\n\n\t/**\n\t * Resizes the render target to the specified dimensions.\n\t * This method will set the width and height properties of the canvas.\n\t * @param {number} width - The width of the render target.\n\t * @param {number} height - The height of the render target.\n\t */\n\tresize(width, height) {\n\t\tthis.view.width = width;\n\t\tthis.view.height = height;\n\n\t\tthis.width = width;\n\t\tthis.height = height;\n\t}\n\n\t/**\n\t * Dispatches a dispose event.\n\t */\n\tdispose() {\n\t\tthis.dispatchEvent({ type: 'dispose' });\n\t}\n\n}\n\n/**\n * This flag can be used for type testing.\n * @readonly\n * @type {boolean}\n * @default true\n */\nScreenRenderTarget.prototype.isScreenRenderTarget = true;\n\nlet _querySetId = 0;\n\n/**\n * A QuerySet holds a set of queries of a particular type.\n * @extends EventDispatcher\n */\nclass QuerySet extends EventDispatcher {\n\n\t/**\n\t * Creates a new QuerySet.\n\t * @param {QUERYSET_TYPE} type - The type of the query set.\n\t * @param {number} count - The number of queries in the set.\n\t */\n\tconstructor(type, count) {\n\t\tsuper();\n\n\t\t/**\n\t\t * Unique number for this query set instance.\n\t\t * @readonly\n\t\t * @type {number}\n\t\t */\n\t\tthis.id = _querySetId++;\n\n\t\t/**\n\t\t * The name of the query set.\n\t\t * @type {string}\n\t\t * @default \"\"\n\t\t */\n\t\tthis.name = '';\n\n\t\t/**\n\t\t * The type of the query set.\n\t\t * @readonly\n\t\t * @type {QUERYSET_TYPE}\n\t\t */\n\t\tthis.type = type;\n\n\t\t/**\n\t\t * The max number of queries in the set.\n\t\t * @readonly\n\t\t * @type {number}\n\t\t */\n\t\tthis.count = count;\n\n\t\t/**\n\t\t * Indicates whether the query set operates in conservative mode.\n\t\t * This property only applies to occlusion query sets in WebGL renderer.\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.conservative = true;\n\t}\n\n\t/**\n\t * Dispose this query set.\n\t */\n\tdispose() {\n\t\tthis.dispatchEvent({ type: 'dispose' });\n\t}\n\n}\n\n/**\n * This class is designed to assist with raycasting. Raycasting is used for\n * mouse picking (working out what objects in the 3d space the mouse is over)\n * amongst other things.\n */\nclass Raycaster {\n\n\t/**\n\t * Constructs a new raycaster.\n\t * @param {Vector3} origin — The origin vector where the ray casts from.\n\t * @param {Vector3} direction — The (normalized) direction vector that gives direction to the ray.\n\t */\n\tconstructor(origin, direction) {\n\t\t/**\n\t\t * The ray used for raycasting.\n\t\t * @type {Ray}\n\t\t */\n\t\tthis.ray = new Ray(origin, direction);\n\t}\n\n\t/**\n\t * Updates the ray with a new origin and direction by copying the values from the arguments.\n\t * @param {Vector3} origin — The origin vector where the ray casts from.\n\t * @param {Vector3} direction — The (normalized) direction vector that gives direction to the ray.\n\t */\n\tset(origin, direction) {\n\t\t// direction is assumed to be normalized (for accurate distance calculations)\n\t\tthis.ray.set(origin, direction);\n\t}\n\n\t/**\n\t * Uses the given coordinates and camera to compute a new origin and direction for the internal ray.\n\t * @param {Vector2} coords — 2D coordinates of the mouse, in normalized device coordinates (NDC).\n\t * X and Y components should be between `-1` and `1`.\n\t * @param {Camera} camera — The camera from which the ray should originate.\n\t */\n\tsetFromCamera(coords, camera) {\n\t\tif (camera.projectionMatrix.elements[11] === -1) { // perspective\n\t\t\tthis.ray.origin.setFromMatrixPosition(camera.worldMatrix);\n\t\t\tthis.ray.direction.set(coords.x, coords.y, 0.5).unproject(camera).sub(this.ray.origin).normalize();\n\t\t} else { // orthographic\n\t\t\t// set origin in plane of camera\n\t\t\t// projectionMatrix.elements[14] = (near + far) / (near - far)\n\t\t\tthis.ray.origin.set(coords.x, coords.y, camera.projectionMatrix.elements[14]).unproject(camera);\n\n\t\t\tthis.ray.direction.set(0, 0, -1).transformDirection(camera.worldMatrix);\n\t\t}\n\t}\n\n\t/**\n\t * Checks all intersection between the ray and the object with or without the\n\t * descendants. Intersections are returned sorted by distance, closest first.\n\t * An array of intersections is returned: [ { distance, point, face, faceIndex, object, uv }, ... ]\n\t * @param {Object3D} object — The 3D object to check for intersection with the ray.\n\t * @param {boolean} [recursive=false] — If set to `true`, it also checks all descendants.\n\t * Otherwise it only checks intersection with the object.\n\t * @param {object[]} [intersects=[]] - The target array that holds the result of the method.\n\t * @returns {object[]} An array holding the intersection points.\n\t */\n\tintersectObject(object, recursive = false, intersects = []) {\n\t\tintersect(object, this, intersects, recursive);\n\n\t\tintersects.sort(ascSort);\n\n\t\treturn intersects;\n\t}\n\n\t/**\n\t * Checks all intersection between the ray and the objects with or without\n\t * the descendants. Intersections are returned sorted by distance, closest first.\n\t * An array of intersections is returned: [ { distance, point, face, faceIndex, object, uv }, ... ]\n\t * @param {Object3D[]} objects — The 3D objects to check for intersection with the ray.\n\t * @param {boolean} [recursive=false] — If set to `true`, it also checks all descendants.\n\t * Otherwise it only checks intersection with the object.\n\t * @param {object[]} [intersects=[]] - The target array that holds the result of the method.\n\t * @returns {object[]} An array holding the intersection points.\n\t */\n\tintersectObjects(objects, recursive = false, intersects = []) {\n\t\tfor (let i = 0, l = objects.length; i < l; i++) {\n\t\t\tintersect(objects[i], this, intersects, recursive);\n\t\t}\n\n\t\tintersects.sort(ascSort);\n\n\t\treturn intersects;\n\t}\n\n}\n\nfunction ascSort(a, b) {\n\treturn a.distance - b.distance;\n}\n\nfunction intersect(object, raycaster, intersects, recursive) {\n\tlet propagate = true;\n\n\tconst result = object.raycast(raycaster.ray, intersects);\n\n\tif (result === false) propagate = false;\n\n\tif (propagate === true && recursive === true) {\n\t\tconst children = object.children;\n\n\t\tfor (let i = 0, l = children.length; i < l; i++) {\n\t\t\tintersect(children[i], raycaster, intersects, true);\n\t\t}\n\t}\n}\n\nconst _offsetMatrix = new Matrix4();\n\n/**\n * Use an array of bones to create a skeleton that can be used by a {@link SkinnedMesh}.\n */\nclass Skeleton {\n\n\t/**\n\t * @param {Bone[]} bones\n\t * @param {Matrix4[]} boneInverses\n\t */\n\tconstructor(bones, boneInverses) {\n\t\t/**\n\t\t * The array of bones.\n\t\t * @type {Bone[]}\n\t\t */\n\t\tthis.bones = bones.slice(0);\n\n\t\t/**\n\t\t * An array of Matrix4s that represent the inverse of the worldMatrix of the individual bones.\n\t\t * @type {Matrix4[]}\n\t\t */\n\t\tthis.boneInverses = boneInverses;\n\n\t\t/**\n\t\t * The array buffer holding the bone data.\n\t\t * @type {Float32Array}\n\t\t */\n\t\tthis.boneMatrices = new Float32Array(16 * this.bones.length);\n\n\t\t/**\n\t\t * The {@link Texture2D} holding the bone data when using a vertex texture.\n\t\t * Use vertex texture to update boneMatrices, by that way, we can use more bones on phone.\n\t\t * @type {Texture2D|undefined}\n\t\t * @default undefined\n\t\t */\n\t\tthis.boneTexture = undefined;\n\n\t\tthis._version = 0;\n\t}\n\n\t/**\n\t * Returns the skeleton to the base pose.\n\t */\n\tpose() {\n\t\tconst boneInverses = this.boneInverses;\n\n\t\tfor (let i = 0; i < this.bones.length; i++) {\n\t\t\tconst bone = this.bones[i];\n\t\t\tbone.worldMatrix.copy(boneInverses[i]).invert();\n\t\t}\n\n\t\tfor (let i = 0; i < this.bones.length; i++) {\n\t\t\tconst bone = this.bones[i];\n\t\t\tif (bone.parent && bone.parent.isBone) {\n\t\t\t\tbone.matrix.copy(bone.parent.worldMatrix).invert();\n\t\t\t\tbone.matrix.multiply(bone.worldMatrix);\n\t\t\t} else {\n\t\t\t\tbone.matrix.copy(bone.worldMatrix);\n\t\t\t}\n\n\t\t\tbone.matrix.decompose(bone.position, bone.quaternion, bone.scale);\n\t\t}\n\t}\n\n\t/**\n\t * Clone skeleton.\n\t * @returns {Skeleton}\n\t */\n\tclone() {\n\t\treturn new Skeleton(this.bones, this.boneInverses);\n\t}\n\n\t/**\n\t * Updates the boneMatrices and boneTexture after changing the bones.\n\t * This is called automatically if the skeleton is used with a SkinnedMesh.\n\t * @ignore\n\t */\n\tupdateBones(sceneData) {\n\t\tconst useAnchorMatrix = sceneData.useAnchorMatrix;\n\t\tconst anchorMatrixInverse = sceneData.anchorMatrixInverse;\n\t\tconst boneInverses = this.boneInverses;\n\n\t\tfor (let i = 0; i < this.bones.length; i++) {\n\t\t\tconst bone = this.bones[i];\n\t\t\t_offsetMatrix.multiplyMatrices(bone.worldMatrix, boneInverses[i]);\n\t\t\tif (useAnchorMatrix) {\n\t\t\t\t_offsetMatrix.premultiply(anchorMatrixInverse);\n\t\t\t}\n\t\t\t_offsetMatrix.toArray(this.boneMatrices, i * 16);\n\t\t}\n\n\t\tif (this.boneTexture !== undefined) {\n\t\t\tthis.boneTexture.version++;\n\t\t}\n\t}\n\n\tgenerateBoneTexture() {\n\t\tlet size = MathUtils.nextPowerOfTwoSquareSize(this.bones.length * 4);\n\t\tsize = Math.max(size, 4);\n\n\t\tconst boneMatrices = new Float32Array(size * size * 4);\n\t\tboneMatrices.set(this.boneMatrices);\n\n\t\tconst boneTexture = new Texture2D();\n\t\tboneTexture.image = { data: boneMatrices, width: size, height: size };\n\t\tboneTexture.format = PIXEL_FORMAT.RGBA;\n\t\tboneTexture.type = PIXEL_TYPE.FLOAT;\n\t\tboneTexture.magFilter = TEXTURE_FILTER.NEAREST;\n\t\tboneTexture.minFilter = TEXTURE_FILTER.NEAREST;\n\t\tboneTexture.generateMipmaps = false;\n\t\tboneTexture.flipY = false;\n\n\t\tthis.boneMatrices = boneMatrices;\n\t\tthis.boneTexture = boneTexture;\n\t}\n\n}\n\n/**\n * This light globally illuminates all objects in the scene equally.\n * This light cannot be used to cast shadows as it does not have a direction.\n * @extends Light\n */\nclass AmbientLight extends Light {\n\n\t/**\n\t * @param {number} [color=0xffffff]\n\t * @param {number} [intensity=1]\n\t */\n\tconstructor(color, intensity) {\n\t\tsuper(color, intensity);\n\t}\n\n}\n\n/**\n * This flag can be used for type testing.\n * @readonly\n * @type {boolean}\n * @default true\n */\nAmbientLight.prototype.isAmbientLight = true;\n\n/**\n * Serves as a base class for the other shadow classes.\n * @abstract\n */\nclass LightShadow {\n\n\tconstructor() {\n\t\t/**\n\t\t * The light's view of the world.\n\t\t * This is used to generate a depth map of the scene; objects behind other objects from the light's perspective will be in shadow.\n\t\t * @type {Camera}\n\t\t */\n\t\tthis.camera = new Camera();\n\n\t\t/**\n\t\t * Model to shadow camera space, to compute location and depth in shadow map. Stored in a {@link Matrix4}.\n\t\t * This is computed internally during rendering.\n\t\t * @type {Matrix4}\n\t\t */\n\t\tthis.matrix = new Matrix4();\n\n\t\t/**\n\t\t * Shadow map bias, how much to add or subtract from the normalized depth when deciding whether a surface is in shadow.\n\t\t * Very tiny adjustments here (in the order of 0.0001) may help reduce artefacts in shadows.\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.bias = 0;\n\n\t\t/**\n\t\t * Defines how much the position used to query the shadow map is offset along the object normal.\n\t\t * Increasing this value can be used to reduce shadow acne especially in large scenes where light shines onto geometry at a shallow angle.\n\t\t * The cost is that shadows may appear distorted.\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.normalBias = 0;\n\n\t\t/**\n\t\t * Setting this to values greater than 1 will blur the edges of the shadow.\n\t\t * High values will cause unwanted banding effects in the shadows - a greater mapSize will allow for a higher value to be used here before these effects become visible.\n\t\t * Note that this has no effect if the {@link Object3D#shadowType} is set to PCF or PCSS.\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.radius = 1;\n\n\t\t/**\n\t\t * Shadow camera near.\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.cameraNear = 1;\n\n\t\t/**\n\t\t * Shadow camera far.\n\t\t * @type {number}\n\t\t * @default 500\n\t\t */\n\t\tthis.cameraFar = 500;\n\n\t\t/**\n\t\t * A {@link Vector2} defining the width and height of the shadow map.\n\t\t * Higher values give better quality shadows at the cost of computation time.\n\t\t * Values must be powers of 2.\n\t\t * @type {Vector2}\n\t\t * @default Vector2(512, 512)\n\t\t */\n\t\tthis.mapSize = new Vector2(512, 512);\n\n\t\t/**\n\t\t * Enables automatic updates of the light's shadow.\n\t\t * If you do not require dynamic lighting / shadows, you may set this to false.\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.autoUpdate = true;\n\n\t\t/**\n\t\t * When set to true, shadow maps will be updated in the next ShadowMapPass.render call.\n\t\t * If you have set .autoUpdate to false, you will need to set this property to true and then make a ShadowMapPass.render call to update the light's shadow.\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.needsUpdate = false;\n\n\t\tthis.renderTarget = null;\n\t\tthis.map = null;\n\t\tthis.depthMap = null;\n\t}\n\n\tupdate(light, face) {}\n\n\tupdateMatrix() {\n\t\tconst matrix = this.matrix;\n\t\tconst camera = this.camera;\n\n\t\t// matrix * 0.5 + 0.5, after identity, range is 0 ~ 1 instead of -1 ~ 1\n\t\tmatrix.set(\n\t\t\t0.5, 0.0, 0.0, 0.5,\n\t\t\t0.0, 0.5, 0.0, 0.5,\n\t\t\t0.0, 0.0, 0.5, 0.5,\n\t\t\t0.0, 0.0, 0.0, 1.0\n\t\t);\n\n\t\tmatrix.multiply(camera.projectionMatrix);\n\t\tmatrix.multiply(camera.viewMatrix);\n\t}\n\n\tcopy(source) {\n\t\tthis.camera.copy(source.camera);\n\t\tthis.matrix.copy(source.matrix);\n\n\t\tthis.bias = source.bias;\n\t\tthis.normalBias = source.normalBias;\n\t\tthis.radius = source.radius;\n\n\t\tthis.cameraNear = source.cameraNear;\n\t\tthis.cameraFar = source.cameraFar;\n\n\t\tthis.mapSize.copy(source.mapSize);\n\n\t\treturn this;\n\t}\n\n\tclone() {\n\t\treturn new this.constructor().copy(this);\n\t}\n\n\tprepareDepthMap(_enable, _capabilities) {}\n\n}\n\n/**\n * This is used internally by DirectionalLights for calculating shadows.\n * @extends LightShadow\n */\nclass DirectionalLightShadow extends LightShadow {\n\n\tconstructor() {\n\t\tsuper();\n\n\t\t/**\n\t\t * The cast shadow window size.\n\t\t * @type {number}\n\t\t * @default 500\n\t\t */\n\t\tthis.windowSize = 500;\n\n\t\t/**\n\t\t * Controls the extent to which the shadows fade out at the edge of the frustum.\n\t\t * If the value is greater than 0, the shadow fades out from center to all sides of shadow texture (radial fade out),\n\t\t * if the value is less than 0, the shadow will fade out from the y+ direction (vertical fade out).\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.frustumEdgeFalloff = 0.0;\n\n\t\tthis.renderTarget = OffscreenRenderTarget.create2D(this.mapSize.x, this.mapSize.y);\n\n\t\tconst map = this.renderTarget.texture;\n\t\tmap.generateMipmaps = false;\n\t\tmap.minFilter = TEXTURE_FILTER.NEAREST;\n\t\tmap.magFilter = TEXTURE_FILTER.NEAREST;\n\n\t\tconst depthTexture = new Texture2D();\n\t\tdepthTexture.type = PIXEL_TYPE.UNSIGNED_INT;\n\t\tdepthTexture.format = PIXEL_FORMAT.DEPTH_COMPONENT;\n\t\tdepthTexture.magFilter = TEXTURE_FILTER.LINEAR;\n\t\tdepthTexture.minFilter = TEXTURE_FILTER.LINEAR;\n\t\tdepthTexture.compare = COMPARE_FUNC.LESS;\n\t\tdepthTexture.generateMipmaps = false;\n\n\t\tconst depthBuffer = new RenderBuffer(this.mapSize.x, this.mapSize.y, PIXEL_FORMAT.DEPTH_COMPONENT16);\n\n\t\tthis.renderTarget.detach(ATTACHMENT.DEPTH_STENCIL_ATTACHMENT);\n\t\tthis.renderTarget.attach(depthBuffer, ATTACHMENT.DEPTH_ATTACHMENT);\n\n\t\tthis.map = map;\n\t\tthis.depthMap = depthTexture;\n\n\t\tthis._depthBuffer = depthBuffer;\n\t}\n\n\tupdate(light) {\n\t\tthis._updateCamera(light);\n\n\t\tif (this.mapSize.x !== this.renderTarget.width || this.mapSize.y !== this.renderTarget.height) {\n\t\t\tthis.renderTarget.resize(this.mapSize.x, this.mapSize.y);\n\t\t}\n\t}\n\n\t_updateCamera(light) {\n\t\tconst camera = this.camera;\n\n\t\tcamera.matrix.copy(light.worldMatrix);\n\t\tcamera.matrix.decompose(camera.position, camera.quaternion, camera.scale);\n\t\tcamera.updateMatrix();\n\n\t\tconst halfWindowSize = this.windowSize / 2;\n\t\tcamera.setOrtho(-halfWindowSize, halfWindowSize, -halfWindowSize, halfWindowSize, this.cameraNear, this.cameraFar);\n\t}\n\n\tcopy(source) {\n\t\tsuper.copy(source);\n\n\t\tthis.windowSize = source.windowSize;\n\t\tthis.frustumEdgeFalloff = source.frustumEdgeFalloff;\n\n\t\treturn this;\n\t}\n\n\tprepareDepthMap(enable, capabilities) {\n\t\tconst useDepthMap = enable && capabilities.version >= 2;\n\t\tconst renderTarget = this.renderTarget;\n\t\tconst attachments = renderTarget._attachments;\n\t\tconst depthMapAttached = attachments[ATTACHMENT.DEPTH_ATTACHMENT] === this.depthMap;\n\n\t\tif (useDepthMap === depthMapAttached) return;\n\n\t\tif (useDepthMap) {\n\t\t\tif (capabilities.getExtension('OES_texture_float_linear')) {\n\t\t\t\tthis.depthMap.type = PIXEL_TYPE.FLOAT;\n\t\t\t}\n\n\t\t\trenderTarget.dispose();\n\t\t\trenderTarget.attach(this.depthMap, ATTACHMENT.DEPTH_ATTACHMENT);\n\t\t} else {\n\t\t\trenderTarget.dispose();\n\t\t\trenderTarget.attach(this._depthBuffer, ATTACHMENT.DEPTH_ATTACHMENT);\n\t\t}\n\t}\n\n}\n\n/**\n * A light that gets emitted in a specific direction.\n * This light will behave as though it is infinitely far away and the rays produced from it are all parallel.\n * The common use case for this is to simulate daylight; the sun is far enough away that its position can be considered to be infinite, and all light rays coming from it are parallel.\n * This light can cast shadows - see the {@link DirectionalLightShadow} page for details.\n * @extends Light\n */\nclass DirectionalLight extends Light {\n\n\t/**\n\t * @param {number} [color=0xffffff]\n\t * @param {number} [intensity=1]\n\t */\n\tconstructor(color, intensity) {\n\t\tsuper(color, intensity);\n\n\t\t/**\n\t\t * A {@link DirectionalLightShadow} used to calculate shadows for this light.\n\t\t * @type {DirectionalLightShadow}\n\t\t * @default DirectionalLightShadow()\n\t\t */\n\t\tthis.shadow = new DirectionalLightShadow();\n\t}\n\n\tcopy(source) {\n\t\tsuper.copy(source);\n\n\t\tthis.shadow.copy(source.shadow);\n\n\t\treturn this;\n\t}\n\n}\n\n/**\n * This flag can be used for type testing.\n * @readonly\n * @type {boolean}\n * @default true\n */\nDirectionalLight.prototype.isDirectionalLight = true;\n\n/**\n * A light source positioned directly above the scene, with color fading from the sky color to the ground color.\n * This light cannot be used to cast shadows.\n * @extends Light\n */\nclass HemisphereLight extends Light {\n\n\t/**\n\t * @param {number} [skyColor=0xffffff] - Hexadecimal color of the sky.\n\t * @param {number} [groundColor=0xffffff] - Hexadecimal color of the ground.\n\t * @param {number} [intensity=1] - numeric value of the light's strength/intensity.\n\t */\n\tconstructor(skyColor, groundColor, intensity) {\n\t\tsuper(skyColor, intensity);\n\n\t\t/**\n\t\t * Color of the ground.\n\t\t * @type {Color3}\n\t\t * @default Color3(0xffffff)\n\t\t */\n\t\tthis.groundColor = new Color3(groundColor !== undefined ? groundColor : 0xffffff);\n\t}\n\n\tcopy(source) {\n\t\tsuper.copy(source);\n\n\t\tthis.groundColor.copy(source.groundColor);\n\t}\n\n}\n\n/**\n * This flag can be used for type testing.\n * @readonly\n * @type {boolean}\n * @default true\n */\nHemisphereLight.prototype.isHemisphereLight = true;\n\n/**\n * This is used internally by PointLights for calculating shadows.\n * @extends LightShadow\n */\nclass PointLightShadow extends LightShadow {\n\n\tconstructor() {\n\t\tsuper();\n\n\t\tthis.renderTarget = OffscreenRenderTarget.createCube(this.mapSize.x, this.mapSize.y);\n\n\t\tconst map = this.renderTarget.texture;\n\t\tmap.generateMipmaps = false;\n\t\tmap.minFilter = TEXTURE_FILTER.NEAREST;\n\t\tmap.magFilter = TEXTURE_FILTER.NEAREST;\n\t\tthis.map = map;\n\n\t\tthis._targets = [\n\t\t\tnew Vector3(1, 0, 0), new Vector3(-1, 0, 0), new Vector3(0, 1, 0),\n\t\t\tnew Vector3(0, -1, 0), new Vector3(0, 0, 1), new Vector3(0, 0, -1)\n\t\t];\n\n\t\tthis._ups = [\n\t\t\tnew Vector3(0, -1, 0), new Vector3(0, -1, 0), new Vector3(0, 0, 1),\n\t\t\tnew Vector3(0, 0, -1), new Vector3(0, -1, 0), new Vector3(0, -1, 0)\n\t\t];\n\n\t\tthis._lookTarget = new Vector3();\n\t}\n\n\tupdate(light, face) {\n\t\tthis._updateCamera(light, face);\n\n\t\tif (this.mapSize.x !== this.renderTarget.width || this.mapSize.y !== this.renderTarget.height) {\n\t\t\tthis.renderTarget.resize(this.mapSize.x, this.mapSize.y);\n\t\t}\n\t}\n\n\t_updateCamera(light, face) {\n\t\tconst camera = this.camera;\n\t\tconst lookTarget = this._lookTarget;\n\t\tconst targets = this._targets;\n\t\tconst ups = this._ups;\n\n\t\t// set camera position and lookAt(rotation)\n\t\tcamera.position.setFromMatrixPosition(light.worldMatrix);\n\t\tlookTarget.set(targets[face].x + camera.position.x, targets[face].y + camera.position.y, targets[face].z + camera.position.z);\n\t\tcamera.lookAt(lookTarget, ups[face]);\n\n\t\t// update view matrix\n\t\tcamera.updateMatrix();\n\n\t\t// update projection\n\t\tcamera.setPerspective(90 / 180 * Math.PI, 1, this.cameraNear, this.cameraFar);\n\t}\n\n}\n\n/**\n * A light that gets emitted from a single point in all directions.\n * A common use case for this is to replicate the light emitted from a bare lightbulb.\n * This light can cast shadows - see {@link PointLightShadow} page for details.\n * @extends Light\n */\nclass PointLight extends Light {\n\n\t/**\n\t * @param {number} [color=0xffffff]\n\t * @param {number} [intensity=1]\n\t * @param {number} [distance=200]\n\t * @param {number} [decay=1]\n\t */\n\tconstructor(color, intensity, distance, decay) {\n\t\tsuper(color, intensity);\n\n\t\t/**\n\t\t * The amount the light dims along the distance of the light.\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.decay = (decay !== undefined) ? decay : 1;\n\n\t\t/**\n\t\t * The distance from the light where the intensity is 0.\n\t\t * @type {number}\n\t\t * @default 200\n\t\t */\n\t\tthis.distance = (distance !== undefined) ? distance : 200;\n\n\t\t/**\n\t\t * A {@link PointLightShadow} used to calculate shadows for this light.\n\t\t * @type {PointLightShadow}\n\t\t * @default PointLightShadow()\n\t\t */\n\t\tthis.shadow = new PointLightShadow();\n\t}\n\n\tcopy(source) {\n\t\tsuper.copy(source);\n\n\t\tthis.shadow.copy(source.shadow);\n\n\t\treturn this;\n\t}\n\n}\n\n/**\n * This flag can be used for type testing.\n * @readonly\n * @type {boolean}\n * @default true\n */\nPointLight.prototype.isPointLight = true;\n\n/**\n * This light globally all objects in the scene equally.\n * This light depends on spherical harmonics.\n * @extends Light\n */\nclass SphericalHarmonicsLight extends Light {\n\n\t/**\n\t * Creates a new SphericalHarmonicsLight.\n\t * @param {SphericalHarmonics3} [sh = new SphericalHarmonics3()]\n\t * @param {number} [intensity = 1]\n\t */\n\tconstructor(sh = new SphericalHarmonics3(), intensity = 1) {\n\t\tsuper(undefined, intensity);\n\n\t\t/**\n\t\t * An instance of SphericalHarmonics3.\n\t\t * @type {SphericalHarmonics3}\n\t\t */\n\t\tthis.sh = sh;\n\t}\n\n\tcopy(source) {\n\t\tsuper.copy(source);\n\n\t\tthis.sh.copy(source.sh);\n\n\t\treturn this;\n\t}\n\n}\n\n/**\n * This flag can be used for type testing.\n * @readonly\n * @type {boolean}\n * @default true\n */\nSphericalHarmonicsLight.prototype.isSphericalHarmonicsLight = true;\n\n/**\n * This is used internally by SpotLights for calculating shadows.\n * @extends LightShadow\n */\nclass SpotLightShadow extends LightShadow {\n\n\tconstructor() {\n\t\tsuper();\n\n\t\t/**\n\t\t * Controls the extent to which the shadows fade out at the edge of the frustum.\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.frustumEdgeFalloff = 0.0;\n\n\t\tthis.renderTarget = OffscreenRenderTarget.create2D(this.mapSize.x, this.mapSize.y);\n\n\t\tconst map = this.renderTarget.texture;\n\t\tmap.generateMipmaps = false;\n\t\tmap.minFilter = TEXTURE_FILTER.NEAREST;\n\t\tmap.magFilter = TEXTURE_FILTER.NEAREST;\n\n\t\tconst depthTexture = new Texture2D();\n\t\tdepthTexture.type = PIXEL_TYPE.UNSIGNED_INT;\n\t\tdepthTexture.format = PIXEL_FORMAT.DEPTH_COMPONENT;\n\t\tdepthTexture.magFilter = TEXTURE_FILTER.LINEAR;\n\t\tdepthTexture.minFilter = TEXTURE_FILTER.LINEAR;\n\t\tdepthTexture.compare = COMPARE_FUNC.LESS;\n\t\tdepthTexture.generateMipmaps = false;\n\n\t\tconst depthBuffer = new RenderBuffer(this.mapSize.x, this.mapSize.y, PIXEL_FORMAT.DEPTH_COMPONENT16);\n\n\t\tthis.renderTarget.detach(ATTACHMENT.DEPTH_STENCIL_ATTACHMENT);\n\t\tthis.renderTarget.attach(depthBuffer, ATTACHMENT.DEPTH_ATTACHMENT);\n\n\t\tthis.map = map;\n\t\tthis.depthMap = depthTexture;\n\n\t\tthis._depthBuffer = depthBuffer;\n\t}\n\n\tupdate(light) {\n\t\tthis._updateCamera(light);\n\n\t\tif (this.mapSize.x !== this.renderTarget.width || this.mapSize.y !== this.renderTarget.height) {\n\t\t\tthis.renderTarget.resize(this.mapSize.x, this.mapSize.y);\n\t\t}\n\t}\n\n\t_updateCamera(light) {\n\t\tconst camera = this.camera;\n\n\t\tcamera.matrix.copy(light.worldMatrix);\n\t\tcamera.matrix.decompose(camera.position, camera.quaternion, camera.scale);\n\t\tcamera.updateMatrix();\n\n\t\tcamera.setPerspective(light.angle * 2, 1, this.cameraNear, this.cameraFar);\n\t}\n\n\tcopy(source) {\n\t\tsuper.copy(source);\n\n\t\tthis.frustumEdgeFalloff = source.frustumEdgeFalloff;\n\n\t\treturn this;\n\t}\n\n\tprepareDepthMap(enable, capabilities) {\n\t\tconst useDepthMap = enable && capabilities.version >= 2;\n\t\tconst renderTarget = this.renderTarget;\n\t\tconst attachments = renderTarget._attachments;\n\t\tconst depthMapAttached = attachments[ATTACHMENT.DEPTH_ATTACHMENT] === this.depthMap;\n\n\t\tif (useDepthMap === depthMapAttached) return;\n\n\t\tif (useDepthMap) {\n\t\t\tif (capabilities.getExtension('OES_texture_float_linear')) {\n\t\t\t\tthis.depthMap.type = PIXEL_TYPE.FLOAT;\n\t\t\t}\n\n\t\t\trenderTarget.dispose();\n\t\t\trenderTarget.attach(this.depthMap, ATTACHMENT.DEPTH_ATTACHMENT);\n\t\t} else {\n\t\t\trenderTarget.dispose();\n\t\t\trenderTarget.attach(this._depthBuffer, ATTACHMENT.DEPTH_ATTACHMENT);\n\t\t}\n\t}\n\n}\n\n/**\n * This light gets emitted from a single point in one direction, along a cone that increases in size the further from the light it gets.\n * This light can cast shadows - see the {@link SpotLightShadow} page for details.\n * @extends Light\n */\nclass SpotLight extends Light {\n\n\t/**\n\t * @param {number} [color=0xffffff]\n\t * @param {number} [intensity=1]\n\t * @param {number} [distance=200]\n\t * @param {number} [angle=Math.PI/6]\n\t * @param {number} [penumbra=0]\n\t * @param {number} [decay=1]\n\t */\n\tconstructor(color, intensity, distance, angle, penumbra, decay) {\n\t\tsuper(color, intensity);\n\n\t\t/**\n\t\t * The amount the light dims along the distance of the light.\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.decay = (decay !== undefined) ? decay : 1;\n\n\t\t/**\n\t\t * The distance from the light where the intensity is 0.\n\t\t * @type {number}\n\t\t * @default 200\n\t\t */\n\t\tthis.distance = (distance !== undefined) ? distance : 200;\n\n\t\t/**\n\t\t * Percent of the spotlight cone that is attenuated due to penumbra.\n\t\t * Takes values between zero and 1.\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.penumbra = (penumbra !== undefined) ? penumbra : 0;\n\n\t\t/**\n\t\t * Maximum extent of the spotlight, in radians, from its direction.\n\t\t * Should be no more than Math.PI/2.\n\t\t * @type {number}\n\t\t * @default Math.PI/6\n\t\t */\n\t\tthis.angle = (angle !== undefined) ? angle : Math.PI / 6;\n\n\t\t/**\n\t\t * A {@link SpotLightShadow} used to calculate shadows for this light.\n\t\t * @type {SpotLightShadow}\n\t\t * @default SpotLightShadow()\n\t\t */\n\t\tthis.shadow = new SpotLightShadow();\n\t}\n\n\tcopy(source) {\n\t\tsuper.copy(source);\n\n\t\tthis.shadow.copy(source.shadow);\n\n\t\treturn this;\n\t}\n\n}\n\n/**\n * This flag can be used for type testing.\n * @readonly\n * @type {boolean}\n * @default true\n */\nSpotLight.prototype.isSpotLight = true;\n\n/**\n * A bone which is part of a Skeleton.\n * The skeleton in turn is used by the SkinnedMesh.\n * Bones are almost identical to a blank Object3D.\n * Bone acturely is a joint.\n * The position means joint position.\n * Mesh transform is based this joint space.\n * @extends Object3D\n */\nclass Bone extends Object3D {\n\n\tconstructor() {\n\t\tsuper();\n\t}\n\n}\n\n/**\n * This flag can be used for type testing.\n * @readonly\n * @type {boolean}\n * @default true\n */\nBone.prototype.isBone = true;\n\n/**\n * A mesh that has a {@link Skeleton} with bones that can then be used to animate the vertices of the geometry.\n * The material must support skinning.\n * @extends Mesh\n */\nclass SkinnedMesh extends Mesh {\n\n\tconstructor(geometry, material) {\n\t\tsuper(geometry, material);\n\n\t\t/**\n\t\t * Skeleton created from the bones of the Geometry.\n\t\t * @type {Skeleton}\n\t\t */\n\t\tthis.skeleton = undefined;\n\n\t\t/**\n\t\t * Either \"attached\" or \"detached\".\n\t\t * \"attached\" uses the {@link SkinnedMesh#worldMatrix} property for the base transform matrix of the bones.\n\t\t * \"detached\" uses the {@link SkinnedMesh#bindMatrix}.\n\t\t * @type {string}\n\t\t * @default \"attached\"\n\t\t */\n\t\tthis.bindMode = 'attached';\n\n\t\t/**\n\t\t * The base matrix that is used for the bound bone transforms.\n\t\t * @type {Matrix4}\n\t\t */\n\t\tthis.bindMatrix = new Matrix4();\n\n\t\t/**\n\t\t * The base matrix that is used for resetting the bound bone transforms.\n\t\t * @type {Matrix4}\n\t\t */\n\t\tthis.bindMatrixInverse = new Matrix4();\n\t}\n\n\t/**\n\t * Bind a skeleton to the skinned mesh.\n\t * The bindMatrix gets saved to .bindMatrix property and the .bindMatrixInverse gets calculated.\n\t * @param {Skeleton} skeleton - Skeleton created from a Bones tree.\n\t * @param {Matrix4} [bindMatrix] - Matrix4 that represents the base transform of the skeleton.\n\t */\n\tbind(skeleton, bindMatrix) {\n\t\tthis.skeleton = skeleton;\n\n\t\tif (bindMatrix === undefined) {\n\t\t\tthis.updateMatrix();\n\n\t\t\tbindMatrix = this.worldMatrix;\n\t\t}\n\n\t\tthis.bindMatrix.copy(bindMatrix);\n\t\tthis.bindMatrixInverse.copy(bindMatrix).invert();\n\t}\n\n\tupdateMatrix(force) {\n\t\tsuper.updateMatrix(force);\n\n\t\tif (this.bindMode === 'attached') {\n\t\t\tthis.bindMatrixInverse.copy(this.worldMatrix).invert();\n\t\t} else if (this.bindMode === 'detached') {\n\t\t\tthis.bindMatrixInverse.copy(this.bindMatrix).invert();\n\t\t} else {\n\t\t\tconsole.warn('SkinnedMesh: Unrecognized bindMode: ' + this.bindMode);\n\t\t}\n\t}\n\n\tcopy(source) {\n\t\tsuper.copy(source);\n\n\t\tthis.bindMode = source.bindMode;\n\t\tthis.bindMatrix.copy(source.bindMatrix);\n\t\tthis.bindMatrixInverse.copy(source.bindMatrixInverse);\n\n\t\tthis.skeleton = source.skeleton;\n\n\t\treturn this;\n\t}\n\n\tgetVertexPosition(index, target) {\n\t\tsuper.getVertexPosition(index, target);\n\n\t\tthis.applyBoneTransform(index, target);\n\n\t\treturn target;\n\t}\n\n\t/**\n\t * Applies the bone transform associated with the given index to the given position vector.\n\t * Returns the updated vector.\n\t * @param {number} index - The index of the vertex.\n\t * @param {Vector3} target - The target vector.\n\t * @returns {Vector3} The target vector.\n\t */\n\tapplyBoneTransform(index, target) {\n\t\tconst skeleton = this.skeleton;\n\t\tconst geometry = this.geometry;\n\n\t\tconst skinIndex = geometry.attributes.skinIndex;\n\t\tconst skinWeight = geometry.attributes.skinWeight;\n\n\t\t_skinIndex.fromArray(skinIndex.buffer.array, index * skinIndex.size);\n\t\t_skinWeight.fromArray(skinWeight.buffer.array, index * skinWeight.size);\n\n\t\t_basePosition.copy(target).applyMatrix4(this.bindMatrix);\n\n\t\ttarget.set(0, 0, 0);\n\n\t\tfor (let i = 0; i < 4; i++) {\n\t\t\tconst weight = getComponent(_skinWeight, i);\n\n\t\t\tif (weight < Number.EPSILON) continue;\n\n\t\t\tconst boneIndex = getComponent(_skinIndex, i);\n\n\t\t\tif (!skeleton.bones[boneIndex]) continue;\n\n\t\t\t_matrix.multiplyMatrices(skeleton.bones[boneIndex].worldMatrix, skeleton.boneInverses[boneIndex]);\n\t\t\ttarget.addScaledVector(_vector.copy(_basePosition).applyMatrix4(_matrix), weight);\n\t\t}\n\n\t\treturn target.applyMatrix4(this.bindMatrixInverse);\n\t}\n\n}\n\n/**\n * This flag can be used for type testing.\n * @readonly\n * @type {boolean}\n * @default true\n */\nSkinnedMesh.prototype.isSkinnedMesh = true;\n\nconst _basePosition = new Vector3();\nconst _skinIndex = new Vector4();\nconst _skinWeight = new Vector4();\n\nconst _vector = new Vector3();\nconst _matrix = new Matrix4();\n\nfunction getComponent(vec, index) {\n\tswitch (index) {\n\t\tcase 0: return vec.x;\n\t\tcase 1: return vec.y;\n\t\tcase 2: return vec.z;\n\t\tcase 3: return vec.w;\n\t\tdefault: throw new Error('index is out of range: ' + index);\n\t}\n}\n\nvar alphaTest_frag = \"#ifdef ALPHATEST\\n\\tif (outColor.a < u_AlphaTest) discard;\\n\\toutColor.a = u_Opacity;\\n#endif\";\n\nvar alphaTest_pars_frag = \"#ifdef ALPHATEST\\n\\tuniform float u_AlphaTest;\\n#endif\";\n\nvar aoMap_pars_frag = \"#ifdef USE_AOMAP\\n\\tuniform sampler2D aoMap;\\n\\tuniform float aoMapIntensity;\\n\\tvarying vec2 vAOMapUV;\\n#endif\";\n\nvar aoMap_pars_vert = \"#ifdef USE_AOMAP\\n\\tuniform mat3 aoMapUVTransform;\\n\\tvarying vec2 vAOMapUV;\\n#endif\";\n\nvar aoMap_vert = \"#ifdef USE_AOMAP\\n\\tvAOMapUV = (aoMapUVTransform * vec3(AOMAP_UV, 1.)).xy;\\n#endif\";\n\nvar aoMap_frag = \"\\n#ifdef USE_AOMAP\\n    float ambientOcclusion = (texture2D(aoMap, vAOMapUV).r - 1.0) * aoMapIntensity + 1.0;\\n    \\n    reflectedLight.indirectDiffuse *= ambientOcclusion;\\n    #if defined(USE_ENV_MAP) && defined(USE_PBR)\\n        float dotNV = saturate(dot(N, V));\\n        reflectedLight.indirectSpecular *= computeSpecularOcclusion(dotNV, ambientOcclusion, roughness);\\n    #endif\\n#endif\";\n\nvar begin_frag = \"vec4 outColor = vec4(u_Color, u_Opacity);\";\n\nvar begin_vert = \"vec3 transformed = vec3(a_Position);\\nvec3 objectNormal = vec3(a_Normal);\\n#ifdef USE_TANGENT\\n    vec3 objectTangent = vec3(a_Tangent.xyz);\\n#endif\";\n\nvar bsdfs = \"\\nvec3 BRDF_Diffuse_Lambert(vec3 diffuseColor) {\\n    return RECIPROCAL_PI * diffuseColor;\\n}\\nvec3 F_Schlick(const in vec3 specularColor, const in float dotLH) {\\n\\tfloat fresnel = exp2((-5.55473 * dotLH - 6.98316) * dotLH);\\n\\treturn (1.0 - specularColor) * fresnel + specularColor;\\n}\\nfloat D_BlinnPhong(const in float shininess, const in float dotNH) {\\n\\treturn RECIPROCAL_PI * (shininess * 0.5 + 1.0) * pow(dotNH, shininess);\\n}\\nfloat G_BlinnPhong_Implicit() {\\n\\treturn 0.25;\\n}\\nvec3 BRDF_Specular_BlinnPhong(vec3 specularColor, vec3 N, vec3 L, vec3 V, float shininess) {\\n    vec3 H = normalize(L + V);\\n    float dotNH = saturate(dot(N, H));\\n    float dotLH = saturate(dot(L, H));\\n    vec3 F = F_Schlick(specularColor, dotLH);\\n    float G = G_BlinnPhong_Implicit();\\n    float D = D_BlinnPhong(shininess, dotNH);\\n    return F * G * D;\\n}\\nfloat D_GGX(const in float alpha, const in float dotNH) {\\n\\tfloat a2 = pow2(alpha);\\n\\tfloat denom = pow2(dotNH) * (a2 - 1.0) + 1.0;\\treturn RECIPROCAL_PI * a2 / pow2(denom);\\n}\\nfloat G_GGX_SmithCorrelated(const in float alpha, const in float dotNL, const in float dotNV) {\\n\\tfloat a2 = pow2(alpha);\\n\\tfloat gv = dotNL * sqrt(a2 + (1.0 - a2) * pow2(dotNV));\\n\\tfloat gl = dotNV * sqrt(a2 + (1.0 - a2) * pow2(dotNL));\\n\\treturn 0.5 / max(gv + gl, EPSILON);\\n}\\nvec3 BRDF_Specular_GGX(vec3 specularColor, vec3 N, vec3 L, vec3 V, float roughness) {\\n\\tfloat alpha = pow2(roughness);\\n\\tvec3 H = normalize(L + V);\\n\\tfloat dotNL = saturate(dot(N, L));\\n\\tfloat dotNV = saturate(dot(N, V));\\n\\tfloat dotNH = saturate(dot(N, H));\\n\\tfloat dotLH = saturate(dot(L, H));\\n\\tvec3 F = F_Schlick(specularColor, dotLH);\\n\\tfloat G = G_GGX_SmithCorrelated(alpha, dotNL, dotNV);\\n\\tfloat D = D_GGX(alpha, dotNH);\\n\\treturn F * G * D;\\n}\\nvec2 integrateSpecularBRDF(const in float dotNV, const in float roughness) {\\n\\tconst vec4 c0 = vec4(-1, -0.0275, -0.572, 0.022);\\n\\tconst vec4 c1 = vec4(1, 0.0425, 1.04, -0.04);\\n\\tvec4 r = roughness * c0 + c1;\\n\\tfloat a004 = min(r.x * r.x, exp2(-9.28 * dotNV)) * r.x + r.y;\\n\\treturn vec2(-1.04, 1.04) * a004 + r.zw;\\n}\\nvec3 F_Schlick_RoughnessDependent(const in vec3 F0, const in float dotNV, const in float roughness) {\\n\\tfloat fresnel = exp2((-5.55473 * dotNV - 6.98316) * dotNV);\\n\\tvec3 Fr = max(vec3(1.0 - roughness), F0) - F0;\\n\\treturn Fr * fresnel + F0;\\n}\\nvec3 BRDF_Specular_GGX_Environment(const in vec3 N, const in vec3 V, const in vec3 specularColor, const in float roughness) {\\n\\tfloat dotNV = saturate(dot(N, V));\\n\\tvec2 brdf = integrateSpecularBRDF(dotNV, roughness);\\n\\treturn specularColor * brdf.x + brdf.y;\\n}\\nvoid BRDF_Specular_Multiscattering_Environment(const in vec3 N, const in vec3 V, const in vec3 specularColor, const in float roughness, inout vec3 singleScatter, inout vec3 multiScatter) {\\n\\tfloat dotNV = saturate(dot(N, V));\\n\\tvec3 F = F_Schlick_RoughnessDependent(specularColor, dotNV, roughness);\\n\\tvec2 brdf = integrateSpecularBRDF(dotNV, roughness);\\n\\tvec3 FssEss = F * brdf.x + brdf.y;\\n\\tfloat Ess = brdf.x + brdf.y;\\n\\tfloat Ems = 1.0 - Ess;\\n\\tvec3 Favg = specularColor + (1.0 - specularColor) * 0.047619;\\tvec3 Fms = FssEss * Favg / (1.0 - Ems * Favg);\\n\\tsingleScatter += FssEss;\\n\\tmultiScatter += Fms * Ems;\\n}\";\n\nvar bumpMap_pars_frag = \"#ifdef USE_BUMPMAP\\n\\tuniform sampler2D bumpMap;\\n\\tuniform float bumpScale;\\n\\tvec2 dHdxy_fwd(vec2 uv) {\\n\\t\\tvec2 dSTdx = dFdx( uv );\\n\\t\\tvec2 dSTdy = dFdy( uv );\\n\\t\\tfloat Hll = bumpScale * texture2D( bumpMap, uv ).x;\\n\\t\\tfloat dBx = bumpScale * texture2D( bumpMap, uv + dSTdx ).x - Hll;\\n\\t\\tfloat dBy = bumpScale * texture2D( bumpMap, uv + dSTdy ).x - Hll;\\n\\t\\treturn vec2( dBx, dBy );\\n\\t}\\n\\tvec3 perturbNormalArb( vec3 surf_pos, vec3 surf_norm, vec2 dHdxy) {\\n\\t\\tvec3 vSigmaX = vec3( dFdx( surf_pos.x ), dFdx( surf_pos.y ), dFdx( surf_pos.z ) );\\n\\t\\tvec3 vSigmaY = vec3( dFdy( surf_pos.x ), dFdy( surf_pos.y ), dFdy( surf_pos.z ) );\\n\\t\\tvec3 vN = surf_norm;\\n\\t\\tvec3 R1 = cross( vSigmaY, vN );\\n\\t\\tvec3 R2 = cross( vN, vSigmaX );\\n\\t\\tfloat fDet = dot( vSigmaX, R1 );\\n\\t\\tfDet *= ( float( gl_FrontFacing ) * 2.0 - 1.0 );\\n\\t\\tvec3 vGrad = sign( fDet ) * ( dHdxy.x * R1 + dHdxy.y * R2 );\\n\\t\\treturn normalize( abs( fDet ) * surf_norm - vGrad );\\n\\t}\\n#endif\";\n\nvar clippingPlanes_frag = \"\\n#if NUM_CLIPPING_PLANES > 0\\n    vec4 plane;\\n    #pragma unroll_loop_start\\n    for (int i = 0; i < NUM_CLIPPING_PLANES; i++) {\\n        plane = clippingPlanes[i];\\n        if ( dot( -v_modelPos, plane.xyz ) > plane.w ) discard;\\n    }\\n    #pragma unroll_loop_end\\n#endif\";\n\nvar clippingPlanes_pars_frag = \"#if NUM_CLIPPING_PLANES > 0\\n    uniform vec4 clippingPlanes[ NUM_CLIPPING_PLANES ];\\n#endif\";\n\nvar color_frag = \"#ifdef USE_VCOLOR_RGB\\n    outColor.rgb *= v_Color;\\n#endif\\n#ifdef USE_VCOLOR_RGBA\\n    outColor *= v_Color;\\n#endif\";\n\nvar color_pars_frag = \"#ifdef USE_VCOLOR_RGB\\n    varying vec3 v_Color;\\n#endif\\n#ifdef USE_VCOLOR_RGBA\\n    varying vec4 v_Color;\\n#endif\";\n\nvar color_pars_vert = \"#ifdef USE_VCOLOR_RGB\\n    attribute vec3 a_Color;\\n    varying vec3 v_Color;\\n#endif\\n#ifdef USE_VCOLOR_RGBA\\n    attribute vec4 a_Color;\\n    varying vec4 v_Color;\\n#endif\";\n\nvar color_vert = \"#if defined(USE_VCOLOR_RGB) || defined(USE_VCOLOR_RGBA)\\n    v_Color = a_Color;\\n#endif\";\n\nvar common_frag = \"uniform mat4 u_View;\\nuniform float u_Opacity;\\nuniform vec3 u_Color;\\nuniform vec3 u_CameraPosition;\\nbool isPerspectiveMatrix( mat4 m ) {\\n\\treturn m[ 2 ][ 3 ] == - 1.0;\\n}\\nstruct ReflectedLight {\\n\\tvec3 directDiffuse;\\n\\tvec3 directSpecular;\\n\\tvec3 indirectDiffuse;\\n\\tvec3 indirectSpecular;\\n};\";\n\nvar common_vert = \"attribute vec3 a_Position;\\nattribute vec3 a_Normal;\\n#ifdef USE_TANGENT\\n\\tattribute vec4 a_Tangent;\\n#endif\\n#include <transpose>\\n#include <inverse>\\nuniform mat4 u_Projection;\\nuniform mat4 u_View;\\nuniform mat4 u_Model;\\nuniform mat4 u_ProjectionView;\\nuniform vec3 u_CameraPosition;\\n#define EPSILON 1e-6\\n#ifdef USE_MORPHTARGETS\\n    attribute vec3 morphTarget0;\\n    attribute vec3 morphTarget1;\\n    attribute vec3 morphTarget2;\\n    attribute vec3 morphTarget3;\\n    #ifdef USE_MORPHNORMALS\\n    \\tattribute vec3 morphNormal0;\\n    \\tattribute vec3 morphNormal1;\\n    \\tattribute vec3 morphNormal2;\\n    \\tattribute vec3 morphNormal3;\\n    #else\\n    \\tattribute vec3 morphTarget4;\\n    \\tattribute vec3 morphTarget5;\\n    \\tattribute vec3 morphTarget6;\\n    \\tattribute vec3 morphTarget7;\\n    #endif\\n#endif\\nbool isPerspectiveMatrix( mat4 m ) {\\n\\treturn m[ 2 ][ 3 ] == - 1.0;\\n}\";\n\nvar diffuseMap_frag = \"#ifdef USE_DIFFUSE_MAP\\n    outColor *= mapTexelToLinear(texture2D(diffuseMap, vDiffuseMapUV));\\n#endif\";\n\nvar diffuseMap_pars_frag = \"#ifdef USE_DIFFUSE_MAP\\n    uniform sampler2D diffuseMap;\\n    varying vec2 vDiffuseMapUV;\\n#endif\";\n\nvar diffuseMap_vert = \"#ifdef USE_DIFFUSE_MAP\\n    vDiffuseMapUV = (uvTransform * vec3(DIFFUSEMAP_UV, 1.)).xy;\\n#endif\";\n\nvar diffuseMap_pars_vert = \"#ifdef USE_DIFFUSE_MAP\\n    varying vec2 vDiffuseMapUV;\\n#endif\";\n\nvar emissiveMap_frag = \"#ifdef USE_EMISSIVEMAP\\n\\tvec4 emissiveColor = emissiveMapTexelToLinear(texture2D(emissiveMap, vEmissiveMapUV));\\n\\ttotalEmissiveRadiance *= emissiveColor.rgb;\\n#endif\";\n\nvar emissiveMap_pars_frag = \"#ifdef USE_EMISSIVEMAP\\n\\tuniform sampler2D emissiveMap;\\n\\tvarying vec2 vEmissiveMapUV;\\n#endif\";\n\nvar emissiveMap_vert = \"#ifdef USE_EMISSIVEMAP\\n\\tvEmissiveMapUV = (emissiveMapUVTransform * vec3(EMISSIVEMAP_UV, 1.)).xy;\\n#endif\";\n\nvar emissiveMap_pars_vert = \"#ifdef USE_EMISSIVEMAP\\n\\tuniform mat3 emissiveMapUVTransform;\\n\\tvarying vec2 vEmissiveMapUV;\\n#endif\";\n\nvar encodings_frag = \"gl_FragColor = linearToOutputTexel(gl_FragColor);\";\n\nvar encodings_pars_frag = \"vec4 LinearToLinear(in vec4 value) {\\n\\treturn value;\\n}\\nvec4 GammaToLinear(in vec4 value, in float gammaFactor) {\\n\\treturn vec4(pow(value.xyz, vec3(gammaFactor)), value.w);\\n}\\nvec4 LinearToGamma(in vec4 value, in float gammaFactor) {\\n\\treturn vec4(pow(value.xyz, vec3(1.0 / gammaFactor)), value.w);\\n}\\nvec4 sRGBToLinear(in vec4 value) {\\n\\treturn vec4(mix(pow(value.rgb * 0.9478672986 + vec3(0.0521327014), vec3(2.4)), value.rgb * 0.0773993808, vec3(lessThanEqual(value.rgb, vec3(0.04045)))), value.w);\\n}\\nvec4 LinearTosRGB(in vec4 value) {\\n\\treturn vec4(mix(pow(value.rgb, vec3(0.41666)) * 1.055 - vec3(0.055), value.rgb * 12.92, vec3(lessThanEqual(value.rgb, vec3(0.0031308)))), value.w);\\n}\";\n\nvar end_frag = \"gl_FragColor = outColor;\";\n\nvar envMap_frag = \"#ifdef USE_ENV_MAP\\n    vec3 envDir;\\n    #ifdef USE_VERTEX_ENVDIR\\n        envDir = v_EnvDir;\\n    #else\\n        envDir = reflect(normalize(v_modelPos - u_CameraPosition), N);\\n    #endif\\n    vec4 envColor = textureCube(envMap, vec3(envMapParams.z * envDir.x, envDir.yz));\\n    envColor = envMapTexelToLinear( envColor );\\n    #ifdef ENVMAP_BLENDING_MULTIPLY\\n\\t\\toutColor = mix(outColor, envColor * outColor, envMapParams.y);\\n\\t#elif defined( ENVMAP_BLENDING_MIX )\\n\\t\\toutColor = mix(outColor, envColor, envMapParams.y);\\n\\t#elif defined( ENVMAP_BLENDING_ADD )\\n\\t\\toutColor += envColor * envMapParams.y;\\n\\t#endif\\n#endif\";\n\nvar envMap_pars_frag = \"#ifdef USE_ENV_MAP\\n    #ifdef USE_VERTEX_ENVDIR\\n        varying vec3 v_EnvDir;\\n    #endif\\n    uniform samplerCube envMap;\\n    uniform vec3 envMapParams;\\n    uniform int maxMipLevel;\\n#endif\";\n\nvar envMap_pars_vert = \"#ifdef USE_ENV_MAP\\n    #ifdef USE_VERTEX_ENVDIR\\n        varying vec3 v_EnvDir;\\n    #endif\\n#endif\";\n\nvar envMap_vert = \"\\n#ifdef USE_ENV_MAP\\n    #ifdef USE_VERTEX_ENVDIR\\n        vec3 transformedNormal = (transposeMat4(inverseMat4(u_Model)) * vec4(objectNormal, 0.0)).xyz;\\n        transformedNormal = normalize(transformedNormal);\\n        v_EnvDir = reflect(normalize(worldPosition.xyz - u_CameraPosition), transformedNormal);\\n    #endif\\n#endif\";\n\nvar fog_frag = \"#ifdef USE_FOG\\n    float depth = gl_FragCoord.z / gl_FragCoord.w;\\n    #ifdef USE_EXP2_FOG\\n        float fogFactor = 1.0 - exp(-u_FogDensity * u_FogDensity * depth * depth);\\n    #else\\n        float fogFactor = smoothstep(u_FogNear, u_FogFar, depth);\\n    #endif\\n    gl_FragColor.rgb = mix(gl_FragColor.rgb, u_FogColor, fogFactor);\\n#endif\";\n\nvar fog_pars_frag = \"#ifdef USE_FOG\\n    uniform vec3 u_FogColor;\\n    #ifdef USE_EXP2_FOG\\n        uniform float u_FogDensity;\\n    #else\\n        uniform float u_FogNear;\\n        uniform float u_FogFar;\\n    #endif\\n#endif\";\n\nvar inverse = \"mat4 inverseMat4(mat4 m) {\\n    float\\n    a00 = m[0][0], a01 = m[0][1], a02 = m[0][2], a03 = m[0][3],\\n    a10 = m[1][0], a11 = m[1][1], a12 = m[1][2], a13 = m[1][3],\\n    a20 = m[2][0], a21 = m[2][1], a22 = m[2][2], a23 = m[2][3],\\n    a30 = m[3][0], a31 = m[3][1], a32 = m[3][2], a33 = m[3][3],\\n    b00 = a00 * a11 - a01 * a10,\\n    b01 = a00 * a12 - a02 * a10,\\n    b02 = a00 * a13 - a03 * a10,\\n    b03 = a01 * a12 - a02 * a11,\\n    b04 = a01 * a13 - a03 * a11,\\n    b05 = a02 * a13 - a03 * a12,\\n    b06 = a20 * a31 - a21 * a30,\\n    b07 = a20 * a32 - a22 * a30,\\n    b08 = a20 * a33 - a23 * a30,\\n    b09 = a21 * a32 - a22 * a31,\\n    b10 = a21 * a33 - a23 * a31,\\n    b11 = a22 * a33 - a23 * a32,\\n    det = b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06;\\n    return mat4(\\n        a11 * b11 - a12 * b10 + a13 * b09,\\n        a02 * b10 - a01 * b11 - a03 * b09,\\n        a31 * b05 - a32 * b04 + a33 * b03,\\n        a22 * b04 - a21 * b05 - a23 * b03,\\n        a12 * b08 - a10 * b11 - a13 * b07,\\n        a00 * b11 - a02 * b08 + a03 * b07,\\n        a32 * b02 - a30 * b05 - a33 * b01,\\n        a20 * b05 - a22 * b02 + a23 * b01,\\n        a10 * b10 - a11 * b08 + a13 * b06,\\n        a01 * b08 - a00 * b10 - a03 * b06,\\n        a30 * b04 - a31 * b02 + a33 * b00,\\n        a21 * b02 - a20 * b04 - a23 * b00,\\n        a11 * b07 - a10 * b09 - a12 * b06,\\n        a00 * b09 - a01 * b07 + a02 * b06,\\n        a31 * b01 - a30 * b03 - a32 * b00,\\n        a20 * b03 - a21 * b01 + a22 * b00) / det;\\n}\";\n\nvar light_frag = \"\\n#if (defined(USE_PHONG) || defined(USE_PBR))\\n    vec3 V = normalize(u_CameraPosition - v_modelPos);\\n#endif\\n#ifdef USE_PBR\\n    #ifdef USE_PBR2\\n        vec3 diffuseColor = outColor.xyz;\\n        vec3 specularColor = specularFactor.xyz;\\n        float roughness = max(1.0 - glossinessFactor, 0.0525);\\n    #else\\n        vec3 diffuseColor = outColor.xyz * (1.0 - metalnessFactor);\\n        vec3 specularColor = mix(vec3(0.04), outColor.xyz, metalnessFactor);\\n        float roughness = max(roughnessFactor, 0.0525);\\n    #endif\\n    vec3 dxy = max(abs(dFdx(geometryNormal)), abs(dFdy(geometryNormal)));\\n    float geometryRoughness = max(max(dxy.x, dxy.y), dxy.z);\\n    roughness += geometryRoughness;\\n    roughness = min(roughness, 1.0);\\n    #ifdef USE_CLEARCOAT\\n        float clearcoat = u_Clearcoat;\\n        float clearcoatRoughness = u_ClearcoatRoughness;\\n        #ifdef USE_CLEARCOATMAP\\n\\t\\t    clearcoat *= texture2D(clearcoatMap, v_Uv).x;\\n        #endif\\n        #ifdef USE_CLEARCOAT_ROUGHNESSMAP\\n\\t\\t    clearcoatRoughness *= texture2D(clearcoatRoughnessMap, v_Uv).y;\\n\\t    #endif\\n        clearcoat = saturate(clearcoat);\\n        clearcoatRoughness = max(clearcoatRoughness, 0.0525);\\n\\t    clearcoatRoughness += geometryRoughness;\\n\\t    clearcoatRoughness = min(clearcoatRoughness, 1.0);\\n    #endif\\n#else\\n    vec3 diffuseColor = outColor.xyz;\\n    #ifdef USE_PHONG\\n        vec3 specularColor = u_SpecularColor.xyz;\\n        float shininess = u_Specular;\\n    #endif\\n#endif\\nvec3 L;\\nfloat falloff;\\nfloat dotNL;\\nvec3 irradiance;\\nfloat clearcoatDHR;\\n#ifdef USE_CLEARCOAT\\n    float ccDotNL;\\n    vec3 ccIrradiance;\\n#endif\\n#if NUM_DIR_LIGHTS > 0\\n    #pragma unroll_loop_start\\n    for (int i = 0; i < NUM_DIR_LIGHTS; i++) {\\n        L = normalize(-u_Directional[i].direction);\\n        falloff = 1.0;\\n        #if defined(USE_SHADOW) && (UNROLLED_LOOP_INDEX < NUM_DIR_SHADOWS)\\n            #ifdef USE_PCSS_SOFT_SHADOW\\n                falloff *= getShadowWithPCSS(directionalDepthMap[i], directionalShadowMap[i], vDirectionalShadowCoord[i], u_DirectionalShadow[i].shadowMapSize, u_DirectionalShadow[i].shadowBias, u_DirectionalShadow[i].shadowParams);\\n            #else\\n                falloff *= getShadow(directionalShadowMap[i], vDirectionalShadowCoord[i], u_DirectionalShadow[i].shadowMapSize, u_DirectionalShadow[i].shadowBias, u_DirectionalShadow[i].shadowParams);\\n            #endif\\n        #endif\\n        dotNL = saturate(dot(N, L));\\n        irradiance = u_Directional[i].color * falloff * dotNL * PI;\\n        #ifdef USE_CLEARCOAT        \\n            ccDotNL = saturate(dot(clearcoatNormal, L));\\n            ccIrradiance = ccDotNL * u_Directional[i].color * falloff  * PI;\\n            clearcoatDHR = clearcoat * clearcoatDHRApprox(clearcoatRoughness, ccDotNL);\\n            reflectedLight.directSpecular += ccIrradiance * clearcoat * BRDF_Specular_GGX(specularColor, clearcoatNormal, L, V, clearcoatRoughness);\\n        #else\\n            clearcoatDHR = 0.0;\\n        #endif\\n        reflectedLight.directDiffuse += (1.0 - clearcoatDHR) * irradiance * BRDF_Diffuse_Lambert(diffuseColor);\\n        #ifdef USE_PHONG\\n            reflectedLight.directSpecular += irradiance * BRDF_Specular_BlinnPhong(specularColor, N, L, V, shininess) * specularStrength;\\n        #endif\\n        #ifdef USE_PBR\\n            reflectedLight.directSpecular += (1.0 - clearcoatDHR) * irradiance * BRDF_Specular_GGX(specularColor, N, L, V, roughness);\\n        #endif\\n    }\\n    #pragma unroll_loop_end\\n#endif\\n#if NUM_POINT_LIGHTS > 0\\n    vec3 worldV;\\n    #pragma unroll_loop_start\\n    for (int i = 0; i < NUM_POINT_LIGHTS; i++) {\\n        worldV = v_modelPos - u_Point[i].position;\\n        L = -worldV;\\n        falloff = pow(clamp(1. - length(L) / u_Point[i].distance, 0.0, 1.0), u_Point[i].decay);\\n        L = normalize(L);\\n        #if defined(USE_SHADOW) && (UNROLLED_LOOP_INDEX < NUM_POINT_SHADOWS)\\n            falloff *= getPointShadow(pointShadowMap[i], vPointShadowCoord[i], u_PointShadow[i].shadowMapSize, u_PointShadow[i].shadowBias, u_PointShadow[i].shadowParams, u_PointShadow[i].shadowCameraRange);\\n        #endif\\n        dotNL = saturate(dot(N, L));\\n        irradiance = u_Point[i].color * falloff * dotNL * PI;\\n        #ifdef USE_CLEARCOAT        \\n            ccDotNL = saturate(dot(clearcoatNormal, L));\\n            ccIrradiance = ccDotNL *  u_Point[i].color * falloff  * PI;\\n            clearcoatDHR = clearcoat * clearcoatDHRApprox(clearcoatRoughness, ccDotNL);\\n            reflectedLight.directSpecular += ccIrradiance * clearcoat * BRDF_Specular_GGX(specularColor, clearcoatNormal, L, V, clearcoatRoughness);\\n        #else\\n            clearcoatDHR = 0.0;\\n        #endif\\n        reflectedLight.directDiffuse += (1.0 - clearcoatDHR) * irradiance * BRDF_Diffuse_Lambert(diffuseColor);\\n        #ifdef USE_PHONG\\n            reflectedLight.directSpecular += irradiance * BRDF_Specular_BlinnPhong(specularColor, N, L, V, shininess) * specularStrength;\\n        #endif\\n        #ifdef USE_PBR\\n            reflectedLight.directSpecular += (1.0 - clearcoatDHR) * irradiance * BRDF_Specular_GGX(specularColor, N, L, V, roughness);\\n        #endif\\n    }\\n    #pragma unroll_loop_end\\n#endif\\n#if NUM_SPOT_LIGHTS > 0\\n    float lightDistance;\\n    float angleCos;\\n    #pragma unroll_loop_start\\n    for (int i = 0; i < NUM_SPOT_LIGHTS; i++) {\\n        L = u_Spot[i].position - v_modelPos;\\n        lightDistance = length(L);\\n        L = normalize(L);\\n        angleCos = dot(L, -normalize(u_Spot[i].direction));\\n        falloff = smoothstep(u_Spot[i].coneCos, u_Spot[i].penumbraCos, angleCos);\\n        falloff *= pow(clamp(1. - lightDistance / u_Spot[i].distance, 0.0, 1.0), u_Spot[i].decay);\\n        #if defined(USE_SHADOW) && (UNROLLED_LOOP_INDEX < NUM_SPOT_SHADOWS)\\n            #ifdef USE_PCSS_SOFT_SHADOW\\n                falloff *= getShadowWithPCSS(spotDepthMap[i], spotShadowMap[i], vSpotShadowCoord[i], u_SpotShadow[i].shadowMapSize, u_SpotShadow[i].shadowBias, u_SpotShadow[i].shadowParams);\\n            #else\\n                falloff *= getShadow(spotShadowMap[i], vSpotShadowCoord[i], u_SpotShadow[i].shadowMapSize, u_SpotShadow[i].shadowBias, u_SpotShadow[i].shadowParams);\\n            #endif\\n        #endif\\n        dotNL = saturate(dot(N, L));\\n        irradiance = u_Spot[i].color * falloff * dotNL * PI;\\n        #ifdef USE_CLEARCOAT        \\n            ccDotNL = saturate(dot(clearcoatNormal, L));\\n            ccIrradiance = ccDotNL *  u_Spot[i].color * falloff  * PI;\\n            clearcoatDHR = clearcoat * clearcoatDHRApprox(clearcoatRoughness, ccDotNL);\\n            reflectedLight.directSpecular += ccIrradiance * clearcoat * BRDF_Specular_GGX(specularColor, clearcoatNormal, L, V, clearcoatRoughness);\\n        #else\\n            clearcoatDHR = 0.0;\\n        #endif\\n        reflectedLight.directDiffuse += (1.0 - clearcoatDHR) * irradiance * BRDF_Diffuse_Lambert(diffuseColor);\\n        #ifdef USE_PHONG\\n            reflectedLight.directSpecular += irradiance * BRDF_Specular_BlinnPhong(specularColor, N, L, V, shininess) * specularStrength;\\n        #endif\\n        #ifdef USE_PBR\\n            reflectedLight.directSpecular += (1.0 - clearcoatDHR) * irradiance * BRDF_Specular_GGX(specularColor, N, L, V, roughness);\\n        #endif\\n    }\\n    #pragma unroll_loop_end\\n#endif\\n#if NUM_RECT_AREA_LIGHTS > 0\\n    vec3 RectAreaLightDirectSpecular;\\n    vec3 RectAreaLightDirectDiffuse;\\n    vec3 rectCoords[4];\\n    #pragma unroll_loop_start\\n    for (int i = 0; i < NUM_RECT_AREA_LIGHTS; i++) {\\n        LTC_RectCoords(u_RectArea[i].position, u_RectArea[i].halfWidth, u_RectArea[i].halfHeight, rectCoords);\\n        reflectedLight.directDiffuse += u_RectArea[i].color * LTC_Diffuse(diffuseColor, N, V, v_modelPos, rectCoords);\\n        #ifdef USE_PBR\\n            reflectedLight.directSpecular += u_RectArea[i].color * LTC_Specular(specularColor, N, V, v_modelPos, rectCoords, roughness);\\n        #endif\\n    }\\n    #pragma unroll_loop_end\\n#endif\\n#ifdef USE_CLUSTERED_LIGHTS\\n    vec4 positionView = u_View * vec4(v_modelPos, 1.0);\\n    float perspectiveFactor = step(0.0, cellsTransformFactors.z);\\n    float halfFrustumHeight = -cellsTransformFactors.z * mix(1.0, positionView.z, perspectiveFactor);\\n    float halfFrustumWidth = halfFrustumHeight * cellsTransformFactors.w;\\n    vec3 cellCoords;\\n    cellCoords.z = floor(log(-positionView.z) * cellsTransformFactors.x + cellsTransformFactors.y);\\n    cellCoords.y = floor((positionView.y / (2.0 * halfFrustumHeight) + 0.5) * cells.y);\\n    cellCoords.x = floor((positionView.x / (2.0 * halfFrustumWidth) + 0.5) * cells.x);\\n    if(!(any(lessThan(cellCoords, vec3(0.0))) || any(greaterThanEqual(cellCoords, cells)))) {\\n        float cellIndex = dot(cellsDotData, cellCoords);\\n        float clusterV = floor(cellIndex * cellsTextureSize.y);\\n        float clusterU = cellIndex - (clusterV * cellsTextureSize.x);\\n        int size = textureSize(lightsTexture, 0).x;\\n        ClusteredPointLight clusteredPointLight;\\n        ClusteredSpotLight clusteredSpotLight;\\n        vec3 clusteredLightColor;\\n        float clusteredLightDistance;\\n        float clusteredAngleCos;\\n        for (int lightCellIndex = 0; lightCellIndex < maxLightsPerCell; lightCellIndex++) {\\n            float lightIndex = texelFetch(cellsTexture, ivec2(int(clusterU) + lightCellIndex, clusterV), 0).x;\\n            if (lightIndex <= 0.0) break;\\n            int lightOffset = int(lightIndex - 1.) * 4;\\n            ivec2 lightDataCoords = ivec2(lightOffset % size, lightOffset / size);\\n            vec4 lightData0 = texelFetch(lightsTexture, lightDataCoords, 0);\\n            if (lightData0.x == 1.0) {\\n                getPointLightFromTexture(lightDataCoords, lightData0, clusteredPointLight);\\n                L = clusteredPointLight.position - v_modelPos;\\n                clusteredLightDistance = length(L);\\n                L = normalize(L);\\n                falloff = pow(clamp(1. - clusteredLightDistance / clusteredPointLight.distance, 0.0, 1.0), clusteredPointLight.decay);\\n                clusteredLightColor = clusteredPointLight.color;\\n            } else if (lightData0.x == 2.0) {\\n                getSpotLightFromTexture(lightDataCoords, lightData0, clusteredSpotLight);\\n                L = clusteredSpotLight.position - v_modelPos;\\n                clusteredLightDistance = length(L);\\n                L = normalize(L);\\n                clusteredAngleCos = dot(L, -normalize(clusteredSpotLight.direction));\\n                falloff = smoothstep(clusteredSpotLight.coneCos, clusteredSpotLight.penumbraCos, clusteredAngleCos);\\n                falloff *= pow(clamp(1. - clusteredLightDistance / clusteredSpotLight.distance, 0.0, 1.0), clusteredSpotLight.decay);\\n                clusteredLightColor = clusteredSpotLight.color;\\n            }\\n            dotNL = saturate(dot(N, L));\\n            irradiance = clusteredLightColor * falloff * dotNL * PI;\\n            #ifdef USE_CLEARCOAT\\n                ccDotNL = saturate(dot(clearcoatNormal, L));\\n                ccIrradiance = ccDotNL * clusteredLightColor * falloff * PI;\\n                clearcoatDHR = clearcoat * clearcoatDHRApprox(clearcoatRoughness, ccDotNL);\\n                reflectedLight.directSpecular += ccIrradiance * clearcoat * BRDF_Specular_GGX(specularColor, clearcoatNormal, L, V, clearcoatRoughness);\\n            #else\\n                clearcoatDHR = 0.0;\\n            #endif\\n            reflectedLight.directDiffuse += (1.0 - clearcoatDHR) * irradiance * BRDF_Diffuse_Lambert(diffuseColor);\\n            #ifdef USE_PHONG\\n                reflectedLight.directSpecular += irradiance * BRDF_Specular_BlinnPhong(specularColor, N, L, V, shininess) * specularStrength;\\n            #endif\\n            #ifdef USE_PBR\\n                reflectedLight.directSpecular += (1.0 - clearcoatDHR) * irradiance * BRDF_Specular_GGX(specularColor, N, L, V, roughness);\\n            #endif\\n        }\\n    }\\n#endif\\nvec3 indirectIrradiance = vec3(0., 0., 0.);   \\n#ifdef USE_AMBIENT_LIGHT\\n    indirectIrradiance += u_AmbientLightColor * PI;\\n#endif\\n#ifdef USE_SPHERICALHARMONICS_LIGHT\\n    indirectIrradiance += getLightProbeIrradiance(u_SphericalHarmonicsLightData, N);\\n#endif\\n#if NUM_HEMI_LIGHTS > 0\\n    float hemiDiffuseWeight;\\n    #pragma unroll_loop_start\\n    for (int i = 0; i < NUM_HEMI_LIGHTS; i++) {\\n        L = normalize(u_Hemi[i].direction);\\n        dotNL = dot(N, L);\\n        hemiDiffuseWeight = 0.5 * dotNL + 0.5;\\n        indirectIrradiance += mix(u_Hemi[i].groundColor, u_Hemi[i].skyColor, hemiDiffuseWeight) * PI;\\n    }\\n    #pragma unroll_loop_end\\n#endif\\nreflectedLight.indirectDiffuse += indirectIrradiance * BRDF_Diffuse_Lambert(diffuseColor);\\n#if defined(USE_ENV_MAP) && defined(USE_PBR)\\n    vec3 iblIrradiance = vec3(0., 0., 0.);\\n    vec3 indirectRadiance = vec3(0., 0., 0.);\\n    vec3 clearcoatRadiance = vec3(0., 0., 0.);\\n    vec3 envDir;\\n    #ifdef USE_VERTEX_ENVDIR\\n        envDir = v_EnvDir;\\n    #else\\n        envDir = reflect(normalize(v_modelPos - u_CameraPosition), N);\\n    #endif\\n    iblIrradiance += getLightProbeIndirectIrradiance(maxMipLevel, N);\\n    indirectRadiance += getLightProbeIndirectRadiance(roughness, maxMipLevel, N, envDir);\\n    #ifdef USE_CLEARCOAT\\n        vec3 clearcoatDir = reflect(normalize(v_modelPos - u_CameraPosition), clearcoatNormal);\\n        clearcoatRadiance += getLightProbeIndirectRadiance(clearcoatRoughness, maxMipLevel, clearcoatNormal, clearcoatDir);\\n    #endif\\n    #ifdef USE_CLEARCOAT\\n        float ccDotNV = saturate(dot(clearcoatNormal, V));\\n        reflectedLight.indirectSpecular += clearcoatRadiance * clearcoat * BRDF_Specular_GGX_Environment(clearcoatNormal, V, specularColor, clearcoatRoughness);\\n        ccDotNL = ccDotNV;\\n        clearcoatDHR = clearcoat * clearcoatDHRApprox(clearcoatRoughness, ccDotNL);\\n    #else\\n        clearcoatDHR = 0.0;\\n    #endif\\n    float clearcoatInv = 1.0 - clearcoatDHR;\\n    vec3 singleScattering = vec3(0.0);\\n    vec3 multiScattering = vec3(0.0);\\n    vec3 cosineWeightedIrradiance = iblIrradiance * RECIPROCAL_PI;\\n    BRDF_Specular_Multiscattering_Environment(N, V, specularColor, roughness, singleScattering, multiScattering);\\n    vec3 diffuse = diffuseColor * (1.0 - (singleScattering + multiScattering));\\n    reflectedLight.indirectSpecular += clearcoatInv * indirectRadiance * singleScattering;\\n    reflectedLight.indirectSpecular += multiScattering * cosineWeightedIrradiance;\\n    reflectedLight.indirectDiffuse += diffuse * cosineWeightedIrradiance;\\n#endif\";\n\nvar light_pars_frag = \"#ifdef USE_AMBIENT_LIGHT\\n    uniform vec3 u_AmbientLightColor;\\n#endif\\n#ifdef USE_SPHERICALHARMONICS_LIGHT\\n    uniform vec3 u_SphericalHarmonicsLightData[9];\\n#endif\\n#ifdef USE_CLEARCOAT\\n    float clearcoatDHRApprox(const in float roughness, const in float dotNL) {\\n        return 0.04 + (1.0 - 0.16) * (pow(1.0 - dotNL, 5.0) * pow(1.0 - roughness, 2.0));\\n    }\\n#endif\\n#if NUM_HEMI_LIGHTS > 0\\n    struct HemisphereLight {\\n        vec3 direction;\\n        vec3 skyColor;\\n\\t\\tvec3 groundColor;\\n    };\\n    uniform HemisphereLight u_Hemi[NUM_HEMI_LIGHTS];\\n#endif\\n#if NUM_DIR_LIGHTS > 0\\n    struct DirectLight {\\n        vec3 direction;\\n        vec3 color;\\n    };\\n    uniform DirectLight u_Directional[NUM_DIR_LIGHTS];\\n#endif\\n#if NUM_POINT_LIGHTS > 0\\n    struct PointLight {\\n        vec3 position;\\n        vec3 color;\\n        float distance;\\n        float decay;\\n    };\\n    uniform PointLight u_Point[NUM_POINT_LIGHTS];\\n#endif\\n#if NUM_SPOT_LIGHTS > 0\\n    struct SpotLight {\\n        vec3 position;\\n        vec3 color;\\n        float distance;\\n        float decay;\\n        float coneCos;\\n        float penumbraCos;\\n        vec3 direction;\\n    };\\n    uniform SpotLight u_Spot[NUM_SPOT_LIGHTS];\\n#endif\\n#if NUM_RECT_AREA_LIGHTS > 0\\n    struct RectAreaLight {\\n        vec3 position;\\n        vec3 color;\\n\\t\\tvec3 halfWidth;\\n\\t\\tvec3 halfHeight;\\n    };\\n    uniform RectAreaLight u_RectArea[NUM_RECT_AREA_LIGHTS];\\n\\tuniform sampler2D ltc_1;\\tuniform sampler2D ltc_2;\\n    void LTC_RectCoords(const in vec3 lightPos, const in vec3 halfWidth, const in vec3 halfHeight, inout vec3 rectCoords[4]) {\\n        rectCoords[0] = lightPos + halfWidth - halfHeight;        rectCoords[1] = lightPos - halfWidth - halfHeight;\\n        rectCoords[2] = lightPos - halfWidth + halfHeight;\\n        rectCoords[3] = lightPos + halfWidth + halfHeight;\\n    }\\n    vec2 LTC_Uv(const in vec3 N, const in vec3 V, const in float roughness) {\\n        const float LUT_SIZE = 64.0; \\n        const float LUT_SCALE = (LUT_SIZE - 1.0) / LUT_SIZE;\\n        const float LUT_BIAS = 0.5 / LUT_SIZE;\\n        float dotNV = saturate(dot(N, V));\\n        vec2 uv = vec2(roughness, sqrt(1.0 - dotNV));\\n        uv = uv * LUT_SCALE + LUT_BIAS;\\n        return uv;\\n    }\\n    vec3 LTC_EdgeVectorFormFactor(const in vec3 v1, const in vec3 v2) {\\n        float x = dot(v1, v2);\\n        float y = abs(x);\\n        float a = 0.8543985 + (0.4965155 + 0.0145206 * y) * y;\\n        float b = 3.4175940 + (4.1616724 + y) * y;\\n        float v = a / b;\\n        float theta_sintheta = (x > 0.0) ? v : 0.5 * inversesqrt(max(1.0 - x * x, 1e-7)) - v;\\n        return cross(v1, v2) * theta_sintheta;\\n    }\\n    float LTC_ClippedSphereFormFactor(const in vec3 f) {\\n        float l = length(f);\\n        return max((l * l + f.z) / (l + 1.0), 0.0);\\n    }\\n    vec3 LTC_Evaluate(const in vec3 N, const in vec3 V, const in vec3 P, const in mat3 mInv, const in vec3 rectCoords[4]) {\\n        vec3 v1 = rectCoords[1] - rectCoords[0];\\n        vec3 v2 = rectCoords[3] - rectCoords[0];\\n        vec3 lightNormal = cross(v1, v2);\\n        if(dot(lightNormal, P - rectCoords[0]) < 0.0) return vec3(0.0);\\n        vec3 T1, T2;\\n        T1 = normalize(V - N * dot(V, N));\\n        T2 = - cross(N, T1);\\n        mat3 mat = mInv * mat3(\\n            T1.x, T2.x, N.x,\\n            T1.y, T2.y, N.y,\\n            T1.z, T2.z, N.z\\n        );\\n        vec3 coords[4];\\n        coords[0] = mat * (rectCoords[0] - P);\\n        coords[1] = mat * (rectCoords[1] - P);\\n        coords[2] = mat * (rectCoords[2] - P);\\n        coords[3] = mat * (rectCoords[3] - P);\\n        coords[0] = normalize(coords[0]);\\n        coords[1] = normalize(coords[1]);\\n        coords[2] = normalize(coords[2]);\\n        coords[3] = normalize(coords[3]);\\n        vec3 vectorFormFactor = vec3(0.0);\\n        vectorFormFactor += LTC_EdgeVectorFormFactor(coords[0], coords[1]);\\n        vectorFormFactor += LTC_EdgeVectorFormFactor(coords[1], coords[2]);\\n        vectorFormFactor += LTC_EdgeVectorFormFactor(coords[2], coords[3]);\\n        vectorFormFactor += LTC_EdgeVectorFormFactor(coords[3], coords[0]);\\n        float result = LTC_ClippedSphereFormFactor(vectorFormFactor);\\n        return vec3(result);\\n    }\\n    vec3 LTC_Diffuse(const in vec3 diffuseColor, const in vec3 N, const in vec3 V, const in vec3 P, const in vec3 rectCoords[4]) {\\n        return diffuseColor * LTC_Evaluate(N, V, P, mat3(1.0), rectCoords);\\n    }\\n    vec3 LTC_Specular(const in vec3 specularColor, const in vec3 N, const in vec3 V, const in vec3 P, const in vec3 rectCoords[4], const in float roughness) {\\n        vec2 ltc_uv = LTC_Uv(N, V, roughness);\\n        vec4 t1 = texture2D(ltc_1, ltc_uv);\\n        vec4 t2 = texture2D(ltc_2, ltc_uv);\\n        mat3 mInv = mat3(\\n            vec3(t1.x, 0, t1.y),\\n            vec3(0, 1, 0),\\n            vec3(t1.z, 0, t1.w)\\n        );\\n        vec3 fresnel = (specularColor * t2.x + (vec3(1.0) - specularColor) * t2.y);\\n        return fresnel * LTC_Evaluate(N, V, P, mInv, rectCoords);\\n    }\\n#endif\\n#if defined(USE_PBR) && defined(USE_ENV_MAP)\\n    vec3 getLightProbeIndirectIrradiance(const in int maxMIPLevel, const in vec3 N) {\\n        vec3 coordVec = vec3(envMapParams.z * N.x, N.yz);\\n    \\t#ifdef TEXTURE_LOD_EXT\\n    \\t\\tvec4 envMapColor = textureCubeLodEXT(envMap, coordVec, float(maxMIPLevel));\\n    \\t#else\\n    \\t\\tvec4 envMapColor = textureCube(envMap, coordVec, float(maxMIPLevel));\\n    \\t#endif\\n        envMapColor = envMapTexelToLinear(envMapColor);\\n        return PI * envMapColor.rgb * envMapParams.x;\\n    }\\n    float getSpecularMIPLevel(const in float roughness, const in int maxMIPLevel) {\\n    \\tfloat maxMIPLevelScalar = float(maxMIPLevel);\\n        float sigma = PI * roughness * roughness / (1.0 + roughness);\\n        float desiredMIPLevel = maxMIPLevelScalar + log2(sigma);\\n    \\treturn clamp(desiredMIPLevel, 0.0, maxMIPLevelScalar);\\n    }\\n    vec3 getLightProbeIndirectRadiance(const in float roughness, const in int maxMIPLevel, const in vec3 normal, const in vec3 envDir) {\\n        float specularMIPLevel = getSpecularMIPLevel(roughness, maxMIPLevel);\\n        vec3 coordVec = normalize(mix(envDir, normal, roughness * roughness));\\n        coordVec.x *= envMapParams.z;\\n        #ifdef TEXTURE_LOD_EXT\\n    \\t\\tvec4 envMapColor = textureCubeLodEXT(envMap, coordVec, specularMIPLevel);\\n    \\t#else\\n    \\t\\tvec4 envMapColor = textureCube(envMap, coordVec, specularMIPLevel);\\n    \\t#endif\\n        envMapColor = envMapTexelToLinear(envMapColor);\\n        return envMapColor.rgb * envMapParams.y;\\n    }\\n    float computeSpecularOcclusion(const in float dotNV, const in float ambientOcclusion, const in float roughness) {\\n    \\treturn saturate(pow(dotNV + ambientOcclusion, exp2(-16.0 * roughness - 1.0)) - 1.0 + ambientOcclusion);\\n    }\\n#endif\\n#ifdef USE_SPHERICALHARMONICS_LIGHT\\n    vec3 shGetIrradianceAt(in vec3 normal, in vec3 shCoefficients[9]) {\\n        float x = normal.x, y = normal.y, z = normal.z;\\n        vec3 result = shCoefficients[0] * 0.886227;\\n        result += shCoefficients[1] * 2.0 * 0.511664 * y;\\n        result += shCoefficients[2] * 2.0 * 0.511664 * z;\\n        result += shCoefficients[3] * 2.0 * 0.511664 * x;\\n        result += shCoefficients[4] * 2.0 * 0.429043 * x * y;\\n        result += shCoefficients[5] * 2.0 * 0.429043 * y * z;\\n        result += shCoefficients[6] * (0.743125 * z * z - 0.247708);\\n        result += shCoefficients[7] * 2.0 * 0.429043 * x * z;\\n        result += shCoefficients[8] * 0.429043 * (x * x - y * y);\\n        return result;\\n    }\\n    vec3 getLightProbeIrradiance(const in vec3 lightProbe[9], const in vec3 normal) {\\n        vec3 irradiance = shGetIrradianceAt(normal, lightProbe);\\n        return irradiance;\\n    }\\n#endif\\n#ifdef USE_CLUSTERED_LIGHTS\\n    uniform vec3 cells;\\n    uniform int maxLightsPerCell;\\n    uniform vec3 cellsDotData;\\n    uniform vec3 cellsTextureSize;\\n    uniform vec4 cellsTransformFactors;\\n    uniform sampler2D cellsTexture;\\n    uniform sampler2D lightsTexture;\\n    struct ClusteredPointLight {\\n        vec3 position;\\n        vec3 color;\\n        float distance;\\n        float decay;\\n    };\\n    struct ClusteredSpotLight {\\n        vec3 position;\\n        vec3 color;\\n        float distance;\\n        float decay;\\n        vec3 direction;\\n        float coneCos;\\n        float penumbraCos;\\n    };\\n    void getPointLightFromTexture(ivec2 lightDataCoords, vec4 lightData0, inout ClusteredPointLight pointLight) {\\n        vec4 lightData1 = texelFetch(lightsTexture, lightDataCoords + ivec2(1, 0), 0);\\n        vec4 lightData2 = texelFetch(lightsTexture, lightDataCoords + ivec2(2, 0), 0);\\n        pointLight.color = lightData1.xyz;\\n        pointLight.decay = lightData1.w;\\n        pointLight.position = lightData2.xyz;\\n        pointLight.distance = lightData2.w;\\n    }\\n    void getSpotLightFromTexture(ivec2 lightDataCoords, vec4 lightData0, inout ClusteredSpotLight spotLight) {\\n        vec4 lightData1 = texelFetch(lightsTexture, lightDataCoords + ivec2(1, 0), 0);\\n        vec4 lightData2 = texelFetch(lightsTexture, lightDataCoords + ivec2(2, 0), 0);\\n        vec4 lightData3 = texelFetch(lightsTexture, lightDataCoords + ivec2(3, 0), 0);\\n        spotLight.color = lightData1.xyz;\\n        spotLight.decay = lightData1.w;\\n        spotLight.position = lightData2.xyz;\\n        spotLight.distance = lightData2.w;\\n        spotLight.direction = lightData3.xyz;\\n        spotLight.coneCos = lightData3.w;\\n        spotLight.penumbraCos = lightData0.y;\\n    }\\n#endif\";\n\nvar alphamap_pars_frag = \"#ifdef USE_ALPHA_MAP\\n\\tuniform sampler2D alphaMap;\\n\\tvarying vec2 vAlphaMapUV;\\n#endif\";\n\nvar alphamap_frag = \"#ifdef USE_ALPHA_MAP\\n\\toutColor.a *= texture2D(alphaMap, vAlphaMapUV).g;\\n#endif\";\n\nvar alphamap_pars_vert = \"#ifdef USE_ALPHA_MAP\\n    uniform mat3 alphaMapUVTransform;\\n\\tvarying vec2 vAlphaMapUV;\\n#endif\";\n\nvar alphamap_vert = \"#ifdef USE_ALPHA_MAP\\n\\tvAlphaMapUV = (alphaMapUVTransform * vec3(ALPHAMAP_UV, 1.)).xy;\\n#endif\";\n\nvar normalMap_pars_frag = \"#ifdef USE_NORMAL_MAP\\n    uniform sampler2D normalMap;\\n    uniform vec2 normalScale;\\n#endif\\n#if defined(USE_NORMAL_MAP) || defined(USE_CLEARCOAT_NORMALMAP)\\n    #if defined(USE_TANGENT) && !defined(FLAT_SHADED)\\n        #define USE_TBN\\n    #else\\n        #include <tsn>\\n    #endif\\n#endif\";\n\nvar normal_frag = \"\\n#ifdef FLAT_SHADED\\n    vec3 fdx = dFdx(v_modelPos);\\n    vec3 fdy = dFdy(v_modelPos);\\n    vec3 N = normalize(cross(fdx, fdy));\\n#else\\n    vec3 N = normalize(v_Normal);\\n    #ifdef DOUBLE_SIDED\\n        N = N * (float(gl_FrontFacing) * 2.0 - 1.0);\\n    #endif\\n#endif\\n#ifdef USE_TBN\\n\\tvec3 tangent = normalize(v_Tangent);\\n\\tvec3 bitangent = normalize(v_Bitangent);\\n\\t#ifdef DOUBLE_SIDED\\n\\t\\ttangent = tangent * (float(gl_FrontFacing) * 2.0 - 1.0);\\n\\t\\tbitangent = bitangent * (float(gl_FrontFacing) * 2.0 - 1.0);\\n\\t#endif\\n\\tmat3 tspace = mat3(tangent, bitangent, N);\\n#endif\\nvec3 geometryNormal = N;\\n#ifdef USE_NORMAL_MAP\\n    vec3 mapN = texture2D(normalMap, v_Uv).rgb * 2.0 - 1.0;\\n    mapN.xy *= normalScale;\\n    #ifdef USE_TBN\\n        N = normalize(tspace * mapN);\\n    #else\\n        mapN.xy *= (float(gl_FrontFacing) * 2.0 - 1.0);\\n        N = normalize(tsn(N, v_modelPos, v_Uv) * mapN);\\n    #endif\\n#elif defined(USE_BUMPMAP)\\n    N = perturbNormalArb(v_modelPos, N, dHdxy_fwd(v_Uv));\\n#endif\\n#ifdef USE_CLEARCOAT\\n\\tvec3 clearcoatNormal = geometryNormal;\\n#endif\\n#ifdef USE_CLEARCOAT_NORMALMAP\\n\\tvec3 clearcoatMapN = texture2D(clearcoatNormalMap, v_Uv).xyz * 2.0 - 1.0;\\n\\tclearcoatMapN.xy *= clearcoatNormalScale;\\n\\t#ifdef USE_TBN\\n\\t\\tclearcoatNormal = normalize(tspace * clearcoatMapN);\\n\\t#else\\n\\t\\tclearcoatMapN.xy *= (float(gl_FrontFacing) * 2.0 - 1.0);\\n\\t\\tclearcoatNormal = normalize(tsn(clearcoatNormal, v_modelPos, v_Uv) * clearcoatMapN);\\n\\t#endif\\n#endif\";\n\nvar normal_pars_frag = \"#ifndef FLAT_SHADED\\n    varying vec3 v_Normal;\\n    #ifdef USE_TANGENT\\n        varying vec3 v_Tangent;\\n\\t\\tvarying vec3 v_Bitangent;\\n    #endif\\n#endif\";\n\nvar normal_pars_vert = \"#ifndef FLAT_SHADED\\n    varying vec3 v_Normal;\\n    #ifdef USE_TANGENT\\n        varying vec3 v_Tangent;\\n\\t\\tvarying vec3 v_Bitangent;\\n    #endif\\n#endif\";\n\nvar normal_vert = \"#ifndef FLAT_SHADED\\n    v_Normal = (transposeMat4(inverseMat4(u_Model)) * vec4(objectNormal, 0.0)).xyz;\\n    #ifdef FLIP_SIDED\\n    \\tv_Normal = - v_Normal;\\n    #endif\\n    #ifdef USE_TANGENT\\n        v_Tangent = (transposeMat4(inverseMat4(u_Model)) * vec4(objectTangent, 0.0)).xyz;\\n        #ifdef FLIP_SIDED\\n            v_Tangent = - v_Tangent;\\n        #endif\\n        v_Bitangent = normalize(cross(v_Normal, v_Tangent) * a_Tangent.w);\\n    #endif\\n#endif\";\n\nvar packing = \"const float PackUpscale = 256. / 255.;const float UnpackDownscale = 255. / 256.;\\nconst vec3 PackFactors = vec3( 256. * 256. * 256., 256. * 256.,  256. );\\nconst vec4 UnpackFactors = UnpackDownscale / vec4( PackFactors, 1. );\\nconst float ShiftRight8 = 1. / 256.;\\nvec4 packDepthToRGBA( const in float v ) {\\n    vec4 r = vec4( fract( v * PackFactors ), v );\\n    r.yzw -= r.xyz * ShiftRight8;    return r * PackUpscale;\\n}\\nfloat unpackRGBAToDepth( const in vec4 v ) {\\n    return dot( v, UnpackFactors );\\n}\";\n\nvar premultipliedAlpha_frag = \"#ifdef USE_PREMULTIPLIED_ALPHA\\n    gl_FragColor.rgb = gl_FragColor.rgb * gl_FragColor.a;\\n#endif\";\n\nvar pvm_vert = \"vec4 worldPosition = u_Model * vec4(transformed, 1.0);\\ngl_Position = u_ProjectionView * worldPosition;\";\n\nvar dithering_frag = \"#if defined( DITHERING )\\n\\tgl_FragColor.rgb = dithering( gl_FragColor.rgb );\\n#endif\";\n\nvar dithering_pars_frag = \"#if defined( DITHERING )\\n\\tvec3 dithering( vec3 color ) {\\n\\t\\tfloat grid_position = rand( gl_FragCoord.xy );\\n\\t\\tvec3 dither_shift_RGB = vec3( 0.25 / 255.0, -0.25 / 255.0, 0.25 / 255.0 );\\n\\t\\tdither_shift_RGB = mix( 2.0 * dither_shift_RGB, -2.0 * dither_shift_RGB, grid_position );\\n\\t\\treturn color + dither_shift_RGB;\\n\\t}\\n#endif\";\n\nvar shadow = \"#ifdef USE_SHADOW_SAMPLER\\n    float computeShadow(sampler2DShadow shadowMap, vec3 shadowCoord) {\\n        return texture2D( shadowMap, shadowCoord );\\n    }\\n#else\\n    float computeShadow(sampler2D shadowMap, vec3 shadowCoord) {\\n        return step(shadowCoord.z, unpackRGBAToDepth(texture2D(shadowMap, shadowCoord.xy)));\\n    }\\n#endif\\n#ifdef USE_POISSON_SOFT_SHADOW\\n    float computeShadowWithPCF(sampler2DShadow shadowMap, vec3 shadowCoord, vec2 shadowMapSizeAndInverse, vec2 shadowParams) {\\n        float texelSize = shadowParams.x * 0.5 * shadowMapSizeAndInverse.y;\\n        vec3 poissonDisk[4];\\n        poissonDisk[0] = vec3(-0.94201624, -0.39906216, 0);\\n        poissonDisk[1] = vec3(0.94558609, -0.76890725, 0);\\n        poissonDisk[2] = vec3(-0.094184101, -0.92938870, 0);\\n        poissonDisk[3] = vec3(0.34495938, 0.29387760, 0);\\n        return computeShadow(shadowMap, shadowCoord + poissonDisk[0] * texelSize) * 0.25 +\\n            computeShadow(shadowMap, shadowCoord + poissonDisk[1] * texelSize) * 0.25 +\\n            computeShadow(shadowMap, shadowCoord + poissonDisk[2] * texelSize) * 0.25 +\\n            computeShadow(shadowMap, shadowCoord + poissonDisk[3] * texelSize) * 0.25;\\n    }\\n#elif defined(USE_VOGEL5_SOFT_SHADOW)\\n    float interleavedGradientNoise(vec2 position) {\\n        return fract(52.9829189 * fract(dot(position, vec2(0.06711056, 0.00583715))));\\n    }\\n    vec2 vogelDiskSample(int sampleIndex, int samplesCount, float phi) {\\n        const float goldenAngle = 2.399963229728653;\\n        float r = sqrt((float(sampleIndex) + 0.5) / float(samplesCount));\\n        float theta = float(sampleIndex) * goldenAngle + phi;\\n        return vec2(cos(theta), sin(theta)) * r;\\n    }\\n    float computeShadowWithPCF(sampler2DShadow shadowMap, vec3 shadowCoord, vec2 shadowMapSizeAndInverse, vec2 shadowParams) {\\n        float radius = shadowParams.x * shadowMapSizeAndInverse.y;\\n        float phi = interleavedGradientNoise(gl_FragCoord.xy) * 6.28318530718;\\n        float shadow = 0.0;\\n        shadow += computeShadow(shadowMap, vec3(shadowCoord.xy + vogelDiskSample(0, 5, phi) * radius, shadowCoord.z));\\n        shadow += computeShadow(shadowMap, vec3(shadowCoord.xy + vogelDiskSample(1, 5, phi) * radius, shadowCoord.z));\\n        shadow += computeShadow(shadowMap, vec3(shadowCoord.xy + vogelDiskSample(2, 5, phi) * radius, shadowCoord.z));\\n        shadow += computeShadow(shadowMap, vec3(shadowCoord.xy + vogelDiskSample(3, 5, phi) * radius, shadowCoord.z));\\n        shadow += computeShadow(shadowMap, vec3(shadowCoord.xy + vogelDiskSample(4, 5, phi) * radius, shadowCoord.z));\\n        return shadow * 0.2;\\n    }\\n#elif defined(USE_PCF3_SOFT_SHADOW)\\n    float computeShadowWithPCF(sampler2DShadow shadowSampler, vec3 shadowCoord, vec2 shadowMapSizeAndInverse, vec2 shadowParams) {\\n        vec2 uv = shadowCoord.xy * shadowMapSizeAndInverse.x;        uv += 0.5;        vec2 st = fract(uv);        vec2 base_uv = floor(uv) - 0.5;        base_uv *= shadowMapSizeAndInverse.y;\\n        vec2 uvw0 = 3. - 2. * st;\\n        vec2 uvw1 = 1. + 2. * st;\\n        vec2 u = vec2((2. - st.x) / uvw0.x - 1., st.x / uvw1.x + 1.) * shadowMapSizeAndInverse.y;\\n        vec2 v = vec2((2. - st.y) / uvw0.y - 1., st.y / uvw1.y + 1.) * shadowMapSizeAndInverse.y;\\n        float shadow = 0.;\\n        shadow += uvw0.x * uvw0.y * computeShadow(shadowSampler, vec3(base_uv.xy + vec2(u[0], v[0]), shadowCoord.z));\\n        shadow += uvw1.x * uvw0.y * computeShadow(shadowSampler, vec3(base_uv.xy + vec2(u[1], v[0]), shadowCoord.z));\\n        shadow += uvw0.x * uvw1.y * computeShadow(shadowSampler, vec3(base_uv.xy + vec2(u[0], v[1]), shadowCoord.z));\\n        shadow += uvw1.x * uvw1.y * computeShadow(shadowSampler, vec3(base_uv.xy + vec2(u[1], v[1]), shadowCoord.z));\\n        shadow = shadow / 16.;\\n        return shadow;\\n    }\\n#elif defined(USE_PCF5_SOFT_SHADOW)\\n    float computeShadowWithPCF(sampler2DShadow shadowSampler, vec3 shadowCoord, vec2 shadowMapSizeAndInverse, vec2 shadowParams) {\\n        vec2 uv = shadowCoord.xy * shadowMapSizeAndInverse.x;        uv += 0.5;        vec2 st = fract(uv);        vec2 base_uv = floor(uv) - 0.5;        base_uv *= shadowMapSizeAndInverse.y;\\n        vec2 uvw0 = 4. - 3. * st;\\n        vec2 uvw1 = vec2(7.);\\n        vec2 uvw2 = 1. + 3. * st;\\n        vec3 u = vec3((3. - 2. * st.x) / uvw0.x - 2., (3. + st.x) / uvw1.x, st.x / uvw2.x + 2.) * shadowMapSizeAndInverse.y;\\n        vec3 v = vec3((3. - 2. * st.y) / uvw0.y - 2., (3. + st.y) / uvw1.y, st.y / uvw2.y + 2.) * shadowMapSizeAndInverse.y;\\n        float shadow = 0.;\\n        shadow += uvw0.x * uvw0.y * computeShadow(shadowSampler, vec3(base_uv.xy + vec2(u[0], v[0]), shadowCoord.z));\\n        shadow += uvw1.x * uvw0.y * computeShadow(shadowSampler, vec3(base_uv.xy + vec2(u[1], v[0]), shadowCoord.z));\\n        shadow += uvw2.x * uvw0.y * computeShadow(shadowSampler, vec3(base_uv.xy + vec2(u[2], v[0]), shadowCoord.z));\\n        shadow += uvw0.x * uvw1.y * computeShadow(shadowSampler, vec3(base_uv.xy + vec2(u[0], v[1]), shadowCoord.z));\\n        shadow += uvw1.x * uvw1.y * computeShadow(shadowSampler, vec3(base_uv.xy + vec2(u[1], v[1]), shadowCoord.z));\\n        shadow += uvw2.x * uvw1.y * computeShadow(shadowSampler, vec3(base_uv.xy + vec2(u[2], v[1]), shadowCoord.z));\\n        shadow += uvw0.x * uvw2.y * computeShadow(shadowSampler, vec3(base_uv.xy + vec2(u[0], v[2]), shadowCoord.z));\\n        shadow += uvw1.x * uvw2.y * computeShadow(shadowSampler, vec3(base_uv.xy + vec2(u[1], v[2]), shadowCoord.z));\\n        shadow += uvw2.x * uvw2.y * computeShadow(shadowSampler, vec3(base_uv.xy + vec2(u[2], v[2]), shadowCoord.z));\\n        shadow = shadow / 144.;\\n        return shadow;\\n    }\\n#else\\n    float computeShadowWithPCF(sampler2DShadow shadowSampler, vec3 shadowCoord,  vec2 shadowMapSizeAndInverse, vec2 shadowParams) {\\n        return computeShadow(shadowSampler, shadowCoord);\\n    }\\n#endif\\nfloat computeFallOff(float value, vec2 clipSpace, float frustumEdgeFalloff) {\\n    float factor = mix(clipSpace.y * abs(clipSpace.y), dot(clipSpace, clipSpace), step(0., frustumEdgeFalloff));\\n    float mask = smoothstep(1.0 - abs(frustumEdgeFalloff), 1.00000012, clamp(factor, 0., 1.));\\n    return mix(value, 1.0, mask);\\n}\\nfloat getShadow(sampler2DShadow shadowMap, vec4 shadowCoord, vec2 shadowMapSize, vec2 shadowBias, vec2 shadowParams) {\\n    shadowCoord.xyz /= shadowCoord.w;\\n    shadowCoord.z += shadowBias.x;\\n    bvec4 inFrustumVec = bvec4 (shadowCoord.x >= 0.0, shadowCoord.x <= 1.0, shadowCoord.y >= 0.0, shadowCoord.y <= 1.0);\\n    bool inFrustum = all(inFrustumVec);\\n    bvec2 frustumTestVec = bvec2(inFrustum, shadowCoord.z <= 1.0);\\n    bool frustumTest = all(frustumTestVec);\\n    float shadow = 1.0;\\n    if (frustumTest) {\\n        vec2 shadowMapSizeAndInverse = vec2(shadowMapSize.x, 1. / shadowMapSize.x);\\n        shadow = computeShadowWithPCF(shadowMap, shadowCoord.xyz, shadowMapSizeAndInverse, shadowParams);\\n        shadow = computeFallOff(shadow, shadowCoord.xy * 2. - 1., shadowParams.y);\\n    }\\n    return shadow;\\n}\\nfloat textureCubeCompare(samplerCube depths, vec3 uv, float compare) {\\n    return step(compare, unpackRGBAToDepth(textureCube(depths, uv)));\\n}\\nfloat getPointShadow(samplerCube shadowMap, vec4 shadowCoord, vec2 shadowMapSize, vec2 shadowBias, vec2 shadowParams, vec2 shadowCameraRange) {\\n    float shadow = 1.0;\\n    vec3 lightToPosition = shadowCoord.xyz;\\n    float lightToPositionLength = length(lightToPosition);\\n    if (lightToPositionLength - shadowCameraRange.y <= 0.0 && lightToPositionLength - shadowCameraRange.x >= 0.0) {\\n        float dp = (lightToPositionLength - shadowCameraRange.x) / (shadowCameraRange.y - shadowCameraRange.x);\\n        dp += shadowBias.x;\\n\\t\\tvec3 bd3D = normalize(lightToPosition);\\n        #ifdef USE_HARD_SHADOW\\n            shadow = textureCubeCompare(shadowMap, bd3D, dp);\\n        #else\\n            float texelSize = shadowParams.x * 0.5 / shadowMapSize.x;\\n            vec2 offset = vec2(-1.0, 1.0) * texelSize;\\n            shadow = (\\n                textureCubeCompare(shadowMap, bd3D + offset.xyy, dp) +\\n                textureCubeCompare(shadowMap, bd3D + offset.yyy, dp) +\\n                textureCubeCompare(shadowMap, bd3D + offset.xyx, dp) +\\n                textureCubeCompare(shadowMap, bd3D + offset.yyx, dp) +\\n                textureCubeCompare(shadowMap, bd3D, dp) +\\n                textureCubeCompare(shadowMap, bd3D + offset.xxy, dp) +\\n                textureCubeCompare(shadowMap, bd3D + offset.yxy, dp) +\\n                textureCubeCompare(shadowMap, bd3D + offset.xxx, dp) +\\n                textureCubeCompare(shadowMap, bd3D + offset.yxx, dp)\\n            ) * (1.0 / 9.0);\\n        #endif\\n    }\\n    return shadow;\\n}\\n#ifdef USE_PCSS_SOFT_SHADOW\\n    const vec3 PoissonSamplers32[64] = vec3[64](\\n        vec3(0.06407013, 0.05409927, 0.),\\n        vec3(0.7366577, 0.5789394, 0.),\\n        vec3(-0.6270542, -0.5320278, 0.),\\n        vec3(-0.4096107, 0.8411095, 0.),\\n        vec3(0.6849564, -0.4990818, 0.),\\n        vec3(-0.874181, -0.04579735, 0.),\\n        vec3(0.9989998, 0.0009880066, 0.),\\n        vec3(-0.004920578, -0.9151649, 0.),\\n        vec3(0.1805763, 0.9747483, 0.),\\n        vec3(-0.2138451, 0.2635818, 0.),\\n        vec3(0.109845, 0.3884785, 0.),\\n        vec3(0.06876755, -0.3581074, 0.),\\n        vec3(0.374073, -0.7661266, 0.),\\n        vec3(0.3079132, -0.1216763, 0.),\\n        vec3(-0.3794335, -0.8271583, 0.),\\n        vec3(-0.203878, -0.07715034, 0.),\\n        vec3(0.5912697, 0.1469799, 0.),\\n        vec3(-0.88069, 0.3031784, 0.),\\n        vec3(0.5040108, 0.8283722, 0.),\\n        vec3(-0.5844124, 0.5494877, 0.),\\n        vec3(0.6017799, -0.1726654, 0.),\\n        vec3(-0.5554981, 0.1559997, 0.),\\n        vec3(-0.3016369, -0.3900928, 0.),\\n        vec3(-0.5550632, -0.1723762, 0.),\\n        vec3(0.925029, 0.2995041, 0.),\\n        vec3(-0.2473137, 0.5538505, 0.),\\n        vec3(0.9183037, -0.2862392, 0.),\\n        vec3(0.2469421, 0.6718712, 0.),\\n        vec3(0.3916397, -0.4328209, 0.),\\n        vec3(-0.03576927, -0.6220032, 0.),\\n        vec3(-0.04661255, 0.7995201, 0.),\\n        vec3(0.4402924, 0.3640312, 0.),\\n        vec3(0., 0., 0.),\\n        vec3(0., 0., 0.),\\n        vec3(0., 0., 0.),\\n        vec3(0., 0., 0.),\\n        vec3(0., 0., 0.),\\n        vec3(0., 0., 0.),\\n        vec3(0., 0., 0.),\\n        vec3(0., 0., 0.),\\n        vec3(0., 0., 0.),\\n        vec3(0., 0., 0.),\\n        vec3(0., 0., 0.),\\n        vec3(0., 0., 0.),\\n        vec3(0., 0., 0.),\\n        vec3(0., 0., 0.),\\n        vec3(0., 0., 0.),\\n        vec3(0., 0., 0.),\\n        vec3(0., 0., 0.),\\n        vec3(0., 0., 0.),\\n        vec3(0., 0., 0.),\\n        vec3(0., 0., 0.),\\n        vec3(0., 0., 0.),\\n        vec3(0., 0., 0.),\\n        vec3(0., 0., 0.),\\n        vec3(0., 0., 0.),\\n        vec3(0., 0., 0.),\\n        vec3(0., 0., 0.),\\n        vec3(0., 0., 0.),\\n        vec3(0., 0., 0.),\\n        vec3(0., 0., 0.),\\n        vec3(0., 0., 0.),\\n        vec3(0., 0., 0.),\\n        vec3(0., 0., 0.)\\n    );\\n    const vec3 PoissonSamplers64[64] = vec3[64](\\n        vec3(-0.613392, 0.617481, 0.),\\n        vec3(0.170019, -0.040254, 0.),\\n        vec3(-0.299417, 0.791925, 0.),\\n        vec3(0.645680, 0.493210, 0.),\\n        vec3(-0.651784, 0.717887, 0.),\\n        vec3(0.421003, 0.027070, 0.),\\n        vec3(-0.817194, -0.271096, 0.),\\n        vec3(-0.705374, -0.668203, 0.),\\n        vec3(0.977050, -0.108615, 0.),\\n        vec3(0.063326, 0.142369, 0.),\\n        vec3(0.203528, 0.214331, 0.),\\n        vec3(-0.667531, 0.326090, 0.),\\n        vec3(-0.098422, -0.295755, 0.),\\n        vec3(-0.885922, 0.215369, 0.),\\n        vec3(0.566637, 0.605213, 0.),\\n        vec3(0.039766, -0.396100, 0.),\\n        vec3(0.751946, 0.453352, 0.),\\n        vec3(0.078707, -0.715323, 0.),\\n        vec3(-0.075838, -0.529344, 0.),\\n        vec3(0.724479, -0.580798, 0.),\\n        vec3(0.222999, -0.215125, 0.),\\n        vec3(-0.467574, -0.405438, 0.),\\n        vec3(-0.248268, -0.814753, 0.),\\n        vec3(0.354411, -0.887570, 0.),\\n        vec3(0.175817, 0.382366, 0.),\\n        vec3(0.487472, -0.063082, 0.),\\n        vec3(-0.084078, 0.898312, 0.),\\n        vec3(0.488876, -0.783441, 0.),\\n        vec3(0.470016, 0.217933, 0.),\\n        vec3(-0.696890, -0.549791, 0.),\\n        vec3(-0.149693, 0.605762, 0.),\\n        vec3(0.034211, 0.979980, 0.),\\n        vec3(0.503098, -0.308878, 0.),\\n        vec3(-0.016205, -0.872921, 0.),\\n        vec3(0.385784, -0.393902, 0.),\\n        vec3(-0.146886, -0.859249, 0.),\\n        vec3(0.643361, 0.164098, 0.),\\n        vec3(0.634388, -0.049471, 0.),\\n        vec3(-0.688894, 0.007843, 0.),\\n        vec3(0.464034, -0.188818, 0.),\\n        vec3(-0.440840, 0.137486, 0.),\\n        vec3(0.364483, 0.511704, 0.),\\n        vec3(0.034028, 0.325968, 0.),\\n        vec3(0.099094, -0.308023, 0.),\\n        vec3(0.693960, -0.366253, 0.),\\n        vec3(0.678884, -0.204688, 0.),\\n        vec3(0.001801, 0.780328, 0.),\\n        vec3(0.145177, -0.898984, 0.),\\n        vec3(0.062655, -0.611866, 0.),\\n        vec3(0.315226, -0.604297, 0.),\\n        vec3(-0.780145, 0.486251, 0.),\\n        vec3(-0.371868, 0.882138, 0.),\\n        vec3(0.200476, 0.494430, 0.),\\n        vec3(-0.494552, -0.711051, 0.),\\n        vec3(0.612476, 0.705252, 0.),\\n        vec3(-0.578845, -0.768792, 0.),\\n        vec3(-0.772454, -0.090976, 0.),\\n        vec3(0.504440, 0.372295, 0.),\\n        vec3(0.155736, 0.065157, 0.),\\n        vec3(0.391522, 0.849605, 0.),\\n        vec3(-0.620106, -0.328104, 0.),\\n        vec3(0.789239, -0.419965, 0.),\\n        vec3(-0.545396, 0.538133, 0.),\\n        vec3(-0.178564, -0.596057, 0.)\\n    );\\n    float getRand(vec2 seed) {\\n        return fract(sin(dot(seed.xy ,vec2(12.9898,78.233))) * 43758.5453);\\n    }\\n    float computeShadowWithPCSS(sampler2D depthSampler, sampler2DShadow shadowSampler, vec3 shadowCoord, float shadowMapSizeInverse, float lightSizeUV, int searchTapCount, int pcfTapCount, vec3[64] poissonSamplers) {\\n        float depthMetric = shadowCoord.z;\\n        float blockerDepth = 0.0;\\n        float sumBlockerDepth = 0.0;\\n        float numBlocker = 0.0;\\n        for (int i = 0; i < searchTapCount; i++) {\\n            blockerDepth = unpackRGBAToDepth(texture(depthSampler, shadowCoord.xy + (lightSizeUV * shadowMapSizeInverse * PoissonSamplers32[i].xy)));\\n            if (blockerDepth < depthMetric) {\\n                sumBlockerDepth += blockerDepth;\\n                numBlocker++;\\n            }\\n        }\\n        if (numBlocker < 1.0) {\\n            return 1.0;\\n        }\\n        float avgBlockerDepth = sumBlockerDepth / numBlocker;\\n        float AAOffset = shadowMapSizeInverse * 10.;\\n        float penumbraRatio = ((depthMetric - avgBlockerDepth) + AAOffset);\\n        float filterRadius = penumbraRatio * lightSizeUV * shadowMapSizeInverse;\\n        float random = getRand(shadowCoord.xy);        float rotationAngle = random * 3.1415926;\\n        vec2 rotationVector = vec2(cos(rotationAngle), sin(rotationAngle));\\n        float shadow = 0.;\\n        for (int i = 0; i < pcfTapCount; i++) {\\n            vec3 offset = poissonSamplers[i];\\n            offset = vec3(offset.x * rotationVector.x - offset.y * rotationVector.y, offset.y * rotationVector.x + offset.x * rotationVector.y, 0.);\\n            shadow += texture(shadowSampler, shadowCoord + offset * filterRadius);\\n        }\\n        shadow /= float(pcfTapCount);\\n        shadow = mix(shadow, 1., depthMetric - avgBlockerDepth);\\n        return shadow;\\n    }\\n    float getShadowWithPCSS(sampler2D depthSampler, sampler2DShadow shadowMap, vec4 shadowCoord, vec2 shadowMapSize, vec2 shadowBias, vec2 shadowParams) {\\n        shadowCoord.xyz /= shadowCoord.w;\\n        shadowCoord.z += shadowBias.x;\\n        bvec4 inFrustumVec = bvec4 (shadowCoord.x >= 0.0, shadowCoord.x <= 1.0, shadowCoord.y >= 0.0, shadowCoord.y <= 1.0);\\n        bool inFrustum = all(inFrustumVec);\\n        bvec2 frustumTestVec = bvec2(inFrustum, shadowCoord.z <= 1.0);\\n        bool frustumTest = all(frustumTestVec);\\n        float shadow = 1.0;\\n        if (frustumTest) {\\n            #ifdef USE_PCSS16_SOFT_SHADOW\\n                shadow = computeShadowWithPCSS(depthSampler, shadowMap, shadowCoord.xyz, 1. / shadowMapSize.x, 0.1 * shadowMapSize.x, 16, 16, PoissonSamplers32);\\n            #else\\n                #ifdef USE_PCSS32_SOFT_SHADOW\\n                    shadow = computeShadowWithPCSS(depthSampler, shadowMap, shadowCoord.xyz, 1. / shadowMapSize.x, 0.1 * shadowMapSize.x, 16, 32, PoissonSamplers32);\\n                #else\\n                    shadow = computeShadowWithPCSS(depthSampler, shadowMap, shadowCoord.xyz, 1. / shadowMapSize.x, 0.1 * shadowMapSize.x, 32, 64, PoissonSamplers64);\\n                #endif\\n            #endif\\n            shadow = computeFallOff(shadow, shadowCoord.xy * 2. - 1., shadowParams.y);\\n        }\\n        return shadow;\\n    }\\n#endif\";\n\nvar shadowMap_frag = \"#ifdef USE_SHADOW\\n#endif\";\n\nvar shadowMap_pars_frag = \"#ifdef USE_SHADOW\\n\\t#if NUM_DIR_SHADOWS > 0\\n\\t\\tuniform sampler2DShadow directionalShadowMap[NUM_DIR_SHADOWS];\\n\\t\\tvarying vec4 vDirectionalShadowCoord[NUM_DIR_SHADOWS];\\n\\t\\t#ifdef USE_PCSS_SOFT_SHADOW\\n\\t\\t\\tuniform sampler2D directionalDepthMap[NUM_DIR_SHADOWS];\\n\\t\\t#endif\\n\\t\\tstruct DirectLightShadow {\\n\\t\\t\\tvec2 shadowBias;\\n\\t\\t\\tvec2 shadowMapSize;\\n\\t\\t\\tvec2 shadowParams;\\n\\t\\t};\\n\\t\\tuniform DirectLightShadow u_DirectionalShadow[NUM_DIR_SHADOWS];\\n\\t#endif\\n\\t#if NUM_POINT_SHADOWS > 0\\n\\t\\tuniform samplerCube pointShadowMap[NUM_POINT_SHADOWS];\\n\\t\\tvarying vec4 vPointShadowCoord[NUM_POINT_SHADOWS];\\n\\t\\tstruct PointLightShadow {\\n\\t\\t\\tvec2 shadowBias;\\n\\t\\t\\tvec2 shadowMapSize;\\n\\t\\t\\tvec2 shadowParams;\\n\\t\\t\\tvec2 shadowCameraRange;\\n\\t\\t\\tfloat shadowCameraNear;\\n\\t\\t\\tfloat shadowCameraFar;\\n\\t\\t};\\n\\t\\tuniform PointLightShadow u_PointShadow[NUM_POINT_SHADOWS];\\n\\t#endif\\n\\t#if NUM_SPOT_SHADOWS > 0\\n\\t\\tuniform sampler2DShadow spotShadowMap[NUM_SPOT_SHADOWS];\\n\\t\\tvarying vec4 vSpotShadowCoord[NUM_SPOT_SHADOWS];\\n\\t\\t#ifdef USE_PCSS_SOFT_SHADOW\\n\\t\\t\\tuniform sampler2D spotDepthMap[NUM_SPOT_SHADOWS];\\n\\t\\t#endif\\n\\t\\tstruct SpotLightShadow {\\n\\t\\t\\tvec2 shadowBias;\\n\\t\\t\\tvec2 shadowMapSize;\\n\\t\\t\\tvec2 shadowParams;\\n\\t\\t};\\n\\t\\tuniform SpotLightShadow u_SpotShadow[NUM_SPOT_SHADOWS];\\n\\t#endif\\n\\t#include <packing>\\n\\t#include <shadow>\\n#endif\";\n\nvar shadowMap_pars_vert = \"#ifdef USE_SHADOW\\n\\t#if NUM_DIR_SHADOWS > 0\\n\\t\\tuniform mat4 directionalShadowMatrix[NUM_DIR_SHADOWS];\\n\\t\\tvarying vec4 vDirectionalShadowCoord[NUM_DIR_SHADOWS];\\n\\t\\tstruct DirectLightShadow {\\n\\t\\t\\tvec2 shadowBias;\\n\\t\\t\\tvec2 shadowMapSize;\\n\\t\\t\\tvec2 shadowParams;\\n\\t\\t};\\n\\t\\tuniform DirectLightShadow u_DirectionalShadow[NUM_DIR_SHADOWS];\\n\\t#endif\\n\\t#if NUM_POINT_SHADOWS > 0\\n\\t\\tuniform mat4 pointShadowMatrix[NUM_POINT_SHADOWS];\\n\\t\\tvarying vec4 vPointShadowCoord[NUM_POINT_SHADOWS];\\n\\t\\tstruct PointLightShadow {\\n\\t\\t\\tvec2 shadowBias;\\n\\t\\t\\tvec2 shadowMapSize;\\n\\t\\t\\tvec2 shadowParams;\\n\\t\\t\\tvec2 shadowCameraRange;\\n\\t\\t\\tfloat shadowCameraNear;\\n\\t\\t\\tfloat shadowCameraFar;\\n\\t\\t};\\n\\t\\tuniform PointLightShadow u_PointShadow[NUM_POINT_SHADOWS];\\n\\t#endif\\n\\t#if NUM_SPOT_SHADOWS > 0\\n\\t\\tuniform mat4 spotShadowMatrix[NUM_SPOT_SHADOWS];\\n\\t\\tvarying vec4 vSpotShadowCoord[NUM_SPOT_SHADOWS];\\n\\t\\tstruct SpotLightShadow {\\n\\t\\t\\tvec2 shadowBias;\\n\\t\\t\\tvec2 shadowMapSize;\\n\\t\\t\\tvec2 shadowParams;\\n\\t\\t};\\n\\t\\tuniform SpotLightShadow u_SpotShadow[NUM_SPOT_SHADOWS];\\n\\t#endif\\n#endif\";\n\nvar shadowMap_vert = \"\\n#ifdef USE_SHADOW\\n\\tvec3 shadowWorldNormal = (transposeMat4(inverseMat4(u_Model)) * vec4(objectNormal, 0.0)).xyz;\\n\\tshadowWorldNormal = normalize(shadowWorldNormal);\\n\\t#ifdef FLIP_SIDED\\n\\t\\tshadowWorldNormal = -shadowWorldNormal;\\n\\t#endif\\n\\tvec4 shadowWorldPosition;\\n\\t#if NUM_DIR_SHADOWS > 0\\n\\t\\t#pragma unroll_loop_start\\n\\t\\tfor (int i = 0; i < NUM_DIR_SHADOWS; i++) {\\n\\t\\t\\tshadowWorldPosition = worldPosition + vec4(shadowWorldNormal * u_DirectionalShadow[i].shadowBias[1], 0);\\n\\t\\t\\tvDirectionalShadowCoord[i] = directionalShadowMatrix[i] * shadowWorldPosition;\\n\\t\\t}\\n\\t\\t#pragma unroll_loop_end\\n\\t#endif\\n\\t#if NUM_POINT_SHADOWS > 0\\n\\t\\t#pragma unroll_loop_start\\n\\t\\tfor (int i = 0; i < NUM_POINT_SHADOWS; i++) {\\n\\t\\t\\tshadowWorldPosition = worldPosition + vec4(shadowWorldNormal * u_PointShadow[i].shadowBias[1], 0);\\n\\t\\t\\tvPointShadowCoord[i] = pointShadowMatrix[i] * shadowWorldPosition;\\n\\t\\t}\\n\\t\\t#pragma unroll_loop_end\\n\\t#endif\\n\\t#if NUM_SPOT_SHADOWS > 0\\n\\t\\t#pragma unroll_loop_start\\n\\t\\tfor (int i = 0; i < NUM_SPOT_SHADOWS; i++) {\\n\\t\\t\\tshadowWorldPosition = worldPosition + vec4(shadowWorldNormal * u_SpotShadow[i].shadowBias[1], 0);\\n\\t\\t\\tvSpotShadowCoord[i] = spotShadowMatrix[i] * shadowWorldPosition;\\n\\t\\t}\\n\\t\\t#pragma unroll_loop_end\\n\\t#endif\\n#endif\";\n\nvar morphnormal_vert = \"#ifdef USE_MORPHNORMALS\\n\\tobjectNormal += morphNormal0 * morphTargetInfluences[ 0 ];\\n\\tobjectNormal += morphNormal1 * morphTargetInfluences[ 1 ];\\n\\tobjectNormal += morphNormal2 * morphTargetInfluences[ 2 ];\\n\\tobjectNormal += morphNormal3 * morphTargetInfluences[ 3 ];\\n#endif\";\n\nvar morphtarget_pars_vert = \"#ifdef USE_MORPHTARGETS\\n\\t#ifndef USE_MORPHNORMALS\\n\\tuniform float morphTargetInfluences[ 8 ];\\n\\t#else\\n\\tuniform float morphTargetInfluences[ 4 ];\\n\\t#endif\\n#endif\";\n\nvar morphtarget_vert = \"#ifdef USE_MORPHTARGETS\\n\\ttransformed += morphTarget0 * morphTargetInfluences[ 0 ];\\n\\ttransformed += morphTarget1 * morphTargetInfluences[ 1 ];\\n\\ttransformed += morphTarget2 * morphTargetInfluences[ 2 ];\\n\\ttransformed += morphTarget3 * morphTargetInfluences[ 3 ];\\n\\t#ifndef USE_MORPHNORMALS\\n        transformed += morphTarget4 * morphTargetInfluences[ 4 ];\\n        transformed += morphTarget5 * morphTargetInfluences[ 5 ];\\n        transformed += morphTarget6 * morphTargetInfluences[ 6 ];\\n        transformed += morphTarget7 * morphTargetInfluences[ 7 ];\\n\\t#endif\\n#endif\";\n\nvar skinning_pars_vert = \"#ifdef USE_SKINNING\\n    attribute vec4 skinIndex;\\n\\tattribute vec4 skinWeight;\\n    uniform mat4 bindMatrix;\\n\\tuniform mat4 bindMatrixInverse;\\n    #ifdef BONE_TEXTURE\\n        uniform sampler2D boneTexture;\\n        uniform int boneTextureSize;\\n        mat4 getBoneMatrix( const in float i ) {\\n            float j = i * 4.0;\\n            float x = mod( j, float( boneTextureSize ) );\\n            float y = floor( j / float( boneTextureSize ) );\\n            float dx = 1.0 / float( boneTextureSize );\\n            float dy = 1.0 / float( boneTextureSize );\\n            y = dy * ( y + 0.5 );\\n            vec4 v1 = texture2D( boneTexture, vec2( dx * ( x + 0.5 ), y ) );\\n            vec4 v2 = texture2D( boneTexture, vec2( dx * ( x + 1.5 ), y ) );\\n            vec4 v3 = texture2D( boneTexture, vec2( dx * ( x + 2.5 ), y ) );\\n            vec4 v4 = texture2D( boneTexture, vec2( dx * ( x + 3.5 ), y ) );\\n            mat4 bone = mat4( v1, v2, v3, v4 );\\n            return bone;\\n        }\\n    #else\\n        uniform mat4 boneMatrices[MAX_BONES];\\n        mat4 getBoneMatrix(const in float i) {\\n            mat4 bone = boneMatrices[int(i)];\\n            return bone;\\n        }\\n    #endif\\n#endif\";\n\nvar skinning_vert = \"#ifdef USE_SKINNING\\n    mat4 boneMatX = getBoneMatrix( skinIndex.x );\\n    mat4 boneMatY = getBoneMatrix( skinIndex.y );\\n    mat4 boneMatZ = getBoneMatrix( skinIndex.z );\\n    mat4 boneMatW = getBoneMatrix( skinIndex.w );\\n    vec4 skinVertex = bindMatrix * vec4(transformed, 1.0);\\n    vec4 skinned = vec4( 0.0 );\\n\\tskinned += boneMatX * skinVertex * skinWeight.x;\\n\\tskinned += boneMatY * skinVertex * skinWeight.y;\\n\\tskinned += boneMatZ * skinVertex * skinWeight.z;\\n\\tskinned += boneMatW * skinVertex * skinWeight.w;\\n\\tskinned = bindMatrixInverse * skinned;\\n    transformed = skinned.xyz / skinned.w;\\n#endif\";\n\nvar skinnormal_vert = \"#ifdef USE_SKINNING\\n    mat4 skinMatrix = mat4( 0.0 );\\n    skinMatrix += skinWeight.x * boneMatX;\\n    skinMatrix += skinWeight.y * boneMatY;\\n    skinMatrix += skinWeight.z * boneMatZ;\\n    skinMatrix += skinWeight.w * boneMatW;\\n    skinMatrix = bindMatrixInverse * skinMatrix * bindMatrix;\\n    objectNormal = vec4( skinMatrix * vec4( objectNormal, 0.0 ) ).xyz;\\n    #ifdef USE_TANGENT\\n\\t\\tobjectTangent = vec4( skinMatrix * vec4( objectTangent, 0.0 ) ).xyz;\\n\\t#endif\\n#endif\";\n\nvar specularMap_frag = \"float specularStrength;\\n#ifdef USE_SPECULARMAP\\n\\tvec4 texelSpecular = texture2D( specularMap, v_Uv );\\n\\tspecularStrength = texelSpecular.r;\\n#else\\n\\tspecularStrength = 1.0;\\n#endif\";\n\nvar specularMap_pars_frag = \"#ifdef USE_SPECULARMAP\\n\\tuniform sampler2D specularMap;\\n#endif\";\n\nvar transpose = \"mat4 transposeMat4(mat4 inMatrix) {\\n    vec4 i0 = inMatrix[0];\\n    vec4 i1 = inMatrix[1];\\n    vec4 i2 = inMatrix[2];\\n    vec4 i3 = inMatrix[3];\\n    mat4 outMatrix = mat4(\\n        vec4(i0.x, i1.x, i2.x, i3.x),\\n        vec4(i0.y, i1.y, i2.y, i3.y),\\n        vec4(i0.z, i1.z, i2.z, i3.z),\\n        vec4(i0.w, i1.w, i2.w, i3.w)\\n    );\\n    return outMatrix;\\n}\";\n\nvar tsn = \"mat3 tsn(vec3 N, vec3 V, vec2 uv) {\\n    vec3 q0 = dFdx(V.xyz);\\n    vec3 q1 = dFdy(V.xyz);\\n    vec2 st0 = dFdx(uv.xy);\\n    vec2 st1 = dFdy(uv.xy);\\n    float scale = sign(st1.y * st0.x - st0.y * st1.x);\\n    vec3 S = normalize((q0 * st1.y - q1 * st0.y) * scale);\\n    vec3 T = normalize((-q0 * st1.x + q1 * st0.x) * scale);\\n    return mat3(S, T, N);\\n}\";\n\nvar uv_pars_frag = \"#ifdef USE_UV1\\n    varying vec2 v_Uv;\\n#endif\";\n\nvar uv_pars_vert = \"#if defined(USE_UV) || defined(USE_UV1)\\n    uniform mat3 uvTransform;\\n#endif\\n#ifdef USE_UV1\\n    attribute vec2 a_Uv;\\n    varying vec2 v_Uv;\\n#endif\";\n\nvar uv_vert = \"#ifdef USE_UV1\\n    v_Uv = (uvTransform * vec3(a_Uv, 1.)).xy;\\n#endif\";\n\nvar modelPos_pars_frag = \"varying vec3 v_modelPos;\";\n\nvar modelPos_pars_vert = \"varying vec3 v_modelPos;\";\n\nvar modelPos_vert = \"\\nv_modelPos = worldPosition.xyz;\";\n\nvar logdepthbuf_frag = \"#if defined( USE_LOGDEPTHBUF ) && defined( USE_LOGDEPTHBUF_EXT )\\n\\tgl_FragDepthEXT = vIsPerspective == 0.0 ? gl_FragCoord.z : log2( vFragDepth ) * logDepthBufFC * 0.5;\\n#endif\";\n\nvar logdepthbuf_pars_frag = \"#if defined( USE_LOGDEPTHBUF ) && defined( USE_LOGDEPTHBUF_EXT )\\n\\tuniform float logDepthBufFC;\\n\\tvarying float vFragDepth;\\n\\tvarying float vIsPerspective;\\n#endif\";\n\nvar logdepthbuf_pars_vert = \"#ifdef USE_LOGDEPTHBUF\\n\\t#ifdef USE_LOGDEPTHBUF_EXT\\n\\t\\tuniform float logDepthCameraNear;\\n\\t\\tvarying float vFragDepth;\\n\\t\\tvarying float vIsPerspective;\\n\\t#else\\n\\t\\tuniform float logDepthBufFC;\\n\\t\\tuniform float logDepthCameraNear;\\n\\t#endif\\n#endif\";\n\nvar logdepthbuf_vert = \"#ifdef USE_LOGDEPTHBUF\\n\\t#ifdef USE_LOGDEPTHBUF_EXT\\n\\t\\tvFragDepth = 1.0 + gl_Position.w - logDepthCameraNear;\\n\\t\\tvIsPerspective = float( isPerspectiveMatrix( u_Projection ) );\\n\\t#else\\n\\t\\tif ( isPerspectiveMatrix( u_Projection ) ) {\\n\\t\\t\\tgl_Position.z = log2( max( EPSILON, gl_Position.w - logDepthCameraNear + 1.0 ) ) * logDepthBufFC - 1.0;\\n\\t\\t\\tgl_Position.z *= gl_Position.w;\\n\\t\\t}\\n\\t#endif\\n#endif\";\n\nvar clearcoat_pars_frag = \"#ifdef USE_CLEARCOAT\\n\\tuniform float u_Clearcoat;\\n\\tuniform float u_ClearcoatRoughness;\\n#endif\\n#ifdef USE_CLEARCOATMAP\\n\\tuniform sampler2D clearcoatMap;\\n#endif\\n#ifdef USE_CLEARCOAT_ROUGHNESSMAP\\n\\tuniform sampler2D clearcoatRoughnessMap;\\n#endif\\n#ifdef USE_CLEARCOAT_NORMALMAP\\n\\tuniform sampler2D clearcoatNormalMap;\\n\\tuniform vec2 clearcoatNormalScale;\\n#endif\";\n\nconst ShaderChunk = {\n\talphaTest_frag: alphaTest_frag,\n\talphaTest_pars_frag: alphaTest_pars_frag,\n\taoMap_pars_frag: aoMap_pars_frag,\n\taoMap_pars_vert: aoMap_pars_vert,\n\taoMap_vert: aoMap_vert,\n\taoMap_frag: aoMap_frag,\n\tbegin_frag: begin_frag,\n\tbegin_vert: begin_vert,\n\tbsdfs: bsdfs,\n\tbumpMap_pars_frag: bumpMap_pars_frag,\n\tclippingPlanes_frag: clippingPlanes_frag,\n\tclippingPlanes_pars_frag: clippingPlanes_pars_frag,\n\tcolor_frag: color_frag,\n\tcolor_pars_frag: color_pars_frag,\n\tcolor_pars_vert: color_pars_vert,\n\tcolor_vert: color_vert,\n\tcommon_frag: common_frag,\n\tcommon_vert: common_vert,\n\tdiffuseMap_frag: diffuseMap_frag,\n\tdiffuseMap_pars_frag: diffuseMap_pars_frag,\n\tdiffuseMap_vert: diffuseMap_vert,\n\tdiffuseMap_pars_vert: diffuseMap_pars_vert,\n\temissiveMap_frag: emissiveMap_frag,\n\temissiveMap_pars_frag: emissiveMap_pars_frag,\n\temissiveMap_vert: emissiveMap_vert,\n\temissiveMap_pars_vert: emissiveMap_pars_vert,\n\tencodings_frag: encodings_frag,\n\tencodings_pars_frag: encodings_pars_frag,\n\tend_frag: end_frag,\n\tenvMap_frag: envMap_frag,\n\tenvMap_pars_frag: envMap_pars_frag,\n\tenvMap_pars_vert: envMap_pars_vert,\n\tenvMap_vert: envMap_vert,\n\tfog_frag: fog_frag,\n\tfog_pars_frag: fog_pars_frag,\n\tinverse: inverse,\n\tlight_frag: light_frag,\n\tlight_pars_frag: light_pars_frag,\n\talphamap_pars_frag: alphamap_pars_frag,\n\talphamap_frag: alphamap_frag,\n\talphamap_pars_vert: alphamap_pars_vert,\n\talphamap_vert: alphamap_vert,\n\tnormalMap_pars_frag: normalMap_pars_frag,\n\tnormal_frag: normal_frag,\n\tnormal_pars_frag: normal_pars_frag,\n\tnormal_pars_vert: normal_pars_vert,\n\tnormal_vert: normal_vert,\n\tpacking: packing,\n\tpremultipliedAlpha_frag: premultipliedAlpha_frag,\n\tpvm_vert: pvm_vert,\n\tdithering_frag: dithering_frag,\n\tdithering_pars_frag: dithering_pars_frag,\n\tshadow: shadow,\n\tshadowMap_frag: shadowMap_frag,\n\tshadowMap_pars_frag: shadowMap_pars_frag,\n\tshadowMap_pars_vert: shadowMap_pars_vert,\n\tshadowMap_vert: shadowMap_vert,\n\tmorphnormal_vert: morphnormal_vert,\n\tmorphtarget_pars_vert: morphtarget_pars_vert,\n\tmorphtarget_vert: morphtarget_vert,\n\tskinning_pars_vert: skinning_pars_vert,\n\tskinning_vert: skinning_vert,\n\tskinnormal_vert: skinnormal_vert,\n\tspecularMap_frag: specularMap_frag,\n\tspecularMap_pars_frag: specularMap_pars_frag,\n\ttranspose: transpose,\n\ttsn: tsn,\n\tuv_pars_frag: uv_pars_frag,\n\tuv_pars_vert: uv_pars_vert,\n\tuv_vert: uv_vert,\n\tmodelPos_pars_frag: modelPos_pars_frag,\n\tmodelPos_pars_vert: modelPos_pars_vert,\n\tmodelPos_vert: modelPos_vert,\n\tlogdepthbuf_frag: logdepthbuf_frag,\n\tlogdepthbuf_pars_frag: logdepthbuf_pars_frag,\n\tlogdepthbuf_pars_vert: logdepthbuf_pars_vert,\n\tlogdepthbuf_vert: logdepthbuf_vert,\n\tclearcoat_pars_frag: clearcoat_pars_frag\n};\n\nvar basic_frag = \"#include <common_frag>\\n#include <uv_pars_frag>\\n#include <color_pars_frag>\\n#include <diffuseMap_pars_frag>\\n#include <alphamap_pars_frag>\\n#include <alphaTest_pars_frag>\\n#include <modelPos_pars_frag>\\n#if defined(USE_ENV_MAP) && !defined(USE_VERTEX_ENVDIR)\\n    #include <normalMap_pars_frag>\\n    #include <normal_pars_frag>    \\n#endif\\n#include <envMap_pars_frag>\\n#include <aoMap_pars_frag>\\n#include <fog_pars_frag>\\n#include <logdepthbuf_pars_frag>\\n#include <clippingPlanes_pars_frag>\\nvoid main() {\\n    #include <clippingPlanes_frag>\\n    #include <logdepthbuf_frag>\\n    #include <begin_frag>\\n    #include <color_frag>\\n    #include <diffuseMap_frag>\\n    #include <alphamap_frag>\\n    #include <alphaTest_frag>\\n    ReflectedLight reflectedLight = ReflectedLight(vec3(0.0), vec3(0.0), vec3(0.0), vec3(0.0));\\n    reflectedLight.indirectDiffuse += vec3(1.0);\\n    #include <aoMap_frag>\\n    reflectedLight.indirectDiffuse *= outColor.xyz;\\n    outColor.xyz = reflectedLight.indirectDiffuse;\\n    #if defined(USE_ENV_MAP) && !defined(USE_VERTEX_ENVDIR)\\n        #include <normal_frag>\\n    #endif\\n    #include <envMap_frag>\\n    #include <end_frag>\\n    #include <encodings_frag>\\n    #include <premultipliedAlpha_frag>\\n    #include <fog_frag>\\n}\";\n\nvar basic_vert = \"#include <common_vert>\\n#include <uv_pars_vert>\\n#include <color_pars_vert>\\n#include <diffuseMap_pars_vert>\\n#include <modelPos_pars_vert>\\n#if defined(USE_ENV_MAP) && !defined(USE_VERTEX_ENVDIR)\\n    #include <normal_pars_vert>\\n#endif\\n#include <envMap_pars_vert>\\n#include <aoMap_pars_vert>\\n#include <alphamap_pars_vert>\\n#include <morphtarget_pars_vert>\\n#include <skinning_pars_vert>\\n#include <logdepthbuf_pars_vert>\\nvoid main() {\\n    #include <begin_vert>\\n    #include <morphtarget_vert>\\n    #include <skinning_vert>\\n    #include <pvm_vert>\\n    #include <logdepthbuf_vert>\\n    #include <uv_vert>\\n    #include <color_vert>\\n    #include <diffuseMap_vert>\\n    #include <modelPos_vert>\\n    #ifdef USE_ENV_MAP\\n        #include <morphnormal_vert>\\n        #include <skinnormal_vert>\\n        #ifndef USE_VERTEX_ENVDIR\\n            #include <normal_vert>\\n        #endif  \\n    #endif\\n    #include <envMap_vert>\\n    #include <aoMap_vert>\\n    #include <alphamap_vert>\\n}\";\n\nvar depth_frag = \"#include <common_frag>\\n#include <diffuseMap_pars_frag>\\n#include <alphaTest_pars_frag>\\n#include <modelPos_pars_frag>\\n#include <uv_pars_frag>\\n#include <packing>\\n#include <logdepthbuf_pars_frag>\\n#include <clippingPlanes_pars_frag>\\nvoid main() {\\n    #include <clippingPlanes_frag>\\n    #if defined(USE_DIFFUSE_MAP) && defined(ALPHATEST)\\n        vec4 texelColor = texture2D( diffuseMap, v_Uv );\\n        float alpha = texelColor.a * u_Opacity;\\n        if(alpha < u_AlphaTest) discard;\\n    #endif\\n    #include <logdepthbuf_frag>\\n    \\n    #ifdef DEPTH_PACKING_RGBA\\n        gl_FragColor = packDepthToRGBA(gl_FragCoord.z);\\n    #else\\n        gl_FragColor = vec4( vec3( 1.0 - gl_FragCoord.z ), u_Opacity );\\n    #endif\\n}\";\n\nvar depth_vert = \"#include <common_vert>\\n#include <morphtarget_pars_vert>\\n#include <skinning_pars_vert>\\n#include <uv_pars_vert>\\n#include <modelPos_pars_vert>\\n#include <logdepthbuf_pars_vert>\\nvoid main() {\\n    #include <uv_vert>\\n    #include <begin_vert>\\n    #include <morphtarget_vert>\\n    #include <skinning_vert>\\n    #include <pvm_vert>\\n    #include <logdepthbuf_vert>\\n    #include <modelPos_vert>\\n}\";\n\nvar distance_frag = \"#include <common_frag>\\nuniform float nearDistance;\\nuniform float farDistance;\\n#include <modelPos_pars_frag>\\n#include <packing>\\n#include <clippingPlanes_pars_frag>\\nvoid main() {\\n    #include <clippingPlanes_frag>\\n    \\n    float dist = length( v_modelPos - u_CameraPosition );\\n\\tdist = ( dist - nearDistance ) / ( farDistance - nearDistance );\\n\\tdist = saturate( dist );\\n    gl_FragColor = packDepthToRGBA(dist);\\n}\";\n\nvar distance_vert = \"#include <common_vert>\\n#include <modelPos_pars_vert>\\n#include <morphtarget_pars_vert>\\n#include <skinning_pars_vert>\\nvoid main() {\\n    #include <begin_vert>\\n    #include <morphtarget_vert>\\n    #include <skinning_vert>\\n    #include <pvm_vert>\\n    #include <modelPos_vert>\\n}\";\n\nvar lambert_frag = \"#define USE_LAMBERT\\n#include <common_frag>\\n#include <dithering_pars_frag>\\nuniform vec3 emissive;\\n#include <uv_pars_frag>\\n#include <color_pars_frag>\\n#include <diffuseMap_pars_frag>\\n#include <normalMap_pars_frag>\\n#include <alphamap_pars_frag>\\n#include <alphaTest_pars_frag>\\n#include <bumpMap_pars_frag>\\n#include <light_pars_frag>\\n#include <normal_pars_frag>\\n#include <modelPos_pars_frag>\\n#include <bsdfs>\\n#include <envMap_pars_frag>\\n#include <aoMap_pars_frag>\\n#include <shadowMap_pars_frag>\\n#include <fog_pars_frag>\\n#include <emissiveMap_pars_frag>\\n#include <logdepthbuf_pars_frag>\\n#include <clippingPlanes_pars_frag>\\nvoid main() {\\n    #include <clippingPlanes_frag>\\n    #include <logdepthbuf_frag>\\n    #include <begin_frag>\\n    #include <color_frag>\\n    #include <diffuseMap_frag>\\n    #include <alphamap_frag>\\n    #include <alphaTest_frag>\\n    #include <normal_frag>\\n    ReflectedLight reflectedLight = ReflectedLight(vec3(0.0), vec3(0.0), vec3(0.0), vec3(0.0));\\n    #include <light_frag>\\n    #include <aoMap_frag>\\n    outColor.xyz = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse;\\n    #include <envMap_frag>\\n    #include <shadowMap_frag>\\n    vec3 totalEmissiveRadiance = emissive;\\n    #include <emissiveMap_frag>\\n    outColor.xyz += totalEmissiveRadiance;\\n    #include <end_frag>\\n    #include <encodings_frag>\\n    #include <premultipliedAlpha_frag>\\n    #include <fog_frag>\\n    #include <dithering_frag>\\n}\";\n\nvar lambert_vert = \"#define USE_LAMBERT\\n#include <common_vert>\\n#include <normal_pars_vert>\\n#include <uv_pars_vert>\\n#include <color_pars_vert>\\n#include <diffuseMap_pars_vert>\\n#include <modelPos_pars_vert>\\n#include <envMap_pars_vert>\\n#include <aoMap_pars_vert>\\n#include <alphamap_pars_vert>\\n#include <emissiveMap_pars_vert>\\n#include <shadowMap_pars_vert>\\n#include <morphtarget_pars_vert>\\n#include <skinning_pars_vert>\\n#include <logdepthbuf_pars_vert>\\nvoid main() {\\n    #include <begin_vert>\\n    #include <morphtarget_vert>\\n    #include <morphnormal_vert>\\n    #include <skinning_vert>\\n    #include <skinnormal_vert>\\n    #include <pvm_vert>\\n    #include <normal_vert>\\n    #include <logdepthbuf_vert>\\n    #include <uv_vert>\\n    #include <color_vert>\\n    #include <diffuseMap_vert>\\n    #include <modelPos_vert>\\n    #include <envMap_vert>\\n    #include <aoMap_vert>\\n    #include <alphamap_vert>\\n    #include <emissiveMap_vert>\\n    #include <shadowMap_vert>\\n}\";\n\nvar normaldepth_frag = \"#include <common_frag>\\n#include <diffuseMap_pars_frag>\\n#include <alphaTest_pars_frag>\\n#include <uv_pars_frag>\\n#include <packing>\\n#include <normal_pars_frag>\\n#include <logdepthbuf_pars_frag>\\nvoid main() {\\n    #if defined(USE_DIFFUSE_MAP) && defined(ALPHATEST)\\n        vec4 texelColor = texture2D( diffuseMap, v_Uv );\\n        float alpha = texelColor.a * u_Opacity;\\n        if(alpha < u_AlphaTest) discard;\\n    #endif\\n    #include <logdepthbuf_frag>\\n    vec4 packedNormalDepth;\\n    packedNormalDepth.xyz = normalize(v_Normal) * 0.5 + 0.5;\\n    packedNormalDepth.w = gl_FragCoord.z;\\n    gl_FragColor = packedNormalDepth;\\n}\";\n\nvar normaldepth_vert = \"#include <common_vert>\\n#include <morphtarget_pars_vert>\\n#include <skinning_pars_vert>\\n#include <normal_pars_vert>\\n#include <uv_pars_vert>\\n#include <logdepthbuf_pars_vert>\\nvoid main() {\\n    #include <uv_vert>\\n    #include <begin_vert>\\n    #include <morphtarget_vert>\\n    #include <morphnormal_vert>\\n    #include <skinning_vert>\\n    #include <skinnormal_vert>\\n    #include <normal_vert>\\n    #include <pvm_vert>\\n    #include <logdepthbuf_vert>\\n}\";\n\nvar pbr_frag = \"#define USE_PBR\\n#include <common_frag>\\n#include <dithering_pars_frag>\\nuniform float u_Metalness;\\n#ifdef USE_METALNESSMAP\\n\\tuniform sampler2D metalnessMap;\\n#endif\\nuniform float u_Roughness;\\n#ifdef USE_ROUGHNESSMAP\\n\\tuniform sampler2D roughnessMap;\\n#endif\\nuniform vec3 emissive;\\n#include <uv_pars_frag>\\n#include <color_pars_frag>\\n#include <diffuseMap_pars_frag>\\n#include <alphamap_pars_frag>\\n#include <alphaTest_pars_frag>\\n#include <normalMap_pars_frag>\\n#include <bumpMap_pars_frag>\\n#include <envMap_pars_frag>\\n#include <aoMap_pars_frag>\\n#include <light_pars_frag>\\n#include <normal_pars_frag>\\n#include <clearcoat_pars_frag>\\n#include <modelPos_pars_frag>\\n#include <bsdfs>\\n#include <shadowMap_pars_frag>\\n#include <fog_pars_frag>\\n#include <emissiveMap_pars_frag>\\n#include <logdepthbuf_pars_frag>\\n#include <clippingPlanes_pars_frag>\\nvoid main() {\\n    #include <clippingPlanes_frag>\\n    #include <logdepthbuf_frag>\\n    #include <begin_frag>\\n    #include <color_frag>\\n    #include <diffuseMap_frag>\\n    #include <alphamap_frag>\\n    #include <alphaTest_frag>\\n    #include <normal_frag>\\n    float roughnessFactor = u_Roughness;\\n    #ifdef USE_ROUGHNESSMAP\\n    \\tvec4 texelRoughness = texture2D( roughnessMap, v_Uv );\\n    \\troughnessFactor *= texelRoughness.g;\\n    #endif\\n    float metalnessFactor = u_Metalness;\\n    #ifdef USE_METALNESSMAP\\n    \\tvec4 texelMetalness = texture2D( metalnessMap, v_Uv );\\n    \\tmetalnessFactor *= texelMetalness.b;\\n    #endif\\n    ReflectedLight reflectedLight = ReflectedLight(vec3(0.0), vec3(0.0), vec3(0.0), vec3(0.0));\\n    #include <light_frag>\\n    #include <aoMap_frag>\\n    outColor.xyz = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular;\\n    #include <shadowMap_frag>\\n    vec3 totalEmissiveRadiance = emissive;\\n    #include <emissiveMap_frag>\\n    outColor.xyz += totalEmissiveRadiance;\\n    #include <end_frag>\\n    #include <encodings_frag>\\n    #include <premultipliedAlpha_frag>\\n    #include <fog_frag>\\n    #include <dithering_frag>\\n}\";\n\nvar pbr2_frag = \"#define USE_PBR\\n#define USE_PBR2\\n#include <common_frag>\\n#include <dithering_pars_frag>\\nuniform vec3 u_SpecularColor;\\n#ifdef USE_SPECULARMAP\\n\\tuniform sampler2D specularMap;\\n#endif\\nuniform float glossiness;\\n#ifdef USE_GLOSSINESSMAP\\n\\tuniform sampler2D glossinessMap;\\n#endif\\nuniform vec3 emissive;\\n#include <uv_pars_frag>\\n#include <color_pars_frag>\\n#include <diffuseMap_pars_frag>\\n#include <alphamap_pars_frag>\\n#include <alphaTest_pars_frag>\\n#include <normalMap_pars_frag>\\n#include <bumpMap_pars_frag>\\n#include <envMap_pars_frag>\\n#include <aoMap_pars_frag>\\n#include <light_pars_frag>\\n#include <normal_pars_frag>\\n#include <modelPos_pars_frag>\\n#include <bsdfs>\\n#include <shadowMap_pars_frag>\\n#include <fog_pars_frag>\\n#include <emissiveMap_pars_frag>\\n#include <logdepthbuf_pars_frag>\\n#include <clippingPlanes_pars_frag>\\nvoid main() {\\n    #include <clippingPlanes_frag>\\n    #include <logdepthbuf_frag>\\n    #include <begin_frag>\\n    #include <color_frag>\\n    #include <diffuseMap_frag>\\n    #include <alphamap_frag>\\n    #include <alphaTest_frag>\\n    #include <normal_frag>\\n    vec3 specularFactor = u_SpecularColor;\\n    #ifdef USE_SPECULARMAP\\n        vec4 texelSpecular = texture2D(specularMap, v_Uv);\\n        texelSpecular = sRGBToLinear(texelSpecular);\\n        specularFactor *= texelSpecular.rgb;\\n    #endif\\n    float glossinessFactor = glossiness;\\n    #ifdef USE_GLOSSINESSMAP\\n        vec4 texelGlossiness = texture2D(glossinessMap, v_Uv);\\n        glossinessFactor *= texelGlossiness.a;\\n    #endif\\n    ReflectedLight reflectedLight = ReflectedLight(vec3(0.0), vec3(0.0), vec3(0.0), vec3(0.0));\\n    #include <light_frag>\\n    #include <aoMap_frag>\\n    outColor.xyz = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular;\\n    #include <shadowMap_frag>\\n    vec3 totalEmissiveRadiance = emissive;\\n    #include <emissiveMap_frag>\\n    outColor.xyz += totalEmissiveRadiance;\\n    #include <end_frag>\\n    #include <encodings_frag>\\n    #include <premultipliedAlpha_frag>\\n    #include <fog_frag>\\n    #include <dithering_frag>\\n}\";\n\nvar pbr_vert = \"#define USE_PBR\\n#include <common_vert>\\n#include <normal_pars_vert>\\n#include <uv_pars_vert>\\n#include <color_pars_vert>\\n#include <diffuseMap_pars_vert>\\n#include <modelPos_pars_vert>\\n#include <envMap_pars_vert>\\n#include <aoMap_pars_vert>\\n#include <alphamap_pars_vert>\\n#include <emissiveMap_pars_vert>\\n#include <shadowMap_pars_vert>\\n#include <morphtarget_pars_vert>\\n#include <skinning_pars_vert>\\n#include <logdepthbuf_pars_vert>\\nvoid main() {\\n    #include <begin_vert>\\n    #include <morphtarget_vert>\\n    #include <morphnormal_vert>\\n    #include <skinning_vert>\\n    #include <skinnormal_vert>\\n    #include <pvm_vert>\\n    #include <normal_vert>\\n    #include <logdepthbuf_vert>\\n    #include <uv_vert>\\n    #include <color_vert>\\n    #include <diffuseMap_vert>\\n    #include <modelPos_vert>\\n    #include <envMap_vert>\\n    #include <aoMap_vert>\\n    #include <alphamap_vert>\\n    #include <emissiveMap_vert>\\n    #include <shadowMap_vert>\\n}\";\n\nvar phong_frag = \"#define USE_PHONG\\n#include <common_frag>\\n#include <dithering_pars_frag>\\nuniform float u_Specular;\\nuniform vec3 u_SpecularColor;\\n#include <specularMap_pars_frag>\\nuniform vec3 emissive;\\n#include <uv_pars_frag>\\n#include <color_pars_frag>\\n#include <diffuseMap_pars_frag>\\n#include <alphamap_pars_frag>\\n#include <alphaTest_pars_frag>\\n#include <normalMap_pars_frag>\\n#include <bumpMap_pars_frag>\\n#include <light_pars_frag>\\n#include <normal_pars_frag>\\n#include <modelPos_pars_frag>\\n#include <bsdfs>\\n#include <envMap_pars_frag>\\n#include <aoMap_pars_frag>\\n#include <shadowMap_pars_frag>\\n#include <fog_pars_frag>\\n#include <emissiveMap_pars_frag>\\n#include <logdepthbuf_pars_frag>\\n#include <clippingPlanes_pars_frag>\\nvoid main() {\\n    #include <clippingPlanes_frag>\\n    #include <logdepthbuf_frag>\\n    #include <begin_frag>\\n    #include <color_frag>\\n    #include <diffuseMap_frag>\\n    #include <alphamap_frag>\\n    #include <alphaTest_frag>\\n    #include <normal_frag>\\n    #include <specularMap_frag>\\n    ReflectedLight reflectedLight = ReflectedLight(vec3(0.0), vec3(0.0), vec3(0.0), vec3(0.0));\\n    #include <light_frag>\\n    #include <aoMap_frag>\\n    outColor.xyz = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular;\\n    #include <envMap_frag>\\n    #include <shadowMap_frag>\\n    vec3 totalEmissiveRadiance = emissive;\\n    #include <emissiveMap_frag>\\n    outColor.xyz += totalEmissiveRadiance;\\n    #include <end_frag>\\n    #include <encodings_frag>\\n    #include <premultipliedAlpha_frag>\\n    #include <fog_frag>\\n    #include <dithering_frag>\\n}\";\n\nvar phong_vert = \"#define USE_PHONG\\n#include <common_vert>\\n#include <normal_pars_vert>\\n#include <uv_pars_vert>\\n#include <color_pars_vert>\\n#include <diffuseMap_pars_vert>\\n#include <modelPos_pars_vert>\\n#include <envMap_pars_vert>\\n#include <aoMap_pars_vert>\\n#include <alphamap_pars_vert>\\n#include <emissiveMap_pars_vert>\\n#include <shadowMap_pars_vert>\\n#include <morphtarget_pars_vert>\\n#include <skinning_pars_vert>\\n#include <logdepthbuf_pars_vert>\\nvoid main() {\\n    #include <begin_vert>\\n    #include <morphtarget_vert>\\n    #include <morphnormal_vert>\\n    #include <skinning_vert>\\n    #include <skinnormal_vert>\\n    #include <pvm_vert>\\n    #include <normal_vert>\\n    #include <logdepthbuf_vert>\\n    #include <uv_vert>\\n    #include <color_vert>\\n    #include <diffuseMap_vert>\\n    #include <modelPos_vert>\\n    #include <envMap_vert>\\n    #include <aoMap_vert>\\n    #include <alphamap_vert>\\n    #include <emissiveMap_vert>\\n    #include <shadowMap_vert>\\n}\";\n\nvar point_frag = \"#include <common_frag>\\n#include <color_pars_frag>\\n#include <diffuseMap_pars_frag>\\n#include <fog_pars_frag>\\n#include <logdepthbuf_pars_frag>\\nvoid main() {\\n    #include <begin_frag>\\n    #include <color_frag>\\n    #include <logdepthbuf_frag>\\n    #ifdef USE_DIFFUSE_MAP\\n        outColor *= texture2D(diffuseMap, vec2(gl_PointCoord.x, 1.0 - gl_PointCoord.y));\\n    #endif\\n    #include <end_frag>\\n    #include <encodings_frag>\\n    #include <premultipliedAlpha_frag>\\n    #include <fog_frag>\\n}\";\n\nvar point_vert = \"#include <common_vert>\\n#include <color_pars_vert>\\n#include <logdepthbuf_pars_vert>\\nuniform float u_PointSize;\\nuniform vec2 u_RenderTargetSize;\\nvoid main() {\\n    #include <begin_vert>\\n    #include <pvm_vert>\\n    #include <color_vert>\\n    vec4 mvPosition = u_View * u_Model * vec4(transformed, 1.0);\\n    #ifdef USE_SIZEATTENUATION\\n        gl_PointSize = u_PointSize * (u_RenderTargetSize.y * 0.5 / -mvPosition.z);\\n    #else\\n        gl_PointSize = u_PointSize;\\n    #endif\\n    #include <logdepthbuf_vert>\\n}\";\n\nconst ShaderLib = {\n\tbasic_frag: basic_frag,\n\tbasic_vert: basic_vert,\n\tdepth_frag: depth_frag,\n\tdepth_vert: depth_vert,\n\tdistance_frag: distance_frag,\n\tdistance_vert: distance_vert,\n\tlambert_frag: lambert_frag,\n\tlambert_vert: lambert_vert,\n\tnormaldepth_frag: normaldepth_frag,\n\tnormaldepth_vert: normaldepth_vert,\n\tpbr_frag: pbr_frag,\n\tpbr_vert: pbr_vert,\n\tpbr2_frag: pbr2_frag,\n\tpbr2_vert: pbr_vert,\n\tphong_frag: phong_frag,\n\tphong_vert: phong_vert,\n\tpoint_frag: point_frag,\n\tpoint_vert: point_vert\n};\n\nclass WebGLAttribute {\n\n\tconstructor(gl, program, attributeData) {\n\t\tthis.gl = gl;\n\n\t\tthis.name = attributeData.name;\n\n\t\tthis.type = attributeData.type;\n\n\t\tthis.size = attributeData.size;\n\n\t\tthis.location = gl.getAttribLocation(program, this.name);\n\n\t\tthis.count = getAttributeCount(gl, this.type);\n\n\t\tthis.format = getAttributeFormat(gl, this.type);\n\n\t\tthis.locationSize = 1;\n\t\tif (this.type === gl.FLOAT_MAT2) this.locationSize = 2;\n\t\tif (this.type === gl.FLOAT_MAT3) this.locationSize = 3;\n\t\tif (this.type === gl.FLOAT_MAT4) this.locationSize = 4;\n\t}\n\n}\n\nfunction getAttributeCount(gl, type) {\n\tswitch (type) {\n\t\tcase gl.FLOAT:\n\t\tcase gl.INT:\n\t\tcase gl.UNSIGNED_INT:\n\t\t\treturn 1;\n\t\tcase gl.FLOAT_VEC2:\n\t\tcase gl.INT_VEC2:\n\t\t\treturn 2;\n\t\tcase gl.FLOAT_VEC3:\n\t\tcase gl.INT_VEC3:\n\t\t\treturn 3;\n\t\tcase gl.FLOAT_VEC4:\n\t\tcase gl.INT_VEC4:\n\t\t\treturn 4;\n\t\tcase gl.FLOAT_MAT2:\n\t\t\treturn 4;\n\t\tcase gl.FLOAT_MAT3:\n\t\t\treturn 9;\n\t\tcase gl.FLOAT_MAT4:\n\t\t\treturn 16;\n\t\tdefault:\n\t\t\treturn 0;\n\t}\n}\n\nfunction getAttributeFormat(gl, type) {\n\tswitch (type) {\n\t\tcase gl.FLOAT:\n\t\tcase gl.FLOAT_VEC2:\n\t\tcase gl.FLOAT_VEC3:\n\t\tcase gl.FLOAT_VEC4:\n\t\tcase gl.FLOAT_MAT2:\n\t\tcase gl.FLOAT_MAT3:\n\t\tcase gl.FLOAT_MAT4:\n\t\t\treturn gl.FLOAT;\n\t\tcase gl.INT:\n\t\tcase gl.INT_VEC2:\n\t\tcase gl.INT_VEC3:\n\t\tcase gl.INT_VEC4:\n\t\t\treturn gl.INT;\n\t\tcase gl.UNSIGNED_INT:\n\t\t\treturn gl.UNSIGNED_INT;\n\t\tdefault:\n\t\t\treturn gl.FLOAT;\n\t}\n}\n\nclass WebGLCapabilities {\n\n\tconstructor(gl) {\n\t\tthis._gl = gl;\n\t\tthis._extensions = {};\n\n\t\t// webgl version\n\n\t\tthis.version = parseFloat(/^WebGL (\\d)/.exec(gl.getParameter(gl.VERSION))[1]);\n\n\t\t// texture filter anisotropic extension\n\t\t// this extension is available to both, WebGL1 and WebGL2 contexts.\n\n\t\tconst anisotropyExt = this.getExtension('EXT_texture_filter_anisotropic');\n\t\tthis.anisotropyExt = anisotropyExt;\n\t\tthis.maxAnisotropy = (anisotropyExt !== null) ? gl.getParameter(anisotropyExt.MAX_TEXTURE_MAX_ANISOTROPY_EXT) : 1;\n\n\t\t// query extension\n\n\t\tlet timerQuery = null, canUseTimestamp = false;\n\t\ttry {\n\t\t\tif (this.version > 1) {\n\t\t\t\ttimerQuery = this.getExtension('EXT_disjoint_timer_query_webgl2');\n\t\t\t\tif (timerQuery) {\n\t\t\t\t\tcanUseTimestamp = !!gl.getQuery(timerQuery.TIMESTAMP_EXT, timerQuery.QUERY_COUNTER_BITS_EXT);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\ttimerQuery = this.getExtension('EXT_disjoint_timer_query');\n\t\t\t\tif (timerQuery) {\n\t\t\t\t\tcanUseTimestamp = !!timerQuery.getQueryEXT(timerQuery.TIMESTAMP_EXT, timerQuery.QUERY_COUNTER_BITS_EXT);\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (err) {\n\t\t\tconsole.warn(err);\n\t\t}\n\t\tthis.timerQuery = timerQuery;\n\t\tthis.canUseTimestamp = canUseTimestamp;\n\n\t\t// parallel_shader_compile\n\n\t\tthis.parallelShaderCompileExt = this.getExtension('KHR_parallel_shader_compile');\n\n\t\t// others\n\n\t\tthis.maxPrecision = getMaxPrecision(gl, 'highp');\n\t\tthis.maxTextures = gl.getParameter(gl.MAX_TEXTURE_IMAGE_UNITS);\n\t\tthis.maxVertexTextures = gl.getParameter(gl.MAX_VERTEX_TEXTURE_IMAGE_UNITS);\n\t\tthis.maxTextureSize = gl.getParameter(gl.MAX_TEXTURE_SIZE);\n\t\tthis.maxCubemapSize = gl.getParameter(gl.MAX_CUBE_MAP_TEXTURE_SIZE);\n\t\tthis.maxVertexUniformVectors = gl.getParameter(gl.MAX_VERTEX_UNIFORM_VECTORS);\n\t\tthis.maxSamples = this.version > 1 ? gl.getParameter(gl.MAX_SAMPLES) : 1;\n\t\tthis.lineWidthRange = gl.getParameter(gl.ALIASED_LINE_WIDTH_RANGE);\n\t}\n\n\tgetExtension(name) {\n\t\tconst gl = this._gl;\n\t\tconst extensions = this._extensions;\n\n\t\tif (extensions[name] !== undefined) {\n\t\t\treturn extensions[name];\n\t\t}\n\n\t\tlet ext = null;\n\t\tfor (const prefix of vendorPrefixes) {\n\t\t\text = gl.getExtension(prefix + name);\n\t\t\tif (ext) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\textensions[name] = ext;\n\n\t\treturn ext;\n\t}\n\n}\n\nconst vendorPrefixes = ['', 'WEBKIT_', 'MOZ_'];\n\nfunction getMaxPrecision(gl, precision) {\n\tif (precision === 'highp') {\n\t\tif (gl.getShaderPrecisionFormat(gl.VERTEX_SHADER, gl.HIGH_FLOAT).precision > 0 &&\n\t\t\tgl.getShaderPrecisionFormat(gl.FRAGMENT_SHADER, gl.HIGH_FLOAT).precision > 0) {\n\t\t\treturn 'highp';\n\t\t}\n\t\tprecision = 'mediump';\n\t}\n\tif (precision === 'mediump') {\n\t\tif (gl.getShaderPrecisionFormat(gl.VERTEX_SHADER, gl.MEDIUM_FLOAT).precision > 0 &&\n\t\t\tgl.getShaderPrecisionFormat(gl.FRAGMENT_SHADER, gl.MEDIUM_FLOAT).precision > 0) {\n\t\t\treturn 'mediump';\n\t\t}\n\t}\n\treturn 'lowp';\n}\n\n// This class handles buffer creation and updating for geometries.\nclass WebGLGeometries extends PropertyMap {\n\n\tconstructor(prefix, gl, buffers, vertexArrayBindings) {\n\t\tsuper(prefix);\n\n\t\tthis._gl = gl;\n\t\tthis._buffers = buffers;\n\t\tthis._vertexArrayBindings = vertexArrayBindings;\n\n\t\tconst that = this;\n\n\t\tfunction onGeometryDispose(event) {\n\t\t\tconst geometry = event.target;\n\t\t\tconst geometryProperties = that.get(geometry);\n\n\t\t\tgeometry.removeEventListener('dispose', onGeometryDispose);\n\n\t\t\tif (geometry.index !== null) {\n\t\t\t\tbuffers.removeBuffer(geometry.index.buffer);\n\t\t\t}\n\n\t\t\tfor (const name in geometry.attributes) {\n\t\t\t\tbuffers.removeBuffer(geometry.attributes[name].buffer);\n\t\t\t}\n\n\t\t\tfor (const name in geometry.morphAttributes) {\n\t\t\t\tconst array = geometry.morphAttributes[name];\n\t\t\t\tfor (let i = 0, l = array.length; i < l; i++) {\n\t\t\t\t\tbuffers.removeBuffer(array[i].buffer);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tvertexArrayBindings.releaseByGeometry(geometry);\n\n\t\t\tgeometryProperties.created = false;\n\n\t\t\tthat.delete(geometry);\n\t\t}\n\n\t\tthis._onGeometryDispose = onGeometryDispose;\n\t}\n\n\tsetGeometry(geometry, passInfo) {\n\t\tconst gl = this._gl;\n\t\tconst buffers = this._buffers;\n\n\t\tconst geometryProperties = this.get(geometry);\n\n\t\t// If in pass rendering, skip the geometry if it has been set in this pass.\n\t\tif (geometryProperties.pass === passInfo.count) {\n\t\t\treturn;\n\t\t}\n\t\tgeometryProperties.pass = passInfo.count;\n\n\t\tif (!geometryProperties.created) {\n\t\t\tgeometry.addEventListener('dispose', this._onGeometryDispose);\n\t\t\tgeometryProperties.created = true;\n\t\t}\n\n\t\tif (geometry.index !== null) {\n\t\t\tbuffers.setBuffer(geometry.index.buffer, gl.ELEMENT_ARRAY_BUFFER, this._vertexArrayBindings);\n\t\t}\n\n\t\tfor (const name in geometry.attributes) {\n\t\t\tbuffers.setBuffer(geometry.attributes[name].buffer, gl.ARRAY_BUFFER);\n\t\t}\n\n\t\tfor (const name in geometry.morphAttributes) {\n\t\t\tconst array = geometry.morphAttributes[name];\n\t\t\tfor (let i = 0, l = array.length; i < l; i++) {\n\t\t\t\tbuffers.setBuffer(array[i].buffer, gl.ARRAY_BUFFER);\n\t\t\t}\n\t\t}\n\n\t\treturn geometryProperties;\n\t}\n\n}\n\n// Build-in uniforms\n\nconst internalUniforms = {\n\t'u_Model': [1, null],\n\t'u_Projection': [2, function(cameraData) { this.set(cameraData.projectionMatrix.elements); }],\n\t'u_View': [2, function(cameraData) { this.set(cameraData.viewMatrix.elements); }],\n\t'u_ProjectionView': [2, function(cameraData) { this.set(cameraData.projectionViewMatrix.elements); }],\n\t'u_CameraPosition': [2, function(cameraData) { this.setValue(cameraData.position.x, cameraData.position.y, cameraData.position.z); }],\n\t'logDepthBufFC': [2, function(cameraData) { this.set(cameraData.logDepthBufFC); }],\n\t'logDepthCameraNear': [2, function(cameraData) { this.set(cameraData.logDepthCameraNear); }],\n\t'u_FogColor': [3, function(sceneData) { const color = sceneData.fog.color; this.setValue(color.r, color.g, color.b); }],\n\t'u_FogDensity': [3, function(sceneData) { this.set(sceneData.fog.density); }],\n\t'u_FogNear': [3, function(sceneData) { this.set(sceneData.fog.near); }],\n\t'u_FogFar': [3, function(sceneData) { this.set(sceneData.fog.far); }],\n\t'u_Color': [4, function(material, textures) { const color = material.diffuse; this.setValue(color.r, color.g, color.b); }],\n\t'u_Opacity': [4, function(material, textures) { this.set(material.opacity); }],\n\t'u_AlphaTest': [4, function(material, textures) { this.set(material.alphaTest); }],\n\t'diffuseMap': [4, function(material, textures) { this.set(material.diffuseMap, textures); }],\n\t'alphaMap': [4, function(material, textures) { this.set(material.alphaMap, textures); }],\n\t'alphaMapUVTransform': [4, function(material, textures) { const transform = material.alphaMapTransform; transform.isTransformUV && transform.update(); this.set(transform.elements); }],\n\t'normalMap': [4, function(material, textures) { this.set(material.normalMap, textures); }],\n\t'normalScale': [4, function(material, textures) { this.setValue(material.normalScale.x, material.normalScale.y); }],\n\t'bumpMap': [4, function(material, textures) { this.set(material.bumpMap, textures); }],\n\t'bumpScale': [4, function(material, textures) { this.set(material.bumpScale); }],\n\t'cubeMap': [4, function(material, textures) { this.set(material.cubeMap, textures); }],\n\t'u_Specular': [4, function(material, textures) { this.set(material.shininess); }],\n\t'u_SpecularColor': [4, function(material, textures) { const color = material.specular; this.setValue(color.r, color.g, color.b); }],\n\t'specularMap': [4, function(material, textures) { this.set(material.specularMap, textures); }],\n\t'aoMap': [4, function(material, textures) { this.set(material.aoMap, textures); }],\n\t'aoMapIntensity': [4, function(material, textures) { this.set(material.aoMapIntensity); }],\n\t'aoMapUVTransform': [4, function(material, textures) { const transform = material.aoMapTransform; transform.isTransformUV && transform.update(); this.set(transform.elements); }],\n\t'u_Roughness': [4, function(material, textures) { this.set(material.roughness); }],\n\t'roughnessMap': [4, function(material, textures) { this.set(material.roughnessMap, textures); }],\n\t'u_Metalness': [4, function(material, textures) { this.set(material.metalness); }],\n\t'metalnessMap': [4, function(material, textures) { this.set(material.metalnessMap, textures); }],\n\t'u_Clearcoat': [4, function(material, textures) { this.set(material.clearcoat); }],\n\t'u_ClearcoatRoughness': [4, function(material, textures) { this.set(material.clearcoatRoughness); }],\n\t'clearcoatMap': [4, function(material, textures) { this.set(material.clearcoatMap, textures); }],\n\t'clearcoatRoughnessMap': [4, function(material, textures) { this.set(material.clearcoatRoughnessMap, textures); }],\n\t'clearcoatNormalMap': [4, function(material, textures) { this.set(material.clearcoatNormalMap, textures); }],\n\t'clearcoatNormalScale': [4, function(material, textures) { this.setValue(material.clearcoatNormalScale.x, material.clearcoatNormalScale.y); }],\n\t'glossiness': [4, function(material, textures) { this.set(material.glossiness); }],\n\t'glossinessMap': [4, function(material, textures) { this.set(material.glossinessMap, textures); }],\n\t'emissive': [4, function(material, textures) { const color = material.emissive; this.setValue(color.r, color.g, color.b); }],\n\t'emissiveMap': [4, function(material, textures) { this.set(material.emissiveMap, textures); }],\n\t'emissiveMapUVTransform': [4, function(material, textures) { const transform = material.emissiveMapTransform; transform.isTransformUV && transform.update(); this.set(transform.elements); }],\n\t'uvTransform': [4, function(material, textures) { const transform = material.diffuseMapTransform; transform.isTransformUV && transform.update(); this.set(transform.elements); }],\n\t'u_PointSize': [4, function(material, textures) { this.set(material.size); }],\n\t'envMap': [5, function(envData, textures) { this.set(envData.map, textures); }],\n\t'envMapParams': [5, function(envData, textures) { this.setValue(envData.diffuse, envData.specular, (envData.map.images[0] && envData.map.images[0].rtt) ? 1 : -1); }],\n\t'maxMipLevel': [5, function(envData, textures) { this.set(textures.get(envData.map).__maxMipLevel || 8); }]\n};\n\n// Empty textures\n\nconst emptyTexture = new Texture2D();\nemptyTexture.image = { data: new Uint8Array([1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1]), width: 2, height: 2 };\nemptyTexture.magFilter = TEXTURE_FILTER.NEAREST;\nemptyTexture.minFilter = TEXTURE_FILTER.NEAREST;\nemptyTexture.generateMipmaps = false;\nemptyTexture.version++;\nconst emptyShadowTexture = new Texture2D();\nemptyShadowTexture.image = { data: null, width: 2, height: 2 };\nemptyShadowTexture.version++;\nemptyShadowTexture.type = PIXEL_TYPE.FLOAT_32_UNSIGNED_INT_24_8_REV;\nemptyShadowTexture.format = PIXEL_FORMAT.DEPTH_STENCIL;\nemptyShadowTexture.magFilter = TEXTURE_FILTER.NEAREST;\nemptyShadowTexture.minFilter = TEXTURE_FILTER.NEAREST;\nemptyShadowTexture.compare = COMPARE_FUNC.LESS;\nemptyShadowTexture.generateMipmaps = false;\nemptyShadowTexture.version++;\nconst emptyTexture3d = new Texture3D();\nconst emptyTexture2dArray = new Texture2DArray();\nconst emptyCubeTexture = new TextureCube();\n\n// Array helpers\n\nfunction arraysEqual(a, b) {\n\tif (a.length !== b.length) return false;\n\n\tfor (let i = 0, l = a.length; i < l; i++) {\n\t\tif (a[i] !== b[i]) return false;\n\t}\n\n\treturn true;\n}\n\nfunction copyArray(a, b) {\n\tfor (let i = 0, l = b.length; i < l; i++) {\n\t\ta[i] = b[i];\n\t}\n}\n\n// Texture unit allocation\n\nconst arrayCacheI32 = [];\n\nfunction allocTexUnits(textures, n) {\n\tlet r = arrayCacheI32[n];\n\n\tif (r === undefined) {\n\t\tr = new Int32Array(n);\n\t\tarrayCacheI32[n] = r;\n\t}\n\n\tfor (let i = 0; i !== n; ++i) {\n\t\tr[i] = textures.allocTexUnit();\n\t}\n\n\treturn r;\n}\n\n// Helper to pick the right setter for uniform\n\nfunction generateSetter(uniform, pureArray) {\n\tconst gl = uniform.gl;\n\tconst type = uniform.type;\n\tconst location = uniform.location;\n\tconst cache = uniform.cache;\n\n\tswitch (type) {\n\t\tcase gl.FLOAT:\n\t\t\tuniform.setValue = function(value) {\n\t\t\t\tif (cache[0] === value) return;\n\t\t\t\tgl.uniform1f(location, value);\n\t\t\t\tcache[0] = value;\n\t\t\t};\n\t\t\tif (pureArray) {\n\t\t\t\tuniform.set = function(value) {\n\t\t\t\t\tif (arraysEqual(cache, value)) return;\n\t\t\t\t\tgl.uniform1fv(location, value);\n\t\t\t\t\tcopyArray(cache, value);\n\t\t\t\t};\n\t\t\t} else {\n\t\t\t\tuniform.set = uniform.setValue;\n\t\t\t}\n\t\t\tbreak;\n\t\tcase gl.SAMPLER_2D:\n\t\tcase gl.SAMPLER_2D_SHADOW:\n\t\tcase gl.INT_SAMPLER_2D:\n\t\tcase gl.UNSIGNED_INT_SAMPLER_2D:\n\t\t\tuniform.setValue = function(value, textures) {\n\t\t\t\tconst unit = textures.allocTexUnit();\n\t\t\t\ttextures.setTexture(value || (type === gl.SAMPLER_2D_SHADOW ? emptyShadowTexture : emptyTexture), unit);\n\t\t\t\tif (cache[0] === unit) return;\n\t\t\t\tgl.uniform1i(location, unit);\n\t\t\t\tcache[0] = unit;\n\t\t\t};\n\t\t\tif (pureArray) {\n\t\t\t\tuniform.set = function(value, textures) {\n\t\t\t\t\tconst n = value.length;\n\t\t\t\t\tconst units = allocTexUnits(textures, n);\n\t\t\t\t\tfor (let i = 0; i !== n; ++i) {\n\t\t\t\t\t\ttextures.setTexture(value[i] || (type === gl.SAMPLER_2D_SHADOW ? emptyShadowTexture : emptyTexture), units[i]);\n\t\t\t\t\t}\n\t\t\t\t\tif (arraysEqual(cache, units)) return;\n\t\t\t\t\tgl.uniform1iv(location, units);\n\t\t\t\t\tcopyArray(cache, units);\n\t\t\t\t};\n\t\t\t} else {\n\t\t\t\tuniform.set = uniform.setValue;\n\t\t\t}\n\t\t\tbreak;\n\t\tcase gl.SAMPLER_2D_ARRAY:\n\t\tcase gl.SAMPLER_2D_ARRAY_SHADOW:\n\t\tcase gl.INT_SAMPLER_2D_ARRAY:\n\t\tcase gl.UNSIGNED_INT_SAMPLER_2D_ARRAY:\n\t\t\tuniform.setValue = function(value, textures) {\n\t\t\t\tconst unit = textures.allocTexUnit();\n\t\t\t\ttextures.setTexture(value || emptyTexture2dArray, unit);\n\t\t\t\tif (cache[0] === unit) return;\n\t\t\t\tgl.uniform1i(location, unit);\n\t\t\t\tcache[0] = unit;\n\t\t\t};\n\t\t\tif (pureArray) {\n\t\t\t\tuniform.set = function(value, textures) {\n\t\t\t\t\tconst n = value.length;\n\t\t\t\t\tconst units = allocTexUnits(textures, n);\n\t\t\t\t\tfor (let i = 0; i !== n; ++i) {\n\t\t\t\t\t\ttextures.setTexture(value[i] || emptyTexture2dArray, units[i]);\n\t\t\t\t\t}\n\t\t\t\t\tif (arraysEqual(cache, units)) return;\n\t\t\t\t\tgl.uniform1iv(location, units);\n\t\t\t\t\tcopyArray(cache, units);\n\t\t\t\t};\n\t\t\t} else {\n\t\t\t\tuniform.set = uniform.setValue;\n\t\t\t}\n\t\t\tbreak;\n\t\tcase gl.SAMPLER_CUBE:\n\t\tcase gl.SAMPLER_CUBE_SHADOW:\n\t\t\tuniform.setValue = function(value, textures) {\n\t\t\t\tconst unit = textures.allocTexUnit();\n\t\t\t\ttextures.setTexture(value || emptyCubeTexture, unit);\n\t\t\t\tif (cache[0] === unit) return;\n\t\t\t\tgl.uniform1i(location, unit);\n\t\t\t\tcache[0] = unit;\n\t\t\t};\n\t\t\tif (pureArray) {\n\t\t\t\tuniform.set = function(value, textures) {\n\t\t\t\t\tconst n = value.length;\n\t\t\t\t\tconst units = allocTexUnits(textures, n);\n\t\t\t\t\tfor (let i = 0; i !== n; ++i) {\n\t\t\t\t\t\ttextures.setTexture(value[i] || emptyCubeTexture, units[i]);\n\t\t\t\t\t}\n\t\t\t\t\tif (arraysEqual(cache, units)) return;\n\t\t\t\t\tgl.uniform1iv(location, units);\n\t\t\t\t\tcopyArray(cache, units);\n\t\t\t\t};\n\t\t\t} else {\n\t\t\t\tuniform.set = uniform.setValue;\n\t\t\t}\n\t\t\tbreak;\n\t\tcase gl.SAMPLER_3D:\n\t\t\tuniform.setValue = function(value, textures) {\n\t\t\t\tconst unit = textures.allocTexUnit();\n\t\t\t\ttextures.setTexture(value || emptyTexture3d, unit);\n\t\t\t\tif (cache[0] === unit) return;\n\t\t\t\tgl.uniform1i(location, unit);\n\t\t\t\tcache[0] = unit;\n\t\t\t};\n\t\t\tif (pureArray) {\n\t\t\t\tuniform.set = function(value, textures) {\n\t\t\t\t\tconst n = value.length;\n\t\t\t\t\tconst units = allocTexUnits(textures, n);\n\t\t\t\t\tfor (let i = 0; i !== n; ++i) {\n\t\t\t\t\t\ttextures.setTexture(value[i] || emptyTexture3d, units[i]);\n\t\t\t\t\t}\n\t\t\t\t\tif (arraysEqual(cache, units)) return;\n\t\t\t\t\tgl.uniform1iv(location, units);\n\t\t\t\t\tcopyArray(cache, units);\n\t\t\t\t};\n\t\t\t} else {\n\t\t\t\tuniform.set = uniform.setValue;\n\t\t\t}\n\t\t\tbreak;\n\t\tcase gl.BOOL:\n\t\tcase gl.INT:\n\t\t\tuniform.setValue = function(value) {\n\t\t\t\tif (cache[0] === value) return;\n\t\t\t\tgl.uniform1i(location, value);\n\t\t\t\tcache[0] = value;\n\t\t\t};\n\t\t\tif (pureArray) {\n\t\t\t\tuniform.set = function(value) {\n\t\t\t\t\tif (arraysEqual(cache, value)) return;\n\t\t\t\t\tgl.uniform1iv(location, value);\n\t\t\t\t\tcopyArray(cache, value);\n\t\t\t\t};\n\t\t\t} else {\n\t\t\t\tuniform.set = uniform.setValue;\n\t\t\t}\n\t\t\tbreak;\n\t\tcase gl.FLOAT_VEC2:\n\t\t\tuniform.setValue = function(p1, p2) {\n\t\t\t\tif (cache[0] !== p1 || cache[1] !== p2) {\n\t\t\t\t\tgl.uniform2f(location, p1, p2);\n\t\t\t\t\tcache[0] = p1;\n\t\t\t\t\tcache[1] = p2;\n\t\t\t\t}\n\t\t\t};\n\t\t\tuniform.set = function(value) {\n\t\t\t\tif (arraysEqual(cache, value)) return;\n\t\t\t\tgl.uniform2fv(location, value);\n\t\t\t\tcopyArray(cache, value);\n\t\t\t};\n\t\t\tbreak;\n\t\tcase gl.BOOL_VEC2:\n\t\tcase gl.INT_VEC2:\n\t\t\tuniform.setValue = function(p1, p2) {\n\t\t\t\tif (cache[0] !== p1 || cache[1] !== p2) {\n\t\t\t\t\tgl.uniform2i(location, p1, p2);\n\t\t\t\t\tcache[0] = p1;\n\t\t\t\t\tcache[1] = p2;\n\t\t\t\t}\n\t\t\t};\n\t\t\tuniform.set = function(value) {\n\t\t\t\tif (arraysEqual(cache, value)) return;\n\t\t\t\tgl.uniform2iv(location, value);\n\t\t\t\tcopyArray(cache, value);\n\t\t\t};\n\t\t\tbreak;\n\t\tcase gl.FLOAT_VEC3:\n\t\t\tuniform.setValue = function(p1, p2, p3) {\n\t\t\t\tif (cache[0] !== p1 || cache[1] !== p2 || cache[2] !== p3) {\n\t\t\t\t\tgl.uniform3f(location, p1, p2, p3);\n\t\t\t\t\tcache[0] = p1;\n\t\t\t\t\tcache[1] = p2;\n\t\t\t\t\tcache[2] = p3;\n\t\t\t\t}\n\t\t\t};\n\t\t\tuniform.set = function(value) {\n\t\t\t\tif (arraysEqual(cache, value)) return;\n\t\t\t\tgl.uniform3fv(location, value);\n\t\t\t\tcopyArray(cache, value);\n\t\t\t};\n\t\t\tbreak;\n\t\tcase gl.BOOL_VEC3:\n\t\tcase gl.INT_VEC3:\n\t\t\tuniform.setValue = function(p1, p2, p3) {\n\t\t\t\tif (cache[0] !== p1 || cache[1] !== p2 || cache[2] !== p3) {\n\t\t\t\t\tgl.uniform3i(location, p1, p2, p3);\n\t\t\t\t\tcache[0] = p1;\n\t\t\t\t\tcache[1] = p2;\n\t\t\t\t\tcache[2] = p3;\n\t\t\t\t}\n\t\t\t};\n\t\t\tuniform.set = function(value) {\n\t\t\t\tif (arraysEqual(cache, value)) return;\n\t\t\t\tgl.uniform3iv(location, value);\n\t\t\t\tcopyArray(cache, value);\n\t\t\t};\n\t\t\tbreak;\n\t\tcase gl.FLOAT_VEC4:\n\t\t\tuniform.setValue = function(p1, p2, p3, p4) {\n\t\t\t\tif (cache[0] !== p1 || cache[1] !== p2 || cache[2] !== p3 || cache[3] !== p4) {\n\t\t\t\t\tgl.uniform4f(location, p1, p2, p3, p4);\n\t\t\t\t\tcache[0] = p1;\n\t\t\t\t\tcache[1] = p2;\n\t\t\t\t\tcache[2] = p3;\n\t\t\t\t\tcache[3] = p4;\n\t\t\t\t}\n\t\t\t};\n\t\t\tuniform.set = function(value) {\n\t\t\t\tif (arraysEqual(cache, value)) return;\n\t\t\t\tgl.uniform4fv(location, value);\n\t\t\t\tcopyArray(cache, value);\n\t\t\t};\n\t\t\tbreak;\n\t\tcase gl.BOOL_VEC4:\n\t\tcase gl.INT_VEC4:\n\t\t\tuniform.setValue = function(p1, p2, p3, p4) {\n\t\t\t\tif (cache[0] !== p1 || cache[1] !== p2 || cache[2] !== p3 || cache[3] !== p4) {\n\t\t\t\t\tgl.uniform4i(location, p1, p2, p3, p4);\n\t\t\t\t\tcache[0] = p1;\n\t\t\t\t\tcache[1] = p2;\n\t\t\t\t\tcache[2] = p3;\n\t\t\t\t\tcache[3] = p4;\n\t\t\t\t}\n\t\t\t};\n\t\t\tuniform.set = function(value) {\n\t\t\t\tif (arraysEqual(cache, value)) return;\n\t\t\t\tgl.uniform4iv(location, value);\n\t\t\t\tcopyArray(cache, value);\n\t\t\t};\n\t\t\tbreak;\n\n\t\tcase gl.FLOAT_MAT2:\n\t\t\tif (pureArray) {\n\t\t\t\tuniform.setValue = uniform.set = function(value) {\n\t\t\t\t\tif (arraysEqual(cache, value)) return;\n\t\t\t\t\tgl.uniformMatrix2fv(location, false, value);\n\t\t\t\t\tcopyArray(cache, value);\n\t\t\t\t};\n\t\t\t} else {\n\t\t\t\tuniform.setValue = uniform.set = function(value) {\n\t\t\t\t\tif (cache[0] !== value[0] || cache[1] !== value[1] || cache[2] !== value[2] || cache[3] !== value[3]) {\n\t\t\t\t\t\tgl.uniformMatrix2fv(location, false, value);\n\t\t\t\t\t\tcache[0] = value[0];\n\t\t\t\t\t\tcache[1] = value[1];\n\t\t\t\t\t\tcache[2] = value[2];\n\t\t\t\t\t\tcache[3] = value[3];\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t}\n\t\t\tbreak;\n\t\tcase gl.FLOAT_MAT3:\n\t\t\tif (pureArray) {\n\t\t\t\tuniform.setValue = uniform.set = function(value) {\n\t\t\t\t\tif (arraysEqual(cache, value)) return;\n\t\t\t\t\tgl.uniformMatrix3fv(location, false, value);\n\t\t\t\t\tcopyArray(cache, value);\n\t\t\t\t};\n\t\t\t} else {\n\t\t\t\tuniform.setValue = uniform.set = function(value) {\n\t\t\t\t\tif (cache[0] !== value[0] || cache[1] !== value[1] || cache[2] !== value[2]\n\t\t\t\t\t\t|| cache[3] !== value[3] || cache[4] !== value[4] || cache[5] !== value[5]\n\t\t\t\t\t\t|| cache[6] !== value[6] || cache[7] !== value[7] || cache[8] !== value[8]) {\n\t\t\t\t\t\tgl.uniformMatrix3fv(location, false, value);\n\t\t\t\t\t\tcache[0] = value[0];\n\t\t\t\t\t\tcache[1] = value[1];\n\t\t\t\t\t\tcache[2] = value[2];\n\t\t\t\t\t\tcache[3] = value[3];\n\t\t\t\t\t\tcache[4] = value[4];\n\t\t\t\t\t\tcache[5] = value[5];\n\t\t\t\t\t\tcache[6] = value[6];\n\t\t\t\t\t\tcache[7] = value[7];\n\t\t\t\t\t\tcache[8] = value[8];\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t}\n\t\t\tbreak;\n\t\tcase gl.FLOAT_MAT4:\n\t\t\tif (pureArray) {\n\t\t\t\tuniform.setValue = uniform.set = function(value) {\n\t\t\t\t\tif (arraysEqual(cache, value)) return;\n\t\t\t\t\tgl.uniformMatrix4fv(location, false, value);\n\t\t\t\t\tcopyArray(cache, value);\n\t\t\t\t};\n\t\t\t} else {\n\t\t\t\tuniform.setValue = uniform.set = function(value) {\n\t\t\t\t\tif (cache[0] !== value[0] || cache[1] !== value[1] || cache[2] !== value[2] || cache[3] !== value[3]\n\t\t\t\t\t\t|| cache[4] !== value[4] || cache[5] !== value[5] || cache[6] !== value[6] || cache[7] !== value[7]\n\t\t\t\t\t\t|| cache[8] !== value[8] || cache[9] !== value[9] || cache[10] !== value[10] || cache[11] !== value[11]\n\t\t\t\t\t\t|| cache[12] !== value[12] || cache[13] !== value[13] || cache[14] !== value[14] || cache[15] !== value[15]) {\n\t\t\t\t\t\tgl.uniformMatrix4fv(location, false, value);\n\t\t\t\t\t\tcache[0] = value[0];\n\t\t\t\t\t\tcache[1] = value[1];\n\t\t\t\t\t\tcache[2] = value[2];\n\t\t\t\t\t\tcache[3] = value[3];\n\t\t\t\t\t\tcache[4] = value[4];\n\t\t\t\t\t\tcache[5] = value[5];\n\t\t\t\t\t\tcache[6] = value[6];\n\t\t\t\t\t\tcache[7] = value[7];\n\t\t\t\t\t\tcache[8] = value[8];\n\t\t\t\t\t\tcache[9] = value[9];\n\t\t\t\t\t\tcache[10] = value[10];\n\t\t\t\t\t\tcache[11] = value[11];\n\t\t\t\t\t\tcache[12] = value[12];\n\t\t\t\t\t\tcache[13] = value[13];\n\t\t\t\t\t\tcache[14] = value[14];\n\t\t\t\t\t\tcache[15] = value[15];\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t}\n\t\t\tbreak;\n\t}\n}\n\n// --- Uniform Classes ---\n\nclass SingleUniform {\n\n\tconstructor(gl, id, activeInfo, location) {\n\t\tthis.gl = gl;\n\n\t\tthis.id = id;\n\n\t\tthis.type = activeInfo.type;\n\n\t\t// this.size = activeInfo.size; // always be 1\n\n\t\tthis.location = location;\n\n\t\tthis.setValue = undefined;\n\t\tthis.set = undefined;\n\t\tthis.cache = [];\n\n\t\tgenerateSetter(this);\n\n\t\t// internal\n\n\t\tthis.internalGroup = 0;\n\t\tthis.internalFun = null;\n\n\t\tconst internal = internalUniforms[id];\n\t\tif (internal) {\n\t\t\tthis.internalGroup = internal[0];\n\t\t\tthis.internalFun = internal[1];\n\t\t}\n\t}\n\n}\n\nclass PureArrayUniform {\n\n\tconstructor(gl, id, activeInfo, location) {\n\t\tthis.gl = gl;\n\n\t\tthis.id = id;\n\n\t\tthis.type = activeInfo.type;\n\n\t\tthis.size = activeInfo.size;\n\n\t\tthis.location = location;\n\n\t\tthis.setValue = undefined;\n\t\tthis.set = undefined;\n\t\tthis.cache = [];\n\n\t\tgenerateSetter(this, true);\n\t}\n\n}\n\nclass UniformContainer {\n\n\tconstructor() {\n\t\tthis.seq = [];\n\t\tthis.map = {};\n\t}\n\n}\n\nclass StructuredUniform extends UniformContainer {\n\n\tconstructor(id) {\n\t\tsuper();\n\t\tthis.id = id;\n\t}\n\n\tset(value, textures) {\n\t\tconst seq = this.seq;\n\n\t\tfor (let i = 0, n = seq.length; i !== n; ++i) {\n\t\t\tconst u = seq[i];\n\t\t\tu.set(value[u.id], textures);\n\t\t}\n\t}\n\n}\n\n// --- Top-level ---\n\n// Parser - builds up the property tree from the path strings\n\nconst RePathPart = /(\\w+)(\\])?(\\[|\\.)?/g;\n\n// extracts\n// \t- the identifier (member name or array index)\n//  - followed by an optional right bracket (found when array index)\n//  - followed by an optional left bracket or dot (type of subscript)\n//\n// Note: These portions can be read in a non-overlapping fashion and\n// allow straightforward parsing of the hierarchy that WebGL encodes\n// in the uniform names.\n\nfunction addUniform(container, uniformObject) {\n\tcontainer.seq.push(uniformObject);\n\tcontainer.map[uniformObject.id] = uniformObject;\n}\n\n// https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/getActiveUniform\nfunction parseUniform(gl, activeInfo, location, container) {\n\tconst path = activeInfo.name,\n\t\tpathLength = path.length;\n\n\t// reset RegExp object, because of the early exit of a previous run\n\tRePathPart.lastIndex = 0;\n\n\twhile (true) {\n\t\tconst match = RePathPart.exec(path),\n\t\t\tmatchEnd = RePathPart.lastIndex;\n\n\t\tlet id = match[1];\n\t\tconst idIsIndex = match[2] === ']',\n\t\t\tsubscript = match[3];\n\n\t\tif (idIsIndex) id = id | 0; // convert to integer\n\n\t\tif (subscript === undefined || subscript === '[' && matchEnd + 2 === pathLength) {\n\t\t\t// bare name or \"pure\" bottom-level array \"[0]\" suffix\n\t\t\taddUniform(container, subscript === undefined ?\n\t\t\t\tnew SingleUniform(gl, id, activeInfo, location) :\n\t\t\t\tnew PureArrayUniform(gl, id, activeInfo, location));\n\t\t\tbreak;\n\t\t} else {\n\t\t\t// step into inner node / create it in case it doesn't exist\n\t\t\tconst map = container.map;\n\t\t\tlet next = map[id];\n\t\t\tif (next === undefined) {\n\t\t\t\tnext = new StructuredUniform(id);\n\t\t\t\taddUniform(container, next);\n\t\t\t}\n\t\t\tcontainer = next;\n\t\t}\n\t}\n}\n\n// Root Container\n\nclass WebGLUniforms extends UniformContainer {\n\n\tconstructor(gl, program) {\n\t\tsuper();\n\n\t\tconst n = gl.getProgramParameter(program, gl.ACTIVE_UNIFORMS);\n\n\t\tfor (let i = 0; i < n; ++i) {\n\t\t\tconst info = gl.getActiveUniform(program, i),\n\t\t\t\taddr = gl.getUniformLocation(program, info.name);\n\n\t\t\tparseUniform(gl, info, addr, this);\n\t\t}\n\t}\n\n\tset(name, value, textures) {\n\t\tconst u = this.map[name];\n\t\tif (u !== undefined) u.set(value, textures);\n\t}\n\n\thas(name) {\n\t\treturn !!this.map[name];\n\t}\n\n}\n\nlet programIdCount = 0;\n\nclass WebGLProgram {\n\n\tconstructor(gl, vshader, fshader) {\n\t\tthis.gl = gl;\n\t\tthis.vshaderSource = vshader;\n\t\tthis.fshaderSource = fshader;\n\n\t\tthis.id = programIdCount++;\n\t\tthis.usedTimes = 1;\n\n\t\tthis.code = '';\n\t\tthis.name = '';\n\n\t\tthis.lightId = -1;\n\t\tthis.lightVersion = -1;\n\t\tthis.cameraId = -1;\n\t\tthis.cameraVersion = -1;\n\t\tthis.sceneId = -1;\n\t\tthis.sceneVersion = -1;\n\n\t\tthis.program;\n\n\t\tthis._checkErrors = true;\n\t\tthis._compileAsynchronously = false;\n\t\tthis._status = 0;\n\n\t\tlet program, vertexShader, fragmentShader;\n\n\t\t// compile program\n\t\tthis.compile = function(options) {\n\t\t\t// create shaders\n\n\t\t\tvertexShader = loadShader(gl, gl.VERTEX_SHADER, vshader);\n\t\t\tfragmentShader = loadShader(gl, gl.FRAGMENT_SHADER, fshader);\n\n\t\t\t// create a program object\n\n\t\t\tprogram = gl.createProgram();\n\t\t\tgl.attachShader(program, vertexShader);\n\t\t\tgl.attachShader(program, fragmentShader);\n\t\t\tgl.linkProgram(program);\n\n\t\t\tthis.program = program;\n\n\t\t\t// set properties\n\n\t\t\tthis._checkErrors = options.checkErrors;\n\t\t\tthis._compileAsynchronously = options.compileAsynchronously;\n\t\t\tthis._status = 1;\n\n\t\t\t// here we can delete shaders,\n\t\t\t// according to the documentation: https://www.opengl.org/sdk/docs/man/html/glLinkProgram.xhtml\n\n\t\t\tgl.deleteShader(vertexShader);\n\t\t\tgl.deleteShader(fragmentShader);\n\t\t};\n\n\t\t// check if program is ready to be used\n\t\tthis.isReady = function(parallelShaderCompileExt) {\n\t\t\tif (this._status === 1) {\n\t\t\t\tif (this._compileAsynchronously && parallelShaderCompileExt) {\n\t\t\t\t\tif (gl.getProgramParameter(program, parallelShaderCompileExt.COMPLETION_STATUS_KHR)) {\n\t\t\t\t\t\tthis._status = 2;\n\t\t\t\t\t\tthis._tryCheckErrors();\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tthis._status = 2;\n\t\t\t\t\tthis._tryCheckErrors();\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn this._status === 2;\n\t\t};\n\n\t\tthis._tryCheckErrors = function() {\n\t\t\tif (!this._checkErrors) return;\n\n\t\t\tif (gl.getProgramParameter(program, gl.LINK_STATUS) === false) {\n\t\t\t\tconst programLog = gl.getProgramInfoLog(program).trim();\n\n\t\t\t\tconst vertexErrors = getShaderErrors(gl, vertexShader, 'VERTEX');\n\t\t\t\tconst fragmentErrors = getShaderErrors(gl, fragmentShader, 'FRAGMENT');\n\n\t\t\t\tthis.program = undefined;\n\t\t\t\tthis._status = 0;\n\n\t\t\t\tconsole.error(\n\t\t\t\t\t'Shader Error ' + gl.getError() + ' - ' +\n\t\t\t\t\t'VALIDATE_STATUS ' + gl.getProgramParameter(program, gl.VALIDATE_STATUS) + '\\n\\n' +\n\t\t\t\t\t'Shader Name: ' + this.name + '\\n' +\n\t\t\t\t\t'Program Info Log: ' + programLog + '\\n' +\n\t\t\t\t\tvertexErrors + '\\n' +\n\t\t\t\t\tfragmentErrors\n\t\t\t\t);\n\t\t\t}\n\t\t};\n\n\t\t// set up caching for uniforms\n\n\t\tlet cachedUniforms;\n\n\t\tthis.getUniforms = function() {\n\t\t\tif (cachedUniforms === undefined) {\n\t\t\t\tcachedUniforms = new WebGLUniforms(gl, program);\n\t\t\t}\n\t\t\treturn cachedUniforms;\n\t\t};\n\n\t\t// set up caching for attributes\n\n\t\tlet cachedAttributes;\n\n\t\tthis.getAttributes = function() {\n\t\t\tif (cachedAttributes === undefined) {\n\t\t\t\tcachedAttributes = extractAttributes(gl, program);\n\t\t\t}\n\t\t\treturn cachedAttributes;\n\t\t};\n\n\t\t// free program\n\n\t\tthis.dispose = function() {\n\t\t\tgl.deleteProgram(program);\n\t\t\tthis.program = undefined;\n\t\t\tthis._status = 0;\n\t\t};\n\t}\n\n}\n\nfunction handleSource(string, errorLine) {\n\tconst lines = string.split('\\n');\n\tconst lines2 = [];\n\n\tconst from = Math.max(errorLine - 6, 0);\n\tconst to = Math.min(errorLine + 6, lines.length);\n\n\tfor (let i = from; i < to; i++) {\n\t\tconst line = i + 1;\n\t\tlines2.push(`${line === errorLine ? '>' : ' '} ${line}: ${lines[i]}`);\n\t}\n\n\treturn lines2.join('\\n');\n}\n\nfunction loadShader(gl, type, source) {\n\tconst shader = gl.createShader(type);\n\tgl.shaderSource(shader, source);\n\tgl.compileShader(shader);\n\treturn shader;\n}\n\nfunction getShaderErrors(gl, shader, type) {\n\tconst status = gl.getShaderParameter(shader, gl.COMPILE_STATUS);\n\tconst errors = gl.getShaderInfoLog(shader).trim();\n\n\tif (status && errors === '') return '';\n\n\tconst errorMatches = /ERROR: 0:(\\d+)/.exec(errors);\n\n\tif (errorMatches) {\n\t\t// --enable-privileged-webgl-extension\n\t\t// console.log( '**' + type + '**', gl.getExtension( 'WEBGL_debug_shaders' ).getTranslatedShaderSource( shader ) );\n\n\t\tconst errorLine = parseInt(errorMatches[1]);\n\t\treturn type + '\\n\\n' + errors + '\\n\\n' + handleSource(gl.getShaderSource(shader), errorLine);\n\t} else {\n\t\treturn errors;\n\t}\n}\n\n// extract attributes\nfunction extractAttributes(gl, program) {\n\tconst attributes = {};\n\n\tconst totalAttributes = gl.getProgramParameter(program, gl.ACTIVE_ATTRIBUTES);\n\n\tfor (let i = 0; i < totalAttributes; i++) {\n\t\tconst attribData = gl.getActiveAttrib(program, i);\n\t\tattributes[attribData.name] = new WebGLAttribute(gl, program, attribData);\n\t}\n\n\treturn attributes;\n}\n\nclass WebGLPrograms {\n\n\tconstructor(gl, state, capabilities) {\n\t\tthis._gl = gl;\n\t\tthis._state = state;\n\t\tthis._capabilities = capabilities;\n\n\t\tthis._programs = [];\n\t}\n\n\tgetProgram(material, props, programCode, compileOptions) {\n\t\tconst programs = this._programs;\n\n\t\tlet program;\n\n\t\tfor (let p = 0, pl = programs.length; p < pl; p++) {\n\t\t\tconst programInfo = programs[p];\n\t\t\tif (programInfo.code === programCode) {\n\t\t\t\tprogram = programInfo;\n\t\t\t\t++program.usedTimes;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tif (program === undefined) {\n\t\t\tconst customDefines = generateDefines(material.defines);\n\n\t\t\tconst vertexShader = ShaderLib[material.type + '_vert'] || material.vertexShader || ShaderLib.basic_vert;\n\t\t\tconst fragmentShader = ShaderLib[material.type + '_frag'] || material.fragmentShader || ShaderLib.basic_frag;\n\n\t\t\tprogram = createProgram(this._gl, customDefines, props, vertexShader, fragmentShader);\n\t\t\tprogram.name = props.shaderName;\n\t\t\tprogram.compile(compileOptions);\n\t\t\tprogram.code = programCode;\n\n\t\t\tprograms.push(program);\n\t\t}\n\n\t\treturn program;\n\t}\n\n\treleaseProgram(program) {\n\t\tif (--program.usedTimes === 0) {\n\t\t\tconst programs = this._programs;\n\n\t\t\t// Remove from unordered set\n\t\t\tconst index = programs.indexOf(program);\n\t\t\tprograms[index] = programs[programs.length - 1];\n\t\t\tprograms.pop();\n\n\t\t\t// Free WebGL resources\n\t\t\tprogram.dispose(this._gl);\n\t\t}\n\t}\n\n\tgenerateProps(material, object, lightingState, renderStates) {\n\t\tconst state = this._state;\n\t\tconst capabilities = this._capabilities;\n\n\t\tconst fog = material.fog ? renderStates.scene.fog : null;\n\t\tconst envMap = material.envMap !== undefined ? (material.envMap || renderStates.scene.environment) : null;\n\t\tconst logarithmicDepthBuffer = renderStates.scene.logarithmicDepthBuffer;\n\t\tconst disableShadowSampler = renderStates.scene.disableShadowSampler;\n\t\tconst numClippingPlanes = (material.clippingPlanes && material.clippingPlanes.length > 0) ? material.clippingPlanes.length : renderStates.scene.numClippingPlanes;\n\n\t\tconst HAS_CLEARCOAT = material.clearcoat > 0;\n\n\t\tconst HAS_DIFFUSEMAP = !!material.diffuseMap;\n\t\tconst HAS_ALPHAMAP = !!material.alphaMap;\n\t\tconst HAS_EMISSIVEMAP = !!material.emissiveMap;\n\t\tconst HAS_AOMAP = !!material.aoMap;\n\t\tconst HAS_NORMALMAP = !!material.normalMap;\n\t\tconst HAS_BUMPMAP = !!material.bumpMap;\n\t\tconst HAS_SPECULARMAP = !!material.specularMap;\n\t\tconst HAS_ROUGHNESSMAP = !!material.roughnessMap;\n\t\tconst HAS_METALNESSMAP = !!material.metalnessMap;\n\t\tconst HAS_GLOSSINESSMAP = !!material.glossinessMap;\n\n\t\tconst HAS_ENVMAP = !!envMap;\n\n\t\tconst HAS_CLEARCOATMAP = HAS_CLEARCOAT && !!material.clearcoatMap;\n\t\tconst HAS_CLEARCOAT_ROUGHNESSMAP = HAS_CLEARCOAT && !!material.clearcoatRoughnessMap;\n\t\tconst HAS_CLEARCOAT_NORMALMAP = HAS_CLEARCOAT && !!material.clearcoatNormalMap;\n\n\t\t_activeMapCoords = material.extUvCoordMask; // reset\n\n\t\tconst props = {}; // cache this props?\n\n\t\tprops.shaderName = (material.type === MATERIAL_TYPE.SHADER && material.shaderName) ? material.shaderName : material.type;\n\n\t\t// capabilities\n\n\t\tprops.version = capabilities.version;\n\t\tprops.precision = material.precision || capabilities.maxPrecision;\n\t\tprops.useStandardDerivatives = capabilities.version >= 2 || !!capabilities.getExtension('OES_standard_derivatives') || !!capabilities.getExtension('GL_OES_standard_derivatives');\n\t\tprops.useShaderTextureLOD = capabilities.version >= 2 || !!capabilities.getExtension('EXT_shader_texture_lod');\n\n\t\t// maps\n\n\t\tprops.useDiffuseMap = HAS_DIFFUSEMAP;\n\t\tprops.useAlphaMap = HAS_ALPHAMAP;\n\t\tprops.useEmissiveMap = HAS_EMISSIVEMAP;\n\t\tprops.useAOMap = HAS_AOMAP;\n\t\tprops.useNormalMap = HAS_NORMALMAP;\n\t\tprops.useBumpMap = HAS_BUMPMAP;\n\t\tprops.useSpecularMap = HAS_SPECULARMAP;\n\t\tprops.useRoughnessMap = HAS_ROUGHNESSMAP;\n\t\tprops.useMetalnessMap = HAS_METALNESSMAP;\n\t\tprops.useGlossinessMap = HAS_GLOSSINESSMAP;\n\n\t\tprops.useEnvMap = HAS_ENVMAP;\n\t\tprops.envMapCombine = HAS_ENVMAP && material.envMapCombine;\n\n\t\tprops.useClearcoat = HAS_CLEARCOAT;\n\t\tprops.useClearcoatMap = HAS_CLEARCOATMAP;\n\t\tprops.useClearcoatRoughnessMap = HAS_CLEARCOAT_ROUGHNESSMAP;\n\t\tprops.useClearcoatNormalMap = HAS_CLEARCOAT_NORMALMAP;\n\n\t\tprops.diffuseMapUv = HAS_DIFFUSEMAP && getUVChannel(material.diffuseMapCoord);\n\t\tprops.alphaMapUv = HAS_ALPHAMAP && getUVChannel(material.alphaMapCoord);\n\t\tprops.emissiveMapUv = HAS_EMISSIVEMAP && getUVChannel(material.emissiveMapCoord);\n\t\tprops.aoMapUv = HAS_AOMAP && getUVChannel(material.aoMapCoord);\n\n\t\tif (HAS_NORMALMAP || HAS_BUMPMAP || HAS_SPECULARMAP || HAS_ROUGHNESSMAP || HAS_METALNESSMAP || HAS_GLOSSINESSMAP || HAS_CLEARCOATMAP || HAS_CLEARCOAT_ROUGHNESSMAP || HAS_CLEARCOAT_NORMALMAP) {\n\t\t\t_activeMapCoords |= 1 << 0; // these maps use uv coord 0 by default\n\t\t}\n\n\t\tprops.activeMapCoords = _activeMapCoords;\n\n\t\t// lights\n\n\t\tlightingState.setProgramProps(props, object.receiveShadow);\n\n\t\tprops.useShadowSampler = capabilities.version >= 2 && !disableShadowSampler;\n\t\tprops.shadowType = object.shadowType;\n\t\tif (!props.useShadowSampler &&\n\t\t\t(\n\t\t\t\tprops.shadowType == SHADOW_TYPE.PCF3_SOFT ||\n\t\t\t\tprops.shadowType == SHADOW_TYPE.PCF5_SOFT ||\n\t\t\t\tprops.shadowType == SHADOW_TYPE.PCSS16_SOFT ||\n\t\t\t\tprops.shadowType == SHADOW_TYPE.PCSS32_SOFT ||\n\t\t\t\tprops.shadowType == SHADOW_TYPE.PCSS64_SOFT\n\t\t\t)\n\t\t) {\n\t\t\tprops.shadowType = SHADOW_TYPE.VOGEL5_SOFT;\n\n\t\t\tif (props.useShadow) {\n\t\t\t\tconsole.warn('WebGLPrograms: PCF and PCSS shadow type need shadow sampler support, falling back to VOGEL5_SOFT.');\n\t\t\t}\n\t\t}\n\n\t\tprops.dithering = material.dithering;\n\n\t\t// encoding\n\n\t\tconst currentRenderTarget = state.currentRenderTarget;\n\t\tprops.gammaFactor = renderStates.gammaFactor;\n\t\tprops.outputEncoding = currentRenderTarget.texture ? getTextureEncodingFromMap(currentRenderTarget.texture) : renderStates.outputEncoding;\n\t\tprops.diffuseMapEncoding = getTextureEncodingFromMap(material.diffuseMap || material.cubeMap);\n\t\tprops.envMapEncoding = getTextureEncodingFromMap(envMap);\n\t\tprops.emissiveMapEncoding = getTextureEncodingFromMap(material.emissiveMap);\n\n\t\t// other\n\n\t\tprops.alphaTest = material.alphaTest > 0;\n\t\tprops.premultipliedAlpha = material.premultipliedAlpha;\n\t\tprops.useVertexColors = material.vertexColors;\n\t\tprops.useVertexTangents = !!material.normalMap && material.vertexTangents;\n\t\tprops.numClippingPlanes = numClippingPlanes;\n\t\tprops.flatShading = material.shading === SHADING_TYPE.FLAT_SHADING;\n\t\tprops.fog = !!fog;\n\t\tprops.fogExp2 = !!fog && fog.isFogExp2;\n\t\tprops.sizeAttenuation = material.sizeAttenuation;\n\t\tprops.doubleSided = material.side === DRAW_SIDE.DOUBLE;\n\t\tprops.flipSided = material.side === DRAW_SIDE.BACK;\n\t\tprops.packDepthToRGBA = material.packToRGBA;\n\t\tprops.logarithmicDepthBuffer = !!logarithmicDepthBuffer;\n\t\tprops.rendererExtensionFragDepth = capabilities.version >= 2 || !!capabilities.getExtension('EXT_frag_depth');\n\n\t\t// morph targets\n\n\t\tprops.morphTargets = !!object.morphTargetInfluences;\n\t\tprops.morphNormals = !!object.morphTargetInfluences && object.geometry.morphAttributes.normal;\n\n\t\t// skinned mesh\n\n\t\tconst useSkinning = object.isSkinnedMesh && object.skeleton;\n\t\tconst maxVertexUniformVectors = capabilities.maxVertexUniformVectors;\n\t\tconst useVertexTexture = capabilities.maxVertexTextures > 0 && (!!capabilities.getExtension('OES_texture_float') || capabilities.version >= 2);\n\t\tlet maxBones = 0;\n\t\tif (useVertexTexture) {\n\t\t\tmaxBones = 1024;\n\t\t} else {\n\t\t\tmaxBones = object.skeleton ? object.skeleton.bones.length : 0;\n\t\t\tif (maxBones * 16 > maxVertexUniformVectors) {\n\t\t\t\tconsole.warn('Program: too many bones (' + maxBones + '), current cpu only support ' + Math.floor(maxVertexUniformVectors / 16) + ' bones!!');\n\t\t\t\tmaxBones = Math.floor(maxVertexUniformVectors / 16);\n\t\t\t}\n\t\t}\n\t\tprops.useSkinning = useSkinning;\n\t\tprops.bonesNum = maxBones;\n\t\tprops.useVertexTexture = useVertexTexture;\n\n\t\treturn props;\n\t}\n\n\tgenerateProgramCode(props, material) {\n\t\tlet code = '';\n\n\t\tfor (const key in props) {\n\t\t\tcode += props[key] + '_';\n\t\t}\n\n\t\tfor (const name in material.defines) {\n\t\t\tcode += name + '_' + material.defines[name] + '_';\n\t\t}\n\n\t\t// If the material type is SHADER and there is no shader Name,\n\t\t// use the entire shader code as part of the signature\n\t\tif (material.type === MATERIAL_TYPE.SHADER && !material.shaderName) {\n\t\t\tcode += material.vertexShader;\n\t\t\tcode += material.fragmentShader;\n\t\t}\n\n\t\treturn code;\n\t}\n\n}\n\n// Helper functions\n\nfunction generateDefines(defines) {\n\tconst chunks = [];\n\n\tfor (const name in defines) {\n\t\tconst value = defines[name];\n\t\tif (value === false) continue;\n\t\tchunks.push('#define ' + name + ' ' + value);\n\t}\n\n\treturn chunks.join('\\n');\n}\n\nlet _activeMapCoords = 0; // bit mask\n\nfunction getUVChannel(coord) {\n\t_activeMapCoords |= (1 << coord);\n\n\tif (coord === 0) return 'a_Uv';\n\n\treturn `a_Uv${coord + 1}`; // a_Uv2, a_Uv3, a_Uv4, ...\n}\n\nfunction getTextureEncodingFromMap(map) {\n\tlet encoding;\n\n\tif (!map) {\n\t\tencoding = TEXEL_ENCODING_TYPE.LINEAR;\n\t} else if (map.encoding) {\n\t\tencoding = map.encoding;\n\t}\n\n\treturn encoding;\n}\n\nfunction getEncodingComponents(encoding) {\n\tswitch (encoding) {\n\t\tcase TEXEL_ENCODING_TYPE.LINEAR:\n\t\t\treturn ['Linear', '(value)'];\n\t\tcase TEXEL_ENCODING_TYPE.SRGB:\n\t\t\treturn ['sRGB', '(value)'];\n\t\tcase TEXEL_ENCODING_TYPE.GAMMA:\n\t\t\treturn ['Gamma', '(value, float(GAMMA_FACTOR))'];\n\t\tdefault:\n\t\t\tconsole.error('unsupported encoding: ' + encoding);\n\t}\n}\n\nfunction getTexelDecodingFunction(functionName, encoding) {\n\tconst components = getEncodingComponents(encoding);\n\treturn 'vec4 ' + functionName + '(vec4 value) { return ' + components[0] + 'ToLinear' + components[1] + '; }';\n}\n\nfunction getTexelEncodingFunction(functionName, encoding) {\n\tconst components = getEncodingComponents(encoding);\n\treturn 'vec4 ' + functionName + '(vec4 value) { return LinearTo' + components[0] + components[1] + '; }';\n}\n\nfunction uvAttributes(activeMapCoords) {\n\tlet str = '';\n\tfor (let i = 1; i < 8; i++) { // skip uv0\n\t\tif (activeMapCoords & (1 << i)) {\n\t\t\tstr += 'attribute vec2 a_Uv' + (i + 1) + ';';\n\t\t\tif (i !== 7) str += '\\n';\n\t\t}\n\t}\n\treturn str;\n}\n\nconst shadowDefines = {\n\t[SHADOW_TYPE.HARD]: '#define USE_HARD_SHADOW',\n\t[SHADOW_TYPE.POISSON_SOFT]: '#define USE_POISSON_SOFT_SHADOW',\n\t[SHADOW_TYPE.VOGEL5_SOFT]: '#define USE_VOGEL5_SOFT_SHADOW',\n\t[SHADOW_TYPE.PCF3_SOFT]: '#define USE_PCF3_SOFT_SHADOW',\n\t[SHADOW_TYPE.PCF5_SOFT]: '#define USE_PCF5_SOFT_SHADOW',\n\t[SHADOW_TYPE.PCSS16_SOFT]: [\n\t\t'#define USE_PCSS16_SOFT_SHADOW',\n\t\t'#define USE_PCSS_SOFT_SHADOW'\n\t].join('\\n'),\n\t[SHADOW_TYPE.PCSS32_SOFT]: [\n\t\t'#define USE_PCSS32_SOFT_SHADOW',\n\t\t'#define USE_PCSS_SOFT_SHADOW'\n\t].join('\\n'),\n\t[SHADOW_TYPE.PCSS64_SOFT]: [\n\t\t'#define USE_PCSS64_SOFT_SHADOW',\n\t\t'#define USE_PCSS_SOFT_SHADOW'\n\t].join('\\n')\n};\n\nfunction getShadowTypeDefines(shadowType) {\n\tif (shadowDefines[shadowType]) {\n\t\treturn shadowDefines[shadowType];\n\t} else {\n\t\tconsole.warn('unsupported shadow type: ' + shadowType);\n\t\treturn shadowDefines[SHADOW_TYPE.HARD];\n\t}\n}\n\nfunction createProgram(gl, defines, props, vertex, fragment) {\n\tlet prefixVertex = [\n\t\t'precision ' + props.precision + ' float;',\n\t\t'precision ' + props.precision + ' int;',\n\t\t// depth texture may have precision problem on iOS device.\n\t\t'precision ' + props.precision + ' sampler2D;',\n\t\t(props.version >= 2) ? 'precision ' + props.precision + ' isampler2D;' : '',\n\t\t(props.version >= 2) ? 'precision ' + props.precision + ' usampler2D;' : '',\n\n\t\t'#define SHADER_NAME ' + props.shaderName,\n\n\t\tdefines,\n\n\t\t(props.version >= 2) ? '#define WEBGL2' : '',\n\n\t\t// maps\n\n\t\tprops.useDiffuseMap ? '#define USE_DIFFUSE_MAP' : '',\n\t\tprops.useAlphaMap ? '#define USE_ALPHA_MAP' : '',\n\t\tprops.useEmissiveMap ? '#define USE_EMISSIVEMAP' : '',\n\t\tprops.useAOMap ? '#define USE_AOMAP' : '',\n\t\tprops.useNormalMap ? '#define USE_NORMAL_MAP' : '',\n\t\tprops.useBumpMap ? '#define USE_BUMPMAP' : '',\n\t\tprops.useSpecularMap ? '#define USE_SPECULARMAP' : '',\n\t\tprops.useRoughnessMap ? '#define USE_ROUGHNESSMAP' : '',\n\t\tprops.useMetalnessMap ? '#define USE_METALNESSMAP' : '',\n\t\tprops.useGlossinessMap ? '#define USE_GLOSSINESSMAP' : '',\n\n\t\tprops.useEnvMap ? '#define USE_ENV_MAP' : '',\n\n\t\tprops.diffuseMapUv ? '#define DIFFUSEMAP_UV ' + props.diffuseMapUv : '',\n\t\tprops.alphaMapUv ? '#define ALPHAMAP_UV ' + props.alphaMapUv : '',\n\t\tprops.emissiveMapUv ? '#define EMISSIVEMAP_UV ' + props.emissiveMapUv : '',\n\t\tprops.aoMapUv ? '#define AOMAP_UV ' + props.aoMapUv : '',\n\n\t\tprops.activeMapCoords > 0 ? '#define USE_UV' : '',\n\t\tprops.activeMapCoords & 1 ? '#define USE_UV1' : '',\n\n\t\tuvAttributes(props.activeMapCoords),\n\n\t\t// lights\n\n\t\tprops.useAmbientLight ? '#define USE_AMBIENT_LIGHT' : '',\n\t\tprops.useSphericalHarmonicsLight ? '#define USE_SPHERICALHARMONICS_LIGHT' : '',\n\t\tprops.useShadow ? '#define USE_SHADOW' : '',\n\n\t\t// other\n\n\t\tprops.useVertexColors == VERTEX_COLOR.RGB ? '#define USE_VCOLOR_RGB' : '',\n\t\tprops.useVertexColors == VERTEX_COLOR.RGBA ? '#define USE_VCOLOR_RGBA' : '',\n\t\tprops.useVertexTangents ? '#define USE_TANGENT' : '',\n\t\tprops.flatShading ? '#define FLAT_SHADED' : '',\n\t\tprops.fog ? '#define USE_FOG' : '',\n\t\tprops.sizeAttenuation ? '#define USE_SIZEATTENUATION' : '',\n\t\tprops.flipSided ? '#define FLIP_SIDED' : '',\n\t\tprops.logarithmicDepthBuffer ? '#define USE_LOGDEPTHBUF' : '',\n\t\t(props.logarithmicDepthBuffer && props.rendererExtensionFragDepth) ? '#define USE_LOGDEPTHBUF_EXT' : '',\n\n\t\t// morph targets\n\n\t\tprops.morphTargets ? '#define USE_MORPHTARGETS' : '',\n\t\tprops.morphNormals && props.flatShading === false ? '#define USE_MORPHNORMALS' : '',\n\n\t\t// skinned mesh\n\n\t\tprops.useSkinning ? '#define USE_SKINNING' : '',\n\t\t(props.bonesNum > 0) ? ('#define MAX_BONES ' + props.bonesNum) : '',\n\t\tprops.useVertexTexture ? '#define BONE_TEXTURE' : '',\n\t\t'\\n'\n\t].filter(filterEmptyLine).join('\\n');\n\n\tlet prefixFragment = [\n\t\t// use dfdx and dfdy must enable OES_standard_derivatives\n\t\t(props.useStandardDerivatives && props.version < 2) ? '#extension GL_OES_standard_derivatives : enable' : '',\n\t\t(props.useShaderTextureLOD && props.version < 2) ? '#extension GL_EXT_shader_texture_lod : enable' : '',\n\t\t(props.logarithmicDepthBuffer && props.rendererExtensionFragDepth && props.version < 2) ? '#extension GL_EXT_frag_depth : enable' : '',\n\n\t\t'precision ' + props.precision + ' float;',\n\t\t'precision ' + props.precision + ' int;',\n\t\t// depth texture may have precision problem on iOS device.\n\t\t'precision ' + props.precision + ' sampler2D;',\n\t\t(props.version >= 2) ? 'precision ' + props.precision + ' isampler2D;' : '',\n\t\t(props.version >= 2) ? 'precision ' + props.precision + ' usampler2D;' : '',\n\t\t(props.version >= 2) ? 'precision ' + props.precision + ' sampler2DShadow;' : '',\n\t\t(props.version >= 2) ? 'precision ' + props.precision + ' samplerCubeShadow;' : '',\n\n\t\t'#define SHADER_NAME ' + props.shaderName,\n\n\t\t'#define PI 3.14159265359',\n\t\t'#define EPSILON 1e-6',\n\t\t'float pow2(const in float x) { return x * x; }',\n\t\t'#define LOG2 1.442695',\n\t\t'#define RECIPROCAL_PI 0.31830988618',\n\t\t'#define saturate(a) clamp(a, 0.0, 1.0)',\n\t\t'#define whiteCompliment(a) (1.0 - saturate(a))',\n\n\t\t// expects values in the range of [0,1] x [0,1], returns values in the [0,1] range.\n\t\t// do not collapse into a single function per: http://byteblacksmith.com/improvements-to-the-canonical-one-liner-glsl-rand-for-opengl-es-2-0/\n\t\t'highp float rand(const in vec2 uv) {',\n\t\t'\tconst highp float a = 12.9898, b = 78.233, c = 43758.5453;',\n\t\t'\thighp float dt = dot(uv.xy, vec2(a, b)), sn = mod(dt, PI);',\n\t\t'\treturn fract(sin(sn) * c);',\n\t\t'}',\n\n\t\tdefines,\n\n\t\t(props.version >= 2) ? '#define WEBGL2' : '',\n\t\tprops.useShadowSampler ? '#define USE_SHADOW_SAMPLER' : '#define sampler2DShadow sampler2D',\n\t\tprops.useShaderTextureLOD ? '#define TEXTURE_LOD_EXT' : '',\n\n\t\t// maps\n\n\t\tprops.useDiffuseMap ? '#define USE_DIFFUSE_MAP' : '',\n\t\tprops.useAlphaMap ? '#define USE_ALPHA_MAP' : '',\n\t\tprops.useEmissiveMap ? '#define USE_EMISSIVEMAP' : '',\n\t\tprops.useAOMap ? '#define USE_AOMAP' : '',\n\t\tprops.useNormalMap ? '#define USE_NORMAL_MAP' : '',\n\t\tprops.useBumpMap ? '#define USE_BUMPMAP' : '',\n\t\tprops.useSpecularMap ? '#define USE_SPECULARMAP' : '',\n\t\tprops.useRoughnessMap ? '#define USE_ROUGHNESSMAP' : '',\n\t\tprops.useMetalnessMap ? '#define USE_METALNESSMAP' : '',\n\t\tprops.useGlossinessMap ? '#define USE_GLOSSINESSMAP' : '',\n\n\t\tprops.useEnvMap ? '#define USE_ENV_MAP' : '',\n\t\tprops.envMapCombine ? '#define ' + props.envMapCombine : '',\n\n\t\tprops.useClearcoat ? '#define USE_CLEARCOAT' : '',\n\t\tprops.useClearcoatMap ? '#define USE_CLEARCOATMAP' : '',\n\t\tprops.useClearcoatRoughnessMap ? '#define USE_CLEARCOAT_ROUGHNESSMAP' : '',\n\t\tprops.useClearcoatNormalMap ? '#define USE_CLEARCOAT_NORMALMAP' : '',\n\n\t\tprops.activeMapCoords & 1 ? '#define USE_UV1' : '',\n\n\t\t// lights\n\n\t\tprops.useAmbientLight ? '#define USE_AMBIENT_LIGHT' : '',\n\t\tprops.useSphericalHarmonicsLight ? '#define USE_SPHERICALHARMONICS_LIGHT' : '',\n\t\tprops.useClusteredLights ? '#define USE_CLUSTERED_LIGHTS' : '',\n\t\tprops.useShadow ? '#define USE_SHADOW' : '',\n\t\tgetShadowTypeDefines(props.shadowType),\n\n\t\tprops.dithering ? '#define DITHERING' : '',\n\n\t\t// encoding\n\n\t\tShaderChunk['encodings_pars_frag'],\n\t\t'#define GAMMA_FACTOR ' + props.gammaFactor,\n\t\tgetTexelEncodingFunction('linearToOutputTexel', props.outputEncoding),\n\t\tgetTexelDecodingFunction('mapTexelToLinear', props.diffuseMapEncoding),\n\t\tprops.useEnvMap ? getTexelDecodingFunction('envMapTexelToLinear', props.envMapEncoding) : '',\n\t\tprops.useEmissiveMap ? getTexelDecodingFunction('emissiveMapTexelToLinear', props.emissiveMapEncoding) : '',\n\n\t\t// other\n\n\t\tprops.alphaTest ? '#define ALPHATEST' : '',\n\t\tprops.premultipliedAlpha ? '#define USE_PREMULTIPLIED_ALPHA' : '',\n\t\tprops.useVertexColors == VERTEX_COLOR.RGB ? '#define USE_VCOLOR_RGB' : '',\n\t\tprops.useVertexColors == VERTEX_COLOR.RGBA ? '#define USE_VCOLOR_RGBA' : '',\n\t\tprops.useVertexTangents ? '#define USE_TANGENT' : '',\n\t\tprops.flatShading ? '#define FLAT_SHADED' : '',\n\t\tprops.fog ? '#define USE_FOG' : '',\n\t\tprops.fogExp2 ? '#define USE_EXP2_FOG' : '',\n\t\tprops.doubleSided ? '#define DOUBLE_SIDED' : '',\n\t\tprops.packDepthToRGBA ? '#define DEPTH_PACKING_RGBA' : '',\n\t\tprops.logarithmicDepthBuffer ? '#define USE_LOGDEPTHBUF' : '',\n\t\t(props.logarithmicDepthBuffer && props.rendererExtensionFragDepth) ? '#define USE_LOGDEPTHBUF_EXT' : '',\n\t\t'\\n'\n\t].filter(filterEmptyLine).join('\\n');\n\n\tlet vshader = vertex;\n\tlet fshader = fragment;\n\n\tvshader = parseIncludes(vshader);\n\tfshader = parseIncludes(fshader);\n\n\tvshader = replaceLightNums(vshader, props);\n\tfshader = replaceLightNums(fshader, props);\n\n\tvshader = replaceClippingPlaneNums(vshader, props);\n\tfshader = replaceClippingPlaneNums(fshader, props);\n\n\tvshader = unrollLoops(vshader);\n\tfshader = unrollLoops(fshader);\n\n\t// enable glsl version 300 es for webgl ^2.0\n\tif (props.version > 1) {\n\t\t// extract vertex extensions and insert after version strings later\n\t\t// because it must be at the top of the shader\n\t\tconst vertexExtensions = vshader.match(extensionPattern);\n\t\tif (vertexExtensions) {\n\t\t\tvshader = vshader.replace(extensionPattern, '');\n\t\t}\n\n\t\tprefixVertex = [\n\t\t\t'#version 300 es',\n\t\t\tvertexExtensions ? vertexExtensions.join('\\n') : '',\n\t\t\t'#define attribute in',\n\t\t\t'#define varying out',\n\t\t\t'#define texture2D texture'\n\t\t].join('\\n') + '\\n' + prefixVertex;\n\n\t\tfshader = fshader.replace('#extension GL_EXT_draw_buffers : require', '');\n\n\t\t// replace gl_FragData by layout\n\t\tlet i = 0;\n\t\tconst layout = [];\n\t\twhile (fshader.indexOf('gl_FragData[' + i + ']') > -1) {\n\t\t\tfshader = fshader.replace('gl_FragData[' + i + ']', 'pc_fragData' + i);\n\t\t\tlayout.push('layout(location = ' + i + ') out highp vec4 pc_fragData' + i + ';');\n\t\t\ti++;\n\t\t}\n\n\t\tprefixFragment = [\n\t\t\t'#version 300 es',\n\t\t\t'#define varying in',\n\t\t\t(fshader.indexOf('layout') > -1 || layout.length > 0) ? '' : 'out highp vec4 pc_fragColor;',\n\t\t\t'#define gl_FragColor pc_fragColor',\n\t\t\t'#define gl_FragDepthEXT gl_FragDepth',\n\t\t\t'#define texture2D texture',\n\t\t\t'#define textureCube texture',\n\t\t\t'#define texture2DProj textureProj',\n\t\t\t'#define texture2DLodEXT textureLod',\n\t\t\t'#define texture2DProjLodEXT textureProjLod',\n\t\t\t'#define textureCubeLodEXT textureLod',\n\t\t\t'#define texture2DGradEXT textureGrad',\n\t\t\t'#define texture2DProjGradEXT textureProjGrad',\n\t\t\t'#define textureCubeGradEXT textureGrad',\n\t\t\tlayout.join('\\n')\n\t\t].join('\\n') + '\\n' + prefixFragment;\n\t}\n\n\tvshader = prefixVertex + vshader;\n\tfshader = prefixFragment + fshader;\n\n\treturn new WebGLProgram(gl, vshader, fshader);\n}\n\nconst parseIncludes = function(string) {\n\tconst pattern = /#include +<([\\w\\d.]+)>/g;\n\n\tfunction replace(match, include) {\n\t\tconst replace = ShaderChunk[include];\n\n\t\tif (replace === undefined) {\n\t\t\tthrow new Error('Can not resolve #include <' + include + '>');\n\t\t}\n\n\t\treturn parseIncludes(replace);\n\t}\n\n\treturn string.replace(pattern, replace);\n};\n\nfunction filterEmptyLine(string) {\n\treturn string !== '';\n}\n\nfunction replaceLightNums(string, parameters) {\n\treturn string\n\t\t.replace(/NUM_HEMI_LIGHTS/g, parameters.hemisphereLightNum)\n\t\t.replace(/NUM_DIR_LIGHTS/g, parameters.directLightNum)\n\t\t.replace(/NUM_SPOT_LIGHTS/g, parameters.spotLightNum)\n\t\t.replace(/NUM_POINT_LIGHTS/g, parameters.pointLightNum)\n\t\t.replace(/NUM_RECT_AREA_LIGHTS/g, parameters.rectAreaLightNum)\n\t\t.replace(/NUM_DIR_SHADOWS/g, parameters.directShadowNum)\n\t\t.replace(/NUM_SPOT_SHADOWS/g, parameters.spotShadowNum)\n\t\t.replace(/NUM_POINT_SHADOWS/g, parameters.pointShadowNum);\n}\n\nfunction replaceClippingPlaneNums(string, parameters) {\n\treturn string\n\t\t.replace(/NUM_CLIPPING_PLANES/g, parameters.numClippingPlanes);\n}\n\nconst unrollLoopPattern = /#pragma unroll_loop_start\\s+for\\s*\\(\\s*int\\s+i\\s*=\\s*(\\d+)\\s*;\\s*i\\s*<\\s*(\\d+)\\s*;\\s*i\\s*\\+\\+\\s*\\)\\s*{([\\s\\S]+?)}\\s+#pragma unroll_loop_end/g;\n\nfunction loopReplacer(match, start, end, snippet) {\n\tlet string = '';\n\n\tfor (let i = parseInt(start); i < parseInt(end); i++) {\n\t\tstring += snippet\n\t\t\t.replace(/\\[\\s*i\\s*\\]/g, '[' + i + ']')\n\t\t\t.replace(/UNROLLED_LOOP_INDEX/g, i);\n\t}\n\n\treturn string;\n}\n\nfunction unrollLoops(string) {\n\treturn string\n\t\t.replace(unrollLoopPattern, loopReplacer);\n}\n\nconst extensionPattern = /#extension .*/g;\n\nclass WebGLQuerySets extends PropertyMap {\n\n\tconstructor(prefix, gl, capabilities) {\n\t\tsuper(prefix);\n\n\t\tthis._gl = gl;\n\t\tthis._capabilities = capabilities;\n\n\t\tconst timerQuery = capabilities.timerQuery;\n\t\tconst that = this;\n\n\t\tfunction onQuerySetDispose(event) {\n\t\t\tconst querySet = event.target;\n\t\t\tconst querySetProperties = that.get(querySet);\n\n\t\t\tquerySet.removeEventListener('dispose', onQuerySetDispose);\n\n\t\t\tif (querySetProperties._queriesGL) {\n\t\t\t\tconst queriesGL = querySetProperties._queriesGL;\n\t\t\t\tqueriesGL.forEach(queryGL => {\n\t\t\t\t\tif (queryGL) {\n\t\t\t\t\t\tif (capabilities.version > 1) {\n\t\t\t\t\t\t\tgl.deleteQuery(queryGL);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\ttimerQuery.deleteQueryEXT(queryGL);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tquerySetProperties._isDisposed = true;\n\n\t\t\tthat.delete(querySet);\n\t\t}\n\n\t\tthis._onQuerySetDispose = onQuerySetDispose;\n\n\t\tthis._checkResultAvailable = capabilities.version > 1\n\t\t\t? queryGL => gl.getQueryParameter(queryGL, gl.QUERY_RESULT_AVAILABLE)\n\t\t\t: queryGL => timerQuery.getQueryObjectEXT(queryGL, timerQuery.QUERY_RESULT_AVAILABLE_EXT);\n\n\t\tthis._getQueryResult = capabilities.version > 1\n\t\t\t? queryGL => gl.getQueryParameter(queryGL, gl.QUERY_RESULT)\n\t\t\t: queryGL => timerQuery.getQueryObjectEXT(queryGL, timerQuery.QUERY_RESULT_EXT);\n\t}\n\n\tsetQuerySet(querySet) {\n\t\tconst querySetProperties = this.get(querySet);\n\n\t\tif (querySetProperties._queriesGL === undefined) {\n\t\t\tquerySet.addEventListener('dispose', this._onQuerySetDispose);\n\n\t\t\tquerySetProperties._queriesGL = new Array(querySet.count).fill(null);\n\t\t\tquerySetProperties._valueCache = new Array(querySet.count).fill(0);\n\t\t\tquerySetProperties._valueCacheValid = new Array(querySet.count).fill(true);\n\n\t\t\tconst gl = this._gl;\n\t\t\tconst capabilities = this._capabilities;\n\n\t\t\tif (querySet.type === QUERYSET_TYPE.OCCLUSION) {\n\t\t\t\tquerySetProperties._targetGL = querySet.conservative\n\t\t\t\t\t? gl.ANY_SAMPLES_PASSED_CONSERVATIVE\n\t\t\t\t\t: gl.ANY_SAMPLES_PASSED;\n\t\t\t} else {\n\t\t\t\t// If timestamp is supported, this variable will not be used,\n\t\t\t\t// so it is okay to set it to TIME_ELAPSED_EXT here.\n\t\t\t\tquerySetProperties._targetGL = capabilities.timerQuery.TIME_ELAPSED_EXT;\n\t\t\t}\n\n\t\t\tquerySetProperties._activeIndex = -1;\n\t\t\tquerySetProperties._reading = false;\n\t\t}\n\t}\n\n\tbeginQuery(querySet, index) {\n\t\tconst gl = this._gl;\n\n\t\tconst querySetProperties = this.get(querySet);\n\n\t\tif (querySetProperties._reading) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst queryGL = this._getQueryGLByIndex(querySetProperties._queriesGL, index);\n\n\t\tif (this._capabilities.version > 1) {\n\t\t\tgl.beginQuery(querySetProperties._targetGL, queryGL);\n\t\t} else {\n\t\t\tthis._capabilities.timerQuery.beginQueryEXT(querySetProperties._targetGL, queryGL);\n\t\t}\n\n\t\tquerySetProperties._activeIndex = index;\n\t}\n\n\tendQuery(querySet) {\n\t\tconst querySetProperties = this.get(querySet);\n\n\t\tif (querySetProperties._reading || querySetProperties._activeIndex < 0) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (this._capabilities.version > 1) {\n\t\t\tthis._gl.endQuery(querySetProperties._targetGL);\n\t\t} else {\n\t\t\tthis._capabilities.timerQuery.endQueryEXT(querySetProperties._targetGL);\n\t\t}\n\n\t\tquerySetProperties._valueCacheValid[querySetProperties._activeIndex] = false;\n\t\tquerySetProperties._activeIndex = -1;\n\t}\n\n\tqueryCounter(querySet, index) {\n\t\tconst capabilities = this._capabilities;\n\t\tconst timerQuery = capabilities.timerQuery;\n\n\t\tconst querySetProperties = this.get(querySet);\n\n\t\tif (querySetProperties._reading) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst queryGL = this._getQueryGLByIndex(querySetProperties._queriesGL, index);\n\t\ttimerQuery.queryCounterEXT(queryGL, timerQuery.TIMESTAMP_EXT);\n\n\t\tquerySetProperties._valueCacheValid[index] = false;\n\t}\n\n\treadQuerySetResults(querySet, dstBuffer, firstQuery, queryCount) {\n\t\tconst querySetProperties = this.get(querySet);\n\n\t\tquerySetProperties._reading = true;\n\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tconst checkQueries = () => {\n\t\t\t\tif (querySetProperties._isDisposed) {\n\t\t\t\t\treject(new Error('QuerySet has been disposed'));\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tlet completed = true;\n\n\t\t\t\ttry {\n\t\t\t\t\tfor (let i = firstQuery; i < queryCount; i++) {\n\t\t\t\t\t\tconst queryGL = querySetProperties._queriesGL[i];\n\t\t\t\t\t\tconst valueCacheValid = querySetProperties._valueCacheValid[i];\n\t\t\t\t\t\tif (!valueCacheValid) {\n\t\t\t\t\t\t\tif (this._checkResultAvailable(queryGL)) {\n\t\t\t\t\t\t\t\tconst result = this._getQueryResult(queryGL);\n\t\t\t\t\t\t\t\tquerySetProperties._valueCache[i] = result;\n\t\t\t\t\t\t\t\tquerySetProperties._valueCacheValid[i] = true;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tcompleted = false;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} catch (e) {\n\t\t\t\t\tfor (let i = firstQuery; i < queryCount; i++) {\n\t\t\t\t\t\tquerySetProperties._valueCacheValid[i] = true;\n\t\t\t\t\t}\n\t\t\t\t\tquerySetProperties._reading = false;\n\t\t\t\t\treject(e);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (completed) {\n\t\t\t\t\tfor (let i = firstQuery; i < queryCount; i++) {\n\t\t\t\t\t\tdstBuffer[i - firstQuery] = querySetProperties._valueCache[i];\n\t\t\t\t\t}\n\n\t\t\t\t\tquerySetProperties._reading = false;\n\t\t\t\t\tresolve(dstBuffer);\n\t\t\t\t} else {\n\t\t\t\t\trequestAnimationFrame(checkQueries);\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tcheckQueries();\n\t\t});\n\t}\n\n\t_getQueryGLByIndex(queriesGL, index) {\n\t\tlet queryGL = queriesGL[index];\n\t\tif (!queryGL) {\n\t\t\tconst gl = this._gl;\n\t\t\tconst capabilities = this._capabilities;\n\n\t\t\tqueryGL = capabilities.version > 1\n\t\t\t\t? gl.createQuery()\n\t\t\t\t: capabilities.timerQuery.createQueryEXT();\n\t\t\tqueriesGL[index] = queryGL;\n\t\t}\n\t\treturn queryGL;\n\t}\n\n}\n\nclass WebGLConstants {\n\n\tconstructor(gl, capabilities) {\n\t\tthis._gl = gl;\n\t\tthis._capabilities = capabilities;\n\t}\n\n\tgetGLType(type) {\n\t\tconst gl = this._gl;\n\t\tconst capabilities = this._capabilities;\n\t\tconst isWebGL2 = capabilities.version >= 2;\n\n\t\tif (type === PIXEL_TYPE.UNSIGNED_BYTE) return gl.UNSIGNED_BYTE;\n\t\tif (type === PIXEL_TYPE.UNSIGNED_SHORT_5_6_5) return gl.UNSIGNED_SHORT_5_6_5;\n\t\tif (type === PIXEL_TYPE.UNSIGNED_SHORT_4_4_4_4) return gl.UNSIGNED_SHORT_4_4_4_4;\n\t\tif (type === PIXEL_TYPE.UNSIGNED_SHORT_5_5_5_1) return gl.UNSIGNED_SHORT_5_5_5_1;\n\n\t\tlet extension;\n\n\t\tif (!isWebGL2) {\n\t\t\tif (type === PIXEL_TYPE.UNSIGNED_SHORT || type === PIXEL_TYPE.UNSIGNED_INT ||\n\t\t\t\ttype === PIXEL_TYPE.UNSIGNED_INT_24_8) {\n\t\t\t\textension = capabilities.getExtension('WEBGL_depth_texture');\n\t\t\t\tif (extension) {\n\t\t\t\t\tif (type === PIXEL_TYPE.UNSIGNED_SHORT) return gl.UNSIGNED_SHORT;\n\t\t\t\t\tif (type === PIXEL_TYPE.UNSIGNED_INT) return gl.UNSIGNED_INT;\n\t\t\t\t\tif (type === PIXEL_TYPE.UNSIGNED_INT_24_8) return extension.UNSIGNED_INT_24_8_WEBGL;\n\t\t\t\t} else {\n\t\t\t\t\tconsole.warn('extension WEBGL_depth_texture is not support.');\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (type === PIXEL_TYPE.FLOAT) {\n\t\t\t\textension = capabilities.getExtension('OES_texture_float');\n\t\t\t\tif (extension) {\n\t\t\t\t\treturn gl.FLOAT;\n\t\t\t\t} else {\n\t\t\t\t\tconsole.warn('extension OES_texture_float is not support.');\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (type === PIXEL_TYPE.HALF_FLOAT) {\n\t\t\t\textension = capabilities.getExtension('OES_texture_half_float');\n\t\t\t\tif (extension) {\n\t\t\t\t\treturn extension.HALF_FLOAT_OES;\n\t\t\t\t} else {\n\t\t\t\t\tconsole.warn('extension OES_texture_half_float is not support.');\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tif (type === PIXEL_TYPE.UNSIGNED_SHORT) return gl.UNSIGNED_SHORT;\n\t\t\tif (type === PIXEL_TYPE.UNSIGNED_INT) return gl.UNSIGNED_INT;\n\t\t\tif (type === PIXEL_TYPE.UNSIGNED_INT_24_8) return gl.UNSIGNED_INT_24_8;\n\t\t\tif (type === PIXEL_TYPE.FLOAT) return gl.FLOAT;\n\t\t\tif (type === PIXEL_TYPE.HALF_FLOAT) return gl.HALF_FLOAT;\n\t\t\tif (type === PIXEL_TYPE.FLOAT_32_UNSIGNED_INT_24_8_REV) return gl.FLOAT_32_UNSIGNED_INT_24_8_REV;\n\n\t\t\tif (type === PIXEL_TYPE.BYTE) return gl.BYTE;\n\t\t\tif (type === PIXEL_TYPE.SHORT) return gl.SHORT;\n\t\t\tif (type === PIXEL_TYPE.INT) return gl.INT;\n\n\t\t\t// does not include:\n\t\t\t// UNSIGNED_INT_2_10_10_10_REV\n\t\t\t// UNSIGNED_INT_10F_11F_11F_REV\n\t\t\t// UNSIGNED_INT_5_9_9_9_REV\n\t\t}\n\n\t\treturn (gl[type] !== undefined) ? gl[type] : type;\n\t}\n\n\tgetGLFormat(format) {\n\t\tconst gl = this._gl;\n\t\tconst capabilities = this._capabilities;\n\n\t\tif (format === PIXEL_FORMAT.RGB) return gl.RGB;\n\t\tif (format === PIXEL_FORMAT.RGBA) return gl.RGBA;\n\t\tif (format === PIXEL_FORMAT.ALPHA) return gl.ALPHA;\n\t\tif (format === PIXEL_FORMAT.LUMINANCE) return gl.LUMINANCE;\n\t\tif (format === PIXEL_FORMAT.LUMINANCE_ALPHA) return gl.LUMINANCE_ALPHA;\n\t\tif (format === PIXEL_FORMAT.DEPTH_COMPONENT) return gl.DEPTH_COMPONENT;\n\t\tif (format === PIXEL_FORMAT.DEPTH_STENCIL) return gl.DEPTH_STENCIL;\n\t\tif (format === PIXEL_FORMAT.RED) return gl.RED;\n\n\t\tif (format === PIXEL_FORMAT.RED_INTEGER) return gl.RED_INTEGER;\n\t\tif (format === PIXEL_FORMAT.RG) return gl.RG;\n\t\tif (format === PIXEL_FORMAT.RG_INTEGER) return gl.RG_INTEGER;\n\t\tif (format === PIXEL_FORMAT.RGB_INTEGER) return gl.RGB_INTEGER;\n\t\tif (format === PIXEL_FORMAT.RGBA_INTEGER) return gl.RGBA_INTEGER;\n\n\t\tlet extension;\n\n\t\t// S3TC\n\t\tif (format === PIXEL_FORMAT.RGB_S3TC_DXT1 || format === PIXEL_FORMAT.RGBA_S3TC_DXT1 ||\n            format === PIXEL_FORMAT.RGBA_S3TC_DXT3 || format === PIXEL_FORMAT.RGBA_S3TC_DXT5) {\n\t\t\textension = capabilities.getExtension('WEBGL_compressed_texture_s3tc');\n\t\t\tif (extension) {\n\t\t\t\tif (format === PIXEL_FORMAT.RGB_S3TC_DXT1) return extension.COMPRESSED_RGB_S3TC_DXT1_EXT;\n\t\t\t\tif (format === PIXEL_FORMAT.RGBA_S3TC_DXT1) return extension.COMPRESSED_RGBA_S3TC_DXT1_EXT;\n\t\t\t\tif (format === PIXEL_FORMAT.RGBA_S3TC_DXT3) return extension.COMPRESSED_RGBA_S3TC_DXT3_EXT;\n\t\t\t\tif (format === PIXEL_FORMAT.RGBA_S3TC_DXT5) return extension.COMPRESSED_RGBA_S3TC_DXT5_EXT;\n\t\t\t} else {\n\t\t\t\tconsole.warn('extension WEBGL_compressed_texture_s3tc is not support.');\n\t\t\t\treturn null;\n\t\t\t}\n\t\t}\n\n\t\t// PVRTC\n\t\tif (format === PIXEL_FORMAT.RGB_PVRTC_4BPPV1 || format === PIXEL_FORMAT.RGB_PVRTC_2BPPV1 ||\n            format === PIXEL_FORMAT.RGBA_PVRTC_4BPPV1 || format === PIXEL_FORMAT.RGBA_PVRTC_2BPPV1) {\n\t\t\textension = capabilities.getExtension('WEBGL_compressed_texture_pvrtc');\n\t\t\tif (extension) {\n\t\t\t\tif (format === PIXEL_FORMAT.RGB_PVRTC_4BPPV1) return extension.COMPRESSED_RGB_PVRTC_4BPPV1_IMG;\n\t\t\t\tif (format === PIXEL_FORMAT.RGB_PVRTC_2BPPV1) return extension.COMPRESSED_RGB_PVRTC_2BPPV1_IMG;\n\t\t\t\tif (format === PIXEL_FORMAT.RGBA_PVRTC_4BPPV1) return extension.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG;\n\t\t\t\tif (format === PIXEL_FORMAT.RGBA_PVRTC_2BPPV1) return extension.COMPRESSED_RGBA_PVRTC_2BPPV1_IMG;\n\t\t\t} else {\n\t\t\t\tconsole.warn('extension WEBGL_compressed_texture_pvrtc is not support.');\n\t\t\t\treturn null;\n\t\t\t}\n\t\t}\n\n\t\t// ETC1\n\t\tif (format === PIXEL_FORMAT.RGB_ETC1) {\n\t\t\textension = capabilities.getExtension('WEBGL_compressed_texture_etc1');\n\t\t\tif (extension) {\n\t\t\t\treturn extension.COMPRESSED_RGB_ETC1_WEBGL;\n\t\t\t} else {\n\t\t\t\tconsole.warn('extension WEBGL_compressed_texture_etc1 is not support.');\n\t\t\t\treturn null;\n\t\t\t}\n\t\t}\n\n\t\t// ASTC\n\t\tif (format === PIXEL_FORMAT.RGBA_ASTC_4x4) {\n\t\t\textension = capabilities.getExtension('WEBGL_compressed_texture_astc');\n\t\t\tif (extension) {\n\t\t\t\treturn extension.COMPRESSED_RGBA_ASTC_4x4_KHR;\n\t\t\t} else {\n\t\t\t\tconsole.warn('extension WEBGL_compressed_texture_astc is not support.');\n\t\t\t\treturn null;\n\t\t\t}\n\t\t}\n\n\t\t// BPTC\n\t\tif (format === PIXEL_FORMAT.RGBA_BPTC || format === PIXEL_FORMAT.RGB_BPTC_SIGNED_FORMAT || format === PIXEL_FORMAT.RGB_BPTC_UNSIGNED_FORMAT) {\n\t\t\textension = capabilities.getExtension('EXT_texture_compression_bptc');\n\t\t\tif (extension) {\n\t\t\t\tif (format === PIXEL_FORMAT.RGBA_BPTC) return extension.COMPRESSED_RGBA_BPTC_UNORM_EXT;\n\t\t\t\tif (format === PIXEL_FORMAT.RGB_BPTC_SIGNED_FORMAT) return extension.COMPRESSED_RGB_BPTC_SIGNED_FLOAT_EXT;\n\t\t\t\tif (format === PIXEL_FORMAT.RGB_BPTC_UNSIGNED_FORMAT) return extension.COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_EXT;\n\t\t\t} else {\n\t\t\t\tconsole.warn('extension EXT_texture_compression_bptc is not support.');\n\t\t\t\treturn null;\n\t\t\t}\n\t\t}\n\n\t\treturn (gl[format] !== undefined) ? gl[format] : format;\n\t}\n\n\tgetGLInternalFormat(internalFormat) {\n\t\tconst gl = this._gl;\n\t\tconst capabilities = this._capabilities;\n\n\t\tconst isWebGL2 = capabilities.version >= 2;\n\n\t\tif (internalFormat === PIXEL_FORMAT.RGBA4) return gl.RGBA4;\n\t\tif (internalFormat === PIXEL_FORMAT.RGB5_A1) return gl.RGB5_A1;\n\t\tif (internalFormat === PIXEL_FORMAT.DEPTH_COMPONENT16) return gl.DEPTH_COMPONENT16;\n\t\tif (internalFormat === PIXEL_FORMAT.STENCIL_INDEX8) return gl.STENCIL_INDEX8;\n\t\tif (internalFormat === PIXEL_FORMAT.DEPTH_STENCIL) return gl.DEPTH_STENCIL;\n\n\t\t// does not include:\n\t\t// RGB565\n\n\t\tlet extension;\n\n\t\tif (!isWebGL2) {\n\t\t\tif (internalFormat === PIXEL_FORMAT.RGBA32F || internalFormat === PIXEL_FORMAT.RGB32F) {\n\t\t\t\textension = capabilities.getExtension('WEBGL_color_buffer_float');\n\t\t\t\tif (extension) {\n\t\t\t\t\tif (internalFormat === PIXEL_FORMAT.RGBA32F) return extension.RGBA32F_EXT;\n\t\t\t\t\tif (internalFormat === PIXEL_FORMAT.RGB32F) return extension.RGB32F_EXT;\n\t\t\t\t} else {\n\t\t\t\t\tconsole.warn('extension WEBGL_color_buffer_float is not support.');\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tif (internalFormat === PIXEL_FORMAT.R8) return gl.R8;\n\t\t\tif (internalFormat === PIXEL_FORMAT.RG8) return gl.RG8;\n\t\t\tif (internalFormat === PIXEL_FORMAT.RGB8) return gl.RGB8;\n\t\t\tif (internalFormat === PIXEL_FORMAT.RGBA8) return gl.RGBA8;\n\t\t\tif (internalFormat === PIXEL_FORMAT.DEPTH_COMPONENT24) return gl.DEPTH_COMPONENT24;\n\t\t\tif (internalFormat === PIXEL_FORMAT.DEPTH_COMPONENT32F) return gl.DEPTH_COMPONENT32F;\n\t\t\tif (internalFormat === PIXEL_FORMAT.DEPTH24_STENCIL8) return gl.DEPTH24_STENCIL8;\n\t\t\tif (internalFormat === PIXEL_FORMAT.DEPTH32F_STENCIL8) return gl.DEPTH32F_STENCIL8;\n\n\t\t\t// does not include:\n\t\t\t// R8UI R8I R16UI R16I R32UI R32I RG8UI RG8I RG16UI RG16I RG32UI RG32I SRGB8_ALPHA8\n\t\t\t// RGB10_A2 RGBA8UI RGBA8I RGB10_A2UI RGBA16UI RGBA16I RGBA32I RGBA32UI\n\n\t\t\tif (internalFormat === PIXEL_FORMAT.R16F || internalFormat === PIXEL_FORMAT.RG16F ||\n\t\t\t\tinternalFormat === PIXEL_FORMAT.RGB16F || internalFormat === PIXEL_FORMAT.RGBA16F ||\n\t\t\t\tinternalFormat === PIXEL_FORMAT.R32F || internalFormat === PIXEL_FORMAT.RG32F ||\n\t\t\t\tinternalFormat === PIXEL_FORMAT.RGB32F || internalFormat === PIXEL_FORMAT.RGBA32F ||\n\t\t\t\tinternalFormat === PIXEL_FORMAT.R11F_G11F_B10F\n\t\t\t) {\n\t\t\t\textension = capabilities.getExtension('EXT_color_buffer_float');\n\t\t\t\tif (extension) {\n\t\t\t\t\tif (internalFormat === PIXEL_FORMAT.R16F) return gl.R16F;\n\t\t\t\t\tif (internalFormat === PIXEL_FORMAT.RG16F) return gl.RG16F;\n\t\t\t\t\tif (internalFormat === PIXEL_FORMAT.RGB16F) return gl.RGB16F;\n\t\t\t\t\tif (internalFormat === PIXEL_FORMAT.RGBA16F) return gl.RGBA16F;\n\t\t\t\t\tif (internalFormat === PIXEL_FORMAT.R32F) return gl.R32F;\n\t\t\t\t\tif (internalFormat === PIXEL_FORMAT.RG32F) return gl.RG32F;\n\t\t\t\t\tif (internalFormat === PIXEL_FORMAT.RGB32F) return gl.RGB32F;\n\t\t\t\t\tif (internalFormat === PIXEL_FORMAT.RGBA32F) return gl.RGBA32F;\n\t\t\t\t\tif (internalFormat === PIXEL_FORMAT.R11F_G11F_B10F) return gl.R11F_G11F_B10F;\n\t\t\t\t} else {\n\t\t\t\t\tconsole.warn('extension EXT_color_buffer_float is not support.');\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn (gl[internalFormat] !== undefined) ? gl[internalFormat] : internalFormat;\n\t}\n\n}\n\nfunction createTexture(gl, type, target, count) {\n\tconst data = new Uint8Array(4); // 4 is required to match default unpack alignment of 4.\n\tconst texture = gl.createTexture();\n\n\tgl.bindTexture(type, texture);\n\tgl.texParameteri(type, gl.TEXTURE_MIN_FILTER, gl.NEAREST);\n\tgl.texParameteri(type, gl.TEXTURE_MAG_FILTER, gl.NEAREST);\n\n\tfor (let i = 0; i < count; i++) {\n\t\tgl.texImage2D(target + i, 0, gl.RGBA, 1, 1, 0, gl.RGBA, gl.UNSIGNED_BYTE, data);\n\t}\n\n\treturn texture;\n}\n\nfunction ColorBuffer(gl) {\n\tlet locked = false;\n\n\tconst color = new Vector4();\n\tlet currentColorMask = null;\n\tconst currentColorClear = new Vector4(0, 0, 0, 0);\n\n\treturn {\n\n\t\tsetMask: function(colorMask) {\n\t\t\tif (currentColorMask !== colorMask && !locked) {\n\t\t\t\tgl.colorMask(colorMask, colorMask, colorMask, colorMask);\n\t\t\t\tcurrentColorMask = colorMask;\n\t\t\t}\n\t\t},\n\n\t\tsetLocked: function(lock) {\n\t\t\tlocked = lock;\n\t\t},\n\n\t\tsetClear: function(r, g, b, a, premultipliedAlpha) {\n\t\t\tif (premultipliedAlpha === true) {\n\t\t\t\tr *= a; g *= a; b *= a;\n\t\t\t}\n\n\t\t\tcolor.set(r, g, b, a);\n\n\t\t\tif (currentColorClear.equals(color) === false) {\n\t\t\t\tgl.clearColor(r, g, b, a);\n\t\t\t\tcurrentColorClear.copy(color);\n\t\t\t}\n\t\t},\n\n\t\tgetClear: function() {\n\t\t\treturn currentColorClear;\n\t\t},\n\n\t\treset: function() {\n\t\t\tlocked = false;\n\n\t\t\tcurrentColorMask = null;\n\t\t\tcurrentColorClear.set(-1, 0, 0, 0); // set to invalid state\n\t\t}\n\n\t};\n}\n\nfunction DepthBuffer(gl, state) {\n\tlet locked = false;\n\n\tlet currentDepthMask = null;\n\tlet currentDepthFunc = null;\n\tlet currentDepthClear = null;\n\n\treturn {\n\n\t\tsetTest: function(depthTest) {\n\t\t\tif (depthTest) {\n\t\t\t\tstate.enable(gl.DEPTH_TEST);\n\t\t\t} else {\n\t\t\t\tstate.disable(gl.DEPTH_TEST);\n\t\t\t}\n\t\t},\n\n\t\tsetMask: function(depthMask) {\n\t\t\tif (currentDepthMask !== depthMask && !locked) {\n\t\t\t\tgl.depthMask(depthMask);\n\t\t\t\tcurrentDepthMask = depthMask;\n\t\t\t}\n\t\t},\n\n\t\tsetFunc: function(depthFunc) {\n\t\t\tif (currentDepthFunc !== depthFunc) {\n\t\t\t\tgl.depthFunc(depthFunc);\n\t\t\t\tcurrentDepthFunc = depthFunc;\n\t\t\t}\n\t\t},\n\n\t\tsetLocked: function(lock) {\n\t\t\tlocked = lock;\n\t\t},\n\n\t\tsetClear: function(depth) {\n\t\t\tif (currentDepthClear !== depth) {\n\t\t\t\tgl.clearDepth(depth);\n\t\t\t\tcurrentDepthClear = depth;\n\t\t\t}\n\t\t},\n\n\t\treset: function() {\n\t\t\tlocked = false;\n\n\t\t\tcurrentDepthMask = null;\n\t\t\tcurrentDepthFunc = null;\n\t\t\tcurrentDepthClear = null;\n\t\t}\n\n\t};\n}\n\nfunction StencilBuffer(gl, state) {\n\tlet locked = false;\n\n\tlet currentStencilMask = null;\n\tlet currentStencilFunc = null;\n\tlet currentStencilRef = null;\n\tlet currentStencilFuncMask = null;\n\tlet currentStencilFail = null;\n\tlet currentStencilZFail = null;\n\tlet currentStencilZPass = null;\n\tlet currentStencilFuncBack = null;\n\tlet currentStencilRefBack = null;\n\tlet currentStencilFuncMaskBack = null;\n\tlet currentStencilFailBack = null;\n\tlet currentStencilZFailBack = null;\n\tlet currentStencilZPassBack = null;\n\tlet currentStencilClear = null;\n\n\treturn {\n\n\t\tsetTest: function(stencilTest) {\n\t\t\tif (stencilTest) {\n\t\t\t\tstate.enable(gl.STENCIL_TEST);\n\t\t\t} else {\n\t\t\t\tstate.disable(gl.STENCIL_TEST);\n\t\t\t}\n\t\t},\n\n\t\tsetMask: function(stencilMask) {\n\t\t\tif (currentStencilMask !== stencilMask && !locked) {\n\t\t\t\tgl.stencilMask(stencilMask);\n\t\t\t\tcurrentStencilMask = stencilMask;\n\t\t\t}\n\t\t},\n\n\t\tsetFunc: function(stencilFunc, stencilRef, stencilMask, stencilFuncBack, stencilRefBack, stencilMaskBack) {\n\t\t\tif (currentStencilFunc !== stencilFunc ||\n\t\t\t\tcurrentStencilRef !== stencilRef ||\n\t\t\t\tcurrentStencilFuncMask !== stencilMask ||\n\t\t\t\tcurrentStencilFuncBack !== stencilFuncBack ||\n\t\t\t\tcurrentStencilRefBack !== stencilRefBack ||\n\t\t\t\tcurrentStencilFuncMaskBack !== stencilMaskBack) {\n\t\t\t\tif (stencilFuncBack === null || stencilRefBack === null || stencilMaskBack === null) {\n\t\t\t\t\tgl.stencilFunc(stencilFunc, stencilRef, stencilMask);\n\t\t\t\t} else {\n\t\t\t\t\tgl.stencilFuncSeparate(gl.FRONT, stencilFunc, stencilRef, stencilMask);\n\t\t\t\t\tgl.stencilFuncSeparate(gl.BACK, stencilFuncBack, stencilRefBack, stencilMaskBack);\n\t\t\t\t}\n\n\t\t\t\tcurrentStencilFunc = stencilFunc;\n\t\t\t\tcurrentStencilRef = stencilRef;\n\t\t\t\tcurrentStencilFuncMask = stencilMask;\n\t\t\t\tcurrentStencilFuncBack = stencilFuncBack;\n\t\t\t\tcurrentStencilRefBack = stencilRefBack;\n\t\t\t\tcurrentStencilFuncMaskBack = stencilMaskBack;\n\t\t\t}\n\t\t},\n\n\t\tsetOp: function(stencilFail, stencilZFail, stencilZPass, stencilFailBack, stencilZFailBack, stencilZPassBack) {\n\t\t\tif (currentStencilFail\t !== stencilFail \t||\n\t\t\t\tcurrentStencilZFail !== stencilZFail ||\n\t\t\t\tcurrentStencilZPass !== stencilZPass ||\n\t\t\t\tcurrentStencilFailBack\t !== stencilFailBack ||\n\t\t\t\tcurrentStencilZFailBack !== stencilZFailBack ||\n\t\t\t\tcurrentStencilZPassBack !== stencilZPassBack) {\n\t\t\t\tif (stencilFailBack === null || stencilZFailBack === null || stencilZPassBack === null) {\n\t\t\t\t\tgl.stencilOp(stencilFail, stencilZFail, stencilZPass);\n\t\t\t\t} else {\n\t\t\t\t\tgl.stencilOpSeparate(gl.FRONT, stencilFail, stencilZFail, stencilZPass);\n\t\t\t\t\tgl.stencilOpSeparate(gl.BACK, stencilFailBack, stencilZFailBack, stencilZPassBack);\n\t\t\t\t}\n\n\t\t\t\tcurrentStencilFail = stencilFail;\n\t\t\t\tcurrentStencilZFail = stencilZFail;\n\t\t\t\tcurrentStencilZPass = stencilZPass;\n\t\t\t\tcurrentStencilFailBack = stencilFailBack;\n\t\t\t\tcurrentStencilZFailBack = stencilZFailBack;\n\t\t\t\tcurrentStencilZPassBack = stencilZPassBack;\n\t\t\t}\n\t\t},\n\n\t\tsetLocked: function(lock) {\n\t\t\tlocked = lock;\n\t\t},\n\n\t\tsetClear: function(stencil) {\n\t\t\tif (currentStencilClear !== stencil) {\n\t\t\t\tgl.clearStencil(stencil);\n\t\t\t\tcurrentStencilClear = stencil;\n\t\t\t}\n\t\t},\n\n\t\treset: function() {\n\t\t\tlocked = false;\n\n\t\t\tcurrentStencilMask = null;\n\t\t\tcurrentStencilFunc = null;\n\t\t\tcurrentStencilRef = null;\n\t\t\tcurrentStencilFuncMask = null;\n\t\t\tcurrentStencilFail = null;\n\t\t\tcurrentStencilZFail = null;\n\t\t\tcurrentStencilZPass = null;\n\t\t\tcurrentStencilFuncBack = null;\n\t\t\tcurrentStencilRefBack = null;\n\t\t\tcurrentStencilFuncMaskBack = null;\n\t\t\tcurrentStencilFailBack = null;\n\t\t\tcurrentStencilZFailBack = null;\n\t\t\tcurrentStencilZPassBack = null;\n\t\t\tcurrentStencilClear = null;\n\t\t}\n\n\t};\n}\n\nclass WebGLState {\n\n\tconstructor(gl, capabilities) {\n\t\tthis.gl = gl;\n\t\tthis.capabilities = capabilities;\n\n\t\tthis.colorBuffer = new ColorBuffer(gl);\n\t\tthis.depthBuffer = new DepthBuffer(gl, this);\n\t\tthis.stencilBuffer = new StencilBuffer(gl, this);\n\n\t\tthis.states = {};\n\n\t\tthis.currentBlending = null;\n\t\tthis.currentBlendEquation = null;\n\t\tthis.currentBlendSrc = null;\n\t\tthis.currentBlendDst = null;\n\t\tthis.currentBlendEquationAlpha = null;\n\t\tthis.currentBlendSrcAlpha = null;\n\t\tthis.currentBlendDstAlpha = null;\n\t\tthis.currentPremultipliedAlpha = null;\n\n\t\tthis.currentFlipSided = false;\n\t\tthis.currentCullFace = null;\n\n\t\tconst viewportParam = gl.getParameter(gl.VIEWPORT);\n\t\tthis.currentViewport = new Vector4().fromArray(viewportParam);\n\n\t\tthis.currentLineWidth = null;\n\n\t\tthis.currentPolygonOffsetFactor = null;\n\t\tthis.currentPolygonOffsetUnits = null;\n\n\t\tthis.currentProgram = null;\n\n\t\tthis.currentBoundBuffers = {};\n\n\t\tthis.currentRenderTarget = null; // used in WebGLRenderTargets\n\n\t\tthis.currentTextureSlot = null;\n\t\tthis.currentBoundTextures = {};\n\n\t\tthis.emptyTextures = {};\n\t\tthis.emptyTextures[gl.TEXTURE_2D] = createTexture(gl, gl.TEXTURE_2D, gl.TEXTURE_2D, 1);\n\t\tthis.emptyTextures[gl.TEXTURE_CUBE_MAP] = createTexture(gl, gl.TEXTURE_CUBE_MAP, gl.TEXTURE_CUBE_MAP_POSITIVE_X, 6);\n\n\t\tthis.blendEquationToGL = {\n\t\t\t[BLEND_EQUATION.ADD]: gl.FUNC_ADD,\n\t\t\t[BLEND_EQUATION.SUBTRACT]: gl.FUNC_SUBTRACT,\n\t\t\t[BLEND_EQUATION.REVERSE_SUBTRACT]: gl.FUNC_REVERSE_SUBTRACT,\n\t\t\t[BLEND_EQUATION.MIN]: gl.MIN,\n\t\t\t[BLEND_EQUATION.MAX]: gl.MAX\n\t\t};\n\n\t\tthis.blendFactorToGL = {\n\t\t\t[BLEND_FACTOR.ZERO]: gl.ZERO,\n\t\t\t[BLEND_FACTOR.ONE]: gl.ONE,\n\t\t\t[BLEND_FACTOR.SRC_COLOR]: gl.SRC_COLOR,\n\t\t\t[BLEND_FACTOR.SRC_ALPHA]: gl.SRC_ALPHA,\n\t\t\t[BLEND_FACTOR.SRC_ALPHA_SATURATE]: gl.SRC_ALPHA_SATURATE,\n\t\t\t[BLEND_FACTOR.DST_COLOR]: gl.DST_COLOR,\n\t\t\t[BLEND_FACTOR.DST_ALPHA]: gl.DST_ALPHA,\n\t\t\t[BLEND_FACTOR.ONE_MINUS_SRC_COLOR]: gl.ONE_MINUS_SRC_COLOR,\n\t\t\t[BLEND_FACTOR.ONE_MINUS_SRC_ALPHA]: gl.ONE_MINUS_SRC_ALPHA,\n\t\t\t[BLEND_FACTOR.ONE_MINUS_DST_COLOR]: gl.ONE_MINUS_DST_COLOR,\n\t\t\t[BLEND_FACTOR.ONE_MINUS_DST_ALPHA]: gl.ONE_MINUS_DST_ALPHA\n\t\t};\n\n\t\t// init\n\n\t\tthis.colorBuffer.setClear(0, 0, 0, 1);\n\t\tthis.depthBuffer.setClear(1);\n\t\tthis.stencilBuffer.setClear(0);\n\n\t\tthis.depthBuffer.setTest(true);\n\t\tthis.depthBuffer.setFunc(COMPARE_FUNC.LEQUAL);\n\n\t\tthis.setFlipSided(false);\n\t\tthis.setCullFace(CULL_FACE_TYPE.BACK);\n\t}\n\n\tenable(id) {\n\t\tif (this.states[id] !== true) {\n\t\t\tthis.gl.enable(id);\n\t\t\tthis.states[id] = true;\n\t\t}\n\t}\n\n\tdisable(id) {\n\t\tif (this.states[id] !== false) {\n\t\t\tthis.gl.disable(id);\n\t\t\tthis.states[id] = false;\n\t\t}\n\t}\n\n\tsetBlending(blend, blendEquation, blendSrc, blendDst, blendEquationAlpha, blendSrcAlpha, blendDstAlpha, premultipliedAlpha) {\n\t\tconst gl = this.gl;\n\n\t\tif (blend === BLEND_TYPE.NONE) {\n\t\t\tthis.disable(gl.BLEND);\n\t\t\treturn;\n\t\t}\n\n\t\tthis.enable(gl.BLEND);\n\n\t\tif (blend !== BLEND_TYPE.CUSTOM) {\n\t\t\tif (blend !== this.currentBlending || premultipliedAlpha !== this.currentPremultipliedAlpha) {\n\t\t\t\tif (this.currentBlendEquation !== BLEND_EQUATION.ADD || this.currentBlendEquationAlpha !== BLEND_EQUATION.ADD) {\n\t\t\t\t\tgl.blendEquation(gl.FUNC_ADD);\n\t\t\t\t\tthis.currentBlendEquation = BLEND_EQUATION.ADD;\n\t\t\t\t\tthis.currentBlendEquationAlpha = BLEND_EQUATION.ADD;\n\t\t\t\t}\n\n\t\t\t\tif (blend === BLEND_TYPE.NORMAL) {\n\t\t\t\t\tif (premultipliedAlpha) {\n\t\t\t\t\t\tgl.blendFuncSeparate(gl.ONE, gl.ONE_MINUS_SRC_ALPHA, gl.ONE, gl.ONE_MINUS_SRC_ALPHA);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tgl.blendFuncSeparate(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA, gl.ONE, gl.ONE_MINUS_SRC_ALPHA);\n\t\t\t\t\t}\n\t\t\t\t} else if (blend === BLEND_TYPE.ADD) {\n\t\t\t\t\tif (premultipliedAlpha) {\n\t\t\t\t\t\tgl.blendFunc(gl.ONE, gl.ONE);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tgl.blendFunc(gl.SRC_ALPHA, gl.ONE);\n\t\t\t\t\t}\n\t\t\t\t} else if (blend === BLEND_TYPE.SUB) {\n\t\t\t\t\tgl.blendFuncSeparate(gl.ZERO, gl.ONE_MINUS_SRC_COLOR, gl.ZERO, gl.ONE);\n\t\t\t\t} else if (blend === BLEND_TYPE.MUL) {\n\t\t\t\t\tif (premultipliedAlpha) {\n\t\t\t\t\t\tgl.blendFuncSeparate(gl.ZERO, gl.SRC_COLOR, gl.ZERO, gl.SRC_ALPHA);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tgl.blendFunc(gl.ZERO, gl.SRC_COLOR);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tconsole.error('WebGLState: Invalid blending: ', blend);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis.currentBlendSrc = null;\n\t\t\tthis.currentBlendDst = null;\n\t\t\tthis.currentBlendSrcAlpha = null;\n\t\t\tthis.currentBlendDstAlpha = null;\n\t\t} else {\n\t\t\tblendEquationAlpha = blendEquationAlpha || blendEquation;\n\t\t\tblendSrcAlpha = blendSrcAlpha || blendSrc;\n\t\t\tblendDstAlpha = blendDstAlpha || blendDst;\n\n\t\t\tconst equationToGL = this.blendEquationToGL;\n\t\t\tconst factorToGL = this.blendFactorToGL;\n\n\t\t\tif (blendEquation !== this.currentBlendEquation || blendEquationAlpha !== this.currentBlendEquationAlpha) {\n\t\t\t\tgl.blendEquationSeparate(equationToGL[blendEquation], equationToGL[blendEquationAlpha]);\n\n\t\t\t\tthis.currentBlendEquation = blendEquation;\n\t\t\t\tthis.currentBlendEquationAlpha = blendEquationAlpha;\n\t\t\t}\n\n\t\t\tif (blendSrc !== this.currentBlendSrc || blendDst !== this.currentBlendDst || blendSrcAlpha !== this.currentBlendSrcAlpha || blendDstAlpha !== this.currentBlendDstAlpha) {\n\t\t\t\tgl.blendFuncSeparate(factorToGL[blendSrc], factorToGL[blendDst], factorToGL[blendSrcAlpha], factorToGL[blendDstAlpha]);\n\n\t\t\t\tthis.currentBlendSrc = blendSrc;\n\t\t\t\tthis.currentBlendDst = blendDst;\n\t\t\t\tthis.currentBlendSrcAlpha = blendSrcAlpha;\n\t\t\t\tthis.currentBlendDstAlpha = blendDstAlpha;\n\t\t\t}\n\t\t}\n\n\t\tthis.currentBlending = blend;\n\t\tthis.currentPremultipliedAlpha = premultipliedAlpha;\n\t}\n\n\tsetFlipSided(flipSided) {\n\t\tconst gl = this.gl;\n\n\t\tif (this.currentFlipSided !== flipSided) {\n\t\t\tif (flipSided) {\n\t\t\t\tgl.frontFace(gl.CW);\n\t\t\t} else {\n\t\t\t\tgl.frontFace(gl.CCW);\n\t\t\t}\n\n\t\t\tthis.currentFlipSided = flipSided;\n\t\t}\n\t}\n\n\tsetCullFace(cullFace) {\n\t\tconst gl = this.gl;\n\n\t\tif (cullFace !== CULL_FACE_TYPE.NONE) {\n\t\t\tthis.enable(gl.CULL_FACE);\n\n\t\t\tif (cullFace !== this.currentCullFace) {\n\t\t\t\tif (cullFace === CULL_FACE_TYPE.BACK) {\n\t\t\t\t\tgl.cullFace(gl.BACK);\n\t\t\t\t} else if (cullFace === CULL_FACE_TYPE.FRONT) {\n\t\t\t\t\tgl.cullFace(gl.FRONT);\n\t\t\t\t} else {\n\t\t\t\t\tgl.cullFace(gl.FRONT_AND_BACK);\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tthis.disable(gl.CULL_FACE);\n\t\t}\n\n\t\tthis.currentCullFace = cullFace;\n\t}\n\n\tviewport(viewport) {\n\t\tconst currentViewport = this.currentViewport;\n\n\t\tif (currentViewport.equals(viewport)) return;\n\n\t\tthis.gl.viewport(viewport.x, viewport.y, viewport.z, viewport.w);\n\t\tcurrentViewport.copy(viewport);\n\t}\n\n\tsetLineWidth(width) {\n\t\tif (width !== this.currentLineWidth) {\n\t\t\tconst lineWidthRange = this.capabilities.lineWidthRange;\n\t\t\tif (lineWidthRange[0] <= width && width <= lineWidthRange[1]) {\n\t\t\t\tthis.gl.lineWidth(width);\n\t\t\t} else {\n\t\t\t\tconsole.warn('GL_ALIASED_LINE_WIDTH_RANGE is [' + lineWidthRange[0] + ',' + lineWidthRange[1] + '], but set to ' + width + '.');\n\t\t\t}\n\t\t\tthis.currentLineWidth = width;\n\t\t}\n\t}\n\n\tsetPolygonOffset(polygonOffset, factor, units) {\n\t\tconst gl = this.gl;\n\n\t\tif (polygonOffset) {\n\t\t\tthis.enable(gl.POLYGON_OFFSET_FILL);\n\n\t\t\tif (this.currentPolygonOffsetFactor !== factor || this.currentPolygonOffsetUnits !== units) {\n\t\t\t\tgl.polygonOffset(factor, units);\n\n\t\t\t\tthis.currentPolygonOffsetFactor = factor;\n\t\t\t\tthis.currentPolygonOffsetUnits = units;\n\t\t\t}\n\t\t} else {\n\t\t\tthis.disable(gl.POLYGON_OFFSET_FILL);\n\t\t}\n\t}\n\n\tsetProgram(program) {\n\t\tif (this.currentProgram !== program) {\n\t\t\tthis.gl.useProgram(program.program);\n\t\t\tthis.currentProgram = program;\n\t\t}\n\t}\n\n\tbindBuffer(type, buffer) {\n\t\tconst gl = this.gl;\n\n\t\tconst boundBuffer = this.currentBoundBuffers[type];\n\n\t\tif (boundBuffer !== buffer) {\n\t\t\tgl.bindBuffer(type, buffer);\n\t\t\tthis.currentBoundBuffers[type] = buffer;\n\t\t}\n\t}\n\n\tactiveTexture(slot) {\n\t\tconst gl = this.gl;\n\n\t\tif (slot === undefined) {\n\t\t\tslot = gl.TEXTURE0 + this.capabilities.maxTextures - 1;\n\t\t}\n\n\t\tif (this.currentTextureSlot !== slot) {\n\t\t\tgl.activeTexture(slot);\n\t\t\tthis.currentTextureSlot = slot;\n\t\t}\n\t}\n\n\tbindTexture(type, texture) {\n\t\tconst gl = this.gl;\n\n\t\tif (this.currentTextureSlot === null) {\n\t\t\tthis.activeTexture();\n\t\t}\n\n\t\tlet boundTexture = this.currentBoundTextures[this.currentTextureSlot];\n\n\t\tif (boundTexture === undefined) {\n\t\t\tboundTexture = {\n\t\t\t\ttype: undefined,\n\t\t\t\ttexture: undefined\n\t\t\t};\n\t\t\tthis.currentBoundTextures[this.currentTextureSlot] = boundTexture;\n\t\t}\n\n\t\tif (boundTexture.type !== type || boundTexture.texture !== texture) {\n\t\t\tgl.bindTexture(type, texture || this.emptyTextures[type]);\n\t\t\tboundTexture.type = type;\n\t\t\tboundTexture.texture = texture;\n\t\t}\n\t}\n\n\treset() {\n\t\tconst gl = this.gl;\n\n\t\tgl.colorMask(true, true, true, true);\n\t\tgl.clearColor(0, 0, 0, 0);\n\n\t\tgl.depthMask(true);\n\t\tgl.depthFunc(gl.LESS);\n\t\tgl.clearDepth(1);\n\n\t\tgl.stencilMask(0xffffffff);\n\t\tgl.stencilFunc(gl.ALWAYS, 0, 0xffffffff);\n\t\tgl.stencilOp(gl.KEEP, gl.KEEP, gl.KEEP);\n\t\tgl.clearStencil(0);\n\n\t\tgl.disable(gl.BLEND);\n\t\tgl.disable(gl.CULL_FACE);\n\t\tgl.disable(gl.DEPTH_TEST);\n\t\tgl.disable(gl.POLYGON_OFFSET_FILL);\n\t\tgl.disable(gl.SCISSOR_TEST);\n\t\tgl.disable(gl.STENCIL_TEST);\n\t\tgl.disable(gl.SAMPLE_ALPHA_TO_COVERAGE);\n\n\t\tgl.blendEquation(gl.FUNC_ADD);\n\t\tgl.blendFunc(gl.ONE, gl.ZERO);\n\t\tgl.blendFuncSeparate(gl.ONE, gl.ZERO, gl.ONE, gl.ZERO);\n\n\t\tgl.cullFace(gl.BACK);\n\t\tgl.frontFace(gl.CCW);\n\n\t\t// gl.scissor(0, 0, gl.canvas.width, gl.canvas.height);\n\t\tgl.viewport(0, 0, gl.canvas.width, gl.canvas.height);\n\n\t\tgl.lineWidth(1);\n\n\t\tgl.polygonOffset(0, 0);\n\n\t\tgl.useProgram(null);\n\n\t\tgl.bindFramebuffer(gl.FRAMEBUFFER, null);\n\n\t\tgl.activeTexture(gl.TEXTURE0);\n\n\t\tthis.colorBuffer.reset();\n\t\tthis.depthBuffer.reset();\n\t\tthis.stencilBuffer.reset();\n\n\t\tthis.states = {};\n\n\t\tthis.currentBlending = null;\n\t\tthis.currentBlendEquation = null;\n\t\tthis.currentBlendSrc = null;\n\t\tthis.currentBlendDst = null;\n\t\tthis.currentBlendEquationAlpha = null;\n\t\tthis.currentBlendSrcAlpha = null;\n\t\tthis.currentBlendDstAlpha = null;\n\t\tthis.currentPremultipliedAlpha = null;\n\n\t\tthis.currentFlipSided = false;\n\t\tthis.currentCullFace = null;\n\n\t\tthis.currentViewport.set(0, 0, gl.canvas.width, gl.canvas.height);\n\n\t\tthis.currentLineWidth = null;\n\n\t\tthis.currentPolygonOffsetFactor = null;\n\t\tthis.currentPolygonOffsetUnits = null;\n\n\t\tthis.currentProgram = null;\n\n\t\tthis.currentBoundBuffers = {};\n\n\t\tthis.currentRenderTarget = null; // used in WebGLRenderTargets\n\n\t\tthis.currentTextureSlot = null;\n\t\tthis.currentBoundTextures = {};\n\t}\n\n\tsetMaterial(material, frontFaceCW) {\n\t\tthis.setCullFace(\n\t\t\t(material.side === DRAW_SIDE.DOUBLE) ? CULL_FACE_TYPE.NONE : CULL_FACE_TYPE.BACK\n\t\t);\n\n\t\tlet flipSided = (material.side === DRAW_SIDE.BACK);\n\t\tif (frontFaceCW) flipSided = !flipSided;\n\n\t\tthis.setFlipSided(flipSided);\n\n\t\tif (material.blending === BLEND_TYPE.NORMAL && material.transparent === false) {\n\t\t\tthis.setBlending(BLEND_TYPE.NONE);\n\t\t} else {\n\t\t\tthis.setBlending(material.blending, material.blendEquation, material.blendSrc, material.blendDst, material.blendEquationAlpha, material.blendSrcAlpha, material.blendDstAlpha, material.premultipliedAlpha);\n\t\t}\n\n\t\tthis.depthBuffer.setFunc(material.depthFunc);\n\t\tthis.depthBuffer.setTest(material.depthTest);\n\t\tthis.depthBuffer.setMask(material.depthWrite);\n\t\tthis.colorBuffer.setMask(material.colorWrite);\n\n\t\tconst stencilTest = material.stencilTest;\n\t\tthis.stencilBuffer.setTest(stencilTest);\n\t\tif (stencilTest) {\n\t\t\tthis.stencilBuffer.setMask(material.stencilWriteMask);\n\t\t\tthis.stencilBuffer.setFunc(material.stencilFunc, material.stencilRef, material.stencilFuncMask, material.stencilFuncBack, material.stencilRefBack, material.stencilFuncMaskBack);\n\t\t\tthis.stencilBuffer.setOp(material.stencilFail, material.stencilZFail, material.stencilZPass, material.stencilFailBack, material.stencilZFailBack, material.stencilZPassBack);\n\t\t}\n\n\t\tthis.setPolygonOffset(material.polygonOffset, material.polygonOffsetFactor, material.polygonOffsetUnits);\n\n\t\tif (material.lineWidth !== undefined) {\n\t\t\tthis.setLineWidth(material.lineWidth);\n\t\t}\n\n\t\tmaterial.alphaToCoverage === true\n\t\t\t? this.enable(this.gl.SAMPLE_ALPHA_TO_COVERAGE)\n\t\t\t: this.disable(this.gl.SAMPLE_ALPHA_TO_COVERAGE);\n\t}\n\n}\n\nclass WebGLTextures extends PropertyMap {\n\n\tconstructor(prefix, gl, state, capabilities, constants) {\n\t\tsuper(prefix);\n\n\t\tthis._gl = gl;\n\t\tthis._state = state;\n\t\tthis._capabilities = capabilities;\n\t\tthis._constants = constants;\n\n\t\tthis._usedTextureUnits = 0;\n\n\t\tconst that = this;\n\n\t\tfunction onTextureDispose(event) {\n\t\t\tconst texture = event.target;\n\t\t\tconst textureProperties = that.get(texture);\n\n\t\t\ttexture.removeEventListener('dispose', onTextureDispose);\n\n\t\t\tif (textureProperties.__webglTexture && !textureProperties.__external) {\n\t\t\t\tgl.deleteTexture(textureProperties.__webglTexture);\n\t\t\t}\n\n\t\t\tif (textureProperties.__readBuffer) {\n\t\t\t\tgl.deleteBuffer(textureProperties.__readBuffer);\n\t\t\t}\n\n\t\t\tthat.delete(texture);\n\t\t}\n\n\t\tthis._onTextureDispose = onTextureDispose;\n\n\t\tthis._wrappingToGL = {\n\t\t\t[TEXTURE_WRAP.REPEAT]: gl.REPEAT,\n\t\t\t[TEXTURE_WRAP.CLAMP_TO_EDGE]: gl.CLAMP_TO_EDGE,\n\t\t\t[TEXTURE_WRAP.MIRRORED_REPEAT]: gl.MIRRORED_REPEAT\n\t\t};\n\n\t\tthis._filterToGL = {\n\t\t\t[TEXTURE_FILTER.NEAREST]: gl.NEAREST,\n\t\t\t[TEXTURE_FILTER.LINEAR]: gl.LINEAR,\n\t\t\t[TEXTURE_FILTER.NEAREST_MIPMAP_NEAREST]: gl.NEAREST_MIPMAP_NEAREST,\n\t\t\t[TEXTURE_FILTER.LINEAR_MIPMAP_NEAREST]: gl.LINEAR_MIPMAP_NEAREST,\n\t\t\t[TEXTURE_FILTER.NEAREST_MIPMAP_LINEAR]: gl.NEAREST_MIPMAP_LINEAR,\n\t\t\t[TEXTURE_FILTER.LINEAR_MIPMAP_LINEAR]: gl.LINEAR_MIPMAP_LINEAR\n\t\t};\n\t}\n\n\tallocTexUnit() {\n\t\tconst textureUnit = this._usedTextureUnits++;\n\n\t\tif (textureUnit >= this._capabilities.maxTextures) {\n\t\t\tconsole.warn('trying to use ' + textureUnit + ' texture units while this GPU supports only ' + this._capabilities.maxTextures);\n\t\t}\n\n\t\treturn textureUnit;\n\t}\n\n\tresetTextureUnits() {\n\t\tthis._usedTextureUnits = 0;\n\t}\n\n\tsetTexture(texture, slot) {\n\t\tconst gl = this._gl;\n\t\tconst capabilities = this._capabilities;\n\t\tconst constants = this._constants;\n\t\tconst state = this._state;\n\n\t\tif ((texture.isTexture3D || texture.isTexture2DArray) && capabilities.version < 2) {\n\t\t\tconsole.warn('WebGLTextures: Texture3D/Texture2DArray is not supported in WebGL1.0.');\n\t\t\treturn;\n\t\t}\n\n\t\tif (slot !== undefined) {\n\t\t\tslot = gl.TEXTURE0 + slot;\n\t\t}\n\n\t\tconst textureProperties = this.get(texture);\n\n\t\tconst textureTarget = getTextureTarget(gl, texture);\n\n\t\tconst hasImage = texture.isTextureCube ? texture.images.length === 6 : !!texture.image;\n\t\tlet singleImage = texture.isTextureCube ? texture.images[0] : texture.image;\n\n\t\tif (\n\t\t\thasImage\n\t\t\t&& textureProperties.__version !== texture.version\n\t\t\t// Do not initialize rtt texture, unless slot is undefined,\n\t\t\t// which means the caller just wants to bind the texture to the framebuffer, not use it for sampling.\n\t\t\t&& (!singleImage.rtt || slot === undefined)\n\t\t\t// Do not initialize external texture\n\t\t\t&& !textureProperties.__external\n\t\t) {\n\t\t\tif (textureProperties.__webglTexture === undefined) {\n\t\t\t\ttexture.addEventListener('dispose', this._onTextureDispose);\n\t\t\t\ttextureProperties.__webglTexture = gl.createTexture();\n\t\t\t\ttextureProperties.__webglTarget = textureTarget;\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\tcapabilities.version < 2 && texture.isTexture2D\n\t\t\t\t&& !_isPowerOfTwo(singleImage) && textureNeedsPowerOfTwo(texture)\n\t\t\t\t&& domCheck(singleImage)\n\t\t\t) {\n\t\t\t\tsingleImage = makePowerOf2(singleImage);\n\t\t\t}\n\n\t\t\tconst needFallback = capabilities.version < 2 && !_isPowerOfTwo(singleImage);\n\t\t\tconst uploadMipmaps = texture.mipmaps.length > 0 && !needFallback;\n\n\t\t\tconst glFormat = constants.getGLFormat(texture.format),\n\t\t\t\tglType = constants.getGLType(texture.type),\n\t\t\t\tglInternalFormat = (texture.internalformat !== null) ? constants.getGLInternalFormat(texture.internalformat) :\n\t\t\t\t\tgetGLInternalFormat(gl, capabilities, glFormat, glType);\n\n\t\t\ttextureProperties.__glFormat = glFormat;\n\t\t\ttextureProperties.__glType = glType;\n\t\t\ttextureProperties.__glInternalFormat = glInternalFormat;\n\t\t\ttextureProperties.__width = singleImage.width;\n\t\t\ttextureProperties.__height = singleImage.height;\n\t\t\ttextureProperties.__maxMipLevel = uploadMipmaps ? texture.mipmaps.length - 1 : 0;\n\n\t\t\tstate.activeTexture(slot);\n\t\t\tstate.bindTexture(textureTarget, textureProperties.__webglTexture);\n\n\t\t\tgl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, texture.flipY);\n\t\t\tgl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, texture.premultiplyAlpha);\n\t\t\tgl.pixelStorei(gl.UNPACK_ALIGNMENT, texture.unpackAlignment);\n\t\t\tgl.pixelStorei(gl.UNPACK_COLORSPACE_CONVERSION_WEBGL, gl.NONE);\n\n\t\t\tthis._setTextureParameters(texture, textureTarget, needFallback);\n\n\t\t\tif (texture.isTexture2D) {\n\t\t\t\tthis._upload2DImage(texture, textureProperties, uploadMipmaps, singleImage);\n\t\t\t} else if (texture.isTextureCube) {\n\t\t\t\tthis._uploadCubeImages(texture, textureProperties, uploadMipmaps);\n\t\t\t} else if (texture.isTexture3D) {\n\t\t\t\tthis._upload3DImage(texture, textureProperties);\n\t\t\t} else if (texture.isTexture2DArray) {\n\t\t\t\tthis._upload2DArrayImage(texture, textureProperties);\n\t\t\t}\n\n\t\t\tif (texture.generateMipmaps && !uploadMipmaps && !needFallback) {\n\t\t\t\tthis.generateMipmaps(texture);\n\t\t\t}\n\n\t\t\ttextureProperties.__version = texture.version;\n\n\t\t\treturn textureProperties;\n\t\t}\n\n\t\tstate.activeTexture(slot);\n\t\tstate.bindTexture(textureTarget, textureProperties.__webglTexture);\n\n\t\treturn textureProperties;\n\t}\n\n\tgenerateMipmaps(texture) {\n\t\tconst gl = this._gl;\n\n\t\tconst textureProperties = this.get(texture);\n\n\t\tgl.generateMipmap(textureProperties.__webglTarget);\n\n\t\tconst width = textureProperties.__width, height = textureProperties.__height;\n\t\t// Note: Math.log( x ) * Math.LOG2E used instead of Math.log2( x ) which is not supported by IE11\n\t\ttextureProperties.__maxMipLevel = Math.log(Math.max(width, height)) * Math.LOG2E;\n\t}\n\n\tsetTextureExternal(texture, webglTexture) {\n\t\tconst gl = this._gl;\n\n\t\tconst textureProperties = this.get(texture);\n\n\t\tif (!textureProperties.__external) {\n\t\t\tif (textureProperties.__webglTexture) {\n\t\t\t\tgl.deleteTexture(textureProperties.__webglTexture);\n\t\t\t} else {\n\t\t\t\ttexture.addEventListener('dispose', this._onTextureDispose);\n\t\t\t}\n\t\t}\n\n\t\ttextureProperties.__webglTexture = webglTexture;\n\t\ttextureProperties.__external = true;\n\t}\n\n\t_setTextureParameters(texture, textureType, needFallback) {\n\t\tconst gl = this._gl;\n\t\tconst capabilities = this._capabilities;\n\n\t\tconst wrappingToGL = this._wrappingToGL;\n\t\tconst filterToGL = this._filterToGL;\n\n\t\tlet wrapS = texture.wrapS,\n\t\t\twrapT = texture.wrapT,\n\t\t\twrapR = texture.wrapR,\n\t\t\tmagFilter = texture.magFilter,\n\t\t\tminFilter = texture.minFilter;\n\n\t\t// fix for non power of 2 image in WebGL 1.0\n\t\tif (needFallback) {\n\t\t\twrapS = TEXTURE_WRAP.CLAMP_TO_EDGE;\n\t\t\twrapT = TEXTURE_WRAP.CLAMP_TO_EDGE;\n\n\t\t\tif (texture.isTexture3D) {\n\t\t\t\twrapR = TEXTURE_WRAP.CLAMP_TO_EDGE;\n\t\t\t}\n\n\t\t\tif (texture.wrapS !== TEXTURE_WRAP.CLAMP_TO_EDGE || texture.wrapT !== TEXTURE_WRAP.CLAMP_TO_EDGE) {\n\t\t\t\tconsole.warn('Texture is not power of two. Texture.wrapS and Texture.wrapT should be set to TEXTURE_WRAP.CLAMP_TO_EDGE.', texture);\n\t\t\t}\n\n\t\t\tmagFilter = filterFallback(texture.magFilter);\n\t\t\tminFilter = filterFallback(texture.minFilter);\n\n\t\t\tif (\n\t\t\t\t(texture.minFilter !== TEXTURE_FILTER.NEAREST && texture.minFilter !== TEXTURE_FILTER.LINEAR) ||\n\t\t\t\t(texture.magFilter !== TEXTURE_FILTER.NEAREST && texture.magFilter !== TEXTURE_FILTER.LINEAR)\n\t\t\t) {\n\t\t\t\tconsole.warn('Texture is not power of two. Texture.minFilter and Texture.magFilter should be set to TEXTURE_FILTER.NEAREST or TEXTURE_FILTER.LINEAR.', texture);\n\t\t\t}\n\t\t}\n\n\t\tgl.texParameteri(textureType, gl.TEXTURE_WRAP_S, wrappingToGL[wrapS]);\n\t\tgl.texParameteri(textureType, gl.TEXTURE_WRAP_T, wrappingToGL[wrapT]);\n\n\t\tif (texture.isTexture3D) {\n\t\t\tgl.texParameteri(textureType, gl.TEXTURE_WRAP_R, wrappingToGL[wrapR]);\n\t\t}\n\n\t\tgl.texParameteri(textureType, gl.TEXTURE_MAG_FILTER, filterToGL[magFilter]);\n\t\tgl.texParameteri(textureType, gl.TEXTURE_MIN_FILTER, filterToGL[minFilter]);\n\n\t\t// anisotropy if EXT_texture_filter_anisotropic exist\n\t\tconst extension = capabilities.anisotropyExt;\n\t\tif (extension) {\n\t\t\tgl.texParameterf(textureType, extension.TEXTURE_MAX_ANISOTROPY_EXT, Math.min(texture.anisotropy, capabilities.maxAnisotropy));\n\t\t}\n\n\t\tif (capabilities.version >= 2) {\n\t\t\tif (texture.compare !== undefined) {\n\t\t\t\tgl.texParameteri(textureType, gl.TEXTURE_COMPARE_MODE, gl.COMPARE_REF_TO_TEXTURE);\n\t\t\t\tgl.texParameteri(textureType, gl.TEXTURE_COMPARE_FUNC, texture.compare);\n\t\t\t} else {\n\t\t\t\tgl.texParameteri(textureType, gl.TEXTURE_COMPARE_MODE, gl.NONE);\n\t\t\t}\n\t\t}\n\t}\n\n\t_upload2DImage(texture, textureProperties, uploadMipmaps, image) {\n\t\tconst gl = this._gl;\n\n\t\tconst glTarget = textureProperties.__webglTarget,\n\t\t\tglFormat = textureProperties.__glFormat,\n\t\t\tglType = textureProperties.__glType,\n\t\t\tglInternalFormat = textureProperties.__glInternalFormat;\n\n\t\tif (domCheck(image)) {\n\t\t\tif (uploadMipmaps) {\n\t\t\t\tconst mipmaps = texture.mipmaps;\n\t\t\t\tfor (let level = 0, l = mipmaps.length; level < l; level++) {\n\t\t\t\t\tgl.texImage2D(glTarget, level, glInternalFormat, glFormat, glType, mipmaps[level]);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tgl.texImage2D(glTarget, 0, glInternalFormat, glFormat, glType, image);\n\t\t\t}\n\t\t} else {\n\t\t\tif (uploadMipmaps) {\n\t\t\t\tconst isCompressed = image.isCompressed;\n\t\t\t\tconst mipmaps = texture.mipmaps;\n\t\t\t\tlet mipmap;\n\t\t\t\tfor (let level = 0, l = mipmaps.length; level < l; level++) {\n\t\t\t\t\tmipmap = mipmaps[level];\n\t\t\t\t\tif (isCompressed) {\n\t\t\t\t\t\tgl.compressedTexImage2D(glTarget, level, glInternalFormat, mipmap.width, mipmap.height, 0, mipmap.data);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tgl.texImage2D(glTarget, level, glInternalFormat, mipmap.width, mipmap.height, texture.border, glFormat, glType, mipmap.data);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tgl.texImage2D(glTarget, 0, glInternalFormat, image.width, image.height, texture.border, glFormat, glType, image.data);\n\t\t\t}\n\t\t}\n\t}\n\n\t_uploadCubeImages(texture, textureProperties, uploadMipmaps) {\n\t\tconst gl = this._gl;\n\n\t\tconst glFormat = textureProperties.__glFormat,\n\t\t\tglType = textureProperties.__glType,\n\t\t\tglInternalFormat = textureProperties.__glInternalFormat;\n\n\t\tconst images = texture.images;\n\t\tfor (let face = 0; face < 6; face++) {\n\t\t\tconst image = images[face];\n\t\t\tconst glTarget = gl.TEXTURE_CUBE_MAP_POSITIVE_X + face;\n\t\t\tif (domCheck(image)) {\n\t\t\t\tif (uploadMipmaps) {\n\t\t\t\t\tconst mipmaps = texture.mipmaps;\n\t\t\t\t\tfor (let level = 0, l = mipmaps.length; level < l; level++) {\n\t\t\t\t\t\tgl.texImage2D(glTarget, level, glInternalFormat, glFormat, glType, mipmaps[level][face]);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tgl.texImage2D(glTarget, 0, glInternalFormat, glFormat, glType, image);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (uploadMipmaps) {\n\t\t\t\t\tconst isCompressed = image.isCompressed;\n\t\t\t\t\tconst mipmaps = texture.mipmaps;\n\t\t\t\t\tlet mipmap;\n\t\t\t\t\tfor (let level = 0, l = mipmaps.length; level < l; level++) {\n\t\t\t\t\t\tmipmap = mipmaps[level][face];\n\t\t\t\t\t\tif (isCompressed) {\n\t\t\t\t\t\t\tgl.compressedTexImage2D(glTarget, level, glInternalFormat, mipmap.width, mipmap.height, 0, mipmap.data);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tgl.texImage2D(glTarget, level, glInternalFormat, mipmap.width, mipmap.height, texture.border, glFormat, glType, mipmap.data);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tgl.texImage2D(glTarget, 0, glInternalFormat, image.width, image.height, texture.border, glFormat, glType, image.data);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t_upload3DImage(texture, textureProperties) {\n\t\tconst gl = this._gl;\n\n\t\tconst glTarget = textureProperties.__webglTarget,\n\t\t\tglFormat = textureProperties.__glFormat,\n\t\t\tglType = textureProperties.__glType,\n\t\t\tglInternalFormat = textureProperties.__glInternalFormat;\n\n\t\tconst image = texture.image;\n\n\t\tgl.texImage3D(glTarget, 0, glInternalFormat, image.width, image.height, image.depth, texture.border, glFormat, glType, image.data);\n\t}\n\n\t_upload2DArrayImage(texture, textureProperties) {\n\t\tconst gl = this._gl;\n\n\t\tconst glTarget = textureProperties.__webglTarget,\n\t\t\tglFormat = textureProperties.__glFormat,\n\t\t\tglType = textureProperties.__glType,\n\t\t\tglInternalFormat = textureProperties.__glInternalFormat;\n\n\t\tconst image = texture.image;\n\n\t\tif (texture.layerUpdates.size > 0) {\n\t\t\tfor (const layerIndex of texture.layerUpdates) {\n\t\t\t\tconst layerByteLength = getByteLength(image.width, image.height, texture.format, texture.type);\n\t\t\t\tconst layerData = image.data.subarray(\n\t\t\t\t\tlayerIndex * layerByteLength / image.data.BYTES_PER_ELEMENT,\n\t\t\t\t\t(layerIndex + 1) * layerByteLength / image.data.BYTES_PER_ELEMENT\n\t\t\t\t);\n\t\t\t\tgl.texSubImage3D(glTarget, 0, 0, 0, layerIndex, image.width, image.height, 1, glFormat, glType, layerData);\n\t\t\t}\n\t\t\ttexture.layerUpdates.clear();\n\t\t} else {\n\t\t\tgl.texImage3D(glTarget, 0, glInternalFormat, image.width, image.height, image.depth, texture.border, glFormat, glType, image.data);\n\t\t}\n\t}\n\n}\n\nfunction textureNeedsPowerOfTwo(texture) {\n\treturn (texture.wrapS !== TEXTURE_WRAP.CLAMP_TO_EDGE || texture.wrapT !== TEXTURE_WRAP.CLAMP_TO_EDGE) ||\n\t\t(texture.minFilter !== TEXTURE_FILTER.NEAREST && texture.minFilter !== TEXTURE_FILTER.LINEAR);\n}\n\nfunction filterFallback(filter) {\n\tif (filter === TEXTURE_FILTER.NEAREST || filter === TEXTURE_FILTER.NEAREST_MIPMAP_LINEAR || filter === TEXTURE_FILTER.NEAREST_MIPMAP_NEAREST) {\n\t\treturn TEXTURE_FILTER.NEAREST;\n\t}\n\n\treturn TEXTURE_FILTER.LINEAR;\n}\n\nfunction _isPowerOfTwo(image) {\n\treturn MathUtils.isPowerOfTwo(image.width) && MathUtils.isPowerOfTwo(image.height);\n}\n\nlet _canvas;\nfunction makePowerOf2(image) {\n\tif (_canvas === undefined) _canvas = document.createElementNS('http://www.w3.org/1999/xhtml', 'canvas');\n\n\t_canvas.width = MathUtils.nearestPowerOfTwo(image.width);\n\t_canvas.height = MathUtils.nearestPowerOfTwo(image.height);\n\n\tconst context = _canvas.getContext('2d');\n\tcontext.drawImage(image, 0, 0, _canvas.width, _canvas.height);\n\n\tconsole.warn('image is not power of two (' + image.width + 'x' + image.height + '). Resized to ' + _canvas.width + 'x' + _canvas.height, image);\n\n\treturn _canvas;\n}\n\nfunction getGLInternalFormat(gl, capabilities, glFormat, glType) {\n\tconst isWebGL2 = capabilities.version >= 2;\n\n\tif (isWebGL2 === false) return glFormat;\n\n\tlet glInternalFormat = glFormat;\n\n\tif (glFormat === gl.RED) {\n\t\tif (glType === gl.FLOAT) glInternalFormat = gl.R32F;\n\t\tif (glType === gl.HALF_FLOAT) glInternalFormat = gl.R16F;\n\t\tif (glType === gl.UNSIGNED_BYTE) glInternalFormat = gl.R8;\n\t}\n\n\tif (glFormat === gl.RG) {\n\t\tif (glType === gl.FLOAT) glInternalFormat = gl.RG32F;\n\t\tif (glType === gl.HALF_FLOAT) glInternalFormat = gl.RG16F;\n\t\tif (glType === gl.UNSIGNED_BYTE) glInternalFormat = gl.RG8;\n\t}\n\n\tif (glFormat === gl.RGB) {\n\t\tif (glType === gl.FLOAT) glInternalFormat = gl.RGB32F;\n\t\tif (glType === gl.HALF_FLOAT) glInternalFormat = gl.RGB16F;\n\t\tif (glType === gl.UNSIGNED_BYTE) glInternalFormat = gl.RGB8;\n\t}\n\n\tif (glFormat === gl.RGBA) {\n\t\tif (glType === gl.FLOAT) glInternalFormat = gl.RGBA32F;\n\t\tif (glType === gl.HALF_FLOAT) glInternalFormat = gl.RGBA16F;\n\t\tif (glType === gl.UNSIGNED_BYTE) glInternalFormat = gl.RGBA8;\n\t\tif (glType === gl.UNSIGNED_SHORT_4_4_4_4) glInternalFormat = gl.RGBA4;\n\t\tif (glType === gl.UNSIGNED_SHORT_5_5_5_1) glInternalFormat = gl.RGB5_A1;\n\t}\n\n\tif (glFormat === gl.DEPTH_COMPONENT || glFormat === gl.DEPTH_STENCIL) {\n\t\tglInternalFormat = gl.DEPTH_COMPONENT16;\n\t\tif (glType === gl.FLOAT) glInternalFormat = gl.DEPTH_COMPONENT32F;\n\t\tif (glType === gl.UNSIGNED_INT) glInternalFormat = gl.DEPTH_COMPONENT24;\n\t\tif (glType === gl.UNSIGNED_INT_24_8) glInternalFormat = gl.DEPTH24_STENCIL8;\n\t\tif (glType === gl.FLOAT_32_UNSIGNED_INT_24_8_REV) glInternalFormat = gl.DEPTH32F_STENCIL8;\n\t}\n\n\tif (glInternalFormat === gl.R16F || glInternalFormat === gl.R32F ||\n\t\tglInternalFormat === gl.RG16F || glInternalFormat === gl.RG32F ||\n\t\tglInternalFormat === gl.RGB16F || glInternalFormat === gl.RGB32F ||\n\t\tglInternalFormat === gl.RGBA16F || glInternalFormat === gl.RGBA32F) {\n\t\tcapabilities.getExtension('EXT_color_buffer_float');\n\t}\n\n\treturn glInternalFormat;\n}\n\nfunction domCheck(image) {\n\treturn (typeof HTMLImageElement !== 'undefined' && image instanceof HTMLImageElement)\n\t\t|| (typeof HTMLCanvasElement !== 'undefined' && image instanceof HTMLCanvasElement)\n\t\t|| (typeof HTMLVideoElement !== 'undefined' && image instanceof HTMLVideoElement)\n\t\t|| (typeof ImageBitmap !== 'undefined' && image instanceof ImageBitmap);\n}\n\nfunction getByteLength(width, height, format, type) {\n\tconst typeByteLength = getTextureTypeByteLength(type);\n\n\tswitch (format) {\n\t\t// https://registry.khronos.org/OpenGL-Refpages/es3.0/html/glTexImage2D.xhtml\n\t\tcase PIXEL_FORMAT.ALPHA:\n\t\t\treturn width * height;\n\t\tcase PIXEL_FORMAT.LUMINANCE:\n\t\t\treturn width * height;\n\t\tcase PIXEL_FORMAT.LUMINANCE_ALPHA:\n\t\t\treturn width * height * 2;\n\t\tcase PIXEL_FORMAT.RED:\n\t\t\treturn ((width * height) / typeByteLength.components) * typeByteLength.byteLength;\n\t\tcase PIXEL_FORMAT.RED_INTEGER:\n\t\t\treturn ((width * height) / typeByteLength.components) * typeByteLength.byteLength;\n\t\tcase PIXEL_FORMAT.RG:\n\t\t\treturn ((width * height * 2) / typeByteLength.components) * typeByteLength.byteLength;\n\t\tcase PIXEL_FORMAT.RG_INTEGER:\n\t\t\treturn ((width * height * 2) / typeByteLength.components) * typeByteLength.byteLength;\n\t\tcase PIXEL_FORMAT.RGB:\n\t\t\treturn ((width * height * 3) / typeByteLength.components) * typeByteLength.byteLength;\n\t\tcase PIXEL_FORMAT.RGBA:\n\t\t\treturn ((width * height * 4) / typeByteLength.components) * typeByteLength.byteLength;\n\t\tcase PIXEL_FORMAT.RGBA_INTEGER:\n\t\t\treturn ((width * height * 4) / typeByteLength.components) * typeByteLength.byteLength;\n\n\t\t// https://registry.khronos.org/webgl/extensions/WEBGL_compressed_texture_s3tc_srgb/\n\t\tcase PIXEL_FORMAT.RGB_S3TC_DXT1:\n\t\tcase PIXEL_FORMAT.RGBA_S3TC_DXT1:\n\t\t\treturn Math.floor((width + 3) / 4) * Math.floor((height + 3) / 4) * 8;\n\t\tcase PIXEL_FORMAT.RGBA_S3TC_DXT3:\n\t\tcase PIXEL_FORMAT.RGBA_S3TC_DXT5:\n\t\t\treturn Math.floor((width + 3) / 4) * Math.floor((height + 3) / 4) * 16;\n\n\t\t// https://registry.khronos.org/webgl/extensions/WEBGL_compressed_texture_pvrtc/\n\t\tcase PIXEL_FORMAT.RGB_PVRTC_2BPPV1:\n\t\tcase PIXEL_FORMAT.RGBA_PVRTC_2BPPV1:\n\t\t\treturn (Math.max(width, 16) * Math.max(height, 8)) / 4;\n\t\tcase PIXEL_FORMAT.RGB_PVRTC_4BPPV1:\n\t\tcase PIXEL_FORMAT.RGBA_PVRTC_4BPPV1:\n\t\t\treturn (Math.max(width, 8) * Math.max(height, 8)) / 2;\n\n\t\t// https://registry.khronos.org/webgl/extensions/WEBGL_compressed_texture_etc/\n\t\tcase PIXEL_FORMAT.RGB_ETC1:\n\t\t\treturn Math.floor((width + 3) / 4) * Math.floor((height + 3) / 4) * 8;\n\t\t// https://registry.khronos.org/webgl/extensions/WEBGL_compressed_texture_astc/\n\t\tcase PIXEL_FORMAT.RGBA_ASTC_4x4:\n\t\t\treturn Math.floor((width + 3) / 4) * Math.floor((height + 3) / 4) * 16;\n\t\t// https://registry.khronos.org/webgl/extensions/EXT_texture_compression_bptc/\n\t\tcase PIXEL_FORMAT.RGBA_BPTC:\n\t\t\treturn Math.ceil(width / 4) * Math.ceil(height / 4) * 16;\n\t}\n\n\tthrow new Error(\n\t\t`Unable to determine texture byte length for ${format} format.`\n\t);\n}\n\nconst _tempTypeByteLength = { byteLength: 0, components: 0 };\nfunction getTextureTypeByteLength(type) {\n\tswitch (type) {\n\t\tcase PIXEL_TYPE.UNSIGNED_BYTE:\n\t\tcase PIXEL_TYPE.ByteType:\n\t\t\t_tempTypeByteLength.byteLength = 1;\n\t\t\t_tempTypeByteLength.components = 1;\n\t\t\treturn _tempTypeByteLength;\n\t\tcase PIXEL_TYPE.UNSIGNED_SHORT:\n\t\tcase PIXEL_TYPE.SHORT:\n\t\tcase PIXEL_TYPE.HALF_FLOAT:\n\t\t\t_tempTypeByteLength.byteLength = 2;\n\t\t\t_tempTypeByteLength.components = 1;\n\t\t\treturn _tempTypeByteLength;\n\t\tcase PIXEL_TYPE.UNSIGNED_SHORT_4_4_4_4:\n\t\tcase PIXEL_TYPE.UNSIGNED_SHORT_5_5_5_1:\n\t\t\t_tempTypeByteLength.byteLength = 2;\n\t\t\t_tempTypeByteLength.components = 4;\n\t\t\treturn _tempTypeByteLength;\n\t\tcase PIXEL_TYPE.UNSIGNED_INT:\n\t\tcase PIXEL_TYPE.INT:\n\t\tcase PIXEL_TYPE.FLOAT:\n\t\t\t_tempTypeByteLength.byteLength = 4;\n\t\t\t_tempTypeByteLength.components = 1;\n\t\t\treturn _tempTypeByteLength;\n\t}\n\tthrow new Error(`Unknown texture type ${type}.`);\n}\n\nfunction getTextureTarget(gl, texture) {\n\tif (texture.isTexture2D) {\n\t\treturn gl.TEXTURE_2D;\n\t} else if (texture.isTextureCube) {\n\t\treturn gl.TEXTURE_CUBE_MAP;\n\t} else if (texture.isTexture3D) {\n\t\treturn gl.TEXTURE_3D;\n\t} else if (texture.isTexture2DArray) {\n\t\treturn gl.TEXTURE_2D_ARRAY;\n\t} else {\n\t\treturn gl.TEXTURE_2D;\n\t}\n}\n\nclass WebGLRenderBuffers extends PropertyMap {\n\n\tconstructor(prefix, gl, capabilities, constants) {\n\t\tsuper(prefix);\n\n\t\tthis._gl = gl;\n\t\tthis._capabilities = capabilities;\n\t\tthis._constants = constants;\n\n\t\tconst that = this;\n\n\t\tfunction onRenderBufferDispose(event) {\n\t\t\tconst renderBuffer = event.target;\n\n\t\t\trenderBuffer.removeEventListener('dispose', onRenderBufferDispose);\n\n\t\t\tconst renderBufferProperties = that.get(renderBuffer);\n\n\t\t\tif (renderBufferProperties.__webglRenderbuffer && !renderBufferProperties.__external) {\n\t\t\t\tgl.deleteRenderbuffer(renderBufferProperties.__webglRenderbuffer);\n\t\t\t}\n\n\t\t\tthat.delete(renderBuffer);\n\t\t}\n\n\t\tthis._onRenderBufferDispose = onRenderBufferDispose;\n\t}\n\n\tsetRenderBuffer(renderBuffer) {\n\t\tconst gl = this._gl;\n\t\tconst capabilities = this._capabilities;\n\t\tconst constants = this._constants;\n\n\t\tconst renderBufferProperties = this.get(renderBuffer);\n\n\t\tif (renderBufferProperties.__webglRenderbuffer === undefined) {\n\t\t\trenderBuffer.addEventListener('dispose', this._onRenderBufferDispose);\n\n\t\t\trenderBufferProperties.__webglRenderbuffer = gl.createRenderbuffer();\n\n\t\t\tgl.bindRenderbuffer(gl.RENDERBUFFER, renderBufferProperties.__webglRenderbuffer);\n\n\t\t\tconst glFormat = constants.getGLInternalFormat(renderBuffer.format);\n\n\t\t\tif (renderBuffer.multipleSampling > 0) {\n\t\t\t\tif (capabilities.version < 2) {\n\t\t\t\t\tconsole.error('render buffer multipleSampling is not support in webgl 1.0.');\n\t\t\t\t}\n\t\t\t\tgl.renderbufferStorageMultisample(gl.RENDERBUFFER, Math.min(renderBuffer.multipleSampling, capabilities.maxSamples), glFormat, renderBuffer.width, renderBuffer.height);\n\t\t\t} else {\n\t\t\t\tgl.renderbufferStorage(gl.RENDERBUFFER, glFormat, renderBuffer.width, renderBuffer.height);\n\t\t\t}\n\t\t} else {\n\t\t\tgl.bindRenderbuffer(gl.RENDERBUFFER, renderBufferProperties.__webglRenderbuffer);\n\t\t}\n\n\t\treturn renderBufferProperties;\n\t}\n\n\tsetRenderBufferExternal(renderBuffer, webglRenderbuffer) {\n\t\tconst gl = this._gl;\n\n\t\tconst renderBufferProperties = this.get(renderBuffer);\n\n\t\tif (!renderBufferProperties.__external) {\n\t\t\tif (renderBufferProperties.__webglRenderbuffer) {\n\t\t\t\tgl.deleteRenderbuffer(renderBufferProperties.__webglRenderbuffer);\n\t\t\t} else {\n\t\t\t\trenderBuffer.addEventListener('dispose', this._onRenderBufferDispose);\n\t\t\t}\n\t\t}\n\n\t\trenderBufferProperties.__webglRenderbuffer = webglRenderbuffer;\n\t\trenderBufferProperties.__external = true;\n\t}\n\n}\n\nclass WebGLRenderTargets extends PropertyMap {\n\n\tconstructor(prefix, gl, state, capabilities, textures, renderBuffers, constants) {\n\t\tsuper(prefix);\n\n\t\tthis._gl = gl;\n\t\tthis._state = state;\n\t\tthis._capabilities = capabilities;\n\t\tthis._textures = textures;\n\t\tthis._renderBuffers = renderBuffers;\n\t\tthis._constants = constants;\n\n\t\tconst that = this;\n\n\t\tfunction onRenderTargetDispose(event) {\n\t\t\tconst renderTarget = event.target;\n\n\t\t\trenderTarget.removeEventListener('dispose', onRenderTargetDispose);\n\n\t\t\tconst renderTargetProperties = that.get(renderTarget);\n\n\t\t\tif (renderTargetProperties.__webglFramebuffer && !renderTargetProperties.__external) {\n\t\t\t\tgl.deleteFramebuffer(renderTargetProperties.__webglFramebuffer);\n\t\t\t}\n\n\t\t\tthat.delete(renderTarget);\n\n\t\t\tif (state.currentRenderTarget === renderTarget) {\n\t\t\t\tstate.currentRenderTarget = null;\n\t\t\t}\n\t\t}\n\n\t\tthis._onRenderTargetDispose = onRenderTargetDispose;\n\t}\n\n\t_setupRenderTarget(renderTarget) {\n\t\tconst gl = this._gl;\n\t\tconst state = this._state;\n\t\tconst textures = this._textures;\n\t\tconst renderBuffers = this._renderBuffers;\n\t\tconst capabilities = this._capabilities;\n\n\t\tconst renderTargetProperties = this.get(renderTarget);\n\n\t\trenderTarget.addEventListener('dispose', this._onRenderTargetDispose);\n\n\t\tconst glFrameBuffer = gl.createFramebuffer();\n\t\tconst drawBuffers = [];\n\n\t\trenderTargetProperties.__webglFramebuffer = glFrameBuffer;\n\t\trenderTargetProperties.__drawBuffers = drawBuffers;\n\t\trenderTargetProperties.__currentActiveMipmapLevel = renderTarget.activeMipmapLevel;\n\t\trenderTargetProperties.__currentActiveLayer = renderTarget.activeLayer;\n\n\t\tgl.bindFramebuffer(gl.FRAMEBUFFER, glFrameBuffer);\n\n\t\tfor (const attachTarget in renderTarget._attachments) {\n\t\t\tconst glAttachTarget = attachTargetToGL[attachTarget];\n\n\t\t\tif (glAttachTarget === gl.DEPTH_ATTACHMENT || glAttachTarget === gl.DEPTH_STENCIL_ATTACHMENT) {\n\t\t\t\tif (capabilities.version < 2 && !capabilities.getExtension('WEBGL_depth_texture')) {\n\t\t\t\t\tconsole.warn('WebGLRenderTargets: extension WEBGL_depth_texture is not support.');\n\t\t\t\t}\n\t\t\t} else if (glAttachTarget !== gl.STENCIL_ATTACHMENT) {\n\t\t\t\tdrawBuffers.push(glAttachTarget);\n\t\t\t}\n\n\t\t\tconst attachment = renderTarget._attachments[attachTarget];\n\n\t\t\tif (attachment.isTexture) {\n\t\t\t\tconst textureProperties = textures.setTexture(attachment);\n\t\t\t\tif (attachment.isTexture2D) {\n\t\t\t\t\tgl.framebufferTexture2D(gl.FRAMEBUFFER, glAttachTarget, gl.TEXTURE_2D, textureProperties.__webglTexture, renderTarget.activeMipmapLevel);\n\t\t\t\t} else if (attachment.isTextureCube) {\n\t\t\t\t\tgl.framebufferTexture2D(gl.FRAMEBUFFER, glAttachTarget, gl.TEXTURE_CUBE_MAP_POSITIVE_X + renderTarget.activeLayer, textureProperties.__webglTexture, renderTarget.activeMipmapLevel);\n\t\t\t\t} else if (attachment.isTexture3D || attachment.isTexture2DArray) {\n\t\t\t\t\tgl.framebufferTextureLayer(gl.FRAMEBUFFER, glAttachTarget, textureProperties.__webglTexture, renderTarget.activeMipmapLevel, renderTarget.activeLayer);\n\t\t\t\t}\n\t\t\t\tstate.bindTexture(textureProperties.__webglTarget, null);\n\t\t\t} else {\n\t\t\t\tconst renderBufferProperties = renderBuffers.setRenderBuffer(attachment);\n\t\t\t\tgl.framebufferRenderbuffer(gl.FRAMEBUFFER, glAttachTarget, gl.RENDERBUFFER, renderBufferProperties.__webglRenderbuffer);\n\t\t\t}\n\t\t}\n\n\t\tdrawBuffers.sort(drawBufferSort);\n\n\t\tif (capabilities.version >= 2) {\n\t\t\tgl.drawBuffers(drawBuffers);\n\t\t} else if (capabilities.getExtension('WEBGL_draw_buffers')) {\n\t\t\tcapabilities.getExtension('WEBGL_draw_buffers').drawBuffersWEBGL(drawBuffers);\n\t\t}\n\t}\n\n\tsetRenderTarget(renderTarget) {\n\t\tconst gl = this._gl;\n\t\tconst state = this._state;\n\t\tconst textures = this._textures;\n\n\t\tlet renderTargetProperties;\n\n\t\tif (state.currentRenderTarget !== renderTarget) {\n\t\t\tif (renderTarget.isScreenRenderTarget) {\n\t\t\t\tgl.bindFramebuffer(gl.FRAMEBUFFER, null);\n\t\t\t} else {\n\t\t\t\trenderTargetProperties = this.get(renderTarget);\n\n\t\t\t\tif (renderTargetProperties.__webglFramebuffer === undefined) {\n\t\t\t\t\tthis._setupRenderTarget(renderTarget);\n\t\t\t\t} else {\n\t\t\t\t\tgl.bindFramebuffer(gl.FRAMEBUFFER, renderTargetProperties.__webglFramebuffer);\n\t\t\t\t}\n\t\t\t}\n\t\t\tstate.currentRenderTarget = renderTarget;\n\t\t}\n\n\t\trenderTargetProperties = this.get(renderTarget);\n\n\t\tif (renderTargetProperties.__external) return;\n\n\t\tconst activeLayer = renderTarget.activeLayer;\n\t\tconst activeMipmapLevel = renderTarget.activeMipmapLevel;\n\t\tif (renderTargetProperties.__currentActiveLayer !== activeLayer || renderTargetProperties.__currentActiveMipmapLevel !== activeMipmapLevel) {\n\t\t\tfor (const attachTarget in renderTarget._attachments) {\n\t\t\t\tconst attachment = renderTarget._attachments[attachTarget];\n\n\t\t\t\tif (!attachment.isTexture) continue;\n\n\t\t\t\tconst textureProperties = textures.get(attachment);\n\n\t\t\t\tif (attachment.isTexture2D) {\n\t\t\t\t\tgl.framebufferTexture2D(gl.FRAMEBUFFER, attachTargetToGL[attachTarget], gl.TEXTURE_2D, textureProperties.__webglTexture, activeMipmapLevel);\n\t\t\t\t} else if (attachment.isTextureCube) {\n\t\t\t\t\tgl.framebufferTexture2D(gl.FRAMEBUFFER, attachTargetToGL[attachTarget], gl.TEXTURE_CUBE_MAP_POSITIVE_X + activeLayer, textureProperties.__webglTexture, activeMipmapLevel);\n\t\t\t\t} else if (attachment.isTexture3D || attachment.isTexture2DArray) {\n\t\t\t\t\tgl.framebufferTextureLayer(gl.FRAMEBUFFER, attachTargetToGL[attachTarget], textureProperties.__webglTexture, activeMipmapLevel, activeLayer);\n\t\t\t\t}\n\t\t\t}\n\t\t\trenderTargetProperties.__currentActiveLayer = activeLayer;\n\t\t\trenderTargetProperties.__currentActiveMipmapLevel = activeMipmapLevel;\n\t\t}\n\t}\n\n\tblitRenderTarget(read, draw, color = true, depth = true, stencil = true) {\n\t\tconst gl = this._gl;\n\t\tconst state = this._state;\n\t\tconst capabilities = this._capabilities;\n\n\t\tif (capabilities.version < 2) {\n\t\t\tconsole.warn('WebGLRenderTargets: blitFramebuffer not support by WebGL' + capabilities.version);\n\t\t\treturn;\n\t\t}\n\n\t\tlet needRestoreFramebuffer = false;\n\n\t\tlet readBuffer = this.get(read).__webglFramebuffer;\n\t\tif (!readBuffer) {\n\t\t\tthis._setupRenderTarget(read);\n\t\t\treadBuffer = this.get(read).__webglFramebuffer;\n\t\t\tneedRestoreFramebuffer = true;\n\t\t}\n\n\t\tlet drawBuffer = this.get(draw).__webglFramebuffer;\n\t\tif (!drawBuffer) {\n\t\t\tthis._setupRenderTarget(draw);\n\t\t\tdrawBuffer = this.get(draw).__webglFramebuffer;\n\t\t\tneedRestoreFramebuffer = true;\n\t\t}\n\n\t\tif (needRestoreFramebuffer) { // restore framebuffer binding\n\t\t\tconst framebuffer = (state.currentRenderTarget && !state.currentRenderTarget.isScreenRenderTarget) ?\n\t\t\t\tthis.get(state.currentRenderTarget).__webglFramebuffer : null;\n\t\t\tgl.bindFramebuffer(gl.FRAMEBUFFER, framebuffer);\n\t\t}\n\n\t\tgl.bindFramebuffer(gl.READ_FRAMEBUFFER, readBuffer);\n\t\tgl.bindFramebuffer(gl.DRAW_FRAMEBUFFER, drawBuffer);\n\n\t\tlet mask = 0;\n\t\tif (color) mask |= gl.COLOR_BUFFER_BIT;\n\t\tif (depth) mask |= gl.DEPTH_BUFFER_BIT;\n\t\tif (stencil) mask |= gl.STENCIL_BUFFER_BIT;\n\n\t\t// gl.clearBufferfv(gl.COLOR, 0, [0.0, 0.0, 0.0, 0.0]);\n\n\t\tgl.blitFramebuffer(\n\t\t\t0, 0, read.width, read.height,\n\t\t\t0, 0, draw.width, draw.height,\n\t\t\tmask, gl.NEAREST\n\t\t);\n\t}\n\n\tsetFramebufferExternal(renderTarget, webglFramebuffer) {\n\t\tconst renderTargetProperties = this.get(renderTarget);\n\n\t\tif (!renderTargetProperties.__external) {\n\t\t\tif (renderTargetProperties.__webglFramebuffer) {\n\t\t\t\tthis._gl.deleteFramebuffer(renderTargetProperties.__webglFramebuffer);\n\t\t\t} else {\n\t\t\t\trenderTarget.addEventListener('dispose', this._onRenderTargetDispose);\n\t\t\t}\n\t\t}\n\n\t\trenderTargetProperties.__webglFramebuffer = webglFramebuffer;\n\t\trenderTargetProperties.__external = true;\n\t}\n\n}\n\nconst attachTargetToGL = {\n\t[ATTACHMENT.COLOR_ATTACHMENT0]: 0x8CE0,\n\t[ATTACHMENT.COLOR_ATTACHMENT1]: 0x8CE1,\n\t[ATTACHMENT.COLOR_ATTACHMENT2]: 0x8CE2,\n\t[ATTACHMENT.COLOR_ATTACHMENT3]: 0x8CE3,\n\t[ATTACHMENT.COLOR_ATTACHMENT4]: 0x8CE4,\n\t[ATTACHMENT.COLOR_ATTACHMENT5]: 0x8CE5,\n\t[ATTACHMENT.COLOR_ATTACHMENT6]: 0x8CE6,\n\t[ATTACHMENT.COLOR_ATTACHMENT7]: 0x8CE7,\n\t[ATTACHMENT.COLOR_ATTACHMENT8]: 0x8CE8,\n\t[ATTACHMENT.COLOR_ATTACHMENT9]: 0x8CE9,\n\t[ATTACHMENT.COLOR_ATTACHMENT10]: 0x8CEA,\n\t[ATTACHMENT.COLOR_ATTACHMENT11]: 0x8CEB,\n\t[ATTACHMENT.COLOR_ATTACHMENT12]: 0x8CEC,\n\t[ATTACHMENT.COLOR_ATTACHMENT13]: 0x8CED,\n\t[ATTACHMENT.COLOR_ATTACHMENT14]: 0x8CEE,\n\t[ATTACHMENT.COLOR_ATTACHMENT15]: 0x8CEF,\n\t[ATTACHMENT.DEPTH_ATTACHMENT]: 0x8D00,\n\t[ATTACHMENT.STENCIL_ATTACHMENT]: 0x8D20,\n\t[ATTACHMENT.DEPTH_STENCIL_ATTACHMENT]: 0x821A\n};\n\nfunction drawBufferSort(a, b) {\n\treturn a - b;\n}\n\nclass WebGLBuffers extends PropertyMap {\n\n\tconstructor(prefix, gl, capabilities) {\n\t\tsuper(prefix);\n\n\t\tthis._gl = gl;\n\t\tthis._capabilities = capabilities;\n\t}\n\n\tsetBuffer(buffer, bufferType, vertexArrayBindings) {\n\t\tconst bufferProperties = this.get(buffer);\n\n\t\tconst needCreate = bufferProperties.glBuffer === undefined;\n\n\t\tif (!needCreate && bufferProperties.version === buffer.version) return;\n\n\t\t// Avoid polluting the binding state\n\t\tif (vertexArrayBindings) {\n\t\t\tvertexArrayBindings.reset();\n\t\t}\n\n\t\tif (needCreate || bufferProperties.__external) {\n\t\t\t// Because Buffer does not have a dispose interface at present,\n\t\t\t// when the version increases, the external is automatically closed\n\t\t\tthis._createGLBuffer(bufferProperties, buffer, bufferType);\n\t\t} else {\n\t\t\tthis._updateGLBuffer(bufferProperties.glBuffer, buffer, bufferType);\n\t\t\tbufferProperties.version = buffer.version;\n\t\t}\n\t}\n\n\tremoveBuffer(buffer) {\n\t\tconst gl = this._gl;\n\n\t\tconst bufferProperties = this.get(buffer);\n\n\t\tif (bufferProperties.glBuffer && !bufferProperties.__external) {\n\t\t\tgl.deleteBuffer(bufferProperties.glBuffer);\n\t\t}\n\n\t\tthis.delete(buffer);\n\t}\n\n\tsetBufferExternal(buffer, webglBuffer) {\n\t\tconst gl = this._gl;\n\n\t\tconst bufferProperties = this.get(buffer);\n\n\t\tif (!bufferProperties.__external) {\n\t\t\tif (bufferProperties.glBuffer) {\n\t\t\t\tgl.deleteBuffer(bufferProperties.glBuffer);\n\t\t\t}\n\t\t}\n\n\t\tconst type = getBufferType(gl, buffer.array);\n\n\t\tbufferProperties.glBuffer = webglBuffer;\n\t\tbufferProperties.type = type;\n\t\tbufferProperties.bytesPerElement = buffer.array.BYTES_PER_ELEMENT;\n\t\tbufferProperties.version = buffer.version;\n\n\t\tbufferProperties.__external = true;\n\t}\n\n\t_createGLBuffer(bufferProperties, buffer, bufferType) {\n\t\tconst gl = this._gl;\n\n\t\tconst array = buffer.array;\n\t\tconst usage = buffer.usage;\n\n\t\tconst glBuffer = gl.createBuffer();\n\n\t\tgl.bindBuffer(bufferType, glBuffer);\n\t\tgl.bufferData(bufferType, array, usage);\n\n\t\tbuffer.onUploadCallback();\n\n\t\tconst type = getBufferType(gl, array);\n\n\t\tbufferProperties.glBuffer = glBuffer;\n\t\tbufferProperties.type = type;\n\t\tbufferProperties.bytesPerElement = array.BYTES_PER_ELEMENT;\n\t\tbufferProperties.version = buffer.version;\n\n\t\tbufferProperties.__external = false;\n\n\t\tbuffer.updateRange.count = -1; // reset range\n\t}\n\n\t_updateGLBuffer(glBuffer, buffer, bufferType) {\n\t\tconst gl = this._gl;\n\t\tconst capabilities = this._capabilities;\n\n\t\tconst array = buffer.array;\n\t\tconst updateRange = buffer.updateRange;\n\n\t\tgl.bindBuffer(bufferType, glBuffer);\n\n\t\tif (updateRange.count === -1) {\n\t\t\t// Not using update ranges\n\t\t\tgl.bufferSubData(bufferType, 0, array);\n\t\t} else {\n\t\t\tif (capabilities.version >= 2) {\n\t\t\t\tgl.bufferSubData(bufferType, updateRange.offset * array.BYTES_PER_ELEMENT,\n\t\t\t\t\tarray, updateRange.offset, updateRange.count);\n\t\t\t} else {\n\t\t\t\tgl.bufferSubData(bufferType, updateRange.offset * array.BYTES_PER_ELEMENT,\n\t\t\t\t\tarray.subarray(updateRange.offset, updateRange.offset + updateRange.count));\n\t\t\t}\n\n\t\t\tupdateRange.count = -1; // reset range\n\t\t}\n\t}\n\n}\n\nfunction getBufferType(gl, array) {\n\tlet type;\n\n\tif (array instanceof Float32Array) {\n\t\ttype = gl.FLOAT;\n\t} else if (array instanceof Float64Array) {\n\t\tconsole.warn('Unsupported data buffer format: Float64Array.');\n\t} else if (array instanceof Uint16Array) {\n\t\ttype = gl.UNSIGNED_SHORT;\n\t} else if (array instanceof Int16Array) {\n\t\ttype = gl.SHORT;\n\t} else if (array instanceof Uint32Array) {\n\t\ttype = gl.UNSIGNED_INT;\n\t} else if (array instanceof Int32Array) {\n\t\ttype = gl.INT;\n\t} else if (array instanceof Int8Array) {\n\t\ttype = gl.BYTE;\n\t} else if (array instanceof Uint8Array) {\n\t\ttype = gl.UNSIGNED_BYTE;\n\t} else {\n\t\ttype = gl.FLOAT;\n\t}\n\n\treturn type;\n}\n\nclass WebGLMaterials extends PropertyMap {\n\n\tconstructor(prefix, programs, vertexArrayBindings) {\n\t\tsuper(prefix);\n\n\t\tconst that = this;\n\n\t\tfunction onMaterialDispose(event) {\n\t\t\tconst material = event.target;\n\t\t\tconst materialProperties = that.get(material);\n\n\t\t\tmaterial.removeEventListener('dispose', onMaterialDispose);\n\n\t\t\tconst programList = materialProperties.programList;\n\n\t\t\tif (programList !== undefined) {\n\t\t\t\tfor (let i = 0, l = programList.length; i < l; i++) {\n\t\t\t\t\tconst program = programList[i];\n\n\t\t\t\t\tvertexArrayBindings.releaseByProgram(program);\n\t\t\t\t\tprograms.releaseProgram(program);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthat.delete(material);\n\t\t}\n\n\t\tthis._onMaterialDispose = onMaterialDispose;\n\n\t\tthis._programs = programs;\n\t\tthis._vertexArrayBindings = vertexArrayBindings;\n\t}\n\n\tsetMaterial(material) {\n\t\tconst materialProperties = this.get(material);\n\n\t\tif (materialProperties.programList === undefined) {\n\t\t\tmaterial.addEventListener('dispose', this._onMaterialDispose);\n\n\t\t\tmaterialProperties.programList = [];\n\t\t}\n\n\t\t// Set other material properties in renderer\n\n\t\treturn materialProperties;\n\t}\n\n\tupdateProgram(material, object, lightingState, renderStates, shaderCompileOptions) {\n\t\tconst programs = this._programs;\n\t\tconst vertexArrayBindings = this._vertexArrayBindings;\n\n\t\tconst materialProperties = this.get(material);\n\n\t\tconst props = programs.generateProps(material, object, lightingState, renderStates);\n\t\tconst programCode = programs.generateProgramCode(props, material);\n\n\t\tconst programList = materialProperties.programList;\n\n\t\tlet targetProgram = findProgram(programList, programCode);\n\n\t\tif (targetProgram === null) {\n\t\t\ttargetProgram = programs.getProgram(material, props, programCode, shaderCompileOptions);\n\t\t\tprogramList.unshift(targetProgram);\n\n\t\t\tif (programList.length > shaderCompileOptions.maxMaterialPrograms) {\n\t\t\t\t// release the last program\n\t\t\t\tconst lastProgram = programList.pop();\n\t\t\t\tvertexArrayBindings.releaseByProgram(lastProgram);\n\t\t\t\tprograms.releaseProgram(lastProgram);\n\t\t\t}\n\t\t}\n\n\t\tmaterialProperties.currentProgram = targetProgram;\n\t}\n\n}\n\nfunction findProgram(list, code) {\n\tlet index = 0, target = null;\n\n\tfor (let l = list.length; index < l; index++) {\n\t\tconst program = list[index];\n\n\t\tif (program.code === code) {\n\t\t\ttarget = program;\n\t\t\tbreak;\n\t\t}\n\t}\n\n\t// move to the first\n\tif (target !== null && index > 0) {\n\t\tfor (let i = index; i > 0; i--) {\n\t\t\tlist[i] = list[i - 1];\n\t\t}\n\t\tlist[0] = target;\n\t}\n\n\treturn target;\n}\n\nconst emptyString = '';\n\nclass WebGLVertexArrayBindings extends PropertyMap {\n\n\tconstructor(prefix, gl, capabilities, buffers) {\n\t\tsuper(prefix);\n\n\t\tthis._gl = gl;\n\t\tthis._capabilities = capabilities;\n\t\tthis._buffers = buffers;\n\n\t\tthis._isWebGL2 = capabilities.version >= 2;\n\t\tthis._vaoExt = capabilities.getExtension('OES_vertex_array_object');\n\n\t\tthis._vaoCache = {}; // save vao cache here for releaseByProgram() method\n\t\tthis._currentGeometryProgram = '';\n\t\tthis._currentVAO = null;\n\t}\n\n\tsetup(object, geometry, program) {\n\t\tif (object.morphTargetInfluences) {\n\t\t\tthis.reset();\n\t\t\tthis._setupVertexAttributes(program, geometry);\n\t\t\tthis._currentGeometryProgram = emptyString;\n\t\t} else if (this._isWebGL2 || this._vaoExt) { // use VAO\n\t\t\tconst geometryProperties = this.get(geometry);\n\n\t\t\tif (geometryProperties._vaos === undefined) {\n\t\t\t\tgeometryProperties._vaos = {};\n\t\t\t\tthis._vaoCache[geometry.id] = geometryProperties._vaos;\n\t\t\t}\n\n\t\t\tlet vao = geometryProperties._vaos[program.id];\n\t\t\tif (!vao) {\n\t\t\t\tvao = geometryProperties._vaos[program.id] = { version: -1, object: this._createVAO() };\n\t\t\t}\n\n\t\t\tthis._bindVAO(vao.object);\n\n\t\t\tif (vao.version !== geometry.version) {\n\t\t\t\tthis._setupVertexAttributes(program, geometry);\n\t\t\t\tvao.version = geometry.version;\n\t\t\t}\n\t\t} else {\n\t\t\tconst geometryProgram = program.id + '_' + geometry.id + '_' + geometry.version;\n\t\t\tif (geometryProgram !== this._currentGeometryProgram) {\n\t\t\t\tthis._setupVertexAttributes(program, geometry);\n\t\t\t\tthis._currentGeometryProgram = geometryProgram;\n\t\t\t}\n\t\t}\n\t}\n\n\treleaseByGeometry(geometry) {\n\t\tconst geometryProperties = this.get(geometry);\n\n\t\tconst vaos = geometryProperties._vaos;\n\t\tif (vaos) {\n\t\t\tfor (const programId in vaos) {\n\t\t\t\tconst vao = vaos[programId];\n\t\t\t\tif (!vao) continue;\n\t\t\t\tthis._disposeVAO(vao.object);\n\t\t\t}\n\n\t\t\tdelete geometryProperties._vaos;\n\t\t\tdelete this._vaoCache[geometry.id];\n\t\t}\n\t}\n\n\treleaseByProgram(program) {\n\t\tfor (const geometryId in this._vaoCache) {\n\t\t\tconst vaos = this._vaoCache[geometryId];\n\t\t\tif (vaos) {\n\t\t\t\tconst vao = vaos[program.id];\n\t\t\t\tif (!vao) continue;\n\t\t\t\tthis._disposeVAO(vao.object);\n\t\t\t\tdelete vaos[program.id];\n\t\t\t}\n\t\t}\n\t}\n\n\treset(force) {\n\t\tif (this._currentVAO !== null || force) {\n\t\t\tif (this._isWebGL2) {\n\t\t\t\tthis._gl.bindVertexArray(null);\n\t\t\t} else if (this._vaoExt) {\n\t\t\t\tthis._vaoExt.bindVertexArrayOES(null);\n\t\t\t}\n\n\t\t\tthis._currentVAO = null;\n\t\t}\n\n\t\tif (this._currentGeometryProgram !== emptyString) {\n\t\t\tthis._currentGeometryProgram = emptyString;\n\t\t}\n\t}\n\n\t_createVAO() {\n\t\tif (this._isWebGL2) {\n\t\t\treturn this._gl.createVertexArray();\n\t\t} else if (this._vaoExt) {\n\t\t\treturn this._vaoExt.createVertexArrayOES();\n\t\t}\n\t\treturn null;\n\t}\n\n\t_bindVAO(vao) {\n\t\tif (this._currentVAO !== vao) {\n\t\t\tif (this._isWebGL2) {\n\t\t\t\tthis._gl.bindVertexArray(vao);\n\t\t\t} else if (this._vaoExt) {\n\t\t\t\tthis._vaoExt.bindVertexArrayOES(vao);\n\t\t\t}\n\n\t\t\tthis._currentVAO = vao;\n\t\t}\n\t}\n\n\t_disposeVAO(vao) {\n\t\tif (this._isWebGL2) {\n\t\t\tthis._gl.deleteVertexArray(vao);\n\t\t} else if (this._vaoExt) {\n\t\t\tthis._vaoExt.deleteVertexArrayOES(vao);\n\t\t}\n\t}\n\n\t_setupVertexAttributes(program, geometry) {\n\t\tconst gl = this._gl;\n\t\tconst isWebGL2 = this._isWebGL2;\n\t\tconst attributes = program.getAttributes();\n\t\tconst capabilities = this._capabilities;\n\t\tconst buffers = this._buffers;\n\n\t\tfor (const key in attributes) {\n\t\t\tconst programAttribute = attributes[key];\n\t\t\tconst geometryAttribute = geometry.getAttribute(key);\n\t\t\tif (geometryAttribute) {\n\t\t\t\tconst size = geometryAttribute.size;\n\n\t\t\t\tif (programAttribute.count !== size) {\n\t\t\t\t\tconsole.warn('WebGLVertexArrayBindings: attribute ' + key + ' size not match! ' + programAttribute.count + ' : ' + size);\n\t\t\t\t}\n\n\t\t\t\tconst buffer = geometryAttribute.buffer;\n\t\t\t\tconst bufferProperties = buffers.get(buffer);\n\n\t\t\t\tconst type = bufferProperties.type;\n\n\t\t\t\tconst integer = isWebGL2 && (programAttribute.format === gl.INT || programAttribute.format === gl.UNSIGNED_INT);\n\n\t\t\t\tfor (let i = 0, l = programAttribute.locationSize; i < l; i++) {\n\t\t\t\t\tgl.enableVertexAttribArray(programAttribute.location + i);\n\t\t\t\t}\n\n\t\t\t\tif (geometryAttribute.divisor > 0) { // use instancing\n\t\t\t\t\tfor (let i = 0, l = programAttribute.locationSize; i < l; i++) {\n\t\t\t\t\t\tif (isWebGL2) {\n\t\t\t\t\t\t\tgl.vertexAttribDivisor(programAttribute.location + i, geometryAttribute.divisor);\n\t\t\t\t\t\t} else if (capabilities.getExtension('ANGLE_instanced_arrays')) {\n\t\t\t\t\t\t\tcapabilities.getExtension('ANGLE_instanced_arrays').vertexAttribDivisorANGLE(programAttribute.location + i, geometryAttribute.divisor);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tconsole.warn('vertexAttribDivisor not supported');\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tconst bytesPerElement = bufferProperties.bytesPerElement;\n\t\t\t\tconst glBuffer = bufferProperties.glBuffer;\n\t\t\t\tconst stride = buffer.stride;\n\t\t\t\tconst offset = geometryAttribute.offset;\n\t\t\t\tconst normalized = geometryAttribute.normalized;\n\n\t\t\t\tgl.bindBuffer(gl.ARRAY_BUFFER, glBuffer);\n\n\t\t\t\tif (programAttribute.count === stride && programAttribute.locationSize === 1) {\n\t\t\t\t\tthis._vertexAttribPointer(programAttribute.location, programAttribute.count, type, normalized, 0, 0, integer);\n\t\t\t\t} else {\n\t\t\t\t\tfor (let i = 0; i < programAttribute.locationSize; i++) {\n\t\t\t\t\t\tthis._vertexAttribPointer(\n\t\t\t\t\t\t\tprogramAttribute.location + i,\n\t\t\t\t\t\t\tprogramAttribute.count / programAttribute.locationSize,\n\t\t\t\t\t\t\ttype,\n\t\t\t\t\t\t\tnormalized,\n\t\t\t\t\t\t\tbytesPerElement * stride,\n\t\t\t\t\t\t\tbytesPerElement * (offset + (programAttribute.count / programAttribute.locationSize) * i),\n\t\t\t\t\t\t\tinteger\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// bind index if could\n\t\tif (geometry.index) {\n\t\t\tconst indexBufferProperties = buffers.get(geometry.index.buffer);\n\t\t\tgl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, indexBufferProperties.glBuffer);\n\t\t}\n\t}\n\n\t_vertexAttribPointer(index, size, type, normalized, stride, offset, integer) {\n\t\tconst gl = this._gl;\n\t\tif (integer) {\n\t\t\tgl.vertexAttribIPointer(index, size, type, stride, offset);\n\t\t} else {\n\t\t\tgl.vertexAttribPointer(index, size, type, normalized, stride, offset);\n\t\t}\n\t}\n\n}\n\nclass WebGLClusteredLighting {\n\n\tconstructor(options) {\n\t\tthis.lightsTexture = new LightsTexture();\n\t\tthis.lightsTexture.initLights(options.maxClusterLights, options.useFloatPrecision ? PIXEL_TYPE.FLOAT : PIXEL_TYPE.HALF_FLOAT);\n\n\t\tthis.cellsTexture = new CellsTexture();\n\t\tthis.cellsTexture.initCells(options.gridDimensions, options.maxLightsPerCell);\n\n\t\tthis._zClip = options.zClip.clone();\n\n\t\tthis._cellsTextureEmpty = false;\n\n\t\tthis.cellsTransform = {\n\t\t\tclips: [0, 0], // near, far\n\t\t\tfactors: [0, 0, 0, 0], // logFactor1, logFactor2, persp:tan(fov/2)|ortho:-height/2, aspect\n\t\t\tperspective: true\n\t\t};\n\t}\n\n\tdispose() {\n\t\tthis._cellsTextureEmpty = false;\n\t\tthis.cellsTexture.dispose();\n\t\tthis.lightsTexture.dispose();\n\t}\n\n\tsetOptions(options) {\n\t\tthis.lightsTexture.updateLights(options.maxClusterLights, options.useFloatPrecision ? PIXEL_TYPE.FLOAT : PIXEL_TYPE.HALF_FLOAT);\n\t\tthis.cellsTexture.updateCells(options.gridDimensions, options.maxLightsPerCell);\n\t\tthis._zClip.copy(options.zClip);\n\t}\n\n\tupdate(lightingGroup, cameraData, lightsNeedsUpdate = true) {\n\t\tthis._updateCellsTransform(cameraData);\n\n\t\tthis.cellsTexture.resetLightIndices();\n\n\t\tconst cellsTable = this.cellsTexture.cellsInfo.table;\n\t\tconst cellsTransform = this.cellsTransform;\n\n\t\tlet lightIndicesWritten = false;\n\n\t\tfor (let i = 0; i < lightingGroup.pointsNum; i++) {\n\t\t\tconst pointLight = lightingGroup.point[i];\n\n\t\t\tgetPointLightBoundingSphere(pointLight, _lightSphere);\n\t\t\t_lightSphere.center.applyMatrix4(cameraData.viewMatrix);\n\t\t\t_lightSphere.center.z *= -1;\n\n\t\t\tif (getCellsRange(_lightSphere, cellsTable, cellsTransform, _cellsRange)) {\n\t\t\t\tlightIndicesWritten = this.cellsTexture.setLightIndex(_cellsRange, i) || lightIndicesWritten;\n\t\t\t\tlightsNeedsUpdate && this.lightsTexture.setPointLight(i, pointLight);\n\t\t\t}\n\t\t}\n\n\t\tfor (let i = 0; i < lightingGroup.spotsNum; i++) {\n\t\t\tconst spotLight = lightingGroup.spot[i];\n\n\t\t\tgetSpotLightBoundingSphere(spotLight, _lightSphere);\n\t\t\t_lightSphere.center.applyMatrix4(cameraData.viewMatrix);\n\t\t\t_lightSphere.center.z *= -1;\n\n\t\t\tif (getCellsRange(_lightSphere, cellsTable, cellsTransform, _cellsRange)) {\n\t\t\t\tlightIndicesWritten = this.cellsTexture.setLightIndex(_cellsRange, i + lightingGroup.pointsNum) || lightIndicesWritten;\n\t\t\t\tlightsNeedsUpdate && this.lightsTexture.setSpotLight(i + lightingGroup.pointsNum, spotLight);\n\t\t\t}\n\t\t}\n\n\t\t(lightIndicesWritten && lightsNeedsUpdate) && this.lightsTexture.version++;\n\n\t\t(lightIndicesWritten || !this._cellsTextureEmpty) && this.cellsTexture.version++;\n\t\tthis._cellsTextureEmpty = !lightIndicesWritten;\n\t}\n\n\t_updateCellsTransform(cameraData) {\n\t\tconst { clips, factors } = this.cellsTransform;\n\n\t\tthis._zClip.toArray(clips);\n\t\tclips[0] = clips[0] > 0 ? clips[0] : cameraData.near;\n\t\tclips[1] = clips[1] > 0 ? clips[1] : cameraData.far;\n\n\t\tconst cz = this.cellsTexture.cellsInfo.table[2];\n\n\t\tconst _logFarNear = Math.log(clips[1] / clips[0]);\n\t\tfactors[0] = cz / _logFarNear;\n\t\tfactors[1] = -cz * Math.log(clips[0]) / _logFarNear;\n\n\t\tconst perspective = _isPerspectiveMatrix(cameraData.projectionMatrix);\n\t\tconst elements = cameraData.projectionMatrix.elements;\n\n\t\tfactors[2] = (perspective ? 1 : -1) / elements[5]; // persp: tan(fov / 2), ortho: -height / 2\n\t\tfactors[3] = elements[5] / elements[0]; // aspect: (width / height)\n\n\t\tthis.cellsTransform.perspective = perspective;\n\t}\n\n}\n\nclass CellsTexture extends Texture2D {\n\n\tconstructor() {\n\t\tsuper();\n\n\t\tthis.format = PIXEL_FORMAT.RED;\n\t\tthis.type = PIXEL_TYPE.HALF_FLOAT;\n\t\tthis.magFilter = TEXTURE_FILTER.NEAREST;\n\t\tthis.minFilter = TEXTURE_FILTER.NEAREST;\n\t\tthis.generateMipmaps = false;\n\t\tthis.flipY = false;\n\n\t\tthis.unpackAlignment = 1;\n\n\t\tthis.cellsInfo = {\n\t\t\ttable: [],\n\t\t\tmaxLightsPerCell: 0,\n\t\t\ttextureSize: [],\n\t\t\tdotData: []\n\t\t};\n\n\t\tthis._counts = null;\n\t}\n\n\tinitCells(cellTable, maxLightsPerCell) {\n\t\tconst numCells = cellTable.x * cellTable.y * cellTable.z;\n\t\tconst numPixels = numCells * maxLightsPerCell;\n\n\t\t// TODO - better texture size calculation\n\t\tlet width = Math.ceil(Math.sqrt(numPixels));\n\t\twidth = Math.ceil(width / maxLightsPerCell) * maxLightsPerCell;\n\t\tconst height = Math.ceil(numPixels / width);\n\n\t\tconst data = new Uint16Array(width * height);\n\n\t\tthis.image = { data, width, height };\n\n\t\tcellTable.toArray(this.cellsInfo.table);\n\n\t\tthis.cellsInfo.maxLightsPerCell = maxLightsPerCell;\n\n\t\tthis.cellsInfo.textureSize[0] = width;\n\t\tthis.cellsInfo.textureSize[1] = 1 / width;\n\t\tthis.cellsInfo.textureSize[2] = 1 / height;\n\n\t\tthis.cellsInfo.dotData[0] = maxLightsPerCell;\n\t\tthis.cellsInfo.dotData[1] = cellTable.x * cellTable.z * maxLightsPerCell;\n\t\tthis.cellsInfo.dotData[2] = cellTable.x * maxLightsPerCell;\n\n\t\tthis._counts = new Int32Array(numCells);\n\t}\n\n\tupdateCells(cellTable, maxLightsPerCell) {\n\t\tconst cellsInfo = this.cellsInfo;\n\t\tif (_vec3_1.fromArray(cellsInfo.table).equals(cellTable) && cellsInfo.maxLightsPerCell === maxLightsPerCell) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.dispose();\n\t\tthis.initCells(cellTable, maxLightsPerCell);\n\t\tthis.version++;\n\t}\n\n\tresetLightIndices() {\n\t\tthis.image.data.fill(0);\n\t\tthis._counts.fill(0);\n\t}\n\n\tsetLightIndex(cellsRange, index) {\n\t\tconst data = this.image.data;\n\t\tconst counts = this._counts;\n\t\tconst { table, maxLightsPerCell } = this.cellsInfo;\n\t\tconst { min, max } = cellsRange;\n\n\t\tlet needsUpdate = false;\n\n\t\tfor (let x = min.x; x <= max.x; x++) {\n\t\t\tfor (let z = min.z; z <= max.z; z++) {\n\t\t\t\tfor (let y = min.y; y <= max.y; y++) {\n\t\t\t\t\tconst idx = x + table[0] * (z + y * table[2]);\n\t\t\t\t\tconst count = counts[idx];\n\t\t\t\t\tif (count < maxLightsPerCell) {\n\t\t\t\t\t\tconst offset = idx * maxLightsPerCell + count;\n\t\t\t\t\t\tdata[offset] = MathUtils.toHalfFloat(index + 1); // 0 is reserved for empty cell, so we offset by 1\n\t\t\t\t\t\tcounts[idx]++;\n\t\t\t\t\t\tneedsUpdate = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn needsUpdate;\n\t}\n\n}\n\nclass LightsTexture extends Texture2D {\n\n\tconstructor() {\n\t\tsuper();\n\n\t\tthis.format = PIXEL_FORMAT.RGBA;\n\t\tthis.magFilter = TEXTURE_FILTER.NEAREST;\n\t\tthis.minFilter = TEXTURE_FILTER.NEAREST;\n\t\tthis.generateMipmaps = false;\n\t\tthis.flipY = false;\n\t}\n\n\tinitLights(maxLights, type) {\n\t\tconst size = lightsTextureSize(maxLights);\n\t\tconst arrayType = type === PIXEL_TYPE.FLOAT ? Float32Array : Uint16Array;\n\t\tconst data = new arrayType(size * size * 4); // eslint-disable-line new-cap\n\n\t\tthis.image = { data, width: size, height: size };\n\t\tthis.type = type;\n\t}\n\n\tupdateLights(maxLights, type) {\n\t\tconst size = lightsTextureSize(maxLights);\n\t\tif (size === this.image.width && type === this.type) return;\n\n\t\tthis.dispose();\n\t\tthis.initLights(maxLights, type);\n\t\tthis.version++;\n\t}\n\n\tsetPointLight(index, lightInfo) {\n\t\tconst data = this.image.data;\n\t\tconst halfFloat = this.type === PIXEL_TYPE.HALF_FLOAT;\n\n\t\tconst start = index * LIGHT_STRIDE * 4;\n\t\tconst { color, decay, position, distance } = lightInfo;\n\n\t\t// pixel 0 - R: lightType, G: -, B: -, A: -\n\n\t\tdata[start + 0 * 4 + 0] = halfFloat ? MathUtils.toHalfFloat(1) : 1;\n\n\t\t// pixel 1 - R: color.r, G: color.g, B: color.b, A: decay\n\n\t\tdata[start + 1 * 4 + 0] = halfFloat ? MathUtils.toHalfFloat(color[0]) : color[0];\n\t\tdata[start + 1 * 4 + 1] = halfFloat ? MathUtils.toHalfFloat(color[1]) : color[1];\n\t\tdata[start + 1 * 4 + 2] = halfFloat ? MathUtils.toHalfFloat(color[2]) : color[2];\n\t\tdata[start + 1 * 4 + 3] = halfFloat ? MathUtils.toHalfFloat(decay) : decay;\n\n\t\t// pixel 2 - R: position.x, G: position.y, B: position.z, A: distance\n\n\t\tdata[start + 2 * 4 + 0] = halfFloat ? MathUtils.toHalfFloat(position[0]) : position[0];\n\t\tdata[start + 2 * 4 + 1] = halfFloat ? MathUtils.toHalfFloat(position[1]) : position[1];\n\t\tdata[start + 2 * 4 + 2] = halfFloat ? MathUtils.toHalfFloat(position[2]) : position[2];\n\t\tdata[start + 2 * 4 + 3] = halfFloat ? MathUtils.toHalfFloat(distance) : distance;\n\n\t\t// pixel 3 - R: -, G: -, B: -, A: -\n\t}\n\n\tsetSpotLight(index, lightInfo) {\n\t\tconst data = this.image.data;\n\t\tconst halfFloat = this.type === PIXEL_TYPE.HALF_FLOAT;\n\n\t\tconst start = index * LIGHT_STRIDE * 4;\n\t\tconst { color, decay, position, distance, direction, coneCos, penumbraCos } = lightInfo;\n\n\t\t// pixel 0 - R: lightType, G: penumbraCos, B: -, A: -\n\n\t\tdata[start + 0 * 4 + 0] = halfFloat ? MathUtils.toHalfFloat(2) : 2;\n\t\tdata[start + 0 * 4 + 1] = halfFloat ? MathUtils.toHalfFloat(penumbraCos) : penumbraCos;\n\n\t\t// pixel 1 - R: color.r, G: color.g, B: color.b, A: decay\n\n\t\tdata[start + 1 * 4 + 0] = halfFloat ? MathUtils.toHalfFloat(color[0]) : color[0];\n\t\tdata[start + 1 * 4 + 1] = halfFloat ? MathUtils.toHalfFloat(color[1]) : color[1];\n\t\tdata[start + 1 * 4 + 2] = halfFloat ? MathUtils.toHalfFloat(color[2]) : color[2];\n\t\tdata[start + 1 * 4 + 3] = halfFloat ? MathUtils.toHalfFloat(decay) : decay;\n\n\t\t// pixel 2 - R: position.x, G: position.y, B: position.z, A: distance\n\n\t\tdata[start + 2 * 4 + 0] = halfFloat ? MathUtils.toHalfFloat(position[0]) : position[0];\n\t\tdata[start + 2 * 4 + 1] = halfFloat ? MathUtils.toHalfFloat(position[1]) : position[1];\n\t\tdata[start + 2 * 4 + 2] = halfFloat ? MathUtils.toHalfFloat(position[2]) : position[2];\n\t\tdata[start + 2 * 4 + 3] = halfFloat ? MathUtils.toHalfFloat(distance) : distance;\n\n\t\t// pixel 3 - R: direction.x, G: direction.y, B: direction.z, A: coneCos\n\n\t\tdata[start + 3 * 4 + 0] = halfFloat ? MathUtils.toHalfFloat(direction[0]) : direction[0];\n\t\tdata[start + 3 * 4 + 1] = halfFloat ? MathUtils.toHalfFloat(direction[1]) : direction[1];\n\t\tdata[start + 3 * 4 + 2] = halfFloat ? MathUtils.toHalfFloat(direction[2]) : direction[2];\n\t\tdata[start + 3 * 4 + 3] = halfFloat ? MathUtils.toHalfFloat(coneCos) : coneCos;\n\t}\n\n}\n\nconst LIGHT_STRIDE = 4;\n\nconst _lightSphere = new Sphere();\nconst _cellsRange = new Box3();\nconst _vec3_1 = new Vector3();\n\nfunction getPointLightBoundingSphere(light, sphere) {\n\tsphere.center.fromArray(light.position);\n\tsphere.radius = light.distance;\n}\n\nfunction getSpotLightBoundingSphere(light, sphere) {\n\tif (light.coneCos < 0.70710678118) { // obtuse angle\n\t\t_vec3_1.fromArray(light.direction).multiplyScalar(light.distance * light.coneCos);\n\t\tsphere.center.fromArray(light.position).add(_vec3_1);\n\t\tsphere.radius = light.distance * Math.sqrt(1 - light.coneCos * light.coneCos);\n\t} else {\n\t\t_vec3_1.fromArray(light.direction).multiplyScalar(light.distance / (light.coneCos * 2));\n\t\tsphere.center.fromArray(light.position).add(_vec3_1);\n\t\tsphere.radius = light.distance / (light.coneCos * 2);\n\t}\n}\n\nfunction lightsTextureSize(maxLights) {\n\treturn Math.max(MathUtils.nextPowerOfTwo(Math.ceil(Math.sqrt(maxLights * LIGHT_STRIDE))), LIGHT_STRIDE);\n}\n\nfunction _isPerspectiveMatrix(m) {\n\treturn m.elements[11] === -1;\n}\n\nfunction getCellsRange(lightSphere, cellsTable, cellsTransform, cellsRange) {\n\tconst { center, radius } = lightSphere;\n\n\tconst { clips, factors, perspective } = cellsTransform;\n\n\tlet zMin = center.z - radius;\n\tconst zMax = center.z + radius;\n\n\tif (zMin > clips[1] || zMax < clips[0]) {\n\t\treturn false;\n\t}\n\n\tzMin = Math.max(zMin, clips[0]);\n\tconst zStart = Math.floor(Math.log(zMin) * factors[0] + factors[1]);\n\tconst zEnd = Math.min(Math.floor(Math.log(zMax) * factors[0] + factors[1]), cellsTable[2] - 1);\n\n\tconst halfFrustumHeight = (perspective ? Math.abs(center.z) : -1) * factors[2];\n\tconst invH = 1 / (2 * halfFrustumHeight);\n\n\tconst yMin = (center.y - radius) * invH + 0.5;\n\tconst yMax = (center.y + radius) * invH + 0.5;\n\tif (yMin > 1 || yMax < 0) {\n\t\treturn false;\n\t}\n\n\tconst yStart = Math.max(Math.floor(yMin * cellsTable[1]), 0);\n\tconst yEnd = Math.min(Math.floor(yMax * cellsTable[1]), cellsTable[1] - 1);\n\n\tconst halfFrustumWidth = halfFrustumHeight * factors[3];\n\tconst invW = 1 / (2 * halfFrustumWidth);\n\n\tconst xMin = (center.x - radius) * invW + 0.5;\n\tconst xMax = (center.x + radius) * invW + 0.5;\n\tif (xMin > 1 || xMax < 0) {\n\t\treturn false;\n\t}\n\n\tconst xStart = Math.max(Math.floor(xMin * cellsTable[0]), 0);\n\tconst xEnd = Math.min(Math.floor(xMax * cellsTable[0]), cellsTable[0] - 1);\n\n\tcellsRange.min.set(xStart, yStart, zStart);\n\tcellsRange.max.set(xEnd, yEnd, zEnd);\n\n\treturn true;\n}\n\nclass WebGLLights extends PropertyMap {\n\n\tconstructor(prefix, capabilities, textures) {\n\t\tsuper(prefix);\n\n\t\tconst that = this;\n\n\t\tfunction onLightingGroupDispose(event) {\n\t\t\tconst lightingGroup = event.target;\n\t\t\tconst lightingProperties = that.get(lightingGroup);\n\n\t\t\tlightingGroup.removeEventListener('dispose', onLightingGroupDispose);\n\n\t\t\tif (lightingProperties.clustered) {\n\t\t\t\tlightingProperties.clustered.dispose();\n\t\t\t}\n\n\t\t\tthat.delete(lightingGroup);\n\t\t}\n\n\t\tthis._onLightingGroupDispose = onLightingGroupDispose;\n\n\t\tthis._capabilities = capabilities;\n\t\tthis._textures = textures;\n\t}\n\n\tsetLightingGroup(lightingGroup, passInfo, options, cameraData) {\n\t\tconst lightingProperties = this.get(lightingGroup);\n\n\t\t// Skip early if this lighting group has been set in this pass.\n\t\tif (lightingProperties.pass === passInfo.count) {\n\t\t\treturn lightingProperties;\n\t\t}\n\t\tlightingProperties.pass = passInfo.count;\n\n\t\tif (lightingProperties.state === undefined) {\n\t\t\tlightingGroup.addEventListener('dispose', this._onLightingGroupDispose);\n\t\t\tlightingProperties.state = new LightingState();\n\t\t\tlightingProperties.uploadVersion = 0;\n\t\t}\n\n\t\t// Skip early if this lighting group is empty\n\t\tif (lightingGroup.totalNum === 0) {\n\t\t\treturn lightingProperties;\n\t\t}\n\n\t\tconst clusteredOptions = options.clustered;\n\t\tconst clusteredEnabled = clusteredOptions.enabled;\n\n\t\tlet clusteredLightsChanged = false;\n\n\t\tif (lightingProperties.lightingVersion !== lightingGroup.version || lightingProperties.clusteredEnabled !== clusteredEnabled) {\n\t\t\tlightingProperties.state.update(lightingGroup, clusteredEnabled);\n\t\t\tlightingProperties.uploadVersion++;\n\n\t\t\tconst hasClusteredLights = lightingProperties.state._factor[10] > 0;\n\n\t\t\tlightingProperties.lightingVersion = lightingGroup.version;\n\t\t\tlightingProperties.clusteredEnabled = clusteredEnabled;\n\t\t\tlightingProperties.hasClusteredLights = hasClusteredLights;\n\n\t\t\tclusteredLightsChanged = hasClusteredLights;\n\n\t\t\t// prepare clustered lighting\n\n\t\t\tif (hasClusteredLights && !lightingProperties.clustered) {\n\t\t\t\tlightingProperties.clustered = new WebGLClusteredLighting(clusteredOptions);\n\t\t\t\tlightingProperties.clusteredOptionVersion = clusteredOptions.version;\n\t\t\t} else if (!clusteredEnabled && lightingProperties.clustered) {\n\t\t\t\tlightingProperties.clustered.dispose();\n\t\t\t\tdelete lightingProperties.clustered;\n\t\t\t}\n\t\t}\n\n\t\tif (lightingProperties.hasClusteredLights) {\n\t\t\tif (lightingProperties.clusteredOptionVersion !== clusteredOptions.version) {\n\t\t\t\tlightingProperties.clustered.setOptions(clusteredOptions);\n\t\t\t\tlightingProperties.clusteredOptionVersion = clusteredOptions.version;\n\n\t\t\t\tclusteredLightsChanged = true;\n\t\t\t}\n\n\t\t\tlet cameraChanged = false;\n\n\t\t\tif (lightingProperties.cameraId !== cameraData.id || lightingProperties.cameraVersion !== cameraData.version) {\n\t\t\t\tlightingProperties.cameraId = cameraData.id;\n\t\t\t\tlightingProperties.cameraVersion = cameraData.version;\n\n\t\t\t\tcameraChanged = true;\n\t\t\t}\n\n\t\t\tif (clusteredLightsChanged || cameraChanged) {\n\t\t\t\tlightingProperties.clustered.update(lightingGroup, cameraData, clusteredLightsChanged);\n\t\t\t}\n\t\t}\n\n\t\treturn lightingProperties;\n\t}\n\n\tuploadUniforms(program, lightingGroup, disableShadowSampler) {\n\t\tconst lightingGroupProperties = this.get(lightingGroup);\n\n\t\tlet refresh = false;\n\t\tif (program.lightId !== lightingGroup.id || program.lightVersion !== lightingGroupProperties.uploadVersion) {\n\t\t\trefresh = true;\n\t\t\tprogram.lightId = lightingGroup.id;\n\t\t\tprogram.lightVersion = lightingGroupProperties.uploadVersion;\n\t\t}\n\n\t\tconst uniforms = program.getUniforms();\n\t\tconst capabilities = this._capabilities;\n\t\tconst textures = this._textures;\n\n\t\tconst lightingFactor = lightingGroupProperties.state._factor;\n\n\t\tif (lightingFactor[0] && refresh) {\n\t\t\tuniforms.set('u_AmbientLightColor', lightingGroup.ambient);\n\t\t}\n\t\tif (lightingFactor[1] && refresh) {\n\t\t\tuniforms.set('u_SphericalHarmonicsLightData', lightingGroup.sh);\n\t\t}\n\t\tif (lightingFactor[2] > 0 && refresh) {\n\t\t\tuniforms.set('u_Hemi', lightingGroup.hemisphere);\n\t\t}\n\n\t\tif (lightingFactor[3] > 0) {\n\t\t\tif (refresh) uniforms.set('u_Directional', lightingGroup.directional);\n\n\t\t\tif (lightingFactor[7] > 0) {\n\t\t\t\tif (refresh) uniforms.set('u_DirectionalShadow', lightingGroup.directionalShadow);\n\n\t\t\t\tif (uniforms.has('directionalShadowMap')) {\n\t\t\t\t\tif (capabilities.version >= 2 && !disableShadowSampler) {\n\t\t\t\t\t\tuniforms.set('directionalShadowMap', lightingGroup.directionalShadowDepthMap, textures);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tuniforms.set('directionalShadowMap', lightingGroup.directionalShadowMap, textures);\n\t\t\t\t\t}\n\t\t\t\t\tuniforms.set('directionalShadowMatrix', lightingGroup.directionalShadowMatrix);\n\t\t\t\t}\n\n\t\t\t\tif (uniforms.has('directionalDepthMap')) {\n\t\t\t\t\tuniforms.set('directionalDepthMap', lightingGroup.directionalShadowMap, textures);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (lightingFactor[4] > 0) {\n\t\t\tif (refresh) uniforms.set('u_Point', lightingGroup.point);\n\n\t\t\tif (lightingFactor[8] > 0) {\n\t\t\t\tif (refresh) uniforms.set('u_PointShadow', lightingGroup.pointShadow);\n\n\t\t\t\tif (uniforms.has('pointShadowMap')) {\n\t\t\t\t\tuniforms.set('pointShadowMap', lightingGroup.pointShadowMap, textures);\n\t\t\t\t\tuniforms.set('pointShadowMatrix', lightingGroup.pointShadowMatrix);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (lightingFactor[5] > 0) {\n\t\t\tif (refresh) uniforms.set('u_Spot', lightingGroup.spot);\n\n\t\t\tif (lightingFactor[9] > 0) {\n\t\t\t\tif (refresh) uniforms.set('u_SpotShadow', lightingGroup.spotShadow);\n\n\t\t\t\tif (uniforms.has('spotShadowMap')) {\n\t\t\t\t\tif (capabilities.version >= 2 && !disableShadowSampler) {\n\t\t\t\t\t\tuniforms.set('spotShadowMap', lightingGroup.spotShadowDepthMap, textures);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tuniforms.set('spotShadowMap', lightingGroup.spotShadowMap, textures);\n\t\t\t\t\t}\n\t\t\t\t\tuniforms.set('spotShadowMatrix', lightingGroup.spotShadowMatrix);\n\t\t\t\t}\n\n\t\t\t\tif (uniforms.has('spotDepthMap')) {\n\t\t\t\t\tuniforms.set('spotDepthMap', lightingGroup.spotShadowMap, textures);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (lightingFactor[6] > 0) {\n\t\t\tif (refresh) uniforms.set('u_RectArea', lightingGroup.rectArea);\n\n\t\t\tif (lightingGroup.LTC1 && lightingGroup.LTC2) {\n\t\t\t\tuniforms.set('ltc_1', lightingGroup.LTC1, textures);\n\t\t\t\tuniforms.set('ltc_2', lightingGroup.LTC2, textures);\n\t\t\t} else {\n\t\t\t\tconsole.warn('WebGLRenderer: RectAreaLight.LTC1 and LTC2 need to be set before use.');\n\t\t\t}\n\t\t}\n\n\t\tif (lightingFactor[10] > 0) {\n\t\t\tconst clusteredLighting = lightingGroupProperties.clustered;\n\t\t\tconst cellsInfo = clusteredLighting.cellsTexture.cellsInfo;\n\n\t\t\tuniforms.set('maxLightsPerCell', cellsInfo.maxLightsPerCell);\n\n\t\t\tuniforms.set('cells', cellsInfo.table);\n\t\t\tuniforms.set('cellsDotData', cellsInfo.dotData);\n\t\t\tuniforms.set('cellsTextureSize', cellsInfo.textureSize);\n\t\t\tuniforms.set('cellsTransformFactors', clusteredLighting.cellsTransform.factors);\n\n\t\t\tuniforms.set('lightsTexture', clusteredLighting.lightsTexture, textures);\n\t\t\tuniforms.set('cellsTexture', clusteredLighting.cellsTexture, textures);\n\t\t}\n\t}\n\n}\n\nclass LightingState {\n\n\tconstructor() {\n\t\tthis._factor = new Uint16Array(11);\n\n\t\tthis._totalNum = 0;\n\t\tthis._shadowsNum = 0;\n\t}\n\n\tupdate(lightingGroup, clusteredEnabled) {\n\t\tconst selfFactor = this._factor;\n\n\t\tselfFactor[0] = lightingGroup.useAmbient ? 1 : 0;\n\t\tselfFactor[1] = lightingGroup.useSphericalHarmonics ? 1 : 0;\n\t\tselfFactor[2] = lightingGroup.hemisNum;\n\t\tselfFactor[3] = lightingGroup.directsNum;\n\t\tselfFactor[4] = lightingGroup.pointsNum;\n\t\tselfFactor[5] = lightingGroup.spotsNum;\n\t\tselfFactor[6] = lightingGroup.rectAreaNum;\n\t\tselfFactor[7] = lightingGroup.directShadowNum;\n\t\tselfFactor[8] = lightingGroup.pointShadowNum;\n\t\tselfFactor[9] = lightingGroup.spotShadowNum;\n\t\tselfFactor[10] = 0;\n\n\t\tthis._totalNum = lightingGroup.totalNum;\n\t\tthis._shadowsNum = lightingGroup.shadowsNum;\n\n\t\tif (clusteredEnabled) {\n\t\t\tconst clusteredPointsNum = selfFactor[4] - selfFactor[8];\n\t\t\tconst clusteredSpotsNum = selfFactor[5] - selfFactor[9];\n\n\t\t\tselfFactor[4] = selfFactor[8];\n\t\t\tselfFactor[5] = selfFactor[9];\n\n\t\t\tselfFactor[10] = (clusteredPointsNum + clusteredSpotsNum) > 0 ? 1 : 0;\n\t\t}\n\t}\n\n\tcompare(factor) {\n\t\tif (!factor) {\n\t\t\treturn false;\n\t\t}\n\n\t\tconst selfFactor = this._factor;\n\t\tfor (let i = 0, l = factor.length; i < l; i++) {\n\t\t\tif (selfFactor[i] !== factor[i]) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\treturn true;\n\t}\n\n\tcopyTo(factor) {\n\t\tconst selfFactor = this._factor;\n\t\tif (!factor) {\n\t\t\tfactor = new selfFactor.constructor(this._factor.length);\n\t\t}\n\t\tfactor.set(selfFactor);\n\t\treturn factor;\n\t}\n\n\thasLight() {\n\t\treturn this._totalNum > 0;\n\t}\n\n\thasShadow() {\n\t\treturn this._shadowsNum > 0;\n\t}\n\n\tsetProgramProps(props, receiveShadow) {\n\t\tconst selfFactor = this._factor;\n\n\t\tprops.useAmbientLight = selfFactor[0];\n\t\tprops.useSphericalHarmonicsLight = selfFactor[1];\n\t\tprops.hemisphereLightNum = selfFactor[2];\n\t\tprops.directLightNum = selfFactor[3];\n\t\tprops.pointLightNum = selfFactor[4];\n\t\tprops.spotLightNum = selfFactor[5];\n\t\tprops.rectAreaLightNum = selfFactor[6];\n\t\tprops.directShadowNum = receiveShadow ? selfFactor[7] : 0;\n\t\tprops.pointShadowNum = receiveShadow ? selfFactor[8] : 0;\n\t\tprops.spotShadowNum = receiveShadow ? selfFactor[9] : 0;\n\n\t\tprops.useClusteredLights = selfFactor[10];\n\n\t\tprops.useShadow = this._shadowsNum > 0 && receiveShadow;\n\t}\n\n}\n\nconst helpVector4 = new Vector4();\nconst helpMatrix3 = new Matrix3();\nconst helpMatrix4 = new Matrix4();\n\nconst influencesList = new WeakMap();\nconst morphInfluences = new Float32Array(8);\n\nconst _envData = { map: null, diffuse: 1, specular: 1 };\nlet _clippingPlanesData = new Float32Array([]);\n\nfunction defaultGetGeometry(renderable) {\n\treturn renderable.geometry;\n}\n\nfunction defaultGetMaterial(renderable) {\n\treturn renderable.material;\n}\n\nfunction defaultIfRender(renderable) {\n\treturn true;\n}\n\nconst _emptyLightingGroup = new LightingGroup();\n\nfunction getLightingGroup(lighting, material) {\n\tif (!material.acceptLight) {\n\t\treturn _emptyLightingGroup;\n\t}\n\n\tconst lightingGroup = lighting.getGroup(material.lightingGroup);\n\tif (lightingGroup && lightingGroup.totalNum > 0) {\n\t\treturn lightingGroup;\n\t}\n\n\treturn _emptyLightingGroup;\n}\n\nfunction clientWaitAsync(gl) {\n\tconst sync = gl.fenceSync(gl.SYNC_GPU_COMMANDS_COMPLETE, 0);\n\n\tgl.flush();\n\n\treturn new Promise(function(resolve, reject) {\n\t\tfunction test() {\n\t\t\tconst res = gl.clientWaitSync(sync, gl.SYNC_FLUSH_COMMANDS_BIT, 0);\n\n\t\t\tif (res === gl.WAIT_FAILED) {\n\t\t\t\tgl.deleteSync(sync);\n\t\t\t\treject();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (res === gl.TIMEOUT_EXPIRED) {\n\t\t\t\trequestAnimationFrame(test);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tgl.deleteSync(sync);\n\n\t\t\tresolve();\n\t\t}\n\n\t\ttest();\n\t});\n}\n\n/**\n * The WebGL renderer.\n * @extends ThinRenderer\n */\nclass WebGLRenderer extends ThinRenderer {\n\n\t/**\n\t * Create a WebGLRenderer.\n\t * @param {WebGLRenderingContext} [context] - The WebGL Rendering Context privided by canvas.\n\t * If not provided, you must call {@link WebGLRenderer.init} method with a valid context\n\t * before using this renderer.\n\t */\n\tconstructor(context) {\n\t\tsuper();\n\n\t\t/**\n\t\t * An object containing details about the capabilities of the current RenderingContext.\n\t\t * @type {WebGLCapabilities}\n\t\t */\n\t\tthis.capabilities = {};\n\n\t\tthis._textures = null;\n\t\tthis._renderBuffers = null;\n\t\tthis._renderTargets = null;\n\t\tthis._buffers = null;\n\t\tthis._geometries = null;\n\t\tthis._lights = null;\n\t\tthis._programs = null;\n\t\tthis._materials = null;\n\t\tthis._state = null;\n\t\tthis._vertexArrayBindings = null;\n\n\t\tif (context) {\n\t\t\tthis.init(context);\n\t\t}\n\n\t\t// Cache current material if beginRender is called.\n\t\tthis._currentMaterial = null;\n\n\t\tthis._currentOcclusionQuerySet = null;\n\n\t\tthis._currentTimestampWrites = {\n\t\t\tquerySet: null,\n\t\t\tbeginningOfPassWriteIndex: -1,\n\t\t\tendOfPassWriteIndex: -1\n\t\t};\n\t}\n\n\tinit(context, options = {}) {\n\t\tif (!context) {\n\t\t\tcontext = this.context;\n\t\t}\n\n\t\tif (!context) {\n\t\t\tthrow new Error('WebGLRenderer.init: context must be provided.');\n\t\t}\n\n\t\tthis.context = context;\n\n\t\tconst prefix = `_gl${this.increaseId()}`;\n\n\t\tconst capabilities = new WebGLCapabilities(context);\n\t\tconst constants = new WebGLConstants(context, capabilities);\n\t\tconst state = new WebGLState(context, capabilities);\n\t\tconst textures = new WebGLTextures(prefix, context, state, capabilities, constants);\n\t\tconst renderBuffers = new WebGLRenderBuffers(prefix, context, capabilities, constants);\n\t\tconst renderTargets = new WebGLRenderTargets(prefix, context, state, capabilities, textures, renderBuffers, constants);\n\t\tconst buffers = new WebGLBuffers(prefix, context, capabilities);\n\t\tconst vertexArrayBindings = new WebGLVertexArrayBindings(prefix, context, capabilities, buffers);\n\t\tconst geometries = new WebGLGeometries(prefix, context, buffers, vertexArrayBindings);\n\t\tconst lights = new WebGLLights(prefix, capabilities, textures);\n\t\tconst programs = new WebGLPrograms(context, state, capabilities);\n\t\tconst materials = new WebGLMaterials(prefix, programs, vertexArrayBindings);\n\t\tconst querySets = new WebGLQuerySets(prefix, context, capabilities);\n\n\t\tthis.capabilities = capabilities;\n\n\t\tthis._constants = constants;\n\t\tthis._textures = textures;\n\t\tthis._renderBuffers = renderBuffers;\n\t\tthis._renderTargets = renderTargets;\n\t\tthis._buffers = buffers;\n\t\tthis._geometries = geometries;\n\t\tthis._lights = lights;\n\t\tthis._programs = programs;\n\t\tthis._materials = materials;\n\t\tthis._state = state;\n\t\tthis._vertexArrayBindings = vertexArrayBindings;\n\t\tthis._querySets = querySets;\n\n\t\treturn Promise.resolve(this);\n\t}\n\n\tbeginRender(renderTarget) {\n\t\tsuper.beginRender(renderTarget);\n\n\t\tif (renderTarget) {\n\t\t\tthis._renderTargets.setRenderTarget(renderTarget);\n\n\t\t\tconst gl = this.context;\n\t\t\tconst state = this._state;\n\n\t\t\tlet clearBits = 0;\n\n\t\t\tif (renderTarget.clearColor) {\n\t\t\t\tstate.colorBuffer.setClear(\n\t\t\t\t\trenderTarget.colorClearValue.r,\n\t\t\t\t\trenderTarget.colorClearValue.g,\n\t\t\t\t\trenderTarget.colorClearValue.b,\n\t\t\t\t\trenderTarget.colorClearValue.a\n\t\t\t\t);\n\t\t\t\tclearBits |= gl.COLOR_BUFFER_BIT;\n\t\t\t}\n\n\t\t\tif (renderTarget.clearDepth) {\n\t\t\t\tstate.depthBuffer.setClear(renderTarget.depthClearValue);\n\t\t\t\tclearBits |= gl.DEPTH_BUFFER_BIT;\n\t\t\t}\n\n\t\t\tif (renderTarget.clearStencil) {\n\t\t\t\tstate.stencilBuffer.setClear(renderTarget.stencilClearValue);\n\t\t\t\tclearBits |= gl.STENCIL_BUFFER_BIT;\n\t\t\t}\n\n\t\t\tif (clearBits > 0) { // Prevent warning when bits is equal to zero\n\t\t\t\tgl.clear(clearBits);\n\t\t\t}\n\n\t\t\tthis._currentOcclusionQuerySet = renderTarget.occlusionQuerySet;\n\t\t\tthis._currentTimestampWrites.querySet = renderTarget.timestampWrites.querySet;\n\t\t\tthis._currentTimestampWrites.beginningOfPassWriteIndex = renderTarget.timestampWrites.beginningOfPassWriteIndex;\n\t\t\tthis._currentTimestampWrites.endOfPassWriteIndex = renderTarget.timestampWrites.endOfPassWriteIndex;\n\t\t}\n\n\t\tif (this._currentOcclusionQuerySet) {\n\t\t\tthis._querySets.setQuerySet(this._currentOcclusionQuerySet);\n\t\t}\n\n\t\tif (this._currentTimestampWrites.querySet) {\n\t\t\tthis._querySets.setQuerySet(this._currentTimestampWrites.querySet);\n\n\t\t\tif (this.capabilities.canUseTimestamp) {\n\t\t\t\tthis._querySets.queryCounter(\n\t\t\t\t\tthis._currentTimestampWrites.querySet,\n\t\t\t\t\tthis._currentTimestampWrites.beginningOfPassWriteIndex\n\t\t\t\t);\n\t\t\t} else { // fallback to use TIME_ELAPSED_EXT\n\t\t\t\tthis._querySets.beginQuery(\n\t\t\t\t\tthis._currentTimestampWrites.querySet,\n\t\t\t\t\tthis._currentTimestampWrites.endOfPassWriteIndex\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\n\tendRender() {\n\t\tif (this._currentTimestampWrites.querySet) {\n\t\t\tif (this.capabilities.canUseTimestamp) {\n\t\t\t\tthis._querySets.queryCounter(\n\t\t\t\t\tthis._currentTimestampWrites.querySet,\n\t\t\t\t\tthis._currentTimestampWrites.endOfPassWriteIndex\n\t\t\t\t);\n\t\t\t} else { // fallback to use TIME_ELAPSED_EXT\n\t\t\t\tthis._querySets.endQuery(this._currentTimestampWrites.querySet);\n\t\t\t}\n\t\t}\n\n\t\t// Ensure depth buffer writing is enabled so it can be cleared on next render\n\t\tconst state = this._state;\n\t\tstate.depthBuffer.setTest(true);\n\t\tstate.depthBuffer.setMask(true);\n\t\tstate.colorBuffer.setMask(true);\n\n\t\tthis._currentMaterial = null;\n\n\t\t// Automatically clear the occlusion query set and timestamp writes\n\t\tthis._currentOcclusionQuerySet = null;\n\t\tthis._currentTimestampWrites.querySet = null;\n\n\t\tsuper.endRender();\n\t}\n\n\trenderRenderableItem(renderable, renderStates, options) {\n\t\tconst state = this._state;\n\t\tconst capabilities = this.capabilities;\n\t\tconst vertexArrayBindings = this._vertexArrayBindings;\n\t\tconst textures = this._textures;\n\t\tconst passInfo = this._passInfo;\n\n\t\tconst getGeometry = options.getGeometry || defaultGetGeometry;\n\t\tconst getMaterial = options.getMaterial || defaultGetMaterial;\n\t\tconst beforeRender = options.beforeRender;\n\t\tconst afterRender = options.afterRender;\n\t\tconst ifRender = options.ifRender || defaultIfRender;\n\t\tconst renderInfo = options.renderInfo;\n\n\t\tconst sceneData = renderStates.scene;\n\t\tconst cameraData = renderStates.camera;\n\n\t\tconst currentRenderTarget = state.currentRenderTarget;\n\n\t\tif (!ifRender(renderable)) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (!passInfo.enabled) {\n\t\t\tconsole.warn('WebGLRenderer: beginRender must be called before renderRenderableItem.');\n\t\t\treturn;\n\t\t}\n\n\t\tconst object = renderable.object;\n\t\tconst material = getMaterial.call(this, renderable);\n\t\tconst geometry = getGeometry.call(this, renderable);\n\t\tconst group = renderable.group;\n\t\tconst fog = material.fog ? sceneData.fog : null;\n\n\t\tconst lightingGroup = getLightingGroup(renderStates.lighting, material);\n\t\tconst lightingState = this._lights.setLightingGroup(lightingGroup, passInfo, this.lightingOptions, cameraData).state;\n\t\tconst hasLighting = lightingState.hasLight();\n\t\tconst hasShadow = lightingState.hasShadow() && object.receiveShadow;\n\n\t\t_envData.map = material.envMap !== undefined ? (material.envMap || sceneData.environment) : null;\n\t\t_envData.diffuse = sceneData.envDiffuseIntensity * material.envMapIntensity;\n\t\t_envData.specular = sceneData.envSpecularIntensity * material.envMapIntensity;\n\n\t\tlet clippingPlanesData = sceneData.clippingPlanesData;\n\t\tlet numClippingPlanes = sceneData.numClippingPlanes;\n\t\tif (material.clippingPlanes && material.clippingPlanes.length > 0) {\n\t\t\tif (_clippingPlanesData.length < material.clippingPlanes.length * 4) {\n\t\t\t\t_clippingPlanesData = new Float32Array(material.clippingPlanes.length * 4);\n\t\t\t}\n\t\t\tclippingPlanesData = sceneData.setClippingPlanesData(material.clippingPlanes, _clippingPlanesData);\n\t\t\tnumClippingPlanes = material.clippingPlanes.length;\n\t\t}\n\n\t\tobject.onBeforeRender(renderable, material);\n\t\tbeforeRender && beforeRender.call(this, renderable, material);\n\n\t\t// Check material version\n\n\t\tconst materialProperties = this._materials.setMaterial(material);\n\n\t\tif (material.needsUpdate === false) {\n\t\t\tif (materialProperties.currentProgram === undefined) {\n\t\t\t\tmaterial.needsUpdate = true;\n\t\t\t} else if (materialProperties.fog !== fog) {\n\t\t\t\tmaterial.needsUpdate = true;\n\t\t\t} else if (materialProperties.envMap !== _envData.map) {\n\t\t\t\tmaterial.needsUpdate = true;\n\t\t\t} else if (materialProperties.numClippingPlanes !== numClippingPlanes) {\n\t\t\t\tmaterial.needsUpdate = true;\n\t\t\t} else if (materialProperties.logarithmicDepthBuffer !== sceneData.logarithmicDepthBuffer) {\n\t\t\t\tmaterial.needsUpdate = true;\n\t\t\t} else if (renderStates.outputEncoding !== materialProperties.outputEncoding ||\n\t\t\t\trenderStates.gammaFactor !== materialProperties.gammaFactor) {\n\t\t\t\tmaterial.needsUpdate = true;\n\t\t\t} else if (capabilities.version > 1 && sceneData.disableShadowSampler !== materialProperties.disableShadowSampler) {\n\t\t\t\tmaterial.needsUpdate = true;\n\t\t\t} else {\n\t\t\t\tif (hasLighting !== materialProperties.hasLighting) {\n\t\t\t\t\tmaterial.needsUpdate = true;\n\t\t\t\t} else if (hasLighting) {\n\t\t\t\t\tif (!lightingState.compare(materialProperties.lightingFactors)) {\n\t\t\t\t\t\tmaterial.needsUpdate = true;\n\t\t\t\t\t} else if (hasShadow !== materialProperties.hasShadow) {\n\t\t\t\t\t\tmaterial.needsUpdate = true;\n\t\t\t\t\t} else if (hasShadow) {\n\t\t\t\t\t\tmaterial.needsUpdate = materialProperties.shadowType !== object.shadowType;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Update program if needed.\n\n\t\tif (material.needsUpdate) {\n\t\t\tthis._materials.updateProgram(material, object, lightingState, renderStates, this.shaderCompileOptions);\n\n\t\t\tmaterialProperties.fog = fog;\n\t\t\tmaterialProperties.envMap = _envData.map;\n\t\t\tmaterialProperties.logarithmicDepthBuffer = sceneData.logarithmicDepthBuffer;\n\n\t\t\tmaterialProperties.hasLighting = hasLighting;\n\t\t\tmaterialProperties.lightingFactors = lightingState.copyTo(materialProperties.lightingFactors);\n\t\t\tmaterialProperties.hasShadow = hasShadow;\n\t\t\tmaterialProperties.shadowType = object.shadowType;\n\n\t\t\tmaterialProperties.numClippingPlanes = numClippingPlanes;\n\t\t\tmaterialProperties.outputEncoding = renderStates.outputEncoding;\n\t\t\tmaterialProperties.gammaFactor = renderStates.gammaFactor;\n\t\t\tmaterialProperties.disableShadowSampler = sceneData.disableShadowSampler;\n\n\t\t\tmaterial.needsUpdate = false;\n\t\t}\n\n\t\tconst program = materialProperties.currentProgram;\n\n\t\tif (options.onlyCompile || !program.isReady(capabilities.parallelShaderCompileExt)) return;\n\n\t\tstate.setProgram(program);\n\n\t\tthis._geometries.setGeometry(geometry, passInfo);\n\n\t\t// update morph targets\n\t\tif (object.morphTargetInfluences) {\n\t\t\tthis._updateMorphtargets(object, geometry, program);\n\t\t}\n\n\t\tvertexArrayBindings.setup(object, geometry, program);\n\n\t\tlet refreshCamera = false;\n\t\tif (program.cameraId !== cameraData.id || program.cameraVersion !== cameraData.version) {\n\t\t\trefreshCamera = true;\n\t\t\tprogram.cameraId = cameraData.id;\n\t\t\tprogram.cameraVersion = cameraData.version;\n\t\t}\n\n\t\tlet refreshScene = false;\n\t\tif (program.sceneId !== sceneData.id || program.sceneVersion !== sceneData.version) {\n\t\t\trefreshScene = true;\n\t\t\tprogram.sceneId = sceneData.id;\n\t\t\tprogram.sceneVersion = sceneData.version;\n\t\t}\n\n\t\tlet refreshMaterial = true;\n\t\tif (!material.forceUpdateUniforms) {\n\t\t\tif (materialProperties.pass !== passInfo.count) {\n\t\t\t\tmaterialProperties.pass = passInfo.count;\n\t\t\t} else {\n\t\t\t\trefreshMaterial = this._currentMaterial !== material;\n\t\t\t}\n\t\t}\n\t\tthis._currentMaterial = material;\n\n\t\tconst uniforms = program.getUniforms();\n\n\t\t// upload light uniforms\n\t\tif (hasLighting) {\n\t\t\tthis._lights.uploadUniforms(program, lightingGroup, sceneData.disableShadowSampler);\n\t\t}\n\n\t\t// upload bone matrices\n\t\tif (object.isSkinnedMesh) {\n\t\t\tthis._uploadSkeleton(uniforms, object, sceneData);\n\t\t}\n\n\t\t// upload other uniforms\n\t\tfor (let n = 0, ll = uniforms.seq.length; n < ll; n++) {\n\t\t\tconst uniform = uniforms.seq[n];\n\t\t\tconst key = uniform.id;\n\t\t\tconst internalGroup = uniform.internalGroup;\n\n\t\t\t// upload custom uniforms\n\t\t\tif (material.uniforms && material.uniforms[key] !== undefined) {\n\t\t\t\tuniform.set(material.uniforms[key], textures);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// u_Model: always upload this matrix\n\t\t\tif (internalGroup === 1) {\n\t\t\t\tlet modelMatrix = object.worldMatrix;\n\t\t\t\tif (sceneData.useAnchorMatrix) {\n\t\t\t\t\tmodelMatrix = helpMatrix4.copy(modelMatrix).premultiply(sceneData.anchorMatrixInverse);\n\t\t\t\t}\n\t\t\t\tuniform.set(modelMatrix.elements);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// uniforms about camera data\n\t\t\tif (internalGroup === 2 && refreshCamera) {\n\t\t\t\tuniform.internalFun(cameraData);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// uniforms about scene data\n\t\t\tif (internalGroup === 3 && refreshScene) {\n\t\t\t\tuniform.internalFun(sceneData);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// uniforms about material\n\t\t\tif (internalGroup === 4 && refreshMaterial) {\n\t\t\t\tuniform.internalFun(material, textures);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// uniforms about environment map\n\t\t\tif (internalGroup === 5) {\n\t\t\t\tuniform.internalFun(_envData, textures);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// other internal uniforms\n\t\t\tif (key === 'clippingPlanes') {\n\t\t\t\tuniform.set(clippingPlanesData);\n\t\t\t} else if (key === 'u_RenderTargetSize') {\n\t\t\t\tuniform.setValue(currentRenderTarget.width, currentRenderTarget.height);\n\t\t\t}\n\t\t}\n\n\t\tconst frontFaceCW = helpMatrix3.setFromMatrix4(object.worldMatrix).determinant() < 0;\n\t\tstate.setMaterial(material, frontFaceCW);\n\n\t\tconst viewport = helpVector4.set(\n\t\t\tcurrentRenderTarget.width,\n\t\t\tcurrentRenderTarget.height,\n\t\t\tcurrentRenderTarget.width,\n\t\t\tcurrentRenderTarget.height\n\t\t).multiply(cameraData.rect);\n\n\t\tviewport.z -= viewport.x;\n\t\tviewport.w -= viewport.y;\n\n\t\tstate.viewport(viewport.round());\n\n\t\tthis._draw(geometry, material, group, renderInfo);\n\n\t\ttextures.resetTextureUnits();\n\n\t\tafterRender && afterRender.call(this, renderable);\n\t\tobject.onAfterRender(renderable);\n\t}\n\n\tblitRenderTarget(read, draw, color = true, depth = true, stencil = true) {\n\t\tthis._renderTargets.blitRenderTarget(read, draw, color, depth, stencil);\n\t}\n\n\tgenerateMipmaps(texture) {\n\t\tconst state = this._state;\n\t\tconst capabilities = this.capabilities;\n\t\tconst textures = this._textures;\n\n\t\tconst textureProperties = textures.get(texture);\n\n\t\tif (!textureProperties.__webglTexture) return;\n\n\t\tconst powerOfTwo = MathUtils.isPowerOfTwo(textureProperties.__width)\n\t\t\t&& MathUtils.isPowerOfTwo(textureProperties.__height);\n\n\t\tif (\n\t\t\ttexture.generateMipmaps\n\t\t\t&& texture.minFilter !== TEXTURE_FILTER.NEAREST\n\t\t\t&& texture.minFilter !== TEXTURE_FILTER.LINEAR\n\t\t\t&& (powerOfTwo || capabilities.version >= 2)\n\t\t) {\n\t\t\tconst target = textureProperties.__webglTarget;\n\t\t\tstate.bindTexture(target, textureProperties.__webglTexture);\n\t\t\ttextures.generateMipmaps(texture);\n\t\t\tstate.bindTexture(target, null);\n\t\t}\n\t}\n\n\treadTexturePixels(texture, x, y, width, height, buffer, zIndex = 0, mipLevel = 0) {\n\t\tconst gl = this.context;\n\t\tconst constants = this._constants;\n\t\tconst state = this._state;\n\t\tconst renderTargets = this._renderTargets;\n\t\tconst textures = this._textures;\n\n\t\tif (!this._bindTextureToDummyFrameBuffer(texture, zIndex, mipLevel)) {\n\t\t\treturn Promise.reject('WebGLRenderer.readTexturePixels: Unsupported texture.');\n\t\t}\n\n\t\tconst glType = constants.getGLType(texture.type);\n\t\tconst glFormat = constants.getGLFormat(texture.format);\n\n\t\tconst textureProperties = textures.get(texture);\n\t\tif (textureProperties.__readBuffer === undefined) {\n\t\t\ttextureProperties.__readBuffer = gl.createBuffer();\n\t\t}\n\t\tgl.bindBuffer(gl.PIXEL_PACK_BUFFER, textureProperties.__readBuffer);\n\t\tgl.bufferData(gl.PIXEL_PACK_BUFFER, buffer.byteLength, gl.STREAM_READ);\n\n\t\tgl.readPixels(x, y, width, height, glFormat, glType, 0);\n\n\t\t// restore framebuffer binding\n\t\tconst framebuffer = (state.currentRenderTarget && !state.currentRenderTarget.isScreenRenderTarget) ?\n\t\t\trenderTargets.get(state.currentRenderTarget).__webglFramebuffer : null;\n\t\tgl.bindFramebuffer(gl.FRAMEBUFFER, framebuffer);\n\n\t\treturn clientWaitAsync(gl).then(() => {\n\t\t\tif (!textureProperties.__readBuffer) {\n\t\t\t\tthrow new Error('WebGLRenderer.readTexturePixels: Texture has been disposed.');\n\t\t\t}\n\n\t\t\tgl.bindBuffer(gl.PIXEL_PACK_BUFFER, textureProperties.__readBuffer);\n\t\t\tgl.getBufferSubData(gl.PIXEL_PACK_BUFFER, 0, buffer);\n\t\t\tgl.bindBuffer(gl.PIXEL_PACK_BUFFER, null);\n\n\t\t\treturn buffer;\n\t\t});\n\t}\n\n\treadTexturePixelsSync(texture, x, y, width, height, buffer, zIndex = 0, mipLevel = 0) {\n\t\tconst gl = this.context;\n\t\tconst constants = this._constants;\n\t\tconst state = this._state;\n\t\tconst renderTargets = this._renderTargets;\n\n\t\tif (!this._bindTextureToDummyFrameBuffer(texture, zIndex, mipLevel)) {\n\t\t\tconsole.warn('WebGLRenderer.readTexturePixels: Unsupported texture.');\n\t\t\treturn buffer;\n\t\t}\n\n\t\tconst glType = constants.getGLType(texture.type);\n\t\tconst glFormat = constants.getGLFormat(texture.format);\n\n\t\tgl.readPixels(x, y, width, height, glFormat, glType, buffer);\n\n\t\t// restore framebuffer binding\n\t\tconst framebuffer = (state.currentRenderTarget && !state.currentRenderTarget.isScreenRenderTarget) ?\n\t\t\trenderTargets.get(state.currentRenderTarget).__webglFramebuffer : null;\n\t\tgl.bindFramebuffer(gl.FRAMEBUFFER, framebuffer);\n\n\t\treturn buffer;\n\t}\n\n\tresetVertexArrayBindings(force) {\n\t\tthis._vertexArrayBindings.reset(force);\n\t}\n\n\tresetState() {\n\t\tthis._state.reset();\n\t}\n\n\tbeginOcclusionQuery(index) {\n\t\tconst querySet = this._currentOcclusionQuerySet;\n\t\tif (!querySet) return;\n\t\tthis._querySets.beginQuery(querySet, index);\n\t}\n\n\tendOcclusionQuery() {\n\t\tconst querySet = this._currentOcclusionQuerySet;\n\t\tif (!querySet) return;\n\t\tthis._querySets.endQuery(querySet);\n\t}\n\n\tasync readQuerySetResults(querySet, dstBuffer, firstQuery = 0, queryCount = querySet.count) {\n\t\treturn this._querySets.readQuerySetResults(querySet, dstBuffer, firstQuery, queryCount);\n\t}\n\n\t/**\n\t * Bind webglTexture to Texture.\n\t * @param {TextureBase} texture\n\t * @param {WebGLTexture} webglTexture\n\t */\n\tsetTextureExternal(texture, webglTexture) {\n\t\tthis._textures.setTextureExternal(texture, webglTexture);\n\t}\n\n\t/**\n\t * Bind webglRenderbuffer to RenderBuffer.\n\t * @param {RenderBuffer} renderBuffer\n\t * @param {WebGLRenderbuffer} webglRenderbuffer\n\t */\n\tsetRenderBufferExternal(renderBuffer, webglRenderbuffer) {\n\t\tthis._renderBuffers.setRenderBufferExternal(renderBuffer, webglRenderbuffer);\n\t}\n\n\t/**\n\t * Bind webglBuffer to Buffer.\n\t * @param {Buffer} buffer\n\t * @param {WebGLBuffer} webglBuffer\n\t */\n\tsetBufferExternal(buffer, webglBuffer) {\n\t\tthis._buffers.setBufferExternal(buffer, webglBuffer);\n\t}\n\n\t/**\n\t * Bind webglFramebuffer to RenderTarget.\n\t * @param {RenderTarget} renderTarget\n\t * @param {WebGLFramebuffer} webglFramebuffer\n\t */\n\tsetFramebufferExternal(renderTarget, webglFramebuffer) {\n\t\tthis._renderTargets.setFramebufferExternal(renderTarget, webglFramebuffer);\n\t}\n\n\t_uploadSkeleton(uniforms, object, sceneData) {\n\t\tif (object.skeleton && object.skeleton.bones.length > 0) {\n\t\t\tconst skeleton = object.skeleton;\n\t\t\tconst capabilities = this.capabilities;\n\n\t\t\tif (capabilities.maxVertexTextures > 0 && (!!capabilities.getExtension('OES_texture_float') || capabilities.version >= 2)) {\n\t\t\t\tif (skeleton.boneTexture === undefined) {\n\t\t\t\t\tskeleton.generateBoneTexture(capabilities.version >= 2);\n\t\t\t\t}\n\n\t\t\t\tuniforms.set('boneTexture', skeleton.boneTexture, this._textures);\n\t\t\t\tuniforms.set('boneTextureSize', skeleton.boneTexture.image.width);\n\t\t\t} else {\n\t\t\t\tuniforms.set('boneMatrices', skeleton.boneMatrices);\n\t\t\t}\n\n\t\t\tuniforms.set('bindMatrix', object.bindMatrix.elements);\n\n\t\t\thelpMatrix4.copy(object.bindMatrixInverse);\n\t\t\tif (sceneData.useAnchorMatrix) {\n\t\t\t\thelpMatrix4.multiply(sceneData.anchorMatrix); // convert to anchor space\n\t\t\t}\n\t\t\tuniforms.set('bindMatrixInverse', helpMatrix4.elements);\n\t\t}\n\t}\n\n\t_updateMorphtargets(object, geometry, program) {\n\t\tconst objectInfluences = object.morphTargetInfluences;\n\n\t\tif (!influencesList.has(geometry)) {\n\t\t\tinfluencesList.set(geometry, objectInfluences.slice(0));\n\t\t}\n\n\t\tconst morphTargets = geometry.morphAttributes.position;\n\t\tconst morphNormals = geometry.morphAttributes.normal;\n\n\t\t// Remove current morphAttributes\n\n\t\tconst influences = influencesList.get(geometry);\n\n\t\tfor (let i = 0; i < influences.length; i++) {\n\t\t\tconst influence = influences[i];\n\n\t\t\tif (influence !== 0) {\n\t\t\t\tif (morphTargets) geometry.removeAttribute('morphTarget' + i);\n\t\t\t\tif (morphNormals) geometry.removeAttribute('morphNormal' + i);\n\t\t\t}\n\t\t}\n\n\t\t// Collect influences\n\n\t\tfor (let i = 0; i < objectInfluences.length; i++) {\n\t\t\tinfluences[i] = objectInfluences[i];\n\t\t}\n\n\t\tinfluences.length = objectInfluences.length;\n\n\t\t// Add morphAttributes\n\n\t\tlet count = 0;\n\n\t\tfor (let i = 0; i < influences.length; i++) {\n\t\t\tconst influence = influences[i];\n\n\t\t\tif (influence > 0) {\n\t\t\t\tif (morphTargets) geometry.addAttribute('morphTarget' + count, morphTargets[i]);\n\t\t\t\tif (morphNormals) geometry.addAttribute('morphNormal' + count, morphNormals[i]);\n\n\t\t\t\tmorphInfluences[count] = influence;\n\n\t\t\t\tcount++;\n\t\t\t}\n\t\t}\n\n\t\tfor (; count < 8; count++) {\n\t\t\tmorphInfluences[count] = 0;\n\t\t}\n\n\t\tprogram.getUniforms().set('morphTargetInfluences', morphInfluences);\n\t}\n\n\t_draw(geometry, material, group, renderInfo) {\n\t\tconst gl = this.context;\n\t\tconst capabilities = this.capabilities;\n\t\tconst buffers = this._buffers;\n\n\t\tconst instanceCount = geometry.instanceCount;\n\t\tconst useInstancing = instanceCount >= 0;\n\t\tconst useGroup = !!group;\n\t\tconst useMultiDraw = useGroup && group.multiDrawCount !== undefined;\n\t\tconst useIndexBuffer = geometry.index !== null;\n\n\t\tlet drawStart = 0;\n\t\tlet drawCount = Infinity;\n\n\t\tif (!useMultiDraw) {\n\t\t\tconst position = geometry.getAttribute('a_Position');\n\n\t\t\tif (useIndexBuffer) {\n\t\t\t\tdrawCount = geometry.index.buffer.count;\n\t\t\t} else if (position) {\n\t\t\t\tdrawCount = position.buffer.count;\n\t\t\t}\n\n\t\t\tif (useGroup) {\n\t\t\t\tdrawStart = Math.max(drawStart, group.start);\n\t\t\t\tdrawCount = Math.min(drawCount, group.count);\n\t\t\t}\n\n\t\t\tif (drawCount < 0 || drawCount === Infinity) return;\n\t\t}\n\n\t\tif (useIndexBuffer) {\n\t\t\tconst indexBufferProperties = buffers.get(geometry.index.buffer);\n\t\t\tconst bytesPerElement = indexBufferProperties.bytesPerElement;\n\t\t\tconst type = indexBufferProperties.type;\n\n\t\t\tif (type === gl.UNSIGNED_INT) {\n\t\t\t\tif (capabilities.version < 2 && !capabilities.getExtension('OES_element_index_uint')) {\n\t\t\t\t\tconsole.warn('WebGLRenderer: draw elements type not support UNSIGNED_INT!');\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (useInstancing) {\n\t\t\t\tif (instanceCount <= 0) return;\n\n\t\t\t\tif (capabilities.version >= 2) {\n\t\t\t\t\tgl.drawElementsInstanced(material.drawMode, drawCount, type, drawStart * bytesPerElement, instanceCount);\n\t\t\t\t} else if (capabilities.getExtension('ANGLE_instanced_arrays')) {\n\t\t\t\t\tcapabilities.getExtension('ANGLE_instanced_arrays').drawElementsInstancedANGLE(material.drawMode, drawCount, type, drawStart * bytesPerElement, instanceCount);\n\t\t\t\t} else {\n\t\t\t\t\tconsole.warn('WebGLRenderer: using instanced draw but hardware does not support.');\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t} else if (useMultiDraw) {\n\t\t\t\tif (group.multiDrawCount <= 0) return;\n\n\t\t\t\tconst extension = capabilities.getExtension('WEBGL_multi_draw');\n\n\t\t\t\tif (!extension) {\n\t\t\t\t\tconsole.warn('WebGLRenderer: using multi draw but hardware does not support extension WEBGL_multi_draw.');\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\textension.multiDrawElementsWEBGL(material.drawMode, group.multiDrawCounts, 0, type, group.multiDrawStarts, 0, group.multiDrawCount);\n\t\t\t} else {\n\t\t\t\tgl.drawElements(material.drawMode, drawCount, type, drawStart * bytesPerElement);\n\t\t\t}\n\t\t} else {\n\t\t\tif (useInstancing) {\n\t\t\t\tif (instanceCount <= 0) return;\n\n\t\t\t\tif (capabilities.version >= 2) {\n\t\t\t\t\tgl.drawArraysInstanced(material.drawMode, drawStart, drawCount, instanceCount);\n\t\t\t\t} else if (capabilities.getExtension('ANGLE_instanced_arrays')) {\n\t\t\t\t\tcapabilities.getExtension('ANGLE_instanced_arrays').drawArraysInstancedANGLE(material.drawMode, drawStart, drawCount, instanceCount);\n\t\t\t\t} else {\n\t\t\t\t\tconsole.warn('WebGLRenderer: using instanced draw but hardware does not support.');\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t} else if (useMultiDraw) {\n\t\t\t\tif (group.multiDrawCount <= 0) return;\n\n\t\t\t\tconst extension = capabilities.getExtension('WEBGL_multi_draw');\n\n\t\t\t\tif (!extension) {\n\t\t\t\t\tconsole.warn('WebGLRenderer: using multi draw but hardware does not support extension WEBGL_multi_draw.');\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\textension.multiDrawArraysWEBGL(material.drawMode, group.multiDrawStarts, 0, group.multiDrawCounts, 0, group.multiDrawCount);\n\t\t\t} else {\n\t\t\t\tgl.drawArrays(material.drawMode, drawStart, drawCount);\n\t\t\t}\n\t\t}\n\n\t\tif (renderInfo) {\n\t\t\tif (useMultiDraw) {\n\t\t\t\tdrawCount = 0;\n\t\t\t\tfor (let i = 0; i < group.multiDrawCount; i++) {\n\t\t\t\t\tdrawCount += group.multiDrawCounts[i];\n\t\t\t\t}\n\t\t\t}\n\t\t\trenderInfo.update(drawCount, material.drawMode, instanceCount < 0 ? 1 : instanceCount);\n\t\t}\n\t}\n\n\t_bindTextureToDummyFrameBuffer(texture, zIndex, mipLevel) {\n\t\tif (!texture.isTexture) return false;\n\n\t\tconst gl = this.context;\n\t\tconst textures = this._textures;\n\t\tconst state = this._state;\n\n\t\tif (!this._dummyFrameBuffer) {\n\t\t\tthis._dummyFrameBuffer = gl.createFramebuffer();\n\t\t}\n\n\t\tgl.bindFramebuffer(gl.FRAMEBUFFER, this._dummyFrameBuffer);\n\n\t\tconst textureProperties = textures.setTexture(texture);\n\t\tif (texture.isTexture2D) {\n\t\t\tgl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, textureProperties.__webglTexture, mipLevel);\n\t\t} else if (texture.isTextureCube) {\n\t\t\tgl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_CUBE_MAP_POSITIVE_X + zIndex, textureProperties.__webglTexture, mipLevel);\n\t\t} else if (texture.isTexture3D || texture.isTexture2DArray) {\n\t\t\tgl.framebufferTextureLayer(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, textureProperties.__webglTexture, mipLevel, zIndex);\n\t\t}\n\t\tstate.bindTexture(textureProperties.__webglTarget, null);\n\n\t\treturn true;\n\t}\n\n}\n\nObject.defineProperties(WebGLRenderer.prototype, {\n\t// deprecated since 0.4.5\n\tasyncReadPixel: {\n\t\tconfigurable: true,\n\t\tget: function() {\n\t\t\tif (this._asyncReadPixel === undefined) {\n\t\t\t\tthis._asyncReadPixel = false;\n\t\t\t}\n\t\t\treturn this._asyncReadPixel;\n\t\t},\n\t\tset: function(value) {\n\t\t\tthis._asyncReadPixel = value;\n\t\t}\n\t}\n});\n\n// deprecated since 0.4.5, use readTexturePixels instead\nWebGLRenderer.prototype.readRenderTargetPixels = function(x, y, width, height, buffer) {\n\tconst state = this._state;\n\tconst renderTarget = state.currentRenderTarget;\n\n\tconst zIndex = renderTarget.activeLayer || renderTarget.activeLayer || 0;\n\tconst mipLevel = renderTarget.activeMipmapLevel || 0;\n\n\tif (renderTarget && renderTarget.texture) {\n\t\tif ((x >= 0 && x <= (renderTarget.width - width)) && (y >= 0 && y <= (renderTarget.height - height))) {\n\t\t\tif (this.asyncReadPixel) {\n\t\t\t\treturn this.readTexturePixels(renderTarget.texture, x, y, width, height, buffer, zIndex, mipLevel);\n\t\t\t} else {\n\t\t\t\tthis.readTexturePixelsSync(renderTarget.texture, x, y, width, height, buffer, zIndex, mipLevel);\n\t\t\t\treturn Promise.resolve(buffer);\n\t\t\t}\n\t\t}\n\t}\n\n\tconsole.warn('WebGLRenderer.readRenderTargetPixels: readPixels from renderTarget failed.');\n\treturn Promise.reject();\n};\n\n// deprecated since 0.5.1\nWebGLTextures.prototype.setTexture2D = function(texture, slot) {\n\t// console.warn('WebGLTextures: .setTexture2D() has been deprecated, use .setTexture() instead.');\n\treturn this.setTexture(texture, slot);\n};\nWebGLTextures.prototype.setTextureCube = function(texture, slot) {\n\t// console.warn('WebGLTextures: .setTextureCube() has been deprecated, use .setTexture() instead.');\n\treturn this.setTexture(texture, slot);\n};\nWebGLTextures.prototype.setTexture3D = function(texture, slot) {\n\t// console.warn('WebGLTextures: .setTexture3D() has been deprecated, use .setTexture() instead.');\n\treturn this.setTexture(texture, slot);\n};\nWebGLTextures.prototype.setTexture2DArray = function(texture, slot) {\n\t// console.warn('WebGLTextures: .setTexture2DArray() has been deprecated, use .setTexture() instead.');\n\treturn this.setTexture(texture, slot);\n};\n\nObject.defineProperties(Scene.prototype, {\n\t// deprecated since 0.2.7, add warning since 0.4.0\n\tenvironmentLightIntensity: {\n\t\tconfigurable: true,\n\t\tget: function() {\n\t\t\tconsole.warn('Scene: .environmentLightIntensity has been deprecated, use .envDiffuseIntensity instead.');\n\t\t\treturn this.envDiffuseIntensity;\n\t\t},\n\t\tset: function(value) {\n\t\t\tconsole.warn('Scene: .environmentLightIntensity has been deprecated, use .envDiffuseIntensity instead.');\n\t\t\tthis.envDiffuseIntensity = value;\n\t\t}\n\t},\n\t// deprecated since 0.4.0\n\t_lightData: {\n\t\tconfigurable: true,\n\t\tget: function() {\n\t\t\tconsole.warn('Scene: ._lightData has been deprecated since v0.4.0, use .collector.lightingData.getGroup(0) instead.');\n\t\t\treturn this.collector.lightingData.getGroup(0);\n\t\t}\n\t},\n\t// deprecated since 0.4.4\n\t_sceneData: {\n\t\tconfigurable: true,\n\t\tget: function() {\n\t\t\tconsole.warn('Scene: ._sceneData has been deprecated since v0.4.4, use .collector.sceneData instead.');\n\t\t\treturn this.collector.sceneData;\n\t\t}\n\t},\n\t// deprecated since 0.4.4\n\t_lightingData: {\n\t\tconfigurable: true,\n\t\tget: function() {\n\t\t\tconsole.warn('Scene: ._lightingData has been deprecated since v0.4.4, use .collector.lightingData instead.');\n\t\t\treturn this.collector.lightingData;\n\t\t}\n\t}\n});\n\nObject.defineProperties(RenderStates.prototype, {\n\t// deprecated since 0.4.0\n\tlights: {\n\t\tconfigurable: true,\n\t\tget: function() {\n\t\t\tconsole.warn('RenderStates: .lights has been deprecated since v0.4.0, use .lighting.getGroup(0) instead.');\n\t\t\treturn this.lighting.getGroup(0);\n\t\t}\n\t}\n});\n\n// deprecated since 0.2.8\n\nconst generateUUID = MathUtils.generateUUID;\nconst isPowerOfTwo = MathUtils.isPowerOfTwo;\nconst nearestPowerOfTwo = MathUtils.nearestPowerOfTwo;\nconst nextPowerOfTwo = MathUtils.nextPowerOfTwo;\n\n// deprecated since 0.4.3\nMatrix4.prototype.inverse = function() {\n\treturn this.invert();\n};\n\n// deprecated since 0.4.3\nMatrix4.prototype.getInverse = function(m) {\n\treturn this.copy(m).invert();\n};\n\n// deprecated since 0.4.3\nMatrix4.prototype.transform = function(position, scale, quaternion) {\n\treturn this.compose(position, quaternion, scale);\n};\n\n// deprecated since 0.4.3\nMatrix3.prototype.inverse = function() {\n\treturn this.invert();\n};\n\n// deprecated since 0.4.3\nMatrix3.prototype.getInverse = function(m) {\n\treturn this.copy(m).invert();\n};\n\n// deprecated since 0.4.3\nVector3.prototype.subtract = function(a, target = new Vector3()) {\n\treturn target.set(this.x - a.x, this.y - a.y, this.z - a.z);\n};\n\n// The old version of Query API has been deprecated since 0.4.4\n\nconst QUERY_TYPE = {\n\tANY_SAMPLES_PASSED: 7000,\n\tANY_SAMPLES_PASSED_CONSERVATIVE: 7001,\n\tTIME_ELAPSED: 7002\n};\n\nlet _queryId = 0;\nclass Query extends EventDispatcher {\n\n\tconstructor() {\n\t\tsuper();\n\t\tthis.id = _queryId++;\n\t}\n\n\tdispose() {\n\t\tthis.dispatchEvent({ type: 'dispose' });\n\t}\n\n}\n\nWebGLRenderer.prototype.beginQuery = function(query, target) {\n\tthis._queries.begin(query, target);\n};\n\nWebGLRenderer.prototype.endQuery = function(query) {\n\tthis._queries.end(query);\n};\n\nWebGLRenderer.prototype.queryCounter = function(query) {\n\tthis._queries.counter(query);\n};\n\nWebGLRenderer.prototype.isTimerQueryDisjoint = function(query) {\n\treturn this._queries.isTimerDisjoint(query);\n};\n\nWebGLRenderer.prototype.isQueryResultAvailable = function(query) {\n\treturn this._queries.isResultAvailable(query);\n};\n\nWebGLRenderer.prototype.getQueryResult = function(query) {\n\treturn this._queries.getResult(query);\n};\n\nObject.defineProperties(WebGLRenderer.prototype, {\n\t_queries: {\n\t\tconfigurable: true,\n\t\tget: function() {\n\t\t\tif (this.__queries === undefined) {\n\t\t\t\tthis.__queries = new WebGLQueries(`_gl${this.id}`, this.context, this.capabilities);\n\t\t\t}\n\t\t\treturn this.__queries;\n\t\t}\n\t}\n});\n\nclass WebGLQueries extends PropertyMap {\n\n\tconstructor(prefix, gl, capabilities) {\n\t\tsuper(prefix);\n\n\t\tthis._gl = gl;\n\t\tthis._capabilities = capabilities;\n\n\t\tconst timerQuery = capabilities.timerQuery;\n\t\tconst that = this;\n\n\t\tconst onQueryDispose = event => {\n\t\t\tconst query = event.target;\n\t\t\tconst queryProperties = that.get(query);\n\n\t\t\tquery.removeEventListener('dispose', onQueryDispose);\n\n\t\t\tif (queryProperties._webglQuery) {\n\t\t\t\tif (capabilities.version > 1) {\n\t\t\t\t\tgl.deleteQuery(queryProperties._webglQuery);\n\t\t\t\t} else {\n\t\t\t\t\ttimerQuery.deleteQueryEXT(queryProperties._webglQuery);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthat.delete(query);\n\t\t};\n\n\t\tthis._onQueryDispose = onQueryDispose;\n\n\t\tthis._typeToGL = {\n\t\t\t[QUERY_TYPE.ANY_SAMPLES_PASSED]: 0x8C2F,\n\t\t\t[QUERY_TYPE.ANY_SAMPLES_PASSED_CONSERVATIVE]: 0x8D6A,\n\t\t\t[QUERY_TYPE.TIME_ELAPSED]: 0x88BF\n\t\t};\n\t}\n\n\t_get(query) {\n\t\tconst capabilities = this._capabilities;\n\n\t\tconst queryProperties = this.get(query);\n\n\t\tif (queryProperties._webglQuery === undefined) {\n\t\t\tquery.addEventListener('dispose', this._onQueryDispose);\n\n\t\t\tqueryProperties._webglQuery = capabilities.version > 1 ? this._gl.createQuery() : capabilities.timerQuery.createQueryEXT();\n\t\t\tqueryProperties._target = null;\n\t\t\tqueryProperties._result = null;\n\t\t}\n\n\t\treturn queryProperties;\n\t}\n\n\tbegin(query, target) {\n\t\tconst capabilities = this._capabilities;\n\t\tconst typeToGL = this._typeToGL;\n\n\t\tconst queryProperties = this._get(query);\n\n\t\tif (capabilities.version > 1) {\n\t\t\tthis._gl.beginQuery(typeToGL[target], queryProperties._webglQuery);\n\t\t} else {\n\t\t\tcapabilities.timerQuery.beginQueryEXT(typeToGL[target], queryProperties._webglQuery);\n\t\t}\n\n\t\tqueryProperties._target = target;\n\t\tqueryProperties._result = null; // clear the last result.\n\t}\n\n\tend(query) {\n\t\tconst capabilities = this._capabilities;\n\t\tconst typeToGL = this._typeToGL;\n\n\t\tconst queryProperties = this._get(query);\n\n\t\tif (capabilities.version > 1) {\n\t\t\tthis._gl.endQuery(typeToGL[queryProperties._target]);\n\t\t} else {\n\t\t\tcapabilities.timerQuery.endQueryEXT(typeToGL[queryProperties._target]);\n\t\t}\n\t}\n\n\tcounter(query) {\n\t\tconst timerQuery = this._capabilities.timerQuery;\n\n\t\tconst queryProperties = this._get(query);\n\n\t\ttimerQuery.queryCounterEXT(queryProperties._webglQuery, timerQuery.TIMESTAMP_EXT);\n\n\t\tqueryProperties._target = timerQuery.TIMESTAMP_EXT;\n\t\tqueryProperties._result = null; // clear the last result.\n\t}\n\n\tisResultAvailable(query) {\n\t\tconst gl = this._gl;\n\t\tconst capabilities = this._capabilities;\n\t\tconst timerQuery = capabilities.timerQuery;\n\n\t\tconst queryProperties = this._get(query);\n\n\t\tlet available;\n\t\tif (capabilities.version > 1) {\n\t\t\tavailable = gl.getQueryParameter(queryProperties._webglQuery, gl.QUERY_RESULT_AVAILABLE);\n\t\t} else {\n\t\t\tavailable = timerQuery.getQueryObjectEXT(queryProperties._webglQuery, timerQuery.QUERY_RESULT_AVAILABLE);\n\t\t}\n\n\t\treturn available;\n\t}\n\n\tisTimerDisjoint() {\n\t\treturn this._gl.getParameter(this._capabilities.timerQuery.GPU_DISJOINT_EXT);\n\t}\n\n\tgetResult(query) {\n\t\tconst gl = this._gl;\n\t\tconst capabilities = this._capabilities;\n\t\tconst timerQuery = capabilities.timerQuery;\n\n\t\tconst queryProperties = this._get(query);\n\n\t\tif (queryProperties._result === null) {\n\t\t\tif (capabilities.version > 1) {\n\t\t\t\tqueryProperties._result = gl.getQueryParameter(queryProperties._webglQuery, gl.QUERY_RESULT);\n\t\t\t} else {\n\t\t\t\tqueryProperties._result = timerQuery.getQueryObjectEXT(queryProperties._webglQuery, timerQuery.QUERY_RESULT_EXT);\n\t\t\t}\n\t\t}\n\n\t\treturn queryProperties._result;\n\t}\n\n}\n\n// deprecated since 0.5.0\nWebGLRenderer.prototype.clear = function(color, depth, stencil) {\n\tconst gl = this.context;\n\n\tlet bits = 0;\n\n\tif (color === undefined || color) bits |= gl.COLOR_BUFFER_BIT;\n\tif (depth === undefined || depth) bits |= gl.DEPTH_BUFFER_BIT;\n\tif (stencil === undefined || stencil) bits |= gl.STENCIL_BUFFER_BIT;\n\n\tif (bits > 0) { // Prevent warning when bits is equal to zero\n\t\tgl.clear(bits);\n\t}\n};\n\n// deprecated since 0.5.0\nWebGLRenderer.prototype.setClearColor = function(r, g, b, a, premultipliedAlpha) {\n\tthis._state.colorBuffer.setClear(r, g, b, a, premultipliedAlpha);\n};\n\n// deprecated since 0.5.0\nWebGLRenderer.prototype.getClearColor = function() {\n\treturn this._state.colorBuffer.getClear();\n};\n\n// deprecated since 0.5.0\nWebGLRenderer.prototype.setRenderTarget = function(renderTarget) {\n\tthis._renderTargets.setRenderTarget(renderTarget);\n};\n\n// deprecated since 0.5.0\nWebGLRenderer.prototype.getRenderTarget = function() {\n\treturn this._state.currentRenderTarget;\n};\n\n// deprecated since 0.5.0\nWebGLRenderer.prototype.setOcclusionQuerySet = function(querySet) {\n\tthis._currentOcclusionQuerySet = querySet;\n};\n\n// deprecated since 0.5.0\nWebGLRenderer.prototype.setTimestampWrites = function(querySet, beginIndex = 0, endIndex = 1) {\n\tthis._currentTimestampWrites.querySet = querySet;\n\tthis._currentTimestampWrites.beginningOfPassWriteIndex = beginIndex;\n\tthis._currentTimestampWrites.endOfPassWriteIndex = endIndex;\n};\n\n// deprecated since 0.5.0\nWebGLRenderer.prototype.updateRenderTargetMipmap = function(renderTarget) {\n\tif (renderTarget.texture) {\n\t\tthis.generateMipmaps(renderTarget.texture);\n\t}\n};\n\nObject.defineProperties(OffscreenRenderTarget.prototype, {\n\t// deprecated since 0.5.0\n\tdepth: {\n\t\tconfigurable: true,\n\t\tget: function() {\n\t\t\tconsole.warn('OffscreenRenderTarget: .depth property is deprecated.');\n\t\t\treturn 1;\n\t\t}\n\t}\n});\n\n// deprecated since 0.5.0\nclass RenderTarget2D extends OffscreenRenderTarget {\n\n\tconstructor(width, height) {\n\t\tsuper(width, height);\n\n\t\tthis.attach(new Texture2D(), ATTACHMENT.COLOR_ATTACHMENT0);\n\t\tthis.attach(new RenderBuffer(width, height, PIXEL_FORMAT.DEPTH_STENCIL), ATTACHMENT.DEPTH_STENCIL_ATTACHMENT);\n\t}\n\n}\nRenderTarget2D.prototype.isRenderTarget2D = true;\n\n// deprecated since 0.5.0\nclass RenderTargetCube extends OffscreenRenderTarget {\n\n\tconstructor(width, height) {\n\t\tsuper(width, height);\n\n\t\tthis.attach(new TextureCube(), ATTACHMENT.COLOR_ATTACHMENT0);\n\t\tthis.attach(new RenderBuffer(width, height, PIXEL_FORMAT.DEPTH_STENCIL), ATTACHMENT.DEPTH_STENCIL_ATTACHMENT);\n\t}\n\n}\nRenderTargetCube.prototype.isRenderTargetCube = true;\n\n// deprecated since 0.5.0\nclass RenderTarget3D extends OffscreenRenderTarget {\n\n\tconstructor(width, height, depth) {\n\t\tsuper(width, height);\n\n\t\tconst texture = new Texture3D();\n\t\ttexture.resizeAsAttachment(width, height, depth);\n\t\tthis.attach(texture, ATTACHMENT.COLOR_ATTACHMENT0);\n\t}\n\n}\nRenderTarget3D.prototype.isRenderTarget3D = true;\n\n// deprecated since 0.5.0\nclass RenderTarget2DArray extends OffscreenRenderTarget {\n\n\tconstructor(width, height, depth) {\n\t\tsuper(width, height);\n\n\t\tconst texture = new Texture2DArray();\n\t\ttexture.resizeAsAttachment(width, height, depth);\n\t\tthis.attach(texture, ATTACHMENT.COLOR_ATTACHMENT0);\n\t}\n\n}\nRenderTarget2DArray.prototype.isRenderTarget2DArray = true;\n\n// deprecated since 0.5.0\nScreenRenderTarget.prototype.isRenderTargetBack = true;\n\nexport { ATTACHMENT, AmbientLight, AnimationAction, AnimationMixer, Attribute, BLEND_EQUATION, BLEND_FACTOR, BLEND_TYPE, BUFFER_USAGE, BasicMaterial, Bone, BooleanKeyframeTrack, Box2, Box3, BoxGeometry, Buffer, COMPARE_FUNC, CULL_FACE_TYPE, Camera, CameraProjection, Color3, Color4, ColorKeyframeTrack, CubicSplineInterpolant, CylinderGeometry, DRAW_MODE, DRAW_SIDE, DefaultLoadingManager, DepthMaterial, DirectionalLight, DirectionalLightShadow, DistanceMaterial, ENVMAP_COMBINE_TYPE, Euler, EventDispatcher, FileLoader, Fog, FogExp2, Frustum, Geometry, HemisphereLight, ImageLoader, KeyframeClip, KeyframeInterpolant, KeyframeTrack, LambertMaterial, Light, LightShadow, LineMaterial, LinearInterpolant, Loader, LoadingManager, MATERIAL_TYPE, Material, MathUtils, Matrix3, Matrix4, Mesh, NumberKeyframeTrack, OPERATION, Object3D, OffscreenRenderTarget, OrthographicProjection, PBR2Material, PBRMaterial, PIXEL_FORMAT, PIXEL_TYPE, PerspectiveProjection, PhongMaterial, Plane, PlaneGeometry, PointLight, PointLightShadow, PointsMaterial, PropertyBindingMixer, PropertyMap, QUERYSET_TYPE, QUERY_TYPE, Quaternion, QuaternionCubicSplineInterpolant, QuaternionKeyframeTrack, QuaternionLinearInterpolant, Query, QuerySet, Ray, Raycaster, RectAreaLight, RenderBuffer, RenderInfo, RenderQueue, RenderQueueLayer, RenderStates, RenderTarget2D, RenderTarget2DArray, RenderTarget3D, ScreenRenderTarget as RenderTargetBack, RenderTargetBase, RenderTargetCube, SHADING_TYPE, SHADOW_TYPE, Scene, SceneData, ScreenRenderTarget, ShaderChunk, ShaderLib, ShaderMaterial, ShaderPostPass, ShadowMapPass, Skeleton, SkinnedMesh, Sphere, SphereGeometry, Spherical, SphericalHarmonics3, SphericalHarmonicsLight, SpotLight, SpotLightShadow, StepInterpolant, StringKeyframeTrack, TEXEL_ENCODING_TYPE, TEXTURE_FILTER, TEXTURE_WRAP, Texture2D, Texture2DArray, Texture3D, TextureBase, TextureCube, ThinRenderer, TorusKnotGeometry, TransformUV, Triangle, VERTEX_COLOR, Vector2, Vector3, Vector4, VectorKeyframeTrack, WebGLAttribute, WebGLCapabilities, WebGLGeometries, WebGLProgram, WebGLPrograms, WebGLQueries, WebGLQuerySets, WebGLRenderBuffers, WebGLRenderer, WebGLState, WebGLTextures, WebGLUniforms, cloneJson, cloneUniforms, generateUUID, isPowerOfTwo, nearestPowerOfTwo, nextPowerOfTwo };\n"
  },
  {
    "path": "eslint.config.mjs",
    "content": "import js from '@eslint/js';\nimport importPlugin from 'eslint-plugin-import';\nimport jsdoc from 'eslint-plugin-jsdoc';\nimport html from 'eslint-plugin-html';\nimport globals from 'globals';\n\nexport default [\n\tjs.configs.recommended,\n\t{\n\t\tignores: [\n\t\t\t'build/**',\n\t\t\t'node_modules/**',\n\t\t\t'examples/libs/**'\n\t\t]\n\t},\n\t{\n\t\tlanguageOptions: {\n\t\t\tglobals: {\n\t\t\t\t...globals.browser,\n\t\t\t\t...globals.node\n\t\t\t},\n\t\t\tecmaVersion: 2018,\n\t\t\tsourceType: 'module'\n\t\t},\n\t\tplugins: {\n\t\t\timport: importPlugin\n\t\t},\n\t\trules: {\n\t\t\t/* Override eslint:recommended */\n\n\t\t\t// modified: sometimes use while(true) and break inside\n\t\t\t'no-constant-condition': ['error', {\n\t\t\t\tcheckLoops: false\n\t\t\t}],\n\n\t\t\t// modified: set allowEmptyCase to true to allow empty cases\n\t\t\t'no-fallthrough': ['error', {\n\t\t\t\tallowEmptyCase: true\n\t\t\t}],\n\n\t\t\t// modified: sometimes use function inside function\n\t\t\t'no-inner-declarations': 'off',\n\n\t\t\t'no-irregular-whitespace': ['error', {\n\t\t\t\tskipStrings: true,\n\t\t\t\tskipComments: false,\n\t\t\t\tskipRegExps: true,\n\t\t\t\tskipTemplates: true\n\t\t\t}],\n\n\t\t\t// modified: sometimes use object.hasOwnProperty\n\t\t\t'no-prototype-builtins': 'off',\n\n\t\t\t// modified: ignore in some cases\n\t\t\t'no-unused-vars': ['error', {\n\t\t\t\tvars: 'all',\n\t\t\t\targs: 'none',\n\t\t\t\tcaughtErrors: 'none',\n\t\t\t\tignoreRestSiblings: true\n\t\t\t}],\n\n\t\t\t// modified: set allowEmptyCatch to true to allow empty catch blocks\n\t\t\t'no-empty': ['error', { allowEmptyCatch: true }],\n\n\t\t\t/* Possible Problems */\n\n\t\t\t'array-callback-return': 'error',\n\t\t\t'no-template-curly-in-string': 'error',\n\n\t\t\t/* Suggestions */\n\n\t\t\t'curly': ['warn', 'multi-line', 'consistent'],\n\t\t\t'comma-dangle': ['warn', 'never'],\n\t\t\t'arrow-parens': ['warn', 'as-needed'],\n\n\t\t\t'func-name-matching': ['warn', 'always', {\n\t\t\t\tincludeCommonJSModuleExports: false\n\t\t\t}],\n\n\t\t\t'no-var': 'warn',\n\n\t\t\t'prefer-const': ['warn', {\n\t\t\t\tdestructuring: 'all',\n\t\t\t\tignoreReadBeforeAssign: false\n\t\t\t}],\n\n\t\t\t'new-cap': ['warn', {\n\t\t\t\tnewIsCap: true,\n\t\t\t\tcapIsNew: false,\n\t\t\t\tproperties: true\n\t\t\t}],\n\n\t\t\t'max-depth': ['warn', 5],\n\t\t\t'max-nested-callbacks': ['warn', 3],\n\n\t\t\t/* Layout & Formatting */\n\n\t\t\t'array-bracket-spacing': ['warn', 'never'],\n\t\t\t'block-spacing': ['warn', 'always'],\n\n\t\t\t'brace-style': ['warn', '1tbs', {\n\t\t\t\tallowSingleLine: true\n\t\t\t}],\n\n\t\t\t'comma-spacing': ['warn', {\n\t\t\t\tbefore: false,\n\t\t\t\tafter: true\n\t\t\t}],\n\n\t\t\t'comma-style': ['warn', 'last'],\n\t\t\t'computed-property-spacing': ['warn', 'never'],\n\t\t\t'func-call-spacing': ['warn', 'never'],\n\n\t\t\t'indent': ['warn', 'tab', {\n\t\t\t\tSwitchCase: 1\n\t\t\t}],\n\n\t\t\t'key-spacing': ['warn', {\n\t\t\t\tbeforeColon: false,\n\t\t\t\tafterColon: true,\n\t\t\t\tmode: 'strict'\n\t\t\t}],\n\n\t\t\t'new-parens': 'warn',\n\t\t\t'no-trailing-spaces': 'warn',\n\t\t\t'no-whitespace-before-property': 'warn',\n\t\t\t'object-curly-spacing': ['warn', 'always'],\n\n\t\t\t'padded-blocks': ['warn', {\n\t\t\t\tblocks: 'never',\n\t\t\t\tclasses: 'always',\n\t\t\t\tswitches: 'never'\n\t\t\t}],\n\n\t\t\t'semi': ['warn', 'always', {\n\t\t\t\tomitLastInOneLineBlock: true\n\t\t\t}],\n\n\t\t\t'semi-spacing': ['warn', {\n\t\t\t\tbefore: false,\n\t\t\t\tafter: true\n\t\t\t}],\n\n\t\t\t'space-before-blocks': ['warn', 'always'],\n\n\t\t\t'space-before-function-paren': ['warn', {\n\t\t\t\tanonymous: 'never',\n\t\t\t\tnamed: 'never',\n\t\t\t\tasyncArrow: 'ignore'\n\t\t\t}],\n\n\t\t\t'space-in-parens': ['warn', 'never'],\n\t\t\t'space-infix-ops': 'warn',\n\n\t\t\t'space-unary-ops': ['warn', {\n\t\t\t\twords: true,\n\t\t\t\tnonwords: false\n\t\t\t}],\n\n\t\t\t'keyword-spacing': ['warn', {\n\t\t\t\tbefore: true,\n\t\t\t\tafter: true\n\t\t\t}],\n\n\t\t\t'spaced-comment': ['warn', 'always', {\n\t\t\t\tblock: {\n\t\t\t\t\texceptions: ['*'],\n\t\t\t\t\tbalanced: true\n\t\t\t\t}\n\t\t\t}],\n\n\t\t\t'switch-colon-spacing': ['warn', {\n\t\t\t\tafter: true,\n\t\t\t\tbefore: false\n\t\t\t}],\n\n\t\t\t'template-tag-spacing': ['warn', 'never'],\n\n\t\t\t'arrow-spacing': ['warn', {\n\t\t\t\tbefore: true,\n\t\t\t\tafter: true\n\t\t\t}],\n\n\t\t\t'generator-star-spacing': ['warn', {\n\t\t\t\tbefore: false,\n\t\t\t\tafter: true\n\t\t\t}],\n\n\t\t\t'rest-spread-spacing': ['warn', 'never'],\n\t\t\t'template-curly-spacing': ['warn', 'never'],\n\t\t\t'yield-star-spacing': ['warn', 'after'],\n\t\t\t'no-multi-spaces': 'warn',\n\t\t\t'quotes': ['warn', 'single'],\n\t\t\t'semi-style': ['warn', 'last'],\n\n\t\t\t'no-multiple-empty-lines': ['warn', {\n\t\t\t\tmax: 3,\n\t\t\t\tmaxEOF: 1,\n\t\t\t\tmaxBOF: 1\n\t\t\t}],\n\n\t\t\t// \"eol-last\": [\"warn\", \"always\"],\n\n\t\t\t/* Import(plugin) */\n\n\t\t\t'import/extensions': ['warn', 'always']\n\t\t}\n\t},\n\t{\n\t\tfiles: ['src/**/*.js', 'examples/jsm/**/*.js'],\n\t\t...jsdoc.configs['flat/recommended']\n\t},\n\t{\n\t\tfiles: ['src/**/*.js', 'examples/jsm/**/*.js'],\n\t\tsettings: {\n\t\t\tjsdoc: {\n\t\t\t\ttagNamePreference: {\n\t\t\t\t\taugments: 'extends'\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\trules: {\n\t\t\t/* JSDoc(plugin) */\n\n\t\t\t'jsdoc/no-defaults': 0,\n\t\t\t'jsdoc/no-undefined-types': 0,\n\t\t\t'jsdoc/require-jsdoc': 0,\n\t\t\t'jsdoc/require-param-description': 0,\n\t\t\t'jsdoc/require-property-description': 0,\n\t\t\t'jsdoc/require-returns-check': 0,\n\t\t\t'jsdoc/require-returns-description': 0,\n\t\t\t'jsdoc/reject-any-type': 'off',\n\t\t\t'jsdoc/reject-function-type': 'off'\n\t\t}\n\t},\n\t{\n\t\tfiles: ['examples/**/*.html', 'tests/**/*.html'],\n\t\tplugins: { html }\n\t},\n\t{\n\t\tfiles: ['examples/**/*.html'],\n\t\tlanguageOptions: {\n\t\t\tglobals: {\n\t\t\t\tNanobar: 'readonly',\n\t\t\t\tSimplexNoise: 'readonly'\n\t\t\t}\n\t\t}\n\t},\n\t{\n\t\tfiles: ['tests/**/*.js'],\n\t\tlanguageOptions: {\n\t\t\tglobals: {\n\t\t\t\tQUnit: 'readonly'\n\t\t\t}\n\t\t}\n\t}\n];"
  },
  {
    "path": "examples/animation_blending_additive.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>t3d - animation blending additive</title>\n\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n\t<link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n</head>\n<body>\n    <div id=\"info\">\n        <a href=\"\" target=\"_blank\">t3d</a> - animation blending additive\n\t\t<br/>\n\t\tmodel from <a href=\"https://www.mixamo.com/\" target=\"_blank\">mixamo.com</a>\n    </div>\n\n\t<script src=\"./libs/nanobar.js\"></script>\n\n\t<!-- Import maps polyfill -->\n    <!-- Remove this when import maps will be widely supported -->\n    <script async src=\"./libs/es-module-shims.js\"></script>\n\n    <script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n    <script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { Clock } from 't3d/addons/Clock.js';\n\t\timport { GLTFLoader } from 't3d/addons/loaders/glTF/GLTFLoader.js';\n\t\timport { OrbitControls } from 't3d/addons/controls/OrbitControls.js';\n\t\timport { ForwardRenderer } from 't3d/addons/render/ForwardRenderer.js';\n\t\timport { GUI } from './libs/lil-gui.esm.min.js';\n\t\timport Stats from './libs/stats.module.js';\n\n\t\tconst devicePixelRatio = window.devicePixelRatio;\n\n\t\tlet width = window.innerWidth || 2;\n\t\tlet height = window.innerHeight || 2;\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = Math.floor(width * devicePixelRatio);\n\t\tcanvas.height = Math.floor(height * devicePixelRatio);\n\t\tcanvas.style.width = width + 'px';\n\t\tcanvas.style.height = height + 'px';\n\t\tdocument.body.appendChild(canvas);\n\n\t\tconst forwardRenderer = new ForwardRenderer(canvas);\n\t\tforwardRenderer.screenRenderTarget.setColorClearValue(0.6, 0.7, 0.8, 1);\n\n\t\tconst scene = new t3d.Scene();\n\t\tscene.fog = new t3d.Fog(undefined, 10, 100);\n\t\tscene.fog.color.setRGB(0.6, 0.7, 0.8);\n\n\t\tlet mixer;\n\t\tconst params = { timeScale: 1 };\n\n\t\tclass AnimationPoseAction extends t3d.AnimationAction {\n\n\t\t\tconstructor(clip) {\n\t\t\t\tsuper(clip);\n\t\t\t}\n\n\t\t\tupdate(deltaTime) {\n\t\t\t\t// empty\n\t\t\t}\n\n\t\t}\n\n\t\t// same as Array.prototype.slice, but also works on typed arrays\n\t\tfunction arraySlice(array, from, to) {\n\t\t\tif (ArrayBuffer.isView(array) && !(array instanceof DataView)) {\n\t\t\t\t// in ios9 array.subarray(from, undefined) will return empty array\n\t\t\t\t// but array.subarray(from) or array.subarray(from, len) is correct\n\t\t\t\treturn new array.constructor(array.subarray(from, to !== undefined ? to : array.length));\n\t\t\t}\n\n\t\t\treturn array.slice(from, to);\n\t\t}\n\n\t\tfunction makeClipAdditive(clip) {\n\t\t\tfor (let i = 0; i < clip.tracks.length; i++) {\n\t\t\t\tconst track = clip.tracks[i];\n\n\t\t\t\t// Get frame 0 as reference value\n\t\t\t\tconst referenceValue = arraySlice(track.values, 0, track.valueSize);\n\n\t\t\t\tif (track.valueTypeName === 'quaternion') {\n\t\t\t\t\tconst referenceQuat = new t3d.Quaternion().fromArray(referenceValue).normalize();\n\t\t\t\t\treferenceQuat.x *= -1;\n\t\t\t\t\treferenceQuat.y *= -1;\n\t\t\t\t\treferenceQuat.z *= -1;\n\t\t\t\t\treferenceQuat.toArray(referenceValue);\n\t\t\t\t}\n\n\t\t\t\tconst numTimes = track.times.length;\n\t\t\t\tfor (let j = 0; j < numTimes; j++) {\n\t\t\t\t\tconst valueStart = j * track.valueSize;\n\t\t\t\t\tif (track.valueTypeName === 'quaternion') {\n\t\t\t\t\t\tt3d.Quaternion.multiplyQuaternionsFlat(\n\t\t\t\t\t\t\ttrack.values,\n\t\t\t\t\t\t\tvalueStart,\n\t\t\t\t\t\t\treferenceValue,\n\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\ttrack.values,\n\t\t\t\t\t\t\tvalueStart\n\t\t\t\t\t\t);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconst valueEnd = track.valueSize;\n\t\t\t\t\t\tfor (let k = 0; k < valueEnd; k++) {\n\t\t\t\t\t\t\ttrack.values[valueStart + k] -= referenceValue[k];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn clip;\n\t\t}\n\n\t\tconst nanobar = new Nanobar();\n\t\tnanobar.el.style.background = 'gray';\n\n\t\tconst loadingManager = new t3d.LoadingManager(function() {\n\t\t\tnanobar.go(100);\n\t\t\tnanobar.el.style.background = 'transparent';\n\t\t}, function(url, itemsLoaded, itemsTotal) {\n\t\t\tif (itemsLoaded < itemsTotal) {\n\t\t\t\tnanobar.go(itemsLoaded / itemsTotal * 100);\n\t\t\t}\n\t\t});\n\n\t\tconst loader = new GLTFLoader(loadingManager);\n\t\tloader.load('./resources/models/gltf/Xbot.glb').then(function(result) {\n\t\t\tconst object = result.root;\n\n\t\t\tobject.traverse(function(node) {\n\t\t\t\tif (node.isMesh) {\n\t\t\t\t\tnode.castShadow = true;\n\t\t\t\t\tnode.frustumCulled = false;\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tconst baseArray = ['idle', 'walk', 'run'];\n\t\t\tconst poseArray = ['sneak_pose', 'sad_pose', 'agree', 'headShake'];\n\n\t\t\tmixer = new t3d.AnimationMixer();\n\n\t\t\tconst actionMap = {};\n\t\t\tresult.animations.forEach(function(clip) {\n\t\t\t\tlet action;\n\t\t\t\tconst isAdditive = poseArray.indexOf(clip.name) > -1;\n\t\t\t\tclip = isAdditive ? makeClipAdditive(clip) : clip;\n\t\t\t\tif (clip.name.indexOf('_pose') > -1) {\n\t\t\t\t\taction = new AnimationPoseAction(clip);\n\t\t\t\t\taction.time = action.clip.duration;\n\t\t\t\t} else {\n\t\t\t\t\taction = new t3d.AnimationAction(clip);\n\t\t\t\t\taction.time = 0;\n\t\t\t\t}\n\t\t\t\taction.blendMode = isAdditive ? t3d.BLEND_TYPE.ADD : t3d.BLEND_TYPE.NORMAL;\n\t\t\t\tactionMap[action.clip.name] = action;\n\t\t\t\tmixer.addAction(action);\n\t\t\t});\n\n\t\t\tactionMap['idle'].weight = 1;\n\n\t\t\tconst gui = new GUI();\n\n\t\t\tconst options = ['none'].concat(baseArray);\n\n\t\t\tgui.add({ baseAction: 'idle' }, 'baseAction', options).onChange(value => {\n\t\t\t\tbaseArray.forEach(baseName => {\n\t\t\t\t\tactionMap[baseName].weight = (baseName === value) ? 1 : 0;\n\t\t\t\t});\n\t\t\t});\n\t\t\tgui.add(params, 'timeScale', -2, 2, 0.1);\n\n\t\t\tconst additiveFolder = gui.addFolder('Additive Actions');\n\t\t\tposeArray.forEach(poseName => {\n\t\t\t\tadditiveFolder.add(actionMap[poseName], 'weight', 0, 1, 0.01).name(poseName);\n\t\t\t});\n\n\t\t\tscene.add(object);\n\t\t}).catch(e => console.error(e));\n\n\t\tconst plane_geometry = new t3d.PlaneGeometry(1000, 1000);\n\t\tconst plane_material = new t3d.PBRMaterial();\n\t\tplane_material.roughness = 1;\n\t\tplane_material.diffuse.setHex(0x888888);\n\t\tplane_material.dithering = true;\n\t\tconst plane = new t3d.Mesh(plane_geometry, plane_material);\n\t\tplane.receiveShadow = true;\n\t\tscene.add(plane);\n\n\t\tconst ambientLight = new t3d.AmbientLight(undefined, 0.5);\n\t\tambientLight.color.setRGB(0.6, 0.7, 0.8);\n\t\tscene.add(ambientLight);\n\n\t\tconst directionalLight = new t3d.DirectionalLight(0xffffff, 1);\n\t\tdirectionalLight.position.set(-4, 5, 4);\n\t\tdirectionalLight.lookAt(new t3d.Vector3(), new t3d.Vector3(0, 1, 0));\n\t\tdirectionalLight.shadow.windowSize = 3;\n\t\tdirectionalLight.shadow.cameraNear = 2;\n\t\tdirectionalLight.shadow.cameraFar = 20;\n\t\tdirectionalLight.castShadow = true;\n\t\tscene.add(directionalLight);\n\n\t\tconst camera = new t3d.Camera();\n\t\tcamera.outputEncoding = t3d.TEXEL_ENCODING_TYPE.SRGB;\n\t\tcamera.position.set(0, 2, 3);\n\t\tcamera.lookAt(new t3d.Vector3(0, 1, 0), new t3d.Vector3(0, 1, 0));\n\t\tcamera.setPerspective(60 / 180 * Math.PI, width / height, 0.1, 100);\n\t\tscene.add(camera);\n\n\t\tconst controller = new OrbitControls(camera, canvas);\n\t\tcontroller.target.set(0, 1, 0);\n\n\t\t// stats\n\t\tconst stats = new Stats();\n\t\tstats.showPanel(0);\n\t\tdocument.body.appendChild(stats.dom);\n\n\t\tconst clock = new Clock();\n\n\t\tfunction loop(count) {\n\t\t\trequestAnimationFrame(loop);\n\n\t\t\tstats.begin();\n\n\t\t\tcontroller.update();\n\n\t\t\tconst deltaTime = clock.getDelta();\n\t\t\tmixer && mixer.update(deltaTime * params.timeScale);\n\n\t\t\tforwardRenderer.render(scene, camera);\n\n\t\t\tstats.end();\n\t\t}\n\t\trequestAnimationFrame(loop);\n\n\t\tfunction onWindowResize() {\n\t\t\twidth = window.innerWidth || 2;\n\t\t\theight = window.innerHeight || 2;\n\n\t\t\tcamera.setPerspective(60 / 180 * Math.PI, width / height, 0.1, 100);\n\n\t\t\tforwardRenderer.screenRenderTarget.resize(Math.floor(width * devicePixelRatio), Math.floor(height * devicePixelRatio));\n\n\t\t\tcanvas.style.width = width + 'px';\n\t\t\tcanvas.style.height = height + 'px';\n\t\t}\n\t\twindow.addEventListener('resize', onWindowResize, false);\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "examples/animation_bone_attach.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>t3d - animation / bone attach</title>\n\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n\t<link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n</head>\n<body>\n    <div id=\"info\">\n        <a href=\"\" target=\"_blank\">t3d</a> - animation / bone attach\n\t\t<br/>\n    </div>\n\n\t<script src=\"./libs/nanobar.js\"></script>\n\n\t<!-- Import maps polyfill -->\n    <!-- Remove this when import maps will be widely supported -->\n    <script async src=\"./libs/es-module-shims.js\"></script>\n\n    <script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n    <script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { Timer } from 't3d/addons/misc/Timer.js';\n\t\timport { GLTFLoader } from 't3d/addons/loaders/glTF/GLTFLoader.js';\n\t\timport { TextureCubeLoader } from 't3d/addons/loaders/TextureCubeLoader.js';\n\t\timport { OrbitControls } from 't3d/addons/controls/OrbitControls.js';\n\t\timport { ForwardRenderer } from 't3d/addons/render/ForwardRenderer.js';\n\t\timport { AxisHelper } from 't3d/addons/objects/AxisHelper.js';\n\t\timport { SkeletonHelper } from 't3d/addons/objects/SkeletonHelper.js';\n\t\timport { GUI } from './libs/lil-gui.esm.min.js';\n\t\timport Stats from './libs/stats.module.js';\n\n\t\tconst devicePixelRatio = window.devicePixelRatio;\n\n\t\tlet width = window.innerWidth || 2;\n\t\tlet height = window.innerHeight || 2;\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = Math.floor(width * devicePixelRatio);\n\t\tcanvas.height = Math.floor(height * devicePixelRatio);\n\t\tcanvas.style.width = width + 'px';\n\t\tcanvas.style.height = height + 'px';\n\t\tdocument.body.appendChild(canvas);\n\n\t\tconst forwardRenderer = new ForwardRenderer(canvas);\n\t\tforwardRenderer.screenRenderTarget.setColorClearValue(0.6, 0.7, 0.8, 1);\n\t\tforwardRenderer.matrixAutoUpdate = false;\n\n\t\tconst cubeTexturePath = './resources/skybox/pisa/';\n\t\tconst cubeTexture = new TextureCubeLoader().load([\n\t\t\tcubeTexturePath + 'px.png',\n\t\t\tcubeTexturePath + 'nx.png',\n\t\t\tcubeTexturePath + 'py.png',\n\t\t\tcubeTexturePath + 'ny.png',\n\t\t\tcubeTexturePath + 'pz.png',\n\t\t\tcubeTexturePath + 'nz.png'\n\t\t]);\n\t\tcubeTexture.encoding = t3d.TEXEL_ENCODING_TYPE.SRGB;\n\n\t\tconst scene = new t3d.Scene();\n\t\tscene.fog = new t3d.Fog(undefined, 10, 100);\n\t\tscene.fog.color.setRGB(0.6, 0.7, 0.8);\n\t\tscene.environment = cubeTexture;\n\n\t\tconst camera = new t3d.Camera();\n\t\tcamera.outputEncoding = t3d.TEXEL_ENCODING_TYPE.SRGB;\n\t\tcamera.position.set(3, 2, 3);\n\t\tcamera.lookAt(new t3d.Vector3(0, 2, 0), new t3d.Vector3(0, 1, 0));\n\t\tcamera.setPerspective(60 / 180 * Math.PI, width / height, 0.1, 100);\n\t\tscene.add(camera);\n\n\t\tconst controller = new OrbitControls(camera, canvas);\n\t\tcontroller.target.set(0, 1.5, 0);\n\n\t\tconst ambientLight = new t3d.AmbientLight(0xffffff, 0.4);\n\t\tscene.add(ambientLight);\n\n\t\tconst directionalLight = new t3d.DirectionalLight(0xffffff, 1);\n\t\tdirectionalLight.position.set(-4, 5, 4);\n\t\tdirectionalLight.lookAt(new t3d.Vector3(), new t3d.Vector3(0, 1, 0));\n\t\tdirectionalLight.shadow.windowSize = 8;\n\t\tdirectionalLight.shadow.cameraNear = 2;\n\t\tdirectionalLight.shadow.cameraFar = 20;\n\t\tdirectionalLight.castShadow = true;\n\t\tscene.add(directionalLight);\n\n\t\t// ground\n\n\t\tconst groundGeometry = new t3d.PlaneGeometry(1000, 1000);\n\t\tconst groundMaterial = new t3d.PBRMaterial();\n\t\tgroundMaterial.roughness = 1;\n\t\tgroundMaterial.diffuse.setHex(0x888888);\n\t\tconst plane = new t3d.Mesh(groundGeometry, groundMaterial);\n\t\tplane.receiveShadow = true;\n\t\tscene.add(plane);\n\n\t\t// models\n\n\t\tconst nanobar = new Nanobar();\n\t\tnanobar.el.style.background = 'gray';\n\n\t\tconst loadingManager = new t3d.LoadingManager(function() {\n\t\t\tnanobar.go(100);\n\t\t\tnanobar.el.style.background = 'transparent';\n\t\t}, function(url, itemsLoaded, itemsTotal) {\n\t\t\tif (itemsLoaded < itemsTotal) {\n\t\t\t\tnanobar.go(itemsLoaded / itemsTotal * 100);\n\t\t\t}\n\t\t});\n\n\t\tlet mixer = null, swordSlot = null;\n\n\t\tconst params = { timeScale: 1 };\n\n\t\tconst loader = new GLTFLoader(loadingManager);\n\t\tloader.load(\n\t\t\t'./resources/models/gltf/UinoSpaceman/glTF-Binary/UinoSpaceman.glb'\n\t\t).then(function(result) {\n\t\t\tconst object = result.root;\n\t\t\n\t\t\tobject.traverse(function(node) {\n\t\t\t\tif (node.isMesh) {\n\t\t\t\t\tnode.castShadow = true;\n\t\t\t\t\tnode.frustumCulled = false;\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tswordSlot = object.getObjectByName('mixamorig_RightHand');\n\n\t\t\tconst action = new t3d.AnimationAction(result.animations[0]);\n\t\t\tmixer = new t3d.AnimationMixer();\n\t\t\taction.weight = 1;\n\t\t\tmixer.addAction(action);\n\t\t\tscene.add(object);\n\n\t\t\tconst skeletonHelper = new SkeletonHelper(scene);\n\t\t\tskeletonHelper.visible = false;\n\t\t\tscene.add(skeletonHelper);\n\n\t\t\tconst gui = new GUI();\n\t\t\tgui.add(skeletonHelper, 'visible').name('Skeleton');\n\t\t\tgui.add(swordAxis, 'visible').name('SwordAxis');\n\t\t\tgui.add(params, 'timeScale', 0, 2).name('timeScale');\n\t\t}).catch(e => console.error(e));\n\n\t\t// sword\n\n\t\tfunction createSword() {\n\t\t\tconst sword = new t3d.Object3D();\n\n\t\t\tconst bladeGeometry = new t3d.BoxGeometry(0.2, 3, 0.1);\n\t\t\tconst bladeMaterial = new t3d.PhongMaterial();\n\t\t\tbladeMaterial.diffuse.setHex(0xc0c0c0);\n\t\t\tbladeMaterial.shininess = 100;\n\t\t\tbladeMaterial.envMap = undefined;\n\t\t\tconst blade = new t3d.Mesh(bladeGeometry, bladeMaterial);\n\t\t\tblade.position.y = 2;\n\t\t\tsword.add(blade);\n\n\t\t\tconst handleGeometry = new t3d.CylinderGeometry(0.1, 0.1, 1, 16);\n\t\t\tconst handleMaterial = new t3d.PhongMaterial();\n\t\t\thandleMaterial.diffuse.setHex(0x8B4513);\n\t\t\thandleMaterial.shininess = 30;\n\t\t\thandleMaterial.envMap = undefined;\n\t\t\tconst handle = new t3d.Mesh(handleGeometry, handleMaterial);\n\t\t\thandle.position.y = 0;\n\t\t\tsword.add(handle);\n\n\t\t\tconst guardGeometry = new t3d.BoxGeometry(1, 0.2, 0.2);\n\t\t\tconst guardMaterial = new t3d.PhongMaterial();\n\t\t\tguardMaterial.diffuse.setHex(0xB8860B);\n\t\t\tguardMaterial.envMap = undefined;\n\t\t\tconst guard = new t3d.Mesh(guardGeometry, guardMaterial);\n\t\t\tguard.position.y = 0.5;\n\t\t\tsword.add(guard);\n\n\t\t\tconst tipGeometry = new t3d.CylinderGeometry(0, 0.1, 0.5, 8);\n\t\t\tconst tipMaterial = new t3d.PhongMaterial();\n\t\t\ttipMaterial.diffuse.setHex(0xc0c0c0);\n\t\t\ttipMaterial.shininess = 100;\n\t\t\ttipMaterial.envMap = undefined;\n\t\t\tconst tip = new t3d.Mesh(tipGeometry, tipMaterial);\n\t\t\ttip.position.y = 3.75;\n\t\t\ttip.euler.y = -Math.PI;\n\t\t\tsword.add(tip);\n\n\t\t\tconst pommelGeometry = new t3d.SphereGeometry(0.2, 16, 16);\n\t\t\tconst pommelMaterial = new t3d.PhongMaterial();\n\t\t\tpommelMaterial.diffuse.setHex(0xB8860B);\n\t\t\tpommelMaterial.shininess = 50;\n\t\t\tpommelMaterial.envMap = undefined;\n\t\t\tconst pommel = new t3d.Mesh(pommelGeometry, pommelMaterial);\n\t\t\tpommel.position.y = -0.5;\n\t\t\tsword.add(pommel);\n\n\t\t\treturn sword;\n\t\t}\n\n\t\tconst sword = createSword();\n\t\tsword.position.set(0, 15, 0);\n\t\tsword.scale.set(0.3, 0.3, 0.3);\n\t\tsword.euler.set(-Math.PI * 0.1, 0, -Math.PI * 0.5, 'ZYX');\n\t\tscene.add(sword);\n\n\t\tconst swordAxis = new AxisHelper(5);\n\t\tswordAxis.material.envMap = undefined;\n\t\tswordAxis.visible = false;\n\t\tsword.add(swordAxis);\n\n\t\t// stats\n\n\t\tconst stats = new Stats();\n\t\tstats.showPanel(0);\n\t\tdocument.body.appendChild(stats.dom);\n\n\t\t//\n\n\t\tconst _scale = new t3d.Vector3(1, 1, 1);\n\t\tconst _originalMatrix = new t3d.Matrix4();\n\t\tconst _boneTargetMatrix = new t3d.Matrix4();\n\n\t\tsword.updateMatrix();\n\t\t_originalMatrix.copy(sword.worldMatrix);\n\n\t\tconst timer = new Timer();\n\n\t\tfunction loop(timestamp) {\n\t\t\trequestAnimationFrame(loop);\n\n\t\t\tstats.begin();\n\n\t\t\tcontroller.update();\n\t\t\ttimer.update(timestamp);\n\n\t\t\tscene.updateMatrix();\n\n\t\t\tif (mixer) {\n\t\t\t\tmixer.update(timer.getDelta() * params.timeScale);\n\t\t\t}\n\t\t\n\t\t\tif (swordSlot) {\n\t\t\t\t_boneTargetMatrix.copy(swordSlot.worldMatrix);\n\t\t\t\t_boneTargetMatrix.multiply(_originalMatrix);\n\t\t\t\t_boneTargetMatrix.decompose(sword.position, sword.quaternion, _scale);\n\t\t\t\tsword.updateMatrix();\n\t\t\t}\n\n\t\t\tforwardRenderer.render(scene, camera);\n\n\t\t\tstats.end();\n\t\t}\n\t\trequestAnimationFrame(loop);\n\n\t\tfunction onWindowResize() {\n\t\t\twidth = window.innerWidth || 2;\n\t\t\theight = window.innerHeight || 2;\n\n\t\t\tcamera.setPerspective(60 / 180 * Math.PI, width / height, 0.1, 100);\n\n\t\t\tforwardRenderer.screenRenderTarget.resize(Math.floor(width * devicePixelRatio), Math.floor(height * devicePixelRatio));\n\n\t\t\tcanvas.style.width = width + 'px';\n\t\t\tcanvas.style.height = height + 'px';\n\t\t}\n\t\twindow.addEventListener('resize', onWindowResize, false);\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "examples/animation_crossfade.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>t3d - animation crossfade</title>\n\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n\t<link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n</head>\n<body>\n    <div id=\"info\">\n        <a href=\"\" target=\"_blank\">t3d</a> - animation crossfade\n\t\t<br/>\n\t\tmodel from <a href=\"https://www.mixamo.com/\" target=\"_blank\">mixamo.com</a>\n    </div>\n\n\t<script src=\"./libs/nanobar.js\"></script>\n\n\t<!-- Import maps polyfill -->\n    <!-- Remove this when import maps will be widely supported -->\n    <script async src=\"./libs/es-module-shims.js\"></script>\n\n    <script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n    <script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { Clock } from 't3d/addons/Clock.js';\n\t\timport { GLTFLoader } from 't3d/addons/loaders/glTF/GLTFLoader.js';\n\t\timport { OrbitControls } from 't3d/addons/controls/OrbitControls.js';\n\t\timport { ForwardRenderer } from 't3d/addons/render/ForwardRenderer.js';\n\t\timport { GUI } from './libs/lil-gui.esm.min.js';\n\t\timport Stats from './libs/stats.module.js';\n\n\t\tconst devicePixelRatio = window.devicePixelRatio;\n\n\t\tlet width = window.innerWidth || 2;\n\t\tlet height = window.innerHeight || 2;\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = Math.floor(width * devicePixelRatio);\n\t\tcanvas.height = Math.floor(height * devicePixelRatio);\n\t\tcanvas.style.width = width + 'px';\n\t\tcanvas.style.height = height + 'px';\n\t\tdocument.body.appendChild(canvas);\n\n\t\tconst forwardRenderer = new ForwardRenderer(canvas);\n\t\tforwardRenderer.screenRenderTarget.setColorClearValue(0.6, 0.7, 0.8, 1);\n\n\t\tconst scene = new t3d.Scene();\n\t\tscene.fog = new t3d.Fog(undefined, 10, 100);\n\t\tscene.fog.color.setRGB(0.6, 0.7, 0.8);\n\n\t\tlet mixer, crossFadeUpdateFunction = null;\n\t\tconst params = { timeScale: 1 }, actionMap = {}, controls = [];\n\n\t\tconst loopEvent = { type: 'loop' };\n\n\t\tclass AnimationAction extends t3d.AnimationAction {\n\n\t\t\tconstructor(clip) {\n\t\t\t\tsuper(clip);\n\t\t\t\tthis.timeScale = 1;\n\t\t\t}\n\n\t\t\tupdate(deltaTime) {\n\t\t\t\tthis.time += deltaTime * this.timeScale;\n\n\t\t\t\tconst endTime = this.clip.duration;\n\n\t\t\t\tif (this.time > endTime) {\n\t\t\t\t\tthis.time = this.time % endTime;\n\t\t\t\t\tthis.dispatchEvent(loopEvent);\n\t\t\t\t}\n\n\t\t\t\tif (this.time < 0) {\n\t\t\t\t\tthis.time = this.time % endTime + endTime;\n\t\t\t\t\tthis.dispatchEvent(loopEvent);\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\n\t\tconst nanobar = new Nanobar();\n\t\tnanobar.el.style.background = 'gray';\n\n\t\tconst loadingManager = new t3d.LoadingManager(function() {\n\t\t\tnanobar.go(100);\n\t\t\tnanobar.el.style.background = 'transparent';\n\t\t}, function(url, itemsLoaded, itemsTotal) {\n\t\t\tif (itemsLoaded < itemsTotal) {\n\t\t\t\tnanobar.go(itemsLoaded / itemsTotal * 100);\n\t\t\t}\n\t\t});\n\n\t\tconst loader = new GLTFLoader(loadingManager);\n\t\tloader.load('./resources/models/gltf/Soldier.glb').then(function(result) {\n\t\t\tconst object = result.root;\n\n\t\t\tobject.traverse(function(node) {\n\t\t\t\tif (node.isMesh) {\n\t\t\t\t\tnode.castShadow = true;\n\t\t\t\t\tnode.frustumCulled = false;\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tobject.euler.y = Math.PI;\n\n\t\t\tscene.add(object);\n\n\t\t\tmixer = new t3d.AnimationMixer();\n\n\t\t\tresult.animations.forEach(function(clip) {\n\t\t\t\tconst action = new AnimationAction(clip);\n\t\t\t\taction.time = 0;\n\t\t\t\tactionMap[action.clip.name] = action;\n\t\t\t\tmixer.addAction(action);\n\t\t\t});\n\n\t\t\tactionMap['Walk'].weight = 1;\n\n\t\t\tfunction crossFade(fadeOut, fadeIn, time = 1) {\n\t\t\t\tconst fadeOutAction = actionMap[fadeOut];\n\t\t\t\tconst fadeInAction = actionMap[fadeIn];\n\n\t\t\t\tconst fadeOutDuration = fadeOutAction.clip.duration;\n\t\t\t\tconst fadeInDuration = fadeInAction.clip.duration;\n\n\t\t\t\tconst startEndRatio = fadeOutDuration / fadeInDuration;\n\t\t\t\tconst endStartRatio = fadeInDuration / fadeOutDuration;\n\n\t\t\t\tfunction executeCrossFade() {\n\t\t\t\t\tconsole.log('cross fade start.');\n\t\t\t\t\tfadeOutAction.timeScale = 1;\n\t\t\t\t\tfadeInAction.timeScale = endStartRatio;\n\n\t\t\t\t\tfadeInAction.time = 0;\n\n\t\t\t\t\tcrossFadeUpdateFunction = function(deltaTime) {\n\t\t\t\t\t\tconst advance = deltaTime / time;\n\n\t\t\t\t\t\tfadeOutAction.timeScale += (startEndRatio - 1) * advance;\n\t\t\t\t\t\tfadeInAction.timeScale += (1 - endStartRatio) * advance;\n\n\t\t\t\t\t\tfadeOutAction.weight -= advance;\n\t\t\t\t\t\tfadeInAction.weight += advance;\n\n\t\t\t\t\t\tif (fadeOutAction.weight <= 0 || fadeInAction.weight >= 1) {\n\t\t\t\t\t\t\tfadeOutAction.weight = 0;\n\t\t\t\t\t\t\tfadeInAction.weight = 1;\n\n\t\t\t\t\t\t\tfadeOutAction.timeScale = startEndRatio;\n\t\t\t\t\t\t\tfadeInAction.timeScale = 1;\n\n\t\t\t\t\t\t\tcrossFadeUpdateFunction = null;\n\n\t\t\t\t\t\t\tconsole.log('cross fade finish.');\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tif (fadeOutAction === actionMap['Idle']) {\n\t\t\t\t\texecuteCrossFade();\n\t\t\t\t} else {\n\t\t\t\t\tfunction onLoopFinished(event) {\n\t\t\t\t\t\tfadeOutAction.removeEventListener('loop', onLoopFinished);\n\t\t\t\t\t\texecuteCrossFade();\n\t\t\t\t\t}\n\t\t\t\t\tfadeOutAction.addEventListener('loop', onLoopFinished);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst crossFadeFunctions = {\n\t\t\t\t'Walk-Idle': function() {\n\t\t\t\t\tcrossFade('Walk', 'Idle', 1.0);\n\t\t\t\t},\n\t\t\t\t'Idle-Walk': function() {\n\t\t\t\t\tcrossFade('Idle', 'Walk', 0.5);\n\t\t\t\t},\n\t\t\t\t'Walk-Run': function() {\n\t\t\t\t\tcrossFade('Walk', 'Run', 2.5);\n\t\t\t\t},\n\t\t\t\t'Run-Walk': function() {\n\t\t\t\t\tcrossFade('Run', 'Walk', 5.0);\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tconst gui = new GUI();\n\n\t\t\tgui.add(params, 'timeScale', -2, 2, 0.1);\n\n\t\t\tconst crossFadeFolder = gui.addFolder('CrossFade');\n\t\t\tfor (const key in crossFadeFunctions) {\n\t\t\t\tconst control = crossFadeFolder.add(crossFadeFunctions, key);\n\t\t\t\tcontrols.push(control);\n\t\t\t}\n\t\t\tcrossFadeFolder.open();\n\t\t}).catch(e => console.error(e));\n\n\t\tconst plane_geometry = new t3d.PlaneGeometry(1000, 1000);\n\t\tconst plane_material = new t3d.PBRMaterial();\n\t\tplane_material.roughness = 1;\n\t\tplane_material.diffuse.setHex(0x888888);\n\t\tplane_material.dithering = true;\n\t\tconst plane = new t3d.Mesh(plane_geometry, plane_material);\n\t\tplane.receiveShadow = true;\n\t\tscene.add(plane);\n\n\t\tconst ambientLight = new t3d.AmbientLight(undefined, 0.5);\n\t\tambientLight.color.setRGB(0.6, 0.7, 0.8);\n\t\tscene.add(ambientLight);\n\n\t\tconst directionalLight = new t3d.DirectionalLight(0xffffff, 1);\n\t\tdirectionalLight.position.set(-4, 5, 4);\n\t\tdirectionalLight.lookAt(new t3d.Vector3(), new t3d.Vector3(0, 1, 0));\n\t\tdirectionalLight.shadow.windowSize = 3;\n\t\tdirectionalLight.shadow.cameraNear = 2;\n\t\tdirectionalLight.shadow.cameraFar = 20;\n\t\tdirectionalLight.castShadow = true;\n\t\tscene.add(directionalLight);\n\n\t\tconst camera = new t3d.Camera();\n\t\tcamera.outputEncoding = t3d.TEXEL_ENCODING_TYPE.SRGB;\n\t\tcamera.position.set(0, 2, 3);\n\t\tcamera.lookAt(new t3d.Vector3(0, 1, 0), new t3d.Vector3(0, 1, 0));\n\t\tcamera.setPerspective(60 / 180 * Math.PI, width / height, 0.1, 100);\n\t\tscene.add(camera);\n\n\t\tconst controller = new OrbitControls(camera, canvas);\n\t\tcontroller.target.set(0, 1, 0);\n\n\t\t// stats\n\t\tconst stats = new Stats();\n\t\tstats.showPanel(0);\n\t\tdocument.body.appendChild(stats.dom);\n\n\t\tconst clock = new Clock();\n\n\t\tfunction loop(count) {\n\t\t\trequestAnimationFrame(loop);\n\n\t\t\tstats.begin();\n\n\t\t\tcontroller.update();\n\n\t\t\tconst deltaTime = clock.getDelta();\n\t\t\tmixer && mixer.update(deltaTime * params.timeScale);\n\n\t\t\tif (crossFadeUpdateFunction) {\n\t\t\t\tcrossFadeUpdateFunction(deltaTime * params.timeScale);\n\t\t\t}\n\n\t\t\tcontrols.forEach(function(control) {\n\t\t\t\tcontrol.disable();\n\t\t\t});\n\n\t\t\tif (mixer) {\n\t\t\t\tif (actionMap['Idle'].weight === 1 && actionMap['Walk'].weight === 0 && actionMap['Run'].weight === 0) {\n\t\t\t\t\tcontrols[1].enable();\n\t\t\t\t} else if (actionMap['Idle'].weight === 0 && actionMap['Walk'].weight === 1 && actionMap['Run'].weight === 0) {\n\t\t\t\t\tcontrols[0].enable();\n\t\t\t\t\tcontrols[2].enable();\n\t\t\t\t} else if (actionMap['Idle'].weight === 0 && actionMap['Walk'].weight === 0 && actionMap['Run'].weight === 1) {\n\t\t\t\t\tcontrols[3].enable();\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tforwardRenderer.render(scene, camera);\n\n\t\t\tstats.end();\n\t\t}\n\t\trequestAnimationFrame(loop);\n\n\t\tfunction onWindowResize() {\n\t\t\twidth = window.innerWidth || 2;\n\t\t\theight = window.innerHeight || 2;\n\n\t\t\tcamera.setPerspective(60 / 180 * Math.PI, width / height, 0.1, 100);\n\n\t\t\tforwardRenderer.screenRenderTarget.resize(Math.floor(width * devicePixelRatio), Math.floor(height * devicePixelRatio));\n\n\t\t\tcanvas.style.width = width + 'px';\n\t\t\tcanvas.style.height = height + 'px';\n\t\t}\n\t\twindow.addEventListener('resize', onWindowResize, false);\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "examples/animation_interpolant.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>t3d - animation interpolant</title>\n\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n\t<link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n</head>\n<body>\n    <div id=\"info\" class=\"dark\">\n        <a href=\"\" target=\"_blank\">t3d</a> - animation interpolant\n    </div>\n\n\t<script src=\"./libs/nanobar.js\"></script>\n\n\t<!-- Import maps polyfill -->\n    <!-- Remove this when import maps will be widely supported -->\n    <script async src=\"./libs/es-module-shims.js\"></script>\n\n    <script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n    <script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { Clock } from 't3d/addons/Clock.js';\n\t\timport { GLTFLoader } from 't3d/addons/loaders/glTF/GLTFLoader.js';\n\t\timport { OrbitControls } from 't3d/addons/controls/OrbitControls.js';\n\t\timport { ForwardRenderer } from 't3d/addons/render/ForwardRenderer.js';\n\t\timport Stats from './libs/stats.module.js';\n\n\t\tlet width = window.innerWidth || 2;\n\t\tlet height = window.innerHeight || 2;\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = width;\n\t\tcanvas.height = height;\n\t\tdocument.body.appendChild(canvas);\n\n\t\tconst forwardRenderer = new ForwardRenderer(canvas);\n\t\tforwardRenderer.screenRenderTarget.setColorClearValue(0.6, 0.7, 0.8, 1);\n\n\t\tconst scene = new t3d.Scene();\n\n\t\tconst mixer = new t3d.AnimationMixer();\n\n\t\tconst nanobar = new Nanobar();\n\t\tnanobar.el.style.background = 'gray';\n\n\t\tconst loadingManager = new t3d.LoadingManager(function() {\n\t\t\tnanobar.go(100);\n\t\t\tnanobar.el.style.background = 'transparent';\n\t\t}, function(url, itemsLoaded, itemsTotal) {\n\t\t\tif (itemsLoaded < itemsTotal) {\n\t\t\t\tnanobar.go(itemsLoaded / itemsTotal * 100);\n\t\t\t}\n\t\t});\n\n\t\tconst loader = new GLTFLoader(loadingManager);\n\t\tloader.load('./resources/models/gltf/InterpolationTest.glb').then(function(result) {\n\t\t\tconst object = result.root;\n\n\t\t\tscene.add(object);\n\n\t\t\tresult.animations.forEach(function(clip) {\n\t\t\t\tconst action = new t3d.AnimationAction(clip);\n\t\t\t\taction.time = 0;\n\t\t\t\taction.weight = 1;\n\t\t\t\tmixer.addAction(action);\n\t\t\t});\n\t\t}).catch(e => console.error(e));\n\n\t\tconst ambientLight = new t3d.AmbientLight(0xffffff, 0.2);\n\t\tscene.add(ambientLight);\n\n\t\tconst directionalLight = new t3d.DirectionalLight(0xffffff, 0.7);\n\t\tdirectionalLight.position.set(-20, 30, 40);\n\t\tdirectionalLight.lookAt(new t3d.Vector3(), new t3d.Vector3(0, 1, 0));\n\t\tscene.add(directionalLight);\n\n\t\tconst camera = new t3d.Camera();\n\t\tcamera.outputEncoding = t3d.TEXEL_ENCODING_TYPE.SRGB;\n\t\tcamera.position.set(0, 3, 18);\n\t\tcamera.setPerspective(60 / 180 * Math.PI, width / height, 0.1, 100);\n\t\tscene.add(camera);\n\n\t\tconst controller = new OrbitControls(camera, canvas);\n\t\tcontroller.target.set(0, 3, 0);\n\n\t\t// stats\n\t\tconst stats = new Stats();\n\t\tstats.showPanel(0);\n\t\tdocument.body.appendChild(stats.dom);\n\n\t\tconst clock = new Clock();\n\n\t\tfunction loop(count) {\n\t\t\trequestAnimationFrame(loop);\n\n\t\t\tstats.begin();\n\n\t\t\tcontroller.update();\n\n\t\t\tmixer.update(clock.getDelta() / 3);\n\n\t\t\tforwardRenderer.render(scene, camera);\n\n\t\t\tstats.end();\n\t\t}\n\t\trequestAnimationFrame(loop);\n\n\t\tfunction onWindowResize() {\n\t\t\twidth = window.innerWidth || 2;\n\t\t\theight = window.innerHeight || 2;\n\n\t\t\tcamera.setPerspective(60 / 180 * Math.PI, width / height, 0.1, 100);\n\n\t\t\tforwardRenderer.screenRenderTarget.resize(width, height);\n\t\t}\n\t\twindow.addEventListener('resize', onWindowResize, false);\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "examples/animation_keyframe_animation.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>t3d - keyframe animation</title>\n\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n\t<link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n</head>\n<body>\n    <div id=\"info\">\n        <a href=\"\" target=\"_blank\">t3d</a> - keyframe animation\n    </div>\n\n\t<!-- Import maps polyfill -->\n    <!-- Remove this when import maps will be widely supported -->\n    <script async src=\"./libs/es-module-shims.js\"></script>\n\n    <script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n    <script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { Timer } from 't3d/addons/misc/Timer.js';\n\t\timport { Texture2DLoader } from 't3d/addons/loaders/Texture2DLoader.js';\n\t\timport { ForwardRenderer } from 't3d/addons/render/ForwardRenderer.js';\n\t\timport { GUI } from './libs/lil-gui.esm.min.js';\n\n\t\tlet width = window.innerWidth || 2;\n\t\tlet height = window.innerHeight || 2;\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = width;\n\t\tcanvas.height = height;\n\t\tdocument.body.appendChild(canvas);\n\n\t\tconst forwardRenderer = new ForwardRenderer(canvas);\n\n\t\tconst scene = new t3d.Scene();\n\n\t\tconst camera = new t3d.Camera();\n\t\tcamera.position.set(0, 80, 130);\n\t\tcamera.lookAt(new t3d.Vector3(0, 0, 0), new t3d.Vector3(0, 1, 0));\n\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 1000);\n\t\tscene.add(camera);\n\n\t\tconst ambientLight = new t3d.AmbientLight(0xffffff, 0.3);\n\t\tscene.add(ambientLight);\n\n\t\tconst directionalLight = new t3d.DirectionalLight(0xffffff, 0.7);\n\t\tdirectionalLight.position.set(20, 30, 40);\n\t\tdirectionalLight.lookAt(new t3d.Vector3(), new t3d.Vector3(0, 1, 0));\n\t\tscene.add(directionalLight);\n\n\t\t// create box and plane\n\n\t\tconst texture = new Texture2DLoader().load('./resources/hardwood2_diffuse.jpg');\n\t\ttexture.wrapS = texture.wrapT = t3d.TEXTURE_WRAP.REPEAT;\n\n\t\tconst boxMaterial = new t3d.PhongMaterial();\n\t\tboxMaterial.diffuse.setHex(0xffffff);\n\t\tboxMaterial.diffuseMap = texture;\n\t\tconst box = new t3d.Mesh(new t3d.BoxGeometry(10, 10, 10), boxMaterial);\n\t\tscene.add(box);\n\n\t\tconst planeMaterial = new t3d.LambertMaterial();\n\t\tplaneMaterial.diffuse.setHex(0xffffff);\n\t\tconst plane = new t3d.Mesh(new t3d.PlaneGeometry(100, 100), planeMaterial);\n\t\tplane.position.y = -10;\n\t\tscene.add(plane);\n\n\t\t// create keyframe animation\n\n\t\tconst times = [0, 1, 2, 3, 4];\n\n\t\tconst track = new t3d.VectorKeyframeTrack(box, 'position', times, [\n\t\t\t20, 0, 20,\n\t\t\t20, 0, -20,\n\t\t\t-20, 0, -20,\n\t\t\t-20, 0, 20,\n\t\t\t20, 0, 20\n\t\t]);\n\n\t\tconst track2 = new t3d.VectorKeyframeTrack(box, 'scale', times, [\n\t\t\t0.8, 0.8, 0.8,\n\t\t\t1.5, 0.8, 0.8,\n\t\t\t1.5, 1.5, 0.8,\n\t\t\t1.5, 0.8, 0.8,\n\t\t\t0.8, 0.8, 0.8\n\t\t]);\n\n\t\tconst track3 = new t3d.QuaternionKeyframeTrack(box, 'quaternion', times, [\n\t\t\t0, 0, 0, 1,\n\t\t\t0.5, 0.5, 0.5, 0.5,\n\t\t\t0, 0, 0, 1,\n\t\t\t-0.5, -0.5, 0.5, 0.5,\n\t\t\t0, 0, 0, 1\n\t\t]);\n\n\t\tconst track4 = new t3d.ColorKeyframeTrack(box.material, 'diffuse', times, [\n\t\t\t1, 1, 1,\n\t\t\t1, 0, 0,\n\t\t\t0, 1, 0,\n\t\t\t0, 0, 1,\n\t\t\t1, 1, 1\n\t\t]);\n\n\t\tconst track5 = new t3d.VectorKeyframeTrack(box.material, 'diffuseMapTransform.offset', times, [\n\t\t\t0, 0,\n\t\t\t1, 1,\n\t\t\t2, 2,\n\t\t\t3, 3,\n\t\t\t4, 4\n\t\t]);\n\n\t\tconst tracks = [track, track2, track3, track4, track5];\n\n\t\tconst clip1 = new t3d.KeyframeClip('run', [track, track2]);\n\t\tconst clip2 = new t3d.KeyframeClip('change', [track3, track4, track5]);\n\n\t\tconst action1 = new t3d.AnimationAction(clip1);\n\t\tconst action2 = new t3d.AnimationAction(clip2);\n\n\t\tconst animation = new t3d.AnimationMixer();\n\t\tanimation.addAction(action1);\n\t\tanimation.addAction(action2);\n\n\t\taction1.time = 0;\n\t\taction1.weight = 1;\n\t\taction2.time = 0;\n\t\taction2.weight = 1;\n\n\t\t// gui\n\n\t\tconst params = { anim1: true, anim2: true, speedFactor: 1, interpolant: 'Linear' };\n\t\tconst gui = new GUI();\n\t\tgui.add(params, 'anim1').onChange(value => {\n\t\t\tif (value) {\n\t\t\t\taction1.time = 0;\n\t\t\t\taction1.weight = 1;\n\t\t\t} else {\n\t\t\t\taction1.weight = 0;\n\t\t\t}\n\t\t});\n\t\tgui.add(params, 'anim2').onChange(value => {\n\t\t\tif (value) {\n\t\t\t\taction2.time = 0;\n\t\t\t\taction2.weight = 1;\n\t\t\t} else {\n\t\t\t\taction2.weight = 0;\n\t\t\t}\n\t\t});\n\t\tgui.add(params, 'speedFactor', 0, 2, 0.01);\n\t\tgui.add(params, 'interpolant', ['Linear', 'Step']).onChange(value => {\n\t\t\tconst interpolant = value === 'Linear' ? t3d.LinearInterpolant : t3d.StepInterpolant;\n\t\t\ttracks.forEach(track => track.setInterpolant(interpolant));\n\t\t});\n\n\t\t//\n\n\t\tconst timer = new Timer();\n\n\t\tfunction loop(timestamp) {\n\t\t\trequestAnimationFrame(loop);\n\n\t\t\ttimer.update(timestamp);\n\n\t\t\tanimation.update(timer.getDelta() * params.speedFactor);\n\n\t\t\tforwardRenderer.render(scene, camera);\n\t\t}\n\t\trequestAnimationFrame(loop);\n\n\t\tfunction onWindowResize() {\n\t\t\twidth = window.innerWidth || 2;\n\t\t\theight = window.innerHeight || 2;\n\n\t\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 1000);\n\n\t\t\tforwardRenderer.screenRenderTarget.resize(width, height);\n\t\t}\n\t\twindow.addEventListener('resize', onWindowResize, false);\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "examples/animation_morphtargets.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>t3d - morph targets</title>\n\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n\t<link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n</head>\n<body>\n    <div id=\"info\">\n\t\t<a href=\"\" target=\"_blank\">t3d</a> - morph targets\n    </div>\n\n\t<!-- Import maps polyfill -->\n    <!-- Remove this when import maps will be widely supported -->\n    <script async src=\"./libs/es-module-shims.js\"></script>\n\n    <script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n    <script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { GUI } from './libs/lil-gui.esm.min.js';\n\t\timport { Texture2DLoader } from 't3d/addons/loaders/Texture2DLoader.js';\n\t\timport { ForwardRenderer } from 't3d/addons/render/ForwardRenderer.js';\n\n\t\tlet width = window.innerWidth || 2;\n\t\tlet height = window.innerHeight || 2;\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = width;\n\t\tcanvas.height = height;\n\t\tdocument.body.appendChild(canvas);\n\n\t\tconst forwardRenderer = new ForwardRenderer(canvas);\n\n\t\tconst scene = new t3d.Scene();\n\n\t\tconst texture = new Texture2DLoader().load('./resources/hardwood2_diffuse.jpg');\n\n\t\tconst cube_geometry = new t3d.BoxGeometry(10, 10, 10);\n\n\t\tconst phong = new t3d.PhongMaterial();\n\t\tphong.diffuse.setHex(0xffffff);\n\t\tphong.diffuseMap = texture;\n\t\tphong.shading = t3d.SHADING_TYPE.FLAT_SHADING;\n\t\tconst cube = new t3d.Mesh(cube_geometry, phong);\n\t\tcube.frustumTest = false;\n\t\tcube.castShadow = true;\n\t\tscene.add(cube);\n\n\t\tconst plane_geometry = new t3d.PlaneGeometry(100, 100);\n\t\tconst lambert = new t3d.LambertMaterial();\n\t\tlambert.diffuse.setHex(0xffffff);\n\t\tconst plane = new t3d.Mesh(plane_geometry, lambert);\n\t\tplane.position.y = -10;\n\t\tplane.receiveShadow = true;\n\t\tscene.add(plane);\n\t\t\n\t\t// add morph targets\n\t\tconst influnences = [];\n\t\tconst morphPositions = [];\n\t\tfor (let i = 0; i < 8; i++) {\n\t\t\tconst morphPosition = cube_geometry.getAttribute('a_Position').clone(new WeakMap());\n\n\t\t\tfor (let j = 0, l = morphPosition.buffer.array.length; j < l; j += 3) {\n\t\t\t\tconst x = morphPosition.buffer.array[j];\n\t\t\t\tconst y = morphPosition.buffer.array[j + 1];\n\t\t\t\tconst z = morphPosition.buffer.array[j + 2];\n\n\t\t\t\tconst flag1 = (i % 8 > 3) === (x > 0);\n\t\t\t\tconst flag2 = (i % 4 > 1) === (y > 0);\n\t\t\t\tconst flag3 = (i % 2 > 0) === (z > 0);\n\t\t\t\tif (flag1 && flag2 && flag3) {\n\t\t\t\t\tmorphPosition.buffer.array[j] = x;\n\t\t\t\t\tmorphPosition.buffer.array[j + 1] = y;\n\t\t\t\t\tmorphPosition.buffer.array[j + 2] = z;\n\t\t\t\t} else {\n\t\t\t\t\tmorphPosition.buffer.array[j] = 0;\n\t\t\t\t\tmorphPosition.buffer.array[j + 1] = 0;\n\t\t\t\t\tmorphPosition.buffer.array[j + 2] = 0;\n\t\t\t\t}\n\t\t\t}\n\t\t\n\t\t\tmorphPositions.push(morphPosition);\n\t\t\tinflunences.push(0);\n\t\t}\n\t\tcube_geometry.morphAttributes.position = morphPositions;\n\t\tcube.morphTargetInfluences = influnences;\n\n\t\tconst ambientLight = new t3d.AmbientLight(0xffffff, 0.3);\n\t\tscene.add(ambientLight);\n\n\t\tconst directionalLight = new t3d.DirectionalLight(0xffffff, 0.7);\n\t\tdirectionalLight.position.set(20, 30, 40);\n\t\tdirectionalLight.lookAt(new t3d.Vector3(), new t3d.Vector3(0, 1, 0));\n\t\tdirectionalLight.shadow.windowSize = 100;\n\t\tdirectionalLight.castShadow = true;\n\t\tscene.add(directionalLight);\n\n\t\tconst camera = new t3d.Camera();\n\t\tcamera.position.set(0, 50, 80);\n\t\tcamera.lookAt(new t3d.Vector3(0, 0, 0), new t3d.Vector3(0, 1, 0));\n\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 1000);\n\t\tscene.add(camera);\n\n\t\t// input\n\t\tconst gui = new GUI({ title: 'Morph Targets' });\n\t\tfor (let i = 0; i < 8; i++) {\n\t\t\tgui.add(cube.morphTargetInfluences, i, 0, 1, 0.01).name('influence' + (i + 1));\n\t\t}\n\n\t\tfunction loop(count) {\n\t\t\trequestAnimationFrame(loop);\n\n\t\t\t// rotate camera\n\t\t\tcamera.position.x = 80 * Math.sin(count / 1000 * .5);\n\t\t\tcamera.position.z = 80 * Math.cos(count / 1000 * .5);\n\t\t\tcamera.lookAt(new t3d.Vector3(0, 0, 0), new t3d.Vector3(0, 1, 0));\n\n\t\t\tforwardRenderer.render(scene, camera);\n\t\t}\n\t\trequestAnimationFrame(loop);\n\n\t\tfunction onWindowResize() {\n\t\t\twidth = window.innerWidth || 2;\n\t\t\theight = window.innerHeight || 2;\n\n\t\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 1000);\n\n\t\t\tforwardRenderer.screenRenderTarget.resize(width, height);\n\t\t}\n\t\twindow.addEventListener('resize', onWindowResize, false);\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "examples/animation_multiple.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>t3d - animation multiple</title>\n\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n\t<link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n</head>\n<body>\n    <div id=\"info\">\n        <a href=\"\" target=\"_blank\">t3d</a> - animation multiple\n\t\t<br/>\n\t\tUse SkeletonUtils.clone() to clone a skinned 3d model\n    </div>\n\n\t<script src=\"./libs/nanobar.js\"></script>\n\n\t<!-- Import maps polyfill -->\n    <!-- Remove this when import maps will be widely supported -->\n    <script async src=\"./libs/es-module-shims.js\"></script>\n\n    <script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n    <script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { Clock } from 't3d/addons/Clock.js';\n\t\timport { GLTFLoader } from 't3d/addons/loaders/glTF/GLTFLoader.js';\n\t\timport { TextureCubeLoader } from 't3d/addons/loaders/TextureCubeLoader.js';\n\t\timport { OrbitControls } from 't3d/addons/controls/OrbitControls.js';\n\t\timport { ForwardRenderer } from 't3d/addons/render/ForwardRenderer.js';\n\t\timport { SkeletonUtils } from 't3d/addons/SkeletonUtils.js';\n\t\timport Stats from './libs/stats.module.js';\n\n\t\tconst devicePixelRatio = window.devicePixelRatio;\n\n\t\tlet width = window.innerWidth || 2;\n\t\tlet height = window.innerHeight || 2;\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = Math.floor(width * devicePixelRatio);\n\t\tcanvas.height = Math.floor(height * devicePixelRatio);\n\t\tcanvas.style.width = width + 'px';\n\t\tcanvas.style.height = height + 'px';\n\t\tdocument.body.appendChild(canvas);\n\n\t\tconst forwardRenderer = new ForwardRenderer(canvas);\n\t\tforwardRenderer.screenRenderTarget.setColorClearValue(0.6, 0.7, 0.8, 1);\n\n\t\tconst cubeTexturePath = './resources/skybox/pisa/';\n\t\tconst cubeTexture = new TextureCubeLoader().load([\n\t\t\tcubeTexturePath + 'px.png',\n\t\t\tcubeTexturePath + 'nx.png',\n\t\t\tcubeTexturePath + 'py.png',\n\t\t\tcubeTexturePath + 'ny.png',\n\t\t\tcubeTexturePath + 'pz.png',\n\t\t\tcubeTexturePath + 'nz.png'\n\t\t]);\n\t\tcubeTexture.encoding = t3d.TEXEL_ENCODING_TYPE.SRGB;\n\n\t\tconst scene = new t3d.Scene();\n\t\tscene.fog = new t3d.Fog(undefined, 10, 100);\n\t\tscene.fog.color.setRGB(0.6, 0.7, 0.8);\n\t\tscene.environment = cubeTexture;\n\n\t\tconst mixers = [];\n\n\t\tconst nanobar = new Nanobar();\n\t\tnanobar.el.style.background = 'gray';\n\n\t\tconst loadingManager = new t3d.LoadingManager(function() {\n\t\t\tnanobar.go(100);\n\t\t\tnanobar.el.style.background = 'transparent';\n\t\t}, function(url, itemsLoaded, itemsTotal) {\n\t\t\tif (itemsLoaded < itemsTotal) {\n\t\t\t\tnanobar.go(itemsLoaded / itemsTotal * 100);\n\t\t\t}\n\t\t});\n\n\t\tconst loader = new GLTFLoader(loadingManager);\n\t\tloader.load(\n\t\t\t'./resources/models/gltf/UinoSpaceman/glTF-Binary/UinoSpaceman.glb'\n\t\t).then(function(result) {\n\t\t\tconst object = result.root;\n\n\t\t\tobject.traverse(function(node) {\n\t\t\t\tif (node.material) {\n\t\t\t\t\tnode.castShadow = true;\n\t\t\t\t\tnode.frustumCulled = false;\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tconst clipsArray = [[], [], []];\n\n\t\t\tconst clonedObject1 = SkeletonUtils.clone(object, result.animations, clipsArray[0]);\n\t\t\tconst clonedObject2 = SkeletonUtils.clone(object, result.animations, clipsArray[1]);\n\t\t\tconst clonedObject3 = SkeletonUtils.clone(object, result.animations, clipsArray[2]);\n\n\t\t\tclonedObject1.position.set(-3, 0, 0);\n\t\t\tclonedObject2.position.set(0, 0, 0);\n\t\t\tclonedObject3.position.set(3, 0, 0);\n\n\t\t\tfor (let i = 0; i < 3; i++) {\n\t\t\t\tconst action = new t3d.AnimationAction(clipsArray[i][i]);\n\t\t\t\tconst mixer = new t3d.AnimationMixer();\n\t\t\t\taction.weight = 1;\n\t\t\t\tmixer.addAction(action);\n\t\t\t\tmixers.push(mixer);\n\t\t\t}\n\n\t\t\tscene.add(clonedObject1);\n\t\t\tscene.add(clonedObject2);\n\t\t\tscene.add(clonedObject3);\n\t\t}).catch(e => console.error(e));\n\n\t\tconst plane_geometry = new t3d.PlaneGeometry(1000, 1000);\n\t\tconst plane_material = new t3d.PBRMaterial();\n\t\tplane_material.roughness = 1;\n\t\tplane_material.diffuse.setHex(0x888888);\n\t\tconst plane = new t3d.Mesh(plane_geometry, plane_material);\n\t\tplane.receiveShadow = true;\n\t\tscene.add(plane);\n\n\t\tconst ambientLight = new t3d.AmbientLight(0xffffff, 0.4);\n\t\tscene.add(ambientLight);\n\n\t\tconst directionalLight = new t3d.DirectionalLight(0xffffff, 1);\n\t\tdirectionalLight.position.set(-4, 5, 4);\n\t\tdirectionalLight.lookAt(new t3d.Vector3(), new t3d.Vector3(0, 1, 0));\n\t\tdirectionalLight.shadow.windowSize = 8;\n\t\tdirectionalLight.shadow.cameraNear = 2;\n\t\tdirectionalLight.shadow.cameraFar = 20;\n\t\tdirectionalLight.castShadow = true;\n\t\tscene.add(directionalLight);\n\n\t\tconst camera = new t3d.Camera();\n\t\tcamera.outputEncoding = t3d.TEXEL_ENCODING_TYPE.SRGB;\n\t\tcamera.position.set(0, 3, 10);\n\t\tcamera.lookAt(new t3d.Vector3(0, 2, 0), new t3d.Vector3(0, 1, 0));\n\t\tcamera.setPerspective(60 / 180 * Math.PI, width / height, 0.1, 100);\n\t\tscene.add(camera);\n\n\t\tconst controller = new OrbitControls(camera, canvas);\n\t\tcontroller.target.set(0, 1.5, 0);\n\n\t\t// stats\n\t\tconst stats = new Stats();\n\t\tstats.showPanel(0);\n\t\tdocument.body.appendChild(stats.dom);\n\n\t\tconst clock = new Clock();\n\n\t\tfunction loop(count) {\n\t\t\trequestAnimationFrame(loop);\n\n\t\t\tstats.begin();\n\n\t\t\tcontroller.update();\n\n\t\t\tconst deltaTime = clock.getDelta();\n\t\t\tmixers.forEach(mixer => mixer.update(deltaTime));\n\n\t\t\tforwardRenderer.render(scene, camera);\n\n\t\t\tstats.end();\n\t\t}\n\t\trequestAnimationFrame(loop);\n\n\t\tfunction onWindowResize() {\n\t\t\twidth = window.innerWidth || 2;\n\t\t\theight = window.innerHeight || 2;\n\n\t\t\tcamera.setPerspective(60 / 180 * Math.PI, width / height, 0.1, 100);\n\n\t\t\tforwardRenderer.screenRenderTarget.resize(Math.floor(width * devicePixelRatio), Math.floor(height * devicePixelRatio));\n\n\t\t\tcanvas.style.width = width + 'px';\n\t\t\tcanvas.style.height = height + 'px';\n\t\t}\n\t\twindow.addEventListener('resize', onWindowResize, false);\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "examples/animation_skinned_instancing.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>t3d - animation skinned instancing</title>\n\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n\t<link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n</head>\n<body>\n    <div id=\"info\">\n        <a href=\"\" target=\"_blank\">t3d</a> - skinned instancing\n    </div>\n\n\t<script src=\"./libs/nanobar.js\"></script>\n\n\t<!-- Import maps polyfill -->\n    <!-- Remove this when import maps will be widely supported -->\n    <script async src=\"./libs/es-module-shims.js\"></script>\n\n    <script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n    <script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { Clock } from 't3d/addons/Clock.js';\n\t\timport { GLTFLoader } from 't3d/addons/loaders/glTF/GLTFLoader.js';\n\t\timport { TextureCubeLoader } from 't3d/addons/loaders/TextureCubeLoader.js';\n\t\timport { InstancedPBRMaterial, InstancedDepthMaterial } from 't3d/addons/materials/InstancedMaterial.js';\n\t\timport { OrbitControls } from 't3d/addons/controls/OrbitControls.js';\n\t\timport { ForwardRenderer } from 't3d/addons/render/ForwardRenderer.js';\n\t\timport { SceneUtils } from 't3d/addons/SceneUtils.js';\n\t\timport { GUI } from './libs/lil-gui.esm.min.js';\n\t\timport Stats from './libs/stats.module.js';\n\n\t\tconst devicePixelRatio = window.devicePixelRatio;\n\n\t\tlet width = window.innerWidth || 2;\n\t\tlet height = window.innerHeight || 2;\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = Math.floor(width * devicePixelRatio);\n\t\tcanvas.height = Math.floor(height * devicePixelRatio);\n\t\tcanvas.style.width = width + 'px';\n\t\tcanvas.style.height = height + 'px';\n\t\tdocument.body.appendChild(canvas);\n\n\t\tconst forwardRenderer = new ForwardRenderer(canvas);\n\t\tforwardRenderer.screenRenderTarget.setColorClearValue(0.6, 0.7, 0.8, 1);\n\n\t\tconst cubeTexturePath = './resources/skybox/Bridge2/';\n\t\tconst cubeTexture = new TextureCubeLoader().load([\n\t\t\tcubeTexturePath + 'posx.jpg',\n\t\t\tcubeTexturePath + 'negx.jpg',\n\t\t\tcubeTexturePath + 'posy.jpg',\n\t\t\tcubeTexturePath + 'negy.jpg',\n\t\t\tcubeTexturePath + 'posz.jpg',\n\t\t\tcubeTexturePath + 'negz.jpg'\n\t\t]);\n\t\tcubeTexture.encoding = t3d.TEXEL_ENCODING_TYPE.SRGB;\n\n\t\tconst scene = new t3d.Scene();\n\t\tscene.fog = new t3d.Fog(undefined, 10, 100);\n\t\tscene.fog.color.setRGB(0.6, 0.7, 0.8);\n\t\tscene.environment = cubeTexture;\n\n\t\tconst camera = new t3d.Camera();\n\t\tcamera.outputEncoding = t3d.TEXEL_ENCODING_TYPE.SRGB;\n\t\tcamera.position.set(0, 5, 18);\n\t\tcamera.lookAt(new t3d.Vector3(0, 1.5, 0), new t3d.Vector3(0, 1, 0));\n\t\tcamera.setPerspective(60 / 180 * Math.PI, width / height, 1, 1000);\n\t\tscene.add(camera);\n\n\t\tconst controller = new OrbitControls(camera, canvas);\n\t\tcontroller.target.set(0, 1.5, 0);\n\n\t\t// override shadowMapPass.getDepthMaterial\n\n\t\tconst depthMaterials = [];\n\t\tconst shadowSide = { 'front': t3d.DRAW_SIDE.BACK, 'back': t3d.DRAW_SIDE.FRONT, 'double': t3d.DRAW_SIDE.DOUBLE };\n\t\tforwardRenderer.shadowMapPass.getDepthMaterial = function(renderable) {\n\t\t\tconst useSkinning = !!renderable.object.skeleton;\n\t\t\tconst useMorphing = renderable.geometry.morphAttributes.position && renderable.geometry.morphAttributes.position.length > 0;\n\t\t\tconst useInstancing = renderable.material.defines.USE_INSTANCING;\n\n\t\t\tconst index = useMorphing << 0 | useSkinning << 1 | useInstancing << 2;\n\n\t\t\tlet material = depthMaterials[index];\n\t\t\tif (material === undefined) {\n\t\t\t\tmaterial = useInstancing ? new InstancedDepthMaterial() : new t3d.DepthMaterial();\n\t\t\t\tmaterial.packToRGBA = true;\n\n\t\t\t\tdepthMaterials[index] = material;\n\t\t\t}\n\n\t\t\tmaterial.side = shadowSide[renderable.material.side];\n\n\t\t\tif (useInstancing) {\n\t\t\t\tmaterial.uniforms.instanceOffset.set(renderable.material.uniforms.instanceOffset);\n\t\t\t}\n\n\t\t\treturn material;\n\t\t};\n\n\t\t// create shared instanceMatrixAttribute\n\n\t\tconst maxInstanceCount = 1000;\n\t\tconst params = { instanceCount: 108 };\n\n\t\tconst matrices = [];\n\t\tconst geometries = [];\n\n\t\tconst position = new t3d.Vector3();\n\t\tconst orientation = new t3d.Quaternion();\n\t\tconst scale = new t3d.Vector3(1, 1, 1);\n\t\tconst matrix = new t3d.Matrix4();\n\n\t\tlet rowLength = 8, row = 0, countInRow = 0;\n\t\tfor (let i = 0; i < maxInstanceCount; i++) {\n\t\t\tposition.x = (countInRow - (rowLength - 1) / 2) * 2;\n\t\t\tposition.y = 0;\n\t\t\tposition.z = -row * 1.5 + 10;\n\n\t\t\tcountInRow++;\n\n\t\t\tif (countInRow >= rowLength) {\n\t\t\t\trow++;\n\t\t\t\tcountInRow = 0;\n\t\t\t\trowLength++;\n\t\t\t}\n\n\t\t\tmatrix.compose(position, orientation, scale);\n\t\t\tmatrix.toArray(matrices, i * 16);\n\t\t}\n\n\t\tconst instanceMatrixAttribute = new t3d.Attribute(new t3d.Buffer(new Float32Array(matrices), 16));\n\t\tinstanceMatrixAttribute.divisor = 1;\n\n\t\tlet mixer;\n\n\t\tfunction onBone(node, root) {\n\t\t\tlet tempNode = node;\n\n\t\t\twhile (tempNode !== root && tempNode !== null) {\n\t\t\t\tif (tempNode.isBone) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\n\t\t\t\ttempNode = tempNode.parent;\n\t\t\t}\n\n\t\t\treturn false;\n\t\t}\n\n\t\tconst nanobar = new Nanobar();\n\t\tnanobar.el.style.background = 'gray';\n\n\t\tconst loadingManager = new t3d.LoadingManager(function() {\n\t\t\tnanobar.go(100);\n\t\t\tnanobar.el.style.background = 'transparent';\n\t\t}, function(url, itemsLoaded, itemsTotal) {\n\t\t\tif (itemsLoaded < itemsTotal) {\n\t\t\t\tnanobar.go(itemsLoaded / itemsTotal * 100);\n\t\t\t}\n\t\t});\n\n\t\tconst loader = new GLTFLoader(loadingManager);\n\t\tloader.load(\n\t\t\t'./resources/models/gltf/UinoSpaceman/glTF-Binary/UinoSpaceman.glb'\n\t\t).then(function(result) {\n\t\t\tconst object = result.root;\n\n\t\t\tconst offsetMatrix = new t3d.Matrix4();\n\n\t\t\tobject.traverse(function(node) {\n\t\t\t\tif (node.material) {\n\t\t\t\t\tnode.castShadow = true;\n\t\t\t\t\t// node.receiveShadow = true;\n\t\t\t\t\tnode.frustumCulled = false;\n\n\t\t\t\t\tconst material = new InstancedPBRMaterial(node.material);\n\n\t\t\t\t\t// We should insert instanceMatrix to modelMatrix\n\t\t\t\t\t// So we use < inverseMat4(instanceOffset) * instanceMatrix * instanceOffset > to convert instance matrix to vertex space\n\n\t\t\t\t\tSceneUtils.getRelativeMatrixFromRoot(node, object, offsetMatrix);\n\t\t\t\t\toffsetMatrix.toArray(material.uniforms.instanceOffset);\n\t\t\t\t\tif (onBone(node, object)) {\n\t\t\t\t\t\t// Fix if instanceOffset is changing\n\t\t\t\t\t\t// Most of the time it's because the mesh is mounted under the skeleton\n\t\t\t\t\t\tnode.onBeforeRender = function() {\n\t\t\t\t\t\t\tSceneUtils.getRelativeMatrixFromRoot(node, object, offsetMatrix);\n\t\t\t\t\t\t\toffsetMatrix.toArray(material.uniforms.instanceOffset);\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\n\t\t\t\t\tnode.geometry.addAttribute('instanceMatrix', instanceMatrixAttribute);\n\t\t\t\t\tnode.geometry.instanceCount = params.instanceCount;\n\n\t\t\t\t\tnode.material = material;\n\n\t\t\t\t\tgeometries.push(node.geometry);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tconst action = new t3d.AnimationAction(result.animations[0]);\n\t\t\taction.weight = 1;\n\t\t\tmixer = new t3d.AnimationMixer();\n\t\t\tmixer.addAction(action);\n\n\t\t\tscene.add(object);\n\t\t\t// object.euler.z = Math.PI / 2;\n\t\t}).catch(e => console.error(e));\n\n\t\tconst plane_geometry = new t3d.PlaneGeometry(2000, 2000, 5, 5);\n\t\tconst plane_material = new t3d.PBRMaterial();\n\t\tplane_material.roughness = 1;\n\t\tplane_material.diffuse.setHex(0x888888);\n\t\tconst plane = new t3d.Mesh(plane_geometry, plane_material);\n\t\tplane.receiveShadow = true;\n\t\tscene.add(plane);\n\n\t\tconst ambientLight = new t3d.AmbientLight(0xffffff, 0.4);\n\t\tscene.add(ambientLight);\n\n\t\tconst directionalLight = new t3d.DirectionalLight(0xffffff, 1);\n\t\tdirectionalLight.position.set(-14, 15, 14);\n\t\tdirectionalLight.lookAt(new t3d.Vector3(), new t3d.Vector3(0, 1, 0));\n\t\tdirectionalLight.shadow.windowSize = 30;\n\t\tdirectionalLight.shadow.cameraNear = 1;\n\t\tdirectionalLight.shadow.cameraFar = 50;\n\t\tdirectionalLight.shadow.mapSize.set(512, 512);\n\t\tdirectionalLight.shadow.frustumEdgeFalloff = 0.2;\n\t\tdirectionalLight.castShadow = true;\n\t\tscene.add(directionalLight);\n\n\t\t// gui\n\t\tconst gui = new GUI();\n\t\tgui.add(params, 'instanceCount', 0, maxInstanceCount, 1).name('Instance Count').onChange(function(value) {\n\t\t\tgeometries.forEach(geometry => {\n\t\t\t\tgeometry.instanceCount = value;\n\t\t\t});\n\t\t});\n\n\t\t// stats\n\t\tconst stats = new Stats();\n\t\tstats.showPanel(0);\n\t\tdocument.body.appendChild(stats.dom);\n\n\t\tconst clock = new Clock();\n\n\t\tfunction loop(count) {\n\t\t\trequestAnimationFrame(loop);\n\n\t\t\tstats.begin();\n\n\t\t\tcontroller.update();\n\n\t\t\tconst deltaTime = clock.getDelta();\n\t\t\tmixer && mixer.update(deltaTime);\n\n\t\t\tforwardRenderer.render(scene, camera);\n\n\t\t\tstats.end();\n\t\t}\n\t\trequestAnimationFrame(loop);\n\n\t\tfunction onWindowResize() {\n\t\t\twidth = window.innerWidth || 2;\n\t\t\theight = window.innerHeight || 2;\n\n\t\t\tcamera.setPerspective(60 / 180 * Math.PI, width / height, 1, 1000);\n\n\t\t\tforwardRenderer.screenRenderTarget.resize(Math.floor(width * devicePixelRatio), Math.floor(height * devicePixelRatio));\n\n\t\t\tcanvas.style.width = width + 'px';\n\t\t\tcanvas.style.height = height + 'px';\n\t\t}\n\t\twindow.addEventListener('resize', onWindowResize, false);\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "examples/animation_skinned_mesh.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>t3d - skinned mesh</title>\n\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n\t<link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n</head>\n<body>\n    <div id=\"info\">\n        <a href=\"\" target=\"_blank\">t3d</a> - skinned mesh\n    </div>\n\n\t<!-- Import maps polyfill -->\n    <!-- Remove this when import maps will be widely supported -->\n    <script async src=\"./libs/es-module-shims.js\"></script>\n\n    <script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n    <script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { Texture2DLoader } from 't3d/addons/loaders/Texture2DLoader.js';\n\t\timport { ForwardRenderer } from 't3d/addons/render/ForwardRenderer.js';\n\n\t\tlet width = window.innerWidth || 2;\n\t\tlet height = window.innerHeight || 2;\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = width;\n\t\tcanvas.height = height;\n\t\tdocument.body.appendChild(canvas);\n\n\t\tconst forwardRenderer = new ForwardRenderer(canvas);\n\n\t\tconst scene = new t3d.Scene();\n\n\t\tconst texture = new Texture2DLoader().load('./resources/hardwood2_diffuse.jpg');\n\n\t\tconst bone = new t3d.Bone();\n\t\tbone.position.y = -10;\n\t\tconst boneInverse = new t3d.Matrix4();\n\t\tboneInverse.set(\n\t\t\t1, 0, 0, 0,\n\t\t\t0, 1, 0, 10,\n\t\t\t0, 0, 1, 0,\n\t\t\t0, 0, 0, 1\n\t\t);\n\n\t\tconst bone2 = new t3d.Bone();\n\t\tbone2.position.y = 20;\n\t\tconst boneInverse2 = new t3d.Matrix4();\n\t\tboneInverse2.set(\n\t\t\t1, 0, 0, 0,\n\t\t\t0, 1, 0, -10,\n\t\t\t0, 0, 1, 0,\n\t\t\t0, 0, 0, 1\n\t\t);\n\n\t\tbone.add(bone2);\n\n\t\tconst bones = [bone, bone2];\n\t\tconst boneInverses = [boneInverse, boneInverse2];\n\n\t\tconst skeleton = new t3d.Skeleton(bones, boneInverses);\n\n\t\tconst cube_geometry = new t3d.BoxGeometry(10, 10, 10);\n\n\t\t// insert skinIndex & skinWeight\n\t\tconst skinIndexArray = [];\n\t\tconst skinWeightArray = [];\n\t\tconst vertexCount = cube_geometry.getAttribute('a_Position').buffer.count;\n\t\tconst verticesArray = cube_geometry.getAttribute('a_Position').buffer.array;\n\t\tfor (let i = 0; i < vertexCount; i++) {\n\t\t\tconst offset = i * 3;\n\t\t\tconst y = verticesArray[offset + 1];\n\t\t\tif (y > 0) {\n\t\t\t\t// top vertices bind bone2\n\t\t\t\tskinIndexArray.push(1, 0, 0, 0);\n\t\t\t\tskinWeightArray.push(1, 0, 0, 0);\n\t\t\t} else {\n\t\t\t\t// bottom vertices bind bone\n\t\t\t\tskinIndexArray.push(0, 0, 0, 0);\n\t\t\t\tskinWeightArray.push(1, 0, 0, 0);\n\t\t\t}\n\t\t}\n\n\t\tcube_geometry.removeAttribute('a_Color');\n\t\tcube_geometry.addAttribute('skinIndex', new t3d.Attribute(new t3d.Buffer(new Float32Array(skinIndexArray), 4)));\n\t\tcube_geometry.addAttribute('skinWeight', new t3d.Attribute(new t3d.Buffer(new Float32Array(skinWeightArray), 4)));\n\n\t\tconst phong = new t3d.PhongMaterial();\n\t\tphong.diffuse.setHex(0xffffff);\n\t\tphong.diffuseMap = texture;\n\t\tconst cube = new t3d.SkinnedMesh(cube_geometry, phong);\n\t\tcube.add(bone);\n\t\tcube.bind(skeleton);\n\t\tcube.frustumTest = false;\n\t\tcube.castShadow = true;\n\t\tscene.add(cube);\n\n\t\tconst plane_geometry = new t3d.PlaneGeometry(100, 100);\n\t\tconst lambert = new t3d.LambertMaterial();\n\t\tlambert.diffuse.setHex(0xffffff);\n\t\tconst plane = new t3d.Mesh(plane_geometry, lambert);\n\t\tplane.position.y = -10;\n\t\tplane.receiveShadow = true;\n\t\tscene.add(plane);\n\n\t\tconst ambientLight = new t3d.AmbientLight(0xffffff, 0.3);\n\t\tscene.add(ambientLight);\n\n\t\tconst directionalLight = new t3d.DirectionalLight(0xffffff, 0.7);\n\t\tdirectionalLight.position.set(20, 30, 40);\n\t\tdirectionalLight.lookAt(new t3d.Vector3(), new t3d.Vector3(0, 1, 0));\n\t\tdirectionalLight.shadow.windowSize = 100;\n\t\tdirectionalLight.castShadow = true;\n\t\tscene.add(directionalLight);\n\n\t\tconst camera = new t3d.Camera();\n\t\tcamera.position.set(0, 50, 80);\n\t\tcamera.lookAt(new t3d.Vector3(0, 0, 0), new t3d.Vector3(0, 1, 0));\n\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 1000);\n\t\tscene.add(camera);\n\n\t\t// input\n\n\t\tfunction loop(count) {\n\t\t\trequestAnimationFrame(loop);\n\n\t\t\tbone.euler.x = Math.cos(count / 1000 * 10) * Math.PI / 180 * 10;\n\t\t\tbone2.euler.x = Math.cos(count / 1000 * 10) * Math.PI / 180 * 20;\n\t\t\tbone2.euler.y = Math.sin(count / 1000 * 10) * Math.PI / 180 * 20;\n\n\t\t\t// rotate camera\n\t\t\tcamera.position.x = 80 * Math.sin(count / 1000 * .5);\n\t\t\tcamera.position.z = 80 * Math.cos(count / 1000 * .5);\n\t\t\tcamera.lookAt(new t3d.Vector3(0, 0, 0), new t3d.Vector3(0, 1, 0));\n\n\t\t\tforwardRenderer.render(scene, camera);\n\t\t}\n\t\trequestAnimationFrame(loop);\n\n\t\tfunction onWindowResize() {\n\t\t\twidth = window.innerWidth || 2;\n\t\t\theight = window.innerHeight || 2;\n\n\t\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 1000);\n\n\t\t\tforwardRenderer.screenRenderTarget.resize(width, height);\n\t\t}\n\t\twindow.addEventListener('resize', onWindowResize, false);\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "examples/animation_snake.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>t3d - snake</title>\n\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n\t<link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n</head>\n<body>\n    <div id=\"info\">\n        <a href=\"\" target=\"_blank\">t3d</a> - snake\n    </div>\n\n\t<!-- Import maps polyfill -->\n    <!-- Remove this when import maps will be widely supported -->\n    <script async src=\"./libs/es-module-shims.js\"></script>\n\n    <script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n    <script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { Texture2DLoader } from 't3d/addons/loaders/Texture2DLoader.js';\n\t\timport { ForwardRenderer } from 't3d/addons/render/ForwardRenderer.js';\n\n\t\tlet width = window.innerWidth || 2;\n\t\tlet height = window.innerHeight || 2;\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = width;\n\t\tcanvas.height = height;\n\t\tdocument.body.appendChild(canvas);\n\n\t\tconst forwardRenderer = new ForwardRenderer(canvas);\n\n\t\tconst scene = new t3d.Scene();\n\n\t\tconst texture = new Texture2DLoader().load('./resources/hardwood2_diffuse.jpg');\n\n\t\tconst numBones = 30;\n\t\tconst distance = 50;\n\t\tconst halfDistance = distance / 2;\n\t\tconst boneLength = distance / numBones;\n\t\tconst bones = [];\n\t\tconst boneInverses = [];\n\t\tfor (let i = 0; i <= numBones; i++) {\n\t\t\tconst bone = new t3d.Bone();\n\t\t\tbone.position.y = (i === 0) ? -halfDistance : boneLength;\n\t\t\tbones.push(bone);\n\n\t\t\tconst boneInverse = new t3d.Matrix4();\n\t\t\tboneInverses.push(boneInverse.set(\n\t\t\t\t1, 0, 0, 0,\n\t\t\t\t0, 1, 0, halfDistance - i * boneLength,\n\t\t\t\t0, 0, 1, 0,\n\t\t\t\t0, 0, 0, 1\n\t\t\t));\n\n\t\t\tif (i > 0) {\n\t\t\t\tbones[bones.length - 2].add(bone);\n\t\t\t}\n\t\t}\n\n\t\tconst skeleton = new t3d.Skeleton(bones, boneInverses);\n\n\t\tconst cylinder_geometry = new t3d.CylinderGeometry(2, 2, distance, 10, numBones);\n\n\t\t// insert skinIndex & skinWeight\n\t\tconst skinIndexArray = [];\n\t\tconst skinWeightArray = [];\n\t\tconst verticesArray = cylinder_geometry.getAttribute('a_Position').buffer.array;\n\t\tconst vertexCount = cylinder_geometry.getAttribute('a_Position').buffer.count;\n\t\tfor (let i = 0; i < vertexCount; i++) {\n\t\t\tconst offset = i * 3;\n\t\t\tconst y = verticesArray[offset + 1];\n\n\t\t\tlet boneId = 0;\n\t\t\tfor (let j = 0; j <= numBones; j++) {\n\t\t\t\tif (y < (-halfDistance + j * boneLength + 0.1)) {\n\t\t\t\t\tboneId = j;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// bind bone\n\t\t\tskinIndexArray.push(boneId, 0, 0, 0);\n\t\t\tskinWeightArray.push(1, 0, 0, 0);\n\t\t}\n\n\t\tcylinder_geometry.removeAttribute('a_Color');\n\t\tcylinder_geometry.addAttribute('skinIndex', new t3d.Attribute(new t3d.Buffer(new Float32Array(skinIndexArray), 4)));\n\t\tcylinder_geometry.addAttribute('skinWeight', new t3d.Attribute(new t3d.Buffer(new Float32Array(skinWeightArray), 4)));\n\n\t\tconst phong = new t3d.PhongMaterial();\n\t\tphong.diffuse.setHex(0xffffff);\n\t\tphong.diffuseMap = texture;\n\t\tconst cylinder = new t3d.SkinnedMesh(cylinder_geometry, phong);\n\t\tcylinder.bind(skeleton);\n\t\tcylinder.add(bones[0]);\n\t\tcylinder.euler.z = Math.PI / 2;\n\t\tcylinder.position.x = -25;\n\t\tcylinder.castShadow = true;\n\t\tscene.add(cylinder);\n\n\t\tconst plane_geometry = new t3d.PlaneGeometry(200, 200);\n\t\tconst lambert = new t3d.LambertMaterial();\n\t\tlambert.diffuse.setHex(0xffffff);\n\t\tconst plane = new t3d.Mesh(plane_geometry, lambert);\n\t\tplane.position.y = -20;\n\t\tplane.receiveShadow = true;\n\t\tscene.add(plane);\n\n\t\tconst ambientLight = new t3d.AmbientLight(0xffffff, 0.3);\n\t\tscene.add(ambientLight);\n\n\t\tconst directionalLight = new t3d.DirectionalLight(0xffffff, 0.7);\n\t\tdirectionalLight.position.set(20, 30, 40);\n\t\tdirectionalLight.lookAt(new t3d.Vector3(), new t3d.Vector3(0, 1, 0));\n\t\tdirectionalLight.shadow.windowSize = 100;\n\t\tdirectionalLight.castShadow = true;\n\t\tscene.add(directionalLight);\n\n\t\tconst camera = new t3d.Camera();\n\t\tcamera.position.set(0, 40, 80);\n\t\tcamera.lookAt(new t3d.Vector3(0, 0, 0), new t3d.Vector3(0, 1, 0));\n\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 1000);\n\t\tscene.add(camera);\n\n\t\t// input\n\n\t\tfunction loop(count) {\n\t\t\trequestAnimationFrame(loop);\n\n\t\t\t// transform bones\n\t\t\tfor (let i = 0; i < bones.length; i++) {\n\t\t\t\tbones[i].euler.x = Math.cos(count / 1000 * 0.5) * Math.PI / 180 * 12;\n\t\t\t}\n\n\t\t\t// rotate camera\n\t\t\tcamera.position.x = 80 * Math.sin(count / 1000 * .5);\n\t\t\tcamera.position.z = 80 * Math.cos(count / 1000 * .5);\n\t\t\tcamera.lookAt(new t3d.Vector3(0, 0, 0), new t3d.Vector3(0, 1, 0));\n\n\t\t\tforwardRenderer.render(scene, camera);\n\t\t}\n\t\trequestAnimationFrame(loop);\n\n\t\tfunction onWindowResize() {\n\t\t\twidth = window.innerWidth || 2;\n\t\t\theight = window.innerHeight || 2;\n\n\t\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 1000);\n\n\t\t\tforwardRenderer.screenRenderTarget.resize(width, height);\n\t\t}\n\t\twindow.addEventListener('resize', onWindowResize, false);\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "examples/camera_multiple.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>t3d - multiple cameras</title>\n\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n\t<link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n</head>\n<body>\n    <div id=\"info\">\n        <a href=\"\" target=\"_blank\">t3d</a> - multiple cameras\n    </div>\n\n\t<!-- Import maps polyfill -->\n    <!-- Remove this when import maps will be widely supported -->\n    <script async src=\"./libs/es-module-shims.js\"></script>\n\n    <script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n    <script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { SkyBox } from 't3d/addons/objects/SkyBox.js';\n\t\timport { ForwardRenderer } from 't3d/addons/render/ForwardRenderer.js';\n\t\timport { TextureCubeLoader } from 't3d/addons/loaders/TextureCubeLoader.js';\n\n\t\tlet width = window.innerWidth || 2;\n\t\tlet height = window.innerHeight || 2;\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = width;\n\t\tcanvas.height = height;\n\t\tdocument.body.appendChild(canvas);\n\n\t\tconst forwardRenderer = new ForwardRenderer(canvas);\n\n\t\tconst scene = new t3d.Scene();\n\n\t\tconst sphere_geometry = new t3d.SphereGeometry(10, 20, 20);\n\t\tconst phong = new t3d.PhongMaterial();\n\t\tphong.diffuse.setHex(0xffffff);\n\n\t\tconst sphere = new t3d.Mesh(sphere_geometry, phong);\n\t\tscene.add(sphere);\n\n\t\tconst plane_geometry = new t3d.PlaneGeometry(100, 100);\n\t\tconst lambert = new t3d.LambertMaterial();\n\t\tlambert.diffuse.setHex(0xffffff);\n\t\tconst plane = new t3d.Mesh(plane_geometry, lambert);\n\t\tplane.position.y = -10;\n\t\tplane.receiveShadow = true;\n\t\tscene.add(plane);\n\n\t\tconst ambientLight = new t3d.AmbientLight(0xffffff, 0.3);\n\t\tscene.add(ambientLight);\n\n\t\tconst directionalLight = new t3d.DirectionalLight(0xffffff, 0.6);\n\t\tdirectionalLight.position.set(20, 30, 40);\n\t\tdirectionalLight.lookAt(new t3d.Vector3(), new t3d.Vector3(0, 1, 0));\n\t\tdirectionalLight.shadow.windowSize = 100;\n\t\tscene.add(directionalLight);\n\n\t\tconst camera = new t3d.Camera();\n\t\tcamera.position.set(0, 80, 100);\n\t\tcamera.lookAt(new t3d.Vector3(0, 0, 0), new t3d.Vector3(0, 1, 0));\n\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 1000);\n\t\tscene.add(camera);\n\n\t\tconst sceneMini = new t3d.Scene();\n\n\t\tconst cubeTexturePath = './resources/skybox/sunset/';\n\t\tconst cubeTexture = new TextureCubeLoader().load([\n\t\t\tcubeTexturePath + 'px.jpg',\n\t\t\tcubeTexturePath + 'nx.jpg',\n\t\t\tcubeTexturePath + 'py.jpg',\n\t\t\tcubeTexturePath + 'ny.jpg',\n\t\t\tcubeTexturePath + 'pz.jpg',\n\t\t\tcubeTexturePath + 'nz.jpg'\n\t\t]);\n\t\tconst skyBox = new SkyBox(cubeTexture);\n\n\t\t// add the same thing\n\t\tsceneMini.add(sphere.clone());\n\t\tsceneMini.add(ambientLight.clone());\n\t\tsceneMini.add(directionalLight.clone());\n\n\t\tconst cameraMini = new t3d.Camera();\n\t\tcameraMini.position.set(0, 0, 100);\n\t\tcameraMini.lookAt(new t3d.Vector3(0, 0, 0), new t3d.Vector3(0, 1, 0));\n\t\tcameraMini.setPerspective(45 / 180 * Math.PI, width / height, 1, 10000);\n\t\tcameraMini.rect.set(0, 0, 0.25, 0.25);\n\t\tcameraMini.add(skyBox);\n\t\tsceneMini.add(cameraMini);\n\n\t\tfunction loop(count) {\n\t\t\trequestAnimationFrame(loop);\n\n\t\t\t// rotate camera\n\t\t\tcamera.position.x = 100 * Math.sin(count / 1000 * .5);\n\t\t\tcamera.position.z = 100 * Math.cos(count / 1000 * .5);\n\t\t\tcamera.lookAt(new t3d.Vector3(0, 0, 0), new t3d.Vector3(0, 1, 0));\n\n\t\t\tcameraMini.position.x = 100 * Math.sin(count / 1000 * .5);\n\t\t\tcameraMini.position.z = 100 * Math.cos(count / 1000 * .5);\n\t\t\tcameraMini.lookAt(new t3d.Vector3(0, 0, 0), new t3d.Vector3(0, 1, 0));\n\n\t\t\tforwardRenderer.screenRenderTarget\n\t\t\t\t.setColorClearValue(0, 0, 0, 0)\n\t\t\t\t.setClear(true, true, true);\n\t\t\tforwardRenderer.render(scene, camera);\n\n\t\t\tforwardRenderer.screenRenderTarget\n\t\t\t\t.setColorClearValue(1, 0, 0, 1)\n\t\t\t\t.setClear(false, true, true);\n\t\t\tforwardRenderer.render(sceneMini, cameraMini);\n\t\t}\n\t\trequestAnimationFrame(loop);\n\n\t\tfunction onWindowResize() {\n\t\t\twidth = window.innerWidth || 2;\n\t\t\theight = window.innerHeight || 2;\n\n\t\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 1000);\n\t\t\tcameraMini.setPerspective(45 / 180 * Math.PI, width / height, 1, 10000);\n\n\t\t\tforwardRenderer.screenRenderTarget.resize(width, height);\n\t\t}\n\t\twindow.addEventListener('resize', onWindowResize, false);\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "examples/camera_projection.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>t3d - camera projection</title>\n\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n\t<link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n</head>\n<body>\n    <div id=\"info\">\n        <a href=\"\" target=\"_blank\">t3d</a> - camera projection<br/>\n\t\tSliding the `projWeight` to achieve smooth switching<br/>\n\t\tbetween perspective(0) and orthogonal(1) camera.\n    </div>\n\n\t<!-- Import maps polyfill -->\n    <!-- Remove this when import maps will be widely supported -->\n    <script async src=\"./libs/es-module-shims.js\"></script>\n\n    <script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n    <script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { OrbitControls } from 't3d/addons/controls/OrbitControls.js';\n\t\timport { ForwardRenderer } from 't3d/addons/render/ForwardRenderer.js';\n\t\timport { GridHelper } from 't3d/addons/objects/GridHelper.js';\n\t\timport { SkyBox } from 't3d/addons/objects/SkyBox.js';\n\t\timport { TextureCubeLoader } from 't3d/addons/loaders/TextureCubeLoader.js';\n\t\timport { GUI } from './libs/lil-gui.esm.min.js';\n\n\t\tlet width = window.innerWidth || 2;\n\t\tlet height = window.innerHeight || 2;\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = width;\n\t\tcanvas.height = height;\n\t\tdocument.body.appendChild(canvas);\n\n\t\tconst forwardRenderer = new ForwardRenderer(canvas);\n\n\t\tconst scene = new t3d.Scene();\n\n\t\tconst cubeTexturePath = './resources/skybox/sunset/';\n\t\tconst cubeTexture = new TextureCubeLoader().load([\n\t\t\tcubeTexturePath + 'px.jpg',\n\t\t\tcubeTexturePath + 'nx.jpg',\n\t\t\tcubeTexturePath + 'py.jpg',\n\t\t\tcubeTexturePath + 'ny.jpg',\n\t\t\tcubeTexturePath + 'pz.jpg',\n\t\t\tcubeTexturePath + 'nz.jpg'\n\t\t]);\n\t\tconst skyBox = new SkyBox(cubeTexture);\n\t\tscene.add(skyBox);\n\n\t\tscene.environment = cubeTexture;\n\n\t\tconst boxGeometry = new t3d.BoxGeometry(20, 20, 20);\n\t\tconst boxMaterial = new t3d.PBRMaterial();\n\t\tboxMaterial.roughness = 0.6;\n\t\tboxMaterial.metalness = 0.1;\n\t\tconst boxMesh = new t3d.Mesh(boxGeometry, boxMaterial);\n\t\tscene.add(boxMesh);\n\n\t\tconst grid = new GridHelper(100, 20, 0xffffff, 0x888888);\n\t\tgrid.position.y = -10;\n\t\tscene.add(grid);\n\n\t\tconst ambientLight = new t3d.AmbientLight(0xffffff, 0.1);\n\t\tscene.add(ambientLight);\n\n\t\tconst directionalLight = new t3d.DirectionalLight(0xffffff, 0.6);\n\t\tdirectionalLight.position.set(-30, 20, -40);\n\t\tdirectionalLight.lookAt(new t3d.Vector3(), new t3d.Vector3(0, 1, 0));\n\t\tscene.add(directionalLight);\n\n\t\tconst camera = new t3d.Camera();\n\t\tcamera.position.set(-40, 20, -70);\n\t\tcamera.lookAt(new t3d.Vector3(0, 0, 0), new t3d.Vector3(0, 1, 0));\n\t\tscene.add(camera);\n\n\t\tconst controller = new OrbitControls(camera, canvas);\n\t\tcontroller.enableDollying = false;\n\n\t\t// global variables\n\n\t\tconst cameraDistance = camera.position.getLength();\n\n\t\tconst _perspectiveProjection = new t3d.PerspectiveProjection(60, width / height);\n\n\t\tconst viewHeight = Math.tan(_perspectiveProjection.fov / 180 * Math.PI / 2) * cameraDistance * 2;\n\t\tconst _orthographicProjection = new t3d.OrthographicProjection();\n\t\t_orthographicProjection.setSize(viewHeight * width / height, viewHeight);\n\n\t\tconst _skyboxProjection = new t3d.PerspectiveProjection(90, width / height); // fov 90 for skybox when in ortho mode\n\t\t\n\t\tconst _combinedProjectionMatrix = new t3d.Matrix4();\n\n\t\tconst params = { projWeight: 0 };\n\t\t\n\t\t// input\n\n\t\tskyBox.material.uniforms.u_Projection = new Float32Array(16);\n\n\t\tfunction setCameraProjection() {\n\t\t\tif (params.projWeight == 0) {\n\t\t\t\tcamera.setProjectionMatrix(_perspectiveProjection.matrix);\n\t\t\t\t_perspectiveProjection.matrix.toArray(skyBox.material.uniforms.u_Projection);\n\t\t\t} else if (params.projWeight == 1) {\n\t\t\t\tcamera.setProjectionMatrix(_orthographicProjection.matrix);\n\t\t\t\t_skyboxProjection.matrix.toArray(skyBox.material.uniforms.u_Projection);\n\t\t\t} else {\n\t\t\t\tconst alpha = easeOut(params.projWeight); // use easeOut to make the transition more 'linear'\n\t\t\t\t_combinedProjectionMatrix.lerpMatrices(_perspectiveProjection.matrix, _orthographicProjection.matrix, alpha);\n\t\t\t\tcamera.setProjectionMatrix(_combinedProjectionMatrix);\n\n\t\t\t\t_combinedProjectionMatrix.lerpMatrices(_perspectiveProjection.matrix, _skyboxProjection.matrix, params.projWeight);\n\t\t\t\t_combinedProjectionMatrix.toArray(skyBox.material.uniforms.u_Projection);\n\t\t\t}\n\t\t}\n\n\t\tfunction easeOut(t) {\n\t\t\treturn t === 1 ? 1 : 1 - Math.pow(2, -10 * t);\n\t\t}\n\n\t\tsetCameraProjection();\n\n\t\tconst gui = new GUI();\n\t\tgui.add(params, 'projWeight', 0, 1, 0.01).onChange(setCameraProjection);\n\n\t\tfunction loop(count) {\n\t\t\trequestAnimationFrame(loop);\n\n\t\t\tcontroller.update();\n\n\t\t\tforwardRenderer.render(scene, camera);\n\t\t}\n\t\trequestAnimationFrame(loop);\n\n\t\tfunction onWindowResize() {\n\t\t\twidth = window.innerWidth || 2;\n\t\t\theight = window.innerHeight || 2;\n\n\t\t\t_perspectiveProjection.aspect = width / height;\n\t\t\t_orthographicProjection.setSize(viewHeight * width / height, viewHeight);\n\t\t\t_skyboxProjection.aspect = width / height;\n\t\t\tsetCameraProjection();\n\n\t\t\tforwardRenderer.screenRenderTarget.resize(width, height);\n\t\t}\n\t\twindow.addEventListener('resize', onWindowResize, false);\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "examples/canvas2d_canvas2d.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>t3d - canvas2d</title>\n\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n\t<link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n</head>\n<body>\n    <div id=\"info\">\n        <a href=\"\" target=\"_blank\">t3d</a> - canvas2d\n    </div>\n\n\t<!-- Import maps polyfill -->\n    <!-- Remove this when import maps will be widely supported -->\n    <script async src=\"./libs/es-module-shims.js\"></script>\n\n    <script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n    <script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { Canvas2D } from 't3d/addons/canvas2d/Canvas2D.js';\n\t\timport { Sprite2D } from 't3d/addons/canvas2d/Sprite2D.js';\n\t\timport { Clock } from 't3d/addons/Clock.js';\n\t\timport { Texture2DLoader } from 't3d/addons/loaders/Texture2DLoader.js';\n\t\timport { GUI } from './libs/lil-gui.esm.min.js';\n\n\t\tlet width = window.innerWidth || 2;\n\t\tlet height = window.innerHeight || 2;\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = width;\n\t\tcanvas.height = height;\n\t\tdocument.body.appendChild(canvas);\n\n\t\tconst contextParams = { antialias: false, alpha: false };\n\t\tconst gl = canvas.getContext('webgl2', contextParams) || canvas.getContext('webgl', contextParams);\n\t\tconst renderer = new t3d.WebGLRenderer(gl);\n\n\t\tconst screenRenderTarget = new t3d.ScreenRenderTarget(canvas);\n\n\t\tconst scene = new t3d.Scene();\n\n\t\tconst sphere_geometry = new t3d.SphereGeometry(6, 20, 20);\n\t\tconst phong = new t3d.PhongMaterial();\n\t\tphong.diffuse.setHex(0xffffff);\n\t\tconst backSphere = new t3d.Mesh(sphere_geometry, phong);\n\t\tbackSphere.position.z = -30;\n\t\tscene.add(backSphere);\n\n\t\tconst canvas2d = new Canvas2D(50, 50, true);\n\t\tcanvas2d.renderLayer = 1;\n\t\tcanvas2d.setScreenMatchMode(Canvas2D.SCREEN_MATCH_MODE.SHRINK);\n\n\t\tconst texture = new Texture2DLoader().load('./resources/hardwood2_diffuse.jpg');\n\t\tconst sprites = [];\n\t\tfor (let i = 0; i < 90; i++) {\n\t\t\tconst sprite = new Sprite2D();\n\t\t\tif (i == 0) {\n\t\t\t\tsprite.x = 0;\n\t\t\t\tsprite.y = 0;\n\t\t\t} else if (i == 1) {\n\t\t\t\tsprite.x = 50 - 5;\n\t\t\t\tsprite.y = 0;\n\t\t\t} else if (i == 2) {\n\t\t\t\tsprite.x = 0;\n\t\t\t\tsprite.y = 50 - 5;\n\t\t\t} else if (i == 3) {\n\t\t\t\tsprite.x = 50 - 5;\n\t\t\t\tsprite.y = 50 - 5;\n\t\t\t} else {\n\t\t\t\tsprite.x = Math.random() * 30 + 10 - 5;\n\t\t\t\tsprite.y = Math.random() * 30 + 10 - 5;\n\t\t\t}\n\n\t\t\tsprite.width = 5;\n\t\t\tsprite.height = 5;\n\t\t\tsprite.texture = texture;\n\t\t\tsprite.anchorX = 0;\n\t\t\tsprite.anchorY = 0;\n\t\t\tcanvas2d.add(sprite);\n\t\t\tsprites.push(sprite);\n\t\t}\n\t\tscene.add(canvas2d);\n\t\t\n\t\tconst frontSphere = new t3d.Mesh(sphere_geometry, phong);\n\t\tfrontSphere.position.z = 30;\n\t\tscene.add(frontSphere);\n\n\t\tconst ambientLight = new t3d.AmbientLight(0xffffff, 0.3);\n\t\tscene.add(ambientLight);\n\n\t\tconst directionalLight = new t3d.DirectionalLight(0xffffff, 0.7);\n\t\tdirectionalLight.position.set(20, 30, 40);\n\t\tdirectionalLight.lookAt(new t3d.Vector3(), new t3d.Vector3(0, 1, 0));\n\t\tscene.add(directionalLight);\n\n\t\tconst camera = new t3d.Camera();\n\t\tcamera.position.set(0, 0, 100);\n\t\tcamera.lookAt(new t3d.Vector3(0, 0, 0), new t3d.Vector3(0, 1, 0));\n\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 1000);\n\t\tscene.add(camera);\n\n\t\t// input\n\t\tconst params = { screenMatchMode: 'SHRINK', scaleFactor: 1 };\n\n\t\tconst gui = new GUI();\n\t\tgui.add(canvas2d, 'isScreenCanvas').onChange(value => {\n\t\t\tif (value) {\n\t\t\t\tcanvas2d.renderLayer = 1;\n\t\t\t} else {\n\t\t\t\tcanvas2d.renderLayer = 0;\n\t\t\t}\n\t\t});\n\t\tgui.add(params, 'screenMatchMode', ['CONSTANT', 'SHRINK', 'EXPAND']).onChange(value => {\n\t\t\tcanvas2d.setScreenMatchMode(Canvas2D.SCREEN_MATCH_MODE[value]);\n\t\t});\n\t\tgui.add(params, 'scaleFactor', 0.1, 20, 0.01).onChange(value => {\n\t\t\tcanvas2d.setScaleFactor(value);\n\t\t});\n\n\t\tconst clock = new Clock();\n\n\t\tfunction loop(count) {\n\t\t\trequestAnimationFrame(loop);\n\n\t\t\t// rotate camera\n\t\t\tcamera.position.x = 100 * Math.sin(Math.sin(count / 1000));\n\t\t\tcamera.position.z = 100 * Math.cos(Math.sin(count / 1000));\n\t\t\tcamera.lookAt(new t3d.Vector3(0, 0, 0), new t3d.Vector3(0, 1, 0));\n\n\t\t\tconst deltaTime = clock.getDelta();\n\t\t\t//\n\t\t\tfor (let i = 4; i < sprites.length; i++) {\n\t\t\t\tsprites[i].rotation += 8 * deltaTime;\n\t\t\t}\n\n\t\t\tscene.updateMatrix();\n\t\t\tconst renderStates = scene.updateRenderStates(camera);\n\n\t\t\tconst renderQueue = scene.updateRenderQueue(camera);\n\t\t\tconst mainLayer = renderQueue.getLayer(0);\n\t\t\tconst uiLayer = renderQueue.getLayer(1);\n\n\t\t\trenderer.beginRender(screenRenderTarget);\n\t\t\n\t\t\trenderer.renderRenderableList(mainLayer.opaque, renderStates);\n\n\t\t\tlet arrayCount = 0;\n\t\t\trenderer.renderRenderableList(mainLayer.transparent, renderStates, {\n\t\t\t\tgetMaterial: function(renderable) {\n\t\t\t\t\tif (renderable.object === canvas2d) {\n\t\t\t\t\t\tconst material = canvas2d.sharedMaterial;\n\t\t\t\t\t\tmaterial.uniforms.spriteTexture = canvas2d.materialInfoArray[arrayCount];\n\t\t\t\t\t\tarrayCount++;\n\t\t\t\t\t\treturn material;\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn renderable.material;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tif (uiLayer && uiLayer.transparentCount > 0) {\n\t\t\t\tcanvas2d.setRenderViewport(0, 0, width, height);\n\n\t\t\t\tcanvas2d.orthoCamera.rect.x = canvas2d.viewport.x / width;\n\t\t\t\tcanvas2d.orthoCamera.rect.y = canvas2d.viewport.y / height;\n\t\t\t\tcanvas2d.orthoCamera.rect.z = canvas2d.viewport.z / width + canvas2d.viewport.x / width;\n\t\t\t\tcanvas2d.orthoCamera.rect.w = canvas2d.viewport.w / height + canvas2d.viewport.y / height;\n\n\t\t\t\tconst renderStates2d = scene.updateRenderStates(canvas2d.orthoCamera);\n\n\t\t\t\tlet arrayCount = 0;\n\t\t\t\trenderer.renderRenderableList(uiLayer.transparent, renderStates2d, {\n\t\t\t\t\tgetMaterial: function(renderable) {\n\t\t\t\t\t\tif (renderable.object === canvas2d) {\n\t\t\t\t\t\t\tcanvas2d.sharedMaterial.uniforms.spriteTexture = canvas2d.materialInfoArray[arrayCount];\n\t\t\t\t\t\t\tarrayCount++;\n\t\t\t\t\t\t\treturn canvas2d.sharedMaterial;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\treturn renderable.material;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\n\t\t\trenderer.endRender();\n\t\t}\n\t\trequestAnimationFrame(loop);\n\n\t\tfunction onWindowResize() {\n\t\t\twidth = window.innerWidth || 2;\n\t\t\theight = window.innerHeight || 2;\n\n\t\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 1000);\n\n\t\t\tscreenRenderTarget.resize(width, height);\n\t\t}\n\t\twindow.addEventListener('resize', onWindowResize, false);\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "examples/controls_camera_fly.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>t3d - camera fly controls</title>\n\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n\t<link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n</head>\n<body>\n    <div id=\"info\">\n        <a href=\"\" target=\"_blank\">t3d</a> - camera fly controls\n    </div>\n\n\t<!-- Import maps polyfill -->\n    <!-- Remove this when import maps will be widely supported -->\n    <script async src=\"./libs/es-module-shims.js\"></script>\n\n    <script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n    <script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { FlyControls } from 't3d/addons/controls/FlyControls.js';\n\t\timport { Clock } from 't3d/addons/Clock.js';\n\t\timport { ForwardRenderer } from 't3d/addons/render/ForwardRenderer.js';\n\n\t\tlet width = window.innerWidth || 2;\n\t\tlet height = window.innerHeight || 2;\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = width;\n\t\tcanvas.height = height;\n\t\tdocument.body.appendChild(canvas);\n\n\t\tconst forwardRenderer = new ForwardRenderer(canvas);\n\n\t\tconst scene = new t3d.Scene();\n\n\t\tconst sphere_geometry = new t3d.SphereGeometry(10, 20, 20);\n\n\t\tconst phong = new t3d.PhongMaterial();\n\t\tphong.diffuse.setHex(0xffffff);\n\t\tconst sphere = new t3d.Mesh(sphere_geometry, phong);\n\t\tscene.add(sphere);\n\n\t\tconst plane_geometry = new t3d.PlaneGeometry(100, 100);\n\t\tconst lambert = new t3d.LambertMaterial();\n\t\tlambert.diffuse.setHex(0xf0f0f0);\n\t\tconst plane = new t3d.Mesh(plane_geometry, lambert);\n\t\tplane.position.y = -10;\n\t\tscene.add(plane);\n\n\t\tconst ambientLight = new t3d.AmbientLight(0xffffff, 0.3);\n\t\tscene.add(ambientLight);\n\n\t\tconst directionalLight = new t3d.DirectionalLight(0xffffff, 0.6);\n\t\tdirectionalLight.position.set(20, 30, 40);\n\t\tdirectionalLight.lookAt(new t3d.Vector3(), new t3d.Vector3(0, 1, 0));\n\t\tscene.add(directionalLight);\n\n\t\tconst camera = new t3d.Camera();\n\t\tcamera.position.set(40, 80, 100);\n\t\tcamera.lookAt(new t3d.Vector3(0, 0, 0), new t3d.Vector3(0, 1, 0));\n\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 1000);\n\t\tscene.add(camera);\n\n\t\tconst controller = new FlyControls(camera, canvas);\n\n\t\tconst clock = new Clock();\n\n\t\tfunction loop(count) {\n\t\t\trequestAnimationFrame(loop);\n\n\t\t\tcontroller.update(clock.getDelta());\n\n\t\t\tforwardRenderer.render(scene, camera);\n\t\t}\n\t\trequestAnimationFrame(loop);\n\n\t\tfunction onWindowResize() {\n\t\t\twidth = window.innerWidth || 2;\n\t\t\theight = window.innerHeight || 2;\n\n\t\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 1000);\n\n\t\t\tforwardRenderer.screenRenderTarget.resize(width, height);\n\t\t}\n\t\twindow.addEventListener('resize', onWindowResize, false);\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "examples/controls_camera_free.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>t3d - camera free controls</title>\n\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n\t<link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n</head>\n<body>\n    <div id=\"info\">\n        <a href=\"\" target=\"_blank\">t3d</a> - camera free controls\n    </div>\n\n\t<!-- Import maps polyfill -->\n    <!-- Remove this when import maps will be widely supported -->\n    <script async src=\"./libs/es-module-shims.js\"></script>\n\n    <script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n    <script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { FreeControls } from 't3d/addons/controls/FreeControls.js';\n\t\timport { Clock } from 't3d/addons/Clock.js';\n\t\timport { ForwardRenderer } from 't3d/addons/render/ForwardRenderer.js';\n\n\t\tlet width = window.innerWidth || 2;\n\t\tlet height = window.innerHeight || 2;\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = width;\n\t\tcanvas.height = height;\n\t\tdocument.body.appendChild(canvas);\n\n\t\tconst forwardRenderer = new ForwardRenderer(canvas);\n\n\t\tconst scene = new t3d.Scene();\n\n\t\tconst sphere_geometry = new t3d.SphereGeometry(10, 20, 20);\n\n\t\tconst phong = new t3d.PhongMaterial();\n\t\tphong.diffuse.setHex(0xffffff);\n\t\tconst sphere = new t3d.Mesh(sphere_geometry, phong);\n\t\tscene.add(sphere);\n\n\t\tconst plane_geometry = new t3d.PlaneGeometry(100, 100);\n\t\tconst lambert = new t3d.LambertMaterial();\n\t\tlambert.diffuse.setHex(0xf0f0f0);\n\t\tconst plane = new t3d.Mesh(plane_geometry, lambert);\n\t\tplane.position.y = -10;\n\t\tscene.add(plane);\n\n\t\tconst ambientLight = new t3d.AmbientLight(0xffffff, 0.3);\n\t\tscene.add(ambientLight);\n\n\t\tconst directionalLight = new t3d.DirectionalLight(0xffffff, 0.6);\n\t\tdirectionalLight.position.set(20, 30, 40);\n\t\tdirectionalLight.lookAt(new t3d.Vector3(), new t3d.Vector3(0, 1, 0));\n\t\tscene.add(directionalLight);\n\n\t\tconst camera = new t3d.Camera();\n\t\tcamera.position.set(0, 80, 100);\n\t\tcamera.lookAt(new t3d.Vector3(0, 0, 0), new t3d.Vector3(0, 1, 0));\n\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 1000);\n\t\tscene.add(camera);\n\n\t\tconst controller = new FreeControls(camera, canvas);\n\t\tcontroller.rotateSpeed = 1;\n\n\t\tconst clock = new Clock();\n\n\t\tfunction loop(count) {\n\t\t\trequestAnimationFrame(loop);\n\n\t\t\tconst change = controller.update(clock.getDelta());\n\n\t\t\tif (change) {\n\t\t\t\tconsole.info('camera change');\n\t\t\t}\n\n\t\t\tforwardRenderer.render(scene, camera);\n\t\t}\n\t\trequestAnimationFrame(loop);\n\n\t\tfunction onWindowResize() {\n\t\t\twidth = window.innerWidth || 2;\n\t\t\theight = window.innerHeight || 2;\n\n\t\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 1000);\n\n\t\t\tforwardRenderer.screenRenderTarget.resize(width, height);\n\t\t}\n\t\twindow.addEventListener('resize', onWindowResize, false);\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "examples/controls_camera_orbit.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>t3d - camera orbit controls</title>\n\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n\t<link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n</head>\n<body>\n\n    <div id=\"info\">\n        <a href=\"\" target=\"_blank\">t3d</a> - camera orbit controls\n    </div>\n\n\t<!-- Import maps polyfill -->\n    <!-- Remove this when import maps will be widely supported -->\n    <script async src=\"./libs/es-module-shims.js\"></script>\n\n    <script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n    <script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { OrbitControls } from 't3d/addons/controls/OrbitControls.js';\n\t\timport { ForwardRenderer } from 't3d/addons/render/ForwardRenderer.js';\n\n\t\tlet width = window.innerWidth || 2;\n\t\tlet height = window.innerHeight || 2;\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = width;\n\t\tcanvas.height = height;\n\t\tdocument.body.appendChild(canvas);\n\n\t\tconst forwardRenderer = new ForwardRenderer(canvas);\n\n\t\tconst scene = new t3d.Scene();\n\n\t\tconst sphere_geometry = new t3d.SphereGeometry(10, 20, 20);\n\n\t\tconst phong = new t3d.PhongMaterial();\n\t\tphong.diffuse.setHex(0xffffff);\n\t\tconst sphere = new t3d.Mesh(sphere_geometry, phong);\n\t\tscene.add(sphere);\n\n\t\tconst plane_geometry = new t3d.PlaneGeometry(100, 100);\n\t\tconst lambert = new t3d.LambertMaterial();\n\t\tlambert.diffuse.setHex(0xf0f0f0);\n\t\tconst plane = new t3d.Mesh(plane_geometry, lambert);\n\t\tplane.position.y = -10;\n\t\tscene.add(plane);\n\n\t\tconst ambientLight = new t3d.AmbientLight(0xffffff, 0.3);\n\t\tscene.add(ambientLight);\n\n\t\tconst directionalLight = new t3d.DirectionalLight(0xffffff, 0.6);\n\t\tdirectionalLight.position.set(20, 30, 40);\n\t\tdirectionalLight.lookAt(new t3d.Vector3(), new t3d.Vector3(0, 1, 0));\n\t\tscene.add(directionalLight);\n\n\t\tconst camera = new t3d.Camera();\n\t\tcamera.position.set(40, 80, 100);\n\t\tcamera.lookAt(new t3d.Vector3(0, 0, 0), new t3d.Vector3(0, 1, 0));\n\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 1000);\n\t\tscene.add(camera);\n\n\t\tconst controller = new OrbitControls(camera, canvas);\n\t\tcontroller.screenSpacePanning = true;\n\n\t\tfunction loop(count) {\n\t\t\trequestAnimationFrame(loop);\n\n\t\t\tconst change = controller.update();\n\n\t\t\tif (change) {\n\t\t\t\tconsole.info('camera changing');\n\t\t\t}\n\n\t\t\tforwardRenderer.render(scene, camera);\n\t\t}\n\t\trequestAnimationFrame(loop);\n\n\t\tfunction onWindowResize() {\n\t\t\twidth = window.innerWidth || 2;\n\t\t\theight = window.innerHeight || 2;\n\n\t\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 1000);\n\n\t\t\tforwardRenderer.screenRenderTarget.resize(width, height);\n\t\t}\n\t\twindow.addEventListener('resize', onWindowResize, false);\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "examples/controls_camera_view.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>t3d - camera view controls</title>\n\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n\t<link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n</head>\n<body>\n    <div id=\"info\">\n        <a href=\"\" target=\"_blank\">t3d</a> - camera view controls\n    </div>\n\t<div style=\"position: absolute;\"></div>\n\n\t<!-- Import maps polyfill -->\n    <!-- Remove this when import maps will be widely supported -->\n    <script async src=\"./libs/es-module-shims.js\"></script>\n\n    <script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n    <script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { Clock } from 't3d/addons/Clock.js';\n\t\timport { ForwardRenderer } from 't3d/addons/render/ForwardRenderer.js';\n\t\timport { OrbitControls } from 't3d/addons/controls/OrbitControls.js';\n\t\timport { AxisHelper } from 't3d/addons/objects/AxisHelper.js';\n\t\timport { ViewControls } from 't3d/addons/controls/ViewControls.js';\n\t\timport { GUI } from './libs/lil-gui.esm.min.js';\n\n\t\tlet width = window.innerWidth || 2;\n\t\tlet height = window.innerHeight || 2;\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = width;\n\t\tcanvas.height = height;\n\t\tdocument.body.appendChild(canvas);\n\n\t\tconst forwardRenderer = new ForwardRenderer(canvas);\n\t\tforwardRenderer.screenRenderTarget.setColorClearValue(0.1, 0.1, 0.1, 1);\n\n\t\tconst scene = new t3d.Scene();\n\t\tconst axis = new AxisHelper(30);\n\t\tscene.add(axis);\n\n\t\tconst camera = new t3d.Camera();\n\t\tcamera.position.set(40, 40, 100);\n\t\tcamera.lookAt(new t3d.Vector3(0, 0, 0), new t3d.Vector3(0, 1, 0));\n\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 1000);\n\t\tscene.add(camera);\n\n\t\tconst controller = new OrbitControls(camera, canvas);\n\n\t\tconst viewControls = new ViewControls(camera, {\n\t\t\ttarget: controller.target,\n\t\t\tup: controller.up,\n\t\t\tstyle: 'position:fixed;top:0;left:0;opacity:0.9;z-index:10000;user-select:none;'\n\t\t});\n\t\tdocument.body.appendChild(viewControls.domElement);\n\n\t\tconst gui = new GUI();\n\t\tgui.add(viewControls, 'interactive');\n\t\tgui.add(viewControls, 'size', 100, 200, 1).onChange(value => {\n\t\t\tviewControls.domElement.width = value;\n\t\t\tviewControls.domElement.height = value;\n\t\t\tviewControls.needsUpdate = true;\n\t\t});\n\t\tgui.add(viewControls, 'padding', 5, 20, 1).onChange(() => viewControls.needsUpdate = true);\n\t\tgui.add(viewControls, 'pointRadius', 5, 20, 1).onChange(() => viewControls.needsUpdate = true);\n\t\tgui.add({ fontSize: 16 }, 'fontSize', 12, 30, 1).onChange(value => {\n\t\t\tviewControls.font = 'bold ' + value + 'px Arial';\n\t\t\tviewControls.needsUpdate = true;\n\t\t});\n\t\tgui.addColor(viewControls, 'fontColor').onChange(() => viewControls.needsUpdate = true);\n\t\tgui.add(viewControls, 'lineWidth', 1, 10, 1).onChange(() => viewControls.needsUpdate = true);\n\n\t\tconst clock = new Clock();\n\t\tfunction loop(count) {\n\t\t\trequestAnimationFrame(loop);\n\t\t\n\t\t\tconst deltaTime = clock.getDelta();\n\t\t\n\t\t\tcontroller.update(deltaTime);\n\n\t\t\tviewControls.update(deltaTime);\n\n\t\t\tforwardRenderer.render(scene, camera);\n\t\t}\n\t\trequestAnimationFrame(loop);\n\n\t\tfunction onWindowResize() {\n\t\t\twidth = window.innerWidth || 2;\n\t\t\theight = window.innerHeight || 2;\n\n\t\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 1000);\n\n\t\t\tforwardRenderer.screenRenderTarget.resize(width, height);\n\t\t}\n\t\twindow.addEventListener('resize', onWindowResize, false);\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "examples/controls_transform.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n    <meta charset=\"utf-8\">\n    <title>t3d - transform controls</title>\n    <meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n    <link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n</head>\n<body>\n    <div id=\"info\">\n        <a href=\"\" target=\"_blank\">t3d</a> - transform controls\n\t\t<br/>\"W\" translate | \"E\" rotate | \"R\" scale | \"A\" all\n\t\t<br/>\"Shift\" snap or select multiple\n    </div>\n\n    <!-- Import maps polyfill -->\n    <!-- Remove this when import maps will be widely supported -->\n    <script async src=\"./libs/es-module-shims.js\"></script>\n\n    <script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n    <script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { GUI } from './libs/lil-gui.esm.min.js';\n\t\timport { ForwardRenderer } from 't3d/addons/render/ForwardRenderer.js';\n\t\timport { Texture2DLoader } from 't3d/addons/loaders/Texture2DLoader.js';\n\t\timport { GridHelper } from 't3d/addons/objects/GridHelper.js';\n\t\timport { OrbitControls } from 't3d/addons/controls/OrbitControls.js';\n\t\timport { TransformControls } from 't3d/addons/controls/TransformControls.js';\n\n\t\tlet width = window.innerWidth || 2;\n\t\tlet height = window.innerHeight || 2;\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = width;\n\t\tcanvas.height = height;\n\t\tdocument.body.appendChild(canvas);\n\n\t\tconst forwardRenderer = new ForwardRenderer(canvas);\n\t\tforwardRenderer.screenRenderTarget.setColorClearValue(0.6, 0.7, 0.8, 1);\n\n\t\tconst scene = new t3d.Scene();\n\n\t\tconst camera = new t3d.Camera();\n\t\tcamera.position.set(0, 8, 10);\n\t\tcamera.lookAt(new t3d.Vector3(0, 0, 0), new t3d.Vector3(0, 1, 0));\n\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 500);\n\t\tscene.add(camera);\n\n\t\tconst ambientLight = new t3d.AmbientLight(0xffffff, 0.4);\n\t\tscene.add(ambientLight);\n\n\t\tconst directionalLight = new t3d.DirectionalLight(0xffffff, 0.9);\n\t\tdirectionalLight.position.set(20, 30, 40);\n\t\tdirectionalLight.lookAt(new t3d.Vector3(), new t3d.Vector3(0, 1, 0));\n\t\tscene.add(directionalLight);\n\n\t\tconst texture = new Texture2DLoader().load('./resources/logo.jpg');\n\n\t\tconst boxGeometry = new t3d.BoxGeometry(1, 1, 1);\n\t\tconst boxMaterial = new t3d.LambertMaterial();\n\t\tboxMaterial.diffuseMap = texture;\n\n\t\tconst boxes = [];\n\t\tconst box1 = new t3d.Mesh(boxGeometry, boxMaterial);\n\t\tbox1.position.set(-2, 0, 0);\n\t\tbox1.euler.set(Math.PI / 6, 0, Math.PI / 6);\n\t\tscene.add(box1);\n\t\tboxes.push(box1);\n\t\tconst box2 = new t3d.Mesh(boxGeometry, boxMaterial);\n\t\tbox2.position.set(2, 0, 0);\n\t\tscene.add(box2);\n\t\tboxes.push(box2);\n\n\t\tconst grid = new GridHelper(50, 50, 0xffffff, 0x888888);\n\t\tscene.add(grid);\n\n\t\tconst controller = new OrbitControls(camera, canvas);\n\n\t\tcamera.updateMatrix();\n\t\tconst transformControls = new TransformControls(camera, canvas);\n\t\tscene.add(transformControls);\n\n\t\tconst raycaster = new t3d.Raycaster();\n\t\tconst mouse = new t3d.Vector2();\n\t\tlet shiftKeyPressed = false;\n\n\t\tdocument.addEventListener('mousedown', event => {\n\t\t\tif (event.button !== 0) return;\n\t\t\tmouse.x = (event.clientX / window.innerWidth) * 2 - 1;\n\t\t\tmouse.y = -(event.clientY / window.innerHeight) * 2 + 1;\n\n\t\t\traycaster.setFromCamera(mouse, camera);\n\n\t\t\tconst array = raycaster.intersectObjects(boxes, true);\n\t\t\tif (array.length) {\n\t\t\t\tconst object = array[0].object;\n\t\t\t\tif (!shiftKeyPressed) {\n\t\t\t\t\ttransformControls.group.reset();\n\t\t\t\t}\n\t\t\t\ttransformControls.group.addObject(object);\n\t\t\t\tsyncTransformPanel();\n\t\t\t}\n\t\t});\n\n\t\tdocument.addEventListener('keydown', event => {\n\t\t\tswitch (event.key) {\n\t\t\t\tcase 'w':\n\t\t\t\t\ttransformControls.mode = 'translate';\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'r':\n\t\t\t\t\ttransformControls.mode = 'scale';\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'e':\n\t\t\t\t\ttransformControls.mode = 'rotate';\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'a':\n\t\t\t\t\ttransformControls.mode = 'all';\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'Shift':\n\t\t\t\t\tshiftKeyPressed = true;\n\t\t\t\t\ttransformControls.translateSnap = params.translateSnap;\n\t\t\t\t\ttransformControls.scaleSnap = params.scaleSnap;\n\t\t\t\t\ttransformControls.rotateSnap = params.rotateSnap * Math.PI / 180;\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t});\n\n\t\tdocument.addEventListener('keyup', event => {\n\t\t\tswitch (event.key) {\n\t\t\t\tcase 'Shift':\n\t\t\t\t\tshiftKeyPressed = false;\n\t\t\t\t\ttransformControls.translateSnap = null;\n\t\t\t\t\ttransformControls.scaleSnap = null;\n\t\t\t\t\ttransformControls.rotateSnap = null;\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t});\n\n\t\tconst params = { translateSnap: 1, scaleSnap: 0.5, rotateSnap: 30, translate: '0.00, 0.00, 0.00', rotate: '0.00, 0.00, 0.00', scale: '1.00, 1.00, 1.00' };\n\t\tconst gui = new GUI();\n\t\tgui.add(transformControls, 'mode', ['translate', 'scale', 'rotate', 'all']).listen();\n\t\tgui.add(transformControls, 'size', 0.5, 1.5);\n\t\tgui.add(transformControls.group, 'anchorType', ['center', 'pivot']).onChange(syncTransformPanel);\n\t\tgui.add(transformControls.group, 'coordinateType', ['local', 'global']);\n\t\tconst snapFolder = gui.addFolder('Snap').close();\n\t\tsnapFolder.add(params, 'translateSnap', 0, 10, 0.1);\n\t\tsnapFolder.add(params, 'scaleSnap', 0, 10, 0.1);\n\t\tsnapFolder.add(params, 'rotateSnap', 0, 180, 1);\n\t\tconst transformFolder = gui.addFolder('Transform');\n\t\ttransformFolder.add(params, 'translate').listen().disable();\n\t\ttransformFolder.add(params, 'rotate').listen().disable();\n\t\ttransformFolder.add(params, 'scale').listen().disable();\n\n\t\tconst tempWorldMatrix = new t3d.Matrix4();\n\t\tconst tempPosition = new t3d.Vector3();\n\t\tconst tempQuaternion = new t3d.Quaternion();\n\t\tconst tempScale = new t3d.Vector3();\n\t\tconst tempEuler = new t3d.Euler();\n\n\t\tfunction processNumber(value, radToDeg = false) {\n\t\t\tif (radToDeg) {\n\t\t\t\tvalue *= 180 / Math.PI;\n\t\t\t}\n\n\t\t\tvalue = Math.round(value * 100) / 100;\n\n\t\t\treturn value.toFixed(2);\n\t\t}\n\n\t\tfunction syncTransformPanel() {\n\t\t\tif (transformControls.group.objects.length > 1) {\n\t\t\t\ttransformControls.group.getWorldMatrix(tempWorldMatrix);\n\t\t\t\ttempWorldMatrix.decompose(tempPosition, tempQuaternion, tempScale);\n\t\t\t\ttempEuler.setFromQuaternion(tempQuaternion);\n\t\t\t} else if (transformControls.group.objects.length > 0) {\n\t\t\t\tconst object = transformControls.group.objects[0];\n\t\t\t\ttempPosition.copy(object.position);\n\t\t\t\ttempEuler.copy(object.euler);\n\t\t\t\ttempScale.copy(object.scale);\n\t\t\t} else {\n\t\t\t\ttempPosition.set(0, 0, 0);\n\t\t\t\ttempEuler.set(0, 0, 0);\n\t\t\t\ttempScale.set(1, 1, 1);\n\t\t\t}\n\n\t\t\tparams.translate = `${processNumber(tempPosition.x)}, ${processNumber(tempPosition.y)}, ${processNumber(tempPosition.z)}`;\n\t\t\tparams.rotate = `${processNumber(tempEuler.x, true)}, ${processNumber(tempEuler.y, true)}, ${processNumber(tempEuler.z, true)}`;\n\t\t\tparams.scale = `${processNumber(tempScale.x)}, ${processNumber(tempScale.y)}, ${processNumber(tempScale.z)}`;\n\t\t}\n\n\t\tbox1.updateMatrix();\n\t\ttransformControls.group.addObject(box1);\n\t\ttransformControls.onDrag = syncTransformPanel;\n\t\tsyncTransformPanel();\n\n\t\ttransformControls.onDragStart = function() {\n\t\t\tcontroller.enabled = false;\n\t\t};\n\n\t\ttransformControls.onDragEnd = function() {\n\t\t\tcontroller.enabled = true;\n\t\t};\n\n\t\tfunction loop(count) {\n\t\t\trequestAnimationFrame(loop);\n\n\t\t\tcontroller.update();\n\n\t\t\ttransformControls.update();\n\n\t\t\tforwardRenderer.render(scene, camera);\n\t\t}\n\n\t\trequestAnimationFrame(loop);\n\n\t\tfunction onWindowResize() {\n\t\t\twidth = window.innerWidth || 2;\n\t\t\theight = window.innerHeight || 2;\n\n\t\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 500);\n\n\t\t\tforwardRenderer.screenRenderTarget.resize(width, height);\n\t\t}\n\n\t\twindow.addEventListener('resize', onWindowResize, false);\n    </script>\n</body>\n</html>"
  },
  {
    "path": "examples/custompass_bloom.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>t3d - custom pass bloom</title>\n\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n\t<link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n</head>\n<body>\n    <div id=\"info\">\n        <a href=\"\" target=\"_blank\">t3d</a> - custom pass bloom\n    </div>\n\n\t<script src=\"./libs/nanobar.js\"></script>\n\n\t<!-- Import maps polyfill -->\n    <!-- Remove this when import maps will be widely supported -->\n    <script async src=\"./libs/es-module-shims.js\"></script>\n\n    <script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n    <script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { GLTFLoader } from 't3d/addons/loaders/glTF/GLTFLoader.js';\n\t\timport { OrbitControls } from 't3d/addons/controls/OrbitControls.js';\n\t\timport { BlurShader } from 't3d/addons/shaders/BlurShader.js';\n\t\timport { CopyShader } from 't3d/addons/shaders/CopyShader.js';\n\t\timport { LuminosityHighPassShader } from 't3d/addons/shaders/LuminosityHighPassShader.js';\n\t\timport { BlurPass } from 't3d/addons/pass/BlurPass.js';\n\t\timport { Clock } from 't3d/addons/Clock.js';\n\t\timport { GUI } from './libs/lil-gui.esm.min.js';\n\n\t\tlet width = window.innerWidth || 2;\n\t\tlet height = window.innerHeight || 2;\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = width;\n\t\tcanvas.height = height;\n\t\tdocument.body.appendChild(canvas);\n\n\t\tconst scene = new t3d.Scene();\n\n\t\tconst nanobar = new Nanobar();\n\t\tnanobar.el.style.background = 'gray';\n\n\t\tconst loadingManager = new t3d.LoadingManager(function() {\n\t\t\tnanobar.go(100);\n\t\t\tnanobar.el.style.background = 'transparent';\n\t\t}, function(url, itemsLoaded, itemsTotal) {\n\t\t\tif (itemsLoaded < itemsTotal) {\n\t\t\t\tnanobar.go(itemsLoaded / itemsTotal * 100);\n\t\t\t}\n\t\t});\n\n\t\tlet animation;\n\n\t\tconst loader = new GLTFLoader(loadingManager);\n\t\tloader.load('./resources/models/gltf/PrimaryIonDrive.glb').then(function(result) {\n\t\t\tconst object = result.root;\n\n\t\t\tobject.traverse(function(obj) {\n\t\t\t\tif (obj.material && obj.material.transparent) {\n\t\t\t\t\tobj.material.depthWrite = false;\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tanimation = new t3d.AnimationMixer();\n\t\t\tresult.animations.forEach(function(clip) {\n\t\t\t\tconst action = new t3d.AnimationAction(clip);\n\t\t\t\taction.weight = 1;\n\t\t\t\tanimation.addAction(action);\n\t\t\t});\n\n\t\t\tscene.add(object);\n\t\t});\n\n\t\tconst ambientLight = new t3d.AmbientLight(0xffffff, 1);\n\t\tscene.add(ambientLight);\n\n\t\tconst directionalLight = new t3d.DirectionalLight(0xffffff, 1);\n\t\tdirectionalLight.position.set(-3, 3, 0);\n\t\tdirectionalLight.lookAt(new t3d.Vector3(), new t3d.Vector3(0, 1, 0));\n\t\tscene.add(directionalLight);\n\n\t\tconst camera = new t3d.Camera();\n\t\tcamera.position.set(-1, 2, 5);\n\t\tcamera.lookAt(new t3d.Vector3(0, 0, 0), new t3d.Vector3(0, 1, 0));\n\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 500);\n\t\tscene.add(camera);\n\n\t\tconst controller = new OrbitControls(camera, canvas);\n\n\t\tconst screenRenderTarget = new t3d.ScreenRenderTarget(canvas);\n\n\t\tconst contextParams = { antialias: false, alpha: false };\n\t\tconst gl = canvas.getContext('webgl2', contextParams) || canvas.getContext('webgl', contextParams);\n\t\tconst renderer = new t3d.WebGLRenderer(gl);\n\n\t\tconst tempRenderTarget = t3d.OffscreenRenderTarget.create2D(width, height);\n\t\ttempRenderTarget.texture.minFilter = t3d.TEXTURE_FILTER.LINEAR;\n\t\ttempRenderTarget.texture.magFilter = t3d.TEXTURE_FILTER.LINEAR;\n\t\ttempRenderTarget.generateMipmaps = false;\n\n\t\tconst tempRenderTarget1 = t3d.OffscreenRenderTarget.create2D(width, height);\n\t\ttempRenderTarget1.texture.minFilter = t3d.TEXTURE_FILTER.LINEAR;\n\t\ttempRenderTarget1.texture.magFilter = t3d.TEXTURE_FILTER.LINEAR;\n\t\ttempRenderTarget1.generateMipmaps = false;\n\n\t\tconst tempRenderTarget2 = t3d.OffscreenRenderTarget.create2D(width, height);\n\t\ttempRenderTarget2.texture.minFilter = t3d.TEXTURE_FILTER.LINEAR;\n\t\ttempRenderTarget2.texture.magFilter = t3d.TEXTURE_FILTER.LINEAR;\n\t\ttempRenderTarget2.generateMipmaps = false;\n\n\t\tconst shadowMapPass = new t3d.ShadowMapPass();\n\n\t\tconst highLightPass = new t3d.ShaderPostPass(LuminosityHighPassShader);\n\t\thighLightPass.uniforms.luminosityThreshold = 0;\n\t\thighLightPass.uniforms.tDiffuse = tempRenderTarget.texture;\n\n\t\tconst blurXPass = new BlurPass(BlurShader);\n\t\tblurXPass.uniforms.tDiffuse = tempRenderTarget1.texture;\n\t\tblurXPass.uniforms.textureSize = [width, height];\n\t\tblurXPass.uniforms.blurSize = 3;\n\t\tblurXPass.uniforms.direction = 0;\n\t\tblurXPass.setKernelSize(13);\n\n\t\tconst blurYPass = new BlurPass(BlurShader);\n\t\tblurYPass.uniforms.tDiffuse = tempRenderTarget2.texture;\n\t\tblurYPass.uniforms.textureSize = [width, height];\n\t\tblurYPass.uniforms.blurSize = 3;\n\t\tblurYPass.uniforms.direction = 1;\n\t\tblurYPass.setKernelSize(13);\n\n\t\tconst copyPass = new t3d.ShaderPostPass(CopyShader);\n\n\t\t// gui\n\t\tconst bloomParams = { enable: true, intensity: 2, kernelSize: 13 };\n\t\tconst gui = new GUI();\n\t\tgui.add({ version: 'WebGL ' + renderer.capabilities.version }, 'version').disable();\n\t\tgui.add(bloomParams, 'enable');\n\t\tgui.add(highLightPass.uniforms, 'luminosityThreshold', 0, 1, 0.01);\n\t\tgui.add(blurXPass.uniforms, 'blurSize', 0, 10, 0.01);\n\t\tgui.add(blurYPass.uniforms, 'blurSize', 0, 10, 0.01);\n\t\tgui.add(bloomParams, 'intensity', 0, 3, 0.01);\n\t\tgui.add(bloomParams, 'kernelSize', [5, 9, 13]).onChange(val => {\n\t\t\tblurXPass.setKernelSize(val);\n\t\t\tblurYPass.setKernelSize(val);\n\t\t});\n\n\t\tconst clock = new Clock();\n\n\t\tfunction loop(count) {\n\t\t\trequestAnimationFrame(loop);\n\n\t\t\tcontroller.update();\n\t\t\tanimation && animation.update(clock.getDelta());\n\n\t\t\tscene.updateMatrix();\n\t\t\tscene.updateRenderStates(camera);\n\t\t\tscene.updateRenderQueue(camera);\n\n\t\t\tshadowMapPass.render(renderer, scene);\n\n\t\t\trenderer.renderScene(scene, camera, tempRenderTarget);\n\n\t\t\thighLightPass.render(renderer, tempRenderTarget1);\n\n\t\t\tblurXPass.render(renderer, tempRenderTarget2);\n\n\t\t\tblurYPass.render(renderer, tempRenderTarget1);\n\n\t\t\tcopyPass.material.transparent = false;\n\t\t\tcopyPass.uniforms.tDiffuse = tempRenderTarget.texture;\n\t\t\tcopyPass.uniforms.opacity = 1;\n\t\t\tscreenRenderTarget.setClear(true, true, true);\n\t\t\tcopyPass.render(renderer, screenRenderTarget);\n\n\t\t\tif (bloomParams.enable) {\n\t\t\t\tcopyPass.material.transparent = true;\n\t\t\t\tcopyPass.material.blending = t3d.BLEND_TYPE.ADD;\n\t\t\t\tcopyPass.uniforms.tDiffuse = tempRenderTarget1.texture;\n\t\t\t\tcopyPass.uniforms.opacity = bloomParams.intensity;\n\t\t\t\tscreenRenderTarget.setClear(false, false, false);\n\t\t\t\tcopyPass.render(renderer, screenRenderTarget);\n\t\t\t}\n\t\t}\n\t\trequestAnimationFrame(loop);\n\n\t\tfunction onWindowResize() {\n\t\t\twidth = window.innerWidth || 2;\n\t\t\theight = window.innerHeight || 2;\n\n\t\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 500);\n\n\t\t\tscreenRenderTarget.resize(width, height);\n\t\t\ttempRenderTarget.resize(width, height);\n\t\t\ttempRenderTarget1.resize(width, height);\n\n\t\t\tblurXPass.uniforms.textureSize = [width, height];\n\t\t\tblurYPass.uniforms.textureSize = [width, height];\n\t\t}\n\t\twindow.addEventListener('resize', onWindowResize, false);\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "examples/custompass_blur.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>t3d - custom pass blur</title>\n\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n\t<link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n</head>\n<body>\n    <div id=\"info\">\n        <a href=\"\" target=\"_blank\">t3d</a> - custom pass blur\n    </div>\n\n\t<!-- Import maps polyfill -->\n    <!-- Remove this when import maps will be widely supported -->\n    <script async src=\"./libs/es-module-shims.js\"></script>\n\n    <script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n    <script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { AssimpJsonLoader } from 't3d/addons/loaders/AssimpJsonLoader.js';\n\t\timport { FastGaussianBlurShader } from 't3d/addons/shaders/FastGaussianBlurShader.js';\n\t\timport { GUI } from './libs/lil-gui.esm.min.js';\n\n\t\tlet width = window.innerWidth || 2;\n\t\tlet height = window.innerHeight || 2;\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = width;\n\t\tcanvas.height = height;\n\t\tdocument.body.appendChild(canvas);\n\n\t\tconst scene = new t3d.Scene();\n\n\t\tconst jeep = 'resources/models/assimp/jeep/jeep.assimp.json';\n\t\tconst interior = 'resources/models/assimp/interior/interior.assimp.json';\n\n\t\tconst loader1 = new AssimpJsonLoader();\n\t\tloader1.load(jeep, function(object) {\n\t\t\tobject.scale.set(0.4, 0.4, 0.4);\n\t\t\tobject.traverse(function(obj) {\n\t\t\t\tif (obj.isMesh) {\n\t\t\t\t\tobj.castShadow = true;\n\t\t\t\t}\n\t\t\t});\n\t\t\tscene.add(object);\n\t\t});\n\n\t\tconst loader2 = new AssimpJsonLoader();\n\t\tloader2.load(interior, function(object) {\n\t\t\tobject.traverse(function(obj) {\n\t\t\t\tif (obj.isMesh) {\n\t\t\t\t\tobj.receiveShadow = true;\n\t\t\t\t}\n\t\t\t});\n\t\t\tscene.add(object);\n\t\t});\n\n\t\tconst ambientLight = new t3d.AmbientLight(0xffffff, 0.1);\n\t\tscene.add(ambientLight);\n\n\t\tconst spotLight = new t3d.SpotLight(0xffffff, 0.5, 30, Math.PI / 5, 0.4);\n\t\tspotLight.position.set(0, 10, 0);\n\t\tspotLight.lookAt(new t3d.Vector3(0, 0, 0), new t3d.Vector3(0, 1, 0));\n\t\tspotLight.castShadow = true;\n\t\tscene.add(spotLight);\n\n\t\tconst camera = new t3d.Camera();\n\t\tcamera.position.set(0, 4, 10);\n\t\tcamera.lookAt(new t3d.Vector3(0, 0, 0), new t3d.Vector3(0, 1, 0));\n\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 1000);\n\t\tscene.add(camera);\n\n\t\t// custom pass\n\t\tconst screenRenderTarget = new t3d.ScreenRenderTarget(canvas);\n\t\tconst tempRenderTarget1 = t3d.OffscreenRenderTarget.create2D(width, height);\n\t\ttempRenderTarget1.texture.minFilter = t3d.TEXTURE_FILTER.LINEAR;\n\t\ttempRenderTarget1.texture.magFilter = t3d.TEXTURE_FILTER.LINEAR;\n\t\ttempRenderTarget1.texture.encoding = t3d.TEXEL_ENCODING_TYPE.SRGB;\n\t\tconst tempRenderTarget2 = t3d.OffscreenRenderTarget.create2D(width, height);\n\t\ttempRenderTarget2.texture.minFilter = t3d.TEXTURE_FILTER.LINEAR;\n\t\ttempRenderTarget2.texture.magFilter = t3d.TEXTURE_FILTER.LINEAR;\n\n\t\tconst contextParams = { antialias: false, alpha: false };\n\t\tconst gl = canvas.getContext('webgl2', contextParams) || canvas.getContext('webgl', contextParams);\n\t\tconst renderer = new t3d.WebGLRenderer(gl);\n\n\t\tconst shadowMapPass = new t3d.ShadowMapPass();\n\t\tconst blurPass = new t3d.ShaderPostPass(FastGaussianBlurShader);\n\n\t\t// gui\n\t\tconst params = { radius: 5 };\n\t\tconst gui = new GUI();\n\t\tgui.add({ version: 'WebGL ' + renderer.capabilities.version }, 'version').disable();\n\t\tgui.add(params, 'radius', 0, 10, 0.01);\n\t\tgui.add(blurPass.material.defines, 'SAMPLERS', [5, 9, 13]).onChange(val => {\n\t\t\tblurPass.material.needsUpdate = true;\n\t\t});\n\n\t\tfunction loop(count) {\n\t\t\trequestAnimationFrame(loop);\n\n\t\t\t// rotate camera\n\t\t\tcamera.position.x = 10 * Math.sin(count / 1000 * .5);\n\t\t\tcamera.position.z = 10 * Math.cos(count / 1000 * .5);\n\t\t\tcamera.lookAt(new t3d.Vector3(0, 0, 0), new t3d.Vector3(0, 1, 0));\n\n\t\t\tscene.updateMatrix();\n\t\t\tscene.updateRenderStates(camera);\n\t\t\tscene.updateRenderQueue(camera);\n\n\t\t\tshadowMapPass.render(renderer, scene);\n\n\t\t\trenderer.renderScene(scene, camera, tempRenderTarget1);\n\n\t\t\tconst iterations = Math.floor(params.radius / 2) * 2 + 2;\n\t\t\tlet read = tempRenderTarget1, write = tempRenderTarget2, temp;\n\t\t\tfor (let i = 0; i < iterations; i++) {\n\t\t\t\tconst radius = params.radius * (1 + i) / iterations;\n\t\t\t\tblurPass.uniforms.tDiffuse = read.texture;\n\t\t\t\tblurPass.uniforms.direction[0] = i % 2 === 0 ? radius : 0;\n\t\t\t\tblurPass.uniforms.direction[1] = i % 2 === 1 ? radius : 0;\n\t\t\t\tblurPass.render(renderer, i === (iterations - 1) ? screenRenderTarget : write);\n\n\t\t\t\ttemp = read;\n\t\t\t\tread = write;\n\t\t\t\twrite = temp;\n\t\t\t}\n\t\t}\n\t\trequestAnimationFrame(loop);\n\n\t\tfunction onWindowResize() {\n\t\t\twidth = window.innerWidth || 2;\n\t\t\theight = window.innerHeight || 2;\n\n\t\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 1000);\n\n\t\t\tscreenRenderTarget.resize(width, height);\n\t\t\ttempRenderTarget1.resize(width, height);\n\t\t\ttempRenderTarget2.resize(width, height);\n\t\t}\n\t\twindow.addEventListener('resize', onWindowResize, false);\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "examples/custompass_car.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>t3d - custom pass custom</title>\n\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n\t<link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n</head>\n<body>\n    <div id=\"info\">\n        <a href=\"\" target=\"_blank\">t3d</a> - custom pass custom\n    </div>\n\n\t<!-- Import maps polyfill -->\n    <!-- Remove this when import maps will be widely supported -->\n    <script async src=\"./libs/es-module-shims.js\"></script>\n\n    <script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n    <script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { GUI } from './libs/lil-gui.esm.min.js';\n\t\timport { AssimpJsonLoader } from 't3d/addons/loaders/AssimpJsonLoader.js';\n\t\timport { ColorAdjustShader } from 't3d/addons/shaders/ColorAdjustShader.js';\n\t\timport { FilmShader } from 't3d/addons/shaders/FilmShader.js';\n\t\timport { FXAAShader } from 't3d/addons/shaders/FXAAShader.js';\n\n\t\tlet width = window.innerWidth || 2;\n\t\tlet height = window.innerHeight || 2;\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = width;\n\t\tcanvas.height = height;\n\t\tdocument.body.appendChild(canvas);\n\n\t\tconst scene = new t3d.Scene();\n\n\t\tconst jeep = 'resources/models/assimp/jeep/jeep.assimp.json';\n\t\tconst interior = 'resources/models/assimp/interior/interior.assimp.json';\n\n\t\tconst loader1 = new AssimpJsonLoader();\n\t\tloader1.load(jeep, function(object) {\n\t\t\tobject.scale.set(0.4, 0.4, 0.4);\n\t\t\tobject.traverse(function(obj) {\n\t\t\t\tif (obj.isMesh) {\n\t\t\t\t\tobj.castShadow = true;\n\t\t\t\t}\n\t\t\t});\n\t\t\tscene.add(object);\n\t\t});\n\n\t\tconst loader2 = new AssimpJsonLoader();\n\t\tloader2.load(interior, function(object) {\n\t\t\tobject.traverse(function(obj) {\n\t\t\t\tif (obj.isMesh) {\n\t\t\t\t\tobj.receiveShadow = true;\n\t\t\t\t}\n\t\t\t});\n\t\t\tscene.add(object);\n\t\t});\n\n\t\tconst ambientLight = new t3d.AmbientLight(0xffffff, 0.3);\n\t\tscene.add(ambientLight);\n\n\t\tconst spotLight = new t3d.SpotLight(0xffffff, 0.3, 30, Math.PI / 5, 0.3);\n\t\tspotLight.position.set(0, 10, 0);\n\t\tspotLight.lookAt(new t3d.Vector3(0, 0, 0), new t3d.Vector3(0, 1, 0));\n\t\tspotLight.castShadow = true;\n\t\tscene.add(spotLight);\n\n\t\tconst camera = new t3d.Camera();\n\t\tcamera.position.set(0, 4, 10);\n\t\tcamera.lookAt(new t3d.Vector3(0, 0, 0), new t3d.Vector3(0, 1, 0));\n\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 1000);\n\t\tscene.add(camera);\n\n\t\t// custom pass\n\t\tconst screenRenderTarget = new t3d.ScreenRenderTarget(canvas);\n\t\tconst tempRenderTarget1 = t3d.OffscreenRenderTarget.create2D(width, height);\n\t\ttempRenderTarget1.texture.minFilter = t3d.TEXTURE_FILTER.LINEAR;\n\t\ttempRenderTarget1.texture.magFilter = t3d.TEXTURE_FILTER.LINEAR;\n\t\tconst tempRenderTarget2 = t3d.OffscreenRenderTarget.create2D(width, height);\n\t\ttempRenderTarget2.texture.minFilter = t3d.TEXTURE_FILTER.LINEAR;\n\t\ttempRenderTarget2.texture.magFilter = t3d.TEXTURE_FILTER.LINEAR;\n\n\t\tconst contextParams = { antialias: false, alpha: false };\n\t\tconst gl = canvas.getContext('webgl2', contextParams) || canvas.getContext('webgl', contextParams);\n\t\tconst renderer = new t3d.WebGLRenderer(gl);\n\n\t\tconst shadowMapPass = new t3d.ShadowMapPass();\n\t\tconst colorAdjustPass = new t3d.ShaderPostPass(ColorAdjustShader);\n\t\tcolorAdjustPass.uniforms['tDiffuse'] = tempRenderTarget1.texture;\n\t\tcolorAdjustPass.uniforms['brightness'] = 0.01;\n\t\tcolorAdjustPass.uniforms['contrast'] = 1.01;\n\t\tcolorAdjustPass.uniforms['exposure'] = 0.6;\n\t\tcolorAdjustPass.uniforms['gamma'] = 1;\n\t\tcolorAdjustPass.uniforms['saturation'] = 1.6;\n\t\tconst filmPass = new t3d.ShaderPostPass(FilmShader);\n\t\tfilmPass.uniforms['tDiffuse'] = tempRenderTarget2.texture;\n\t\tconst fxaaPass = new t3d.ShaderPostPass(FXAAShader);\n\t\tfxaaPass.uniforms['tDiffuse'] = tempRenderTarget1.texture;\n\n\t\t// gui\n\t\tconst gui = new GUI();\n\t\tgui.add({ version: 'WebGL ' + renderer.capabilities.version }, 'version').disable();\n\t\tgui.add(colorAdjustPass.uniforms, 'brightness', 0, 0.5, 0.01);\n\t\tgui.add(colorAdjustPass.uniforms, 'contrast', 1, 1.5, 0.01);\n\t\tgui.add(colorAdjustPass.uniforms, 'exposure', 0, 1, 0.1);\n\t\tgui.add(colorAdjustPass.uniforms, 'gamma', 0, 1, 0.1);\n\t\tgui.add(colorAdjustPass.uniforms, 'saturation', -1, 5, 0.01);\n\n\t\tfunction loop(count) {\n\t\t\trequestAnimationFrame(loop);\n\n\t\t\t// rotate camera\n\t\t\tcamera.position.x = 10 * Math.sin(count / 1000 * .5);\n\t\t\tcamera.position.z = 10 * Math.cos(count / 1000 * .5);\n\t\t\tcamera.lookAt(new t3d.Vector3(0, 0, 0), new t3d.Vector3(0, 1, 0));\n\n\t\t\tfilmPass.uniforms.time += 30 / 1000 * 0.5;\n\t\t\tif (filmPass.uniforms.time > 1) {\n\t\t\t\tfilmPass.uniforms.time = 0;\n\t\t\t}\n\n\t\t\tscene.updateMatrix();\n\t\t\tscene.updateRenderStates(camera);\n\t\t\tscene.updateRenderQueue(camera);\n\n\t\t\tshadowMapPass.render(renderer, scene);\n\t\t\trenderer.renderScene(scene, camera, tempRenderTarget1);\n\t\t\tcolorAdjustPass.render(renderer, tempRenderTarget2);\n\t\t\tfilmPass.render(renderer, tempRenderTarget1);\n\t\t\tfxaaPass.render(renderer, screenRenderTarget);\n\t\t}\n\t\trequestAnimationFrame(loop);\n\n\t\tfunction onWindowResize() {\n\t\t\twidth = window.innerWidth || 2;\n\t\t\theight = window.innerHeight || 2;\n\n\t\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 1000);\n\n\t\t\tscreenRenderTarget.resize(width, height);\n\t\t\ttempRenderTarget1.resize(width, height);\n\t\t\ttempRenderTarget2.resize(width, height);\n\t\t}\n\t\twindow.addEventListener('resize', onWindowResize, false);\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "examples/custompass_deferred.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>t3d - custom pass deferred</title>\n\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n\t<link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n</head>\n<body>\n    <div id=\"info\">\n        <a href=\"\" target=\"_blank\">t3d</a> - custom pass deferred\n    </div>\n\n\t<script src=\"./libs/nanobar.js\"></script>\n\n\t<!-- Import maps polyfill -->\n    <!-- Remove this when import maps will be widely supported -->\n    <script async src=\"./libs/es-module-shims.js\"></script>\n\n    <script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n    <script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { DirectionalLightHelper } from 't3d/addons/objects/DirectionalLightHelper.js';\n\t\timport { PointLightHelper } from 't3d/addons/objects/PointLightHelper.js';\n\t\timport { SpotLightHelper } from 't3d/addons/objects/SpotLightHelper.js';\n\t\timport { GLTFLoader } from 't3d/addons/loaders/glTF/GLTFLoader.js';\n\t\timport { OrbitControls } from 't3d/addons/controls/OrbitControls.js';\n\t\timport { CopyShader } from 't3d/addons/shaders/CopyShader.js';\n\t\timport { FXAAShader } from 't3d/addons/shaders/FXAAShader.js';\n\t\timport { DeferredShader } from 't3d/addons/shaders/DeferredShader.js';\n\t\timport { GUI } from './libs/lil-gui.esm.min.js';\n\n\t\tconst isMobile = (function() {\n\t\t\tif (!window.navigator) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tconst ua = navigator.userAgent.toLowerCase();\n\t\t\treturn (ua.indexOf('mobile') != -1 || ua.indexOf('android') != -1);\n\t\t})();\n\n\t\t// todo avoid frequently updating materials\n\t\t// but it's ok for this demo\n\n\t\tlet width = window.innerWidth || 2;\n\t\tlet height = window.innerHeight || 2;\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = width;\n\t\tcanvas.height = height;\n\t\tdocument.body.appendChild(canvas);\n\n\t\tconst scene = new t3d.Scene();\n\n\t\tconst nanobar = new Nanobar();\n\t\tnanobar.el.style.background = 'gray';\n\n\t\tconst loadingManager = new t3d.LoadingManager(function() {\n\t\t\tnanobar.go(100);\n\t\t\tnanobar.el.style.background = 'transparent';\n\t\t}, function(url, itemsLoaded, itemsTotal) {\n\t\t\tif (itemsLoaded < itemsTotal) {\n\t\t\t\tnanobar.go(itemsLoaded / itemsTotal * 100);\n\t\t\t}\n\t\t});\n\n\t\tconst loader = new GLTFLoader(loadingManager);\n\t\tloader.load('resources/models/gltf/suzanne/suzanne.gltf').then(function(result) {\n\t\t\tconst object = result.root.children[0];\n\t\t\tobject.material.diffuse.setRGB(1, 1, 1);\n\t\t\tobject.material.emissive.setRGB(0.2, 0, 0);\n\t\t\tobject.castShadow = true;\n\t\t\tobject.scale.set(10, 10, 10);\n\t\t\tobject.position.y = 2;\n\t\t\tscene.add(object);\n\t\t});\n\n\t\tconst basicMaterial = new t3d.BasicMaterial();\n\t\tbasicMaterial.diffuse.setRGB(0, 1, 1);\n\t\tbasicMaterial.transparent = true;\n\t\tbasicMaterial.opacity = 0.3;\n\t\tconst cube = new t3d.Mesh(new t3d.BoxGeometry(5, 5, 5), basicMaterial);\n\t\tcube.position.set(20, 0, 0);\n\t\tscene.add(cube);\n\n\t\tconst plane_geometry = new t3d.PlaneGeometry(500, 500);\n\t\tconst lambertMaterial = new t3d.LambertMaterial();\n\t\tlambertMaterial.diffuse.setHex(0xffffff);\n\t\tconst plane = new t3d.Mesh(plane_geometry, lambertMaterial);\n\t\tplane.receiveShadow = true;\n\t\tplane.position.y = -10;\n\t\tscene.add(plane);\n\n\t\t// not support ambient light yet\n\t\t// const ambientLight = new t3d.AmbientLight(0xffffff, 0.5);\n\t\t// scene.add(ambientLight);\n\n\t\tconst directionalLight = new t3d.DirectionalLight(0xffff00, 0.4);\n\t\tdirectionalLight.position.set(-30, 30, 0);\n\t\tdirectionalLight.lookAt(new t3d.Vector3(), new t3d.Vector3(0, 1, 0));\n\t\tdirectionalLight.castShadow = true;\n\t\tdirectionalLight.shadow.windowSize = 50;\n\t\tscene.add(directionalLight);\n\n\t\tconst directionalLightHelper = new DirectionalLightHelper(directionalLight, 3);\n\t\tdirectionalLight.add(directionalLightHelper);\n\n\t\tconst pointLight = new t3d.PointLight(0x00ffff, 0.4, 200, 2);\n\t\tpointLight.position.set(30, 30, 30);\n\t\tpointLight.castShadow = true;\n\t\tscene.add(pointLight);\n\n\t\tconst pointLightHelper = new PointLightHelper(pointLight, 2);\n\t\tpointLight.add(pointLightHelper);\n\n\t\tconst spotLight = new t3d.SpotLight(0x00ff00, 0.4, 400, Math.PI / 6, 0.2);\n\t\tspotLight.position.set(0, 40, -40);\n\t\tspotLight.lookAt(new t3d.Vector3(), new t3d.Vector3(0, 1, 0));\n\t\tspotLight.castShadow = true;\n\t\tspotLight.shadow.windowSize = 50;\n\t\tscene.add(spotLight);\n\t\t\n\t\tconst spotLightHelper = new SpotLightHelper(spotLight);\n\t\tspotLight.add(spotLightHelper);\n\n\t\tconst camera = new t3d.Camera();\n\t\tcamera.position.set(30, 50, 100);\n\t\tcamera.lookAt(new t3d.Vector3(0, 0, 0), new t3d.Vector3(0, 1, 0));\n\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 500);\n\t\tscene.add(camera);\n\n\t\tconst controller = new OrbitControls(camera, canvas);\n\n\t\tconst screenRenderTarget = new t3d.ScreenRenderTarget(canvas);\n\t\tscreenRenderTarget.setColorClearValue(0, 0, 0, 1);\n\n\t\tconst normalDepthRenderTarget = t3d.OffscreenRenderTarget.create2D(width, height);\n\t\tnormalDepthRenderTarget.texture.minFilter = t3d.TEXTURE_FILTER.NEAREST;\n\t\tnormalDepthRenderTarget.texture.magFilter = t3d.TEXTURE_FILTER.NEAREST;\n\t\tnormalDepthRenderTarget.texture.type = isMobile ? t3d.PIXEL_TYPE.HALF_FLOAT : t3d.PIXEL_TYPE.FLOAT;\n\t\tnormalDepthRenderTarget.texture.generateMipmaps = false;\n\n\t\tconst colorRenderTarget = t3d.OffscreenRenderTarget.create2D(width, height);\n\t\tcolorRenderTarget.texture.minFilter = t3d.TEXTURE_FILTER.NEAREST;\n\t\tcolorRenderTarget.texture.magFilter = t3d.TEXTURE_FILTER.NEAREST;\n\t\tcolorRenderTarget.texture.type = isMobile ? t3d.PIXEL_TYPE.HALF_FLOAT : t3d.PIXEL_TYPE.FLOAT;\n\t\tcolorRenderTarget.texture.generateMipmaps = false;\n\n\t\tconst resultRenderTarget = t3d.OffscreenRenderTarget.create2D(width, height);\n\t\tresultRenderTarget.texture.minFilter = t3d.TEXTURE_FILTER.LINEAR;\n\t\tresultRenderTarget.texture.magFilter = t3d.TEXTURE_FILTER.LINEAR;\n\t\t// resultRenderTarget.texture.type = t3d.PIXEL_TYPE.FLOAT;\n\t\tresultRenderTarget.texture.generateMipmaps = false;\n\n\t\tconst contextParams = { antialias: true, alpha: false };\n\t\tconst gl = canvas.getContext('webgl', contextParams); // this demo not support webgl2 yet (shadow)\n\t\tconst renderer = new t3d.WebGLRenderer(gl);\n\n\t\tconst shadowMapPass = new t3d.ShadowMapPass();\n\n\t\tconst normalDepthMaterial = new t3d.ShaderMaterial(DeferredShader.normalDepth);\n\n\t\tconst normalDepthShininessMaterial = new t3d.ShaderMaterial(DeferredShader.normalDepthShininess);\n\n\t\tconst colorMaterial = new t3d.ShaderMaterial(DeferredShader.color);\n\n\t\tconst reconstructionMaterial = new t3d.ShaderMaterial(DeferredShader.reconstruction);\n\n\t\tconst copyPass = new t3d.ShaderPostPass(CopyShader);\n\t\tconst fxaaPass = new t3d.ShaderPostPass(FXAAShader);\n\n\t\tconst emissiveLightPass = new t3d.ShaderPostPass(DeferredShader.emissiveLight);\n\t\temissiveLightPass.material.depthWrite = false;\n\n\t\tconst directionalLightPass = new t3d.ShaderPostPass(DeferredShader.directionalLight);\n\t\tdirectionalLightPass.material.transparent = true;\n\t\tdirectionalLightPass.material.blending = t3d.BLEND_TYPE.ADD;\n\t\tdirectionalLightPass.material.depthWrite = false;\n\t\tdirectionalLightPass.material.depthTest = false;\n\n\t\tconst pointLightPass = new t3d.ShaderPostPass(DeferredShader.pointLight);\n\t\tpointLightPass.material.transparent = true;\n\t\tpointLightPass.material.blending = t3d.BLEND_TYPE.ADD;\n\t\tpointLightPass.material.depthWrite = false;\n\t\tpointLightPass.material.depthTest = false;\n\n\t\tconst spotLightPass = new t3d.ShaderPostPass(DeferredShader.spotLight);\n\t\tspotLightPass.material.transparent = true;\n\t\tspotLightPass.material.blending = t3d.BLEND_TYPE.ADD;\n\t\tspotLightPass.material.depthWrite = false;\n\t\tspotLightPass.material.depthTest = false;\n\n\t\tconst directionalLightPrePass = new t3d.ShaderPostPass(DeferredShader.directionalLightPre);\n\t\tdirectionalLightPrePass.material.transparent = true;\n\t\tdirectionalLightPrePass.material.blending = t3d.BLEND_TYPE.ADD;\n\t\tdirectionalLightPrePass.material.depthWrite = false;\n\t\tdirectionalLightPrePass.material.depthTest = false;\n\t\tdirectionalLightPrePass.material.premultipliedAlpha = true;\n\n\t\tconst pointLightPrePass = new t3d.ShaderPostPass(DeferredShader.pointLightPre);\n\t\tpointLightPrePass.material.transparent = true;\n\t\tpointLightPrePass.material.blending = t3d.BLEND_TYPE.ADD;\n\t\tpointLightPrePass.material.depthWrite = false;\n\t\tpointLightPrePass.material.depthTest = false;\n\t\tpointLightPrePass.material.premultipliedAlpha = true;\n\n\t\tconst spotLightPrePass = new t3d.ShaderPostPass(DeferredShader.spotLightPre);\n\t\tspotLightPrePass.material.transparent = true;\n\t\tspotLightPrePass.material.blending = t3d.BLEND_TYPE.ADD;\n\t\tspotLightPrePass.material.depthWrite = false;\n\t\tspotLightPrePass.material.depthTest = false;\n\t\tspotLightPrePass.material.premultipliedAlpha = true;\n\n\t\t// gui\n\t\tconst params = { render: 'prelight-deferred', pass: 'result', fxaa: false, directionalLight: true, pointLight: true, spotLight: true };\n\t\tconst gui = new GUI();\n\t\tgui.add(params, 'render', ['forward', 'deferred', 'prelight-deferred']);\n\t\tgui.add(params, 'pass', ['normalDepth(Shininess)', 'color(light)', 'result']);\n\t\tgui.add(params, 'fxaa');\n\n\t\tconst lightFolder = gui.addFolder('lights');\n\t\tlightFolder.add(directionalLight, 'visible').name('directionalLight');\n\t\tlightFolder.add(pointLight, 'visible').name('pointLight');\n\t\tlightFolder.add(spotLight, 'visible').name('spotLight');\n\n\t\tconst matProjViewInverse = new t3d.Matrix4();\n\t\tconst cameraPos = new t3d.Vector3();\n\n\t\tfunction loop(count) {\n\t\t\trequestAnimationFrame(loop);\n\n\t\t\tcontroller.update();\n\n\t\t\tdirectionalLightHelper.update();\n\t\t\tpointLightHelper.update();\n\t\t\tspotLightHelper.update();\n\n\t\t\tscene.updateMatrix();\n\t\t\n\t\t\tconst renderStates = scene.updateRenderStates(camera);\n\n\t\t\tconst renderQueue = scene.updateRenderQueue(camera);\n\t\t\tconst renderQueueLayer = renderQueue.layerList[0];\n\n\t\t\tshadowMapPass.render(renderer, scene);\n\n\t\t\tif (params.render === 'forward') {\n\t\t\t\trenderer.beginRender(screenRenderTarget);\n\t\t\t\trenderer.renderRenderableList(renderQueueLayer.opaque, renderStates);\n\t\t\t\trenderer.renderRenderableList(renderQueueLayer.transparent, renderStates);\n\t\t\t\trenderer.endRender();\n\t\t\t} else {\n\t\t\t\t// render normalDepth texture\n\n\t\t\t\trenderer.beginRender(normalDepthRenderTarget);\n\t\t\t\trenderer.renderRenderableList(renderQueueLayer.opaque, renderStates, {\n\t\t\t\t\tgetMaterial: function(renderable) {\n\t\t\t\t\t\tif (params.render == 'prelight-deferred') {\n\t\t\t\t\t\t\tif (!renderable.geometry.attributes['a_Normal']) {\n\t\t\t\t\t\t\t\tnormalDepthShininessMaterial.shading = t3d.SHADING_TYPE.FLAT_SHADING;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tnormalDepthShininessMaterial.shading = t3d.SHADING_TYPE.SMOOTH_SHADING;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (renderable.material.shininess !== undefined) {\n\t\t\t\t\t\t\t\tnormalDepthShininessMaterial.uniforms['shininess'] = renderable.material.shininess;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tnormalDepthShininessMaterial.uniforms['shininess'] = 30;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tnormalDepthShininessMaterial.needsUpdate = true;\n\t\t\t\t\t\t\treturn normalDepthShininessMaterial;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tif (!renderable.geometry.attributes['a_Normal']) {\n\t\t\t\t\t\t\t\tnormalDepthMaterial.shading = t3d.SHADING_TYPE.FLAT_SHADING;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tnormalDepthMaterial.shading = t3d.SHADING_TYPE.SMOOTH_SHADING;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tnormalDepthMaterial.needsUpdate = true;\n\t\t\t\t\t\t\treturn normalDepthMaterial;\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\tifRender: function(renderable) {\n\t\t\t\t\t\treturn !!renderable.geometry.getAttribute('a_Normal');\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\trenderer.endRender();\n\n\t\t\t\tif (params.render == 'deferred') {\n\t\t\t\t\t// render color texture\n\t\t\t\t\tcolorRenderTarget.setClear(true, true, true);\n\t\t\t\t\trenderer.beginRender(colorRenderTarget);\n\t\t\t\t\trenderer.renderRenderableList(renderQueueLayer.opaque, renderStates, {\n\t\t\t\t\t\tgetMaterial: function(renderable) {\n\t\t\t\t\t\t\tcolorMaterial.diffuse.copy(renderable.material.diffuse);\n\t\t\t\t\t\t\tcolorMaterial.diffuseMap = renderable.material.diffuseMap;\n\t\t\t\t\t\t\tcolorMaterial.emissive.copy(renderable.material.emissive);\n\t\t\n\t\t\t\t\t\t\tif (renderable.material.specular !== undefined) {\n\t\t\t\t\t\t\t\tcolorMaterial.uniforms['specular'][0] = renderable.material.specular.r;\n\t\t\t\t\t\t\t\tcolorMaterial.uniforms['specular'][1] = renderable.material.specular.g;\n\t\t\t\t\t\t\t\tcolorMaterial.uniforms['specular'][2] = renderable.material.specular.b;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tcolorMaterial.uniforms['specular'][0] = 0;\n\t\t\t\t\t\t\t\tcolorMaterial.uniforms['specular'][1] = 0;\n\t\t\t\t\t\t\t\tcolorMaterial.uniforms['specular'][2] = 0;\n\t\t\t\t\t\t\t}\n\t\t\n\t\t\t\t\t\t\tif (renderable.material.shininess !== undefined) {\n\t\t\t\t\t\t\t\tcolorMaterial.uniforms['shininess'] = renderable.material.shininess;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tcolorMaterial.uniforms['shininess'] = 30;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tcolorMaterial.needsUpdate = true;\n\t\t\n\t\t\t\t\t\t\treturn colorMaterial;\n\t\t\t\t\t\t},\n\t\t\t\t\t\tifRender: function(renderable) {\n\t\t\t\t\t\t\treturn !!renderable.geometry.getAttribute('a_Normal');\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t\trenderer.endRender();\n\t\t\n\t\t\t\t\t// render emissive light\n\t\t\t\t\temissiveLightPass.uniforms['samplerColor'] = colorRenderTarget.texture;\n\t\t\t\t\temissiveLightPass.uniforms['viewWidth'] = width;\n\t\t\t\t\temissiveLightPass.uniforms['viewHeight'] = height;\n\t\t\t\t\tresultRenderTarget.setClear(true, true, true);\n\t\t\t\t\temissiveLightPass.render(renderer, resultRenderTarget);\n\t\t\t\t}\n\n\t\t\t\t// todo support ambient light\n\n\t\t\t\t// render lights\n\n\t\t\t\tconst accumulateTarget = params.render == 'prelight-deferred'\n\t\t\t\t\t? colorRenderTarget\n\t\t\t\t\t: resultRenderTarget;\n\n\t\t\t\tif (params.render == 'prelight-deferred') {\n\t\t\t\t\taccumulateTarget.setClear(true, true, true);\n\t\t\t\t\trenderer.beginRender(accumulateTarget);\n\t\t\t\t\trenderer.endRender();\n\t\t\t\t}\n\n\t\t\t\taccumulateTarget.setClear(false, false, false);\n\n\t\t\t\tmatProjViewInverse.copy(renderStates.camera.projectionViewMatrix).invert();\n\t\t\t\tcameraPos.copy(renderStates.camera.position);\n\n\t\t\t\tconst lightingGroup = renderStates.lighting.getGroup(0);\n\n\t\t\t\t// directional\n\t\t\n\t\t\t\tconst d_Pass = params.render == 'prelight-deferred' ? directionalLightPrePass : directionalLightPass;\n\t\t\t\tif (params.render !== 'prelight-deferred') {\n\t\t\t\t\td_Pass.uniforms['samplerNormalDepth'] = normalDepthRenderTarget.texture;\n\t\t\t\t\td_Pass.uniforms['samplerColor'] = colorRenderTarget.texture;\n\t\t\t\t} else {\n\t\t\t\t\td_Pass.uniforms['samplerNormalDepthShininess'] = normalDepthRenderTarget.texture;\n\t\t\t\t}\n\t\t\t\td_Pass.uniforms['viewWidth'] = width;\n\t\t\t\td_Pass.uniforms['viewHeight'] = height;\n\t\t\t\td_Pass.uniforms['matProjViewInverse'].set(matProjViewInverse.elements);\n\t\t\t\td_Pass.uniforms['cameraPos'] = [cameraPos.x, cameraPos.y, cameraPos.z];\n\n\t\t\t\tconst directionalLights = lightingGroup.directional;\n\t\t\t\tconst directionalShadows = lightingGroup.directionalShadow;\n\t\t\t\tconst directsNum = lightingGroup.directsNum;\n\t\t\t\tconst directShadowNum = lightingGroup.directShadowNum;\n\n\t\t\t\tfor (let i = 0; i < directsNum; i++) {\n\t\t\t\t\tconst directionalLight = directionalLights[i];\n\n\t\t\t\t\td_Pass.uniforms['lightColor'] = [directionalLight.color[0], directionalLight.color[1], directionalLight.color[2]];\n\t\t\t\t\td_Pass.uniforms['lightDirectionVS'] = [-directionalLight.direction[0], -directionalLight.direction[1], -directionalLight.direction[2]];\n\n\t\t\t\t\tif (i < directShadowNum) {\n\t\t\t\t\t\tconst directionalShadow = directionalShadows[i];\n\t\t\n\t\t\t\t\t\td_Pass.material.defines['SHADOW'] = 1;\n\t\t\t\t\t\td_Pass.uniforms['shadowBias'] = directionalShadow.shadowBias[0];\n\t\t\t\t\t\td_Pass.uniforms['shadowRadius'] = directionalShadow.shadowParams[0];\n\t\t\t\t\t\td_Pass.uniforms['shadowMapSize'][0] = directionalShadow.shadowMapSize[0];\n\t\t\t\t\t\td_Pass.uniforms['shadowMapSize'][1] = directionalShadow.shadowMapSize[1];\n\n\t\t\t\t\t\td_Pass.uniforms['shadowMap'] = renderer.capabilities.version >= 2 ? lightingGroup.directionalShadowDepthMap[i] : lightingGroup.directionalShadowMap[i];\n\t\t\t\t\t\td_Pass.uniforms['shadowMatrix'].set(lightingGroup.directionalShadowMatrix, i * 16);\n\t\t\t\t\t} else {\n\t\t\t\t\t\td_Pass.material.defines['SHADOW'] = 0;\n\t\t\t\t\t}\n\n\t\t\t\t\td_Pass.render(renderer, accumulateTarget);\n\t\t\t\t}\n\n\t\t\t\t// point\n\t\t\n\t\t\t\tconst p_Pass = params.render == 'prelight-deferred' ? pointLightPrePass : pointLightPass;\n\t\t\t\tif (params.render !== 'prelight-deferred') {\n\t\t\t\t\tp_Pass.uniforms['samplerNormalDepth'] = normalDepthRenderTarget.texture;\n\t\t\t\t\tp_Pass.uniforms['samplerColor'] = colorRenderTarget.texture;\n\t\t\t\t} else {\n\t\t\t\t\tp_Pass.uniforms['samplerNormalDepthShininess'] = normalDepthRenderTarget.texture;\n\t\t\t\t}\n\t\t\t\tp_Pass.uniforms['viewWidth'] = width;\n\t\t\t\tp_Pass.uniforms['viewHeight'] = height;\n\t\t\t\tp_Pass.uniforms['matProjViewInverse'].set(matProjViewInverse.elements);\n\t\t\t\tp_Pass.uniforms['cameraPos'] = [cameraPos.x, cameraPos.y, cameraPos.z];\n\n\t\t\t\tconst pointLights = lightingGroup.point;\n\t\t\t\tconst pointShadows = lightingGroup.pointShadow;\n\t\t\t\tconst pointsNum = lightingGroup.pointsNum;\n\t\t\t\tconst pointShadowNum = lightingGroup.pointShadowNum;\n\n\t\t\t\tfor (let i = 0; i < pointsNum; i++) {\n\t\t\t\t\tconst pointLight = pointLights[i];\n\n\t\t\t\t\tp_Pass.uniforms['lightColor'] = [pointLight.color[0], pointLight.color[1], pointLight.color[2]];\n\t\t\t\t\tp_Pass.uniforms['lightPositionVS'] = [pointLight.position[0], pointLight.position[1], pointLight.position[2]];\n\t\t\t\t\tp_Pass.uniforms['lightRadius'] = pointLight.distance;\n\t\t\t\t\tp_Pass.uniforms['lightDecay'] = pointLight.decay;\n\n\t\t\t\t\tif (i < pointShadowNum) {\n\t\t\t\t\t\tconst pointShadow = pointShadows[i];\n\n\t\t\t\t\t\tp_Pass.material.defines['SHADOW'] = 1;\n\t\t\t\t\t\tp_Pass.uniforms['shadowBias'] = pointShadow.shadowBias[0];\n\t\t\t\t\t\tp_Pass.uniforms['shadowRadius'] = pointShadow.shadowParams[0];\n\t\t\t\t\t\tp_Pass.uniforms['shadowMapSize'][0] = pointShadow.shadowMapSize[0];\n\t\t\t\t\t\tp_Pass.uniforms['shadowMapSize'][1] = pointShadow.shadowMapSize[1];\n\n\t\t\t\t\t\tp_Pass.uniforms['shadowMap'] = lightingGroup.pointShadowMap[i];\n\n\t\t\t\t\t\tp_Pass.uniforms['shadowCameraNear'] = pointShadow.shadowCameraRange[0];\n\t\t\t\t\t\tp_Pass.uniforms['shadowCameraFar'] = pointShadow.shadowCameraRange[1];\n\t\t\t\t\t} else {\n\t\t\t\t\t\tp_Pass.material.defines['SHADOW'] = 0;\n\t\t\t\t\t}\n\n\t\t\t\t\tp_Pass.render(renderer, accumulateTarget);\n\t\t\t\t}\n\n\t\t\t\t// spot lights\n\t\t\n\t\t\t\tconst s_Pass = params.render == 'prelight-deferred' ? spotLightPrePass : spotLightPass;\n\t\t\t\tif (params.render !== 'prelight-deferred') {\n\t\t\t\t\ts_Pass.uniforms['samplerNormalDepth'] = normalDepthRenderTarget.texture;\n\t\t\t\t\ts_Pass.uniforms['samplerColor'] = colorRenderTarget.texture;\n\t\t\t\t} else {\n\t\t\t\t\ts_Pass.uniforms['samplerNormalDepthShininess'] = normalDepthRenderTarget.texture;\n\t\t\t\t}\n\t\t\t\ts_Pass.uniforms['viewWidth'] = width;\n\t\t\t\ts_Pass.uniforms['viewHeight'] = height;\n\t\t\t\ts_Pass.uniforms['matProjViewInverse'].set(matProjViewInverse.elements);\n\t\t\t\ts_Pass.uniforms['cameraPos'] = [cameraPos.x, cameraPos.y, cameraPos.z];\n\n\t\t\t\tconst spotLights = lightingGroup.spot;\n\t\t\t\tconst spotShadows = lightingGroup.spotShadow;\n\t\t\t\tconst spotsNum = lightingGroup.spotsNum;\n\t\t\t\tconst spotShadowNum = lightingGroup.spotShadowNum;\n\n\t\t\t\tfor (let i = 0; i < spotsNum; i++) {\n\t\t\t\t\tconst spotLight = spotLights[i];\n\n\t\t\t\t\ts_Pass.uniforms['lightColor'] = [spotLight.color[0], spotLight.color[1], spotLight.color[2]];\n\t\t\t\t\ts_Pass.uniforms['lightPositionVS'] = [spotLight.position[0], spotLight.position[1], spotLight.position[2]];\n\t\t\t\t\ts_Pass.uniforms['lightDirectionVS'] = [-spotLight.direction[0], -spotLight.direction[1], -spotLight.direction[2]];\n\t\t\t\t\ts_Pass.uniforms['lightConeCos'] = spotLight.coneCos;\n\t\t\t\t\ts_Pass.uniforms['lightPenumbraCos'] = spotLight.penumbraCos;\n\t\t\t\t\ts_Pass.uniforms['lightRadius'] = spotLight.distance;\n\t\t\t\t\ts_Pass.uniforms['lightDecay'] = spotLight.decay;\n\n\t\t\t\t\tif (i < spotShadowNum) {\n\t\t\t\t\t\tconst spotShadow = spotShadows[i];\n\n\t\t\t\t\t\ts_Pass.material.defines['SHADOW'] = 1;\n\t\t\t\t\t\ts_Pass.uniforms['shadowBias'] = spotShadow.shadowBias[0];\n\t\t\t\t\t\ts_Pass.uniforms['shadowRadius'] = spotShadow.shadowParams[0];\n\t\t\t\t\t\ts_Pass.uniforms['shadowMapSize'][0] = spotShadow.shadowMapSize[0];\n\t\t\t\t\t\ts_Pass.uniforms['shadowMapSize'][1] = spotShadow.shadowMapSize[1];\n\n\t\t\t\t\t\ts_Pass.uniforms['shadowMap'] = renderer.capabilities.version >= 2 ? lightingGroup.spotShadowDepthMap[i] : lightingGroup.spotShadowMap[i];\n\t\t\t\t\t\ts_Pass.uniforms['shadowMatrix'].set(lightingGroup.spotShadowMatrix, i * 16);\n\t\t\t\t\t} else {\n\t\t\t\t\t\ts_Pass.material.defines['SHADOW'] = 0;\n\t\t\t\t\t}\n\n\t\t\t\t\ts_Pass.render(renderer, accumulateTarget);\n\t\t\t\t}\n\n\t\t\t\tif (params.render == 'prelight-deferred') {\n\t\t\t\t\t// reconstruction\n\t\t\n\t\t\t\t\treconstructionMaterial.uniforms['viewWidth'] = width;\n\t\t\t\t\treconstructionMaterial.uniforms['viewHeight'] = height;\n\t\t\t\t\treconstructionMaterial.uniforms['samplerLight'] = colorRenderTarget.texture;\n\n\t\t\t\t\tresultRenderTarget.setClear(true, true, true);\n\t\t\t\t\trenderer.beginRender(resultRenderTarget);\n\t\t\t\t\trenderer.renderRenderableList(renderQueueLayer.opaque, renderStates, {\n\t\t\t\t\t\tgetMaterial: function(renderable) {\n\t\t\t\t\t\t\tif (renderable.material.acceptLight) {\n\t\t\t\t\t\t\t\treconstructionMaterial.diffuse.copy(renderable.material.diffuse);\n\t\t\t\t\t\t\t\treconstructionMaterial.diffuseMap = renderable.material.diffuseMap;\n\t\t\t\t\t\t\t\treconstructionMaterial.emissive.copy(renderable.material.emissive);\n\t\t\n\t\t\t\t\t\t\t\tif (renderable.material.specular !== undefined) {\n\t\t\t\t\t\t\t\t\treconstructionMaterial.uniforms['specular'][0] = renderable.material.specular.r;\n\t\t\t\t\t\t\t\t\treconstructionMaterial.uniforms['specular'][1] = renderable.material.specular.g;\n\t\t\t\t\t\t\t\t\treconstructionMaterial.uniforms['specular'][2] = renderable.material.specular.b;\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\treconstructionMaterial.uniforms['specular'][0] = 0;\n\t\t\t\t\t\t\t\t\treconstructionMaterial.uniforms['specular'][1] = 0;\n\t\t\t\t\t\t\t\t\treconstructionMaterial.uniforms['specular'][2] = 0;\n\t\t\t\t\t\t\t\t}\n\t\t\n\t\t\t\t\t\t\t\tif (renderable.material.shininess !== undefined) {\n\t\t\t\t\t\t\t\t\treconstructionMaterial.uniforms['shininess'] = renderable.material.shininess;\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\treconstructionMaterial.uniforms['shininess'] = 30;\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\treconstructionMaterial.needsUpdate = true;\n\t\t\n\t\t\t\t\t\t\t\treturn reconstructionMaterial;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\treturn renderable.material;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t\trenderer.endRender();\n\t\t\t\t}\n\n\t\t\t\t// prelight-deferred support transparent objects\n\t\t\t\tif (params.render == 'prelight-deferred') {\n\t\t\t\t\t// render transparent objects forward\n\t\t\t\t\tresultRenderTarget.setClear(false, false, false);\n\t\t\t\t\trenderer.beginRender(resultRenderTarget);\n\t\t\t\t\trenderer.renderRenderableList(renderQueueLayer.transparent, renderStates);\n\t\t\t\t\trenderer.endRender();\n\t\t\t\t}\n\n\t\t\t\t// output\n\n\t\t\t\tconst pass = params.fxaa ? fxaaPass : copyPass;\n\n\t\t\t\tif (params.pass === 'normalDepth(Shininess)') {\n\t\t\t\t\tpass.uniforms['tDiffuse'] = normalDepthRenderTarget.texture;\n\t\t\t\t} else if (params.pass === 'color(light)') {\n\t\t\t\t\tpass.uniforms['tDiffuse'] = colorRenderTarget.texture;\n\t\t\t\t} else if (params.pass === 'result') {\n\t\t\t\t\tpass.uniforms['tDiffuse'] = resultRenderTarget.texture;\n\t\t\t\t}\n\t\t\n\t\t\t\tpass.render(renderer, screenRenderTarget);\n\t\t\t}\n\t\t}\n\t\trequestAnimationFrame(loop);\n\n\t\tfunction onWindowResize() {\n\t\t\twidth = window.innerWidth || 2;\n\t\t\theight = window.innerHeight || 2;\n\n\t\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 500);\n\n\t\t\tscreenRenderTarget.resize(width, height);\n\t\t\tnormalDepthRenderTarget.resize(width, height);\n\t\t\tcolorRenderTarget.resize(width, height);\n\t\t\tresultRenderTarget.resize(width, height);\n\t\t}\n\t\twindow.addEventListener('resize', onWindowResize, false);\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "examples/custompass_depth_buffer_share.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>t3d - custom depth buffer share</title>\n\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n\t<link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n</head>\n<body>\n    <div id=\"info\">\n\t\t<a href=\"\" target=\"_blank\">t3d</a> - Share Depth Buffer\n\t\t<br/> Two FBO attach the same depth buffer\n\t\t<br/> Available only for WebGL 2.0\n\t\t<div id=\"notSupported\" style=\"display:none\">Sorry, your graphics card + browser does not support WebGL2</div>\n    </div>\n\n\t<!-- Import maps polyfill -->\n    <!-- Remove this when import maps will be widely supported -->\n    <script async src=\"./libs/es-module-shims.js\"></script>\n\n    <script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n    <script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { OrbitControls } from 't3d/addons/controls/OrbitControls.js';\n\t\timport { CopyShader } from 't3d/addons/shaders/CopyShader.js';\n\t\timport { GridHelper } from 't3d/addons/objects/GridHelper.js';\n\t\timport { Texture2DLoader } from 't3d/addons/loaders/Texture2DLoader.js';\n\t\timport { GUI } from './libs/lil-gui.esm.min.js';\n\n\t\tlet width = window.innerWidth || 2;\n\t\tlet height = window.innerHeight || 2;\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = width;\n\t\tcanvas.height = height;\n\t\tdocument.body.appendChild(canvas);\n\n\t\tconst contextParams = { antialias: false, alpha: false };\n\t\tconst gl = canvas.getContext('webgl2', contextParams) || canvas.getContext('webgl', contextParams);\n\t\tconst renderer = new t3d.WebGLRenderer(gl);\n\n\t\t// Create an geometry object.\n\n\t\tconst cube_geometry = new t3d.BoxGeometry(8, 8, 8);\n\n\t\t// Create depth scene.\n\n\t\tconst material0 = new t3d.BasicMaterial();\n\t\t// material0.colorWrite = false;\n\t\tconst cube0 = new t3d.Mesh(cube_geometry, material0);\n\t\tcube0.position.z = 10;\n\t\tconst depthScene = new t3d.Scene();\n\t\tdepthScene.add(cube0);\n\n\t\t// Create scene.\n\n\t\tconst scene = new t3d.Scene();\n\n\t\tconst grid = new GridHelper(50, 20, 0xffffff, 0xffffff);\n\t\tscene.add(grid);\n\n\t\tconst texture = new Texture2DLoader().load('./resources/hardwood2_diffuse.jpg');\n\t\ttexture.encoding = t3d.TEXEL_ENCODING_TYPE.SRGB;\n\t\ttexture.anisotropy = renderer.capabilities.maxAnisotropy;\n\n\t\tconst material = new t3d.BasicMaterial();\n\t\tmaterial.diffuseMap = texture;\n\t\tconst cube = new t3d.Mesh(cube_geometry, material);\n\t\tscene.add(cube);\n\n\t\t// Use the same camera.\n\n\t\tconst camera = new t3d.Camera();\n\t\tcamera.outputEncoding = t3d.TEXEL_ENCODING_TYPE.SRGB;\n\t\tcamera.position.set(10, 10, 30);\n\t\tcamera.lookAt(new t3d.Vector3(0, 0, 0), new t3d.Vector3(0, 1, 0));\n\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 1000);\n\t\tscene.add(camera);\n\t\tdepthScene.add(camera);\n\n\t\tconst controller = new OrbitControls(camera, canvas);\n\t\t\n\t\tconst copyPass = new t3d.ShaderPostPass(CopyShader);\n\n\t\tconst screenRenderTarget = new t3d.ScreenRenderTarget(canvas);\n\n\t\tconst depthRenderBuffer = new t3d.RenderBuffer(width, height, t3d.PIXEL_FORMAT.DEPTH24_STENCIL8, 4);\n\n\t\tconst tempRenderTarget = t3d.OffscreenRenderTarget.create2D(width, height);\n\t\ttempRenderTarget.attach(\n\t\t\tnew t3d.RenderBuffer(width, height, t3d.PIXEL_FORMAT.RGBA8, 4),\n\t\t\tt3d.ATTACHMENT.COLOR_ATTACHMENT0\n\t\t);\n\t\ttempRenderTarget.attach(\n\t\t\tdepthRenderBuffer,\n\t\t\tt3d.ATTACHMENT.DEPTH_STENCIL_ATTACHMENT\n\t\t);\n\n\t\tconst tempRenderTarget2 = t3d.OffscreenRenderTarget.create2D(width, height);\n\t\ttempRenderTarget2.attach(\n\t\t\tnew t3d.RenderBuffer(width, height, t3d.PIXEL_FORMAT.RGBA8, 4),\n\t\t\tt3d.ATTACHMENT.COLOR_ATTACHMENT0\n\t\t);\n\t\ttempRenderTarget2.attach(\n\t\t\tdepthRenderBuffer,\n\t\t\tt3d.ATTACHMENT.DEPTH_STENCIL_ATTACHMENT\n\t\t);\n\n\t\tconst tempRenderTarget3 = t3d.OffscreenRenderTarget.create2D(width, height);\n\t\ttempRenderTarget3.texture.minFilter = t3d.TEXTURE_FILTER.NEAREST;\n\t\ttempRenderTarget3.texture.magFilter = t3d.TEXTURE_FILTER.NEAREST;\n\n\t\tconst gui = new GUI();\n\t\tgui.add({ version: 'WebGL ' + renderer.capabilities.version }, 'version').disable();\n\t\tgui.add(cube0.position, 'z', -10, 10, 1);\n\n\t\tfunction loop(count) {\n\t\t\trequestAnimationFrame(loop);\n\n\t\t\tcontroller.update();\n\n\t\t\t// Update matrix first, to avoid precision errors in viewMatrix.\n\t\t\tscene.updateMatrix();\n\t\t\tdepthScene.updateMatrix();\n\n\t\t\tscene.updateRenderStates(camera);\n\t\t\tscene.updateRenderQueue(camera);\n\n\t\t\tdepthScene.updateRenderStates(camera);\n\t\t\tdepthScene.updateRenderQueue(camera, false, false);\n\n\t\t\trenderer.renderScene(depthScene, camera, tempRenderTarget);\n\t\t\n\t\t\ttempRenderTarget2.clearDepth = false;\n\t\t\trenderer.renderScene(scene, camera, tempRenderTarget2);\n\n\t\t\trenderer.blitRenderTarget(tempRenderTarget2, tempRenderTarget3);\n\t\t\n\t\t\tcopyPass.uniforms.tDiffuse = tempRenderTarget3.texture;\n\t\t\tcopyPass.render(renderer, screenRenderTarget);\n\t\t}\n\t\t\n\t\tif (renderer.capabilities.version < 2) {\n\t\t\tdocument.getElementById('notSupported').style.display = '';\n\t\t} else {\n\t\t\trequestAnimationFrame(loop);\n\t\t}\n\n\t\tfunction onWindowResize() {\n\t\t\twidth = window.innerWidth || 2;\n\t\t\theight = window.innerHeight || 2;\n\n\t\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 1000);\n\n\t\t\tscreenRenderTarget.resize(width, height);\n\t\t\ttempRenderTarget.resize(width, height);\n\t\t\ttempRenderTarget2.resize(width, height);\n\t\t\ttempRenderTarget3.resize(width, height);\n\t\t}\n\t\twindow.addEventListener('resize', onWindowResize, false);\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "examples/custompass_depth_texture_share.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>t3d - custom depth texture share</title>\n\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n\t<link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n</head>\n<body>\n    <div id=\"info\">\n\t\t<a href=\"\" target=\"_blank\">t3d</a> - Share Depth Texture\n\t\t<br/> Two FBO attach the same depth texture\n\t\t<br/> Available only for WebGL 2.0\n\t\t<div id=\"notSupported\" style=\"display:none\">Sorry, your graphics card + browser does not support WebGL2</div>\n    </div>\n\n\t<!-- Import maps polyfill -->\n    <!-- Remove this when import maps will be widely supported -->\n    <script async src=\"./libs/es-module-shims.js\"></script>\n\n    <script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n    <script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { GUI } from './libs/lil-gui.esm.min.js';\n\t\timport { OrbitControls } from 't3d/addons/controls/OrbitControls.js';\n\t\timport { CopyShader } from 't3d/addons/shaders/CopyShader.js';\n\t\timport { GridHelper } from 't3d/addons/objects/GridHelper.js';\n\t\timport { Texture2DLoader } from 't3d/addons/loaders/Texture2DLoader.js';\n\n\t\tlet width = window.innerWidth || 2;\n\t\tlet height = window.innerHeight || 2;\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = width;\n\t\tcanvas.height = height;\n\t\tdocument.body.appendChild(canvas);\n\n\t\tconst contextParams = { antialias: false, alpha: false };\n\t\tconst gl = canvas.getContext('webgl2', contextParams) || canvas.getContext('webgl', contextParams);\n\t\tconst renderer = new t3d.WebGLRenderer(gl);\n\n\t\t// Create an geometry object.\n\n\t\tconst cube_geometry = new t3d.BoxGeometry(8, 8, 8);\n\n\t\t// Create depth scene.\n\n\t\tconst material0 = new t3d.BasicMaterial();\n\t\t// material0.colorWrite = false;\n\t\tconst cube0 = new t3d.Mesh(cube_geometry, material0);\n\t\tcube0.position.z = 10;\n\t\tconst depthScene = new t3d.Scene();\n\t\tdepthScene.add(cube0);\n\n\t\t// Create scene.\n\n\t\tconst scene = new t3d.Scene();\n\n\t\tconst grid = new GridHelper(50, 20, 0xffffff, 0xffffff);\n\t\tscene.add(grid);\n\n\t\tconst texture = new Texture2DLoader().load('./resources/hardwood2_diffuse.jpg');\n\t\ttexture.encoding = t3d.TEXEL_ENCODING_TYPE.SRGB;\n\t\ttexture.anisotropy = renderer.capabilities.maxAnisotropy;\n\n\t\tconst material = new t3d.BasicMaterial();\n\t\tmaterial.diffuseMap = texture;\n\t\tconst cube = new t3d.Mesh(cube_geometry, material);\n\t\tscene.add(cube);\n\n\t\t// Use the same camera.\n\n\t\tconst camera = new t3d.Camera();\n\t\tcamera.position.set(10, 10, 30);\n\t\tcamera.lookAt(new t3d.Vector3(0, 0, 0), new t3d.Vector3(0, 1, 0));\n\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 1000);\n\t\tscene.add(camera);\n\t\tdepthScene.add(camera);\n\n\t\tconst controller = new OrbitControls(camera, canvas);\n\t\t\n\t\tconst copyPass = new t3d.ShaderPostPass(CopyShader);\n\n\t\tconst screenRenderTarget = new t3d.ScreenRenderTarget(canvas);\n\n\t\tconst depthTexture = new t3d.Texture2D();\n\t\tdepthTexture.image = { data: null, width: 4, height: 4 };\n\t\tdepthTexture.type = t3d.PIXEL_TYPE.UNSIGNED_INT_24_8;\n\t\tdepthTexture.format = t3d.PIXEL_FORMAT.DEPTH_STENCIL;\n\t\tdepthTexture.magFilter = t3d.TEXTURE_FILTER.NEAREST;\n\t\tdepthTexture.minFilter = t3d.TEXTURE_FILTER.NEAREST;\n\t\tdepthTexture.generateMipmaps = false;\n\t\tdepthTexture.flipY = false;\n\n\t\tconst tempRenderTarget = t3d.OffscreenRenderTarget.create2D(width, height);\n\t\ttempRenderTarget.texture.minFilter = t3d.TEXTURE_FILTER.NEAREST;\n\t\ttempRenderTarget.texture.magFilter = t3d.TEXTURE_FILTER.NEAREST;\n\t\ttempRenderTarget.attach(\n\t\t\tdepthTexture,\n\t\t\tt3d.ATTACHMENT.DEPTH_STENCIL_ATTACHMENT\n\t\t);\n\n\t\tconst tempRenderTarget2 = t3d.OffscreenRenderTarget.create2D(width, height);\n\t\ttempRenderTarget2.texture.minFilter = t3d.TEXTURE_FILTER.NEAREST;\n\t\ttempRenderTarget2.texture.magFilter = t3d.TEXTURE_FILTER.NEAREST;\n\t\ttempRenderTarget2.texture.encoding = t3d.TEXEL_ENCODING_TYPE.SRGB;\n\t\ttempRenderTarget2.attach(\n\t\t\tdepthTexture,\n\t\t\tt3d.ATTACHMENT.DEPTH_STENCIL_ATTACHMENT\n\t\t);\n\n\t\tconst gui = new GUI();\n\t\tgui.add({ version: 'WebGL ' + renderer.capabilities.version }, 'version').disable();\n\t\tgui.add(cube0.position, 'z', -10, 10, 1);\n\n\t\tfunction loop(count) {\n\t\t\trequestAnimationFrame(loop);\n\n\t\t\tcontroller.update();\n\n\t\t\t// Update matrix first, to avoid precision errors in viewMatrix.\n\t\t\tscene.updateMatrix();\n\t\t\tdepthScene.updateMatrix();\n\n\t\t\tscene.updateRenderStates(camera);\n\t\t\tscene.updateRenderQueue(camera);\n\n\t\t\tdepthScene.updateRenderStates(camera);\n\t\t\tdepthScene.updateRenderQueue(camera, false, false);\n\n\t\t\trenderer.renderScene(depthScene, camera, tempRenderTarget);\n\t\t\n\t\t\ttempRenderTarget2.clearDepth = false;\n\t\t\trenderer.renderScene(scene, camera, tempRenderTarget2);\n\t\t\n\t\t\tcopyPass.uniforms.tDiffuse = tempRenderTarget2.texture;\n\t\t\tcopyPass.render(renderer, screenRenderTarget);\n\t\t}\n\t\t\n\t\tif (renderer.capabilities.version < 2) {\n\t\t\tdocument.getElementById('notSupported').style.display = '';\n\t\t} else {\n\t\t\trequestAnimationFrame(loop);\n\t\t}\n\n\t\tfunction onWindowResize() {\n\t\t\twidth = window.innerWidth || 2;\n\t\t\theight = window.innerHeight || 2;\n\n\t\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 1000);\n\n\t\t\tscreenRenderTarget.resize(width, height);\n\t\t\ttempRenderTarget.resize(width, height);\n\t\t\ttempRenderTarget2.resize(width, height);\n\t\t}\n\t\twindow.addEventListener('resize', onWindowResize, false);\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "examples/custompass_dof.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>t3d - custom pass dof</title>\n\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n\t<link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n</head>\n<body>\n    <div id=\"info\">\n\t\t<a href=\"\" target=\"_blank\">t3d</a> - custom pass dof\n\t\t<br/>\n\t\tmousemove/click to focal object\n    </div>\n\n\t<script src=\"./libs/nanobar.js\"></script>\n\n\t<!-- Import maps polyfill -->\n    <!-- Remove this when import maps will be widely supported -->\n    <script async src=\"./libs/es-module-shims.js\"></script>\n\n    <script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n    <script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { GLTFLoader } from 't3d/addons/loaders/glTF/GLTFLoader.js';\n\t\timport { OrbitControls } from 't3d/addons/controls/OrbitControls.js';\n\t\timport { BokehShader } from 't3d/addons/shaders/BokehShader.js';\n\t\timport { GBuffer } from 't3d/addons/GBuffer.js';\n\t\timport { GUI } from './libs/lil-gui.esm.min.js';\n\n\t\tlet width = window.innerWidth || 2;\n\t\tlet height = window.innerHeight || 2;\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = width;\n\t\tcanvas.height = height;\n\t\tdocument.body.appendChild(canvas);\n\n\t\tconst scene = new t3d.Scene();\n\n\t\tconst objects = [];\n\n\t\tconst nanobar = new Nanobar();\n\t\tnanobar.el.style.background = 'gray';\n\n\t\tconst loadingManager = new t3d.LoadingManager(function() {\n\t\t\tnanobar.go(100);\n\t\t\tnanobar.el.style.background = 'transparent';\n\t\t}, function(url, itemsLoaded, itemsTotal) {\n\t\t\tif (itemsLoaded < itemsTotal) {\n\t\t\t\tnanobar.go(itemsLoaded / itemsTotal * 100);\n\t\t\t}\n\t\t});\n\n\t\tconst loader = new GLTFLoader(loadingManager);\n\t\tloader.load('resources/models/gltf/suzanne/suzanne.gltf').then(function(result) {\n\t\t\tconst object = result.root.children[0];\n\t\t\n\t\t\tfor (let i = 0; i < 21; i++) {\n\t\t\t\tfor (let j = 0; j < 21; j++) {\n\t\t\t\t\tconst monkey = object.clone();\n\t\t\t\t\tmonkey.position.set((i - 10) * 4, 1, (j - 10) * 4);\n\t\t\t\t\tmonkey.material = monkey.material.clone();\n\t\t\t\t\tmonkey.material.diffuse.setHSL(Math.random(), 1.0, 0.3);\n\t\t\t\t\tmonkey.castShadow = true;\n\t\t\t\t\tmonkey.receiveShadow = true;\n\t\t\t\t\tscene.add(monkey);\n\t\t\t\t\tobjects.push(monkey);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\tconst plane_geometry = new t3d.PlaneGeometry(100, 100);\n\t\tconst material = new t3d.PBRMaterial();\n\t\tmaterial.diffuse.setHex(0xffffff);\n\t\tmaterial.roughness = 0.1;\n\t\tmaterial.metalness = 0.9;\n\t\tmaterial.dithering = true;\n\t\tconst plane = new t3d.Mesh(plane_geometry, material);\n\t\tplane.position.y = 0;\n\t\tscene.add(plane);\n\t\t\n\t\tconst ambientLight = new t3d.AmbientLight(0xffffff, 0.7);\n\t\tscene.add(ambientLight);\n\n\t\tconst directionalLight = new t3d.DirectionalLight(0xffffff, 0.7);\n\t\tdirectionalLight.position.set(-40, 40, 0);\n\t\tdirectionalLight.lookAt(new t3d.Vector3(), new t3d.Vector3(0, 1, 0));\n\t\tdirectionalLight.shadow.windowSize = 50;\n\t\tdirectionalLight.shadow.cameraNear = 40;\n\t\tdirectionalLight.shadow.cameraFar = 100;\n\t\tscene.add(directionalLight);\n\n\t\tplane.receiveShadow = true;\n\t\tdirectionalLight.castShadow = true;\n\t\tdirectionalLight.shadow.mapSize.set(1024, 1024);\n\n\t\tconst camera = new t3d.Camera();\n\t\tcamera.position.set(-8, 7, 20);\n\t\tcamera.lookAt(new t3d.Vector3(0, 0, 0), new t3d.Vector3(0, 1, 0));\n\t\tcamera.setPerspective(50 / 180 * Math.PI, width / height, 1, 500);\n\t\tscene.add(camera);\n\n\t\tconst controller = new OrbitControls(camera, canvas);\n\n\t\t// custom pass\n\t\tconst screenRenderTarget = new t3d.ScreenRenderTarget(canvas);\n\t\tscreenRenderTarget.setColorClearValue(0, 0, 0, 1);\n\n\t\tconst contextParams = { antialias: true, alpha: false };\n\t\tconst gl = canvas.getContext('webgl2', contextParams) || canvas.getContext('webgl', contextParams);\n\t\tconst renderer = new t3d.WebGLRenderer(gl);\n\n\t\tconst gBuffer = new GBuffer(width, height);\n\t\tgBuffer.enableAlbedoMetalness = false;\n\n\t\tconst shadowMapPass = new t3d.ShadowMapPass();\n\n\t\tconst dofPass = new t3d.ShaderPostPass(BokehShader);\n\t\tdofPass.uniforms['focalDepth'] = 35.36;\n\t\tdofPass.uniforms['focalLength'] = 50;\n\t\tdofPass.uniforms['znear'] = 1;\n\t\tdofPass.uniforms['zfar'] = 500;\n\t\tdofPass.uniforms['gain'] = 0.1;\n\n\t\tconst tempRenderTarget = t3d.OffscreenRenderTarget.create2D(width, height);\n\t\ttempRenderTarget.texture.minFilter = t3d.TEXTURE_FILTER.LINEAR;\n\t\ttempRenderTarget.texture.magFilter = t3d.TEXTURE_FILTER.LINEAR;\n\t\ttempRenderTarget.texture.generateMipmaps = false;\n\n\t\tconst raycaster = new t3d.Raycaster();\n\n\t\tconst mouse = new t3d.Vector2();\n\n\t\tfunction updateFocalDepth(e) {\n\t\t\tmouse.x = (event.clientX / window.innerWidth) * 2 - 1;\n\t\t\tmouse.y = -(event.clientY / window.innerHeight) * 2 + 1;\n\n\t\t\traycaster.setFromCamera(mouse, camera);\n\n\t\t\tconst array = raycaster.intersectObject(scene, true);\n\t\t\tif (array.length > 0) {\n\t\t\t\tdofPass.uniforms['focalDepth'] = array[0].distance;\n\t\t\t}\n\t\t}\n\n\t\tdocument.addEventListener('click', updateFocalDepth);\n\t\tdocument.addEventListener('mousemove', updateFocalDepth);\n\n\t\tconst gui = new GUI();\n\t\tgui.add(dofPass.uniforms, 'focalDepth', 0, 50, 0.01).listen();\n\t\tgui.add(dofPass.uniforms, 'focalLength', 0, 150, 1);\n\t\tgui.add(dofPass.uniforms, 'fstop', 0, 1, 0.01);\n\t\tgui.add(dofPass.uniforms, 'maxblur', 0, 1, 0.01);\n\t\tgui.add(dofPass.uniforms, 'threshold', 0, 1, 0.01);\n\t\tgui.add(dofPass.uniforms, 'gain', 0, 1, 0.01);\n\t\tgui.add(dofPass.uniforms, 'bias', 0, 2, 0.01);\n\n\t\tfunction loop(count) {\n\t\t\trequestAnimationFrame(loop);\n\n\t\t\tcontroller.update();\n\n\t\t\tscene.updateMatrix();\n\t\t\tscene.updateRenderStates(camera);\n\t\t\tscene.updateRenderQueue(camera);\n\n\t\t\tshadowMapPass.render(renderer, scene);\n\n\t\t\tgBuffer.update(renderer, scene, camera);\n\n\t\t\trenderer.renderScene(scene, camera, tempRenderTarget);\n\n\t\t\tdofPass.uniforms['tColor'] = tempRenderTarget.texture;\n\t\t\tdofPass.uniforms['tDepth'] = gBuffer.getDepthTexture();\n\t\t\tdofPass.render(renderer, screenRenderTarget);\n\t\t}\n\t\trequestAnimationFrame(loop);\n\n\t\tfunction onWindowResize() {\n\t\t\twidth = window.innerWidth || 2;\n\t\t\theight = window.innerHeight || 2;\n\n\t\t\tcamera.setPerspective(50 / 180 * Math.PI, width / height, 1, 500);\n\n\t\t\tscreenRenderTarget.resize(width, height);\n\t\t\tgBuffer.resize(width, height);\n\n\t\t\ttempRenderTarget.resize(width, height);\n\t\t}\n\t\twindow.addEventListener('resize', onWindowResize, false);\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "examples/custompass_gbuffer.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>t3d - custom pass gbuffer</title>\n\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n\t<link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n</head>\n<body>\n    <div id=\"info\">\n        <a href=\"\" target=\"_blank\">t3d</a> - custom pass gbuffer\n    </div>\n\n\t<!-- Import maps polyfill -->\n    <!-- Remove this when import maps will be widely supported -->\n    <script async src=\"./libs/es-module-shims.js\"></script>\n\n    <script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n    <script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { GBuffer } from 't3d/addons/GBuffer.js';\n\t\timport { GUI } from './libs/lil-gui.esm.min.js';\n\t\timport { GLTFLoader } from 't3d/addons/loaders/glTF/GLTFLoader.js';\n\t\timport { OrbitControls } from 't3d/addons/controls/OrbitControls.js';\n\n\t\tlet width = window.innerWidth || 2;\n\t\tlet height = window.innerHeight || 2;\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = width;\n\t\tcanvas.height = height;\n\t\tdocument.body.appendChild(canvas);\n\n\t\tconst scene = new t3d.Scene();\n\n\t\tconst loader = new GLTFLoader();\n\t\tloader.load(\n\t\t\t'resources/models/gltf/DamagedHelmet/glTF/DamagedHelmet.gltf'\n\t\t).then(function(result) {\n\t\t\t// add mesh to scene\n\t\t\tconst object = result.root.children[0];\n\n\t\t\tobject.position.set(0, 5, 0);\n\t\t\tobject.scale.set(15, 15, 15);\n\t\t\tobject.euler.z = -Math.PI / 6;\n\n\t\t\tscene.add(object);\n\t\t});\n\n\t\tconst basic = new t3d.BasicMaterial();\n\t\tbasic.diffuse.setRGB(0, 1, 1);\n\t\tbasic.transparent = true;\n\t\tbasic.opacity = 0.3;\n\t\tconst cube = new t3d.Mesh(new t3d.BoxGeometry(5, 5, 5), basic);\n\t\tcube.position.set(20, 0, 0);\n\t\tscene.add(cube);\n\n\t\tconst plane_geometry = new t3d.PlaneGeometry(500, 500);\n\t\tconst lambert = new t3d.LambertMaterial();\n\t\tlambert.diffuse.setHex(0xffffff);\n\t\t// material.emissive.setRGB(1, 0, 0);\n\t\t// material.specular.setRGB(0, 0, 0);\n\t\tconst plane = new t3d.Mesh(plane_geometry, lambert);\n\t\tplane.receiveShadow = true;\n\t\tplane.position.y = -10;\n\t\tscene.add(plane);\n\n\t\tconst camera = new t3d.Camera();\n\t\tcamera.position.set(30, 50, 100);\n\t\tcamera.lookAt(new t3d.Vector3(0, 0, 0), new t3d.Vector3(0, 1, 0));\n\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 500);\n\t\tscene.add(camera);\n\n\t\tconst controller = new OrbitControls(camera, canvas);\n\n\t\tconst screenRenderTarget = new t3d.ScreenRenderTarget(canvas);\n\t\tscreenRenderTarget.setColorClearValue(0, 0, 0, 1);\n\n\t\tconst contextParams = { antialias: false, alpha: false };\n\t\tconst gl = canvas.getContext('webgl2', contextParams) || canvas.getContext('webgl', contextParams);\n\t\tconst renderer = new t3d.WebGLRenderer(gl);\n\n\t\tconst gBuffer = new GBuffer(width, height);\n\t\tgBuffer.enableMotion = true;\n\n\t\t// gui\n\t\tconst params = { version: 'WebGL ' + renderer.capabilities.version, debug: 'normal' };\n\t\tconst gui = new GUI();\n\t\tgui.add(params, 'version').disable();\n\t\tgui.add(params, 'debug', ['normal', 'depth', 'position', 'glossiness', 'metalness', 'albedo', 'velocity']);\n\n\t\tfunction loop(count) {\n\t\t\trequestAnimationFrame(loop);\n\n\t\t\tcontroller.update();\n\n\t\t\tscene.updateMatrix();\n\t\t\tscene.updateRenderStates(camera);\n\t\t\tscene.updateRenderQueue(camera);\n\n\t\t\tgBuffer.update(renderer, scene, camera);\n\t\t\tgBuffer.renderDebug(renderer, camera, params.debug, screenRenderTarget);\n\t\t}\n\t\trequestAnimationFrame(loop);\n\n\t\tfunction onWindowResize() {\n\t\t\twidth = window.innerWidth || 2;\n\t\t\theight = window.innerHeight || 2;\n\n\t\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 500);\n\n\t\t\tscreenRenderTarget.resize(width, height);\n\t\t\tgBuffer.resize(width, height);\n\t\t}\n\t\twindow.addEventListener('resize', onWindowResize, false);\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "examples/custompass_gpupick.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n    <meta charset=\"utf-8\">\n    <title>t3d - GPUPick</title>\n    <meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n    <link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n</head>\n<body>\n    <div id=\"info\">\n        <a href=\"\" target=\"_blank\">t3d</a> - GPUPick\n        <br/> Move the mouse to obtain information\n        <div id=\"notSupported\" style=\"display:none\">Sorry, your graphics card + browser does not support WebGL2</div>\n    </div>\n    <script src=\"./libs/nanobar.js\"></script>\n\n    <!-- Import maps polyfill -->\n    <!-- Remove this when import maps will be widely supported -->\n    <script async src=\"./libs/es-module-shims.js\"></script>\n\n    <script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n    <script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { OrbitControls } from 't3d/addons/controls/OrbitControls.js';\n\t\timport { GeometryUtils } from 't3d/addons/geometries/GeometryUtils.js';\n\t\timport { GLTFLoader } from 't3d/addons/loaders/glTF/GLTFLoader.js';\n\t\timport PickBuffer from 't3d/addons/PickBuffer.js';\n\t\timport { Timer } from 't3d/addons/misc/Timer.js';\n\t\timport Stats from './libs/stats.module.js';\n\t\timport { GUI } from './libs/lil-gui.esm.min.js';\n\n\t\tlet width = window.innerWidth || 2;\n\t\tlet height = window.innerHeight || 2;\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = width;\n\t\tcanvas.height = height;\n\t\tdocument.body.appendChild(canvas);\n\n\t\tconst contextParams = { antialias: true, alpha: false };\n\t\tconst gl = canvas.getContext('webgl2', contextParams) || canvas.getContext('webgl', contextParams);\n\t\tconst renderer = new t3d.WebGLRenderer(gl);\n\n\t\tconst screenRenderTarget = new t3d.ScreenRenderTarget(canvas);\n\n\t\tconst scene = new t3d.Scene();\n\n\t\tconst near = 0.1;\n\t\tconst far = 1000;\n\n\t\tconst camera = new t3d.Camera();\n\t\tcamera.outputEncoding = t3d.TEXEL_ENCODING_TYPE.SRGB;\n\t\tcamera.position.set(0, 0, 100);\n\t\tcamera.lookAt(new t3d.Vector3(0, 0, 0), new t3d.Vector3(0, 1, 0));\n\t\tcamera.setPerspective(60 / 180 * Math.PI, width / height, near, far);\n\t\tscene.add(camera);\n\n\t\tconst controller = new OrbitControls(camera, canvas);\n\n\t\tconst ambientLight = new t3d.AmbientLight(0xffffff, 0.5);\n\t\tscene.add(ambientLight);\n\n\t\tconst directionalLight = new t3d.DirectionalLight(0xffffff, 1);\n\t\tdirectionalLight.position.set(-40, 40, 0);\n\t\tdirectionalLight.lookAt(new t3d.Vector3(), new t3d.Vector3(0, 1, 0));\n\t\tscene.add(directionalLight);\n\n\t\t// create normal helper\n\n\t\tconst normalLocalTransform = new t3d.Matrix4();\n\t\tconst normalMaterial = new t3d.BasicMaterial();\n\t\tconst normalGeometry = new t3d.CylinderGeometry(0.2, 0, 1, 20, 1);\n\t\tnormalLocalTransform.makeTranslation(0, -0.5, 0);\n\t\tGeometryUtils.applyMatrix4(normalGeometry, normalLocalTransform);\n\t\tnormalLocalTransform.makeRotationAxis(new t3d.Vector3(1, 0, 0), -Math.PI / 2);\n\t\tGeometryUtils.applyMatrix4(normalGeometry, normalLocalTransform);\n\t\tconst normalHelper = new t3d.Mesh(normalGeometry, normalMaterial);\n\t\tnormalHelper.renderLayer = 2;\n\t\tscene.add(normalHelper);\n\n\t\t// create meshes\n\n\t\tconst nanobar = new Nanobar();\n\t\tnanobar.el.style.background = 'gray';\n\t\tconst loadingManager = new t3d.LoadingManager(function() {\n\t\t\tnanobar.go(100);\n\t\t\tnanobar.el.style.background = 'transparent';\n\t\t}, function(url, itemsLoaded, itemsTotal) {\n\t\t\tif (itemsLoaded < itemsTotal) {\n\t\t\t\tnanobar.go(itemsLoaded / itemsTotal * 100);\n\t\t\t}\n\t\t});\n\n\t\tconst loader = new GLTFLoader(loadingManager);\n\t\tloader.load('./resources/models/gltf/suzanne/suzanne.gltf').then(function(result) {\n\t\t\tconst object = result.root.children[0];\n\n\t\t\tfor (let i = 0; i < 3000; i++) {\n\t\t\t\tconst monkey = object.clone();\n\t\t\t\tmonkey.material = monkey.material.clone();\n\t\t\t\tmonkey.material.diffuse.setHSL(Math.random(), 0.5, 0.5);\n\t\t\t\tmonkey.position.set(Math.random() * 100 - 50, Math.random() * 60 - 30, Math.random() * 80 - 40);\n\t\t\t\tmonkey.euler.x = Math.PI * 2 * Math.random();\n\t\t\t\tmonkey.euler.y = Math.PI * 2 * Math.random();\n\t\t\t\tmonkey.scale.set(2, 2, 2);\n\t\t\t\tscene.add(monkey);\n\n\t\t\t\tpickBuffer.setMeshPickId(i + 1, monkey);\n\t\t\t}\n\n\t\t\tpickMaterial = object.material.clone();\n\t\t\tpickMaterial.diffuse.setRGB(1, 0, 0);\n\t\t});\n\n\t\t// pick event\n\n\t\tlet pickMaterial, pickedMesh;\n\n\t\tconst normal = new t3d.Vector3();\n\t\tconst position = new t3d.Vector3();\n\t\tconst octahedron = new t3d.Vector2();\n\t\tconst pixels = new Float32Array(1 * 1 * 4);\n\n\t\tfunction octahedronToUnitVector(v2, v3) {\n\t\t\tv3.set(v2.x, 1.0 - Math.abs(v2.x) - Math.abs(v2.y), v2.y);\n\t\t\tif (v3.y < 0.0) {\n\t\t\t\tconst temp = v3.x;\n\t\t\t\tv3.x = (1.0 - Math.abs(v3.z)) * Math.sign(v3.x);\n\t\t\t\tv3.z = (1.0 - Math.abs(temp)) * Math.sign(v3.z);\n\t\t\t}\n\t\t\tv3.normalize();\n\t\t}\n\n\t\tfunction selectMesh(mesh) {\n\t\t\tif (pickedMesh) {\n\t\t\t\tpickedMesh.material = pickedMesh._oldMaterial;\n\t\t\t\tpickedMesh = null;\n\t\t\t}\n\n\t\t\tpickedMesh = mesh;\n\t\t\tmesh._oldMaterial = mesh.material;\n\t\t\tmesh.material = pickMaterial;\n\t\t}\n\n\t\tconst pickBuffer = new PickBuffer(width, height);\n\n\t\tconst timer = new Timer();\n\n\t\tconst cameraMatrixCache = {\n\t\t\tworldMatrix: new t3d.Matrix4(),\n\t\t\tprojectionMatrix: new t3d.Matrix4(),\n\t\t\tprojectionMatrixInverse: new t3d.Matrix4()\n\t\t};\n\n\t\tconst bufferUpdateInterval = 0.1;\n\t\tlet bufferUpdateTimer = 0, isReading = false;\n\n\t\tasync function doPick(e) {\n\t\t\t// Update pick buffer\n\t\t\tconst deltaTime = timer.getDelta();\n\t\t\tbufferUpdateTimer += deltaTime;\n\n\t\t\tif (bufferUpdateTimer > bufferUpdateInterval) {\n\t\t\t\tpickBuffer.render(renderer, scene, camera);\n\t\t\t\tcameraMatrixCache.worldMatrix.copy(camera.worldMatrix);\n\t\t\t\tcameraMatrixCache.projectionMatrix.copy(camera.projectionMatrix);\n\t\t\t\tcameraMatrixCache.projectionMatrixInverse.copy(camera.projectionMatrixInverse);\n\t\t\t\tbufferUpdateTimer = 0;\n\t\t\t}\n\n\t\t\t// Read pixels\n\n\t\t\tif (isReading) return;\n\n\t\t\tisReading = true;\n\n\t\t\tif (params.asyncReadPixel) {\n\t\t\t\tawait renderer.readTexturePixels(pickBuffer._rt.texture, e.clientX, height - e.clientY, 1, 1, pixels).catch(e => {\n\t\t\t\t\tconsole.warn(e);\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\trenderer.readTexturePixelsSync(pickBuffer._rt.texture, e.clientX, height - e.clientY, 1, 1, pixels);\n\t\t\t}\n\n\t\t\tisReading = false;\n\n\t\t\t// Calculate position and normal\n\n\t\t\tconst ndcX = (e.clientX / width) * 2.0 - 1.0;\n\t\t\tconst ndcY = -(e.clientY / height) * 2.0 + 1.0;\n\t\t\tconst ndcZ = (new t3d.Vector3(0, 0, pixels[2]).applyMatrix4(cameraMatrixCache.projectionMatrix)).z; // viewZ to ndcZ\n\n\t\t\tposition.set(ndcX, ndcY, ndcZ)\n\t\t\t\t.applyMatrix4(cameraMatrixCache.projectionMatrixInverse)\n\t\t\t\t.applyMatrix4(cameraMatrixCache.worldMatrix);\n\n\t\t\toctahedron.set(pixels[0], pixels[1]);\n\t\t\toctahedronToUnitVector(octahedron, normal);\n\n\t\t\t// Show pick result\n\n\t\t\tnormalHelper.position.set(0, 0, 0);\n\t\t\tnormalHelper.lookAt(normal, new t3d.Vector3(0, 1, 0));\n\t\t\tnormalHelper.position.copy(position);\n\n\t\t\tif (!pickBuffer.getMeshByPickId(pixels[3])) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\n\t\t\tselectMesh(pickBuffer.getMeshByPickId(pixels[3]));\n\t\t}\n\t\tdocument.addEventListener('mousemove', doPick, false);\n\n\t\t// stats\n\n\t\tconst stats = new Stats();\n\t\tstats.showPanel(0);\n\t\tdocument.body.appendChild(stats.dom);\n\n\t\t// gui\n\n\t\tconst params = { asyncReadPixel: true };\n\n\t\tconst gui = new GUI();\n\t\tgui.add(params, 'asyncReadPixel');\n\n\t\t//\n\n\t\tfunction loop(timestamp) {\n\t\t\trequestAnimationFrame(loop);\n\n\t\t\tstats.begin();\n\n\t\t\tcontroller.update();\n\n\t\t\ttimer.update(timestamp);\n\n\t\t\tscene.updateMatrix();\n\t\t\tscene.updateRenderStates(camera);\n\t\t\tscene.updateRenderQueue(camera);\n\n\t\t\trenderer.renderScene(scene, camera, screenRenderTarget);\n\n\t\t\tstats.end();\n\t\t}\n\n\t\tif (renderer.capabilities.version < 2) {\n\t\t\tdocument.getElementById('notSupported').style.display = '';\n\t\t} else {\n\t\t\trequestAnimationFrame(loop);\n\t\t}\n\n\t\tfunction onWindowResize() {\n\t\t\twidth = window.innerWidth || 2;\n\t\t\theight = window.innerHeight || 2;\n\n\t\t\tcamera.setPerspective(60 / 180 * Math.PI, width / height, near, far);\n\t\t\tscreenRenderTarget.resize(width, height);\n\t\t\tpickBuffer.resize(width, height);\n\t\t}\n\t\twindow.addEventListener('resize', onWindowResize, false);\n    </script>\n</body>\n</html>"
  },
  {
    "path": "examples/custompass_lensflare.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>t3d - lens flare</title>\n\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n\t<link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n</head>\n<body>\n    <div id=\"info\">\n        <a href=\"\" target=\"_blank\">t3d</a> - lens flare<br/>\n\t\ttextures from <a href=\"http://www.ro.me\" target=\"_blank\" rel=\"noopener\">ro.me</a><br/>\n    </div>\n\n\t<!-- Import maps polyfill -->\n    <!-- Remove this when import maps will be widely supported -->\n    <script async src=\"./libs/es-module-shims.js\"></script>\n\n    <script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n    <script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { OrbitControls } from 't3d/addons/controls/OrbitControls.js';\n\t\timport { CopyShader } from 't3d/addons/shaders/CopyShader.js';\n\t\timport { GridHelper } from 't3d/addons/objects/GridHelper.js';\n\t\timport { Texture2DLoader } from 't3d/addons/loaders/Texture2DLoader.js';\n\t\timport { GUI } from './libs/lil-gui.esm.min.js';\n\n\t\tlet width = window.innerWidth || 2;\n\t\tlet height = window.innerHeight || 2;\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = width;\n\t\tcanvas.height = height;\n\t\tdocument.body.appendChild(canvas);\n\n\t\tconst contextParams = { antialias: false, alpha: false };\n\t\tconst gl = canvas.getContext('webgl2', contextParams) || canvas.getContext('webgl', contextParams);\n\t\tconst renderer = new t3d.WebGLRenderer(gl);\n\t\tconst maxSamples = renderer.capabilities.maxSamples;\n\t\tconst multipleSampling = maxSamples > 1 ? Math.min(4, maxSamples) : 0;\n\n\t\t// Create scene\n\n\t\tconst scene = new t3d.Scene();\n\n\t\tconst lensflareGeometry = new t3d.Geometry();\n\t\tconst float32Array = new Float32Array([\n\t\t\t-1, -1, 0, 0, 0,\n\t\t\t1, -1, 0, 1, 0,\n\t\t\t1, 1, 0, 1, 1,\n\t\t\t-1, 1, 0, 0, 1\n\t\t]);\n\t\tconst buffer = new t3d.Buffer(float32Array, 5);\n\t\tlensflareGeometry.setIndex(\n\t\t\tnew t3d.Attribute(new t3d.Buffer(new Uint16Array([0, 1, 2, 0, 2, 3]), 1))\n\t\t);\n\t\tlensflareGeometry.addAttribute('a_Position', new t3d.Attribute(buffer, 3, 0));\n\t\tlensflareGeometry.addAttribute('a_Uv', new t3d.Attribute(buffer, 2, 3));\n\n\t\tconst lensflareGroup = new t3d.Object3D();\n\t\tlensflareGroup.position.set(-5, 3.8, -5);\n\t\tscene.add(lensflareGroup);\n\n\t\t// Create lens flares\n\n\t\tconst textureLoader = new Texture2DLoader();\n\n\t\tconst textureFlare0 = textureLoader.load('./resources/lensflare/lensflare0.png');\n\t\tconst textureFlare3 = textureLoader.load('./resources/lensflare/lensflare3.png');\n\n\t\tconst lensflaresConfig = [\n\t\t\t{ texture: textureFlare0, scale: 0.6, offset: 0 },\n\t\t\t{ texture: textureFlare3, scale: 0.05, offset: 0.6 },\n\t\t\t{ texture: textureFlare3, scale: 0.06, offset: 0.7 },\n\t\t\t{ texture: textureFlare3, scale: 0.1, offset: 0.9 },\n\t\t\t{ texture: textureFlare3, scale: 0.06, offset: 1 }\n\t\t];\n\n\t\tconst lensflareShader = {\n\t\t\tname: 'lensflare',\n\t\t\tdefines: {},\n\t\t\tuniforms: {\n\t\t\t\t'map': null,\n\t\t\t\t'occlusionMap': null,\n\t\t\t\t'color': [1, 1, 1],\n\t\t\t\t'scale': [1, 1],\n\t\t\t\t'screenPosition': [0, 0, 0]\n\t\t\t},\n\t\t\tvertexShader: `\n\t\t\t\tuniform vec3 screenPosition;\n\t\t\t\tuniform vec2 scale;\n\n\t\t\t\tuniform sampler2D occlusionMap;\n\n\t\t\t\tattribute vec3 a_Position;\n\t\t\t\tattribute vec2 a_Uv;\n\n\t\t\t\tvarying vec2 v_Uv;\n\t\t\t\tvarying float v_Visibility;\n\n\t\t\t\tvoid main() {\n\t\t\t\t\tv_Uv = a_Uv;\n\n\t\t\t\t\tvec2 pos = a_Position.xy;\n\n\t\t\t\t\tvec4 visibility = texture2D(occlusionMap, vec2(0.5, 0.5)) * 0.2;\n\t\t\t\t\tvisibility += texture2D(occlusionMap, vec2(0.34, 0.34)) * 0.1;\n\t\t\t\t\tvisibility += texture2D(occlusionMap, vec2(0.34, 0.66)) * 0.1;\n\t\t\t\t\tvisibility += texture2D(occlusionMap, vec2(0.66, 0.34)) * 0.1;\n\t\t\t\t\tvisibility += texture2D(occlusionMap, vec2(0.66, 0.66)) * 0.1;\n\t\t\t\t\tvisibility += texture2D(occlusionMap, vec2(0.18, 0.5)) * 0.1;\n\t\t\t\t\tvisibility += texture2D(occlusionMap, vec2(0.82, 0.5)) * 0.1;\n\t\t\t\t\tvisibility += texture2D(occlusionMap, vec2(0.5, 0.18)) * 0.1;\n\t\t\t\t\tvisibility += texture2D(occlusionMap, vec2(0.5, 0.82)) * 0.1;\n\n\t\t\t\t\tv_Visibility = visibility.r;\n\n\t\t\t\t\tgl_Position = vec4(pos * scale + screenPosition.xy, screenPosition.z, 1.0);\n\t\t\t\t}\n\t\t\t`,\n\t\t\tfragmentShader: `\n\t\t\t\tuniform sampler2D map;\n\t\t\t\tuniform vec3 color;\n\n\t\t\t\tvarying vec2 v_Uv;\n\t\t\t\tvarying float v_Visibility;\n\n\t\t\t\tvoid main() {\n\t\t\t\t\tvec4 texture = texture2D(map, v_Uv);\n\t\t\t\t\ttexture.a *= v_Visibility;\n\t\t\t\t\tgl_FragColor = texture;\n\t\t\t\t\tgl_FragColor.rgb *= color;\n\t\t\t\t}\n\t\t\t`\n\t\t};\n\n\t\tconst lensflares = [];\n\t\tlensflaresConfig.forEach(function(config) {\n\t\t\tconst lensflareMaterial = new t3d.ShaderMaterial(lensflareShader);\n\t\t\tlensflareMaterial.transparent = true;\n\t\t\tlensflareMaterial.blending = t3d.BLEND_TYPE.ADD;\n\t\t\tlensflareMaterial.depthWrite = false;\n\t\t\tlensflareMaterial.uniforms.map = config.texture;\n\t\t\tconst lensflare = new t3d.Mesh(lensflareGeometry, lensflareMaterial);\n\t\t\tlensflare.renderLayer = 2; // Setting layer 2 as lens flare layer\n\t\t\tlensflare.frustumCulled = false;\n\t\t\tlensflareGroup.add(lensflare);\n\n\t\t\tlensflares.push(lensflare);\n\t\t});\n\n\t\t// Create lens flare occlusion mesh, used to test occlusion.\n\n\t\tconst occlusionShader = {\n\t\t\tname: 'lensflare_occlusion',\n\t\t\tdefines: {},\n\t\t\tuniforms: {\n\t\t\t\t'scale': [1, 1],\n\t\t\t\t'screenPosition': [0, 0, 0]\n\t\t\t},\n\t\t\tvertexShader: `\n\t\t\t\tuniform vec3 screenPosition;\n\t\t\t\tuniform vec2 scale;\n\n\t\t\t\tattribute vec3 a_Position;\n\t\t\t\tattribute vec2 a_Uv;\n\n\t\t\t\tvarying vec2 v_Uv;\n\n\t\t\t\tvoid main() {\n\t\t\t\t\tv_Uv = a_Uv;\n\t\t\t\t\tvec2 pos = a_Position.xy;\n\t\t\t\t\tgl_Position = vec4(pos * scale + screenPosition.xy, screenPosition.z, 1.0);\n\t\t\t\t}\n\t\t\t`,\n\t\t\tfragmentShader: `\n\t\t\t\tuniform sampler2D map;\n\t\t\t\tuniform vec3 color;\n\n\t\t\t\tvarying vec2 v_Uv;\n\n\t\t\t\tvoid main() {\n\t\t\t\t\tfloat dist = length(v_Uv - vec2(0.5));\n\t\t\t\t\tfloat mask = 1.0 - smoothstep(0.49, 0.5, dist);\n\t\t\t\t\tgl_FragColor = vec4(mask, mask, mask, 1.);\n\t\t\t\t}\n\t\t\t`\n\t\t};\n\n\t\tconst occlusionTestMaterial = new t3d.ShaderMaterial(occlusionShader);\n\t\tocclusionTestMaterial.depthWrite = false;\n\t\tconst occlusionTestMesh = new t3d.Mesh(lensflareGeometry, occlusionTestMaterial);\n\t\tocclusionTestMesh.renderLayer = 1; // Setting layer 1 as lens flare occlusion test layer\n\t\tocclusionTestMesh.frustumCulled = false;\n\t\tlensflareGroup.add(occlusionTestMesh);\n\n\t\t// Create main layer objects.\n\n\t\tconst texture = textureLoader.load('./resources/logo.jpg');\n\t\ttexture.encoding = t3d.TEXEL_ENCODING_TYPE.SRGB;\n\t\ttexture.anisotropy = renderer.capabilities.maxAnisotropy;\n\n\t\tfor (let i = 0; i < 3; i++) {\n\t\t\tconst cube_geometry = new t3d.BoxGeometry(8, 8, 8);\n\t\t\tconst material = new t3d.PBRMaterial();\n\t\t\tmaterial.roughness = 1;\n\t\t\tmaterial.metalness = 0;\n\t\t\tmaterial.diffuseMap = texture;\n\t\t\tconst cube = new t3d.Mesh(cube_geometry, material);\n\t\t\tcube.position.set(i * 10 - 10, 0, 0);\n\t\t\tscene.add(cube);\n\t\t}\n\n\t\tconst grid = new GridHelper(100, 20, 0xffffff, 0x888888);\n\t\tgrid.position.y = -4;\n\t\tscene.add(grid);\n\n\t\tconst ambientLight = new t3d.AmbientLight(0xffffff, 0.1);\n\t\tscene.add(ambientLight);\n\n\t\tconst pointLight = new t3d.PointLight(0xffffff, 0.7, 50);\n\t\tlensflareGroup.add(pointLight);\n\n\t\tconst camera = new t3d.Camera();\n\t\tcamera.outputEncoding = t3d.TEXEL_ENCODING_TYPE.SRGB;\n\t\tcamera.position.set(0, 5, 40);\n\t\tcamera.lookAt(new t3d.Vector3(0, 0, 0), new t3d.Vector3(0, 1, 0));\n\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 1000);\n\t\tcamera.frustumCulled = false;\n\t\tscene.add(camera);\n\n\t\tconst controller = new OrbitControls(camera, canvas);\n\n\t\t// Render targets\n\n\t\tconst screenRenderTarget = new t3d.ScreenRenderTarget(canvas);\n\n\t\tconst depthRenderBuffer = new t3d.RenderBuffer(width, height, t3d.PIXEL_FORMAT.DEPTH24_STENCIL8, multipleSampling);\n\n\t\tconst sceneRenderTarget = t3d.OffscreenRenderTarget.create2D(width, height);\n\t\tsceneRenderTarget.attach(\n\t\t\tnew t3d.RenderBuffer(width, height, t3d.PIXEL_FORMAT.RGBA8, multipleSampling),\n\t\t\tt3d.ATTACHMENT.COLOR_ATTACHMENT0\n\t\t);\n\t\tsceneRenderTarget.attach(\n\t\t\tdepthRenderBuffer,\n\t\t\tt3d.ATTACHMENT.DEPTH_STENCIL_ATTACHMENT\n\t\t);\n\n\t\tconst occlusionRenderTarget = t3d.OffscreenRenderTarget.create2D(width, height);\n\t\tocclusionRenderTarget.attach(\n\t\t\tnew t3d.RenderBuffer(width, height, t3d.PIXEL_FORMAT.RGBA8, multipleSampling),\n\t\t\tt3d.ATTACHMENT.COLOR_ATTACHMENT0\n\t\t);\n\t\tocclusionRenderTarget.attach(\n\t\t\tdepthRenderBuffer,\n\t\t\tt3d.ATTACHMENT.DEPTH_STENCIL_ATTACHMENT\n\t\t);\n\n\t\tconst clippedOcclusionRenderTarget = t3d.OffscreenRenderTarget.create2D(64, 64);\n\t\tclippedOcclusionRenderTarget.texture.minFilter = t3d.TEXTURE_FILTER.NEAREST;\n\t\tclippedOcclusionRenderTarget.texture.magFilter = t3d.TEXTURE_FILTER.NEAREST;\n\n\t\tconst resultRenderTarget = t3d.OffscreenRenderTarget.create2D(width, height);\n\t\tresultRenderTarget.texture.minFilter = t3d.TEXTURE_FILTER.NEAREST;\n\t\tresultRenderTarget.texture.magFilter = t3d.TEXTURE_FILTER.NEAREST;\n\n\t\t// Passes\n\n\t\tconst copyPass = new t3d.ShaderPostPass(CopyShader);\n\n\t\tconst clipShader = {\n\t\t\tname: 'clip',\n\t\t\tdefines: {},\n\t\t\tuniforms: {\n\t\t\t\t'tDiffuse': null,\n\t\t\t\t'clipRect': [0, 0, 1, 1]\n\t\t\t},\n\t\t\tvertexShader: `\n\t\t\t\tattribute vec3 a_Position;\n\t\t\t\tattribute vec2 a_Uv;\n\n\t\t\t\tuniform mat4 u_ProjectionView;\n\t\t\t\tuniform mat4 u_Model;\n\n\t\t\t\tuniform vec4 clipRect;\n\n\t\t\t\tvarying vec2 v_Uv;\n\n\t\t\t\tvoid main() {\n\t\t\t\t\tv_Uv = a_Uv * clipRect.zw + clipRect.xy;\n\t\t\t\t\tgl_Position = u_ProjectionView * u_Model * vec4(a_Position, 1.0);\n\t\t\t\t}\n\t\t\t`,\n\t\t\tfragmentShader: `\n\t\t\t\tuniform sampler2D tDiffuse;\n\n\t\t\t\tvarying vec2 v_Uv;\n\n\t\t\t\tvoid main() {\n\t\t\t\t\tvec4 texel = texture2D(tDiffuse, v_Uv);\n\t\t\t\t\tgl_FragColor = texel;\n\t\t\t\t}\n\t\t\t`\n\t\t};\n\n\t\tconst clipPass = new t3d.ShaderPostPass(clipShader);\n\n\t\t// GUI\n\n\t\tconst params = { position: 0.25, color: [255, 255, 255], scale: 1, occlusionScale: 0.02, debug: false };\n\n\t\tconst gui = new GUI();\n\t\tgui.add({ version: 'WebGL ' + renderer.capabilities.version }, 'version').disable();\n\t\tgui.add(params, 'position', 0, 1, 0.01).onChange(value => {\n\t\t\tlensflareGroup.position.x = -10 + 20 * value;\n\t\t\tlensflareGroup.position.y = Math.sin(value * Math.PI) * 5;\n\t\t});\n\t\tgui.add(params, 'scale', 0, 1, 0.01);\n\t\tgui.add(params, 'occlusionScale', 0, 0.5, 0.001);\n\t\tgui.addColor(lensflares[0].material.uniforms, 'color').onChange(value => {\n\t\t\tpointLight.color.fromArray(value);\n\t\t});\n\t\tgui.add(params, 'debug');\n\n\t\tfunction renderLayer(id, renderTarget) {\n\t\t\tconst renderStates = scene.getRenderStates(camera);\n\t\t\tconst renderQueue = scene.getRenderQueue(camera);\n\n\t\t\tconst renderQueueLayer = renderQueue.layerList[id];\n\n\t\t\trenderer.beginRender(renderTarget);\n\t\t\trenderer.renderRenderableList(renderQueueLayer.opaque, renderStates);\n\t\t\trenderer.renderRenderableList(renderQueueLayer.transparent, renderStates);\n\t\t\trenderer.endRender();\n\t\t}\n\n\t\tconst screenPosition = new t3d.Vector3();\n\n\t\tfunction loop(count) {\n\t\t\trequestAnimationFrame(loop);\n\n\t\t\tcontroller.update();\n\n\t\t\tscene.updateMatrix();\n\t\t\tscene.updateRenderStates(camera);\n\t\t\tscene.updateRenderQueue(camera);\n\n\t\t\tscreenPosition.setFromMatrixPosition(occlusionTestMesh.worldMatrix).applyMatrix4(camera.viewMatrix).applyMatrix4(camera.projectionMatrix);\n\n\t\t\tlensflares.forEach(function(lensflare, index) {\n\t\t\t\tconst scale = lensflaresConfig[index].scale * params.scale;\n\t\t\t\tconst offset = lensflaresConfig[index].offset;\n\n\t\t\t\tconst vecX = -screenPosition.x * 2;\n\t\t\t\tconst vecY = -screenPosition.y * 2;\n\n\t\t\t\tconst lensflareMaterial = lensflare.material;\n\t\t\t\tlensflareMaterial.uniforms.screenPosition[0] = screenPosition.x + vecX * offset;\n\t\t\t\tlensflareMaterial.uniforms.screenPosition[1] = screenPosition.y + vecY * offset;\n\t\t\t\tlensflareMaterial.uniforms.scale[0] = scale * height / width;\n\t\t\t\tlensflareMaterial.uniforms.scale[1] = scale;\n\t\t\t});\n\n\t\t\tscreenPosition.toArray(occlusionTestMaterial.uniforms.screenPosition);\n\t\t\tocclusionTestMaterial.uniforms.scale[0] = params.occlusionScale * height / width;\n\t\t\tocclusionTestMaterial.uniforms.scale[1] = params.occlusionScale;\n\n\t\t\t// Render main scene, write depth buffer.\n\n\t\t\tsceneRenderTarget.clearColor = true;\n\t\t\trenderLayer(0, sceneRenderTarget);\n\n\t\t\t// Render lens flare occlusion mesh, test depth.\n\n\t\t\tocclusionRenderTarget.clearDepth = false;\n\t\t\trenderLayer(1, occlusionRenderTarget);\n\n\t\t\t// Render and Clip occlusion map.\n\n\t\t\trenderer.blitRenderTarget(occlusionRenderTarget, resultRenderTarget, true, true, true);\n\n\t\t\tclipPass.uniforms.tDiffuse = resultRenderTarget.texture;\n\t\t\tclipPass.uniforms.clipRect[0] = ((screenPosition.x - params.occlusionScale * height / width) * 0.5 + 0.5);\n\t\t\tclipPass.uniforms.clipRect[1] = ((screenPosition.y - params.occlusionScale) * 0.5 + 0.5);\n\t\t\tclipPass.uniforms.clipRect[2] = params.occlusionScale * height / width;\n\t\t\tclipPass.uniforms.clipRect[3] = params.occlusionScale;\n\t\t\tclipPass.render(renderer, clippedOcclusionRenderTarget);\n\n\t\t\tlensflares.forEach(function(lensflare) {\n\t\t\t\tconst lensflareMaterial = lensflare.material;\n\t\t\t\tlensflareMaterial.uniforms.occlusionMap = clippedOcclusionRenderTarget.texture;\n\t\t\t});\n\n\t\t\t// Render lens flares overlay resultRenderTarget\n\n\t\t\tsceneRenderTarget.clearColor = false;\n\t\t\trenderLayer(2, sceneRenderTarget);\n\n\t\t\t// Blit color buffer to resultRenderTarget\n\n\t\t\trenderer.blitRenderTarget(sceneRenderTarget, resultRenderTarget);\n\n\t\t\t// Copy resultRenderTarget to screen\n\n\t\t\tcopyPass.uniforms.tDiffuse = resultRenderTarget.texture;\n\t\t\tscreenRenderTarget.clearColor = true;\n\t\t\tcopyPass.render(renderer, screenRenderTarget);\n\n\t\t\tif (params.debug) {\n\t\t\t\t// Copy clipped occlusion map to left bottom corner (1/25) of the screen\n\t\t\t\tcopyPass.uniforms.tDiffuse = clippedOcclusionRenderTarget.texture;\n\t\t\t\tcopyPass.renderStates.camera.rect.set(0, 0, 0.2, 0.2);\n\t\t\t\tscreenRenderTarget.clearColor = false;\n\t\t\t\tcopyPass.render(renderer, screenRenderTarget);\n\t\t\t\tcopyPass.renderStates.camera.rect.set(0, 0, 1, 1);\n\t\t\t}\n\t\t}\n\t\t\n\t\trequestAnimationFrame(loop);\n\n\t\tfunction onWindowResize() {\n\t\t\twidth = window.innerWidth || 2;\n\t\t\theight = window.innerHeight || 2;\n\n\t\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 1000);\n\n\t\t\tscreenRenderTarget.resize(width, height);\n\t\t\tsceneRenderTarget.resize(width, height);\n\t\t\tocclusionRenderTarget.resize(width, height);\n\t\t\tresultRenderTarget.resize(width, height);\n\t\t}\n\t\twindow.addEventListener('resize', onWindowResize, false);\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "examples/custompass_motion_blur.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>t3d - custom pass motion blur</title>\n\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n\t<link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n</head>\n<body>\n    <div id=\"info\">\n        <a href=\"\" target=\"_blank\">t3d</a> - custom motion blur\n    </div>\n\n\t<!-- Import maps polyfill -->\n    <!-- Remove this when import maps will be widely supported -->\n    <script async src=\"./libs/es-module-shims.js\"></script>\n\n    <script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n    <script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { GUI } from './libs/lil-gui.esm.min.js';\n\t\timport { OrbitControls } from 't3d/addons/controls/OrbitControls.js';\n\t\timport { GridHelper } from 't3d/addons/objects/GridHelper.js';\n\t\timport { MotionBlurShader } from 't3d/addons/shaders/MotionBlurShader.js';\n\t\timport { SkyBox } from 't3d/addons/objects/SkyBox.js';\n\t\timport { Texture2DLoader } from 't3d/addons/loaders/Texture2DLoader.js';\n\t\timport { TextureCubeLoader } from 't3d/addons/loaders/TextureCubeLoader.js';\n\t\timport { Timer } from 't3d/addons/misc/Timer.js';\n\n\t\tlet width = window.innerWidth || 2;\n\t\tlet height = window.innerHeight || 2;\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = width;\n\t\tcanvas.height = height;\n\t\tdocument.body.appendChild(canvas);\n\n\t\tconst contextParams = { antialias: false, alpha: false };\n\t\tconst gl = canvas.getContext('webgl2', contextParams) || canvas.getContext('webgl', contextParams);\n\t\tconst renderer = new t3d.WebGLRenderer(gl);\n\n\t\tconst scene = new t3d.Scene();\n\t\t\n\t\tconst cubeTexturePath = './resources/skybox/Park2/';\n\t\tconst cubeTexture = new TextureCubeLoader().load([\n\t\t\tcubeTexturePath + 'posx.jpg',\n\t\t\tcubeTexturePath + 'negx.jpg',\n\t\t\tcubeTexturePath + 'posy.jpg',\n\t\t\tcubeTexturePath + 'negy.jpg',\n\t\t\tcubeTexturePath + 'posz.jpg',\n\t\t\tcubeTexturePath + 'negz.jpg'\n\t\t]);\n\t\tconst skyBox = new SkyBox(cubeTexture);\n\t\tscene.add(skyBox);\n\n\t\tconst grid = new GridHelper(50, 20, 0xffffff, 0xffffff);\n\t\tscene.add(grid);\n\n\t\tconst texture = new Texture2DLoader().load('./resources/hardwood2_diffuse.jpg');\n\t\ttexture.encoding = t3d.TEXEL_ENCODING_TYPE.SRGB;\n\t\ttexture.anisotropy = renderer.capabilities.maxAnisotropy;\n\n\t\tconst cube_geometry = new t3d.BoxGeometry(8, 8, 8);\n\t\tconst material = new t3d.BasicMaterial();\n\t\tmaterial.diffuseMap = texture;\n\t\tconst cube = new t3d.Mesh(cube_geometry, material);\n\t\tscene.add(cube);\n\n\t\tconst camera = new t3d.Camera();\n\t\tcamera.position.set(10, 10, 30);\n\t\tcamera.lookAt(new t3d.Vector3(0, 0, 0), new t3d.Vector3(0, 1, 0));\n\t\tcamera.setPerspective(60 / 180 * Math.PI, width / height, 1, 1000);\n\t\tscene.add(camera);\n\n\t\tconst controller = new OrbitControls(camera, canvas);\n\n\t\tconst screenRenderTarget = new t3d.ScreenRenderTarget(canvas);\n\n\t\tfunction createRenderTarget() {\n\t\t\tconst renderTarget = t3d.OffscreenRenderTarget.create2D(width, height);\n\t\t\trenderTarget.texture.minFilter = t3d.TEXTURE_FILTER.NEAREST;\n\t\t\trenderTarget.texture.magFilter = t3d.TEXTURE_FILTER.NEAREST;\n\t\t\trenderTarget.texture.encoding = t3d.TEXEL_ENCODING_TYPE.SRGB;\n\t\t\trenderTarget.texture.generateMipmaps = false;\n\n\t\t\tconst depthTexture = new t3d.Texture2D();\n\t\t\tdepthTexture.image = { data: null, width: 4, height: 4 };\n\t\t\tdepthTexture.type = t3d.PIXEL_TYPE.UNSIGNED_INT_24_8;\n\t\t\tdepthTexture.format = t3d.PIXEL_FORMAT.DEPTH_STENCIL;\n\t\t\tdepthTexture.magFilter = t3d.TEXTURE_FILTER.NEAREST;\n\t\t\tdepthTexture.minFilter = t3d.TEXTURE_FILTER.NEAREST;\n\t\t\tdepthTexture.generateMipmaps = false;\n\t\t\tdepthTexture.flipY = false;\n\n\t\t\trenderTarget.attach(\n\t\t\t\tdepthTexture,\n\t\t\t\tt3d.ATTACHMENT.DEPTH_STENCIL_ATTACHMENT\n\t\t\t);\n\t\t\trenderTarget.depthTexture = depthTexture;\n\n\t\t\treturn renderTarget;\n\t\t}\n\n\t\tconst tempRenderTarget1 = createRenderTarget();\n\n\t\tconst motionBlurPass = new t3d.ShaderPostPass(MotionBlurShader);\n\t\tmotionBlurPass.uniforms.tColor = tempRenderTarget1.texture;\n\t\tmotionBlurPass.uniforms.tDepth = tempRenderTarget1.depthTexture;\n\t\tmotionBlurPass.uniforms.velocityFactor = 0.7;\n\n\t\tconst viewProjectionMatrix = new t3d.Matrix4();\n\t\tconst viewProjectionMatrixInverse = new t3d.Matrix4();\n\t\tconst previousViewProjectionMatrix = new t3d.Matrix4();\n\t\tconst cameraMove = new t3d.Vector3();\n\t\tconst previousCameraPosition = new t3d.Vector3();\n\t\tcamera.updateMatrix();\n\t\tpreviousViewProjectionMatrix.copy(camera.viewMatrix).premultiply(camera.projectionMatrix);\n\t\tpreviousCameraPosition.copy(camera.position);\n\n\t\tconst params = { 'fps': 60 };\n\t\tconst gui = new GUI();\n\t\tgui.add({ version: 'WebGL ' + renderer.capabilities.version }, 'version').disable();\n\t\tgui.add(motionBlurPass.uniforms, 'velocityFactor', 0, 2, 0.01);\n\t\tgui.add(params, 'fps', 1, 60, 1);\n\n\t\tconst timer = new Timer();\n\t\tlet lastTime = 0;\n\n\t\tfunction loop(timestamp) {\n\t\t\trequestAnimationFrame(loop);\n\n\t\t\ttimer.update(timestamp);\n\n\t\t\tif ((timer.getElapsed() - lastTime) < (1 / params.fps)) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tlastTime = timer.getElapsed();\n\n\t\t\tcontroller.update();\n\n\t\t\tscene.updateMatrix();\n\t\t\tscene.updateRenderStates(camera);\n\t\t\tscene.updateRenderQueue(camera);\n\n\t\t\tviewProjectionMatrix.copy(camera.viewMatrix).premultiply(camera.projectionMatrix);\n\t\t\tviewProjectionMatrixInverse.copy(viewProjectionMatrix).invert();\n\t\t\tmotionBlurPass.uniforms.worldToClipMatrix.set(viewProjectionMatrix.elements);\n\t\t\tmotionBlurPass.uniforms.clipToWorldMatrix.set(viewProjectionMatrixInverse.elements);\n\t\t\tmotionBlurPass.uniforms.previousWorldToClipMatrix.set(previousViewProjectionMatrix.elements);\n\t\t\tcameraMove.copy(camera.position).sub(previousCameraPosition);\n\t\t\tcameraMove.toArray(motionBlurPass.uniforms.cameraMove);\n\t\t\tpreviousViewProjectionMatrix.copy(viewProjectionMatrix);\n\t\t\tpreviousCameraPosition.copy(camera.position);\n\n\t\t\ttempRenderTarget1.setColorClearValue(0, 0, 0, 1);\n\t\t\trenderer.renderScene(scene, camera, tempRenderTarget1);\n\n\t\t\tscreenRenderTarget.setColorClearValue(0, 0, 0, 1);\n\t\t\tmotionBlurPass.render(renderer, screenRenderTarget);\n\t\t}\n\t\trequestAnimationFrame(loop);\n\n\t\tfunction onWindowResize() {\n\t\t\twidth = window.innerWidth || 2;\n\t\t\theight = window.innerHeight || 2;\n\n\t\t\tcamera.setPerspective(60 / 180 * Math.PI, width / height, 1, 1000);\n\n\t\t\tscreenRenderTarget.resize(width, height);\n\n\t\t\ttempRenderTarget1.resize(width, height);\n\t\t}\n\t\twindow.addEventListener('resize', onWindowResize, false);\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "examples/custompass_motion_blur2.html",
    "content": "<!DOCTYPE html>\n<html>\n\t<head>\n\t\t<meta charset=\"utf-8\" />\n\t\t<title>t3d - custom pass motion blur</title>\n\t\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\"/>\n\t\t<link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\" />\n\t</head>\n\n\t<body>\n\t\t<div id=\"info\"><a href=\"\" target=\"_blank\">t3d</a> - custom motion blur</div>\n\n\t\t<!-- Import maps polyfill -->\n\t\t<!-- Remove this when import maps will be widely supported -->\n\t\t<script async src=\"./libs/es-module-shims.js\"></script>\n\n\t\t<script type=\"importmap\">\n\t\t\t{\n\t\t\t\t\"imports\": {\n\t\t\t\t\t\"t3d\": \"../build/t3d.module.js\",\n\t\t\t\t\t\"t3d/addons/\": \"./jsm/\"\n\t\t\t\t}\n\t\t\t}\n\t\t</script>\n\n\t\t<script type=\"module\">\n\t\t\timport * as t3d from 't3d';\n\t\t\timport { OrbitControls } from 't3d/addons/controls/OrbitControls.js';\n\t\t\timport { GBuffer } from 't3d/addons/GBuffer.js';\n\t\t\timport { GLTFLoader } from 't3d/addons/loaders/glTF/GLTFLoader.js';\n\t\t\timport { MotionBlur2Shader } from 't3d/addons/shaders/MotionBlur2Shader.js';\n\t\t\timport { SkyBox } from 't3d/addons/objects/SkyBox.js';\n\t\t\timport { GridHelper } from 't3d/addons/objects/GridHelper.js';\n\t\t\timport { TextureCubeLoader } from 't3d/addons/loaders/TextureCubeLoader.js';\n\t\t\timport { Texture2DLoader } from 't3d/addons/loaders/Texture2DLoader.js';\n\t\t\timport { Clock } from 't3d/addons/Clock.js';\n\t\t\timport { GUI } from './libs/lil-gui.esm.min.js';\n\n\t\t\tlet width = window.innerWidth || 2;\n\t\t\tlet height = window.innerHeight || 2;\n\n\t\t\tconst canvas = document.createElement('canvas');\n\t\t\tcanvas.width = width;\n\t\t\tcanvas.height = height;\n\t\t\tdocument.body.appendChild(canvas);\n\n\t\t\tconst contextParams = { antialias: false, alpha: false };\n\t\t\tconst gl = canvas.getContext('webgl2', contextParams) || canvas.getContext('webgl', contextParams);\n\t\t\tconst renderer = new t3d.WebGLRenderer(gl);\n\n\t\t\tconst scene = new t3d.Scene();\n\n\t\t\tconst cubeTexturePath = './resources/skybox/Park2/';\n\t\t\tconst cubeTexture = new TextureCubeLoader().load([\n\t\t\t\tcubeTexturePath + 'posx.jpg',\n\t\t\t\tcubeTexturePath + 'negx.jpg',\n\t\t\t\tcubeTexturePath + 'posy.jpg',\n\t\t\t\tcubeTexturePath + 'negy.jpg',\n\t\t\t\tcubeTexturePath + 'posz.jpg',\n\t\t\t\tcubeTexturePath + 'negz.jpg'\n\t\t\t]);\n\t\t\tconst skyBox = new SkyBox(cubeTexture);\n\t\t\tscene.add(skyBox);\n\n\t\t\tconst camera = new t3d.Camera();\n\t\t\tcamera.outputEncoding = t3d.TEXEL_ENCODING_TYPE.SRGB;\n\t\t\tcamera.position.set(10, 10, 30);\n\t\t\tcamera.lookAt(new t3d.Vector3(0, 0, 0), new t3d.Vector3(0, 1, 0));\n\t\t\tcamera.setPerspective((60 / 180) * Math.PI, width / height, 1, 1000);\n\t\t\tscene.add(camera);\n\n\t\t\tconst ambientLight = new t3d.AmbientLight(0xffffff, 0.5);\n\t\t\tscene.add(ambientLight);\n\n\t\t\tconst directionalLight = new t3d.DirectionalLight(0xffffff, 1);\n\t\t\tdirectionalLight.position.set(-30, 30, 30);\n\t\t\tdirectionalLight.lookAt(new t3d.Vector3(), new t3d.Vector3(0, 1, 0));\n\t\t\tscene.add(directionalLight);\n\n\t\t\tconst texture = new Texture2DLoader().load('./resources/hardwood2_diffuse.jpg');\n\t\t\ttexture.encoding = t3d.TEXEL_ENCODING_TYPE.SRGB;\n\t\t\ttexture.anisotropy = renderer.capabilities.maxAnisotropy;\n\n\t\t\tconst sphere = new t3d.Mesh(new t3d.SphereGeometry(2, 20, 10), new t3d.PBRMaterial());\n\t\t\tsphere.material.diffuseMap = texture;\n\t\t\tsphere.material.roughness = 0.8;\n\t\t\tsphere.position.set(0, 2, 10);\n\t\t\tscene.add(sphere);\n\n\t\t\tconst grid = new GridHelper(50, 20, 0xffffff, 0xffffff);\n\t\t\tscene.add(grid);\n\n\t\t\tlet animation, object;\n\n\t\t\tconst loader = new GLTFLoader();\n\t\t\tloader.load(\n\t\t\t\t'./resources/models/gltf/UinoMan/glTF/UinoMan.gltf'\n\t\t\t).then(function(result) {\n\t\t\t\tobject = result.root.children[0];\n\n\t\t\t\tanimation = new t3d.AnimationMixer();\n\t\t\t\tresult.animations.forEach(function(clip) {\n\t\t\t\t\tconst action = new t3d.AnimationAction(result.animations[2]);\n\t\t\t\t\taction.weight = 1;\n\t\t\t\t\tanimation.addAction(action);\n\t\t\t\t});\n\n\t\t\t\tobject.scale.set(8, 8, 8);\n\n\t\t\t\tscene.add(object);\n\t\t\t});\n\n\t\t\tconst controller = new OrbitControls(camera, canvas);\n\t\t\tcontroller.target.set(0, 1, 0);\n\n\t\t\tconst screenRenderTarget = new t3d.ScreenRenderTarget(canvas);\n\n\t\t\tconst gBuffer = new GBuffer(width, height);\n\t\t\tgBuffer.enableNormalGlossiness = false;\n\t\t\tgBuffer.enableAlbedoMetalness = false;\n\t\t\tgBuffer.enableMotion = true;\n\n\t\t\tconst tempRenderTarget = t3d.OffscreenRenderTarget.create2D(width, height);\n\t\t\ttempRenderTarget.texture.minFilter = t3d.TEXTURE_FILTER.LINEAR;\n\t\t\ttempRenderTarget.texture.magFilter = t3d.TEXTURE_FILTER.LINEAR;\n\t\t\ttempRenderTarget.texture.generateMipmaps = false;\n\n\t\t\tconst motionBlurPass = new t3d.ShaderPostPass(MotionBlur2Shader);\n\t\t\tmotionBlurPass.uniforms.tColor = tempRenderTarget.texture;\n\t\t\tmotionBlurPass.uniforms.tMotion = gBuffer.getMotionTexture();\n\t\t\tmotionBlurPass.uniforms.velocityFactor = 1;\n\n\t\t\tconst params = { motionDebug: false };\n\t\t\tconst gui = new GUI();\n\t\t\tgui.add({ version: 'WebGL ' + renderer.capabilities.version }, 'version');\n\t\t\tgui.add(motionBlurPass.uniforms, 'velocityFactor', 0, 2, 0.01);\n\t\t\tgui.add(params, 'motionDebug');\n\n\t\t\tconst clock = new Clock();\n\n\t\t\tfunction loop(count) {\n\t\t\t\trequestAnimationFrame(loop);\n\n\t\t\t\tanimation && animation.update(clock.getDelta() * 1);\n\n\t\t\t\tsphere.position.x = 20 * Math.sin(count / 300);\n\n\t\t\t\tcontroller.update();\n\t\t\t\n\t\t\t\tscene.updateMatrix();\n\t\t\t\tscene.updateRenderStates(camera);\n\t\t\t\tscene.updateRenderQueue(camera);\n\n\t\t\t\tgBuffer.update(renderer, scene, camera);\n\n\t\t\t\trenderer.renderScene(scene, camera, tempRenderTarget);\n\n\t\t\t\tif (params.motionDebug) {\n\t\t\t\t\tgBuffer.renderDebug(renderer, camera, 'velocity', screenRenderTarget);\n\t\t\t\t} else {\n\t\t\t\t\tmotionBlurPass.render(renderer, screenRenderTarget);\n\t\t\t\t}\n\t\t\t}\n\t\t\trequestAnimationFrame(loop);\n\n\t\t\tfunction onWindowResize() {\n\t\t\t\twidth = window.innerWidth || 2;\n\t\t\t\theight = window.innerHeight || 2;\n\n\t\t\t\tcamera.setPerspective((60 / 180) * Math.PI, width / height, 1, 1000);\n\n\t\t\t\tscreenRenderTarget.resize(width, height);\n\t\t\t\ttempRenderTarget.resize(width, height);\n\t\t\t\tgBuffer.resize(width, height);\n\t\t\t}\n\t\t\twindow.addEventListener('resize', onWindowResize, false);\n\t\t</script>\n\t</body>\n</html>\n"
  },
  {
    "path": "examples/custompass_msaa.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>t3d - custom pass msaa</title>\n\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n\t<link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n</head>\n<body>\n    <div id=\"info\">\n\t\t<a href=\"\" target=\"_blank\">t3d</a> - MSAA by Multisampled Renderbuffers\n\t\t<br/> Available only for WebGL 2.0\n\t\t<div id=\"notSupported\" style=\"display:none\">Sorry, your graphics card + browser does not support Multisampled Renderbuffers</div>\n    </div>\n\n\t<!-- Import maps polyfill -->\n    <!-- Remove this when import maps will be widely supported -->\n    <script async src=\"./libs/es-module-shims.js\"></script>\n\n    <script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n    <script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { OrbitControls } from 't3d/addons/controls/OrbitControls.js';\n\t\timport { CopyShader } from 't3d/addons/shaders/CopyShader.js';\n\t\timport { GridHelper } from 't3d/addons/objects/GridHelper.js';\n\t\timport { Texture2DLoader } from 't3d/addons/loaders/Texture2DLoader.js';\n\t\timport { GUI } from './libs/lil-gui.esm.min.js';\n\n\t\tlet width = window.innerWidth || 2;\n\t\tlet height = window.innerHeight || 2;\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = width;\n\t\tcanvas.height = height;\n\t\tdocument.body.appendChild(canvas);\n\n\t\tconst contextParams = { antialias: false, alpha: false };\n\t\tconst gl = canvas.getContext('webgl2', contextParams) || canvas.getContext('webgl', contextParams);\n\t\tconst renderer = new t3d.WebGLRenderer(gl);\n\n\t\tconst scene = new t3d.Scene();\n\n\t\tconst grid = new GridHelper(50, 20, 0xffffff, 0xffffff);\n\t\tscene.add(grid);\n\n\t\tconst texture = new Texture2DLoader().load('./resources/hardwood2_diffuse.jpg');\n\t\ttexture.encoding = t3d.TEXEL_ENCODING_TYPE.SRGB;\n\t\ttexture.anisotropy = renderer.capabilities.maxAnisotropy;\n\n\t\tconst cube_geometry = new t3d.BoxGeometry(8, 8, 8);\n\t\tconst material = new t3d.BasicMaterial();\n\t\tmaterial.diffuseMap = texture;\n\t\tconst cube = new t3d.Mesh(cube_geometry, material);\n\t\tscene.add(cube);\n\n\t\tconst camera = new t3d.Camera();\n\t\tcamera.outputEncoding = t3d.TEXEL_ENCODING_TYPE.SRGB;\n\t\tcamera.position.set(10, 10, 30);\n\t\tcamera.lookAt(new t3d.Vector3(0, 0, 0), new t3d.Vector3(0, 1, 0));\n\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 1000);\n\t\tscene.add(camera);\n\n\t\tconst controller = new OrbitControls(camera, canvas);\n\t\t\n\t\tconst copyPass = new t3d.ShaderPostPass(CopyShader);\n\n\t\tconst screenRenderTarget = new t3d.ScreenRenderTarget(canvas);\n\n\t\tconst tempRenderTarget = t3d.OffscreenRenderTarget.create2D(width, height);\n\t\ttempRenderTarget.texture.minFilter = t3d.TEXTURE_FILTER.LINEAR;\n\t\ttempRenderTarget.texture.magFilter = t3d.TEXTURE_FILTER.LINEAR;\n\t\ttempRenderTarget.detach(t3d.ATTACHMENT.DEPTH_STENCIL_ATTACHMENT);\n\t\ttempRenderTarget.attach(\n\t\t\tnew t3d.RenderBuffer(width, height, t3d.PIXEL_FORMAT.DEPTH_COMPONENT16),\n\t\t\tt3d.ATTACHMENT.DEPTH_ATTACHMENT\n\t\t);\n\n\t\tconst renderTargets = {};\n\t\tfunction getMultipleSamplingRenderTarget(value) {\n\t\t\tif (!renderTargets[value]) {\n\t\t\t\tconst renderTarget = t3d.OffscreenRenderTarget.create2D(width, height);\n\t\t\t\trenderTarget.attach(\n\t\t\t\t\tnew t3d.RenderBuffer(width, height, t3d.PIXEL_FORMAT.RGBA8, value),\n\t\t\t\t\tt3d.ATTACHMENT.COLOR_ATTACHMENT0\n\t\t\t\t);\n\t\t\t\trenderTarget.detach(t3d.ATTACHMENT.DEPTH_STENCIL_ATTACHMENT);\n\t\t\t\trenderTarget.attach(\n\t\t\t\t\tnew t3d.RenderBuffer(width, height, t3d.PIXEL_FORMAT.DEPTH_COMPONENT16, value),\n\t\t\t\t\tt3d.ATTACHMENT.DEPTH_ATTACHMENT\n\t\t\t\t);\n\t\t\n\t\t\t\trenderTargets[value] = renderTarget;\n\t\t\t}\n\n\t\t\treturn renderTargets[value];\n\t\t}\n\n\t\tconst params = { 'msaa': true, 'samplers': Math.min(5, renderer.capabilities.maxSamples) };\n\t\tconst gui = new GUI();\n\t\tgui.add({ version: 'WebGL ' + renderer.capabilities.version }, 'version').disable();\n\t\tgui.add(renderer.capabilities, 'maxSamples').disable();\n\t\tgui.add(params, 'msaa');\n\t\tgui.add(params, 'samplers', 1, renderer.capabilities.maxSamples, 1);\n\n\t\tfunction loop(count) {\n\t\t\trequestAnimationFrame(loop);\n\n\t\t\tcontroller.update();\n\n\t\t\tscene.updateMatrix();\n\t\t\tscene.updateRenderStates(camera);\n\t\t\tscene.updateRenderQueue(camera);\n\n\t\t\tif (params.msaa) {\n\t\t\t\trenderer.renderScene(scene, camera, getMultipleSamplingRenderTarget(params.samplers));\n\n\t\t\t\tif (renderer.capabilities.version < 2) {\n\t\t\t\t\tdocument.getElementById('notSupported').style.display = '';\n\t\t\t\t} else {\n\t\t\t\t\trenderer.blitRenderTarget(\n\t\t\t\t\t\tgetMultipleSamplingRenderTarget(params.samplers), tempRenderTarget,\n\t\t\t\t\t\ttrue, true, false\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tcopyPass.uniforms.tDiffuse = tempRenderTarget.texture;\n\t\t\t\tcopyPass.render(renderer, screenRenderTarget);\n\t\t\t} else {\n\t\t\t\trenderer.renderScene(scene, camera, screenRenderTarget);\n\t\t\t}\n\t\t}\n\t\trequestAnimationFrame(loop);\n\n\t\tfunction onWindowResize() {\n\t\t\twidth = window.innerWidth || 2;\n\t\t\theight = window.innerHeight || 2;\n\n\t\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 1000);\n\n\t\t\tscreenRenderTarget.resize(width, height);\n\t\t\ttempRenderTarget.resize(width, height);\n\n\t\t\tfor (const key in renderTargets) {\n\t\t\t\tconst renderTarget = renderTargets[key];\n\t\t\t\trenderTarget && renderTarget.resize(width, height);\n\t\t\t}\n\t\t}\n\t\twindow.addEventListener('resize', onWindowResize, false);\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "examples/custompass_oit.html",
    "content": "<!DOCTYPE html>\n<html>\n\n<head>\n    <meta charset=\"utf-8\" />\n    <title>t3d - custom pass oit</title>\n    <meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\" />\n    <link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\" />\n</head>\n\n<body>\n    <div id=\"info\">\n        <a href=\"\" target=\"_blank\">t3d</a> - order-independent transparency<br/>\n        <div id=\"notSupported\" style=\"display:none\">Sorry, your graphics card + browser does not support webgl2</div>\n    </div>\n\n    <!-- Import maps polyfill -->\n    <!-- Remove this when import maps will be widely supported -->\n    <script async src=\"./libs/es-module-shims.js\"></script>\n\n    <script type=\"importmap\">\n\t\t\t{\n\t\t\t\t\"imports\": {\n\t\t\t\t\t\"t3d\": \"../build/t3d.module.js\",\n\t\t\t\t\t\"t3d/addons/\": \"./jsm/\"\n\t\t\t\t}\n\t\t\t}\n\t\t</script>\n\n    <script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { OrbitControls } from 't3d/addons/controls/OrbitControls.js';\n\t\timport { DepthPeelingOITPass, DepthPeelingOITMaterial } from 't3d/addons/pass/DepthPeelingOITPass.js';\n\t\timport { WeightedBlendedOITPass, WeightedBlendedOITMaterial } from 't3d/addons/pass/WeightedBlendedOITPass.js';\n\t\timport { GUI } from './libs/lil-gui.esm.min.js';\n\n\t\tlet width = window.innerWidth || 2;\n\t\tlet height = window.innerHeight || 2;\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = width;\n\t\tcanvas.height = height;\n\t\tdocument.body.appendChild(canvas);\n\n\t\tconst screenRenderTarget = new t3d.ScreenRenderTarget(canvas);\n\n\t\tconst contextParams = { antialias: false, alpha: false };\n\t\tconst gl = canvas.getContext('webgl2', contextParams);\n\n\t\tif (!gl) {\n\t\t\tdocument.getElementById('notSupported').style.display = '';\n\t\t\tthrow new Error('Not supported webgl2 !');\n\t\t}\n\n\t\tconst renderer = new t3d.WebGLRenderer(gl);\n\n\t\tconst depthPeelingOITPass = new DepthPeelingOITPass(width, height);\n\t\tdepthPeelingOITPass.setOutputEncoding(t3d.TEXEL_ENCODING_TYPE.SRGB);\n\t\tconst weightedBlendedOITPass = new WeightedBlendedOITPass(width, height);\n\t\tweightedBlendedOITPass.setOutputEncoding(t3d.TEXEL_ENCODING_TYPE.SRGB);\n\n\t\tconst scene = new t3d.Scene();\n\n\t\tconst camera = new t3d.Camera();\n\t\tcamera.outputEncoding = t3d.TEXEL_ENCODING_TYPE.SRGB;\n\t\tcamera.position.set(-200, 80, 200);\n\t\tcamera.setPerspective(30 / 180 * Math.PI, width / height, 1, 1000);\n\t\tscene.add(camera);\n\n\t\tconst controller = new OrbitControls(camera, canvas);\n\n\t\tconst ambientLight = new t3d.AmbientLight(0xffffff, 1.0);\n\t\tscene.add(ambientLight);\n\n\t\t// create planes\n\n\t\tconst groups = [\n\t\t\tnew t3d.Object3D(),\n\t\t\tnew t3d.Object3D(),\n\t\t\tnew t3d.Object3D()\n\t\t];\n\n\t\tconst planeGeometry = new t3d.PlaneGeometry(100, 100);\n\n\t\tconst materialTypes = [\n\t\t\tt3d.PBRMaterial,\n\t\t\tDepthPeelingOITMaterial,\n\t\t\tWeightedBlendedOITMaterial\n\t\t];\n\n\t\tconst colors = [\n\t\t\tnew t3d.Color3(1, 0, 0),\n\t\t\tnew t3d.Color3(0, 1, 0),\n\t\t\tnew t3d.Color3(0, 0, 1),\n\t\t\tnew t3d.Color3(1, 1, 0),\n\t\t\tnew t3d.Color3(0, 1, 1)\n\t\t];\n\t\t\n\t\tfor (let i = 0; i < 5; i++) {\n\t\t\tfor (let j = 0; j < 3; j++) {\n\t\t\t\tconst material = new materialTypes[j]();\n\t\t\t\tmaterial.diffuse.copy(colors[i]);\n\t\t\t\tmaterial.transparent = true;\n\t\t\t\tmaterial.opacity = 0.6;\n\t\t\t\tmaterial.side = t3d.DRAW_SIDE.DOUBLE;\n\n\t\t\t\tconst plane = new t3d.Mesh(planeGeometry, material);\n\t\t\t\tplane.euler.x = (i * Math.PI) / 5;\n\n\t\t\t\tgroups[j].add(plane);\n\t\t\t}\n\t\t}\n\n\t\tscene.add(groups[1]);\n\n\t\t// gui\n\n\t\tconst options = {\n\t\t\t'Normal Blend': 0,\n\t\t\t'Dual Depth Peeling': 1,\n\t\t\t'Weighted Blended': 2\n\t\t};\n\t\tconst params = { type: 1, opacity: 0.6 };\n\t\tconst gui = new GUI();\n\t\tgui.add(params, 'type', options).onChange(value => {\n\t\t\tgroups.forEach(group => scene.remove(group));\n\t\t\tscene.add(groups[value]);\n\t\t});\n\t\tgui.add(params, 'opacity', 0, 1, 0.01).onChange(value => {\n\t\t\tgroups.forEach(group => {\n\t\t\t\tgroup.traverse(node => {\n\t\t\t\t\tif (!node.isMesh) return;\n\t\t\t\t\tnode.material.opacity = value;\n\t\t\t\t});\n\t\t\t});\n\t\t});\n\n\t\tfunction loop(count) {\n\t\t\trequestAnimationFrame(loop);\n\n\t\t\tcontroller.update();\n\n\t\t\tscene.updateMatrix();\n\t\t\tscene.updateRenderStates(camera);\n\t\t\tscene.updateRenderQueue(camera);\n\t\t\n\t\t\tif (params.type == 0) {\n\t\t\t\tscreenRenderTarget.setClear(true, true, true);\n\t\t\t\trenderer.renderScene(scene, camera, screenRenderTarget);\n\t\t\t} else if (params.type == 1) {\n\t\t\t\tdepthPeelingOITPass.renderBuffer(renderer, scene, camera);\n\t\t\t\tscreenRenderTarget.setClear(true, false, false);\n\t\t\t\tdepthPeelingOITPass.render(renderer, screenRenderTarget);\n\t\t\t} else {\n\t\t\t\tweightedBlendedOITPass.renderBuffer(renderer, scene, camera);\n\t\t\t\tscreenRenderTarget.setClear(true, false, false);\n\t\t\t\tweightedBlendedOITPass.render(renderer, screenRenderTarget);\n\t\t\t}\n\t\t}\n\t\trequestAnimationFrame(loop);\n\n\t\tfunction onWindowResize() {\n\t\t\twidth = window.innerWidth || 2;\n\t\t\theight = window.innerHeight || 2;\n\n\t\t\tscreenRenderTarget.resize(width, height);\n\t\t\tdepthPeelingOITPass.resize(width, height);\n\t\t\tweightedBlendedOITPass.resize(width, height);\n\n\t\t\tcamera.setPerspective(30 / 180 * Math.PI, width / height, 1, 1000);\n\t\t}\n\t\twindow.addEventListener('resize', onWindowResize, false);\n    </script>\n</body>\n\n</html>"
  },
  {
    "path": "examples/custompass_rendertarget_2d.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n    <meta charset=\"utf-8\">\n    <title>t3d - rendertarget 2d</title>\n    <meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n    <link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n</head>\n<body>\n    <div id=\"info\">\n        <a href=\"\" target=\"_blank\">t3d</a> - rendertarget 2d<br/>\n\t\tRender to each mipmap level of a 2D texture with different color,<br/>\n\t\tthen display it on a quad to verify the results.\n    </div>\n\t\n    <!-- Import maps polyfill -->\n    <!-- Remove this when import maps will be widely supported -->\n    <script async src=\"./libs/es-module-shims.js\"></script>\n\n    <script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n    <script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { OrbitControls } from 't3d/addons/controls/OrbitControls.js';\n\n\t\tlet width = window.innerWidth || 2;\n\t\tlet height = window.innerHeight || 2;\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = width;\n\t\tcanvas.height = height;\n\t\tdocument.body.appendChild(canvas);\n\n\t\tconst gl = canvas.getContext('webgl2', { antialias: true });\n\n\t\tconst renderer = new t3d.WebGLRenderer(gl);\n\n\t\tconst screenRenderTarget = new t3d.ScreenRenderTarget(canvas);\n\t\tscreenRenderTarget.setColorClearValue(0.1, 0.1, 0.1, 1);\n\n\t\tconst scene = new t3d.Scene();\n\n\t\tconst camera = new t3d.Camera();\n\t\tcamera.position.set(0, -3, 5);\n\t\tcamera.lookAt(new t3d.Vector3(0, 0, 0), new t3d.Vector3(0, 1, 0));\n\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 0.1, 1000);\n\t\tscene.add(camera);\n\n\t\tconst controller = new OrbitControls(camera, canvas);\n\t\tcontroller.enablePan = false;\n\n\t\tfunction renderTexture2D(size = 512) {\n\t\t\tconst maxMipLevels = Math.floor(Math.log2(size)) + 1;\n\n\t\t\tconst renderTarget2D = t3d.OffscreenRenderTarget.create2D(size, size);\n\t\t\trenderTarget2D.detach(t3d.ATTACHMENT.DEPTH_STENCIL_ATTACHMENT);\n\t\t\trenderTarget2D.texture.generateMipmaps = false;\n\n\t\t\tfor (let i = 0; i < maxMipLevels; i++) {\n\t\t\t\tconst mipmapSize = Math.max(1, size >> i);\n\t\t\t\trenderTarget2D.texture.mipmaps.push({\n\t\t\t\t\twidth: mipmapSize,\n\t\t\t\t\theight: mipmapSize,\n\t\t\t\t\tdata: null\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tconst dymmyScene = new t3d.Scene();\n\t\t\tconst dymmyCamera = new t3d.Camera();\n\t\t\tdymmyCamera.setOrtho(-1, 1, -1, 1, 0.1, 10);\n\t\t\tdymmyCamera.position.set(0, 0, 1);\n\t\t\tdymmyScene.add(dymmyCamera);\n\n\t\t\tconst dymmyGeometry = new t3d.SphereGeometry(0.9, 32, 32);\n\t\t\tconst dymmyMaterial = new t3d.BasicMaterial();\n\t\t\tconst dymmyMesh = new t3d.Mesh(dymmyGeometry, dymmyMaterial);\n\t\t\tdymmyScene.add(dymmyMesh);\n\n\t\t\tfor (let i = 0; i < maxMipLevels; i++) {\n\t\t\t\tconst colorIntensity = i / (maxMipLevels - 1);\n\t\t\n\t\t\t\tdymmyMaterial.diffuse.setHSL(colorIntensity, 0.6, 0.5);\n\t\t\n\t\t\t\tdymmyScene.updateMatrix();\n\t\t\t\tdymmyScene.updateRenderStates(dymmyCamera);\n\t\t\t\tdymmyScene.updateRenderQueue(dymmyCamera);\n\n\t\t\t\trenderTarget2D.activeMipmapLevel = i;\n\t\t\t\trenderTarget2D.setColorClearValue(0.3, 0.3, 0.3, 1);\n\t\t\t\trenderer.renderScene(dymmyScene, dymmyCamera, renderTarget2D);\n\n\t\t\t\tdymmyCamera.rect.z /= 2;\n\t\t\t\tdymmyCamera.rect.w /= 2;\n\t\t\t}\n\n\t\t\treturn renderTarget2D.texture;\n\t\t}\n\n\t\tconst material = new t3d.BasicMaterial();\n\t\tmaterial.diffuseMap = renderTexture2D();\n\t\tmaterial.transparent = false;\n\t\tconst geometry = new t3d.PlaneGeometry(2, 2);\n\t\tconst quad = new t3d.Mesh(geometry, material);\n\t\tquad.euler.x = Math.PI / 2;\n\t\tscene.add(quad);\n\n\t\tfunction loop(count) {\n\t\t\trequestAnimationFrame(loop);\n\n\t\t\tcontroller.update();\n\n\t\t\tscene.updateMatrix();\n\t\t\tscene.updateRenderStates(camera);\n\t\t\tscene.updateRenderQueue(camera);\n\n\t\t\trenderer.renderScene(scene, camera, screenRenderTarget);\n\t\t}\n\t\trequestAnimationFrame(loop);\n\n\t\tfunction onWindowResize() {\n\t\t\twidth = window.innerWidth || 2;\n\t\t\theight = window.innerHeight || 2;\n\n\t\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 0.1, 1000);\n\n\t\t\tscreenRenderTarget.resize(width, height);\n\t\t}\n\t\twindow.addEventListener('resize', onWindowResize, false);\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "examples/custompass_rendertarget_3d.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n    <meta charset=\"utf-8\">\n    <title>t3d - rendertarget 3d</title>\n    <meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n    <link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n</head>\n<body>\n    <div id=\"info\">\n        <a href=\"\" target=\"_blank\">t3d</a> - rendertarget 3d\n    </div>\n\t\n    <!-- Import maps polyfill -->\n    <!-- Remove this when import maps will be widely supported -->\n    <script async src=\"./libs/es-module-shims.js\"></script>\n\n    <script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n    <script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { VolumeShader } from 't3d/addons/shaders/VolumeShader.js';\n\t\timport { OrbitControls } from 't3d/addons/controls/OrbitControls.js';\n\t\timport { Texture2DLoader } from 't3d/addons/loaders/Texture2DLoader.js';\n\n\t\tlet width = window.innerWidth || 2;\n\t\tlet height = window.innerHeight || 2;\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = width;\n\t\tcanvas.height = height;\n\t\tdocument.body.appendChild(canvas);\n\n\t\tconst gl = canvas.getContext('webgl2', { antialias: true });\n\n\t\tconst renderer = new t3d.WebGLRenderer(gl);\n\n\t\tconst screenRenderTarget = new t3d.ScreenRenderTarget(canvas);\n\t\tscreenRenderTarget.setColorClearValue(0.1, 0.1, 0.1, 1);\n\n\t\tconst scene = new t3d.Scene();\n\n\t\tconst camera = new t3d.Camera();\n\t\tcamera.position.set(2, 2, 2);\n\t\tcamera.lookAt(new t3d.Vector3(0, 0, 0), new t3d.Vector3(0, 1, 0));\n\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 0.1, 100);\n\t\tscene.add(camera);\n\n\t\tconst controller = new OrbitControls(camera, canvas);\n\n\t\tfunction renderTexture3D(size = 64) {\n\t\t\tconst renderTarget3D = t3d.OffscreenRenderTarget.create3D(size, size, size);\n\t\t\trenderTarget3D.texture.magFilter = t3d.TEXTURE_FILTER.LINEAR;\n\t\t\trenderTarget3D.texture.minFilter = t3d.TEXTURE_FILTER.LINEAR;\n\n\t\t\tconst dymmyScene = new t3d.Scene();\n\t\t\tconst dymmyCamera = new t3d.Camera();\n\t\t\tdymmyScene.add(dymmyCamera);\n\n\t\t\tconst dymmyGeometry = new t3d.SphereGeometry(0.9, 32, 32);\n\t\t\tconst dymmyMaterial = new t3d.BasicMaterial();\n\t\t\tdymmyMaterial.diffuse.setHex(0x000000);\n\t\t\tconst dymmyMesh = new t3d.Mesh(dymmyGeometry, dymmyMaterial);\n\t\t\tdymmyScene.add(dymmyMesh);\n\n\t\t\tfor (let i = 0; i < size; i++) {\n\t\t\t\tdymmyMesh.scale.set(i / size, i / size, i / size);\n\t\t\t\tdymmyScene.updateMatrix();\n\t\t\t\tdymmyScene.updateRenderStates(dymmyCamera);\n\t\t\t\tdymmyScene.updateRenderQueue(dymmyCamera);\n\n\t\t\t\trenderTarget3D.activeLayer = i;\n\t\t\t\trenderTarget3D.setColorClearValue(1 - i / size, 0, 0, 1);\n\t\t\t\trenderTarget3D.setClear(true, false, false);\n\t\t\t\trenderer.renderScene(dymmyScene, dymmyCamera, renderTarget3D);\n\t\t\t}\n\n\t\t\treturn renderTarget3D.texture;\n\t\t}\n\n\t\tconst shaderMaterial = new t3d.ShaderMaterial(VolumeShader);\n\t\tshaderMaterial.transparent = true;\n\t\tshaderMaterial.premultipliedAlpha = true;\n\t\tshaderMaterial.uniforms.densityTexture = renderTexture3D();\n\t\tshaderMaterial.uniforms.platteTexture = new Texture2DLoader().load('./resources/platte.png');\n\t\tnew t3d.Matrix4().toArray(shaderMaterial.uniforms.uInvTransform);\n\t\tshaderMaterial.uniforms.uAlphaCorrection = 0.1;\n\t\tconst geometry = new t3d.BoxGeometry(1, 1, 1);\n\t\tconst box = new t3d.Mesh(geometry, shaderMaterial);\n\t\tscene.add(box);\n\n\t\tfunction loop(count) {\n\t\t\trequestAnimationFrame(loop);\n\n\t\t\tcontroller.update();\n\n\t\t\tscene.updateMatrix();\n\t\t\tscene.updateRenderStates(camera);\n\t\t\tscene.updateRenderQueue(camera);\n\n\t\t\trenderer.renderScene(scene, camera, screenRenderTarget);\n\t\t}\n\t\trequestAnimationFrame(loop);\n\n\t\tfunction onWindowResize() {\n\t\t\twidth = window.innerWidth || 2;\n\t\t\theight = window.innerHeight || 2;\n\n\t\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 0.1, 100);\n\n\t\t\tscreenRenderTarget.resize(width, height);\n\t\t}\n\t\twindow.addEventListener('resize', onWindowResize, false);\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "examples/custompass_shadow_planar.html",
    "content": "<!DOCTYPE html>\n<html>\n\n<head>\n    <meta charset=\"utf-8\">\n    <title>t3d - planar shadow</title>\n    <meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n    <link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n</head>\n\n<body>\n    <div id=\"info\">\n        <a href=\"\" target=\"_blank\">t3d</a> - planar shadow\n    </div>\n\n    <!-- Import maps polyfill -->\n    <!-- Remove this when import maps will be widely supported -->\n    <script async src=\"./libs/es-module-shims.js\"></script>\n\n    <script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n    <script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { OrbitControls } from 't3d/addons/controls/OrbitControls.js';\n\t\timport { PlanarShadowShader } from 't3d/addons/shaders/PlanarShadowShader.js';\n\t\timport { GUI } from './libs/lil-gui.esm.min.js';\n\n\t\tlet width = window.innerWidth || 2;\n\t\tlet height = window.innerHeight || 2;\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = width;\n\t\tcanvas.height = height;\n\t\tdocument.body.appendChild(canvas);\n\n\t\tconst screenRenderTarget = new t3d.ScreenRenderTarget(canvas);\n\t\tscreenRenderTarget.setColorClearValue(0.6, 0.6, 0.6, 1);\n\n\t\tconst contextParams = { antialias: true, alpha: false };\n\t\tconst gl = canvas.getContext('webgl2', contextParams) || canvas.getContext('webgl', contextParams);\n\t\tconst renderer = new t3d.WebGLRenderer(gl);\n\n\t\tconst scene = new t3d.Scene();\n\t\tscene.fog = new t3d.Fog(0x999999, 50, 1000);\n\n\t\tconst pbrMaterial = new t3d.PBRMaterial();\n\t\tpbrMaterial.diffuse.setHex(0xBBBBBB);\n\t\tpbrMaterial.metalness = 0;\n\t\tpbrMaterial.roughness = 1;\n\t\tpbrMaterial.side = t3d.DRAW_SIDE.DOUBLE;\n\n\t\tconst sphere = new t3d.Mesh(new t3d.SphereGeometry(10, 32, 16), pbrMaterial);\n\t\tsphere.position.set(30, 10, 15);\n\t\tsphere.planarShadow = true;\n\t\tscene.add(sphere);\n\n\t\tconst cylinder = new t3d.Mesh(new t3d.CylinderGeometry(0, 10, 20, 100, 50), pbrMaterial);\n\t\tcylinder.position.set(-30, 10, 15);\n\t\tcylinder.planarShadow = true;\n\t\tscene.add(cylinder);\n\n\t\tconst cylinder2 = new t3d.Mesh(new t3d.CylinderGeometry(6, 6, 40, 32, 32), pbrMaterial);\n\t\tcylinder2.position.set(0, 6, -40);\n\t\tcylinder2.planarShadow = true;\n\t\tcylinder2.euler.z = Math.PI / 2;\n\t\tscene.add(cylinder2);\n\n\t\tconst plane_geometry = new t3d.PlaneGeometry(2000, 2000, 1, 1);\n\t\tconst plane_material = new t3d.LambertMaterial();\n\t\tplane_material.diffuse.setHex(0x999999);\n\t\tconst plane = new t3d.Mesh(plane_geometry, plane_material);\n\t\tplane.position.y = -0.2;\n\t\tscene.add(plane);\n\n\t\tconst ambientLight = new t3d.AmbientLight(0xffffff, 0.4);\n\t\tscene.add(ambientLight);\n\n\t\tconst directionalLight = new t3d.DirectionalLight(0xffffff, 0.9);\n\t\tscene.add(directionalLight);\n\n\t\tconst camera = new t3d.Camera();\n\t\tcamera.position.set(-166.1, 70.7, 98.45);\n\t\tcamera.lookAt(new t3d.Vector3(0.85, -0.14, -0.49), new t3d.Vector3(0, 1, 0));\n\t\tcamera.setPerspective(30 / 180 * Math.PI, width / height, 1, 1000);\n\t\tscene.add(camera);\n\n\t\tconst controller = new OrbitControls(camera, canvas);\n\t\tcontroller.target.set(0.85, -0.14, -0.49);\n\t\tcontroller.maxDistance = 500;\n\n\t\tconst planarShadowMaterial = new t3d.ShaderMaterial(PlanarShadowShader);\n\t\tplanarShadowMaterial.uniforms.height = 0.05;\n\t\tplanarShadowMaterial.transparent = true;\n\t\tplanarShadowMaterial.polygonOffset = true;\n\t\tplanarShadowMaterial.polygonOffsetFactor = -1;\n\t\tplanarShadowMaterial.polygonOffsetUnits = -1;\n\n\t\tconst helpVector = new t3d.Vector3();\n\n\t\tconst shadowRenderOptions = {\n\t\t\tgetMaterial: () => {\n\t\t\t\tdirectionalLight.getWorldDirection(helpVector).toArray(planarShadowMaterial.uniforms.lightDir);\n\t\t\t\treturn planarShadowMaterial;\n\t\t\t},\n\t\t\tifRender: ({ object }) => {\n\t\t\t\treturn object.planarShadow;\n\t\t\t}\n\t\t};\n\n\t\tfunction setLightPosition(angle) {\n\t\t\tdirectionalLight.position.x = -Math.sin(angle / 180 * Math.PI) * 100;\n\t\t\tdirectionalLight.position.y = 100;\n\t\t\tdirectionalLight.position.z = -Math.cos(angle / 180 * Math.PI) * 100;\n\t\t\tdirectionalLight.lookAt(new t3d.Vector3(0, 25, 0), new t3d.Vector3(0, 1, 0));\n\t\t}\n\n\t\tsetLightPosition(90);\n\n\t\tconst gui = new GUI();\n\t\tconst lightFolder = gui.addFolder('Light');\n\t\tlightFolder.add(directionalLight, 'intensity', 0, 2, 0.01);\n\t\tlightFolder.addColor(directionalLight, 'color');\n\t\tlightFolder.add({ angle: 90 }, 'angle', 0, 360, 0.01).onChange(setLightPosition);\n\t\tlightFolder.close();\n\t\tconst shadowFolder = gui.addFolder('Shadow');\n\t\tshadowFolder.add(planarShadowMaterial.uniforms, 'height', -0.1, 0.5, 0.001);\n\t\tshadowFolder.add(planarShadowMaterial.uniforms, 'shadowFalloff', 0, 1, 0.0001);\n\t\tshadowFolder.addColor(planarShadowMaterial.uniforms, 'shadowColor');\n\n\t\tfunction loop(count) {\n\t\t\trequestAnimationFrame(loop);\n\n\t\t\tcontroller.update();\n\n\t\t\tscene.updateMatrix();\n\t\t\tconst renderStates = scene.updateRenderStates(camera);\n\t\t\tconst renderQueue = scene.updateRenderQueue(camera);\n\n\t\t\tscreenRenderTarget.setClear(true, true, true);\n\t\t\trenderer.renderScene(scene, camera, screenRenderTarget);\n\n\t\t\t// Render planar shadows\n\n\t\t\tscreenRenderTarget.setClear(false, false, false);\n\t\t\trenderer.beginRender(screenRenderTarget);\n\t\t\tfor (let i = 0; i < renderQueue.layerList.length; i++) {\n\t\t\t\tconst renderQueueLayer = renderQueue.layerList[i];\n\t\t\t\trenderer.renderRenderableList(renderQueueLayer.opaque, renderStates, shadowRenderOptions);\n\t\t\t\trenderer.renderRenderableList(renderQueueLayer.transparent, renderStates, shadowRenderOptions);\n\t\t\t}\n\t\t\trenderer.endRender();\n\t\t}\n\t\trequestAnimationFrame(loop);\n\n\t\tfunction onWindowResize() {\n\t\t\twidth = window.innerWidth || 2;\n\t\t\theight = window.innerHeight || 2;\n\n\t\t\tcamera.setPerspective(30 / 180 * Math.PI, width / height, 1, 1000);\n\n\t\t\tscreenRenderTarget.resize(width, height);\n\t\t}\n\t\twindow.addEventListener('resize', onWindowResize, false);\n    </script>\n</body>\n\n</html>"
  },
  {
    "path": "examples/custompass_sketch.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>t3d - custom pass sketch</title>\n\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n\t<link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n</head>\n<body>\n    <div id=\"info\" class=\"dark\">\n        <a href=\"\" target=\"_blank\">t3d</a> - custom pass sketch\n    </div>\n\n    <!-- Import maps polyfill -->\n    <!-- Remove this when import maps will be widely supported -->\n    <script async src=\"./libs/es-module-shims.js\"></script>\n\n    <script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n    <script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { OrbitControls } from 't3d/addons/controls/OrbitControls.js';\n\t\timport { SketchShader } from 't3d/addons/shaders/SketchShader.js';\n\t\timport { CopyShader } from 't3d/addons/shaders/CopyShader.js';\n\t\timport { GBuffer } from 't3d/addons/GBuffer.js';\n\t\timport { GUI } from './libs/lil-gui.esm.min.js';\n\n\t\tlet width = window.innerWidth || 2;\n\t\tlet height = window.innerHeight || 2;\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = width;\n\t\tcanvas.height = height;\n\t\tdocument.body.appendChild(canvas);\n\n\t\tconst scene = new t3d.Scene();\n\n\t\tfor (let i = 0; i < 100; i++) {\n\t\t\tconst cube_geometry = new t3d.BoxGeometry(20, 20, 20);\n\t\t\tconst phong = new t3d.PhongMaterial();\n\t\t\tphong.shading = t3d.SHADING_TYPE.FLAT;\n\t\t\tphong.diffuse.setHSL(Math.random(), 1.0, 0.3);\n\t\t\tconst cube = new t3d.Mesh(cube_geometry, phong);\n\t\t\tcube.position.x = Math.random() * 100 - 50;\n\t\t\tcube.position.y = Math.random() * 100 - 50;\n\t\t\tcube.position.z = Math.random() * 100 - 50;\n\t\t\tcube.euler.x = Math.random() * Math.PI * 2;\n\t\t\tcube.euler.y = Math.random() * Math.PI * 2;\n\t\t\tcube.euler.z = Math.random() * Math.PI * 2;\n\t\t\tscene.add(cube);\n\t\t}\n\n\t\tconst ambientLight = new t3d.AmbientLight(0xffffff, 1.2);\n\t\tscene.add(ambientLight);\n\n\t\tconst directionalLight = new t3d.DirectionalLight(0xffffff, 0.5);\n\t\tdirectionalLight.position.set(-40, 40, 0);\n\t\tdirectionalLight.lookAt(new t3d.Vector3(), new t3d.Vector3(0, 1, 0));\n\t\tscene.add(directionalLight);\n\n\t\tconst camera = new t3d.Camera();\n\t\tcamera.position.set(0, 0, 200);\n\t\tcamera.lookAt(new t3d.Vector3(0, 0, 0), new t3d.Vector3(0, 1, 0));\n\t\tcamera.setPerspective(60 / 180 * Math.PI, width / height, 0.1, 1000);\n\t\tscene.add(camera);\n\t\t\n\t\t// TODO set camera near by distance\n\n\t\tconst controller = new OrbitControls(camera, canvas);\n\n\t\t// custom pass\n\t\tconst screenRenderTarget = new t3d.ScreenRenderTarget(canvas);\n\t\tscreenRenderTarget.setColorClearValue(1, 1, 1, 1);\n\n\t\tconst contextParams = { antialias: true, alpha: false };\n\t\t// todo webgl 1.0 has bug on android here?\n\t\tconst gl = canvas.getContext('webgl2', contextParams) || canvas.getContext('webgl', contextParams);\n\t\tconst renderer = new t3d.WebGLRenderer(gl);\n\n\t\tconst gBuffer = new GBuffer(width, height);\n\t\tgBuffer.enableAlbedoMetalness = false;\n\n\t\tconst sketchPass = new t3d.ShaderPostPass(SketchShader);\n\n\t\tconst tempRenderTarget2 = t3d.OffscreenRenderTarget.create2D(width, height);\n\t\ttempRenderTarget2.texture.minFilter = t3d.TEXTURE_FILTER.NEAREST;\n\t\ttempRenderTarget2.texture.magFilter = t3d.TEXTURE_FILTER.NEAREST;\n\t\ttempRenderTarget2.texture.generateMipmaps = false;\n\n\t\tconst matProjViewInverse = new t3d.Matrix4();\n\n\t\tsketchPass.uniforms['matProjViewInverse'] = matProjViewInverse.elements;\n\n\t\tsketchPass.uniforms['normalTexture'] = gBuffer.getNormalGlossinessTexture();\n\t\tsketchPass.uniforms['depthTexture'] = gBuffer.getDepthTexture();\n\n\t\tconst copyPass = new t3d.ShaderPostPass(CopyShader);\n\t\tcopyPass.material.transparent = true;\n\t\tcopyPass.material.depthWrite = false;\n\t\tcopyPass.material.depthTest = false;\n\n\t\tlet beauty = true;\n\t\tlet sketch = true;\n\n\t\t// gui\n\t\tconst params = { type: 'BEAUTY + SKETCH' };\n\t\tconst gui = new GUI();\n\t\tgui.add(params, 'type', ['BEAUTY + SKETCH', 'BEAUTY', 'SKETCH']).onChange(val => {\n\t\t\tswitch (val) {\n\t\t\t\tcase 'BEAUTY + SKETCH':\n\t\t\t\t\tbeauty = true;\n\t\t\t\t\tsketch = true;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'BEAUTY':\n\t\t\t\t\tbeauty = true;\n\t\t\t\t\tsketch = false;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'SKETCH':\n\t\t\t\t\tbeauty = false;\n\t\t\t\t\tsketch = true;\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t});\n\t\tgui.add(sketchPass.uniforms, 'uThreshold', 0, 1, 0.01);\n\t\tgui.add(sketchPass.uniforms, 'uContrast', 0, 1, 0.01);\n\t\tgui.addColor(sketchPass.uniforms, 'uColor');\n\n\t\tfunction loop(count) {\n\t\t\trequestAnimationFrame(loop);\n\n\t\t\tcontroller.update();\n\n\t\t\tscene.updateMatrix();\n\t\t\tscene.updateRenderStates(camera);\n\t\t\tscene.updateRenderQueue(camera);\n\n\t\t\tgBuffer.update(renderer, scene, camera);\n\n\t\t\tmatProjViewInverse.multiplyMatrices(camera.projectionMatrix, camera.viewMatrix).invert();\n\n\t\t\tsketchPass.render(renderer, tempRenderTarget2);\n\n\t\t\tif (beauty) {\n\t\t\t\tscreenRenderTarget.clearColor = true;\n\t\t\t\trenderer.renderScene(scene, camera, screenRenderTarget);\n\t\t\t}\n\n\t\t\tif (sketch) {\n\t\t\t\tcopyPass.uniforms['tDiffuse'] = tempRenderTarget2.texture;\n\t\t\t\tscreenRenderTarget.setClear(!beauty, true, true);\n\t\t\t\tcopyPass.render(renderer, screenRenderTarget);\n\t\t\t}\n\t\t}\n\t\trequestAnimationFrame(loop);\n\n\t\tfunction onWindowResize() {\n\t\t\twidth = window.innerWidth || 2;\n\t\t\theight = window.innerHeight || 2;\n\n\t\t\tcamera.setPerspective(60 / 180 * Math.PI, width / height, 0.1, 1000);\n\n\t\t\tscreenRenderTarget.resize(width, height);\n\t\t\tgBuffer.resize(width, height);\n\n\t\t\ttempRenderTarget2.resize(width, height);\n\t\t}\n\t\twindow.addEventListener('resize', onWindowResize, false);\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "examples/custompass_ssao.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>t3d - custom pass ssao</title>\n\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n\t<link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n</head>\n<body>\n    <div id=\"info\">\n        <a href=\"\" target=\"_blank\">t3d</a> - custom pass ssao\n    </div>\n\n\t<!-- Import maps polyfill -->\n    <!-- Remove this when import maps will be widely supported -->\n    <script async src=\"./libs/es-module-shims.js\"></script>\n\n    <script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n    <script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { OrbitControls } from 't3d/addons/controls/OrbitControls.js';\n\t\timport { GBuffer } from 't3d/addons/GBuffer.js';\n\t\timport { SSAOPass } from 't3d/addons/pass/SSAOPass.js';\n\t\timport { BlurShader } from 't3d/addons/shaders/BlurShader.js';\n\t\timport { GUI } from './libs/lil-gui.esm.min.js';\n\n\t\tlet width = window.innerWidth || 2;\n\t\tlet height = window.innerHeight || 2;\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = width;\n\t\tcanvas.height = height;\n\t\tdocument.body.appendChild(canvas);\n\n\t\tconst scene = new t3d.Scene();\n\n\t\tfor (let i = 0; i < 100; i++) {\n\t\t\tconst cube_geometry = new t3d.BoxGeometry(20, 20, 20);\n\t\t\tconst phong = new t3d.PhongMaterial();\n\t\t\tphong.diffuse.setHSL(Math.random(), 1.0, 0.3);\n\t\t\tconst cube = new t3d.Mesh(cube_geometry, phong);\n\t\t\tcube.position.x = Math.random() * 100 - 50;\n\t\t\tcube.position.y = Math.random() * 100 - 50;\n\t\t\tcube.position.z = Math.random() * 100 - 50;\n\t\t\tcube.euler.x = Math.random() * Math.PI * 2;\n\t\t\tcube.euler.y = Math.random() * Math.PI * 2;\n\t\t\tcube.euler.z = Math.random() * Math.PI * 2;\n\t\t\tscene.add(cube);\n\t\t}\n\n\t\tconst ambientLight = new t3d.AmbientLight(0xffffff, 1.2);\n\t\tscene.add(ambientLight);\n\n\t\tconst directionalLight = new t3d.DirectionalLight(0xffffff, 0.5);\n\t\tdirectionalLight.position.set(-40, 40, 0);\n\t\tdirectionalLight.lookAt(new t3d.Vector3(), new t3d.Vector3(0, 1, 0));\n\t\tscene.add(directionalLight);\n\n\t\tconst camera = new t3d.Camera();\n\t\tcamera.position.set(0, 0, 200);\n\t\tcamera.lookAt(new t3d.Vector3(0, 0, 0), new t3d.Vector3(0, 1, 0));\n\t\tcamera.setPerspective(60 / 180 * Math.PI, width / height, 1, 1000);\n\t\tscene.add(camera);\n\t\t\n\t\t// TODO set camera near by distance\n\n\t\tconst controller = new OrbitControls(camera, canvas);\n\n\t\t// custom pass\n\t\tconst screenRenderTarget = new t3d.ScreenRenderTarget(canvas);\n\n\t\tconst contextParams = { antialias: true, alpha: false };\n\t\t// todo webgl 1.0 has bug on android here?\n\t\tconst gl = canvas.getContext('webgl2', contextParams) || canvas.getContext('webgl', contextParams);\n\t\tconst renderer = new t3d.WebGLRenderer(gl);\n\n\t\tconst gBuffer = new GBuffer(width, height);\n\t\tgBuffer.enableAlbedoMetalness = false;\n\n\t\tconst ssaoPass = new SSAOPass();\n\t\tssaoPass.setNoiseSize(256);\n\t\tssaoPass.setKernelSize(32);\n\t\t// ssaoPass.material.defines[\"ALCHEMY\"] = 1;\n\t\tconst radius = 10;\n\t\tssaoPass.uniforms['intensity'] = 1;\n\t\tssaoPass.uniforms['power'] = 1;\n\t\tssaoPass.uniforms['bias'] = radius / 50;\n\t\tssaoPass.uniforms['radius'] = radius;\n\n\t\tconst tempRenderTarget2 = t3d.OffscreenRenderTarget.create2D(width, height);\n\t\ttempRenderTarget2.texture.minFilter = t3d.TEXTURE_FILTER.NEAREST;\n\t\ttempRenderTarget2.texture.magFilter = t3d.TEXTURE_FILTER.NEAREST;\n\t\ttempRenderTarget2.texture.generateMipmaps = false;\n\n\t\tconst tempRenderTarget3 = t3d.OffscreenRenderTarget.create2D(width, height);\n\t\ttempRenderTarget3.texture.minFilter = t3d.TEXTURE_FILTER.NEAREST;\n\t\ttempRenderTarget3.texture.magFilter = t3d.TEXTURE_FILTER.NEAREST;\n\t\ttempRenderTarget3.texture.generateMipmaps = false;\n\n\t\tconst projection = new t3d.Matrix4();\n\t\tconst projectionInv = new t3d.Matrix4();\n\t\tconst viewInverseTranspose = new t3d.Matrix4();\n\n\t\tssaoPass.uniforms['projection'] = projection.elements;\n\t\tssaoPass.uniforms['projectionInv'] = projectionInv.elements;\n\t\tssaoPass.uniforms['viewInverseTranspose'] = viewInverseTranspose.elements;\n\n\t\tssaoPass.uniforms['normalTex'] = gBuffer.getNormalGlossinessTexture();\n\t\tssaoPass.uniforms['depthTex'] = gBuffer.getDepthTexture();\n\t\tssaoPass.uniforms['texSize'][0] = width;\n\t\tssaoPass.uniforms['texSize'][1] = height;\n\n\t\tconst blurPass = new t3d.ShaderPostPass(BlurShader);\n\t\tblurPass.material.blending = t3d.BLEND_TYPE.NONE;\n\t\tblurPass.material.blendSrc = t3d.BLEND_FACTOR.ZERO;\n\t\tblurPass.material.blendDst = t3d.BLEND_FACTOR.SRC_COLOR;\n\t\tblurPass.material.depthWrite = false;\n\t\tblurPass.material.depthTest = false;\n\t\tblurPass.uniforms['projection'] = projection.elements;\n\t\tblurPass.uniforms['viewInverseTranspose'] = viewInverseTranspose.elements;\n\n\t\tblurPass.uniforms['normalTex'] = gBuffer.getNormalGlossinessTexture();\n\t\tblurPass.uniforms['depthTex'] = gBuffer.getDepthTexture();\n\t\tblurPass.uniforms['textureSize'][0] = width;\n\t\tblurPass.uniforms['textureSize'][1] = height;\n\n\t\tblurPass.uniforms['blurSize'] = 2;\n\t\tblurPass.uniforms['depthRange'] = 1;\n\n\t\tblurPass.material.defines['NORMALTEX_ENABLED'] = 1;\n\t\tblurPass.material.defines['DEPTHTEX_ENABLED'] = 1;\n\t\tssaoPass.material.defines['DEPTH_PACKING'] = 0;\n\t\tblurPass.material.defines['DEPTH_PACKING'] = 0;\n\n\t\tlet beauty = true;\n\t\tlet ssao = true;\n\n\t\tconst params = { type: 'BEAUTY + SSAO', kernelSize: 32 };\n\t\tconst gui = new GUI();\n\t\tgui.add(params, 'type', ['BEAUTY + SSAO', 'BEAUTY', 'SSAO']).onChange(val => {\n\t\t\tswitch (val) {\n\t\t\t\tcase 'BEAUTY + SSAO':\n\t\t\t\t\tbeauty = true;\n\t\t\t\t\tssao = true;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'BEAUTY':\n\t\t\t\t\tbeauty = true;\n\t\t\t\t\tssao = false;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'SSAO':\n\t\t\t\t\tbeauty = false;\n\t\t\t\t\tssao = true;\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t});\n\t\tgui.add(params, 'kernelSize', [16, 32, 64, 128, 256]).onChange(val => {\n\t\t\tssaoPass.setKernelSize(val);\n\t\t});\n\t\tgui.add(ssaoPass.uniforms, 'intensity', 0, 2, 0.1);\n\t\tgui.add(ssaoPass.uniforms, 'power', 0, 5, 1);\n\t\tgui.add(ssaoPass.uniforms, 'radius', 0, 20, 0.01);\n\t\tgui.add(ssaoPass.uniforms, 'bias', 0, 5, 0.01);\n\n\t\tgui.add(blurPass.uniforms, 'blurSize', 0, 2, 0.01);\n\t\tgui.add(blurPass.uniforms, 'depthRange', 0, 3, 0.01);\n\n\t\tfunction loop(count) {\n\t\t\trequestAnimationFrame(loop);\n\n\t\t\tcontroller.update();\n\n\t\t\tscene.updateMatrix();\n\t\t\tscene.updateRenderStates(camera);\n\t\t\tscene.updateRenderQueue(camera);\n\n\t\t\tgBuffer.update(renderer, scene, camera);\n\n\t\t\tprojection.copy(camera.projectionMatrix);\n\t\t\tprojectionInv.copy(camera.projectionMatrix).invert();\n\t\t\tviewInverseTranspose.copy(camera.worldMatrix).transpose();\n\n\t\t\ttempRenderTarget2.setColorClearValue(1, 1, 1, 1);\n\t\t\tssaoPass.render(renderer, tempRenderTarget2);\n\n\t\t\tblurPass.uniforms['tDiffuse'] = tempRenderTarget2.texture;\n\t\t\tblurPass.uniforms['direction'] = 0;\n\t\t\tblurPass.render(renderer, tempRenderTarget3);\n\n\t\t\tscreenRenderTarget.setColorClearValue(0.5, 0.5, 0.5, 1);\n\n\t\t\tif (beauty) {\n\t\t\t\tscreenRenderTarget.setClear(true, true, true);\n\t\t\t\trenderer.renderScene(scene, camera, screenRenderTarget);\n\t\t\t\tblurPass.material.blending = t3d.BLEND_TYPE.CUSTOM;\n\t\t\t}\n\n\t\t\tif (ssao) {\n\t\t\t\tblurPass.uniforms['tDiffuse'] = tempRenderTarget3.texture;\n\t\t\t\tblurPass.uniforms['direction'] = 1;\n\t\t\t\tscreenRenderTarget.setClear(!beauty, false, false);\n\t\t\t\tblurPass.render(renderer, screenRenderTarget);\n\t\t\t}\n\n\t\t\tif (beauty) {\n\t\t\t\tblurPass.material.blending = t3d.BLEND_TYPE.NONE;\n\t\t\t}\n\t\t}\n\t\trequestAnimationFrame(loop);\n\n\t\tfunction onWindowResize() {\n\t\t\twidth = window.innerWidth || 2;\n\t\t\theight = window.innerHeight || 2;\n\n\t\t\tcamera.setPerspective(60 / 180 * Math.PI, width / height, 1, 1000);\n\n\t\t\tscreenRenderTarget.resize(width, height);\n\t\t\tgBuffer.resize(width, height);\n\n\t\t\ttempRenderTarget2.resize(width, height);\n\t\t\ttempRenderTarget3.resize(width, height);\n\n\t\t\tssaoPass.uniforms['texSize'][0] = width;\n\t\t\tssaoPass.uniforms['texSize'][1] = height;\n\n\t\t\tblurPass.uniforms['textureSize'][0] = width;\n\t\t\tblurPass.uniforms['textureSize'][1] = height;\n\t\t}\n\t\twindow.addEventListener('resize', onWindowResize, false);\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "examples/custompass_ssr.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>t3d - custom pass ssr</title>\n\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n\t<link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n</head>\n<body>\n    <div id=\"info\">\n        <a href=\"\" target=\"_blank\">t3d</a> - custom pass ssr\n    </div>\n\n\t<script src=\"./libs/nanobar.js\"></script>\n\n\t<!-- Import maps polyfill -->\n    <!-- Remove this when import maps will be widely supported -->\n    <script async src=\"./libs/es-module-shims.js\"></script>\n\n    <script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n    <script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { GUI } from './libs/lil-gui.esm.min.js';\n\t\timport { GLTFLoader } from 't3d/addons/loaders/glTF/GLTFLoader.js';\n\t\timport { OrbitControls } from 't3d/addons/controls/OrbitControls.js';\n\t\timport { GBuffer } from 't3d/addons/GBuffer.js';\n\t\timport { SSRShader } from 't3d/addons/shaders/SSRShader.js';\n\t\timport { BlurShader } from 't3d/addons/shaders/BlurShader.js';\n\t\timport { BlendShader } from 't3d/addons/shaders/BlendShader.js';\n\t\timport { Clock } from 't3d/addons/Clock.js';\n\n\t\tlet width = window.innerWidth || 2;\n\t\tlet height = window.innerHeight || 2;\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = width;\n\t\tcanvas.height = height;\n\t\tdocument.body.appendChild(canvas);\n\n\t\tconst scene = new t3d.Scene();\n\n\t\tconst objects = [];\n\n\t\tconst nanobar = new Nanobar();\n\t\tnanobar.el.style.background = 'gray';\n\n\t\tconst loadingManager = new t3d.LoadingManager(function() {\n\t\t\tnanobar.go(100);\n\t\t\tnanobar.el.style.background = 'transparent';\n\t\t}, function(url, itemsLoaded, itemsTotal) {\n\t\t\tif (itemsLoaded < itemsTotal) {\n\t\t\t\tnanobar.go(itemsLoaded / itemsTotal * 100);\n\t\t\t}\n\t\t});\n\n\t\tconst loader = new GLTFLoader(loadingManager);\n\t\tloader.load('resources/models/gltf/suzanne/suzanne.gltf').then(function(result) {\n\t\t\tconst object = result.root.children[0];\n\t\t\n\t\t\tfor (let i = 0; i < 11; i++) {\n\t\t\t\tfor (let j = 0; j < 11; j++) {\n\t\t\t\t\tconst monkey = object.clone();\n\t\t\t\t\tmonkey.position.set((i - 5) * 4, 1, (j - 5) * 4);\n\t\t\t\t\tmonkey.material = monkey.material.clone();\n\t\t\t\t\tmonkey.material.diffuse.setHSL(Math.random(), 1.0, 0.3);\n\t\t\t\t\tmonkey.castShadow = true;\n\t\t\t\t\tmonkey.receiveShadow = true;\n\t\t\t\t\tscene.add(monkey);\n\t\t\t\t\tobjects.push(monkey);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\tconst plane_geometry = new t3d.PlaneGeometry(50, 50);\n\t\tconst material = new t3d.PBRMaterial();\n\t\tmaterial.diffuse.setHex(0xffffff);\n\t\tmaterial.roughness = 0.1;\n\t\tmaterial.metalness = 0.9;\n\t\tmaterial.dithering = true;\n\t\tconst plane = new t3d.Mesh(plane_geometry, material);\n\t\tplane.position.y = 0;\n\t\tscene.add(plane);\n\t\t\n\t\tconst ambientLight = new t3d.AmbientLight(0xffffff, 0.7);\n\t\tscene.add(ambientLight);\n\n\t\tconst directionalLight = new t3d.DirectionalLight(0xffffff, 0.7);\n\t\tdirectionalLight.position.set(-40, 40, 0);\n\t\tdirectionalLight.lookAt(new t3d.Vector3(), new t3d.Vector3(0, 1, 0));\n\t\tdirectionalLight.shadow.windowSize = 50;\n\t\tdirectionalLight.shadow.cameraNear = 40;\n\t\tdirectionalLight.shadow.cameraFar = 100;\n\t\tscene.add(directionalLight);\n\n\t\tplane.receiveShadow = true;\n\t\tdirectionalLight.castShadow = true;\n\t\tdirectionalLight.shadow.mapSize.set(1024, 1024);\n\n\t\tconst camera = new t3d.Camera();\n\t\tcamera.position.set(-8, 7, 20);\n\t\tcamera.lookAt(new t3d.Vector3(0, 0, 0), new t3d.Vector3(0, 1, 0));\n\t\tcamera.setPerspective(50 / 180 * Math.PI, width / height, 1, 500);\n\t\tscene.add(camera);\n\t\t\n\t\t// TODO set camera near by distance\n\n\t\tconst controller = new OrbitControls(camera, canvas);\n\n\t\t// custom pass\n\t\tconst screenRenderTarget = new t3d.ScreenRenderTarget(canvas);\n\n\t\tconst contextParams = { antialias: true, alpha: false };\n\t\t// todo webgl 1.0 has bug on android here?\n\t\tconst gl = canvas.getContext('webgl2', contextParams) || canvas.getContext('webgl', contextParams);\n\t\tconst renderer = new t3d.WebGLRenderer(gl);\n\n\t\tconst gBuffer = new GBuffer(width, height);\n\t\tgBuffer.enableAlbedoMetalness = false;\n\n\t\tconst shadowMapPass = new t3d.ShadowMapPass();\n\n\t\tconst ssrPass = new t3d.ShaderPostPass(SSRShader);\n\n\t\tconst tempRenderTarget = t3d.OffscreenRenderTarget.create2D(width, height);\n\t\ttempRenderTarget.texture.minFilter = t3d.TEXTURE_FILTER.LINEAR;\n\t\ttempRenderTarget.texture.magFilter = t3d.TEXTURE_FILTER.LINEAR;\n\t\ttempRenderTarget.texture.generateMipmaps = false;\n\n\t\tconst tempRenderTarget2 = t3d.OffscreenRenderTarget.create2D(width, height);\n\t\ttempRenderTarget2.texture.minFilter = t3d.TEXTURE_FILTER.LINEAR;\n\t\ttempRenderTarget2.texture.magFilter = t3d.TEXTURE_FILTER.LINEAR;\n\t\ttempRenderTarget2.texture.generateMipmaps = false;\n\n\t\tconst tempRenderTarget3 = t3d.OffscreenRenderTarget.create2D(width, height);\n\t\ttempRenderTarget3.texture.minFilter = t3d.TEXTURE_FILTER.LINEAR;\n\t\ttempRenderTarget3.texture.magFilter = t3d.TEXTURE_FILTER.LINEAR;\n\t\ttempRenderTarget3.texture.generateMipmaps = false;\n\n\t\tconst projection = new t3d.Matrix4();\n\t\tconst projectionInv = new t3d.Matrix4();\n\t\tconst viewInverseTranspose = new t3d.Matrix4();\n\n\t\tssrPass.uniforms['projection'] = projection.elements;\n\t\tssrPass.uniforms['projectionInv'] = projectionInv.elements;\n\t\tssrPass.uniforms['viewInverseTranspose'] = viewInverseTranspose.elements;\n\n\t\tssrPass.uniforms['colorTex'] = tempRenderTarget.texture;\n\t\tssrPass.uniforms['gBufferTexture1'] = gBuffer.getNormalGlossinessTexture();\n\t\tssrPass.uniforms['gBufferTexture2'] = gBuffer.getDepthTexture();\n\t\tssrPass.uniforms['viewportSize'][0] = width;\n\t\tssrPass.uniforms['viewportSize'][1] = height;\n\t\tssrPass.uniforms['nearZ'] = 1;\n\n\t\tconst blurPass = new t3d.ShaderPostPass(BlurShader);\n\t\tblurPass.uniforms['projection'] = projection.elements;\n\t\tblurPass.uniforms['viewInverseTranspose'] = viewInverseTranspose.elements;\n\n\t\tblurPass.uniforms['normalTex'] = gBuffer.getNormalGlossinessTexture();\n\t\tblurPass.uniforms['depthTex'] = gBuffer.getDepthTexture();\n\t\tblurPass.uniforms['textureSize'][0] = width;\n\t\tblurPass.uniforms['textureSize'][1] = height;\n\n\t\tblurPass.uniforms['blurSize'] = 2;\n\t\tblurPass.uniforms['depthRange'] = 1;\n\n\t\tblurPass.material.defines['NORMALTEX_ENABLED'] = 1;\n\t\tblurPass.material.defines['DEPTHTEX_ENABLED'] = 1;\n\t\tblurPass.material.defines['DEPTH_PACKING'] = 0;\n\n\t\tconst blendPass = new t3d.ShaderPostPass(BlendShader);\n\t\tblendPass.uniforms['tDiffuse1'] = tempRenderTarget.texture;\n\t\tblendPass.uniforms['tDiffuse2'] = tempRenderTarget3.texture;\n\n\t\tconst gui = new GUI();\n\t\tgui.add(material, 'roughness', 0, 1, 0.01);\n\t\tgui.add(material, 'metalness', 0, 1, 0.01);\n\n\t\tconst clock = new Clock();\n\n\t\tfunction loop(count) {\n\t\t\trequestAnimationFrame(loop);\n\n\t\t\tconst elpasedTime = clock.getElapsedTime();\n\t\t\tobjects.forEach(function(object, idx) {\n\t\t\t\tobject.position.y = 1 + 0.5 * (Math.sin(elpasedTime * 3 + idx) + 1);\n\t\t\t});\n\n\t\t\tcontroller.update();\n\n\t\t\tscene.updateMatrix();\n\t\t\tscene.updateRenderStates(camera);\n\t\t\tscene.updateRenderQueue(camera);\n\n\t\t\tshadowMapPass.render(renderer, scene);\n\n\t\t\tgBuffer.update(renderer, scene, camera);\n\n\t\t\trenderer.renderScene(scene, camera, tempRenderTarget);\n\n\t\t\tprojection.copy(camera.projectionMatrix);\n\t\t\tprojectionInv.copy(camera.projectionMatrix).invert();\n\t\t\tviewInverseTranspose.copy(camera.worldMatrix).transpose();\n\n\t\t\tssrPass.render(renderer, tempRenderTarget2);\n\n\t\t\tblurPass.uniforms['tDiffuse'] = tempRenderTarget2.texture;\n\t\t\tblurPass.uniforms['direction'] = 0;\n\t\t\tblurPass.render(renderer, tempRenderTarget3);\n\n\t\t\tblurPass.uniforms['tDiffuse'] = tempRenderTarget3.texture;\n\t\t\tblurPass.uniforms['direction'] = 1;\n\t\t\tblurPass.render(renderer, tempRenderTarget2);\n\n\t\t\tblendPass.render(renderer, screenRenderTarget);\n\t\t}\n\t\trequestAnimationFrame(loop);\n\n\t\tfunction onWindowResize() {\n\t\t\twidth = window.innerWidth || 2;\n\t\t\theight = window.innerHeight || 2;\n\n\t\t\tcamera.setPerspective(50 / 180 * Math.PI, width / height, 1, 500);\n\n\t\t\tscreenRenderTarget.resize(width, height);\n\t\t\tgBuffer.resize(width, height);\n\n\t\t\ttempRenderTarget2.resize(width, height);\n\t\t\ttempRenderTarget3.resize(width, height);\n\n\t\t\tssrPass.uniforms['viewportSize'][0] = width;\n\t\t\tssrPass.uniforms['viewportSize'][1] = height;\n\n\t\t\tblurPass.uniforms['textureSize'][0] = width;\n\t\t\tblurPass.uniforms['textureSize'][1] = height;\n\t\t}\n\t\twindow.addEventListener('resize', onWindowResize, false);\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "examples/custompass_taa.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>t3d - custom pass taa</title>\n\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n\t<link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n</head>\n<body>\n    <div id=\"info\">\n        <a href=\"\" target=\"_blank\">t3d</a> - custom pass taa\n    </div>\n\n\t<!-- Import maps polyfill -->\n    <!-- Remove this when import maps will be widely supported -->\n    <script async src=\"./libs/es-module-shims.js\"></script>\n\n    <script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n    <script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { GLTFLoader } from 't3d/addons/loaders/glTF/GLTFLoader.js';\n\t\timport { Texture2DLoader } from 't3d/addons/loaders/Texture2DLoader.js';\n\t\timport { TextureCubeLoader } from 't3d/addons/loaders/TextureCubeLoader.js';\n\t\timport { OrbitControls } from 't3d/addons/controls/OrbitControls.js';\n\t\timport { GBuffer } from 't3d/addons/GBuffer.js';\n\t\timport { SkyBox } from 't3d/addons/objects/SkyBox.js';\n\t\timport { CopyShader } from 't3d/addons/shaders/CopyShader.js';\n\t\timport { SuperSampling } from 't3d/addons/SuperSampling.js';\n\t\timport { Clock } from 't3d/addons/Clock.js';\n\t\timport { GUI } from './libs/lil-gui.esm.min.js';\n\n\t\tlet width = window.innerWidth || 2;\n\t\tlet height = window.innerHeight || 2;\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = width * window.devicePixelRatio;\n\t\tcanvas.height = height * window.devicePixelRatio;\n\t\tcanvas.style.width = width + 'px';\n\t\tcanvas.style.height = height + 'px';\n\t\tdocument.body.appendChild(canvas);\n\n\t\tconst screenRenderTarget = new t3d.ScreenRenderTarget(canvas);\n\n\t\tconst contextParams = { antialias: false, alpha: false };\n\t\tconst gl = canvas.getContext('webgl2', contextParams) || canvas.getContext('webgl', contextParams);\n\t\tconst renderer = new t3d.WebGLRenderer(gl);\n\n\t\tconst scene = new t3d.Scene();\n\t\tscene.disableShadowSampler = true;\n\n\t\tconst texture = new Texture2DLoader().load('./resources/hardwood2_diffuse.jpg', function() {\n\t\t\tsceneChange = true;\n\t\t});\n\t\ttexture.anisotropy = renderer.capabilities.maxAnisotropy;\n\t\ttexture.minFilter = t3d.TEXTURE_FILTER.NEAREST;\n\t\ttexture.wrapS = texture.wrapT = t3d.TEXTURE_WRAP.REPEAT;\n\n\t\tconst cube_geometry = new t3d.PlaneGeometry(200, 200);\n\t\tconst material = new t3d.LambertMaterial();\n\t\tmaterial.diffuseMap = texture;\n\t\tmaterial.diffuseMapTransform.setUvTransform(0, 0, 10, 10, 0, 0.5, 0.5);\n\t\tconst cube = new t3d.Mesh(cube_geometry, material);\n\t\tcube.position.set(-5, 0, 0);\n\t\tcube.receiveShadow = true;\n\t\tscene.add(cube);\n\n\t\tlet animation, object;\n\n\t\tconst loader = new GLTFLoader();\n\t\tloader.load(\n\t\t\t'./resources/models/gltf/CesiumMan/glTF-Binary/CesiumMan.glb'\n\t\t).then(function(result) {\n\t\t\t// add mesh to scene\n\t\t\tobject = result.root.children[0];\n\t\t\tobject.children[1].castShadow = true;\n\n\t\t\tobject.children[1].frustumCulled = false;\n\t\t\n\t\t\tanimation = new t3d.AnimationMixer();\n\t\t\tresult.animations.forEach(function(clip) {\n\t\t\t\tconst action = new t3d.AnimationAction(clip);\n\t\t\t\taction.weight = 1;\n\t\t\t\tanimation.addAction(action);\n\t\t\t});\n\n\t\t\tobject.scale.set(8, 8, 8);\n\n\t\t\tobject.position.set(5, 0, 0);\n\n\t\t\tscene.add(object);\n\t\t});\n\n\t\tconst ambientLight = new t3d.AmbientLight(0xffffff, 0.5);\n\t\tscene.add(ambientLight);\n\n\t\tconst directionalLight = new t3d.DirectionalLight(0xffffff, 0.7);\n\t\tdirectionalLight.position.set(-30, 30, 0);\n\t\tdirectionalLight.lookAt(new t3d.Vector3(), new t3d.Vector3(0, 1, 0));\n\t\tdirectionalLight.shadow.windowSize = 50;\n\t\tdirectionalLight.castShadow = true;\n\t\tscene.add(directionalLight);\n\n\t\tconst cubeTexturePath = './resources/skybox/sunset/';\n\t\tconst cubeTexture = new TextureCubeLoader().load([\n\t\t\tcubeTexturePath + 'px.jpg',\n\t\t\tcubeTexturePath + 'nx.jpg',\n\t\t\tcubeTexturePath + 'py.jpg',\n\t\t\tcubeTexturePath + 'ny.jpg',\n\t\t\tcubeTexturePath + 'pz.jpg',\n\t\t\tcubeTexturePath + 'nz.jpg'\n\t\t], function() {\n\t\t\tsceneChange = true;\n\t\t});\n\t\tconst skyBox = new SkyBox(cubeTexture);\n\t\tscene.add(skyBox);\n\n\t\tconst camera = new t3d.Camera();\n\t\tcamera.position.set(50, 20, 40);\n\t\tcamera.lookAt(new t3d.Vector3(0, 0, 0), new t3d.Vector3(0, 1, 0));\n\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 1000);\n\t\tscene.add(camera);\n\n\t\tconst controller = new OrbitControls(camera, canvas);\n\n\t\t// custom pass\n\n\t\tconst shadowMapPass = new t3d.ShadowMapPass();\n\n\t\tconst tempRenderTarget = t3d.OffscreenRenderTarget.create2D(width, height);\n\t\ttempRenderTarget.texture.minFilter = t3d.TEXTURE_FILTER.LINEAR;\n\t\ttempRenderTarget.texture.magFilter = t3d.TEXTURE_FILTER.LINEAR;\n\t\ttempRenderTarget.texture.generateMipmaps = false;\n\n\t\tconst copyPass = new t3d.ShaderPostPass(CopyShader);\n\n\t\tconst gBuffer = new GBuffer(width, height);\n\t\tgBuffer.enableMotion = true;\n\t\tgBuffer._debugPass.material.defines.ARROW_TILE_SIZE = '16.0';\n\t\tgBuffer._debugPass.material.uniforms.velocityThreshold = 0.001;\n\t\tgBuffer._debugPass.material.uniforms.arrowScale = 20;\n\n\t\tconst superSampling = new SuperSampling(width, height);\n\n\t\tconst oldProjectionMatrix = new t3d.Matrix4();\n\n\t\tlet sceneChange = false;\n\n\t\tconst params = { taa: window.devicePixelRatio == 1, dynamic: true, debug: false }; // taa works bad on android and ios\n\t\tconst gui = new GUI();\n\t\tgui.add(params, 'taa').onChange(() => {\n\t\t\tsuperSampling.start();\n\t\t});\n\t\tgui.add(params, 'dynamic').onChange(() => {\n\t\t\tsuperSampling.start();\n\t\t});\n\t\tgui.add(params, 'debug').onChange(() => {\n\t\t\tsuperSampling.start();\n\t\t});\n\n\t\tconst clock = new Clock();\n\n\t\tfunction loop(count) {\n\t\t\trequestAnimationFrame(loop);\n\n\t\t\tanimation && animation.update(clock.getDelta() * 1.3);\n\n\t\t\tconst change = controller.update() || sceneChange;\n\n\t\t\tif (params.debug) {\n\t\t\t\tscene.updateMatrix();\n\t\t\t\tscene.updateRenderStates(camera);\n\t\t\t\tscene.updateRenderQueue(camera);\n\n\t\t\t\tgBuffer.update(renderer, scene, camera);\n\n\t\t\t\tscreenRenderTarget.setColorClearValue(0, 0, 0, 1);\n\t\t\t\tgBuffer.renderDebug(renderer, camera, 'velocity', screenRenderTarget);\n\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (!params.taa) {\n\t\t\t\tscene.updateMatrix();\n\t\t\t\tscene.updateRenderStates(camera);\n\t\t\t\tscene.updateRenderQueue(camera);\n\n\t\t\t\tshadowMapPass.render(renderer, scene);\n\t\t\n\t\t\t\tscreenRenderTarget.setColorClearValue(0.3, 0.3, 0.3, 1);\n\t\t\t\trenderer.renderScene(scene, camera, screenRenderTarget);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (change) {\n\t\t\t\tif (!params.dynamic || sceneChange) {\n\t\t\t\t\tsuperSampling.start();\n\t\t\t\t}\n\t\t\n\t\t\t\tsceneChange = false;\n\t\t\t}\n\n\t\t\tlet tex;\n\n\t\t\tif (params.dynamic || !superSampling.finished()) {\n\t\t\t\tscene.updateMatrix();\n\t\t\t\tscene.updateRenderStates(camera);\n\t\t\t\tscene.updateRenderQueue(camera);\n\n\t\t\t\tshadowMapPass.render(renderer, scene);\n\n\t\t\t\tif (params.dynamic) {\n\t\t\t\t\tgBuffer.update(renderer, scene, camera);\n\t\t\n\t\t\t\t\tif (superSampling.finished()) {\n\t\t\t\t\t\tsuperSampling._frame = 1;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\toldProjectionMatrix.copy(camera.projectionMatrix);\n\t\t\t\tsuperSampling.jitterProjection(camera, width, height);\n\n\t\t\t\tscene.updateRenderStates(camera, false);\n\t\t\t\ttempRenderTarget.setColorClearValue(0.3, 0.3, 0.3, 1);\n\t\t\t\trenderer.renderScene(scene, camera, tempRenderTarget);\n\n\t\t\t\tcamera.projectionMatrix.copy(oldProjectionMatrix);\n\n\t\t\t\ttex = superSampling.sample(renderer, tempRenderTarget.texture, gBuffer.getMotionTexture(), gBuffer.getDepthTexture(), !params.dynamic);\n\t\t\t} else {\n\t\t\t\ttex = superSampling.output();\n\t\t\t}\n\n\t\t\tcopyPass.uniforms['tDiffuse'] = tex;\n\t\t\tcopyPass.material.transparent = true;\n\t\t\tscreenRenderTarget.setColorClearValue(0, 0, 0, 0);\n\t\t\tcopyPass.render(renderer, screenRenderTarget);\n\t\t}\n\n\t\trequestAnimationFrame(loop);\n\n\t\tfunction onWindowResize() {\n\t\t\twidth = window.innerWidth || 2;\n\t\t\theight = window.innerHeight || 2;\n\n\t\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 1000);\n\n\t\t\tscreenRenderTarget.resize(width * window.devicePixelRatio, height * window.devicePixelRatio);\n\t\t\ttempRenderTarget.resize(width * window.devicePixelRatio, height * window.devicePixelRatio);\n\n\t\t\tgBuffer.resize(width * window.devicePixelRatio, height * window.devicePixelRatio);\n\t\t\tsuperSampling.resize(width * window.devicePixelRatio, height * window.devicePixelRatio);\n\n\t\t\tcanvas.style.width = width + 'px';\n\t\t\tcanvas.style.height = height + 'px';\n\n\t\t\tsceneChange = true;\n\t\t}\n\t\twindow.addEventListener('resize', onWindowResize, false);\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "examples/custompass_transmission.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n    <meta charset=\"utf-8\">\n    <title>t3d - custompass transmission</title>\n    <meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n    <link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n</head>\n<body>\n    <div id=\"info\">\n        <a href=\"\" target=\"_blank\">t3d</a> - custompass transmission\n    </div>\n\n    <script src=\"./libs/nanobar.js\"></script>\n\n    <!-- Import maps polyfill -->\n    <!-- Remove this when import maps will be widely supported -->\n    <script async src=\"./libs/es-module-shims.js\"></script>\n\n    <script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n    <script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { GLTFLoader } from 't3d/addons/loaders/glTF/GLTFLoader.js';\n\t\timport { TextureCubeLoader } from 't3d/addons/loaders/TextureCubeLoader.js';\n\t\timport { OrbitControls } from 't3d/addons/controls/OrbitControls.js';\n\t\timport { SkyBox } from 't3d/addons/objects/SkyBox.js';\n\t\timport { FXAAShader } from 't3d/addons/shaders/FXAAShader.js';\n\t\timport { CopyShader } from 't3d/addons/shaders/CopyShader.js';\n\t\timport { Texture2DLoader } from 't3d/addons/loaders/Texture2DLoader.js';\n\t\timport { TransmissionPBRMaterial } from 't3d/addons/materials/TransmissionPBRMaterial.js';\n\t\timport { GUI } from './libs/lil-gui.esm.min.js';\n\n\t\tlet width = window.innerWidth || 2;\n\t\tlet height = window.innerHeight || 2;\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = width;\n\t\tcanvas.height = height;\n\t\tdocument.body.appendChild(canvas);\n\n\t\tconst cubeTexturePath = './resources/skybox/Bridge2/';\n\t\tconst cubeTexture = new TextureCubeLoader().load([\n\t\t\tcubeTexturePath + 'posx.jpg',\n\t\t\tcubeTexturePath + 'negx.jpg',\n\t\t\tcubeTexturePath + 'posy.jpg',\n\t\t\tcubeTexturePath + 'negy.jpg',\n\t\t\tcubeTexturePath + 'posz.jpg',\n\t\t\tcubeTexturePath + 'negz.jpg'\n\t\t]);\n\t\tcubeTexture.encoding = t3d.TEXEL_ENCODING_TYPE.SRGB;\n\n\t\tconst scene = new t3d.Scene();\n\t\tscene.environment = cubeTexture;\n\n\t\tconst skyBox = new SkyBox(cubeTexture);\n\t\tskyBox.gamma = true;\n\t\tscene.add(skyBox);\n\n\t\tconst screenRenderTarget = new t3d.ScreenRenderTarget(canvas);\n\t\tconst contextParams = { antialias: false, alpha: false };\n\t\tconst gl = canvas.getContext('webgl2', contextParams) || canvas.getContext('webgl', contextParams);\n\t\tconst renderer = new t3d.WebGLRenderer(gl);\n\t\t\n\t\tlet material;\n\n\t\tconst nanobar = new Nanobar();\n\t\tnanobar.el.style.background = 'gray';\n\n\t\tconst loadingManager = new t3d.LoadingManager(function() {\n\t\t\tnanobar.go(100);\n\t\t\tnanobar.el.style.background = 'transparent';\n\t\t}, function(url, itemsLoaded, itemsTotal) {\n\t\t\tif (itemsLoaded < itemsTotal) {\n\t\t\t\tnanobar.go(itemsLoaded / itemsTotal * 100);\n\t\t\t}\n\t\t});\n\n\t\tconst loader = new GLTFLoader(loadingManager);\n\t\tloader.autoLogError = false;\n\n\t\tconst baseUri = './resources/models/gltf/DragonAttenuation/';\n\n\t\tconst textureLoader = new Texture2DLoader();\n\t\tconst thicknessMap = textureLoader.load(baseUri + 'Image_1.jpg');\n\t\tthicknessMap.wrapS = thicknessMap.wrapT = t3d.TEXTURE_WRAP.REPEAT;\n\t\tthicknessMap.flipY = false;\n\n\t\tloader.load(baseUri + 'DragonAttenuation.gltf').then(function(result) {\n\t\t\tconst object = result.root;\n\t\t\tobject.traverse(function(node) {\n\t\t\t\tif (node.isMesh && node.name === 'Dragon') {\n\t\t\t\t\t// GLTFLoader doesn't support transmission for now,\n\t\t\t\t\t// so we need to replace the material\n\t\t\t\t\tmaterial = new TransmissionPBRMaterial(node.material);\n\n\t\t\t\t\tmaterial.transparent = true;\n\n\t\t\t\t\tmaterial.uniforms.transmission = 1;\n\t\t\n\t\t\t\t\tmaterial.uniforms.thickness = 2.27;\n\t\t\t\t\tmaterial.uniforms.thicknessMap = thicknessMap;\n\t\t\t\t\tmaterial.uniforms.attenuationColor = [246 / 255, 209 / 255, 72 / 255];\n\t\t\t\t\tmaterial.uniforms.attenuationDistance = 0.155;\n\n\t\t\t\t\tmaterial.uniforms.ior = 1.5;\n\n\t\t\t\t\tmaterial.defines.USE_THICKNESSMAP = true;\n\t\t\t\t\tmaterial.extUvCoordMask = 1;\n\t\t\n\t\t\t\t\tnode.material = material;\n\n\t\t\t\t\tnode.renderLayer = 1;\n\t\t\t\t}\n\t\t\t});\n\t\t\trequestAnimationFrame(loop);\n\n\t\t\tobject.scale.set(3, 3, 3);\n\t\t\tscene.add(object);\n\n\t\t\tconst gui = new GUI();\n\t\t\tconst basicFolder = gui.addFolder('Basic');\n\t\t\tbasicFolder.addColor(material, 'diffuse');\n\t\t\tbasicFolder.add(material, 'opacity', 0, 1, 0.01);\n\t\t\tbasicFolder.add(material, 'metalness', 0, 1, 0.01);\n\t\t\tbasicFolder.add(material, 'roughness', 0, 1, 0.01);\n\t\t\tbasicFolder.close();\n\t\t\tconst transmissionFolder = gui.addFolder('Transmission');\n\t\t\ttransmissionFolder.add(material.uniforms, 'transmission', 0, 1, 0.01);\n\t\t\ttransmissionFolder.add(material.uniforms, 'thickness', 0, 5, 0.01);\n\t\t\ttransmissionFolder.addColor(material.uniforms, 'attenuationColor');\n\t\t\ttransmissionFolder.add(material.uniforms, 'attenuationDistance', 0, 1, 0.01);\n\t\t\ttransmissionFolder.add(material.uniforms, 'ior', 1, 3, 0.01);\n\t\t}).catch(e => console.error(e));\n\n\t\tconst ambientLight = new t3d.AmbientLight(0xffffff, 0.2);\n\t\tscene.add(ambientLight);\n\n\t\tconst directionalLight = new t3d.DirectionalLight(0xffffff, 0.8);\n\t\tdirectionalLight.position.set(0, 10, 30);\n\t\tdirectionalLight.lookAt(new t3d.Vector3(), new t3d.Vector3(0, 1, 0));\n\t\tscene.add(directionalLight);\n\n\t\tconst camera = new t3d.Camera();\n\t\tcamera.outputEncoding = t3d.TEXEL_ENCODING_TYPE.SRGB;\n\t\tcamera.position.set(0, 5, 15);\n\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 8000);\n\t\tscene.add(camera);\n\n\t\tconst controller = new OrbitControls(camera, canvas);\n\t\tcontroller.target.set(0, 1, 0);\n\n\t\tconst sceneRenderTarget = t3d.OffscreenRenderTarget.create2D(width, height);\n\t\tsceneRenderTarget.texture.encoding = t3d.TEXEL_ENCODING_TYPE.SRGB;\n\n\t\tconst transmissionRenderTarget = t3d.OffscreenRenderTarget.create2D(width, height);\n\t\ttransmissionRenderTarget.texture.encoding = t3d.TEXEL_ENCODING_TYPE.SRGB;\n\t\ttransmissionRenderTarget.texture.minFilter = t3d.TEXTURE_FILTER.LINEAR;\n\t\ttransmissionRenderTarget.texture.magFilter = t3d.TEXTURE_FILTER.LINEAR;\n\t\ttransmissionRenderTarget.texture.generateMipmaps = false;\n\n\t\tconst resultRenderTarget = t3d.OffscreenRenderTarget.create2D(width, height);\n\t\tresultRenderTarget.texture.minFilter = t3d.TEXTURE_FILTER.LINEAR;\n\t\tresultRenderTarget.texture.magFilter = t3d.TEXTURE_FILTER.LINEAR;\n\t\tresultRenderTarget.texture.generateMipmaps = false;\n\n\t\tconst depthTexture = new t3d.Texture2D();\n\t\tdepthTexture.type = t3d.PIXEL_TYPE.UNSIGNED_INT_24_8;\n\t\tdepthTexture.format = t3d.PIXEL_FORMAT.DEPTH_STENCIL;\n\t\tdepthTexture.magFilter = t3d.TEXTURE_FILTER.NEAREST;\n\t\tdepthTexture.minFilter = t3d.TEXTURE_FILTER.NEAREST;\n\t\tdepthTexture.generateMipmaps = false;\n\t\tdepthTexture.flipY = false;\n\n\t\tsceneRenderTarget.attach(depthTexture, t3d.ATTACHMENT.DEPTH_STENCIL_ATTACHMENT);\n\t\ttransmissionRenderTarget.attach(depthTexture, t3d.ATTACHMENT.DEPTH_STENCIL_ATTACHMENT);\n\n\t\tconst renderOptions = {\n\t\t\tgetMaterial: function(renderable) {\n\t\t\t\tconst material = renderable.material;\n\t\t\t\tmaterial.uniforms.transmissionSamplerMap = sceneRenderTarget.texture;\n\t\t\t\tmaterial.uniforms.transmissionSamplerSize[0] = sceneRenderTarget.texture.image.width;\n\t\t\t\tmaterial.uniforms.transmissionSamplerSize[1] = sceneRenderTarget.texture.image.height;\n\t\t\t\treturn material;\n\t\t\t}\n\t\t};\n\n\t\tconst copyPass = new t3d.ShaderPostPass(CopyShader);\n\n\t\tconst fxaaPass = new t3d.ShaderPostPass(FXAAShader);\n\n\t\tfunction loop(count) {\n\t\t\trequestAnimationFrame(loop);\n\n\t\t\tcontroller.update();\n\t\t\n\t\t\tscene.updateMatrix();\n\t\t\tconst renderStates = scene.updateRenderStates(camera);\n\t\t\tconst renderQueue = scene.updateRenderQueue(camera);\n\t\t\tconst mainRenderQueueLayer = renderQueue.getLayer(0);\n\t\t\tconst transmissionRenderQueueLayer = renderQueue.getLayer(1);\n\n\t\t\t// Step1: render scene to sceneRenderTarget\n\n\t\t\trenderer.beginRender(sceneRenderTarget);\n\t\t\trenderer.renderRenderableList(mainRenderQueueLayer.opaque, renderStates, {});\n\t\t\trenderer.renderRenderableList(mainRenderQueueLayer.transparent, renderStates, {});\n\t\t\trenderer.endRender();\n\n\t\t\trenderer.generateMipmaps(sceneRenderTarget.texture);\n\n\t\t\t// Step2: render transmission to transmissionRenderTarget\n\n\t\t\ttransmissionRenderTarget.setClear(true, false, false);\n\t\t\trenderer.beginRender(transmissionRenderTarget);\n\t\t\trenderer.renderRenderableList(transmissionRenderQueueLayer.opaque, renderStates, renderOptions);\n\t\t\trenderer.renderRenderableList(transmissionRenderQueueLayer.transparent, renderStates, renderOptions);\n\t\t\trenderer.endRender();\n\n\t\t\t// Step3: blend sceneRenderTarget and transmissionRenderTarget to resultRenderTarget\n\n\t\t\tresultRenderTarget.setClear(false, false, false);\n\n\t\t\tcopyPass.material.transparent = false;\n\t\t\tcopyPass.material.uniforms.tDiffuse = sceneRenderTarget.texture;\n\t\t\tcopyPass.render(renderer, resultRenderTarget);\n\n\t\t\tcopyPass.material.transparent = true;\n\t\t\tcopyPass.material.uniforms.tDiffuse = transmissionRenderTarget.texture;\n\t\t\tcopyPass.render(renderer, resultRenderTarget);\n\n\t\t\t// Step4: render resultRenderTarget to screen\n\n\t\t\tfxaaPass.material.uniforms.tDiffuse = resultRenderTarget.texture;\n\t\t\tfxaaPass.render(renderer, screenRenderTarget);\n\t\t}\n\n\t\tfunction onWindowResize() {\n\t\t\twidth = window.innerWidth || 2;\n\t\t\theight = window.innerHeight || 2;\n\n\t\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 8000);\n\n\t\t\tscreenRenderTarget.resize(width, height);\n\t\t\tsceneRenderTarget.resize(width, height);\n\t\t\ttransmissionRenderTarget.resize(width, height);\n\t\t\tresultRenderTarget.resize(width, height);\n\t\t}\n\t\twindow.addEventListener('resize', onWindowResize, false);\n    </script>\n</body>\n\n</html>"
  },
  {
    "path": "examples/custompass_unrealbloom.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n    <meta charset=\"utf-8\">\n    <title>t3d - custom pass unreal bloom</title>\n    <meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n    <link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n</head>\n<body>\n    <div id=\"info\">\n        <a href=\"\" target=\"_blank\">t3d</a> - custom pass unreal bloom\n    </div>\n\n    <script src=\"./libs/nanobar.js\"></script>\n\n    <!-- Import maps polyfill -->\n    <!-- Remove this when import maps will be widely supported -->\n    <script async src=\"./libs/es-module-shims.js\"></script>\n\n    <script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n    <script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { Timer } from 't3d/addons/misc/Timer.js';\n\t\timport { GUI } from './libs/lil-gui.esm.min.js';\n\t\timport { GLTFLoader } from 't3d/addons/loaders/glTF/GLTFLoader.js';\n\t\timport { OrbitControls } from 't3d/addons/controls/OrbitControls.js';\n\t\timport { UnrealBloomPass } from 't3d/addons/pass/UnrealBloomPass.js';\n\n\t\tlet width = window.innerWidth || 2;\n\t\tlet height = window.innerHeight || 2;\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = width;\n\t\tcanvas.height = height;\n\t\tdocument.body.appendChild(canvas);\n\n\t\tconst contextParams = { antialias: false, alpha: false };\n\t\tconst gl = canvas.getContext('webgl2', contextParams) || canvas.getContext('webgl', contextParams);\n\n\t\tconst renderer = new t3d.WebGLRenderer(gl);\n\n\t\tconst screenRenderTarget = new t3d.ScreenRenderTarget(canvas);\n\n\t\tconst scene = new t3d.Scene();\n\n\t\tconst camera = new t3d.Camera();\n\t\tcamera.position.set(-1, 2, 5);\n\t\tcamera.lookAt(new t3d.Vector3(0, 0, 0), new t3d.Vector3(0, 1, 0));\n\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 500);\n\t\tscene.add(camera);\n\n\t\tconst controller = new OrbitControls(camera, canvas);\n\t\tcontroller.maxDistance = 10;\n\n\t\tconst ambientLight = new t3d.AmbientLight(0xffffff, 1);\n\t\tscene.add(ambientLight);\n\n\t\tconst directionalLight = new t3d.DirectionalLight(0xffffff, 3);\n\t\tdirectionalLight.position.set(-3, 3, 0);\n\t\tdirectionalLight.lookAt(new t3d.Vector3(), new t3d.Vector3(0, 1, 0));\n\t\tscene.add(directionalLight);\n\n\t\t// Load model\n\n\t\tconst nanobar = new Nanobar();\n\t\tnanobar.el.style.background = 'gray';\n\n\t\tconst loadingManager = new t3d.LoadingManager(function() {\n\t\t\tnanobar.go(100);\n\t\t\tnanobar.el.style.background = 'transparent';\n\t\t}, function(url, itemsLoaded, itemsTotal) {\n\t\t\tif (itemsLoaded < itemsTotal) {\n\t\t\t\tnanobar.go(itemsLoaded / itemsTotal * 100);\n\t\t\t}\n\t\t});\n\n\t\tlet animation;\n\n\t\tconst loader = new GLTFLoader(loadingManager);\n\t\tloader.load('./resources/models/gltf/PrimaryIonDrive.glb').then(function(result) {\n\t\t\tconst object = result.root;\n\t\t\n\t\t\tobject.traverse(function(obj) {\n\t\t\t\tif (obj.material && obj.material.transparent) {\n\t\t\t\t\tobj.material.depthWrite = false;\n\t\t\t\t}\n\t\t\t});\n\t\t\n\t\t\tanimation = new t3d.AnimationMixer();\n\t\t\tresult.animations.forEach(function(clip) {\n\t\t\t\tconst action = new t3d.AnimationAction(clip);\n\t\t\t\taction.weight = 1;\n\t\t\t\tanimation.addAction(action);\n\t\t\t});\n\n\t\t\tscene.add(object);\n\t\t});\n\n\t\t// Passes\n\n\t\tconst tempRenderTarget = t3d.OffscreenRenderTarget.create2D(width, height);\n\t\ttempRenderTarget.texture.type = t3d.PIXEL_TYPE.HALF_FLOAT;\n\t\tif (renderer.capabilities.version > 1) {\n\t\t\ttempRenderTarget.texture.format = t3d.PIXEL_FORMAT.RGB;\n\t\t\ttempRenderTarget.texture.internalformat = t3d.PIXEL_FORMAT.R11F_G11F_B10F;\n\t\t}\n\t\ttempRenderTarget.texture.minFilter = t3d.TEXTURE_FILTER.LINEAR;\n\t\ttempRenderTarget.texture.magFilter = t3d.TEXTURE_FILTER.LINEAR;\n\t\ttempRenderTarget.generateMipmaps = false;\n\n\t\tUnrealBloomPass.supportWebGL1 = renderer.capabilities.version < 2;\n\t\tconst bloomPass = new UnrealBloomPass(width, height);\n\n\t\t// GUI\n\n\t\tconst gui = new GUI();\n\t\tgui.add(bloomPass, 'threshold', 0, 1, 0.01);\n\t\tgui.add(bloomPass, 'strength', 0, 3, 0.01);\n\t\tgui.add(bloomPass, 'radius', 0, 1, 0.01);\n\t\tgui.add(bloomPass, 'toneMappingExposure', 0, 16, 0.01);\n\n\t\t// Loop\n\t\t\n\t\tconst timer = new Timer();\n\n\t\tfunction loop(timestamp) {\n\t\t\trequestAnimationFrame(loop);\n\n\t\t\ttimer.update(timestamp);\n\n\t\t\tcontroller.update();\n\t\t\n\t\t\tanimation && animation.update(timer.getDelta());\n\t\t\n\t\t\tscene.updateMatrix();\n\t\t\tscene.updateRenderStates(camera);\n\t\t\tscene.updateRenderQueue(camera);\n\n\t\t\trenderer.renderScene(scene, camera, tempRenderTarget);\n\t\t\tbloomPass.update(renderer, tempRenderTarget, screenRenderTarget);\n\t\t}\n\t\trequestAnimationFrame(loop);\n\n\t\tfunction onWindowResize() {\n\t\t\twidth = window.innerWidth || 2;\n\t\t\theight = window.innerHeight || 2;\n\n\t\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 500);\n\t\t\n\t\t\ttempRenderTarget.resize(width, height);\n\t\t\tscreenRenderTarget.resize(width, height);\n\t\t\tbloomPass.resize(width, height);\n\t\t}\n\t\twindow.addEventListener('resize', onWindowResize, false);\n    </script>\n</body>\n</html>"
  },
  {
    "path": "examples/custompass_xray.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>t3d - custompass xray</title>\n\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n\t<link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n</head>\n<body>\n    <div id=\"info\">\n        <a href=\"\" target=\"_blank\">t3d</a> - custompass xray\n    </div>\n\n\t<script src=\"./libs/nanobar.js\"></script>\n\n\t<!-- Import maps polyfill -->\n    <!-- Remove this when import maps will be widely supported -->\n    <script async src=\"./libs/es-module-shims.js\"></script>\n\n    <script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n    <script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { Clock } from 't3d/addons/Clock.js';\n\t\timport { GLTFLoader } from 't3d/addons/loaders/glTF/GLTFLoader.js';\n\t\timport { OrbitControls } from 't3d/addons/controls/OrbitControls.js';\n\t\timport { XRayShader } from 't3d/addons/shaders/XRayShader.js';\n\t\timport { GUI } from './libs/lil-gui.esm.min.js';\n\n\t\tlet width = window.innerWidth || 2;\n\t\tlet height = window.innerHeight || 2;\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = width;\n\t\tcanvas.height = height;\n\t\tdocument.body.appendChild(canvas);\n\n\t\tconst contextParams = { antialias: true, alpha: false, stencil: true };\n\t\tconst gl = canvas.getContext('webgl2', contextParams) || canvas.getContext('webgl', contextParams);\n\t\tconst renderer = new t3d.WebGLRenderer(gl);\n\n\t\tconst screenRenderTarget = new t3d.ScreenRenderTarget(canvas);\n\t\tscreenRenderTarget.setColorClearValue(54 / 255, 103 / 255, 149 / 255, 1);\n\n\t\tconst scene = new t3d.Scene();\n\n\t\tconst camera = new t3d.Camera();\n\t\tcamera.outputEncoding = t3d.TEXEL_ENCODING_TYPE.SRGB;\n\t\tcamera.position.set(1, 2, 3);\n\t\tcamera.setPerspective(50 / 180 * Math.PI, width / height, 0.01, 100);\n\t\tscene.add(camera);\n\n\t\tconst spotLight = new t3d.SpotLight(0xffffff, 1);\n\t\tcamera.add(spotLight);\n\n\t\tconst controller = new OrbitControls(camera, canvas);\n\t\tcontroller.target.set(0, 1, 0);\n\n\t\tconst geometry = new t3d.SphereGeometry(.3, 32, 16);\n\n\t\tconst portals = new t3d.Object3D();\n\t\tscene.add(portals);\n\n\t\tfunction addBackdropSphere(color) {\n\t\t\tconst distance = 1;\n\t\t\tconst id = portals.children.length;\n\t\t\tconst rotation = id * Math.PI / 4;\n\n\t\t\tconst material = new t3d.LambertMaterial();\n\t\t\tmaterial.diffuse.setHSL(Math.random(), 0.5, .1);\n\t\t\tmaterial.roughness = .2;\n\t\t\tmaterial.metalness = 0;\n\n\t\t\tconst mesh = new t3d.Mesh(geometry, material);\n\t\t\tmesh.position.set(\n\t\t\t\tMath.cos(rotation) * distance,\n\t\t\t\t1,\n\t\t\t\tMath.sin(rotation) * distance\n\t\t\t);\n\n\t\t\tportals.add(mesh);\n\t\t}\n\n\t\tfor (let i = 0; i < 8; i++) {\n\t\t\taddBackdropSphere(0xffffff * Math.random());\n\t\t}\n\t\t\n\t\tconst nanobar = new Nanobar();\n\t\tnanobar.el.style.background = 'gray';\n\n\t\tconst loadingManager = new t3d.LoadingManager(function() {\n\t\t\tnanobar.go(100);\n\t\t\tnanobar.el.style.background = 'transparent';\n\t\t}, function(url, itemsLoaded, itemsTotal) {\n\t\t\tif (itemsLoaded < itemsTotal) {\n\t\t\t\tnanobar.go(itemsLoaded / itemsTotal * 100);\n\t\t\t}\n\t\t});\n\n\t\tlet animation;\n\n\t\tconst loader = new GLTFLoader(loadingManager);\n\t\tloader.load(\n\t\t\t'./resources/models/gltf/Michelle.glb'\n\t\t).then(function(result) {\n\t\t\tconst object = result.root;\n\n\t\t\tobject.traverse(node => {\n\t\t\t\tif (node.isMesh) {\n\t\t\t\t\tnode._xray = true;\n\t\t\t\t\tnode.frustumCulled = false;\n\t\t\t\t\tnode.renderOrder = 1;\n\t\t\t\t\tnode.material.stencilTest = true;\n\t\t\t\t\tnode.material.stencilRef = 1;\n\t\t\t\t\tnode.material.stencilZPass = t3d.OPERATION.REPLACE;\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tconst action = new t3d.AnimationAction(result.animations[0]);\n\t\t\taction.time = 0;\n\t\t\taction.weight = 1;\n\t\t\tanimation = new t3d.AnimationMixer();\n\t\t\tanimation.addAction(action);\n\t\t\n\t\t\tscene.add(object);\n\t\t}).catch(e => console.error(e));\n\n\t\tconst xrayMaterial = new t3d.ShaderMaterial(XRayShader);\n\t\txrayMaterial.transparent = true;\n\t\txrayMaterial.depthFunc = t3d.COMPARE_FUNC.GREATER;\n\t\txrayMaterial.depthWrite = false;\n\t\txrayMaterial.stencilTest = true;\n\t\txrayMaterial.stencilFunc = t3d.COMPARE_FUNC.GREATER;\n\t\txrayMaterial.stencilRef = 1;\n\n\t\tconst renderOption = {\n\t\t\tgetMaterial(renderable) {\n\t\t\t\treturn xrayMaterial;\n\t\t\t},\n\t\t\tifRender(renderable) {\n\t\t\t\treturn renderable.object._xray;\n\t\t\t}\n\t\t};\n\n\t\tconst gui = new GUI();\n\t\tgui.add(xrayMaterial, 'opacity', 0, 1, 0.01);\n\t\tgui.add(xrayMaterial.uniforms, 'power', 0, 1, 0.01);\n\t\tgui.add(xrayMaterial.uniforms, 'glowInverse');\n\t\tgui.addColor(xrayMaterial.uniforms, 'glowColor');\n\n\t\tconst clock = new Clock();\n\n\t\tfunction loop(count) {\n\t\t\trequestAnimationFrame(loop);\n\n\t\t\tconst delta = clock.getDelta();\n\n\t\t\tif (!controller.update()) {\n\t\t\t\tportals.euler.y += delta * 0.5;\n\t\t\t}\n\n\t\t\tanimation && animation.update(delta);\n\n\t\t\tscene.updateMatrix();\n\t\t\tscene.updateRenderStates(camera);\n\t\t\tscene.updateRenderQueue(camera);\n\t\t\n\t\t\t// render main pass\n\t\t\n\t\t\tscreenRenderTarget.setClear(true, true, true);\n\t\t\trenderer.renderScene(scene, camera, screenRenderTarget);\n\n\t\t\t// render xray pass\n\n\t\t\tconst renderStates = scene.getRenderStates(camera);\n\t\t\tconst mainLayer = scene.getRenderQueue(camera).getLayer(0);\n\n\t\t\tscreenRenderTarget.setClear(false, false, false);\n\n\t\t\trenderer.beginRender(screenRenderTarget);\n\t\t\trenderer.renderRenderableList(mainLayer.opaque, renderStates, renderOption);\n\t\t\trenderer.renderRenderableList(mainLayer.transparent, renderStates, renderOption);\n\t\t\trenderer.endRender();\n\t\t}\n\t\trequestAnimationFrame(loop);\n\n\t\tfunction onWindowResize() {\n\t\t\twidth = window.innerWidth || 2;\n\t\t\theight = window.innerHeight || 2;\n\n\t\t\tcamera.setPerspective(50 / 180 * Math.PI, width / height, 0.01, 100);\n\n\t\t\tscreenRenderTarget.resize(width, height);\n\t\t}\n\t\twindow.addEventListener('resize', onWindowResize, false);\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "examples/exporter_draco.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>t3d - draco exporter</title>\n\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n\t<link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n</head>\n<body>\n    <div id=\"info\">\n        <a href=\"\" target=\"_blank\">t3d</a> - draco exporter\n\t</div>\n\n\t<script src=\"./libs/draco/draco_encoder.js\"></script>\n\n\t<script src=\"./libs/nanobar.js\"></script>\n\n\t<!-- Import maps polyfill -->\n    <!-- Remove this when import maps will be widely supported -->\n    <script async src=\"./libs/es-module-shims.js\"></script>\n\n    <script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n    <script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { DRACOExporter } from 't3d/addons/exporters/DRACOExporter.js';\n\t\timport { GridHelper } from 't3d/addons/objects/GridHelper.js';\n\t\timport { OrbitControls } from 't3d/addons/controls/OrbitControls.js';\n\t\timport { ForwardRenderer } from 't3d/addons/render/ForwardRenderer.js';\n\t\timport { GUI } from './libs/lil-gui.esm.min.js';\n\n\t\tconst devicePixelRatio = window.devicePixelRatio;\n\n\t\tlet width = window.innerWidth || 2;\n\t\tlet height = window.innerHeight || 2;\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = Math.floor(width * devicePixelRatio);\n\t\tcanvas.height = Math.floor(height * devicePixelRatio);\n\t\tcanvas.style.width = width + 'px';\n\t\tcanvas.style.height = height + 'px';\n\t\tdocument.body.appendChild(canvas);\n\n\t\tconst forwardRenderer = new ForwardRenderer(canvas);\n\t\tforwardRenderer.screenRenderTarget.setColorClearValue(0.62, 0.62, 0.62, 1);\n\n\t\tconst scene = new t3d.Scene();\n\t\tscene.fog = new t3d.Fog(0xa0a0a0, 4, 20);\n\n\t\tconst camera = new t3d.Camera();\n\t\tcamera.outputEncoding = t3d.TEXEL_ENCODING_TYPE.SRGB;\n\t\tcamera.position.set(4, 2, 4);\n\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 0.1, 100);\n\t\tscene.add(camera);\n\n\t\tconst controller = new OrbitControls(camera, canvas);\n\t\tcontroller.target.set(0, 1.5, 0);\n\n\t\t// lights\n\n\t\tconst hemiLight = new t3d.HemisphereLight(0xffffff, 0x444444, 0.6);\n\t\themiLight.position.set(0, 20, 0);\n\t\tscene.add(hemiLight);\n\n\t\tconst directionalLight = new t3d.DirectionalLight(0xffffff, 0.7);\n\t\tdirectionalLight.position.set(0, 20, 10);\n\t\tdirectionalLight.lookAt(new t3d.Vector3(), new t3d.Vector3(0, 1, 0));\n\t\tdirectionalLight.shadow.windowSize = 4;\n\t\tdirectionalLight.castShadow = true;\n\t\tscene.add(directionalLight);\n\n\t\t// ground\n\n\t\tconst planeGeometry = new t3d.PlaneGeometry(40, 40);\n\t\tconst planeMaterial = new t3d.PhongMaterial();\n\t\tplaneMaterial.diffuse.setHex(0xbbbbbb);\n\t\tplaneMaterial.depthWrite = false;\n\t\tconst ground = new t3d.Mesh(planeGeometry, planeMaterial);\n\t\tground.receiveShadow = true;\n\t\tscene.add(ground);\n\n\t\tconst grid = new GridHelper(40, 20, 0x000000, 0x000000);\n\t\tgrid.material.opacity = 0.2;\n\t\tgrid.material.transparent = true;\n\t\tscene.add(grid);\n\n\t\t// export mesh\n\n\t\tconst geometry = new t3d.TorusKnotGeometry(0.75, 0.2, 200, 30);\n\t\tconst material = new t3d.PhongMaterial();\n\t\tmaterial.diffuse.setHex(0x00ff00);\n\t\tconst mesh = new t3d.Mesh(geometry, material);\n\t\tmesh.castShadow = true;\n\t\tmesh.position.y = 1.5;\n\t\tscene.add(mesh);\n\n\t\t// gui\n\n\t\tconst params = { export: exportFile };\n\n\t\tconst gui = new GUI();\n\t\tgui.add(params, 'export').name('Export DRC');\n\n\t\t//\n\n\t\tconst exporter = new DRACOExporter();\n\n\t\tfunction exportFile() {\n\t\t\tconst result = exporter.parse(geometry);\n\t\t\tconsole.log(result);\n\t\t\tsaveArrayBuffer(result.buffer, 'file.drc');\n\t\t}\n\n\t\tconst link = document.createElement('a');\n\t\tlink.style.display = 'none';\n\t\tdocument.body.appendChild(link);\n\n\t\tfunction save(blob, filename) {\n\t\t\tlink.href = URL.createObjectURL(blob);\n\t\t\tlink.download = filename;\n\t\t\tlink.click();\n\t\t}\n\n\t\tfunction saveArrayBuffer(buffer, filename) {\n\t\t\tsave(new Blob([buffer], { type: 'application/octet-stream' }), filename);\n\t\t}\n\n\t\t//\n\n\t\tfunction loop(timestamp) {\n\t\t\trequestAnimationFrame(loop);\n\n\t\t\tcontroller.update();\n\n\t\t\tforwardRenderer.render(scene, camera);\n\t\t}\n\t\trequestAnimationFrame(loop);\n\n\t\tfunction onWindowResize() {\n\t\t\twidth = window.innerWidth || 2;\n\t\t\theight = window.innerHeight || 2;\n\n\t\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 0.1, 100);\n\n\t\t\tforwardRenderer.screenRenderTarget.resize(Math.floor(width * devicePixelRatio), Math.floor(height * devicePixelRatio));\n\n\t\t\tcanvas.style.width = width + 'px';\n\t\t\tcanvas.style.height = height + 'px';\n\t\t}\n\t\twindow.addEventListener('resize', onWindowResize, false);\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "examples/exporter_gltf.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>t3d - gltf exporter</title>\n\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n\t<link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n</head>\n<body>\n    <div id=\"info\">\n        <a href=\"\" target=\"_blank\">t3d</a> - gltf exporter\n\t</div>\n\n\t<script src=\"./libs/draco/draco_encoder.js\"></script>\n\n\t<script src=\"./libs/jszip.min.js\"></script>\n\n\t<script src=\"./libs/nanobar.js\"></script>\n\n\t<!-- Import maps polyfill -->\n    <!-- Remove this when import maps will be widely supported -->\n    <script async src=\"./libs/es-module-shims.js\"></script>\n\n    <script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n    <script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { Timer } from 't3d/addons/misc/Timer.js';\n\t\timport { Texture2DLoader } from 't3d/addons/loaders/Texture2DLoader.js';\n\t\timport { GLTFLoader } from 't3d/addons/loaders/glTF/GLTFLoader.js';\n\t\timport { GLTFExporter, GLTF_FORMAT } from 't3d/addons/exporters/GLTFExporter.js';\n\t\timport { DRACOExporter } from 't3d/addons/exporters/DRACOExporter.js';\n\t\timport { EnvTextureCubeLoader } from 't3d/addons/loaders/EnvLoader.js';\n\t\timport { OrbitControls } from 't3d/addons/controls/OrbitControls.js';\n\t\timport { ForwardRenderer } from 't3d/addons/render/ForwardRenderer.js';\n\t\timport { GUI } from './libs/lil-gui.esm.min.js';\n\n\t\tconst devicePixelRatio = window.devicePixelRatio;\n\n\t\tlet width = window.innerWidth || 2;\n\t\tlet height = window.innerHeight || 2;\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = Math.floor(width * devicePixelRatio);\n\t\tcanvas.height = Math.floor(height * devicePixelRatio);\n\t\tcanvas.style.width = width + 'px';\n\t\tcanvas.style.height = height + 'px';\n\t\tdocument.body.appendChild(canvas);\n\n\t\tconst forwardRenderer = new ForwardRenderer(canvas);\n\t\tforwardRenderer.screenRenderTarget.setColorClearValue(0.6, 0.7, 0.8, 1);\n\n\t\tconst scene = new t3d.Scene();\n\n\t\tnew EnvTextureCubeLoader()\n\t\t\t.setRenderer(forwardRenderer)\n\t\t\t.loadAsync('./resources/hdr/Grand_Canyon_C.env').then(cubeTexture => {\n\t\t\t\tscene.environment = cubeTexture;\n\t\t\t});\n\n\t\tconst camera = new t3d.Camera();\n\t\tcamera.outputEncoding = t3d.TEXEL_ENCODING_TYPE.SRGB;\n\t\tcamera.position.set(4, 8, 10);\n\t\tcamera.lookAt(new t3d.Vector3(0, 2, 0), new t3d.Vector3(0, 1, 0));\n\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 1000);\n\t\tscene.add(camera);\n\n\t\tconst controller = new OrbitControls(camera, canvas);\n\t\tcontroller.target.set(0, 1, 0);\n\n\t\tconst planeGeometry = new t3d.PlaneGeometry(10, 10);\n\t\tconst planeMaterial = new t3d.PBRMaterial();\n\t\tplaneMaterial.roughness = 1;\n\t\tplaneMaterial.diffuse.setHex(0x888888);\n\t\tconst plane = new t3d.Mesh(planeGeometry, planeMaterial);\n\t\tplane.receiveShadow = true;\n\t\tscene.add(plane);\n\n\t\tconst ambientLight = new t3d.AmbientLight(0xffffff, 0.4);\n\t\tscene.add(ambientLight);\n\n\t\tconst directionalLight = new t3d.DirectionalLight(0xffffff, 1);\n\t\tdirectionalLight.position.set(-4, 5, 4);\n\t\tdirectionalLight.lookAt(new t3d.Vector3(), new t3d.Vector3(0, 1, 0));\n\t\tdirectionalLight.shadow.windowSize = 8;\n\t\tdirectionalLight.shadow.cameraNear = 2;\n\t\tdirectionalLight.shadow.cameraFar = 20;\n\t\tdirectionalLight.castShadow = true;\n\t\tscene.add(directionalLight);\n\n\t\t// load models\n\n\t\tlet clips = [];\n\n\t\tconst auxRoot = new t3d.Object3D();\n\t\tauxRoot.name = 'aux-root';\n\t\tscene.add(auxRoot);\n\n\t\tconst animation = new t3d.AnimationMixer();\n\n\t\tconst nanobar = new Nanobar();\n\t\tnanobar.el.style.background = 'gray';\n\n\t\tconst loadingManager = new t3d.LoadingManager(function() {\n\t\t\tnanobar.go(100);\n\t\t\tnanobar.el.style.background = 'transparent';\n\t\t}, function(url, itemsLoaded, itemsTotal) {\n\t\t\tif (itemsLoaded < itemsTotal) {\n\t\t\t\tnanobar.go(itemsLoaded / itemsTotal * 100);\n\t\t\t}\n\t\t});\n\n\t\tconst loader = new GLTFLoader(loadingManager);\n\n\t\tfunction loadModel(task) {\n\t\t\treturn loader.load('./resources/models/gltf/' + task[0]).then(function(result) {\n\t\t\t\tconst object = result.root;\n\n\t\t\t\tobject.position.fromArray(task[1]);\n\n\t\t\t\tif (task[2] !== undefined) {\n\t\t\t\t\tobject.scale.setScalar(task[2]);\n\t\t\t\t}\n\n\t\t\t\tobject.traverse(function(node) {\n\t\t\t\t\tif (node.material) {\n\t\t\t\t\t\tnode.castShadow = true;\n\t\t\t\t\t\tnode.frustumCulled = false;\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\tif (result.animations && result.animations.length > 0) {\n\t\t\t\t\tclips = clips.concat(result.animations);\n\t\t\t\t\tconst action = new t3d.AnimationAction(result.animations[0]);\n\t\t\t\t\taction.weight = 1;\n\t\t\t\t\tanimation.addAction(action);\n\t\t\t\t}\n\n\t\t\t\tauxRoot.add(object);\n\t\t\t});\n\t\t}\n\n\t\tconst loadTask = [\n\t\t\t['UinoSpaceman/glTF-Binary/UinoSpaceman.glb', [-3, 0, -1]],\n\t\t\t['DamagedHelmet/glTF/DamagedHelmet.gltf', [3, 1, -1]],\n\t\t\t['Flamingo.glb', [0, 1, -1], 0.02]\n\t\t];\n\n\t\tconst textureLoader = new Texture2DLoader(loadingManager);\n\t\tconst loadTextureTask = textureLoader.loadAsync('./resources/UV_Grid_Sm.jpg');\n\n\t\tPromise.all(loadTask.map(loadModel).concat(loadTextureTask)).then(function(result) {\n\t\t\tconsole.log('All models loaded');\n\n\t\t\tconst texture = result[result.length - 1];\n\t\t\ttexture.encoding = t3d.TEXEL_ENCODING_TYPE.SRGB;\n\n\t\t\tunlitMaterial.diffuseMap = texture;\n\t\t\tunlitMaterial.needsUpdate = true;\n\n\t\t\tpbrMaterial.diffuseMap = texture;\n\t\t\tpbrMaterial.needsUpdate = true;\n\n\t\t\tbutton.enable();\n\t\t}).catch(e => console.error(e));\n\n\t\tconst sphereGeometry = new t3d.SphereGeometry(0.5, 32, 32);\n\n\t\t// unlit sphere\n\t\tconst unlitMaterial = new t3d.BasicMaterial();\n\t\tunlitMaterial.envMap = undefined;\n\t\tconst unlitSphere = new t3d.Mesh(sphereGeometry, unlitMaterial);\n\t\tunlitSphere.position.set(2, 1, 2);\n\t\tunlitSphere.castShadow = true;\n\t\tscene.add(unlitSphere);\n\n\t\t// pbr sphere\n\t\tconst pbrMaterial = new t3d.PBRMaterial();\n\t\tpbrMaterial.roughness = 0.5;\n\t\tpbrMaterial.metalness = 0.5;\n\t\tconst pbrSphere = new t3d.Mesh(sphereGeometry, pbrMaterial);\n\t\tpbrSphere.position.set(-2, 1, 2);\n\t\tpbrSphere.castShadow = true;\n\t\tscene.add(pbrSphere);\n\n\t\t// gui\n\n\t\tconst exportOptions = {\n\t\t\tformat: GLTF_FORMAT.GLTF,\n\t\t\tdraco: false,\n\t\t\tonlyVisible: true,\n\t\t\tmaxTextureSize: Infinity,\n\t\t\twrapRoot: false\n\t\t};\n\n\t\tconst exporter = new GLTFExporter();\n\t\texporter.setDRACOExporter(new DRACOExporter());\n\t\texporter.dracoOptions.decodeSpeed = 5;\n\t\texporter.dracoOptions.encodeSpeed = 5;\n\t\texporter.dracoOptions.quantization = [16, 8, 8, 8, 8];\n\n\t\tconst gui = new GUI();\n\t\tgui.add(exportOptions, 'format', [GLTF_FORMAT.GLTF, GLTF_FORMAT.GLB, GLTF_FORMAT.GLTF_SEPARATE]);\n\t\tgui.add(exportOptions, 'onlyVisible');\n\t\tgui.add(exportOptions, 'maxTextureSize', [64, 128, 256, 512, 1024, 2048, Infinity]);\n\t\tgui.add(exportOptions, 'wrapRoot');\n\t\tgui.add(exportOptions, 'draco');\n\t\tconst dracoFolder = gui.addFolder('DRACO').close();\n\t\tdracoFolder.add(exporter.dracoOptions, 'decodeSpeed', 0, 10, 1);\n\t\tdracoFolder.add(exporter.dracoOptions, 'encodeSpeed', 0, 10, 1);\n\t\tdracoFolder.add(exporter.dracoOptions.quantization, '0', 4, 16, 1).name('position');\n\t\tdracoFolder.add(exporter.dracoOptions.quantization, '1', 4, 16, 1).name('normal');\n\t\tdracoFolder.add(exporter.dracoOptions.quantization, '2', 4, 16, 1).name('color');\n\t\tdracoFolder.add(exporter.dracoOptions.quantization, '3', 4, 16, 1).name('texcoord');\n\t\tdracoFolder.add(exporter.dracoOptions.quantization, '4', 4, 16, 1).name('generic');\n\t\tconst button = gui.add({\n\t\t\texport: async function() {\n\t\t\t\tplane.ignoreForExport = true;\n\t\t\t\texportOptions.animations = clips;\n\t\t\n\t\t\t\tconst result = await exporter.parseAsync(scene, exportOptions);\n\t\t\n\t\t\t\tif (exportOptions.format === GLTF_FORMAT.GLB) {\n\t\t\t\t\tsaveGLB(result, 'scene');\n\t\t\t\t} else if (exportOptions.format === GLTF_FORMAT.GLTF_SEPARATE) {\n\t\t\t\t\tsaveZIP(result, 'scene');\n\t\t\t\t} else {\n\t\t\t\t\tsaveGLTF(result, 'scene');\n\t\t\t\t}\n\t\t\t}\n\t\t}, 'export').disable();\n\n\t\tconst link = document.createElement('a');\n\t\tlink.style.display = 'none';\n\t\tdocument.body.appendChild(link); // Firefox workaround, see #6594\n\n\t\tfunction save(blob, filename) {\n\t\t\tlink.href = URL.createObjectURL(blob);\n\t\t\tlink.download = filename;\n\t\t\tlink.click();\n\n\t\t\t// URL.revokeObjectURL( url ); breaks Firefox...\n\t\t}\n\n\t\tfunction saveGLTF(json, filename) {\n\t\t\tconst text = JSON.stringify(json, null, 2);\n\t\t\tsave(new Blob([text], { type: 'text/plain' }), filename + '.gltf');\n\t\t}\n\n\t\tfunction saveGLB(buffer, filename) {\n\t\t\tsave(new Blob([buffer], { type: 'application/octet-stream' }), filename + '.glb');\n\t\t}\n\n\t\tfunction saveZIP(result, filename) {\n\t\t\tconst zip = new JSZip(); // eslint-disable-line no-undef\n\n\t\t\tzip.file(filename + '.gltf', JSON.stringify(result.json, null, 2));\n\n\t\t\tresult.resources.forEach(({ name, ext, content }) => {\n\t\t\t\tif (ext === 'bin') {\n\t\t\t\t\tzip.file(name + '.' + ext, content);\n\t\t\t\t} else {\n\t\t\t\t\tzip.file(name + '.' + ext, dataURLToBase64(content), { base64: true });\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tzip.generateAsync({ type: 'blob' }).then(function(content) {\n\t\t\t\tsave(content, filename + '.zip');\n\t\t\t});\n\t\t}\n\n\t\tfunction dataURLToBase64(dataURL) {\n\t\t\tconst base64Index = dataURL.indexOf(',');\n\t\t\treturn dataURL.slice(base64Index + 1);\n\t\t}\n\n\t\t//\n\n\t\tconst timer = new Timer();\n\n\t\tfunction loop(timestamp) {\n\t\t\trequestAnimationFrame(loop);\n\n\t\t\ttimer.update(timestamp);\n\n\t\t\tcontroller.update();\n\n\t\t\tanimation && animation.update(timer.getDelta());\n\n\t\t\tforwardRenderer.render(scene, camera);\n\t\t}\n\t\trequestAnimationFrame(loop);\n\n\t\tfunction onWindowResize() {\n\t\t\twidth = window.innerWidth || 2;\n\t\t\theight = window.innerHeight || 2;\n\n\t\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 1000);\n\n\t\t\tforwardRenderer.screenRenderTarget.resize(Math.floor(width * devicePixelRatio), Math.floor(height * devicePixelRatio));\n\n\t\t\tcanvas.style.width = width + 'px';\n\t\t\tcanvas.style.height = height + 'px';\n\t\t}\n\t\twindow.addEventListener('resize', onWindowResize, false);\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "examples/files/fonts/OFL-hind.txt",
    "content": "Copyright (c) 2014, Indian Type Foundry (info@indiantypefoundry.com).\n\nThis Font Software is licensed under the SIL Open Font License, Version 1.1.\nThis license is copied below, and is also available with a FAQ at:\nhttp://scripts.sil.org/OFL\n\n\n-----------------------------------------------------------\nSIL OPEN FONT LICENSE Version 1.1 - 26 February 2007\n-----------------------------------------------------------\n\nPREAMBLE\nThe goals of the Open Font License (OFL) are to stimulate worldwide\ndevelopment of collaborative font projects, to support the font creation\nefforts of academic and linguistic communities, and to provide a free and\nopen framework in which fonts may be shared and improved in partnership\nwith others.\n\nThe OFL allows the licensed fonts to be used, studied, modified and\nredistributed freely as long as they are not sold by themselves. The\nfonts, including any derivative works, can be bundled, embedded, \nredistributed and/or sold with any software provided that any reserved\nnames are not used by derivative works. The fonts and derivatives,\nhowever, cannot be released under any other type of license. The\nrequirement for fonts to remain under this license does not apply\nto any document created using the fonts or their derivatives.\n\nDEFINITIONS\n\"Font Software\" refers to the set of files released by the Copyright\nHolder(s) under this license and clearly marked as such. This may\ninclude source files, build scripts and documentation.\n\n\"Reserved Font Name\" refers to any names specified as such after the\ncopyright statement(s).\n\n\"Original Version\" refers to the collection of Font Software components as\ndistributed by the Copyright Holder(s).\n\n\"Modified Version\" refers to any derivative made by adding to, deleting,\nor substituting -- in part or in whole -- any of the components of the\nOriginal Version, by changing formats or by porting the Font Software to a\nnew environment.\n\n\"Author\" refers to any designer, engineer, programmer, technical\nwriter or other person who contributed to the Font Software.\n\nPERMISSION & CONDITIONS\nPermission is hereby granted, free of charge, to any person obtaining\na copy of the Font Software, to use, study, copy, merge, embed, modify,\nredistribute, and sell modified and unmodified copies of the Font\nSoftware, subject to the following conditions:\n\n1) Neither the Font Software nor any of its individual components,\nin Original or Modified Versions, may be sold by itself.\n\n2) Original or Modified Versions of the Font Software may be bundled,\nredistributed and/or sold with any software, provided that each copy\ncontains the above copyright notice and this license. These can be\nincluded either as stand-alone text files, human-readable headers or\nin the appropriate machine-readable metadata fields within text or\nbinary files as long as those fields can be easily viewed by the user.\n\n3) No Modified Version of the Font Software may use the Reserved Font\nName(s) unless explicit written permission is granted by the corresponding\nCopyright Holder. This restriction only applies to the primary font name as\npresented to the users.\n\n4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font\nSoftware shall not be used to promote, endorse or advertise any\nModified Version, except to acknowledge the contribution(s) of the\nCopyright Holder(s) and the Author(s) or with their explicit written\npermission.\n\n5) The Font Software, modified or unmodified, in part or in whole,\nmust be distributed entirely under this license, and must not be\ndistributed under any other license. The requirement for fonts to\nremain under this license does not apply to any document created\nusing the Font Software.\n\nTERMINATION\nThis license becomes null and void if any of the above conditions are\nnot met.\n\nDISCLAIMER\nTHE FONT SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT\nOF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE\nCOPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\nINCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL\nDAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\nFROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM\nOTHER DEALINGS IN THE FONT SOFTWARE.\n"
  },
  {
    "path": "examples/files/fonts/OFL-montserrat.txt",
    "content": "Copyright 2011 The Montserrat Project Authors (https://github.com/JulietaUla/Montserrat)\n\nThis Font Software is licensed under the SIL Open Font License, Version 1.1.\nThis license is copied below, and is also available with a FAQ at:\nhttp://scripts.sil.org/OFL\n\n\n-----------------------------------------------------------\nSIL OPEN FONT LICENSE Version 1.1 - 26 February 2007\n-----------------------------------------------------------\n\nPREAMBLE\nThe goals of the Open Font License (OFL) are to stimulate worldwide\ndevelopment of collaborative font projects, to support the font creation\nefforts of academic and linguistic communities, and to provide a free and\nopen framework in which fonts may be shared and improved in partnership\nwith others.\n\nThe OFL allows the licensed fonts to be used, studied, modified and\nredistributed freely as long as they are not sold by themselves. The\nfonts, including any derivative works, can be bundled, embedded, \nredistributed and/or sold with any software provided that any reserved\nnames are not used by derivative works. The fonts and derivatives,\nhowever, cannot be released under any other type of license. The\nrequirement for fonts to remain under this license does not apply\nto any document created using the fonts or their derivatives.\n\nDEFINITIONS\n\"Font Software\" refers to the set of files released by the Copyright\nHolder(s) under this license and clearly marked as such. This may\ninclude source files, build scripts and documentation.\n\n\"Reserved Font Name\" refers to any names specified as such after the\ncopyright statement(s).\n\n\"Original Version\" refers to the collection of Font Software components as\ndistributed by the Copyright Holder(s).\n\n\"Modified Version\" refers to any derivative made by adding to, deleting,\nor substituting -- in part or in whole -- any of the components of the\nOriginal Version, by changing formats or by porting the Font Software to a\nnew environment.\n\n\"Author\" refers to any designer, engineer, programmer, technical\nwriter or other person who contributed to the Font Software.\n\nPERMISSION & CONDITIONS\nPermission is hereby granted, free of charge, to any person obtaining\na copy of the Font Software, to use, study, copy, merge, embed, modify,\nredistribute, and sell modified and unmodified copies of the Font\nSoftware, subject to the following conditions:\n\n1) Neither the Font Software nor any of its individual components,\nin Original or Modified Versions, may be sold by itself.\n\n2) Original or Modified Versions of the Font Software may be bundled,\nredistributed and/or sold with any software, provided that each copy\ncontains the above copyright notice and this license. These can be\nincluded either as stand-alone text files, human-readable headers or\nin the appropriate machine-readable metadata fields within text or\nbinary files as long as those fields can be easily viewed by the user.\n\n3) No Modified Version of the Font Software may use the Reserved Font\nName(s) unless explicit written permission is granted by the corresponding\nCopyright Holder. This restriction only applies to the primary font name as\npresented to the users.\n\n4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font\nSoftware shall not be used to promote, endorse or advertise any\nModified Version, except to acknowledge the contribution(s) of the\nCopyright Holder(s) and the Author(s) or with their explicit written\npermission.\n\n5) The Font Software, modified or unmodified, in part or in whole,\nmust be distributed entirely under this license, and must not be\ndistributed under any other license. The requirement for fonts to\nremain under this license does not apply to any document created\nusing the Font Software.\n\nTERMINATION\nThis license becomes null and void if any of the above conditions are\nnot met.\n\nDISCLAIMER\nTHE FONT SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT\nOF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE\nCOPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\nINCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL\nDAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\nFROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM\nOTHER DEALINGS IN THE FONT SOFTWARE.\n"
  },
  {
    "path": "examples/files/main.css",
    "content": ":root {\n    color-scheme: light dark;\n\n    --background-color: #f7f7f7;\n\n    --active-text-color: #FF7F02;\n    --text-color: #5e5e5e;\n    --secondary-text-color: #9e9e9e;\n    --thirdary-text-color: #444;\n\n    --font-size: 16px;\n    --line-height: 26px;\n\n    --border-style: 1px solid #E8E8E8;\n    --header-height: 80px;\n    --panel-width: 300px;\n    --panel-padding: 16px;\n    --icon-size: 20px;\n}\n\n@media (prefers-color-scheme: dark) {\n\t:root {\n\t\t--background-color: #2e2e2e;\n\n\t\t--text-color: #a7a7a7;\n\t\t--secondary-text-color: #888;\n        --thirdary-text-color: #ccc;\n\n\t\t--border-style: 1px solid #444;\n\t}\n}\n\n@font-face {\n    font-family: 'heading';\n    src: url('./fonts/Muli-Black.ttf') format('truetype');\n    font-display: fallback;\n}\n\n@font-face {\n    font-family: 'body';\n    src: url('./fonts/Montserrat-Regular.ttf') format('truetype');\n    font-display: fallback;\n}\n\n* {\n    box-sizing: border-box;\n    -webkit-font-smoothing: antialiased;\n    -moz-osx-font-smoothing: grayscale;\n}\n\nhtml, body {\n    height: 100%;\n}\n\nhtml {\n    font-size: var(--font-size);\n    line-height: var(--line-height);\n}\n\nbody {\n    font-family: \"body\", \"Arial\", sans-serif;\n    margin: 0px;\n    color: var(--secondary-text-color);\n    background-color: var(--background-color);\n}\n\na {\n    text-decoration: none;\n}\n\nh1 {\n    font-family: \"heading\", \"Arial\", sans-serif;\n    font-size: calc(var(--font-size) + 10px);\n    line-height: 24px;\n    font-weight: 500;\n}\n\nh2 {\n    font-family: \"heading\", \"Arial\", sans-serif;\n    padding: 0;\n    margin: 16px 0;\n    font-size: calc(var(--font-size) + 14px);\n    font-weight: 500;\n    line-height: var(--line-height);    \n}\n\nh1 a {\n    color: var(--active-text-color);\n}\n\n#header {\n    display: flex;\n    height: var(--header-height);\n    border-bottom: var(--border-style);\n    align-items: center;\n}\n\n#header h1 {\n    padding-left: var(--panel-padding);\n    flex: 1;\n}\n\n#panel {\n    position: fixed;\n    z-index: 100;\n    left: 0px;\n    width: var(--panel-width);\n    height: 100%;\n    overflow: auto;\n    border-right: var(--border-style);\n    display: flex;\n    flex-direction: column;\n}\n\n#expandButton {\n    width: 32px;\n    height: 32px;\n    position: absolute;\n    right: 16px;\n    top: 12px;\n    display: none;\n    cursor: pointer;\n    background-color: var(--active-text-color);\n    background-size: var(--icon-size);\n    -webkit-mask-image: url(./ic_menu_black_24dp.svg);\n    -webkit-mask-position: 50% 50%;\n    -webkit-mask-repeat: no-repeat;\n    mask-image: url(./ic_menu_black_24dp.svg);\n    mask-position: 50% 50%;\n    mask-repeat: no-repeat;  \n}\n\n#panel #content {\n    flex: 1;\n    overflow-y: auto;\n    overflow-x: hidden;\n    -webkit-overflow-scrolling: touch;\n    padding: 0px var(--panel-padding) var(--panel-padding) var(--panel-padding);\n}\n\n#panel #content .link {\n    color: var(--text-color);\n    display: block;\n}\n\n#panel #content .link:hover {\n    text-decoration: underline;\n    color: var(--thirdary-text-color);\n}\n\n#panel #content .selected {\n    color: var(--active-text-color) !important;\n}\n\n#viewer {\n    position: absolute;\n    border: 0px;\n    padding-left: var(--panel-width);\n    left: 0;\n    right: 0;\n    width: 100%;\n    height: 100%;\n    overflow: auto;\n}\n\n#button {\n    position: fixed;\n    bottom: 16px;\n    right: 16px;\n    padding: 12px;\n    border-radius: 50%;\n    margin-bottom: 0px;\n    background-color: #fff;\n    opacity: 0.9;\n    z-index: 999;\n    color: #fff;\n\n    box-shadow: 0 0 4px rgba(0, 0, 0, .15);\n}\n\n#button:hover {\n    cursor: pointer;\n    opacity: 1;\n}\n\n#button img {\n    display: block;\n    width: var(--icon-size);\n}\n\n/* mobile */\n\n@media all and (max-width: 640px) {\n    :root {\n        --header-height: 56px;\n        --icon-size: 24px;\n    }\n\n    h1{\n        font-size: 20px;\n    }\n\n    #expandButton {\n        display: block;\n    }\n\n    #panel {\n        position: absolute;\n        left: 0;\n        top: 0;\n        width: 100%;\n        right: 0;\n        z-index: 1000;\n        overflow: hidden;\n        border: none;\n        height: var(--header-height);\n        transition: 0s 0.2s height;\n    }\n\n    #panel.open {\n        height: 100%;\n        transition: 0s 0s height;\n    }\n\n    #panelScrim {\n\t\tpointer-events: none;\n\t\tbackground-color: rgba(0, 0, 0, 0);\n\t\tposition: absolute;\n\t\tleft: 0;\n\t\tright: 0;\n\t\ttop: 0;\n\t\tbottom: 0;\n\t\ttransition: .2s background-color;\n\t}\n\n    #panel.open #panelScrim {\n\t\tpointer-events: auto;\n\t\tbackground-color: rgba(0, 0, 0, 0.4);\n\t}\n\n    #content {\n        position: absolute;\n        right: 0;\n        top: 0;\n        bottom: 0;\n        background: var(--background-color);\n        box-shadow: 0 0 8px rgba(0,0,0,.1);\n        width: calc(100vw - 60px);\n        max-width: 360px;\n        transition: .25s transform;\n        font-size: 17px;\n        margin-right: -380px;\n\t\tline-height: 2rem;\n    }\n\n    #panel.open #content {\n        transform: translate3d(-380px, 0 ,0);\n    }\n\n    #viewer {\n        left: 0;\n        top: var(--header-height);\n        width: 100%;\n        height: calc(100% - var(--header-height));\n        padding-left: 0;\n    }\n}"
  },
  {
    "path": "examples/files.json",
    "content": "{\n\t\"light\": [\n\t\t\"light_directlight\",\n\t\t\"light_pointlight\",\n\t\t\"light_spotlight\",\n\t\t\"light_rectarealight\",\n\t\t\"light_hemispherelight\",\n\t\t\"light_sphericalharmonicslight\",\n\t\t\"light_shadow\",\n\t\t\"light_shadow_adapter\",\n\t\t\"light_softshadow\",\n\t\t\"light_group\"\n\t],\n\t\"geometry\": [\n\t\t\"geometry_geometries\",\n\t\t\"geometry_loader_assimp2json\",\n\t\t\"geometry_loader_vox\",\n\t\t\"geometry_loader_gltf\",\n\t\t\"geometry_loader_gltf2\",\n\t\t\"geometry_loader_gltf3\",\n\t\t\"geometry_loader_gltf_helmat\",\n\t\t\"geometry_loader_gltf_tangent\",\n\t\t\"geometry_loader_gltf_lights\",\n\t\t\"geometry_loader_gltf_skinning\",\n\t\t\"geometry_loader_gltf_morphtargets\",\n\t\t\"geometry_loader_gltf_instancing\",\n\t\t\"geometry_loader_gltf_materials_unlit\",\n\t\t\"geometry_loader_gltf_materials_clearcoat\",\n\t\t\"geometry_loader_gltf_materials_transmission\",\n\t\t\"geometry_loader_gltf_materials_dispersion\",\n\t\t\"geometry_loader_gltf_uvtransform\",\n\t\t\"geometry_loader_gltf_draco\",\n\t\t\"geometry_loader_gltf_meshopt\",\n\t\t\"geometry_loader_gltf_camera\",\n\t\t\"geometry_loader_gltf_avif\",\n\t\t\"geometry_loader_gltf_pointer\",\n\t\t\"geometry_builder_shapes\",\n\t\t\"geometry_builder_lines\",\n\t\t\"geometry_builder_edges\",\n\t\t\"geometry_groups\",\n\t\t\"geometry_boundings\"\n\t],\n\t\"material\": [\n\t\t\"material_materials\",\n\t\t\"material_depth\",\n\t\t\"material_pbr\",\n\t\t\"material_normalmap\",\n\t\t\"material_emissivemap\",\n\t\t\"material_bumpmap\",\n\t\t\"material_lightmap\",\n\t\t\"material_envmap\",\n\t\t\"material_uvtransform\",\n\t\t\"material_uvcoord\",\n\t\t\"material_transparent\",\n\t\t\"material_blending\",\n\t\t\"material_flatshading\",\n\t\t\"material_vertexcolors\",\n\t\t\"material_clippingplanes\",\n\t\t\"material_clearcoat\",\n\t\t\"material_alphamask\",\n\t\t\"material_alphahash\",\n\t\t\"material_shadermaterial\",\n\t\t\"material_shader_shadow\",\n\t\t\"material_shader_matcap\",\n\t\t\"material_shader_background\",\n\t\t\"material_shader_skybox\",\n\t\t\"material_shader_skybox_filter\",\n\t\t\"material_shader_skybox_groundprojected\",\n\t\t\"material_shader_sky\",\n\t\t\"material_shader_sky2\",\n\t\t\"material_shader_sky_gradient\",\n\t\t\"material_shader_water\",\n\t\t\"material_shader_water_pbr\",\n\t\t\"material_shader_xray\",\n\t\t\"material_shader_grid\",\n\t\t\"material_shader_extend\",\n\t\t\"material_shader_fakeInterior\",\n\t\t\"material_shader_volume\",\n\t\t\"material_shader_volume_layered\"\n\t],\n\t\"texture\": [\n\t\t\"texture_anisotropic\",\n\t\t\"texture_mipmap\",\n\t\t\"texture_video\",\n\t\t\"texture_integer\",\n\t\t\"texture_depth\",\n\t\t\"texture_2darray\",\n\t\t\"texture_3d\",\n\t\t\"texture_loader_imagebitmap\",\n\t\t\"texture_loader_hdr\",\n\t\t\"texture_loader_hdr_panorama\",\n\t\t\"texture_loader_hdr_cube\",\n\t\t\"texture_loader_exr\",\n\t\t\"texture_loader_env\",\n\t\t\"texture_loader_ktx2\",\n\t\t\"texture_loader_compressed_dds\",\n\t\t\"texture_loader_compressed_pvr\",\n\t\t\"texture_loader_tga\",\n\t\t\"texture_generator_heatmap\",\n\t\t\"texture_generator_idwmap\"\n\t],\n\t\"scene\": [\n\t\t\"scene_fog\",\n\t\t\"scene_gamma_correction\",\n\t\t\"scene_anchor\",\n\t\t\"scene_clippingplanes\"\n\t],\n\t\"camera\": [\n\t\t\"camera_projection\",\n\t\t\"camera_multiple\"\n\t],\n\t\"controls\": [\n\t\t\"controls_camera_orbit\",\n\t\t\"controls_camera_fly\",\n\t\t\"controls_camera_free\",\n\t\t\"controls_camera_view\",\n\t\t\"controls_transform\"\n\t],\n\t\"probes\": [\n\t\t\"probes_reflection\",\n\t\t\"probes_reflection_planar\"\n\t],\n\t\"math\": [\n\t\t\"math_curve\",\n\t\t\"math_curve_motion\",\n\t\t\"math_octree\",\n\t\t\"math_obb\"\n\t],\n\t\"sprite\": [\n\t\t\"sprite_sprites\"\n\t],\n\t\"points\": [\n\t\t\"points_sprites\"\n\t],\n\t\"lines\": [\n\t\t\"lines_lines\",\n\t\t\"lines_dashedlines\",\n\t\t\"lines_instancedlines\"\n\t],\n\t\"text\": [\n\t\t\"text_typeface\",\n\t\t\"text_sdf\",\n\t\t\"text_sdf_dynamic\",\n\t\t\"text_bitmap\",\n\t\t\"text_bitmap_dynamic\"\n\t],\n\t\"canvas2d\": [\n\t\t\"canvas2d_canvas2d\"\n\t],\n\t\"raycast\": [\n\t\t\"raycast_raycaster\"\n\t],\n\t\"stereo\": [\n\t\t\"stereo_anaglyph\",\n\t\t\"stereo_webvr_car\",\n\t\t\"stereo_webxr_vr_car\"\n\t],\n\t\"physics\": [\n\t\t\"physics_cannon\",\n\t\t\"physics_ammo\",\n\t\t\"physics_ammo_softbody_volume\",\n\t\t\"physics_rapier\",\n\t\t\"physics_rapier_character_controller\",\n\t\t\"physics_ik\"\n\t],\n\t\"navigation\": [\n\t\t\"navigation_recast_generation\",\n\t\t\"navigation_recast_crowd\",\n\t\t\"navigation_recast_obstacles\",\n\t\t\"navigation_recast_walking\",\n\t\t\"navigation_pathfinding\"\n\t],\n\t\"particle\": [\n\t\t\"particle_particle\"\n\t],\n\t\"animation\": [\n\t\t\"animation_morphtargets\",\n\t\t\"animation_skinned_mesh\",\n\t\t\"animation_keyframe_animation\",\n\t\t\"animation_snake\",\n\t\t\"animation_multiple\",\n\t\t\"animation_crossfade\",\n\t\t\"animation_blending_additive\",\n\t\t\"animation_bone_attach\",\n\t\t\"animation_skinned_instancing\",\n\t\t\"animation_interpolant\"\n\t],\n\t\"custompass\": [\n\t\t\"custompass_car\",\n\t\t\"custompass_deferred\",\n\t\t\"custompass_gbuffer\",\n\t\t\"custompass_ssao\",\n\t\t\"custompass_sketch\",\n\t\t\"custompass_ssr\",\n\t\t\"custompass_dof\",\n\t\t\"custompass_taa\",\n\t\t\"custompass_bloom\",\n\t\t\"custompass_unrealbloom\",\n\t\t\"custompass_blur\",\n\t\t\"custompass_msaa\",\n\t\t\"custompass_motion_blur\",\n\t\t\"custompass_motion_blur2\",\n\t\t\"custompass_depth_texture_share\",\n\t\t\"custompass_depth_buffer_share\",\n\t\t\"custompass_gpupick\",\n\t\t\"custompass_lensflare\",\n\t\t\"custompass_transmission\",\n\t\t\"custompass_shadow_planar\",\n\t\t\"custompass_oit\",\n\t\t\"custompass_rendertarget_2d\",\n\t\t\"custompass_rendertarget_3d\",\n\t\t\"custompass_xray\"\n\t],\n\t\"renderer\": [\n\t\t\"renderer_culling_frustum\",\n\t\t\"renderer_culling_contribution\",\n\t\t\"renderer_deferred\",\n\t\t\"renderer_deferred_lighting\",\n\t\t\"renderer_clustered_lighting\"\n\t],\n\t\"webgl\": [\n\t\t\"webgl_depthfunc\",\n\t\t\"webgl_instanced_draw\",\n\t\t\"webgl_multi_draw\",\n\t\t\"webgl_mesh_batch\",\n\t\t\"webgl_polygonoffset\",\n\t\t\"webgl_logarithmicDepthBuffer\",\n\t\t\"webgl_canvas_transparent\",\n\t\t\"webgl_stencil\",\n\t\t\"webgl_external_texture\",\n\t\t\"webgl_external_buffer\",\n\t\t\"webgl_primitive_restart\",\n\t\t\"webgl_clipculldistance\",\n\t\t\"webgl_renderinfo\",\n\t\t\"webgl_query_occlusion\",\n\t\t\"webgl_query_occlusion_proxy\",\n\t\t\"webgl_query_timer\",\n\t\t\"webgl_helpers\",\n\t\t\"webgl_contextlost\",\n\t\t\"webgl_shader_compile\",\n\t\t\"webgl_shader_precompile\"\n\t],\n\t\"exporter\": [\n\t\t\"exporter_gltf\",\n\t\t\"exporter_draco\"\n\t],\n\t\"lab\": [\n\t\t\"lab_clouds\",\n\t\t\"lab_clouds_shader\",\n\t\t\"lab_earth\",\n\t\t\"lab_ocean\",\n\t\t\"lab_ocean_fft\",\n\t\t\"lab_ground\",\n\t\t\"lab_texture_variation\",\n\t\t\"lab_ik\",\n\t\t\"lab_gltf_grass\",\n\t\t\"lab_geometry_grass\",\n\t\t\"lab_geometry_images\",\n\t\t\"lab_terrain\",\n\t\t\"lab_water_simulation\",\n\t\t\"lab_histogram\",\n\t\t\"lab_linechart_fill\",\n\t\t\"lab_impostor_octahedral\",\n\t\t\"lab_impostor_octahedral_instancing\"\n\t]\n}\n"
  },
  {
    "path": "examples/geometry_boundings.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n    <meta charset=\"utf-8\">\n    <title>t3d - boundings</title>\n    <meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n    <link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n</head>\n<body>\n    <div id=\"info\">\n        <a href=\"\" target=\"_blank\">t3d</a> - boundings\n    </div>\n\n    <!-- Import maps polyfill -->\n    <!-- Remove this when import maps will be widely supported -->\n    <script async src=\"./libs/es-module-shims.js\"></script>\n\n    <script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n    <script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { GUI } from './libs/lil-gui.esm.min.js';\n\t\timport { ForwardRenderer } from 't3d/addons/render/ForwardRenderer.js';\n\t\timport { Box3Helper } from 't3d/addons/objects/Box3Helper.js';\n\t\timport { SphereHelper } from 't3d/addons/objects/SphereHelper.js';\n\t\timport { OrbitControls } from 't3d/addons/controls/OrbitControls.js';\n\n\t\tlet width = window.innerWidth || 2;\n\t\tlet height = window.innerHeight || 2;\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = width;\n\t\tcanvas.height = height;\n\t\tdocument.body.appendChild(canvas);\n\n\t\tconst forwardRenderer = new ForwardRenderer(canvas);\n\n\t\tforwardRenderer.screenRenderTarget.setColorClearValue(0.6, 0.7, 0.8, 1);\n\n\t\tconst scene = new t3d.Scene();\n\n\t\tconst ambientLight = new t3d.AmbientLight(0xffffff, 0.3);\n\t\tscene.add(ambientLight);\n\n\t\tconst directionalLight = new t3d.DirectionalLight(0xffffff, 0.7);\n\t\tdirectionalLight.position.set(20, 30, 40);\n\t\tdirectionalLight.lookAt(new t3d.Vector3(), new t3d.Vector3(0, 1, 0));\n\t\tdirectionalLight.shadow.windowSize = 100;\n\t\tdirectionalLight.castShadow = true;\n\t\tscene.add(directionalLight);\n\n\t\tconst camera = new t3d.Camera();\n\t\tcamera.position.set(0, 0, 20);\n\t\tcamera.lookAt(new t3d.Vector3(0, 0, 0), new t3d.Vector3(0, 1, 0));\n\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 500);\n\t\tscene.add(camera);\n\n\t\tfunction createMorphtargetsGeometry() {\n\t\t\tconst geometry = new t3d.BoxGeometry(2, 2, 2, 32, 32, 32);\n\n\t\t\t// create an empty array to  hold targets for the attribute we want to morph\n\t\t\t// morphing positions and normals is supported\n\t\t\tgeometry.morphAttributes.position = [];\n\n\t\t\t// the original positions of the cube's vertices\n\t\t\tconst positionAttribute = geometry.attributes['a_Position'];\n\n\t\t\t// for the first morph target we'll move the cube's vertices onto the surface of a sphere\n\t\t\tconst spherePositions = [];\n\n\t\t\t// for the second morph target, we'll twist the cubes vertices\n\t\t\tconst twistPositions = [];\n\t\t\tconst xAxis = new t3d.Vector3(1, 0, 0);\n\t\t\tconst quaternion = new t3d.Quaternion();\n\t\t\tconst vertex = new t3d.Vector3();\n\n\t\t\tfor (let i = 0; i < positionAttribute.buffer.count; i++) {\n\t\t\t\tconst x = positionAttribute.buffer.array[i * 3];\n\t\t\t\tconst y = positionAttribute.buffer.array[i * 3 + 1];\n\t\t\t\tconst z = positionAttribute.buffer.array[i * 3 + 2];\n\n\t\t\t\tspherePositions.push(\n\t\t\t\t\tx * Math.sqrt(1 - (y * y / 2) - (z * z / 2) + (y * y * z * z / 3)),\n\t\t\t\t\ty * Math.sqrt(1 - (z * z / 2) - (x * x / 2) + (z * z * x * x / 3)),\n\t\t\t\t\tz * Math.sqrt(1 - (x * x / 2) - (y * y / 2) + (x * x * y * y / 3))\n\t\t\t\t);\n\n\t\t\t\t// stretch along the x-axis so we can see the twist better\n\t\t\t\tvertex.set(x * 2, y, z);\n\t\t\t\tquaternion.setFromAxisAngle(xAxis, Math.PI * x / 2);\n\t\t\t\tvertex.applyQuaternion(quaternion);\n\n\t\t\t\tvertex.toArray(twistPositions, twistPositions.length);\n\t\t\t}\n\n\t\t\t// add the spherical positions as the first morph target\n\t\t\tgeometry.morphAttributes.position[0] = new t3d.Attribute(new t3d.Buffer(new Float32Array(spherePositions), 3));\n\t\t\t// add the twisted positions as the second morph target\n\t\t\tgeometry.morphAttributes.position[1] = new t3d.Attribute(new t3d.Buffer(new Float32Array(twistPositions), 3));\n\n\t\t\tgeometry.computeBoundingBox();\n\t\t\tgeometry.computeBoundingSphere();\n\n\t\t\treturn geometry;\n\t\t}\n\n\t\tconst geometry = createMorphtargetsGeometry();\n\n\t\tconst material = new t3d.PhongMaterial();\n\n\t\tconst mesh = new t3d.Mesh(geometry, material);\n\t\tmesh.morphTargetInfluences = [1, 1];\n\t\tscene.add(mesh);\n\n\t\t// box3 helper\n\n\t\tconst boxHelper = new Box3Helper(geometry.boundingBox);\n\t\tmesh.add(boxHelper);\n\n\t\t// sphere helper\n\n\t\tconst sphereHelper = new SphereHelper(geometry.boundingSphere, 0x00ffff);\n\t\tmesh.add(sphereHelper);\n\n\t\t// Set up dat.GUI to control targets\n\n\t\tconst params = {\n\t\t\tSpherify: 1,\n\t\t\tTwist: 1,\n\t\t\tBoundingBox: true,\n\t\t\tBoundingSphere: true\n\t\t};\n\n\t\tconst gui = new GUI({ title: 'Morph Targets' });\n\n\t\tgui.add(params, 'Spherify', 0, 1).step(0.01).onChange(function(value) {\n\t\t\tmesh.morphTargetInfluences[0] = value;\n\t\t});\n\n\t\tgui.add(params, 'Twist', 0, 1).step(0.01).onChange(function(value) {\n\t\t\tmesh.morphTargetInfluences[1] = value;\n\t\t});\n\n\t\tgui.add(params, 'BoundingBox').onChange(value => {\n\t\t\tif (value) {\n\t\t\t\tboxHelper.visible = true;\n\t\t\t} else {\n\t\t\t\tboxHelper.visible = false;\n\t\t\t}\n\t\t});\n\n\t\tgui.add(params, 'BoundingSphere').onChange(value => {\n\t\t\tif (value) {\n\t\t\t\tsphereHelper.visible = true;\n\t\t\t} else {\n\t\t\t\tsphereHelper.visible = false;\n\t\t\t}\n\t\t});\n\n\t\tconst controller = new OrbitControls(camera, canvas);\n\n\t\tfunction loop(count) {\n\t\t\trequestAnimationFrame(loop);\n\n\t\t\tcontroller.update();\n\n\t\t\tforwardRenderer.render(scene, camera);\n\t\t}\n\n\t\trequestAnimationFrame(loop);\n\n\t\tfunction onWindowResize() {\n\t\t\twidth = window.innerWidth || 2;\n\t\t\theight = window.innerHeight || 2;\n\n\t\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 500);\n\n\t\t\tforwardRenderer.screenRenderTarget.resize(width, height);\n\t\t}\n\n\t\twindow.addEventListener('resize', onWindowResize, false);\n    </script>\n</body>\n</html>"
  },
  {
    "path": "examples/geometry_builder_edges.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>t3d - geometry edges builder</title>\n\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n\t<link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n</head>\n<body>\n    <div id=\"info\" class=\"dark\">\n        <a href=\"\" target=\"_blank\">t3d</a> - geometry edges builder\n    </div>\n\n\t<!-- Import maps polyfill -->\n    <!-- Remove this when import maps will be widely supported -->\n    <script async src=\"./libs/es-module-shims.js\"></script>\n\n    <script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n    <script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { EdgesBuilder } from 't3d/addons/geometries/builders/EdgesBuilder.js';\n\t\timport { OrbitControls } from 't3d/addons/controls/OrbitControls.js';\n\t\timport { ForwardRenderer } from 't3d/addons/render/ForwardRenderer.js';\n\n\t\tlet width = window.innerWidth || 2;\n\t\tlet height = window.innerHeight || 2;\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = width;\n\t\tcanvas.height = height;\n\t\tdocument.body.appendChild(canvas);\n\n\t\tconst forwardRenderer = new ForwardRenderer(canvas);\n\t\tforwardRenderer.screenRenderTarget.setColorClearValue(0.9, 0.9, 0.9, 1);\n\n\t\tconst scene = new t3d.Scene();\n\t\tscene.fog = new t3d.Fog(undefined, 50, 100);\n\t\tscene.fog.color.setRGB(0.9, 0.9, 0.9);\n\n\t\tconst basicMaterial = new t3d.BasicMaterial();\n\t\tbasicMaterial.diffuse.setHex(0x000000);\n\t\tbasicMaterial.drawMode = t3d.DRAW_MODE.LINES;\n\n\t\tconst cube_geometry = new t3d.BoxGeometry(4, 4, 4);\n\t\tconst sphere_geometry = new t3d.SphereGeometry(2, 16, 12);\n\n\t\tconst geometryData1 = EdgesBuilder.getGeometryData(\n\t\t\tcube_geometry.attributes.a_Position.buffer.array,\n\t\t\tcube_geometry.index.buffer.array,\n\t\t\t{ thresholdAngle: 0.5 }\n\t\t);\n\t\tconst cubeEdgesGeometry = new t3d.Geometry();\n\t\tcubeEdgesGeometry.addAttribute('a_Position', new t3d.Attribute(new t3d.Buffer(new Float32Array(geometryData1.positions), 3)));\n\t\tcubeEdgesGeometry.computeBoundingBox();\n\t\tcubeEdgesGeometry.computeBoundingSphere();\n\t\tconst cubeEdges = new t3d.Mesh(cubeEdgesGeometry, basicMaterial);\n\t\tcubeEdges.position.set(3, 0, 0);\n\t\tscene.add(cubeEdges);\n\t\t\n\t\tconst geometryData2 = EdgesBuilder.getGeometryData(\n\t\t\tsphere_geometry.attributes.a_Position.buffer.array,\n\t\t\tsphere_geometry.index.buffer.array,\n\t\t\t{ thresholdAngle: 0.5 }\n\t\t);\n\t\tconst sphereEdgesGeometry = new t3d.Geometry();\n\t\tsphereEdgesGeometry.addAttribute('a_Position', new t3d.Attribute(new t3d.Buffer(new Float32Array(geometryData2.positions), 3)));\n\t\tsphereEdgesGeometry.computeBoundingBox();\n\t\tsphereEdgesGeometry.computeBoundingSphere();\n\t\tconst sphereEdges = new t3d.Mesh(sphereEdgesGeometry, basicMaterial);\n\t\tsphereEdges.position.set(-3, 0, 0);\n\t\tscene.add(sphereEdges);\n\n\t\tconst plane_geometry = new t3d.PlaneGeometry(1000, 1000);\n\t\tconst plane_material = new t3d.BasicMaterial();\n\t\tplane_material.diffuse.setHex(0xffffff);\n\t\tconst plane = new t3d.Mesh(plane_geometry, plane_material);\n\t\tplane.position.y -= 3;\n\t\tscene.add(plane);\n\n\t\tconst camera = new t3d.Camera();\n\t\tcamera.position.set(0, 3, 20);\n\t\tcamera.lookAt(new t3d.Vector3(0, 0, 0), new t3d.Vector3(0, 1, 0));\n\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 1000);\n\t\tscene.add(camera);\n\n\t\tconst controller = new OrbitControls(camera, canvas);\n\t\t// controller.enablePan = false;\n\n\t\tfunction loop(count) {\n\t\t\trequestAnimationFrame(loop);\n\n\t\t\tcontroller.update();\n\n\t\t\tforwardRenderer.render(scene, camera);\n\t\t}\n\t\trequestAnimationFrame(loop);\n\n\t\tfunction onWindowResize() {\n\t\t\twidth = window.innerWidth || 2;\n\t\t\theight = window.innerHeight || 2;\n\n\t\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 1000);\n\n\t\t\tforwardRenderer.screenRenderTarget.resize(width, height);\n\t\t}\n\t\twindow.addEventListener('resize', onWindowResize, false);\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "examples/geometry_builder_lines.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>t3d - geometry line builders</title>\n\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n\t<link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n</head>\n<body>\n    <div id=\"info\" class=\"dark\">\n        <a href=\"\" target=\"_blank\">t3d</a> - geometry line builders\n    </div>\n\n\t<!-- Import maps polyfill -->\n    <!-- Remove this when import maps will be widely supported -->\n    <script async src=\"./libs/es-module-shims.js\"></script>\n\n    <script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n    <script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { CurveUtils } from 't3d/addons/math/curves/CurveUtils.js';\n\t\timport { CurvePath3 } from 't3d/addons/math/curves/Curves.js';\n\t\timport { TubeBuilder } from 't3d/addons/geometries/builders/TubeBuilder.js';\n\t\timport { RouteBuilder } from 't3d/addons/geometries/builders/RouteBuilder.js';\n\t\timport { GeometryUtils } from 't3d/addons/geometries/GeometryUtils.js';\n\t\timport { OrbitControls } from 't3d/addons/controls/OrbitControls.js';\n\t\timport { ForwardRenderer } from 't3d/addons/render/ForwardRenderer.js';\n\t\timport { Texture2DLoader } from 't3d/addons/loaders/Texture2DLoader.js';\n\t\timport { GUI } from './libs/lil-gui.esm.min.js';\n\n\t\tlet width = window.innerWidth || 2;\n\t\tlet height = window.innerHeight || 2;\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = width;\n\t\tcanvas.height = height;\n\t\tdocument.body.appendChild(canvas);\n\n\t\tconst forwardRenderer = new ForwardRenderer(canvas);\n\t\tforwardRenderer.screenRenderTarget.setColorClearValue(0.9, 0.9, 0.9, 1);\n\n\t\tconst scene = new t3d.Scene();\n\t\tscene.fog = new t3d.Fog(undefined, 50, 100);\n\t\tscene.fog.color.setRGB(0.9, 0.9, 0.9);\n\n\t\tconst texture = new Texture2DLoader().load('./resources/logo.jpg');\n\t\ttexture.anisotropy = forwardRenderer.capabilities.maxAnisotropy;\n\t\ttexture.wrapS = texture.wrapT = t3d.TEXTURE_WRAP.REPEAT;\n\n\t\tconst lambertMaterial = new t3d.LambertMaterial();\n\t\tlambertMaterial.diffuse.setHex(0xffffff);\n\t\tlambertMaterial.diffuseMap = texture;\n\t\tlambertMaterial.side = t3d.DRAW_SIDE.DOUBLE;\n\n\t\tconst hilbert3DPoints = CurveUtils.hilbert3D(new t3d.Vector3(0, 0, 0), 3, 1, 0, 1, 2, 3, 4, 5, 6, 7);\n\n\t\tconst hilbert2DPoints = CurveUtils.hilbert2D(new t3d.Vector3(0, 0, 0), 3, 1, 0, 1, 2, 3);\n\t\thilbert2DPoints.forEach(p => {\n\t\t\tp.y = p.z;\n\t\t\tp.z = 0;\n\t\t});\n\n\t\tconst curvePath3 = new CurvePath3();\n\t\tcurvePath3.setBeveledCurves(hilbert3DPoints, { bevelRadius: 0.5 });\n\t\tconst frames = curvePath3.computeFrames({\n\t\t\tup: new t3d.Vector3(-1, 0, 0),\n\t\t\tdivisions: 8\n\t\t});\n\t\tconst geometryData1 = TubeBuilder.getGeometryData(frames, { radius: 0.15, generateStartCap: true, generateEndCap: true });\n\t\tconst geometry1 = new t3d.Geometry();\n\t\tgeometry1.addAttribute('a_Position', new t3d.Attribute(new t3d.Buffer(new Float32Array(geometryData1.positions), 3)));\n\t\tgeometry1.addAttribute('a_Normal', new t3d.Attribute(new t3d.Buffer(new Float32Array(geometryData1.normals), 3)));\n\t\tgeometry1.addAttribute('a_Uv', new t3d.Attribute(new t3d.Buffer(new Float32Array(geometryData1.uvs), 2)));\n\t\tgeometry1.setIndex(new t3d.Attribute(new t3d.Buffer(\n\t\t\t(geometryData1.positions.length / 3) > 65536 ? new Uint32Array(geometryData1.indices) : new Uint16Array(geometryData1.indices),\n\t\t\t1\n\t\t)));\n\t\tgeometry1.computeBoundingBox();\n\t\tgeometry1.computeBoundingSphere();\n\t\tconst tube = new t3d.Mesh(geometry1, lambertMaterial);\n\t\ttube.position.set(3, 0, 0);\n\t\ttube.castShadow = true;\n\t\tscene.add(tube);\n\t\t\n\t\tconst curvePath3_2 = new CurvePath3();\n\t\tcurvePath3_2.setBeveledCurves(hilbert2DPoints, { bevelRadius: 0.5 });\n\t\tconst frames2 = curvePath3_2.computeFrames({\n\t\t\tup: new t3d.Vector3(0, 0, 1),\n\t\t\tdivisions: 8\n\t\t});\n\t\tconst geometryData2 = RouteBuilder.getGeometryData(frames2, { width: 0.5, side: 'both' });\n\t\tconst geometry2 = new t3d.Geometry();\n\t\tgeometry2.addAttribute('a_Position', new t3d.Attribute(new t3d.Buffer(new Float32Array(geometryData2.positions), 3)));\n\t\tgeometry2.addAttribute('a_Normal', new t3d.Attribute(new t3d.Buffer(new Float32Array(geometryData2.normals), 3)));\n\t\tgeometry2.addAttribute('a_Uv', new t3d.Attribute(new t3d.Buffer(new Float32Array(geometryData2.uvs), 2)));\n\t\tgeometry2.setIndex(new t3d.Attribute(new t3d.Buffer(\n\t\t\t(geometryData2.positions.length / 3) > 65536 ? new Uint32Array(geometryData2.indices) : new Uint16Array(geometryData2.indices),\n\t\t\t1\n\t\t)));\n\t\tgeometry2.computeBoundingBox();\n\t\tgeometry2.computeBoundingSphere();\n\t\tconst route = new t3d.Mesh(geometry2, lambertMaterial);\n\t\troute.position.set(-3, 0, 2);\n\t\troute.castShadow = true;\n\t\tscene.add(route);\n\n\t\tconst curvePath3_3 = new CurvePath3();\n\t\tcurvePath3_3.setBeveledCurves(hilbert2DPoints, { bevelRadius: 0 });\n\t\tconst frames3 = curvePath3_3.computeFrames({\n\t\t\tup: new t3d.Vector3(0, 0, 1)\n\t\t});\n\t\tconst geometryData3 = RouteBuilder.getGeometryData(frames3, { width: 0.5, sharp: true, side: 'both' });\n\t\tconst geometry3 = new t3d.Geometry();\n\t\tgeometry3.addAttribute('a_Position', new t3d.Attribute(new t3d.Buffer(new Float32Array(geometryData3.positions), 3)));\n\t\tgeometry3.addAttribute('a_Normal', new t3d.Attribute(new t3d.Buffer(new Float32Array(geometryData3.normals), 3)));\n\t\tgeometry3.addAttribute('a_Uv', new t3d.Attribute(new t3d.Buffer(new Float32Array(geometryData3.uvs), 2)));\n\t\tgeometry3.setIndex(new t3d.Attribute(new t3d.Buffer(\n\t\t\t(geometryData3.positions.length / 3) > 65536 ? new Uint32Array(geometryData3.indices) : new Uint16Array(geometryData3.indices),\n\t\t\t1\n\t\t)));\n\t\tgeometry3.computeBoundingBox();\n\t\tgeometry3.computeBoundingSphere();\n\t\tconst route2 = new t3d.Mesh(geometry3, lambertMaterial);\n\t\troute2.position.set(-3, 0, -2);\n\t\troute2.castShadow = true;\n\t\tscene.add(route2);\n\n\t\tconst plane_geometry = new t3d.PlaneGeometry(1000, 1000);\n\t\tconst plane_material = new t3d.LambertMaterial();\n\t\tplane_material.diffuse.setHex(0xeeeeee);\n\t\tconst plane = new t3d.Mesh(plane_geometry, plane_material);\n\t\tplane.position.y -= 3;\n\t\tplane.receiveShadow = true;\n\t\tscene.add(plane);\n\n\t\tconst ambientLight = new t3d.AmbientLight(0xffffff, 0.3);\n\t\tscene.add(ambientLight);\n\n\t\tconst directionalLight = new t3d.DirectionalLight(0xffffff, 0.8);\n\t\tdirectionalLight.position.set(-10, 20, 30);\n\t\tdirectionalLight.lookAt(new t3d.Vector3(), new t3d.Vector3(0, 1, 0));\n\t\tdirectionalLight.castShadow = true;\n\t\tdirectionalLight.shadow.windowSize = 15;\n\t\tscene.add(directionalLight);\n\n\t\tconst camera = new t3d.Camera();\n\t\tcamera.position.set(0, 3, 20);\n\t\tcamera.lookAt(new t3d.Vector3(0, 0, 0), new t3d.Vector3(0, 1, 0));\n\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 1000);\n\t\tscene.add(camera);\n\n\t\tconst controller = new OrbitControls(camera, canvas);\n\t\t// controller.enablePan = false;\n\n\t\tconst wireframeGeometries = new WeakMap();\n\t\tfunction getWireframeGeometry(geometry) {\n\t\t\tif (wireframeGeometries.has(geometry)) {\n\t\t\t\treturn wireframeGeometries.get(geometry);\n\t\t\t} else {\n\t\t\t\tconst wireframeGeometry = new t3d.Geometry();\n\t\t\t\twireframeGeometry.attributes = geometry.attributes;\n\t\t\t\twireframeGeometry.morphAttributes = geometry.morphAttributes;\n\t\t\t\twireframeGeometry.index = GeometryUtils.getWireframeAttribute(geometry);\n\t\t\t\twireframeGeometry.boundingBox = geometry.boundingBox;\n\t\t\t\twireframeGeometry.boundingSphere = geometry.boundingSphere;\n\t\t\t\twireframeGeometry.groups = geometry.groups;\n\t\t\t\twireframeGeometry.instanceCount = geometry.instanceCount;\n\t\t\t\twireframeGeometries.set(geometry, wireframeGeometry);\n\t\t\t\treturn wireframeGeometry;\n\t\t\t}\n\t\t}\n\n\t\tconst gui = new GUI();\n\t\tgui.add({ wireframe: false }, 'wireframe').onChange(value => {\n\t\t\ttube.geometry = value ? getWireframeGeometry(geometry1) : geometry1;\n\t\t\troute.geometry = value ? getWireframeGeometry(geometry2) : geometry2;\n\t\t\troute2.geometry = value ? getWireframeGeometry(geometry3) : geometry3;\n\n\t\t\tlambertMaterial.drawMode = value ? t3d.DRAW_MODE.LINES : t3d.DRAW_MODE.TRIANGLES;\n\t\t});\n\n\t\tfunction loop(count) {\n\t\t\trequestAnimationFrame(loop);\n\n\t\t\tcontroller.update();\n\n\t\t\tforwardRenderer.render(scene, camera);\n\t\t}\n\t\trequestAnimationFrame(loop);\n\n\t\tfunction onWindowResize() {\n\t\t\twidth = window.innerWidth || 2;\n\t\t\theight = window.innerHeight || 2;\n\n\t\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 1000);\n\n\t\t\tforwardRenderer.screenRenderTarget.resize(width, height);\n\t\t}\n\t\twindow.addEventListener('resize', onWindowResize, false);\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "examples/geometry_builder_shapes.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>t3d - geometry shape builders</title>\n\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n\t<link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n</head>\n<body>\n    <div id=\"info\" class=\"dark\">\n        <a href=\"\" target=\"_blank\">t3d</a> - geometry shape builders\n    </div>\n\n\t<!-- Import maps polyfill -->\n    <!-- Remove this when import maps will be widely supported -->\n    <script async src=\"./libs/es-module-shims.js\"></script>\n\n    <script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n    <script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { CurvePath3 } from 't3d/addons/math/curves/Curves.js';\n\t\timport { PolygonBuilder } from 't3d/addons/geometries/builders/PolygonBuilder.js';\n\t\timport { ExtrudeShapeBuilder } from 't3d/addons/geometries/builders/ExtrudeShapeBuilder.js';\n\t\timport { GeometryUtils } from 't3d/addons/geometries/GeometryUtils.js';\n\t\timport { OrbitControls } from 't3d/addons/controls/OrbitControls.js';\n\t\timport { ForwardRenderer } from 't3d/addons/render/ForwardRenderer.js';\n\t\timport { Texture2DLoader } from 't3d/addons/loaders/Texture2DLoader.js';\n\t\timport { GUI } from './libs/lil-gui.esm.min.js';\n\n\t\tlet width = window.innerWidth || 2;\n\t\tlet height = window.innerHeight || 2;\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = width;\n\t\tcanvas.height = height;\n\t\tdocument.body.appendChild(canvas);\n\n\t\tconst forwardRenderer = new ForwardRenderer(canvas);\n\t\tforwardRenderer.screenRenderTarget.setColorClearValue(0.9, 0.9, 0.9, 1);\n\n\t\tconst scene = new t3d.Scene();\n\t\tscene.fog = new t3d.Fog(undefined, 50, 100);\n\t\tscene.fog.color.setRGB(0.9, 0.9, 0.9);\n\n\t\tconst texture = new Texture2DLoader().load('./resources/logo.jpg');\n\t\ttexture.anisotropy = forwardRenderer.capabilities.maxAnisotropy;\n\t\ttexture.wrapS = texture.wrapT = t3d.TEXTURE_WRAP.REPEAT;\n\n\t\tconst lambertMaterial = new t3d.LambertMaterial();\n\t\tlambertMaterial.diffuse.setHex(0xffffff);\n\t\tlambertMaterial.diffuseMap = texture;\n\t\tlambertMaterial.side = t3d.DRAW_SIDE.DOUBLE;\n\n\t\tconst shape = {\n\t\t\tcontour: [[0 - 2.5, 0 - 2.5], [0 - 2.5, 5 - 2.5], [5 - 2.5, 5 - 2.5], [5 - 2.5, 0 - 2.5]],\n\t\t\tholes: [[[1 - 2.5, 3 - 2.5], [1 - 2.5, 4 - 2.5], [4 - 2.5, 4 - 2.5], [4 - 2.5, 3 - 2.5]], [[1 - 2.5, 1 - 2.5], [1 - 2.5, 2 - 2.5], [4 - 2.5, 1 - 2.5]]]\n\t\t};\n\n\t\tconst geometryData = PolygonBuilder.getGeometryData({\n\t\t\tcontour: shape.contour,\n\t\t\tholes: shape.holes\n\t\t});\n\t\tconst geometry = new t3d.Geometry();\n\t\tgeometry.addAttribute('a_Position', new t3d.Attribute(new t3d.Buffer(new Float32Array(geometryData.positions), 3)));\n\t\tgeometry.addAttribute('a_Normal', new t3d.Attribute(new t3d.Buffer(new Float32Array(geometryData.normals), 3)));\n\t\tgeometry.addAttribute('a_Uv', new t3d.Attribute(new t3d.Buffer(new Float32Array(geometryData.uvs), 2)));\n\t\tgeometry.setIndex(new t3d.Attribute(new t3d.Buffer(\n\t\t\t(geometryData.positions.length / 3) > 65536 ? new Uint32Array(geometryData.indices) : new Uint16Array(geometryData.indices),\n\t\t\t1\n\t\t)));\n\t\tgeometry.computeBoundingBox();\n\t\tgeometry.computeBoundingSphere();\n\t\tconst polygon = new t3d.Mesh(geometry, lambertMaterial);\n\t\tpolygon.position.set(-6, 0, 0);\n\t\tpolygon.castShadow = true;\n\t\tpolygon.receiveShadow = true;\n\t\tscene.add(polygon);\n\n\t\tconst geometryData1 = ExtrudeShapeBuilder.getGeometryData({\n\t\t\tcontour: shape.contour,\n\t\t\tholes: shape.holes,\n\t\t\tdepth: 2\n\t\t});\n\t\tconst geometry1 = new t3d.Geometry();\n\t\tgeometry1.addAttribute('a_Position', new t3d.Attribute(new t3d.Buffer(new Float32Array(geometryData1.positions), 3)));\n\t\tgeometry1.addAttribute('a_Uv', new t3d.Attribute(new t3d.Buffer(new Float32Array(geometryData1.uvs), 2)));\n\t\tgeometry1.setIndex(new t3d.Attribute(new t3d.Buffer(\n\t\t\t(geometryData1.positions.length / 3) > 65536 ? new Uint32Array(geometryData1.indices) : new Uint16Array(geometryData1.indices),\n\t\t\t1\n\t\t)));\n\t\tGeometryUtils.computeNormals(geometry1);\n\t\tgeometry1.computeBoundingBox();\n\t\tgeometry1.computeBoundingSphere();\n\t\tconst extrudeShape = new t3d.Mesh(geometry1, lambertMaterial);\n\t\textrudeShape.position.set(0, 0, 0);\n\t\textrudeShape.castShadow = true;\n\t\textrudeShape.receiveShadow = true;\n\t\tscene.add(extrudeShape);\n\n\t\tconst pathPoints = [new t3d.Vector3(0, 0, 0), new t3d.Vector3(0, 0, -10), new t3d.Vector3(10, 0, -10)];\n\t\tconst curvePath3 = new CurvePath3();\n\t\tcurvePath3.setBeveledCurves(pathPoints, { bevelRadius: 10 });\n\t\tconst geometryData2 = ExtrudeShapeBuilder.getGeometryData({\n\t\t\tcontour: shape.contour,\n\t\t\tholes: shape.holes,\n\t\t\tdepth: 4,\n\t\t\tpathFrames: curvePath3.computeFrames({\n\t\t\t\tup: new t3d.Vector3(0, 1, 0),\n\t\t\t\tdivisions: 8\n\t\t\t})\n\t\t});\n\t\tconst geometry2 = new t3d.Geometry();\n\t\tgeometry2.addAttribute('a_Position', new t3d.Attribute(new t3d.Buffer(new Float32Array(geometryData2.positions), 3)));\n\t\tgeometry2.addAttribute('a_Uv', new t3d.Attribute(new t3d.Buffer(new Float32Array(geometryData2.uvs), 2)));\n\t\tgeometry2.setIndex(new t3d.Attribute(new t3d.Buffer(\n\t\t\t(geometryData2.positions.length / 3) > 65536 ? new Uint32Array(geometryData2.indices) : new Uint16Array(geometryData2.indices),\n\t\t\t1\n\t\t)));\n\t\tGeometryUtils.computeNormals(geometry2);\n\t\tgeometry2.computeBoundingBox();\n\t\tgeometry2.computeBoundingSphere();\n\t\tconst extrudePathShape = new t3d.Mesh(geometry2, lambertMaterial);\n\t\textrudePathShape.position.set(6, 0, 0);\n\t\textrudePathShape.castShadow = true;\n\t\textrudePathShape.receiveShadow = true;\n\t\tscene.add(extrudePathShape);\n\n\t\tconst plane_geometry = new t3d.PlaneGeometry(1000, 1000);\n\t\tconst plane_material = new t3d.LambertMaterial();\n\t\tplane_material.diffuse.setHex(0xffffff);\n\t\tconst plane = new t3d.Mesh(plane_geometry, plane_material);\n\t\tplane.position.y -= 3;\n\t\tplane.receiveShadow = true;\n\t\tscene.add(plane);\n\n\t\tconst ambientLight = new t3d.AmbientLight(0xffffff, 0.3);\n\t\tscene.add(ambientLight);\n\n\t\tconst directionalLight = new t3d.DirectionalLight(0xffffff, 0.8);\n\t\tdirectionalLight.position.set(-10, 20, 30);\n\t\tdirectionalLight.lookAt(new t3d.Vector3(), new t3d.Vector3(0, 1, 0));\n\t\tdirectionalLight.castShadow = true;\n\t\tdirectionalLight.shadow.windowSize = 25;\n\t\tdirectionalLight.shadow.bias = -0.0003;\n\t\tdirectionalLight.shadow.normalBias = 0.2;\n\t\tscene.add(directionalLight);\n\n\t\tconst camera = new t3d.Camera();\n\t\tcamera.position.set(0, 8, 25);\n\t\tcamera.lookAt(new t3d.Vector3(0, 0, 0), new t3d.Vector3(0, 1, 0));\n\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 1000);\n\t\tscene.add(camera);\n\n\t\tconst controller = new OrbitControls(camera, canvas);\n\n\t\tconst wireframeGeometries = new WeakMap();\n\t\tfunction getWireframeGeometry(geometry) {\n\t\t\tif (wireframeGeometries.has(geometry)) {\n\t\t\t\treturn wireframeGeometries.get(geometry);\n\t\t\t} else {\n\t\t\t\tconst wireframeGeometry = new t3d.Geometry();\n\t\t\t\twireframeGeometry.attributes = geometry.attributes;\n\t\t\t\twireframeGeometry.morphAttributes = geometry.morphAttributes;\n\t\t\t\twireframeGeometry.index = GeometryUtils.getWireframeAttribute(geometry);\n\t\t\t\twireframeGeometry.boundingBox = geometry.boundingBox;\n\t\t\t\twireframeGeometry.boundingSphere = geometry.boundingSphere;\n\t\t\t\twireframeGeometry.groups = geometry.groups;\n\t\t\t\twireframeGeometry.instanceCount = geometry.instanceCount;\n\t\t\t\twireframeGeometries.set(geometry, wireframeGeometry);\n\t\t\t\treturn wireframeGeometry;\n\t\t\t}\n\t\t}\n\n\t\tconst gui = new GUI();\n\t\tgui.add({ wireframe: false }, 'wireframe').onChange(value => {\n\t\t\tpolygon.geometry = value ? getWireframeGeometry(geometry) : geometry;\n\t\t\textrudeShape.geometry = value ? getWireframeGeometry(geometry1) : geometry1;\n\t\t\textrudePathShape.geometry = value ? getWireframeGeometry(geometry2) : geometry2;\n\n\t\t\tlambertMaterial.drawMode = value ? t3d.DRAW_MODE.LINES : t3d.DRAW_MODE.TRIANGLES;\n\t\t});\n\n\t\tfunction loop(count) {\n\t\t\trequestAnimationFrame(loop);\n\n\t\t\tcontroller.update();\n\n\t\t\tforwardRenderer.render(scene, camera);\n\t\t}\n\t\trequestAnimationFrame(loop);\n\n\t\tfunction onWindowResize() {\n\t\t\twidth = window.innerWidth || 2;\n\t\t\theight = window.innerHeight || 2;\n\n\t\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 1000);\n\n\t\t\tforwardRenderer.screenRenderTarget.resize(width, height);\n\t\t}\n\t\twindow.addEventListener('resize', onWindowResize, false);\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "examples/geometry_geometries.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>t3d - geometries</title>\n\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n\t<link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n</head>\n<body>\n    <div id=\"info\">\n        <a href=\"\" target=\"_blank\">t3d</a> - geometries\n    </div>\n\n\t<!-- Import maps polyfill -->\n    <!-- Remove this when import maps will be widely supported -->\n    <script async src=\"./libs/es-module-shims.js\"></script>\n\n    <script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n    <script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { Texture2DLoader } from 't3d/addons/loaders/Texture2DLoader.js';\n\t\timport { ForwardRenderer } from 't3d/addons/render/ForwardRenderer.js';\n\t\timport { OrbitControls } from 't3d/addons/controls/OrbitControls.js';\n\t\timport { CircleGeometry } from 't3d/addons/geometries/CircleGeometry.js';\n\t\timport { CapsuleGeometry } from 't3d/addons/geometries/CapsuleGeometry.js';\n\t\timport { PolyhedronBuilder } from 't3d/addons/geometries/builders/PolyhedronBuilder.js';\n\t\timport { TorusBuilder } from 't3d/addons/geometries/builders/TorusBuilder.js';\n\t\timport { LatheBuilder } from 't3d/addons/geometries/builders/LatheBuilder.js';\n\t\timport { GeometryUtils } from 't3d/addons/geometries/GeometryUtils.js';\n\n\t\tlet width = window.innerWidth || 2;\n\t\tlet height = window.innerHeight || 2;\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = width;\n\t\tcanvas.height = height;\n\t\tdocument.body.appendChild(canvas);\n\n\t\tconst forwardRenderer = new ForwardRenderer(canvas);\n\n\t\tconst scene = new t3d.Scene();\n\n\t\tconst camera = new t3d.Camera();\n\t\tcamera.position.set(0, 0, 150);\n\t\tcamera.lookAt(new t3d.Vector3(0, 0, 0), new t3d.Vector3(0, 1, 0));\n\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 1000);\n\t\tscene.add(camera);\n\n\t\tconst controller = new OrbitControls(camera, canvas);\n\n\t\t// lights\n\n\t\tconst ambientLight = new t3d.AmbientLight(0xffffff, 0.2);\n\t\tscene.add(ambientLight);\n\n\t\tconst directionalLight = new t3d.DirectionalLight(0xffffff, 1);\n\t\tdirectionalLight.position.set(0, 0, 20);\n\t\tdirectionalLight.lookAt(new t3d.Vector3(), new t3d.Vector3(0, 1, 0));\n\t\tscene.add(directionalLight);\n\n\t\t// create meshes\n\n\t\tconst texture = new Texture2DLoader().load('./resources/UV_Grid_Sm.jpg');\n\t\ttexture.wrapS = texture.wrapT = t3d.TEXTURE_WRAP.REPEAT;\n\t\ttexture.anisotropy = 16;\n\n\t\tconst material = new t3d.LambertMaterial();\n\t\tmaterial.diffuseMap = texture;\n\t\tmaterial.side = t3d.DRAW_SIDE.DOUBLE;\n\n\t\tconst geometries = [\n\t\t\tnew t3d.BoxGeometry(10, 10, 10),\n\t\t\tnew t3d.PlaneGeometry(10, 10),\n\t\t\tnew t3d.SphereGeometry(7, 20, 20),\n\t\t\tnew t3d.CylinderGeometry(5, 5, 10, 20, 1),\n\t\t\tnew t3d.CylinderGeometry(0, 5, 10, 20, 1),\n\t\t\tnew t3d.TorusKnotGeometry(5, 1.5),\n\t\t\tnew CircleGeometry(7),\n\t\t\tnew CapsuleGeometry(5, 8, 20),\n\t\t\tcreateGeometryByData(LatheBuilder.getGeometryData([[0, -7], [5, -2], [5, 2], [0, 7]])),\n\t\t\tcreateGeometryByData(TorusBuilder.getGeometryData(5, 2, 16, 16)),\n\t\t\tcreateGeometryByData(PolyhedronBuilder.getTetrahedronGeometryData(8)),\n\t\t\tcreateGeometryByData(PolyhedronBuilder.getOctahedronGeometryData(8)),\n\t\t\tcreateGeometryByData(PolyhedronBuilder.getIcosahedronGeometryData(8)),\n\t\t\tcreateGeometryByData(PolyhedronBuilder.getDodecahedronGeometryData(8))\n\t\t];\n\n\t\tconst meshes = new t3d.Object3D();\n\t\tscene.add(meshes);\n\n\t\tfor (let i = 0, l = geometries.length; i < l; i++) {\n\t\t\tconst mesh = new t3d.Mesh(geometries[i], material);\n\n\t\t\tmesh.position.set(\n\t\t\t\t(i % 4 - 1.5) * 18,\n\t\t\t\t-(Math.floor(i / 4) - 1.5) * 22,\n\t\t\t\t0\n\t\t\t);\n\n\t\t\tmeshes.add(mesh);\n\t\t}\n\n\t\tfunction createGeometryByData(data) {\n\t\t\tconst geometry = new t3d.Geometry();\n\n\t\t\tgeometry.addAttribute('a_Position', new t3d.Attribute(new t3d.Buffer(new Float32Array(data.positions), 3)));\n\t\t\tgeometry.addAttribute('a_Uv', new t3d.Attribute(new t3d.Buffer(new Float32Array(data.uvs), 2)));\n\n\t\t\tif (data.indices) {\n\t\t\t\tgeometry.setIndex(data.indices);\n\t\t\t}\n\n\t\t\tif (data.normals) {\n\t\t\t\tgeometry.addAttribute('a_Normal', new t3d.Attribute(new t3d.Buffer(new Float32Array(data.normals), 3)));\n\t\t\t} else {\n\t\t\t\tGeometryUtils.computeNormals(geometry);\n\t\t\t}\n\n\t\t\tgeometry.computeBoundingBox();\n\t\t\tgeometry.computeBoundingSphere();\n\n\t\t\treturn geometry;\n\t\t}\n\n\t\t//\n\n\t\tlet lastCount = 0;\n\t\tfunction loop(count) {\n\t\t\trequestAnimationFrame(loop);\n\n\t\t\tcontroller.update();\n\n\t\t\tconst delta = count - lastCount;\n\t\t\tlastCount = count;\n\n\t\t\t// rotate mesh\n\t\t\tconst meshesArray = meshes.children;\n\t\t\tfor (let i = 0, l = meshesArray.length; i < l; i++) {\n\t\t\t\tconst mesh = meshesArray[i];\n\t\t\t\tmesh.euler.x += delta / 1000 * Math.PI / 5;\n\t\t\t\tmesh.euler.y += delta / 1000 * Math.PI / 5;\n\t\t\t}\n\n\t\t\tforwardRenderer.render(scene, camera);\n\t\t}\n\n\t\trequestAnimationFrame(loop);\n\n\t\tfunction onWindowResize() {\n\t\t\twidth = window.innerWidth || 2;\n\t\t\theight = window.innerHeight || 2;\n\n\t\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 1000);\n\n\t\t\tforwardRenderer.screenRenderTarget.resize(width, height);\n\t\t}\n\t\twindow.addEventListener('resize', onWindowResize, false);\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "examples/geometry_groups.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>t3d - groups</title>\n\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n\t<link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n</head>\n<body>\n    <div id=\"info\">\n        <a href=\"\" target=\"_blank\">t3d</a> - groups\n    </div>\n\n\t<!-- Import maps polyfill -->\n    <!-- Remove this when import maps will be widely supported -->\n    <script async src=\"./libs/es-module-shims.js\"></script>\n\n    <script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n    <script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { ForwardRenderer } from 't3d/addons/render/ForwardRenderer.js';\n\t\timport { Texture2DLoader } from 't3d/addons/loaders/Texture2DLoader.js';\n\n\t\tlet width = window.innerWidth || 2;\n\t\tlet height = window.innerHeight || 2;\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = width;\n\t\tcanvas.height = height;\n\t\tdocument.body.appendChild(canvas);\n\n\t\tconst forwardRenderer = new ForwardRenderer(canvas);\n\n\t\tconst scene = new t3d.Scene();\n\n\t\tconst texture = new Texture2DLoader().load('./resources/hardwood2_diffuse.jpg');\n\t\ttexture.anisotropy = forwardRenderer.capabilities.maxAnisotropy;\n\n\t\tconst plane_geometry = new t3d.PlaneGeometry(100, 100);\n\t\tconst lambert = new t3d.LambertMaterial();\n\t\tlambert.diffuse.setHex(0xaaaaaa);\n\t\tconst plane = new t3d.Mesh(plane_geometry, lambert);\n\t\tplane.position.y = -4.5;\n\t\tplane.receiveShadow = true;\n\t\tscene.add(plane);\n\n\t\tconst phong1 = new t3d.PhongMaterial();\n\t\tphong1.diffuse.setHex(0xff0000);\n\t\tphong1.side = t3d.DRAW_SIDE.DOUBLE;\n\t\tphong1.transparent = true;\n\t\tphong1.opacity = 0.5;\n\n\t\tconst phong2 = new t3d.PhongMaterial();\n\t\tphong2.diffuse.setHex(0x00ff00);\n\t\tphong2.side = t3d.DRAW_SIDE.DOUBLE;\n\n\t\tconst phong3 = new t3d.PhongMaterial();\n\t\tphong3.diffuse.setHex(0x0000ff);\n\t\tphong3.side = t3d.DRAW_SIDE.DOUBLE;\n\n\t\tconst phong4 = new t3d.PhongMaterial();\n\t\tphong4.diffuse.setHex(0xffffff);\n\t\tphong4.side = t3d.DRAW_SIDE.DOUBLE;\n\n\t\tconst phong5 = new t3d.PhongMaterial();\n\t\tphong5.diffuseMap = texture;\n\t\tphong5.side = t3d.DRAW_SIDE.DOUBLE;\n\n\t\tconst phong6 = new t3d.PhongMaterial();\n\t\tphong6.diffuse.setHex(0x00ffff);\n\t\tphong6.side = t3d.DRAW_SIDE.DOUBLE;\n\n\t\tconst cube_geometry = new t3d.BoxGeometry(8, 8, 8);\n\n\t\tconst cube = new t3d.Mesh(cube_geometry, [phong1, phong2, phong3, phong4, phong5, phong6]);\n\t\tcube.castShadow = true;\n\t\tscene.add(cube);\n\n\t\tconst ambientLight = new t3d.AmbientLight(0xffffff, 0.3);\n\t\tscene.add(ambientLight);\n\n\t\tconst directionalLight = new t3d.DirectionalLight(0xffffff, 0.7);\n\t\tdirectionalLight.position.set(20, 30, 40);\n\t\tdirectionalLight.lookAt(new t3d.Vector3(), new t3d.Vector3(0, 1, 0));\n\t\tdirectionalLight.castShadow = true;\n\t\tdirectionalLight.shadow.windowSize = 40;\n\t\tscene.add(directionalLight);\n\n\t\tconst camera = new t3d.Camera();\n\t\tcamera.position.set(10, 10, 30);\n\t\tcamera.lookAt(new t3d.Vector3(0, 0, 0), new t3d.Vector3(0, 1, 0));\n\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 1000);\n\t\tscene.add(camera);\n\n\t\tfunction loop(count) {\n\t\t\trequestAnimationFrame(loop);\n\n\t\t\t// rotate camera\n\t\t\tcamera.position.x = 30 * Math.sin(count / 1000 * .5);\n\t\t\tcamera.position.z = 30 * Math.cos(count / 1000 * .5);\n\t\t\tcamera.lookAt(new t3d.Vector3(0, 0, 0), new t3d.Vector3(0, 1, 0));\n\n\t\t\tforwardRenderer.render(scene, camera);\n\t\t}\n\t\trequestAnimationFrame(loop);\n\n\t\tfunction onWindowResize() {\n\t\t\twidth = window.innerWidth || 2;\n\t\t\theight = window.innerHeight || 2;\n\n\t\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 1000);\n\n\t\t\tforwardRenderer.screenRenderTarget.resize(width, height);\n\t\t}\n\t\twindow.addEventListener('resize', onWindowResize, false);\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "examples/geometry_loader_assimp2json.html",
    "content": "<!DOCTYPE html>\n<html>\n\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>t3d - assimp2json</title>\n\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n\t<link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n</head>\n\n<body>\n\t<div id=\"info\">\n\t\t<a href=\"\" target=\"_blank\">t3d</a> - assimp2json\n\t</div>\n\n\t<!-- Import maps polyfill -->\n\t<!-- Remove this when import maps will be widely supported -->\n\t<script async src=\"./libs/es-module-shims.js\"></script>\n\n\t<script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n\t<script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { AssimpJsonLoader } from 't3d/addons/loaders/AssimpJsonLoader.js';\n\t\timport { ForwardRenderer } from 't3d/addons/render/ForwardRenderer.js';\n\t\timport { OrbitControls } from 't3d/addons/controls/OrbitControls.js';\n\t\timport { GUI } from './libs/lil-gui.esm.min.js';\n\n\t\tlet width = window.innerWidth || 2;\n\t\tlet height = window.innerHeight || 2;\n\t\tlet controller;\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = width;\n\t\tcanvas.height = height;\n\t\tdocument.body.appendChild(canvas);\n\n\t\tconst forwardRenderer = new ForwardRenderer(canvas);\n\n\t\tconst scene = new t3d.Scene();\n\n\t\tconst jeep = 'resources/models/assimp/jeep/jeep.assimp.json';\n\t\tconst interior = 'resources/models/assimp/interior/interior.assimp.json';\n\n\t\tconst loader1 = new AssimpJsonLoader();\n\t\tloader1.load(jeep, function(object) {\n\t\t\tobject.scale.set(0.4, 0.4, 0.4);\n\n\t\t\tobject.traverse(function(obj) {\n\t\t\t\tif (obj.isMesh) {\n\t\t\t\t\tobj.castShadow = true;\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tscene.add(object);\n\n\t\t\tcontroller = new OrbitControls(camera, canvas);\n\t\t\tcontroller.target.set(0, 1, 0);\n\t\t});\n\n\t\tconst loader2 = new AssimpJsonLoader();\n\t\tloader2.load(interior, function(object) {\n\t\t\tobject.traverse(function(obj) {\n\t\t\t\tif (obj.isMesh) {\n\t\t\t\t\tobj.receiveShadow = true;\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tscene.add(object);\n\t\t});\n\n\t\tconst ambientLight = new t3d.AmbientLight(0xffffff, 0.5);\n\t\tscene.add(ambientLight);\n\n\t\tconst spotLight = new t3d.SpotLight(0xffffff, 0.5, 30, Math.PI / 5, 0.3);\n\t\tspotLight.position.set(0, 10, 0);\n\t\tspotLight.lookAt(new t3d.Vector3(0, 0, 0), new t3d.Vector3(0, 1, 0));\n\t\tspotLight.castShadow = true;\n\t\tscene.add(spotLight);\n\n\t\tconst camera = new t3d.Camera();\n\t\tcamera.position.set(0, 4, 10);\n\t\tcamera.lookAt(new t3d.Vector3(0, 0, 0), new t3d.Vector3(0, 1, 0));\n\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 1000);\n\t\tscene.add(camera);\n\n\t\tconst gui = new GUI();\n\t\tconst params = { fov: 45 };\n\t\tgui.add(params, 'fov', 0, 180).onChange(val => {\n\t\t\tcamera.setPerspective(val / 180 * Math.PI, width / height, 1, 1000);\n\t\t});\n\n\t\tfunction loop(count) {\n\t\t\trequestAnimationFrame(loop);\n\n\t\t\t// rotate camera\n\t\t\t// camera.position.x = 10 * Math.sin(count / 1000 * .5);\n\t\t\t// camera.position.z = 10 * Math.cos(count / 1000 * .5);\n\t\t\t// camera.lookAt(new t3d.Vector3(0, 0, 0), new t3d.Vector3(0, 1, 0));\n\n\t\t\tcontroller && controller.update();\n\n\t\t\tforwardRenderer.render(scene, camera);\n\t\t}\n\t\trequestAnimationFrame(loop);\n\n\t\tfunction onWindowResize() {\n\t\t\twidth = window.innerWidth || 2;\n\t\t\theight = window.innerHeight || 2;\n\n\t\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 1000);\n\n\t\t\tforwardRenderer.screenRenderTarget.resize(width, height);\n\t\t}\n\t\twindow.addEventListener('resize', onWindowResize, false);\n\t</script>\n</body>\n\n</html>"
  },
  {
    "path": "examples/geometry_loader_gltf.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>t3d - gltf</title>\n\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n\t<link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n<body>\n    <div id=\"info\">\n        <a href=\"\" target=\"_blank\">t3d</a> - gltf\n    </div>\n\n\t<script src=\"./libs/nanobar.js\"></script>\n\n\t<!-- Import maps polyfill -->\n    <!-- Remove this when import maps will be widely supported -->\n    <script async src=\"./libs/es-module-shims.js\"></script>\n\n    <script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n    <script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { GLTFLoader } from 't3d/addons/loaders/glTF/GLTFLoader.js';\n\t\timport { TextureCubeLoader } from 't3d/addons/loaders/TextureCubeLoader.js';\n\t\timport { OrbitControls } from 't3d/addons/controls/OrbitControls.js';\n\t\timport { SkyBox } from 't3d/addons/objects/SkyBox.js';\n\t\timport { ForwardRenderer } from 't3d/addons/render/ForwardRenderer.js';\n\n\t\tlet width = window.innerWidth || 2;\n\t\tlet height = window.innerHeight || 2;\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = width * window.devicePixelRatio;\n\t\tcanvas.height = height * window.devicePixelRatio;\n\t\tcanvas.style.width = width + 'px';\n\t\tcanvas.style.height = height + 'px';\n\t\tdocument.body.appendChild(canvas);\n\n\t\tconst forwardRenderer = new ForwardRenderer(canvas);\n\n\t\tconst cubeTexturePath = './resources/skybox/Bridge2/';\n\t\tconst cubeTexture = new TextureCubeLoader().load([\n\t\t\tcubeTexturePath + 'posx.jpg',\n\t\t\tcubeTexturePath + 'negx.jpg',\n\t\t\tcubeTexturePath + 'posy.jpg',\n\t\t\tcubeTexturePath + 'negy.jpg',\n\t\t\tcubeTexturePath + 'posz.jpg',\n\t\t\tcubeTexturePath + 'negz.jpg'\n\t\t]);\n\t\tcubeTexture.encoding = t3d.TEXEL_ENCODING_TYPE.SRGB;\n\n\t\tconst scene = new t3d.Scene();\n\t\tscene.environment = cubeTexture;\n\n\t\tconst skyBox = new SkyBox(cubeTexture);\n\t\tskyBox.level = 0;\n\t\tskyBox.gamma = true;\n\t\tscene.add(skyBox);\n\n\t\tconst nanobar = new Nanobar();\n\t\tnanobar.el.style.background = 'gray';\n\n\t\tconst loadingManager = new t3d.LoadingManager(function() {\n\t\t\tnanobar.go(100);\n\t\t\tnanobar.el.style.background = 'transparent';\n\t\t}, function(url, itemsLoaded, itemsTotal) {\n\t\t\tif (itemsLoaded < itemsTotal) {\n\t\t\t\tnanobar.go(itemsLoaded / itemsTotal * 100);\n\t\t\t}\n\t\t});\n\n\t\tconst loader = new GLTFLoader(loadingManager);\n\t\tloader.autoLogError = false;\n\t\t\n\t\tconsole.time('GLTFLoader');\n\t\tloader.load(\n\t\t\t'./resources/models/gltf/UinoHelmet/glTF/UinoHelmet.gltf'\n\t\t).then(function(result) {\n\t\t\tconsole.timeEnd('GLTFLoader');\n\n\t\t\tconst object = result.root;\n\n\t\t\tobject.traverse(node => {\n\t\t\t\tnode.castShadow = true;\n\t\t\t\tnode.receiveShadow = true;\n\t\t\t});\n\n\t\t\tobject.scale.set(30, 30, 30);\n\t\t\tobject.position.set(0, -34, -1);\n\n\t\t\tscene.add(object);\n\t\t}).catch(e => console.error(e));\n\n\t\tconst ambientLight = new t3d.AmbientLight(0xffffff, 0.5);\n\t\tscene.add(ambientLight);\n\n\t\tconst directionalLight = new t3d.DirectionalLight(0xffffff, 1);\n\t\tdirectionalLight.position.set(0, 10, 30);\n\t\tdirectionalLight.lookAt(new t3d.Vector3(), new t3d.Vector3(0, 1, 0));\n\t\tdirectionalLight.shadow.cameraNear = 1;\n\t\tdirectionalLight.shadow.cameraFar = 100;\n\t\tdirectionalLight.shadow.mapSize.set(1024, 1024);\n\t\tdirectionalLight.shadow.windowSize = 50;\n\t\tdirectionalLight.castShadow = true;\n\t\tscene.add(directionalLight);\n\n\t\tconst camera = new t3d.Camera();\n\t\tcamera.outputEncoding = t3d.TEXEL_ENCODING_TYPE.SRGB;\n\t\tcamera.position.set(22, 5, 32);\n\t\tcamera.lookAt(new t3d.Vector3(0, 0, 0), new t3d.Vector3(0, 1, 0));\n\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 8000);\n\t\tscene.add(camera);\n\n\t\tconst controller = new OrbitControls(camera, canvas);\n\t\tcontroller.enablePan = false;\n\n\t\tfunction loop(count) {\n\t\t\trequestAnimationFrame(loop);\n\n\t\t\tcontroller.update();\n\n\t\t\tforwardRenderer.render(scene, camera);\n\t\t}\n\t\trequestAnimationFrame(loop);\n\n\t\tfunction onWindowResize() {\n\t\t\twidth = window.innerWidth || 2;\n\t\t\theight = window.innerHeight || 2;\n\n\t\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 8000);\n\n\t\t\tforwardRenderer.screenRenderTarget.resize(width * window.devicePixelRatio, height * window.devicePixelRatio);\n\n\t\t\tcanvas.style.width = width + 'px';\n\t\t\tcanvas.style.height = height + 'px';\n\t\t}\n\t\twindow.addEventListener('resize', onWindowResize, false);\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "examples/geometry_loader_gltf2.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>t3d - gltf2</title>\n\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n\t<link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n</head>\n<body>\n    <div id=\"info\">\n        <a href=\"\" target=\"_blank\">t3d</a> - gltf2\n    </div>\n\n\t<script src=\"./libs/nanobar.js\"></script>\n\n\t<!-- Import maps polyfill -->\n    <!-- Remove this when import maps will be widely supported -->\n    <script async src=\"./libs/es-module-shims.js\"></script>\n\n    <script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n    <script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { Clock } from 't3d/addons/Clock.js';\n\t\timport { GLTFLoader } from 't3d/addons/loaders/glTF/GLTFLoader.js';\n\t\timport { TextureCubeLoader } from 't3d/addons/loaders/TextureCubeLoader.js';\n\t\timport { OrbitControls } from 't3d/addons/controls/OrbitControls.js';\n\t\timport { SkyBox } from 't3d/addons/objects/SkyBox.js';\n\t\timport { ForwardRenderer } from 't3d/addons/render/ForwardRenderer.js';\n\t\timport { SkeletonHelper } from 't3d/addons/objects/SkeletonHelper.js';\n\t\timport { GUI } from './libs/lil-gui.esm.min.js';\n\n\t\tlet width = window.innerWidth || 2;\n\t\tlet height = window.innerHeight || 2;\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = width * window.devicePixelRatio;\n\t\tcanvas.height = height * window.devicePixelRatio;\n\t\tcanvas.style.width = width + 'px';\n\t\tcanvas.style.height = height + 'px';\n\t\tdocument.body.appendChild(canvas);\n\n\t\tconst forwardRenderer = new ForwardRenderer(canvas);\n\n\t\tconst cubeTexturePath = './resources/skybox/Bridge2/';\n\t\tconst cubeTexture = new TextureCubeLoader().load([\n\t\t\tcubeTexturePath + 'posx.jpg',\n\t\t\tcubeTexturePath + 'negx.jpg',\n\t\t\tcubeTexturePath + 'posy.jpg',\n\t\t\tcubeTexturePath + 'negy.jpg',\n\t\t\tcubeTexturePath + 'posz.jpg',\n\t\t\tcubeTexturePath + 'negz.jpg'\n\t\t]);\n\t\tcubeTexture.encoding = t3d.TEXEL_ENCODING_TYPE.SRGB;\n\n\t\tconst scene = new t3d.Scene();\n\t\tscene.environment = cubeTexture;\n\t\tscene.envDiffuseIntensity = 2;\n\n\t\tconst skyBox = new SkyBox(cubeTexture);\n\t\tskyBox.level = 0;\n\t\tskyBox.gamma = true;\n\t\tscene.add(skyBox);\n\n\t\tlet animation;\n\t\tconst params = { clipName: '', timeScale: 1, skeleton: false };\n\n\t\tconst nanobar = new Nanobar();\n\t\tnanobar.el.style.background = 'gray';\n\n\t\tconst loadingManager = new t3d.LoadingManager(function() {\n\t\t\tnanobar.go(100);\n\t\t\tnanobar.el.style.background = 'transparent';\n\t\t}, function(url, itemsLoaded, itemsTotal) {\n\t\t\tif (itemsLoaded < itemsTotal) {\n\t\t\t\tnanobar.go(itemsLoaded / itemsTotal * 100);\n\t\t\t}\n\t\t});\n\n\t\tnew GLTFLoader(loadingManager).load(\n\t\t\t'./resources/models/gltf/UinoDog/glTF/robot.gltf'\n\t\t).then(function(result) {\n\t\t\tconst object = result.root;\n\n\t\t\tobject.traverse(function(node) {\n\t\t\t\tif (node.material) {\n\t\t\t\t\tnode.castShadow = true;\n\t\t\t\t\tnode.receiveShadow = true;\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tanimation = new t3d.AnimationMixer();\n\t\t\tresult.animations.forEach(function(clip) {\n\t\t\t\tconst action = new t3d.AnimationAction(clip);\n\t\t\t\tanimation.addAction(action);\n\t\t\t});\n\n\t\t\tconst actions = animation.getActions();\n\t\t\tconst animNames = actions.map(function(action) {\n\t\t\t\treturn action.clip.name;\n\t\t\t});\n\n\t\t\tlet actionIndex = 0;\n\n\t\t\tactions[actionIndex].time = 0;\n\t\t\tactions[actionIndex].weight = 1;\n\n\t\t\tconst currentAnimName = actions[actionIndex].clip.name;\n\t\t\tparams.clipName = currentAnimName;\n\n\t\t\tscene.add(object);\n\n\t\t\tconst skeletonHelper = new SkeletonHelper(scene);\n\n\t\t\tconst gui = new GUI();\n\t\t\tgui.add({ version: 'WebGL ' + forwardRenderer.capabilities.version }, 'version').disable();\n\t\t\tgui.add(params, 'skeleton').onChange(value => {\n\t\t\t\tif (value) {\n\t\t\t\t\tscene.add(skeletonHelper);\n\t\t\t\t} else {\n\t\t\t\t\tscene.remove(skeletonHelper);\n\t\t\t\t}\n\t\t\t});\n\t\t\tgui.add(params, 'clipName', animNames).onChange(value => {\n\t\t\t\tconst lastActionIndex = actionIndex;\n\n\t\t\t\tactionIndex = actions.findIndex(action => action.clip.name === value);\n\n\t\t\t\tif (lastActionIndex !== actionIndex) {\n\t\t\t\t\tactions[lastActionIndex].time = 0;\n\t\t\t\t\tactions[lastActionIndex].weight = 0;\n\n\t\t\t\t\tactions[actionIndex].time = 0;\n\t\t\t\t\tactions[actionIndex].weight = 1;\n\t\t\t\t}\n\t\t\t});\n\t\t\tgui.add(params, 'timeScale', -2, 2, 0.1);\n\t\t}).catch(e => console.error(e));\n\n\t\tconst plane_geometry = new t3d.PlaneGeometry(10, 10);\n\t\tconst plane_material = new t3d.PBRMaterial();\n\t\tplane_material.roughness = 1;\n\t\tplane_material.diffuse.setHex(0x888888);\n\t\tplane_material.dithering = true;\n\t\tconst plane = new t3d.Mesh(plane_geometry, plane_material);\n\t\tplane.receiveShadow = true;\n\t\tscene.add(plane);\n\n\t\tconst ambientLight = new t3d.AmbientLight(0xffffff, 0.1);\n\t\tscene.add(ambientLight);\n\n\t\tconst directionalLight = new t3d.DirectionalLight(0xffffff, 0.7);\n\t\tdirectionalLight.position.set(-5, 5, 5);\n\t\tdirectionalLight.lookAt(new t3d.Vector3(), new t3d.Vector3(0, 1, 0));\n\t\tdirectionalLight.shadow.windowSize = 5;\n\t\tdirectionalLight.shadow.bias = -0.0001;\n\t\tdirectionalLight.castShadow = true;\n\t\tscene.add(directionalLight);\n\n\t\tconst camera = new t3d.Camera();\n\t\tcamera.outputEncoding = t3d.TEXEL_ENCODING_TYPE.SRGB;\n\t\tcamera.position.set(4, 2, 4);\n\t\tcamera.lookAt(new t3d.Vector3(0, 0.5, 0), new t3d.Vector3(0, 1, 0));\n\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 0.1, 1000);\n\t\tscene.add(camera);\n\n\t\tconst controller = new OrbitControls(camera, canvas);\n\t\tcontroller.target.set(0, 0.5, 0);\n\n\t\tconst clock = new Clock();\n\n\t\tfunction loop(count) {\n\t\t\trequestAnimationFrame(loop);\n\n\t\t\tcontroller.update();\n\t\t\tanimation && animation.update(clock.getDelta() * params.timeScale);\n\n\t\t\tforwardRenderer.render(scene, camera);\n\t\t}\n\t\trequestAnimationFrame(loop);\n\n\t\tfunction onWindowResize() {\n\t\t\twidth = window.innerWidth || 2;\n\t\t\theight = window.innerHeight || 2;\n\n\t\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 0.1, 1000);\n\n\t\t\tforwardRenderer.screenRenderTarget.resize(width * window.devicePixelRatio, height * window.devicePixelRatio);\n\n\t\t\tcanvas.style.width = width + 'px';\n\t\t\tcanvas.style.height = height + 'px';\n\t\t}\n\t\twindow.addEventListener('resize', onWindowResize, false);\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "examples/geometry_loader_gltf3.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>t3d - gltf3</title>\n\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n\t<link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n</head>\n<body>\n    <div id=\"info\">\n        <a href=\"\" target=\"_blank\">t3d</a> - gltf3\n    </div>\n\n\t<script src=\"./libs/nanobar.js\"></script>\n\n\t<!-- Import maps polyfill -->\n    <!-- Remove this when import maps will be widely supported -->\n    <script async src=\"./libs/es-module-shims.js\"></script>\n\n    <script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n    <script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { GLTFLoader } from 't3d/addons/loaders/glTF/GLTFLoader.js';\n\t\timport { TextureCubeLoader } from 't3d/addons/loaders/TextureCubeLoader.js';\n\t\timport { OrbitControls } from 't3d/addons/controls/OrbitControls.js';\n\t\timport { SkyBox } from 't3d/addons/objects/SkyBox.js';\n\t\timport { ForwardRenderer } from 't3d/addons/render/ForwardRenderer.js';\n\n\t\tlet width = window.innerWidth || 2;\n\t\tlet height = window.innerHeight || 2;\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = width * window.devicePixelRatio;\n\t\tcanvas.height = height * window.devicePixelRatio;\n\t\tcanvas.style.width = width + 'px';\n\t\tcanvas.style.height = height + 'px';\n\t\tdocument.body.appendChild(canvas);\n\n\t\tconst forwardRenderer = new ForwardRenderer(canvas);\n\n\t\tconst cubeTexturePath = './resources/skybox/Bridge2/';\n\t\tconst cubeTexture = new TextureCubeLoader().load([\n\t\t\tcubeTexturePath + 'posx.jpg',\n\t\t\tcubeTexturePath + 'negx.jpg',\n\t\t\tcubeTexturePath + 'posy.jpg',\n\t\t\tcubeTexturePath + 'negy.jpg',\n\t\t\tcubeTexturePath + 'posz.jpg',\n\t\t\tcubeTexturePath + 'negz.jpg'\n\t\t]);\n\t\tcubeTexture.encoding = t3d.TEXEL_ENCODING_TYPE.SRGB;\n\n\t\tconst scene = new t3d.Scene();\n\t\tscene.environment = cubeTexture;\n\n\t\tconst skyBox = new SkyBox(cubeTexture);\n\t\tskyBox.level = 0;\n\t\tskyBox.gamma = true;\n\t\tscene.add(skyBox);\n\n\t\tconst nanobar = new Nanobar();\n\t\tnanobar.el.style.background = 'gray';\n\n\t\tconst loadingManager = new t3d.LoadingManager(function() {\n\t\t\tnanobar.go(100);\n\t\t\tnanobar.el.style.background = 'transparent';\n\t\t}, function(url, itemsLoaded, itemsTotal) {\n\t\t\tif (itemsLoaded < itemsTotal) {\n\t\t\t\tnanobar.go(itemsLoaded / itemsTotal * 100);\n\t\t\t}\n\t\t});\n\n\t\tconst loader = new GLTFLoader(loadingManager);\n\t\tloader.autoLogError = false;\n\t\t\n\t\tconsole.time('GLTFLoader');\n\t\tloader.load(\n\t\t\t'./resources/models/gltf/Spheres/Spheres.gltf'\n\t\t).then(function(result) {\n\t\t\tconsole.timeEnd('GLTFLoader');\n\n\t\t\tconst object = result.root;\n\n\t\t\tobject.traverse(node => {\n\t\t\t\tnode.castShadow = true;\n\t\t\t\tnode.receiveShadow = true;\n\t\t\t});\n\n\t\t\tscene.add(object);\n\t\t}).catch(e => console.error(e));\n\n\t\tconst ambientLight = new t3d.AmbientLight(0xffffff, 0.3);\n\t\tscene.add(ambientLight);\n\n\t\tconst directionalLight = new t3d.DirectionalLight(0xffffff, 0.8);\n\t\tdirectionalLight.position.set(0, 30, 30);\n\t\tdirectionalLight.lookAt(new t3d.Vector3(), new t3d.Vector3(0, 1, 0));\n\t\tdirectionalLight.shadow.cameraNear = 1;\n\t\tdirectionalLight.shadow.cameraFar = 100;\n\t\tdirectionalLight.shadow.mapSize.set(1024, 1024);\n\t\tdirectionalLight.shadow.windowSize = 50;\n\t\tdirectionalLight.castShadow = true;\n\t\tscene.add(directionalLight);\n\n\t\tconst camera = new t3d.Camera();\n\t\tcamera.outputEncoding = t3d.TEXEL_ENCODING_TYPE.SRGB;\n\t\tcamera.position.set(40, 30, 40);\n\t\tcamera.lookAt(new t3d.Vector3(0, 0, 0), new t3d.Vector3(0, 1, 0));\n\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 8000);\n\t\tscene.add(camera);\n\n\t\tconst controller = new OrbitControls(camera, canvas);\n\t\tcontroller.enablePan = false;\n\n\t\tfunction loop(count) {\n\t\t\trequestAnimationFrame(loop);\n\n\t\t\tcontroller.update();\n\n\t\t\tforwardRenderer.render(scene, camera);\n\t\t}\n\t\trequestAnimationFrame(loop);\n\n\t\tfunction onWindowResize() {\n\t\t\twidth = window.innerWidth || 2;\n\t\t\theight = window.innerHeight || 2;\n\n\t\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 8000);\n\n\t\t\tforwardRenderer.screenRenderTarget.resize(width * window.devicePixelRatio, height * window.devicePixelRatio);\n\n\t\t\tcanvas.style.width = width + 'px';\n\t\t\tcanvas.style.height = height + 'px';\n\t\t}\n\t\twindow.addEventListener('resize', onWindowResize, false);\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "examples/geometry_loader_gltf_avif.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>t3d - gltf avif</title>\n\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n\t<link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n<body>\n    <div id=\"info\" class=\"dark\">\n        <a href=\"\" target=\"_blank\">t3d</a> - gltf avif<br/>\n\t\tForest House by <a href=\"https://sketchfab.com/peachyroyalty\" target=\"_blank\" rel=\"noopener\">peachyroyalty</a>\n    </div>\n\n\t<script src=\"./libs/nanobar.js\"></script>\n\n\t<!-- Import maps polyfill -->\n    <!-- Remove this when import maps will be widely supported -->\n    <script async src=\"./libs/es-module-shims.js\"></script>\n\n    <script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n    <script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { DRACOLoader } from 't3d/addons/loaders/DRACOLoader.js';\n\t\timport { GLTFLoader } from 't3d/addons/loaders/glTF/GLTFLoader.js';\n\t\timport { OrbitControls } from 't3d/addons/controls/OrbitControls.js';\n\t\timport { ForwardRenderer } from 't3d/addons/render/ForwardRenderer.js';\n\n\t\tlet width = window.innerWidth || 2;\n\t\tlet height = window.innerHeight || 2;\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = width * window.devicePixelRatio;\n\t\tcanvas.height = height * window.devicePixelRatio;\n\t\tcanvas.style.width = width + 'px';\n\t\tcanvas.style.height = height + 'px';\n\t\tdocument.body.appendChild(canvas);\n\n\t\tconst forwardRenderer = new ForwardRenderer(canvas);\n\t\tforwardRenderer.screenRenderTarget.setColorClearValue(246 / 255, 238 / 255, 220 / 255, 1);\n\n\t\tconst scene = new t3d.Scene();\n\n\t\tconst nanobar = new Nanobar();\n\t\tnanobar.el.style.background = 'gray';\n\n\t\tconst loadingManager = new t3d.LoadingManager(function() {\n\t\t\tnanobar.go(100);\n\t\t\tnanobar.el.style.background = 'transparent';\n\t\t}, function(url, itemsLoaded, itemsTotal) {\n\t\t\tif (itemsLoaded < itemsTotal) {\n\t\t\t\tnanobar.go(itemsLoaded / itemsTotal * 100);\n\t\t\t}\n\t\t});\n\n\t\tconst dracoLoader = new DRACOLoader();\n\t\tdracoLoader.setDecoderPath('libs/draco/');\n\n\t\tconst loader = new GLTFLoader(loadingManager);\n\t\tloader.setDRACOLoader(dracoLoader);\n\t\tloader.autoLogError = false;\n\t\t\n\t\tloader.load('resources/models/gltf/forest_house.glb').then(function(result) {\n\t\t\tscene.add(result.root);\n\t\t}).catch(e => console.error(e));\n\n\t\tconst camera = new t3d.Camera();\n\t\tcamera.outputEncoding = t3d.TEXEL_ENCODING_TYPE.SRGB;\n\t\tcamera.position.set(1.5, 4, 9);\n\t\tcamera.lookAt(new t3d.Vector3(0, 0, 0), new t3d.Vector3(0, 1, 0));\n\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 0.1, 100);\n\t\tscene.add(camera);\n\n\t\tconst controller = new OrbitControls(camera, canvas);\n\t\tcontroller.target.set(0, 2, 0);\n\n\t\tfunction loop(count) {\n\t\t\trequestAnimationFrame(loop);\n\n\t\t\tcontroller.update();\n\n\t\t\tforwardRenderer.render(scene, camera);\n\t\t}\n\t\trequestAnimationFrame(loop);\n\n\t\tfunction onWindowResize() {\n\t\t\twidth = window.innerWidth || 2;\n\t\t\theight = window.innerHeight || 2;\n\n\t\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 0.1, 100);\n\n\t\t\tforwardRenderer.screenRenderTarget.resize(width * window.devicePixelRatio, height * window.devicePixelRatio);\n\n\t\t\tcanvas.style.width = width + 'px';\n\t\t\tcanvas.style.height = height + 'px';\n\t\t}\n\t\twindow.addEventListener('resize', onWindowResize, false);\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "examples/geometry_loader_gltf_camera.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>t3d - gltf camera</title>\n\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n\t<link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n</head>\n<body>\n    <div id=\"info\">\n        <a href=\"\" target=\"_blank\">t3d</a> - gltf camera\n    </div>\n\n\t<!-- Import maps polyfill -->\n    <!-- Remove this when import maps will be widely supported -->\n    <script async src=\"./libs/es-module-shims.js\"></script>\n\n    <script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n    <script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { GLTFLoader } from 't3d/addons/loaders/glTF/GLTFLoader.js';\n\t\timport { OrbitControls } from 't3d/addons/controls/OrbitControls.js';\n\t\timport { ForwardRenderer } from 't3d/addons/render/ForwardRenderer.js';\n\n\t\tlet width = window.innerWidth || 2;\n\t\tlet height = window.innerHeight || 2;\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = width * window.devicePixelRatio;\n\t\tcanvas.height = height * window.devicePixelRatio;\n\t\tcanvas.style.width = width + 'px';\n\t\tcanvas.style.height = height + 'px';\n\t\tdocument.body.appendChild(canvas);\n\n\t\tconst forwardRenderer = new ForwardRenderer(canvas);\n\n\t\tconst scene = new t3d.Scene();\n\n\t\tlet camera, controller;\n\n\t\tconst loader = new GLTFLoader();\n\t\tloader.load(\n\t\t\t'./resources/models/gltf/Duck/glTF/Duck.gltf'\n\t\t).then(function(result) {\n\t\t\tscene.add(result.root);\n\t\t\tcamera = result.cameras[0];\n\t\t\tcamera.setPerspective(60 / 180 * Math.PI, width / height, 0.1, 1000);\n\t\t\tcamera.outputEncoding = t3d.TEXEL_ENCODING_TYPE.SRGB;\n\n\t\t\tcontroller = new OrbitControls(camera, canvas);\n\t\t\tcontroller.target.set(0, 1, 0);\n\t\t}).catch(e => console.error(e));\n\t\t\n\t\tconst ambientLight = new t3d.AmbientLight(0xffffff, 0.3);\n\t\tscene.add(ambientLight);\n\n\t\tconst directionalLight = new t3d.DirectionalLight(0xffffff, 0.7);\n\t\tdirectionalLight.position.set(2, 1, -2);\n\t\tdirectionalLight.lookAt(new t3d.Vector3(), new t3d.Vector3(0, 1, 0));\n\t\tscene.add(directionalLight);\n\n\t\tfunction loop(count) {\n\t\t\trequestAnimationFrame(loop);\n\n\t\t\tcontroller && controller.update();\n\n\t\t\tcamera && forwardRenderer.render(scene, camera);\n\t\t}\n\n\t\trequestAnimationFrame(loop);\n\n\t\tfunction onWindowResize() {\n\t\t\twidth = window.innerWidth || 2;\n\t\t\theight = window.innerHeight || 2;\n\n\t\t\tcamera.setPerspective(60 / 180 * Math.PI, width / height, 0.1, 1000);\n\n\t\t\tforwardRenderer.screenRenderTarget.resize(width * window.devicePixelRatio, height * window.devicePixelRatio);\n\n\t\t\tcanvas.style.width = width + 'px';\n\t\t\tcanvas.style.height = height + 'px';\n\t\t}\n\t\twindow.addEventListener('resize', onWindowResize, false);\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "examples/geometry_loader_gltf_draco.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>t3d - gltf draco</title>\n\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n\t<link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n</head>\n<body>\n    <div id=\"info\">\n        <a href=\"\" target=\"_blank\">t3d</a> - gltf draco\n    </div>\n\n\t<script src=\"./libs/nanobar.min.js\"></script>\n\n\t<!-- Import maps polyfill -->\n    <!-- Remove this when import maps will be widely supported -->\n    <script async src=\"./libs/es-module-shims.js\"></script>\n\n    <script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n    <script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { Clock } from 't3d/addons/Clock.js';\n\t\timport { GLTFLoader } from 't3d/addons/loaders/glTF/GLTFLoader.js';\n\t\timport { DRACOLoader } from 't3d/addons/loaders/DRACOLoader.js';\n\t\timport { TextureCubeLoader } from 't3d/addons/loaders/TextureCubeLoader.js';\n\t\timport { OrbitControls } from 't3d/addons/controls/OrbitControls.js';\n\t\timport { SkyBox } from 't3d/addons/objects/SkyBox.js';\n\t\timport { ForwardRenderer } from 't3d/addons/render/ForwardRenderer.js';\n\t\timport Stats from './libs/stats.module.js';\n\n\t\tlet width = window.innerWidth || 2;\n\t\tlet height = window.innerHeight || 2;\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = width * window.devicePixelRatio;\n\t\tcanvas.height = height * window.devicePixelRatio;\n\t\tcanvas.style.width = width + 'px';\n\t\tcanvas.style.height = height + 'px';\n\t\tdocument.body.appendChild(canvas);\n\n\t\tconst forwardRenderer = new ForwardRenderer(canvas);\n\n\t\tconst cubeTexturePath = './resources/skybox/Bridge2/';\n\t\tconst cubeTexture = new TextureCubeLoader().load([\n\t\t\tcubeTexturePath + 'posx.jpg',\n\t\t\tcubeTexturePath + 'negx.jpg',\n\t\t\tcubeTexturePath + 'posy.jpg',\n\t\t\tcubeTexturePath + 'negy.jpg',\n\t\t\tcubeTexturePath + 'posz.jpg',\n\t\t\tcubeTexturePath + 'negz.jpg'\n\t\t]);\n\t\tcubeTexture.encoding = t3d.TEXEL_ENCODING_TYPE.SRGB;\n\n\t\tconst scene = new t3d.Scene();\n\t\tscene.environment = cubeTexture;\n\n\t\tconst skyBox = new SkyBox(cubeTexture);\n\t\tskyBox.level = 4;\n\t\tskyBox.gamma = true;\n\t\tscene.add(skyBox);\n\n\t\tconst nanobar = new Nanobar();\n\t\tnanobar.el.style.background = 'gray';\n\n\t\tconst loadingManager = new t3d.LoadingManager(function() {\n\t\t\tnanobar.go(100);\n\t\t\tnanobar.el.style.background = 'transparent';\n\t\t}, function(url, itemsLoaded, itemsTotal) {\n\t\t\tif (itemsLoaded < itemsTotal) {\n\t\t\t\tnanobar.go(itemsLoaded / itemsTotal * 100);\n\t\t\t}\n\t\t});\n\n\t\tconst dracoLoader = new DRACOLoader();\n\t\tdracoLoader.setDecoderPath('libs/draco/');\n\t\tlet animation;\n\n\t\tconst loader = new GLTFLoader(loadingManager);\n\t\tloader.setDRACOLoader(dracoLoader);\n\t\tconsole.time('GLTFLoader');\n\n\t\tloader.load(\n\t\t\t'./resources/models/gltf/LittlestTokyo.glb'\n\t\t).then(function(result) {\n\t\t\tconsole.timeEnd('GLTFLoader');\n\n\t\t\tconst action = new t3d.AnimationAction(result.animations[0]);\n\t\t\taction.weight = 1;\n\t\t\tanimation = new t3d.AnimationMixer();\n\t\t\tanimation.addAction(action);\n\n\t\t\tscene.add(result.root);\n\t\t});\n\n\t\tconst ambientLight = new t3d.AmbientLight(0xffffff, 0.2);\n\t\tscene.add(ambientLight);\n\n\t\tconst directionalLight = new t3d.DirectionalLight(0xffffff, 1.2);\n\t\tdirectionalLight.position.set(5, 2, 8);\n\t\tdirectionalLight.lookAt(new t3d.Vector3(), new t3d.Vector3(0, 1, 0));\n\t\tscene.add(directionalLight);\n\n\t\tconst camera = new t3d.Camera();\n\t\tcamera.outputEncoding = t3d.TEXEL_ENCODING_TYPE.SRGB;\n\t\tcamera.position.set(-200, 100, 1000);\n\t\tcamera.lookAt(new t3d.Vector3(0, 0, 0), new t3d.Vector3(0, 1, 0));\n\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 10, 5000);\n\t\tscene.add(camera);\n\n\t\tconst controller = new OrbitControls(camera, canvas);\n\t\tcontroller.enablePan = false;\n\t\tcontroller.minDistance = 100;\n\t\tcontroller.maxDistance = 2000;\n\n\t\t// stats\n\t\tconst stats = new Stats();\n\t\tstats.showPanel(0);\n\t\tdocument.body.appendChild(stats.dom);\n\n\t\tconst clock = new Clock();\n\n\t\tfunction loop(count) {\n\t\t\trequestAnimationFrame(loop);\n\n\t\t\tstats.begin();\n\n\t\t\tcontroller.update();\n\n\t\t\tanimation && animation.update(clock.getDelta());\n\n\t\t\tforwardRenderer.render(scene, camera);\n\n\t\t\tstats.end();\n\t\t}\n\n\t\trequestAnimationFrame(loop);\n\n\t\tfunction onWindowResize() {\n\t\t\twidth = window.innerWidth || 2;\n\t\t\theight = window.innerHeight || 2;\n\n\t\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 10, 5000);\n\n\t\t\tforwardRenderer.screenRenderTarget.resize(width * window.devicePixelRatio, height * window.devicePixelRatio);\n\n\t\t\tcanvas.style.width = width + 'px';\n\t\t\tcanvas.style.height = height + 'px';\n\t\t}\n\t\twindow.addEventListener('resize', onWindowResize, false);\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "examples/geometry_loader_gltf_helmat.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>t3d - gltf</title>\n\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n\t<link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n<body>\n    <div id=\"info\">\n        <a href=\"\" target=\"_blank\">t3d</a> - gltf halmat\n    </div>\n\n\t<script src=\"./libs/nanobar.js\"></script>\n\n\t<!-- Import maps polyfill -->\n    <!-- Remove this when import maps will be widely supported -->\n    <script async src=\"./libs/es-module-shims.js\"></script>\n\n    <script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n    <script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { GLTFLoader } from 't3d/addons/loaders/glTF/GLTFLoader.js';\n\t\timport { TextureCubeLoader } from 't3d/addons/loaders/TextureCubeLoader.js';\n\t\timport { OrbitControls } from 't3d/addons/controls/OrbitControls.js';\n\t\timport { SkyBox } from 't3d/addons/objects/SkyBox.js';\n\t\timport { ForwardRenderer } from 't3d/addons/render/ForwardRenderer.js';\n\n\t\tlet width = window.innerWidth || 2;\n\t\tlet height = window.innerHeight || 2;\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = width * window.devicePixelRatio;\n\t\tcanvas.height = height * window.devicePixelRatio;\n\t\tcanvas.style.width = width + 'px';\n\t\tcanvas.style.height = height + 'px';\n\t\tdocument.body.appendChild(canvas);\n\n\t\tconst forwardRenderer = new ForwardRenderer(canvas);\n\n\t\tconst cubeTexturePath = './resources/skybox/Bridge2/';\n\t\tconst cubeTexture = new TextureCubeLoader().load([\n\t\t\tcubeTexturePath + 'posx.jpg',\n\t\t\tcubeTexturePath + 'negx.jpg',\n\t\t\tcubeTexturePath + 'posy.jpg',\n\t\t\tcubeTexturePath + 'negy.jpg',\n\t\t\tcubeTexturePath + 'posz.jpg',\n\t\t\tcubeTexturePath + 'negz.jpg'\n\t\t]);\n\t\tcubeTexture.encoding = t3d.TEXEL_ENCODING_TYPE.SRGB;\n\n\t\tconst scene = new t3d.Scene();\n\t\tscene.environment = cubeTexture;\n\n\t\tconst skyBox = new SkyBox(cubeTexture);\n\t\tskyBox.gamma = true;\n\t\tscene.add(skyBox);\n\n\t\tconst nanobar = new Nanobar();\n\t\tnanobar.el.style.background = 'gray';\n\n\t\tconst loadingManager = new t3d.LoadingManager(function() {\n\t\t\tnanobar.go(100);\n\t\t\tnanobar.el.style.background = 'transparent';\n\t\t}, function(url, itemsLoaded, itemsTotal) {\n\t\t\tif (itemsLoaded < itemsTotal) {\n\t\t\t\tnanobar.go(itemsLoaded / itemsTotal * 100);\n\t\t\t}\n\t\t});\n\n\t\tconst loader = new GLTFLoader(loadingManager);\n\t\tloader.autoLogError = false;\n\t\t\n\t\tconsole.time('GLTFLoader');\n\t\tloader.load(\n\t\t\t'resources/models/gltf/DamagedHelmet/glTF/DamagedHelmet.gltf'\n\t\t).then(function(result) {\n\t\t\tconsole.timeEnd('GLTFLoader');\n\t\t\tscene.add(result.root);\n\t\t}).catch(e => console.error(e));\n\n\t\tconst directionalLight = new t3d.DirectionalLight(0xffffff, 2);\n\t\tdirectionalLight.position.set(-2, 2, 2);\n\t\tdirectionalLight.lookAt(new t3d.Vector3(), new t3d.Vector3(0, 1, 0));\n\t\tscene.add(directionalLight);\n\n\t\tconst camera = new t3d.Camera();\n\t\tcamera.outputEncoding = t3d.TEXEL_ENCODING_TYPE.SRGB;\n\t\tcamera.position.set(-1.5, 0.5, 3);\n\t\tcamera.lookAt(new t3d.Vector3(0, 0, 0), new t3d.Vector3(0, 1, 0));\n\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 0.1, 100);\n\t\tscene.add(camera);\n\n\t\tconst controller = new OrbitControls(camera, canvas);\n\t\tcontroller.enablePan = false;\n\n\t\tfunction loop(count) {\n\t\t\trequestAnimationFrame(loop);\n\n\t\t\tcontroller.update();\n\n\t\t\tforwardRenderer.render(scene, camera);\n\t\t}\n\t\trequestAnimationFrame(loop);\n\n\t\tfunction onWindowResize() {\n\t\t\twidth = window.innerWidth || 2;\n\t\t\theight = window.innerHeight || 2;\n\n\t\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 0.1, 100);\n\n\t\t\tforwardRenderer.screenRenderTarget.resize(width * window.devicePixelRatio, height * window.devicePixelRatio);\n\n\t\t\tcanvas.style.width = width + 'px';\n\t\t\tcanvas.style.height = height + 'px';\n\t\t}\n\t\twindow.addEventListener('resize', onWindowResize, false);\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "examples/geometry_loader_gltf_instancing.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>t3d - gltf</title>\n\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n\t<link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n<body>\n    <div id=\"info\">\n        <a href=\"\" target=\"_blank\">t3d</a> - gltf instancing<br/>\n\t\tModel from <a href=\"https://github.com/KhronosGroup/glTF/tree/main/extensions/2.0/Vendor/EXT_mesh_gpu_instancing/samples/teapots_galore\" target=\"_blank\">teapots_galore</a>\n    </div>\n\n\t<script src=\"./libs/nanobar.js\"></script>\n\n\t<!-- Import maps polyfill -->\n    <!-- Remove this when import maps will be widely supported -->\n    <script async src=\"./libs/es-module-shims.js\"></script>\n\n    <script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n    <script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { ForwardRenderer } from 't3d/addons/render/ForwardRenderer.js';\n\t\timport { EXT_mesh_gpu_instancing } from 't3d/addons/loaders/glTF/extensions/EXT_mesh_gpu_instancing.js';\n\t\timport { GLTFLoader } from 't3d/addons/loaders/glTF/GLTFLoader.js';\n\t\timport { InstancedDepthMaterial } from 't3d/addons/materials/InstancedMaterial.js';\n\t\timport { EnvTextureCubeLoader } from 't3d/addons/loaders/EnvLoader.js';\n\t\timport { OrbitControls } from 't3d/addons/controls/OrbitControls.js';\n\t\timport { SkyBox } from 't3d/addons/objects/SkyBox.js';\n\t\timport Stats from './libs/stats.module.js';\n\n\t\tlet width = window.innerWidth || 2;\n\t\tlet height = window.innerHeight || 2;\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = width * window.devicePixelRatio;\n\t\tcanvas.height = height * window.devicePixelRatio;\n\t\tcanvas.style.width = width + 'px';\n\t\tcanvas.style.height = height + 'px';\n\t\tdocument.body.appendChild(canvas);\n\n\t\tconst forwardRenderer = new ForwardRenderer(canvas);\n\n\t\tconst scene = new t3d.Scene();\n\n\t\tconst envTextureLoader = new EnvTextureCubeLoader();\n\t\tenvTextureLoader.setRenderer(forwardRenderer);\n\t\tenvTextureLoader.loadAsync('./resources/hdr/Grand_Canyon_C.env').then(cubeTexture => {\n\t\t\tscene.environment = cubeTexture;\n\n\t\t\tconst skyBox = new SkyBox(cubeTexture);\n\t\t\tskyBox.gamma = true;\n\t\t\tscene.add(skyBox);\n\t\t});\n\n\t\tconst directionalLight = new t3d.DirectionalLight(0xffffff, 0.8);\n\t\tdirectionalLight.position.set(0, 300, 300);\n\t\tdirectionalLight.castShadow = true;\n\t\tdirectionalLight.shadow.windowSize = 650;\n\t\tdirectionalLight.shadow.cameraNear = 10;\n\t\tdirectionalLight.shadow.cameraFar = 800;\n\t\tdirectionalLight.shadow.mapSize.set(1024, 1024);\n\t\tdirectionalLight.lookAt(new t3d.Vector3(), new t3d.Vector3(0, 1, 0));\n\t\tscene.add(directionalLight);\n\n\t\tconst camera = new t3d.Camera();\n\t\tcamera.outputEncoding = t3d.TEXEL_ENCODING_TYPE.SRGB;\n\t\tcamera.position.set(200, 60, 200);\n\t\tcamera.lookAt(new t3d.Vector3(0, 0, 0), new t3d.Vector3(0, 1, 0));\n\t\tcamera.setPerspective(60 / 180 * Math.PI, width / height, 1, 8000);\n\t\tscene.add(camera);\n\n\t\tconst controller = new OrbitControls(camera, canvas);\n\n\t\tconst nanobar = new Nanobar();\n\t\tnanobar.el.style.background = 'gray';\n\n\t\tconst loadingManager = new t3d.LoadingManager(function() {\n\t\t\tnanobar.go(100);\n\t\t\tnanobar.el.style.background = 'transparent';\n\t\t}, function(url, itemsLoaded, itemsTotal) {\n\t\t\tif (itemsLoaded < itemsTotal) {\n\t\t\t\tnanobar.go(itemsLoaded / itemsTotal * 100);\n\t\t\t}\n\t\t});\n\n\t\tconst loader = new GLTFLoader(loadingManager);\n\t\tloader.autoLogError = true;\n\n\t\t// Set extension as EXT_mesh_gpu_instancing is not included in GLTFLoader by default\n\t\tloader.extensions.set('EXT_mesh_gpu_instancing', EXT_mesh_gpu_instancing);\n\t\t\n\t\tloader.load('./resources/models/gltf/teapots_galore/teapots_galore.gltf').then(result => {\n\t\t\tscene.add(result.root);\n\t\t\tresult.root.traverse(node => {\n\t\t\t\tif (node.isMesh) {\n\t\t\t\t\tnode.castShadow = true;\n\t\t\t\t\tnode.receiveShadow = true;\n\t\t\t\t}\n\t\t\t});\n\t\t}).catch(e => console.error(e));\n\n\t\tconst stats = new Stats();\n\t\tstats.showPanel(0);\n\t\tdocument.body.appendChild(stats.dom);\n\n\t\tfunction loop(count) {\n\t\t\trequestAnimationFrame(loop);\n\n\t\t\tstats.begin();\n\n\t\t\tcontroller.update();\n\n\t\t\tforwardRenderer.render(scene, camera);\n\n\t\t\tstats.end();\n\t\t}\n\t\trequestAnimationFrame(loop);\n\n\t\tfunction onWindowResize() {\n\t\t\twidth = window.innerWidth || 2;\n\t\t\theight = window.innerHeight || 2;\n\n\t\t\tcamera.setPerspective(60 / 180 * Math.PI, width / height, 1, 8000);\n\n\t\t\tforwardRenderer.screenRenderTarget.resize(width * window.devicePixelRatio, height * window.devicePixelRatio);\n\n\t\t\tcanvas.style.width = width + 'px';\n\t\t\tcanvas.style.height = height + 'px';\n\t\t}\n\t\twindow.addEventListener('resize', onWindowResize, false);\n\n\t\t// override shadowMapPass.getDepthMaterial\n\n\t\tconst depthMaterials = [];\n\t\tconst shadowSide = { 'front': t3d.DRAW_SIDE.BACK, 'back': t3d.DRAW_SIDE.FRONT, 'double': t3d.DRAW_SIDE.DOUBLE };\n\t\tforwardRenderer.shadowMapPass.getDepthMaterial = function(renderable) {\n\t\t\tconst useSkinning = !!renderable.object.skeleton;\n\t\t\tconst useMorphing = renderable.geometry.morphAttributes.position && renderable.geometry.morphAttributes.position.length > 0;\n\t\t\tconst useInstancing = renderable.material.defines.USE_INSTANCING;\n\n\t\t\tconst index = useMorphing << 0 | useSkinning << 1 | useInstancing << 2;\n\n\t\t\tlet material = depthMaterials[index];\n\t\t\tif (material === undefined) {\n\t\t\t\tmaterial = useInstancing ? new InstancedDepthMaterial() : new t3d.DepthMaterial();\n\t\t\t\tmaterial.packToRGBA = true;\n\n\t\t\t\tdepthMaterials[index] = material;\n\t\t\t}\n\n\t\t\tmaterial.side = shadowSide[renderable.material.side];\n\n\t\t\tif (useInstancing) {\n\t\t\t\tmaterial.uniforms.instanceOffset.set(renderable.material.uniforms.instanceOffset);\n\t\t\t}\n\n\t\t\treturn material;\n\t\t};\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "examples/geometry_loader_gltf_lights.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>t3d - gltf lights</title>\n\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n\t<link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n</head>\n<body>\n    <div id=\"info\">\n        <a href=\"\" target=\"_blank\">t3d</a> - gltf lights\n    </div>\n\n\t<script src=\"./libs/nanobar.js\"></script>\n\n\t<!-- Import maps polyfill -->\n    <!-- Remove this when import maps will be widely supported -->\n    <script async src=\"./libs/es-module-shims.js\"></script>\n\n    <script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n    <script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { GLTFLoader } from 't3d/addons/loaders/glTF/GLTFLoader.js';\n\t\timport { TextureCubeLoader } from 't3d/addons/loaders/TextureCubeLoader.js';\n\t\timport { OrbitControls } from 't3d/addons/controls/OrbitControls.js';\n\t\timport { ForwardRenderer } from 't3d/addons/render/ForwardRenderer.js';\n\n\t\tlet width = window.innerWidth || 2;\n\t\tlet height = window.innerHeight || 2;\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = width * window.devicePixelRatio;\n\t\tcanvas.height = height * window.devicePixelRatio;\n\t\tcanvas.style.width = width + 'px';\n\t\tcanvas.style.height = height + 'px';\n\t\tdocument.body.appendChild(canvas);\n\n\t\tconst forwardRenderer = new ForwardRenderer(canvas);\n\n\t\tconst cubeTexturePath = './resources/skybox/Bridge2/';\n\t\tconst cubeTexture = new TextureCubeLoader().load([\n\t\t\tcubeTexturePath + 'posx.jpg',\n\t\t\tcubeTexturePath + 'negx.jpg',\n\t\t\tcubeTexturePath + 'posy.jpg',\n\t\t\tcubeTexturePath + 'negy.jpg',\n\t\t\tcubeTexturePath + 'posz.jpg',\n\t\t\tcubeTexturePath + 'negz.jpg'\n\t\t]);\n\t\tcubeTexture.encoding = t3d.TEXEL_ENCODING_TYPE.SRGB;\n\n\t\tconst scene = new t3d.Scene();\n\t\tscene.environment = cubeTexture;\n\n\t\tconst nanobar = new Nanobar();\n\t\tnanobar.el.style.background = 'gray';\n\n\t\tconst loadingManager = new t3d.LoadingManager(function() {\n\t\t\tnanobar.go(100);\n\t\t\tnanobar.el.style.background = 'transparent';\n\t\t}, function(url, itemsLoaded, itemsTotal) {\n\t\t\tif (itemsLoaded < itemsTotal) {\n\t\t\t\tnanobar.go(itemsLoaded / itemsTotal * 100);\n\t\t\t}\n\t\t});\n\n\t\tconst loader = new GLTFLoader(loadingManager);\n\t\tloader.load(\n\t\t\t'./resources/models/gltf/GlamVelvetSofa/glTF-Binary/GlamVelvetSofa.glb'\n\t\t).then(function(result) {\n\t\t\tscene.add(result.root);\n\t\t}).catch(e => console.error(e));\n\n\t\tconst ambientLight = new t3d.AmbientLight(0xffffff, 1);\n\t\tscene.add(ambientLight);\n\n\t\tconst camera = new t3d.Camera();\n\t\tcamera.outputEncoding = t3d.TEXEL_ENCODING_TYPE.SRGB;\n\t\tcamera.position.set(0, 1.5, 3);\n\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 0.1, 1000);\n\t\tscene.add(camera);\n\n\t\tconst controller = new OrbitControls(camera, canvas);\n\t\tcontroller.target.set(0, 0.5, 0);\n\t\tcontroller.enablePan = false;\n\n\t\tfunction loop(count) {\n\t\t\trequestAnimationFrame(loop);\n\n\t\t\tcontroller.update();\n\n\t\t\tforwardRenderer.render(scene, camera);\n\t\t}\n\t\trequestAnimationFrame(loop);\n\n\t\tfunction onWindowResize() {\n\t\t\twidth = window.innerWidth || 2;\n\t\t\theight = window.innerHeight || 2;\n\n\t\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 0.1, 1000);\n\n\t\t\tforwardRenderer.screenRenderTarget.resize(width * window.devicePixelRatio, height * window.devicePixelRatio);\n\n\t\t\tcanvas.style.width = width + 'px';\n\t\t\tcanvas.style.height = height + 'px';\n\t\t}\n\t\twindow.addEventListener('resize', onWindowResize, false);\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "examples/geometry_loader_gltf_materials_clearcoat.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>t3d - gltf materials clearcoat</title>\n\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n\t<link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n<body>\n    <div id=\"info\">\n        <a href=\"\" target=\"_blank\">t3d</a> - gltf materials clearcoat\n    </div>\n\n\t<script src=\"./libs/nanobar.js\"></script>\n\n\t<!-- Import maps polyfill -->\n    <!-- Remove this when import maps will be widely supported -->\n    <script async src=\"./libs/es-module-shims.js\"></script>\n\n    <script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n    <script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { GLTFLoader } from 't3d/addons/loaders/glTF/GLTFLoader.js';\n\t\timport { TextureCubeLoader } from 't3d/addons/loaders/TextureCubeLoader.js';\n\t\timport { OrbitControls } from 't3d/addons/controls/OrbitControls.js';\n\t\timport { SkyBox } from 't3d/addons/objects/SkyBox.js';\n\t\timport { ForwardRenderer } from 't3d/addons/render/ForwardRenderer.js';\n\n\t\tlet width = window.innerWidth || 2;\n\t\tlet height = window.innerHeight || 2;\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = width * window.devicePixelRatio;\n\t\tcanvas.height = height * window.devicePixelRatio;\n\t\tcanvas.style.width = width + 'px';\n\t\tcanvas.style.height = height + 'px';\n\t\tdocument.body.appendChild(canvas);\n\n\t\tconst forwardRenderer = new ForwardRenderer(canvas);\n\n\t\tconst cubeTexturePath = './resources/skybox/Bridge2/';\n\t\tconst cubeTexture = new TextureCubeLoader().load([\n\t\t\tcubeTexturePath + 'posx.jpg',\n\t\t\tcubeTexturePath + 'negx.jpg',\n\t\t\tcubeTexturePath + 'posy.jpg',\n\t\t\tcubeTexturePath + 'negy.jpg',\n\t\t\tcubeTexturePath + 'posz.jpg',\n\t\t\tcubeTexturePath + 'negz.jpg'\n\t\t]);\n\t\tcubeTexture.encoding = t3d.TEXEL_ENCODING_TYPE.SRGB;\n\n\t\tconst scene = new t3d.Scene();\n\t\tscene.environment = cubeTexture;\n\n\t\tconst skyBox = new SkyBox(cubeTexture);\n\t\tskyBox.level = 0;\n\t\tskyBox.gamma = true;\n\t\tscene.add(skyBox);\n\n\t\tconst nanobar = new Nanobar();\n\t\tnanobar.el.style.background = 'gray';\n\n\t\tconst loadingManager = new t3d.LoadingManager(function() {\n\t\t\tnanobar.go(100);\n\t\t\tnanobar.el.style.background = 'transparent';\n\t\t}, function(url, itemsLoaded, itemsTotal) {\n\t\t\tif (itemsLoaded < itemsTotal) {\n\t\t\t\tnanobar.go(itemsLoaded / itemsTotal * 100);\n\t\t\t}\n\t\t});\n\n\t\tconst loader = new GLTFLoader(loadingManager);\n\t\tloader.autoLogError = false;\n\t\t\n\t\tconsole.time('GLTFLoader');\n\t\tloader.load(\n\t\t\t'./resources/models/gltf/ClearCoatTest.glb'\n\t\t).then(function(result) {\n\t\t\tconsole.timeEnd('GLTFLoader');\n\n\t\t\tconst object = result.root;\n\t\t\tscene.add(object);\n\t\t}).catch(e => console.error(e));\n\n\t\tconst ambientLight = new t3d.AmbientLight(0xffffff, 0.5);\n\t\tscene.add(ambientLight);\n\n\t\tconst directionalLight = new t3d.DirectionalLight(0xffffff, 1);\n\t\tdirectionalLight.position.set(0, 10, 30);\n\t\tdirectionalLight.lookAt(new t3d.Vector3(), new t3d.Vector3(0, 1, 0));\n\t\tdirectionalLight.shadow.cameraNear = 1;\n\t\tdirectionalLight.shadow.cameraFar = 100;\n\t\tdirectionalLight.shadow.mapSize.set(1024, 1024);\n\t\tdirectionalLight.shadow.windowSize = 50;\n\t\tdirectionalLight.castShadow = true;\n\t\tscene.add(directionalLight);\n\n\t\tconst camera = new t3d.Camera();\n\t\tcamera.outputEncoding = t3d.TEXEL_ENCODING_TYPE.SRGB;\n\t\tcamera.position.set(2, -2, 18);\n\t\tcamera.lookAt(new t3d.Vector3(0, 0, 0), new t3d.Vector3(0, 1, 0));\n\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 8000);\n\t\tscene.add(camera);\n\n\t\tconst controller = new OrbitControls(camera, canvas);\n\t\tcontroller.enablePan = false;\n\n\t\tfunction loop(count) {\n\t\t\trequestAnimationFrame(loop);\n\n\t\t\tcontroller.update();\n\n\t\t\tforwardRenderer.render(scene, camera);\n\t\t}\n\t\trequestAnimationFrame(loop);\n\n\t\tfunction onWindowResize() {\n\t\t\twidth = window.innerWidth || 2;\n\t\t\theight = window.innerHeight || 2;\n\n\t\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 8000);\n\n\t\t\tforwardRenderer.screenRenderTarget.resize(width * window.devicePixelRatio, height * window.devicePixelRatio);\n\n\t\t\tcanvas.style.width = width + 'px';\n\t\t\tcanvas.style.height = height + 'px';\n\t\t}\n\t\twindow.addEventListener('resize', onWindowResize, false);\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "examples/geometry_loader_gltf_materials_dispersion.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n    <meta charset=\"utf-8\">\n    <title>t3d - gltf materials dispersion</title>\n    <meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n    <link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n</head>\n<body>\n    <div id=\"info\">\n        <a href=\"\" target=\"_blank\">t3d</a> - gltf materials dispersion\n    </div>\n\n    <script src=\"./libs/nanobar.js\"></script>\n\n    <!-- Import maps polyfill -->\n    <!-- Remove this when import maps will be widely supported -->\n    <script async src=\"./libs/es-module-shims.js\"></script>\n\n    <script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n    <script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { GLTFLoader } from 't3d/addons/loaders/glTF/GLTFLoader.js';\n\t\timport { TextureCubeLoader } from 't3d/addons/loaders/TextureCubeLoader.js';\n\t\timport { OrbitControls } from 't3d/addons/controls/OrbitControls.js';\n\t\timport { SkyBox } from 't3d/addons/objects/SkyBox.js';\n\t\timport { FXAAShader } from 't3d/addons/shaders/FXAAShader.js';\n\t\timport { CopyShader } from 't3d/addons/shaders/CopyShader.js';\n\t\timport { KHR_materials_transmission } from 't3d/addons/loaders/glTF/extensions/KHR_materials_transmission.js';\n\t\timport { KHR_materials_ior } from 't3d/addons/loaders/glTF/extensions/KHR_materials_ior.js';\n\t\timport { KHR_materials_volume } from 't3d/addons/loaders/glTF/extensions/KHR_materials_volume.js';\n\t\timport { KHR_materials_dispersion } from 't3d/addons/loaders/glTF/extensions/KHR_materials_dispersion.js';\n\n\t\tlet width = window.innerWidth || 2;\n\t\tlet height = window.innerHeight || 2;\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = width;\n\t\tcanvas.height = height;\n\t\tdocument.body.appendChild(canvas);\n\n\t\tconst cubeTexturePath = './resources/skybox/Bridge2/';\n\t\tconst cubeTexture = new TextureCubeLoader().load([\n\t\t\tcubeTexturePath + 'posx.jpg',\n\t\t\tcubeTexturePath + 'negx.jpg',\n\t\t\tcubeTexturePath + 'posy.jpg',\n\t\t\tcubeTexturePath + 'negy.jpg',\n\t\t\tcubeTexturePath + 'posz.jpg',\n\t\t\tcubeTexturePath + 'negz.jpg'\n\t\t]);\n\t\tcubeTexture.encoding = t3d.TEXEL_ENCODING_TYPE.SRGB;\n\n\t\tconst scene = new t3d.Scene();\n\t\tscene.environment = cubeTexture;\n\n\t\tconst skyBox = new SkyBox(cubeTexture);\n\t\tskyBox.gamma = true;\n\t\tscene.add(skyBox);\n\n\t\tconst screenRenderTarget = new t3d.ScreenRenderTarget(canvas);\n\t\tconst contextParams = { antialias: false, alpha: false };\n\t\tconst gl = canvas.getContext('webgl2', contextParams) || canvas.getContext('webgl', contextParams);\n\t\tconst renderer = new t3d.WebGLRenderer(gl);\n\n\t\tconst camera = new t3d.Camera();\n\t\tcamera.outputEncoding = t3d.TEXEL_ENCODING_TYPE.SRGB;\n\t\tcamera.position.set(0.1, 0.05, 0.15);\n\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 0.01, 5);\n\t\tscene.add(camera);\n\n\t\tconst controller = new OrbitControls(camera, canvas);\n\n\t\tconst ambientLight = new t3d.AmbientLight(0xffffff, 0.2);\n\t\tscene.add(ambientLight);\n\n\t\tconst directionalLight = new t3d.DirectionalLight(0xffffff, 0.8);\n\t\tdirectionalLight.position.set(0, 10, 30);\n\t\tdirectionalLight.lookAt(new t3d.Vector3(), new t3d.Vector3(0, 1, 0));\n\t\tscene.add(directionalLight);\n\n\t\tconst nanobar = new Nanobar();\n\t\tnanobar.el.style.background = 'gray';\n\n\t\tconst loadingManager = new t3d.LoadingManager(function() {\n\t\t\tnanobar.go(100);\n\t\t\tnanobar.el.style.background = 'transparent';\n\t\t}, function(url, itemsLoaded, itemsTotal) {\n\t\t\tif (itemsLoaded < itemsTotal) {\n\t\t\t\tnanobar.go(itemsLoaded / itemsTotal * 100);\n\t\t\t}\n\t\t});\n\n\t\tconst loader = new GLTFLoader(loadingManager);\n\t\tloader.autoLogError = false;\n\t\tloader.extensions.set('KHR_materials_transmission', KHR_materials_transmission);\n\t\tloader.extensions.set('KHR_materials_ior', KHR_materials_ior);\n\t\tloader.extensions.set('KHR_materials_volume', KHR_materials_volume);\n\t\tloader.extensions.set('KHR_materials_dispersion', KHR_materials_dispersion);\n\t\t\n\t\tloader.load('./resources/models/gltf/DispersionTest.glb').then(function(result) {\n\t\t\tconst object = result.root;\n\t\t\tobject.traverse(node => {\n\t\t\t\tif (!node.isMesh) return;\n\t\t\t\tif (node.material.shaderName == 'TransmissionPBR') {\n\t\t\t\t\tnode.renderLayer = 1;\n\t\t\t\t}\n\t\t\t});\n\t\t\trequestAnimationFrame(loop);\n\n\t\t\tscene.add(object);\n\t\t}).catch(e => console.error(e));\n\n\t\tconst sceneRenderTarget = t3d.OffscreenRenderTarget.create2D(width, height);\n\t\tsceneRenderTarget.texture.encoding = t3d.TEXEL_ENCODING_TYPE.SRGB;\n\n\t\tconst transmissionRenderTarget = t3d.OffscreenRenderTarget.create2D(width, height);\n\t\ttransmissionRenderTarget.texture.encoding = t3d.TEXEL_ENCODING_TYPE.SRGB;\n\t\ttransmissionRenderTarget.texture.minFilter = t3d.TEXTURE_FILTER.LINEAR;\n\t\ttransmissionRenderTarget.texture.magFilter = t3d.TEXTURE_FILTER.LINEAR;\n\t\ttransmissionRenderTarget.texture.generateMipmaps = false;\n\n\t\tconst resultRenderTarget = t3d.OffscreenRenderTarget.create2D(width, height);\n\t\tresultRenderTarget.texture.minFilter = t3d.TEXTURE_FILTER.LINEAR;\n\t\tresultRenderTarget.texture.magFilter = t3d.TEXTURE_FILTER.LINEAR;\n\t\tresultRenderTarget.texture.generateMipmaps = false;\n\n\t\tconst depthTexture = new t3d.Texture2D();\n\t\tdepthTexture.type = t3d.PIXEL_TYPE.UNSIGNED_INT_24_8;\n\t\tdepthTexture.format = t3d.PIXEL_FORMAT.DEPTH_STENCIL;\n\t\tdepthTexture.magFilter = t3d.TEXTURE_FILTER.NEAREST;\n\t\tdepthTexture.minFilter = t3d.TEXTURE_FILTER.NEAREST;\n\t\tdepthTexture.generateMipmaps = false;\n\t\tdepthTexture.flipY = false;\n\n\t\tsceneRenderTarget.attach(depthTexture, t3d.ATTACHMENT.DEPTH_STENCIL_ATTACHMENT);\n\t\ttransmissionRenderTarget.attach(depthTexture, t3d.ATTACHMENT.DEPTH_STENCIL_ATTACHMENT);\n\n\t\tconst renderOptions = {\n\t\t\tgetMaterial: function(renderable) {\n\t\t\t\tconst material = renderable.material;\n\t\t\t\tmaterial.uniforms.transmissionSamplerMap = sceneRenderTarget.texture;\n\t\t\t\tmaterial.uniforms.transmissionSamplerSize[0] = sceneRenderTarget.texture.image.width;\n\t\t\t\tmaterial.uniforms.transmissionSamplerSize[1] = sceneRenderTarget.texture.image.height;\n\t\t\t\treturn material;\n\t\t\t}\n\t\t};\n\n\t\tconst copyPass = new t3d.ShaderPostPass(CopyShader);\n\n\t\tconst fxaaPass = new t3d.ShaderPostPass(FXAAShader);\n\n\t\tfunction loop(count) {\n\t\t\trequestAnimationFrame(loop);\n\n\t\t\tcontroller.update();\n\t\t\n\t\t\tscene.updateMatrix();\n\t\t\tconst renderStates = scene.updateRenderStates(camera);\n\t\t\tconst renderQueue = scene.updateRenderQueue(camera);\n\t\t\tconst mainRenderQueueLayer = renderQueue.getLayer(0);\n\t\t\tconst transmissionRenderQueueLayer = renderQueue.getLayer(1);\n\n\t\t\t// Step1: render scene to sceneRenderTarget\n\n\t\t\trenderer.beginRender(sceneRenderTarget);\n\t\t\trenderer.renderRenderableList(mainRenderQueueLayer.opaque, renderStates, {});\n\t\t\trenderer.renderRenderableList(mainRenderQueueLayer.transparent, renderStates, {});\n\t\t\trenderer.endRender();\n\n\t\t\trenderer.generateMipmaps(sceneRenderTarget.texture);\n\n\t\t\t// Step2: render transmission to transmissionRenderTarget\n\n\t\t\ttransmissionRenderTarget.setClear(true, false, false);\n\t\t\trenderer.beginRender(transmissionRenderTarget);\n\t\t\trenderer.renderRenderableList(transmissionRenderQueueLayer.opaque, renderStates, renderOptions);\n\t\t\trenderer.renderRenderableList(transmissionRenderQueueLayer.transparent, renderStates, renderOptions);\n\t\t\trenderer.endRender();\n\n\t\t\t// Step3: blend sceneRenderTarget and transmissionRenderTarget to resultRenderTarget\n\n\t\t\tresultRenderTarget.setClear(false, false, false);\n\n\t\t\tcopyPass.material.transparent = false;\n\t\t\tcopyPass.material.uniforms.tDiffuse = sceneRenderTarget.texture;\n\t\t\tcopyPass.render(renderer, resultRenderTarget);\n\n\t\t\tcopyPass.material.transparent = true;\n\t\t\tcopyPass.material.uniforms.tDiffuse = transmissionRenderTarget.texture;\n\t\t\tcopyPass.render(renderer, resultRenderTarget);\n\n\t\t\t// Step4: render resultRenderTarget to screen\n\n\t\t\tfxaaPass.material.uniforms.tDiffuse = resultRenderTarget.texture;\n\t\t\tfxaaPass.render(renderer, screenRenderTarget);\n\t\t}\n\n\t\tfunction onWindowResize() {\n\t\t\twidth = window.innerWidth || 2;\n\t\t\theight = window.innerHeight || 2;\n\n\t\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 0.01, 5);\n\n\t\t\tscreenRenderTarget.resize(width, height);\n\t\t\tsceneRenderTarget.resize(width, height);\n\t\t\ttransmissionRenderTarget.resize(width, height);\n\t\t\tresultRenderTarget.resize(width, height);\n\t\t}\n\t\twindow.addEventListener('resize', onWindowResize, false);\n    </script>\n</body>\n</html>"
  },
  {
    "path": "examples/geometry_loader_gltf_materials_transmission.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n    <meta charset=\"utf-8\">\n    <title>t3d - gltf materials transmission</title>\n    <meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n    <link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n</head>\n<body>\n    <div id=\"info\">\n        <a href=\"\" target=\"_blank\">t3d</a> - gltf materials transmission\n    </div>\n\n    <script src=\"./libs/nanobar.js\"></script>\n\n    <!-- Import maps polyfill -->\n    <!-- Remove this when import maps will be widely supported -->\n    <script async src=\"./libs/es-module-shims.js\"></script>\n\n    <script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n    <script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { GLTFLoader } from 't3d/addons/loaders/glTF/GLTFLoader.js';\n\t\timport { DRACOLoader } from 't3d/addons/loaders/DRACOLoader.js';\n\t\timport { Timer } from 't3d/addons/misc/Timer.js';\n\t\timport { EnvTextureCubeLoader } from 't3d/addons/loaders/EnvLoader.js';\n\t\timport { OrbitControls } from 't3d/addons/controls/OrbitControls.js';\n\t\timport { SkyBox } from 't3d/addons/objects/SkyBox.js';\n\t\timport { FXAAShader } from 't3d/addons/shaders/FXAAShader.js';\n\t\timport { CopyShader } from 't3d/addons/shaders/CopyShader.js';\n\t\timport { KHR_materials_transmission } from 't3d/addons/loaders/glTF/extensions/KHR_materials_transmission.js';\n\t\timport { KHR_materials_ior } from 't3d/addons/loaders/glTF/extensions/KHR_materials_ior.js';\n\t\timport { KHR_materials_volume } from 't3d/addons/loaders/glTF/extensions/KHR_materials_volume.js';\n\n\t\tlet width = window.innerWidth || 2;\n\t\tlet height = window.innerHeight || 2;\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = width;\n\t\tcanvas.height = height;\n\t\tdocument.body.appendChild(canvas);\n\n\t\tconst scene = new t3d.Scene();\n\n\t\tconst screenRenderTarget = new t3d.ScreenRenderTarget(canvas);\n\t\tconst contextParams = { antialias: false, alpha: false };\n\t\tconst gl = canvas.getContext('webgl2', contextParams) || canvas.getContext('webgl', contextParams);\n\t\tconst renderer = new t3d.WebGLRenderer(gl);\n\n\t\tnew EnvTextureCubeLoader()\n\t\t\t.setRenderer(renderer)\n\t\t\t.loadAsync('./resources/hdr/royal_esplanade_1k.env').then(cubeTexture => {\n\t\t\t\tscene.environment = cubeTexture;\n\n\t\t\t\tconst skyBox = new SkyBox(cubeTexture);\n\t\t\t\tskyBox.gamma = true;\n\t\t\t\tskyBox.level = 3;\n\t\t\t\tscene.add(skyBox);\n\t\t\t});\n\n\t\tconst camera = new t3d.Camera();\n\t\tcamera.outputEncoding = t3d.TEXEL_ENCODING_TYPE.SRGB;\n\t\tcamera.position.set(0, 0.4, 0.7);\n\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 0.01, 20);\n\t\tscene.add(camera);\n\n\t\tconst controller = new OrbitControls(camera, canvas);\n\t\tcontroller.target.set(0, .1, 0);\n\n\t\tconst directionalLight = new t3d.DirectionalLight(0xffffff, 0.8);\n\t\tdirectionalLight.position.set(0, 3, 3);\n\t\tdirectionalLight.lookAt(new t3d.Vector3(), new t3d.Vector3(0, 1, 0));\n\t\tscene.add(directionalLight);\n\n\t\tconst nanobar = new Nanobar();\n\t\tnanobar.el.style.background = 'gray';\n\n\t\tconst loadingManager = new t3d.LoadingManager(function() {\n\t\t\tnanobar.go(100);\n\t\t\tnanobar.el.style.background = 'transparent';\n\t\t}, function(url, itemsLoaded, itemsTotal) {\n\t\t\tif (itemsLoaded < itemsTotal) {\n\t\t\t\tnanobar.go(itemsLoaded / itemsTotal * 100);\n\t\t\t}\n\t\t});\n\n\t\tconst dracoLoader = new DRACOLoader();\n\t\tdracoLoader.setDecoderPath('libs/draco/');\n\n\t\tconst loader = new GLTFLoader(loadingManager);\n\t\tloader.setDRACOLoader(dracoLoader);\n\t\tloader.autoLogError = true;\n\t\tloader.extensions.set('KHR_materials_transmission', KHR_materials_transmission);\n\t\tloader.extensions.set('KHR_materials_ior', KHR_materials_ior);\n\t\tloader.extensions.set('KHR_materials_volume', KHR_materials_volume);\n\n\t\tlet animation;\n\t\t\n\t\tloader.load('./resources/models/gltf/IridescentDishWithOlives.glb').then(function(result) {\n\t\t\tconst object = result.root;\n\t\t\tobject.traverse(node => {\n\t\t\t\tif (!node.isMesh) return;\n\t\t\t\tif (node.material.shaderName == 'TransmissionPBR') {\n\t\t\t\t\tnode.renderLayer = 1;\n\n\t\t\t\t\t// todo support specular extension\n\t\t\t\t\tnode.material.roughness = 0;\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tconst action = new t3d.AnimationAction(result.animations[0]);\n\t\t\taction.weight = 1;\n\t\t\tanimation = new t3d.AnimationMixer();\n\t\t\tanimation.addAction(action);\n\n\t\t\trequestAnimationFrame(loop);\n\n\t\t\tscene.add(object);\n\t\t});\n\n\t\tconst sceneRenderTarget = t3d.OffscreenRenderTarget.create2D(width, height);\n\t\tsceneRenderTarget.texture.encoding = t3d.TEXEL_ENCODING_TYPE.SRGB;\n\n\t\tconst transmissionRenderTarget = t3d.OffscreenRenderTarget.create2D(width, height);\n\t\ttransmissionRenderTarget.texture.encoding = t3d.TEXEL_ENCODING_TYPE.SRGB;\n\t\ttransmissionRenderTarget.texture.minFilter = t3d.TEXTURE_FILTER.LINEAR;\n\t\ttransmissionRenderTarget.texture.magFilter = t3d.TEXTURE_FILTER.LINEAR;\n\t\ttransmissionRenderTarget.texture.generateMipmaps = false;\n\n\t\tconst resultRenderTarget = t3d.OffscreenRenderTarget.create2D(width, height);\n\t\tresultRenderTarget.texture.minFilter = t3d.TEXTURE_FILTER.LINEAR;\n\t\tresultRenderTarget.texture.magFilter = t3d.TEXTURE_FILTER.LINEAR;\n\t\tresultRenderTarget.texture.generateMipmaps = false;\n\n\t\tconst depthTexture = new t3d.Texture2D();\n\t\tdepthTexture.type = t3d.PIXEL_TYPE.UNSIGNED_INT_24_8;\n\t\tdepthTexture.format = t3d.PIXEL_FORMAT.DEPTH_STENCIL;\n\t\tdepthTexture.magFilter = t3d.TEXTURE_FILTER.NEAREST;\n\t\tdepthTexture.minFilter = t3d.TEXTURE_FILTER.NEAREST;\n\t\tdepthTexture.generateMipmaps = false;\n\t\tdepthTexture.flipY = false;\n\n\t\tsceneRenderTarget.attach(depthTexture, t3d.ATTACHMENT.DEPTH_STENCIL_ATTACHMENT);\n\t\ttransmissionRenderTarget.attach(depthTexture, t3d.ATTACHMENT.DEPTH_STENCIL_ATTACHMENT);\n\n\t\tconst renderOptions = {\n\t\t\tgetMaterial: function(renderable) {\n\t\t\t\tconst material = renderable.material;\n\t\t\t\tmaterial.uniforms.transmissionSamplerMap = sceneRenderTarget.texture;\n\t\t\t\tmaterial.uniforms.transmissionSamplerSize[0] = sceneRenderTarget.texture.image.width;\n\t\t\t\tmaterial.uniforms.transmissionSamplerSize[1] = sceneRenderTarget.texture.image.height;\n\t\t\t\treturn material;\n\t\t\t}\n\t\t};\n\n\t\tconst copyPass = new t3d.ShaderPostPass(CopyShader);\n\n\t\tconst fxaaPass = new t3d.ShaderPostPass(FXAAShader);\n\n\t\tconst timer = new Timer();\n\n\t\tfunction loop(timestamp) {\n\t\t\trequestAnimationFrame(loop);\n\n\t\t\ttimer.update(timestamp);\n\n\t\t\tanimation && animation.update(timer.getDelta());\n\n\t\t\tcontroller.update();\n\t\t\n\t\t\tscene.updateMatrix();\n\t\t\tconst renderStates = scene.updateRenderStates(camera);\n\t\t\tconst renderQueue = scene.updateRenderQueue(camera);\n\t\t\tconst mainRenderQueueLayer = renderQueue.getLayer(0);\n\t\t\tconst transmissionRenderQueueLayer = renderQueue.getLayer(1);\n\n\t\t\t// Step1: render scene to sceneRenderTarget\n\n\t\t\trenderer.beginRender(sceneRenderTarget);\n\t\t\trenderer.renderRenderableList(mainRenderQueueLayer.opaque, renderStates, {});\n\t\t\trenderer.renderRenderableList(mainRenderQueueLayer.transparent, renderStates, {});\n\t\t\trenderer.endRender();\n\n\t\t\trenderer.generateMipmaps(sceneRenderTarget.texture);\n\n\t\t\t// Step2: render transmission to transmissionRenderTarget\n\n\t\t\ttransmissionRenderTarget.setClear(true, false, false);\n\t\t\trenderer.beginRender(transmissionRenderTarget);\n\t\t\trenderer.renderRenderableList(transmissionRenderQueueLayer.opaque, renderStates, renderOptions);\n\t\t\trenderer.renderRenderableList(transmissionRenderQueueLayer.transparent, renderStates, renderOptions);\n\t\t\trenderer.endRender();\n\n\t\t\t// Step3: blend sceneRenderTarget and transmissionRenderTarget to resultRenderTarget\n\n\t\t\tresultRenderTarget.setClear(false, false, false);\n\n\t\t\tcopyPass.material.transparent = false;\n\t\t\tcopyPass.material.uniforms.tDiffuse = sceneRenderTarget.texture;\n\t\t\tcopyPass.render(renderer, resultRenderTarget);\n\n\t\t\tcopyPass.material.transparent = true;\n\t\t\tcopyPass.material.uniforms.tDiffuse = transmissionRenderTarget.texture;\n\t\t\tcopyPass.render(renderer, resultRenderTarget);\n\n\t\t\t// Step4: render resultRenderTarget to screen\n\n\t\t\tfxaaPass.material.uniforms.tDiffuse = resultRenderTarget.texture;\n\t\t\tfxaaPass.render(renderer, screenRenderTarget);\n\t\t}\n\n\t\tfunction onWindowResize() {\n\t\t\twidth = window.innerWidth || 2;\n\t\t\theight = window.innerHeight || 2;\n\n\t\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 0.01, 20);\n\n\t\t\tscreenRenderTarget.resize(width, height);\n\t\t\tsceneRenderTarget.resize(width, height);\n\t\t\ttransmissionRenderTarget.resize(width, height);\n\t\t\tresultRenderTarget.resize(width, height);\n\t\t}\n\t\twindow.addEventListener('resize', onWindowResize, false);\n    </script>\n</body>\n</html>"
  },
  {
    "path": "examples/geometry_loader_gltf_materials_unlit.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>t3d - gltf materials unlit</title>\n\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n\t<link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n</head>\n<body>\n    <div id=\"info\">\n        <a href=\"\" target=\"_blank\">t3d</a> - gltf materials unlit\n    </div>\n\n\t<!-- Import maps polyfill -->\n    <!-- Remove this when import maps will be widely supported -->\n    <script async src=\"./libs/es-module-shims.js\"></script>\n\n    <script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n    <script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { Clock } from 't3d/addons/Clock.js';\n\t\timport { GLTFLoader } from 't3d/addons/loaders/glTF/GLTFLoader.js';\n\t\timport { OrbitControls } from 't3d/addons/controls/OrbitControls.js';\n\t\timport { ForwardRenderer } from 't3d/addons/render/ForwardRenderer.js';\n\n\t\tlet width = window.innerWidth || 2;\n\t\tlet height = window.innerHeight || 2;\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = width * window.devicePixelRatio;\n\t\tcanvas.height = height * window.devicePixelRatio;\n\t\tcanvas.style.width = width + 'px';\n\t\tcanvas.style.height = height + 'px';\n\t\tdocument.body.appendChild(canvas);\n\n\t\tconst forwardRenderer = new ForwardRenderer(canvas);\n\n\t\tconst scene = new t3d.Scene();\n\n\t\tlet animation;\n\n\t\tconst loader = new GLTFLoader();\n\t\tloader.load(\n\t\t\t'./resources/models/gltf/BotSkinned/glTF-MaterialsUnlit/Bot_Skinned.gltf'\n\t\t).then(function(result) {\n\t\t\tconst object = result.root;\n\t\t\n\t\t\tanimation = new t3d.AnimationMixer();\n\t\t\tresult.animations.forEach(function(clip) {\n\t\t\t\tconst action = new t3d.AnimationAction(clip);\n\t\t\t\taction.weight = 1;\n\t\t\t\tanimation.addAction(action);\n\t\t\t});\n\n\t\t\tscene.add(object);\n\t\t}).catch(e => console.error(e));\n\n\t\tconst plane_geometry = new t3d.PlaneGeometry(100, 100);\n\t\tconst lambert = new t3d.BasicMaterial();\n\t\tlambert.diffuse.setHex(0x888888);\n\t\tconst plane = new t3d.Mesh(plane_geometry, lambert);\n\t\tscene.add(plane);\n\n\t\tconst camera = new t3d.Camera();\n\t\tcamera.outputEncoding = t3d.TEXEL_ENCODING_TYPE.SRGB;\n\t\tcamera.position.set(-1, 2, 2);\n\t\tcamera.lookAt(new t3d.Vector3(0, 0, 0), new t3d.Vector3(0, 1, 0));\n\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 0.1, 100);\n\t\tscene.add(camera);\n\n\t\tconst controller = new OrbitControls(camera, canvas);\n\t\tcontroller.target.set(0, 1, 0);\n\n\t\tconst clock = new Clock();\n\n\t\tfunction loop(count) {\n\t\t\trequestAnimationFrame(loop);\n\n\t\t\tcontroller.update();\n\n\t\t\tanimation && animation.update(clock.getDelta() * 1.3);\n\n\t\t\tforwardRenderer.render(scene, camera);\n\t\t}\n\t\trequestAnimationFrame(loop);\n\n\t\tfunction onWindowResize() {\n\t\t\twidth = window.innerWidth || 2;\n\t\t\theight = window.innerHeight || 2;\n\n\t\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 0.1, 100);\n\n\t\t\tforwardRenderer.screenRenderTarget.resize(width * window.devicePixelRatio, height * window.devicePixelRatio);\n\n\t\t\tcanvas.style.width = width + 'px';\n\t\t\tcanvas.style.height = height + 'px';\n\t\t}\n\t\twindow.addEventListener('resize', onWindowResize, false);\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "examples/geometry_loader_gltf_meshopt.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>t3d - gltf meshopt</title>\n\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n\t<link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n<body>\n    <div id=\"info\">\n        <a href=\"\" target=\"_blank\">t3d</a> - gltf meshopt\n    </div>\n\n\t<script src=\"./libs/nanobar.js\"></script>\n\n\t<!-- Import maps polyfill -->\n    <!-- Remove this when import maps will be widely supported -->\n    <script async src=\"./libs/es-module-shims.js\"></script>\n\n    <script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n    <script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { GLTFLoader } from 't3d/addons/loaders/glTF/GLTFLoader.js';\n\t\timport { TextureCubeLoader } from 't3d/addons/loaders/TextureCubeLoader.js';\n\t\timport { OrbitControls } from 't3d/addons/controls/OrbitControls.js';\n\t\timport { SkyBox } from 't3d/addons/objects/SkyBox.js';\n\t\timport { ForwardRenderer } from 't3d/addons/render/ForwardRenderer.js';\n\t\t\n\t\timport { KTX2Loader } from 't3d/addons/loaders/KTX2Loader.js';\n\t\timport { MeshoptDecoder } from './libs/meshopt_decoder.module.js';\n\t\timport * as KTXParse from './libs/ktx-parse.module.js';\n\t\timport { ZSTDDecoder } from './libs/zstddec.module.js';\n\n\t\tlet width = window.innerWidth || 2;\n\t\tlet height = window.innerHeight || 2;\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = width * window.devicePixelRatio;\n\t\tcanvas.height = height * window.devicePixelRatio;\n\t\tcanvas.style.width = width + 'px';\n\t\tcanvas.style.height = height + 'px';\n\t\tdocument.body.appendChild(canvas);\n\n\t\tconst forwardRenderer = new ForwardRenderer(canvas);\n\t\t\n\t\tconst cubeTexturePath = './resources/skybox/Bridge2/';\n\t\tconst cubeTexture = new TextureCubeLoader().load([\n\t\t\tcubeTexturePath + 'posx.jpg',\n\t\t\tcubeTexturePath + 'negx.jpg',\n\t\t\tcubeTexturePath + 'posy.jpg',\n\t\t\tcubeTexturePath + 'negy.jpg',\n\t\t\tcubeTexturePath + 'posz.jpg',\n\t\t\tcubeTexturePath + 'negz.jpg'\n\t\t]);\n\t\tcubeTexture.encoding = t3d.TEXEL_ENCODING_TYPE.SRGB;\n\n\t\tconst scene = new t3d.Scene();\n\t\tscene.environment = cubeTexture;\n\n\t\tconst skyBox = new SkyBox(cubeTexture);\n\t\tskyBox.level = 0;\n\t\tskyBox.gamma = true;\n\t\tscene.add(skyBox);\n\n\t\tconst nanobar = new Nanobar();\n\t\tnanobar.el.style.background = 'gray';\n\n\t\tconst loadingManager = new t3d.LoadingManager(function() {\n\t\t\tnanobar.go(100);\n\t\t\tnanobar.el.style.background = 'transparent';\n\t\t}, function(url, itemsLoaded, itemsTotal) {\n\t\t\tif (itemsLoaded < itemsTotal) {\n\t\t\t\tnanobar.go(itemsLoaded / itemsTotal * 100);\n\t\t\t}\n\t\t});\n\n\t\tKTX2Loader.setKTXParser(KTXParse).setZSTDDecoder(ZSTDDecoder);\n\t\tconst ktx2Loader = new KTX2Loader()\n\t\t\t.setTranscoderPath('./libs/basis/')\n\t\t\t.detectSupport(forwardRenderer);\n\t\tconst loader = new GLTFLoader(loadingManager);\n\t\tloader.autoLogError = false;\n\t\tloader.setKTX2Loader(ktx2Loader);\n\t\tloader.setMeshoptDecoder(MeshoptDecoder);\n\t\tconsole.time('GLTFLoader');\n\t\tloader.load(\n\t\t\t'./resources/models/gltf/coffeemat.glb' // meshopt + ktx2\n\t\t).then(function(result) {\n\t\t\tconsole.timeEnd('GLTFLoader');\n\n\t\t\tconst object = result.root;\n\t\t\tobject.position.set(0, -80, 0);\n\n\t\t\tscene.add(object);\n\t\t}).catch(e => console.error(e));\n\n\t\tconst ambientLight = new t3d.AmbientLight(0xffffff, 0.3);\n\t\tscene.add(ambientLight);\n\n\t\tconst directionalLight = new t3d.DirectionalLight(0xffffff, 1);\n\t\tdirectionalLight.position.set(0, 10, 30);\n\t\tdirectionalLight.lookAt(new t3d.Vector3(), new t3d.Vector3(0, 1, 0));\n\t\tscene.add(directionalLight);\n\n\t\tconst camera = new t3d.Camera();\n\t\tcamera.outputEncoding = t3d.TEXEL_ENCODING_TYPE.SRGB;\n\t\tcamera.position.set(-100, 200, 350);\n\t\tcamera.lookAt(new t3d.Vector3(0, 0, 0), new t3d.Vector3(0, 1, 0));\n\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 8000);\n\t\tscene.add(camera);\n\n\t\tconst controller = new OrbitControls(camera, canvas);\n\n\t\tfunction loop(count) {\n\t\t\trequestAnimationFrame(loop);\n\n\t\t\tcontroller.update();\n\n\t\t\tforwardRenderer.render(scene, camera);\n\t\t}\n\t\trequestAnimationFrame(loop);\n\n\t\tfunction onWindowResize() {\n\t\t\twidth = window.innerWidth || 2;\n\t\t\theight = window.innerHeight || 2;\n\n\t\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 8000);\n\n\t\t\tforwardRenderer.screenRenderTarget.resize(width * window.devicePixelRatio, height * window.devicePixelRatio);\n\n\t\t\tcanvas.style.width = width + 'px';\n\t\t\tcanvas.style.height = height + 'px';\n\t\t}\n\t\twindow.addEventListener('resize', onWindowResize, false);\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "examples/geometry_loader_gltf_morphtargets.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>t3d - gltf morphtargets</title>\n\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n\t<link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n</head>\n<body>\n    <div id=\"info\">\n        <a href=\"\" target=\"_blank\">t3d</a> - gltf morphtargets\n    </div>\n\n\t<script type=\"x-shader/x-vertex\" id=\"vertexShader\">\n\t\tattribute vec3 a_Position; \n\t\tattribute vec3 a_Normal;\n\n\t\tuniform mat4 u_ProjectionView;\n\t\tuniform mat4 u_Model;\n\n\t\tvarying vec3 vWorldPosition;\n\n\t\tvoid main() {\n\t\t\tvec4 worldPosition = u_Model * vec4( a_Position, 1.0 );\n\t\t\tvWorldPosition = worldPosition.xyz;\n\n\t\t\tgl_Position = u_ProjectionView * worldPosition;\n\t\t}\n\t</script>\n\n\t<script type=\"x-shader/x-fragment\" id=\"fragmentShader\">\n\t\tuniform vec3 topColor;\n\t\tuniform vec3 bottomColor;\n\t\tuniform float offset;\n\t\tuniform float exponent;\n\n\t\tvarying vec3 vWorldPosition;\n\n\t\tvoid main() {\n\t\t\tfloat h = normalize( vWorldPosition + offset ).y;\n\t\t\tgl_FragColor = vec4( mix( bottomColor, topColor, max( pow( max( h , 0.0), exponent ), 0.0 ) ), 1.0 );\n\t\t}\n\t</script>\n\n\t<!-- Import maps polyfill -->\n    <!-- Remove this when import maps will be widely supported -->\n    <script async src=\"./libs/es-module-shims.js\"></script>\n\n    <script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n    <script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { Clock } from 't3d/addons/Clock.js';\n\t\timport { GLTFLoader } from 't3d/addons/loaders/glTF/GLTFLoader.js';\n\t\timport { OrbitControls } from 't3d/addons/controls/OrbitControls.js';\n\t\timport { ForwardRenderer } from 't3d/addons/render/ForwardRenderer.js';\n\n\t\tlet width = window.innerWidth || 2;\n\t\tlet height = window.innerHeight || 2;\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = width * window.devicePixelRatio;\n\t\tcanvas.height = height * window.devicePixelRatio;\n\t\tcanvas.style.width = width + 'px';\n\t\tcanvas.style.height = height + 'px';\n\t\tdocument.body.appendChild(canvas);\n\n\t\tconst forwardRenderer = new ForwardRenderer(canvas);\n\n\t\tconst scene = new t3d.Scene();\n\t\tscene.fog = new t3d.Fog(0xffffff, 1, 5000);\n\n\t\tlet animation;\n\n\t\tconst loader = new GLTFLoader();\n\t\tloader.load(\n\t\t\t'./resources/models/gltf/Flamingo.glb'\n\t\t).then(function(result) {\n\t\t\t// add mesh to scene\n\t\t\tconst object = result.root.children[0];\n\t\t\tobject.castShadow = true;\n\t\t\tresult.root.scale.set(0.35, 0.35, 0.35);\n\t\t\tresult.root.position.set(0, 15, 0);\n\t\t\tresult.root.euler.y = -1;\n\n\t\t\tobject.frustumCulled = false;\n\n\t\t\tanimation = new t3d.AnimationMixer();\n\t\t\tresult.animations.forEach(function(clip) {\n\t\t\t\tconst action = new t3d.AnimationAction(clip);\n\t\t\t\taction.weight = 1;\n\t\t\t\tanimation.addAction(action);\n\t\t\t});\n\n\t\t\tscene.add(result.root);\n\t\t}).catch(e => console.error(e));\n\n\t\tconst plane_geometry = new t3d.PlaneGeometry(10000, 10000);\n\t\tconst lambert = new t3d.LambertMaterial();\n\t\tlambert.diffuse.setHSL(0.095, 1, 0.75);\n\t\tconst plane = new t3d.Mesh(plane_geometry, lambert);\n\t\tplane.receiveShadow = true;\n\t\tplane.position.y = -33;\n\t\tscene.add(plane);\n\n\t\tconst hemisphereLight = new t3d.HemisphereLight(0xffffff, 0xffffff, 0.6);\n\t\themisphereLight.color.setHSL(0.6, 1, 0.6);\n\t\themisphereLight.groundColor.setHSL(0.095, 1, 0.75);\n\t\themisphereLight.position.set(0, 50, 0);\n\t\tscene.add(hemisphereLight);\n\n\t\tconst directionalLight = new t3d.DirectionalLight(0xffffff, 1);\n\t\tdirectionalLight.color.setHSL(0.1, 1, 0.95);\n\t\tdirectionalLight.position.set(-1, 1.75, 1);\n\t\tdirectionalLight.position.multiplyScalar(30);\n\t\tdirectionalLight.lookAt(new t3d.Vector3(0, 0, 0), new t3d.Vector3(0, 1, 0));\n\t\tdirectionalLight.shadow.windowSize = 100;\n\t\tdirectionalLight.shadow.mapSize.set(2048, 2048);\n\t\tdirectionalLight.castShadow = true;\n\t\tscene.add(directionalLight);\n\n\t\t// SKYDOME\n\n\t\tconst vertexShader = document.getElementById('vertexShader').textContent;\n\t\tconst fragmentShader = document.getElementById('fragmentShader').textContent;\n\t\tconst uniforms = {\n\t\t\t'topColor': new Float32Array([1, 1, 1]),\n\t\t\t'bottomColor': new Float32Array([1, 1, 1]),\n\t\t\t'offset': 33,\n\t\t\t'exponent': 0.6\n\t\t};\n\t\themisphereLight.color.toArray(uniforms['topColor']);\n\n\t\tscene.fog.color.fromArray(uniforms['bottomColor']);\n\n\t\tconst skyGeo = new t3d.SphereGeometry(4000, 32, 15);\n\t\tconst skyMat = new t3d.ShaderMaterial({\n\t\t\tuniforms: uniforms,\n\t\t\tvertexShader: vertexShader,\n\t\t\tfragmentShader: fragmentShader\n\t\t});\n\t\tskyMat.side = t3d.DRAW_SIDE.BACK;\n\n\t\tconst sky = new t3d.Mesh(skyGeo, skyMat);\n\t\tscene.add(sky);\n\n\t\tconst camera = new t3d.Camera();\n\t\tcamera.outputEncoding = t3d.TEXEL_ENCODING_TYPE.SRGB;\n\t\tcamera.position.set(0, 0, 250);\n\t\tcamera.lookAt(new t3d.Vector3(0, 0, 0), new t3d.Vector3(0, 1, 0));\n\t\tcamera.setPerspective(30 / 180 * Math.PI, width / height, 1, 5000);\n\t\tscene.add(camera);\n\n\t\tconst controller = new OrbitControls(camera, canvas);\n\n\t\tconst clock = new Clock();\n\n\t\tfunction loop(count) {\n\t\t\trequestAnimationFrame(loop);\n\n\t\t\tcontroller.update();\n\n\t\t\tanimation && animation.update(clock.getDelta());\n\n\t\t\tforwardRenderer.screenRenderTarget.setColorClearValue(hemisphereLight.color.r, hemisphereLight.color.g, hemisphereLight.color.b, 1);\n\n\t\t\tforwardRenderer.render(scene, camera);\n\t\t}\n\t\trequestAnimationFrame(loop);\n\n\t\tfunction onWindowResize() {\n\t\t\twidth = window.innerWidth || 2;\n\t\t\theight = window.innerHeight || 2;\n\n\t\t\tcamera.setPerspective(30 / 180 * Math.PI, width / height, 1, 5000);\n\n\t\t\tforwardRenderer.screenRenderTarget.resize(width * window.devicePixelRatio, height * window.devicePixelRatio);\n\n\t\t\tcanvas.style.width = width + 'px';\n\t\t\tcanvas.style.height = height + 'px';\n\t\t}\n\t\twindow.addEventListener('resize', onWindowResize, false);\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "examples/geometry_loader_gltf_pointer.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>t3d - gltf pointer</title>\n\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n\t<link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n</head>\n<body>\n    <div id=\"info\">\n        <a href=\"\" target=\"_blank\">t3d</a> - gltf pointer extension\n    </div>\n\n\t<script src=\"./libs/nanobar.js\"></script>\n\n\t<!-- Import maps polyfill -->\n    <!-- Remove this when import maps will be widely supported -->\n    <script async src=\"./libs/es-module-shims.js\"></script>\n\n    <script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n    <script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { Timer } from 't3d/addons/misc/Timer.js';\n\t\timport { GLTFLoader } from 't3d/addons/loaders/glTF/GLTFLoader.js';\n\t\timport { OrbitControls } from 't3d/addons/controls/OrbitControls.js';\n\t\timport { ForwardRenderer } from 't3d/addons/render/ForwardRenderer.js';\n\n\t\tconst devicePixelRatio = window.devicePixelRatio;\n\n\t\tlet width = window.innerWidth || 2;\n\t\tlet height = window.innerHeight || 2;\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = Math.floor(width * devicePixelRatio);\n\t\tcanvas.height = Math.floor(height * devicePixelRatio);\n\t\tcanvas.style.width = width + 'px';\n\t\tcanvas.style.height = height + 'px';\n\t\tdocument.body.appendChild(canvas);\n\n\t\tconst forwardRenderer = new ForwardRenderer(canvas);\n\t\tforwardRenderer.screenRenderTarget.setColorClearValue(0.6, 0.7, 0.8, 1);\n\n\t\tconst scene = new t3d.Scene();\n\n\t\tconst camera = new t3d.Camera();\n\t\tcamera.outputEncoding = t3d.TEXEL_ENCODING_TYPE.SRGB;\n\t\tcamera.position.set(0, 0, 20);\n\t\tcamera.lookAt(new t3d.Vector3(0, 2, 0), new t3d.Vector3(0, 1, 0));\n\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 1000);\n\t\tscene.add(camera);\n\n\t\tconst controller = new OrbitControls(camera, canvas);\n\n\t\t// lights\n\n\t\tconst ambientLight = new t3d.AmbientLight(0xffffff, 0.2);\n\t\tscene.add(ambientLight);\n\n\t\tconst directionalLight = new t3d.DirectionalLight(0xffffff, 1);\n\t\tdirectionalLight.position.set(3, 4, 5);\n\t\tdirectionalLight.lookAt(new t3d.Vector3(), new t3d.Vector3(0, 1, 0));\n\t\tscene.add(directionalLight);\n\n\t\t// model\n\n\t\tconst nanobar = new Nanobar();\n\t\tnanobar.el.style.background = 'gray';\n\n\t\tconst loadingManager = new t3d.LoadingManager(function() {\n\t\t\tnanobar.go(100);\n\t\t\tnanobar.el.style.background = 'transparent';\n\t\t}, function(url, itemsLoaded, itemsTotal) {\n\t\t\tif (itemsLoaded < itemsTotal) {\n\t\t\t\tnanobar.go(itemsLoaded / itemsTotal * 100);\n\t\t\t}\n\t\t});\n\n\t\tlet animation;\n\n\t\tconst loader = new GLTFLoader(loadingManager);\n\t\tloader.load('./resources/models/gltf/PointerTest.glb').then(function(result) {\n\t\t\tconst object = result.root;\n\n\t\t\t// transform action\n\t\t\tconst action1 = new t3d.AnimationAction(result.animations[0]);\n\t\t\taction1.weight = 1;\n\n\t\t\t// material action\n\t\t\tconst action2 = new t3d.AnimationAction(result.animations[1]);\n\t\t\taction2.weight = 1;\n\n\t\t\tanimation = new t3d.AnimationMixer();\n\t\t\tanimation.addAction(action1);\n\t\t\tanimation.addAction(action2);\n\t\t\n\t\t\tscene.add(object);\n\t\t});\n\n\t\tconst timer = new Timer();\n\n\t\tfunction loop(timestamp) {\n\t\t\trequestAnimationFrame(loop);\n\n\t\t\ttimer.update(timestamp);\n\n\t\t\tcontroller.update();\n\n\t\t\tanimation && animation.update(timer.getDelta());\n\n\t\t\tforwardRenderer.render(scene, camera);\n\t\t}\n\t\trequestAnimationFrame(loop);\n\n\t\tfunction onWindowResize() {\n\t\t\twidth = window.innerWidth || 2;\n\t\t\theight = window.innerHeight || 2;\n\n\t\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 1000);\n\n\t\t\tforwardRenderer.screenRenderTarget.resize(Math.floor(width * devicePixelRatio), Math.floor(height * devicePixelRatio));\n\n\t\t\tcanvas.style.width = width + 'px';\n\t\t\tcanvas.style.height = height + 'px';\n\t\t}\n\t\twindow.addEventListener('resize', onWindowResize, false);\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "examples/geometry_loader_gltf_skinning.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>t3d - gltf skinning</title>\n\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n\t<link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n</head>\n<body>\n    <div id=\"info\">\n        <a href=\"\" target=\"_blank\">t3d</a> - gltf skinning\n    </div>\n\n\t<script src=\"./libs/nanobar.js\"></script>\n\n\t<!-- Import maps polyfill -->\n    <!-- Remove this when import maps will be widely supported -->\n    <script async src=\"./libs/es-module-shims.js\"></script>\n\n    <script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n    <script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { Clock } from 't3d/addons/Clock.js';\n\t\timport { GLTFLoader } from 't3d/addons/loaders/glTF/GLTFLoader.js';\n\t\timport { TextureCubeLoader } from 't3d/addons/loaders/TextureCubeLoader.js';\n\t\timport { OrbitControls } from 't3d/addons/controls/OrbitControls.js';\n\t\timport { ForwardRenderer } from 't3d/addons/render/ForwardRenderer.js';\n\t\timport { SkeletonHelper } from 't3d/addons/objects/SkeletonHelper.js';\n\t\timport { GUI } from './libs/lil-gui.esm.min.js';\n\t\timport Stats from './libs/stats.module.js';\n\n\t\tconst devicePixelRatio = window.devicePixelRatio;\n\n\t\tlet width = window.innerWidth || 2;\n\t\tlet height = window.innerHeight || 2;\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = Math.floor(width * devicePixelRatio);\n\t\tcanvas.height = Math.floor(height * devicePixelRatio);\n\t\tcanvas.style.width = width + 'px';\n\t\tcanvas.style.height = height + 'px';\n\t\tdocument.body.appendChild(canvas);\n\n\t\tconst forwardRenderer = new ForwardRenderer(canvas);\n\t\tforwardRenderer.screenRenderTarget.setColorClearValue(0.6, 0.7, 0.8, 1);\n\n\t\tconst cubeTexturePath = './resources/skybox/Bridge2/';\n\t\tconst cubeTexture = new TextureCubeLoader().load([\n\t\t\tcubeTexturePath + 'posx.jpg',\n\t\t\tcubeTexturePath + 'negx.jpg',\n\t\t\tcubeTexturePath + 'posy.jpg',\n\t\t\tcubeTexturePath + 'negy.jpg',\n\t\t\tcubeTexturePath + 'posz.jpg',\n\t\t\tcubeTexturePath + 'negz.jpg'\n\t\t]);\n\t\tcubeTexture.encoding = t3d.TEXEL_ENCODING_TYPE.SRGB;\n\n\t\tconst scene = new t3d.Scene();\n\t\tscene.fog = new t3d.Fog(undefined, 10, 100);\n\t\tscene.fog.color.setRGB(0.6, 0.7, 0.8);\n\t\tscene.environment = cubeTexture;\n\n\t\tlet animation;\n\t\tconst params = { clipName: '', timeScale: 1, skeleton: false, loop: true };\n\n\t\tconst nanobar = new Nanobar();\n\t\tnanobar.el.style.background = 'gray';\n\n\t\tconst loadingManager = new t3d.LoadingManager(function() {\n\t\t\tnanobar.go(100);\n\t\t\tnanobar.el.style.background = 'transparent';\n\t\t}, function(url, itemsLoaded, itemsTotal) {\n\t\t\tif (itemsLoaded < itemsTotal) {\n\t\t\t\tnanobar.go(itemsLoaded / itemsTotal * 100);\n\t\t\t}\n\t\t});\n\n\t\tconst loader = new GLTFLoader(loadingManager);\n\t\tloader.load(\n\t\t\t'./resources/models/gltf/UinoSpaceman/glTF-Binary/UinoSpaceman.glb'\n\t\t).then(function(result) {\n\t\t\tconst object = result.root;\n\n\t\t\tobject.traverse(function(node) {\n\t\t\t\tif (node.material) {\n\t\t\t\t\tnode.castShadow = true;\n\t\t\t\t\t// node.receiveShadow = true;\n\t\t\t\t\tnode.frustumCulled = false;\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tanimation = new t3d.AnimationMixer();\n\t\t\tresult.animations.forEach(function(clip) {\n\t\t\t\tconst action = new t3d.AnimationAction(clip);\n\t\t\t\tanimation.addAction(action);\n\t\t\t});\n\n\t\t\tconst actions = animation.getActions();\n\t\t\tconst animNames = actions.map(function(action) {\n\t\t\t\treturn action.clip.name;\n\t\t\t});\n\n\t\t\tlet actionIndex = 0;\n\n\t\t\tactions[actionIndex].time = 0;\n\t\t\tactions[actionIndex].weight = 1;\n\n\t\t\tconst currentAnimName = actions[actionIndex].clip.name;\n\t\t\tparams.clipName = currentAnimName;\n\n\t\t\tscene.add(object);\n\n\t\t\tconst skeletonHelper = new SkeletonHelper(scene);\n\n\t\t\tconst gui = new GUI();\n\t\t\tgui.add(params, 'clipName', animNames).onChange(value => {\n\t\t\t\tconst lastActionIndex = actionIndex;\n\n\t\t\t\tactionIndex = actions.findIndex(function(action) {\n\t\t\t\t\treturn action.clip.name === value;\n\t\t\t\t});\n\n\t\t\t\tif (lastActionIndex !== actionIndex) {\n\t\t\t\t\tactions[lastActionIndex].time = 0;\n\t\t\t\t\tactions[lastActionIndex].weight = 0;\n\n\t\t\t\t\tactions[actionIndex].time = 0;\n\t\t\t\t\tactions[actionIndex].weight = 1;\n\t\t\t\t}\n\t\t\t});\n\t\t\tgui.add(params, 'timeScale', -2, 2, 0.1);\n\t\t\n\t\t\tconst skeleton = gui.addFolder('Skeleton').close();\n\t\t\tskeleton.add(params, 'skeleton').onChange(value => {\n\t\t\t\tif (value) {\n\t\t\t\t\tscene.add(skeletonHelper);\n\t\t\t\t} else {\n\t\t\t\t\tscene.remove(skeletonHelper);\n\t\t\t\t}\n\t\t\t});\n\t\t\tskeleton.addColor(skeletonHelper, 'colorMax');\n\t\t\tskeleton.addColor(skeletonHelper, 'colorMin');\n\t\t\tskeleton.add(skeletonHelper, 'midStep', 0, 1, 0.01);\n\t\t\tskeleton.add(skeletonHelper, 'midWidthScale', 0, 1, 0.01);\n\t\t\tskeleton.add(skeletonHelper, 'ballScale', 0, 1, 0.01);\n\t\t}).catch(e => console.error(e));\n\n\t\tconst plane_geometry = new t3d.PlaneGeometry(1000, 1000);\n\t\tconst plane_material = new t3d.PBRMaterial();\n\t\tplane_material.roughness = 1;\n\t\tplane_material.diffuse.setHex(0x888888);\n\t\tconst plane = new t3d.Mesh(plane_geometry, plane_material);\n\t\tplane.receiveShadow = true;\n\t\tscene.add(plane);\n\n\t\tconst ambientLight = new t3d.AmbientLight(0xffffff, 0.4);\n\t\tscene.add(ambientLight);\n\n\t\tconst directionalLight = new t3d.DirectionalLight(0xffffff, 1);\n\t\tdirectionalLight.position.set(-4, 5, 4);\n\t\tdirectionalLight.lookAt(new t3d.Vector3(), new t3d.Vector3(0, 1, 0));\n\t\tdirectionalLight.shadow.windowSize = 8;\n\t\tdirectionalLight.shadow.cameraNear = 2;\n\t\tdirectionalLight.shadow.cameraFar = 20;\n\t\tdirectionalLight.castShadow = true;\n\t\tscene.add(directionalLight);\n\n\t\tconst camera = new t3d.Camera();\n\t\tcamera.outputEncoding = t3d.TEXEL_ENCODING_TYPE.SRGB;\n\t\tcamera.position.set(4, 3, 4);\n\t\tcamera.lookAt(new t3d.Vector3(0, 2, 0), new t3d.Vector3(0, 1, 0));\n\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 1000);\n\t\tscene.add(camera);\n\n\t\tconst controller = new OrbitControls(camera, canvas);\n\t\tcontroller.target.set(0, 1.5, 0);\n\n\t\t// stats\n\t\tconst stats = new Stats();\n\t\tstats.showPanel(0);\n\t\tdocument.body.appendChild(stats.dom);\n\n\t\tconst clock = new Clock();\n\n\t\tfunction loop(count) {\n\t\t\trequestAnimationFrame(loop);\n\n\t\t\tstats.begin();\n\n\t\t\tcontroller.update();\n\n\t\t\tanimation && animation.update(clock.getDelta() * params.timeScale);\n\n\t\t\tforwardRenderer.render(scene, camera);\n\n\t\t\tstats.end();\n\t\t}\n\t\trequestAnimationFrame(loop);\n\n\t\tfunction onWindowResize() {\n\t\t\twidth = window.innerWidth || 2;\n\t\t\theight = window.innerHeight || 2;\n\n\t\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 1000);\n\n\t\t\tforwardRenderer.screenRenderTarget.resize(Math.floor(width * devicePixelRatio), Math.floor(height * devicePixelRatio));\n\n\t\t\tcanvas.style.width = width + 'px';\n\t\t\tcanvas.style.height = height + 'px';\n\t\t}\n\t\twindow.addEventListener('resize', onWindowResize, false);\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "examples/geometry_loader_gltf_tangent.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>t3d - gltf tangent</title>\n\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n\t<link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n</head>\n<body>\n    <div id=\"info\">\n        <a href=\"\" target=\"_blank\">t3d</a> - gltf\n    </div>\n\n\t<script src=\"./libs/nanobar.js\"></script>\n\n\t<!-- Import maps polyfill -->\n    <!-- Remove this when import maps will be widely supported -->\n    <script async src=\"./libs/es-module-shims.js\"></script>\n\n    <script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n    <script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { GLTFLoader } from 't3d/addons/loaders/glTF/GLTFLoader.js';\n\t\timport { TextureCubeLoader } from 't3d/addons/loaders/TextureCubeLoader.js';\n\t\timport { OrbitControls } from 't3d/addons/controls/OrbitControls.js';\n\t\timport { ForwardRenderer } from 't3d/addons/render/ForwardRenderer.js';\n\n\t\tlet width = window.innerWidth || 2;\n\t\tlet height = window.innerHeight || 2;\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = width * window.devicePixelRatio;\n\t\tcanvas.height = height * window.devicePixelRatio;\n\t\tcanvas.style.width = width + 'px';\n\t\tcanvas.style.height = height + 'px';\n\t\tdocument.body.appendChild(canvas);\n\n\t\tconst forwardRenderer = new ForwardRenderer(canvas);\n\n\t\tconst cubeTexturePath = './resources/skybox/Bridge2/';\n\t\tconst cubeTexture = new TextureCubeLoader().load([\n\t\t\tcubeTexturePath + 'posx.jpg',\n\t\t\tcubeTexturePath + 'negx.jpg',\n\t\t\tcubeTexturePath + 'posy.jpg',\n\t\t\tcubeTexturePath + 'negy.jpg',\n\t\t\tcubeTexturePath + 'posz.jpg',\n\t\t\tcubeTexturePath + 'negz.jpg'\n\t\t]);\n\t\tcubeTexture.encoding = t3d.TEXEL_ENCODING_TYPE.SRGB;\n\n\t\tconst scene = new t3d.Scene();\n\t\tscene.environment = cubeTexture;\n\n\t\tconst nanobar = new Nanobar();\n\t\tnanobar.el.style.background = 'gray';\n\n\t\tconst loadingManager = new t3d.LoadingManager(function() {\n\t\t\tnanobar.go(100);\n\t\t\tnanobar.el.style.background = 'transparent';\n\t\t}, function(url, itemsLoaded, itemsTotal) {\n\t\t\tif (itemsLoaded < itemsTotal) {\n\t\t\t\tnanobar.go(itemsLoaded / itemsTotal * 100);\n\t\t\t}\n\t\t});\n\n\t\tconst loader = new GLTFLoader(loadingManager);\n\t\tloader.load(\n\t\t\t// NormalTangentMirrorTest NormalTangentTest\n\t\t\t// './resources/models/gltf/NormalTangentTest/glTF/NormalTangentTest.gltf'\n\t\t\t'./resources/models/gltf/NormalTangentMirrorTest/glTF/NormalTangentMirrorTest.gltf'\n\t\t).then(function(result) {\n\t\t\tscene.add(result.root);\n\t\t}).catch(e => console.error(e));\n\n\t\tconst ambientLight = new t3d.AmbientLight(0xffffff, 0.3);\n\t\tscene.add(ambientLight);\n\n\t\tconst directionalLight = new t3d.DirectionalLight(0xbbbbff, 0.5);\n\t\tdirectionalLight.position.set(-30, 30, 0);\n\t\tdirectionalLight.lookAt(new t3d.Vector3(), new t3d.Vector3(0, 1, 0));\n\t\tscene.add(directionalLight);\n\n\t\tconst camera = new t3d.Camera();\n\t\tcamera.outputEncoding = t3d.TEXEL_ENCODING_TYPE.SRGB;\n\t\tcamera.position.set(0, 0, 4);\n\t\tcamera.lookAt(new t3d.Vector3(0, 0, 0), new t3d.Vector3(0, 1, 0));\n\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 8000);\n\t\tscene.add(camera);\n\n\t\tconst controller = new OrbitControls(camera, canvas);\n\t\tcontroller.enablePan = false;\n\n\t\tfunction loop(count) {\n\t\t\trequestAnimationFrame(loop);\n\n\t\t\tcontroller.update();\n\n\t\t\tforwardRenderer.render(scene, camera);\n\t\t}\n\t\trequestAnimationFrame(loop);\n\n\t\tfunction onWindowResize() {\n\t\t\twidth = window.innerWidth || 2;\n\t\t\theight = window.innerHeight || 2;\n\n\t\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 8000);\n\n\t\t\tforwardRenderer.screenRenderTarget.resize(width * window.devicePixelRatio, height * window.devicePixelRatio);\n\n\t\t\tcanvas.style.width = width + 'px';\n\t\t\tcanvas.style.height = height + 'px';\n\t\t}\n\t\twindow.addEventListener('resize', onWindowResize, false);\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "examples/geometry_loader_gltf_uvtransform.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>t3d - gltf uv transform</title>\n\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n\t<link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n</head>\n<body>\n    <div id=\"info\">\n        <a href=\"\" target=\"_blank\">t3d</a> - gltf uv transform\n    </div>\n\n\t<!-- Import maps polyfill -->\n    <!-- Remove this when import maps will be widely supported -->\n    <script async src=\"./libs/es-module-shims.js\"></script>\n\n    <script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n    <script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { GLTFLoader } from 't3d/addons/loaders/glTF/GLTFLoader.js';\n\t\timport { OrbitControls } from 't3d/addons/controls/OrbitControls.js';\n\t\timport { ForwardRenderer } from 't3d/addons/render/ForwardRenderer.js';\n\n\t\tlet width = window.innerWidth || 2;\n\t\tlet height = window.innerHeight || 2;\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = width * window.devicePixelRatio;\n\t\tcanvas.height = height * window.devicePixelRatio;\n\t\tcanvas.style.width = width + 'px';\n\t\tcanvas.style.height = height + 'px';\n\t\tdocument.body.appendChild(canvas);\n\n\t\tconst forwardRenderer = new ForwardRenderer(canvas);\n\n\t\tconst scene = new t3d.Scene();\n\n\t\tconst loader = new GLTFLoader();\n\t\tloader.load(\n\t\t\t'./resources/models/gltf/TextureTransformTest/glTF/TextureTransformTest.gltf'\n\t\t).then(function(result) {\n\t\t\tresult.root.traverse(function(obj) {\n\t\t\t\tif (obj.isMesh) {\n\t\t\t\t\tobj.frustumCulled = false;\n\t\t\t\t\tobj.material.side = t3d.DRAW_SIDE.DOUBLE;\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t// add mesh to scene\n\t\t\tconst children = result.root.children.slice(0);\n\t\t\tfor (let i = 0, l = children.length; i < l; i++) {\n\t\t\t\tscene.add(children[i]);\n\t\t\t}\n\t\t}).catch(e => console.error(e));\n\n\t\tconst ambientLight = new t3d.AmbientLight(0xffffff, 1.2);\n\t\tscene.add(ambientLight);\n\n\t\tconst camera = new t3d.Camera();\n\t\tcamera.outputEncoding = t3d.TEXEL_ENCODING_TYPE.SRGB;\n\t\tcamera.position.set(0, 0, 8);\n\t\tcamera.lookAt(new t3d.Vector3(0, 0, 0), new t3d.Vector3(0, 1, 0));\n\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 1000);\n\t\tscene.add(camera);\n\n\t\tconst controller = new OrbitControls(camera, canvas);\n\t\tcontroller.target.set(0, 0, 0);\n\n\t\tfunction loop(count) {\n\t\t\trequestAnimationFrame(loop);\n\n\t\t\tcontroller.update();\n\n\t\t\tforwardRenderer.render(scene, camera);\n\t\t}\n\t\trequestAnimationFrame(loop);\n\n\t\tfunction onWindowResize() {\n\t\t\twidth = window.innerWidth || 2;\n\t\t\theight = window.innerHeight || 2;\n\n\t\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 1000);\n\n\t\t\tforwardRenderer.screenRenderTarget.resize(width * window.devicePixelRatio, height * window.devicePixelRatio);\n\n\t\t\tcanvas.style.width = width + 'px';\n\t\t\tcanvas.style.height = height + 'px';\n\t\t}\n\t\twindow.addEventListener('resize', onWindowResize, false);\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "examples/geometry_loader_vox.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>t3d - vox</title>\n\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n\t<link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n</head>\n<body>\n    <div id=\"info\">\n\t\t<a href=\"\" target=\"_blank\">t3d</a> - vox\n\t\t<br/>\n\t\tdependence: <a href=\"https://github.com/minimo/vox.js\" target=\"_blank\">vox.js</a>\n    </div>\n\n\t<script src=\"./libs/vox.min.js\"></script>\n\n\t<!-- Import maps polyfill -->\n    <!-- Remove this when import maps will be widely supported -->\n    <script async src=\"./libs/es-module-shims.js\"></script>\n\n    <script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n    <script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { VOXMeshBuilder } from 't3d/addons/VoxMeshBuilder.js';\n\t\timport { OrbitControls } from 't3d/addons/controls/OrbitControls.js';\n\t\timport { ForwardRenderer } from 't3d/addons/render/ForwardRenderer.js';\n\n\t\tlet width = window.innerWidth || 2;\n\t\tlet height = window.innerHeight || 2;\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = width;\n\t\tcanvas.height = height;\n\t\tdocument.body.appendChild(canvas);\n\n\t\tconst forwardRenderer = new ForwardRenderer(canvas);\n\t\tforwardRenderer.shadowAutoUpdate = false;\n\n\t\tconst scene = new t3d.Scene();\n\t\t\n\t\t// eslint-disable-next-line no-undef\n\t\tconst parser = new vox.Parser();\n\t\tparser.parse('resources/models/vox/p1.vox').then(function(voxelData) {\n\t\t\tconst voxMeshBuilder = new VOXMeshBuilder(voxelData, {\n\t\t\t\toptimizeFaces: true,\n\t\t\t\tvoxelSize: 2,\n\t\t\t\toriginToBottom: true,\n\t\t\t\tvertexColor: true\n\t\t\t});\n\t\t\tconst mesh = voxMeshBuilder.createMesh();\n\t\t\tmesh.castShadow = true;\n\t\t\tscene.add(mesh);\n\n\t\t\tforwardRenderer.shadowNeedsUpdate = true;\n\t\t});\n\n\t\tconst plane_geometry = new t3d.PlaneGeometry(100, 100);\n\t\tconst lambert = new t3d.LambertMaterial();\n\t\tlambert.diffuse.setHex(0x88ff88);\n\t\tconst plane = new t3d.Mesh(plane_geometry, lambert);\n\t\tplane.receiveShadow = true;\n\t\tscene.add(plane);\n\n\t\tconst ambientLight = new t3d.AmbientLight(0xffffff, 0.2);\n\t\tscene.add(ambientLight);\n\n\t\tconst directionalLight = new t3d.DirectionalLight(0xffffff, 0.7);\n\t\tdirectionalLight.position.set(-30, 40, 50);\n\t\tdirectionalLight.lookAt(new t3d.Vector3(), new t3d.Vector3(0, 1, 0));\n\t\tdirectionalLight.shadow.windowSize = 100;\n\t\tdirectionalLight.castShadow = true;\n\t\tscene.add(directionalLight);\n\n\t\tconst camera = new t3d.Camera();\n\t\tcamera.outputEncoding = t3d.TEXEL_ENCODING_TYPE.SRGB;\n\t\tcamera.position.set(40, 40, 80);\n\t\tcamera.lookAt(new t3d.Vector3(0, 0, 0), new t3d.Vector3(0, 1, 0));\n\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 10, 2000);\n\t\tscene.add(camera);\n\n\t\tconst controller = new OrbitControls(camera, canvas);\n\n\t\tfunction loop(count) {\n\t\t\trequestAnimationFrame(loop);\n\n\t\t\tcontroller.update();\n\n\t\t\tforwardRenderer.render(scene, camera);\n\t\t}\n\n\t\trequestAnimationFrame(loop);\n\n\t\tfunction onWindowResize() {\n\t\t\twidth = window.innerWidth || 2;\n\t\t\theight = window.innerHeight || 2;\n\n\t\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 10, 3000);\n\n\t\t\tforwardRenderer.screenRenderTarget.resize(width, height);\n\t\t}\n\t\twindow.addEventListener('resize', onWindowResize, false);\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "examples/index.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n    <meta charset=\"UTF-8\">\n    <title>t3d.js examples</title>\n    <meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n\t<link rel=\"shortcut icon\" href=\"./favicon.ico\"/>\n    <link type=\"text/css\" rel=\"stylesheet\" href=\"./files/main.css\"/>\n</head>\n<body>\n    <div id=\"panel\">\n\t\t<div id=\"header\">\n\t\t\t<h1>\n\t\t\t\t<a target=\"_blank\" href=\"https://github.com/uinosoft/t3d.js\">t3d.js</a> / examples\n\t\t\t</h1>\n\t\t\t<div id=\"expandButton\"></div>\n\t\t</div>\n\n\t\t<div id=\"panelScrim\"></div>\n\n        <div id=\"content\"></div>\n    </div>\n\n    <iframe id=\"viewer\" name=\"viewer\" allow=\"fullscreen; xr-spatial-tracking;\"></iframe>\n\n\t<a id=\"button\" target=\"_blank\"><img src=\"./files/ic_code_black_24dp.svg\"></a>\n\n    <script>\n\t\tconst sourceCodeUrl = 'https://github.com/uinosoft/t3d.js/tree/dev/examples/';\n\t\tconst viewer = document.getElementById('viewer');\n\t\tconst content = document.getElementById('content');\n\t\tconst expandButton = document.getElementById('expandButton');\n\t\tconst viewSrcButton = document.getElementById('button');\n\t\tconst panelScrim = document.getElementById('panelScrim');\n\t\tconst panel = document.getElementById('panel');\n\n\t\tconst links = {};\n\t\tconst validRedirects = new Map();\n\t\tconst container = document.createElement('div');\n\n\t\tlet selected = null;\n\n\t\tinit();\n\n\t\tasync function init() {\n\t\t\tcontent.appendChild(container);\n\n\t\t\tviewSrcButton.style.display = 'none';\n\n\t\t\tconst files = await (await fetch('./files.json')).json();\n\n\t\t\tfor (const key in files) {\n\t\t\t\tconst section = files[key];\n\n\t\t\t\tconst header = document.createElement('h2');\n\t\t\t\theader.textContent = key;\n\t\t\t\theader.setAttribute('data-category', key);\n\t\t\t\tcontainer.appendChild(header);\n\n\t\t\t\tfor (let i = 0; i < section.length; i++) {\n\t\t\t\t\tconst file = section[i];\n\n\t\t\t\t\tconst link = createLink(file);\n\t\t\t\t\tcontainer.appendChild(link);\n\n\t\t\t\t\tlinks[file] = link;\n\t\t\t\t\tvalidRedirects.set(file, file + '.html');\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (window.location.hash !== '') {\n\t\t\t\tconst file = window.location.hash.substring(1);\n\n\t\t\t\tif (validRedirects.has(file) === true) {\n\t\t\t\t\tselectFile(file);\n\t\t\t\t\tviewer.src = file + '.html';\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (viewer.src === '') {\n\t\t\t\tviewer.srcdoc = document.getElementById('PlaceholderHTML').innerHTML;\n\t\t\t}\n\n\t\t\t// Events\n\n\t\t\texpandButton.addEventListener('click', function(event) {\n\t\t\t\tevent.preventDefault();\n\t\t\t\tpanel.classList.toggle('open');\n\t\t\t});\n\n\t\t\tpanelScrim.onclick = function(event) {\n\t\t\t\tevent.preventDefault();\n\t\t\t\tpanel.classList.toggle('open');\n\t\t\t};\n\n\t\t\t// iOS iframe auto-resize workaround\n\n\t\t\tif (/(iPad|iPhone|iPod)/g.test(navigator.userAgent)) {\n\t\t\t\tviewer.style.width = getComputedStyle(viewer).width;\n\t\t\t\tviewer.style.height = getComputedStyle(viewer).height;\n\t\t\t\tviewer.setAttribute('scrolling', 'no');\n\t\t\t}\n\t\t}\n\n\t\tfunction createLink(file) {\n\t\t\tconst template = `\n\t\t\t\t<a class=\"link\" href=\"${file}.html\" target=\"viewer\">${getName(file)}</a>\n\t\t\t`;\n\n\t\t\tconst div = document.createElement('div');\n\t\t\tdiv.innerHTML = template.trim();\n\n\t\t\tconst link = div.firstChild;\n\n\t\t\tlink.addEventListener('click', function(event) {\n\t\t\t\tif (event.button !== 0 || event.ctrlKey || event.altKey || event.metaKey) return;\n\t\t\t\tselectFile(file);\n\t\t\t});\n\n\t\t\treturn link;\n\t\t}\n\n\t\tfunction selectFile(file) {\n\t\t\tif (selected !== null) links[selected].classList.remove('selected');\n\n\t\t\tlinks[file].classList.add('selected');\n\n\t\t\twindow.location.hash = file;\n\t\t\tviewer.focus();\n\n\t\t\tpanel.classList.remove('open');\n\n\t\t\tselected = file;\n\n\t\t\t // Scroll the sidebar to show the selected link\n\t\t\tscrollSelectedIntoView();\n\n\t\t\t// Reveal \"View source\" button and set attributes to this example\n\t\t\tviewSrcButton.style.display = '';\n\t\t\tviewSrcButton.href = sourceCodeUrl + selected + '.html';\n\t\t\tviewSrcButton.title = 'View source code for <' + getName(selected) + '> on Gitlab';\n\t\t}\n\n\t\t// Scroll sidebar to show the selected link\n\t\tfunction scrollSelectedIntoView() {\n\t\t\tif (selected && links[selected]) {\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tconst selectedLink = links[selected];\n\t\t\t\t\tconst contentDiv = document.getElementById('content');\n\t\t\t\t\tconst containerRect = contentDiv.getBoundingClientRect();\n\t\t\t\t\tconst linkRect = selectedLink.getBoundingClientRect();\n\n\t\t\t\t\t// Check if the link is outside the visible area of the sidebar\n\t\t\t\t\tif (linkRect.top < containerRect.top || linkRect.bottom > containerRect.bottom) {\n\t\t\t\t\t\t // Mobile-friendly smooth scrolling\n\t\t\t\t\t\tif ('scrollBehavior' in document.documentElement.style) {\n\t\t\t\t\t\t\t// Modern browsers support smooth scrolling\n\t\t\t\t\t\t\tcontentDiv.scrollTo({\n\t\t\t\t\t\t\t\ttop: selectedLink.offsetTop - (contentDiv.clientHeight / 2) + (selectedLink.offsetHeight / 2),\n\t\t\t\t\t\t\t\tbehavior: 'smooth'\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// Fallback for older browsers\n\t\t\t\t\t\t\tconst scrollTop = selectedLink.offsetTop - (contentDiv.clientHeight / 2) + (selectedLink.offsetHeight / 2);\n\t\t\t\t\t\t\tcontentDiv.scrollTop = Math.max(0, scrollTop);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}, 200); // Add a small delay to ensure DOM is fully rendered\n\t\t\t}\n\t\t}\n\n\t\tfunction getName(file) {\n\t\t\tconst name = file.split('_');\n\t\t\tname.shift();\n\t\t\treturn name.join('/');\n\t\t}\n    </script>\n\t<template id=\"PlaceholderHTML\">\n\t\t<!DOCTYPE html>\n\t\t<html>\n\t\t\t<head>\n\t\t\t\t<meta charset=\"utf-8\">\n\t\t\t\t<title>t3d.js examples</title>\n\t\t\t\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n\t\t\t\t<link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n\t\t\t\t<style>\n\t\t\t\t\thtml, body {\n\t\t\t\t\t\theight: 100%;\n\t\t\t\t\t}\n\t\t\t\t\tbody {\n\t\t\t\t\t\theight: 100%;\n\t\t\t\t\t\tdisplay: flex;\n\t\t\t\t\t\talign-items: center;\n\t\t\t\t\t\tjustify-content: center;\n\t\t\t\t\t\tuser-select: none;\n\t\t\t\t\t\tcolor: #bbb;\n\t\t\t\t\t\tfont-weight: bold;\n\t\t\t\t\t\tfont-size: 18px;\n\t\t\t\t\t}\n\t\t\t\t</style>\n\t\t\t</head>\n\t\t\t<body>\n\t\t\t\tSelect an example from the sidebar\n\t\t\t</body>\n\t\t</html>\n\t</template>\n</body>\n</html>"
  },
  {
    "path": "examples/jsm/Clock.js",
    "content": "/**\n * @author alteredq / http://alteredqualia.com/\n */\n\nclass Clock {\n\n\tconstructor(autoStart = true) {\n\t\tthis.autoStart = autoStart;\n\n\t\tthis.startTime = 0;\n\t\tthis.oldTime = 0;\n\t\tthis.elapsedTime = 0;\n\n\t\tthis.running = false;\n\t}\n\n\tstart() {\n\t\tthis.startTime = now();\n\n\t\tthis.oldTime = this.startTime;\n\t\tthis.elapsedTime = 0;\n\t\tthis.running = true;\n\t}\n\n\tstop() {\n\t\tthis.getElapsedTime();\n\t\tthis.running = false;\n\t\tthis.autoStart = false;\n\t}\n\n\tgetElapsedTime() {\n\t\tthis.getDelta();\n\t\treturn this.elapsedTime;\n\t}\n\n\tgetDelta() {\n\t\tlet diff = 0;\n\n\t\tif (this.autoStart && !this.running) {\n\t\t\tthis.start();\n\t\t\treturn 0;\n\t\t}\n\n\t\tif (this.running) {\n\t\t\tconst newTime = now();\n\n\t\t\tdiff = (newTime - this.oldTime) / 1000;\n\t\t\tthis.oldTime = newTime;\n\n\t\t\tthis.elapsedTime += diff;\n\t\t}\n\n\t\treturn diff;\n\t}\n\n}\n\nfunction now() {\n\treturn performance.now();\n}\n\nexport { Clock };"
  },
  {
    "path": "examples/jsm/DynamicFont.js",
    "content": "import { DistanceTransform } from './math/DistanceTransform.js';\n\n/**\n * DynamicFont uses the CharacterCanvas to obtain character pixels data and packages it into FontAtlas.\n * This class can be modified if more complete character management is required,\n * such as counting character references.\n */\nclass DynamicFont {\n\n\t/**\n\t * Create a DynamicFont.\n\t * @param {object} [options] - The options.\n\t * @param {number} [options.fontSize=72] - The font size.\n\t * @param {number} [options.width=1024] - The width of the atlas.\n\t * @param {number} [options.height=1024] - The height of the atlas.\n\t * @param {string} [options.fontFamily='sans-serif'] - The font family.\n\t * @param {string} [options.fontWeight='normal'] - The font weight.\n\t * @param {string} [options.fontStyle='normal'] - The font style.\n\t * @param {boolean} [options.sdf=true] - Whether to use signed distance field.\n\t */\n\tconstructor({\n\t\tfontSize = 72,\n\t\twidth = 2048,\n\t\theight = 2048,\n\t\tfontFamily = 'sans-serif',\n\t\tfontWeight = 'normal',\n\t\tfontStyle = 'normal',\n\t\tsdf = true\n\t} = {}) {\n\t\tthis._charCanvas = new CharacterCanvas({\n\t\t\tfontSize,\n\t\t\tfontFamily, fontWeight, fontStyle,\n\t\t\tsdf\n\t\t});\n\n\t\tthis._fontAtlas = new FontAtlas(width, height, this._charCanvas.size, sdf ? 'R2R' : 'RGBA2RGBA');\n\n\t\tthis._font = {\n\t\t\tcommon: {\n\t\t\t\tscaleW: width,\n\t\t\t\tscaleH: height\n\t\t\t},\n\t\t\tinfo: {\n\t\t\t\tsize: fontSize\n\t\t\t},\n\t\t\tchars: []\n\t\t};\n\t}\n\n\t/**\n\t * Get the font data used by BitmapTextGeometry.\n\t * @returns {object} - The font data.\n\t */\n\tget fontData() {\n\t\treturn this._font;\n\t}\n\n\t/**\n\t * Get the atlas buffer.\n\t * @returns {Uint8ClampedArray} - The atlas buffer.\n\t */\n\tget atlasBuffer() {\n\t\treturn this._fontAtlas.buffer;\n\t}\n\n\t/**\n\t * Add characters to the atlas.\n\t * @param {string} chars - The characters to add.\n\t * @returns {boolean} - Returns true if new characters are added, otherwise returns false.\n\t */\n\taddChars(chars) {\n\t\tlet addFlag = false;\n\n\t\tfor (let i = 0; i < chars.length; i++) {\n\t\t\tconst char = chars[i];\n\t\t\tif (!this._fontAtlas.hasChar(char)) {\n\t\t\t\tif (this._addChar(char)) {\n\t\t\t\t\taddFlag = true;\n\t\t\t\t} else {\n\t\t\t\t\tconsole.warn(`DynamicFont: Failed to add char: ${char}, the atlas is full.`);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn addFlag;\n\t}\n\n\t/**\n\t * Dispose the font data and atlas.\n\t */\n\tdispose() {\n\t\tthis._fontAtlas.clear();\n\t\tthis._font.chars.length = 0;\n\t}\n\n\t_addChar(char) {\n\t\tconst { _charCanvas, _fontAtlas, _font } = this;\n\n\t\tconst { buffer, width, height, padding, glyphTop } = _charCanvas.draw(char);\n\n\t\tconst successed = _fontAtlas.addChar(char, { buffer, width, height });\n\n\t\tif (!successed) {\n\t\t\treturn false;\n\t\t}\n\n\t\tconst { x, y, w, h } = _fontAtlas.getChar(char);\n\n\t\tconst scaler = (char === 'j') ? 0.00001 : 1;\n\n\t\t_font.chars.push({\n\t\t\tchar: char,\n\t\t\tid: char.charCodeAt(0),\n\t\t\tx: x + padding * scaler,\n\t\t\ty: y + padding * scaler,\n\t\t\twidth: w - padding * 2 * scaler,\n\t\t\theight: h - padding * 2 * scaler,\n\t\t\txoffset: 0,\n\t\t\tyoffset: -glyphTop,\n\t\t\txadvance: w - padding * 2 * scaler // same as width\n\t\t});\n\n\t\treturn true;\n\t}\n\n}\n\n/**\n * CharacterCanvas is used to draw a single character on a canvas,\n * and get the pixels data of the character.\n */\nclass CharacterCanvas {\n\n\t/**\n\t * Create a CharacterCanvas.\n\t * @param {object} [options] - The options of the CharacterCanvas.\n\t * @param {number} [options.fontSize=72] - The font size.\n\t * @param {string} [options.fontFamily='sans-serif'] - The font family.\n\t * @param {string} [options.fontWeight='normal'] - The font weight.\n\t * @param {string} [options.fontStyle='normal'] - The font style.\n\t * @param {boolean} [options.sdf=true] - Whether to use signed distance field.\n\t */\n\tconstructor({\n\t\tfontSize = 72,\n\t\tfontFamily = 'sans-serif',\n\t\tfontWeight = 'normal',\n\t\tfontStyle = 'normal',\n\t\tsdf = true\n\t} = {}) {\n\t\t// make the canvas size big enough to both have the specified buffer around the glyph\n\t\t// for \"halo\", and account for some glyphs possibly being larger than their font size\n\t\tconst padding = Math.floor(fontSize / 24 * 3);\n\t\tconst size = fontSize + padding * 4;\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = canvas.height = size;\n\n\t\tconst ctx = canvas.getContext('2d', { willReadFrequently: true });\n\t\tctx.font = `${fontStyle} ${fontWeight} ${fontSize}px ${fontFamily}`;\n\t\tctx.textBaseline = 'alphabetic';\n\t\tctx.textAlign = 'left'; // Necessary so that RTL text doesn't have different alignment\n\t\tctx.fillStyle = sdf ? 'black' : 'white';\n\n\t\tthis.dt = sdf ? new DistanceTransform(size * size, size) : null;\n\n\t\tthis.size = size;\n\t\tthis.padding = padding;\n\t\tthis.distanceRadius = Math.floor(fontSize / 24 * 8);\n\t\tthis.distanceCutoff = 0.25;\n\t\tthis.ctx = ctx;\n\t}\n\n\t/**\n\t * Draw a character on the canvas and get the pixels of the character.\n\t * @param {string} char - The character to draw.\n\t * @returns {object} - The pixel information of the character.\n\t * @property {Uint8ClampedArray} buffer - The pixel information buffer of the character.\n\t * @property {number} width - The width of the character pixel information.\n\t * @property {number} height - The height of the character pixel information.\n\t * @property {number} padding - The padding of the character pixel information.\n\t * @property {number} glyphTop - The baseline to the top of the highest bounding box of the glyphs used to render the text.\n\t */\n\tdraw(char) {\n\t\tconst { size, padding, distanceRadius, distanceCutoff, ctx, dt } = this;\n\n\t\tconst {\n\t\t\tactualBoundingBoxAscent, // The distance from the baseline to the top of the highest bounding box of the glyphs used to render the text.\n\t\t\tactualBoundingBoxDescent, // The distance from the baseline to the bottom of the lowest bounding box of the glyphs used to render the text.\n\t\t\tactualBoundingBoxLeft, // The distance from the origin to the left of the leftmost glyph of the text.\n\t\t\tactualBoundingBoxRight // The distance from the origin to the right of the rightmost glyph of the text.\n\t\t} = ctx.measureText(char);\n\n\t\t// The integer/pixel part of the top alignment is encoded in metrics.glyphTop\n\t\t// The remainder is implicitly encoded in the rasterization\n\t\tlet glyphTop = Math.ceil(actualBoundingBoxAscent);\n\n\t\t// If the glyph overflows the canvas size, it will be clipped at the bottom/right\n\t\tlet glyphWidth = Math.max(0, Math.min(size - padding, Math.ceil(actualBoundingBoxRight - actualBoundingBoxLeft)));\n\t\tlet glyphHeight = Math.min(size - padding, glyphTop + Math.ceil(actualBoundingBoxDescent));\n\n\t\t// handle space and tab\n\t\tif (glyphWidth === 0 || glyphHeight === 0) {\n\t\t\tglyphTop = 0;\n\t\t\tglyphWidth = Math.floor(size / 2 - padding * 2); // half font size\n\t\t\tglyphHeight = 0;\n\t\t}\n\n\t\tconst width = Math.min(glyphWidth + 2 * padding, size);\n\t\tconst height = Math.min(glyphHeight + 2 * padding, size);\n\n\t\tctx.clearRect(0, 0, width, height);\n\t\tctx.fillText(char, padding, padding + glyphTop);\n\n\t\tconst imageData = ctx.getImageData(0, 0, width, height);\n\n\t\tlet buffer;\n\t\tif (dt) {\n\t\t\tbuffer = dt.transform(imageData, { radius: distanceRadius, cutoff: distanceCutoff });\n\t\t} else {\n\t\t\tbuffer = new Uint8ClampedArray(imageData.data);\n\t\t}\n\n\t\treturn { buffer, width, height, padding, glyphTop };\n\t}\n\n}\n\n/**\n * FontAtlas is responsible for caching all used character pixels data.\n */\nclass FontAtlas {\n\n\t/**\n\t * Create a FontAtlas.\n\t * @param {number} width - The width of the atlas.\n\t * @param {number} height - The height of the atlas.\n\t * @param {number} charSize - The size of each character.\n\t * @param {string} [channel='R2R'] - The channel of the atlas. 'R2R', 'RGB2RGBA' or 'RGBA2RGBA'.\n\t */\n\tconstructor(width, height, charSize, channel = 'R2R') {\n\t\tthis.width = width;\n\t\tthis.height = height;\n\n\t\tthis._charSize = charSize;\n\n\t\tthis._maxCol = Math.floor(width / charSize);\n\t\tthis._maxRow = Math.floor(height / charSize);\n\t\tthis._indexManager = new IndexManager(this._maxCol * this._maxRow);\n\n\t\tthis._fontMap = new Map();\n\t\tthis._fontBuffer = new Uint8ClampedArray(width * height * (channel === 'R2R' ? 1 : 4));\n\n\t\tthis._copyMethod = CopyMethods[channel];\n\t\tthis._clearMethod = ClearMethods[channel];\n\t}\n\n\t/**\n\t * Add a character to the atlas.\n\t * @param {string} char - The character to add.\n\t * @param {object} originCharData - The pixel information of the character.\n\t * @param {Uint8ClampedArray|Uint8Array} originCharData.buffer - The pixel information buffer of the character.\n\t * @param {number} originCharData.width - The width of the character pixel information.\n\t * @param {number} originCharData.height - The height of the character pixel information.\n\t * @returns {boolean} - Returns true if the character is added successfully, otherwise returns false.\n\t */\n\taddChar(char, originCharData) {\n\t\tif (!this._indexManager.canAllocate()) {\n\t\t\treturn false;\n\t\t}\n\n\t\tconst { buffer, width, height } = originCharData;\n\t\tconst writeIndex = this._indexManager.allocate();\n\n\t\tconst charInfo = {\n\t\t\ti: writeIndex,\n\t\t\tx: (writeIndex % this._maxCol) * this._charSize,\n\t\t\ty: Math.floor(writeIndex / this._maxCol) * this._charSize,\n\t\t\tw: width,\n\t\t\th: height\n\t\t};\n\n\t\tthis._fontMap.set(char, charInfo);\n\n\t\tconst copyMethod = this._copyMethod;\n\t\tfor (let y = 0; y < height; y++) {\n\t\t\tfor (let x = 0; x < width; x++) {\n\t\t\t\tconst targetIndex = (charInfo.x + x) + (charInfo.y + y) * this.width;\n\t\t\t\tconst sourceIndex = x + y * width;\n\t\t\t\tcopyMethod(buffer, this._fontBuffer, sourceIndex, targetIndex);\n\t\t\t}\n\t\t}\n\n\t\treturn true;\n\t}\n\n\t/**\n\t * Remove a character from the atlas.\n\t * @param {string} char - The character to remove.\n\t */\n\tremoveChar(char) {\n\t\tif (!this._fontMap.has(char)) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst charInfo = this._fontMap.get(char);\n\t\tthis._indexManager.free(charInfo.i);\n\t\tthis._fontMap.delete(char);\n\n\t\tconst { x, y, w, h } = charInfo;\n\t\tconst clearMethod = this._clearMethod;\n\t\tfor (let j = y; j < y + h; j++) {\n\t\t\tfor (let i = x; i < x + w; i++) {\n\t\t\t\tclearMethod(this._fontBuffer, i + j * this.width);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Clear all characters in the atlas.\n\t * This method will clear all character information in the atlas.\n\t * After calling this method, the atlas will be empty.\n\t * You can add new characters to the atlas after calling this method.\n\t */\n\tclear() {\n\t\tthis._fontMap.clear();\n\t\tthis._indexManager.reset(this._maxCol * this._maxRow);\n\n\t\tthis._fontBuffer.fill(0);\n\t}\n\n\t/**\n\t * Get the character information.\n\t * @param {string} char - The character to get.\n\t * @returns {object} - The character information.\n\t * @property {number} i - The index of the character in the atlas.\n\t * @property {number} x - The x position of the character in the atlas.\n\t * @property {number} y - The y position of the character in the atlas.\n\t * @property {number} w - The width of the character pixel information.\n\t * @property {number} h - The height of the character pixel information.\n\t */\n\tgetChar(char) {\n\t\treturn this._fontMap.get(char);\n\t}\n\n\t/**\n\t * Check if the atlas has a character.\n\t * @param {string} char - The character to check.\n\t * @returns {boolean} - Returns true if the atlas has the character, otherwise returns false.\n\t */\n\thasChar(char) {\n\t\treturn this._fontMap.has(char);\n\t}\n\n\t/**\n\t * Get the buffer of the atlas.\n\t * The buffer is a Uint8ClampedArray that contains the pixels data of the atlas.\n\t * @returns {Uint8ClampedArray} - The buffer of the atlas.\n\t */\n\tget buffer() {\n\t\treturn this._fontBuffer;\n\t}\n\n}\n\nconst CopyMethods = {\n\t'R2R': function(sourceBuffer, targetBuffer, sourceIndex, targetIndex) {\n\t\ttargetBuffer[targetIndex] = sourceBuffer[sourceIndex];\n\t},\n\t'RGB2RGBA': function(sourceBuffer, targetBuffer, sourceIndex, targetIndex) {\n\t\ttargetBuffer[targetIndex * 4] = sourceBuffer[sourceIndex * 3];\n\t\ttargetBuffer[targetIndex * 4 + 1] = sourceBuffer[sourceIndex * 3 + 1];\n\t\ttargetBuffer[targetIndex * 4 + 2] = sourceBuffer[sourceIndex * 3 + 2];\n\t\ttargetBuffer[targetIndex * 4 + 3] = 255;\n\t},\n\t'RGBA2RGBA': function(sourceBuffer, targetBuffer, sourceIndex, targetIndex) {\n\t\ttargetBuffer[targetIndex * 4] = sourceBuffer[sourceIndex * 4];\n\t\ttargetBuffer[targetIndex * 4 + 1] = sourceBuffer[sourceIndex * 4 + 1];\n\t\ttargetBuffer[targetIndex * 4 + 2] = sourceBuffer[sourceIndex * 4 + 2];\n\t\ttargetBuffer[targetIndex * 4 + 3] = sourceBuffer[sourceIndex * 4 + 3];\n\t}\n};\n\nconst ClearMethods = {\n\t'R2R': function(buffer, index) {\n\t\tbuffer[index] = 0;\n\t},\n\t'RGB2RGBA': function(buffer, index) {\n\t\tbuffer[index * 4] = 0;\n\t\tbuffer[index * 4 + 1] = 0;\n\t\tbuffer[index * 4 + 2] = 0;\n\t\tbuffer[index * 4 + 3] = 0;\n\t},\n\t'RGBA2RGBA': function(buffer, index) {\n\t\tbuffer[index * 4] = 0;\n\t\tbuffer[index * 4 + 1] = 0;\n\t\tbuffer[index * 4 + 2] = 0;\n\t\tbuffer[index * 4 + 3] = 0;\n\t}\n};\n\n/**\n * A simple index manager that manages the allocation and release of indexes.\n */\nclass IndexManager {\n\n\tconstructor(max) {\n\t\tthis.availabel = [];\n\t\tthis.reset(max);\n\t}\n\n\tcanAllocate() {\n\t\treturn this.availabel.length > 0;\n\t}\n\n\tallocate() {\n\t\treturn this.availabel.pop();\n\t}\n\n\tfree(index) {\n\t\tthis.availabel.push(index);\n\t}\n\n\treset(max) {\n\t\tthis.availabel = Array.from({ length: max }, (_, i) => i).reverse();\n\t}\n\n}\n\nexport { DynamicFont, CharacterCanvas, FontAtlas };"
  },
  {
    "path": "examples/jsm/GBuffer.js",
    "content": "import {\n\tATTACHMENT,\n\tMatrix4,\n\tOffscreenRenderTarget,\n\tSHADING_TYPE,\n\tShaderMaterial,\n\tShaderPostPass,\n\tTexture2D,\n\tPIXEL_FORMAT,\n\tPIXEL_TYPE,\n\tTEXTURE_FILTER\n} from 't3d';\n\nclass GBuffer {\n\n\tconstructor(width, height) {\n\t\tthis._renderTarget1 = OffscreenRenderTarget.create2D(width, height);\n\t\tthis._renderTarget1.texture.minFilter = TEXTURE_FILTER.NEAREST;\n\t\tthis._renderTarget1.texture.magFilter = TEXTURE_FILTER.NEAREST;\n\t\tthis._renderTarget1.texture.type = PIXEL_TYPE.HALF_FLOAT;\n\t\tthis._renderTarget1.texture.generateMipmaps = false;\n\n\t\tthis._depthTexture = new Texture2D();\n\t\tthis._depthTexture.image = { data: null, width: 4, height: 4 };\n\t\tthis._depthTexture.type = PIXEL_TYPE.UNSIGNED_INT_24_8;\n\t\tthis._depthTexture.format = PIXEL_FORMAT.DEPTH_STENCIL;\n\t\tthis._depthTexture.magFilter = TEXTURE_FILTER.NEAREST;\n\t\tthis._depthTexture.minFilter = TEXTURE_FILTER.NEAREST;\n\t\tthis._depthTexture.generateMipmaps = false;\n\t\tthis._depthTexture.flipY = false;\n\t\tthis._renderTarget1.attach(this._depthTexture, ATTACHMENT.DEPTH_STENCIL_ATTACHMENT);\n\n\t\tthis._texture2 = new Texture2D();\n\t\tthis._texture2.minFilter = TEXTURE_FILTER.LINEAR;\n\t\tthis._texture2.magFilter = TEXTURE_FILTER.LINEAR;\n\t\tthis._texture2.generateMipmaps = false;\n\n\t\tthis._renderTarget2 = OffscreenRenderTarget.create2D(width, height);\n\t\tthis._renderTarget2.texture.minFilter = TEXTURE_FILTER.LINEAR;\n\t\tthis._renderTarget2.texture.magFilter = TEXTURE_FILTER.LINEAR;\n\t\tthis._renderTarget2.texture.generateMipmaps = false;\n\n\t\tthis._renderTarget3 = OffscreenRenderTarget.create2D(width, height);\n\t\tthis._renderTarget3.texture.type = PIXEL_TYPE.HALF_FLOAT;\n\t\tthis._renderTarget3.texture.minFilter = TEXTURE_FILTER.NEAREST;\n\t\tthis._renderTarget3.texture.magFilter = TEXTURE_FILTER.NEAREST;\n\t\tthis._renderTarget3.texture.generateMipmaps = false;\n\n\t\tthis._useMRT = false;\n\n\t\tthis._debugPass = new ShaderPostPass(debugShader);\n\n\t\tthis.enableNormalGlossiness = true;\n\n\t\tthis.enableAlbedoMetalness = true;\n\n\t\tthis.enableMotion = false;\n\t}\n\n\t/**\n\t * Set G Buffer size.\n\t * @param {number} width\n\t * @param {number} height\n\t */\n\tresize(width, height) {\n\t\tthis._renderTarget1.resize(width, height);\n\t\tthis._renderTarget2.resize(width, height);\n\t\tthis._renderTarget3.resize(width, height);\n\t}\n\n\tupdate(renderer, scene, camera) {\n\t\tconst renderStates = scene.getRenderStates(camera);\n\t\tconst renderQueueLayer = scene.getRenderQueue(camera).layerList[0]; // now just render layer 0\n\n\t\t// Use MRT if support, otherwise use multiple render targets,\n\t\t// renderer.capabilities.getExtension('WEBGL_draw_buffers') has bug here,\n\t\t// so we use renderer.capabilities.version to check if support MRT\n\t\tif (renderer.capabilities.version >= 2) {\n\t\t\tif (!this._useMRT) {\n\t\t\t\tthis._useMRT = true;\n\n\t\t\t\tconst ext = renderer.capabilities.getExtension('EXT_color_buffer_float');\n\t\t\t\tif (ext) {\n\t\t\t\t\tthis._renderTarget1.texture.type = PIXEL_TYPE.HALF_FLOAT;\n\t\t\t\t} else {\n\t\t\t\t\tthis._renderTarget1.texture.type = PIXEL_TYPE.UNSIGNED_BYTE;\n\t\t\t\t}\n\n\t\t\t\tthis._renderTarget1.attach(this._texture2, ATTACHMENT.COLOR_ATTACHMENT1);\n\t\t\t}\n\n\t\t\trenderer.beginRender(this._renderTarget1);\n\t\t\trenderer.renderRenderableList(renderQueueLayer.opaque, renderStates, {\n\t\t\t\tgetMaterial: function(renderable) {\n\t\t\t\t\treturn materialCache.getMrtMaterial(renderable);\n\t\t\t\t},\n\t\t\t\tifRender: function(renderable) {\n\t\t\t\t\treturn !!renderable.geometry.getAttribute('a_Normal');\n\t\t\t\t}\n\t\t\t});\n\t\t\trenderer.endRender();\n\t\t} else {\n\t\t\tif (this.enableNormalGlossiness) {\n\t\t\t\trenderer.beginRender(this._renderTarget1);\n\t\t\t\trenderer.renderRenderableList(renderQueueLayer.opaque, renderStates, {\n\t\t\t\t\tgetMaterial: function(renderable) {\n\t\t\t\t\t\treturn materialCache.getNormalGlossinessMaterial(renderable);\n\t\t\t\t\t},\n\t\t\t\t\tifRender: function(renderable) {\n\t\t\t\t\t\treturn !!renderable.geometry.getAttribute('a_Normal');\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\trenderer.endRender();\n\t\t\t}\n\n\t\t\tif (this.enableAlbedoMetalness) {\n\t\t\t\trenderer.beginRender(this._renderTarget2);\n\t\t\t\trenderer.renderRenderableList(renderQueueLayer.opaque, renderStates, {\n\t\t\t\t\tgetMaterial: function(renderable) {\n\t\t\t\t\t\treturn materialCache.getAlbedoMetalnessMaterial(renderable);\n\t\t\t\t\t},\n\t\t\t\t\tifRender: function(renderable) {\n\t\t\t\t\t\treturn !!renderable.geometry.getAttribute('a_Normal');\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\trenderer.endRender();\n\t\t\t}\n\t\t}\n\n\t\tif (this.enableMotion) {\n\t\t\tconst renderConfig = {\n\t\t\t\tgetMaterial: function(renderable) {\n\t\t\t\t\treturn materialCache.getMotionMaterial(renderable);\n\t\t\t\t},\n\t\t\t\tafterRender: function(renderable) {\n\t\t\t\t\tif (!renderable.object.userData['prevModel']) {\n\t\t\t\t\t\trenderable.object.userData['prevModel'] = new Float32Array(16);\n\t\t\t\t\t}\n\t\t\t\t\trenderable.object.worldMatrix.toArray(renderable.object.userData['prevModel']);\n\n\t\t\t\t\tif (!renderable.object.userData['prevView']) {\n\t\t\t\t\t\trenderable.object.userData['prevView'] = new Float32Array(16);\n\t\t\t\t\t}\n\t\t\t\t\thelpMatrix4.copy(camera.viewMatrix).toArray(renderable.object.userData['prevView']);\n\n\t\t\t\t\tif (!renderable.object.userData['prevProjection']) {\n\t\t\t\t\t\trenderable.object.userData['prevProjection'] = new Float32Array(16);\n\t\t\t\t\t}\n\t\t\t\t\thelpMatrix4.copy(camera.projectionMatrix).toArray(renderable.object.userData['prevProjection']);\n\n\t\t\t\t\tconst skeleton = renderable.object.skeleton;\n\t\t\t\t\tif (skeleton) {\n\t\t\t\t\t\tif (skeleton.boneTexture) {\n\t\t\t\t\t\t\tif (!renderable.object.userData['prevBoneTexture']) {\n\t\t\t\t\t\t\t\tconst oldTexture = skeleton.boneTexture;\n\t\t\t\t\t\t\t\tconst newTexture = oldTexture.clone();\n\t\t\t\t\t\t\t\tnewTexture.image = {\n\t\t\t\t\t\t\t\t\twidth: oldTexture.image.width,\n\t\t\t\t\t\t\t\t\theight: oldTexture.image.height,\n\t\t\t\t\t\t\t\t\tdata: new Float32Array(oldTexture.image.data.length)\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\trenderable.object.userData['prevBoneTexture'] = newTexture;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\trenderable.object.userData['prevBoneTexture'].image.data.set(skeleton.boneTexture.image.data);\n\t\t\t\t\t\t\trenderable.object.userData['prevBoneTexture'].version++;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tif (!renderable.object.userData['prevBoneMatrices']) {\n\t\t\t\t\t\t\t\trenderable.object.userData['prevBoneMatrices'] = new Float32Array(skeleton.boneMatrices.length);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\trenderable.object.userData['prevBoneMatrices'].set(skeleton.boneMatrices);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// TODO support morph targets\n\t\t\t\t}\n\t\t\t};\n\n\t\t\trenderer.beginRender(this._renderTarget3);\n\t\t\trenderer.renderRenderableList(renderQueueLayer.opaque, renderStates, renderConfig);\n\t\t\trenderer.renderRenderableList(renderQueueLayer.transparent, renderStates, renderConfig);\n\t\t\trenderer.endRender();\n\t\t}\n\t}\n\n\t/**\n\t * Debug output of gBuffer. Use `type` parameter to choos the debug output type, which can be:\n\t *\n\t * + 'normal'\n\t * + 'depth'\n\t * + 'position'\n\t * + 'glossiness'\n\t * + 'metalness'\n\t * + 'albedo'\n\t * + 'velocity'\n\t * @param {ThinRenderer} renderer\n\t * @param {Camera} camera\n\t * @param {string} type\n\t * @param {RenderTargetBase} renderTarget\n\t */\n\trenderDebug(renderer, camera, type, renderTarget) {\n\t\tthis._debugPass.uniforms['normalGlossinessTexture'] = this.getNormalGlossinessTexture();\n\t\tthis._debugPass.uniforms['depthTexture'] = this.getDepthTexture();\n\t\tthis._debugPass.uniforms['albedoMetalnessTexture'] = this.getAlbedoMetalnessTexture();\n\t\tthis._debugPass.uniforms['motionTexture'] = this.getMotionTexture();\n\t\tthis._debugPass.uniforms['debug'] = DebugTypes[type] || 0;\n\t\thelpMatrix4.multiplyMatrices(camera.projectionMatrix, camera.viewMatrix).invert();\n\t\thelpMatrix4.toArray(this._debugPass.uniforms['matProjViewInverse']);\n\t\tthis._debugPass.render(renderer, renderTarget);\n\t}\n\n\t/**\n\t * Get normal glossiness texture.\n\t * Channel storage:\n\t * + R: normal.x * 0.5 + 0.5\n\t * + G: normal.y * 0.5 + 0.5\n\t * + B: normal.z * 0.5 + 0.5\n\t * + A: glossiness\n\t * @returns {Texture2D}\n\t */\n\tgetNormalGlossinessTexture() {\n\t\treturn this._renderTarget1.texture;\n\t}\n\n\t/**\n\t * Get depth texture.\n\t * Channel storage:\n\t * + R: depth\n\t * @returns {Texture2D}\n\t */\n\tgetDepthTexture() {\n\t\treturn this._depthTexture;\n\t}\n\n\t/**\n\t * Get albedo metalness texture.\n\t * Channel storage:\n\t * + R: albedo.r\n\t * + G: albedo.g\n\t * + B: albedo.b\n\t * + A: metalness\n\t * @returns {Texture2D}\n\t */\n\tgetAlbedoMetalnessTexture() {\n\t\treturn this._useMRT ? this._texture2 : this._renderTarget2.texture;\n\t}\n\n\t/**\n\t * Get motion texture.\n\t * Channel storage:\n\t * + R: velocity.x\n\t * + G: velocity.y\n\t * @returns {Texture2D}\n\t */\n\tgetMotionTexture() {\n\t\treturn this._renderTarget3.texture;\n\t}\n\n\tdispose() {\n\t\tthis._renderTarget1.dispose();\n\t\tthis._renderTarget2.dispose();\n\t\tthis._renderTarget3.dispose();\n\n\t\tthis._depthTexture.dispose();\n\t\tthis._texture2.dispose();\n\n\t\tthis._debugPass.dispose();\n\n\t\tmaterialCache.MRTMaterials.forEach(material => material.dispose());\n\t\tmaterialCache.normalGlossinessMaterials.forEach(material => material.dispose());\n\t\tmaterialCache.albedoMetalnessMaterials.forEach(material => material.dispose());\n\t\tmaterialCache.motionMaterials.forEach(material => material.dispose());\n\n\t\tmaterialCache.MRTMaterials.clear();\n\t\tmaterialCache.normalGlossinessMaterials.clear();\n\t\tmaterialCache.albedoMetalnessMaterials.clear();\n\t\tmaterialCache.motionMaterials.clear();\n\t}\n\n}\n\nconst helpMatrix4 = new Matrix4();\nconst materialCache = new MaterialCache();\n\nfunction MaterialCache() {\n\tconst normalGlossinessMaterials = new Map();\n\tconst albedoMetalnessMaterials = new Map();\n\tconst motionMaterials = new Map();\n\tconst mrtMaterials = new Map();\n\n\tconst state = {};\n\n\tfunction generateMaterialState(renderable, result) {\n\t\tresult.useFlatShading = !renderable.geometry.attributes['a_Normal'] || (renderable.material.shading === SHADING_TYPE.FLAT_SHADING);\n\t\tresult.useDiffuseMap = !!renderable.material.diffuseMap;\n\t\tresult.useRoughnessMap = !!renderable.material.roughnessMap;\n\t\tresult.useMetalnessMap = !!renderable.material.metalnessMap;\n\t\tresult.useSkinning = renderable.object.isSkinnedMesh && renderable.object.skeleton;\n\t\tresult.morphTargets = !!renderable.object.morphTargetInfluences;\n\t\tresult.morphNormals = !!renderable.object.morphTargetInfluences && renderable.object.geometry.morphAttributes.normal;\n\t\tresult.drawMode = renderable.material.drawMode;\n\t\tresult.isSkyBox = renderable.material.shaderName == 'skybox';\n\t\tlet maxBones = 0;\n\t\tif (result.useSkinning) {\n\t\t\tif (renderable.object.skeleton.boneTexture) {\n\t\t\t\tmaxBones = 1024;\n\t\t\t} else {\n\t\t\t\tmaxBones = renderable.object.skeleton.bones.length;\n\t\t\t}\n\t\t}\n\t\tresult.maxBones = maxBones;\n\t}\n\n\tfunction getMrtMaterial(renderable) {\n\t\tgenerateMaterialState(renderable, state);\n\n\t\tlet material;\n\t\tconst code = state.useFlatShading +\n\t\t\t'_' + state.useDiffuseMap +\n\t\t\t'_' + state.useRoughnessMap +\n\t\t\t'_' + state.useMetalnessMap +\n\t\t\t'_' + state.useSkinning +\n\t\t\t'_' + state.morphTargets +\n\t\t\t'_' + state.morphNormals;\n\t\tif (!mrtMaterials.has(code)) {\n\t\t\tmaterial = new ShaderMaterial(mrtShader);\n\t\t\tmaterial.shading = state.useFlatShading ? SHADING_TYPE.FLAT_SHADING : SHADING_TYPE.SMOOTH_SHADING;\n\t\t\tmaterial.alphaTest = state.useDiffuseMap ? 0.999 : 0; // ignore if alpha < 0.99\n\t\t\tmrtMaterials.set(code, material);\n\t\t} else {\n\t\t\tmaterial = mrtMaterials.get(code);\n\t\t}\n\n\t\tmaterial.diffuse.copy(renderable.material.diffuse);\n\t\tmaterial.diffuseMap = renderable.material.diffuseMap;\n\t\tmaterial.uniforms.roughness = renderable.material.roughness !== undefined ? renderable.material.roughness : 0.5;\n\t\tmaterial.roughnessMap = renderable.material.roughnessMap;\n\t\tmaterial.uniforms.metalness = renderable.material.metalness !== undefined ? renderable.material.metalness : 0.5;\n\t\tmaterial.metalnessMap = renderable.material.metalnessMap;\n\n\t\treturn material;\n\t}\n\n\tfunction getNormalGlossinessMaterial(renderable) {\n\t\tgenerateMaterialState(renderable, state);\n\n\t\tlet material;\n\t\tconst code = state.useFlatShading +\n\t\t\t'_' + state.useDiffuseMap +\n\t\t\t'_' + state.useRoughnessMap +\n\t\t\t'_' + state.useSkinning +\n\t\t\t'_' + state.morphTargets +\n\t\t\t'_' + state.morphNormals;\n\t\tif (!normalGlossinessMaterials.has(code)) {\n\t\t\tmaterial = new ShaderMaterial(normalGlossinessShader);\n\t\t\tmaterial.shading = state.useFlatShading ? SHADING_TYPE.FLAT_SHADING : SHADING_TYPE.SMOOTH_SHADING;\n\t\t\tmaterial.alphaTest = state.useDiffuseMap ? 0.999 : 0; // ignore if alpha < 0.99\n\t\t\tnormalGlossinessMaterials.set(code, material);\n\t\t} else {\n\t\t\tmaterial = normalGlossinessMaterials.get(code);\n\t\t}\n\n\t\tmaterial.diffuseMap = renderable.material.diffuseMap;\n\t\tmaterial.uniforms.roughness = renderable.material.roughness !== undefined ? renderable.material.roughness : 0.5;\n\t\tmaterial.roughnessMap = renderable.material.roughnessMap;\n\n\t\treturn material;\n\t}\n\n\tfunction getAlbedoMetalnessMaterial(renderable) {\n\t\tgenerateMaterialState(renderable, state);\n\n\t\tlet material;\n\t\tconst code = state.useFlatShading +\n\t\t\t'_' + state.useDiffuseMap +\n\t\t\t'_' + state.useMetalnessMap +\n\t\t\t'_' + state.useSkinning +\n\t\t\t'_' + state.morphTargets +\n\t\t\t'_' + state.morphNormals;\n\t\tif (!albedoMetalnessMaterials.has(code)) {\n\t\t\tmaterial = new ShaderMaterial(albedoMetalnessShader);\n\t\t\tmaterial.shading = state.useFlatShading ? SHADING_TYPE.FLAT_SHADING : SHADING_TYPE.SMOOTH_SHADING;\n\t\t\tmaterial.alphaTest = state.useDiffuseMap ? 0.999 : 0; // ignore if alpha < 0.99\n\t\t\talbedoMetalnessMaterials.set(code, material);\n\t\t} else {\n\t\t\tmaterial = albedoMetalnessMaterials.get(code);\n\t\t}\n\n\t\tmaterial.diffuse.copy(renderable.material.diffuse);\n\t\tmaterial.diffuseMap = renderable.material.diffuseMap;\n\t\tmaterial.uniforms.metalness = renderable.material.metalness !== undefined ? renderable.material.metalness : 0.5;\n\t\tmaterial.metalnessMap = renderable.material.metalnessMap;\n\n\t\treturn material;\n\t}\n\n\tfunction getMotionMaterial(renderable) {\n\t\tgenerateMaterialState(renderable, state);\n\n\t\tlet material;\n\t\tconst code = state.useSkinning +\n\t\t\t'_' + state.maxBones +\n\t\t\t'_' + state.morphTargets +\n\t\t\t'_' + state.drawMode +\n\t\t\t'_' + state.isSkyBox;\n\t\tif (!motionMaterials.has(code)) {\n\t\t\tmaterial = new ShaderMaterial(motionShader);\n\t\t\tmaterial.side = renderable.material.side;\n\t\t\tmaterial.drawMode = renderable.material.drawMode;\n\t\t\tif (state.isSkyBox) {\n\t\t\t\tmaterial.defines['IS_SKY'] = true;\n\t\t\t}\n\t\t\tmotionMaterials.set(code, material);\n\t\t} else {\n\t\t\tmaterial = motionMaterials.get(code);\n\t\t}\n\n\t\tif (renderable.object.userData['prevModel'] && renderable.object.userData['prevView'] && renderable.object.userData['prevProjection']) {\n\t\t\thelpMatrix4.fromArray(renderable.object.userData['prevModel']).toArray(material.uniforms['prevModel']);\n\t\t\thelpMatrix4.fromArray(renderable.object.userData['prevView']).toArray(material.uniforms['prevView']);\n\t\t\thelpMatrix4.fromArray(renderable.object.userData['prevProjection']).toArray(material.uniforms['prevProjection']);\n\t\t\tmaterial.uniforms['firstRender'] = false;\n\n\t\t\tif (renderable.object.userData['prevBoneTexture']) {\n\t\t\t\tmaterial.uniforms['prevBoneTexture'] = renderable.object.userData['prevBoneTexture'];\n\t\t\t\tmaterial.uniforms['prevBoneTextureSize'] = renderable.object.userData['prevBoneTexture'].image.width;\n\t\t\t} else if (renderable.object.userData['prevBoneMatrices']) {\n\t\t\t\tmaterial.uniforms['prevBoneMatrices'] = renderable.object.userData['prevBoneMatrices'];\n\t\t\t}\n\t\t} else {\n\t\t\tmaterial.uniforms['firstRender'] = true;\n\t\t}\n\n\t\treturn material;\n\t}\n\n\treturn {\n\t\tgetMrtMaterial: getMrtMaterial,\n\t\tgetNormalGlossinessMaterial: getNormalGlossinessMaterial,\n\t\tgetAlbedoMetalnessMaterial: getAlbedoMetalnessMaterial,\n\t\tgetMotionMaterial: getMotionMaterial\n\t};\n}\n\nconst normalGlossinessShader = {\n\tname: 'g-normal-glossiness',\n\n\tdefines: {},\n\n\tuniforms: {\n\t\troughness: 0.5\n\t},\n\n\tvertexShader: `\n        #include <common_vert>\n        #include <morphtarget_pars_vert>\n        #include <skinning_pars_vert>\n        #include <normal_pars_vert>\n        #include <uv_pars_vert>\n        #include <modelPos_pars_vert>\n        void main() {\n            #include <begin_vert>\n            #include <morphtarget_vert>\n            #include <morphnormal_vert>\n            #include <skinning_vert>\n            #include <skinnormal_vert>\n            #include <normal_vert>\n            #include <pvm_vert>\n\t\t\t#include <uv_vert>\n            #include <modelPos_vert>\n        }\n    `,\n\n\tfragmentShader: `\n        #include <common_frag>\n        #include <diffuseMap_pars_frag>\n\t\t#include <alphaTest_pars_frag>\n\n        #include <uv_pars_frag>\n\n        #include <packing>\n        #include <normal_pars_frag>\n\n        uniform float roughness;\n\n        #ifdef USE_ROUGHNESSMAP\n            uniform sampler2D roughnessMap;\n        #endif\n\n        #include <modelPos_pars_frag>\n\n        void main() {\n            #if defined(USE_DIFFUSE_MAP) && defined(ALPHATEST)\n                vec4 texelColor = texture2D(diffuseMap, v_Uv);\n                float alpha = texelColor.a * u_Opacity;\n                if(alpha < u_AlphaTest) discard;\n            #endif\n\n            #ifdef FLAT_SHADED\n\t\t\t\tvec3 fdx = dFdx(v_modelPos);\n\t\t\t\tvec3 fdy = dFdy(v_modelPos);\n\t\t\t\tvec3 normal = normalize(cross(fdx, fdy));\n\t\t\t#else\n            \tvec3 normal = normalize(v_Normal);\n\t\t\t\t#ifdef DOUBLE_SIDED\n\t\t\t\t\tnormal = normal * (float(gl_FrontFacing) * 2.0 - 1.0);\n\t\t\t\t#endif\n\t\t\t#endif\n\n            float roughnessFactor = roughness;\n            #ifdef USE_ROUGHNESSMAP\n                roughnessFactor *= texture2D(roughnessMap, v_Uv).g;\n            #endif\n\n            vec4 packedNormalGlossiness;\n            packedNormalGlossiness.xyz = normal * 0.5 + 0.5;\n            packedNormalGlossiness.w = clamp(1. - roughnessFactor, 0., 1.);\n\n            gl_FragColor = packedNormalGlossiness;\n        }\n    `\n};\n\nconst albedoMetalnessShader = {\n\tname: 'g-albedo-metalness',\n\n\tdefines: {},\n\n\tuniforms: {\n\t\tmetalness: 0.5\n\t},\n\n\tvertexShader: `\n\t\t#include <common_vert>\n\t\t#include <morphtarget_pars_vert>\n\t\t#include <skinning_pars_vert>\n\t\t#include <uv_pars_vert>\n\t\t#include <color_pars_vert>\n\t\t#include <diffuseMap_pars_vert>\n\t\tvoid main() {\n\t\t\t#include <begin_vert>\n\t\t\t#include <morphtarget_vert>\n\t\t\t#include <skinning_vert>\n\t\t\t#include <pvm_vert>\n\t\t\t#include <uv_vert>\n\t\t\t#include <color_vert>\n\t\t\t#include <diffuseMap_vert>\n\t\t}\n\t`,\n\n\tfragmentShader: `\n\t\tuniform vec3 u_Color;\n\t\tuniform float metalness;\n\n\t\t#include <uv_pars_frag>\n\t\t#include <diffuseMap_pars_frag>\n\n\t\t#ifdef USE_METALNESSMAP\n\t\t\tuniform sampler2D metalnessMap;\n\t\t#endif\n\n\t\tvoid main() {\n\t\t\tvec4 outColor = vec4(u_Color, 1.0);\n\t\t\t#include <diffuseMap_frag>\n\t\t\tvec3 diffuseColor = outColor.rgb * outColor.a;\n\n\t\t\tfloat metalnessFactor = metalness;\n\t\t\t#ifdef USE_METALNESSMAP\n\t\t\t\tmetalnessFactor *= texture2D(metalnessMap, v_Uv).b;\n\t\t\t#endif\n\n\t\t\tgl_FragColor = vec4(diffuseColor.rgb, metalnessFactor);\n\t\t}\n\t`\n};\n\nconst motionShader = {\n\tname: 'g-motion',\n\n\tdefines: { IS_SKY: false },\n\n\tuniforms: {\n\t\tprevModel: new Float32Array(16),\n\t\tprevView: new Float32Array(16),\n\t\tprevProjection: new Float32Array(16),\n\n\t\tprevBoneTexture: null,\n\t\tprevBoneTextureSize: 256,\n\t\tprevBoneMatrices: new Float32Array(),\n\n\t\tfirstRender: false\n\t},\n\n\tvertexShader: `\n\t\t#include <common_vert>\n\t\t#include <morphtarget_pars_vert>\n\t\t#include <skinning_pars_vert>\n\n\t\tuniform mat4 prevModel;\n\t\tuniform mat4 prevView;\n\t\tuniform mat4 prevProjection;\n\n\t\tvarying vec4 v_ScreenPosition;\n\t\tvarying vec4 v_PrevScreenPosition;\n\n\t\t#ifdef USE_SKINNING\n\t\t\t#ifdef BONE_TEXTURE\n\t\t\t\tuniform sampler2D prevBoneTexture;\n\t\t\t\tuniform int prevBoneTextureSize;\n\t\t\t\tmat4 getPrevBoneMatrix(const in float i) {\n\t\t\t\t\tfloat j = i * 4.0;\n\t\t\t\t\tfloat x = mod(j, float(prevBoneTextureSize));\n\t\t\t\t\tfloat y = floor(j / float(prevBoneTextureSize));\n\t\t\t\t\tfloat dx = 1.0 / float(prevBoneTextureSize);\n\t\t\t\t\tfloat dy = 1.0 / float(prevBoneTextureSize);\n\t\t\t\t\ty = dy * (y + 0.5);\n\t\t\t\t\tvec4 v1 = texture2D(prevBoneTexture, vec2(dx * (x + 0.5), y));\n\t\t\t\t\tvec4 v2 = texture2D(prevBoneTexture, vec2(dx * (x + 1.5), y));\n\t\t\t\t\tvec4 v3 = texture2D(prevBoneTexture, vec2(dx * (x + 2.5), y));\n\t\t\t\t\tvec4 v4 = texture2D(prevBoneTexture, vec2(dx * (x + 3.5), y));\n\t\t\t\t\tmat4 bone = mat4(v1, v2, v3, v4);\n\t\t\t\t\treturn bone;\n\t\t\t\t}\n\t\t\t#else\n\t\t\t\tuniform mat4 prevBoneMatrices[MAX_BONES];\n\t\t\t\tmat4 getPrevBoneMatrix(const in float i) {\n\t\t\t\t\tmat4 bone = prevBoneMatrices[int(i)];\n\t\t\t\t\treturn bone;\n\t\t\t\t}\n\t\t\t#endif\n\t\t#endif\n\n\t\t#ifdef IS_SKY\n\t\t\tmat4 clearMat4Translate(mat4 m) {\n\t\t\t\tmat4 outMatrix = m;\n\t\t\t\toutMatrix[3].xyz = vec3(0., 0., 0.);\n\t\t\t\treturn outMatrix;\n\t\t\t}\n\t\t#endif\n\n\t\tvoid main() {\n\t\t\t#include <begin_vert>\n\n\t\t\tvec3 prevTransformed = transformed;\n\n\t\t\t#include <morphtarget_vert>\n\t\t\t#include <skinning_vert>\n\t\t\t#include <pvm_vert>\n\n\t\t\t#ifdef USE_SKINNING\n\t\t\t\tmat4 prevBoneMatX = getPrevBoneMatrix(skinIndex.x);\n\t\t\t\tmat4 prevBoneMatY = getPrevBoneMatrix(skinIndex.y);\n\t\t\t\tmat4 prevBoneMatZ = getPrevBoneMatrix(skinIndex.z);\n\t\t\t\tmat4 prevBoneMatW = getPrevBoneMatrix(skinIndex.w);\n\n\t\t\t\tvec4 prevSkinVertex = bindMatrix * vec4(prevTransformed, 1.0);\n\n\t\t\t\tvec4 prevSkinned = vec4(0.0);\n\t\t\t\tprevSkinned += prevBoneMatX * prevSkinVertex * skinWeight.x;\n\t\t\t\tprevSkinned += prevBoneMatY * prevSkinVertex * skinWeight.y;\n\t\t\t\tprevSkinned += prevBoneMatZ * prevSkinVertex * skinWeight.z;\n\t\t\t\tprevSkinned += prevBoneMatW * prevSkinVertex * skinWeight.w;\n\t\t\t\tprevSkinned = bindMatrixInverse * prevSkinned;\n\n\t\t\t\tprevTransformed = prevSkinned.xyz / prevSkinned.w;\n\t\t\t#endif\n\n\t\t\t#ifdef IS_SKY\n\t\t\t\tv_ScreenPosition = u_Projection * clearMat4Translate(u_View) * u_Model * vec4(transformed, 1.0);\n\t\t\t\tv_PrevScreenPosition = prevProjection * clearMat4Translate(prevView) * prevModel * vec4(prevTransformed, 1.0);\n\t\t\t\tgl_Position = u_Projection * clearMat4Translate(u_View) * u_Model * vec4(transformed, 1.0);\n\t\t\t\tgl_Position.z = gl_Position.w;\n\t\t\t#else\n\t\t\t\tv_ScreenPosition = u_ProjectionView * u_Model * vec4(transformed, 1.0);\n\t\t\t\tv_PrevScreenPosition = prevProjection * prevView * prevModel * vec4(prevTransformed, 1.0);\n\t\t\t#endif\n\t\t}\n\t`,\n\n\tfragmentShader: `\n\t\tuniform bool firstRender;\n\n\t\tvarying vec4 v_ScreenPosition;\n\t\tvarying vec4 v_PrevScreenPosition;\n\n\t\tvoid main() {\n\t\t\tvec2 a = v_ScreenPosition.xy / v_ScreenPosition.w;\n\t\t\tvec2 b = v_PrevScreenPosition.xy / v_PrevScreenPosition.w;\n\n\t\t\tif (firstRender) {\n\t\t\t\tgl_FragColor = vec4(0.0);\n\t\t\t} else {\n\t\t\t\tgl_FragColor = vec4((a - b) * 0.5 + 0.5, 0.0, 1.0);\n\t\t\t}\n\t\t}\n\t`\n};\n\nconst mrtShader = {\n\tname: 'g-mrt',\n\n\tdefines: {},\n\n\tuniforms: {\n\t\troughness: 0.5,\n\t\tmetalness: 0.5\n\t},\n\n\tvertexShader: `\n\t\t#include <common_vert>\n\t\t#include <morphtarget_pars_vert>\n\t\t#include <skinning_pars_vert>\n\t\t#include <uv_pars_vert>\n\t\t#include <normal_pars_vert>\n\t\t#include <color_pars_vert>\n\t\t#include <diffuseMap_pars_vert>\n\t\t#include <modelPos_pars_vert>\n\t\tvoid main() {\n\t\t\t#include <begin_vert>\n\t\t\t#include <morphtarget_vert>\n\t\t\t#include <morphnormal_vert>\n\t\t\t#include <skinning_vert>\n\t\t\t#include <skinnormal_vert>\n\t\t\t#include <normal_vert>\n\t\t\t#include <pvm_vert>\n\t\t\t#include <modelPos_vert>\n\t\t\t#include <uv_vert>\n\t\t\t#include <color_vert>\n\t\t\t#include <diffuseMap_vert>\n\t\t}\n\t`,\n\n\tfragmentShader: `\n\t\t#extension GL_EXT_draw_buffers : require\n\n\t\t#include <common_frag>\n\t\t#include <diffuseMap_pars_frag>\n\t\t#include <alphaTest_pars_frag>\n\n\t\t#include <uv_pars_frag>\n\n\t\t#include <packing>\n\t\t#include <normal_pars_frag>\n\n\t\tuniform float roughness;\n\t\tuniform float metalness;\n\n\t\t#ifdef USE_ROUGHNESSMAP\n\t\t\tuniform sampler2D roughnessMap;\n\t\t#endif\n\n\t\t#ifdef USE_METALNESSMAP\n\t\t\tuniform sampler2D metalnessMap;\n\t\t#endif\n\n\t\t#include <modelPos_pars_frag>\n\n\t\tvoid main() {\n\t\t\tvec4 outColor = vec4(u_Color, 1.0);\n\t\t\t#include <diffuseMap_frag>\n\t\t\tvec3 diffuseColor = outColor.rgb * outColor.a;\n\n\t\t\tfloat metalnessFactor = metalness;\n\t\t\t#ifdef USE_METALNESSMAP\n\t\t\t\tmetalnessFactor *= texture2D(metalnessMap, v_Uv).b;\n\t\t\t#endif\n\n\t\t\tgl_FragData[1] = vec4(outColor.xyz, metalnessFactor);\n\n\t\t\t#if defined(USE_DIFFUSE_MAP) && defined(ALPHATEST)\n\t\t\t\tfloat alpha = outColor.a * u_Opacity;\n\t\t\t\tif(alpha < u_AlphaTest) discard;\n\t\t\t#endif\n\n\t\t\t#ifdef FLAT_SHADED\n\t\t\t\tvec3 fdx = dFdx(v_modelPos);\n\t\t\t\tvec3 fdy = dFdy(v_modelPos);\n\t\t\t\tvec3 normal = normalize(cross(fdx, fdy));\n\t\t\t#else\n\t\t\t\tvec3 normal = normalize(v_Normal);\n\t\t\t\t#ifdef DOUBLE_SIDED\n\t\t\t\t\tnormal = normal * (float(gl_FrontFacing) * 2.0 - 1.0);\n\t\t\t\t#endif\n\t\t\t#endif\n\n\t\t\tfloat roughnessFactor = roughness;\n\t\t\t#ifdef USE_ROUGHNESSMAP\n\t\t\t\troughnessFactor *= texture2D(roughnessMap, v_Uv).g;\n\t\t\t#endif\n\n\t\t\tvec4 packedNormalGlossiness;\n\t\t\tpackedNormalGlossiness.xyz = normal * 0.5 + 0.5;\n\t\t\tpackedNormalGlossiness.w = clamp(1. - roughnessFactor, 0., 1.);\n\n\t\t\tgl_FragData[0] = packedNormalGlossiness;\n\t\t}\n\t`\n};\n\nconst DebugTypes = {\n\tnormal: 0,\n\tdepth: 1,\n\tposition: 2,\n\tglossiness: 3,\n\tmetalness: 4,\n\talbedo: 5,\n\tvelocity: 6\n};\n\nconst debugShader = {\n\tname: 'g-debug',\n\n\tdefines: {\n\t\tARROW_TILE_SIZE: '32.0'\n\t},\n\n\tuniforms: {\n\t\tnormalGlossinessTexture: null,\n\t\tdepthTexture: null,\n\t\talbedoMetalnessTexture: null,\n\t\tmotionTexture: null,\n\n\t\t// DEBUG\n\t\t// - 0: normal\n\t\t// - 1: depth\n\t\t// - 2: position\n\t\t// - 3: glossiness\n\t\t// - 4: metalness\n\t\t// - 5: albedo\n\t\t// - 6: velocity\n\t\tdebug: 0,\n\n\t\tmatProjViewInverse: new Float32Array(16),\n\n\t\tvelocityThreshold: 0.01,\n\t\tarrowScale: 4.8\n\t},\n\n\tvertexShader: `\n\t\tattribute vec3 a_Position;\n\t\tattribute vec2 a_Uv;\n\n\t\tuniform mat4 u_ProjectionView;\n\t\tuniform mat4 u_Model;\n\n\t\tvarying vec2 v_Uv;\n\n\t\tvoid main() {\n\t\t\tv_Uv = a_Uv;\n\t\t\tgl_Position = u_ProjectionView * u_Model * vec4(a_Position, 1.0);\n\t\t}\n\t`,\n\n\tfragmentShader: `\n\t\tuniform sampler2D normalGlossinessTexture;\n\t\tuniform sampler2D depthTexture;\n\t\tuniform sampler2D albedoMetalnessTexture;\n\t\tuniform sampler2D motionTexture;\n\n\t\tuniform int debug;\n\n\t\tuniform mat4 matProjViewInverse;\n\n\t\tuniform float velocityThreshold;\n\t\tuniform float arrowScale;\n\n\t\tvarying vec2 v_Uv;\n\n\t\tvec2 arrowTileCenterCoord(vec2 pos) {\n\t\t\treturn (floor(pos / ARROW_TILE_SIZE) + 0.5) * ARROW_TILE_SIZE;\n\t\t}\n\n\t\tfloat line(vec2 p, vec2 p1, vec2 p2) {\n\t\t\tvec2 center = (p1 + p2) * 0.5;\n\t\t\tfloat len = length(p2 - p1);\n\t\t\tvec2 dir = (p2 - p1) / len;\n\t\t\tvec2 rel_p = p - center;\n\t\t\tfloat dist1 = abs(dot(rel_p, vec2(dir.y, -dir.x)));\n\t\t\tfloat dist2 = abs(dot(rel_p, dir)) - 0.5 * len;\n\t\t\treturn max(dist1, dist2);\n\t\t}\n\n\t\tfloat arrow(vec2 p, vec2 v) {\n\t\t\tp -= arrowTileCenterCoord(p);\n\t\t\tfloat mag_v = length(v), mag_p = length(p);\n\t\t\tif (mag_v > 0.0) {\n\t\t\t\tvec2 dir_v = v / mag_v;\n\t\t\t\tmag_v = clamp(mag_v, 0.0, ARROW_TILE_SIZE * 0.5);\n\t\t\t\tv = dir_v * mag_v;\n\t\t\t\tfloat shaft = line(p, v, -v);\n\t\t\t\tfloat head = min(line(p, v, 0.4 * v + 0.2 * vec2(-v.y, v.x)),\n\t\t\t\t\tline(p, v, 0.4 * v + 0.2 * vec2(v.y, -v.x)));\n\t\t\t\treturn min(shaft, head);\n\t\t\t} else {\n\t\t\t\treturn mag_p;\n\t\t\t}\n\t\t}\n\n\t\tvoid main() {\n\t\t\tvec2 texCoord = v_Uv;\n\n\t\t\tvec4 texel1 = texture2D(normalGlossinessTexture, texCoord);\n\t\t\tvec4 texel3 = texture2D(albedoMetalnessTexture, texCoord);\n\n\t\t\tif (dot(texel1.rgb, vec3(1.0)) == 0.0) {\n\t\t\t\tdiscard;\n\t\t\t}\n\n\t\t\tfloat glossiness = texel1.a;\n\t\t\tfloat metalness = texel3.a;\n\n\t\t\tvec3 N = texel1.rgb * 2.0 - 1.0;\n\n\t\t\tfloat depth = texture2D(depthTexture, texCoord).r;\n\t\t\tfloat z = depth * 2.0 - 1.0;\n\n\t\t\tvec2 xy = texCoord * 2.0 - 1.0;\n\n\t\t\tvec4 projectedPos = vec4(xy, z, 1.0);\n\t\t\tvec4 p4 = matProjViewInverse * projectedPos;\n\t\t\tvec3 position = p4.xyz / p4.w;\n\n\t\t\tvec3 albedo = texel3.rgb;\n\n\t\t\tif (debug == 0) {\n\t\t\t\tgl_FragColor = vec4(N * 0.5 + 0.5, 1.0);\n\t\t\t} else if (debug == 1) {\n\t\t\t\tgl_FragColor = vec4(vec3(depth), 1.0);\n\t\t\t} else if (debug == 2) {\n\t\t\t\tgl_FragColor = vec4(position, 1.0);\n\t\t\t} else if (debug == 3) {\n\t\t\t\tgl_FragColor = vec4(vec3(glossiness), 1.0);\n\t\t\t} else if (debug == 4) {\n\t\t\t\tgl_FragColor = vec4(vec3(metalness), 1.0);\n\t\t\t} else if (debug == 5) {\n\t\t\t\tgl_FragColor = vec4(albedo, 1.0);\n\t\t\t} else {\n\t\t\t\tvec4 texel4 = texture2D(motionTexture, texCoord);\n\t\t\t\tif (texel4.r == 0.) {\n\t\t\t\t\tdiscard;\n\t\t\t\t}\n\t\t\t\tfloat arrow_dist = arrow(gl_FragCoord.xy, (texel4.rg - 0.5) * ARROW_TILE_SIZE * arrowScale);\n\t\t\t\tvec4 arrow_col = vec4(0, 0, 0, clamp(arrow_dist, 0.0, 1.0));\n\t\t\t\tvec4 field_col = vec4(texel4.rg , 0.5, 1.0);\n\t\t\t\tvec4 fColor = mix(vec4(1.0), field_col, arrow_col.a);\n\t\t\t\tgl_FragColor = fColor;\n\t\t\t\tif (length(texel4.rg - 0.5) < velocityThreshold) {\n\t\t\t\t\tgl_FragColor = field_col;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t`\n};\n\nexport { GBuffer };"
  },
  {
    "path": "examples/jsm/PickBuffer.js",
    "content": "import { OffscreenRenderTarget, PIXEL_TYPE, TEXTURE_FILTER, SHADING_TYPE, ShaderMaterial } from 't3d';\n\nexport default class PickBuffer {\n\n\tconstructor(width, height) {\n\t\tthis._rt = OffscreenRenderTarget.create2D(width, height);\n\t\tthis._rt.texture.minFilter = TEXTURE_FILTER.NEAREST;\n\t\tthis._rt.texture.magFilter = TEXTURE_FILTER.NEAREST;\n\t\tthis._rt.texture.generateMipmaps = false;\n\t\tthis._rt.texture.type = PIXEL_TYPE.FLOAT;\n\n\t\tthis._renderOptions = {\n\t\t\tgetMaterial: createGetMaterialFunction(),\n\t\t\tifRender: function(renderable) {\n\t\t\t\treturn !!renderable.geometry.getAttribute('a_Normal');\n\t\t\t}\n\t\t};\n\n\t\tthis.layers = [0];\n\n\t\tthis.meshes = new Map();\n\t}\n\n\tsetMeshPickId(pickId, mesh) {\n\t\tmesh.pickId = pickId;\n\t\tthis.meshes.set(pickId, mesh);\n\t}\n\n\tgetMeshByPickId(pickId) {\n\t\treturn this.meshes.get(pickId);\n\t}\n\n\trender(renderer, scene, camera) {\n\t\tconst renderOptions = this._renderOptions;\n\n\t\tconst renderStates = scene.getRenderStates(camera);\n\t\tconst renderQueue = scene.getRenderQueue(camera);\n\n\t\trenderer.beginRender(this._rt);\n\n\t\tconst layers = this.layers;\n\t\tfor (let i = 0, l = layers.length; i < l; i++) {\n\t\t\tconst renderQueueLayer = renderQueue.getLayer(layers[i]);\n\t\t\trenderer.renderRenderableList(renderQueueLayer.opaque, renderStates, renderOptions);\n\t\t\trenderer.renderRenderableList(renderQueueLayer.transparent, renderStates, renderOptions);\n\t\t}\n\n\t\trenderer.endRender();\n\t}\n\n\toutput() {\n\t\treturn this._rt;\n\t}\n\n\tresize(width, height) {\n\t\tthis._rt.resize(width, height);\n\t}\n\n\tdispose() {\n\t\tthis._rt.dispose();\n\t}\n\n}\n\nfunction createGetMaterialFunction(func = defaultMaterialReplaceFunction) {\n\treturn function(renderable) {\n\t\tconst material = func(renderable);\n\t\tmaterial.uniforms['u_pickId'] = renderable.object.pickId || 0.0;\n\t\tmaterial.side = renderable.material.side;\n\t\treturn material;\n\t};\n}\n\nconst materialMap = new Map();\nconst materialWeakMap = new WeakMap();\n\nfunction defaultMaterialReplaceFunction(renderable) {\n\tlet materialRef = materialWeakMap.get(renderable.material);\n\tif (!materialRef) {\n\t\tconst useFlatShading = !renderable.geometry.attributes['a_Normal'] || (renderable.material.shading === SHADING_TYPE.FLAT_SHADING);\n\t\tconst useSkinning = renderable.object.isSkinnedMesh && renderable.object.skeleton;\n\t\tconst morphTargets = !!renderable.object.morphTargetInfluences;\n\t\tconst morphNormals = !!renderable.object.morphTargetInfluences && renderable.object.geometry.morphAttributes.normal;\n\t\tconst side = renderable.material.side;\n\n\t\tlet maxBones = 0;\n\t\tif (useSkinning) {\n\t\t\tif (renderable.object.skeleton.boneTexture) {\n\t\t\t\tmaxBones = 1024;\n\t\t\t} else {\n\t\t\t\tmaxBones = renderable.object.skeleton.bones.length;\n\t\t\t}\n\t\t}\n\n\t\tconst code = useFlatShading +\n\t\t\t'_' + useSkinning +\n\t\t\t'_' + maxBones +\n\t\t\t'_' + morphTargets +\n\t\t\t'_' + morphNormals +\n\t\t\t'_' + side;\n\n\t\tmaterialRef = materialMap.get(code);\n\t\tif (!materialRef) {\n\t\t\tconst material = new ShaderMaterial(pickShader);\n\t\t\tmaterial.shading = useFlatShading ? SHADING_TYPE.FLAT_SHADING : SHADING_TYPE.SMOOTH_SHADING;\n\t\t\tmaterial.side = side;\n\n\t\t\tmaterialRef = { refCount: 0, material };\n\t\t\tmaterialMap.set(code, materialRef);\n\t\t}\n\n\t\tmaterialWeakMap.set(renderable.material, materialRef);\n\t\tmaterialRef.refCount++;\n\n\t\tfunction onDispose() {\n\t\t\trenderable.material.removeEventListener('dispose', onDispose);\n\n\t\t\tmaterialWeakMap.delete(renderable.material);\n\t\t\tmaterialRef.refCount--;\n\n\t\t\tif (materialRef.refCount <= 0) {\n\t\t\t\tmaterialMap.delete(code);\n\t\t\t}\n\t\t}\n\t\trenderable.material.addEventListener('dispose', onDispose);\n\t}\n\n\treturn materialRef.material;\n}\n\nconst pickShader = {\n\tname: 'gpu_pick',\n\tuniforms: {\n\t\tu_pickId: 1\n\t},\n\tvertexShader: `\n        #include <common_vert>\n        #include <morphtarget_pars_vert>\n        #include <skinning_pars_vert>\n        #include <normal_pars_vert>\n\t\t#include <logdepthbuf_pars_vert>\n\t\tvarying float viewZ;\n        void main() {\n        \t#include <begin_vert>\n        \t#include <morphtarget_vert>\n        \t#include <morphnormal_vert>\n        \t#include <skinning_vert>\n        \t#include <skinnormal_vert>\n        \t#include <normal_vert>\n        \t#include <pvm_vert>\n\t\t\t#include <logdepthbuf_vert>\n\t\t\tviewZ = (u_View * worldPosition).z;\n        }\n    `,\n\tfragmentShader: `\n\t\t#include <common_frag>\n\t\t#include <normal_pars_frag>\n\t\t#include <logdepthbuf_pars_frag>\n\n\t\tuniform float u_pickId;\n\n\t\tvarying float viewZ;\n\n\t\tvec2 unitVectorToOctahedron(vec3 v) {\n\t\t\tvec2 up = v.xz / dot(vec3(1.0), abs(v));\n\t\t\tvec2 down = (1.0 - abs(up.yx)) * sign(up.xy);\n\t\t\treturn mix(up, down, step(0.0, -v.y));\n\t\t}\n\n        void main() {\n     \t\t#include <logdepthbuf_frag>\n            vec3 normal = normalize(v_Normal);\n\t\t\tvec4 pickInformation;\n            pickInformation.xy = unitVectorToOctahedron(normal);\n            pickInformation.z = viewZ;\n\t\t\tpickInformation.w = round(u_pickId);\n            gl_FragColor = pickInformation;\n        }\n    `\n};\n"
  },
  {
    "path": "examples/jsm/Raycaster.js",
    "content": "// deprecated since v0.4.3\nconsole.warn('Raycaster has been moved to core. Please import it from t3d instead of t3d/addons.');\nexport { Raycaster } from 't3d';"
  },
  {
    "path": "examples/jsm/SHGenerator.js",
    "content": "import {\n\tVector3,\n\tColor3,\n\tOffscreenRenderTarget,\n\tScene,\n\tPIXEL_TYPE,\n\tPIXEL_FORMAT,\n\tSphericalHarmonics3\n} from 't3d';\nimport { SkyBox } from './objects/SkyBox.js';\nimport { ReflectionProbe } from './probes/ReflectionProbe.js';\n\nclass SHGenerator {\n\n\tstatic fromCubeTexture(renderer, envMap, out = new SphericalHarmonics3()) {\n\t\tconst imageWidth = 256;\n\t\tconst capabilities = renderer.capabilities;\n\t\tconst isWebGL2 = capabilities.version > 1;\n\n\t\tif (isWebGL2) {\n\t\t\tcapabilities.getExtension('EXT_color_buffer_float');\n\t\t} else {\n\t\t\tcapabilities.getExtension('OES_texture_half_float');\n\t\t\tcapabilities.getExtension('OES_texture_half_float_linear');\n\t\t}\n\n\t\tcapabilities.getExtension('OES_texture_float_linear');\n\t\tcapabilities.getExtension('EXT_color_buffer_half_float');\n\n\t\tconst textureType = PIXEL_TYPE.UNSIGNED_BYTE,\n\t\t\tArrayCtor = Uint8Array,\n\t\t\tformat = PIXEL_FORMAT.RGBA;\n\n\t\tconst cubeRenderTarget = OffscreenRenderTarget.createCube(256, 256);\n\t\tcubeRenderTarget.texture.type = textureType;\n\t\tcubeRenderTarget.texture.format = format;\n\n\t\tconst dummyScene = new Scene();\n\t\tconst skyEnv = new SkyBox(envMap);\n\t\tconst reflectionProbe = new ReflectionProbe(cubeRenderTarget);\n\t\tdummyScene.add(skyEnv);\n\t\tdummyScene.add(reflectionProbe.camera);\n\n\t\tlet totalWeight = 0;\n\n\t\tconst coord = new Vector3();\n\n\t\tconst dir = new Vector3();\n\n\t\tconst color = new Color3();\n\n\t\tconst shBasis = [0, 0, 0, 0, 0, 0, 0, 0, 0];\n\n\t\tconst sh = out;\n\t\tconst shCoefficients = sh.coefficients;\n\t\treflectionProbe.render(renderer, dummyScene);\n\t\tfor (let faceIndex = 0; faceIndex < 6; faceIndex++) {\n\t\t\tconst data = new ArrayCtor(cubeRenderTarget.width * cubeRenderTarget.height * 4);\n\t\t\trenderer.readTexturePixelsSync(\n\t\t\t\tcubeRenderTarget.texture,\n\t\t\t\t0, 0, cubeRenderTarget.width, cubeRenderTarget.height,\n\t\t\t\tdata, faceIndex);\n\t\t\tconst pixelSize = 2 / imageWidth;\n\n\t\t\tfor (let i = 0, il = data.length; i < il; i += 4) { // RGBA assumed\n\t\t\t\t// pixel color\n\t\t\t\tcolor.setRGB(data[i] / 255, data[i + 1] / 255, data[i + 2] / 255);\n\n\t\t\t\t// convert to linear color space\n\t\t\t\tconvertColorToLinear(color, cubeRenderTarget.texture.encoding);\n\n\t\t\t\t// pixel coordinate on unit cube\n\n\t\t\t\tconst pixelIndex = i / 4;\n\n\t\t\t\tconst col = -1 + (pixelIndex % imageWidth + 0.5) * pixelSize;\n\n\t\t\t\tconst row = 1 - (Math.floor(pixelIndex / imageWidth) + 0.5) * pixelSize;\n\n\t\t\t\tswitch (faceIndex) {\n\t\t\t\t\tcase 0: coord.set(1, row, -col); break;\n\n\t\t\t\t\tcase 1: coord.set(-1, row, col); break;\n\n\t\t\t\t\tcase 2: coord.set(col, 1, -row); break;\n\n\t\t\t\t\tcase 3: coord.set(col, -1, row); break;\n\n\t\t\t\t\tcase 4: coord.set(col, row, 1); break;\n\n\t\t\t\t\tcase 5: coord.set(-col, row, -1); break;\n\t\t\t\t}\n\n\t\t\t\t// weight assigned to this pixel\n\n\t\t\t\tconst lengthSq = coord.getLengthSquared();\n\n\t\t\t\tconst weight = 4 / (Math.sqrt(lengthSq) * lengthSq);\n\n\t\t\t\ttotalWeight += weight;\n\n\t\t\t\t// direction vector to this pixel\n\t\t\t\tdir.copy(coord).normalize();\n\n\t\t\t\t// evaluate SH basis functions in direction dir\n\t\t\t\tSphericalHarmonics3.getBasisAt(dir, shBasis);\n\n\t\t\t\t// accummuulate\n\t\t\t\tfor (let j = 0; j < 9; j++) {\n\t\t\t\t\tshCoefficients[j].x += shBasis[j] * color.r * weight;\n\t\t\t\t\tshCoefficients[j].y += shBasis[j] * color.g * weight;\n\t\t\t\t\tshCoefficients[j].z += shBasis[j] * color.b * weight;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tcubeRenderTarget.dispose();\n\n\t\t// normalize\n\t\tconst norm = (4 * Math.PI) / totalWeight;\n\t\tfor (let j = 0; j < 9; j++) {\n\t\t\tshCoefficients[j].x *= norm;\n\t\t\tshCoefficients[j].y *= norm;\n\t\t\tshCoefficients[j].z *= norm;\n\t\t}\n\n\t\treturn out;\n\t}\n\n\tstatic fromColors(color1, color2, out = new SphericalHarmonics3()) {\n\t\tconst sky = new Vector3(color1.r, color1.g, color1.b);\n\t\tconst ground = new Vector3(color2.r, color2.g, color2.b);\n\n\t\t// without extra factor of PI in the shader, should = 1 / Math.sqrt( Math.PI );\n\t\tconst c0 = Math.sqrt(Math.PI);\n\t\tconst c1 = c0 * Math.sqrt(0.75);\n\n\t\tout.coefficients[0].copy(sky).add(ground).multiplyScalar(c0);\n\t\tout.coefficients[1].copy(sky).sub(ground).multiplyScalar(c1);\n\n\t\treturn out;\n\t}\n\n\tstatic fromColor(color, out = new SphericalHarmonics3()) {\n\t\t// without extra factor of PI in the shader, would be 2 / Math.sqrt( Math.PI );\n\t\tout.coefficients[0].set(color.r, color.g, color.b).multiplyScalar(2 * Math.sqrt(Math.PI));\n\t\treturn out;\n\t}\n\n}\n\nfunction convertColorToLinear(color, encoding) {\n\tif (encoding !== 'linear') \t{\n\t\tcolor.convertSRGBToLinear();\n\t}\n\treturn color;\n}\n\nexport { SHGenerator };\n"
  },
  {
    "path": "examples/jsm/SceneUtils.js",
    "content": "import { Box3, Matrix4, Vector3 } from 't3d';\n\nclass SceneUtils {\n\n\tstatic getRelativeMatrixFromRoot(node, root, target = new Matrix4()) {\n\t\ttarget.identity();\n\n\t\tlet tempNode = node;\n\n\t\twhile (tempNode !== root && tempNode !== null) {\n\t\t\tif (tempNode.matrixAutoUpdate || tempNode.matrixNeedsUpdate) {\n\t\t\t\ttempNode.matrix.compose(tempNode.position, tempNode.quaternion, tempNode.scale);\n\t\t\t\ttempNode.matrixNeedsUpdate = false;\n\t\t\t\ttempNode.worldMatrixNeedsUpdate = true;\n\t\t\t}\n\n\t\t\ttarget.premultiply(tempNode.matrix);\n\n\t\t\ttempNode = tempNode.parent;\n\t\t}\n\n\t\treturn target;\n\t}\n\n\tstatic expandBox3ByObject(object, root, target, precise) {\n\t\tconst geometry = object.geometry;\n\n\t\tif (geometry) {\n\t\t\tconst matrix = root ?\n\t\t\t\tthis.getRelativeMatrixFromRoot(object, root, _mat4_1)\n\t\t\t\t: object.worldMatrix;\n\n\t\t\tconst box = precise ?\n\t\t\t\tthis.computeMeshAccurateBoundings(object, _box3_1)\n\t\t\t\t: _box3_1.copy(geometry.boundingBox);\n\n\t\t\tbox.applyMatrix4(matrix);\n\n\t\t\ttarget.expandByBox3(box);\n\t\t}\n\n\t\tconst children = object.children;\n\n\t\tfor (let i = 0, l = children.length; i < l; i++) {\n\t\t\tthis.expandBox3ByObject(children[i], root, target, precise);\n\t\t}\n\n\t\treturn target;\n\t}\n\n\tstatic setBox3FromObject(object, root, target = new Box3(), precise = false) {\n\t\ttarget.makeEmpty();\n\t\treturn this.expandBox3ByObject(object, root, target, precise);\n\t}\n\n\tstatic computeMeshAccurateBoundings(mesh, target) {\n\t\ttarget.makeEmpty();\n\n\t\tconst positionAttribute = mesh.geometry.attributes.a_Position;\n\n\t\tfor (let i = 0; i < positionAttribute.buffer.count; i++) {\n\t\t\tmesh.getVertexPosition(i, _vec3_1);\n\t\t\ttarget.expandByPoint(_vec3_1);\n\t\t}\n\n\t\treturn target;\n\t}\n\n}\n\nconst _box3_1 = new Box3();\nconst _mat4_1 = new Matrix4();\nconst _vec3_1 = new Vector3();\n\nexport { SceneUtils };"
  },
  {
    "path": "examples/jsm/SkeletonUtils.js",
    "content": "import { KeyframeClip } from 't3d';\n\n/**\n * SkeletonUtils\n */\nconst SkeletonUtils = {\n\n\tclone: function(source, clips, outputClips) {\n\t\tconst sourceLookup = new Map();\n\t\tconst cloneLookup = new Map();\n\n\t\tconst clone = source.clone();\n\n\t\tparallelTraverse(source, clone, function(sourceNode, clonedNode) {\n\t\t\tsourceLookup.set(clonedNode, sourceNode);\n\t\t\tcloneLookup.set(sourceNode, clonedNode);\n\t\t});\n\n\t\tclone.traverse(function(node) {\n\t\t\tif (!node.skeleton) return;\n\t\t\tconst clonedMesh = node;\n\t\t\tconst sourceMesh = sourceLookup.get(node);\n\t\t\tconst sourceBones = sourceMesh.skeleton.bones;\n\t\t\tclonedMesh.skeleton = sourceMesh.skeleton.clone();\n\t\t\tclonedMesh.bindMatrix.copy(sourceMesh.bindMatrix);\n\t\t\tclonedMesh.skeleton.bones = sourceBones.map(function(bone) {\n\t\t\t\treturn cloneLookup.get(bone);\n\t\t\t});\n\t\t\t// clonedMesh.bind(clonedMesh.skeleton, clonedMesh.bindMatrix);\n\t\t});\n\n\t\t// console.time('clone');\n\n\t\tif (clips && clips.length > 0) {\n\t\t\tclips.forEach(function(clip) {\n\t\t\t\tconst tracks = clip.tracks.map(function(track) {\n\t\t\t\t\treturn new track.constructor(\n\t\t\t\t\t\tcloneLookup.get(track.target),\n\t\t\t\t\t\ttrack.propertyPath,\n\t\t\t\t\t\ttrack.times,\n\t\t\t\t\t\ttrack.values,\n\t\t\t\t\t\ttrack.interpolant\n\t\t\t\t\t);\n\t\t\t\t});\n\t\t\t\tconst newClip = new KeyframeClip(clip.name, tracks, clip.duration);\n\t\t\t\toutputClips.push(newClip);\n\t\t\t});\n\t\t}\n\n\t\t// console.timeEnd('clone');\n\n\t\treturn clone;\n\t}\n\n};\n\nfunction parallelTraverse(a, b, callback) {\n\tcallback(a, b);\n\n\tfor (let i = 0; i < a.children.length; i++) {\n\t\tparallelTraverse(a.children[i], b.children[i], callback);\n\t}\n}\n\nexport { SkeletonUtils };"
  },
  {
    "path": "examples/jsm/SuperSampling.js",
    "content": "/**\n * Super Sampling\n */\n\nimport {\n\tMatrix4,\n\tOffscreenRenderTarget,\n\tShaderPostPass,\n\tTEXTURE_FILTER\n} from 't3d';\nimport { TAAShader } from './shaders/TAAShader.js';\n\nclass SuperSampling {\n\n\tconstructor(width, height, samplingSize = 30) {\n\t\tthis._samplingSize = samplingSize;\n\n\t\tconst haltonSequence = [[0.5, 0.5]]; // first center\n\n\t\tfor (let i = 0; i < this._samplingSize - 1; i++) {\n\t\t\thaltonSequence.push([\n\t\t\t\thalton(i, 2), halton(i, 3)\n\t\t\t]);\n\t\t}\n\n\t\tthis._haltonSequence = haltonSequence;\n\n\t\tconst prevFrame = OffscreenRenderTarget.create2D(width, height);\n\t\tprevFrame.texture.minFilter = TEXTURE_FILTER.LINEAR;\n\t\tprevFrame.texture.magFilter = TEXTURE_FILTER.LINEAR;\n\t\tprevFrame.texture.generateMipmaps = false;\n\n\t\tthis._prevFrame = prevFrame;\n\n\t\tconst output = OffscreenRenderTarget.create2D(width, height);\n\t\toutput.texture.minFilter = TEXTURE_FILTER.LINEAR;\n\t\toutput.texture.magFilter = TEXTURE_FILTER.LINEAR;\n\t\toutput.texture.generateMipmaps = false;\n\n\t\tthis._output = output;\n\n\t\tthis._taaPass = new ShaderPostPass(TAAShader);\n\t\tthis._taaPass.material.depthWrite = false;\n\t\tthis._taaPass.material.depthTest = false;\n\n\t\tthis._frame = 0;\n\t}\n\n\tresize(width, height) {\n\t\tthis._prevFrame.resize(width, height);\n\t\tthis._output.resize(width, height);\n\t}\n\n\tstart() {\n\t\tthis._frame = 0;\n\t}\n\n\tfinished() {\n\t\treturn this._frame >= this._samplingSize;\n\t}\n\n\tframe() {\n\t\treturn this._frame;\n\t}\n\n\t/**\n\t * Jitter camera projectionMatrix\n\t * @param {Camera} camera\n\t * @param {number} width screen width\n\t * @param {number} height screen height\n\t */\n\tjitterProjection(camera, width, height) {\n\t\tconst offset = this._haltonSequence[this._frame];\n\n\t\tif (!offset) {\n\t\t\tconsole.error('SuperSampling: try to jitter camera after finished!', this._frame, this._haltonSequence.length);\n\t\t}\n\n\t\ttranslationMat.elements[12] = (offset[0] * 2.0 - 1.0) / width;\n\t\ttranslationMat.elements[13] = (offset[1] * 2.0 - 1.0) / height;\n\n\t\tcamera.projectionMatrix.premultiply(translationMat);\n\t}\n\n\t/**\n\t * @param {ThinRenderer} renderer\n\t * @param {TextureBase} texture input texture\n\t * @param {TextureBase} velocityTexture velocity texture\n\t * @param {TextureBase} depthTexture depth texture\n\t * @param {boolean} [still=true]\n\t * @returns {TextureBase} output texture\n\t */\n\tsample(renderer, texture, velocityTexture, depthTexture, still) {\n\t\tvelocityTexture = (velocityTexture !== undefined) ? velocityTexture : null;\n\t\tstill = (still !== undefined) ? still : true;\n\n\t\tconst first = this._frame === 0;\n\n\t\tthis._taaPass.uniforms['currTex'] = texture;\n\t\tthis._taaPass.uniforms['prevTex'] = this._prevFrame.texture;\n\t\tthis._taaPass.uniforms['velocityTex'] = velocityTexture;\n\t\tthis._taaPass.uniforms['depthTex'] = depthTexture;\n\t\tthis._taaPass.uniforms['texelSize'][0] = 1 / this._prevFrame.width;\n\t\tthis._taaPass.uniforms['texelSize'][1] = 1 / this._prevFrame.height;\n\t\tthis._taaPass.uniforms['still'] = !!still;\n\t\tthis._taaPass.uniforms['stillBlending'] = first ? 0 : 0.9;\n\t\tthis._taaPass.uniforms['motionBlending'] = first ? 0 : 0.2;\n\n\t\tthis._taaPass.render(renderer, this._output);\n\n\t\tconst temp = this._prevFrame;\n\t\tthis._prevFrame = this._output;\n\t\tthis._output = temp;\n\n\t\tthis._frame++;\n\n\t\treturn this._prevFrame.texture;\n\t}\n\n\t/**\n\t * @returns {TextureBase} output texture\n\t */\n\toutput() {\n\t\treturn this._prevFrame.texture;\n\t}\n\n}\n\nconst translationMat = new Matrix4();\n\n// https://en.wikipedia.org/wiki/Halton_sequence halton sequence.\nfunction halton(index, base) {\n\tlet result = 0;\n\tlet f = 1 / base;\n\tlet i = index;\n\twhile (i > 0) {\n\t\tresult = result + f * (i % base);\n\t\ti = Math.floor(i / base);\n\t\tf = f / base;\n\t}\n\treturn result;\n}\n\nexport { SuperSampling };"
  },
  {
    "path": "examples/jsm/VoxMeshBuilder.js",
    "content": "/**\n * VOXMeshBuilder\n */\n\nimport {\n\tAttribute,\n\tBuffer,\n\tColor3,\n\tGeometry,\n\tMatrix3,\n\tMatrix4,\n\tMesh,\n\tPhongMaterial,\n\tVERTEX_COLOR,\n\tVector2,\n\tVector3\n} from 't3d';\n\n/**\n * VOXMeshBuilder\n * Reference https://github.com/daishihmr/vox.js\n */\nclass VOXMeshBuilder {\n\n\t/**\n\t * @param {VoxelData} voxelData\n\t * @param {object=} param\n\t * @param {number=} param.voxelSize default = 1.0.\n\t * @param {boolean=} param.vertexColor default = false.\n\t * @param {boolean=} param.optimizeFaces dafalue = true.\n\t * @param {boolean=} param.originToBottom dafalue = true.\n\t */\n\tconstructor(voxelData, param) {\n\t\tif (!VOXMeshBuilder.textureFactory) {\n\t\t\t// eslint-disable-next-line\n\t\t\tif (!vox || !vox.TextureFactory) {\n\t\t\t\tconsole.error('VOXMeshBuilder relies on vox.js');\n\t\t\t}\n\t\t\t// eslint-disable-next-line\n\t\t\tVOXMeshBuilder.textureFactory = new vox.TextureFactory();\n\t\t}\n\n\t\tparam = param || {};\n\t\tthis.voxelData = voxelData;\n\t\tthis.voxelSize = param.voxelSize || VOXMeshBuilder.DEFAULT_PARAM.voxelSize;\n\t\tthis.vertexColor = (param.vertexColor === undefined) ? VOXMeshBuilder.DEFAULT_PARAM.vertexColor : param.vertexColor;\n\t\tthis.optimizeFaces = (param.optimizeFaces === undefined) ? VOXMeshBuilder.DEFAULT_PARAM.optimizeFaces : param.optimizeFaces;\n\t\tthis.originToBottom = (param.originToBottom === undefined) ? VOXMeshBuilder.DEFAULT_PARAM.originToBottom : param.originToBottom;\n\n\t\tthis.geometry = null;\n\t\tthis.material = null;\n\n\t\tthis._build();\n\t}\n\n\t_build() {\n\t\tthis.geometry = new Geometry();\n\t\tthis.material = new PhongMaterial();\n\n\t\tconst geometry = new VOXGeometry();\n\n\t\tthis.hashTable = createHashTable(this.voxelData.voxels);\n\n\t\tconst offsetX = (this.voxelData.size.x - 1) * -0.5;\n\t\tconst offsetY = (this.voxelData.size.y - 1) * -0.5;\n\t\tconst offsetZ = (this.originToBottom) ? 0 : (this.voxelData.size.z - 1) * -0.5;\n\t\tconst matrix = new Matrix4();\n\t\tthis.voxelData.voxels.forEach(voxel => {\n\t\t\tconst voxGeometry = this._createVoxGeometry(voxel);\n\t\t\tif (voxGeometry) {\n\t\t\t\tmatrix.makeTranslation((voxel.x + offsetX) * this.voxelSize, (voxel.z + offsetZ) * this.voxelSize, -(voxel.y + offsetY) * this.voxelSize);\n\t\t\t\tgeometry.merge(voxGeometry, matrix);\n\t\t\t}\n\t\t});\n\n\t\tif (this.optimizeFaces) {\n\t\t\tgeometry.mergeVertices();\n\t\t}\n\t\tgeometry.computeFaceNormals();\n\n\t\tthis.geometry = geometry.createGeometry();\n\n\t\tif (this.vertexColor) {\n\t\t\tthis.material.vertexColors = VERTEX_COLOR.RGBA;\n\t\t} else {\n\t\t\tthis.material.diffuseMap = VOXMeshBuilder.textureFactory.getTexture(this.voxelData);\n\t\t}\n\t}\n\n\t_createVoxGeometry(voxel) {\n\t\t// find neighboring voxels and ignore coincident faces\n\t\tconst ignoreFaces = [];\n\t\tif (this.optimizeFaces) {\n\t\t\tsix.forEach(s => {\n\t\t\t\tif (this.hashTable.has(voxel.x + s.x, voxel.y + s.y, voxel.z + s.z)) {\n\t\t\t\t\tignoreFaces.push(s.ignoreFace);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\t// returns null if adjacent in all 6 directions\n\t\tif (ignoreFaces.length === 6) return null;\n\n\t\t// vertex data\n\t\tconst voxVertices = voxVerticesSource.map(voxel => {\n\t\t\treturn new Vector3(voxel.x * this.voxelSize * 0.5, voxel.y * this.voxelSize * 0.5, voxel.z * this.voxelSize * 0.5);\n\t\t});\n\n\t\t// face data\n\t\tconst voxFaces = voxFacesSource.map(f => {\n\t\t\treturn {\n\t\t\t\tfaceA: new VOXFace3(f.faceA.a, f.faceA.b, f.faceA.c),\n\t\t\t\tfaceB: new VOXFace3(f.faceB.a, f.faceB.b, f.faceB.c)\n\t\t\t};\n\t\t});\n\n\t\t// vertex color\n\t\tlet color;\n\t\tif (this.vertexColor) {\n\t\t\tconst c = this.voxelData.palette[voxel.colorIndex];\n\t\t\tcolor = new Color3(c.r / 255, c.g / 255, c.b / 255);\n\t\t}\n\n\t\tconst vox = new VOXGeometry();\n\t\tvox.faceVertexUvs[0] = [];\n\n\t\t// push faces\n\t\tvoxFaces.forEach((faces, i) => {\n\t\t\tif (ignoreFaces.indexOf(i) >= 0) return;\n\n\t\t\tif (this.vertexColor) {\n\t\t\t\tfaces.faceA.color = color;\n\t\t\t\tfaces.faceB.color = color;\n\t\t\t} else {\n\t\t\t\tconst uv = new Vector2((voxel.colorIndex + 0.5) / 256, 0.5);\n\t\t\t\tvox.faceVertexUvs[0].push([uv, uv, uv], [uv, uv, uv]);\n\t\t\t}\n\t\t\tvox.faces.push(faces.faceA, faces.faceB);\n\t\t});\n\n\t\t// extract used vertices\n\t\tconst usingVertices = {};\n\t\tvox.faces.forEach(function(face) {\n\t\t\tusingVertices[face.a] = true;\n\t\t\tusingVertices[face.b] = true;\n\t\t\tusingVertices[face.c] = true;\n\t\t});\n\n\t\t// processing to fill up the vertex index of the face\n\t\tfunction splice(index) {\n\t\t\tvox.faces.forEach(face => {\n\t\t\t\tif (face.a > index) face.a -= 1;\n\t\t\t\tif (face.b > index) face.b -= 1;\n\t\t\t\tif (face.c > index) face.c -= 1;\n\t\t\t});\n\t\t}\n\n\t\t// add only used vertices\n\t\tlet j = 0;\n\t\tvoxVertices.forEach((vertex, i) => {\n\t\t\tif (usingVertices[i]) {\n\t\t\t\tvox.vertices.push(vertex);\n\t\t\t} else {\n\t\t\t\tsplice(i - j);\n\t\t\t\tj += 1;\n\t\t\t}\n\t\t});\n\n\t\treturn vox;\n\t}\n\n\t/**\n\t * @returns {Texture2D}\n\t */\n\tgetTexture() {\n\t\treturn VOXMeshBuilder.textureFactory.getTexture(this.voxelData);\n\t}\n\n\t/**\n\t * @returns {Mesh}\n\t */\n\tcreateMesh() {\n\t\treturn new Mesh(this.geometry, this.material);\n\t}\n\n\t/**\n\t * is it an outward facing voxel?\n\t * @param {object} voxel\n\t * @returns {boolean}\n\t */\n\tisOuterVoxel(voxel) {\n\t\treturn six.filter(s => {\n\t\t\treturn this.hashTable.has(voxel.x + s.x, voxel.y + s.y, voxel.z + s.z);\n\t\t}).length < 6;\n\t}\n\n}\n\nVOXMeshBuilder.DEFAULT_PARAM = {\n\tvoxelSize: 1.0,\n\tvertexColor: false,\n\toptimizeFaces: true,\n\toriginToBottom: true\n};\n\nVOXMeshBuilder.textureFactory = undefined;\n\n\n// correspondence table between adjacent directions and ignored surfaces\nconst six = [\n\t{ x: -1, y: 0, z: 0, ignoreFace: 0 },\n\t{ x: 1, y: 0, z: 0, ignoreFace: 1 },\n\t{ x: 0, y: -1, z: 0, ignoreFace: 5 },\n\t{ x: 0, y: 1, z: 0, ignoreFace: 4 },\n\t{ x: 0, y: 0, z: -1, ignoreFace: 2 },\n\t{ x: 0, y: 0, z: 1, ignoreFace: 3 }\n];\n\n// vertex data source\nconst voxVerticesSource = [\n\t{ x: -1, y: 1, z: -1 },\n\t{ x: 1, y: 1, z: -1 },\n\t{ x: -1, y: 1, z: 1 },\n\t{ x: 1, y: 1, z: 1 },\n\t{ x: -1, y: -1, z: -1 },\n\t{ x: 1, y: -1, z: -1 },\n\t{ x: -1, y: -1, z: 1 },\n\t{ x: 1, y: -1, z: 1 }\n];\n\n// face data source\nconst voxFacesSource = [\n\t{ faceA: { a: 6, b: 2, c: 0 }, faceB: { a: 6, b: 0, c: 4 } },\n\t{ faceA: { a: 5, b: 1, c: 3 }, faceB: { a: 5, b: 3, c: 7 } },\n\t{ faceA: { a: 5, b: 7, c: 6 }, faceB: { a: 5, b: 6, c: 4 } },\n\t{ faceA: { a: 2, b: 3, c: 1 }, faceB: { a: 2, b: 1, c: 0 } },\n\t{ faceA: { a: 4, b: 0, c: 1 }, faceB: { a: 4, b: 1, c: 5 } },\n\t{ faceA: { a: 7, b: 3, c: 2 }, faceB: { a: 7, b: 2, c: 6 } }\n];\n\nfunction hash(x, y, z) {\n\treturn 'x' + x + 'y' + y + 'z' + z;\n}\n\nfunction createHashTable(voxels) {\n\tconst hashTable = {};\n\tvoxels.forEach(function(v) {\n\t\thashTable[hash(v.x, v.y, v.z)] = true;\n\t});\n\n\thashTable.has = function(x, y, z) {\n\t\treturn hash(x, y, z) in this;\n\t};\n\treturn hashTable;\n}\n\nclass VOXFace3 {\n\n\tconstructor(a, b, c, normal = new Vector3(), color = new Color3(), materialIndex = 0) {\n\t\tthis.a = a;\n\t\tthis.b = b;\n\t\tthis.c = c;\n\t\tthis.normal = normal;\n\t\tthis.color = color;\n\t\tthis.materialIndex = materialIndex;\n\t}\n\n\tcopy(source) {\n\t\tthis.a = source.a;\n\t\tthis.b = source.b;\n\t\tthis.c = source.c;\n\n\t\tthis.normal.copy(source.normal);\n\t\tthis.color.copy(source.color);\n\t\tthis.materialIndex = source.materialIndex;\n\n\t\treturn this;\n\t}\n\n\tclone() {\n\t\treturn new VOXFace3().copy(this);\n\t}\n\n}\n\nclass VOXGeometry {\n\n\tconstructor() {\n\t\tthis.vertices = [];\n\t\tthis.faces = [];\n\t\tthis.faceVertexUvs = [[]];\n\t}\n\n\tcomputeFaceNormals() {\n\t\tconst cb = new Vector3(), ab = new Vector3();\n\n\t\tfor (let f = 0, fl = this.faces.length; f < fl; f++) {\n\t\t\tconst face = this.faces[f];\n\n\t\t\tconst vA = this.vertices[face.a];\n\t\t\tconst vB = this.vertices[face.b];\n\t\t\tconst vC = this.vertices[face.c];\n\n\t\t\tcb.subVectors(vC, vB);\n\t\t\tab.subVectors(vA, vB);\n\t\t\tcb.cross(ab);\n\n\t\t\tcb.normalize();\n\n\t\t\tface.normal.copy(cb);\n\t\t}\n\t}\n\n\tmerge(geometry, matrix, materialIndexOffset) {\n\t\tlet normalMatrix;\n\t\tconst vertexOffset = this.vertices.length,\n\t\t\tvertices1 = this.vertices,\n\t\t\tvertices2 = geometry.vertices,\n\t\t\tfaces1 = this.faces,\n\t\t\tfaces2 = geometry.faces,\n\t\t\tuvs1 = this.faceVertexUvs[0],\n\t\t\tuvs2 = geometry.faceVertexUvs[0];\n\n\t\tif (materialIndexOffset === undefined) materialIndexOffset = 0;\n\n\t\tif (matrix !== undefined) {\n\t\t\tnormalMatrix = new Matrix3().setFromMatrix4(matrix).invert().transpose();\n\t\t}\n\n\t\t// vertices\n\n\t\tfor (let i = 0, il = vertices2.length; i < il; i++) {\n\t\t\tconst vertex = vertices2[i];\n\t\t\tconst vertexCopy = vertex.clone();\n\t\t\tif (matrix !== undefined) vertexCopy.applyMatrix4(matrix);\n\t\t\tvertices1.push(vertexCopy);\n\t\t}\n\n\t\t// faces\n\n\t\tfor (let i = 0, il = faces2.length; i < il; i++) {\n\t\t\tconst face = faces2[i];\n\n\t\t\tconst faceCopy = new VOXFace3(face.a + vertexOffset, face.b + vertexOffset, face.c + vertexOffset);\n\t\t\tfaceCopy.normal.copy(face.normal);\n\n\t\t\tif (normalMatrix !== undefined) {\n\t\t\t\tfaceCopy.normal.applyMatrix3(normalMatrix).normalize();\n\t\t\t}\n\n\t\t\tfaceCopy.color.copy(face.color);\n\n\t\t\tfaceCopy.materialIndex = face.materialIndex + materialIndexOffset;\n\n\t\t\tfaces1.push(faceCopy);\n\t\t}\n\n\t\t// uvs\n\n\t\tfor (let i = 0, il = uvs2.length; i < il; i++) {\n\t\t\tconst uv = uvs2[i], uvCopy = [];\n\n\t\t\tif (uv === undefined) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tfor (let j = 0, jl = uv.length; j < jl; j++) {\n\t\t\t\tuvCopy.push(uv[j].clone());\n\t\t\t}\n\n\t\t\tuvs1.push(uvCopy);\n\t\t}\n\t}\n\n\tmergeVertices() {\n\t\tconst verticesMap = {}; // Hashmap for looking up vertices by position coordinates (and making sure they are unique)\n\t\tconst unique = [], changes = [];\n\n\t\tlet v, key;\n\t\tconst precisionPoints = 4; // number of decimal points, e.g. 4 for epsilon of 0.0001\n\t\tconst precision = Math.pow(10, precisionPoints);\n\t\tlet i, il, face;\n\t\tlet indices, j, jl;\n\n\t\tfor (i = 0, il = this.vertices.length; i < il; i++) {\n\t\t\tv = this.vertices[i];\n\t\t\tkey = Math.round(v.x * precision) + '_' + Math.round(v.y * precision) + '_' + Math.round(v.z * precision);\n\n\t\t\tif (verticesMap[key] === undefined) {\n\t\t\t\tverticesMap[key] = i;\n\t\t\t\tunique.push(this.vertices[i]);\n\t\t\t\tchanges[i] = unique.length - 1;\n\t\t\t} else {\n\t\t\t\t// console.log('Duplicate vertex found. ', i, ' could be using ', verticesMap[key]);\n\t\t\t\tchanges[i] = changes[verticesMap[key]];\n\t\t\t}\n\t\t}\n\n\n\t\t// if faces are completely degenerate after merging vertices, we\n\t\t// have to remove them from the geometry.\n\t\tconst faceIndicesToRemove = [];\n\n\t\tfor (i = 0, il = this.faces.length; i < il; i++) {\n\t\t\tface = this.faces[i];\n\n\t\t\tface.a = changes[face.a];\n\t\t\tface.b = changes[face.b];\n\t\t\tface.c = changes[face.c];\n\n\t\t\tindices = [face.a, face.b, face.c];\n\n\t\t\t// if any duplicate vertices are found in a Face3\n\t\t\t// we have to remove the face as nothing can be saved\n\t\t\tfor (let n = 0; n < 3; n++) {\n\t\t\t\tif (indices[n] === indices[(n + 1) % 3]) {\n\t\t\t\t\tfaceIndicesToRemove.push(i);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfor (i = faceIndicesToRemove.length - 1; i >= 0; i--) {\n\t\t\tconst idx = faceIndicesToRemove[i];\n\n\t\t\tthis.faces.splice(idx, 1);\n\n\t\t\tfor (j = 0, jl = this.faceVertexUvs.length; j < jl; j++) {\n\t\t\t\tthis.faceVertexUvs[j].splice(idx, 1);\n\t\t\t}\n\t\t}\n\n\t\t// Use unique set of vertices\n\n\t\tconst diff = this.vertices.length - unique.length;\n\t\tthis.vertices = unique;\n\t\treturn diff;\n\t}\n\n\tcreateGeometry() {\n\t\tconst geometry = new Geometry();\n\t\tconst verticesArray = [];\n\n\t\tfunction pushFaceData(posArray, normalArray, colorArray, uvArray) {\n\t\t\tfor (let i = 0; i < 3; i++) {\n\t\t\t\tverticesArray.push(posArray[i].x, posArray[i].y, posArray[i].z);\n\t\t\t\tverticesArray.push(normalArray[i].x, normalArray[i].y, normalArray[i].z);\n\t\t\t\tverticesArray.push(colorArray[i].r, colorArray[i].g, colorArray[i].b, 1);\n\t\t\t\tif (uvArray) {\n\t\t\t\t\tverticesArray.push(uvArray[i].x, uvArray[i].y);\n\t\t\t\t} else {\n\t\t\t\t\tverticesArray.push(0, 0);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst faces = this.faces;\n\t\tconst vertices = this.vertices;\n\t\tconst faceVertexUvs = this.faceVertexUvs;\n\n\t\tconst hasFaceVertexUv = faceVertexUvs[0] && faceVertexUvs[0].length > 0;\n\n\t\tfor (let i = 0; i < faces.length; i++) {\n\t\t\tconst face = faces[i];\n\t\t\tconst normal = face.normal;\n\t\t\tconst color = face.color;\n\n\t\t\tconst posArray = [vertices[face.a], vertices[face.b], vertices[face.c]];\n\t\t\tconst normalArray = [normal, normal, normal];\n\t\t\tconst colorArray = [color, color, color];\n\n\t\t\tlet uvArray;\n\n\t\t\tif (hasFaceVertexUv === true) {\n\t\t\t\tconst vertexUvs = faceVertexUvs[0][i];\n\n\t\t\t\tif (vertexUvs !== undefined) {\n\t\t\t\t\tuvArray = [vertexUvs[0], vertexUvs[1], vertexUvs[2]];\n\t\t\t\t} else {\n\t\t\t\t\tconsole.warn('createGeometry(): Undefined vertexUv ', i);\n\n\t\t\t\t\tuvArray = [new Vector2(), new Vector2(), new Vector2()];\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tpushFaceData(posArray, normalArray, colorArray, uvArray);\n\t\t}\n\n\t\tconst buffer = new Buffer(new Float32Array(verticesArray), 12);\n\t\tlet attribute;\n\t\tattribute = new Attribute(buffer, 3, 0);\n\t\tgeometry.addAttribute('a_Position', attribute);\n\t\tattribute = new Attribute(buffer, 3, 3);\n\t\tgeometry.addAttribute('a_Normal', attribute);\n\t\tattribute = new Attribute(buffer, 4, 6);\n\t\tgeometry.addAttribute('a_Color', attribute);\n\t\tattribute = new Attribute(buffer, 2, 10);\n\t\tgeometry.addAttribute('a_Uv', attribute);\n\n\t\tgeometry.computeBoundingBox();\n\t\tgeometry.computeBoundingSphere();\n\n\t\treturn geometry;\n\t}\n\n}\n\nexport { VOXMeshBuilder };"
  },
  {
    "path": "examples/jsm/WaterSimulation.js",
    "content": "import { OffscreenRenderTarget, ShaderPostPass, PIXEL_TYPE, TEXTURE_FILTER } from 't3d';\n\n// refer: madebyevan.com/webgl-water\nclass WaterSimulation {\n\n\tconstructor(width = 256, height = 256) {\n\t\tconst rt1 = OffscreenRenderTarget.create2D(width, height);\n\t\trt1.texture.type = PIXEL_TYPE.HALF_FLOAT;\n\t\trt1.texture.minFilter = rt1.texture.magFilter = TEXTURE_FILTER.LINEAR;\n\t\trt1.texture.generateMipmaps = false;\n\t\trt1.setClear(false, false, false);\n\n\t\tconst rt2 = OffscreenRenderTarget.create2D(width, height);\n\t\trt2.texture.type = PIXEL_TYPE.HALF_FLOAT;\n\t\trt2.texture.minFilter = rt2.texture.magFilter = TEXTURE_FILTER.LINEAR;\n\t\trt2.texture.generateMipmaps = false;\n\t\trt2.setClear(false, false, false);\n\n\t\tthis._currentRTT = rt1;\n\t\tthis._nextRTT = rt2;\n\n\t\tthis._dropPass = new ShaderPostPass(dropShader);\n\t\tthis._normalPass = new ShaderPostPass(normalShader);\n\t\tthis._updatePass = new ShaderPostPass(updateShader);\n\t}\n\n\t_swapRTT() {\n\t\tconst temp = this._currentRTT;\n\t\tthis._currentRTT = this._nextRTT;\n\t\tthis._nextRTT = temp;\n\t}\n\n\taddDrop(renderer, x, y, radius, strength) {\n\t\tthis._dropPass.uniforms.center[0] = x;\n\t\tthis._dropPass.uniforms.center[1] = y;\n\t\tthis._dropPass.uniforms.radius = radius;\n\t\tthis._dropPass.uniforms.strength = strength;\n\n\t\tthis._dropPass.uniforms.dropTexture = this._currentRTT.texture;\n\n\t\tthis._dropPass.render(renderer, this._nextRTT);\n\t\tthis._swapRTT();\n\t}\n\n\tupdateNormals(renderer) {\n\t\tthis._normalPass.uniforms.normalTexture = this._currentRTT.texture;\n\t\tthis._normalPass.uniforms.delta[0] = 1 / this._currentRTT.width;\n\t\tthis._normalPass.uniforms.delta[1] = 1 / this._currentRTT.height;\n\n\t\tthis._normalPass.render(renderer, this._nextRTT);\n\t\tthis._swapRTT();\n\t}\n\n\tstepSimulation(renderer) {\n\t\tthis._updatePass.uniforms.flow = this._currentRTT.texture;\n\t\tthis._updatePass.uniforms.delta[0] = 1 / this._currentRTT.width;\n\t\tthis._updatePass.uniforms.delta[1] = 1 / this._currentRTT.height;\n\n\t\tthis._updatePass.render(renderer, this._nextRTT);\n\t\tthis._swapRTT();\n\t}\n\n}\n\nconst default_vert = `\n\tattribute vec3 a_Position;\n\tattribute vec2 a_Uv;\n\n\tuniform mat4 u_View;\n\tuniform mat4 u_Model;\n\tuniform mat4 u_Projection;\n\n\tvarying vec2 v_Uv;\n\n\tvoid main() {\n\t\tv_Uv = a_Uv;\n\t\tgl_Position = u_Projection * u_View *u_Model * vec4(a_Position, 1.0);\n\t}\n`;\n\nconst dropShader = {\n\tname: 'water_simu_drop',\n\tdefines: {},\n\tuniforms: {\n\t\tcenter: [0, 0],\n\t\tradius: 0,\n\t\tstrength: 0,\n\t\tdropTexture: null\n\t},\n\tvertexShader: default_vert,\n\tfragmentShader: `\n\t\tuniform sampler2D dropTexture;\n\t\tuniform vec2 center;\n\t\tuniform float radius;\n\t\tuniform float strength;\n\t\tvarying vec2 v_Uv;\n\n\t\tvoid main() {\n\t\t\tvec4 info = texture2D(dropTexture, v_Uv);\n\n\t\t\tfloat drop = max(0.0, 1.0 - length(center - v_Uv) / radius);\n\t\t\tdrop = 0.5 - cos(drop * PI) * 0.5;\n\t\t\tinfo.r += drop * strength;\n\n\t\t\tgl_FragColor = info;\n\t\t}\n\t`\n};\n\nconst normalShader = {\n\tname: 'water_simu_normal',\n\tdefines: {},\n\tuniforms: {\n\t\tdelta: [1 / 256, 1 / 256],\n\t\tnormalTexture: null\n\t},\n\tvertexShader: default_vert,\n\tfragmentShader: `\n\t\tuniform sampler2D normalTexture;\n\t\tuniform vec2 delta;\n\t\tvarying vec2 v_Uv;\n\n\t\tvoid main() {\n\t\t\tvec4 info = texture2D(normalTexture, v_Uv);\n\n\t\t\tvec3 dx = vec3(delta.x, texture2D(normalTexture, vec2(v_Uv.x + delta.x, v_Uv.y)).r - info.r, 0.0);\n\t\t\tvec3 dy = vec3(0.0, texture2D(normalTexture, vec2(v_Uv.x, v_Uv.y + delta.y)).r - info.r, delta.y);\n\n\t\t\tinfo.ba = normalize(cross(dx, dy)).xz;\n\n\t\t\tgl_FragColor = info;\n\t\t}\n\t`\n};\n\nconst updateShader = {\n\tname: 'water_simu_update',\n\tdefines: {},\n\tuniforms: {\n\t\tdelta: [1 / 256, 1 / 256],\n\t\tflow: null\n\t},\n\tvertexShader: default_vert,\n\tfragmentShader: `\n\t\tuniform sampler2D flow;\n\t\tuniform vec2 delta;\n\n\t\tvarying vec2 v_Uv;\n\n\t\tvoid main() {\n\t\t\tvec4 info = texture2D(flow, v_Uv);\n\t\t\tvec2 dx = vec2(delta.x, 0.0);\n\t\t\tvec2 dy = vec2(0.0, delta.y);\n\n\t\t\tfloat average = (\n\t\t\t\ttexture2D(flow, v_Uv - dx).r +\n\t\t\t\ttexture2D(flow, v_Uv - dy).r +\n\t\t\t\ttexture2D(flow, v_Uv + dx).r +\n\t\t\t\ttexture2D(flow, v_Uv + dy).r\n\t\t\t) * 0.25;\n\n\t\t\tinfo.g += (average - info.r) * 2.0;\n\n\t\t\tinfo.g *= 0.985; // 995\n\n\t\t\tinfo.r += info.g;\n\n\t\t\tgl_FragColor = info;\n\t\t}\n\t`\n};\n\nexport { WaterSimulation };"
  },
  {
    "path": "examples/jsm/WorkerPool.js",
    "content": "/**\n * @author Deepkolos / https://github.com/deepkolos\n */\n\nexport class WorkerPool {\n\n\tconstructor(pool = 4) {\n\t\tthis.pool = pool;\n\t\tthis.queue = [];\n\t\tthis.workers = [];\n\t\tthis.workersResolve = [];\n\t\tthis.workerStatus = 0;\n\t}\n\n\t_initWorker(workerId) {\n\t\tif (!this.workers[workerId]) {\n\t\t\tconst worker = this.workerCreator();\n\t\t\tworker.addEventListener('message', this._onMessage.bind(this, workerId));\n\t\t\tthis.workers[workerId] = worker;\n\t\t}\n\t}\n\n\t_getIdleWorker() {\n\t\tfor (let i = 0; i < this.pool; i++) { if (!(this.workerStatus & (1 << i))) return i; }\n\n\t\treturn -1;\n\t}\n\n\t_onMessage(workerId, msg) {\n\t\tconst resolve = this.workersResolve[workerId];\n\t\tresolve && resolve(msg);\n\n\t\tif (this.queue.length) {\n\t\t\tconst { resolve, msg, transfer } = this.queue.shift();\n\t\t\tthis.workersResolve[workerId] = resolve;\n\t\t\tthis.workers[workerId].postMessage(msg, transfer);\n\t\t} else {\n\t\t\tthis.workerStatus ^= 1 << workerId;\n\t\t}\n\t}\n\n\tsetWorkerCreator(workerCreator) {\n\t\tthis.workerCreator = workerCreator;\n\t}\n\n\tsetWorkerLimit(pool) {\n\t\tthis.pool = pool;\n\t}\n\n\tpostMessage(msg, transfer) {\n\t\treturn new Promise(resolve => {\n\t\t\tconst workerId = this._getIdleWorker();\n\n\t\t\tif (workerId !== -1) {\n\t\t\t\tthis._initWorker(workerId);\n\t\t\t\tthis.workerStatus |= 1 << workerId;\n\t\t\t\tthis.workersResolve[workerId] = resolve;\n\t\t\t\tthis.workers[workerId].postMessage(msg, transfer);\n\t\t\t} else {\n\t\t\t\tthis.queue.push({ resolve, msg, transfer });\n\t\t\t}\n\t\t});\n\t}\n\n\tdispose() {\n\t\tthis.workers.forEach(worker => worker.terminate());\n\t\tthis.workersResolve.length = 0;\n\t\tthis.workers.length = 0;\n\t\tthis.queue.length = 0;\n\t\tthis.workerStatus = 0;\n\t}\n\n}\n"
  },
  {
    "path": "examples/jsm/animation/CCDIKSolver.js",
    "content": "import {\n\tQuaternion,\n\tVector3\n} from 't3d';\n\n// CCD Algorithm\n// - https://sites.google.com/site/auraliusproject/ccd-algorithm\n//\n// ik parameter example\n//\n// target, effector, index in links are bone index in skeleton.bones.\n// the bones relation should be\n// <-- parent                                  child -->\n// links[ n ], links[ n - 1 ], ..., links[ 0 ], effector\n// iks = [ {\n//\ttarget: 1,\n//\teffector: 2,\n//\tlinks: [ { index: 5, limitation: new Vector3( 1, 0, 0 ) }, { index: 4, enabled: false }, { index : 3 } ],\n//\titeration: 10,\n//\tminAngle: 0.0,\n//\tmaxAngle: 1.0,\n// } ];\nclass CCDIKSolver {\n\n\t/**\n\t * @param {Bone[]} bones\n\t * @param {object[]} iks\n\t */\n\tconstructor(bones, iks = []) {\n\t\tthis.bones = bones;\n\t\tthis.iks = iks;\n\n\t\tthis.target = new Vector3();\n\n\t\tthis._valid();\n\t}\n\n\t/**\n\t * Update all IK bones.\n\t * @returns {CCDIKSolver}\n\t */\n\tupdate() {\n\t\tconst iks = this.iks;\n\n\t\tfor (let i = 0, il = iks.length; i < il; i++) {\n\t\t\tthis.updateOne(iks[i]);\n\t\t}\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Update one IK bone\n\t * @param {object} ik parameter\n\t * @returns {CCDIKSolver}\n\t */\n\tupdateOne(ik) {\n\t\tconst bones = this.bones;\n\n\t\t// for reference overhead reduction in loop\n\t\tconst math = Math;\n\n\t\tconst effector = bones[ik.effector];\n\n\t\tconst links = ik.links;\n\t\tconst iteration = ik.iteration !== undefined ? ik.iteration : 1;\n\n\t\tfor (let i = 0; i < iteration; i++) {\n\t\t\tlet rotated = false;\n\n\t\t\tfor (let j = 0, jl = links.length; j < jl; j++) {\n\t\t\t\tconst link = bones[links[j].index];\n\n\t\t\t\t// skip this link and following links.\n\t\t\t\t// this skip is used for MMD performance optimization.\n\t\t\t\tif (links[j].enabled === false) break;\n\n\t\t\t\tconst limitation = links[j].limitation;\n\t\t\t\tconst rotationMin = links[j].rotationMin;\n\t\t\t\tconst rotationMax = links[j].rotationMax;\n\n\t\t\t\t// don't use getWorldPosition/Quaternion() here for the performance\n\t\t\t\t// because they call updateMatrixWorld( true ) inside.\n\t\t\t\tlink.worldMatrix.decompose(_linkPos, _invLinkQ, _linkScale);\n\t\t\t\t_invLinkQ.conjugate();\n\t\t\t\t_effectorPos.setFromMatrixPosition(effector.worldMatrix);\n\n\t\t\t\t// work in link world\n\t\t\t\t_effectorVec.subVectors(_effectorPos, _linkPos);\n\t\t\t\t_effectorVec.applyQuaternion(_invLinkQ);\n\t\t\t\t_effectorVec.normalize();\n\n\t\t\t\t_targetVec.subVectors(this.target, _linkPos);\n\t\t\t\t_targetVec.applyQuaternion(_invLinkQ);\n\t\t\t\t_targetVec.normalize();\n\n\t\t\t\tlet angle = _targetVec.dot(_effectorVec);\n\n\t\t\t\tif (angle > 1.0) {\n\t\t\t\t\tangle = 1.0;\n\t\t\t\t} else if (angle < -1.0) {\n\t\t\t\t\tangle = -1.0;\n\t\t\t\t}\n\n\t\t\t\tangle = math.acos(angle);\n\n\t\t\t\t// skip if changing angle is too small to prevent vibration of bone\n\t\t\t\tif (angle < 1e-5) continue;\n\n\t\t\t\tif (ik.minAngle !== undefined && angle < ik.minAngle) {\n\t\t\t\t\tangle = ik.minAngle;\n\t\t\t\t}\n\n\t\t\t\tif (ik.maxAngle !== undefined && angle > ik.maxAngle) {\n\t\t\t\t\tangle = ik.maxAngle;\n\t\t\t\t}\n\n\t\t\t\t_axis.crossVectors(_effectorVec, _targetVec);\n\t\t\t\t_axis.normalize();\n\n\t\t\t\t_q.setFromAxisAngle(_axis, angle);\n\t\t\t\tlink.quaternion.multiply(_q);\n\n\t\t\t\t// TODO: re-consider the limitation specification\n\t\t\t\tif (limitation !== undefined) {\n\t\t\t\t\tlet c = link.quaternion.w;\n\n\t\t\t\t\tif (c > 1.0) {\n\t\t\t\t\t\tc = 1.0;\n\t\t\t\t\t}\n\n\t\t\t\t\tconst c2 = math.sqrt(1 - c * c);\n\t\t\t\t\tlink.quaternion.set(limitation.x * c2, limitation.y * c2, limitation.z * c2, c);\n\t\t\t\t}\n\n\t\t\t\tif (rotationMin !== undefined) {\n\t\t\t\t\t_vector.set(link.euler.x, link.euler.y, link.euler.z).max(rotationMin);\n\t\t\t\t\tlink.euler.set(_vector.x, _vector.y, _vector.z);\n\t\t\t\t}\n\n\t\t\t\tif (rotationMax !== undefined) {\n\t\t\t\t\t_vector.set(link.euler.x, link.euler.y, link.euler.z).min(rotationMax);\n\t\t\t\t\tlink.euler.set(_vector.x, _vector.y, _vector.z);\n\t\t\t\t}\n\n\t\t\t\tlink.updateMatrix(true);\n\n\t\t\t\trotated = true;\n\t\t\t}\n\t\t\tif (!rotated) break;\n\t\t}\n\n\t\treturn this;\n\t}\n\n\t// private methods\n\n\t_valid() {\n\t\tconst bones = this.bones;\n\t\tconst iks = this.iks;\n\n\t\tfor (let i = 0, il = iks.length; i < il; i++) {\n\t\t\tconst ik = iks[i];\n\t\t\tconst effector = bones[ik.effector];\n\t\t\tconst links = ik.links;\n\t\t\tlet link0, link1;\n\n\t\t\tlink0 = effector;\n\n\t\t\tfor (let j = 0, jl = links.length; j < jl; j++) {\n\t\t\t\tlink1 = bones[links[j].index];\n\n\t\t\t\tif (link0.parent !== link1) {\n\t\t\t\t\tconsole.warn('CCDIKSolver: bone ' + link0.name + ' is not the child of bone ' + link1.name);\n\t\t\t\t}\n\n\t\t\t\tlink0 = link1;\n\t\t\t}\n\t\t}\n\t}\n\n}\n\nconst _q = new Quaternion();\nconst _targetVec = new Vector3();\nconst _effectorPos = new Vector3();\nconst _effectorVec = new Vector3();\nconst _linkPos = new Vector3();\nconst _invLinkQ = new Quaternion();\nconst _linkScale = new Vector3();\nconst _axis = new Vector3();\nconst _vector = new Vector3();\n\nexport { CCDIKSolver };"
  },
  {
    "path": "examples/jsm/animation/LockedTrack.js",
    "content": "import { Matrix4, Quaternion, Vector3 } from 't3d';\n\n/**\n * LockedTrack class allows an object to track a target position\n * while keeping a specified axis locked in a certain direction.\n */\nclass LockedTrack {\n\n\t/**\n\t * Creates an instance of LockedTrack.\n\t * @param {Object3D} object - The object to be tracked.\n\t */\n\tconstructor(object) {\n\t\t/**\n\t\t * The object to track.\n\t\t * @type {Object3D}\n\t\t */\n\t\tthis.object = object;\n\n\t\t/**\n\t\t * Target position to track.\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.target = new Vector3();\n\n\t\t/**\n\t\t * Axis that points to the target.\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.trackAxis = new Vector3(0, 0, 1);\n\n\t\t/**\n\t\t * Axis that points upward.\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.lockedAxis = new Vector3(0, 1, 0);\n\t}\n\n\t/**\n\t * Update the object's rotation to track the target position.\n\t */\n\tupdate() {\n\t\tconst object = this.object;\n\t\tconst target = this.target;\n\n\t\t_inverseMatrix.copy(object.worldMatrix).invert().premultiply(object.matrix);\n\n\t\t_localTarget.copy(target).applyMatrix4(_inverseMatrix);\n\t\t_localDirection.copy(_localTarget).normalize();\n\n\t\t_z_axis.set(0, 0, 1);\n\t\t_correctionQuat.setFromUnitVectors(_z_axis, this.trackAxis);\n\n\t\t_forward.copy(_localDirection).applyQuaternion(_correctionQuat.conjugate());\n\t\t_up.copy(this.lockedAxis);\n\t\t_side.crossVectors(_up, _forward).normalize();\n\n\t\tif (_side.getLengthSquared() < 0.0001) {\n\t\t\t_side.crossVectors(this.trackAxis, _forward).normalize();\n\t\t}\n\n\t\t_forward.crossVectors(_side, _up).normalize();\n\n\t\t_lookAtMatrix.makeBasis(_side, _up, _forward);\n\t\tobject.quaternion.setFromRotationMatrix(_lookAtMatrix);\n\n\t\tobject.updateMatrix(true);\n\t}\n\n}\n\nconst _inverseMatrix = new Matrix4();\n\nconst _localTarget = new Vector3();\nconst _localDirection = new Vector3();\n\nconst _correctionQuat = new Quaternion();\nconst _z_axis = new Vector3(0, 0, 1);\n\nconst _forward = new Vector3();\nconst _up = new Vector3();\nconst _side = new Vector3();\n\nconst _lookAtMatrix = new Matrix4();\n\nexport { LockedTrack };"
  },
  {
    "path": "examples/jsm/canvas2d/Canvas2D.js",
    "content": "import {\n\tAttribute,\n\tBUFFER_USAGE,\n\tBuffer,\n\tCamera,\n\tGeometry,\n\tMesh,\n\tShaderMaterial,\n\tVector2,\n\tVector4\n} from 't3d';\n\nclass Canvas2D extends Mesh {\n\n\tconstructor(width = 640, height = 800, isScreenCanvas = true, screenMatchMode = SCREEN_MATCH_MODE.CONSTANT) {\n\t\tconst geometry = new Geometry();\n\t\tconst buffer = new Buffer(new Float32Array(), 5);\n\t\tbuffer.usage = BUFFER_USAGE.DYNAMIC_DRAW;\n\t\tgeometry.addAttribute('a_Position', new Attribute(buffer, 3, 0));\n\t\tgeometry.addAttribute('a_Uv', new Attribute(buffer, 2, 3));\n\t\tgeometry.setIndex(new Attribute(new Buffer(new Uint16Array([]), 1)));\n\n\t\tsuper(geometry, []);\n\n\t\tthis.buffer = buffer;\n\n\t\tconst sharedMaterial = new ShaderMaterial(canvas2dShader);\n\t\tsharedMaterial.depthWrite = false;\n\t\tsharedMaterial.transparent = true;\n\n\t\tthis.sharedMaterial = sharedMaterial;\n\n\t\tthis.sprites = [];\n\t\tthis.materialInfoArray = [];\n\n\t\t// screen space canvas or world space canvas\n\t\tthis.isScreenCanvas = isScreenCanvas;\n\n\t\t// the size in world space\n\t\tthis._size = new Vector2(width, height);\n\n\t\t// the resolution size of screen canvas\n\t\tthis._resolutionSize = new Vector2(width, height);\n\t\t// screen match mode\n\t\tthis._screenMatchMode = screenMatchMode;\n\t\t// set the same size with the renderer viewport\n\t\tthis._renderViewport = new Vector4(0, 0, width, height);\n\t\t// if screen match mode is SCREEN_MATCH_MODE.CONSTANT, use this\n\t\tthis._scaleFactor = 1;\n\n\t\t// real viewport after calculate with screen match mode\n\t\tthis.viewport = new Vector4();\n\n\t\t// screen canvas used ortho camera\n\t\tthis.orthoCamera = new Camera();\n\t\tthis.orthoCamera.setOrtho(-width / 2, width / 2, -height / 2, height / 2, 0, 1);\n\t\tthis.orthoCamera.viewMatrix.copy(this.orthoCamera.worldMatrix).invert(); // update view matrix\n\n\t\tthis._vertices = [];\n\t\tthis._indices = [];\n\n\t\tthis._2dChildren = [];\n\n\t\tthis.frustumCulled = false;\n\n\t\t// higher render order than other\n\t\tthis.renderOrder = 10000;\n\t}\n\n\tsetSize(width, height) {\n\t\tif (this.isScreenCanvas) {\n\t\t\tthis._resolutionSize.set(width, height);\n\t\t\tthis._screenMatchMode.call(this);\n\t\t\tthis._updateCamera();\n\t\t} else {\n\t\t\tthis._size.set(width, height);\n\t\t}\n\t}\n\n\tsetRenderViewport(x, y, w, h) {\n\t\tif (this._renderViewport.x !== x ||\n\t\t\tthis._renderViewport.y !== y ||\n\t\t\tthis._renderViewport.z !== w ||\n\t\t\tthis._renderViewport.w !== h) {\n\t\t\tthis._renderViewport.set(x, y, w, h);\n\t\t\tthis._screenMatchMode.call(this);\n\t\t\tthis._updateCamera();\n\t\t}\n\t}\n\n\tsetScaleFactor(value) {\n\t\tif (this._scaleFactor !== value) {\n\t\t\tthis._scaleFactor = value;\n\t\t\tthis._screenMatchMode.call(this);\n\t\t\tthis._updateCamera();\n\t\t}\n\t}\n\n\tsetScreenMatchMode(mode) {\n\t\tif (this._screenMatchMode !== mode) {\n\t\t\tthis._screenMatchMode = mode;\n\t\t\tthis._screenMatchMode.call(this);\n\t\t\tthis._updateCamera();\n\t\t}\n\t}\n\n\t_updateCamera() {\n\t\tif (this.isScreenCanvas) {\n\t\t\tthis.orthoCamera.setOrtho(-this._resolutionSize.x / 2, this._resolutionSize.x / 2, -this._resolutionSize.y / 2, this._resolutionSize.y / 2, 0, 1);\n\t\t\tthis.orthoCamera.viewMatrix.copy(this.orthoCamera.worldMatrix).invert(); // update view matrix\n\t\t}\n\t}\n\n\t/**\n\t * add child to canvas2d\n\t * @param {Object2D} object\n\t */\n\tadd(object) {\n\t\tthis._2dChildren.push(object);\n\t}\n\n\t/**\n\t * remove child from canvas2d\n\t * @param {Object2D} object\n\t */\n\tremove(object) {\n\t\tconst index = this._2dChildren.indexOf(object);\n\t\tif (index !== -1) {\n\t\t\tthis._2dChildren.splice(index, 1);\n\t\t}\n\t}\n\n\tupdateSprites() {\n\t\t// update attributes and indices\n\n\t\tconst vertices = this._vertices,\n\t\t\tindices = this._indices;\n\n\t\tlet vertexIndex = 0,\n\t\t\tindexIndex = 0;\n\n\t\tconst sprites = this.sprites;\n\n\t\tconst width = this.isScreenCanvas ? this._resolutionSize.x : this._size.x;\n\t\tconst height = this.isScreenCanvas ? this._resolutionSize.y : this._size.y;\n\n\t\tfor (let i = 0; i < sprites.length; i++) {\n\t\t\tconst sprite = sprites[i];\n\n\t\t\tconst x = 0;\n\t\t\tconst y = 0;\n\t\t\tconst w = sprite.width;\n\t\t\tconst h = sprite.height;\n\n\t\t\tlet _x, _y;\n\t\t\tconst t = sprite.worldMatrix.elements;\n\t\t\tconst a = t[0],\n\t\t\t\tb = t[1],\n\t\t\t\tc = t[3],\n\t\t\t\td = t[4],\n\t\t\t\ttx = t[6] - width / 2,\n\t\t\t\tty = height / 2 - t[7] - h;\n\n\t\t\t_x = x;\n\t\t\t_y = y;\n\t\t\tvertices[vertexIndex++] = a * _x + c * _y + tx;\n\t\t\tvertices[vertexIndex++] = b * _x + d * _y + ty;\n\t\t\tvertices[vertexIndex++] = 0;\n\t\t\tvertices[vertexIndex++] = 0;\n\t\t\tvertices[vertexIndex++] = 1;\n\n\t\t\t_x = x + w;\n\t\t\t// _y = y;\n\t\t\tvertices[vertexIndex++] = a * _x + c * _y + tx;\n\t\t\tvertices[vertexIndex++] = b * _x + d * _y + ty;\n\t\t\tvertices[vertexIndex++] = 0;\n\t\t\tvertices[vertexIndex++] = 1;\n\t\t\tvertices[vertexIndex++] = 1;\n\n\t\t\t// _x = x + w;\n\t\t\t_y = y + h;\n\t\t\tvertices[vertexIndex++] = a * _x + c * _y + tx;\n\t\t\tvertices[vertexIndex++] = b * _x + d * _y + ty;\n\t\t\tvertices[vertexIndex++] = 0;\n\t\t\tvertices[vertexIndex++] = 1;\n\t\t\tvertices[vertexIndex++] = 0;\n\n\t\t\t_x = x;\n\t\t\t// _y = y + h;\n\t\t\tvertices[vertexIndex++] = a * _x + c * _y + tx;\n\t\t\tvertices[vertexIndex++] = b * _x + d * _y + ty;\n\t\t\tvertices[vertexIndex++] = 0;\n\t\t\tvertices[vertexIndex++] = 0;\n\t\t\tvertices[vertexIndex++] = 0;\n\n\t\t\tconst vertCount = vertexIndex / 5 - 4;\n\n\t\t\tindices[indexIndex++] = vertCount + 0;\n\t\t\tindices[indexIndex++] = vertCount + 1;\n\t\t\tindices[indexIndex++] = vertCount + 2;\n\t\t\tindices[indexIndex++] = vertCount + 2;\n\t\t\tindices[indexIndex++] = vertCount + 3;\n\t\t\tindices[indexIndex++] = vertCount + 0;\n\t\t}\n\n\t\tvertices.length = vertexIndex;\n\t\tindices.length = indexIndex;\n\n\t\tconst geometry = this.geometry;\n\n\t\tthis.buffer.array = new Float32Array(vertices);\n\t\tthis.buffer.count = this.buffer.array.length / this.buffer.stride;\n\t\tgeometry.index.buffer.array = new Uint16Array(indices);\n\t\tgeometry.index.buffer.count = geometry.index.buffer.array.length;\n\n\t\tthis.buffer.version++;\n\t\tgeometry.index.version++;\n\n\t\t// push groups\n\n\t\tlet currentTexture, currentCount = 0, currentOffset = 0;\n\t\tfor (let i = 0; i < sprites.length; i++) {\n\t\t\tconst sprite = sprites[i];\n\t\t\tif (currentTexture !== sprite.texture) {\n\t\t\t\tif (geometry.groups[currentCount]) {\n\t\t\t\t\tgeometry.groups.start = currentOffset;\n\t\t\t\t\tgeometry.groups.count = 6;\n\t\t\t\t\tgeometry.groups.materialIndex = currentCount;\n\t\t\t\t} else {\n\t\t\t\t\tgeometry.groups.push({\n\t\t\t\t\t\tstart: currentOffset,\n\t\t\t\t\t\tcount: 6,\n\t\t\t\t\t\tmaterialIndex: currentCount\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tthis.material[currentCount] = this.sharedMaterial;\n\n\t\t\t\tthis.materialInfoArray[currentCount] = sprite.texture;\n\n\t\t\t\tcurrentCount++;\n\t\t\t\tcurrentOffset += 6;\n\t\t\t\tcurrentTexture = sprite.texture;\n\t\t\t} else {\n\t\t\t\tgeometry.groups[currentCount - 1].count += 6;\n\t\t\t}\n\t\t}\n\n\t\tgeometry.groups.length = currentCount;\n\t\tthis.materialInfoArray.length = currentCount;\n\t}\n\n\t// override\n\tupdateMatrix(force) {\n\t\tMesh.prototype.updateMatrix.call(this, force);\n\n\t\tthis.sprites = [];\n\n\t\tconst children = this._2dChildren;\n\t\tfor (let i = 0, l = children.length; i < l; i++) {\n\t\t\tthis.cacheSprites(children[i]);\n\t\t}\n\n\t\tconst sprites = this.sprites;\n\t\tfor (let i = 0, l = sprites.length; i < l; i++) {\n\t\t\tsprites[i].updateMatrix();\n\t\t}\n\n\t\t// update geometry\n\t\tthis.updateSprites();\n\t}\n\n\tcacheSprites(object) {\n\t\tconst sprites = this.sprites;\n\n\t\tsprites.push(object);\n\n\t\tfor (let i = 0, l = object.children.length; i < l; i++) {\n\t\t\tthis.cacheSprites(object.children[i]);\n\t\t}\n\t}\n\n}\n\nconst canvas2dShader = {\n\n\tname: 'canvas2d_common',\n\n\tuniforms: {\n\t\t'spriteTexture': null\n\t},\n\n\tvertexShader: `\n\t\t#include <common_vert>\n\t\tattribute vec2 a_Uv;\n\t\tvarying vec2 v_Uv;\n\t\tvoid main() {\n\t\t\t#include <begin_vert>\n\t\t\t#include <pvm_vert>\n\t\t\tv_Uv = a_Uv;\n\t\t}\n\t`,\n\n\tfragmentShader: `\n\t\t#include <common_frag>\n\t\tvarying vec2 v_Uv;\n\t\tuniform sampler2D spriteTexture;\n\t\tvoid main() {\n\t\t\t#include <begin_frag>\n\t\t\toutColor *= texture2D(spriteTexture, v_Uv);\n\t\t\t#include <end_frag>\n\t\t\t#include <premultipliedAlpha_frag>\n\t\t}\n\t`\n\n};\n\nfunction constant() {\n\tconst renderViewport = this._renderViewport;\n\tconst curViewX = renderViewport.x;\n\tconst curViewY = renderViewport.y;\n\tconst curViewW = renderViewport.z;\n\tconst curViewH = renderViewport.w;\n\n\tconst scaleFactor = this._scaleFactor;\n\n\tconst resultX = curViewX;\n\tconst resultY = curViewY;\n\tconst resultW = curViewW;\n\tconst resultH = curViewH;\n\n\tthis._resolutionSize.set(resultW / scaleFactor, resultH / scaleFactor);\n\n\tthis.viewport.set(resultX, resultY, resultW, resultH);\n}\n\nfunction shrink() {\n\tconst renderViewport = this._renderViewport;\n\tconst curViewX = renderViewport.x;\n\tconst curViewY = renderViewport.y;\n\tconst curViewW = renderViewport.z;\n\tconst curViewH = renderViewport.w;\n\n\tconst resolutionSize = this._resolutionSize.copy(this._size);\n\n\tconst screenRate = (curViewW - curViewX) / (curViewH - curViewY);\n\tconst resolutionRate = resolutionSize.x / resolutionSize.y;\n\tconst widthBigger = resolutionRate > screenRate;\n\n\tlet resultW, resultH;\n\tif (widthBigger) {\n\t\tresultW = curViewW;\n\t\tresultH = Math.floor(resultW / resolutionRate);\n\t} else {\n\t\tresultH = curViewH;\n\t\tresultW = Math.floor(resultH * resolutionRate);\n\t}\n\tconst resultX = Math.floor((curViewW - resultW) / 2) + curViewX;\n\tconst resultY = Math.floor((curViewH - resultH) / 2) + curViewY;\n\n\tthis.viewport.set(resultX, resultY, resultW, resultH);\n}\n\nfunction expand() {\n\tconst renderViewport = this._renderViewport;\n\tconst curViewX = renderViewport.x;\n\tconst curViewY = renderViewport.y;\n\tconst curViewW = renderViewport.z;\n\tconst curViewH = renderViewport.w;\n\n\tconst resolutionSize = this._resolutionSize.copy(this._size);\n\n\tconst screenRate = (curViewW - curViewX) / (curViewH - curViewY);\n\tconst resolutionRate = resolutionSize.x / resolutionSize.y;\n\tconst widthBigger = resolutionRate > screenRate;\n\n\tlet resultW, resultH;\n\tif (widthBigger) {\n\t\tresultH = curViewH;\n\t\tresultW = Math.floor(resultH * resolutionRate);\n\t} else {\n\t\tresultW = curViewW;\n\t\tresultH = Math.floor(resultW / resolutionRate);\n\t}\n\tconst resultX = Math.floor((curViewW - resultW) / 2) + curViewX;\n\tconst resultY = Math.floor((curViewH - resultH) / 2) + curViewY;\n\n\tthis.viewport.set(resultX, resultY, resultW, resultH);\n}\n\nconst SCREEN_MATCH_MODE = {\n\tCONSTANT: constant,\n\tSHRINK: shrink,\n\tEXPAND: expand\n};\n\nCanvas2D.SCREEN_MATCH_MODE = SCREEN_MATCH_MODE;\n\nexport { Canvas2D };"
  },
  {
    "path": "examples/jsm/canvas2d/Object2D.js",
    "content": "import {\n\tBox2,\n\tMatrix3\n} from 't3d';\n\nclass Object2D {\n\n\tconstructor() {\n\t\tthis.width = 0;\n\t\tthis.height = 0;\n\n\t\t// bla bla ...\n\t\tthis.x = 0;\n\t\tthis.y = 0;\n\t\tthis.rotation = 0;\n\t\tthis.scaleX = 1;\n\t\tthis.scaleY = 1;\n\t\tthis.anchorX = 0;\n\t\tthis.anchorY = 0;\n\n\t\t// a 3x3 transform matrix\n\t\tthis.matrix = new Matrix3();\n\t\t// used to cache world transform\n\t\tthis.worldMatrix = new Matrix3();\n\n\t\t// children\n\t\tthis.children = new Array();\n\t\t// parent\n\t\tthis.parent = null;\n\n\t\tthis.boundingBox = new Box2();\n\t}\n\n\t/**\n\t * add child to object2d\n\t * @param {Object2D} object\n\t */\n\tadd(object) {\n\t\tthis.children.push(object);\n\t\tobject.parent = this;\n\t}\n\n\t/**\n\t * remove child from object2d\n\t * @param {Object2D} object\n\t */\n\tremove(object) {\n\t\tconst index = this.children.indexOf(object);\n\t\tif (index !== -1) {\n\t\t\tthis.children.splice(index, 1);\n\t\t}\n\t\tobject.parent = null;\n\t}\n\n\t/**\n\t * get object by name\n\t * @param {string} name\n\t * @returns {Object2D}\n\t */\n\tgetObjectByName(name) {\n\t\treturn this.getObjectByProperty('name', name);\n\t}\n\n\t/**\n\t * get object by property\n\t * @param {string} name\n\t * @param {any} value\n\t * @returns {Object2D}\n\t */\n\tgetObjectByProperty(name, value) {\n\t\tif (this[name] === value) return this;\n\n\t\tfor (let i = 0, l = this.children.length; i < l; i++) {\n\t\t\tconst child = this.children[i];\n\t\t\tconst object = child.getObjectByProperty(name, value);\n\n\t\t\tif (object !== undefined) {\n\t\t\t\treturn object;\n\t\t\t}\n\t\t}\n\n\t\treturn undefined;\n\t}\n\n\t/**\n\t * update matrix\n\t */\n\tupdateMatrix() {\n\t\tconst matrix = this.matrix.transform(this.x, this.y, this.scaleX, this.scaleY, this.rotation, this.anchorX * this.width, this.anchorY * this.height);\n\n\t\tthis.worldMatrix.copy(matrix);\n\n\t\tif (this.parent) {\n\t\t\tconst parentMatrix = this.parent.worldMatrix;\n\t\t\tthis.worldMatrix.premultiply(parentMatrix);\n\t\t}\n\n\t\tconst children = this.children;\n\t\tfor (let i = 0, l = children.length; i < l; i++) {\n\t\t\tchildren[i].updateMatrix();\n\t\t}\n\t}\n\n\tcomputeBoundingBox() {\n\t\tthis.boundingBox.set(this.x, this.y, this.x + this.width, this.y + this.height);\n\t}\n\n}\n\nexport { Object2D };"
  },
  {
    "path": "examples/jsm/canvas2d/Sprite2D.js",
    "content": "import { Object2D } from '../canvas2d/Object2D.js';\n\nclass Sprite2D extends Object2D {\n\n\tconstructor() {\n\t\tsuper();\n\t\tthis._texture = null;\n\t}\n\n}\n\nexport { Sprite2D };"
  },
  {
    "path": "examples/jsm/controls/FlyControls.js",
    "content": "import {\n\tQuaternion,\n\tVector3\n} from 't3d';\n\n/**\n * reference: https://github.com/mrdoob/three.js/blob/dev/examples/jsm/controls/FlyControls.js\n */\nclass FlyControls {\n\n\tconstructor(object, domElement = document) {\n\t\tthis.object = object;\n\t\tthis.domElement = domElement;\n\n\t\t// API\n\n\t\tthis.enabled = true;\n\n\t\tthis.movementSpeed = 1.0;\n\t\tthis.rollSpeed = 0.005;\n\n\t\tthis.dragToLook = false;\n\t\tthis.autoForward = false;\n\n\t\t// disable default target object behavior\n\n\t\t// internals\n\n\t\tconst EPS = 0.000001;\n\t\tconst lastQuaternion = new Quaternion();\n\t\tconst lastPosition = new Vector3();\n\n\t\tthis.tmpQuaternion = new Quaternion();\n\t\tconst tempVector = new Vector3();\n\n\t\tthis.mouseStatus = 0;\n\n\t\tthis.moveState = { up: 0, down: 0, left: 0, right: 0, forward: 0, back: 0, pitchUp: 0, pitchDown: 0, yawLeft: 0, yawRight: 0, rollLeft: 0, rollRight: 0 };\n\t\tthis.moveVector = new Vector3(0, 0, 0);\n\t\tthis.rotationVector = new Vector3(0, 0, 0);\n\n\t\tthis.keydown = function(event) {\n\t\t\tif (event.altKey || this.enabled === false) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tswitch (event.code) {\n\t\t\t\tcase 'ShiftLeft':\n\t\t\t\tcase 'ShiftRight': this.movementSpeedMultiplier = .1; break;\n\n\t\t\t\tcase 'KeyW': this.moveState.forward = 1; break;\n\t\t\t\tcase 'KeyS': this.moveState.back = 1; break;\n\n\t\t\t\tcase 'KeyA': this.moveState.left = 1; break;\n\t\t\t\tcase 'KeyD': this.moveState.right = 1; break;\n\n\t\t\t\tcase 'KeyR': this.moveState.up = 1; break;\n\t\t\t\tcase 'KeyF': this.moveState.down = 1; break;\n\n\t\t\t\tcase 'ArrowUp': this.moveState.pitchUp = 1; break;\n\t\t\t\tcase 'ArrowDown': this.moveState.pitchDown = 1; break;\n\n\t\t\t\tcase 'ArrowLeft': this.moveState.yawLeft = 1; break;\n\t\t\t\tcase 'ArrowRight': this.moveState.yawRight = 1; break;\n\n\t\t\t\tcase 'KeyQ': this.moveState.rollLeft = 1; break;\n\t\t\t\tcase 'KeyE': this.moveState.rollRight = 1; break;\n\t\t\t}\n\n\t\t\tthis.updateMovementVector();\n\t\t\tthis.updateRotationVector();\n\t\t};\n\n\t\tthis.keyup = function(event) {\n\t\t\tif (this.enabled === false) return;\n\n\t\t\tswitch (event.code) {\n\t\t\t\tcase 'ShiftLeft':\n\t\t\t\tcase 'ShiftRight': this.movementSpeedMultiplier = 1; break;\n\n\t\t\t\tcase 'KeyW': this.moveState.forward = 0; break;\n\t\t\t\tcase 'KeyS': this.moveState.back = 0; break;\n\n\t\t\t\tcase 'KeyA': this.moveState.left = 0; break;\n\t\t\t\tcase 'KeyD': this.moveState.right = 0; break;\n\n\t\t\t\tcase 'KeyR': this.moveState.up = 0; break;\n\t\t\t\tcase 'KeyF': this.moveState.down = 0; break;\n\n\t\t\t\tcase 'ArrowUp': this.moveState.pitchUp = 0; break;\n\t\t\t\tcase 'ArrowDown': this.moveState.pitchDown = 0; break;\n\n\t\t\t\tcase 'ArrowLeft': this.moveState.yawLeft = 0; break;\n\t\t\t\tcase 'ArrowRight': this.moveState.yawRight = 0; break;\n\n\t\t\t\tcase 'KeyQ': this.moveState.rollLeft = 0; break;\n\t\t\t\tcase 'KeyE': this.moveState.rollRight = 0; break;\n\t\t\t}\n\n\t\t\tthis.updateMovementVector();\n\t\t\tthis.updateRotationVector();\n\t\t};\n\n\t\tthis.pointerdown = function(event) {\n\t\t\tif (this.enabled === false) return;\n\n\t\t\tif (this.dragToLook) {\n\t\t\t\tthis.mouseStatus++;\n\t\t\t} else {\n\t\t\t\tswitch (event.button) {\n\t\t\t\t\tcase 0: this.moveState.forward = 1; break;\n\t\t\t\t\tcase 2: this.moveState.back = 1; break;\n\t\t\t\t}\n\n\t\t\t\tthis.updateMovementVector();\n\t\t\t}\n\t\t};\n\n\t\tthis.pointermove = function(event) {\n\t\t\tif (this.enabled === false) return;\n\n\t\t\tif (!this.dragToLook || this.mouseStatus > 0) {\n\t\t\t\tconst container = this.getContainerDimensions();\n\t\t\t\tconst halfWidth = container.size[0] / 2;\n\t\t\t\tconst halfHeight = container.size[1] / 2;\n\n\t\t\t\tthis.moveState.yawLeft = -((event.pageX - container.offset[0]) - halfWidth) / halfWidth;\n\t\t\t\tthis.moveState.pitchDown = ((event.pageY - container.offset[1]) - halfHeight) / halfHeight;\n\n\t\t\t\tthis.updateRotationVector();\n\t\t\t}\n\t\t};\n\n\t\tthis.pointerup = function(event) {\n\t\t\tif (this.enabled === false) return;\n\n\t\t\tif (this.dragToLook) {\n\t\t\t\tthis.mouseStatus--;\n\n\t\t\t\tthis.moveState.yawLeft = this.moveState.pitchDown = 0;\n\t\t\t} else {\n\t\t\t\tswitch (event.button) {\n\t\t\t\t\tcase 0: this.moveState.forward = 0; break;\n\t\t\t\t\tcase 2: this.moveState.back = 0; break;\n\t\t\t\t}\n\n\t\t\t\tthis.updateMovementVector();\n\t\t\t}\n\n\t\t\tthis.updateRotationVector();\n\t\t};\n\n\t\tthis.contextMenu = function(event) {\n\t\t\tif (this.enabled === false) return;\n\t\t\tevent.preventDefault();\n\t\t};\n\n\t\tthis.update = function(delta = 0.0166) {\n\t\t\tif (this.enabled === false) return;\n\n\t\t\tconst moveMult = delta * this.movementSpeed / 0.0166;\n\t\t\tconst rotMult = delta * this.rollSpeed / 0.0166;\n\n\t\t\ttempVector.set(1, 0, 0).applyQuaternion(this.object.quaternion).multiplyScalar(this.moveVector.x * moveMult);\n\t\t\tthis.object.position.add(tempVector);\n\t\t\ttempVector.set(0, 1, 0).applyQuaternion(this.object.quaternion).multiplyScalar(this.moveVector.y * moveMult);\n\t\t\tthis.object.position.add(tempVector);\n\t\t\ttempVector.set(0, 0, 1).applyQuaternion(this.object.quaternion).multiplyScalar(this.moveVector.z * moveMult);\n\t\t\tthis.object.position.add(tempVector);\n\n\t\t\tthis.tmpQuaternion.set(this.rotationVector.x * rotMult, this.rotationVector.y * rotMult, this.rotationVector.z * rotMult, 1).normalize();\n\t\t\tthis.object.quaternion.multiply(this.tmpQuaternion);\n\n\t\t\tif (\n\t\t\t\tlastPosition.distanceToSquared(this.object.position) > EPS ||\n\t\t\t\t8 * (1 - lastQuaternion.dot(this.object.quaternion)) > EPS\n\t\t\t) {\n\t\t\t\tlastPosition.copy(this.object.position);\n\t\t\t\tlastQuaternion.copy(this.object.quaternion);\n\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\treturn false;\n\t\t};\n\n\t\tthis.updateMovementVector = function() {\n\t\t\tconst forward = (this.moveState.forward || (this.autoForward && !this.moveState.back)) ? 1 : 0;\n\n\t\t\tthis.moveVector.x = (-this.moveState.left + this.moveState.right);\n\t\t\tthis.moveVector.y = (-this.moveState.down + this.moveState.up);\n\t\t\tthis.moveVector.z = (-forward + this.moveState.back);\n\n\t\t\t// console.log('move:', [this.moveVector.x, this.moveVector.y, this.moveVector.z]);\n\t\t};\n\n\t\tthis.updateRotationVector = function() {\n\t\t\tthis.rotationVector.x = (-this.moveState.pitchDown + this.moveState.pitchUp);\n\t\t\tthis.rotationVector.y = (-this.moveState.yawRight + this.moveState.yawLeft);\n\t\t\tthis.rotationVector.z = (-this.moveState.rollRight + this.moveState.rollLeft);\n\n\t\t\t// console.log('rotate:', [this.rotationVector.x, this.rotationVector.y, this.rotationVector.z]);\n\t\t};\n\n\t\tthis.getContainerDimensions = function() {\n\t\t\tif (this.domElement != document) {\n\t\t\t\treturn {\n\t\t\t\t\tsize: [this.domElement.offsetWidth, this.domElement.offsetHeight],\n\t\t\t\t\toffset: [this.domElement.offsetLeft, this.domElement.offsetTop]\n\t\t\t\t};\n\t\t\t} else {\n\t\t\t\treturn {\n\t\t\t\t\tsize: [window.innerWidth, window.innerHeight],\n\t\t\t\t\toffset: [0, 0]\n\t\t\t\t};\n\t\t\t}\n\t\t};\n\n\t\tthis.dispose = function() {\n\t\t\tthis.domElement.removeEventListener('contextmenu', _contextmenu);\n\t\t\tthis.domElement.removeEventListener('pointerdown', _pointerdown);\n\t\t\tthis.domElement.removeEventListener('pointermove', _pointermove);\n\t\t\tthis.domElement.removeEventListener('pointerup', _pointerup);\n\n\t\t\twindow.removeEventListener('keydown', _keydown);\n\t\t\twindow.removeEventListener('keyup', _keyup);\n\t\t};\n\n\t\tconst _contextmenu = this.contextMenu.bind(this);\n\t\tconst _pointermove = this.pointermove.bind(this);\n\t\tconst _pointerdown = this.pointerdown.bind(this);\n\t\tconst _pointerup = this.pointerup.bind(this);\n\t\tconst _keydown = this.keydown.bind(this);\n\t\tconst _keyup = this.keyup.bind(this);\n\n\t\tthis.domElement.addEventListener('contextmenu', _contextmenu);\n\t\tthis.domElement.addEventListener('mousemove', _pointermove);\n\t\tthis.domElement.addEventListener('mousedown', _pointerdown);\n\t\tthis.domElement.addEventListener('mouseup', _pointerup);\n\n\t\twindow.addEventListener('keydown', _keydown);\n\t\twindow.addEventListener('keyup', _keyup);\n\n\t\tthis.updateMovementVector();\n\t\tthis.updateRotationVector();\n\t}\n\n}\n\nexport { FlyControls };"
  },
  {
    "path": "examples/jsm/controls/FreeControls.js",
    "content": "/**\n * @author shawn0326 / http://halflab.me\n */\n\nimport {\n\tQuaternion,\n\tVector2,\n\tVector3\n} from 't3d';\n\nclass FreeControls {\n\n\tconstructor(object, domElement = document) {\n\t\tthis.object = object;\n\t\tthis.domElement = domElement;\n\n\t\tthis.object.euler.order = 'YXZ'; // the right order?\n\n\t\t// API\n\n\t\tthis.movementSpeed = 1.0;\n\t\tthis.rotateSpeed = 0.25;\n\n\t\tthis.enableMovementDamping = true;\n\t\tthis.movementDampingFactor = 0.25;\n\n\t\tthis.enableRotateDamping = true;\n\t\tthis.rotateDampingFactor = 0.25;\n\n\t\t// internals\n\n\t\tconst EPS = 0.000001;\n\n\t\tconst tempVector = new Vector3();\n\n\t\tconst lastPosition = new Vector3();\n\t\tconst lastQuaternion = new Quaternion();\n\n\t\tconst rotateStart = new Vector2();\n\t\tconst rotateEnd = new Vector2();\n\t\tconst rotateDelta = new Vector2();\n\n\t\tconst moveDelta = new Vector3();\n\n\t\tconst rotateVector = new Vector2();\n\t\tconst moveVector = new Vector3();\n\n\t\tlet mouseState = 0;\n\t\tconst moveState = { up: 0, down: 0, left: 0, right: 0, forward: 0, back: 0 };\n\n\t\tconst scope = this;\n\n\t\tthis.update = function(delta = 0.0166) {\n\t\t\tconst moveMult = delta * this.movementSpeed / 0.0166;\n\n\t\t\tmoveVector.add(moveDelta);\n\t\t\trotateVector.add(rotateDelta);\n\n\t\t\ttempVector.set(1, 0, 0).applyQuaternion(this.object.quaternion).multiplyScalar(moveVector.x * moveMult);\n\t\t\tthis.object.position.add(tempVector);\n\t\t\ttempVector.set(0, 1, 0).applyQuaternion(this.object.quaternion).multiplyScalar(moveVector.y * moveMult);\n\t\t\tthis.object.position.add(tempVector);\n\t\t\ttempVector.set(0, 0, 1).applyQuaternion(this.object.quaternion).multiplyScalar(moveVector.z * moveMult);\n\t\t\tthis.object.position.add(tempVector);\n\n\t\t\tthis.object.euler.x += delta * rotateVector.x / 0.0166;\n\t\t\tthis.object.euler.y += delta * rotateVector.y / 0.0166;\n\n\t\t\tif (this.enableMovementDamping) {\n\t\t\t\tmoveVector.multiplyScalar(1 - this.movementDampingFactor);\n\t\t\t} else {\n\t\t\t\tmoveVector.set(0, 0, 0);\n\t\t\t}\n\n\t\t\tif (this.enableRotateDamping) {\n\t\t\t\trotateVector.multiplyScalar(1 - this.rotateDampingFactor);\n\t\t\t} else {\n\t\t\t\trotateVector.set(0, 0);\n\t\t\t}\n\n\t\t\trotateDelta.set(0, 0);\n\n\t\t\tif (\n\t\t\t\tlastPosition.distanceToSquared(this.object.position) > EPS ||\n\t\t\t\t8 * (1 - lastQuaternion.dot(this.object.quaternion)) > EPS\n\t\t\t) {\n\t\t\t\tlastPosition.copy(this.object.position);\n\t\t\t\tlastQuaternion.copy(this.object.quaternion);\n\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\treturn false;\n\t\t};\n\n\t\tfunction updateRotateVector() {\n\t\t\tconst element = scope.domElement === document ? scope.domElement.body : scope.domElement;\n\n\t\t\tconst x = rotateDelta.x, y = rotateDelta.y;\n\t\t\trotateDelta.x = (2 * Math.PI * y / element.clientHeight);\n\t\t\trotateDelta.y = (2 * Math.PI * x / element.clientWidth);\n\t\t}\n\n\t\tfunction updateMovementVector() {\n\t\t\tmoveDelta.x = (-moveState.left + moveState.right);\n\t\t\tmoveDelta.y = (-moveState.down + moveState.up);\n\t\t\tmoveDelta.z = (-moveState.forward + moveState.back);\n\t\t}\n\n\t\tfunction mousedown(event) {\n\t\t\trotateStart.set(event.clientX, event.clientY);\n\t\t\tmouseState = 1;\n\t\t}\n\n\t\tfunction mousemove(event) {\n\t\t\tif (mouseState == 0) return;\n\t\t\trotateEnd.set(event.clientX, event.clientY);\n\t\t\trotateDelta.subVectors(rotateEnd, rotateStart).multiplyScalar(-scope.rotateSpeed);\n\t\t\tupdateRotateVector();\n\t\t\trotateStart.copy(rotateEnd);\n\t\t}\n\n\t\tfunction mouseup(event) {\n\t\t\tmouseState = 0;\n\t\t\trotateDelta.set(0, 0);\n\t\t}\n\n\t\tfunction keydown(event) {\n\t\t\tswitch (event.keyCode) {\n\t\t\t\tcase 87: /* W */ moveState.forward = 1; break;\n\t\t\t\tcase 83: /* S */ moveState.back = 1; break;\n\n\t\t\t\tcase 65: /* A */ moveState.left = 1; break;\n\t\t\t\tcase 68: /* D */ moveState.right = 1; break;\n\n\t\t\t\tcase 82: /* R */ moveState.up = 1; break;\n\t\t\t\tcase 70: /* F */ moveState.down = 1; break;\n\n\t\t\t\tcase 69: /* E */ moveState.up = 1; break;\n\t\t\t\tcase 81: /* Q */ moveState.down = 1; break;\n\t\t\t}\n\n\t\t\tupdateMovementVector();\n\t\t}\n\n\t\tfunction keyup(event) {\n\t\t\tswitch (event.keyCode) {\n\t\t\t\tcase 87: /* W */ moveState.forward = 0; break;\n\t\t\t\tcase 83: /* S */ moveState.back = 0; break;\n\n\t\t\t\tcase 65: /* A */ moveState.left = 0; break;\n\t\t\t\tcase 68: /* D */ moveState.right = 0; break;\n\n\t\t\t\tcase 82: /* R */ moveState.up = 0; break;\n\t\t\t\tcase 70: /* F */ moveState.down = 0; break;\n\n\t\t\t\tcase 69: /* E */ moveState.up = 0; break;\n\t\t\t\tcase 81: /* Q */ moveState.down = 0; break;\n\t\t\t}\n\n\t\t\tupdateMovementVector();\n\t\t}\n\n\t\tthis.domElement.addEventListener('mousemove', mousemove);\n\t\tthis.domElement.addEventListener('mousedown', mousedown);\n\t\tthis.domElement.addEventListener('mouseup', mouseup);\n\n\t\twindow.addEventListener('keydown', keydown);\n\t\twindow.addEventListener('keyup', keyup);\n\n\t\tupdateMovementVector();\n\t\tupdateRotateVector();\n\t}\n\n}\n\nexport { FreeControls };"
  },
  {
    "path": "examples/jsm/controls/OrbitControls.js",
    "content": "import {\n\tQuaternion,\n\tSpherical,\n\tVector2,\n\tVector3\n} from 't3d';\n\n// Modified from https://github.com/mrdoob/three.js/blob/master/examples/jsm/controls/OrbitControls.js\n// At present, the 'Dolly' operation does not affect the effect of the orthographic camera,\n// because OrbitControls does not change the camera's projection matrix.\n\n// This set of controls performs orbiting, dollying, and panning.\n// Unlike TrackballControls, it maintains the \"up\" direction object.up (+Y by default).\n//\n//    Orbit - left mouse / touch: one-finger move\n//    Dolly - middle mouse, or mousewheel / touch: two-finger spread or squish\n//    Pan - right mouse, or arrow keys / touch: two-finger move\n\nclass OrbitControls {\n\n\tconstructor(object, domElement) {\n\t\tthis.object = object;\n\t\tthis.domElement = domElement;\n\t\tthis.domElement.style.touchAction = 'none'; // disable touch scroll\n\n\t\t// Set to false to disable this control\n\t\tthis.enabled = true;\n\n\t\t// \"target\" sets the location of focus, where the object orbits around\n\t\tthis.target = new Vector3();\n\n\t\t// The orbit axis\n\t\tthis.up = new Vector3(0, 1, 0);\n\n\t\t// How far you can dolly in and out\n\t\tthis.minDistance = 0;\n\t\tthis.maxDistance = Infinity;\n\n\t\t// How far you can orbit vertically, upper and lower limits.\n\t\t// Range is 0 to Math.PI radians.\n\t\tthis.minPolarAngle = 0; // radians\n\t\tthis.maxPolarAngle = Math.PI; // radians\n\n\t\t// How far you can orbit horizontally, upper and lower limits.\n\t\t// If set, the interval [ min, max ] must be a sub-interval of [ - 2 PI, 2 PI ], with ( max - min < 2 PI )\n\t\tthis.minAzimuthAngle = -Infinity; // radians\n\t\tthis.maxAzimuthAngle = Infinity; // radians\n\n\t\t// Set to true to enable damping (inertia)\n\t\t// If damping is enabled, you must call controls.update() in your animation loop\n\t\tthis.enableDamping = true;\n\t\tthis.dampingFactor = 0.1;\n\n\t\t// This option enables dollying in and out.\n\t\t// Set to false to disable dollying\n\t\tthis.enableDollying = true;\n\t\tthis.dollyingSpeed = 1.0;\n\n\t\t// Set to false to disable rotating\n\t\tthis.enableRotate = true;\n\t\tthis.rotateSpeed = 1.0;\n\n\t\t// Set to false to disable panning\n\t\tthis.enablePan = true;\n\t\tthis.panSpeed = 1.0;\n\t\tthis.screenSpacePanning = true; // if false, pan orthogonal to world-space direction camera.up\n\t\tthis.keyPanSpeed = 7.0;\t// pixels moved per arrow key push\n\n\t\t// Set to true to automatically rotate around the target\n\t\t// If auto-rotate is enabled, you must call controls.update() in your animation loop\n\t\tthis.autoRotate = false;\n\t\tthis.autoRotateSpeed = 2.0; // 30 seconds per round when fps is 60\n\n\t\t// The four arrow keys\n\t\tthis.keys = { LEFT: 37, UP: 38, RIGHT: 39, BOTTOM: 40 };\n\n\t\t// Mouse buttons\n\t\tthis.mouseButtons = { ORBIT: 0, DOLLY: 1, PAN: 2 };\n\n\t\t// Touch fingers\n\t\tthis.touches = { ORBIT: 1, DOLLY_PAN: 2 };\n\n\t\t// for reset\n\t\tthis.target0 = this.target.clone();\n\t\tthis.position0 = this.object.position.clone();\n\n\t\t// the target DOM element for key events\n\t\tthis._domElementKeyEvents = null;\n\n\t\t//\n\t\t// public methods\n\t\t//\n\n\t\tthis.getPolarAngle = function() {\n\t\t\treturn spherical.phi;\n\t\t};\n\n\t\tthis.getAzimuthalAngle = function() {\n\t\t\treturn spherical.theta;\n\t\t};\n\n\t\tthis.listenToKeyEvents = function(domElement) {\n\t\t\tdomElement.addEventListener('keydown', onKeyDown);\n\t\t\tscope._domElementKeyEvents = domElement;\n\t\t};\n\n\t\tthis.saveState = function() {\n\t\t\tscope.target0.copy(scope.target);\n\t\t\tscope.position0.copy(scope.object.position);\n\t\t};\n\n\t\tthis.reset = function() {\n\t\t\tscope.target.copy(scope.target0);\n\t\t\tscope.object.position.copy(scope.position0);\n\n\t\t\t// scope.update();\n\n\t\t\tstate = STATE.NONE;\n\t\t};\n\n\t\tthis.update = function() {\n\t\t\tconst offset = new Vector3();\n\n\t\t\tconst yAxis = new Vector3(0, 1, 0);\n\t\t\tconst quat = new Quaternion();\n\t\t\tconst quatInverse = quat.clone();\n\n\t\t\tconst lastPosition = new Vector3();\n\t\t\tconst lastQuaternion = new Quaternion();\n\n\t\t\tconst twoPI = 2 * Math.PI;\n\n\t\t\treturn function update() {\n\t\t\t\tquat.setFromUnitVectors(scope.up, yAxis);\n\t\t\t\tquatInverse.copy(quat).conjugate();\n\n\t\t\t\tconst position = scope.object.position;\n\n\t\t\t\toffset.copy(position).sub(scope.target);\n\n\t\t\t\t// rotate offset to \"y-axis-is-up\" space\n\t\t\t\toffset.applyQuaternion(quat);\n\n\t\t\t\t// angle from z-axis around y-axis\n\t\t\t\tspherical.setFromVector3(offset);\n\n\t\t\t\tif (scope.autoRotate && state === STATE.NONE) {\n\t\t\t\t\trotateLeft(getAutoRotationAngle());\n\t\t\t\t}\n\n\t\t\t\tif (scope.enableDamping) {\n\t\t\t\t\tspherical.theta += sphericalDelta.theta * scope.dampingFactor;\n\t\t\t\t\tspherical.phi += sphericalDelta.phi * scope.dampingFactor;\n\t\t\t\t} else {\n\t\t\t\t\tspherical.theta += sphericalDelta.theta;\n\t\t\t\t\tspherical.phi += sphericalDelta.phi;\n\t\t\t\t}\n\n\t\t\t\t// restrict theta to be between desired limits\n\n\t\t\t\tlet min = scope.minAzimuthAngle;\n\t\t\t\tlet max = scope.maxAzimuthAngle;\n\n\t\t\t\tif (isFinite(min) && isFinite(max)) {\n\t\t\t\t\tif (min < -Math.PI) min += twoPI; else if (min > Math.PI) min -= twoPI;\n\n\t\t\t\t\tif (max < -Math.PI) max += twoPI; else if (max > Math.PI) max -= twoPI;\n\n\t\t\t\t\tif (min <= max) {\n\t\t\t\t\t\tspherical.theta = Math.max(min, Math.min(max, spherical.theta));\n\t\t\t\t\t} else {\n\t\t\t\t\t\tspherical.theta = (spherical.theta > (min + max) / 2) ?\n\t\t\t\t\t\t\tMath.max(min, spherical.theta) :\n\t\t\t\t\t\t\tMath.min(max, spherical.theta);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// restrict phi to be between desired limits\n\t\t\t\tspherical.phi = Math.max(scope.minPolarAngle, Math.min(scope.maxPolarAngle, spherical.phi));\n\n\t\t\t\tspherical.makeSafe();\n\n\t\t\t\tspherical.radius *= scale;\n\n\t\t\t\t// restrict radius to be between desired limits\n\t\t\t\tspherical.radius = Math.max(scope.minDistance, Math.min(scope.maxDistance, spherical.radius));\n\n\t\t\t\t// move target to panned location\n\n\t\t\t\tif (scope.enableDamping === true) {\n\t\t\t\t\tscope.target.addScaledVector(panOffset, scope.dampingFactor);\n\t\t\t\t} else {\n\t\t\t\t\tscope.target.add(panOffset);\n\t\t\t\t}\n\n\t\t\t\toffset.setFromSpherical(spherical);\n\n\t\t\t\t// rotate offset back to \"camera-up-vector-is-up\" space\n\t\t\t\toffset.applyQuaternion(quatInverse);\n\n\t\t\t\tposition.copy(scope.target).add(offset);\n\n\t\t\t\tscope.object.lookAt(scope.target, scope.up);\n\n\t\t\t\tif (scope.enableDamping === true) {\n\t\t\t\t\tsphericalDelta.theta *= (1 - scope.dampingFactor);\n\t\t\t\t\tsphericalDelta.phi *= (1 - scope.dampingFactor);\n\n\t\t\t\t\tpanOffset.multiplyScalar(1 - scope.dampingFactor);\n\t\t\t\t} else {\n\t\t\t\t\tsphericalDelta.set(0, 0, 0);\n\n\t\t\t\t\tpanOffset.set(0, 0, 0);\n\t\t\t\t}\n\n\t\t\t\tscale = 1;\n\n\t\t\t\t// update condition is:\n\t\t\t\t// min(camera displacement, camera rotation in radians)^2 > EPS\n\t\t\t\t// using small-angle approximation cos(x/2) = 1 - x^2 / 8\n\n\t\t\t\tif (lastPosition.distanceToSquared(scope.object.position) > EPS ||\n\t\t\t\t\t8 * (1 - lastQuaternion.dot(scope.object.quaternion)) > EPS) {\n\t\t\t\t\tlastPosition.copy(scope.object.position);\n\t\t\t\t\tlastQuaternion.copy(scope.object.quaternion);\n\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\n\t\t\t\treturn false;\n\t\t\t};\n\t\t}();\n\n\t\tthis.dispose = function() {\n\t\t\tscope.domElement.removeEventListener('contextmenu', onContextMenu);\n\n\t\t\tscope.domElement.removeEventListener('pointerdown', onPointerDown);\n\t\t\tscope.domElement.removeEventListener('pointercancel', onPointerCancel);\n\t\t\tscope.domElement.removeEventListener('wheel', onMouseWheel);\n\n\t\t\tscope.domElement.removeEventListener('pointermove', onPointerMove);\n\t\t\tscope.domElement.removeEventListener('pointerup', onPointerUp);\n\n\t\t\tif (scope._domElementKeyEvents !== null) {\n\t\t\t\tscope._domElementKeyEvents.removeEventListener('keydown', onKeyDown);\n\t\t\t}\n\t\t};\n\n\t\t//\n\t\t// internals\n\t\t//\n\n\t\tconst scope = this;\n\n\t\tconst STATE = { NONE: -1, ROTATE: 0, DOLLY: 1, PAN: 2, TOUCH_ROTATE: 3, TOUCH_DOLLY_PAN: 4 };\n\n\t\tlet state = STATE.NONE;\n\n\t\tconst EPS = 0.000001;\n\n\t\t// current position in spherical coordinates\n\t\tconst spherical = new Spherical();\n\t\tconst sphericalDelta = new Spherical();\n\n\t\tlet scale = 1;\n\t\tconst panOffset = new Vector3();\n\n\t\tconst rotateStart = new Vector2();\n\t\tconst rotateEnd = new Vector2();\n\t\tconst rotateDelta = new Vector2();\n\n\t\tconst panStart = new Vector2();\n\t\tconst panEnd = new Vector2();\n\t\tconst panDelta = new Vector2();\n\n\t\tconst dollyStart = new Vector2();\n\t\tconst dollyEnd = new Vector2();\n\t\tconst dollyDelta = new Vector2();\n\n\t\tconst pointers = [];\n\t\tconst pointerPositions = {};\n\n\t\tfunction getAutoRotationAngle() {\n\t\t\treturn 2 * Math.PI / 60 / 60 * scope.autoRotateSpeed;\n\t\t}\n\n\t\tfunction getDollyingScale() {\n\t\t\treturn Math.pow(0.95, scope.dollyingSpeed);\n\t\t}\n\n\t\tfunction rotateLeft(angle) {\n\t\t\tsphericalDelta.theta -= angle;\n\t\t}\n\n\t\tfunction rotateUp(angle) {\n\t\t\tsphericalDelta.phi -= angle;\n\t\t}\n\n\t\tconst panLeft = function() {\n\t\t\tconst v = new Vector3();\n\n\t\t\treturn function panLeft(distance, objectMatrix) {\n\t\t\t\tv.setFromMatrixColumn(objectMatrix, 0); // get X column of objectMatrix\n\t\t\t\tv.multiplyScalar(-distance);\n\n\t\t\t\tpanOffset.add(v);\n\t\t\t};\n\t\t}();\n\n\t\tconst panUp = function() {\n\t\t\tconst v = new Vector3();\n\n\t\t\treturn function panUp(distance, objectMatrix) {\n\t\t\t\tif (scope.screenSpacePanning === true) {\n\t\t\t\t\tv.setFromMatrixColumn(objectMatrix, 1);\n\t\t\t\t} else {\n\t\t\t\t\tv.setFromMatrixColumn(objectMatrix, 0);\n\t\t\t\t\tv.crossVectors(scope.up, v);\n\t\t\t\t}\n\n\t\t\t\tv.multiplyScalar(distance);\n\n\t\t\t\tpanOffset.add(v);\n\t\t\t};\n\t\t}();\n\n\t\t// deltaX and deltaY are in pixels; right and down are positive\n\t\tconst pan = function() {\n\t\t\tconst offset = new Vector3();\n\n\t\t\tconst p = new Vector3();\n\n\t\t\treturn function pan(deltaX, deltaY) {\n\t\t\t\tconst element = scope.domElement;\n\n\t\t\t\tconst position = scope.object.position;\n\t\t\t\toffset.copy(position).sub(scope.target);\n\t\t\t\tconst targetDistance = offset.getLength();\n\n\t\t\t\tconst depth = p.set(0, 0, targetDistance).applyMatrix4(scope.object.projectionMatrix).z;\n\n\t\t\t\t// full-screen to world distance\n\t\t\t\tconst distance = p.set(0, -1, depth).applyMatrix4(scope.object.projectionMatrixInverse).y;\n\t\t\t\t// distance *= 2;\n\n\t\t\t\t// we use only clientHeight here so aspect ratio does not distort speed\n\t\t\t\tpanLeft(2 * deltaX * distance / element.clientHeight, scope.object.matrix);\n\t\t\t\tpanUp(2 * deltaY * distance / element.clientHeight, scope.object.matrix);\n\t\t\t};\n\t\t}();\n\n\t\tfunction dollyOut(dollyScale) {\n\t\t\tscale /= dollyScale;\n\t\t}\n\n\t\tfunction dollyIn(dollyScale) {\n\t\t\tscale *= dollyScale;\n\t\t}\n\n\t\t//\n\t\t// event callbacks - update the object state\n\t\t//\n\n\t\tfunction handleMouseDownRotate(event) {\n\t\t\trotateStart.set(event.clientX, event.clientY);\n\t\t}\n\n\t\tfunction handleMouseDownDolly(event) {\n\t\t\tdollyStart.set(event.clientX, event.clientY);\n\t\t}\n\n\t\tfunction handleMouseDownPan(event) {\n\t\t\tpanStart.set(event.clientX, event.clientY);\n\t\t}\n\n\t\tfunction handleMouseMoveRotate(event) {\n\t\t\trotateEnd.set(event.clientX, event.clientY);\n\n\t\t\trotateDelta.subVectors(rotateEnd, rotateStart).multiplyScalar(scope.rotateSpeed);\n\n\t\t\tconst element = scope.domElement;\n\n\t\t\trotateLeft(2 * Math.PI * rotateDelta.x / element.clientHeight); // use clientHeight to prevent aspect from affecting rotate speed\n\n\t\t\trotateUp(2 * Math.PI * rotateDelta.y / element.clientHeight);\n\n\t\t\trotateStart.copy(rotateEnd);\n\t\t}\n\n\t\tfunction handleMouseMoveDolly(event) {\n\t\t\tdollyEnd.set(event.clientX, event.clientY);\n\n\t\t\tdollyDelta.subVectors(dollyEnd, dollyStart);\n\n\t\t\tif (dollyDelta.y > 0) {\n\t\t\t\tdollyOut(getDollyingScale());\n\t\t\t} else if (dollyDelta.y < 0) {\n\t\t\t\tdollyIn(getDollyingScale());\n\t\t\t}\n\n\t\t\tdollyStart.copy(dollyEnd);\n\t\t}\n\n\t\tfunction handleMouseMovePan(event) {\n\t\t\tpanEnd.set(event.clientX, event.clientY);\n\n\t\t\tpanDelta.subVectors(panEnd, panStart).multiplyScalar(scope.panSpeed);\n\n\t\t\tpan(panDelta.x, panDelta.y);\n\n\t\t\tpanStart.copy(panEnd);\n\t\t}\n\n\t\tfunction handleMouseWheel(event) {\n\t\t\tif (event.deltaY < 0) {\n\t\t\t\tdollyIn(getDollyingScale());\n\t\t\t} else if (event.deltaY > 0) {\n\t\t\t\tdollyOut(getDollyingScale());\n\t\t\t}\n\t\t}\n\n\t\tfunction handleKeyDown(event) {\n\t\t\tlet needsUpdate = false;\n\n\t\t\tswitch (event.keyCode) {\n\t\t\t\tcase scope.keys.UP:\n\t\t\t\t\tpan(0, scope.keyPanSpeed);\n\t\t\t\t\tneedsUpdate = true;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase scope.keys.BOTTOM:\n\t\t\t\t\tpan(0, -scope.keyPanSpeed);\n\t\t\t\t\tneedsUpdate = true;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase scope.keys.LEFT:\n\t\t\t\t\tpan(scope.keyPanSpeed, 0);\n\t\t\t\t\tneedsUpdate = true;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase scope.keys.RIGHT:\n\t\t\t\t\tpan(-scope.keyPanSpeed, 0);\n\t\t\t\t\tneedsUpdate = true;\n\t\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tif (needsUpdate) {\n\t\t\t\tevent.preventDefault(); // prevent the browser from scrolling on cursor keys\n\t\t\t\t// scope.update();\n\t\t\t}\n\t\t}\n\n\t\tfunction handleTouchStartRotate() {\n\t\t\tif (pointers.length === 1) {\n\t\t\t\trotateStart.set(pointers[0].pageX, pointers[0].pageY);\n\t\t\t} else {\n\t\t\t\tconst x = 0.5 * (pointers[0].pageX + pointers[1].pageX);\n\t\t\t\tconst y = 0.5 * (pointers[0].pageY + pointers[1].pageY);\n\n\t\t\t\trotateStart.set(x, y);\n\t\t\t}\n\t\t}\n\n\t\tfunction handleTouchStartPan() {\n\t\t\tif (pointers.length === 1) {\n\t\t\t\tpanStart.set(pointers[0].pageX, pointers[0].pageY);\n\t\t\t} else {\n\t\t\t\tconst x = 0.5 * (pointers[0].pageX + pointers[1].pageX);\n\t\t\t\tconst y = 0.5 * (pointers[0].pageY + pointers[1].pageY);\n\n\t\t\t\tpanStart.set(x, y);\n\t\t\t}\n\t\t}\n\n\t\tfunction handleTouchStartDolly() {\n\t\t\tconst dx = pointers[0].pageX - pointers[1].pageX;\n\t\t\tconst dy = pointers[0].pageY - pointers[1].pageY;\n\n\t\t\tconst distance = Math.sqrt(dx * dx + dy * dy);\n\n\t\t\tdollyStart.set(0, distance);\n\t\t}\n\n\t\tfunction handleTouchStartDollyPan() {\n\t\t\tif (scope.enableDollying) handleTouchStartDolly();\n\t\t\tif (scope.enablePan) handleTouchStartPan();\n\t\t}\n\n\t\tfunction handleTouchMoveRotate(event) {\n\t\t\tif (pointers.length == 1) {\n\t\t\t\trotateEnd.set(event.pageX, event.pageY);\n\t\t\t} else {\n\t\t\t\tconst position = getSecondPointerPosition(event);\n\n\t\t\t\tconst x = 0.5 * (event.pageX + position.x);\n\t\t\t\tconst y = 0.5 * (event.pageY + position.y);\n\n\t\t\t\trotateEnd.set(x, y);\n\t\t\t}\n\n\t\t\trotateDelta.subVectors(rotateEnd, rotateStart).multiplyScalar(scope.rotateSpeed);\n\n\t\t\tconst element = scope.domElement;\n\n\t\t\trotateLeft(2 * Math.PI * rotateDelta.x / element.clientHeight); // prevent the browser from scrolling on cursor keys\n\n\t\t\trotateUp(2 * Math.PI * rotateDelta.y / element.clientHeight);\n\n\t\t\trotateStart.copy(rotateEnd);\n\t\t}\n\n\t\tfunction handleTouchMovePan(event) {\n\t\t\tif (pointers.length === 1) {\n\t\t\t\tpanEnd.set(event.pageX, event.pageY);\n\t\t\t} else {\n\t\t\t\tconst position = getSecondPointerPosition(event);\n\n\t\t\t\tconst x = 0.5 * (event.pageX + position.x);\n\t\t\t\tconst y = 0.5 * (event.pageY + position.y);\n\n\t\t\t\tpanEnd.set(x, y);\n\t\t\t}\n\n\t\t\tpanDelta.subVectors(panEnd, panStart).multiplyScalar(scope.panSpeed);\n\n\t\t\tpan(panDelta.x, panDelta.y);\n\n\t\t\tpanStart.copy(panEnd);\n\t\t}\n\n\t\tfunction handleTouchMoveDolly(event) {\n\t\t\tconst position = getSecondPointerPosition(event);\n\n\t\t\tconst dx = event.pageX - position.x;\n\t\t\tconst dy = event.pageY - position.y;\n\n\t\t\tconst distance = Math.sqrt(dx * dx + dy * dy);\n\n\t\t\tdollyEnd.set(0, distance);\n\n\t\t\tdollyDelta.set(0, Math.pow(dollyEnd.y / dollyStart.y, scope.dollyingSpeed));\n\n\t\t\tdollyOut(dollyDelta.y);\n\n\t\t\tdollyStart.copy(dollyEnd);\n\t\t}\n\n\t\tfunction handleTouchMoveDollyPan(event) {\n\t\t\tif (scope.enableDollying) handleTouchMoveDolly(event);\n\t\t\tif (scope.enablePan) handleTouchMovePan(event);\n\t\t}\n\n\t\t//\n\t\t// event handlers - FSM: listen for events and reset state\n\t\t//\n\n\t\tfunction onPointerDown(event) {\n\t\t\tif (scope.enabled === false) return;\n\n\t\t\tif (pointers.length === 0) {\n\t\t\t\tscope.domElement.setPointerCapture(event.pointerId);\n\n\t\t\t\tscope.domElement.addEventListener('pointermove', onPointerMove);\n\t\t\t\tscope.domElement.addEventListener('pointerup', onPointerUp);\n\t\t\t}\n\n\t\t\t//\n\n\t\t\taddPointer(event);\n\n\t\t\tif (event.pointerType === 'touch') {\n\t\t\t\tonTouchStart(event);\n\t\t\t} else {\n\t\t\t\tonMouseDown(event);\n\t\t\t}\n\t\t}\n\n\t\tfunction onPointerMove(event) {\n\t\t\tif (scope.enabled === false) return;\n\n\t\t\tif (event.pointerType === 'touch') {\n\t\t\t\tonTouchMove(event);\n\t\t\t} else {\n\t\t\t\tonMouseMove(event);\n\t\t\t}\n\t\t}\n\n\t\tfunction onPointerUp(event) {\n\t\t\tremovePointer(event);\n\n\t\t\tif (pointers.length === 0) {\n\t\t\t\tscope.domElement.releasePointerCapture(event.pointerId);\n\n\t\t\t\tscope.domElement.removeEventListener('pointermove', onPointerMove);\n\t\t\t\tscope.domElement.removeEventListener('pointerup', onPointerUp);\n\t\t\t}\n\n\t\t\tstate = STATE.NONE;\n\t\t}\n\n\t\tfunction onPointerCancel(event) {\n\t\t\tremovePointer(event);\n\t\t}\n\n\t\tfunction onMouseDown(event) {\n\t\t\tswitch (event.button) {\n\t\t\t\tcase scope.mouseButtons.ORBIT:\n\t\t\t\t\tif (scope.enableRotate === false) return;\n\t\t\t\t\thandleMouseDownRotate(event);\n\t\t\t\t\tstate = STATE.ROTATE;\n\t\t\t\t\tbreak;\n\t\t\t\tcase scope.mouseButtons.DOLLY:\n\t\t\t\t\tif (scope.enableDollying === false) return;\n\t\t\t\t\thandleMouseDownDolly(event);\n\t\t\t\t\tstate = STATE.DOLLY;\n\t\t\t\t\tbreak;\n\t\t\t\tcase scope.mouseButtons.PAN:\n\t\t\t\t\tif (scope.enablePan === false) return;\n\t\t\t\t\thandleMouseDownPan(event);\n\t\t\t\t\tstate = STATE.PAN;\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tfunction onMouseMove(event) {\n\t\t\tswitch (state) {\n\t\t\t\tcase STATE.ROTATE:\n\t\t\t\t\tif (scope.enableRotate === false) return;\n\t\t\t\t\thandleMouseMoveRotate(event);\n\t\t\t\t\t// scope.update();\n\t\t\t\t\tbreak;\n\t\t\t\tcase STATE.DOLLY:\n\t\t\t\t\tif (scope.enableDollying === false) return;\n\t\t\t\t\thandleMouseMoveDolly(event);\n\t\t\t\t\t// scope.update();\n\t\t\t\t\tbreak;\n\t\t\t\tcase STATE.PAN:\n\t\t\t\t\tif (scope.enablePan === false) return;\n\t\t\t\t\thandleMouseMovePan(event);\n\t\t\t\t\t// scope.update();\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tfunction onMouseWheel(event) {\n\t\t\tif (scope.enabled === false || scope.enableDollying === false || state !== STATE.NONE) return;\n\n\t\t\tevent.preventDefault();\n\n\t\t\thandleMouseWheel(event);\n\n\t\t\t// scope.update();\n\t\t}\n\n\t\tfunction onKeyDown(event) {\n\t\t\tif (scope.enabled === false || scope.enablePan === false) return;\n\n\t\t\thandleKeyDown(event);\n\t\t}\n\n\t\tfunction onTouchStart(event) {\n\t\t\ttrackPointer(event);\n\n\t\t\tswitch (pointers.length) {\n\t\t\t\tcase scope.touches.ORBIT:\n\t\t\t\t\tif (scope.enableRotate === false) return;\n\t\t\t\t\thandleTouchStartRotate();\n\t\t\t\t\tstate = STATE.TOUCH_ROTATE;\n\t\t\t\t\tbreak;\n\t\t\t\tcase scope.touches.DOLLY_PAN:\n\t\t\t\t\tif (scope.enableDollying === false && scope.enablePan === false) return;\n\t\t\t\t\thandleTouchStartDollyPan();\n\t\t\t\t\tstate = STATE.TOUCH_DOLLY_PAN;\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tstate = STATE.NONE;\n\t\t\t}\n\t\t}\n\n\t\tfunction onTouchMove(event) {\n\t\t\ttrackPointer(event);\n\n\t\t\tswitch (state) {\n\t\t\t\tcase STATE.TOUCH_ROTATE:\n\t\t\t\t\tif (scope.enableRotate === false) return;\n\t\t\t\t\thandleTouchMoveRotate(event);\n\t\t\t\t\t// scope.update();\n\t\t\t\t\tbreak;\n\t\t\t\tcase STATE.TOUCH_DOLLY_PAN:\n\t\t\t\t\tif (scope.enableDollying === false && scope.enablePan === false) return;\n\t\t\t\t\thandleTouchMoveDollyPan(event);\n\t\t\t\t\t// scope.update();\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tstate = STATE.NONE;\n\t\t\t}\n\t\t}\n\n\t\tfunction onContextMenu(event) {\n\t\t\tif (scope.enabled === false) return;\n\n\t\t\tevent.preventDefault();\n\t\t}\n\n\t\tfunction addPointer(event) {\n\t\t\tpointers.push(event);\n\t\t}\n\n\t\tfunction removePointer(event) {\n\t\t\tdelete pointerPositions[event.pointerId];\n\n\t\t\tfor (let i = 0; i < pointers.length; i++) {\n\t\t\t\tif (pointers[i].pointerId == event.pointerId) {\n\t\t\t\t\tpointers.splice(i, 1);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfunction trackPointer(event) {\n\t\t\tlet position = pointerPositions[event.pointerId];\n\n\t\t\tif (position === undefined) {\n\t\t\t\tposition = new Vector2();\n\t\t\t\tpointerPositions[event.pointerId] = position;\n\t\t\t}\n\n\t\t\tposition.set(event.pageX, event.pageY);\n\t\t}\n\n\t\tfunction getSecondPointerPosition(event) {\n\t\t\tconst pointer = (event.pointerId === pointers[0].pointerId) ? pointers[1] : pointers[0];\n\n\t\t\treturn pointerPositions[pointer.pointerId];\n\t\t}\n\n\t\t//\n\n\t\tscope.domElement.addEventListener('contextmenu', onContextMenu);\n\n\t\tscope.domElement.addEventListener('pointerdown', onPointerDown);\n\t\tscope.domElement.addEventListener('pointercancel', onPointerCancel);\n\t\tscope.domElement.addEventListener('wheel', onMouseWheel, { passive: false });\n\n\t\t// force an update at start\n\n\t\tthis.update();\n\t}\n\n}\n\nexport { OrbitControls };"
  },
  {
    "path": "examples/jsm/controls/TransformControls.js",
    "content": "import {\n\tObject3D, Vector2, Vector3, Euler, Plane, Matrix4, Quaternion,\n\tMesh, BasicMaterial, ShaderLib, Raycaster,\n\tCylinderGeometry, PlaneGeometry, BoxGeometry, SphereGeometry, Geometry, Attribute, Buffer,\n\tMATERIAL_TYPE, DRAW_SIDE, DRAW_MODE\n} from 't3d';\nimport { TorusBuilder } from '../geometries/builders/TorusBuilder.js';\nimport { VirtualGroup } from '../math/VirtualGroup.js';\n\nclass TransformControls extends Object3D {\n\n\tconstructor(camera, domElement) {\n\t\tsuper();\n\n\t\tconst group = new VirtualGroup();\n\n\t\tconst controlMap = new Map();\n\n\t\tconst translateControl = new TranslateControl(camera, group);\n\t\tconst scaleControl = new ScaleControl(camera, group);\n\t\tconst rotateControl = new RotateControl(camera, group);\n\n\t\tcontrolMap.set('translate', translateControl);\n\t\tcontrolMap.set('scale', scaleControl);\n\t\tcontrolMap.set('rotate', rotateControl);\n\n\t\tthis.add(translateControl);\n\t\tthis.add(scaleControl);\n\t\tthis.add(rotateControl);\n\n\t\tthis._domElement = domElement;\n\n\t\tthis._mode = '';\n\t\tthis._camera = camera;\n\t\tthis._group = group;\n\t\tthis._controlMap = controlMap;\n\n\t\tthis._currentControl = [];\n\t\tthis._currentDraggingControl = null;\n\t\tthis._currentHoverControl = null;\n\n\t\tthis._raycaster = new Raycaster();\n\n\t\tthis.mode = 'translate';\n\n\t\tthis._onPointDown = this._onPointDown.bind(this);\n\t\tthis._onPointMove = this._onPointMove.bind(this);\n\t\tthis._onPointUp = this._onPointUp.bind(this);\n\n\t\tthis._addEventListeners();\n\n\t\tthis.onDragStart = null;\n\t\tthis.onDragEnd = null;\n\t\tthis.onDrag = null;\n\t}\n\n\tget group() {\n\t\treturn this._group;\n\t}\n\n\t// 'translate' | 'scale' | 'rotate' | 'all'\n\tset mode(value) {\n\t\tif (this._mode === value) return;\n\n\t\tthis._mode = value;\n\n\t\tthis._currentControl = [];\n\t\tif (value === 'all') {\n\t\t\tthis._controlMap.forEach(control => {\n\t\t\t\tthis._currentControl.push(control);\n\t\t\t\tcontrol.visible = true;\n\t\t\t});\n\t\t} else {\n\t\t\tthis._controlMap.forEach((control, key) => {\n\t\t\t\tif (key === value) {\n\t\t\t\t\tthis._currentControl.push(control);\n\t\t\t\t\tcontrol.visible = true;\n\t\t\t\t} else {\n\t\t\t\t\tcontrol.visible = false;\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\n\tget mode() {\n\t\treturn this._mode;\n\t}\n\n\tset size(value) {\n\t\tthis._controlMap.forEach(control => control.size = value);\n\t}\n\n\tget size() {\n\t\treturn this._controlMap.get('translate').size;\n\t}\n\n\tset translateSnap(value) {\n\t\tthis._controlMap.get('translate').snap = value;\n\t}\n\n\tget translateSnap() {\n\t\treturn this._controlMap.get('translate').snap;\n\t}\n\n\tset scaleSnap(value) {\n\t\tthis._controlMap.get('scale').snap = value;\n\t}\n\n\tget scaleSnap() {\n\t\treturn this._controlMap.get('scale').snap;\n\t}\n\n\tset rotateSnap(value) {\n\t\tthis._controlMap.get('rotate').snap = value;\n\t}\n\n\tget rotateSnap() {\n\t\treturn this._controlMap.get('rotate').snap;\n\t}\n\n\tupdate() {\n\t\tconst isModify = this._mode === 'all';\n\t\tthis._controlMap.forEach(control => control.update(isModify));\n\t}\n\n\tdispose() {\n\t\tthis._removeEventListeners();\n\n\t\tthis.traverse(child => {\n\t\t\tif (child.isMesh) {\n\t\t\t\tchild.geometry.dispose();\n\t\t\t\tchild.material.dispose();\n\t\t\t}\n\t\t});\n\n\t\tthis._group.reset();\n\t}\n\n\t_addEventListeners() {\n\t\tconst element = this._domElement;\n\t\telement.addEventListener('pointerdown', this._onPointDown);\n\t\telement.addEventListener('pointermove', this._onPointMove);\n\t\telement.addEventListener('pointerup', this._onPointUp);\n\t}\n\n\t_removeEventListeners() {\n\t\tconst element = this._domElement;\n\t\telement.removeEventListener('pointerdown', this._onPointDown);\n\t\telement.removeEventListener('pointermove', this._onPointMove);\n\t\telement.removeEventListener('pointerup', this._onPointUp);\n\t}\n\n\t_onPointDown(e) {\n\t\tif (!this.visible || e.button !== 0) return;\n\n\t\tconst selectedObject = this._selectGizmoMesh(e.clientX, e.clientY);\n\t\tif (selectedObject) {\n\t\t\tthis._triggerGizmoStart(selectedObject.parent.name, selectedObject.name);\n\t\t\tthis.onDragStart && this.onDragStart();\n\t\t}\n\t}\n\n\t_onPointMove(e) {\n\t\tif (!this.visible) return;\n\n\t\tif (!this._currentDraggingControl) {\n\t\t\tthis._onGizmoHoverEnd();\n\n\t\t\tconst selectedObject = this._selectGizmoMesh(e.clientX, e.clientY);\n\t\t\tif (selectedObject) {\n\t\t\t\tthis._onGizmoHoverStart(selectedObject.parent.name, selectedObject.name);\n\t\t\t}\n\t\t} else {\n\t\t\tif (this._mode === 'all') {\n\t\t\t\tthis._controlMap.forEach(control => {\n\t\t\t\t\tif (control !== this._currentDraggingControl) control.visible = false;\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tthis._setRaycaster(e.clientX, e.clientY);\n\t\t\tthis._currentDraggingControl.onMove(this._raycaster.ray);\n\t\t\tthis.onDrag && this.onDrag();\n\t\t}\n\t}\n\n\t_onPointUp(e) {\n\t\tif (!this.visible) return;\n\n\t\tif (this._currentDraggingControl) {\n\t\t\tthis._triggerGizmoEnd();\n\t\t\tthis.onDragEnd && this.onDragEnd();\n\n\t\t\tif (this._mode === 'all') {\n\t\t\t\tthis._controlMap.forEach(control => control.visible = true);\n\t\t\t}\n\t\t}\n\t}\n\n\t_setRaycaster(clientX, clientY) {\n\t\tconst element = this._domElement;\n\n\t\tconst rect = element.getBoundingClientRect();\n\t\tconst style = element.currentStyle || window.getComputedStyle(element);\n\n\t\tconst borderLeftWidth = parseInt(style['borderLeftWidth'], 10);\n\t\tconst borderTopWidth = parseInt(style['borderTopWidth'], 10);\n\n\t\t_vec2_1.x = ((clientX - rect.left - borderLeftWidth) / element.clientWidth) * 2 - 1;\n\t\t_vec2_1.y = -((clientY - rect.top - borderTopWidth) / element.clientHeight) * 2 + 1;\n\n\t\tthis._raycaster.setFromCamera(_vec2_1, this._camera);\n\t}\n\n\t_selectGizmoMesh(clientX, clientY) {\n\t\tthis._setRaycaster(clientX, clientY);\n\n\t\tconst array = this._raycaster.intersectObjects(this._currentControl, true);\n\n\t\tif (array.length === 0) return null;\n\n\t\tlet selectedObject = array[0].object;\n\n\t\t// rotate xyz has lower priority\n\t\tif (array.length > 1) {\n\t\t\tfor (let i = 0; i < array.length; i++) {\n\t\t\t\tconst object = array[i].object;\n\t\t\t\tif (object.name !== 'xyz' || object.parent.name !== 'rotate') {\n\t\t\t\t\tselectedObject = object;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn selectedObject;\n\t}\n\n\t_onGizmoHoverEnd() {\n\t\tif (this._currentHoverControl) {\n\t\t\tthis._currentHoverControl.onHoverEnd();\n\t\t\tthis._currentHoverControl = null;\n\t\t}\n\t}\n\n\t_onGizmoHoverStart(currentType, axisName) {\n\t\tif (!this._currentHoverControl) {\n\t\t\tthis._currentHoverControl = this._controlMap.get(currentType);\n\t\t\tthis._currentHoverControl.onHoverStart(axisName);\n\t\t}\n\t}\n\n\t_triggerGizmoStart(currentType, axisName) {\n\t\tthis._onGizmoHoverEnd();\n\t\tthis._currentDraggingControl = this._controlMap.get(currentType);\n\t\tthis._currentDraggingControl.onMoveStart(this._raycaster.ray, axisName);\n\t}\n\n\t_triggerGizmoEnd() {\n\t\tthis._currentDraggingControl.onMoveEnd();\n\t\tthis._currentDraggingControl = null;\n\n\t\tthis._group.dirty();\n\t}\n\n}\n\n// Global variables\n\nconst _vec2_1 = new Vector2();\n\nconst _vec3_1 = new Vector3();\nconst _vec3_2 = new Vector3();\nconst _vec3_3 = new Vector3();\n\nconst _mat4_1 = new Matrix4();\n\nconst _quat_1 = new Quaternion();\n\nconst _euler_1 = new Euler();\nconst _euler_2 = new Euler();\n\nconst redColor = [1.0, 0.25, 0.25];\nconst greenColor = [0.5, 0.8, 0.2];\nconst blueColor = [0.3, 0.5, 1.0];\nconst whiteColor = [1.0, 1.0, 1.0];\nconst grayColor = [0.75, 0.75, 0.75];\nconst yellowColor = [1.0, 1.0, 0.0];\n\nconst gizmoRenderOrder = 100;\n\n// for snap\nconst _position = new Vector3();\nconst _scale = new Vector3();\nconst _quaternion = new Quaternion();\n\nconst axisVector = {\n\t'x': new Vector3(1, 0, 0),\n\t'y': new Vector3(0, 1, 0),\n\t'z': new Vector3(0, 0, 1),\n\t'xyz': new Vector3(1, 1, 1),\n\t'xy': new Vector3(1, 1, 0),\n\t'yz': new Vector3(0, 1, 1),\n\t'xz': new Vector3(1, 0, 1)\n};\n\nconst axisPlane = {\n\t'x': new Plane(new Vector3(1, 0, 0), 0),\n\t'y': new Plane(new Vector3(0, 1, 0), 0),\n\t'z': new Plane(new Vector3(0, 0, 1), 0),\n\t'xyz': new Plane(new Vector3(0, 0, 0), 0),\n\t'xy': new Plane(new Vector3(0, 0, 1), 0),\n\t'yz': new Plane(new Vector3(1, 0, 0), 0),\n\t'xz': new Plane(new Vector3(0, 1, 0), 0)\n};\n\nconst matchSign = (a, b) => (b < 0 ? -1 : 1) * Math.abs(a);\n\n// Separate class for each control\n\nclass BaseControl extends Object3D {\n\n\tconstructor(name, camera, group) {\n\t\tsuper();\n\n\t\tthis.name = name;\n\n\t\tthis._camera = camera;\n\t\tthis._group = group;\n\n\t\tthis._startGroupMatrix = new Matrix4();\n\t\tthis._startGroupMatrixInverse = new Matrix4();\n\t\tthis._startLocalMatrix = new Matrix4();\n\n\t\tthis._moving = false;\n\n\t\tthis.size = 1;\n\n\t\tthis.snap = null;\n\t}\n\n\tonHoverStart(axisName) {}\n\n\tonHoverEnd() {}\n\n\tonMoveStart(ray, axisName) {\n\t\tconst group = this._group;\n\n\t\tgroup.getWorldMatrix(this._startGroupMatrix);\n\t\tthis._startGroupMatrixInverse.copy(this._startGroupMatrix).invert();\n\n\t\tif (group.objects.length > 0) {\n\t\t\tthis._startLocalMatrix.copy(group.objects[0].matrix);\n\t\t}\n\n\t\tthis._moving = true;\n\t}\n\n\tonMove(ray) {}\n\n\tonMoveEnd() {\n\t\tthis._moving = false;\n\t}\n\n\tupdate(isModify) {}\n\n}\n\nclass TranslateControl extends BaseControl {\n\n\tconstructor(camera, group) {\n\t\tsuper('translate', camera, group);\n\n\t\tthis._translateControlMap = new Map();\n\t\tthis._helperMap = new Map();\n\t\tthis._gizmoPlanes = [];\n\n\t\tthis._selectedAxis = null;\n\n\t\tthis._scale = 1;\n\n\t\tthis._plane = new Plane();\n\n\t\tthis._currPoint = new Vector3();\n\t\tthis._startPoint = new Vector3();\n\n\t\tthis._createAxis();\n\t}\n\n\t_createAxis() {\n\t\tconst lineX = new GizmoMesh('line', 'x', redColor, new Vector3(0.75, 0, 0), new Euler(0, 0, -Math.PI / 2), 1.5);\n\t\tconst arrowX = new GizmoMesh('arrow', 'x', redColor, new Vector3(1.5, 0, 0), new Euler(0, 0, -Math.PI / 2));\n\t\tthis._translateControlMap.set('x', [lineX, arrowX]);\n\t\tthis.add(lineX);\n\t\tthis.add(arrowX);\n\n\t\tconst pickX = new GizmoMesh('pickAxis', 'x', whiteColor, new Vector3(0.75, 0, 0), new Euler(0, 0, -Math.PI / 2));\n\t\tpickX.visible = false;\n\t\tthis.add(pickX);\n\n\t\tconst lineY = new GizmoMesh('line', 'y', greenColor, new Vector3(0, 0.75, 0), new Euler(0, 0, 0), 1.5);\n\t\tconst arrowY = new GizmoMesh('arrow', 'y', greenColor, new Vector3(0, 1.5, 0), new Euler(0, 0, 0));\n\t\tthis._translateControlMap.set('y', [lineY, arrowY]);\n\t\tthis.add(lineY);\n\t\tthis.add(arrowY);\n\n\t\tconst pickY = new GizmoMesh('pickAxis', 'y', whiteColor, new Vector3(0, 0.75, 0), new Euler(0, 0, 0));\n\t\tpickY.visible = false;\n\t\tthis.add(pickY);\n\n\t\tconst lineZ = new GizmoMesh('line', 'z', blueColor, new Vector3(0, 0, 0.75), new Euler(Math.PI / 2, 0, 0), 1.5);\n\t\tconst arrowZ = new GizmoMesh('arrow', 'z', blueColor, new Vector3(0, 0, 1.5), new Euler(Math.PI / 2, 0, 0));\n\t\tthis._translateControlMap.set('z', [lineZ, arrowZ]);\n\t\tthis.add(lineZ);\n\t\tthis.add(arrowZ);\n\n\t\tconst pickZ = new GizmoMesh('pickAxis', 'z', whiteColor, new Vector3(0, 0, 0.75), new Euler(Math.PI / 2, 0, 0));\n\t\tpickZ.visible = false;\n\t\tthis.add(pickZ);\n\n\t\tconst planeXY = new GizmoMesh('plane', 'xy', blueColor, new Vector3(0.18, 0.18, 0), new Euler(Math.PI / 2, 0, 0), 0.3);\n\t\tthis._translateControlMap.set('xy', [planeXY]);\n\t\tthis._gizmoPlanes.push(planeXY);\n\t\tthis.add(planeXY);\n\n\t\tconst pickXY = new GizmoMesh('plane', 'xy', whiteColor, new Vector3(0.25, 0.25, 0), new Euler(Math.PI / 2, 0, 0), 0.5);\n\t\tpickXY.visible = false;\n\t\tthis._gizmoPlanes.push(pickXY);\n\t\tthis.add(pickXY);\n\n\t\tconst planeYZ = new GizmoMesh('plane', 'yz', redColor, new Vector3(0, 0.18, 0.18), new Euler(0, 0, Math.PI / 2), 0.3);\n\t\tthis._translateControlMap.set('yz', [planeYZ]);\n\t\tthis._gizmoPlanes.push(planeYZ);\n\t\tthis.add(planeYZ);\n\n\t\tconst pickYZ = new GizmoMesh('plane', 'yz', whiteColor, new Vector3(0, 0.25, 0.25), new Euler(0, 0, Math.PI / 2), 0.5);\n\t\tpickYZ.visible = false;\n\t\tthis._gizmoPlanes.push(pickYZ);\n\t\tthis.add(pickYZ);\n\n\t\tconst planeXZ = new GizmoMesh('plane', 'xz', greenColor, new Vector3(0.18, 0, 0.18), null, 0.3);\n\t\tthis._translateControlMap.set('xz', [planeXZ]);\n\t\tthis._gizmoPlanes.push(planeXZ);\n\t\tthis.add(planeXZ);\n\n\t\tconst pickXZ = new GizmoMesh('plane', 'xz', whiteColor, new Vector3(0.25, 0, 0.25), null, 0.5);\n\t\tpickXZ.visible = false;\n\t\tthis._gizmoPlanes.push(pickXZ);\n\t\tthis.add(pickXZ);\n\n\t\tconst helperX = new GizmoMesh('axishelper', 'x', yellowColor, new Vector3(-1e3, 0, 0), null);\n\t\thelperX.visible = false;\n\t\tthis._helperMap.set('x', helperX);\n\t\tthis.add(helperX);\n\n\t\tconst helperY = new GizmoMesh('axishelper', 'y', yellowColor, new Vector3(0, -1e3, 0), new Euler(0, 0, Math.PI / 2));\n\t\thelperY.visible = false;\n\t\tthis._helperMap.set('y', helperY);\n\t\tthis.add(helperY);\n\n\t\tconst helperZ = new GizmoMesh('axishelper', 'z', yellowColor, new Vector3(0, 0, -1e3), new Euler(0, -Math.PI / 2, 0));\n\t\thelperZ.visible = false;\n\t\tthis._helperMap.set('z', helperZ);\n\t\tthis.add(helperZ);\n\t}\n\n\tonHoverStart(axisName) {\n\t\tthis._selectedAxis = axisName;\n\t\tconst currentAxis = this._translateControlMap.get(this._selectedAxis);\n\t\tcurrentAxis.forEach(axis => axis.highlight());\n\t}\n\n\tonHoverEnd() {\n\t\tconst currentAxis = this._translateControlMap.get(this._selectedAxis);\n\t\tcurrentAxis.forEach(axis => axis.unhighlight());\n\t\tthis._selectedAxis = null;\n\t}\n\n\tonMoveStart(ray, axisName) {\n\t\tthis._selectedAxis = axisName;\n\n\t\tsuper.onMoveStart(ray, axisName);\n\n\t\tthis._startScale = this._scale;\n\n\t\tthis._getHitPlane();\n\t\tthis._calRayIntersection(ray, this._startPoint);\n\n\t\tthis._translateControlMap.forEach((value, key) => {\n\t\t\tif (key === axisName) {\n\t\t\t\tvalue.forEach(axis => axis.yellow());\n\t\t\t} else {\n\t\t\t\tvalue.forEach(axis => axis.visible = false);\n\t\t\t}\n\t\t});\n\t}\n\n\tonMove(ray) {\n\t\tthis._calRayIntersection(ray, this._currPoint);\n\t\tconst currScale = this._scale;\n\t\tconst { _startScale } = this;\n\n\t\tthis._helperMap.forEach((value, key) => {\n\t\t\tif (this._selectedAxis.indexOf(key) !== -1) {\n\t\t\t\tvalue.visible = true;\n\t\t\t}\n\t\t});\n\n\t\t_vec3_1.x = this._currPoint.x - (this._startPoint.x / _startScale) * currScale;\n\t\t_vec3_1.y = this._currPoint.y - (this._startPoint.y / _startScale) * currScale;\n\t\t_vec3_1.z = this._currPoint.z - (this._startPoint.z / _startScale) * currScale;\n\n\t\tconst localAxis = axisVector[this._selectedAxis];\n\n\t\t_vec3_1.x *= localAxis.x;\n\t\t_vec3_1.y *= localAxis.y;\n\t\t_vec3_1.z *= localAxis.z;\n\n\t\tthis._applySnap(_vec3_1);\n\n\t\t_mat4_1.identity();\n\t\t_mat4_1.elements[12] = _vec3_1.x;\n\t\t_mat4_1.elements[13] = _vec3_1.y;\n\t\t_mat4_1.elements[14] = _vec3_1.z;\n\n\t\t_mat4_1.premultiply(this._startGroupMatrix);\n\n\t\tthis._group.setWorldMatrix(_mat4_1);\n\t}\n\n\tonMoveEnd() {\n\t\tthis._translateControlMap.forEach(control => {\n\t\t\tcontrol.forEach(axis => {\n\t\t\t\taxis.material.diffuse.copy(axis.material._color);\n\t\t\t\taxis.material.opacity = axis.material._opacity;\n\t\t\t\taxis.visible = true;\n\t\t\t});\n\t\t});\n\n\t\tthis._helperMap.forEach(value => {\n\t\t\tvalue.visible = false;\n\t\t});\n\n\t\tsuper.onMoveEnd();\n\t}\n\n\t_getHitPlane() {\n\t\tswitch (this._selectedAxis) {\n\t\t\tcase 'x':\n\t\t\tcase 'y':\n\t\t\tcase 'z': {\n\t\t\t\t_vec3_1.setFromMatrixPosition(this._camera.worldMatrix);\n\t\t\t\t_vec3_1.applyMatrix4(this._startGroupMatrixInverse);\n\t\t\t\tconst localAxis = axisVector[this._selectedAxis];\n\n\t\t\t\t_vec3_2.crossVectors(_vec3_1, localAxis);\n\n\t\t\t\tthis._plane.setFromCoplanarPoints(localAxis, _vec3_1.set(0, 0, 0), _vec3_2);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase 'xy':\n\t\t\tcase 'yz':\n\t\t\tcase 'xz': {\n\t\t\t\tthis._plane.copy(axisPlane[this._selectedAxis]);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\t_calRayIntersection(ray, out) {\n\t\t// transform ray to local space\n\t\tray.origin.applyMatrix4(this._startGroupMatrixInverse);\n\t\tray.direction.transformDirection(this._startGroupMatrixInverse);\n\t\tray.intersectPlane(this._plane, out);\n\t}\n\n\tupdate() {\n\t\tthis._resizeControl();\n\t\tthis._adaptPlanes();\n\t}\n\n\t_resizeControl() {\n\t\tthis._group.getWorldMatrix(_mat4_1);\n\n\t\tconst ele = this._camera.projectionMatrix.elements;\n\t\tlet factor;\n\t\tif (ele[15] > 0) {\n\t\t\tfactor = 2 / ele[5];\n\t\t} else {\n\t\t\t_vec3_1.setFromMatrixPosition(_mat4_1);\n\t\t\t_vec3_2.setFromMatrixPosition(this._camera.worldMatrix);\n\t\t\tfactor = _vec3_1.distanceTo(_vec3_2) * Math.min(1.9 / ele[5], 7);\n\t\t}\n\t\tfactor *= this.size / 8;\n\n\t\tthis._scale = factor;\n\n\t\tthis.worldMatrix.copy(_mat4_1);\n\t\tconst parentMatrixInverse = _mat4_1.copy(this.parent.worldMatrix).invert();\n\t\tthis.matrix.multiplyMatrices(parentMatrixInverse, this.worldMatrix);\n\t\tthis.matrix.decompose(this.position, this.quaternion, this.scale);\n\n\t\tthis.scale.multiplyScalar(factor);\n\t}\n\n\t_adaptPlanes() {\n\t\tif (this._moving) return;\n\n\t\t_mat4_1.copy(this.worldMatrix).invert().multiply(this._camera.worldMatrix);\n\t\tconst cameraVector = _vec3_1.setFromMatrixPosition(_mat4_1);\n\n\t\tfor (let i = 0, l = this._gizmoPlanes.length; i < l; i++) {\n\t\t\tconst plane = this._gizmoPlanes[i];\n\t\t\tif (plane.name === 'xz') {\n\t\t\t\tplane.position.x = matchSign(plane.position.x, cameraVector.x);\n\t\t\t\tplane.position.z = matchSign(plane.position.z, cameraVector.z);\n\t\t\t} else if (plane.name === 'xy') {\n\t\t\t\tplane.position.x = matchSign(plane.position.x, cameraVector.x);\n\t\t\t\tplane.position.y = matchSign(plane.position.y, cameraVector.y);\n\t\t\t} else if (plane.name === 'yz') {\n\t\t\t\tplane.position.y = matchSign(plane.position.y, cameraVector.y);\n\t\t\t\tplane.position.z = matchSign(plane.position.z, cameraVector.z);\n\t\t\t}\n\t\t}\n\t}\n\n\t_applySnap(target) {\n\t\tconst snap = this.snap;\n\n\t\tif (!snap) return;\n\n\t\tconst group = this._group;\n\n\t\tif (group.coordinateType === 'global' || group.objects.length > 1) {\n\t\t\tthis._startGroupMatrix.decompose(_position, _quaternion, _scale);\n\t\t} else {\n\t\t\tthis._startLocalMatrix.decompose(_position, _quaternion, _scale);\n\t\t}\n\n\t\t_position.applyQuaternion(_quaternion.conjugate());\n\n\t\tif (target.x !== 0) {\n\t\t\ttarget.x += _position.x;\n\t\t\ttarget.x = Math.round(target.x / snap) * snap;\n\t\t\ttarget.x -= _position.x;\n\t\t}\n\n\t\tif (target.y !== 0) {\n\t\t\ttarget.y += _position.y;\n\t\t\ttarget.y = Math.round(target.y / snap) * snap;\n\t\t\ttarget.y -= _position.y;\n\t\t}\n\n\t\tif (target.z !== 0) {\n\t\t\ttarget.z += _position.z;\n\t\t\ttarget.z = Math.round(target.z / snap) * snap;\n\t\t\ttarget.z -= _position.z;\n\t\t}\n\t}\n\n}\n\nclass ScaleControl extends BaseControl {\n\n\tconstructor(camera, group) {\n\t\tsuper('scale', camera, group);\n\n\t\tthis._scaleControlMap = new Map();\n\n\t\tthis._selectedAxis = null;\n\n\t\tthis._plane = new Plane();\n\n\t\tthis._currPoint = new Vector3();\n\t\tthis._startPoint = new Vector3();\n\n\t\tthis._factorVec = new Vector3();\n\n\t\tthis._createAxis();\n\t}\n\n\t_createAxis() {\n\t\tconst lineX = new GizmoMesh('line', 'x', redColor, new Vector3(0.75, 0, 0), new Euler(0, 0, -Math.PI / 2), 1.3);\n\t\tconst cubeX = new GizmoMesh('box', 'x', redColor, new Vector3(1.3, 0, 0), new Euler(0, 0, 0), 0.2);\n\t\tthis._scaleControlMap.set('x', [lineX, cubeX]);\n\t\tthis.add(lineX);\n\t\tthis.add(cubeX);\n\n\t\tconst pickX = new GizmoMesh('pickAxis', 'x', whiteColor, new Vector3(0.75, 0, 0), new Euler(0, 0, -Math.PI / 2));\n\t\tpickX.visible = false;\n\t\tthis.add(pickX);\n\n\t\tconst lineY = new GizmoMesh('line', 'y', greenColor, new Vector3(0, 0.75, 0), new Euler(0, 0, 0), 1.3);\n\t\tconst cubeY = new GizmoMesh('box', 'y', greenColor, new Vector3(0, 1.3, 0), new Euler(0, 0, 0), 0.2);\n\t\tthis._scaleControlMap.set('y', [lineY, cubeY]);\n\t\tthis.add(lineY);\n\t\tthis.add(cubeY);\n\n\t\tconst pickY = new GizmoMesh('pickAxis', 'y', whiteColor, new Vector3(0, 0.75, 0), new Euler(0, 0, 0));\n\t\tpickY.visible = false;\n\t\tthis.add(pickY);\n\n\t\tconst lineZ = new GizmoMesh('line', 'z', blueColor, new Vector3(0, 0, 0.75), new Euler(Math.PI / 2, 0, 0), 1.3);\n\t\tconst cubeZ = new GizmoMesh('box', 'z', blueColor, new Vector3(0, 0, 1.3), new Euler(0, 0, 0), 0.2);\n\t\tthis._scaleControlMap.set('z', [lineZ, cubeZ]);\n\t\tthis.add(lineZ);\n\t\tthis.add(cubeZ);\n\n\t\tconst pickZ = new GizmoMesh('pickAxis', 'z', whiteColor, new Vector3(0, 0, 0.75), new Euler(Math.PI / 2, 0, 0));\n\t\tpickZ.visible = false;\n\t\tthis.add(pickZ);\n\n\t\tconst cubeXYZ = new GizmoMesh('box', 'xyz', grayColor, new Vector3(0, 0, 0), new Euler(0, 0, 0), 0.32);\n\t\tthis._scaleControlMap.set('xyz', [cubeXYZ]);\n\t\tthis.add(cubeXYZ);\n\t}\n\n\tonHoverStart(axisName) {\n\t\tthis._selectedAxis = axisName;\n\t\tconst currentAxis = this._scaleControlMap.get(this._selectedAxis);\n\t\tcurrentAxis.forEach(axis => axis.highlight());\n\t}\n\n\tonHoverEnd() {\n\t\tconst currentAxis = this._scaleControlMap.get(this._selectedAxis);\n\t\tcurrentAxis.forEach(axis => axis.unhighlight());\n\t\tthis._selectedAxis = null;\n\t}\n\n\tonMoveStart(ray, axisName) {\n\t\tthis._selectedAxis = axisName;\n\n\t\tsuper.onMoveStart(ray, axisName);\n\n\t\tthis._getHitPlane();\n\t\tthis._calRayIntersection(ray, this._startPoint);\n\n\t\tconst localAxis = axisVector[this._selectedAxis];\n\t\tthis._factorVec.set(\n\t\t\tthis._startPoint.x === 0 ? 0 : localAxis.x / this._startPoint.x,\n\t\t\tthis._startPoint.y === 0 ? 0 : localAxis.y / this._startPoint.y,\n\t\t\tthis._startPoint.z === 0 ? 0 : localAxis.z / this._startPoint.z\n\t\t);\n\n\t\tthis._scaleControlMap.forEach((value, key) => {\n\t\t\tif (key === axisName) {\n\t\t\t\tvalue.forEach(axis => axis.yellow());\n\t\t\t} else {\n\t\t\t\tvalue.forEach(axis => axis.visible = false);\n\t\t\t}\n\t\t});\n\t}\n\n\tonMove(ray) {\n\t\tthis._calRayIntersection(ray, this._currPoint);\n\t\tconst { _factorVec: factorVec } = this;\n\n\t\tif (this._selectedAxis === 'xyz') {\n\t\t\tconst start = this._startPoint.getLength();\n\t\t\tconst end = this._currPoint.getLength();\n\n\t\t\t_vec3_1.x = end / start;\n\t\t\t_vec3_1.y = end / start;\n\t\t\t_vec3_1.z = end / start;\n\t\t} else { // x y z\n\t\t\t_vec3_1.subVectors(this._currPoint, this._startPoint);\n\t\t\t_vec3_1.x = _vec3_1.x * factorVec.x + 1;\n\t\t\t_vec3_1.y = _vec3_1.y * factorVec.y + 1;\n\t\t\t_vec3_1.z = _vec3_1.z * factorVec.z + 1;\n\t\t}\n\n\t\tthis._applySnap(_vec3_1);\n\n\t\t_mat4_1.identity();\n\t\t_mat4_1.elements[0] = _vec3_1.x;\n\t\t_mat4_1.elements[5] = _vec3_1.y;\n\t\t_mat4_1.elements[10] = _vec3_1.z;\n\n\t\t_mat4_1.premultiply(this._startGroupMatrix);\n\n\t\tthis._group.setWorldMatrix(_mat4_1);\n\t}\n\n\tonMoveEnd() {\n\t\tthis._scaleControlMap.forEach(control => {\n\t\t\tcontrol.forEach(axis => {\n\t\t\t\taxis.material.diffuse.copy(axis.material._color);\n\t\t\t\taxis.material.opacity = axis.material._opacity;\n\t\t\t\taxis.visible = true;\n\t\t\t});\n\t\t});\n\n\t\tsuper.onMoveEnd();\n\t}\n\n\tupdate(isModify) {\n\t\tthis._resizeControl(isModify);\n\t}\n\n\t_getHitPlane() {\n\t\t_vec3_1.setFromMatrixPosition(this._camera.worldMatrix);\n\t\t_vec3_1.applyMatrix4(this._startGroupMatrixInverse);\n\t\tconst localAxis = axisVector[this._selectedAxis];\n\n\t\t_vec3_2.crossVectors(_vec3_1, localAxis);\n\n\t\tthis._plane.setFromCoplanarPoints(localAxis, _vec3_1.set(0, 0, 0), _vec3_2);\n\t}\n\n\t_calRayIntersection(ray, out) {\n\t\tray.origin.applyMatrix4(this._startGroupMatrixInverse);\n\t\tray.direction.transformDirection(this._startGroupMatrixInverse);\n\t\tray.intersectPlane(this._plane, out);\n\t}\n\n\t_resizeControl(isModify) {\n\t\tthis._group.getWorldMatrix(_mat4_1);\n\n\t\tconst ele = this._camera.projectionMatrix.elements;\n\t\tlet factor;\n\t\tif (ele[15] > 0) {\n\t\t\tfactor = 2 / ele[5];\n\t\t} else {\n\t\t\t_vec3_1.setFromMatrixPosition(_mat4_1);\n\t\t\t_vec3_2.setFromMatrixPosition(this._camera.worldMatrix);\n\t\t\tfactor = _vec3_1.distanceTo(_vec3_2) * Math.min(1.9 / ele[5], 7);\n\t\t}\n\t\tfactor *= this.size / 8;\n\n\t\tif (isModify) {\n\t\t\tfactor *= 0.8;\n\t\t}\n\n\t\tthis.worldMatrix.copy(_mat4_1);\n\t\tconst parentMatrixInverse = _mat4_1.copy(this.parent.worldMatrix).invert();\n\t\tthis.matrix.multiplyMatrices(parentMatrixInverse, this.worldMatrix);\n\t\tthis.matrix.decompose(this.position, this.quaternion, this.scale);\n\n\t\tthis.scale.multiplyScalar(factor);\n\n\t\t// fix scale?\n\t\tif (ele[15] === 0) {\n\t\t\tconst el = this.worldMatrix.elements;\n\t\t\tconst sx = 1 / Math.sqrt(el[0] * el[0] + el[1] * el[1] + el[2] * el[2]);\n\t\t\tconst sy = 1 / Math.sqrt(el[4] * el[4] + el[5] * el[5] + el[6] * el[6]);\n\t\t\tconst sz = 1 / Math.sqrt(el[8] * el[8] + el[9] * el[9] + el[10] * el[10]);\n\n\t\t\tthis.scale.x *= sx;\n\t\t\tthis.scale.y *= sy;\n\t\t\tthis.scale.z *= sz;\n\t\t}\n\t}\n\n\t_applySnap(target) {\n\t\tconst snap = this.snap;\n\n\t\tif (!snap) return;\n\n\t\tconst { _factorVec: factorVec } = this;\n\n\t\tthis._startLocalMatrix.decompose(_position, _quaternion, _scale);\n\n\t\tif (factorVec.x !== 0) {\n\t\t\ttarget.x *= _scale.x;\n\t\t\ttarget.x = Math.round(target.x / snap) * snap || snap;\n\t\t\ttarget.x /= _scale.x;\n\t\t}\n\n\t\tif (factorVec.y !== 0) {\n\t\t\ttarget.y *= _scale.y;\n\t\t\ttarget.y = Math.round(target.y / snap) * snap || snap;\n\t\t\ttarget.y /= _scale.y;\n\t\t}\n\n\t\tif (factorVec.z !== 0) {\n\t\t\ttarget.z *= _scale.z;\n\t\t\ttarget.z = Math.round(target.z / snap) * snap || snap;\n\t\t\ttarget.z /= _scale.z;\n\t\t}\n\t}\n\n}\n\nclass RotateControl extends BaseControl {\n\n\tconstructor(camera, group) {\n\t\tsuper('rotate', camera, group);\n\n\t\tthis.rotateCircleRadius = 1.4;\n\t\tthis.rotateCircleRadiusE = 1.4;\n\n\t\tthis._rotateControlMap = new Map();\n\t\tthis._pickHelper = new Map();\n\t\tthis._lineHelperE = null;\n\t\tthis._lineHelperS = null;\n\t\tthis._rotateHelper = null;\n\n\t\tthis._selectedAxis = null;\n\n\t\tthis._plane = new Plane();\n\n\t\tthis._startPointUnit = new Vector3();\n\t\tthis._currPointUnit = new Vector3();\n\n\t\tthis._needsUpdate = true;\n\n\t\tthis._finalRad = 0;\n\t\tthis._previousRad = 0;\n\n\t\tthis._eye = new Vector3();\n\n\t\tthis._createAxis();\n\t}\n\n\t_createAxis() {\n\t\tconst axisE = new GizmoMesh('torus', 'e', grayColor, new Vector3(0, 0, 0), new Euler(0, 0, 0), this.rotateCircleRadiusE, Math.PI * 2);\n\t\tthis._rotateControlMap.set('e', axisE);\n\t\tthis.add(axisE);\n\t\tconst pickE = new GizmoMesh('torus', 'e', whiteColor, new Vector3(0, 0, 0), new Euler(0, 0, 0), this.rotateCircleRadiusE, Math.PI * 2, 0.2);\n\t\tpickE.visible = false;\n\t\tthis._pickHelper.set('e', pickE);\n\t\tthis.add(pickE);\n\t\tconst axisZ = new GizmoMesh('torus', 'z', blueColor, new Vector3(0, 0, 0), new Euler(0, 0, -Math.PI / 2), this.rotateCircleRadius);\n\t\tthis._rotateControlMap.set('z', axisZ);\n\t\tthis.add(axisZ);\n\t\tconst pickZ = new GizmoMesh('torus', 'z', whiteColor, new Vector3(0, 0, 0), new Euler(0, 0, -Math.PI / 2), this.rotateCircleRadius, Math.PI, 0.2);\n\t\tpickZ.visible = false;\n\t\tthis._pickHelper.set('z', pickZ);\n\t\tthis.add(pickZ);\n\t\tthis._axisZQuaternionStart = axisZ.quaternion.clone();\n\t\tconst axisY = new GizmoMesh('torus', 'y', greenColor, new Vector3(0, 0, 0), new Euler(Math.PI / 2, 0, 0), this.rotateCircleRadius);\n\t\tthis._rotateControlMap.set('y', axisY);\n\t\tthis.add(axisY);\n\t\tconst pickY = new GizmoMesh('torus', 'y', whiteColor, new Vector3(0, 0, 0), new Euler(Math.PI / 2, 0, 0), this.rotateCircleRadius, Math.PI, 0.2);\n\t\tpickY.visible = false;\n\t\tthis._pickHelper.set('y', pickY);\n\t\tthis.add(pickY);\n\t\tthis._axisYQuaternionStart = axisY.quaternion.clone();\n\t\tconst axisX = new GizmoMesh('torus', 'x', redColor, new Vector3(0, 0, 0), new Euler(0, Math.PI / 2, Math.PI / 2), this.rotateCircleRadius);\n\t\tthis._rotateControlMap.set('x', axisX);\n\t\tthis.add(axisX);\n\t\tconst pickX = new GizmoMesh('torus', 'x', whiteColor, new Vector3(0, 0, 0), new Euler(0, Math.PI / 2, Math.PI / 2), this.rotateCircleRadius, Math.PI, 0.2);\n\t\tpickX.visible = false;\n\t\tthis._pickHelper.set('x', pickX);\n\t\tthis.add(pickX);\n\t\tthis._axisXQuaternionStart = axisX.quaternion.clone();\n\t\tconst center = new GizmoMesh('sphere', 'xyz', whiteColor, new Vector3(0, 0, 0), new Euler(0, 0, 0), this.rotateCircleRadius);\n\t\tthis._rotateControlMap.set('xyz', center);\n\t\tthis.add(center);\n\n\t\tthis._lineHelperS = new GizmoMesh('linehelper', 'helperS', yellowColor);\n\t\tthis._lineHelperS.visible = false;\n\t\tthis.add(this._lineHelperS);\n\t\tthis._lineHelperE = new GizmoMesh('linehelper', 'helperE', yellowColor);\n\t\tthis._lineHelperE.visible = false;\n\t\tthis.add(this._lineHelperE);\n\t\tthis._rotateHelper = new GizmoMesh('rotatehelper', 'rotatehelper', yellowColor);\n\t\tthis._rotateHelper.visible = false;\n\t\tthis.add(this._rotateHelper);\n\t}\n\n\tonHoverStart(axisName) {\n\t\tthis._selectedAxis = axisName;\n\t\tconst currentAxis = this._rotateControlMap.get(this._selectedAxis);\n\t\tcurrentAxis.highlight();\n\t}\n\n\tonHoverEnd() {\n\t\tconst currentAxis = this._rotateControlMap.get(this._selectedAxis);\n\t\tcurrentAxis.unhighlight();\n\t\tthis._selectedAxis = null;\n\t}\n\n\tonMoveStart(ray, axisName) {\n\t\tthis._selectedAxis = axisName;\n\n\t\tsuper.onMoveStart(ray, axisName);\n\n\t\tconst cameraPos = _vec3_1.setFromMatrixPosition(this._camera.worldMatrix);\n\t\tconst gizmoPos = _vec3_2.setFromMatrixPosition(this._startGroupMatrix);\n\t\tconst eye = _vec3_3.subVectors(cameraPos, gizmoPos).normalize();\n\t\teye.transformDirection(this._startGroupMatrixInverse);\n\t\tthis._eye.copy(eye);\n\n\t\tthis._calRayIntersection(ray, this._startPointUnit);\n\t\tif (this._selectedAxis !== 'xyz') {\n\t\t\tthis._lineHelperS.visible = true;\n\t\t\tthis._lineHelperS.geometry.updateLine(_vec3_1.set(0, 0, 0), this._startPointUnit);\n\t\t}\n\n\t\tthis._rotateControlMap.forEach((value, key) => {\n\t\t\tif (key === axisName) {\n\t\t\t\tif (axisName === 'xyz') {\n\t\t\t\t\tvalue.highlight();\n\t\t\t\t} else {\n\t\t\t\t\tvalue.yellow();\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tvalue.visible = false;\n\t\t\t}\n\t\t});\n\n\t\tif (this._selectedAxis !== 'e' && this._selectedAxis !== 'xyz') {\n\t\t\tthis._rotateControlMap.get(this._selectedAxis).geometry.updateTorus(this.rotateCircleRadius, Math.PI * 2);\n\t\t}\n\n\t\tthis._needsUpdate = false;\n\t}\n\n\tonMove(ray) {\n\t\tthis._calRayIntersection(ray, this._currPointUnit);\n\n\t\tlet localAxis, rad;\n\t\tif (this._selectedAxis === 'xyz') {\n\t\t\t_vec3_1.copy(this._currPointUnit).sub(this._startPointUnit);\n\t\t\tlocalAxis = _vec3_3.copy(_vec3_1).cross(this._eye).normalize();\n\t\t\trad = _vec3_1.dot(_vec3_2.copy(localAxis).cross(this._eye));\n\t\t} else {\n\t\t\tif (this._selectedAxis === 'e') {\n\t\t\t\tlocalAxis = this._eye;\n\t\t\t\trad = this._getFinalRad(localAxis, this.rotateCircleRadiusE);\n\t\t\t} else {\n\t\t\t\tlocalAxis = axisVector[this._selectedAxis];\n\t\t\t\trad = this._getFinalRad(localAxis, this.rotateCircleRadius);\n\t\t\t}\n\t\t}\n\t\t_quat_1.setFromAxisAngle(localAxis, rad);\n\n\t\tif (this.snap && this._selectedAxis !== 'e') {\n\t\t\t_euler_1.setFromQuaternion(_quat_1);\n\t\t\tthis._applySnap(_euler_1);\n\t\t\t_quat_1.setFromEuler(_euler_1);\n\n\t\t\t// fix rad\n\t\t\tif (this._selectedAxis === 'x') {\n\t\t\t\trad = this._getSnapRad(_euler_1.x, rad);\n\t\t\t} else if (this._selectedAxis === 'y') {\n\t\t\t\trad = this._getSnapRad(_euler_1.y, rad, true);\n\t\t\t} else if (this._selectedAxis === 'z') {\n\t\t\t\trad = this._getSnapRad(_euler_1.z, rad);\n\t\t\t}\n\t\t}\n\n\t\t_mat4_1.identity();\n\t\t_quat_1.toMatrix4(_mat4_1);\n\n\t\tif (this._selectedAxis !== 'xyz') {\n\t\t\tthis._rotateHelper.geometry.updateCircle(this._startPointUnit, localAxis, -rad);\n\t\t\tthis._rotateHelper.visible = true;\n\n\t\t\t_quat_1.setFromAxisAngle(localAxis, -rad);\n\t\t\t_vec3_2.copy(this._startPointUnit).applyQuaternion(_quat_1);\n\t\t\tthis._lineHelperE.geometry.updateLine(_vec3_1.set(0, 0, 0), _vec3_2);\n\t\t\tthis._lineHelperE.visible = true;\n\t\t}\n\n\t\t_mat4_1.premultiply(this._startGroupMatrix);\n\n\t\tthis._group.setWorldMatrix(_mat4_1);\n\t}\n\n\tonMoveEnd() {\n\t\tthis._rotateHelper.visible = false;\n\t\tthis._lineHelperS.visible = false;\n\t\tthis._lineHelperE.visible = false;\n\n\t\tthis._finalRad = 0;\n\t\tthis._previousRad = 0;\n\t\tif (this._selectedAxis !== 'e' && this._selectedAxis !== 'xyz') {\n\t\t\tthis._rotateControlMap.get(this._selectedAxis).geometry.updateTorus(this.rotateCircleRadius, Math.PI);\n\t\t}\n\n\t\tthis._rotateControlMap.forEach(control => {\n\t\t\tcontrol.material.diffuse.copy(control.material._color);\n\t\t\tcontrol.material.opacity = control.material._opacity;\n\t\t\tcontrol.visible = true;\n\t\t});\n\n\t\tthis._needsUpdate = true;\n\n\t\tsuper.onMoveEnd();\n\t}\n\n\t_calRayIntersection(ray, out) {\n\t\t// transform ray to local space\n\t\tray.origin.applyMatrix4(this._startGroupMatrixInverse);\n\t\tray.direction.transformDirection(this._startGroupMatrixInverse);\n\n\t\tif (this._selectedAxis === 'e') {\n\t\t\tthis._plane.normal.copy(this._eye);\n\t\t\tray.intersectPlane(this._plane, out);\n\t\t\tout.normalize().multiplyScalar(this.rotateCircleRadiusE);\n\t\t} else if (this._selectedAxis === 'xyz') {\n\t\t\tthis._plane.normal.copy(this._eye);\n\t\t\tray.intersectPlane(this._plane, out);\n\t\t} else {\n\t\t\tray.intersectPlane(axisPlane[this._selectedAxis], out);\n\t\t\tout.normalize().multiplyScalar(this.rotateCircleRadius);\n\t\t}\n\t}\n\n\t_getFinalRad(rotateAxis, radius) {\n\t\tconst p1 = this._startPointUnit;\n\t\tconst p2 = this._currPointUnit;\n\n\t\tconst dot = p1.dot(p2);\n\t\t_vec3_1.crossVectors(p1, p2);\n\t\tconst direction = _vec3_1.dot(rotateAxis);\n\t\tconst currentCos = Math.min(1, Math.max(-1, dot / (radius * radius))); // clamp value to the range [-1, 1] to prevent NaN\n\t\tconst currentRad = Math.sign(direction) * Math.acos(currentCos);\n\t\tconst incrementRad = currentRad - this._previousRad;\n\t\tif (this._previousRad * currentRad < 0) {\n\t\t\tMath.abs(currentRad) < Math.PI / 2\n\t\t\t\t? (this._finalRad += incrementRad)\n\t\t\t\t: (this._finalRad += -Math.sign(incrementRad) * (2 * Math.PI - Math.abs(incrementRad)));\n\t\t} else {\n\t\t\tthis._finalRad += incrementRad;\n\t\t}\n\t\tthis._previousRad = currentRad;\n\t\treturn this._finalRad;\n\t}\n\n\t_getSnapRad(euler, rad, isY = false) {\n\t\tconst period = isY ? Math.PI : Math.PI * 2;\n\n\t\tlet finalRad;\n\n\t\tif (Math.abs(rad) % period <= (period / 2)) {\n\t\t\tfinalRad = euler;\n\t\t} else {\n\t\t\tif (Math.sign(euler) === 0) {\n\t\t\t\tfinalRad = Math.sign(rad) * (period - Math.abs(euler));\n\t\t\t} else {\n\t\t\t\tfinalRad = (isY ? 1 : -1) * Math.sign(euler) * (period - Math.abs(euler));\n\t\t\t}\n\t\t}\n\n\t\tif (Math.abs(rad) >= period) {\n\t\t\tif (isY) {\n\t\t\t\tfinalRad = Math.sign(rad) * Math.abs(finalRad);\n\t\t\t}\n\t\t\tfinalRad += Math.sign(rad) * Math.floor(Math.abs(rad) / period) * period;\n\t\t}\n\n\t\treturn finalRad;\n\t}\n\n\tupdate() {\n\t\tthis._resizeControl();\n\t\tthis._updateAxisTransform();\n\t}\n\n\t_updateAxisTransform() {\n\t\tif (!this._needsUpdate) return;\n\n\t\tconst cameraPos = _vec3_1.setFromMatrixPosition(this._camera.worldMatrix);\n\t\tconst gizmoPos = _vec3_2.setFromMatrixPosition(this.worldMatrix);\n\t\tconst eye = _vec3_3.subVectors(cameraPos, gizmoPos).normalize();\n\n\t\teye.transformDirection(_mat4_1.copy(this.worldMatrix).invert());\n\n\t\tthis._eye.copy(eye);\n\n\t\tconst { x, y, z } = eye;\n\n\t\t_quat_1.setFromAxisAngle(axisVector['z'], Math.atan2(-y, z));\n\t\t_quat_1.multiplyQuaternions(this._axisXQuaternionStart, _quat_1);\n\t\tthis._rotateControlMap.get('x').quaternion.copy(_quat_1);\n\t\tthis._pickHelper.get('x').quaternion.copy(_quat_1);\n\n\t\t_quat_1.setFromAxisAngle(axisVector['z'], Math.atan2(-x, z));\n\t\t_quat_1.multiplyQuaternions(this._axisYQuaternionStart, _quat_1);\n\t\tthis._rotateControlMap.get('y').quaternion.copy(_quat_1);\n\t\tthis._pickHelper.get('y').quaternion.copy(_quat_1);\n\n\t\t_quat_1.setFromAxisAngle(axisVector['z'], Math.atan2(y, x));\n\t\t_quat_1.multiplyQuaternions(this._axisZQuaternionStart, _quat_1);\n\t\tthis._rotateControlMap.get('z').quaternion.copy(_quat_1);\n\t\tthis._pickHelper.get('z').quaternion.copy(_quat_1);\n\n\t\tthis._rotateControlMap.get('e').quaternion.setFromRotationMatrix(_mat4_1.lookAtRH(eye, _vec3_1.set(0, 0, 0), axisVector['z']));\n\t\tthis._pickHelper.get('e').quaternion.setFromRotationMatrix(_mat4_1.lookAtRH(eye, _vec3_1.set(0, 0, 0), axisVector['z']));\n\t}\n\n\t_resizeControl() {\n\t\tthis._group.getWorldMatrix(_mat4_1);\n\n\t\tconst ele = this._camera.projectionMatrix.elements;\n\t\tlet factor;\n\t\tif (ele[15] > 0) {\n\t\t\tfactor = 2 / ele[5];\n\t\t} else {\n\t\t\t_vec3_1.setFromMatrixPosition(_mat4_1);\n\t\t\t_vec3_2.setFromMatrixPosition(this._camera.worldMatrix);\n\t\t\tfactor = _vec3_1.distanceTo(_vec3_2) * Math.min(1.9 / ele[5], 7);\n\t\t}\n\t\tfactor *= this.size / 8;\n\n\t\tthis.worldMatrix.copy(_mat4_1);\n\t\tconst parentMatrixInverse = _mat4_1.copy(this.parent.worldMatrix).invert();\n\t\tthis.matrix.multiplyMatrices(parentMatrixInverse, this.worldMatrix);\n\t\tthis.matrix.decompose(this.position, this.quaternion, this.scale);\n\n\t\tthis.scale.multiplyScalar(factor);\n\t}\n\n\t_applySnap(target) {\n\t\tconst snap = this.snap;\n\n\t\tif (!snap) return;\n\n\t\tthis._startLocalMatrix.decompose(_position, _quaternion, _scale);\n\n\t\t_euler_2.setFromQuaternion(_quaternion);\n\n\t\tif (target.x) {\n\t\t\ttarget.x += _euler_2.x;\n\t\t\ttarget.x = Math.round(target.x / snap) * snap;\n\t\t\ttarget.x -= _euler_2.x;\n\t\t}\n\n\t\tif (target.y) {\n\t\t\ttarget.y += _euler_2.y;\n\t\t\ttarget.y = Math.round(target.y / snap) * snap;\n\t\t\ttarget.y -= _euler_2.y;\n\t\t}\n\n\t\tif (target.z) {\n\t\t\ttarget.z += _euler_2.z;\n\t\t\ttarget.z = Math.round(target.z / snap) * snap;\n\t\t\ttarget.z -= _euler_2.z;\n\t\t}\n\t}\n\n}\n\n// GizmoMesh and geometries\n\nclass GizmoMesh extends Mesh {\n\n\tconstructor(type, name, color, position, rotation, size, arc, tube) {\n\t\tconst material = new GizmoMaterial();\n\t\tlet geometry;\n\n\t\tswitch (type) {\n\t\t\tcase 'line':\n\t\t\t\tgeometry = new CylinderGeometry(0.02, 0.02, size);\n\t\t\t\tbreak;\n\t\t\tcase 'arrow':\n\t\t\t\tgeometry = new CylinderGeometry(0, 0.08, 0.3);\n\t\t\t\tbreak;\n\t\t\tcase 'pickAxis':\n\t\t\t\tgeometry = new CylinderGeometry(0.3, 0, 1.5, 4);\n\t\t\t\tbreak;\n\t\t\tcase 'plane':\n\t\t\t\tgeometry = new PlaneGeometry(size, size);\n\t\t\t\tmaterial.opacity = 0.9;\n\t\t\t\tbreak;\n\t\t\tcase 'box':\n\t\t\t\tgeometry = new BoxGeometry(size, size, size);\n\t\t\t\tbreak;\n\t\t\tcase 'torus':\n\t\t\t\tgeometry = new RotateTorusGeometry(size, arc, tube);\n\t\t\t\tbreak;\n\t\t\tcase 'sphere':\n\t\t\t\tgeometry = new SphereGeometry(size, 32, 16);\n\t\t\t\tmaterial.opacity = 0;\n\t\t\t\tbreak;\n\t\t\tcase 'linehelper':\n\t\t\tcase 'axishelper':\n\t\t\t\tgeometry = new LineHelperGeometry(new Vector3(0, 0, 0), new Vector3(1, 0, 0));\n\t\t\t\tmaterial.drawMode = DRAW_MODE.LINES;\n\t\t\t\tbreak;\n\t\t\tcase 'rotatehelper':\n\t\t\t\tgeometry = new RotateHelperGeometry();\n\t\t\t\tmaterial.opacity = 0.2;\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t}\n\n\t\tsuper(geometry, material);\n\n\t\tmaterial.diffuse.fromArray(color);\n\t\tmaterial._color = material.diffuse.clone();\n\t\tmaterial._opacity = material.opacity;\n\n\t\tthis.name = name;\n\t\tthis.receiveShadows = false;\n\t\tthis.castShadows = false;\n\t\tthis.renderOrder = gizmoRenderOrder;\n\n\t\tif (type === 'axishelper') {\n\t\t\tthis.frustumCulled = false;\n\t\t\tthis.scale.x = 1e6;\n\t\t}\n\n\t\trotation && this.euler.copy(rotation);\n\t\tposition && this.position.copy(position);\n\t}\n\n\thighlight() {\n\t\tthis.material.diffuse.r = this.material.diffuse.r + 0.3;\n\t\tthis.material.diffuse.g = this.material.diffuse.g + 0.3;\n\t\tthis.material.diffuse.b = this.material.diffuse.b + 0.3;\n\t\tthis.material.opacity = this.material.opacity + 0.1;\n\t}\n\n\tunhighlight() {\n\t\tthis.material.diffuse.copy(this.material._color);\n\t\tthis.material.opacity = this.material._opacity;\n\t}\n\n\tyellow() {\n\t\tthis.material.diffuse.fromArray(yellowColor);\n\t}\n\n}\n\nconst gizmoFragmentShader = ShaderLib.basic_frag.replace('#include <encodings_frag>', '');\n\nclass GizmoMaterial extends BasicMaterial {\n\n\tconstructor() {\n\t\tsuper();\n\n\t\tthis.type = MATERIAL_TYPE.SHADER;\n\n\t\tthis.shaderName = 'gizmo';\n\n\t\tthis.vertexShader = ShaderLib.basic_vert;\n\t\tthis.fragmentShader = gizmoFragmentShader;\n\n\t\tthis.transparent = true;\n\t\tthis.depthTest = false;\n\t\tthis.side = DRAW_SIDE.DOUBLE;\n\t}\n\n}\n\nclass RotateTorusGeometry extends Geometry {\n\n\tconstructor(radius = 1, arc = Math.PI, tube = 0.02) {\n\t\tsuper();\n\n\t\tconst param = TorusBuilder.getGeometryData(radius, tube, 6, 48, arc);\n\n\t\t// build geometry\n\n\t\tthis.setIndex(new Attribute(new Buffer(\n\t\t\t(param.positions.length / 3) > 65536 ? new Uint32Array(param.indices) : new Uint16Array(param.indices),\n\t\t\t1\n\t\t)));\n\t\tthis.addAttribute('a_Position', new Attribute(new Buffer(new Float32Array(param.positions), 3)));\n\t\tthis.addAttribute('a_Normal', new Attribute(new Buffer(new Float32Array(param.normals), 3)));\n\n\t\tthis.computeBoundingBox();\n\t\tthis.computeBoundingSphere();\n\t}\n\n\tupdateTorus(radius = 1, arc = Math.PI) {\n\t\tconst param = TorusBuilder.getGeometryData(radius, 0.02, 6, 48, arc);\n\n\t\tthis.getAttribute('a_Position').buffer.array.set(param.positions);\n\t\tthis.getAttribute('a_Normal').buffer.array.set(param.normals);\n\n\t\tthis.getAttribute('a_Position').buffer.version++;\n\t\tthis.getAttribute('a_Normal').buffer.version++;\n\n\t\tthis.computeBoundingBox();\n\t\tthis.computeBoundingSphere();\n\t}\n\n}\n\nconst _tempQuat = new Quaternion();\nconst _tempVect = new Vector3();\n\nclass RotateHelperGeometry extends Geometry {\n\n\tconstructor() {\n\t\tsuper();\n\n\t\tthis.defaultCenter = new Vector3(0, 0, 0);\n\n\t\tconst param = this._generateData(new Vector3(0, 1, 0), new Vector3(1, 0, 0), Math.PI * 10, this.defaultCenter, 16);\n\n\t\tthis.setIndex(new Attribute(new Buffer(\n\t\t\t(param.vertices.length / 3) > 65536 ? new Uint32Array(param.indices) : new Uint16Array(param.indices),\n\t\t\t1\n\t\t)));\n\t\tthis.addAttribute('a_Position', new Attribute(new Buffer(new Float32Array(param.vertices), 3)));\n\t}\n\n\tupdateCircle(startPoint, normal, thetaLength) {\n\t\tif (Math.abs(thetaLength) > Math.PI * 10) return;\n\n\t\tconst param = this._generateData(startPoint, normal, thetaLength, this.defaultCenter, 16);\n\n\t\tthis.index.buffer.array.set(param.indices);\n\t\tthis.index.buffer.count = param.indices.length;\n\t\tthis.index.buffer.version++;\n\t\tthis.getAttribute('a_Position').buffer.array.set(param.vertices);\n\t\tthis.getAttribute('a_Position').buffer.count = param.vertices.length / 3;\n\t\tthis.getAttribute('a_Position').buffer.version++;\n\t}\n\n\t_generateData(startPoint, normal, thetaLength, center, segmentFactor) {\n\t\tconst newSegments = Math.abs(Math.ceil((segmentFactor * thetaLength) / Math.PI));\n\t\tconst segments = Math.max(6, newSegments);\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\n\t\t// indices\n\t\tfor (let i = 1; i <= segments; i++) {\n\t\t\tindices.push(i, i + 1, 0);\n\t\t}\n\n\t\tvertices.push(center.x, center.y, center.z);\n\t\t// vertices\n\t\tfor (let s = 0; s <= segments; s++) {\n\t\t\tconst segment = (s / segments) * thetaLength;\n\t\t\t_tempQuat.setFromAxisAngle(normal, segment);\n\t\t\t_tempVect.copy(startPoint).applyQuaternion(_tempQuat);\n\t\t\tvertices.push(_tempVect.x, _tempVect.y, _tempVect.z);\n\t\t}\n\n\t\treturn { indices, vertices };\n\t}\n\n}\n\nclass LineHelperGeometry extends Geometry {\n\n\tconstructor(startPoint, endPoint) {\n\t\tsuper();\n\n\t\tconst vertices = [\n\t\t\tstartPoint.x, startPoint.y, startPoint.z,\n\t\t\tendPoint.x, endPoint.y, endPoint.z\n\t\t];\n\n\t\tthis.addAttribute('a_Position', new Attribute(new Buffer(new Float32Array(vertices), 3)));\n\t}\n\n\tupdateLine(startPoint, endPoint) {\n\t\tconst vertices = [\n\t\t\tstartPoint.x, startPoint.y, startPoint.z,\n\t\t\tendPoint.x, endPoint.y, endPoint.z\n\t\t];\n\n\t\tthis.getAttribute('a_Position').buffer.array.set(vertices);\n\t\tthis.getAttribute('a_Position').buffer.version++;\n\t}\n\n}\n\nexport { TransformControls };"
  },
  {
    "path": "examples/jsm/controls/ViewControls.js",
    "content": "import { Vector3, Quaternion, Euler, MathUtils, Object3D } from 't3d';\n\nclass ViewControls {\n\n\tconstructor(camera, options) {\n\t\tthis.camera = camera;\n\n\t\tthis.target = options.target || new Vector3(0, 0, 0);\n\t\tthis.up = options.up || new Vector3(0, 1, 0);\n\n\t\tthis.interactive = options.interactive !== undefined ? options.interactive : true;\n\n\t\tthis.size = options.size || 100;\n\n\t\tthis.padding = options.padding || 10;\n\t\tthis.pointRadius = options.pointRadius || 10;\n\n\t\tthis.font = options.font || 'bold 16px Arial';\n\t\tthis.fontColor = options.fontColor || '#ffffff';\n\n\t\tthis.lineWidth = options.lineWidth || 2;\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = this.size;\n\t\tcanvas.height = this.size;\n\t\tcanvas.style.cssText = options.style || 'position:fixed;top:0;right:0;opacity:0.9;z-index:10000;user-select:none;';\n\n\t\tthis.domElement = canvas;\n\n\t\tthis._context = canvas.getContext('2d', { alpha: true });\n\n\t\tthis._points = [\n\t\t\t{ axisIndex: 0, position: new Vector3(0, 0, 0), linePosition: new Vector3(0, 0, 0) },\n\t\t\t{ axisIndex: 0, position: new Vector3(0, 0, 0), linePosition: new Vector3(0, 0, 0) },\n\t\t\t{ axisIndex: 0, position: new Vector3(0, 0, 0), linePosition: new Vector3(0, 0, 0) },\n\t\t\t{ axisIndex: 0, position: new Vector3(0, 0, 0), linePosition: new Vector3(0, 0, 0) },\n\t\t\t{ axisIndex: 0, position: new Vector3(0, 0, 0), linePosition: new Vector3(0, 0, 0) },\n\t\t\t{ axisIndex: 0, position: new Vector3(0, 0, 0), linePosition: new Vector3(0, 0, 0) }\n\t\t];\n\n\t\tthis._animating = false;\n\t\tthis._targetPosition = new Vector3();\n\t\tthis._targetQuaternion = new Quaternion();\n\t\tthis._q1 = new Quaternion();\n\t\tthis._q2 = new Quaternion();\n\t\tthis._lastQuaternion = new Quaternion();\n\n\t\tthis.needsUpdate = true;\n\n\t\tconst scope = this;\n\n\t\tthis._onContextMenu = function(event) { event.preventDefault() };\n\n\t\tlet isDragging = false;\n\t\tlet pointerDownPosition = null;\n\t\tthis._onPointerDown = function(event) {\n\t\t\tif (!scope.interactive) return;\n\t\t\tisDragging = false;\n\t\t\tpointerDownPosition = { x: event.clientX, y: event.clientY };\n\t\t};\n\t\tthis._onPointerMove = function(event) {\n\t\t\tif (!scope.interactive) return;\n\t\t\tif (pointerDownPosition) {\n\t\t\t\tconst dx = event.clientX - pointerDownPosition.x;\n\t\t\t\tconst dy = event.clientY - pointerDownPosition.y;\n\t\t\t\tif (dx * dx + dy * dy > 20) {\n\t\t\t\t\tisDragging = true;\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t\tthis._onPointerUp = function(event) {\n\t\t\tif (!scope.interactive) return;\n\t\t\tif (!isDragging && !scope._animating) {\n\t\t\t\tconst pointer = event.changedTouches ? event.changedTouches[0] : event;\n\t\t\t\tconst point = scope._raycast(pointer);\n\t\t\t\tif (point) {\n\t\t\t\t\tscope._prepareAnimationData(point.axisIndex);\n\t\t\t\t\tscope._animating = true;\n\t\t\t\t}\n\t\t\t}\n\t\t\tpointerDownPosition = null;\n\t\t};\n\n\t\tthis.domElement.addEventListener('contextmenu', this._onContextMenu);\n\t\tthis.domElement.addEventListener('pointerdown', this._onPointerDown);\n\t\tthis.domElement.addEventListener('pointermove', this._onPointerMove);\n\t\tthis.domElement.addEventListener('pointerup', this._onPointerUp);\n\t}\n\n\tdispose() {\n\t\tthis.domElement.removeEventListener('contextmenu', this._onContextMenu);\n\t\tthis.domElement.removeEventListener('pointerdown', this._onPointerDown);\n\t\tthis.domElement.removeEventListener('pointermove', this._onPointerMove);\n\t\tthis.domElement.removeEventListener('pointerup', this._onPointerUp);\n\t}\n\n\tupdate(delta) {\n\t\tconst camera = this.camera;\n\n\t\t// update canvas\n\n\t\tif (1 - this._lastQuaternion.dot(camera.quaternion) > 0.00001 || this.needsUpdate) {\n\t\t\tthis._lastQuaternion.copy(camera.quaternion);\n\t\t\tthis.needsUpdate = false;\n\n\t\t\tconst halfSize = this.size / 2;\n\n\t\t\tfor (let i = 0; i < _axisPoints.length; i++) {\n\t\t\t\tconst _axisPoint = _axisPoints[i];\n\t\t\t\tconst _point = this._points[i];\n\n\t\t\t\t_point.axisIndex = i;\n\n\t\t\t\t_quat_1.copy(camera.quaternion).conjugate();\n\t\t\t\tconst distance = halfSize - this.pointRadius - this.padding;\n\t\t\t\tconst distance2 = Math.max(halfSize - this.pointRadius * 2 - this.padding, 0.0001);\n\t\t\t\t_point.position.copy(_axisPoint.direction).multiplyScalar(distance).applyQuaternion(_quat_1);\n\t\t\t\t_point.linePosition.copy(_axisPoint.direction).multiplyScalar(distance2).applyQuaternion(_quat_1);\n\n\t\t\t\t_point.position.x = _point.position.x + halfSize;\n\t\t\t\t_point.position.y = -_point.position.y + halfSize;\n\n\t\t\t\t_point.linePosition.x = _point.linePosition.x + halfSize;\n\t\t\t\t_point.linePosition.y = -_point.linePosition.y + halfSize;\n\t\t\t}\n\n\t\t\tthis._points.sort(depthSort);\n\n\t\t\t// clear canvas\n\t\t\tthis._context.clearRect(0, 0, this.size, this.size);\n\n\t\t\tthis._context.textAlign = 'center';\n\t\t\tthis._context.textBaseline = 'middle';\n\n\t\t\t// draw front points\n\t\t\tfor (let i = 0; i < 3; i++) {\n\t\t\t\tconst point = this._points[i];\n\t\t\t\tthis._drawPoint(point, _axisPoints[point.axisIndex]);\n\t\t\t}\n\n\t\t\t// draw lines\n\t\t\tfor (let i = 0; i < 6; i++) {\n\t\t\t\tconst _point = this._points[i];\n\t\t\t\tif (_point.axisIndex % 2 === 0) {\n\t\t\t\t\tthis._drawLine(_point, _axisPoints[_point.axisIndex]);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// draw back points\n\t\t\tfor (let i = 3; i < 6; i++) {\n\t\t\t\tconst point = this._points[i];\n\t\t\t\tthis._drawPoint(point, _axisPoints[point.axisIndex]);\n\t\t\t}\n\t\t}\n\n\t\t// animate\n\n\t\tif (this._animating) {\n\t\t\tconst step = delta * twoPI;\n\n\t\t\trotateTowards(this._q2, step, this._q1);\n\n\t\t\tconst radius = camera.position.distanceTo(this.target);\n\t\t\tcamera.position.set(0, 0, 1).applyQuaternion(this._q1).multiplyScalar(radius).add(this.target);\n\t\t\trotateTowards(this._targetQuaternion, step, camera.quaternion);\n\n\t\t\tif (angleTo(this._q1, this._q2) === 0) {\n\t\t\t\tthis._animating = false;\n\t\t\t}\n\t\t}\n\t}\n\n\t_drawPoint(point, axisPoint) {\n\t\tconst context = this._context;\n\n\t\tcontext.fillStyle = axisPoint.color;\n\t\tcontext.beginPath();\n\t\tcontext.arc(point.position.x, point.position.y, this.pointRadius, 0, twoPI);\n\t\tcontext.fill();\n\n\t\tcontext.fillStyle = this.fontColor;\n\t\tcontext.font = this.font;\n\t\tcontext.fillText(axisPoint.name, point.position.x, point.position.y);\n\t}\n\n\t_drawLine(point, axisPoint) {\n\t\tconst context = this._context;\n\t\tconst halfSize = this.size / 2;\n\n\t\tcontext.strokeStyle = axisPoint.color;\n\t\tcontext.lineWidth = this.lineWidth;\n\t\tcontext.lineCap = 'round';\n\t\tcontext.beginPath();\n\t\tcontext.moveTo(halfSize, halfSize);\n\t\tcontext.lineTo(point.linePosition.x, point.linePosition.y);\n\t\tcontext.stroke();\n\t}\n\n\t_raycast(event) {\n\t\tconst rect = this.domElement.getBoundingClientRect();\n\t\tconst x = event.clientX - rect.left;\n\t\tconst y = event.clientY - rect.top;\n\n\t\tfor (let i = this._points.length - 1; i >= 0; i--) {\n\t\t\tconst _point = this._points[i];\n\t\t\tconst distance = _point.position.distanceTo(_vec3_1.set(x, y, _point.position.z));\n\t\t\tif (distance <= this.pointRadius) {\n\t\t\t\treturn _point;\n\t\t\t}\n\t\t}\n\n\t\treturn null;\n\t}\n\n\t_prepareAnimationData(axisIndex) {\n\t\tconst camera = this.camera;\n\t\tconst target = this.target;\n\t\tconst up = this.up;\n\n\t\tconst targetPosition = this._targetPosition;\n\t\tconst targetQuaternion = this._targetQuaternion;\n\t\tconst q1 = this._q1;\n\t\tconst q2 = this._q2;\n\n\t\ttargetPosition.copy(_axisPoints[axisIndex].direction);\n\t\ttargetQuaternion.setFromEuler(_rotationTargets[axisIndex]);\n\n\t\tconst radius = camera.position.distanceTo(target);\n\t\ttargetPosition.multiplyScalar(radius).add(target);\n\n\t\tdummy.position.copy(target);\n\n\t\tdummy.lookAt(camera.position, up);\n\t\tq1.copy(dummy.quaternion);\n\n\t\tdummy.lookAt(targetPosition, up);\n\t\tq2.copy(dummy.quaternion);\n\t}\n\n}\n\nconst _axisPoints = [\n\t{ name: 'x', color: '#ff3653', direction: new Vector3(1, 0, 0) },\n\t{ name: '-x', color: '#ff3653', direction: new Vector3(-1, 0, 0) },\n\t{ name: 'y', color: '#8adb00', direction: new Vector3(0, 1, 0) },\n\t{ name: '-y', color: '#8adb00', direction: new Vector3(0, -1, 0) },\n\t{ name: 'z', color: '#2c8fff', direction: new Vector3(0, 0, 1) },\n\t{ name: '-z', color: '#2c8fff', direction: new Vector3(0, 0, -1) }\n];\n\nconst _rotationTargets = [\n\tnew Euler(0, Math.PI * 0.5, 0),\n\tnew Euler(0, -Math.PI * 0.5, 0),\n\tnew Euler(-Math.PI * 0.5, 0, 0),\n\tnew Euler(Math.PI * 0.5, 0, 0),\n\tnew Euler(),\n\tnew Euler(0, Math.PI, 0)\n];\n\nconst twoPI = Math.PI * 2;\n\nconst _vec3_1 = new Vector3();\nconst _quat_1 = new Quaternion();\n\nfunction depthSort(a, b) {\n\treturn a.position.z - b.position.z;\n}\n\nconst dummy = new Object3D();\n\nfunction rotateTowards(q, step, target) {\n\tconst angle = angleTo(target, q);\n\tif (angle === 0) return target;\n\tconst t = Math.min(1, step / angle);\n\ttarget.slerpQuaternions(target, q, t);\n\treturn target;\n}\n\nfunction angleTo(q1, q2) {\n\treturn 2 * Math.acos(Math.abs(MathUtils.clamp(q1.dot(q2), -1, 1)));\n}\n\nexport { ViewControls };"
  },
  {
    "path": "examples/jsm/exporters/DRACOExporter.js",
    "content": "/**\n * Export draco compressed files from t3d geometry objects.\n *\n * Draco files are compressed and usually are smaller than conventional 3D file formats.\n *\n * The exporter receives a options object containing\n *  - pointCloud, indicates if the geometry is a point cloud or a mesh\n *  - decodeSpeed, indicates how to tune the encoder regarding decode speed (0 gives better speed but worst quality)\n *  - encodeSpeed, indicates how to tune the encoder parameters (0 gives better speed but worst quality)\n *  - encoderMethod\n *  - quantization, indicates the presision of each type of data stored in the draco file in the order (POSITION, NORMAL, COLOR, TEX_COORD, GENERIC)\n */\nclass DRACOExporter {\n\n\tparse(geometry, options = {}) {\n\t\toptions = Object.assign({\n\t\t\tpointCloud: false,\n\t\t\tdecodeSpeed: 5,\n\t\t\tencodeSpeed: 5,\n\t\t\tencoderMethod: ENCODER_METHOD.EDGEBREAKER,\n\t\t\tquantization: [16, 8, 8, 8, 8]\n\t\t}, options);\n\n\t\tif (DracoEncoderModule === undefined) {\n\t\t\tthrow new Error('DRACOExporter: required the draco_encoder to work.');\n\t\t}\n\n\t\tconst dracoEncoder = DracoEncoderModule();\n\t\tconst encoder = new dracoEncoder.Encoder();\n\t\tlet builder;\n\t\tlet dracoObject;\n\n\t\tconst dracoAttributes = {};\n\t\tlet darcoAttributeID = 0;\n\n\t\tconst positionAttribute = geometry.getAttribute('a_Position');\n\t\tconst positionBuffer = positionAttribute.buffer;\n\n\t\tif (options.pointCloud === true) {\n\t\t\tbuilder = new dracoEncoder.PointCloudBuilder();\n\t\t\tdracoObject = new dracoEncoder.PointCloud();\n\t\t} else {\n\t\t\tbuilder = new dracoEncoder.MeshBuilder();\n\t\t\tdracoObject = new dracoEncoder.Mesh();\n\n\t\t\tconst faceAttribute = geometry.index;\n\t\t\tif (faceAttribute !== null) {\n\t\t\t\tconst faceBuffer = faceAttribute.buffer;\n\t\t\t\tbuilder.AddFacesToMesh(dracoObject, faceBuffer.count / 3, faceBuffer.array);\n\t\t\t} else {\n\t\t\t\tconst faces = new (positionBuffer.count > 65535 ? Uint32Array : Uint16Array)(positionBuffer.count);\n\t\t\t\tfor (let i = 0; i < faces.length; i++) {\n\t\t\t\t\tfaces[i] = i;\n\t\t\t\t}\n\t\t\t\tbuilder.AddFacesToMesh(dracoObject, positionBuffer.count, faces);\n\t\t\t}\n\t\t}\n\n\t\tbuilder.AddFloatAttribute(dracoObject, dracoEncoder.POSITION, positionBuffer.count, positionAttribute.size, positionBuffer.array);\n\t\tdracoAttributes.POSITION = darcoAttributeID++;\n\n\t\tfor (const attributeName in geometry.attributes) {\n\t\t\tif (attributeName === 'a_Position') continue;\n\n\t\t\tconst gltfAttributeName = ATTRIBUTE_NAME_TO_GLTF[attributeName] || attributeName;\n\n\t\t\t// Skip custom attributes\n\t\t\tif (validVertexAttributes.test(gltfAttributeName) === false) continue;\n\n\t\t\tlet attributeType;\n\t\t\tif (attributeName === 'a_Normal') attributeType = dracoEncoder.NORMAL;\n\t\t\telse if (attributeName === 'a_Color') attributeType = dracoEncoder.COLOR;\n\t\t\telse if (attributeName.startsWith('a_Uv')) attributeType = dracoEncoder.TEX_COORD;\n\t\t\telse attributeType = dracoEncoder.GENERIC;\n\n\t\t\tconst attribute = geometry.attributes[attributeName];\n\t\t\tconst buffer = attribute.buffer;\n\t\t\tif (buffer.array instanceof Float32Array) {\n\t\t\t\tbuilder.AddFloatAttribute(dracoObject, attributeType, buffer.count, attribute.size, buffer.array);\n\t\t\t} else if (buffer.array instanceof Uint32Array) {\n\t\t\t\tbuilder.AddUInt32Attribute(dracoObject, attributeType, buffer.count, attribute.size, buffer.array);\n\t\t\t} else if (buffer.array instanceof Uint16Array) {\n\t\t\t\tbuilder.AddUInt16Attribute(dracoObject, attributeType, buffer.count, attribute.size, buffer.array);\n\t\t\t} else if (buffer.array instanceof Uint8Array) {\n\t\t\t\tbuilder.AddUInt8Attribute(dracoObject, attributeType, buffer.count, attribute.size, buffer.array);\n\t\t\t} else if (buffer.array instanceof Int32Array) {\n\t\t\t\tbuilder.AddInt32Attribute(dracoObject, attributeType, buffer.count, attribute.size, buffer.array);\n\t\t\t} else if (buffer.array instanceof Int16Array) {\n\t\t\t\tbuilder.AddInt16Attribute(dracoObject, attributeType, buffer.count, attribute.size, buffer.array);\n\t\t\t} else if (buffer.array instanceof Int8Array) {\n\t\t\t\tbuilder.AddInt8Attribute(dracoObject, attributeType, buffer.count, attribute.size, buffer.array);\n\t\t\t} else {\n\t\t\t\tbuilder.AddFloatAttribute(dracoObject, attributeType, buffer.count, attribute.size, buffer.array);\n\t\t\t}\n\n\t\t\tdracoAttributes[gltfAttributeName] = darcoAttributeID++;\n\t\t}\n\n\t\t// Compress using draco encoder\n\n\t\tconst encodedData = new dracoEncoder.DracoInt8Array();\n\n\t\t// Sets the desired encoding and decoding speed for the given options from 0 (slowest speed, but the best compression) to 10 (fastest, but the worst compression).\n\n\t\tconst { encodeSpeed, decodeSpeed } = options;\n\n\t\tencoder.SetSpeedOptions(encodeSpeed, decodeSpeed);\n\n\t\t// Sets the desired encoding method for a given geometry.\n\n\t\tencoder.SetEncodingMethod(options.encoderMethod);\n\n\t\t// Sets the quantization (number of bits used to represent) compression options for a named attribute.\n\t\t// The attribute values will be quantized in a box defined by the maximum extent of the attribute values.\n\n\t\tfor (let i = 0; i < 5; i++) {\n\t\t\tif (options.quantization[i] !== undefined) {\n\t\t\t\tencoder.SetAttributeQuantization(i, options.quantization[i]);\n\t\t\t}\n\t\t}\n\n\t\tlet length;\n\n\t\tif (options.pointCloud === true) {\n\t\t\tlength = encoder.EncodePointCloudToDracoBuffer(dracoObject, true, encodedData);\n\t\t} else {\n\t\t\tlength = encoder.EncodeMeshToDracoBuffer(dracoObject, encodedData);\n\t\t}\n\n\t\tdracoEncoder.destroy(dracoObject);\n\n\t\tif (length === 0) {\n\t\t\tthrow new Error('DRACOExporter: Draco encoding failed.');\n\t\t}\n\n\t\t// Copy encoded data to buffer.\n\t\tconst outputData = new Int8Array(new ArrayBuffer(length));\n\n\t\tfor (let i = 0; i < length; i++) {\n\t\t\toutputData[i] = encodedData.GetValue(i);\n\t\t}\n\n\t\tdracoEncoder.destroy(encodedData);\n\t\tdracoEncoder.destroy(encoder);\n\t\tdracoEncoder.destroy(builder);\n\n\t\treturn { buffer: outputData, attributes: dracoAttributes };\n\t}\n\n}\n\n/* global DracoEncoderModule */\n\nconst ENCODER_METHOD = {\n\tEDGEBREAKER: 1,\n\tSEQUENTIAL: 0\n};\n\nconst ATTRIBUTE_NAME_TO_GLTF = {\n\ta_Position: 'POSITION',\n\ta_Normal: 'NORMAL',\n\ta_Tangent: 'TANGENT',\n\ta_Uv: 'TEXCOORD_0',\n\ta_Uv2: 'TEXCOORD_1',\n\ta_Uv3: 'TEXCOORD_2',\n\ta_Uv4: 'TEXCOORD_3',\n\ta_Uv5: 'TEXCOORD_4',\n\ta_Uv6: 'TEXCOORD_5',\n\ta_Uv7: 'TEXCOORD_6',\n\ta_Uv8: 'TEXCOORD_7',\n\ta_Color: 'COLOR_0',\n\tskinWeight: 'WEIGHTS_0',\n\tskinIndex: 'JOINTS_0'\n};\n\n// Prefix all geometry attributes except the ones specifically\n// listed in the spec; non-spec attributes are considered custom.\nconst validVertexAttributes = /^(POSITION|NORMAL|TANGENT|TEXCOORD_\\d+|COLOR_\\d+|JOINTS_\\d+|WEIGHTS_\\d+)$/;\n\nexport { DRACOExporter, ENCODER_METHOD };"
  },
  {
    "path": "examples/jsm/exporters/GLTFExporter.js",
    "content": "import { Attribute, Buffer, CubicSplineInterpolant, DRAW_MODE, DRAW_SIDE, MATERIAL_TYPE, Matrix4, Object3D, PIXEL_FORMAT, Quaternion, QuaternionCubicSplineInterpolant, StepInterpolant, TEXEL_ENCODING_TYPE, TEXTURE_FILTER, TEXTURE_WRAP, Vector3 } from 't3d';\n\n/**\n * GLTF Exporter\n * ref: https://github.com/mrdoob/three.js/blob/master/examples/jsm/exporters/GLTFExporter.js\n * more:\n * - add wrapRoot option\n * - add draco compression option\n * - add support for `GLTF_SEPARATE` format\n * - add support for ignoreForExport flag on Object3D\n * todo:\n * - export cameras\n * - support compressed texture\n * - support GLTFMaterialsClearcoatExtension\n * - support GLTFMaterialsSpecularExtension\n */\nclass GLTFExporter {\n\n\tconstructor() {\n\t\tthis.extensions = [];\n\n\t\tthis.dracoOptions = {};\n\t\tthis._dracoExporter = null;\n\n\t\tthis.register(GLTFMaterialsUnlitExtension);\n\t\tthis.register(GLTFMeshGpuInstancingExtension);\n\t}\n\n\tregister(extension) {\n\t\tif (this.extensions.indexOf(extension) === -1) {\n\t\t\tthis.extensions.push(extension);\n\t\t}\n\t\treturn this;\n\t}\n\n\tunregister(extension) {\n\t\tconst index = this.extensions.indexOf(extension);\n\t\tif (index !== -1) {\n\t\t\tthis.extensions.splice(index, 1);\n\t\t}\n\t\treturn this;\n\t}\n\n\tsetDRACOExporter(dracoExporter) {\n\t\tthis._dracoExporter = dracoExporter;\n\t\treturn this;\n\t}\n\n\tgetDRACOExporter() {\n\t\treturn this._dracoExporter;\n\t}\n\n\t/**\n\t * Parse input root object(s) and generate GLTF output\n\t * @param {Object3D|Object3D[]} input root object(s)\n\t * @param {Function} onDone Callback on completed\n\t * @param {Function} onError Callback on errors\n\t * @param {object} options options\n\t */\n\tparse(input, onDone, onError, options) {\n\t\tconst writer = new GLTFWriter();\n\n\t\tconst plugins = this.extensions.map(_ext => new _ext(writer));\n\n\t\twriter.setPlugins(plugins);\n\n\t\twriter.dracoOptions = this.dracoOptions;\n\t\twriter.setDRACOExporter(this._dracoExporter);\n\n\t\twriter.writeAsync(input, onDone, options).catch(onError);\n\t}\n\n\tparseAsync(input, options) {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tthis.parse(input, resolve, reject, options);\n\t\t});\n\t}\n\n}\n\n// ------------------------------------------------------------------------------\n// Constants\n// ------------------------------------------------------------------------------\n\nconst GLTF_FORMAT = {\n\tGLTF: 'GLTF',\n\tGLTF_SEPARATE: 'GLTF_SEPARATE',\n\tGLB: 'GLB'\n};\n\nconst GLTF_CONSTANTS = {\n\tBYTE: 0x1400,\n\tUNSIGNED_BYTE: 0x1401,\n\tSHORT: 0x1402,\n\tUNSIGNED_SHORT: 0x1403,\n\tINT: 0x1404,\n\tUNSIGNED_INT: 0x1405,\n\tFLOAT: 0x1406,\n\n\tARRAY_BUFFER: 0x8892,\n\tELEMENT_ARRAY_BUFFER: 0x8893,\n\n\tNEAREST: 0x2600,\n\tLINEAR: 0x2601,\n\tNEAREST_MIPMAP_NEAREST: 0x2700,\n\tLINEAR_MIPMAP_NEAREST: 0x2701,\n\tNEAREST_MIPMAP_LINEAR: 0x2702,\n\tLINEAR_MIPMAP_LINEAR: 0x2703,\n\n\tCLAMP_TO_EDGE: 33071,\n\tMIRRORED_REPEAT: 33648,\n\tREPEAT: 10497\n};\n\nconst DRAW_MODE_TO_GLTF = {\n\t[DRAW_MODE.POINTS]: 0,\n\t[DRAW_MODE.LINES]: 1,\n\t[DRAW_MODE.LINE_LOOP]: 2,\n\t[DRAW_MODE.LINE_STRIP]: 3,\n\t[DRAW_MODE.TRIANGLES]: 4,\n\t[DRAW_MODE.TRIANGLE_STRIP]: 5,\n\t[DRAW_MODE.TRIANGLE_FAN]: 6\n};\n\nconst ATTRIBUTE_NAME_TO_GLTF = {\n\ta_Position: 'POSITION',\n\ta_Normal: 'NORMAL',\n\ta_Tangent: 'TANGENT',\n\ta_Uv: 'TEXCOORD_0',\n\ta_Uv2: 'TEXCOORD_1',\n\ta_Uv3: 'TEXCOORD_2',\n\ta_Uv4: 'TEXCOORD_3',\n\ta_Uv5: 'TEXCOORD_4',\n\ta_Uv6: 'TEXCOORD_5',\n\ta_Uv7: 'TEXCOORD_6',\n\ta_Uv8: 'TEXCOORD_7',\n\ta_Color: 'COLOR_0',\n\tskinWeight: 'WEIGHTS_0',\n\tskinIndex: 'JOINTS_0'\n};\n\nconst INTERPOLANT_TO_GLTF = new WeakMap([\n\t[QuaternionCubicSplineInterpolant, 'CUBICSPLINE'],\n\t[CubicSplineInterpolant, 'CUBICSPLINE'],\n\t[StepInterpolant, 'STEP']\n]);\n\n// Prefix all geometry attributes except the ones specifically\n// listed in the spec; non-spec attributes are considered custom.\nconst validVertexAttributes = /^(POSITION|NORMAL|TANGENT|TEXCOORD_\\d+|COLOR_\\d+|JOINTS_\\d+|WEIGHTS_\\d+)$/;\n\nconst KHR_MESH_QUANTIZATION = 'KHR_mesh_quantization';\n\n// The KHR_mesh_quantization extension allows these extra attribute component types\n// https://github.com/KhronosGroup/glTF/blob/main/extensions/2.0/Khronos/KHR_mesh_quantization/README.md#extending-mesh-attributes\nconst KHR_mesh_quantization_ExtraAttrTypes = {\n\tPOSITION: [\n\t\t'byte',\n\t\t'byte normalized',\n\t\t'unsigned byte',\n\t\t'unsigned byte normalized',\n\t\t'short',\n\t\t'short normalized',\n\t\t'unsigned short',\n\t\t'unsigned short normalized'\n\t],\n\tNORMAL: [\n\t\t'byte normalized',\n\t\t'short normalized'\n\t],\n\tTANGENT: [\n\t\t'byte normalized',\n\t\t'short normalized'\n\t],\n\tTEXCOORD: [\n\t\t'byte',\n\t\t'byte normalized',\n\t\t'unsigned byte',\n\t\t'short',\n\t\t'short normalized',\n\t\t'unsigned short'\n\t]\n};\n\nconst PATH_PROPERTIES = {\n\tscale: 'scale',\n\tposition: 'translation',\n\tquaternion: 'rotation',\n\tmorphTargetInfluences: 'weights'\n};\n\nconst T3D_TO_GLTF = {};\n\nT3D_TO_GLTF[TEXTURE_FILTER.NEAREST] = GLTF_CONSTANTS.NEAREST;\nT3D_TO_GLTF[TEXTURE_FILTER.NEAREST_MIPMAP_NEAREST] = GLTF_CONSTANTS.NEAREST_MIPMAP_NEAREST;\nT3D_TO_GLTF[TEXTURE_FILTER.NEAREST_MIPMAP_LINEAR] = GLTF_CONSTANTS.NEAREST_MIPMAP_LINEAR;\nT3D_TO_GLTF[TEXTURE_FILTER.LINEAR] = GLTF_CONSTANTS.LINEAR;\nT3D_TO_GLTF[TEXTURE_FILTER.LINEAR_MIPMAP_NEAREST] = GLTF_CONSTANTS.LINEAR_MIPMAP_NEAREST;\nT3D_TO_GLTF[TEXTURE_FILTER.LINEAR_MIPMAP_LINEAR] = GLTF_CONSTANTS.LINEAR_MIPMAP_LINEAR;\n\nT3D_TO_GLTF[TEXTURE_WRAP.CLAMP_TO_EDGE] = GLTF_CONSTANTS.CLAMP_TO_EDGE;\nT3D_TO_GLTF[TEXTURE_WRAP.REPEAT] = GLTF_CONSTANTS.REPEAT;\nT3D_TO_GLTF[TEXTURE_WRAP.MIRRORED_REPEAT] = GLTF_CONSTANTS.MIRRORED_REPEAT;\n\n// GLB constants\n// https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#glb-file-format-specification\n\nconst GLB_HEADER_BYTES = 12;\nconst GLB_HEADER_MAGIC = 0x46546C67;\nconst GLB_VERSION = 2;\n\nconst GLB_CHUNK_PREFIX_BYTES = 8;\nconst GLB_CHUNK_TYPE_JSON = 0x4E4F534A;\nconst GLB_CHUNK_TYPE_BIN = 0x004E4942;\n\n// ------------------------------------------------------------------------------\n// Utility functions\n// ------------------------------------------------------------------------------\n\nfunction createAttributesKey(attributes) {\n\tlet attributesKey = '';\n\n\tconst keys = Object.keys(attributes).sort();\n\n\tfor (let i = 0, il = keys.length; i < il; i++) {\n\t\tattributesKey += keys[i] + ':' + attributes[keys[i]] + ';';\n\t}\n\n\treturn attributesKey;\n}\n\nfunction decompose(matrix3) {\n\tconst tx = matrix3.elements[2];\n\tconst ty = matrix3.elements[5];\n\n\tconst sx = Math.sqrt(matrix3.elements[0] * matrix3.elements[0] + matrix3.elements[1] * matrix3.elements[1]);\n\tconst sy = Math.sqrt(matrix3.elements[3] * matrix3.elements[3] + matrix3.elements[4] * matrix3.elements[4]);\n\n\tconst rotation = Math.atan2(matrix3.elements[1], matrix3.elements[0]);\n\n\tconst cx = 0;\n\tconst cy = 0;\n\n\treturn { tx, ty, sx, sy, rotation, cx, cy };\n}\n\n/**\n * Compare two arrays\n * @param  {Array} array1 Array 1 to compare\n * @param  {Array} array2 Array 2 to compare\n * @returns {boolean}        Returns true if both arrays are equal\n */\nfunction equalArray(array1, array2) {\n\treturn (array1.length === array2.length) && array1.every(function(element, index) {\n\t\treturn element === array2[index];\n\t});\n}\n\n/**\n * Converts a string to an ArrayBuffer.\n * @param  {string} text\n * @returns {ArrayBuffer}\n */\nfunction stringToArrayBuffer(text) {\n\treturn new TextEncoder().encode(text).buffer;\n}\n\n/**\n * Is identity matrix\n * @param {Matrix4} matrix\n * @returns {boolean} Returns true, if parameter is identity matrix\n */\nfunction isIdentityMatrix(matrix) {\n\treturn equalArray(matrix.elements, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1]);\n}\n\n/**\n * Get the min and max vectors from the given attribute\n * @param  {Attribute} attribute Attribute to find the min/max in range from start to start + count\n * @param  {Integer} start\n * @param  {Integer} count\n * @returns {object} Object containing the `min` and `max` values (As an array of attribute.size components)\n */\nfunction getMinMax(attribute, start, count) {\n\tconst output = {\n\t\tmin: new Array(attribute.size).fill(Number.POSITIVE_INFINITY),\n\t\tmax: new Array(attribute.size).fill(Number.NEGATIVE_INFINITY)\n\t};\n\n\tfor (let i = start; i < start + count; i++) {\n\t\tfor (let a = 0; a < attribute.size; a++) {\n\t\t\tconst value = attribute.buffer.array[i * attribute.size + a];\n\n\t\t\toutput.min[a] = Math.min(output.min[a], value);\n\t\t\toutput.max[a] = Math.max(output.max[a], value);\n\t\t}\n\t}\n\n\treturn output;\n}\n\n/**\n * Get the required size + padding for a buffer, rounded to the next 4-byte boundary.\n * https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#data-alignment\n * @param {Integer} bufferSize The size the original buffer.\n * @returns {Integer} new buffer size with required padding.\n */\nfunction getPaddedBufferSize(bufferSize) {\n\treturn Math.ceil(bufferSize / 4) * 4;\n}\n\n/**\n * Returns a buffer aligned to 4-byte boundary.\n * @param {ArrayBuffer} arrayBuffer Buffer to pad\n * @param {Integer} paddingByte (Optional)\n * @returns {ArrayBuffer} The same buffer if it's already aligned to 4-byte boundary or a new buffer\n */\nfunction getPaddedArrayBuffer(arrayBuffer, paddingByte = 0) {\n\tconst paddedLength = getPaddedBufferSize(arrayBuffer.byteLength);\n\n\tif (paddedLength !== arrayBuffer.byteLength) {\n\t\tconst array = new Uint8Array(paddedLength);\n\t\tarray.set(new Uint8Array(arrayBuffer));\n\n\t\tif (paddingByte !== 0) {\n\t\t\tfor (let i = arrayBuffer.byteLength; i < paddedLength; i++) {\n\t\t\t\tarray[i] = paddingByte;\n\t\t\t}\n\t\t}\n\n\t\treturn array.buffer;\n\t}\n\n\treturn arrayBuffer;\n}\n\nfunction getCanvas() {\n\tif (typeof document === 'undefined' && typeof OffscreenCanvas !== 'undefined') {\n\t\treturn new OffscreenCanvas(1, 1);\n\t}\n\n\treturn document.createElement('canvas');\n}\n\nfunction getToBlobPromise(canvas, mimeType) {\n\tif (canvas.toBlob !== undefined) {\n\t\treturn new Promise(resolve => canvas.toBlob(resolve, mimeType));\n\t}\n\n\tlet quality;\n\n\t// Blink's implementation of convertToBlob seems to default to a quality level of 100%\n\t// Use the Blink default quality levels of toBlob instead so that file sizes are comparable.\n\tif (mimeType === 'image/jpeg') {\n\t\tquality = 0.92;\n\t} else if (mimeType === 'image/webp') {\n\t\tquality = 0.8;\n\t}\n\n\treturn canvas.convertToBlob({\n\t\ttype: mimeType,\n\t\tquality: quality\n\t});\n}\n\n/**\n * Writer\n */\nclass GLTFWriter {\n\n\tconstructor() {\n\t\tthis.plugins = [];\n\n\t\tthis.options = {};\n\t\tthis.pending = [];\n\t\tthis.buffers = [];\n\n\t\tthis.byteOffset = 0;\n\t\tthis.buffers = [];\n\t\tthis.nodeMap = new Map();\n\t\tthis.skins = [];\n\n\t\tthis.extensionsUsed = {};\n\t\tthis.extensionsRequired = {};\n\n\t\tthis.uids = new Map();\n\t\tthis.uid = 0;\n\n\t\tthis.json = {\n\t\t\tasset: {\n\t\t\t\tversion: '2.0',\n\t\t\t\tgenerator: 'T3D GLTFExporter'\n\t\t\t}\n\t\t};\n\n\t\tthis.cache = {\n\t\t\tmeshes: new Map(),\n\t\t\tattributes: new Map(),\n\t\t\tbufferViews: new Map(),\n\t\t\tmaterials: new Map(),\n\t\t\ttextures: new Map(),\n\t\t\timages: new Map()\n\t\t};\n\n\t\tthis.resources = [];\n\n\t\t// Track file names, to ensure no duplicates\n\t\tthis.fileNamesUsed = {};\n\n\t\tthis.dracoOptions = null;\n\t\tthis.dracoExporter = null;\n\t}\n\n\tsetPlugins(plugins) {\n\t\tthis.plugins = plugins;\n\t}\n\n\tsetDRACOExporter(dracoExporter) {\n\t\tthis.dracoExporter = dracoExporter;\n\t}\n\n\t/**\n\t * Parse input root object(s) and generate GLTF output\n\t * @param {Object3D|Object3D[]} input root object(s)\n\t * @param {Function} onDone Callback on completed\n\t * @param {object} options options\n\t */\n\tasync writeAsync(input, onDone, options) {\n\t\tthis.options = Object.assign({\n\t\t\t// Export format\n\t\t\tformat: GLTF_FORMAT.GLTF,\n\t\t\t// Draco compression\n\t\t\tdraco: false,\n\t\t\t// Resource directory, defualt is './'\n\t\t\tresourcePath: './',\n\t\t\t// Export position, rotation and scale instead of matrix per node. Default is false\n\t\t\ttrs: false,\n\t\t\t// Export only visible objects.\n\t\t\tonlyVisible: true,\n\t\t\t// Restricts the image maximum size (both width and height) to the given value.\n\t\t\tmaxTextureSize: Infinity,\n\t\t\t// Array<AnimationClip>. List of animations to be included in the export.\n\t\t\tanimations: [],\n\t\t\t// Export custom glTF extensions defined on an object's userData.gltfExtensions property.\n\t\t\tincludeCustomExtensions: false,\n\t\t\t// If true, wrap the root object(s) with an Object3D named \"AuxRoot\".\n\t\t\t// Otherwise, directly export the root object(s) as glTF scene(s).\n\t\t\t// It is recommended to set this to true if the root object(s) have transformations.\n\t\t\twrapRoot: false\n\t\t}, options);\n\n\t\tif (this.options.draco && this.dracoExporter === null) {\n\t\t\tconsole.warn('GLTFExporter: DRACOExporter is not set but options.draco is true. Ignoring Draco compression.');\n\t\t\tthis.options.draco = false;\n\t\t}\n\n\t\tif (this.options.animations.length > 0) {\n\t\t\t// Only TRS properties, and not matrices, may be targeted by animation.\n\t\t\tthis.options.trs = true;\n\t\t}\n\n\t\tawait this.processInputAsync(input);\n\n\t\tawait Promise.all(this.pending);\n\n\t\tconst writer = this;\n\t\tconst buffers = writer.buffers;\n\t\tconst json = writer.json;\n\t\toptions = writer.options;\n\n\t\tconst extensionsUsed = writer.extensionsUsed;\n\t\tconst extensionsRequired = writer.extensionsRequired;\n\n\t\t// Merge buffers.\n\t\tconst blob = new Blob(buffers, { type: 'application/octet-stream' });\n\n\t\t// Declare extensions.\n\t\tconst extensionsUsedList = Object.keys(extensionsUsed);\n\t\tconst extensionsRequiredList = Object.keys(extensionsRequired);\n\n\t\tif (extensionsUsedList.length > 0) json.extensionsUsed = extensionsUsedList;\n\t\tif (extensionsRequiredList.length > 0) json.extensionsRequired = extensionsRequiredList;\n\n\t\tif (extensionsUsedList.length > 0) json.extensionsUsed = extensionsUsedList;\n\t\tif (extensionsRequiredList.length > 0) json.extensionsRequired = extensionsRequiredList;\n\n\t\t// Update bytelength of the single buffer.\n\t\tif (json.buffers && json.buffers.length > 0) json.buffers[0].byteLength = blob.size;\n\n\t\tif (options.format === GLTF_FORMAT.GLB) {\n\t\t\t// https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#glb-file-format-specification\n\n\t\t\tconst reader = new FileReader();\n\t\t\treader.readAsArrayBuffer(blob);\n\t\t\treader.onloadend = function() {\n\t\t\t\t// Binary chunk.\n\t\t\t\tconst binaryChunk = getPaddedArrayBuffer(reader.result);\n\t\t\t\tconst binaryChunkPrefix = new DataView(new ArrayBuffer(GLB_CHUNK_PREFIX_BYTES));\n\t\t\t\tbinaryChunkPrefix.setUint32(0, binaryChunk.byteLength, true);\n\t\t\t\tbinaryChunkPrefix.setUint32(4, GLB_CHUNK_TYPE_BIN, true);\n\n\t\t\t\t// JSON chunk.\n\t\t\t\tconst jsonChunk = getPaddedArrayBuffer(stringToArrayBuffer(JSON.stringify(json)), 0x20);\n\t\t\t\tconst jsonChunkPrefix = new DataView(new ArrayBuffer(GLB_CHUNK_PREFIX_BYTES));\n\t\t\t\tjsonChunkPrefix.setUint32(0, jsonChunk.byteLength, true);\n\t\t\t\tjsonChunkPrefix.setUint32(4, GLB_CHUNK_TYPE_JSON, true);\n\n\t\t\t\t// GLB header.\n\t\t\t\tconst header = new ArrayBuffer(GLB_HEADER_BYTES);\n\t\t\t\tconst headerView = new DataView(header);\n\t\t\t\theaderView.setUint32(0, GLB_HEADER_MAGIC, true);\n\t\t\t\theaderView.setUint32(4, GLB_VERSION, true);\n\t\t\t\tconst totalByteLength = GLB_HEADER_BYTES\n\t\t\t\t\t+ jsonChunkPrefix.byteLength + jsonChunk.byteLength\n\t\t\t\t\t+ binaryChunkPrefix.byteLength + binaryChunk.byteLength;\n\t\t\t\theaderView.setUint32(8, totalByteLength, true);\n\n\t\t\t\tconst glbBlob = new Blob([\n\t\t\t\t\theader,\n\t\t\t\t\tjsonChunkPrefix,\n\t\t\t\t\tjsonChunk,\n\t\t\t\t\tbinaryChunkPrefix,\n\t\t\t\t\tbinaryChunk\n\t\t\t\t], { type: 'application/octet-stream' });\n\n\t\t\t\tconst glbReader = new FileReader();\n\t\t\t\tglbReader.readAsArrayBuffer(glbBlob);\n\t\t\t\tglbReader.onloadend = function() {\n\t\t\t\t\tonDone(glbReader.result);\n\t\t\t\t};\n\t\t\t};\n\t\t} else if (options.format === GLTF_FORMAT.GLTF_SEPARATE) {\n\t\t\tconst reader = new FileReader();\n\t\t\treader.readAsArrayBuffer(blob);\n\t\t\treader.onloadend = function() {\n\t\t\t\tconst resources = writer.resources;\n\n\t\t\t\tconst ext = 'bin';\n\t\t\t\tconst name = writer.getUniqueFileName('all', ext);\n\t\t\t\tresources.push({ name, ext, content: getPaddedArrayBuffer(reader.result) });\n\n\t\t\t\tjson.buffers[0].uri = options.resourcePath + name + '.' + ext;\n\n\t\t\t\tonDone({ json, resources });\n\t\t\t};\n\t\t} else {\n\t\t\tif (json.buffers && json.buffers.length > 0) {\n\t\t\t\tconst reader = new FileReader();\n\t\t\t\treader.readAsDataURL(blob);\n\t\t\t\treader.onloadend = function() {\n\t\t\t\t\tconst base64data = reader.result;\n\t\t\t\t\tjson.buffers[0].uri = base64data;\n\t\t\t\t\tonDone(json);\n\t\t\t\t};\n\t\t\t} else {\n\t\t\t\tonDone(json);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * @param {Object3D|Array<Object3D>} input\n\t */\n\tasync processInputAsync(input) {\n\t\tconst options = this.options;\n\n\t\tinput = input instanceof Array ? input : [input];\n\n\t\tawait this._invokeAllAsync(function(ext) {\n\t\t\text.beforeParse && ext.beforeParse(input);\n\t\t});\n\n\t\tconst roots = [];\n\n\t\tif (options.wrapRoot) {\n\t\t\tconst root = new Object3D();\n\t\t\troot.name = 'AuxRoot';\n\n\t\t\tfor (let i = 0; i < input.length; i++) {\n\t\t\t\t// We push directly to children instead of calling `add` to prevent\n\t\t\t\t// modify the .parent and break its original root and hierarchy\n\t\t\t\troot.children.push(input[i]);\n\t\t\t}\n\n\t\t\troots.push(root);\n\t\t} else {\n\t\t\troots.push(...input);\n\t\t}\n\n\t\tfor (let i = 0; i < roots.length; i++) {\n\t\t\troots[i].updateMatrix(); // ensure matrix is up to date\n\t\t\tawait this.processSceneAsync(roots[i]);\n\t\t}\n\n\t\tfor (let i = 0; i < this.skins.length; ++i) {\n\t\t\tthis.processSkin(this.skins[i]);\n\t\t}\n\n\t\tfor (let i = 0; i < options.animations.length; ++i) {\n\t\t\tthis.processAnimation(options.animations[i]);\n\t\t}\n\n\t\tawait this._invokeAllAsync(function(ext) {\n\t\t\text.afterParse && ext.afterParse(input);\n\t\t});\n\t}\n\n\t/**\n\t * Process Scene\n\t * @param  {Object3D} root Root object to process\n\t */\n\tasync processSceneAsync(root) {\n\t\tconst json = this.json;\n\t\tconst options = this.options;\n\n\t\tif (!json.scenes) {\n\t\t\tjson.scenes = [];\n\t\t\tjson.scene = 0;\n\t\t}\n\n\t\tconst sceneDef = {};\n\n\t\tif (root.name !== '') sceneDef.name = root.name;\n\n\t\tjson.scenes.push(sceneDef);\n\n\t\tconst nodes = [];\n\n\t\tfor (let i = 0, l = root.children.length; i < l; i++) {\n\t\t\tconst child = root.children[i];\n\n\t\t\tif ((child.visible || options.onlyVisible === false) && !child.ignoreForExport) {\n\t\t\t\tconst nodeIndex = await this.processNodeAsync(child);\n\t\t\t\tif (nodeIndex !== null) nodes.push(nodeIndex);\n\t\t\t}\n\t\t}\n\n\t\tif (nodes.length > 0) sceneDef.nodes = nodes;\n\n\t\tthis.serializeUserData(root, sceneDef);\n\t}\n\n\t/**\n\t * Process Object3D node\n\t * @param  {Object3D} object Object3D to processNodeAsync\n\t * @returns {Integer} Index of the node in the nodes list\n\t */\n\tasync processNodeAsync(object) {\n\t\tconst json = this.json;\n\t\tconst options = this.options;\n\t\tconst nodeMap = this.nodeMap;\n\n\t\tif (!json.nodes) json.nodes = [];\n\n\t\tconst nodeDef = {};\n\n\t\tif (options.trs) {\n\t\t\tconst rotation = object.quaternion.toArray();\n\t\t\tconst position = object.position.toArray();\n\t\t\tconst scale = object.scale.toArray();\n\n\t\t\tif (!equalArray(rotation, [0, 0, 0, 1])) {\n\t\t\t\tnodeDef.rotation = rotation;\n\t\t\t}\n\n\t\t\tif (!equalArray(position, [0, 0, 0])) {\n\t\t\t\tnodeDef.translation = position;\n\t\t\t}\n\n\t\t\tif (!equalArray(scale, [1, 1, 1])) {\n\t\t\t\tnodeDef.scale = scale;\n\t\t\t}\n\t\t} else {\n\t\t\tif (isIdentityMatrix(object.matrix) === false) {\n\t\t\t\tnodeDef.matrix = object.matrix.elements;\n\t\t\t}\n\t\t}\n\n\t\t// We don't export empty strings name.\n\t\tif (object.name !== '') nodeDef.name = String(object.name);\n\n\t\tthis.serializeUserData(object, nodeDef);\n\n\t\tif (object.isMesh) {\n\t\t\tconst meshIndex = await this.processMeshAsync(object);\n\t\t\tif (meshIndex !== null) nodeDef.mesh = meshIndex;\n\t\t}\n\n\t\tif (object.isSkinnedMesh) this.skins.push(object);\n\n\t\tif (object.children.length > 0) {\n\t\t\tconst children = [];\n\n\t\t\tfor (let i = 0, l = object.children.length; i < l; i++) {\n\t\t\t\tconst child = object.children[i];\n\n\t\t\t\tif ((child.visible || options.onlyVisible === false) && !child.ignoreForExport) {\n\t\t\t\t\tconst nodeIndex = await this.processNodeAsync(child);\n\t\t\t\t\tif (nodeIndex !== null) children.push(nodeIndex);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (children.length > 0) nodeDef.children = children;\n\t\t}\n\n\t\tawait this._invokeAllAsync(function(ext) {\n\t\t\text.writeNode && ext.writeNode(object, nodeDef);\n\t\t});\n\n\t\tconst nodeIndex = json.nodes.push(nodeDef) - 1;\n\t\tnodeMap.set(object, nodeIndex);\n\t\treturn nodeIndex;\n\t}\n\n\t/**\n\t * Process mesh\n\t * @param {Mesh} mesh Mesh to process\n\t * @returns {Integer|null} Index of the processed mesh in the \"meshes\" array\n\t */\n\tasync processMeshAsync(mesh) {\n\t\tconst cache = this.cache;\n\t\tconst json = this.json;\n\n\t\tconst meshCacheKeyParts = [mesh.geometry.uuid];\n\n\t\tif (Array.isArray(mesh.material)) {\n\t\t\tfor (let i = 0, l = mesh.material.length; i < l; i++) {\n\t\t\t\tmeshCacheKeyParts.push(mesh.material[i].uuid);\n\t\t\t}\n\t\t} else {\n\t\t\tmeshCacheKeyParts.push(mesh.material.uuid);\n\t\t}\n\n\t\tconst meshCacheKey = meshCacheKeyParts.join(':');\n\n\t\tif (cache.meshes.has(meshCacheKey)) return cache.meshes.get(meshCacheKey);\n\n\t\tconst geometry = mesh.geometry;\n\n\t\t// If material is an array, we only get drawMode from the first material for now\n\t\tconst drawMode = Array.isArray(mesh.material) ? mesh.material[0].drawMode : mesh.material.drawMode;\n\t\tconst mode = DRAW_MODE_TO_GLTF[drawMode];\n\n\t\tconst morphTargets = mesh.morphTargetInfluences !== null && mesh.morphTargetInfluences.length > 0;\n\n\t\t// KHR_draco_mesh_compression\n\t\t// Only TRIANGLES and TRIANGLE_STRIP are supported.\n\t\t// Morph targets are not supported because glTF does not support Draco compression with morph targets.\n\t\tconst draco = this.options.draco &&\n\t\t\t(drawMode === DRAW_MODE.TRIANGLES || drawMode === DRAW_MODE.TRIANGLE_STRIP) &&\n\t\t\t!morphTargets;\n\n\t\tconst meshDef = {};\n\t\tconst attributes = {};\n\t\tconst primitives = [];\n\t\tconst targets = [];\n\n\t\tfor (let attributeName in geometry.attributes) {\n\t\t\tconst attribute = geometry.attributes[attributeName];\n\t\t\tattributeName = ATTRIBUTE_NAME_TO_GLTF[attributeName] || attributeName;\n\n\t\t\t// Skip custom attributes\n\t\t\tif (validVertexAttributes.test(attributeName) === false) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (cache.attributes.has(this.getUID(attribute))) {\n\t\t\t\tattributes[attributeName] = cache.attributes.get(this.getUID(attribute));\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// TODO Enforce glTF vertex attribute requirements:\n\t\t\t// - JOINTS_0 must be UNSIGNED_BYTE or UNSIGNED_SHORT\n\t\t\t// - Only custom attributes may be INT or UNSIGNED_INT\n\n\t\t\tconst accessor = this.processAccessor(attribute, geometry, undefined, undefined, draco);\n\n\t\t\tif (accessor !== null) {\n\t\t\t\tthis.detectMeshQuantization(attributeName, attribute);\n\n\t\t\t\tattributes[attributeName] = accessor;\n\t\t\t\tcache.attributes.set(this.getUID(attribute), accessor);\n\t\t\t}\n\t\t}\n\n\t\t// Skip if no exportable attributes found\n\t\tif (Object.keys(attributes).length === 0) return null;\n\n\t\t// Morph targets\n\t\tif (morphTargets) {\n\t\t\t// glTF 2.0 Specification:\n\t\t\t// https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#morph-targets\n\n\t\t\tconst weights = [];\n\n\t\t\tfor (let i = 0; i < mesh.morphTargetInfluences.length; ++i) {\n\t\t\t\tconst target = {};\n\t\t\t\tlet warned = false;\n\n\t\t\t\tfor (const attributeName in geometry.morphAttributes) {\n\t\t\t\t\t// glTF 2.0 morph supports only POSITION/NORMAL/TANGENT.\n\t\t\t\t\t// t3d doesn't support TANGENT yet.\n\n\t\t\t\t\tif (attributeName !== 'position' && attributeName !== 'normal') {\n\t\t\t\t\t\tif (!warned) {\n\t\t\t\t\t\t\tconsole.warn('GLTFExporter: Only POSITION and NORMAL morph are supported.');\n\t\t\t\t\t\t\twarned = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\tconst attribute = geometry.morphAttributes[attributeName][i];\n\t\t\t\t\tconst gltfAttributeName = attributeName.toUpperCase();\n\n\t\t\t\t\ttarget[gltfAttributeName] = this.processAccessor(attribute, geometry);\n\t\t\t\t\tcache.attributes.set(this.getUID(attribute), target[gltfAttributeName]);\n\t\t\t\t}\n\n\t\t\t\ttargets.push(target);\n\n\t\t\t\tweights.push(mesh.morphTargetInfluences[i]);\n\t\t\t}\n\n\t\t\tmeshDef.weights = weights;\n\t\t}\n\n\t\tconst isMultiMaterial = Array.isArray(mesh.material);\n\n\t\tif (isMultiMaterial && geometry.groups.length === 0) return null;\n\n\t\tconst materials = isMultiMaterial ? mesh.material : [mesh.material];\n\t\tconst groups = isMultiMaterial ? geometry.groups : [{ materialIndex: 0, start: undefined, count: undefined }];\n\n\t\tlet extensions;\n\t\tif (draco) {\n\t\t\tlet dracoBufferView;\n\n\t\t\tconst attributesKey = createAttributesKey(attributes);\n\t\t\tif (cache.bufferViews.has(attributesKey)) {\n\t\t\t\tdracoBufferView = cache.bufferViews.get(attributesKey);\n\t\t\t} else {\n\t\t\t\tdracoBufferView = this.processDracoBufferView(geometry);\n\t\t\t\tcache.bufferViews.set(attributesKey, dracoBufferView);\n\t\t\t}\n\n\t\t\textensions = { KHR_draco_mesh_compression: dracoBufferView };\n\t\t}\n\n\t\tfor (let i = 0, il = groups.length; i < il; i++) {\n\t\t\tconst primitive = {\n\t\t\t\tmode: mode,\n\t\t\t\tattributes: attributes\n\t\t\t};\n\n\t\t\tthis.serializeUserData(geometry, primitive);\n\n\t\t\tif (targets.length > 0) primitive.targets = targets;\n\n\t\t\tif (extensions) primitive.extensions = extensions;\n\n\t\t\tif (geometry.index !== null) {\n\t\t\t\tlet cacheKey = this.getUID(geometry.index);\n\n\t\t\t\tif (groups[i].start !== undefined || groups[i].count !== undefined) {\n\t\t\t\t\tcacheKey += ':' + groups[i].start + ':' + groups[i].count;\n\t\t\t\t}\n\n\t\t\t\tif (cache.attributes.has(cacheKey)) {\n\t\t\t\t\tprimitive.indices = cache.attributes.get(cacheKey);\n\t\t\t\t} else {\n\t\t\t\t\tprimitive.indices = this.processAccessor(geometry.index, geometry, groups[i].start, groups[i].count);\n\t\t\t\t\tcache.attributes.set(cacheKey, primitive.indices);\n\t\t\t\t}\n\n\t\t\t\tif (primitive.indices === null) delete primitive.indices;\n\t\t\t}\n\n\t\t\tconst material = await this.processMaterialAsync(materials[groups[i].materialIndex]);\n\n\t\t\tif (material !== null) primitive.material = material;\n\n\t\t\tprimitives.push(primitive);\n\t\t}\n\n\t\tmeshDef.primitives = primitives;\n\n\t\tif (!json.meshes) json.meshes = [];\n\n\t\tawait this._invokeAllAsync(function(ext) {\n\t\t\text.writeMesh && ext.writeMesh(mesh, meshDef);\n\t\t});\n\n\t\tconst index = json.meshes.push(meshDef) - 1;\n\t\tcache.meshes.set(meshCacheKey, index);\n\t\treturn index;\n\t}\n\n\t/**\n\t * Process attribute to generate an accessor\n\t * @param  {Attribute} attribute Attribute to process\n\t * @param  {Geometry} geometry (Optional) Geometry used for truncated draw range\n\t * @param  {Integer} start (Optional)\n\t * @param  {Integer} count (Optional)\n\t * @param  {boolean} skipBufferView (Optional) Skip creating a bufferView and return the accessor\n\t * @returns {Integer|null} Index of the processed accessor on the \"accessors\" array\n\t */\n\tprocessAccessor(attribute, geometry, start, count, skipBufferView = false) {\n\t\tconst json = this.json;\n\n\t\tconst types = {\n\t\t\t1: 'SCALAR',\n\t\t\t2: 'VEC2',\n\t\t\t3: 'VEC3',\n\t\t\t4: 'VEC4',\n\t\t\t9: 'MAT3',\n\t\t\t16: 'MAT4'\n\t\t};\n\n\t\tlet componentType;\n\n\t\t// Detect the component type of the attribute array\n\t\tif (attribute.buffer.array.constructor === Float32Array) {\n\t\t\tcomponentType = GLTF_CONSTANTS.FLOAT;\n\t\t} else if (attribute.buffer.array.constructor === Int32Array) {\n\t\t\tcomponentType = GLTF_CONSTANTS.INT;\n\t\t} else if (attribute.buffer.array.constructor === Uint32Array) {\n\t\t\tcomponentType = GLTF_CONSTANTS.UNSIGNED_INT;\n\t\t} else if (attribute.buffer.array.constructor === Int16Array) {\n\t\t\tcomponentType = GLTF_CONSTANTS.SHORT;\n\t\t} else if (attribute.buffer.array.constructor === Uint16Array) {\n\t\t\tcomponentType = GLTF_CONSTANTS.UNSIGNED_SHORT;\n\t\t} else if (attribute.buffer.array.constructor === Int8Array) {\n\t\t\tcomponentType = GLTF_CONSTANTS.BYTE;\n\t\t} else if (attribute.buffer.array.constructor === Uint8Array) {\n\t\t\tcomponentType = GLTF_CONSTANTS.UNSIGNED_BYTE;\n\t\t} else {\n\t\t\tthrow new Error('GLTFExporter: Unsupported bufferAttribute component type: ' + attribute.buffer.array.constructor.name);\n\t\t}\n\n\t\tif (start === undefined) start = 0;\n\t\tif (count === undefined || count === Infinity) count = attribute.buffer.count;\n\n\t\t// Skip creating an accessor if the attribute doesn't have data to export\n\t\tif (count === 0) return null;\n\n\t\tconst minMax = getMinMax(attribute, start, count);\n\n\t\tconst accessorDef = {\n\t\t\tcomponentType: componentType,\n\t\t\tcount: count,\n\t\t\tmax: minMax.max,\n\t\t\tmin: minMax.min,\n\t\t\ttype: types[attribute.size]\n\t\t};\n\n\t\tif (!skipBufferView) {\n\t\t\tlet bufferViewTarget;\n\n\t\t\t// If geometry isn't provided, don't infer the target usage of the bufferView. For\n\t\t\t// animation samplers, target must not be set.\n\t\t\tif (geometry !== undefined) {\n\t\t\t\tbufferViewTarget = attribute === geometry.index ? GLTF_CONSTANTS.ELEMENT_ARRAY_BUFFER : GLTF_CONSTANTS.ARRAY_BUFFER;\n\t\t\t}\n\n\t\t\taccessorDef.bufferView = this.processBufferView(attribute, componentType, start, count, bufferViewTarget);\n\t\t\t// accessorDef.byteOffset = 0;\n\t\t}\n\n\t\tif (attribute.normalized === true) accessorDef.normalized = true;\n\t\tif (!json.accessors) json.accessors = [];\n\n\t\treturn json.accessors.push(accessorDef) - 1;\n\t}\n\n\t/**\n\t * Process and generate a BufferView\n\t * @param  {Attribute} attribute\n\t * @param  {number} componentType\n\t * @param  {number} start\n\t * @param  {number} count\n\t * @param  {number} target (Optional) Target usage of the BufferView\n\t * @returns {Integer|null} Index of the processed BufferView on the \"bufferViews\" array\n\t */\n\tprocessBufferView(attribute, componentType, start, count, target) {\n\t\tconst json = this.json;\n\n\t\tif (!json.bufferViews) json.bufferViews = [];\n\n\t\t// Create a new dataview and dump the attribute's array into it\n\n\t\tlet componentSize;\n\n\t\tswitch (componentType) {\n\t\t\tcase GLTF_CONSTANTS.BYTE:\n\t\t\tcase GLTF_CONSTANTS.UNSIGNED_BYTE:\n\t\t\t\tcomponentSize = 1;\n\t\t\t\tbreak;\n\t\t\tcase GLTF_CONSTANTS.SHORT:\n\t\t\tcase GLTF_CONSTANTS.UNSIGNED_SHORT:\n\t\t\t\tcomponentSize = 2;\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tcomponentSize = 4;\n\t\t}\n\n\t\tlet byteStride = attribute.size * componentSize;\n\n\t\tif (target === GLTF_CONSTANTS.ARRAY_BUFFER) {\n\t\t\t// Each element of a vertex attribute MUST be aligned to 4-byte boundaries\n\t\t\t// inside a bufferView\n\t\t\tbyteStride = Math.ceil(byteStride / 4) * 4;\n\t\t}\n\n\t\tconst byteLength = getPaddedBufferSize(count * byteStride);\n\t\tconst dataView = new DataView(new ArrayBuffer(byteLength));\n\t\tlet offset = 0;\n\n\t\tfor (let i = start; i < start + count; i++) {\n\t\t\tfor (let a = 0; a < attribute.size; a++) {\n\t\t\t\tconst value = attribute.buffer.array[i * attribute.size + a];\n\n\t\t\t\tif (componentType === GLTF_CONSTANTS.FLOAT) {\n\t\t\t\t\tdataView.setFloat32(offset, value, true);\n\t\t\t\t} else if (componentType === GLTF_CONSTANTS.INT) {\n\t\t\t\t\tdataView.setInt32(offset, value, true);\n\t\t\t\t} else if (componentType === GLTF_CONSTANTS.UNSIGNED_INT) {\n\t\t\t\t\tdataView.setUint32(offset, value, true);\n\t\t\t\t} else if (componentType === GLTF_CONSTANTS.SHORT) {\n\t\t\t\t\tdataView.setInt16(offset, value, true);\n\t\t\t\t} else if (componentType === GLTF_CONSTANTS.UNSIGNED_SHORT) {\n\t\t\t\t\tdataView.setUint16(offset, value, true);\n\t\t\t\t} else if (componentType === GLTF_CONSTANTS.BYTE) {\n\t\t\t\t\tdataView.setInt8(offset, value);\n\t\t\t\t} else if (componentType === GLTF_CONSTANTS.UNSIGNED_BYTE) {\n\t\t\t\t\tdataView.setUint8(offset, value);\n\t\t\t\t}\n\n\t\t\t\toffset += componentSize;\n\t\t\t}\n\n\t\t\tif ((offset % byteStride) !== 0) {\n\t\t\t\toffset += byteStride - (offset % byteStride);\n\t\t\t}\n\t\t}\n\n\t\tconst bufferViewDef = {\n\t\t\tbuffer: this.processBuffer(dataView.buffer),\n\t\t\tbyteOffset: this.byteOffset,\n\t\t\tbyteLength: byteLength\n\t\t};\n\n\t\tif (target !== undefined) bufferViewDef.target = target;\n\n\t\tif (target === GLTF_CONSTANTS.ARRAY_BUFFER) {\n\t\t\t// Only define byteStride for vertex attributes.\n\t\t\tbufferViewDef.byteStride = byteStride;\n\t\t}\n\n\t\tthis.byteOffset += byteLength;\n\n\t\treturn json.bufferViews.push(bufferViewDef) - 1;\n\t}\n\n\t/**\n\t * Process and generate a draco compressed BufferView\n\t * @param  {Geometry} geometry\n\t * @returns {object}\n\t */\n\tprocessDracoBufferView(geometry) {\n\t\tconst json = this.json;\n\n\t\tif (!json.bufferViews) json.bufferViews = [];\n\n\t\tconst { buffer, attributes } = this.dracoExporter.parse(geometry, this.dracoOptions);\n\n\t\tconst paddedBuffer = getPaddedArrayBuffer(buffer);\n\t\tconst byteLength = paddedBuffer.byteLength;\n\n\t\tconst bufferViewDef = {\n\t\t\tbuffer: this.processBuffer(paddedBuffer),\n\t\t\tbyteOffset: this.byteOffset,\n\t\t\tbyteLength: byteLength\n\t\t};\n\n\t\tthis.byteOffset += byteLength;\n\n\t\tthis.extensionsUsed['KHR_draco_mesh_compression'] = true;\n\t\tthis.extensionsRequired['KHR_draco_mesh_compression'] = true;\n\n\t\treturn {\n\t\t\tbufferView: json.bufferViews.push(bufferViewDef) - 1,\n\t\t\tattributes\n\t\t};\n\t}\n\n\t/**\n\t * Process a buffer to append to the default one.\n\t * @param  {ArrayBuffer} buffer\n\t * @returns {Integer}\n\t */\n\tprocessBuffer(buffer) {\n\t\tconst json = this.json;\n\t\tconst buffers = this.buffers;\n\n\t\tif (!json.buffers) json.buffers = [{ byteLength: 0 }];\n\n\t\t// All buffers are merged before export.\n\t\tbuffers.push(buffer);\n\n\t\treturn 0;\n\t}\n\n\t/**\n\t * Process material\n\t * @param  {Material} material Material to process\n\t * @returns {Integer|null} Index of the processed material in the \"materials\" array\n\t */\n\tasync processMaterialAsync(material) {\n\t\tconst cache = this.cache;\n\t\tconst json = this.json;\n\n\t\tif (cache.materials.has(material)) return cache.materials.get(material);\n\n\t\tif (!json.materials) json.materials = [];\n\n\t\tconst materialDef = { pbrMetallicRoughness: {} };\n\n\t\t// pbrMetallicRoughness.baseColorFactor\n\t\tconst color = material.diffuse.toArray().concat([material.opacity]);\n\n\t\tif (!equalArray(color, [1, 1, 1, 1])) {\n\t\t\tmaterialDef.pbrMetallicRoughness.baseColorFactor = color;\n\t\t}\n\n\t\tmaterialDef.pbrMetallicRoughness.metallicFactor = material.metalness !== undefined ? material.metalness : 0;\n\t\tmaterialDef.pbrMetallicRoughness.roughnessFactor = material.roughness !== undefined ? material.roughness : 1;\n\n\t\t// pbrMetallicRoughness.metallicRoughnessTexture\n\t\tif (material.metalnessMap || material.roughnessMap) {\n\t\t\tconst metalRoughTexture = await this.buildMetalRoughTextureAsync(material.metalnessMap, material.roughnessMap);\n\n\t\t\tconst metalRoughMapDef = {\n\t\t\t\tindex: await this.processTextureAsync(metalRoughTexture)\n\t\t\t};\n\t\t\tmaterialDef.pbrMetallicRoughness.metallicRoughnessTexture = metalRoughMapDef;\n\t\t}\n\n\t\t// pbrMetallicRoughness.baseColorTexture\n\t\tif (material.diffuseMap) {\n\t\t\tconst baseColorMapDef = {\n\t\t\t\tindex: await this.processTextureAsync(material.diffuseMap),\n\t\t\t\ttexCoord: material.diffuseMapCoord\n\t\t\t};\n\t\t\tthis.applyTextureTransform(baseColorMapDef, material.diffuseMapTransform);\n\t\t\tmaterialDef.pbrMetallicRoughness.baseColorTexture = baseColorMapDef;\n\t\t}\n\n\t\tif (material.emissive) {\n\t\t\tconst emissive = material.emissive;\n\t\t\tconst maxEmissiveComponent = Math.max(emissive.r, emissive.g, emissive.b);\n\n\t\t\tif (maxEmissiveComponent > 0) {\n\t\t\t\tmaterialDef.emissiveFactor = material.emissive.toArray();\n\t\t\t}\n\n\t\t\t// emissiveTexture\n\t\t\tif (material.emissiveMap) {\n\t\t\t\tconst emissiveMapDef = {\n\t\t\t\t\tindex: await this.processTextureAsync(material.emissiveMap),\n\t\t\t\t\ttexCoord: material.emissiveMapCoord\n\t\t\t\t};\n\t\t\t\tthis.applyTextureTransform(emissiveMapDef, material.emissiveMapTransform);\n\t\t\t\tmaterialDef.emissiveTexture = emissiveMapDef;\n\t\t\t}\n\t\t}\n\n\t\t// normalTexture\n\t\tif (material.normalMap) {\n\t\t\tconst normalMapDef = {\n\t\t\t\tindex: await this.processTextureAsync(material.normalMap)\n\t\t\t};\n\n\t\t\tif (material.normalScale && material.normalScale.x !== 1) {\n\t\t\t\t// glTF normal scale is univariate. Ignore `y`, which may be flipped.\n\t\t\t\tnormalMapDef.scale = material.normalScale.x;\n\t\t\t}\n\n\t\t\tmaterialDef.normalTexture = normalMapDef;\n\t\t}\n\n\t\t// occlusionTexture\n\t\tif (material.aoMap) {\n\t\t\tconst occlusionMapDef = {\n\t\t\t\tindex: await this.processTextureAsync(material.aoMap),\n\t\t\t\ttexCoord: material.aoMapCoord\n\t\t\t};\n\n\t\t\tif (material.aoMapIntensity !== 1.0) {\n\t\t\t\tocclusionMapDef.strength = material.aoMapIntensity;\n\t\t\t}\n\n\t\t\tthis.applyTextureTransform(occlusionMapDef, material.aoMapTransform);\n\t\t\tmaterialDef.occlusionTexture = occlusionMapDef;\n\t\t}\n\n\t\t// alphaMode\n\t\tif (material.transparent) {\n\t\t\tmaterialDef.alphaMode = 'BLEND';\n\t\t} else {\n\t\t\tif (material.alphaTest > 0.0) {\n\t\t\t\tmaterialDef.alphaMode = 'MASK';\n\t\t\t\tmaterialDef.alphaCutoff = material.alphaTest;\n\t\t\t}\n\t\t}\n\n\t\t// doubleSided.\n\t\t// Since BackSide is not a valid glTF value, it is currently ignored.\n\t\t// TODO: Implement opposite drawing indices order for backface rendering.\n\t\tif (material.side === DRAW_SIDE.DOUBLE) materialDef.doubleSided = true;\n\t\tif (material.name !== '') materialDef.name = material.name;\n\n\t\tthis.serializeUserData(material, materialDef);\n\n\t\tawait this._invokeAllAsync(async function(ext) {\n\t\t\text.writeMaterialAsync && await ext.writeMaterialAsync(material, materialDef);\n\t\t});\n\n\t\tconst index = json.materials.push(materialDef) - 1;\n\t\tcache.materials.set(material, index);\n\t\treturn index;\n\t}\n\n\t/**\n\t * Process texture\n\t * @param  {TextureBase} map Map to process\n\t * @returns {Integer} Index of the processed texture in the \"textures\" array\n\t */\n\tasync processTextureAsync(map) {\n\t\tconst cache = this.cache;\n\t\tconst json = this.json;\n\n\t\tif (cache.textures.has(map)) return cache.textures.get(map);\n\n\t\tif (!json.textures) json.textures = [];\n\n\t\t// TODO compressed texture\n\n\t\tlet mimeType = map.userData.mimeType;\n\n\t\tif (mimeType === 'image/webp') mimeType = 'image/png';\n\n\t\tconst textureDef = {\n\t\t\tsampler: this.processSampler(map),\n\t\t\tsource: this.processImage(map.image, map.format, map.flipY, mimeType)\n\t\t};\n\n\t\tif (map.name) textureDef.name = map.name;\n\n\t\tawait this._invokeAllAsync(async function(ext) {\n\t\t\text.writeTexture && await ext.writeTexture(map, textureDef);\n\t\t});\n\n\t\tconst index = json.textures.push(textureDef) - 1;\n\t\tcache.textures.set(map, index);\n\t\treturn index;\n\t}\n\n\t/**\n\t * Process image\n\t * @param  {Image} image to process\n\t * @param  {Integer} format of the image (RGBAFormat)\n\t * @param  {boolean} flipY before writing out the image\n\t * @param  {string} mimeType export format\n\t * @returns {Integer} Index of the processed texture in the \"images\" array\n\t */\n\tprocessImage(image, format, flipY, mimeType = 'image/png') {\n\t\tif (image === null) {\n\t\t\tthrow new Error('GLTFExporter: No valid image data found. Unable to process texture.');\n\t\t}\n\n\t\tconst cache = this.cache;\n\t\tconst json = this.json;\n\t\tconst options = this.options;\n\t\tconst pending = this.pending;\n\n\t\tif (!cache.images.has(image)) cache.images.set(image, {});\n\n\t\tconst cachedImages = cache.images.get(image);\n\n\t\tconst key = mimeType + ':flipY/' + flipY.toString();\n\n\t\tif (cachedImages[key] !== undefined) return cachedImages[key];\n\n\t\tif (!json.images) json.images = [];\n\n\t\tconst imageDef = { mimeType: mimeType };\n\n\t\tif (image.__name) imageDef.name = image.__name;\n\n\t\tconst canvas = getCanvas();\n\n\t\tcanvas.width = Math.min(image.width, options.maxTextureSize);\n\t\tcanvas.height = Math.min(image.height, options.maxTextureSize);\n\n\t\tconst ctx = canvas.getContext('2d', {\n\t\t\twillReadFrequently: true\n\t\t});\n\n\t\tif (flipY === true) {\n\t\t\tctx.translate(0, canvas.height);\n\t\t\tctx.scale(1, -1);\n\t\t}\n\n\t\tif (image.data !== undefined) {\n\t\t\tif (format !== PIXEL_FORMAT.RGBA) {\n\t\t\t\tconsole.error('GLTFExporter: Only RGBA Format is supported.', format);\n\t\t\t}\n\n\t\t\tif (image.width > options.maxTextureSize || image.height > options.maxTextureSize) {\n\t\t\t\tconsole.warn('GLTFExporter: Image size is bigger than maxTextureSize', image);\n\t\t\t}\n\n\t\t\tconst data = new Uint8ClampedArray(image.height * image.width * 4);\n\n\t\t\tfor (let i = 0; i < data.length; i += 4) {\n\t\t\t\tdata[i + 0] = image.data[i + 0];\n\t\t\t\tdata[i + 1] = image.data[i + 1];\n\t\t\t\tdata[i + 2] = image.data[i + 2];\n\t\t\t\tdata[i + 3] = image.data[i + 3];\n\t\t\t}\n\n\t\t\tctx.putImageData(new ImageData(data, image.width, image.height), 0, 0);\n\t\t} else {\n\t\t\tif ((typeof HTMLImageElement !== 'undefined' && image instanceof HTMLImageElement) ||\n\t\t\t\t(typeof HTMLCanvasElement !== 'undefined' && image instanceof HTMLCanvasElement) ||\n\t\t\t\t(typeof ImageBitmap !== 'undefined' && image instanceof ImageBitmap) ||\n\t\t\t\t(typeof OffscreenCanvas !== 'undefined' && image instanceof OffscreenCanvas)) {\n\t\t\t\tctx.drawImage(image, 0, 0, canvas.width, canvas.height);\n\t\t\t} else {\n\t\t\t\tthrow new Error('GLTFExporter: Invalid image type. Use HTMLImageElement, HTMLCanvasElement, ImageBitmap or OffscreenCanvas.');\n\t\t\t}\n\t\t}\n\n\t\tif (options.format === GLTF_FORMAT.GLB) {\n\t\t\tpending.push(\n\t\t\t\tgetToBlobPromise(canvas, mimeType)\n\t\t\t\t\t.then(blob => this.processBufferViewImage(blob))\n\t\t\t\t\t.then(bufferViewIndex => {\n\t\t\t\t\t\timageDef.bufferView = bufferViewIndex;\n\t\t\t\t\t})\n\t\t\t);\n\t\t} else {\n\t\t\tif (canvas.toDataURL !== undefined) {\n\t\t\t\tconst dataURL = canvas.toDataURL(mimeType);\n\t\t\t\tthis.setImageUri(imageDef, dataURL);\n\t\t\t} else {\n\t\t\t\tpending.push(\n\t\t\t\t\tgetToBlobPromise(canvas, mimeType)\n\t\t\t\t\t\t.then(blob => new FileReader().readAsDataURL(blob))\n\t\t\t\t\t\t.then(dataURL => {\n\t\t\t\t\t\t\tthis.setImageUri(imageDef, dataURL);\n\t\t\t\t\t\t})\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\tconst index = json.images.push(imageDef) - 1;\n\t\tcachedImages[key] = index;\n\t\treturn index;\n\t}\n\n\t/**\n\t * Process sampler\n\t * @param  {Texture} map Texture to process\n\t * @returns {Integer} Index of the processed texture in the \"samplers\" array\n\t */\n\tprocessSampler(map) {\n\t\tconst json = this.json;\n\n\t\tif (!json.samplers) json.samplers = [];\n\n\t\tconst samplerDef = {\n\t\t\tmagFilter: T3D_TO_GLTF[map.magFilter],\n\t\t\tminFilter: T3D_TO_GLTF[map.minFilter],\n\t\t\twrapS: T3D_TO_GLTF[map.wrapS],\n\t\t\twrapT: T3D_TO_GLTF[map.wrapT]\n\t\t};\n\n\t\treturn json.samplers.push(samplerDef) - 1;\n\t}\n\n\t/**\n\t * Process and generate a BufferView from an image Blob.\n\t * @param {Blob} blob\n\t * @returns {Promise<Integer>}\n\t */\n\tprocessBufferViewImage(blob) {\n\t\tconst writer = this;\n\t\tconst json = writer.json;\n\n\t\tif (!json.bufferViews) json.bufferViews = [];\n\n\t\treturn new Promise(function(resolve) {\n\t\t\tconst reader = new FileReader();\n\t\t\treader.readAsArrayBuffer(blob);\n\t\t\treader.onloadend = function() {\n\t\t\t\tconst buffer = getPaddedArrayBuffer(reader.result);\n\n\t\t\t\tconst bufferViewDef = {\n\t\t\t\t\tbuffer: writer.processBuffer(buffer),\n\t\t\t\t\tbyteOffset: writer.byteOffset,\n\t\t\t\t\tbyteLength: buffer.byteLength\n\t\t\t\t};\n\n\t\t\t\twriter.byteOffset += buffer.byteLength;\n\t\t\t\tresolve(json.bufferViews.push(bufferViewDef) - 1);\n\t\t\t};\n\t\t});\n\t}\n\n\t/**\n\t * @param {Object3D} object\n\t * @returns {number|null}\n\t */\n\tprocessSkin(object) {\n\t\tconst json = this.json;\n\t\tconst nodeMap = this.nodeMap;\n\n\t\tconst node = json.nodes[nodeMap.get(object)];\n\n\t\tconst skeleton = object.skeleton;\n\n\t\tif (skeleton === undefined) return null;\n\n\t\tconst rootJoint = object.skeleton.bones[0];\n\n\t\tif (rootJoint === undefined) return null;\n\n\t\tconst joints = [];\n\t\tconst inverseBindMatrices = new Float32Array(skeleton.bones.length * 16);\n\t\tconst temporaryBoneInverse = new Matrix4();\n\n\t\tfor (let i = 0; i < skeleton.bones.length; ++i) {\n\t\t\tjoints.push(nodeMap.get(skeleton.bones[i]));\n\t\t\ttemporaryBoneInverse.copy(skeleton.boneInverses[i]);\n\t\t\ttemporaryBoneInverse.multiply(object.bindMatrix).toArray(inverseBindMatrices, i * 16);\n\t\t}\n\n\t\tif (json.skins === undefined) json.skins = [];\n\n\t\tjson.skins.push({\n\t\t\tinverseBindMatrices: this.processAccessor(new Attribute(new Buffer(new Float32Array(inverseBindMatrices), 16))),\n\t\t\tjoints: joints,\n\t\t\tskeleton: nodeMap.get(rootJoint)\n\t\t});\n\n\t\tconst skinIndex = node.skin = json.skins.length - 1;\n\n\t\treturn skinIndex;\n\t}\n\n\t/**\n\t * Creates glTF animation entry from AnimationClip object.\n\t *\n\t * Status:\n\t * - Only properties listed in PATH_PROPERTIES may be animated.\n\t * @param {AnimationClip} clip\n\t * @returns {number|null}\n\t */\n\tprocessAnimation(clip) {\n\t\tconst json = this.json;\n\t\tconst nodeMap = this.nodeMap;\n\n\t\tif (!json.animations) json.animations = [];\n\n\t\tconst tracks = clip.tracks;\n\t\tconst channels = [];\n\t\tconst samplers = [];\n\n\t\tfor (let i = 0; i < tracks.length; ++i) {\n\t\t\tconst track = tracks[i];\n\t\t\tconst trackNode = track.target;\n\t\t\tconst trackProperty = PATH_PROPERTIES[track.propertyPath];\n\n\t\t\tif (!trackNode || !trackProperty) {\n\t\t\t\tconsole.warn('GLTFExporter: Could not export animation track \"%s\".', track.name);\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tconst inputItemSize = 1;\n\t\t\tlet outputItemSize = track.valueSize;\n\n\t\t\tif (trackProperty === PATH_PROPERTIES.morphTargetInfluences) {\n\t\t\t\toutputItemSize = 1;\n\t\t\t}\n\n\t\t\tconst interpolation = INTERPOLANT_TO_GLTF.get(track.interpolant.constructor) || 'LINEAR';\n\n\t\t\tsamplers.push({\n\t\t\t\tinput: this.processAccessor(new Attribute(new Buffer(new Float32Array(track.times), inputItemSize))),\n\t\t\t\toutput: this.processAccessor(new Attribute(new Buffer(new Float32Array(track.values), outputItemSize))),\n\t\t\t\tinterpolation: interpolation\n\t\t\t});\n\n\t\t\tchannels.push({\n\t\t\t\tsampler: samplers.length - 1,\n\t\t\t\ttarget: {\n\t\t\t\t\tnode: nodeMap.get(trackNode),\n\t\t\t\t\tpath: trackProperty\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tjson.animations.push({\n\t\t\tname: clip.name || 'clip_' + json.animations.length,\n\t\t\tsamplers: samplers,\n\t\t\tchannels: channels\n\t\t});\n\n\t\treturn json.animations.length - 1;\n\t}\n\n\tapplyTextureTransform(mapDef, matrix) {\n\t\tlet didTransform = false;\n\t\tconst transformDef = {};\n\n\t\tconst { tx, ty, sx, sy, rotation } = decompose(matrix);\n\n\t\tif (tx !== 0 || ty !== 0) {\n\t\t\ttransformDef.offset = [tx, ty];\n\t\t\tdidTransform = true;\n\t\t}\n\n\t\tif (rotation !== 0) {\n\t\t\ttransformDef.rotation = rotation;\n\t\t\tdidTransform = true;\n\t\t}\n\n\t\tif (sx !== 1 || sy !== 1) {\n\t\t\ttransformDef.scale = [sx, sy];\n\t\t\tdidTransform = true;\n\t\t}\n\n\t\tif (didTransform) {\n\t\t\tmapDef.extensions = mapDef.extensions || {};\n\t\t\tmapDef.extensions['KHR_texture_transform'] = transformDef;\n\t\t\tthis.extensionsUsed['KHR_texture_transform'] = true;\n\t\t}\n\t}\n\n\tasync buildMetalRoughTextureAsync(metalnessMap, roughnessMap) {\n\t\tif (metalnessMap === roughnessMap) return metalnessMap;\n\n\t\tfunction getEncodingConversion(map) {\n\t\t\tif (map.encoding === TEXEL_ENCODING_TYPE.SRGB) {\n\t\t\t\treturn function SRGBToLinear(c) {\n\t\t\t\t\treturn c < 0.04045 ? c * 0.0773993808 : Math.pow(c * 0.9478672986 + 0.0521327014, 2.4);\n\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn function LinearToLinear(c) {\n\t\t\t\treturn c;\n\t\t\t};\n\t\t}\n\n\t\tconst metalness = metalnessMap ? metalnessMap.image : null;\n\t\tconst roughness = roughnessMap ? roughnessMap.image : null;\n\n\t\tconst width = Math.max(metalness ? metalness.width : 0, roughness ? roughness.width : 0);\n\t\tconst height = Math.max(metalness ? metalness.height : 0, roughness ? roughness.height : 0);\n\n\t\tconst canvas = getCanvas();\n\t\tcanvas.width = width;\n\t\tcanvas.height = height;\n\n\t\tconst context = canvas.getContext('2d', {\n\t\t\twillReadFrequently: true\n\t\t});\n\t\tcontext.fillStyle = '#00ffff';\n\t\tcontext.fillRect(0, 0, width, height);\n\n\t\tconst composite = context.getImageData(0, 0, width, height);\n\n\t\tif (metalness) {\n\t\t\tcontext.drawImage(metalness, 0, 0, width, height);\n\n\t\t\tconst convert = getEncodingConversion(metalnessMap);\n\t\t\tconst data = context.getImageData(0, 0, width, height).data;\n\n\t\t\tfor (let i = 2; i < data.length; i += 4) {\n\t\t\t\tcomposite.data[i] = convert(data[i] / 256) * 256;\n\t\t\t}\n\t\t}\n\n\t\tif (roughness) {\n\t\t\tcontext.drawImage(roughness, 0, 0, width, height);\n\n\t\t\tconst convert = getEncodingConversion(roughnessMap);\n\t\t\tconst data = context.getImageData(0, 0, width, height).data;\n\n\t\t\tfor (let i = 1; i < data.length; i += 4) {\n\t\t\t\tcomposite.data[i] = convert(data[i] / 256) * 256;\n\t\t\t}\n\t\t}\n\n\t\tcontext.putImageData(composite, 0, 0);\n\n\t\t//\n\n\t\tconst reference = metalnessMap || roughnessMap;\n\n\t\tconst texture = reference.clone();\n\n\t\ttexture.image = canvas;\n\t\ttexture.encoding = TEXEL_ENCODING_TYPE.LINEAR;\n\n\t\tconsole.warn('GLTFExporter: Merged metalnessMap and roughnessMap textures.');\n\n\t\treturn texture;\n\t}\n\n\t/**\n\t * Serializes a userData.\n\t * @param {Object3D|Material} object\n\t * @param {object} objectDef\n\t */\n\tserializeUserData(object, objectDef) {\n\t\tif (!object.userData) return;\n\t\tif (Object.keys(object.userData).length === 0) return;\n\n\t\tconst options = this.options;\n\t\tconst extensionsUsed = this.extensionsUsed;\n\n\t\tconst json = JSON.parse(JSON.stringify(object.userData));\n\n\t\tif (options.includeCustomExtensions && json.gltfExtensions) {\n\t\t\tif (objectDef.extensions === undefined) objectDef.extensions = {};\n\n\t\t\tfor (const extensionName in json.gltfExtensions) {\n\t\t\t\tobjectDef.extensions[extensionName] = json.gltfExtensions[extensionName];\n\t\t\t\textensionsUsed[extensionName] = true;\n\t\t\t}\n\n\t\t\tdelete json.gltfExtensions;\n\t\t}\n\n\t\tif (Object.keys(json).length > 0) objectDef.extras = json;\n\t}\n\n\t/**\n\t * Returns ids for buffer attributes.\n\t * @param  {object} attribute\n\t * @returns {Integer}\n\t */\n\tgetUID(attribute) {\n\t\tif (this.uids.has(attribute) === false) {\n\t\t\tthis.uids.set(attribute, this.uid++);\n\t\t}\n\n\t\treturn this.uids.get(attribute);\n\t}\n\n\t/**\n\t * Returns unique file names.\n\t * @param {string} originalName\n\t * @param {string} ext\n\t * @returns {string} unique name\n\t */\n\tgetUniqueFileName(originalName, ext) {\n\t\tif (!this.fileNamesUsed[ext]) this.fileNamesUsed[ext] = {};\n\n\t\tconst namesUsed = this.fileNamesUsed[ext];\n\n\t\tif (originalName in namesUsed) {\n\t\t\treturn originalName + '_' + (++namesUsed[originalName]);\n\t\t} else {\n\t\t\tnamesUsed[originalName] = 0;\n\t\t\treturn originalName;\n\t\t}\n\t}\n\n\t/**\n\t * Set uri to imageDef by dataURL.\n\t * @param {object} imageDef\n\t * @param {string} dataURL\n\t */\n\tsetImageUri(imageDef, dataURL) {\n\t\tconst options = this.options;\n\n\t\tif (options.format !== GLTF_FORMAT.GLTF_SEPARATE) {\n\t\t\timageDef.uri = dataURL;\n\t\t\treturn;\n\t\t}\n\n\t\tconst ext = imageDef.mimeType === 'image/jpeg' ? 'jpg' : 'png';\n\t\tconst name = this.getUniqueFileName(imageDef.name || 'image', ext);\n\n\t\tthis.resources.push({ name, ext, content: dataURL });\n\n\t\timageDef.uri = options.resourcePath + name + '.' + ext;\n\t}\n\n\t/**\n\t * If a vertex attribute with a\n\t * [non-standard data type](https://registry.khronos.org/glTF/specs/2.0/glTF-2.0.html#meshes-overview)\n\t * is used, it is checked whether it is a valid data type according to the\n\t * [KHR_mesh_quantization](https://github.com/KhronosGroup/glTF/blob/main/extensions/2.0/Khronos/KHR_mesh_quantization/README.md)\n\t * extension.\n\t * In this case the extension is automatically added to the list of used extensions.\n\t * @param {string} attributeName\n\t * @param {Attribute} attribute\n\t */\n\tdetectMeshQuantization(attributeName, attribute) {\n\t\tif (this.extensionsUsed[KHR_MESH_QUANTIZATION]) return;\n\n\t\tlet attrType = undefined;\n\n\t\tswitch (attribute.buffer.array.constructor) {\n\t\t\tcase Int8Array:\n\t\t\t\tattrType = 'byte';\n\t\t\t\tbreak;\n\t\t\tcase Uint8Array:\n\t\t\t\tattrType = 'unsigned byte';\n\t\t\t\tbreak;\n\t\t\tcase Int16Array:\n\t\t\t\tattrType = 'short';\n\t\t\t\tbreak;\n\t\t\tcase Uint16Array:\n\t\t\t\tattrType = 'unsigned short';\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\treturn;\n\t\t}\n\n\t\tif (attribute.normalized) attrType += ' normalized';\n\n\t\tconst attrNamePrefix = attributeName.split('_', 1)[0];\n\n\t\tif (KHR_mesh_quantization_ExtraAttrTypes[attrNamePrefix] && KHR_mesh_quantization_ExtraAttrTypes[attrNamePrefix].includes(attrType)) {\n\t\t\tthis.extensionsUsed[KHR_MESH_QUANTIZATION] = true;\n\t\t\tthis.extensionsRequired[KHR_MESH_QUANTIZATION] = true;\n\t\t}\n\t}\n\n\tasync _invokeAllAsync(func) {\n\t\tfor (let i = 0, il = this.plugins.length; i < il; i++) {\n\t\t\tawait func(this.plugins[i]);\n\t\t}\n\t}\n\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 GLTFLightExtension {\n\n\tconstructor(writer) {\n\t\tthis.writer = writer;\n\t\tthis.name = 'KHR_lights_punctual';\n\t}\n\n\twriteNode(light, nodeDef) {\n\t\tif (!light.isLight) return;\n\n\t\tif (!light.isDirectionalLight && !light.isPointLight && !light.isSpotLight) {\n\t\t\tconsole.warn('GLTFExporter: Only directional, point, and spot lights are supported.', light);\n\t\t\treturn;\n\t\t}\n\n\t\tconst writer = this.writer;\n\t\tconst json = writer.json;\n\t\tconst extensionsUsed = writer.extensionsUsed;\n\n\t\tconst lightDef = {};\n\n\t\tif (light.name) lightDef.name = light.name;\n\n\t\tlightDef.color = light.color.toArray();\n\n\t\tlightDef.intensity = light.intensity;\n\n\t\tif (light.isDirectionalLight) {\n\t\t\tlightDef.type = 'directional';\n\t\t} else if (light.isPointLight) {\n\t\t\tlightDef.type = 'point';\n\n\t\t\tif (light.distance > 0) lightDef.range = light.distance;\n\t\t} else if (light.isSpotLight) {\n\t\t\tlightDef.type = 'spot';\n\n\t\t\tif (light.distance > 0) lightDef.range = light.distance;\n\n\t\t\tlightDef.spot = {};\n\t\t\tlightDef.spot.innerConeAngle = (1.0 - light.penumbra) * light.angle;\n\t\t\tlightDef.spot.outerConeAngle = light.angle;\n\t\t}\n\n\t\tif (light.decay !== undefined && light.decay !== 2) {\n\t\t\tconsole.warn('GLTFExporter: Light decay may be lost. glTF is physically-based, '\n\t\t\t\t+ 'and expects light.decay=2.');\n\t\t}\n\n\t\tif (!extensionsUsed[this.name]) {\n\t\t\tjson.extensions = json.extensions || {};\n\t\t\tjson.extensions[this.name] = { lights: [] };\n\t\t\textensionsUsed[this.name] = true;\n\t\t}\n\n\t\tconst lights = json.extensions[this.name].lights;\n\t\tlights.push(lightDef);\n\n\t\tnodeDef.extensions = nodeDef.extensions || {};\n\t\tnodeDef.extensions[this.name] = { light: lights.length - 1 };\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(writer) {\n\t\tthis.writer = writer;\n\t\tthis.name = 'KHR_materials_unlit';\n\t}\n\n\tasync writeMaterialAsync(material, materialDef) {\n\t\tif (material.type !== MATERIAL_TYPE.BASIC) return;\n\n\t\tconst writer = this.writer;\n\t\tconst extensionsUsed = writer.extensionsUsed;\n\n\t\tmaterialDef.extensions = materialDef.extensions || {};\n\t\tmaterialDef.extensions[this.name] = {};\n\n\t\textensionsUsed[this.name] = true;\n\n\t\tmaterialDef.pbrMetallicRoughness.metallicFactor = 0.0;\n\t\tmaterialDef.pbrMetallicRoughness.roughnessFactor = 0.9;\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 GLTFMeshGpuInstancingExtension {\n\n\tconstructor(writer) {\n\t\tthis.writer = writer;\n\t\tthis.name = 'EXT_mesh_gpu_instancing';\n\t}\n\n\twriteNode(object, nodeDef) {\n\t\tif (!object.isMesh) return;\n\n\t\tconst geometry = object.geometry;\n\n\t\tif (geometry.instanceCount === -1) return;\n\n\t\tconst instanceMatrixAttribute = geometry.attributes.instanceMatrix;\n\n\t\tif (!instanceMatrixAttribute || instanceMatrixAttribute.divisor === 0) return;\n\n\t\tconst writer = this.writer;\n\n\t\tconst count = geometry.instanceCount;\n\n\t\tconst translationAttr = new Float32Array(count * 3);\n\t\tconst rotationAttr = new Float32Array(count * 4);\n\t\tconst scaleAttr = new Float32Array(count * 3);\n\n\t\tconst matrix = new Matrix4();\n\t\tconst position = new Vector3();\n\t\tconst quaternion = new Quaternion();\n\t\tconst scale = new Vector3();\n\n\t\tfor (let i = 0; i < count; i++) {\n\t\t\tmatrix.fromArray(instanceMatrixAttribute.buffer.array, i * 16);\n\t\t\tmatrix.decompose(position, quaternion, scale);\n\n\t\t\tposition.toArray(translationAttr, i * 3);\n\t\t\tquaternion.toArray(rotationAttr, i * 4);\n\t\t\tscale.toArray(scaleAttr, i * 3);\n\t\t}\n\n\t\tconst attributes = {\n\t\t\tTRANSLATION: writer.processAccessor(new Attribute(new Buffer(translationAttr, 3))),\n\t\t\tROTATION: writer.processAccessor(new Attribute(new Buffer(rotationAttr, 4))),\n\t\t\tSCALE: writer.processAccessor(new Attribute(new Buffer(scaleAttr, 3)))\n\t\t};\n\n\t\tnodeDef.extensions = nodeDef.extensions || {};\n\t\tnodeDef.extensions[this.name] = { attributes };\n\n\t\twriter.extensionsUsed[this.name] = true;\n\t\twriter.extensionsRequired[this.name] = true;\n\t}\n\n}\n\nexport { GLTFExporter, GLTF_FORMAT, GLTFMaterialsUnlitExtension, GLTFMeshGpuInstancingExtension, GLTFLightExtension };"
  },
  {
    "path": "examples/jsm/geometries/BitmapTextGeometry.js",
    "content": "import { Geometry, Buffer, Attribute } from 't3d';\n\n/**\n * BitmapTextGeometry - generates a geometry for a bitmap text\n * reference: https://github.com/leochocolat/three-msdf-text-utils/blob/main/src/MSDFTextGeometry/index.js\n */\nclass BitmapTextGeometry extends Geometry {\n\n\t/**\n\t * @param {object | string} options - the options or text string to render\n\t * @param {string} options.text - the text to layout. Newline characters (\\n) will cause line breaks\n\t * @param {object} options.font - the BMFont definition which holds chars, kernings, etc\n\t * @param {number} [options.width] - the desired width of the text box, causes word-wrapping and clipping in \"pre\" mode. Leave as undefined to remove\n\t * @param {string} [options.mode] - a mode for word-wrapper; can be 'pre' (maintain spacing), or 'nowrap' (collapse whitespace but only break on newline characters), otherwise assumes normal word-wrap behaviour (collapse whitespace, break at width or newlines)\n\t * @param {string} [options.align='left'] - can be \"left\", \"center\" or \"right\"\n\t * @param {number} [options.letterSpacing=0] - the letter spacing in pixels\n\t * @param {number} [options.tabSize=4] - the number of spaces to use in a single tab\n\t * @param {number} [options.baseline=font.common.base] - the baseline height in pixels\n\t * @param {number} [options.lineHeight=font.common.lineHeight] - the line height in pixels\n\t * @param {boolean} [options.flipY=true] - whether the texture will be Y-flipped (default true)\n\t * @param {number} [options.centerX=0.5] - the center of the text in X axis, 0.5 is center, 0 is left, 1 is right\n\t * @param {number} [options.centerY=0.5] - the center of the text in Y axis, 0.5 is center, 0 is top, 1 is bottom\n\t */\n\tconstructor(options) {\n\t\tsuper();\n\n\t\t// Set text as object property\n\t\tif (typeof options === 'string') options = { text: options };\n\n\t\t// use these as default values for any subsequent\n\t\t// calls to update()\n\t\tthis._options = Object.assign({}, options);\n\n\t\tthis._layout = null;\n\t\tthis._visibleGlyphs = [];\n\n\t\tthis.update(this._options);\n\t}\n\n\tget layout() {\n\t\treturn this._layout;\n\t}\n\n\tget visibleGlyphs() {\n\t\treturn this._visibleGlyphs;\n\t}\n\n\tupdate(options) {\n\t\tthis.dispose();\n\n\t\toptions = this._validateOptions(options);\n\n\t\tif (!options) return;\n\n\t\tthis._layout = new TextLayout(options);\n\n\t\t// get vec2 texcoords\n\t\tconst flipY = options.flipY !== false;\n\n\t\t// the desired BMFont data\n\t\tconst font = options.font;\n\n\t\t// determine texture size from font file\n\t\tconst texWidth = font.common.scaleW;\n\t\tconst texHeight = font.common.scaleH;\n\n\t\t// get visible glyphs\n\t\tconst glyphs = this._layout.glyphs.filter(glyph => {\n\t\t\tconst bitmap = glyph.data;\n\t\t\treturn bitmap.width * bitmap.height > 0;\n\t\t});\n\n\t\t// provide visible glyphs for convenience\n\t\tthis._visibleGlyphs = glyphs;\n\n\t\t// get vertex data\n\t\tconst attributes = generateAttributes(glyphs, texWidth, texHeight, flipY, font.info.size);\n\t\tconst numIndices = glyphs.length * 6;\n\t\tconst indices = new Array(numIndices);\n\t\tfor (let i = 0, j = 0; i < numIndices; i += 6, j += 4) {\n\t\t\tindices[i + 0] = j + 0;\n\t\t\tindices[i + 1] = j + 1;\n\t\t\tindices[i + 2] = j + 2;\n\t\t\tindices[i + 3] = j + 0;\n\t\t\tindices[i + 4] = j + 2;\n\t\t\tindices[i + 5] = j + 3;\n\t\t}\n\n\t\t// set vertex data\n\t\tthis.addAttribute('a_Position', new Attribute(new Buffer(attributes.positions, 3)));\n\t\tthis.addAttribute('a_Uv', new Attribute(new Buffer(attributes.uvs, 2)));\n\t\tthis.addAttribute('a_Size', new Attribute(new Buffer(attributes.sizes, 2)));\n\t\tthis.setIndex(indices);\n\n\t\tthis.computeBoundingBox();\n\n\t\tconst centerX = options.centerX !== undefined ? options.centerX : 0.5;\n\t\tconst centerY = options.centerY !== undefined ? (1 - options.centerY) : 0.5;\n\t\tif (centerX !== 0 || centerY !== 0) {\n\t\t\tconst xOffset = (this.boundingBox.max.x - this.boundingBox.min.x) * centerX;\n\t\t\tconst yOffset = (this.boundingBox.max.y - this.boundingBox.min.y) * centerY;\n\n\t\t\tconst positions = this.attributes.a_Position.buffer.array;\n\t\t\tfor (let i = 0, l = positions.length; i < l; i += 3) {\n\t\t\t\tpositions[i] -= xOffset;\n\t\t\t\tpositions[i + 1] -= yOffset;\n\t\t\t}\n\n\t\t\tthis.computeBoundingBox();\n\t\t}\n\n\t\tthis.computeBoundingSphere();\n\t}\n\n\t_validateOptions(options) {\n\t\t// Set text as object property\n\t\tif (typeof options === 'string') options = { text: options };\n\n\t\t// Use constructor defaults\n\t\toptions = Object.assign({}, this._options, options);\n\n\t\t// Check for font property\n\t\tif (!options.font) throw new TypeError('must specify a { font } in options');\n\n\t\treturn options;\n\t}\n\n}\n\nfunction generateAttributes(glyphs, texWidth, texHeight, flipY, fontSize) {\n\tconst uvs = new Float32Array(glyphs.length * 4 * 2);\n\tconst positions = new Float32Array(glyphs.length * 4 * 3);\n\tconst sizes = new Float32Array(glyphs.length * 4 * 2);\n\n\tlet i = 0;\n\tlet j = 0;\n\tlet k = 0;\n\n\tglyphs.forEach(function(glyph) {\n\t\tconst bitmap = glyph.data;\n\n\t\t// UV: texture coordinates\n\n\t\tconst bw = (bitmap.x + bitmap.width);\n\t\tconst bh = (bitmap.y + bitmap.height);\n\n\t\t// top left position\n\t\tconst u0 = bitmap.x / texWidth;\n\t\tlet v1 = bitmap.y / texHeight;\n\t\tconst u1 = bw / texWidth;\n\t\tlet v0 = bh / texHeight;\n\n\t\tif (flipY) {\n\t\t\tv1 = (texHeight - bitmap.y) / texHeight;\n\t\t\tv0 = (texHeight - bh) / texHeight;\n\t\t}\n\n\t\t// BL\n\t\tuvs[i++] = u0;\n\t\tuvs[i++] = v1;\n\t\t// TL\n\t\tuvs[i++] = u0;\n\t\tuvs[i++] = v0;\n\t\t// TR\n\t\tuvs[i++] = u1;\n\t\tuvs[i++] = v0;\n\t\t// BR\n\t\tuvs[i++] = u1;\n\t\tuvs[i++] = v1;\n\n\t\t// Position: the position of the quad vertices\n\n\t\t// bottom left position\n\t\tconst x = glyph.position[0] + bitmap.xoffset;\n\t\tconst y = glyph.position[1] + bitmap.yoffset;\n\n\t\t// quad size\n\t\tconst w = bitmap.width;\n\t\tconst h = bitmap.height;\n\n\t\t// BL\n\t\tpositions[j++] = x;\n\t\tpositions[j++] = -y;\n\t\tpositions[j++] = 0;\n\t\t// TL\n\t\tpositions[j++] = x;\n\t\tpositions[j++] = -(y + h);\n\t\tpositions[j++] = 0;\n\t\t// TR\n\t\tpositions[j++] = x + w;\n\t\tpositions[j++] = -(y + h);\n\t\tpositions[j++] = 0;\n\t\t// BR\n\t\tpositions[j++] = x + w;\n\t\tpositions[j++] = -y;\n\t\tpositions[j++] = 0;\n\n\t\t// Size: The size in the unit of 1,0,0 for the standard size of the text.\n\t\t// Currently used to measure the anti-aliasing scaling ratio in the shader.\n\n\t\t// BL\n\t\tsizes[k++] = 0;\n\t\tsizes[k++] = 0;\n\t\t// TL\n\t\tsizes[k++] = 0;\n\t\tsizes[k++] = h / fontSize;\n\t\t// TR\n\t\tsizes[k++] = w / fontSize;\n\t\tsizes[k++] = h / fontSize;\n\t\t// BR\n\t\tsizes[k++] = w / fontSize;\n\t\tsizes[k++] = 0;\n\t});\n\n\treturn { uvs, positions, sizes };\n}\n\n/**\n *****************************************************************\n * TextLayout - https://github.com/leochocolat/three-msdf-text-utils/blob/main/src/MSDFTextGeometry/TextLayout.js\n * Dependencies: Word Wrapping\n *****************************************************************\n */\n\nconst X_HEIGHTS = ['x', 'e', 'a', 'o', 'n', 's', 'r', 'c', 'u', 'm', 'v', 'w', 'z'];\nconst M_WIDTHS = ['m', 'w'];\nconst CAP_HEIGHTS = ['H', 'I', 'N', 'E', 'F', 'K', 'L', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'];\n\nconst TAB_ID = '\\t'.charCodeAt(0);\nconst SPACE_ID = ' '.charCodeAt(0);\nconst ALIGN_LEFT = 0;\nconst ALIGN_CENTER = 1;\nconst ALIGN_RIGHT = 2;\n\nclass TextLayout {\n\n\tconstructor(options = {}) {\n\t\tthis.glyphs = [];\n\t\tthis._measure = this.computeMetrics.bind(this);\n\t\tthis.update(options);\n\t}\n\n\tget width() {\n\t\treturn this._width;\n\t}\n\n\tget height() {\n\t\treturn this._height;\n\t}\n\n\tget descender() {\n\t\treturn this._descender;\n\t}\n\n\tget ascender() {\n\t\treturn this._ascender;\n\t}\n\n\tget xHeight() {\n\t\treturn this._xHeight;\n\t}\n\n\tget baseline() {\n\t\treturn this._baseline;\n\t}\n\n\tget capHeight() {\n\t\treturn this._capHeight;\n\t}\n\n\tget lineHeight() {\n\t\treturn this._lineHeight;\n\t}\n\n\tget linesTotal() {\n\t\treturn this._linesTotal;\n\t}\n\n\tget lettersTotal() {\n\t\treturn this._lettersTotal;\n\t}\n\n\tget wordsTotal() {\n\t\treturn this._wordsTotal;\n\t}\n\n\tupdate(options) {\n\t\toptions = Object.assign({ measure: this._measure }, options);\n\n\t\tthis._options = options;\n\t\tthis._options.tabSize = number(this._options.tabSize, 4);\n\n\t\tif (!options.font) { throw new Error('must provide a valid bitmap font') }\n\n\t\tconst glyphs = this.glyphs;\n\t\tconst text = options.text || '';\n\t\tconst font = options.font;\n\t\tthis._setupSpaceGlyphs(font);\n\n\t\tconst lines = wordwrap(text, options);\n\t\tconst minWidth = options.width || 0;\n\n\t\tconst wordsTotal = text.split(' ').filter(word => word !== '\\n').length;\n\t\tconst lettersTotal = text.split('').filter(char => char !== '\\n' && char !== ' ').length;\n\n\t\t// clear glyphs\n\t\tglyphs.length = 0;\n\n\t\t// get max line width\n\t\tconst maxLineWidth = lines.reduce(function(prev, line) {\n\t\t\treturn Math.max(prev, line.width, minWidth);\n\t\t}, 0);\n\n\t\t// the pen position\n\t\tlet x = 0;\n\t\tlet y = 0;\n\t\tconst lineHeight = number(options.lineHeight, font.common.lineHeight);\n\t\tconst baseline = number(options.baseline, font.common.base);\n\t\tconst descender = lineHeight - baseline;\n\t\tconst letterSpacing = options.letterSpacing || 0;\n\t\tconst height = lineHeight * lines.length - descender;\n\t\tconst align = getAlignType(this._options.align);\n\n\t\t// draw text along baseline\n\t\ty -= height;\n\n\t\t// the metrics for this text layout\n\t\tthis._width = maxLineWidth;\n\t\tthis._height = height;\n\t\tthis._descender = lineHeight - baseline;\n\t\tthis._baseline = baseline;\n\t\tthis._xHeight = getXHeight(font);\n\t\tthis._capHeight = getCapHeight(font);\n\t\tthis._lineHeight = lineHeight;\n\t\tthis._ascender = lineHeight - descender - this._xHeight;\n\n\t\tlet wordIndex = 0;\n\t\tlet letterIndex = 0;\n\n\t\t// layout each glyph\n\t\tlines.forEach((line, lineIndex) => {\n\t\t\tconst start = line.start;\n\t\t\tconst end = line.end;\n\t\t\tconst lineWidth = line.width;\n\t\t\tconst lineString = text.slice(start, end);\n\n\t\t\tconst lineWordsTotal = lineString.split(' ').filter(item => item !== '').length;\n\t\t\tconst lineLettersTotal = text.slice(start, end).split(' ').join('').length;\n\t\t\tlet lineLetterIndex = 0;\n\t\t\tlet lineWordIndex = 0;\n\n\t\t\tlet lastGlyph;\n\n\t\t\t// for each glyph in that line...\n\t\t\tfor (let i = start; i < end; i++) {\n\t\t\t\tconst id = text.charCodeAt(i);\n\t\t\t\tconst glyph = this.getGlyph(font, id);\n\n\t\t\t\tif (glyph) {\n\t\t\t\t\tif (lastGlyph) {\n\t\t\t\t\t\tx += getKerning(font, lastGlyph.id, glyph.id);\n\t\t\t\t\t}\n\n\t\t\t\t\tlet tx = x;\n\t\t\t\t\tif (align === ALIGN_CENTER) {\n\t\t\t\t\t\ttx += (maxLineWidth - lineWidth) / 2;\n\t\t\t\t\t} else if (align === ALIGN_RIGHT) {\n\t\t\t\t\t\ttx += (maxLineWidth - lineWidth);\n\t\t\t\t\t}\n\n\t\t\t\t\tglyphs.push({\n\t\t\t\t\t\tposition: [tx, y],\n\t\t\t\t\t\tdata: glyph,\n\t\t\t\t\t\tindex: i,\n\t\t\t\t\t\t// Line\n\t\t\t\t\t\tlinesTotal: lines.length,\n\t\t\t\t\t\tlineIndex,\n\t\t\t\t\t\tlineLettersTotal,\n\t\t\t\t\t\tlineLetterIndex,\n\t\t\t\t\t\tlineWordsTotal,\n\t\t\t\t\t\tlineWordIndex,\n\t\t\t\t\t\t// Word\n\t\t\t\t\t\twordsTotal,\n\t\t\t\t\t\twordIndex,\n\t\t\t\t\t\t// Letter\n\t\t\t\t\t\tlettersTotal,\n\t\t\t\t\t\tletterIndex\n\t\t\t\t\t});\n\n\t\t\t\t\tif (glyph.id === SPACE_ID && (!lastGlyph || lastGlyph.id !== SPACE_ID)) {\n\t\t\t\t\t\tlineWordIndex++;\n\t\t\t\t\t\twordIndex++;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (glyph.id !== SPACE_ID) {\n\t\t\t\t\t\tlineLetterIndex++;\n\t\t\t\t\t\tletterIndex++;\n\t\t\t\t\t}\n\n\t\t\t\t\t// move pen forward\n\t\t\t\t\tx += glyph.xadvance + letterSpacing;\n\t\t\t\t\tlastGlyph = glyph;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// next line down\n\t\t\ty += lineHeight;\n\t\t\tx = 0;\n\t\t});\n\n\t\tthis._lettersTotal = lettersTotal;\n\t\tthis._wordsTotal = wordsTotal;\n\t\tthis._linesTotal = lines.length;\n\t}\n\n\tgetGlyph(font, id) {\n\t\tconst glyph = getGlyphById(font, id);\n\n\t\tif (glyph) {\n\t\t\treturn glyph;\n\t\t} else if (id === TAB_ID) {\n\t\t\treturn this._fallbackTabGlyph;\n\t\t} else if (id === SPACE_ID) {\n\t\t\treturn this._fallbackSpaceGlyph;\n\t\t}\n\n\t\treturn null;\n\t}\n\n\tcomputeMetrics(text, start, end, width) {\n\t\tconst letterSpacing = this._options.letterSpacing || 0;\n\t\tconst font = this._options.font;\n\t\tlet curPen = 0;\n\t\tlet curWidth = 0;\n\t\tlet count = 0;\n\t\tlet glyph;\n\t\tlet lastGlyph;\n\n\t\tif (!font.chars || font.chars.length === 0) {\n\t\t\treturn {\n\t\t\t\tstart,\n\t\t\t\tend: start,\n\t\t\t\twidth: 0\n\t\t\t};\n\t\t}\n\n\t\tend = Math.min(text.length, end);\n\n\t\tfor (let i = start; i < end; i++) {\n\t\t\tconst id = text.charCodeAt(i);\n\t\t\tglyph = this.getGlyph(font, id);\n\n\t\t\tif (glyph) {\n\t\t\t\tglyph.char = text[i];\n\t\t\t\t// move pen forward\n\t\t\t\tconst kern = lastGlyph ? getKerning(font, lastGlyph.id, glyph.id) : 0;\n\t\t\t\tcurPen += kern;\n\n\t\t\t\tconst nextPen = curPen + glyph.xadvance + letterSpacing;\n\t\t\t\tconst nextWidth = curPen + glyph.width;\n\n\t\t\t\t// we've hit our limit; we can't move onto the next glyph\n\t\t\t\tif (nextWidth >= width || nextPen >= width) { break }\n\n\t\t\t\t// otherwise continue along our line\n\t\t\t\tcurPen = nextPen;\n\t\t\t\tcurWidth = nextWidth;\n\t\t\t\tlastGlyph = glyph;\n\t\t\t}\n\t\t\tcount++;\n\t\t}\n\n\t\t// make sure rightmost edge lines up with rendered glyphs\n\t\tif (lastGlyph) { curWidth += lastGlyph.xoffset }\n\n\t\treturn {\n\t\t\tstart,\n\t\t\tend: start + count,\n\t\t\twidth: curWidth\n\t\t};\n\t}\n\n\t_setupSpaceGlyphs(font) {\n\t\t// These are fallbacks, when the font doesn't include\n\t\t// ' ' or '\\t' glyphs\n\t\tthis._fallbackSpaceGlyph = null;\n\t\tthis._fallbackTabGlyph = null;\n\n\t\tif (!font.chars || font.chars.length === 0) return;\n\n\t\t// try to get space glyph\n\t\t// then fall back to the 'm' or 'w' glyphs\n\t\t// then fall back to the first glyph available\n\t\tconst space = getGlyphById(font, SPACE_ID) || getMGlyph(font) || font.chars[0];\n\n\t\t// and create a fallback for tab\n\t\tconst tabWidth = this._options.tabSize * space.xadvance;\n\t\tthis._fallbackSpaceGlyph = space;\n\t\tconst spaceClone = Object.assign({}, space);\n\t\tthis._fallbackTabGlyph = Object.assign(spaceClone, {\n\t\t\tx: 0,\n\t\t\ty: 0,\n\t\t\txadvance: tabWidth,\n\t\t\tid: TAB_ID,\n\t\t\txoffset: 0,\n\t\t\tyoffset: 0,\n\t\t\twidth: 0,\n\t\t\theight: 0\n\t\t});\n\t}\n\n}\n\nfunction getGlyphById(font, id) {\n\tif (!font.chars || font.chars.length === 0) { return null }\n\n\tconst glyphIdx = findChar(font.chars, id);\n\n\tif (glyphIdx >= 0) {\n\t\tconst glyph = font.chars[glyphIdx];\n\t\treturn glyph;\n\t}\n\n\treturn null;\n}\n\nfunction getXHeight(font) {\n\tfor (let i = 0; i < X_HEIGHTS.length; i++) {\n\t\tconst id = X_HEIGHTS[i].charCodeAt(0);\n\t\tconst idx = findChar(font.chars, id);\n\t\tif (idx >= 0) { return font.chars[idx].height }\n\t}\n\treturn 0;\n}\n\nfunction getMGlyph(font) {\n\tfor (let i = 0; i < M_WIDTHS.length; i++) {\n\t\tconst id = M_WIDTHS[i].charCodeAt(0);\n\t\tconst idx = findChar(font.chars, id);\n\t\tif (idx >= 0) { return font.chars[idx] }\n\t}\n\treturn 0;\n}\n\nfunction getCapHeight(font) {\n\tfor (let i = 0; i < CAP_HEIGHTS.length; i++) {\n\t\tconst id = CAP_HEIGHTS[i].charCodeAt(0);\n\t\tconst idx = findChar(font.chars, id);\n\t\tif (idx >= 0) { return font.chars[idx].height }\n\t}\n\treturn 0;\n}\n\nfunction getKerning(font, left, right) {\n\tif (!font.kernings || font.kernings.length === 0) { return 0 }\n\n\tconst table = font.kernings;\n\tfor (let i = 0; i < table.length; i++) {\n\t\tconst kern = table[i];\n\t\tif (kern.first === left && kern.second === right) { return kern.amount }\n\t}\n\treturn 0;\n}\n\nfunction getAlignType(align) {\n\tif (align === 'center') { return ALIGN_CENTER } else if (align === 'right') { return ALIGN_RIGHT }\n\treturn ALIGN_LEFT;\n}\n\nfunction findChar(array, value, start) {\n\tstart = start || 0;\n\tfor (let i = start; i < array.length; i++) {\n\t\tif (array[i].id === value) {\n\t\t\treturn i;\n\t\t}\n\t}\n\treturn -1;\n}\n\nfunction number(num, def) {\n\treturn typeof num === 'number' ? num : (typeof def === 'number' ? def : 0);\n}\n\n/**\n *****************************************************************\n * Word Wrapping - https://github.com/mattdesl/word-wrapper\n * Modified to support chinese characters\n *****************************************************************\n */\n\nconst newline = /\\n/;\nconst newlineChar = '\\n';\nconst whitespace = /\\s/;\nconst letter = /[a-zA-Z]/;\n\nfunction wordwrap(text, opt = {}) {\n\t// zero width results in nothing visible\n\tif (opt.width === 0 && opt.mode !== 'nowrap') {\n\t\treturn [];\n\t}\n\n\ttext = text || '';\n\tconst width = typeof opt.width === 'number' ? opt.width : Number.MAX_VALUE;\n\tconst start = Math.max(0, opt.start || 0);\n\tconst end = typeof opt.end === 'number' ? opt.end : text.length;\n\tconst mode = opt.mode;\n\n\tconst measure = opt.measure || monospace;\n\tif (mode === 'pre') {\n\t\treturn pre(measure, text, start, end, width);\n\t} else {\n\t\treturn greedy(measure, text, start, end, width, mode);\n\t}\n}\n\nfunction idxOf(text, chr, start, end) {\n\tconst idx = text.indexOf(chr, start);\n\tif (idx === -1 || idx > end) {\n\t\treturn end;\n\t}\n\treturn idx;\n}\n\nfunction isWhitespace(chr) {\n\treturn whitespace.test(chr);\n}\n\nfunction pre(measure, text, start, end, width) {\n\tconst lines = [];\n\tlet lineStart = start;\n\tfor (let i = start; i < end && i < text.length; i++) {\n\t\tconst chr = text.charAt(i);\n\t\tconst isNewline = newline.test(chr);\n\n\t\t// If we've reached a newline, then step down a line\n\t\t// Or if we've reached the EOF\n\t\tif (isNewline || i === end - 1) {\n\t\t\tconst lineEnd = isNewline ? i : i + 1;\n\t\t\tconst measured = measure(text, lineStart, lineEnd, width);\n\t\t\tlines.push(measured);\n\n\t\t\tlineStart = i + 1;\n\t\t}\n\t}\n\treturn lines;\n}\n\nfunction greedy(measure, text, start, end, width, mode) {\n\t// A greedy word wrapper based on LibGDX algorithm\n\t// https://github.com/libgdx/libgdx/blob/master/gdx/src/com/badlogic/gdx/graphics/g2d/BitmapFontCache.java\n\tconst lines = [];\n\n\tlet testWidth = width;\n\t// if 'nowrap' is specified, we only wrap on newline chars\n\tif (mode === 'nowrap') {\n\t\ttestWidth = Number.MAX_VALUE;\n\t}\n\n\tlet newParagraph = start;\n\n\twhile (start < end && start < text.length) {\n\t\t// get next newline position\n\t\tconst newLine = idxOf(text, newlineChar, start, end);\n\n\t\t// eat whitespace at start of line\n\t\twhile (start < newLine) {\n\t\t\tif (!isWhitespace(text.charAt(start))) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif (start === newParagraph) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tstart++;\n\t\t}\n\n\t\tnewParagraph = newLine + 1;\n\n\t\t// determine visible # of glyphs for the available width\n\t\tconst measured = measure(text, start, newLine, testWidth);\n\n\t\tlet lineEnd = start + (measured.end - measured.start);\n\t\tlet nextStart = lineEnd + newlineChar.length;\n\n\t\t// if we had to cut the line before the next newline...\n\t\tif (lineEnd < newLine) {\n\t\t\t// find char to break on\n\t\t\twhile (lineEnd > start) {\n\t\t\t\tif (!letter.test(text.charAt(lineEnd))) { // if not a letter, break\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tlineEnd--;\n\t\t\t}\n\t\t\tif (lineEnd === start) {\n\t\t\t\tif (nextStart > start + newlineChar.length) {\n\t\t\t\t\tnextStart--;\n\t\t\t\t}\n\t\t\t\tlineEnd = nextStart; // If no characters to break, show all.\n\t\t\t} else {\n\t\t\t\tnextStart = lineEnd;\n\t\t\t\t// eat whitespace at end of line\n\t\t\t\twhile (lineEnd > start) {\n\t\t\t\t\tif (!isWhitespace(text.charAt(lineEnd - newlineChar.length))) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tlineEnd--;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (lineEnd >= start) {\n\t\t\tconst result = measure(text, start, lineEnd, testWidth);\n\t\t\tlines.push(result);\n\t\t}\n\t\tstart = nextStart;\n\t}\n\treturn lines;\n}\n\n// determines the visible number of glyphs within a given width\nfunction monospace(text, start, end, width) {\n\tconst glyphs = Math.min(width, end - start);\n\treturn {\n\t\tstart: start,\n\t\tend: start + glyphs\n\t};\n}\n\nexport { BitmapTextGeometry };"
  },
  {
    "path": "examples/jsm/geometries/CapsuleGeometry.js",
    "content": "import { Geometry, Attribute, Buffer, Vector3 } from 't3d';\n\n/**\n * A geometry class for representing a capsule.\n */\nclass CapsuleGeometry extends Geometry {\n\n\t/**\n\t * Constructs a new capsule geometry.\n\t * @param {number} [radius=1] - Radius of the capsule.\n\t * @param {number} [height=1] - Height of the middle section.\n\t * @param {number} [capSegments=4] - Number of curve segments used to build each cap.\n\t * @param {number} [radialSegments=8] - Number of segmented faces around the circumference of the capsule. Must be an integer >= 3.\n\t * @param {number} [heightSegments=1] - Number of rows of faces along the height of the middle section. Must be an integer >= 1.\n\t */\n\tconstructor(radius = 1, height = 1, capSegments = 4, radialSegments = 8, heightSegments = 1) {\n\t\tsuper();\n\n\t\theight = Math.max(0, height);\n\t\tcapSegments = Math.max(1, Math.floor(capSegments));\n\t\tradialSegments = Math.max(3, Math.floor(radialSegments));\n\t\theightSegments = Math.max(1, Math.floor(heightSegments));\n\n\t\t// buffers\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\t// helper variables\n\n\t\tconst halfHeight = height / 2;\n\t\tconst capArcLength = (Math.PI / 2) * radius;\n\t\tconst cylinderPartLength = height;\n\t\tconst totalArcLength = 2 * capArcLength + cylinderPartLength;\n\n\t\tconst numVerticalSegments = capSegments * 2 + heightSegments;\n\t\tconst verticesPerRow = radialSegments + 1;\n\n\t\tconst normal = new Vector3();\n\t\tconst vertex = new Vector3();\n\n\t\t// generate vertices, normals, and uvs\n\n\t\tfor (let iy = 0; iy <= numVerticalSegments; iy++) {\n\t\t\tlet currentArcLength = 0;\n\t\t\tlet profileY = 0;\n\t\t\tlet profileRadius = 0;\n\t\t\tlet normalYComponent = 0;\n\n\t\t\tif (iy <= capSegments) {\n\t\t\t\t// bottom cap\n\t\t\t\tconst segmentProgress = iy / capSegments;\n\t\t\t\tconst angle = (segmentProgress * Math.PI) / 2;\n\t\t\t\tprofileY = -halfHeight - radius * Math.cos(angle);\n\t\t\t\tprofileRadius = radius * Math.sin(angle);\n\t\t\t\tnormalYComponent = -radius * Math.cos(angle);\n\t\t\t\tcurrentArcLength = segmentProgress * capArcLength;\n\t\t\t} else if (iy <= capSegments + heightSegments) {\n\t\t\t\t// middle section\n\t\t\t\tconst segmentProgress = (iy - capSegments) / heightSegments;\n\t\t\t\tprofileY = -halfHeight + segmentProgress * height;\n\t\t\t\tprofileRadius = radius;\n\t\t\t\tnormalYComponent = 0;\n\t\t\t\tcurrentArcLength = capArcLength + segmentProgress * cylinderPartLength;\n\t\t\t} else {\n\t\t\t\t// top cap\n\t\t\t\tconst segmentProgress =\n\t\t\t\t\t(iy - capSegments - heightSegments) / capSegments;\n\t\t\t\tconst angle = (segmentProgress * Math.PI) / 2;\n\t\t\t\tprofileY = halfHeight + radius * Math.sin(angle);\n\t\t\t\tprofileRadius = radius * Math.cos(angle);\n\t\t\t\tnormalYComponent = radius * Math.sin(angle);\n\t\t\t\tcurrentArcLength =\n\t\t\t\t\tcapArcLength + cylinderPartLength + segmentProgress * capArcLength;\n\t\t\t}\n\n\t\t\tconst v = Math.max(0, Math.min(1, currentArcLength / totalArcLength));\n\n\n\t\t\t// special case for the poles\n\n\t\t\tlet uOffset = 0;\n\n\t\t\tif (iy === 0) {\n\t\t\t\tuOffset = 0.5 / radialSegments;\n\t\t\t} else if (iy === numVerticalSegments) {\n\t\t\t\tuOffset = -0.5 / radialSegments;\n\t\t\t}\n\n\t\t\tfor (let ix = 0; ix <= radialSegments; ix++) {\n\t\t\t\tconst u = ix / radialSegments;\n\t\t\t\tconst theta = u * Math.PI * 2;\n\n\t\t\t\tconst sinTheta = Math.sin(theta);\n\t\t\t\tconst cosTheta = Math.cos(theta);\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertex.x = -profileRadius * cosTheta;\n\t\t\t\tvertex.y = profileY;\n\t\t\t\tvertex.z = profileRadius * sinTheta;\n\t\t\t\tvertices.push(vertex.x, vertex.y, vertex.z);\n\n\t\t\t\t// normal\n\n\t\t\t\tnormal.set(\n\t\t\t\t\t-profileRadius * cosTheta,\n\t\t\t\t\tnormalYComponent,\n\t\t\t\t\tprofileRadius * sinTheta\n\t\t\t\t);\n\t\t\t\tnormal.normalize();\n\t\t\t\tnormals.push(normal.x, normal.y, normal.z);\n\n\t\t\t\t// uv\n\n\t\t\t\tuvs.push(u + uOffset, v);\n\t\t\t}\n\n\t\t\tif (iy > 0) {\n\t\t\t\tconst prevIndexRow = (iy - 1) * verticesPerRow;\n\t\t\t\tfor (let ix = 0; ix < radialSegments; ix++) {\n\t\t\t\t\tconst i1 = prevIndexRow + ix;\n\t\t\t\t\tconst i2 = prevIndexRow + ix + 1;\n\t\t\t\t\tconst i3 = iy * verticesPerRow + ix;\n\t\t\t\t\tconst i4 = iy * verticesPerRow + ix + 1;\n\n\t\t\t\t\tindices.push(i1, i2, i3);\n\t\t\t\t\tindices.push(i2, i4, i3);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex(\n\t\t\tnew Attribute(new Buffer(vertices.length / 3 > 65536 ? new Uint32Array(indices) : new Uint16Array(indices), 1))\n\t\t);\n\t\tthis.addAttribute('a_Position', new Attribute(new Buffer(new Float32Array(vertices), 3)));\n\t\tthis.addAttribute('a_Normal', new Attribute(new Buffer(new Float32Array(normals), 3)));\n\t\tthis.addAttribute('a_Uv', new Attribute(new Buffer(new Float32Array(uvs), 2)));\n\n\t\tthis.computeBoundingBox();\n\t\tthis.computeBoundingSphere();\n\t}\n\n}\n\nexport { CapsuleGeometry };"
  },
  {
    "path": "examples/jsm/geometries/CircleGeometry.js",
    "content": "import { Geometry, Attribute, Buffer, Vector2, Vector3 } from 't3d';\n\nclass CircleGeometry extends Geometry {\n\n\tconstructor(radius = 1, segments = 32, thetaStart = 0, thetaLength = Math.PI * 2) {\n\t\tsuper();\n\n\t\tsegments = Math.max(3, segments);\n\n\t\t// buffers\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\t// helper variables\n\n\t\tconst vertex = new Vector3();\n\t\tconst uv = new Vector2();\n\n\t\t// center point\n\n\t\tvertices.push(0, 0, 0);\n\t\tnormals.push(0, 0, 1);\n\t\tuvs.push(0.5, 0.5);\n\n\t\tfor (let s = 0, i = 3; s <= segments; s++, i += 3) {\n\t\t\tconst segment = thetaStart + (s / segments) * thetaLength;\n\n\t\t\t// vertex\n\n\t\t\tvertex.x = radius * Math.cos(segment);\n\t\t\tvertex.y = radius * Math.sin(segment);\n\n\t\t\tvertices.push(vertex.x, vertex.y, vertex.z);\n\n\t\t\t// normal\n\n\t\t\tnormals.push(0, 0, 1);\n\n\t\t\t// uvs\n\n\t\t\tuv.x = (vertices[i] / radius + 1) / 2;\n\t\t\tuv.y = (vertices[i + 1] / radius + 1) / 2;\n\n\t\t\tuvs.push(uv.x, uv.y);\n\t\t}\n\n\t\t// indices\n\n\t\tfor (let i = 1; i <= segments; i++) {\n\t\t\tindices.push(i, i + 1, 0);\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex(\n\t\t\tnew Attribute(new Buffer(vertices.length / 3 > 65536 ? new Uint32Array(indices) : new Uint16Array(indices), 1))\n\t\t);\n\t\tthis.addAttribute('a_Position', new Attribute(new Buffer(new Float32Array(vertices), 3)));\n\t\tthis.addAttribute('a_Normal', new Attribute(new Buffer(new Float32Array(normals), 3)));\n\t\tthis.addAttribute('a_Uv', new Attribute(new Buffer(new Float32Array(uvs), 2)));\n\n\t\tthis.computeBoundingBox();\n\t\tthis.computeBoundingSphere();\n\t}\n\n}\n\nexport { CircleGeometry };\n"
  },
  {
    "path": "examples/jsm/geometries/GeometryUtils.js",
    "content": "import {\n\tAttribute,\n\tBuffer,\n\tGeometry,\n\tMatrix3,\n\tVector2,\n\tVector3\n} from 't3d';\n\nclass GeometryUtils {\n\n\t/**\n\t * @param {Geometry} geometry\n\t */\n\tstatic computeNormals(geometry) {\n\t\tconst index = geometry.index;\n\t\tconst attributes = geometry.attributes;\n\n\t\tconst positionAttribute = attributes.a_Position;\n\n\t\tif (positionAttribute === undefined) {\n\t\t\treturn;\n\t\t}\n\n\t\tlet normalAttribute = attributes.a_Normal;\n\n\t\tif (normalAttribute === undefined) {\n\t\t\tnormalAttribute = new Attribute(new Buffer(new Float32Array(positionAttribute.buffer.count * 3), 3));\n\t\t\tgeometry.addAttribute('a_Normal', normalAttribute);\n\t\t} else {\n\t\t\tfor (let i = 0; i < normalAttribute.buffer.array.length; i++) {\n\t\t\t\tnormalAttribute.buffer.array[i] = 0; // reset existing normals to zero\n\t\t\t}\n\t\t\tnormalAttribute.buffer.version++;\n\t\t}\n\n\t\tconst pA = new Vector3(), pB = new Vector3(), pC = new Vector3();\n\t\tconst nA = new Vector3(), nB = new Vector3(), nC = new Vector3();\n\t\tconst cb = new Vector3(), ab = new Vector3();\n\n\t\tif (index) {\n\t\t\t// indexed elements\n\t\t\tfor (let i = 0, il = index.buffer.count; i < il; i += 3) {\n\t\t\t\tconst vA = index.buffer.array[i + 0];\n\t\t\t\tconst vB = index.buffer.array[i + 1];\n\t\t\t\tconst vC = index.buffer.array[i + 2];\n\n\t\t\t\tpA.fromArray(positionAttribute.buffer.array, vA * 3);\n\t\t\t\tpB.fromArray(positionAttribute.buffer.array, vB * 3);\n\t\t\t\tpC.fromArray(positionAttribute.buffer.array, vC * 3);\n\n\t\t\t\tcb.subVectors(pC, pB);\n\t\t\t\tab.subVectors(pA, pB);\n\t\t\t\tcb.cross(ab);\n\n\t\t\t\tnA.fromArray(normalAttribute.buffer.array, vA * 3);\n\t\t\t\tnB.fromArray(normalAttribute.buffer.array, vB * 3);\n\t\t\t\tnC.fromArray(normalAttribute.buffer.array, vC * 3);\n\n\t\t\t\tnA.add(cb);\n\t\t\t\tnB.add(cb);\n\t\t\t\tnC.add(cb);\n\n\t\t\t\tnA.toArray(normalAttribute.buffer.array, vA * 3);\n\t\t\t\tnB.toArray(normalAttribute.buffer.array, vB * 3);\n\t\t\t\tnC.toArray(normalAttribute.buffer.array, vC * 3);\n\t\t\t}\n\t\t} else {\n\t\t\t// non-indexed elements (unconnected triangle soup)\n\t\t\tfor (let i = 0, il = positionAttribute.buffer.count * 3; i < il; i += 9) {\n\t\t\t\tpA.fromArray(positionAttribute.buffer.array, i + 0);\n\t\t\t\tpB.fromArray(positionAttribute.buffer.array, i + 3);\n\t\t\t\tpC.fromArray(positionAttribute.buffer.array, i + 6);\n\n\t\t\t\tcb.subVectors(pC, pB);\n\t\t\t\tab.subVectors(pA, pB);\n\t\t\t\tcb.cross(ab);\n\n\t\t\t\tcb.toArray(normalAttribute.buffer.array, i + 0);\n\t\t\t\tcb.toArray(normalAttribute.buffer.array, i + 3);\n\t\t\t\tcb.toArray(normalAttribute.buffer.array, i + 6);\n\t\t\t}\n\t\t}\n\n\t\tthis.normalizeNormals(geometry);\n\t}\n\n\t/**\n\t * @param {Geometry} geometry\n\t */\n\tstatic normalizeNormals(geometry) {\n\t\tconst normals = geometry.attributes.a_Normal.buffer;\n\n\t\tfor (let i = 0; i < normals.array.length; i += 3) {\n\t\t\t_vec3_1.fromArray(normals.array, i);\n\t\t\t_vec3_1.normalize();\n\t\t\t_vec3_1.toArray(normals.array, i);\n\t\t}\n\t}\n\n\t/**\n\t * @param {Geometry} geometry\n\t */\n\tstatic computeTangents(geometry) {\n\t\tconst index = geometry.index;\n\t\tconst attributes = geometry.attributes;\n\n\t\t// based on http://www.terathon.com/code/tangent.html\n\t\t// (per vertex tangents)\n\n\t\tif (index === null ||\n\t\t\tattributes.a_Position === undefined ||\n\t\t\tattributes.a_Normal === undefined ||\n\t\t\tattributes.a_Uv === undefined) {\n\t\t\tconsole.warn('GeometryUtils: .computeTangents() failed. Missing required attributes (index, a_Position, a_Normal or a_Uv)');\n\t\t\treturn;\n\t\t}\n\n\t\tconst indices = index.buffer.array;\n\t\tconst positions = attributes.a_Position.buffer.array;\n\t\tconst normals = attributes.a_Normal.buffer.array;\n\t\tconst uvs = attributes.a_Uv.buffer.array;\n\n\t\tconst nVertices = positions.length / 3;\n\n\t\tif (!attributes.a_Tangent) {\n\t\t\tgeometry.addAttribute('a_Tangent', new Attribute(new Buffer(new Float32Array(4 * nVertices), 4)));\n\t\t}\n\n\t\tconst tangents = attributes.a_Tangent.buffer.array;\n\n\t\tconst tan1 = [], tan2 = [];\n\n\t\tfor (let i = 0; i < nVertices; i++) {\n\t\t\ttan1[i] = new Vector3();\n\t\t\ttan2[i] = new Vector3();\n\t\t}\n\n\t\tconst vA = new Vector3(),\n\t\t\tvB = new Vector3(),\n\t\t\tvC = new Vector3(),\n\n\t\t\tuvA = new Vector2(),\n\t\t\tuvB = new Vector2(),\n\t\t\tuvC = new Vector2(),\n\n\t\t\tsdir = new Vector3(),\n\t\t\ttdir = new Vector3();\n\n\t\tfunction handleTriangle(a, b, c) {\n\t\t\tvA.fromArray(positions, a * 3);\n\t\t\tvB.fromArray(positions, b * 3);\n\t\t\tvC.fromArray(positions, c * 3);\n\n\t\t\tuvA.fromArray(uvs, a * 2);\n\t\t\tuvB.fromArray(uvs, b * 2);\n\t\t\tuvC.fromArray(uvs, c * 2);\n\n\t\t\tvB.sub(vA);\n\t\t\tvC.sub(vA);\n\n\t\t\tuvB.sub(uvA);\n\t\t\tuvC.sub(uvA);\n\n\t\t\tconst r = 1.0 / (uvB.x * uvC.y - uvC.x * uvB.y);\n\n\t\t\t// silently ignore degenerate uv triangles having coincident or colinear vertices\n\n\t\t\tif (!isFinite(r)) return;\n\n\t\t\tsdir.copy(vB).multiplyScalar(uvC.y).addScaledVector(vC, -uvB.y).multiplyScalar(r);\n\t\t\ttdir.copy(vC).multiplyScalar(uvB.x).addScaledVector(vB, -uvC.x).multiplyScalar(r);\n\n\t\t\ttan1[a].add(sdir);\n\t\t\ttan1[b].add(sdir);\n\t\t\ttan1[c].add(sdir);\n\n\t\t\ttan2[a].add(tdir);\n\t\t\ttan2[b].add(tdir);\n\t\t\ttan2[c].add(tdir);\n\t\t}\n\n\t\tlet groups = geometry.groups;\n\n\t\tif (groups.length === 0) {\n\t\t\tgroups = [{\n\t\t\t\tstart: 0,\n\t\t\t\tcount: indices.length\n\t\t\t}];\n\t\t}\n\n\t\tfor (let i = 0, il = groups.length; i < il; i++) {\n\t\t\tconst group = groups[i];\n\n\t\t\tconst start = group.start;\n\t\t\tconst count = group.count;\n\n\t\t\tfor (let j = start, jl = start + count; j < jl; j += 3) {\n\t\t\t\thandleTriangle(\n\t\t\t\t\tindices[j + 0],\n\t\t\t\t\tindices[j + 1],\n\t\t\t\t\tindices[j + 2]\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\tconst tmp = new Vector3(), tmp2 = new Vector3();\n\t\tconst n = new Vector3(), n2 = new Vector3();\n\n\t\tfunction handleVertex(v) {\n\t\t\tn.fromArray(normals, v * 3);\n\t\t\tn2.copy(n);\n\n\t\t\tconst t = tan1[v];\n\n\t\t\t// Gram-Schmidt orthogonalize\n\n\t\t\ttmp.copy(t);\n\t\t\ttmp.sub(n.multiplyScalar(n.dot(t))).normalize();\n\n\t\t\t// Calculate handedness\n\n\t\t\ttmp2.crossVectors(n2, t);\n\t\t\tconst test = tmp2.dot(tan2[v]);\n\t\t\tconst w = (test < 0.0) ? -1.0 : 1.0;\n\n\t\t\ttangents[v * 4] = tmp.x;\n\t\t\ttangents[v * 4 + 1] = tmp.y;\n\t\t\ttangents[v * 4 + 2] = tmp.z;\n\t\t\ttangents[v * 4 + 3] = -w; // why negative?\n\t\t}\n\n\t\tfor (let i = 0, il = groups.length; i < il; i++) {\n\t\t\tconst group = groups[i];\n\n\t\t\tconst start = group.start;\n\t\t\tconst count = group.count;\n\n\t\t\tfor (let j = start, jl = start + count; j < jl; j += 3) {\n\t\t\t\thandleVertex(indices[j + 0]);\n\t\t\t\thandleVertex(indices[j + 1]);\n\t\t\t\thandleVertex(indices[j + 2]);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * @param {Array<Geometry>} geometries\n\t * @param {boolean} useGroups\n\t * @returns {Geometry}\n\t */\n\tstatic mergeGeometries(geometries, useGroups = false) {\n\t\tconst isIndexed = geometries[0].index !== null;\n\n\t\tconst attributesUsed = new Set(Object.keys(geometries[0].attributes));\n\t\tconst morphAttributesUsed = new Set(Object.keys(geometries[0].morphAttributes));\n\n\t\tconst attributes = {};\n\t\tconst morphAttributes = {};\n\n\t\tconst mergedGeometry = new Geometry();\n\n\t\tlet offset = 0;\n\n\t\tfor (let i = 0; i < geometries.length; i++) {\n\t\t\tconst geometry = geometries[i];\n\n\t\t\t// ensure that all geometries are indexed, or none\n\n\t\t\tif (isIndexed !== (geometry.index !== null)) {\n\t\t\t\tconsole.error('GeometryUtils: .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\t\treturn null;\n\t\t\t}\n\n\t\t\t// gather attributes, exit early if they're different\n\n\t\t\tfor (const name in geometry.attributes) {\n\t\t\t\tif (!attributesUsed.has(name)) {\n\t\t\t\t\tconsole.error('GeometryUtils: .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\t\treturn null;\n\t\t\t\t}\n\n\t\t\t\tif (attributes[name] === undefined) attributes[name] = [];\n\n\t\t\t\tattributes[name].push(geometry.attributes[name]);\n\t\t\t}\n\n\t\t\t// gather morph attributes, exit early they're different\n\n\t\t\tfor (const name in geometry.morphAttributes) {\n\t\t\t\tif (!morphAttributesUsed.has(name)) {\n\t\t\t\t\tconsole.error('GeometryUtils: .mergeGeometries() failed with geometry at index ' + i + '. .morphAttributes must be consistent throughout all geometries.');\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\n\t\t\t\tif (morphAttributes[name] === undefined) morphAttributes[name] = [];\n\n\t\t\t\tmorphAttributes[name].push(geometry.morphAttributes[name]);\n\t\t\t}\n\n\t\t\tif (useGroups) {\n\t\t\t\tlet count;\n\n\t\t\t\tif (isIndexed) {\n\t\t\t\t\tcount = geometry.index.buffer.count;\n\t\t\t\t} else if (geometry.attributes.a_Position !== undefined) {\n\t\t\t\t\tcount = geometry.attributes.a_Position.buffer.count;\n\t\t\t\t} else {\n\t\t\t\t\tconsole.error('GeometryUtils: .mergeGeometries() failed with geometry at index ' + i + '. The geometry must have either an index or an a_Position attribute');\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\n\t\t\t\tmergedGeometry.addGroup(offset, count, i);\n\n\t\t\t\toffset += count;\n\t\t\t}\n\t\t}\n\n\t\t// merge indices\n\n\t\tif (isIndexed) {\n\t\t\tlet indexOffset = 0;\n\t\t\tconst mergedIndex = [];\n\n\t\t\tfor (let i = 0; i < geometries.length; i++) {\n\t\t\t\tconst index = geometries[i].index;\n\n\t\t\t\tfor (let j = 0; j < index.buffer.count; j++) {\n\t\t\t\t\tmergedIndex.push(index.buffer.array[j] + indexOffset);\n\t\t\t\t}\n\n\t\t\t\tindexOffset += geometries[i].attributes.a_Position.buffer.count;\n\t\t\t}\n\n\t\t\tmergedGeometry.setIndex(mergedIndex);\n\t\t}\n\n\t\t// merge attributes\n\n\t\tfor (const name in attributes) {\n\t\t\tconst mergedAttribute = this.mergeAttributes(attributes[name]);\n\n\t\t\tif (!mergedAttribute) {\n\t\t\t\tconsole.error('GeometryUtils: .mergeGeometries() failed while trying to merge the ' + name + ' attribute.');\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tmergedGeometry.addAttribute(name, mergedAttribute);\n\t\t}\n\n\t\t// merge morph attributes\n\n\t\tfor (const name in morphAttributes) {\n\t\t\tconst numMorphTargets = morphAttributes[name][0].length;\n\n\t\t\tif (numMorphTargets === 0) break;\n\n\t\t\tmergedGeometry.morphAttributes = mergedGeometry.morphAttributes || {};\n\t\t\tmergedGeometry.morphAttributes[name] = [];\n\n\t\t\tfor (let i = 0; i < numMorphTargets; i++) {\n\t\t\t\tconst morphAttributesToMerge = [];\n\n\t\t\t\tfor (let j = 0; j < morphAttributes[name].length; j++) {\n\t\t\t\t\tmorphAttributesToMerge.push(morphAttributes[name][j][i]);\n\t\t\t\t}\n\n\t\t\t\tconst mergedMorphAttribute = this.mergeAttributes(morphAttributesToMerge);\n\n\t\t\t\tif (!mergedMorphAttribute) {\n\t\t\t\t\tconsole.error('GeometryUtils: .mergeGeometries() failed while trying to merge the ' + name + ' morphAttribute.');\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\n\t\t\t\tmergedGeometry.morphAttributes[name].push(mergedMorphAttribute);\n\t\t\t}\n\t\t}\n\n\t\treturn mergedGeometry;\n\t}\n\n\t/**\n\t * @param {Array<Attribute>} attributes\n\t * @returns {Attribute}\n\t */\n\tstatic mergeAttributes(attributes) {\n\t\tlet TypedArray;\n\t\tlet size;\n\t\tlet normalized;\n\t\tlet arrayLength = 0;\n\n\t\tfor (let i = 0; i < attributes.length; i++) {\n\t\t\tconst attribute = attributes[i];\n\n\t\t\tif (attribute.buffer.stride !== attribute.size) {\n\t\t\t\tconsole.error('GeometryUtils: .mergeAttributes() failed. Interleaved buffer attributes are not supported.');\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tif (TypedArray === undefined) TypedArray = attribute.buffer.array.constructor;\n\t\t\tif (TypedArray !== attribute.buffer.array.constructor) {\n\t\t\t\tconsole.error('GeometryUtils: .mergeAttributes() failed. Buffer.array must be of consistent array types across matching attributes.');\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tif (size === undefined) size = attribute.size;\n\t\t\tif (size !== attribute.size) {\n\t\t\t\tconsole.error('GeometryUtils: .mergeAttributes() failed. Attribute.size must be consistent across matching attributes.');\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tif (normalized === undefined) normalized = attribute.normalized;\n\t\t\tif (normalized !== attribute.normalized) {\n\t\t\t\tconsole.error('GeometryUtils: .mergeAttributes() failed. Attribute.normalized must be consistent across matching attributes.');\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tarrayLength += attribute.buffer.array.length;\n\t\t}\n\n\t\tconst array = new TypedArray(arrayLength);\n\t\tlet offset = 0;\n\n\t\tfor (let i = 0; i < attributes.length; i++) {\n\t\t\tarray.set(attributes[i].buffer.array, offset);\n\t\t\toffset += attributes[i].buffer.array.length;\n\t\t}\n\n\t\treturn new Attribute(new Buffer(array, size), size, 0, normalized);\n\t}\n\n\t/**\n\t * @param {Geometry} geometry\n\t * @param {Matrix4} matrix\n\t * @param {boolean} updateBoundings\n\t * @returns {Geometry}\n\t */\n\tstatic applyMatrix4(geometry, matrix, updateBoundings) {\n\t\tlet array, count, offset;\n\n\t\tconst position = geometry.attributes['a_Position'];\n\t\tif (position !== undefined) {\n\t\t\tarray = position.buffer.array;\n\t\t\tcount = position.buffer.count;\n\t\t\toffset = position.offset;\n\t\t\tfor (let i = 0; i < count; i++) {\n\t\t\t\t_vec3_1.fromArray(array, i * 3 + offset);\n\t\t\t\t_vec3_1.applyMatrix4(matrix);\n\t\t\t\t_vec3_1.toArray(array, i * 3 + offset);\n\t\t\t}\n\t\t\tposition.buffer.version++;\n\t\t}\n\n\t\tconst normal = geometry.attributes['a_Normal'];\n\t\tif (normal !== undefined) {\n\t\t\tarray = normal.buffer.array;\n\t\t\tcount = normal.buffer.count;\n\t\t\toffset = normal.offset;\n\t\t\tconst normalMatrix = _mat3_1.setFromMatrix4(matrix).invert().transpose();\n\t\t\tfor (let i = 0; i < count; i++) {\n\t\t\t\t_vec3_1.fromArray(array, i * 3 + offset);\n\t\t\t\t_vec3_1.applyMatrix3(normalMatrix).normalize();\n\t\t\t\t_vec3_1.toArray(array, i * 3 + offset);\n\t\t\t}\n\t\t\tnormal.buffer.version++;\n\t\t}\n\n\t\tconst tangent = geometry.attributes['a_Tangent'];\n\t\tif (tangent !== undefined) {\n\t\t\tarray = tangent.buffer.array;\n\t\t\tcount = tangent.buffer.count;\n\t\t\toffset = tangent.offset;\n\t\t\tfor (let i = 0; i < count; i++) {\n\t\t\t\t_vec3_1.fromArray(array, i * 3 + offset);\n\t\t\t\t_vec3_1.transformDirection(matrix);\n\t\t\t\t_vec3_1.toArray(array, i * 3 + offset);\n\t\t\t}\n\t\t\ttangent.buffer.version++;\n\t\t}\n\n\t\tif (geometry.boundingBox !== null && updateBoundings) {\n\t\t\tgeometry.computeBoundingBox();\n\t\t}\n\n\t\tif (geometry.boundingSphere !== null && updateBoundings) {\n\t\t\tgeometry.computeBoundingSphere();\n\t\t}\n\n\t\treturn geometry;\n\t}\n\n\t/**\n\t * @param {Geometry} geometry\n\t * @returns {Attribute}\n\t */\n\tstatic getWireframeAttribute(geometry) {\n\t\tconst indices = [];\n\n\t\tconst geometryIndex = geometry.index;\n\t\tconst geometryPosition = geometry.attributes.a_Position;\n\n\t\tif (!geometryPosition) {\n\t\t\tconsole.error('GeometryUtils: .getWireframeAttribute() failed. The geometry must have an a_Position attribute');\n\t\t\treturn null;\n\t\t}\n\n\t\tif (geometryIndex !== null) {\n\t\t\tconst array = geometryIndex.buffer.array;\n\t\t\tfor (let i = 0, l = array.length; i < l; i += 3) {\n\t\t\t\tconst a = array[i + 0];\n\t\t\t\tconst b = array[i + 1];\n\t\t\t\tconst c = array[i + 2];\n\n\t\t\t\tindices.push(a, b, b, c, c, a);\n\t\t\t}\n\t\t} else {\n\t\t\tconst array = geometryPosition.buffer.array;\n\n\t\t\tfor (let i = 0, l = (array.length / 3) - 1; i < l; i += 3) {\n\t\t\t\tconst a = i + 0;\n\t\t\t\tconst b = i + 1;\n\t\t\t\tconst c = i + 2;\n\n\t\t\t\tindices.push(a, b, b, c, c, a);\n\t\t\t}\n\t\t}\n\n\t\treturn new Attribute(new Buffer(\n\t\t\t(geometryPosition.buffer.array.length / 3) > 65536 ? new Uint32Array(indices) : new Uint16Array(indices),\n\t\t\t1\n\t\t));\n\t}\n\n}\n\nconst _vec3_1 = new Vector3();\nconst _mat3_1 = new Matrix3();\n\nexport { GeometryUtils };"
  },
  {
    "path": "examples/jsm/geometries/builders/Earcut.js",
    "content": "/**\n * Port from https://github.com/mapbox/earcut (v2.2.2)\n */\n\nconst Earcut = {\n\n\ttriangulate: function(data, holeIndices, dim) {\n\t\tdim = dim || 2;\n\n\t\tconst hasHoles = holeIndices && holeIndices.length;\n\t\tconst outerLen = hasHoles ? holeIndices[0] * dim : data.length;\n\t\tlet outerNode = linkedList(data, 0, outerLen, dim, true);\n\t\tconst triangles = [];\n\n\t\tif (!outerNode || outerNode.next === outerNode.prev) return triangles;\n\n\t\tlet minX, minY, maxX, maxY, x, y, invSize;\n\n\t\tif (hasHoles) outerNode = eliminateHoles(data, holeIndices, outerNode, dim);\n\n\t\t// if the shape is not too simple, we'll use z-order curve hash later; calculate polygon bbox\n\t\tif (data.length > 80 * dim) {\n\t\t\tminX = maxX = data[0];\n\t\t\tminY = maxY = data[1];\n\n\t\t\tfor (let i = dim; i < outerLen; i += dim) {\n\t\t\t\tx = data[i];\n\t\t\t\ty = data[i + 1];\n\t\t\t\tif (x < minX) minX = x;\n\t\t\t\tif (y < minY) minY = y;\n\t\t\t\tif (x > maxX) maxX = x;\n\t\t\t\tif (y > maxY) maxY = y;\n\t\t\t}\n\n\t\t\t// minX, minY and invSize are later used to transform coords into integers for z-order calculation\n\t\t\tinvSize = Math.max(maxX - minX, maxY - minY);\n\t\t\tinvSize = invSize !== 0 ? 1 / invSize : 0;\n\t\t}\n\n\t\tearcutLinked(outerNode, triangles, dim, minX, minY, invSize);\n\n\t\treturn triangles;\n\t}\n\n};\n\n// create a circular doubly linked list from polygon points in the specified winding order\nfunction linkedList(data, start, end, dim, clockwise) {\n\tlet i, last;\n\n\tif (clockwise === (signedArea(data, start, end, dim) > 0)) {\n\t\tfor (i = start; i < end; i += dim) last = insertNode(i, data[i], data[i + 1], last);\n\t} else {\n\t\tfor (i = end - dim; i >= start; i -= dim) last = insertNode(i, data[i], data[i + 1], last);\n\t}\n\n\tif (last && equals(last, last.next)) {\n\t\tremoveNode(last);\n\t\tlast = last.next;\n\t}\n\n\treturn last;\n}\n\n// eliminate colinear or duplicate points\nfunction filterPoints(start, end) {\n\tif (!start) return start;\n\tif (!end) end = start;\n\n\tlet p = start,\n\t\tagain;\n\tdo {\n\t\tagain = false;\n\n\t\tif (!p.steiner && (equals(p, p.next) || area(p.prev, p, p.next) === 0)) {\n\t\t\tremoveNode(p);\n\t\t\tp = end = p.prev;\n\t\t\tif (p === p.next) break;\n\t\t\tagain = true;\n\t\t} else {\n\t\t\tp = p.next;\n\t\t}\n\t} while (again || p !== end);\n\n\treturn end;\n}\n\n// main ear slicing loop which triangulates a polygon (given as a linked list)\nfunction earcutLinked(ear, triangles, dim, minX, minY, invSize, pass) {\n\tif (!ear) return;\n\n\t// interlink polygon nodes in z-order\n\tif (!pass && invSize) indexCurve(ear, minX, minY, invSize);\n\n\tlet stop = ear,\n\t\tprev, next;\n\n\t// iterate through ears, slicing them one by one\n\twhile (ear.prev !== ear.next) {\n\t\tprev = ear.prev;\n\t\tnext = ear.next;\n\n\t\tif (invSize ? isEarHashed(ear, minX, minY, invSize) : isEar(ear)) {\n\t\t\t// cut off the triangle\n\t\t\ttriangles.push(prev.i / dim);\n\t\t\ttriangles.push(ear.i / dim);\n\t\t\ttriangles.push(next.i / dim);\n\n\t\t\tremoveNode(ear);\n\n\t\t\t// skipping the next vertex leads to less sliver triangles\n\t\t\tear = next.next;\n\t\t\tstop = next.next;\n\n\t\t\tcontinue;\n\t\t}\n\n\t\tear = next;\n\n\t\t// if we looped through the whole remaining polygon and can't find any more ears\n\t\tif (ear === stop) {\n\t\t\t// try filtering points and slicing again\n\t\t\tif (!pass) {\n\t\t\t\tearcutLinked(filterPoints(ear), triangles, dim, minX, minY, invSize, 1);\n\n\t\t\t\t// if this didn't work, try curing all small self-intersections locally\n\t\t\t} else if (pass === 1) {\n\t\t\t\tear = cureLocalIntersections(filterPoints(ear), triangles, dim);\n\t\t\t\tearcutLinked(ear, triangles, dim, minX, minY, invSize, 2);\n\n\t\t\t\t// as a last resort, try splitting the remaining polygon into two\n\t\t\t} else if (pass === 2) {\n\t\t\t\tsplitEarcut(ear, triangles, dim, minX, minY, invSize);\n\t\t\t}\n\n\t\t\tbreak;\n\t\t}\n\t}\n}\n\n// check whether a polygon node forms a valid ear with adjacent nodes\nfunction isEar(ear) {\n\tconst a = ear.prev,\n\t\tb = ear,\n\t\tc = ear.next;\n\n\tif (area(a, b, c) >= 0) return false; // reflex, can't be an ear\n\n\t// now make sure we don't have other points inside the potential ear\n\tlet p = ear.next.next;\n\n\twhile (p !== ear.prev) {\n\t\tif (pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, p.x, p.y) &&\n\t\t\tarea(p.prev, p, p.next) >= 0) return false;\n\t\tp = p.next;\n\t}\n\n\treturn true;\n}\n\nfunction isEarHashed(ear, minX, minY, invSize) {\n\tconst a = ear.prev,\n\t\tb = ear,\n\t\tc = ear.next;\n\n\tif (area(a, b, c) >= 0) return false; // reflex, can't be an ear\n\n\t// triangle bbox; min & max are calculated like this for speed\n\tconst minTX = a.x < b.x ? (a.x < c.x ? a.x : c.x) : (b.x < c.x ? b.x : c.x),\n\t\tminTY = a.y < b.y ? (a.y < c.y ? a.y : c.y) : (b.y < c.y ? b.y : c.y),\n\t\tmaxTX = a.x > b.x ? (a.x > c.x ? a.x : c.x) : (b.x > c.x ? b.x : c.x),\n\t\tmaxTY = a.y > b.y ? (a.y > c.y ? a.y : c.y) : (b.y > c.y ? b.y : c.y);\n\n\t// z-order range for the current triangle bbox;\n\tconst minZ = zOrder(minTX, minTY, minX, minY, invSize),\n\t\tmaxZ = zOrder(maxTX, maxTY, minX, minY, invSize);\n\n\tlet p = ear.prevZ,\n\t\tn = ear.nextZ;\n\n\t// look for points inside the triangle in both directions\n\twhile (p && p.z >= minZ && n && n.z <= maxZ) {\n\t\tif (p !== ear.prev && p !== ear.next &&\n\t\t\tpointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, p.x, p.y) &&\n\t\t\tarea(p.prev, p, p.next) >= 0) return false;\n\t\tp = p.prevZ;\n\n\t\tif (n !== ear.prev && n !== ear.next &&\n\t\t\tpointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, n.x, n.y) &&\n\t\t\tarea(n.prev, n, n.next) >= 0) return false;\n\t\tn = n.nextZ;\n\t}\n\n\t// look for remaining points in decreasing z-order\n\twhile (p && p.z >= minZ) {\n\t\tif (p !== ear.prev && p !== ear.next &&\n\t\t\tpointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, p.x, p.y) &&\n\t\t\tarea(p.prev, p, p.next) >= 0) return false;\n\t\tp = p.prevZ;\n\t}\n\n\t// look for remaining points in increasing z-order\n\twhile (n && n.z <= maxZ) {\n\t\tif (n !== ear.prev && n !== ear.next &&\n\t\t\tpointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, n.x, n.y) &&\n\t\t\tarea(n.prev, n, n.next) >= 0) return false;\n\t\tn = n.nextZ;\n\t}\n\n\treturn true;\n}\n\n// go through all polygon nodes and cure small local self-intersections\nfunction cureLocalIntersections(start, triangles, dim) {\n\tlet p = start;\n\tdo {\n\t\tconst a = p.prev,\n\t\t\tb = p.next.next;\n\n\t\tif (!equals(a, b) && intersects(a, p, p.next, b) && locallyInside(a, b) && locallyInside(b, a)) {\n\t\t\ttriangles.push(a.i / dim);\n\t\t\ttriangles.push(p.i / dim);\n\t\t\ttriangles.push(b.i / dim);\n\n\t\t\t// remove two nodes involved\n\t\t\tremoveNode(p);\n\t\t\tremoveNode(p.next);\n\n\t\t\tp = start = b;\n\t\t}\n\n\t\tp = p.next;\n\t} while (p !== start);\n\n\treturn filterPoints(p);\n}\n\n// try splitting polygon into two and triangulate them independently\nfunction splitEarcut(start, triangles, dim, minX, minY, invSize) {\n\t// look for a valid diagonal that divides the polygon into two\n\tlet a = start;\n\tdo {\n\t\tlet b = a.next.next;\n\t\twhile (b !== a.prev) {\n\t\t\tif (a.i !== b.i && isValidDiagonal(a, b)) {\n\t\t\t\t// split the polygon in two by the diagonal\n\t\t\t\tlet c = splitPolygon(a, b);\n\n\t\t\t\t// filter colinear points around the cuts\n\t\t\t\ta = filterPoints(a, a.next);\n\t\t\t\tc = filterPoints(c, c.next);\n\n\t\t\t\t// run earcut on each half\n\t\t\t\tearcutLinked(a, triangles, dim, minX, minY, invSize);\n\t\t\t\tearcutLinked(c, triangles, dim, minX, minY, invSize);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tb = b.next;\n\t\t}\n\n\t\ta = a.next;\n\t} while (a !== start);\n}\n\n// link every hole into the outer loop, producing a single-ring polygon without holes\nfunction eliminateHoles(data, holeIndices, outerNode, dim) {\n\tconst queue = [];\n\tlet i, len, start, end, list;\n\n\tfor (i = 0, len = holeIndices.length; i < len; i++) {\n\t\tstart = holeIndices[i] * dim;\n\t\tend = i < len - 1 ? holeIndices[i + 1] * dim : data.length;\n\t\tlist = linkedList(data, start, end, dim, false);\n\t\tif (list === list.next) list.steiner = true;\n\t\tqueue.push(getLeftmost(list));\n\t}\n\n\tqueue.sort(compareX);\n\n\t// process holes from left to right\n\tfor (i = 0; i < queue.length; i++) {\n\t\teliminateHole(queue[i], outerNode);\n\t\touterNode = filterPoints(outerNode, outerNode.next);\n\t}\n\n\treturn outerNode;\n}\n\nfunction compareX(a, b) {\n\treturn a.x - b.x;\n}\n\n// find a bridge between vertices that connects hole with an outer ring and and link it\nfunction eliminateHole(hole, outerNode) {\n\touterNode = findHoleBridge(hole, outerNode);\n\tif (outerNode) {\n\t\tconst b = splitPolygon(outerNode, hole);\n\n\t\t// filter collinear points around the cuts\n\t\tfilterPoints(outerNode, outerNode.next);\n\t\tfilterPoints(b, b.next);\n\t}\n}\n\n// David Eberly's algorithm for finding a bridge between hole and outer polygon\nfunction findHoleBridge(hole, outerNode) {\n\tlet p = outerNode;\n\tconst hx = hole.x;\n\tconst hy = hole.y;\n\tlet qx = -Infinity, m;\n\n\t// find a segment intersected by a ray from the hole's leftmost point to the left;\n\t// segment's endpoint with lesser x will be potential connection point\n\tdo {\n\t\tif (hy <= p.y && hy >= p.next.y && p.next.y !== p.y) {\n\t\t\tconst x = p.x + (hy - p.y) * (p.next.x - p.x) / (p.next.y - p.y);\n\t\t\tif (x <= hx && x > qx) {\n\t\t\t\tqx = x;\n\t\t\t\tif (x === hx) {\n\t\t\t\t\tif (hy === p.y) return p;\n\t\t\t\t\tif (hy === p.next.y) return p.next;\n\t\t\t\t}\n\n\t\t\t\tm = p.x < p.next.x ? p : p.next;\n\t\t\t}\n\t\t}\n\n\t\tp = p.next;\n\t} while (p !== outerNode);\n\n\tif (!m) return null;\n\n\tif (hx === qx) return m; // hole touches outer segment; pick leftmost endpoint\n\n\t// look for points inside the triangle of hole point, segment intersection and endpoint;\n\t// if there are no points found, we have a valid connection;\n\t// otherwise choose the point of the minimum angle with the ray as connection point\n\n\tconst stop = m,\n\t\tmx = m.x,\n\t\tmy = m.y;\n\tlet tanMin = Infinity, tan;\n\n\tp = m;\n\n\tdo {\n\t\tif (hx >= p.x && p.x >= mx && hx !== p.x &&\n\t\t\t\tpointInTriangle(hy < my ? hx : qx, hy, mx, my, hy < my ? qx : hx, hy, p.x, p.y)) {\n\t\t\ttan = Math.abs(hy - p.y) / (hx - p.x); // tangential\n\n\t\t\tif (locallyInside(p, hole) && (tan < tanMin || (tan === tanMin && (p.x > m.x || (p.x === m.x && sectorContainsSector(m, p)))))) {\n\t\t\t\tm = p;\n\t\t\t\ttanMin = tan;\n\t\t\t}\n\t\t}\n\n\t\tp = p.next;\n\t} while (p !== stop);\n\n\treturn m;\n}\n\n// whether sector in vertex m contains sector in vertex p in the same coordinates\nfunction sectorContainsSector(m, p) {\n\treturn area(m.prev, m, p.prev) < 0 && area(p.next, m, m.next) < 0;\n}\n\n// interlink polygon nodes in z-order\nfunction indexCurve(start, minX, minY, invSize) {\n\tlet p = start;\n\tdo {\n\t\tif (p.z === null) p.z = zOrder(p.x, p.y, minX, minY, invSize);\n\t\tp.prevZ = p.prev;\n\t\tp.nextZ = p.next;\n\t\tp = p.next;\n\t} while (p !== start);\n\n\tp.prevZ.nextZ = null;\n\tp.prevZ = null;\n\n\tsortLinked(p);\n}\n\n// Simon Tatham's linked list merge sort algorithm\n// http://www.chiark.greenend.org.uk/~sgtatham/algorithms/listsort.html\nfunction sortLinked(list) {\n\tlet i, p, q, e, tail, numMerges, pSize, qSize,\n\t\tinSize = 1;\n\n\tdo {\n\t\tp = list;\n\t\tlist = null;\n\t\ttail = null;\n\t\tnumMerges = 0;\n\n\t\twhile (p) {\n\t\t\tnumMerges++;\n\t\t\tq = p;\n\t\t\tpSize = 0;\n\t\t\tfor (i = 0; i < inSize; i++) {\n\t\t\t\tpSize++;\n\t\t\t\tq = q.nextZ;\n\t\t\t\tif (!q) break;\n\t\t\t}\n\n\t\t\tqSize = inSize;\n\n\t\t\twhile (pSize > 0 || (qSize > 0 && q)) {\n\t\t\t\tif (pSize !== 0 && (qSize === 0 || !q || p.z <= q.z)) {\n\t\t\t\t\te = p;\n\t\t\t\t\tp = p.nextZ;\n\t\t\t\t\tpSize--;\n\t\t\t\t} else {\n\t\t\t\t\te = q;\n\t\t\t\t\tq = q.nextZ;\n\t\t\t\t\tqSize--;\n\t\t\t\t}\n\n\t\t\t\tif (tail) tail.nextZ = e;\n\t\t\t\telse list = e;\n\n\t\t\t\te.prevZ = tail;\n\t\t\t\ttail = e;\n\t\t\t}\n\n\t\t\tp = q;\n\t\t}\n\n\t\ttail.nextZ = null;\n\t\tinSize *= 2;\n\t} while (numMerges > 1);\n\n\treturn list;\n}\n\n// z-order of a point given coords and inverse of the longer side of data bbox\nfunction zOrder(x, y, minX, minY, invSize) {\n\t// coords are transformed into non-negative 15-bit integer range\n\tx = 32767 * (x - minX) * invSize;\n\ty = 32767 * (y - minY) * invSize;\n\n\tx = (x | (x << 8)) & 0x00FF00FF;\n\tx = (x | (x << 4)) & 0x0F0F0F0F;\n\tx = (x | (x << 2)) & 0x33333333;\n\tx = (x | (x << 1)) & 0x55555555;\n\n\ty = (y | (y << 8)) & 0x00FF00FF;\n\ty = (y | (y << 4)) & 0x0F0F0F0F;\n\ty = (y | (y << 2)) & 0x33333333;\n\ty = (y | (y << 1)) & 0x55555555;\n\n\treturn x | (y << 1);\n}\n\n// find the leftmost node of a polygon ring\nfunction getLeftmost(start) {\n\tlet p = start,\n\t\tleftmost = start;\n\tdo {\n\t\tif (p.x < leftmost.x || (p.x === leftmost.x && p.y < leftmost.y)) leftmost = p;\n\t\tp = p.next;\n\t} while (p !== start);\n\n\treturn leftmost;\n}\n\n// check if a point lies within a convex triangle\nfunction pointInTriangle(ax, ay, bx, by, cx, cy, px, py) {\n\treturn (cx - px) * (ay - py) - (ax - px) * (cy - py) >= 0 &&\n\t\t\t(ax - px) * (by - py) - (bx - px) * (ay - py) >= 0 &&\n\t\t\t(bx - px) * (cy - py) - (cx - px) * (by - py) >= 0;\n}\n\n// check if a diagonal between two polygon nodes is valid (lies in polygon interior)\nfunction isValidDiagonal(a, b) {\n\treturn a.next.i !== b.i && a.prev.i !== b.i && !intersectsPolygon(a, b) && // dones't intersect other edges\n\t\t(locallyInside(a, b) && locallyInside(b, a) && middleInside(a, b) && // locally visible\n\t\t(area(a.prev, a, b.prev) || area(a, b.prev, b)) || // does not create opposite-facing sectors\n\t\tequals(a, b) && area(a.prev, a, a.next) > 0 && area(b.prev, b, b.next) > 0); // special zero-length case\n}\n\n// signed area of a triangle\nfunction area(p, q, r) {\n\treturn (q.y - p.y) * (r.x - q.x) - (q.x - p.x) * (r.y - q.y);\n}\n\n// check if two points are equal\nfunction equals(p1, p2) {\n\treturn p1.x === p2.x && p1.y === p2.y;\n}\n\n// check if two segments intersect\nfunction intersects(p1, q1, p2, q2) {\n\tconst o1 = sign(area(p1, q1, p2));\n\tconst o2 = sign(area(p1, q1, q2));\n\tconst o3 = sign(area(p2, q2, p1));\n\tconst o4 = sign(area(p2, q2, q1));\n\n\tif (o1 !== o2 && o3 !== o4) return true; // general case\n\n\tif (o1 === 0 && onSegment(p1, p2, q1)) return true; // p1, q1 and p2 are collinear and p2 lies on p1q1\n\tif (o2 === 0 && onSegment(p1, q2, q1)) return true; // p1, q1 and q2 are collinear and q2 lies on p1q1\n\tif (o3 === 0 && onSegment(p2, p1, q2)) return true; // p2, q2 and p1 are collinear and p1 lies on p2q2\n\tif (o4 === 0 && onSegment(p2, q1, q2)) return true; // p2, q2 and q1 are collinear and q1 lies on p2q2\n\n\treturn false;\n}\n\n// for collinear points p, q, r, check if point q lies on segment pr\nfunction onSegment(p, q, r) {\n\treturn q.x <= Math.max(p.x, r.x) && q.x >= Math.min(p.x, r.x) && q.y <= Math.max(p.y, r.y) && q.y >= Math.min(p.y, r.y);\n}\n\nfunction sign(num) {\n\treturn num > 0 ? 1 : num < 0 ? -1 : 0;\n}\n\n// check if a polygon diagonal intersects any polygon segments\nfunction intersectsPolygon(a, b) {\n\tlet p = a;\n\tdo {\n\t\tif (p.i !== a.i && p.next.i !== a.i && p.i !== b.i && p.next.i !== b.i &&\n\t\t\t\tintersects(p, p.next, a, b)) return true;\n\t\tp = p.next;\n\t} while (p !== a);\n\n\treturn false;\n}\n\n// check if a polygon diagonal is locally inside the polygon\nfunction locallyInside(a, b) {\n\treturn area(a.prev, a, a.next) < 0 ?\n\t\tarea(a, b, a.next) >= 0 && area(a, a.prev, b) >= 0 :\n\t\tarea(a, b, a.prev) < 0 || area(a, a.next, b) < 0;\n}\n\n// check if the middle point of a polygon diagonal is inside the polygon\nfunction middleInside(a, b) {\n\tlet p = a,\n\t\tinside = false;\n\tconst px = (a.x + b.x) / 2,\n\t\tpy = (a.y + b.y) / 2;\n\tdo {\n\t\tif (((p.y > py) !== (p.next.y > py)) && p.next.y !== p.y &&\n\t\t\t\t(px < (p.next.x - p.x) * (py - p.y) / (p.next.y - p.y) + p.x)) { inside = !inside }\n\t\tp = p.next;\n\t} while (p !== a);\n\n\treturn inside;\n}\n\n// link two polygon vertices with a bridge; if the vertices belong to the same ring, it splits polygon into two;\n// if one belongs to the outer ring and another to a hole, it merges it into a single ring\nfunction splitPolygon(a, b) {\n\tconst a2 = new Node(a.i, a.x, a.y),\n\t\tb2 = new Node(b.i, b.x, b.y),\n\t\tan = a.next,\n\t\tbp = b.prev;\n\n\ta.next = b;\n\tb.prev = a;\n\n\ta2.next = an;\n\tan.prev = a2;\n\n\tb2.next = a2;\n\ta2.prev = b2;\n\n\tbp.next = b2;\n\tb2.prev = bp;\n\n\treturn b2;\n}\n\n// create a node and optionally link it with previous one (in a circular doubly linked list)\nfunction insertNode(i, x, y, last) {\n\tconst p = new Node(i, x, y);\n\n\tif (!last) {\n\t\tp.prev = p;\n\t\tp.next = p;\n\t} else {\n\t\tp.next = last.next;\n\t\tp.prev = last;\n\t\tlast.next.prev = p;\n\t\tlast.next = p;\n\t}\n\n\treturn p;\n}\n\nfunction removeNode(p) {\n\tp.next.prev = p.prev;\n\tp.prev.next = p.next;\n\n\tif (p.prevZ) p.prevZ.nextZ = p.nextZ;\n\tif (p.nextZ) p.nextZ.prevZ = p.prevZ;\n}\n\nfunction Node(i, x, y) {\n\t// vertex index in coordinates array\n\tthis.i = i;\n\n\t// vertex coordinates\n\tthis.x = x;\n\tthis.y = y;\n\n\t// previous and next vertex nodes in a polygon ring\n\tthis.prev = null;\n\tthis.next = null;\n\n\t// z-order curve value\n\tthis.z = null;\n\n\t// previous and next nodes in z-order\n\tthis.prevZ = null;\n\tthis.nextZ = null;\n\n\t// indicates whether this is a steiner point\n\tthis.steiner = false;\n}\n\nfunction signedArea(data, start, end, dim) {\n\tlet sum = 0;\n\tfor (let i = start, j = end - dim; i < end; i += dim) {\n\t\tsum += (data[j] - data[i]) * (data[i + 1] + data[j + 1]);\n\t\tj = i;\n\t}\n\n\treturn sum;\n}\n\nexport { Earcut };\n"
  },
  {
    "path": "examples/jsm/geometries/builders/EdgesBuilder.js",
    "content": "/**\n * EdgesBuilder is a helper for building edges geometry from given triangles data.\n */\nconst EdgesBuilder = {\n\n\t/**\n\t * @param {Array} bufferArray - Flat buffer array containing vertex positions.\n\t * @param {Array} [indices] - Flat buffer array of indices, must be multiple of 3.\n\t * @param {object} [options={}] - The options object.\n\t * @param {number} [options.thresholdAngle=1] - An edge is only rendered if the angle (in degrees) between the face normals of the adjoining faces exceeds this value.\n\t * @param {number} [options.stride=3] - The number of values of the array that should be associated with a particular vertex.\n\t * @param {number} [options.offset=0] - The offset in the buffer array where the position starts.\n\t * @returns {object} - The edges geometry data.\n\t */\n\tgetGeometryData: function(bufferArray, indices, options = {}) {\n\t\tconst thresholdAngle = options.thresholdAngle !== undefined ? options.thresholdAngle : 1;\n\t\tconst stride = options.stride !== undefined ? options.stride : 3;\n\t\tconst offset = options.offset !== undefined ? options.offset : 0;\n\n\t\tlet i, j, l, key, face;\n\t\tconst result = [];\n\n\t\t/** merge vertices */\n\n\t\tconst verticesMap = {};\n\t\tconst unique = [], changes = [];\n\n\t\tconst precisionPoints = 4; // number of decimal points, e.g. 4 for epsilon of 0.0001\n\t\tconst precision = Math.pow(10, precisionPoints);\n\n\t\tlet offsetIndex, x, y, z;\n\t\tl = bufferArray.length / stride;\n\t\tfor (i = 0; i < l; i++) {\n\t\t\toffsetIndex = i * stride + offset;\n\t\t\tx = bufferArray[offsetIndex + 0];\n\t\t\ty = bufferArray[offsetIndex + 1];\n\t\t\tz = bufferArray[offsetIndex + 2];\n\n\t\t\tkey = Math.round(x * precision) + '_' + Math.round(y * precision) + '_' + Math.round(z * precision);\n\n\t\t\tif (verticesMap[key] === undefined) {\n\t\t\t\tverticesMap[key] = i;\n\t\t\t\tunique.push(x, y, z);\n\t\t\t\tchanges[i] = unique.length / 3 - 1;\n\t\t\t} else {\n\t\t\t\tchanges[i] = changes[verticesMap[key]];\n\t\t\t}\n\t\t}\n\n\t\t/** get faces  (vertices and normal) */\n\n\t\tconst faces = [];\n\n\t\tif (indices) {\n\t\t\tl = indices.length / 3;\n\t\t\tfor (i = 0; i < l; i++) {\n\t\t\t\tface = { i: [0, 0, 0], n: [1, 1, 1] };\n\t\t\t\tface.i[0] = changes[indices[i * 3 + 0]];\n\t\t\t\tface.i[1] = changes[indices[i * 3 + 1]];\n\t\t\t\tface.i[2] = changes[indices[i * 3 + 2]];\n\t\t\t\tcomputeFaceNormal(face, unique);\n\t\t\t\tfaces.push(face);\n\t\t\t}\n\t\t} else {\n\t\t\tfor (i = 0; i < l; i++) {\n\t\t\t\tface = { i: [0, 0, 0], n: [1, 1, 1] };\n\t\t\t\tface.i[0] = changes[i * 3 + 0];\n\t\t\t\tface.i[1] = changes[i * 3 + 1];\n\t\t\t\tface.i[2] = changes[i * 3 + 2];\n\t\t\t\tcomputeFaceNormal(face, unique);\n\t\t\t\tfaces.push(face);\n\t\t\t}\n\t\t}\n\n\t\t/**\n\t\t * get edges { index1: edge[ 0 ], index2: edge[ 1 ], face1: i, face2: undefined }\n\t\t */\n\t\tlet edge1, edge2;\n\t\tconst edge = [0, 0], edges = {};\n\t\tfor (i = 0, l = faces.length; i < l; i++) {\n\t\t\tface = faces[i];\n\t\t\tfor (j = 0; j < 3; j++) {\n\t\t\t\tedge1 = face.i[j];\n\t\t\t\tedge2 = face.i[(j + 1) % 3];\n\t\t\t\tedge[0] = Math.min(edge1, edge2);\n\t\t\t\tedge[1] = Math.max(edge1, edge2);\n\n\t\t\t\tkey = edge[0] + ',' + edge[1];\n\n\t\t\t\tif (edges[key] === undefined) {\n\t\t\t\t\tedges[key] = { index1: edge[0], index2: edge[1], face1: i, face2: undefined };\n\t\t\t\t} else {\n\t\t\t\t\tedges[key].face2 = i;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t/** edges filter */\n\t\tconst thresholdDot = Math.cos(DEG2RAD * thresholdAngle);\n\t\tfor (key in edges) {\n\t\t\tconst e = edges[key];\n\t\t\t// an edge is only rendered if the angle (in degrees) between the face normals of the adjoining faces exceeds this value. default = 1 degree.\n\t\t\tif (e.face2 === undefined || dot(faces[e.face1].n, faces[e.face2].n) <= thresholdDot) {\n\t\t\t\tresult.push(\n\t\t\t\t\tunique[e.index1 * 3 + 0],\n\t\t\t\t\tunique[e.index1 * 3 + 1],\n\t\t\t\t\tunique[e.index1 * 3 + 2],\n\t\t\t\t\tunique[e.index2 * 3 + 0],\n\t\t\t\t\tunique[e.index2 * 3 + 1],\n\t\t\t\t\tunique[e.index2 * 3 + 2]\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\t/** return */\n\t\treturn {\n\t\t\tpositions: result\n\t\t};\n\t}\n\n};\n\nfunction dot(v1, v2) {\n\treturn v1[0] * v2[0] + v1[1] * v2[1] + v1[2] * v2[2];\n}\n\nfunction computeFaceNormal(face, buffer) {\n\tconst vAX = buffer[face.i[0] * 3 + 0];\n\tconst vAY = buffer[face.i[0] * 3 + 1];\n\tconst vAZ = buffer[face.i[0] * 3 + 2];\n\n\tconst vBX = buffer[face.i[1] * 3 + 0];\n\tconst vBY = buffer[face.i[1] * 3 + 1];\n\tconst vBZ = buffer[face.i[1] * 3 + 2];\n\n\tconst vCX = buffer[face.i[2] * 3 + 0];\n\tconst vCY = buffer[face.i[2] * 3 + 1];\n\tconst vCZ = buffer[face.i[2] * 3 + 2];\n\n\tconst cbX = vCX - vBX; // ax\n\tconst cbY = vCY - vBY; // ay\n\tconst cbZ = vCZ - vBZ; // az\n\n\tconst abX = vAX - vBX; // bx\n\tconst abY = vAY - vBY; // by\n\tconst abZ = vAZ - vBZ; // bz\n\n\tlet nX = cbY * abZ - cbZ * abY;\n\tlet nY = cbZ * abX - cbX * abZ;\n\tlet nZ = cbX * abY - cbY * abX;\n\n\tconst nLen = Math.sqrt(nX * nX + nY * nY + nZ * nZ);\n\n\tnX /= nLen;\n\tnY /= nLen;\n\tnZ /= nLen;\n\n\tface.n[0] = nX;\n\tface.n[1] = nY;\n\tface.n[2] = nZ;\n}\n\nconst DEG2RAD = Math.PI / 180;\n\nexport { EdgesBuilder };"
  },
  {
    "path": "examples/jsm/geometries/builders/ExtrudeShapeBuilder.js",
    "content": "import { Vector3 } from 't3d';\nimport { Earcut } from './Earcut.js';\nimport { GeometryBuilderUtils } from './GeometryBuilderUtils.js';\n\n/**\n * ExtrudeShapeBuilder\n */\nconst ExtrudeShapeBuilder = {\n\n\t/**\n\t * @param {object} shape - The shape.\n\t * @param {Array} shape.contour - The holes of this shape, for example: [[0, 0], [0, 5], [5, 5], [5, 0]]\n\t * @param {Array} shape.holes - The holes of this shape, for example: [[[1, 3], [1, 4], [4, 4], [4, 3]], [[1, 1], [1, 2], [4, 1]]]\n\t * @param {Array} [shape.depth=1] - The depth of this shape. If it is a negative number, extrude in the positive direction of the z-axis, otherwise, extrude in the negative direction of the z-axis.\n\t * @param {boolean} [shape.generateTop=true] - Whether to generate the top face.\n\t * @param {boolean} [shape.generateBottom=true] - Whether to generate the bottom face.\n\t * @param {object} [shape.pathFrames] - The path frames data. If it is not undefined, the shape will be extruded along the path.\n\t * @returns {object} The geometry data.\n\t */\n\tgetGeometryData: function(shape) {\n\t\tconst depth = (shape.depth !== undefined) ? shape.depth : 1;\n\t\tconst generateTop = (shape.generateTop !== undefined) ? shape.generateTop : true;\n\t\tconst generateBottom = (shape.generateBottom !== undefined) ? shape.generateBottom : true;\n\t\tconst pathFrames = shape.pathFrames;\n\n\t\tlet negativeDepth = false;\n\t\tif (!pathFrames) {\n\t\t\tnegativeDepth = depth < 0;\n\t\t}\n\n\t\tconst vertices = []; // flat array of vertices like [ x0,y0, x1,y1, x2,y2, ... ]\n\t\tconst holeIndices = []; // array of hole indices\n\n\t\tGeometryBuilderUtils.convertShapeDataToEarcut(shape, vertices, holeIndices);\n\n\t\tconst faces = Earcut.triangulate(vertices, holeIndices);\n\n\t\t// build vertex data\n\n\t\tconst positions = [];\n\t\tconst uvs = [];\n\t\tconst indices = [];\n\n\t\tlet vertexCount = 0;\n\n\t\t// top\n\n\t\tif (generateTop) {\n\t\t\tfor (let i = 0, l = vertices.length; i < l; i += 2) {\n\t\t\t\tif (pathFrames) {\n\t\t\t\t\tsetPositionByPathFrames(pathFrames, 0, vertices[i], vertices[i + 1], positions);\n\t\t\t\t} else {\n\t\t\t\t\tpositions.push(vertices[i], vertices[i + 1], 0); // x-y plane\n\t\t\t\t}\n\n\t\t\t\tuvs.push(negativeDepth ? -vertices[i] : vertices[i], vertices[i + 1]); // world uvs\n\t\t\t}\n\n\t\t\tfor (let i = 0, l = faces.length; i < l; i += 3) {\n\t\t\t\tif (negativeDepth) {\n\t\t\t\t\tindices.push(faces[i + 0], faces[i + 2], faces[i + 1]);\n\t\t\t\t} else {\n\t\t\t\t\tindices.push(faces[i + 0], faces[i + 1], faces[i + 2]);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// bottom\n\n\t\tif (generateBottom) {\n\t\t\tvertexCount = positions.length / 3;\n\n\t\t\tfor (let i = 0, l = vertices.length; i < l; i += 2) {\n\t\t\t\tif (pathFrames) {\n\t\t\t\t\tsetPositionByPathFrames(pathFrames, pathFrames.points.length - 1, vertices[i], vertices[i + 1], positions);\n\t\t\t\t} else {\n\t\t\t\t\tpositions.push(vertices[i], vertices[i + 1], -depth); // x-y plane\n\t\t\t\t}\n\n\t\t\t\tuvs.push(negativeDepth ? vertices[i] : -vertices[i], vertices[i + 1]); // world uvs\n\t\t\t}\n\n\t\t\tfor (let i = 0, l = faces.length; i < l; i += 3) {\n\t\t\t\tif (negativeDepth) {\n\t\t\t\t\tindices.push(vertexCount + faces[i + 1], vertexCount + faces[i + 2], vertexCount + faces[i + 0]);\n\t\t\t\t} else {\n\t\t\t\t\tindices.push(vertexCount + faces[i + 2], vertexCount + faces[i + 1], vertexCount + faces[i + 0]);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// side\n\n\t\tvertexCount = positions.length / 3;\n\t\tconst hasHoles = holeIndices.length;\n\n\t\tconst loop = [];\n\t\tif (hasHoles) {\n\t\t\tloop.push([0, holeIndices[0] * 2]);\n\t\t\tfor (let i = 0; i < holeIndices.length - 1; i++) {\n\t\t\t\tloop.push([holeIndices[i] * 2, holeIndices[i + 1] * 2]);\n\t\t\t}\n\t\t\tloop.push([holeIndices[holeIndices.length - 1] * 2, vertices.length]);\n\t\t} else {\n\t\t\tloop.push([0, vertices.length]);\n\t\t}\n\n\t\tconst steps = pathFrames ? pathFrames.points.length - 1 : 1;\n\n\t\tfor (let i = 0; i < loop.length; i++) {\n\t\t\tlet dist = 0;\n\n\t\t\tconst sideStart = loop[i][0];\n\t\t\tconst sideFinish = loop[i][1];\n\n\t\t\tfor (let j = sideStart; j < sideFinish; j += 2) {\n\t\t\t\tconst _index1 = j;\n\t\t\t\tconst _index2 = (j + 2 >= sideFinish) ? sideStart : (j + 2);\n\n\t\t\t\tconst _dist1 = dist;\n\t\t\t\tconst _dist2 = dist - getLength(vertices[_index1 + 0], vertices[_index1 + 1], vertices[_index2 + 0], vertices[_index2 + 1]);\n\n\t\t\t\tdist = _dist2;\n\n\t\t\t\tfor (let s = 0; s <= steps; s++) {\n\t\t\t\t\tif (pathFrames) {\n\t\t\t\t\t\tsetPositionByPathFrames(pathFrames, s, vertices[_index1 + 0], vertices[_index1 + 1], positions);\n\t\t\t\t\t\tsetPositionByPathFrames(pathFrames, s, vertices[_index2 + 0], vertices[_index2 + 1], positions);\n\n\t\t\t\t\t\tuvs.push(_dist1, -pathFrames.lengths[s]);\n\t\t\t\t\t\tuvs.push(_dist2, -pathFrames.lengths[s]);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconst _depth = -depth / steps * s;\n\n\t\t\t\t\t\tpositions.push(vertices[_index1 + 0], vertices[_index1 + 1], _depth);\n\t\t\t\t\t\tpositions.push(vertices[_index2 + 0], vertices[_index2 + 1], _depth);\n\n\t\t\t\t\t\tuvs.push(_dist1, _depth);\n\t\t\t\t\t\tuvs.push(_dist2, _depth);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (s > 0) {\n\t\t\t\t\t\tif (negativeDepth) {\n\t\t\t\t\t\t\tindices.push(vertexCount - 2, vertexCount + 0, vertexCount - 1);\n\t\t\t\t\t\t\tindices.push(vertexCount - 1, vertexCount + 0, vertexCount + 1);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tindices.push(vertexCount - 2, vertexCount - 1, vertexCount + 0);\n\t\t\t\t\t\t\tindices.push(vertexCount - 1, vertexCount + 1, vertexCount + 0);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tvertexCount += 2;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// return\n\n\t\treturn {\n\t\t\tpositions,\n\t\t\tuvs,\n\t\t\tindices\n\t\t};\n\t}\n\n};\n\nfunction getLength(x0, y0, x1, y1) {\n\tconst x = x1 - x0;\n\tconst y = y1 - y0;\n\treturn Math.sqrt(x * x + y * y);\n}\n\nconst normal = new Vector3();\nconst binormal = new Vector3();\nconst position = new Vector3();\n\nfunction setPositionByPathFrames(frames, index, x, y, positions) {\n\tnormal.copy(frames.normals[index]).multiplyScalar(y);\n\tbinormal.copy(frames.binormals[index]).multiplyScalar(x);\n\n\tposition.copy(normal).add(binormal);\n\tif (frames.sharps[index]) {\n\t\tposition.scaleAlong(frames.bisectors[index], frames.widthScales[index]);\n\t}\n\tposition.add(frames.points[index]);\n\n\tpositions.push(position.x, position.y, position.z);\n}\n\nexport { ExtrudeShapeBuilder };"
  },
  {
    "path": "examples/jsm/geometries/builders/Font.js",
    "content": "import { Vector2 } from 't3d';\nimport { CubicBezierCurve2 } from '../../math/curves/CubicBezierCurve2.js';\nimport { CurvePath3 } from '../../math/curves/CurvePath3.js';\nimport { LineCurve2 } from '../../math/curves/LineCurve2.js';\nimport { QuadraticBezierCurve2 } from '../../math/curves/QuadraticBezierCurve2.js';\n\nclass Font {\n\n\tconstructor(data) {\n\t\tthis.data = data;\n\t}\n\n\tgenerateShapes(text, size = 100) {\n\t\tconst shapes = [];\n\t\tconst paths = createPaths(text, size, this.data);\t// curvePath3\n\n\t\tfor (let p = 0, pl = paths.length; p < pl; p++) {\n\t\t\tgetShapes(paths[p], shapes);\n\t\t}\n\t\treturn shapes;\n\t}\n\n}\n\nfunction createPaths(text, size, data) {\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,\n\t\toffsetY = 0;\n\n\tfor (let i = 0; i < chars.length; i++) {\n\t\tconst char = chars[i];\n\n\t\tif (char === '\\n') {\n\t\t\toffsetX = 0;\n\t\t\toffsetY -= line_height;\n\t\t} else {\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\t\t}\n\t}\n\n\treturn paths;\n}\n\nfunction createPath(char, scale, offsetX, offsetY, data) {\n\tconst glyph = data.glyphs[char] || data.glyphs['?'];\n\n\tif (!glyph) {\n\t\tconsole.error('Font: character \"' + char + '\" does not exists in font family ' + data.familyName + '.');\n\t\treturn;\n\t}\n\n\tlet count = -1;\n\tconst path = [];\n\n\tlet x, y, cpx, cpy, cpx1, cpy1, cpx2, cpy2;\n\n\tif (glyph.o) {\n\t\tconst outline = glyph._cachedOutline || (glyph._cachedOutline = glyph.o.split(' '));\n\n\t\tconst currentPoint = [0, 0];\n\n\t\tfor (let i = 0, l = outline.length; i < l;) {\n\t\t\tconst action = outline[i++];\n\n\t\t\tswitch (action) {\n\t\t\t\tcase 'm': { // move points\n\t\t\t\t\tcount++;\n\n\t\t\t\t\tpath[count] = new CurvePath3();\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\tcurrentPoint[0] = x;\n\t\t\t\t\tcurrentPoint[1] = y;\n\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase 'l': { // line\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\tconst lineCurve = new LineCurve2(new Vector2(currentPoint[0], currentPoint[1]), new Vector2(x, y));\n\n\t\t\t\t\tpath[count].curves.push(lineCurve);\n\n\t\t\t\t\tcurrentPoint[0] = x;\n\t\t\t\t\tcurrentPoint[1] = y;\n\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase 'q': { // quadraticCurve\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\tconst quadraticBezierCurve = new QuadraticBezierCurve2(new Vector2(currentPoint[0], currentPoint[1]), new Vector2(cpx1, cpy1), new Vector2(cpx, cpy));\n\n\t\t\t\t\tpath[count].curves.push(quadraticBezierCurve);\n\n\t\t\t\t\tcurrentPoint[0] = cpx;\n\t\t\t\t\tcurrentPoint[1] = cpy;\n\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase 'b': { // bezierCurve\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\tconst cubicBezierCurve = new CubicBezierCurve2(new Vector2(currentPoint[0], currentPoint[1]), new Vector2(cpx1, cpy1), new Vector2(cpx2, cpy2), new Vector2(cpx, cpy));\n\n\t\t\t\t\tpath[count].curves.push(cubicBezierCurve);\n\n\t\t\t\t\tcurrentPoint[0] = cpx;\n\t\t\t\t\tcurrentPoint[1] = cpy;\n\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn {\n\t\toffsetX: glyph.ha * scale,\n\t\tpath: path\n\t};\n}\n\nfunction getShapes(curvePaths, shapes = []) {\n\tif (curvePaths.length === 0) return [];\n\n\tlet tmpPath, tmpShape, tempPoints;\n\n\tif (curvePaths.length === 1) {\n\t\ttmpPath = curvePaths[0];\n\t\ttempPoints = tmpPath.getPoints();\n\t\ttmpShape = {\n\t\t\tcontour: vectorsToArray(tempPoints),\n\t\t\tholes: []\n\t\t};\n\t\tshapes.push(tmpShape);\n\t\treturn shapes;\n\t}\n\n\tconst holesFirst = !isClockWise(curvePaths[0].getPoints());\n\n\tconst newShapes = [];\n\tconst newShapeHoles = [];\n\tlet mainIdx = 0;\n\tlet tmpPoints;\n\n\tnewShapes[mainIdx] = undefined;\n\tnewShapeHoles[mainIdx] = [];\n\n\tfor (let i = 0, l = curvePaths.length; i < l; i++) {\n\t\ttmpPath = curvePaths[i];\n\t\ttmpPoints = tmpPath.getPoints();\n\t\tconst solid = isClockWise(tmpPoints);\n\n\t\tif (solid) {\n\t\t\tif ((!holesFirst) && (newShapes[mainIdx])) mainIdx++;\n\n\t\t\tnewShapes[mainIdx] = {\n\t\t\t\tcontour: vectorsToArray(tmpPoints),\n\t\t\t\tholes: []\n\t\t\t};\n\n\t\t\tif (holesFirst) mainIdx++;\n\t\t\tnewShapeHoles[mainIdx] = [];\n\t\t} else {\n\t\t\tnewShapeHoles[mainIdx].push({\n\t\t\t\tl: tmpPath,\n\t\t\t\tp: tmpPoints[0]\n\t\t\t});\n\t\t}\n\t}\n\n\tlet tmpHoles;\n\n\tfor (let i = 0, il = newShapes.length; i < il; i++) {\n\t\ttmpShape = newShapes[i];\n\t\tshapes.push(tmpShape);\n\t\ttmpHoles = newShapeHoles[i];\n\n\t\tfor (let j = 0, jl = tmpHoles.length; j < jl; j++) {\n\t\t\ttmpShape.holes.push(vectorsToArray(tmpHoles[j].l.getPoints()));\n\t\t}\n\t}\n\n\treturn shapes;\n}\n\n// change vector2 to to two-dimensional array\n\nfunction vectorsToArray(vectors) {\n\tconst target = [];\n\tfor (let i = 0; i < vectors.length; i++) {\n\t\ttarget.push([vectors[i].x, vectors[i].y]);\n\t}\n\treturn target;\n}\n\nfunction isClockWise(contour) {\n\tconst n = contour.length;\n\tlet a = 0.0;\n\n\tfor (let p = n - 1, q = 0; q < n; p = q++) {\n\t\ta += contour[p].x * contour[q].y - contour[q].x * contour[p].y;\n\t}\n\n\treturn a * 0.5 < 0;\n}\n\nexport { Font };"
  },
  {
    "path": "examples/jsm/geometries/builders/GeometryBuilderUtils.js",
    "content": "/**\n * Geometry Builder Utils\n */\nconst GeometryBuilderUtils = {\n\n\tconvertShapeDataToEarcut: function(shape, vertices, holeIndices) {\n\t\tlet contour = shape.contour;\n\t\tconst holes = shape.holes;\n\n\t\t// check directions of shape contour and holes\n\n\t\tif (!isClockWise(contour)) {\n\t\t\tcontour = contour.reverse();\n\t\t}\n\n\t\tif (holes) {\n\t\t\tfor (let i = 0, l = holes.length; i < l; i++) {\n\t\t\t\tconst hole = holes[i];\n\t\t\t\tif (isClockWise(hole)) {\n\t\t\t\t\tholes[i] = hole.reverse();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// triangulate shape by Earcut\n\n\t\tvertices = vertices || []; // flat array of vertices like [ x0,y0, x1,y1, x2,y2, ... ]\n\t\tholeIndices = holeIndices || []; // array of hole indices\n\n\t\tremoveDupEndPts(contour);\n\t\taddContour(vertices, contour);\n\n\t\tif (holes) {\n\t\t\tlet holeIndex = contour.length;\n\n\t\t\tholes.forEach(removeDupEndPts);\n\n\t\t\tfor (let i = 0; i < holes.length; i++) {\n\t\t\t\tholeIndices.push(holeIndex);\n\t\t\t\tholeIndex += holes[i].length;\n\t\t\t\taddContour(vertices, holes[i]);\n\t\t\t}\n\t\t}\n\t}\n\n};\n\nfunction area(contour) {\n\tconst n = contour.length;\n\tlet a = 0.0;\n\n\tfor (let p = n - 1, q = 0; q < n; p = q++) {\n\t\ta += contour[p][0] * contour[q][1] - contour[q][0] * contour[p][1];\n\t}\n\n\treturn a * 0.5;\n}\n\nfunction isClockWise(contour) {\n\treturn area(contour) < 0;\n}\n\nfunction removeDupEndPts(contour) {\n\tconst l = contour.length;\n\n\tif (l > 2 && isArrayEquals(contour[l - 1], contour[0])) {\n\t\tcontour.pop();\n\t}\n}\n\nfunction isArrayEquals(a1, a2) {\n\tif (a1.length !== a2.length) {\n\t\treturn false;\n\t}\n\n\tfor (let i = 0, l = a1.length; i < l; i++) {\n\t\tif (a1[i] !== a2[i]) {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\treturn true;\n}\n\nfunction addContour(vertices, contour) {\n\tfor (let i = 0; i < contour.length; i++) {\n\t\tvertices.push(contour[i][0]);\n\t\tvertices.push(contour[i][1]);\n\t}\n}\n\nexport { GeometryBuilderUtils };"
  },
  {
    "path": "examples/jsm/geometries/builders/LatheBuilder.js",
    "content": "import { Vector2, Vector3, MathUtils } from 't3d';\n\n/**\n * LatheBuilder\n */\nconst LatheBuilder = {\n\t/**\n\t * @param {Array} points - The points of the lathe, for example: [[0, -0.5], [0.5, 0], [0, 0.5]]\n\t * @param {number} [segments=12] - The number of circumference segments to generate\n\t * @param {number} [phiStart=0] - The starting angle in radians\n\t * @param {number} [phiLength=Math.PI*2] - The radian (0 to 2PI) range of the lathed section, less than 2PI is a portion\n\t * @returns {object} The geometry data.\n\t */\n\tgetGeometryData: function(points, segments = 12, phiStart = 0, phiLength = Math.PI * 2) {\n\t\tsegments = Math.floor(segments);\n\n\t\t// clamp phiLength so it's in range of [ 0, 2PI ]\n\n\t\tphiLength = MathUtils.clamp(phiLength, 0, Math.PI * 2);\n\n\t\t// buffers\n\n\t\tconst indices = [];\n\t\tconst positions = [];\n\t\tconst uvs = [];\n\t\tconst initNormals = [];\n\t\tconst normals = [];\n\n\t\t// helper variables\n\n\t\tconst inverseSegments = 1.0 / segments;\n\t\tconst vertex = new Vector3();\n\t\tconst uv = new Vector2();\n\t\tconst normal = new Vector3();\n\t\tconst curNormal = new Vector3();\n\t\tconst prevNormal = new Vector3();\n\t\tlet dx = 0;\n\t\tlet dy = 0;\n\n\t\t// pre-compute normals for initial \"meridian\"\n\n\t\tfor (let j = 0; j <= (points.length - 1); j++) {\n\t\t\tswitch (j) {\n\t\t\t\tcase 0: // special handling for 1st vertex on path\n\t\t\t\t\tdx = points[j + 1][0] - points[j][0];\n\t\t\t\t\tdy = points[j + 1][1] - points[j][1];\n\n\t\t\t\t\tnormal.x = dy * 1.0;\n\t\t\t\t\tnormal.y = -dx;\n\t\t\t\t\tnormal.z = dy * 0.0;\n\n\t\t\t\t\tprevNormal.copy(normal);\n\n\t\t\t\t\tnormal.normalize();\n\n\t\t\t\t\tinitNormals.push(normal.x, normal.y, normal.z);\n\n\t\t\t\t\tbreak;\n\t\t\t\tcase points.length - 1: // special handling for last Vertex on path\n\t\t\t\t\tinitNormals.push(prevNormal.x, prevNormal.y, prevNormal.z);\n\n\t\t\t\t\tbreak;\n\t\t\t\tdefault: // default handling for all positions in between\n\t\t\t\t\tdx = points[j + 1][0] - points[j][0];\n\t\t\t\t\tdy = points[j + 1][1] - points[j][1];\n\n\t\t\t\t\tnormal.x = dy * 1.0;\n\t\t\t\t\tnormal.y = -dx;\n\t\t\t\t\tnormal.z = dy * 0.0;\n\n\t\t\t\t\tcurNormal.copy(normal);\n\n\t\t\t\t\tnormal.x += prevNormal.x;\n\t\t\t\t\tnormal.y += prevNormal.y;\n\t\t\t\t\tnormal.z += prevNormal.z;\n\n\t\t\t\t\tnormal.normalize();\n\n\t\t\t\t\tinitNormals.push(normal.x, normal.y, normal.z);\n\n\t\t\t\t\tprevNormal.copy(curNormal);\n\t\t\t}\n\t\t}\n\n\t\t// generate positions, uvs and normals\n\n\t\tfor (let i = 0; i <= segments; i++) {\n\t\t\tconst phi = phiStart + i * inverseSegments * phiLength;\n\n\t\t\tconst sin = Math.sin(phi);\n\t\t\tconst cos = Math.cos(phi);\n\n\t\t\tfor (let j = 0; j <= (points.length - 1); j++) {\n\t\t\t\t// vertex\n\n\t\t\t\tvertex.x = points[j][0] * sin;\n\t\t\t\tvertex.y = points[j][1];\n\t\t\t\tvertex.z = points[j][0] * cos;\n\n\t\t\t\tpositions.push(vertex.x, vertex.y, vertex.z);\n\n\t\t\t\t// uv\n\n\t\t\t\tuv.x = i / segments;\n\t\t\t\tuv.y = j / (points.length - 1);\n\n\t\t\t\tuvs.push(uv.x, uv.y);\n\n\t\t\t\t// normal\n\n\t\t\t\tconst x = initNormals[3 * j + 0] * sin;\n\t\t\t\tconst y = initNormals[3 * j + 1];\n\t\t\t\tconst z = initNormals[3 * j + 0] * cos;\n\n\t\t\t\tnormals.push(x, y, z);\n\t\t\t}\n\t\t}\n\n\t\t// indices\n\n\t\tfor (let i = 0; i < segments; i++) {\n\t\t\tfor (let j = 0; j < points.length - 1; j++) {\n\t\t\t\tconst base = j + i * points.length;\n\n\t\t\t\tconst a = base;\n\t\t\t\tconst b = base + points.length;\n\t\t\t\tconst c = base + points.length + 1;\n\t\t\t\tconst d = base + 1;\n\n\t\t\t\t// faces\n\n\t\t\t\tindices.push(a, b, d);\n\t\t\t\tindices.push(c, d, b);\n\t\t\t}\n\t\t}\n\n\t\t// return\n\n\t\treturn {\n\t\t\tpositions,\n\t\t\tnormals,\n\t\t\tuvs,\n\t\t\tindices\n\t\t};\n\t}\n};\n\nexport { LatheBuilder };"
  },
  {
    "path": "examples/jsm/geometries/builders/PolygonBuilder.js",
    "content": "import { Earcut } from './Earcut.js';\nimport { GeometryBuilderUtils } from './GeometryBuilderUtils.js';\n\n/**\n * PolygonBuilder\n */\nconst PolygonBuilder = {\n\n\t/**\n\t * @param {object} shape - The shape.\n\t * @param {Array} shape.contour - The holes of this shape, for example: [[0, 0], [0, 5], [5, 5], [5, 0]]\n\t * @param {Array} shape.holes - The holes of this shape, for example: [[[1, 3], [1, 4], [4, 4], [4, 3]], [[1, 1], [1, 2], [4, 1]]]\n\t * @returns {object} The geometry data.\n\t */\n\tgetGeometryData: function(shape) {\n\t\tconst vertices = []; // flat array of vertices like [ x0,y0, x1,y1, x2,y2, ... ]\n\t\tconst holeIndices = []; // array of hole indices\n\n\t\tGeometryBuilderUtils.convertShapeDataToEarcut(shape, vertices, holeIndices);\n\n\t\tconst indices = Earcut.triangulate(vertices, holeIndices);\n\n\t\t// build vertex data\n\n\t\tconst positions = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\tfor (let i = 0, l = vertices.length; i < l; i += 2) {\n\t\t\tpositions.push(vertices[i], vertices[i + 1], 0); // x-y plane\n\t\t\tnormals.push(0, 0, 1); // positive z\n\t\t\tuvs.push(vertices[i], vertices[i + 1]); // world uvs\n\t\t}\n\n\t\t// return\n\n\t\treturn {\n\t\t\tpositions,\n\t\t\tnormals,\n\t\t\tuvs,\n\t\t\tindices\n\t\t};\n\t}\n\n};\n\nexport { PolygonBuilder };"
  },
  {
    "path": "examples/jsm/geometries/builders/PolyhedronBuilder.js",
    "content": "import { Vector3, Vector2 } from 't3d';\n\nclass PolyhedronBuilder {\n\n\tstatic getGeometryData(vertices, indices, radius = 1, detail = 0) {\n\t\t// default buffer data\n\n\t\tconst vertexBuffer = [];\n\t\tconst uvBuffer = [];\n\n\t\t// the subdivision creates the vertex buffer data\n\n\t\tsubdivide(detail);\n\n\t\t// all vertices should lie on a conceptual sphere with a given radius\n\n\t\tapplyRadius(radius);\n\n\t\t// finally, create the uv data\n\n\t\tgenerateUVs();\n\n\t\t// helper functions\n\n\t\tfunction subdivide(detail) {\n\t\t\tconst a = new Vector3();\n\t\t\tconst b = new Vector3();\n\t\t\tconst c = new Vector3();\n\n\t\t\t// iterate over all faces and apply a subdivision with the given detail value\n\n\t\t\tfor (let i = 0; i < indices.length; i += 3) {\n\t\t\t\t// get the vertices of the face\n\n\t\t\t\tgetVertexByIndex(indices[i + 0], a);\n\t\t\t\tgetVertexByIndex(indices[i + 1], b);\n\t\t\t\tgetVertexByIndex(indices[i + 2], c);\n\n\t\t\t\t// perform subdivision\n\n\t\t\t\tsubdivideFace(a, b, c, detail);\n\t\t\t}\n\t\t}\n\n\t\tfunction subdivideFace(a, b, c, detail) {\n\t\t\tconst cols = detail + 1;\n\n\t\t\t// we use this multidimensional array as a data structure for creating the subdivision\n\n\t\t\tconst v = [];\n\n\t\t\t// construct all of the vertices for this subdivision\n\n\t\t\tfor (let i = 0; i <= cols; i++) {\n\t\t\t\tv[i] = [];\n\n\t\t\t\tconst aj = a.clone().lerp(c, i / cols);\n\t\t\t\tconst bj = b.clone().lerp(c, i / cols);\n\n\t\t\t\tconst rows = cols - i;\n\n\t\t\t\tfor (let j = 0; j <= rows; j++) {\n\t\t\t\t\tif (j === 0 && i === cols) {\n\t\t\t\t\t\tv[i][j] = aj;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tv[i][j] = aj.clone().lerp(bj, j / rows);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// construct all of the faces\n\n\t\t\tfor (let i = 0; i < cols; i++) {\n\t\t\t\tfor (let j = 0; j < 2 * (cols - i) - 1; j++) {\n\t\t\t\t\tconst k = Math.floor(j / 2);\n\n\t\t\t\t\tif (j % 2 === 0) {\n\t\t\t\t\t\tpushVertex(v[i][k + 1]);\n\t\t\t\t\t\tpushVertex(v[i + 1][k]);\n\t\t\t\t\t\tpushVertex(v[i][k]);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tpushVertex(v[i][k + 1]);\n\t\t\t\t\t\tpushVertex(v[i + 1][k + 1]);\n\t\t\t\t\t\tpushVertex(v[i + 1][k]);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfunction applyRadius(radius) {\n\t\t\tconst vertex = new Vector3();\n\n\t\t\t// iterate over the entire buffer and apply the radius to each vertex\n\n\t\t\tfor (let i = 0; i < vertexBuffer.length; i += 3) {\n\t\t\t\tvertex.x = vertexBuffer[i + 0];\n\t\t\t\tvertex.y = vertexBuffer[i + 1];\n\t\t\t\tvertex.z = vertexBuffer[i + 2];\n\n\t\t\t\tvertex.normalize().multiplyScalar(radius);\n\n\t\t\t\tvertexBuffer[i + 0] = vertex.x;\n\t\t\t\tvertexBuffer[i + 1] = vertex.y;\n\t\t\t\tvertexBuffer[i + 2] = vertex.z;\n\t\t\t}\n\t\t}\n\n\t\tfunction generateUVs() {\n\t\t\tconst vertex = new Vector3();\n\n\t\t\tfor (let i = 0; i < vertexBuffer.length; i += 3) {\n\t\t\t\tvertex.x = vertexBuffer[i + 0];\n\t\t\t\tvertex.y = vertexBuffer[i + 1];\n\t\t\t\tvertex.z = vertexBuffer[i + 2];\n\n\t\t\t\tconst u = azimuth(vertex) / 2 / Math.PI + 0.5;\n\t\t\t\tconst v = inclination(vertex) / Math.PI + 0.5;\n\t\t\t\tuvBuffer.push(u, 1 - v);\n\t\t\t}\n\n\t\t\tcorrectUVs();\n\n\t\t\tcorrectSeam();\n\t\t}\n\n\t\tfunction correctSeam() {\n\t\t\t// handle case when face straddles the seam, see #3269\n\n\t\t\tfor (let i = 0; i < uvBuffer.length; i += 6) {\n\t\t\t\t// uv data of a single face\n\n\t\t\t\tconst x0 = uvBuffer[i + 0];\n\t\t\t\tconst x1 = uvBuffer[i + 2];\n\t\t\t\tconst x2 = uvBuffer[i + 4];\n\n\t\t\t\tconst max = Math.max(x0, x1, x2);\n\t\t\t\tconst min = Math.min(x0, x1, x2);\n\n\t\t\t\t// 0.9 is somewhat arbitrary\n\n\t\t\t\tif (max > 0.9 && min < 0.1) {\n\t\t\t\t\tif (x0 < 0.2) uvBuffer[i + 0] += 1;\n\t\t\t\t\tif (x1 < 0.2) uvBuffer[i + 2] += 1;\n\t\t\t\t\tif (x2 < 0.2) uvBuffer[i + 4] += 1;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfunction pushVertex(vertex) {\n\t\t\tvertexBuffer.push(vertex.x, vertex.y, vertex.z);\n\t\t}\n\n\t\tfunction getVertexByIndex(index, vertex) {\n\t\t\tconst stride = index * 3;\n\n\t\t\tvertex.x = vertices[stride + 0];\n\t\t\tvertex.y = vertices[stride + 1];\n\t\t\tvertex.z = vertices[stride + 2];\n\t\t}\n\n\t\tfunction correctUVs() {\n\t\t\tconst a = new Vector3();\n\t\t\tconst b = new Vector3();\n\t\t\tconst c = new Vector3();\n\n\t\t\tconst centroid = new Vector3();\n\n\t\t\tconst uvA = new Vector2();\n\t\t\tconst uvB = new Vector2();\n\t\t\tconst uvC = new Vector2();\n\n\t\t\tfor (let i = 0, j = 0; i < vertexBuffer.length; i += 9, j += 6) {\n\t\t\t\ta.set(vertexBuffer[i + 0], vertexBuffer[i + 1], vertexBuffer[i + 2]);\n\t\t\t\tb.set(vertexBuffer[i + 3], vertexBuffer[i + 4], vertexBuffer[i + 5]);\n\t\t\t\tc.set(vertexBuffer[i + 6], vertexBuffer[i + 7], vertexBuffer[i + 8]);\n\n\t\t\t\tuvA.set(uvBuffer[j + 0], uvBuffer[j + 1]);\n\t\t\t\tuvB.set(uvBuffer[j + 2], uvBuffer[j + 3]);\n\t\t\t\tuvC.set(uvBuffer[j + 4], uvBuffer[j + 5]);\n\n\t\t\t\tcentroid.copy(a).add(b).add(c).multiplyScalar(1 / 3);\n\n\t\t\t\tconst azi = azimuth(centroid);\n\n\t\t\t\tcorrectUV(uvA, j + 0, a, azi);\n\t\t\t\tcorrectUV(uvB, j + 2, b, azi);\n\t\t\t\tcorrectUV(uvC, j + 4, c, azi);\n\t\t\t}\n\t\t}\n\n\t\tfunction correctUV(uv, stride, vector, azimuth) {\n\t\t\tif ((azimuth < 0) && (uv.x === 1)) {\n\t\t\t\tuvBuffer[stride] = uv.x - 1;\n\t\t\t}\n\n\t\t\tif ((vector.x === 0) && (vector.z === 0)) {\n\t\t\t\tuvBuffer[stride] = azimuth / 2 / Math.PI + 0.5;\n\t\t\t}\n\t\t}\n\n\t\t// Angle around the Y axis, counter-clockwise when looking from above.\n\n\t\tfunction azimuth(vector) {\n\t\t\treturn Math.atan2(vector.z, -vector.x);\n\t\t}\n\n\n\t\t// Angle above the XZ plane.\n\n\t\tfunction inclination(vector) {\n\t\t\treturn Math.atan2(-vector.y, Math.sqrt((vector.x * vector.x) + (vector.z * vector.z)));\n\t\t}\n\n\t\treturn {\n\t\t\tpositions: vertexBuffer,\n\t\t\tuvs: uvBuffer\n\t\t};\n\t}\n\n\tstatic getTetrahedronGeometryData(radius = 1, detail = 0) {\n\t\tconst vertices = [\n\t\t\t1, 1, 1, -1, -1, 1, -1, 1, -1, 1, -1, -1\n\t\t];\n\n\t\tconst indices = [\n\t\t\t2, 1, 0, 0, 3, 2, 1, 3, 0, 2, 3, 1\n\t\t];\n\n\t\treturn this.getGeometryData(vertices, indices, radius, detail);\n\t}\n\n\tstatic getOctahedronGeometryData(radius = 1, detail = 0) {\n\t\tconst vertices = [\n\t\t\t1, 0, 0, -1, 0, 0, 0, 1, 0,\n\t\t\t0, -1, 0, 0, 0, 1, 0, 0, -1\n\t\t];\n\n\t\tconst indices = [\n\t\t\t0, 2, 4, 0, 4, 3, 0, 3, 5,\n\t\t\t0, 5, 2, 1, 2, 5, 1, 5, 3,\n\t\t\t1, 3, 4, 1, 4, 2\n\t\t];\n\n\t\treturn this.getGeometryData(vertices, indices, radius, detail);\n\t}\n\n\tstatic getIcosahedronGeometryData(radius = 1, detail = 0) {\n\t\tconst t = (1 + Math.sqrt(5)) / 2;\n\n\t\tconst vertices = [\n\t\t\t-1, t, 0, 1, t, 0, -1, -t, 0, 1, -t, 0,\n\t\t\t0, -1, t, 0, 1, t, 0, -1, -t, 0, 1, -t,\n\t\t\tt, 0, -1, t, 0, 1, -t, 0, -1, -t, 0, 1\n\t\t];\n\n\t\tconst indices = [\n\t\t\t0, 11, 5, 0, 5, 1, 0, 1, 7, 0, 7, 10, 0, 10, 11,\n\t\t\t1, 5, 9, 5, 11, 4, 11, 10, 2, 10, 7, 6, 7, 1, 8,\n\t\t\t3, 9, 4, 3, 4, 2, 3, 2, 6, 3, 6, 8, 3, 8, 9,\n\t\t\t4, 9, 5, 2, 4, 11, 6, 2, 10,\t8, 6, 7, 9, 8, 1\n\t\t];\n\n\t\treturn this.getGeometryData(vertices, indices, radius, detail);\n\t}\n\n\tstatic getDodecahedronGeometryData(radius = 1, detail = 0) {\n\t\tconst t = (1 + Math.sqrt(5)) / 2;\n\t\tconst r = 1 / t;\n\n\t\tconst vertices = [\n\t\t\t// (±1, ±1, ±1)\n\t\t\t-1, -1, -1,\t-1, -1, 1,\n\t\t\t-1, 1, -1, -1, 1, 1,\n\t\t\t1, -1, -1, 1, -1, 1,\n\t\t\t1, 1, -1, 1, 1, 1,\n\n\t\t\t// (0, ±1/φ, ±φ)\n\t\t\t0, -r, -t, 0, -r, t,\n\t\t\t0, r, -t, 0, r, t,\n\n\t\t\t// (±1/φ, ±φ, 0)\n\t\t\t-r, -t, 0, -r, t, 0,\n\t\t\tr, -t, 0, r, t, 0,\n\n\t\t\t// (±φ, 0, ±1/φ)\n\t\t\t-t, 0, -r, t, 0, -r,\n\t\t\t-t, 0, r, t, 0, r\n\t\t];\n\n\t\tconst indices = [\n\t\t\t3, 11, 7, \t3, 7, 15, \t3, 15, 13,\n\t\t\t7, 19, 17, \t7, 17, 6, \t7, 6, 15,\n\t\t\t17, 4, 8, \t17, 8, 10, \t17, 10, 6,\n\t\t\t8, 0, 16, \t8, 16, 2, \t8, 2, 10,\n\t\t\t0, 12, 1, \t0, 1, 18, \t0, 18, 16,\n\t\t\t6, 10, 2, \t6, 2, 13, \t6, 13, 15,\n\t\t\t2, 16, 18, \t2, 18, 3, \t2, 3, 13,\n\t\t\t18, 1, 9, \t18, 9, 11, \t18, 11, 3,\n\t\t\t4, 14, 12, \t4, 12, 0, \t4, 0, 8,\n\t\t\t11, 9, 5, \t11, 5, 19, \t11, 19, 7,\n\t\t\t19, 5, 14, \t19, 14, 4, \t19, 4, 17,\n\t\t\t1, 12, 14, \t1, 14, 5, \t1, 5, 9\n\t\t];\n\n\t\treturn this.getGeometryData(vertices, indices, radius, detail);\n\t}\n\n}\n\nexport { PolyhedronBuilder };"
  },
  {
    "path": "examples/jsm/geometries/builders/RouteBuilder.js",
    "content": "import { Vector3 } from 't3d';\n\n/**\n * RouteBuilder\n */\nconst RouteBuilder = {\n\n\t/**\n\t * @param {object} frames\n\t * @param {object} [options={}]\n\t * @param {number} [options.width=0.1]\n\t * @param {boolean} [options.arrow=true]\n\t * @param {string} [options.side='both'] - 'both' / 'left' / 'right'\n\t * @param {boolean} [options.sharp=false]\n\t * @returns {object} - The geometry data.\n\t */\n\tgetGeometryData: function(frames, options = {}) {\n\t\tconst width = options.width !== undefined ? options.width : 0.1;\n\t\tconst arrow = options.arrow !== undefined ? options.arrow : true;\n\t\tconst side = options.side !== undefined ? options.side : 'both';\n\t\tconst sharp = options.sharp !== undefined ? options.sharp : false;\n\n\t\t// build vertex data\n\n\t\tconst positions = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\t\tconst uvs2 = [];\n\t\tconst indices = [];\n\n\t\tconst frameLength = frames.points.length;\n\t\tconst lastIndex = frameLength - 1;\n\n\t\tconst halfWidth = width / 2;\n\t\tconst sideWidth = (side !== 'both' ? width / 2 : width);\n\t\tconst totalLength = frames.lengths[lastIndex];\n\n\t\t// for sharp corners\n\t\tconst sharpUvOffset = halfWidth / sideWidth;\n\t\tconst sharpUvOffset2 = halfWidth / totalLength;\n\t\tconst leftOffset = new Vector3();\n\t\tconst rightOffset = new Vector3();\n\t\tconst tempPoint1 = new Vector3();\n\t\tconst tempPoint2 = new Vector3();\n\n\t\tconst left = new Vector3();\n\t\tconst right = new Vector3();\n\t\tlet verticesCount = 0;\n\t\tfor (let i = 0; i < frameLength; i++) {\n\t\t\tconst uvDist = frames.lengths[i] / sideWidth;\n\t\t\tconst uvDist2 = frames.lengths[i] / totalLength;\n\n\t\t\tif (side !== 'left') {\n\t\t\t\tright.copy(frames.binormals[i]).multiplyScalar(halfWidth * frames.widthScales[i]);\n\t\t\t} else {\n\t\t\t\tright.set(0, 0, 0);\n\t\t\t}\n\n\t\t\tif (side !== 'right') {\n\t\t\t\tleft.copy(frames.binormals[i]).multiplyScalar(-halfWidth * frames.widthScales[i]);\n\t\t\t} else {\n\t\t\t\tleft.set(0, 0, 0);\n\t\t\t}\n\n\t\t\tconst normal = frames.normals[i];\n\n\t\t\tright.add(frames.points[i]);\n\t\t\tleft.add(frames.points[i]);\n\n\t\t\tif (sharp && frames.sharps[i]) { // sharp corners\n\t\t\t\trightOffset.fromArray(positions, positions.length - 3).sub(right);\n\t\t\t\tleftOffset.fromArray(positions, positions.length - 6).sub(left);\n\n\t\t\t\tconst rightDist = rightOffset.getLength();\n\t\t\t\tconst leftDist = leftOffset.getLength();\n\n\t\t\t\tconst sideOffset = leftDist - rightDist;\n\t\t\t\tlet longerOffset, longEdge;\n\n\t\t\t\tif (sideOffset > 0) {\n\t\t\t\t\tlongerOffset = leftOffset;\n\t\t\t\t\tlongEdge = left;\n\t\t\t\t} else {\n\t\t\t\t\tlongerOffset = rightOffset;\n\t\t\t\t\tlongEdge = right;\n\t\t\t\t}\n\n\t\t\t\ttempPoint1.copy(longerOffset).normalize(Math.abs(sideOffset)).add(longEdge);\n\n\t\t\t\tconst _cos = tempPoint2.copy(longEdge).sub(tempPoint1).normalize().dot(frames.tangents[i]);\n\t\t\t\tconst _len = tempPoint2.copy(longEdge).sub(tempPoint1).getLength();\n\t\t\t\tconst _dist = _cos * _len * 2;\n\n\t\t\t\ttempPoint2.copy(frames.tangents[i]).normalize(_dist).add(tempPoint1);\n\n\t\t\t\tif (sideOffset > 0) {\n\t\t\t\t\tpositions.push(\n\t\t\t\t\t\ttempPoint1.x, tempPoint1.y, tempPoint1.z, // 6\n\t\t\t\t\t\tright.x, right.y, right.z, // 5\n\t\t\t\t\t\tleft.x, left.y, left.z, // 4\n\t\t\t\t\t\tright.x, right.y, right.z, // 3\n\t\t\t\t\t\ttempPoint2.x, tempPoint2.y, tempPoint2.z, // 2\n\t\t\t\t\t\tright.x, right.y, right.z // 1\n\t\t\t\t\t);\n\n\t\t\t\t\tverticesCount += 6;\n\n\t\t\t\t\tindices.push(\n\t\t\t\t\t\tverticesCount - 6, verticesCount - 8, verticesCount - 7,\n\t\t\t\t\t\tverticesCount - 6, verticesCount - 7, verticesCount - 5,\n\n\t\t\t\t\t\tverticesCount - 4, verticesCount - 6, verticesCount - 5,\n\t\t\t\t\t\tverticesCount - 2, verticesCount - 4, verticesCount - 1\n\t\t\t\t\t);\n\t\t\t\t} else {\n\t\t\t\t\tpositions.push(\n\t\t\t\t\t\tleft.x, left.y, left.z, // 6\n\t\t\t\t\t\ttempPoint1.x, tempPoint1.y, tempPoint1.z, // 5\n\t\t\t\t\t\tleft.x, left.y, left.z, // 4\n\t\t\t\t\t\tright.x, right.y, right.z, // 3\n\t\t\t\t\t\tleft.x, left.y, left.z, // 2\n\t\t\t\t\t\ttempPoint2.x, tempPoint2.y, tempPoint2.z // 1\n\t\t\t\t\t);\n\n\t\t\t\t\tverticesCount += 6;\n\n\t\t\t\t\tindices.push(\n\t\t\t\t\t\tverticesCount - 6, verticesCount - 8, verticesCount - 7,\n\t\t\t\t\t\tverticesCount - 6, verticesCount - 7, verticesCount - 5,\n\n\t\t\t\t\t\tverticesCount - 6, verticesCount - 5, verticesCount - 3,\n\t\t\t\t\t\tverticesCount - 2, verticesCount - 3, verticesCount - 1\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tnormals.push(\n\t\t\t\t\tnormal.x, normal.y, normal.z,\n\t\t\t\t\tnormal.x, normal.y, normal.z,\n\t\t\t\t\tnormal.x, normal.y, normal.z,\n\t\t\t\t\tnormal.x, normal.y, normal.z,\n\t\t\t\t\tnormal.x, normal.y, normal.z,\n\t\t\t\t\tnormal.x, normal.y, normal.z\n\t\t\t\t);\n\n\t\t\t\tuvs.push(\n\t\t\t\t\tuvDist - sharpUvOffset, 0,\n\t\t\t\t\tuvDist - sharpUvOffset, 1,\n\t\t\t\t\tuvDist, 0,\n\t\t\t\t\tuvDist, 1,\n\t\t\t\t\tuvDist + sharpUvOffset, 0,\n\t\t\t\t\tuvDist + sharpUvOffset, 1\n\t\t\t\t);\n\n\t\t\t\tuvs2.push(\n\t\t\t\t\tuvDist2 - sharpUvOffset2, 0,\n\t\t\t\t\tuvDist2 - sharpUvOffset2, 1,\n\t\t\t\t\tuvDist2, 0,\n\t\t\t\t\tuvDist2, 1,\n\t\t\t\t\tuvDist2 + sharpUvOffset2, 0,\n\t\t\t\t\tuvDist2 + sharpUvOffset2, 1\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tpositions.push(\n\t\t\t\t\tleft.x, left.y, left.z,\n\t\t\t\t\tright.x, right.y, right.z\n\t\t\t\t);\n\n\t\t\t\tnormals.push(\n\t\t\t\t\tnormal.x, normal.y, normal.z,\n\t\t\t\t\tnormal.x, normal.y, normal.z\n\t\t\t\t);\n\n\t\t\t\tuvs.push(\n\t\t\t\t\tuvDist, 0,\n\t\t\t\t\tuvDist, 1\n\t\t\t\t);\n\n\t\t\t\tuvs2.push(\n\t\t\t\t\tuvDist2, 0,\n\t\t\t\t\tuvDist2, 1\n\t\t\t\t);\n\n\t\t\t\tverticesCount += 2;\n\n\t\t\t\tif (i > 0) {\n\t\t\t\t\tindices.push(\n\t\t\t\t\t\tverticesCount - 2, verticesCount - 4, verticesCount - 3,\n\t\t\t\t\t\tverticesCount - 2, verticesCount - 3, verticesCount - 1\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (arrow) {\n\t\t\tconst uvDist = frames.lengths[lastIndex] / sideWidth;\n\t\t\tconst uvDist2 = frames.lengths[lastIndex] / totalLength;\n\n\t\t\tconst normal = frames.normals[lastIndex];\n\n\t\t\tif (side !== 'left') {\n\t\t\t\tright.copy(frames.binormals[lastIndex]).multiplyScalar(halfWidth * 2);\n\t\t\t} else {\n\t\t\t\tright.set(0, 0, 0);\n\t\t\t}\n\n\t\t\tif (side !== 'right') {\n\t\t\t\tleft.copy(frames.binormals[lastIndex]).multiplyScalar(-halfWidth * 2);\n\t\t\t} else {\n\t\t\t\tleft.set(0, 0, 0);\n\t\t\t}\n\n\t\t\tconst sharp = tempPoint1.copy(frames.tangents[lastIndex]).normalize(halfWidth * 3);\n\n\t\t\tright.add(frames.points[lastIndex]);\n\t\t\tleft.add(frames.points[lastIndex]);\n\t\t\tsharp.add(frames.points[lastIndex]);\n\n\t\t\tpositions.push(\n\t\t\t\tleft.x, left.y, left.z,\n\t\t\t\tright.x, right.y, right.z,\n\t\t\t\tsharp.x, sharp.y, sharp.z\n\t\t\t);\n\n\t\t\tnormals.push(\n\t\t\t\tnormal.x, normal.y, normal.z,\n\t\t\t\tnormal.x, normal.y, normal.z,\n\t\t\t\tnormal.x, normal.y, normal.z\n\t\t\t);\n\n\t\t\tuvs.push(\n\t\t\t\tuvDist, side !== 'both' ? (side !== 'right' ? -2 : 0) : -0.5,\n\t\t\t\tuvDist, side !== 'both' ? (side !== 'left' ? 2 : 0) : 1.5,\n\t\t\t\tuvDist + 1.5, side !== 'both' ? 0 : 0.5\n\t\t\t);\n\n\t\t\tuvs2.push(\n\t\t\t\tuvDist2, side !== 'both' ? (side !== 'right' ? -2 : 0) : -0.5,\n\t\t\t\tuvDist2, side !== 'both' ? (side !== 'left' ? 2 : 0) : 1.5,\n\t\t\t\tuvDist2 + (1.5 * width / totalLength), side !== 'both' ? 0 : 0.5\n\t\t\t);\n\n\t\t\tverticesCount += 3;\n\n\t\t\tindices.push(\n\t\t\t\tverticesCount - 1, verticesCount - 3, verticesCount - 2\n\t\t\t);\n\t\t}\n\n\t\t// return\n\n\t\treturn {\n\t\t\tpositions,\n\t\t\tnormals,\n\t\t\tuvs,\n\t\t\tuvs2,\n\t\t\tindices\n\t\t};\n\t}\n\n};\n\nexport { RouteBuilder };"
  },
  {
    "path": "examples/jsm/geometries/builders/TorusBuilder.js",
    "content": "import { Vector3 } from 't3d';\n\n/**\n * TorusBuilder\n */\nconst TorusBuilder = {\n\n\tgetGeometryData: function(radius = 1, tube = 0.4, radialSegments = 12, tubularSegments = 48, arc = Math.PI * 2) {\n\t\tradialSegments = Math.floor(radialSegments);\n\t\ttubularSegments = Math.floor(tubularSegments);\n\n\t\tconst indices = [];\n\t\tconst positions = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\tconst center = new Vector3();\n\t\tconst vertex = new Vector3();\n\t\tconst normal = new Vector3();\n\n\t\tfor (let j = 0; j <= radialSegments; j++) {\n\t\t\tfor (let i = 0; i <= tubularSegments; i++) {\n\t\t\t\tconst u = i / tubularSegments * arc;\n\t\t\t\tconst v = j / radialSegments * Math.PI * 2;\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertex.x = (radius + tube * Math.cos(v)) * Math.cos(u);\n\t\t\t\tvertex.y = (radius + tube * Math.cos(v)) * Math.sin(u);\n\t\t\t\tvertex.z = tube * Math.sin(v);\n\n\t\t\t\tpositions.push(vertex.x, vertex.y, vertex.z);\n\n\t\t\t\t// normal\n\n\t\t\t\tcenter.x = radius * Math.cos(u);\n\t\t\t\tcenter.y = radius * Math.sin(u);\n\t\t\t\tnormal.subVectors(vertex, center).normalize();\n\n\t\t\t\tnormals.push(normal.x, normal.y, normal.z);\n\n\t\t\t\t// uv\n\n\t\t\t\tuvs.push(i / tubularSegments);\n\t\t\t\tuvs.push(j / radialSegments);\n\t\t\t}\n\t\t}\n\n\t\t// generate indices\n\n\t\tfor (let j = 1; j <= radialSegments; j++) {\n\t\t\tfor (let i = 1; i <= tubularSegments; i++) {\n\t\t\t\t// indices\n\n\t\t\t\tconst a = (tubularSegments + 1) * j + i - 1;\n\t\t\t\tconst b = (tubularSegments + 1) * (j - 1) + i - 1;\n\t\t\t\tconst c = (tubularSegments + 1) * (j - 1) + i;\n\t\t\t\tconst d = (tubularSegments + 1) * j + i;\n\n\t\t\t\t// faces\n\n\t\t\t\tindices.push(a, b, d);\n\t\t\t\tindices.push(b, c, d);\n\t\t\t}\n\t\t}\n\n\t\t// return\n\n\t\treturn {\n\t\t\tpositions,\n\t\t\tnormals,\n\t\t\tuvs,\n\t\t\tindices\n\t\t};\n\t}\n\n};\n\nexport { TorusBuilder };"
  },
  {
    "path": "examples/jsm/geometries/builders/TubeBuilder.js",
    "content": "import { Vector3, Quaternion } from 't3d';\n\n/**\n * TubeBuilder\n */\nconst TubeBuilder = {\n\n\t/**\n\t * @param {object} frames\n\t * @param {object} [options={}]\n\t * @param {number} [options.radius=0.1]\n\t * @param {number} [options.radialSegments=8]\n\t * @param {number} [options.startRad=0]\n\t * @param {boolean} [options.generateStartCap=false] - Whether to generate the start cap.\n\t * @param {boolean} [options.generateEndCap=false] - Whether to generate the end cap.\n\t * @returns {object} - The geometry data.\n\t */\n\tgetGeometryData: function(frames, options = {}) {\n\t\tconst radius = options.radius !== undefined ? options.radius : 0.1;\n\t\tconst radialSegments = Math.max(2, options.radialSegments !== undefined ? options.radialSegments : 8);\n\t\tconst startRad = options.startRad !== undefined ? options.startRad : 0;\n\t\tconst generateStartCap = (options.generateStartCap !== undefined) ? options.generateStartCap : false;\n\t\tconst generateEndCap = (options.generateEndCap !== undefined) ? options.generateEndCap : false;\n\n\t\t// build side vertex data\n\n\t\tconst positions = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\t\tconst uvs2 = [];\n\t\tconst indices = [];\n\n\t\tconst frameLength = frames.points.length;\n\t\tconst lastIndex = frameLength - 1;\n\n\t\tconst circum = radius * 2 * Math.PI;\n\t\tconst totalLength = frames.lengths[lastIndex];\n\n\t\tconst quaternion = new Quaternion();\n\t\tconst segmentVector = new Vector3();\n\t\tconst normalVector = new Vector3();\n\t\tconst offsetVector = new Vector3();\n\n\t\tlet verticesCount = 0;\n\n\t\tfor (let i = 0; i < frameLength; i++) {\n\t\t\tconst uvDist = frames.lengths[i] / circum;\n\t\t\tconst uvDist2 = frames.lengths[i] / totalLength;\n\n\t\t\tconst sharp = frames.sharps[i];\n\t\t\tconst widthScale = frames.widthScales[i];\n\n\t\t\tfor (let r = 0; r <= radialSegments; r++) {\n\t\t\t\tlet _r = r;\n\t\t\t\tif (_r == radialSegments) {\n\t\t\t\t\t_r = 0;\n\t\t\t\t}\n\n\t\t\t\tsegmentVector.copy(frames.normals[i]);\n\t\t\t\tquaternion.setFromAxisAngle(frames.tangents[i], startRad + Math.PI * 2 * _r / radialSegments);\n\t\t\t\tsegmentVector.applyQuaternion(quaternion).normalize();\n\n\t\t\t\tif (sharp) {\n\t\t\t\t\t// At sharp corners, the cross-section is not a circle, but an ellipse.\n\t\t\t\t\t// Here, we stretch the cross-section according to the direction of the angle bisector.\n\t\t\t\t\toffsetVector.copy(segmentVector)\n\t\t\t\t\t\t.scaleAlong(frames.bisectors[i], widthScale)\n\t\t\t\t\t\t.multiplyScalar(radius).add(frames.points[i]);\n\t\t\t\t\tnormalVector.copy(segmentVector)\n\t\t\t\t\t\t.scaleAlong(frames.bisectors[i], 1 / widthScale)\n\t\t\t\t\t\t.normalize();\n\t\t\t\t} else {\n\t\t\t\t\t// fallback to simple calculation, because the angle is not obvious,\n\t\t\t\t\t// the benefit of precise stretching is not obvious\n\t\t\t\t\toffsetVector.copy(segmentVector).multiplyScalar(radius * widthScale).add(frames.points[i]);\n\t\t\t\t\tnormalVector.copy(segmentVector);\n\t\t\t\t}\n\n\t\t\t\tpositions.push(offsetVector.x, offsetVector.y, offsetVector.z);\n\t\t\t\tnormals.push(normalVector.x, normalVector.y, normalVector.z);\n\t\t\t\tuvs.push(uvDist, r / radialSegments);\n\t\t\t\tuvs2.push(uvDist2, r / radialSegments);\n\n\t\t\t\tverticesCount++;\n\t\t\t}\n\n\t\t\tif (i > 0) {\n\t\t\t\tconst begin1 = verticesCount - (radialSegments + 1) * 2;\n\t\t\t\tconst begin2 = verticesCount - (radialSegments + 1);\n\n\t\t\t\tfor (let i = 0; i < radialSegments; i++) {\n\t\t\t\t\tindices.push(\n\t\t\t\t\t\tbegin2 + i, begin1 + i, begin1 + i + 1,\n\t\t\t\t\t\tbegin2 + i, begin1 + i + 1, begin2 + i + 1\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// end cap\n\n\t\tif (radialSegments >= 3 && generateEndCap) {\n\t\t\tnormalVector.copy(frames.tangents[lastIndex]);\n\t\t\tnormalVector.normalize();\n\n\t\t\tfor (let r = verticesCount - radialSegments, l = verticesCount; r < l; r++) {\n\t\t\t\tpositions.push(positions[r * 3], positions[r * 3 + 1], positions[r * 3 + 2]);\n\t\t\t\tuvs.push(uvs[r * 2], uvs[r * 2 + 1]);\n\t\t\t\tuvs2.push(uvs2[r * 2], uvs2[r * 2 + 1]);\n\t\t\t\tnormals.push(normalVector.x, normalVector.y, normalVector.z);\n\t\t\t\tverticesCount++;\n\t\t\t}\n\n\t\t\tconst index = verticesCount - radialSegments;\n\t\t\tfor (let i = 0; i < radialSegments - 2; i++) {\n\t\t\t\tindices.push(index, index + i + 1, index + i + 2);\n\t\t\t}\n\t\t}\n\n\t\t// start cap\n\n\t\tif (radialSegments >= 3 && generateStartCap) {\n\t\t\tnormalVector.copy(frames.tangents[0]);\n\t\t\tnormalVector.normalize();\n\n\t\t\tfor (let r = 0; r < radialSegments; r++) {\n\t\t\t\tpositions.push(positions[r * 3], positions[r * 3 + 1], positions[r * 3 + 2]);\n\t\t\t\tnormals.push(-normalVector.x, -normalVector.y, -normalVector.z);\n\t\t\t\tuvs.push(uvs[r * 2], uvs[r * 2 + 1]);\n\t\t\t\tuvs2.push(uvs2[r * 2], uvs2[r * 2 + 1]);\n\t\t\t\tverticesCount++;\n\t\t\t}\n\n\t\t\tconst index = verticesCount - radialSegments;\n\t\t\tfor (let i = 0; i < radialSegments - 2; i++) {\n\t\t\t\tindices.push(index, index + i + 2, index + i + 1);\n\t\t\t}\n\t\t}\n\n\t\t// return\n\n\t\treturn {\n\t\t\tpositions,\n\t\t\tnormals,\n\t\t\tuvs,\n\t\t\tuvs2,\n\t\t\tindices\n\t\t};\n\t}\n\n};\n\nexport { TubeBuilder };"
  },
  {
    "path": "examples/jsm/impostor/OctahedralImpostor.js",
    "content": "\nimport {\n\tMesh,\n\tPlaneGeometry\n} from 't3d';\nimport { ShaderLib, PBRMaterial, MATERIAL_TYPE, DepthMaterial }\tfrom 't3d';\n\n// https://github.com/agargaro/octahedral-impostor\nexport class OctahedralImpostor extends Mesh {\n\n\tconstructor() {\n\t\tsuper(new PlaneGeometry(), new OctahedralImpostorMaterial());\n\t\tthis.frustumCulled = false;\n\t}\n\n}\n\nexport class OctahedralImpostorMaterial extends PBRMaterial {\n\n\tconstructor(sourceMaterial) {\n\t\tsuper();\n\n\t\tthis.type = MATERIAL_TYPE.SHADER;\n\n\t\tif (sourceMaterial) {\n\t\t\tthis.copy(sourceMaterial);\n\t\t}\n\n\t\tthis.shaderName = 'oct_impostor_pbr';\n\n\t\tthis.vertexShader = vertexShader;\n\t\tthis.fragmentShader = fragmentShader;\n\n\t\tthis.defines.EZ_USE_HEMI_OCTAHEDRON = true;\n\t\tthis.uniforms.impostorTransform = new Float32Array([\n\t\t\t1, 0, 0, 0,\n\t\t\t0, 1, 0, 0,\n\t\t\t0, 0, 1, 0,\n\t\t\t0, 0, 0, 1\n\t\t]);\n\n\t\tthis.uniforms.spritesPerSide = 32;\n\t\tthis.uniforms.alphaClamp = 0.5;\n\t\tthis.uniforms.octahedralWeightSharpness = 1.5;\n\t}\n\n}\nlet fragmentShader = ShaderLib.pbr_frag;\nlet vertexShader = ShaderLib.pbr_vert;\n\nconst octahedral_pars_vert = `\n\t#if defined USE_INSTANCING\n\t\tattribute mat4 instanceMatrix;\n\t#endif\n\n\tuniform mat4 impostorTransform;\n\tuniform float spritesPerSide;\n\n\tvarying vec2 vSpriteUV1;\n\tvarying vec2 vSpriteUV2;\n\tvarying vec2 vSpriteUV3;\n\tvarying mat4 v_normalMatrix;\n\n\tflat varying vec4 vSpritesWeight;\n\tflat varying vec2 vSprite1;\n\tflat varying vec2 vSprite2;\n\tflat varying vec2 vSprite3;\n\n\tvec2 encodeDirection(vec3 direction) {\n\t\t#ifdef EZ_USE_HEMI_OCTAHEDRON\n\t\t\tvec3 octahedron = direction / dot(direction, sign(direction));\n\t\t\treturn vec2(1.0 + octahedron.x + octahedron.z, 1.0 + octahedron.z - octahedron.x) * 0.5;\n\t\t#else\n\t\t\t// TODO: Implement full octahedral encoding\n\t\t#endif\n\t}\n\n\tvec3 decodeDirection(vec2 gridIndex, vec2 spriteCountMinusOne) {\n\t\tvec2 gridUV = gridIndex / spriteCountMinusOne;\n\t\t#ifdef EZ_USE_HEMI_OCTAHEDRON\n\t\t\tvec3 position = vec3(gridUV.x - gridUV.y, 0.0, -1.0 + gridUV.x + gridUV.y);\n\t\t\tposition.y = 1.0 - abs(position.x) - abs(position.z);\n\t\t#else\n\t\t\t// TODO: Implement full octahedral decoding\n\t\t#endif\n\t\treturn normalize(position);\n\t}\n\n\tvoid computePlaneBasis(vec3 normal, out vec3 tangent, out vec3 bitangent) {\n\t\tvec3 up = vec3(0.0, 1.0, 0.0);\n\t\tif(normal.y > 0.9999)\n\t\t\tup = vec3(-1.0, 0.0, 0.0);\n\t\t#ifndef EZ_USE_HEMI_OCTAHEDRON\n\t\t\tif(normal.y < -0.9999)\n\t\t\t\tup = vec3(1.0, 0.0, 0.0);\n\t\t#endif\n\t\ttangent = normalize(cross(up, normal));\n\t\tbitangent = cross(normal, tangent);\n\t}\n\n\tvec3 projectVertex(vec3 normal) {\n\t\tvec3 x, y;\n\t\tcomputePlaneBasis(normal, x, y);\n\t\treturn x * a_Position.z + y * a_Position.x;\n\t}\n\n\tvoid computeSpritesWeight(vec2 gridFract) {\n\t\tvSpritesWeight = vec4(min(1.0 - gridFract.x, 1.0 - gridFract.y), abs(gridFract.x - gridFract.y), min(gridFract.x, gridFract.y), ceil(gridFract.x - gridFract.y));\n\t}\n\n\tvec2 projectToPlaneUV(vec3 normal, vec3 tangent, vec3 bitangent, vec3 cameraPosition, vec3 viewDir) {\n\t\tfloat denom = dot(viewDir, normal);\n\t\tfloat t = -dot(cameraPosition, normal) / denom;\n\t\tvec3 hit = cameraPosition + viewDir * t;\n\t\tvec2 uv = vec2(dot(tangent, hit), dot(bitangent, hit));\n\t\treturn uv + 0.5;\n\t}\n\n\tvec3 projectDirectionToBasis(vec3 dir, vec3 normal, vec3 tangent, vec3 bitangent) {\n\t\treturn vec3(dot(dir, tangent), dot(dir, bitangent), dot(dir, normal));\n\t}\n`;\n\nconst octahedral_vertex = `\n\tvec2 spritesMinusOne = vec2(spritesPerSide - 1.0);\n\n\t#if defined USE_INSTANCING\n\t\tmat4 transformedInstanceMatrix = instanceMatrix;\n\t\tvec3 cameraPosLocal = (inverse(transformedInstanceMatrix * u_Model) * vec4(u_CameraPosition, 1.0)).xyz;\n\t#else\n\t\tvec3 cameraPosLocal = (inverse( u_Model) * vec4(u_CameraPosition, 1.0)).xyz;\n\t#endif\n\tvec3 cameraDir = normalize(cameraPosLocal);\n\tvec3 projectedVertex = projectVertex(cameraDir);\n\tvec3 viewDirLocal = normalize(projectedVertex - cameraPosLocal);\n\tvec2 grid = encodeDirection(cameraDir) * spritesMinusOne;\n\tvec2 gridFloor = min(floor(grid), spritesMinusOne);\n\tvec2 gridFract = fract(grid);\n\tcomputeSpritesWeight(gridFract);\n\n\tvSprite1 = gridFloor;\n\tvSprite2 = min(vSprite1 + mix(vec2(0.0, 1.0), vec2(1.0, 0.0), vSpritesWeight.w), spritesMinusOne);\n\tvSprite3 = min(vSprite1 + vec2(1.0), spritesMinusOne);\n\n\tvec3 spriteNormal1 = decodeDirection(vSprite1, spritesMinusOne);\n\tvec3 spriteNormal2 = decodeDirection(vSprite2, spritesMinusOne);\n\tvec3 spriteNormal3 = decodeDirection(vSprite3, spritesMinusOne);\n\n\tvec3 planeX1, planeY1, planeX2, planeY2, planeX3, planeY3;\n\tcomputePlaneBasis(spriteNormal1, planeX1, planeY1);\n\tcomputePlaneBasis(spriteNormal2, planeX2, planeY2);\n\tcomputePlaneBasis(spriteNormal3, planeX3, planeY3);\n\n\tvSpriteUV1 = projectToPlaneUV(spriteNormal1, planeX1, planeY1, cameraPosLocal, viewDirLocal);\n\tvSpriteUV2 = projectToPlaneUV(spriteNormal2, planeX2, planeY2, cameraPosLocal, viewDirLocal);\n\tvSpriteUV3 = projectToPlaneUV(spriteNormal3, planeX3, planeY3, cameraPosLocal, viewDirLocal);\n\n\tvec4 mvPosition = vec4(projectedVertex, 1.0);\n\n\t#if defined USE_INSTANCING\n\t\tmvPosition = transformedInstanceMatrix * impostorTransform * mvPosition;\n\t#else\n\t\tmvPosition = impostorTransform * mvPosition;\n\t#endif\n\n\ttransformed = mvPosition.xyz;\n\tvec4 worldPosition = u_Model * vec4(transformed, 1.0);\n\tv_normalMatrix = inverse(u_View);\n\tgl_Position = u_ProjectionView * worldPosition;\n`;\n\nconst octahedral_pars_frag = `\n\tuniform float spritesPerSide;\n\tuniform float alphaClamp;\n\tuniform float octahedralWeightSharpness;\n\tuniform mat4 transformedInstanceMatrix;\n\tuniform mat4 impostorTransform;\n\n\tflat varying vec4 vSpritesWeight;\n\tflat varying vec2 vSprite1;\n\tflat varying vec2 vSprite2;\n\tflat varying vec2 vSprite3;\n\n\tvarying vec2 vSpriteUV1;\n\tvarying vec2 vSpriteUV2;\n\tvarying vec2 vSpriteUV3;\n\tvarying mat4 v_normalMatrix;\n\n\tvec3 octahedronToUnitVector(vec2 p) {\n\t\tvec3 v = vec3(p.x, 1.0 - dot(abs(p), vec2(1.0)), p.y);\n\t\tv.xz = mix(v.xz, (1.0 - abs(v.zx)) * sign(v.xz), step(0.0, -v.y));\n\t\treturn normalize(v);\n\t}\n\n\tvec3 blendNormals(vec2 uv1, vec2 uv2, vec2 uv3, out vec2 roughnessMetalness) {\n\t\tvec4 value1 = texture2D(normalMap, uv1);\n\t\tvec4 value2 = texture2D(normalMap, uv2);\n\t\tvec4 value3 = texture2D(normalMap, uv3);\n\t\tvec3 normal1 = octahedronToUnitVector(value1.rg * 2.0 - 1.0); // we're reading twice if parallax enabled\n\t\tvec3 normal2 = octahedronToUnitVector(value2.rg * 2.0 - 1.0);\n\t\tvec3 normal3 = octahedronToUnitVector(value3.rg * 2.0 - 1.0);\n\t\tvec2 roughnessMetalness1 = value1.ab;\n\t\tvec2 roughnessMetalness2 = value2.ab;\n\t\tvec2 roughnessMetalness3 = value3.ab;\n\t\tfloat w1 = vSpritesWeight.x;\n\t\tfloat w2 = vSpritesWeight.y;\n\t\tfloat w3 = vSpritesWeight.z;\n\n\t\tw1 = pow(w1, octahedralWeightSharpness);\n\t\tw2 = pow(w2, octahedralWeightSharpness);\n\t\tw3 = pow(w3, octahedralWeightSharpness);\n\n\t\tfloat sumW = max(w1 + w2 + w3, 1e-6);\n\t\tw1 /= sumW;\n\t\tw2 /= sumW;\n\t\tw3 /= sumW;\n\n\t\t// Blend roughnessMetalness\n\t\troughnessMetalness = roughnessMetalness1 * w1 + roughnessMetalness2 * w2 + roughnessMetalness3 * w3;\n\n\t\t// Fix normal if blended bad\n\t\treturn normalize(normal1.xyz * w1 + normal2.xyz * w2 + normal3.xyz * w3);\n\n\t\t// return normalize(normal1.xyz );\n\t}\n\n\tvec2 getUV(vec2 uv_f, vec2 frame, float frame_size) {\n\t\tuv_f = clamp(uv_f, vec2(0), vec2(1));\n\t\tvec2 uv_quad = frame_size * (frame + uv_f);\n\t\tuv_f =  frame_size * (frame + uv_f);\n\t\treturn clamp(uv_f, vec2(0), vec2(1));\n\t}\n`;\n\nconst octahedral_map_frag = `\n\tfloat spriteSize = 1.0 / spritesPerSide;\n\n\t// todo remove if we want parallax\n\tvec2 uv1 = getUV(vSpriteUV1, vSprite1, spriteSize);\n\tvec2 uv2 = getUV(vSpriteUV2, vSprite2, spriteSize);\n\tvec2 uv3 = getUV(vSpriteUV3, vSprite3, spriteSize);\n\n\tvec4 sprite1, sprite2, sprite3;\n\tfloat test = 1.0 - alphaClamp;\n\n\tif (vSpritesWeight.x >=  test) {\n\t\tsprite1 = texture2D(diffuseMap, uv1);\n\t\tif (sprite1.a <= alphaClamp) discard;\n\t\tsprite2 = texture2D(diffuseMap, uv2);\n\t\tsprite3 = texture2D(diffuseMap, uv3);\n\t} else if (vSpritesWeight.y >=  test) {\n\t\tsprite2 = texture2D(diffuseMap, uv2);\n\t\tif (sprite2.a <= alphaClamp) discard;\n\t\tsprite1 = texture2D(diffuseMap, uv1);\n\t\tsprite3 = texture2D(diffuseMap, uv3);\n\t} else if (vSpritesWeight.z >=  test) {\n\t\tsprite3 = texture2D(diffuseMap, uv3);\n\t\tif (sprite3.a <= alphaClamp) discard;\n\t\tsprite1 = texture2D(diffuseMap, uv1);\n\t\tsprite2 = texture2D(diffuseMap, uv2);\n\t} else {\n\t\tsprite1 = texture2D(diffuseMap, uv1);\n\t\tsprite2 = texture2D(diffuseMap, uv2);\n\t\tsprite3 = texture2D(diffuseMap, uv3);\n\t}\n\n\t// vec4 blendedColor = sprite1 * vSpritesWeight.x + sprite2 * vSpritesWeight.y + sprite3 * vSpritesWeight.z;\n\tfloat w1 = vSpritesWeight.x;\n\tfloat w2 = vSpritesWeight.y;\n\tfloat w3 = vSpritesWeight.z;\n\n\tw1 = pow(w1, octahedralWeightSharpness);\n\tw2 = pow(w2, octahedralWeightSharpness);\n\tw3 = pow(w3, octahedralWeightSharpness);\n\n\tfloat sumW = max(w1 + w2 + w3, 1e-6);\n\tw1 /= sumW;\n\tw2 /= sumW;\n\tw3 /= sumW;\n\n\tvec4 blendedColor = sprite1 * w1 + sprite2 * w2 + sprite3 * w3;\n\tif (blendedColor.a <= alphaClamp) discard;\n\n\t#ifndef EZ_TRANSPARENT\n\t\tblendedColor = vec4(vec3(blendedColor.rgb) / blendedColor.a, 1.0);\n\t#endif\n\toutColor = blendedColor;\n`;\n\nconst octahedral_normal_begin_frag = `\n\tvec2 roughnessMetalness;\n\tvec3 N = blendNormals(uv1, uv2, uv3, roughnessMetalness);\n\tvec3 geometryNormal = N;\n`;\n\nvertexShader = vertexShader.replace('#include <logdepthbuf_pars_vert>', `\n\t#include <logdepthbuf_pars_vert>\n\t${octahedral_pars_vert}\n`);\nvertexShader = vertexShader.replace('#include <pvm_vert>', `\n\t${octahedral_vertex}\n`);\n\nfragmentShader = fragmentShader.replace('#include <clippingPlanes_pars_frag>', `\n\t#include <clippingPlanes_pars_frag>\n\t${octahedral_pars_frag}\n`);\n\nfragmentShader = fragmentShader.replace('#include <diffuseMap_frag>', `\n\t${octahedral_map_frag}\n`);\n\nfragmentShader = fragmentShader.replace('#include <normal_frag>', `\n\t${octahedral_normal_begin_frag}\n`);\n\nfragmentShader = fragmentShader.replace('float roughnessFactor = u_Roughness;',\n\t'float roughnessFactor = roughnessMetalness.x;'\n);\n\nfragmentShader = fragmentShader.replace('float metalnessFactor = u_Metalness;',\n\t'float metalnessFactor = roughnessMetalness.y;'\n);\n\nexport class OctahedralImpostorDepthMaterial extends DepthMaterial {\n\n\tconstructor(sourceMaterial) {\n\t\tsuper();\n\n\t\tthis.type = MATERIAL_TYPE.SHADER;\n\n\t\tif (sourceMaterial) {\n\t\t\tthis.copy(sourceMaterial);\n\t\t}\n\n\t\tthis.shaderName = 'oct_impostor_depth';\n\n\t\tthis.vertexShader = depth_vert;\n\t\tthis.fragmentShader = depth_frag;\n\n\t\tthis.defines.EZ_USE_HEMI_OCTAHEDRON = true;\n\t\tthis.uniforms.impostorTransform = new Float32Array([\n\t\t\t1, 0, 0, 0,\n\t\t\t0, 1, 0, 0,\n\t\t\t0, 0, 1, 0,\n\t\t\t0, 0, 0, 1\n\t\t]);\n\n\t\tthis.uniforms.spritesPerSide = 32;\n\t\tthis.uniforms.alphaClamp = 0.3;\n\t}\n\n}\n\nlet depth_vert = ShaderLib.depth_vert;\n\nconst depth_frag = `\n\tuniform float spritesPerSide;\n\tuniform sampler2D diffuseMap;\n\tuniform mat4 u_ProjectionView;\n\tuniform float alphaClamp;\n\n\tflat varying vec2 vSprite1;\n\tflat varying vec2 vSprite2;\n\tflat varying vec2 vSprite3;\n\n\tvarying vec2 vSpriteUV1;\n\tvarying vec2 vSpriteUV2;\n\tvarying vec2 vSpriteUV3;\n\n\tflat varying vec4 vSpritesWeight;\n\n\tvec2 getUV(vec2 uv_f, vec2 frame, float frame_size) {\n\t\tuv_f = clamp(uv_f, vec2(0), vec2(1));\n\t\tvec2 uv_quad = frame_size * (frame + uv_f);\n\t\tuv_f =  frame_size * (frame + uv_f);\n\t\treturn clamp(uv_f, vec2(0), vec2(1));\n\t}\n\n\tconst float PackUpscale = 256. / 255.; // fraction -> 0..1 (including 1)\n\tconst float UnpackDownscale = 255. / 256.; // 0..1 -> fraction (excluding 1)\n\n\tconst vec3 PackFactors = vec3( 256. * 256. * 256., 256. * 256.,  256. );\n\tconst vec4 UnpackFactors = UnpackDownscale / vec4( PackFactors, 1. );\n\n\tconst float ShiftRight8 = 1. / 256.;\n\n\tvec4 packDepthToRGBA( const in float v ) {\n\t\tvec4 r = vec4( fract( v * PackFactors ), v );\n\t\tr.yzw -= r.xyz * ShiftRight8; // tidy overflow\n\t\treturn r * PackUpscale;\n\t}\n\n\tvoid main() {\n\t\tfloat spriteSize = 1.0 / spritesPerSide;\n\t\tvec2 uv1 = getUV(vSpriteUV1, vSprite1, spriteSize);\n\t\tfloat depth1 = texture2D(diffuseMap, uv1).a;\n\t\tif(depth1 <= alphaClamp) discard;\n\t\tgl_FragColor = packDepthToRGBA(gl_FragCoord.z);\n\t}\n`;\n\ndepth_vert = vertexShader.replace('#include <logdepthbuf_pars_vert>', `\n\t#include <logdepthbuf_pars_vert>\n\t${octahedral_pars_vert}\n`);\n\ndepth_vert = vertexShader.replace('#include <pvm_vert>', `\n\t${octahedral_vertex}\n`);\n"
  },
  {
    "path": "examples/jsm/impostor/OctahedralTextureGenerator.js",
    "content": "import {\n\tScene,\n\tTexture2D,\n\tPBRMaterial,\n\tShaderLib,\n\tSphere,\n\tCamera,\n\tOffscreenRenderTarget,\n\tATTACHMENT,\n\tTEXTURE_FILTER,\n\tMATERIAL_TYPE,\n\tVector2,\n\tVector3,\n\tMatrix4\n} from 't3d';\nimport { SceneUtils } from '../SceneUtils.js';\n\n// https://github.com/agargaro/octahedral-impostor\nclass OctahedralTextureGenerator {\n\n\t/**\n\t * Constructor of OctahedralTextureGenerator.\n\t * @param {number} [atlasSize = 4096] - The size of the atlas texture.\n\t * @param {number} [countPerSide = 16] - The number of sprites per side of the atlas.\n\t * @param {number} [cameraFactor = 1] - The factor to adjust the camera view size.\n\t * @param {boolean} [useHemiOctahedron = true] - Whether to use hemi-octahedron mapping.\n\t */\n\tconstructor(atlasSize = 2048, countPerSide = 16, cameraFactor = 1, useHemiOctahedron = true) {\n\t\tthis.countPerSide = countPerSide;\n\t\tthis.atlasSize = atlasSize;\n\t\tthis.cameraFactor = cameraFactor;\n\t\tthis.useHemiOctahedron = useHemiOctahedron;\n\n\t\tthis.countPerSideMinusOne = countPerSide - 1;\n\t\tthis.spriteSize = atlasSize / countPerSide;\n\n\t\tthis._renderTarget = OffscreenRenderTarget.create2D(atlasSize, atlasSize);\n\n\t\tthis._albedoTexture = this._renderTarget.texture;\n\t\tthis._albedoTexture.magFilter = TEXTURE_FILTER.LINEAR;\n\t\tthis._albedoTexture.minFilter = TEXTURE_FILTER.LINEAR_MIPMAP_LINEAR;\n\n\t\tthis._infoTexture = new Texture2D();\n\t\tthis._infoTexture.magFilter = TEXTURE_FILTER.NEAREST;\n\t\tthis._infoTexture.minFilter = TEXTURE_FILTER.NEAREST_MIPMAP_NEAREST;\n\t\tthis._renderTarget.attach(this._infoTexture, ATTACHMENT.COLOR_ATTACHMENT1);\n\n\t\tthis._camera = new Camera();\n\t\tthis._dummyScene = new Scene();\n\t}\n\n\trender(renderer, source) {\n\t\tthis._dummyScene.add(source);\n\t\tthis._dummyScene.updateMatrix(true);\n\n\t\tconst boundingBox = SceneUtils.setBox3FromObject(source);\n\t\tconst boundingSphere = new Sphere();\n\t\tboundingBox.getBoundingSphere(boundingSphere);\n\n\t\tthis._camera.setOrtho(\n\t\t\t-boundingSphere.radius, boundingSphere.radius, -boundingSphere.radius, boundingSphere.radius,\n\t\t\t0.00001, boundingSphere.radius * 2 + 0.00001\n\t\t);\n\n\t\tconst materialMap = new Map();\n\t\tconst renderOption = {\n\t\t\tgetMaterial: function(renderable) {\n\t\t\t\tif (materialMap.has(renderable.material)) {\n\t\t\t\t\treturn materialMap.get(renderable.material);\n\t\t\t\t} else {\n\t\t\t\t\tconst material = renderable.material;\n\t\t\t\t\tconst impostorMaterial = new OctahedralBakeMaterial(material);\n\t\t\t\t\tmaterialMap.set(material, impostorMaterial);\n\t\t\t\t\treturn impostorMaterial;\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\tthis._renderTarget.setColorClearValue(0, 0, 0, 1).setClear(false, false, false);\n\t\tfor (let row = 0; row < this.countPerSide; row++) {\n\t\t\tfor (let col = 0; col < this.countPerSide; col++) {\n\t\t\t\tthis._renderView(col, row, boundingSphere, renderer, renderOption);\n\t\t\t}\n\t\t}\n\n\t\tmaterialMap.forEach(mat => mat.dispose());\n\n\t\trenderer.generateMipmaps(this._albedoTexture);\n\t\trenderer.generateMipmaps(this._infoTexture);\n\n\t\tconst transform = new Matrix4();\n\t\tconst scale = boundingSphere.radius * 2;\n\t\ttransform.makeScale(scale, scale, scale).setPosition(boundingSphere.center);\n\n\t\treturn {\n\t\t\ttransform: transform,\n\t\t\talbedoTexture: this._albedoTexture,\n\t\t\tinfoTexture: this._infoTexture\n\t\t};\n\t}\n\n\t_renderView(col, row, sphere, renderer, renderOption) {\n\t\t_coords.set(col / (this.countPerSideMinusOne), row / (this.countPerSideMinusOne));\n\t\tif (this.useHemiOctahedron) {\n\t\t\themiOctaGridToDir(_coords, this._camera.position);\n\t\t} else {\n\t\t\toctaGridToDir(_coords, this._camera.position);\n\t\t}\n\n\t\tthis._camera.position.normalize().multiplyScalar(sphere.radius * this.cameraFactor).add(sphere.center);\n\t\tthis._camera.lookAt(sphere.center, new Vector3(0, 1, 0));\n\n\t    const xNorm = col / this.countPerSide;\n\t\tconst yNorm = row / this.countPerSide;\n\t\tconst wNorm = 1 / this.countPerSide;\n\t\tconst hNorm = 1 / this.countPerSide;\n\n\t\tthis._camera.rect.set(xNorm, yNorm, xNorm + wNorm, yNorm + hNorm);\n\t\tthis._camera.updateMatrix();\n\n\t\tthis._dummyScene.updateRenderStates(this._camera);\n\t\tthis._dummyScene.updateRenderQueue(this._camera);\n\n\t\trenderer.renderScene(this._dummyScene, this._camera, this._renderTarget, renderOption);\n\t}\n\n}\n\nconst _coords = new Vector2();\n\nfunction hemiOctaGridToDir(grid, target = new Vector3()) {\n\ttarget.set(grid.x - grid.y, 0, -1 + grid.x + grid.y);\n\ttarget.y = 1 - Math.abs(target.x) - Math.abs(target.z);\n\treturn target;\n}\n\nconst absolute = new Vector3();\nfunction octaGridToDir(grid, target = new Vector3()) {\n\ttarget.set(2 * (grid.x - 0.5), 0, 2 * (grid.y - 0.5));\n\tabsolute.set(Math.abs(target.x), 0, Math.abs(target.z));\n\ttarget.y = 1 - absolute.x - absolute.z;\n\n\tif (target.y < 0) {\n\t\ttarget.x = Math.sign(target.x) * (1 - absolute.z);\n\t\ttarget.z = Math.sign(target.z) * (1 - absolute.x);\n\t}\n\n\treturn target;\n}\n\nclass OctahedralBakeMaterial extends PBRMaterial {\n\n\tconstructor(sourceMaterial) {\n\t\tsuper();\n\n\t\tthis.type = MATERIAL_TYPE.SHADER;\n\n\t\tif (sourceMaterial) {\n\t\t\tthis.copy(sourceMaterial);\n\t\t}\n\n\t\tthis.shaderName = 'oct_bake';\n\n\t\tthis.vertexShader = ShaderLib.pbr_vert;\n\t\tthis.fragmentShader = octahedral_impostor_frag;\n\t}\n\n}\n\nconst octahedral_impostor_frag = `\n\t#extension GL_EXT_draw_buffers : require\n\t#include <common_frag>\n\n\tuniform float u_Metalness;\n\t#ifdef USE_METALNESSMAP\n\t\tuniform sampler2D metalnessMap;\n\t#endif\n\n\tuniform float u_Roughness;\n\t#ifdef USE_ROUGHNESSMAP\n\t\tuniform sampler2D roughnessMap;\n\t#endif\n\n\tuniform vec3 emissive;\n\n\t#include <uv_pars_frag>\n\t#include <color_pars_frag>\n\t#include <diffuseMap_pars_frag>\n\t#include <alphamap_pars_frag>\n\t#include <alphaTest_pars_frag>\n\t#include <normalMap_pars_frag>\n\t#include <aoMap_pars_frag>\n\t#include <normal_pars_frag>\n\t#include <clearcoat_pars_frag>\n\t#include <modelPos_pars_frag>\n\t#include <emissiveMap_pars_frag>\n\t#include <logdepthbuf_pars_frag>\n\t#include <clippingPlanes_pars_frag>\n\n\tvec2 unitVectorToOctahedron(vec3 v) {\n\t\tvec2 up = v.xz / dot(vec3(1.0), abs(v));\n\t\tvec2 down = (1.0 - abs(up.yx)) * sign(up.xy);\n\t\treturn mix(up, down, step(0.0, -v.y));\n\t}\n\n\tvoid main() {\n\t\t#include <clippingPlanes_frag>\n\t\t#include <logdepthbuf_frag>\n\t\t#include <begin_frag>\n\t\t#include <color_frag>\n\t\t#include <diffuseMap_frag>\n\t\t#include <alphamap_frag>\n\t\t#include <alphaTest_frag>\n\t\t#include <normal_frag>\n\n\t\tvec4 info = vec4(.0) ;\n\t\tinfo.rg = unitVectorToOctahedron(N) * 0.5 + 0.5;\n\t\tfloat roughnessFactor = u_Roughness;\n\t\t#ifdef USE_ROUGHNESSMAP\n\t\t\tvec4 texelRoughness = texture2D(roughnessMap, v_Uv);\n\t\t\t// reads channel G, compatible with a combined OcclusionRoughnessMetallic (RGB) texture\n\t\t\troughnessFactor *= texelRoughness.g;\n\t\t#endif\n\n\t\tfloat metalnessFactor = u_Metalness;\n\t\t#ifdef USE_METALNESSMAP\n\t\t\tvec4 texelMetalness = texture2D(metalnessMap, v_Uv);\n\t\t\t// reads channel B, compatible with a combined OcclusionRoughnessMetallic (RGB) texture\n\t\t\tmetalnessFactor *= texelMetalness.b;\n\t\t#endif\n\t\tinfo.ba = vec2(metalnessFactor, roughnessFactor);\n\n\t\tgl_FragData[0] = outColor;\n\t\tgl_FragData[1] = info;\n\t}\n`;\n\nexport { OctahedralTextureGenerator, OctahedralBakeMaterial };"
  },
  {
    "path": "examples/jsm/lights/LightShadowAdapter.js",
    "content": "import { Box3, Matrix3, Matrix4, Plane, Spherical, Vector3, Vector2 } from 't3d';\nimport { OBB } from '../math/OBB.js';\n\n/**\n * LightShadowAdapter is a tool to help you calculate the shadow range of the light source.\n * It can automatically calculate the shadow range based on the bounding box of the object and the camera,\n * and update the light source and shadow range in real time.\n */\nexport class LightShadowAdapter {\n\n\t/**\n\t * Create a LightShadowAdapter instance.\n\t * @param {DirectionalLight} light - The light source to be adapted.\n\t */\n\tconstructor(light) {\n\t\tthis.light = light;\n\n\t\t// The direction of the light source, which is used to calculate the position of the light source.\n\t\tthis.direction = new LightDirection();\n\t\t// Whether to automatically correct the up direction of the light source to keep the y+ direction of the shadow map always facing the camera far away.\n\t\t// This is only valid when the bindCamera is not empty.\n\t\tthis.autoCorrectUp = true;\n\t\t// If autoCorrectUp is false, you can set the up direction of the light source manually,\n\t\t// which is used to calculate the orientation of the light source.\n\t\tthis.up = new Vector3(0, 1, 0);\n\n\t\t// The oriented bounding box of the object to be adapted.\n\t\tthis.bindBox = new OBB();\n\n\t\t// The camera to be adapted.\n\t\tthis.bindCamera = null;\n\t\t// The distance from the camera to the shadow range.\n\t\t// When bindBox is not empty, the distance starts from the nearest point of the bounding box to the camera near plane.\n\t\tthis.bindCameraDistance = 500;\n\n\t\t// In most cases, the shadow range should just wrap the object, so the default shadow range calculation function is like this.\n\t\t// But in some specific scenarios, we want the shadow range to be larger,\n\t\t// such as wanting objects outside the camera to cast shadows,\n\t\t// then you need to customize the shadow range calculation function\n\t\tthis.shadowSizeFunction = function(size) { return size * 1.05 };\n\t\tthis.shadowDepthFunction = function(depth, size) { return Math.max(depth * 1.1, size * 0.8) };\n\t\tthis.shadowNearFunction = function(depth) { return depth * 0.1 };\n\n\t\t// The center offset factor of the shadow range to thinShadowBox.\n\t\t// If set to (0, 0), the shadow box center will be the same as the thinShadowBox center.\n\t\tthis.shadowOffsetFactor = new Vector2(0.5, 0.25);\n\n\t\tthis._polygonPool = new PolygonPool();\n\n\t\t// Some stats for debugging\n\t\tthis.stats = {\n\t\t\ttype: 0, // 1: box + camera, 2: box, 3: camera, 4: null\n\t\t\tbindBoxRotated: false,\n\t\t\tbindAABB: new Box3(),\n\t\t\tbindAABBTransform: new Matrix4(),\n\t\t\tlightUp: new Vector3(),\n\t\t\tshadowBox: new Box3(),\n\t\t\tthinShadowBox: new Box3().copy(UNIT_BOX3),\n\t\t\tshadowBoxRotation: new Matrix3(),\n\t\t\tshadowBoxRotationInverse: new Matrix3(),\n\t\t\tboundaryPoints: [], // when type is 2 or 3\n\t\t\tpolygons: new Polygons(this._polygonPool) // when type is 1\n\t\t};\n\n\t\t// fill boundaryPoints with Vector3\n\t\tfor (let i = 0; i < 8; i++) {\n\t\t\tthis.stats.boundaryPoints.push(new Vector3());\n\t\t}\n\t}\n\n\tupdate() {\n\t\tthis._setUpdateType();\n\n\t\tthis._setShadowBoxRotation();\n\n\t\tconst { type, thinShadowBox } = this.stats;\n\n\t\tif (type === SHADOW_UPDATE_TYPE.BOX_CAMERA) {\n\t\t\tthis._setShadowBoxByBoxCamera();\n\t\t} else if (type === SHADOW_UPDATE_TYPE.BOX) {\n\t\t\tthis._setShadowBoxByBox();\n\t\t} else if (type === SHADOW_UPDATE_TYPE.CAMERA) {\n\t\t\tthis._setShadowBoxByCamera();\n\t\t} else {\n\t\t\tthinShadowBox.copy(UNIT_BOX3);\n\t\t}\n\n\t\tthis._updateLight();\n\t}\n\n\t_setUpdateType() {\n\t\tconst { bindBox, bindCamera, stats } = this;\n\n\t\tconst hasBindBox = !bindBox.isEmpty();\n\t\tconst hasBindCamera = !!bindCamera;\n\t\tconst bindBoxRotated = !bindBox.rotation.isIdentity();\n\n\t\tif (hasBindBox && hasBindCamera) {\n\t\t\tstats.type = SHADOW_UPDATE_TYPE.BOX_CAMERA;\n\t\t} else if (hasBindBox) {\n\t\t\tstats.type = SHADOW_UPDATE_TYPE.BOX;\n\t\t} else if (hasBindCamera) {\n\t\t\tstats.type = SHADOW_UPDATE_TYPE.CAMERA;\n\t\t} else {\n\t\t\tstats.type = SHADOW_UPDATE_TYPE.NULL;\n\t\t}\n\n\t\tstats.bindBoxRotated = bindBoxRotated;\n\n\t\tif (!hasBindBox) {\n\t\t\tstats.bindAABB.makeEmpty();\n\t\t\tstats.bindAABBTransform.identity();\n\t\t} else if (bindBoxRotated) {\n\t\t\tbindBox.toBoundingBoxAndTransform(stats.bindAABB, stats.bindAABBTransform);\n\t\t} else {\n\t\t\tstats.bindAABB.max.copy(bindBox.center).add(bindBox.halfSize);\n\t\t\tstats.bindAABB.min.copy(bindBox.center).sub(bindBox.halfSize);\n\t\t\tstats.bindAABBTransform.identity();\n\t\t}\n\t}\n\n\t_setShadowBoxRotation() {\n\t\tconst { direction, autoCorrectUp, up, bindCamera, stats } = this;\n\t\tconst { lightUp, shadowBoxRotation, shadowBoxRotationInverse } = stats;\n\n\t\tif (autoCorrectUp && !!bindCamera) {\n\t\t\t_vec3_1.setFromMatrixColumn(bindCamera.worldMatrix, 0).normalize();\n\t\t\t_vec3_2.copy(direction).normalize();\n\t\t\tlightUp.crossVectors(_vec3_2, _vec3_1);\n\t\t} else {\n\t\t\tlightUp.copy(up);\n\t\t}\n\t\tlightUp.normalize();\n\n\t\t_vec3_1.copy(direction).normalize().negate().toArray(shadowBoxRotation.elements, 6); // axis-z\n\t\t_vec3_2.crossVectors(lightUp, _vec3_1).normalize().toArray(shadowBoxRotation.elements, 0); // axis-x\n\t\t_vec3_1.cross(_vec3_2).toArray(shadowBoxRotation.elements, 3); // axis-y\n\t\tshadowBoxRotationInverse.copy(shadowBoxRotation).invert();\n\t}\n\n\t_setShadowBoxByBoxCamera() {\n\t\tconst { bindBox, bindCamera, bindCameraDistance, stats, _polygonPool } = this;\n\t\tconst { bindBoxRotated, bindAABB, thinShadowBox, shadowBoxRotationInverse, boundaryPoints, polygons } = stats;\n\n\t\tconst frustumIntersectsBox = bindBoxRotated ? bindBox.intersectsFrustum(bindCamera.frustum) : bindCamera.frustum.intersectsBox(bindAABB);\n\n\t\tif (!frustumIntersectsBox) return;\n\n\t\t// Reset polygons\n\t\t_polygonPool.reset();\n\t\tpolygons.clear();\n\n\t\t// Set the polygons by box\n\t\tconst points = bindBoxRotated ? bindBox.getPoints(boundaryPoints) : bindAABB.getPoints(boundaryPoints);\n\t\tpolygons.setFromBoxPoints(points);\n\n\t\t// Clip the polygons using the frustum (not including the near and far planes)\n\t\tconst frustumPlanes = bindCamera.frustum.planes;\n\t\tfor (let i = 0, l = frustumPlanes.length - 2; i < l; i++) {\n\t\t\tconst plane = frustumPlanes[i];\n\t\t\tpolygons.clipByPlane(plane);\n\t\t}\n\n\t\tconst cameraInsideBox = bindBox.containsPoint(_vec3_1.setFromMatrixPosition(bindCamera.worldMatrix));\n\t\tconst { near } = extractCameraNearFar(bindCamera);\n\n\t\tlet minZ = cameraInsideBox ? near : -Infinity;\n\t\tif (!cameraInsideBox) {\n\t\t\t// Convert the intersection point to view space and find the closest intersection point to the camera\n\t\t\tpolygons.polygons.forEach(polygon => {\n\t\t\t\tfor (let i = 0, l = polygon.verticesIndex; i < l; i++) {\n\t\t\t\t\t_vec3_1.copy(polygon.vertices[i]).applyMatrix4(bindCamera.viewMatrix);\n\t\t\t\t\tminZ = Math.max(minZ, _vec3_1.z);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tminZ = Math.max(Math.abs(minZ), near);\n\t\t}\n\n\t\t// Based on the nearest intersection point of the near plane,\n\t\t// push back the length of distance, determine the position of the far plane,\n\t\t// and convert the far plane to the world coordinate system.\n\t\t_plane_1.constant = minZ + bindCameraDistance;\n\t\t_plane_1.normal.set(0, 0, 1);\n\t\t_plane_1.applyMatrix4(bindCamera.worldMatrix);\n\n\t\t// Using the far plane determined in the previous step, cut the curPolygons.\n\t\tpolygons.clipByPlane(_plane_1);\n\n\t\t// Calculate shadow box by polygon vertices\n\t\tthinShadowBox.makeEmpty();\n\t\tpolygons.polygons.forEach(polygon => {\n\t\t\tfor (let i = 0, l = polygon.verticesIndex; i < l; i++) {\n\t\t\t\t_vec3_1.copy(polygon.vertices[i]).applyMatrix3(shadowBoxRotationInverse);\n\t\t\t\tthinShadowBox.expandByPoint(_vec3_1);\n\t\t\t}\n\t\t});\n\n\t\t// Polygons.clipByPlane does not add new polygon for the newly generated sections,\n\t\t// so when the camera is inside the bind box, result will be incorrect.\n\t\t// The current solution is to extend shadow box by the camera's near plane vertices.\n\t\tif (cameraInsideBox) {\n\t\t\tclipVertices.near.forEach(v => {\n\t\t\t\t_vec3_1.copy(v).unproject(bindCamera).applyMatrix3(shadowBoxRotationInverse);\n\t\t\t\tthinShadowBox.expandByPoint(_vec3_1);\n\t\t\t});\n\t\t}\n\t}\n\n\t_setShadowBoxByBox() {\n\t\tconst { bindBox, stats } = this;\n\t\tconst { bindBoxRotated, bindAABB, thinShadowBox, shadowBoxRotationInverse, boundaryPoints } = stats;\n\n\t\tconst points = bindBoxRotated ? bindBox.getPoints(boundaryPoints) : bindAABB.getPoints(boundaryPoints);\n\n\t\tthinShadowBox.makeEmpty();\n\t\tpoints.forEach(point => {\n\t\t\t_vec3_1.copy(point).applyMatrix3(shadowBoxRotationInverse);\n\t\t\tthinShadowBox.expandByPoint(_vec3_1);\n\t\t});\n\t}\n\n\t_setShadowBoxByCamera() {\n\t\tconst { bindCamera, bindCameraDistance, stats } = this;\n\t\tconst { thinShadowBox, shadowBoxRotationInverse, boundaryPoints } = stats;\n\n\t\tconst { near, far } = extractCameraNearFar(bindCamera);\n\n\t\t// Get the vertices of the frustum in view space, considering the bindCameraDistance\n\t\tgetClipedViewVertices(bindCamera, near, Math.min(near + bindCameraDistance, far), boundaryPoints);\n\n\t\t// Convert vertices to world space\n\t\tboundaryPoints.forEach(point => point.applyMatrix4(bindCamera.worldMatrix));\n\n\t\tthinShadowBox.makeEmpty();\n\t\tboundaryPoints.forEach(point => {\n\t\t\t_vec3_1.copy(point).applyMatrix3(shadowBoxRotationInverse);\n\t\t\tthinShadowBox.expandByPoint(_vec3_1);\n\t\t});\n\t}\n\n\t_updateLight() {\n\t\tconst { light, direction, shadowSizeFunction, shadowDepthFunction, shadowNearFunction, shadowOffsetFactor, stats } = this;\n\t\tconst { lightUp, shadowBox, thinShadowBox, shadowBoxRotation } = stats;\n\n\t\tconst boxCenter = thinShadowBox.getCenter(_vec3_1);\n\t\tconst boxSize = thinShadowBox.getSize(_vec3_2);\n\n\t\tconst shadowSize = shadowSizeFunction(Math.max(boxSize.x, boxSize.y));\n\t\tconst shadowDepth = shadowDepthFunction(boxSize.z, shadowSize);\n\t\tconst shadowNear = shadowNearFunction(shadowDepth);\n\n\t\tconst { min, max } = shadowBox;\n\n\t\tmin.x = boxCenter.x - shadowSize * 0.5;\n\t\tmax.x = boxCenter.x + shadowSize * 0.5;\n\t\tmin.y = boxCenter.y - shadowSize * 0.5;\n\t\tmax.y = boxCenter.y + shadowSize * 0.5;\n\t\tmin.z = boxCenter.z - shadowDepth * 0.5;\n\t\tmax.z = boxCenter.z + shadowDepth * 0.5;\n\n\t\tif (shadowOffsetFactor.x > 0) {\n\t\t\tconst maxOffsetY = (shadowSize - boxSize.y) * 0.5;\n\t\t\tmin.y += maxOffsetY * shadowOffsetFactor.x;\n\t\t\tmax.y += maxOffsetY * shadowOffsetFactor.x;\n\t\t}\n\n\t\tif (shadowOffsetFactor.y > 0) {\n\t\t\tconst maxOffsetZ = (shadowDepth - boxSize.z) * 0.5;\n\t\t\tmin.z += maxOffsetZ * shadowOffsetFactor.y;\n\t\t\tmax.z += maxOffsetZ * shadowOffsetFactor.y;\n\t\t}\n\n\t\t// light shadow range\n\t\tlight.shadow.windowSize = shadowSize;\n\t\tlight.shadow.cameraNear = shadowNear;\n\t\tlight.shadow.cameraFar = shadowNear + shadowDepth;\n\n\t\t// light position\n\t\tshadowBox.getCenter(light.position);\n\t\tlight.position.z = min.z - shadowNear;\n\t\tlight.position.applyMatrix3(shadowBoxRotation);\n\n\t\t// light rotation\n\t\tconst target = _vec3_1.copy(light.position).sub(direction);\n\t\tlight.lookAt(target, lightUp);\n\t}\n\n}\n\nconst _vec3_1 = new Vector3();\nconst _vec3_2 = new Vector3();\nconst _plane_1 = new Plane();\n\nconst EPSILON = 1e-5;\nconst UNIT_BOX3 = new Box3(new Vector3(-0.5, -0.5, -0.5), new Vector3(0.5, 0.5, 0.5));\n\nconst SHADOW_UPDATE_TYPE = {\n\tBOX_CAMERA: 1,\n\tBOX: 2,\n\tCAMERA: 3,\n\tNULL: 4\n};\n\nfunction isPerspectiveMatrix(m) {\n\treturn m.elements[11] === -1.0;\n}\n\nconst frustumNearFar = { near: 0, far: 0 };\n\nfunction extractCameraNearFar(camera) {\n\tconst projectionMatrix = camera.projectionMatrix;\n\tif (isPerspectiveMatrix(projectionMatrix)) {\n\t\tfrustumNearFar.near = projectionMatrix.elements[14] / (projectionMatrix.elements[10] - 1);\n\t\tfrustumNearFar.far = projectionMatrix.elements[14] / (projectionMatrix.elements[10] + 1);\n\t} else {\n\t\tfrustumNearFar.near = (projectionMatrix.elements[14] + 1) / projectionMatrix.elements[10];\n\t\tfrustumNearFar.far = (projectionMatrix.elements[14] - 1) / projectionMatrix.elements[10];\n\t}\n\treturn frustumNearFar;\n}\n\n// LightDirection class\n\nconst _spherical = new Spherical();\n\nclass LightDirection extends Vector3 {\n\n\tsetFromSphericalAngles(phi, theta) {\n\t\t_spherical.phi = phi;\n\t\t_spherical.theta = theta;\n\t\t_spherical.radius = 1; // normalize\n\n\t\tthis.setFromSpherical(_spherical);\n\t}\n\n}\n\n// 3 --- 0  clipVertices.near/far order\n// |     |\n// 2 --- 1\n// clip space spans from [-1, 1]\n\nconst clipVertices = {\n\tnear: [\n\t\tnew Vector3(1, 1, -1),\n\t\tnew Vector3(1, -1, -1),\n\t\tnew Vector3(-1, -1, -1),\n\t\tnew Vector3(-1, 1, -1)\n\t],\n\tfar: [\n\t\tnew Vector3(1, 1, 1),\n\t\tnew Vector3(1, -1, 1),\n\t\tnew Vector3(-1, -1, 1),\n\t\tnew Vector3(-1, 1, 1)\n\t]\n};\n\nfunction getClipedViewVertices(camera, clipNear, clipFar, points) {\n\tconst projectionMatrix = camera.projectionMatrix;\n\tconst projectionMatrixInverse = camera.projectionMatrixInverse;\n\tconst isOrthographic = projectionMatrix.elements[2 * 4 + 3] === 0;\n\n\tclipVertices.near.forEach((v, i) => {\n\t\tconst point = points[i];\n\n\t\tpoint.copy(v).applyMatrix4(projectionMatrixInverse);\n\n\t\tconst absZ = Math.abs(point.z);\n\t\tif (isOrthographic) {\n\t\t\tpoint.z *= Math.min(clipNear / absZ, 1.0);\n\t\t} else {\n\t\t\tpoint.multiplyScalar(Math.min(clipNear / absZ, 1.0));\n\t\t}\n\t});\n\n\tclipVertices.far.forEach((v, i) => {\n\t\tconst point = points[4 + i];\n\n\t\tpoint.copy(v).applyMatrix4(projectionMatrixInverse);\n\n\t\tconst absZ = Math.abs(point.z);\n\t\tif (isOrthographic) {\n\t\t\tpoint.z *= Math.min(clipFar / absZ, 1.0);\n\t\t} else {\n\t\t\tpoint.multiplyScalar(Math.min(clipFar / absZ, 1.0));\n\t\t}\n\t});\n\n\treturn points;\n}\n\n// Polygon classes\n\nclass Polygons {\n\n\tconstructor(pool) {\n\t\tthis.polygons = [];\n\n\t\tthis._pool = pool;\n\t\tthis._tempPolygons = [];\n\t}\n\n\tclear() {\n\t\tthis.polygons.length = 0;\n\t}\n\n\tsetFromBoxPoints(points) {\n\t\tconst { polygons, _pool } = this;\n\n\t\tpolygons[0] = _pool.allocate().begin().pushVertex(points[0]).pushVertex(points[1]).pushVertex(points[2]).pushVertex(points[3]).end();\n\t\tpolygons[1] = _pool.allocate().begin().pushVertex(points[4]).pushVertex(points[7]).pushVertex(points[6]).pushVertex(points[5]).end();\n\t\tpolygons[2] = _pool.allocate().begin().pushVertex(points[0]).pushVertex(points[3]).pushVertex(points[7]).pushVertex(points[4]).end();\n\t\tpolygons[3] = _pool.allocate().begin().pushVertex(points[1]).pushVertex(points[2]).pushVertex(points[6]).pushVertex(points[5]).end();\n\t\tpolygons[4] = _pool.allocate().begin().pushVertex(points[0]).pushVertex(points[4]).pushVertex(points[5]).pushVertex(points[1]).end();\n\t\tpolygons[5] = _pool.allocate().begin().pushVertex(points[3]).pushVertex(points[7]).pushVertex(points[6]).pushVertex(points[2]).end();\n\t}\n\n\tclipByPlane(plane) {\n\t\tfor (const polygon of this.polygons) {\n\t\t\tsplitPolygon(plane, polygon, this._tempPolygons, this._pool);\n\t\t}\n\n\t\tthis.polygons = this._tempPolygons;\n\t\tthis._tempPolygons = [];\n\t}\n\n}\n\nconst COPLANAR = 0;\nconst FRONT = 1;\nconst BACK = 2;\nconst SPANNING = 3;\n\nconst types = [];\n\nfunction splitPolygon(plane, polygon, outPolygons, pool) {\n\t// Classify each point as well as the entire polygon into one of the above\n\t// four classes.\n\tlet polygonType = 0;\n\ttypes.length = 0;\n\n\tfor (let i = 0; i < polygon.verticesIndex; i++) {\n\t\tconst t = plane.normal.dot(polygon.vertices[i]) + plane.constant;\n\t\tconst type = t < -EPSILON ? BACK : t > EPSILON ? FRONT : COPLANAR;\n\t\tpolygonType |= type;\n\t\ttypes.push(type);\n\t}\n\n\t// Put the polygon in the correct list, splitting it when necessary.\n\tswitch (polygonType) {\n\t\tcase COPLANAR:\n\t\t\tif (plane.normal.dot(polygon.plane.normal) > 0) {\n\t\t\t\toutPolygons.push(polygon);\n\t\t\t}\n\t\t\tbreak;\n\t\tcase FRONT:\n\t\t\toutPolygons.push(polygon);\n\t\t\tbreak;\n\t\tcase SPANNING: {\n\t\t\tconst _polygon = pool.allocate();\n\t\t\t_polygon.begin();\n\n\t\t\tfor (let i = 0; i < polygon.verticesIndex; i++) {\n\t\t\t\tconst j = (i + 1) % polygon.verticesIndex;\n\n\t\t\t\tconst ti = types[i],\n\t\t\t\t\ttj = types[j];\n\t\t\t\tconst vi = polygon.vertices[i],\n\t\t\t\t\tvj = polygon.vertices[j];\n\n\t\t\t\tif (ti != BACK) _polygon.pushVertex(vi);\n\t\t\t\tif ((ti | tj) == SPANNING) {\n\t\t\t\t\tconst t = -(plane.constant + plane.normal.dot(vi)) / plane.normal.dot(_vec3_1.copy(vj).sub(vi));\n\t\t\t\t\tconst v = _vec3_1.lerpVectors(vi, vj, t);\n\n\t\t\t\t\t_polygon.pushVertex(v);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (_polygon.verticesIndex >= 3) {\n\t\t\t\t_polygon.end();\n\t\t\t\toutPolygons.push(_polygon);\n\t\t\t} else {\n\t\t\t\tpool.deallocate();\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tdefault:\n\t\t\tbreak;\n\t}\n}\n\nclass PolygonPool {\n\n\tconstructor() {\n\t\tthis.polygons = [];\n\t\tthis.headIndex = 0;\n\t}\n\n\tallocate() {\n\t\tlet polygon = this.polygons[this.headIndex];\n\n\t\tif (!polygon) {\n\t\t\tpolygon = new Polygon();\n\t\t\tthis.polygons[this.headIndex] = polygon;\n\t\t}\n\n\t\tthis.headIndex++;\n\n\t\treturn polygon;\n\t}\n\n\tdeallocate() {\n\t\tthis.headIndex--;\n\t}\n\n\treset() {\n\t\tthis.headIndex = 0;\n\t}\n\n}\n\nclass Polygon {\n\n\tconstructor() {\n\t\tthis.plane = new Plane();\n\t\tthis.vertices = [];\n\t\tthis.verticesIndex = 0;\n\t}\n\n\tbegin() {\n\t\tthis.verticesIndex = 0;\n\t\treturn this;\n\t}\n\n\tpushVertex(vector3) {\n\t\tlet vertex = this.vertices[this.verticesIndex];\n\n\t\tif (!vertex) {\n\t\t\tvertex = new Vector3();\n\t\t\tthis.vertices[this.verticesIndex] = vertex;\n\t\t}\n\n\t\tvertex.copy(vector3);\n\t\tthis.verticesIndex++;\n\n\t\treturn this;\n\t}\n\n\tend() {\n\t\tconst plane = this.plane;\n\t\tconst vertices = this.vertices;\n\n\t\tplane.normal.copy(vertices[1]).sub(vertices[0]).cross(_vec3_1.copy(vertices[2]).sub(vertices[0])).normalize();\n\t\tplane.constant = plane.normal.dot(vertices[0]);\n\n\t\treturn this;\n\t}\n\n}"
  },
  {
    "path": "examples/jsm/lights/RectAreaLightLTC.js",
    "content": "import {\n\tTexture2D,\n\tTEXTURE_WRAP,\n\tTEXTURE_FILTER,\n\tPIXEL_FORMAT,\n\tPIXEL_TYPE\n} from 't3d';\n\n// Real-Time Polygonal-Light Shading with Linearly Transformed Cosines\n// by Eric Heitz, Jonathan Dupuy, Stephen Hill and David Neubelt\n// code: https://github.com/selfshadow/ltc_code/\n\n/**\n * LTC (Linearly Transformed Cosines) Textures for real-time RectAreaLight.\n *\n * NOTE: This is a temporary location for the BRDF approximation texture data\n *       based off of Eric Heitz's work (see citation below).  BRDF data for\n *       RectAreaLight is currently approximated using a precomputed texture\n *       of roughly 80kb in size.  The hope is to find a better way to include\n *       the large texture data before including the full RectAreaLight implementation\n *       in the main build files.\n *\n * TODO: figure out a way to compress the LTC BRDF data\n */\nclass RectAreaLightLTC {\n\n\tstatic getLTC1() {\n\t\t// source: https://github.com/selfshadow/ltc_code/tree/master/fit/results/ltc.js\n\t\tconst LTC_MAT_1 = [1, 0, 0, 2e-05, 1, 0, 0, 0.000503905, 1, 0, 0, 0.00201562, 1, 0, 0, 0.00453516, 1, 0, 0, 0.00806253, 1, 0, 0, 0.0125978, 1, 0, 0, 0.018141, 1, 0, 0, 0.0246924, 1, 0, 0, 0.0322525, 1, 0, 0, 0.0408213, 1, 0, 0, 0.0503999, 1, 0, 0, 0.0609894, 1, 0, 0, 0.0725906, 1, 0, 0, 0.0852058, 1, 0, 0, 0.0988363, 1, 0, 0, 0.113484, 1, 0, 0, 0.129153, 1, 0, 0, 0.145839, 1, 0, 0, 0.163548, 1, 0, 0, 0.182266, 1, 0, 0, 0.201942, 1, 0, 0, 0.222314, 1, 0, 0, 0.241906, 1, 0, 0, 0.262314, 1, 0, 0, 0.285754, 1, 0, 0, 0.310159, 1, 0, 0, 0.335426, 1, 0, 0, 0.361341, 1, 0, 0, 0.387445, 1, 0, 0, 0.412784, 1, 0, 0, 0.438197, 1, 0, 0, 0.466966, 1, 0, 0, 0.49559, 1, 0, 0, 0.523448, 1, 0, 0, 0.549938, 1, 0, 0, 0.57979, 1, 0, 0, 0.608746, 1, 0, 0, 0.636185, 1, 0, 0, 0.664748, 1, 0, 0, 0.69313, 1, 0, 0, 0.71966, 1, 0, 0, 0.747662, 1, 0, 0, 0.774023, 1, 0, 0, 0.799775, 1, 0, 0, 0.825274, 1, 0, 0, 0.849156, 1, 0, 0, 0.873248, 1, 0, 0, 0.89532, 1, 0, 0, 0.917565, 1, 0, 0, 0.937863, 1, 0, 0, 0.958139, 1, 0, 0, 0.976563, 1, 0, 0, 0.994658, 1, 0, 0, 1.0112, 1, 0, 0, 1.02712, 1, 0, 0, 1.04189, 1, 0, 0, 1.05568, 1, 0, 0, 1.06877, 1, 0, 0, 1.08058, 1, 0, 0, 1.09194, 1, 0, 0, 1.10191, 1, 0, 0, 1.11161, 1, 0, 0, 1.1199, 1, 0, 0, 1.12813, 0.999547, -4.48815e-07, 0.0224417, 1.99902e-05, 0.999495, -1.13079e-05, 0.0224406, 0.000503651, 0.999496, -4.52317e-05, 0.0224406, 0.00201461, 0.999496, -0.000101772, 0.0224406, 0.00453287, 0.999495, -0.000180928, 0.0224406, 0.00805845, 0.999497, -0.000282702, 0.0224406, 0.0125914, 0.999496, -0.000407096, 0.0224406, 0.0181319, 0.999498, -0.000554114, 0.0224406, 0.02468, 0.999499, -0.000723768, 0.0224406, 0.0322363, 0.999495, -0.000916058, 0.0224405, 0.0408009, 0.999499, -0.00113101, 0.0224408, 0.050375, 0.999494, -0.00136863, 0.0224405, 0.0609586, 0.999489, -0.00162896, 0.0224401, 0.0725537, 0.999489, -0.00191201, 0.0224414, 0.0851619, 0.999498, -0.00221787, 0.0224413, 0.0987867, 0.999492, -0.00254642, 0.0224409, 0.113426, 0.999507, -0.00289779, 0.0224417, 0.129088, 0.999494, -0.0032716, 0.0224386, 0.145767, 0.999546, -0.0036673, 0.0224424, 0.163472, 0.999543, -0.00408166, 0.0224387, 0.182182, 0.999499, -0.00450056, 0.0224338, 0.201843, 0.999503, -0.00483661, 0.0224203, 0.222198, 0.999546, -0.00452928, 0.022315, 0.241714, 0.999508, -0.00587403, 0.0224329, 0.262184, 0.999509, -0.00638806, 0.0224271, 0.285609, 0.999501, -0.00691028, 0.0224166, 0.309998, 0.999539, -0.00741979, 0.0223989, 0.335262, 0.999454, -0.00786282, 0.0223675, 0.361154, 0.999529, -0.00811928, 0.0222828, 0.387224, 0.999503, -0.00799941, 0.0221063, 0.41252, 0.999561, -0.00952753, 0.0223057, 0.438006, 0.999557, -0.0099134, 0.0222065, 0.466735, 0.999541, -0.0100935, 0.0220402, 0.495332, 0.999562, -0.00996821, 0.0218067, 0.523197, 0.999556, -0.0105031, 0.0217096, 0.550223, 0.999561, -0.0114191, 0.0217215, 0.579498, 0.999588, -0.0111818, 0.0213357, 0.608416, 0.999633, -0.0107725, 0.0208689, 0.635965, 0.999527, -0.0121671, 0.0210149, 0.664476, 0.999508, -0.0116005, 0.020431, 0.692786, 0.999568, -0.0115604, 0.0199791, 0.719709, 0.999671, -0.0121117, 0.0197415, 0.74737, 0.999688, -0.0110769, 0.0188846, 0.773692, 0.99962, -0.0122368, 0.0188452, 0.799534, 0.999823, -0.0110325, 0.0178001, 0.825046, 0.999599, -0.0114923, 0.0174221, 0.849075, 0.999619, -0.0105923, 0.0164345, 0.872999, 0.999613, -0.0105988, 0.0158227, 0.895371, 0.99964, -0.00979861, 0.0148131, 0.917364, 0.99977, -0.00967238, 0.0140721, 0.938002, 0.999726, -0.00869175, 0.0129543, 0.957917, 0.99973, -0.00866872, 0.0122329, 0.976557, 0.999773, -0.00731956, 0.0108958, 0.994459, 0.999811, -0.00756027, 0.0102715, 1.01118, 0.999862, -0.00583732, 0.00878781, 1.02701, 0.999835, -0.00631438, 0.00827529, 1.04186, 0.999871, -0.00450785, 0.00674583, 1.05569, 0.999867, -0.00486079, 0.00621041, 1.06861, 0.999939, -0.00322072, 0.00478301, 1.08064, 0.999918, -0.00318199, 0.00406395, 1.09181, 1.00003, -0.00193348, 0.00280682, 1.10207, 0.999928, -0.00153729, 0.00198741, 1.11152, 0.999933, -0.000623666, 0.000917714, 1.12009, 1, -1.02387e-06, 9.07581e-07, 1.12813, 0.997866, -8.96716e-07, 0.0448334, 1.99584e-05, 0.997987, -2.25945e-05, 0.0448389, 0.000502891, 0.997987, -9.03781e-05, 0.0448388, 0.00201156, 0.997985, -0.000203351, 0.0448388, 0.00452602, 0.997986, -0.000361514, 0.0448388, 0.00804629, 0.997987, -0.00056487, 0.0448389, 0.0125724, 0.997988, -0.000813423, 0.0448389, 0.0181045, 0.997984, -0.00110718, 0.0448387, 0.0246427, 0.997985, -0.00144616, 0.0448388, 0.0321875, 0.997987, -0.00183038, 0.044839, 0.0407392, 0.997983, -0.00225987, 0.0448387, 0.0502986, 0.997991, -0.00273467, 0.0448389, 0.0608667, 0.997984, -0.00325481, 0.0448384, 0.0724444, 0.998002, -0.00382043, 0.044839, 0.0850348, 0.997997, -0.00443145, 0.0448396, 0.0986372, 0.998007, -0.00508796, 0.0448397, 0.113255, 0.998008, -0.00578985, 0.04484, 0.128891, 0.998003, -0.00653683, 0.0448384, 0.145548, 0.997983, -0.00732713, 0.0448358, 0.163221, 0.997985, -0.00815454, 0.0448358, 0.181899, 0.998005, -0.00898985, 0.0448286, 0.201533, 0.998026, -0.00964404, 0.0447934, 0.221821, 0.998055, -0.00922677, 0.044611, 0.241282, 0.99804, -0.0117361, 0.0448245, 0.261791, 0.998048, -0.0127628, 0.0448159, 0.285181, 0.998088, -0.0138055, 0.0447996, 0.30954, 0.998058, -0.0148206, 0.0447669, 0.334751, 0.998099, -0.0156998, 0.044697, 0.36061, 0.998116, -0.0161976, 0.0445122, 0.386603, 0.998195, -0.015945, 0.0441711, 0.411844, 0.998168, -0.0183947, 0.0444255, 0.43773, 0.998184, -0.0197913, 0.0443809, 0.466009, 0.998251, -0.0201426, 0.0440689, 0.494574, 0.998305, -0.0198847, 0.0435632, 0.522405, 0.998273, -0.0210577, 0.043414, 0.549967, 0.998254, -0.0227901, 0.0433943, 0.578655, 0.998349, -0.0223108, 0.0426529, 0.60758, 0.99843, -0.0223088, 0.042, 0.635524, 0.998373, -0.0241141, 0.0418987, 0.663621, 0.998425, -0.0231446, 0.0408118, 0.691906, 0.998504, -0.0233684, 0.0400565, 0.719339, 0.998443, -0.0241652, 0.0394634, 0.74643, 0.99848, -0.0228715, 0.0380002, 0.773086, 0.998569, -0.023519, 0.0372322, 0.798988, 0.998619, -0.0223108, 0.0356468, 0.824249, 0.998594, -0.0223105, 0.034523, 0.848808, 0.998622, -0.0213426, 0.0328887, 0.87227, 0.998669, -0.0207912, 0.0314374, 0.895157, 0.998705, -0.0198416, 0.0296925, 0.916769, 0.998786, -0.0189168, 0.0279634, 0.937773, 0.998888, -0.0178811, 0.0261597, 0.957431, 0.99906, -0.0166845, 0.0242159, 0.976495, 0.999038, -0.0155464, 0.0222638, 0.994169, 0.999237, -0.0141349, 0.0201967, 1.01112, 0.999378, -0.0129324, 0.0181744, 1.02692, 0.999433, -0.0113192, 0.0159898, 1.04174, 0.999439, -0.0101244, 0.0140385, 1.05559, 0.999614, -0.00837456, 0.0117826, 1.06852, 0.999722, -0.00721769, 0.00983745, 1.08069, 0.999817, -0.00554067, 0.00769002, 1.09176, 0.99983, -0.00426961, 0.005782, 1.10211, 0.999964, -0.00273904, 0.00374503, 1.11152, 1.00001, -0.00136739, 0.00187176, 1.12031, 0.999946, 3.93227e-05, -2.8919e-05, 1.12804, 0.995847, -1.3435e-06, 0.0671785, 1.9916e-05, 0.995464, -3.38387e-05, 0.0671527, 0.000501622, 0.99547, -0.000135355, 0.0671531, 0.00200649, 0.995471, -0.00030455, 0.0671532, 0.00451461, 0.99547, -0.000541423, 0.0671531, 0.008026, 0.995471, -0.00084598, 0.0671531, 0.0125407, 0.99547, -0.00121823, 0.0671531, 0.0180589, 0.99547, -0.00165817, 0.0671531, 0.0245806, 0.995463, -0.00216583, 0.0671526, 0.0321062, 0.995468, -0.00274127, 0.0671527, 0.0406366, 0.995474, -0.00338447, 0.0671534, 0.0501717, 0.995473, -0.00409554, 0.0671533, 0.0607131, 0.995478, -0.00487451, 0.0671531, 0.0722618, 0.995476, -0.00572148, 0.0671532, 0.0848191, 0.995477, -0.00663658, 0.0671539, 0.0983882, 0.995498, -0.00761986, 0.0671541, 0.112972, 0.995509, -0.00867094, 0.0671542, 0.128568, 0.995509, -0.00978951, 0.0671531, 0.145183, 0.995503, -0.0109725, 0.0671491, 0.162808, 0.995501, -0.012211, 0.0671465, 0.181441, 0.99553, -0.0134565, 0.0671371, 0.201015, 0.99555, -0.014391, 0.0670831, 0.221206, 0.99558, -0.014351, 0.0668883, 0.240813, 0.995577, -0.0173997, 0.0671055, 0.261257, 0.995602, -0.0191111, 0.0671178, 0.284467, 0.995623, -0.0206705, 0.0670946, 0.308765, 0.995658, -0.022184, 0.0670472, 0.333905, 0.995705, -0.0234832, 0.0669417, 0.359677, 0.995719, -0.0241933, 0.0666714, 0.385554, 0.995786, -0.0243539, 0.066266, 0.410951, 0.995887, -0.0271866, 0.0664367, 0.437163, 0.995944, -0.0296012, 0.0664931, 0.464842, 0.996004, -0.0301045, 0.0660105, 0.49332, 0.996128, -0.0298311, 0.0652694, 0.521131, 0.996253, -0.0316426, 0.0650739, 0.549167, 0.996244, -0.0339043, 0.0649433, 0.57737, 0.996309, -0.033329, 0.0638926, 0.606073, 0.996417, -0.0338935, 0.0630849, 0.634527, 0.996372, -0.0353104, 0.0625083, 0.66256, 0.996542, -0.0348942, 0.0611986, 0.690516, 0.996568, -0.0351614, 0.060069, 0.718317, 0.996711, -0.0354317, 0.0588522, 0.74528, 0.996671, -0.0349513, 0.0571902, 0.772061, 0.996865, -0.0345622, 0.0555321, 0.798089, 0.996802, -0.0342566, 0.0537816, 0.823178, 0.996992, -0.0330862, 0.0516095, 0.847949, 0.996944, -0.0324666, 0.0495537, 0.871431, 0.997146, -0.0309544, 0.0470302, 0.894357, 0.997189, -0.0299372, 0.0446043, 0.916142, 0.997471, -0.0281389, 0.0418812, 0.937193, 0.997515, -0.0268702, 0.0391823, 0.957, 0.997812, -0.0247166, 0.0361338, 0.975936, 0.998027, -0.0233525, 0.0333945, 0.99391, 0.998233, -0.0209839, 0.0301917, 1.01075, 0.998481, -0.0194309, 0.027271, 1.02669, 0.998859, -0.0169728, 0.0240162, 1.04173, 0.99894, -0.0152322, 0.0210517, 1.05551, 0.999132, -0.0127497, 0.0178632, 1.06856, 0.999369, -0.0108282, 0.014787, 1.08054, 0.999549, -0.00845886, 0.0116185, 1.09185, 0.999805, -0.0063937, 0.00867209, 1.10207, 0.99985, -0.00414582, 0.00566823, 1.1117, 0.999912, -0.00207443, 0.00277562, 1.12022, 1.00001, 8.70226e-05, -5.3766e-05, 1.12832, 0.991943, -1.78672e-06, 0.0893382, 1.98384e-05, 0.991952, -4.50183e-05, 0.089339, 0.000499849, 0.991956, -0.000180074, 0.0893394, 0.0019994, 0.991955, -0.000405167, 0.0893393, 0.00449867, 0.991953, -0.000720298, 0.0893391, 0.00799764, 0.991955, -0.00112548, 0.0893393, 0.0124964, 0.991957, -0.0016207, 0.0893395, 0.0179951, 0.991958, -0.00220601, 0.0893396, 0.0244939, 0.991947, -0.00288137, 0.0893385, 0.0319929, 0.991962, -0.00364693, 0.0893399, 0.0404933, 0.991965, -0.00450264, 0.0893399, 0.049995, 0.99198, -0.00544862, 0.0893411, 0.0604995, 0.99197, -0.00648491, 0.0893397, 0.0720074, 0.991976, -0.00761164, 0.089341, 0.0845207, 0.99198, -0.00882891, 0.0893405, 0.0980413, 0.991982, -0.0101367, 0.0893396, 0.112571, 0.992008, -0.011535, 0.0893415, 0.128115, 0.992026, -0.0130228, 0.0893414, 0.144672, 0.992064, -0.0145966, 0.0893418, 0.162241, 0.992041, -0.0162421, 0.0893359, 0.180801, 0.992086, -0.0178888, 0.0893214, 0.200302, 0.992157, -0.0190368, 0.0892401, 0.220332, 0.992181, -0.0195584, 0.0890525, 0.240144, 0.992175, -0.0227257, 0.0892153, 0.260728, 0.99221, -0.0254195, 0.089304, 0.283473, 0.99222, -0.0274883, 0.0892703, 0.307673, 0.992317, -0.0294905, 0.0892027, 0.332729, 0.992374, -0.0311861, 0.0890577, 0.358387, 0.992505, -0.0320656, 0.0886994, 0.384102, 0.992568, -0.0329715, 0.0883198, 0.409767, 0.992675, -0.036006, 0.0883602, 0.436145, 0.992746, -0.0392897, 0.0884591, 0.463217, 0.992873, -0.0399337, 0.0878287, 0.491557, 0.992934, -0.040231, 0.0870108, 0.519516, 0.993091, -0.0422013, 0.0865857, 0.547741, 0.993259, -0.0443503, 0.0861937, 0.575792, 0.993455, -0.0446368, 0.0851187, 0.604233, 0.993497, -0.0454299, 0.0840576, 0.632925, 0.993694, -0.0463296, 0.0829671, 0.660985, 0.993718, -0.0470619, 0.0817185, 0.688714, 0.993973, -0.0468838, 0.0800294, 0.716743, 0.994207, -0.046705, 0.0781286, 0.74377, 0.994168, -0.0469698, 0.0763337, 0.77042, 0.9945, -0.0456816, 0.0738184, 0.796659, 0.994356, -0.0455518, 0.0715545, 0.821868, 0.994747, -0.0439488, 0.0686085, 0.846572, 0.994937, -0.0430056, 0.065869, 0.870435, 0.995142, -0.0413414, 0.0626446, 0.893272, 0.995451, -0.0396521, 0.05929, 0.915376, 0.995445, -0.0378453, 0.0558503, 0.936196, 0.995967, -0.0355219, 0.0520949, 0.956376, 0.996094, -0.0335146, 0.048377, 0.975327, 0.996622, -0.030682, 0.0442575, 0.993471, 0.996938, -0.0285504, 0.0404693, 1.01052, 0.997383, -0.0253399, 0.0360903, 1.02637, 0.997714, -0.0231651, 0.0322176, 1.04139, 0.998249, -0.0198138, 0.0278433, 1.05542, 0.998596, -0.0174337, 0.0238759, 1.06846, 0.998946, -0.0141349, 0.0195944, 1.08056, 0.99928, -0.0115603, 0.0156279, 1.09181, 0.999507, -0.00839065, 0.0114607, 1.10213, 0.999697, -0.005666, 0.00763325, 1.11169, 0.999869, -0.00269902, 0.00364946, 1.12042, 1.00001, 6.23836e-05, -3.19288e-05, 1.12832, 0.987221, -2.22675e-06, 0.111332, 1.97456e-05, 0.98739, -5.61116e-05, 0.111351, 0.000497563, 0.987448, -0.000224453, 0.111357, 0.00199031, 0.987441, -0.000505019, 0.111357, 0.0044782, 0.987442, -0.000897816, 0.111357, 0.00796129, 0.987442, -0.00140284, 0.111357, 0.0124396, 0.987444, -0.00202012, 0.111357, 0.0179132, 0.987442, -0.00274964, 0.111357, 0.0243824, 0.987446, -0.00359147, 0.111357, 0.0318474, 0.987435, -0.00454562, 0.111356, 0.0403086, 0.987461, -0.00561225, 0.111358, 0.0497678, 0.987458, -0.00679125, 0.111358, 0.0602239, 0.987443, -0.0080828, 0.111356, 0.0716792, 0.987476, -0.0094872, 0.111358, 0.0841364, 0.98749, -0.0110044, 0.111361, 0.097597, 0.987508, -0.0126344, 0.111362, 0.112062, 0.987494, -0.0143767, 0.111357, 0.127533, 0.987526, -0.0162307, 0.111359, 0.144015, 0.987558, -0.0181912, 0.111361, 0.161502, 0.987602, -0.0202393, 0.111355, 0.179979, 0.987692, -0.022273, 0.111346, 0.199386, 0.987702, -0.0235306, 0.111215, 0.219183, 0.987789, -0.0247628, 0.111061, 0.239202, 0.987776, -0.0280668, 0.111171, 0.259957, 0.987856, -0.0316751, 0.111327, 0.282198, 0.987912, -0.0342468, 0.111282, 0.306294, 0.988, -0.0367205, 0.111198, 0.331219, 0.988055, -0.0387766, 0.110994, 0.356708, 0.988241, -0.0397722, 0.110547, 0.382234, 0.988399, -0.0416076, 0.110198, 0.408227, 0.988539, -0.0448192, 0.110137, 0.434662, 0.988661, -0.0483793, 0.110143, 0.461442, 0.988967, -0.0495895, 0.109453, 0.489318, 0.989073, -0.0506797, 0.108628, 0.517516, 0.989274, -0.0526953, 0.108003, 0.545844, 0.989528, -0.054578, 0.107255, 0.573823, 0.989709, -0.0561503, 0.106294, 0.601944, 0.989991, -0.056866, 0.104896, 0.630855, 0.990392, -0.0572914, 0.103336, 0.658925, 0.990374, -0.0586224, 0.10189, 0.686661, 0.990747, -0.0584764, 0.099783, 0.714548, 0.991041, -0.0582662, 0.0974309, 0.74186, 0.991236, -0.0584118, 0.0951678, 0.768422, 0.991585, -0.0573055, 0.0921581, 0.794817, 0.991984, -0.0564241, 0.0891167, 0.820336, 0.9921, -0.0553608, 0.085805, 0.84493, 0.992749, -0.0533816, 0.0820354, 0.868961, 0.99288, -0.0518661, 0.0782181, 0.891931, 0.993511, -0.0492492, 0.0738935, 0.914186, 0.993617, -0.0471956, 0.0696402, 0.93532, 0.99411, -0.044216, 0.0649659, 0.95543, 0.994595, -0.0416654, 0.0603177, 0.974685, 0.994976, -0.0384314, 0.0553493, 0.992807, 0.995579, -0.0353491, 0.0503942, 1.00996, 0.996069, -0.0319787, 0.0452123, 1.02606, 0.996718, -0.028472, 0.0400112, 1.04114, 0.997173, -0.0250789, 0.0349456, 1.05517, 0.997818, -0.0213326, 0.029653, 1.0683, 0.998318, -0.0178509, 0.024549, 1.0805, 0.998853, -0.0141118, 0.0194197, 1.09177, 0.999218, -0.0105914, 0.0143869, 1.1022, 0.999594, -0.00693474, 0.00943517, 1.11175, 0.99975, -0.00340478, 0.00464051, 1.12056, 1.00001, 0.000109172, -0.000112821, 1.12853, 0.983383, -2.66524e-06, 0.133358, 1.96534e-05, 0.981942, -6.71009e-05, 0.133162, 0.000494804, 0.981946, -0.000268405, 0.133163, 0.00197923, 0.981944, -0.000603912, 0.133163, 0.00445326, 0.981941, -0.00107362, 0.133162, 0.00791693, 0.981946, -0.00167755, 0.133163, 0.0123703, 0.981944, -0.00241569, 0.133162, 0.0178135, 0.981945, -0.00328807, 0.133163, 0.0242466, 0.981945, -0.00429472, 0.133162, 0.03167, 0.981955, -0.00543573, 0.133164, 0.0400846, 0.981951, -0.00671105, 0.133163, 0.0494901, 0.981968, -0.00812092, 0.133165, 0.0598886, 0.981979, -0.00966541, 0.133166, 0.0712811, 0.981996, -0.0113446, 0.133168, 0.083669, 0.982014, -0.0131585, 0.133169, 0.0970533, 0.982011, -0.0151073, 0.133167, 0.111438, 0.982062, -0.0171906, 0.133172, 0.126826, 0.9821, -0.0194067, 0.133175, 0.143215, 0.982149, -0.0217502, 0.133176, 0.160609, 0.982163, -0.0241945, 0.133173, 0.178981, 0.982247, -0.0265907, 0.133148, 0.198249, 0.982291, -0.027916, 0.132974, 0.217795, 0.982396, -0.0299663, 0.132868, 0.238042, 0.982456, -0.0334544, 0.132934, 0.258901, 0.982499, -0.0378636, 0.133137, 0.280639, 0.982617, -0.0409274, 0.133085, 0.304604, 0.98274, -0.0438523, 0.132985, 0.329376, 0.982944, -0.0462288, 0.132728, 0.354697, 0.98308, -0.0475995, 0.132228, 0.380102, 0.983391, -0.0501901, 0.131924, 0.406256, 0.983514, -0.0535899, 0.131737, 0.432735, 0.98373, -0.0571858, 0.131567, 0.459359, 0.984056, -0.0592353, 0.130932, 0.486637, 0.984234, -0.0610488, 0.130092, 0.51509, 0.984748, -0.0630758, 0.12923, 0.543461, 0.985073, -0.0647398, 0.128174, 0.571376, 0.985195, -0.0671941, 0.127133, 0.599414, 0.985734, -0.0681345, 0.125576, 0.628134, 0.986241, -0.0686089, 0.123639, 0.656399, 0.986356, -0.0698511, 0.121834, 0.684258, 0.986894, -0.0700931, 0.119454, 0.711818, 0.987382, -0.0698321, 0.116718, 0.739511, 0.988109, -0.0693975, 0.113699, 0.766267, 0.988363, -0.0689584, 0.110454, 0.792456, 0.989112, -0.0672353, 0.106602, 0.81813, 0.989241, -0.0662034, 0.10267, 0.842889, 0.990333, -0.0638938, 0.0981381, 0.867204, 0.990591, -0.0618534, 0.0935388, 0.89038, 0.991106, -0.0593117, 0.088553, 0.912576, 0.991919, -0.0562676, 0.0832187, 0.934118, 0.992111, -0.0534085, 0.0778302, 0.954254, 0.992997, -0.0495459, 0.0720453, 0.973722, 0.993317, -0.0463707, 0.0663458, 0.991949, 0.994133, -0.0421245, 0.0601883, 1.00936, 0.994705, -0.0384977, 0.0542501, 1.02559, 0.995495, -0.0340956, 0.0479862, 1.04083, 0.996206, -0.030105, 0.041887, 1.05497, 0.996971, -0.0256095, 0.0355355, 1.06824, 0.997796, -0.0213932, 0.0293655, 1.08056, 0.998272, -0.0169612, 0.0232926, 1.09182, 0.998857, -0.0126756, 0.0172786, 1.10219, 0.99939, -0.00832486, 0.0113156, 1.11192, 0.999752, -0.00410826, 0.00557892, 1.12075, 1, 0.000150957, -0.000119101, 1.12885, 0.975169, -3.09397e-06, 0.154669, 1.95073e-05, 0.975439, -7.79608e-05, 0.154712, 0.000491534, 0.975464, -0.000311847, 0.154716, 0.00196617, 0.975464, -0.000701656, 0.154716, 0.00442387, 0.975462, -0.0012474, 0.154715, 0.0078647, 0.975461, -0.00194906, 0.154715, 0.0122886, 0.975464, -0.00280667, 0.154715, 0.0176959, 0.975468, -0.00382025, 0.154716, 0.0240867, 0.975471, -0.00498985, 0.154716, 0.0314612, 0.975472, -0.00631541, 0.154717, 0.0398199, 0.975486, -0.00779719, 0.154718, 0.0491639, 0.975489, -0.00943505, 0.154718, 0.0594932, 0.975509, -0.0112295, 0.154721, 0.0708113, 0.97554, -0.0131802, 0.154724, 0.0831176, 0.975557, -0.0152876, 0.154726, 0.096415, 0.975585, -0.0175512, 0.154728, 0.110705, 0.975605, -0.0199713, 0.154729, 0.125992, 0.975645, -0.0225447, 0.154729, 0.142272, 0.975711, -0.0252649, 0.154735, 0.159549, 0.975788, -0.0280986, 0.154736, 0.177805, 0.975872, -0.0308232, 0.154704, 0.196911, 0.975968, -0.0324841, 0.154525, 0.216324, 0.976063, -0.0351281, 0.154432, 0.236628, 0.976157, -0.0388618, 0.15446, 0.257539, 0.976204, -0.0437704, 0.154665, 0.278975, 0.976358, -0.047514, 0.154652, 0.302606, 0.976571, -0.0508638, 0.154535, 0.327204, 0.976725, -0.0534995, 0.154221, 0.352276, 0.977013, -0.0555547, 0.153737, 0.377696, 0.977294, -0.0586728, 0.153403, 0.403855, 0.977602, -0.0622715, 0.15312, 0.430333, 0.977932, -0.0658166, 0.152755, 0.456855, 0.978241, -0.0689877, 0.152233, 0.483668, 0.978602, -0.0712805, 0.15132, 0.512097, 0.979234, -0.0732775, 0.150235, 0.540455, 0.97977, -0.075163, 0.148978, 0.568486, 0.979995, -0.0778026, 0.147755, 0.596524, 0.98078, -0.0791854, 0.146019, 0.624825, 0.981628, -0.0799666, 0.143906, 0.653403, 0.982067, -0.0808532, 0.141561, 0.681445, 0.98271, -0.0816024, 0.139025, 0.708918, 0.983734, -0.0812511, 0.135764, 0.736594, 0.98431, -0.0806201, 0.132152, 0.763576, 0.985071, -0.0801605, 0.12846, 0.789797, 0.98618, -0.0784208, 0.124084, 0.815804, 0.986886, -0.0766643, 0.1193, 0.840869, 0.987485, -0.0747744, 0.114236, 0.864952, 0.988431, -0.0716701, 0.108654, 0.888431, 0.988886, -0.0691609, 0.102994, 0.910963, 0.990024, -0.0654048, 0.0967278, 0.932629, 0.990401, -0.0619765, 0.090384, 0.95313, 0.991093, -0.0579296, 0.0837885, 0.972587, 0.992018, -0.0536576, 0.0770171, 0.991184, 0.992536, -0.0493719, 0.0701486, 1.00863, 0.993421, -0.0444813, 0.062953, 1.02494, 0.993928, -0.040008, 0.0560455, 1.04017, 0.994994, -0.0347982, 0.04856, 1.05463, 0.995866, -0.0301017, 0.0416152, 1.06807, 0.996916, -0.0248225, 0.0342597, 1.08039, 0.997766, -0.0199229, 0.0271668, 1.09177, 0.998479, -0.0147422, 0.0201387, 1.10235, 0.99921, -0.00980173, 0.0131944, 1.11206, 0.999652, -0.0047426, 0.00640712, 1.12104, 0.999998, 8.91673e-05, -0.00010379, 1.12906, 0.967868, -3.51885e-06, 0.175947, 1.93569e-05, 0.968001, -8.86733e-05, 0.175972, 0.000487782, 0.96801, -0.000354697, 0.175973, 0.00195115, 0.968012, -0.000798063, 0.175974, 0.00439006, 0.968011, -0.00141879, 0.175973, 0.00780461, 0.968011, -0.00221686, 0.175973, 0.0121948, 0.968016, -0.00319231, 0.175974, 0.0175607, 0.968019, -0.00434515, 0.175974, 0.0239027, 0.968018, -0.00567538, 0.175974, 0.0312208, 0.968033, -0.00718308, 0.175977, 0.0395158, 0.968049, -0.00886836, 0.175979, 0.0487885, 0.968047, -0.0107312, 0.175978, 0.0590394, 0.968072, -0.0127719, 0.175981, 0.0702705, 0.968108, -0.0149905, 0.175986, 0.0824836, 0.968112, -0.0173866, 0.175985, 0.0956783, 0.968173, -0.0199611, 0.175993, 0.109862, 0.96827, -0.0227128, 0.176008, 0.125033, 0.968292, -0.025639, 0.17601, 0.141193, 0.968339, -0.0287299, 0.176007, 0.158336, 0.968389, -0.0319399, 0.176001, 0.176441, 0.968501, -0.034941, 0.175962, 0.195359, 0.968646, -0.0370812, 0.175793, 0.214686, 0.968789, -0.0402329, 0.175708, 0.234973, 0.96886, -0.0442601, 0.1757, 0.255871, 0.969013, -0.049398, 0.175876, 0.277238, 0.969242, -0.0539932, 0.17594, 0.300326, 0.969419, -0.0577299, 0.175781, 0.324702, 0.969763, -0.0605643, 0.175432, 0.349527, 0.970093, -0.0634488, 0.174992, 0.374976, 0.970361, -0.0670589, 0.174611, 0.401097, 0.970825, -0.0708246, 0.174226, 0.427496, 0.971214, -0.0742871, 0.173684, 0.453858, 0.971622, -0.0782608, 0.173186, 0.480637, 0.972175, -0.0813151, 0.172288, 0.508655, 0.972944, -0.0832678, 0.170979, 0.536973, 0.973595, -0.0855964, 0.169573, 0.565138, 0.974345, -0.0882163, 0.168152, 0.593222, 0.975233, -0.0901671, 0.166314, 0.621201, 0.976239, -0.0912111, 0.163931, 0.649919, 0.977289, -0.0916959, 0.161106, 0.678011, 0.978076, -0.0927061, 0.158272, 0.705717, 0.979533, -0.0925562, 0.15475, 0.733228, 0.980335, -0.0918159, 0.150638, 0.760454, 0.981808, -0.0908508, 0.146201, 0.786918, 0.983061, -0.0896172, 0.141386, 0.812953, 0.984148, -0.0871588, 0.135837, 0.838281, 0.985047, -0.0850624, 0.130135, 0.862594, 0.986219, -0.0818541, 0.123882, 0.88633, 0.987043, -0.0784523, 0.117126, 0.908952, 0.988107, -0.0749601, 0.110341, 0.930744, 0.988955, -0.0703548, 0.102885, 0.951728, 0.989426, -0.0662798, 0.0954167, 0.971166, 0.990421, -0.0610834, 0.0876331, 0.989984, 0.991032, -0.0562936, 0.0797785, 1.00765, 0.992041, -0.0508154, 0.0718166, 1.02434, 0.992794, -0.0454045, 0.0637125, 1.03976, 0.993691, -0.0398194, 0.0555338, 1.05418, 0.994778, -0.0341482, 0.0473388, 1.06772, 0.995915, -0.028428, 0.0391016, 1.08028, 0.997109, -0.022642, 0.0309953, 1.09185, 0.998095, -0.0168738, 0.0230288, 1.10247, 0.998985, -0.0111274, 0.0150722, 1.11229, 0.999581, -0.00543881, 0.00740605, 1.12131, 1.00003, 0.000162239, -0.000105549, 1.12946, 0.959505, -3.93734e-06, 0.196876, 1.91893e-05, 0.959599, -9.92157e-05, 0.196895, 0.000483544, 0.959641, -0.000396868, 0.196903, 0.0019342, 0.959599, -0.000892948, 0.196895, 0.00435193, 0.959603, -0.00158747, 0.196896, 0.0077368, 0.959604, -0.00248042, 0.196896, 0.0120888, 0.959605, -0.00357184, 0.196896, 0.0174082, 0.959605, -0.00486169, 0.196896, 0.0236949, 0.959613, -0.00635008, 0.196897, 0.0309497, 0.959619, -0.00803696, 0.196898, 0.0391725, 0.959636, -0.00992255, 0.196901, 0.0483649, 0.959634, -0.0120067, 0.1969, 0.0585266, 0.959675, -0.0142898, 0.196906, 0.0696609, 0.959712, -0.0167717, 0.196911, 0.0817678, 0.959752, -0.0194524, 0.196918, 0.0948494, 0.959807, -0.0223321, 0.196925, 0.10891, 0.959828, -0.0254091, 0.196924, 0.123947, 0.959906, -0.0286815, 0.196934, 0.139968, 0.960005, -0.0321371, 0.196944, 0.156968, 0.960071, -0.0357114, 0.196936, 0.17491, 0.960237, -0.0389064, 0.196882, 0.193597, 0.960367, -0.041623, 0.196731, 0.21285, 0.960562, -0.0452655, 0.196654, 0.233075, 0.960735, -0.0496207, 0.196643, 0.253941, 0.960913, -0.0549379, 0.196774, 0.275278, 0.961121, -0.0603414, 0.196893, 0.297733, 0.96139, -0.0644244, 0.196717, 0.321877, 0.961818, -0.067556, 0.196314, 0.346476, 0.962175, -0.0712709, 0.195917, 0.371907, 0.96255, -0.0752848, 0.1955, 0.397916, 0.963164, -0.0792073, 0.195026, 0.424229, 0.963782, -0.0828225, 0.194424, 0.450637, 0.964306, -0.0873119, 0.193831, 0.477288, 0.964923, -0.0911051, 0.192973, 0.504716, 0.966048, -0.093251, 0.19151, 0.533053, 0.967024, -0.0958983, 0.190013, 0.561366, 0.968038, -0.09835, 0.188253, 0.589464, 0.969152, -0.100754, 0.186257, 0.617433, 0.970557, -0.102239, 0.183775, 0.645801, 0.972104, -0.102767, 0.180645, 0.674278, 0.973203, -0.103492, 0.177242, 0.702004, 0.975123, -0.103793, 0.17345, 0.729529, 0.97641, -0.102839, 0.168886, 0.756712, 0.978313, -0.101687, 0.163892, 0.783801, 0.980036, -0.100314, 0.158439, 0.809671, 0.981339, -0.097836, 0.152211, 0.835402, 0.982794, -0.0950006, 0.145679, 0.860081, 0.984123, -0.0920994, 0.138949, 0.883757, 0.984918, -0.0878641, 0.131283, 0.90685, 0.985999, -0.083939, 0.123464, 0.928786, 0.987151, -0.0791234, 0.115324, 0.94983, 0.987827, -0.0739332, 0.106854, 0.96962, 0.988806, -0.0688088, 0.0982691, 0.98861, 0.989588, -0.0628962, 0.0893456, 1.00667, 0.990438, -0.0573146, 0.0805392, 1.02344, 0.991506, -0.0509433, 0.0713725, 1.03933, 0.992492, -0.0448724, 0.0623732, 1.05378, 0.993663, -0.0383497, 0.0530838, 1.06747, 0.994956, -0.0319593, 0.0439512, 1.08007, 0.99634, -0.025401, 0.0347803, 1.09182, 0.99761, -0.0189687, 0.0257954, 1.1025, 0.99863, -0.0124441, 0.0169893, 1.11247, 0.99947, -0.00614003, 0.00829498, 1.12151, 1.00008, 0.000216624, -0.000146107, 1.12993, 0.950129, -4.34955e-06, 0.217413, 1.90081e-05, 0.950264, -0.00010957, 0.217444, 0.00047884, 0.9503, -0.000438299, 0.217451, 0.00191543, 0.950246, -0.000986124, 0.21744, 0.00430951, 0.950246, -0.00175311, 0.21744, 0.00766137, 0.950245, -0.00273923, 0.21744, 0.011971, 0.950253, -0.00394453, 0.217441, 0.0172385, 0.950258, -0.00536897, 0.217442, 0.0234641, 0.950267, -0.00701262, 0.217444, 0.030648, 0.950277, -0.00887551, 0.217446, 0.038791, 0.950284, -0.0109576, 0.217446, 0.0478931, 0.950312, -0.0132591, 0.217451, 0.0579568, 0.950334, -0.01578, 0.217454, 0.0689821, 0.950378, -0.0185204, 0.217462, 0.0809714, 0.950417, -0.0214803, 0.217467, 0.0939265, 0.950488, -0.0246594, 0.217479, 0.10785, 0.950534, -0.0280565, 0.217483, 0.122743, 0.950633, -0.0316685, 0.217498, 0.138611, 0.950698, -0.0354787, 0.217499, 0.155442, 0.950844, -0.0394003, 0.217507, 0.173208, 0.950999, -0.0426812, 0.217419, 0.191605, 0.951221, -0.0461302, 0.217317, 0.21084, 0.951412, -0.0502131, 0.217238, 0.230945, 0.951623, -0.0549183, 0.21722, 0.251745, 0.951867, -0.0604493, 0.217306, 0.273001, 0.952069, -0.0665189, 0.217466, 0.294874, 0.952459, -0.0709179, 0.217266, 0.318732, 0.952996, -0.0746112, 0.216891, 0.34318, 0.953425, -0.0789252, 0.216503, 0.36849, 0.953885, -0.0833293, 0.216042, 0.394373, 0.954617, -0.087371, 0.215469, 0.420505, 0.955429, -0.0914054, 0.214802, 0.446907, 0.956068, -0.0961671, 0.214146, 0.473522, 0.957094, -0.10048, 0.213286, 0.50052, 0.958372, -0.103248, 0.211796, 0.528715, 0.959654, -0.106033, 0.21016, 0.557065, 0.961305, -0.108384, 0.208149, 0.585286, 0.962785, -0.111122, 0.206024, 0.613334, 0.964848, -0.112981, 0.203442, 0.641334, 0.966498, -0.113717, 0.19996, 0.669955, 0.968678, -0.114121, 0.196105, 0.698094, 0.970489, -0.114524, 0.191906, 0.725643, 0.972903, -0.113792, 0.186963, 0.752856, 0.974701, -0.112406, 0.181343, 0.780013, 0.976718, -0.110685, 0.175185, 0.806268, 0.978905, -0.108468, 0.168535, 0.832073, 0.980267, -0.105061, 0.161106, 0.857149, 0.981967, -0.101675, 0.153387, 0.881145, 0.983063, -0.0974492, 0.145199, 0.904255, 0.984432, -0.0925815, 0.136527, 0.926686, 0.985734, -0.0877983, 0.127584, 0.947901, 0.986228, -0.081884, 0.118125, 0.968111, 0.98719, -0.0761208, 0.108594, 0.98719, 0.988228, -0.0698196, 0.0989996, 1.00559, 0.989046, -0.0632739, 0.0890074, 1.02246, 0.990242, -0.056522, 0.0790832, 1.03841, 0.991252, -0.0495272, 0.0689182, 1.05347, 0.992542, -0.0425373, 0.0588592, 1.06724, 0.994096, -0.0353198, 0.0486833, 1.08009, 0.995593, -0.028235, 0.0385977, 1.09177, 0.99711, -0.0209511, 0.0286457, 1.10274, 0.998263, -0.0139289, 0.0188497, 1.11262, 0.999254, -0.0067359, 0.009208, 1.12191, 0.999967, 0.000141846, -6.57764e-05, 1.13024, 0.935608, -4.74692e-06, 0.236466, 1.87817e-05, 0.93996, -0.00011971, 0.237568, 0.000473646, 0.939959, -0.000478845, 0.237567, 0.0018946, 0.939954, -0.0010774, 0.237566, 0.00426284, 0.939956, -0.00191538, 0.237566, 0.00757842, 0.939954, -0.00299277, 0.237566, 0.0118413, 0.93996, -0.00430961, 0.237567, 0.0170518, 0.939969, -0.00586589, 0.237569, 0.02321, 0.939982, -0.00766166, 0.237572, 0.0303164, 0.939987, -0.00969686, 0.237572, 0.0383711, 0.939997, -0.0119715, 0.237574, 0.0473751, 0.940031, -0.0144858, 0.237581, 0.0573298, 0.940073, -0.0172399, 0.237589, 0.0682366, 0.94012, -0.0202335, 0.237598, 0.080097, 0.940162, -0.0234663, 0.237604, 0.0929116, 0.940237, -0.0269387, 0.237615, 0.106686, 0.940328, -0.0306489, 0.237632, 0.121421, 0.940419, -0.0345917, 0.237645, 0.137115, 0.940522, -0.0387481, 0.237654, 0.153766, 0.940702, -0.0429906, 0.237661, 0.17133, 0.940871, -0.0465089, 0.237561, 0.189502, 0.941103, -0.050531, 0.23748, 0.208616, 0.941369, -0.0550657, 0.237423, 0.228595, 0.941641, -0.0601337, 0.237399, 0.249287, 0.941903, -0.0658804, 0.237443, 0.270467, 0.942224, -0.0722674, 0.237597, 0.292024, 0.942633, -0.0771788, 0.237419, 0.315272, 0.943172, -0.0815623, 0.237068, 0.339579, 0.943691, -0.0863973, 0.236682, 0.364717, 0.944382, -0.0911536, 0.236213, 0.390435, 0.945392, -0.0952967, 0.235562, 0.416425, 0.946185, -0.0998948, 0.234832, 0.442772, 0.947212, -0.104796, 0.234114, 0.469347, 0.948778, -0.10928, 0.233222, 0.496162, 0.950149, -0.113081, 0.231845, 0.523978, 0.951989, -0.115893, 0.230005, 0.552295, 0.953921, -0.11846, 0.227862, 0.580569, 0.955624, -0.12115, 0.225439, 0.608698, 0.958234, -0.123373, 0.222635, 0.636696, 0.960593, -0.124519, 0.219093, 0.665208, 0.963201, -0.124736, 0.214749, 0.693557, 0.965642, -0.125012, 0.210059, 0.721334, 0.968765, -0.124661, 0.204935, 0.748613, 0.971753, -0.122996, 0.198661, 0.776224, 0.973751, -0.120998, 0.191823, 0.802461, 0.976709, -0.118583, 0.184359, 0.828399, 0.977956, -0.115102, 0.176437, 0.853693, 0.979672, -0.111077, 0.167681, 0.877962, 0.981816, -0.10688, 0.158872, 0.901564, 0.98238, -0.101469, 0.149398, 0.924057, 0.983964, -0.0960013, 0.139436, 0.945751, 0.984933, -0.0899626, 0.12943, 0.966272, 0.985694, -0.0832973, 0.11894, 0.985741, 0.986822, -0.0767082, 0.108349, 1.00407, 0.987725, -0.0693614, 0.0976026, 1.02154, 0.98877, -0.06211, 0.086652, 1.03757, 0.990129, -0.0544143, 0.0756182, 1.05296, 0.991337, -0.046744, 0.0645753, 1.06683, 0.992978, -0.0387931, 0.0534683, 1.0798, 0.994676, -0.030973, 0.0424137, 1.09181, 0.99645, -0.0230311, 0.0314035, 1.10286, 0.997967, -0.0152065, 0.0206869, 1.11291, 0.99922, -0.00744837, 0.010155, 1.12237, 1.00002, 0.000240209, -7.52767e-05, 1.13089, 0.922948, -5.15351e-06, 0.255626, 1.86069e-05, 0.928785, -0.000129623, 0.257244, 0.000468009, 0.928761, -0.00051849, 0.257237, 0.00187202, 0.928751, -0.0011666, 0.257235, 0.00421204, 0.928751, -0.00207395, 0.257234, 0.0074881, 0.928754, -0.00324055, 0.257235, 0.0117002, 0.92876, -0.00466639, 0.257236, 0.0168486, 0.928763, -0.00635149, 0.257237, 0.0229334, 0.928774, -0.00829584, 0.257239, 0.029955, 0.928791, -0.0104995, 0.257243, 0.0379139, 0.928804, -0.0129623, 0.257245, 0.0468108, 0.928847, -0.0156846, 0.257255, 0.0566473, 0.92889, -0.0186661, 0.257263, 0.0674246, 0.928924, -0.0219067, 0.257268, 0.0791433, 0.928989, -0.0254066, 0.257282, 0.0918076, 0.92909, -0.0291651, 0.257301, 0.105419, 0.92918, -0.0331801, 0.257316, 0.119978, 0.92929, -0.0374469, 0.257332, 0.135491, 0.929453, -0.041939, 0.257357, 0.151948, 0.929586, -0.0464612, 0.257347, 0.169275, 0.929858, -0.0503426, 0.257269, 0.187257, 0.930125, -0.0548409, 0.257199, 0.206204, 0.930403, -0.0598063, 0.257149, 0.22601, 0.930726, -0.0652437, 0.257122, 0.246561, 0.931098, -0.0712376, 0.257153, 0.267618, 0.931396, -0.0777506, 0.257237, 0.288993, 0.931947, -0.0832374, 0.257124, 0.311527, 0.932579, -0.0883955, 0.25683, 0.335697, 0.933194, -0.0937037, 0.256444, 0.360634, 0.934013, -0.0987292, 0.255939, 0.386126, 0.935307, -0.103215, 0.255282, 0.412018, 0.936374, -0.108234, 0.254538, 0.438292, 0.93776, -0.113234, 0.253728, 0.464805, 0.939599, -0.118013, 0.25275, 0.491464, 0.941036, -0.122661, 0.251404, 0.518751, 0.94337, -0.125477, 0.249435, 0.547133, 0.945318, -0.128374, 0.247113, 0.575456, 0.947995, -0.130996, 0.244441, 0.60372, 0.950818, -0.133438, 0.241352, 0.63174, 0.954378, -0.135004, 0.237849, 0.659971, 0.957151, -0.135313, 0.233188, 0.688478, 0.960743, -0.13521, 0.228001, 0.716767, 0.964352, -0.135007, 0.222249, 0.744349, 0.967273, -0.133523, 0.21542, 0.771786, 0.969767, -0.131155, 0.208039, 0.798639, 0.973195, -0.128492, 0.200076, 0.824774, 0.975557, -0.125094, 0.191451, 0.850222, 0.977692, -0.120578, 0.18184, 0.874761, 0.98026, -0.115882, 0.172102, 0.898497, 0.981394, -0.110372, 0.161859, 0.921636, 0.982386, -0.10415, 0.15108, 0.943467, 0.983783, -0.0978128, 0.140407, 0.964045, 0.98422, -0.0906171, 0.129058, 0.98398, 0.985447, -0.0832921, 0.117614, 1.00276, 0.986682, -0.0754412, 0.10585, 1.02047, 0.987326, -0.0673885, 0.0940943, 1.03678, 0.988707, -0.0592565, 0.0822093, 1.05218, 0.990185, -0.050717, 0.070192, 1.06652, 0.991866, -0.0423486, 0.0582081, 1.07965, 0.993897, -0.0336118, 0.0460985, 1.09188, 0.995841, -0.0252178, 0.0342737, 1.10307, 0.997605, -0.0164893, 0.0224829, 1.11324, 0.999037, -0.00817112, 0.0110647, 1.12262, 1.00003, 0.000291686, -0.000168673, 1.13139, 0.915304, -5.52675e-06, 0.275999, 1.83285e-05, 0.91668, -0.000139285, 0.276414, 0.000461914, 0.916664, -0.00055713, 0.276409, 0.00184763, 0.916653, -0.00125354, 0.276406, 0.00415715, 0.916651, -0.00222851, 0.276405, 0.00739053, 0.916655, -0.00348205, 0.276406, 0.0115478, 0.916653, -0.00501414, 0.276405, 0.0166291, 0.916667, -0.00682478, 0.276409, 0.0226346, 0.91668, -0.00891398, 0.276412, 0.0295648, 0.91669, -0.0112817, 0.276413, 0.0374199, 0.916727, -0.013928, 0.276422, 0.0462016, 0.916759, -0.0168528, 0.276429, 0.0559101, 0.916793, -0.0200558, 0.276436, 0.0665466, 0.916849, -0.0235373, 0.276448, 0.0781139, 0.916964, -0.0272973, 0.276474, 0.0906156, 0.917047, -0.0313344, 0.276491, 0.104051, 0.917152, -0.0356465, 0.276511, 0.118424, 0.917286, -0.0402271, 0.276533, 0.133736, 0.917469, -0.0450408, 0.276564, 0.149978, 0.917686, -0.0497872, 0.276563, 0.167057, 0.917953, -0.0540937, 0.276493, 0.184846, 0.918228, -0.0590709, 0.276437, 0.203614, 0.918572, -0.0644277, 0.276398, 0.223212, 0.918918, -0.0702326, 0.276362, 0.243584, 0.919356, -0.076484, 0.276383, 0.264465, 0.919842, -0.0830808, 0.276434, 0.285701, 0.920451, -0.0892972, 0.276407, 0.307559, 0.921113, -0.095016, 0.276128, 0.331501, 0.921881, -0.100771, 0.275754, 0.356207, 0.923027, -0.106029, 0.275254, 0.381477, 0.924364, -0.111029, 0.274595, 0.40722, 0.925818, -0.116345, 0.273841, 0.433385, 0.92746, -0.121424, 0.272913, 0.459848, 0.929167, -0.12657, 0.271837, 0.486493, 0.931426, -0.131581, 0.270575, 0.513432, 0.934001, -0.135038, 0.268512, 0.541502, 0.936296, -0.138039, 0.266135, 0.569658, 0.939985, -0.140687, 0.263271, 0.598375, 0.943516, -0.143247, 0.260058, 0.626563, 0.94782, -0.145135, 0.256138, 0.654711, 0.951023, -0.145733, 0.251154, 0.683285, 0.955338, -0.145554, 0.245562, 0.711831, 0.959629, -0.145008, 0.239265, 0.739573, 0.963123, -0.144003, 0.232064, 0.767027, 0.966742, -0.141289, 0.224036, 0.794359, 0.969991, -0.138247, 0.215305, 0.820361, 0.973403, -0.134786, 0.206051, 0.846548, 0.975317, -0.129966, 0.195914, 0.871541, 0.977647, -0.12471, 0.185184, 0.895313, 0.980137, -0.119086, 0.174161, 0.918398, 0.981031, -0.112297, 0.162792, 0.940679, 0.982037, -0.105372, 0.150952, 0.961991, 0.983164, -0.097821, 0.138921, 0.981913, 0.983757, -0.0897245, 0.126611, 1.00109, 0.985036, -0.0815974, 0.114228, 1.01902, 0.986289, -0.0727725, 0.101389, 1.03604, 0.987329, -0.0639323, 0.0886476, 1.05149, 0.989193, -0.0548109, 0.0756837, 1.06619, 0.990716, -0.045687, 0.0627581, 1.07948, 0.992769, -0.0364315, 0.0498337, 1.09172, 0.99524, -0.0271761, 0.0370305, 1.1033, 0.997154, -0.0179609, 0.0243959, 1.11353, 0.998845, -0.00878063, 0.0119567, 1.12319, 1.00002, 0.000259038, -0.000108146, 1.13177, 0.903945, -5.91681e-06, 0.295126, 1.81226e-05, 0.903668, -0.000148672, 0.295037, 0.000455367, 0.903677, -0.000594683, 0.29504, 0.00182145, 0.903673, -0.00133805, 0.295039, 0.00409831, 0.903666, -0.00237872, 0.295036, 0.00728584, 0.903668, -0.00371676, 0.295037, 0.0113842, 0.903679, -0.00535212, 0.29504, 0.0163936, 0.903684, -0.00728479, 0.295041, 0.0223141, 0.903698, -0.00951473, 0.295044, 0.0291462, 0.903718, -0.0120419, 0.295049, 0.0368904, 0.903754, -0.0148664, 0.295058, 0.0455477, 0.903801, -0.017988, 0.29507, 0.0551194, 0.903851, -0.0214064, 0.295082, 0.0656058, 0.903921, -0.0251219, 0.295097, 0.0770109, 0.904002, -0.0291337, 0.295116, 0.0893354, 0.904111, -0.033441, 0.29514, 0.102583, 0.904246, -0.0380415, 0.295169, 0.116755, 0.904408, -0.0429258, 0.295202, 0.131853, 0.904637, -0.0480468, 0.295245, 0.147869, 0.904821, -0.0529208, 0.295214, 0.164658, 0.905163, -0.0577748, 0.295185, 0.182274, 0.905469, -0.0631763, 0.295143, 0.200828, 0.905851, -0.068917, 0.295112, 0.2202, 0.906322, -0.0750861, 0.295104, 0.240372, 0.906761, -0.0815855, 0.295086, 0.261082, 0.90735, -0.0882138, 0.295095, 0.282123, 0.908087, -0.095082, 0.295139, 0.303563, 0.908826, -0.101488, 0.29492, 0.327028, 0.909832, -0.107577, 0.294577, 0.351464, 0.911393, -0.113033, 0.294115, 0.376497, 0.912804, -0.118629, 0.293446, 0.402115, 0.914081, -0.124232, 0.292581, 0.428111, 0.91637, -0.129399, 0.29166, 0.454442, 0.91814, -0.134892, 0.290422, 0.481024, 0.921179, -0.140069, 0.289194, 0.507924, 0.924544, -0.144431, 0.287421, 0.535557, 0.927995, -0.147498, 0.284867, 0.563984, 0.931556, -0.150197, 0.281722, 0.5923, 0.935777, -0.152711, 0.278207, 0.620832, 0.940869, -0.154836, 0.274148, 0.649069, 0.945994, -0.155912, 0.269057, 0.677746, 0.949634, -0.155641, 0.262799, 0.706293, 0.955032, -0.154809, 0.256097, 0.734278, 0.95917, -0.153678, 0.248618, 0.761751, 0.962931, -0.151253, 0.239794, 0.789032, 0.966045, -0.147625, 0.230281, 0.815422, 0.96971, -0.143964, 0.220382, 0.841787, 0.972747, -0.139464, 0.209846, 0.867446, 0.975545, -0.133459, 0.198189, 0.892004, 0.978381, -0.127424, 0.186362, 0.915458, 0.979935, -0.120506, 0.173964, 0.937948, 0.980948, -0.11282, 0.161429, 0.959732, 0.982234, -0.104941, 0.148557, 0.980118, 0.982767, -0.0962905, 0.135508, 0.999463, 0.983544, -0.0873625, 0.122338, 1.01756, 0.984965, -0.0783447, 0.108669, 1.03492, 0.986233, -0.0684798, 0.0949911, 1.05087, 0.987796, -0.0590867, 0.0811386, 1.0656, 0.989885, -0.0489145, 0.0673099, 1.0794, 0.991821, -0.0391, 0.0535665, 1.09174, 0.99448, -0.029087, 0.0397529, 1.10341, 0.996769, -0.019114, 0.0261463, 1.11383, 0.998641, -0.00947007, 0.0128731, 1.1237, 0.999978, 0.000446316, -0.000169093, 1.13253, 0.888362, -6.27064e-06, 0.312578, 1.78215e-05, 0.889988, -0.000157791, 0.313148, 0.000448451, 0.889825, -0.000631076, 0.313092, 0.00179356, 0.88984, -0.00141994, 0.313097, 0.00403554, 0.889828, -0.0025243, 0.313092, 0.00717429, 0.889831, -0.00394421, 0.313093, 0.0112099, 0.889831, -0.00567962, 0.313093, 0.0161425, 0.889844, -0.00773051, 0.313096, 0.0219724, 0.889858, -0.0100968, 0.3131, 0.0286999, 0.889882, -0.0127786, 0.313106, 0.0363256, 0.889918, -0.0157757, 0.313116, 0.0448509, 0.889967, -0.0190878, 0.313129, 0.0542758, 0.89003, -0.022715, 0.313145, 0.0646032, 0.890108, -0.0266566, 0.313165, 0.0758339, 0.890218, -0.0309131, 0.313193, 0.0879729, 0.890351, -0.0354819, 0.313226, 0.101019, 0.89051, -0.0403613, 0.313263, 0.114979, 0.890672, -0.0455385, 0.313294, 0.129848, 0.890882, -0.0509444, 0.313333, 0.145616, 0.891189, -0.0559657, 0.313324, 0.162122, 0.891457, -0.0613123, 0.313281, 0.179524, 0.891856, -0.0671488, 0.313281, 0.197855, 0.892312, -0.0732732, 0.313268, 0.216991, 0.892819, -0.0797865, 0.313263, 0.236924, 0.893369, -0.0865269, 0.313247, 0.257433, 0.894045, -0.0931592, 0.313205, 0.278215, 0.894884, -0.100532, 0.313276, 0.299467, 0.895832, -0.107716, 0.313205, 0.322276, 0.897043, -0.114099, 0.312873, 0.34642, 0.898515, -0.119941, 0.312331, 0.371187, 0.900191, -0.126044, 0.311731, 0.396656, 0.90188, -0.131808, 0.310859, 0.422488, 0.904359, -0.137289, 0.309857, 0.448744, 0.906923, -0.142991, 0.308714, 0.475239, 0.910634, -0.148253, 0.307465, 0.501983, 0.914502, -0.153332, 0.305774, 0.529254, 0.919046, -0.156646, 0.303156, 0.557709, 0.923194, -0.159612, 0.299928, 0.586267, 0.928858, -0.162027, 0.296245, 0.614925, 0.934464, -0.164203, 0.291832, 0.643187, 0.939824, -0.165602, 0.286565, 0.671601, 0.944582, -0.165383, 0.280073, 0.700213, 0.949257, -0.164439, 0.272891, 0.728432, 0.954389, -0.162953, 0.264771, 0.756082, 0.958595, -0.161007, 0.255927, 0.78369, 0.962138, -0.157243, 0.245769, 0.810769, 0.966979, -0.152872, 0.235127, 0.836999, 0.969566, -0.148209, 0.22347, 0.862684, 0.972372, -0.142211, 0.211147, 0.887847, 0.975916, -0.135458, 0.198606, 0.911843, 0.978026, -0.128398, 0.185498, 0.934795, 0.979686, -0.120313, 0.17171, 0.956787, 0.980748, -0.11166, 0.158159, 0.978046, 0.981622, -0.103035, 0.144399, 0.997693, 0.982356, -0.0930328, 0.13001, 1.01642, 0.983308, -0.0834627, 0.115778, 1.03366, 0.985037, -0.0732249, 0.101327, 1.05014, 0.986493, -0.0628145, 0.086554, 1.06507, 0.988484, -0.0526556, 0.0720413, 1.07907, 0.991051, -0.0415744, 0.0571151, 1.09189, 0.993523, -0.0314275, 0.0426643, 1.10369, 0.99628, -0.0203603, 0.0279325, 1.11423, 0.998344, -0.0102446, 0.0138182, 1.12421, 0.999997, 0.00042612, -0.000193628, 1.1333, 0.871555, -6.60007e-06, 0.329176, 1.74749e-05, 0.875255, -0.000166579, 0.330571, 0.000441051, 0.875644, -0.000666394, 0.330718, 0.00176441, 0.875159, -0.00149903, 0.330536, 0.00396899, 0.87516, -0.00266493, 0.330536, 0.007056, 0.875158, -0.00416393, 0.330535, 0.0110251, 0.87516, -0.00599598, 0.330535, 0.0158764, 0.875163, -0.00816108, 0.330536, 0.0216101, 0.875174, -0.0106591, 0.330538, 0.0282266, 0.875199, -0.0134899, 0.330545, 0.0357266, 0.875257, -0.0166538, 0.330563, 0.0441117, 0.875304, -0.0201501, 0.330575, 0.0533821, 0.875373, -0.0239785, 0.330595, 0.0635395, 0.875464, -0.0281389, 0.330619, 0.0745872, 0.875565, -0.0326301, 0.330645, 0.0865255, 0.875691, -0.0374516, 0.330676, 0.0993599, 0.875897, -0.0425993, 0.330733, 0.113093, 0.876091, -0.0480576, 0.330776, 0.127722, 0.876353, -0.0537216, 0.330826, 0.143227, 0.876649, -0.0589807, 0.330809, 0.159462, 0.877034, -0.0647865, 0.330819, 0.176642, 0.877443, -0.0709789, 0.330817, 0.194702, 0.877956, -0.0774782, 0.330832, 0.213577, 0.878499, -0.0843175, 0.330822, 0.233246, 0.879144, -0.0912714, 0.330804, 0.253512, 0.879982, -0.0980824, 0.330766, 0.274137, 0.88097, -0.105823, 0.330864, 0.295209, 0.882051, -0.113671, 0.330896, 0.317226, 0.883397, -0.120303, 0.330545, 0.341068, 0.884987, -0.12667, 0.330068, 0.365613, 0.886789, -0.133118, 0.329418, 0.390807, 0.889311, -0.139024, 0.328683, 0.416494, 0.891995, -0.144971, 0.327729, 0.442618, 0.895106, -0.150747, 0.326521, 0.469131, 0.899527, -0.156283, 0.325229, 0.495921, 0.90504, -0.161707, 0.32378, 0.523162, 0.909875, -0.165661, 0.32122, 0.55092, 0.91561, -0.168755, 0.317942, 0.579928, 0.921225, -0.171193, 0.313983, 0.608539, 0.927308, -0.17319, 0.309636, 0.636854, 0.933077, -0.174819, 0.304262, 0.66523, 0.938766, -0.175002, 0.297563, 0.693609, 0.943667, -0.173946, 0.289613, 0.722157, 0.949033, -0.172221, 0.281227, 0.750021, 0.953765, -0.169869, 0.271545, 0.777466, 0.95804, -0.166578, 0.261034, 0.804853, 0.962302, -0.161761, 0.249434, 0.831569, 0.966544, -0.156636, 0.237484, 0.857779, 0.969372, -0.150784, 0.224395, 0.883051, 0.972486, -0.143672, 0.210786, 0.907864, 0.975853, -0.135772, 0.196556, 0.931223, 0.977975, -0.127942, 0.182307, 0.954061, 0.979122, -0.118347, 0.167607, 0.97531, 0.980719, -0.109112, 0.152739, 0.995666, 0.981223, -0.0991789, 0.137932, 1.01475, 0.98216, -0.0883553, 0.122692, 1.03253, 0.983379, -0.0780825, 0.107493, 1.04917, 0.985434, -0.0665646, 0.0917791, 1.06464, 0.987332, -0.0557714, 0.0764949, 1.07896, 0.990004, -0.0442805, 0.060721, 1.09199, 0.992975, -0.0331676, 0.0452284, 1.10393, 0.995811, -0.0219547, 0.0297934, 1.11476, 0.9982, -0.0107613, 0.0146415, 1.12484, 1.00002, 0.000248678, -0.00014555, 1.13413, 0.859519, -6.93595e-06, 0.347264, 1.71673e-05, 0.859843, -0.00017503, 0.347394, 0.000433219, 0.859656, -0.000700076, 0.347319, 0.00173277, 0.859671, -0.00157517, 0.347325, 0.00389875, 0.859669, -0.00280028, 0.347324, 0.00693112, 0.85967, -0.0043754, 0.347324, 0.01083, 0.859665, -0.00630049, 0.347321, 0.0155954, 0.859685, -0.0085755, 0.347328, 0.0212278, 0.859694, -0.0112003, 0.347329, 0.0277273, 0.859718, -0.0141747, 0.347336, 0.0350946, 0.85976, -0.0174988, 0.347348, 0.0433314, 0.85982, -0.0211722, 0.347366, 0.0524384, 0.859892, -0.0251941, 0.347387, 0.0624168, 0.860006, -0.0295649, 0.347422, 0.0732708, 0.860122, -0.0342825, 0.347453, 0.0849999, 0.860282, -0.0393462, 0.347499, 0.0976102, 0.860482, -0.0447513, 0.347554, 0.111104, 0.860719, -0.0504775, 0.347614, 0.125479, 0.860998, -0.0563577, 0.347666, 0.140703, 0.861322, -0.0619473, 0.347662, 0.156681, 0.861724, -0.0681277, 0.347684, 0.173597, 0.862198, -0.0746567, 0.347709, 0.191371, 0.862733, -0.0815234, 0.347727, 0.209976, 0.863371, -0.0886643, 0.347744, 0.229351, 0.86414, -0.0957908, 0.347734, 0.24934, 0.865138, -0.102912, 0.34772, 0.269797, 0.866182, -0.110924, 0.3478, 0.290654, 0.867436, -0.119223, 0.347911, 0.312074, 0.869087, -0.126197, 0.347649, 0.335438, 0.870859, -0.133145, 0.347222, 0.359732, 0.872997, -0.139869, 0.346645, 0.38467, 0.875939, -0.146089, 0.345935, 0.41019, 0.879012, -0.152334, 0.345012, 0.436218, 0.883353, -0.15821, 0.343924, 0.462641, 0.888362, -0.164097, 0.342636, 0.489449, 0.895026, -0.169528, 0.341351, 0.516629, 0.900753, -0.174408, 0.339115, 0.544109, 0.906814, -0.17751, 0.335809, 0.572857, 0.912855, -0.180101, 0.331597, 0.601554, 0.919438, -0.182116, 0.32698, 0.630198, 0.925962, -0.183494, 0.321449, 0.658404, 0.931734, -0.184159, 0.314595, 0.686625, 0.93762, -0.18304, 0.306462, 0.71531, 0.943858, -0.181323, 0.297514, 0.744272, 0.948662, -0.178683, 0.287447, 0.771462, 0.953299, -0.175379, 0.276166, 0.798593, 0.957346, -0.170395, 0.263758, 0.8256, 0.962565, -0.165042, 0.251019, 0.852575, 0.966075, -0.158655, 0.237011, 0.878316, 0.969048, -0.151707, 0.222518, 0.90329, 0.972423, -0.143271, 0.207848, 0.927745, 0.975833, -0.134824, 0.192463, 0.950859, 0.977629, -0.125444, 0.1768, 0.972947, 0.978995, -0.114949, 0.161033, 0.993263, 0.980533, -0.104936, 0.145523, 1.01337, 0.980745, -0.0935577, 0.129799, 1.03128, 0.981814, -0.0822956, 0.113486, 1.04825, 0.983943, -0.0710082, 0.0972925, 1.06405, 0.986141, -0.0587931, 0.0808138, 1.0785, 0.988878, -0.0472755, 0.0644915, 1.09204, 0.992132, -0.0349128, 0.0478128, 1.10413, 0.9953, -0.0232407, 0.031621, 1.11527, 0.998117, -0.0112713, 0.0154935, 1.12551, 1.00003, 0.000339743, -0.000195763, 1.13504, 0.845441, -7.29126e-06, 0.364305, 1.69208e-05, 0.843588, -0.000183164, 0.363506, 0.000425067, 0.843412, -0.00073253, 0.36343, 0.00169999, 0.843401, -0.00164818, 0.363426, 0.00382495, 0.843399, -0.00293008, 0.363425, 0.00679993, 0.843401, -0.00457822, 0.363425, 0.010625, 0.843394, -0.00659249, 0.363421, 0.0153002, 0.843398, -0.00897282, 0.363421, 0.0208258, 0.843415, -0.0117191, 0.363426, 0.0272024, 0.843438, -0.0148312, 0.363432, 0.0344305, 0.843483, -0.018309, 0.363447, 0.0425116, 0.84356, -0.0221521, 0.363472, 0.0514471, 0.843646, -0.0263597, 0.363499, 0.061238, 0.843743, -0.0309315, 0.363527, 0.0718873, 0.84388, -0.0358658, 0.363569, 0.0833969, 0.844079, -0.0411624, 0.363631, 0.0957742, 0.844279, -0.0468128, 0.363688, 0.109015, 0.844549, -0.0527923, 0.363761, 0.123124, 0.844858, -0.0588204, 0.363817, 0.138044, 0.84522, -0.0647573, 0.36383, 0.153755, 0.845669, -0.0713181, 0.363879, 0.170394, 0.846155, -0.0781697, 0.363908, 0.187861, 0.846789, -0.0853913, 0.363969, 0.206176, 0.847502, -0.0928086, 0.363999, 0.225244, 0.8484, -0.10005, 0.363997, 0.244926, 0.849461, -0.107615, 0.364008, 0.265188, 0.850562, -0.115814, 0.364055, 0.28587, 0.851962, -0.124334, 0.364179, 0.306926, 0.854326, -0.131995, 0.364233, 0.329605, 0.856295, -0.139338, 0.363856, 0.35359, 0.858857, -0.146346, 0.363347, 0.37831, 0.862428, -0.152994, 0.362807, 0.403722, 0.866203, -0.159463, 0.361963, 0.429537, 0.871629, -0.165623, 0.36112, 0.456, 0.877365, -0.171649, 0.359917, 0.482773, 0.883744, -0.177151, 0.35848, 0.509705, 0.890693, -0.182381, 0.356523, 0.537215, 0.897278, -0.186076, 0.3533, 0.565493, 0.903958, -0.188602, 0.349095, 0.594293, 0.910908, -0.190755, 0.344215, 0.623165, 0.918117, -0.192063, 0.338606, 0.651573, 0.924644, -0.192758, 0.331544, 0.679869, 0.931054, -0.192238, 0.323163, 0.708668, 0.937303, -0.190035, 0.313529, 0.737201, 0.943387, -0.187162, 0.303152, 0.764977, 0.948494, -0.183876, 0.29146, 0.792683, 0.952546, -0.178901, 0.277917, 0.819228, 0.958077, -0.173173, 0.264753, 0.846559, 0.962462, -0.16645, 0.25002, 0.872962, 0.966569, -0.159452, 0.234873, 0.898729, 0.969108, -0.15074, 0.218752, 0.923126, 0.973072, -0.141523, 0.202673, 0.947278, 0.975452, -0.132075, 0.186326, 0.969938, 0.977784, -0.121257, 0.169396, 0.991325, 0.97899, -0.110182, 0.153044, 1.01123, 0.979777, -0.0989634, 0.136485, 1.0299, 0.980865, -0.0865894, 0.119343, 1.04727, 0.982432, -0.0746115, 0.102452, 1.06341, 0.984935, -0.0621822, 0.0852423, 1.07834, 0.987776, -0.0495694, 0.0678546, 1.092, 0.99103, -0.0372386, 0.0506917, 1.1043, 0.99474, -0.0244353, 0.0333316, 1.11576, 0.997768, -0.0121448, 0.0164348, 1.12617, 1.00003, 0.00031774, -0.000169504, 1.13598, 0.825551, -7.56799e-06, 0.378425, 1.65099e-05, 0.82664, -0.000190922, 0.378923, 0.000416504, 0.826323, -0.000763495, 0.378779, 0.0016656, 0.826359, -0.00171789, 0.378795, 0.00374768, 0.82636, -0.00305402, 0.378795, 0.00666259, 0.826368, -0.00477185, 0.378798, 0.0104104, 0.826364, -0.00687131, 0.378795, 0.0149912, 0.826368, -0.00935232, 0.378795, 0.0204054, 0.826376, -0.0122146, 0.378797, 0.0266532, 0.826399, -0.0154581, 0.378803, 0.0337355, 0.82646, -0.0190825, 0.378824, 0.0416537, 0.826525, -0.0230873, 0.378846, 0.0504091, 0.826614, -0.0274719, 0.378876, 0.0600032, 0.82674, -0.0322355, 0.378917, 0.0704393, 0.826888, -0.0373766, 0.378964, 0.0817195, 0.827078, -0.0428936, 0.379024, 0.0938492, 0.827318, -0.0487778, 0.379099, 0.106828, 0.82764, -0.0549935, 0.379199, 0.120659, 0.827926, -0.0611058, 0.379227, 0.13526, 0.828325, -0.0675054, 0.379275, 0.150713, 0.828801, -0.0743455, 0.379332, 0.167034, 0.8294, -0.0815523, 0.379415, 0.184209, 0.830094, -0.0890779, 0.379495, 0.202203, 0.8309, -0.096736, 0.379555, 0.220945, 0.831943, -0.104135, 0.379577, 0.240306, 0.833037, -0.112106, 0.379604, 0.260317, 0.834278, -0.120554, 0.379668, 0.2808, 0.836192, -0.129128, 0.3799, 0.301654, 0.838671, -0.137541, 0.380109, 0.323502, 0.840939, -0.14523, 0.379809, 0.347176, 0.844575, -0.15248, 0.379593, 0.371706, 0.848379, -0.159607, 0.37909, 0.39688, 0.853616, -0.166267, 0.378617, 0.422702, 0.858921, -0.172698, 0.377746, 0.448919, 0.865324, -0.178823, 0.376749, 0.475661, 0.872207, -0.184542, 0.375363, 0.502599, 0.880018, -0.189836, 0.373657, 0.529914, 0.88694, -0.194294, 0.370673, 0.557683, 0.894779, -0.197022, 0.36662, 0.586848, 0.902242, -0.199108, 0.36138, 0.615831, 0.909914, -0.200398, 0.355434, 0.644478, 0.917088, -0.20094, 0.348173, 0.672905, 0.923888, -0.200671, 0.339482, 0.701327, 0.930495, -0.198773, 0.32956, 0.730101, 0.937247, -0.195394, 0.318363, 0.758383, 0.943108, -0.191956, 0.306323, 0.786539, 0.948296, -0.187227, 0.292576, 0.813637, 0.953472, -0.181165, 0.278234, 0.840793, 0.958485, -0.174119, 0.263054, 0.867712, 0.962714, -0.166564, 0.246756, 0.893635, 0.966185, -0.158181, 0.229945, 0.919028, 0.970146, -0.148275, 0.212633, 0.943413, 0.973491, -0.138157, 0.195229, 0.966627, 0.975741, -0.127574, 0.178048, 0.988817, 0.977238, -0.11554, 0.160312, 1.00924, 0.978411, -0.10364, 0.142857, 1.02845, 0.979811, -0.0913122, 0.125317, 1.04648, 0.98116, -0.0782558, 0.107627, 1.06284, 0.983543, -0.0655957, 0.0895862, 1.07798, 0.986789, -0.0520411, 0.0713756, 1.092, 0.990292, -0.0389727, 0.053228, 1.10484, 0.994187, -0.025808, 0.0351945, 1.11642, 0.997499, -0.0126071, 0.0173198, 1.12703, 0.999999, 0.000275604, -0.000148602, 1.13674, 0.81075, -7.8735e-06, 0.394456, 1.61829e-05, 0.808692, -0.000198293, 0.393453, 0.000407564, 0.80846, -0.000792877, 0.39334, 0.00162965, 0.808595, -0.00178416, 0.393407, 0.00366711, 0.808597, -0.00317182, 0.393408, 0.00651934, 0.808598, -0.00495589, 0.393408, 0.0101866, 0.808591, -0.00713627, 0.393403, 0.0146689, 0.808592, -0.00971285, 0.393402, 0.0199667, 0.80861, -0.0126855, 0.393407, 0.0260803, 0.808633, -0.0160538, 0.393413, 0.0330107, 0.80868, -0.0198175, 0.393429, 0.0407589, 0.808748, -0.0239758, 0.393453, 0.0493264, 0.808854, -0.0285286, 0.39349, 0.0587161, 0.808992, -0.0334748, 0.39354, 0.0689304, 0.809141, -0.0388116, 0.393588, 0.0799707, 0.809352, -0.0445375, 0.39366, 0.0918432, 0.809608, -0.0506427, 0.393742, 0.104549, 0.809915, -0.0570708, 0.393834, 0.118085, 0.810253, -0.0633526, 0.393885, 0.132377, 0.810687, -0.0700966, 0.393953, 0.147537, 0.811233, -0.0772274, 0.394047, 0.163543, 0.811865, -0.0847629, 0.394148, 0.180394, 0.812648, -0.0925663, 0.394265, 0.198051, 0.813583, -0.100416, 0.394363, 0.216443, 0.814683, -0.108119, 0.394402, 0.235502, 0.815948, -0.11644, 0.394489, 0.255242, 0.817278, -0.125036, 0.394542, 0.275441, 0.819605, -0.133655, 0.39486, 0.296094, 0.822256, -0.142682, 0.395248, 0.317309, 0.825349, -0.150756, 0.395241, 0.340516, 0.829605, -0.158392, 0.395285, 0.364819, 0.83391, -0.165801, 0.394922, 0.389736, 0.839808, -0.172677, 0.394691, 0.415409, 0.845708, -0.179448, 0.394006, 0.441546, 0.853025, -0.185746, 0.393279, 0.46832, 0.859666, -0.191684, 0.391655, 0.495302, 0.86789, -0.197146, 0.390068, 0.52262, 0.875845, -0.201904, 0.38727, 0.550336, 0.882634, -0.205023, 0.382688, 0.578825, 0.891076, -0.207098, 0.377543, 0.608103, 0.900589, -0.208474, 0.371752, 0.63723, 0.90791, -0.209068, 0.364016, 0.665769, 0.915971, -0.208655, 0.355593, 0.694428, 0.923455, -0.20729, 0.345439, 0.723224, 0.931514, -0.203821, 0.334099, 0.751925, 0.937885, -0.19986, 0.321069, 0.780249, 0.943136, -0.194993, 0.306571, 0.8077, 0.948818, -0.189132, 0.291556, 0.83497, 0.954433, -0.181617, 0.275745, 0.86188, 0.959078, -0.173595, 0.258695, 0.888562, 0.962705, -0.164855, 0.240825, 0.914008, 0.966753, -0.155129, 0.22268, 0.939145, 0.970704, -0.144241, 0.204542, 0.963393, 0.973367, -0.133188, 0.185927, 0.985983, 0.975984, -0.121146, 0.167743, 1.00704, 0.976994, -0.108366, 0.149218, 1.02715, 0.978485, -0.0956746, 0.13131, 1.0455, 0.980074, -0.0820733, 0.112513, 1.06221, 0.98225, -0.0684061, 0.0938323, 1.07782, 0.98553, -0.0549503, 0.0749508, 1.09199, 0.989529, -0.0407857, 0.055848, 1.10508, 0.993536, -0.0271978, 0.0368581, 1.11684, 0.997247, -0.0132716, 0.0181845, 1.12789, 1, 0.000431817, -0.000198809, 1.13792, 0.785886, -8.12608e-06, 0.405036, 1.57669e-05, 0.790388, -0.000205278, 0.407355, 0.000398297, 0.790145, -0.000820824, 0.407231, 0.00159263, 0.790135, -0.00184681, 0.407226, 0.00358336, 0.790119, -0.00328316, 0.407218, 0.00637039, 0.790126, -0.00512988, 0.40722, 0.0099539, 0.79013, -0.00738684, 0.407221, 0.0143339, 0.790135, -0.0100538, 0.407221, 0.0195107, 0.790134, -0.0131306, 0.407217, 0.0254848, 0.79016, -0.0166169, 0.407224, 0.0322572, 0.790197, -0.020512, 0.407236, 0.0398284, 0.790273, -0.0248157, 0.407263, 0.0482014, 0.790381, -0.029527, 0.407304, 0.0573777, 0.790521, -0.0346446, 0.407355, 0.0673602, 0.790704, -0.0401665, 0.40742, 0.0781522, 0.790925, -0.0460896, 0.407499, 0.0897582, 0.791195, -0.0524017, 0.407589, 0.10218, 0.791522, -0.0590121, 0.407691, 0.11541, 0.791878, -0.0654876, 0.407748, 0.12939, 0.792361, -0.0725207, 0.407849, 0.144237, 0.792942, -0.0799844, 0.407963, 0.159924, 0.79362, -0.0877896, 0.408087, 0.176425, 0.794529, -0.0958451, 0.408259, 0.193733, 0.795521, -0.103827, 0.408362, 0.211756, 0.796778, -0.111937, 0.408482, 0.230524, 0.798027, -0.120521, 0.408547, 0.249967, 0.799813, -0.129242, 0.408721, 0.269926, 0.802387, -0.138048, 0.409148, 0.290338, 0.805279, -0.147301, 0.409641, 0.311193, 0.809251, -0.155895, 0.410154, 0.333611, 0.813733, -0.163942, 0.410297, 0.357615, 0.819081, -0.171666, 0.410373, 0.382339, 0.825427, -0.178905, 0.410348, 0.407828, 0.83172, -0.185812, 0.409486, 0.434034, 0.83877, -0.192318, 0.408776, 0.460493, 0.845817, -0.198249, 0.407176, 0.487346, 0.854664, -0.204034, 0.405719, 0.514832, 0.863495, -0.208908, 0.403282, 0.542401, 0.871883, -0.212765, 0.399293, 0.570683, 0.88065, -0.214911, 0.393803, 0.599947, 0.89004, -0.216214, 0.387536, 0.62932, 0.898476, -0.216745, 0.379846, 0.658319, 0.906738, -0.216387, 0.370625, 0.687138, 0.914844, -0.215053, 0.360139, 0.71601, 0.923877, -0.212007, 0.348849, 0.745124, 0.931925, -0.207481, 0.335639, 0.773366, 0.938054, -0.202418, 0.320798, 0.801636, 0.943895, -0.196507, 0.304772, 0.829055, 0.949468, -0.189009, 0.288033, 0.856097, 0.955152, -0.180539, 0.270532, 0.88301, 0.959403, -0.171437, 0.251639, 0.909296, 0.963309, -0.161661, 0.232563, 0.934868, 0.967399, -0.150425, 0.213231, 0.959662, 0.972009, -0.138659, 0.194247, 0.98302, 0.97433, -0.126595, 0.174718, 1.00517, 0.975823, -0.113205, 0.155518, 1.02566, 0.976371, -0.0996096, 0.136709, 1.04418, 0.978705, -0.0860754, 0.117571, 1.06146, 0.981477, -0.0714438, 0.0980046, 1.07777, 0.984263, -0.0572304, 0.0782181, 1.09214, 0.988423, -0.0428875, 0.0584052, 1.10553, 0.993, -0.0282442, 0.038522, 1.11758, 0.99704, -0.0140183, 0.0190148, 1.12864, 0.999913, 0.000369494, -0.000145203, 1.13901, 0.777662, -8.4153e-06, 0.423844, 1.54403e-05, 0.770458, -0.000211714, 0.419915, 0.00038845, 0.770716, -0.000846888, 0.420055, 0.00155386, 0.770982, -0.00190567, 0.420202, 0.00349653, 0.770981, -0.00338782, 0.420201, 0.00621606, 0.77098, -0.00529338, 0.4202, 0.00971274, 0.770983, -0.00762223, 0.4202, 0.0139867, 0.770985, -0.0103741, 0.420198, 0.0190381, 0.770996, -0.0135489, 0.4202, 0.0248677, 0.771029, -0.0171461, 0.420212, 0.0314764, 0.771052, -0.0211647, 0.420215, 0.0388648, 0.771131, -0.0256048, 0.420245, 0.047036, 0.771235, -0.0304647, 0.420284, 0.0559911, 0.771383, -0.0357436, 0.420341, 0.0657346, 0.771591, -0.0414392, 0.420423, 0.0762694, 0.771819, -0.0475462, 0.420506, 0.0875984, 0.772123, -0.0540506, 0.420617, 0.099727, 0.772464, -0.060797, 0.42072, 0.112637, 0.772855, -0.0675393, 0.420799, 0.126313, 0.773317, -0.0748323, 0.420893, 0.140824, 0.773981, -0.0825681, 0.421058, 0.15617, 0.774746, -0.0906307, 0.421226, 0.172322, 0.77566, -0.0988982, 0.421397, 0.189253, 0.776837, -0.106994, 0.421569, 0.206912, 0.778097, -0.115528, 0.421704, 0.225359, 0.779588, -0.124317, 0.421849, 0.24447, 0.781574, -0.133139, 0.422097, 0.264156, 0.784451, -0.142179, 0.422615, 0.284318, 0.787682, -0.15165, 0.423269, 0.304902, 0.792433, -0.160771, 0.424396, 0.3265, 0.797359, -0.169166, 0.424772, 0.35014, 0.803986, -0.177149, 0.425475, 0.374768, 0.809504, -0.184745, 0.424996, 0.399928, 0.815885, -0.19173, 0.424247, 0.425796, 0.823513, -0.198525, 0.423515, 0.452287, 0.832549, -0.204709, 0.422787, 0.479321, 0.841653, -0.210447, 0.421187, 0.506718, 0.850401, -0.215501, 0.418519, 0.53432, 0.859854, -0.219752, 0.414715, 0.56242, 0.869364, -0.222305, 0.409462, 0.591558, 0.878837, -0.223744, 0.402926, 0.621074, 0.888636, -0.224065, 0.395043, 0.650538, 0.898132, -0.223742, 0.38564, 0.679538, 0.907181, -0.222308, 0.375378, 0.708674, 0.915621, -0.219837, 0.363212, 0.737714, 0.9239, -0.215233, 0.349313, 0.767014, 0.931644, -0.209592, 0.334162, 0.795133, 0.938887, -0.203644, 0.317943, 0.823228, 0.945282, -0.196349, 0.300581, 0.850822, 0.950758, -0.18742, 0.282195, 0.877594, 0.956146, -0.177879, 0.262481, 0.904564, 0.960355, -0.167643, 0.242487, 0.930741, 0.965256, -0.156671, 0.222668, 0.955868, 0.968029, -0.144123, 0.201907, 0.979869, 0.97251, -0.131305, 0.18202, 1.00291, 0.974925, -0.118335, 0.161909, 1.02392, 0.975402, -0.103714, 0.142129, 1.0433, 0.976987, -0.089415, 0.122447, 1.06089, 0.979677, -0.0748858, 0.102248, 1.07713, 0.983184, -0.0596086, 0.0814851, 1.09218, 0.987466, -0.0447671, 0.0609484, 1.10585, 0.992348, -0.0295217, 0.0401835, 1.11829, 0.996674, -0.0143917, 0.0198163, 1.12966, 1.00003, 0.000321364, -0.000149983, 1.1402, 0.757901, -8.69074e-06, 0.436176, 1.51011e-05, 0.751195, -0.000217848, 0.432317, 0.000378533, 0.751178, -0.000871373, 0.432307, 0.0015141, 0.751195, -0.00196061, 0.432317, 0.0034068, 0.751198, -0.00348552, 0.432318, 0.00605659, 0.751195, -0.00544599, 0.432315, 0.00946353, 0.751207, -0.00784203, 0.43232, 0.013628, 0.751213, -0.0106732, 0.43232, 0.0185499, 0.751221, -0.0139393, 0.432319, 0.0242302, 0.751244, -0.0176398, 0.432325, 0.0306694, 0.7513, -0.0217743, 0.432348, 0.0378698, 0.751358, -0.0263412, 0.432367, 0.0458321, 0.751458, -0.0313396, 0.432404, 0.0545587, 0.751608, -0.0367682, 0.432464, 0.0640543, 0.7518, -0.0426246, 0.43254, 0.0743222, 0.752065, -0.0489031, 0.432645, 0.0853668, 0.752376, -0.0555828, 0.432762, 0.0971911, 0.752715, -0.0623861, 0.432859, 0.109768, 0.753137, -0.069415, 0.432958, 0.123126, 0.753676, -0.0770039, 0.433099, 0.137308, 0.754345, -0.084971, 0.433272, 0.15229, 0.755235, -0.0932681, 0.433504, 0.168075, 0.756186, -0.10171, 0.433693, 0.184625, 0.757363, -0.110019, 0.433857, 0.201897, 0.75884, -0.11887, 0.434102, 0.220014, 0.760467, -0.127881, 0.434306, 0.238778, 0.762969, -0.136766, 0.434751, 0.258172, 0.765823, -0.14612, 0.43529, 0.278062, 0.769676, -0.15566, 0.436236, 0.298437, 0.774909, -0.165177, 0.437754, 0.319532, 0.77994, -0.17402, 0.438343, 0.342505, 0.785757, -0.182201, 0.438609, 0.366693, 0.792487, -0.190104, 0.438762, 0.391668, 0.80038, -0.197438, 0.438795, 0.417494, 0.808494, -0.204365, 0.438226, 0.443933, 0.817695, -0.210714, 0.437283, 0.470929, 0.828111, -0.216651, 0.436087, 0.498569, 0.837901, -0.221804, 0.433717, 0.526165, 0.847813, -0.226318, 0.430133, 0.554155, 0.858314, -0.229297, 0.425213, 0.582822, 0.868891, -0.230999, 0.418576, 0.612847, 0.878941, -0.231155, 0.410405, 0.642445, 0.888809, -0.230935, 0.400544, 0.672024, 0.898089, -0.229343, 0.389613, 0.701366, 0.908081, -0.226886, 0.377197, 0.730763, 0.916819, -0.222676, 0.363397, 0.759642, 0.924968, -0.216835, 0.347437, 0.788775, 0.932906, -0.210245, 0.32995, 0.817135, 0.940025, -0.202992, 0.312262, 0.844912, 0.946101, -0.19436, 0.293313, 0.872164, 0.952835, -0.184125, 0.273638, 0.899443, 0.957347, -0.173657, 0.252385, 0.926389, 0.961434, -0.162204, 0.231038, 0.951947, 0.965522, -0.14979, 0.209834, 0.976751, 0.969412, -0.136307, 0.188821, 1.00022, 0.973902, -0.122527, 0.168013, 1.02229, 0.974045, -0.108213, 0.147634, 1.04199, 0.975775, -0.0927397, 0.12705, 1.06019, 0.978383, -0.0778212, 0.106309, 1.07711, 0.98211, -0.0621216, 0.0849279, 1.09245, 0.986517, -0.0463847, 0.0633519, 1.10651, 0.991696, -0.0309353, 0.0419698, 1.11903, 0.996349, -0.0150914, 0.0206272, 1.13073, 1.00003, 0.000442449, -0.000231396, 1.14146, 0.727498, -8.85074e-06, 0.441528, 1.45832e-05, 0.730897, -0.000223525, 0.443589, 0.000368298, 0.730796, -0.000893996, 0.443528, 0.00147303, 0.730805, -0.00201149, 0.443533, 0.00331433, 0.730814, -0.00357596, 0.443538, 0.00589222, 0.730815, -0.00558734, 0.443538, 0.00920678, 0.730822, -0.00804544, 0.44354, 0.0132582, 0.730836, -0.0109501, 0.443545, 0.0180468, 0.730848, -0.0143008, 0.443546, 0.0235732, 0.730871, -0.0180969, 0.443552, 0.0298382, 0.730915, -0.022338, 0.443567, 0.0368438, 0.730982, -0.0270225, 0.443591, 0.044591, 0.731076, -0.0321491, 0.443627, 0.0530831, 0.731245, -0.0377166, 0.443699, 0.0623243, 0.73144, -0.0437216, 0.443777, 0.0723181, 0.7317, -0.0501576, 0.443881, 0.0830691, 0.732034, -0.0569942, 0.444014, 0.0945809, 0.732388, -0.0638756, 0.444113, 0.106825, 0.732853, -0.071203, 0.444247, 0.119859, 0.733473, -0.0790076, 0.444442, 0.13369, 0.734195, -0.0871937, 0.444645, 0.148304, 0.735069, -0.095696, 0.444877, 0.163702, 0.736169, -0.10426, 0.445133, 0.179861, 0.73747, -0.112853, 0.44537, 0.196778, 0.738991, -0.12199, 0.445651, 0.214496, 0.740865, -0.131153, 0.445958, 0.232913, 0.743637, -0.140245, 0.446548, 0.251977, 0.746797, -0.149722, 0.447246, 0.271551, 0.751517, -0.159341, 0.448656, 0.291774, 0.756156, -0.169106, 0.449866, 0.312455, 0.761519, -0.178436, 0.450919, 0.334552, 0.768295, -0.186904, 0.451776, 0.358491, 0.776613, -0.195117, 0.452832, 0.383446, 0.783966, -0.202695, 0.45249, 0.408945, 0.793542, -0.20985, 0.452587, 0.435364, 0.803192, -0.216403, 0.451852, 0.462336, 0.813892, -0.22251, 0.450708, 0.48987, 0.824968, -0.227676, 0.4486, 0.517697, 0.835859, -0.232443, 0.445156, 0.545975, 0.846825, -0.235775, 0.440351, 0.574483, 0.858085, -0.237897, 0.433641, 0.604246, 0.868825, -0.238074, 0.425354, 0.634101, 0.879638, -0.237661, 0.415383, 0.664201, 0.889966, -0.236186, 0.404136, 0.693918, 0.899479, -0.233599, 0.390917, 0.723481, 0.908769, -0.229737, 0.376352, 0.75258, 0.917966, -0.223836, 0.360372, 0.781764, 0.926304, -0.217067, 0.342551, 0.811139, 0.934626, -0.209309, 0.324238, 0.839585, 0.941841, -0.20071, 0.304484, 0.867044, 0.94789, -0.190602, 0.283607, 0.894579, 0.954196, -0.179253, 0.262205, 0.921743, 0.958383, -0.167646, 0.239847, 0.948026, 0.963119, -0.155073, 0.218078, 0.973296, 0.966941, -0.141426, 0.195899, 0.998135, 0.970836, -0.126849, 0.174121, 1.02021, 0.973301, -0.112296, 0.153052, 1.04085, 0.97448, -0.0964965, 0.131733, 1.05946, 0.977045, -0.080489, 0.10997, 1.07693, 0.980751, -0.064844, 0.0881657, 1.09254, 0.985475, -0.0481938, 0.0657987, 1.10697, 0.991089, -0.0319185, 0.0435215, 1.12004, 0.996122, -0.0158088, 0.0214779, 1.13173, 1.00001, 0.000372455, -0.000200295, 1.14291, 0.708622, -9.07597e-06, 0.45304, 1.41962e-05, 0.711162, -0.000228911, 0.454662, 0.000358052, 0.709812, -0.000914446, 0.453797, 0.00143034, 0.709865, -0.00205819, 0.453834, 0.00321935, 0.709864, -0.00365894, 0.453833, 0.00572331, 0.709855, -0.00571692, 0.453826, 0.00894278, 0.709862, -0.00823201, 0.453828, 0.012878, 0.709875, -0.011204, 0.453832, 0.0175295, 0.709896, -0.0146323, 0.453839, 0.0228978, 0.709925, -0.0185163, 0.453847, 0.0289839, 0.709974, -0.0228551, 0.453866, 0.0357894, 0.710045, -0.0276473, 0.453892, 0.0433161, 0.710133, -0.032891, 0.453924, 0.0515665, 0.710292, -0.0385851, 0.453992, 0.0605458, 0.710485, -0.0447254, 0.45407, 0.0702574, 0.710769, -0.0513051, 0.454192, 0.0807077, 0.711106, -0.0582733, 0.454329, 0.091896, 0.711516, -0.0652866, 0.45446, 0.103814, 0.712071, -0.0728426, 0.454653, 0.116508, 0.712676, -0.0808307, 0.45484, 0.129968, 0.713476, -0.0892216, 0.455096, 0.144206, 0.714377, -0.0979047, 0.455346, 0.159212, 0.715579, -0.106531, 0.455647, 0.174973, 0.716977, -0.115492, 0.455961, 0.191504, 0.71862, -0.124821, 0.456315, 0.208835, 0.72084, -0.134079, 0.4568, 0.226869, 0.723786, -0.143427, 0.457521, 0.245582, 0.727464, -0.153061, 0.458475, 0.264957, 0.732771, -0.162768, 0.460239, 0.284948, 0.736515, -0.172627, 0.460899, 0.30522, 0.743519, -0.182487, 0.463225, 0.326717, 0.750041, -0.191295, 0.464027, 0.350113, 0.758589, -0.199746, 0.465227, 0.374782, 0.767703, -0.207584, 0.465877, 0.400226, 0.777484, -0.214973, 0.465996, 0.426442, 0.788792, -0.221796, 0.466019, 0.453688, 0.800194, -0.228038, 0.465083, 0.481246, 0.811234, -0.233346, 0.462506, 0.509086, 0.822859, -0.238073, 0.459257, 0.537338, 0.835082, -0.241764, 0.454863, 0.566108, 0.846332, -0.244241, 0.448163, 0.595126, 0.858355, -0.244736, 0.439709, 0.625574, 0.87034, -0.244278, 0.429837, 0.65617, 0.881027, -0.24255, 0.418002, 0.686029, 0.891007, -0.239912, 0.404325, 0.716039, 0.900874, -0.236133, 0.389222, 0.745518, 0.911072, -0.230672, 0.373269, 0.775026, 0.920359, -0.22356, 0.355083, 0.804521, 0.928604, -0.215591, 0.335533, 0.834045, 0.937175, -0.206503, 0.315278, 0.861612, 0.942825, -0.196684, 0.293653, 0.889131, 0.949805, -0.185116, 0.271503, 0.916853, 0.955535, -0.172703, 0.248821, 0.943541, 0.959843, -0.159978, 0.225591, 0.970132, 0.964393, -0.146375, 0.202719, 0.994709, 0.968008, -0.131269, 0.179928, 1.0186, 0.971013, -0.11569, 0.158007, 1.03928, 0.973334, -0.1003, 0.13624, 1.05887, 0.975775, -0.0833352, 0.1138, 1.07652, 0.979579, -0.0668981, 0.0913141, 1.09297, 0.984323, -0.0500902, 0.0683051, 1.10734, 0.990351, -0.0332377, 0.0451771, 1.12084, 0.995823, -0.0161491, 0.0221705, 1.13296, 1.0001, 0.000234083, -0.000108712, 1.14441, 0.683895, -9.24677e-06, 0.46015, 1.37429e-05, 0.68833, -0.000233383, 0.463134, 0.000346865, 0.688368, -0.000933547, 0.463159, 0.00138748, 0.688367, -0.00210049, 0.463159, 0.00312187, 0.688369, -0.00373415, 0.463159, 0.00555004, 0.688377, -0.00583449, 0.463163, 0.00867216, 0.688386, -0.00840128, 0.463166, 0.0124884, 0.688398, -0.0114343, 0.463169, 0.0169993, 0.688418, -0.0149329, 0.463175, 0.0222054, 0.688453, -0.0188964, 0.463188, 0.028108, 0.688515, -0.0233239, 0.463214, 0.0347085, 0.68857, -0.0282136, 0.463231, 0.0420091, 0.688679, -0.033564, 0.463276, 0.0500132, 0.688854, -0.0393733, 0.463356, 0.0587255, 0.689038, -0.0456354, 0.46343, 0.0681476, 0.689321, -0.0523433, 0.463553, 0.0782897, 0.689662, -0.059412, 0.463693, 0.0891501, 0.690188, -0.0665736, 0.4639, 0.100735, 0.690755, -0.0743106, 0.464107, 0.113074, 0.691405, -0.0824722, 0.464329, 0.126161, 0.692198, -0.0910484, 0.464585, 0.140007, 0.693196, -0.0998778, 0.464893, 0.154612, 0.69454, -0.108651, 0.465285, 0.169984, 0.695921, -0.117855, 0.465596, 0.186106, 0.697749, -0.12734, 0.466056, 0.203034, 0.700375, -0.136714, 0.466771, 0.220703, 0.703395, -0.146386, 0.467579, 0.239062, 0.707904, -0.156096, 0.469067, 0.258188, 0.711673, -0.165904, 0.469851, 0.277759, 0.717489, -0.175812, 0.471815, 0.297935, 0.724051, -0.185931, 0.47389, 0.318916, 0.731965, -0.195238, 0.47587, 0.341591, 0.741151, -0.204021, 0.477523, 0.366062, 0.751416, -0.212113, 0.478881, 0.391396, 0.761848, -0.21979, 0.479226, 0.417599, 0.771886, -0.2267, 0.478495, 0.444401, 0.783998, -0.232991, 0.477622, 0.472084, 0.796523, -0.238645, 0.475833, 0.500193, 0.808851, -0.243396, 0.472568, 0.52865, 0.821191, -0.247226, 0.467857, 0.557362, 0.834261, -0.250102, 0.461871, 0.586768, 0.846762, -0.251056, 0.453543, 0.617085, 0.859867, -0.250604, 0.443494, 0.647659, 0.871948, -0.248783, 0.431711, 0.678119, 0.882967, -0.245855, 0.417911, 0.708399, 0.892826, -0.242168, 0.401993, 0.738256, 0.90332, -0.237062, 0.385371, 0.767999, 0.913633, -0.22997, 0.366837, 0.798191, 0.922774, -0.221687, 0.346372, 0.827756, 0.931371, -0.212345, 0.325682, 0.856425, 0.938929, -0.20206, 0.303665, 0.884299, 0.944821, -0.190981, 0.280786, 0.912023, 0.951792, -0.178065, 0.2573, 0.939669, 0.957712, -0.164634, 0.233448, 0.96655, 0.961912, -0.150863, 0.209504, 0.992366, 0.966382, -0.13577, 0.18597, 1.01633, 0.969588, -0.119593, 0.162905, 1.03843, 0.971777, -0.103203, 0.14053, 1.05841, 0.97433, -0.0865888, 0.117909, 1.07632, 0.978686, -0.0690829, 0.0944101, 1.09326, 0.983281, -0.0516568, 0.0705671, 1.10796, 0.989562, -0.034558, 0.0468592, 1.12182, 0.995465, -0.0167808, 0.0229846, 1.1342, 0.999991, 0.000373016, -0.000235606, 1.1459, 0.662251, -9.39016e-06, 0.468575, 1.32714e-05, 0.666634, -0.000237624, 0.471675, 0.000335842, 0.666411, -0.000950385, 0.471516, 0.00134321, 0.666399, -0.00213833, 0.471509, 0.00302221, 0.666386, -0.0038014, 0.471499, 0.00537283, 0.666405, -0.00593958, 0.471511, 0.00839533, 0.666406, -0.00855253, 0.471508, 0.0120898, 0.666428, -0.0116401, 0.471519, 0.0164569, 0.666444, -0.0152015, 0.471522, 0.0214971, 0.66649, -0.0192362, 0.471543, 0.027212, 0.666537, -0.0237428, 0.471558, 0.033603, 0.666617, -0.0287198, 0.471591, 0.0406728, 0.666718, -0.0341647, 0.471631, 0.0484238, 0.666889, -0.0400759, 0.47171, 0.0568621, 0.667104, -0.0464479, 0.471805, 0.0659915, 0.667374, -0.0532677, 0.471923, 0.0758178, 0.667772, -0.0603805, 0.472098, 0.0863425, 0.668371, -0.0677392, 0.472363, 0.0975917, 0.668971, -0.0756028, 0.472596, 0.109567, 0.669696, -0.0839293, 0.472869, 0.122272, 0.670481, -0.0926683, 0.473126, 0.135718, 0.6715, -0.1016, 0.473442, 0.149914, 0.672911, -0.110566, 0.47389, 0.164882, 0.674512, -0.119984, 0.474354, 0.180602, 0.67651, -0.129574, 0.474922, 0.19711, 0.679292, -0.139106, 0.475764, 0.214371, 0.682798, -0.148993, 0.476886, 0.232405, 0.686955, -0.158737, 0.478179, 0.251153, 0.691406, -0.168754, 0.479432, 0.270436, 0.697438, -0.178703, 0.481481, 0.290374, 0.704761, -0.188955, 0.484143, 0.311044, 0.713599, -0.198814, 0.487007, 0.333003, 0.723194, -0.207869, 0.488962, 0.357144, 0.732601, -0.216189, 0.489815, 0.382169, 0.744193, -0.22398, 0.490888, 0.408227, 0.754907, -0.231156, 0.490355, 0.434928, 0.767403, -0.23747, 0.489548, 0.462599, 0.78107, -0.243503, 0.488274, 0.490908, 0.793893, -0.248114, 0.484843, 0.519421, 0.807296, -0.25222, 0.4803, 0.548561, 0.820529, -0.255265, 0.474097, 0.577772, 0.833716, -0.256741, 0.466041, 0.607782, 0.848403, -0.25637, 0.456547, 0.638807, 0.860755, -0.254804, 0.443946, 0.670058, 0.874012, -0.251834, 0.430852, 0.700749, 0.885619, -0.247867, 0.414903, 0.731446, 0.896069, -0.242634, 0.397276, 0.761191, 0.906266, -0.236093, 0.378535, 0.791053, 0.916759, -0.227543, 0.358038, 0.821298, 0.92523, -0.21783, 0.335705, 0.850747, 0.93436, -0.207534, 0.313797, 0.879258, 0.941631, -0.195983, 0.289671, 0.907734, 0.947564, -0.183567, 0.265319, 0.935206, 0.953681, -0.169345, 0.240815, 0.962739, 0.960008, -0.154909, 0.216119, 0.989227, 0.964145, -0.140161, 0.192096, 1.01465, 0.968171, -0.123411, 0.167855, 1.03737, 0.969859, -0.106525, 0.144817, 1.05767, 0.972666, -0.0891023, 0.12149, 1.0761, 0.977055, -0.0718094, 0.0975306, 1.09336, 0.982527, -0.0534213, 0.0730217, 1.10878, 0.989001, -0.0355579, 0.0483366, 1.12285, 0.99512, -0.0176383, 0.023938, 1.13548, 1.00007, 0.000368831, -0.000211581, 1.14744, 0.651047, -9.60845e-06, 0.484101, 1.2922e-05, 0.644145, -0.000241347, 0.478968, 0.000324578, 0.64396, -0.000965142, 0.478831, 0.00129798, 0.64396, -0.00217154, 0.47883, 0.00292046, 0.643968, -0.00386049, 0.478835, 0.00519202, 0.643974, -0.00603186, 0.478838, 0.0081128, 0.643977, -0.0086854, 0.478836, 0.011683, 0.643982, -0.0118207, 0.478834, 0.0159031, 0.644024, -0.0154374, 0.478856, 0.0207743, 0.644059, -0.0195343, 0.478868, 0.0262975, 0.644122, -0.0241103, 0.478896, 0.0324747, 0.644207, -0.0291638, 0.478933, 0.039309, 0.64432, -0.0346919, 0.478981, 0.0468029, 0.644481, -0.0406919, 0.479053, 0.0549614, 0.644722, -0.047159, 0.479169, 0.0637909, 0.645013, -0.0540748, 0.479302, 0.0732974, 0.645503, -0.0612001, 0.479541, 0.0834898, 0.646117, -0.0687303, 0.479829, 0.0943873, 0.646707, -0.0767846, 0.480061, 0.105991, 0.647431, -0.0852465, 0.480343, 0.11831, 0.64831, -0.0940719, 0.48066, 0.131348, 0.649486, -0.103056, 0.481083, 0.14514, 0.650864, -0.112261, 0.481528, 0.159676, 0.652604, -0.121852, 0.482102, 0.174979, 0.654825, -0.131505, 0.482813, 0.191079, 0.657876, -0.141189, 0.483876, 0.207927, 0.661339, -0.151239, 0.48499, 0.225586, 0.665463, -0.161091, 0.486279, 0.243947, 0.670542, -0.171235, 0.487968, 0.262957, 0.677361, -0.181347, 0.49053, 0.282781, 0.685672, -0.191679, 0.493862, 0.303311, 0.694551, -0.201781, 0.49699, 0.324607, 0.703753, -0.211164, 0.498884, 0.347916, 0.713703, -0.219675, 0.500086, 0.372628, 0.725911, -0.227836, 0.501554, 0.398694, 0.73862, -0.23533, 0.502193, 0.425529, 0.752118, -0.241786, 0.501811, 0.453209, 0.76579, -0.247865, 0.500185, 0.481381, 0.779568, -0.252696, 0.497159, 0.51011, 0.793991, -0.256802, 0.492765, 0.539322, 0.808182, -0.259942, 0.486827, 0.569078, 0.821698, -0.261703, 0.478386, 0.598818, 0.836009, -0.262006, 0.468772, 0.629762, 0.849824, -0.260333, 0.456352, 0.661366, 0.863888, -0.257398, 0.442533, 0.69295, 0.876585, -0.253264, 0.426573, 0.723608, 0.888665, -0.248026, 0.408964, 0.754378, 0.899537, -0.241487, 0.389677, 0.784761, 0.9094, -0.233463, 0.368516, 0.814688, 0.920166, -0.223397, 0.346624, 0.845009, 0.928899, -0.21255, 0.322717, 0.874431, 0.937156, -0.200869, 0.298698, 0.902922, 0.943861, -0.188387, 0.273491, 0.931356, 0.949557, -0.174341, 0.247866, 0.958854, 0.955862, -0.158994, 0.222496, 0.986098, 0.961721, -0.143664, 0.197522, 1.01229, 0.965976, -0.127412, 0.17302, 1.03571, 0.968652, -0.109798, 0.148954, 1.05699, 0.971084, -0.0916787, 0.125044, 1.07587, 0.975584, -0.0739634, 0.100577, 1.09372, 0.98122, -0.055322, 0.0753666, 1.10948, 0.988253, -0.0366825, 0.0498899, 1.12394, 0.99482, -0.0180389, 0.024611, 1.13694, 1.00001, 0.000229839, -0.000188283, 1.14919, 0.613867, -9.64198e-06, 0.479449, 1.23452e-05, 0.621485, -0.000244534, 0.485399, 0.000313091, 0.621429, -0.000978202, 0.485353, 0.00125245, 0.62112, -0.00220004, 0.485114, 0.00281687, 0.621119, -0.0039111, 0.485112, 0.00500783, 0.621122, -0.00611091, 0.485112, 0.00782498, 0.621133, -0.00879922, 0.485117, 0.0112687, 0.621152, -0.0119756, 0.485125, 0.0153394, 0.621183, -0.0156396, 0.485139, 0.0200382, 0.621227, -0.0197898, 0.485158, 0.0253663, 0.621298, -0.0244253, 0.485192, 0.0313261, 0.621388, -0.0295441, 0.485233, 0.0379204, 0.621507, -0.0351432, 0.485286, 0.0451523, 0.621693, -0.0412198, 0.485378, 0.0530277, 0.621933, -0.0477673, 0.485495, 0.0615522, 0.622232, -0.0547574, 0.485635, 0.0707316, 0.622809, -0.0619417, 0.485943, 0.0805883, 0.623407, -0.069625, 0.486232, 0.0911267, 0.62406, -0.077796, 0.486516, 0.102354, 0.624835, -0.0863731, 0.486838, 0.114279, 0.625758, -0.095251, 0.487188, 0.126902, 0.627043, -0.104299, 0.487695, 0.140285, 0.628438, -0.113724, 0.488163, 0.154397, 0.630325, -0.123417, 0.488858, 0.169267, 0.632801, -0.133137, 0.489754, 0.184941, 0.635784, -0.143052, 0.490815, 0.20136, 0.639406, -0.153132, 0.492048, 0.218643, 0.643872, -0.163143, 0.49363, 0.236615, 0.6499, -0.17333, 0.496009, 0.255449, 0.657201, -0.183622, 0.498994, 0.275006, 0.666221, -0.194019, 0.502888, 0.295354, 0.674419, -0.204192, 0.505459, 0.316244, 0.683729, -0.21406, 0.507771, 0.33849, 0.695584, -0.222854, 0.510245, 0.363166, 0.708583, -0.231315, 0.512293, 0.389071, 0.721233, -0.238911, 0.512747, 0.415737, 0.735134, -0.245657, 0.512482, 0.443331, 0.750179, -0.251879, 0.511526, 0.471891, 0.765073, -0.256911, 0.508935, 0.500892, 0.779794, -0.261144, 0.504341, 0.530294, 0.794801, -0.264316, 0.498515, 0.560144, 0.810339, -0.266276, 0.491015, 0.590213, 0.824818, -0.266981, 0.481126, 0.620865, 0.839375, -0.265778, 0.468685, 0.652687, 0.853043, -0.262748, 0.453925, 0.684759, 0.867335, -0.258474, 0.437912, 0.716209, 0.88037, -0.253187, 0.419648, 0.747508, 0.891711, -0.246476, 0.39982, 0.77797, 0.902896, -0.238735, 0.37879, 0.808586, 0.913601, -0.22885, 0.355891, 0.838843, 0.923019, -0.217656, 0.331773, 0.869014, 0.933432, -0.205539, 0.307356, 0.898512, 0.939691, -0.192595, 0.281321, 0.9269, 0.946938, -0.178945, 0.255441, 0.955297, 0.952372, -0.163587, 0.229013, 0.983231, 0.95909, -0.147214, 0.203179, 1.00971, 0.963675, -0.13064, 0.17792, 1.03438, 0.968247, -0.113121, 0.152898, 1.05625, 0.97001, -0.0945824, 0.128712, 1.07598, 0.974458, -0.0755648, 0.103349, 1.094, 0.980168, -0.0571998, 0.0776731, 1.1104, 0.987295, -0.0377994, 0.0514445, 1.12491, 0.994432, -0.0186417, 0.025429, 1.13851, 0.999975, 0.000542714, -0.000282356, 1.15108, 0.592656, -9.80249e-06, 0.486018, 1.19532e-05, 0.598467, -0.000247275, 0.490781, 0.000301531, 0.597934, -0.000988317, 0.490343, 0.00120517, 0.597903, -0.00222366, 0.490319, 0.0027116, 0.597913, -0.00395315, 0.490327, 0.00482077, 0.597919, -0.00617653, 0.490329, 0.00753264, 0.597936, -0.00889375, 0.490339, 0.0108478, 0.597956, -0.0121043, 0.490347, 0.0147668, 0.597992, -0.0158073, 0.490365, 0.0192905, 0.598032, -0.0200017, 0.490382, 0.0244204, 0.598109, -0.0246865, 0.49042, 0.0301593, 0.598215, -0.0298594, 0.490474, 0.03651, 0.59833, -0.0355167, 0.490524, 0.0434757, 0.598525, -0.0416559, 0.490624, 0.0510629, 0.598778, -0.0482692, 0.490753, 0.0592781, 0.599135, -0.0553114, 0.49094, 0.0681304, 0.599802, -0.062542, 0.491328, 0.0776467, 0.600361, -0.0703638, 0.491598, 0.0878184, 0.60101, -0.0786256, 0.491882, 0.0986573, 0.601811, -0.0872962, 0.492232, 0.11018, 0.602861, -0.0962284, 0.492684, 0.1224, 0.604167, -0.10538, 0.493213, 0.135354, 0.605693, -0.114896, 0.493799, 0.149034, 0.607682, -0.124654, 0.494576, 0.163469, 0.610672, -0.13456, 0.4959, 0.178747, 0.613313, -0.144581, 0.496713, 0.194723, 0.617603, -0.154703, 0.498499, 0.211617, 0.622174, -0.16489, 0.500188, 0.229183, 0.628855, -0.175164, 0.503072, 0.247786, 0.636963, -0.185565, 0.506798, 0.267116, 0.644866, -0.195911, 0.509719, 0.28702, 0.653741, -0.206104, 0.512776, 0.307763, 0.664942, -0.216447, 0.516812, 0.329631, 0.67633, -0.22552, 0.519181, 0.353515, 0.690012, -0.234316, 0.521681, 0.379226, 0.704243, -0.242032, 0.523129, 0.405901, 0.719396, -0.249172, 0.523768, 0.433585, 0.734471, -0.255543, 0.522541, 0.462085, 0.750539, -0.260697, 0.520217, 0.491233, 0.766365, -0.26501, 0.516293, 0.521094, 0.781677, -0.268409, 0.509708, 0.551014, 0.797132, -0.270399, 0.501944, 0.581463, 0.812655, -0.271247, 0.492025, 0.612402, 0.828592, -0.270708, 0.480424, 0.643798, 0.844044, -0.268085, 0.465955, 0.67682, 0.857305, -0.263459, 0.448425, 0.708496, 0.87114, -0.258151, 0.430243, 0.74046, 0.884936, -0.251171, 0.410578, 0.771583, 0.895772, -0.243305, 0.38862, 0.802234, 0.906961, -0.234037, 0.365214, 0.833179, 0.917775, -0.222714, 0.34116, 0.86353, 0.927883, -0.210175, 0.31572, 0.893557, 0.936617, -0.196925, 0.289159, 0.922976, 0.943384, -0.182788, 0.261996, 0.951606, 0.949713, -0.167965, 0.235324, 0.979958, 0.955818, -0.151109, 0.208408, 1.00765, 0.961344, -0.133834, 0.182591, 1.03329, 0.965469, -0.115987, 0.156958, 1.0557, 0.968693, -0.09746, 0.132239, 1.07583, 0.973165, -0.0778514, 0.106195, 1.09451, 0.979387, -0.0585067, 0.0797669, 1.11137, 0.98671, -0.0390409, 0.0530263, 1.12643, 0.994093, -0.019408, 0.0263163, 1.14016, 1.00002, 0.000540029, -0.000194487, 1.15299, 0.574483, -9.89066e-06, 0.494533, 1.14896e-05, 0.574478, -0.000249127, 0.494528, 0.000289403, 0.574607, -0.000996811, 0.494637, 0.00115797, 0.574396, -0.00224241, 0.494458, 0.00260498, 0.574377, -0.00398632, 0.49444, 0.00463102, 0.574386, -0.00622836, 0.494445, 0.00723623, 0.574401, -0.0089683, 0.494453, 0.010421, 0.574419, -0.0122056, 0.49446, 0.0141859, 0.574459, -0.0159396, 0.494481, 0.0185322, 0.574525, -0.0201692, 0.49452, 0.0234617, 0.574587, -0.0248924, 0.494547, 0.0289762, 0.574697, -0.0301074, 0.494604, 0.0350797, 0.574853, -0.0358114, 0.494688, 0.0417767, 0.575027, -0.041999, 0.494772, 0.0490718, 0.575294, -0.0486618, 0.494915, 0.0569728, 0.575733, -0.0557148, 0.495173, 0.0654955, 0.576356, -0.0630489, 0.495537, 0.0746612, 0.576944, -0.0709285, 0.495836, 0.0844615, 0.57765, -0.0792723, 0.496177, 0.0949142, 0.578491, -0.0880167, 0.496563, 0.10603, 0.579639, -0.0969462, 0.497096, 0.117841, 0.580989, -0.10622, 0.497684, 0.130367, 0.582587, -0.115861, 0.498337, 0.143609, 0.584951, -0.125605, 0.499414, 0.157625, 0.587602, -0.135608, 0.500518, 0.172413, 0.59076, -0.145742, 0.501767, 0.187999, 0.594992, -0.155934, 0.503542, 0.20445, 0.600656, -0.166303, 0.506135, 0.221764, 0.607816, -0.176681, 0.509542, 0.24002, 0.61522, -0.187071, 0.51263, 0.258992, 0.623702, -0.197465, 0.516021, 0.278773, 0.634192, -0.207816, 0.520422, 0.299377, 0.644936, -0.218183, 0.524073, 0.320802, 0.657888, -0.2278, 0.528049, 0.34384, 0.670666, -0.236747, 0.52986, 0.36916, 0.685626, -0.24484, 0.531892, 0.395867, 0.701304, -0.252071, 0.532727, 0.423488, 0.717727, -0.258714, 0.532146, 0.452201, 0.733914, -0.264211, 0.529883, 0.481579, 0.750529, -0.26859, 0.5259, 0.511558, 0.76747, -0.272046, 0.51999, 0.542042, 0.785189, -0.274225, 0.513083, 0.572799, 0.800954, -0.275189, 0.502936, 0.603816, 0.816962, -0.274946, 0.490921, 0.635461, 0.83336, -0.272695, 0.47684, 0.6676, 0.848143, -0.268223, 0.459405, 0.70051, 0.861818, -0.262768, 0.440319, 0.732902, 0.876828, -0.255872, 0.420123, 0.765084, 0.889312, -0.247703, 0.398379, 0.796391, 0.900412, -0.238381, 0.374496, 0.827333, 0.912251, -0.227783, 0.349874, 0.858385, 0.921792, -0.214832, 0.323181, 0.888652, 0.931273, -0.200949, 0.296624, 0.917763, 0.940295, -0.186537, 0.269211, 0.947878, 0.946812, -0.171538, 0.241447, 0.977016, 0.953588, -0.155254, 0.213829, 1.00501, 0.958841, -0.137156, 0.186807, 1.03179, 0.963746, -0.118699, 0.160706, 1.05502, 0.966468, -0.0998358, 0.135504, 1.07568, 0.971178, -0.0805186, 0.109131, 1.09479, 0.97831, -0.0599348, 0.0818293, 1.1123, 0.985886, -0.0399661, 0.0545872, 1.12771, 0.994021, -0.0198682, 0.0269405, 1.14186, 1.00009, 0.000271022, -0.00012989, 1.15514, 0.538716, -9.90918e-06, 0.486732, 1.09675e-05, 0.550656, -0.000250642, 0.497518, 0.000277412, 0.55057, -0.00100265, 0.497441, 0.00110974, 0.550903, -0.00225672, 0.497733, 0.00249779, 0.550568, -0.00401046, 0.497438, 0.00443906, 0.550574, -0.00626613, 0.49744, 0.00693637, 0.550591, -0.0090226, 0.497449, 0.00998921, 0.550623, -0.0122795, 0.497469, 0.0135984, 0.550667, -0.0160361, 0.497495, 0.0177654, 0.550724, -0.0202908, 0.497526, 0.0224915, 0.550792, -0.0250421, 0.497557, 0.0277795, 0.550918, -0.0302878, 0.49763, 0.0336334, 0.551058, -0.0360241, 0.497701, 0.0400573, 0.551276, -0.0422473, 0.497824, 0.0470585, 0.551551, -0.0489441, 0.497977, 0.0546433, 0.552074, -0.0559596, 0.498312, 0.0628367, 0.552681, -0.0633978, 0.498679, 0.071646, 0.553324, -0.0713176, 0.499031, 0.0810746, 0.554011, -0.0797268, 0.499365, 0.091129, 0.55488, -0.0885238, 0.499779, 0.101837, 0.556171, -0.0974417, 0.500444, 0.113239, 0.557498, -0.106841, 0.501025, 0.125316, 0.559299, -0.116533, 0.501864, 0.138128, 0.561647, -0.126298, 0.502967, 0.151695, 0.564347, -0.136388, 0.504129, 0.16604, 0.567863, -0.146576, 0.505713, 0.181207, 0.572569, -0.156832, 0.507953, 0.197259, 0.578919, -0.167323, 0.511186, 0.214258, 0.585387, -0.177712, 0.514042, 0.232038, 0.593134, -0.188184, 0.517484, 0.250733, 0.603295, -0.198717, 0.522345, 0.270454, 0.613854, -0.209177, 0.526751, 0.290807, 0.626092, -0.219644, 0.531595, 0.312202, 0.637868, -0.229494, 0.534721, 0.334435, 0.652458, -0.238718, 0.538304, 0.359184, 0.666985, -0.247061, 0.539875, 0.385637, 0.683301, -0.254652, 0.541042, 0.41328, 0.69998, -0.261376, 0.540735, 0.441903, 0.717824, -0.267085, 0.539139, 0.471609, 0.734617, -0.271465, 0.534958, 0.501446, 0.753663, -0.27528, 0.53032, 0.532571, 0.770512, -0.277617, 0.522134, 0.563641, 0.787356, -0.278525, 0.51206, 0.595067, 0.806252, -0.278512, 0.50119, 0.627226, 0.822061, -0.277023, 0.486791, 0.659402, 0.838959, -0.273175, 0.470467, 0.692874, 0.85379, -0.267238, 0.450688, 0.725702, 0.868268, -0.260327, 0.429741, 0.75832, 0.881994, -0.251946, 0.407223, 0.790189, 0.893885, -0.242432, 0.383214, 0.821625, 0.905118, -0.231904, 0.357297, 0.853011, 0.916045, -0.219545, 0.330733, 0.883773, 0.927614, -0.205378, 0.303916, 0.914435, 0.936005, -0.190388, 0.275941, 0.944502, 0.944533, -0.1749, 0.247493, 0.974439, 0.950758, -0.158588, 0.218996, 1.00286, 0.957078, -0.141027, 0.191559, 1.0304, 0.962448, -0.121507, 0.164457, 1.05466, 0.964993, -0.102068, 0.138636, 1.0761, 0.970017, -0.0822598, 0.111861, 1.09541, 0.97661, -0.062033, 0.0843438, 1.11317, 0.985073, -0.0409832, 0.0558496, 1.12911, 0.993515, -0.020146, 0.0275331, 1.1438, 1.00006, 0.00027329, -0.000107883, 1.15736, 0.525324, -9.99341e-06, 0.498153, 1.05385e-05, 0.526513, -0.000251605, 0.499277, 0.000265329, 0.526517, -0.00100641, 0.499282, 0.0010613, 0.526588, -0.00226466, 0.499337, 0.00238823, 0.526539, -0.0040255, 0.499302, 0.00424535, 0.526547, -0.00628954, 0.499306, 0.00663364, 0.526561, -0.00905628, 0.499313, 0.00955337, 0.526593, -0.0123253, 0.499334, 0.0130054, 0.526642, -0.0160957, 0.499365, 0.0169911, 0.5267, -0.0203661, 0.499396, 0.0215122, 0.526792, -0.0251347, 0.499451, 0.0265718, 0.526904, -0.0303985, 0.499511, 0.0321732, 0.527079, -0.0361554, 0.499617, 0.0383231, 0.527285, -0.0423982, 0.499731, 0.045026, 0.527602, -0.0491121, 0.499924, 0.0522936, 0.528166, -0.0561127, 0.500306, 0.0601528, 0.52879, -0.0635988, 0.5007, 0.0686059, 0.529421, -0.071581, 0.501048, 0.0776518, 0.530144, -0.0799854, 0.501421, 0.0873148, 0.531062, -0.0888032, 0.501884, 0.0976084, 0.532374, -0.0977643, 0.50259, 0.108588, 0.533828, -0.107197, 0.50329, 0.120234, 0.53581, -0.116887, 0.504312, 0.132602, 0.538063, -0.126755, 0.505365, 0.145721, 0.5409, -0.136819, 0.506668, 0.159617, 0.544882, -0.147117, 0.508731, 0.174369, 0.550238, -0.157446, 0.511601, 0.190028, 0.556038, -0.167988, 0.514431, 0.206587, 0.563031, -0.178364, 0.517808, 0.224046, 0.571543, -0.189007, 0.521937, 0.242503, 0.582255, -0.199546, 0.527415, 0.261977, 0.59272, -0.210084, 0.531682, 0.282162, 0.605648, -0.220448, 0.537123, 0.303426, 0.61785, -0.230593, 0.540664, 0.325323, 0.632223, -0.240238, 0.544467, 0.348993, 0.648819, -0.24887, 0.547594, 0.375462, 0.665825, -0.256657, 0.54912, 0.403024, 0.683389, -0.263711, 0.549294, 0.431773, 0.701495, -0.269666, 0.547649, 0.461494, 0.719197, -0.274169, 0.543786, 0.491623, 0.737906, -0.278124, 0.538644, 0.522994, 0.756652, -0.280632, 0.531057, 0.554775, 0.775279, -0.281741, 0.521972, 0.586441, 0.792688, -0.281652, 0.509613, 0.618596, 0.811894, -0.280345, 0.496497, 0.651462, 0.827938, -0.277128, 0.47968, 0.684023, 0.844837, -0.271646, 0.460688, 0.718024, 0.859239, -0.264397, 0.438872, 0.751207, 0.874088, -0.256144, 0.41577, 0.784232, 0.887693, -0.246311, 0.391369, 0.816191, 0.899402, -0.235497, 0.365872, 0.847828, 0.910973, -0.223631, 0.338618, 0.87934, 0.92204, -0.209874, 0.310803, 0.910325, 0.930987, -0.194265, 0.281802, 0.940695, 0.94, -0.178125, 0.252836, 0.970958, 0.948018, -0.161479, 0.224239, 1.00078, 0.955141, -0.144038, 0.195857, 1.0288, 0.960513, -0.124915, 0.168487, 1.05371, 0.963964, -0.104284, 0.141495, 1.07596, 0.968713, -0.0838732, 0.114437, 1.09628, 0.975524, -0.0635579, 0.0863105, 1.11448, 0.98431, -0.042291, 0.0574774, 1.13069, 0.992916, -0.0209131, 0.0284343, 1.14568, 0.999926, 0.000743097, -0.000379265, 1.15955, 0.501042, -9.98428e-06, 0.498726, 1.00306e-05, 0.502992, -0.000252112, 0.500665, 0.000253283, 0.502417, -0.00100791, 0.500092, 0.00101259, 0.502965, -0.00226919, 0.500621, 0.00227978, 0.502318, -0.00403109, 0.499994, 0.00405011, 0.502333, -0.00629832, 0.500005, 0.00632868, 0.502362, -0.00906907, 0.500027, 0.00911446, 0.502369, -0.0123423, 0.500023, 0.0124078, 0.50243, -0.0161178, 0.500066, 0.016211, 0.502493, -0.0203937, 0.500103, 0.0205256, 0.502592, -0.0251684, 0.500166, 0.0253548, 0.502707, -0.0304389, 0.50023, 0.0307029, 0.502881, -0.0362015, 0.500335, 0.0365753, 0.503124, -0.0424507, 0.500488, 0.0429798, 0.503443, -0.0491582, 0.500686, 0.0499268, 0.504083, -0.0561476, 0.501155, 0.0574541, 0.504668, -0.0636846, 0.501524, 0.0655408, 0.505319, -0.0716834, 0.501904, 0.0742072, 0.50609, -0.0800925, 0.502321, 0.0834699, 0.507122, -0.0888425, 0.502896, 0.0933603, 0.508414, -0.097855, 0.503603, 0.10391, 0.509955, -0.107304, 0.504416, 0.115113, 0.512061, -0.116921, 0.505565, 0.127054, 0.514419, -0.12689, 0.506732, 0.139709, 0.517529, -0.136934, 0.508338, 0.153173, 0.522085, -0.147327, 0.510987, 0.167528, 0.526986, -0.157612, 0.513527, 0.182708, 0.533122, -0.168213, 0.516717, 0.198881, 0.540807, -0.178688, 0.520832, 0.215986, 0.550687, -0.189511, 0.52632, 0.234335, 0.560567, -0.199998, 0.531009, 0.253375, 0.571698, -0.210652, 0.535839, 0.273499, 0.584364, -0.220917, 0.541091, 0.294355, 0.599066, -0.23137, 0.546875, 0.316525, 0.614148, -0.241206, 0.551306, 0.339671, 0.631157, -0.250379, 0.555187, 0.36531, 0.647919, -0.258397, 0.556595, 0.392767, 0.666112, -0.265528, 0.556949, 0.421397, 0.686158, -0.271827, 0.556617, 0.451433, 0.704838, -0.27674, 0.552975, 0.482131, 0.723957, -0.280733, 0.547814, 0.513458, 0.74262, -0.283359, 0.53997, 0.545446, 0.762009, -0.284541, 0.530422, 0.57775, 0.781314, -0.284507, 0.518546, 0.610434, 0.799116, -0.283309, 0.504178, 0.643178, 0.817604, -0.280378, 0.48843, 0.676248, 0.83459, -0.275619, 0.469457, 0.709698, 0.850974, -0.26856, 0.447698, 0.744245, 0.866747, -0.260094, 0.424791, 0.777695, 0.881412, -0.249929, 0.399913, 0.810392, 0.8936, -0.239137, 0.37308, 0.842872, 0.905943, -0.226818, 0.345705, 0.874677, 0.916408, -0.213699, 0.31706, 0.906257, 0.927215, -0.198428, 0.288444, 0.936881, 0.935625, -0.181643, 0.258329, 0.96795, 0.944076, -0.164386, 0.228488, 0.998216, 0.951229, -0.146339, 0.199763, 1.02689, 0.958793, -0.127709, 0.172153, 1.0535, 0.963219, -0.107244, 0.144989, 1.07646, 0.967562, -0.0857764, 0.11685, 1.09675, 0.974866, -0.0645377, 0.0880571, 1.11576, 0.983353, -0.0431732, 0.0587352, 1.13227, 0.992503, -0.0218356, 0.0294181, 1.1478, 1.00003, 0.000605203, -0.000231013, 1.16207, 0.482935, -1.01177e-05, 0.504695, 9.68142e-06, 0.477554, -0.000251521, 0.499071, 0.000240676, 0.477904, -0.00100683, 0.499436, 0.00096342, 0.478368, -0.00226636, 0.499899, 0.0021687, 0.477977, -0.00402719, 0.499513, 0.00385384, 0.477993, -0.00629226, 0.499525, 0.0060221, 0.478011, -0.00906011, 0.499536, 0.00867289, 0.478051, -0.0123305, 0.499566, 0.0118074, 0.478089, -0.016102, 0.499587, 0.0154269, 0.478171, -0.0203736, 0.499645, 0.0195341, 0.478254, -0.025143, 0.499692, 0.0241318, 0.47839, -0.0304071, 0.499779, 0.0292247, 0.478588, -0.0361631, 0.499911, 0.0348196, 0.478812, -0.0424023, 0.500046, 0.0409231, 0.479208, -0.0490724, 0.500326, 0.047552, 0.479841, -0.0560722, 0.500805, 0.0547377, 0.480392, -0.0636125, 0.501152, 0.0624607, 0.481068, -0.0716134, 0.501561, 0.0707473, 0.481898, -0.0800062, 0.502054, 0.0796118, 0.483022, -0.0886568, 0.502728, 0.0890974, 0.484332, -0.0977553, 0.503479, 0.0992099, 0.486126, -0.107173, 0.504546, 0.10999, 0.488066, -0.11677, 0.50557, 0.121476, 0.490521, -0.126725, 0.506849, 0.133672, 0.494232, -0.136793, 0.50911, 0.146731, 0.498302, -0.147116, 0.511345, 0.160577, 0.503565, -0.157446, 0.514344, 0.175335, 0.510902, -0.168121, 0.518824, 0.191207, 0.519263, -0.178799, 0.523666, 0.208058, 0.528204, -0.189407, 0.528296, 0.225875, 0.538854, -0.200145, 0.533724, 0.244782, 0.551278, -0.210701, 0.539833, 0.264753, 0.565222, -0.221303, 0.546131, 0.285745, 0.579403, -0.231688, 0.551496, 0.307592, 0.595469, -0.241718, 0.556809, 0.330582, 0.610929, -0.250992, 0.559641, 0.354995, 0.629433, -0.259602, 0.562379, 0.382471, 0.648504, -0.267038, 0.563676, 0.411126, 0.66756, -0.273388, 0.562092, 0.440924, 0.689143, -0.278788, 0.560807, 0.472118, 0.709056, -0.282783, 0.555701, 0.503774, 0.729855, -0.285836, 0.548698, 0.536364, 0.748954, -0.287078, 0.538544, 0.56895, 0.768373, -0.287133, 0.526711, 0.601991, 0.78827, -0.285839, 0.512511, 0.635403, 0.807465, -0.283238, 0.496323, 0.668797, 0.825194, -0.27906, 0.477638, 0.702584, 0.842203, -0.272286, 0.456253, 0.736393, 0.857749, -0.263854, 0.432412, 0.77096, 0.874799, -0.253943, 0.407806, 0.80489, 0.887497, -0.24237, 0.38033, 0.83771, 0.89966, -0.230278, 0.352446, 0.870376, 0.911753, -0.21646, 0.323268, 0.902256, 0.923011, -0.202071, 0.294314, 0.933306, 0.932375, -0.185519, 0.264104, 0.965177, 0.940537, -0.167604, 0.234035, 0.996303, 0.948904, -0.149068, 0.20412, 1.0261, 0.955263, -0.129539, 0.175431, 1.05304, 0.960303, -0.109932, 0.148116, 1.07617, 0.965512, -0.0880572, 0.119693, 1.09742, 0.973466, -0.0660548, 0.0901619, 1.11721, 0.98284, -0.0439228, 0.0599875, 1.13436, 0.992216, -0.0219588, 0.0298975, 1.15006, 0.999946, 0.000119402, -2.08547e-05, 1.16471, 0.447827, -1.00414e-05, 0.491543, 9.14833e-06, 0.454778, -0.000251257, 0.499172, 0.00022891, 0.453519, -0.00100342, 0.497787, 0.000914184, 0.45357, -0.00225776, 0.497847, 0.00205701, 0.453578, -0.00401371, 0.497855, 0.00365705, 0.45357, -0.00627107, 0.497841, 0.00571453, 0.453598, -0.00902968, 0.497864, 0.00823019, 0.453627, -0.0122888, 0.497882, 0.0112049, 0.453684, -0.0160475, 0.497923, 0.0146405, 0.453764, -0.0203044, 0.49798, 0.0185394, 0.453866, -0.0250576, 0.498049, 0.0229054, 0.453996, -0.0303028, 0.49813, 0.0277424, 0.454196, -0.0360379, 0.498267, 0.0330587, 0.454457, -0.0422521, 0.498445, 0.0388613, 0.454926, -0.0488393, 0.498812, 0.0451767, 0.455525, -0.0558653, 0.499272, 0.0520153, 0.456074, -0.0633772, 0.499625, 0.0593754, 0.456752, -0.0713606, 0.500049, 0.0672751, 0.457648, -0.07971, 0.500615, 0.0757447, 0.458849, -0.0883032, 0.501399, 0.0848231, 0.46029, -0.0974095, 0.502293, 0.0945135, 0.462, -0.106729, 0.503301, 0.104848, 0.464121, -0.116354, 0.504533, 0.115884, 0.466889, -0.126214, 0.506172, 0.127652, 0.470744, -0.136324, 0.508667, 0.14024, 0.47488, -0.146595, 0.510995, 0.153673, 0.480845, -0.157027, 0.514832, 0.168053, 0.488262, -0.167658, 0.519506, 0.183508, 0.496547, -0.178343, 0.524347, 0.199948, 0.506254, -0.188916, 0.52983, 0.217503, 0.517961, -0.199975, 0.536357, 0.236272, 0.531484, -0.210624, 0.543641, 0.256096, 0.545496, -0.221227, 0.550048, 0.277085, 0.559497, -0.231568, 0.555076, 0.298615, 0.575752, -0.241698, 0.560541, 0.321547, 0.591999, -0.251172, 0.564156, 0.345602, 0.610654, -0.260178, 0.567607, 0.371851, 0.630484, -0.268094, 0.56923, 0.40076, 0.651807, -0.274661, 0.569779, 0.430801, 0.67239, -0.280331, 0.566791, 0.461939, 0.693024, -0.284501, 0.562007, 0.493854, 0.715473, -0.287852, 0.555791, 0.526992, 0.736323, -0.28929, 0.546345, 0.560102, 0.755771, -0.289405, 0.534, 0.593543, 0.775424, -0.2881, 0.519114, 0.627256, 0.795447, -0.285562, 0.502543, 0.661464, 0.815319, -0.281416, 0.484773, 0.695206, 0.831769, -0.275523, 0.463445, 0.729044, 0.849464, -0.267516, 0.440269, 0.764069, 0.866775, -0.257584, 0.415049, 0.799089, 0.881252, -0.245817, 0.388049, 0.831948, 0.894209, -0.233127, 0.35889, 0.865526, 0.906922, -0.219579, 0.329915, 0.89818, 0.919686, -0.204491, 0.300441, 0.930013, 0.929044, -0.188962, 0.269445, 0.962061, 0.938393, -0.171079, 0.238402, 0.994214, 0.94661, -0.15199, 0.208204, 1.02533, 0.953095, -0.131953, 0.178653, 1.0529, 0.958644, -0.111233, 0.150684, 1.0771, 0.963925, -0.0903098, 0.122359, 1.09855, 0.971995, -0.0680505, 0.0923342, 1.11874, 0.981658, -0.0448512, 0.0614195, 1.13635, 0.991649, -0.0221931, 0.0303582, 1.15238, 0.999985, 0.000393403, -0.000111086, 1.16772, 0.396806, -9.71563e-06, 0.457671, 8.42355e-06, 0.429186, -0.000249421, 0.495017, 0.00021625, 0.429324, -0.000998052, 0.495173, 0.000865322, 0.429175, -0.00224487, 0.494999, 0.00194637, 0.429129, -0.00399041, 0.494952, 0.00346004, 0.429153, -0.00623476, 0.494974, 0.00540684, 0.429168, -0.0089773, 0.494983, 0.00778714, 0.429207, -0.0122175, 0.495012, 0.0106022, 0.429257, -0.0159542, 0.495047, 0.0138535, 0.429338, -0.0201864, 0.495106, 0.0175443, 0.429431, -0.0249104, 0.495165, 0.0216774, 0.429587, -0.0301252, 0.495279, 0.0262594, 0.429796, -0.0358249, 0.495432, 0.0312968, 0.430065, -0.0419972, 0.495621, 0.0367985, 0.430588, -0.0485144, 0.496061, 0.042798, 0.43113, -0.0555028, 0.496472, 0.0492914, 0.431743, -0.0629852, 0.496904, 0.0562907, 0.432448, -0.0709256, 0.497369, 0.0638056, 0.433414, -0.0791942, 0.498032, 0.071885, 0.434638, -0.0877346, 0.498854, 0.0805517, 0.43611, -0.0968056, 0.499812, 0.0898047, 0.437859, -0.106002, 0.500891, 0.0997142, 0.440017, -0.115648, 0.502198, 0.110289, 0.443236, -0.125427, 0.504389, 0.121644, 0.44697, -0.135492, 0.506809, 0.133769, 0.451689, -0.145746, 0.509858, 0.146787, 0.45811, -0.156219, 0.514247, 0.160793, 0.465305, -0.166834, 0.518816, 0.175791, 0.474085, -0.177546, 0.524331, 0.191906, 0.484808, -0.188262, 0.53104, 0.209199, 0.49732, -0.199346, 0.538511, 0.227825, 0.509693, -0.209951, 0.544554, 0.247269, 0.524367, -0.220533, 0.551616, 0.267978, 0.539228, -0.231082, 0.557368, 0.289672, 0.55644, -0.241342, 0.563782, 0.31268, 0.574204, -0.250964, 0.568851, 0.33651, 0.593388, -0.260306, 0.57312, 0.362219, 0.613358, -0.268667, 0.574916, 0.390322, 0.634512, -0.275591, 0.575053, 0.420478, 0.65563, -0.281328, 0.572404, 0.451614, 0.678265, -0.285948, 0.568893, 0.484112, 0.70011, -0.289408, 0.561878, 0.517348, 0.723005, -0.291328, 0.55359, 0.551355, 0.743744, -0.291418, 0.541099, 0.585109, 0.763949, -0.290252, 0.526489, 0.619487, 0.784186, -0.287648, 0.509496, 0.65404, 0.804304, -0.283782, 0.491484, 0.688649, 0.823629, -0.278067, 0.470517, 0.723133, 0.84094, -0.270588, 0.44705, 0.757163, 0.857852, -0.261188, 0.421252, 0.792816, 0.874934, -0.249313, 0.394191, 0.827248, 0.888709, -0.236492, 0.365359, 0.861074, 0.902589, -0.222185, 0.336016, 0.894417, 0.914201, -0.207314, 0.30527, 0.926825, 0.925978, -0.191146, 0.274532, 0.9595, 0.93512, -0.174135, 0.243393, 0.991583, 0.943656, -0.155231, 0.212414, 1.02356, 0.951719, -0.134403, 0.182005, 1.05239, 0.957164, -0.113023, 0.153043, 1.07754, 0.962656, -0.0914493, 0.124186, 1.09984, 0.970695, -0.0694179, 0.0941654, 1.12, 0.980749, -0.0466199, 0.0629671, 1.13849, 0.991205, -0.0227032, 0.0311146, 1.15494, 0.999884, 0.000632388, -0.000254483, 1.1706, 0.379821, -9.57289e-06, 0.460637, 7.89337e-06, 0.405188, -0.000247483, 0.491396, 0.000204064, 0.404796, -0.000989434, 0.490914, 0.000815853, 0.40483, -0.00222607, 0.490949, 0.00183559, 0.40473, -0.00395723, 0.49084, 0.00326332, 0.404731, -0.00618287, 0.490836, 0.00509945, 0.404768, -0.00890258, 0.490871, 0.00734463, 0.404791, -0.0121156, 0.490883, 0.00999992, 0.404857, -0.0158214, 0.490938, 0.0130676, 0.404943, -0.0200178, 0.491004, 0.0165503, 0.405059, -0.0247027, 0.491093, 0.0204521, 0.405213, -0.0298729, 0.491205, 0.0247788, 0.405399, -0.0355226, 0.491333, 0.0295373, 0.405731, -0.0416352, 0.491604, 0.034741, 0.406303, -0.0480807, 0.492116, 0.0404255, 0.406814, -0.0550458, 0.492506, 0.0465732, 0.407404, -0.0624652, 0.492926, 0.0532058, 0.408149, -0.0702958, 0.493442, 0.0603442, 0.409128, -0.0784623, 0.494136, 0.0680297, 0.410408, -0.087007, 0.495054, 0.0762786, 0.411813, -0.0959639, 0.495962, 0.0851046, 0.413735, -0.105075, 0.497257, 0.0945878, 0.416137, -0.114646, 0.498882, 0.104725, 0.41934, -0.124394, 0.501132, 0.11563, 0.423326, -0.134328, 0.503883, 0.127325, 0.428419, -0.14458, 0.50747, 0.139911, 0.43484, -0.154979, 0.511964, 0.153481, 0.442641, -0.165628, 0.517328, 0.168114, 0.452511, -0.176365, 0.524258, 0.183995, 0.463473, -0.187298, 0.531248, 0.200953, 0.475564, -0.198244, 0.538367, 0.219176, 0.488664, -0.208938, 0.545175, 0.238514, 0.504073, -0.219599, 0.553227, 0.259129, 0.520832, -0.230378, 0.560653, 0.280997, 0.538455, -0.240703, 0.567523, 0.303821, 0.55709, -0.250548, 0.573287, 0.327948, 0.576646, -0.259964, 0.577795, 0.353362, 0.596705, -0.268721, 0.580077, 0.380336, 0.618053, -0.276054, 0.58018, 0.4101, 0.640303, -0.282176, 0.578747, 0.44161, 0.662365, -0.286931, 0.574294, 0.474106, 0.684542, -0.290521, 0.567035, 0.507549, 0.707984, -0.292672, 0.558687, 0.541853, 0.730913, -0.293189, 0.547606, 0.576581, 0.752948, -0.292199, 0.533471, 0.61172, 0.773452, -0.289508, 0.516395, 0.646339, 0.794715, -0.285716, 0.497873, 0.682131, 0.814251, -0.280051, 0.476845, 0.716396, 0.833057, -0.272873, 0.453449, 0.751503, 0.84959, -0.263982, 0.427857, 0.786085, 0.867022, -0.252745, 0.400335, 0.821355, 0.882277, -0.239655, 0.371304, 0.85646, 0.895375, -0.225386, 0.340397, 0.890828, 0.909347, -0.209587, 0.310005, 0.923532, 0.921885, -0.193433, 0.2796, 0.956419, 0.932127, -0.176135, 0.247276, 0.989445, 0.941869, -0.157872, 0.216186, 1.02221, 0.949735, -0.137577, 0.185602, 1.05195, 0.956617, -0.115285, 0.155767, 1.07822, 0.961974, -0.0928418, 0.126103, 1.10149, 0.96972, -0.0700592, 0.0956758, 1.12207, 0.98012, -0.0474671, 0.0643269, 1.1408, 0.990825, -0.0238113, 0.0320863, 1.1577, 0.999876, 0.000381574, -8.12203e-05, 1.17403, 0.367636, -9.61342e-06, 0.469176, 7.53287e-06, 0.380377, -0.000244772, 0.485434, 0.000191797, 0.380416, -0.000978857, 0.485475, 0.000767015, 0.380376, -0.00220165, 0.485435, 0.00172522, 0.380419, -0.00391408, 0.485487, 0.00306734, 0.380438, -0.00611549, 0.485505, 0.00479332, 0.380462, -0.00880558, 0.485525, 0.00690391, 0.380496, -0.0119837, 0.485551, 0.00940039, 0.38056, -0.0156487, 0.485605, 0.0122848, 0.38064, -0.0197988, 0.485666, 0.0155601, 0.380767, -0.0244324, 0.48577, 0.0192313, 0.380909, -0.0295444, 0.485871, 0.0233032, 0.381142, -0.0351321, 0.48606, 0.0277861, 0.381472, -0.0411535, 0.486336, 0.0326939, 0.382015, -0.0475408, 0.486833, 0.0380565, 0.382523, -0.0544395, 0.487231, 0.0438615, 0.383129, -0.061784, 0.487683, 0.0501332, 0.383952, -0.0695085, 0.488313, 0.0568996, 0.38498, -0.0775819, 0.489077, 0.0641952, 0.386331, -0.0860443, 0.490113, 0.0720324, 0.387788, -0.0948406, 0.491099, 0.0804379, 0.389808, -0.103899, 0.492566, 0.0894899, 0.39252, -0.113313, 0.494601, 0.0992098, 0.395493, -0.123007, 0.496619, 0.109641, 0.399826, -0.132859, 0.499912, 0.120919, 0.405341, -0.143077, 0.504061, 0.133107, 0.411932, -0.153465, 0.508905, 0.146263, 0.420591, -0.164108, 0.515482, 0.160544, 0.43101, -0.174893, 0.523191, 0.176123, 0.441881, -0.185839, 0.53026, 0.192757, 0.453919, -0.196633, 0.537295, 0.210535, 0.468715, -0.207611, 0.546156, 0.229886, 0.485182, -0.218517, 0.555173, 0.250543, 0.501926, -0.229249, 0.562728, 0.27221, 0.51785, -0.239481, 0.567494, 0.294892, 0.536947, -0.249395, 0.573889, 0.318987, 0.557115, -0.259, 0.578831, 0.344348, 0.577966, -0.268075, 0.582055, 0.371223, 0.599489, -0.276115, 0.583307, 0.399834, 0.62479, -0.282523, 0.583902, 0.431415, 0.647504, -0.287663, 0.57953, 0.464301, 0.670601, -0.291538, 0.573103, 0.498123, 0.693539, -0.293842, 0.563731, 0.532662, 0.717385, -0.294681, 0.553169, 0.567925, 0.741533, -0.293717, 0.539908, 0.603502, 0.762142, -0.291156, 0.521902, 0.639074, 0.783014, -0.28719, 0.502815, 0.674439, 0.805158, -0.281773, 0.482598, 0.710497, 0.823646, -0.274682, 0.458949, 0.7456, 0.841879, -0.266184, 0.433129, 0.781085, 0.859515, -0.255682, 0.406064, 0.816, 0.875335, -0.242849, 0.376509, 0.851074, 0.890147, -0.228329, 0.345502, 0.886473, 0.903144, -0.212491, 0.31428, 0.920751, 0.916618, -0.195695, 0.282994, 0.954606, 0.927953, -0.178267, 0.251091, 0.988402, 0.937414, -0.159549, 0.219107, 1.02141, 0.946823, -0.140022, 0.18896, 1.05167, 0.954651, -0.118154, 0.158667, 1.07819, 0.959955, -0.0946636, 0.128808, 1.1025, 0.96858, -0.0711792, 0.0973787, 1.12391, 0.97938, -0.0475046, 0.0650965, 1.14322, 0.990498, -0.024059, 0.0326267, 1.16077, 0.999844, -5.12408e-05, 0.000112444, 1.17727, 0.316912, -9.34977e-06, 0.425996, 6.95559e-06, 0.356423, -0.000241372, 0.479108, 0.000179562, 0.356272, -0.000965292, 0.478897, 0.00071811, 0.356262, -0.00217182, 0.478894, 0.00161574, 0.356265, -0.00386092, 0.478895, 0.00287261, 0.356278, -0.0060324, 0.478905, 0.00448907, 0.356293, -0.00868565, 0.478914, 0.00646572, 0.356346, -0.0118207, 0.478965, 0.00880438, 0.356395, -0.0154355, 0.479001, 0.0115066, 0.356484, -0.019529, 0.479075, 0.0145762, 0.356609, -0.0240991, 0.47918, 0.018018, 0.356766, -0.0291413, 0.479305, 0.0218379, 0.357009, -0.0346498, 0.479512, 0.0260454, 0.357424, -0.0405462, 0.479909, 0.0306657, 0.357899, -0.0468825, 0.480337, 0.0357054, 0.358424, -0.0536887, 0.480771, 0.0411728, 0.359041, -0.0609416, 0.481242, 0.0470841, 0.359903, -0.0685239, 0.481943, 0.0534831, 0.360932, -0.0764883, 0.482741, 0.0603795, 0.362196, -0.0848364, 0.483688, 0.0678028, 0.363847, -0.0935002, 0.484947, 0.0758086, 0.365972, -0.102471, 0.486588, 0.0844173, 0.368741, -0.111751, 0.488787, 0.0937199, 0.372146, -0.121334, 0.491405, 0.103732, 0.377114, -0.131147, 0.495604, 0.114608, 0.38226, -0.141213, 0.499436, 0.126345, 0.389609, -0.151632, 0.505334, 0.139116, 0.397925, -0.162073, 0.51168, 0.152995, 0.407824, -0.172819, 0.518876, 0.168071, 0.420014, -0.183929, 0.527639, 0.184495, 0.434266, -0.195032, 0.537588, 0.20232, 0.447352, -0.205792, 0.544379, 0.221189, 0.463726, -0.216704, 0.553422, 0.241616, 0.481406, -0.227531, 0.562074, 0.263298, 0.498707, -0.238017, 0.568227, 0.286116, 0.518039, -0.247936, 0.574473, 0.3101, 0.538277, -0.257437, 0.579191, 0.335401, 0.561166, -0.266829, 0.584807, 0.362246, 0.583189, -0.275329, 0.586476, 0.390609, 0.606024, -0.28234, 0.585578, 0.420998, 0.632419, -0.287924, 0.584496, 0.454357, 0.656128, -0.291972, 0.577766, 0.488233, 0.679953, -0.29456, 0.56875, 0.523248, 0.704654, -0.295816, 0.558388, 0.559168, 0.729016, -0.295157, 0.544826, 0.595326, 0.752062, -0.292779, 0.528273, 0.631864, 0.773138, -0.288681, 0.508482, 0.667793, 0.794869, -0.283358, 0.487341, 0.704035, 0.815101, -0.27608, 0.46354, 0.739925, 0.834212, -0.26767, 0.438672, 0.775539, 0.852368, -0.257397, 0.411239, 0.810895, 0.870207, -0.245689, 0.3829, 0.846472, 0.884063, -0.231452, 0.351496, 0.881788, 0.898284, -0.215561, 0.31895, 0.917438, 0.912964, -0.198208, 0.287367, 0.952422, 0.924666, -0.180426, 0.254487, 0.987551, 0.934429, -0.161525, 0.222226, 1.02142, 0.943485, -0.141197, 0.191143, 1.05218, 0.9521, -0.120085, 0.161112, 1.07937, 0.957876, -0.0975881, 0.130982, 1.10403, 0.966943, -0.0726842, 0.0990553, 1.12616, 0.978313, -0.0483705, 0.0662818, 1.14619, 0.990048, -0.0239072, 0.0329243, 1.16413, 0.999984, 0.000461885, -7.72859e-05, 1.18099, 0.321287, -9.35049e-06, 0.455413, 6.59662e-06, 0.332595, -0.000237513, 0.471437, 0.000167562, 0.332729, -0.000949964, 0.471618, 0.000670192, 0.332305, -0.00213618, 0.471028, 0.00150712, 0.332326, -0.00379765, 0.471055, 0.00267959, 0.332344, -0.00593353, 0.471072, 0.00418751, 0.332356, -0.00854349, 0.471077, 0.00603172, 0.332403, -0.0116268, 0.471121, 0.00821362, 0.332461, -0.0151824, 0.47117, 0.0107357, 0.332552, -0.0192088, 0.471251, 0.0136014, 0.332657, -0.0237024, 0.47133, 0.0168152, 0.332835, -0.0286615, 0.471487, 0.0203853, 0.333083, -0.0340765, 0.471708, 0.0243212, 0.333547, -0.0398563, 0.47219, 0.0286518, 0.333989, -0.0460916, 0.472587, 0.0333763, 0.334532, -0.0527897, 0.473054, 0.0385084, 0.335167, -0.0599284, 0.473568, 0.0440638, 0.33608, -0.0673514, 0.474362, 0.0500962, 0.337146, -0.0752237, 0.475231, 0.0566022, 0.338462, -0.083418, 0.476282, 0.0636272, 0.34014, -0.0919382, 0.477615, 0.0712153, 0.342341, -0.100741, 0.479404, 0.079417, 0.345088, -0.109905, 0.481618, 0.0882631, 0.349049, -0.119369, 0.485081, 0.0978851, 0.353939, -0.129033, 0.489317, 0.108336, 0.359893, -0.139038, 0.494309, 0.119698, 0.366945, -0.149411, 0.499983, 0.132024, 0.375814, -0.159843, 0.507185, 0.145558, 0.387112, -0.170664, 0.516392, 0.160433, 0.40023, -0.181897, 0.526519, 0.176648, 0.412555, -0.192785, 0.53423, 0.193922, 0.427023, -0.203663, 0.542741, 0.212662, 0.443685, -0.214695, 0.552066, 0.232944, 0.461499, -0.225561, 0.560762, 0.254495, 0.480975, -0.236257, 0.569421, 0.277531, 0.501, -0.24639, 0.576101, 0.301724, 0.521691, -0.256101, 0.581493, 0.327112, 0.543478, -0.265289, 0.585221, 0.353917, 0.566094, -0.273938, 0.587614, 0.381941, 0.589578, -0.281679, 0.587991, 0.41172, 0.614583, -0.287655, 0.585928, 0.444148, 0.641813, -0.292228, 0.582092, 0.478617, 0.666189, -0.295172, 0.57398, 0.51397, 0.690475, -0.29648, 0.561676, 0.550118, 0.715543, -0.296203, 0.548758, 0.586933, 0.740405, -0.293999, 0.532792, 0.62384, 0.762183, -0.28998, 0.512735, 0.660723, 0.786069, -0.28478, 0.492402, 0.69807, 0.806812, -0.277568, 0.469058, 0.734422, 0.826987, -0.268951, 0.443017, 0.770946, 0.844588, -0.259049, 0.415501, 0.80699, 0.863725, -0.2471, 0.387328, 0.842107, 0.879137, -0.234157, 0.356108, 0.878078, 0.894634, -0.218719, 0.324315, 0.914058, 0.909162, -0.201293, 0.291813, 0.949922, 0.92072, -0.18267, 0.258474, 0.985337, 0.93158, -0.163212, 0.225593, 1.0205, 0.941238, -0.142771, 0.193986, 1.05273, 0.949293, -0.120956, 0.163392, 1.08075, 0.956226, -0.0985743, 0.132934, 1.10559, 0.96546, -0.075118, 0.101255, 1.12823, 0.977403, -0.0497921, 0.0675441, 1.149, 0.989648, -0.0241574, 0.0334681, 1.16765, 1.00001, 0.0005762, -0.000184807, 1.18519, 0.303474, -9.16603e-06, 0.4542, 6.1243e-06, 0.308894, -0.000232869, 0.462306, 0.000155592, 0.309426, -0.000931661, 0.463093, 0.000622499, 0.308643, -0.0020949, 0.461933, 0.00139979, 0.308651, -0.0037242, 0.461941, 0.00248874, 0.308662, -0.00581873, 0.46195, 0.00388933, 0.308687, -0.00837818, 0.461974, 0.00560247, 0.308728, -0.0114016, 0.462011, 0.00762948, 0.308789, -0.0148884, 0.462067, 0.00997326, 0.308882, -0.0188369, 0.462151, 0.0126375, 0.309007, -0.0232436, 0.462263, 0.0156271, 0.30918, -0.0281054, 0.462417, 0.0189498, 0.309442, -0.0334065, 0.462667, 0.0226167, 0.309901, -0.0390589, 0.463162, 0.0266614, 0.310331, -0.0452042, 0.463555, 0.0310715, 0.310858, -0.0517735, 0.464019, 0.0358698, 0.311576, -0.0587359, 0.464669, 0.0410848, 0.312436, -0.0660383, 0.465406, 0.0467453, 0.313526, -0.0737266, 0.466339, 0.0528718, 0.314903, -0.0817574, 0.467504, 0.0595039, 0.316814, -0.090167, 0.469226, 0.0666888, 0.318965, -0.0987555, 0.470981, 0.0744658, 0.322077, -0.107792, 0.473814, 0.082912, 0.325947, -0.117098, 0.477241, 0.0920846, 0.331008, -0.126602, 0.48184, 0.102137, 0.337893, -0.136619, 0.488334, 0.113135, 0.345106, -0.146838, 0.494415, 0.12511, 0.355111, -0.157357, 0.503275, 0.138356, 0.365095, -0.167955, 0.510966, 0.152686, 0.378344, -0.179157, 0.521508, 0.16856, 0.391599, -0.190143, 0.530455, 0.18561, 0.407786, -0.20123, 0.541275, 0.204308, 0.425294, -0.212456, 0.551784, 0.224623, 0.444021, -0.223568, 0.561493, 0.246172, 0.463418, -0.234154, 0.569886, 0.268979, 0.484077, -0.244546, 0.577116, 0.293411, 0.505513, -0.254301, 0.582914, 0.318936, 0.527672, -0.263564, 0.587208, 0.345856, 0.550565, -0.272332, 0.589277, 0.374054, 0.573656, -0.280011, 0.588426, 0.403276, 0.59827, -0.286924, 0.587504, 0.43474, 0.624731, -0.291994, 0.583401, 0.468767, 0.652396, -0.295159, 0.576997, 0.504411, 0.67732, -0.296954, 0.565863, 0.54114, 0.703147, -0.296877, 0.552316, 0.57816, 0.728715, -0.295147, 0.536773, 0.616124, 0.752448, -0.291275, 0.51771, 0.653885, 0.775169, -0.285905, 0.496087, 0.691537, 0.799307, -0.279064, 0.474232, 0.729251, 0.819482, -0.270294, 0.447676, 0.766267, 0.837659, -0.260032, 0.419656, 0.802616, 0.856903, -0.248497, 0.391328, 0.838583, 0.873325, -0.235252, 0.360285, 0.874711, 0.889788, -0.221126, 0.329215, 0.91077, 0.904486, -0.204304, 0.296392, 0.94653, 0.917711, -0.185562, 0.262159, 0.983828, 0.928969, -0.165635, 0.229142, 1.01955, 0.939707, -0.14442, 0.19673, 1.05317, 0.948167, -0.122147, 0.165095, 1.0823, 0.955222, -0.099098, 0.13451, 1.10791, 0.964401, -0.0755332, 0.102476, 1.1312, 0.976605, -0.0513817, 0.0689667, 1.15218, 0.989085, -0.0258499, 0.034506, 1.17129, 0.999908, 0.000617773, -0.000271268, 1.18961, 0.285803, -9.05752e-06, 0.452348, 5.72272e-06, 0.284689, -0.00022732, 0.450581, 0.000143626, 0.285263, -0.000910214, 0.451482, 0.000575099, 0.285302, -0.00204784, 0.451553, 0.00129395, 0.285318, -0.00364057, 0.451574, 0.0023006, 0.28533, -0.00568813, 0.451585, 0.00359547, 0.285361, -0.00819001, 0.451618, 0.00517934, 0.285397, -0.0111458, 0.45165, 0.007054, 0.285447, -0.0145536, 0.451688, 0.00922167, 0.285527, -0.0184127, 0.451758, 0.0116869, 0.285688, -0.0227207, 0.451929, 0.0144555, 0.28584, -0.0274712, 0.452055, 0.0175341, 0.286136, -0.0326278, 0.452369, 0.0209406, 0.286574, -0.0381792, 0.452853, 0.0246965, 0.287012, -0.0441879, 0.453272, 0.0287996, 0.287542, -0.0506096, 0.453752, 0.033268, 0.288299, -0.0573634, 0.454488, 0.0381504, 0.289186, -0.0645458, 0.455294, 0.0434447, 0.290302, -0.0720405, 0.456301, 0.0491973, 0.291776, -0.0799046, 0.457648, 0.0554453, 0.29372, -0.088117, 0.459483, 0.0622311, 0.296052, -0.0965328, 0.461571, 0.0695992, 0.299563, -0.105409, 0.465085, 0.077658, 0.30335, -0.114553, 0.468506, 0.0864176, 0.309167, -0.123917, 0.474423, 0.0961078, 0.31529, -0.13381, 0.47995, 0.106643, 0.324163, -0.144021, 0.488592, 0.118322, 0.333272, -0.154382, 0.496461, 0.131133, 0.344224, -0.165015, 0.50562, 0.145208, 0.357733, -0.176168, 0.516719, 0.16073, 0.373046, -0.187468, 0.528513, 0.177807, 0.38788, -0.198488, 0.537713, 0.196072, 0.405133, -0.209545, 0.547999, 0.21605, 0.423845, -0.220724, 0.55759, 0.237484, 0.443777, -0.231518, 0.566246, 0.26039, 0.464824, -0.242035, 0.574326, 0.284835, 0.486635, -0.251898, 0.58037, 0.310518, 0.51012, -0.261304, 0.58568, 0.337678, 0.535301, -0.270384, 0.590197, 0.366242, 0.559193, -0.27841, 0.590569, 0.395873, 0.583544, -0.285325, 0.588161, 0.426857, 0.608834, -0.291113, 0.584249, 0.459477, 0.635753, -0.294882, 0.57763, 0.494734, 0.664367, -0.297088, 0.569479, 0.532023, 0.689688, -0.297364, 0.555064, 0.569629, 0.715732, -0.295949, 0.539522, 0.608124, 0.741307, -0.292259, 0.521613, 0.646231, 0.764949, -0.287063, 0.49969, 0.684938, 0.788599, -0.28012, 0.476747, 0.723548, 0.81048, -0.27153, 0.45116, 0.761135, 0.831372, -0.261289, 0.424101, 0.798916, 0.850092, -0.249559, 0.39443, 0.835952, 0.867777, -0.236348, 0.363849, 0.871606, 0.884632, -0.221569, 0.332477, 0.907843, 0.90047, -0.20618, 0.300667, 0.944187, 0.914524, -0.188771, 0.266552, 0.981371, 0.926892, -0.168362, 0.232349, 1.01841, 0.937951, -0.146761, 0.199359, 1.05308, 0.947236, -0.123813, 0.1675, 1.0839, 0.954367, -0.099984, 0.136166, 1.11047, 0.963907, -0.0759278, 0.103808, 1.13414, 0.976218, -0.0511367, 0.0697061, 1.15575, 0.988772, -0.0267415, 0.0352529, 1.17531, 0.999888, -0.000520778, 0.000289926, 1.19389, 0.263546, -8.83274e-06, 0.441896, 5.26783e-06, 0.262352, -0.000221849, 0.439889, 0.000132311, 0.262325, -0.000886683, 0.439848, 0.000528824, 0.26228, -0.00199476, 0.439765, 0.00118975, 0.262372, -0.00354671, 0.439922, 0.00211568, 0.26239, -0.00554141, 0.439941, 0.00330652, 0.262412, -0.00797888, 0.439961, 0.00476346, 0.262453, -0.0108584, 0.440002, 0.00648818, 0.262528, -0.0141788, 0.440085, 0.0084835, 0.262615, -0.017938, 0.440166, 0.0107533, 0.262744, -0.0221346, 0.440291, 0.0133044, 0.262939, -0.026762, 0.440493, 0.0161445, 0.263277, -0.0317573, 0.440889, 0.0192974, 0.26368, -0.0371832, 0.441338, 0.0227699, 0.264106, -0.0430371, 0.441753, 0.0265698, 0.264624, -0.0493035, 0.442227, 0.0307178, 0.265378, -0.0558669, 0.442985, 0.0352616, 0.266253, -0.0628718, 0.443795, 0.0401968, 0.267478, -0.0701569, 0.445008, 0.04559, 0.269062, -0.077845, 0.446599, 0.0514539, 0.270926, -0.0857941, 0.448349, 0.0578382, 0.273693, -0.0940773, 0.451221, 0.0648363, 0.276746, -0.102704, 0.454097, 0.0724389, 0.281693, -0.111735, 0.459517, 0.0808744, 0.287335, -0.121004, 0.46531, 0.0901551, 0.29448, -0.130734, 0.472605, 0.100371, 0.30257, -0.140777, 0.480251, 0.111644, 0.312465, -0.15111, 0.489444, 0.124111, 0.324856, -0.16189, 0.500919, 0.137979, 0.33774, -0.172946, 0.511317, 0.153163, 0.35255, -0.184152, 0.522684, 0.169817, 0.367786, -0.19522, 0.53248, 0.187886, 0.385474, -0.20632, 0.543326, 0.207634, 0.404976, -0.217744, 0.554109, 0.229165, 0.425203, -0.228691, 0.563395, 0.252068, 0.446704, -0.239299, 0.571565, 0.276471, 0.468951, -0.249348, 0.577935, 0.302323, 0.493487, -0.258933, 0.584309, 0.329882, 0.517861, -0.268009, 0.58773, 0.358525, 0.543309, -0.276238, 0.589612, 0.388585, 0.569704, -0.28356, 0.589294, 0.419787, 0.594871, -0.289497, 0.585137, 0.452114, 0.622555, -0.294452, 0.580356, 0.486466, 0.651167, -0.296918, 0.57185, 0.523079, 0.677332, -0.297647, 0.558428, 0.5611, 0.703718, -0.296321, 0.542232, 0.599592, 0.730262, -0.293339, 0.524541, 0.639138, 0.754304, -0.288036, 0.502691, 0.677978, 0.778051, -0.281018, 0.479212, 0.716537, 0.801557, -0.272414, 0.454071, 0.75586, 0.822559, -0.262419, 0.425952, 0.794477, 0.843051, -0.250702, 0.397313, 0.832664, 0.86232, -0.237264, 0.366534, 0.869876, 0.879044, -0.222716, 0.334816, 0.906973, 0.896362, -0.206827, 0.303143, 0.943558, 0.910342, -0.189659, 0.269699, 0.979759, 0.924119, -0.171108, 0.236411, 1.01718, 0.935374, -0.149579, 0.202224, 1.05289, 0.944295, -0.126295, 0.16989, 1.08496, 0.952227, -0.101511, 0.138089, 1.11256, 0.962041, -0.0766392, 0.105053, 1.1375, 0.97528, -0.0511967, 0.070329, 1.15983, 0.988476, -0.025463, 0.0351268, 1.17987, 0.999962, 2.86808e-05, 1.45564e-05, 1.19901, 0.227089, -8.41413e-06, 0.404216, 4.72707e-06, 0.239725, -0.000215083, 0.426708, 0.000120833, 0.239904, -0.000860718, 0.427028, 0.000483555, 0.239911, -0.00193661, 0.427039, 0.00108806, 0.239914, -0.00344276, 0.42704, 0.00193457, 0.239933, -0.00537907, 0.427064, 0.00302363, 0.239944, -0.00774482, 0.427065, 0.00435604, 0.239993, -0.01054, 0.427122, 0.00593398, 0.240052, -0.0137626, 0.427179, 0.00775987, 0.240148, -0.0174115, 0.427279, 0.00983854, 0.240278, -0.021484, 0.42741, 0.0121763, 0.240472, -0.0259729, 0.427618, 0.0147827, 0.240839, -0.0308131, 0.428086, 0.0176837, 0.241201, -0.0360893, 0.428482, 0.0208775, 0.241626, -0.0417723, 0.428907, 0.0243821, 0.242207, -0.0478337, 0.42952, 0.0282228, 0.24298, -0.0542199, 0.430332, 0.0324333, 0.243881, -0.0610015, 0.431222, 0.0370252, 0.245123, -0.0680874, 0.432512, 0.0420535, 0.24667, -0.0755482, 0.434088, 0.0475414, 0.248779, -0.0832873, 0.436323, 0.0535542, 0.251665, -0.0913546, 0.439509, 0.0601716, 0.255305, -0.0998489, 0.443478, 0.0674282, 0.260049, -0.108576, 0.448713, 0.0754673, 0.266192, -0.117754, 0.455524, 0.084339, 0.273158, -0.127294, 0.4627, 0.0941683, 0.282131, -0.137311, 0.472068, 0.10515, 0.293332, -0.147736, 0.483565, 0.117402, 0.304667, -0.158357, 0.493702, 0.130824, 0.317785, -0.169274, 0.504708, 0.145724, 0.333245, -0.180595, 0.517107, 0.16215, 0.349843, -0.191892, 0.528849, 0.180149, 0.367944, -0.203168, 0.540301, 0.199746, 0.387579, -0.214443, 0.551514, 0.221047, 0.408247, -0.225624, 0.560906, 0.243981, 0.43014, -0.236422, 0.56959, 0.268513, 0.452669, -0.24654, 0.576098, 0.294409, 0.476196, -0.256157, 0.580925, 0.322002, 0.501157, -0.265289, 0.584839, 0.351052, 0.527632, -0.273671, 0.587614, 0.3812, 0.555754, -0.281254, 0.589119, 0.412994, 0.581682, -0.287448, 0.585204, 0.445498, 0.608196, -0.292614, 0.579006, 0.479505, 0.635661, -0.296068, 0.571297, 0.514643, 0.664999, -0.297395, 0.560855, 0.552213, 0.691039, -0.296645, 0.544525, 0.591365, 0.7179, -0.293785, 0.526535, 0.630883, 0.744059, -0.289089, 0.50545, 0.670932, 0.76863, -0.282239, 0.482514, 0.710904, 0.793273, -0.273688, 0.457246, 0.750259, 0.814731, -0.26328, 0.428872, 0.78948, 0.835603, -0.251526, 0.399384, 0.828597, 0.85489, -0.238339, 0.368811, 0.866892, 0.872828, -0.223607, 0.336617, 0.90563, 0.889462, -0.207538, 0.303997, 0.943538, 0.904929, -0.190297, 0.270812, 0.980591, 0.919101, -0.172034, 0.237453, 1.01935, 0.930536, -0.152058, 0.204431, 1.05498, 0.941223, -0.129515, 0.172495, 1.08717, 0.94982, -0.104263, 0.140175, 1.11551, 0.960592, -0.0781944, 0.106465, 1.14098, 0.974629, -0.051688, 0.0711592, 1.16418, 0.98811, -0.0253929, 0.0354432, 1.18465, 1.00004, 0.000804378, -0.000330876, 1.20462, 0.214668, -8.21282e-06, 0.406619, 4.33582e-06, 0.218053, -0.000208144, 0.413025, 0.000109887, 0.217987, -0.000832212, 0.412901, 0.000439362, 0.217971, -0.00187246, 0.412876, 0.000988623, 0.217968, -0.00332855, 0.41286, 0.00175772, 0.217985, -0.00520055, 0.412882, 0.00274729, 0.218014, -0.00748814, 0.412916, 0.00395842, 0.218054, -0.0101901, 0.412957, 0.00539274, 0.218106, -0.0133057, 0.413005, 0.00705348, 0.218217, -0.0168342, 0.413139, 0.00894581, 0.218338, -0.0207707, 0.413258, 0.0110754, 0.21855, -0.0251001, 0.413509, 0.0134551, 0.218913, -0.0297861, 0.413992, 0.0161081, 0.219265, -0.0348956, 0.414383, 0.0190307, 0.219696, -0.0403909, 0.414839, 0.0222458, 0.220329, -0.0462003, 0.415567, 0.025792, 0.220989, -0.0524208, 0.41621, 0.0296637, 0.222027, -0.058948, 0.417385, 0.0339323, 0.223301, -0.0658208, 0.418779, 0.0386055, 0.224988, -0.0730347, 0.420665, 0.0437355, 0.227211, -0.0805274, 0.423198, 0.0493844, 0.230131, -0.088395, 0.426566, 0.0556135, 0.233908, -0.0966208, 0.43091, 0.0624829, 0.239092, -0.105223, 0.437148, 0.0701636, 0.245315, -0.11424, 0.444302, 0.0786949, 0.253166, -0.12368, 0.453262, 0.0882382, 0.262374, -0.133569, 0.463211, 0.0988682, 0.273145, -0.143836, 0.474271, 0.110727, 0.285512, -0.154577, 0.4863, 0.123945, 0.299512, -0.165501, 0.498817, 0.138581, 0.314287, -0.176698, 0.510341, 0.154676, 0.331083, -0.188066, 0.522583, 0.172459, 0.349615, -0.199597, 0.534879, 0.191979, 0.369318, -0.210843, 0.546083, 0.21309, 0.390377, -0.222068, 0.5562, 0.235998, 0.412411, -0.233059, 0.564704, 0.260518, 0.435715, -0.24357, 0.572314, 0.286795, 0.461196, -0.253356, 0.579395, 0.314559, 0.485587, -0.262362, 0.581985, 0.343581, 0.511908, -0.270895, 0.584347, 0.374367, 0.539798, -0.278452, 0.58505, 0.406015, 0.567974, -0.284877, 0.583344, 0.439168, 0.594303, -0.290124, 0.577348, 0.473005, 0.622951, -0.294183, 0.570751, 0.508534, 0.652404, -0.296389, 0.561541, 0.544764, 0.679291, -0.296605, 0.546426, 0.582927, 0.706437, -0.294095, 0.528599, 0.622681, 0.734485, -0.28978, 0.508676, 0.663567, 0.758841, -0.283363, 0.484768, 0.704092, 0.78537, -0.275015, 0.460434, 0.745101, 0.807315, -0.264689, 0.432166, 0.784712, 0.8271, -0.252597, 0.401807, 0.824241, 0.849191, -0.239154, 0.371458, 0.863803, 0.867046, -0.224451, 0.338873, 0.903063, 0.8852, -0.208342, 0.306175, 0.942763, 0.901771, -0.190684, 0.272759, 0.981559, 0.915958, -0.172105, 0.239306, 1.02048, 0.928046, -0.152214, 0.206071, 1.05765, 0.939961, -0.130247, 0.17367, 1.08999, 0.948711, -0.10672, 0.142201, 1.11829, 0.959305, -0.0808688, 0.108454, 1.14467, 0.973009, -0.0539145, 0.0728109, 1.16839, 0.987631, -0.0262947, 0.0360625, 1.19004, 0.999978, 0.00132758, -0.000559424, 1.21058, 0.193925, -7.93421e-06, 0.391974, 3.92537e-06, 0.196746, -0.000200315, 0.397675, 9.91033e-05, 0.19667, -0.000801099, 0.397521, 0.000396342, 0.196633, -0.00180246, 0.397445, 0.000891829, 0.196654, -0.00320443, 0.397482, 0.00158582, 0.196659, -0.00500647, 0.39748, 0.00247867, 0.196683, -0.0072086, 0.397506, 0.00357167, 0.196728, -0.00981001, 0.397562, 0.00486675, 0.196792, -0.0128096, 0.397633, 0.00636707, 0.19689, -0.0162055, 0.397746, 0.00807752, 0.197017, -0.0199943, 0.397884, 0.0100052, 0.19729, -0.024139, 0.39827, 0.0121691, 0.197583, -0.0286671, 0.398639, 0.0145755, 0.197927, -0.0335858, 0.399034, 0.0172355, 0.198383, -0.0388806, 0.399554, 0.0201718, 0.199002, -0.0444736, 0.400289, 0.0234194, 0.199739, -0.0504583, 0.401111, 0.026984, 0.200784, -0.056729, 0.402349, 0.0309217, 0.202075, -0.0633643, 0.403841, 0.0352496, 0.203898, -0.0703247, 0.406076, 0.0400313, 0.206199, -0.0775565, 0.408841, 0.0453282, 0.209252, -0.085184, 0.41259, 0.0511794, 0.213638, -0.0931994, 0.418288, 0.0577459, 0.21881, -0.101617, 0.424681, 0.0650508, 0.225642, -0.11052, 0.433429, 0.0732759, 0.233717, -0.119772, 0.442897, 0.0824683, 0.242823, -0.129505, 0.452888, 0.0927484, 0.254772, -0.139906, 0.466407, 0.104417, 0.266603, -0.150402, 0.477413, 0.117211, 0.28073, -0.161395, 0.490519, 0.131598, 0.295399, -0.172465, 0.50201, 0.147407, 0.312705, -0.183982, 0.515311, 0.165031, 0.331335, -0.195532, 0.52786, 0.184336, 0.351037, -0.206971, 0.5392, 0.205361, 0.372175, -0.218117, 0.54941, 0.228043, 0.394548, -0.229327, 0.558642, 0.25267, 0.419598, -0.240052, 0.567861, 0.279071, 0.443922, -0.249937, 0.573332, 0.306882, 0.471495, -0.259407, 0.58013, 0.33661, 0.496769, -0.267749, 0.580564, 0.367328, 0.524951, -0.275524, 0.581696, 0.399753, 0.55318, -0.282148, 0.579885, 0.433134, 0.581577, -0.287533, 0.575471, 0.467534, 0.609231, -0.291612, 0.567445, 0.502943, 0.637478, -0.293911, 0.557657, 0.53871, 0.667795, -0.295096, 0.546535, 0.576568, 0.694272, -0.294073, 0.529561, 0.614929, 0.722937, -0.290386, 0.510561, 0.655909, 0.749682, -0.284481, 0.487846, 0.697663, 0.774754, -0.276188, 0.462487, 0.738515, 0.799301, -0.266215, 0.43481, 0.779802, 0.820762, -0.254116, 0.404879, 0.820045, 0.843231, -0.240393, 0.374559, 0.860294, 0.861857, -0.225503, 0.341582, 0.900965, 0.880815, -0.209382, 0.308778, 0.941727, 0.89766, -0.19155, 0.275232, 0.980916, 0.912926, -0.172346, 0.240938, 1.02162, 0.926391, -0.151799, 0.207223, 1.0597, 0.938429, -0.129968, 0.17484, 1.09291, 0.947834, -0.10651, 0.142984, 1.12248, 0.958432, -0.0824098, 0.109902, 1.149, 0.972402, -0.0565242, 0.0744454, 1.1733, 0.987191, -0.028427, 0.0373794, 1.19538, 0.999975, 3.85685e-05, -4.203e-05, 1.21676, 0.178114, -7.66075e-06, 0.385418, 3.54027e-06, 0.176074, -0.000191966, 0.381002, 8.87135e-05, 0.17601, -0.000767549, 0.380861, 0.000354715, 0.17598, -0.00172696, 0.380798, 0.000798168, 0.175994, -0.00307012, 0.380824, 0.00141928, 0.176017, -0.00479684, 0.380858, 0.00221859, 0.176019, -0.00690648, 0.380839, 0.00319714, 0.176072, -0.00939888, 0.380913, 0.0043572, 0.176131, -0.0122726, 0.380979, 0.005702, 0.176239, -0.0155264, 0.38112, 0.00723689, 0.176371, -0.0191551, 0.381272, 0.00896907, 0.176638, -0.023117, 0.381669, 0.0109194, 0.176912, -0.0274633, 0.382015, 0.0130903, 0.177279, -0.032173, 0.382476, 0.0154949, 0.17774, -0.0372219, 0.383041, 0.0181669, 0.178344, -0.0426132, 0.38378, 0.0211209, 0.179153, -0.0483309, 0.384773, 0.0243899, 0.180197, -0.0543447, 0.386076, 0.0280062, 0.181581, -0.0607122, 0.387809, 0.032004, 0.18344, -0.0673855, 0.390205, 0.036453, 0.186139, -0.0743989, 0.393944, 0.0414162, 0.189432, -0.0817731, 0.39832, 0.0469394, 0.193795, -0.0895464, 0.404188, 0.0531442, 0.199641, -0.0978264, 0.4121, 0.0601374, 0.206679, -0.106499, 0.421425, 0.0680078, 0.214865, -0.115654, 0.431504, 0.076919, 0.224406, -0.125268, 0.442526, 0.0868835, 0.235876, -0.135475, 0.455465, 0.0981875, 0.248335, -0.146023, 0.4681, 0.110759, 0.262868, -0.157016, 0.482069, 0.124885, 0.278962, -0.168245, 0.496182, 0.140645, 0.295082, -0.17958, 0.507401, 0.157838, 0.313738, -0.191227, 0.520252, 0.17695, 0.333573, -0.202718, 0.531708, 0.197817, 0.356433, -0.214424, 0.544509, 0.220785, 0.378853, -0.225492, 0.55373, 0.245306, 0.402717, -0.236236, 0.561348, 0.271593, 0.428375, -0.246568, 0.568538, 0.299776, 0.454724, -0.255941, 0.573462, 0.329433, 0.482291, -0.264511, 0.576356, 0.360598, 0.509706, -0.272129, 0.576446, 0.393204, 0.538805, -0.278979, 0.575298, 0.427227, 0.568919, -0.284528, 0.572154, 0.462157, 0.596804, -0.288801, 0.564691, 0.497997, 0.625987, -0.291334, 0.555134, 0.534467, 0.656414, -0.292722, 0.545051, 0.571736, 0.683916, -0.292185, 0.528813, 0.610158, 0.711809, -0.290043, 0.51106, 0.649061, 0.739547, -0.285246, 0.490103, 0.690081, 0.766914, -0.277647, 0.465523, 0.732554, 0.791375, -0.267603, 0.437718, 0.773982, 0.814772, -0.256109, 0.40882, 0.81609, 0.836691, -0.242281, 0.377823, 0.856849, 0.856984, -0.227155, 0.34496, 0.898363, 0.876332, -0.210395, 0.311335, 0.939471, 0.894988, -0.192612, 0.277703, 0.980799, 0.911113, -0.173236, 0.243019, 1.02215, 0.924092, -0.152258, 0.209037, 1.06139, 0.936828, -0.129575, 0.175909, 1.09635, 0.946869, -0.10594, 0.143852, 1.12707, 0.958284, -0.081318, 0.110289, 1.15419, 0.972325, -0.0556133, 0.0747232, 1.17909, 0.986878, -0.0297899, 0.0383149, 1.20163, 0.999936, -0.00197169, 0.000912402, 1.22338, 0.151174, -7.20365e-06, 0.351531, 3.09789e-06, 0.155594, -0.00018279, 0.361806, 7.8608e-05, 0.156099, -0.000731569, 0.362982, 0.000314615, 0.156053, -0.00164578, 0.362869, 0.000707845, 0.156093, -0.0029261, 0.362961, 0.00125884, 0.156099, -0.00457155, 0.362959, 0.00196783, 0.15612, -0.00658224, 0.362982, 0.00283622, 0.156168, -0.00895774, 0.363048, 0.00386625, 0.156221, -0.0116962, 0.363101, 0.00506109, 0.156324, -0.0147973, 0.363241, 0.00642675, 0.156476, -0.0182503, 0.363448, 0.00797175, 0.156731, -0.0220266, 0.36384, 0.00971484, 0.156994, -0.026176, 0.364179, 0.0116575, 0.157341, -0.0306701, 0.36462, 0.0138207, 0.157867, -0.0354591, 0.365364, 0.0162356, 0.15846, -0.0406141, 0.366111, 0.0189092, 0.159308, -0.0460519, 0.367248, 0.021885, 0.160426, -0.0518096, 0.368767, 0.0252004, 0.161877, -0.0578906, 0.370745, 0.0288825, 0.163995, -0.0642812, 0.373831, 0.0330139, 0.16655, -0.0710067, 0.377366, 0.0376283, 0.170237, -0.0781522, 0.382799, 0.0428493, 0.175096, -0.0857172, 0.389915, 0.0487324, 0.181069, -0.0938025, 0.398487, 0.0554214, 0.188487, -0.102363, 0.408799, 0.0630189, 0.197029, -0.111343, 0.419991, 0.071634, 0.206684, -0.120812, 0.431455, 0.0812797, 0.218698, -0.131033, 0.445746, 0.0923651, 0.230726, -0.141373, 0.457471, 0.104545, 0.245516, -0.152387, 0.472388, 0.118449, 0.261551, -0.163628, 0.486671, 0.133923, 0.277437, -0.174814, 0.49762, 0.150849, 0.296662, -0.186713, 0.51162, 0.169924, 0.31795, -0.198513, 0.525435, 0.190848, 0.339422, -0.210119, 0.536267, 0.213504, 0.362143, -0.221354, 0.545982, 0.237947, 0.387198, -0.23224, 0.555364, 0.264427, 0.412349, -0.24257, 0.561489, 0.292519, 0.439274, -0.252284, 0.566903, 0.322561, 0.466779, -0.261023, 0.569614, 0.353952, 0.496011, -0.26899, 0.571589, 0.387278, 0.524964, -0.275498, 0.570325, 0.421356, 0.556518, -0.281449, 0.568792, 0.457314, 0.584363, -0.285526, 0.560268, 0.493199, 0.614214, -0.28844, 0.55205, 0.530276, 0.645684, -0.289777, 0.541906, 0.56855, 0.673446, -0.289722, 0.526464, 0.606927, 0.701924, -0.287792, 0.509872, 0.645945, 0.73037, -0.284315, 0.490649, 0.685564, 0.757405, -0.278804, 0.467964, 0.726511, 0.784025, -0.269543, 0.441468, 0.768601, 0.808255, -0.258117, 0.41216, 0.811321, 0.830739, -0.244728, 0.380606, 0.853496, 0.851914, -0.229428, 0.348111, 0.895374, 0.872586, -0.212508, 0.314732, 0.937674, 0.891581, -0.194025, 0.280338, 0.979869, 0.907641, -0.174711, 0.245203, 1.02253, 0.922233, -0.153509, 0.21077, 1.06371, 0.935878, -0.130418, 0.177399, 1.09972, 0.946338, -0.105558, 0.144507, 1.13124, 0.957265, -0.080059, 0.110508, 1.15973, 0.971668, -0.0539766, 0.0742311, 1.18515, 0.9866, -0.0277101, 0.0375224, 1.20858, 1.00021, -0.000515531, 0.000135226, 1.23135, 0.137468, -6.86011e-06, 0.345041, 2.73315e-06, 0.13703, -0.000173378, 0.343936, 6.90761e-05, 0.136986, -0.000693048, 0.34383, 0.000276126, 0.136964, -0.00155931, 0.343761, 0.000621337, 0.137003, -0.00277211, 0.343863, 0.00110494, 0.137012, -0.00433103, 0.343868, 0.00172744, 0.137043, -0.00623606, 0.343916, 0.00249022, 0.13709, -0.0084868, 0.343986, 0.00339559, 0.137145, -0.0110814, 0.344045, 0.00444687, 0.137242, -0.0140187, 0.344177, 0.00565007, 0.137431, -0.0172713, 0.344491, 0.00701868, 0.137644, -0.0208605, 0.344805, 0.00856042, 0.13791, -0.024792, 0.345172, 0.0102863, 0.138295, -0.0290461, 0.345734, 0.0122185, 0.138764, -0.0335957, 0.346371, 0.0143771, 0.139415, -0.038467, 0.347298, 0.0167894, 0.140272, -0.0436176, 0.348527, 0.0194895, 0.141457, -0.0491016, 0.350276, 0.0225043, 0.14303, -0.0548764, 0.352646, 0.0258962, 0.145289, -0.0610096, 0.356206, 0.0297168, 0.148502, -0.0674777, 0.361488, 0.0340562, 0.152188, -0.074345, 0.367103, 0.0389534, 0.157359, -0.0817442, 0.375247, 0.0445541, 0.16379, -0.0896334, 0.385064, 0.0509535, 0.171376, -0.098005, 0.396082, 0.0582611, 0.179901, -0.106817, 0.407418, 0.06654, 0.189892, -0.116239, 0.420031, 0.075994, 0.201838, -0.12627, 0.434321, 0.0867239, 0.214311, -0.136701, 0.447631, 0.0987517, 0.228902, -0.147616, 0.462046, 0.112353, 0.245107, -0.158871, 0.476942, 0.127605, 0.262292, -0.170261, 0.490285, 0.144469, 0.281215, -0.182017, 0.503783, 0.163282, 0.301058, -0.193729, 0.515505, 0.183873, 0.322752, -0.205512, 0.52682, 0.206466, 0.347547, -0.217214, 0.539473, 0.231194, 0.370969, -0.227966, 0.546625, 0.257288, 0.397533, -0.238555, 0.55472, 0.285789, 0.42398, -0.248278, 0.559468, 0.315746, 0.452928, -0.257422, 0.564095, 0.347724, 0.482121, -0.265306, 0.565426, 0.380922, 0.510438, -0.272043, 0.563205, 0.415639, 0.541188, -0.277614, 0.561087, 0.451702, 0.571667, -0.281927, 0.554922, 0.48845, 0.602432, -0.285015, 0.546838, 0.526442, 0.634126, -0.286512, 0.537415, 0.564896, 0.662816, -0.286388, 0.522906, 0.604037, 0.692411, -0.284734, 0.507003, 0.643795, 0.720946, -0.281297, 0.488398, 0.68298, 0.748293, -0.276262, 0.466353, 0.723466, 0.776931, -0.269978, 0.443573, 0.764565, 0.801065, -0.260305, 0.415279, 0.805838, 0.825843, -0.247426, 0.384773, 0.849985, 0.84807, -0.232437, 0.352555, 0.893174, 0.869122, -0.215806, 0.318642, 0.936564, 0.888963, -0.197307, 0.28381, 0.980253, 0.905547, -0.177203, 0.247888, 1.02463, 0.918554, -0.155542, 0.212904, 1.06714, 0.931395, -0.131948, 0.1787, 1.10451, 0.941749, -0.106723, 0.145902, 1.13694, 0.954551, -0.0804939, 0.111193, 1.1666, 0.970279, -0.0534239, 0.0744697, 1.19249, 0.986117, -0.0257452, 0.0368788, 1.21665, 0.999938, 0.00190634, -0.0010291, 1.23981, 0.118493, -6.47439e-06, 0.32272, 2.3772e-06, 0.118765, -0.000163023, 0.323456, 5.98573e-05, 0.118772, -0.00065212, 0.323477, 0.000239447, 0.118843, -0.00146741, 0.323657, 0.000538881, 0.118804, -0.00260846, 0.323553, 0.00095826, 0.118826, -0.00407576, 0.323595, 0.00149845, 0.118846, -0.00586826, 0.323617, 0.00216047, 0.118886, -0.00798578, 0.32367, 0.00294679, 0.118947, -0.0104273, 0.323753, 0.00386124, 0.119055, -0.0131909, 0.323922, 0.00490999, 0.119241, -0.0162444, 0.324251, 0.00610804, 0.11944, -0.0196339, 0.324544, 0.00745805, 0.119739, -0.0233378, 0.325026, 0.00897805, 0.12011, -0.0273179, 0.325586, 0.0106895, 0.120571, -0.0316143, 0.326231, 0.0126073, 0.12124, -0.0361939, 0.327264, 0.0147654, 0.122162, -0.0410511, 0.328733, 0.0172001, 0.123378, -0.0462233, 0.330659, 0.0199375, 0.125183, -0.0517109, 0.333754, 0.0230498, 0.127832, -0.0575652, 0.338507, 0.026597, 0.130909, -0.0637441, 0.343666, 0.0306345, 0.135221, -0.0704302, 0.351063, 0.035273, 0.14082, -0.0776364, 0.360604, 0.0406137, 0.146781, -0.0852293, 0.369638, 0.0466788, 0.155121, -0.0935351, 0.3827, 0.0537628, 0.16398, -0.102234, 0.39522, 0.0617985, 0.173926, -0.111465, 0.40793, 0.07097, 0.185137, -0.121296, 0.42105, 0.0813426, 0.19826, -0.13169, 0.435735, 0.0931596, 0.212938, -0.142614, 0.450932, 0.106547, 0.229046, -0.153884, 0.465726, 0.121575, 0.246246, -0.165382, 0.479461, 0.138286, 0.264637, -0.176806, 0.492106, 0.15666, 0.284959, -0.188793, 0.504774, 0.17728, 0.308157, -0.200763, 0.518805, 0.19988, 0.330951, -0.21239, 0.528231, 0.224293, 0.3549, -0.223521, 0.536376, 0.250541, 0.381502, -0.234169, 0.544846, 0.278902, 0.409529, -0.244077, 0.551717, 0.309227, 0.437523, -0.253363, 0.55517, 0.341426, 0.467624, -0.261659, 0.557772, 0.37518, 0.497268, -0.268498, 0.556442, 0.41007, 0.528294, -0.274018, 0.553915, 0.446445, 0.559053, -0.278169, 0.549153, 0.483779, 0.589329, -0.281229, 0.539878, 0.522249, 0.622503, -0.282902, 0.53162, 0.561754, 0.652382, -0.282815, 0.518119, 0.601544, 0.681847, -0.281247, 0.502187, 0.641574, 0.712285, -0.277986, 0.484824, 0.682633, 0.740094, -0.273017, 0.463483, 0.723426, 0.768478, -0.266692, 0.441299, 0.763747, 0.794556, -0.258358, 0.415238, 0.805565, 0.819408, -0.248807, 0.386912, 0.847254, 0.843411, -0.236214, 0.356165, 0.891091, 0.862397, -0.219794, 0.320562, 0.936174, 0.883113, -0.201768, 0.285322, 0.982562, 0.90023, -0.181672, 0.249713, 1.02862, 0.915192, -0.159279, 0.214546, 1.07163, 0.928458, -0.134725, 0.180285, 1.10995, 0.94069, -0.10913, 0.147119, 1.14354, 0.953409, -0.0821315, 0.112492, 1.17372, 0.969537, -0.0542677, 0.0752014, 1.20043, 0.985612, -0.0259096, 0.0370361, 1.22528, 0.999835, 0.00298198, -0.00151801, 1.24959, 0.10097, -6.02574e-06, 0.300277, 2.02619e-06, 0.101577, -0.000152164, 0.302077, 5.11662e-05, 0.101572, -0.000608889, 0.302066, 0.000204751, 0.101566, -0.00136997, 0.302047, 0.000460753, 0.101592, -0.00243557, 0.302114, 0.000819497, 0.101608, -0.0038053, 0.30214, 0.00128154, 0.101627, -0.00547906, 0.30216, 0.0018483, 0.101669, -0.00745647, 0.302224, 0.00252223, 0.101732, -0.00973615, 0.302318, 0.00330716, 0.101844, -0.0123097, 0.302513, 0.00421061, 0.102025, -0.0151681, 0.30285, 0.00524481, 0.102224, -0.0183334, 0.303166, 0.0064154, 0.102515, -0.0217819, 0.303654, 0.00774063, 0.102886, -0.0255067, 0.304243, 0.0092398, 0.103395, -0.029514, 0.305089, 0.0109339, 0.104109, -0.0337912, 0.306301, 0.0128561, 0.105074, -0.0383565, 0.30798, 0.0150338, 0.10654, -0.0432132, 0.310726, 0.0175228, 0.108478, -0.0484244, 0.314351, 0.0203648, 0.111015, -0.0539339, 0.319032, 0.0236325, 0.114682, -0.0598885, 0.32605, 0.0274188, 0.11911, -0.0663375, 0.334109, 0.0317905, 0.124736, -0.0733011, 0.344013, 0.0368502, 0.131479, -0.0807744, 0.355358, 0.0427104, 0.139283, -0.0888204, 0.367614, 0.0494788, 0.148054, -0.0973394, 0.380072, 0.0572367, 0.159037, -0.10665, 0.395678, 0.0662704, 0.169794, -0.116221, 0.40795, 0.0763192, 0.18314, -0.126632, 0.423546, 0.087956, 0.197515, -0.137383, 0.438213, 0.101042, 0.213514, -0.148641, 0.453248, 0.115827, 0.23065, -0.160117, 0.46688, 0.132283, 0.249148, -0.171807, 0.479962, 0.150644, 0.270219, -0.183695, 0.494618, 0.171073, 0.292338, -0.195574, 0.506937, 0.193378, 0.314999, -0.207205, 0.516463, 0.217585, 0.340991, -0.218955, 0.528123, 0.24428, 0.367982, -0.229917, 0.537025, 0.272784, 0.39432, -0.239737, 0.541627, 0.302742, 0.423364, -0.249048, 0.546466, 0.335112, 0.453751, -0.257329, 0.549466, 0.369032, 0.48416, -0.264623, 0.549503, 0.404577, 0.515262, -0.270411, 0.547008, 0.441337, 0.547036, -0.274581, 0.542249, 0.479162, 0.576614, -0.277266, 0.533015, 0.517904, 0.611143, -0.279144, 0.525512, 0.558508, 0.640989, -0.279001, 0.51154, 0.598995, 0.671182, -0.277324, 0.495641, 0.639935, 0.700848, -0.273908, 0.477526, 0.681017, 0.729862, -0.269063, 0.457955, 0.722764, 0.758273, -0.262282, 0.434846, 0.764349, 0.784121, -0.254281, 0.409203, 0.806206, 0.809798, -0.24505, 0.382694, 0.848617, 0.834953, -0.233861, 0.354034, 0.892445, 0.856817, -0.221308, 0.321764, 0.936263, 0.877609, -0.205996, 0.288118, 0.982401, 0.897489, -0.186702, 0.253277, 1.02975, 0.913792, -0.164618, 0.217963, 1.07488, 0.92785, -0.140023, 0.183221, 1.11487, 0.940378, -0.11328, 0.149385, 1.14947, 0.95273, -0.0853958, 0.114152, 1.1807, 0.969059, -0.0568698, 0.0769845, 1.20912, 0.985574, -0.0276502, 0.0381186, 1.23498, 0.999943, 0.00239052, -0.00126861, 1.25987, 0.0852715, -5.60067e-06, 0.279021, 1.71162e-06, 0.0854143, -0.000140871, 0.279483, 4.30516e-05, 0.0854191, -0.000563385, 0.2795, 0.000172184, 0.0854188, -0.00126753, 0.279493, 0.000387464, 0.0854229, -0.00225337, 0.279501, 0.00068918, 0.0854443, -0.00352086, 0.279549, 0.00107803, 0.0854697, -0.00506962, 0.279591, 0.00155536, 0.0855093, -0.00689873, 0.279652, 0.00212354, 0.0855724, -0.00900821, 0.279752, 0.00278703, 0.0856991, -0.0113799, 0.280011, 0.0035551, 0.085855, -0.0140314, 0.280297, 0.00443449, 0.0860682, -0.016963, 0.280682, 0.00543636, 0.086344, -0.0201438, 0.281159, 0.0065788, 0.0867426, -0.0235999, 0.281886, 0.00787977, 0.087239, -0.0273069, 0.282745, 0.0093606, 0.0879815, -0.031269, 0.284139, 0.011056, 0.0891258, -0.035531, 0.28647, 0.0130065, 0.0906909, -0.0400947, 0.289708, 0.0152495, 0.0927624, -0.0449638, 0.293904, 0.0178454, 0.0958376, -0.0502427, 0.300471, 0.0208915, 0.0995827, -0.0559514, 0.30806, 0.0244247, 0.104526, -0.0622152, 0.317874, 0.0285721, 0.110532, -0.0690046, 0.329332, 0.0334227, 0.117385, -0.0763068, 0.341217, 0.0390466, 0.12522, -0.084184, 0.353968, 0.0455786, 0.134037, -0.0925248, 0.366797, 0.0530773, 0.144014, -0.101487, 0.380209, 0.0617424, 0.156013, -0.111273, 0.395956, 0.071777, 0.168872, -0.121431, 0.41053, 0.0830905, 0.183089, -0.132105, 0.425073, 0.0959341, 0.198763, -0.143286, 0.439833, 0.110448, 0.216159, -0.154841, 0.454507, 0.126769, 0.234859, -0.166588, 0.468368, 0.14495, 0.255879, -0.178626, 0.482846, 0.165233, 0.27677, -0.190218, 0.493489, 0.187217, 0.301184, -0.202227, 0.506549, 0.211659, 0.325852, -0.213764, 0.5158, 0.237922, 0.352824, -0.22487, 0.525442, 0.26632, 0.380882, -0.235246, 0.532487, 0.296691, 0.410137, -0.244847, 0.537703, 0.329179, 0.439787, -0.253122, 0.540361, 0.363135, 0.472291, -0.260517, 0.542734, 0.399222, 0.501856, -0.266519, 0.538826, 0.436352, 0.534816, -0.270905, 0.535152, 0.474505, 0.565069, -0.273826, 0.525979, 0.513988, 0.597154, -0.275333, 0.516394, 0.554852, 0.630473, -0.275314, 0.506206, 0.596592, 0.660574, -0.273323, 0.489769, 0.638117, 0.692015, -0.270008, 0.472578, 0.680457, 0.720647, -0.265001, 0.452134, 0.723008, 0.750528, -0.258311, 0.430344, 0.765954, 0.777568, -0.250046, 0.405624, 0.809012, 0.80387, -0.240114, 0.378339, 0.852425, 0.828439, -0.228737, 0.349877, 0.895346, 0.851472, -0.216632, 0.318968, 0.940695, 0.873906, -0.202782, 0.287489, 0.987235, 0.89467, -0.187059, 0.254394, 1.03348, 0.912281, -0.168818, 0.221294, 1.07812, 0.927358, -0.146494, 0.18675, 1.11928, 0.940385, -0.120009, 0.152322, 1.15609, 0.952672, -0.0917183, 0.117514, 1.18875, 0.968496, -0.0620321, 0.0797405, 1.21821, 0.985236, -0.0314945, 0.0402383, 1.24523, 0.99998, -0.000575153, 0.000110644, 1.27133, 0.0702429, -5.12222e-06, 0.255273, 1.40947e-06, 0.0702981, -0.000128826, 0.255469, 3.54488e-05, 0.0703691, -0.000515562, 0.255727, 0.000141874, 0.0703805, -0.00116, 0.255754, 0.00031929, 0.0703961, -0.00206224, 0.255813, 0.000567999, 0.0704102, -0.00322223, 0.255839, 0.00088871, 0.0704298, -0.00463928, 0.255863, 0.00128272, 0.0704759, -0.00631375, 0.255953, 0.00175283, 0.0705434, -0.00824317, 0.256079, 0.00230342, 0.0706693, -0.010412, 0.25636, 0.0029443, 0.0708189, -0.0128439, 0.256647, 0.00368031, 0.0710364, -0.0155177, 0.257084, 0.00452614, 0.0713223, -0.0184374, 0.257637, 0.00549706, 0.0717182, -0.0216002, 0.258416, 0.00661246, 0.072321, -0.0249966, 0.259699, 0.00790147, 0.0731446, -0.0286566, 0.261475, 0.0093884, 0.0743352, -0.0325888, 0.264132, 0.0111186, 0.0760676, -0.036843, 0.26815, 0.013145, 0.078454, -0.0414292, 0.273636, 0.0155251, 0.0818618, -0.0464634, 0.281653, 0.0183525, 0.0857382, -0.0519478, 0.289992, 0.0216642, 0.0908131, -0.0579836, 0.30066, 0.0255956, 0.0967512, -0.0645124, 0.312204, 0.0301954, 0.103717, -0.0716505, 0.325001, 0.0356017, 0.111596, -0.0793232, 0.338129, 0.041896, 0.120933, -0.087645, 0.352853, 0.0492447, 0.130787, -0.096492, 0.366192, 0.0576749, 0.142311, -0.105973, 0.380864, 0.0673969, 0.155344, -0.116182, 0.396575, 0.0785899, 0.169535, -0.126815, 0.411443, 0.0912377, 0.185173, -0.138015, 0.426256, 0.105607, 0.201755, -0.149325, 0.439607, 0.121551, 0.221334, -0.161207, 0.455467, 0.139608, 0.241461, -0.173162, 0.469096, 0.159591, 0.26294, -0.18504, 0.481014, 0.18156, 0.286776, -0.196881, 0.493291, 0.205781, 0.311596, -0.208311, 0.503556, 0.231819, 0.338667, -0.219671, 0.513268, 0.260274, 0.366021, -0.230451, 0.519414, 0.290862, 0.395875, -0.240131, 0.526766, 0.323196, 0.425564, -0.248566, 0.52905, 0.357071, 0.457094, -0.256195, 0.530796, 0.393262, 0.488286, -0.262331, 0.528703, 0.430797, 0.522291, -0.267141, 0.52727, 0.470231, 0.554172, -0.270411, 0.519848, 0.510477, 0.586427, -0.271986, 0.510307, 0.551594, 0.619638, -0.27192, 0.499158, 0.593849, 0.650656, -0.269817, 0.483852, 0.636314, 0.68284, -0.266267, 0.467515, 0.679679, 0.714356, -0.26113, 0.44931, 0.723884, 0.742717, -0.254067, 0.425789, 0.767245, 0.770894, -0.245652, 0.401144, 0.811819, 0.797358, -0.235554, 0.374224, 0.856315, 0.823377, -0.223896, 0.346167, 0.901077, 0.847456, -0.210865, 0.316056, 0.946502, 0.870697, -0.196574, 0.284503, 0.993711, 0.891068, -0.180814, 0.251628, 1.04134, 0.909267, -0.163314, 0.219065, 1.08609, 0.925653, -0.143304, 0.186446, 1.12702, 0.940017, -0.121322, 0.153416, 1.16371, 0.952398, -0.0973872, 0.120334, 1.19712, 0.967568, -0.0698785, 0.08352, 1.22791, 0.984772, -0.0390031, 0.0439209, 1.25672, 1.00026, -0.0070087, 0.00315668, 1.28428, 0.0556653, -4.59654e-06, 0.227325, 1.12556e-06, 0.0565238, -0.000116382, 0.230826, 2.84985e-05, 0.0565717, -0.000465666, 0.231026, 0.000114036, 0.0565859, -0.00104773, 0.231079, 0.000256656, 0.0565761, -0.00186255, 0.231025, 0.00045663, 0.0565913, -0.00291002, 0.231058, 0.000714664, 0.0566108, -0.00418998, 0.231085, 0.00103224, 0.0566532, -0.00570206, 0.231169, 0.00141202, 0.0567473, -0.00743666, 0.231417, 0.00186018, 0.0568567, -0.00940298, 0.231661, 0.00238264, 0.0569859, -0.0115991, 0.231895, 0.00298699, 0.0572221, -0.0140096, 0.232456, 0.00368957, 0.057519, -0.0166508, 0.233096, 0.00450303, 0.0579534, -0.01951, 0.234094, 0.00544945, 0.0585922, -0.0225991, 0.235629, 0.00655564, 0.0595647, -0.0259416, 0.238106, 0.00785724, 0.0609109, -0.0295661, 0.241557, 0.00939127, 0.0628751, -0.0335126, 0.246652, 0.0112198, 0.0656908, -0.0378604, 0.254091, 0.0134168, 0.0691347, -0.0426543, 0.262666, 0.0160374, 0.0732165, -0.0478967, 0.272029, 0.0191514, 0.0782863, -0.0536716, 0.283007, 0.0228597, 0.0843973, -0.0600683, 0.295732, 0.0272829, 0.0913598, -0.0670095, 0.308779, 0.032484, 0.0994407, -0.0745516, 0.322886, 0.0385886, 0.108189, -0.082712, 0.336408, 0.0457133, 0.118574, -0.0914927, 0.351692, 0.0539832, 0.129989, -0.100854, 0.366502, 0.0635162, 0.142722, -0.110837, 0.381675, 0.0744386, 0.156654, -0.121353, 0.3963, 0.0868483, 0.172151, -0.132414, 0.411477, 0.100963, 0.188712, -0.143809, 0.42508, 0.116795, 0.208093, -0.155765, 0.441328, 0.134715, 0.227936, -0.167608, 0.454328, 0.154396, 0.249495, -0.179579, 0.467235, 0.176179, 0.27362, -0.191488, 0.480248, 0.200193, 0.296371, -0.202618, 0.487886, 0.225775, 0.324234, -0.214133, 0.499632, 0.25441, 0.353049, -0.225212, 0.509532, 0.285077, 0.381785, -0.234875, 0.514265, 0.317047, 0.414038, -0.244205, 0.521282, 0.351874, 0.445251, -0.252145, 0.522931, 0.388279, 0.476819, -0.258433, 0.520947, 0.425825, 0.509209, -0.263411, 0.517669, 0.465104, 0.542759, -0.266732, 0.512841, 0.505741, 0.574822, -0.268263, 0.503317, 0.547611, 0.609324, -0.268489, 0.493035, 0.590953, 0.641772, -0.266941, 0.478816, 0.63488, 0.674049, -0.263297, 0.462863, 0.679072, 0.705071, -0.257618, 0.442931, 0.723487, 0.734709, -0.250625, 0.421299, 0.768708, 0.763704, -0.24179, 0.397085, 0.814375, 0.791818, -0.231115, 0.370577, 0.859907, 0.817439, -0.21922, 0.34232, 0.906715, 0.843202, -0.205658, 0.312627, 0.953943, 0.866639, -0.190563, 0.280933, 1.00185, 0.888129, -0.173978, 0.248393, 1.05105, 0.907239, -0.155485, 0.216007, 1.09704, 0.923893, -0.134782, 0.183233, 1.13857, 0.938882, -0.11249, 0.150376, 1.17539, 0.952464, -0.0890706, 0.117177, 1.20924, 0.968529, -0.0646523, 0.0813095, 1.24055, 0.984763, -0.038606, 0.0439378, 1.27018, 1.00053, -0.01238, 0.00598668, 1.29873, 0.0437928, -4.09594e-06, 0.204012, 8.79224e-07, 0.0440166, -0.000103395, 0.205049, 2.21946e-05, 0.0440529, -0.000413633, 0.205225, 8.87981e-05, 0.0440493, -0.000930594, 0.2052, 0.000199858, 0.0439884, -0.00165352, 0.204901, 0.000355495, 0.0440716, -0.0025849, 0.205255, 0.000556983, 0.0440968, -0.00372222, 0.205311, 0.000805326, 0.0441359, -0.00506478, 0.205391, 0.00110333, 0.0442231, -0.00660384, 0.205638, 0.00145768, 0.0443254, -0.00835246, 0.205877, 0.00187275, 0.0444832, -0.0102992, 0.20627, 0.00235938, 0.0447001, -0.0124449, 0.206796, 0.0029299, 0.0450168, -0.0147935, 0.207593, 0.0036005, 0.0454816, -0.017336, 0.208819, 0.00439246, 0.0462446, -0.0201156, 0.211036, 0.00533864, 0.0473694, -0.0231568, 0.214388, 0.00646984, 0.0490191, -0.0264941, 0.219357, 0.00783856, 0.0512776, -0.030184, 0.226061, 0.00950182, 0.0541279, -0.0342661, 0.234094, 0.0115156, 0.0578989, -0.0388539, 0.244297, 0.0139687, 0.0620835, -0.0438735, 0.254457, 0.0169015, 0.0673497, -0.04951, 0.266706, 0.0204554, 0.0731759, -0.0556263, 0.278753, 0.0246606, 0.0803937, -0.0624585, 0.29309, 0.0297126, 0.0879287, -0.0697556, 0.305856, 0.0355868, 0.0970669, -0.0778795, 0.321059, 0.0425768, 0.106508, -0.0863541, 0.333873, 0.05056, 0.11776, -0.0955935, 0.349008, 0.0598972, 0.130081, -0.105438, 0.363776, 0.0706314, 0.144454, -0.115899, 0.380112, 0.0828822, 0.1596, -0.126827, 0.394843, 0.0967611, 0.176097, -0.138161, 0.409033, 0.112381, 0.194726, -0.149904, 0.424257, 0.129952, 0.213944, -0.161675, 0.436945, 0.149333, 0.235516, -0.173659, 0.450176, 0.170892, 0.260564, -0.185963, 0.466305, 0.194984, 0.285183, -0.197582, 0.477328, 0.220805, 0.311095, -0.208697, 0.486566, 0.248694, 0.338924, -0.219519, 0.494811, 0.279015, 0.369757, -0.229766, 0.504065, 0.311725, 0.3996, -0.238879, 0.507909, 0.345844, 0.430484, -0.246802, 0.509805, 0.381749, 0.46413, -0.253924, 0.511436, 0.420251, 0.497077, -0.259319, 0.508787, 0.459957, 0.530434, -0.263297, 0.50394, 0.501356, 0.565725, -0.265619, 0.49804, 0.544252, 0.599254, -0.265842, 0.487346, 0.587856, 0.631251, -0.263978, 0.472975, 0.631969, 0.663972, -0.26043, 0.457135, 0.677471, 0.697724, -0.255358, 0.439844, 0.723744, 0.727725, -0.248308, 0.417872, 0.770653, 0.756417, -0.239181, 0.39273, 0.817357, 0.785419, -0.22814, 0.367839, 0.864221, 0.81266, -0.215681, 0.339449, 0.912701, 0.839391, -0.201623, 0.309279, 0.962419, 0.86366, -0.185624, 0.278029, 1.0122, 0.885028, -0.16797, 0.245294, 1.06186, 0.904639, -0.148336, 0.212689, 1.10934, 0.922048, -0.12637, 0.179616, 1.15063, 0.936952, -0.102928, 0.146749, 1.18885, 0.951895, -0.0785268, 0.112733, 1.22352, 0.967198, -0.0530153, 0.0760056, 1.25681, 0.984405, -0.02649, 0.0383183, 1.28762, 1.00021, 0.00070019, -0.00020039, 1.31656, 0.0325964, -3.55447e-06, 0.176706, 6.55682e-07, 0.0329333, -8.99174e-05, 0.178527, 1.65869e-05, 0.0329181, -0.000359637, 0.178453, 6.63498e-05, 0.0329085, -0.000808991, 0.178383, 0.000149332, 0.0329181, -0.00143826, 0.178394, 0.000265873, 0.0329425, -0.00224678, 0.178517, 0.000416597, 0.0329511, -0.00323575, 0.17849, 0.000603299, 0.033011, -0.00439875, 0.178695, 0.000829422, 0.0330733, -0.00574059, 0.178843, 0.00109908, 0.0331857, -0.00725896, 0.179176, 0.00141933, 0.0333445, -0.00895289, 0.179618, 0.0017999, 0.0335674, -0.0108219, 0.180238, 0.00225316, 0.033939, -0.0128687, 0.181417, 0.00279765, 0.0345239, -0.015114, 0.183395, 0.0034564, 0.0354458, -0.017596, 0.186616, 0.00425864, 0.0368313, -0.0203524, 0.191547, 0.00524936, 0.0386115, -0.0234105, 0.197508, 0.00647033, 0.0410303, -0.0268509, 0.205395, 0.00798121, 0.0442245, -0.0307481, 0.215365, 0.0098557, 0.0478659, -0.0350863, 0.225595, 0.0121417, 0.0522416, -0.0399506, 0.236946, 0.0149385, 0.0574513, -0.045357, 0.249442, 0.0183189, 0.0631208, -0.0512863, 0.261222, 0.0223644, 0.0701124, -0.0579273, 0.275418, 0.0272418, 0.0777331, -0.0650652, 0.288989, 0.0329458, 0.0862709, -0.0728813, 0.302546, 0.0396819, 0.096103, -0.081363, 0.317164, 0.04757, 0.106976, -0.0904463, 0.331733, 0.0567012, 0.119175, -0.100105, 0.34661, 0.067202, 0.132919, -0.110375, 0.362249, 0.0792588, 0.147727, -0.121115, 0.376978, 0.0928672, 0.163618, -0.132299, 0.390681, 0.108228, 0.182234, -0.143887, 0.406571, 0.125502, 0.201809, -0.155827, 0.42042, 0.144836, 0.225041, -0.168357, 0.438411, 0.166706, 0.247621, -0.18004, 0.450368, 0.189909, 0.27097, -0.191536, 0.460083, 0.215251, 0.296658, -0.203024, 0.469765, 0.243164, 0.325892, -0.214056, 0.481837, 0.273388, 0.35406, -0.224104, 0.487474, 0.305344, 0.384372, -0.233489, 0.492773, 0.339741, 0.41749, -0.241874, 0.498451, 0.376287, 0.45013, -0.248834, 0.499632, 0.414195, 0.481285, -0.254658, 0.495233, 0.454077, 0.519183, -0.259367, 0.496401, 0.496352, 0.551544, -0.261818, 0.487686, 0.538798, 0.587349, -0.262964, 0.479453, 0.583626, 0.621679, -0.262128, 0.467709, 0.629451, 0.654991, -0.258998, 0.452123, 0.67566, 0.686873, -0.254119, 0.433495, 0.723248, 0.719801, -0.246946, 0.413657, 0.771156, 0.750355, -0.237709, 0.390366, 0.81989, 0.780033, -0.226549, 0.364947, 0.868601, 0.809254, -0.214186, 0.337256, 0.920034, 0.836576, -0.199639, 0.307395, 0.971706, 0.861774, -0.183169, 0.275431, 1.02479, 0.885707, -0.165111, 0.243431, 1.07837, 0.904742, -0.144363, 0.210921, 1.12783, 0.915604, -0.121305, 0.17647, 1.17254, 0.930959, -0.0962119, 0.143106, 1.21012, 0.948404, -0.069969, 0.108112, 1.24474, 0.967012, -0.0427586, 0.0708478, 1.27718, 0.984183, -0.0147043, 0.032335, 1.3083, 0.999577, 0.0142165, -0.00726867, 1.3382, 0.0229227, -2.99799e-06, 0.148623, 4.62391e-07, 0.0232194, -7.58796e-05, 0.15054, 1.17033e-05, 0.0232315, -0.000303636, 0.15063, 4.68397e-05, 0.0232354, -0.000683189, 0.150624, 0.000105472, 0.0232092, -0.0012136, 0.150445, 0.000187744, 0.0232523, -0.00189765, 0.150679, 0.000294847, 0.0232828, -0.00273247, 0.150789, 0.000428013, 0.0233371, -0.00371287, 0.150995, 0.000591134, 0.0234015, -0.00484794, 0.15118, 0.000787642, 0.023514, -0.00612877, 0.151562, 0.00102547, 0.023679, -0.00756125, 0.152116, 0.00131351, 0.0239559, -0.00914651, 0.153162, 0.00166594, 0.0244334, -0.010904, 0.155133, 0.00210182, 0.025139, -0.0128615, 0.158035, 0.00264406, 0.0262598, -0.0150628, 0.162751, 0.00332923, 0.0277875, -0.0175532, 0.168944, 0.00419773, 0.0298472, -0.0203981, 0.176835, 0.00530034, 0.0325444, -0.023655, 0.186686, 0.00669777, 0.0355581, -0.0272982, 0.196248, 0.00842661, 0.0392841, -0.0314457, 0.207352, 0.0105854, 0.0436815, -0.0361157, 0.219279, 0.0132458, 0.0485272, -0.0412932, 0.230728, 0.0164736, 0.0541574, -0.0470337, 0.242994, 0.0203715, 0.0609479, -0.0535002, 0.257042, 0.0250953, 0.0685228, -0.0605409, 0.27102, 0.0306856, 0.0768042, -0.0680553, 0.28406, 0.037193, 0.0864844, -0.0765011, 0.299186, 0.0449795, 0.0969415, -0.0852674, 0.3132, 0.0538316, 0.108478, -0.0947333, 0.327138, 0.0641149, 0.121705, -0.10481, 0.342345, 0.0759185, 0.136743, -0.115474, 0.358472, 0.0894116, 0.152986, -0.126536, 0.374067, 0.104562, 0.170397, -0.138061, 0.388267, 0.121632, 0.191392, -0.150203, 0.406467, 0.140996, 0.211566, -0.161751, 0.418641, 0.161696, 0.233567, -0.173407, 0.430418, 0.184557, 0.257769, -0.185397, 0.44277, 0.210092, 0.28531, -0.197048, 0.457191, 0.237827, 0.311726, -0.20784, 0.464712, 0.267253, 0.340537, -0.218345, 0.472539, 0.299332, 0.372921, -0.228306, 0.482331, 0.333988, 0.402924, -0.236665, 0.484378, 0.369722, 0.434475, -0.244097, 0.484717, 0.407836, 0.469736, -0.250547, 0.487093, 0.448465, 0.505045, -0.25511, 0.485575, 0.490263, 0.540262, -0.258444, 0.481225, 0.534495, 0.576347, -0.259903, 0.473481, 0.579451, 0.608656, -0.259572, 0.4603, 0.625604, 0.646679, -0.257908, 0.450341, 0.674511, 0.679902, -0.253663, 0.431561, 0.723269, 0.714159, -0.247419, 0.412684, 0.773263, 0.745345, -0.239122, 0.389388, 0.824182, 0.778248, -0.228837, 0.365361, 0.876634, 0.807208, -0.216197, 0.337667, 0.92945, 0.835019, -0.201772, 0.307197, 0.985261, 0.860261, -0.185291, 0.274205, 1.04299, 0.877601, -0.165809, 0.240178, 1.09816, 0.898211, -0.143897, 0.207571, 1.14694, 0.915789, -0.119513, 0.174904, 1.19008, 0.931831, -0.0932919, 0.141423, 1.2297, 0.949244, -0.0656528, 0.105603, 1.26553, 0.967527, -0.0370262, 0.0679551, 1.29986, 0.984139, -0.00730117, 0.0283133, 1.33252, 0.999713, 0.0234648, -0.0121785, 1.36397, 0.0152135, -2.45447e-06, 0.122795, 3.04092e-07, 0.0151652, -6.15778e-05, 0.122399, 7.6292e-06, 0.0151181, -0.000245948, 0.122023, 3.04802e-05, 0.0151203, -0.000553394, 0.12203, 6.86634e-05, 0.015125, -0.000983841, 0.122037, 0.000122463, 0.0151427, -0.00153774, 0.12214, 0.000192706, 0.0151708, -0.0022103, 0.122237, 0.000281219, 0.0152115, -0.00300741, 0.12238, 0.000390804, 0.0152877, -0.00392494, 0.1227, 0.000526317, 0.015412, -0.00496597, 0.123244, 0.00069443, 0.0156201, -0.00613314, 0.124228, 0.00090547, 0.0159658, -0.00744113, 0.125945, 0.0011732, 0.0165674, -0.00892546, 0.129098, 0.00151888, 0.017487, -0.010627, 0.133865, 0.00197007, 0.018839, -0.0126043, 0.140682, 0.0025637, 0.020554, -0.0148814, 0.148534, 0.00333637, 0.0226727, -0.0175123, 0.157381, 0.00433738, 0.0251879, -0.0205266, 0.166685, 0.00561664, 0.0283635, -0.0240319, 0.177796, 0.00725563, 0.0318694, -0.0279432, 0.188251, 0.00928811, 0.0361044, -0.0324313, 0.200038, 0.011835, 0.0406656, -0.0373527, 0.210685, 0.0149146, 0.0463846, -0.0430132, 0.224182, 0.0187254, 0.0525696, -0.0491013, 0.23634, 0.0232283, 0.0598083, -0.0559175, 0.250013, 0.0286521, 0.0679437, -0.0633657, 0.263981, 0.0350634, 0.0771181, -0.0714602, 0.278072, 0.0425882, 0.0881273, -0.0803502, 0.29511, 0.0514487, 0.0996628, -0.0896903, 0.309976, 0.0615766, 0.112702, -0.099644, 0.325611, 0.0732139, 0.126488, -0.109829, 0.339321, 0.0862324, 0.142625, -0.120859, 0.35574, 0.101275, 0.15953, -0.131956, 0.369845, 0.117892, 0.176991, -0.143145, 0.38146, 0.136205, 0.199715, -0.155292, 0.40052, 0.157252, 0.220787, -0.167066, 0.412055, 0.179966, 0.243697, -0.178396, 0.423133, 0.204418, 0.272106, -0.190433, 0.439524, 0.232141, 0.297637, -0.201265, 0.447041, 0.261109, 0.325273, -0.211834, 0.454488, 0.292627, 0.357219, -0.221889, 0.465004, 0.326669, 0.387362, -0.230729, 0.468527, 0.362426, 0.423131, -0.23924, 0.475836, 0.401533, 0.45543, -0.246067, 0.475017, 0.441902, 0.493393, -0.251557, 0.478017, 0.484239, 0.526253, -0.255571, 0.4709, 0.528586, 0.560554, -0.257752, 0.463167, 0.574346, 0.599306, -0.258076, 0.456452, 0.621655, 0.634541, -0.256471, 0.443725, 0.670492, 0.668907, -0.253283, 0.428719, 0.721943, 0.705619, -0.247562, 0.411348, 0.772477, 0.739034, -0.240626, 0.388939, 0.8264, 0.771408, -0.231493, 0.36425, 0.881702, 0.803312, -0.220125, 0.337321, 0.9385, 0.828457, -0.206645, 0.305364, 0.997437, 0.854819, -0.190664, 0.273715, 1.05693, 0.878666, -0.171429, 0.242218, 1.11251, 0.898404, -0.149235, 0.209556, 1.16398, 0.917416, -0.12435, 0.176863, 1.21014, 0.933133, -0.0972703, 0.142775, 1.25178, 0.95066, -0.0683607, 0.106735, 1.29028, 0.968589, -0.0378724, 0.0681609, 1.32703, 0.984776, -0.00605712, 0.0273966, 1.36158, 0.99994, 0.0263276, -0.0138124, 1.3943, 0.00867437, -1.86005e-06, 0.0928979, 1.73682e-07, 0.00864003, -4.66389e-05, 0.0925237, 4.35505e-06, 0.00864593, -0.000186594, 0.0925806, 1.74322e-05, 0.00864095, -0.000419639, 0.0924903, 3.92862e-05, 0.00863851, -0.000746272, 0.0924589, 7.02598e-05, 0.00868531, -0.00116456, 0.0929, 0.000111188, 0.00869667, -0.00167711, 0.0928529, 0.000163867, 0.00874332, -0.00228051, 0.0930914, 0.00023104, 0.00882709, -0.00297864, 0.0935679, 0.00031741, 0.00898874, -0.00377557, 0.0946165, 0.000430186, 0.00929346, -0.00469247, 0.0967406, 0.000580383, 0.00978271, -0.00575491, 0.100084, 0.000783529, 0.0105746, -0.00701514, 0.105447, 0.00106304, 0.0116949, -0.00851797, 0.112494, 0.00144685, 0.0130419, -0.0102757, 0.119876, 0.00196439, 0.0148375, -0.012381, 0.129034, 0.00266433, 0.0168725, -0.01482, 0.137812, 0.00358364, 0.0193689, -0.0176563, 0.147696, 0.00478132, 0.0222691, -0.0209211, 0.157795, 0.00631721, 0.0256891, -0.0246655, 0.168431, 0.00826346, 0.0294686, -0.0288597, 0.178587, 0.0106714, 0.0340412, -0.0336441, 0.190251, 0.0136629, 0.0393918, -0.039033, 0.202999, 0.0173272, 0.0453947, -0.0450087, 0.215655, 0.0217448, 0.0521936, -0.0515461, 0.228686, 0.0269941, 0.0600279, -0.058817, 0.242838, 0.033272, 0.0692398, -0.0667228, 0.258145, 0.0406457, 0.0793832, -0.0752401, 0.273565, 0.0492239, 0.0902297, -0.0841851, 0.287735, 0.0590105, 0.102014, -0.0936479, 0.301161, 0.0702021, 0.116054, -0.103967, 0.317438, 0.0832001, 0.13191, -0.114622, 0.334166, 0.0977951, 0.148239, -0.125452, 0.348192, 0.113985, 0.165809, -0.136453, 0.361094, 0.131928, 0.184616, -0.147648, 0.373534, 0.151811, 0.207491, -0.159607, 0.39101, 0.174476, 0.230106, -0.171119, 0.402504, 0.198798, 0.257036, -0.182906, 0.418032, 0.225796, 0.281172, -0.193605, 0.425468, 0.254027, 0.312034, -0.204771, 0.440379, 0.285713, 0.340402, -0.214988, 0.445406, 0.319196, 0.370231, -0.224711, 0.44968, 0.35537, 0.407105, -0.233516, 0.460747, 0.393838, 0.439037, -0.240801, 0.460624, 0.433747, 0.47781, -0.24762, 0.465957, 0.477234, 0.510655, -0.251823, 0.460054, 0.52044, 0.550584, -0.255552, 0.459172, 0.567853, 0.585872, -0.257036, 0.450311, 0.615943, 0.620466, -0.257535, 0.437763, 0.667693, 0.660496, -0.255248, 0.426639, 0.718988, 0.695578, -0.251141, 0.409185, 0.772503, 0.732176, -0.244718, 0.39015, 0.827023, 0.760782, -0.236782, 0.362594, 0.885651, 0.79422, -0.225923, 0.33711, 0.943756, 0.824521, -0.213855, 0.308272, 1.00874, 0.854964, -0.197723, 0.278529, 1.06764, 0.878065, -0.179209, 0.246208, 1.12836, 0.899834, -0.157569, 0.21329, 1.18318, 0.918815, -0.133206, 0.181038, 1.23161, 0.934934, -0.106545, 0.146993, 1.27644, 0.952115, -0.0780574, 0.111175, 1.31842, 0.96906, -0.0478279, 0.0728553, 1.35839, 0.985178, -0.0160014, 0.032579, 1.39697, 1.00039, 0.0173126, -0.0095256, 1.43312, 0.00384146, -1.24311e-06, 0.0613583, 7.78271e-08, 0.00390023, -3.14043e-05, 0.0622919, 1.96626e-06, 0.00389971, -0.000125622, 0.0622632, 7.87379e-06, 0.00389491, -0.000282352, 0.0620659, 1.778e-05, 0.00391618, -0.000502512, 0.0624687, 3.20918e-05, 0.00392662, -0.000784458, 0.0625113, 5.15573e-05, 0.00396053, -0.00112907, 0.0628175, 7.78668e-05, 0.00401911, -0.00153821, 0.0633286, 0.000113811, 0.00414994, -0.0020208, 0.0646443, 0.00016445, 0.00441223, -0.00260007, 0.0673886, 0.000237734, 0.00484427, -0.0033097, 0.0716528, 0.000345929, 0.00549109, -0.00418966, 0.0774998, 0.000505987, 0.00636293, -0.00527331, 0.0844758, 0.000739208, 0.00746566, -0.00660428, 0.0921325, 0.00107347, 0.00876625, -0.00818826, 0.0997067, 0.00153691, 0.0103125, -0.0100811, 0.107433, 0.00217153, 0.0123309, -0.0123643, 0.117088, 0.00303427, 0.0146274, -0.0150007, 0.126438, 0.00416018, 0.0172295, -0.0180531, 0.135672, 0.00561513, 0.0204248, -0.0215962, 0.146244, 0.007478, 0.0241597, -0.0256234, 0.157481, 0.00981046, 0.0284693, -0.0302209, 0.169125, 0.0127148, 0.033445, -0.0353333, 0.181659, 0.0162453, 0.0391251, -0.0410845, 0.1944, 0.0205417, 0.0454721, -0.0473451, 0.207082, 0.0256333, 0.0530983, -0.0542858, 0.221656, 0.0317036, 0.0615356, -0.0618384, 0.236036, 0.0388319, 0.0703363, -0.0697631, 0.248398, 0.046974, 0.0810391, -0.0784757, 0.263611, 0.0565246, 0.0920144, -0.0873488, 0.275857, 0.0671724, 0.105584, -0.0973652, 0.292555, 0.0798105, 0.119506, -0.107271, 0.306333, 0.0935945, 0.134434, -0.117608, 0.318888, 0.109106, 0.153399, -0.128938, 0.337552, 0.127074, 0.171258, -0.139944, 0.349955, 0.14643, 0.191059, -0.151288, 0.361545, 0.168, 0.215069, -0.163018, 0.378421, 0.192082, 0.237838, -0.174226, 0.38879, 0.217838, 0.266965, -0.186063, 0.405857, 0.246931, 0.292827, -0.196909, 0.414146, 0.277505, 0.324352, -0.207473, 0.426955, 0.310711, 0.354427, -0.217713, 0.433429, 0.346794, 0.389854, -0.227183, 0.443966, 0.385237, 0.420749, -0.235131, 0.44471, 0.424955, 0.459597, -0.242786, 0.451729, 0.468446, 0.495316, -0.248767, 0.45072, 0.513422, 0.534903, -0.253351, 0.450924, 0.560618, 0.572369, -0.256277, 0.445266, 0.609677, 0.612383, -0.2576, 0.438798, 0.660995, 0.644037, -0.256931, 0.421693, 0.713807, 0.686749, -0.254036, 0.4109, 0.767616, 0.719814, -0.249785, 0.390151, 0.82533, 0.754719, -0.244283, 0.367847, 0.888311, 0.792022, -0.235076, 0.345013, 0.948177, 0.822404, -0.225061, 0.316193, 1.01661, 0.853084, -0.211113, 0.287013, 1.08075, 0.879871, -0.19449, 0.255424, 1.14501, 0.901655, -0.174023, 0.222879, 1.20203, 0.919957, -0.1509, 0.18989, 1.25698, 0.938412, -0.124923, 0.15606, 1.30588, 0.953471, -0.0968139, 0.120512, 1.3529, 0.970451, -0.066734, 0.0828515, 1.3986, 0.985522, -0.034734, 0.0424458, 1.44148, 1.00099, -0.00102222, 0.000678929, 1.48398, 0.000965494, -6.27338e-07, 0.0306409, 1.97672e-08, 0.00099168, -1.58573e-05, 0.0314638, 4.99803e-07, 0.000991068, -6.34012e-05, 0.031363, 2.00682e-06, 0.000974567, -0.00014144, 0.03036, 4.57312e-06, 0.000998079, -0.000252812, 0.031496, 8.60131e-06, 0.00102243, -0.000396506, 0.0319955, 1.48288e-05, 0.00107877, -0.000577593, 0.0331376, 2.49141e-05, 0.00121622, -0.000816816, 0.0359396, 4.23011e-05, 0.0014455, -0.00113761, 0.0399652, 7.24613e-05, 0.00178791, -0.00156959, 0.0450556, 0.000123929, 0.00225668, -0.00214064, 0.0508025, 0.000208531, 0.00285627, -0.00287655, 0.0568443, 0.000341969, 0.0035991, -0.00380271, 0.0630892, 0.000544158, 0.00455524, -0.00496264, 0.0702204, 0.000842423, 0.00569143, -0.0063793, 0.0773426, 0.00126704, 0.00716928, -0.00813531, 0.0860839, 0.00186642, 0.00885307, -0.0101946, 0.0944079, 0.00267014, 0.0109316, -0.0126386, 0.103951, 0.00374033, 0.0133704, -0.0154876, 0.113786, 0.0051304, 0.0161525, -0.0187317, 0.123477, 0.00688858, 0.0194267, -0.0224652, 0.133986, 0.00910557, 0.0230967, -0.0265976, 0.143979, 0.0118074, 0.0273627, -0.0312848, 0.154645, 0.0151266, 0.0323898, -0.0365949, 0.166765, 0.0191791, 0.0379225, -0.0422914, 0.177932, 0.0239236, 0.0447501, -0.0487469, 0.19167, 0.0296568, 0.0519391, -0.0556398, 0.203224, 0.0362924, 0.0599464, -0.0631646, 0.215652, 0.0440585, 0.0702427, -0.0714308, 0.232089, 0.0531619, 0.0806902, -0.0800605, 0.245258, 0.0634564, 0.0923194, -0.0892815, 0.258609, 0.0752481, 0.106938, -0.09931, 0.276654, 0.0888914, 0.121238, -0.109575, 0.289847, 0.104055, 0.138817, -0.120461, 0.307566, 0.121266, 0.15595, -0.131209, 0.320117, 0.139944, 0.178418, -0.143049, 0.339677, 0.161591, 0.197875, -0.154074, 0.349886, 0.184303, 0.224368, -0.166307, 0.369352, 0.210669, 0.252213, -0.178051, 0.386242, 0.238895, 0.277321, -0.189335, 0.395294, 0.269182, 0.310332, -0.200683, 0.412148, 0.302508, 0.338809, -0.210856, 0.418266, 0.337264, 0.372678, -0.220655, 0.428723, 0.374881, 0.405632, -0.230053, 0.433887, 0.415656, 0.442293, -0.237993, 0.439911, 0.457982, 0.477256, -0.244897, 0.440175, 0.502831, 0.515592, -0.250657, 0.441079, 0.550277, 0.550969, -0.255459, 0.435219, 0.601102, 0.592883, -0.257696, 0.432882, 0.651785, 0.629092, -0.259894, 0.421054, 0.708961, 0.672033, -0.258592, 0.41177, 0.763806, 0.709147, -0.256525, 0.395267, 0.824249, 0.745367, -0.254677, 0.375013, 0.8951, 0.784715, -0.247892, 0.353906, 0.959317, 0.818107, -0.240162, 0.327801, 1.03153, 0.847895, -0.229741, 0.298821, 1.10601, 0.879603, -0.213084, 0.269115, 1.164, 0.902605, -0.195242, 0.236606, 1.22854, 0.922788, -0.174505, 0.203442, 1.29017, 0.944831, -0.150169, 0.169594, 1.34157, 0.959656, -0.124099, 0.135909, 1.3956, 0.972399, -0.0960626, 0.0990563, 1.45128, 0.986549, -0.0657097, 0.0602348, 1.50312, 1.00013, -0.0333558, 0.0186694, 1.55364, 6.19747e-06, -1e-07, 0.00778326, 7.96756e-11, 2.37499e-08, -9.99999e-08, 2.82592e-05, 1.14596e-10, 1.00292e-06, -1.66369e-06, 0.000250354, 6.77492e-09, 3.50752e-06, -6.37769e-06, 0.000357289, 6.31655e-08, 8.26445e-06, -1.74689e-05, 0.000516179, 3.1851e-07, 2.42481e-05, -4.50868e-05, 0.0010223, 1.30577e-06, 4.55631e-05, -8.9044e-05, 0.00144302, 3.74587e-06, 9.71222e-05, -0.000178311, 0.00241912, 1.02584e-05, 0.000171403, -0.000313976, 0.00354938, 2.36481e-05, 0.000292747, -0.000520026, 0.00513765, 4.96014e-05, 0.000789827, -0.00118187, 0.0238621, 0.000139056, 0.00114093, -0.00171827, 0.0286691, 0.000244093, 0.00176119, -0.00249667, 0.0368565, 0.000420623, 0.0022233, -0.00333742, 0.0400469, 0.00065673, 0.00343382, -0.00481976, 0.0535751, 0.00109323, 0.00427602, -0.00600755, 0.057099, 0.00155268, 0.00461435, -0.00737637, 0.0551084, 0.00215031, 0.00695698, -0.00971401, 0.0715767, 0.00316529, 0.00867619, -0.0120943, 0.0793314, 0.00436995, 0.0106694, -0.0148202, 0.0869391, 0.0058959, 0.0140351, -0.0183501, 0.101572, 0.00798757, 0.0168939, -0.022006, 0.11018, 0.0104233, 0.020197, -0.0261568, 0.119041, 0.0134167, 0.0254702, -0.0312778, 0.135404, 0.0173009, 0.0298384, -0.0362469, 0.1437, 0.0215428, 0.035159, -0.042237, 0.15512, 0.0268882, 0.0427685, -0.0488711, 0.17128, 0.033235, 0.0494848, -0.0557997, 0.181813, 0.0404443, 0.0592394, -0.0635578, 0.198745, 0.0490043, 0.0681463, -0.071838, 0.210497, 0.0588239, 0.0804753, -0.0809297, 0.228864, 0.0702835, 0.0942205, -0.0906488, 0.247008, 0.0834012, 0.106777, -0.100216, 0.258812, 0.0975952, 0.124471, -0.110827, 0.278617, 0.114162, 0.138389, -0.121193, 0.287049, 0.131983, 0.159543, -0.13253, 0.307151, 0.152541, 0.176432, -0.143611, 0.31564, 0.174673, 0.201723, -0.15548, 0.33538, 0.199842, 0.229721, -0.167166, 0.355256, 0.227097, 0.250206, -0.178238, 0.360047, 0.256014, 0.282118, -0.189905, 0.378761, 0.28855, 0.312821, -0.201033, 0.39181, 0.323348, 0.341482, -0.211584, 0.397716, 0.360564, 0.377368, -0.221314, 0.410141, 0.400004, 0.418229, -0.230474, 0.423485, 0.442371, 0.444881, -0.239443, 0.418874, 0.488796, 0.488899, -0.245987, 0.427545, 0.535012, 0.520317, -0.253948, 0.422147, 0.589678, 0.568566, -0.256616, 0.42719, 0.637683, 0.599607, -0.26376, 0.415114, 0.703363, 0.64222, -0.268687, 0.408715, 0.771363, 0.685698, -0.2694, 0.399722, 0.83574, 0.732327, -0.266642, 0.388651, 0.897764, 0.769873, -0.267712, 0.369198, 0.983312, 0.806733, -0.263479, 0.346802, 1.06222, 0.843466, -0.254575, 0.321368, 1.13477, 0.873008, -0.242749, 0.29211, 1.20712, 0.908438, -0.22725, 0.262143, 1.27465, 0.936321, -0.207621, 0.228876, 1.33203, 0.950353, -0.187932, 0.19484, 1.40439, 0.96442, -0.165154, 0.163178, 1.4732, 0.979856, -0.139302, 0.127531, 1.53574, 0.982561, -0.11134, 0.0903457, 1.59982, 0.996389, -0.0808124, 0.0489007, 1.6577];\n\n\t\tconst ltc_float_1 = new Float32Array(LTC_MAT_1);\n\n\t\treturn RectAreaLightLTC._createTexture(ltc_float_1);\n\t}\n\n\tstatic getLTC2() {\n\t\t// source: https://github.com/selfshadow/ltc_code/tree/master/fit/results/ltc.js\n\t\tconst LTC_MAT_2 = [1, 0, 0, 0, 1, 7.91421e-31, 0, 0, 1, 1.04392e-24, 0, 0, 1, 3.49405e-21, 0, 0, 1, 1.09923e-18, 0, 0, 1, 9.47414e-17, 0, 0, 1, 3.59627e-15, 0, 0, 1, 7.72053e-14, 0, 0, 1, 1.08799e-12, 0, 0, 1, 1.10655e-11, 0, 0, 1, 8.65818e-11, 0, 0, 0.999998, 5.45037e-10, 0, 0, 0.999994, 2.85095e-09, 0, 0, 0.999989, 1.26931e-08, 0, 0, 0.999973, 4.89938e-08, 0, 0, 0.999947, 1.66347e-07, 0, 0, 0.999894, 5.02694e-07, 0, 0, 0.999798, 1.36532e-06, 0, 0, 0.999617, 3.35898e-06, 0, 0, 0.999234, 7.52126e-06, 0, 0, 0.998258, 1.52586e-05, 0, 0, 0.99504, 2.66207e-05, 0, 0, 0.980816, 2.36802e-05, 0, 0, 0.967553, 2.07684e-06, 0, 0, 0.966877, 4.03733e-06, 0, 0, 0.965752, 7.41174e-06, 0, 0, 0.96382, 1.27746e-05, 0, 0, 0.960306, 2.02792e-05, 0, 0, 0.953619, 2.80232e-05, 0, 0, 0.941103, 2.78816e-05, 0, 0, 0.926619, 1.60221e-05, 0, 0, 0.920983, 2.35164e-05, 0, 0, 0.912293, 3.11924e-05, 0, 0.0158731, 0.899277, 3.48118e-05, 0, 0.0476191, 0.880884, 2.6041e-05, 0, 0.0793651, 0.870399, 3.38726e-05, 0, 0.111111, 0.856138, 3.92906e-05, 0, 0.142857, 0.837436, 3.72874e-05, 0, 0.174603, 0.820973, 3.92558e-05, 0, 0.206349, 0.803583, 4.34658e-05, 0, 0.238095, 0.782168, 4.0256e-05, 0, 0.269841, 0.764107, 4.48159e-05, 0, 0.301587, 0.743092, 4.57627e-05, 0, 0.333333, 0.721626, 4.55314e-05, 0, 0.365079, 0.700375, 4.77335e-05, 0, 0.396825, 0.677334, 4.61072e-05, 0, 0.428571, 0.655702, 4.84393e-05, 0, 0.460317, 0.632059, 4.64583e-05, 0, 0.492064, 0.610125, 4.83923e-05, 0, 0.52381, 0.58653, 4.64342e-05, 0, 0.555556, 0.564508, 4.77033e-05, 0, 0.587302, 0.541405, 4.59263e-05, 0, 0.619048, 0.519556, 4.6412e-05, 0, 0.650794, 0.497292, 4.48913e-05, 0, 0.68254, 0.475898, 4.45789e-05, 0, 0.714286, 0.454722, 4.33496e-05, 0, 0.746032, 0.434042, 4.23054e-05, 0, 0.777778, 0.414126, 4.13737e-05, 0, 0.809524, 0.394387, 3.97265e-05, 0, 0.84127, 0.375841, 3.90709e-05, 0, 0.873016, 0.357219, 3.69938e-05, 0, 0.904762, 0.340084, 3.65618e-05, 0, 0.936508, 0.322714, 3.42533e-05, 0, 0.968254, 0.306974, 3.39596e-05, 0, 1, 1, 1.01524e-18, 0, 0, 1, 1.0292e-18, 0, 0, 1, 1.30908e-18, 0, 0, 1, 4.73331e-18, 0, 0, 1, 6.25319e-17, 0, 0, 1, 1.07932e-15, 0, 0, 1, 1.63779e-14, 0, 0, 1, 2.03198e-13, 0, 0, 1, 2.04717e-12, 0, 0, 0.999999, 1.68995e-11, 0, 0, 0.999998, 1.15855e-10, 0, 0, 0.999996, 6.6947e-10, 0, 0, 0.999991, 3.30863e-09, 0, 0, 0.999983, 1.41737e-08, 0, 0, 0.999968, 5.32626e-08, 0, 0, 0.99994, 1.77431e-07, 0, 0, 0.999891, 5.28835e-07, 0, 0, 0.999797, 1.42169e-06, 0, 0, 0.999617, 3.47057e-06, 0, 0, 0.999227, 7.7231e-06, 0, 0, 0.998239, 1.55753e-05, 0, 0, 0.994937, 2.68495e-05, 0, 0, 0.980225, 2.13742e-05, 0, 0, 0.967549, 2.1631e-06, 0, 0, 0.966865, 4.17989e-06, 0, 0, 0.965739, 7.63341e-06, 0, 0, 0.963794, 1.30892e-05, 0, 0, 0.960244, 2.06456e-05, 0, 0, 0.953495, 2.82016e-05, 0, 0.000148105, 0.940876, 2.71581e-05, 0, 0.002454, 0.926569, 1.64159e-05, 0, 0.00867491, 0.920905, 2.39521e-05, 0, 0.01956, 0.912169, 3.15127e-05, 0, 0.035433, 0.899095, 3.46626e-05, 0, 0.056294, 0.882209, 2.90223e-05, 0, 0.0818191, 0.870272, 3.42992e-05, 0, 0.111259, 0.855977, 3.94164e-05, 0, 0.142857, 0.837431, 3.72343e-05, 0, 0.174603, 0.820826, 3.96691e-05, 0, 0.206349, 0.803408, 4.35395e-05, 0, 0.238095, 0.782838, 4.19579e-05, 0, 0.269841, 0.763941, 4.50953e-05, 0, 0.301587, 0.742904, 4.55847e-05, 0, 0.333333, 0.721463, 4.58833e-05, 0, 0.365079, 0.700197, 4.77159e-05, 0, 0.396825, 0.677501, 4.70641e-05, 0, 0.428571, 0.655527, 4.84732e-05, 0, 0.460317, 0.6324, 4.76834e-05, 0, 0.492064, 0.609964, 4.84213e-05, 0, 0.52381, 0.586839, 4.75541e-05, 0, 0.555556, 0.564353, 4.76951e-05, 0, 0.587302, 0.541589, 4.67611e-05, 0, 0.619048, 0.519413, 4.63493e-05, 0, 0.650794, 0.497337, 4.53994e-05, 0, 0.68254, 0.475797, 4.45308e-05, 0, 0.714286, 0.454659, 4.35787e-05, 0, 0.746032, 0.434065, 4.24839e-05, 0, 0.777778, 0.414018, 4.1436e-05, 0, 0.809524, 0.39455, 4.01902e-05, 0, 0.84127, 0.375742, 3.90813e-05, 0, 0.873016, 0.357501, 3.77116e-05, 0, 0.904762, 0.339996, 3.6535e-05, 0, 0.936508, 0.323069, 3.51265e-05, 0, 0.968254, 0.306897, 3.39112e-05, 0, 1, 1, 1.0396e-15, 0, 0, 1, 1.04326e-15, 0, 0, 1, 1.10153e-15, 0, 0, 1, 1.44668e-15, 0, 0, 1, 3.4528e-15, 0, 0, 1, 1.75958e-14, 0, 0, 1, 1.2627e-13, 0, 0, 1, 9.36074e-13, 0, 0, 1, 6.45742e-12, 0, 0, 0.999998, 4.01228e-11, 0, 0, 0.999997, 2.22338e-10, 0, 0, 0.999995, 1.0967e-09, 0, 0, 0.999991, 4.82132e-09, 0, 0, 0.999981, 1.89434e-08, 0, 0, 0.999967, 6.67716e-08, 0, 0, 0.999938, 2.12066e-07, 0, 0, 0.999886, 6.0977e-07, 0, 0, 0.999792, 1.59504e-06, 0, 0, 0.999608, 3.81191e-06, 0, 0, 0.999209, 8.33727e-06, 0, 0, 0.998179, 1.65288e-05, 0, 0, 0.994605, 2.74387e-05, 0, 0, 0.979468, 1.67316e-05, 0, 0, 0.967529, 2.42877e-06, 0, 0, 0.966836, 4.61696e-06, 0, 0, 0.96569, 8.30977e-06, 0, 0, 0.963706, 1.40427e-05, 0, 2.44659e-06, 0.960063, 2.17353e-05, 0, 0.000760774, 0.953113, 2.86606e-05, 0, 0.00367261, 0.940192, 2.47691e-05, 0, 0.00940263, 0.927731, 1.95814e-05, 0, 0.018333, 0.920669, 2.52531e-05, 0, 0.0306825, 0.911799, 3.24277e-05, 0, 0.0465556, 0.89857, 3.40982e-05, 0, 0.0659521, 0.883283, 3.19622e-05, 0, 0.0887677, 0.86989, 3.5548e-05, 0, 0.114784, 0.855483, 3.97143e-05, 0, 0.143618, 0.837987, 3.91665e-05, 0, 0.174606, 0.820546, 4.11306e-05, 0, 0.206349, 0.802878, 4.36753e-05, 0, 0.238095, 0.783402, 4.44e-05, 0, 0.269841, 0.763439, 4.58726e-05, 0, 0.301587, 0.742925, 4.67097e-05, 0, 0.333333, 0.721633, 4.78887e-05, 0, 0.365079, 0.69985, 4.81251e-05, 0, 0.396825, 0.67783, 4.91811e-05, 0, 0.428571, 0.655126, 4.88199e-05, 0, 0.460318, 0.632697, 4.96025e-05, 0, 0.492064, 0.609613, 4.8829e-05, 0, 0.52381, 0.587098, 4.92754e-05, 0, 0.555556, 0.564119, 4.82625e-05, 0, 0.587302, 0.541813, 4.82807e-05, 0, 0.619048, 0.519342, 4.71552e-05, 0, 0.650794, 0.497514, 4.66765e-05, 0, 0.68254, 0.475879, 4.55582e-05, 0, 0.714286, 0.454789, 4.46007e-05, 0, 0.746032, 0.434217, 4.35382e-05, 0, 0.777778, 0.414086, 4.21753e-05, 0, 0.809524, 0.394744, 4.12093e-05, 0, 0.84127, 0.375782, 3.96634e-05, 0, 0.873016, 0.357707, 3.86419e-05, 0, 0.904762, 0.340038, 3.70345e-05, 0, 0.936508, 0.323284, 3.59725e-05, 0, 0.968254, 0.306954, 3.436e-05, 0, 1, 1, 5.99567e-14, 0, 0, 1, 6.00497e-14, 0, 0, 1, 6.14839e-14, 0, 0, 1, 6.86641e-14, 0, 0, 1, 9.72658e-14, 0, 0, 1, 2.21271e-13, 0, 0, 1, 8.33195e-13, 0, 0, 1, 4.03601e-12, 0, 0, 0.999999, 2.06001e-11, 0, 0, 0.999998, 1.01739e-10, 0, 0, 0.999997, 4.70132e-10, 0, 0, 0.999993, 2.00436e-09, 0, 0, 0.999988, 7.83682e-09, 0, 0, 0.999979, 2.80338e-08, 0, 0, 0.999962, 9.17033e-08, 0, 0, 0.999933, 2.74514e-07, 0, 0, 0.999881, 7.53201e-07, 0, 0, 0.999783, 1.89826e-06, 0, 0, 0.999594, 4.40279e-06, 0, 0, 0.999178, 9.3898e-06, 0, 0, 0.998073, 1.81265e-05, 0, 0, 0.993993, 2.80487e-05, 0, 0, 0.979982, 1.49422e-05, 0, 0, 0.968145, 3.78481e-06, 0, 0, 0.966786, 5.3771e-06, 0, 0, 0.965611, 9.47508e-06, 0, 3.88934e-05, 0.963557, 1.56616e-05, 0, 0.0009693, 0.959752, 2.35144e-05, 0, 0.00370329, 0.952461, 2.91568e-05, 0, 0.00868428, 0.940193, 2.40102e-05, 0, 0.0161889, 0.929042, 2.31235e-05, 0, 0.0263948, 0.920266, 2.73968e-05, 0, 0.0394088, 0.911178, 3.37915e-05, 0, 0.0552818, 0.897873, 3.33629e-05, 0, 0.0740138, 0.884053, 3.51405e-05, 0, 0.0955539, 0.869455, 3.78034e-05, 0, 0.119795, 0.854655, 3.99378e-05, 0, 0.14656, 0.838347, 4.19108e-05, 0, 0.175573, 0.820693, 4.40831e-05, 0, 0.206388, 0.802277, 4.45599e-05, 0, 0.238095, 0.783634, 4.72691e-05, 0, 0.269841, 0.763159, 4.76984e-05, 0, 0.301587, 0.742914, 4.91487e-05, 0, 0.333333, 0.721662, 5.02312e-05, 0, 0.365079, 0.699668, 5.02817e-05, 0, 0.396825, 0.677839, 5.1406e-05, 0, 0.428571, 0.655091, 5.11095e-05, 0, 0.460317, 0.632665, 5.16067e-05, 0, 0.492064, 0.609734, 5.12255e-05, 0, 0.52381, 0.587043, 5.10263e-05, 0, 0.555556, 0.564298, 5.0565e-05, 0, 0.587302, 0.541769, 4.97951e-05, 0, 0.619048, 0.519529, 4.92698e-05, 0, 0.650794, 0.497574, 4.82066e-05, 0, 0.68254, 0.476028, 4.73689e-05, 0, 0.714286, 0.454961, 4.61941e-05, 0, 0.746032, 0.434341, 4.50618e-05, 0, 0.777778, 0.414364, 4.38355e-05, 0, 0.809524, 0.394832, 4.24196e-05, 0, 0.84127, 0.376109, 4.12563e-05, 0, 0.873016, 0.35779, 3.96226e-05, 0, 0.904762, 0.340379, 3.84886e-05, 0, 0.936508, 0.323385, 3.68214e-05, 0, 0.968254, 0.307295, 3.56636e-05, 0, 1, 1, 1.06465e-12, 0, 0, 1, 1.06555e-12, 0, 0, 1, 1.07966e-12, 0, 0, 1, 1.14601e-12, 0, 0, 1, 1.37123e-12, 0, 0, 1, 2.1243e-12, 0, 0, 0.999999, 4.89653e-12, 0, 0, 0.999999, 1.60283e-11, 0, 0, 0.999998, 6.2269e-11, 0, 0, 0.999997, 2.51859e-10, 0, 0, 0.999996, 9.96192e-10, 0, 0, 0.999992, 3.74531e-09, 0, 0, 0.999986, 1.32022e-08, 0, 0, 0.999975, 4.33315e-08, 0, 0, 0.999959, 1.31956e-07, 0, 0, 0.999927, 3.72249e-07, 0, 0, 0.999871, 9.72461e-07, 0, 0, 0.999771, 2.35343e-06, 0, 0, 0.999572, 5.2768e-06, 0, 0, 0.999133, 1.09237e-05, 0, 0, 0.997912, 2.03675e-05, 0, 0, 0.993008, 2.79396e-05, 0, 0, 0.980645, 1.39604e-05, 0, 0, 0.970057, 6.46596e-06, 0, 0, 0.966717, 6.5089e-06, 0, 4.74145e-05, 0.965497, 1.11863e-05, 0, 0.00089544, 0.96334, 1.79857e-05, 0, 0.0032647, 0.959294, 2.59045e-05, 0, 0.0075144, 0.951519, 2.92327e-05, 0, 0.0138734, 0.940517, 2.49769e-05, 0, 0.0224952, 0.93014, 2.6803e-05, 0, 0.0334828, 0.91972, 3.03656e-05, 0, 0.0468973, 0.910294, 3.53323e-05, 0, 0.0627703, 0.897701, 3.51002e-05, 0, 0.0811019, 0.884522, 3.88104e-05, 0, 0.10186, 0.869489, 4.12932e-05, 0, 0.124985, 0.853983, 4.15781e-05, 0, 0.150372, 0.838425, 4.54066e-05, 0, 0.177868, 0.820656, 4.71624e-05, 0, 0.207245, 0.801875, 4.75243e-05, 0, 0.238143, 0.783521, 5.05621e-05, 0, 0.269841, 0.763131, 5.0721e-05, 0, 0.301587, 0.74261, 5.23293e-05, 0, 0.333333, 0.72148, 5.28699e-05, 0, 0.365079, 0.699696, 5.38677e-05, 0, 0.396825, 0.677592, 5.39255e-05, 0, 0.428571, 0.65525, 5.46367e-05, 0, 0.460317, 0.632452, 5.41348e-05, 0, 0.492064, 0.609903, 5.44976e-05, 0, 0.52381, 0.586928, 5.36201e-05, 0, 0.555556, 0.564464, 5.35185e-05, 0, 0.587302, 0.541801, 5.24949e-05, 0, 0.619048, 0.519681, 5.1812e-05, 0, 0.650794, 0.497685, 5.07687e-05, 0, 0.68254, 0.47622, 4.96243e-05, 0, 0.714286, 0.455135, 4.85714e-05, 0, 0.746032, 0.4346, 4.71847e-05, 0, 0.777778, 0.414564, 4.59294e-05, 0, 0.809524, 0.395165, 4.44705e-05, 0, 0.84127, 0.376333, 4.30772e-05, 0, 0.873016, 0.358197, 4.16229e-05, 0, 0.904762, 0.34064, 4.01019e-05, 0, 0.936508, 0.323816, 3.86623e-05, 0, 0.968254, 0.307581, 3.70933e-05, 0, 1, 1, 9.91541e-12, 0, 0, 1, 9.92077e-12, 0, 0, 1, 1.00041e-11, 0, 0, 1, 1.0385e-11, 0, 0, 1, 1.15777e-11, 0, 0, 1, 1.50215e-11, 0, 0, 0.999999, 2.54738e-11, 0, 0, 0.999999, 5.98822e-11, 0, 0, 0.999998, 1.79597e-10, 0, 0, 0.999997, 6.02367e-10, 0, 0, 0.999994, 2.06835e-09, 0, 0, 0.99999, 6.94952e-09, 0, 0, 0.999984, 2.23363e-08, 0, 0, 0.999972, 6.78578e-08, 0, 0, 0.999952, 1.93571e-07, 0, 0, 0.999919, 5.16594e-07, 0, 0, 0.99986, 1.28739e-06, 0, 0, 0.999753, 2.99298e-06, 0, 0, 0.999546, 6.48258e-06, 0, 0, 0.999074, 1.29985e-05, 0, 0, 0.997671, 2.32176e-05, 0, 0, 0.991504, 2.56701e-05, 0, 0, 0.981148, 1.31141e-05, 0, 0, 0.971965, 8.69048e-06, 0, 2.80182e-05, 0.966624, 8.08301e-06, 0, 0.000695475, 0.965344, 1.35235e-05, 0, 0.00265522, 0.963048, 2.10592e-05, 0, 0.00622975, 0.958673, 2.87473e-05, 0, 0.0116234, 0.950262, 2.81379e-05, 0, 0.018976, 0.940836, 2.71089e-05, 0, 0.0283844, 0.930996, 3.0926e-05, 0, 0.0399151, 0.919848, 3.48359e-05, 0, 0.0536063, 0.909136, 3.66092e-05, 0, 0.0694793, 0.897554, 3.84162e-05, 0, 0.0875342, 0.884691, 4.30971e-05, 0, 0.107749, 0.869414, 4.47803e-05, 0, 0.130087, 0.853462, 4.52858e-05, 0, 0.154481, 0.838187, 4.95769e-05, 0, 0.180833, 0.820381, 5.02709e-05, 0, 0.209005, 0.801844, 5.22713e-05, 0, 0.238791, 0.783061, 5.41505e-05, 0, 0.269869, 0.763205, 5.53712e-05, 0, 0.301587, 0.742362, 5.64909e-05, 0, 0.333333, 0.721393, 5.72646e-05, 0, 0.365079, 0.699676, 5.81012e-05, 0, 0.396825, 0.677395, 5.8096e-05, 0, 0.428571, 0.655208, 5.85766e-05, 0, 0.460317, 0.632451, 5.83602e-05, 0, 0.492064, 0.609839, 5.80234e-05, 0, 0.52381, 0.587093, 5.77161e-05, 0, 0.555556, 0.564467, 5.68447e-05, 0, 0.587302, 0.542043, 5.63166e-05, 0, 0.619048, 0.519826, 5.5156e-05, 0, 0.650794, 0.497952, 5.41682e-05, 0, 0.68254, 0.476477, 5.28971e-05, 0, 0.714286, 0.455412, 5.14952e-05, 0, 0.746032, 0.434926, 5.02222e-05, 0, 0.777778, 0.4149, 4.85779e-05, 0, 0.809524, 0.395552, 4.72242e-05, 0, 0.84127, 0.376712, 4.54891e-05, 0, 0.873016, 0.358622, 4.40924e-05, 0, 0.904762, 0.341048, 4.22984e-05, 0, 0.936508, 0.324262, 4.08582e-05, 0, 0.968254, 0.308013, 3.90839e-05, 0, 1, 1, 6.13913e-11, 0, 0, 1, 6.14145e-11, 0, 0, 1, 6.17708e-11, 0, 0, 1, 6.33717e-11, 0, 0, 1, 6.81648e-11, 0, 0, 1, 8.08291e-11, 0, 0, 1, 1.14608e-10, 0, 0, 0.999998, 2.10507e-10, 0, 0, 0.999997, 4.99595e-10, 0, 0, 0.999995, 1.39897e-09, 0, 0, 0.999994, 4.19818e-09, 0, 0, 0.999988, 1.27042e-08, 0, 0, 0.999979, 3.75153e-08, 0, 0, 0.999965, 1.06206e-07, 0, 0, 0.999945, 2.85381e-07, 0, 0, 0.999908, 7.23611e-07, 0, 0, 0.999846, 1.7255e-06, 0, 0, 0.999733, 3.86104e-06, 0, 0, 0.999511, 8.08493e-06, 0, 0, 0.998993, 1.56884e-05, 0, 0, 0.997326, 2.65538e-05, 0, 0, 0.989706, 2.06466e-05, 0, 0, 0.981713, 1.30756e-05, 0, 7.0005e-06, 0.973636, 1.06473e-05, 0, 0.000464797, 0.966509, 1.0194e-05, 0, 0.00201743, 0.965149, 1.65881e-05, 0, 0.00497549, 0.962669, 2.49147e-05, 0, 0.00953262, 0.95786, 3.17449e-05, 0, 0.0158211, 0.949334, 2.81045e-05, 0, 0.0239343, 0.941041, 3.03263e-05, 0, 0.0339372, 0.931575, 3.56754e-05, 0, 0.0458738, 0.920102, 3.97075e-05, 0, 0.059772, 0.908002, 3.84886e-05, 0, 0.075645, 0.897269, 4.3027e-05, 0, 0.0934929, 0.884559, 4.79925e-05, 0, 0.113302, 0.869161, 4.8246e-05, 0, 0.135045, 0.853342, 5.09505e-05, 0, 0.158678, 0.837633, 5.42846e-05, 0, 0.184136, 0.820252, 5.54139e-05, 0, 0.211325, 0.801872, 5.81412e-05, 0, 0.240113, 0.782418, 5.85535e-05, 0, 0.270306, 0.7631, 6.10923e-05, 0, 0.301594, 0.742183, 6.13678e-05, 0, 0.333333, 0.721098, 6.27275e-05, 0, 0.365079, 0.699512, 6.29413e-05, 0, 0.396825, 0.677372, 6.36351e-05, 0, 0.428571, 0.655059, 6.33555e-05, 0, 0.460317, 0.632567, 6.36513e-05, 0, 0.492064, 0.609784, 6.28965e-05, 0, 0.52381, 0.587237, 6.25546e-05, 0, 0.555556, 0.564525, 6.15825e-05, 0, 0.587302, 0.542181, 6.05048e-05, 0, 0.619048, 0.520017, 5.96329e-05, 0, 0.650794, 0.498204, 5.81516e-05, 0, 0.68254, 0.476742, 5.69186e-05, 0, 0.714286, 0.455803, 5.53833e-05, 0, 0.746032, 0.435251, 5.37807e-05, 0, 0.777778, 0.415374, 5.22025e-05, 0, 0.809524, 0.395921, 5.03421e-05, 0, 0.84127, 0.377253, 4.88211e-05, 0, 0.873016, 0.359021, 4.68234e-05, 0, 0.904762, 0.341637, 4.53269e-05, 0, 0.936508, 0.3247, 4.33014e-05, 0, 0.968254, 0.308625, 4.18007e-05, 0, 1, 1, 2.86798e-10, 0, 0, 1, 2.86877e-10, 0, 0, 1, 2.88094e-10, 0, 0, 1, 2.93506e-10, 0, 0, 1, 3.09262e-10, 0, 0, 0.999999, 3.48593e-10, 0, 0, 0.999999, 4.44582e-10, 0, 0, 0.999998, 6.88591e-10, 0, 0, 0.999996, 1.34391e-09, 0, 0, 0.999993, 3.17438e-09, 0, 0, 0.999989, 8.35609e-09, 0, 0, 0.999983, 2.28677e-08, 0, 0, 0.999974, 6.23361e-08, 0, 0, 0.999959, 1.65225e-07, 0, 0, 0.999936, 4.19983e-07, 0, 0, 0.999896, 1.01546e-06, 0, 0, 0.99983, 2.32376e-06, 0, 0, 0.999709, 5.0156e-06, 0, 0, 0.999469, 1.0167e-05, 0, 0, 0.998886, 1.90775e-05, 0, 0, 0.996819, 3.00511e-05, 0, 0, 0.988837, 1.85092e-05, 0, 1.68222e-07, 0.982178, 1.34622e-05, 0, 0.000259622, 0.975017, 1.25961e-05, 0, 0.00142595, 0.967101, 1.3507e-05, 0, 0.00382273, 0.964905, 2.05003e-05, 0, 0.00764164, 0.96218, 2.9546e-05, 0, 0.0130121, 0.956821, 3.43738e-05, 0, 0.0200253, 0.948829, 3.05063e-05, 0, 0.0287452, 0.941092, 3.46487e-05, 0, 0.039218, 0.931883, 4.12061e-05, 0, 0.0514748, 0.920211, 4.44651e-05, 0, 0.0655351, 0.907307, 4.31252e-05, 0, 0.0814082, 0.89684, 4.90382e-05, 0, 0.0990939, 0.884119, 5.3334e-05, 0, 0.118583, 0.869148, 5.4114e-05, 0, 0.139856, 0.853377, 5.78536e-05, 0, 0.162882, 0.836753, 5.92285e-05, 0, 0.187615, 0.820063, 6.22787e-05, 0, 0.213991, 0.801694, 6.45492e-05, 0, 0.241918, 0.782116, 6.5353e-05, 0, 0.271267, 0.762673, 6.74344e-05, 0, 0.301847, 0.742133, 6.82788e-05, 0, 0.333333, 0.720779, 6.91959e-05, 0, 0.365079, 0.699386, 6.96817e-05, 0, 0.396826, 0.67732, 6.99583e-05, 0, 0.428572, 0.654888, 6.98447e-05, 0, 0.460318, 0.632499, 6.94063e-05, 0, 0.492064, 0.609825, 6.91612e-05, 0, 0.52381, 0.587287, 6.81576e-05, 0, 0.555556, 0.564743, 6.74138e-05, 0, 0.587302, 0.542409, 6.61617e-05, 0, 0.619048, 0.520282, 6.47785e-05, 0, 0.650794, 0.498506, 6.33836e-05, 0, 0.68254, 0.477102, 6.15905e-05, 0, 0.714286, 0.456167, 6.01013e-05, 0, 0.746032, 0.435728, 5.81457e-05, 0, 0.777778, 0.415809, 5.64215e-05, 0, 0.809524, 0.396517, 5.44997e-05, 0, 0.84127, 0.377737, 5.25061e-05, 0, 0.873016, 0.359698, 5.06831e-05, 0, 0.904762, 0.342164, 4.8568e-05, 0, 0.936508, 0.325417, 4.67826e-05, 0, 0.968254, 0.309186, 4.46736e-05, 0, 1, 1, 1.09018e-09, 0, 0, 1, 1.0904e-09, 0, 0, 1, 1.09393e-09, 0, 0, 1, 1.1095e-09, 0, 0, 1, 1.154e-09, 0, 0, 1, 1.26089e-09, 0, 0, 0.999999, 1.5059e-09, 0, 0, 0.999997, 2.07899e-09, 0, 0, 0.999994, 3.48164e-09, 0, 0, 0.999993, 7.05728e-09, 0, 0, 0.999987, 1.63692e-08, 0, 0, 0.999981, 4.06033e-08, 0, 0, 0.999969, 1.0245e-07, 0, 0, 0.999953, 2.55023e-07, 0, 0, 0.999925, 6.1511e-07, 0, 0, 0.999881, 1.42218e-06, 0, 0, 0.99981, 3.13086e-06, 0, 0, 0.99968, 6.53119e-06, 0, 0, 0.999418, 1.2832e-05, 0, 0, 0.998748, 2.32497e-05, 0, 0, 0.996066, 3.29522e-05, 0, 0, 0.988379, 1.79613e-05, 0, 0.000108799, 0.982567, 1.43715e-05, 0, 0.000921302, 0.976097, 1.48096e-05, 0, 0.00280738, 0.968475, 1.78905e-05, 0, 0.00596622, 0.964606, 2.53921e-05, 0, 0.0105284, 0.961564, 3.48623e-05, 0, 0.0165848, 0.955517, 3.57612e-05, 0, 0.0242, 0.948381, 3.43493e-05, 0, 0.03342, 0.941095, 4.05849e-05, 0, 0.0442777, 0.931923, 4.75394e-05, 0, 0.0567958, 0.91996, 4.84328e-05, 0, 0.0709879, 0.907419, 5.02146e-05, 0, 0.086861, 0.89618, 5.61654e-05, 0, 0.104415, 0.88337, 5.87612e-05, 0, 0.123643, 0.869046, 6.18057e-05, 0, 0.144531, 0.853278, 6.57392e-05, 0, 0.167057, 0.836091, 6.6303e-05, 0, 0.191188, 0.819644, 7.04445e-05, 0, 0.216878, 0.801246, 7.14071e-05, 0, 0.244062, 0.782031, 7.40093e-05, 0, 0.272649, 0.762066, 7.4685e-05, 0, 0.302509, 0.741964, 7.66647e-05, 0, 0.333442, 0.720554, 7.66328e-05, 0, 0.365079, 0.699098, 7.77857e-05, 0, 0.396826, 0.677189, 7.74633e-05, 0, 0.428572, 0.65484, 7.76235e-05, 0, 0.460318, 0.632496, 7.70316e-05, 0, 0.492064, 0.609908, 7.62669e-05, 0, 0.52381, 0.587312, 7.53972e-05, 0, 0.555556, 0.564938, 7.39994e-05, 0, 0.587302, 0.542577, 7.28382e-05, 0, 0.619048, 0.52062, 7.1112e-05, 0, 0.650794, 0.498819, 6.94004e-05, 0, 0.68254, 0.477555, 6.75575e-05, 0, 0.714286, 0.456568, 6.53449e-05, 0, 0.746032, 0.436278, 6.36068e-05, 0, 0.777778, 0.41637, 6.13466e-05, 0, 0.809524, 0.397144, 5.94177e-05, 0, 0.84127, 0.378412, 5.70987e-05, 0, 0.873016, 0.360376, 5.50419e-05, 0, 0.904762, 0.342906, 5.27422e-05, 0, 0.936508, 0.326136, 5.06544e-05, 0, 0.968254, 0.30997, 4.84307e-05, 0, 1, 1, 3.54014e-09, 0, 0, 1, 3.54073e-09, 0, 0, 1, 3.54972e-09, 0, 0, 1, 3.58929e-09, 0, 0, 1, 3.70093e-09, 0, 0, 0.999999, 3.96194e-09, 0, 0, 0.999998, 4.53352e-09, 0, 0, 0.999997, 5.78828e-09, 0, 0, 0.999994, 8.63812e-09, 0, 0, 0.999991, 1.53622e-08, 0, 0, 0.999985, 3.16356e-08, 0, 0, 0.999977, 7.12781e-08, 0, 0, 0.999964, 1.66725e-07, 0, 0, 0.999945, 3.90501e-07, 0, 0, 0.999912, 8.95622e-07, 0, 0, 0.999866, 1.98428e-06, 0, 0, 0.999786, 4.21038e-06, 0, 0, 0.999647, 8.50239e-06, 0, 0, 0.999356, 1.62059e-05, 0, 0, 0.998563, 2.82652e-05, 0, 0, 0.994928, 3.36309e-05, 0, 2.44244e-05, 0.987999, 1.78458e-05, 0, 0.000523891, 0.982893, 1.59162e-05, 0, 0.00194729, 0.977044, 1.78056e-05, 0, 0.00451099, 0.969972, 2.30624e-05, 0, 0.00835132, 0.964237, 3.13922e-05, 0, 0.013561, 0.960791, 4.06145e-05, 0, 0.0202056, 0.954292, 3.72796e-05, 0, 0.0283321, 0.948052, 4.03199e-05, 0, 0.0379739, 0.940938, 4.79537e-05, 0, 0.0491551, 0.931689, 5.45292e-05, 0, 0.0618918, 0.91987, 5.4038e-05, 0, 0.0761941, 0.907665, 5.89909e-05, 0, 0.0920672, 0.895281, 6.42651e-05, 0, 0.109511, 0.882621, 6.59707e-05, 0, 0.12852, 0.86873, 7.09973e-05, 0, 0.149085, 0.853008, 7.42221e-05, 0, 0.171189, 0.835944, 7.61754e-05, 0, 0.194809, 0.818949, 7.97052e-05, 0, 0.21991, 0.800951, 8.12434e-05, 0, 0.246447, 0.781847, 8.38075e-05, 0, 0.274352, 0.761649, 8.4501e-05, 0, 0.303535, 0.74152, 8.60258e-05, 0, 0.333857, 0.720495, 8.66233e-05, 0, 0.365104, 0.698742, 8.68326e-05, 0, 0.396826, 0.677096, 8.7133e-05, 0, 0.428572, 0.654782, 8.63497e-05, 0, 0.460318, 0.632335, 8.60206e-05, 0, 0.492064, 0.610031, 8.49337e-05, 0, 0.52381, 0.587457, 8.38279e-05, 0, 0.555556, 0.56513, 8.2309e-05, 0, 0.587302, 0.542877, 8.03542e-05, 0, 0.619048, 0.5209, 7.86928e-05, 0, 0.650794, 0.499291, 7.65171e-05, 0, 0.68254, 0.477971, 7.44753e-05, 0, 0.714286, 0.457221, 7.2209e-05, 0, 0.746032, 0.436803, 6.97448e-05, 0, 0.777778, 0.417083, 6.75333e-05, 0, 0.809524, 0.397749, 6.48058e-05, 0, 0.84127, 0.379177, 6.25759e-05, 0, 0.873016, 0.361061, 5.98584e-05, 0, 0.904762, 0.343713, 5.75797e-05, 0, 0.936508, 0.326894, 5.49999e-05, 0, 0.968254, 0.310816, 5.27482e-05, 0, 1, 1, 1.0153e-08, 0, 0, 1, 1.01544e-08, 0, 0, 1, 1.01751e-08, 0, 0, 1, 1.02662e-08, 0, 0, 1, 1.0521e-08, 0, 0, 0.999999, 1.11049e-08, 0, 0, 0.999999, 1.23408e-08, 0, 0, 0.999996, 1.4924e-08, 0, 0, 0.999992, 2.04471e-08, 0, 0, 0.999989, 3.26539e-08, 0, 0, 0.99998, 6.03559e-08, 0, 0, 0.999971, 1.23936e-07, 0, 0, 0.999955, 2.69058e-07, 0, 0, 0.999933, 5.93604e-07, 0, 0, 0.999901, 1.29633e-06, 0, 0, 0.999847, 2.75621e-06, 0, 0, 0.999761, 5.64494e-06, 0, 0, 0.999607, 1.10485e-05, 0, 0, 0.999282, 2.04388e-05, 0, 0, 0.99831, 3.41084e-05, 0, 2.2038e-07, 0.993288, 2.94949e-05, 0, 0.000242388, 0.987855, 1.92736e-05, 0, 0.0012503, 0.983167, 1.82383e-05, 0, 0.0032745, 0.977908, 2.18633e-05, 0, 0.00646321, 0.971194, 2.90662e-05, 0, 0.0109133, 0.963867, 3.86401e-05, 0, 0.0166927, 0.95982, 4.62827e-05, 0, 0.0238494, 0.953497, 4.20705e-05, 0, 0.0324178, 0.947621, 4.77743e-05, 0, 0.0424225, 0.940611, 5.68258e-05, 0, 0.0538808, 0.931174, 6.18061e-05, 0, 0.0668047, 0.919919, 6.27098e-05, 0, 0.0812014, 0.907856, 6.94714e-05, 0, 0.0970745, 0.894509, 7.35008e-05, 0, 0.114424, 0.881954, 7.63369e-05, 0, 0.133246, 0.868309, 8.21896e-05, 0, 0.153534, 0.852511, 8.3769e-05, 0, 0.175275, 0.835821, 8.81615e-05, 0, 0.198453, 0.817981, 8.96368e-05, 0, 0.223042, 0.800504, 9.30906e-05, 0, 0.249009, 0.78141, 9.45056e-05, 0, 0.276304, 0.761427, 9.63605e-05, 0, 0.304862, 0.74094, 9.68088e-05, 0, 0.334584, 0.720233, 9.81481e-05, 0, 0.365322, 0.698592, 9.79122e-05, 0, 0.396826, 0.676763, 9.81057e-05, 0, 0.428571, 0.654808, 9.73956e-05, 0, 0.460318, 0.632326, 9.62619e-05, 0, 0.492064, 0.610049, 9.52996e-05, 0, 0.52381, 0.58763, 9.33334e-05, 0, 0.555556, 0.565261, 9.17573e-05, 0, 0.587302, 0.543244, 8.96636e-05, 0, 0.619048, 0.521273, 8.73304e-05, 0, 0.650794, 0.499818, 8.52648e-05, 0, 0.68254, 0.478536, 8.23961e-05, 0, 0.714286, 0.457826, 7.9939e-05, 0, 0.746032, 0.437549, 7.7126e-05, 0, 0.777778, 0.41776, 7.43043e-05, 0, 0.809524, 0.39863, 7.16426e-05, 0, 0.84127, 0.379954, 6.86456e-05, 0, 0.873016, 0.362025, 6.60514e-05, 0, 0.904762, 0.344581, 6.30755e-05, 0, 0.936508, 0.327909, 6.05439e-05, 0, 0.968254, 0.311736, 5.76345e-05, 0, 1, 1, 2.63344e-08, 0, 0, 1, 2.63373e-08, 0, 0, 1, 2.63815e-08, 0, 0, 1, 2.65753e-08, 0, 0, 1, 2.71132e-08, 0, 0, 0.999999, 2.83279e-08, 0, 0, 0.999997, 3.0833e-08, 0, 0, 0.999995, 3.58711e-08, 0, 0, 0.999992, 4.61266e-08, 0, 0, 0.999985, 6.7574e-08, 0, 0, 0.999977, 1.1358e-07, 0, 0, 0.999966, 2.13657e-07, 0, 0, 0.999948, 4.31151e-07, 0, 0, 0.999923, 8.96656e-07, 0, 0, 0.999884, 1.86603e-06, 0, 0, 0.999826, 3.81115e-06, 0, 0, 0.999732, 7.54184e-06, 0, 0, 0.999561, 1.43192e-05, 0, 0, 0.999191, 2.57061e-05, 0, 0, 0.997955, 4.05724e-05, 0, 7.44132e-05, 0.992228, 2.76537e-05, 0, 0.000716477, 0.987638, 2.08885e-05, 0, 0.0022524, 0.983395, 2.15226e-05, 0, 0.00484816, 0.978614, 2.70795e-05, 0, 0.00860962, 0.972389, 3.65282e-05, 0, 0.0136083, 0.964392, 4.74747e-05, 0, 0.0198941, 0.95861, 5.09141e-05, 0, 0.0275023, 0.952806, 4.8963e-05, 0, 0.0364584, 0.94712, 5.71119e-05, 0, 0.04678, 0.940104, 6.71704e-05, 0, 0.0584799, 0.930398, 6.87586e-05, 0, 0.0715665, 0.919866, 7.38161e-05, 0, 0.086045, 0.907853, 8.13235e-05, 0, 0.101918, 0.894078, 8.34582e-05, 0, 0.119186, 0.881177, 8.92093e-05, 0, 0.137845, 0.867575, 9.44548e-05, 0, 0.157891, 0.852107, 9.69607e-05, 0, 0.179316, 0.835502, 0.000101456, 0, 0.202106, 0.81756, 0.000103256, 0, 0.226243, 0.79984, 0.000106954, 0, 0.251704, 0.780998, 0.000108066, 0, 0.278451, 0.761132, 0.000110111, 0, 0.306436, 0.740429, 0.000110459, 0, 0.335586, 0.719836, 0.000111219, 0, 0.365796, 0.698467, 0.00011145, 0, 0.3969, 0.676446, 0.000110393, 0, 0.428571, 0.654635, 0.000110035, 0, 0.460318, 0.632411, 0.000108548, 0, 0.492064, 0.609986, 0.000106963, 0, 0.52381, 0.587872, 0.000105238, 0, 0.555556, 0.565528, 0.000102665, 0, 0.587302, 0.543563, 0.000100543, 0, 0.619048, 0.52176, 9.76182e-05, 0, 0.650794, 0.500188, 9.47099e-05, 0, 0.68254, 0.479204, 9.19929e-05, 0, 0.714286, 0.458413, 8.86139e-05, 0, 0.746032, 0.438314, 8.57839e-05, 0, 0.777778, 0.418573, 8.2411e-05, 0, 0.809524, 0.39947, 7.92211e-05, 0, 0.84127, 0.380892, 7.59546e-05, 0, 0.873016, 0.362953, 7.27571e-05, 0, 0.904762, 0.345601, 6.95738e-05, 0, 0.936508, 0.328895, 6.64907e-05, 0, 0.968254, 0.312808, 6.34277e-05, 0, 1, 1, 6.28647e-08, 0, 0, 1, 6.28705e-08, 0, 0, 1, 6.29587e-08, 0, 0, 1, 6.33441e-08, 0, 0, 0.999999, 6.44087e-08, 0, 0, 0.999998, 6.67856e-08, 0, 0, 0.999997, 7.15889e-08, 0, 0, 0.999995, 8.09577e-08, 0, 0, 0.999989, 9.92764e-08, 0, 0, 0.999983, 1.35834e-07, 0, 0, 0.999974, 2.10482e-07, 0, 0, 0.999959, 3.65215e-07, 0, 0, 0.999939, 6.86693e-07, 0, 0, 0.999911, 1.3472e-06, 0, 0, 0.999868, 2.6731e-06, 0, 0, 0.999804, 5.24756e-06, 0, 0, 0.9997, 1.00403e-05, 0, 0, 0.99951, 1.85019e-05, 0, 0, 0.999078, 3.22036e-05, 0, 6.20676e-06, 0.997428, 4.70002e-05, 0, 0.000341552, 0.99162, 2.87123e-05, 0, 0.00143727, 0.987479, 2.34706e-05, 0, 0.00349201, 0.983582, 2.60083e-05, 0, 0.0066242, 0.979186, 3.37927e-05, 0, 0.0109113, 0.97325, 4.54689e-05, 0, 0.0164064, 0.965221, 5.73759e-05, 0, 0.0231463, 0.957262, 5.44114e-05, 0, 0.0311571, 0.952211, 5.87006e-05, 0, 0.0404572, 0.946631, 6.92256e-05, 0, 0.0510592, 0.939391, 7.87819e-05, 0, 0.0629723, 0.929795, 7.92368e-05, 0, 0.0762025, 0.91965, 8.75075e-05, 0, 0.090753, 0.907737, 9.50903e-05, 0, 0.106626, 0.893899, 9.72963e-05, 0, 0.123822, 0.880239, 0.00010459, 0, 0.142337, 0.866562, 0.000107689, 0, 0.16217, 0.85164, 0.000113081, 0, 0.183314, 0.835021, 0.000116636, 0, 0.20576, 0.817311, 0.000120074, 0, 0.229496, 0.798845, 0.000121921, 0, 0.254502, 0.780479, 0.00012475, 0, 0.280753, 0.760694, 0.000125255, 0, 0.308212, 0.740142, 0.000126719, 0, 0.336825, 0.719248, 0.00012636, 0, 0.366517, 0.698209, 0.000126712, 0, 0.397167, 0.676398, 0.000125769, 0, 0.428578, 0.654378, 0.000124432, 0, 0.460318, 0.632484, 0.000123272, 0, 0.492064, 0.610113, 0.00012085, 0, 0.52381, 0.587931, 0.000118411, 0, 0.555556, 0.565872, 0.00011569, 0, 0.587302, 0.543814, 0.000112521, 0, 0.619048, 0.522265, 0.000109737, 0, 0.650794, 0.500835, 0.000106228, 0, 0.68254, 0.479818, 0.000102591, 0, 0.714286, 0.459258, 9.91288e-05, 0, 0.746032, 0.439061, 9.52325e-05, 0, 0.777778, 0.419552, 9.1895e-05, 0, 0.809524, 0.400399, 8.79051e-05, 0, 0.84127, 0.381976, 8.44775e-05, 0, 0.873016, 0.364009, 8.06316e-05, 0, 0.904762, 0.346761, 7.71848e-05, 0, 0.936508, 0.330049, 7.35429e-05, 0, 0.968254, 0.314018, 7.02103e-05, 0, 1, 1, 1.39968e-07, 0, 0, 1, 1.39979e-07, 0, 0, 1, 1.40145e-07, 0, 0, 1, 1.4087e-07, 0, 0, 0.999999, 1.42865e-07, 0, 0, 0.999998, 1.47279e-07, 0, 0, 0.999997, 1.56057e-07, 0, 0, 0.999992, 1.7276e-07, 0, 0, 0.999989, 2.04352e-07, 0, 0, 0.99998, 2.6494e-07, 0, 0, 0.999969, 3.83435e-07, 0, 0, 0.999953, 6.18641e-07, 0, 0, 0.999929, 1.08755e-06, 0, 0, 0.999898, 2.01497e-06, 0, 0, 0.999849, 3.81346e-06, 0, 0, 0.999778, 7.19815e-06, 0, 0, 0.999661, 1.33215e-05, 0, 0, 0.999451, 2.38313e-05, 0, 0, 0.998936, 4.01343e-05, 0, 0.000113724, 0.99662, 5.17346e-05, 0, 0.000820171, 0.991094, 3.04323e-05, 0, 0.00238143, 0.987487, 2.81757e-05, 0, 0.00493527, 0.983731, 3.20048e-05, 0, 0.00856859, 0.979647, 4.23905e-05, 0, 0.0133393, 0.973837, 5.62935e-05, 0, 0.0192863, 0.96584, 6.77442e-05, 0, 0.0264369, 0.956309, 6.23073e-05, 0, 0.03481, 0.951523, 7.04131e-05, 0, 0.0444184, 0.946003, 8.36594e-05, 0, 0.0552713, 0.938454, 9.11736e-05, 0, 0.0673749, 0.929279, 9.38264e-05, 0, 0.0807329, 0.919239, 0.000103754, 0, 0.0953479, 0.907293, 0.000109928, 0, 0.111221, 0.893936, 0.000115257, 0, 0.128352, 0.879674, 0.000122265, 0, 0.14674, 0.865668, 0.000125733, 0, 0.166382, 0.850998, 0.000132305, 0, 0.187276, 0.834498, 0.000134844, 0, 0.209413, 0.816903, 0.000139276, 0, 0.232786, 0.798235, 0.000140984, 0, 0.257382, 0.779724, 0.00014378, 0, 0.283181, 0.760251, 0.000144623, 0, 0.310156, 0.739808, 0.000145228, 0, 0.338269, 0.718762, 0.00014539, 0, 0.367461, 0.697815, 0.000144432, 0, 0.397646, 0.67631, 0.000143893, 0, 0.428685, 0.654278, 0.000141846, 0, 0.460318, 0.632347, 0.00013935, 0, 0.492064, 0.610296, 0.000137138, 0, 0.52381, 0.588039, 0.000133806, 0, 0.555556, 0.566218, 0.000130755, 0, 0.587302, 0.544346, 0.000127128, 0, 0.619048, 0.522701, 0.000123002, 0, 0.650794, 0.501542, 0.000119443, 0, 0.68254, 0.480508, 0.000115055, 0, 0.714286, 0.460092, 0.000111032, 0, 0.746032, 0.440021, 0.000106635, 0, 0.777778, 0.420446, 0.000102162, 0, 0.809524, 0.401512, 9.8184e-05, 0, 0.84127, 0.38299, 9.36497e-05, 0, 0.873016, 0.365232, 8.9813e-05, 0, 0.904762, 0.347865, 8.53073e-05, 0, 0.936508, 0.331342, 8.17068e-05, 0, 0.968254, 0.315202, 7.73818e-05, 0, 1, 1, 2.9368e-07, 0, 0, 1, 2.937e-07, 0, 0, 1, 2.93998e-07, 0, 0, 1, 2.95298e-07, 0, 0, 0.999999, 2.98865e-07, 0, 0, 0.999998, 3.067e-07, 0, 0, 0.999995, 3.22082e-07, 0, 0, 0.999992, 3.50767e-07, 0, 0, 0.999986, 4.03538e-07, 0, 0, 0.999976, 5.01372e-07, 0, 0, 0.999964, 6.8562e-07, 0, 0, 0.999945, 1.0374e-06, 0, 0, 0.999919, 1.71269e-06, 0, 0, 0.999882, 3.00175e-06, 0, 0, 0.999829, 5.42144e-06, 0, 0, 0.999749, 9.84182e-06, 0, 0, 0.99962, 1.76213e-05, 0, 0, 0.999382, 3.05995e-05, 0, 1.38418e-05, 0.998751, 4.96686e-05, 0, 0.000389844, 0.995344, 5.10733e-05, 0, 0.00150343, 0.990768, 3.45829e-05, 0, 0.00352451, 0.987464, 3.42841e-05, 0, 0.00655379, 0.983846, 3.99072e-05, 0, 0.0106554, 0.980007, 5.33219e-05, 0, 0.0158723, 0.974494, 6.96992e-05, 0, 0.0222333, 0.96622, 7.76754e-05, 0, 0.029758, 0.956273, 7.47718e-05, 0, 0.0384596, 0.950952, 8.64611e-05, 0, 0.0483473, 0.945215, 0.000100464, 0, 0.0594266, 0.937287, 0.000103729, 0, 0.0717019, 0.928649, 0.000111665, 0, 0.0851752, 0.918791, 0.00012353, 0, 0.0998479, 0.906685, 0.000127115, 0, 0.115721, 0.893706, 0.00013628, 0, 0.132794, 0.879248, 0.000142427, 0, 0.151067, 0.864685, 0.000148091, 0, 0.170538, 0.850032, 0.000153517, 0, 0.191204, 0.833853, 0.000157322, 0, 0.213063, 0.816353, 0.000161086, 0, 0.236107, 0.797834, 0.000164111, 0, 0.260329, 0.778831, 0.000165446, 0, 0.285714, 0.759756, 0.000167492, 0, 0.312243, 0.739419, 0.000166928, 0, 0.339887, 0.718491, 0.000167, 0, 0.368604, 0.697392, 0.000165674, 0, 0.398329, 0.676102, 0.000163815, 0, 0.428961, 0.654243, 0.000162003, 0, 0.460331, 0.632176, 0.000158831, 0, 0.492064, 0.610407, 0.000155463, 0, 0.52381, 0.588394, 0.000152062, 0, 0.555556, 0.56645, 0.000147665, 0, 0.587302, 0.5449, 0.00014375, 0, 0.619048, 0.523276, 0.000138905, 0, 0.650794, 0.502179, 0.000134189, 0, 0.68254, 0.481359, 0.000129392, 0, 0.714286, 0.46092, 0.000124556, 0, 0.746032, 0.441084, 0.00011957, 0, 0.777778, 0.421517, 0.000114652, 0, 0.809524, 0.402721, 0.000109688, 0, 0.84127, 0.384222, 0.000104667, 0, 0.873016, 0.366534, 9.99633e-05, 0, 0.904762, 0.349205, 9.50177e-05, 0, 0.936508, 0.332702, 9.07301e-05, 0, 0.968254, 0.316599, 8.59769e-05, 0, 1, 1, 5.85473e-07, 0, 0, 1, 5.85507e-07, 0, 0, 1, 5.8602e-07, 0, 0, 0.999999, 5.88259e-07, 0, 0, 0.999999, 5.94381e-07, 0, 0, 0.999998, 6.07754e-07, 0, 0, 0.999995, 6.33729e-07, 0, 0, 0.99999, 6.8137e-07, 0, 0, 0.999984, 7.67003e-07, 0, 0, 0.999973, 9.21212e-07, 0, 0, 0.999959, 1.20218e-06, 0, 0, 0.999936, 1.72024e-06, 0, 0, 0.999907, 2.68088e-06, 0, 0, 0.999866, 4.45512e-06, 0, 0, 0.999806, 7.68481e-06, 0, 0, 0.999716, 1.342e-05, 0, 0, 0.999576, 2.32473e-05, 0, 0, 0.9993, 3.91694e-05, 0, 0.000129917, 0.998498, 6.08429e-05, 0, 0.000845035, 0.994132, 4.89743e-05, 0, 0.00237616, 0.99031, 3.84644e-05, 0, 0.00484456, 0.987409, 4.21768e-05, 0, 0.00832472, 0.983981, 5.04854e-05, 0, 0.0128643, 0.980268, 6.71028e-05, 0, 0.0184947, 0.974875, 8.52749e-05, 0, 0.025237, 0.966063, 8.5531e-05, 0, 0.0331046, 0.956779, 9.00588e-05, 0, 0.0421067, 0.950259, 0.00010577, 0, 0.0522487, 0.944239, 0.000119458, 0, 0.0635343, 0.936341, 0.000122164, 0, 0.0759654, 0.928047, 0.000134929, 0, 0.0895434, 0.918065, 0.000145544, 0, 0.104269, 0.906267, 0.000150531, 0, 0.120142, 0.893419, 0.000161652, 0, 0.137163, 0.878758, 0.00016593, 0, 0.15533, 0.863699, 0.000174014, 0, 0.174645, 0.848876, 0.000177877, 0, 0.195106, 0.833032, 0.000184049, 0, 0.21671, 0.815557, 0.000186088, 0, 0.239454, 0.797323, 0.00019054, 0, 0.263332, 0.778124, 0.000191765, 0, 0.288336, 0.758929, 0.000192535, 0, 0.314451, 0.738979, 0.000192688, 0, 0.341658, 0.718213, 0.000191522, 0, 0.369924, 0.696947, 0.000190491, 0, 0.399202, 0.675807, 0.000187913, 0, 0.429416, 0.654147, 0.000184451, 0, 0.460447, 0.63229, 0.000181442, 0, 0.492064, 0.610499, 0.000177139, 0, 0.523809, 0.588747, 0.000172596, 0, 0.555555, 0.566783, 0.000167457, 0, 0.587301, 0.545359, 0.000162518, 0, 0.619048, 0.523984, 0.000156818, 0, 0.650794, 0.502917, 0.000151884, 0, 0.68254, 0.482294, 0.000145514, 0, 0.714286, 0.461945, 0.000140199, 0, 0.746032, 0.442133, 0.000134101, 0, 0.777778, 0.422705, 0.000128374, 0, 0.809524, 0.403916, 0.000122996, 0, 0.84127, 0.38554, 0.000116808, 0, 0.873016, 0.367909, 0.000111973, 0, 0.904762, 0.350651, 0.000105938, 0, 0.936508, 0.334208, 0.000101355, 0, 0.968254, 0.318123, 9.57629e-05, 0, 1, 1, 1.11633e-06, 0, 0, 1, 1.11639e-06, 0, 0, 1, 1.11725e-06, 0, 0, 1, 1.12096e-06, 0, 0, 0.999999, 1.1311e-06, 0, 0, 0.999997, 1.15315e-06, 0, 0, 0.999995, 1.1956e-06, 0, 0, 0.999989, 1.27239e-06, 0, 0, 0.999981, 1.40772e-06, 0, 0, 0.999969, 1.64541e-06, 0, 0, 0.999952, 2.06607e-06, 0, 0, 0.999928, 2.81783e-06, 0, 0, 0.999895, 4.16835e-06, 0, 0, 0.999848, 6.58728e-06, 0, 0, 0.999781, 1.08648e-05, 0, 0, 0.999682, 1.82579e-05, 0, 0, 0.999523, 3.06003e-05, 0, 1.59122e-05, 0.999205, 4.99862e-05, 0, 0.000391184, 0.998131, 7.3306e-05, 0, 0.00147534, 0.993334, 5.13229e-05, 0, 0.0034227, 0.99016, 4.67783e-05, 0, 0.00632232, 0.987321, 5.23413e-05, 0, 0.0102295, 0.984099, 6.4267e-05, 0, 0.0151794, 0.980432, 8.43042e-05, 0, 0.0211947, 0.974976, 0.000102819, 0, 0.0282899, 0.966429, 9.96234e-05, 0, 0.0364739, 0.957633, 0.000111074, 0, 0.0457522, 0.949422, 0.000128644, 0, 0.0561278, 0.943045, 0.000140076, 0, 0.0676023, 0.935448, 0.000146349, 0, 0.0801762, 0.927225, 0.000161854, 0, 0.0938499, 0.917033, 0.000169135, 0, 0.108623, 0.905762, 0.000179987, 0, 0.124496, 0.892879, 0.000189832, 0, 0.141469, 0.878435, 0.000195881, 0, 0.159541, 0.863114, 0.00020466, 0, 0.178713, 0.84776, 0.000209473, 0, 0.198985, 0.832084, 0.000214861, 0, 0.220355, 0.814915, 0.000217695, 0, 0.242823, 0.796711, 0.000220313, 0, 0.266385, 0.777603, 0.00022313, 0, 0.291036, 0.757991, 0.000222471, 0, 0.316767, 0.738371, 0.000222869, 0, 0.343563, 0.717872, 0.000221243, 0, 0.371402, 0.696619, 0.000218089, 0, 0.400248, 0.675379, 0.00021562, 0, 0.430047, 0.65411, 0.00021169, 0, 0.460709, 0.63241, 0.000206947, 0, 0.492079, 0.61046, 0.000201709, 0, 0.52381, 0.58903, 0.000196753, 0, 0.555556, 0.567267, 0.000189637, 0, 0.587302, 0.545886, 0.000184735, 0, 0.619048, 0.524714, 0.000177257, 0, 0.650794, 0.503789, 0.000171424, 0, 0.68254, 0.483204, 0.000164688, 0, 0.714286, 0.462976, 0.000157172, 0, 0.746032, 0.443294, 0.000151341, 0, 0.777778, 0.423988, 0.000143737, 0, 0.809524, 0.405325, 0.000138098, 0, 0.84127, 0.386981, 0.000130698, 0, 0.873016, 0.369436, 0.000125276, 0, 0.904762, 0.35219, 0.000118349, 0, 0.936508, 0.335804, 0.00011312, 0, 0.968254, 0.319749, 0.000106687, 0, 1, 1, 2.04685e-06, 0, 0, 1, 2.04694e-06, 0, 0, 1, 2.04831e-06, 0, 0, 0.999999, 2.05428e-06, 0, 0, 0.999999, 2.07056e-06, 0, 0, 0.999997, 2.10581e-06, 0, 0, 0.999993, 2.1732e-06, 0, 0, 0.999987, 2.29365e-06, 0, 0, 0.999979, 2.50243e-06, 0, 0, 0.999965, 2.86127e-06, 0, 0, 0.999947, 3.48028e-06, 0, 0, 0.999918, 4.55588e-06, 0, 0, 0.999881, 6.43303e-06, 0, 0, 0.999828, 9.70064e-06, 0, 0, 0.999753, 1.53233e-05, 0, 0, 0.999642, 2.4793e-05, 0, 0, 0.999464, 4.02032e-05, 0, 0.000122947, 0.999089, 6.35852e-05, 0, 0.000807414, 0.997567, 8.57026e-05, 0, 0.00227206, 0.992903, 5.94912e-05, 0, 0.00462812, 0.990011, 5.78515e-05, 0, 0.00794162, 0.987192, 6.5399e-05, 0, 0.0122534, 0.98418, 8.19675e-05, 0, 0.0175888, 0.980491, 0.000105514, 0, 0.0239635, 0.974779, 0.000121532, 0, 0.031387, 0.96675, 0.000119144, 0, 0.0398644, 0.958248, 0.000136125, 0, 0.0493982, 0.948884, 0.000155408, 0, 0.0599896, 0.941673, 0.000162281, 0, 0.0716382, 0.934521, 0.000176754, 0, 0.0843437, 0.926205, 0.000192873, 0, 0.0981056, 0.916089, 0.000200038, 0, 0.112923, 0.904963, 0.000213624, 0, 0.128796, 0.892089, 0.000221834, 0, 0.145725, 0.878028, 0.000232619, 0, 0.163709, 0.86249, 0.000238632, 0, 0.182749, 0.846587, 0.000247002, 0, 0.202847, 0.830988, 0.000250702, 0, 0.224001, 0.814165, 0.000255562, 0, 0.246214, 0.796135, 0.000257505, 0, 0.269482, 0.777052, 0.000258625, 0, 0.293805, 0.757201, 0.000258398, 0, 0.319176, 0.737655, 0.000256714, 0, 0.345587, 0.717477, 0.000255187, 0, 0.373021, 0.696433, 0.000251792, 0, 0.401454, 0.675084, 0.000247223, 0, 0.430844, 0.653907, 0.000242213, 0, 0.461125, 0.632561, 0.000237397, 0, 0.492187, 0.610658, 0.000229313, 0, 0.52381, 0.589322, 0.000224402, 0, 0.555556, 0.567857, 0.000216116, 0, 0.587302, 0.54652, 0.000209124, 0, 0.619048, 0.525433, 0.000201601, 0, 0.650794, 0.504679, 0.000192957, 0, 0.68254, 0.484203, 0.000186052, 0, 0.714286, 0.464203, 0.000177672, 0, 0.746032, 0.444549, 0.000170005, 0, 0.777778, 0.425346, 0.000162401, 0, 0.809524, 0.406706, 0.0001544, 0, 0.84127, 0.388576, 0.000147437, 0, 0.873016, 0.37094, 0.000139493, 0, 0.904762, 0.353996, 0.000133219, 0, 0.936508, 0.337391, 0.000125573, 0, 0.968254, 0.321648, 0.000119867, 0, 1, 1, 3.62511e-06, 0, 0, 1, 3.62525e-06, 0, 0, 1, 3.62739e-06, 0, 0, 0.999999, 3.63673e-06, 0, 0, 0.999998, 3.66214e-06, 0, 0, 0.999996, 3.71698e-06, 0, 0, 0.999992, 3.82116e-06, 0, 0, 0.999986, 4.00554e-06, 0, 0, 0.999976, 4.32058e-06, 0, 0, 0.999961, 4.85194e-06, 0, 0, 0.999938, 5.74808e-06, 0, 0, 0.999908, 7.26643e-06, 0, 0, 0.999865, 9.84707e-06, 0, 0, 0.999807, 1.42217e-05, 0, 0, 0.999723, 2.15581e-05, 0, 0, 0.999602, 3.36114e-05, 0, 1.19113e-05, 0.999398, 5.27353e-05, 0, 0.000355813, 0.998946, 8.05809e-05, 0, 0.00137768, 0.996647, 9.42908e-05, 0, 0.00322469, 0.992298, 6.68733e-05, 0, 0.00597897, 0.989802, 7.16564e-05, 0, 0.00968903, 0.987019, 8.21355e-05, 0, 0.0143845, 0.984219, 0.000104555, 0, 0.0200831, 0.980425, 0.000131245, 0, 0.0267948, 0.974241, 0.000139613, 0, 0.034525, 0.967006, 0.000145931, 0, 0.0432757, 0.95893, 0.000167153, 0, 0.0530471, 0.949157, 0.000188146, 0, 0.0638386, 0.94062, 0.000194625, 0, 0.0756487, 0.933509, 0.000213721, 0, 0.0884762, 0.925088, 0.000229616, 0, 0.10232, 0.915178, 0.000239638, 0, 0.117178, 0.904093, 0.000254814, 0, 0.133051, 0.891337, 0.000263685, 0, 0.149939, 0.877326, 0.000274789, 0, 0.167841, 0.861794, 0.000280534, 0, 0.18676, 0.845758, 0.000289534, 0, 0.206696, 0.829792, 0.000294446, 0, 0.22765, 0.813037, 0.000296877, 0, 0.249625, 0.795285, 0.000300217, 0, 0.27262, 0.776323, 0.000299826, 0, 0.296636, 0.756673, 0.000299787, 0, 0.321671, 0.736856, 0.000297867, 0, 0.347718, 0.716883, 0.000294052, 0, 0.374768, 0.696089, 0.000289462, 0, 0.402804, 0.67505, 0.000285212, 0, 0.431796, 0.653509, 0.00027653, 0, 0.461695, 0.63258, 0.000271759, 0, 0.49242, 0.61104, 0.000262811, 0, 0.523822, 0.589567, 0.000255151, 0, 0.555556, 0.568322, 0.000246434, 0, 0.587302, 0.547235, 0.000237061, 0, 0.619048, 0.52616, 0.000228343, 0, 0.650794, 0.505716, 0.000219236, 0, 0.68254, 0.485274, 0.000209595, 0, 0.714286, 0.465411, 0.000201011, 0, 0.746032, 0.445854, 0.00019109, 0, 0.777778, 0.426911, 0.000182897, 0, 0.809524, 0.408222, 0.000173569, 0, 0.84127, 0.390307, 0.000165496, 0, 0.873016, 0.372624, 0.000156799, 0, 0.904762, 0.355804, 0.00014917, 0, 0.936508, 0.33924, 0.000140907, 0, 0.968254, 0.323534, 0.000134062, 0, 1, 1, 6.22487e-06, 0, 0, 1, 6.2251e-06, 0, 0, 1, 6.22837e-06, 0, 0, 0.999999, 6.24259e-06, 0, 0, 0.999998, 6.28127e-06, 0, 0, 0.999996, 6.36451e-06, 0, 0, 0.999991, 6.5218e-06, 0, 0, 0.999984, 6.79782e-06, 0, 0, 0.999973, 7.26361e-06, 0, 0, 0.999955, 8.03644e-06, 0, 0, 0.999931, 9.31397e-06, 0, 0, 0.999896, 1.14299e-05, 0, 0, 0.999847, 1.49402e-05, 0, 0, 0.999784, 2.07461e-05, 0, 0, 0.999692, 3.02493e-05, 0, 0, 0.999554, 4.54957e-05, 0, 9.97275e-05, 0.999326, 6.90762e-05, 0, 0.000724813, 0.998757, 0.000101605, 0, 0.0020972, 0.995367, 9.58745e-05, 0, 0.00432324, 0.99209, 8.32808e-05, 0, 0.00746347, 0.989517, 8.87601e-05, 0, 0.0115534, 0.987008, 0.00010564, 0, 0.0166134, 0.98421, 0.000133179, 0, 0.0226552, 0.98021, 0.000161746, 0, 0.0296838, 0.973676, 0.000161821, 0, 0.0377016, 0.967052, 0.000178635, 0, 0.0467079, 0.959385, 0.000206765, 0, 0.0567013, 0.949461, 0.00022476, 0, 0.0676796, 0.939578, 0.00023574, 0, 0.0796403, 0.932416, 0.00025893, 0, 0.0925812, 0.923759, 0.000271228, 0, 0.106501, 0.914223, 0.000289165, 0, 0.121397, 0.902942, 0.000301156, 0, 0.13727, 0.890419, 0.000313852, 0, 0.15412, 0.876639, 0.000324408, 0, 0.171946, 0.861316, 0.00033249, 0, 0.190751, 0.84496, 0.000338497, 0, 0.210537, 0.828427, 0.000345861, 0, 0.231305, 0.811871, 0.000347863, 0, 0.253057, 0.794397, 0.000350225, 0, 0.275797, 0.775726, 0.000349915, 0, 0.299525, 0.75617, 0.000347297, 0, 0.324242, 0.736091, 0.000344232, 0, 0.349947, 0.716213, 0.000340835, 0, 0.376633, 0.695736, 0.000332369, 0, 0.404289, 0.674961, 0.000327943, 0, 0.432895, 0.653518, 0.000318533, 0, 0.462415, 0.632574, 0.000310391, 0, 0.492788, 0.61134, 0.000300755, 0, 0.523909, 0.590017, 0.000290506, 0, 0.555556, 0.568752, 0.000280446, 0, 0.587302, 0.548061, 0.000269902, 0, 0.619048, 0.52711, 0.000258815, 0, 0.650794, 0.506682, 0.000248481, 0, 0.68254, 0.486524, 0.000237141, 0, 0.714286, 0.466812, 0.000226872, 0, 0.746032, 0.44732, 0.000216037, 0, 0.777778, 0.428473, 0.000205629, 0, 0.809524, 0.409921, 0.000195691, 0, 0.84127, 0.392028, 0.000185457, 0, 0.873016, 0.374606, 0.000176436, 0, 0.904762, 0.357601, 0.000166508, 0, 0.936508, 0.341348, 0.000158385, 0, 0.968254, 0.32542, 0.000149203, 0, 1, 1, 1.03967e-05, 0, 0, 1, 1.0397e-05, 0, 0, 1, 1.04019e-05, 0, 0, 0.999999, 1.04231e-05, 0, 0, 0.999998, 1.04806e-05, 0, 0, 0.999995, 1.06042e-05, 0, 0, 0.999991, 1.08366e-05, 0, 0, 0.999982, 1.12415e-05, 0, 0, 0.999968, 1.19174e-05, 0, 0, 0.99995, 1.30227e-05, 0, 0, 0.999922, 1.48176e-05, 0, 0, 0.999884, 1.77303e-05, 0, 0, 0.99983, 2.24564e-05, 0, 0, 0.999758, 3.00966e-05, 0, 0, 0.999654, 4.23193e-05, 0, 5.49083e-06, 0.999503, 6.14848e-05, 0, 0.000296087, 0.999237, 9.03576e-05, 0, 0.00123144, 0.998491, 0.0001271, 0, 0.00295954, 0.994594, 0.000107754, 0, 0.00555829, 0.99178, 0.000103025, 0, 0.00907209, 0.989265, 0.00011154, 0, 0.0135257, 0.986998, 0.000136296, 0, 0.0189327, 0.984137, 0.000169154, 0, 0.0252993, 0.979798, 0.000196671, 0, 0.0326272, 0.97337, 0.000196678, 0, 0.0409157, 0.967239, 0.000223121, 0, 0.0501623, 0.959543, 0.000253809, 0, 0.0603638, 0.949466, 0.000265972, 0, 0.0715171, 0.939074, 0.000288372, 0, 0.0836187, 0.931118, 0.000310983, 0, 0.0966657, 0.922525, 0.000325561, 0, 0.110656, 0.912983, 0.000345725, 0, 0.125588, 0.901617, 0.0003556, 0, 0.141461, 0.889487, 0.000374012, 0, 0.158275, 0.875787, 0.000383445, 0, 0.176031, 0.860654, 0.000393972, 0, 0.19473, 0.844417, 0.000400311, 0, 0.214374, 0.82741, 0.000405004, 0, 0.234967, 0.810545, 0.000407378, 0, 0.256512, 0.793312, 0.000407351, 0, 0.279011, 0.774847, 0.000406563, 0, 0.302468, 0.755621, 0.000404903, 0, 0.326887, 0.735511, 0.000397486, 0, 0.352266, 0.715435, 0.00039357, 0, 0.378605, 0.695403, 0.000384739, 0, 0.405897, 0.674681, 0.000376108, 0, 0.43413, 0.65359, 0.000365997, 0, 0.463277, 0.632471, 0.000354957, 0, 0.493295, 0.61151, 0.000343593, 0, 0.524106, 0.59064, 0.000331841, 0, 0.555561, 0.569386, 0.000318891, 0, 0.587302, 0.548785, 0.0003072, 0, 0.619048, 0.528146, 0.00029361, 0, 0.650794, 0.507872, 0.000281709, 0, 0.68254, 0.487805, 0.000268627, 0, 0.714286, 0.468196, 0.000255887, 0, 0.746032, 0.448922, 0.000243997, 0, 0.777778, 0.430093, 0.000231662, 0, 0.809524, 0.411845, 0.000220339, 0, 0.84127, 0.393808, 0.000208694, 0, 0.873016, 0.376615, 0.000198045, 0, 0.904762, 0.359655, 0.000187375, 0, 0.936508, 0.343452, 0.000177371, 0, 0.968254, 0.32765, 0.000167525, 0, 1, 1, 1.69351e-05, 0, 0, 1, 1.69356e-05, 0, 0, 1, 1.69427e-05, 0, 0, 0.999999, 1.69736e-05, 0, 0, 0.999998, 1.70575e-05, 0, 0, 0.999995, 1.72372e-05, 0, 0, 0.99999, 1.75739e-05, 0, 0, 0.999979, 1.81568e-05, 0, 0, 0.999966, 1.91206e-05, 0, 0, 0.999944, 2.0677e-05, 0, 0, 0.999912, 2.31644e-05, 0, 0, 0.999869, 2.71268e-05, 0, 0, 0.999811, 3.34272e-05, 0, 0, 0.99973, 4.33979e-05, 0, 0, 0.999617, 5.90083e-05, 0, 6.80315e-05, 0.999445, 8.29497e-05, 0, 0.000612796, 0.999138, 0.000118019, 0, 0.00187408, 0.998095, 0.000156712, 0, 0.00395791, 0.993919, 0.000125054, 0, 0.00692144, 0.991333, 0.000126091, 0, 0.0107962, 0.989226, 0.000144912, 0, 0.0155986, 0.986954, 0.000175737, 0, 0.0213364, 0.983982, 0.000213883, 0, 0.0280114, 0.979128, 0.000234526, 0, 0.0356226, 0.973327, 0.000243725, 0, 0.0441668, 0.967416, 0.0002773, 0, 0.0536399, 0.959729, 0.000308799, 0, 0.0640376, 0.949758, 0.000322447, 0, 0.0753554, 0.939173, 0.000350021, 0, 0.0875893, 0.9296, 0.000370089, 0, 0.100736, 0.921181, 0.000391365, 0, 0.114793, 0.91164, 0.000413636, 0, 0.129759, 0.900435, 0.000427068, 0, 0.145632, 0.888183, 0.000441046, 0, 0.162412, 0.874772, 0.000454968, 0, 0.180101, 0.859566, 0.000461882, 0, 0.1987, 0.843579, 0.000471556, 0, 0.218213, 0.826453, 0.000474335, 0, 0.238641, 0.809164, 0.000477078, 0, 0.259989, 0.792179, 0.00047755, 0, 0.282262, 0.773866, 0.000472573, 0, 0.305464, 0.754944, 0.000469765, 0, 0.329599, 0.735133, 0.000462371, 0, 0.35467, 0.714858, 0.000453674, 0, 0.380678, 0.694829, 0.000443888, 0, 0.407622, 0.674453, 0.000432052, 0, 0.435493, 0.653685, 0.000420315, 0, 0.464275, 0.632666, 0.000406829, 0, 0.493938, 0.611676, 0.000392234, 0, 0.524422, 0.591193, 0.000379208, 0, 0.555624, 0.570145, 0.00036319, 0, 0.587302, 0.549566, 0.000349111, 0, 0.619048, 0.529278, 0.000334166, 0, 0.650794, 0.509026, 0.000318456, 0, 0.68254, 0.489186, 0.00030449, 0, 0.714286, 0.469662, 0.000289051, 0, 0.746032, 0.450691, 0.000275494, 0, 0.777778, 0.431841, 0.000261437, 0, 0.809524, 0.413752, 0.000247846, 0, 0.84127, 0.395951, 0.000235085, 0, 0.873016, 0.378633, 0.000222245, 0, 0.904762, 0.36194, 0.000210533, 0, 0.936508, 0.345599, 0.000198494, 0, 0.968254, 0.329999, 0.000188133, 0, 1, 1, 2.69663e-05, 0, 0, 1, 2.6967e-05, 0, 0, 1, 2.69772e-05, 0, 0, 0.999999, 2.70214e-05, 0, 0, 0.999998, 2.71415e-05, 0, 0, 0.999994, 2.7398e-05, 0, 0, 0.999988, 2.78771e-05, 0, 0, 0.999977, 2.87019e-05, 0, 0, 0.999961, 3.00544e-05, 0, 0, 0.999937, 3.22138e-05, 0, 0, 0.999904, 3.56163e-05, 0, 0, 0.999854, 4.09465e-05, 0, 0, 0.99979, 4.92651e-05, 0, 0, 0.999699, 6.21722e-05, 0, 8.8288e-07, 0.999572, 8.19715e-05, 0, 0.000223369, 0.999381, 0.000111689, 0, 0.00105414, 0.999016, 0.000153862, 0, 0.0026493, 0.997437, 0.000187667, 0, 0.00508608, 0.993545, 0.000155672, 0, 0.00840554, 0.991135, 0.000161455, 0, 0.012629, 0.989157, 0.000188241, 0, 0.0177661, 0.986874, 0.000226229, 0, 0.0238198, 0.983714, 0.000268668, 0, 0.0307887, 0.978301, 0.000277109, 0, 0.0386688, 0.973227, 0.000303446, 0, 0.0474554, 0.967317, 0.000341851, 0, 0.0571428, 0.959477, 0.000370885, 0, 0.0677256, 0.950012, 0.000392753, 0, 0.0791988, 0.939484, 0.00042781, 0, 0.0915576, 0.928135, 0.000443866, 0, 0.104798, 0.919819, 0.000472959, 0, 0.118918, 0.910049, 0.000491551, 0, 0.133915, 0.899181, 0.000512616, 0, 0.149788, 0.886881, 0.000523563, 0, 0.166537, 0.87359, 0.000540183, 0, 0.184164, 0.858613, 0.000547386, 0, 0.202669, 0.842809, 0.000554809, 0, 0.222056, 0.825727, 0.000558316, 0, 0.242329, 0.808086, 0.000557824, 0, 0.263492, 0.790728, 0.000556346, 0, 0.285551, 0.772987, 0.000552672, 0, 0.30851, 0.7541, 0.000543738, 0, 0.332376, 0.734669, 0.000536107, 0, 0.357153, 0.714411, 0.000523342, 0, 0.382845, 0.694196, 0.000512238, 0, 0.409454, 0.674252, 0.000497465, 0, 0.436977, 0.65357, 0.000481096, 0, 0.465404, 0.632999, 0.000467054, 0, 0.494713, 0.611994, 0.000448771, 0, 0.524864, 0.591604, 0.000431889, 0, 0.555779, 0.571134, 0.000415238, 0, 0.587302, 0.550528, 0.000396369, 0, 0.619048, 0.530292, 0.000379477, 0, 0.650794, 0.510364, 0.000361488, 0, 0.68254, 0.490749, 0.000343787, 0, 0.714286, 0.471266, 0.000327822, 0, 0.746032, 0.452462, 0.000310626, 0, 0.777778, 0.433907, 0.000295352, 0, 0.809524, 0.415659, 0.000279179, 0, 0.84127, 0.398138, 0.000264685, 0, 0.873016, 0.380833, 0.000249905, 0, 0.904762, 0.364247, 0.000236282, 0, 0.936508, 0.348041, 0.000222905, 0, 0.968254, 0.332389, 0.000210522, 0, 1, 1, 4.20604e-05, 0, 0, 1, 4.20614e-05, 0, 0, 1, 4.20757e-05, 0, 0, 0.999999, 4.2138e-05, 0, 0, 0.999997, 4.23067e-05, 0, 0, 0.999993, 4.26668e-05, 0, 0, 0.999986, 4.33372e-05, 0, 0, 0.999974, 4.44857e-05, 0, 0, 0.999956, 4.63554e-05, 0, 0, 0.99993, 4.93105e-05, 0, 0, 0.999892, 5.39077e-05, 0, 0, 0.999838, 6.10005e-05, 0, 0, 0.999767, 7.18822e-05, 0, 0, 0.999666, 8.84581e-05, 0, 3.65471e-05, 0.999525, 0.000113398, 0, 0.000485623, 0.999311, 0.000150043, 0, 0.00162096, 0.998865, 0.000200063, 0, 0.00355319, 0.996278, 0.000211014, 0, 0.00633818, 0.992956, 0.000189672, 0, 0.0100043, 0.991017, 0.000210262, 0, 0.0145648, 0.989055, 0.000244292, 0, 0.0200237, 0.986741, 0.000290481, 0, 0.0263798, 0.983288, 0.000334303, 0, 0.033629, 0.977784, 0.000340307, 0, 0.0417652, 0.973037, 0.000377864, 0, 0.0507821, 0.967181, 0.0004239, 0, 0.060673, 0.958971, 0.000443854, 0, 0.0714314, 0.950093, 0.000483039, 0, 0.0830518, 0.939552, 0.000517934, 0, 0.0955288, 0.927678, 0.000539449, 0, 0.108859, 0.918278, 0.000568604, 0, 0.123038, 0.908449, 0.000588505, 0, 0.138065, 0.897713, 0.000612473, 0, 0.153938, 0.885533, 0.000625575, 0, 0.170657, 0.872131, 0.00063854, 0, 0.188224, 0.857517, 0.000647034, 0, 0.20664, 0.841796, 0.00065209, 0, 0.225909, 0.824726, 0.0006544, 0, 0.246035, 0.807297, 0.000655744, 0, 0.267022, 0.789058, 0.000646716, 0, 0.288878, 0.77189, 0.000643898, 0, 0.311607, 0.753082, 0.000629973, 0, 0.335216, 0.7341, 0.000621564, 0, 0.359713, 0.714094, 0.000605171, 0, 0.385103, 0.693839, 0.000588752, 0, 0.41139, 0.673891, 0.000573294, 0, 0.438576, 0.653565, 0.000552682, 0, 0.466656, 0.633326, 0.000533446, 0, 0.495617, 0.612582, 0.000514635, 0, 0.525431, 0.59205, 0.00049303, 0, 0.556041, 0.571918, 0.000471842, 0, 0.587338, 0.551572, 0.000451713, 0, 0.619048, 0.531553, 0.000430049, 0, 0.650794, 0.51175, 0.000410445, 0, 0.68254, 0.49238, 0.000390098, 0, 0.714286, 0.473143, 0.000370033, 0, 0.746032, 0.45423, 0.000351205, 0, 0.777778, 0.435963, 0.000332049, 0, 0.809524, 0.41787, 0.000315021, 0, 0.84127, 0.400387, 0.000297315, 0, 0.873016, 0.383332, 0.000281385, 0, 0.904762, 0.366665, 0.000265397, 0, 0.936508, 0.350633, 0.000250601, 0, 0.968254, 0.334964, 0.00023589, 0, 1, 1, 6.43736e-05, 0, 0, 1, 6.4375e-05, 0, 0, 1, 6.43947e-05, 0, 0, 0.999999, 6.4481e-05, 0, 0, 0.999997, 6.47143e-05, 0, 0, 0.999994, 6.52119e-05, 0, 0, 0.999985, 6.61359e-05, 0, 0, 0.999972, 6.77116e-05, 0, 0, 0.999952, 7.02599e-05, 0, 0, 0.999922, 7.42517e-05, 0, 0, 0.99988, 8.03906e-05, 0, 0, 0.99982, 8.97315e-05, 0, 0, 0.999741, 0.000103838, 0, 0, 0.999629, 0.00012496, 0, 0.000149024, 0.999474, 0.000156161, 0, 0.000861027, 0.999229, 0.000201034, 0, 0.00231198, 0.998662, 0.000259069, 0, 0.00458147, 0.995299, 0.000245439, 0, 0.00770895, 0.992732, 0.00024498, 0, 0.0117126, 0.990847, 0.000273211, 0, 0.0165989, 0.988911, 0.000316492, 0, 0.0223674, 0.98654, 0.00037161, 0, 0.0290135, 0.982636, 0.000410352, 0, 0.0365309, 0.977346, 0.000421756, 0, 0.0449117, 0.972909, 0.000475578, 0, 0.0541481, 0.966821, 0.000522482, 0, 0.0642326, 0.958686, 0.000545008, 0, 0.075158, 0.949754, 0.000589286, 0, 0.0869181, 0.939184, 0.000619995, 0, 0.0995074, 0.927505, 0.000654266, 0, 0.112922, 0.916606, 0.000682362, 0, 0.127157, 0.906707, 0.000704286, 0, 0.142212, 0.895937, 0.000725909, 0, 0.158085, 0.883913, 0.000743939, 0, 0.174776, 0.870642, 0.000755157, 0, 0.192287, 0.856241, 0.000764387, 0, 0.210619, 0.84069, 0.000771032, 0, 0.229775, 0.823728, 0.000765906, 0, 0.249761, 0.806481, 0.000767604, 0, 0.270582, 0.787924, 0.000754385, 0, 0.292243, 0.770588, 0.000749668, 0, 0.314753, 0.751991, 0.000731613, 0, 0.338118, 0.733407, 0.000717655, 0, 0.362347, 0.713688, 0.000700604, 0, 0.387447, 0.693595, 0.000678765, 0, 0.413424, 0.673426, 0.000657042, 0, 0.440284, 0.65359, 0.000635892, 0, 0.468027, 0.633576, 0.000611569, 0, 0.496645, 0.613144, 0.000586011, 0, 0.526122, 0.592711, 0.000563111, 0, 0.556417, 0.572722, 0.000537699, 0, 0.587451, 0.552762, 0.000512556, 0, 0.619048, 0.532985, 0.000489757, 0, 0.650794, 0.513219, 0.000464139, 0, 0.68254, 0.493992, 0.000442193, 0, 0.714286, 0.47509, 0.000418629, 0, 0.746032, 0.456287, 0.000397045, 0, 0.777778, 0.438152, 0.000375504, 0, 0.809524, 0.420294, 0.00035492, 0, 0.84127, 0.402749, 0.000335327, 0, 0.873016, 0.385879, 0.000316422, 0, 0.904762, 0.369352, 0.000298333, 0, 0.936508, 0.353301, 0.000281417, 0, 0.968254, 0.337781, 0.000265203, 0, 1, 1, 9.68267e-05, 0, 0, 1, 9.68284e-05, 0, 0, 1, 9.68556e-05, 0, 0, 0.999999, 9.69733e-05, 0, 0, 0.999997, 9.72913e-05, 0, 0, 0.999993, 9.79688e-05, 0, 0, 0.999984, 9.92239e-05, 0, 0, 0.999969, 0.000101356, 0, 0, 0.999946, 0.000104784, 0, 0, 0.999913, 0.000110111, 0, 0, 0.999868, 0.000118217, 0, 0, 0.999801, 0.000130396, 0, 0, 0.999712, 0.000148523, 0, 1.24907e-05, 0.999589, 0.000175233, 0, 0.000355405, 0.999416, 0.000213999, 0, 0.0013528, 0.999136, 0.000268529, 0, 0.00312557, 0.998367, 0.000333088, 0, 0.00573045, 0.994701, 0.000304757, 0, 0.00919397, 0.992497, 0.000318031, 0, 0.0135261, 0.990608, 0.000353863, 0, 0.0187278, 0.988715, 0.000409044, 0, 0.0247947, 0.986241, 0.000472967, 0, 0.0317196, 0.981696, 0.000495104, 0, 0.039494, 0.977097, 0.000532873, 0, 0.0481087, 0.972583, 0.000594447, 0, 0.0575549, 0.966142, 0.000636867, 0, 0.0678242, 0.95823, 0.000669899, 0, 0.0789089, 0.949677, 0.000719499, 0, 0.0908023, 0.939226, 0.000750584, 0, 0.103499, 0.927501, 0.000793183, 0, 0.116993, 0.915199, 0.00081995, 0, 0.131282, 0.90498, 0.000847654, 0, 0.146364, 0.894243, 0.000868929, 0, 0.162237, 0.882154, 0.000884278, 0, 0.178902, 0.869161, 0.000898108, 0, 0.196358, 0.854751, 0.000901254, 0, 0.21461, 0.839368, 0.00090679, 0, 0.23366, 0.822874, 0.000901541, 0, 0.253512, 0.805514, 0.000897297, 0, 0.274174, 0.78716, 0.000881856, 0, 0.29565, 0.769061, 0.000870032, 0, 0.31795, 0.751, 0.000851719, 0, 0.341081, 0.732614, 0.000830671, 0, 0.365053, 0.713171, 0.000806569, 0, 0.389874, 0.693472, 0.00078338, 0, 0.415553, 0.673528, 0.000756404, 0, 0.442098, 0.653397, 0.000726872, 0, 0.469512, 0.633781, 0.000700494, 0, 0.497794, 0.613877, 0.00067105, 0, 0.526935, 0.593506, 0.000640361, 0, 0.556908, 0.573667, 0.000613502, 0, 0.587657, 0.553932, 0.000583177, 0, 0.61906, 0.534345, 0.000554375, 0, 0.650794, 0.515042, 0.000527811, 0, 0.68254, 0.495674, 0.000499367, 0, 0.714286, 0.477132, 0.00047429, 0, 0.746032, 0.458609, 0.000447726, 0, 0.777778, 0.440354, 0.000424205, 0, 0.809524, 0.422765, 0.000399549, 0, 0.84127, 0.405472, 0.000378315, 0, 0.873016, 0.388482, 0.000355327, 0, 0.904762, 0.372191, 0.000336122, 0, 0.936508, 0.356099, 0.000315247, 0, 0.968254, 0.340737, 0.00029794, 0, 1, 1, 0.000143327, 0, 0, 1, 0.00014333, 0, 0, 1, 0.000143366, 0, 0, 0.999999, 0.000143524, 0, 0, 0.999996, 0.000143952, 0, 0, 0.999991, 0.000144862, 0, 0, 0.999981, 0.000146544, 0, 0, 0.999966, 0.000149391, 0, 0, 0.999941, 0.000153946, 0, 0, 0.999905, 0.000160971, 0, 0, 0.999852, 0.000171562, 0, 0, 0.99978, 0.00018729, 0, 0, 0.999681, 0.000210386, 0, 8.26239e-05, 0.999546, 0.000243906, 0, 0.000664807, 0.999352, 0.000291739, 0, 0.00196192, 0.999027, 0.000357419, 0, 0.00405941, 0.997886, 0.000422349, 0, 0.00699664, 0.99419, 0.000385008, 0, 0.0107896, 0.99214, 0.000409775, 0, 0.0154415, 0.990274, 0.000456418, 0, 0.0209488, 0.988455, 0.000527008, 0, 0.0273037, 0.985804, 0.000597685, 0, 0.0344969, 0.98103, 0.000613124, 0, 0.0425183, 0.976674, 0.000668321, 0, 0.0513575, 0.972021, 0.000736985, 0, 0.0610046, 0.965274, 0.000773789, 0, 0.0714508, 0.958046, 0.000830852, 0, 0.0826877, 0.949333, 0.000875766, 0, 0.0947085, 0.939135, 0.000917088, 0, 0.107507, 0.927119, 0.000952244, 0, 0.121078, 0.91469, 0.000990626, 0, 0.135419, 0.903006, 0.00101304, 0, 0.150526, 0.892368, 0.00103834, 0, 0.166399, 0.880231, 0.00105002, 0, 0.183038, 0.867432, 0.00106331, 0, 0.200443, 0.853208, 0.00106783, 0, 0.218618, 0.837956, 0.00106458, 0, 0.237566, 0.821772, 0.00105945, 0, 0.257291, 0.804328, 0.00104685, 0, 0.2778, 0.786465, 0.00103178, 0, 0.2991, 0.768004, 0.00101077, 0, 0.321199, 0.74972, 0.000985504, 0, 0.344106, 0.731682, 0.000962893, 0, 0.36783, 0.712813, 0.000932146, 0, 0.392383, 0.693139, 0.00089871, 0, 0.417774, 0.673566, 0.000869678, 0, 0.444013, 0.653483, 0.000835525, 0, 0.471107, 0.633891, 0.000799853, 0, 0.49906, 0.614433, 0.000766838, 0, 0.527869, 0.594586, 0.000732227, 0, 0.557517, 0.574769, 0.000696442, 0, 0.587966, 0.555149, 0.000663935, 0, 0.61913, 0.535898, 0.000629826, 0, 0.650794, 0.516753, 0.000596486, 0, 0.68254, 0.497816, 0.000567078, 0, 0.714286, 0.479034, 0.000534399, 0, 0.746032, 0.460975, 0.000507013, 0, 0.777778, 0.442935, 0.000477421, 0, 0.809524, 0.425263, 0.000451101, 0, 0.84127, 0.408248, 0.000424964, 0, 0.873016, 0.391339, 0.00039993, 0, 0.904762, 0.37513, 0.000377619, 0, 0.936508, 0.359172, 0.000354418, 0, 0.968254, 0.343876, 0.000334823, 0, 1, 1, 0.000209042, 0, 0, 1, 0.000209045, 0, 0, 1, 0.000209093, 0, 0, 0.999999, 0.000209304, 0, 0, 0.999996, 0.000209871, 0, 0, 0.999991, 0.000211078, 0, 0, 0.999979, 0.000213304, 0, 0, 0.999963, 0.000217061, 0, 0, 0.999933, 0.000223042, 0, 0, 0.999894, 0.000232206, 0, 0, 0.999837, 0.000245901, 0, 0, 0.999756, 0.000266023, 0, 1.02927e-06, 0.999648, 0.000295204, 0, 0.000233468, 0.999499, 0.000336958, 0, 0.00108237, 0.999283, 0.000395563, 0, 0.00268832, 0.998896, 0.000473785, 0, 0.00511138, 0.997006, 0.000520008, 0, 0.00837705, 0.993819, 0.000497261, 0, 0.0124928, 0.991632, 0.000523722, 0, 0.0174561, 0.989875, 0.000587258, 0, 0.0232596, 0.988109, 0.000676329, 0, 0.0298932, 0.985155, 0.000747701, 0, 0.0373453, 0.980479, 0.000768803, 0, 0.0456045, 0.976271, 0.000841054, 0, 0.0546593, 0.971347, 0.000911469, 0, 0.0644994, 0.964528, 0.000953057, 0, 0.0751152, 0.957632, 0.00102221, 0, 0.0864981, 0.948681, 0.00106122, 0, 0.0986407, 0.938716, 0.00111857, 0, 0.111537, 0.926629, 0.00114762, 0, 0.125182, 0.914025, 0.00118995, 0, 0.139571, 0.901026, 0.00121228, 0, 0.154703, 0.890358, 0.00123946, 0, 0.170576, 0.878283, 0.0012527, 0, 0.18719, 0.865459, 0.00125536, 0, 0.204547, 0.851407, 0.00126134, 0, 0.222648, 0.836276, 0.00124759, 0, 0.241498, 0.820436, 0.00124443, 0, 0.261101, 0.803253, 0.00122071, 0, 0.281465, 0.785562, 0.00120107, 0, 0.302595, 0.76718, 0.00117762, 0, 0.324501, 0.748551, 0.00114289, 0, 0.347192, 0.730564, 0.00110872, 0, 0.370679, 0.712253, 0.00107636, 0, 0.394973, 0.692867, 0.00103646, 0, 0.420085, 0.673695, 0.000996793, 0, 0.446027, 0.653912, 0.00095675, 0, 0.47281, 0.634129, 0.000916739, 0, 0.500441, 0.615004, 0.000874401, 0, 0.528921, 0.595587, 0.000833411, 0, 0.558244, 0.575965, 0.000794556, 0, 0.588384, 0.5566, 0.00075196, 0, 0.619281, 0.537428, 0.000716381, 0, 0.650795, 0.518623, 0.000676558, 0, 0.68254, 0.499964, 0.00064074, 0, 0.714286, 0.481356, 0.000605984, 0, 0.746032, 0.463279, 0.000570256, 0, 0.777778, 0.445673, 0.000540138, 0, 0.809524, 0.428032, 0.000507299, 0, 0.84127, 0.411112, 0.000479553, 0, 0.873016, 0.394444, 0.000450737, 0, 0.904762, 0.378247, 0.000424269, 0, 0.936508, 0.362415, 0.000399111, 0, 0.968254, 0.347103, 0.000375274, 0, 1, 1, 0.000300729, 0, 0, 1, 0.000300733, 0, 0, 1, 0.000300797, 0, 0, 0.999998, 0.000301072, 0, 0, 0.999996, 0.000301817, 0, 0, 0.999989, 0.000303398, 0, 0, 0.999977, 0.000306309, 0, 0, 0.999958, 0.000311209, 0, 0, 0.999927, 0.000318975, 0, 0, 0.999884, 0.000330804, 0, 0, 0.99982, 0.00034834, 0, 0, 0.999733, 0.000373854, 0, 3.26995e-05, 0.999613, 0.000410424, 0, 0.000477174, 0.999447, 0.000462047, 0, 0.00161099, 0.999204, 0.000533322, 0, 0.00353153, 0.998725, 0.000624964, 0, 0.00627965, 0.995871, 0.000631786, 0, 0.0098693, 0.993194, 0.000632017, 0, 0.0143011, 0.991541, 0.00068923, 0, 0.019568, 0.989773, 0.000766892, 0, 0.0256593, 0.987647, 0.000863668, 0, 0.0325625, 0.984193, 0.000922089, 0, 0.0402647, 0.980016, 0.000970749, 0, 0.0487532, 0.975859, 0.00106027, 0, 0.058016, 0.970514, 0.00112239, 0, 0.0680419, 0.963625, 0.00117212, 0, 0.0788208, 0.956959, 0.00125211, 0, 0.0903439, 0.947956, 0.00129411, 0, 0.102604, 0.93809, 0.00135879, 0, 0.115594, 0.92659, 0.00139309, 0, 0.129309, 0.913829, 0.00143253, 0, 0.143745, 0.90005, 0.00145809, 0, 0.158901, 0.888129, 0.0014748, 0, 0.174774, 0.87607, 0.00148756, 0, 0.191365, 0.863461, 0.00148714, 0, 0.208674, 0.849594, 0.00148892, 0, 0.226705, 0.834531, 0.00146496, 0, 0.245461, 0.81903, 0.0014579, 0, 0.264947, 0.802122, 0.00143039, 0, 0.28517, 0.78445, 0.00139717, 0, 0.306137, 0.766434, 0.00136312, 0, 0.327857, 0.747816, 0.00132597, 0, 0.350341, 0.729519, 0.00128323, 0, 0.373598, 0.711454, 0.00123803, 0, 0.397642, 0.692699, 0.00119097, 0, 0.422485, 0.673723, 0.00114565, 0, 0.448139, 0.654386, 0.00109552, 0, 0.474619, 0.634673, 0.00104553, 0, 0.501933, 0.615554, 0.00099985, 0, 0.530089, 0.596462, 0.000948207, 0, 0.559087, 0.577385, 0.000902299, 0, 0.588913, 0.558257, 0.000856448, 0, 0.619525, 0.5392, 0.000810395, 0, 0.650826, 0.520543, 0.000768558, 0, 0.68254, 0.502206, 0.0007239, 0, 0.714286, 0.48402, 0.000685794, 0, 0.746032, 0.465779, 0.00064471, 0, 0.777778, 0.448455, 0.000609583, 0, 0.809524, 0.431091, 0.00057227, 0, 0.84127, 0.414147, 0.00054042, 0, 0.873016, 0.39765, 0.000506545, 0, 0.904762, 0.381576, 0.000477635, 0, 0.936508, 0.365881, 0.000448446, 0, 0.968254, 0.350582, 0.000421424, 0, 1, 1, 0.000427144, 0, 0, 1, 0.000427151, 0, 0, 1, 0.000427232, 0, 0, 0.999998, 0.00042759, 0, 0, 0.999995, 0.000428555, 0, 0, 0.999988, 0.000430603, 0, 0, 0.999976, 0.000434368, 0, 0, 0.999952, 0.000440688, 0, 0, 0.999919, 0.000450667, 0, 0, 0.999871, 0.00046578, 0, 0, 0.999801, 0.000488024, 0, 0, 0.999704, 0.000520092, 0, 0.000129791, 0.999572, 0.000565553, 0, 0.000821056, 0.999389, 0.000628906, 0, 0.00225241, 0.999114, 0.000714911, 0, 0.00449109, 0.998488, 0.000819218, 0, 0.00756249, 0.995234, 0.00080415, 0, 0.0114716, 0.993021, 0.000830181, 0, 0.0162131, 0.991407, 0.000902645, 0, 0.021776, 0.989625, 0.000996934, 0, 0.0281471, 0.987064, 0.00109707, 0, 0.0353118, 0.983265, 0.00114353, 0, 0.0432562, 0.979535, 0.0012272, 0, 0.0519665, 0.975224, 0.00132642, 0, 0.0614298, 0.969574, 0.00138092, 0, 0.0716348, 0.963021, 0.00145896, 0, 0.0825709, 0.956046, 0.00152834, 0, 0.094229, 0.947136, 0.00158217, 0, 0.106602, 0.937313, 0.0016347, 0, 0.119682, 0.926073, 0.00168383, 0, 0.133465, 0.913121, 0.00171627, 0, 0.147947, 0.899165, 0.00174229, 0, 0.163125, 0.885891, 0.00176137, 0, 0.178998, 0.873783, 0.00176406, 0, 0.195566, 0.861331, 0.00176156, 0, 0.21283, 0.847569, 0.00175346, 0, 0.230793, 0.832785, 0.00172753, 0, 0.249459, 0.817442, 0.00170204, 0, 0.268832, 0.800613, 0.00166576, 0, 0.28892, 0.783597, 0.00162909, 0, 0.30973, 0.76571, 0.0015826, 0, 0.331271, 0.747021, 0.00153106, 0, 0.353554, 0.728593, 0.00148036, 0, 0.37659, 0.710661, 0.00142808, 0, 0.400391, 0.692426, 0.00136906, 0, 0.424973, 0.673623, 0.00131066, 0, 0.450347, 0.65494, 0.00125569, 0, 0.476531, 0.635448, 0.00119517, 0, 0.503535, 0.616221, 0.00113828, 0, 0.531372, 0.597531, 0.0010816, 0, 0.560047, 0.578795, 0.00102673, 0, 0.589554, 0.559892, 0.000970985, 0, 0.619869, 0.541307, 0.000919773, 0, 0.650923, 0.522608, 0.000868479, 0, 0.68254, 0.504484, 0.00082137, 0, 0.714286, 0.486603, 0.000772916, 0, 0.746032, 0.468802, 0.000730353, 0, 0.777778, 0.451172, 0.000684955, 0, 0.809524, 0.434348, 0.000647565, 0, 0.84127, 0.417445, 0.000605863, 0, 0.873016, 0.401077, 0.000571885, 0, 0.904762, 0.385039, 0.000536034, 0, 0.936508, 0.369483, 0.000504227, 0, 0.968254, 0.354272, 0.000473165, 0, 1, 1, 0.000599525, 0, 0, 1, 0.000599533, 0, 0, 1, 0.000599639, 0, 0, 0.999998, 0.000600097, 0, 0, 0.999994, 0.000601336, 0, 0, 0.999987, 0.000603958, 0, 0, 0.999972, 0.000608775, 0, 0, 0.999949, 0.000616842, 0, 0, 0.999912, 0.000629534, 0, 0, 0.999857, 0.000648658, 0, 0, 0.999781, 0.000676615, 0, 5.38873e-06, 0.999674, 0.000716574, 0, 0.000308602, 0.999528, 0.000772641, 0, 0.00127003, 0.999326, 0.000849806, 0, 0.00300783, 0.999009, 0.000952682, 0, 0.00556637, 0.998112, 0.00106394, 0, 0.00895889, 0.994496, 0.00102228, 0, 0.0131827, 0.992806, 0.00108586, 0, 0.0182277, 0.991211, 0.0011759, 0, 0.0240795, 0.989415, 0.00128955, 0, 0.030723, 0.986499, 0.00139038, 0, 0.0381418, 0.982679, 0.00144539, 0, 0.046321, 0.978839, 0.00153954, 0, 0.0552459, 0.974295, 0.00164417, 0, 0.0649034, 0.968784, 0.00171517, 0, 0.0752814, 0.962324, 0.00180282, 0, 0.0863693, 0.954956, 0.00186387, 0, 0.0981578, 0.94624, 0.00193817, 0, 0.110639, 0.936517, 0.00198156, 0, 0.123806, 0.925186, 0.00203042, 0, 0.137655, 0.91252, 0.0020664, 0, 0.15218, 0.898441, 0.00207822, 0, 0.16738, 0.884394, 0.0020992, 0, 0.183253, 0.871273, 0.00208748, 0, 0.199799, 0.859057, 0.00208686, 0, 0.21702, 0.845243, 0.00205519, 0, 0.234918, 0.830723, 0.00202868, 0, 0.253496, 0.815801, 0.00199501, 0, 0.272761, 0.79914, 0.00194193, 0, 0.292719, 0.782372, 0.00188824, 0, 0.313377, 0.76482, 0.00183695, 0, 0.334745, 0.746586, 0.00177418, 0, 0.356833, 0.7281, 0.00170628, 0, 0.379654, 0.709842, 0.00164063, 0, 0.403221, 0.692019, 0.00157355, 0, 0.427548, 0.67364, 0.00150262, 0, 0.452651, 0.655277, 0.00143473, 0, 0.478545, 0.636438, 0.00136371, 0, 0.505246, 0.617364, 0.00129911, 0, 0.532768, 0.598603, 0.00123014, 0, 0.561122, 0.580195, 0.00116587, 0, 0.590309, 0.561786, 0.00110398, 0, 0.620318, 0.543377, 0.00104148, 0, 0.651102, 0.525093, 0.000983984, 0, 0.682545, 0.506791, 0.00092667, 0, 0.714286, 0.489291, 0.000874326, 0, 0.746032, 0.471811, 0.000821734, 0, 0.777778, 0.454435, 0.000774698, 0, 0.809524, 0.437493, 0.000727302, 0, 0.84127, 0.420977, 0.000684039, 0, 0.873016, 0.404729, 0.00064373, 0, 0.904762, 0.388756, 0.00060285, 0, 0.936508, 0.373344, 0.00056765, 0, 0.968254, 0.358191, 0.000531929, 0, 1, 1, 0.000832169, 0, 0, 1, 0.000832178, 0, 0, 1, 0.00083231, 0, 0, 0.999998, 0.000832893, 0, 0, 0.999995, 0.000834465, 0, 0, 0.999985, 0.000837791, 0, 0, 0.999969, 0.000843893, 0, 0, 0.999944, 0.000854086, 0, 0, 0.999903, 0.000870071, 0, 0, 0.999843, 0.000894042, 0, 0, 0.999759, 0.000928865, 0, 5.31805e-05, 0.999643, 0.000978242, 0, 0.000579365, 0.99948, 0.00104684, 0, 0.00182774, 0.999255, 0.00114012, 0, 0.00387804, 0.998885, 0.00126188, 0, 0.00675709, 0.997405, 0.00135888, 0, 0.010468, 0.99424, 0.00133626, 0, 0.0150018, 0.992458, 0.00140905, 0, 0.0203443, 0.990929, 0.00152305, 0, 0.0264786, 0.989116, 0.00165882, 0, 0.0333875, 0.985624, 0.00174128, 0, 0.0410536, 0.982003, 0.00182108, 0, 0.0494609, 0.978336, 0.00194498, 0, 0.0585941, 0.973184, 0.00202708, 0, 0.0684396, 0.9678, 0.00212166, 0, 0.0789851, 0.961348, 0.00221366, 0, 0.0902199, 0.953841, 0.00228219, 0, 0.102134, 0.94534, 0.00235662, 0, 0.114721, 0.935552, 0.00240572, 0, 0.127972, 0.924064, 0.00244405, 0, 0.141884, 0.911827, 0.00247557, 0, 0.156451, 0.897731, 0.00248374, 0, 0.171672, 0.883409, 0.00249863, 0, 0.187545, 0.868625, 0.00246688, 0, 0.20407, 0.856529, 0.00246523, 0, 0.221249, 0.842999, 0.00242368, 0, 0.239083, 0.828505, 0.00237354, 0, 0.257578, 0.813825, 0.00232588, 0, 0.276738, 0.797813, 0.00226731, 0, 0.296569, 0.781097, 0.00219704, 0, 0.31708, 0.764038, 0.00212394, 0, 0.338281, 0.746067, 0.00204786, 0, 0.360181, 0.727687, 0.00196728, 0, 0.382794, 0.709571, 0.00188779, 0, 0.406133, 0.691503, 0.00180532, 0, 0.430213, 0.673673, 0.00171849, 0, 0.45505, 0.655732, 0.00164147, 0, 0.480662, 0.637399, 0.00155858, 0, 0.507065, 0.618616, 0.00147641, 0, 0.534278, 0.60005, 0.00140125, 0, 0.562313, 0.581713, 0.00132441, 0, 0.59118, 0.563546, 0.00125014, 0, 0.620875, 0.545605, 0.00118249, 0, 0.651373, 0.527559, 0.0011116, 0, 0.682593, 0.509764, 0.00104979, 0, 0.714286, 0.49193, 0.000985977, 0, 0.746032, 0.475011, 0.000928592, 0, 0.777778, 0.457878, 0.000873466, 0, 0.809524, 0.440979, 0.000819585, 0, 0.84127, 0.424613, 0.000772365, 0, 0.873016, 0.408549, 0.000722195, 0, 0.904762, 0.392771, 0.000680014, 0, 0.936508, 0.377317, 0.000636797, 0, 0.968254, 0.362352, 0.000598318, 0, 1, 1, 0.00114313, 0, 0, 1, 0.00114314, 0, 0, 0.999999, 0.00114331, 0, 0, 0.999998, 0.00114404, 0, 0, 0.999994, 0.00114601, 0, 0, 0.999984, 0.00115019, 0, 0, 0.999967, 0.00115784, 0, 0, 0.999937, 0.0011706, 0, 0, 0.999894, 0.00119054, 0, 0, 0.999828, 0.00122031, 0, 0, 0.999735, 0.00126331, 0, 0.000169263, 0.999606, 0.00132382, 0, 0.000949167, 0.999426, 0.0014071, 0, 0.00249668, 0.999173, 0.00151895, 0, 0.00486392, 0.99873, 0.00166102, 0, 0.00806323, 0.996243, 0.0017023, 0, 0.0120895, 0.993779, 0.00172782, 0, 0.0169288, 0.9919, 0.0018108, 0, 0.0225633, 0.990524, 0.00196028, 0, 0.028974, 0.98868, 0.00212014, 0, 0.036142, 0.984663, 0.00217598, 0, 0.044049, 0.981457, 0.00230563, 0, 0.0526781, 0.977608, 0.00243966, 0, 0.0620137, 0.972215, 0.00251336, 0, 0.0720418, 0.966798, 0.0026285, 0, 0.0827499, 0.960241, 0.00271409, 0, 0.0941271, 0.952489, 0.00278381, 0, 0.106164, 0.944127, 0.00285399, 0, 0.118852, 0.934282, 0.00290994, 0, 0.132185, 0.923271, 0.00294558, 0, 0.146157, 0.910803, 0.00296269, 0, 0.160766, 0.896705, 0.00296803, 0, 0.176007, 0.88238, 0.00296637, 0, 0.19188, 0.867116, 0.00293163, 0, 0.208385, 0.853636, 0.00289418, 0, 0.225523, 0.840469, 0.00284663, 0, 0.243296, 0.82639, 0.00278594, 0, 0.261709, 0.811759, 0.00271618, 0, 0.280767, 0.796113, 0.00263187, 0, 0.300476, 0.779518, 0.00254589, 0, 0.320845, 0.763142, 0.00246003, 0, 0.341883, 0.745464, 0.00236529, 0, 0.363601, 0.727491, 0.00226536, 0, 0.386011, 0.709414, 0.00216375, 0, 0.409128, 0.691396, 0.00207127, 0, 0.432967, 0.67368, 0.00197106, 0, 0.457545, 0.656049, 0.00187022, 0, 0.482881, 0.638188, 0.00177605, 0, 0.508992, 0.620177, 0.00168482, 0, 0.535899, 0.601506, 0.00158909, 0, 0.563619, 0.58362, 0.00150583, 0, 0.592165, 0.565496, 0.00141791, 0, 0.621544, 0.54789, 0.00133693, 0, 0.651743, 0.530323, 0.00126038, 0, 0.682709, 0.512795, 0.00118556, 0, 0.714286, 0.495199, 0.00111527, 0, 0.746032, 0.478101, 0.0010489, 0, 0.777778, 0.461511, 0.000984264, 0, 0.809524, 0.444879, 0.00092591, 0, 0.84127, 0.428424, 0.000866582, 0, 0.873016, 0.412495, 0.000814463, 0, 0.904762, 0.396975, 0.000764498, 0, 0.936508, 0.381614, 0.000715967, 0, 0.968254, 0.366732, 0.000672483, 0, 1, 1, 0.00155501, 0, 0, 1, 0.00155503, 0, 0, 1, 0.00155524, 0, 0, 0.999998, 0.00155615, 0, 0, 0.999994, 0.0015586, 0, 0, 0.999983, 0.00156379, 0, 0, 0.999963, 0.0015733, 0, 0, 0.999932, 0.00158911, 0, 0, 0.999882, 0.00161376, 0, 0, 0.99981, 0.00165041, 0, 1.00875e-05, 0.999708, 0.00170304, 0, 0.000367658, 0.999565, 0.00177658, 0, 0.0014234, 0.999368, 0.00187688, 0, 0.00327939, 0.999081, 0.00200989, 0, 0.00596629, 0.99852, 0.00217177, 0, 0.0094852, 0.99549, 0.0021745, 0, 0.013824, 0.993252, 0.00222357, 0, 0.0189642, 0.991727, 0.00235022, 0, 0.0248856, 0.989951, 0.00250561, 0, 0.0315669, 0.988029, 0.00268829, 0, 0.0389882, 0.984029, 0.0027496, 0, 0.0471302, 0.980683, 0.00289793, 0, 0.0559754, 0.976554, 0.00303315, 0, 0.0655081, 0.97139, 0.00313257, 0, 0.0757138, 0.965544, 0.00323656, 0, 0.08658, 0.95912, 0.00333432, 0, 0.0980954, 0.951183, 0.0034039, 0, 0.110251, 0.942974, 0.00347515, 0, 0.123038, 0.932642, 0.00350381, 0, 0.13645, 0.922158, 0.00354519, 0, 0.150482, 0.909404, 0.00353851, 0, 0.165129, 0.896071, 0.0035435, 0, 0.18039, 0.881206, 0.00349936, 0, 0.196263, 0.866077, 0.00347256, 0, 0.212748, 0.85093, 0.003415, 0, 0.229847, 0.837703, 0.00333367, 0, 0.247561, 0.823878, 0.003249, 0, 0.265895, 0.809449, 0.00316347, 0, 0.284854, 0.794379, 0.00306351, 0, 0.304445, 0.778138, 0.0029499, 0, 0.324675, 0.761997, 0.00284099, 0, 0.345555, 0.744938, 0.00272104, 0, 0.367095, 0.727212, 0.00260715, 0, 0.389309, 0.709549, 0.00248855, 0, 0.41221, 0.691704, 0.00236783, 0, 0.435814, 0.673689, 0.00225178, 0, 0.460138, 0.656453, 0.00213765, 0, 0.485203, 0.639128, 0.00202178, 0, 0.511028, 0.621512, 0.00191443, 0, 0.537634, 0.603598, 0.00180977, 0, 0.565041, 0.58559, 0.00170456, 0, 0.593268, 0.567852, 0.00160927, 0, 0.622327, 0.5503, 0.00151395, 0, 0.652217, 0.533033, 0.00142499, 0, 0.682907, 0.515942, 0.00133955, 0, 0.714296, 0.498814, 0.0012602, 0, 0.746032, 0.481595, 0.00118188, 0, 0.777778, 0.465117, 0.00111171, 0, 0.809524, 0.448865, 0.00104091, 0, 0.84127, 0.432711, 0.000976618, 0, 0.873016, 0.416822, 0.00091859, 0, 0.904762, 0.401272, 0.000857704, 0, 0.936508, 0.386226, 0.000807172, 0, 0.968254, 0.371321, 0.00075464, 0, 1, 1, 0.00209596, 0, 0, 1, 0.00209598, 0, 0, 1, 0.00209624, 0, 0, 0.999997, 0.00209736, 0, 0, 0.999991, 0.00210039, 0, 0, 0.999979, 0.00210678, 0, 0, 0.999959, 0.00211847, 0, 0, 0.999925, 0.0021379, 0, 0, 0.99987, 0.00216809, 0, 0, 0.999791, 0.00221281, 0, 6.81487e-05, 0.999677, 0.00227669, 0, 0.000658161, 0.999521, 0.00236533, 0, 0.00200635, 0.999301, 0.00248514, 0, 0.0041779, 0.998977, 0.00264185, 0, 0.00718648, 0.998191, 0.00281695, 0, 0.0110239, 0.994801, 0.00278518, 0, 0.015672, 0.993091, 0.00288774, 0, 0.0211091, 0.991571, 0.00303931, 0, 0.0273123, 0.9897, 0.00321643, 0, 0.034259, 0.987023, 0.00337332, 0, 0.0419282, 0.983289, 0.00346146, 0, 0.0502998, 0.979892, 0.00363704, 0, 0.0593562, 0.975111, 0.00373601, 0, 0.069081, 0.970351, 0.0038842, 0, 0.0794598, 0.964131, 0.00397053, 0, 0.0904798, 0.957747, 0.00408078, 0, 0.10213, 0.949536, 0.00413533, 0, 0.1144, 0.941372, 0.00420305, 0, 0.127284, 0.931049, 0.00422815, 0, 0.140772, 0.920647, 0.00425048, 0, 0.154862, 0.908033, 0.0042281, 0, 0.169548, 0.895028, 0.00422026, 0, 0.184828, 0.879968, 0.00415042, 0, 0.200701, 0.864875, 0.00408821, 0, 0.217167, 0.84918, 0.00400909, 0, 0.234227, 0.834934, 0.00391178, 0, 0.251884, 0.821397, 0.00380066, 0, 0.270141, 0.807135, 0.00367974, 0, 0.289004, 0.792363, 0.00355172, 0, 0.308479, 0.776661, 0.003411, 0, 0.328575, 0.760705, 0.00328123, 0, 0.349301, 0.744408, 0.00314003, 0, 0.370668, 0.726994, 0.0029906, 0, 0.392689, 0.709598, 0.00285034, 0, 0.415379, 0.692112, 0.00271179, 0, 0.438754, 0.674435, 0.00257185, 0, 0.46283, 0.65676, 0.00243425, 0, 0.48763, 0.639982, 0.00230351, 0, 0.513173, 0.622983, 0.0021777, 0, 0.539482, 0.605471, 0.00204991, 0, 0.566579, 0.58796, 0.00193759, 0, 0.594488, 0.570463, 0.00181976, 0, 0.623226, 0.553058, 0.00171497, 0, 0.6528, 0.535894, 0.00161109, 0, 0.683198, 0.519089, 0.00151394, 0, 0.714354, 0.502454, 0.00142122, 0, 0.746032, 0.485681, 0.00133488, 0, 0.777778, 0.468935, 0.00124975, 0, 0.809524, 0.452951, 0.00117309, 0, 0.84127, 0.437139, 0.00110155, 0, 0.873016, 0.421446, 0.00103124, 0, 0.904762, 0.405951, 0.000966387, 0, 0.936508, 0.391003, 0.000908119, 0, 0.968254, 0.376198, 0.000848057, 0, 1, 1, 0.00280076, 0, 0, 1, 0.00280078, 0, 0, 0.999999, 0.00280109, 0, 0, 0.999997, 0.00280246, 0, 0, 0.999992, 0.00280616, 0, 0, 0.999979, 0.00281396, 0, 0, 0.999956, 0.00282822, 0, 0, 0.999916, 0.00285186, 0, 0, 0.999857, 0.0028885, 0, 0, 0.999768, 0.00294259, 0, 0.000196026, 0.999645, 0.00301946, 0, 0.00104842, 0.99947, 0.00312541, 0, 0.00270199, 0.999229, 0.00326733, 0, 0.00519449, 0.998852, 0.00344992, 0, 0.00852602, 0.997558, 0.00361052, 0, 0.0126804, 0.994417, 0.0035898, 0, 0.017635, 0.992824, 0.00372393, 0, 0.023365, 0.991344, 0.00390695, 0, 0.0298456, 0.989337, 0.00410392, 0, 0.0370529, 0.985811, 0.00420987, 0, 0.0449651, 0.982772, 0.00437488, 0, 0.0535615, 0.979001, 0.00455069, 0, 0.0628243, 0.974102, 0.00464462, 0, 0.0727368, 0.969197, 0.00480577, 0, 0.0832844, 0.962759, 0.00487818, 0, 0.0944545, 0.956207, 0.00498176, 0, 0.106236, 0.947909, 0.00503392, 0, 0.118619, 0.939596, 0.00507474, 0, 0.131595, 0.929642, 0.00509798, 0, 0.145159, 0.918807, 0.00508476, 0, 0.159305, 0.906921, 0.00505634, 0, 0.174028, 0.893312, 0.00498845, 0, 0.189327, 0.878933, 0.0049133, 0, 0.2052, 0.863986, 0.0048259, 0, 0.221647, 0.847936, 0.00470848, 0, 0.23867, 0.832253, 0.00456889, 0, 0.25627, 0.818619, 0.00442726, 0, 0.274453, 0.804788, 0.00427677, 0, 0.293222, 0.790241, 0.00411906, 0, 0.312585, 0.775162, 0.00394833, 0, 0.33255, 0.759463, 0.00377366, 0, 0.353126, 0.743598, 0.00361026, 0, 0.374324, 0.72697, 0.00343627, 0, 0.396158, 0.709646, 0.00326422, 0, 0.418641, 0.69277, 0.00309717, 0, 0.44179, 0.675371, 0.0029356, 0, 0.465624, 0.657863, 0.00277712, 0, 0.490163, 0.640772, 0.00261738, 0, 0.515429, 0.624441, 0.0024737, 0, 0.541445, 0.607497, 0.00233125, 0, 0.568236, 0.590438, 0.00218994, 0, 0.595828, 0.573224, 0.0020664, 0, 0.624242, 0.556168, 0.00193526, 0, 0.653496, 0.539232, 0.00182463, 0, 0.683588, 0.522352, 0.00170735, 0, 0.714482, 0.506172, 0.00160555, 0, 0.746032, 0.489842, 0.00150451, 0, 0.777778, 0.473463, 0.00140938, 0, 0.809524, 0.457266, 0.00132568, 0, 0.84127, 0.441609, 0.0012376, 0, 0.873016, 0.426348, 0.00116265, 0, 0.904762, 0.411002, 0.00108935, 0, 0.936508, 0.396045, 0.00101946, 0, 0.968254, 0.381448, 0.000955665, 0, 1, 1, 0.0037121, 0, 0, 1, 0.00371213, 0, 0, 1, 0.00371251, 0, 0, 0.999997, 0.00371417, 0, 0, 0.99999, 0.00371863, 0, 0, 0.999977, 0.00372807, 0, 0, 0.99995, 0.00374529, 0, 0, 0.999908, 0.0037738, 0, 0, 0.999843, 0.00381789, 0, 1.23596e-05, 0.999745, 0.00388273, 0, 0.000407442, 0.999608, 0.00397443, 0, 0.0015447, 0.999415, 0.00409998, 0, 0.00351385, 0.999143, 0.00426662, 0, 0.0063316, 0.9987, 0.00447625, 0, 0.00998679, 0.996363, 0.00455323, 0, 0.0144569, 0.994021, 0.00461052, 0, 0.0197151, 0.992372, 0.00476359, 0, 0.0257344, 0.991007, 0.00499101, 0, 0.0324882, 0.988767, 0.0051972, 0, 0.0399517, 0.984872, 0.00528407, 0, 0.0481022, 0.982004, 0.00548926, 0, 0.0569191, 0.977714, 0.00564385, 0, 0.0663839, 0.973076, 0.0057693, 0, 0.0764801, 0.967565, 0.0058924, 0, 0.0871928, 0.961384, 0.00599629, 0, 0.0985095, 0.954435, 0.00605998, 0, 0.110419, 0.946303, 0.0061133, 0, 0.122912, 0.937662, 0.00612028, 0, 0.13598, 0.927867, 0.00612209, 0, 0.149617, 0.916475, 0.00604813, 0, 0.163817, 0.90541, 0.00603088, 0, 0.178577, 0.891591, 0.00592218, 0, 0.193894, 0.877573, 0.00578854, 0, 0.209767, 0.862511, 0.00566648, 0, 0.226196, 0.846861, 0.00551481, 0, 0.243182, 0.83068, 0.00533754, 0, 0.260728, 0.815725, 0.00515487, 0, 0.278837, 0.802321, 0.0049655, 0, 0.297515, 0.787826, 0.00475421, 0, 0.316768, 0.773454, 0.00456002, 0, 0.336605, 0.758224, 0.00434727, 0, 0.357034, 0.74265, 0.00414444, 0, 0.378067, 0.726729, 0.00393738, 0, 0.399717, 0.710155, 0.00373575, 0, 0.421998, 0.693312, 0.00353736, 0, 0.444928, 0.67653, 0.00334368, 0, 0.468523, 0.659444, 0.00315981, 0, 0.492806, 0.642051, 0.00297809, 0, 0.517798, 0.625758, 0.00280592, 0, 0.543525, 0.609615, 0.00264254, 0, 0.570012, 0.592919, 0.00248459, 0, 0.597288, 0.576298, 0.00233327, 0, 0.625379, 0.559489, 0.00219519, 0, 0.654307, 0.542891, 0.00205441, 0, 0.684084, 0.526255, 0.00193385, 0, 0.714693, 0.509853, 0.00180745, 0, 0.746044, 0.494131, 0.00169817, 0, 0.777778, 0.478114, 0.0015913, 0, 0.809524, 0.462274, 0.00148981, 0, 0.84127, 0.446412, 0.00139537, 0, 0.873016, 0.431274, 0.00130984, 0, 0.904762, 0.41635, 0.00122403, 0, 0.936508, 0.401476, 0.00114809, 0, 0.968254, 0.386993, 0.00107563, 0, 1, 1, 0.00488216, 0, 0, 1, 0.0048822, 0, 0, 1, 0.00488265, 0, 0, 0.999997, 0.00488463, 0, 0, 0.999988, 0.00488999, 0, 0, 0.999974, 0.00490129, 0, 0, 0.999946, 0.00492191, 0, 0, 0.999897, 0.00495598, 0, 0, 0.999825, 0.00500855, 0, 7.44791e-05, 0.999718, 0.00508559, 0, 0.000712744, 0.999565, 0.005194, 0, 0.00215249, 0.999352, 0.00534147, 0, 0.00444576, 0.999046, 0.00553523, 0, 0.00759218, 0.998492, 0.00577016, 0, 0.0115714, 0.995564, 0.00578487, 0, 0.0163557, 0.993339, 0.00586414, 0, 0.021915, 0.991834, 0.00606002, 0, 0.0282201, 0.990496, 0.00633312, 0, 0.0352433, 0.987826, 0.00651941, 0, 0.042959, 0.98383, 0.00660842, 0, 0.0513439, 0.98109, 0.00685523, 0, 0.0603772, 0.976131, 0.00695778, 0, 0.0700402, 0.971922, 0.00714236, 0, 0.0803163, 0.965901, 0.00721437, 0, 0.0911908, 0.959606, 0.00732017, 0, 0.102651, 0.952504, 0.00735788, 0, 0.114686, 0.944365, 0.00738493, 0, 0.127286, 0.935652, 0.00737969, 0, 0.140443, 0.925813, 0.00733612, 0, 0.154151, 0.914397, 0.00723094, 0, 0.168405, 0.903257, 0.00714002, 0, 0.183201, 0.890015, 0.00700149, 0, 0.198536, 0.876014, 0.00682813, 0, 0.214409, 0.861436, 0.00665567, 0, 0.23082, 0.845752, 0.00644526, 0, 0.24777, 0.829169, 0.00621635, 0, 0.265263, 0.813435, 0.00597789, 0, 0.283301, 0.799701, 0.00575694, 0, 0.301889, 0.785726, 0.00549866, 0, 0.321035, 0.77152, 0.0052503, 0, 0.340746, 0.75683, 0.00499619, 0, 0.361032, 0.741951, 0.0047543, 0, 0.381904, 0.726367, 0.0045084, 0, 0.403374, 0.710537, 0.00426784, 0, 0.425457, 0.693965, 0.00403487, 0, 0.448169, 0.677724, 0.0038075, 0, 0.47153, 0.66117, 0.00359431, 0, 0.495561, 0.644274, 0.00338354, 0, 0.520284, 0.627449, 0.00318163, 0, 0.545725, 0.611645, 0.00299672, 0, 0.571911, 0.595614, 0.00281016, 0, 0.598873, 0.579426, 0.00264252, 0, 0.62664, 0.563016, 0.00247509, 0, 0.655239, 0.546728, 0.00232647, 0, 0.684692, 0.530539, 0.00217803, 0, 0.714999, 0.514164, 0.00204216, 0, 0.746106, 0.498344, 0.00191403, 0, 0.777778, 0.482957, 0.00179203, 0, 0.809524, 0.467336, 0.00167695, 0, 0.84127, 0.451994, 0.00157567, 0, 0.873016, 0.436514, 0.00147113, 0, 0.904762, 0.42178, 0.00138034, 0, 0.936508, 0.407271, 0.00129219, 0, 0.968254, 0.392822, 0.0012098, 0, 1, 1, 0.00637427, 0, 0, 1, 0.00637431, 0, 0, 0.999999, 0.00637485, 0, 0, 0.999996, 0.00637721, 0, 0, 0.999987, 0.00638357, 0, 0, 0.999971, 0.006397, 0, 0, 0.999939, 0.00642142, 0, 0, 0.999888, 0.00646177, 0, 0, 0.999807, 0.00652387, 0, 0.000207916, 0.999689, 0.00661454, 0, 0.00112051, 0.99952, 0.00674155, 0, 0.00287719, 0.999283, 0.00691313, 0, 0.00550145, 0.998936, 0.00713598, 0, 0.00897928, 0.998165, 0.00738501, 0, 0.0132829, 0.994847, 0.00734388, 0, 0.01838, 0.993182, 0.00749991, 0, 0.0242381, 0.991665, 0.0077246, 0, 0.030826, 0.989708, 0.00797579, 0, 0.0381152, 0.986663, 0.00813011, 0, 0.0460794, 0.983288, 0.00830365, 0, 0.0546951, 0.980104, 0.00853496, 0, 0.0639411, 0.974855, 0.00861045, 0, 0.0737988, 0.97045, 0.00879133, 0, 0.0842516, 0.964509, 0.00886377, 0, 0.0952848, 0.957594, 0.00890346, 0, 0.106886, 0.950546, 0.00893289, 0, 0.119044, 0.942225, 0.00890074, 0, 0.131749, 0.933365, 0.00886826, 0, 0.144994, 0.923202, 0.0087316, 0, 0.158772, 0.912605, 0.00863082, 0, 0.173078, 0.901099, 0.00847403, 0, 0.187908, 0.888177, 0.00825838, 0, 0.203261, 0.873955, 0.00801834, 0, 0.219134, 0.860091, 0.00779026, 0, 0.235527, 0.84434, 0.00752478, 0, 0.252443, 0.828517, 0.00724074, 0, 0.269883, 0.81239, 0.00693769, 0, 0.287851, 0.79721, 0.00664817, 0, 0.306352, 0.783489, 0.00634763, 0, 0.325393, 0.769514, 0.00604221, 0, 0.344981, 0.755419, 0.00573568, 0, 0.365126, 0.741083, 0.00544359, 0, 0.385839, 0.726059, 0.00515515, 0, 0.407132, 0.710809, 0.00487139, 0, 0.42902, 0.695052, 0.00459846, 0, 0.45152, 0.678886, 0.00433412, 0, 0.474651, 0.663042, 0.00407981, 0, 0.498433, 0.646634, 0.00384264, 0, 0.52289, 0.630117, 0.00360897, 0, 0.548048, 0.613804, 0.00338863, 0, 0.573936, 0.598338, 0.00318486, 0, 0.600584, 0.582687, 0.00298377, 0, 0.628027, 0.566809, 0.00280082, 0, 0.656295, 0.550817, 0.00262255, 0, 0.685417, 0.534937, 0.00245835, 0, 0.715406, 0.519151, 0.00230574, 0, 0.74624, 0.503118, 0.0021549, 0, 0.777778, 0.487723, 0.00202008, 0, 0.809524, 0.472725, 0.00189355, 0, 0.84127, 0.457599, 0.00177108, 0, 0.873016, 0.442558, 0.00165843, 0, 0.904762, 0.427624, 0.00155494, 0, 0.936508, 0.413171, 0.00145273, 0, 0.968254, 0.399122, 0.00136454, 0, 1, 1, 0.00826496, 0, 0, 1, 0.00826499, 0, 0, 1, 0.00826564, 0, 0, 0.999996, 0.00826842, 0, 0, 0.999987, 0.00827589, 0, 0, 0.999967, 0.00829167, 0, 0, 0.999933, 0.00832037, 0, 0, 0.999876, 0.00836768, 0, 1.09338e-05, 0.999786, 0.00844031, 0, 0.000427145, 0.999655, 0.00854603, 0, 0.0016384, 0.999468, 0.00869337, 0, 0.00372392, 0.999203, 0.008891, 0, 0.00668513, 0.998803, 0.00914387, 0, 0.0104968, 0.99748, 0.00935838, 0, 0.015125, 0.994446, 0.00933309, 0, 0.0205338, 0.99292, 0.00953084, 0, 0.0266884, 0.991414, 0.0097893, 0, 0.0335565, 0.989049, 0.0100228, 0, 0.0411086, 0.98582, 0.0101664, 0, 0.0493181, 0.982441, 0.0103582, 0, 0.0581613, 0.978595, 0.0105292, 0, 0.0676169, 0.973495, 0.0106274, 0, 0.0776661, 0.968405, 0.0107261, 0, 0.0882926, 0.962717, 0.0108234, 0, 0.0994817, 0.955478, 0.0108102, 0, 0.111221, 0.948275, 0.0107914, 0, 0.123499, 0.940006, 0.0107161, 0, 0.136308, 0.930831, 0.0106309, 0, 0.149639, 0.920648, 0.0104083, 0, 0.163485, 0.910205, 0.0102312, 0, 0.177843, 0.898445, 0.0100051, 0, 0.192707, 0.885986, 0.00971928, 0, 0.208077, 0.872204, 0.00940747, 0, 0.22395, 0.858436, 0.0091085, 0, 0.240326, 0.843454, 0.00876595, 0, 0.257208, 0.827437, 0.00839794, 0, 0.274596, 0.811488, 0.00803692, 0, 0.292496, 0.796039, 0.00767352, 0, 0.310911, 0.781083, 0.0073097, 0, 0.329849, 0.767642, 0.00694032, 0, 0.349316, 0.753901, 0.00657476, 0, 0.369323, 0.740131, 0.00622699, 0, 0.38988, 0.725845, 0.0058838, 0, 0.410999, 0.710991, 0.00555586, 0, 0.432696, 0.696002, 0.00523089, 0, 0.454987, 0.680461, 0.00492494, 0, 0.47789, 0.664875, 0.00463464, 0, 0.501426, 0.649273, 0.00435422, 0, 0.52562, 0.63302, 0.0040875, 0, 0.550498, 0.61705, 0.00384075, 0, 0.576089, 0.601154, 0.00359557, 0, 0.602427, 0.586008, 0.00337636, 0, 0.629544, 0.570699, 0.00316019, 0, 0.657479, 0.555166, 0.00296033, 0, 0.686264, 0.539645, 0.00277552, 0, 0.715924, 0.524159, 0.00259499, 0, 0.746459, 0.508682, 0.00243257, 0, 0.777789, 0.493163, 0.00227851, 0, 0.809524, 0.478004, 0.00213083, 0, 0.84127, 0.46347, 0.00199502, 0, 0.873016, 0.448778, 0.00186967, 0, 0.904762, 0.434105, 0.00174732, 0, 0.936508, 0.419576, 0.00163861, 0, 0.968254, 0.405541, 0.00153341, 0, 1, 1, 0.0106462, 0, 0, 1, 0.0106462, 0, 0, 0.999999, 0.010647, 0, 0, 0.999995, 0.0106502, 0, 0, 0.999985, 0.0106589, 0, 0, 0.999964, 0.0106773, 0, 0, 0.999925, 0.0107106, 0, 0, 0.999861, 0.0107655, 0, 7.12986e-05, 0.999763, 0.0108497, 0, 0.000743959, 0.999616, 0.0109716, 0, 0.00227361, 0.999408, 0.0111408, 0, 0.0046983, 0.999112, 0.0113659, 0, 0.00800158, 0.998637, 0.0116475, 0, 0.0121493, 0.996223, 0.0117231, 0, 0.0171023, 0.994006, 0.0118064, 0, 0.0228218, 0.992444, 0.0120254, 0, 0.0292711, 0.991028, 0.0123314, 0, 0.036417, 0.98803, 0.0124954, 0, 0.0442295, 0.984816, 0.0126538, 0, 0.0526815, 0.981399, 0.0128537, 0, 0.0617492, 0.977085, 0.0129694, 0, 0.0714114, 0.972154, 0.013091, 0, 0.0816495, 0.966617, 0.0131166, 0, 0.0924472, 0.960628, 0.0131583, 0, 0.10379, 0.953295, 0.0131094, 0, 0.115665, 0.94575, 0.0129966, 0, 0.128062, 0.937654, 0.0128796, 0, 0.140972, 0.927716, 0.0126477, 0, 0.154387, 0.917932, 0.0123889, 0, 0.168301, 0.907719, 0.012131, 0, 0.182709, 0.89584, 0.0118013, 0, 0.197608, 0.883526, 0.0114145, 0, 0.212994, 0.870301, 0.0110075, 0, 0.228867, 0.856272, 0.0106019, 0, 0.245227, 0.842251, 0.0101938, 0, 0.262074, 0.826466, 0.00973254, 0, 0.279412, 0.810859, 0.0092846, 0, 0.297244, 0.795051, 0.00883304, 0, 0.315575, 0.780053, 0.00840272, 0, 0.334412, 0.76575, 0.00796438, 0, 0.35376, 0.752298, 0.00752526, 0, 0.373631, 0.739153, 0.00711486, 0, 0.394034, 0.725514, 0.00670361, 0, 0.414983, 0.711473, 0.00632656, 0, 0.436491, 0.696936, 0.00595206, 0, 0.458575, 0.682126, 0.00559191, 0, 0.481253, 0.667027, 0.00525362, 0, 0.504547, 0.651875, 0.00493805, 0, 0.528481, 0.636463, 0.00462848, 0, 0.553081, 0.620641, 0.00433936, 0, 0.578377, 0.604931, 0.00407, 0, 0.604404, 0.589549, 0.00380864, 0, 0.631197, 0.574712, 0.00357049, 0, 0.658795, 0.559775, 0.00334466, 0, 0.687238, 0.544514, 0.00312505, 0, 0.716559, 0.529555, 0.00293199, 0, 0.746776, 0.514402, 0.00274204, 0, 0.777849, 0.499302, 0.00256647, 0, 0.809524, 0.484114, 0.00239901, 0, 0.84127, 0.469308, 0.00225148, 0, 0.873016, 0.455133, 0.00210178, 0, 0.904762, 0.440939, 0.0019727, 0, 0.936508, 0.426627, 0.00184382, 0, 0.968254, 0.412509, 0.00172548, 0, 1, 1, 0.013628, 0, 0, 1, 0.0136281, 0, 0, 0.999999, 0.0136289, 0, 0, 0.999995, 0.0136327, 0, 0, 0.999983, 0.0136427, 0, 0, 0.99996, 0.0136638, 0, 0, 0.999917, 0.0137022, 0, 0, 0.999846, 0.0137652, 0, 0.000204597, 0.999736, 0.0138615, 0, 0.00116837, 0.999573, 0.0140007, 0, 0.00303325, 0.99934, 0.0141927, 0, 0.00580613, 0.999004, 0.0144457, 0, 0.00945626, 0.998407, 0.0147489, 0, 0.0139421, 0.995464, 0.014731, 0, 0.0192202, 0.993328, 0.0148283, 0, 0.0252495, 0.991799, 0.0150797, 0, 0.0319921, 0.990397, 0.0154316, 0, 0.0394138, 0.986835, 0.0155005, 0, 0.0474843, 0.983938, 0.0157308, 0, 0.0561763, 0.980154, 0.0158753, 0, 0.0654661, 0.975659, 0.0159581, 0, 0.0753326, 0.970171, 0.0159832, 0, 0.0857571, 0.964803, 0.0160084, 0, 0.0967236, 0.958366, 0.0159484, 0, 0.108218, 0.950613, 0.0158001, 0, 0.120227, 0.942874, 0.0155845, 0, 0.132741, 0.935005, 0.0154292, 0, 0.145751, 0.924991, 0.0150742, 0, 0.159249, 0.914814, 0.0146757, 0, 0.17323, 0.904743, 0.0143097, 0, 0.187687, 0.893216, 0.0138695, 0, 0.202619, 0.880769, 0.0133706, 0, 0.218021, 0.868136, 0.0128606, 0, 0.233894, 0.85469, 0.0123403, 0, 0.250238, 0.840593, 0.0118091, 0, 0.267052, 0.825808, 0.011253, 0, 0.284341, 0.81009, 0.0107099, 0, 0.302106, 0.79504, 0.0101636, 0, 0.320354, 0.779757, 0.00964041, 0, 0.33909, 0.764697, 0.00911896, 0, 0.358322, 0.750913, 0.00859533, 0, 0.378059, 0.738175, 0.00811592, 0, 0.398311, 0.725242, 0.00764504, 0, 0.41909, 0.711864, 0.00718885, 0, 0.440412, 0.698009, 0.00675843, 0, 0.462292, 0.683841, 0.00634984, 0, 0.484748, 0.669391, 0.00595502, 0, 0.507802, 0.654731, 0.00558671, 0, 0.531477, 0.639805, 0.00523578, 0, 0.555802, 0.624789, 0.00490834, 0, 0.580805, 0.609325, 0.00459448, 0, 0.606522, 0.593975, 0.00430342, 0, 0.63299, 0.578983, 0.00403019, 0, 0.66025, 0.564442, 0.0037707, 0, 0.688346, 0.549835, 0.0035316, 0, 0.717319, 0.535039, 0.00330255, 0, 0.7472, 0.520403, 0.00308932, 0, 0.777982, 0.505687, 0.00289335, 0, 0.809524, 0.490939, 0.00270818, 0, 0.84127, 0.476233, 0.0025343, 0, 0.873016, 0.461624, 0.00237097, 0, 0.904762, 0.447833, 0.00222065, 0, 0.936508, 0.433992, 0.00207561, 0, 0.968254, 0.420147, 0.00194955, 0, 1, 1, 0.0173415, 0, 0, 1, 0.0173416, 0, 0, 0.999999, 0.0173426, 0, 0, 0.999995, 0.0173468, 0, 0, 0.999983, 0.0173582, 0, 0, 0.999954, 0.0173822, 0, 0, 0.999908, 0.0174258, 0, 6.69501e-06, 0.999828, 0.0174973, 0, 0.000427399, 0.999705, 0.0176063, 0, 0.00171019, 0.999524, 0.0177631, 0, 0.0039248, 0.999263, 0.0179781, 0, 0.00705382, 0.998878, 0.018258, 0, 0.0110552, 0.998012, 0.0185551, 0, 0.0158812, 0.994614, 0.0184264, 0, 0.0214852, 0.993132, 0.0186385, 0, 0.0278239, 0.991563, 0.0189067, 0, 0.0348585, 0.989298, 0.0191577, 0, 0.0425544, 0.986036, 0.0192522, 0, 0.050881, 0.982558, 0.0194063, 0, 0.059811, 0.978531, 0.019486, 0, 0.0693209, 0.974198, 0.0195847, 0, 0.0793895, 0.968148, 0.0194749, 0, 0.0899984, 0.962565, 0.0194277, 0, 0.101132, 0.956041, 0.0192991, 0, 0.112775, 0.947749, 0.0189893, 0, 0.124917, 0.94018, 0.018704, 0, 0.137547, 0.93165, 0.0183458, 0, 0.150655, 0.921798, 0.0178775, 0, 0.164236, 0.911573, 0.0173618, 0, 0.178281, 0.901569, 0.0168482, 0, 0.192788, 0.890341, 0.016265, 0, 0.207752, 0.877835, 0.0156199, 0, 0.223171, 0.865472, 0.0149516, 0, 0.239044, 0.852905, 0.0143274, 0, 0.255371, 0.838906, 0.0136643, 0, 0.272153, 0.824888, 0.0129903, 0, 0.289393, 0.809977, 0.0123218, 0, 0.307093, 0.794697, 0.0116572, 0, 0.325259, 0.780028, 0.0110307, 0, 0.343896, 0.765124, 0.0104236, 0, 0.363012, 0.750411, 0.0098219, 0, 0.382617, 0.737264, 0.00924397, 0, 0.402719, 0.724799, 0.00868719, 0, 0.423332, 0.712253, 0.00816476, 0, 0.444469, 0.699267, 0.00767262, 0, 0.466146, 0.685618, 0.00719746, 0, 0.488383, 0.671736, 0.00673916, 0, 0.511199, 0.657777, 0.00631937, 0, 0.534618, 0.643497, 0.00592411, 0, 0.558668, 0.62889, 0.00553928, 0, 0.58338, 0.614299, 0.0051934, 0, 0.608787, 0.599197, 0.00485985, 0, 0.634929, 0.584175, 0.00454357, 0, 0.661849, 0.569541, 0.00425787, 0, 0.689594, 0.555193, 0.00397905, 0, 0.718211, 0.540947, 0.00372364, 0, 0.747742, 0.526593, 0.00348599, 0, 0.778205, 0.512335, 0.00326103, 0, 0.80953, 0.498017, 0.00305137, 0, 0.84127, 0.483609, 0.00285485, 0, 0.873016, 0.469368, 0.00267472, 0, 0.904762, 0.455037, 0.00249945, 0, 0.936508, 0.441493, 0.00234792, 0, 0.968254, 0.428147, 0.00219936, 0, 1, 1, 0.0219422, 0, 0, 1, 0.0219423, 0, 0, 0.999998, 0.0219434, 0, 0, 0.999993, 0.0219481, 0, 0, 0.999981, 0.021961, 0, 0, 0.999949, 0.0219879, 0, 0, 0.999896, 0.0220367, 0, 5.93194e-05, 0.999808, 0.0221167, 0, 0.00075364, 0.99967, 0.0222383, 0, 0.00237884, 0.999466, 0.0224125, 0, 0.00495612, 0.999174, 0.0226495, 0, 0.00844887, 0.998725, 0.0229525, 0, 0.0128058, 0.996979, 0.0231123, 0, 0.0179742, 0.994317, 0.0230742, 0, 0.0239047, 0.992781, 0.0232895, 0, 0.0305526, 0.991191, 0.0235734, 0, 0.0378786, 0.987787, 0.0236152, 0, 0.0458475, 0.985092, 0.0237994, 0, 0.0544287, 0.981121, 0.0238553, 0, 0.0635952, 0.976924, 0.0238706, 0, 0.0733233, 0.97218, 0.0238704, 0, 0.0835922, 0.965956, 0.0236598, 0, 0.0943839, 0.959998, 0.0234735, 0, 0.105682, 0.953245, 0.0232277, 0, 0.117474, 0.944445, 0.0226973, 0, 0.129747, 0.937087, 0.0223527, 0, 0.142491, 0.928341, 0.0218144, 0, 0.155697, 0.9184, 0.0211516, 0, 0.169358, 0.907959, 0.0204553, 0, 0.183469, 0.89808, 0.0197673, 0, 0.198024, 0.887047, 0.0189915, 0, 0.21302, 0.875221, 0.0182082, 0, 0.228455, 0.86269, 0.0173584, 0, 0.244329, 0.850735, 0.0165718, 0, 0.260639, 0.837545, 0.0157524, 0, 0.277389, 0.823639, 0.0149482, 0, 0.29458, 0.809699, 0.0141431, 0, 0.312216, 0.794797, 0.0133527, 0, 0.3303, 0.780578, 0.0126193, 0, 0.34884, 0.766019, 0.0118914, 0, 0.367842, 0.751447, 0.0111839, 0, 0.387315, 0.737275, 0.010514, 0, 0.40727, 0.724545, 0.00987277, 0, 0.427717, 0.712644, 0.00926569, 0, 0.448671, 0.700432, 0.00869029, 0, 0.470149, 0.687664, 0.00814691, 0, 0.492167, 0.674288, 0.00763012, 0, 0.514746, 0.660966, 0.00714437, 0, 0.537911, 0.647264, 0.00668457, 0, 0.561688, 0.633431, 0.00626581, 0, 0.586108, 0.619133, 0.00585593, 0, 0.611206, 0.604935, 0.00548188, 0, 0.637022, 0.590236, 0.00513288, 0, 0.663599, 0.575473, 0.0047906, 0, 0.690989, 0.561228, 0.00448895, 0, 0.719242, 0.547054, 0.00420233, 0, 0.748411, 0.533175, 0.00392869, 0, 0.778531, 0.519163, 0.00367445, 0, 0.809583, 0.505328, 0.00344097, 0, 0.84127, 0.491446, 0.00322003, 0, 0.873016, 0.477356, 0.00301283, 0, 0.904762, 0.46356, 0.00282592, 0, 0.936508, 0.449623, 0.00264956, 0, 0.968254, 0.436068, 0.00246956, 0, 1, 1, 0.0276135, 0, 0, 1, 0.0276136, 0, 0, 0.999998, 0.0276148, 0, 0, 0.999993, 0.0276201, 0, 0, 0.999976, 0.0276342, 0, 0, 0.999945, 0.027664, 0, 0, 0.999884, 0.0277179, 0, 0.00018679, 0.999784, 0.027806, 0, 0.00119607, 0.99963, 0.0279394, 0, 0.00318407, 0.999401, 0.0281295, 0, 0.00613601, 0.999066, 0.0283858, 0, 0.00999963, 0.998524, 0.0287027, 0, 0.0147164, 0.995702, 0.0286256, 0, 0.0202295, 0.993593, 0.0286733, 0, 0.0264876, 0.992067, 0.0288989, 0, 0.0334452, 0.990548, 0.0292135, 0, 0.0410621, 0.986775, 0.0291296, 0, 0.0493032, 0.984054, 0.0293099, 0, 0.0581381, 0.979481, 0.0291881, 0, 0.0675397, 0.975297, 0.0291598, 0, 0.0774848, 0.96981, 0.028954, 0, 0.0879528, 0.963524, 0.028628, 0, 0.0989258, 0.957398, 0.0283135, 0, 0.110388, 0.950088, 0.0278469, 0, 0.122327, 0.941538, 0.0271798, 0, 0.134729, 0.933332, 0.0265388, 0, 0.147587, 0.924392, 0.0257776, 0, 0.160889, 0.914581, 0.024916, 0, 0.174631, 0.904347, 0.0240242, 0, 0.188806, 0.894324, 0.0231229, 0, 0.203409, 0.883724, 0.022153, 0, 0.218437, 0.872207, 0.0211355, 0, 0.233888, 0.859927, 0.0201048, 0, 0.249761, 0.848373, 0.0191263, 0, 0.266056, 0.836023, 0.0181306, 0, 0.282774, 0.82289, 0.0171718, 0, 0.299917, 0.809324, 0.0162196, 0, 0.317488, 0.795361, 0.0152622, 0, 0.335493, 0.781253, 0.01439, 0, 0.353936, 0.767338, 0.013533, 0, 0.372825, 0.753156, 0.0127244, 0, 0.392168, 0.739122, 0.0119454, 0, 0.411976, 0.725358, 0.0112054, 0, 0.432259, 0.712949, 0.010487, 0, 0.453032, 0.701621, 0.00984032, 0, 0.47431, 0.689703, 0.00921495, 0, 0.496111, 0.677216, 0.00862492, 0, 0.518456, 0.664217, 0.00806882, 0, 0.541367, 0.65137, 0.00755922, 0, 0.564872, 0.638, 0.00705705, 0, 0.589001, 0.62453, 0.00661266, 0, 0.613789, 0.610601, 0.00618432, 0, 0.639277, 0.59676, 0.00578033, 0, 0.66551, 0.582433, 0.00540927, 0, 0.692539, 0.568026, 0.00506104, 0, 0.720422, 0.55414, 0.0047353, 0, 0.749216, 0.540178, 0.00442889, 0, 0.778974, 0.526513, 0.00414363, 0, 0.809711, 0.512954, 0.00388237, 0, 0.84127, 0.499403, 0.00362875, 0, 0.873016, 0.486026, 0.00340827, 0, 0.904762, 0.472345, 0.00318598, 0, 0.936508, 0.458828, 0.00297635, 0, 0.968254, 0.445379, 0.00279447, 0, 1, 1, 0.0345716, 0, 0, 1, 0.0345717, 0, 0, 0.999999, 0.034573, 0, 0, 0.999991, 0.0345787, 0, 0, 0.999974, 0.0345941, 0, 0, 0.999937, 0.0346263, 0, 1.88589e-06, 0.999869, 0.0346847, 0, 0.000409238, 0.999757, 0.0347798, 0, 0.0017674, 0.999582, 0.0349233, 0, 0.00413658, 0.999322, 0.0351265, 0, 0.00747408, 0.998939, 0.0353967, 0, 0.0117157, 0.998219, 0.0357018, 0, 0.0167966, 0.994974, 0.0354726, 0, 0.0226572, 0.993201, 0.0355621, 0, 0.0292445, 0.991573, 0.0357641, 0, 0.0365123, 0.989301, 0.0359252, 0, 0.0444203, 0.985712, 0.0358017, 0, 0.0529334, 0.982411, 0.0358353, 0, 0.0620214, 0.977827, 0.035617, 0, 0.0716574, 0.973278, 0.0354398, 0, 0.0818186, 0.967397, 0.0350483, 0, 0.0924846, 0.960696, 0.0344795, 0, 0.103638, 0.954349, 0.0339861, 0, 0.115263, 0.946066, 0.0331323, 0, 0.127348, 0.938012, 0.032359, 0, 0.13988, 0.929413, 0.0314413, 0, 0.152849, 0.920355, 0.0304103, 0, 0.166248, 0.910586, 0.0292785, 0, 0.18007, 0.900609, 0.0281391, 0, 0.194308, 0.890093, 0.0269103, 0, 0.208958, 0.880013, 0.0257269, 0, 0.224018, 0.869001, 0.0244671, 0, 0.239485, 0.85751, 0.0232252, 0, 0.255359, 0.84582, 0.0220117, 0, 0.271638, 0.834383, 0.0208274, 0, 0.288324, 0.822158, 0.0196628, 0, 0.305419, 0.809056, 0.0185306, 0, 0.322927, 0.795832, 0.0174174, 0, 0.340851, 0.782547, 0.0163758, 0, 0.359199, 0.7689, 0.015391, 0, 0.377975, 0.755526, 0.0144488, 0, 0.397189, 0.741681, 0.0135372, 0, 0.416851, 0.728178, 0.0126957, 0, 0.436971, 0.714642, 0.0118812, 0, 0.457564, 0.702756, 0.0111165, 0, 0.478644, 0.69175, 0.0104145, 0, 0.500229, 0.680159, 0.00974439, 0, 0.522339, 0.668073, 0.00911926, 0, 0.544997, 0.655405, 0.00851393, 0, 0.56823, 0.642921, 0.00797637, 0, 0.592068, 0.629993, 0.00745119, 0, 0.616546, 0.616828, 0.00696972, 0, 0.641705, 0.603305, 0.00652425, 0, 0.66759, 0.589833, 0.00610188, 0, 0.694255, 0.575945, 0.00570834, 0, 0.72176, 0.561745, 0.00533384, 0, 0.750168, 0.548277, 0.00500001, 0, 0.779545, 0.534467, 0.00467582, 0, 0.809933, 0.521032, 0.00438092, 0, 0.841272, 0.507877, 0.00410348, 0, 0.873016, 0.494654, 0.00383618, 0, 0.904762, 0.481592, 0.00358699, 0, 0.936508, 0.468509, 0.00337281, 0, 0.968254, 0.455293, 0.00316196, 0, 1, 1, 0.0430698, 0, 0, 1, 0.0430699, 0, 0, 0.999998, 0.0430713, 0, 0, 0.999991, 0.0430773, 0, 0, 0.99997, 0.0430936, 0, 0, 0.999928, 0.0431277, 0, 4.06396e-05, 0.999852, 0.0431893, 0, 0.000744376, 0.999724, 0.0432895, 0, 0.0024806, 0.999527, 0.0434397, 0, 0.00524779, 0.99923, 0.0436507, 0, 0.00898164, 0.998783, 0.0439255, 0, 0.0136083, 0.997507, 0.0441104, 0, 0.0190582, 0.994418, 0.0438225, 0, 0.0252694, 0.992864, 0.0439396, 0, 0.0321879, 0.991127, 0.0440962, 0, 0.039767, 0.987331, 0.0438408, 0, 0.0479667, 0.984819, 0.0438991, 0, 0.056752, 0.980384, 0.0435906, 0, 0.0660929, 0.975846, 0.0432543, 0, 0.075963, 0.970748, 0.0428293, 0, 0.0863398, 0.964303, 0.042153, 0, 0.0972035, 0.95772, 0.0414111, 0, 0.108537, 0.950747, 0.0405893, 0, 0.120325, 0.942533, 0.0394887, 0, 0.132554, 0.934045, 0.0383544, 0, 0.145215, 0.924942, 0.037057, 0, 0.158296, 0.915811, 0.0356993, 0, 0.17179, 0.90612, 0.0342401, 0, 0.185691, 0.896434, 0.0328078, 0, 0.199993, 0.886021, 0.031288, 0, 0.214691, 0.876081, 0.0297776, 0, 0.229782, 0.865608, 0.0282334, 0, 0.245265, 0.854924, 0.026749, 0, 0.261138, 0.843607, 0.02526, 0, 0.277401, 0.832456, 0.0238214, 0, 0.294056, 0.821342, 0.0224682, 0, 0.311104, 0.809303, 0.0211297, 0, 0.328548, 0.796468, 0.0198387, 0, 0.346394, 0.784046, 0.0186227, 0, 0.364645, 0.771262, 0.0174561, 0, 0.38331, 0.758118, 0.0163806, 0, 0.402396, 0.745075, 0.0153287, 0, 0.421912, 0.731926, 0.0143647, 0, 0.44187, 0.71863, 0.0134363, 0, 0.462283, 0.705414, 0.0125603, 0, 0.483165, 0.693792, 0.0117508, 0, 0.504535, 0.683108, 0.0110016, 0, 0.52641, 0.67183, 0.0102757, 0, 0.548816, 0.66015, 0.00962044, 0, 0.571776, 0.647907, 0.00898031, 0, 0.595323, 0.635734, 0.00840811, 0, 0.619489, 0.623208, 0.00786211, 0, 0.644317, 0.610438, 0.00734953, 0, 0.669852, 0.597345, 0.00687688, 0, 0.696148, 0.584138, 0.00643469, 0, 0.723267, 0.5707, 0.00602236, 0, 0.75128, 0.556966, 0.0056324, 0, 0.780258, 0.543607, 0.00528277, 0, 0.810268, 0.530213, 0.00493999, 0, 0.841311, 0.516912, 0.00462265, 0, 0.873016, 0.503916, 0.0043307, 0, 0.904762, 0.491146, 0.00406858, 0, 0.936508, 0.478439, 0.00381436, 0, 0.968254, 0.465834, 0.00358003, 0, 1, 1, 0.0534039, 0, 0, 1, 0.053404, 0, 0, 0.999998, 0.0534055, 0, 0, 0.999989, 0.0534116, 0, 0, 0.999968, 0.0534283, 0, 0, 0.999918, 0.0534633, 0, 0.000155895, 0.99983, 0.0535262, 0, 0.00120914, 0.999685, 0.0536281, 0, 0.00334944, 0.999461, 0.0537799, 0, 0.00653077, 0.999119, 0.0539902, 0, 0.0106718, 0.998582, 0.0542524, 0, 0.0156907, 0.995919, 0.0540318, 0, 0.0215147, 0.993735, 0.0538914, 0, 0.0280801, 0.992126, 0.0539557, 0, 0.0353323, 0.990266, 0.0540401, 0, 0.0432247, 0.986317, 0.0536064, 0, 0.0517172, 0.983213, 0.0534425, 0, 0.0607754, 0.978303, 0.0528622, 0, 0.0703698, 0.973665, 0.0523363, 0, 0.0804742, 0.968091, 0.0516165, 0, 0.0910667, 0.961026, 0.0505434, 0, 0.102128, 0.954333, 0.049523, 0, 0.113641, 0.946372, 0.0481698, 0, 0.125591, 0.938254, 0.0467674, 0, 0.137965, 0.929516, 0.0452341, 0, 0.150754, 0.920106, 0.0435083, 0, 0.163947, 0.910899, 0.0417399, 0, 0.177537, 0.901532, 0.0399389, 0, 0.191516, 0.891919, 0.0380901, 0, 0.205881, 0.882006, 0.0362341, 0, 0.220626, 0.871965, 0.0343444, 0, 0.235749, 0.862145, 0.0324832, 0, 0.251248, 0.852058, 0.0306681, 0, 0.267121, 0.84161, 0.0289097, 0, 0.283368, 0.830806, 0.0272079, 0, 0.299992, 0.820476, 0.0256089, 0, 0.316992, 0.809514, 0.0240394, 0, 0.334374, 0.797865, 0.0225379, 0, 0.35214, 0.785621, 0.0211235, 0, 0.370296, 0.773765, 0.0197908, 0, 0.388849, 0.761629, 0.0185235, 0, 0.407807, 0.748891, 0.0173358, 0, 0.427178, 0.736437, 0.0162305, 0, 0.446974, 0.723707, 0.0151778, 0, 0.467207, 0.710606, 0.0141791, 0, 0.487892, 0.698019, 0.0132592, 0, 0.509046, 0.686203, 0.0123887, 0, 0.530687, 0.675692, 0.0115976, 0, 0.552839, 0.664826, 0.0108325, 0, 0.575527, 0.65349, 0.0101348, 0, 0.59878, 0.641774, 0.00947756, 0, 0.622634, 0.629794, 0.00886058, 0, 0.647128, 0.617647, 0.00828526, 0, 0.672308, 0.60534, 0.00775312, 0, 0.698231, 0.592718, 0.00726033, 0, 0.724958, 0.579746, 0.00679731, 0, 0.752563, 0.566763, 0.00636111, 0, 0.781127, 0.553515, 0.00595228, 0, 0.810733, 0.540118, 0.00556876, 0, 0.841426, 0.527325, 0.00523051, 0, 0.873016, 0.514265, 0.00490712, 0, 0.904762, 0.501406, 0.00460297, 0, 0.936508, 0.488922, 0.00431247, 0, 0.968254, 0.476541, 0.0040472, 0, 1, 1, 0.0659184, 0, 0, 1, 0.0659185, 0, 0, 0.999998, 0.06592, 0, 0, 0.999988, 0.0659259, 0, 0, 0.999963, 0.0659423, 0, 0, 0.999907, 0.0659764, 0, 0.000374198, 0.999806, 0.0660376, 0, 0.00182071, 0.999639, 0.0661361, 0, 0.0043894, 0.999378, 0.0662814, 0, 0.00800055, 0.998985, 0.0664779, 0, 0.0125594, 0.998285, 0.0666914, 0, 0.0179786, 0.995071, 0.0661989, 0, 0.0241822, 0.993172, 0.0660454, 0, 0.031106, 0.991438, 0.0660105, 0, 0.0386952, 0.988428, 0.0656875, 0, 0.0469032, 0.985218, 0.0652913, 0, 0.0556905, 0.981128, 0.0647107, 0, 0.065023, 0.976015, 0.0638491, 0, 0.0748717, 0.97097, 0.062993, 0, 0.0852112, 0.964582, 0.0617927, 0, 0.0960199, 0.957383, 0.0603626, 0, 0.107279, 0.949969, 0.0588128, 0, 0.118971, 0.941843, 0.0570274, 0, 0.131084, 0.933624, 0.0551885, 0, 0.143604, 0.924543, 0.053122, 0, 0.156521, 0.914919, 0.0508897, 0, 0.169825, 0.905773, 0.0486418, 0, 0.18351, 0.896434, 0.0463364, 0, 0.197569, 0.887195, 0.0440623, 0, 0.211997, 0.877706, 0.0417799, 0, 0.226789, 0.867719, 0.03945, 0, 0.241944, 0.858587, 0.037243, 0, 0.257458, 0.849317, 0.0350956, 0, 0.273331, 0.839585, 0.0329852, 0, 0.289563, 0.829856, 0.0310028, 0, 0.306154, 0.819589, 0.0290953, 0, 0.323108, 0.809714, 0.0272738, 0, 0.340426, 0.79934, 0.0255631, 0, 0.358113, 0.788224, 0.0239175, 0, 0.376175, 0.776619, 0.0223831, 0, 0.394616, 0.76521, 0.0209298, 0, 0.413445, 0.753716, 0.0195786, 0, 0.432671, 0.741564, 0.0183001, 0, 0.452305, 0.729413, 0.0171259, 0, 0.472358, 0.717146, 0.0159933, 0, 0.492845, 0.70436, 0.0149495, 0, 0.513783, 0.69219, 0.0139681, 0, 0.535189, 0.680289, 0.0130577, 0, 0.557087, 0.669611, 0.0122198, 0, 0.5795, 0.659113, 0.0114174, 0, 0.602459, 0.648148, 0.0106729, 0, 0.625997, 0.636905, 0.00998997, 0, 0.650154, 0.625154, 0.00934313, 0, 0.674976, 0.613481, 0.00874839, 0, 0.700518, 0.60154, 0.00818265, 0, 0.726845, 0.58943, 0.00766889, 0, 0.754032, 0.576828, 0.00717153, 0, 0.782167, 0.564194, 0.00672696, 0, 0.811344, 0.551501, 0.00630863, 0, 0.841644, 0.538635, 0.00592177, 0, 0.873016, 0.525724, 0.00554888, 0, 0.904762, 0.513209, 0.00520225, 0, 0.936508, 0.500457, 0.00488231, 0, 0.968254, 0.48799, 0.00457153, 0, 1, 1, 0.0810131, 0, 0, 1, 0.0810133, 0, 0, 0.999997, 0.0810145, 0, 0, 0.999985, 0.08102, 0, 0, 0.999956, 0.0810347, 0, 1.95026e-05, 0.999893, 0.0810656, 0, 0.000719316, 0.999777, 0.0811205, 0, 0.00259774, 0.999583, 0.081208, 0, 0.00561807, 0.999281, 0.0813343, 0, 0.00967472, 0.998813, 0.0814969, 0, 0.0146627, 0.997597, 0.0815217, 0, 0.0204902, 0.994379, 0.0808502, 0, 0.0270802, 0.992744, 0.0806792, 0, 0.0343674, 0.990745, 0.0804589, 0, 0.0422974, 0.986646, 0.0796107, 0, 0.0508242, 0.983611, 0.0790913, 0, 0.0599087, 0.978869, 0.0780746, 0, 0.0695175, 0.973475, 0.0768218, 0, 0.0796223, 0.967845, 0.0754926, 0, 0.0901983, 0.960778, 0.0737063, 0, 0.101224, 0.953333, 0.0718052, 0, 0.112682, 0.945274, 0.0695946, 0, 0.124555, 0.936955, 0.0672492, 0, 0.136831, 0.928319, 0.0647732, 0, 0.149496, 0.919075, 0.0620947, 0, 0.162542, 0.909114, 0.0591816, 0, 0.175958, 0.900137, 0.0563917, 0, 0.189739, 0.891069, 0.0535392, 0, 0.203877, 0.882262, 0.0507642, 0, 0.218368, 0.873232, 0.0479793, 0, 0.233208, 0.864042, 0.045226, 0, 0.248393, 0.855002, 0.0425413, 0, 0.263923, 0.846569, 0.0400126, 0, 0.279796, 0.837714, 0.0375269, 0, 0.296012, 0.828918, 0.0352027, 0, 0.312573, 0.819783, 0.0330011, 0, 0.329479, 0.810129, 0.0308908, 0, 0.346734, 0.800866, 0.0289112, 0, 0.364342, 0.79093, 0.0270255, 0, 0.382307, 0.780593, 0.0252758, 0, 0.400637, 0.769511, 0.0236178, 0, 0.419337, 0.758558, 0.0220652, 0, 0.438418, 0.747632, 0.0206289, 0, 0.457889, 0.736146, 0.0192873, 0, 0.477761, 0.724093, 0.0180333, 0, 0.49805, 0.71234, 0.0168264, 0, 0.51877, 0.700201, 0.015746, 0, 0.53994, 0.687949, 0.0147027, 0, 0.561581, 0.676163, 0.0137512, 0, 0.583718, 0.665001, 0.0128655, 0, 0.60638, 0.65472, 0.0120366, 0, 0.629599, 0.644213, 0.0112604, 0, 0.653415, 0.633382, 0.0105413, 0, 0.677874, 0.62212, 0.00986498, 0, 0.70303, 0.610631, 0.00923308, 0, 0.728948, 0.599078, 0.00864206, 0, 0.755706, 0.587519, 0.00811784, 0, 0.783396, 0.575505, 0.00761237, 0, 0.812121, 0.563148, 0.00713949, 0, 0.841989, 0.550828, 0.00668379, 0, 0.873035, 0.538458, 0.00627715, 0, 0.904762, 0.525905, 0.00588336, 0, 0.936508, 0.513517, 0.00552687, 0, 0.968254, 0.501395, 0.00519681, 0, 1, 1, 0.0991506, 0, 0, 1, 0.0991504, 0, 0, 0.999996, 0.0991515, 0, 0, 0.999984, 0.0991558, 0, 0, 0.999947, 0.0991672, 0, 0.000114389, 0.999874, 0.0991912, 0, 0.00121503, 0.999739, 0.0992331, 0, 0.00356108, 0.999514, 0.0992983, 0, 0.00705578, 0.999159, 0.0993877, 0, 0.011574, 0.998586, 0.0994837, 0, 0.017003, 0.995731, 0.0988425, 0, 0.0232484, 0.993384, 0.098276, 0, 0.0302318, 0.991615, 0.0979269, 0, 0.0378884, 0.989029, 0.0973432, 0, 0.0461641, 0.985373, 0.0963539, 0, 0.0550136, 0.981278, 0.0952306, 0, 0.0643988, 0.975777, 0.0936233, 0, 0.0742868, 0.970526, 0.0920219, 0, 0.0846501, 0.963755, 0.0898912, 0, 0.0954644, 0.956676, 0.0876064, 0, 0.106709, 0.948099, 0.0847751, 0, 0.118367, 0.939718, 0.0818638, 0, 0.130423, 0.931305, 0.078857, 0, 0.142862, 0.922342, 0.0756127, 0, 0.155674, 0.912842, 0.0721473, 0, 0.168849, 0.903304, 0.0686195, 0, 0.182378, 0.89411, 0.0650589, 0, 0.196255, 0.885512, 0.0616022, 0, 0.210473, 0.877193, 0.0582434, 0, 0.225027, 0.86877, 0.0548979, 0, 0.239915, 0.860267, 0.0516095, 0, 0.255132, 0.851915, 0.048468, 0, 0.270678, 0.843912, 0.0454447, 0, 0.286551, 0.83604, 0.0425612, 0, 0.302751, 0.828245, 0.0398752, 0, 0.31928, 0.820159, 0.0373198, 0, 0.336138, 0.81167, 0.034916, 0, 0.35333, 0.802659, 0.0326402, 0, 0.370858, 0.793921, 0.0304901, 0, 0.388728, 0.784713, 0.0284857, 0, 0.406944, 0.774946, 0.0266186, 0, 0.425515, 0.76448, 0.0248593, 0, 0.444449, 0.753793, 0.0232114, 0, 0.463756, 0.743506, 0.0217039, 0, 0.483447, 0.732555, 0.0202841, 0, 0.503535, 0.720965, 0.0189648, 0, 0.524036, 0.709422, 0.0177189, 0, 0.544968, 0.697756, 0.0165626, 0, 0.56635, 0.685565, 0.015483, 0, 0.588208, 0.673987, 0.0144892, 0, 0.610569, 0.66244, 0.0135607, 0, 0.633466, 0.651675, 0.0126956, 0, 0.656936, 0.641598, 0.0118788, 0, 0.681025, 0.63121, 0.0111261, 0, 0.705788, 0.620514, 0.010437, 0, 0.731289, 0.609366, 0.00978747, 0, 0.757606, 0.598137, 0.00917257, 0, 0.784834, 0.586966, 0.00859778, 0, 0.813085, 0.575549, 0.00806803, 0, 0.842485, 0.563797, 0.00757294, 0, 0.87313, 0.551758, 0.00710592, 0, 0.904762, 0.539894, 0.0066841, 0, 0.936508, 0.527901, 0.00627901, 0, 0.968254, 0.515819, 0.00590506, 0, 1, 1, 0.120864, 0, 0, 1, 0.120864, 0, 0, 0.999996, 0.120864, 0, 0, 0.99998, 0.120867, 0, 0, 0.99994, 0.120872, 0, 0.000323781, 0.999852, 0.120884, 0, 0.00188693, 0.999693, 0.120903, 0, 0.00473489, 0.999426, 0.120929, 0, 0.00872704, 0.999002, 0.120955, 0, 0.0137237, 0.998235, 0.120918, 0, 0.0196068, 0.994608, 0.119764, 0, 0.0262803, 0.992997, 0.119265, 0, 0.0336657, 0.990968, 0.11863, 0, 0.0416987, 0.987002, 0.117261, 0, 0.0503261, 0.983524, 0.116009, 0, 0.0595035, 0.97875, 0.114252, 0, 0.0691935, 0.972652, 0.11193, 0, 0.0793645, 0.966613, 0.109555, 0, 0.0899894, 0.959275, 0.106612, 0, 0.101045, 0.951272, 0.103375, 0, 0.112512, 0.942323, 0.0996594, 0, 0.124372, 0.933679, 0.0958841, 0, 0.136611, 0.924822, 0.0919265, 0, 0.149216, 0.915742, 0.0878061, 0, 0.162176, 0.906348, 0.0834894, 0, 0.175482, 0.896883, 0.079085, 0, 0.189125, 0.88774, 0.0746745, 0, 0.203098, 0.87986, 0.0705773, 0, 0.217396, 0.871998, 0.0665005, 0, 0.232015, 0.864325, 0.0625413, 0, 0.24695, 0.856685, 0.0586781, 0, 0.2622, 0.84925, 0.0550063, 0, 0.277761, 0.841719, 0.0514727, 0, 0.293634, 0.834755, 0.0481398, 0, 0.309819, 0.827853, 0.0450172, 0, 0.326315, 0.820888, 0.0420969, 0, 0.343126, 0.813616, 0.0393702, 0, 0.360254, 0.805767, 0.0367771, 0, 0.377701, 0.797338, 0.0343274, 0, 0.395474, 0.789122, 0.0320529, 0, 0.413577, 0.780601, 0.0299485, 0, 0.432018, 0.771424, 0.0279812, 0, 0.450804, 0.761502, 0.0261054, 0, 0.469944, 0.751166, 0.0243942, 0, 0.489451, 0.741276, 0.0228087, 0, 0.509337, 0.730898, 0.0213265, 0, 0.529617, 0.719878, 0.0199307, 0, 0.550307, 0.708379, 0.0186574, 0, 0.571428, 0.697165, 0.0174446, 0, 0.593003, 0.685554, 0.0163144, 0, 0.615059, 0.673631, 0.015276, 0, 0.637628, 0.662385, 0.0143003, 0, 0.660746, 0.651059, 0.0134112, 0, 0.68446, 0.640451, 0.0125794, 0, 0.70882, 0.630536, 0.011793, 0, 0.733893, 0.620316, 0.0110547, 0, 0.759756, 0.609722, 0.0103668, 0, 0.786505, 0.598804, 0.00973009, 0, 0.814259, 0.587871, 0.00912812, 0, 0.843157, 0.577121, 0.00858916, 0, 0.87334, 0.566019, 0.00807333, 0, 0.904762, 0.554664, 0.00759687, 0, 0.936508, 0.543101, 0.00714759, 0, 0.968254, 0.531558, 0.00673418, 0, 1, 1, 0.146767, 0, 0, 1, 0.146767, 0, 0, 0.999997, 0.146767, 0, 0, 0.999977, 0.146765, 0, 3.20658e-06, 0.999929, 0.146762, 0, 0.000682576, 0.999823, 0.146753, 0, 0.00276402, 0.999633, 0.146735, 0, 0.00614771, 0.999314, 0.146699, 0, 0.0106613, 0.998796, 0.14662, 0, 0.0161546, 0.997124, 0.146107, 0, 0.0225063, 0.994062, 0.144857, 0, 0.0296198, 0.992154, 0.144011, 0, 0.037417, 0.989186, 0.142712, 0, 0.0458348, 0.985279, 0.140926, 0, 0.0548211, 0.980826, 0.13885, 0, 0.0643326, 0.975056, 0.136168, 0, 0.074333, 0.969005, 0.133217, 0, 0.0847917, 0.961554, 0.12959, 0, 0.0956828, 0.954206, 0.125886, 0, 0.106984, 0.945046, 0.121335, 0, 0.118675, 0.935678, 0.116492, 0, 0.130741, 0.926748, 0.111635, 0, 0.143166, 0.917764, 0.106625, 0, 0.155939, 0.908358, 0.101325, 0, 0.169049, 0.899219, 0.0960249, 0, 0.182487, 0.890089, 0.0906527, 0, 0.196245, 0.881488, 0.0853905, 0, 0.210317, 0.874031, 0.0804177, 0, 0.224697, 0.866932, 0.0756005, 0, 0.23938, 0.859976, 0.0709019, 0, 0.254364, 0.853375, 0.0664391, 0, 0.269646, 0.846971, 0.0622012, 0, 0.285223, 0.840483, 0.058129, 0, 0.301096, 0.833969, 0.0542762, 0, 0.317265, 0.82806, 0.0507042, 0, 0.333729, 0.822128, 0.047368, 0, 0.350491, 0.815989, 0.044272, 0, 0.367554, 0.809336, 0.0413444, 0, 0.38492, 0.802177, 0.038601, 0, 0.402594, 0.79441, 0.0360227, 0, 0.420582, 0.786573, 0.0336383, 0, 0.438891, 0.778619, 0.0314321, 0, 0.457527, 0.77, 0.029362, 0, 0.476499, 0.760698, 0.0274102, 0, 0.49582, 0.750932, 0.0256146, 0, 0.5155, 0.740993, 0.023974, 0, 0.535555, 0.731159, 0.0224182, 0, 0.556, 0.720836, 0.0209889, 0, 0.576855, 0.709913, 0.0196411, 0, 0.598143, 0.698415, 0.0183824, 0, 0.619888, 0.68745, 0.0172222, 0, 0.642123, 0.676154, 0.0161509, 0, 0.664883, 0.664383, 0.0151397, 0, 0.688211, 0.6533, 0.0141873, 0, 0.71216, 0.642072, 0.0133105, 0, 0.736792, 0.631412, 0.0124932, 0, 0.762186, 0.621622, 0.0117408, 0, 0.788439, 0.611681, 0.0110358, 0, 0.815672, 0.60142, 0.0103775, 0, 0.844034, 0.59083, 0.00975623, 0, 0.873699, 0.580254, 0.00918084, 0, 0.904765, 0.569841, 0.00864721, 0, 0.936508, 0.559224, 0.00815731, 0, 0.968254, 0.548315, 0.00767924, 0, 1, 1, 0.177563, 0, 0, 1, 0.177563, 0, 0, 0.999994, 0.177562, 0, 0, 0.999972, 0.177555, 0, 6.64171e-05, 0.999914, 0.177536, 0, 0.0012276, 0.999787, 0.177496, 0, 0.00388025, 0.999556, 0.17742, 0, 0.00783463, 0.999165, 0.177285, 0, 0.0128953, 0.9985, 0.177037, 0, 0.0189053, 0.995388, 0.175634, 0, 0.025742, 0.993102, 0.174375, 0, 0.033309, 0.990992, 0.173121, 0, 0.0415298, 0.986932, 0.170896, 0, 0.0503425, 0.982786, 0.16847, 0, 0.0596964, 0.977592, 0.165455, 0, 0.0695498, 0.971075, 0.161676, 0, 0.0798676, 0.963967, 0.157458, 0, 0.0906201, 0.956397, 0.152836, 0, 0.101783, 0.947489, 0.147467, 0, 0.113333, 0.937564, 0.14145, 0, 0.125254, 0.928182, 0.135383, 0, 0.137529, 0.919027, 0.129212, 0, 0.150144, 0.909618, 0.12276, 0, 0.163088, 0.900492, 0.116273, 0, 0.176351, 0.891671, 0.1098, 0, 0.189924, 0.883146, 0.103362, 0, 0.203799, 0.875151, 0.0970799, 0, 0.21797, 0.868338, 0.0911732, 0, 0.232433, 0.862033, 0.0854966, 0, 0.247182, 0.856107, 0.0800691, 0, 0.262216, 0.850644, 0.0749618, 0, 0.27753, 0.845261, 0.070079, 0, 0.293124, 0.839885, 0.0654321, 0, 0.308997, 0.834609, 0.0610975, 0, 0.325149, 0.829083, 0.0569741, 0, 0.341581, 0.82404, 0.0531736, 0, 0.358294, 0.818968, 0.049665, 0, 0.37529, 0.813496, 0.0463856, 0, 0.392573, 0.807533, 0.0433217, 0, 0.410148, 0.80099, 0.0404402, 0, 0.428019, 0.793891, 0.0377578, 0, 0.446192, 0.786281, 0.0352616, 0, 0.464676, 0.778773, 0.0329577, 0, 0.483478, 0.770737, 0.030808, 0, 0.502608, 0.762094, 0.0287964, 0, 0.522079, 0.752898, 0.0269254, 0, 0.541905, 0.743306, 0.0251926, 0, 0.5621, 0.733416, 0.023595, 0, 0.582684, 0.723742, 0.0221155, 0, 0.603677, 0.713542, 0.0207435, 0, 0.625106, 0.702755, 0.019434, 0, 0.646998, 0.691484, 0.0182046, 0, 0.66939, 0.680531, 0.0170771, 0, 0.692324, 0.66953, 0.0160339, 0, 0.715849, 0.658126, 0.0150677, 0, 0.740028, 0.646933, 0.0141551, 0, 0.764937, 0.636107, 0.0133179, 0, 0.790673, 0.625271, 0.0125284, 0, 0.817358, 0.615225, 0.0117937, 0, 0.84515, 0.605678, 0.0111181, 0, 0.874244, 0.59583, 0.0104759, 0, 0.904828, 0.585704, 0.00986672, 0, 0.936508, 0.575413, 0.00929712, 0, 0.968254, 0.565373, 0.00876713, 0, 1, 1, 0.214058, 0, 0, 0.999999, 0.214058, 0, 0, 0.999994, 0.214055, 0, 0, 0.999966, 0.214039, 0, 0.000259642, 0.999893, 0.213998, 0, 0.00200075, 0.999737, 0.21391, 0, 0.00527775, 0.999449, 0.213745, 0, 0.00983959, 0.99896, 0.213458, 0, 0.0154755, 0.9979, 0.212855, 0, 0.0220249, 0.994278, 0.210779, 0, 0.0293654, 0.992254, 0.20926, 0, 0.0374021, 0.98881, 0.206908, 0, 0.0460604, 0.984715, 0.204009, 0, 0.0552802, 0.979738, 0.200471, 0, 0.0650127, 0.972884, 0.195813, 0, 0.0752175, 0.965996, 0.190856, 0, 0.0858612, 0.957974, 0.185077, 0, 0.0969155, 0.949155, 0.17868, 0, 0.108356, 0.939288, 0.171513, 0, 0.120163, 0.928996, 0.163838, 0, 0.132319, 0.919563, 0.156246, 0, 0.144808, 0.910004, 0.148359, 0, 0.157618, 0.900791, 0.140417, 0, 0.170737, 0.892135, 0.132569, 0, 0.184155, 0.883803, 0.124741, 0, 0.197866, 0.876034, 0.117091, 0, 0.211861, 0.869219, 0.109835, 0, 0.226134, 0.863062, 0.102859, 0, 0.240682, 0.857795, 0.0962928, 0, 0.255499, 0.853009, 0.0900725, 0, 0.270583, 0.848603, 0.0842101, 0, 0.285931, 0.844335, 0.0786527, 0, 0.301542, 0.840208, 0.0734397, 0, 0.317415, 0.836035, 0.0685334, 0, 0.33355, 0.83172, 0.0639275, 0, 0.349948, 0.827135, 0.0595909, 0, 0.36661, 0.822797, 0.0556204, 0, 0.383539, 0.818387, 0.0519394, 0, 0.400738, 0.813565, 0.0485317, 0, 0.41821, 0.808142, 0.0453138, 0, 0.435961, 0.802212, 0.0423354, 0, 0.453997, 0.79573, 0.0395553, 0, 0.472324, 0.788741, 0.036988, 0, 0.490951, 0.781093, 0.0345688, 0, 0.509887, 0.773597, 0.0323297, 0, 0.529144, 0.765622, 0.0302719, 0, 0.548735, 0.757083, 0.0283477, 0, 0.568674, 0.747992, 0.0265562, 0, 0.588979, 0.738591, 0.0248844, 0, 0.609671, 0.728719, 0.0233342, 0, 0.630773, 0.719146, 0.0219081, 0, 0.652314, 0.709165, 0.0205711, 0, 0.674328, 0.69875, 0.0193248, 0, 0.696854, 0.687884, 0.0181582, 0, 0.719942, 0.676818, 0.0170746, 0, 0.743651, 0.666247, 0.0160718, 0, 0.768057, 0.655284, 0.0151262, 0, 0.793253, 0.64401, 0.0142561, 0, 0.819363, 0.633353, 0.0134327, 0, 0.846547, 0.622674, 0.012653, 0, 0.875017, 0.612265, 0.0119354, 0, 0.905021, 0.602455, 0.0112533, 0, 0.936508, 0.593147, 0.0106234, 0, 0.968254, 0.583592, 0.0100213, 0, 1, 1, 0.25717, 0, 0, 1, 0.25717, 0, 0, 0.999992, 0.257164, 0, 0, 0.999958, 0.257135, 0, 0.000641715, 0.999864, 0.25706, 0, 0.00305314, 0.999666, 0.256897, 0, 0.00700975, 0.999302, 0.256596, 0, 0.0122194, 0.998663, 0.25607, 0, 0.0184622, 0.995607, 0.254123, 0, 0.0255773, 0.993094, 0.252081, 0, 0.0334439, 0.9907, 0.249867, 0, 0.0419696, 0.98594, 0.246118, 0, 0.0510823, 0.981214, 0.242049, 0, 0.0607242, 0.974966, 0.236869, 0, 0.0708486, 0.967589, 0.230724, 0, 0.081417, 0.95915, 0.223635, 0, 0.0923974, 0.950257, 0.21596, 0, 0.103763, 0.940165, 0.207296, 0, 0.115491, 0.929396, 0.197901, 0, 0.127562, 0.919288, 0.188437, 0, 0.13996, 0.909428, 0.178762, 0, 0.15267, 0.900105, 0.169072, 0, 0.165679, 0.891418, 0.159478, 0, 0.178979, 0.883347, 0.15002, 0, 0.192558, 0.875992, 0.140813, 0, 0.20641, 0.869466, 0.13196, 0, 0.220529, 0.863699, 0.123501, 0, 0.234907, 0.858553, 0.115436, 0, 0.249542, 0.854379, 0.107901, 0, 0.264428, 0.850894, 0.10088, 0, 0.279564, 0.847632, 0.0942296, 0, 0.294947, 0.844571, 0.0879861, 0, 0.310575, 0.84163, 0.0821534, 0, 0.326448, 0.838542, 0.0766409, 0, 0.342566, 0.835412, 0.0715322, 0, 0.358929, 0.831899, 0.0666883, 0, 0.37554, 0.828177, 0.0622175, 0, 0.392399, 0.82416, 0.0580452, 0, 0.409511, 0.820393, 0.054267, 0, 0.426878, 0.816068, 0.0507172, 0, 0.444506, 0.811201, 0.0474041, 0, 0.4624, 0.805785, 0.0443174, 0, 0.480566, 0.799878, 0.0414562, 0, 0.499013, 0.793469, 0.0388147, 0, 0.517749, 0.786473, 0.0363453, 0, 0.536785, 0.778874, 0.0340225, 0, 0.556134, 0.771277, 0.0318599, 0, 0.575809, 0.763426, 0.0298859, 0, 0.595827, 0.755044, 0.0280357, 0, 0.616207, 0.746161, 0.0262979, 0, 0.636973, 0.737124, 0.0247295, 0, 0.65815, 0.72761, 0.0232514, 0, 0.679772, 0.717822, 0.0218755, 0, 0.701876, 0.708279, 0.0205942, 0, 0.724509, 0.698333, 0.0193947, 0, 0.74773, 0.68802, 0.0182717, 0, 0.771609, 0.677321, 0.0172044, 0, 0.79624, 0.666504, 0.0162122, 0, 0.821743, 0.656184, 0.0152924, 0, 0.84828, 0.64556, 0.0144326, 0, 0.876069, 0.634636, 0.0136157, 0, 0.905404, 0.624124, 0.0128612, 0, 0.936508, 0.613914, 0.0121435, 0, 0.968254, 0.603589, 0.0114887, 0, 1, 1, 0.307946, 0, 0, 0.999999, 0.307945, 0, 0, 0.999988, 0.307934, 0, 2.04479e-05, 0.999944, 0.307886, 0, 0.00127833, 0.999824, 0.307756, 0, 0.00445047, 0.999565, 0.30748, 0, 0.00914673, 0.999085, 0.306966, 0, 0.0150498, 0.998103, 0.306004, 0, 0.0219367, 0.994249, 0.303028, 0, 0.0296485, 0.991807, 0.300435, 0, 0.038068, 0.987773, 0.296554, 0, 0.0471062, 0.982673, 0.2916, 0, 0.0566942, 0.976623, 0.285641, 0, 0.0667768, 0.968757, 0.27815, 0, 0.0773099, 0.959849, 0.269529, 0, 0.088257, 0.950663, 0.260248, 0, 0.0995879, 0.940129, 0.249704, 0, 0.111277, 0.92895, 0.238291, 0, 0.123304, 0.917996, 0.226501, 0, 0.13565, 0.907813, 0.214669, 0, 0.148299, 0.898305, 0.202835, 0, 0.161237, 0.889626, 0.191158, 0, 0.174455, 0.88175, 0.179695, 0, 0.187941, 0.874715, 0.168548, 0, 0.201687, 0.868746, 0.15792, 0, 0.215687, 0.863703, 0.147807, 0, 0.229933, 0.859315, 0.138149, 0, 0.24442, 0.855538, 0.128993, 0, 0.259145, 0.852428, 0.120414, 0, 0.274103, 0.850168, 0.112498, 0, 0.289293, 0.848132, 0.105054, 0, 0.304711, 0.846291, 0.0981087, 0, 0.320357, 0.844431, 0.0915942, 0, 0.33623, 0.842493, 0.0855056, 0, 0.35233, 0.840368, 0.0798204, 0, 0.368658, 0.83798, 0.0745097, 0, 0.385214, 0.83523, 0.0695424, 0, 0.402002, 0.832091, 0.0649092, 0, 0.419023, 0.828667, 0.0606291, 0, 0.436282, 0.824805, 0.0566523, 0, 0.453782, 0.820988, 0.0530229, 0, 0.471529, 0.816635, 0.0496364, 0, 0.489528, 0.811725, 0.0464658, 0, 0.507788, 0.806316, 0.0435082, 0, 0.526317, 0.800469, 0.0407873, 0, 0.545124, 0.794107, 0.038255, 0, 0.564221, 0.787218, 0.0358825, 0, 0.583621, 0.779872, 0.0336785, 0, 0.603341, 0.772097, 0.0316379, 0, 0.623397, 0.764484, 0.0297379, 0, 0.643812, 0.756428, 0.0279581, 0, 0.664611, 0.748022, 0.0263153, 0, 0.685824, 0.739268, 0.0247799, 0, 0.707488, 0.73024, 0.0233385, 0, 0.729646, 0.720893, 0.0220035, 0, 0.752354, 0.71119, 0.0207555, 0, 0.77568, 0.701791, 0.0195843, 0, 0.799715, 0.692184, 0.0184891, 0, 0.824574, 0.682258, 0.0174541, 0, 0.850417, 0.67206, 0.0164873, 0, 0.877466, 0.661717, 0.0155959, 0, 0.90604, 0.651462, 0.0147519, 0, 0.936528, 0.641467, 0.0139727, 0, 0.968254, 0.631229, 0.0132363, 0, 1, 1, 0.367573, 0, 0, 0.999999, 0.367571, 0, 0, 0.999984, 0.367553, 0, 0.000183382, 0.999925, 0.367473, 0, 0.00225254, 0.999759, 0.367259, 0, 0.00628165, 0.99941, 0.366801, 0, 0.0117858, 0.998739, 0.365946, 0, 0.0184359, 0.995529, 0.363191, 0, 0.0260114, 0.992875, 0.360171, 0, 0.0343581, 0.989135, 0.355981, 0, 0.0433637, 0.984166, 0.350401, 0, 0.0529438, 0.977871, 0.343348, 0, 0.0630334, 0.96951, 0.334341, 0, 0.0735805, 0.959964, 0.323862, 0, 0.0845437, 0.950162, 0.312521, 0, 0.095889, 0.938882, 0.299577, 0, 0.107588, 0.926992, 0.285573, 0, 0.119617, 0.915589, 0.271212, 0, 0.131957, 0.904791, 0.256611, 0, 0.144591, 0.895177, 0.242224, 0, 0.157503, 0.886403, 0.227952, 0, 0.170682, 0.878957, 0.214192, 0, 0.184117, 0.872418, 0.200795, 0, 0.197799, 0.867029, 0.188015, 0, 0.21172, 0.862835, 0.175975, 0, 0.225873, 0.859411, 0.164526, 0, 0.240253, 0.856655, 0.153693, 0, 0.254854, 0.854519, 0.14352, 0, 0.269673, 0.852828, 0.13397, 0, 0.284707, 0.851412, 0.124984, 0, 0.299953, 0.850609, 0.116748, 0, 0.315408, 0.849855, 0.10905, 0, 0.331073, 0.849017, 0.101839, 0, 0.346946, 0.848079, 0.0951359, 0, 0.363028, 0.846911, 0.0888774, 0, 0.379318, 0.845445, 0.0830375, 0, 0.395818, 0.84362, 0.0775844, 0, 0.41253, 0.841411, 0.0725054, 0, 0.429457, 0.838768, 0.0677691, 0, 0.446602, 0.835801, 0.0634016, 0, 0.463968, 0.832341, 0.0593095, 0, 0.481561, 0.828424, 0.0555121, 0, 0.499386, 0.824312, 0.052024, 0, 0.51745, 0.819918, 0.0487865, 0, 0.535761, 0.815072, 0.0457801, 0, 0.554328, 0.809863, 0.0430184, 0, 0.573162, 0.804164, 0.0404245, 0, 0.592275, 0.798034, 0.0380146, 0, 0.611681, 0.791436, 0.0357436, 0, 0.631398, 0.784498, 0.0336475, 0, 0.651445, 0.777125, 0.0316666, 0, 0.671845, 0.769365, 0.0298122, 0, 0.692628, 0.761579, 0.0281001, 0, 0.713827, 0.753746, 0.0265049, 0, 0.735484, 0.745573, 0.0250067, 0, 0.75765, 0.737083, 0.0236026, 0, 0.78039, 0.728545, 0.0223302, 0, 0.803789, 0.719691, 0.0211243, 0, 0.82796, 0.710569, 0.0199983, 0, 0.853056, 0.701216, 0.0189569, 0, 0.879298, 0.692094, 0.0179702, 0, 0.907014, 0.682909, 0.0170418, 0, 0.936691, 0.673509, 0.0161732, 0, 0.968254, 0.663863, 0.0153406, 0, 1, 1, 0.437395, 0, 0, 0.999998, 0.437394, 0, 0, 0.99998, 0.437363, 0, 0.000616704, 0.999891, 0.437232, 0, 0.00367925, 0.999656, 0.436877, 0, 0.00867446, 0.999148, 0.436121, 0, 0.0150679, 0.997959, 0.434564, 0, 0.022531, 0.993464, 0.430134, 0, 0.0308507, 0.990606, 0.426077, 0, 0.0398805, 0.985027, 0.419397, 0, 0.0495148, 0.978491, 0.41118, 0, 0.0596749, 0.969643, 0.40048, 0, 0.0703001, 0.959189, 0.38769, 0, 0.0813427, 0.948223, 0.373575, 0, 0.0927641, 0.935955, 0.357622, 0, 0.104533, 0.923237, 0.34043, 0, 0.116624, 0.911074, 0.322735, 0, 0.129015, 0.899724, 0.30479, 0, 0.141687, 0.890189, 0.287392, 0, 0.154626, 0.881796, 0.270248, 0, 0.167818, 0.874781, 0.253659, 0, 0.181252, 0.869166, 0.237786, 0, 0.194918, 0.864725, 0.222618, 0, 0.208807, 0.861565, 0.208356, 0, 0.222913, 0.859284, 0.194867, 0, 0.237229, 0.857677, 0.18212, 0, 0.25175, 0.856714, 0.17018, 0, 0.266473, 0.856155, 0.158969, 0, 0.281392, 0.8558, 0.148413, 0, 0.296505, 0.855672, 0.138578, 0, 0.311811, 0.855538, 0.129345, 0, 0.327306, 0.855689, 0.120861, 0, 0.342991, 0.855767, 0.112969, 0, 0.358864, 0.855618, 0.105593, 0, 0.374925, 0.85525, 0.0987451, 0, 0.391176, 0.854583, 0.0923727, 0, 0.407616, 0.853534, 0.0864143, 0, 0.424249, 0.852061, 0.0808338, 0, 0.441076, 0.850253, 0.0756771, 0, 0.4581, 0.848004, 0.0708612, 0, 0.475324, 0.845333, 0.0663784, 0, 0.492754, 0.842376, 0.0622631, 0, 0.510394, 0.838956, 0.0584112, 0, 0.528251, 0.835121, 0.0548328, 0, 0.546331, 0.830842, 0.0514838, 0, 0.564644, 0.826212, 0.048355, 0, 0.583198, 0.821522, 0.0454714, 0, 0.602005, 0.816551, 0.0428263, 0, 0.621078, 0.811211, 0.0403612, 0, 0.640434, 0.805479, 0.038039, 0, 0.660089, 0.799409, 0.0358739, 0, 0.680066, 0.79306, 0.0338727, 0, 0.70039, 0.786395, 0.0319985, 0, 0.721094, 0.779416, 0.030241, 0, 0.742215, 0.77214, 0.0285951, 0, 0.7638, 0.764636, 0.0270747, 0, 0.785912, 0.756836, 0.0256354, 0, 0.808628, 0.749315, 0.0243027, 0, 0.832055, 0.741561, 0.0230497, 0, 0.856338, 0.733589, 0.0218801, 0, 0.88169, 0.725479, 0.020784, 0, 0.908441, 0.717255, 0.0197702, 0, 0.937125, 0.708829, 0.0188168, 0, 0.968254, 0.700191, 0.0179113, 0, 1, 1, 0.518937, 0, 0, 0.999998, 0.518933, 0, 0, 0.999967, 0.518883, 0, 0.00147741, 0.999832, 0.51866, 0, 0.00573221, 0.999466, 0.518057, 0, 0.011826, 0.998644, 0.516752, 0, 0.0192116, 0.994458, 0.512347, 0, 0.027573, 0.991223, 0.507675, 0, 0.0367099, 0.985515, 0.500188, 0, 0.046487, 0.978308, 0.490408, 0, 0.0568071, 0.968359, 0.477357, 0, 0.0675984, 0.95682, 0.461752, 0, 0.0788059, 0.943929, 0.443796, 0, 0.090386, 0.930224, 0.423893, 0, 0.102304, 0.916514, 0.402682, 0, 0.114532, 0.903653, 0.380914, 0, 0.127047, 0.892315, 0.359212, 0, 0.139828, 0.882942, 0.338102, 0, 0.152861, 0.875438, 0.31773, 0, 0.16613, 0.869642, 0.298186, 0, 0.179624, 0.865304, 0.279491, 0, 0.193332, 0.862382, 0.261804, 0, 0.207247, 0.860666, 0.245146, 0, 0.22136, 0.859788, 0.229406, 0, 0.235666, 0.859608, 0.214605, 0, 0.250158, 0.859912, 0.200691, 0, 0.264832, 0.86053, 0.187623, 0, 0.279684, 0.861368, 0.17539, 0, 0.294711, 0.862237, 0.163901, 0, 0.309911, 0.863127, 0.153175, 0, 0.32528, 0.863923, 0.143147, 0, 0.340819, 0.864567, 0.133781, 0, 0.356524, 0.865013, 0.125042, 0, 0.372397, 0.86539, 0.116952, 0, 0.388438, 0.865591, 0.109476, 0, 0.404645, 0.865517, 0.102542, 0, 0.421022, 0.865084, 0.0960688, 0, 0.437569, 0.864309, 0.0900499, 0, 0.454287, 0.863151, 0.0844328, 0, 0.471181, 0.861649, 0.0792218, 0, 0.488253, 0.859742, 0.0743482, 0, 0.505507, 0.857446, 0.0697963, 0, 0.522947, 0.854757, 0.0655364, 0, 0.54058, 0.851783, 0.061608, 0, 0.558412, 0.848516, 0.0579701, 0, 0.576449, 0.844897, 0.0545742, 0, 0.594701, 0.840956, 0.0514167, 0, 0.613178, 0.836676, 0.0484598, 0, 0.631892, 0.832075, 0.0456934, 0, 0.650856, 0.827191, 0.0431178, 0, 0.670088, 0.822295, 0.0407718, 0, 0.689606, 0.817294, 0.0386032, 0, 0.709434, 0.812013, 0.0365675, 0, 0.7296, 0.806465, 0.0346547, 0, 0.750138, 0.800691, 0.0328717, 0, 0.771093, 0.794709, 0.031211, 0, 0.792519, 0.788493, 0.0296504, 0, 0.814488, 0.782049, 0.0281782, 0, 0.837097, 0.775403, 0.0267965, 0, 0.860481, 0.76857, 0.0255002, 0, 0.884842, 0.761536, 0.0242759, 0, 0.910494, 0.754303, 0.0231142, 0, 0.937985, 0.74692, 0.0220305, 0, 0.968254, 0.739745, 0.0210192, 0, 1, 1, 0.613914, 0, 0, 0.999996, 0.613907, 0, 9.63597e-05, 0.999942, 0.613814, 0, 0.00301247, 0.999704, 0.613407, 0, 0.00870385, 0.999046, 0.612302, 0, 0.0160714, 0.995516, 0.608266, 0, 0.0245899, 0.991726, 0.602863, 0, 0.0339681, 0.985157, 0.593956, 0, 0.0440254, 0.97642, 0.581748, 0, 0.0546409, 0.964404, 0.565183, 0, 0.0657284, 0.950601, 0.545273, 0, 0.0772246, 0.935158, 0.522129, 0, 0.0890812, 0.919364, 0.496782, 0, 0.10126, 0.904754, 0.470571, 0, 0.113731, 0.89176, 0.444037, 0, 0.126469, 0.881492, 0.418322, 0, 0.139454, 0.873656, 0.393522, 0, 0.15267, 0.868053, 0.369795, 0, 0.166101, 0.864336, 0.347171, 0, 0.179736, 0.862259, 0.325737, 0, 0.193565, 0.861556, 0.305532, 0, 0.207578, 0.861776, 0.286416, 0, 0.221769, 0.862661, 0.268355, 0, 0.23613, 0.864015, 0.251334, 0, 0.250656, 0.865711, 0.235352, 0, 0.265343, 0.867519, 0.220302, 0, 0.280187, 0.869351, 0.206161, 0, 0.295183, 0.871144, 0.192908, 0, 0.31033, 0.872839, 0.180505, 0, 0.325624, 0.874307, 0.168848, 0, 0.341065, 0.875667, 0.158021, 0, 0.35665, 0.876758, 0.147877, 0, 0.37238, 0.87764, 0.138441, 0, 0.388253, 0.878237, 0.129627, 0, 0.404269, 0.878563, 0.121415, 0, 0.42043, 0.878572, 0.113741, 0, 0.436735, 0.87842, 0.106652, 0, 0.453187, 0.878057, 0.100097, 0, 0.469786, 0.877413, 0.0940128, 0, 0.486536, 0.87646, 0.0883462, 0, 0.503439, 0.875233, 0.0830924, 0, 0.520498, 0.8737, 0.0781975, 0, 0.537717, 0.871873, 0.07364, 0, 0.555102, 0.86978, 0.0694103, 0, 0.572657, 0.867405, 0.0654696, 0, 0.59039, 0.864751, 0.0617914, 0, 0.608307, 0.861818, 0.0583491, 0, 0.626419, 0.858645, 0.0551443, 0, 0.644733, 0.855307, 0.0521894, 0, 0.663264, 0.851736, 0.0494334, 0, 0.682025, 0.847927, 0.0468504, 0, 0.701032, 0.843888, 0.0444261, 0, 0.720308, 0.839629, 0.0421497, 0, 0.739875, 0.835158, 0.0400082, 0, 0.759764, 0.830509, 0.0380076, 0, 0.780014, 0.825714, 0.0361488, 0, 0.800673, 0.820729, 0.0343956, 0, 0.821803, 0.815751, 0.0327781, 0, 0.843492, 0.810752, 0.031275, 0, 0.86586, 0.805587, 0.0298542, 0, 0.889087, 0.800317, 0.0285397, 0, 0.913466, 0.79489, 0.0272948, 0, 0.93952, 0.789314, 0.0261139, 0, 0.96835, 0.783593, 0.0249938, 0, 1, 1, 0.724258, 0, 0, 0.999992, 0.724243, 0, 0.000726889, 0.99987, 0.724044, 0, 0.00569574, 0.999336, 0.72317, 0, 0.0131702, 0.996271, 0.719432, 0, 0.0220738, 0.991159, 0.712576, 0, 0.0319405, 0.982465, 0.700927, 0, 0.0425202, 0.97049, 0.684297, 0, 0.0536599, 0.953973, 0.661244, 0, 0.065258, 0.935546, 0.633804, 0, 0.0772427, 0.916596, 0.603071, 0, 0.0895616, 0.899353, 0.57105, 0, 0.102175, 0.885216, 0.539206, 0, 0.11505, 0.875076, 0.508714, 0, 0.128164, 0.868334, 0.479571, 0, 0.141495, 0.864414, 0.451796, 0, 0.155026, 0.862678, 0.425328, 0, 0.168745, 0.862835, 0.400352, 0, 0.182639, 0.864067, 0.376532, 0, 0.196699, 0.866086, 0.35391, 0, 0.210915, 0.868557, 0.332424, 0, 0.225282, 0.871271, 0.312053, 0, 0.239792, 0.874058, 0.292764, 0, 0.25444, 0.8768, 0.27453, 0, 0.269223, 0.87939, 0.257297, 0, 0.284135, 0.8819, 0.24114, 0, 0.299174, 0.884187, 0.225934, 0, 0.314337, 0.886262, 0.211669, 0, 0.329622, 0.888119, 0.198311, 0, 0.345026, 0.889709, 0.185783, 0, 0.360549, 0.891054, 0.174063, 0, 0.376189, 0.892196, 0.163143, 0, 0.391946, 0.893101, 0.152952, 0, 0.407819, 0.893803, 0.143475, 0, 0.423808, 0.894277, 0.134647, 0, 0.439914, 0.894532, 0.126434, 0, 0.456137, 0.894576, 0.1188, 0, 0.472479, 0.894393, 0.111694, 0, 0.48894, 0.893976, 0.105069, 0, 0.505523, 0.893346, 0.0989077, 0, 0.52223, 0.892502, 0.0931724, 0, 0.539064, 0.891441, 0.0878276, 0, 0.556028, 0.890276, 0.082903, 0, 0.573125, 0.888972, 0.0783505, 0, 0.590361, 0.887469, 0.0741083, 0, 0.607741, 0.885785, 0.0701633, 0, 0.62527, 0.883914, 0.0664835, 0, 0.642957, 0.881872, 0.0630567, 0, 0.660809, 0.879651, 0.0598527, 0, 0.678836, 0.877267, 0.0568615, 0, 0.69705, 0.874717, 0.05406, 0, 0.715465, 0.872012, 0.0514378, 0, 0.734098, 0.869157, 0.0489805, 0, 0.752968, 0.866155, 0.0466727, 0, 0.772101, 0.863014, 0.0445056, 0, 0.791529, 0.859748, 0.0424733, 0, 0.81129, 0.856416, 0.0405957, 0, 0.831438, 0.852958, 0.0388273, 0, 0.852044, 0.849382, 0.0371619, 0, 0.87321, 0.845694, 0.0355959, 0, 0.89509, 0.841893, 0.0341155, 0, 0.917932, 0.837981, 0.0327141, 0, 0.942204, 0.833963, 0.0313856, 0, 0.968981, 0.829847, 0.0301275, 0, 1, 1, 0.85214, 0, 0, 0.999969, 0.852095, 0, 0.00279627, 0.999483, 0.851408, 0, 0.0107635, 0.994545, 0.84579, 0, 0.0206454, 0.986188, 0.835231, 0, 0.0315756, 0.969847, 0.814687, 0, 0.0432021, 0.945951, 0.783735, 0, 0.0553396, 0.91917, 0.746074, 0, 0.0678766, 0.895488, 0.706938, 0, 0.0807395, 0.878232, 0.669534, 0, 0.0938767, 0.868252, 0.635168, 0, 0.10725, 0.863873, 0.603069, 0, 0.120832, 0.863369, 0.572514, 0, 0.134598, 0.86545, 0.543169, 0, 0.148533, 0.868803, 0.514578, 0, 0.16262, 0.872794, 0.486762, 0, 0.176849, 0.87702, 0.459811, 0, 0.19121, 0.881054, 0.433654, 0, 0.205694, 0.884974, 0.408574, 0, 0.220294, 0.888587, 0.384525, 0, 0.235005, 0.891877, 0.36156, 0, 0.24982, 0.894793, 0.339661, 0, 0.264737, 0.89743, 0.318913, 0, 0.279751, 0.899796, 0.299302, 0, 0.294859, 0.901943, 0.280843, 0, 0.310058, 0.903858, 0.263481, 0, 0.325346, 0.905574, 0.247197, 0, 0.340721, 0.907069, 0.231915, 0, 0.356181, 0.908379, 0.217614, 0, 0.371725, 0.90952, 0.20425, 0, 0.387353, 0.910483, 0.191758, 0, 0.403063, 0.91128, 0.180092, 0, 0.418854, 0.911936, 0.169222, 0, 0.434727, 0.912454, 0.159098, 0, 0.450682, 0.912835, 0.149668, 0, 0.466718, 0.913078, 0.140884, 0, 0.482837, 0.913192, 0.132709, 0, 0.499038, 0.913175, 0.125095, 0, 0.515324, 0.91304, 0.118012, 0, 0.531695, 0.912781, 0.111417, 0, 0.548153, 0.91241, 0.105281, 0, 0.5647, 0.911924, 0.0995691, 0, 0.581338, 0.911331, 0.0942531, 0, 0.59807, 0.910637, 0.0893076, 0, 0.6149, 0.90984, 0.0846998, 0, 0.63183, 0.908941, 0.0804044, 0, 0.648865, 0.907944, 0.0763984, 0, 0.666011, 0.906857, 0.0726638, 0, 0.683273, 0.90568, 0.0691783, 0, 0.700659, 0.904416, 0.0659222, 0, 0.718176, 0.903067, 0.0628782, 0, 0.735834, 0.901637, 0.0600307, 0, 0.753646, 0.900128, 0.0573647, 0, 0.771625, 0.898544, 0.0548668, 0, 0.78979, 0.89689, 0.052527, 0, 0.808162, 0.895165, 0.0503306, 0, 0.826771, 0.893371, 0.0482668, 0, 0.845654, 0.891572, 0.0463605, 0, 0.864863, 0.889763, 0.0445998, 0, 0.884472, 0.887894, 0.0429451, 0, 0.904592, 0.885967, 0.0413884, 0, 0.925407, 0.883984, 0.0399225, 0, 0.947271, 0.881945, 0.0385405, 0, 0.97105, 0.879854, 0.0372362, 0, 1, 0.999804, 0.995833, 0, 0, 0.938155, 0.933611, 0, 0.0158731, 0.864755, 0.854311, 0, 0.0317461, 0.888594, 0.865264, 0, 0.0476191, 0.905575, 0.863922, 0, 0.0634921, 0.915125, 0.850558, 0, 0.0793651, 0.920665, 0.829254, 0, 0.0952381, 0.924073, 0.802578, 0, 0.111111, 0.926304, 0.772211, 0, 0.126984, 0.927829, 0.739366, 0, 0.142857, 0.928924, 0.705033, 0, 0.15873, 0.92973, 0.670019, 0, 0.174603, 0.930339, 0.634993, 0, 0.190476, 0.930811, 0.600485, 0, 0.206349, 0.931191, 0.566897, 0, 0.222222, 0.93149, 0.534485, 0, 0.238095, 0.931737, 0.503429, 0, 0.253968, 0.931939, 0.473811, 0, 0.269841, 0.932108, 0.445668, 0, 0.285714, 0.93225, 0.418993, 0, 0.301587, 0.932371, 0.393762, 0, 0.31746, 0.932474, 0.369939, 0, 0.333333, 0.932562, 0.347479, 0, 0.349206, 0.932638, 0.326336, 0, 0.365079, 0.932703, 0.306462, 0, 0.380952, 0.93276, 0.287805, 0, 0.396825, 0.932809, 0.270313, 0, 0.412698, 0.932851, 0.253933, 0, 0.428571, 0.932887, 0.23861, 0, 0.444444, 0.932917, 0.224289, 0, 0.460317, 0.932943, 0.210917, 0, 0.47619, 0.932965, 0.19844, 0, 0.492063, 0.932982, 0.186807, 0, 0.507937, 0.932995, 0.175966, 0, 0.52381, 0.933005, 0.165869, 0, 0.539683, 0.933011, 0.156468, 0, 0.555556, 0.933013, 0.147719, 0, 0.571429, 0.933013, 0.139579, 0, 0.587302, 0.93301, 0.132007, 0, 0.603175, 0.933004, 0.124965, 0, 0.619048, 0.932994, 0.118416, 0, 0.634921, 0.932982, 0.112326, 0, 0.650794, 0.932968, 0.106663, 0, 0.666667, 0.93295, 0.101397, 0, 0.68254, 0.932931, 0.0964993, 0, 0.698413, 0.932908, 0.0919438, 0, 0.714286, 0.932883, 0.0877057, 0, 0.730159, 0.932856, 0.0837623, 0, 0.746032, 0.932827, 0.0800921, 0, 0.761905, 0.932796, 0.0766754, 0, 0.777778, 0.932762, 0.0734936, 0, 0.793651, 0.932727, 0.0705296, 0, 0.809524, 0.932689, 0.0677676, 0, 0.825397, 0.93265, 0.0651929, 0, 0.84127, 0.932609, 0.0627917, 0, 0.857143, 0.932565, 0.0605515, 0, 0.873016, 0.932521, 0.0584606, 0, 0.888889, 0.932474, 0.0565082, 0, 0.904762, 0.932427, 0.0546841, 0, 0.920635, 0.932377, 0.0529793, 0, 0.936508, 0.932326, 0.0513851, 0, 0.952381, 0.932274, 0.0498936, 0, 0.968254, 0.93222, 0.0484975, 0, 0.984127, 0.932164, 0.0471899, 0, 1];\n\n\t\tconst ltc_float_2 = new Float32Array(LTC_MAT_2);\n\n\t\treturn RectAreaLightLTC._createTexture(ltc_float_2);\n\t}\n\n\tstatic _createTexture(data) {\n\t\tconst texture = new Texture2D();\n\n\t\ttexture.image = { data, width: 64, height: 64 };\n\n\t\ttexture.internalformat = PIXEL_FORMAT.RGBA32F;\n\t\ttexture.type = PIXEL_TYPE.FLOAT;\n\n\t\ttexture.wrapS = TEXTURE_WRAP.CLAMP_TO_EDGE;\n\t\ttexture.wrapT = TEXTURE_WRAP.CLAMP_TO_EDGE;\n\n\t\ttexture.minFilter = TEXTURE_FILTER.NEAREST;\n\t\ttexture.generateMipmaps = false;\n\n\t\ttexture.flipY = false;\n\n\t\ttexture.version++;\n\n\t\treturn texture;\n\t}\n\n}\n\nexport { RectAreaLightLTC };"
  },
  {
    "path": "examples/jsm/loaders/AssimpJsonLoader.js",
    "content": "import {\n\tAnimationAction,\n\tAnimationMixer,\n\tAttribute,\n\tBone,\n\tBuffer,\n\tFileLoader,\n\tGeometry,\n\tKeyframeClip,\n\tMatrix4,\n\tMesh,\n\tObject3D,\n\tPhongMaterial,\n\tQuaternionKeyframeTrack,\n\tSkeleton,\n\tSkinnedMesh,\n\tVectorKeyframeTrack,\n\tTEXTURE_WRAP\n} from 't3d';\nimport { Texture2DLoader } from '../loaders/Texture2DLoader.js';\n\n/**\n * AssimpJsonLoader\n * @class\n *\n * Loader for models imported with Open Asset Import Library (http://assimp.sf.net)\n * through assimp2json (https://github.com/acgessler/assimp2json).\n *\n * Supports any input format that assimp supports, including 3ds, obj, dae, blend,\n * fbx, x, ms3d, lwo (and many more).\n */\nclass AssimpJsonLoader {\n\n\tconstructor() {\n\t\tthis.texturePath = './';\n\t\tthis.textureLoader = new Texture2DLoader();\n\t}\n\n\tload(url, onLoad, onProgress, onError) {\n\t\tthis.texturePath = this.extractUrlBase(url);\n\n\t\tconst loader = new FileLoader();\n\t\tloader.setResponseType('json').load(url, json => {\n\t\t\tconst result = this.parse(json);\n\t\t\tonLoad(result.object, result.animation);\n\t\t}, onProgress, onError);\n\t}\n\n\tparse(json) {\n\t\tconst nodeTree = this.parseNodeTree(json.rootnode);\n\n\t\tconst meshes = this.parseList(json.meshes, this.parseMesh);\n\t\tconst materials = this.parseList(json.materials, this.parseMaterial);\n\n\t\tconst boneMap = {};\n\n\t\tconst skeletons = {};\n\t\tfor (let i = 0; i < json.meshes.length; i++) {\n\t\t\tif (json.meshes[i].bones) {\n\t\t\t\tskeletons[i] = this.parseSkeleton(json.meshes[i].name, json.meshes[i].bones, nodeTree, boneMap);\n\t\t\t}\n\t\t}\n\n\t\tlet animation;\n\t\tif (json.animations) {\n\t\t\tanimation = this.parseAnimations(json.animations, boneMap);\n\t\t}\n\n\t\treturn {\n\t\t\tobject: this.parseObject(json, json.rootnode, meshes, materials, skeletons),\n\t\t\tanimation: animation\n\t\t};\n\t}\n\n\tparseNodeTree(node) {\n\t\tconst object = new Object3D();\n\t\tobject.name = node.name;\n\n\t\t// save local matrix\n\t\tobject.matrix.fromArray(node.transformation).transpose();\n\n\t\tif (node.children) {\n\t\t\tfor (let i = 0; i < node.children.length; i++) {\n\t\t\t\tconst child = this.parseNodeTree(node.children[i]);\n\t\t\t\tobject.add(child);\n\t\t\t}\n\t\t}\n\n\t\treturn object;\n\t}\n\n\tparseList(json, handler) {\n\t\tconst arrays = new Array(json.length);\n\t\tfor (let i = 0; i < json.length; i++) {\n\t\t\tarrays[i] = handler.call(this, json[i]);\n\t\t}\n\t\treturn arrays;\n\t}\n\n\tparseSkeleton(meshName, bonesInfo, nodeTree, boneMap) {\n\t\tconst meshParents = [];\n\t\tlet mesh = nodeTree.getObjectByName(meshName);\n\t\twhile (mesh.parent) {\n\t\t\tmeshParents.push(mesh.parent.name);\n\t\t\tmesh = mesh.parent;\n\t\t}\n\t\tmeshParents.push(mesh);\n\n\t\t// mark all of its parents as root until 1) find the mesh's node or 2) the parent of the mesh's node\n\t\tfunction getRoot(name) {\n\t\t\tlet node = nodeTree.getObjectByName(name);\n\t\t\tlet parent;\n\t\t\twhile (node.parent) {\n\t\t\t\tparent = node.parent;\n\n\t\t\t\tif (meshParents.indexOf(parent.name) > -1) {\n\t\t\t\t\tbreak;\n\t\t\t\t} else {\n\t\t\t\t\tnode = parent;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn node.name;\n\t\t}\n\n\t\tconst allbones = [];\n\t\tconst boneInverses = [];\n\t\tconst rootBones = [];\n\n\t\tlet rootNode = nodeTree.getObjectByName(getRoot(bonesInfo[0].name));\n\t\tlet rootBone = this.cloneNodeToBones(rootNode, boneMap);\n\t\trootBones.push(rootBone);\n\n\t\tfor (let i = 0; i < bonesInfo.length; i++) {\n\t\t\tconst boneInfo = bonesInfo[i];\n\n\t\t\t// get bone & push\n\t\t\tlet bone = rootBone.getObjectByName(boneInfo.name);\n\n\t\t\tif (!bone) {\n\t\t\t\trootNode = nodeTree.getObjectByName(boneInfo.name);\n\t\t\t\trootBone = this.cloneNodeToBones(rootNode, boneMap);\n\t\t\t\trootBones.push(rootBone);\n\t\t\t\tbone = rootBone.getObjectByName(boneInfo.name);\n\t\t\t}\n\n\t\t\tconst offset = new Matrix4();\n\t\t\toffset.fromArray(bonesInfo[i].offsetmatrix).transpose();\n\t\t\tboneInverses.push(offset);\n\n\t\t\tallbones.push(bone);\n\t\t}\n\n\t\treturn {\n\t\t\tskeleton: new Skeleton(allbones, boneInverses),\n\t\t\trootBones: rootBones\n\t\t};\n\t}\n\n\tcloneNodeToBones(node, boneMap) {\n\t\tconst bone = new Bone();\n\t\tbone.name = node.name;\n\t\tbone.matrix.copy(node.matrix);\n\t\tbone.matrix.decompose(bone.position, bone.quaternion, bone.scale);\n\n\t\tif (!boneMap[node.name]) {\n\t\t\tboneMap[node.name] = [];\n\t\t}\n\t\tboneMap[node.name].push(bone);\n\n\t\tif (node.children) {\n\t\t\tfor (let i = 0; i < node.children.length; i++) {\n\t\t\t\tconst child = this.cloneNodeToBones(node.children[i], boneMap);\n\t\t\t\tbone.add(child);\n\t\t\t}\n\t\t}\n\n\t\treturn bone;\n\t}\n\n\tparseAnimations(json, boneMap) {\n\t\tconst animation = new AnimationMixer();\n\n\t\tfor (let i = 0; i < json.length; i++) {\n\t\t\tconst anim = json[i];\n\t\t\tconst name = anim.name;\n\t\t\tconst channels = anim.channels;\n\n\t\t\tconst tracks = [];\n\t\t\tlet duration = 0;\n\n\t\t\tfor (let j = 0; j < channels.length; j++) {\n\t\t\t\tconst channel = channels[j];\n\t\t\t\tconst boneName = channel.name;\n\n\t\t\t\tif (!boneMap[boneName]) {\n\t\t\t\t\tconsole.log(boneName);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tfor (let n = 0; n < boneMap[boneName].length; n++) {\n\t\t\t\t\tconst bone = boneMap[boneName][n];\n\n\t\t\t\t\tconst times_p = [], values_p = [];\n\t\t\t\t\tfor (let k = 0; k < channel.positionkeys.length; k++) {\n\t\t\t\t\t\tconst frame = channel.positionkeys[k];\n\t\t\t\t\t\ttimes_p.push(frame[0]);\n\t\t\t\t\t\tvalues_p.push(frame[1][0], frame[1][1], frame[1][2]);\n\t\t\t\t\t\tif (frame[0] > duration) {\n\t\t\t\t\t\t\tduration = frame[0];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tconst positionTrack = new VectorKeyframeTrack(bone, 'position', times_p, values_p);\n\t\t\t\t\ttracks.push(positionTrack);\n\n\t\t\t\t\tconst times_r = [], values_r = [];\n\t\t\t\t\tfor (let k = 0; k < channel.rotationkeys.length; k++) {\n\t\t\t\t\t\tconst frame = channel.rotationkeys[k];\n\t\t\t\t\t\ttimes_r.push(frame[0]);\n\t\t\t\t\t\tvalues_r.push(frame[1][1], frame[1][2], frame[1][3], frame[1][0]);\n\t\t\t\t\t\tif (frame[0] > duration) {\n\t\t\t\t\t\t\tduration = frame[0];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tconst rotationTrack = new QuaternionKeyframeTrack(bone, 'quaternion', times_r, values_r);\n\t\t\t\t\ttracks.push(rotationTrack);\n\n\t\t\t\t\tconst times_s = [], values_s = [];\n\t\t\t\t\tfor (let k = 0; k < channel.scalingkeys.length; k++) {\n\t\t\t\t\t\tconst frame = channel.scalingkeys[k];\n\t\t\t\t\t\ttimes_s.push(frame[0]);\n\t\t\t\t\t\tvalues_s.push(frame[1][0], frame[1][1], frame[1][2]);\n\t\t\t\t\t\tif (frame[0] > duration) {\n\t\t\t\t\t\t\tduration = frame[0];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tconst scalingTrack = new VectorKeyframeTrack(bone, 'scale', times_s, values_s);\n\t\t\t\t\ttracks.push(scalingTrack);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst clip = new KeyframeClip(name, tracks, duration);\n\t\t\tconst action = new AnimationAction(clip);\n\n\t\t\tanimation.addAction(action);\n\t\t}\n\n\t\treturn animation;\n\t}\n\n\tparseObject(json, node, meshes, materials, skeletons) {\n\t\tconst group = new Object3D();\n\n\t\tgroup.name = node.name || '';\n\t\tgroup.matrix.fromArray(node.transformation).transpose();\n\t\tgroup.matrix.decompose(group.position, group.quaternion, group.scale);\n\n\t\tfor (let i = 0, mesh; node.meshes && i < node.meshes.length; i++) {\n\t\t\tconst idx = node.meshes[i];\n\t\t\tconst material = materials[json.meshes[idx].materialindex];\n\t\t\tif (skeletons[idx]) {\n\t\t\t\tmesh = new SkinnedMesh(meshes[idx], material);\n\t\t\t\tconst rootBones = skeletons[idx].rootBones;\n\t\t\t\tfor (let j = 0, l = rootBones.length; j < l; j++) {\n\t\t\t\t\tgroup.add(rootBones[j]);\n\t\t\t\t}\n\t\t\t\tmesh.bind(skeletons[idx].skeleton, mesh.worldMatrix);\n\t\t\t} else {\n\t\t\t\tmesh = new Mesh(meshes[idx], material);\n\t\t\t}\n\t\t\tmesh.frustumCulled = false;\n\t\t\tgroup.add(mesh);\n\t\t}\n\n\t\tfor (let i = 0; node.children && i < node.children.length; i++) {\n\t\t\tgroup.add(this.parseObject(json, node.children[i], meshes, materials, skeletons));\n\t\t}\n\n\t\treturn group;\n\t}\n\n\tparseMaterial(json) {\n\t\tconst material = new PhongMaterial();\n\n\t\tlet diffuseMap = null;\n\t\tlet normalMap = null;\n\t\tlet prop;\n\n\t\tfor (const key in json.properties) {\n\t\t\tprop = json.properties[key];\n\n\t\t\tif (prop.key === '$tex.file') {\n\t\t\t\t// prop.semantic gives the type of the texture\n\t\t\t\t// 1: diffuse\n\t\t\t\t// 2: specular map\n\t\t\t\t// 3: ambient map\n\t\t\t\t// 4: emissive map\n\t\t\t\t// 5: height map (bumps)\n\t\t\t\t// 6: normal map\n\t\t\t\t// 7: shininess(glow) map\n\t\t\t\t// 8: opacity map\n\t\t\t\t// 9: displacement map\n\t\t\t\t// 10: light map\n\t\t\t\t// 11: reflection map\n\t\t\t\t// 12: unknown map\n\t\t\t\tif (prop.semantic == 1) {\n\t\t\t\t\tlet material_url = this.texturePath + prop.value;\n\t\t\t\t\tmaterial_url = material_url.replace(/.\\\\/g, '');\n\t\t\t\t\tdiffuseMap = this.textureLoader.load(material_url);\n\t\t\t\t\t// TODO: read texture settings from assimp.\n\t\t\t\t\t// Wrapping is the default, though.\n\t\t\t\t\tdiffuseMap.wrapS = diffuseMap.wrapT = TEXTURE_WRAP.REPEAT;\n\t\t\t\t} else if (prop.semantic == 2) {\n\t\t\t\t\t// TODO\n\t\t\t\t} else if (prop.semantic == 5) {\n\t\t\t\t\t// TODO\n\t\t\t\t} else if (prop.semantic == 6) {\n\t\t\t\t\tlet material_url = this.texturePath + prop.value;\n\t\t\t\t\tmaterial_url = material_url.replace(/.\\\\/g, '');\n\t\t\t\t\tnormalMap = this.textureLoader.load(material_url);\n\t\t\t\t\t// TODO: read texture settings from assimp.\n\t\t\t\t\t// Wrapping is the default, though.\n\t\t\t\t\tnormalMap.wrapS = normalMap.wrapT = TEXTURE_WRAP.REPEAT;\n\t\t\t\t}\n\t\t\t} else if (prop.key === '?mat.name') {\n\t\t\t\t// TODO\n\t\t\t} else if (prop.key === '$clr.ambient') {\n\t\t\t\t// TODO\n\t\t\t} else if (prop.key === '$clr.diffuse') {\n\t\t\t\tmaterial.diffuse.fromArray(prop.value);\n\t\t\t} else if (prop.key === '$clr.specular') {\n\t\t\t\tmaterial.specular.fromArray(prop.value);\n\t\t\t} else if (prop.key === '$clr.emissive') {\n\t\t\t\tmaterial.emissive.fromArray(prop.value);\n\t\t\t} else if (prop.key === '$mat.opacity') {\n\t\t\t\tmaterial.transparent = prop.value < 1;\n\t\t\t\tmaterial.opacity = prop.value;\n\t\t\t} else if (prop.key === '$mat.shadingm') {\n\t\t\t\t// Flat shading?\n\t\t\t\tif (prop.value === 1) {\n\t\t\t\t\t// TODO\n\t\t\t\t}\n\t\t\t} else if (prop.key === '$mat.shininess') {\n\t\t\t\tmaterial.shininess = prop.value;\n\t\t\t}\n\t\t}\n\n\t\tmaterial.diffuseMap = diffuseMap;\n\t\tmaterial.normalMap = normalMap;\n\n\t\treturn material;\n\t}\n\n\tparseMesh(json) {\n\t\tconst geometry = new Geometry();\n\n\t\tconst faces = json.faces;\n\t\tconst vertices = json.vertices;\n\t\tconst normals = json.normals;\n\t\tconst texturecoords = json.texturecoords && json.texturecoords[0];\n\t\tconst verticesCount = vertices.length / 3;\n\t\tconst g_v = [];\n\n\t\t// bones\n\t\tconst bones = json.bones;\n\t\tconst bind = [];\n\t\tif (bones) {\n\t\t\tfor (let i = 0; i < verticesCount; i++) {\n\t\t\t\tbind[i] = [];\n\t\t\t}\n\n\t\t\tlet bone, weights, weight;\n\t\t\tfor (let i = 0; i < bones.length; i++) {\n\t\t\t\tbone = bones[i];\n\t\t\t\tweights = bone.weights;\n\t\t\t\tfor (let j = 0; j < weights.length; j++) {\n\t\t\t\t\tweight = weights[j];\n\t\t\t\t\tbind[weight[0]].push({\n\t\t\t\t\t\tindex: i,\n\t\t\t\t\t\tweight: weight[1]\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// every vertex bind 4 bones\n\t\t\tfor (let i = 0; i < verticesCount; i++) {\n\t\t\t\tconst ver = bind[i];\n\n\t\t\t\tver.sort(function(a, b) {\n\t\t\t\t\treturn b.weight - a.weight;\n\t\t\t\t});\n\n\t\t\t\t// identify\n\t\t\t\tlet w1 = ver[0] ? ver[0].weight : 0;\n\t\t\t\tlet w2 = ver[1] ? ver[1].weight : 0;\n\t\t\t\tlet w3 = ver[2] ? ver[2].weight : 0;\n\t\t\t\tlet w4 = ver[3] ? ver[3].weight : 0;\n\t\t\t\tconst sum = w1 + w2 + w3 + w4;\n\t\t\t\tif (sum > 0) {\n\t\t\t\t\tw1 = w1 / sum;\n\t\t\t\t\tw2 = w2 / sum;\n\t\t\t\t\tw3 = w3 / sum;\n\t\t\t\t\tw4 = w4 / sum;\n\t\t\t\t}\n\t\t\t\tver[0] && (ver[0].weight = w1);\n\t\t\t\tver[1] && (ver[1].weight = w2);\n\t\t\t\tver[2] && (ver[2].weight = w3);\n\t\t\t\tver[3] && (ver[3].weight = w4);\n\t\t\t}\n\t\t}\n\n\t\tfor (let i = 0; i < verticesCount; i++) {\n\t\t\tg_v.push(vertices[i * 3 + 0]);\n\t\t\tg_v.push(vertices[i * 3 + 1]);\n\t\t\tg_v.push(vertices[i * 3 + 2]);\n\n\t\t\tg_v.push(normals[i * 3 + 0]);\n\t\t\tg_v.push(normals[i * 3 + 1]);\n\t\t\tg_v.push(normals[i * 3 + 2]);\n\n\t\t\tg_v.push(0);\n\t\t\tg_v.push(0);\n\t\t\tg_v.push(0);\n\n\t\t\tif (bones) {\n\t\t\t\tconst ver = bind[i];\n\t\t\t\t// bones index\n\t\t\t\tfor (let k = 0; k < 4; k++) {\n\t\t\t\t\tif (ver[k]) {\n\t\t\t\t\t\tg_v.push(ver[k].index);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tg_v.push(0);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// v color\n\t\t\t\tg_v.push(1);\n\t\t\t\tg_v.push(1);\n\t\t\t\tg_v.push(1);\n\t\t\t\tg_v.push(1);\n\t\t\t}\n\n\t\t\t// uv1\n\t\t\tif (texturecoords) {\n\t\t\t\tg_v.push(texturecoords[i * 2 + 0]);\n\t\t\t\tg_v.push(texturecoords[i * 2 + 1]);\n\t\t\t} else {\n\t\t\t\tg_v.push(0);\n\t\t\t\tg_v.push(0);\n\t\t\t}\n\n\t\t\tif (bones) {\n\t\t\t\t// bones weight\n\t\t\t\tconst ver = bind[i];\n\t\t\t\t// bones index\n\t\t\t\tfor (let k = 0; k < 4; k++) {\n\t\t\t\t\tif (ver[k]) {\n\t\t\t\t\t\tg_v.push(ver[k].weight);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tg_v.push(0);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// uv2\n\t\t\t\tg_v.push(0);\n\t\t\t\tg_v.push(0);\n\t\t\t}\n\t\t}\n\n\t\tif (bones) {\n\t\t\tconst buffer = new Buffer(new Float32Array(g_v), 19);\n\t\t\tlet attribute;\n\t\t\tattribute = new Attribute(buffer, 3, 0);\n\t\t\tgeometry.addAttribute('a_Position', attribute);\n\t\t\tattribute = new Attribute(buffer, 3, 3);\n\t\t\tgeometry.addAttribute('a_Normal', attribute);\n\t\t\tattribute = new Attribute(buffer, 4, 9);\n\t\t\tgeometry.addAttribute('skinIndex', attribute);\n\t\t\tattribute = new Attribute(buffer, 4, 15);\n\t\t\tgeometry.addAttribute('skinWeight', attribute);\n\t\t\tattribute = new Attribute(buffer, 2, 13);\n\t\t\tgeometry.addAttribute('a_Uv', attribute);\n\t\t} else {\n\t\t\tconst buffer = new Buffer(new Float32Array(g_v), 17);\n\t\t\tlet attribute;\n\t\t\tattribute = new Attribute(buffer, 3, 0);\n\t\t\tgeometry.addAttribute('a_Position', attribute);\n\t\t\tattribute = new Attribute(buffer, 3, 3);\n\t\t\tgeometry.addAttribute('a_Normal', attribute);\n\t\t\tattribute = new Attribute(buffer, 4, 9);\n\t\t\tgeometry.addAttribute('a_Color', attribute);\n\t\t\tattribute = new Attribute(buffer, 2, 13);\n\t\t\tgeometry.addAttribute('a_Uv', attribute);\n\t\t}\n\n\t\tconst g_i = [];\n\t\tfor (let i = 0; i < faces.length; i++) {\n\t\t\tg_i.push(faces[i][0]);\n\t\t\tg_i.push(faces[i][1]);\n\t\t\tg_i.push(faces[i][2]);\n\t\t}\n\n\t\tgeometry.setIndex(g_i);\n\n\t\tgeometry.computeBoundingBox();\n\t\tgeometry.computeBoundingSphere();\n\n\t\treturn geometry;\n\t}\n\n\textractUrlBase(url) {\n\t\tconst parts = url.split('/');\n\t\tparts.pop();\n\t\treturn (parts.length < 1 ? '.' : parts.join('/')) + '/';\n\t}\n\n}\n\nexport { AssimpJsonLoader };"
  },
  {
    "path": "examples/jsm/loaders/DDSLoader.js",
    "content": "import {\n\tLoader,\n\tFileLoader,\n\tPIXEL_FORMAT,\n\tTextureCube,\n\tTexture2D,\n\tTEXTURE_FILTER\n} from 't3d';\n\nclass DDSLoader extends Loader {\n\n\tload(url, onLoad, onProgress, onError) {\n\t\tnew FileLoader(this.manager)\n\t\t\t.setResponseType('arraybuffer')\n\t\t\t.setRequestHeader(this.requestHeader)\n\t\t\t.setPath(this.path)\n\t\t\t.setWithCredentials(this.withCredentials)\n\t\t\t.load(url, buffer => {\n\t\t\t\tonLoad && onLoad(this.parse(buffer, true));\n\t\t\t}, onProgress, onError);\n\t}\n\n\tparse(buffer, loadMipmaps) {\n\t\tconst dds = { mipmaps: [], width: 0, height: 0, format: null, mipmapCount: 1, isCubemap: false };\n\n\t\t// Adapted from @toji's DDS utils\n\t\t// https://github.com/toji/webgl-texture-utils/blob/master/texture-util/dds.js\n\n\t\t// All values and structures referenced from:\n\t\t// http://msdn.microsoft.com/en-us/library/bb943991.aspx/\n\n\t\tconst DDS_MAGIC = 0x20534444;\n\n\t\t// const DDSD_CAPS = 0x1;\n\t\t// const DDSD_HEIGHT = 0x2;\n\t\t// const DDSD_WIDTH = 0x4;\n\t\t// const DDSD_PITCH = 0x8;\n\t\t// const DDSD_PIXELFORMAT = 0x1000;\n\t\tconst DDSD_MIPMAPCOUNT = 0x20000;\n\t\t// const DDSD_LINEARSIZE = 0x80000;\n\t\t// const DDSD_DEPTH = 0x800000;\n\n\t\t// const DDSCAPS_COMPLEX = 0x8;\n\t\t// const DDSCAPS_MIPMAP = 0x400000;\n\t\t// const DDSCAPS_TEXTURE = 0x1000;\n\n\t\tconst DDSCAPS2_CUBEMAP = 0x200;\n\t\tconst DDSCAPS2_CUBEMAP_POSITIVEX = 0x400;\n\t\tconst DDSCAPS2_CUBEMAP_NEGATIVEX = 0x800;\n\t\tconst DDSCAPS2_CUBEMAP_POSITIVEY = 0x1000;\n\t\tconst DDSCAPS2_CUBEMAP_NEGATIVEY = 0x2000;\n\t\tconst DDSCAPS2_CUBEMAP_POSITIVEZ = 0x4000;\n\t\tconst DDSCAPS2_CUBEMAP_NEGATIVEZ = 0x8000;\n\t\t// const DDSCAPS2_VOLUME = 0x200000;\n\n\t\t// const DDPF_ALPHAPIXELS = 0x1;\n\t\t// const DDPF_ALPHA = 0x2;\n\t\t// const DDPF_FOURCC = 0x4;\n\t\t// const DDPF_RGB = 0x40;\n\t\t// const DDPF_YUV = 0x200;\n\t\t// const DDPF_LUMINANCE = 0x20000;\n\n\t\t// TODO: support DXGI formats\n\t\t// const DXGI_FORMAT_BC6H_UF16 = 95;\n\t\t// const DXGI_FORMAT_BC6H_SF16 = 96;\n\n\t\tfunction fourCCToInt32(value) {\n\t\t\treturn value.charCodeAt(0) +\n\t\t\t\t(value.charCodeAt(1) << 8) +\n\t\t\t\t(value.charCodeAt(2) << 16) +\n\t\t\t\t(value.charCodeAt(3) << 24);\n\t\t}\n\n\t\tfunction int32ToFourCC(value) {\n\t\t\treturn String.fromCharCode(\n\t\t\t\tvalue & 0xff,\n\t\t\t\t(value >> 8) & 0xff,\n\t\t\t\t(value >> 16) & 0xff,\n\t\t\t\t(value >> 24) & 0xff\n\t\t\t);\n\t\t}\n\n\t\tfunction loadARGBMip(buffer, dataOffset, width, height) {\n\t\t\tconst dataLength = width * height * 4;\n\t\t\tconst srcBuffer = new Uint8Array(buffer, dataOffset, dataLength);\n\t\t\tconst byteArray = new Uint8Array(dataLength);\n\t\t\tlet dst = 0;\n\t\t\tlet src = 0;\n\t\t\tfor (let y = 0; y < height; y++) {\n\t\t\t\tfor (let x = 0; x < width; x++) {\n\t\t\t\t\tconst b = srcBuffer[src]; src++;\n\t\t\t\t\tconst g = srcBuffer[src]; src++;\n\t\t\t\t\tconst r = srcBuffer[src]; src++;\n\t\t\t\t\tconst a = srcBuffer[src]; src++;\n\t\t\t\t\tbyteArray[dst] = r; dst++;\t// r\n\t\t\t\t\tbyteArray[dst] = g; dst++;\t// g\n\t\t\t\t\tbyteArray[dst] = b; dst++;\t// b\n\t\t\t\t\tbyteArray[dst] = a; dst++;\t// a\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn byteArray;\n\t\t}\n\n\t\tconst FOURCC_DXT1 = fourCCToInt32('DXT1');\n\t\tconst FOURCC_DXT3 = fourCCToInt32('DXT3');\n\t\tconst FOURCC_DXT5 = fourCCToInt32('DXT5');\n\t\tconst FOURCC_ETC1 = fourCCToInt32('ETC1');\n\n\t\tconst headerLengthInt = 31; // The header length in 32 bit ints\n\n\t\t// Offsets into the header array\n\n\t\tconst off_magic = 0;\n\n\t\tconst off_size = 1;\n\t\tconst off_flags = 2;\n\t\tconst off_height = 3;\n\t\tconst off_width = 4;\n\n\t\tconst off_mipmapCount = 7;\n\n\t\t// const off_pfFlags = 20;\n\t\tconst off_pfFourCC = 21;\n\t\tconst off_RGBBitCount = 22;\n\t\tconst off_RBitMask = 23;\n\t\tconst off_GBitMask = 24;\n\t\tconst off_BBitMask = 25;\n\t\tconst off_ABitMask = 26;\n\n\t\t// const off_caps = 27;\n\t\tconst off_caps2 = 28;\n\t\t// const off_caps3 = 29;\n\t\t// const off_caps4 = 30;\n\n\t\t// Parse header\n\n\t\tconst header = new Int32Array(buffer, 0, headerLengthInt);\n\n\t\tif (header[off_magic] !== DDS_MAGIC) {\n\t\t\tconsole.error('DDSLoader.parse: Invalid magic number in DDS header.');\n\t\t\treturn dds;\n\t\t}\n\n\t\tlet blockBytes;\n\n\t\tconst fourCC = header[off_pfFourCC];\n\n\t\tlet isRGBAUncompressed = false;\n\n\t\tswitch (fourCC) {\n\t\t\tcase FOURCC_DXT1:\n\t\t\t\tblockBytes = 8;\n\t\t\t\tdds.format = PIXEL_FORMAT.RGB_S3TC_DXT1;\n\t\t\t\tbreak;\n\t\t\tcase FOURCC_DXT3:\n\t\t\t\tblockBytes = 16;\n\t\t\t\tdds.format = PIXEL_FORMAT.RGBA_S3TC_DXT3;\n\t\t\t\tbreak;\n\t\t\tcase FOURCC_DXT5:\n\t\t\t\tblockBytes = 16;\n\t\t\t\tdds.format = PIXEL_FORMAT.RGBA_S3TC_DXT5;\n\t\t\t\tbreak;\n\t\t\tcase FOURCC_ETC1:\n\t\t\t\tblockBytes = 8;\n\t\t\t\tdds.format = PIXEL_FORMAT.RGB_ETC1;\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tif (header[off_RGBBitCount] === 32\n\t\t\t\t\t&& header[off_RBitMask] & 0xff0000\n\t\t\t\t\t&& header[off_GBitMask] & 0xff00\n\t\t\t\t\t&& header[off_BBitMask] & 0xff\n\t\t\t\t\t&& header[off_ABitMask] & 0xff000000) {\n\t\t\t\t\tisRGBAUncompressed = true;\n\t\t\t\t\tblockBytes = 64;\n\t\t\t\t\tdds.format = PIXEL_FORMAT.RGBA;\n\t\t\t\t} else {\n\t\t\t\t\tconsole.error('DDSLoader.parse: Unsupported FourCC code ', int32ToFourCC(fourCC));\n\t\t\t\t\treturn dds;\n\t\t\t\t}\n\t\t}\n\n\t\tdds.mipmapCount = 1;\n\n\t\tif (header[off_flags] & DDSD_MIPMAPCOUNT && loadMipmaps !== false) {\n\t\t\tdds.mipmapCount = Math.max(1, header[off_mipmapCount]);\n\t\t}\n\n\t\tconst caps2 = header[off_caps2];\n\t\tdds.isCubemap = caps2 & DDSCAPS2_CUBEMAP ? true : false;\n\t\tif (dds.isCubemap && (\n\t\t\t!(caps2 & DDSCAPS2_CUBEMAP_POSITIVEX) ||\n\t\t\t!(caps2 & DDSCAPS2_CUBEMAP_NEGATIVEX) ||\n\t\t\t!(caps2 & DDSCAPS2_CUBEMAP_POSITIVEY) ||\n\t\t\t!(caps2 & DDSCAPS2_CUBEMAP_NEGATIVEY) ||\n\t\t\t!(caps2 & DDSCAPS2_CUBEMAP_POSITIVEZ) ||\n\t\t\t!(caps2 & DDSCAPS2_CUBEMAP_NEGATIVEZ)\n\t\t)) {\n\t\t\tconsole.error('DDSLoader.parse: Incomplete cubemap faces');\n\t\t\treturn dds;\n\t\t}\n\n\t\tdds.width = header[off_width];\n\t\tdds.height = header[off_height];\n\n\t\tlet dataOffset = header[off_size] + 4;\n\n\t\t// Extract mipmaps buffers\n\n\t\tconst faces = dds.isCubemap ? 6 : 1;\n\n\t\tfor (let face = 0; face < faces; face++) {\n\t\t\tlet width = dds.width;\n\t\t\tlet height = dds.height;\n\n\t\t\tfor (let i = 0; i < dds.mipmapCount; i++) {\n\t\t\t\tlet byteArray, dataLength;\n\n\t\t\t\tif (isRGBAUncompressed) {\n\t\t\t\t\tbyteArray = loadARGBMip(buffer, dataOffset, width, height);\n\t\t\t\t\tdataLength = byteArray.length;\n\t\t\t\t} else {\n\t\t\t\t\tdataLength = Math.max(4, width) / 4 * Math.max(4, height) / 4 * blockBytes;\n\t\t\t\t\tbyteArray = new Uint8Array(buffer, dataOffset, dataLength);\n\t\t\t\t}\n\n\t\t\t\tconst mipmap = { 'data': byteArray, 'width': width, 'height': height };\n\t\t\t\tdds.mipmaps.push(mipmap);\n\n\t\t\t\tdataOffset += dataLength;\n\n\t\t\t\twidth = Math.max(width >> 1, 1);\n\t\t\t\theight = Math.max(height >> 1, 1);\n\t\t\t}\n\t\t}\n\n\t\treturn dds;\n\t}\n\n}\n\nclass DDSTextureLoader extends DDSLoader {\n\n\tload(url, onLoad, onProgress, onError) {\n\t\tsuper.load(url, textureData => {\n\t\t\tconst { mipmaps, width, height, format, mipmapCount, isCubemap } = textureData;\n\n\t\t\tlet texture;\n\n\t\t\tif (isCubemap) {\n\t\t\t\ttexture = new TextureCube();\n\n\t\t\t\tconst faces = mipmaps.length / mipmapCount;\n\n\t\t\t\tfor (let f = 0; f < faces; f++) {\n\t\t\t\t\ttexture.images[f] = { data: mipmaps[f * mipmapCount], width, height, isCompressed: format !== PIXEL_FORMAT.RGBA };\n\t\t\t\t}\n\n\t\t\t\tfor (let i = 0; i < mipmapCount; i++) {\n\t\t\t\t\ttexture.mipmaps[i] = [];\n\t\t\t\t\tfor (let f = 0; f < faces; f++) {\n\t\t\t\t\t\ttexture.mipmaps[i].push(mipmaps[f * mipmapCount + i]);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\ttexture = new Texture2D();\n\t\t\t\ttexture.image = { data: mipmaps[0].data, width, height, isCompressed: format !== PIXEL_FORMAT.RGBA };\n\t\t\t\ttexture.mipmaps = mipmaps;\n\t\t\t}\n\n\t\t\ttexture.minFilter = mipmapCount === 1 ? TEXTURE_FILTER.LINEAR : TEXTURE_FILTER.LINEAR_MIPMAP_LINEAR;\n\t\t\ttexture.magFilter = TEXTURE_FILTER.LINEAR;\n\n\t\t\ttexture.format = format;\n\n\t\t\t// no flipping for cube textures\n\t\t\t// (also flipping doesn't work for compressed textures )\n\n\t\t\ttexture.flipY = false;\n\n\t\t\t// can't generate mipmaps for compressed textures\n\t\t\t// mips must be embedded in DDS files\n\n\t\t\ttexture.generateMipmaps = false;\n\n\t\t\ttexture.version++;\n\n\t\t\tonLoad && onLoad(texture);\n\t\t}, onProgress, onError);\n\t}\n\n}\n\nexport { DDSLoader, DDSTextureLoader };"
  },
  {
    "path": "examples/jsm/loaders/DRACOLoader.js",
    "content": "import {\n\tAttribute,\n\tGeometry,\n\tBuffer,\n\tFileLoader,\n\tLoader,\n\tColor3\n} from 't3d';\n\nconst _taskCache = new WeakMap();\nconst SRGBColorSpace = 'srgb';\nconst LinearSRGBColorSpace = 'srgb-linear';\n\nclass DRACOLoader extends Loader {\n\n\tconstructor(manager) {\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\t'a_Position': 'POSITION',\n\t\t\t'a_Normal': 'NORMAL',\n\t\t\t'a_Color': 'COLOR',\n\t\t\t'a_Uv': 'TEX_COORD'\n\t\t};\n\t\tthis.defaultAttributeTypes = {\n\t\t\t'a_Position': 'Float32Array',\n\t\t\t'a_Normal': 'Float32Array',\n\t\t\t'a_Color': 'Float32Array',\n\t\t\t'a_Uv': 'Float32Array'\n\t\t};\n\t}\n\n\tsetDecoderPath(path) {\n\t\tthis.decoderPath = path;\n\t\treturn this;\n\t}\n\n\tsetDecoderConfig(config) {\n\t\tthis.decoderConfig = config;\n\t\treturn this;\n\t}\n\n\tsetWorkerLimit(workerLimit) {\n\t\tthis.workerLimit = workerLimit;\n\t\treturn this;\n\t}\n\n\tload(url, onLoad, onProgress, onError) {\n\t\tconst loader = new FileLoader(this.manager);\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\t\t\tthis.parse(buffer, onLoad, onError);\n\t\t}, onProgress, onError);\n\t}\n\n\tparse(buffer, onLoad, onError) {\n\t\tthis.decodeDracoFile(buffer, onLoad, null, null, SRGBColorSpace).catch(onError);\n\t}\n\n\tdecodeDracoFile(buffer, callback, attributeIDs, attributeTypes, vertexColorSpace = LinearSRGBColorSpace) {\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);\n\t}\n\n\tdecodeGeometry(buffer, taskConfig) {\n\t\tconst taskKey = JSON.stringify(taskConfig);\n\n\t\tif (_taskCache.has(buffer)) {\n\t\t\tconst cachedTask = _taskCache.get(buffer);\n\t\t\tif (cachedTask.key === taskKey) {\n\t\t\t\treturn cachedTask.promise;\n\t\t\t} else if (buffer.byteLength === 0) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t'DRACOLoader: Unable to re-decode a buffer with different ' +\n\t\t\t\t\t'settings. Buffer has already been transferred.'\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\tlet worker;\n\t\tconst taskID = this.workerNextTaskID++;\n\t\tconst taskCost = buffer.byteLength;\n\n\t\tconst geometryPending = this._getWorker(taskID, taskCost)\n\t\t\t.then(_worker => {\n\t\t\t\tworker = _worker;\n\t\t\t\treturn new Promise((resolve, reject) => {\n\t\t\t\t\tworker._callbacks[taskID] = { resolve, reject };\n\t\t\t\t\tworker.postMessage({ type: 'decode', id: taskID, taskConfig, buffer }, [buffer]);\n\t\t\t\t});\n\t\t\t})\n\t\t\t.then(message => this._createGeometry(message.geometry));\n\n\t\tgeometryPending\n\t\t\t.catch(() => true)\n\t\t\t.then(() => {\n\t\t\t\tif (worker && taskID) {\n\t\t\t\t\tthis._releaseTask(worker, taskID);\n\t\t\t\t}\n\t\t\t});\n\n\t\t_taskCache.set(buffer, {\n\t\t\tkey: taskKey,\n\t\t\tpromise: geometryPending\n\t\t});\n\n\t\treturn geometryPending;\n\t}\n\n\t_createGeometry(geometryData) {\n\t\tconst geometry = new Geometry();\n\n\t\tif (geometryData.index) {\n\t\t\tgeometry.setIndex(new Attribute(new Buffer(geometryData.index.array, 1)));\n\t\t}\n\n\t\tfor (let i = 0; i < geometryData.attributes.length; i++) {\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 Attribute(new Buffer(array, itemSize));\n\t\t\tif (name === 'a_color') {\n\t\t\t\tassignVertexColorSpace(attribute, result.vertexColorSpace);\n\t\t\t}\n\n\t\t\tgeometry.addAttribute(name, attribute);\n\t\t}\n\n\t\treturn geometry;\n\t}\n\n\t_loadLibrary(url, responseType) {\n\t\tconst loader = new FileLoader(this.manager);\n\t\tloader.setPath(this.decoderPath || DRACOLoader.decoderPath);\n\t\tloader.setResponseType(responseType);\n\t\tloader.setWithCredentials(this.withCredentials);\n\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tloader.load(url, resolve, undefined, reject);\n\t\t});\n\t}\n\n\tpreload() {\n\t\tthis._initDecoder();\n\t\treturn this;\n\t}\n\n\t_initDecoder() {\n\t\tif (this.decoderPending) return this.decoderPending;\n\t\tconst config = this.decoderConfig || DRACOLoader.decoderConfig;\n\t\tconst useJS = typeof WebAssembly !== 'object' || config.type === 'js';\n\t\tconst librariesPending = [];\n\n\t\tif (useJS) {\n\t\t\tlibrariesPending.push(this._loadLibrary('draco_decoder.js', 'text'));\n\t\t} else {\n\t\t\tlibrariesPending.push(this._loadLibrary('draco_wasm_wrapper.js', 'text'));\n\t\t\tlibrariesPending.push(this._loadLibrary('draco_decoder.wasm', 'arraybuffer'));\n\t\t}\n\n\t\tthis.decoderPending = Promise.all(librariesPending)\n\t\t\t.then(libraries => {\n\t\t\t\tconst jsContent = libraries[0];\n\t\t\t\tif (!useJS) {\n\t\t\t\t\tconfig.wasmBinary = libraries[1];\n\t\t\t\t}\n\t\t\t\tconst fn = DRACOWorker.toString();\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\t\t\t});\n\n\t\treturn this.decoderPending;\n\t}\n\n\t_getWorker(taskID, taskCost) {\n\t\treturn this._initDecoder().then(() => {\n\t\t\tif (this.workerPool.length < this.workerLimit) {\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 || DRACOLoader.decoderConfig });\n\n\t\t\t\tworker.onmessage = function(e) {\n\t\t\t\t\tconst message = e.data;\n\t\t\t\t\tswitch (message.type) {\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\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\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\tconsole.error('DRACOLoader: Unexpected message, \"' + message.type + '\"');\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t\tthis.workerPool.push(worker);\n\t\t\t} else {\n\t\t\t\tthis.workerPool.sort(function(a, b) {\n\t\t\t\t\treturn a._taskLoad > b._taskLoad ? -1 : 1;\n\t\t\t\t});\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\t\t});\n\t}\n\n\t_releaseTask(worker, taskID) {\n\t\tworker._taskLoad -= worker._taskCosts[taskID];\n\t\tdelete worker._callbacks[taskID];\n\t\tdelete worker._taskCosts[taskID];\n\t}\n\n\tdebug() {\n\t\tconsole.log('Task load: ', this.workerPool.map(worker => worker._taskLoad));\n\t}\n\n\tdispose() {\n\t\tfor (let i = 0; i < this.workerPool.length; ++i) {\n\t\t\tthis.workerPool[i].terminate();\n\t\t}\n\t\tthis.workerPool.length = 0;\n\t\tif (this.workerSourceURL !== '') {\n\t\t\tURL.revokeObjectURL(this.workerSourceURL);\n\t\t}\n\t\treturn this;\n\t}\n\n}\n\n/* Deprecated */\n\nDRACOLoader.decoderPath = './';\nDRACOLoader.decoderConfig = {};\n\nDRACOLoader.setDecoderPath = function(path) {\n\tconsole.warn('DRACOLoader.setDecoderPath has been deprecated, use new DRACOLoader().setDecoderPath instead.');\n\tDRACOLoader.decoderPath = path;\n};\n\nDRACOLoader.setDecoderConfig = function(config) {\n\tconsole.warn('DRACOLoader.setDecoderConfig has been deprecated, use new DRACOLoader().setDecoderConfig instead.');\n\tconst wasmBinary = DRACOLoader.decoderConfig.wasmBinary;\n\tDRACOLoader.decoderConfig = config || {};\n\tif (wasmBinary) DRACOLoader.decoderConfig.wasmBinary = wasmBinary; // Reuse WASM binary.\n};\nDRACOLoader.releaseDecoderModule = function() {\n\tconsole.warn('DRACOLoader.releaseDecoderModule has been removed.');\n};\n\n/* Helpers */\n\nfunction assignVertexColorSpace(attribute, inputColorSpace) {\n\tif (inputColorSpace !== SRGBColorSpace) return;\n\n\tconst _color = new Color3();\n\tfor (let i = 0, il = attribute.buffer.count; i < il; i++) {\n\t\t_color.fromArray(\n\t\t\tattribute.buffer.array,\n\t\t\ti * attribute.buffer.stride + attribute.offset,\n\t\t\tattribute.normalized\n\t\t);\n\t\t_color.convertSRGBToLinear();\n\t\t_color.toArray(\n\t\t\tattribute.buffer.array,\n\t\t\ti * attribute.buffer.stride + attribute.offset,\n\t\t\tattribute.normalized\n\t\t);\n\t}\n}\n\n/* WEB WORKER */\n\nfunction DRACOWorker() {\n\tlet decoderConfig;\n\tlet decoderPending;\n\n\tonmessage = function(e) {\n\t\tconst message = e.data;\n\n\t\tswitch (message.type) {\n\t\t\tcase 'init': {\n\t\t\t\tdecoderConfig = message.decoderConfig;\n\t\t\t\tdecoderPending = new Promise(function(resolve/* , reject */) {\n\t\t\t\t\tdecoderConfig.onModuleLoaded = function(draco) {\n\t\t\t\t\t\tresolve({ draco: draco });\n\t\t\t\t\t};\n\t\t\t\t\t// eslint-disable-next-line\n\t\t\t\t\tDracoDecoderModule(decoderConfig);\n\t\t\t\t});\n\t\t\t\tbreak;\n\t\t\t}\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\t\t\t\t\tconst draco = module.draco;\n\t\t\t\t\tconst decoder = new draco.Decoder();\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst geometry = decodeGeometry(draco, decoder, new Int8Array(buffer), taskConfig);\n\t\t\t\t\t\tconst buffers = geometry.attributes.map(attr => attr.array.buffer);\n\t\t\t\t\t\tif (geometry.index) buffers.push(geometry.index.array.buffer);\n\t\t\t\t\t\tself.postMessage({ type: 'decode', id: message.id, geometry }, buffers);\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\tconsole.error(error);\n\t\t\t\t\t\tself.postMessage({ type: 'error', id: message.id, error: error.message });\n\t\t\t\t\t} finally {\n\t\t\t\t\t\tdraco.destroy(decoder);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t};\n\n\tfunction decodeGeometry(draco, decoder, array, taskConfig) {\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\t\t\tdracoGeometry = new draco.Mesh();\n\t\t\tdecodingStatus = decoder.DecodeArrayToMesh(array, array.byteLength, dracoGeometry);\n\t\t} else if (geometryType === draco.POINT_CLOUD) {\n\t\t\tdracoGeometry = new draco.PointCloud();\n\t\t\tdecodingStatus = decoder.DecodeArrayToPointCloud(array, array.byteLength, dracoGeometry);\n\t\t} else {\n\t\t\tthrow new Error('DRACOLoader: Unexpected geometry type.');\n\t\t}\n\t\tif (!decodingStatus.ok() || dracoGeometry.ptr === 0) {\n\t\t\tthrow new Error('DRACOLoader: Decoding failed: ' + decodingStatus.error_msg());\n\t\t}\n\n\t\tconst geometry = { index: null, attributes: [] };\n\n\t\tfor (const attributeName in attributeIDs) {\n\t\t\tconst attributeType = self[attributeTypes[attributeName]] || Float32Array;\n\t\t\tlet attribute;\n\t\t\tlet attributeID;\n\n\t\t\tif (taskConfig.useUniqueIDs) {\n\t\t\t\tattributeID = attributeIDs[attributeName];\n\t\t\t\tattribute = decoder.GetAttributeByUniqueId(dracoGeometry, attributeID);\n\t\t\t} else {\n\t\t\t\tattributeID = decoder.GetAttributeId(dracoGeometry, draco[attributeIDs[attributeName]]);\n\t\t\t\tif (attributeID === -1) continue;\n\t\t\t\tattribute = decoder.GetAttribute(dracoGeometry, attributeID);\n\t\t\t}\n\n\t\t\tconst attributeResult = decodeAttribute(draco, decoder, dracoGeometry, attributeName, attributeType, attribute);\n\n\t\t\tif (attributeName === 'a_color') {\n\t\t\t\tattributeResult.vertexColorSpace = taskConfig.vertexColorSpace;\n\t\t\t}\n\n\t\t\tgeometry.attributes.push(attributeResult);\n\t\t}\n\n\t\tif (geometryType === draco.TRIANGULAR_MESH) {\n\t\t\tgeometry.index = decodeIndex(draco, decoder, dracoGeometry);\n\t\t}\n\n\t\tdraco.destroy(dracoGeometry);\n\n\t\treturn geometry;\n\t}\n\n\tfunction decodeIndex(draco, decoder, dracoGeometry) {\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\t}\n\n\tfunction decodeAttribute(draco, decoder, dracoGeometry, attributeName, attributeType, attribute) {\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\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(); // eslint-disable-line\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\t}\n\n\tfunction getDracoDataType(draco, attributeType) {\n\t\tswitch (attributeType) {\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\t\t}\n\t}\n}\n\nexport { DRACOLoader };\n"
  },
  {
    "path": "examples/jsm/loaders/EXRLoader.js",
    "content": "import {\n\tLoader,\n\tFileLoader,\n\tPIXEL_TYPE,\n\tPIXEL_FORMAT,\n\tTEXTURE_FILTER,\n\tTEXEL_ENCODING_TYPE,\n\tTexture2D,\n\tMathUtils\n} from 't3d';\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\nlet _fflate;\n\nclass EXRLoader extends Loader {\n\n\tconstructor(manager) {\n\t\tsuper(manager);\n\n\t\tthis.type = PIXEL_TYPE.HALF_FLOAT;\n\t}\n\n\tstatic setfflate(fflate) {\n\t\t_fflate = fflate;\n\t}\n\n\tload(url, onLoad, onProgress, onError) {\n\t\tnew FileLoader(this.manager)\n\t\t\t.setResponseType('arraybuffer')\n\t\t\t.setRequestHeader(this.requestHeader)\n\t\t\t.setPath(this.path)\n\t\t\t.setWithCredentials(this.withCredentials)\n\t\t\t.load(url, buffer => {\n\t\t\t\tonLoad && onLoad(this.parse(buffer));\n\t\t\t}, onProgress, onError);\n\t}\n\n\tparse(buffer) {\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\t\t\tlet k = 0;\n\n\t\t\tfor (let i = 0; i < USHORT_RANGE; ++i) {\n\t\t\t\tif ((i == 0) || (bitmap[i >> 3] & (1 << (i & 7)))) {\n\t\t\t\t\tlut[k++] = i;\n\t\t\t\t}\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\t\t}\n\n\t\tfunction hufClearDecTable(hdec) {\n\t\t\tfor (let i = 0; i < HUF_DECSIZE; i++) {\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\t\t\t}\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\t\t\twhile (lc < nBits) {\n\t\t\t\tc = (c << 8) | parseUint8Array(uInt8Array, inOffset);\n\t\t\t\tlc += 8;\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\t\t}\n\n\t\tconst hufTableBuffer = new Array(59);\n\n\t\tfunction hufCanonicalCodeTable(hcode) {\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\t\t\t\tconst nc = ((c + hufTableBuffer[i]) >> 1);\n\t\t\t\thufTableBuffer[i] = c;\n\t\t\t\tc = nc;\n\t\t\t}\n\n\t\t\tfor (let i = 0; i < HUF_ENCSIZE; ++i) {\n\t\t\t\tconst l = hcode[i];\n\t\t\t\tif (l > 0) hcode[i] = l | (hufTableBuffer[l]++ << 6);\n\t\t\t}\n\t\t}\n\n\t\tfunction hufUnpackEncTable(uInt8Array, inOffset, ni, im, iM, hcode) {\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\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\t\t\t\t\tif (p.value - inOffset.value > ni) {\n\t\t\t\t\t\tthrow new Error('Something wrong with hufUnpackEncTable');\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\t\t\t\t\t\tthrow new Error('Something wrong with hufUnpackEncTable');\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\t\t\t\t} else if (l >= SHORT_ZEROCODE_RUN) {\n\t\t\t\t\tlet zerun = l - SHORT_ZEROCODE_RUN + 2;\n\n\t\t\t\t\tif (im + zerun > iM + 1) {\n\t\t\t\t\t\tthrow new Error('Something wrong with hufUnpackEncTable');\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\t\t\t\t}\n\t\t\t}\n\n\t\t\thufCanonicalCodeTable(hcode);\n\t\t}\n\n\t\tfunction hufLength(code) {\n\t\t\treturn code & 63;\n\t\t}\n\n\t\tfunction hufCode(code) {\n\t\t\treturn code >> 6;\n\t\t}\n\n\t\tfunction hufBuildDecTable(hcode, im, iM, hdecod) {\n\t\t\tfor (; im <= iM; im++) {\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\t\t\t\t\tthrow new Error('Invalid table entry');\n\t\t\t\t}\n\n\t\t\t\tif (l > HUF_DECBITS) {\n\t\t\t\t\tconst pl = hdecod[(c >> (l - HUF_DECBITS))];\n\n\t\t\t\t\tif (pl.len) {\n\t\t\t\t\t\tthrow new Error('Invalid table entry');\n\t\t\t\t\t}\n\n\t\t\t\t\tpl.lit++;\n\n\t\t\t\t\tif (pl.p) {\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\t\t\t\t\t\t\tpl.p[i] = p[i];\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tpl.p = new Array(1);\n\t\t\t\t\t}\n\n\t\t\t\t\tpl.p[pl.lit - 1] = im;\n\t\t\t\t} else if (l) {\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\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\t\t\t\t\t\t\tthrow new Error('Invalid table entry');\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\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn true;\n\t\t}\n\n\t\tconst getCharReturn = { c: 0, lc: 0 };\n\n\t\tfunction getChar(c, lc, uInt8Array, inOffset) {\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\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\t\t\tif (po == rlc) {\n\t\t\t\tif (lc < 8) {\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\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\t\t\t\t\treturn false;\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\t\t\t\t\toutBuffer[outBufferOffset.value++] = s;\n\t\t\t\t}\n\t\t\t} else if (outBufferOffset.value < outBufferEndOffset) {\n\t\t\t\toutBuffer[outBufferOffset.value++] = po;\n\t\t\t} else {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tgetCodeReturn.c = c;\n\t\t\tgetCodeReturn.lc = lc;\n\t\t}\n\n\t\tfunction UInt16(value) {\n\t\t\treturn (value & 0xFFFF);\n\t\t}\n\n\t\tfunction Int16(value) {\n\t\t\tconst ref = UInt16(value);\n\t\t\treturn (ref > 0x7FFF) ? ref - 0x10000 : ref;\n\t\t}\n\n\t\tconst wdec14Return = { a: 0, b: 0 };\n\n\t\tfunction wdec14(l, h) {\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\t\t}\n\n\t\tfunction wdec16(l, h) {\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\t\t}\n\n\t\tfunction wav2Decode(buffer, j, nx, ox, ny, oy, mx) {\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\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\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\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\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\t\t\t\t\t\t} else {\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\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif (nx & p) {\n\t\t\t\t\t\tconst p10 = px + oy1;\n\n\t\t\t\t\t\tif (w14) { wdec14(buffer[px + j], buffer[p10 + j]) } else { wdec16(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\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (ny & p) {\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\t\t\t\t\t\tconst p01 = px + ox1;\n\n\t\t\t\t\t\tif (w14) { wdec14(buffer[px + j], buffer[p01 + j]) } else { wdec16(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\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tp2 = p;\n\t\t\t\tp >>= 1;\n\t\t\t}\n\n\t\t\treturn py;\n\t\t}\n\n\t\tfunction hufDecode(encodingTable, decodingTable, uInt8Array, inOffset, ni, rlc, no, outBuffer, outOffset) {\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\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\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\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\t\t\t\t\t} else {\n\t\t\t\t\t\tif (!pl.p) {\n\t\t\t\t\t\t\tthrow new Error('hufDecode issues');\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\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\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\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (lc >= l && (hufCode(encodingTable[pl.p[j]]) == ((c >> (lc - l)) & ((1 << l) - 1)))) {\n\t\t\t\t\t\t\t\tlc -= l;\n\n\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\tc = getCodeReturn.c;\n\t\t\t\t\t\t\t\tlc = getCodeReturn.lc;\n\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (j == pl.lit) {\n\t\t\t\t\t\t\tthrow new Error('hufDecode issues');\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\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\t\t\t\tconst pl = decodingTable[(c << (HUF_DECBITS - lc)) & HUF_DECMASK];\n\n\t\t\t\tif (pl.len) {\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\t\t\t\t} else {\n\t\t\t\t\tthrow new Error('hufDecode issues');\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn true;\n\t\t}\n\n\t\tfunction hufUncompress(uInt8Array, inDataView, inOffset, nCompressed, outBuffer, nRaw) {\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\t\t\t\tthrow new Error('Something wrong with HUF_ENCSIZE');\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\t\t\t\tthrow new Error('Something wrong with hufUncompress');\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\t\t}\n\n\t\tfunction applyLut(lut, data, nData) {\n\t\t\tfor (let i = 0; i < nData; ++i) {\n\t\t\t\tdata[i] = lut[data[i]];\n\t\t\t}\n\t\t}\n\n\t\tfunction predictor(source) {\n\t\t\tfor (let t = 1; t < source.length; t++) {\n\t\t\t\tconst d = source[t - 1] + source[t] - 128;\n\t\t\t\tsource[t] = d;\n\t\t\t}\n\t\t}\n\n\t\tfunction interleaveScalar(source, out) {\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\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\t\t\t}\n\t\t}\n\n\t\tfunction decodeRunLength(source) {\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\t\t\t\tconst l = reader.getInt8(p++);\n\n\t\t\t\tif (l < 0) {\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\t\t\t\t\t\tout.push(reader.getUint8(p++));\n\t\t\t\t\t}\n\t\t\t\t} else {\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\t\t\t\t\t\tout.push(value);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn out;\n\t\t}\n\n\t\tfunction lossyDctDecode(cscSet, rowPtrs, channelData, acBuffer, dcBuffer, outBuffer) {\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\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\t\t\t}\n\n\t\t\tfor (let blocky = 0; blocky < numBlocksY; ++blocky) {\n\t\t\t\tlet maxY = 8;\n\n\t\t\t\tif (blocky == numBlocksY - 1) { maxY = leftoverY }\n\n\t\t\t\tlet maxX = 8;\n\n\t\t\t\tfor (let blockx = 0; blockx < numBlocksX; ++blockx) {\n\t\t\t\t\tif (blockx == numBlocksX - 1) { maxX = leftoverX }\n\n\t\t\t\t\tfor (let comp = 0; comp < numComp; ++comp) {\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\t\t\t\t\t}\n\n\t\t\t\t\tif (numComp == 3) {\n\t\t\t\t\t\tcsc709Inverse(dctData);\n\t\t\t\t\t}\n\n\t\t\t\t\tfor (let comp = 0; comp < numComp; ++comp) {\n\t\t\t\t\t\tconvertToHalf(dctData[comp], rowBlock[comp], blockx * 64);\n\t\t\t\t\t}\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\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\t\t\t\t\t\toffset = rowOffsets[comp][y];\n\n\t\t\t\t\t\tfor (let blockx = 0; blockx < numFullBlocksX; ++blockx) {\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\t\t\t\t\t\t}\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\t\t\t\t\t\tfor (let y = 8 * blocky; y < 8 * blocky + maxY; ++y) {\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\t\t\t\t\t\t\t\tdataView.setUint16(offset + x * INT16_SIZE * type, rowBlock[comp][src + x], true);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} // comp\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\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\t\t\t\t\tconst offset = rowOffsets[comp][y];\n\n\t\t\t\t\tfor (let x = 0; x < width; ++x) {\n\t\t\t\t\t\thalfRow[x] = dataView.getUint16(offset + x * INT16_SIZE * type, true);\n\t\t\t\t\t}\n\n\t\t\t\t\tfor (let x = 0; x < width; ++x) {\n\t\t\t\t\t\tdataView.setFloat32(offset + x * INT16_SIZE * type, decodeFloat16(halfRow[x]), true);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfunction unRleAC(currAcComp, acBuffer, halfZigBlock) {\n\t\t\tlet acValue;\n\t\t\tlet dctComp = 1;\n\n\t\t\twhile (dctComp < 64) {\n\t\t\t\tacValue = acBuffer[currAcComp.value];\n\n\t\t\t\tif (acValue == 0xff00) {\n\t\t\t\t\tdctComp = 64;\n\t\t\t\t} else if (acValue >> 8 == 0xff) {\n\t\t\t\t\tdctComp += acValue & 0xff;\n\t\t\t\t} else {\n\t\t\t\t\thalfZigBlock[dctComp] = acValue;\n\t\t\t\t\tdctComp++;\n\t\t\t\t}\n\n\t\t\t\tcurrAcComp.value++;\n\t\t\t}\n\t\t}\n\n\t\tfunction unZigZag(src, dst) {\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\t\t}\n\n\t\tfunction dctInverse(data) {\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\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\t\t\t}\n\n\t\t\tfor (let column = 0; column < 8; ++column) {\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\t\t\t}\n\t\t}\n\n\t\tfunction csc709Inverse(data) {\n\t\t\tfor (let i = 0; i < 64; ++i) {\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\t\t\t}\n\t\t}\n\n\t\tfunction convertToHalf(src, dst, idx) {\n\t\t\tfor (let i = 0; i < 64; ++i) {\n\t\t\t\tdst[idx + i] = MathUtils.toHalfFloat(toLinear(src[i]));\n\t\t\t}\n\t\t}\n\n\t\tfunction toLinear(float) {\n\t\t\tif (float <= 1) {\n\t\t\t\treturn Math.sign(float) * Math.pow(Math.abs(float), 2.2);\n\t\t\t} else {\n\t\t\t\treturn Math.sign(float) * Math.pow(logBase, Math.abs(float) - 1.0);\n\t\t\t}\n\t\t}\n\n\t\tfunction uncompressRAW(info) {\n\t\t\treturn new DataView(info.array.buffer, info.offset.value, info.size);\n\t\t}\n\n\t\tfunction uncompressRLE(info) {\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\t\t}\n\n\t\tfunction uncompressZIP(info) {\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\t\t}\n\n\t\tfunction uncompressPIZ(info) {\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.width * info.scanlineBlockSize * (info.channels * 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.channels);\n\t\t\tfor (let i = 0; i < info.channels; i++) {\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.width;\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\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\t\t\t\tthrow new Error('Something is wrong with PIZ_COMPRESSION BITMAP_SIZE');\n\t\t\t}\n\n\t\t\tif (minNonZero <= maxNonZero) {\n\t\t\t\tfor (let i = 0; i < maxNonZero - minNonZero + 1; i++) {\n\t\t\t\t\tbitmap[i + minNonZero] = parseUint8(inDataView, inOffset);\n\t\t\t\t}\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.channels; ++i) {\n\t\t\t\tconst cd = pizChannelData[i];\n\n\t\t\t\tfor (let j = 0; j < pizChannelData[i].size; ++j) {\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\t\t\t\t}\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\t\t\t\tfor (let c = 0; c < info.channels; c++) {\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\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn new DataView(tmpBuffer.buffer);\n\t\t}\n\n\t\tfunction uncompressPXR(info) {\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 sz = info.lines * info.channels * info.width;\n\t\t\tconst tmpBuffer = (info.type == 1) ? new Uint16Array(sz) : new Uint32Array(sz);\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\t\t\t\tfor (let c = 0; c < info.channels; c++) {\n\t\t\t\t\tlet pixel = 0;\n\n\t\t\t\t\tswitch (info.type) {\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.width;\n\t\t\t\t\t\t\ttmpBufferEnd = ptr[1] + info.width;\n\n\t\t\t\t\t\t\tfor (let j = 0; j < info.width; ++j) {\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\ttmpBuffer[writePtr] = pixel;\n\t\t\t\t\t\t\t\twritePtr++;\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.width;\n\t\t\t\t\t\t\tptr[2] = ptr[1] + info.width;\n\t\t\t\t\t\t\ttmpBufferEnd = ptr[2] + info.width;\n\n\t\t\t\t\t\t\tfor (let j = 0; j < info.width; ++j) {\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\ttmpBuffer[writePtr] = pixel;\n\t\t\t\t\t\t\t\twritePtr++;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn new DataView(tmpBuffer.buffer);\n\t\t}\n\n\t\tfunction uncompressDWA(info) {\n\t\t\tconst inDataView = info.viewer;\n\t\t\tconst inOffset = { value: info.offset.value };\n\t\t\tconst outBuffer = new Uint8Array(info.width * info.lines * (info.channels * 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) { throw 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\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\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.channels);\n\n\t\t\tfor (let i = 0; i < info.channels; ++i) {\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.width;\n\t\t\t\tcd.height = info.lines;\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.channels; ++offset) {\n\t\t\t\tconst cd = channelData[offset];\n\n\t\t\t\tfor (let i = 0; i < channelRules.length; ++i) {\n\t\t\t\t\tconst rule = channelRules[i];\n\n\t\t\t\t\tif (cd.name == rule.name) {\n\t\t\t\t\t\tcd.compression = rule.compression;\n\n\t\t\t\t\t\tif (rule.index >= 0) {\n\t\t\t\t\t\t\tcscSet.idx[rule.index] = offset;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tcd.offset = offset;\n\t\t\t\t\t}\n\t\t\t\t}\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\t\t\t\tswitch (dwaHeader.acCompression) {\n\t\t\t\t\tcase STATIC_HUFFMAN: {\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\t\t\t\t\t}\n\t\t\t\t\tcase DEFLATE: {\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\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Read DCT - DC component data\n\t\t\tif (dwaHeader.dcCompressedSize > 0) {\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\t\t\t}\n\n\t\t\t// Read RLE compressed data\n\t\t\tif (dwaHeader.rleRawSize > 0) {\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\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\t\t\t\trowOffsets[i] = new Array();\n\t\t\t}\n\n\t\t\tfor (let y = 0; y < info.lines; ++y) {\n\t\t\t\tfor (let chan = 0; chan < channelData.length; ++chan) {\n\t\t\t\t\trowOffsets[chan].push(outBufferEnd);\n\t\t\t\t\toutBufferEnd += channelData[chan].width * info.type * INT16_SIZE;\n\t\t\t\t}\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\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\t\t\t\t\tcase RLE: {\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\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\t\t\t\t\t\t\t\tfor (let byte = 0; byte < INT16_SIZE * cd.type; ++byte) {\n\t\t\t\t\t\t\t\t\toutBuffer[rowOffsetBytes++] = rleBuffer[rleOffset + byte * cd.width * cd.height];\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\trleOffset++;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\trow++;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcase LOSSY_DCT: // skip\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tthrow new Error('EXRLoader.parse: unsupported channel compression');\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn new DataView(outBuffer.buffer);\n\t\t}\n\n\t\tfunction parseNullTerminatedString(buffer, offset) {\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\t\t\t\tendOffset += 1;\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\t\t}\n\n\t\tfunction parseFixedLengthString(buffer, offset, size) {\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\t\t}\n\n\t\tfunction parseRational(dataView, offset) {\n\t\t\tconst x = parseInt32(dataView, offset);\n\t\t\tconst y = parseUint32(dataView, offset);\n\n\t\t\treturn [x, y];\n\t\t}\n\n\t\tfunction parseTimecode(dataView, offset) {\n\t\t\tconst x = parseUint32(dataView, offset);\n\t\t\tconst y = parseUint32(dataView, offset);\n\n\t\t\treturn [x, y];\n\t\t}\n\n\t\tfunction parseInt32(dataView, offset) {\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\t\t}\n\n\t\tfunction parseUint32(dataView, offset) {\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\t\t}\n\n\t\tfunction parseUint8Array(uInt8Array, offset) {\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\t\t}\n\n\t\tfunction parseUint8(dataView, offset) {\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\t\t}\n\n\t\tconst parseInt64 = function(dataView, offset) {\n\t\t\tlet int;\n\n\t\t\tif ('getBigInt64' in DataView.prototype) {\n\t\t\t\tint = Number(dataView.getBigInt64(offset.value, true));\n\t\t\t} else {\n\t\t\t\tint = dataView.getUint32(offset.value + 4, true) + Number(dataView.getUint32(offset.value, true) << 32);\n\t\t\t}\n\n\t\t\toffset.value += ULONG_SIZE;\n\n\t\t\treturn int;\n\t\t};\n\n\t\tfunction parseFloat32(dataView, offset) {\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\t\t}\n\n\t\tfunction decodeFloat32(dataView, offset) {\n\t\t\treturn MathUtils.toHalfFloat(parseFloat32(dataView, offset));\n\t\t}\n\n\t\t// https://stackoverflow.com/questions/5678432/decompressing-half-precision-floats-in-javascript\n\t\tfunction decodeFloat16(binary) {\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\t\t}\n\n\t\tfunction parseUint16(dataView, offset) {\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\t\t}\n\n\t\tfunction parseFloat16(buffer, offset) {\n\t\t\treturn decodeFloat16(parseUint16(buffer, offset));\n\t\t}\n\n\t\tfunction parseChlist(dataView, buffer, offset, size) {\n\t\t\tconst startOffset = offset.value;\n\t\t\tconst channels = [];\n\n\t\t\twhile (offset.value < (startOffset + size - 1)) {\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\t\t\t}\n\n\t\t\toffset.value += 1;\n\n\t\t\treturn channels;\n\t\t}\n\n\t\tfunction parseChromaticities(dataView, offset) {\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\t\t}\n\n\t\tfunction parseCompression(dataView, offset) {\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\t\t}\n\n\t\tfunction parseBox2i(dataView, offset) {\n\t\t\tconst xMin = parseUint32(dataView, offset);\n\t\t\tconst yMin = parseUint32(dataView, offset);\n\t\t\tconst xMax = parseUint32(dataView, offset);\n\t\t\tconst yMax = parseUint32(dataView, offset);\n\n\t\t\treturn { xMin: xMin, yMin: yMin, xMax: xMax, yMax: yMax };\n\t\t}\n\n\t\tfunction parseLineOrder(dataView, offset) {\n\t\t\tconst lineOrders = [\n\t\t\t\t'INCREASING_Y'\n\t\t\t];\n\n\t\t\tconst lineOrder = parseUint8(dataView, offset);\n\n\t\t\treturn lineOrders[lineOrder];\n\t\t}\n\n\t\tfunction parseV2f(dataView, offset) {\n\t\t\tconst x = parseFloat32(dataView, offset);\n\t\t\tconst y = parseFloat32(dataView, offset);\n\n\t\t\treturn [x, y];\n\t\t}\n\n\t\tfunction parseV3f(dataView, offset) {\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\t\t}\n\n\t\tfunction parseValue(dataView, buffer, offset, type, size) {\n\t\t\tif (type === 'string' || type === 'stringvector' || type === 'iccProfile') {\n\t\t\t\treturn parseFixedLengthString(buffer, offset, size);\n\t\t\t} else if (type === 'chlist') {\n\t\t\t\treturn parseChlist(dataView, buffer, offset, size);\n\t\t\t} else if (type === 'chromaticities') {\n\t\t\t\treturn parseChromaticities(dataView, offset);\n\t\t\t} else if (type === 'compression') {\n\t\t\t\treturn parseCompression(dataView, offset);\n\t\t\t} else if (type === 'box2i') {\n\t\t\t\treturn parseBox2i(dataView, offset);\n\t\t\t} else if (type === 'lineOrder') {\n\t\t\t\treturn parseLineOrder(dataView, offset);\n\t\t\t} else if (type === 'float') {\n\t\t\t\treturn parseFloat32(dataView, offset);\n\t\t\t} else if (type === 'v2f') {\n\t\t\t\treturn parseV2f(dataView, offset);\n\t\t\t} else if (type === 'v3f') {\n\t\t\t\treturn parseV3f(dataView, offset);\n\t\t\t} else if (type === 'int') {\n\t\t\t\treturn parseInt32(dataView, offset);\n\t\t\t} else if (type === 'rational') {\n\t\t\t\treturn parseRational(dataView, offset);\n\t\t\t} else if (type === 'timecode') {\n\t\t\t\treturn parseTimecode(dataView, offset);\n\t\t\t} else if (type === 'preview') {\n\t\t\t\toffset.value += size;\n\t\t\t\treturn 'skipped';\n\t\t\t} else {\n\t\t\t\toffset.value += size;\n\t\t\t\treturn undefined;\n\t\t\t}\n\t\t}\n\n\t\tfunction parseHeader(dataView, buffer, offset) {\n\t\t\tconst EXRHeader = {};\n\n\t\t\tif (dataView.getUint32(0, true) != 20000630) { // magic\n\t\t\t\tthrow new Error('EXRLoader: provided file doesn\\'t appear to be in OpenEXR format.');\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\t\t\t\tconst attributeName = parseNullTerminatedString(buffer, offset);\n\n\t\t\t\tif (attributeName == 0) {\n\t\t\t\t\tkeepReading = false;\n\t\t\t\t} else {\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\t\t\t\t\t\tconsole.warn(`EXRLoader.parse: skipped unknown header attribute type '${attributeType}'.`);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tEXRHeader[attributeName] = attributeValue;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ((spec & ~0x04) != 0) { // unsupported tiled, deep-image, multi-part\n\t\t\t\tconsole.error('EXRHeader:', EXRHeader);\n\t\t\t\tthrow new Error('EXRLoader: provided file is currently unsupported.');\n\t\t\t}\n\n\t\t\treturn EXRHeader;\n\t\t}\n\n\t\tfunction setupDecoder(EXRHeader, dataView, uInt8Array, offset, outputType) {\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\tchannels: EXRHeader.channels.length,\n\t\t\t\tbytesPerLine: null,\n\t\t\t\tlines: null,\n\t\t\t\tinputSize: null,\n\t\t\t\ttype: EXRHeader.channels[0].pixelType,\n\t\t\t\tuncompress: null,\n\t\t\t\tgetter: null,\n\t\t\t\tformat: null,\n\t\t\t\tencoding: TEXEL_ENCODING_TYPE.LINEAR\n\t\t\t};\n\n\t\t\tswitch (EXRHeader.compression) {\n\t\t\t\tcase 'NO_COMPRESSION':\n\t\t\t\t\tEXRDecoder.lines = 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.lines = 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.lines = 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.lines = 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.lines = 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.lines = 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.lines = 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.lines = 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\t\t\t}\n\n\t\t\tEXRDecoder.scanlineBlockSize = EXRDecoder.lines;\n\n\t\t\tif (EXRDecoder.type == 1) {\n\t\t\t\t// half\n\t\t\t\tswitch (outputType) {\n\t\t\t\t\tcase PIXEL_TYPE.FLOAT:\n\t\t\t\t\t\tEXRDecoder.getter = parseFloat16;\n\t\t\t\t\t\tEXRDecoder.inputSize = INT16_SIZE;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase PIXEL_TYPE.HALF_FLOAT:\n\t\t\t\t\t\tEXRDecoder.getter = parseUint16;\n\t\t\t\t\t\tEXRDecoder.inputSize = INT16_SIZE;\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t} else if (EXRDecoder.type == 2) {\n\t\t\t\t// float\n\t\t\t\tswitch (outputType) {\n\t\t\t\t\tcase PIXEL_TYPE.FLOAT:\n\t\t\t\t\t\tEXRDecoder.getter = parseFloat32;\n\t\t\t\t\t\tEXRDecoder.inputSize = FLOAT32_SIZE;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase PIXEL_TYPE.HALF_FLOAT:\n\t\t\t\t\t\tEXRDecoder.getter = decodeFloat32;\n\t\t\t\t\t\tEXRDecoder.inputSize = FLOAT32_SIZE;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tthrow new Error('EXRLoader.parse: unsupported pixelType ' + EXRDecoder.type + ' for ' + EXRHeader.compression + '.');\n\t\t\t}\n\n\t\t\tEXRDecoder.blockCount = (EXRHeader.dataWindow.yMax + 1) / EXRDecoder.scanlineBlockSize;\n\n\t\t\tfor (let i = 0; i < EXRDecoder.blockCount; i++) { parseInt64(dataView, offset) } // scanlineOffset\n\n\t\t\t// we should be passed the scanline offset table, ready to start reading pixel data.\n\n\t\t\t// RGB images will be converted to RGBA format, preventing software emulation in select devices.\n\t\t\tEXRDecoder.outputChannels = ((EXRDecoder.channels == 3) ? 4 : EXRDecoder.channels);\n\t\t\tconst size = EXRDecoder.width * EXRDecoder.height * EXRDecoder.outputChannels;\n\n\t\t\tswitch (outputType) {\n\t\t\t\tcase PIXEL_TYPE.FLOAT:\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 (EXRDecoder.channels < EXRDecoder.outputChannels) { EXRDecoder.byteArray.fill(1, 0, size) }\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase PIXEL_TYPE.HALF_FLOAT:\n\t\t\t\t\tEXRDecoder.byteArray = new Uint16Array(size);\n\n\t\t\t\t\tif (EXRDecoder.channels < EXRDecoder.outputChannels) { EXRDecoder.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('EXRLoader: unsupported type: ', outputType);\n\t\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tEXRDecoder.bytesPerLine = EXRDecoder.width * EXRDecoder.inputSize * EXRDecoder.channels;\n\n\t\t\tif (EXRDecoder.outputChannels == 4) {\n\t\t\t\tEXRDecoder.format = PIXEL_FORMAT.RGBA;\n\t\t\t\tEXRDecoder.colorSpace = TEXEL_ENCODING_TYPE.LINEAR;\n\t\t\t} else {\n\t\t\t\tEXRDecoder.format = PIXEL_FORMAT.RED;\n\t\t\t\tEXRDecoder.colorSpace = TEXEL_ENCODING_TYPE.LINEAR;\n\t\t\t}\n\n\t\t\treturn EXRDecoder;\n\t\t}\n\n\t\t// start parsing file [START]\n\n\t\tconst bufferDataView = new DataView(buffer);\n\t\tconst uInt8Array = new Uint8Array(buffer);\n\t\tconst offset = { value: 0 };\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\tconst tmpOffset = { value: 0 };\n\t\tconst channelOffsets = { R: 0, G: 1, B: 2, A: 3, Y: 0 };\n\n\t\tfor (let scanlineBlockIdx = 0; scanlineBlockIdx < EXRDecoder.height / EXRDecoder.scanlineBlockSize; scanlineBlockIdx++) {\n\t\t\tconst line = parseUint32(bufferDataView, offset); // line_no\n\t\t\tEXRDecoder.size = parseUint32(bufferDataView, offset); // data_len\n\t\t\tEXRDecoder.lines = ((line + EXRDecoder.scanlineBlockSize > EXRDecoder.height) ? (EXRDecoder.height - line) : EXRDecoder.scanlineBlockSize);\n\n\t\t\tconst isCompressed = EXRDecoder.size < EXRDecoder.lines * EXRDecoder.bytesPerLine;\n\t\t\tconst viewer = isCompressed ? EXRDecoder.uncompress(EXRDecoder) : uncompressRAW(EXRDecoder);\n\n\t\t\toffset.value += EXRDecoder.size;\n\n\t\t\tfor (let line_y = 0; line_y < EXRDecoder.scanlineBlockSize; line_y++) {\n\t\t\t\tconst true_y = line_y + scanlineBlockIdx * EXRDecoder.scanlineBlockSize;\n\t\t\t\tif (true_y >= EXRDecoder.height) break;\n\n\t\t\t\tfor (let channelID = 0; channelID < EXRDecoder.channels; channelID++) {\n\t\t\t\t\tconst cOff = channelOffsets[EXRHeader.channels[channelID].name];\n\n\t\t\t\t\tfor (let x = 0; x < EXRDecoder.width; x++) {\n\t\t\t\t\t\ttmpOffset.value = (line_y * (EXRDecoder.channels * EXRDecoder.width) + channelID * EXRDecoder.width + x) * EXRDecoder.inputSize;\n\t\t\t\t\t\tconst outIndex = (EXRDecoder.height - 1 - true_y) * (EXRDecoder.width * EXRDecoder.outputChannels) + x * EXRDecoder.outputChannels + cOff;\n\t\t\t\t\t\tEXRDecoder.byteArray[outIndex] = EXRDecoder.getter(viewer, tmpOffset);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn {\n\t\t\theader: EXRHeader,\n\n\t\t\twidth: EXRDecoder.width,\n\t\t\theight: EXRDecoder.height,\n\t\t\tdata: EXRDecoder.byteArray,\n\n\t\t\ttype: this.type,\n\t\t\tformat: EXRDecoder.format,\n\t\t\tgenerateMipmaps: false,\n\t\t\tflipY: false,\n\t\t\tminFilter: TEXTURE_FILTER.LINEAR,\n\t\t\tmagFilter: TEXTURE_FILTER.LINEAR,\n\t\t\tencoding: EXRDecoder.colorSpace,\n\n\t\t\tcolorSpace: EXRDecoder.colorSpace // deprecated\n\t\t};\n\t}\n\n}\n\nclass EXRTexture2DLoader extends EXRLoader {\n\n\tload(url, onLoad, onProgress, onError) {\n\t\tconst texture = new Texture2D();\n\n\t\tsuper.load(url, textureData => {\n\t\t\tconst {\n\t\t\t\theader,\n\t\t\t\tdata, width, height,\n\t\t\t\ttype, format, generateMipmaps, flipY, magFilter, minFilter, encoding\n\t\t\t} = textureData;\n\n\t\t\ttexture.image = { data, width, height };\n\n\t\t\ttexture.type = type;\n\t\t\ttexture.format = format;\n\t\t\ttexture.generateMipmaps = generateMipmaps;\n\t\t\ttexture.flipY = flipY;\n\t\t\ttexture.magFilter = magFilter;\n\t\t\ttexture.minFilter = minFilter;\n\t\t\ttexture.encoding = encoding;\n\n\t\t\ttexture.userData.exrInfo = { header };\n\n\t\t\ttexture.version++;\n\n\t\t\tonLoad && onLoad(texture);\n\t\t}, onProgress, onError);\n\n\t\treturn texture;\n\t}\n\n}\n\nexport { EXRLoader, EXRTexture2DLoader };\n"
  },
  {
    "path": "examples/jsm/loaders/EnvLoader.js",
    "content": "import { Loader, FileLoader, TextureCube, ImageLoader, PIXEL_TYPE, PIXEL_FORMAT } from 't3d';\nimport { ImageBitmapLoader } from './ImageBitmapLoader.js';\nimport { RGBDDecoder } from '../textures/RGBDDecoder.js';\n\nclass EnvLoader extends Loader {\n\n\tconstructor(manager) {\n\t\tsuper(manager);\n\n\t\tthis._fileLoader = new FileLoader(manager);\n\n\t\tconst userAgent = navigator.userAgent;\n\n\t\tconst isSafari = /^((?!chrome|android).)*safari/i.test(userAgent) === true;\n\t\tconst safariMatch = userAgent.match(/Version\\/(\\d+)/);\n\t\tconst safariVersion = isSafari && safariMatch ? parseInt(safariMatch[1], 10) : -1;\n\n\t\tconst isFirefox = userAgent.indexOf('Firefox') > -1;\n\t\tconst firefoxVersion = isFirefox ? userAgent.match(/Firefox\\/([0-9]+)\\./)[1] : -1;\n\n\t\tif (typeof createImageBitmap === 'undefined' || (isSafari && safariVersion < 17) || (isFirefox && firefoxVersion < 98)) {\n\t\t\tthis._imageLoader = new ImageLoader(manager);\n\t\t} else {\n\t\t\tthis._imageLoader = new ImageBitmapLoader(manager);\n\t\t}\n\t}\n\n\tload(url, onLoad, onProgress, onError) {\n\t\tthis._fileLoader\n\t\t\t.setResponseType('arraybuffer')\n\t\t\t.setRequestHeader(this.requestHeader)\n\t\t\t.setPath(this.path)\n\t\t\t.setWithCredentials(this.withCredentials)\n\t\t\t.load(url, buffer => {\n\t\t\t\tthis.parse(buffer).then(envData => {\n\t\t\t\t\tonLoad && onLoad(envData);\n\t\t\t\t}).catch(err => {\n\t\t\t\t\tonError && onError(err);\n\t\t\t\t});\n\t\t\t}, onProgress, onError);\n\t}\n\n\tparse(buffer) {\n\t\tconst headerByteLength = 8;\n\n\t\tconst bufferView = new DataView(buffer);\n\t\tconst version = bufferView.getUint32(0);\n\t\tconst jsonByteLength = bufferView.getUint32(4);\n\n\t\tconst jsonString = new TextDecoder().decode(buffer.slice(headerByteLength, headerByteLength + jsonByteLength));\n\t\tconst jsonData = JSON.parse(jsonString);\n\n\t\tconst { imageSize, mipmaps } = jsonData;\n\n\t\t// Double checks the mipmaps length\n\t\tlet mipmapsCount = Math.log(imageSize) * Math.LOG2E;\n\t\tmipmapsCount = Math.round(mipmapsCount) + 1;\n\t\tif (mipmaps.length !== 6 * mipmapsCount) {\n\t\t\tthrow new Error(`EnvLoader: Unsupported mipmaps number \"${mipmaps.length}\".`);\n\t\t}\n\n\t\tconst promises = mipmaps.map(mipmap => {\n\t\t\tconst mipmapBuffer = new Uint8Array(\n\t\t\t\tbuffer,\n\t\t\t\theaderByteLength + jsonByteLength + mipmap.position,\n\t\t\t\tmipmap.length\n\t\t\t);\n\n\t\t\tconst blob = new Blob([mipmapBuffer], { type: 'image/png' });\n\t\t\tconst url = URL.createObjectURL(blob);\n\t\t\treturn this._imageLoader.loadAsync(url).then(image => {\n\t\t\t\tURL.revokeObjectURL(url);\n\t\t\t\treturn image;\n\t\t\t});\n\t\t});\n\n\t\treturn Promise.all(promises).then(images => ({ version, json: jsonData, images }));\n\t}\n\n}\n\nclass EnvTextureCubeLoader extends EnvLoader {\n\n\tconstructor(manager) {\n\t\tsuper(manager);\n\n\t\tthis._rgbdDecoder = new RGBDDecoder();\n\t\tthis._renderer = null;\n\t}\n\n\tsetRenderer(renderer) {\n\t\tthis._renderer = renderer;\n\t\treturn this;\n\t}\n\n\tload(url, onLoad, onProgress, onError) {\n\t\tconst rgbdDecoder = this._rgbdDecoder;\n\t\tconst renderer = this._renderer;\n\n\t\tif (!renderer) {\n\t\t\tthrow new Error('EnvTextureCubeLoader: Renderer is not set.');\n\t\t}\n\n\t\tconst texture = new TextureCube();\n\n\t\tsuper.load(url, ({ version, json, images }) => {\n\t\t\tconst tempCubeTexture = new TextureCube();\n\n\t\t\ttempCubeTexture.type = PIXEL_TYPE.UNSIGNED_BYTE;\n\t\t\ttempCubeTexture.format = PIXEL_FORMAT.RGBA;\n\t\t\ttempCubeTexture.generateMipmaps = false;\n\n\t\t\tconst mipmapCount = images.length / 6;\n\t\t\tfor (let level = 0; level < mipmapCount; level++) {\n\t\t\t\tconst subImages = images.slice(level * 6, level * 6 + 6);\n\t\t\t\tif (level === 0) {\n\t\t\t\t\ttempCubeTexture.images = subImages;\n\t\t\t\t}\n\t\t\t\ttempCubeTexture.mipmaps.push(subImages);\n\t\t\t}\n\t\t\ttempCubeTexture.version++;\n\n\t\t\trgbdDecoder.decode(renderer, tempCubeTexture, texture);\n\n\t\t\ttempCubeTexture.dispose();\n\n\t\t\t// Attach the environment information to the texture\n\t\t\ttexture.userData.envInfo = { version, json };\n\n\t\t\tonLoad && onLoad(texture);\n\t\t}, onProgress, onError);\n\n\t\treturn texture;\n\t}\n\n}\n\nexport { EnvLoader, EnvTextureCubeLoader };"
  },
  {
    "path": "examples/jsm/loaders/ImageBitmapLoader.js",
    "content": "import { Loader } from 't3d';\n\nclass ImageBitmapLoader extends Loader {\n\n\tconstructor(manager) {\n\t\tsuper(manager);\n\n\t\tif (typeof createImageBitmap === 'undefined') {\n\t\t\tconsole.warn('ImageBitmapLoader: createImageBitmap() not supported.');\n\t\t}\n\n\t\tif (typeof fetch === 'undefined') {\n\t\t\tconsole.warn('ImageBitmapLoader: fetch() not supported.');\n\t\t}\n\n\t\tthis.options = { premultiplyAlpha: 'none' };\n\t}\n\n\tsetOptions(options) {\n\t\tthis.options = options;\n\t\treturn this;\n\t}\n\n\tload(url, onLoad, _onProgress, onError) {\n\t\tif (url === undefined) url = '';\n\t\tif (this.path !== undefined) url = this.path + url;\n\n\t\turl = this.manager.resolveURL(url);\n\n\t\tconst scope = this;\n\n\t\tconst fetchOptions = {};\n\t\tfetchOptions.credentials = (this.crossOrigin === 'anonymous') ? 'same-origin' : 'include';\n\t\tfetchOptions.headers = this.requestHeader;\n\n\t\tfetch(url, fetchOptions).then(function(res) {\n\t\t\treturn res.blob();\n\t\t}).then(function(blob) {\n\t\t\treturn createImageBitmap(blob, Object.assign(scope.options, { colorSpaceConversion: 'none' }));\n\t\t}).then(function(imageBitmap) {\n\t\t\tif (onLoad) onLoad(imageBitmap);\n\n\t\t\tscope.manager.itemEnd(url);\n\t\t}).catch(function(e) {\n\t\t\tif (onError) onError(e);\n\n\t\t\tscope.manager.itemError(url);\n\t\t\tscope.manager.itemEnd(url);\n\t\t});\n\n\t\tscope.manager.itemStart(url);\n\t}\n\n}\n\nexport { ImageBitmapLoader };"
  },
  {
    "path": "examples/jsm/loaders/KTX2Loader.js",
    "content": "import {\n\tLoader,\n\tFileLoader,\n\tTEXTURE_FILTER,\n\tPIXEL_FORMAT,\n\tPIXEL_TYPE,\n\tTEXEL_ENCODING_TYPE,\n\tTexture2D\n} from 't3d';\nimport { WorkerPool } from '../WorkerPool.js';\n\nconst _taskCache = new WeakMap();\n\nlet _activeLoaders = 0;\n\nlet _ktxParser;\nlet _zstdDecoder;\n\nlet _zstd;\n\nclass KTX2Loader extends Loader {\n\n\tconstructor(manager) {\n\t\tsuper(manager);\n\n\t\tthis.transcoderPath = '';\n\t\tthis.transcoderBinary = null;\n\t\tthis.transcoderPending = null;\n\n\t\tthis.workerPool = new WorkerPool();\n\t\tthis.workerSourceURL = '';\n\t\tthis.workerConfig = null;\n\t}\n\n\tstatic setKTXParser(ktxParser) {\n\t\t_ktxParser = ktxParser;\n\t\tsetFORMAT_MAP();\n\t\tsetTYPE_MAP();\n\t\treturn this;\n\t}\n\n\tstatic setZSTDDecoder(zstdDecoder) {\n\t\t_zstdDecoder = zstdDecoder;\n\t\treturn this;\n\t}\n\n\tsetTranscoderPath(path) {\n\t\tthis.transcoderPath = path;\n\t\treturn this;\n\t}\n\n\tsetWorkerLimit(num) {\n\t\tthis.workerPool.setWorkerLimit(num);\n\t\treturn this;\n\t}\n\n\tdetectSupport(renderer) {\n\t\tconst capabilities = renderer.capabilities;\n\n\t\tthis.workerConfig = {\n\t\t\tastcSupported: capabilities.getExtension('WEBGL_compressed_texture_astc') ? true : false,\n\t\t\tastcHDRSupported: capabilities.getExtension('WEBGL_compressed_texture_astc') ? true : false,\n\t\t\tetc1Supported: capabilities.getExtension('WEBGL_compressed_texture_etc1') ? true : false,\n\t\t\tetc2Supported: capabilities.getExtension('WEBGL_compressed_texture_etc') ? true : false,\n\t\t\tdxtSupported: capabilities.getExtension('WEBGL_compressed_texture_s3tc') ? true : false,\n\t\t\tbptcSupported: capabilities.getExtension('EXT_texture_compression_bptc') ? true : false,\n\t\t\tpvrtcSupported: capabilities.getExtension('WEBGL_compressed_texture_pvrtc') ? true : false\n\t\t};\n\n\t\treturn this;\n\t}\n\n\tinit() {\n\t\tif (!this.transcoderPending) {\n\t\t\t// Load transcoder wrapper.\n\t\t\tconst jsLoader = new FileLoader(this.manager);\n\t\t\tjsLoader.setPath(this.transcoderPath);\n\t\t\tjsLoader.setWithCredentials(this.withCredentials);\n\t\t\tconst jsContent = jsLoader.loadAsync('basis_transcoder.js');\n\n\t\t\t// Load transcoder WASM binary.\n\t\t\tconst binaryLoader = new FileLoader(this.manager);\n\t\t\tbinaryLoader.setPath(this.transcoderPath);\n\t\t\tbinaryLoader.setResponseType('arraybuffer');\n\t\t\tbinaryLoader.setWithCredentials(this.withCredentials);\n\t\t\tconst binaryContent = binaryLoader.loadAsync('basis_transcoder.wasm');\n\n\t\t\tthis.transcoderPending = Promise.all([jsContent, binaryContent])\n\t\t\t\t.then(([jsContent, binaryContent]) => {\n\t\t\t\t\tconst fn = KTX2Loader.BasisWorker.toString();\n\n\t\t\t\t\tconst body = [\n\t\t\t\t\t\t'/* constants */',\n\t\t\t\t\t\t'let _EngineFormat = ' + JSON.stringify(KTX2Loader.EngineFormat),\n\t\t\t\t\t\t'let _EngineType = ' + JSON.stringify(KTX2Loader.EngineType),\n\t\t\t\t\t\t'let _TranscoderFormat = ' + JSON.stringify(KTX2Loader.TranscoderFormat),\n\t\t\t\t\t\t'let _BasisFormat = ' + JSON.stringify(KTX2Loader.BasisFormat),\n\t\t\t\t\t\t'/* basis_transcoder.js */',\n\t\t\t\t\t\tjsContent,\n\t\t\t\t\t\t'/* worker */',\n\t\t\t\t\t\tfn.substring(fn.indexOf('{') + 1, fn.lastIndexOf('}'))\n\t\t\t\t\t].join('\\n');\n\n\t\t\t\t\tthis.workerSourceURL = URL.createObjectURL(new Blob([body]));\n\t\t\t\t\tthis.transcoderBinary = binaryContent;\n\n\t\t\t\t\tthis.workerPool.setWorkerCreator(() => {\n\t\t\t\t\t\tconst worker = new Worker(this.workerSourceURL);\n\t\t\t\t\t\tconst transcoderBinary = this.transcoderBinary.slice(0);\n\n\t\t\t\t\t\tworker.postMessage({ type: 'init', config: this.workerConfig, transcoderBinary }, [transcoderBinary]);\n\n\t\t\t\t\t\treturn worker;\n\t\t\t\t\t});\n\t\t\t\t});\n\n\t\t\tif (_activeLoaders > 0) {\n\t\t\t\t// Each instance loads a transcoder and allocates workers, increasing network and memory cost.\n\t\t\t\tconsole.warn(\n\t\t\t\t\t'KTX2Loader: Multiple active KTX2 loaders may cause performance issues.'\n\t\t\t\t\t+ ' Use a single KTX2Loader instance, or call .dispose() on old instances.'\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t_activeLoaders++;\n\t\t}\n\n\t\treturn this.transcoderPending;\n\t}\n\n\tload(url, onLoad, onProgress, onError) {\n\t\tif (this.workerConfig === null) {\n\t\t\tthrow new Error('KTX2Loader: Missing initialization with `.detectSupport(renderer)`.');\n\t\t}\n\n\t\tconst loader = new FileLoader(this.manager);\n\n\t\tloader.setResponseType('arraybuffer');\n\t\tloader.setWithCredentials(this.withCredentials);\n\n\t\tloader.load(url, buffer => {\n\t\t\t// Check for an existing task using this buffer. A transferred buffer cannot be transferred\n\t\t\t// again from this thread.\n\t\t\tif (_taskCache.has(buffer)) {\n\t\t\t\tconst cachedTask = _taskCache.get(buffer);\n\t\t\t\treturn cachedTask.promise.then(onLoad).catch(onError);\n\t\t\t}\n\n\t\t\tthis._createTextureData(buffer)\n\t\t\t\t.then(textureData => onLoad ? onLoad(textureData) : null)\n\t\t\t\t.catch(onError);\n\t\t}, onProgress, onError);\n\t}\n\n\t/**\n\t * @param {ArrayBuffer} buffer\n\t * @param {object?} config\n\t * @returns {Promise<object>}\n\t */\n\tasync _createTextureData(buffer, config = {}) {\n\t\tconst { read, VK_FORMAT_UNDEFINED, KHR_DF_FLAG_ALPHA_PREMULTIPLIED } = _ktxParser;\n\n\t\tconst container = read(new Uint8Array(buffer));\n\t\tconst isBasisHDR = FORMAT_MAP[container.vkFormat]\n\t\t\t&& container.dataFormatDescriptor[0].colorModel === 0xA7;\n\n\n\t\tconst needsTranscoder = container.vkFormat === VK_FORMAT_UNDEFINED\n\t\t\t|| isBasisHDR && !this.workerConfig.astcHDRSupported;\n\t\tif (!needsTranscoder) {\n\t\t\treturn createTextureData(container);\n\t\t}\n\n\t\tconst taskConfig = config;\n\t\tconst texturePending = this.init().then(() => {\n\t\t\treturn this.workerPool.postMessage({ type: 'transcode', buffer, taskConfig: taskConfig }, [buffer]);\n\t\t}).then(e => {\n\t\t\tconst { type: messageType, error, data: { faces, width, height, format, type, dfdFlags } } = e.data;\n\n\t\t\tif (messageType === 'error') return Promise.reject(error);\n\n\t\t\tconst mipmaps = faces[0].mipmaps;\n\n\t\t\tconst textureData = {};\n\n\t\t\ttextureData.faces = faces;\n\t\t\ttextureData.layerCount = container.layerCount;\n\n\t\t\ttextureData.image = container.layerCount > 1\n\t\t\t\t? { data: null, isCompressed: true, width: width, height: height, depth: container.layerCount }\n\t\t\t\t: { data: null, isCompressed: true, width: width, height: height };\n\t\t\ttextureData.mipmaps = mipmaps;\n\n\t\t\ttextureData.format = format;\n\t\t\ttextureData.type = type;\n\t\t\ttextureData.minFilter = mipmaps.length === 1 ? TEXTURE_FILTER.LINEAR : TEXTURE_FILTER.LINEAR_MIPMAP_LINEAR;\n\t\t\ttextureData.magFilter = TEXTURE_FILTER.LINEAR;\n\t\t\ttextureData.generateMipmaps = false;\n\t\t\ttextureData.encoding = parseTextureEncoding(container);\n\t\t\ttextureData.premultiplyAlpha = !!(dfdFlags & KHR_DF_FLAG_ALPHA_PREMULTIPLIED);\n\n\t\t\treturn textureData;\n\t\t});\n\n\t\t// Cache the task result.\n\t\t_taskCache.set(buffer, { promise: texturePending });\n\n\t\treturn texturePending;\n\t}\n\n\tdispose() {\n\t\tthis.workerPool.dispose();\n\t\tif (this.workerSourceURL) URL.revokeObjectURL(this.workerSourceURL);\n\n\t\t_activeLoaders--;\n\n\t\treturn this;\n\t}\n\n}\n\n/* CONSTANTS */\n\nKTX2Loader.BasisFormat = {\n\tETC1S: 0,\n\tUASTC_HDR: 2,\n\tUASTC_4x4: 1\n};\n\nKTX2Loader.TranscoderFormat = {\n\tETC1: 0,\n\tETC2: 1,\n\tBC1: 2,\n\tBC3: 3,\n\tBC4: 4,\n\tBC5: 5,\n\tBC7_M6_OPAQUE_ONLY: 6,\n\tBC7_M5: 7,\n\tPVRTC1_4_RGB: 8,\n\tPVRTC1_4_RGBA: 9,\n\tASTC_4x4: 10,\n\tATC_RGB: 11,\n\tATC_RGBA_INTERPOLATED_ALPHA: 12,\n\tRGBA32: 13,\n\tRGB565: 14,\n\tBGR565: 15,\n\tRGBA4444: 16,\n\tBC6H: 22,\n\tRGB_HALF: 24,\n\tRGBA_HALF: 25\n};\n\nKTX2Loader.EngineFormat = {\n\tRGBAFormat: PIXEL_FORMAT.RGBA,\n\tRGBA_ASTC_4x4_Format: PIXEL_FORMAT.RGBA_ASTC_4x4,\n\tRGBA_BPTC_Format: PIXEL_FORMAT.RGBA_BPTC,\n\t// RGBA_ETC2_EAC_Format: RGBA_ETC2_EAC_Format, TODO\n\tRGBA_PVRTC_4BPPV1_Format: PIXEL_FORMAT.RGBA_PVRTC_4BPPV1,\n\tRGBA_S3TC_DXT5_Format: PIXEL_FORMAT.RGBA_S3TC_DXT5,\n\tRGB_ETC1_Format: PIXEL_FORMAT.RGB_ETC1,\n\t// RGB_ETC2_Format: RGB_ETC2_Format, TODO\n\tRGB_PVRTC_4BPPV1_Format: PIXEL_FORMAT.RGB_PVRTC_4BPPV1,\n\tRGB_S3TC_DXT1_Format: PIXEL_FORMAT.RGB_S3TC_DXT1,\n\tRGB_BPTC_UNSIGNED_Format: PIXEL_FORMAT.RGB_BPTC_UNSIGNED_FORMAT\n};\n\nKTX2Loader.EngineType = {\n\tFloatType: 1507,\n\tHalfFloatType: 1508,\n\tUnsignedByteType: 1500\n};\n\n/* WEB WORKER */\n\nKTX2Loader.BasisWorker = function() {\n\tlet config;\n\tlet transcoderPending;\n\tlet BasisModule;\n\n\tconst EngineFormat = _EngineFormat; // eslint-disable-line no-undef\n\tconst TranscoderFormat = _TranscoderFormat; // eslint-disable-line no-undef\n\tconst BasisFormat = _BasisFormat; // eslint-disable-line no-undef\n\tconst EngineType = _EngineType; // eslint-disable-line no-undef\n\n\tself.addEventListener('message', function(e) {\n\t\tconst message = e.data;\n\n\t\tswitch (message.type) {\n\t\t\tcase 'init':\n\t\t\t\tconfig = message.config;\n\t\t\t\tinit(message.transcoderBinary);\n\t\t\t\tbreak;\n\n\t\t\tcase 'transcode':\n\t\t\t\ttranscoderPending.then(() => {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst { faces, buffers, width, height, hasAlpha, format, type, dfdFlags } = transcode(message.buffer);\n\n\t\t\t\t\t\tself.postMessage({ type: 'transcode', id: message.id, data: { faces, width, height, hasAlpha, format, type, dfdFlags } }, buffers);\n\t\t\t\t\t} catch (error) {\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\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\tbreak;\n\t\t}\n\t});\n\n\tfunction init(wasmBinary) {\n\t\ttranscoderPending = new Promise(resolve => {\n\t\t\tBasisModule = { wasmBinary, onRuntimeInitialized: resolve };\n\t\t\tBASIS(BasisModule); // eslint-disable-line no-undef\n\t\t}).then(() => {\n\t\t\tBasisModule.initializeBasis();\n\n\t\t\tif (BasisModule.KTX2File === undefined) {\n\t\t\t\tconsole.warn('KTX2Loader: Please update Basis Universal transcoder.');\n\t\t\t}\n\t\t});\n\t}\n\n\tfunction transcode(buffer) {\n\t\tconst ktx2File = new BasisModule.KTX2File(new Uint8Array(buffer));\n\n\t\tfunction cleanup() {\n\t\t\tktx2File.close();\n\t\t\tktx2File.delete();\n\t\t}\n\n\t\tif (!ktx2File.isValid()) {\n\t\t\tcleanup();\n\t\t\tthrow new Error('KTX2Loader: Invalid or unsupported .ktx2 file');\n\t\t}\n\n\t\tlet basisFormat;\n\n\t\tif (ktx2File.isUASTC()) {\n\t\t\tbasisFormat = BasisFormat.UASTC_4x4;\n\t\t} else if (ktx2File.isETC1S()) {\n\t\t\tbasisFormat = BasisFormat.ETC1S;\n\t\t} else if (ktx2File.isHDR()) {\n\t\t\tbasisFormat = BasisFormat.UASTC_HDR;\n\t\t} else {\n\t\t\tthrow new Error('T3D.KTX2Loader: Unknown Basis encoding');\n\t\t}\n\t\tconst width = ktx2File.getWidth();\n\t\tconst height = ktx2File.getHeight();\n\t\tconst layerCount = ktx2File.getLayers() || 1;\n\t\tconst levelCount = ktx2File.getLevels();\n\t\tconst faceCount = ktx2File.getFaces();\n\t\tconst hasAlpha = ktx2File.getHasAlpha();\n\t\tconst dfdFlags = ktx2File.getDFDFlags();\n\n\t\tconst { transcoderFormat, engineFormat, engineType } = getTranscoderFormat(basisFormat, width, height, hasAlpha);\n\n\t\tif (!width || !height || !levelCount) {\n\t\t\tcleanup();\n\t\t\tthrow new Error('KTX2Loader: Invalid texture');\n\t\t}\n\n\t\tif (!ktx2File.startTranscoding()) {\n\t\t\tcleanup();\n\t\t\tthrow new Error('KTX2Loader: .startTranscoding failed');\n\t\t}\n\n\t\tconst faces = [];\n\t\tconst buffers = [];\n\n\t\tfor (let face = 0; face < faceCount; face++) {\n\t\t\tconst mipmaps = [];\n\t\t\tfor (let mip = 0; mip < levelCount; mip++) {\n\t\t\t\tconst layerMips = [];\n\t\t\t\tlet mipWidth, mipHeight;\n\t\t\t\tfor (let layer = 0; layer < layerCount; layer++) {\n\t\t\t\t\tconst levelInfo = ktx2File.getImageLevelInfo(mip, layer, face);\n\t\t\t\t\tif (face === 0 && mip === 0 && layer === 0 && (levelInfo.origWidth % 4 !== 0 || levelInfo.origHeight % 4 !== 0)) {\n\t\t\t\t\t\tconsole.warn('KTX2Loader: ETC1S and UASTC textures should use multiple-of-four dimensions.');\n\t\t\t\t\t}\n\n\t\t\t\t\tif (levelCount > 1) {\n\t\t\t\t\t\tmipWidth = levelInfo.origWidth;\n\t\t\t\t\t\tmipHeight = levelInfo.origHeight;\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// refer to: github.com/mrdoob/three.js/issues/25908\n\t\t\t\t\t\tmipWidth = levelInfo.width;\n\t\t\t\t\t\tmipHeight = levelInfo.height;\n\t\t\t\t\t}\n\n\t\t\t\t\tlet dst = new Uint8Array(ktx2File.getImageTranscodedSizeInBytes(mip, layer, 0, transcoderFormat));\n\t\t\t\t\tconst status = ktx2File.transcodeImage(dst, mip, layer, face, transcoderFormat, 0, -1, -1);\n\n\t\t\t\t\tif (engineType === EngineType.HalfFloatType) {\n\t\t\t\t\t\tdst = new Uint16Array(dst.buffer, dst.byteOffset, dst.byteLength / Uint16Array.BYTES_PER_ELEMENT);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (!status) {\n\t\t\t\t\t\tcleanup();\n\t\t\t\t\t\tthrow new Error('KTX2Loader: .transcodeImage failed.');\n\t\t\t\t\t}\n\n\t\t\t\t\tlayerMips.push(dst);\n\t\t\t\t}\n\n\t\t\t\tconst mipData = concat(layerMips);\n\n\t\t\t\tmipmaps.push({ data: mipData, width: mipWidth, height: mipHeight });\n\t\t\t\tbuffers.push(mipData.buffer);\n\t\t\t}\n\n\t\t\tfaces.push({ mipmaps, width, height, format: engineFormat, type: engineType });\n\t\t}\n\n\t\tcleanup();\n\n\t\treturn { faces, buffers, width, height, hasAlpha, dfdFlags, format: engineFormat, type: engineType };\n\t}\n\n\t//\n\n\t// Optimal choice of a transcoder target format depends on the Basis format (ETC1S or UASTC),\n\t// device capabilities, and texture dimensions. The list below ranks the formats separately\n\t// for ETC1S and UASTC.\n\t//\n\t// In some cases, transcoding UASTC to RGBA32 might be preferred for higher quality (at\n\t// significant memory cost) compared to ETC1/2, BC1/3, and PVRTC. The transcoder currently\n\t// chooses RGBA32 only as a last resort and does not expose that option to the caller.\n\tconst FORMAT_OPTIONS = [\n\t\t{\n\t\t\tif: 'astcSupported',\n\t\t\tbasisFormat: [BasisFormat.UASTC_4x4],\n\t\t\ttranscoderFormat: [TranscoderFormat.ASTC_4x4, TranscoderFormat.ASTC_4x4],\n\t\t\tengineFormat: [EngineFormat.RGBA_ASTC_4x4_Format, EngineFormat.RGBA_ASTC_4x4_Format],\n\t\t\tengineType: [EngineType.UnsignedByteType],\n\t\t\tpriorityETC1S: Infinity,\n\t\t\tpriorityUASTC: 1,\n\t\t\tneedsPowerOfTwo: false\n\t\t},\n\t\t{\n\t\t\tif: 'bptcSupported',\n\t\t\tbasisFormat: [BasisFormat.ETC1S, BasisFormat.UASTC_4x4],\n\t\t\ttranscoderFormat: [TranscoderFormat.BC7_M5, TranscoderFormat.BC7_M5],\n\t\t\tengineFormat: [EngineFormat.RGBA_BPTC_Format, EngineFormat.RGBA_BPTC_Format],\n\t\t\tengineType: [EngineType.UnsignedByteType],\n\t\t\tpriorityETC1S: 3,\n\t\t\tpriorityUASTC: 2,\n\t\t\tneedsPowerOfTwo: false\n\t\t},\n\t\t{\n\t\t\tif: 'dxtSupported',\n\t\t\tbasisFormat: [BasisFormat.ETC1S, BasisFormat.UASTC_4x4],\n\t\t\ttranscoderFormat: [TranscoderFormat.BC1, TranscoderFormat.BC3],\n\t\t\tengineFormat: [EngineFormat.RGB_S3TC_DXT1_Format, EngineFormat.RGBA_S3TC_DXT5_Format],\n\t\t\tengineType: [EngineType.UnsignedByteType],\n\t\t\tpriorityETC1S: 4,\n\t\t\tpriorityUASTC: 5,\n\t\t\tneedsPowerOfTwo: false\n\t\t},\n\t\t{\n\t\t\tif: 'etc2Supported',\n\t\t\tbasisFormat: [BasisFormat.ETC1S, BasisFormat.UASTC_4x4],\n\t\t\ttranscoderFormat: [TranscoderFormat.ETC1, TranscoderFormat.ETC2],\n\t\t\tengineFormat: [EngineFormat.RGB_ETC2_Format, EngineFormat.RGBA_ETC2_EAC_Format],\n\t\t\tengineType: [EngineType.UnsignedByteType],\n\t\t\tpriorityETC1S: 1,\n\t\t\tpriorityUASTC: 3,\n\t\t\tneedsPowerOfTwo: false\n\t\t},\n\t\t{\n\t\t\tif: 'etc1Supported',\n\t\t\tbasisFormat: [BasisFormat.ETC1S, BasisFormat.UASTC_4x4],\n\t\t\ttranscoderFormat: [TranscoderFormat.ETC1],\n\t\t\tengineFormat: [EngineFormat.RGB_ETC1_Format],\n\t\t\tengineType: [EngineType.UnsignedByteType],\n\t\t\tpriorityETC1S: 2,\n\t\t\tpriorityUASTC: 4,\n\t\t\tneedsPowerOfTwo: false\n\t\t},\n\t\t{\n\t\t\tif: 'pvrtcSupported',\n\t\t\tbasisFormat: [BasisFormat.ETC1S, BasisFormat.UASTC_4x4],\n\t\t\ttranscoderFormat: [TranscoderFormat.PVRTC1_4_RGB, TranscoderFormat.PVRTC1_4_RGBA],\n\t\t\tengineFormat: [EngineFormat.RGB_PVRTC_4BPPV1_Format, EngineFormat.RGBA_PVRTC_4BPPV1_Format],\n\t\t\tengineType: [EngineType.HalfFloatType],\n\t\t\tpriorityETC1S: 5,\n\t\t\tpriorityUASTC: 6,\n\t\t\tneedsPowerOfTwo: true\n\t\t},\n\t\t{\n\t\t\tif: 'bptcSupported',\n\t\t\tbasisFormat: [BasisFormat.UASTC_HDR],\n\t\t\ttranscoderFormat: [TranscoderFormat.BC6H],\n\t\t\tengineFormat: [EngineFormat.RGB_BPTC_UNSIGNED_Format],\n\t\t\tengineType: [EngineType.HalfFloatType],\n\t\t\tpriorityHDR: 1,\n\t\t\tneedsPowerOfTwo: false\n\t\t},\n\t\t// Uncompressed fallbacks.\n\n\t\t{\n\t\t\tbasisFormat: [BasisFormat.ETC1S, BasisFormat.UASTC_4x4],\n\t\t\ttranscoderFormat: [TranscoderFormat.RGBA32, TranscoderFormat.RGBA32],\n\t\t\tengineFormat: [EngineFormat.RGBAFormat, EngineFormat.RGBAFormat],\n\t\t\tengineType: [EngineType.UnsignedByteType, EngineType.UnsignedByteType],\n\t\t\tpriorityETC1S: 100,\n\t\t\tpriorityUASTC: 100,\n\t\t\tneedsPowerOfTwo: false\n\t\t}\n\t];\n\n\tconst OPTIONS = {\n\t\t[BasisFormat.ETC1S]: FORMAT_OPTIONS\n\t\t\t.filter(opt => opt.basisFormat.includes(BasisFormat.ETC1S))\n\t\t\t.sort((a, b) => a.priorityETC1S - b.priorityETC1S),\n\n\t\t[BasisFormat.UASTC_4x4]: FORMAT_OPTIONS\n\t\t\t.filter(opt => opt.basisFormat.includes(BasisFormat.UASTC_4x4))\n\t\t\t.sort((a, b) => a.priorityUASTC - b.priorityUASTC),\n\n\t\t[BasisFormat.UASTC_HDR]: FORMAT_OPTIONS\n\t\t\t.filter(opt => opt.basisFormat.includes(BasisFormat.UASTC_HDR))\n\t\t\t.sort((a, b) => a.priorityHDR - b.priorityHDR)\n\t};\n\n\tfunction getTranscoderFormat(basisFormat, width, height, hasAlpha) {\n\t\tlet transcoderFormat;\n\t\tlet engineFormat;\n\t\tlet engineType;\n\t\tconst options = OPTIONS[basisFormat];\n\n\t\tfor (let i = 0; i < options.length; i++) {\n\t\t\tconst opt = options[i];\n\n\t\t\tif (opt.if && !config[opt.if]) continue;\n\t\t\tif (!opt.basisFormat.includes(basisFormat)) continue;\n\t\t\tif (hasAlpha && opt.transcoderFormat.length < 2) continue;\n\t\t\tif (opt.needsPowerOfTwo && !(isPowerOfTwo(width) && isPowerOfTwo(height))) continue;\n\n\t\t\t transcoderFormat = opt.transcoderFormat[hasAlpha ? 1 : 0];\n\t\t\t engineFormat = opt.engineFormat[hasAlpha ? 1 : 0];\n\t\t\t engineType = opt.engineType[0];\n\n\t\t\treturn { transcoderFormat, engineFormat, engineType };\n\t\t}\n\n\t\tconsole.warn('KTX2Loader: No suitable compressed texture format found. Decoding to RGBA32.');\n\n\t\ttranscoderFormat = TranscoderFormat.RGBA32;\n\t\tengineFormat = EngineFormat.RGBAFormat;\n\t\tengineType = EngineType.UnsignedByteType;\n\n\t\treturn { transcoderFormat, engineFormat, engineType };\n\t}\n\n\tfunction isPowerOfTwo(value) {\n\t\tif (value <= 2) return true;\n\t\treturn (value & (value - 1)) === 0 && value !== 0;\n\t}\n\n\t// Concatenates N byte arrays.\n\tfunction concat(arrays) {\n\t\tif (arrays.length === 1) return arrays[0];\n\n\t\tlet totalByteLength = 0;\n\n\t\tfor (const array of arrays) {\n\t\t\ttotalByteLength += array.byteLength;\n\t\t}\n\n\t\tconst result = new Uint8Array(totalByteLength);\n\n\t\tlet byteOffset = 0;\n\n\t\tfor (const array of arrays) {\n\t\t\tresult.set(array, byteOffset);\n\t\t\tbyteOffset += array.byteLength;\n\t\t}\n\n\t\treturn result;\n\t}\n};\n\n//\n// Parsing for non-Basis textures. These textures are may have supercompression\n// like Zstd, but they do not require transcoding.\n\nconst UNCOMPRESSED_FORMATS = new Set([PIXEL_FORMAT.RGBA, PIXEL_FORMAT.RG, PIXEL_FORMAT.Red]);\n\nlet FORMAT_MAP = {};\nfunction setFORMAT_MAP() {\n\tFORMAT_MAP = {\n\t\t[_ktxParser.VK_FORMAT_R32G32B32A32_SFLOAT]: PIXEL_FORMAT.RGBA,\n\t\t[_ktxParser.VK_FORMAT_R16G16B16A16_SFLOAT]: PIXEL_FORMAT.RGBA,\n\t\t[_ktxParser.VK_FORMAT_R8G8B8A8_UNORM]: PIXEL_FORMAT.RGBA,\n\t\t[_ktxParser.VK_FORMAT_R8G8B8A8_SRGB]: PIXEL_FORMAT.RGBA,\n\n\t\t[_ktxParser.VK_FORMAT_R32G32_SFLOAT]: PIXEL_FORMAT.RG,\n\t\t[_ktxParser.VK_FORMAT_R16G16_SFLOAT]: PIXEL_FORMAT.RG,\n\t\t[_ktxParser.VK_FORMAT_R8G8_UNORM]: PIXEL_FORMAT.RG,\n\t\t[_ktxParser.VK_FORMAT_R8G8_SRGB]: PIXEL_FORMAT.RG,\n\n\t\t[_ktxParser.VK_FORMAT_R32_SFLOAT]: PIXEL_FORMAT.Red,\n\t\t[_ktxParser.VK_FORMAT_R16_SFLOAT]: PIXEL_FORMAT.Red,\n\t\t[_ktxParser.VK_FORMAT_R8_SRGB]: PIXEL_FORMAT.Red,\n\t\t[_ktxParser.VK_FORMAT_R8_UNORM]: PIXEL_FORMAT.Red,\n\n\t\t[_ktxParser.VK_FORMAT_ASTC_4x4_SFLOAT_BLOCK_EXT]: PIXEL_FORMAT.RGB_BPTC_UNSIGNED_FORMAT\n\n\t\t// TODO: support ASTC formats\n\t};\n}\n\nlet TYPE_MAP = {};\nfunction setTYPE_MAP() {\n\tTYPE_MAP = {\n\t\t[_ktxParser.VK_FORMAT_R32G32B32A32_SFLOAT]: PIXEL_TYPE.FLOAT,\n\t\t[_ktxParser.VK_FORMAT_R16G16B16A16_SFLOAT]: PIXEL_TYPE.HALF_FLOAT,\n\t\t[_ktxParser.VK_FORMAT_R8G8B8A8_UNORM]: PIXEL_TYPE.UNSIGNED_BYTE,\n\t\t[_ktxParser.VK_FORMAT_R8G8B8A8_SRGB]: PIXEL_TYPE.UNSIGNED_BYTE,\n\n\t\t[_ktxParser.VK_FORMAT_R32G32_SFLOAT]: PIXEL_TYPE.FLOAT,\n\t\t[_ktxParser.VK_FORMAT_R16G16_SFLOAT]: PIXEL_TYPE.HALF_FLOAT,\n\t\t[_ktxParser.VK_FORMAT_R8G8_UNORM]: PIXEL_TYPE.UNSIGNED_BYTE,\n\t\t[_ktxParser.VK_FORMAT_R8G8_SRGB]: PIXEL_TYPE.UNSIGNED_BYTE,\n\n\t\t[_ktxParser.VK_FORMAT_R32_SFLOAT]: PIXEL_TYPE.FLOAT,\n\t\t[_ktxParser.VK_FORMAT_R16_SFLOAT]: PIXEL_TYPE.HALF_FLOAT,\n\t\t[_ktxParser.VK_FORMAT_R8_SRGB]: PIXEL_TYPE.UNSIGNED_BYTE,\n\t\t[_ktxParser.VK_FORMAT_R8_UNORM]: PIXEL_TYPE.UNSIGNED_BYTE,\n\t\t[_ktxParser.VK_FORMAT_ASTC_4x4_SFLOAT_BLOCK_EXT]: PIXEL_TYPE.HALF_FLOAT\n\t};\n}\n\nasync function createTextureData(container) {\n\tconst { vkFormat, pixelWidth, pixelHeight, pixelDepth } = container;\n\n\tif (FORMAT_MAP[vkFormat] === undefined) {\n\t\tthrow new Error('KTX2Loader: Unsupported vkFormat.');\n\t}\n\n\tlet isCompressed = true;\n\tif (UNCOMPRESSED_FORMATS.has(FORMAT_MAP[vkFormat])) {\n\t\tisCompressed = false;\n\t}\n\n\t//\n\n\tif (container.supercompressionScheme === _ktxParser.KHR_SUPERCOMPRESSION_ZSTD) {\n\t\tif (!_zstd) {\n\t\t\tif (!_zstdDecoder) {\n\t\t\t\tthrow new Error('KTX2Loader: ZSTDDecoder not set.');\n\t\t\t}\n\n\t\t\t_zstd = new _zstdDecoder();\n\t\t\tawait _zstd.init();\n\t\t}\n\t}\n\n\t//\n\n\tconst mipmaps = [];\n\n\tfor (let levelIndex = 0; levelIndex < container.levels.length; levelIndex++) {\n\t\tconst levelWidth = Math.max(1, pixelWidth >> levelIndex);\n\t\tconst levelHeight = Math.max(1, pixelHeight >> levelIndex);\n\t\tconst levelDepth = pixelDepth ? Math.max(1, pixelDepth >> levelIndex) : 0;\n\n\t\tconst level = container.levels[levelIndex];\n\n\t\tlet levelData;\n\n\t\tif (container.supercompressionScheme === _ktxParser.KHR_SUPERCOMPRESSION_NONE) {\n\t\t\tlevelData = level.levelData;\n\t\t} else if (container.supercompressionScheme === _ktxParser.KHR_SUPERCOMPRESSION_ZSTD) {\n\t\t\tlevelData = _zstd.decode(level.levelData, level.uncompressedByteLength);\n\t\t} else {\n\t\t\tthrow new Error('KTX2Loader: Unsupported supercompressionScheme.');\n\t\t}\n\n\t\tlet data;\n\n\t\tif (TYPE_MAP[vkFormat] === PIXEL_TYPE.FLOAT) {\n\t\t\tdata = new Float32Array(\n\t\t\t\tlevelData.buffer,\n\t\t\t\tlevelData.byteOffset,\n\t\t\t\tlevelData.byteLength / Float32Array.BYTES_PER_ELEMENT\n\t\t\t);\n\t\t} else if (TYPE_MAP[vkFormat] === PIXEL_TYPE.HALF_FLOAT) {\n\t\t\tdata = new Uint16Array(\n\t\t\t\tlevelData.buffer,\n\t\t\t\tlevelData.byteOffset,\n\t\t\t\tlevelData.byteLength / Uint16Array.BYTES_PER_ELEMENT\n\t\t\t);\n\t\t} else {\n\t\t\tdata = levelData;\n\t\t}\n\n\t\tmipmaps.push({ data, isCompressed, width: levelWidth, height: levelHeight, depth: levelDepth });\n\t}\n\n\tconst textureData = {};\n\ttextureData.image = mipmaps[0];\n\ttextureData.mipmaps = mipmaps.length > 1 ? mipmaps : [];\n\ttextureData.type = TYPE_MAP[vkFormat];\n\ttextureData.format = FORMAT_MAP[vkFormat];\n\ttextureData.minFilter = mipmaps.length > 1 ? TEXTURE_FILTER.LINEAR_MIPMAP_LINEAR : TEXTURE_FILTER.LINEAR;\n\ttextureData.magFilter = TEXTURE_FILTER.LINEAR;\n\ttextureData.generateMipmaps = false;\n\ttextureData.encoding = parseTextureEncoding(container);\n\ttextureData.premultiplyAlpha = false;\n\n\treturn Promise.resolve(textureData);\n}\n\nfunction parseTextureEncoding(container) {\n\tconst { KHR_DF_PRIMARIES_BT709, KHR_DF_TRANSFER_SRGB, KHR_DF_PRIMARIES_DISPLAYP3, KHR_DF_PRIMARIES_UNSPECIFIED } = _ktxParser;\n\n\tconst dfd = container.dataFormatDescriptor[0];\n\n\tif (dfd.colorPrimaries === KHR_DF_PRIMARIES_BT709) {\n\t\treturn dfd.transferFunction === KHR_DF_TRANSFER_SRGB ? TEXEL_ENCODING_TYPE.SRGB : TEXEL_ENCODING_TYPE.LINEAR;\n\t} else if (dfd.colorPrimaries === KHR_DF_PRIMARIES_DISPLAYP3) {\n\t\tconsole.warn('KTX2Loader: DisplayP3 encoding is not supported.');\n\t\treturn dfd.transferFunction === KHR_DF_TRANSFER_SRGB ? TEXEL_ENCODING_TYPE.SRGB : TEXEL_ENCODING_TYPE.LINEAR;\n\t} else if (dfd.colorPrimaries === KHR_DF_PRIMARIES_UNSPECIFIED) {\n\t\treturn TEXEL_ENCODING_TYPE.LINEAR;\n\t} else {\n\t\tconsole.warn(`KTX2Loader: Unsupported color primaries, \"${dfd.colorPrimaries}\"`);\n\t\treturn TEXEL_ENCODING_TYPE.LINEAR;\n\t}\n}\n\nclass KTX2TextureLoader extends KTX2Loader {\n\n\tconstructor(manager) {\n\t\tsuper(manager);\n\t}\n\n\tload(url, onLoad, onProgress, onError) {\n\t\tsuper.load(url, textureData => {\n\t\t\tconst texture = new Texture2D();\n\n\t\t\t// TODO Texture3D or Texture2DArray\n\t\t\t// TODO TextureCube\n\n\t\t\ttexture.image = textureData.image;\n\t\t\ttexture.mipmaps = textureData.mipmaps;\n\t\t\ttexture.type = textureData.type;\n\t\t\ttexture.format = textureData.format;\n\t\t\ttexture.minFilter = textureData.minFilter;\n\t\t\ttexture.magFilter = textureData.magFilter;\n\t\t\ttexture.generateMipmaps = textureData.generateMipmaps;\n\t\t\ttexture.encoding = textureData.encoding;\n\t\t\ttexture.premultiplyAlpha = textureData.premultiplyAlpha;\n\n\t\t\ttexture.flipY = false;\n\n\t\t\ttexture.version++;\n\n\t\t\tonLoad && onLoad(texture);\n\t\t}, onProgress, onError);\n\t}\n\n}\n\nexport { KTX2Loader, KTX2TextureLoader };"
  },
  {
    "path": "examples/jsm/loaders/PVRLoader.js",
    "content": "import {\n\tLoader,\n\tFileLoader,\n\tPIXEL_FORMAT,\n\tTexture2D,\n\tTEXTURE_FILTER,\n\tTextureCube\n} from 't3d';\n\nclass PVRLoader extends Loader {\n\n\tload(url, onLoad, onProgress, onError) {\n\t\tnew FileLoader(this.manager)\n\t\t\t.setResponseType('arraybuffer')\n\t\t\t.setRequestHeader(this.requestHeader)\n\t\t\t.setPath(this.path)\n\t\t\t.setWithCredentials(this.withCredentials)\n\t\t\t.load(url, buffer => {\n\t\t\t\tonLoad && onLoad(this.parse(buffer, true));\n\t\t\t}, onProgress, onError);\n\t}\n\n\tparse(buffer, loadMipmaps) {\n\t\tconst headerLengthInt = 13;\n\t\tconst header = new Uint32Array(buffer, 0, headerLengthInt);\n\n\t\tconst pvrDatas = {\n\t\t\tbuffer: buffer,\n\t\t\theader: header,\n\t\t\tloadMipmaps: loadMipmaps\n\t\t};\n\n\t\tif (header[0] === 0x03525650) { // PVR v3\n\t\t\treturn _parseV3(pvrDatas);\n\t\t} else if (header[11] === 0x21525650) { // PVR v2\n\t\t\treturn _parseV2(pvrDatas);\n\t\t} else {\n\t\t\tconsole.error('PVRLoader: Unknown PVR format.');\n\t\t}\n\t}\n\n}\n\nfunction _parseV3(pvrDatas) {\n\tconst header = pvrDatas.header;\n\tlet bpp, format;\n\n\tconst metaLen = header[12],\n\t\tpixelFormat = header[2],\n\t\theight = header[6],\n\t\twidth = header[7],\n\t\t// numSurfs = header[ 9 ],\n\t\tnumFaces = header[10],\n\t\tnumMipmaps = header[11];\n\n\tswitch (pixelFormat) {\n\t\tcase 0: // PVRTC 2bpp RGB\n\t\t\tbpp = 2;\n\t\t\tformat = PIXEL_FORMAT.RGB_PVRTC_2BPPV1;\n\t\t\tbreak;\n\t\tcase 1: // PVRTC 2bpp RGBA\n\t\t\tbpp = 2;\n\t\t\tformat = PIXEL_FORMAT.RGBA_PVRTC_2BPPV1;\n\t\t\tbreak;\n\t\tcase 2: // PVRTC 4bpp RGB\n\t\t\tbpp = 4;\n\t\t\tformat = PIXEL_FORMAT.RGB_PVRTC_4BPPV1;\n\t\t\tbreak;\n\t\tcase 3: // PVRTC 4bpp RGBA\n\t\t\tbpp = 4;\n\t\t\tformat = PIXEL_FORMAT.RGBA_PVRTC_4BPPV1;\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tconsole.error('PVRLoader: Unsupported PVR format:', pixelFormat);\n\t}\n\n\tpvrDatas.dataPtr = 52 + metaLen;\n\tpvrDatas.bpp = bpp;\n\tpvrDatas.format = format;\n\tpvrDatas.width = width;\n\tpvrDatas.height = height;\n\tpvrDatas.numSurfaces = numFaces;\n\tpvrDatas.numMipmaps = numMipmaps;\n\tpvrDatas.isCubemap = (numFaces === 6);\n\n\treturn _extract(pvrDatas);\n}\n\nfunction _parseV2(pvrDatas) {\n\tconst header = pvrDatas.header;\n\n\tconst headerLength = header[0],\n\t\theight = header[1],\n\t\twidth = header[2],\n\t\tnumMipmaps = header[3],\n\t\tflags = header[4],\n\t\t// dataLength = header[ 5 ],\n\t\t// bpp =  header[ 6 ],\n\t\t// bitmaskRed = header[ 7 ],\n\t\t// bitmaskGreen = header[ 8 ],\n\t\t// bitmaskBlue = header[ 9 ],\n\t\tbitmaskAlpha = header[10],\n\t\t// pvrTag = header[ 11 ],\n\t\tnumSurfs = header[12];\n\n\tconst TYPE_MASK = 0xff;\n\tconst PVRTC_2 = 24,\n\t\tPVRTC_4 = 25;\n\n\tconst formatFlags = flags & TYPE_MASK;\n\n\tlet bpp, format;\n\tconst _hasAlpha = bitmaskAlpha > 0;\n\n\tif (formatFlags === PVRTC_4) {\n\t\tformat = _hasAlpha ? PIXEL_FORMAT.RGBA_PVRTC_4BPPV1 : PIXEL_FORMAT.RGB_PVRTC_4BPPV1;\n\t\tbpp = 4;\n\t} else if (formatFlags === PVRTC_2) {\n\t\tformat = _hasAlpha ? PIXEL_FORMAT.RGBA_PVRTC_2BPPV1 : PIXEL_FORMAT.RGB_PVRTC_2BPPV1;\n\t\tbpp = 2;\n\t} else {\n\t\tconsole.error('PVRLoader: Unknown PVR format:', formatFlags);\n\t}\n\n\tpvrDatas.dataPtr = headerLength;\n\tpvrDatas.bpp = bpp;\n\tpvrDatas.format = format;\n\tpvrDatas.width = width;\n\tpvrDatas.height = height;\n\tpvrDatas.numSurfaces = numSurfs;\n\tpvrDatas.numMipmaps = numMipmaps + 1;\n\n\t// guess cubemap type seems tricky in v2\n\t// it juste a pvr containing 6 surface (no explicit cubemap type)\n\tpvrDatas.isCubemap \t= (numSurfs === 6);\n\n\treturn _extract(pvrDatas);\n}\n\nfunction _extract(pvrDatas) {\n\tconst pvr = {\n\t\tmipmaps: [],\n\t\twidth: pvrDatas.width,\n\t\theight: pvrDatas.height,\n\t\tformat: pvrDatas.format,\n\t\tmipmapCount: pvrDatas.numMipmaps,\n\t\tisCubemap: pvrDatas.isCubemap\n\t};\n\n\tconst buffer = pvrDatas.buffer;\n\n\tlet dataOffset = pvrDatas.dataPtr,\n\t\tdataSize = 0,\n\t\tblockSize = 0,\n\t\tblockWidth = 0,\n\t\tblockHeight = 0,\n\t\twidthBlocks = 0,\n\t\theightBlocks = 0;\n\n\tconst bpp = pvrDatas.bpp,\n\t\tnumSurfs = pvrDatas.numSurfaces;\n\n\tif (bpp === 2) {\n\t\tblockWidth = 8;\n\t\tblockHeight = 4;\n\t} else {\n\t\tblockWidth = 4;\n\t\tblockHeight = 4;\n\t}\n\n\tblockSize = (blockWidth * blockHeight) * bpp / 8;\n\n\tpvr.mipmaps.length = pvrDatas.numMipmaps * numSurfs;\n\n\tlet mipLevel = 0;\n\n\twhile (mipLevel < pvrDatas.numMipmaps) {\n\t\tconst sWidth = pvrDatas.width >> mipLevel,\n\t\t\tsHeight = pvrDatas.height >> mipLevel;\n\n\t\twidthBlocks = sWidth / blockWidth;\n\t\theightBlocks = sHeight / blockHeight;\n\n\t\t// Clamp to minimum number of blocks\n\t\tif (widthBlocks < 2) widthBlocks = 2;\n\t\tif (heightBlocks < 2) heightBlocks = 2;\n\n\t\tdataSize = widthBlocks * heightBlocks * blockSize;\n\n\t\tfor (let surfIndex = 0; surfIndex < numSurfs; surfIndex++) {\n\t\t\tconst byteArray = new Uint8Array(buffer, dataOffset, dataSize);\n\n\t\t\tconst mipmap = {\n\t\t\t\tdata: byteArray,\n\t\t\t\twidth: sWidth,\n\t\t\t\theight: sHeight\n\t\t\t};\n\n\t\t\tpvr.mipmaps[surfIndex * pvrDatas.numMipmaps + mipLevel] = mipmap;\n\n\t\t\tdataOffset += dataSize;\n\t\t}\n\n\t\tmipLevel++;\n\t}\n\n\treturn pvr;\n}\n\nclass PVRTextureLoader extends PVRLoader {\n\n\tload(url, onLoad, onProgress, onError) {\n\t\tsuper.load(url, textureData => {\n\t\t\tconst { mipmaps, width, height, format, mipmapCount, isCubemap } = textureData;\n\n\t\t\tlet texture;\n\n\t\t\tif (isCubemap) {\n\t\t\t\ttexture = new TextureCube();\n\n\t\t\t\tconst faces = mipmaps.length / mipmapCount;\n\n\t\t\t\tfor (let f = 0; f < faces; f++) {\n\t\t\t\t\ttexture.images[f] = { data: mipmaps[f * mipmapCount], width, height, isCompressed: true };\n\t\t\t\t}\n\n\t\t\t\tfor (let i = 0; i < mipmapCount; i++) {\n\t\t\t\t\ttexture.mipmaps[i] = [];\n\t\t\t\t\tfor (let f = 0; f < faces; f++) {\n\t\t\t\t\t\ttexture.mipmaps[i].push(mipmaps[f * mipmapCount + i]);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\ttexture = new Texture2D();\n\t\t\t\ttexture.image = { data: mipmaps[0].data, width, height, isCompressed: true };\n\t\t\t\ttexture.mipmaps = mipmaps;\n\t\t\t}\n\n\t\t\ttexture.minFilter = mipmapCount === 1 ? TEXTURE_FILTER.LINEAR : TEXTURE_FILTER.LINEAR_MIPMAP_LINEAR;\n\t\t\ttexture.magFilter = TEXTURE_FILTER.LINEAR;\n\n\t\t\ttexture.format = format;\n\n\t\t\t// no flipping for cube textures\n\t\t\t// (also flipping doesn't work for compressed textures )\n\n\t\t\ttexture.flipY = false;\n\n\t\t\t// can't generate mipmaps for compressed textures\n\t\t\t// mips must be embedded in DDS files\n\n\t\t\ttexture.generateMipmaps = false;\n\n\t\t\ttexture.version++;\n\n\t\t\tonLoad && onLoad(texture);\n\t\t}, onProgress, onError);\n\t}\n\n}\n\nexport { PVRLoader, PVRTextureLoader };"
  },
  {
    "path": "examples/jsm/loaders/RGBELoader.js",
    "content": "import { Loader, FileLoader, PIXEL_TYPE, PIXEL_FORMAT, TEXTURE_FILTER, Texture2D, TextureCube, MathUtils } from 't3d';\n\nclass RGBELoader extends Loader {\n\n\tconstructor(manager) {\n\t\tsuper(manager);\n\n\t\tthis.type = PIXEL_TYPE.HALF_FLOAT;\n\t}\n\n\tload(url, onLoad, onProgress, onError) {\n\t\tnew FileLoader(this.manager)\n\t\t\t.setResponseType('arraybuffer')\n\t\t\t.setRequestHeader(this.requestHeader)\n\t\t\t.setPath(this.path)\n\t\t\t.setWithCredentials(this.withCredentials)\n\t\t\t.load(url, buffer => {\n\t\t\t\tonLoad && onLoad(this.parse(buffer));\n\t\t\t}, onProgress, onError);\n\t}\n\n\t// adapted from http://www.graphics.cornell.edu/~bjw/rgbe.html\n\n\tparse(buffer) {\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\t\tlet data, type;\n\t\tlet numElements;\n\t\tif (this.type === PIXEL_TYPE.FLOAT) {\n\t\t\tnumElements = image_rgba_data.length / 4;\n\t\t\tconst floatArray = new Float32Array(numElements * 4);\n\n\t\t\tfor (let j = 0; j < numElements; j++) {\n\t\t\t\tRGBEByteToRGBFloat(image_rgba_data, j * 4, floatArray, j * 4);\n\t\t\t}\n\n\t\t\tdata = floatArray;\n\t\t\ttype = PIXEL_TYPE.FLOAT;\n\t\t} else if (this.type === PIXEL_TYPE.HALF_FLOAT) {\n\t\t\tnumElements = image_rgba_data.length / 4;\n\t\t\tconst halfArray = new Uint16Array(numElements * 4);\n\n\t\t\tfor (let j = 0; j < numElements; j++) {\n\t\t\t\tRGBEByteToRGBHalf(image_rgba_data, j * 4, halfArray, j * 4);\n\t\t\t}\n\n\t\t\tdata = halfArray;\n\t\t\ttype = PIXEL_TYPE.HALF_FLOAT;\n\t\t} else if (this.type === PIXEL_TYPE.UNSIGNED_BYTE) {\n\t\t\tdata = image_rgba_data; // just copy\n\t\t\ttype = PIXEL_TYPE.UNSIGNED_BYTE;\n\t\t} else {\n\t\t\tconsole.error('RGBELoader: unsupported type: ', this.type);\n\t\t}\n\n\t\tconst floatType = (type === PIXEL_TYPE.FLOAT) || (type === PIXEL_TYPE.HALF_FLOAT);\n\n\t\treturn {\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\n\t\t\twidth: w, height: h, data: data,\n\n\t\t\ttype: type,\n\t\t\tgenerateMipmaps: !floatType,\n\t\t\tflipY: floatType,\n\t\t\tminFilter: floatType ? TEXTURE_FILTER.LINEAR : TEXTURE_FILTER.LINEAR_MIPMAP_LINEAR,\n\t\t\tmagFilter: TEXTURE_FILTER.LINEAR,\n\n\t\t\tformat: PIXEL_FORMAT.RGBA, // deprecated\n\t\t\tinternalformat: null // deprecated\n\t\t};\n\t}\n\n}\n\nconst\n\t/* default error routine.  change this to change error handling */\n\trgbe_read_error = 1,\n\trgbe_write_error = 2,\n\trgbe_format_error = 3,\n\trgbe_memory_error = 4,\n\trgbe_error = function(rgbe_error_code, msg) {\n\t\tswitch (rgbe_error_code) {\n\t\t\tcase rgbe_read_error: throw new Error('RGBELoader: Read Error: ' + (msg || ''));\n\t\t\tcase rgbe_write_error: throw new Error('RGBELoader: Write Error: ' + (msg || ''));\n\t\t\tcase rgbe_format_error: throw new Error('RGBELoader: Bad File Format: ' + (msg || ''));\n\t\t\tdefault:\n\t\t\tcase rgbe_memory_error: throw new Error('RGBELoader: Memory Error: ' + (msg || ''));\n\t\t}\n\t},\n\n\t/* offsets to red, green, and blue components in a data (float) pixel */\n\t// RGBE_DATA_RED = 0,\n\t// RGBE_DATA_GREEN = 1,\n\t// RGBE_DATA_BLUE = 2,\n\n\t/* number of floats per pixel, use 4 since stored in rgba image format */\n\t// RGBE_DATA_SIZE = 4,\n\n\t/* flags indicating which fields in an rgbe_header_info are valid */\n\tRGBE_VALID_PROGRAMTYPE = 1,\n\tRGBE_VALID_FORMAT = 2,\n\tRGBE_VALID_DIMENSIONS = 4,\n\n\tNEWLINE = '\\n',\n\n\tfgets = function(buffer, lineLimit, consume) {\n\t\tconst chunkSize = 128;\n\n\t\tlineLimit = !lineLimit ? 1024 : lineLimit;\n\t\tlet p = buffer.pos,\n\t\t\ti = -1, len = 0, s = '',\n\t\t\tchunk = String.fromCharCode.apply(null, new Uint16Array(buffer.subarray(p, p + chunkSize)));\n\t\twhile ((0 > (i = chunk.indexOf(NEWLINE))) && (len < lineLimit) && (p < buffer.byteLength)) {\n\t\t\ts += chunk; len += chunk.length;\n\t\t\tp += chunkSize;\n\t\t\tchunk += String.fromCharCode.apply(null, new Uint16Array(buffer.subarray(p, p + chunkSize)));\n\t\t}\n\n\t\tif (-1 < i) {\n\t\t\t/* for (i=l-1; i>=0; i--) {\n\t\t\t\tbyteCode = m.charCodeAt(i);\n\t\t\t\tif (byteCode > 0x7f && byteCode <= 0x7ff) byteLen++;\n\t\t\t\telse if (byteCode > 0x7ff && byteCode <= 0xffff) byteLen += 2;\n\t\t\t\tif (byteCode >= 0xDC00 && byteCode <= 0xDFFF) i--; //trail surrogate\n\t\t\t} */\n\t\t\tif (false !== consume) buffer.pos += len + i + 1;\n\t\t\treturn s + chunk.slice(0, i);\n\t\t}\n\n\t\treturn false;\n\t},\n\n\t/* minimal header reading.  modify if you want to parse more information */\n\tRGBE_ReadHeader = function(buffer) {\n\t\t// regexes to parse header info fields\n\t\tconst magic_token_re = /^#\\?(\\S+)$/,\n\t\t\tgamma_re = /^\\s*GAMMA\\s*=\\s*(\\d+(\\.\\d+)?)\\s*$/,\n\t\t\texposure_re = /^\\s*EXPOSURE\\s*=\\s*(\\d+(\\.\\d+)?)\\s*$/,\n\t\t\tformat_re = /^\\s*FORMAT=(\\S+)\\s*$/,\n\t\t\tdimensions_re = /^\\s*-Y\\s+(\\d+)\\s+\\+X\\s+(\\d+)\\s*$/,\n\n\t\t\t// RGBE format header struct\n\t\t\theader = {\n\t\t\t\tvalid: 0, /* indicate which fields are valid */\n\t\t\t\tstring: '', /* the actual header string */\n\t\t\t\tcomments: '', /* comments found in header */\n\t\t\t\tprogramtype: 'RGBE', /* listed at beginning of file to identify it after \"#?\". defaults to \"RGBE\" */\n\t\t\t\tformat: '', /* RGBE format, default 32-bit_rle_rgbe */\n\t\t\t\tgamma: 1.0, /* image has already been gamma corrected with given gamma. defaults to 1.0 (no correction) */\n\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\t\t\t\twidth: 0, height: 0 /* image dimensions, width/height */\n\t\t\t};\n\n\t\tlet line, match;\n\n\t\tif (buffer.pos >= buffer.byteLength || !(line = fgets(buffer))) {\n\t\t\treturn rgbe_error(rgbe_read_error, 'no header found');\n\t\t}\n\n\t\t/* if you want to require the magic token then uncomment the next line */\n\t\tif (!(match = line.match(magic_token_re))) {\n\t\t\treturn rgbe_error(rgbe_format_error, 'bad initial token');\n\t\t}\n\n\t\theader.valid |= RGBE_VALID_PROGRAMTYPE;\n\t\theader.programtype = match[1];\n\t\theader.string += line + '\\n';\n\n\t\twhile (true) {\n\t\t\tline = fgets(buffer);\n\t\t\tif (false === line) break;\n\t\t\theader.string += line + '\\n';\n\n\t\t\tif ('#' === line.charAt(0)) {\n\t\t\t\theader.comments += line + '\\n';\n\t\t\t\tcontinue; // comment line\n\t\t\t}\n\n\t\t\tmatch = line.match(gamma_re);\n\t\t\tif (match) {\n\t\t\t\theader.gamma = parseFloat(match[1]);\n\t\t\t}\n\t\t\tmatch = line.match(exposure_re);\n\t\t\tif (match) {\n\t\t\t\theader.exposure = parseFloat(match[1]);\n\t\t\t}\n\t\t\tmatch = line.match(format_re);\n\t\t\tif (match) {\n\t\t\t\theader.valid |= RGBE_VALID_FORMAT;\n\t\t\t\theader.format = match[1];// '32-bit_rle_rgbe';\n\t\t\t}\n\t\t\tmatch = line.match(dimensions_re);\n\t\t\tif (match) {\n\t\t\t\theader.valid |= RGBE_VALID_DIMENSIONS;\n\t\t\t\theader.height = parseInt(match[1], 10);\n\t\t\t\theader.width = parseInt(match[2], 10);\n\t\t\t}\n\n\t\t\tif ((header.valid & RGBE_VALID_FORMAT) && (header.valid & RGBE_VALID_DIMENSIONS)) break;\n\t\t}\n\n\t\tif (!(header.valid & RGBE_VALID_FORMAT)) {\n\t\t\treturn rgbe_error(rgbe_format_error, 'missing format specifier');\n\t\t}\n\t\tif (!(header.valid & RGBE_VALID_DIMENSIONS)) {\n\t\t\treturn rgbe_error(rgbe_format_error, 'missing image size specifier');\n\t\t}\n\n\t\treturn header;\n\t},\n\n\tRGBE_ReadPixels_RLE = function(buffer, w, h) {\n\t\tconst scanline_width = w;\n\n\t\tif (\n\t\t\t// run length encoding is not allowed so read flat\n\t\t\t((scanline_width < 8) || (scanline_width > 0x7fff)) ||\n\t\t\t// this file is not run length encoded\n\t\t\t((2 !== buffer[0]) || (2 !== buffer[1]) || (buffer[2] & 0x80))\n\t\t) {\n\t\t\t// return the flat buffer\n\t\t\treturn new Uint8Array(buffer);\n\t\t}\n\n\t\tif (scanline_width !== ((buffer[2] << 8) | buffer[3])) {\n\t\t\treturn rgbe_error(rgbe_format_error, 'wrong scanline width');\n\t\t}\n\n\t\tconst data_rgba = new Uint8Array(4 * w * h);\n\n\t\tif (!data_rgba.length) {\n\t\t\treturn rgbe_error(rgbe_memory_error, 'unable to allocate buffer space');\n\t\t}\n\n\t\tlet offset = 0, pos = 0;\n\n\t\tconst ptr_end = 4 * scanline_width;\n\t\tconst rgbeStart = new Uint8Array(4);\n\t\tconst scanline_buffer = new Uint8Array(ptr_end);\n\t\tlet num_scanlines = h;\n\n\t\t// read in each successive scanline\n\t\twhile ((num_scanlines > 0) && (pos < buffer.byteLength)) {\n\t\t\tif (pos + 4 > buffer.byteLength) {\n\t\t\t\treturn rgbe_error(rgbe_read_error);\n\t\t\t}\n\n\t\t\trgbeStart[0] = buffer[pos++];\n\t\t\trgbeStart[1] = buffer[pos++];\n\t\t\trgbeStart[2] = buffer[pos++];\n\t\t\trgbeStart[3] = buffer[pos++];\n\n\t\t\tif ((2 != rgbeStart[0]) || (2 != rgbeStart[1]) || (((rgbeStart[2] << 8) | rgbeStart[3]) != scanline_width)) {\n\t\t\t\treturn rgbe_error(rgbe_format_error, 'bad rgbe scanline format');\n\t\t\t}\n\n\t\t\t// read each of the four channels for the scanline into the buffer\n\t\t\t// first red, then green, then blue, then exponent\n\t\t\tlet ptr = 0, count;\n\n\t\t\twhile ((ptr < ptr_end) && (pos < buffer.byteLength)) {\n\t\t\t\tcount = buffer[pos++];\n\t\t\t\tconst isEncodedRun = count > 128;\n\t\t\t\tif (isEncodedRun) count -= 128;\n\n\t\t\t\tif ((0 === count) || (ptr + count > ptr_end)) {\n\t\t\t\t\treturn rgbe_error(rgbe_format_error, 'bad scanline data');\n\t\t\t\t}\n\n\t\t\t\tif (isEncodedRun) {\n\t\t\t\t\t// a (encoded) run of the same value\n\t\t\t\t\tconst byteValue = buffer[pos++];\n\t\t\t\t\tfor (let i = 0; i < count; i++) {\n\t\t\t\t\t\tscanline_buffer[ptr++] = byteValue;\n\t\t\t\t\t}\n\t\t\t\t\t// ptr += count;\n\t\t\t\t} else {\n\t\t\t\t\t// a literal-run\n\t\t\t\t\tscanline_buffer.set(buffer.subarray(pos, pos + count), ptr);\n\t\t\t\t\tptr += count; pos += count;\n\t\t\t\t}\n\t\t\t}\n\n\n\t\t\t// now convert data from buffer into rgba\n\t\t\t// first red, then green, then blue, then exponent (alpha)\n\t\t\tconst l = scanline_width; // scanline_buffer.byteLength;\n\t\t\tfor (let i = 0; i < l; i++) {\n\t\t\t\tlet off = 0;\n\t\t\t\tdata_rgba[offset] = scanline_buffer[i + off];\n\t\t\t\toff += scanline_width; // 1;\n\t\t\t\tdata_rgba[offset + 1] = scanline_buffer[i + off];\n\t\t\t\toff += scanline_width; // 1;\n\t\t\t\tdata_rgba[offset + 2] = scanline_buffer[i + off];\n\t\t\t\toff += scanline_width; // 1;\n\t\t\t\tdata_rgba[offset + 3] = scanline_buffer[i + off];\n\t\t\t\toffset += 4;\n\t\t\t}\n\n\t\t\tnum_scanlines--;\n\t\t}\n\n\t\treturn data_rgba;\n\t};\n\nconst RGBEByteToRGBFloat = function(sourceArray, sourceOffset, destArray, destOffset) {\n\tconst e = sourceArray[sourceOffset + 3];\n\tconst scale = Math.pow(2.0, e - 128.0) / 255.0;\n\n\tdestArray[destOffset + 0] = sourceArray[sourceOffset + 0] * scale;\n\tdestArray[destOffset + 1] = sourceArray[sourceOffset + 1] * scale;\n\tdestArray[destOffset + 2] = sourceArray[sourceOffset + 2] * scale;\n\tdestArray[destOffset + 3] = 1;\n};\n\nconst RGBEByteToRGBHalf = function(sourceArray, sourceOffset, destArray, destOffset) {\n\tconst e = sourceArray[sourceOffset + 3];\n\tconst scale = Math.pow(2.0, e - 128.0) / 255.0;\n\n\t// clamping to 65504, the maximum representable value in float16\n\tdestArray[destOffset + 0] = MathUtils.toHalfFloat(Math.min(sourceArray[sourceOffset + 0] * scale, 65504));\n\tdestArray[destOffset + 1] = MathUtils.toHalfFloat(Math.min(sourceArray[sourceOffset + 1] * scale, 65504));\n\tdestArray[destOffset + 2] = MathUtils.toHalfFloat(Math.min(sourceArray[sourceOffset + 2] * scale, 65504));\n\tdestArray[destOffset + 3] = MathUtils.toHalfFloat(1);\n};\n\nclass RGBETexture2DLoader extends RGBELoader {\n\n\tload(url, onLoad, onProgress, onError) {\n\t\tconst texture = new Texture2D();\n\n\t\tsuper.load(url, textureData => {\n\t\t\tconst {\n\t\t\t\theader, gamma, exposure,\n\t\t\t\tdata, width, height,\n\t\t\t\ttype, generateMipmaps, flipY, magFilter, minFilter\n\t\t\t} = textureData;\n\n\t\t\ttexture.image = { data, width, height };\n\n\t\t\ttexture.type = type;\n\t\t\ttexture.generateMipmaps = generateMipmaps;\n\t\t\ttexture.flipY = flipY;\n\t\t\ttexture.magFilter = magFilter;\n\t\t\ttexture.minFilter = minFilter;\n\n\t\t\ttexture.userData.rgbeInfo = { header, gamma, exposure };\n\n\t\t\ttexture.version++;\n\n\t\t\tonLoad && onLoad(texture);\n\t\t}, onProgress, onError);\n\n\t\treturn texture;\n\t}\n\n}\n\nclass RGBETextureCubeLoader extends RGBELoader {\n\n\tload(urls, onLoad, _onProgress, onError) {\n\t\tconst texture = new TextureCube();\n\n\t\tconst promiseArray = [];\n\t\tfor (let i = 0; i < 6; i++) {\n\t\t\tpromiseArray.push(new Promise((resolve, reject) => {\n\t\t\t\tsuper.load(urls[i], resolve, undefined, reject);\n\t\t\t}));\n\t\t}\n\n\t\tPromise.all(promiseArray).then(textureDatas => {\n\t\t\tfor (let i = 0; i < 6; i++) {\n\t\t\t\ttexture.images.push({\n\t\t\t\t\tdata: textureDatas[i].data,\n\t\t\t\t\twidth: textureDatas[i].width,\n\t\t\t\t\theight: textureDatas[i].height\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tconst { type, generateMipmaps, magFilter, minFilter } = textureDatas[0];\n\n\t\t\ttexture.type = type;\n\t\t\ttexture.generateMipmaps = generateMipmaps;\n\t\t\t// texture.flipY = flipY;\n\t\t\ttexture.magFilter = magFilter;\n\t\t\ttexture.minFilter = minFilter;\n\n\t\t\ttexture.version++;\n\n\t\t\tonLoad && onLoad(texture);\n\t\t}).catch(e => {\n\t\t\tonError && onError(e);\n\t\t});\n\n\t\treturn texture;\n\t}\n\n}\n\nexport { RGBELoader, RGBETexture2DLoader, RGBETextureCubeLoader };"
  },
  {
    "path": "examples/jsm/loaders/TGALoader.js",
    "content": "import { Loader, FileLoader, TEXTURE_FILTER, Texture2D, TextureCube } from 't3d';\n\nclass TGALoader extends Loader {\n\n\tload(url, onLoad, onProgress, onError) {\n\t\tnew FileLoader(this.manager)\n\t\t\t.setResponseType('arraybuffer')\n\t\t\t.setRequestHeader(this.requestHeader)\n\t\t\t.setPath(this.path)\n\t\t\t.setWithCredentials(this.withCredentials)\n\t\t\t.load(url, buffer => {\n\t\t\t\tonLoad && onLoad(this.parse(buffer, true));\n\t\t\t}, onProgress, onError);\n\t}\n\n\tparse(buffer) {\n\t\t// reference from vthibault, https://github.com/vthibault/roBrowser/blob/master/src/Loaders/Targa.js\n\n\t\tfunction tgaCheckHeader(header) {\n\t\t\tswitch (header.image_type) {\n\t\t\t\t// Check indexed type\n\t\t\t\tcase TGA_TYPE_INDEXED:\n\t\t\t\tcase TGA_TYPE_RLE_INDEXED:\n\t\t\t\t\tif (header.colormap_length > 256 || header.colormap_size !== 24 || header.colormap_type !== 1) {\n\t\t\t\t\t\tconsole.error('TGALoader: Invalid type colormap data for indexed type.');\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t// Check colormap type\n\t\t\t\tcase TGA_TYPE_RGB:\n\t\t\t\tcase TGA_TYPE_GREY:\n\t\t\t\tcase TGA_TYPE_RLE_RGB:\n\t\t\t\tcase TGA_TYPE_RLE_GREY:\n\t\t\t\t\tif (header.colormap_type) {\n\t\t\t\t\t\tconsole.error('TGALoader: Invalid type colormap data for colormap type.');\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t// What the need of a file without data ?\n\t\t\t\tcase TGA_TYPE_NO_DATA:\n\t\t\t\t\tconsole.error('TGALoader: No data.');\n\t\t\t\t\tbreak;\n\t\t\t\t// Invalid type ?\n\t\t\t\tdefault:\n\t\t\t\t\tconsole.error('TGALoader: Invalid type ' + header.image_type);\n\t\t\t}\n\n\t\t\t// Check image width and height\n\t\t\tif (header.width <= 0 || header.height <= 0) {\n\t\t\t\tconsole.error('TGALoader: Invalid image size.');\n\t\t\t}\n\n\t\t\t// Check image pixel size\n\t\t\tif (header.pixel_size !== 8 &&\n\t\t\t\theader.pixel_size !== 16 &&\n\t\t\t\theader.pixel_size !== 24 &&\n\t\t\t\theader.pixel_size !== 32) {\n\t\t\t\tconsole.error('TGALoader: Invalid pixel size ' + header.pixel_size);\n\t\t\t}\n\t\t}\n\n\t\t// Parse tga image buffer\n\n\t\tfunction tgaParse(use_rle, use_pal, header, offset, data) {\n\t\t\tlet pixel_data,\n\t\t\t\tpalettes;\n\n\t\t\tconst pixel_size = header.pixel_size >> 3;\n\t\t\tconst pixel_total = header.width * header.height * pixel_size;\n\n\t\t\t// Read palettes\n\t\t\tif (use_pal) {\n\t\t\t\tpalettes = data.subarray(offset, offset += header.colormap_length * (header.colormap_size >> 3));\n\t\t\t}\n\n\t\t\t// Read RLE\n\t\t\tif (use_rle) {\n\t\t\t\tpixel_data = new Uint8Array(pixel_total);\n\n\t\t\t\tlet c, count, i;\n\t\t\t\tlet shift = 0;\n\t\t\t\tconst pixels = new Uint8Array(pixel_size);\n\n\t\t\t\twhile (shift < pixel_total) {\n\t\t\t\t\tc = data[offset++];\n\t\t\t\t\tcount = (c & 0x7f) + 1;\n\n\t\t\t\t\t// RLE pixels.\n\t\t\t\t\tif (c & 0x80) {\n\t\t\t\t\t\t// Bind pixel tmp array\n\t\t\t\t\t\tfor (i = 0; i < pixel_size; ++i) {\n\t\t\t\t\t\t\tpixels[i] = data[offset++];\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Copy pixel array\n\t\t\t\t\t\tfor (i = 0; i < count; ++i) {\n\t\t\t\t\t\t\tpixel_data.set(pixels, shift + i * pixel_size);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tshift += pixel_size * count;\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// Raw pixels.\n\t\t\t\t\t\tcount *= pixel_size;\n\t\t\t\t\t\tfor (i = 0; i < count; ++i) {\n\t\t\t\t\t\t\tpixel_data[shift + i] = data[offset++];\n\t\t\t\t\t\t}\n\t\t\t\t\t\tshift += count;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// RAW Pixels\n\t\t\t\tpixel_data = data.subarray(\n\t\t\t\t\toffset, offset += (use_pal ? header.width * header.height : pixel_total)\n\t\t\t\t);\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tpixel_data: pixel_data,\n\t\t\t\tpalettes: palettes\n\t\t\t};\n\t\t}\n\n\t\tfunction tgaGetImageData8bits(imageData, y_start, y_step, y_end, x_start, x_step, x_end, image, palettes) {\n\t\t\tconst colormap = palettes;\n\t\t\tlet color, i = 0, x, y;\n\t\t\tconst width = header.width;\n\n\t\t\tfor (y = y_start; y !== y_end; y += y_step) {\n\t\t\t\tfor (x = x_start; x !== x_end; x += x_step, i++) {\n\t\t\t\t\tcolor = image[i];\n\t\t\t\t\timageData[(x + width * y) * 4 + 3] = 255;\n\t\t\t\t\timageData[(x + width * y) * 4 + 2] = colormap[(color * 3) + 0];\n\t\t\t\t\timageData[(x + width * y) * 4 + 1] = colormap[(color * 3) + 1];\n\t\t\t\t\timageData[(x + width * y) * 4 + 0] = colormap[(color * 3) + 2];\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn imageData;\n\t\t}\n\n\t\tfunction tgaGetImageData16bits(imageData, y_start, y_step, y_end, x_start, x_step, x_end, image) {\n\t\t\tlet color, i = 0, x, y;\n\t\t\tconst width = header.width;\n\n\t\t\tfor (y = y_start; y !== y_end; y += y_step) {\n\t\t\t\tfor (x = x_start; x !== x_end; x += x_step, i += 2) {\n\t\t\t\t\tcolor = image[i + 0] + (image[i + 1] << 8);\n\t\t\t\t\timageData[(x + width * y) * 4 + 0] = (color & 0x7C00) >> 7;\n\t\t\t\t\timageData[(x + width * y) * 4 + 1] = (color & 0x03E0) >> 2;\n\t\t\t\t\timageData[(x + width * y) * 4 + 2] = (color & 0x001F) >> 3;\n\t\t\t\t\timageData[(x + width * y) * 4 + 3] = (color & 0x8000) ? 0 : 255;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn imageData;\n\t\t}\n\n\t\tfunction tgaGetImageData24bits(imageData, y_start, y_step, y_end, x_start, x_step, x_end, image) {\n\t\t\tlet i = 0, x, y;\n\t\t\tconst width = header.width;\n\n\t\t\tfor (y = y_start; y !== y_end; y += y_step) {\n\t\t\t\tfor (x = x_start; x !== x_end; x += x_step, i += 3) {\n\t\t\t\t\timageData[(x + width * y) * 4 + 3] = 255;\n\t\t\t\t\timageData[(x + width * y) * 4 + 2] = image[i + 0];\n\t\t\t\t\timageData[(x + width * y) * 4 + 1] = image[i + 1];\n\t\t\t\t\timageData[(x + width * y) * 4 + 0] = image[i + 2];\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn imageData;\n\t\t}\n\n\t\tfunction tgaGetImageData32bits(imageData, y_start, y_step, y_end, x_start, x_step, x_end, image) {\n\t\t\tlet i = 0, x, y;\n\t\t\tconst width = header.width;\n\n\t\t\tfor (y = y_start; y !== y_end; y += y_step) {\n\t\t\t\tfor (x = x_start; x !== x_end; x += x_step, i += 4) {\n\t\t\t\t\timageData[(x + width * y) * 4 + 2] = image[i + 0];\n\t\t\t\t\timageData[(x + width * y) * 4 + 1] = image[i + 1];\n\t\t\t\t\timageData[(x + width * y) * 4 + 0] = image[i + 2];\n\t\t\t\t\timageData[(x + width * y) * 4 + 3] = image[i + 3];\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn imageData;\n\t\t}\n\n\t\tfunction tgaGetImageDataGrey8bits(imageData, y_start, y_step, y_end, x_start, x_step, x_end, image) {\n\t\t\tlet color, i = 0, x, y;\n\t\t\tconst width = header.width;\n\n\t\t\tfor (y = y_start; y !== y_end; y += y_step) {\n\t\t\t\tfor (x = x_start; x !== x_end; x += x_step, i++) {\n\t\t\t\t\tcolor = image[i];\n\t\t\t\t\timageData[(x + width * y) * 4 + 0] = color;\n\t\t\t\t\timageData[(x + width * y) * 4 + 1] = color;\n\t\t\t\t\timageData[(x + width * y) * 4 + 2] = color;\n\t\t\t\t\timageData[(x + width * y) * 4 + 3] = 255;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn imageData;\n\t\t}\n\n\t\tfunction tgaGetImageDataGrey16bits(imageData, y_start, y_step, y_end, x_start, x_step, x_end, image) {\n\t\t\tlet i = 0, x, y;\n\t\t\tconst width = header.width;\n\n\t\t\tfor (y = y_start; y !== y_end; y += y_step) {\n\t\t\t\tfor (x = x_start; x !== x_end; x += x_step, i += 2) {\n\t\t\t\t\timageData[(x + width * y) * 4 + 0] = image[i + 0];\n\t\t\t\t\timageData[(x + width * y) * 4 + 1] = image[i + 0];\n\t\t\t\t\timageData[(x + width * y) * 4 + 2] = image[i + 0];\n\t\t\t\t\timageData[(x + width * y) * 4 + 3] = image[i + 1];\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn imageData;\n\t\t}\n\n\t\tfunction getTgaRGBA(data, width, height, image, palette) {\n\t\t\tlet x_start,\n\t\t\t\ty_start,\n\t\t\t\tx_step,\n\t\t\t\ty_step,\n\t\t\t\tx_end,\n\t\t\t\ty_end;\n\n\t\t\tswitch ((header.flags & TGA_ORIGIN_MASK) >> TGA_ORIGIN_SHIFT) {\n\t\t\t\tcase TGA_ORIGIN_BL:\n\t\t\t\t\tx_start = 0;\n\t\t\t\t\tx_step = 1;\n\t\t\t\t\tx_end = width;\n\t\t\t\t\ty_start = height - 1;\n\t\t\t\t\ty_step = -1;\n\t\t\t\t\ty_end = -1;\n\t\t\t\t\tbreak;\n\t\t\t\tcase TGA_ORIGIN_UR:\n\t\t\t\t\tx_start = width - 1;\n\t\t\t\t\tx_step = -1;\n\t\t\t\t\tx_end = -1;\n\t\t\t\t\ty_start = 0;\n\t\t\t\t\ty_step = 1;\n\t\t\t\t\ty_end = height;\n\t\t\t\t\tbreak;\n\t\t\t\tcase TGA_ORIGIN_BR:\n\t\t\t\t\tx_start = width - 1;\n\t\t\t\t\tx_step = -1;\n\t\t\t\t\tx_end = -1;\n\t\t\t\t\ty_start = height - 1;\n\t\t\t\t\ty_step = -1;\n\t\t\t\t\ty_end = -1;\n\t\t\t\t\tbreak;\n\t\t\t\tcase TGA_ORIGIN_UL:\n\t\t\t\tdefault:\n\t\t\t\t\tx_start = 0;\n\t\t\t\t\tx_step = 1;\n\t\t\t\t\tx_end = width;\n\t\t\t\t\ty_start = 0;\n\t\t\t\t\ty_step = 1;\n\t\t\t\t\ty_end = height;\n\t\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tif (use_grey) {\n\t\t\t\tswitch (header.pixel_size) {\n\t\t\t\t\tcase 8:\n\t\t\t\t\t\ttgaGetImageDataGrey8bits(data, y_start, y_step, y_end, x_start, x_step, x_end, image);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 16:\n\t\t\t\t\t\ttgaGetImageDataGrey16bits(data, y_start, y_step, y_end, x_start, x_step, x_end, image);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tconsole.error('TGALoader: Format not supported.');\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tswitch (header.pixel_size) {\n\t\t\t\t\tcase 8:\n\t\t\t\t\t\ttgaGetImageData8bits(data, y_start, y_step, y_end, x_start, x_step, x_end, image, palette);\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 16:\n\t\t\t\t\t\ttgaGetImageData16bits(data, y_start, y_step, y_end, x_start, x_step, x_end, image);\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 24:\n\t\t\t\t\t\ttgaGetImageData24bits(data, y_start, y_step, y_end, x_start, x_step, x_end, image);\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 32:\n\t\t\t\t\t\ttgaGetImageData32bits(data, y_start, y_step, y_end, x_start, x_step, x_end, image);\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tconsole.error('TGALoader: Format not supported.');\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Load image data according to specific method\n\t\t\t// const func = 'tgaGetImageData' + (use_grey ? 'Grey' : '') + (header.pixel_size) + 'bits';\n\t\t\t// func(data, y_start, y_step, y_end, x_start, x_step, x_end, width, image, palette );\n\t\t\treturn data;\n\t\t}\n\n\t\t// TGA Constants\n\n\t\tconst TGA_TYPE_NO_DATA = 0,\n\t\t\tTGA_TYPE_INDEXED = 1,\n\t\t\tTGA_TYPE_RGB = 2,\n\t\t\tTGA_TYPE_GREY = 3,\n\t\t\tTGA_TYPE_RLE_INDEXED = 9,\n\t\t\tTGA_TYPE_RLE_RGB = 10,\n\t\t\tTGA_TYPE_RLE_GREY = 11,\n\n\t\t\tTGA_ORIGIN_MASK = 0x30,\n\t\t\tTGA_ORIGIN_SHIFT = 0x04,\n\t\t\tTGA_ORIGIN_BL = 0x00,\n\t\t\tTGA_ORIGIN_BR = 0x01,\n\t\t\tTGA_ORIGIN_UL = 0x02,\n\t\t\tTGA_ORIGIN_UR = 0x03;\n\n\t\tif (buffer.length < 19) {\n\t\t\tconsole.error('TGALoader: Not enough data to contain header.');\n\t\t}\n\n\t\tlet offset = 0;\n\n\t\tconst content = new Uint8Array(buffer),\n\t\t\theader = {\n\t\t\t\tid_length: content[offset++],\n\t\t\t\tcolormap_type: content[offset++],\n\t\t\t\timage_type: content[offset++],\n\t\t\t\tcolormap_index: content[offset++] | content[offset++] << 8,\n\t\t\t\tcolormap_length: content[offset++] | content[offset++] << 8,\n\t\t\t\tcolormap_size: content[offset++],\n\t\t\t\torigin: [\n\t\t\t\t\tcontent[offset++] | content[offset++] << 8,\n\t\t\t\t\tcontent[offset++] | content[offset++] << 8\n\t\t\t\t],\n\t\t\t\twidth: content[offset++] | content[offset++] << 8,\n\t\t\t\theight: content[offset++] | content[offset++] << 8,\n\t\t\t\tpixel_size: content[offset++],\n\t\t\t\tflags: content[offset++]\n\t\t\t};\n\n\t\t// Check tga if it is valid format\n\t\ttgaCheckHeader(header);\n\n\t\tif (header.id_length + offset > buffer.length) {\n\t\t\tconsole.error('TGALoader: No data.');\n\t\t}\n\n\t\t// Skip the needn't data\n\t\toffset += header.id_length;\n\n\t\t// Get targa information about RLE compression and palette\n\t\tlet use_rle = false,\n\t\t\tuse_pal = false,\n\t\t\tuse_grey = false;\n\n\t\tswitch (header.image_type) {\n\t\t\tcase TGA_TYPE_RLE_INDEXED:\n\t\t\t\tuse_rle = true;\n\t\t\t\tuse_pal = true;\n\t\t\t\tbreak;\n\t\t\tcase TGA_TYPE_INDEXED:\n\t\t\t\tuse_pal = true;\n\t\t\t\tbreak;\n\t\t\tcase TGA_TYPE_RLE_RGB:\n\t\t\t\tuse_rle = true;\n\t\t\t\tbreak;\n\t\t\tcase TGA_TYPE_RGB:\n\t\t\t\tbreak;\n\t\t\tcase TGA_TYPE_RLE_GREY:\n\t\t\t\tuse_rle = true;\n\t\t\t\tuse_grey = true;\n\t\t\t\tbreak;\n\t\t\tcase TGA_TYPE_GREY:\n\t\t\t\tuse_grey = true;\n\t\t\t\tbreak;\n\t\t}\n\n\t\tconst imageData = new Uint8Array(header.width * header.height * 4);\n\n\t\tconst result = tgaParse(use_rle, use_pal, header, offset, content);\n\t\tgetTgaRGBA(imageData, header.width, header.height, result.pixel_data, result.palettes);\n\n\t\treturn {\n\t\t\tdata: imageData,\n\t\t\twidth: header.width,\n\t\t\theight: header.height,\n\t\t\tflipY: true,\n\t\t\tgenerateMipmaps: true,\n\t\t\tminFilter: TEXTURE_FILTER.LINEAR_MIPMAP_LINEAR\n\t\t};\n\t}\n\n}\n\nclass TGATexture2DLoader extends TGALoader {\n\n\tload(url, onLoad, onProgress, onError) {\n\t\tconst texture = new Texture2D();\n\n\t\tsuper.load(url, textureData => {\n\t\t\tconst { data, width, height, flipY, generateMipmaps, minFilter } = textureData;\n\n\t\t\ttexture.image = { data, width, height };\n\n\t\t\ttexture.flipY = flipY;\n\t\t\ttexture.generateMipmaps = generateMipmaps;\n\t\t\ttexture.minFilter = minFilter;\n\n\t\t\ttexture.version++;\n\n\t\t\tonLoad && onLoad(texture);\n\t\t}, onProgress, onError);\n\n\t\treturn texture;\n\t}\n\n}\n\nclass TGATextureCubeLoader extends TGALoader {\n\n\tload(urls, onLoad, _onProgress, onError) {\n\t\tconst texture = new TextureCube();\n\n\t\tconst promiseArray = [];\n\t\tfor (let i = 0; i < 6; i++) {\n\t\t\tpromiseArray.push(new Promise((resolve, reject) => {\n\t\t\t\tsuper.load(urls[i], resolve, undefined, reject);\n\t\t\t}));\n\t\t}\n\n\t\tPromise.all(promiseArray).then(textureDatas => {\n\t\t\tfor (let i = 0; i < 6; i++) {\n\t\t\t\ttexture.images.push({\n\t\t\t\t\tdata: textureDatas[i].data,\n\t\t\t\t\twidth: textureDatas[i].width,\n\t\t\t\t\theight: textureDatas[i].height\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tconst { generateMipmaps, minFilter } = textureDatas[0];\n\n\t\t\ttexture.generateMipmaps = generateMipmaps;\n\t\t\ttexture.minFilter = minFilter;\n\n\t\t\ttexture.version++;\n\n\t\t\tonLoad && onLoad(texture);\n\t\t}).catch(e => {\n\t\t\tonError && onError(e);\n\t\t});\n\n\t\treturn texture;\n\t}\n\n}\n\nexport { TGALoader, TGATexture2DLoader, TGATextureCubeLoader };"
  },
  {
    "path": "examples/jsm/loaders/Texture2DLoader.js",
    "content": "import { Loader, ImageLoader, Texture2D } from 't3d';\n\nclass Texture2DLoader extends Loader {\n\n\tconstructor(manager) {\n\t\tsuper(manager);\n\t}\n\n\tload(url, onLoad, onProgress, onError) {\n\t\tconst texture = new Texture2D();\n\n\t\tconst loader = new ImageLoader(this.manager);\n\t\tloader.setCrossOrigin(this.crossOrigin);\n\t\tloader.setPath(this.path);\n\n\t\tloader.load(url, function(image) {\n\t\t\ttexture.image = image;\n\t\t\ttexture.version++;\n\n\t\t\tif (onLoad) onLoad(texture);\n\t\t}, onProgress, onError);\n\n\t\treturn texture;\n\t}\n\n}\n\nexport { Texture2DLoader };"
  },
  {
    "path": "examples/jsm/loaders/TextureCubeLoader.js",
    "content": "import { Loader, ImageLoader, TextureCube } from 't3d';\n\nclass TextureCubeLoader extends Loader {\n\n\tconstructor(manager) {\n\t\tsuper(manager);\n\t}\n\n\tload(urls, onLoad, _onProgress, onError) {\n\t\tconst texture = new TextureCube();\n\n\t\tconst loader = new ImageLoader(this.manager);\n\t\tloader.setCrossOrigin(this.crossOrigin);\n\t\tloader.setPath(this.path);\n\n\t\tconst promiseArray = [];\n\t\tfor (let i = 0; i < 6; i++) {\n\t\t\tpromiseArray.push(loader.loadAsync(urls[i]));\n\t\t}\n\n\t\tPromise.all(promiseArray).then(function(images) {\n\t\t\ttexture.images = images;\n\t\t\ttexture.version++;\n\n\t\t\tif (onLoad) onLoad(texture);\n\t\t}).catch(function(e) {\n\t\t\tif (onError) onError(e);\n\t\t});\n\n\t\treturn texture;\n\t}\n\n}\n\nexport { TextureCubeLoader };"
  },
  {
    "path": "examples/jsm/loaders/glTF/Constants.js",
    "content": "import {\n\tTEXTURE_FILTER,\n\tTEXTURE_WRAP\n} from 't3d';\n\nexport const ATTRIBUTES = {\n\tPOSITION: 'a_Position',\n\tNORMAL: 'a_Normal',\n\tTANGENT: 'a_Tangent',\n\tTEXCOORD_0: 'a_Uv',\n\tTEXCOORD_1: 'a_Uv2',\n\tTEXCOORD_2: 'a_Uv3',\n\tTEXCOORD_3: 'a_Uv4',\n\tTEXCOORD_4: 'a_Uv5',\n\tTEXCOORD_5: 'a_Uv6',\n\tTEXCOORD_6: 'a_Uv7',\n\tTEXCOORD_7: 'a_Uv8',\n\tCOLOR_0: 'a_Color',\n\tWEIGHTS_0: 'skinWeight',\n\tJOINTS_0: 'skinIndex',\n\n\tTEXCOORD0: 'a_Uv', // deprecated\n\tTEXCOORD: 'a_Uv', // deprecated\n\tCOLOR0: 'a_Color', // deprecated\n\tCOLOR: 'a_Color', // deprecated\n\tWEIGHT: 'skinWeight', // deprecated\n\tJOINT: 'skinIndex' // deprecated\n};\n\nexport const ALPHA_MODES = {\n\tOPAQUE: 'OPAQUE',\n\tMASK: 'MASK',\n\tBLEND: 'BLEND'\n};\n\nexport const ACCESSOR_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\nexport const ACCESSOR_COMPONENT_TYPES = {\n\t5120: Int8Array,\n\t5121: Uint8Array,\n\t5122: Int16Array,\n\t5123: Uint16Array,\n\t5125: Uint32Array,\n\t5126: Float32Array\n};\n\nexport const WEBGL_FILTERS = {\n\t9728: TEXTURE_FILTER.NEAREST,\n\t9729: TEXTURE_FILTER.LINEAR,\n\t9984: TEXTURE_FILTER.NEAREST_MIPMAP_NEAREST,\n\t9985: TEXTURE_FILTER.LINEAR_MIPMAP_NEAREST,\n\t9986: TEXTURE_FILTER.NEAREST_MIPMAP_LINEAR,\n\t9987: TEXTURE_FILTER.LINEAR_MIPMAP_LINEAR\n};\n\nexport const WEBGL_WRAPPINGS = {\n\t33071: TEXTURE_WRAP.CLAMP_TO_EDGE,\n\t33648: TEXTURE_WRAP.MIRRORED_REPEAT,\n\t10497: TEXTURE_WRAP.REPEAT\n};\n\nexport const WEBGL_DRAW_MODES = {\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};"
  },
  {
    "path": "examples/jsm/loaders/glTF/GLTFLoader.js",
    "content": "import { DefaultLoadingManager, FileLoader, ImageLoader } from 't3d';\n\nimport { ImageBitmapLoader } from '../ImageBitmapLoader.js';\nimport { IndexParser } from './parsers/IndexParser.js';\nimport { ReferenceParser } from './parsers/ReferenceParser.js';\nimport { Validator } from './parsers/Validator.js';\nimport { BufferParser } from './parsers/BufferParser.js';\nimport { BufferViewParser } from './parsers/BufferViewParser.js';\nimport { ImageParser } from './parsers/ImageParser.js';\nimport { TextureParser } from './parsers/TextureParser.js';\nimport { MaterialParser } from './parsers/MaterialParser.js';\nimport { AccessorParser } from './parsers/AccessorParser.js';\nimport { PrimitiveParser } from './parsers/PrimitiveParser.js';\nimport { NodeParser } from './parsers/NodeParser.js';\nimport { SkinParser } from './parsers/SkinParser.js';\nimport { SceneParser } from './parsers/SceneParser.js';\nimport { AnimationParser } from './parsers/AnimationParser.js';\n\nimport { GLTFResource } from './GLTFResource.js';\nimport { GLTFUtils } from './GLTFUtils.js';\n\nimport { EXT_meshopt_compression } from './extensions/EXT_meshopt_compression.js';\nimport { KHR_draco_mesh_compression } from './extensions/KHR_draco_mesh_compression.js';\nimport { KHR_lights_punctual } from './extensions/KHR_lights_punctual.js';\nimport { KHR_materials_clearcoat } from './extensions/KHR_materials_clearcoat.js';\nimport { KHR_materials_pbrSpecularGlossiness } from './extensions/KHR_materials_pbrSpecularGlossiness.js';\nimport { KHR_materials_unlit } from './extensions/KHR_materials_unlit.js';\nimport { KHR_texture_basisu } from './extensions/KHR_texture_basisu.js';\nimport { KHR_texture_transform } from './extensions/KHR_texture_transform.js';\nimport { KHR_animation_pointer } from './extensions/KHR_animation_pointer.js';\n\nconst DefaultParsePipeline = [\n\tIndexParser,\n\tReferenceParser,\n\tValidator,\n\tBufferParser,\n\tBufferViewParser,\n\tImageParser,\n\tTextureParser,\n\tMaterialParser,\n\tAccessorParser,\n\tPrimitiveParser,\n\tNodeParser,\n\tSkinParser,\n\tSceneParser,\n\tAnimationParser\n];\n\nconst DefaultExtensions = new Map([\n\t['EXT_meshopt_compression', EXT_meshopt_compression],\n\t['KHR_draco_mesh_compression', KHR_draco_mesh_compression],\n\t['KHR_lights_punctual', KHR_lights_punctual],\n\t['KHR_materials_clearcoat', KHR_materials_clearcoat],\n\t['KHR_materials_pbrSpecularGlossiness', KHR_materials_pbrSpecularGlossiness],\n\t['KHR_materials_unlit', KHR_materials_unlit],\n\t['KHR_mesh_quantization', {}], // This is supported by default\n\t['KHR_texture_basisu', KHR_texture_basisu],\n\t['KHR_texture_transform', KHR_texture_transform],\n\t['KHR_animation_pointer', KHR_animation_pointer]\n]);\n\nexport class GLTFLoader {\n\n\tconstructor(manager = DefaultLoadingManager, parsers = DefaultParsePipeline, extensions = DefaultExtensions) {\n\t\tthis.manager = manager;\n\n\t\t// If ture, loading manager will dispatch progress for every buffer and image.\n\t\t// otherwise, loading manager will only dispatch progress for the whole gltf resource.\n\t\tthis.detailLoadProgress = true;\n\n\t\t// If set false, need add Promise.catch to catch errors.\n\t\tthis.autoLogError = true;\n\n\t\tthis.extensions = new Map(extensions);\n\n\t\t// Indicate which extensions can be parsed in a uniform way.\n\t\tthis.autoParseConfig = {\n\t\t\tmaterials: ['KHR_materials_clearcoat', 'KHR_materials_pbrSpecularGlossiness', 'KHR_materials_unlit', 'KHR_materials_transmission', 'KHR_materials_ior', 'KHR_materials_volume', 'KHR_materials_dispersion']\n\t\t};\n\n\t\tthis._parsers = parsers.slice(0);\n\n\t\tthis._dracoLoader = null;\n\t\tthis._meshoptDecoder = null;\n\t\tthis._ktx2Loader = null;\n\n\t\tthis._fileLoader = new FileLoader();\n\n\t\tconst userAgent = navigator.userAgent;\n\n\t\tconst isSafari = /^((?!chrome|android).)*safari/i.test(userAgent) === true;\n\t\tconst safariMatch = userAgent.match(/Version\\/(\\d+)/);\n\t\tconst safariVersion = isSafari && safariMatch ? parseInt(safariMatch[1], 10) : -1;\n\n\t\tconst isFirefox = userAgent.indexOf('Firefox') > -1;\n\t\tconst firefoxVersion = isFirefox ? userAgent.match(/Firefox\\/([0-9]+)\\./)[1] : -1;\n\n\t\tif (typeof createImageBitmap === 'undefined' || (isSafari && safariVersion < 17) || (isFirefox && firefoxVersion < 98)) {\n\t\t\tthis._imageLoader = new ImageLoader();\n\t\t} else {\n\t\t\tthis._imageLoader = new ImageBitmapLoader();\n\t\t}\n\t}\n\n\tload(url, options = {}) {\n\t\tthis.manager.itemStart(url);\n\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tconst resource = new GLTFResource();\n\t\t\tresource.url = url;\n\t\t\tresource.path = GLTFUtils.extractUrlBase(url);\n\t\t\tresource.options = options;\n\n\t\t\tthis._parse(resource)\n\t\t\t\t.then(resolve)\n\t\t\t\t.then(() => this.manager.itemEnd(url))\n\t\t\t\t.catch(e => {\n\t\t\t\t\tif (this.autoLogError) {\n\t\t\t\t\t\tconsole.error(e);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (this.detailLoadProgress && resource.loadItems) {\n\t\t\t\t\t\tresource.loadItems.forEach(item => {\n\t\t\t\t\t\t\tthis.manager.itemEnd(item);\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.manager.itemError(url);\n\t\t\t\t\tthis.manager.itemEnd(url);\n\n\t\t\t\t\treject(`Error loading glTF model from ${url} .`);\n\t\t\t\t});\n\t\t});\n\t}\n\n\t_parse(context) {\n\t\tlet lastParser;\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tthis._parsers.forEach(parser => {\n\t\t\t\tif (lastParser) {\n\t\t\t\t\tlastParser = lastParser.then(() => parser.parse(context, this));\n\t\t\t\t} else {\n\t\t\t\t\tlastParser = parser.parse(context, this);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tif (lastParser) {\n\t\t\t\tlastParser.then(() => resolve(context)).catch(reject);\n\t\t\t} else {\n\t\t\t\tresolve(context);\n\t\t\t}\n\t\t});\n\t}\n\n\tsetDRACOLoader(dracoLoader) {\n\t\tthis._dracoLoader = dracoLoader;\n\t\treturn this;\n\t}\n\n\tgetDRACOLoader() {\n\t\treturn this._dracoLoader;\n\t}\n\n\tsetMeshoptDecoder(meshoptDecoder) {\n\t\tthis._meshoptDecoder = meshoptDecoder;\n\t\treturn this;\n\t}\n\tgetMeshoptDecoder() {\n\t\treturn this._meshoptDecoder;\n\t}\n\n\tsetKTX2Loader(ktx2Loader) {\n\t\tthis._ktx2Loader = ktx2Loader;\n\t\treturn this;\n\t}\n\tgetKTX2Loader() {\n\t\treturn this._ktx2Loader;\n\t}\n\n\tloadFile(url, type = 'json') {\n\t\tthis._fileLoader.setResponseType(type);\n\n\t\treturn new Promise((resolve, reject) => {\n\t\t\turl = this.manager.resolveURL(url);\n\t\t\tthis._fileLoader.load(url, resolve, undefined, reject);\n\t\t});\n\t}\n\n\tloadImage(url) {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\turl = this.manager.resolveURL(url);\n\t\t\tthis._imageLoader.load(url, resolve, undefined, reject);\n\t\t});\n\t}\n\n\tinsertParser(parser, index) {\n\t\tthis._parsers.splice(index, 0, parser);\n\t}\n\n\treplaceParser(parser, index) {\n\t\tthis._parsers.splice(index, 1, parser);\n\t}\n\n}"
  },
  {
    "path": "examples/jsm/loaders/glTF/GLTFResource.js",
    "content": "let resourceId = 0;\n\nexport class GLTFResource {\n\n\tconstructor() {\n\t\tthis.id = ++resourceId;\n\t\tthis.url = ''; // url string\n\t\tthis.path = ''; // path string\n\t\tthis.options = null; // load options\n\t\tthis.gltf = null; // gltf json after IndexParser\n\t\tthis.loadItems = null; // String[] after IndexParser. Store all urls that need to load.\n\t\tthis.buffers = null; // ArrayBuffer[] after BufferParser\n\t\tthis.bufferViews = null; // ArrayBuffer[] after BufferViewParser\n\t\tthis.images = null; // Image[] after ImageParser\n\t\tthis.textures = null; // Texture2D[] after TextureParser\n\t\tthis.materials = null; // Material[] after MaterialParser\n\t\tthis.accessors = null; // Attribute[] after AccessorParser\n\t\tthis.primitives = null; // { mode, geometry, material, weights, skinned }[] after PrimitiveParser\n\t\tthis.nodes = null; // Object3D[] after NodeParser\n\t\tthis.cameras = null; // Camera[] after NodeParser\n\t\tthis.lights = null; // Light[] after NodeParser\n\t\tthis.skins = null; // Skeleton[] after SkinParser\n\t\tthis.root = null; // root after SceneParser\n\t\tthis.roots = null; // root[] after SceneParser\n\t\tthis.animations = null; // KeyframeClip[] after AnimationParser\n\t}\n\n}\n"
  },
  {
    "path": "examples/jsm/loaders/glTF/GLTFUtils.js",
    "content": "import { Vector4 } from 't3d';\n\nconst _vec4_1 = new Vector4();\n\nexport class GLTFUtils {\n\n\tconstructor() {}\n\n\tstatic extractUrlBase(url) {\n\t\tconst parts = url.split('/');\n\t\tparts.pop();\n\t\treturn (parts.length < 1 ? '.' : parts.join('/')) + '/';\n\t}\n\n\t// url: aa.bin ;  path:example/resource/model/     (for example)example/resource/model/aa.bin\n\tstatic resolveURL(url, path) {\n\t\t// Invalid URL\n\t\tif (typeof url !== 'string' || url === '') return '';\n\n\t\t// Absolute URL http://,https://,//\n\t\tif (/^(https?:)?\\/\\//i.test(url)) return url;\n\n\t\t// Data URI\n\t\tif (/^data:/i.test(url)) return url;\n\n\t\t// Blob URL\n\t\tif (/^blob:/i.test(url)) return url;\n\n\t\t// Relative URL\n\t\treturn path + url;\n\t}\n\n\tstatic decodeText(array) {\n\t\tif (typeof TextDecoder !== 'undefined') {\n\t\t\treturn new TextDecoder().decode(array);\n\t\t}\n\n\t\t// Avoid the String.fromCharCode.apply(null, array) shortcut, which\n\t\t// throws a \"maximum call stack size exceeded\" error for large arrays.\n\n\t\tlet s = '';\n\n\t\tfor (let i = 0, il = array.length; i < il; i++) {\n\t\t\t// Implicitly assumes little-endian.\n\t\t\ts += String.fromCharCode(array[i]);\n\t\t}\n\n\t\ttry {\n\t\t\t// merges multi-byte utf-8 characters.\n\n\t\t\treturn decodeURIComponent(escape(s));\n\t\t} catch (e) { // see #16358\n\t\t\treturn s;\n\t\t}\n\t}\n\n\tstatic parseGLB(glb) {\n\t\tconst UINT32_LENGTH = 4;\n\t\tconst GLB_HEADER_MAGIC = 0x46546C67; // 'glTF'\n\t\tconst GLB_HEADER_LENGTH = 12;\n\t\tconst GLB_CHUNK_TYPES = { JSON: 0x4E4F534A, BIN: 0x004E4942 };\n\n\t\tconst dataView = new DataView(glb);\n\n\t\tconst header = {\n\t\t\tmagic: dataView.getUint32(0, true),\n\t\t\tversion: dataView.getUint32(UINT32_LENGTH, true),\n\t\t\tlength: dataView.getUint32(2 * UINT32_LENGTH, true)\n\t\t};\n\n\t\tif (header.magic !== GLB_HEADER_MAGIC) {\n\t\t\tconsole.error('Invalid glb magic number. Expected 0x46546C67, found 0x' + header.magic.toString(16));\n\t\t\treturn null;\n\t\t} else if (header.version < 2.0) {\n\t\t\tconsole.error('GLTFLoader: Legacy binary file detected.');\n\t\t}\n\n\t\tlet chunkLength = dataView.getUint32(GLB_HEADER_LENGTH, true);\n\t\tlet chunkType = dataView.getUint32(GLB_HEADER_LENGTH + UINT32_LENGTH, true);\n\n\t\tif (chunkType !== GLB_CHUNK_TYPES.JSON) {\n\t\t\tconsole.error('Invalid glb chunk type. Expected 0x4E4F534A, found 0x' + chunkType.toString(16));\n\t\t\treturn null;\n\t\t}\n\n\t\tconst glTFData = new Uint8Array(glb, GLB_HEADER_LENGTH + 2 * UINT32_LENGTH, chunkLength);\n\t\tconst gltf = JSON.parse(GLTFUtils.decodeText(glTFData));\n\n\t\tconst buffers = [];\n\t\tlet byteOffset = GLB_HEADER_LENGTH + 2 * UINT32_LENGTH + chunkLength;\n\n\t\twhile (byteOffset < header.length) {\n\t\t\tchunkLength = dataView.getUint32(byteOffset, true);\n\t\t\tchunkType = dataView.getUint32(byteOffset + UINT32_LENGTH, true);\n\n\t\t\tif (chunkType !== GLB_CHUNK_TYPES.BIN) {\n\t\t\t\tconsole.error('Invalid glb chunk type. Expected 0x004E4942, found 0x' + chunkType.toString(16));\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tconst currentOffset = byteOffset + 2 * UINT32_LENGTH;\n\t\t\tconst buffer = glb.slice(currentOffset, currentOffset + chunkLength);\n\t\t\tbuffers.push(buffer);\n\n\t\t\tbyteOffset += chunkLength + 2 * UINT32_LENGTH;\n\t\t}\n\n\t\treturn { gltf, buffers };\n\t}\n\n\t// Reference: github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_mesh_quantization#encoding-quantized-data\n\tstatic getNormalizedComponentScale(constructor) {\n\t\tif (constructor === Int8Array) {\n\t\t\treturn 1 / 127;\n\t\t} else if (constructor === Uint8Array) {\n\t\t\treturn 1 / 255;\n\t\t} else if (constructor === Int16Array) {\n\t\t\treturn 1 / 32767;\n\t\t} else if (constructor === Uint16Array) {\n\t\t\treturn 1 / 65535;\n\t\t} else {\n\t\t\tthrow new Error('Unsupported normalized accessor component type.');\n\t\t}\n\t}\n\n\tstatic normalizeSkinWeights(skinWeight) {\n\t\tconst offset = skinWeight.offset;\n\t\tconst buffer = skinWeight.buffer;\n\t\tconst stride = buffer.stride;\n\t\tfor (let i = 0, l = buffer.count; i < l; i++) {\n\t\t\t_vec4_1.fromArray(buffer.array, i * stride + offset);\n\t\t\tconst scale = 1.0 / _vec4_1.getManhattanLength();\n\t\t\tif (scale !== Infinity) {\n\t\t\t\t_vec4_1.multiplyScalar(scale);\n\t\t\t} else {\n\t\t\t\t_vec4_1.set(1, 0, 0, 0); // do something reasonable\n\t\t\t}\n\t\t\t_vec4_1.toArray(buffer.array, i * stride + offset);\n\t\t}\n\t}\n\n}"
  },
  {
    "path": "examples/jsm/loaders/glTF/extensions/EXT_mesh_gpu_instancing.js",
    "content": "import { Object3D, Mesh, SkinnedMesh, Matrix4, Vector3, Quaternion, Attribute, Buffer, MATERIAL_TYPE } from 't3d';\nimport { GLTFUtils } from '../GLTFUtils.js';\nimport { InstancedPBRMaterial, InstancedBasicMaterial } from '../../../materials/InstancedMaterial.js';\n\n/**\n * EXT_mesh_gpu_instancing\n * https://github.com/KhronosGroup/glTF/blob/main/extensions/2.0/Vendor/EXT_mesh_gpu_instancing/README.md\n */\nexport class EXT_mesh_gpu_instancing {\n\n\tstatic getInstancedMesh(context, gltfNode) {\n\t\tconst { primitives, accessors } = context;\n\n\t\tconst { mesh: meshID, skin: skinID, extensions } = gltfNode;\n\t\tconst { EXT_mesh_gpu_instancing } = extensions;\n\n\t\tconst meshes = primitives[meshID].map(primitive => {\n\t\t\tconst { geometry, material, weights } = primitive;\n\n\t\t\tconst instancedGeometry = geometry.clone();\n\t\t\tsetInstancedAttributes(instancedGeometry, EXT_mesh_gpu_instancing, accessors);\n\n\t\t\tlet instancedMaterial;\n\t\t\tif (material.type === MATERIAL_TYPE.BASIC) {\n\t\t\t\tinstancedMaterial = new InstancedBasicMaterial(material);\n\t\t\t} else {\n\t\t\t\tinstancedMaterial = new InstancedPBRMaterial(material);\n\t\t\t}\n\n\t\t\tlet mesh;\n\n\t\t\tif (skinID !== undefined) {\n\t\t\t\tmesh = new SkinnedMesh(instancedGeometry, instancedMaterial);\n\n\t\t\t\tif (geometry.attributes.skinWeight && !geometry.attributes.skinWeight.normalized) {\n\t\t\t\t\tGLTFUtils.normalizeSkinWeights(geometry.attributes.skinWeight);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tmesh = new Mesh(instancedGeometry, instancedMaterial);\n\n\t\t\t\tif (weights) {\n\t\t\t\t\tmesh.morphTargetInfluences = weights.slice();\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tmesh.frustumCulled = false;\n\n\t\t\treturn mesh;\n\t\t});\n\n\t\tif (meshes.length > 1) {\n\t\t\tconst parent = new Object3D();\n\t\t\tmeshes.forEach(mesh => parent.add(mesh));\n\t\t\treturn parent;\n\t\t} else {\n\t\t\treturn meshes[0];\n\t\t}\n\t}\n\n}\n\nconst m = new Matrix4();\nconst p = new Vector3();\nconst q = new Quaternion();\nconst s = new Vector3(1, 1, 1);\n\nfunction setInstancedAttributes(geometry, instancingDef, accessors) {\n\tconst { attributes: attributesDef } = instancingDef;\n\n\t// get instance count\n\t// all attributes should have the same count\n\tconst attributes = {};\n\tlet count = 0;\n\tfor (const key in attributesDef) {\n\t\tattributes[key] = accessors[attributesDef[key]];\n\t\tcount = attributes[key].buffer.count;\n\t}\n\n\tif (count < 1) return;\n\n\tconst matrices = new Array(count * 16);\n\n\tm.identity();\n\tp.set(0, 0, 0);\n\tq.set(0, 0, 0, 1);\n\ts.set(1, 1, 1);\n\n\tconst { TRANSLATION, ROTATION, SCALE } = attributes;\n\n\tfor (let i = 0; i < count; i++) {\n\t\tif (TRANSLATION) {\n\t\t\tp.fromArray(\n\t\t\t\tTRANSLATION.buffer.array,\n\t\t\t\ti * TRANSLATION.buffer.stride + TRANSLATION.offset,\n\t\t\t\tTRANSLATION.normalized\n\t\t\t);\n\t\t}\n\n\t\tif (ROTATION) {\n\t\t\tq.fromArray(\n\t\t\t\tROTATION.buffer.array,\n\t\t\t\ti * ROTATION.buffer.stride + ROTATION.offset,\n\t\t\t\tROTATION.normalized\n\t\t\t);\n\t\t}\n\n\t\tif (SCALE) {\n\t\t\ts.fromArray(\n\t\t\t\tSCALE.buffer.array,\n\t\t\t\ti * SCALE.buffer.stride + SCALE.offset,\n\t\t\t\tSCALE.normalized\n\t\t\t);\n\t\t}\n\n\t\tm.compose(p, q, s).toArray(matrices, i * 16);\n\t}\n\n\tconst instanceMatrixAttribute = new Attribute(new Buffer(new Float32Array(matrices), 16));\n\tinstanceMatrixAttribute.divisor = 1;\n\tgeometry.addAttribute('instanceMatrix', instanceMatrixAttribute);\n\n\tgeometry.instanceCount = count;\n\n\treturn geometry;\n}"
  },
  {
    "path": "examples/jsm/loaders/glTF/extensions/EXT_meshopt_compression.js",
    "content": "/**\n * meshopt BufferView Compression Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Vendor/EXT_meshopt_compression\n */\nexport class EXT_meshopt_compression {\n\n\tstatic loadBufferView(extensionDef, buffers, meshoptDecoder) {\n\t\tconst buffer = buffers[extensionDef.buffer];\n\n\t\tif (!meshoptDecoder || !meshoptDecoder.supported) {\n\t\t\tthrow new Error('GLTFLoader: setMeshoptDecoder must be called before loading compressed files.');\n\t\t}\n\n\t\tconst byteOffset = extensionDef.byteOffset || 0;\n\t\tconst byteLength = extensionDef.byteLength || 0;\n\n\t\tconst count = extensionDef.count;\n\t\tconst stride = extensionDef.byteStride;\n\n\t\tconst source = new Uint8Array(buffer, byteOffset, byteLength);\n\n\t\tif (meshoptDecoder.decodeGltfBufferAsync) {\n\t\t\treturn meshoptDecoder.decodeGltfBufferAsync(count, stride, source, extensionDef.mode, extensionDef.filter).then(res => res.buffer);\n\t\t} else {\n\t\t\t// Support for MeshoptDecoder 0.18 or earlier, without decodeGltfBufferAsync\n\t\t\treturn meshoptDecoder.ready.then(() => {\n\t\t\t\tconst result = new ArrayBuffer(count * stride);\n\t\t\t\tmeshoptDecoder.decodeGltfBuffer(new Uint8Array(result), count, stride, source, extensionDef.mode, extensionDef.filter);\n\t\t\t\treturn result;\n\t\t\t});\n\t\t}\n\t}\n\n}"
  },
  {
    "path": "examples/jsm/loaders/glTF/extensions/KHR_animation_pointer.js",
    "content": "import { QuaternionKeyframeTrack, NumberKeyframeTrack, VectorKeyframeTrack, ColorKeyframeTrack } from 't3d';\n\nexport class KHR_animation_pointer {\n\n\tstatic getTrackInfos(context, extensionDef, input, output, interpolation, trackInfos) {\n\t\tconst { pointer } = extensionDef;\n\n\t\tconst segments = pointer.replace(/^\\//, '').split('/');\n\n\t\tconst type = segments[0];\n\t\tconst index = parseInt(segments[1]);\n\t\tconst property = segments[segments.length - 1];\n\n\t\tconst searchArray = context[type];\n\n\t\tif (!searchArray) return;\n\n\t\tconst target = searchArray[index];\n\n\t\tif (!target) return;\n\n\t\tlet TypedKeyframeTrack, propertyPath,\n\t\t\tTypedKeyframeTrack2, propertyPath2;\n\n\t\tif (property === 'rotation') {\n\t\t\tTypedKeyframeTrack = QuaternionKeyframeTrack;\n\t\t\tpropertyPath = 'quaternion';\n\t\t} else if (property === 'weights') {\n\t\t\tTypedKeyframeTrack = NumberKeyframeTrack;\n\t\t\tpropertyPath = 'morphTargetInfluences';\n\t\t} else if (property === 'translation') {\n\t\t\tTypedKeyframeTrack = VectorKeyframeTrack;\n\t\t\tpropertyPath = 'position';\n\t\t} else if (property === 'scale') {\n\t\t\tTypedKeyframeTrack = VectorKeyframeTrack;\n\t\t\tpropertyPath = 'scale';\n\t\t} else if (property === 'baseColorFactor') {\n\t\t\tTypedKeyframeTrack = ColorKeyframeTrack;\n\t\t\tpropertyPath = 'diffuse';\n\t\t\tTypedKeyframeTrack2 = NumberKeyframeTrack;\n\t\t\tpropertyPath2 = 'opacity';\n\t\t} else if (property === 'metallicFactor') {\n\t\t\tTypedKeyframeTrack = NumberKeyframeTrack;\n\t\t\tpropertyPath = 'metalness';\n\t\t} else if (property === 'roughnessFactor') {\n\t\t\tTypedKeyframeTrack = NumberKeyframeTrack;\n\t\t\tpropertyPath = 'roughness';\n\t\t} else if (property === 'emissiveFactor') {\n\t\t\tTypedKeyframeTrack = VectorKeyframeTrack;\n\t\t\tpropertyPath = 'emissive';\n\t\t} else if (segments[segments.length - 2] === 'KHR_texture_transform') {\n\t\t\tTypedKeyframeTrack = VectorKeyframeTrack;\n\n\t\t\tconst textureProperty = segments[segments.length - 4];\n\t\t\tif (textureProperty === 'baseColorTexture') {\n\t\t\t\tpropertyPath = 'diffuseMapTransform.' + property;\n\t\t\t} else if (textureProperty === 'emissiveTexture') {\n\t\t\t\tpropertyPath = 'emissiveMapTransform.' + property;\n\t\t\t} else {\n\t\t\t\treturn;\n\t\t\t}\n\t\t} else {\n\t\t\treturn;\n\t\t}\n\n\t\tif (property === 'baseColorFactor') {\n\t\t\t// Separate the alpha channel from the color\n\t\t\tconst color3Output = new Float32Array(output.length / 4 * 3);\n\t\t\tconst alphaOutput = new Float32Array(output.length / 4);\n\t\t\tfor (let i = 0; i < output.length / 4; i++) {\n\t\t\t\tcolor3Output[i * 3] = output[i * 4];\n\t\t\t\tcolor3Output[i * 3 + 1] = output[i * 4 + 1];\n\t\t\t\tcolor3Output[i * 3 + 2] = output[i * 4 + 2];\n\t\t\t\talphaOutput[i] = output[i * 4 + 3];\n\t\t\t}\n\n\t\t\ttrackInfos.push({\n\t\t\t\tTypedKeyframeTrack,\n\t\t\t\ttarget,\n\t\t\t\tpropertyPath,\n\t\t\t\ttimes: input,\n\t\t\t\tvalues: color3Output,\n\t\t\t\tinterpolation\n\t\t\t});\n\n\t\t\ttrackInfos.push({\n\t\t\t\tTypedKeyframeTrack: TypedKeyframeTrack2,\n\t\t\t\ttarget,\n\t\t\t\tpropertyPath: propertyPath2,\n\t\t\t\ttimes: input,\n\t\t\t\tvalues: alphaOutput,\n\t\t\t\tinterpolation\n\t\t\t});\n\t\t} else {\n\t\t\ttrackInfos.push({\n\t\t\t\tTypedKeyframeTrack,\n\t\t\t\ttarget,\n\t\t\t\tpropertyPath,\n\t\t\t\ttimes: input,\n\t\t\t\tvalues: output,\n\t\t\t\tinterpolation\n\t\t\t});\n\t\t}\n\t}\n\n}"
  },
  {
    "path": "examples/jsm/loaders/glTF/extensions/KHR_draco_mesh_compression.js",
    "content": "import { ATTRIBUTES, ACCESSOR_COMPONENT_TYPES } from '../Constants.js';\n\n/**\n * KHR_draco_mesh_compression extension\n * https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_draco_mesh_compression\n */\nexport class KHR_draco_mesh_compression {\n\n\tstatic getGeometry(params, bufferViews, attributes, accessors, dracoLoader) {\n\t\tconst { bufferView: bufferViewIndex, attributes: gltfAttributeMap } = params;\n\n\t\tif (!dracoLoader) {\n\t\t\tthrow new Error('GLTFLoader: No DRACOLoader instance provided.');\n\t\t}\n\n\t\tconst attributeMap = {};\n\n\t\tfor (const attributeSemantic in gltfAttributeMap) {\n\t\t\tconst attributeName = ATTRIBUTES[attributeSemantic] === undefined ? attributeSemantic : ATTRIBUTES[attributeSemantic];\n\t\t\tattributeMap[attributeName] = gltfAttributeMap[attributeSemantic];\n\t\t}\n\n\t\tconst attributeNormalizedMap = {};\n\t\tconst attributeTypeMap = {};\n\n\t\tfor (const attributeNameItem in attributes) {\n\t\t\tconst attributeName = ATTRIBUTES[attributeNameItem] || attributeNameItem.toLowerCase();\n\n\t\t\tif (gltfAttributeMap[attributeNameItem] !== undefined) {\n\t\t\t\tconst accessorDef = accessors[attributes[attributeNameItem]];\n\t\t\t\tconst componentType = ACCESSOR_COMPONENT_TYPES[accessorDef.componentType];\n\n\t\t\t\tattributeTypeMap[attributeName] = componentType.name;\n\t\t\t\tattributeNormalizedMap[attributeName] = accessorDef.normalized === true;\n\t\t\t}\n\t\t}\n\n\t\tconst bufferView = bufferViews[bufferViewIndex];\n\n\t\treturn new Promise(function(resolve) {\n\t\t\tdracoLoader.decodeDracoFile(bufferView, function(geometry) {\n\t\t\t\tfor (const attributeName in geometry.attributes) {\n\t\t\t\t\tconst attribute = geometry.attributes[attributeName];\n\t\t\t\t\tconst normalized = attributeNormalizedMap[attributeName];\n\n\t\t\t\t\tif (normalized !== undefined) attribute.normalized = normalized;\n\t\t\t\t}\n\n\t\t\t\tresolve(geometry);\n\t\t\t}, attributeMap, attributeTypeMap);\n\t\t});\n\t}\n\n}"
  },
  {
    "path": "examples/jsm/loaders/glTF/extensions/KHR_lights_punctual.js",
    "content": "import { DirectionalLight, PointLight, SpotLight } from 't3d';\n\n/**\n * KHR_lights_punctual extension\n * https://github.com/KhronosGroup/glTF/blob/master/extensions/2.0/Khronos/KHR_lights_punctual/README.md\n */\nexport class KHR_lights_punctual {\n\n\tstatic getLight(params) {\n\t\tconst { color, intensity = 1, type, range, spot } = params;\n\n\t\tlet lightNode;\n\n\t\tif (type === 'directional') {\n\t\t\tlightNode = new DirectionalLight();\n\t\t} else if (type === 'point') {\n\t\t\tlightNode = new PointLight();\n\n\t\t\tif (range !== undefined) {\n\t\t\t\tlightNode.distance = range;\n\t\t\t}\n\n\t\t\t// https://github.com/KhronosGroup/glTF/blob/master/extensions/2.0/Khronos/KHR_lights_punctual/README.md#range-property\n\t\t\t// lightNode.decay = 2;\n\t\t} else if (type === 'spot') {\n\t\t\tlightNode = new SpotLight();\n\n\t\t\tif (range !== undefined) {\n\t\t\t\tlightNode.distance = range;\n\t\t\t}\n\n\t\t\t// https://github.com/KhronosGroup/glTF/blob/master/extensions/2.0/Khronos/KHR_lights_punctual/README.md#range-property\n\t\t\t// lightNode.decay = 2;\n\n\t\t\tif (spot) {\n\t\t\t\tconst { innerConeAngle = 0, outerConeAngle = Math.PI / 4 } = spot;\n\t\t\t\tlightNode.angle = outerConeAngle;\n\t\t\t\tlightNode.penumbra = 1.0 - innerConeAngle / outerConeAngle;\n\t\t\t}\n\t\t} else {\n\t\t\tthrow new Error('Unexpected light type: ' + type);\n\t\t}\n\n\t\tif (color) {\n\t\t\tlightNode.color.fromArray(color);\n\t\t}\n\n\t\tlightNode.intensity = intensity;\n\n\t\treturn lightNode;\n\t}\n\n}"
  },
  {
    "path": "examples/jsm/loaders/glTF/extensions/KHR_materials_clearcoat.js",
    "content": "import { PBRMaterial, Vector2 } from 't3d';\n/**\n * KHR_materials_clearcoat extension\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_clearcoat\n */\nexport class KHR_materials_clearcoat {\n\n\tstatic getMaterial() {\n\t\treturn new PBRMaterial();\n\t}\n\n\tstatic parseParams(material, extension, textures) {\n\t\tif (material.constructor !== PBRMaterial) return;\n\n\t\tconst { clearcoatFactor, clearcoatTexture, clearcoatRoughnessFactor, clearcoatRoughnessTexture, clearcoatNormalTexture } = extension;\n\n\t\tif (clearcoatFactor) {\n\t\t\tmaterial.clearcoat = clearcoatFactor;\n\t\t}\n\t\tif (clearcoatTexture) {\n\t\t\tmaterial.clearcoatMap = textures[clearcoatTexture.index];\n\t\t\t// material does not yet support the transform of clearcoatMap.\n\t\t\t// parseTextureTransform(material, 'clearcoatMap', clearcoatTexture.extensions);\n\t\t}\n\t\tif (clearcoatRoughnessFactor) {\n\t\t\tmaterial.clearcoatRoughness = clearcoatRoughnessFactor;\n\t\t}\n\t\tif (clearcoatRoughnessTexture) {\n\t\t\tmaterial.clearcoatRoughnessMap = textures[clearcoatRoughnessTexture.index];\n\t\t\t// material does not yet support the transform of clearcoatRoughnessMap.\n\t\t\t// parseTextureTransform(material, 'clearcoatRoughnessMap', clearcoatRoughnessTexture.extensions);\n\t\t}\n\t\tif (clearcoatNormalTexture) {\n\t\t\tmaterial.clearcoatNormalMap = textures[clearcoatNormalTexture.index];\n\t\t\t// material does not yet support the transform of clearcoatNormalMap.\n\t\t\t// parseTextureTransform(material, 'clearcoatNormalMap', clearcoatNormalTexture.extensions);\n\t\t\tif (clearcoatNormalTexture.scale) {\n\t\t\t\tconst scale = clearcoatNormalTexture.scale;\n\t\t\t\tmaterial.clearcoatNormalScale = new Vector2(scale, scale);\n\t\t\t}\n\t\t}\n\t}\n\n}"
  },
  {
    "path": "examples/jsm/loaders/glTF/extensions/KHR_materials_dispersion.js",
    "content": "import { TransmissionPBRMaterial } from '../../../materials/TransmissionPBRMaterial.js';\n\n/**\n * KHR_materials_dispersion extension\n * Specification: https://github.com/KhronosGroup/glTF/tree/main/extensions/2.0/Khronos/KHR_materials_dispersion\n */\nexport class KHR_materials_dispersion {\n\n\tstatic getMaterial() {\n\t\treturn new TransmissionPBRMaterial();\n\t}\n\n\tstatic parseParams(material, extension) {\n\t\tif (material.constructor !== TransmissionPBRMaterial) return;\n\n\t\tconst { dispersion } = extension;\n\n\t\tif (dispersion !== undefined) {\n\t\t\tmaterial.uniforms.dispersion = dispersion;\n\t\t\tmaterial.defines.USE_DISPERSION = true;\n\t\t}\n\t}\n\n}"
  },
  {
    "path": "examples/jsm/loaders/glTF/extensions/KHR_materials_ior.js",
    "content": "import { TransmissionPBRMaterial } from '../../../materials/TransmissionPBRMaterial.js';\n\n/**\n * KHR_materials_ior extension\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_ior\n */\nexport class KHR_materials_ior {\n\n\tstatic getMaterial() {\n\t\treturn new TransmissionPBRMaterial();\n\t}\n\n\tstatic parseParams(material, extension) {\n\t\tif (material.constructor !== TransmissionPBRMaterial) return;\n\n\t\tconst { ior } = extension;\n\n\t\tif (ior !== undefined) {\n\t\t\tmaterial.uniforms.ior = ior;\n\t\t}\n\t}\n\n}"
  },
  {
    "path": "examples/jsm/loaders/glTF/extensions/KHR_materials_pbrSpecularGlossiness.js",
    "content": "import { TEXEL_ENCODING_TYPE, PBR2Material } from 't3d';\n\n/**\n * KHR_materials_pbrSpecularGlossiness extension\n * https://github.com/KhronosGroup/glTF/blob/main/extensions/2.0/Archived/KHR_materials_pbrSpecularGlossiness/README.md\n */\nexport class KHR_materials_pbrSpecularGlossiness {\n\n\tstatic getMaterial() {\n\t\treturn new PBR2Material();\n\t}\n\n\tstatic parseParams(material, params, textures, transformExt) {\n\t\tif (material.constructor !== PBR2Material) return;\n\n\t\tconst { diffuseFactor, diffuseTexture, specularFactor, glossinessFactor, specularGlossinessTexture } = params;\n\n\t\tif (Array.isArray(diffuseFactor)) {\n\t\t\tmaterial.diffuse.fromArray(diffuseFactor);\n\t\t\tmaterial.opacity = diffuseFactor[3] || 1;\n\t\t}\n\n\t\tif (diffuseTexture) {\n\t\t\tmaterial.diffuseMap = textures[diffuseTexture.index];\n\t\t\tmaterial.diffuseMapCoord = diffuseTexture.texCoord || 0;\n\t\t\tif (material.diffuseMap) {\n\t\t\t\tmaterial.diffuseMap.encoding = TEXEL_ENCODING_TYPE.SRGB;\n\t\t\t\ttransformExt && transformExt.handleMaterialMap(material, 'diffuseMap', diffuseTexture);\n\t\t\t}\n\t\t}\n\n\t\tmaterial.glossiness = glossinessFactor !== undefined ? glossinessFactor : 1.0;\n\n\t\tif (Array.isArray(specularFactor)) {\n\t\t\tmaterial.specular.fromArray(specularFactor);\n\t\t}\n\n\t\tif (specularGlossinessTexture) {\n\t\t\tmaterial.glossinessMap = textures[specularGlossinessTexture.index];\n\t\t\tmaterial.specularMap = textures[specularGlossinessTexture.index];\n\t\t\t// specularGlossinessTexture transform not supported yet\n\t\t}\n\t}\n\n}"
  },
  {
    "path": "examples/jsm/loaders/glTF/extensions/KHR_materials_transmission.js",
    "content": "import { TransmissionPBRMaterial } from '../../../materials/TransmissionPBRMaterial.js';\n\n/**\n * KHR_materials_transmission extension\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 */\nexport class KHR_materials_transmission {\n\n\tstatic getMaterial() {\n\t\treturn new TransmissionPBRMaterial();\n\t}\n\n\tstatic parseParams(material, extension, textures) {\n\t\tif (material.constructor !== TransmissionPBRMaterial) return;\n\n\t\tconst { transmissionFactor, transmissionTexture } = extension;\n\n\t\tif (transmissionFactor !== undefined) {\n\t\t\tmaterial.uniforms.transmission = transmissionFactor;\n\t\t}\n\n\t\tif (transmissionTexture !== undefined) {\n\t\t\tmaterial.uniforms.transmissionMap = textures[transmissionTexture.index];\n\t\t\tmaterial.defines.USE_TRANSMISSIONMAP = true;\n\t\t\tmaterial.extUvCoordMask = material.extUvCoordMask | (1 << 0);\n\t\t}\n\t}\n\n}"
  },
  {
    "path": "examples/jsm/loaders/glTF/extensions/KHR_materials_unlit.js",
    "content": "import { BasicMaterial } from 't3d';\n\n/**\n * KHR_materials_unlit extension\n * https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_unlit\n */\nexport class KHR_materials_unlit {\n\n\tstatic getMaterial() {\n\t\treturn new BasicMaterial();\n\t}\n\n}"
  },
  {
    "path": "examples/jsm/loaders/glTF/extensions/KHR_materials_volume.js",
    "content": "import { TransmissionPBRMaterial } from '../../../materials/TransmissionPBRMaterial.js';\n\n/**\n * KHR_materials_volume extension\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_volume\n */\nexport class KHR_materials_volume {\n\n\tstatic parseParams(material, extension, textures) {\n\t\tif (material.constructor !== TransmissionPBRMaterial) return;\n\n\t\tconst { thicknessFactor, thicknessTexture, attenuationDistance, attenuationColor } = extension;\n\n\t\tif (thicknessFactor !== undefined) {\n\t\t\tmaterial.uniforms.thickness = thicknessFactor;\n\t\t}\n\n\t\tif (thicknessTexture !== undefined) {\n\t\t\tmaterial.uniforms.thicknessMap = textures[thicknessTexture.index];\n\t\t\tmaterial.defines.USE_THICKNESSMAP = true;\n\t\t\tmaterial.extUvCoordMask = material.extUvCoordMask | (1 << 0);\n\t\t}\n\n\t\tif (attenuationDistance !== undefined) {\n\t\t\tmaterial.uniforms.attenuationDistance = attenuationDistance;\n\t\t}\n\n\t\tif (attenuationColor !== undefined) {\n\t\t\tmaterial.uniforms.attenuationColor = attenuationColor;\n\t\t}\n\t}\n\n}"
  },
  {
    "path": "examples/jsm/loaders/glTF/extensions/KHR_texture_basisu.js",
    "content": "/**\n * BasisU Texture Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_texture_basisu\n */\nexport class KHR_texture_basisu {\n\n\tstatic loadTextureData(url, ktx2Loader) {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tktx2Loader.load(url, resolve, undefined, reject);\n\t\t});\n\t}\n\n}"
  },
  {
    "path": "examples/jsm/loaders/glTF/extensions/KHR_texture_transform.js",
    "content": "/**\n * KHR_texture_transform extension\n * https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_texture_transform\n */\nexport class KHR_texture_transform {\n\n\tstatic handleMaterialMap(material, mapType, textureDef) {\n\t\tif (!textureDef.extensions) return;\n\n\t\tconst extDef = textureDef.extensions.KHR_texture_transform;\n\n\t\tif (!extDef) return;\n\n\t\t// If texCoord is present, it overrides the texture's texCoord\n\t\tif (extDef.texCoord !== undefined) {\n\t\t\tmaterial[mapType + 'Coord'] = extDef.texCoord;\n\t\t}\n\n\t\tconst transform = material[mapType + 'Transform'];\n\n\t\tif (!transform) return;\n\n\t\tif (extDef.offset !== undefined) {\n\t\t\ttransform.offset.fromArray(extDef.offset);\n\t\t}\n\n\t\tif (extDef.rotation !== undefined) {\n\t\t\ttransform.rotation = extDef.rotation;\n\t\t}\n\n\t\tif (extDef.scale !== undefined) {\n\t\t\ttransform.scale.fromArray(extDef.scale);\n\t\t}\n\n\t\ttransform.updateMatrix();\n\t}\n\n}"
  },
  {
    "path": "examples/jsm/loaders/glTF/parsers/AccessorParser.js",
    "content": "import { Attribute, Buffer } from 't3d';\nimport { ACCESSOR_COMPONENT_TYPES, ACCESSOR_TYPE_SIZES } from '../Constants.js';\n\nexport class AccessorParser {\n\n\tstatic parse(context) {\n\t\tconst { bufferViews, gltf } = context;\n\n\t\tif (!gltf.accessors) return;\n\n\t\tconst interleavedBufferCache = new Map();\n\n\t\tconst accessors = gltf.accessors.map(accessor => {\n\t\t\tconst { bufferView: bufferViewIndex, type, componentType, count, byteOffset = 0, normalized = false, sparse } = accessor;\n\n\t\t\tif (bufferViewIndex === undefined && sparse === undefined) {\n\t\t\t\t// Ignore empty accessors, which may be used to declare runtime\n\t\t\t\t// information about attributes coming from another source (e.g. Draco compression extension).\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\t// Get buffer view infos\n\t\t\tconst bufferView = bufferViewIndex !== undefined ? bufferViews[bufferViewIndex] : null;\n\t\t\tconst byteStride = bufferViewIndex !== undefined ? gltf.bufferViews[bufferViewIndex].byteStride : undefined;\n\n\t\t\t// Get accessor infos\n\t\t\tconst itemSize = ACCESSOR_TYPE_SIZES[type];\n\t\t\tconst TypedArray = ACCESSOR_COMPONENT_TYPES[componentType];\n\t\t\tconst elementBytes = TypedArray.BYTES_PER_ELEMENT;\n\t\t\tconst itemBytes = elementBytes * itemSize; // For VEC3: itemSize is 3, elementBytes is 4, itemBytes is 12.\n\n\t\t\tlet array, attribute;\n\n\t\t\tif (byteStride && byteStride !== itemBytes) { // The buffer is interleaved\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 = 'Buffer:' + bufferViewIndex + ':' + componentType + ':' + ibSlice + ':' + count;\n\t\t\t\tlet ib = interleavedBufferCache.get(ibCacheKey);\n\n\t\t\t\tif (!ib) {\n\t\t\t\t\t// Use the full buffer if it's interleaved.\n\t\t\t\t\tarray = new TypedArray(bufferView, ibSlice * byteStride, 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 Buffer(array, byteStride / elementBytes);\n\n\t\t\t\t\tinterleavedBufferCache.set(ibCacheKey, ib);\n\t\t\t\t}\n\n\t\t\t\tattribute = new Attribute(ib, itemSize, (byteOffset % byteStride) / elementBytes, normalized);\n\t\t\t} else {\n\t\t\t\tif (bufferView === null) {\n\t\t\t\t\tarray = new TypedArray(count * itemSize);\n\t\t\t\t} else {\n\t\t\t\t\tarray = new TypedArray(bufferView, byteOffset, count * itemSize);\n\t\t\t\t}\n\n\t\t\t\tattribute = new Attribute(new Buffer(array, itemSize), itemSize, 0, normalized);\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 (sparse) {\n\t\t\t\tconst itemSizeIndices = ACCESSOR_TYPE_SIZES.SCALAR;\n\t\t\t\tconst TypedArrayIndices = ACCESSOR_COMPONENT_TYPES[sparse.indices.componentType];\n\n\t\t\t\tconst byteOffsetIndices = sparse.indices.byteOffset || 0;\n\t\t\t\tconst byteOffsetValues = sparse.values.byteOffset || 0;\n\n\t\t\t\tconst sparseIndices = new TypedArrayIndices(bufferViews[sparse.indices.bufferView], byteOffsetIndices, sparse.count * itemSizeIndices);\n\t\t\t\tconst sparseValues = new TypedArray(bufferViews[sparse.values.bufferView], byteOffsetValues, sparse.count * itemSize);\n\n\t\t\t\tif (bufferView !== null) {\n\t\t\t\t\t// Avoid modifying the original ArrayBuffer, if the bufferView wasn't initialized with zeroes.\n\t\t\t\t\tattribute = new Attribute(attribute.buffer.clone(), attribute.size, attribute.offset, attribute.normalized);\n\t\t\t\t}\n\n\t\t\t\tconst buffer = attribute.buffer;\n\n\t\t\t\tfor (let i = 0, il = sparseIndices.length; i < il; i++) {\n\t\t\t\t\tconst index = sparseIndices[i];\n\n\t\t\t\t\tbuffer.array[index * attribute.size] = sparseValues[i * itemSize];\n\t\t\t\t\tif (itemSize >= 2) buffer.array[index * attribute.size + 1] = sparseValues[i * itemSize + 1];\n\t\t\t\t\tif (itemSize >= 3) buffer.array[index * attribute.size + 2] = sparseValues[i * itemSize + 2];\n\t\t\t\t\tif (itemSize >= 4) buffer.array[index * attribute.size + 3] = sparseValues[i * itemSize + 3];\n\t\t\t\t\tif (itemSize >= 5) throw new Error('Unsupported itemSize in sparse Attribute.');\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn attribute;\n\t\t});\n\n\t\tinterleavedBufferCache.clear();\n\n\t\tcontext.accessors = accessors;\n\t}\n\n}"
  },
  {
    "path": "examples/jsm/loaders/glTF/parsers/AnimationParser.js",
    "content": "import {\n\tQuaternionKeyframeTrack,\n\tNumberKeyframeTrack,\n\tVectorKeyframeTrack,\n\tKeyframeClip,\n\tStepInterpolant,\n\tLinearInterpolant,\n\tCubicSplineInterpolant,\n\tQuaternionLinearInterpolant,\n\tQuaternionCubicSplineInterpolant\n} from 't3d';\nimport { GLTFUtils } from '../GLTFUtils.js';\n\nexport class AnimationParser {\n\n\tstatic parse(context, loader) {\n\t\tconst { gltf, nodes, accessors } = context;\n\t\tconst { animations } = gltf;\n\n\t\tif (!animations) return;\n\n\t\tconst pointerExt = loader.extensions.get('KHR_animation_pointer');\n\n\t\tconst animationClips = animations.map((gltfAnimation, index) => {\n\t\t\tconst { channels, samplers, name = `animation_${index}` } = gltfAnimation;\n\n\t\t\tconst trackInfos = [];\n\t\t\tlet duration = 0;\n\n\t\t\tfor (let i = 0; i < channels.length; i++) {\n\t\t\t\tconst gltfChannel = channels[i];\n\t\t\t\tconst gltfSampler = samplers[gltfChannel.sampler];\n\n\t\t\t\tif (!gltfSampler) continue;\n\n\t\t\t\tconst targetDef = gltfChannel.target;\n\n\t\t\t\tconst inputAccessor = accessors[gltfSampler.input];\n\t\t\t\tconst input = new inputAccessor.buffer.array.constructor(inputAccessor.buffer.array);\n\n\t\t\t\tconst outputAccessor = accessors[gltfSampler.output];\n\t\t\t\tconst output = new Float32Array(outputAccessor.buffer.array);\n\t\t\t\tif (outputAccessor.normalized) {\n\t\t\t\t\tconst scale = GLTFUtils.getNormalizedComponentScale(outputAccessor.buffer.array.constructor);\n\t\t\t\t\tfor (let j = 0, jl = output.length; j < jl; j++) {\n\t\t\t\t\t\toutput[j] *= scale;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tduration = Math.max(duration, input[input.length - 1]);\n\n\t\t\t\tif (pointerExt && targetDef.extensions && targetDef.extensions['KHR_animation_pointer']) {\n\t\t\t\t\tpointerExt.getTrackInfos(\n\t\t\t\t\t\tcontext, targetDef.extensions['KHR_animation_pointer'],\n\t\t\t\t\t\tinput, output, gltfSampler.interpolation, trackInfos\n\t\t\t\t\t);\n\t\t\t\t} else {\n\t\t\t\t\tconst target = nodes[targetDef.node !== undefined ? targetDef.node : targetDef.id]; // Note: targetDef.id is deprecated.\n\n\t\t\t\t\tif (!target) continue;\n\n\t\t\t\t\tlet TypedKeyframeTrack, propertyPath;\n\n\t\t\t\t\tif (targetDef.path === 'rotation') {\n\t\t\t\t\t\tTypedKeyframeTrack = QuaternionKeyframeTrack;\n\t\t\t\t\t\tpropertyPath = 'quaternion';\n\t\t\t\t\t} else if (targetDef.path === 'weights') {\n\t\t\t\t\t\tTypedKeyframeTrack = NumberKeyframeTrack;\n\t\t\t\t\t\tpropertyPath = 'morphTargetInfluences';\n\t\t\t\t\t} else if (targetDef.path === 'translation') {\n\t\t\t\t\t\tTypedKeyframeTrack = VectorKeyframeTrack;\n\t\t\t\t\t\tpropertyPath = 'position';\n\t\t\t\t\t} else if (targetDef.path === 'scale') {\n\t\t\t\t\t\tTypedKeyframeTrack = VectorKeyframeTrack;\n\t\t\t\t\t\tpropertyPath = 'scale';\n\t\t\t\t\t} else {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\ttrackInfos.push({\n\t\t\t\t\t\tTypedKeyframeTrack,\n\t\t\t\t\t\ttarget,\n\t\t\t\t\t\tpropertyPath,\n\t\t\t\t\t\ttimes: input,\n\t\t\t\t\t\tvalues: output,\n\t\t\t\t\t\tinterpolation: gltfSampler.interpolation\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst tracks = [];\n\t\t\ttrackInfos.forEach(trackInfo => {\n\t\t\t\tconst { TypedKeyframeTrack, target, propertyPath, times, values, interpolation } = trackInfo;\n\n\t\t\t\tconst interpolant = getInterpolant(interpolation, TypedKeyframeTrack === QuaternionKeyframeTrack);\n\n\t\t\t\tif (propertyPath === 'morphTargetInfluences') {\n\t\t\t\t\t// node may be a Object3D (glTF mesh with several primitives) or a Mesh.\n\t\t\t\t\ttarget.traverse(object => {\n\t\t\t\t\t\tif (object.isMesh && object.morphTargetInfluences) {\n\t\t\t\t\t\t\tconst track = new TypedKeyframeTrack(object, propertyPath, times, values, interpolant);\n\t\t\t\t\t\t\ttracks.push(track);\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\tconst track = new TypedKeyframeTrack(target, propertyPath, times, values, interpolant);\n\t\t\t\t\ttracks.push(track);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\treturn new KeyframeClip(name, tracks, duration);\n\t\t});\n\n\t\tcontext.animations = animationClips;\n\t}\n\n}\n\nfunction getInterpolant(type, quaternion) {\n\tswitch (type) {\n\t\tcase 'STEP':\n\t\t\treturn StepInterpolant;\n\t\tcase 'CUBICSPLINE':\n\t\t\treturn quaternion ? QuaternionCubicSplineInterpolant : CubicSplineInterpolant;\n\t\tcase 'LINEAR':\n\t\tdefault:\n\t\t\treturn quaternion ? QuaternionLinearInterpolant : LinearInterpolant;\n\t}\n}"
  },
  {
    "path": "examples/jsm/loaders/glTF/parsers/BufferParser.js",
    "content": "import { GLTFUtils } from '../GLTFUtils.js';\n\nexport class BufferParser {\n\n\tstatic parse(context, loader) {\n\t\tconst { gltf, loadItems } = context;\n\n\t\tif (context.buffers !== null) {\n\t\t\t// buffers have been parsed\n\t\t\treturn null;\n\t\t} else {\n\t\t\treturn Promise.all(\n\t\t\t\tgltf.buffers.map(buffer => {\n\t\t\t\t\tconst bufferUrl = GLTFUtils.resolveURL(buffer.uri, context.path);\n\t\t\t\t\tif (loader.detailLoadProgress) {\n\t\t\t\t\t\tloadItems.delete(bufferUrl);\n\t\t\t\t\t}\n\t\t\t\t\tconst promise = loader.loadFile(bufferUrl, 'arraybuffer').then(buffer => {\n\t\t\t\t\t\tif (loader.detailLoadProgress) {\n\t\t\t\t\t\t\tloader.manager.itemEnd(bufferUrl);\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn buffer;\n\t\t\t\t\t});\n\t\t\t\t\tif (loader.detailLoadProgress) {\n\t\t\t\t\t\tpromise.catch(() => loader.manager.itemEnd(bufferUrl));\n\t\t\t\t\t}\n\t\t\t\t\treturn promise;\n\t\t\t\t})\n\t\t\t).then(buffers => {\n\t\t\t\tcontext.buffers = buffers;\n\t\t\t});\n\t\t}\n\t}\n\n}"
  },
  {
    "path": "examples/jsm/loaders/glTF/parsers/BufferViewParser.js",
    "content": "export class BufferViewParser {\n\n\tstatic parse(context, loader) {\n\t\tconst { buffers, gltf } = context;\n\n\t\tif (!gltf.bufferViews) return;\n\n\t\tconst meshoptExt = loader.extensions.get('EXT_meshopt_compression');\n\n\t\treturn Promise.all(\n\t\t\tgltf.bufferViews.map(bufferView => {\n\t\t\t\tconst { buffer, byteOffset = 0, byteLength = 0 } = bufferView;\n\n\t\t\t\tif (bufferView.extensions) {\n\t\t\t\t\tconst { EXT_meshopt_compression } = bufferView.extensions;\n\t\t\t\t\tif (EXT_meshopt_compression && meshoptExt) {\n\t\t\t\t\t\treturn meshoptExt.loadBufferView(EXT_meshopt_compression, buffers, loader.getMeshoptDecoder());\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tconst arrayBuffer = buffers[buffer];\n\t\t\t\treturn arrayBuffer.slice(byteOffset, byteOffset + byteLength);\n\t\t\t})\n\t\t).then(bufferViews => {\n\t\t\tcontext.bufferViews = bufferViews;\n\t\t});\n\t}\n\n}"
  },
  {
    "path": "examples/jsm/loaders/glTF/parsers/ImageParser.js",
    "content": "import { GLTFUtils } from '../GLTFUtils.js';\n\nexport class ImageParser {\n\n\tstatic parse(context, loader) {\n\t\tconst { gltf, bufferViews, path, loadItems } = context;\n\n\t\tif (!gltf.images) return;\n\n\t\tconst basisuExt = loader.extensions.get('KHR_texture_basisu');\n\n\t\treturn Promise.all(\n\t\t\tgltf.images.map((params, index) => {\n\t\t\t\tconst { uri, bufferView: bufferViewIndex, mimeType, name: imageName } = params;\n\t\t\t\tlet isObjectURL = false;\n\t\t\t\tlet sourceUrl = uri || '';\n\n\t\t\t\tif (bufferViewIndex !== undefined) {\n\t\t\t\t\tconst bufferViewData = bufferViews[bufferViewIndex];\n\t\t\t\t\tconst blob = new Blob([bufferViewData], { type: mimeType });\n\t\t\t\t\tsourceUrl = URL.createObjectURL(blob);\n\t\t\t\t\tisObjectURL = true;\n\t\t\t\t}\n\t\t\t\tconst imageUrl = GLTFUtils.resolveURL(sourceUrl, path);\n\n\t\t\t\tif (loader.detailLoadProgress) {\n\t\t\t\t\tloadItems.delete(imageUrl);\n\t\t\t\t}\n\t\t\t\tlet promise;\n\t\t\t\tif (mimeType && mimeType.includes('ktx2') && basisuExt) {\n\t\t\t\t\tpromise = basisuExt.loadTextureData(imageUrl, loader.getKTX2Loader()).then(transcodeResult => {\n\t\t\t\t\t\tif (loader.detailLoadProgress) {\n\t\t\t\t\t\t\tif (isObjectURL) {\n\t\t\t\t\t\t\t\tloader.manager.itemEnd(GLTFUtils.resolveURL('blob<' + index + '>', path));\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tloader.manager.itemEnd(imageUrl);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn transcodeResult;\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\tconst param = { loader, imageUrl, imageName, isObjectURL, sourceUrl, index, path };\n\t\t\t\t\tif (mimeType && (mimeType.includes('avif') || mimeType.includes('webp'))) {\n\t\t\t\t\t\tpromise = detectSupport(mimeType).then(isSupported => {\n\t\t\t\t\t\t\tif (isSupported) return loadImage(param);\n\t\t\t\t\t\t\tthrow new Error('GLTFLoader: WebP or AVIF required by asset but unsupported.');\n\t\t\t\t\t\t});\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn loadImage(param);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (loader.detailLoadProgress) {\n\t\t\t\t\tpromise.catch(() => loader.manager.itemEnd(imageUrl));\n\t\t\t\t}\n\t\t\t\treturn promise;\n\t\t\t})\n\t\t).then(images => {\n\t\t\tcontext.images = images;\n\t\t});\n\t}\n\n}\n\nfunction detectSupport(mimeType) {\n\tconst isSupported = new Promise(resolve => {\n\t\t// Lossy test image.\n\t\tconst image = new Image();\n\t\tif (mimeType.includes('avif')) {\n\t\t\timage.src = 'data:image/avif;base64,AAAAIGZ0eXBhdmlmAAAAAGF2aWZtaWYxbWlhZk1BMUIAAADybWV0YQAAAAAAAAAoaGRscgAAAAAAAAAAcGljdAAAAAAAAAAAAAAAAGxpYmF2aWYAAAAADnBpdG0AAAAAAAEAAAAeaWxvYwAAAABEAAABAAEAAAABAAABGgAAABcAAAAoaWluZgAAAAAAAQAAABppbmZlAgAAAAABAABhdjAxQ29sb3IAAAAAamlwcnAAAABLaXBjbwAAABRpc3BlAAAAAAAAAAEAAAABAAAAEHBpeGkAAAAAAwgICAAAAAxhdjFDgQAMAAAAABNjb2xybmNseAACAAIABoAAAAAXaXBtYQAAAAAAAAABAAEEAQKDBAAAAB9tZGF0EgAKCBgABogQEDQgMgkQAAAAB8dSLfI=';\n\t\t} else {\n\t\t\timage.src = 'data:image/webp;base64,UklGRiIAAABXRUJQVlA4IBYAAAAwAQCdASoBAAEADsD+JaQAA3AAAAAA';\n\t\t}\n\t\timage.onload = () => {\n\t\t\tresolve(image.height === 1);\n\t\t};\n\t});\n\n\treturn isSupported;\n}\n\nfunction loadImage(param) {\n\tconst { loader, imageUrl, imageName, isObjectURL, sourceUrl, index, path } = param;\n\tconst promise = loader.loadImage(imageUrl).then(image => {\n\t\timage.__name = imageName;\n\t\tif (isObjectURL === true) {\n\t\t\tURL.revokeObjectURL(sourceUrl);\n\t\t}\n\t\tif (loader.detailLoadProgress) {\n\t\t\tif (isObjectURL) {\n\t\t\t\tloader.manager.itemEnd(GLTFUtils.resolveURL('blob<' + index + '>', path));\n\t\t\t} else {\n\t\t\t\tloader.manager.itemEnd(imageUrl);\n\t\t\t}\n\t\t}\n\t\treturn image;\n\t});\n\treturn promise;\n}"
  },
  {
    "path": "examples/jsm/loaders/glTF/parsers/IndexParser.js",
    "content": "import { GLTFUtils } from '../GLTFUtils.js';\n\nexport class IndexParser {\n\n\tstatic parse(context, loader) {\n\t\tconst { url } = context;\n\n\t\treturn loader.loadFile(url, 'arraybuffer').then(data => {\n\t\t\tconst magic = GLTFUtils.decodeText(new Uint8Array(data, 0, 4));\n\n\t\t\tif (magic === 'glTF') {\n\t\t\t\tconst glbData = GLTFUtils.parseGLB(data);\n\t\t\t\tcontext.gltf = glbData.gltf;\n\t\t\t\tcontext.buffers = glbData.buffers;\n\t\t\t} else {\n\t\t\t\tconst gltfString = GLTFUtils.decodeText(new Uint8Array(data));\n\t\t\t\tcontext.gltf = JSON.parse(gltfString);\n\t\t\t}\n\t\t});\n\t}\n\n}"
  },
  {
    "path": "examples/jsm/loaders/glTF/parsers/MaterialParser.js",
    "content": "import {\n\tPBRMaterial,\n\tDRAW_SIDE,\n\tTEXEL_ENCODING_TYPE\n} from 't3d';\nimport { ALPHA_MODES } from '../Constants.js';\n\nexport class MaterialParser {\n\n\tstatic parse(context, loader) {\n\t\tconst { gltf, textures } = context;\n\n\t\tif (!gltf.materials) return;\n\n\t\tconst transformExt = loader.extensions.get('KHR_texture_transform');\n\n\t\tconst materials = [];\n\t\tfor (let i = 0; i < gltf.materials.length; i++) {\n\t\t\tconst {\n\t\t\t\textensions = {},\n\t\t\t\tpbrMetallicRoughness,\n\t\t\t\tnormalTexture,\n\t\t\t\tocclusionTexture,\n\t\t\t\temissiveTexture,\n\t\t\t\temissiveFactor,\n\t\t\t\talphaMode,\n\t\t\t\talphaCutoff,\n\t\t\t\tdoubleSided,\n\t\t\t\tname = ''\n\t\t\t} = gltf.materials[i];\n\n\t\t\tlet material = null;\n\n\t\t\tconst materialExtNames = loader.autoParseConfig.materials;\n\n\t\t\t// TODO: refactor invoke method\n\t\t\tfor (let j = 0; j < materialExtNames.length; j++) {\n\t\t\t\tconst extName = materialExtNames[j];\n\n\t\t\t\tconst extParams = extensions[extName];\n\t\t\t\tconst ext = loader.extensions.get(extName);\n\n\t\t\t\tif (extParams && ext && ext.getMaterial) {\n\t\t\t\t\tmaterial = ext.getMaterial();\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tmaterial = material || new PBRMaterial();\n\t\t\tmaterial.name = name;\n\n\t\t\tfor (let j = 0; j < materialExtNames.length; j++) {\n\t\t\t\tconst extName = materialExtNames[j];\n\n\t\t\t\tconst extParams = extensions[extName];\n\t\t\t\tconst ext = loader.extensions.get(extName);\n\n\t\t\t\tif (extParams && ext && ext.parseParams) {\n\t\t\t\t\text.parseParams(material, extParams, textures, transformExt);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst { KHR_materials_unlit, KHR_materials_pbrSpecularGlossiness } = extensions;\n\n\t\t\tif (pbrMetallicRoughness) {\n\t\t\t\tconst { baseColorFactor, baseColorTexture, metallicFactor, roughnessFactor, metallicRoughnessTexture } = pbrMetallicRoughness;\n\n\t\t\t\tif (Array.isArray(baseColorFactor)) {\n\t\t\t\t\tmaterial.diffuse.fromArray(baseColorFactor);\n\t\t\t\t\tmaterial.opacity = (baseColorFactor[3] !== undefined) ? baseColorFactor[3] : 1;\n\t\t\t\t}\n\n\t\t\t\tif (baseColorTexture) {\n\t\t\t\t\tmaterial.diffuseMap = textures[baseColorTexture.index];\n\t\t\t\t\tmaterial.diffuseMapCoord = baseColorTexture.texCoord || 0;\n\t\t\t\t\tif (material.diffuseMap) {\n\t\t\t\t\t\tmaterial.diffuseMap.encoding = TEXEL_ENCODING_TYPE.SRGB;\n\t\t\t\t\t\ttransformExt && transformExt.handleMaterialMap(material, 'diffuseMap', baseColorTexture);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (!KHR_materials_unlit && !KHR_materials_pbrSpecularGlossiness) {\n\t\t\t\t\tmaterial.metalness = metallicFactor !== undefined ? metallicFactor : 1;\n\t\t\t\t\tmaterial.roughness = roughnessFactor !== undefined ? roughnessFactor : 1;\n\t\t\t\t\tif (metallicRoughnessTexture) {\n\t\t\t\t\t\tmaterial.metalnessMap = textures[metallicRoughnessTexture.index];\n\t\t\t\t\t\tmaterial.roughnessMap = textures[metallicRoughnessTexture.index];\n\t\t\t\t\t\t// metallicRoughnessTexture transform not supported yet\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (emissiveFactor) {\n\t\t\t\tmaterial.emissive.fromArray(emissiveFactor);\n\t\t\t}\n\n\t\t\tif (emissiveTexture) {\n\t\t\t\tmaterial.emissiveMap = textures[emissiveTexture.index];\n\t\t\t\tmaterial.emissiveMapCoord = emissiveTexture.texCoord || 0;\n\t\t\t\tif (material.emissiveMap) {\n\t\t\t\t\tmaterial.emissiveMap.encoding = TEXEL_ENCODING_TYPE.SRGB;\n\t\t\t\t\ttransformExt && transformExt.handleMaterialMap(material, 'emissiveMap', emissiveTexture);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (occlusionTexture) {\n\t\t\t\tmaterial.aoMap = textures[occlusionTexture.index];\n\t\t\t\tmaterial.aoMapCoord = occlusionTexture.texCoord || 0;\n\t\t\t\tif (occlusionTexture.strength !== undefined) {\n\t\t\t\t\tmaterial.aoMapIntensity = occlusionTexture.strength;\n\t\t\t\t}\n\t\t\t\tif (material.aoMap) {\n\t\t\t\t\ttransformExt && transformExt.handleMaterialMap(material, 'aoMap', occlusionTexture);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (!KHR_materials_unlit) {\n\t\t\t\tif (normalTexture) {\n\t\t\t\t\tmaterial.normalMap = textures[normalTexture.index];\n\n\t\t\t\t\tmaterial.normalScale.set(1, -1);\n\t\t\t\t\tif (normalTexture.scale !== undefined) {\n\t\t\t\t\t\t// fix flip y for normal map\n\t\t\t\t\t\t// https://github.com/mrdoob/three.js/issues/11438#issuecomment-507003995\n\t\t\t\t\t\tmaterial.normalScale.set(normalTexture.scale, -normalTexture.scale);\n\t\t\t\t\t}\n\n\t\t\t\t\t// normal map transform not supported yet\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tmaterial.side = doubleSided === true ? DRAW_SIDE.DOUBLE : DRAW_SIDE.FRONT;\n\n\t\t\tif (alphaMode === ALPHA_MODES.BLEND) {\n\t\t\t\tmaterial.transparent = true;\n\t\t\t} else {\n\t\t\t\tmaterial.transparent = false;\n\n\t\t\t\tif (alphaMode === ALPHA_MODES.MASK) {\n\t\t\t\t\tmaterial.alphaTest = alphaCutoff !== undefined ? alphaCutoff : 0.5;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tmaterials[i] = material;\n\t\t}\n\n\t\tcontext.materials = materials;\n\t}\n\n}"
  },
  {
    "path": "examples/jsm/loaders/glTF/parsers/NodeParser.js",
    "content": "import { Bone, Camera, Object3D, Mesh, SkinnedMesh } from 't3d';\nimport { GLTFUtils } from '../GLTFUtils.js';\n\nexport class NodeParser {\n\n\tstatic parse(context, loader) {\n\t\tconst {\n\t\t\tgltf: { nodes: gltfNodes, cameras: gltfCameras, extensions: gltfExtensions }\n\t\t} = context;\n\n\t\tif (!gltfNodes) return;\n\n\t\tconst lightsExt = loader.extensions.get('KHR_lights_punctual');\n\t\tconst instancingExt = loader.extensions.get('EXT_mesh_gpu_instancing');\n\n\t\tconst cameras = [];\n\t\tconst lights = [];\n\t\tconst nodes = gltfNodes.map(gltfNode => {\n\t\t\tconst {\n\t\t\t\tmatrix, translation, rotation, scale,\n\t\t\t\tcamera: cameraID, mesh: meshID,\n\t\t\t\textensions = {}\n\t\t\t} = gltfNode;\n\t\t\tconst { KHR_lights_punctual, EXT_mesh_gpu_instancing } = extensions;\n\n\t\t\tlet node = null;\n\n\t\t\tif (gltfNode.isBone) {\n\t\t\t\t// .isBone isn't in glTF spec. Marked in IndexParser\n\t\t\t\tnode = new Bone();\n\t\t\t} else if (meshID !== undefined) {\n\t\t\t\tif (EXT_mesh_gpu_instancing && instancingExt) {\n\t\t\t\t\tnode = instancingExt.getInstancedMesh(context, gltfNode);\n\t\t\t\t} else {\n\t\t\t\t\tnode = createMesh(context, gltfNode);\n\t\t\t\t}\n\t\t\t} else if (cameraID !== undefined) {\n\t\t\t\tnode = createCamera(gltfCameras[cameraID]);\n\t\t\t\tcameras.push(node);\n\t\t\t} else if (KHR_lights_punctual && lightsExt) {\n\t\t\t\tconst lightIndex = KHR_lights_punctual.light;\n\t\t\t\tconst gltfLights = gltfExtensions.KHR_lights_punctual.lights;\n\t\t\t\tnode = lightsExt.getLight(gltfLights[lightIndex]);\n\t\t\t\tlights.push(node);\n\t\t\t} else {\n\t\t\t\tnode = new Object3D();\n\t\t\t}\n\n\t\t\tnode.name = gltfNode.name || '';\n\t\t\tif (!!node.name && node.children.length > 0) {\n\t\t\t\tfor (let i = 0; i < node.children.length; i++) {\n\t\t\t\t\tnode.children[i].name = node.name + '_' + i;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (matrix !== undefined) {\n\t\t\t\tnode.matrix.fromArray(matrix);\n\t\t\t\tnode.matrix.decompose(node.position, node.quaternion, node.scale);\n\t\t\t} else {\n\t\t\t\tif (translation !== undefined) {\n\t\t\t\t\tnode.position.fromArray(translation);\n\t\t\t\t}\n\n\t\t\t\tif (rotation !== undefined) {\n\t\t\t\t\tnode.quaternion.fromArray(rotation);\n\t\t\t\t}\n\n\t\t\t\tif (scale !== undefined) {\n\t\t\t\t\tnode.scale.fromArray(scale);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn node;\n\t\t});\n\n\t\tcontext.nodes = nodes;\n\t\tcontext.cameras = cameras;\n\t\tcontext.lights = lights;\n\t}\n\n}\n\nfunction createCamera(cameraDef) {\n\tconst { orthographic, perspective, type } = cameraDef;\n\n\tconst camera = new Camera();\n\n\tif (type == 'perspective') {\n\t\tconst { aspectRatio, yfov, zfar, znear } = perspective;\n\t\tcamera.setPerspective(yfov, aspectRatio || 1, znear || 1, zfar || 2e6);\n\t} else if (type == 'orthographic') {\n\t\tconst { xmag, ymag, zfar, znear } = orthographic;\n\t\t// https:// github.com/KhronosGroup/glTF/issues/1663\n\t\tcamera.setOrtho(-xmag, xmag, -ymag, ymag, znear || 1, zfar || 2e6);\n\t}\n\n\treturn camera;\n}\n\nfunction createMesh(context, gltfNode) {\n\tconst { primitives } = context;\n\n\tconst { mesh: meshID, skin: skinID } = gltfNode;\n\n\tconst meshes = primitives[meshID].map(primitive => {\n\t\tconst { geometry, material, weights } = primitive;\n\n\t\tlet mesh;\n\n\t\tif (skinID !== undefined) {\n\t\t\tmesh = new SkinnedMesh(geometry, material);\n\n\t\t\tif (geometry.attributes.skinWeight && !geometry.attributes.skinWeight.normalized) {\n\t\t\t\tGLTFUtils.normalizeSkinWeights(geometry.attributes.skinWeight);\n\t\t\t}\n\t\t} else {\n\t\t\tmesh = new Mesh(geometry, material);\n\n\t\t\tif (weights) {\n\t\t\t\tmesh.morphTargetInfluences = weights.slice();\n\t\t\t}\n\t\t}\n\n\t\treturn mesh;\n\t});\n\n\tif (meshes.length > 1) {\n\t\tconst parent = new Object3D();\n\t\tmeshes.forEach(mesh => parent.add(mesh));\n\t\treturn parent;\n\t} else {\n\t\treturn meshes[0];\n\t}\n}"
  },
  {
    "path": "examples/jsm/loaders/glTF/parsers/PrimitiveParser.js",
    "content": "import { Geometry, PBRMaterial, VERTEX_COLOR, SHADING_TYPE, PointsMaterial, Material, BasicMaterial } from 't3d';\nimport { GLTFUtils } from '../GLTFUtils.js';\nimport { ATTRIBUTES, ACCESSOR_COMPONENT_TYPES, WEBGL_DRAW_MODES } from '../Constants.js';\n\nexport class PrimitiveParser {\n\n\tstatic parse(context, loader) {\n\t\tconst { gltf, accessors, materials, bufferViews } = context;\n\n\t\tif (!gltf.meshes) return;\n\n\t\tconst dracoExt = loader.extensions.get('KHR_draco_mesh_compression');\n\n\t\tconst materialCache = new Map();\n\t\tconst geometryPromiseCache = new Map();\n\n\t\tconst meshPromises = [];\n\t\tfor (let i = 0; i < gltf.meshes.length; i++) {\n\t\t\tconst gltfMesh = gltf.meshes[i];\n\n\t\t\tconst primitivePromises = [];\n\t\t\tfor (let j = 0; j < gltfMesh.primitives.length; j++) {\n\t\t\t\tconst gltfPrimitive = gltfMesh.primitives[j];\n\t\t\t\tconst {\n\t\t\t\t\textensions = {},\n\t\t\t\t\tmode,\n\t\t\t\t\tmaterial\n\t\t\t\t} = gltfPrimitive;\n\t\t\t\tconst { KHR_draco_mesh_compression } = extensions;\n\n\t\t\t\tlet geometryPromise;\n\n\t\t\t\tconst geometryKey = createGeometryKey(gltfPrimitive);\n\t\t\t\tif (geometryPromiseCache.has(geometryKey)) {\n\t\t\t\t\tgeometryPromise = geometryPromiseCache.get(geometryKey);\n\t\t\t\t} else {\n\t\t\t\t\tif (KHR_draco_mesh_compression && dracoExt) {\n\t\t\t\t\t\tgeometryPromise = dracoExt.getGeometry(KHR_draco_mesh_compression, bufferViews, gltfPrimitive.attributes, gltf.accessors, loader.getDRACOLoader());\n\t\t\t\t\t} else {\n\t\t\t\t\t\tgeometryPromise = Promise.resolve(new Geometry());\n\t\t\t\t\t}\n\n\t\t\t\t\tgeometryPromise = geometryPromise.then(geometry => {\n\t\t\t\t\t\tparseGeometryFromGLTFPrimitive(geometry, gltfPrimitive, gltf, accessors);\n\t\t\t\t\t\treturn geometry;\n\t\t\t\t\t});\n\n\t\t\t\t\tgeometryPromiseCache.set(geometryKey, geometryPromise);\n\t\t\t\t}\n\n\t\t\t\tconst primitivePromise = geometryPromise.then(geometry => {\n\t\t\t\t\tconst primitive = {\n\t\t\t\t\t\tmode,\n\t\t\t\t\t\tgeometry,\n\t\t\t\t\t\tmaterial: material === undefined ? new PBRMaterial() : materials[material],\n\t\t\t\t\t\tweights: (Object.keys(geometry.morphAttributes).length > 0 && gltfMesh.weights) ? gltfMesh.weights.slice(0) : undefined,\n\t\t\t\t\t\tskinned: gltfMesh.isSkinned\n\t\t\t\t\t};\n\t\t\t\t\tassignFinalMaterial(primitive, materialCache);\n\t\t\t\t\treturn primitive;\n\t\t\t\t});\n\n\t\t\t\tprimitivePromises.push(primitivePromise);\n\t\t\t}\n\t\t\tmeshPromises.push(Promise.all(primitivePromises));\n\t\t}\n\n\t\tmaterialCache.clear();\n\t\tgeometryPromiseCache.clear();\n\n\t\treturn Promise.all(meshPromises).then(primitives => {\n\t\t\tcontext.primitives = primitives;\n\t\t});\n\t}\n\n}\n\nfunction parseGeometryFromGLTFPrimitive(geometry, gltfPrimitive, gltf, accessors) {\n\tconst { attributes, indices, targets } = gltfPrimitive;\n\n\t// set attributes\n\n\tfor (const attributeSemantic in attributes) {\n\t\tconst accessorIdx = attributes[attributeSemantic];\n\n\t\tconst attributeName = ATTRIBUTES[attributeSemantic] === undefined ? attributeSemantic : ATTRIBUTES[attributeSemantic];\n\t\t// Skip attributes already provided by e.g. Draco extension.\n\t\tif (attributeName in geometry.attributes) continue;\n\n\t\tgeometry.addAttribute(attributeName, accessors[accessorIdx]);\n\t}\n\n\t// set index\n\n\tif (indices !== undefined && !geometry.index) {\n\t\tgeometry.setIndex(accessors[indices]);\n\t}\n\n\t// compute bounds\n\n\tconst { boundingBox, boundingSphere } = geometry;\n\tif (attributes.POSITION !== undefined) {\n\t\tconst accessorIdx = attributes.POSITION;\n\t\tconst accessor = gltf.accessors[accessorIdx];\n\n\t\tif (accessor.min && accessor.max) {\n\t\t\tboundingBox.min.fromArray(accessor.min);\n\t\t\tboundingBox.max.fromArray(accessor.max);\n\n\t\t\tif (accessor.normalized) {\n\t\t\t\tconst boxScale = GLTFUtils.getNormalizedComponentScale(ACCESSOR_COMPONENT_TYPES[accessor.componentType]);\n\t\t\t\tboundingBox.min.multiplyScalar(boxScale);\n\t\t\t\tboundingBox.max.multiplyScalar(boxScale);\n\t\t\t}\n\t\t} else {\n\t\t\tgeometry.computeBoundingBox();\n\t\t}\n\t} else {\n\t\tgeometry.computeBoundingBox();\n\t}\n\tboundingBox.getCenter(boundingSphere.center);\n\tboundingSphere.radius = boundingBox.min.distanceTo(boundingBox.max) / 2;\n\n\t// set morph targets\n\n\tif (targets) {\n\t\tlet hasMorphPosition = false;\n\t\tlet hasMorphNormal = false;\n\n\t\tfor (let i = 0, il = targets.length; i < il; i++) {\n\t\t\tconst target = targets[i];\n\n\t\t\tif (target.POSITION !== undefined) hasMorphPosition = true;\n\t\t\tif (target.NORMAL !== undefined) hasMorphNormal = true;\n\n\t\t\tif (hasMorphPosition && hasMorphNormal) break;\n\t\t}\n\n\t\tif (hasMorphPosition || hasMorphNormal) {\n\t\t\tconst morphPositions = [];\n\t\t\tconst morphNormals = [];\n\n\t\t\tfor (let i = 0, il = targets.length; i < il; i++) {\n\t\t\t\tconst target = targets[i];\n\n\t\t\t\tif (hasMorphPosition) {\n\t\t\t\t\tmorphPositions.push(target.POSITION !== undefined ? accessors[target.POSITION] : geometry.attributes[ATTRIBUTES.POSITION]);\n\t\t\t\t}\n\t\t\t\tif (hasMorphNormal) {\n\t\t\t\t\tmorphNormals.push(target.NORMAL !== undefined ? accessors[target.NORMAL] : geometry.attributes[ATTRIBUTES.NORMAL]);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (hasMorphPosition) {\n\t\t\t\tgeometry.morphAttributes.position = morphPositions;\n\t\t\t}\n\t\t\tif (hasMorphNormal) {\n\t\t\t\tgeometry.morphAttributes.normal = morphNormals;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn geometry;\n}\n\nfunction assignFinalMaterial(primitive, materialCache) {\n\tlet { geometry, material, skinned, mode } = primitive;\n\n\t// If the material will be modified later on, clone it now.\n\tconst useVertexTangents = geometry.attributes[ATTRIBUTES.TANGENT] !== undefined;\n\tconst useVertexColors = geometry.attributes[ATTRIBUTES.COLOR_0] !== undefined;\n\tconst useFlatShading = geometry.attributes[ATTRIBUTES.NORMAL] === undefined;\n\tconst useSkinning = skinned;\n\n\tif (mode === WEBGL_DRAW_MODES.POINTS) {\n\t\tconst cacheKey = 'PointsMaterial:' + material.id;\n\t\tlet pointsMaterial = materialCache.get(cacheKey);\n\t\tif (!pointsMaterial) {\n\t\t\tpointsMaterial = new PointsMaterial();\n\t\t\tMaterial.prototype.copy.call(pointsMaterial, material);\n\t\t\tpointsMaterial.diffuse.copy(material.diffuse);\n\t\t\tpointsMaterial.diffuseMap = material.map;\n\t\t\tpointsMaterial.drawMode = mode;\n\t\t\tpointsMaterial.acceptLight = false; // PointsMaterial doesn't support lights yet\n\t\t\tmaterialCache.set(cacheKey, pointsMaterial);\n\t\t}\n\t\tmaterial = pointsMaterial;\n\t} else if (mode === WEBGL_DRAW_MODES.LINES || mode === WEBGL_DRAW_MODES.LINE_STRIP || mode === WEBGL_DRAW_MODES.LINE_LOOP) {\n\t\tconst cacheKey = 'BasicMaterial:' + material.id;\n\t\tlet basicMaterial = materialCache.get(cacheKey);\n\t\tif (!basicMaterial) {\n\t\t\tbasicMaterial = new BasicMaterial();\n\t\t\tbasicMaterial.envMap = undefined; // force close env map\n\t\t\tbasicMaterial.diffuse.copy(material.diffuse);\n\t\t\tbasicMaterial.diffuseMap = material.diffuseMap;\n\t\t\tbasicMaterial.drawMode = mode;\n\t\t\tmaterialCache.set(cacheKey, basicMaterial);\n\t\t}\n\t\tmaterial = basicMaterial;\n\t} else if (mode === WEBGL_DRAW_MODES.TRIANGLE_STRIP) {\n\t\t// TODO\n\t\tconsole.warn('TRIANGLE_STRIP will be removed later.');\n\t\tmaterial.drawMode = WEBGL_DRAW_MODES.TRIANGLE_STRIP;\n\t} else if (mode === WEBGL_DRAW_MODES.TRIANGLE_FAN) {\n\t\t// TODO\n\t\tconsole.warn('TRIANGLE_FAN will be removed later.');\n\t\tmaterial.drawMode = WEBGL_DRAW_MODES.TRIANGLE_FAN;\n\t}\n\n\tif (useVertexTangents || useVertexColors || useFlatShading || useSkinning) {\n\t\tlet cacheKey = 'ClonedMaterial:' + material.id + ':';\n\n\t\tif (useVertexTangents) cacheKey += 'vertex-tangents:';\n\t\tif (useVertexColors) {\n\t\t\tif (geometry.attributes[ATTRIBUTES.COLOR_0].size === 3) {\n\t\t\t\tcacheKey += 'vertex-colors-rgb:';\n\t\t\t} else if (geometry.attributes[ATTRIBUTES.COLOR_0].size === 4) {\n\t\t\t\tcacheKey += 'vertex-colors-rgba:';\n\t\t\t}\n\t\t}\n\t\tif (useFlatShading) cacheKey += 'flat-shading:';\n\n\t\tlet cachedMaterial = materialCache.get(cacheKey);\n\n\t\tif (!cachedMaterial) {\n\t\t\tcachedMaterial = material.clone();\n\n\t\t\tif (useVertexTangents) {\n\t\t\t\tcachedMaterial.vertexTangents = true;\n\n\t\t\t\t// revert flip y fix for tangents\n\t\t\t\t// https://github.com/mrdoob/three.js/issues/11438#issuecomment-507003995\n\t\t\t\tif (cachedMaterial.normalMap) {\n\t\t\t\t\tcachedMaterial.normalScale.y *= -1;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (useVertexColors) {\n\t\t\t\tif (geometry.attributes[ATTRIBUTES.COLOR_0].size === 3) {\n\t\t\t\t\tcachedMaterial.vertexColors = VERTEX_COLOR.RGB;\n\t\t\t\t} else if (geometry.attributes[ATTRIBUTES.COLOR_0].size === 4) {\n\t\t\t\t\tcachedMaterial.vertexColors = VERTEX_COLOR.RGBA;\n\t\t\t\t} else {\n\t\t\t\t\tconsole.warn('Illegal vertex color size: ' + geometry.attributes[ATTRIBUTES.COLOR_0].size);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (useFlatShading) {\n\t\t\t\tcachedMaterial.shading = SHADING_TYPE.FLAT_SHADING;\n\t\t\t}\n\t\t}\n\n\t\tmaterial = cachedMaterial;\n\t}\n\n\tprimitive.material = material;\n}\n\nfunction createGeometryKey(primitive) {\n\tconst dracoExtension = primitive.extensions && primitive.extensions.KHR_draco_mesh_compression;\n\tlet geometryKey;\n\n\tif (dracoExtension) {\n\t\tgeometryKey = 'draco:' + dracoExtension.bufferView\n\t\t\t\t+ ':' + dracoExtension.indices\n\t\t\t\t+ ':' + createAttributesKey(dracoExtension.attributes);\n\t} else {\n\t\tgeometryKey = primitive.indices + ':' + createAttributesKey(primitive.attributes) + ':' + primitive.mode;\n\t}\n\n\tif (primitive.targets) {\n\t\tfor (let i = 0, il = primitive.targets.length; i < il; i++) {\n\t\t\tgeometryKey += ':' + createAttributesKey(primitive.targets[i]);\n\t\t}\n\t}\n\n\treturn geometryKey;\n}\n\nfunction createAttributesKey(attributes) {\n\tlet attributesKey = '';\n\n\tconst keys = Object.keys(attributes).sort();\n\n\tfor (let i = 0, il = keys.length; i < il; i++) {\n\t\tattributesKey += keys[i] + ':' + attributes[keys[i]] + ';';\n\t}\n\n\treturn attributesKey;\n}"
  },
  {
    "path": "examples/jsm/loaders/glTF/parsers/ReferenceParser.js",
    "content": "import { GLTFUtils } from '../GLTFUtils.js';\n\n// Marks the special nodes/meshes in json for efficient parse.\nexport class ReferenceParser {\n\n\tstatic parse(context, loader) {\n\t\tconst { gltf, path } = context;\n\t\tconst { nodes = [], skins = [], meshes = [], buffers, images } = gltf;\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\tskins.forEach(skin => {\n\t\t\tconst { joints = [] } = skin;\n\t\t\tjoints.forEach(joint => {\n\t\t\t\tnodes[joint].isBone = true;\n\t\t\t});\n\t\t});\n\n\t\t// Nothing in the mesh definition indicates whether it is\n\t\t// a SkinnedMesh or Mesh. Use the node's mesh reference\n\t\t// to mark SkinnedMesh if node has skin.\n\t\tnodes.forEach(node => {\n\t\t\tif (node.mesh !== undefined) {\n\t\t\t\tif (node.skin !== undefined) {\n\t\t\t\t\tmeshes[node.mesh].isSkinned = true;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\t// setup loading list for detail load progress\n\t\tif (loader.detailLoadProgress) {\n\t\t\tconst loadItems = new Set();\n\n\t\t\tif (buffers) {\n\t\t\t\tbuffers.forEach(buffer => {\n\t\t\t\t\tif (!buffer.uri) {\n\t\t\t\t\t\t// glb or other\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tconst bufferUrl = GLTFUtils.resolveURL(buffer.uri, path);\n\t\t\t\t\tloadItems.add(bufferUrl);\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif (images) {\n\t\t\t\timages.forEach((image, index) => {\n\t\t\t\t\tconst { uri, bufferView: bufferViewIndex } = image;\n\n\t\t\t\t\tlet imageUrl = uri;\n\n\t\t\t\t\tif (bufferViewIndex !== undefined) {\n\t\t\t\t\t\timageUrl = 'blob<' + index + '>'; // fake url for blob image\n\t\t\t\t\t}\n\n\t\t\t\t\timageUrl = GLTFUtils.resolveURL(imageUrl, path);\n\n\t\t\t\t\tloadItems.add(imageUrl);\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tloadItems.forEach(item => loader.manager.itemStart(item));\n\n\t\t\tcontext.loadItems = loadItems;\n\t\t}\n\t}\n\n}"
  },
  {
    "path": "examples/jsm/loaders/glTF/parsers/SceneParser.js",
    "content": "import { Object3D } from 't3d';\n\nexport class SceneParser {\n\n\tstatic parse(context) {\n\t\tconst { gltf, nodes } = context;\n\n\t\tconst roots = gltf.scenes.map(sceneDef => {\n\t\t\tconst { name: sceneName = '', nodes: nodeIds = [] } = sceneDef;\n\n\t\t\tconst group = new Object3D();\n\t\t\tgroup.name = sceneName;\n\n\t\t\tfor (let i = 0; i < nodeIds.length; i++) {\n\t\t\t\tbuildNodeHierachy(nodeIds[i], group, gltf.nodes, nodes);\n\t\t\t}\n\n\t\t\treturn group;\n\t\t});\n\n\t\tcontext.roots = roots;\n\t\tcontext.root = roots[gltf.scene || 0];\n\t}\n\n}\n\nfunction buildNodeHierachy(nodeId, parentNode, gltfNodes, nodes) {\n\tconst node = nodes[nodeId];\n\tconst nodeDef = gltfNodes[nodeId];\n\n\tparentNode.add(node);\n\n\tif (nodeDef.children) {\n\t\tconst children = nodeDef.children;\n\n\t\tfor (let i = 0, il = children.length; i < il; i++) {\n\t\t\tconst child = children[i];\n\t\t\tbuildNodeHierachy(child, node, gltfNodes, nodes);\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "examples/jsm/loaders/glTF/parsers/SkinParser.js",
    "content": "import { Matrix4, Skeleton } from 't3d';\n\nexport class SkinParser {\n\n\tstatic parse(context) {\n\t\tconst { gltf, accessors, nodes } = context;\n\n\t\tconst gltfSkins = gltf.skins;\n\n\t\tif (!gltfSkins) return;\n\n\t\tconst skins = gltfSkins.map(skin => {\n\t\t\tconst { inverseBindMatrices, joints } = skin;\n\n\t\t\tconst attribute = accessors[inverseBindMatrices];\n\n\t\t\tconst bones = [];\n\t\t\tconst boneInverses = [];\n\t\t\tjoints.forEach((jointId, index) => {\n\t\t\t\tconst jointNode = nodes[jointId];\n\n\t\t\t\tif (jointNode) {\n\t\t\t\t\tbones.push(jointNode);\n\n\t\t\t\t\tconst boneInverse = new Matrix4();\n\t\t\t\t\tif (attribute) {\n\t\t\t\t\t\tboneInverse.fromArray(attribute.buffer.array, index * 16);\n\t\t\t\t\t}\n\t\t\t\t\tboneInverses.push(boneInverse);\n\t\t\t\t} else {\n\t\t\t\t\tconsole.warn('Joint ' + jointId + ' could not be found.');\n\t\t\t\t}\n\t\t\t});\n\n\t\t\treturn new Skeleton(bones, boneInverses);\n\t\t});\n\n\t\tcontext.skins = skins;\n\n\t\t// Bind all skined meshes\n\t\tnodes.forEach((node, index) => {\n\t\t\tconst { skin: skinID } = gltf.nodes[index];\n\n\t\t\tif (skinID !== undefined) {\n\t\t\t\tnode.traverse(function(mesh) {\n\t\t\t\t\tif (!mesh.isSkinnedMesh) return;\n\t\t\t\t\tmesh.bind(skins[skinID], mesh.worldMatrix); // TODO need updateMatrix ?\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\t}\n\n}"
  },
  {
    "path": "examples/jsm/loaders/glTF/parsers/TextureParser.js",
    "content": "import {\n\tTexture2D,\n\tTEXTURE_FILTER,\n\tTEXTURE_WRAP\n} from 't3d';\nimport { WEBGL_WRAPPINGS, WEBGL_FILTERS } from '../Constants.js';\n\nexport class TextureParser {\n\n\tstatic parse(context) {\n\t\tconst { gltf, images } = context;\n\n\t\tif (!gltf.textures) return;\n\n\t\tconst textureCache = new Map();\n\n\t\treturn Promise.all(\n\t\t\tgltf.textures.map((params, index) => {\n\t\t\t\tconst { sampler, source = 0, name: textureName } = params;\n\n\t\t\t\tlet sourceIndex = source, isTextureData = false;\n\n\t\t\t\tif (params.extensions) {\n\t\t\t\t\tconst { KHR_texture_basisu } = params.extensions;\n\n\t\t\t\t\tif (KHR_texture_basisu) {\n\t\t\t\t\t\tsourceIndex = KHR_texture_basisu.source;\n\t\t\t\t\t\tisTextureData = true;\n\t\t\t\t\t} else if (Object.values(params.extensions).length && Object.values(params.extensions)[0].hasOwnProperty('source')) {\n\t\t\t\t\t\tsourceIndex = Object.values(params.extensions)[0].source;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconsole.warn('GLTFLoader: unknown texture extension');\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tconst cacheKey = sourceIndex + ':' + sampler;\n\n\t\t\t\tif (textureCache.has(cacheKey)) {\n\t\t\t\t\treturn textureCache.get(cacheKey);\n\t\t\t\t}\n\n\t\t\t\tconst texture = new Texture2D();\n\n\t\t\t\tif (isTextureData) {\n\t\t\t\t\tconst { image, mipmaps, type, format, minFilter, magFilter, generateMipmaps, encoding, premultiplyAlpha } = images[sourceIndex];\n\n\t\t\t\t\ttexture.image = image;\n\t\t\t\t\ttexture.mipmaps = mipmaps;\n\t\t\t\t\ttexture.type = type;\n\t\t\t\t\ttexture.format = format;\n\t\t\t\t\ttexture.minFilter = minFilter;\n\t\t\t\t\ttexture.magFilter = magFilter;\n\t\t\t\t\ttexture.generateMipmaps = generateMipmaps;\n\t\t\t\t\ttexture.encoding = encoding;\n\t\t\t\t\ttexture.premultiplyAlpha = premultiplyAlpha;\n\t\t\t\t} else {\n\t\t\t\t\ttexture.image = images[sourceIndex];\n\t\t\t\t}\n\n\t\t\t\ttexture.version++;\n\t\t\t\ttexture.name = textureName || texture.image.__name || `texture_${index}`;\n\t\t\t\ttexture.flipY = false;\n\n\t\t\t\tconst { mimeType, uri } = gltf.images[sourceIndex];\n\t\t\t\ttexture.userData.mimeType = mimeType || getImageURIMimeType(uri);\n\n\t\t\t\tconst samplers = gltf.samplers || {};\n\t\t\t\tparseSampler(texture, samplers[sampler]);\n\n\t\t\t\ttextureCache.set(cacheKey, texture);\n\n\t\t\t\treturn texture;\n\t\t\t})\n\t\t).then(textures => {\n\t\t\tcontext.textures = textures;\n\t\t\ttextureCache.clear();\n\t\t});\n\t}\n\n}\n\nfunction parseSampler(texture, sampler = {}) {\n\tconst { magFilter, minFilter, wrapS, wrapT } = sampler;\n\n\ttexture.magFilter = WEBGL_FILTERS[magFilter] || TEXTURE_FILTER.LINEAR;\n\ttexture.minFilter = WEBGL_FILTERS[minFilter] || TEXTURE_FILTER.LINEAR_MIPMAP_LINEAR;\n\ttexture.wrapS = WEBGL_WRAPPINGS[wrapS] || TEXTURE_WRAP.REPEAT;\n\ttexture.wrapT = WEBGL_WRAPPINGS[wrapT] || TEXTURE_WRAP.REPEAT;\n}\n\n// only for jpeg, png, webp\n// because other should get mimeType from glTF image object\nfunction getImageURIMimeType(uri) {\n\tif (uri.startsWith('data:image/')) { // early return for data URIs\n\t\tif (uri.startsWith('data:image/jpeg')) return 'image/jpeg';\n\t\tif (uri.startsWith('data:image/webp')) return 'image/webp';\n\t\treturn 'image/png';\n\t} else {\n\t\tif (uri.search(/\\.jpe?g($|\\?)/i) > 0) return 'image/jpeg';\n\t\tif (uri.search(/\\.webp($|\\?)/i) > 0) return 'image/webp';\n\t\treturn 'image/png';\n\t}\n}"
  },
  {
    "path": "examples/jsm/loaders/glTF/parsers/Validator.js",
    "content": "export class Validator {\n\n\tstatic parse(context) {\n\t\tconst {\n\t\t\tgltf: {\n\t\t\t\tasset: { version }\n\t\t\t}\n\t\t} = context;\n\n\t\tconst gltfVersion = Number(version);\n\t\tif (!(gltfVersion >= 2 && gltfVersion < 3)) {\n\t\t\tthrow 'Only support gltf 2.x.';\n\t\t}\n\t}\n\n}"
  },
  {
    "path": "examples/jsm/materials/AlphaHashedPBRMaterial.js",
    "content": "import { ShaderLib, PBRMaterial, MATERIAL_TYPE } from 't3d';\n\nexport class AlphaHashedPBRMaterial extends PBRMaterial {\n\n\tconstructor(sourceMaterial) {\n\t\tsuper();\n\n\t\tthis.type = MATERIAL_TYPE.SHADER;\n\n\t\tif (sourceMaterial) {\n\t\t\tthis.copy(sourceMaterial);\n\t\t}\n\n\t\tthis.shaderName = 'AlphaHashedPBR';\n\n\t\tthis.vertexShader = ShaderLib.pbr_vert;\n\t\tthis.fragmentShader = fragmentShader;\n\n\t\tthis.defines.USE_ALPHAHASH = true;\n\t}\n\n}\n\nlet fragmentShader = ShaderLib.pbr_frag;\n\n/**\n * See: https://casual-effects.com/research/Wyman2017Hashed/index.html\n */\nconst alphahash_pars_fragment = `\n    #ifdef USE_ALPHAHASH\n        const float ALPHA_HASH_SCALE = 0.05; // Derived from trials only, and may be changed.\n\n        float hash2D(vec2 value) {\n            return fract(1.0e4 * sin(17.0 * value.x + 0.1 * value.y) * (0.1 + abs(sin(13.0 * value.y + value.x))));\n        }\n\n        float hash3D(vec3 value) {\n            return hash2D(vec2(hash2D(value.xy), value.z));\n        }\n\n        float getAlphaHashThreshold(vec3 position) {\n            // Find the discretized derivatives of our coordinates\n            float maxDeriv = max(\n                length(dFdx(position.xyz)),\n                length(dFdy(position.xyz))\n            );\n            float pixScale = 1.0 / (ALPHA_HASH_SCALE * maxDeriv);\n\n            // Find two nearest log-discretized noise scales\n            vec2 pixScales = vec2(\n                exp2(floor(log2(pixScale))),\n                exp2(ceil(log2(pixScale)))\n            );\n\n            // Compute alpha thresholds at our two noise scales\n            vec2 alpha = vec2(\n                hash3D(floor(pixScales.x * position.xyz)),\n                hash3D(floor(pixScales.y * position.xyz))\n            );\n\n            // Factor to interpolate lerp with\n            float lerpFactor = fract(log2(pixScale));\n\n            // Interpolate alpha threshold from noise at two scales\n            float x = (1.0 - lerpFactor) * alpha.x + lerpFactor * alpha.y;\n\n            // Pass into CDF to compute uniformly distrib threshold\n            float a = min(lerpFactor, 1.0 - lerpFactor);\n            vec3 cases = vec3(\n                x * x / (2.0 * a * (1.0 - a)),\n                (x - 0.5 * a) / (1.0 - a),\n                1.0 - ((1.0 - x) * (1.0 - x) / (2.0 * a * (1.0 - a)))\n            );\n\n            // Find our final, uniformly distributed alpha threshold (ατ)\n            float threshold = (x < (1.0 - a))\n                ? ((x < a) ? cases.x : cases.y)\n                : cases.z;\n\n            // Avoids ατ == 0. Could also do ατ =1-ατ\n            return clamp(threshold , 1.0e-6, 1.0);\n        }\n    #endif\n`;\n\nconst alphamap_fragment = `\n    #ifdef USE_ALPHAHASH\n        if (outColor.a < getAlphaHashThreshold(v_modelPos)) discard;\n    #endif\n`;\n\nfragmentShader = fragmentShader.replace('#include <alphamap_pars_frag>', `\n    #include <alphamap_pars_frag>\n    ${alphahash_pars_fragment}\n`);\n\nfragmentShader = fragmentShader.replace('#include <alphaTest_frag>', `\n    #include <alphaTest_frag>\n    ${alphamap_fragment}\n`);\n"
  },
  {
    "path": "examples/jsm/materials/AttenuationMaterial.js",
    "content": "import { MATERIAL_TYPE, PBRMaterial, ShaderLib } from 't3d';\n\nconst fresnel_pars_frag = `\n#include <inverse>\n#include <transpose>\n#ifdef FRESNEL\n\tuniform float fresnelPower;\n\tuniform bool fresnelInverse;\n#endif\n`;\n\nconst fresnel_frag = `\n#ifdef FRESNEL\n    vec3 normal = (transposeMat4(inverseMat4(u_View)) * vec4(N, 0.0)).xyz;\n    normal = normalize(normal);\n\tif (fresnelInverse) {\n\t\tgl_FragColor.a *= pow(abs(dot(normal, vec3(0., 0., 1.))), fresnelPower);\n\t} else {\n\t\tgl_FragColor.a *= pow(1.0 - abs(dot(normal, vec3(0., 0., 1.))), fresnelPower);\n\t}\n#endif\n`;\n\nlet pbr_frag = ShaderLib.pbr_frag;\n\npbr_frag = pbr_frag.replace('#include <clippingPlanes_pars_frag>', `\n    #include <clippingPlanes_pars_frag>\n    ${fresnel_pars_frag}\n`);\n\npbr_frag = pbr_frag.replace('#include <end_frag>', `\n    #include <end_frag>\n    ${fresnel_frag}\n`);\n\nclass AttenuationPBRMaterial extends PBRMaterial {\n\n\tconstructor(sourceMaterial) {\n\t\tsuper();\n\n\t\tthis.type = MATERIAL_TYPE.SHADER;\n\n\t\tif (sourceMaterial) {\n\t\t\tthis.copy(sourceMaterial);\n\t\t}\n\n\t\tthis.shaderName = 'AttenuationPBR';\n\n\t\tthis.vertexShader = ShaderLib.pbr_vert;\n\t\tthis.fragmentShader = pbr_frag;\n\n\t\tthis.defines.FRESNEL = true;\n\n\t\tthis.uniforms.fresnelPower = 0.9;\n\t\tthis.uniforms.fresnelInverse = false;\n\n\t\tthis.transparent = true;\n\t}\n\n}\n\nexport { AttenuationPBRMaterial, fresnel_pars_frag, fresnel_frag };\n"
  },
  {
    "path": "examples/jsm/materials/BatchedMaterial.js",
    "content": "import { ShaderLib, PBRMaterial, MATERIAL_TYPE } from 't3d';\n\nconst batching_pars_vert = `\n#ifdef USE_BATCHING\n\t#extension GL_ANGLE_multi_draw: require\n\n\tuniform usampler2D batchingIdTexture;\n\tuniform sampler2D batchingTexture;\n\n\tfloat getIndirectIndex(const in int i) {\n\t\tint size = textureSize(batchingIdTexture, 0).x;\n\t\tint x = i % size;\n\t\tint y = i / size;\n\t\treturn float(texelFetch(batchingIdTexture, ivec2(x, y), 0).r);\n\t}\n\n\tmat4 getBatchingMatrix(const in float i) {\n\t\tint size = textureSize(batchingTexture, 0).x;\n\t\tint j = int(i) * 4;\n\t\tint x = j % size;\n\t\tint y = j / size;\n\t\tvec4 v1 = texelFetch(batchingTexture, ivec2(x, y), 0);\n\t\tvec4 v2 = texelFetch(batchingTexture, ivec2(x + 1, y), 0);\n\t\tvec4 v3 = texelFetch(batchingTexture, ivec2(x + 2, y), 0);\n\t\tvec4 v4 = texelFetch(batchingTexture, ivec2(x + 3, y), 0);\n\t\treturn mat4(v1, v2, v3, v4);\n\t}\n\n\t#ifdef USE_BATCHING_COLOR\n\t\tuniform sampler2D batchingColorTexture;\n\t\tvec4 getBatchingColor(const in float i) {\n\t\t\tint size = textureSize(batchingColorTexture, 0).x;\n\t\t\tint j = int(i);\n\t\t\tint x = j % size;\n\t\t\tint y = j / size;\n\t\t\treturn texelFetch(batchingColorTexture, ivec2(x, y), 0);\n\t\t}\n\n\t\tvarying vec4 v_BatchingColor;\n\t#endif\n#endif\n`;\n\nconst batching_position_vert = `\n#ifdef USE_BATCHING\n\tmat4 batchingMatrix = getBatchingMatrix(getIndirectIndex(gl_DrawID));\n\tvec4 worldPosition = u_Model * batchingMatrix * vec4(transformed, 1.0);\n#else\n\tvec4 worldPosition = u_Model * vec4(transformed, 1.0);\n#endif\ngl_Position = u_ProjectionView * worldPosition;\n`;\n\nconst batching_normal_vert = `\n#ifdef USE_BATCHING\n\tmat4 batchingNormalMatrix = transposeMat4(inverseMat4(batchingMatrix));\n\n\tobjectNormal = (batchingNormalMatrix * vec4(objectNormal, 0.0)).xyz;\n\n\t#ifdef USE_TANGENT\n\t\tobjectTangent = (batchingNormalMatrix * vec4(objectTangent, 0.0)).xyz;\n\t#endif\n#endif\n`;\n\nconst batching_color_vert = `\n#if defined(USE_BATCHING) && defined(USE_BATCHING_COLOR)\n\tv_BatchingColor = getBatchingColor(getIndirectIndex(gl_DrawID));\n#endif\n`;\n\nconst batching_pars_frag = `\n#if defined(USE_BATCHING) && defined(USE_BATCHING_COLOR)\n\tvarying vec4 v_BatchingColor;\n#endif\n`;\n\nconst batching_color_frag = `\n#if defined(USE_BATCHING) && defined(USE_BATCHING_COLOR)\n\toutColor *= v_BatchingColor;\n#endif\n`;\n\n// BatchedPBRMaterial\n\nlet pbr_vert = ShaderLib.pbr_vert;\n\npbr_vert = pbr_vert.replace('#include <logdepthbuf_pars_vert>', `\n#include <logdepthbuf_pars_vert>\n${batching_pars_vert}\n`);\n\npbr_vert = pbr_vert.replace('#include <pvm_vert>', batching_position_vert);\n\npbr_vert = pbr_vert.replace('#include <normal_vert>', `\n${batching_normal_vert}\n#include <normal_vert>\n`);\n\npbr_vert = pbr_vert.replace('#include <color_vert>', `\n#include <color_vert>\n${batching_color_vert}\n`);\n\nlet pbr_frag = ShaderLib.pbr_frag;\n\npbr_frag = pbr_frag.replace('#include <color_pars_frag>', `\n#include <color_pars_frag>\n${batching_pars_frag}\n`);\n\npbr_frag = pbr_frag.replace('#include <color_frag>', `\n#include <color_frag>\n${batching_color_frag}\n`);\n\nclass BatchedPBRMaterial extends PBRMaterial {\n\n\tconstructor(sourceMaterial) {\n\t\tsuper();\n\n\t\tthis.type = MATERIAL_TYPE.SHADER;\n\n\t\tif (sourceMaterial) {\n\t\t\tthis.copy(sourceMaterial);\n\t\t}\n\n\t\tthis.shaderName = 'BatchedPBR';\n\n\t\tthis.vertexShader = pbr_vert;\n\t\tthis.fragmentShader = pbr_frag;\n\n\t\tthis.defines.USE_BATCHING = true;\n\t\tthis.defines.USE_BATCHING_COLOR = false;\n\n\t\tthis.uniforms.batchingIdTexture = null;\n\t\tthis.uniforms.batchingTexture = null;\n\t\tthis.uniforms.batchingColorTexture = null;\n\t}\n\n}\n\n// TODO BatchedDepthMaterial\n\nexport {\n\tBatchedPBRMaterial,\n\tbatching_pars_vert,\n\tbatching_position_vert, batching_normal_vert, batching_color_vert,\n\tbatching_pars_frag, batching_color_frag\n};"
  },
  {
    "path": "examples/jsm/materials/BatchedPBRMaterial.js",
    "content": "// deprecated since v0.4.0\nconsole.warn('BatchedPBRMaterial has been moved to t3d/addons/material/BatchedMaterial.js');\nexport { BatchedPBRMaterial } from './BatchedMaterial.js';"
  },
  {
    "path": "examples/jsm/materials/BitmapTextMaterial.js",
    "content": "import { ShaderMaterial } from 't3d';\n\nclass BitmapTextMaterial extends ShaderMaterial {\n\n\tconstructor() {\n\t\tsuper(BitmapTextShader);\n\t\tthis.transparent = true;\n\t}\n\n}\n\nconst BitmapTextShader = {\n\tname: 'bitmap_text',\n\n\tdefines: {\n\t\tBILLBOARD: false,\n\t\tSIZEATTENUATION: true,\n\t\tBITMAP_TYPE: 1,\n\t\tSHADOW: false,\n\t\tOUTLINE: false\n\t},\n\n\tuniforms: {\n\t\trotation: 0,\n\t\tcenter: [0.5, 0.5],\n\t\tgamma: 1,\n\t\thalo: 0.75,\n\t\tshadowColor: [0.3, 0.3, 0.3],\n\t\tshadowOffset: [0.001, -0.001],\n\t\tshadowGamma: 1,\n\t\toutlineColor: [1, 0, 0],\n\t\toutlineWidth: 0.05,\n\t\toutlineGamma: 1\n\t},\n\n\tvertexShader: `\n\t\t#include <common_vert>\n\t\t#include <logdepthbuf_pars_vert>\n\n\t\tattribute vec2 a_Uv;\n\t\tattribute vec2 a_Size;\n\n\t\tuniform mat3 uvTransform;\n\n\t\t#ifdef BILLBOARD\n\t\t\tuniform float rotation;\n\t\t\tuniform vec2 center;\n\t\t#endif\n\n\t\tvarying vec2 v_Uv;\n\t\tvarying vec2 v_Size;\n\n\t\tvoid main() {\n\t\t\t#ifdef BILLBOARD\n\t\t\t\tvec4 mvPosition = u_View * u_Model * vec4( 0.0, 0.0, 0.0, 1.0 );\n\n\t\t\t\tvec2 scale;\n\t\t\t\tscale.x = length(vec3(u_Model[0].x, u_Model[0].y, u_Model[0].z));\n\t\t\t\tscale.y = length(vec3(u_Model[1].x, u_Model[1].y, u_Model[1].z));\n\n\t\t\t\t#ifndef SIZEATTENUATION\n\t\t\t\t\tbool isPerspective = isPerspectiveMatrix(u_Projection);\n\t\t\t\t\tif (isPerspective) scale *= - mvPosition.z;\n\t\t\t\t#endif\n\n\t\t\t\tvec2 alignedPosition = (a_Position.xy - (center - vec2(0.5))) * scale;\n\n\t\t\t\tvec2 rotatedPosition;\n\t\t\t\trotatedPosition.x = cos(rotation) * alignedPosition.x - sin(rotation) * alignedPosition.y;\n\t\t\t\trotatedPosition.y = sin(rotation) * alignedPosition.x + cos(rotation) * alignedPosition.y;\n\n\t\t\t\tmvPosition.xy += rotatedPosition;\n\n\t\t\t\tgl_Position = u_Projection * mvPosition;\n\t\t\t#else\n\t\t\t\tgl_Position = u_ProjectionView * u_Model * vec4(a_Position, 1.0);\n\t\t\t#endif\n\n\t\t\tv_Uv = (uvTransform * vec3(a_Uv, 1.)).xy;\n\t\t\tv_Size = a_Size;\n\n\t\t\t#include <logdepthbuf_vert>\n\t\t}\n\t`,\n\n\tfragmentShader: `\n\t\tuniform vec3 u_Color;\n\t\tuniform float u_Opacity;\n\t\tuniform sampler2D diffuseMap;\n\n\t\tuniform float halo;\n\t\tuniform float gamma;\n\n\t\t#ifdef SHADOW\n\t\t\tuniform vec3 shadowColor;\n\t\t\tuniform vec2 shadowOffset;\n\t\t\tuniform float shadowGamma;\n\t\t#endif\n\n\t\t#ifdef OUTLINE\n\t\t\tuniform vec3 outlineColor;\n\t\t\tuniform float outlineWidth;\n\t\t\tuniform float outlineGamma;\n\t\t#endif\n\n\t\tvarying vec2 v_Uv;\n\t\tvarying vec2 v_Size;\n\n\t\tvec4 blendColors(vec4 src, vec4 dst) {\n\t\t\treturn vec4(src.rgb * src.a + dst.rgb * (1.0 - src.a), src.a + dst.a * (1.0 - src.a));\n\t\t}\n\n\t\tfloat getAlpha(float dist, float halo, float gamma) {\n\t\t\treturn smoothstep(halo - gamma, halo + gamma, dist);\n\t\t}\n\n\t\t#if BITMAP_TYPE == 1\n\t\t\tfloat getSDFDist(vec2 uv) {\n\t\t\t\treturn texture2D(diffuseMap, uv).r;\n\t\t\t}\n\n\t\t#elif BITMAP_TYPE == 2\n\t\t\tfloat median(float r, float g, float b) {\n\t\t\t\treturn max(min(r, g), min(max(r, g), b));\n\t\t\t}\n\t\t\tfloat getSDFDist(vec2 uv) {\n\t\t\t\tvec3 cannels = texture2D(diffuseMap, uv).rgb;\n\t\t\t\treturn median(cannels.r, cannels.g, cannels.b);\n\t\t\t}\n\t\t#endif\n\n\t\t#include <fog_pars_frag>\n\t\t#include <logdepthbuf_pars_frag>\n\n\t\tvoid main() {\n\t\t\t#include <logdepthbuf_frag>\n\n\t\t\t#if BITMAP_TYPE == 0\n\t\t\t\tgl_FragColor = texture2D(diffuseMap, v_Uv);\n\t\t\t#else\n\t\t\t\tfloat dist = getSDFDist(v_Uv);\n\n\t\t\t\tfloat gammaScalar = 1.5 * length(fwidth(v_Size));\n\n\t\t\t\tvec4 resultColor = vec4(0.0);\n\n\t\t\t\t#ifdef SHADOW\n\t\t\t\t\tfloat shadowDist = getSDFDist(v_Uv - shadowOffset);\n\t\t\t\t\tfloat shadowAlpha = getAlpha(shadowDist, halo, shadowGamma * gammaScalar);\n\t\t\t\t\tresultColor = blendColors(vec4(shadowColor, shadowAlpha), resultColor);\n\t\t\t\t#endif\n\n\t\t\t\t#ifdef OUTLINE\n\t\t\t\t\tfloat outlineAlpha = getAlpha(dist, halo - outlineWidth, outlineGamma * gammaScalar);\n\t\t\t\t\tresultColor = blendColors(vec4(outlineColor, outlineAlpha), resultColor);\n\t\t\t\t#endif\n\n\t\t\t\tfloat textAlpha = getAlpha(dist, halo, gamma * gammaScalar);\n\t\t\t\tresultColor = blendColors(vec4(u_Color, textAlpha), resultColor);\n\n\t\t\t\tresultColor.rgb /= resultColor.a;\n\t\t\t\tresultColor.a *= u_Opacity;\n\n\t\t\t\tgl_FragColor = resultColor;\n\t\t\t#endif\n\n\t\t\t#include <fog_frag>\n\t\t}\n\t`\n};\n\nexport { BitmapTextMaterial, BitmapTextShader };"
  },
  {
    "path": "examples/jsm/materials/InstancedBasicMaterial.js",
    "content": "// deprecated since v0.3.1, add warning since v0.4.0\nconsole.warn('InstancedBasicMaterial has been moved to t3d/addons/material/InstancedMaterial.js');\nexport { InstancedBasicMaterial } from './InstancedMaterial.js';"
  },
  {
    "path": "examples/jsm/materials/InstancedMaterial.js",
    "content": "import { ShaderLib, PBRMaterial, BasicMaterial, DepthMaterial, MATERIAL_TYPE } from 't3d';\n\nconst instancing_pars_vert = `\n#ifdef USE_INSTANCING\n\tattribute mat4 instanceMatrix;\n\tuniform mat4 instanceOffset;\n#endif\n`;\n\nconst instancing_position_vert = `\n#ifdef USE_INSTANCING\n\tmat4 instancingMatrix = inverseMat4(instanceOffset) * instanceMatrix * instanceOffset;\n\ttransformed = (instancingMatrix * vec4(transformed, 1.0)).xyz;\n#endif\n`;\n\nconst instancing_normal_vert = `\n#ifdef USE_INSTANCING\n\tmat3 im = mat3(instancingMatrix);\n\n\t// mirrored? (determinant sign: -1 or +1)\n    float detSign = (dot(im[0], cross(im[1], im[2])) < 0.0) ? -1.0 : 1.0;\n\n\t// squared scale per basis (for non-uniform scale correction)\n    vec3 invScale = vec3(dot(im[0], im[0]), dot(im[1], im[1]), dot(im[2], im[2]));\n\n\tobjectNormal = (im * (objectNormal / invScale)) * detSign;\n\n\t#ifdef USE_TANGENT\n\t\tobjectTangent = (im * (objectTangent / invScale)) * detSign;\n\t#endif\n#endif\n`;\n\n// InstancedPBRMaterial\n\nlet pbr_vert = ShaderLib.pbr_vert;\n\npbr_vert = pbr_vert.replace('#include <logdepthbuf_pars_vert>', `\n#include <logdepthbuf_pars_vert>\n${instancing_pars_vert}\n`);\npbr_vert = pbr_vert.replace('#include <pvm_vert>', `\n${instancing_position_vert}\n#include <pvm_vert>\n`);\npbr_vert = pbr_vert.replace('#include <normal_vert>', `\n${instancing_normal_vert}\n#include <normal_vert>\n`);\n\nclass InstancedPBRMaterial extends PBRMaterial {\n\n\tconstructor(sourceMaterial) {\n\t\tsuper();\n\n\t\tthis.type = MATERIAL_TYPE.SHADER;\n\n\t\tif (sourceMaterial) {\n\t\t\tthis.copy(sourceMaterial);\n\t\t}\n\n\t\tthis.shaderName = 'InstancedPBR';\n\n\t\tthis.vertexShader = pbr_vert;\n\t\tthis.fragmentShader = ShaderLib.pbr_frag;\n\n\t\tthis.defines.USE_INSTANCING = true;\n\t\tthis.uniforms.instanceOffset = new Float32Array([\n\t\t\t1, 0, 0, 0,\n\t\t\t0, 1, 0, 0,\n\t\t\t0, 0, 1, 0,\n\t\t\t0, 0, 0, 1\n\t\t]);\n\t}\n\n}\n\n// InstancedBasicMaterial\n\nlet basic_vert = ShaderLib.basic_vert;\n\nbasic_vert = basic_vert.replace('#include <logdepthbuf_pars_vert>', `\n\t#include <logdepthbuf_pars_vert>\n\t${instancing_pars_vert}\n`);\n\nbasic_vert = basic_vert.replace('#include <pvm_vert>', `\n\t${instancing_position_vert}\n\t#include <pvm_vert>\n`);\n\nclass InstancedBasicMaterial extends BasicMaterial {\n\n\tconstructor(sourceMaterial) {\n\t\tsuper();\n\n\t\tthis.type = MATERIAL_TYPE.SHADER;\n\n\t\tif (sourceMaterial) {\n\t\t\tthis.copy(sourceMaterial);\n\t\t}\n\n\t\tthis.shaderName = 'InstancedBasic';\n\n\t\tthis.vertexShader = basic_vert;\n\t\tthis.fragmentShader = ShaderLib.basic_frag;\n\n\t\tthis.defines.USE_INSTANCING = true;\n\t\tthis.uniforms.instanceOffset = new Float32Array([\n\t\t\t1, 0, 0, 0,\n\t\t\t0, 1, 0, 0,\n\t\t\t0, 0, 1, 0,\n\t\t\t0, 0, 0, 1\n\t\t]);\n\t}\n\n}\n\n// InstancedDepthMaterial\n\nlet depth_vert = ShaderLib.depth_vert;\n\ndepth_vert = depth_vert.replace('#include <logdepthbuf_pars_vert>', `\n\t#include <logdepthbuf_pars_vert>\n\t${instancing_pars_vert}\n`);\n\ndepth_vert = depth_vert.replace('#include <pvm_vert>', `\n\t${instancing_position_vert}\n\t#include <pvm_vert>\n`);\n\nclass InstancedDepthMaterial extends DepthMaterial {\n\n\tconstructor(sourceMaterial) {\n\t\tsuper();\n\n\t\tthis.type = MATERIAL_TYPE.SHADER;\n\n\t\tif (sourceMaterial) {\n\t\t\tthis.copy(sourceMaterial);\n\t\t}\n\n\t\tthis.shaderName = 'InstancedDepth';\n\n\t\tthis.vertexShader = depth_vert;\n\t\tthis.fragmentShader = ShaderLib.depth_frag;\n\n\t\tthis.defines.USE_INSTANCING = true;\n\t\tthis.uniforms.instanceOffset = new Float32Array([\n\t\t\t1, 0, 0, 0,\n\t\t\t0, 1, 0, 0,\n\t\t\t0, 0, 1, 0,\n\t\t\t0, 0, 0, 1\n\t\t]);\n\t}\n\n}\n\nexport {\n\tInstancedPBRMaterial, InstancedBasicMaterial, InstancedDepthMaterial,\n\tinstancing_pars_vert, instancing_position_vert, instancing_normal_vert\n};"
  },
  {
    "path": "examples/jsm/materials/InstancedPBRMaterial.js",
    "content": "// deprecated since v0.3.1, add warning since v0.4.0\nconsole.warn('InstancedPBRMaterial has been moved to t3d/addons/material/InstancedMaterial.js');\nexport { InstancedPBRMaterial } from './InstancedMaterial.js';"
  },
  {
    "path": "examples/jsm/materials/PlanarReflectionMaterial.js",
    "content": "import { ShaderLib, PBRMaterial, MATERIAL_TYPE } from 't3d';\n\nexport class PlanarReflectionMaterial extends PBRMaterial {\n\n\tconstructor(sourceMaterial) {\n\t\tsuper();\n\n\t\tthis.type = MATERIAL_TYPE.SHADER;\n\n\t\tif (sourceMaterial) {\n\t\t\tthis.copy(sourceMaterial);\n\t\t}\n\n\t\tthis.shaderName = 'PlanarReflection';\n\n\t\tthis.vertexShader = vertexShader;\n\t\tthis.fragmentShader = fragmentShader;\n\n\t\tthis.defines.USE_PLANAR_REFLECT = true;\n\n\t\tthis.uniforms.reflectIntensity = 1.0;\n\t\tthis.uniforms.reflectTexture = null;\n\t\tthis.uniforms.reflectTextureMatrix = new Float32Array(16);\n\t\tthis.uniforms.reflectNormalScale = 1.0;\n\t}\n\n}\n\nconst reflection_pars_vertex = `\n    #ifdef USE_PLANAR_REFLECT\n        uniform mat4 reflectTextureMatrix;\n        varying vec4 v_reflectionUV;\n    #endif\n`;\n\nconst reflection_vertex = `\n    #ifdef USE_PLANAR_REFLECT\n        v_reflectionUV = reflectTextureMatrix * vec4(worldPosition.xyz, 1.0);\n    #endif\n`;\n\nconst reflection_pars_fragment = `\n    #ifdef USE_PLANAR_REFLECT\n        uniform sampler2D reflectTexture;\n        uniform float reflectIntensity;\n\n        #ifdef USE_NORMAL_MAP\n            uniform float reflectNormalScale;\n        #endif\n\n        varying vec4 v_reflectionUV;\n    #endif\n`;\n\nconst reflection_fragment = `\n    #ifdef USE_PLANAR_REFLECT\n        vec4 reflectionUV = v_reflectionUV;\n        reflectionUV.xyz = reflectionUV.xyz / reflectionUV.w;\n\n        #ifdef USE_NORMAL_MAP\n            reflectionUV.xyz += ((texture2D(normalMap, v_Uv).rgb - 0.5) * reflectNormalScale) / 50.;\n        #endif\n\n        vec4 reflectionColor = sRGBToLinear(texture2D(reflectTexture, reflectionUV.xy));\n        float refectFactor = clamp(1.0 - reflectIntensity * reflectionColor.a, 0.0, 1.0);\n        outColor.rgb = mix(reflectionColor.rgb, outColor.rgb, refectFactor);\n    #endif\n`;\n\nlet fragmentShader = ShaderLib.pbr_frag;\nlet vertexShader = ShaderLib.pbr_vert;\n\nfragmentShader = fragmentShader.replace('#include <emissiveMap_pars_frag>', `\n    #include <emissiveMap_pars_frag>\n    ${reflection_pars_fragment}\n`);\n\nfragmentShader = fragmentShader.replace('#include <emissiveMap_frag>', `\n    #include <emissiveMap_frag>\n    ${reflection_fragment}\n`);\n\nvertexShader = vertexShader.replace('#include <modelPos_pars_vert>', `\n    #include <modelPos_pars_vert>\n    ${reflection_pars_vertex}\n`);\n\nvertexShader = vertexShader.replace('#include <modelPos_vert>', `\n    #include <modelPos_vert>\n    ${reflection_vertex}\n`);"
  },
  {
    "path": "examples/jsm/materials/TransmissionPBRMaterial.js",
    "content": "import { ShaderLib, PBRMaterial, MATERIAL_TYPE } from 't3d';\n\nexport class TransmissionPBRMaterial extends PBRMaterial {\n\n\tconstructor(sourceMaterial) {\n\t\tsuper();\n\n\t\tthis.type = MATERIAL_TYPE.SHADER;\n\n\t\tif (sourceMaterial) {\n\t\t\tthis.copy(sourceMaterial);\n\t\t}\n\n\t\tthis.shaderName = 'TransmissionPBR';\n\n\t\tthis.vertexShader = ShaderLib.pbr_vert;\n\t\tthis.fragmentShader = fragmentShader;\n\n\t\t// KHR_materials_transmission\n\t\tthis.uniforms.transmission = 0;\n\t\tthis.uniforms.transmissionMap = null;\n\t\tthis.uniforms.transmissionSamplerMap = null;\n\t\tthis.uniforms.transmissionSamplerSize = [512, 512];\n\t\tthis.defines.USE_TRANSMISSIONMAP = false;\n\t\tthis.defines.SAMPLERMAP_SRGB = true;\n\n\t\t// KHR_materials_volume\n\t\tthis.uniforms.thickness = 0;\n\t\tthis.uniforms.thicknessMap = null;\n\t\tthis.uniforms.attenuationColor = [1, 1, 1];\n\t\tthis.uniforms.attenuationDistance = Infinity;\n\t\tthis.defines.USE_THICKNESSMAP = false;\n\n\t\t// KHR_materials_ior\n\t\tthis.uniforms.ior = 1.5;\n\n\t\t// KHR_materials_dispersion\n\t\tthis.uniforms.dispersion = 0;\n\t\tthis.defines.USE_DISPERSION = false;\n\t}\n\n}\n\n// Transmission code is based on glTF-Sampler-Viewer\n// https://github.com/KhronosGroup/glTF-Sample-Viewer\nconst transmission_pars_frag = `\n\tuniform float transmission;\n\tuniform float thickness;\n\tuniform float attenuationDistance;\n    uniform vec3 attenuationColor;\n\n\t#ifdef USE_TRANSMISSIONMAP\n        uniform sampler2D transmissionMap;\n    #endif\n\n\t#ifdef USE_THICKNESSMAP\n        uniform sampler2D thicknessMap;\n    #endif\n\n\tuniform float dispersion;\n    uniform float ior;\n\n\tuniform vec2 transmissionSamplerSize;\n    uniform sampler2D transmissionSamplerMap;\n\n\tuniform mat4 u_Model;\n    uniform mat4 u_Projection;\n\n\t#ifdef SAMPLERMAP_SRGB\n\t\tvec4 samplerTexelToLinear(vec4 value) {\n\t\t\treturn sRGBToLinear(value);\n\t\t}\n\t#else\n\t\tvec4 samplerTexelToLinear(vec4 value) {\n\t\t\treturn value;\n\t\t}\n\t#endif\n\n\tstruct TransmissionParams {\n        float specularF90;\n        vec3  specularColor;\n        float ior;\n        float transmission;\n        float transmissionAlpha;\n        float thickness;\n        float attenuationDistance;\n        vec3 attenuationColor;\n    };\n    TransmissionParams transParams;\n\n\t// Mipped Bicubic Texture Filtering by N8\n    // https://www.shadertoy.com/view/Dl2SDW\n\n    float w0(float a) {\n        return(1.0 / 6.0) * (a * (a * (-a + 3.0) - 3.0) + 1.0);\n    }\n\n    float w1(float a) {\n        return (1.0 / 6.0) * (a *  a * (3.0 * a - 6.0) + 4.0);\n    }\n\n    float w2(float a){\n        return (1.0 / 6.0) * (a * (a * (-3.0 * a + 3.0) + 3.0) + 1.0);\n    }\n\n    float w3(float a) {\n        return (1.0 / 6.0) * (a * a * a);\n    }\n\n    // g0 and g1 are the two amplitude functions\n    float g0(float a) {\n        return w0(a) + w1(a);\n    }\n\n    float g1(float a) {\n        return w2(a) + w3(a);\n    }\n\n    // h0 and h1 are the two offset functions\n    float h0(float a) {\n        return - 1.0 + w1(a) / (w0(a) + w1(a));\n    }\n\n    float h1(float a) {\n        return 1.0 + w3(a) / (w2(a) + w3(a));\n    }\n\n    vec4 bicubic(sampler2D tex, vec2 uv, vec4 texelSize, float lod) {\n        uv = uv * texelSize.zw + 0.5;\n\n        vec2 iuv = floor(uv);\n        vec2 fuv = fract(uv);\n\n        float g0x = g0(fuv.x);\n        float g1x = g1(fuv.x);\n        float h0x = h0(fuv.x);\n        float h1x = h1(fuv.x);\n        float h0y = h0(fuv.y);\n        float h1y = h1(fuv.y);\n\n        vec2 p0 = (vec2(iuv.x + h0x, iuv.y + h0y) - 0.5) * texelSize.xy;\n        vec2 p1 = (vec2(iuv.x + h1x, iuv.y + h0y) - 0.5) * texelSize.xy;\n        vec2 p2 = (vec2(iuv.x + h0x, iuv.y + h1y) - 0.5) * texelSize.xy;\n        vec2 p3 = (vec2(iuv.x + h1x, iuv.y + h1y) - 0.5) * texelSize.xy;\n\n        return g0(fuv.y) * (g0x * textureLod(tex, p0, lod) + g1x * textureLod(tex, p1, lod)) +\n            g1(fuv.y) * (g0x * textureLod(tex, p2, lod) + g1x * textureLod(tex, p3, lod));\n    }\n\n    vec4 textureBicubic(sampler2D sampler, vec2 uv, float lod) {\n        vec2 fLodSize = vec2(textureSize(sampler, int(lod)));\n        vec2 cLodSize = vec2(textureSize(sampler, int(lod + 1.0)));\n        vec2 fLodSizeInv = 1.0 / fLodSize;\n        vec2 cLodSizeInv = 1.0 / cLodSize;\n        vec4 fSample = bicubic(sampler, uv, vec4(fLodSizeInv, fLodSize), floor(lod));\n        vec4 cSample = bicubic(sampler, uv, vec4(cLodSizeInv, cLodSize), ceil(lod));\n        return mix(fSample, cSample, fract(lod));\n    }\n\n\tvec3 getVolumeTransmissionRay(const in vec3 n, const in vec3 v, const in float thickness, const in float ior, const in mat4 modelMatrix) {\n        // Direction of refracted light.\n        vec3 refractionVector = refract(-v, normalize(n), 1.0 / ior);\n\n        // Compute rotation-independant scaling of the model matrix.\n        vec3 modelScale;\n        modelScale.x = length(vec3(modelMatrix[0].xyz));\n        modelScale.y = length(vec3(modelMatrix[1].xyz));\n        modelScale.z = length(vec3(modelMatrix[2].xyz));\n\n        // The thickness is specified in local space.\n        return normalize(refractionVector) * thickness * modelScale;\n    }\n\n    float applyIorToRoughness(const in float roughness, const in float ior) {\n        // Scale roughness with IOR so that an IOR of 1.0 results in no microfacet refraction and\n        // an IOR of 1.5 results in the default amount of microfacet refraction.\n        return roughness * clamp(ior * 2.0 - 2.0, 0.0, 1.0);\n    }\n\n    vec4 getTransmissionSample(const in vec2 fragCoord, const in float roughness, const in float ior) {\n        float lod = log2(transmissionSamplerSize.x) * applyIorToRoughness(roughness, ior);\n        return samplerTexelToLinear(textureBicubic(transmissionSamplerMap, fragCoord.xy, lod));\n    }\n\n    vec3 volumeAttenuation(const in float transmissionDistance, const in vec3 attenuationColor, const in float attenuationDistance) {\n        if (isinf(attenuationDistance)) {\n            // Attenuation distance is +∞, i.e. the transmitted color is not attenuated at all.\n            return vec3(1.0);\n        } else {\n            // Compute light attenuation using Beer's law.\n            vec3 attenuationCoefficient = -log(attenuationColor) / attenuationDistance;\n            vec3 transmittance = exp(-attenuationCoefficient * transmissionDistance); // Beer's law\n            return transmittance;\n        }\n    }\n\n    vec2 DFGApprox(const in vec3 normal, const in vec3 viewDir, const in float roughness) {\n        float dotNV = saturate(dot(normal, viewDir));\n        const vec4 c0 = vec4(-1, -0.0275, -0.572, 0.022);\n        const vec4 c1 = vec4(1, 0.0425, 1.04, - 0.04);\n        vec4 r = roughness * c0 + c1;\n        float a004 = min(r.x * r.x, exp2(-9.28 * dotNV)) * r.x + r.y;\n        vec2 fab = vec2(-1.04, 1.04) * a004 + r.zw;\n        return fab;\n    }\n\n    vec3 EnvironmentBRDF(const in vec3 normal, const in vec3 viewDir, const in vec3 specularColor, const in float specularF90, const in float roughness) {\n        vec2 fab = DFGApprox(normal, viewDir, roughness);\n        return specularColor * fab.x + specularF90 * fab.y;\n    }\n\n\tvec4 getIBLVolumeRefraction(const in vec3 n, const in vec3 v, const in float roughness, const in vec3 diffuseColor,\n\t\tconst in vec3 specularColor, const in float specularF90, const in vec3 position, const in mat4 modelMatrix,\n\t\tconst in mat4 viewMatrix, const in mat4 projMatrix, const in float dispersion, const in float ior, const in float thickness,\n\t\tconst in vec3 attenuationColor, const in float attenuationDistance) {\n\n        vec4 transmittedLight;\n        vec3 transmittance;\n\n        #ifdef USE_DISPERSION\n            float halfSpread = (ior - 1.0) * 0.025 * dispersion;\n            vec3 iors = vec3(ior - halfSpread, ior, ior + halfSpread);\n\n            for (int i = 0; i < 3; i ++) {\n                vec3 transmissionRay = getVolumeTransmissionRay(n, v, thickness, iors[i], modelMatrix);\n                vec3 refractedRayExit = position + transmissionRay;\n\n                // Project refracted vector on the framebuffer, while mapping to normalized device coordinates.\n                vec4 ndcPos = projMatrix * viewMatrix * vec4(refractedRayExit, 1.0);\n                vec2 refractionCoords = ndcPos.xy / ndcPos.w;\n                refractionCoords += 1.0;\n                refractionCoords /= 2.0;\n\n                // Sample framebuffer to get pixel the refracted ray hits.\n                vec4 transmissionSample = getTransmissionSample(refractionCoords, roughness, iors[i]);\n                transmittedLight[i] = transmissionSample[i];\n                transmittedLight.a += transmissionSample.a;\n\n                transmittance[i] = diffuseColor[i] * volumeAttenuation(length(transmissionRay), attenuationColor, attenuationDistance)[i];\n            }\n\n            transmittedLight.a /= 3.0;\n        #else\n            vec3 transmissionRay = getVolumeTransmissionRay(n, v, thickness, ior, modelMatrix);\n            vec3 refractedRayExit = position + transmissionRay;\n\n            // Project refracted vector on the framebuffer, while mapping to normalized device coordinates.\n            vec4 ndcPos = projMatrix * viewMatrix * vec4(refractedRayExit, 1.0);\n            vec2 refractionCoords = ndcPos.xy / ndcPos.w;\n            refractionCoords += 1.0;\n            refractionCoords /= 2.0;\n\n            // Sample framebuffer to get pixel the refracted ray hits.\n            transmittedLight = getTransmissionSample(refractionCoords, roughness, ior);\n            transmittance = diffuseColor * volumeAttenuation(length(transmissionRay), attenuationColor, attenuationDistance);\n        #endif\n\n        vec3 attenuatedColor = transmittance * transmittedLight.rgb;\n\n        // Get the specular component.\n        vec3 F = EnvironmentBRDF(n, v, specularColor, specularF90, roughness);\n\n        // As less light is transmitted, the opacity should be increased. This simple approximation does a decent job\n        // of modulating a CSS background, and has no effect when the buffer is opaque, due to a solid object or clear color.\n        float transmittanceFactor = (transmittance.r + transmittance.g + transmittance.b) / 3.0;\n\n        return vec4((1.0 - F) * attenuatedColor, 1.0 - (1.0 - transmittedLight.a) * transmittanceFactor);\n    }\n`;\n\nconst transmission_frag = `\n\tvec3 totalDiffuse = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse;\n    vec3 totalSpecular = reflectedLight.directSpecular + reflectedLight.indirectSpecular;\n\n    transParams.ior = ior;\n    float specularIntensityFactor = 1.0;\n    vec3 specularColorFactor = vec3(1.0);\n    transParams.specularF90 = 1.0;\n    transParams.specularColor = mix(min(pow2((transParams.ior - 1.0) / (transParams.ior + 1.0)) * specularColorFactor, vec3(1.0)) * specularIntensityFactor, u_Color.rgb, metalnessFactor);\n\n    transParams.transmission = transmission;\n    transParams.transmissionAlpha = 1.0;\n    transParams.thickness = thickness;\n    transParams.attenuationDistance = attenuationDistance;\n    transParams.attenuationColor = attenuationColor;\n\n    #ifdef USE_TRANSMISSIONMAP\n        transParams.transmission *= texture2D(transmissionMap, v_Uv).r;\n    #endif\n\n    #ifdef USE_THICKNESSMAP\n        transParams.thickness *= texture2D(thicknessMap, v_Uv).g;\n    #endif\n\n    vec3 pos = v_modelPos;\n    vec3 v = normalize(u_CameraPosition - pos);\n    vec3 n = N;\n\n    vec4 transmitted = getIBLVolumeRefraction(\n        n, v,roughness, u_Color, specularColor, transParams.specularF90,\n        pos, u_Model, u_View, u_Projection, dispersion, transParams.ior, transParams.thickness,\n        transParams.attenuationColor, transParams.attenuationDistance);\n\n    transParams.transmissionAlpha = mix(transParams.transmissionAlpha, transmitted.a, transParams.transmission);\n    totalDiffuse = mix(totalDiffuse, transmitted.rgb, transParams.transmission);\n\n    outColor.xyz = totalDiffuse + totalSpecular;\n    outColor.a = outColor.a * transParams.transmissionAlpha;\n`;\n\nlet fragmentShader = ShaderLib.pbr_frag;\n\nfragmentShader = fragmentShader.replace(\n\t'#include <clippingPlanes_pars_frag>',\n\t`#include <clippingPlanes_pars_frag>\n\t${transmission_pars_frag}`\n);\n\nfragmentShader = fragmentShader.replace(\n\t'outColor.xyz = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular;',\n\ttransmission_frag\n);"
  },
  {
    "path": "examples/jsm/math/ColorGradient.js",
    "content": "import { Color3 } from 't3d';\n\nclass ColorGradient {\n\n\tconstructor() {\n\t\tthis._colorStops = [];\n\t\tthis._sortDirty = false;\n\t}\n\n\taddColorStop(position, color) {\n\t\tthis._colorStops.push({ position, color });\n\t\tthis._sortDirty = true;\n\t\treturn this;\n\t}\n\n\tremoveColorStop(position) {\n\t\tfor (let i = 0; i < this._colorStops.length; i++) {\n\t\t\tif (this._colorStops[i].position === position) {\n\t\t\t\tthis._colorStops.splice(i, 1);\n\t\t\t\tthis._sortDirty = true;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\treturn this;\n\t}\n\n\tclear() {\n\t\tthis._colorStops = [];\n\t\treturn this;\n\t}\n\n\tgetColor(position, target = new Color3()) {\n\t\tthis._sort();\n\n\t\tconst colorStops = this._colorStops;\n\n\t\ttarget.copy(colorStops[0].color);\n\n\t\tif (position > 0) {\n\t\t\tlet prevPosition = 0;\n\n\t\t\tfor (let i = 0; i < colorStops.length; i++) {\n\t\t\t\tconst colorStop = colorStops[i];\n\n\t\t\t\tif (colorStop.position < position) {\n\t\t\t\t\ttarget.copy(colorStop.color);\n\t\t\t\t\tprevPosition = colorStop.position;\n\t\t\t\t} else {\n\t\t\t\t\tconst t = (position - prevPosition) / (colorStop.position - prevPosition);\n\t\t\t\t\ttarget.lerp(colorStop.color, t);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn target;\n\t}\n\n\tgetUint8Array(steps, target = new Uint8Array(steps * 4)) {\n\t\tthis._sort();\n\n\t\tconst colorStops = this._colorStops;\n\n\t\tconst prevColor = _tempColor1,\n\t\t\tcolor = _tempColor2;\n\n\t\tprevColor.copy(colorStops[0].color);\n\n\t\tlet prevPosition = 0,\n\t\t\tcolorStopIndex = 0;\n\n\t\tfor (let i = 0; i < steps; i++) {\n\t\t\tconst position = i / (steps - 1);\n\n\t\t\tif (position > 0) {\n\t\t\t\twhile (colorStopIndex < colorStops.length) {\n\t\t\t\t\tconst colorStop = colorStops[colorStopIndex];\n\n\t\t\t\t\tif (colorStop.position < position) {\n\t\t\t\t\t\tprevColor.copy(colorStop.color);\n\t\t\t\t\t\tcolor.copy(prevColor);\n\t\t\t\t\t\tprevPosition = colorStop.position;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconst t = (position - prevPosition) / (colorStop.position - prevPosition);\n\t\t\t\t\t\tcolor.lerpColors(prevColor, colorStop.color, t);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tcolorStopIndex++;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tcolor.copy(prevColor);\n\t\t\t}\n\n\t\t\tconst offset = i * 4;\n\n\t\t\ttarget[offset] = color.r * 255;\n\t\t\ttarget[offset + 1] = color.g * 255;\n\t\t\ttarget[offset + 2] = color.b * 255;\n\t\t\ttarget[offset + 3] = 255;\n\t\t}\n\n\t\treturn target;\n\t}\n\n\t_sort() {\n\t\tif (this._sortDirty) {\n\t\t\tthis._colorStops.sort((a, b) => a.position - b.position);\n\t\t\tthis._sortDirty = false;\n\t\t}\n\t}\n\n}\n\nconst _tempColor1 = new Color3();\nconst _tempColor2 = new Color3();\n\nexport { ColorGradient };"
  },
  {
    "path": "examples/jsm/math/DistanceTransform.js",
    "content": "\n/**\n * DistanceTransform is a class for creating distance fields from image data.\n * ref: https://github.com/mapbox/tiny-sdf\n */\nclass DistanceTransform {\n\n\t/**\n\t * Create a new DistanceTransform instance.\n\t * @param {number} [maxPixelCount=64*64] - The maximum pixel count to handle.\n\t * @param {number} [maxGridSize=64] - The maximum grid size to handle.\n\t */\n\tconstructor(maxPixelCount = 64 * 64, maxGridSize = 64) {\n\t\tthis._gridOuter = new Float64Array(maxPixelCount);\n\t\tthis._gridInner = new Float64Array(maxPixelCount);\n\t\tthis._f = new Float64Array(maxGridSize);\n\t\tthis._z = new Float64Array(maxGridSize + 1);\n\t\tthis._v = new Uint16Array(maxGridSize);\n\t\tthis._uint8Clamper = new Uint8ClampedArray(1);\n\n\t\tthis._maxPixelCount = maxPixelCount;\n\t\tthis._maxGridSize = maxGridSize;\n\t}\n\n\t/**\n\t * Transform an image data to a distance field, which is stored in a Uint8Array.\n\t * @param {object} imageData - The image data to transform.\n\t * @param {Uint8Array|Uint8ClampedArray} imageData.data - The pixel data.\n\t * @param {number} imageData.width - The width of the image.\n\t * @param {number} imageData.height - The height of the image.\n\t * @param {object} [options] - The options.\n\t * @param {number} [options.radius=8] - The radius of the distance field.\n\t * @param {number} [options.cutoff=0.25] - The cutoff value.\n\t * @param {number} [options.inputChannel=3] - The input channel to use.\n\t * @param {number} [options.targetArray] - The target array to store the result.\n\t * @returns {Uint8Array}\n\t */\n\ttransform(imageData, options = {}) {\n\t\tconst { data, width, height } = imageData;\n\n\t\tconst pixelCount = width * height;\n\n\t\tif (pixelCount > this._maxPixelCount || Math.max(width, height) > this._maxGridSize) {\n\t\t\tconsole.warn('DistanceTransform: Max pixel count or max grid size exceeded.');\n\t\t\treturn null;\n\t\t}\n\n\t\tconst pixelSize = data.length / pixelCount;\n\n\t\tconst {\n\t\t\tradius = 8, cutoff = 0.25, inputChannel = 3,\n\t\t\ttargetArray = new Uint8Array(pixelCount)\n\t\t} = options;\n\n\t\tconst gridOuter = this._gridOuter;\n\t\tconst gridInner = this._gridInner;\n\t\tconst f = this._f;\n\t\tconst z = this._z;\n\t\tconst v = this._v;\n\t\tconst uint8Clamper = this._uint8Clamper;\n\n\t\tgridOuter.fill(INF, 0, pixelCount);\n\t\tgridInner.fill(0, 0, pixelCount);\n\n\t\tfor (let y = 0; y < height; y++) {\n\t\t\tfor (let x = 0; x < width; x++) {\n\t\t\t\tconst a = data[(y * width + x) * pixelSize + inputChannel] / 255; // alpha value\n\t\t\t\tif (a === 0) continue; // empty pixels\n\n\t\t\t\tconst i = y * width + x;\n\n\t\t\t\tif (a === 1) { // fully drawn pixels\n\t\t\t\t\tgridOuter[i] = 0;\n\t\t\t\t\tgridInner[i] = INF;\n\t\t\t\t} else { // aliased pixels\n\t\t\t\t\tconst d = 0.5 - a;\n\t\t\t\t\tgridOuter[i] = d > 0 ? d * d : 0;\n\t\t\t\t\tgridInner[i] = d < 0 ? d * d : 0;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tedt(gridOuter, 0, 0, width, height, width, f, v, z);\n\t\tedt(gridInner, 0, 0, width, height, width, f, v, z);\n\n\t\tfor (let i = 0; i < pixelCount; i++) {\n\t\t\tconst d = Math.sqrt(gridOuter[i]) - Math.sqrt(gridInner[i]);\n\t\t\tuint8Clamper[0] = Math.round(255 - 255 * (d / radius + cutoff));\n\t\t\ttargetArray[i] = uint8Clamper[0];\n\t\t}\n\n\t\treturn targetArray;\n\t}\n\n}\n\nconst INF = 1e20;\n\n// 2D Euclidean squared distance transform by Felzenszwalb & Huttenlocher https://cs.brown.edu/~pff/papers/dt-final.pdf\nfunction edt(data, x0, y0, width, height, gridSize, f, v, z) {\n\tfor (let x = x0; x < x0 + width; x++) edt1d(data, y0 * gridSize + x, gridSize, height, f, v, z);\n\tfor (let y = y0; y < y0 + height; y++) edt1d(data, y * gridSize + x0, 1, width, f, v, z);\n}\n\n// 1D squared distance transform\nfunction edt1d(grid, offset, stride, length, f, v, z) {\n\tv[0] = 0;\n\tz[0] = -INF;\n\tz[1] = INF;\n\tf[0] = grid[offset];\n\n\tfor (let q = 1, k = 0, s = 0; q < length; q++) {\n\t\tf[q] = grid[offset + q * stride];\n\t\tconst q2 = q * q;\n\n\t\tdo {\n\t\t\tconst r = v[k];\n\t\t\ts = (f[q] - f[r] + q2 - r * r) / (q - r) / 2;\n\t\t} while (s <= z[k] && --k > -1);\n\n\t\tk++;\n\t\tv[k] = q;\n\n\t\tz[k] = s;\n\t\tz[k + 1] = INF;\n\t}\n\n\tfor (let q = 0, k = 0; q < length; q++) {\n\t\twhile (z[k + 1] < q) k++;\n\t\tconst r = v[k];\n\t\tconst qr = q - r;\n\t\tgrid[offset + q * stride] = f[r] + qr * qr;\n\t}\n}\n\nexport { DistanceTransform };"
  },
  {
    "path": "examples/jsm/math/OBB.js",
    "content": "import { MathUtils, Ray, Box3, Matrix3, Matrix4, Vector3, Frustum } from 't3d';\n\n/**\n * An oriented bounding box (OBB) is a box that is aligned with the object's\n * local coordinate system. The OBB is defined by its center, halfSize and\n * rotation. The rotation matrix is a 3x3 matrix that defines the orientation\n * of the OBB. The halfSize vector defines the dimensions of the box along\n * each of its local axes.\n * @memberof t3d\n */\nclass OBB {\n\n\t/**\n\t * Create an oriented bounding box.\n\t * @param {Vector3} [center] - The center of the OBB.\n\t * @param {Vector3} [halfSize] - The half size of the OBB.\n\t * @param {Matrix3} [rotation] - The rotation of the OBB.\n\t */\n\tconstructor(center = new Vector3(), halfSize = new Vector3(), rotation = new Matrix3()) {\n\t\tthis.center = center;\n\t\tthis.halfSize = halfSize;\n\t\tthis.rotation = rotation;\n\t}\n\n\t/**\n\t * Set the center, half size and rotation of the OBB.\n\t * @param {Vector3} center - The center of the OBB.\n\t * @param {Vector3} halfSize - The half size of the OBB.\n\t * @param {Matrix3} rotation - The rotation of the OBB.\n\t * @returns {OBB}\n\t */\n\tset(center, halfSize, rotation) {\n\t\tthis.center = center;\n\t\tthis.halfSize = halfSize;\n\t\tthis.rotation = rotation;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Copy the values from the given OBB.\n\t * @param {OBB} obb - The OBB to copy.\n\t * @returns {OBB}\n\t */\n\tcopy(obb) {\n\t\tthis.center.copy(obb.center);\n\t\tthis.halfSize.copy(obb.halfSize);\n\t\tthis.rotation.copy(obb.rotation);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Clone this OBB.\n\t * @returns {OBB}\n\t */\n\tclone() {\n\t\treturn new this.constructor().copy(this);\n\t}\n\n\t/**\n\t * Get the size of the OBB.\n\t * @param {Vector3} result - The result vector.\n\t * @returns {Vector3} The size of the OBB.\n\t */\n\tgetSize(result) {\n\t\treturn result.copy(this.halfSize).multiplyScalar(2);\n\t}\n\n\t/**\n\t * Check if the OBB is empty.\n\t * @returns {boolean} Whether the OBB is empty.\n\t */\n\tisEmpty() {\n\t\treturn this.halfSize.x <= 0 || this.halfSize.y <= 0 || this.halfSize.z <= 0;\n\t}\n\n\t/**\n\t * Make the OBB empty.\n\t * @returns {OBB}\n\t */\n\tmakeEmpty() {\n\t\tthis.center.set(0, 0, 0);\n\t\tthis.halfSize.set(0, 0, 0);\n\t\tthis.rotation.identity();\n\t\treturn this;\n\t}\n\n\t/**\n\t * Get the closest point on the OBB to the given point.\n\t * Reference: Closest Point on OBB to Point in Real-Time Collision Detection\n\t * by Christer Ericson (chapter 5.1.4)\n\t * @param {Vector3} point - The point.\n\t * @param {Vector3} result - The result vector.\n\t * @returns {Vector3} The closest point on the OBB.\n\t */\n\tclampPoint(point, result) {\n\t\tconst halfSize = this.halfSize;\n\n\t\tv1.subVectors(point, this.center);\n\t\tthis.rotation.extractBasis(xAxis, yAxis, zAxis);\n\n\t\t// start at the center position of the OBB\n\n\t\tresult.copy(this.center);\n\n\t\t// project the target onto the OBB axes and walk towards that point\n\n\t\tconst x = MathUtils.clamp(v1.dot(xAxis), -halfSize.x, halfSize.x);\n\t\tresult.add(xAxis.multiplyScalar(x));\n\n\t\tconst y = MathUtils.clamp(v1.dot(yAxis), -halfSize.y, halfSize.y);\n\t\tresult.add(yAxis.multiplyScalar(y));\n\n\t\tconst z = MathUtils.clamp(v1.dot(zAxis), -halfSize.z, halfSize.z);\n\t\tresult.add(zAxis.multiplyScalar(z));\n\n\t\treturn result;\n\t}\n\n\t/**\n\t * Check if the OBB contains the given point.\n\t * @param {Vector3} point - The point.\n\t * @returns {boolean} Whether the OBB contains the point.\n\t */\n\tcontainsPoint(point) {\n\t\tv1.subVectors(point, this.center);\n\t\tthis.rotation.extractBasis(xAxis, yAxis, zAxis);\n\n\t\t// project v1 onto each axis and check if these points lie inside the OBB\n\n\t\treturn Math.abs(v1.dot(xAxis)) <= this.halfSize.x &&\n\t\t\tMath.abs(v1.dot(yAxis)) <= this.halfSize.y &&\n\t\t\tMath.abs(v1.dot(zAxis)) <= this.halfSize.z;\n\t}\n\n\t/**\n\t * Check if the OBB intersects the given Box3.\n\t * @param {Box3} box3 - The Box3.\n\t * @returns {boolean} Whether the OBB intersects the Box3.\n\t */\n\tintersectsBox3(box3) {\n\t\treturn this.intersectsOBB(obb.fromBox3(box3));\n\t}\n\n\t/**\n\t * Check if the OBB intersects the given sphere.\n\t * @param {Sphere} sphere - The sphere.\n\t * @returns {boolean} Whether the OBB intersects the sphere.\n\t */\n\tintersectsSphere(sphere) {\n\t\t// find the point on the OBB closest to the sphere center\n\t\tthis.clampPoint(sphere.center, closestPoint);\n\t\t// if that point is inside the sphere, the OBB and sphere intersect\n\t\treturn closestPoint.distanceToSquared(sphere.center) <= (sphere.radius * sphere.radius);\n\t}\n\n\t/**\n\t * Check if the OBB intersects the given OBB.\n\t * Reference: OBB-OBB Intersection in Real-Time Collision Detection\n\t * by Christer Ericson (chapter 4.4.1)\n\t * @param {OBB} obb - The OBB.\n\t * @param {number} [epsilon=Number.EPSILON] - A small number to counteract arithmetic errors.\n\t * @returns {boolean} Whether the OBB intersects the OBB.\n\t */\n\tintersectsOBB(obb, epsilon = Number.EPSILON) {\n\t\t// prepare data structures (the code uses the same nomenclature like the reference)\n\n\t\ta.c = this.center;\n\t\ta.e[0] = this.halfSize.x;\n\t\ta.e[1] = this.halfSize.y;\n\t\ta.e[2] = this.halfSize.z;\n\t\tthis.rotation.extractBasis(a.u[0], a.u[1], a.u[2]);\n\n\t\tb.c = obb.center;\n\t\tb.e[0] = obb.halfSize.x;\n\t\tb.e[1] = obb.halfSize.y;\n\t\tb.e[2] = obb.halfSize.z;\n\t\tobb.rotation.extractBasis(b.u[0], b.u[1], b.u[2]);\n\n\t\t// compute rotation matrix expressing b in a's coordinate frame\n\n\t\tfor (let i = 0; i < 3; i++) {\n\t\t\tfor (let j = 0; j < 3; j++) {\n\t\t\t\tR[i][j] = a.u[i].dot(b.u[j]);\n\t\t\t}\n\t\t}\n\n\t\t// compute translation vector\n\n\t\tv1.subVectors(b.c, a.c);\n\n\t\t// bring translation into a's coordinate frame\n\n\t\tt[0] = v1.dot(a.u[0]);\n\t\tt[1] = v1.dot(a.u[1]);\n\t\tt[2] = v1.dot(a.u[2]);\n\n\t\t// compute common subexpressions. Add in an epsilon term to\n\t\t// counteract arithmetic errors when two edges are parallel and\n\t\t// their cross product is (near) null\n\n\t\tfor (let i = 0; i < 3; i++) {\n\t\t\tfor (let j = 0; j < 3; j++) {\n\t\t\t\tAbsR[i][j] = Math.abs(R[i][j]) + epsilon;\n\t\t\t}\n\t\t}\n\n\t\tlet ra, rb;\n\n\t\t// test axes L = A0, L = A1, L = A2\n\n\t\tfor (let i = 0; i < 3; i++) {\n\t\t\tra = a.e[i];\n\t\t\trb = b.e[0] * AbsR[i][0] + b.e[1] * AbsR[i][1] + b.e[2] * AbsR[i][2];\n\t\t\tif (Math.abs(t[i]) > ra + rb) return false;\n\t\t}\n\n\t\t// test axes L = B0, L = B1, L = B2\n\n\t\tfor (let i = 0; i < 3; i++) {\n\t\t\tra = a.e[0] * AbsR[0][i] + a.e[1] * AbsR[1][i] + a.e[2] * AbsR[2][i];\n\t\t\trb = b.e[i];\n\t\t\tif (Math.abs(t[0] * R[0][i] + t[1] * R[1][i] + t[2] * R[2][i]) > ra + rb) return false;\n\t\t}\n\n\t\t// test axis L = A0 x B0\n\n\t\tra = a.e[1] * AbsR[2][0] + a.e[2] * AbsR[1][0];\n\t\trb = b.e[1] * AbsR[0][2] + b.e[2] * AbsR[0][1];\n\t\tif (Math.abs(t[2] * R[1][0] - t[1] * R[2][0]) > ra + rb) return false;\n\n\t\t// test axis L = A0 x B1\n\n\t\tra = a.e[1] * AbsR[2][1] + a.e[2] * AbsR[1][1];\n\t\trb = b.e[0] * AbsR[0][2] + b.e[2] * AbsR[0][0];\n\t\tif (Math.abs(t[2] * R[1][1] - t[1] * R[2][1]) > ra + rb) return false;\n\n\t\t// test axis L = A0 x B2\n\n\t\tra = a.e[1] * AbsR[2][2] + a.e[2] * AbsR[1][2];\n\t\trb = b.e[0] * AbsR[0][1] + b.e[1] * AbsR[0][0];\n\t\tif (Math.abs(t[2] * R[1][2] - t[1] * R[2][2]) > ra + rb) return false;\n\n\t\t// test axis L = A1 x B0\n\n\t\tra = a.e[0] * AbsR[2][0] + a.e[2] * AbsR[0][0];\n\t\trb = b.e[1] * AbsR[1][2] + b.e[2] * AbsR[1][1];\n\t\tif (Math.abs(t[0] * R[2][0] - t[2] * R[0][0]) > ra + rb) return false;\n\n\t\t// test axis L = A1 x B1\n\n\t\tra = a.e[0] * AbsR[2][1] + a.e[2] * AbsR[0][1];\n\t\trb = b.e[0] * AbsR[1][2] + b.e[2] * AbsR[1][0];\n\t\tif (Math.abs(t[0] * R[2][1] - t[2] * R[0][1]) > ra + rb) return false;\n\n\t\t// test axis L = A1 x B2\n\n\t\tra = a.e[0] * AbsR[2][2] + a.e[2] * AbsR[0][2];\n\t\trb = b.e[0] * AbsR[1][1] + b.e[1] * AbsR[1][0];\n\t\tif (Math.abs(t[0] * R[2][2] - t[2] * R[0][2]) > ra + rb) return false;\n\n\t\t// test axis L = A2 x B0\n\n\t\tra = a.e[0] * AbsR[1][0] + a.e[1] * AbsR[0][0];\n\t\trb = b.e[1] * AbsR[2][2] + b.e[2] * AbsR[2][1];\n\t\tif (Math.abs(t[1] * R[0][0] - t[0] * R[1][0]) > ra + rb) return false;\n\n\t\t// test axis L = A2 x B1\n\n\t\tra = a.e[0] * AbsR[1][1] + a.e[1] * AbsR[0][1];\n\t\trb = b.e[0] * AbsR[2][2] + b.e[2] * AbsR[2][0];\n\t\tif (Math.abs(t[1] * R[0][1] - t[0] * R[1][1]) > ra + rb) return false;\n\n\t\t// test axis L = A2 x B2\n\n\t\tra = a.e[0] * AbsR[1][2] + a.e[1] * AbsR[0][2];\n\t\trb = b.e[0] * AbsR[2][1] + b.e[1] * AbsR[2][0];\n\t\tif (Math.abs(t[1] * R[0][2] - t[0] * R[1][2]) > ra + rb) return false;\n\n\t\t// since no separating axis is found, the OBBs must be intersecting\n\n\t\treturn true;\n\t}\n\n\t/**\n\t * Check if the OBB intersects the given plane.\n\t * Reference: Testing Box Against Plane in Real-Time Collision Detection\n\t * by Christer Ericson (chapter 5.2.3)\n\t * @param {Plane} plane - The plane.\n\t * @returns {boolean} Whether the OBB intersects the plane.\n\t */\n\tintersectsPlane(plane) {\n\t\tthis.rotation.extractBasis(xAxis, yAxis, zAxis);\n\n\t\t// compute the projection interval radius of this OBB onto L(t) = this->center + t * p.normal;\n\n\t\tconst r = this.halfSize.x * Math.abs(plane.normal.dot(xAxis)) +\n\t\t\t\tthis.halfSize.y * Math.abs(plane.normal.dot(yAxis)) +\n\t\t\t\tthis.halfSize.z * Math.abs(plane.normal.dot(zAxis));\n\n\t\t// compute distance of the OBB's center from the plane\n\n\t\tconst d = plane.normal.dot(this.center) - plane.constant;\n\n\t\t// Intersection occurs when distance d falls within [-r,+r] interval\n\n\t\treturn Math.abs(d) <= r;\n\t}\n\n\t/**\n\t * Performs a ray/OBB intersection test and stores the intersection point\n\t * to the given 3D vector. If no intersection is detected, *null* is returned.\n\t * @param {Ray} ray - The ray.\n\t * @param {Vector3} result - The result vector.\n\t * @returns {Vector3 | null} The intersection point or *null*.\n\t */\n\tintersectRay(ray, result) {\n\t\t// the idea is to perform the intersection test in the local space\n\t\t// of the OBB.\n\n\t\tthis.toBoundingBoxAndTransform(aabb, matrix);\n\n\t\t// transform ray to the local space of the OBB\n\n\t\tlocalRay.copy(ray).applyMatrix4(inverse.copy(matrix).invert());\n\n\t\t// perform ray <-> AABB intersection test\n\n\t\tif (localRay.intersectBox(aabb, result)) {\n\t\t\t// transform the intersection point back to world space\n\t\t\treturn result.applyMatrix4(matrix);\n\t\t} else {\n\t\t\treturn null;\n\t\t}\n\t}\n\n\t/**\n\t * Performs a ray/OBB intersection test. Returns either true or false if\n\t * there is a intersection or not.\n\t * @param {Ray} ray - The ray.\n\t * @returns {boolean} Whether the ray intersects the OBB.\n\t */\n\tintersectsRay(ray) {\n\t\treturn this.intersectRay(ray, v1) !== null;\n\t}\n\n\t/**\n\t * Set the OBB from a Box3, the OBB will be axis-aligned.\n\t * @param {Box3} box3 - The Box3.\n\t * @returns {OBB}\n\t */\n\tfromBox3(box3) {\n\t\tbox3.getCenter(this.center);\n\t\tbox3.getSize(this.halfSize).multiplyScalar(0.5);\n\n\t\tthis.rotation.identity();\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Check if this OBB equals the given OBB.\n\t * @param {OBB} obb - The OBB to check against.\n\t * @returns {boolean} Whether this OBB equals\n\t */\n\tequals(obb) {\n\t\treturn obb.center.equals(this.center) &&\n\t\t\tobb.halfSize.equals(this.halfSize) &&\n\t\t\tobb.rotation.equals(this.rotation);\n\t}\n\n\t/**\n\t * Apply a 4x4 transformation matrix to the OBB.\n\t * @param {Matrix4} matrix - The transformation matrix.\n\t * @returns {OBB}\n\t */\n\tapplyMatrix4(matrix) {\n\t\tconst e = matrix.elements;\n\n\t\tlet sx = v1.set(e[0], e[1], e[2]).getLength();\n\t\tconst sy = v1.set(e[4], e[5], e[6]).getLength();\n\t\tconst sz = v1.set(e[8], e[9], e[10]).getLength();\n\n\t\tconst det = matrix.determinant();\n\t\tif (det < 0) sx = -sx;\n\n\t\trotationMatrix.setFromMatrix4(matrix);\n\n\t\tconst invSX = 1 / sx;\n\t\tconst invSY = 1 / sy;\n\t\tconst invSZ = 1 / sz;\n\n\t\trotationMatrix.elements[0] *= invSX;\n\t\trotationMatrix.elements[1] *= invSX;\n\t\trotationMatrix.elements[2] *= invSX;\n\n\t\trotationMatrix.elements[3] *= invSY;\n\t\trotationMatrix.elements[4] *= invSY;\n\t\trotationMatrix.elements[5] *= invSY;\n\n\t\trotationMatrix.elements[6] *= invSZ;\n\t\trotationMatrix.elements[7] *= invSZ;\n\t\trotationMatrix.elements[8] *= invSZ;\n\n\t\tthis.rotation.multiply(rotationMatrix);\n\n\t\tthis.halfSize.x *= sx;\n\t\tthis.halfSize.y *= sy;\n\t\tthis.halfSize.z *= sz;\n\n\t\t// https://github.com/mrdoob/three.js/issues/21753\n\t\tthis.center.applyMatrix4(matrix);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Set the OBB from center point and axis vectors.\n\t * @param {Vector3} center - The center of the OBB.\n\t * @param {Vector3} axisX - The x-axis of the OBB.\n\t * @param {Vector3} axisY - The y-axis of the OBB.\n\t * @param {Vector3} axisZ - The z-axis of the OBB.\n\t * @returns {OBB}\n\t */\n\tsetFromCenterAndAxes(center, axisX, axisY, axisZ) {\n\t\txAxis.copy(axisX);\n\t\tyAxis.copy(axisY);\n\t\tzAxis.copy(axisZ);\n\n\t\tconst scaleX = xAxis.getLength();\n\t\tconst scaleY = yAxis.getLength();\n\t\tconst scaleZ = zAxis.getLength();\n\n\t\txAxis.normalize();\n\t\tyAxis.normalize();\n\t\tzAxis.normalize();\n\n\t\t// handle the case where the box has a dimension of 0 in one axis\n\t\tif (scaleX === 0) {\n\t\t\txAxis.crossVectors(yAxis, zAxis);\n\t\t}\n\n\t\tif (scaleY === 0) {\n\t\t\tyAxis.crossVectors(xAxis, zAxis);\n\t\t}\n\n\t\tif (scaleZ === 0) {\n\t\t\tzAxis.crossVectors(xAxis, yAxis);\n\t\t}\n\n\t\tthis.rotation.set(\n\t\t\txAxis.x, yAxis.x, zAxis.x,\n\t\t\txAxis.y, yAxis.y, zAxis.y,\n\t\t\txAxis.z, yAxis.z, zAxis.z\n\t\t);\n\n\t\tthis.center.copy(center);\n\n\t\tthis.halfSize.set(scaleX, scaleY, scaleZ);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Get the axis-aligned bounding box (AABB) and transformation matrix of the OBB,\n\t * the bounding box center is always at (0, 0, 0) because center offset is stored in the Matrix4.\n\t * @param {Box3} box3 - The Box3.\n\t * @param {Matrix4} matrix - The Matrix4.\n\t * @returns {OBB}\n\t */\n\ttoBoundingBoxAndTransform(box3, matrix) {\n\t\tbox3.min.copy(this.halfSize).negate();\n\t\tbox3.max.copy(this.halfSize);\n\n\t\tmatrix.setFromMatrix3(this.rotation);\n\t\tthis.center.toArray(matrix.elements, 12);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Get the 8 corner points of the OBB, the order is same as Box3.getPoints().\n\t * @param {Vector3[]} points - The array to store the points.\n\t * @returns {Vector3[]} The array of points.\n\t */\n\tgetPoints(points) {\n\t\tthis.toBoundingBoxAndTransform(aabb, matrix);\n\n\t\taabb.getPoints(points);\n\n\t\tfor (let i = 0; i < 8; i++) {\n\t\t\tpoints[i].applyMatrix4(matrix);\n\t\t}\n\n\t\treturn points;\n\t}\n\n\t/**\n\t * Get the 6 planes of the OBB.\n\t * @param {Plane[]} planes - The array to store the planes.\n\t * @returns {Plane[]} The array of planes.\n\t */\n\tgetPlanes(planes) {\n\t\tthis.toBoundingBoxAndTransform(aabb, matrix);\n\n\t\tconst worldMin = aabb.min.applyMatrix4(matrix);\n\t\tconst worldMax = aabb.max.applyMatrix4(matrix);\n\n\t\tv1.set(0, 0, 1).applyMatrix3(this.rotation).normalize();\n\t\tplanes[0].setFromNormalAndCoplanarPoint(v1, worldMin);\n\t\tplanes[1].setFromNormalAndCoplanarPoint(v1, worldMax);\n\t\tplanes[1].normal.negate();\n\t\tplanes[1].constant *= -1;\n\n\t\tv1.set(0, 1, 0).applyMatrix3(this.rotation).normalize();\n\t\tplanes[2].setFromNormalAndCoplanarPoint(v1, worldMin);\n\t\tplanes[3].setFromNormalAndCoplanarPoint(v1, worldMax);\n\t\tplanes[3].normal.negate();\n\t\tplanes[3].constant *= -1;\n\n\t\tv1.set(1, 0, 0).applyMatrix3(this.rotation).normalize();\n\t\tplanes[4].setFromNormalAndCoplanarPoint(v1, worldMin);\n\t\tplanes[5].setFromNormalAndCoplanarPoint(v1, worldMax);\n\t\tplanes[5].normal.negate();\n\t\tplanes[5].constant *= -1;\n\n\t\treturn planes;\n\t}\n\n\t/**\n\t * Check if the OBB intersects the given frustum.\n\t * @param {Frustum} frustum - The frustum.\n\t * @returns {boolean} Whether the OBB intersects the frustum.\n\t */\n\tintersectsFrustum(frustum) {\n\t\t// the idea is to perform the intersection test in the local space\n\t\t// of the OBB.\n\n\t\tthis.toBoundingBoxAndTransform(aabb, matrix);\n\n\t\tlocalFrustum.copy(frustum).applyMatrix4(inverse.copy(matrix).invert());\n\n\t\treturn localFrustum.intersectsBox(aabb);\n\t}\n\n}\n\nOBB.prototype.isOBB = true;\n\n// helper variables\n\nconst a = {\n\tc: null, // center\n\tu: [new Vector3(), new Vector3(), new Vector3()], // basis vectors\n\te: [] // half width\n};\n\nconst b = {\n\tc: null, // center\n\tu: [new Vector3(), new Vector3(), new Vector3()], // basis vectors\n\te: [] // half width\n};\n\nconst R = [[], [], []];\nconst AbsR = [[], [], []];\nconst t = [];\n\nconst xAxis = new Vector3();\nconst yAxis = new Vector3();\nconst zAxis = new Vector3();\nconst v1 = new Vector3();\nconst closestPoint = new Vector3();\nconst rotationMatrix = new Matrix3();\nconst aabb = new Box3();\nconst matrix = new Matrix4();\nconst inverse = new Matrix4();\nconst localRay = new Ray();\nconst localFrustum = new Frustum();\n\nconst obb = new OBB();\n\nexport { OBB };"
  },
  {
    "path": "examples/jsm/math/Octree.js",
    "content": "import { Vector3, Box3 } from 't3d';\n\nclass Octree {\n\n\tconstructor(box = new Box3(), depth = 0) {\n\t\tthis.box = box;\n\t\tthis.depth = depth;\n\n\t\tthis.subTrees = [];\n\n\t\tthis.elements = [];\n\n\t\tthis.elementTest = function(box, element) {\n\t\t\treturn box.containsPoint(element);\n\t\t};\n\t}\n\n\tisEmpty() {\n\t\treturn this.elements.length === 0 && this.subTrees.length === 0;\n\t}\n\n\tdivideElements(maxDepth = 5, capacity = 8) {\n\t\tconst { depth, subTrees, elements, elementTest } = this;\n\n\t\tif (depth >= maxDepth || elements.length <= capacity) return;\n\n\t\tthis.subdivide();\n\n\t\t// distribute elements to subTrees\n\t\tlet element = this.elements.pop();\n\t\twhile (element) {\n\t\t\tfor (let i = 0; i < subTrees.length; i++) {\n\t\t\t\tif (elementTest(subTrees[i].box, element)) {\n\t\t\t\t\tsubTrees[i].elements.push(element);\n\t\t\t\t}\n\t\t\t}\n\t\t\telement = this.elements.pop();\n\t\t}\n\n\t\t// recursive call\n\t\tsubTrees.forEach(subTree => subTree.divideElements(maxDepth, capacity));\n\t}\n\n\taddElement(element, maxDepth = 5, capacity = 8) {\n\t\tconst { box, depth, subTrees, elements, elementTest } = this;\n\n\t\tif (!elementTest(box, element)) {\n\t\t\treturn false;\n\t\t}\n\n\t\tif (subTrees.length === 0) {\n\t\t\telements.push(element);\n\n\t\t\tif (elements.length > capacity && depth < maxDepth) {\n\t\t\t\tthis.divideElements(maxDepth, capacity);\n\t\t\t}\n\n\t\t\treturn true;\n\t\t}\n\n\t\tfor (let i = 0; i < subTrees.length; i++) {\n\t\t\tif (subTrees[i].addElement(element, maxDepth, capacity)) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t}\n\n\tremoveElement(element) {\n\t\tconst elements = this.elements;\n\t\tconst index = elements.indexOf(element);\n\n\t\tif (index !== -1) {\n\t\t\telements.splice(index, 1);\n\t\t\treturn true;\n\t\t}\n\n\t\tconst subTrees = this.subTrees;\n\n\t\tfor (let i = 0; i < subTrees.length; i++) {\n\t\t\tif (subTrees[i].removeElement(element)) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t}\n\n\tsubdivide() {\n\t\tconst halfSize = _vec3_1.copy(this.box.max).sub(this.box.min).multiplyScalar(0.5);\n\t\t_subdivideArray.forEach((v, i) => {\n\t\t\tconst box = new Box3();\n\n\t\t\tbox.min.copy(this.box.min).add(_vec3_2.copy(v).multiply(halfSize));\n\t\t\tbox.max.copy(box.min).add(halfSize);\n\n\t\t\tthis.subTrees[i] = new this.constructor(box, this.depth + 1);\n\t\t});\n\t}\n\n\tcount() {\n\t\tlet count = 1;\n\n\t\tfor (let i = 0; i < this.subTrees.length; i++) {\n\t\t\tcount += this.subTrees[i].count();\n\t\t}\n\n\t\treturn count;\n\t}\n\n\tdispose() {\n\t\tthis.subTrees.forEach(subTree => subTree.dispose());\n\t\tthis.subTrees.length = 0;\n\t\tthis.elements.length = 0;\n\t}\n\n}\n\nconst _subdivideArray = [\n\tnew Vector3(0, 0, 0),\n\tnew Vector3(0, 0, 1),\n\tnew Vector3(0, 1, 0),\n\tnew Vector3(0, 1, 1),\n\tnew Vector3(1, 0, 0),\n\tnew Vector3(1, 0, 1),\n\tnew Vector3(1, 1, 0),\n\tnew Vector3(1, 1, 1)\n];\n\nconst _vec3_1 = new Vector3();\nconst _vec3_2 = new Vector3();\n\nexport { Octree };"
  },
  {
    "path": "examples/jsm/math/TriangleSoup.js",
    "content": "import { Vector3, DRAW_MODE, MathUtils } from 't3d';\n\n/**\n * TriangleSoup - A data structure for storing and manipulating triangle geometry\n * Useful for physics engines, navigation mesh generation, and other applications\n * that require raw triangle data with efficient operations.\n */\nclass TriangleSoup {\n\n\t/**\n\t * Create a new TriangleSoup instance\n\t */\n\tconstructor() {\n\t\t/**\n\t\t * Array of vertex positions [x1,y1,z1, x2,y2,z2, ...]\n\t\t * @type {Array<number>}\n\t\t */\n\t\tthis.positions = [];\n\n\t\t/**\n\t\t * Array of vertex indices, each triplet forms a triangle\n\t\t * @type {Array<number>}\n\t\t */\n\t\tthis.indices = [];\n\t}\n\n\t/**\n\t * Add a mesh to the TriangleSoup\n\t * @param {Mesh} mesh - The mesh to add\n\t * @param {Matrix4} [matrix=mesh.worldMatrix] - The transformation matrix to apply to the vertices\n\t * @returns {TriangleSoup} - The TriangleSoup instance\n\t */\n\taddMesh(mesh, matrix = mesh.worldMatrix) {\n\t\tconst { positions, indices } = this;\n\n\t\tconst material = Array.isArray(mesh.material) ? mesh.material[0] : mesh.material;\n\t\tconst isTriangleMesh = material && material.drawMode === DRAW_MODE.TRIANGLES;\n\n\t\tif (!isTriangleMesh) return;\n\n\t\tconst geometry = mesh.geometry;\n\n\t\tconst positionAttribute = geometry.attributes.a_Position;\n\n\t\tif (!positionAttribute) return;\n\n\t\tconst positionArray = positionAttribute.buffer.array;\n\t\tconst positionStart = positions.length;\n\n\t\tfor (let i = 0, l = positionArray.length; i < l; i += 3) {\n\t\t\t_vec3_1.fromArray(positionArray, i, positionAttribute.normalized);\n\t\t\t_vec3_1.applyMatrix4(matrix);\n\t\t\t_vec3_1.toArray(positions, positionStart + i);\n\t\t}\n\n\t\tconst indexAttribute = geometry.index;\n\n\t\tif (indexAttribute) {\n\t\t\tconst indexArray = indexAttribute.buffer.array;\n\n\t\t\tfor (let i = 0, l = indexArray.length; i < l; i++) {\n\t\t\t\tconst copyIndex = indexAttribute.normalized ? MathUtils.denormalize(indexArray[i], indexArray) : indexArray[i];\n\t\t\t\tindices.push(positionStart / 3 + copyIndex);\n\t\t\t}\n\t\t} else {\n\t\t\tfor (let i = 0, l = positionArray.length / 3; i < l; i++) {\n\t\t\t\tindices.push(positionStart / 3 + i);\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Merge vertices in the TriangleSoup\n\t * @param {number} [tolerance=1e-4] - The tolerance for merging vertices\n\t * @returns {TriangleSoup} - The TriangleSoup instance\n\t */\n\tmergeVertices(tolerance = 1e-4) {\n\t\ttolerance = Math.max(tolerance, Number.EPSILON);\n\n\t\tconst { positions, indices } = this;\n\n\t\tconst hashToIndex = {};\n\t\tconst newPositions = [];\n\t\tconst newIndices = [];\n\n\t\tconst halfTolerance = tolerance * 0.5;\n\t\tconst exponent = Math.log10(1 / tolerance);\n\t\tconst hashMultiplier = Math.pow(10, exponent);\n\t\tconst hashAdditive = halfTolerance * hashMultiplier;\n\n\t\tfor (let i = 0; i < indices.length; i++) {\n\t\t\tconst index = indices[i];\n\t\t\t_vec3_1.fromArray(positions, index * 3);\n\t\t\tlet hash = '';\n\n\t\t\thash += `${~~(_vec3_1.x * hashMultiplier + hashAdditive)},`;\n\t\t\thash += `${~~(_vec3_1.y * hashMultiplier + hashAdditive)},`;\n\t\t\thash += `${~~(_vec3_1.z * hashMultiplier + hashAdditive)},`;\n\n\t\t\tif (hash in hashToIndex) {\n\t\t\t\tnewIndices.push(hashToIndex[hash]);\n\t\t\t} else {\n\t\t\t\tconst newIndex = newPositions.length / 3;\n\t\t\t\tnewPositions.push(_vec3_1.x, _vec3_1.y, _vec3_1.z);\n\t\t\t\thashToIndex[hash] = newIndex;\n\t\t\t\tnewIndices.push(newIndex);\n\t\t\t}\n\t\t}\n\n\t\tthis.positions = newPositions;\n\t\tthis.indices = newIndices;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Clear the TriangleSoup\n\t */\n\tclear() {\n\t\tthis.positions.length = 0;\n\t\tthis.indices.length = 0;\n\t}\n\n}\n\nconst _vec3_1 = new Vector3();\n\nexport { TriangleSoup };"
  },
  {
    "path": "examples/jsm/math/TrianglesOctree.js",
    "content": "import { Vector3, Box3, Triangle } from 't3d';\nimport { Octree } from './Octree.js';\n\nclass TrianglesOctree extends Octree {\n\n\tstatic fromNode(node, maxDepth = 5, capacity = 8) {\n\t\tconst triangles = [], box = new Box3();\n\n\t\tfunction addTriangle(triangle) {\n\t\t\tbox.min.x = Math.min(box.min.x, triangle.a.x, triangle.b.x, triangle.c.x);\n\t\t\tbox.min.y = Math.min(box.min.y, triangle.a.y, triangle.b.y, triangle.c.y);\n\t\t\tbox.min.z = Math.min(box.min.z, triangle.a.z, triangle.b.z, triangle.c.z);\n\t\t\tbox.max.x = Math.max(box.max.x, triangle.a.x, triangle.b.x, triangle.c.x);\n\t\t\tbox.max.y = Math.max(box.max.y, triangle.a.y, triangle.b.y, triangle.c.y);\n\t\t\tbox.max.z = Math.max(box.max.z, triangle.a.z, triangle.b.z, triangle.c.z);\n\n\t\t\ttriangles.push(triangle);\n\t\t}\n\n\t\tnode.traverse(child => {\n\t\t\tif (child.isMesh) {\n\t\t\t\tconst geometry = child.geometry;\n\t\t\t\tconst isIndexed = !!geometry.index;\n\n\t\t\t\tconst positionBuffer = geometry.getAttribute('a_Position').buffer;\n\t\t\t\tconst positionArray = positionBuffer.array;\n\n\t\t\t\tif (isIndexed) {\n\t\t\t\t\tconst indexArray = geometry.index.buffer.array;\n\t\t\t\t\tfor (let i = 0; i < indexArray.length; i += 3) {\n\t\t\t\t\t\tconst a = indexArray[i];\n\t\t\t\t\t\tconst b = indexArray[i + 1];\n\t\t\t\t\t\tconst c = indexArray[i + 2];\n\n\t\t\t\t\t\tconst v1 = new Vector3().fromArray(positionArray, a * 3);\n\t\t\t\t\t\tconst v2 = new Vector3().fromArray(positionArray, b * 3);\n\t\t\t\t\t\tconst v3 = new Vector3().fromArray(positionArray, c * 3);\n\n\t\t\t\t\t\tv1.applyMatrix4(child.worldMatrix);\n\t\t\t\t\t\tv2.applyMatrix4(child.worldMatrix);\n\t\t\t\t\t\tv3.applyMatrix4(child.worldMatrix);\n\n\t\t\t\t\t\tconst triangle = new Triangle(v1, v2, v3);\n\t\t\t\t\t\ttriangle.belong = child;\n\n\t\t\t\t\t\taddTriangle(triangle);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tfor (let i = 0; i < positionBuffer.count; i += 3) {\n\t\t\t\t\t\tconst v1 = new Vector3().fromArray(positionArray, i * 3);\n\t\t\t\t\t\tconst v2 = new Vector3().fromArray(positionArray, (i + 1) * 3);\n\t\t\t\t\t\tconst v3 = new Vector3().fromArray(positionArray, (i + 2) * 3);\n\n\t\t\t\t\t\tv1.applyMatrix4(child.worldMatrix);\n\t\t\t\t\t\tv2.applyMatrix4(child.worldMatrix);\n\t\t\t\t\t\tv3.applyMatrix4(child.worldMatrix);\n\n\t\t\t\t\t\tconst triangle = new Triangle(v1, v2, v3);\n\t\t\t\t\t\ttriangle.belong = child;\n\n\t\t\t\t\t\taddTriangle(triangle);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\t// offset small amount to account for regular grid\n\t\tbox.min.x -= 0.01;\n\t\tbox.min.y -= 0.01;\n\t\tbox.min.z -= 0.01;\n\n\t\tconst octree = new TrianglesOctree(box);\n\t\toctree.elements = triangles;\n\t\toctree.divideElements(maxDepth, capacity);\n\n\t\treturn octree;\n\t}\n\n\tconstructor(box, depth) {\n\t\tsuper(box, depth);\n\n\t\tthis.elementTest = function(box, triangle) {\n\t\t\treturn box.intersectsTriangle(triangle);\n\t\t};\n\t}\n\n\tgetRayTriangles(ray, triangles) {\n\t\tconst subTrees = this.subTrees;\n\n\t\tfor (let i = 0; i < subTrees.length; i++) {\n\t\t\tconst subTree = subTrees[i];\n\n\t\t\tif (!ray.intersectsBox(subTree.box)) continue;\n\n\t\t\tif (subTree.elements.length > 0) {\n\t\t\t\tfor (let j = 0; j < subTree.elements.length; j++) {\n\t\t\t\t\tif (triangles.indexOf(subTree.elements[j]) === -1) triangles.push(subTree.elements[j]);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tsubTree.getRayTriangles(ray, triangles);\n\t\t\t}\n\t\t}\n\n\t\treturn triangles;\n\t}\n\n\trayIntersect(ray) {\n\t\tif (ray.direction.getLength() === 0) return;\n\n\t\tconst triangles = [];\n\t\tlet triangle, position, distance = 1e100;\n\n\t\tthis.getRayTriangles(ray, triangles);\n\n\t\tfor (let i = 0; i < triangles.length; i++) {\n\t\t\tconst result = ray.intersectTriangle(triangles[i].a, triangles[i].b, triangles[i].c, true, _vec3_1);\n\n\t\t\tif (result) {\n\t\t\t\tconst tempDistnce = result.sub(ray.origin).getLength();\n\n\t\t\t\tif (distance > tempDistnce) {\n\t\t\t\t\tposition = result.clone().add(ray.origin);\n\t\t\t\t\tdistance = tempDistnce;\n\t\t\t\t\ttriangle = triangles[i];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn distance < 1e100 ? { distance: distance, triangle: triangle, position: position, target: triangle.belong } : null;\n\t}\n\n}\n\nconst _vec3_1 = new Vector3();\n\nexport { TrianglesOctree };"
  },
  {
    "path": "examples/jsm/math/VirtualGroup.js",
    "content": "import { Matrix4, Box3, Vector3 } from 't3d';\n\n/**\n * This is a virtual group for objects.\n * With this, you can manipulate all objects as if they were a single object.\n */\nclass VirtualGroup {\n\n\tconstructor() {\n\t\tthis._objects = [];\n\n\t\tthis._anchorType = 'center'; // 'center' or 'pivot'\n\t\tthis._coordinateType = 'local'; // 'local' or 'global'\n\n\t\tthis._dirtyFlag = DirtyFlag.All;\n\n\t\tthis._worldMatrix = new Matrix4();\n\t}\n\n\tset anchorType(value) {\n\t\tif (this._anchorType === value) return;\n\t\tthis._anchorType = value;\n\t\tthis._dirtyFlag |= DirtyFlag.AnchorDirty;\n\t}\n\n\tget anchorType() {\n\t\treturn this._anchorType;\n\t}\n\n\tset coordinateType(value) {\n\t\tif (this._coordinateType === value) return;\n\t\tthis._coordinateType = value;\n\t\tthis._dirtyFlag |= DirtyFlag.CoordinateDirty;\n\t}\n\n\tget coordinateType() {\n\t\treturn this._coordinateType;\n\t}\n\n\tget objects() {\n\t\treturn this._objects;\n\t}\n\n\taddObject(object, checkRelationship = false) {\n\t\tlet canAdd = true;\n\n\t\tfor (let i = this._objects.length - 1; i >= 0; i--) {\n\t\t\tconst existingObject = this._objects[i];\n\n\t\t\tif (existingObject === object) {\n\t\t\t\tcanAdd = false;\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tif (checkRelationship) {\n\t\t\t\tif (isChildOf(existingObject, object)) {\n\t\t\t\t\tcanAdd = false;\n\t\t\t\t\tbreak;\n\t\t\t\t} else if (isChildOf(object, existingObject)) {\n\t\t\t\t\tthis.deleteObject(existingObject);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (canAdd) {\n\t\t\tthis._objects.push(object);\n\t\t\tthis._dirtyFlag |= DirtyFlag.All;\n\t\t}\n\n\t\treturn canAdd;\n\t}\n\n\tdeleteObject(object) {\n\t\tconst index = this._objects.indexOf(object);\n\t\tif (index === -1) return false;\n\t\tthis._objects.splice(index, 1);\n\t\tthis._dirtyFlag |= DirtyFlag.All;\n\t\treturn true;\n\t}\n\n\treset() {\n\t\tthis._objects = [];\n\t\tthis._dirtyFlag |= DirtyFlag.All;\n\t}\n\n\tdirty(anchor = true, coordinate = true) {\n\t\tif (anchor) this._dirtyFlag |= DirtyFlag.AnchorDirty;\n\t\tif (coordinate) this._dirtyFlag |= DirtyFlag.CoordinateDirty;\n\t}\n\n\tgetWorldMatrix(matrix) {\n\t\tconst e = this._worldMatrix.elements;\n\n\t\tif (this._objects.length === 0) {\n\t\t\tthis._worldMatrix.identity();\n\t\t\treturn matrix.copy(this._worldMatrix);\n\t\t}\n\n\t\tif (this._dirtyFlag & DirtyFlag.AnchorDirty) {\n\t\t\tthis._anchorDirty = false;\n\n\t\t\tif (this._anchorType === 'center') {\n\t\t\t\tthis._getCenter(_vec3_1);\n\t\t\t} else if (this._anchorType === 'pivot') {\n\t\t\t\tthis._getPivot(_vec3_1);\n\t\t\t}\n\t\t\te[12] = _vec3_1.x; e[13] = _vec3_1.y; e[14] = _vec3_1.z;\n\n\t\t\tthis._dirtyFlag &= ~DirtyFlag.AnchorDirty;\n\t\t}\n\n\t\tif (this._dirtyFlag & DirtyFlag.CoordinateDirty) {\n\t\t\tif (this._coordinateType === 'local') {\n\t\t\t\t// align to first entity\n\t\t\t\tconst wE = this._objects[0].worldMatrix.elements;\n\t\t\t\tconst sx = 1 / Math.sqrt(wE[0] * wE[0] + wE[1] * wE[1] + wE[2] * wE[2]);\n\t\t\t\tconst sy = 1 / Math.sqrt(wE[4] * wE[4] + wE[5] * wE[5] + wE[6] * wE[6]);\n\t\t\t\tconst sz = 1 / Math.sqrt(wE[8] * wE[8] + wE[9] * wE[9] + wE[10] * wE[10]);\n\t\t\t\te[0] = wE[0] * sx; e[4] = wE[4] * sy; e[8] = wE[8] * sz;\n\t\t\t\te[1] = wE[1] * sx; e[5] = wE[5] * sy; e[9] = wE[9] * sz;\n\t\t\t\te[2] = wE[2] * sx; e[6] = wE[6] * sy; e[10] = wE[10] * sz;\n\t\t\t} else if (this._coordinateType === 'global') {\n\t\t\t\te[0] = 1; e[4] = 0; e[8] = 0;\n\t\t\t\te[1] = 0; e[5] = 1; e[9] = 0;\n\t\t\t\te[2] = 0; e[6] = 0; e[10] = 1;\n\t\t\t}\n\n\t\t\tthis._dirtyFlag &= ~DirtyFlag.CoordinateDirty;\n\t\t}\n\n\t\treturn matrix.copy(this._worldMatrix);\n\t}\n\n\tsetWorldMatrix(matrix) {\n\t\tconst worldMatrixInverse = this.getWorldMatrix(_mat4_1).invert();\n\t\tthis._worldMatrix.copy(matrix);\n\t\tconst offsetMatrix = _mat4_2.multiplyMatrices(matrix, worldMatrixInverse);\n\t\tthis._objects.forEach(object => {\n\t\t\tobject.worldMatrix.multiplyMatrices(offsetMatrix, object.worldMatrix);\n\t\t\tconst parentMatrixInverse = _mat4_1.copy(object.parent.worldMatrix).invert();\n\t\t\tobject.matrix.multiplyMatrices(parentMatrixInverse, object.worldMatrix);\n\t\t\tobject.matrix.decompose(object.position, object.quaternion, object.scale);\n\t\t});\n\t\tthis._dirtyFlag = DirtyFlag.None;\n\t}\n\n\t_getCenter(center) {\n\t\t_box3_1.makeEmpty();\n\t\tthis._objects.forEach(object => {\n\t\t\tobject.traverse(child => {\n\t\t\t\tif (child.isMesh) {\n\t\t\t\t\t_box3_2.copy(child.geometry.boundingBox);\n\t\t\t\t\t_box3_2.applyMatrix4(child.worldMatrix);\n\t\t\t\t\t_box3_1.expandByBox3(_box3_2);\n\t\t\t\t} else {\n\t\t\t\t\t_vec3_1.setFromMatrixPosition(child.worldMatrix);\n\t\t\t\t\t_box3_1.expandByPoint(_vec3_1);\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t\treturn _box3_1.getCenter(center);\n\t}\n\n\t_getPivot(pivot) {\n\t\t_box3_1.makeEmpty();\n\t\tthis._objects.forEach(object => {\n\t\t\t_vec3_1.setFromMatrixPosition(object.worldMatrix);\n\t\t\t_box3_1.expandByPoint(_vec3_1);\n\t\t});\n\t\treturn _box3_1.getCenter(pivot);\n\t}\n\n}\n\nconst DirtyFlag = {\n\tNone: 0,\n\tAnchorDirty: 1,\n\tCoordinateDirty: 2,\n\tAll: 3\n};\n\nconst _vec3_1 = new Vector3();\nconst _box3_1 = new Box3();\nconst _box3_2 = new Box3();\nconst _mat4_1 = new Matrix4();\nconst _mat4_2 = new Matrix4();\n\nfunction isChildOf(parent, child) {\n\twhile (child.parent) {\n\t\tif (parent === child.parent) return true;\n\t\tchild = child.parent;\n\t}\n\treturn false;\n}\n\nexport { VirtualGroup };"
  },
  {
    "path": "examples/jsm/math/curves/CubicBezierCurve2.js",
    "content": "/**\n * CubicBezierCurve2\n */\n\nimport {\n\tVector2\n} from 't3d';\nimport { Curve } from './Curve.js';\nimport { CurveUtils } from './CurveUtils.js';\n\nclass CubicBezierCurve2 extends Curve {\n\n\tconstructor(v0 = new Vector2(), v1 = new Vector2(), v2 = new Vector2(), v3 = new Vector2()) {\n\t\tsuper();\n\n\t\tthis.v0 = v0;\n\t\tthis.v1 = v1;\n\t\tthis.v2 = v2;\n\t\tthis.v3 = v3;\n\t}\n\n\tgetPoint(t, optionalTarget = new Vector2()) {\n\t\tconst point = optionalTarget;\n\n\t\tconst v0 = this.v0, v1 = this.v1, v2 = this.v2, v3 = this.v3;\n\n\t\tpoint.set(\n\t\t\tCurveUtils.cubicBezier(t, v0.x, v1.x, v2.x, v3.x),\n\t\t\tCurveUtils.cubicBezier(t, v0.y, v1.y, v2.y, v3.y)\n\t\t);\n\n\t\treturn point;\n\t}\n\n}\n\nCubicBezierCurve2.prototype.isCubicBezierCurve2 = true;\n\nexport { CubicBezierCurve2 };"
  },
  {
    "path": "examples/jsm/math/curves/CubicBezierCurve3.js",
    "content": "/**\n * CubicBezierCurve3\n */\n\nimport {\n\tVector3\n} from 't3d';\nimport { Curve } from './Curve.js';\nimport { CurveUtils } from './CurveUtils.js';\n\nclass CubicBezierCurve3 extends Curve {\n\n\tconstructor(v0 = new Vector3(), v1 = new Vector3(), v2 = new Vector3(), v3 = new Vector3()) {\n\t\tsuper();\n\n\t\tthis.v0 = v0;\n\t\tthis.v1 = v1;\n\t\tthis.v2 = v2;\n\t\tthis.v3 = v3;\n\t}\n\n\tgetPoint(t, optionalTarget = new Vector3()) {\n\t\tconst point = optionalTarget;\n\n\t\tconst v0 = this.v0, v1 = this.v1, v2 = this.v2, v3 = this.v3;\n\n\t\tpoint.set(\n\t\t\tCurveUtils.cubicBezier(t, v0.x, v1.x, v2.x, v3.x),\n\t\t\tCurveUtils.cubicBezier(t, v0.y, v1.y, v2.y, v3.y),\n\t\t\tCurveUtils.cubicBezier(t, v0.z, v1.z, v2.z, v3.z)\n\t\t);\n\n\t\treturn point;\n\t}\n\n}\n\nCubicBezierCurve3.prototype.isCubicBezierCurve3 = true;\n\nexport { CubicBezierCurve3 };"
  },
  {
    "path": "examples/jsm/math/curves/Curve.js",
    "content": "/**\n * Curve\n */\nclass Curve {\n\n\tconstructor() {\n\t\tthis.arcLengthDivisions = 200;\n\t\tthis.cacheArcLengths = null;\n\t\tthis.needsUpdate = true;\n\t}\n\n\tgetPoint(/* t, optionalTarget */) {\n\t\tconsole.warn('Curve: .getPoint() not implemented.');\n\t\treturn null;\n\t}\n\n\tgetPointAt(u, optionalTarget) {\n\t\tconst t = this.getUtoTmapping(u);\n\t\treturn this.getPoint(t, optionalTarget);\n\t}\n\n\tgetPoints(divisions = 5) {\n\t\tconst points = [];\n\t\tfor (let i = 0; i <= divisions; i++) {\n\t\t\tpoints.push(this.getPoint(i / divisions));\n\t\t}\n\t\treturn points;\n\t}\n\n\tgetSpacedPoints(divisions = 5) {\n\t\tconst points = [];\n\t\tfor (let i = 0; i <= divisions; i++) {\n\t\t\tpoints.push(this.getPointAt(i / divisions));\n\t\t}\n\t\treturn points;\n\t}\n\n\tgetLength() {\n\t\tconst lengths = this.getLengths();\n\t\treturn lengths[lengths.length - 1];\n\t}\n\n\tgetLengths(divisions = this.arcLengthDivisions) {\n\t\tif (this.cacheArcLengths &&\n\t\t\t(this.cacheArcLengths.length === divisions + 1) &&\n\t\t\t!this.needsUpdate) {\n\t\t\treturn this.cacheArcLengths;\n\t\t}\n\n\t\tthis.needsUpdate = false;\n\n\t\tconst cache = [];\n\t\tlet current, last = this.getPoint(0);\n\t\tlet sum = 0;\n\n\t\tcache.push(0);\n\n\t\tfor (let p = 1; p <= divisions; p++) {\n\t\t\tcurrent = this.getPoint(p / divisions);\n\t\t\tsum += current.distanceTo(last);\n\t\t\tcache.push(sum);\n\t\t\tlast = current;\n\t\t}\n\n\t\tthis.cacheArcLengths = cache;\n\n\t\treturn cache;\n\t}\n\n\tupdateArcLengths() {\n\t\tthis.needsUpdate = true;\n\t\tthis.getLengths();\n\t}\n\n\tgetUtoTmapping(u, distance) {\n\t\tconst arcLengths = this.getLengths();\n\n\t\tlet i = 0;\n\t\tconst il = arcLengths.length;\n\n\t\tlet targetArcLength; // The targeted u distance value to get\n\n\t\tif (distance) {\n\t\t\ttargetArcLength = distance;\n\t\t} else {\n\t\t\ttargetArcLength = u * arcLengths[il - 1];\n\t\t}\n\n\t\t// binary search for the index with largest value smaller than target u distance\n\n\t\tlet low = 0, high = il - 1, comparison;\n\n\t\twhile (low <= high) {\n\t\t\ti = Math.floor(low + (high - low) / 2); // less likely to overflow, though probably not issue here, JS doesn't really have integers, all numbers are floats\n\n\t\t\tcomparison = arcLengths[i] - targetArcLength;\n\n\t\t\tif (comparison < 0) {\n\t\t\t\tlow = i + 1;\n\t\t\t} else if (comparison > 0) {\n\t\t\t\thigh = i - 1;\n\t\t\t} else {\n\t\t\t\thigh = i;\n\t\t\t\tbreak;\n\n\t\t\t\t// DONE\n\t\t\t}\n\t\t}\n\n\t\ti = high;\n\n\t\tif (arcLengths[i] === targetArcLength) {\n\t\t\treturn i / (il - 1);\n\t\t}\n\n\t\t// we could get finer grain at lengths, or use simple interpolation between two points\n\n\t\tconst lengthBefore = arcLengths[i];\n\t\tconst lengthAfter = arcLengths[i + 1];\n\n\t\tconst segmentLength = lengthAfter - lengthBefore;\n\n\t\t// determine where we are between the 'before' and 'after' points\n\n\t\tconst segmentFraction = (targetArcLength - lengthBefore) / segmentLength;\n\n\t\t// add that fractional amount to t\n\n\t\tconst t = (i + segmentFraction) / (il - 1);\n\n\t\treturn t;\n\t}\n\n}\n\nCurve.prototype.isCurve = true;\n\nexport { Curve };"
  },
  {
    "path": "examples/jsm/math/curves/CurvePath.js",
    "content": "import { Vector2, Vector3 } from 't3d';\nimport { LineCurve2 } from './LineCurve2.js';\nimport { LineCurve3 } from './LineCurve3.js';\nimport { QuadraticBezierCurve2 } from './QuadraticBezierCurve2.js';\nimport { QuadraticBezierCurve3 } from './QuadraticBezierCurve3.js';\nimport { CubicBezierCurve2 } from './CubicBezierCurve2.js';\nimport { CubicBezierCurve3 } from './CubicBezierCurve3.js';\n\n/**\n * CurvePath holds a series of curves that are connected end to end.\n */\nclass CurvePath {\n\n\t/**\n\t * Constructs a new CurvePath.\n\t */\n\tconstructor() {\n\t\tthis.curves = [];\n\n\t\tthis.cacheLengths = null;\n\t\tthis.needsUpdate = true;\n\n\t\tif (new.target === CurvePath) {\n\t\t\tconsole.error('CurvePath: Abstract classes can not be instantiated.');\n\t\t}\n\t}\n\n\t/**\n\t * Constructs a smooth curved path from an array of path points using cubic Bezier curves.\n\t * Ensures that all input points lie on the curve; inflection points should represent local extrema.\n\t * Control points are computed to satisfy these conditions.\n\t * @param {Vector2[]|Vector3[]} points - An array of path points.\n\t * @param {object} [options={}] - Options object.\n\t * @param {number} [options.smooth=0.3] - Smoothness factor; higher values yield a smoother curve.\n\t */\n\tsetSmoothCurves(points, options = {}) {\n\t\tconst smooth = options.smooth || 0;\n\n\t\tconst isCurvePath2 = this.isCurvePath2;\n\n\t\tif (points.length < 2) {\n\t\t\tconsole.warn(`CurvePath${isCurvePath2 ? 2 : 3}.setSmoothCurves: points length less than 2.`);\n\t\t\treturn;\n\t\t}\n\n\t\t// Fall back to a polyline if smooth is 0.\n\t\tif (smooth === 0 || points.length === 2) {\n\t\t\tthis.setPolylines(points, options);\n\t\t\treturn;\n\t\t}\n\n\t\tconst curves = this.curves;\n\t\tcurves.length = 0;\n\n\t\tconst CubicBezierCurve = isCurvePath2 ? CubicBezierCurve2 : CubicBezierCurve3;\n\t\tconst Vector = isCurvePath2 ? Vector2 : Vector3;\n\n\t\tconst cp0 = new Vector();\n\t\tconst cp1 = new Vector();\n\t\tconst prev = new Vector();\n\t\tconst next = new Vector();\n\t\tconst nextCp0 = new Vector();\n\n\t\tconst _vec_1 = new Vector();\n\t\tconst _vec_2 = new Vector();\n\n\t\tfor (let i = 0, l = points.length; i < l; i++) {\n\t\t\tconst current = points[i];\n\n\t\t\tif (i === 0) {\n\t\t\t\tcp0.copy(points[i]);\n\t\t\t} else if (i == l - 1) {\n\t\t\t\tconst bezierCurve = new CubicBezierCurve();\n\t\t\t\tbezierCurve.v0.copy(points[i - 1]);\n\t\t\t\tbezierCurve.v1.copy(cp0);\n\t\t\t\tbezierCurve.v2.copy(current);\n\t\t\t\tbezierCurve.v3.copy(current);\n\t\t\t\tcurves.push(bezierCurve);\n\t\t\t} else {\n\t\t\t\tnext.copy(points[i + 1]);\n\t\t\t\tprev.copy(points[i - 1]);\n\n\t\t\t\tconst lenPrevSeg = _vec_1.subVectors(current, prev).getLength();\n\t\t\t\tconst lenNextSeg = _vec_2.subVectors(next, current).getLength();\n\t\t\t\tconst ratioNextSeg = lenNextSeg / (lenNextSeg + lenPrevSeg);\n\n\t\t\t\t_vec_1.subVectors(next, prev);\n\t\t\t\tcp1.subVectors(current, _vec_2.copy(_vec_1).multiplyScalar(smooth * (1 - ratioNextSeg)));\n\t\t\t\tnextCp0.addVectors(current, _vec_2.copy(_vec_1).multiplyScalar(smooth * ratioNextSeg));\n\t\t\t\tnextCp0.min(_vec_1.copy(next).max(current));\n\t\t\t\tnextCp0.max(_vec_1.copy(next).min(current));\n\n\t\t\t\t_vec_1.subVectors(nextCp0, current);\n\t\t\t\tcp1.subVectors(current, _vec_1.multiplyScalar(lenPrevSeg / lenNextSeg));\n\t\t\t\tcp1.min(_vec_1.copy(prev).max(current));\n\t\t\t\tcp1.max(_vec_1.copy(prev).min(current));\n\n\t\t\t\t_vec_1.subVectors(current, cp1);\n\t\t\t\tnextCp0.addVectors(current, _vec_1.multiplyScalar(lenNextSeg / lenPrevSeg));\n\n\t\t\t\tconst bezierCurve = new CubicBezierCurve();\n\t\t\t\tbezierCurve.v0.copy(prev);\n\t\t\t\tbezierCurve.v1.copy(cp0);\n\t\t\t\tbezierCurve.v2.copy(cp1);\n\t\t\t\tbezierCurve.v3.copy(current);\n\t\t\t\tcurves.push(bezierCurve);\n\n\t\t\t\tcp0.copy(nextCp0);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Constructs a smooth curved path from an array of points using Quadratic Bezier curves and straight lines.\n\t * At right-angle turns, it applies quadratic Bezier curves with inflection points serving as control points.\n\t * @param {Vector2[]|Vector3[]} points - An array of path points.\n\t * @param {object} [options={}] - Options.\n\t * @param {number} [options.bevelRadius=0] - The bevel radius.\n\t * @param {boolean} [options.close=false] - Whether to automatically close the path.\n\t */\n\tsetBeveledCurves(points, options = {}) {\n\t\tconst bevelRadius = options.bevelRadius || 0;\n\t\tconst close = options.close || false;\n\n\t\tconst isCurvePath2 = this.isCurvePath2;\n\n\t\tif (points.length < 2) {\n\t\t\tconsole.warn(`CurvePath${isCurvePath2 ? 2 : 3}.setBeveledCurves: points length less than 2.`);\n\t\t\treturn;\n\t\t}\n\n\t\t// Fall back to a polyline if bevelRadius is 0.\n\t\tif (bevelRadius === 0 || points.length === 2) {\n\t\t\tthis.setPolylines(points, options);\n\t\t\treturn;\n\t\t}\n\n\t\tconst lastIndex = points.length - 1;\n\t\t// If closing is needed and first and last points are different, add a segment connecting last to first.\n\t\tconst segments = close && !points[0].equals(points[lastIndex]) ? points.length : lastIndex;\n\n\t\tconst curves = this.curves;\n\t\tcurves.length = 0;\n\n\t\tconst LineCurve = isCurvePath2 ? LineCurve2 : LineCurve3;\n\t\tconst QuadraticBezierCurve = isCurvePath2 ? QuadraticBezierCurve2 : QuadraticBezierCurve3;\n\t\tconst Vector = isCurvePath2 ? Vector2 : Vector3;\n\n\t\tconst p0 = new Vector().copy(points[0]);\n\t\tconst _vec_1 = new Vector();\n\t\tconst _vec_2 = new Vector();\n\n\t\tfor (let i = 0; i < segments; i++) {\n\t\t\tconst p1 = points[(i + 1) % (lastIndex + 1)];\n\t\t\tconst p2 = points[(i + 2) % (lastIndex + 1)];\n\n\t\t\t// The last open segment is a straight line.\n\t\t\tif (i === (segments - 1) && !close) {\n\t\t\t\tconst lineCurve = new LineCurve();\n\t\t\t\tlineCurve.v1.copy(p0);\n\t\t\t\tlineCurve.v2.copy(p1);\n\t\t\t\tcurves.push(lineCurve);\n\n\t\t\t\tp0.copy(p1);\n\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tconst lastDir = _vec_1.subVectors(p1, p0);\n\t\t\tconst nextDir = _vec_2.subVectors(p2, p1);\n\n\t\t\tconst lastDirLength = lastDir.getLength();\n\t\t\tconst nextDirLength = nextDir.getLength();\n\n\t\t\tconst v0Dist = Math.min((i === 0 ? lastDirLength / 2 : lastDirLength) * 0.999999, bevelRadius); // fix\n\t\t\tconst v2Dist = Math.min(nextDirLength / 2 * 0.999999, bevelRadius);\n\n\t\t\tlastDir.normalize();\n\t\t\tnextDir.normalize();\n\n\t\t\tconst lineCurve = new LineCurve();\n\t\t\tlineCurve.v1.copy(p0);\n\t\t\tlineCurve.v2.copy(p1).sub(lastDir.multiplyScalar(v0Dist));\n\t\t\tcurves.push(lineCurve);\n\n\t\t\tconst bezierCurve = new QuadraticBezierCurve();\n\t\t\tbezierCurve.v0.copy(lineCurve.v2);\n\t\t\tbezierCurve.v1.copy(p1);\n\t\t\tbezierCurve.v2.copy(p1).add(nextDir.multiplyScalar(v2Dist));\n\t\t\tcurves.push(bezierCurve);\n\n\t\t\tp0.copy(bezierCurve.v2);\n\t\t}\n\n\t\t// If closing is needed, fix the first point to the last.\n\t\tif (close) curves[0].v1.copy(p0);\n\t}\n\n\t/**\n\t * Constructs a polyline from an array of path points using straight segments.\n\t * This method creates a continuous series of line segments and optionally closes the path.\n\t * @param {Vector2[]|Vector3[]} points - An array of path points.\n\t * @param {object} [options={}] - Options.\n\t * @param {boolean} [options.close=false] - Whether to automatically close the path.\n\t */\n\tsetPolylines(points, options = {}) {\n\t\tconst close = options.close === true;\n\n\t\tconst isCurvePath2 = this.isCurvePath2;\n\n\t\tif (points.length < 2) {\n\t\t\tconsole.warn(`CurvePath${isCurvePath2 ? 2 : 3}.setPolylines: points length less than 2.`);\n\t\t\treturn;\n\t\t}\n\n\t\tconst lastIndex = points.length - 1;\n\t\t// If closing is needed and first and last points are different, add a segment connecting last to first.\n\t\tconst segments = close && !points[0].equals(points[lastIndex]) ? points.length : lastIndex;\n\n\t\tconst curves = this.curves;\n\t\tcurves.length = 0;\n\n\t\tconst LineCurve = isCurvePath2 ? LineCurve2 : LineCurve3;\n\n\t\tfor (let i = 0; i < segments; i++) {\n\t\t\tconst lineCurve = new LineCurve();\n\t\t\tlineCurve.v1.copy(points[i]);\n\t\t\tlineCurve.v2.copy(i === lastIndex ? points[0] : points[i + 1]);\n\t\t\tcurves.push(lineCurve);\n\t\t}\n\t}\n\n\t/**\n\t * Returns an array of points representing a sequence of curves.\n\t * The division parameter defines the number of pieces each curve is divided into.\n\t * However, for optimization and quality purposes, the actual sampling resolution for each curve depends on its type.\n\t * For example, for a LineCurve, the returned number of points is always just 2.\n\t * @param {number} [divisions=12] - Number of pieces to divide the curve into.\n\t * @returns {Vector2[]|Vector3[]} - An array of points representing the curve.\n\t */\n\tgetPoints(divisions = 12) {\n\t\tconst points = [];\n\n\t\tfor (let i = 0, curves = this.curves; i < curves.length; i++) {\n\t\t\tconst curve = curves[i];\n\t\t\tconst resolution = (curve.isLineCurve2 || curve.isLineCurve3) ? 1 : divisions;\n\n\t\t\tconst pts = curve.getPoints(resolution);\n\n\t\t\tconst isLast = i === (curves.length - 1);\n\t\t\tfor (let j = 0, l = isLast ? pts.length : pts.length - 1; j < l; j++) {\n\t\t\t\tconst point = pts[j];\n\t\t\t\tpoints.push(point);\n\t\t\t}\n\t\t}\n\n\t\treturn points;\n\t}\n\n\t/**\n\t * This method returns a point for the given interpolation factor.\n\t * @param {number} t - A interpolation factor representing a position on the curve. Must be in the range [0,1].\n\t * @param {Vector2|Vector3} [optionalTarget] - An optional target point.\n\t * @returns {Vector2|Vector3} - The resulting point.\n\t */\n\tgetPoint(t, optionalTarget) {\n\t\tconst d = t * this.getLength();\n\t\tconst curveLengths = this.getLengths();\n\t\tlet i = 0;\n\n\t\twhile (i < curveLengths.length) {\n\t\t\tif (curveLengths[i] >= d) {\n\t\t\t\tconst diff = curveLengths[i] - d;\n\t\t\t\tconst curve = this.curves[i];\n\n\t\t\t\tconst segmentLength = curve.getLength();\n\t\t\t\tconst u = segmentLength === 0 ? 0 : 1 - diff / segmentLength;\n\n\t\t\t\treturn curve.getPointAt(u, optionalTarget);\n\t\t\t}\n\n\t\t\ti++;\n\t\t}\n\n\t\treturn this.curves[this.curves.length - 1].getPointAt(1, optionalTarget);\n\t}\n\n\t/**\n\t * Return total curve path length.\n\t * @returns {number} The total length.\n\t */\n\tgetLength() {\n\t\tconst lengths = this.getLengths();\n\t\treturn lengths[lengths.length - 1];\n\t}\n\n\t/**\n\t * Returns list of cumulative curve lengths of the defined curves.\n\t * @returns {number[]} The curve lengths.\n\t */\n\tgetLengths() {\n\t\tif (this.cacheLengths && this.cacheLengths.length === this.curves.length && !this.needsUpdate) {\n\t\t\treturn this.cacheLengths;\n\t\t}\n\n\t\tthis.needsUpdate = false;\n\n\t\tconst lengths = [];\n\t\tlet sums = 0;\n\n\t\tfor (let i = 0, l = this.curves.length; i < l; i++) {\n\t\t\tsums += this.curves[i].getLength();\n\t\t\tlengths.push(sums);\n\t\t}\n\n\t\tthis.cacheLengths = lengths;\n\n\t\treturn lengths;\n\t}\n\n\t/**\n\t * Updates the cumulative curve lengths of the defined curves.\n\t */\n\tupdateArcLengths() {\n\t\tthis.needsUpdate = true;\n\t\tthis.cacheLengths = null;\n\t\tthis.getLengths();\n\t}\n\n}\n\nCurvePath.prototype.isCurvePath = true;\n\nexport { CurvePath };"
  },
  {
    "path": "examples/jsm/math/curves/CurvePath2.js",
    "content": "import { CurvePath } from './CurvePath.js';\n\nclass CurvePath2 extends CurvePath {}\n\nCurvePath2.prototype.isCurvePath2 = true;\n\nexport { CurvePath2 };"
  },
  {
    "path": "examples/jsm/math/curves/CurvePath3.js",
    "content": "import { Vector3, Matrix4, MathUtils } from 't3d';\nimport { CurvePath } from './CurvePath.js';\n\nclass CurvePath3 extends CurvePath {\n\n\t/**\n\t * Computes the frames data of the path.\n\t * TODO: move this to CurvePath.\n\t * @param {object} [options={}] - Options object.\n\t * @param {Vector3|null} [options.up=null] - The input up vector.\n\t * @param {number} [options.divisions=12] - The number of divisions.\n\t * @param {boolean} [options.frenet=true] - Whether to use Frenet frames.\n\t * @param {boolean} [options.fixLine=true] - Whether to fix line tangent types.\n\t * @param {boolean} [options.close=false] - Whether auto-close the path.\n\t * @returns {object} - The frames data.\n\t */\n\tcomputeFrames(options = {}) {\n\t\tconst up = options.up;\n\t\tconst divisions = options.divisions !== undefined ? options.divisions : 12;\n\t\tconst frenet = options.frenet !== undefined ? options.frenet : true;\n\t\tconst fixLine = options.fixLine !== undefined ? options.fixLine : true;\n\t\tconst close = options.close !== undefined ? options.close : false;\n\n\t\tconst points = [];\n\t\tconst tangents = [];\n\t\tconst normals = [];\n\t\tconst binormals = [];\n\t\tconst bisectors = [];\n\t\tconst lengths = [];\n\t\tconst widthScales = [];\n\t\tconst sharps = [];\n\n\t\tconst tangentTypes = [];\n\n\t\t// get points\n\n\t\tlet tangentType = 0;\n\n\t\tfor (let i = 0, curves = this.curves; i < curves.length; i++) {\n\t\t\tconst curve = curves[i];\n\t\t\tconst isLine = curve.isLineCurve2 || curve.isLineCurve3;\n\t\t\tconst resolution = isLine ? 1 : divisions;\n\n\t\t\tconst pts = curve.getPoints(resolution);\n\n\t\t\tconst isLast = i === (curves.length - 1);\n\n\t\t\tif (fixLine && isLine && !isLast) {\n\t\t\t\tconst nextCurve = curves[i + 1];\n\t\t\t\tconst isNextLine = nextCurve.isLineCurve2 || nextCurve.isLineCurve3;\n\t\t\t\tif (!isNextLine) {\n\t\t\t\t\ttangentType = 1;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfor (let j = 0, l = isLast ? pts.length : pts.length - 1; j < l; j++) {\n\t\t\t\tconst point = pts[j];\n\t\t\t\tpoints.push(point);\n\t\t\t\ttangentTypes.push(tangentType);\n\n\t\t\t\tif (tangentType === 1) {\n\t\t\t\t\ttangentType++;\n\t\t\t\t} else {\n\t\t\t\t\tif (tangentType === 2) {\n\t\t\t\t\t\ttangentType = 0;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// first point\n\n\t\ttangents[0] = new Vector3();\n\t\tnormals[0] = new Vector3();\n\t\tbinormals[0] = new Vector3();\n\t\tbisectors[0] = new Vector3();\n\n\t\ttangents[0].subVectors(points[1], points[0]).normalize();\n\n\t\tif (up) {\n\t\t\tnormals[0].copy(up);\n\t\t} else {\n\t\t\t// select an initial normal vector perpendicular to the first tangent vector,\n\t\t\t// and in the direction of the minimum tangent xyz component\n\t\t\tlet min = Number.MAX_VALUE;\n\t\t\tconst tx = Math.abs(tangents[0].x);\n\t\t\tconst ty = Math.abs(tangents[0].y);\n\t\t\tconst tz = Math.abs(tangents[0].z);\n\t\t\tif (tx < min) {\n\t\t\t\tmin = tx;\n\t\t\t\tnormals[0].set(1, 0, 0);\n\t\t\t}\n\t\t\tif (ty < min) {\n\t\t\t\tmin = ty;\n\t\t\t\tnormals[0].set(0, 1, 0);\n\t\t\t}\n\t\t\tif (tz < min) {\n\t\t\t\tnormals[0].set(0, 0, 1);\n\t\t\t}\n\t\t}\n\n\t\tbinormals[0].crossVectors(tangents[0], normals[0]).normalize();\n\t\tnormals[0].crossVectors(binormals[0], tangents[0]).normalize();\n\t\tbisectors[0].copy(binormals[0]);\n\n\t\tlengths[0] = 0;\n\t\twidthScales[0] = 1;\n\t\tsharps[0] = false;\n\n\t\t// other points\n\n\t\tconst lastDir = new Vector3();\n\t\tconst nextDir = new Vector3();\n\n\t\tfor (let i = 1; i < points.length - 1; i++) {\n\t\t\tconst tangent = new Vector3();\n\t\t\tconst normal = new Vector3();\n\t\t\tconst binormal = new Vector3();\n\t\t\tconst bisector = new Vector3();\n\n\t\t\tlastDir.subVectors(points[i], points[i - 1]);\n\t\t\tnextDir.subVectors(points[i + 1], points[i]);\n\n\t\t\tconst lastLength = lastDir.getLength();\n\n\t\t\tlastDir.normalize();\n\t\t\tnextDir.normalize();\n\n\t\t\tbisector.subVectors(nextDir, lastDir).normalize();\n\n\t\t\tconst tangentType = tangentTypes[i];\n\t\t\tif (tangentType === 1) {\n\t\t\t\ttangent.copy(nextDir);\n\t\t\t} else if (tangentType === 2) {\n\t\t\t\ttangent.copy(lastDir);\n\t\t\t} else {\n\t\t\t\ttangent.addVectors(lastDir, nextDir).normalize();\n\t\t\t}\n\n\t\t\tif (frenet) {\n\t\t\t\tnormal.copy(normals[i - 1]);\n\n\t\t\t\tconst vec = binormal.crossVectors(tangents[i - 1], tangent);\n\t\t\t\tif (vec.getLength() > Number.EPSILON) {\n\t\t\t\t\tvec.normalize();\n\t\t\t\t\tconst theta = Math.acos(MathUtils.clamp(tangents[i - 1].dot(tangent), -1, 1)); // clamp for floating pt errors\n\t\t\t\t\tnormal.applyMatrix4(_mat4_1.makeRotationAxis(vec, theta));\n\t\t\t\t}\n\n\t\t\t\tbinormal.crossVectors(tangent, normal).normalize();\n\t\t\t} else {\n\t\t\t\tnormal.copy(up || normals[i - 1]);\n\n\t\t\t\tif (tangent.dot(normal) === 1) {\n\t\t\t\t\tbinormal.crossVectors(nextDir, normal).normalize();\n\t\t\t\t} else {\n\t\t\t\t\tbinormal.crossVectors(tangent, normal).normalize();\n\t\t\t\t}\n\n\t\t\t\tnormal.crossVectors(binormal, tangent).normalize();\n\t\t\t}\n\n\t\t\ttangents[i] = tangent;\n\t\t\tnormals[i] = normal;\n\t\t\tbinormals[i] = binormal;\n\t\t\tbisectors[i] = bisector;\n\n\t\t\tconst _cos = lastDir.dot(nextDir);\n\n\t\t\tlengths[i] = lengths[i - 1] + lastLength;\n\t\t\twidthScales[i] = Math.min(1 / Math.sqrt((1 + _cos) / 2), 1.415) || 1;\n\t\t\tsharps[i] = (Math.abs(_cos - 1) > 0.05);\n\t\t}\n\n\t\t// last point\n\n\t\tconst lastIndex = points.length - 1;\n\n\t\tconst tangent = new Vector3();\n\t\tconst normal = new Vector3();\n\t\tconst binormal = new Vector3();\n\t\tconst bisector = new Vector3();\n\n\t\ttangent.subVectors(points[lastIndex], points[lastIndex - 1]);\n\t\tconst dist = tangent.getLength();\n\n\t\tif (close) {\n\t\t\ttangent.copy(tangents[0]);\n\t\t} else {\n\t\t\ttangent.normalize();\n\t\t}\n\n\t\tnormal.copy(normals[lastIndex - 1]);\n\n\t\tconst vec = binormal.crossVectors(tangents[lastIndex - 1], tangent);\n\t\tif (vec.getLength() > Number.EPSILON) { // see http://www.cs.indiana.edu/pub/techreports/TR425.pdf\n\t\t\tvec.normalize();\n\t\t\tconst theta = Math.acos(MathUtils.clamp(tangents[lastIndex - 1].dot(tangent), -1, 1)); // clamp for floating pt errors\n\t\t\tnormal.applyMatrix4(_mat4_1.makeRotationAxis(vec, theta));\n\t\t}\n\n\t\tbinormal.crossVectors(tangent, normal).normalize();\n\t\tbisector.copy(binormal);\n\n\t\ttangents[lastIndex] = tangent;\n\t\tnormals[lastIndex] = normal;\n\t\tbinormals[lastIndex] = binormal;\n\t\tbisectors[lastIndex] = bisector;\n\n\t\tlengths[lastIndex] = lengths[lastIndex - 1] + dist;\n\t\twidthScales[lastIndex] = 1;\n\t\tsharps[lastIndex] = false;\n\n\t\t// fix first if close\n\n\t\tif (close) {\n\t\t\ttangents[0].copy(tangent);\n\t\t\tnormals[0].copy(normal);\n\t\t\tbinormals[0].copy(binormal);\n\t\t\tbisectors[0].copy(bisector);\n\t\t}\n\n\t\treturn {\n\t\t\tpoints,\n\t\t\ttangents,\n\t\t\tnormals,\n\t\t\tbinormals,\n\t\t\tbisectors,\n\t\t\tlengths,\n\t\t\twidthScales,\n\t\t\tsharps,\n\t\t\ttangentTypes\n\t\t};\n\t}\n\n\t// deprecated since 0.4.0\n\tsetFromPoints(points, options = {}) {\n\t\tconsole.warn('CurvePath3: setFromPoints() has been deprecated. Use setBeveledCurves() instead.');\n\t\tsuper.setBeveledCurves(points, options);\n\t}\n\n}\n\nCurvePath3.prototype.isCurvePath3 = true;\n\nconst _mat4_1 = new Matrix4();\n\nexport { CurvePath3 };"
  },
  {
    "path": "examples/jsm/math/curves/CurveUtils.js",
    "content": "\nimport { Vector3 } from 't3d';\n\n/**\n * CurveUtils\n */\nclass CurveUtils {\n\n\t/**\n\t * Generates 2D-Coordinates in a very fast way.\n\t * Based on work by:\n\t * @see http://www.openprocessing.org/sketch/15493\n\t * @param {Vector3} center     Center of Hilbert curve.\n\t * @param {number} size       Total width of Hilbert curve.\n\t * @param {number} iterations Number of subdivisions.\n\t * @param {number} v0         Corner index -X, -Z.\n\t * @param {number} v1         Corner index -X, +Z.\n\t * @param {number} v2         Corner index +X, +Z.\n\t * @param {number} v3         Corner index +X, -Z.\n\t * @returns {Vector3[]} Array of Vector\n\t */\n\tstatic hilbert2D(center = new Vector3(0, 0, 0), size = 10, iterations = 1, v0 = 0, v1 = 1, v2 = 2, v3 = 3) {\n\t\tconst half = size / 2;\n\n\t\tconst vec_s = [\n\t\t\tnew Vector3(center.x - half, center.y, center.z - half),\n\t\t\tnew Vector3(center.x - half, center.y, center.z + half),\n\t\t\tnew Vector3(center.x + half, center.y, center.z + half),\n\t\t\tnew Vector3(center.x + half, center.y, center.z - half)\n\t\t];\n\n\t\tconst vec = [\n\t\t\tvec_s[v0],\n\t\t\tvec_s[v1],\n\t\t\tvec_s[v2],\n\t\t\tvec_s[v3]\n\t\t];\n\n\t\t// Recurse iterations\n\t\tif (0 <= --iterations) {\n\t\t\tconst tmp = [];\n\n\t\t\tArray.prototype.push.apply(tmp, this.hilbert2D(vec[0], half, iterations, v0, v3, v2, v1));\n\t\t\tArray.prototype.push.apply(tmp, this.hilbert2D(vec[1], half, iterations, v0, v1, v2, v3));\n\t\t\tArray.prototype.push.apply(tmp, this.hilbert2D(vec[2], half, iterations, v0, v1, v2, v3));\n\t\t\tArray.prototype.push.apply(tmp, this.hilbert2D(vec[3], half, iterations, v2, v1, v0, v3));\n\n\t\t\t// Return recursive call\n\t\t\treturn tmp;\n\t\t}\n\n\t\t// Return complete Hilbert Curve.\n\t\treturn vec;\n\t}\n\n\t/**\n\t * Generates 3D-Coordinates in a very fast way.\n\t * Based on work by:\n\t * @see http://www.openprocessing.org/visuals/?visualID=15599\n\t * @param {Vector3} center     Center of Hilbert curve.\n\t * @param {number} size       Total width of Hilbert curve.\n\t * @param {number} iterations Number of subdivisions.\n\t * @param {number} v0         Corner index -X, +Y, -Z.\n\t * @param {number} v1         Corner index -X, +Y, +Z.\n\t * @param {number} v2         Corner index -X, -Y, +Z.\n\t * @param {number} v3         Corner index -X, -Y, -Z.\n\t * @param {number} v4         Corner index +X, -Y, -Z.\n\t * @param {number} v5         Corner index +X, -Y, +Z.\n\t * @param {number} v6         Corner index +X, +Y, +Z.\n\t * @param {number} v7         Corner index +X, +Y, -Z.\n\t * @returns {Vector3[]} Array of Vector3.\n\t */\n\tstatic hilbert3D(center = new Vector3(0, 0, 0), size = 10, iterations = 1, v0 = 0, v1 = 1, v2 = 2, v3 = 3, v4 = 4, v5 = 5, v6 = 6, v7 = 7) {\n\t\t// Default Vars\n\t\tconst half = size / 2;\n\n\t\tconst vec_s = [\n\t\t\tnew Vector3(center.x - half, center.y + half, center.z - half),\n\t\t\tnew Vector3(center.x - half, center.y + half, center.z + half),\n\t\t\tnew Vector3(center.x - half, center.y - half, center.z + half),\n\t\t\tnew Vector3(center.x - half, center.y - half, center.z - half),\n\t\t\tnew Vector3(center.x + half, center.y - half, center.z - half),\n\t\t\tnew Vector3(center.x + half, center.y - half, center.z + half),\n\t\t\tnew Vector3(center.x + half, center.y + half, center.z + half),\n\t\t\tnew Vector3(center.x + half, center.y + half, center.z - half)\n\t\t];\n\n\t\tconst vec = [\n\t\t\tvec_s[v0],\n\t\t\tvec_s[v1],\n\t\t\tvec_s[v2],\n\t\t\tvec_s[v3],\n\t\t\tvec_s[v4],\n\t\t\tvec_s[v5],\n\t\t\tvec_s[v6],\n\t\t\tvec_s[v7]\n\t\t];\n\n\t\t// Recurse iterations\n\t\tif (--iterations >= 0) {\n\t\t\tconst tmp = [];\n\n\t\t\tArray.prototype.push.apply(tmp, this.hilbert3D(vec[0], half, iterations, v0, v3, v4, v7, v6, v5, v2, v1));\n\t\t\tArray.prototype.push.apply(tmp, this.hilbert3D(vec[1], half, iterations, v0, v7, v6, v1, v2, v5, v4, v3));\n\t\t\tArray.prototype.push.apply(tmp, this.hilbert3D(vec[2], half, iterations, v0, v7, v6, v1, v2, v5, v4, v3));\n\t\t\tArray.prototype.push.apply(tmp, this.hilbert3D(vec[3], half, iterations, v2, v3, v0, v1, v6, v7, v4, v5));\n\t\t\tArray.prototype.push.apply(tmp, this.hilbert3D(vec[4], half, iterations, v2, v3, v0, v1, v6, v7, v4, v5));\n\t\t\tArray.prototype.push.apply(tmp, this.hilbert3D(vec[5], half, iterations, v4, v3, v2, v5, v6, v1, v0, v7));\n\t\t\tArray.prototype.push.apply(tmp, this.hilbert3D(vec[6], half, iterations, v4, v3, v2, v5, v6, v1, v0, v7));\n\t\t\tArray.prototype.push.apply(tmp, this.hilbert3D(vec[7], half, iterations, v6, v5, v2, v1, v0, v3, v4, v7));\n\n\t\t\t// Return recursive call\n\t\t\treturn tmp;\n\t\t}\n\n\t\t// Return complete Hilbert Curve.\n\t\treturn vec;\n\t}\n\n\tstatic quadraticBezier(t, p0, p1, p2) {\n\t\treturn quadraticBezierP0(t, p0) + quadraticBezierP1(t, p1) +\n\t\t\tquadraticBezierP2(t, p2);\n\t}\n\n\tstatic cubicBezier(t, p0, p1, p2, p3) {\n\t\treturn cubicBezierP0(t, p0) + cubicBezierP1(t, p1) + cubicBezierP2(t, p2) +\n\t\t\tcubicBezierP3(t, p3);\n\t}\n\n}\n\nfunction quadraticBezierP0(t, p) {\n\tconst k = 1 - t;\n\treturn k * k * p;\n}\n\nfunction quadraticBezierP1(t, p) {\n\treturn 2 * (1 - t) * t * p;\n}\n\nfunction quadraticBezierP2(t, p) {\n\treturn t * t * p;\n}\n\nfunction cubicBezierP0(t, p) {\n\tconst k = 1 - t;\n\treturn k * k * k * p;\n}\n\nfunction cubicBezierP1(t, p) {\n\tconst k = 1 - t;\n\treturn 3 * k * k * t * p;\n}\n\nfunction cubicBezierP2(t, p) {\n\treturn 3 * (1 - t) * t * t * p;\n}\n\nfunction cubicBezierP3(t, p) {\n\treturn t * t * t * p;\n}\n\nexport { CurveUtils };"
  },
  {
    "path": "examples/jsm/math/curves/Curves.js",
    "content": "export { Curve } from './Curve.js';\nexport { LineCurve2 } from './LineCurve2.js';\nexport { LineCurve3 } from './LineCurve3.js';\nexport { QuadraticBezierCurve2 } from './QuadraticBezierCurve2.js';\nexport { QuadraticBezierCurve3 } from './QuadraticBezierCurve3.js';\nexport { CubicBezierCurve2 } from './CubicBezierCurve2.js';\nexport { CubicBezierCurve3 } from './CubicBezierCurve3.js';\n\nexport { CurvePath2 } from './CurvePath2.js';\nexport { CurvePath3 } from './CurvePath3.js';"
  },
  {
    "path": "examples/jsm/math/curves/LineCurve2.js",
    "content": "/**\n * LineCurve2\n */\n\nimport {\n\tVector2\n} from 't3d';\nimport { Curve } from './Curve.js';\n\nclass LineCurve2 extends Curve {\n\n\tconstructor(v1 = new Vector2(), v2 = new Vector2()) {\n\t\tsuper();\n\n\t\tthis.arcLengthDivisions = 1;\n\n\t\tthis.v1 = v1;\n\t\tthis.v2 = v2;\n\t}\n\n\tgetPoint(t, optionalTarget = new Vector2()) {\n\t\tconst point = optionalTarget;\n\n\t\tif (t === 1) {\n\t\t\tpoint.copy(this.v2);\n\t\t} else {\n\t\t\tpoint.copy(this.v2).sub(this.v1);\n\t\t\tpoint.multiplyScalar(t).add(this.v1);\n\t\t}\n\n\t\treturn point;\n\t}\n\n\t// Line curve is linear, so we can overwrite default getPointAt\n\tgetPointAt(u, optionalTarget) {\n\t\treturn this.getPoint(u, optionalTarget);\n\t}\n\n}\n\nLineCurve2.prototype.isLineCurve2 = true;\n\nexport { LineCurve2 };"
  },
  {
    "path": "examples/jsm/math/curves/LineCurve3.js",
    "content": "/**\n * LineCurve3\n */\n\nimport {\n\tVector3\n} from 't3d';\nimport { Curve } from './Curve.js';\n\nclass LineCurve3 extends Curve {\n\n\tconstructor(v1 = new Vector3(), v2 = new Vector3()) {\n\t\tsuper();\n\n\t\tthis.arcLengthDivisions = 1;\n\n\t\tthis.v1 = v1;\n\t\tthis.v2 = v2;\n\t}\n\n\tgetPoint(t, optionalTarget = new Vector3()) {\n\t\tconst point = optionalTarget;\n\n\t\tif (t === 1) {\n\t\t\tpoint.copy(this.v2);\n\t\t} else {\n\t\t\tpoint.copy(this.v2).sub(this.v1);\n\t\t\tpoint.multiplyScalar(t).add(this.v1);\n\t\t}\n\n\t\treturn point;\n\t}\n\n\t// Line curve is linear, so we can overwrite default getPointAt\n\tgetPointAt(u, optionalTarget) {\n\t\treturn this.getPoint(u, optionalTarget);\n\t}\n\n}\n\nLineCurve3.prototype.isLineCurve3 = true;\n\nexport { LineCurve3 };"
  },
  {
    "path": "examples/jsm/math/curves/QuadraticBezierCurve2.js",
    "content": "/**\n * QuadraticBezierCurve2\n */\n\nimport {\n\tVector2\n} from 't3d';\nimport { Curve } from './Curve.js';\nimport { CurveUtils } from './CurveUtils.js';\n\nclass QuadraticBezierCurve2 extends Curve {\n\n\tconstructor(v0 = new Vector2(), v1 = new Vector2(), v2 = new Vector2()) {\n\t\tsuper();\n\n\t\tthis.v0 = v0;\n\t\tthis.v1 = v1;\n\t\tthis.v2 = v2;\n\t}\n\n\tgetPoint(t, optionalTarget = new Vector2()) {\n\t\tconst point = optionalTarget;\n\n\t\tconst v0 = this.v0, v1 = this.v1, v2 = this.v2;\n\n\t\tpoint.set(\n\t\t\tCurveUtils.quadraticBezier(t, v0.x, v1.x, v2.x),\n\t\t\tCurveUtils.quadraticBezier(t, v0.y, v1.y, v2.y)\n\t\t);\n\n\t\treturn point;\n\t}\n\n}\n\nQuadraticBezierCurve2.prototype.isQuadraticBezierCurve2 = true;\n\nexport { QuadraticBezierCurve2 };"
  },
  {
    "path": "examples/jsm/math/curves/QuadraticBezierCurve3.js",
    "content": "/**\n * QuadraticBezierCurve3\n */\n\nimport {\n\tVector3\n} from 't3d';\nimport { Curve } from './Curve.js';\nimport { CurveUtils } from './CurveUtils.js';\n\nclass QuadraticBezierCurve3 extends Curve {\n\n\tconstructor(v0 = new Vector3(), v1 = new Vector3(), v2 = new Vector3()) {\n\t\tsuper();\n\n\t\tthis.v0 = v0;\n\t\tthis.v1 = v1;\n\t\tthis.v2 = v2;\n\t}\n\n\tgetPoint(t, optionalTarget = new Vector3()) {\n\t\tconst point = optionalTarget;\n\n\t\tconst v0 = this.v0, v1 = this.v1, v2 = this.v2;\n\n\t\tpoint.set(\n\t\t\tCurveUtils.quadraticBezier(t, v0.x, v1.x, v2.x),\n\t\t\tCurveUtils.quadraticBezier(t, v0.y, v1.y, v2.y),\n\t\t\tCurveUtils.quadraticBezier(t, v0.z, v1.z, v2.z)\n\t\t);\n\n\t\treturn point;\n\t}\n\n}\n\nQuadraticBezierCurve3.prototype.isQuadraticBezierCurve3 = true;\n\nexport { QuadraticBezierCurve3 };"
  },
  {
    "path": "examples/jsm/misc/OcclusionProxyManager.js",
    "content": "import { QuerySet, QUERYSET_TYPE, Mesh } from 't3d';\n\nexport class OcclusionProxyManager {\n\n\tconstructor(count = 2048) {\n\t\tthis.querySet = new QuerySet(QUERYSET_TYPE.OCCLUSION, count);\n\t\tthis.occludedArray = new Array(count).fill(0);\n\t\tthis.proxies = [];\n\t\tthis.indices = new IndicesManager(count);\n\t\tthis.isReading = false;\n\t}\n\n\taddProxy(proxy) {\n\t\tconst index = this.indices.getIndex();\n\t\tif (index === -1) {\n\t\t\tconsole.warn('OcclusionProxyManager: Reached the max count of occlusion proxies.');\n\t\t\treturn;\n\t\t}\n\t\tproxy.$activate(index);\n\t\tthis.proxies.push(proxy);\n\t}\n\n\tremoveProxy(proxy) {\n\t\tconst i = this.proxies.indexOf(proxy);\n\t\tif (i !== -1) {\n\t\t\tthis.proxies.splice(i, 1);\n\t\t\tthis.indices.freeIndex(proxy.$deactivate());\n\t\t}\n\t}\n\n\tupdate(renderer) {\n\t\tif (!this.isReading) {\n\t\t\trenderer.readQuerySetResults(\n\t\t\t\tthis.querySet, this.occludedArray,\n\t\t\t\t0, this.indices.maxIndex + 1\n\t\t\t).then(results => {\n\t\t\t\tthis.proxies.forEach(proxy => {\n\t\t\t\t\tproxy.$syncOcclusion(results);\n\t\t\t\t});\n\t\t\t\tthis.isReading = false;\n\t\t\t});\n\t\t\tthis.isReading = true;\n\t\t}\n\t}\n\n}\n\nexport class OcclusionProxy extends Mesh {\n\n\tconstructor(geometry, material) {\n\t\tsuper(geometry, material);\n\n\t\t// Set renderLayer to 1 by default.\n\t\t// This can be changed by user\n\t\t// to make sure the occlusion tester is rendered after other objects.\n\t\tthis.renderLayer = 1;\n\n\t\tthis.onOcclusionChange = null;\n\n\t\tthis._index = -1;\n\t\tthis._occluded = false;\n\t}\n\n\tget active() {\n\t\treturn this._index !== -1;\n\t}\n\n\tget index() {\n\t\treturn this._index;\n\t}\n\n\tget occluded() {\n\t\treturn this._occluded;\n\t}\n\n\t$activate(index) {\n\t\tthis._index = index;\n\t}\n\n\t$deactivate() {\n\t\tconst index = this._index;\n\n\t\tthis._index = -1;\n\t\tthis._occluded = false;\n\n\t\treturn index;\n\t}\n\n\t$syncOcclusion(occludedArray) {\n\t\tif (this._index === -1) return;\n\t\tconst occluded = !occludedArray[this._index];\n\t\tif (this._occluded !== occluded) {\n\t\t\tthis._occluded = occluded;\n\t\t\tthis.onOcclusionChange && this.onOcclusionChange(occluded);\n\t\t}\n\t}\n\n}\n\nOcclusionProxy.prototype.isOcclusionProxy = true;\n\nclass IndicesManager {\n\n\tconstructor(maxCount) {\n\t\tthis.maxIndex = -1;\n\t\tthis.freeIndices = [];\n\t\tthis.maxCount = maxCount;\n\t}\n\n\tgetIndex() {\n\t\tlet index;\n\t\tif (this.freeIndices.length > 0) {\n\t\t\t// Get the smallest index from freeIndices\n\t\t\tindex = this.freeIndices.pop();\n\t\t} else {\n\t\t\tif (this.maxIndex + 1 >= this.maxCount) {\n\t\t\t\t// Reached the max count of occlusion proxies.\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t\tindex = ++this.maxIndex;\n\t\t}\n\t\treturn index;\n\t}\n\n\tfreeIndex(index) {\n\t\tif (index < 0 || index > this.maxIndex) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (index === this.maxIndex) {\n\t\t\tthis.maxIndex--;\n\t\t}\n\n\t\t// Insert index back to freeIndices, keeping the array sorted in descending order\n\t\tlet left = 0, right = this.freeIndices.length;\n\t\twhile (left < right) {\n\t\t\tconst mid = Math.floor((left + right) / 2);\n\t\t\tif (this.freeIndices[mid] > index) {\n\t\t\t\tleft = mid + 1;\n\t\t\t} else {\n\t\t\t\tright = mid;\n\t\t\t}\n\t\t}\n\t\tthis.freeIndices.splice(left, 0, index);\n\t}\n\n}\n\nexport const OcclusionRenderOptions = {\n\tifRender: function(renderable) {\n\t\treturn renderable.object.active;\n\t},\n\tbeforeRender: function(renderable) {\n\t\tthis.beginOcclusionQuery(renderable.object.index);\n\t},\n\tafterRender: function() {\n\t\tthis.endOcclusionQuery();\n\t}\n};"
  },
  {
    "path": "examples/jsm/misc/Timer.js",
    "content": "// Reference: github.com/mrdoob/three.js/pull/17912\nclass Timer {\n\n\tconstructor() {\n\t\tthis._previousTime = 0;\n\t\tthis._currentTime = 0;\n\t\tthis._startTime = now();\n\n\t\tthis._delta = 0;\n\t\tthis._elapsed = 0;\n\n\t\t// use Page Visibility API to avoid large time delta values\n\n\t\tthis._usePageVisibilityAPI = (typeof document !== 'undefined' && document.hidden !== undefined);\n\n\t\tif (this._usePageVisibilityAPI === true) {\n\t\t\tthis._pageVisibilityHandler = handleVisibilityChange.bind(this);\n\n\t\t\tdocument.addEventListener('visibilitychange', this._pageVisibilityHandler, false);\n\t\t}\n\t}\n\n\tgetDelta() {\n\t\treturn this._delta / 1000;\n\t}\n\n\tgetElapsed() {\n\t\treturn this._elapsed / 1000;\n\t}\n\n\treset() {\n\t\tthis._currentTime = now() - this._startTime;\n\n\t\treturn this;\n\t}\n\n\tdispose() {\n\t\tif (this._usePageVisibilityAPI === true) {\n\t\t\tdocument.removeEventListener('visibilitychange', this._pageVisibilityHandler);\n\t\t}\n\n\t\treturn this;\n\t}\n\n\tupdate(timestamp) {\n\t\tif (this._usePageVisibilityAPI === true && document.hidden === true) {\n\t\t\tthis._delta = 0;\n\t\t} else {\n\t\t\tthis._previousTime = this._currentTime;\n\t\t\tthis._currentTime = (timestamp !== undefined ? timestamp : now()) - this._startTime;\n\n\t\t\tthis._delta = this._currentTime - this._previousTime;\n\t\t\tthis._elapsed += this._delta; // _elapsed is the accumulation of all previous deltas\n\t\t}\n\n\t\treturn this;\n\t}\n\n}\n\nclass FixedTimer extends Timer {\n\n\tconstructor(fps = 60) {\n\t\tsuper();\n\t\tthis._delta = (1 / fps) * 1000;\n\t}\n\n\tupdate() {\n\t\tthis._elapsed += this._delta; // _elapsed is the accumulation of all previous deltas\n\n\t\treturn this;\n\t}\n\n}\n\nfunction now() {\n\treturn performance.now();\n}\n\nfunction handleVisibilityChange() {\n\tif (document.hidden === false) this.reset();\n}\n\nexport { Timer, FixedTimer };\n"
  },
  {
    "path": "examples/jsm/navigation/AStar.js",
    "content": "// javascript-astar\n// http://github.com/bgrins/javascript-astar\n// Freely distributable under the MIT License.\n// Implements the astar search algorithm in javascript using a binary heap.\n\nclass AStar {\n\n\tstatic init(graph) {\n\t\tfor (let x = 0; x < graph.length; x++) {\n\t\t\tconst node = graph[x];\n\t\t\tnode.f = 0;\n\t\t\tnode.g = 0;\n\t\t\tnode.h = 0;\n\t\t\tnode.cost = 1.0;\n\t\t\tnode.visited = false;\n\t\t\tnode.closed = false;\n\t\t\tnode.parent = null;\n\t\t}\n\t}\n\n\tstatic cleanUp(graph) {\n\t\tfor (let x = 0; x < graph.length; x++) {\n\t\t\tconst node = graph[x];\n\t\t\tdelete node.f;\n\t\t\tdelete node.g;\n\t\t\tdelete node.h;\n\t\t\tdelete node.cost;\n\t\t\tdelete node.visited;\n\t\t\tdelete node.closed;\n\t\t\tdelete node.parent;\n\t\t}\n\t}\n\n\tstatic search(graph, start, end) {\n\t\tthis.init(graph);\n\n\t\tconst openHeap = new BinaryHeap(function(node) {\n\t\t\treturn node.f;\n\t\t});\n\n\t\topenHeap.push(start);\n\n\t\twhile (openHeap.size() > 0) {\n\t\t\t// Grab the lowest f(x) to process next.  Heap keeps this sorted for us.\n\t\t\tconst currentNode = openHeap.pop();\n\n\t\t\t// End case -- result has been found, return the traced path.\n\t\t\tif (currentNode === end) {\n\t\t\t\tlet curr = currentNode;\n\t\t\t\tconst ret = [];\n\t\t\t\twhile (curr.parent) {\n\t\t\t\t\tret.push(curr);\n\t\t\t\t\tcurr = curr.parent;\n\t\t\t\t}\n\t\t\t\tthis.cleanUp(ret);\n\t\t\t\treturn ret.reverse();\n\t\t\t}\n\n\t\t\t// Normal case -- move currentNode from open to closed, process each of its neighbours.\n\t\t\tcurrentNode.closed = true;\n\n\t\t\t// Find all neighbours for the current node. Optionally find diagonal neighbours as well (false by default).\n\t\t\tconst neighbours = this.neighbours(graph, currentNode);\n\n\t\t\tfor (let i = 0, il = neighbours.length; i < il; i++) {\n\t\t\t\tconst neighbour = neighbours[i];\n\t\t\t\tif (neighbour.closed) {\n\t\t\t\t\t// Not a valid node to process, skip to next neighbour.\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// The g score is the shortest distance from start to current node.\n\t\t\t\t// We need to check if the path we have arrived at this neighbour is the shortest one we have seen yet.\n\t\t\t\tconst gScore = currentNode.g + neighbour.cost;\n\t\t\t\tconst beenVisited = neighbour.visited;\n\n\t\t\t\tif (!beenVisited || gScore < neighbour.g) {\n\t\t\t\t\t// Found an optimal (so far) path to this node.  Take score for node to see how good it is.\n\t\t\t\t\tneighbour.visited = true;\n\t\t\t\t\tneighbour.parent = currentNode;\n\t\t\t\t\tif (!neighbour.centroid || !end.centroid) {\n\t\t\t\t\t\tthrow new Error('Unexpected state');\n\t\t\t\t\t}\n\t\t\t\t\tneighbour.h =\n                        neighbour.h || neighbour.centroid.distanceToSquared(end.centroid);\n\t\t\t\t\tneighbour.g = gScore;\n\t\t\t\t\tneighbour.f = neighbour.g + neighbour.h;\n\n\t\t\t\t\tif (!beenVisited) {\n\t\t\t\t\t\t// Pushing to heap will put it in proper place based on the 'f' value.\n\t\t\t\t\t\topenHeap.push(neighbour);\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// Already seen the node, but since it has been rescored we need to reorder it in the heap\n\t\t\t\t\t\topenHeap.rescoreElement(neighbour);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// No result was found - empty array signifies failure to find path.\n\t\treturn [];\n\t}\n\n\tstatic neighbours(graph, node) {\n\t\tconst ret = [];\n\n\t\tfor (let e = 0; e < node.neighbours.length; e++) {\n\t\t\tret.push(graph[node.neighbours[e]]);\n\t\t}\n\n\t\treturn ret;\n\t}\n\n}\n\nclass BinaryHeap {\n\n\tconstructor(scoreFunction) {\n\t\tthis.content = [];\n\t\tthis.scoreFunction = scoreFunction;\n\t}\n\n\tpush(element) {\n\t\t// Add the new element to the end of the array.\n\t\tthis.content.push(element);\n\n\t\t// Allow it to sink down.\n\t\tthis.sinkDown(this.content.length - 1);\n\t}\n\n\tpop() {\n\t\t// Store the first element so we can return it later.\n\t\tconst result = this.content[0];\n\t\t// Get the element at the end of the array.\n\t\tconst end = this.content.pop();\n\t\t// If there are any elements left, put the end element at the\n\t\t// start, and let it bubble up.\n\t\tif (this.content.length > 0) {\n\t\t\tthis.content[0] = end;\n\t\t\tthis.bubbleUp(0);\n\t\t}\n\t\treturn result;\n\t}\n\n\tremove(node) {\n\t\tconst i = this.content.indexOf(node);\n\n\t\t// When it is found, the process seen in 'pop' is repeated\n\t\t// to fill up the hole.\n\t\tconst end = this.content.pop();\n\n\t\tif (i !== this.content.length - 1) {\n\t\t\tthis.content[i] = end;\n\n\t\t\tif (this.scoreFunction(end) < this.scoreFunction(node)) {\n\t\t\t\tthis.sinkDown(i);\n\t\t\t} else {\n\t\t\t\tthis.bubbleUp(i);\n\t\t\t}\n\t\t}\n\t}\n\n\tsize() {\n\t\treturn this.content.length;\n\t}\n\n\trescoreElement(node) {\n\t\tthis.sinkDown(this.content.indexOf(node));\n\t}\n\n\tsinkDown(n) {\n\t\t// Fetch the element that has to be sunk.\n\t\tconst element = this.content[n];\n\n\t\t// When at 0, an element can not sink any further.\n\t\twhile (n > 0) {\n\t\t\t// Compute the parent element's index, and fetch it.\n\t\t\tconst parentN = ((n + 1) >> 1) - 1;\n\t\t\tconst parent = this.content[parentN];\n\t\t\tif (this.scoreFunction(element) < this.scoreFunction(parent)) {\n\t\t\t\t// Swap the elements if the parent is greater.\n\t\t\t\tthis.content[parentN] = element;\n\t\t\t\tthis.content[n] = parent;\n\t\t\t\t// Update 'n' to continue at the new position.\n\t\t\t\tn = parentN;\n\t\t\t} else {\n\t\t\t\t// Found a parent that is less, no need to sink any further.\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\tbubbleUp(n) {\n\t\t// Look up the target element and its score.\n\t\tconst length = this.content.length,\n\t\t\telement = this.content[n],\n\t\t\telemScore = this.scoreFunction(element);\n\n\t\twhile (true) {\n\t\t\t// Compute the indices of the child elements.\n\t\t\tconst child2N = (n + 1) << 1,\n\t\t\t\tchild1N = child2N - 1;\n\t\t\t// This is used to store the new position of the element,\n\t\t\t// if any.\n\t\t\tlet swap = null;\n\t\t\tlet child1Score;\n\t\t\t// If the first child exists (is inside the array)...\n\t\t\tif (child1N < length) {\n\t\t\t\t// Look it up and compute its score.\n\t\t\t\tconst child1 = this.content[child1N];\n\t\t\t\tchild1Score = this.scoreFunction(child1);\n\n\t\t\t\t// If the score is less than our element's, we need to swap.\n\t\t\t\tif (child1Score < elemScore) {\n\t\t\t\t\tswap = child1N;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Do the same checks for the other child.\n\t\t\tif (child2N < length) {\n\t\t\t\tconst child2 = this.content[child2N],\n\t\t\t\t\tchild2Score = this.scoreFunction(child2);\n\t\t\t\tif (child2Score < (swap === null ? elemScore : child1Score)) {\n\t\t\t\t\tswap = child2N;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (swap !== null) { // If the element needs to be moved, swap it, and continue.\n\t\t\t\tthis.content[n] = this.content[swap];\n\t\t\t\tthis.content[swap] = element;\n\t\t\t\tn = swap;\n\t\t\t} else { // Otherwise, we are done.\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n}\n\nexport { AStar };"
  },
  {
    "path": "examples/jsm/navigation/Pathfinding.js",
    "content": "import { Vector3 } from 't3d';\nimport { AStar } from './AStar.js';\nimport { isPointInPoly, triarea2, vequal } from './Utils.js';\n\nclass Pathfinding {\n\n\t// Returns a path between given start and end points. If a complete path\n\t// cannot be found, will return the nearest endpoint available.\n\tstatic findPath(startPosition, targetPosition, zone) {\n\t\tif (!zone) return;\n\n\t\tconst groupID = zone.getGroup(startPosition);\n\t\tconst nodes = zone.groups[groupID];\n\t\tconst vertices = zone.vertices;\n\n\t\tif (!nodes || !vertices) return;\n\n\t\t// maybe stuck when its true\n\t\tconst closestNode = getClosestNode(startPosition, nodes, vertices, true);\n\t\tconst farthestNode = getClosestNode(targetPosition, nodes, vertices, true);\n\n\t\t// If we can't find any node, just go straight to the target\n\t\tif (!closestNode || !farthestNode) {\n\t\t\treturn null;\n\t\t}\n\n\t\tconst paths = AStar.search(nodes, closestNode, farthestNode);\n\n\t\tconst getPortalFromTo = function(a, b) {\n\t\t\tfor (let i = 0; i < a.neighbours.length; i++) {\n\t\t\t\tif (a.neighbours[i] === b.id) {\n\t\t\t\t\treturn a.portals[i];\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\t// We have the corridor, now pull the rope.\n\t\tconst channel = new Channel();\n\t\tchannel.push(startPosition);\n\t\tfor (let i = 0; i < paths.length; i++) {\n\t\t\tconst polygon = paths[i];\n\t\t\tconst nextPolygon = paths[i + 1];\n\n\t\t\tif (nextPolygon) {\n\t\t\t\tconst portals = getPortalFromTo(polygon, nextPolygon);\n\t\t\t\tchannel.push(vertices[portals[0]], vertices[portals[1]]);\n\t\t\t}\n\t\t}\n\t\tchannel.push(targetPosition);\n\t\tchannel.stringPull();\n\n\t\t// Return the path, omitting first position (which is already known).\n\t\tconst path = channel.path.map(c => new Vector3(c.x, c.y, c.z));\n\t\tpath.shift();\n\n\t\treturn path;\n\t}\n\n}\n\nexport { Pathfinding };\n\nclass Channel {\n\n\tconstructor() {\n\t\tthis.portals = [];\n\t}\n\n\tpush(p1, p2) {\n\t\tif (p2 === undefined) p2 = p1;\n\t\tthis.portals.push({\n\t\t\tleft: p1,\n\t\t\tright: p2\n\t\t});\n\t}\n\n\tstringPull() {\n\t\tconst portals = this.portals;\n\t\tconst pts = [];\n\t\t// Init scan state\n\t\tlet portalApex, portalLeft, portalRight;\n\t\tlet apexIndex = 0;\n\t\tlet leftIndex = 0;\n\t\tlet rightIndex = 0;\n\n\t\tportalApex = portals[0].left;\n\t\tportalLeft = portals[0].left;\n\t\tportalRight = portals[0].right;\n\n\t\t// Add start point.\n\t\tpts.push(portalApex);\n\n\t\tfor (let i = 1; i < portals.length; i++) {\n\t\t\tconst left = portals[i].left;\n\t\t\tconst right = portals[i].right;\n\n\t\t\t// Update right vertex.\n\t\t\tif (triarea2(portalApex, portalRight, right) <= 0.0) {\n\t\t\t\tif (vequal(portalApex, portalRight) || triarea2(portalApex, portalLeft, right) > 0.0) {\n\t\t\t\t\t// Tighten the funnel.\n\t\t\t\t\tportalRight = right; //\n\t\t\t\t\trightIndex = i;\n\t\t\t\t} else {\n\t\t\t\t\t// Right over left, insert left to path and restart scan from portal left point.\n\t\t\t\t\tpts.push(portalLeft);\n\t\t\t\t\t// Make current left the new apex.\n\t\t\t\t\tportalApex = portalLeft;\n\t\t\t\t\tapexIndex = leftIndex;\n\t\t\t\t\t// Reset portal\n\t\t\t\t\tportalRight = portalApex;\n\t\t\t\t\trightIndex = apexIndex;\n\t\t\t\t\t// Restart scan\n\t\t\t\t\ti = apexIndex;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Update left vertex.\n\t\t\tif (triarea2(portalApex, portalLeft, left) >= 0.0) {\n\t\t\t\tif (vequal(portalApex, portalLeft) || triarea2(portalApex, portalRight, left) < 0.0) {\n\t\t\t\t\t// Tighten the funnel.\n\t\t\t\t\tportalLeft = left;\n\t\t\t\t\tleftIndex = i;\n\t\t\t\t} else {\n\t\t\t\t\t// Left over right, insert right to path and restart scan from portal right point.\n\t\t\t\t\tpts.push(portalRight);\n\t\t\t\t\t// Make current right the new apex.\n\t\t\t\t\tportalApex = portalRight;\n\t\t\t\t\tapexIndex = rightIndex;\n\t\t\t\t\t// Reset portal\n\t\t\t\t\tportalLeft = portalApex;\n\t\t\t\t\tleftIndex = apexIndex;\n\t\t\t\t\t// Restart scan\n\t\t\t\t\ti = apexIndex;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (\n\t\t\tpts.length === 0 ||\n            !vequal(pts[pts.length - 1], portals[portals.length - 1].left)\n\t\t) {\n\t\t\t// Append last point to path.\n\t\t\tpts.push(portals[portals.length - 1].left);\n\t\t}\n\n\t\tthis.path = pts;\n\t\treturn pts;\n\t}\n\n}\n\n// Returns the closest node to the target position.\nfunction getClosestNode(position, nodes, vertices, checkPolygon = false) {\n\tlet closestNode = null;\n\tlet closestDistance = Infinity;\n\n\tnodes.forEach(node => {\n\t\tconst distance = node.centroid.distanceToSquared(position);\n\t\tif (distance < closestDistance && (!checkPolygon || isVectorInPolygon(position, node, vertices))) {\n\t\t\tclosestNode = node;\n\t\t\tclosestDistance = distance;\n\t\t}\n\t});\n\n\treturn closestNode;\n}\n\nfunction isVectorInPolygon(vector, polygon, vertices) {\n\t// reference point will be the centroid of the polygon\n\t// We need to rotate the vector as well as all the points which the polygon uses\n\n\tlet lowestPoint = 100000;\n\tlet highestPoint = -100000;\n\n\tconst polygonVertices = [];\n\n\tpolygon.vertexIds.forEach(vId => {\n\t\tlowestPoint = Math.min(vertices[vId].y, lowestPoint);\n\t\thighestPoint = Math.max(vertices[vId].y, highestPoint);\n\t\tpolygonVertices.push(vertices[vId]);\n\t});\n\n\tif (\n\t\tvector.y < highestPoint + 0.5 &&\n        vector.y > lowestPoint - 0.5 &&\n        isPointInPoly(polygonVertices, vector)\n\t) {\n\t\treturn true;\n\t}\n\treturn false;\n}"
  },
  {
    "path": "examples/jsm/navigation/PathfindingHelper.js",
    "content": "import {\n\tBoxGeometry,\n\tSphereGeometry,\n\tBasicMaterial,\n\tLineMaterial,\n\tMesh,\n\tObject3D,\n\tGeometry,\n\tBuffer,\n\tAttribute,\n\tDRAW_MODE\n} from 't3d';\n\n// Helper for debugging pathfinding behavior.\nclass PathfindingHelper extends Object3D {\n\n\tconstructor() {\n\t\tsuper();\n\n\t\tconst playerMaterial = new BasicMaterial();\n\t\tplayerMaterial.diffuse.setHex(0x00FF00);\n\t\tthis._playerMarker = new Mesh(new SphereGeometry(0.23, 32, 32), playerMaterial);\n\n\t\tconst targetMaterial = new BasicMaterial();\n\t\ttargetMaterial.diffuse.setHex(0xFFA500);\n\t\tthis._targetMarker = new Mesh(new BoxGeometry(0.3, 0.3, 0.3), targetMaterial);\n\n\t\tthis._pathMarker = new Object3D();\n\n\t\tthis._pathLineMaterial = new LineMaterial();\n\t\tthis._pathLineMaterial.diffuse.setHex(0x0000ff);\n\t\tthis._pathLineMaterial.lineWidth = 1;\n\t\tthis._pathLineMaterial.transparent = true;\n\t\tthis._pathLineMaterial.opacity = 0.5;\n\t\tthis._pathLineMaterial.drawMode = DRAW_MODE.LINE_STRIP;\n\n\t\tthis._pathPointMaterial = new BasicMaterial();\n\t\tthis._pathPointMaterial.diffuse.setHex(0x0000ff);\n\t\tthis._pathPointGeometry = new SphereGeometry(0.08);\n\n\t\tthis._markers = [\n\t\t\tthis._playerMarker,\n\t\t\tthis._targetMarker,\n\t\t\tthis._pathMarker\n\t\t];\n\n\t\tthis._markers.forEach(marker => {\n\t\t\tmarker.visible = false;\n\t\t\tthis.add(marker);\n\t\t});\n\t}\n\n\tsetPath(path) {\n\t\twhile (this._pathMarker.children.length) {\n\t\t\tthis._pathMarker.children[0].visible = false;\n\t\t\tthis._pathMarker.remove(this._pathMarker.children[0]);\n\t\t}\n\n\t\tpath = [this._playerMarker.position].concat(path);\n\n\t\t// Draw debug lines\n\t\tconst geometry = new Geometry();\n\t\tconst buffer = new Buffer(new Float32Array(path.length * 3), 3);\n\t\tgeometry.addAttribute('a_Position', new Attribute(buffer, 3, 0));\n\n\t\tfor (let i = 0; i < path.length; i++) {\n\t\t\tconst index = i * 3;\n\t\t\tbuffer.array[index + 0] = path[i].x;\n\t\t\tbuffer.array[index + 1] = path[i].y + OFFSET;\n\t\t\tbuffer.array[index + 2] = path[i].z;\n\t\t}\n\n\t\tconst lineMesh = new Mesh(geometry, this._pathLineMaterial);\n\t\tthis._pathMarker.add(lineMesh);\n\n\t\tfor (let i = 0; i < path.length - 1; i++) {\n\t\t\tconst node = new Mesh(this._pathPointGeometry, this._pathPointMaterial);\n\t\t\tnode.position.copy(path[i]);\n\t\t\tnode.position.y += OFFSET;\n\t\t\tthis._pathMarker.add(node);\n\t\t}\n\n\t\tthis._pathMarker.visible = true;\n\t\treturn this;\n\t}\n\n\tsetPlayerPosition(position) {\n\t\tthis._playerMarker.position.copy(position);\n\t\tthis._playerMarker.visible = true;\n\t\treturn this;\n\t}\n\n\tsetTargetPosition(position) {\n\t\tthis._targetMarker.position.copy(position);\n\t\tthis._targetMarker.visible = true;\n\t\treturn this;\n\t}\n\n\t// Hides all markers.\n\treset() {\n\t\twhile (this._pathMarker.children.length) {\n\t\t\tthis._pathMarker.children[0].geometry.dispose();\n\t\t\tthis._pathMarker.remove(this._pathMarker.children[0]);\n\t\t}\n\n\t\tthis._markers.forEach(marker => {\n\t\t\tmarker.visible = false;\n\t\t});\n\n\t\treturn this;\n\t}\n\n}\n\nexport { PathfindingHelper };\n\nconst OFFSET = 0.2;"
  },
  {
    "path": "examples/jsm/navigation/Utils.js",
    "content": "// + Jonas Raoni Soares Silva\n// @ http://jsfromhell.com/math/is-point-in-poly [rev. #0]\nexport function isPointInPoly(poly, pt) {\n\tlet c = false;\n\tfor (let i = -1, l = poly.length, j = l - 1; ++i < l; j = i) {\n\t\t((poly[i].z <= pt.z && pt.z < poly[j].z) || (poly[j].z <= pt.z && pt.z < poly[i].z))\n        && (pt.x < (poly[j].x - poly[i].x) * (pt.z - poly[i].z) / (poly[j].z - poly[i].z) + poly[i].x)\n        && (c = !c);\n\t}\n\treturn c;\n}\n\nexport function triarea2(a, b, c) {\n\tconst ax = b.x - a.x;\n\tconst az = b.z - a.z;\n\tconst bx = c.x - a.x;\n\tconst bz = c.z - a.z;\n\treturn bx * az - ax * bz;\n}\n\nexport function vequal(a, b) {\n\treturn a.distanceToSquared(b) < 0.00001;\n}"
  },
  {
    "path": "examples/jsm/navigation/Zone.js",
    "content": "import { Vector3, Plane, Matrix4, DRAW_MODE } from 't3d';\nimport { isPointInPoly } from './Utils.js';\nimport { TriangleSoup } from '../math/TriangleSoup.js';\n\nclass Zone {\n\n\tstatic createFromTriangleSoup(triangleSoup) {\n\t\tconst navMesh = _buildPolygonsFromTriangleSoup(triangleSoup);\n\n\t\tconst zone = new Zone();\n\n\t\tnavMesh.vertices.forEach(v => {\n\t\t\tv.x = roundNumber(v.x, 2);\n\t\t\tv.y = roundNumber(v.y, 2);\n\t\t\tv.z = roundNumber(v.z, 2);\n\t\t});\n\n\t\tzone.vertices = navMesh.vertices;\n\n\t\tconst groups = _buildPolygonGroups(navMesh);\n\t\t// TODO: This block represents a large portion of navigation mesh construction time\n\t\t// and could probably be optimized. For example, construct portals while\n\t\t// determining the neighbor graph.\n\t\tzone.groups = new Array(groups.length);\n\t\tgroups.forEach((group, groupIndex) => {\n\t\t\tconst indexByPolygon = new Map(); // { polygon: index in group }\n\t\t\tgroup.forEach((poly, polyIndex) => {\n\t\t\t\tindexByPolygon.set(poly, polyIndex);\n\t\t\t});\n\n\t\t\tconst newGroup = new Array(group.length);\n\t\t\tgroup.forEach((poly, polyIndex) => {\n\t\t\t\tconst neighbourIndices = [];\n\t\t\t\tpoly.neighbours.forEach(n =>\n\t\t\t\t\tneighbourIndices.push(indexByPolygon.get(n))\n\t\t\t\t);\n\n\t\t\t\t// Build a portal list to each neighbour\n\t\t\t\tconst portals = [];\n\t\t\t\tpoly.neighbours.forEach(n =>\n\t\t\t\t\tportals.push(_getSharedVerticesInOrder(poly, n))\n\t\t\t\t);\n\n\t\t\t\tconst centroid = new Vector3(0, 0, 0);\n\t\t\t\tcentroid.add(zone.vertices[poly.vertexIds[0]]);\n\t\t\t\tcentroid.add(zone.vertices[poly.vertexIds[1]]);\n\t\t\t\tcentroid.add(zone.vertices[poly.vertexIds[2]]);\n\t\t\t\tcentroid.multiplyScalar(1 / 3);\n\t\t\t\tcentroid.x = roundNumber(centroid.x, 2);\n\t\t\t\tcentroid.y = roundNumber(centroid.y, 2);\n\t\t\t\tcentroid.z = roundNumber(centroid.z, 2);\n\n\t\t\t\tnewGroup[polyIndex] = {\n\t\t\t\t\tid: polyIndex,\n\t\t\t\t\tneighbours: neighbourIndices,\n\t\t\t\t\tvertexIds: poly.vertexIds,\n\t\t\t\t\tcentroid: centroid,\n\t\t\t\t\tportals: portals\n\t\t\t\t};\n\t\t\t});\n\n\t\t\tzone.groups[groupIndex] = newGroup;\n\t\t});\n\n\t\treturn zone;\n\t}\n\n\t// deprecated since v0.4.1\n\tstatic createFromGeometry(geometry, tolerance = 1e-4) {\n\t\tconsole.warn('Zone.createFromGeometry has been deprecated, use Zone.createFromTriangleSoup instead.');\n\n\t\tconst fakeMesh = {\n\t\t\tgeometry,\n\t\t\tmaterial: { drawMode: DRAW_MODE.TRIANGLES }\n\t\t};\n\n\t\tconst triangleSoup = new TriangleSoup();\n\t\ttriangleSoup.addMesh(fakeMesh, new Matrix4());\n\t\ttriangleSoup.mergeVertices(tolerance);\n\n\t\treturn this.createFromTriangleSoup(triangleSoup);\n\t}\n\n\tconstructor() {\n\t\tthis.vertices = [];\n\t\tthis.groups = [];\n\t}\n\n\t// Returns closest node group ID for given position.\n\tgetGroup(position, checkPolygon = false) {\n\t\tlet closestNodeGroup = null;\n\t\tlet distance = Math.pow(50, 2); // Is the distance too large here?\n\t\tfor (let i = 0; i < this.groups.length; i++) {\n\t\t\tconst group = this.groups[i];\n\t\t\tfor (const node of group) {\n\t\t\t\tif (checkPolygon) {\n\t\t\t\t\tconst a = this.vertices[node.vertexIds[0]];\n\t\t\t\t\tconst b = this.vertices[node.vertexIds[1]];\n\t\t\t\t\tconst c = this.vertices[node.vertexIds[2]];\n\n\t\t\t\t\t// setFromCoplanarPointsToPlane\n\t\t\t\t\tconst normal = _vector1.subVectors(c, b).cross(_vector2.subVectors(a, b)).normalize();\n\t\t\t\t\t_plane.setFromNormalAndCoplanarPoint(normal, a);\n\n\t\t\t\t\tif (Math.abs(_plane.distanceToPoint(position)) < 0.01) {\n\t\t\t\t\t\tconst poly = [a, b, c];\n\t\t\t\t\t\tif (isPointInPoly(poly, position)) {\n\t\t\t\t\t\t\treturn i;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tconst measuredDistance = node.centroid.distanceToSquared(position);\n\t\t\t\tif (measuredDistance < distance) {\n\t\t\t\t\tclosestNodeGroup = i;\n\t\t\t\t\tdistance = measuredDistance;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn closestNodeGroup;\n\t}\n\n}\n\nexport { Zone };\n\nconst _vector1 = new Vector3();\nconst _vector2 = new Vector3();\nconst _plane = new Plane();\n\nfunction _buildPolygonsFromTriangleSoup(triangleSoup) {\n\tconst polygons = [];\n\tconst vertices = [];\n\n\tconst { positions, indices } = triangleSoup;\n\n\t// Constructing the neighbor graph brute force is O(n²). To avoid that,\n\t// create a map from vertices to the polygons that contain them, and use it\n\t// while connecting polygons. This reduces complexity to O(n*m), where 'm'\n\t// is related to connectivity of the mesh.\n\n\t/** Array of polygon objects by vertex index. */\n\tconst vertexPolygonMap = [];\n\n\tfor (let i = 0, l = positions.length; i < l; i += 3) {\n\t\tconst vertex = new Vector3();\n\t\tvertex.fromArray(positions, i);\n\t\tvertices.push(vertex);\n\t\tvertexPolygonMap[i / 3] = [];\n\t}\n\n\t// Convert the faces into a custom format that supports more than 3 vertices\n\tfor (let i = 0, l = indices.length; i < l; i += 3) {\n\t\t_vector1.fromArray(indices, i);\n\t\tconst a = _vector1.x;\n\t\tconst b = _vector1.y;\n\t\tconst c = _vector1.z;\n\t\tconst poly = { vertexIds: [a, b, c], neighbours: null };\n\t\tpolygons.push(poly);\n\t\tvertexPolygonMap[a].push(poly);\n\t\tvertexPolygonMap[b].push(poly);\n\t\tvertexPolygonMap[c].push(poly);\n\t}\n\n\t// Build a list of adjacent polygons\n\tpolygons.forEach(polygon => {\n\t\tpolygon.neighbours = _buildPolygonNeighbours(polygon, vertexPolygonMap);\n\t});\n\n\treturn {\n\t\tpolygons: polygons,\n\t\tvertices: vertices\n\t};\n}\n\nfunction _buildPolygonNeighbours(polygon, vertexPolygonMap) {\n\tconst neighbours = new Set();\n\n\tconst groupA = vertexPolygonMap[polygon.vertexIds[0]];\n\tconst groupB = vertexPolygonMap[polygon.vertexIds[1]];\n\tconst groupC = vertexPolygonMap[polygon.vertexIds[2]];\n\n\t// It's only necessary to iterate groups A and B. Polygons contained only\n\t// in group C cannot share a >1 vertex with this polygon.\n\t// IMPORTANT: Bublé cannot compile for-of loops.\n\tgroupA.forEach(candidate => {\n\t\tif (candidate === polygon) return;\n\t\tif (groupB.includes(candidate) || groupC.includes(candidate)) {\n\t\t\tneighbours.add(candidate);\n\t\t}\n\t});\n\tgroupB.forEach(candidate => {\n\t\tif (candidate === polygon) return;\n\t\tif (groupC.includes(candidate)) {\n\t\t\tneighbours.add(candidate);\n\t\t}\n\t});\n\n\treturn neighbours;\n}\n\nfunction _buildPolygonGroups(navigationMesh) {\n\tconst polygons = navigationMesh.polygons;\n\tconst polygonGroups = [];\n\tpolygons.forEach(polygon => {\n\t\tif (polygon.group !== undefined) {\n\t\t\t// this polygon is already part of a group\n\t\t\tpolygonGroups[polygon.group].push(polygon);\n\t\t} else {\n\t\t\t// we need to make a new group and spread its ID to neighbors\n\t\t\tpolygon.group = polygonGroups.length;\n\t\t\t_spreadGroupId(polygon);\n\t\t\tpolygonGroups.push([polygon]);\n\t\t}\n\t});\n\n\treturn polygonGroups;\n}\n\nfunction _spreadGroupId(seed) {\n\tlet nextBatch = new Set([seed]);\n\n\twhile (nextBatch.size > 0) {\n\t\tconst batch = nextBatch;\n\t\tnextBatch = new Set();\n\n\t\tbatch.forEach(polygon => {\n\t\t\tpolygon.group = seed.group;\n\t\t\tpolygon.neighbours.forEach(neighbour => {\n\t\t\t\tif (neighbour.group === undefined) {\n\t\t\t\t\tnextBatch.add(neighbour);\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t}\n}\n\nfunction _getSharedVerticesInOrder(a, b) {\n\tconst aList = a.vertexIds;\n\tconst a0 = aList[0];\n\tconst a1 = aList[1];\n\tconst a2 = aList[2];\n\n\tconst bList = b.vertexIds;\n\tconst shared0 = bList.includes(a0);\n\tconst shared1 = bList.includes(a1);\n\tconst shared2 = bList.includes(a2);\n\n\t// it seems that we shouldn't have an a and b with <2 shared vertices here unless there's a bug\n\t// in the neighbor identification code, or perhaps a malformed input geometry; 3 shared vertices\n\t// is a kind of embarrassing but possible geometry we should handle\n\tif (shared0 && shared1 && shared2) {\n\t\treturn Array.from(aList);\n\t} else if (shared0 && shared1) {\n\t\treturn [a0, a1];\n\t} else if (shared1 && shared2) {\n\t\treturn [a1, a2];\n\t} else if (shared0 && shared2) {\n\t\treturn [a2, a0]; // this ordering will affect the string pull algorithm later, not clear if significant\n\t} else {\n\t\tconsole.warn(\n\t\t\t'Error processing navigation mesh neighbors; neighbors with <2 shared vertices found.'\n\t\t);\n\t\treturn [];\n\t}\n}\n\nfunction roundNumber(value, decimals) {\n\tconst factor = Math.pow(10, decimals);\n\treturn Math.round(value * factor) / factor;\n}"
  },
  {
    "path": "examples/jsm/objects/AxisHelper.js",
    "content": "import {\n\tAttribute,\n\tBuffer,\n\tColor3,\n\tGeometry,\n\tLineMaterial,\n\tMesh,\n\tVERTEX_COLOR\n} from 't3d';\n\nclass AxisHelper extends Mesh {\n\n\tconstructor(size = 1) {\n\t\tconst vertices = [\n\t\t\t0, 0, 0, size, 0, 0,\n\t\t\t0, 0, 0, 0, size, 0,\n\t\t\t0, 0, 0, 0, 0, size\n\t\t];\n\n\t\tconst colors = [\n\t\t\t1, 0, 0, 1, 1, 0.6, 0, 1,\n\t\t\t0, 1, 0, 1, 0.6, 1, 0, 1,\n\t\t\t0, 0, 1, 1, 0, 0.6, 1, 1\n\t\t];\n\n\t\tconst geometry = new Geometry();\n\t\tgeometry.addAttribute('a_Position', new Attribute(new Buffer(new Float32Array(vertices), 3)));\n\t\tgeometry.addAttribute('a_Color', new Attribute(new Buffer(new Float32Array(colors), 4)));\n\n\t\t// Skip update bounding box\n\t\t// Because we may not want to consider the helper's bounding box\n\t\tgeometry.computeBoundingSphere();\n\n\t\tconst material = new LineMaterial();\n\t\tmaterial.vertexColors = VERTEX_COLOR.RGBA;\n\n\t\tsuper(geometry, material);\n\t}\n\n\tsetColors(xAxisColor, yAxisColor, zAxisColor) {\n\t\tconst array = this.geometry.attributes.a_Color.buffer.array;\n\n\t\t_col_1.setHex(xAxisColor);\n\t\t_col_1.toArray(array, 0);\n\t\t_col_1.toArray(array, 3);\n\n\t\t_col_1.setHex(yAxisColor);\n\t\t_col_1.toArray(array, 6);\n\t\t_col_1.toArray(array, 9);\n\n\t\t_col_1.setHex(zAxisColor);\n\t\t_col_1.toArray(array, 12);\n\t\t_col_1.toArray(array, 15);\n\n\t\tthis.geometry.attributes.a_Color.buffer.version++;\n\n\t\treturn this;\n\t}\n\n\tdispose() {\n\t\tthis.geometry.dispose();\n\t\tthis.material.dispose();\n\t}\n\n}\n\nAxisHelper.prototype.isAxisHelper = true;\n\nconst _col_1 = new Color3();\n\nexport { AxisHelper };"
  },
  {
    "path": "examples/jsm/objects/Background.js",
    "content": "import {\n\tQuaternion,\n\tEuler,\n\tPlaneGeometry,\n\tMesh,\n\tShaderMaterial\n} from 't3d';\nimport { GeometryUtils } from '../geometries/GeometryUtils.js';\n\nclass Background extends Mesh {\n\n\tconstructor(texture = null, layout = BACKGROUND_LAYOUT.Fill, screenAspect = 1, textureAspect = 1) {\n\t\tconst geometry = new PlaneGeometry(2, 2);\n\t\tGeometryUtils.applyMatrix4(geometry, _mat4, true);\n\n\t\tconst material = new ShaderMaterial(BackgroundShader);\n\n\t\tsuper(geometry, material);\n\n\t\tthis.frustumCulled = false;\n\n\t\tthis.material.diffuseMap = texture;\n\t\tthis._layout = layout;\n\t\tthis._screenAspect = screenAspect;\n\t\tthis._textureAspect = textureAspect;\n\t\tthis._update();\n\t}\n\n\tget gamma() {\n\t\treturn this.material.defines.GAMMA;\n\t}\n\n\tset gamma(value) {\n\t\tthis.material.defines.GAMMA = value;\n\t\tthis.material.needsUpdate = true;\n\t}\n\n\tget texture() {\n\t\treturn this.material.diffuseMap;\n\t}\n\n\tset texture(value) {\n\t\tif (value.isTexture2D) {\n\t\t\tthis.material.diffuseMap = value;\n\t\t\tthis.material.needsUpdate = true;\n\t\t} else {\n\t\t\tconsole.error('Background: texture must be a Texture2D');\n\t\t}\n\t}\n\n\tset layout(type) {\n\t\tthis._layout = type;\n\t\tthis._update();\n\t}\n\n\tget layout() {\n\t\treturn this._layout;\n\t}\n\n\tset textureAspect(aspect) {\n\t\tthis._textureAspect = aspect;\n\t\tthis._update();\n\t}\n\n\tget textureAspect() {\n\t\treturn this._textureAspect;\n\t}\n\n\tset screenAspect(aspect) {\n\t\tthis._screenAspect = aspect;\n\t\tthis._update();\n\t}\n\n\tget screenAspect() {\n\t\treturn this._screenAspect;\n\t}\n\n\t_fill() {\n\t\tthis.material.diffuseMapTransform.setUvTransform(0, 0, 1, 1, 0, 0, 0);\n\t}\n\n\t_contain() {\n\t\tconst textureAspect = this._textureAspect, screenAspect = this._screenAspect;\n\n\t\tlet repeatX, repeatY, offsetX, offsetY;\n\n\t\tif (textureAspect > screenAspect) {\n\t\t\trepeatX = 1;\n\t\t\trepeatY = textureAspect / screenAspect;\n\n\t\t\toffsetX = 0;\n\t\t\toffsetY = (1 - repeatY) / 2;\n\t\t} else {\n\t\t\trepeatX = screenAspect / textureAspect;\n\t\t\trepeatY = 1;\n\n\t\t\toffsetX = (1 - repeatX) / 2;\n\t\t\toffsetY = 0;\n\t\t}\n\n\t\tthis.material.diffuseMapTransform.setUvTransform(offsetX, offsetY, repeatX, repeatY, 0, 0, 0);\n\t}\n\n\t_cover() {\n\t\tconst textureAspect = this._textureAspect, screenAspect = this._screenAspect;\n\n\t\tlet repeatX, repeatY, offsetX, offsetY;\n\n\t\tif (textureAspect > screenAspect) {\n\t\t\trepeatX = screenAspect / textureAspect;\n\t\t\trepeatY = 1;\n\n\t\t\toffsetX = (1 - repeatX) / 2;\n\t\t\toffsetY = 0;\n\t\t} else {\n\t\t\trepeatX = 1;\n\t\t\trepeatY = textureAspect / screenAspect;\n\n\t\t\toffsetX = 0;\n\t\t\toffsetY = (1 - repeatY) / 2;\n\t\t}\n\n\t\tthis.material.diffuseMapTransform.setUvTransform(offsetX, offsetY, repeatX, repeatY, 0, 0, 0);\n\t}\n\n\t_update() {\n\t\tif (!this.texture) return;\n\n\t\tswitch (this._layout) {\n\t\t\tcase BACKGROUND_LAYOUT.Fill:\n\t\t\t\tthis._fill();\n\t\t\t\tbreak;\n\t\t\tcase BACKGROUND_LAYOUT.Contain:\n\t\t\t\tthis._contain();\n\t\t\t\tbreak;\n\t\t\tcase BACKGROUND_LAYOUT.Cover:\n\t\t\t\tthis._cover();\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n}\n\nBackground.prototype.isBackground = true;\n\nconst _mat4 = new Quaternion().setFromEuler(new Euler(Math.PI / 2, 0, 0)).toMatrix4();\n\nconst BACKGROUND_LAYOUT = {\n\tFill: 'fill',\n\tContain: 'contain',\n\tCover: 'cover'\n};\n\nconst BackgroundShader = {\n\tname: 'background',\n\tdefines: {\n\t\t'GAMMA': false\n\t},\n\tuniforms: {},\n\tvertexShader: `\n        attribute vec2 a_Uv;\n        attribute vec3 a_Position;\n\n        uniform mat3 uvTransform;\n\n        varying vec2 v_Uv;\n\n        void main() {\n            v_Uv = (uvTransform * vec3(a_Uv, 1.)).xy;\n            gl_Position = vec4(a_Position.xy, 1.0, 1.0);\n        }\n    `,\n\tfragmentShader: `\n\t\tuniform sampler2D diffuseMap;\n\n\t\tvarying vec2 v_Uv;\n\n\t\tvoid main() {\n\t\t\tgl_FragColor = mapTexelToLinear(texture2D(diffuseMap, v_Uv));\n\n\t\t\t#ifdef GAMMA\n\t\t\t\t#include <encodings_frag>\n\t\t\t#endif\n\t\t}`\n};\n\nexport { Background, BACKGROUND_LAYOUT, BackgroundShader };"
  },
  {
    "path": "examples/jsm/objects/BatchedMesh.js",
    "content": "import { Mesh, Geometry, Attribute, Buffer, Box3, Sphere, Matrix4, Texture2D, PIXEL_FORMAT, PIXEL_TYPE, TEXTURE_FILTER, Frustum, Vector3, Color4, MathUtils } from 't3d';\n\n/**\n * A special version of a mesh with multi draw batch rendering support. Use\n * this class if you have to render a large number of objects with the same\n * material but with different geometries or world transformations. The usage of\n * `BatchedMesh` will help you to reduce the number of draw calls and thus improve the overall\n * rendering performance in your application.\n * reference: https://github.com/mrdoob/three.js/blob/dev/examples/jsm/objects/BatchedMesh.js\n * @extends Mesh\n */\nclass BatchedMesh extends Mesh {\n\n\t/**\n\t * Constructs a new batched mesh.\n\t * @param {number} maxInstanceCount - The maximum number of individual instances planned to be added and rendered.\n\t * @param {number} maxVertexCount - The maximum number of vertices to be used by all unique geometries.\n\t * @param {number} maxIndexCount - The maximum number of indices to be used by all unique geometries.\n\t * @param {Material} material - The mesh material.\n\t */\n\tconstructor(maxInstanceCount, maxVertexCount, maxIndexCount, material) {\n\t\tsuper(new Geometry(), [material]);\n\n\t\t/**\n\t\t * When set to `true`, the individual objects of a batch are frustum culled.\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.perObjectFrustumCulled = true;\n\n\t\t/**\n\t\t * When set to `true`, the individual objects of a batch are sorted to improve overdraw-related artifacts.\n\t\t * If the material is marked as \"transparent\" objects are rendered back to front and if not then they are\n\t\t * rendered front to back.\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.sortObjects = true;\n\n\t\t/**\n\t\t * The bounding box of the batched mesh. Can be computed via {@link BatchedMesh#computeBoundingBox}.\n\t\t * @type {Box3}\n\t\t * @default Box3()\n\t\t */\n\t\tthis.boundingBox = new Box3();\n\n\t\t/**\n\t\t * The bounding sphere of the batched mesh. Can be computed via {@link BatchedMesh#computeBoundingSphere}.\n\t\t * @type {Sphere}\n\t\t * @default Sphere()\n\t\t */\n\t\tthis.boundingSphere = new Sphere();\n\n\t\t/**\n\t\t * Takes a sort a function that is run before render. The function takes a list of instances to\n\t\t * sort and a camera. The objects in the list include a \"z\" field to perform a depth-ordered\n\t\t * sort with.\n\t\t * @type {Function|null}\n\t\t * @default null\n\t\t */\n\t\tthis.customSort = null;\n\n\t\t// stores visible, active, and geometry id per instance and reserved buffer ranges for geometries\n\t\tthis._instanceInfo = [];\n\t\tthis._geometryInfo = [];\n\n\t\t// instance, geometry ids that have been set as inactive, and are available to be overwritten\n\t\tthis._availableInstanceIds = [];\n\t\tthis._availableGeometryIds = [];\n\n\t\t// used to track where the next point is that geometry should be inserted\n\t\tthis._nextIndexStart = 0;\n\t\tthis._nextVertexStart = 0;\n\n\t\t// flags\n\t\tthis._visibilityChanged = true;\n\t\tthis._geometryInitialized = false;\n\n\t\t// cached user options\n\t\tthis._maxInstanceCount = maxInstanceCount;\n\t\tthis._maxVertexCount = maxVertexCount;\n\t\tthis._maxIndexCount = maxIndexCount;\n\n\t\t// init geometry\n\t\tthis.geometry.groups = [{\n\t\t\tmultiDrawStarts: new Int32Array(maxInstanceCount),\n\t\t\tmultiDrawCounts: new Int32Array(maxInstanceCount),\n\t\t\tmultiDrawCount: 0,\n\t\t\tmaterialIndex: 0\n\t\t}];\n\n\t\t// init material\n\t\tmaterial.uniforms.batchingTexture = new BatchingTexture(maxInstanceCount);\n\t\tmaterial.uniforms.batchingIdTexture = new BatchingIdTexture(maxInstanceCount);\n\t}\n\n\t/**\n\t * The maximum number of individual instances that can be stored in the batch.\n\t * @type {number}\n\t * @readonly\n\t */\n\tget maxInstanceCount() {\n\t\treturn this._maxInstanceCount;\n\t}\n\n\t/**\n\t * The instance count.\n\t * @type {number}\n\t * @readonly\n\t */\n\tget instanceCount() {\n\t\treturn this._instanceInfo.length - this._availableInstanceIds.length;\n\t}\n\n\t/**\n\t * The number of unused vertices.\n\t * @type {number}\n\t * @readonly\n\t */\n\tget unusedVertexCount() {\n\t\treturn this._maxVertexCount - this._nextVertexStart;\n\t}\n\n\t/**\n\t * The number of unused indices.\n\t * @type {number}\n\t * @readonly\n\t */\n\tget unusedIndexCount() {\n\t\treturn this._maxIndexCount - this._nextIndexStart;\n\t}\n\n\t/**\n\t * Adds the given geometry to the batch and returns the associated\n\t * geometry id referring to it to be used in other functions.\n\t * @param {Geometry} geometry - The geometry to add.\n\t * @param {number} [reservedVertexCount=-1] - Optional parameter specifying the amount of\n\t * vertex buffer space to reserve for the added geometry. This is necessary if it is planned\n\t * to set a new geometry at this index at a later time that is larger than the original geometry.\n\t * Defaults to the length of the given geometry vertex buffer.\n\t * @param {number} [reservedIndexCount=-1] - Optional parameter specifying the amount of index\n\t * buffer space to reserve for the added geometry. This is necessary if it is planned to set a\n\t * new geometry at this index at a later time that is larger than the original geometry. Defaults to\n\t * the length of the given geometry index buffer.\n\t * @returns {number} The geometry ID, or -1 on failure.\n\t */\n\taddGeometry(geometry, reservedVertexCount = -1, reservedIndexCount = -1) {\n\t\tthis._initializeGeometry(geometry);\n\n\t\tif (!this._validateGeometry(geometry)) {\n\t\t\treturn -1;\n\t\t}\n\n\t\treservedVertexCount = reservedVertexCount === -1 ? geometry.attributes.a_Position.buffer.count : reservedVertexCount;\n\t\treservedIndexCount = reservedIndexCount === -1 ? (geometry.index ? geometry.index.buffer.count : 0) : reservedIndexCount;\n\n\t\t// validate space\n\t\tif (this._nextVertexStart + reservedVertexCount > this._maxVertexCount ||\n\t\t\tthis._nextIndexStart + reservedIndexCount > this._maxIndexCount) {\n\t\t\tconsole.error('BatchedMesh: Reserved space request exceeds the maximum buffer size.');\n\t\t\treturn -1;\n\t\t}\n\n\t\tconst hasIndex = !!this.geometry.index;\n\n\t\t// setup geometry info\n\t\tconst geometryInfo = {\n\t\t\tvertexStart: this._nextVertexStart,\n\t\t\tvertexCount: geometry.attributes.a_Position.buffer.count,\n\t\t\treservedVertexCount: reservedVertexCount,\n\n\t\t\tindexStart: hasIndex ? this._nextIndexStart : -1,\n\t\t\tindexCount: hasIndex ? geometry.index.buffer.count : -1,\n\t\t\treservedIndexCount: reservedIndexCount,\n\n\t\t\tdrawStart: -1,\n\t\t\tdrawCount: -1,\n\n\t\t\tboundingBox: new Box3(),\n\t\t\tboundingSphere: new Sphere(),\n\n\t\t\tactive: true\n\t\t};\n\n\t\tlet geometryId;\n\t\tif (this._availableGeometryIds.length > 0) {\n\t\t\t// this._availableGeometryIds.sort(ascIdSort);\n\t\t\tgeometryId = this._availableGeometryIds.shift();\n\t\t\tthis._geometryInfo[geometryId] = geometryInfo;\n\t\t} else {\n\t\t\tgeometryId = this._geometryInfo.length;\n\t\t\tthis._geometryInfo.push(geometryInfo);\n\t\t}\n\n\t\tthis._copyGeometryData(geometry, geometryId);\n\n\t\t// update offsets\n\t\tthis._nextVertexStart += reservedVertexCount;\n\t\tthis._nextIndexStart += reservedIndexCount;\n\n\t\treturn geometryId;\n\t}\n\n\t/**\n\t * Deletes the geometry defined by the given ID from this batch. Any instances referencing\n\t * this geometry will also be removed as a side effect.\n\t * @param {number} geometryId - The ID of the geomtry to remove from the batch.\n\t * @returns {BatchedMesh} A reference to this batched mesh.\n\t */\n\tdeleteGeometry(geometryId) {\n\t\tif (!this._validateGeometryId(geometryId)) {\n\t\t\treturn this;\n\t\t}\n\n\t\tthis._geometryInfo[geometryId].active = false;\n\n\t\tfor (let i = 0; i < this._instanceInfo.length; i++) {\n\t\t\tconst instanceInfo = this._instanceInfo[i];\n\t\t\tif (instanceInfo && instanceInfo.geometryId === geometryId) {\n\t\t\t\tthis.deleteInstance(i);\n\t\t\t}\n\t\t}\n\n\t\tthis._availableGeometryIds.push(geometryId);\n\n\t\tthis._visibilityChanged = true;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Replaces the geometry at the given ID with the provided geometry. Throws an error if there\n\t * is not enough space reserved for geometry. Calling this will change all instances that are\n\t * rendering that geometry.\n\t * @param {number} geometryId - The ID of the geomtry that should be replaced with the given geometry.\n\t * @param {Geometry} geometry - The new geometry.\n\t * @returns {number} The geometry ID, or -1 on failure.\n\t */\n\tsetGeometryAt(geometryId, geometry) {\n\t\tif (!this._geometryInfo[geometryId]) {\n\t\t\tconsole.error('BatchedMesh: Maximum geometry count reached.');\n\t\t\treturn -1;\n\t\t}\n\n\t\tif (!this._validateGeometry(geometry)) {\n\t\t\treturn -1;\n\t\t}\n\n\t\tconst batchGeometry = this.geometry;\n\t\tconst hasIndex = !!batchGeometry.index;\n\t\tconst srcIndex = geometry.index;\n\t\tconst geometryInfo = this._geometryInfo[geometryId];\n\t\tconst srcVertexCount = geometry.attributes.a_Position.buffer.count;\n\t\tconst srcIndexCount = hasIndex ? srcIndex.buffer.count : -1;\n\t\tif (\n\t\t\thasIndex &&\n\t\t\tsrcIndexCount > geometryInfo.reservedIndexCount ||\n\t\t\tsrcVertexCount > geometryInfo.reservedVertexCount\n\t\t) {\n\t\t\tconsole.error('BatchedMesh: Reserved space not large enough for provided geometry.');\n\t\t\treturn -1;\n\t\t}\n\n\t\t// update geometry info\n\t\tgeometryInfo.vertexCount = srcVertexCount;\n\t\tgeometryInfo.indexCount = srcIndexCount;\n\n\t\tthis._copyGeometryData(geometry, geometryId);\n\n\t\tthis._visibilityChanged = true;\n\n\t\treturn geometryId;\n\t}\n\n\t/**\n\t * Get the range representing the subset of triangles related to the attached geometry,\n\t * indicating the starting offset and count, or `null` if invalid.\n\t * @param {number} geometryId - The id of the geometry to get the range of.\n\t * @param {object} [target] - The target object that is used to store the method's result.\n\t * @returns {{\n\t * \tvertexStart:number,vertexCount:number,reservedVertexCount:number,\n\t * \tindexStart:number,indexCount:number,reservedIndexCount:number,\n\t * \tdrawStart:number,drawCount:number\n\t * }|null} The result object with range data.\n\t */\n\tgetGeometryRangeAt(geometryId, target = {}) {\n\t\tif (!this._validateGeometryId(geometryId)) {\n\t\t\treturn null;\n\t\t}\n\n\t\tconst geometryInfo = this._geometryInfo[geometryId];\n\n\t\ttarget.vertexStart = geometryInfo.vertexStart;\n\t\ttarget.vertexCount = geometryInfo.vertexCount;\n\t\ttarget.reservedVertexCount = geometryInfo.reservedVertexCount;\n\t\ttarget.indexStart = geometryInfo.indexStart;\n\t\ttarget.indexCount = geometryInfo.indexCount;\n\t\ttarget.reservedIndexCount = geometryInfo.reservedIndexCount;\n\t\ttarget.drawStart = geometryInfo.drawStart;\n\t\ttarget.drawCount = geometryInfo.drawCount;\n\n\t\treturn target;\n\t}\n\n\t/**\n\t * Adds a new instance to the batch using the geometry of the given ID and returns\n\t * a new id referring to the new instance to be used by other functions.\n\t * @param {number} geometryId - The ID of a previously added geometry via {@link BatchedMesh#addGeometry}.\n\t * @returns {number} The instance ID, or -1 on failure.\n\t */\n\taddInstance(geometryId) {\n\t\tif (!this._validateGeometryId(geometryId)) {\n\t\t\treturn -1;\n\t\t}\n\n\t\tconst availableInstanceIds = this._availableInstanceIds;\n\n\t\t// If instance count exceeds max instance count, return error\n\t\tif ((this._instanceInfo.length >= this._maxInstanceCount) && availableInstanceIds.length === 0) {\n\t\t\tconsole.error('BatchedMesh: Maximum item count reached.');\n\t\t\treturn -1;\n\t\t}\n\n\t\tconst instanceInfo = {\n\t\t\tgeometryId: geometryId,\n\t\t\tvisible: true,\n\t\t\tactive: true\n\t\t};\n\n\t\tlet instanceId;\n\t\tif (availableInstanceIds.length > 0) {\n\t\t\t// availableInstanceIds.sort(ascIdSort);\n\t\t\tinstanceId = availableInstanceIds.shift();\n\t\t\tthis._instanceInfo[instanceId] = instanceInfo;\n\t\t} else {\n\t\t\tinstanceId = this._instanceInfo.length;\n\t\t\tthis._instanceInfo.push(instanceInfo);\n\t\t}\n\n\t\tconst batchingTexture = this.material[0].uniforms.batchingTexture;\n\t\tbatchingTexture.setInstanceData(instanceId, _mat4_1.identity());\n\n\t\tconst batchingColorTexture = this.material[0].uniforms.batchingColorTexture;\n\t\tif (batchingColorTexture) {\n\t\t\tbatchingColorTexture.setInstanceData(instanceId, _whiteColor);\n\t\t}\n\n\t\tthis._visibilityChanged = true;\n\n\t\treturn instanceId;\n\t}\n\n\t/**\n\t * Deletes an existing instance from the batch using the given ID.\n\t * @param {number} instanceId - The ID of the instance to remove from the batch.\n\t * @returns {BatchedMesh} A reference to this batched mesh.\n\t */\n\tdeleteInstance(instanceId) {\n\t\tif (!this._validateInstanceId(instanceId)) {\n\t\t\treturn this;\n\t\t}\n\n\t\tthis._instanceInfo[instanceId].active = false;\n\t\tthis._availableInstanceIds.push(instanceId);\n\t\tthis._visibilityChanged = true;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the given local transformation matrix to the defined instance.\n\t * Negatively scaled matrices are not supported.\n\t * @param {number} instanceId - The ID of an instance to set the matrix of.\n\t * @param {Matrix4} matrix - A 4x4 matrix representing the local transformation of a single instance.\n\t * @returns {BatchedMesh} A reference to this batched mesh.\n\t */\n\tsetMatrixAt(instanceId, matrix) {\n\t\tif (!this._validateInstanceId(instanceId)) {\n\t\t\treturn this;\n\t\t}\n\n\t\tconst batchingTexture = this.material[0].uniforms.batchingTexture;\n\t\tbatchingTexture.setInstanceData(instanceId, matrix);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Returns the local transformation matrix of the defined instance.\n\t * @param {number} instanceId - The ID of an instance to get the matrix of.\n\t * @param {Matrix4} matrix - The target object that is used to store the method's result.\n\t * @returns {Matrix4|null} The instance's local transformation matrix.\n\t */\n\tgetMatrixAt(instanceId, matrix) {\n\t\tif (!this._validateInstanceId(instanceId)) {\n\t\t\treturn null;\n\t\t}\n\n\t\tconst batchingTexture = this.material[0].uniforms.batchingTexture;\n\t\tbatchingTexture.getInstanceData(instanceId, matrix);\n\n\t\treturn matrix;\n\t}\n\n\t/**\n\t * Sets the given color to the defined instance.\n\t * @param {number} instanceId - The ID of an instance to set the color of.\n\t * @param {Color3|Color4} color - The color to set the instance to.\n\t * @returns {BatchedMesh} A reference to this batched mesh.\n\t */\n\tsetColorAt(instanceId, color) {\n\t\tif (!this._validateInstanceId(instanceId)) {\n\t\t\treturn this;\n\t\t}\n\n\t\tlet batchingColorTexture = this.material[0].uniforms.batchingColorTexture;\n\n\t\tif (!batchingColorTexture) {\n\t\t\tbatchingColorTexture = new BatchingColorTexture(this._maxInstanceCount);\n\t\t\tthis.material[0].uniforms.batchingColorTexture = batchingColorTexture;\n\t\t\tthis.material[0].defines.USE_BATCHING_COLOR = true;\n\t\t\tthis.material[0].needsUpdate = true;\n\t\t}\n\n\t\tbatchingColorTexture.setInstanceData(instanceId, color);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Returns the color of the defined instance.\n\t * @param {number} instanceId - The ID of an instance to get the color of.\n\t * @param {Color3|Color4} color - The target object that is used to store the method's result.\n\t * @returns {Color3|Color4|null} The instance's color.\n\t */\n\tgetColorAt(instanceId, color) {\n\t\tif (!this._validateInstanceId(instanceId)) {\n\t\t\treturn null;\n\t\t}\n\n\t\tconst batchingColorTexture = this.material[0].uniforms.batchingColorTexture;\n\t\tif (!batchingColorTexture) {\n\t\t\treturn null;\n\t\t}\n\n\t\tbatchingColorTexture.getInstanceData(instanceId, color);\n\n\t\treturn color;\n\t}\n\n\t/**\n\t * Sets the visibility of the instance.\n\t * @param {number} instanceId - The id of the instance to set the visibility of.\n\t * @param {boolean} visible - Whether the instance is visible or not.\n\t * @returns {BatchedMesh} A reference to this batched mesh.\n\t */\n\tsetVisibleAt(instanceId, visible) {\n\t\tif (!this._validateInstanceId(instanceId)) {\n\t\t\treturn this;\n\t\t}\n\n\t\tconst instanceInfo = this._instanceInfo[instanceId];\n\t\tif (instanceInfo.visible === visible) {\n\t\t\treturn this;\n\t\t}\n\n\t\tinstanceInfo.visible = visible;\n\t\tthis._visibilityChanged = true;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Returns the visibility state of the defined instance.\n\t * @param {number} instanceId - The ID of an instance to get the visibility state of.\n\t * @returns {boolean} Whether the instance is visible or not.\n\t */\n\tgetVisibleAt(instanceId) {\n\t\tif (!this._validateInstanceId(instanceId)) {\n\t\t\treturn false;\n\t\t}\n\n\t\treturn this._instanceInfo[instanceId].visible;\n\t}\n\n\t/**\n\t * Sets the geometry ID of the instance at the given index.\n\t * @param {number} instanceId - The ID of the instance to set the geometry ID of.\n\t * @param {number} geometryId - The geometry ID to be use by the instance.\n\t * @returns {BatchedMesh} A reference to this batched mesh.\n\t */\n\tsetGeometryIdAt(instanceId, geometryId) {\n\t\tif (!this._validateInstanceId(instanceId)) {\n\t\t\treturn this;\n\t\t}\n\n\t\tif (!this._validateGeometryId(geometryId)) {\n\t\t\treturn this;\n\t\t}\n\n\t\tthis._instanceInfo[instanceId].geometryId = geometryId;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Returns the geometry ID of the defined instance.\n\t * @param {number} instanceId - The ID of an instance to get the geometry ID of.\n\t * @returns {number} The instance's geometry ID, or -1 if invalid.\n\t */\n\tgetGeometryIdAt(instanceId) {\n\t\tif (!this._validateInstanceId(instanceId)) {\n\t\t\treturn -1;\n\t\t}\n\n\t\treturn this._instanceInfo[instanceId].geometryId;\n\t}\n\n\t/**\n\t * Returns the bounding box of the instance at the given index.\n\t * @param {number} instanceId - The ID of the instance to return the bounding box for.\n\t * @param {Box3} target - The target object that is used to store the method's result.\n\t * @returns {Box3|null} The instance's bounding box. Returns `null` if no geometry has been found for the given ID.\n\t */\n\tgetBoundingBoxAt(instanceId, target) {\n\t\tif (!this._validateInstanceId(instanceId)) {\n\t\t\treturn null;\n\t\t}\n\n\t\tconst geometryId = this._instanceInfo[instanceId].geometryId;\n\n\t\tif (!this._validateGeometryId(geometryId)) {\n\t\t\treturn null;\n\t\t}\n\n\t\tconst geometryInfo = this._geometryInfo[geometryId];\n\n\t\tconst batchingTexture = this.material[0].uniforms.batchingTexture;\n\t\tbatchingTexture.getInstanceData(instanceId, _mat4_1);\n\n\t\treturn target.copy(geometryInfo.boundingBox).applyMatrix4(_mat4_1);\n\t}\n\n\t/**\n\t * Returns the bounding sphere of the instance at the given index.\n\t * @param {number} instanceId - The ID of the instance to return the bounding sphere for.\n\t * @param {Sphere} target - The target object that is used to store the method's result.\n\t * @returns {Sphere|null} The instance's bounding sphere. Returns `null` if no geometry has been found for the given ID.\n\t */\n\tgetBoundingSphereAt(instanceId, target) {\n\t\tif (!this._validateInstanceId(instanceId)) {\n\t\t\treturn null;\n\t\t}\n\n\t\tconst geometryId = this._instanceInfo[instanceId].geometryId;\n\n\t\tif (!this._validateGeometryId(geometryId)) {\n\t\t\treturn null;\n\t\t}\n\n\t\tconst geometryInfo = this._geometryInfo[geometryId];\n\n\t\tconst batchingTexture = this.material[0].uniforms.batchingTexture;\n\t\tbatchingTexture.getInstanceData(instanceId, _mat4_1);\n\n\t\treturn target.copy(geometryInfo.boundingSphere).applyMatrix4(_mat4_1);\n\t}\n\n\t/**\n\t * Resizes the available space in the batch's vertex and index buffer attributes to the provided sizes.\n\t * If the provided arguments shrink the geometry buffers but there is not enough unused space at the\n\t * end of the geometry attributes then an error is thrown.\n\t * @param {number} maxVertexCount - The maximum number of vertices to be used by all unique geometries to resize to.\n\t * @param {number} maxIndexCount - The maximum number of indices to be used by all unique geometries to resize to.\n\t */\n\tsetGeometrySize(maxVertexCount, maxIndexCount) {\n\t\tif (maxVertexCount < this._nextVertexStart || maxIndexCount < this._nextIndexStart) {\n\t\t\tconsole.error('BatchedMesh: New size is too small for existing geometry.');\n\t\t\treturn;\n\t\t}\n\n\t\t// dispose of the previous geometry\n\t\tconst oldGeometry = this.geometry;\n\t\toldGeometry.dispose();\n\n\t\t// recreate the geometry needed based on the previous variant\n\t\tthis._maxVertexCount = maxVertexCount;\n\t\tthis._maxIndexCount = maxIndexCount;\n\n\t\tif (this._geometryInitialized) {\n\t\t\tthis._geometryInitialized = false;\n\t\t\tthis.geometry = new Geometry();\n\t\t\tthis.geometry.groups = oldGeometry.groups;\n\t\t\tthis._initializeGeometry(oldGeometry);\n\t\t}\n\n\t\t// copy data from the previous geometry\n\t\tconst geometry = this.geometry;\n\t\tif (oldGeometry.index) {\n\t\t\tcopyArrayContents(oldGeometry.index.buffer.array, geometry.index.buffer.array);\n\t\t}\n\n\t\tfor (const name in oldGeometry.attributes) {\n\t\t\tcopyArrayContents(oldGeometry.attributes[name].buffer.array, geometry.attributes[name].buffer.array);\n\t\t}\n\t}\n\n\t/**\n\t * Resizes the necessary buffers to support the provided number of instances.\n\t * If the provided arguments shrink the number of instances but there are not enough\n\t * unused Ids at the end of the list then an error is thrown.\n\t * @param {number} maxInstanceCount - The max number of individual instances that can be added and rendered by the batch.\n\t */\n\tsetInstanceCount(maxInstanceCount) {\n\t\tif (maxInstanceCount === this._maxInstanceCount) {\n\t\t\treturn;\n\t\t}\n\n\t\t// shrink the available instances as much as possible\n\t\tconst availableInstanceIds = this._availableInstanceIds;\n\t\tconst instanceInfo = this._instanceInfo;\n\t\tavailableInstanceIds.sort(ascIdSort);\n\t\twhile (availableInstanceIds[availableInstanceIds.length - 1] === instanceInfo.length) {\n\t\t\tinstanceInfo.pop();\n\t\t\tavailableInstanceIds.pop();\n\t\t}\n\n\t\tif (maxInstanceCount < instanceInfo.length) {\n\t\t\tconsole.error(`BatchedMesh: Instance ids outside the range ${maxInstanceCount} are being used. Cannot shrink instance count.`);\n\t\t\treturn;\n\t\t}\n\n\t\t// copy the multi draw counts\n\t\tconst multiDrawCounts = new Int32Array(maxInstanceCount);\n\t\tconst multiDrawStarts = new Int32Array(maxInstanceCount);\n\t\tconst geometryGroup = this.geometry.groups[0];\n\t\tcopyArrayContents(geometryGroup.multiDrawCounts, multiDrawCounts);\n\t\tcopyArrayContents(geometryGroup.multiDrawStarts, multiDrawStarts);\n\n\t\tgeometryGroup.multiDrawCounts = multiDrawCounts;\n\t\tgeometryGroup.multiDrawStarts = multiDrawStarts;\n\n\t\tthis._maxInstanceCount = maxInstanceCount;\n\n\t\tconst batchingTexture = this.material[0].uniforms.batchingTexture;\n\t\tconst batchingData = batchingTexture.image.data;\n\t\tbatchingTexture.setInstanceCount(maxInstanceCount);\n\t\tcopyArrayContents(batchingData, batchingTexture.image.data);\n\t\tbatchingTexture.version++;\n\n\t\tconst batchingIdTexture = this.material[0].uniforms.batchingIdTexture;\n\t\tconst batchingIdData = batchingIdTexture.image.data;\n\t\tbatchingIdTexture.setInstanceCount(maxInstanceCount);\n\t\tcopyArrayContents(batchingIdData, batchingIdTexture.image.data);\n\t\tbatchingIdTexture.version++;\n\n\t\tconst batchingColorTexture = this.material[0].uniforms.batchingColorTexture;\n\t\tif (batchingColorTexture) {\n\t\t\tconst batchingColorData = batchingColorTexture.image.data;\n\t\t\tbatchingColorTexture.setInstanceCount(maxInstanceCount);\n\t\t\tcopyArrayContents(batchingColorData, batchingColorTexture.image.data);\n\t\t\tbatchingColorTexture.version++;\n\t\t}\n\t}\n\n\t/**\n\t * Disposes of the batched mesh and its associated resources.\n\t */\n\tdispose() {\n\t\tthis.geometry.dispose();\n\n\t\tconst material = this.material[0];\n\n\t\tmaterial.uniforms.batchingTexture.dispose();\n\t\tmaterial.uniforms.batchingIdTexture.dispose();\n\n\t\tif (material.uniforms.batchingColorTexture) {\n\t\t\tmaterial.uniforms.batchingColorTexture.dispose();\n\t\t}\n\t}\n\n\t/**\n\t * Updates the batch for rendering\n\t * Performs visibility checks, frustum culling, and sorting if enabled\n\t * @param {Camera} camera - Camera used for frustum culling and sorting\n\t */\n\tupdate(camera) {\n\t\tconst sortObjects = this.sortObjects;\n\t\tconst perObjectFrustumCulled = this.perObjectFrustumCulled;\n\t\tconst visibleChanged = this._visibilityChanged;\n\n\t\t// if visibility has not changed and frustum culling and object sorting is not required\n\t\t// then skip iterating over all items\n\t\tif (!visibleChanged && !sortObjects && !perObjectFrustumCulled) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst geometry = this.geometry;\n\t\tconst material = this.material[0];\n\n\t\tconst index = geometry.index;\n\t\tconst bytesPerElement = index === null ? 1 : index.buffer.array.BYTES_PER_ELEMENT;\n\n\t\tconst instanceInfo = this._instanceInfo;\n\t\tconst geometryInfo = this._geometryInfo;\n\t\tconst batchingIdTexture = material.uniforms.batchingIdTexture;\n\t\tconst indirectData = batchingIdTexture.image.data;\n\n\t\t// prepare the frustum in the local frame\n\t\tif (perObjectFrustumCulled) {\n\t\t\t_mat4_1.multiplyMatrices(camera.projectionMatrix, camera.viewMatrix).multiply(this.worldMatrix);\n\t\t\t_frustum.setFromMatrix(_mat4_1);\n\t\t}\n\n\t\tlet multiDrawCount = 0;\n\n\t\tconst { multiDrawStarts, multiDrawCounts } = geometry.groups[0];\n\n\t\tif (sortObjects) {\n\t\t\t// get the camera position in the local frame\n\t\t\t_mat4_1.copy(this.worldMatrix).invert();\n\t\t\t_vec3_1.setFromMatrixPosition(camera.worldMatrix).applyMatrix4(_mat4_1);\n\t\t\t_vec3_2.set(0, 0, -1).transformDirection(camera.worldMatrix).transformDirection(_mat4_1);\n\n\t\t\tfor (let i = 0, l = instanceInfo.length; i < l; i++) {\n\t\t\t\tif (!instanceInfo[i].active || !instanceInfo[i].visible) continue;\n\n\t\t\t\tthis.getBoundingSphereAt(i, _sphere_1);\n\n\t\t\t\t// determine whether the batched geometry is within the frustum\n\t\t\t\tlet culled = false;\n\t\t\t\tif (perObjectFrustumCulled) {\n\t\t\t\t\tculled = !_frustum.intersectsSphere(_sphere_1);\n\t\t\t\t}\n\n\t\t\t\tif (!culled) {\n\t\t\t\t\t// get the distance from camera used for sorting\n\t\t\t\t\tconst z = _vec3_3.subVectors(_sphere_1.center, _vec3_1).dot(_vec3_2);\n\t\t\t\t\tconst { drawStart, drawCount } = geometryInfo[instanceInfo[i].geometryId];\n\t\t\t\t\t_renderList.push(drawStart, drawCount, z, i);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// sort the draw ranges and prep for rendering\n\t\t\tconst list = _renderList.list;\n\t\t\tconst customSort = this.customSort;\n\t\t\tif (customSort) {\n\t\t\t\tcustomSort.call(this, list, camera);\n\t\t\t} else {\n\t\t\t\tlist.sort(material.transparent ? sortTransparent : sortOpaque);\n\t\t\t}\n\n\t\t\tfor (let i = 0; i < list.length; i++) {\n\t\t\t\tconst item = list[i];\n\t\t\t\tmultiDrawStarts[multiDrawCount] = item.start * bytesPerElement;\n\t\t\t\tmultiDrawCounts[multiDrawCount] = item.count;\n\t\t\t\tindirectData[multiDrawCount] = item.index;\n\t\t\t\tmultiDrawCount++;\n\t\t\t}\n\n\t\t\t_renderList.reset();\n\t\t} else {\n\t\t\tfor (let i = 0, l = instanceInfo.length; i < l; i++) {\n\t\t\t\tif (!instanceInfo[i].active || !instanceInfo[i].visible) continue;\n\n\t\t\t\tlet culled = false;\n\t\t\t\tif (perObjectFrustumCulled) {\n\t\t\t\t\tthis.getBoundingSphereAt(i, _sphere_1);\n\t\t\t\t\tculled = !_frustum.intersectsSphere(_sphere_1);\n\t\t\t\t}\n\n\t\t\t\tif (!culled) {\n\t\t\t\t\tconst { drawStart, drawCount } = geometryInfo[instanceInfo[i].geometryId];\n\t\t\t\t\tmultiDrawStarts[multiDrawCount] = drawStart * bytesPerElement;\n\t\t\t\t\tmultiDrawCounts[multiDrawCount] = drawCount;\n\t\t\t\t\tindirectData[multiDrawCount] = i;\n\t\t\t\t\tmultiDrawCount++;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tbatchingIdTexture.version++;\n\t\tthis._visibilityChanged = false;\n\n\t\tgeometry.groups[0].multiDrawCount = multiDrawCount;\n\t}\n\n\t/**\n\t * Takes a sort a function that is run before render. The function takes a list of instances to\n\t * sort and a camera. The objects in the list include a \"z\" field to perform a depth-ordered sort with.\n\t * @param {Function} func - The custom sort function.\n\t * @returns {BatchedMesh} A reference to this batched mesh.\n\t */\n\tsetCustomSort(func) {\n\t\tthis.customSort = func;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Repacks the sub geometries in [name] to remove any unused space remaining from\n\t * previously deleted geometry, freeing up space to add new geometry.\n\t * @returns {BatchedMesh} A reference to this batched mesh.\n\t */\n\toptimize() {\n\t\t// track the next indices to copy data to\n\t\tlet nextVertexStart = 0;\n\t\tlet nextIndexStart = 0;\n\n\t\t// Iterate over all geometry ranges in order sorted from earliest in the geometry buffer to latest\n\t\t// in the geometry buffer. Because draw range objects can be reused there is no guarantee of their order.\n\t\tconst geometryInfo = this._geometryInfo;\n\t\tconst indices = geometryInfo.map((_, i) => i).sort((a, b) => {\n\t\t\treturn geometryInfo[a].vertexStart - geometryInfo[b].vertexStart;\n\t\t});\n\n\t\tconst geometry = this.geometry;\n\t\tconst hasIndex = !!geometry.index;\n\n\t\tfor (let i = 0; i < this._geometryInfo.length; i++) {\n\t\t\tconst index = indices[i];\n\t\t\tconst geometryInfo = this._geometryInfo[index];\n\t\t\tif (!geometryInfo || !geometryInfo.active) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// if a geometry contains an index buffer then shift it, as well\n\t\t\tif (hasIndex) {\n\t\t\t\tif (geometryInfo.indexStart !== nextIndexStart) {\n\t\t\t\t\tconst { indexStart, vertexStart, reservedIndexCount } = geometryInfo;\n\t\t\t\t\tconst array = geometry.index.buffer.array;\n\n\t\t\t\t\t// shift the index pointers based on how the vertex data will shift\n\t\t\t\t\t// adjusting the index must happen first so the original vertex start value is available\n\t\t\t\t\tconst elementDelta = nextVertexStart - vertexStart;\n\t\t\t\t\tfor (let j = 0; j < reservedIndexCount; j++) {\n\t\t\t\t\t\tarray[nextIndexStart + j] = array[indexStart + j] + elementDelta;\n\t\t\t\t\t}\n\n\t\t\t\t\tupdateBufferRange(geometry.index.buffer, nextIndexStart, reservedIndexCount);\n\n\t\t\t\t\tgeometryInfo.indexStart = nextIndexStart;\n\t\t\t\t}\n\n\t\t\t\tnextIndexStart += geometryInfo.reservedIndexCount;\n\t\t\t}\n\n\t\t\t// if a geometry needs to be moved then copy attribute data to overwrite unused space\n\t\t\tif (geometryInfo.vertexStart !== nextVertexStart) {\n\t\t\t\tconst { vertexStart, reservedVertexCount } = geometryInfo;\n\t\t\t\tconst attributes = geometry.attributes;\n\t\t\t\tfor (const name in attributes) {\n\t\t\t\t\tconst attribute = attributes[name];\n\t\t\t\t\tconst itemSize = attribute.size;\n\t\t\t\t\tconst array = attribute.buffer.array;\n\n\t\t\t\t\tfor (let j = 0; j < reservedVertexCount * itemSize; j++) {\n\t\t\t\t\t\tarray[nextVertexStart * itemSize + j] = array[vertexStart * itemSize + j];\n\t\t\t\t\t}\n\n\t\t\t\t\tupdateBufferRange(attribute.buffer, nextVertexStart * itemSize, reservedVertexCount * itemSize);\n\t\t\t\t}\n\n\t\t\t\tgeometryInfo.vertexStart = nextVertexStart;\n\t\t\t}\n\n\t\t\tnextVertexStart += geometryInfo.reservedVertexCount;\n\t\t\tgeometryInfo.drawStart = hasIndex ? geometryInfo.indexStart : geometryInfo.vertexStart;\n\t\t}\n\n\t\tthis._nextVertexStart = nextVertexStart;\n\t\tthis._nextIndexStart = nextIndexStart;\n\n\t\tthis._visibilityChanged = true;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Computes the bounding box, updating {@link BatchedMesh#boundingBox}.\n\t * Bounding boxes aren't computed by default. They need to be explicitly computed,\n\t * otherwise they are empty.\n\t */\n\tcomputeBoundingBox() {\n\t\tconst boundingBox = this.boundingBox;\n\t\tconst instanceInfo = this._instanceInfo;\n\n\t\tboundingBox.makeEmpty();\n\t\tfor (let i = 0, l = instanceInfo.length; i < l; i++) {\n\t\t\tif (!instanceInfo[i].active) continue;\n\n\t\t\tthis.getBoundingBoxAt(i, _box3_1);\n\n\t\t\tboundingBox.union(_box3_1);\n\t\t}\n\t}\n\n\t/**\n\t * Computes the bounding sphere, updating {@link BatchedMesh#boundingSphere}.\n\t * Bounding spheres aren't computed by default. They need to be explicitly computed,\n\t * otherwise they are empty.\n\t */\n\tcomputeBoundingSphere() {\n\t\tconst boundingSphere = this.boundingSphere;\n\t\tconst instanceInfo = this._instanceInfo;\n\n\t\tboundingSphere.makeEmpty();\n\t\tfor (let i = 0, l = instanceInfo.length; i < l; i++) {\n\t\t\tif (!instanceInfo[i].active) continue;\n\n\t\t\tthis.getBoundingSphereAt(i, _sphere_1);\n\n\t\t\tboundingSphere.union(_sphere_1);\n\t\t}\n\t}\n\n\traycast(ray, intersects) {\n\t\tconst instanceInfo = this._instanceInfo;\n\t\tconst geometryInfoList = this._geometryInfo;\n\t\tconst wolrdMatrix = this.worldMatrix;\n\t\tconst batchGeometry = this.geometry;\n\n\t\t// iterate over each instance\n\t\t_mesh.material = this.material;\n\t\t_mesh.geometry.index = batchGeometry.index;\n\t\t_mesh.geometry.attributes = batchGeometry.attributes;\n\n\t\tfor (let i = 0, il = instanceInfo.length; i < il; i++) {\n\t\t\tif (!instanceInfo[i].active || !instanceInfo[i].visible) continue;\n\n\t\t\tconst geometryInfo = geometryInfoList[instanceInfo[i].geometryId];\n\t\t\t_mesh.geometry.groups[0].start = geometryInfo.drawStart;\n\t\t\t_mesh.geometry.groups[0].count = geometryInfo.drawCount;\n\n\t\t\tthis.getMatrixAt(i, _mesh.worldMatrix).premultiply(wolrdMatrix);\n\t\t\t_mesh.geometry.boundingBox.copy(geometryInfo.boundingBox);\n\t\t\t_mesh.geometry.boundingSphere.copy(geometryInfo.boundingSphere);\n\t\t\t_mesh.raycast(ray, _batchIntersects);\n\n\t\t\t// add batch id to the intersects\n\t\t\tfor (let j = 0, jl = _batchIntersects.length; j < jl; j++) {\n\t\t\t\tconst intersect = _batchIntersects[j];\n\t\t\t\tintersect.object = this;\n\t\t\t\tintersect.batchId = i;\n\t\t\t\tintersects.push(intersect);\n\t\t\t}\n\n\t\t\t_batchIntersects.length = 0;\n\t\t}\n\n\t\t_mesh.material = null;\n\t\t_mesh.geometry.index = null;\n\t\t_mesh.geometry.attributes = {};\n\t\t_mesh.geometry.groups[0].start = 0;\n\t\t_mesh.geometry.groups[0].count = Infinity;\n\t}\n\n\t// Initializes the geometry based on an input geometry\n\t_initializeGeometry(reference) {\n\t\tif (this._geometryInitialized) return;\n\n\t\tconst geometry = this.geometry;\n\t\tconst maxVertexCount = this._maxVertexCount;\n\t\tconst maxIndexCount = this._maxIndexCount;\n\n\t\tfor (const attributeName in reference.attributes) {\n\t\t\tconst srcAttribute = reference.getAttribute(attributeName);\n\n\t\t\tconst { size, normalized, buffer } = srcAttribute;\n\t\t\tconst { array } = buffer;\n\n\t\t\tconst dstArray = new array.constructor(maxVertexCount * size); // splite shared buffer here\n\t\t\tconst dstAttribute = new Attribute(new Buffer(dstArray, size), size, 0, normalized);\n\n\t\t\tgeometry.addAttribute(attributeName, dstAttribute);\n\t\t}\n\n\t\tif (reference.index) {\n\t\t\tconst indexArray = maxVertexCount > 65535 ? new Uint32Array(maxIndexCount) : new Uint16Array(maxIndexCount);\n\t\t\tgeometry.index = new Attribute(new Buffer(indexArray, 1));\n\t\t}\n\n\t\tthis._geometryInitialized = true;\n\t}\n\n\t// Make sure the geometry is compatible with the existing combined geometry attributes\n\t_validateGeometry(geometry) {\n\t\tconst batchGeometry = this.geometry;\n\t\tif (!!batchGeometry.index !== !!geometry.index) {\n\t\t\tconsole.error('BatchedMesh: All geometries must consistently have \"index\"');\n\t\t\treturn false;\n\t\t}\n\n\t\tfor (const attributeName in batchGeometry.attributes) {\n\t\t\tif (!geometry.attributes[attributeName]) {\n\t\t\t\tconsole.error(`BatchedMesh: Added geometry missing \"${attributeName}\". All geometries must have consistent attributes.`);\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tconst srcAttribute = geometry.getAttribute(attributeName);\n\t\t\tconst dstAttribute = batchGeometry.getAttribute(attributeName);\n\n\t\t\tif (srcAttribute.size !== dstAttribute.size || srcAttribute.normalized !== dstAttribute.normalized) {\n\t\t\t\tconsole.error('BatchedMesh: All attributes must have a consistent itemSize and normalized value.');\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\treturn true;\n\t}\n\n\t// Copies geometry data from source to the batch\n\t_copyGeometryData(geometry, geometryId) {\n\t\tconst info = this._geometryInfo[geometryId];\n\t\tconst batchGeometry = this.geometry;\n\n\t\tconst vertexStart = info.vertexStart;\n\t\tconst reservedVertexCount = info.reservedVertexCount;\n\t\tconst indexStart = info.indexStart;\n\t\tconst reservedIndexCount = info.reservedIndexCount;\n\n\t\tfor (const name in geometry.attributes) {\n\t\t\tconst srcAttribute = geometry.attributes[name];\n\t\t\tconst dstAttribute = batchGeometry.attributes[name];\n\n\t\t\tconst itemSize = srcAttribute.size;\n\t\t\tconst vertexCount = srcAttribute.buffer.count;\n\n\t\t\tconst srcOffset = srcAttribute.offset;\n\t\t\tconst srcStride = srcAttribute.buffer.stride;\n\n\t\t\tconst dstArray = dstAttribute.buffer.array;\n\t\t\tconst srcArray = srcAttribute.buffer.array;\n\n\t\t\t// copy attribute data\n\t\t\tfor (let i = 0; i < vertexCount; i++) {\n\t\t\t\tconst dstIndex = (vertexStart + i) * itemSize;\n\t\t\t\tconst srcIndex = i * srcStride + srcOffset;\n\t\t\t\tfor (let j = 0; j < itemSize; j++) {\n\t\t\t\t\tdstArray[dstIndex + j] = srcArray[srcIndex + j];\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// fill the rest in with zeroes\n\t\t\tfor (let i = vertexCount; i < reservedVertexCount; i++) {\n\t\t\t\tconst dstIndex = (vertexStart + i) * itemSize;\n\t\t\t\tfor (let j = 0; j < itemSize; j++) {\n\t\t\t\t\tdstArray[dstIndex + j] = 0;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// update buffer's update range\n\t\t\tupdateBufferRange(dstAttribute.buffer, vertexStart * itemSize, reservedVertexCount * itemSize);\n\t\t}\n\n\t\tif (indexStart !== -1) {\n\t\t\tconst srcIndex = geometry.index;\n\t\t\tconst dstIndex = batchGeometry.index;\n\n\t\t\tconst indexCount = srcIndex.buffer.count;\n\n\t\t\tconst srcOffset = srcIndex.offset;\n\t\t\tconst srcStride = srcIndex.buffer.stride;\n\n\t\t\tconst dstArray = dstIndex.buffer.array;\n\t\t\tconst srcArray = srcIndex.buffer.array;\n\n\t\t\t// copy index data\n\t\t\tfor (let i = 0; i < indexCount; i++) {\n\t\t\t\tconst sourceIndex = i * srcStride + srcOffset;\n\t\t\t\tdstArray[indexStart + i] = srcArray[sourceIndex] + vertexStart;\n\t\t\t}\n\n\t\t\t// fill the rest in with zeroes\n\t\t\tfor (let i = indexCount; i < reservedIndexCount; i++) {\n\t\t\t\tdstArray[indexStart + i] = vertexStart;\n\t\t\t}\n\n\t\t\t// update buffer's update range\n\t\t\tupdateBufferRange(dstIndex.buffer, indexStart, reservedIndexCount);\n\t\t}\n\n\t\tinfo.drawStart = indexStart !== -1 ? indexStart : vertexStart;\n\t\tinfo.drawCount = indexStart !== -1 ? info.indexCount : info.vertexCount;\n\n\t\t// copy bounding volumes\n\t\tinfo.boundingBox.copy(geometry.boundingBox);\n\t\tinfo.boundingSphere.copy(geometry.boundingSphere);\n\t}\n\n\t// Validates the geometry defined by the given ID\n\t_validateGeometryId(geometryId) {\n\t\tconst geometryInfo = this._geometryInfo[geometryId];\n\t\tif (!geometryInfo || !geometryInfo.active) {\n\t\t\tconsole.error(`BatchedMesh: Invalid geometryId ${geometryId}. Geometry is either out of range or has been deleted.`);\n\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t}\n\n\t// Validates the instance defined by the given ID\n\t_validateInstanceId(instanceId) {\n\t\tconst instanceInfo = this._instanceInfo[instanceId];\n\t\tif (!instanceInfo || !instanceInfo.active) {\n\t\t\tconsole.error(`BatchedMesh: Invalid instanceId ${instanceId}. Instance is either out of range or has been deleted.`);\n\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t}\n\n}\n\nconst _vec3_1 = new Vector3();\nconst _vec3_2 = new Vector3();\nconst _vec3_3 = new Vector3();\nconst _mat4_1 = new Matrix4();\nconst _box3_1 = new Box3();\nconst _sphere_1 = new Sphere();\nconst _frustum = new Frustum();\n\nconst _whiteColor = new Color4(1, 1, 1, 1);\n\nconst _mesh = new Mesh(new Geometry(), undefined);\n_mesh.geometry.addGroup(0, 0, 0);\n\nconst _batchIntersects = [];\n\nclass MultiDrawRenderList {\n\n\tconstructor() {\n\t\tthis.index = 0;\n\t\tthis.pool = [];\n\t\tthis.list = [];\n\t}\n\n\tpush(start, count, z, index) {\n\t\tconst pool = this.pool;\n\t\tconst list = this.list;\n\t\tif (this.index >= pool.length) {\n\t\t\tpool.push({\n\t\t\t\tstart: -1,\n\t\t\t\tcount: -1,\n\t\t\t\tz: -1,\n\t\t\t\tindex: -1\n\t\t\t});\n\t\t}\n\n\t\tconst item = pool[this.index];\n\t\tlist.push(item);\n\t\tthis.index++;\n\n\t\titem.start = start;\n\t\titem.count = count;\n\t\titem.z = z;\n\t\titem.index = index;\n\t}\n\n\treset() {\n\t\tthis.list.length = 0;\n\t\tthis.index = 0;\n\t}\n\n}\n\nconst _renderList = new MultiDrawRenderList();\n\n// Sort function to arrange IDs in ascending order\nfunction ascIdSort(a, b) {\n\treturn a - b;\n}\n\n// Sort function for opaque objects (front-to-back)\nfunction sortOpaque(a, b) {\n\treturn a.z - b.z;\n}\n\n// Sort function for transparent objects (back-to-front)\nfunction sortTransparent(a, b) {\n\treturn b.z - a.z;\n}\n\nfunction updateBufferRange(buffer, offset, count) {\n\tconst updateRange = buffer.updateRange;\n\n\tif (updateRange.count === -1) {\n\t\tupdateRange.offset = offset;\n\t\tupdateRange.count = count;\n\t\treturn;\n\t}\n\n\tconst start = updateRange.offset;\n\tconst end = start + updateRange.count;\n\tupdateRange.offset = Math.min(start, offset);\n\tupdateRange.count = Math.max(end, offset + count) - updateRange.offset;\n\n\tbuffer.version++;\n}\n\n// safely copies array contents to a potentially smaller array\nfunction copyArrayContents(src, target) {\n\tif (src.constructor !== target.constructor) {\n\t\t// if arrays are of a different type (eg due to index size increasing) then data must be per-element copied\n\t\tconst len = Math.min(src.length, target.length);\n\t\tfor (let i = 0; i < len; i++) {\n\t\t\ttarget[i] = src[i];\n\t\t}\n\t} else {\n\t\tconst len = Math.min(src.length, target.length);\n\t\ttarget.set(new src.constructor(src.buffer, 0, len));\n\t}\n}\n\nclass BatchingTexture extends Texture2D {\n\n\tconstructor(maxInstanceCount) {\n\t\tsuper();\n\t\tthis.format = PIXEL_FORMAT.RGBA;\n\t\tthis.type = PIXEL_TYPE.FLOAT;\n\t\tthis.magFilter = TEXTURE_FILTER.NEAREST;\n\t\tthis.minFilter = TEXTURE_FILTER.NEAREST;\n\t\tthis.generateMipmaps = false;\n\t\tthis.flipY = false;\n\t\tthis.setInstanceCount(maxInstanceCount);\n\t}\n\n\tsetInstanceCount(maxInstanceCount) {\n\t\tlet size = MathUtils.nextPowerOfTwoSquareSize(maxInstanceCount * 4); // 4 pixels needed for 1 matrix\n\t\tsize = Math.max(size, 4);\n\n\t\tthis.image = { data: new Float32Array(size * size * 4), width: size, height: size };\n\t}\n\n\tsetInstanceData(instanceId, matrix) {\n\t\tmatrix.toArray(this.image.data, instanceId * 16);\n\t\tthis.version++;\n\t}\n\n\tgetInstanceData(instanceId, matrix) {\n\t\tmatrix.fromArray(this.image.data, instanceId * 16);\n\t}\n\n}\n\nclass BatchingIdTexture extends Texture2D {\n\n\tconstructor(maxInstanceCount) {\n\t\tsuper();\n\t\tthis.format = PIXEL_FORMAT.RED_INTEGER;\n\t\tthis.internalformat = 'R32UI';\n\t\tthis.type = PIXEL_TYPE.UNSIGNED_INT;\n\t\tthis.magFilter = TEXTURE_FILTER.NEAREST;\n\t\tthis.minFilter = TEXTURE_FILTER.NEAREST;\n\t\tthis.generateMipmaps = false;\n\t\tthis.flipY = false;\n\t\tthis.setInstanceCount(maxInstanceCount);\n\t}\n\n\tsetInstanceCount(maxInstanceCount) {\n\t\tlet size = MathUtils.nextPowerOfTwoSquareSize(maxInstanceCount);\n\t\tsize = Math.max(size, 4);\n\n\t\tthis.image = { data: new Uint32Array(size * size), width: size, height: size };\n\t}\n\n}\n\nclass BatchingColorTexture extends Texture2D {\n\n\tconstructor(maxInstanceCount) {\n\t\tsuper();\n\t\tthis.magFilter = TEXTURE_FILTER.NEAREST;\n\t\tthis.minFilter = TEXTURE_FILTER.NEAREST;\n\t\tthis.generateMipmaps = false;\n\t\tthis.flipY = false;\n\t\tthis.setInstanceCount(maxInstanceCount);\n\t}\n\n\tsetInstanceCount(maxInstanceCount) {\n\t\tlet size = MathUtils.nextPowerOfTwoSquareSize(maxInstanceCount);\n\t\tsize = Math.max(size, 4);\n\n\t\tthis.image = { data: new Uint8Array(size * size * 4).fill(255), width: size, height: size };\n\t}\n\n\tsetInstanceData(instanceId, color) {\n\t\tcolor.toArray(this.image.data, instanceId * 4, true);\n\t\tthis.version++;\n\t}\n\n\tgetInstanceData(instanceId, color) {\n\t\tcolor.fromArray(this.image.data, instanceId * 4, true);\n\t}\n\n}\n\nexport { BatchedMesh };"
  },
  {
    "path": "examples/jsm/objects/Box3Helper.js",
    "content": "import {\n\tAttribute,\n\tBuffer,\n\tGeometry,\n\tLineMaterial,\n\tMesh\n} from 't3d';\n\nclass Box3Helper extends Mesh {\n\n\tconstructor(box, color = 0xffff00) {\n\t\tconst indices = new Uint16Array([0, 1, 1, 2, 2, 3, 3, 0, 4, 5, 5, 6, 6, 7, 7, 4, 0, 4, 1, 5, 2, 6, 3, 7]);\n\n\t\tconst positions = [1, 1, 1, -1, 1, 1, -1, -1, 1, 1, -1, 1, 1, 1, -1, -1, 1, -1, -1, -1, -1, 1, -1, -1];\n\n\t\tconst geometry = new Geometry();\n\n\t\tgeometry.setIndex(new Attribute(new Buffer(indices, 1)));\n\n\t\tgeometry.addAttribute('a_Position', new Attribute(new Buffer(new Float32Array(positions), 3)));\n\n\t\t// Skip update bounding box\n\t\t// Because we may not want to consider Box3Helper's bounding box\n\t\tgeometry.computeBoundingSphere();\n\n\t\tconst material = new LineMaterial();\n\t\tmaterial.diffuse.setHex(color);\n\n\t\tsuper(geometry, material);\n\n\t\tthis.box = box;\n\t}\n\n\tupdateMatrix(force) {\n\t\tconst box = this.box;\n\n\t\tbox.getCenter(this.position);\n\n\t\tif (box.isEmpty()) {\n\t\t\tthis.scale.multiplyScalar(0);\n\t\t} else {\n\t\t\tbox.getSize(this.scale);\n\t\t\tthis.scale.multiplyScalar(0.5);\n\t\t}\n\n\t\tsuper.updateMatrix(force);\n\t}\n\n}\n\nBox3Helper.prototype.isBox3Helper = true;\n\nexport { Box3Helper };\n"
  },
  {
    "path": "examples/jsm/objects/BoxHelper.js",
    "content": "import {\n\tAttribute,\n\tBuffer,\n\tGeometry,\n\tLineMaterial,\n\tMesh,\n\tBox3\n} from 't3d';\nimport { SceneUtils } from '../SceneUtils.js';\n\nclass BoxHelper extends Mesh {\n\n\tconstructor(object, color = 0xffff00) {\n\t\tconst indices = new Uint16Array([0, 1, 1, 2, 2, 3, 3, 0, 4, 5, 5, 6, 6, 7, 7, 4, 0, 4, 1, 5, 2, 6, 3, 7]);\n\t\tconst positions = new Float32Array(8 * 3);\n\n\t\tconst geometry = new Geometry();\n\t\tgeometry.setIndex(new Attribute(new Buffer(indices, 1)));\n\t\tgeometry.addAttribute('a_Position', new Attribute(new Buffer(positions, 3)));\n\n\t\tconst material = new LineMaterial();\n\t\tmaterial.diffuse.setHex(color);\n\n\t\tsuper(geometry, material);\n\n\t\tthis.object = object;\n\t\tthis.worldMatrix = this.object.worldMatrix;\n\n\t\tthis.update();\n\t}\n\n\tupdate(object) {\n\t\tif (object !== undefined) {\n\t\t\tconsole.warn('BoxHelper: .update() has no longer arguments.');\n\t\t}\n\n\t\tif (this.object !== undefined) {\n\t\t\tSceneUtils.setBox3FromObject(this.object, this.object, _box3_1);\n\t\t}\n\n\t\tif (_box3_1.isEmpty()) return;\n\n\t\tconst min = _box3_1.min;\n\t\tconst max = _box3_1.max;\n\n\t\tconst position = this.geometry.attributes.a_Position.buffer;\n\t\tconst array = position.array;\n\n\t\tarray[0] = max.x; array[1] = max.y; array[2] = max.z;\n\t\tarray[3] = min.x; array[4] = max.y; array[5] = max.z;\n\t\tarray[6] = min.x; array[7] = min.y; array[8] = max.z;\n\t\tarray[9] = max.x; array[10] = min.y; array[11] = max.z;\n\t\tarray[12] = max.x; array[13] = max.y; array[14] = min.z;\n\t\tarray[15] = min.x; array[16] = max.y; array[17] = min.z;\n\t\tarray[18] = min.x; array[19] = min.y; array[20] = min.z;\n\t\tarray[21] = max.x; array[22] = min.y; array[23] = min.z;\n\n\t\tposition.version++;\n\n\t\t// Skip update bounding box\n\t\t// Because we may not want to consider BoxHelper's bounding box\n\t\tthis.geometry.computeBoundingSphere();\n\t}\n\n\tsetFromObject(object) {\n\t\tthis.object = object;\n\t\tthis.worldMatrix = this.object.worldMatrix;\n\n\t\tthis.update();\n\n\t\treturn this;\n\t}\n\n\tupdateMatrix(force) {\n\t\t// Remove matrix updating\n\t\t// Need decompose worldMatrix to matrix and RST ?\n\n\t\tconst children = this.children;\n\t\tfor (let i = 0, l = children.length; i < l; i++) {\n\t\t\tchildren[i].updateMatrix(force);\n\t\t}\n\t}\n\n\tcopy(source, recursive) {\n\t\tsuper.copy(source, recursive);\n\n\t\tthis.object = source.object;\n\n\t\treturn this;\n\t}\n\n}\n\nBoxHelper.prototype.isBoxHelper = true;\n\nconst _box3_1 = new Box3();\n\nexport { BoxHelper };"
  },
  {
    "path": "examples/jsm/objects/CameraHelper.js",
    "content": "import {\n\tAttribute,\n\tBuffer,\n\tGeometry,\n\tLineMaterial,\n\tMesh,\n\tColor3,\n\tMatrix4,\n\tVector3,\n\tVERTEX_COLOR\n} from 't3d';\n\nclass CameraHelper extends Mesh {\n\n\tconstructor(camera) {\n\t\tconst geometry = new Geometry();\n\t\tconst material = new LineMaterial();\n\t\tmaterial.vertexColors = VERTEX_COLOR.RGB;\n\n\t\tconst vertices = [];\n\t\tconst colors = [];\n\t\tconst pointsMap = {};\n\n\t\tconst colorFrustum = new Color3(0xffaa00);\n\t\tconst colorCone = new Color3(0xff0000);\n\t\tconst colorUp = new Color3(0x00aaff);\n\t\tconst colorTarget = new Color3(0xffffff);\n\t\tconst colorCross = new Color3(0x333333);\n\n\t\t// near\n\t\taddLine('n1', 'n2', colorFrustum);\n\t\taddLine('n2', 'n4', colorFrustum);\n\t\taddLine('n4', 'n3', colorFrustum);\n\t\taddLine('n3', 'n1', colorFrustum);\n\n\t\t// far\n\t\taddLine('f1', 'f2', colorFrustum);\n\t\taddLine('f2', 'f4', colorFrustum);\n\t\taddLine('f4', 'f3', colorFrustum);\n\t\taddLine('f3', 'f1', colorFrustum);\n\n\t\t// sides\n\t\taddLine('n1', 'f1', colorFrustum);\n\t\taddLine('n2', 'f2', colorFrustum);\n\t\taddLine('n3', 'f3', colorFrustum);\n\t\taddLine('n4', 'f4', colorFrustum);\n\n\t\t// cone\n\t\taddLine('p', 'n1', colorCone);\n\t\taddLine('p', 'n2', colorCone);\n\t\taddLine('p', 'n3', colorCone);\n\t\taddLine('p', 'n4', colorCone);\n\n\t\t// up\n\t\taddLine('u1', 'u2', colorUp);\n\t\taddLine('u2', 'u3', colorUp);\n\t\taddLine('u3', 'u1', colorUp);\n\n\t\t// target\n\t\taddLine('c', 't', colorTarget);\n\t\taddLine('p', 'c', colorTarget);\n\n\t\t// cross\n\t\taddLine('cn1', 'cn2', colorCross);\n\t\taddLine('cn3', 'cn4', colorCross);\n\n\t\taddLine('cf1', 'cf2', colorCross);\n\t\taddLine('cf3', 'cf4', colorCross);\n\n\t\tfunction addLine(a, b, color) {\n\t\t\taddPoint(a, color);\n\t\t\taddPoint(b, color);\n\t\t}\n\n\t\tfunction addPoint(id, color) {\n\t\t\tif (pointsMap[id] === undefined) {\n\t\t\t\tpointsMap[id] = [];\n\t\t\t}\n\t\t\tpointsMap[id].push(vertices.length);\n\n\t\t\tvertices.push(0, 0, 0);\n\t\t\tcolors.push(color.r, color.g, color.b);\n\t\t}\n\n\t\tgeometry.addAttribute('a_Position', new Attribute(new Buffer(new Float32Array(vertices), 3)));\n\t\tgeometry.addAttribute('a_Color', new Attribute(new Buffer(new Float32Array(colors), 3)));\n\n\t\tsuper(geometry, material);\n\n\t\tthis.camera = camera;\n\t\tthis.pointsMap = pointsMap;\n\t\tthis.update();\n\t}\n\n\tupdate() {\n\t\tconst geometry = this.geometry;\n\t\t_mat4.copy(this.camera.projectionMatrixInverse);\n\t\tconst positionBuffer = this.geometry.attributes.a_Position.buffer;\n\n\t\tconst w = 1, h = 1;\n\n\t\t// center / target\n\t\tthis._setPoint('c', positionBuffer, _mat4, 0, 0, -1);\n\t\tthis._setPoint('t', positionBuffer, _mat4, 0, 0, 1);\n\n\t\t// near\n\t\tthis._setPoint('n1', positionBuffer, _mat4, -w, -h, -1);\n\t\tthis._setPoint('n2', positionBuffer, _mat4, w, -h, -1);\n\t\tthis._setPoint('n3', positionBuffer, _mat4, -w, h, -1);\n\t\tthis._setPoint('n4', positionBuffer, _mat4, w, h, -1);\n\n\t\t// far\n\t\tthis._setPoint('f1', positionBuffer, _mat4, -w, -h, 1);\n\t\tthis._setPoint('f2', positionBuffer, _mat4, w, -h, 1);\n\t\tthis._setPoint('f3', positionBuffer, _mat4, -w, h, 1);\n\t\tthis._setPoint('f4', positionBuffer, _mat4, w, h, 1);\n\n\t\t// up\n\t\tthis._setPoint('u1', positionBuffer, _mat4, w * 0.7, h * 1.1, -1);\n\t\tthis._setPoint('u2', positionBuffer, _mat4, -w * 0.7, h * 1.1, -1);\n\t\tthis._setPoint('u3', positionBuffer, _mat4, 0, h * 2, -1);\n\n\t\t// cross\n\t\tthis._setPoint('cf1', positionBuffer, _mat4, -w, 0, 1);\n\t\tthis._setPoint('cf2', positionBuffer, _mat4, w, 0, 1);\n\t\tthis._setPoint('cf3', positionBuffer, _mat4, 0, -h, 1);\n\t\tthis._setPoint('cf4', positionBuffer, _mat4, 0, h, 1);\n\n\t\tthis._setPoint('cn1', positionBuffer, _mat4, -w, 0, -1);\n\t\tthis._setPoint('cn2', positionBuffer, _mat4, w, 0, -1);\n\t\tthis._setPoint('cn3', positionBuffer, _mat4, 0, -h, -1);\n\t\tthis._setPoint('cn4', positionBuffer, _mat4, 0, h, -1);\n\n\t\tpositionBuffer.version++;\n\t\tgeometry.computeBoundingBox();\n\t\tgeometry.computeBoundingSphere();\n\t}\n\n\t_setPoint(point, position, projectionMatrixInverse, x, y, z) {\n\t\t_vec3.set(x, y, z).applyMatrix4(projectionMatrixInverse);\n\t\tconst points = this.pointsMap[point];\n\n\t\tif (points !== undefined) {\n\t\t\tconst array = position.array;\n\t\t\tfor (let i = 0, l = points.length; i < l; i++) {\n\t\t\t\tconst index = points[i];\n\t\t\t\tarray[index] = _vec3.x;\n\t\t\t\tarray[index + 1] = _vec3.y;\n\t\t\t\tarray[index + 2] = _vec3.z;\n\t\t\t}\n\t\t}\n\t}\n\n}\n\nCameraHelper.prototype.isCameraHelper = true;\n\nconst _vec3 = new Vector3();\nconst _mat4 = new Matrix4();\n\nexport { CameraHelper };"
  },
  {
    "path": "examples/jsm/objects/DirectionalLightHelper.js",
    "content": "import {\n\tAttribute,\n\tBuffer,\n\tDRAW_MODE,\n\tGeometry,\n\tLineMaterial,\n\tMesh,\n\tObject3D\n} from 't3d';\n\nclass DirectionalLightHelper extends Object3D {\n\n\tconstructor(light, size = 1, color) {\n\t\tsuper();\n\n\t\tthis.light = light;\n\n\t\tthis.color = color;\n\n\t\tconst planeGeometry = new Geometry();\n\t\tplaneGeometry.addAttribute('a_Position', new Attribute(new Buffer(new Float32Array([\n\t\t\t-size, size, 0,\n\t\t\tsize, size, 0,\n\t\t\tsize, -size, 0,\n\t\t\t-size, -size, 0,\n\t\t\t-size, size, 0\n\t\t]), 3)));\n\t\tplaneGeometry.computeBoundingBox();\n\t\tplaneGeometry.computeBoundingSphere();\n\n\t\tconst planeMaterial = new LineMaterial();\n\t\tplaneMaterial.drawMode = DRAW_MODE.LINE_LOOP;\n\n\t\tthis.lightPlane = new Mesh(planeGeometry, planeMaterial);\n\t\tthis.add(this.lightPlane);\n\n\t\tconst lineGeometry = new Geometry();\n\t\tlineGeometry.addAttribute('a_Position', new Attribute(new Buffer(new Float32Array([\n\t\t\t0, 0, 0, 0, 0, -1\n\t\t]), 3)));\n\t\tlineGeometry.computeBoundingBox();\n\t\tlineGeometry.computeBoundingSphere();\n\n\t\tconst lineMaterial = new LineMaterial();\n\t\tlineMaterial.drawMode = DRAW_MODE.LINE_LOOP;\n\n\t\tthis.targetLine = new Mesh(lineGeometry, lineMaterial);\n\t\tthis.targetLine.scale.z = size * 5;\n\t\tthis.add(this.targetLine);\n\n\t\tthis.update();\n\t}\n\n\tupdate() {\n\t\tif (this.color !== undefined) {\n\t\t\tthis.lightPlane.material.diffuse.setHex(this.color);\n\t\t\tthis.targetLine.material.diffuse.setHex(this.color);\n\t\t} else {\n\t\t\tthis.lightPlane.material.diffuse.copy(this.light.color);\n\t\t\tthis.targetLine.material.diffuse.copy(this.light.color);\n\t\t}\n\t}\n\n}\n\nexport { DirectionalLightHelper };"
  },
  {
    "path": "examples/jsm/objects/GradientSky.js",
    "content": "import {\n\tBoxGeometry,\n\tDRAW_SIDE,\n\tMesh,\n\tShaderMaterial\n} from 't3d';\n\nclass GradientSky extends Mesh {\n\n\tconstructor() {\n\t\tconst geometry = new BoxGeometry(1, 1, 1);\n\n\t\tconst material = new ShaderMaterial(GradientSky.GradientSkyShader);\n\t\tmaterial.side = DRAW_SIDE.BACK;\n\n\t\tsuper(geometry, material);\n\n\t\tthis.frustumCulled = false;\n\t}\n\n}\n\nGradientSky.GradientSkyShader = {\n\tname: 'gradient_sky',\n\n\tdefines: {},\n\n\tuniforms: {\n\t\ttopColor: [93 / 255, 163 / 255, 254 / 255],\n\t\tmiddleColor: [181 / 255, 222 / 255, 247 / 255],\n\t\tbottomColor: [208 / 255, 189 / 255, 93 / 255],\n\t\tdiffusion: 1.0\n\t},\n\n\tvertexShader: `\n\t\t#include <common_vert>\n\n\t\tvarying vec3 vDir;\n\n        mat4 clearMat4Translate(mat4 m) {\n            mat4 outMatrix = m;\n            outMatrix[3].xyz = vec3(0., 0., 0.);\n            return outMatrix;\n\t\t}\n\n\t\tvoid main() {\n            mat4 modelMatrix = clearMat4Translate(u_Model);\n\t\t\tmat4 viewMatrix = clearMat4Translate(u_View);\n\n\t\t\tvDir = normalize((modelMatrix * vec4(a_Position, 0.0)).xyz);\n\n            gl_Position = u_Projection * viewMatrix * modelMatrix * vec4(a_Position, 1.0);\n\t\t\tgl_Position.z = gl_Position.w;\n\t\t}\n\t`,\n\n\tfragmentShader: `\n\t\t#include <common_frag>\n\n\t\tuniform vec3 topColor;\n\t\tuniform vec3 bottomColor;\n        uniform vec3 middleColor;\n        uniform float diffusion;\n\n\t\tvarying vec3 vDir;\n\n\t\tvoid main() {\n            vec3 viewDir = normalize(vDir);\n\n            vec3 mixColor = step(0.0, viewDir.y) * topColor + step(viewDir.y, 0.0) * bottomColor;\n            vec3 color = mix(mixColor, middleColor, 1.0 - abs(viewDir.y) * diffusion);\n\t\t\t\n            gl_FragColor = vec4(color, 1.0);\n\t\t}\n\t`\n};\n\nexport { GradientSky };"
  },
  {
    "path": "examples/jsm/objects/GridHelper.js",
    "content": "import {\n\tAttribute,\n\tBuffer,\n\tColor3,\n\tGeometry,\n\tLineMaterial,\n\tMesh,\n\tVERTEX_COLOR\n} from 't3d';\n\nclass GridHelper extends Mesh {\n\n\tconstructor(size = 10, divisions = 10, color1 = 0x444444, color2 = 0x888888) {\n\t\tcolor1 = new Color3(color1);\n\t\tcolor2 = new Color3(color2);\n\n\t\tconst center = divisions / 2;\n\t\tconst step = size / divisions;\n\t\tconst halfSize = size / 2;\n\n\t\tconst vertices = [], colors = [];\n\n\t\tfor (let i = 0, j = 0, k = -halfSize; i <= divisions; i++, k += step) {\n\t\t\tvertices.push(-halfSize, 0, k, halfSize, 0, k);\n\t\t\tvertices.push(k, 0, -halfSize, k, 0, halfSize);\n\n\t\t\tconst color = i === center ? color1 : color2;\n\n\t\t\tcolor.toArray(colors, j); colors[j + 3] = 1; j += 4;\n\t\t\tcolor.toArray(colors, j); colors[j + 3] = 1; j += 4;\n\t\t\tcolor.toArray(colors, j); colors[j + 3] = 1; j += 4;\n\t\t\tcolor.toArray(colors, j); colors[j + 3] = 1; j += 4;\n\t\t}\n\n\t\tconst geometry = new Geometry();\n\t\tgeometry.addAttribute('a_Position', new Attribute(new Buffer(new Float32Array(vertices), 3)));\n\t\tgeometry.addAttribute('a_Color', new Attribute(new Buffer(new Float32Array(colors), 4)));\n\n\t\t// Skip update bounding box\n\t\t// Because we may not want to consider the helper's bounding box\n\t\tgeometry.computeBoundingSphere();\n\n\t\tconst material = new LineMaterial();\n\t\tmaterial.vertexColors = VERTEX_COLOR.RGBA;\n\n\t\tsuper(geometry, material);\n\t}\n\n}\n\nexport { GridHelper };"
  },
  {
    "path": "examples/jsm/objects/HemisphereLightHelper.js",
    "content": "import {\n\tLineMaterial,\n\tMesh,\n\tSphereGeometry,\n\tVERTEX_COLOR,\n\tAttribute,\n\tBuffer,\n\tColor3\n} from 't3d';\n\nconst _color3_1 = new Color3();\n\nclass HemisphereLightHelper extends Mesh {\n\n\tconstructor(light, sphereSize, color) {\n\t\tconst geometry = new SphereGeometry(sphereSize, 4, 2);\n\n\t\tconst positions = geometry.getAttribute('a_Position');\n\t\tconst colorArray = new Float32Array(positions.buffer.array.length);\n\t\tfor (let i = 0, l = colorArray.length; i < l; i++) {\n\t\t\tcolorArray[i] = 1;\n\t\t}\n\t\tconst colors = new Attribute(new Buffer(colorArray, 3));\n\t\tgeometry.addAttribute('a_Color', colors);\n\n\t\tconst material = new LineMaterial();\n\t\tmaterial.vertexColors = VERTEX_COLOR.RGB;\n\n\t\tsuper(geometry, material);\n\n\t\tthis.light = light;\n\n\t\tthis.color = color;\n\n\t\tthis.update();\n\t}\n\n\tupdate() {\n\t\tif (this.color !== undefined) {\n\t\t\tthis.material.diffuse.setHex(this.color);\n\t\t} else {\n\t\t\t_color3_1.lerpColors(this.light.color, this.light.groundColor, 0.5);\n\n\t\t\tconst colors = this.geometry.getAttribute('a_Color');\n\t\t\tconst array = colors.buffer.array;\n\t\t\tfor (let i = 0, l = array.length; i < l; i += 3) {\n\t\t\t\tif (i < 5 * 3) {\n\t\t\t\t\tthis.light.color.toArray(array, i);\n\t\t\t\t} else if (i < 10 * 3) {\n\t\t\t\t\t_color3_1.toArray(array, i);\n\t\t\t\t} else {\n\t\t\t\t\tthis.light.groundColor.toArray(array, i);\n\t\t\t\t}\n\t\t\t}\n\t\t\tcolors.buffer.version++;\n\t\t}\n\t}\n\n}\n\nexport { HemisphereLightHelper };"
  },
  {
    "path": "examples/jsm/objects/InstancedLine.js",
    "content": "/**\n * InstancedLine\n */\n\nimport {\n\tMesh,\n\tGeometry,\n\tVector3,\n\tAttribute,\n\tBuffer,\n\tShaderMaterial\n} from 't3d';\n\nexport class InstancedLine extends Mesh {\n\n\tconstructor() {\n\t\tconst geometry = new InstancedLineGeometry();\n\t\tconst material = new InstancedLineMaterial();\n\n\t\tsuper(geometry, material);\n\t}\n\n\traycast() {\n\n\t}\n\n}\n\nInstancedLine.prototype.isInstancedLine = true;\n\nconst positions = [\n\t-1, 1, 0,\n\t1, 1, 0,\n\t-1, -1, 0,\n\t1, -1, 0\n];\nconst uvs = [\n\t0, 1,\n\t1, 1,\n\t0, 0,\n\t1, 0\n];\nconst index = [\n\t0, 2, 1,\n\t2, 3, 1\n];\n\nconst _vec3_1 = new Vector3();\nconst _vec3_2 = new Vector3();\n\nfunction setBox3FromBuffer(box, buffer) {\n\tlet minX = +Infinity;\n\tlet minY = +Infinity;\n\tlet minZ = +Infinity;\n\n\tlet maxX = -Infinity;\n\tlet maxY = -Infinity;\n\tlet maxZ = -Infinity;\n\n\tfor (let i = 0, l = buffer.count + 2; i < l; i++) {\n\t\tconst x = buffer.array[i * buffer.stride + 0];\n\t\tconst y = buffer.array[i * buffer.stride + 1];\n\t\tconst z = buffer.array[i * buffer.stride + 2];\n\n\t\tif (x < minX) minX = x;\n\t\tif (y < minY) minY = y;\n\t\tif (z < minZ) minZ = z;\n\n\t\tif (x > maxX) maxX = x;\n\t\tif (y > maxY) maxY = y;\n\t\tif (z > maxZ) maxZ = z;\n\t}\n\n\tbox.min.set(minX, minY, minZ);\n\tbox.max.set(maxX, maxY, maxZ);\n\n\treturn box;\n}\n\nexport class InstancedLineGeometry extends Geometry {\n\n\tconstructor() {\n\t\tsuper();\n\n\t\tthis.setIndex(new Attribute(new Buffer(new Uint16Array(index), 1)));\n\t\tthis.addAttribute('a_Position', new Attribute(new Buffer(new Float32Array(positions), 3)));\n\t\tthis.addAttribute('a_Uv', new Attribute(new Buffer(new Float32Array(uvs), 2)));\n\t}\n\n\tsetFromPoints(points, breakIndices) {\n\t\t// Convert to flat array and add start/end point\n\t\t// 0   0---1---2---3---4   4\n\n\t\tconst useBreak = breakIndices && breakIndices.length > 0;\n\t\tconst bufferArray = [];\n\t\tconst length = points.length;\n\t\tconst isVectorArray = points[0] && (points[0].x !== undefined);\n\n\t\tlet dist = 0, breakIndex = 0;\n\n\t\tpoints.forEach((p, i) => {\n\t\t\tconst point = isVectorArray ? p : _vec3_1.fromArray(p);\n\n\t\t\tif (i > 0) {\n\t\t\t\tconst prevPoint = isVectorArray ? points[i - 1] : _vec3_2.fromArray(points[i - 1]);\n\t\t\t\tdist += point.distanceTo(prevPoint);\n\t\t\t}\n\n\t\t\tif (useBreak) {\n\t\t\t\tlet breakState = 0;\n\t\t\t\tif (breakIndices[breakIndex] === i) { // next segments start\n\t\t\t\t\tbreakState = 1;\n\t\t\t\t\tbreakIndex++;\n\t\t\t\t\tdist = 0;\n\t\t\t\t} else if (breakIndices[breakIndex] === (i + 1)) { // current segments end\n\t\t\t\t\tbreakState = 1;\n\t\t\t\t}\n\n\t\t\t\tbufferArray.push(point.x, point.y, point.z, dist, breakState);\n\t\t\t\tif (i === 0 || i === length - 1) {\n\t\t\t\t\tbufferArray.push(point.x, point.y, point.z, dist, breakState);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tbufferArray.push(point.x, point.y, point.z, dist);\n\t\t\t\tif (i === 0 || i === length - 1) {\n\t\t\t\t\tbufferArray.push(point.x, point.y, point.z, dist);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\t// Convert to instance buffer\n\t\t// prev2---prev1---next1---next2\n\n\t\tconst stride = useBreak ? 5 : 4;\n\n\t\tconst instanceBuffer = new Buffer(new Float32Array(bufferArray), stride, 1);\n\t\tinstanceBuffer.count = Math.max(0, instanceBuffer.count - 3); // fix count\n\n\t\tlet attribute;\n\n\t\tattribute = new Attribute(instanceBuffer, 3, stride * 0);\n\t\tattribute.divisor = 1;\n\t\tthis.addAttribute('instancePrev2', attribute);\n\t\tattribute = new Attribute(instanceBuffer, 3, stride * 1);\n\t\tattribute.divisor = 1;\n\t\tthis.addAttribute('instancePrev1', attribute);\n\t\tattribute = new Attribute(instanceBuffer, 3, stride * 2);\n\t\tattribute.divisor = 1;\n\t\tthis.addAttribute('instanceNext1', attribute);\n\t\tattribute = new Attribute(instanceBuffer, 3, stride * 3);\n\t\tattribute.divisor = 1;\n\t\tthis.addAttribute('instanceNext2', attribute);\n\n\t\tattribute = new Attribute(instanceBuffer, 1, stride * 1 + 3);\n\t\tattribute.divisor = 1;\n\t\tthis.addAttribute('instancePrevDist', attribute);\n\t\tattribute = new Attribute(instanceBuffer, 1, stride * 2 + 3);\n\t\tattribute.divisor = 1;\n\t\tthis.addAttribute('instanceNextDist', attribute);\n\n\t\tif (useBreak) {\n\t\t\tattribute = new Attribute(instanceBuffer, 1, stride * 1 + 4);\n\t\t\tattribute.divisor = 1;\n\t\t\tthis.addAttribute('instancePrevBreak', attribute);\n\t\t\tattribute = new Attribute(instanceBuffer, 1, stride * 2 + 4);\n\t\t\tattribute.divisor = 1;\n\t\t\tthis.addAttribute('instanceNextBreak', attribute);\n\t\t}\n\n\t\tthis.version++;\n\n\t\tthis.instanceCount = instanceBuffer.count;\n\n\t\tthis.computeBoundingBox();\n\t\tthis.computeBoundingSphere();\n\n\t\treturn this;\n\t}\n\n\tcomputeBoundingBox() {\n\t\tconst instancePrev1 = this.attributes.instancePrev1;\n\n\t\tif (instancePrev1 !== undefined && instancePrev1.buffer.count > 0) {\n\t\t\tsetBox3FromBuffer(this.boundingBox, instancePrev1.buffer);\n\t\t} else {\n\t\t\tthis.boundingBox.makeEmpty();\n\t\t}\n\t}\n\n\tcomputeBoundingSphere() {\n\t\tthis.computeBoundingBox();\n\n\t\tconst instancePrev1 = this.attributes.instancePrev1;\n\t\tif (instancePrev1 !== undefined && instancePrev1.buffer.count > 0) {\n\t\t\tconst center = this.boundingSphere.center;\n\t\t\tthis.boundingBox.getCenter(center);\n\n\t\t\tlet maxRadiusSq = 0;\n\n\t\t\tfor (let i = 0, il = instancePrev1.buffer.count + 2; i < il; i++) {\n\t\t\t\t_vec3_1.fromArray(instancePrev1.buffer.array, i * instancePrev1.buffer.stride);\n\t\t\t\tmaxRadiusSq = Math.max(maxRadiusSq, center.distanceToSquared(_vec3_1));\n\t\t\t}\n\n\t\t\tthis.boundingSphere.radius = Math.sqrt(maxRadiusSq);\n\n\t\t\tif (isNaN(this.boundingSphere.radius)) {\n\t\t\t\tconsole.error('InstancedLineGeometry.computeBoundingSphere(): Computed radius is NaN. The instanced position data is likely to have NaN values.', this);\n\t\t\t}\n\t\t} else {\n\t\t\tthis.boundingSphere.makeEmpty();\n\t\t}\n\t}\n\n}\n\nconst instancedLineShader = {\n\tname: 'instanced_line',\n\tdefines: {\n\t\tLINE_BREAK: false,\n\t\tDISABLE_CORNER_BROKEN: false,\n\t\tFLAT_W: false,\n\t\tSWAP_UV: false,\n\t\tSIMPLE_UV: false,\n\t\tSCREEN_UV: false // TODO\n\t},\n\tuniforms: {\n\t\tlineWidth: 5,\n\t\tcornerThreshold: 0.4\n\t},\n\tvertexShader: `\n        #include <common_vert>\n        #include <logdepthbuf_pars_vert>\n\n        #ifdef USE_FOG\n            varying float vDepth;\n        #endif\n\n        attribute vec2 a_Uv;\n        #ifdef USE_DIFFUSE_MAP\n            varying vec2 v_Uv;\n            uniform mat3 uvTransform;\n        #endif\n        #include <alphamap_pars_vert>\n\n        attribute vec3 instancePrev2;\n        attribute vec3 instancePrev1;\n        attribute vec3 instanceNext1;\n        attribute vec3 instanceNext2;\n\n        attribute float instancePrevDist;\n        attribute float instanceNextDist;\n\n        #ifdef LINE_BREAK\n            attribute float instancePrevBreak;\n            attribute float instanceNextBreak;\n\n            varying float vDiscard;\n        #endif\n\n        uniform float lineWidth;\n        uniform vec2 u_RenderTargetSize;\n\n        uniform float cornerThreshold;\n\n        void trimSegment(const in vec4 start, inout vec4 end) {\n            // trim end segment so it terminates between the camera plane and the near plane\n\n            // conservative estimate of the near plane\n            float a = u_Projection[2][2]; // 3nd entry in 3th column\n            float b = u_Projection[3][2]; // 3nd entry in 4th column\n            float nearEstimate = -0.5 * b / a;\n\n            float alpha = (nearEstimate - start.z) / (end.z - start.z);\n\n            end.xyz = mix(start.xyz, end.xyz, alpha);\n        }\n\n        void main() {\n            vec3 position = a_Position;\n            mat4 modelViewMatrix = u_View * u_Model;\n\n            float aspect = u_RenderTargetSize.x / u_RenderTargetSize.y;\n            float flagY = position.y * 0.5 + 0.5;\n\n            // camera space\n            vec4 prev = modelViewMatrix * vec4(mix(instancePrev2, instancePrev1, flagY), 1.0);\n            vec4 curr = modelViewMatrix * vec4(mix(instancePrev1, instanceNext1, flagY), 1.0);\n            vec4 next = modelViewMatrix * vec4(mix(instanceNext1, instanceNext2, flagY), 1.0);\n\n            #ifdef LINE_BREAK\n                vDiscard = instancePrevBreak * instanceNextBreak;\n                if (position.y > 0.0 && instanceNextBreak > 0.5) {\n                    next = curr;\n                } else if (position.y < 0.0 && instancePrevBreak > 0.5) {\n                    prev = curr;\n                }\n            #endif\n\n            // special case for perspective projection, and segments that terminate either in, or behind, the camera plane\n            bool perspective = (u_Projection[2][3] == -1.0); // 4th entry in the 3rd column\n\n            if (perspective) {\n                if (position.y < 0.) {\n                    if (curr.z < 0.0 && next.z >= 0.0) {\n                        trimSegment(curr, next);\n                    } else if (next.z < 0.0 && curr.z >= 0.0) {\n                        trimSegment(next, curr);\n                    }\n\n                    if (prev.z < 0.0 && curr.z >= 0.0) {\n                        trimSegment(prev, curr);\n                    } else if (curr.z < 0.0 && prev.z >= 0.0) {\n                        trimSegment(curr, prev);\n                    }\n                } else {\n                    if (prev.z < 0.0 && curr.z >= 0.0) {\n                        trimSegment(prev, curr);\n                    } else if (curr.z < 0.0 && prev.z >= 0.0) {\n                        trimSegment(curr, prev);\n                    }\n\n                    if (curr.z < 0.0 && next.z >= 0.0) {\n                        trimSegment(curr, next);\n                    } else if (next.z < 0.0 && curr.z >= 0.0) {\n                        trimSegment(next, curr);\n                    }\n                }\n            }\n\n            // clip space\n            vec4 clipPrev = u_Projection * prev;\n            vec4 clipCurr = u_Projection * curr;\n            vec4 clipNext = u_Projection * next;\n\n            // ndc space\n            vec2 ndcPrev = clipPrev.xy / clipPrev.w;\n            vec2 ndcCurr = clipCurr.xy / clipCurr.w;\n            vec2 ndcNext = clipNext.xy / clipNext.w;\n\n            // direction\n            vec2 dir, dir1, dir2;\n            float w = 1.0;\n\n            if (prev == curr || ndcPrev == ndcCurr) {\n                dir = ndcNext - ndcCurr;\n                dir.x *= aspect;\n                dir = normalize(dir);\n            } else if(curr == next || ndcCurr == ndcNext) {\n                dir = ndcCurr - ndcPrev;\n                dir.x *= aspect;\n                dir = normalize(dir);\n            } else {\n                dir1 = ndcCurr - ndcPrev;\n                dir1.x *= aspect;\n\n                dir2 = ndcNext - ndcCurr;\n                dir2.x *= aspect;\n\n                dir1 = normalize(dir1);\n                dir2 = normalize(dir2);\n\n                dir = normalize(dir1 + dir2);\n\n                w = dot(dir1, dir);\n\n                #ifdef DISABLE_CORNER_BROKEN\n                    w = 1.0 / max(w, cornerThreshold);\n                #else\n                    float flagT = step(w, cornerThreshold);\n                    w = 1.0 / mix(w, 1.0, flagT);\n                    dir = mix(dir, mix(dir2, dir1, flagY), flagT);\n                #endif\n            }\n\n            // perpendicular to dir\n            vec2 offset = vec2(dir.y, -dir.x);\n\n            // undo aspect ratio adjustment\n            offset.x /= aspect;\n\n            // sign flip\n            offset *= float(sign(position.x));\n\n            // adjust for lineWidth\n            offset *= lineWidth * w;\n\n            // adjust for clip-space to screen-space conversion // maybe this should be based on viewport ...\n            offset /= u_RenderTargetSize.y;\n\n            // select end\n            vec4 clip = clipCurr;\n\n            // back to clip space\n            offset *= clip.w;\n\n            clip.xy += offset;\n\n            gl_Position = clip;\n\n            #ifdef USE_FOG\n                vDepth = -curr.z;\n            #endif\n\n            #ifdef USE_LOGDEPTHBUF\n                #ifdef USE_LOGDEPTHBUF_EXT\n                    vFragDepth = 1.0 + gl_Position.w - logDepthCameraNear;\n                    // vIsPerspective = float( isPerspectiveMatrix( u_Projection ) );\n                    vIsPerspective = isPerspectiveMatrix( u_Projection ) ? 1.0 : 0.0;\n                #else\n                    if ( isPerspectiveMatrix( u_Projection ) ) {\n                        gl_Position.z = log2( max( EPSILON, gl_Position.w - logDepthCameraNear + 1.0 ) ) * logDepthBufFC - 1.0;\n                        gl_Position.z *= gl_Position.w;\n                    }\n                #endif\n            #endif\n\n            #ifdef FLAT_W\n                if (gl_Position.w > -1.0) {\n                    gl_Position.xyz /= gl_Position.w;\n                    gl_Position.w = 1.0;\n                }\n            #endif\n\n            // uv\n            // TODO trim uv\n            vec2 tUv = vec2(0.0, 0.0);\n            #ifdef SIMPLE_UV\n                tUv = a_Uv;\n            #else\n                #ifdef SCREEN_UV\n                    tUv = a_Uv;\n                #else\n                    tUv.x = a_Uv.x;\n                    tUv.y = mix(instancePrevDist, instanceNextDist, flagY);\n                #endif\n            #endif\n\n            #ifdef SWAP_UV\n                tUv = tUv.yx;\n            #endif\n\n            #ifdef USE_DIFFUSE_MAP\n                v_Uv = (uvTransform * vec3(tUv, 1.)).xy;\n            #endif\n            #ifdef USE_ALPHA_MAP\n                vAlphaMapUV = (alphaMapUVTransform * vec3(tUv, 1.)).xy;\n            #endif\n        }\n    `,\n\tfragmentShader: `\n        #include <common_frag>\n\n        #ifdef USE_DIFFUSE_MAP\n            varying vec2 v_Uv;\n            uniform sampler2D diffuseMap;\n        #endif\n        #include <alphamap_pars_frag>\n\n        #ifdef USE_FOG\n            varying float vDepth;\n        #endif\n\n        #include <fog_pars_frag>\n        #include <logdepthbuf_pars_frag>\n\n        #ifdef LINE_BREAK\n            varying float vDiscard;\n        #endif\n\n        void main() {\n            #ifdef LINE_BREAK\n                if (vDiscard > 0.5) {\n                    discard;\n                }\n            #endif\n\n            vec4 outColor = vec4(u_Color, u_Opacity);\n\n            #ifdef USE_DIFFUSE_MAP\n                outColor *= texture2D(diffuseMap, v_Uv);\n            #endif\n\n            #ifdef USE_ALPHA_MAP\n                outColor.a *= texture2D(alphaMap, vAlphaMapUV).g;\n            #endif\n\n            gl_FragColor = outColor;\n\n            #ifdef USE_FOG\n                float depth = vDepth;\n                #ifdef USE_EXP2_FOG\n                    float fogFactor = whiteCompliment( exp2( - u_FogDensity * u_FogDensity * depth * depth * LOG2 ) );\n                #else\n                    float fogFactor = smoothstep( u_FogNear, u_FogFar, depth );\n                #endif\n                gl_FragColor.rgb = mix( gl_FragColor.rgb, u_FogColor, fogFactor );\n            #endif\n            #include <logdepthbuf_frag>\n        }\n    `\n};\n\nexport class InstancedLineMaterial extends ShaderMaterial {\n\n\tconstructor() {\n\t\tsuper(instancedLineShader);\n\t}\n\n}"
  },
  {
    "path": "examples/jsm/objects/LayeredVolumeMesh.js",
    "content": "import {\n\tPlaneGeometry,\n\tAttribute,\n\tBuffer,\n\tMesh,\n\tShaderMaterial,\n\tDRAW_SIDE\n} from 't3d';\n\nclass LayeredVolumeMesh extends Mesh {\n\n\tconstructor(options = {}) {\n\t\tconst layer = options.layer || 10;\n\t\tconst layers = [];\n\t\tfor (let i = 0; i < layer; i++) {\n\t\t\tlayers.push(i / (layer - 1));\n\t\t}\n\n\t\tconst geometry = new PlaneGeometry();\n\t\tgeometry.instanceCount = layer;\n\n\t\tconst volumeLayerAttribute = new Attribute(new Buffer(new Float32Array(layers), 1));\n\t\tvolumeLayerAttribute.divisor = 1;\n\t\tgeometry.addAttribute('a_VolumeLayer', volumeLayerAttribute);\n\n\t\tconst material = new ShaderMaterial(LayeredVolumeShader);\n\t\tmaterial.transparent = true;\n\t\tmaterial.depthTest = false;\n\t\tmaterial.side = DRAW_SIDE.DOUBLE;\n\t\tmaterial.uniforms.densityTexture = options.densityTexture || null;\n\t\tmaterial.uniforms.platteTexture = options.platteTexture || null;\n\t\tmaterial.uniforms.volumeDepth = options.depth || 1;\n\t\tmaterial.uniforms.diskSize = options.diskSize || 0.018;\n\t\tmaterial.uniforms.diskSpacing = options.diskSpacing || 0.002;\n\n\t\tsuper(geometry, material);\n\n\t\tthis.scale.set(options.width || 1, 1, options.height || 1);\n\n\t\tthis.frustumCulled = false;\n\t}\n\n}\n\nconst LayeredVolumeShader = {\n\tname: 'layered_volume',\n\n\tdefines: {\n\t\t'LAYER_RANDOM': 0.01\n\t},\n\n\tuniforms: {\n\t\tdensityTexture: null,\n\t\tplatteTexture: null,\n\t\tvolumeDepth: 1,\n\t\tdiskSize: 0.018,\n\t\tdiskSpacing: 0.002\n\t},\n\n\tvertexShader: `\n\t\t#include <common_vert>\n\n\t\tattribute vec2 a_Uv;\n\t\tattribute float a_VolumeLayer;\n\n\t\tuniform float volumeDepth;\n\n\t\tvarying vec2 v_Uv;\n\t\tvarying float v_VolumeLayer;\n\n\t\tvoid main() {\n\t\t\tvec3 position = a_Position.xyz;\n\t\t\tposition.y = volumeDepth * a_VolumeLayer;\n\t\t\tgl_Position = u_ProjectionView * u_Model * vec4(position, 1.0);\n\n\t\t\tv_Uv = a_Uv;\n\t\t\tv_VolumeLayer = a_VolumeLayer;\n\t\t}\n\t`,\n\n\tfragmentShader: `\n\t\tprecision highp sampler3D;\n\n\t\tuniform sampler3D densityTexture;\n\t\tuniform sampler2D platteTexture;\n\n\t\tuniform float u_Opacity;\n\n\t\tuniform float diskSize;\n\t\tuniform float diskSpacing;\n\n\t\tvarying vec2 v_Uv;\n\t\tvarying float v_VolumeLayer;\n\n        void main() {\n\t\t\tvec2 uv = v_Uv;\n\t\t\t#ifdef LAYER_RANDOM\n\t\t\t\tuv += sin(v_VolumeLayer * 43758.5453123) * vec2(LAYER_RANDOM);\n\t\t\t#endif\n\n\t\t\tfloat gridSize = diskSize + diskSpacing;\n\t\t\tvec2 diskCenter = (floor(uv / gridSize) + 0.5) * gridSize;\n            float diskMask = 1.0 - step(diskSize * 0.5, length(uv - diskCenter));\n\n\t\t\tfloat intensity = texture(densityTexture, vec3(diskCenter, 1. - v_VolumeLayer)).r;\n            vec4 color = texture2D(platteTexture, vec2(intensity, 0.5));\n            float finalOpacity = intensity * u_Opacity * diskMask;\n\n            gl_FragColor = vec4(color.rgb , finalOpacity);\n\t\t}\n    `\n};\n\nexport { LayeredVolumeMesh, LayeredVolumeShader };"
  },
  {
    "path": "examples/jsm/objects/LegacySkeletonHelper.js",
    "content": "import {\n\tAttribute,\n\tBuffer,\n\tColor3,\n\tGeometry,\n\tLineMaterial,\n\tMatrix4,\n\tMesh,\n\tVERTEX_COLOR,\n\tVector3\n} from 't3d';\n\nclass SkeletonHelper extends Mesh {\n\n\tconstructor(object) {\n\t\tconst bones = getBoneList(object);\n\n\t\tconst geometry = new Geometry();\n\n\t\tconst vertices = [];\n\t\tconst colors = [];\n\n\t\tconst color1 = new Color3(0, 0, 1);\n\t\tconst color2 = new Color3(0, 1, 0);\n\n\t\tfor (let i = 0; i < bones.length; i++) {\n\t\t\tconst bone = bones[i];\n\n\t\t\tif (bone.parent && bone.parent.isBone) {\n\t\t\t\tvertices.push(0, 0, 0);\n\t\t\t\tvertices.push(0, 0, 0);\n\t\t\t\tcolors.push(color1.r, color1.g, color1.b, 1);\n\t\t\t\tcolors.push(color2.r, color2.g, color2.b, 1);\n\t\t\t}\n\t\t}\n\n\t\tgeometry.addAttribute('a_Position', new Attribute(new Buffer(new Float32Array(vertices), 3)));\n\t\tgeometry.addAttribute('a_Color', new Attribute(new Buffer(new Float32Array(colors), 4)));\n\n\t\tconst material = new LineMaterial();\n\t\tmaterial.vertexColors = VERTEX_COLOR.RGBA;\n\t\tmaterial.depthTest = false;\n\t\tmaterial.depthWrite = false;\n\t\tmaterial.transparent = true;\n\n\t\tsuper(geometry, material);\n\n\t\tthis.frustumCulled = false;\n\n\t\tthis.root = object;\n\t\tthis.bones = bones;\n\t}\n\n\tupdateMatrix(force) {\n\t\tconst bones = this.bones;\n\n\t\tconst geometry = this.geometry;\n\t\tconst position = geometry.getAttribute('a_Position');\n\n\t\tworldMatrixInv.copy(this.root.worldMatrix).invert();\n\n\t\tfor (let i = 0, j = 0; i < bones.length; i++) {\n\t\t\tconst bone = bones[i];\n\n\t\t\tif (bone.parent && bone.parent.isBone) {\n\t\t\t\tboneMatrix.multiplyMatrices(worldMatrixInv, bone.worldMatrix);\n\t\t\t\tvector.setFromMatrixPosition(boneMatrix);\n\n\t\t\t\tposition.buffer.array[j * position.size + 0] = vector.x;\n\t\t\t\tposition.buffer.array[j * position.size + 1] = vector.y;\n\t\t\t\tposition.buffer.array[j * position.size + 2] = vector.z;\n\n\t\t\t\tboneMatrix.multiplyMatrices(worldMatrixInv, bone.parent.worldMatrix);\n\t\t\t\tvector.setFromMatrixPosition(boneMatrix);\n\n\t\t\t\tposition.buffer.array[(j + 1) * position.size + 0] = vector.x;\n\t\t\t\tposition.buffer.array[(j + 1) * position.size + 1] = vector.y;\n\t\t\t\tposition.buffer.array[(j + 1) * position.size + 2] = vector.z;\n\n\t\t\t\tj += 2;\n\t\t\t}\n\t\t}\n\n\t\tposition.buffer.version++;\n\n\t\tsuper.updateMatrix(force);\n\t}\n\n}\n\nconst vector = new Vector3();\nconst boneMatrix = new Matrix4();\nconst worldMatrixInv = new Matrix4();\n\nfunction getBoneList(object) {\n\tconst boneList = [];\n\n\tif (object.isBone) {\n\t\tboneList.push(object);\n\t}\n\n\tfor (let i = 0; i < object.children.length; i++) {\n\t\tboneList.push.apply(boneList, getBoneList(object.children[i]));\n\t}\n\n\treturn boneList;\n}\n\nexport { SkeletonHelper };"
  },
  {
    "path": "examples/jsm/objects/LightShadowAdapterHelper.js",
    "content": "import { BasicMaterial, Matrix4, Mesh, Object3D, SphereGeometry } from 't3d';\nimport { Box3Helper } from './Box3Helper.js';\n\nexport class LightShadowAdapterHelper extends Object3D {\n\n\tconstructor(adapter) {\n\t\tsuper();\n\n\t\tthis.adapter = adapter;\n\n\t\tthis.box3HelperContainer = new Object3D();\n\t\tthis.add(this.box3HelperContainer);\n\n\t\tthis.thinBoxHelper = new Box3Helper(adapter.stats.thinShadowBox, 0x00ffff);\n\t\tthis.box3HelperContainer.add(this.thinBoxHelper);\n\n\t\tthis.shadowBoxHelper = new Box3Helper(adapter.stats.shadowBox);\n\t\tthis.box3HelperContainer.add(this.shadowBoxHelper);\n\n\t\tthis.pointsHelper = new Object3D();\n\t\tthis.add(this.pointsHelper);\n\n\t\tthis.pointGeometry = new SphereGeometry(1, 8, 6);\n\t\tthis.pointMaterial = new BasicMaterial();\n\t\tthis.pointMaterial.diffuse.setHex(0xff0000);\n\t}\n\n\tupdateMatrix(force) {\n\t\tconst { adapter, pointsHelper, pointGeometry, pointMaterial } = this;\n\t\tconst { type, shadowBox, shadowBoxRotation, boundaryPoints, polygons } = adapter.stats;\n\n\t\t// shadow box helper\n\n\t\tthis.box3HelperContainer.quaternion.setFromRotationMatrix(_mat4_1.setFromMatrix3(shadowBoxRotation));\n\n\t\t// points helper\n\n\t\tconst sizeScalar = shadowBox.max.distanceTo(shadowBox.min) / 500;\n\n\t\tpointsHelper.children.forEach(point => point.visible = false);\n\n\t\tif (type === 1) {\n\t\t\tlet pointIndex = 0;\n\t\t\tpolygons.polygons.forEach(polygon => {\n\t\t\t\tfor (let i = 0; i < polygon.verticesIndex; i++) {\n\t\t\t\t\tlet point = pointsHelper.children[pointIndex];\n\t\t\t\t\tif (!point) {\n\t\t\t\t\t\tpoint = new Mesh(pointGeometry, pointMaterial);\n\t\t\t\t\t\tpointsHelper.add(point);\n\t\t\t\t\t}\n\t\t\t\t\tpoint.position.copy(polygon.vertices[i]);\n\t\t\t\t\tpoint.scale.setScalar(sizeScalar);\n\t\t\t\t\tpoint.visible = true;\n\t\t\t\t\tpointIndex++;\n\t\t\t\t}\n\t\t\t});\n\t\t} else if (type === 2 || type === 3) {\n\t\t\tlet pointIndex = 0;\n\t\t\tfor (let i = 0; i < boundaryPoints.length; i++) {\n\t\t\t\tlet point = pointsHelper.children[pointIndex];\n\t\t\t\tif (!point) {\n\t\t\t\t\tpoint = new Mesh(pointGeometry, pointMaterial);\n\t\t\t\t\tpointsHelper.add(point);\n\t\t\t\t}\n\t\t\t\tpoint.position.copy(boundaryPoints[i]);\n\t\t\t\tpoint.scale.setScalar(sizeScalar);\n\t\t\t\tpoint.visible = true;\n\t\t\t\tpointIndex++;\n\t\t\t}\n\t\t}\n\n\t\tsuper.updateMatrix(force);\n\t}\n\n}\n\nconst _mat4_1 = new Matrix4();"
  },
  {
    "path": "examples/jsm/objects/LineChartFillMesh.js",
    "content": "import { Attribute, Vector2, Buffer, DRAW_SIDE, Mesh, Geometry, ShaderMaterial, Texture2D, TEXTURE_FILTER, PIXEL_TYPE, Vector3, MathUtils } from 't3d';\nimport { CurvePath2 } from '../math/curves/CurvePath2.js';\n\nclass LineChartFillMesh extends Mesh {\n\n\tconstructor() {\n\t\tconst geometry = new Geometry();\n\n\t\tconst material = new ShaderMaterial(LineChartFillShader);\n\t\tmaterial.transparent = true;\n\t\tmaterial.side = DRAW_SIDE.DOUBLE;\n\n\t\tsuper(geometry, material);\n\n\t\tthis.curvePath = new CurvePath2();\n\t}\n\n\t/**\n\t * @param {Vector3[]} points - Base points(x axis) of this chart in 3D space.\n\t * @param {number[]} values - Values of each point in the path, which should be in the range of [0, 1].\n\t * @param {object} [options={}] - Options object.\n\t * @param {Vector3[]|Vector3} [options.up=Vector3(0, 1, 0)] - Up direction of each point in the path, or a single up for all points.\n\t * @param {number} [options.height=1] - The height of the chart.\n\t * @param {number} [options.smooth=0.3] - The smoothness of the lines.\n\t */\n\tsetPositionAndValue(points, values, options = {}) {\n\t\tthis.clear();\n\n\t\tconst { up = _defaultUp, height = 1, smooth = 0.3 } = options;\n\n\t\tconst xCoords = calculateCumulativeDistances(points, 1 / height);\n\t\tconst useUpArray = Array.isArray(up);\n\n\t\t// Set geometry\n\n\t\tconst geometry = this.geometry;\n\n\t\tconst positions = [];\n\t\tconst uvs = [];\n\t\tconst indices = [];\n\t\tconst pids = [];\n\n\t\tpoints.forEach((point, i) => {\n\t\t\tconst upVector = useUpArray ? up[i] : up;\n\t\t\tconst topPoint = _vec3_1.copy(point).addScaledVector(upVector, height);\n\n\t\t\tpositions.push(point.x, point.y, point.z);\n\t\t\tpositions.push(topPoint.x, topPoint.y, topPoint.z);\n\n\t\t\tuvs.push(xCoords[i], 0);\n\t\t\tuvs.push(xCoords[i], 1);\n\n\t\t\tpids.push(i + 1, i + 1);\n\t\t});\n\n\t\tfor (let i = 0, l = points.length - 1; i < l; i++) {\n\t\t\tconst offset = i * 2;\n\t\t\tindices.push(offset, offset + 1, offset + 2);\n\t\t\tindices.push(offset + 2, offset + 1, offset + 3);\n\t\t}\n\n\t\tconst positionBuffer = new Buffer(new Float32Array(positions), 3);\n\t\tconst uvBuffer = new Buffer(new Float32Array(uvs), 2);\n\t\tconst pidBuffer = new Buffer(new Float32Array(pids), 1);\n\t\tconst indexBuffer = new Buffer(new Uint16Array(indices), 1);\n\n\t\tgeometry.addAttribute('a_Position', new Attribute(positionBuffer));\n\t\tgeometry.addAttribute('a_Uv', new Attribute(uvBuffer));\n\t\tgeometry.addAttribute('a_Info', new Attribute(pidBuffer));\n\t\tgeometry.setIndex(new Attribute(indexBuffer));\n\t\tgeometry.computeBoundingBox();\n\t\tgeometry.computeBoundingSphere();\n\n\t\t// Set curve path\n\n\t\tconst curvePath = this.curvePath;\n\t\tconst curvePts = xCoords.map((xCoord, i) => new Vector2(xCoord, values[i]));\n\t\tcurvePath.setSmoothCurves(curvePts, { smooth });\n\n\t\t// Set material\n\t\tconst infoMap = createCurveTexture(curvePath);\n\t\tthis.material.uniforms.infoMap = infoMap;\n\t\tthis.material.defines.INFO_TEXTURE_SIZE = infoMap.image.width;\n\t}\n\n\tclear() {\n\t\tthis.geometry.dispose();\n\t\tif (this.material.uniforms.infoMap) {\n\t\t\tthis.material.uniforms.infoMap.dispose();\n\t\t}\n\t\tthis.material.dispose();\n\t\tthis.curvePath.curves.length = 0;\n\t}\n\n}\n\nconst _defaultUp = new Vector3(0, 1, 0);\n\nconst _vec3_1 = new Vector3();\n\nconst LineChartFillShader = {\n\tname: 'line_chart_fill',\n\tdefines: {\n\t\tINFO_TEXTURE_SIZE: 32,\n\t\tUV_TYPE: 0,\n\t\tEDGE_GAMMA: 0.003\n\t},\n\tuniforms: {\n\t\tinfoMap: null\n\t},\n\tvertexShader: `\n    \tattribute vec3 a_Position;\n\t\tattribute vec2 a_Uv;\n\t\tattribute float a_Info;\n\n\t\tvarying vec2 v_Uv;\n\t\tvarying float v_Info;\n\n\t\tuniform mat4 u_ProjectionView;\n\t\tuniform mat4 u_Model;\n\n\t\tvoid main() {\n\t\t\tgl_Position = u_ProjectionView * u_Model * vec4(a_Position, 1.0);\n\n\t\t\tv_Uv = a_Uv;\n\t\t\tv_Info = a_Info;\n\t\t}\n    `,\n\tfragmentShader: `\n\t\tuniform float u_Opacity;\n\t\tuniform vec3 u_Color;\n\n\t\t#ifdef USE_DIFFUSE_MAP\n\t\t\tuniform sampler2D diffuseMap;\n\t\t#endif\n\n\t\t#ifdef USE_ALPHA_MAP\n\t\t\tuniform sampler2D alphaMap;\n\t\t#endif\n\n\t\tuniform sampler2D infoMap;\n\n\t\tvarying vec2 v_Uv;\n\t\tvarying float v_Info;\n\n\t\tvec2 Cubic(float t, vec2 p0, vec2 p1, vec2 p2, vec2 p3) {\n\t\t\tfloat k = 1.0 - t;\n\t\t\tfloat k2 = k * k;\n\t\t\tfloat k3 = k2 * k;\n\t\t\tfloat t2 = t * t;\n\t\t\tfloat t3 = t2 * t;\n\t\t\treturn k3 * p0 + 3.0 * k2 * t * p1 + 3.0 * k * t2 * p2 + t3 * p3;\n\t\t}\n\n\t\tvec2 CubicDerivative(float t, vec2 p0, vec2 p1, vec2 p2, vec2 p3) {\n            float k = 1.0 - t;\n            return 3.0 * k * k * (p1 - p0) + 6.0 * k * t * (p2 - p1) + 3.0 * t * t * (p3 - p2);\n        }\n\n\t\tfloat findTforCoord(float target, float p0, float p1, float p2, float p3) {\n\t\t\tfloat a = -p0 + 3.0 * p1 - 3.0 * p2 + p3;\n\t\t\tfloat b = 3.0 * p0 - 6.0 * p1 + 3.0 * p2;\n\t\t\tfloat c = -3.0 * p0 + 3.0 * p1;\n\t\t\tfloat d = p0 - target;\n\n\t\t\tfloat t = 0.5;\n\t\t\tfor(int i = 0; i < 3; i++) {\n\t\t\t\tfloat ft = ((a * t + b) * t + c) * t + d;  // f(t)\n\t\t\t\tfloat ft_prime = (3.0 * a * t + 2.0 * b) * t + c; // f'(t)\n\n\t\t\t\tif(abs(ft_prime) < 1e-6) break;\n\n\t\t\t\tt = t - ft / ft_prime;\n\t\t\t\tt = clamp(t, 0.0, 1.0);\n\t\t\t}\n\n\t\t\treturn t;\n\t\t}\n\n\t\tvec4 getCurveInfo(int index) {\n\t\t\treturn texelFetch(infoMap, ivec2((index % INFO_TEXTURE_SIZE), index / INFO_TEXTURE_SIZE), 0);\n\t\t}\n\n\t\tvoid main() {\n\t\t\tint index = int(v_Info);\n\t\t\tfloat u = fract(v_Info);\n\n\t\t\tvec4 info1 = getCurveInfo(index - 1);\n            vec4 info2 = getCurveInfo(index);\n\n\t\t\tvec2 coord = vec2(mix(info1.x, info2.x, u), v_Uv.y);\n\n\t\t\tif(coord.y > max(info1.y, info2.y)) {\n\t\t\t\tdiscard;\n\t\t\t}\n\n\t\t\tvec4 outColor = vec4(u_Color, u_Opacity);\n\n\t\t\t#ifdef USE_ALPHA_MAP\n\t\t\t\toutColor.a *= texture2D(alphaMap, vec2(v_Uv.y, 0.5)).g;\n\t\t\t#endif\n\n\t\t\t#if defined(USE_DIFFUSE_MAP) && UV_TYPE == 0\n\t\t\t\toutColor *= texture2D(diffuseMap, v_Uv.yx);\n\t\t\t#endif\n\n\t\t\t#if !defined(USE_DIFFUSE_MAP) || UV_TYPE == 0\n\t\t\t\tif(coord.y < min(info1.y, info2.y)) {\n\t\t\t\t\tgl_FragColor = outColor;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t#endif\n\n\t\t\tvec2 pos1 = info1.xy;\n\t\t\tvec2 pos2 = info2.xy;\n\n\t\t\tvec4 info0 = getCurveInfo(index - 2);\n\n\t\t\tvec2 pos0 = info0.xy;\n\n\t\t\tvec2 v11 =  info1.zw;\n\t\t\tvec2 v22 =  info2.zw;\n\n\t\t\tvec2 p0 = info1.xy;\n\t\t\tvec2 p3 = info2.xy;\n\n\t\t\tfloat ctrlLength1 = length(pos1 - pos0);\n\t\t\tfloat ctrlLength2 = length(pos2 - pos1);\n\n\t\t\tvec2 p1 = p0 + (p0 - v11) * ctrlLength2 / ctrlLength1;\n\t\t\tvec2 p2 = v22;\n\n\t\t\tfloat t = findTforCoord(coord.x, p0.x, p1.x, p2.x, p3.x);\n\n\t\t\tvec2 curvePoint = Cubic(t, p0, p1, p2, p3);\n\n\t\t\t#if defined(USE_DIFFUSE_MAP) && UV_TYPE == 1\n\t\t\t\toutColor *= texture2D(diffuseMap, vec2(curvePoint.y, 0.5));\n\t\t\t#endif\n\n\t\t\tfloat gamma = EDGE_GAMMA * abs(info1.y - info2.y);\n\t\t\tfloat fillAlpha = 1.0 - smoothstep(curvePoint.y - gamma, curvePoint.y + gamma, coord.y);\n\n\t\t\tif(fillAlpha < 0.001) {\n\t\t\t\tdiscard;\n\t\t\t}\n\n\t\t\tgl_FragColor = vec4(outColor.rgb, outColor.a * fillAlpha);\n\t\t}\n    `\n};\n\nfunction createCurveTexture(curvePath) {\n\tconst curveData = [];\n\n\tconst firstCurve = curvePath.curves[0];\n\n\tif (firstCurve.isLineCurve2) {\n\t\tcurveData.push(\n\t\t\tcurvePath.curves[0].v1.x,\n\t\t\tcurvePath.curves[0].v1.y,\n\t\t\tcurvePath.curves[0].v1.x,\n\t\t\tcurvePath.curves[0].v1.y\n\t\t);\n\t} else {\n\t\tcurveData.push(\n\t\t\tcurvePath.curves[0].v0.x,\n\t\t\tcurvePath.curves[0].v0.y,\n\t\t\tcurvePath.curves[0].v0.x,\n\t\t\tcurvePath.curves[0].v0.y\n\t\t);\n\t}\n\n\tcurvePath.curves.forEach(curve => {\n\t\tif (curve.isLineCurve2) {\n\t\t\tcurveData.push(\n\t\t\t\tcurve.v2.x,\n\t\t\t\tcurve.v2.y,\n\t\t\t\tcurve.v2.x,\n\t\t\t\tcurve.v2.y\n\t\t\t);\n\t\t} else {\n\t\t\tcurveData.push(\n\t\t\t\tcurve.v3.x,\n\t\t\t\tcurve.v3.y,\n\t\t\t\tcurve.v2.x,\n\t\t\t\tcurve.v2.y\n\t\t\t);\n\t\t}\n\t});\n\n\tconst size = MathUtils.nextPowerOfTwoSquareSize(curveData.length / 4);\n\n\tconst data = new Float32Array(size * size * 4);\n\tdata.set(curveData);\n\n\tconst texture = new Texture2D();\n\ttexture.generateMipmaps = false;\n\ttexture.magFilter = TEXTURE_FILTER.NEAREST;\n\ttexture.minFilter = TEXTURE_FILTER.NEAREST;\n\ttexture.flipY = false;\n\ttexture.image = { data, width: size, height: size };\n\ttexture.type = PIXEL_TYPE.FLOAT;\n\n\treturn texture;\n}\n\nfunction calculateCumulativeDistances(points, scalar = 1) {\n\tlet totalDist = 0;\n\treturn points.map((point, i, arr) => {\n\t\tif (i > 0) totalDist += point.distanceTo(arr[i - 1]);\n\t\treturn totalDist * scalar;\n\t});\n}\n\nexport { LineChartFillMesh };"
  },
  {
    "path": "examples/jsm/objects/OcclusionTester.js",
    "content": "import { Mesh, Query, QUERY_TYPE } from 't3d';\n\n// deprecated since v0.4.4\n// console.warn('OcclusionTester has been deprecated. Use addons/misc/OcclusionProxyManager instead.');\n\nclass OcclusionTester extends Mesh {\n\n\tconstructor(geometry, material) {\n\t\tsuper(geometry, material);\n\n\t\t// Set renderLayer to 1 by default.\n\t\t// This can be changed by user\n\t\t// to make sure the occlusion tester is rendered after other objects.\n\t\tthis.renderLayer = 1;\n\n\t\tthis.queryType = QUERY_TYPE.ANY_SAMPLES_PASSED_CONSERVATIVE;\n\n\t\tthis.onOcclusionChange = null;\n\n\t\tthis.$query = new Query();\n\t\tthis.$inProgress = false;\n\t\tthis.$occluded = false;\n\t}\n\n\tget occluded() {\n\t\treturn this.$occluded;\n\t}\n\n\tupdate(renderer) {\n\t\tif (!this.$inProgress) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (!renderer.isQueryResultAvailable(this.$query)) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.$inProgress = false;\n\n\t\tconst occluded = !renderer.getQueryResult(this.$query);\n\n\t\tif (this.$occluded !== occluded) {\n\t\t\tthis.$occluded = occluded;\n\t\t\tthis.onOcclusionChange && this.onOcclusionChange(occluded);\n\t\t}\n\t}\n\n\tdispose() {\n\t\tthis.$query.dispose();\n\t\tthis.$occluded = false;\n\t\tthis.$inProgress = false;\n\t}\n\n}\n\nfunction OcclusionIfRender(renderable) {\n\treturn !renderable.object.$inProgress;\n}\n\nfunction OcclusionBeforeRender(renderable) {\n\tconst tester = renderable.object;\n\tthis.beginQuery(tester.$query, tester.queryType);\n}\n\nfunction OcclusionAfterRender(renderable) {\n\tconst tester = renderable.object;\n\tthis.endQuery(tester.$query);\n\ttester.$inProgress = true;\n}\n\nexport {\n\tOcclusionTester,\n\tOcclusionIfRender,\n\tOcclusionBeforeRender,\n\tOcclusionAfterRender\n};"
  },
  {
    "path": "examples/jsm/objects/OctreeHelper.js",
    "content": "import { Mesh, Geometry, BasicMaterial, DRAW_MODE, BLEND_TYPE, Attribute, Buffer } from 't3d';\n\nclass OctreeHelper extends Mesh {\n\n\tconstructor(color = 0x000900) {\n\t\tconst geometry = new Geometry();\n\n\t\tconst material = new BasicMaterial();\n\t\tmaterial.drawMode = DRAW_MODE.LINES;\n\t\tmaterial.transparent = true;\n\t\tmaterial.blending = BLEND_TYPE.ADD;\n\t\tmaterial.diffuse.setHex(color);\n\t\tmaterial.envMap = undefined;\n\t\tmaterial.fog = false;\n\n\t\tsuper(geometry, material);\n\t}\n\n\tupdate(octree, updateBoundings = true) {\n\t\tconst vertices = [];\n\n\t\tconst traverse = tree => {\n\t\t\tfor (let i = 0; i < tree.length; i++) {\n\t\t\t\tif (tree[i].isEmpty()) continue;\n\n\t\t\t\tconst min = tree[i].box.min;\n\t\t\t\tconst max = tree[i].box.max;\n\n\t\t\t\tvertices.push(max.x, max.y, max.z); vertices.push(min.x, max.y, max.z); // 0, 1\n\t\t\t\tvertices.push(min.x, max.y, max.z); vertices.push(min.x, min.y, max.z); // 1, 2\n\t\t\t\tvertices.push(min.x, min.y, max.z); vertices.push(max.x, min.y, max.z); // 2, 3\n\t\t\t\tvertices.push(max.x, min.y, max.z); vertices.push(max.x, max.y, max.z); // 3, 0\n\n\t\t\t\tvertices.push(max.x, max.y, min.z); vertices.push(min.x, max.y, min.z); // 4, 5\n\t\t\t\tvertices.push(min.x, max.y, min.z); vertices.push(min.x, min.y, min.z); // 5, 6\n\t\t\t\tvertices.push(min.x, min.y, min.z); vertices.push(max.x, min.y, min.z); // 6, 7\n\t\t\t\tvertices.push(max.x, min.y, min.z); vertices.push(max.x, max.y, min.z); // 7, 4\n\n\t\t\t\tvertices.push(max.x, max.y, max.z); vertices.push(max.x, max.y, min.z); // 0, 4\n\t\t\t\tvertices.push(min.x, max.y, max.z); vertices.push(min.x, max.y, min.z); // 1, 5\n\t\t\t\tvertices.push(min.x, min.y, max.z); vertices.push(min.x, min.y, min.z); // 2, 6\n\t\t\t\tvertices.push(max.x, min.y, max.z); vertices.push(max.x, min.y, min.z); // 3, 7\n\n\t\t\t\ttraverse(tree[i].subTrees);\n\t\t\t}\n\t\t};\n\n\t\ttraverse(octree.subTrees);\n\n\t\tthis.geometry.dispose();\n\t\tthis.geometry.addAttribute('a_Position', new Attribute(new Buffer(new Float32Array(vertices), 3)));\n\t\tif (updateBoundings) {\n\t\t\tthis.geometry.computeBoundingSphere();\n\t\t\tthis.geometry.computeBoundingBox();\n\t\t}\n\t\tthis.geometry.version++;\n\t}\n\n}\n\nexport { OctreeHelper };"
  },
  {
    "path": "examples/jsm/objects/ParticleContainer.js",
    "content": "import {\n\tAttribute,\n\tBLEND_TYPE,\n\tBUFFER_USAGE,\n\tBuffer,\n\tColor3,\n\tDRAW_MODE,\n\tGeometry,\n\tMesh,\n\tShaderMaterial,\n\tVector3\n} from 't3d';\n\n/*\n * A particle container\n * reference three.js - flimshaw - Charlie Hoey - http://charliehoey.com\n */\nclass ParticleContainer extends Mesh {\n\n\tconstructor(options = {}) {\n\t\tsuper(new Geometry(), new ShaderMaterial(ParticleContainer.GPUParticleShader));\n\n\t\tthis.maxParticleCount = options.maxParticleCount || 10000;\n\t\tthis.particleNoiseTex = options.particleNoiseTex || null;\n\t\tthis.particleSpriteTex = options.particleSpriteTex || null;\n\n\t\tconst vertices = [];\n\t\tfor (let i = 0; i < this.maxParticleCount; i++) {\n\t\t\tvertices[i * 8 + 0] = 100; // x\n\t\t\tvertices[i * 8 + 1] = 0; // y\n\t\t\tvertices[i * 8 + 2] = 0; // z\n\t\t\tvertices[i * 8 + 3] = 0.0; // startTime\n\t\t\tvertices[i * 8 + 4] = decodeFloat(128, 128, 0, 0); // vel\n\t\t\tvertices[i * 8 + 5] = decodeFloat(0, 254, 0, 254); // color\n\t\t\tvertices[i * 8 + 6] = 1.0; // size\n\t\t\tvertices[i * 8 + 7] = 0.0; // lifespan\n\t\t}\n\t\tconst buffer = new Buffer(new Float32Array(vertices), 8);\n\t\tbuffer.usage = BUFFER_USAGE.DYNAMIC_DRAW;\n\t\tlet attribute;\n\t\tattribute = new Attribute(buffer, 3, 0);\n\t\tthis.geometry.addAttribute('a_Position', attribute);\n\t\tattribute = new Attribute(buffer, 4, 0);\n\t\tthis.geometry.addAttribute('particlePositionsStartTime', attribute);\n\t\tattribute = new Attribute(buffer, 4, 4);\n\t\tthis.geometry.addAttribute('particleVelColSizeLife', attribute);\n\n\t\tthis.particleCursor = 0;\n\n\t\tthis.material.uniforms['tSprite'] = this.particleSpriteTex;\n\t\tthis.material.uniforms['tNoise'] = this.particleNoiseTex;\n\t\tthis.material.transparent = true;\n\t\tthis.material.blending = BLEND_TYPE.ADD;\n\t\tthis.material.depthTest = true;\n\t\tthis.material.depthWrite = false;\n\t\tthis.material.drawMode = DRAW_MODE.POINTS;\n\n\t\tthis.frustumCulled = false;\n\t}\n\n\tupdate(time) {\n\t\tthis.material.uniforms.uTime = time;\n\t}\n\n\tspawn(options = {}) {\n\t\tposition = options.position !== undefined ? position.copy(options.position) : position.set(0., 0., 0.);\n\t\tvelocity = options.velocity !== undefined ? velocity.copy(options.velocity) : velocity.set(0., 0., 0.);\n\t\tpositionRandomness = options.positionRandomness !== undefined ? options.positionRandomness : 0.0;\n\t\tvelocityRandomness = options.velocityRandomness !== undefined ? options.velocityRandomness : 0.0;\n\t\tcolor = options.color !== undefined ? color.copy(options.color) : color.setRGB(1, 1, 1);\n\t\tcolorRandomness = options.colorRandomness !== undefined ? options.colorRandomness : 1.0;\n\t\tturbulence = options.turbulence !== undefined ? options.turbulence : 1.0;\n\t\tlifetime = options.lifetime !== undefined ? options.lifetime : 5.0;\n\t\tsize = options.size !== undefined ? options.size : 10;\n\t\tsizeRandomness = options.sizeRandomness !== undefined ? options.sizeRandomness : 0.0;\n\n\t\tconst cursor = this.particleCursor;\n\t\tconst particlePositionsStartTimeAttribute = this.geometry.getAttribute('particlePositionsStartTime');\n\t\tconst buffer = particlePositionsStartTimeAttribute.buffer;\n\t\tconst vertices = buffer.array;\n\t\tconst vertexSize = buffer.stride;\n\n\t\tvertices[cursor * vertexSize + 0] = position.x + (Math.random() - 0.5) * positionRandomness; // x\n\t\tvertices[cursor * vertexSize + 1] = position.y + (Math.random() - 0.5) * positionRandomness; // y\n\t\tvertices[cursor * vertexSize + 2] = position.z + (Math.random() - 0.5) * positionRandomness; // z\n\t\tvertices[cursor * vertexSize + 3] = this.material.uniforms.uTime + (Math.random() - 0.5) * 2e-2; // startTime\n\n\t\tlet velX = velocity.x + (Math.random() - 0.5) * velocityRandomness;\n\t\tlet velY = velocity.y + (Math.random() - 0.5) * velocityRandomness;\n\t\tlet velZ = velocity.z + (Math.random() - 0.5) * velocityRandomness;\n\n\t\t// convert turbulence rating to something we can pack into a vec4\n\t\tturbulence = Math.floor(turbulence * 254);\n\n\t\t// clamp our value to between 0. and 1.\n\t\tvelX = Math.floor(maxSource * ((velX - -maxVel) / (maxVel - -maxVel)));\n\t\tvelY = Math.floor(maxSource * ((velY - -maxVel) / (maxVel - -maxVel)));\n\t\tvelZ = Math.floor(maxSource * ((velZ - -maxVel) / (maxVel - -maxVel)));\n\n\t\tvertices[cursor * vertexSize + 4] = decodeFloat(velX, velY, velZ, turbulence); // velocity\n\n\t\tlet r = color.r * 254 + (Math.random() - 0.5) * colorRandomness * 254;\n\t\tlet g = color.g * 254 + (Math.random() - 0.5) * colorRandomness * 254;\n\t\tlet b = color.b * 254 + (Math.random() - 0.5) * colorRandomness * 254;\n\t\tif (r > 254) r = 254;\n\t\tif (r < 0) r = 0;\n\t\tif (g > 254) g = 254;\n\t\tif (g < 0) g = 0;\n\t\tif (b > 254) b = 254;\n\t\tif (b < 0) b = 0;\n\t\tvertices[cursor * vertexSize + 5] = decodeFloat(r, g, b, 254); // color\n\n\t\tvertices[cursor * vertexSize + 6] = size + (Math.random() - 0.5) * sizeRandomness; // size\n\n\t\tvertices[cursor * vertexSize + 7] = lifetime; // lifespan\n\n\t\tthis.particleCursor++;\n\n\t\tif (this.particleCursor >= this.maxParticleCount) {\n\t\t\tthis.particleCursor = 0;\n\t\t\tbuffer.version++;\n\t\t\tbuffer.updateRange.offset = 0;\n\t\t\tbuffer.updateRange.count = -1;\n\t\t} else {\n\t\t\tbuffer.version++;\n\t\t\tif (buffer.updateRange.count > -1) {\n\t\t\t\tbuffer.updateRange.count = this.particleCursor * vertexSize - buffer.updateRange.offset;\n\t\t\t} else {\n\t\t\t\tbuffer.updateRange.offset = cursor * vertexSize;\n\t\t\t\tbuffer.updateRange.count = vertexSize;\n\t\t\t}\n\t\t}\n\t}\n\n}\n\nlet position = new Vector3();\nlet velocity = new Vector3();\nlet positionRandomness = 0;\nlet velocityRandomness = 0;\nlet color = new Color3();\nlet colorRandomness = 0;\nlet turbulence = 0;\nlet lifetime = 0;\nlet size = 0;\nlet sizeRandomness = 0;\n\nconst maxVel = 2;\nconst maxSource = 250;\n\n// construct a couple small arrays used for packing variables into floats etc\n\nconst UINT8_VIEW = new Uint8Array(4);\nconst FLOAT_VIEW = new Float32Array(UINT8_VIEW.buffer);\n\nfunction decodeFloat(x, y, z, w) {\n\tUINT8_VIEW[0] = Math.floor(w);\n\tUINT8_VIEW[1] = Math.floor(z);\n\tUINT8_VIEW[2] = Math.floor(y);\n\tUINT8_VIEW[3] = Math.floor(x);\n\treturn FLOAT_VIEW[0];\n}\n\nParticleContainer.GPUParticleShader = {\n\n\tname: 'particle_container',\n\n\tuniforms: {\n\t\ttSprite: null,\n\t\ttNoise: null,\n\t\tuTime: 0,\n\t\tuScale: 1\n\t},\n\n\tvertexShader: [\n\n\t\t'const vec4 bitSh = vec4(256. * 256. * 256., 256. * 256., 256., 1.);',\n\t\t'const vec4 bitMsk = vec4(0.,vec3(1./256.0));',\n\t\t'const vec4 bitShifts = vec4(1.) / bitSh;',\n\n\t\t'#define FLOAT_MAX\t1.70141184e38',\n\t\t'#define FLOAT_MIN\t1.17549435e-38',\n\n\t\t'lowp vec4 encode_float(highp float v) {',\n\t\t'   highp float av = abs(v);',\n\n\t\t// Handle special cases\n\t\t'   if(av < FLOAT_MIN) {',\n\t\t'       return vec4(0.0, 0.0, 0.0, 0.0);',\n\t\t'   } else if(v > FLOAT_MAX) {',\n\t\t'       return vec4(127.0, 128.0, 0.0, 0.0) / 255.0;',\n\t\t'   } else if(v < -FLOAT_MAX) {',\n\t\t'       return vec4(255.0, 128.0, 0.0, 0.0) / 255.0;',\n\t\t'   }',\n\n\t\t'   highp vec4 c = vec4(0,0,0,0);',\n\n\t\t// Compute exponent and mantissa\n\t\t'   highp float e = floor(log2(av));',\n\t\t'   highp float m = av * pow(2.0, -e) - 1.0;',\n\n\t\t// Unpack mantissa\n\t\t'   c[1] = floor(128.0 * m);',\n\t\t'   m -= c[1] / 128.0;',\n\t\t'   c[2] = floor(32768.0 * m);',\n\t\t'   m -= c[2] / 32768.0;',\n\t\t'   c[3] = floor(8388608.0 * m);',\n\n\t\t// Unpack exponent\n\t\t'   highp float ebias = e + 127.0;',\n\t\t'   c[0] = floor(ebias / 2.0);',\n\t\t'   ebias -= c[0] * 2.0;',\n\t\t'   c[1] += floor(ebias) * 128.0;',\n\n\t\t// Unpack sign bit\n\t\t'   c[0] += 128.0 * step(0.0, -v);',\n\n\t\t// Scale back to range\n\t\t'   return c / 255.0;',\n\t\t'}',\n\n\t\t'vec4 pack(const in float depth)',\n\t\t'{',\n\t\t'   const vec4 bit_shift = vec4(256.0*256.0*256.0, 256.0*256.0, 256.0, 1.0);',\n\t\t'   const vec4 bit_mask\t= vec4(0.0, 1.0/256.0, 1.0/256.0, 1.0/256.0);',\n\t\t'   vec4 res = mod(depth*bit_shift*vec4(255), vec4(256))/vec4(255);',\n\t\t'   res -= res.xxyz * bit_mask;',\n\t\t'   return res;',\n\t\t'}',\n\n\t\t'float unpack(const in vec4 rgba_depth)',\n\t\t'{',\n\t\t'   const vec4 bit_shift = vec4(1.0/(256.0*256.0*256.0), 1.0/(256.0*256.0), 1.0/256.0, 1.0);',\n\t\t'   float depth = dot(rgba_depth, bit_shift);',\n\t\t'   return depth;',\n\t\t'}',\n\n\t\t'uniform float uTime;',\n\t\t'uniform float uScale;',\n\t\t'uniform sampler2D tNoise;',\n\n\t\t'uniform mat4 u_ProjectionView;',\n\t\t'uniform mat4 u_Model;',\n\n\t\t'attribute vec4 particlePositionsStartTime;',\n\t\t'attribute vec4 particleVelColSizeLife;',\n\n\t\t'varying vec4 vColor;',\n\t\t'varying float lifeLeft;',\n\n\t\t'void main() {',\n\n\t\t'   // unpack things from our attributes',\n\t\t'   vColor = encode_float( particleVelColSizeLife.y );',\n\n\t\t'   // convert our velocity back into a value we can use',\n\t\t'   vec4 velTurb = encode_float( particleVelColSizeLife.x );',\n\t\t'   vec3 velocity = vec3( velTurb.xyz );',\n\t\t'   float turbulence = velTurb.w;',\n\n\t\t'   vec3 newPosition;',\n\n\t\t'   float timeElapsed = uTime - particlePositionsStartTime.a;',\n\n\t\t'   lifeLeft = 1. - (timeElapsed / particleVelColSizeLife.w);',\n\n\t\t'   gl_PointSize = ( uScale * particleVelColSizeLife.z ) * lifeLeft;',\n\n\t\t'   velocity.x = ( velocity.x - .5 ) * 3.;',\n\t\t'   velocity.y = ( velocity.y - .5 ) * 3.;',\n\t\t'   velocity.z = ( velocity.z - .5 ) * 3.;',\n\n\t\t'   newPosition = particlePositionsStartTime.xyz + ( velocity * 10. ) * ( uTime - particlePositionsStartTime.a );',\n\n\t\t'   vec3 noise = texture2D( tNoise, vec2( newPosition.x * .015 + (uTime * .05), newPosition.y * .02 + (uTime * .015) )).rgb;',\n\t\t'   vec3 noiseVel = ( noise.rgb - .5 ) * 30.;',\n\n\t\t'   newPosition = mix(newPosition, newPosition + vec3(noiseVel * ( turbulence * 5. ) ), (timeElapsed / particleVelColSizeLife.a) );',\n\n\t\t'   if( velocity.y > 0. && velocity.y < .05 ) {',\n\t\t'       lifeLeft = 0.;',\n\t\t'   }',\n\n\t\t'   if( velocity.x < -1.45 ) {',\n\t\t'       lifeLeft = 0.;',\n\t\t'   }',\n\n\t\t'   if( timeElapsed > 0. ) {',\n\t\t'       gl_Position = u_ProjectionView * u_Model * vec4( newPosition, 1.0 );',\n\t\t'   } else {',\n\t\t'       gl_Position = u_ProjectionView * u_Model * vec4( particlePositionsStartTime.xyz, 1.0 );',\n\t\t'       lifeLeft = 0.;',\n\t\t'       gl_PointSize = 0.;',\n\t\t'   }',\n\t\t'}'\n\n\t].join('\\n'),\n\n\tfragmentShader: [\n\n\t\t'float scaleLinear(float value, vec2 valueDomain) {',\n\t\t'   return (value - valueDomain.x) / (valueDomain.y - valueDomain.x);',\n\t\t'}',\n\n\t\t'float scaleLinear(float value, vec2 valueDomain, vec2 valueRange) {',\n\t\t'   return mix(valueRange.x, valueRange.y, scaleLinear(value, valueDomain));',\n\t\t'}',\n\n\t\t'varying vec4 vColor;',\n\t\t'varying float lifeLeft;',\n\n\t\t'uniform sampler2D tSprite;',\n\n\t\t'void main() {',\n\n\t\t'float alpha = 0.;',\n\n\t\t'   if( lifeLeft > .995 ) {',\n\t\t'       alpha = scaleLinear( lifeLeft, vec2(1., .995), vec2(0., 1.));',\n\t\t'       //mix( 0., 1., ( lifeLeft - .95 ) * 100. ) * .75;',\n\t\t'   } else {',\n\t\t'       alpha = lifeLeft * .75;',\n\t\t'   }',\n\n\t\t'   vec4 tex = texture2D( tSprite, gl_PointCoord );',\n\n\t\t'   gl_FragColor = vec4( vColor.rgb * tex.a, alpha * tex.a );',\n\t\t'}'\n\n\t].join('\\n')\n\n};\n\nexport { ParticleContainer };"
  },
  {
    "path": "examples/jsm/objects/PointLightHelper.js",
    "content": "import {\n\tLineMaterial,\n\tMesh,\n\tSphereGeometry\n} from 't3d';\n\nclass PointLightHelper extends Mesh {\n\n\tconstructor(light, sphereSize, color) {\n\t\tconst geometry = new SphereGeometry(sphereSize, 4, 2);\n\t\tconst material = new LineMaterial();\n\n\t\tsuper(geometry, material);\n\n\t\tthis.light = light;\n\n\t\tthis.color = color;\n\n\t\tthis.update();\n\t}\n\n\tupdate() {\n\t\tif (this.color !== undefined) {\n\t\t\tthis.material.diffuse.setHex(this.color);\n\t\t} else {\n\t\t\tthis.material.diffuse.copy(this.light.color);\n\t\t}\n\t}\n\n}\n\nexport { PointLightHelper };"
  },
  {
    "path": "examples/jsm/objects/PolarGridHelper.js",
    "content": "import {\n\tAttribute,\n\tBuffer,\n\tColor3,\n\tGeometry,\n\tLineMaterial,\n\tMesh,\n\tVERTEX_COLOR\n} from 't3d';\n\nclass PolarGridHelper extends Mesh {\n\n\tconstructor(radius, sectors, rings, divisions, color1, color2) {\n\t\tradius = radius || 10;\n\t\tsectors = sectors || 16;\n\t\trings = rings || 8;\n\t\tdivisions = divisions || 64;\n\t\tcolor1 = new Color3(color1 !== undefined ? color1 : 0x444444);\n\t\tcolor2 = new Color3(color2 !== undefined ? color2 : 0x888888);\n\n\t\tconst vertices = [];\n\t\tconst colors = [];\n\n\t\t// create the sectors\n\t\tif (sectors > 1) {\n\t\t\tfor (let i = 0; i < sectors; i++) {\n\t\t\t\tconst v = (i / sectors) * (Math.PI * 2);\n\n\t\t\t\tconst x = Math.sin(v) * radius;\n\t\t\t\tconst z = Math.cos(v) * radius;\n\n\t\t\t\tvertices.push(0, 0, 0);\n\t\t\t\tvertices.push(x, 0, z);\n\n\t\t\t\tconst color = (i & 1) ? color1 : color2;\n\n\t\t\t\tcolors.push(color.r, color.g, color.b, 1);\n\t\t\t\tcolors.push(color.r, color.g, color.b, 1);\n\t\t\t}\n\t\t}\n\n\t\t// create the rings\n\t\tfor (let i = 0; i < rings; i++) {\n\t\t\tconst color = (i & 1) ? color1 : color2;\n\n\t\t\tconst r = radius - (radius / rings * i);\n\n\t\t\tfor (let j = 0; j < divisions; j++) {\n\t\t\t\t// first vertex\n\t\t\t\tlet v = (j / divisions) * (Math.PI * 2);\n\n\t\t\t\tlet x = Math.sin(v) * r;\n\t\t\t\tlet z = Math.cos(v) * r;\n\n\t\t\t\tvertices.push(x, 0, z);\n\t\t\t\tcolors.push(color.r, color.g, color.b, 1);\n\n\t\t\t\t// second vertex\n\t\t\t\tv = ((j + 1) / divisions) * (Math.PI * 2);\n\n\t\t\t\tx = Math.sin(v) * r;\n\t\t\t\tz = Math.cos(v) * r;\n\n\t\t\t\tvertices.push(x, 0, z);\n\t\t\t\tcolors.push(color.r, color.g, color.b, 1);\n\t\t\t}\n\t\t}\n\n\t\tconst geometry = new Geometry();\n\t\tgeometry.addAttribute('a_Position', new Attribute(new Buffer(new Float32Array(vertices), 3)));\n\t\tgeometry.addAttribute('a_Color', new Attribute(new Buffer(new Float32Array(colors), 4)));\n\n\t\t// Skip update bounding box\n\t\t// Because we may not want to consider the helper's bounding box\n\t\tgeometry.computeBoundingSphere();\n\n\t\tconst material = new LineMaterial();\n\t\tmaterial.vertexColors = VERTEX_COLOR.RGBA;\n\n\t\tsuper(geometry, material);\n\t}\n\n}\n\nPolarGridHelper.prototype.isPolarGridHelper = true;\n\nexport { PolarGridHelper };"
  },
  {
    "path": "examples/jsm/objects/RectAreaLightHelper.js",
    "content": "import {\n\tAttribute,\n\tBuffer,\n\tDRAW_MODE,\n\tGeometry,\n\tBasicMaterial,\n\tMesh,\n\tObject3D\n} from 't3d';\n\nclass RectAreaLightHelper extends Object3D {\n\n\tconstructor(light, color) {\n\t\tsuper();\n\n\t\tthis.light = light;\n\n\t\tthis.color = color;\n\n\t\tthis.width = light.width;\n\t\tthis.height = light.height;\n\n\t\tconst planeGeometry = new Geometry();\n\t\tplaneGeometry.addAttribute('a_Position', new Attribute(new Buffer(new Float32Array([\n\t\t\t-this.width / 2, this.height / 2, 0,\n\t\t\tthis.width / 2, this.height / 2, 0,\n\t\t\tthis.width / 2, -this.height / 2, 0,\n\t\t\t-this.width / 2, -this.height / 2, 0,\n\t\t\t-this.width / 2, this.height / 2, 0,\n\t\t\tthis.width / 2, this.height / 2, 0,\n\t\t\t-this.width / 2, this.height / 2, 0,\n\t\t\tthis.width / 2, -this.height / 2, 0,\n\t\t\t-this.width / 2, -this.height / 2, 0,\n\t\t\tthis.width / 2, this.height / 2, 0\n\t\t]), 3)));\n\t\tplaneGeometry.computeBoundingBox();\n\t\tplaneGeometry.computeBoundingSphere();\n\n\t\tconst lineGeometry = new Geometry();\n\t\tlineGeometry.addAttribute('a_Position', new Attribute(new Buffer(new Float32Array([\n\t\t\t0, 0, 0, 0, 0, -1\n\t\t]), 3)));\n\t\tlineGeometry.computeBoundingBox();\n\t\tlineGeometry.computeBoundingSphere();\n\n\t\tconst material = new BasicMaterial();\n\t\tmaterial.drawMode = DRAW_MODE.LINE_LOOP;\n\n\t\tthis.lightPlane = new Mesh(planeGeometry, material);\n\t\tthis.add(this.lightPlane);\n\n\t\tthis.targetLine = new Mesh(lineGeometry, material);\n\t\tthis.targetLine.scale.z = (this.height + this.width) / 10;\n\t\tthis.add(this.targetLine);\n\n\t\tthis.update();\n\t}\n\n\tupdate() {\n\t\tif (this.color !== undefined) {\n\t\t\tthis.lightPlane.material.diffuse.setHex(this.color);\n\t\t\tthis.targetLine.material.diffuse.setHex(this.color);\n\t\t} else {\n\t\t\tthis.lightPlane.material.diffuse.copy(this.light.color);\n\t\t\tthis.targetLine.material.diffuse.copy(this.light.color);\n\t\t}\n\t}\n\n}\n\nexport { RectAreaLightHelper };"
  },
  {
    "path": "examples/jsm/objects/SkeletonHelper.js",
    "content": "import {\n\tAttribute,\n\tBuffer,\n\tGeometry,\n\tMatrix4,\n\tMesh,\n\tObject3D,\n\tSphereGeometry,\n\tShaderMaterial,\n\tVector3\n} from 't3d';\n\nclass SkeletonHelper extends Object3D {\n\n\tconstructor(object) {\n\t\tsuper();\n\n\t\tconst bones = getBoneList(object);\n\n\t\tthis.root = object;\n\t\tthis.bones = bones;\n\n\t\tthis._midStep = 0.25;\n\n\t\tthis.midWidthScale = 0.1;\n\t\tthis.ballScale = 0.4;\n\n\t\t// create bone spheres and connectors\n\n\t\tconst material = new ShaderMaterial(skeletonShader);\n\t\tmaterial.depthTest = false;\n\t\tmaterial.depthWrite = false;\n\t\tthis._material = material;\n\n\t\tthis._sphereGeometry = new SphereGeometry(0.25, 16, 12);\n\t\tthis._connectorGeometry = new ConnectorGeometry();\n\n\t\tthis._distanceMap = new WeakMap();\n\n\t\tfor (let i = 0; i < bones.length; i++) {\n\t\t\tconst bone = bones[i];\n\n\t\t\tif (bone.parent && bone.parent.isBone) {\n\t\t\t\tconst boneSphere = new Mesh(this._sphereGeometry, this._material);\n\t\t\t\tboneSphere.receiveShadows = false;\n\t\t\t\tboneSphere.castShadows = false;\n\t\t\t\tboneSphere.renderOrder = 1;\n\t\t\t\tthis.add(boneSphere);\n\n\t\t\t\tconst boneConnector = new Mesh(this._connectorGeometry, this._material);\n\t\t\t\tboneConnector.receiveShadows = false;\n\t\t\t\tboneConnector.castShadows = false;\n\t\t\t\tthis.add(boneConnector);\n\n\t\t\t\tthis._distanceMap.set(bone.parent, 0);\n\t\t\t}\n\t\t}\n\t}\n\n\tset midStep(value) {\n\t\tthis._midStep = value;\n\t\tthis._connectorGeometry.updateMidStep(value);\n\t}\n\n\tget midStep() {\n\t\treturn this._midStep;\n\t}\n\n\tset colorMin(value) {\n\t\tthis._material.uniforms.u_colorMin = value;\n\t}\n\n\tget colorMin() {\n\t\treturn this._material.uniforms.u_colorMin;\n\t}\n\n\tset colorMax(value) {\n\t\tthis._material.uniforms.u_colorMax = value;\n\t}\n\n\tget colorMax() {\n\t\treturn this._material.uniforms.u_colorMax;\n\t}\n\n\tupdateMatrix(force) {\n\t\tconst bones = this.bones;\n\t\tconst midWidthScale = this.midWidthScale;\n\t\tconst ballScale = this.ballScale;\n\n\t\tconst distanceMap = this._distanceMap;\n\n\t\t_worldMatrixInv.copy(this.root.worldMatrix).invert();\n\n\t\tfor (let i = 0, j = 0; i < bones.length; i++) {\n\t\t\tconst bone = bones[i];\n\n\t\t\tif (bone.parent && bone.parent.isBone) {\n\t\t\t\t_boneEndMatrix.multiplyMatrices(_worldMatrixInv, bone.worldMatrix);\n\t\t\t\t_boneStartMatrix.multiplyMatrices(_worldMatrixInv, bone.parent.worldMatrix);\n\t\t\t\t_boneEnd.setFromMatrixPosition(_boneEndMatrix);\n\t\t\t\t_boneStart.setFromMatrixPosition(_boneStartMatrix);\n\n\t\t\t\t_boneDirection.subVectors(_boneEnd, _boneStart);\n\t\t\t\tconst boneDistance = _boneDirection.getLength();\n\t\t\t\t_boneDirection.normalize();\n\n\t\t\t\tbone._distance = boneDistance;\n\t\t\t\tdistanceMap.set(bone, boneDistance);\n\n\t\t\t\tlet minDistance = boneDistance;\n\t\t\t\tconst parentDistance = distanceMap.get(bone.parent);\n\t\t\t\tif (parentDistance) {\n\t\t\t\t\tminDistance = Math.min(minDistance, parentDistance);\n\t\t\t\t}\n\n\t\t\t\tconst sphere = this.children[j];\n\t\t\t\tsphere.position.copy(_boneStart);\n\t\t\t\tsphere.scale.set(1, 1, 1).multiplyScalar(minDistance * ballScale);\n\n\t\t\t\tconst connector = this.children[j + 1];\n\t\t\t\tconnector.position.copy(_boneStart);\n\t\t\t\tconnector.scale.set(midWidthScale, midWidthScale, 1).multiplyScalar(boneDistance);\n\t\t\t\tconnector.quaternion.setFromUnitVectors(new Vector3(0, 0, -1), _boneDirection);\n\n\t\t\t\tj += 2;\n\t\t\t}\n\t\t}\n\n\t\tsuper.updateMatrix(force);\n\t}\n\n}\n\nconst _worldMatrixInv = new Matrix4();\nconst _boneStartMatrix = new Matrix4();\nconst _boneEndMatrix = new Matrix4();\nconst _boneStart = new Vector3();\nconst _boneEnd = new Vector3();\nconst _boneDirection = new Vector3();\n\nfunction getBoneList(object) {\n\tconst boneList = [];\n\n\tif (object.isBone) {\n\t\tboneList.push(object);\n\t}\n\n\tfor (let i = 0; i < object.children.length; i++) {\n\t\tboneList.push.apply(boneList, getBoneList(object.children[i]));\n\t}\n\n\treturn boneList;\n}\n\nclass ConnectorGeometry extends Geometry {\n\n\tconstructor(midStep = 0.25) {\n\t\tsuper();\n\n\t\tconst vertexs = [\n\t\t\tnew Vector3(0, 0, 0),\n\t\t\tnew Vector3(1, -1, -midStep),\n\t\t\tnew Vector3(1, 1, -midStep),\n\t\t\tnew Vector3(-1, 1, -midStep),\n\t\t\tnew Vector3(-1, -1, -midStep),\n\t\t\tnew Vector3(1, -1, -midStep),\n\t\t\tnew Vector3(0, 0, -1)\n\t\t];\n\n\t\tconst normal = [\n\t\t\tnew Vector3(1, 0, 1),\n\t\t\tnew Vector3(0, 1, 1),\n\t\t\tnew Vector3(-1, 0, 1),\n\t\t\tnew Vector3(0, -1, 1),\n\t\t\tnew Vector3(1, 0, -1),\n\t\t\tnew Vector3(0, 1, -1),\n\t\t\tnew Vector3(-1, 0, -1),\n\t\t\tnew Vector3(0, -1, -1)\n\t\t];\n\n\t\tconst positions = [];\n\t\tconst normals = [];\n\n\t\tfor (let i = 0; i < 4; i++) {\n\t\t\tpositions.push(vertexs[0].x, vertexs[0].y, vertexs[0].z);\n\t\t\tpositions.push(vertexs[i + 1].x, vertexs[i + 1].y, vertexs[i + 1].z);\n\t\t\tpositions.push(vertexs[i + 2].x, vertexs[i + 2].y, vertexs[i + 2].z);\n\t\t\tnormals.push(normal[i].x, normal[i].y, normal[i].z);\n\t\t\tnormals.push(normal[i].x, normal[i].y, normal[i].z);\n\t\t\tnormals.push(normal[i].x, normal[i].y, normal[i].z);\n\n\t\t\tpositions.push(vertexs[6].x, vertexs[6].y, vertexs[6].z);\n\t\t\tpositions.push(vertexs[i + 2].x, vertexs[i + 2].y, vertexs[i + 2].z);\n\t\t\tpositions.push(vertexs[i + 1].x, vertexs[i + 1].y, vertexs[i + 1].z);\n\t\t\tnormals.push(normal[i + 4].x, normal[i + 4].y, normal[i + 4].z);\n\t\t\tnormals.push(normal[i + 4].x, normal[i + 4].y, normal[i + 4].z);\n\t\t\tnormals.push(normal[i + 4].x, normal[i + 4].y, normal[i + 4].z);\n\t\t}\n\n\t\tthis.addAttribute('a_Position', new Attribute(new Buffer(new Float32Array(positions), 3)));\n\t\tthis.addAttribute('a_Normal', new Attribute(new Buffer(new Float32Array(normals), 3)));\n\n\t\tthis.computeBoundingSphere();\n\t\tthis.computeBoundingBox();\n\t}\n\n\tupdateMidStep(midStep) {\n\t\tconst positions = this.getAttribute('a_Position').buffer.array;\n\n\t\tfor (let i = 0; i < 8; i++) {\n\t\t\tpositions[i * 9 + 5] = -midStep;\n\t\t\tpositions[i * 9 + 8] = -midStep;\n\t\t}\n\n\t\tthis.getAttribute('a_Position').buffer.version++;\n\n\t\t// boundings are not needed to be updated\n\t}\n\n}\n\nconst skeletonShader = {\n\tname: 'skeleton_shader',\n\n\tuniforms: {\n\t\t'u_colorMin': [0.35, 0.35, 0.35],\n\t\t'u_colorMax': [0.7, 0.7, 0.7]\n\t},\n\n\tvertexShader: `\n        #include <common_vert>\n\n\t\tvarying vec3 v_Normal;\n\n\t\tvoid main() {\n\t\t\tv_Normal = (transposeMat4(inverseMat4(u_Model)) * vec4(a_Normal, 0.0)).xyz;\n\t\t\tgl_Position = u_Projection * u_View * u_Model * vec4(a_Position, 1.0);\n\t\t}\n    `,\n\n\tfragmentShader: `\n        #include <common_frag>\n\n\t\tuniform vec3 u_colorMin;\n\t\tuniform vec3 u_colorMax;\n\n\t\tvarying vec3 v_Normal;\n\n\t\tvoid main() {\n            vec3 N = normalize(v_Normal);\n\t\t\tfloat ndl = dot(N, vec3(0, 1, 0)) * 0.5 + 0.5;\n\t\t\tvec3 diffuse = mix(u_colorMin, u_colorMax, ndl);\n\t\t\tgl_FragColor = vec4(diffuse, 1.0);\n\t\t}\n    `\n};\n\nexport { SkeletonHelper };"
  },
  {
    "path": "examples/jsm/objects/Sky.js",
    "content": "import {\n\tBoxGeometry,\n\tDRAW_SIDE,\n\tMesh,\n\tShaderMaterial\n} from 't3d';\n\n/**\n * Based on \"A Practical Analytic Model for Daylight\"\n * aka The Preetham Model, the de facto standard analytic skydome model\n * http://www.cs.utah.edu/~shirley/papers/sunsky/sunsky.pdf\n *\n * First implemented by Simon Wallner\n * http://www.simonwallner.at/projects/atmospheric-scattering\n *\n * Improved by Martin Upitis\n * http://blenderartists.org/forum/showthread.php?245954-preethams-sky-impementation-HDR\n *\n * Three.js integration by zz85 http://twitter.com/blurspline\n */\nclass Sky extends Mesh {\n\n\tconstructor(cubeTexture) {\n\t\tconst geometry = new BoxGeometry(1, 1, 1);\n\n\t\tconst material = new ShaderMaterial(Sky.SkyShader);\n\t\tmaterial.side = DRAW_SIDE.BACK;\n\t\tmaterial.cubeMap = cubeTexture;\n\n\t\tsuper(geometry, material);\n\n\t\tthis.frustumCulled = false;\n\t}\n\n}\n\nSky.SkyShader = {\n\tname: 'shader_sky',\n\tuniforms: {\n\t\tluminance: 1,\n\t\tturbidity: 2,\n\t\trayleigh: 1,\n\t\tmieCoefficient: 0.005,\n\t\tmieDirectionalG: 0.8,\n\t\tsunPosition: [0, 0, 0]\n\t},\n\tvertexShader: `\n\t\t#include <common_vert>\n\n\t\tuniform vec3 sunPosition;\n\t\tuniform float rayleigh;\n\t\tuniform float turbidity;\n\t\tuniform float mieCoefficient;\n\n\t\tvarying vec3 vWorldPosition;\n\t\tvarying vec3 vSunDirection;\n\t\tvarying float vSunfade;\n\t\tvarying vec3 vBetaR;\n\t\tvarying vec3 vBetaM;\n\t\tvarying float vSunE;\n\n\t\tconst vec3 up = vec3( 0.0, 1.0, 0.0 );\n\n\t\t// constants for atmospheric scattering\n\t\tconst float e = 2.71828182845904523536028747135266249775724709369995957;\n\t\tconst float pi = 3.141592653589793238462643383279502884197169;\n\n\t\t// wavelength of used primaries, according to preetham\n\t\tconst vec3 lambda = vec3( 680E-9, 550E-9, 450E-9 );\n\t\t// this pre-calcuation replaces older TotalRayleigh(vec3 lambda) function:\n\t\t// (8.0 * pow(pi, 3.0) * pow(pow(n, 2.0) - 1.0, 2.0) * (6.0 + 3.0 * pn)) / (3.0 * N * pow(lambda, vec3(4.0)) * (6.0 - 7.0 * pn))\n\t\tconst vec3 totalRayleigh = vec3( 5.804542996261093E-6, 1.3562911419845635E-5, 3.0265902468824876E-5 );\n\n\t\t// mie stuff\n\t\t// K coefficient for the primaries\n\t\tconst float v = 4.0;\n\t\tconst vec3 K = vec3( 0.686, 0.678, 0.666 );\n\t\t// MieConst = pi * pow( ( 2.0 * pi ) / lambda, vec3( v - 2.0 ) ) * K\n\t\tconst vec3 MieConst = vec3( 1.8399918514433978E14, 2.7798023919660528E14, 4.0790479543861094E14 );\n\n\t\t// earth shadow hack\n\t\t// cutoffAngle = pi / 1.95;\n\t\tconst float cutoffAngle = 1.6110731556870734;\n\t\tconst float steepness = 1.5;\n\t\tconst float EE = 1000.0;\n\n\t\tfloat sunIntensity( float zenithAngleCos ) {\n\t\t\tzenithAngleCos = clamp( zenithAngleCos, -1.0, 1.0 );\n\t\t\treturn EE * max( 0.0, 1.0 - pow( e, -( ( cutoffAngle - acos( zenithAngleCos ) ) / steepness ) ) );\n\t\t}\n\n\t\tvec3 totalMie( float T ) {\n\t\t\tfloat c = ( 0.2 * T ) * 10E-18;\n\t\t\treturn 0.434 * c * MieConst;\n\t\t}\n\n\t\tvoid main() {\n\t\t\tmat4 modelMatrix = u_Model;\n\t\t\tmat4 viewMatrix = u_View;\n\n\t\t\tvec3 zero = vec3(0., 0., 0.);\n\n\t\t\tmodelMatrix[3].xyz = zero;\n\t\t\tviewMatrix[3].xyz = zero;\n\n\t\t\tvec4 worldPosition = modelMatrix * vec4(a_Position, 0.0);\n\t\t\tvWorldPosition = worldPosition.xyz;\n\n\t\t\tgl_Position = u_Projection * viewMatrix * modelMatrix * vec4(a_Position, 1.0);\n\t\t\tgl_Position.z = gl_Position.w; // set z to camera.far\n\n\t\t\tvSunDirection = normalize( sunPosition );\n\n\t\t\tvSunE = sunIntensity( dot( vSunDirection, up ) );\n\n\t\t\tvSunfade = 1.0 - clamp( 1.0 - exp( ( sunPosition.y / 450000.0 ) ), 0.0, 1.0 );\n\n\t\t\tfloat rayleighCoefficient = rayleigh - ( 1.0 * ( 1.0 - vSunfade ) );\n\n\t\t\t// extinction (absorbtion + out scattering)\n\t\t\t// rayleigh coefficients\n\t\t\tvBetaR = totalRayleigh * rayleighCoefficient;\n\n\t\t\t// mie coefficients\n\t\t\tvBetaM = totalMie( turbidity ) * mieCoefficient;\n\t\t}\n\t`,\n\tfragmentShader: `\n\t\tvarying vec3 vWorldPosition;\n\t\tvarying vec3 vSunDirection;\n\t\tvarying float vSunfade;\n\t\tvarying vec3 vBetaR;\n\t\tvarying vec3 vBetaM;\n\t\tvarying float vSunE;\n\n\t\tuniform float luminance;\n\t\tuniform float mieDirectionalG;\n\n\t\tconst vec3 cameraPos = vec3( 0.0, 0.0, 0.0 );\n\n\t\t// constants for atmospheric scattering\n\t\tconst float pi = 3.141592653589793238462643383279502884197169;\n\n\t\tconst float n = 1.0003; // refractive index of air\n\t\tconst float N = 2.545E25; // number of molecules per unit volume for air at\n\t\t// 288.15K and 1013mb (sea level -45 celsius)\n\n\t\t// optical length at zenith for molecules\n\t\tconst float rayleighZenithLength = 8.4E3;\n\t\tconst float mieZenithLength = 1.25E3;\n\t\tconst vec3 up = vec3( 0.0, 1.0, 0.0 );\n\t\t// 66 arc seconds -> degrees, and the cosine of that\n\t\tconst float sunAngularDiameterCos = 0.999956676946448443553574619906976478926848692873900859324;\n\n\t\t// 3.0 / ( 16.0 * pi )\n\t\tconst float THREE_OVER_SIXTEENPI = 0.05968310365946075;\n\t\t// 1.0 / ( 4.0 * pi )\n\t\tconst float ONE_OVER_FOURPI = 0.07957747154594767;\n\n\t\tfloat rayleighPhase( float cosTheta ) {\n\t\t\treturn THREE_OVER_SIXTEENPI * ( 1.0 + pow( cosTheta, 2.0 ) );\n\t\t}\n\n\t\tfloat hgPhase( float cosTheta, float g ) {\n\t\t\tfloat g2 = pow( g, 2.0 );\n\t\t\tfloat inverse = 1.0 / pow( 1.0 - 2.0 * g * cosTheta + g2, 1.5 );\n\t\t\treturn ONE_OVER_FOURPI * ( ( 1.0 - g2 ) * inverse );\n\t\t}\n\n\t\t// Filmic ToneMapping http://filmicgames.com/archives/75\n\t\tconst float A = 0.15;\n\t\tconst float B = 0.50;\n\t\tconst float C = 0.10;\n\t\tconst float D = 0.20;\n\t\tconst float E = 0.02;\n\t\tconst float F = 0.30;\n\n\t\tconst float whiteScale = 1.0748724675633854; // 1.0 / Uncharted2Tonemap(1000.0)\n\n\t\tvec3 Uncharted2Tonemap( vec3 x ) {\n\t\t\treturn ( ( x * ( A * x + C * B ) + D * E ) / ( x * ( A * x + B ) + D * F ) ) - E / F;\n\t\t}\n\n\t\tvoid main() {\n\t\t\t// optical length\n\t\t\t// cutoff angle at 90 to avoid singularity in next formula.\n\t\t\tfloat zenithAngle = acos( max( 0.0, dot( up, normalize( vWorldPosition - cameraPos ) ) ) );\n\t\t\tfloat inverse = 1.0 / ( cos( zenithAngle ) + 0.15 * pow( 93.885 - ( ( zenithAngle * 180.0 ) / pi ), -1.253 ) );\n\t\t\tfloat sR = rayleighZenithLength * inverse;\n\t\t\tfloat sM = mieZenithLength * inverse;\n\n\t\t\t// combined extinction factor\n\t\t\tvec3 Fex = exp( -( vBetaR * sR + vBetaM * sM ) );\n\n\t\t\t// in scattering\n\t\t\tfloat cosTheta = dot( normalize( vWorldPosition - cameraPos ), vSunDirection );\n\n\t\t\tfloat rPhase = rayleighPhase( cosTheta * 0.5 + 0.5 );\n\t\t\tvec3 betaRTheta = vBetaR * rPhase;\n\n\t\t\tfloat mPhase = hgPhase( cosTheta, mieDirectionalG );\n\t\t\tvec3 betaMTheta = vBetaM * mPhase;\n\n\t\t\tvec3 Lin = pow( vSunE * ( ( betaRTheta + betaMTheta ) / ( vBetaR + vBetaM ) ) * ( 1.0 - Fex ), vec3( 1.5 ) );\n\t\t\tLin *= mix( vec3( 1.0 ), pow( vSunE * ( ( betaRTheta + betaMTheta ) / ( vBetaR + vBetaM ) ) * Fex, vec3( 1.0 / 2.0 ) ), clamp( pow( 1.0 - dot( up, vSunDirection ), 5.0 ), 0.0, 1.0 ) );\n\n\t\t\t// nightsky\n\t\t\tvec3 direction = normalize( vWorldPosition - cameraPos );\n\t\t\tfloat theta = acos( direction.y ); // elevation --> y-axis, [-pi/2, pi/2]\n\t\t\tfloat phi = atan( direction.z, direction.x ); // azimuth --> x-axis [-pi/2, pi/2]\n\t\t\tvec2 uv = vec2( phi, theta ) / vec2( 2.0 * pi, pi ) + vec2( 0.5, 0.0 );\n\t\t\tvec3 L0 = vec3( 0.1 ) * Fex;\n\n\t\t\t// composition + solar disc\n\t\t\tfloat sundisk = smoothstep( sunAngularDiameterCos, sunAngularDiameterCos + 0.00002, cosTheta );\n\t\t\tL0 += ( vSunE * 19000.0 * Fex ) * sundisk;\n\n\t\t\tvec3 texColor = ( Lin + L0 ) * 0.04 + vec3( 0.0, 0.0003, 0.00075 );\n\n\t\t\tvec3 curr = Uncharted2Tonemap( ( log2( 2.0 / pow( luminance, 4.0 ) ) ) * texColor );\n\t\t\tvec3 color = curr * whiteScale;\n\n\t\t\tvec3 retColor = pow( color, vec3( 1.0 / ( 1.2 + ( 1.2 * vSunfade ) ) ) );\n\n\t\t\tgl_FragColor = vec4( retColor, 1.0 );\n\t\t}\n\t`\n};\n\nexport { Sky };"
  },
  {
    "path": "examples/jsm/objects/SkyBox.js",
    "content": "import {\n\tBoxGeometry,\n\tDRAW_SIDE,\n\tMesh,\n\tShaderMaterial\n} from 't3d';\n\nclass SkyBox extends Mesh {\n\n\tconstructor(texture) {\n\t\tconst geometry = new BoxGeometry(1, 1, 1);\n\n\t\tconst material = new ShaderMaterial(SkyBox.SkyBoxShader);\n\t\tmaterial.side = DRAW_SIDE.BACK;\n\n\t\tsuper(geometry, material);\n\n\t\tthis.material = material;\n\n\t\tif (texture) {\n\t\t\tthis.texture = texture;\n\t\t}\n\n\t\tthis.frustumCulled = false;\n\t}\n\n\tset level(val) {\n\t\tthis.material.uniforms.level = val;\n\t}\n\n\tget level() {\n\t\treturn this.material.uniforms.level;\n\t}\n\n\tset gamma(val) {\n\t\tthis.material.defines.GAMMA = val;\n\t\tthis.material.needsUpdate = true;\n\t}\n\n\tget gamma() {\n\t\treturn this.material.defines.GAMMA;\n\t}\n\n\tset texture(val) {\n\t\tif (val.isTextureCube) {\n\t\t\tthis.material.cubeMap = val;\n\t\t\tthis.material.uniforms.flip = (val.images[0] && val.images[0].rtt) ? 1 : -1;\n\t\t\tthis.material.defines['PANORAMA'] = false;\n\t\t} else {\n\t\t\tthis.material.diffuseMap = val;\n\t\t\tthis.material.uniforms.flip = -1;\n\t\t\tthis.material.defines['PANORAMA'] = '';\n\t\t}\n\t\tthis.material.needsUpdate = true;\n\t}\n\n\tget texture() {\n\t\treturn this.material.diffuseMap || this.material.cubeMap;\n\t}\n\n\tget fog() {\n\t\treturn this.material.defines.SKYFOG;\n\t}\n\n\tset fog(val) {\n\t\tthis.material.defines.SKYFOG = val;\n\t\tthis.material.needsUpdate = true;\n\t}\n\n}\n\nSkyBox.SkyBoxShader = {\n\n\tname: 'skybox',\n\n\tdefines: {\n\t\t'GAMMA': false,\n\t\t'PANORAMA': false,\n\t\t'SKYFOG': false\n\t},\n\n\tuniforms: {\n\t\t'level': 0,\n\t\t'flip': -1,\n\t\t'fogColor': [1, 1, 1],\n\t\t'fogStart': 0.0, // value from -0.5 to 0.5\n\t\t'fogHeight': 0.1\n\t},\n\n\tvertexShader: `\n\t\t#include <common_vert>\n\n\t\tvarying vec3 vDir;\n\n\t\t#ifdef SKYFOG\n\t\t\tvarying vec3 vPosition;\n\t\t#endif\n\n\t\tmat4 clearMat4Translate(mat4 m) {\n\t\t\tmat4 outMatrix = m;\n\t\t\toutMatrix[3].xyz = vec3(0., 0., 0.);\n\t\t\treturn outMatrix;\n\t\t}\n\n\t\tvoid main() {\n\t\t\tmat4 modelMatrix = clearMat4Translate(u_Model);\n\t\t\tmat4 viewMatrix = clearMat4Translate(u_View);\n\n\t\t\tvDir = normalize((modelMatrix * vec4(a_Position, 0.0)).xyz);\n\n\t\t\t#ifdef SKYFOG\n\t\t\t\tvPosition = a_Position.xyz;\n\t\t\t#endif\n\n\t\t\tgl_Position = u_Projection * viewMatrix * modelMatrix * vec4(a_Position, 1.0);\n\t\t\tgl_Position.z = gl_Position.w;\n\t\t}\n\t`,\n\n\tfragmentShader: `\n\t\t#include <common_frag>\n\n\t\t#ifdef PANORAMA\n\t\t\tuniform sampler2D diffuseMap;\n\t\t#else\n\t\t\tuniform samplerCube cubeMap;\n\t\t#endif\n\n\t\tuniform float flip;\n\t\tuniform float level;\n\n\t\t#ifdef SKYFOG\n\t\t\tuniform vec3 fogColor;\n\t\t\tuniform float fogStart;\n\t\t\tuniform float fogHeight;\n\t\t#endif\n\n\t\tvarying vec3 vDir;\n\n\t\t#ifdef SKYFOG\n\t\t\tvarying vec3 vPosition;\n\t\t#endif\n\n\t\tvoid main() {\n\t\t\t#include <begin_frag>\n\n\t\t\tvec3 V = normalize(vDir);\n\n\t\t\t#ifdef PANORAMA\n\t\t\t\tfloat phi = acos(V.y);\n\t\t\t\t// consistent with cubemap.\n\t\t\t\t// atan(y, x) is same with atan2 ?\n\t\t\t\tfloat theta = flip * atan(V.x, V.z) + PI * 0.5;\n\t\t\t\tvec2 uv = vec2(theta / 2.0 / PI, -phi / PI);\n\t\t\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\t\t\toutColor *= mapTexelToLinear(texture2DLodEXT(diffuseMap, fract(uv), level));\n\t\t\t\t#else\n\t\t\t\t\toutColor *= mapTexelToLinear(texture2D(diffuseMap, fract(uv), level));\n\t\t\t\t#endif\n\t\t\t#else\n\t\t\t\tvec3 coordVec = vec3(flip * V.x, V.yz);\n\t\t\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\t\t\toutColor *= mapTexelToLinear(textureCubeLodEXT(cubeMap, coordVec, level));\n\t\t\t\t#else\n\t\t\t\t\toutColor *= mapTexelToLinear(textureCube(cubeMap, coordVec, level));\n\t\t\t\t#endif\n\t\t\t#endif\n\n\t\t\t#include <end_frag>\n\n\t\t\t#ifdef GAMMA\n\t\t\t\t#include <encodings_frag>\n\t\t\t#endif\n\n\t\t\t#ifdef SKYFOG\n\t\t\t\tfloat alpha = clamp((vPosition.y - fogStart) / fogHeight, 0.0, 1.0);\n\t\t\t\tgl_FragColor.rgb = mix(fogColor, gl_FragColor.rgb, alpha);\n\t\t\t#endif\n\t\t}\n\t`\n\n};\n\nexport { SkyBox };"
  },
  {
    "path": "examples/jsm/objects/SphereHelper.js",
    "content": "import {\n\tGeometry,\n\tBuffer,\n\tAttribute,\n\tMesh,\n\tLineMaterial,\n\tVector3\n} from 't3d';\n\nclass SphereHelper extends Mesh {\n\n\tconstructor(sphere, color = 0xffff00, angleSteps = 40) {\n\t\tconst positions = [];\n\t\tfor (let i = 0; i < 3; i++) {\n\t\t\tconst axis1 = axes[i];\n\t\t\tconst axis2 = axes[(i + 1) % 3];\n\t\t\t_vector.set(0, 0, 0);\n\n\t\t\tfor (let a = 0; a < angleSteps; a++) {\n\t\t\t\tlet angle;\n\t\t\t\tangle = 2 * Math.PI * a / (angleSteps - 1);\n\t\t\t\t_vector[axis1] = Math.sin(angle);\n\t\t\t\t_vector[axis2] = Math.cos(angle);\n\n\t\t\t\tpositions.push(_vector.x, _vector.y, _vector.z);\n\n\t\t\t\tangle = 2 * Math.PI * (a + 1) / (angleSteps - 1);\n\t\t\t\t_vector[axis1] = Math.sin(angle);\n\t\t\t\t_vector[axis2] = Math.cos(angle);\n\n\t\t\t\tpositions.push(_vector.x, _vector.y, _vector.z);\n\t\t\t}\n\t\t}\n\n\t\tconst geometry = new Geometry();\n\t\tgeometry.addAttribute('a_Position', new Attribute(new Buffer(new Float32Array(positions), 3)));\n\t\tgeometry.computeBoundingSphere();\n\n\t\tconst lineMaterial = new LineMaterial();\n\t\tlineMaterial.diffuse.setHex(color);\n\n\t\tsuper(geometry, lineMaterial);\n\n\t\tthis.sphere = sphere;\n\t}\n\n\tupdateMatrix(force) {\n\t\tconst sphere = this.sphere;\n\n\t\tthis.position.copy(sphere.center);\n\n\t\tif (sphere.isEmpty()) {\n\t\t\tthis.scale.setScalar(0);\n\t\t} else {\n\t\t\tthis.scale.setScalar(sphere.radius);\n\t\t}\n\n\t\tsuper.updateMatrix(force);\n\t}\n\n}\n\nSphereHelper.prototype.isSphereHelper = true;\n\nconst _vector = new Vector3();\nconst axes = ['x', 'y', 'z'];\n\nexport { SphereHelper };"
  },
  {
    "path": "examples/jsm/objects/SpotLightHelper.js",
    "content": "import {\n\tAttribute,\n\tBuffer,\n\tGeometry,\n\tLineMaterial,\n\tMesh,\n\tObject3D\n} from 't3d';\n\nclass SpotLightHelper extends Object3D {\n\n\tconstructor(light, color) {\n\t\tsuper();\n\n\t\tthis.light = light;\n\n\t\tthis.color = color;\n\n\t\tconst geometry = new Geometry();\n\n\t\tconst positions = [\n\t\t\t0, 0, 0, \t0, 0, -1,\n\t\t\t0, 0, 0, \t1, 0, -1,\n\t\t\t0, 0, 0,\t-1, 0, -1,\n\t\t\t0, 0, 0, \t0, 1, -1,\n\t\t\t0, 0, 0, \t0, -1, -1\n\t\t];\n\n\t\tfor (let i = 0, j = 1, l = 32; i < l; i++, j++) {\n\t\t\tconst p1 = (i / l) * Math.PI * 2;\n\t\t\tconst p2 = (j / l) * Math.PI * 2;\n\n\t\t\tpositions.push(\n\t\t\t\tMath.cos(p1), Math.sin(p1), -1,\n\t\t\t\tMath.cos(p2), Math.sin(p2), -1\n\t\t\t);\n\t\t}\n\n\t\tgeometry.addAttribute('a_Position', new Attribute(new Buffer(new Float32Array(positions), 3)));\n\n\t\tgeometry.computeBoundingBox();\n\t\tgeometry.computeBoundingSphere();\n\n\t\tconst material = new LineMaterial();\n\n\t\tthis.cone = new Mesh(geometry, material);\n\t\tthis.add(this.cone);\n\n\t\tthis.update();\n\t}\n\n\tupdate() {\n\t\tconst coneLength = this.light.distance ? this.light.distance : 1000;\n\t\tconst coneWidth = coneLength * Math.tan(this.light.angle);\n\n\t\tthis.cone.scale.set(coneWidth, coneWidth, coneLength);\n\n\t\tif (this.color !== undefined) {\n\t\t\tthis.cone.material.diffuse.setHex(this.color);\n\t\t} else {\n\t\t\tthis.cone.material.diffuse.copy(this.light.color);\n\t\t}\n\t}\n\n}\n\nexport { SpotLightHelper };"
  },
  {
    "path": "examples/jsm/objects/Sprite.js",
    "content": "/**\n * Sprite\n */\n\nimport {\n\tAttribute,\n\tBuffer,\n\tGeometry,\n\tMesh,\n\tShaderMaterial\n} from 't3d';\n\nclass Sprite extends Mesh {\n\n\tconstructor() {\n\t\tsuper(sharedGeometry, new ShaderMaterial(spriteShader));\n\t\tthis.frustumCulled = false;\n\t}\n\n\tset rotation(value) {\n\t\tthis.material.uniforms['rotation'] = value;\n\t}\n\n\tget rotation() {\n\t\treturn this.material.uniforms['rotation'];\n\t}\n\n}\n\nconst sharedGeometry = new Geometry();\n\nconst array = new Float32Array([\n\t-0.5, -0.5, 0, 0,\n\t0.5, -0.5, 1, 0,\n\t0.5, 0.5, 1, 1,\n\t-0.5, 0.5, 0, 1\n]);\n\nconst buffer = new Buffer(array, 4);\nsharedGeometry.addAttribute('position', new Attribute(buffer, 2, 0));\nsharedGeometry.addAttribute('uv', new Attribute(buffer, 2, 2));\nsharedGeometry.setIndex(\n\tnew Attribute(new Buffer(new Uint16Array([\n\t\t0, 1, 2,\n\t\t0, 2, 3\n\t]), 1))\n);\nsharedGeometry.computeBoundingBox();\nsharedGeometry.computeBoundingSphere();\n\nconst spriteShader = {\n\n\tdefines: {\n\t\tUSE_SIZEATTENUATION: true\n\t},\n\n\tuniforms: {\n\t\trotation: 0,\n\t\tcenter: [0.5, 0.5]\n\t},\n\n\tvertexShader: `\n\t\t#include <common_vert>\n\t\t#include <logdepthbuf_pars_vert>\n\n\t\tattribute vec2 position;\n\t\tattribute vec2 uv;\n\n\t\tuniform float rotation;\n\t\tuniform vec2 center;\n\n\t\t#ifdef USE_DIFFUSE_MAP\n\t\t\tvarying vec2 vUV;\n\t\t\tuniform mat3 uvTransform;\n\t\t#endif\n\n\t\tvoid main() {\n\t\t\t#ifdef USE_DIFFUSE_MAP\n\t\t\t\tvUV = (uvTransform * vec3(uv, 1.)).xy;\n\t\t\t#endif\n\n\t\t\tvec4 mvPosition = u_View * u_Model * vec4( 0.0, 0.0, 0.0, 1.0 );\n\n\t\t\tvec2 scale;\n\t\t\tscale.x = length(vec3(u_Model[0].x, u_Model[0].y, u_Model[0].z));\n\t\t\tscale.y = length(vec3(u_Model[1].x, u_Model[1].y, u_Model[1].z));\n\n\t\t\t#ifndef USE_SIZEATTENUATION\n\t\t\t\tbool isPerspective = isPerspectiveMatrix(u_Projection);\n\t\t\t\tif (isPerspective) scale *= - mvPosition.z;\n\t\t\t#endif\n\n\t\t\tvec2 alignedPosition = (position.xy - (center - vec2(0.5))) * scale;\n\n\t\t\tvec2 rotatedPosition;\n\t\t\trotatedPosition.x = cos(rotation) * alignedPosition.x - sin(rotation) * alignedPosition.y;\n\t\t\trotatedPosition.y = sin(rotation) * alignedPosition.x + cos(rotation) * alignedPosition.y;\n\n\t\t\tmvPosition.xy += rotatedPosition;\n\n\t\t\tgl_Position = u_Projection * mvPosition;\n\n\t\t\t#include <logdepthbuf_vert>\n\t\t}\n\t`,\n\n\tfragmentShader: `\n\t\tuniform vec3 u_Color;\n\t\tuniform float u_Opacity;\n\n\t\t#ifdef USE_DIFFUSE_MAP\n\t\t\tuniform sampler2D diffuseMap;\n\t\t\tvarying vec2 vUV;\n\t\t#endif\n\n\t\t#include <alphaTest_pars_frag>\n\t\t#include <fog_pars_frag>\n\t\t#include <logdepthbuf_pars_frag>\n\n\t\tvoid main() {\n\t\t\t#include <logdepthbuf_frag>\n\t\t\t\n\t\t\tvec4 outColor = vec4(u_Color, u_Opacity);\n\n\t\t\t#ifdef USE_DIFFUSE_MAP\n\t\t\t\toutColor *= texture2D(diffuseMap, vUV);\n\t\t\t#endif\n\n\t\t\t#include <alphaTest_frag>\n\n\t\t\tgl_FragColor = outColor;\n\n\t\t\t#include <fog_frag>\n\t\t}\n\t`\n\n};\n\nSprite.SpriteGeometry = sharedGeometry;\nSprite.SpriteShader = spriteShader;\n\nexport { Sprite };"
  },
  {
    "path": "examples/jsm/objects/Terrain.js",
    "content": "import { PlaneGeometry, Mesh, LambertMaterial, MATERIAL_TYPE, cloneUniforms } from 't3d';\n\n// Reference: github.com/IceCreamYou/THREE.Terrains\n\nclass Terrain extends Mesh {\n\n\tconstructor(options = {}) {\n\t\tconst width = options.width || 1024;\n\t\tconst height = options.height || 1024;\n\t\tconst widthSegments = options.widthSegments || 63;\n\t\tconst heightSegments = options.heightSegments || 63;\n\n\t\tconst maxHeight = options.maxHeight || 100;\n\t\tconst minHeight = options.minHeight || -100;\n\n\t\tconst material = options.material || new TerrainMaterial();\n\n\t\tconst geometry = new PlaneGeometry(width, height, widthSegments, heightSegments);\n\n\t\tsuper(geometry, material);\n\n\t\tthis.width = width;\n\t\tthis.height = height;\n\t\tthis.widthSegments = widthSegments;\n\t\tthis.heightSegments = heightSegments;\n\n\t\tthis.maxHeight = maxHeight;\n\t\tthis.minHeight = minHeight;\n\n\t\tthis.heightmap = options.heightmap;\n\n\t\tthis._fromHeightMap();\n\t}\n\n\t// url or image\n\t_fromHeightMap() {\n\t\tconst vertices = this.geometry.getAttribute('a_Position').buffer.array;\n\n\t\tconst canvas = document.createElement('canvas'),\n\t\t\tcontext = canvas.getContext('2d'),\n\t\t\tcols = this.widthSegments + 1,\n\t\t\trows = this.heightSegments + 1,\n\t\t\tspread = this.maxHeight - this.minHeight;\n\n\t\tcanvas.width = cols;\n\t\tcanvas.height = rows;\n\n\t\tcontext.drawImage(this.heightmap, 0, 0, canvas.width, canvas.height);\n\t\tconst data = context.getImageData(0, 0, canvas.width, canvas.height).data;\n\n\t\tfor (let row = 0; row < rows; row++) {\n\t\t\tfor (let col = 0; col < cols; col++) {\n\t\t\t\tconst i = row * cols + col, idx = i * 4;\n\t\t\t\tvertices[i * 3 + 1] = (data[idx] + data[idx + 1] + data[idx + 2]) / 765 * spread + this.minHeight;\n\t\t\t}\n\t\t}\n\n\t\tthis.geometry.getAttribute('a_Position').buffer.version++;\n\t\tthis.geometry.computeBoundingBox();\n\t\tthis.geometry.computeBoundingSphere();\n\t}\n\n\tgetHeightAt(x, z) {\n\t\t// transform coordinate origin\n\t\tx += this.width / 2;\n\t\tz += this.height / 2;\n\n\t\tconst vertices = this.geometry.getAttribute('a_Position').buffer.array;\n\n\t\tconst widthScalar = this.width / this.widthSegments;\n\t\tconst heightScalar = this.height / this.heightSegments;\n\n\t\tconst xS = x / widthScalar;\n\t\tconst yS = z / heightScalar;\n\n\t\tif (x < 0 || x >= this.width || z < 0 || z >= this.height) {\n\t\t\tconsole.error('point outside of terrain boundary');\n\t\t}\n\n\t\tconst ix = Math.floor(xS);\n\t\tconst iz = Math.floor(yS);\n\n\t\tconst rx = xS - ix;\n\t\tconst rz = yS - iz;\n\n\t\tconst wi = this.widthSegments + 1;\n\n\t\tconst a = vertices[(iz * wi + ix) * 3 + 1];\n\t\tconst b = vertices[(iz * wi + (ix + +1)) * 3 + 1];\n\t\tconst c = vertices[((iz + 1) * wi + (ix + 1)) * 3 + 1];\n\t\tconst d = vertices[((iz + 1) * wi + ix) * 3 + 1];\n\n\t\t// Interpolate\n\t\tconst e = (a * (1 - rx) + b * rx);\n\t\tconst f = (c * rx + d * (1 - rx));\n\t\tconst y = (e * (1 - rz) + f * rz);\n\n\t\treturn y;\n\t}\n\n}\n\nclass TerrainMaterial extends LambertMaterial {\n\n\tconstructor() {\n\t\tsuper();\n\t\tthis.type = MATERIAL_TYPE.SHADER;\n\t\tthis.shaderName = terrainShader.name;\n\t\tthis.vertexShader = terrainShader.vertexShader;\n\t\tthis.fragmentShader = terrainShader.fragmentShader;\n\t\tthis.uniforms = cloneUniforms(terrainShader.uniforms);\n\t}\n\n}\n\nconst terrainShader = {\n\tname: 'terrain',\n\tuniforms: {\n\t\ttexture_0: null,\n\t\ttexture_1: null,\n\t\ttexture_2: null,\n\t\ttexture_3: null,\n\t\ttexture_4: null\n\t},\n\tvertexShader: `\n\t\t#define USE_UV1\n\n\t\tvarying vec2 MyvUv;\n\t\tvarying vec3 vPosition;\n\t\tvarying vec3 myNormal;\n\t\t\n\t\t#include <common_vert>\n\t\t#include <normal_pars_vert>\n\t\t#include <uv_pars_vert>\n\t\t#include <color_pars_vert>\n\t\t#include <modelPos_pars_vert>\n\t\t#include <aoMap_pars_vert>\n\t\t#include <shadowMap_pars_vert>\n\t\t#include <logdepthbuf_pars_vert>\n\t\tvoid main() {\n\t\t\t#include <begin_vert>\n\t\t\t#include <pvm_vert>\n\t\t\t#include <normal_vert>\n\t\t\t#include <logdepthbuf_vert>\n\t\t\n\t\t\tMyvUv = a_Uv;\n\t\t\tvPosition = a_Position;\n\t\t\tmyNormal = a_Normal;\n\t\t\n\t\t\t#include <uv_vert>\n\t\t\n\t\t\t#include <color_vert>\n\t\t\t#include <modelPos_vert>\n\t\t\t#include <aoMap_vert>\n\t\t\t#include <shadowMap_vert>\n\t\t}\n\t`,\n\tfragmentShader: `\n\t\tvarying vec2 MyvUv;\n\t\tvarying vec3 vPosition;\n\t\tvarying vec3 myNormal;\n\n\t\tuniform sampler2D texture_0;\n\t\tuniform sampler2D texture_1;\n\t\tuniform sampler2D texture_2;\n\t\tuniform sampler2D texture_3;\n\t\tuniform sampler2D texture_4;\n\n\t\t#include <common_frag>\n\t\t#include <dithering_pars_frag>\n\n\t\tuniform vec3 emissive;\n\n\t\t#include <uv_pars_frag>\n\t\t#include <color_pars_frag>\n\t\t#include <diffuseMap_pars_frag>\n\t\t#include <alphaTest_pars_frag>\n\t\t#include <normalMap_pars_frag>\n\t\t#include <bumpMap_pars_frag>\n\t\t#include <light_pars_frag>\n\t\t#include <normal_pars_frag>\n\t\t#include <modelPos_pars_frag>\n\t\t#include <bsdfs>\n\t\t#include <aoMap_pars_frag>\n\t\t#include <shadowMap_pars_frag>\n\t\t#include <fog_pars_frag>\n\t\t#include <logdepthbuf_pars_frag>\n\t\tvoid main() {\n\t\t\t#include <logdepthbuf_frag>\n\t\t\t#include <begin_frag>\n\t\t\t#include <color_frag>\n\n\t\t\tfloat slope = acos(max(min(dot(myNormal, vec3(0.0, 1.0, 0.0)), 1.0), -1.0));\n\t\t\tvec4 color = texture2D( texture_0, MyvUv * vec2( 1.0, 1.0 ) + vec2( 0.0, 0.0 ) ); // base\n\t\t\t\n\t\t\tcolor = mix( texture2D( texture_1, MyvUv * vec2( 1.0, 1.0 ) + vec2( 0.0, 0.0 ) ), color, max(min(1.0 - smoothstep(-80.0, -35.0, vPosition.y) + smoothstep(20.0, 50.0, vPosition.y), 1.0), 0.0));\n\t\t\tcolor = mix( texture2D( texture_2, MyvUv * vec2( 1.0, 1.0 ) + vec2( 0.0, 0.0 ) ), color, max(min(1.0 - smoothstep(20.0, 50.0, vPosition.y) + smoothstep(60.0, 85.0, vPosition.y), 1.0), 0.0));\n\t\t\tcolor = mix( texture2D( texture_3, MyvUv * vec2( 1.0, 1.0 ) + vec2( 0.0, 0.0 ) ), color, max(min(1.0 - smoothstep(65.0 + smoothstep(-256.0, 256.0, vPosition.x) * 10.0, 80.0, vPosition.y), 1.0), 0.0));\n\t\t\tcolor = mix( texture2D( texture_4, MyvUv * vec2( 1.0, 1.0 ) + vec2( 0.0, 0.0 ) ), color, max(min(slope > 0.7853981633974483 ? 0.2 : 1.0 - smoothstep(0.47123889803846897, 0.7853981633974483, slope) + 0.2, 1.0), 0.0));\n\t\t\toutColor *= color;\n\n\t\t\t#include <alphaTest_frag>\n\t\t\t#include <normal_frag>\n\n\t\t\tReflectedLight reflectedLight = ReflectedLight(vec3(0.0), vec3(0.0), vec3(0.0), vec3(0.0));\n\t\t\t#include <light_frag>\n\t\t\t#include <aoMap_frag>\n\t\t\toutColor.xyz = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse;\n\n\t\t\t#include <shadowMap_frag>\n\n\t\t\tvec3 totalEmissiveRadiance = emissive;\n\t\t\toutColor.xyz += totalEmissiveRadiance;\n\n\t\t\t#include <end_frag>\n\t\t\t#include <encodings_frag>\n\t\t\t#include <premultipliedAlpha_frag>\n\t\t\t#include <fog_frag>\n\t\t\t#include <dithering_frag>\n\t\t}\n\t`\n};\n\nexport { Terrain };"
  },
  {
    "path": "examples/jsm/objects/TriangleSoupHelper.js",
    "content": "import {\n\tAttribute,\n\tGeometry,\n\tBuffer,\n\tMesh,\n\tBasicMaterial,\n\tDRAW_MODE,\n\tObject3D\n} from 't3d';\nimport { GeometryUtils } from '../geometries/GeometryUtils.js';\n\n/**\n * TriangleSoupHelper\n */\nexport class TriangleSoupHelper extends Object3D {\n\n\tconstructor(triangleSoup) {\n\t\tsuper();\n\n\t\tthis.triangleSoup = triangleSoup;\n\n\t\tconst geometry = new Geometry();\n\t\tconst material = new BasicMaterial();\n\t\tmaterial.diffuse.setRGB(0.0, 0.5, 1.0);\n\t\tmaterial.transparent = true;\n\t\tmaterial.opacity = 0.5;\n\t\tmaterial.depthWrite = false;\n\t\tmaterial.envMap = undefined;\n\t\tthis.mesh = new Mesh(geometry, material);\n\t\tthis.add(this.mesh);\n\n\t\tthis.wireframeMesh = null;\n\n\t\tthis.update();\n\t}\n\n\twireframe(value) {\n\t\tif (value === !!this.wireframeMesh) return this;\n\n\t\tif (value) {\n\t\t\tconst geometry = this.mesh.geometry.clone();\n\t\t\tgeometry.index = GeometryUtils.getWireframeAttribute(geometry);\n\t\t\tgeometry.computeBoundingBox();\n\t\t\tgeometry.computeBoundingSphere();\n\t\t\tconst material = new BasicMaterial();\n\t\t\tmaterial.diffuse.setRGB(0.08, 0.08, 0.08);\n\t\t\tmaterial.drawMode = DRAW_MODE.LINES;\n\t\t\tmaterial.transparent = true;\n\t\t\tmaterial.opacity = 0.8;\n\t\t\tmaterial.envMap = undefined;\n\t\t\tconst wireframeMesh = new Mesh(geometry, material);\n\t\t\tthis.add(wireframeMesh);\n\n\t\t\tthis.wireframeMesh = wireframeMesh;\n\t\t} else {\n\t\t\tthis.wireframeMesh.geometry.dispose();\n\t\t\tthis.wireframeMesh.material.dispose();\n\t\t\tthis.remove(this.wireframeMesh);\n\n\t\t\tthis.wireframeMesh = null;\n\t\t}\n\n\t\treturn this;\n\t}\n\n\tupdate() {\n\t\tconst { positions, indices } = this.triangleSoup;\n\t\tconst { geometry } = this.mesh;\n\n\t\tgeometry.dispose();\n\n\t\tgeometry.addAttribute(\n\t\t\t'a_Position',\n\t\t\tnew Attribute(new Buffer(new Float32Array(positions), 3))\n\t\t);\n\t\tgeometry.setIndex(new Attribute(new Buffer((new Uint32Array(indices)), 1)));\n\t\tgeometry.computeBoundingBox();\n\t\tgeometry.computeBoundingSphere();\n\n\t\t// Rebuild wireframe if it exists\n\t\tif (this.wireframeMesh) {\n\t\t\tthis.wireframe(false).wireframe(true);\n\t\t}\n\n\t\treturn this;\n\t}\n\n\tdispose() {\n\t\tthis.mesh.geometry.dispose();\n\t\tthis.mesh.material.dispose();\n\n\t\tif (this.wireframeMesh) {\n\t\t\tthis.wireframeMesh.geometry.dispose();\n\t\t\tthis.wireframeMesh.material.dispose();\n\t\t}\n\n\t\treturn this;\n\t}\n\n}\n"
  },
  {
    "path": "examples/jsm/objects/VertexNormalsHelper.js",
    "content": "import {\n\tAttribute,\n\tBuffer,\n\tGeometry,\n\tLineMaterial,\n\tMesh,\n\tMatrix3,\n\tVector3\n} from 't3d';\n\nconst _v1 = new Vector3();\nconst _v2 = new Vector3();\nconst _normalMatrix = new Matrix3();\n\nclass VertexNormalsHelper extends Mesh {\n\n\tconstructor(object, size = 1, color = 0xff0000) {\n\t\tconst geometry = new Geometry();\n\n\t\tconst nNormals = object.geometry.attributes.a_Normal.buffer.count;\n\t\tconst positions = new Attribute(new Buffer(new Float32Array(nNormals * 2 * 3), 3));\n\n\t\tgeometry.addAttribute('a_Position', positions);\n\n\t\tconst material = new LineMaterial();\n\t\tmaterial.diffuse.setHex(color);\n\n\t\tsuper(geometry, material);\n\n\t\tthis.object = object;\n\t\tthis.size = size;\n\n\t\tthis.update();\n\t}\n\n\tupdate() {\n\t\tthis.object.updateMatrix(true);\n\n\t\tconst objGeometry = this.object.geometry;\n\n\t\tif (objGeometry) {\n\t\t\t_normalMatrix.setFromMatrix4(this.object.worldMatrix).invert().transpose();\n\n\t\t\tconst matrixWorld = this.object.worldMatrix;\n\n\t\t\tconst positionBuffer = this.geometry.attributes.a_Position.buffer;\n\n\t\t\tconst objPos = objGeometry.attributes.a_Position.buffer;\n\t\t\tconst objNorm = objGeometry.attributes.a_Normal.buffer;\n\n\t\t\tlet idx = 0;\n\n\t\t\tfor (let j = 0, jl = objPos.count; j < jl; j++) {\n\t\t\t\t_v1.fromArray(objPos.array, j * 3).applyMatrix4(matrixWorld);\n\n\t\t\t\t_v2.fromArray(objNorm.array, j * 3);\n\n\t\t\t\t_v2.applyMatrix3(_normalMatrix).normalize().multiplyScalar(this.size).add(_v1);\n\n\t\t\t\tpositionBuffer.array[idx++] = _v1.x;\n\t\t\t\tpositionBuffer.array[idx++] = _v1.y;\n\t\t\t\tpositionBuffer.array[idx++] = _v1.z;\n\n\t\t\t\tpositionBuffer.array[idx++] = _v2.x;\n\t\t\t\tpositionBuffer.array[idx++] = _v2.y;\n\t\t\t\tpositionBuffer.array[idx++] = _v2.z;\n\t\t\t}\n\n\t\t\t// Skip update bounding box\n\t\t\t// Because we may not want to consider the helper's bounding box\n\t\t\tthis.geometry.computeBoundingSphere();\n\n\t\t\tpositionBuffer.version++;\n\t\t}\n\t}\n\n}\n\nVertexNormalsHelper.prototype.isVertexNormalsHelper = true;\n\nexport { VertexNormalsHelper };"
  },
  {
    "path": "examples/jsm/objects/VertexTangentsHelper.js",
    "content": "import {\n\tAttribute,\n\tBuffer,\n\tGeometry,\n\tLineMaterial,\n\tMesh,\n\tVector3\n} from 't3d';\n\nconst _v1 = new Vector3();\nconst _v2 = new Vector3();\n\nclass VertexTangentsHelper extends Mesh {\n\n\tconstructor(object, size = 1, color = 0x00ffff) {\n\t\tconst geometry = new Geometry();\n\n\t\tconst nTangents = object.geometry.attributes.a_Tangent.buffer.count;\n\t\tconst positions = new Attribute(new Buffer(new Float32Array(nTangents * 2 * 3), 3));\n\n\t\tgeometry.addAttribute('a_Position', positions);\n\n\t\tconst material = new LineMaterial();\n\t\tmaterial.diffuse.setHex(color);\n\n\t\tsuper(geometry, material);\n\n\t\tthis.object = object;\n\t\tthis.size = size;\n\n\t\tthis.update();\n\t}\n\n\tupdate() {\n\t\tthis.object.updateMatrix(true);\n\n\t\tconst objGeometry = this.object.geometry;\n\n\t\tif (objGeometry) {\n\t\t\tconst matrixWorld = this.object.worldMatrix;\n\n\t\t\tconst position = this.geometry.attributes.a_Position.buffer;\n\n\t\t\tconst objPos = objGeometry.attributes.a_Position.buffer;\n\t\t\tconst objTan = objGeometry.attributes.a_Tangent.buffer;\n\n\t\t\tlet idx = 0;\n\n\t\t\tfor (let j = 0, jl = objPos.count; j < jl; j++) {\n\t\t\t\t_v1.fromArray(objPos.array, j * 3).applyMatrix4(matrixWorld);\n\n\t\t\t\t_v2.fromArray(objTan.array, j * 3);\n\n\t\t\t\t_v2.transformDirection(matrixWorld).multiplyScalar(this.size).add(_v1);\n\n\t\t\t\tposition.array[idx++] = _v1.x;\n\t\t\t\tposition.array[idx++] = _v1.y;\n\t\t\t\tposition.array[idx++] = _v1.z;\n\n\t\t\t\tposition.array[idx++] = _v2.x;\n\t\t\t\tposition.array[idx++] = _v2.y;\n\t\t\t\tposition.array[idx++] = _v2.z;\n\t\t\t}\n\n\t\t\t// Skip update bounding box\n\t\t\t// Because we may not want to consider the helper's bounding box\n\t\t\tthis.geometry.computeBoundingSphere();\n\n\t\t\tposition.version++;\n\t\t}\n\t}\n\n}\n\nVertexTangentsHelper.prototype.isVertexTangentsHelper = true;\n\nexport { VertexTangentsHelper };"
  },
  {
    "path": "examples/jsm/objects/Water.js",
    "content": "import {\n\tColor3,\n\tDRAW_SIDE,\n\tMesh,\n\tShaderMaterial,\n\tVector3\n} from 't3d';\nimport { PlanarReflectionProbe } from '../probes/PlanarReflectionProbe.js';\n\n\n/**\n * @author jbouny / https://github.com/jbouny\n *\n * Work based on :\n * @author Slayvin / http://slayvin.net : Flat mirror for three.js\n * @author Stemkoski / http://www.adelphi.edu/~stemkoski : An implementation of water shader based on the flat mirror\n * @author Jonas Wagner / http://29a.ch/ && http://29a.ch/slides/2012/webglwater/ : Water shader explanations in WebGL\n */\nclass Water extends Mesh {\n\n\tconstructor(geometry, options = {}) {\n\t\tconst alpha = options.alpha !== undefined ? options.alpha : 1.0;\n\t\tconst time = options.time !== undefined ? options.time : 0.0;\n\t\tconst normalSampler = options.waterNormals !== undefined ? options.waterNormals : null;\n\t\tconst sunDirection = options.sunDirection !== undefined ? options.sunDirection : new Vector3(0.70707, 0.70707, 0.0);\n\t\tconst sunColor = new Color3(options.sunColor !== undefined ? options.sunColor : 0xffffff);\n\t\tconst waterColor = new Color3(options.waterColor !== undefined ? options.waterColor : 0x7F7F7F);\n\t\tconst distortionScale = options.distortionScale !== undefined ? options.distortionScale : 20.0;\n\t\tconst side = options.side !== undefined ? options.side : DRAW_SIDE.FRONT;\n\n\t\tconst material = new ShaderMaterial(mirrorShader);\n\t\tmaterial.side = side;\n\n\t\tmaterial.uniforms['alpha'] = alpha;\n\t\tmaterial.uniforms['time'] = time;\n\t\tmaterial.uniforms['normalSampler'] = normalSampler;\n\t\tmaterial.uniforms['sunColor'] = sunColor.toArray();\n\t\tmaterial.uniforms['waterColor'] = waterColor.toArray();\n\t\tmaterial.uniforms['sunDirection'] = sunDirection.toArray();\n\t\tmaterial.uniforms['distortionScale'] = distortionScale;\n\n\t\tsuper(geometry, material);\n\n\t\tconst planarReflectionProbe = new PlanarReflectionProbe();\n\n\t\tmaterial.uniforms['mirrorSampler'] = planarReflectionProbe.renderTarget.texture;\n\t\tmaterial.uniforms['textureMatrix'] = planarReflectionProbe.textureMatrix.elements;\n\n\t\tthis.skipReflectionProbe = true;\n\n\t\tconst planeNormal = new Vector3(0, 1, 0);\n\t\tconst coplanarPoint = new Vector3();\n\n\t\tconst scope = this;\n\t\tscope.updateReflect = function(renderer, scene, camera) {\n\t\t\tplaneNormal.setFromMatrixColumn(scope.worldMatrix, 1).normalize();\n\t\t\tcoplanarPoint.setFromMatrixPosition(scope.worldMatrix);\n\t\t\tplanarReflectionProbe.plane.setFromNormalAndCoplanarPoint(planeNormal, coplanarPoint);\n\t\t\tplanarReflectionProbe.render(renderer, scene, camera);\n\t\t};\n\t}\n\n}\n\nconst mirrorShader = {\n\tname: 'water_mirror',\n\n\tuniforms: {\n\t\tu_FogColor: [1, 1, 1],\n\t\tu_FogDensity: 0.2,\n\t\tu_FogNear: 0.1,\n\t\tu_FogFar: 1000,\n\n\t\tnormalSampler: null,\n\t\tmirrorSampler: null,\n\t\talpha: 1.0,\n\t\ttime: 0.0,\n\t\tsize: 1.0,\n\t\tdistortionScale: 20.0,\n\t\ttextureMatrix: new Float32Array(16),\n\t\tsunColor: [0.8, 0.8, 0.8],\n\t\tsunDirection: [0.70707, 0.70707, 0],\n\t\twaterColor: [0.4, 0.4, 0.4]\n\t},\n\n\tvertexShader: [\n\t\t'uniform mat4 textureMatrix;',\n\t\t'uniform float time;',\n\n\t\t'varying vec4 mirrorCoord;',\n\t\t'varying vec4 worldPosition;',\n\n\t\t'#include <common_vert>',\n\n\t\t'void main() {',\n\t\t'\tmirrorCoord = u_Model * vec4(a_Position, 1.0);',\n\t\t'\tworldPosition = mirrorCoord.xyzw;',\n\t\t'\tmirrorCoord = textureMatrix * mirrorCoord;',\n\t\t'\tgl_Position = u_ProjectionView * u_Model * vec4(a_Position, 1.0);',\n\t\t'}'\n\t].join('\\n'),\n\n\tfragmentShader: [\n\t\t'uniform sampler2D mirrorSampler;',\n\t\t'uniform float alpha;',\n\t\t'uniform float time;',\n\t\t'uniform float size;',\n\t\t'uniform float distortionScale;',\n\t\t'uniform sampler2D normalSampler;',\n\t\t'uniform vec3 sunColor;',\n\t\t'uniform vec3 sunDirection;',\n\t\t'uniform vec3 u_CameraPosition;',\n\t\t'uniform vec3 waterColor;',\n\n\t\t'varying vec4 mirrorCoord;',\n\t\t'varying vec4 worldPosition;',\n\n\t\t'vec4 getNoise( vec2 uv ) {',\n\t\t'\tvec2 uv0 = ( uv / 103.0 ) + vec2(time / 17.0, time / 29.0);',\n\t\t'\tvec2 uv1 = uv / 107.0-vec2( time / -19.0, time / 31.0 );',\n\t\t'\tvec2 uv2 = uv / vec2( 8907.0, 9803.0 ) + vec2( time / 101.0, time / 97.0 );',\n\t\t'\tvec2 uv3 = uv / vec2( 1091.0, 1027.0 ) - vec2( time / 109.0, time / -113.0 );',\n\t\t'\tvec4 noise = texture2D( normalSampler, uv0 ) +',\n\t\t'\t\ttexture2D( normalSampler, uv1 ) +',\n\t\t'\t\ttexture2D( normalSampler, uv2 ) +',\n\t\t'\t\ttexture2D( normalSampler, uv3 );',\n\t\t'\treturn noise * 0.5 - 1.0;',\n\t\t'}',\n\n\t\t'void sunLight( const vec3 surfaceNormal, const vec3 eyeDirection, float shiny, float spec, float diffuse, inout vec3 diffuseColor, inout vec3 specularColor ) {',\n\t\t'\tvec3 reflection = normalize( reflect( -sunDirection, surfaceNormal ) );',\n\t\t'\tfloat direction = max( 0.0, dot( eyeDirection, reflection ) );',\n\t\t'\tspecularColor += pow( direction, shiny ) * sunColor * spec;',\n\t\t'\tdiffuseColor += max( dot( sunDirection, surfaceNormal ), 0.0 ) * sunColor * diffuse;',\n\t\t'}',\n\n\t\t'#include <fog_pars_frag>',\n\n\t\t'void main() {',\n\t\t'\tvec4 noise = getNoise( worldPosition.xz * size );',\n\t\t'\tvec3 surfaceNormal = normalize( noise.xzy * vec3( 1.5, 1.0, 1.5 ) );',\n\n\t\t'\tvec3 diffuseLight = vec3(0.0);',\n\t\t'\tvec3 specularLight = vec3(0.0);',\n\n\t\t'\tvec3 worldToEye = u_CameraPosition - worldPosition.xyz;',\n\t\t'\tvec3 eyeDirection = normalize( worldToEye );',\n\t\t'\tsunLight( surfaceNormal, eyeDirection, 100.0, 2.0, 0.5, diffuseLight, specularLight );',\n\n\t\t'\tfloat distance = length(worldToEye);',\n\n\t\t'\tvec2 distortion = surfaceNormal.xz * ( 0.001 + 1.0 / distance ) * distortionScale;',\n\t\t'\tvec3 reflectionSample = vec3( texture2D( mirrorSampler, mirrorCoord.xy / mirrorCoord.w + distortion ) );',\n\n\t\t'\tfloat theta = max( dot( eyeDirection, surfaceNormal ), 0.0 );',\n\t\t'\tfloat rf0 = 0.3;',\n\t\t'\tfloat reflectance = rf0 + ( 1.0 - rf0 ) * pow( ( 1.0 - theta ), 5.0 );',\n\t\t'\tvec3 scatter = max( 0.0, dot( surfaceNormal, eyeDirection ) ) * waterColor;',\n\t\t'\tvec3 albedo = mix( ( sunColor * diffuseLight * 0.3 + scatter ), ( vec3( 0.1 ) + reflectionSample * 0.9 + reflectionSample * specularLight ), reflectance);',\n\t\t'\tvec3 outgoingLight = albedo;',\n\t\t'\tgl_FragColor = vec4( outgoingLight, alpha );',\n\n\t\t'   #include <fog_frag>',\n\t\t'}'\n\t].join('\\n')\n};\n\nexport { Water };"
  },
  {
    "path": "examples/jsm/ocean/Butterfly.js",
    "content": "// Reference: https://stackblitz.com/edit/fft-2d?file=ocean%2Fbutterfly.ts\n\nimport { Vector4 } from 't3d';\n\nconst eix = x => [Math.cos(x), Math.sin(x)];\n\nexport const reverseBits = (v, width) => {\n\treturn parseInt(v.toString(2).padStart(width, '0').split('').reverse().join(''), 2);\n};\n\nexport const createButterflyTexture = size => {\n\tconst width = Math.log2(size);\n\tconst height = size;\n\tconst texture = new Float32Array(width * height * 4);\n\tconst w = (2.0 * Math.PI) / size;\n\tconst bitReversed = [...Array(size).keys()].map(v => reverseBits(v, width));\n\n\tconst texel = new Vector4();\n\tfor (let j = 0; j < width; j++) {\n\t\tfor (let i = 0; i < height; i++) {\n\t\t\tconst k = i * (size >> (j + 1));\n\t\t\tconst twiddle = eix(k * w);\n\t\t\tconst span = 2 ** j;\n\t\t\tconst wing = i % 2 ** (j + 1) < span ? 0 : 1; // 0 - top wing, 1 - bottom wing\n\t\t\tif (j === 0) {\n\t\t\t\tif (wing === 0) {\n\t\t\t\t\ttexel.set(twiddle[0], twiddle[1], bitReversed[i], bitReversed[i + 1]);\n\t\t\t\t} else {\n\t\t\t\t\ttexel.set(twiddle[0], twiddle[1], bitReversed[i - 1], bitReversed[i]);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (wing === 0) {\n\t\t\t\t\ttexel.set(twiddle[0], twiddle[1], i, i + span);\n\t\t\t\t} else {\n\t\t\t\t\ttexel.set(twiddle[0], twiddle[1], i - span, i);\n\t\t\t\t}\n\t\t\t}\n\t\t\ttexture[(width * i + j) * 4] = texel.x;\n\t\t\ttexture[(width * i + j) * 4 + 1] = texel.y;\n\t\t\ttexture[(width * i + j) * 4 + 2] = texel.z;\n\t\t\ttexture[(width * i + j) * 4 + 3] = texel.w;\n\t\t}\n\t}\n\n\treturn texture;\n};"
  },
  {
    "path": "examples/jsm/ocean/OceanField.js",
    "content": "// Reference: https://stackblitz.com/edit/fft-2d?file=ocean%2Focean-field.ts\n\nimport { OffscreenRenderTarget, TEXTURE_FILTER, ShaderPostPass, ATTACHMENT } from 't3d';\nimport { HkShader } from './shaders/HkShader.js';\nimport { FFT2HShader } from './shaders/FFT2HShader.js';\nimport { FFT2VShader } from './shaders/FFT2VShader.js';\nimport { PostFFT2Shader } from './shaders/PostFFT2Shader.js';\nimport { createFloat4Texture } from './Utils.js';\n\nexport class OceanField {\n\n\tconstructor(renderer, h0Textures, butterflyTexture, params) {\n\t\tthis.spectrumTextures;\n\t\tthis.pingPongTextures;\n\t\tthis.ifftTextures;\n\t\tthis._dataMaps;\n\t\tthis.spectrumRenderTarget;\n\t\tthis.pingPongRenderTarget;\n\t\tthis.postIfft2RenderTarget;\n\t\tthis.hkPass;\n\t\tthis.fft2hPass;\n\t\tthis.fft2vPass;\n\t\tthis.postfft2Pass;\n\n\t\tthis.renderer = renderer;\n\t\tthis.h0Textures = h0Textures;\n\t\tthis.butterflyTexture = butterflyTexture;\n\t\tthis.params = params;\n\n\t\tthis.createTextures();\n\t\tthis.createRenderTargets();\n\t\tthis.createFFTPasses();\n\t}\n\n\tget dataMaps() {\n\t\treturn this._dataMaps;\n\t}\n\n\tupdate(time) {\n\t\tthis.generateSpectrum(time);\n\t\tthis.ifft2();\n\t\tthis.postIfft2();\n\t}\n\n\tdispose() {\n\t\tthis.hkPass.dispose();\n\t\tthis.fft2hPass.dispose();\n\t\tthis.fft2vPass.dispose();\n\t\tthis.postfft2Pass.dispose();\n\t\tthis.spectrumRenderTarget.dispose();\n\t\tthis.pingPongRenderTarget.dispose();\n\t\tthis.postIfft2RenderTarget.dispose();\n\t\tthis.h0Textures.forEach(texture => texture.dispose());\n\t\tthis.spectrumTextures.forEach(texture => texture.dispose());\n\t\tthis.pingPongTextures.forEach(texture => texture.dispose());\n\t\tthis.ifftTextures && this.ifftTextures.forEach(texture => texture.dispose());\n\t\tthis._dataMaps.forEach(texture => texture.dispose());\n\t}\n\n\tcreateFFTPasses() {\n\t\tthis.hkPass = new ShaderPostPass(HkShader);\n\t\tthis.hkPass.material.uniforms.resolution = this.params.resolution;\n\t\tfor (let i = 0; i < this.params.cascades.length; i++) {\n\t\t\tthis.hkPass.material.uniforms.sizes[i] = this.params.cascades[i].size;\n\t\t}\n\n\t\tthis.fft2hPass = new ShaderPostPass(FFT2HShader);\n\t\tthis.fft2vPass = new ShaderPostPass(FFT2VShader);\n\n\t\tthis.postfft2Pass = new ShaderPostPass(PostFFT2Shader);\n\t\tthis.postfft2Pass.material.uniforms['N2'] = this.params.resolution * this.params.resolution;\n\t}\n\n\tcreateTextures() {\n\t\tthis.spectrumTextures = Array.from({ length: 6 }, () =>\n\t\t\tcreateFloat4Texture(this.params.resolution, this.params.resolution)\n\t\t);\n\n\t\tthis.pingPongTextures = Array.from({ length: 6 }, () =>\n\t\t\tcreateFloat4Texture(this.params.resolution, this.params.resolution)\n\t\t);\n\n\t\tthis._dataMaps = Array.from({ length: 6 }, () =>\n\t\t\tcreateFloat4Texture(this.params.resolution, this.params.resolution, TEXTURE_FILTER.LINEAR)\n\t\t);\n\t}\n\n\tcreateRenderTargets() {\n\t\tthis.spectrumRenderTarget = new OffscreenRenderTarget(this.params.resolution, this.params.resolution);\n\t\tthis.spectrumRenderTarget.setClear(false, false, false);\n\t\tfor (let slot = 0; slot < this.spectrumTextures.length; slot++) {\n\t\t\tthis.spectrumRenderTarget.attach(this.spectrumTextures[slot], ATTACHMENT.COLOR_ATTACHMENT0 + slot);\n\t\t}\n\n\t\tthis.pingPongRenderTarget = new OffscreenRenderTarget(this.params.resolution, this.params.resolution);\n\t\tthis.pingPongRenderTarget.setClear(false, false, false);\n\t\tfor (let slot = 0; slot < this.pingPongTextures.length; slot++) {\n\t\t\tthis.pingPongRenderTarget.attach(this.pingPongTextures[slot], ATTACHMENT.COLOR_ATTACHMENT0 + slot);\n\t\t}\n\n\t\tthis.postIfft2RenderTarget = new OffscreenRenderTarget(this.params.resolution, this.params.resolution);\n\t\tthis.postIfft2RenderTarget.setClear(false, false, false);\n\t\tfor (let slot = 0; slot < this._dataMaps.length; slot++) {\n\t\t\tthis.postIfft2RenderTarget.attach(this._dataMaps[slot], ATTACHMENT.COLOR_ATTACHMENT0 + slot);\n\t\t}\n\t}\n\n\tgenerateSpectrum(time) {\n\t\tthis.hkPass.uniforms.h0Texture0 = this.h0Textures[0];\n\t\tthis.hkPass.uniforms.h0Texture1 = this.h0Textures[1];\n\t\tthis.hkPass.uniforms.h0Texture2 = this.h0Textures[2];\n\t\tthis.hkPass.uniforms.t = time;\n\t\tthis.hkPass.render(this.renderer, this.spectrumRenderTarget);\n\t}\n\n\tifft2() {\n\t\tconst phases = Math.log2(this.params.resolution);\n\t\tconst pingPongTextures = [this.spectrumTextures, this.pingPongTextures];\n\t\tconst pingPongRenderTargets = [this.pingPongRenderTarget, this.spectrumRenderTarget];\n\n\t\t// horizontal ifft\n\t\tlet pingPong = 0;\n\t\tthis.fft2hPass.material.uniforms['butterfly'] = this.butterflyTexture;\n\n\t\tfor (let phase = 0; phase < phases; phase++) {\n\t\t\tthis.fft2hPass.uniforms.phase = phase;\n\t\t\tthis.fft2hPass.uniforms.spectrum0 = pingPongTextures[pingPong][0];\n\t\t\tthis.fft2hPass.uniforms.spectrum1 = pingPongTextures[pingPong][1];\n\t\t\tthis.fft2hPass.uniforms.spectrum2 = pingPongTextures[pingPong][2];\n\t\t\tthis.fft2hPass.uniforms.spectrum3 = pingPongTextures[pingPong][3];\n\t\t\tthis.fft2hPass.uniforms.spectrum4 = pingPongTextures[pingPong][4];\n\t\t\tthis.fft2hPass.uniforms.spectrum5 = pingPongTextures[pingPong][5];\n\t\t\tthis.fft2hPass.render(this.renderer, pingPongRenderTargets[pingPong]);\n\t\t\tpingPong = (pingPong + 1) % 2;\n\t\t}\n\n\t\t// vertical ifft\n\t\tthis.fft2vPass.material.uniforms['butterfly'] = this.butterflyTexture;\n\n\t\tfor (let phase = 0; phase < phases; phase++) {\n\t\t\tthis.fft2vPass.uniforms.phase = phase;\n\t\t\tthis.fft2vPass.uniforms.spectrum0 = pingPongTextures[pingPong][0];\n\t\t\tthis.fft2vPass.uniforms.spectrum1 = pingPongTextures[pingPong][1];\n\t\t\tthis.fft2vPass.uniforms.spectrum2 = pingPongTextures[pingPong][2];\n\t\t\tthis.fft2vPass.uniforms.spectrum3 = pingPongTextures[pingPong][3];\n\t\t\tthis.fft2vPass.uniforms.spectrum4 = pingPongTextures[pingPong][4];\n\t\t\tthis.fft2vPass.uniforms.spectrum5 = pingPongTextures[pingPong][5];\n\t\t\tthis.fft2vPass.render(this.renderer, pingPongRenderTargets[pingPong]);\n\t\t\tpingPong = (pingPong + 1) % 2;\n\t\t}\n\n\t\tthis.ifftTextures = pingPongTextures[pingPong];\n\t}\n\n\tpostIfft2() {\n\t\tthis.postfft2Pass.uniforms.ifft0 = this.ifftTextures[0];\n\t\tthis.postfft2Pass.uniforms.ifft1 = this.ifftTextures[1];\n\t\tthis.postfft2Pass.uniforms.ifft2 = this.ifftTextures[2];\n\t\tthis.postfft2Pass.uniforms.ifft3 = this.ifftTextures[3];\n\t\tthis.postfft2Pass.uniforms.ifft4 = this.ifftTextures[4];\n\t\tthis.postfft2Pass.uniforms.ifft5 = this.ifftTextures[5];\n\t\tthis.postfft2Pass.render(this.renderer, this.postIfft2RenderTarget);\n\t}\n\n}"
  },
  {
    "path": "examples/jsm/ocean/OceanFieldBuilder.js",
    "content": "// Reference: https://stackblitz.com/edit/fft-2d?file=ocean%2Focean-field-builder.ts\n\nimport { OffscreenRenderTarget, ATTACHMENT, TEXTURE_FILTER, TEXTURE_WRAP, ShaderPostPass } from 't3d';\nimport { createButterflyTexture } from './Butterfly.js';\nimport { OceanField } from './OceanField.js';\nimport { H0Shader } from './shaders/H0Shader.js';\nimport { createFloat2Texture, createFloat4Texture } from './Utils.js';\n\nexport class OceanFieldBuilder {\n\n\tconstructor(renderer) {\n\t\tthis.renderer = renderer;\n\t\tthis.renderTarget = OffscreenRenderTarget.create2D(4, 4);\n\t\tthis.renderTarget.setClear(false, false, false);\n\t\tthis.butterflyTexture = new Map();\n\t\tthis.noiseTexture = new Map();\n\t\tthis.h0Pass = new ShaderPostPass(H0Shader);\n\t}\n\n\tbuild(params = {}) {\n\t\tconst _params = {\n\t\t\t...defaultBuildParams,\n\t\t\t...params\n\t\t};\n\n\t\tconst h0Textures = this.createH0Textures(_params.resolution);\n\t\tthis.generateInitialSpectrum(h0Textures, _params);\n\n\t\tconst butterflyTexture = this.getButterflyTexture(_params.resolution);\n\n\t\treturn new OceanField(\n\t\t\tthis.renderer,\n\t\t\th0Textures,\n\t\t\tbutterflyTexture,\n\t\t\t_params\n\t\t);\n\t}\n\n\tupdate(field, params = {}) {\n\t\tconst _params = {\n\t\t\t...defaultBuildParams,\n\t\t\t...params\n\t\t};\n\t\tthis.generateInitialSpectrum(field['h0Textures'], _params);\n\t\tthis.updateField(field, _params);\n\t\tObject.assign(field, { params: _params });\n\t}\n\n\tupdateField(field, params) {\n\t\tif (params.resolution !== field.params.resolution) {\n\t\t\tfield.hkPass.uniforms.resolution = params.resolution;\n\t\t\tfield.postfft2Pass.uniforms.N2 = params.resolution * params.resolution;\n\t\t}\n\n\t\tfor (let i = 0; i < params.cascades.length; i++) {\n\t\t\tif (params.cascades[i].size !== field.hkPass.uniforms.sizes[i]) {\n\t\t\t\tfield.hkPass.uniforms.sizes[i] = params.cascades[i].size;\n\t\t\t}\n\t\t}\n\t}\n\n\tcreateH0Textures(size) {\n\t\treturn [\n\t\t\tcreateFloat4Texture(size, size),\n\t\t\tcreateFloat4Texture(size, size),\n\t\t\tcreateFloat4Texture(size, size)\n\t\t];\n\t}\n\n\tgenerateInitialSpectrum(h0Textures, params) {\n\t\tfor (let slot = 0; slot < h0Textures.length; slot++) {\n\t\t\tthis.renderTarget.attach(h0Textures[slot], ATTACHMENT.COLOR_ATTACHMENT0 + slot);\n\t\t}\n\t\tthis.renderTarget.resize(params.resolution, params.resolution);\n\n\t\tthis.h0Pass.uniforms.noise = this.getNoiseTexture(params.resolution, params.randomSeed);\n\t\tthis.h0Pass.uniforms.resolution = params.resolution;\n\t\tthis.h0Pass.uniforms.wind = params.wind;\n\t\tthis.h0Pass.uniforms.alignment = params.alignment;\n\n\t\tfor (let i = 0; i < params.cascades.length; i++) {\n\t\t\tthis.h0Pass.uniforms.cascades[i].size = params.cascades[i].size;\n\t\t\tthis.h0Pass.uniforms.cascades[i].strength = (params.cascades[i].strength * 0.081) / params.cascades[i].size ** 2;\n\t\t\tthis.h0Pass.uniforms.cascades[i].minK = 2.0 * Math.PI / params.cascades[i].maxWave;\n\t\t\tthis.h0Pass.uniforms.cascades[i].maxK = 2.0 * Math.PI / params.cascades[i].minWave;\n\t\t}\n\n\t\tthis.h0Pass.render(this.renderer, this.renderTarget);\n\t}\n\n\tgetNoiseTexture(size, randomSeed) {\n\t\tif (!this.noiseTexture.has(size)) {\n\t\t\tthis.noiseTexture.set(\n\t\t\t\tsize,\n\t\t\t\tcreateFloat2Texture(\n\t\t\t\t\tsize,\n\t\t\t\t\tsize,\n\t\t\t\t\tTEXTURE_FILTER.NEAREST,\n\t\t\t\t\tTEXTURE_WRAP.REPEAT\n\t\t\t\t)\n\t\t\t);\n\t\t}\n\n\t\tconst texture = this.noiseTexture.get(size);\n\t\ttexture.image.data = this.getNoise2d(size, randomSeed);\n\t\ttexture.version++;\n\n\t\treturn texture;\n\t}\n\n\tgetButterflyTexture(size) {\n\t\tif (!this.butterflyTexture.has(size)) {\n\t\t\tconst texture = createFloat4Texture(Math.log2(size), size);\n\t\t\ttexture.image.data = createButterflyTexture(size);\n\t\t\ttexture.version++;\n\t\t\tthis.butterflyTexture.set(size, texture);\n\t\t}\n\t\treturn this.butterflyTexture.get(size);\n\t}\n\n\tgetNoise2d(size, randomSeed) {\n\t\tconst mulberry32 = a => {\n\t\t\treturn () => {\n\t\t\t\tlet t = (a += 0x6d2b79f5);\n\t\t\t\tt = Math.imul(t ^ (t >>> 15), t | 1);\n\t\t\t\tt ^= t + Math.imul(t ^ (t >>> 7), t | 61);\n\t\t\t\treturn ((t ^ (t >>> 14)) >>> 0) / 4294967296;\n\t\t\t};\n\t\t};\n\t\tconst random = mulberry32(randomSeed);\n\t\treturn Float32Array.from([...Array(size * size * 2)].map(() => random()));\n\t}\n\n\tdispose() {\n\t\tthis.butterflyTexture.forEach(texture => texture.dispose());\n\t\tthis.butterflyTexture.clear();\n\t\tthis.noiseTexture.forEach(texture => texture.dispose());\n\t\tthis.noiseTexture.clear();\n\n\t\tthis.renderTarget.dispose();\n\n\t\tthis.h0Pass.dispose();\n\t}\n\n}\n\nconst defaultBuildParams = {\n\tcascades: [\n\t\t{\n\t\t\tsize: 100.0,\n\t\t\tstrength: 2.0,\n\t\t\tcroppiness: -1.5,\n\t\t\tminWave: 1.0e-6,\n\t\t\tmaxWave: 1.0e6\n\t\t},\n\t\t{\n\t\t\tsize: 60.0,\n\t\t\tstrength: 2.0,\n\t\t\tcroppiness: -1.5,\n\t\t\tminWave: 1.0e-6,\n\t\t\tmaxWave: 1.0e6\n\t\t},\n\t\t{\n\t\t\tsize: 6.0,\n\t\t\tstrength: 2.0,\n\t\t\tcroppiness: -1.5,\n\t\t\tminWave: 1.0e-6,\n\t\t\tmaxWave: 1.0e6\n\t\t}\n\t],\n\tresolution: 256,\n\twind: [4.5, 2.5],\n\talignment: 1.0,\n\trandomSeed: 0\n};"
  },
  {
    "path": "examples/jsm/ocean/OceanMaterial.js",
    "content": "import { ShaderMaterial } from 't3d';\n\nexport class OceanMaterial extends ShaderMaterial {\n\n\tconstructor() {\n\t\tsuper(OceanShader);\n\t\tthis.defines.SHORELINE = false;\n\t}\n\n\tsetOceanField(oceanField) {\n\t\tconst uniforms = this.uniforms;\n\n\t\tconst cascades = oceanField.params.cascades;\n\t\tconst dataMaps = oceanField.dataMaps;\n\n\t\tuniforms.sizes[0] = cascades[0].size;\n\t\tuniforms.sizes[1] = cascades[1].size;\n\t\tuniforms.sizes[2] = cascades[2].size;\n\n\t\tuniforms.croppinesses[0] = cascades[0].croppiness;\n\t\tuniforms.croppinesses[1] = cascades[1].croppiness;\n\t\tuniforms.croppinesses[2] = cascades[2].croppiness;\n\n\t\tuniforms.dx_hy_dz_dxdz0 = dataMaps[0];\n\t\tuniforms.sx_sz_dxdx_dzdz0 = dataMaps[1];\n\t\tuniforms.dx_hy_dz_dxdz1 = dataMaps[2];\n\t\tuniforms.sx_sz_dxdx_dzdz1 = dataMaps[3];\n\t\tuniforms.dx_hy_dz_dxdz2 = dataMaps[4];\n\t\tuniforms.sx_sz_dxdx_dzdz2 = dataMaps[5];\n\t}\n\n}\n\nexport const OceanShader = {\n\tname: 'ocean',\n\tdefines: {},\n\tuniforms: {\n\t\tdx_hy_dz_dxdz0: null,\n\t\tsx_sz_dxdx_dzdz0: null,\n\t\tdx_hy_dz_dxdz1: null,\n\t\tsx_sz_dxdx_dzdz1: null,\n\t\tdx_hy_dz_dxdz2: null,\n\t\tsx_sz_dxdx_dzdz2: null,\n\t\tsizes: [0, 0, 0],\n\t\tcroppinesses: [0, 0, 0],\n\t\tfoamSpreading: 1.2,\n\t\tfoamContrast: 7.2,\n\t\t// for shoreline\n\t\ttDepth: null,\n\t\ttNoise: null\n\t},\n\tvertexShader: /* glsl */`\n\t\tattribute vec3 a_Position;\n\n\t\tuniform mat4 u_Model;\n\t\tuniform mat4 u_ProjectionView;\n\n\t\t#include <transpose>\n\t\t#include <inverse>\n\t\t#include <logdepthbuf_pars_vert>\n\n\t\tuniform sampler2D dx_hy_dz_dxdz0;\n\t\tuniform sampler2D sx_sz_dxdx_dzdz0;\n\t\tuniform sampler2D dx_hy_dz_dxdz1;\n\t\tuniform sampler2D sx_sz_dxdx_dzdz1;\n\t\tuniform sampler2D dx_hy_dz_dxdz2;\n\t\tuniform sampler2D sx_sz_dxdx_dzdz2;\n\t\tuniform float sizes[3];\n\t\tuniform float croppinesses[3];\n\t\tuniform float foamSpreading;\n\t\tuniform float foamContrast;\n\n\t\tvarying vec3 _position;\n\t\tvarying vec2 _xz;\n\n\t\tvec3 getDisplacement(in vec2 xz) {\n\t\t\tvec2 uv0 = xz / sizes[0];\n\t\t\tvec2 uv1 = xz / sizes[1];\n\t\t\tvec2 uv2 = xz / sizes[2];\n\t\t\treturn\n\t\t\t\ttexture2D(dx_hy_dz_dxdz0, uv0).xyz * vec3(croppinesses[0], 1.0, croppinesses[0]) +\n\t\t\t\ttexture2D(dx_hy_dz_dxdz1, uv1).xyz * vec3(croppinesses[1], 1.0, croppinesses[1]) +\n\t\t\t\ttexture2D(dx_hy_dz_dxdz2, uv2).xyz * vec3(croppinesses[2], 1.0, croppinesses[2]);\n\t\t}\n\n\t\tvoid main() {\n\t\t\tvec4 worldPosition = u_Model * vec4(a_Position, 1.0);\n\n\t\t\t_xz = worldPosition.xz;\n\t\t\t_position = worldPosition.xyz + getDisplacement(_xz);\n\n\t\t\tgl_Position = u_ProjectionView * vec4(_position, 1.0);\n\n\t\t\t#include <logdepthbuf_vert>\n\t\t}\n\t`,\n\tfragmentShader: /* glsl */`\n\t\tuniform vec3 u_CameraPosition;\n\t\tuniform samplerCube envMap;\n\n\t\t#include <inverse>\n\n\t\tuniform sampler2D dx_hy_dz_dxdz0;\n\t\tuniform sampler2D sx_sz_dxdx_dzdz0;\n\t\tuniform sampler2D dx_hy_dz_dxdz1;\n\t\tuniform sampler2D sx_sz_dxdx_dzdz1;\n\t\tuniform sampler2D dx_hy_dz_dxdz2;\n\t\tuniform sampler2D sx_sz_dxdx_dzdz2;\n\t\tuniform float sizes[3];\n\t\tuniform float croppinesses[3];\n\t\tuniform float foamSpreading;\n\t\tuniform float foamContrast;\n\n\t\t#ifdef SHORELINE\n\t\t\tuniform mat4 u_Projection;\n\n\t\t\tuniform sampler2D tNoise;\n\t\t\tuniform sampler2D tDepth;\n\t\t#endif\n\n\t\tvarying vec3 _position;\n\t\tvarying vec2 _xz;\n\n\t\tvec4 jacobian(float dxdx, float dxdz, float dzdz) {\n\t\t\tfloat Jxx = 1.0 + dxdx;\n\t\t\tfloat Jxz = dxdz;\n\t\t\tfloat Jzz = 1.0 + dzdz;\n\t\t\treturn vec4(Jxx, Jxz, Jxz, Jzz);\n\t\t}\n\n\t\tfloat det(vec4 jacobian) {\n\t\t\treturn jacobian.x * jacobian.w - jacobian.y * jacobian.z;\n\t\t}\n\n\t\tvec3 getNormal(vec2 xz) {\n\t\t\tvec2 uv0 = xz / sizes[0];\n\t\t\tvec2 uv1 = xz / sizes[1];\n\t\t\tvec2 uv2 = xz / sizes[2];\n\n\t\t\tvec4 _sx_sz_dxdx_dzdz0 = texture2D(sx_sz_dxdx_dzdz0, uv0).xyzw;\n\t\t\tvec4 _sx_sz_dxdx_dzdz1 = texture2D(sx_sz_dxdx_dzdz1, uv1).xyzw;\n\t\t\tvec4 _sx_sz_dxdx_dzdz2 = texture2D(sx_sz_dxdx_dzdz2, uv2).xyzw;\n\n\t\t\tfloat sx = _sx_sz_dxdx_dzdz0.x + _sx_sz_dxdx_dzdz1.x + _sx_sz_dxdx_dzdz2.x;\n\t\t\tfloat sz = _sx_sz_dxdx_dzdz0.y + _sx_sz_dxdx_dzdz1.y + _sx_sz_dxdx_dzdz2.y;\n\t\t\tfloat dxdx = _sx_sz_dxdx_dzdz0.z * croppinesses[0] + _sx_sz_dxdx_dzdz1.z * croppinesses[1] + _sx_sz_dxdx_dzdz2.z * croppinesses[2];\n\t\t\tfloat dzdz = _sx_sz_dxdx_dzdz0.w * croppinesses[0] + _sx_sz_dxdx_dzdz1.w * croppinesses[1] + _sx_sz_dxdx_dzdz2.w * croppinesses[2];\n\n\t\t\tvec2 slope = vec2(sx / (1.0 + dxdx), sz / (1.0 + dzdz));\n\t\t\treturn normalize(vec3(-slope.x, 1.0, -slope.y));\n\t\t}\n\n\t\tfloat getFoam(vec2 xz) {\n\t\t\tvec2 uv0 = xz / sizes[0];\n\t\t\tvec2 uv1 = xz / sizes[1];\n\t\t\tvec2 uv2 = xz / sizes[2];\n\n\t\t\tvec2 dxdx_dzdz0 = texture2D(sx_sz_dxdx_dzdz0, uv0).zw;\n\t\t\tvec2 dxdx_dzdz1 = texture2D(sx_sz_dxdx_dzdz1, uv1).zw;\n\t\t\tvec2 dxdx_dzdz2 = texture2D(sx_sz_dxdx_dzdz2, uv2).zw;\n\n\t\t\tfloat dxdz0 = texture2D(dx_hy_dz_dxdz0, uv0).w;\n\t\t\tfloat dxdz1 = texture2D(dx_hy_dz_dxdz1, uv1).w;\n\t\t\tfloat dxdz2 = texture2D(dx_hy_dz_dxdz2, uv2).w;\n\n\t\t\tvec2 dxdx_dzdz = dxdx_dzdz0 * croppinesses[0] + dxdx_dzdz1 * croppinesses[1] + dxdx_dzdz2 * croppinesses[2];\n\t\t\tfloat dxdz = dxdz0 * croppinesses[0] + dxdz1 * croppinesses[1] + dxdz2 * croppinesses[2];\n\n\t\t\tfloat val = det(jacobian(dxdx_dzdz.x, dxdz, dxdx_dzdz.y));\n\t\t\treturn abs(pow(-min(0.0, val - foamSpreading), foamContrast));\n\t\t}\n\n\t\tvec3 gammaCorrection(const vec3 color) {\n\t\t\treturn pow(color, vec3(1.0f / 2.2f));\n\t\t}\n\n\t\tvec3 ACESFilm(vec3 x){\n\t\t\treturn clamp((x * (2.51 * x + 0.03)) / (x * (2.43 * x + 0.59) + 0.14), 0.0, 1.0);\n\t\t}\n\n\t\tfloat fresnelSchlick(vec3 view, vec3 normal){\n\t\t\tfloat cosTheta = dot(normal, normalize(view));\n\t\t\tfloat F0 = 0.02;\n\t\t\treturn F0 + (1.0 - F0) * pow(1.0 - cosTheta, 5.0);\n\t\t}\n\n\t\tvec3 surface(in vec3 normal, in vec3 view) {\n\t\t\tconst vec3 upwelling = vec3(0.0, 0.2, 0.3);\n\t\t\tconst vec3 mist = vec3(0.34, 0.42, 0.5);\n\t\t\tconst float nShell = 1.34f;\n\t\t\tconst float kDiffuse = 1.0f;\n\t\t\tconst vec3 sunIndensity = vec3(0.42f, 0.39f, 0.19f) * 1.0e2;\n\t\t\tvec3 sunDir = normalize(vec3(1.0f, 1.0f, -10.0f));\n\n\t\t\tvec3 ref = reflect(-view, normal);\n\t\t\tref.y = max(ref.y, 1.0e-0);\n\t\t\tref = normalize(ref);\n\n\t\t\tvec3 sky = ACESFilm(textureLod(envMap, ref, 0.0f).rgb) + pow(max(dot(ref, sunDir), 0.0f), 500.0f) * sunIndensity;\n\t\t\tsky = gammaCorrection(sky);\n\t\t\t// sky = vec3(0.69, 0.84, 1.0);\n\n\t\t\tfloat reflectivity;\n\t\t\tfloat costhetai = abs(dot(normal, normalize(view)));\n\t\t\tfloat thetai = acos(costhetai);\n\t\t\tfloat sinthetat = sin(thetai) / nShell;\n\t\t\tfloat thetat = asin(sinthetat);\n\n\t\t\tif(thetai == 0.0)\n\t\t\t{\n\t\t\t\treflectivity = (nShell - 1.0f) / (nShell + 1.0f);\n\t\t\t\treflectivity = reflectivity * reflectivity;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tfloat fs = sin(thetat - thetai)  / sin(thetat + thetai);\n\t\t\t\tfloat ts = tan(thetat - thetai)  / tan(thetat + thetai);\n\t\t\t\treflectivity = 0.5 * (fs * fs + ts * ts );\n\t\t\t}\n\n\t\t\t// reflectivity = fresnelSchlick(view,normal);\n\n\t\t\tfloat falloff = 1.0f; // min(exp(-(length(view) - 1000.0f) * 1.0e-2), 1.0f) * kDiffuse;\n\t\t\tvec3 surf =  reflectivity * sky + (1.0f - reflectivity) * upwelling;\n\t\t\treturn falloff * surf  + (1.0f - falloff) * mist;\n\t\t}\n\n\t\tvoid main() {\n\t\t\tfloat f = getFoam(_xz);\n\t\t\tvec3 n = getNormal(_xz);\n\t\t\tfloat a = 1.0;\n\n\t\t\t#ifdef SHORELINE\n\t\t\t\tmat4 projectionInv = inverseMat4(u_Projection);\n\n\t\t\t\tivec2 depthSize = textureSize(tDepth, 0);\n\t\t\t\tvec2 screenUV = gl_FragCoord.xy / vec2(depthSize);\n\t\t\t\tfloat depth = texture2D(tDepth, screenUV).r * 2.0 - 1.0;\n\t\t\t\tvec4 projectedPos = vec4(screenUV * 2.0 - 1.0, depth, 1.0);\n\t\t\t\tvec4 pos = projectionInv * projectedPos;\n\t\t\t\tvec3 rayOrigin = pos.xyz / pos.w;\n\n\t\t\t\tvec4 waterProjectedPos = vec4(screenUV * 2.0 - 1.0, gl_FragCoord.z * 2.0 - 1.0, 1.0);\n\t\t\t\tvec4 waterPos = projectionInv * waterProjectedPos;\n\t\t\t\tvec3 waterViewPos = waterPos.xyz / waterPos.w;\n\n\t\t\t\tfloat realDist = distance(rayOrigin, waterViewPos);\n\n\t\t\t\t// Shore Waves\n\t\t\t\tvec3 dPosDx = dFdx(_position);\n\t\t\t\tvec3 dPosDy = dFdy(_position);\n\t\t\t\tfloat dDistDx = dFdx(realDist);\n\t\t\t\tfloat dDistDy = dFdy(realDist);\n\t\t\t\tvec3 rawGrad = dPosDx * dDistDx + dPosDy * dDistDy;\n\t\t\t\tvec3 distGrad = length(rawGrad) > 1e-5 ? normalize(rawGrad) : vec3(0.0);\n\n\t\t\t\tfloat _uTime = 0.0;\n\t\t\t\tfloat shoreWaveSpeed = 1.0;\n\t\t\t\tfloat phase = 2.0 * pow(max(realDist, 0.0), 0.8) + _uTime * shoreWaveSpeed;\n\t\t\t\tfloat waveVal = sin(phase);\n\t\t\t\tfloat dPhase = 1.6 * pow(max(realDist, 0.1), -0.2);\n\t\t\t\tfloat waveHeight = exp(waveVal - 1.0);\n\t\t\t\tfloat waveSlope = waveHeight * cos(phase) * dPhase;\n\t\t\t\tfloat shoreMask = 1.0 - smoothstep(0.0, 30.0, realDist);\n\t\t\t\tvec3 waveNormal = -distGrad * waveSlope * 0.8 * shoreMask;\n\n\t\t\t\tn = normalize(n + waveNormal);\n\n\t\t\t\tfloat _NoiseScale = 3.0;\n\t\t\t\tfloat _EdgeSpeed = 0.9;\n\t\t\t\tfloat _EdgeAmount = 1.0;\n\t\t\t\tfloat _EdgeFoamDepth = 8.0;\n\n\t\t\t\tvec2 samplerUV = vec2(_uTime * 0.1, 0.0);\n\t\t\t\tfloat distortNoise = texture2D(tNoise, _xz / _NoiseScale + samplerUV).r * 2.3;\n\t\t\t\tfloat edgeFoamMask = 1.0 - smoothstep(0.0, _EdgeFoamDepth, realDist);\n\t\t\t\tedgeFoamMask = clamp(sin((edgeFoamMask - _uTime * _EdgeSpeed) * 3.14159 * _EdgeAmount), 0.0, 1.0) * edgeFoamMask * distortNoise;\n\n\t\t\t\tf = max(f, edgeFoamMask);\n\n\t\t\t\tfloat _DepthDensity = 0.1;\n\t\t\t\ta = 1.0 - exp(-_DepthDensity * realDist);\n\t\t\t\ta = mix(a, 1.0, clamp(f, 0.0, 0.4));\n\t\t\t#endif\n\n\t\t\tconst vec3 foam = vec3(1.0f);\n\t\t\tvec3 water = surface(n, u_CameraPosition - _position);\n\t\t\tgl_FragColor = vec4(mix(water, foam, f), a);\n\t\t}\n\t`\n};"
  },
  {
    "path": "examples/jsm/ocean/Utils.js",
    "content": "import { Texture2D, PIXEL_TYPE, TEXTURE_WRAP, TEXTURE_FILTER, PIXEL_FORMAT } from 't3d';\n\nexport function createFloat4Texture(width, height, filtering = TEXTURE_FILTER.NEAREST, mode = TEXTURE_WRAP.REPEAT) {\n\tconst texture = new Texture2D();\n\ttexture.image = { width, height, data: null };\n\ttexture.minFilter = filtering;\n\ttexture.magFilter = filtering;\n\ttexture.wrapS = mode;\n\ttexture.wrapT = mode;\n\ttexture.type = PIXEL_TYPE.FLOAT;\n\ttexture.format = PIXEL_FORMAT.RGBA;\n\ttexture.internalformat = PIXEL_FORMAT.RGBA32F;\n\ttexture.generateMipmaps = false;\n\ttexture.flipY = false;\n\treturn texture;\n}\n\nexport function createFloat2Texture(width, height, filtering = TEXTURE_FILTER.NEAREST, mode = TEXTURE_WRAP.REPEAT) {\n\tconst texture = new Texture2D();\n\ttexture.image = { width, height, data: null };\n\ttexture.minFilter = filtering;\n\ttexture.magFilter = filtering;\n\ttexture.wrapS = mode;\n\ttexture.wrapT = mode;\n\ttexture.type = PIXEL_TYPE.FLOAT;\n\ttexture.format = PIXEL_FORMAT.RG;\n\ttexture.internalformat = PIXEL_FORMAT.RG32F;\n\ttexture.generateMipmaps = false;\n\ttexture.flipY = false;\n\ttexture.unpackAlignment = 1;\n\treturn texture;\n}"
  },
  {
    "path": "examples/jsm/ocean/index.js",
    "content": "export { OceanFieldBuilder } from './OceanFieldBuilder.js';\nexport * from './OceanMaterial.js';"
  },
  {
    "path": "examples/jsm/ocean/shaders/FFT2HShader.js",
    "content": "// Reference: https://stackblitz.com/edit/fft-2d?file=ocean%2Fprograms%2Ffft2-h.ts\n\nexport const FFT2HShader = {\n\tname: 'ocean_fft2_h',\n\tdefines: {},\n\tuniforms: {\n\t\tspectrum0: null,\n\t\tspectrum1: null,\n\t\tspectrum2: null,\n\t\tspectrum3: null,\n\t\tspectrum4: null,\n\t\tspectrum5: null,\n\t\tbutterfly: null,\n\t\tphase: 0\n\t},\n\tvertexShader: /* glsl */`\n\t\tattribute vec3 a_Position;\n\t\tvoid main() {\n\t\t\tgl_Position = vec4(a_Position, 1.0);\n\t\t}\n\t`,\n\tfragmentShader: /* glsl */`\n\t\tuniform sampler2D spectrum0;\n\t\tuniform sampler2D spectrum1;\n\t\tuniform sampler2D spectrum2;\n\t\tuniform sampler2D spectrum3;\n\t\tuniform sampler2D spectrum4;\n\t\tuniform sampler2D spectrum5;\n\t\tuniform sampler2D butterfly;\n\t\tuniform int phase;\n\n\t\tstruct complex {\n\t\t\tfloat re;\n\t\t\tfloat im;\n\t\t};\n\n\t\tcomplex add(complex a, complex b) {\n\t\t\treturn complex(a.re + b.re, a.im + b.im);\n\t\t}\n\n\t\tcomplex mult(complex a, complex b) {\n\t\t\treturn complex(a.re * b.re - a.im * b.im, a.re * b.im + a.im * b.re);\n\t\t}\n\n\t\tcomplex scale(complex a, float v) {\n\t\t\treturn complex(a.re * v, a.im * v);\n\t\t}\n\n\t\tvec2 twiddleXY(in sampler2D source, in vec4 texelButt) {\n\t\t\tvec4 texelA = texelFetch(source, ivec2(texelButt.b, gl_FragCoord.y), 0).xyzw;\n\t\t\tvec4 texelB = texelFetch(source, ivec2(texelButt.a, gl_FragCoord.y), 0).xyzw;\n\t\t\tcomplex a = complex(texelA.x, texelA.y);\n\t\t\tcomplex b = complex(texelB.x, texelB.y);\n\t\t\tcomplex w = complex(texelButt.r, texelButt.g);\n\t\t\tcomplex r = scale(add(a, mult(b, w)), 0.5);\n\n\t\t\treturn vec2(r.re, r.im);\n\t\t}\n\n\t\tvec2 twiddleZW(in sampler2D source, in vec4 texelButt) {\n\t\t\tvec4 texelA = texelFetch(source, ivec2(texelButt.b, gl_FragCoord.y), 0).xyzw;\n\t\t\tvec4 texelB = texelFetch(source, ivec2(texelButt.a, gl_FragCoord.y), 0).xyzw;\n\t\t\tcomplex a = complex(texelA.z, texelA.w);\n\t\t\tcomplex b = complex(texelB.z, texelB.w);\n\t\t\tcomplex w = complex(texelButt.r, texelButt.g);\n\t\t\tcomplex r = scale(add(a, mult(b, w)), 0.5);\n\n\t\t\treturn vec2(r.re, r.im);\n\t\t}\n\n\t\tvoid main() {\n\t\t\tvec4 texelButt = texelFetch(butterfly, ivec2(phase,  gl_FragCoord.x), 0).rgba;\n\t\t\tgl_FragData[0] = vec4(twiddleXY(spectrum0, texelButt), twiddleZW(spectrum0, texelButt)); //ifft0\n\t\t\tgl_FragData[1] = vec4(twiddleXY(spectrum1, texelButt), twiddleZW(spectrum1, texelButt)); //ifft1\n\t\t\tgl_FragData[2] = vec4(twiddleXY(spectrum2, texelButt), twiddleZW(spectrum2, texelButt)); //ifft2\n\t\t\tgl_FragData[3] = vec4(twiddleXY(spectrum3, texelButt), twiddleZW(spectrum3, texelButt)); //ifft3\n\t\t\tgl_FragData[4] = vec4(twiddleXY(spectrum4, texelButt), twiddleZW(spectrum4, texelButt)); //ifft4\n\t\t\tgl_FragData[5] = vec4(twiddleXY(spectrum5, texelButt), twiddleZW(spectrum5, texelButt)); //ifft5\n\t\t}\n\t`\n};"
  },
  {
    "path": "examples/jsm/ocean/shaders/FFT2VShader.js",
    "content": "// Reference: https://stackblitz.com/edit/fft-2d?file=ocean%2Fprograms%2Ffft2-v.ts\n\nexport const FFT2VShader = {\n\tname: 'ocean_fft2_v',\n\tdefines: {},\n\tuniforms: {\n\t\tspectrum0: null,\n\t\tspectrum1: null,\n\t\tspectrum2: null,\n\t\tspectrum3: null,\n\t\tspectrum4: null,\n\t\tspectrum5: null,\n\t\tbutterfly: null,\n\t\tphase: 0\n\t},\n\tvertexShader: /* glsl */`\n\t\tattribute vec3 a_Position;\n\t\tvoid main() {\n\t\t\tgl_Position = vec4(a_Position, 1.0);\n\t\t}\n\t`,\n\tfragmentShader: /* glsl */`\n\t\tuniform sampler2D spectrum0;\n\t\tuniform sampler2D spectrum1;\n\t\tuniform sampler2D spectrum2;\n\t\tuniform sampler2D spectrum3;\n\t\tuniform sampler2D spectrum4;\n\t\tuniform sampler2D spectrum5;\n\t\tuniform sampler2D butterfly;\n\t\tuniform int phase;\n\n\t\tstruct complex {\n\t\t\tfloat re;\n\t\t\tfloat im;\n\t\t};\n\n\t\tcomplex add(complex a, complex b) {\n\t\t\treturn complex(a.re + b.re, a.im + b.im);\n\t\t}\n\n\t\tcomplex mult(complex a, complex b) {\n\t\t\treturn complex(a.re * b.re - a.im * b.im, a.re * b.im + a.im * b.re);\n\t\t}\n\n\t\tcomplex scale(complex a, float v) {\n\t\t\treturn complex(a.re * v, a.im * v);\n\t\t}\n\n\t\tvec2 twiddleXY(in sampler2D source, in vec4 texelButt) {\n\t\t\tvec4 texelA = texelFetch(source, ivec2(gl_FragCoord.x, texelButt.b), 0).xyzw;\n\t\t\tvec4 texelB = texelFetch(source, ivec2(gl_FragCoord.x, texelButt.a), 0).xyzw;\n\t\t\tcomplex a = complex(texelA.x, texelA.y);\n\t\t\tcomplex b = complex(texelB.x, texelB.y);\n\t\t\tcomplex w = complex(texelButt.r, texelButt.g);\n\t\t\tcomplex r = scale(add(a, mult(b, w)), 0.5);\n\n\t\t\treturn vec2(r.re, r.im);\n\t\t}\n\n\t\tvec2 twiddleZW(in sampler2D source, in vec4 texelButt) {\n\t\t\tvec4 texelA = texelFetch(source, ivec2(gl_FragCoord.x, texelButt.b), 0).xyzw;\n\t\t\tvec4 texelB = texelFetch(source, ivec2(gl_FragCoord.x, texelButt.a), 0).xyzw;\n\t\t\tcomplex a = complex(texelA.z, texelA.w);\n\t\t\tcomplex b = complex(texelB.z, texelB.w);\n\t\t\tcomplex w = complex(texelButt.r, texelButt.g);\n\t\t\tcomplex r = scale(add(a, mult(b, w)), 0.5);\n\n\t\t\treturn vec2(r.re, r.im);\n\t\t}\n\n\t\tvoid main() {\n\t\t\tvec4 texelButt = texelFetch(butterfly, ivec2(phase,  gl_FragCoord.y), 0).rgba;\n\t\t\tgl_FragData[0] = vec4(twiddleXY(spectrum0, texelButt), twiddleZW(spectrum0, texelButt)); //ifft0\n\t\t\tgl_FragData[1] = vec4(twiddleXY(spectrum1, texelButt), twiddleZW(spectrum1, texelButt)); //ifft1\n\t\t\tgl_FragData[2] = vec4(twiddleXY(spectrum2, texelButt), twiddleZW(spectrum2, texelButt)); //ifft2\n\t\t\tgl_FragData[3] = vec4(twiddleXY(spectrum3, texelButt), twiddleZW(spectrum3, texelButt)); //ifft3\n\t\t\tgl_FragData[4] = vec4(twiddleXY(spectrum4, texelButt), twiddleZW(spectrum4, texelButt)); //ifft4\n\t\t\tgl_FragData[5] = vec4(twiddleXY(spectrum5, texelButt), twiddleZW(spectrum5, texelButt)); //ifft5\n\t\t}\n\t`\n};\n"
  },
  {
    "path": "examples/jsm/ocean/shaders/H0Shader.js",
    "content": "// Reference: https://stackblitz.com/edit/fft-2d?file=ocean%2Fprograms%2Fh0.ts\n\nexport const H0Shader = {\n\tname: 'ocean_fft_h0',\n\tdefines: {},\n\tuniforms: {\n\t\tnoise: null,\n\t\tresolution: 0,\n\t\twind: [0, 0],\n\t\talignment: 0,\n\t\tcascades: [\n\t\t\t{ size: 0, strength: 0, minK: 0, maxK: 0 },\n\t\t\t{ size: 0, strength: 0, minK: 0, maxK: 0 },\n\t\t\t{ size: 0, strength: 0, minK: 0, maxK: 0 }\n\t\t]\n\t},\n\tvertexShader: /* glsl */`\n\t\tattribute vec3 a_Position;\n\t\tvoid main() {\n\t\t\tgl_Position = vec4(a_Position, 1.0);\n\t\t}\n\t`,\n\tfragmentShader: /* glsl */`\n\t\t#define PI2 6.2831853071\n\t\t#define g 9.81\n\n\t\tuniform sampler2D noise;\n\t\tuniform int resolution; // N\n\t\tuniform vec2 wind;\n\t\tuniform float alignment;\n\n\t\tuniform struct FieldCascade {\n\t\t\tfloat size;\n\t\t\tfloat strength;\n\t\t\tfloat minK;\n\t\t\tfloat maxK;\n\t\t} cascades[3];\n\n\t\tvec4 gauss() {\n\t\t\tvec2 uv = vec2(ivec2(gl_FragCoord.xy)) / float(resolution);\n\n\t\t\tvec2 noise0 = texture2D(noise, uv).rg;\n\t\t\tvec2 noise1 = texture2D(noise, -uv).rg;\n\n\t\t\tfloat u0 = 2.0 * PI * noise0.x;\n\t\t\tfloat v0 = sqrt(-2.0 * log(noise0.y));\n\n\t\t\tfloat u1 = 2.0 * PI * noise1.x;\n\t\t\tfloat v1 = sqrt(-2.0 * log(noise1.y));\n\n\t\t\treturn vec4(v0 * cos(u0), v0 * sin(u0), v1 * cos(u1), -v1 * sin(u1));\n\t\t}\n\n\t\tvec4 phillips(in vec2 k, float A, float minK, float maxK) {\n\t\t\tfloat k2 = dot(k, k);\n\n\t\t\tif(k2 <= minK * minK || k2 >= maxK * maxK) {\n\t\t\t\treturn vec4(0.0);\n\t\t\t}\n\n\t\t\tfloat L = dot(wind, wind) / g;\n\t\t\tfloat L2 = L * L;\n\t\t\tfloat h0k = (A / k2 / k2) * exp(-1.0 / (k2 * L2)) * 0.5, h0mk = h0k;\n\n\t\t\tif(alignment > 0.0) {\n\t\t\t\th0k *=  pow(max(0.0, dot(normalize(wind), normalize(k))), alignment);\n\t\t\t\th0mk *=  pow(max(0.0, dot(normalize(wind), normalize(-k))), alignment);\n\t\t\t}\n\n\t\t\treturn sqrt(vec4(h0k, h0k, h0mk, h0mk));\n\t\t}\n\n\t\tvoid main() {\n\t\t\tvec2 x = vec2(ivec2(gl_FragCoord.xy) - ivec2(resolution / 2)); // [-N/2, N/2]\n\t\t\tvec2 k = vec2(PI2) * x;\n\t\t\tvec4 rnd = gauss();\n\n\t\t\tgl_FragData[0] = phillips(k / cascades[0].size, cascades[0].strength, cascades[0].minK, cascades[0].maxK) * rnd;\n\t\t\tgl_FragData[1] = phillips(k / cascades[1].size, cascades[1].strength, cascades[1].minK, cascades[1].maxK) * rnd;\n\t\t\tgl_FragData[2] = phillips(k / cascades[2].size, cascades[2].strength, cascades[2].minK, cascades[2].maxK) * rnd;\n\t\t}\n\t`\n};"
  },
  {
    "path": "examples/jsm/ocean/shaders/HkShader.js",
    "content": "// Reference: https://stackblitz.com/edit/fft-2d?file=ocean%2Fprograms%2Fhk.ts\n\nexport const HkShader = {\n\tname: 'ocean_fft_hk',\n\tdefines: {},\n\tuniforms: {\n\t\tresolution: 256,\n\t\tsizes: [0, 0, 0]\n\t},\n\tvertexShader: /* glsl */`\n\t\tattribute vec3 a_Position;\n\t\tvoid main() {\n\t\t\tgl_Position = vec4(a_Position, 1.0);\n\t\t}\n\t`,\n\tfragmentShader: /* glsl */`\n\t\t#define g 9.81\n\n\t\tuniform int resolution; // N\n\t\tuniform float sizes[3]; // L\n\t\tuniform float t;\n\t\tuniform sampler2D h0Texture0;\n\t\tuniform sampler2D h0Texture1;\n\t\tuniform sampler2D h0Texture2;\n\n\t\t// --\n\t\tstruct complex {\n\t\t\tfloat re;\n\t\t\tfloat im;\n\t\t};\n\n\t\tconst complex i = complex(0.0, 1.0);\n\n\t\tcomplex add(complex a, complex b) {\n\t\t\treturn complex(a.re + b.re, a.im + b.im);\n\t\t}\n\n\t\tcomplex mult(complex a, complex b) {\n\t\t\treturn complex(a.re * b.re - a.im * b.im, a.re * b.im + a.im * b.re);\n\t\t}\n\n\t\tcomplex eix(float x) {\n\t\t\treturn complex(cos(x), sin(x));\n\t\t}\n\n\t\tcomplex conj(complex a) {\n\t\t\treturn complex(a.re, -a.im);\n\t\t}\n\n\t\tcomplex scale(complex v, float s) {\n\t\t\treturn complex(v.re * s, v.im * s);\n\t\t}\n\n\t\tcomplex negate(complex v) {\n\t\t\treturn complex(-v.re, -v.im);\n\t\t}\n\n\t\tconst float RATIO = 0.618033989036;\n\n\t\t// --\n\t\tstruct spectrum {\n\t\t\tcomplex dx;\n\t\t\tcomplex hy;\n\t\t\tcomplex dz;\n\t\t\tcomplex sx;\n\t\t\tcomplex sz;\n\t\t\tcomplex dxdx;\n\t\t\tcomplex dxdz;\n\t\t\tcomplex dzdz;\n\t\t};\n\n\t\tspectrum getSpectrum(in sampler2D h0Texture, in vec2 x, float size) {\n\t\t\tcomplex hy = complex(0.0, 0.0);\n\t\t\tcomplex sx = complex(0.0, 0.0);\n\t\t\tcomplex sz = complex(0.0, 0.0);\n\t\t\tcomplex dx = complex(0.0, 0.0);\n\t\t\tcomplex dz = complex(0.0, 0.0);\n\t\t\tcomplex dxdx = complex(0.0, 0.0);\n\t\t\tcomplex dzdz = complex(0.0, 0.0);\n\t\t\tcomplex dxdz = complex(0.0, 0.0);\n\n\t\t\tif(size <= 1.0e-3) {\n\t\t\t\treturn spectrum(dx, hy, dz, sx, sz, dxdx, dxdz, dzdz);\n\t\t\t}\n\n\t\t\tvec2 k = vec2(2.0 * PI * x.x / size, 2.0 * PI * x.y / size);\n\t\t\tfloat kLen = length(k);\n\n\t\t\tif(kLen > 1.0e-6) {\n\t\t\t\tfloat w = sqrt(g * kLen);\n\t\t\t\tvec4 h0Texel = texelFetch(h0Texture, ivec2(gl_FragCoord.xy), 0).rgba;\n\n\t\t\t\tcomplex e = eix(w * t);\n\t\t\t\tcomplex h0 = complex(h0Texel.x, h0Texel.y);\n\t\t\t\tcomplex h0MinConj = complex(h0Texel.z, h0Texel.w);\n\t\t\t\thy = add(mult(h0, e), mult(h0MinConj, conj(e)));\n\n\t\t\t\tif(int(gl_FragCoord.x) != 0) {\n\t\t\t\t\tsx = mult(complex(0.0, k.x), hy);\n\t\t\t\t\tdx = mult(complex(0.0, -k.x / kLen), hy);\n\t\t\t\t\tdxdx = scale(hy, k.x * k.x / kLen);\n\t\t\t\t}\n\n\t\t\t\tif(int(gl_FragCoord.y) != 0) {\n\t\t\t\t\tsz = mult(complex(0.0, k.y), hy);\n\t\t\t\t\tdz = mult(complex(0.0, -k.y / kLen), hy);\n\t\t\t\t\tdzdz = scale(hy, k.y * k.y / kLen);\n\n\t\t\t\t\tif(int(gl_FragCoord.x) != 0) {\n\t\t\t\t\t\tdxdz = scale(hy, k.y * k.x / kLen);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn spectrum(dx, hy, dz, sx, sz, dxdx, dxdz, dzdz);\n\t\t}\n\n\t\tvoid compressSpectrum(in spectrum spec, out vec4 part0, out vec4 part1) {\n\t\t\tcomplex dx_hy = add(spec.dx, mult(i, spec.hy));\n\t\t\tcomplex dz_dxdz = add(spec.dz, mult(i, spec.dxdz));\n\t\t\tcomplex sx_sz = add(spec.sx, mult(i, spec.sz));\n\t\t\tcomplex dxdx_dzdz = add(spec.dxdx, mult(i, spec.dzdz));\n\n\t\t\tpart0 = vec4(dx_hy.re, dx_hy.im, dz_dxdz.re, dz_dxdz.im);\n\t\t\tpart1 = vec4(sx_sz.re, sx_sz.im, dxdx_dzdz.re, dxdx_dzdz.im);\n\t\t}\n\n\t\tvoid main() {\n\t\t\tvec2 x = vec2(ivec2(gl_FragCoord.xy) - ivec2(resolution / 2)); // [-N/2, N/2)\n\n\t\t\tspectrum spec0 = getSpectrum(h0Texture0, x, sizes[0]);\n\t\t\tspectrum spec1 = getSpectrum(h0Texture1, x, sizes[1]);\n\t\t\tspectrum spec2 = getSpectrum(h0Texture2, x, sizes[2]);\n\n\t\t\tcompressSpectrum(spec0, gl_FragData[0], gl_FragData[1]);\n\t\t\tcompressSpectrum(spec1, gl_FragData[2], gl_FragData[3]);\n\t\t\tcompressSpectrum(spec2, gl_FragData[4], gl_FragData[5]);\n\t\t}\n\t`\n};"
  },
  {
    "path": "examples/jsm/ocean/shaders/PostFFT2Shader.js",
    "content": "// Reference: https://stackblitz.com/edit/fft-2d?file=ocean%2Fprograms%2Fpost-fft2.ts\n\nexport const PostFFT2Shader = {\n\tname: 'ocean_fft2_post',\n\tdefines: {},\n\tuniforms: {\n\t\tN2: 1.0,\n\t\tifft0: null,\n\t\tifft1: null,\n\t\tifft2: null,\n\t\tifft3: null,\n\t\tifft4: null,\n\t\tifft5: null\n\t},\n\tvertexShader: /* glsl */`\n\t\tattribute vec3 a_Position;\n\t\tvoid main() {\n\t\t\tgl_Position = vec4(a_Position, 1.0);\n\t\t}\n\t`,\n\tfragmentShader: /* glsl */`\n\t\tuniform float N2;\n\t\tuniform sampler2D ifft0; // dx_hy_dz_dxdz\n\t\tuniform sampler2D ifft1; // sx_sz_dxdx_dzdz\n\t\tuniform sampler2D ifft2; // dx_hy_dz_dxdz\n\t\tuniform sampler2D ifft3; // sx_sz_dxdx_dzdz\n\t\tuniform sampler2D ifft4; // dx_hy_dz_dxdz\n\t\tuniform sampler2D ifft5; // sx_sz_dxdx_dzdz\n\n\t\tvoid main() {\n\t\t\tconst float sign[] = float[2](1.0, -1.0);\n\t\t\tfloat p = float(int(gl_FragCoord.x) + int(gl_FragCoord.y));\n\t\t\tfloat s = sign[int(mod(p, 2.0))];\n\t\t\tfloat m = s * N2;\n\t\t\tivec2 uv = ivec2(gl_FragCoord.xy);\n\n\t\t\tgl_FragData[0] = texelFetch(ifft0, uv, 0).rgba * m; //dx_hy_dz_dxdz0\n\t\t\tgl_FragData[1] = texelFetch(ifft1, uv, 0).rgba * m; //sx_sz_dxdx_dzdz0\n\n\t\t\tgl_FragData[2] = texelFetch(ifft2, uv, 0).rgba * m; //dx_hy_dz_dxdz1\n\t\t\tgl_FragData[3] = texelFetch(ifft3, uv, 0).rgba * m; //sx_sz_dxdx_dzdz1\n\n\t\t\tgl_FragData[4] = texelFetch(ifft4, uv, 0).rgba * m; //dx_hy_dz_dxdz2\n\t\t\tgl_FragData[5] = texelFetch(ifft5, uv, 0).rgba * m; //sx_sz_dxdx_dzdz2\n\t\t}\n\t`\n};"
  },
  {
    "path": "examples/jsm/pass/BlurPass.js",
    "content": "import { ShaderPostPass } from 't3d';\nimport { BlurShader } from '../shaders/BlurShader.js';\n\nclass BlurPass extends ShaderPostPass {\n\n\tconstructor() {\n\t\tsuper(BlurShader);\n\t\tthis.setKernelSize(5);\n\t}\n\n\tsetKernelSize(val) {\n\t\tif (val == 13) {\n\t\t\tthis.material.defines['KERNEL_SIZE_INT'] = 13;\n\t\t\tthis.material.defines['KERNEL_SIZE_FLOAT'] = '13.0';\n\t\t\tthis.uniforms['kernel'] = [0.02, 0.03, 0.06, 0.08, 0.11, 0.13, 0.14, 0.13, 0.11, 0.08, 0.06, 0.03, 0.02];\n\t\t} else if (val == 9) {\n\t\t\tthis.material.defines['KERNEL_SIZE_INT'] = 9;\n\t\t\tthis.material.defines['KERNEL_SIZE_FLOAT'] = '9.0';\n\t\t\tthis.uniforms['kernel'] = [0.07, 0.09, 0.12, 0.14, 0.16, 0.14, 0.12, 0.09, 0.07];\n\t\t} else {\n\t\t\tthis.material.defines['KERNEL_SIZE_INT'] = 5;\n\t\t\tthis.material.defines['KERNEL_SIZE_FLOAT'] = '5.0';\n\t\t\tthis.uniforms['kernel'] = [0.122581, 0.233062, 0.288713, 0.233062, 0.122581];\n\t\t}\n\t}\n\n}\n\nexport { BlurPass };"
  },
  {
    "path": "examples/jsm/pass/DepthPeelingOITPass.js",
    "content": "import { ShaderPostPass, OffscreenRenderTarget, Texture2D, ATTACHMENT, TEXTURE_FILTER, PIXEL_TYPE, BLEND_FACTOR, BLEND_TYPE, BLEND_EQUATION, ShaderLib, PBRMaterial, MATERIAL_TYPE } from 't3d';\n\n// TODO: Share depth attachment with opaque render target\nclass DepthPeelingOITPass {\n\n\tconstructor(width, height) {\n\t\tthis._renderTarget1 = OffscreenRenderTarget.create2D(width, height);\n\t\tthis._renderTarget2 = OffscreenRenderTarget.create2D(width, height);\n\n\t\t// 0: depth range, 1: front color, 2: back color\n\t\tthis._renderTarget1.attach(createFloatColorTexture(), ATTACHMENT.COLOR_ATTACHMENT0);\n\t\tthis._renderTarget1.attach(createFloatColorTexture(PIXEL_TYPE.HALF_FLOAT), ATTACHMENT.COLOR_ATTACHMENT1);\n\t\tthis._renderTarget1.attach(createFloatColorTexture(PIXEL_TYPE.HALF_FLOAT), ATTACHMENT.COLOR_ATTACHMENT2);\n\n\t\tthis._renderTarget2.attach(createFloatColorTexture(), ATTACHMENT.COLOR_ATTACHMENT0);\n\t\tthis._renderTarget2.attach(createFloatColorTexture(PIXEL_TYPE.HALF_FLOAT), ATTACHMENT.COLOR_ATTACHMENT1);\n\t\tthis._renderTarget2.attach(createFloatColorTexture(PIXEL_TYPE.HALF_FLOAT), ATTACHMENT.COLOR_ATTACHMENT2);\n\n\t\tthis._depthClearRenderTarget1 = OffscreenRenderTarget.create2D(width, height);\n\t\tthis._depthClearRenderTarget1.attach(this._renderTarget1._attachments[ATTACHMENT.COLOR_ATTACHMENT0], ATTACHMENT.COLOR_ATTACHMENT0);\n\t\tthis._depthClearRenderTarget1.detach(ATTACHMENT.DEPTH_STENCIL_ATTACHMENT);\n\n\t\tthis._depthClearRenderTarget2 = OffscreenRenderTarget.create2D(width, height);\n\t\tthis._depthClearRenderTarget2.attach(this._renderTarget2._attachments[ATTACHMENT.COLOR_ATTACHMENT0], ATTACHMENT.COLOR_ATTACHMENT0);\n\t\tthis._depthClearRenderTarget2.detach(ATTACHMENT.DEPTH_STENCIL_ATTACHMENT);\n\n\t\tthis._backBlendRenderTarget = OffscreenRenderTarget.create2D(width, height);\n\n\t\tthis._backBlendPass = new ShaderPostPass(DepthPeelingBackBlendShader);\n\t\tthis._backBlendPass.material.transparent = true;\n\t\tthis._backBlendPass.material.blending = BLEND_TYPE.CUSTOM;\n\t\tthis._backBlendPass.material.blendEquationAlpha = BLEND_EQUATION.ADD;\n\t\tthis._backBlendPass.material.blendEquation = BLEND_EQUATION.ADD;\n\t\tthis._backBlendPass.material.blendSrc = BLEND_FACTOR.SRC_ALPHA;\n\t\tthis._backBlendPass.material.blendDst = BLEND_FACTOR.ONE_MINUS_SRC_ALPHA;\n\t\tthis._backBlendPass.material.blendSrcAlpha = BLEND_FACTOR.ONE;\n\t\tthis._backBlendPass.material.blendDstAlpha = BLEND_FACTOR.ONE_MINUS_SRC_ALPHA;\n\n\t\tthis._mixPass = new ShaderPostPass(DepthPeelingMixShader);\n\t\tthis._mixPass.material.transparent = true;\n\t\tthis._mixPass.material.blending = BLEND_TYPE.CUSTOM;\n\t\tthis._mixPass.material.blendEquationAlpha = BLEND_EQUATION.ADD;\n\t\tthis._mixPass.material.blendEquation = BLEND_EQUATION.ADD;\n\t\tthis._mixPass.material.blendSrc = BLEND_FACTOR.ONE;\n\t\tthis._mixPass.material.blendDst = BLEND_FACTOR.ONE_MINUS_SRC_ALPHA;\n\t\tthis._mixPass.material.blendSrcAlpha = BLEND_FACTOR.ONE;\n\t\tthis._mixPass.material.blendDstAlpha = BLEND_FACTOR.ONE_MINUS_SRC_ALPHA;\n\t\tthis._mixPass.uniforms.uFrontColor = this._renderTarget2._attachments[ATTACHMENT.COLOR_ATTACHMENT1];\n\t\tthis._mixPass.uniforms.uBackColor = this._backBlendRenderTarget._attachments[ATTACHMENT.COLOR_ATTACHMENT0];\n\n\t\tconst renderInfos = { index: 0, frontColorTexture: null, depthPeelingTexture: null };\n\t\tthis._renderInfos = renderInfos;\n\n\t\tthis._renderOptions = {\n\t\t\tgetMaterial: function(renderable) {\n\t\t\t\tconst material = renderable.material;\n\t\t\t\tmaterial.uniforms.frist = renderInfos.index + 1;\n\t\t\t\tmaterial.uniforms.uFrontColor = renderInfos.frontColorTexture;\n\t\t\t\tmaterial.uniforms.uDepth = renderInfos.depthPeelingTexture;\n\t\t\t\treturn material;\n\t\t\t}\n\t\t};\n\n\t\tthis.loop = 4;\n\t}\n\n\tsetOutputEncoding(encoidng) {\n\t\tthis._renderTarget1.texture.encoding = encoidng;\n\t\tthis._renderTarget2.texture.encoding = encoidng;\n\t}\n\n\tresize(width, height) {\n\t\tthis._renderTarget1.resize(width, height);\n\t\tthis._renderTarget2.resize(width, height);\n\t\tthis._depthClearRenderTarget1.resize(width, height);\n\t\tthis._depthClearRenderTarget2.resize(width, height);\n\t\tthis._backBlendRenderTarget.resize(width, height);\n\t}\n\n\tdispose() {\n\t\tthis._renderTarget1.dispose();\n\t\tthis._renderTarget2.dispose();\n\t\tthis._depthClearRenderTarget1.dispose();\n\t\tthis._depthClearRenderTarget2.dispose();\n\t\tthis._backBlendRenderTarget.dispose();\n\n\t\tthis._backBlendPass.dispose();\n\t\tthis._mixPass.dispose();\n\t}\n\n\trenderBuffer(renderer, scene, camera) {\n\t\tthis._renderTarget1\n\t\t\t.setColorClearValue(0, 0, 0, 0)\n\t\t\t.setClear(true, false, false);\n\t\trenderer.beginRender(this._renderTarget1);\n\t\trenderer.endRender();\n\n\t\tthis._renderTarget2\n\t\t\t.setColorClearValue(0, 0, 0, 0)\n\t\t\t.setClear(true, false, false);\n\t\trenderer.beginRender(this._renderTarget2);\n\t\trenderer.endRender();\n\n\t\tthis._depthClearRenderTarget1\n\t\t\t.setColorClearValue(-99999, -99999, 0, 0)\n\t\t\t.setClear(true, false, false);\n\t\trenderer.beginRender(this._depthClearRenderTarget1);\n\t\trenderer.endRender();\n\n\t\tthis._depthClearRenderTarget2\n\t\t\t.setColorClearValue(-99999, -99999, 0, 0)\n\t\t\t.setClear(true, false, false);\n\t\trenderer.beginRender(this._depthClearRenderTarget2);\n\t\trenderer.endRender();\n\n\t\tfor (let i = 0; i < this.loop; i++) {\n\t\t\tconst writeRenderTarget = i % 2 === 0 ? this._renderTarget1 : this._renderTarget2;\n\t\t\tconst depthClearRenderTarget = i % 2 === 0 ? this._depthClearRenderTarget1 : this._depthClearRenderTarget2;\n\t\t\tconst readRenderTarget = i % 2 === 0 ? this._renderTarget2 : this._renderTarget1;\n\n\t\t\t// clear write render target\n\n\t\t\twriteRenderTarget.setClear(true, false, false);\n\t\t\trenderer.beginRender(writeRenderTarget);\n\t\t\trenderer.endRender();\n\n\t\t\trenderer.beginRender(depthClearRenderTarget);\n\t\t\trenderer.endRender();\n\n\t\t\t// render write render target\n\n\t\t\tconst renderStates = scene.getRenderStates(camera);\n\t\t\tconst renderQueue = scene.getRenderQueue(camera);\n\n\t\t\tconst renderOptions = this._renderOptions;\n\n\t\t\tthis._renderInfos.index = i;\n\t\t\tthis._renderInfos.frontColorTexture = readRenderTarget._attachments[ATTACHMENT.COLOR_ATTACHMENT1];\n\t\t\tthis._renderInfos.depthPeelingTexture = readRenderTarget._attachments[ATTACHMENT.COLOR_ATTACHMENT0];\n\n\t\t\twriteRenderTarget.setClear(false, false, false);\n\t\t\trenderer.beginRender(writeRenderTarget);\n\t\t\tlet renderQueueLayer;\n\t\t\tfor (let j = 0, l = renderQueue.layerList.length; j < l; j++) {\n\t\t\t\trenderQueueLayer = renderQueue.layerList[j];\n\t\t\t\trenderer.renderRenderableList(renderQueueLayer.transparent, renderStates, renderOptions);\n\t\t\t}\n\t\t\trenderer.endRender();\n\n\t\t\t// accumulate back color\n\n\t\t\tthis._backBlendPass.uniforms.uBackColor = writeRenderTarget._attachments[ATTACHMENT.COLOR_ATTACHMENT2];\n\t\t\tthis._backBlendRenderTarget.setClear(i === 0, false, false);\n\t\t\tthis._backBlendPass.render(renderer, this._backBlendRenderTarget);\n\t\t}\n\t}\n\n\trender(renderer, renderTarget) {\n\t\tthis._mixPass.render(renderer, renderTarget);\n\t}\n\n}\n\nfunction createFloatColorTexture(type = PIXEL_TYPE.FLOAT) {\n\tconst texture = new Texture2D();\n\ttexture.type = type;\n\ttexture.minFilter = TEXTURE_FILTER.NEAREST;\n\ttexture.magFilter = TEXTURE_FILTER.NEAREST;\n\ttexture.generateMipmaps = false;\n\treturn texture;\n}\n\n/** Shaders */\n\nconst DepthPeelingBackBlendShader = {\n\tname: 'dp_oit_back_blend',\n\n\tuniforms: {\n\t\tuBackColor: null\n\t},\n\n\tvertexShader: `\n       attribute vec3 a_Position;\n       attribute vec2 a_Uv;\n\n       uniform mat4 u_ProjectionView;\n       uniform mat4 u_Model;\n\n       varying vec2 v_Uv;\n\n       void main() {\n           v_Uv = a_Uv;\n           gl_Position = u_ProjectionView * u_Model * vec4(a_Position, 1.0);\n       }\n   `,\n\n\tfragmentShader: `\n\t\tuniform sampler2D uBackColor;\n\n\t\tvarying vec2 v_Uv;\n\n\t\tvoid main() {\n\t\t\tgl_FragColor = texture2D(uBackColor, v_Uv);\n\t\t\tif (gl_FragColor.a == 0.0) {\n\t\t\t\tdiscard;\n\t\t\t}\n\t\t}\n   `\n};\n\nconst DepthPeelingMixShader = {\n\tname: 'dp_oit_mix',\n\n\tuniforms: {\n\t\tuFrontColor: null,\n\t\tuBackColor: null\n\t},\n\n\tvertexShader: `\n\t   attribute vec3 a_Position;\n\t   attribute vec2 a_Uv;\n\n\t   uniform mat4 u_ProjectionView;\n\t   uniform mat4 u_Model;\n\n\t   varying vec2 v_Uv;\n\n\t   void main() {\n\t\t   v_Uv = a_Uv;\n\t\t   gl_Position = u_ProjectionView * u_Model * vec4(a_Position, 1.0);\n\t   }\n   `,\n\n\tfragmentShader: `\n\t\tuniform sampler2D uFrontColor;\n\t\tuniform sampler2D uBackColor;\n\n\t\tvarying vec2 v_Uv;\n\n\t\tvoid main() {\n\t\t\tvec4 frontColor = texture2D(uFrontColor, v_Uv);\n\t\t\tvec4 backColor = texture2D(uBackColor, v_Uv);\n\t\t\tfloat alphaMultiplier = 1.0 - frontColor.a;\n\t\t\tgl_FragColor = vec4(frontColor.rgb + alphaMultiplier * backColor.rgb, frontColor.a + backColor.a);\n\t\t}\n   `\n};\n\n/** DepthPeelingOITMaterial */\n\nclass DepthPeelingOITMaterial extends PBRMaterial {\n\n\tconstructor(sourceMaterial) {\n\t\tsuper();\n\n\t\tthis.type = MATERIAL_TYPE.SHADER;\n\n\t\tif (sourceMaterial) {\n\t\t\tthis.copy(sourceMaterial);\n\t\t}\n\n\t\tthis.depthTest = false;\n\t\tthis.depthWrite = false;\n\n\t\tthis.transparent = true;\n\n\t\tthis.blending = BLEND_TYPE.CUSTOM;\n\t\tthis.blendEquationAlpha = BLEND_EQUATION.MAX;\n\t\tthis.blendEquation = BLEND_EQUATION.MAX;\n\t\tthis.blendSrc = BLEND_FACTOR.ONE;\n\t\tthis.blendDst = BLEND_FACTOR.ONE_MINUS_SRC_ALPHA;\n\t\tthis.blendSrcAlpha = BLEND_FACTOR.ONE;\n\t\tthis.blendDstAlpha = BLEND_FACTOR.ONE_MINUS_SRC_ALPHA;\n\n\t\tthis.shaderName = 'dp_oit_mat';\n\n\t\tthis.vertexShader = ShaderLib.pbr_vert;\n\t\tthis.fragmentShader = fragmentShader;\n\n\t\tthis.uniforms = {\n\t\t\tuFrontColor: null,\n\t\t\tuDepth: null,\n\t\t\tfrist: 1\n\t\t};\n\t}\n\n}\n\nlet fragmentShader = ShaderLib.pbr_frag;\n\nfragmentShader = fragmentShader.replace(\n\t'#include <clippingPlanes_pars_frag>',\n\t`\n    #include <clippingPlanes_pars_frag>\n\n    uniform sampler2D uDepth;\n    uniform sampler2D uFrontColor;\n    uniform float frist;\n\n    #define MAX_DEPTH 99999.0\n\t`\n);\n\nfragmentShader = fragmentShader.replace(\n\t'#include <clippingPlanes_frag>',\n\t`\n    ivec2 fragCoord = ivec2(gl_FragCoord.xy);\n    vec2 lastDepth;\n    if (frist == 1.0) {\n        lastDepth = vec2(0., 1.0);\n    }else{\n        lastDepth = texelFetch(uDepth, fragCoord, 0).rg;\n    }\n\n    vec4 lastFrontColor = texelFetch(uFrontColor, fragCoord, 0);\n    // depth value always increases\n    // so we can use MAX blend equation\n    gl_FragData[0].rg = vec2(-MAX_DEPTH);\n\n    // front color always increases\n    // so we can use MAX blend equation\n    gl_FragData[1] = lastFrontColor;\n    // back color is separately blend afterwards each pass\n    gl_FragData[2] = vec4(0.0);\n    float nearestDepth = -lastDepth.x;\n    float furthestDepth = lastDepth.y;\n\n    float alphaMultiplier = 1.0 - lastFrontColor.a;\n\n    if (gl_FragCoord.z < nearestDepth || gl_FragCoord.z > furthestDepth) {\n        // Skip this depth since it's been peeled.\n        return;\n    }\n\n    if (gl_FragCoord.z > nearestDepth && gl_FragCoord.z < furthestDepth) {\n        // This needs to be peeled.\n        // The ones remaining after MAX blended for\n        // all need-to-peel will be peeled next pass.\n        pc_fragData0 = vec4(-gl_FragCoord.z, gl_FragCoord.z, 0.0, 1.0);\n        return;\n    }\n\n    #include <clippingPlanes_frag>\n    `\n);\n\nfragmentShader = fragmentShader.replace(\n\t'#include <end_frag>',\n\t`\n    vec4 gl_FragColor = outColor;\n    `\n);\n\nfragmentShader = fragmentShader.replace(\n\t'#include <dithering_frag>',\n\t`\n    #include <dithering_frag>\n\n    // dual depth peeling\n    // write to back and front color buffer\n    if (gl_FragCoord.z == nearestDepth) {\n        pc_fragData1.rgb += gl_FragColor.rgb * gl_FragColor.a * alphaMultiplier;\n        pc_fragData1.a = 1.0 - alphaMultiplier * (1.0 - gl_FragColor.a);\n    } else {\n        pc_fragData2 += gl_FragColor;\n    }\n    `\n);\n\nexport { DepthPeelingOITPass, DepthPeelingOITMaterial };"
  },
  {
    "path": "examples/jsm/pass/SSAOPass.js",
    "content": "import {\n\tShaderPostPass,\n\tTexture2D,\n\tVector3,\n\tPIXEL_TYPE,\n\tTEXTURE_FILTER,\n\tTEXTURE_WRAP\n} from 't3d';\nimport { SSAOShader } from '../shaders/SSAOShader.js';\n\nclass SSAOPass extends ShaderPostPass {\n\n\tconstructor() {\n\t\tsuper(SSAOShader);\n\n\t\tthis._kernels = {};\n\n\t\tthis.setNoiseSize(4);\n\t\tthis.setKernelSize(12); // 12\n\t}\n\n\tsetKernelSize(size, offset) {\n\t\toffset = (offset !== undefined) ? offset : 0;\n\n\t\tconst code = size + '_' + offset;\n\t\tif (!this._kernels[code]) {\n\t\t\tthis._kernels[code] = generateKernel(size, offset * size);\n\t\t}\n\n\t\tthis.material.defines['KERNEL_SIZE'] = size;\n\t\tthis.material.uniforms['kernel'] = this._kernels[code];\n\t}\n\n\tsetNoiseSize(size) {\n\t\tlet texture = this.material.uniforms['noiseTex'];\n\t\tif (!texture) {\n\t\t\ttexture = generateNoiseTexture(size);\n\t\t\tthis.material.uniforms['noiseTex'] = texture;\n\t\t} else {\n\t\t\ttexture.image.data = generateNoiseData(size);\n\t\t\ttexture.image.width = size;\n\t\t\ttexture.image.height = size;\n\t\t\ttexture.version++;\n\t\t}\n\n\t\tthis.material.uniforms['noiseTexSize'] = [size, size];\n\t}\n\n}\n\nfunction generateNoiseData(size) {\n\tconst data = new Uint8Array(size * size * 4);\n\tlet n = 0;\n\tconst v3 = new Vector3();\n\tfor (let i = 0; i < size; i++) {\n\t\tfor (let j = 0; j < size; j++) {\n\t\t\tv3.set(Math.random() * 2 - 1, Math.random() * 2 - 1, 0).normalize();\n\t\t\tdata[n++] = (v3.x * 0.5 + 0.5) * 255;\n\t\t\tdata[n++] = (v3.y * 0.5 + 0.5) * 255;\n\t\t\tdata[n++] = 0;\n\t\t\tdata[n++] = 255;\n\t\t}\n\t}\n\treturn data;\n}\n\nfunction generateNoiseTexture(size) {\n\tconst texture = new Texture2D();\n\n\ttexture.image = { data: generateNoiseData(size), width: size, height: size };\n\n\ttexture.type = PIXEL_TYPE.UNSIGNED_BYTE;\n\n\ttexture.magFilter = TEXTURE_FILTER.NEAREST;\n\ttexture.minFilter = TEXTURE_FILTER.NEAREST;\n\n\ttexture.wrapS = TEXTURE_WRAP.REPEAT;\n\ttexture.wrapT = TEXTURE_WRAP.REPEAT;\n\n\ttexture.generateMipmaps = false;\n\ttexture.flipY = false;\n\n\ttexture.version++;\n\n\treturn texture;\n}\n\n// https://en.wikipedia.org/wiki/Halton_sequence halton sequence.\nfunction halton(index, base) {\n\tlet result = 0;\n\tlet f = 1 / base;\n\tlet i = index;\n\twhile (i > 0) {\n\t\tresult = result + f * (i % base);\n\t\ti = Math.floor(i / base);\n\t\tf = f / base;\n\t}\n\treturn result;\n}\n\nfunction generateKernel(size, offset) {\n\tconst kernel = new Float32Array(size * 3);\n\toffset = offset || 0;\n\tfor (let i = 0; i < size; i++) {\n\t\tconst phi = halton(i + offset, 2) * Math.PI;\n\t\tconst theta = halton(i + offset, 3) * Math.PI;\n\t\tconst r = Math.random();\n\t\tconst x = Math.cos(phi) * Math.sin(theta) * r;\n\t\tconst y = Math.cos(theta) * r;\n\t\tconst z = Math.sin(phi) * Math.sin(theta) * r;\n\n\t\tkernel[i * 3] = x;\n\t\tkernel[i * 3 + 1] = y;\n\t\tkernel[i * 3 + 2] = z;\n\t}\n\treturn kernel;\n}\n\nexport { SSAOPass };"
  },
  {
    "path": "examples/jsm/pass/UnrealBloomPass.js",
    "content": "import { BLEND_TYPE, ShaderPostPass, OffscreenRenderTarget, TEXTURE_FILTER, PIXEL_TYPE, PIXEL_FORMAT, ATTACHMENT } from 't3d';\nimport { CopyShader } from '../shaders/CopyShader.js';\nimport { LuminosityHighPassShader } from '../shaders/LuminosityHighPassShader.js';\n\n/**\n * UnrealBloomPass is inspired by the bloom pass of Unreal Engine. It creates a\n * mip map chain of bloom textures and blurs them with different radii. Because\n * of the weighted combination of mips, and because larger blurs are done on\n * higher mips, this effect provides good quality and performance.\n *\n * Reference:\n * - https://docs.unrealengine.com/latest/INT/Engine/Rendering/PostProcessEffects/Bloom/\n */\nclass UnrealBloomPass {\n\n\tconstructor(width, height) {\n\t\tthis.tDiffuse = null;\n\t\tthis.threshold = 0;\n\t\tthis.strength = 1;\n\t\tthis.radius = 0;\n\t\tthis.toneMappingExposure = 1.;\n\n\t\tthis.highlightPass = new ShaderPostPass(LuminosityHighPassShader);\n\n\t\tthis.tempRenderTarget = createTempRenderTarget(width, height);\n\n\t\t//\n\n\t\tthis.separableBlurPasses = [];\n\t\tfor (let i = 0; i < 5; i++) {\n\t\t\tconst kernelRadius = kernelSizeArray[i];\n\n\t\t\tconst seperableBlurPass = new ShaderPostPass(seperableBlurShader);\n\t\t\tseperableBlurPass.material.defines.KERNEL_RADIUS = kernelRadius;\n\n\t\t\tfor (let i = 0; i < kernelRadius; i++) {\n\t\t\t\tseperableBlurPass.uniforms.gaussianCoefficients.push(\n\t\t\t\t\t0.39894 * Math.exp(-0.5 * i * i / (kernelRadius * kernelRadius)) / kernelRadius\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tthis.separableBlurPasses.push(seperableBlurPass);\n\t\t}\n\n\t\tthis.renderTargetsHorizontal = [];\n\t\tthis.renderTargetsVertical = [];\n\t\tlet resx = Math.round(width / 2);\n\t\tlet resy = Math.round(height / 2);\n\t\tfor (let i = 0; i < 5; i++) {\n\t\t\tconst renderTargetHorizonal = createTempRenderTarget(resx, resy);\n\t\t\tthis.renderTargetsHorizontal.push(renderTargetHorizonal);\n\n\t\t\tconst renderTargetVertical = createTempRenderTarget(resx, resy);\n\t\t\tthis.renderTargetsVertical.push(renderTargetVertical);\n\n\t\t\tthis.separableBlurPasses[i].uniforms.invSize[0] = 1 / resx;\n\t\t\tthis.separableBlurPasses[i].uniforms.invSize[1] = 1 / resy;\n\n\t\t\tresx = Math.round(resx / 2);\n\t\t\tresy = Math.round(resy / 2);\n\t\t}\n\n\t\tthis.compositePass = new ShaderPostPass(compositeShader);\n\t\tthis.compositePass.uniforms.blurTexture1 = this.renderTargetsVertical[0].texture;\n\t\tthis.compositePass.uniforms.blurTexture2 = this.renderTargetsVertical[1].texture;\n\t\tthis.compositePass.uniforms.blurTexture3 = this.renderTargetsVertical[2].texture;\n\t\tthis.compositePass.uniforms.blurTexture4 = this.renderTargetsVertical[3].texture;\n\t\tthis.compositePass.uniforms.blurTexture5 = this.renderTargetsVertical[4].texture;\n\n\t\tthis.copyPass = new ShaderPostPass(CopyShader);\n\t\tthis.copyPass.material.blending = BLEND_TYPE.ADD;\n\t\tthis.copyPass.material.transparent = true;\n\t\tthis.copyPass.material.premultipliedAlpha = true;\n\t\tthis.copyPass.material.depthTest = false;\n\t\tthis.copyPass.material.depthWrite = false;\n\n\t\tthis.toneMappingPass = new ShaderPostPass(toneMappingShader);\n\t}\n\n\tupdate(renderer, sceneRenderTarget, outputRenderTarget) {\n\t\t// Step 1: highlight\n\n\t\tthis.highlightPass.uniforms.luminosityThreshold = this.threshold;\n\t\tthis.highlightPass.uniforms.tDiffuse = sceneRenderTarget.texture;\n\t\tthis.highlightPass.render(renderer, this.tempRenderTarget);\n\n\t\t// Step 2: blur\n\n\t\tlet inputRenderTarget = this.tempRenderTarget;\n\n\t\tfor (let i = 0; i < 5; i++) {\n\t\t\tthis.separableBlurPasses[i].uniforms.colorTexture = inputRenderTarget.texture;\n\t\t\tthis.separableBlurPasses[i].uniforms.direction[0] = 1;\n\t\t\tthis.separableBlurPasses[i].uniforms.direction[1] = 0;\n\t\t\tthis.separableBlurPasses[i].render(renderer, this.renderTargetsHorizontal[i]);\n\n\t\t\tthis.separableBlurPasses[i].uniforms.colorTexture = this.renderTargetsHorizontal[i].texture;\n\t\t\tthis.separableBlurPasses[i].uniforms.direction[0] = 0;\n\t\t\tthis.separableBlurPasses[i].uniforms.direction[1] = 1;\n\t\t\tthis.separableBlurPasses[i].render(renderer, this.renderTargetsVertical[i]);\n\n\t\t\tinputRenderTarget = this.renderTargetsVertical[i];\n\t\t}\n\n\t\t// Step 3: composite all the mips\n\n\t\tthis.compositePass.uniforms.bloomRadius = this.radius;\n\t\tthis.compositePass.uniforms.strength = this.strength;\n\t\tthis.compositePass.render(renderer, this.renderTargetsHorizontal[0]);\n\n\t\t// Step 4: blend it additively\n\n\t\tconst oldInputClearColor = sceneRenderTarget.clearColor;\n\t\tconst oldInputClearDepth = sceneRenderTarget.clearDepth;\n\t\tconst oldInputClearStencil = sceneRenderTarget.clearStencil;\n\n\t\tthis.copyPass.uniforms.tDiffuse = this.renderTargetsHorizontal[0].texture;\n\t\tsceneRenderTarget.setClear(false, false, false); // avoid clear\n\t\tthis.copyPass.render(renderer, sceneRenderTarget);\n\n\t\tsceneRenderTarget.setClear(oldInputClearColor, oldInputClearDepth, oldInputClearStencil);\n\n\t\t// Step 5: color mapping  over the output render target\n\n\t\tthis.toneMappingPass.uniforms.tDiffuse = sceneRenderTarget.texture;\n\t\tthis.toneMappingPass.uniforms.toneMappingExposure = this.toneMappingExposure;\n\t\tthis.toneMappingPass.render(renderer, outputRenderTarget);\n\t}\n\n\tdispose() {\n\t\tthis.tempRenderTarget.dispose();\n\n\t\tfor (let i = 0; i < this.renderTargetsHorizontal.length; i++) {\n\t\t\tthis.renderTargetsHorizontal[i].dispose();\n\t\t}\n\n\t\tfor (let i = 0; i < this.renderTargetsVertical.length; i++) {\n\t\t\tthis.renderTargetsVertical[i].dispose();\n\t\t}\n\n\t\tfor (let i = 0; i < this.separableBlurPasses.length; i++) {\n\t\t\tthis.separableBlurPasses[i].dispose();\n\t\t}\n\n\t\tthis.highlightPass.dispose();\n\t\tthis.compositePass.dispose();\n\t\tthis.copyPass.dispose();\n\t}\n\n\tresize(width, height) {\n\t\tthis.tempRenderTarget.resize(width, height);\n\n\t\tlet resx = Math.round(width / 2);\n\t\tlet resy = Math.round(height / 2);\n\t\tfor (let i = 0; i < 5; i++) {\n\t\t\tthis.renderTargetsHorizontal[i].resize(resx, resy);\n\t\t\tthis.renderTargetsVertical[i].resize(resx, resy);\n\t\t\tthis.separableBlurPasses[i].uniforms.invSize = [1 / resx, 1 / resy];\n\t\t\tresx = Math.round(resx / 2);\n\t\t\tresy = Math.round(resy / 2);\n\t\t}\n\t}\n\n}\n\nUnrealBloomPass.supportWebGL1 = false;\n\nconst kernelSizeArray = [3, 5, 7, 9, 11];\n\nfunction createTempRenderTarget(width, height) {\n\tconst renderTarget = OffscreenRenderTarget.create2D(width, height);\n\trenderTarget.texture.type = PIXEL_TYPE.HALF_FLOAT;\n\n\tif (!UnrealBloomPass.supportWebGL1) {\n\t\trenderTarget.texture.format = PIXEL_FORMAT.RGB;\n\t\trenderTarget.texture.internalformat = PIXEL_FORMAT.R11F_G11F_B10F;\n\t}\n\n\trenderTarget.texture.minFilter = TEXTURE_FILTER.LINEAR;\n\trenderTarget.texture.generateMipmaps = false;\n\trenderTarget.detach(ATTACHMENT.DEPTH_STENCIL_ATTACHMENT);\n\n\trenderTarget.setClear(true, false, false);\n\n\treturn renderTarget;\n}\n\nconst seperableBlurShader = {\n\tname: 'seperableBlur',\n\n\tdefines: {\n\t\tKERNEL_RADIUS: 5\n\t},\n\n\tuniforms: {\n\t\tcolorTexture: null,\n\t\tinvSize: [1 / 512, 1 / 512], // inverse texture size\n\t\tdirection: [0.5, 0.5],\n\t\tgaussianCoefficients: [] // precomputed Gaussian Coefficients\n\t},\n\n\tvertexShader: `\n\t\tattribute vec3 a_Position;\n\t\tattribute vec2 a_Uv;\n\n\t\tuniform mat4 u_ProjectionView;\n\t\tuniform mat4 u_Model;\n\t\tvarying vec2 v_Uv;\n\n\t\tvoid main() {\n\t\t\tv_Uv = a_Uv;\n\t\t\tgl_Position = u_ProjectionView * u_Model * vec4(a_Position, 1.0);\n\t\t}\n\t`,\n\n\tfragmentShader: `\n\t\tuniform sampler2D colorTexture;\n\t\tuniform vec2 invSize;\n\t\tuniform vec2 direction;\n\t\tuniform float gaussianCoefficients[KERNEL_RADIUS];\n\t\tvarying vec2 v_Uv;\n\t\tvoid main() {\n\t\t\tfloat weightSum = gaussianCoefficients[0];\n\t\t\tvec3 diffuseSum = texture2D(colorTexture, v_Uv).rgb * weightSum;\n\t\t\tfor(int i = 1; i < KERNEL_RADIUS; i ++) {\n\t\t\t\tfloat x = float(i);\n\t\t\t\tfloat w = gaussianCoefficients[i];\n\t\t\t\tvec2 uvOffset = direction * invSize * x;\n\t\t\t\tvec3 sample1 = texture2D(colorTexture, v_Uv + uvOffset).rgb;\n\t\t\t\tvec3 sample2 = texture2D(colorTexture, v_Uv - uvOffset).rgb;\n\t\t\t\tdiffuseSum += (sample1 + sample2) * w;\n\t\t\t\tweightSum += 2.0 * w;\n\t\t\t}\n\t\t\tgl_FragColor = vec4(diffuseSum / weightSum, 0.0);\n\t\t}\n\t`\n};\n\nconst compositeShader = {\n\tname: 'composite',\n\n\tdefines: {},\n\n\tuniforms: {\n\t\tblurTexture1: null,\n\t\tblurTexture2: null,\n\t\tblurTexture3: null,\n\t\tblurTexture4: null,\n\t\tblurTexture5: null,\n\t\tbloomFactors: [1., 0.8, 0.6, 0.4, 0.2],\n\t\tbloomRadius: 0.0,\n\t\tstrength: 1\n\t},\n\n\tvertexShader: `\n\t\tattribute vec3 a_Position;\n\t\tattribute vec2 a_Uv;\n\n\t\tuniform mat4 u_ProjectionView;\n\t\tuniform mat4 u_Model;\n\n\t\tvarying vec2 v_Uv;\n\n\t\tvoid main() {\n\t\t\tv_Uv = a_Uv;\n\t\t\tgl_Position = u_ProjectionView * u_Model * vec4(a_Position, 1.0);\n\t\t}\n\t`,\n\n\tfragmentShader: `\n\t\tuniform sampler2D blurTexture1;\n\t\tuniform sampler2D blurTexture2;\n\t\tuniform sampler2D blurTexture3;\n\t\tuniform sampler2D blurTexture4;\n\t\tuniform sampler2D blurTexture5;\n\t\tuniform float strength;\n\t\tuniform float bloomRadius;\n\t\tuniform float bloomFactors[5];\n\n\t\tvarying vec2 v_Uv;\n\n\t\tfloat lerpBloomFactor(const in float factor) {\n\t\t\tfloat mirrorFactor = 1.2 - factor;\n\t\t\treturn mix(factor, mirrorFactor, bloomRadius);\n\t\t}\n\n\t\tvoid main() {\n\t\t\tfloat factor0 = lerpBloomFactor(bloomFactors[0]);\n\t\t\tfloat factor1 = lerpBloomFactor(bloomFactors[1]);\n\t\t\tfloat factor2 = lerpBloomFactor(bloomFactors[2]);\n\t\t\tfloat factor3 = lerpBloomFactor(bloomFactors[3]);\n\t\t\tfloat factor4 = lerpBloomFactor(bloomFactors[4]);\n\t\t\tgl_FragColor = strength * (factor0 * texture2D(blurTexture1, v_Uv) +\n\t\t\t\tfactor1 * texture2D(blurTexture2, v_Uv) +\n\t\t\t\tfactor2 * texture2D(blurTexture3, v_Uv) +\n\t\t\t\tfactor3 * texture2D(blurTexture4, v_Uv) +\n\t\t\t\tfactor4 * texture2D(blurTexture5, v_Uv));\n\t\t}\n\t`\n};\n\nconst toneMappingShader = {\n\tname: 'toneMapping',\n\n\tdefines: {},\n\n\tuniforms: {\n\t\ttDiffuse: null,\n\t\topacity: 1.0,\n\t\ttoneMappingExposure: 1.\n\t},\n\n\tvertexShader: `\n\t\tattribute vec3 a_Position;\n\t\tattribute vec2 a_Uv;\n\n\t\tuniform mat4 u_ProjectionView;\n\t\tuniform mat4 u_Model;\n\n\t\tvarying vec2 v_Uv;\n\n\t\tvoid main() {\n\t\t\tv_Uv = a_Uv;\n\t\t\tgl_Position = u_ProjectionView * u_Model * vec4(a_Position, 1.0);\n\t\t}\n\t`,\n\n\tfragmentShader: `\n\t\tuniform sampler2D tDiffuse;\n\t\tuniform float opacity;\n\t\tuniform float toneMappingExposure;\n\n\t\tvarying vec2 v_Uv;\n\n\t\tvec3 RRTAndODTFit(vec3 v) {\n\t\t\tvec3 a = v * (v + 0.0245786) - 0.000090537;\n\t\t\tvec3 b = v * (0.983729 * v + 0.4329510) + 0.238081;\n\t\t\treturn a / b;\n\t\t}\n\n\t\tvec3 ReinhardToneMapping(vec3 color) {\n\t\t\tcolor *= toneMappingExposure;\n\t\t\treturn saturate(color / (vec3(1.0) + color));\n\t\t}\n\n\t\tvoid main() {\n\t\t\tgl_FragColor = texture2D(tDiffuse, v_Uv) * opacity;\n\t\t\tgl_FragColor.rgb = ReinhardToneMapping(gl_FragColor.rgb);\n\t\t\tgl_FragColor = LinearTosRGB(gl_FragColor);\n\t\t}\n\t`\n};\n\nexport { UnrealBloomPass };"
  },
  {
    "path": "examples/jsm/pass/WeightedBlendedOITPass.js",
    "content": "import { ShaderPostPass, OffscreenRenderTarget, Texture2D, ATTACHMENT, TEXTURE_FILTER, PIXEL_TYPE, BLEND_FACTOR, BLEND_TYPE, ShaderLib, PBRMaterial, MATERIAL_TYPE } from 't3d';\n\n// TODO: Share depth attachment with opaque render target\nclass WeightedBlendedOITPass {\n\n\tconstructor(width, height) {\n\t\tthis._renderTarget = OffscreenRenderTarget.create2D(width, height);\n\t\tthis._renderTarget.texture.type = PIXEL_TYPE.FLOAT;\n\t\tthis._renderTarget.texture.minFilter = TEXTURE_FILTER.NEAREST;\n\t\tthis._renderTarget.texture.magFilter = TEXTURE_FILTER.NEAREST;\n\t\tthis._renderTarget.texture.generateMipmaps = false;\n\n\t\tconst accumulateAlphaTexture = new Texture2D();\n\t\taccumulateAlphaTexture.type = PIXEL_TYPE.FLOAT;\n\t\taccumulateAlphaTexture.minFilter = TEXTURE_FILTER.NEAREST;\n\t\taccumulateAlphaTexture.magFilter = TEXTURE_FILTER.NEAREST;\n\t\taccumulateAlphaTexture.generateMipmaps = false;\n\n\t\tthis._renderTarget.attach(accumulateAlphaTexture, ATTACHMENT.COLOR_ATTACHMENT1);\n\n\t\tthis._renderTarget\n\t\t\t.setColorClearValue(0, 0, 0, 1)\n\t\t\t.setClear(true, false, false);\n\n\t\tthis._mixPass = new ShaderPostPass(WeightedBlendedMixShader);\n\t\tthis._mixPass.material.transparent = true;\n\t\tthis._mixPass.material.blending = BLEND_TYPE.CUSTOM;\n\t\tthis._mixPass.material.blendEquationAlpha = BLEND_FACTOR.ADD;\n\t\tthis._mixPass.material.blendSrc = BLEND_FACTOR.ONE;\n\t\tthis._mixPass.material.blendDst = BLEND_FACTOR.ONE;\n\t\tthis._mixPass.material.blendSrcAlpha = BLEND_FACTOR.ZERO;\n\t\tthis._mixPass.material.blendDstAlpha = BLEND_FACTOR.ONE_MINUS_SRC_ALPHA;\n\t\tthis._mixPass.uniforms['uAccumulate'] = this._renderTarget.texture;\n\t\tthis._mixPass.uniforms['uAccumulateAlpha'] = accumulateAlphaTexture;\n\n\t\tconst cameraInfos = { far: 1000, near: 0.1 };\n\t\tthis._cameraInfos = cameraInfos;\n\n\t\tthis._renderOptions = {\n\t\t\tgetMaterial: function(renderable) {\n\t\t\t\tconst material = renderable.material;\n\t\t\t\tmaterial.uniforms.cameraFar = cameraInfos.far;\n\t\t\t\tmaterial.uniforms.cameraNear = cameraInfos.near;\n\t\t\t\treturn material;\n\t\t\t}\n\t\t};\n\t}\n\n\tsetOutputEncoding(encoidng) {\n\t\tthis._renderTarget.texture.encoding = encoidng;\n\t}\n\n\tresize(width, height) {\n\t\tthis._renderTarget.resize(width, height);\n\t}\n\n\tdispose() {\n\t\tthis._renderTarget.dispose();\n\t\tthis._mixPass.dispose();\n\t}\n\n\trenderBuffer(renderer, scene, camera) {\n\t\tconst renderStates = scene.getRenderStates(camera);\n\t\tconst renderQueue = scene.getRenderQueue(camera);\n\n\t\tthis._cameraInfos.far = renderStates.camera.far;\n\t\tthis._cameraInfos.near = renderStates.camera.near;\n\n\t\tconst renderOptions = this._renderOptions;\n\n\t\trenderer.beginRender(this._renderTarget);\n\n\t\tlet renderQueueLayer;\n\t\tfor (let i = 0, l = renderQueue.layerList.length; i < l; i++) {\n\t\t\trenderQueueLayer = renderQueue.layerList[i];\n\t\t\trenderer.renderRenderableList(renderQueueLayer.transparent, renderStates, renderOptions);\n\t\t}\n\n\t\trenderer.endRender();\n\t}\n\n\trender(renderer, renderTarget) {\n\t\tthis._mixPass.render(renderer, renderTarget);\n\t}\n\n}\n\nconst WeightedBlendedMixShader = {\n\tname: 'wb_oit_mix',\n\n\tuniforms: {\n\t\t'uAccumulate': null,\n\t\t'uAccumulateAlpha': null\n\t},\n\n\tvertexShader: `\n\t\tattribute vec3 a_Position;\n\t\tattribute vec2 a_Uv;\n\n\t\tuniform mat4 u_ProjectionView;\n\t\tuniform mat4 u_Model;\n\n\t\tvarying vec2 v_Uv;\n\n\t\tvoid main() {\n\t\t\tv_Uv = a_Uv;\n\t\t\tgl_Position = u_ProjectionView * u_Model * vec4(a_Position, 1.0);\n\t\t}\n   `,\n\n\tfragmentShader: `\n\t\tuniform sampler2D uAccumulate;\n\t\tuniform sampler2D uAccumulateAlpha;\n\n\t\tvarying vec2 v_Uv;\n\n\t\tvoid main() {\n\t\t\tvec4 accum = texture2D(uAccumulate, v_Uv);\n\n\t\t\tfloat r = texture2D(uAccumulateAlpha, v_Uv).r;\n\n\t\t\tvec4 transparent = vec4(accum.rgb / clamp(r, 1e-4, 5e4), accum.a);\n\n\t\t\tgl_FragColor = (1.0 - transparent.a) * transparent;\n\t\t}\n   `\n};\n\nclass WeightedBlendedOITMaterial extends PBRMaterial {\n\n\tconstructor(sourceMaterial) {\n\t\tsuper();\n\n\t\tthis.type = MATERIAL_TYPE.SHADER;\n\n\t\tif (sourceMaterial) {\n\t\t\tthis.copy(sourceMaterial);\n\t\t}\n\n\t\tthis.depthTest = false;\n\t\tthis.depthWrite = true;\n\n\t\tthis.transparent = true;\n\n\t\tthis.blending = BLEND_TYPE.CUSTOM;\n\t\tthis.blendEquationAlpha = BLEND_FACTOR.ADD;\n\t\tthis.blendSrc = BLEND_FACTOR.ONE;\n\t\tthis.blendDst = BLEND_FACTOR.ONE;\n\t\tthis.blendSrcAlpha = BLEND_FACTOR.ZERO;\n\t\tthis.blendDstAlpha = BLEND_FACTOR.ONE_MINUS_SRC_ALPHA;\n\n\t\tthis.shaderName = 'wb_oit_mat';\n\n\t\tthis.vertexShader = ShaderLib.pbr_vert;\n\t\tthis.fragmentShader = fragmentShader;\n\n\t\tthis.uniforms = {\n\t\t\tcameraFar: 1000,\n\t\t\tcameraNear: 0.1\n\t\t};\n\t}\n\n}\n\nlet fragmentShader = ShaderLib.pbr_frag;\n\nfragmentShader = fragmentShader.replace(\n\t'#include <clippingPlanes_pars_frag>',\n\t`\n    #include <clippingPlanes_pars_frag>\n\n    uniform float cameraFar;\n    uniform float cameraNear;\n\n    float weight(float a) {\n        return clamp(pow(min(1.0, a * 10.0) + 0.01, 3.0) * 1e8 * pow(1.0 - gl_FragCoord.z * 0.9, 3.0), 1e-2, 3e3);\n    }\n\n    float alphaWeight(float a) {\n        float z = (gl_FragCoord.z - (cameraFar + cameraNear) / 2.) / ((cameraFar - cameraNear) / 2.);\n\n        // See Weighted Blended Order-Independent Transparency for examples of different weighting functions:\n        // http://jcgt.org/published/0002/02/09/\n        return pow(a + 0.01, 4.0) + max(1e-2, min(3.0 * 1e3, 0.003 / (1e-5 + pow(abs(z) / 200.0, 4.0))));\n    }\n    `\n);\n\nfragmentShader = fragmentShader.replace(\n\t'#include <end_frag>',\n\t`\n    vec4 gl_FragColor = outColor;\n    `\n);\n\nfragmentShader = fragmentShader.replace(\n\t'#include <dithering_frag>',\n\t`\n    #include <dithering_frag>\n\tgl_FragColor.rgb *= gl_FragColor.a;\n    float w = alphaWeight(gl_FragColor.a);\n    gl_FragData[0] = vec4(gl_FragColor.rgb * w, gl_FragColor.a);\n    gl_FragData[1] = vec4(gl_FragColor.a * w);\n    `\n);\n\nexport { WeightedBlendedOITPass, WeightedBlendedOITMaterial };"
  },
  {
    "path": "examples/jsm/probes/PlanarReflectionProbe.js",
    "content": "import { Camera, OffscreenRenderTarget, Vector3, Vector4, Plane, Matrix4, TEXTURE_FILTER } from 't3d';\n\n\n/**\n * A planar reflection probe.\n */\nclass PlanarReflectionProbe {\n\n\t/**\n\t * @param {OffscreenRenderTarget} [renderTarget] - The reflection render is done to the renderTarget (if specified).\n\t */\n\tconstructor(renderTarget) {\n\t\tthis.plane = new Plane();\n\n\t\tif (!renderTarget) {\n\t\t\trenderTarget = OffscreenRenderTarget.create2D(1024, 1024);\n\t\t\trenderTarget.texture.minFilter = TEXTURE_FILTER.LINEAR;\n\t\t\trenderTarget.texture.generateMipmaps = false;\n\t\t}\n\n\t\tthis.renderTarget = renderTarget;\n\t\tthis.renderTexture = renderTarget.texture;\n\n\t\tthis.textureMatrix = new Matrix4();\n\t\tthis.clipBias = 0.0;\n\n\t\tthis.mirrorCamera = new Camera();\n\n\t\tthis.renderOption = {\n\t\t\tifRender: function(renderable) {\n\t\t\t\treturn !renderable.object.skipReflectionProbe;\n\t\t\t}\n\t\t};\n\t}\n\n\t/**\n\t * Render the reflection.\n\t * Need update scene data and collect light data before calling this method.\n\t * @param {ThinRenderer} renderer\n\t * @param {Scene} scene\n\t * @param {Camera} camera\n\t */\n\trender(renderer, scene, camera) {\n\t\tconst mirrorCamera = this.mirrorCamera;\n\n\t\t// Calculate the mirror camera transformation\n\n\t\tcameraPosition.setFromMatrixPosition(camera.worldMatrix);\n\t\tthis.plane.mirrorPoint(cameraPosition, mirrorCameraPosition);\n\n\t\tcameraTarget.setFromMatrixColumn(camera.worldMatrix, 2).normalize().negate().add(cameraPosition);\n\t\tthis.plane.mirrorPoint(cameraTarget, mirrorCameraTarget);\n\n\t\tmirrorCameraUp.setFromMatrixColumn(camera.worldMatrix, 1).normalize().reflect(this.plane.normal);\n\n\t\tmirrorCamera.position.copy(mirrorCameraPosition);\n\t\tmirrorCamera.lookAt(mirrorCameraTarget, mirrorCameraUp);\n\n\t\t// Copy projection matrix to the mirror camera\n\n\t\tmirrorCamera.projectionMatrix.copy(camera.projectionMatrix);\n\t\tmirrorCamera.updateMatrix();\n\n\t\t// Copy other camera properties\n\n\t\tmirrorCamera.outputEncoding = camera.outputEncoding;\n\n\t\t// Update the texture matrix\n\n\t\tthis.textureMatrix.set(\n\t\t\t0.5, 0.0, 0.0, 0.5,\n\t\t\t0.0, 0.5, 0.0, 0.5,\n\t\t\t0.0, 0.0, 0.0, 0.0,\n\t\t\t0.0, 0.0, 0.0, 1.0\n\t\t);\n\t\tthis.textureMatrix.multiply(mirrorCamera.projectionViewMatrix);\n\n\t\t// Now update projection matrix with new clip plane, implementing code from: http://www.terathon.com/code/oblique.html\n\t\t// Paper explaining this technique: http://www.terathon.com/lengyel/Lengyel-Oblique.pdf\n\n\t\tmirrorPlane.copy(this.plane);\n\t\tmirrorPlane.applyMatrix4(mirrorCamera.viewMatrix);\n\n\t\tclipPlane.set(mirrorPlane.normal.x, mirrorPlane.normal.y, mirrorPlane.normal.z, mirrorPlane.constant);\n\n\t\tconst projectionMatrix = mirrorCamera.projectionMatrix;\n\n\t\tq.x = (Math.sign(clipPlane.x) + projectionMatrix.elements[8]) / projectionMatrix.elements[0];\n\t\tq.y = (Math.sign(clipPlane.y) + projectionMatrix.elements[9]) / projectionMatrix.elements[5];\n\t\tq.z = -1.0;\n\t\tq.w = (1.0 + projectionMatrix.elements[10]) / projectionMatrix.elements[14];\n\n\t\t// Calculate the scaled plane vector\n\t\tclipPlane.multiplyScalar(2.0 / clipPlane.dot(q));\n\n\t\t// Replacing the third row of the projection matrix\n\t\tprojectionMatrix.elements[2] = clipPlane.x;\n\t\tprojectionMatrix.elements[6] = clipPlane.y;\n\t\tprojectionMatrix.elements[10] = clipPlane.z + 1.0 - this.clipBias;\n\t\tprojectionMatrix.elements[14] = clipPlane.w;\n\n\t\t// Render\n\n\t\tconst renderStates = scene.updateRenderStates(mirrorCamera, false);\n\t\tconst renderQueue = scene.updateRenderQueue(mirrorCamera, false, false);\n\n\t\trenderer.beginRender(this.renderTarget);\n\n\t\tlet renderQueueLayer;\n\t\tfor (let i = 0, l = renderQueue.layerList.length; i < l; i++) {\n\t\t\trenderQueueLayer = renderQueue.layerList[i];\n\t\t\trenderer.renderRenderableList(renderQueueLayer.opaque, renderStates, this.renderOption);\n\t\t\trenderer.renderRenderableList(renderQueueLayer.transparent, renderStates, this.renderOption);\n\t\t}\n\n\t\trenderer.endRender();\n\n\t\trenderer.generateMipmaps(this.renderTarget.texture);\n\t}\n\n}\n\nconst cameraPosition = new Vector3();\nconst mirrorCameraPosition = new Vector3();\n\nconst cameraTarget = new Vector3();\nconst mirrorCameraTarget = new Vector3();\n\nconst mirrorCameraUp = new Vector3();\n\nconst mirrorPlane = new Plane();\nconst q = new Vector4();\nconst clipPlane = new Vector4();\n\nexport { PlanarReflectionProbe };"
  },
  {
    "path": "examples/jsm/probes/ReflectionProbe.js",
    "content": "import { TEXTURE_FILTER, Camera, Vector3, OffscreenRenderTarget } from 't3d';\n\n/**\n * A Reflection Probe is rather like a camera that captures a spherical view of its surroundings in all directions.\n * The captured image is then stored as a Cubemap that can be used by objects with environment map.\n */\nclass ReflectionProbe {\n\n\t/**\n\t * @param {OffscreenRenderTarget} [renderTarget] - The reflection render is done to the renderTarget (if specified).\n\t */\n\tconstructor(renderTarget) {\n\t\tthis.camera = new Camera();\n\n\t\tthis.targets = [\n\t\t\tnew Vector3(1, 0, 0), new Vector3(-1, 0, 0), new Vector3(0, 1, 0),\n\t\t\tnew Vector3(0, -1, 0), new Vector3(0, 0, 1), new Vector3(0, 0, -1)\n\t\t];\n\t\tthis.ups = [\n\t\t\tnew Vector3(0, -1, 0), new Vector3(0, -1, 0), new Vector3(0, 0, 1),\n\t\t\tnew Vector3(0, 0, -1), new Vector3(0, -1, 0), new Vector3(0, -1, 0)\n\t\t];\n\n\t\tthis.camera.setPerspective(90 / 180 * Math.PI, 1, 1, 1000);\n\n\t\tthis.position = new Vector3();\n\t\tthis.lookTarget = new Vector3();\n\n\t\tthis.renderTarget = renderTarget || OffscreenRenderTarget.createCube(512, 512);\n\t\tthis.renderTexture = this.renderTarget.texture;\n\t\tthis.renderTexture.minFilter = TEXTURE_FILTER.LINEAR_MIPMAP_LINEAR;\n\n\t\tthis.renderOption = {\n\t\t\tifRender: function(renderable) {\n\t\t\t\treturn !renderable.object.skipReflectionProbe;\n\t\t\t}\n\t\t};\n\t}\n\n\t/**\n\t * Render the reflection.\n\t * Need update scene data and collect light data before calling this method.\n\t * @param {ThinRenderer} renderer\n\t * @param {Scene} scene\n\t */\n\trender(renderer, scene) {\n\t\tthis.camera.position.copy(this.position);\n\n\t\tfor (let i = 0; i < 6; i++) {\n\t\t\tthis.lookTarget.set(this.targets[i].x + this.camera.position.x, this.targets[i].y + this.camera.position.y, this.targets[i].z + this.camera.position.z);\n\t\t\tthis.camera.lookAt(this.lookTarget, this.ups[i]);\n\t\t\tthis.camera.updateMatrix();\n\n\t\t\tconst renderStates = scene.updateRenderStates(this.camera, false);\n\t\t\tconst renderQueue = scene.updateRenderQueue(this.camera, false, false);\n\n\t\t\tthis.renderTarget.activeLayer = i;\n\n\t\t\trenderer.beginRender(this.renderTarget);\n\n\t\t\tlet renderQueueLayer;\n\t\t\tfor (let i = 0, l = renderQueue.layerList.length; i < l; i++) {\n\t\t\t\trenderQueueLayer = renderQueue.layerList[i];\n\t\t\t\trenderer.renderRenderableList(renderQueueLayer.opaque, renderStates, this.renderOption);\n\t\t\t\trenderer.renderRenderableList(renderQueueLayer.transparent, renderStates, this.renderOption);\n\t\t\t}\n\n\t\t\trenderer.endRender();\n\n\t\t\trenderer.generateMipmaps(this.renderTarget.texture);\n\t\t}\n\t}\n\n}\n\nexport { ReflectionProbe };"
  },
  {
    "path": "examples/jsm/render/DeferredRenderer.js",
    "content": "import {\n\tBLEND_TYPE,\n\tMatrix4,\n\tScreenRenderTarget,\n\tShaderPostPass,\n\tShadowMapPass,\n\tVector3,\n\tWebGLRenderer\n} from 't3d';\nimport { GBuffer } from '../GBuffer.js';\n\nconst matProjViewInverse = new Matrix4();\nconst eyePosition = new Vector3();\n\nconst defaultContextParams = {\n\tantialias: true, // antialias\n\talpha: false, // effect performance, default false\n\t// premultipliedAlpha: false, // effect performance, default false\n\tstencil: true\n};\n\n/**\n * Deferred WebGL Renderer\n */\nclass DeferredRenderer extends WebGLRenderer {\n\n\tconstructor(view, options = defaultContextParams) {\n\t\tconst gl = view.getContext('webgl2', options) || view.getContext('webgl', options);\n\n\t\tsuper(gl);\n\n\t\tif (this.capabilities.version < 2) {\n\t\t\tconsole.info('DeferredRenderer use WebGL1 because of your browser not support WebGL2.');\n\t\t}\n\n\t\tthis.shadowMapPass = new ShadowMapPass();\n\n\t\tthis.screenRenderTarget = new ScreenRenderTarget(view);\n\n\t\tconst width = view.width;\n\t\tconst height = view.height;\n\n\t\tthis.gBuffer = new GBuffer(width, height);\n\n\t\tconst directionalLightPass = new ShaderPostPass(DeferredRenderer.DeferredShader.directionalLight);\n\t\tdirectionalLightPass.material.transparent = true;\n\t\tdirectionalLightPass.material.blending = BLEND_TYPE.ADD;\n\t\tdirectionalLightPass.material.depthWrite = false;\n\t\tdirectionalLightPass.material.depthTest = false;\n\t\tthis.directionalLightPass = directionalLightPass;\n\n\t\tconst directionalShadowLightPass = new ShaderPostPass(DeferredRenderer.DeferredShader.directionalLight);\n\t\tdirectionalShadowLightPass.material.transparent = true;\n\t\tdirectionalShadowLightPass.material.blending = BLEND_TYPE.ADD;\n\t\tdirectionalShadowLightPass.material.depthWrite = false;\n\t\tdirectionalShadowLightPass.material.depthTest = false;\n\t\tdirectionalShadowLightPass.material.defines['SHADOW'] = 1;\n\t\tthis.directionalShadowLightPass = directionalShadowLightPass;\n\n\t\tconst pointLightPass = new ShaderPostPass(DeferredRenderer.DeferredShader.pointLight);\n\t\tpointLightPass.material.transparent = true;\n\t\tpointLightPass.material.blending = BLEND_TYPE.ADD;\n\t\tpointLightPass.material.depthWrite = false;\n\t\tpointLightPass.material.depthTest = false;\n\t\tthis.pointLightPass = pointLightPass;\n\n\t\tconst pointShadowLightPass = new ShaderPostPass(DeferredRenderer.DeferredShader.pointLight);\n\t\tpointShadowLightPass.material.transparent = true;\n\t\tpointShadowLightPass.material.blending = BLEND_TYPE.ADD;\n\t\tpointShadowLightPass.material.depthWrite = false;\n\t\tpointShadowLightPass.material.depthTest = false;\n\t\tpointShadowLightPass.material.defines['SHADOW'] = 1;\n\t\tthis.pointShadowLightPass = pointShadowLightPass;\n\n\t\tconst spotLightPass = new ShaderPostPass(DeferredRenderer.DeferredShader.spotLight);\n\t\tspotLightPass.material.transparent = true;\n\t\tspotLightPass.material.blending = BLEND_TYPE.ADD;\n\t\tspotLightPass.material.depthWrite = false;\n\t\tspotLightPass.material.depthTest = false;\n\t\tthis.spotLightPass = spotLightPass;\n\n\t\tconst spotShadowLightPass = new ShaderPostPass(DeferredRenderer.DeferredShader.spotLight);\n\t\tspotShadowLightPass.material.transparent = true;\n\t\tspotShadowLightPass.material.blending = BLEND_TYPE.ADD;\n\t\tspotShadowLightPass.material.depthWrite = false;\n\t\tspotShadowLightPass.material.depthTest = false;\n\t\tspotShadowLightPass.material.defines['SHADOW'] = 1;\n\t\tthis.spotShadowLightPass = spotShadowLightPass;\n\n\t\tconst ambientCubemapLightPass = new ShaderPostPass(DeferredRenderer.DeferredShader.ambientCubemapLight);\n\t\tambientCubemapLightPass.material.transparent = true;\n\t\tambientCubemapLightPass.material.blending = BLEND_TYPE.ADD;\n\t\tambientCubemapLightPass.material.depthWrite = false;\n\t\tambientCubemapLightPass.material.depthTest = false;\n\t\tthis.ambientCubemapLightPass = ambientCubemapLightPass;\n\n\t\tthis.ambientCubemap = null;\n\t\tthis.ambientCubemapIntensity = 1.0;\n\t}\n\n\t// deprecated since 0.5.0\n\tset backRenderTarget(value) {\n\t\tthis.screenRenderTarget = value;\n\t}\n\n\tget backRenderTarget() {\n\t\treturn this.screenRenderTarget;\n\t}\n\n\tresize(width, height) {\n\t\tthis.screenRenderTarget.resize(width, height);\n\t\tthis.gBuffer.resize(width, height);\n\t}\n\n\trender(scene, camera, renderTarget) {\n\t\trenderTarget = renderTarget || this.screenRenderTarget;\n\n\t\tconst oldClearColor = renderTarget.clearColor;\n\n\t\tconst gBuffer = this.gBuffer;\n\t\tconst width = renderTarget.width;\n\t\tconst height = renderTarget.height;\n\n\t\tscene.updateMatrix();\n\t\tconst renderStates = scene.updateRenderStates(camera);\n\t\tscene.updateRenderQueue(camera);\n\n\t\tthis.shadowMapPass.render(this, scene);\n\n\t\t// Step 1: update GBuffer\n\n\t\tgBuffer.update(this, scene, camera);\n\n\t\t// Step 2: light accum\n\n\t\tmatProjViewInverse.copy(renderStates.camera.projectionViewMatrix).invert();\n\t\teyePosition.copy(renderStates.camera.position);\n\n\t\tfunction uploadCommonUniforms(pass) {\n\t\t\tpass.uniforms['normalGlossinessTexture'] = gBuffer.getNormalGlossinessTexture();\n\t\t\tpass.uniforms['depthTexture'] = gBuffer.getDepthTexture();\n\t\t\tpass.uniforms['albedoMetalnessTexture'] = gBuffer.getAlbedoMetalnessTexture();\n\t\t\tpass.uniforms['windowSize'][0] = width;\n\t\t\tpass.uniforms['windowSize'][1] = height;\n\t\t\tpass.uniforms['matProjViewInverse'].set(matProjViewInverse.elements);\n\t\t\tpass.uniforms['eyePosition'][0] = eyePosition.x;\n\t\t\tpass.uniforms['eyePosition'][1] = eyePosition.y;\n\t\t\tpass.uniforms['eyePosition'][2] = eyePosition.z;\n\t\t}\n\n\t\tlet lights, shadows, count, shadowCount;\n\n\t\tconst lightingGroup = renderStates.lighting.getGroup(0);\n\n\t\t// directional\n\n\t\tlights = lightingGroup.directional;\n\t\tshadows = lightingGroup.directionalShadow;\n\t\tcount = lightingGroup.directsNum;\n\t\tshadowCount = lightingGroup.directShadowNum;\n\n\t\tfor (let i = 0; i < count; i++) {\n\t\t\tconst light = lights[i];\n\n\t\t\tconst pass = i < shadowCount ? this.directionalShadowLightPass : this.directionalLightPass;\n\t\t\tuploadCommonUniforms(pass);\n\n\t\t\tpass.uniforms['lightColor'] = [light.color[0], light.color[1], light.color[2]];\n\t\t\tpass.uniforms['lightDirection'] = [light.direction[0], light.direction[1], light.direction[2]];\n\n\t\t\tif (i < shadowCount) {\n\t\t\t\tconst shadow = shadows[i];\n\n\t\t\t\tpass.uniforms['shadowBias'][0] = shadow.shadowBias[0];\n\t\t\t\tpass.uniforms['shadowBias'][1] = shadow.shadowBias[1];\n\t\t\t\tpass.uniforms['shadowParams'][0] = shadow.shadowParams[0];\n\t\t\t\tpass.uniforms['shadowParams'][1] = shadow.shadowParams[1];\n\t\t\t\tpass.uniforms['shadowMapSize'][0] = shadow.shadowMapSize[0];\n\t\t\t\tpass.uniforms['shadowMapSize'][1] = shadow.shadowMapSize[1];\n\n\t\t\t\tpass.uniforms['shadowMap'] = this.capabilities.version >= 2 ? lightingGroup.directionalShadowDepthMap[i] : lightingGroup.directionalShadowMap[i];\n\t\t\t\tpass.uniforms['shadowMatrix'].set(lightingGroup.directionalShadowMatrix, i * 16);\n\t\t\t}\n\n\t\t\tpass.render(this, renderTarget);\n\t\t}\n\n\t\trenderTarget.clearColor = false;\n\n\t\t// point\n\n\t\tlights = lightingGroup.point;\n\t\tshadows = lightingGroup.pointShadow;\n\t\tcount = lightingGroup.pointsNum;\n\t\tshadowCount = lightingGroup.pointShadowNum;\n\n\t\tfor (let i = 0; i < count; i++) {\n\t\t\tconst light = lights[i];\n\n\t\t\tconst pass = i < shadowCount ? this.pointShadowLightPass : this.pointLightPass;\n\t\t\tuploadCommonUniforms(pass);\n\n\t\t\tpass.uniforms['lightColor'] = [light.color[0], light.color[1], light.color[2]];\n\t\t\tpass.uniforms['lightPosition'] = [light.position[0], light.position[1], light.position[2]];\n\t\t\tpass.uniforms['lightRange'] = light.distance;\n\t\t\t// pass.uniforms[\"attenuationFactor\"] = light.decay; 5.0?\n\n\t\t\tif (i < shadowCount) {\n\t\t\t\tconst shadow = shadows[i];\n\n\t\t\t\tpass.uniforms['shadowBias'][0] = shadow.shadowBias[0];\n\t\t\t\tpass.uniforms['shadowBias'][1] = shadow.shadowBias[1];\n\t\t\t\tpass.uniforms['shadowParams'][0] = shadow.shadowParams[0];\n\t\t\t\tpass.uniforms['shadowParams'][1] = shadow.shadowParams[1];\n\t\t\t\tpass.uniforms['shadowMapSize'][0] = shadow.shadowMapSize[0];\n\t\t\t\tpass.uniforms['shadowMapSize'][1] = shadow.shadowMapSize[1];\n\n\t\t\t\tpass.uniforms['shadowMap'] = lightingGroup.pointShadowMap[i];\n\n\t\t\t\tpass.uniforms['shadowCameraRange'][0] = shadow.shadowCameraRange[0];\n\t\t\t\tpass.uniforms['shadowCameraRange'][1] = shadow.shadowCameraRange[1];\n\t\t\t}\n\n\t\t\tpass.render(this, renderTarget);\n\t\t}\n\n\t\t// spot\n\n\t\tlights = lightingGroup.spot;\n\t\tshadows = lightingGroup.spotShadow;\n\t\tcount = lightingGroup.spotsNum;\n\t\tshadowCount = lightingGroup.spotShadowNum;\n\n\t\tfor (let i = 0; i < count; i++) {\n\t\t\tconst light = lights[i];\n\n\t\t\tconst pass = i < shadowCount ? this.spotShadowLightPass : this.spotLightPass;\n\t\t\tuploadCommonUniforms(pass);\n\n\t\t\tpass.uniforms['lightColor'] = [light.color[0], light.color[1], light.color[2]];\n\t\t\tpass.uniforms['lightPosition'] = [light.position[0], light.position[1], light.position[2]];\n\t\t\tpass.uniforms['lightDirection'] = [light.direction[0], light.direction[1], light.direction[2]];\n\t\t\tpass.uniforms['lightConeCos'] = light.coneCos;\n\t\t\tpass.uniforms['lightPenumbraCos'] = light.penumbraCos;\n\t\t\tpass.uniforms['lightRange'] = light.distance;\n\t\t\t// pass.uniforms[\"attenuationFactor\"] = light.decay; 5.0?\n\n\t\t\tif (i < shadowCount) {\n\t\t\t\tconst shadow = shadows[i];\n\n\t\t\t\tpass.uniforms['shadowBias'][0] = shadow.shadowBias[0];\n\t\t\t\tpass.uniforms['shadowBias'][1] = shadow.shadowBias[1];\n\t\t\t\tpass.uniforms['shadowParams'][0] = shadow.shadowParams[0];\n\t\t\t\tpass.uniforms['shadowParams'][1] = shadow.shadowParams[1];\n\t\t\t\tpass.uniforms['shadowMapSize'][0] = shadow.shadowMapSize[0];\n\t\t\t\tpass.uniforms['shadowMapSize'][1] = shadow.shadowMapSize[1];\n\n\t\t\t\tpass.uniforms['shadowMap'] = this.capabilities.version >= 2 ? lightingGroup.spotShadowDepthMap[i] : lightingGroup.spotShadowMap[i];\n\t\t\t\tpass.uniforms['shadowMatrix'].set(lightingGroup.spotShadowMatrix, i * 16);\n\t\t\t}\n\n\t\t\tpass.render(this, renderTarget);\n\t\t}\n\n\t\t// ambientCubemap\n\n\t\tif (this.ambientCubemap) {\n\t\t\tconst pass = this.ambientCubemapLightPass;\n\t\t\tuploadCommonUniforms(pass);\n\n\t\t\tpass.uniforms['cubeMap'] = this.ambientCubemap;\n\t\t\tpass.uniforms['intensity'] = this.ambientCubemapIntensity;\n\n\t\t\tpass.render(this, renderTarget);\n\t\t}\n\n\t\t// restore\n\n\t\trenderTarget.clearColor = oldClearColor;\n\t}\n\n}\n\nconst DeferredShaderChunk = {\n\n\tlight_vertex: `\n\t\tattribute vec3 a_Position;\n\n\t\tuniform mat4 u_ProjectionView;\n\t\tuniform mat4 u_Model;\n\n\t\tvoid main() {\n\t\t\tgl_Position = u_ProjectionView * u_Model * vec4(a_Position, 1.0);\n\t\t}\n\t`,\n\n\tlight_head: `\n\t\tuniform sampler2D normalGlossinessTexture;\n\t\tuniform sampler2D depthTexture;\n\t\tuniform sampler2D albedoMetalnessTexture;\n\n\t\tuniform vec2 windowSize;\n\n\t\tuniform mat4 matProjViewInverse;\n\t`,\n\n\t// Extract\n\t// - N, z, position\n\t// - albedo, metalness, specularColor, diffuseColor\n\tgbuffer_read: `\n\t\tvec2 texCoord = gl_FragCoord.xy / windowSize;\n\n\t\tvec4 texel1 = texture2D(normalGlossinessTexture, texCoord);\n\t\tvec4 texel3 = texture2D(albedoMetalnessTexture, texCoord);\n\n\t\t// Is empty\n\t\tif (dot(texel1.rgb, vec3(1.0)) == 0.0) {\n\t\t\tdiscard;\n\t\t}\n\n\t\tfloat glossiness = texel1.a;\n\t\tfloat metalness = texel3.a;\n\n\t\tvec3 N = texel1.rgb * 2.0 - 1.0;\n\n\t\t// Depth buffer range is 0.0 - 1.0\n\t\tfloat z = texture2D(depthTexture, texCoord).r * 2.0 - 1.0;\n\n\t\tvec2 xy = texCoord * 2.0 - 1.0;\n\n\t\tvec4 projectedPos = vec4(xy, z, 1.0);\n\t\tvec4 p4 = matProjViewInverse * projectedPos;\n\n\t\tvec3 position = p4.xyz / p4.w;\n\n\t\tvec3 albedo = texel3.rgb;\n\n\t\tvec3 diffuseColor = albedo * (1.0 - metalness);\n\t\tvec3 specularColor = mix(vec3(0.04), albedo, metalness);\n\t`,\n\n\tcalculate_attenuation: `\n\t\tuniform float attenuationFactor;\n\n\t\tfloat lightAttenuation(float dist, float range) {\n\t\t\tfloat attenuation = 1.0;\n\t\t\tattenuation = dist * dist / (range * range + 1.0);\n\t\t\tfloat att_s = attenuationFactor;\n\t\t\tattenuation = 1.0 / (attenuation * att_s + 1.0);\n\t\t\tatt_s = 1.0 / (att_s + 1.0);\n\t\t\tattenuation = attenuation - att_s;\n\t\t\tattenuation /= 1.0 - att_s;\n\t\t\treturn clamp(attenuation, 0.0, 1.0);\n\t\t}\n\t`,\n\n\tlight_equation: `\n\t\tfloat D_Phong(in float g, in float ndh) {\n\t\t\t// from black ops 2\n\t\t\tfloat a = pow(8192.0, g);\n\t\t\treturn (a + 2.0) / 8.0 * pow(ndh, a);\n\t\t}\n\n\t\tfloat D_GGX(in float g, in float ndh) {\n\t\t\tfloat r = 1.0 - g;\n\t\t\tfloat a = r * r;\n\t\t\tfloat tmp = ndh * ndh * (a - 1.0) + 1.0;\n\t\t\treturn a / (3.1415926 * tmp * tmp);\n\t\t}\n\n\t\t// Fresnel\n\t\tvec3 F_Schlick(in float ndv, vec3 spec) {\n\t\t\treturn spec + (1.0 - spec) * pow(1.0 - ndv, 5.0);\n\t\t}\n\n\t\tvec3 lightEquation(\n\t\t\tin vec3 lightColor, in vec3 diffuseColor, in vec3 specularColor,\n\t\t\tin float ndl, in float ndh, in float ndv, in float g\n\t\t) {\n\t\t\treturn ndl * PI * lightColor\n\t\t\t\t* (diffuseColor + D_Phong(g, ndh) * F_Schlick(ndv, specularColor));\n\t\t}\n\t`\n\n};\n\nDeferredRenderer.DeferredShader = {\n\n\tdirectionalLight: {\n\t\tname: 'deferred_directionallight',\n\n\t\tdefines: {\n\t\t\t'SHADOW': 0\n\t\t},\n\n\t\tuniforms: {\n\t\t\tnormalGlossinessTexture: null,\n\t\t\tdepthTexture: null,\n\t\t\talbedoMetalnessTexture: null,\n\n\t\t\twindowSize: [800, 600],\n\n\t\t\tmatProjViewInverse: new Float32Array(16),\n\n\t\t\tlightColor: [0, 0, 0],\n\t\t\tlightDirection: [0, 1, 0],\n\n\t\t\teyePosition: [0, 1, 0],\n\n\t\t\tshadowMatrix: new Float32Array(16),\n\t\t\tshadowMap: null,\n\t\t\tshadowBias: [0, 0],\n\t\t\tshadowParams: [1, 0],\n\t\t\tshadowMapSize: [1024, 1024]\n\t\t},\n\n\t\tvertexShader: DeferredShaderChunk.light_vertex,\n\n\t\tfragmentShader: `\n\t\t\t${DeferredShaderChunk.light_head}\n\t\t\t${DeferredShaderChunk.light_equation}\n\n\t\t\tuniform vec3 lightDirection;\n\t\t\tuniform vec3 lightColor;\n\n\t\t\tuniform vec3 eyePosition;\n\n\t\t\t#if SHADOW == 1\n\t\t\t\tuniform sampler2DShadow shadowMap;\n\t\t\t\tuniform mat4 shadowMatrix;\n\n\t\t\t\tuniform vec2 shadowBias;\n\t\t\t\tuniform vec2 shadowParams;\n\t\t\t\tuniform vec2 shadowMapSize;\n\n\t\t\t\t#include <packing>\n\t\t\t\t#include <shadow>\n\t\t\t#endif\n\n\t\t\tvoid main() {\n\t\t\t\t${DeferredShaderChunk.gbuffer_read}\n\n\t\t\t\tvec3 L = -normalize(lightDirection);\n\t\t\t\tvec3 V = normalize(eyePosition - position);\n\n\t\t\t\tvec3 H = normalize(L + V);\n\t\t\t\tfloat ndl = clamp(dot(N, L), 0.0, 1.0);\n\t\t\t\tfloat ndh = clamp(dot(N, H), 0.0, 1.0);\n\t\t\t\tfloat ndv = clamp(dot(N, V), 0.0, 1.0);\n\n\t\t\t\tgl_FragColor.rgb = lightEquation(lightColor, diffuseColor, specularColor, ndl, ndh, ndv, glossiness);\n\n\t\t\t\t#if SHADOW == 1\n\t\t\t\t\tfloat shadowContrib = getShadow(shadowMap, shadowMatrix * vec4(position, 1.), shadowMapSize, shadowBias, shadowParams);\n\t\t\t\t\tgl_FragColor.rgb *= shadowContrib;\n\t\t\t\t#endif\n\n\t\t\t\tgl_FragColor.a = 1.0;\n\t\t\t}\n\t\t`\n\t},\n\n\tpointLight: {\n\t\tname: 'deferred_pointlight',\n\n\t\tdefines: {\n\t\t\t'SHADOW': 0\n\t\t},\n\n\t\tuniforms: {\n\t\t\tnormalGlossinessTexture: null,\n\t\t\tdepthTexture: null,\n\t\t\talbedoMetalnessTexture: null,\n\n\t\t\twindowSize: [800, 600],\n\n\t\t\tmatProjViewInverse: new Float32Array(16),\n\n\t\t\tlightColor: [0, 0, 0],\n\t\t\tlightPosition: [0, 1, 0],\n\t\t\tlightRange: 1,\n\n\t\t\tattenuationFactor: 5.0,\n\n\t\t\teyePosition: [0, 1, 0],\n\n\t\t\tshadowMap: null,\n\t\t\tshadowBias: [0, 0],\n\t\t\tshadowParams: [1, 0],\n\t\t\tshadowMapSize: [1024, 1024],\n\t\t\tshadowCameraRange: [1, 100]\n\t\t},\n\n\t\tvertexShader: DeferredShaderChunk.light_vertex,\n\n\t\tfragmentShader: `\n\t\t\t${DeferredShaderChunk.light_head}\n\t\t\t${DeferredShaderChunk.calculate_attenuation}\n\t\t\t${DeferredShaderChunk.light_equation}\n\n\t\t\tuniform vec3 lightPosition;\n\t\t\tuniform vec3 lightColor;\n\t\t\tuniform float lightRange;\n\n\t\t\tuniform vec3 eyePosition;\n\n\t\t\t#if SHADOW == 1\n\t\t\t\tuniform samplerCube shadowMap;\n\n\t\t\t\tuniform vec2 shadowBias;\n\t\t\t\tuniform vec2 shadowParams;\n\t\t\t\tuniform vec2 shadowMapSize;\n\t\t\t\tuniform vec2 shadowCameraRange;\n\n\t\t\t\t#include <packing>\n\t\t\t\t#include <shadow>\n\t\t\t#endif\n\n\t\t\tvoid main() {\n\t\t\t\t${DeferredShaderChunk.gbuffer_read}\n\n\t\t\t\tvec3 L = lightPosition - position;\n\t\t\t\tvec3 V = normalize(eyePosition - position);\n\n\t\t\t\tfloat dist = length(L);\n\t\t\t\tL /= dist;\n\n\t\t\t\tvec3 H = normalize(L + V);\n\n\t\t\t\tfloat ndl = clamp(dot(N, L), 0.0, 1.0);\n\t\t\t\tfloat ndh = clamp(dot(N, H), 0.0, 1.0);\n\t\t\t\tfloat ndv = clamp(dot(N, V), 0.0, 1.0);\n\t\t\t\tfloat attenuation = lightAttenuation(dist, lightRange);\n\t\t\t\t// Diffuse term\n\t\t\t\tgl_FragColor.rgb = attenuation * lightEquation(lightColor, diffuseColor, specularColor, ndl, ndh, ndv, glossiness);\n\n\t\t\t\t#if SHADOW == 1\n\t\t\t\t\tfloat shadowContrib = getPointShadow(shadowMap, vec4(-L * dist, 1.0), shadowMapSize, shadowBias, shadowParams, shadowCameraRange);\n\t\t\t\t\tgl_FragColor.rgb *= clamp(shadowContrib, 0.0, 1.0);\n\t\t\t\t#endif\n\n\t\t\t\tgl_FragColor.a = 1.0;\n\t\t\t}\n\t\t`\n\t},\n\n\tspotLight: {\n\t\tname: 'deferred_spotlight',\n\n\t\tdefines: {\n\t\t\t'SHADOW': 0\n\t\t},\n\n\t\tuniforms: {\n\t\t\tnormalGlossinessTexture: null,\n\t\t\tdepthTexture: null,\n\t\t\talbedoMetalnessTexture: null,\n\n\t\t\twindowSize: [800, 600],\n\n\t\t\tmatProjViewInverse: new Float32Array(16),\n\n\t\t\tlightColor: [0, 0, 0],\n\t\t\tlightPosition: [0, 1, 0],\n\t\t\tlightDirection: [0, 1, 0],\n\t\t\tlightConeCos: 1,\n\t\t\tlightPenumbraCos: 1,\n\t\t\tlightRange: 1,\n\t\t\tfalloffFactor: 1.,\n\n\t\t\tattenuationFactor: 5.0,\n\n\t\t\teyePosition: [0, 1, 0],\n\n\t\t\tshadowMatrix: new Float32Array(16),\n\t\t\tshadowMap: null,\n\t\t\tshadowBias: [0, 0],\n\t\t\tshadowParams: [1, 0],\n\t\t\tshadowMapSize: [1024, 1024]\n\t\t},\n\n\t\tvertexShader: DeferredShaderChunk.light_vertex,\n\n\t\tfragmentShader: `\n\t\t\t${DeferredShaderChunk.light_head}\n\t\t\t${DeferredShaderChunk.calculate_attenuation}\n\t\t\t${DeferredShaderChunk.light_equation}\n\n\t\t\tuniform vec3 lightPosition;\n\t\t\tuniform vec3 lightDirection;\n\t\t\tuniform vec3 lightColor;\n\t\t\tuniform float lightConeCos;\n\t\t\tuniform float lightPenumbraCos;\n\t\t\tuniform float lightRange;\n\t\t\tuniform float falloffFactor;\n\n\t\t\tuniform vec3 eyePosition;\n\n\t\t\t#if SHADOW == 1\n\t\t\t\tuniform sampler2DShadow shadowMap;\n\t\t\t\tuniform mat4 shadowMatrix;\n\n\t\t\t\tuniform vec2 shadowBias;\n\t\t\t\tuniform vec2 shadowParams;\n\t\t\t\tuniform vec2 shadowMapSize;\n\n\t\t\t\t#include <packing>\n\t\t\t\t#include <shadow>\n\t\t\t#endif\n\n\t\t\tvoid main() {\n\t\t\t\t${DeferredShaderChunk.gbuffer_read}\n\n\t\t\t\tvec3 L = lightPosition - position;\n\t\t\t\tvec3 V = normalize(eyePosition - position);\n\n\t\t\t\tfloat dist = length(L);\n\t\t\t\tL /= dist;\n\n\t\t\t\tfloat attenuation = lightAttenuation(dist, lightRange);\n\t\t\t\tfloat angleCos = dot(-normalize(lightDirection), L);\n\n\t\t\t\tif (angleCos <= lightConeCos) discard;\n\t\t\t\tif (dist > lightRange) discard;\n\n\t\t\t\tfloat spotEffect = smoothstep(lightConeCos, lightPenumbraCos, angleCos);\n\n\t\t\t\tvec3 H = normalize(L + V);\n\t\t\t\tfloat ndl = clamp(dot(N, L), 0.0, 1.0);\n\t\t\t\tfloat ndh = clamp(dot(N, H), 0.0, 1.0);\n\t\t\t\tfloat ndv = clamp(dot(N, V), 0.0, 1.0);\n\n\t\t\t\t// Diffuse term\n\t\t\t\tgl_FragColor.rgb = spotEffect * attenuation * lightEquation(lightColor, diffuseColor, specularColor, ndl, ndh, ndv, glossiness);\n\n\t\t\t\t#if SHADOW == 1\n\t\t\t\t\tfloat shadowContrib = getShadow(shadowMap, shadowMatrix * vec4(position, 1.), shadowMapSize, shadowBias, shadowParams);\n\t\t\t\t\tgl_FragColor.rgb *= shadowContrib;\n\t\t\t\t#endif\n\n\t\t\t\tgl_FragColor.a = 1.0;\n\t\t\t}\n\t\t`\n\t},\n\n\tambientCubemapLight: {\n\t\tname: 'deferred_ambientcubemaplight',\n\n\t\tdefines: {},\n\n\t\tuniforms: {\n\t\t\tnormalGlossinessTexture: null,\n\t\t\tdepthTexture: null,\n\t\t\talbedoMetalnessTexture: null,\n\n\t\t\twindowSize: [800, 600],\n\n\t\t\tmatProjViewInverse: new Float32Array(16),\n\n\t\t\tcubeMap: null,\n\t\t\tintensity: 1.0,\n\n\t\t\teyePosition: [0, 1, 0]\n\t\t},\n\n\t\tvertexShader: DeferredShaderChunk.light_vertex,\n\n\t\tfragmentShader: `\n\t\t\t${DeferredShaderChunk.light_head}\n\t\t\t${DeferredShaderChunk.light_equation}\n\n\t\t\tuniform samplerCube cubeMap;\n\t\t\tuniform float intensity;\n\n\t\t\tuniform vec3 eyePosition;\n\n\t\t\tvoid main() {\n\t\t\t\t${DeferredShaderChunk.gbuffer_read}\n\n\t\t\t\tvec3 V = normalize(eyePosition - position);\n\t\t\t\tvec3 L = reflect(-V, N);\n\n\t\t\t\tvec3 H = normalize(L + V);\n\n\t\t\t\tfloat ndv = clamp(dot(N, V), 0.0, 1.0);\n\t\t\t\tfloat ndh = clamp(dot(N, H), 0.0, 1.0);\n\t\t\t\tfloat rough = clamp(1.0 - glossiness, 0.0, 1.0);\n\n\t\t\t\t// FIXME fixed maxMipmapLevel ?\n\t\t\t\tfloat level = rough * 5.0;\n\n\t\t\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\t\t\tvec4 cubeMapColor1 = textureCubeLodEXT(cubeMap, L, 8.);\n\t\t\t\t\tvec4 cubeMapColor2 = textureCubeLodEXT(cubeMap, L, level);\n\t\t\t\t#else\n\t\t\t\t\t// force the bias high to get the last LOD level as it is the most blurred.\n\t\t\t\t\tvec4 cubeMapColor1 = textureCubeLodEXT(cubeMap, L, 8.);\n\t\t\t\t\tvec4 cubeMapColor2 = textureCube(cubeMap, L, level);\n\t\t\t\t#endif\n\n\t\t\t\t// Diffuse term\n\t\t\t\t// TODO\n\t\t\t\tgl_FragColor.rgb = intensity * (cubeMapColor2.xyz * F_Schlick(ndv, specularColor) + cubeMapColor1.xyz * diffuseColor / PI);\n\n\t\t\t\tgl_FragColor.a = 1.0;\n\t\t\t}\n\t\t`\n\t}\n\n};\n\nexport { DeferredRenderer };"
  },
  {
    "path": "examples/jsm/render/ForwardRenderer.js",
    "content": "import {\n\tScreenRenderTarget,\n\tShadowMapPass,\n\tWebGLRenderer\n} from 't3d';\n\n/**\n * A simple Forward WebGL Renderer.\n * @memberof t3d\n */\nclass ForwardRenderer extends WebGLRenderer {\n\n\t/**\n\t * @param {HTMLCanvasElement} view - The canvas elements.\n\t * @param {object} [options] - The {@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/getContext options for webgl context}.\n\t */\n\tconstructor(view, options) {\n\t\tconst defaultContextParams = {\n\t\t\tantialias: true, // antialias\n\t\t\talpha: false, // effect performance, default false\n\t\t\t// premultipliedAlpha: false, // effect performance, default false\n\t\t\tstencil: true\n\t\t};\n\n\t\tconst gl = view.getContext('webgl2', options || defaultContextParams) || view.getContext('webgl', options || defaultContextParams);\n\n\t\tsuper(gl);\n\n\t\tif (this.capabilities.version < 2) {\n\t\t\tconsole.info('ForwardRenderer use WebGL1 because of your browser not support WebGL2.');\n\t\t}\n\n\t\tthis.screenRenderTarget = new ScreenRenderTarget(view);\n\n\t\tthis.shadowMapPass = new ShadowMapPass();\n\n\t\t/**\n\t\t * Defines whether the shadow pass should automatically update.\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.shadowAutoUpdate = true;\n\n\t\t/**\n\t\t * If {@link ForwardRenderer.shadowAutoUpdate} is set true and this set true, shadow will update and set this to false automatically.\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.shadowNeedsUpdate = true;\n\n\t\t/**\n\t\t * Defines whether the scene should automatically update its matrix.\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.matrixAutoUpdate = true;\n\n\t\t/**\n\t\t * Defines whether the scene should automatically update its render states.\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.renderStatesAutoUpdate = true;\n\n\t\t/**\n\t\t * Defines whether the scene should automatically update its render queue.\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.renderQueueAutoUpdate = true;\n\t}\n\n\tset autoClear(value) {\n\t\tconsole.warn('ForwardRenderer: autoClear has been deprecated. Use renderTarget.setClear(...) instead.');\n\t}\n\n\tget autoClear() {\n\t\tconsole.warn('ForwardRenderer: autoClear has been deprecated. Use renderTarget.setClear(...) instead.');\n\t\treturn true;\n\t}\n\n\t// deprecated since 0.5.0\n\tset backRenderTarget(value) {\n\t\tthis.screenRenderTarget = value;\n\t}\n\n\tget backRenderTarget() {\n\t\treturn this.screenRenderTarget;\n\t}\n\n\t/**\n\t * Render a scene using a camera.\n\t * The render is done to the renderTarget (if specified) or to the canvas as usual.\n\t * @param {Scene} scene - The scene.\n\t * @param {Camera} camera - The camera.\n\t * @param {RenderTargetBase} [renderTarget] - The render is done to the renderTarget (if specified) or to the canvas as usual.\n\t * @param {boolean} [forceClear=false] - Deprecated. Whether to clear the output before rendering. Use renderTarget.setClear(...) instead.\n\t */\n\trender(scene, camera, renderTarget, forceClear) {\n\t\tif (forceClear !== undefined) {\n\t\t\tconsole.warn('The fourth parameter forceClear has been deprecated. Use renderTarget.setClear(...) instead.');\n\t\t}\n\n\t\tthis.matrixAutoUpdate && scene.updateMatrix();\n\n\t\tthis.renderStatesAutoUpdate && scene.updateRenderStates(camera);\n\t\tthis.renderQueueAutoUpdate && scene.updateRenderQueue(camera);\n\n\t\tif (this.shadowAutoUpdate || this.shadowNeedsUpdate) {\n\t\t\tthis.shadowMapPass.render(this, scene);\n\n\t\t\tthis.shadowNeedsUpdate = false;\n\t\t}\n\n\t\tif (renderTarget === undefined) {\n\t\t\trenderTarget = this.screenRenderTarget;\n\t\t}\n\n\t\tthis.renderScene(scene, camera, renderTarget);\n\n\t\tif (renderTarget.texture) {\n\t\t\tthis.generateMipmaps(renderTarget.texture);\n\t\t}\n\t}\n\n}\n\nexport { ForwardRenderer };"
  },
  {
    "path": "examples/jsm/shaders/BlendShader.js",
    "content": "/**\n * Blend Shader.\n */\nconst BlendShader = {\n\tname: 'blend',\n\n\tuniforms: {\n\t\t'tDiffuse1': null,\n\t\t'tDiffuse2': null,\n\t\t'opacity1': 1.0,\n\t\t'opacity2': 1.0\n\t},\n\n\tvertexShader: `\n\t\tattribute vec3 a_Position;\n\t\tattribute vec2 a_Uv;\n\n\t\tuniform mat4 u_ProjectionView;\n\t\tuniform mat4 u_Model;\n\n\t\tvarying vec2 v_Uv;\n\n\t\tvoid main() {\n\t\t\tv_Uv = a_Uv;\n\t\t\tgl_Position = u_ProjectionView * u_Model * vec4(a_Position, 1.0);\n\t\t}\n\t`,\n\n\tfragmentShader: `\n\t\tuniform float opacity1;\n\t\tuniform float opacity2;\n\n\t\tuniform sampler2D tDiffuse1;\n\t\tuniform sampler2D tDiffuse2;\n\n\t\tvarying vec2 v_Uv;\n\n\t\tvoid main() {\n\t\t\tvec4 texel = vec4(0.);\n\t\t\ttexel += texture2D(tDiffuse1, v_Uv) * opacity1;\n\t\t\ttexel += texture2D(tDiffuse2, v_Uv) * opacity2;\n\t\t\tgl_FragColor = texel;\n\t\t}\n\t`\n};\n\nexport { BlendShader };"
  },
  {
    "path": "examples/jsm/shaders/BlurShader.js",
    "content": "/**\n * Blur Shader\n */\nconst BlurShader = {\n\tname: 'blur',\n\n\tdefines: {\n\t\t'NORMALTEX_ENABLED': 0,\n\t\t'DEPTHTEX_ENABLED': 0,\n\t\t'DEPTH_PACKING': 0,\n\t\t'KERNEL_SIZE_INT': '5',\n\t\t'KERNEL_SIZE_FLOAT': '5.0'\n\t},\n\n\tuniforms: {\n\t\t'tDiffuse': null,\n\t\t'textureSize': [512, 512],\n\t\t'direction': 0, // 0 horizontal, 1 vertical\n\t\t'blurSize': 1,\n\t\t'kernel': [0.122581, 0.233062, 0.288713, 0.233062, 0.122581],\n\t\t'normalTex': null,\n\t\t'depthTex': null,\n\t\t'projection': new Float32Array(16),\n\t\t'viewInverseTranspose': new Float32Array(16),\n\t\t'depthRange': 1\n\t},\n\n\tvertexShader: `\n\t\tattribute vec3 a_Position;\n\t\tattribute vec2 a_Uv;\n\n\t\tuniform mat4 u_ProjectionView;\n\t\tuniform mat4 u_Model;\n\n\t\tvarying vec2 v_Uv;\n\n\t\tvoid main() {\n\t\t\tv_Uv = a_Uv;\n\t\t\tgl_Position = u_ProjectionView * u_Model * vec4(a_Position, 1.0);\n\t\t}\n\t`,\n\n\tfragmentShader: `\n\t\tvarying vec2 v_Uv;\n\n\t\tuniform sampler2D tDiffuse;\n\n\t\tuniform vec2 textureSize;\n\n\t\t// 0 horizontal, 1 vertical\n\t\tuniform int direction;\n\n\t\tuniform float blurSize;\n\n\t\tuniform float kernel[KERNEL_SIZE_INT];\n\n\t\t#if NORMALTEX_ENABLED == 1\n\t\t\tuniform sampler2D normalTex;\n\t\t\tuniform mat4 viewInverseTranspose;\n\t\t\tvec3 getViewNormal( const in vec2 screenPosition ) {\n\t\t\t\tvec3 normal = texture2D( normalTex, screenPosition ).xyz * 2.0 - 1.0;\n\t\t\t\t// Convert to view space\n\t\t\t\treturn (viewInverseTranspose * vec4(normal, 0.0)).xyz;\n\t\t\t}\n\t\t#endif\n\n\t\t#if DEPTHTEX_ENABLED == 1\n\t\t\t#if DEPTH_PACKING == 1\n\t\t\t\t#include <packing>\n\t\t\t#endif\n\t\t\tuniform sampler2D depthTex;\n\t\t\tuniform mat4 projection;\n\t\t\tuniform float depthRange;\n\t\t\tfloat getDepth( const in vec2 screenPosition ) {\n\t\t\t\t#if DEPTH_PACKING == 1\n\t\t\t\t\treturn unpackRGBAToDepth( texture2D( depthTex, screenPosition ) );\n\t\t\t\t#else\n\t\t\t\t\treturn texture2D( depthTex, screenPosition ).r;\n\t\t\t\t#endif\n\t\t\t}\n\t\t\tfloat getLinearDepth(vec2 coord) {\n\t\t\t\tfloat depth = getDepth(coord) * 2.0 - 1.0;\n\t\t\t\treturn projection[3][2] / (depth * projection[2][3] - projection[2][2]);\n\t\t\t}\n\t\t#endif\n\n\t\tvoid main() {\n\t\t\t// float kernel[5];\n\t\t\t// kernel[0] = 0.122581;\n\t\t\t// kernel[1] = 0.233062;\n\t\t\t// kernel[2] = 0.288713;\n\t\t\t// kernel[3] = 0.233062;\n\t\t\t// kernel[4] = 0.122581;\n\n\t\t\tvec2 off = vec2(0.0);\n\t\t\tif (direction == 0) {\n\t\t\t\toff[0] = blurSize / textureSize.x;\n\t\t\t} else {\n\t\t\t\toff[1] = blurSize / textureSize.y;\n\t\t\t}\n\n\t\t\tvec4 sum = vec4(0.0);\n\t\t\tfloat weightAll = 0.0;\n\n\t\t\t#if NORMALTEX_ENABLED == 1\n\t\t\t\tvec3 centerNormal = getViewNormal(v_Uv);\n\t\t\t#endif\n\t\t\t#if DEPTHTEX_ENABLED == 1\n\t\t\t\tfloat centerDepth = getLinearDepth(v_Uv);\n\t\t\t#endif\n\n\t\t\tfor (int i = 0; i < KERNEL_SIZE_INT; i++) {\n\t\t\t\tvec2 coord = clamp(v_Uv + vec2(float(i) - (KERNEL_SIZE_FLOAT - 1.) / 2.) * off, vec2(0.0), vec2(1.0));\n\t\t\t\tfloat w = kernel[i];\n\n\t\t\t\t#if NORMALTEX_ENABLED == 1\n\t\t\t\t\tvec3 normal = getViewNormal(coord);\n\t\t\t\t\tw *= clamp(dot(normal, centerNormal), 0.0, 1.0);\n\t\t\t\t#endif\n\t\t\t\t#if DEPTHTEX_ENABLED == 1\n\t\t\t\t\tfloat d = getLinearDepth(coord);\n\t\t\t\t\t// PENDING Better equation?\n\t\t\t\t\t// w *= (1.0 - smoothstep(abs(centerDepth - d) / depthRange, 0.0, 1.0));\n\t\t\t\t\tw *= (1.0 - smoothstep(0.0, 1.0, abs(centerDepth - d) / depthRange));\n\t\t\t\t#endif\n\n\t\t\t\tweightAll += w;\n\t\t\t\tsum += w * texture2D(tDiffuse, coord);\n\t\t\t}\n\n\t\t\tgl_FragColor = sum / weightAll;\n\t\t}\n\t`\n};\n\nexport { BlurShader };"
  },
  {
    "path": "examples/jsm/shaders/BokehShader.js",
    "content": "/**\n * Bokeh Shader\n */\nconst BokehShader = {\n\tname: 'bokeh',\n\n\tdefines: {\n\t\t'RINGS': 3,\n\t\t'SAMPLES': 4\n\t},\n\n\tuniforms: {\n\t\t'tColor': null,\n\t\t'tDepth': null,\n\n\t\t'znear': 0.1,\n\t\t'zfar': 100,\n\n\t\t'focalDepth': 1.0,\n\t\t'focalLength': 24,\n\t\t'fstop': 0.9,\n\n\t\t'maxblur': 1.0,\n\t\t'threshold': 0.5,\n\t\t'gain': 2.0,\n\t\t'bias': 0.5,\n\n\t\t'dithering': 0.0001\n\t},\n\n\tvertexShader: `\n\t\tattribute vec3 a_Position;\n\t\tattribute vec2 a_Uv;\n\n\t\tuniform mat4 u_ProjectionView;\n\t\tuniform mat4 u_Model;\n\n\t\tvarying vec2 v_Uv;\n\n\t\tvoid main() {\n\t\t\tv_Uv = a_Uv;\n\t\t\tgl_Position = u_ProjectionView * u_Model * vec4(a_Position, 1.0);\n\t\t}\n\t`,\n\n\tfragmentShader: `\n\t\tvarying vec2 v_Uv;\n\n\t\tuniform sampler2D tColor;\n\t\tuniform sampler2D tDepth;\n\n\t\tuniform vec2 u_RenderTargetSize;\n\n\t\tuniform float znear;\n\t\tuniform float zfar;\n\n\t\tuniform float focalDepth;\n\t\tuniform float focalLength;\n\t\tuniform float fstop;\n\n\t\tuniform float maxblur; // clamp value of max blur (0.0 = no blur, 1.0 default)\n\t\tuniform float threshold; // highlight threshold\n\t\tuniform float gain; // highlight gain\n\t\tuniform float bias; // bokeh edge bias\n\t\tuniform float dithering;\n\n\t\tconst int samples = SAMPLES;\n\t\tconst int rings = RINGS;\n\t\tconst int maxringsamples = rings * samples;\n\n\t\tfloat CoC = 0.03; // circle of confusion size in mm (35mm film = 0.03mm)\n\n\t\tvec3 color(vec2 coords, float blur) {\n\t\t    vec3 col = texture2D(tColor, coords).rgb;\n\t\t    vec3 lumcoeff = vec3(0.299,0.587,0.114);\n\t\t    float lum = dot(col.rgb, lumcoeff);\n\t\t    float thresh = max((lum - threshold) * gain, 0.0);\n\t\t    return col + mix(vec3(0.0), col, thresh * blur);\n\t\t}\n\n\t\tfloat linearize(float depth) {\n\t\t    return -zfar * znear / (depth * (zfar - znear) - zfar);\n\t\t}\n\n\t\tfloat gather(float i, float j, int ringsamples, inout vec3 col, float w, float h, float blur) {\n\t\t\tfloat rings2 = float(rings);\n\t\t\tfloat step = PI * 2.0 / float(ringsamples);\n\t\t\tfloat pw = cos(j * step) * i;\n\t\t\tfloat ph = sin(j * step) * i;\n\t\t\tcol += color(v_Uv + vec2(pw * w, ph * h), blur) * mix(1.0, i / rings2, bias);\n\t\t\treturn mix(1.0, i / rings2, bias);\n\t\t}\n\n\t\tvoid main() {\n\t\t\tfloat depth = linearize(texture2D(tDepth, v_Uv).x);\n\t\t\tfloat fDepth = focalDepth;\n\n\t\t\t// dof blur factor calculation\n\n\t\t\tfloat f = focalLength; // focal length in mm\n\t\t\tfloat d = fDepth * 1000.; // focal plane in mm\n\t\t\tfloat o = depth * 1000.; // depth in mm\n\n\t\t\tfloat a = (o * f) / (o - f);\n\t\t\tfloat b = (d * f) / (d - f);\n\t\t\tfloat c = (d - f) / (d * fstop * CoC);\n\n\t\t\tfloat blur = abs(a - b) * c;\n\t\t\tblur = clamp(blur, 0.0, 1.0);\n\n\t\t\t// calculation of pattern for dithering\n\n\t\t\tvec2 noise = vec2(rand(v_Uv), rand(v_Uv + vec2(0.4, 0.6))) * dithering * blur;\n\n\t\t\t// getting blur x and y step factor\n\n\t\t\tvec2 pixelSize = 1.0 / u_RenderTargetSize;\n\t\t\tfloat w = pixelSize.x * blur * maxblur + noise.x;\n\t\t\tfloat h = pixelSize.y * blur * maxblur + noise.y;\n\n\t\t\t// calculation of final color\n\n\t\t\tvec3 col = vec3(0.0);\n\n\t\t\tif (blur < 0.05) {\n\t\t\t\tcol = texture2D(tColor, v_Uv).rgb;\n\t\t\t} else {\n\t\t\t\tcol = texture2D(tColor, v_Uv).rgb;\n\n\t\t\t\tfloat s = 1.0;\n\t\t\t\tint ringsamples;\n\n\t\t\t\tfor(int i = 1; i <= rings; i++) {\n\t\t\t\t\tringsamples = i * samples;\n\n\t\t\t\t\tfor (int j = 0; j < maxringsamples; j++) {\n\t\t\t\t\t\tif (j >= ringsamples) break;\n\t\t\t\t\t\ts += gather(float(i), float(j), ringsamples, col, w, h, blur);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tcol /= s; // divide by sample count\n\t\t\t}\n\n\t\t\tgl_FragColor = vec4(col, 1.0);\n\t\t}\n\t`\n};\n\nexport { BokehShader };"
  },
  {
    "path": "examples/jsm/shaders/ClusteredDebugShader.js",
    "content": "const ClusteredDebugShader = {\n\tname: 'clustered_debug',\n\n\tvertexShader: `\n\t\t#include <common_vert>\n\t\t#include <morphtarget_pars_vert>\n\t\t#include <skinning_pars_vert>\n\t\t#include <modelPos_pars_vert>\n\t\t#include <logdepthbuf_pars_vert>\n\t\tvoid main() {\n\t\t\t#include <begin_vert>\n\t\t\t#include <morphtarget_vert>\n\t\t\t#include <skinning_vert>\n\t\t\t#include <pvm_vert>\n\t\t\t#include <logdepthbuf_vert>\n\t\t\t#include <modelPos_vert>\n\t\t}\n\t`,\n\n\tfragmentShader: `\n\t\t#include <common_frag>\n\n\t\t#include <modelPos_pars_frag>\n\n\t\t#include <logdepthbuf_pars_frag>\n\t\t#include <clippingPlanes_pars_frag>\n\n\t\t#include <light_pars_frag>\n\n\t\tvoid main() {\n\t\t\t#include <clippingPlanes_frag>\n\t\t\t#include <logdepthbuf_frag>\n\n\t\t\tgl_FragColor = vec4(0.0, 0.0, 0.0, 1.0);\n\n\t\t\t#ifdef USE_CLUSTERED_LIGHTS\n\t\t\t\tvec4 positionView = u_View * vec4(v_modelPos, 1.0);\n\n\t\t\t\tfloat perspectiveFactor = step(0.0, cellsTransformFactors.z);\n\t\t\t\tfloat halfFrustumHeight = -cellsTransformFactors.z * mix(1.0, positionView.z, perspectiveFactor);\n\t\t\t\tfloat halfFrustumWidth = halfFrustumHeight * cellsTransformFactors.w;\n\n\t\t\t\tvec3 cellCoords;\n\t\t\t\tcellCoords.z = floor(log(-positionView.z) * cellsTransformFactors.x + cellsTransformFactors.y);\n\t\t\t\tcellCoords.y = floor((positionView.y / (2.0 * halfFrustumHeight) + 0.5) * cells.y);\n\t\t\t\tcellCoords.x = floor((positionView.x / (2.0 * halfFrustumWidth) + 0.5) * cells.x);\n\n\t\t\t\tif(!(any(lessThan(cellCoords, vec3(0.0))) || any(greaterThanEqual(cellCoords, cells)))) {\n\t\t\t\t\tfloat cellIndex = dot(cellsDotData, cellCoords);\n\t\t\t\t\tfloat clusterV = floor(cellIndex * cellsTextureSize.y);\n\t\t\t\t\tfloat clusterU = cellIndex - (clusterV * cellsTextureSize.x);\n\n\t\t\t\t\tint size = textureSize(lightsTexture, 0).x;\n\n\t\t\t\t\tClusteredPointLight clusteredPointLight;\n\t\t\t\t\tClusteredSpotLight clusteredSpotLight;\n\n\t\t\t\t\tvec3 clusteredLightColor;\n\t\t\t\t\tfloat clusteredLightDistance;\n\t\t\t\t\tfloat clusteredAngleCos;\n\n\t\t\t\t\tvec3 debugColor = vec3(0.0);\n\n\t\t\t\t\tfor (int lightCellIndex = 0; lightCellIndex < maxLightsPerCell; lightCellIndex++) {\n\t\t\t\t\t\tfloat lightIndex = texelFetch(cellsTexture, ivec2(int(clusterU) + lightCellIndex, clusterV), 0).x;\n\n\t\t\t\t\t\tif (lightIndex <= 0.0) break;\n\n\t\t\t\t\t\tdebugColor = mix(vec3(0., 0., 1.), vec3(1., 0., 0.), float(lightCellIndex + 1) / float(maxLightsPerCell));\n\t\t\t\t\t}\n\n\t\t\t\t\tgl_FragColor = vec4(debugColor, 1.0);\n\t\t\t\t}\n\t\t\t#endif\n\t\t}\n\t`\n};\n\nexport { ClusteredDebugShader };"
  },
  {
    "path": "examples/jsm/shaders/ColorAdjustShader.js",
    "content": "/**\n * Color Adjust Shader\n */\nconst ColorAdjustShader = {\n\tname: 'color_adjust',\n\n\tuniforms: {\n\t\t'tDiffuse': null,\n\t\t'brightness': 0.0,\n\t\t'contrast': 1.0,\n\t\t'exposure': 0.0,\n\t\t'gamma': 1.0,\n\t\t'saturation': 1.0\n\t},\n\n\tvertexShader: `\n\t\tattribute vec3 a_Position;\n\t\tattribute vec2 a_Uv;\n\n\t\tuniform mat4 u_ProjectionView;\n\t\tuniform mat4 u_Model;\n\n\t\tvarying vec2 v_Uv;\n\n\t\tvoid main() {\n\t\t\tv_Uv = a_Uv;\n\t\t\tgl_Position = u_ProjectionView * u_Model * vec4(a_Position, 1.0);\n\t\t}\n\t`,\n\n\tfragmentShader: `\n\t\tuniform float brightness;\n\t\tuniform float contrast;\n\t\tuniform float exposure;\n\t\tuniform float gamma;\n\t\tuniform float saturation;\n\n\t\tuniform sampler2D tDiffuse;\n\n\t\tvarying vec2 v_Uv;\n\n\t\t// Values from \"Graphics Shaders: Theory and Practice\" by Bailey and Cunningham\n\t\tconst vec3 w = vec3(0.2125, 0.7154, 0.0721);\n\n\t\tvoid main() {\n\t\t\tvec4 tex = texture2D(tDiffuse, v_Uv);\n\n\t\t\t// brightness\n\t\t\tvec3 color = clamp(tex.rgb + vec3(brightness), 0.0, 1.0);\n\t\t\t// contrast\n\t\t\tcolor = clamp((color-vec3(0.5)) * contrast+vec3(0.5), 0.0, 1.0);\n\t\t\t// exposure\n\t\t\tcolor = clamp(color * pow(2.0, exposure), 0.0, 1.0);\n\t\t\t// gamma\n\t\t\tcolor = clamp(pow(color, vec3(gamma)), 0.0, 1.0);\n\t\t\t// saturation\n\t\t\tfloat luminance = dot(color, w);\n\t\t\tcolor = mix(vec3(luminance), color, saturation);\n\n\t\t\tgl_FragColor = vec4(color, tex.a);\n\t\t}\n\t`\n};\n\nexport { ColorAdjustShader };"
  },
  {
    "path": "examples/jsm/shaders/CopyShader.js",
    "content": "/**\n * Copy Shader\n */\nconst CopyShader = {\n\tname: 'copy',\n\n\tuniforms: {\n\t\t'tDiffuse': null,\n\t\t'opacity': 1.0\n\t},\n\n\tvertexShader: `\n\t\tattribute vec3 a_Position;\n\t\tattribute vec2 a_Uv;\n\n\t\tuniform mat4 u_ProjectionView;\n\t\tuniform mat4 u_Model;\n\n\t\tvarying vec2 v_Uv;\n\n\t\tvoid main() {\n\t\t\tv_Uv = a_Uv;\n\t\t\tgl_Position = u_ProjectionView * u_Model * vec4(a_Position, 1.0);\n\t\t}\n\t`,\n\n\tfragmentShader: `\n\t\tuniform float opacity;\n\n\t\tuniform sampler2D tDiffuse;\n\n\t\tvarying vec2 v_Uv;\n\n\t\tvoid main() {\n\t\t\tvec4 texel = texture2D(tDiffuse, v_Uv);\n\t\t\tgl_FragColor = opacity * texel;\n\t\t}\n\t`\n};\n\nexport { CopyShader };"
  },
  {
    "path": "examples/jsm/shaders/DeferredShader.js",
    "content": "/**\n * shaders for deferred renderer\n */\nconst DeferredShaderChunk = {\n\n\tpackVector3: `\n\t\tfloat vec3_to_float(vec3 data) {\n\t\t\tconst float unit = 254.0 / 256.0; // todo 255.0 / 256.0 error, why ?\n\t\t\thighp float compressed = fract(data.x * unit) + floor(data.y * unit * 255.0) + floor(data.z * unit * 255.0) * 255.0;\n\t\t\treturn compressed;\n\t\t}\n\t`,\n\n\tunpackFloat: `\n\t\tvec3 float_to_vec3(float data) {\n\t\t\tconst float unit = 255.0;\n\t\t\tvec3 uncompressed;\n\t\t\tuncompressed.x = fract(data);\n\t\t\tfloat zInt = floor(data / unit);\n\t\t\tuncompressed.z = fract(zInt / unit);\n\t\t\tuncompressed.y = fract(floor(data - (zInt * unit)) / unit);\n\t\t\treturn uncompressed;\n\t\t}\n\t`,\n\n\t// Refer to http://aras-p.info/texts/CompactNormalStorage.html\n\tpackNormal: `\n\t\tvec2 normal_to_vec2(vec3 normal) {\n\t\t\treturn normal.xy / sqrt(normal.z * 8.0 + 8.0) + 0.5;\n\t\t}\n\t`,\n\n\tunpackVector2: `\n\t\tvec3 vec2_to_normal(vec2 data) {\n\t\t\tvec2 fenc = data * 4.0 - 2.0;\n\t\t\tfloat f = dot(fenc, fenc);\n\t\t\tfloat g = sqrt(1.0 - f / 4.0);\n\t\t\tvec3 normal;\n\t\t\tnormal.xy = fenc * g;\n\t\t\tnormal.z = 1.0 - f / 2.0;\n\t\t\treturn normal;\n\t\t}\n\t`,\n\n\tcomputeTextureCoord: `\n\t\tvec2 texCoord = gl_FragCoord.xy / vec2(viewWidth, viewHeight);\n\t`,\n\n\tpackNormalDepth: `\n\t\tvec4 packedNormalDepth;\n\t\tpackedNormalDepth.xyz = normal * 0.5 + 0.5;\n\t\tpackedNormalDepth.w = position.z / position.w;\n\t`,\n\n\tunpackNormalDepth: `\n\t\tvec4 normalDepthMap = texture2D(samplerNormalDepth, texCoord);\n\t\tfloat depth = normalDepthMap.w;\n\n\t\tif (depth == 0.0) discard;\n\n\t\tvec3 normal = normalDepthMap.xyz * 2.0 - 1.0;\n\t`,\n\n\tpackNormalDepthShininess: `\n\t\tvec4 packedNormalDepthShininess;\n\t\tpackedNormalDepthShininess.xy = normal_to_vec2(normal);\n\t\tpackedNormalDepthShininess.z = shininess;\n\t\tpackedNormalDepthShininess.w = position.z / position.w;\n\t`,\n\n\tunpackNormalDepthShininess: `\n\t\tvec4 normalDepthMap = texture2D(samplerNormalDepthShininess, texCoord);\n\t\tfloat depth = normalDepthMap.w;\n\n\t\tif (depth == 0.0) discard;\n\n\t\tvec3 normal = vec2_to_normal(normalDepthMap.xy);\n\t\tfloat shininess = normalDepthMap.z;\n\t`,\n\n\tpackColor: `\n\t\tvec4 packedColor;\n\t\tpackedColor.x = vec3_to_float(diffuseColor.rgb);\n\t\tpackedColor.y = vec3_to_float(emissiveColor);\n\t\tpackedColor.z = vec3_to_float(specularColor);\n\t\tpackedColor.w = shininess;\n\t`,\n\n\tunpackColor: `\n\t\tvec4 colorMap = texture2D(samplerColor, texCoord);\n\t\tvec3 diffuseColor = float_to_vec3(colorMap.x);\n\t\tvec3 emissiveColor = float_to_vec3(colorMap.y);\n\t\tvec3 specularColor = float_to_vec3(colorMap.z);\n\t\tfloat shininess = colorMap.w;\n\t`,\n\n\tpackLight: `\n\t\tvec4 packedLight;\n\t\tpackedLight.xyz = lightIntensity * PI * lightColor * max(dot(lightVector, normal), 0.0) * attenuation;\n\t\tpackedLight.w = lightIntensity * PI * specular * max(dot(lightVector, normal), 0.0);\n\t`,\n\n\tcomputeVertexPositionVS: `\n\t\tvec2 xy = texCoord * 2.0 - 1.0;\n\t\tvec4 vertexPositionProjected = vec4(xy, depth, 1.0);\n\t\tvec4 vertexPositionVS = matProjViewInverse * vertexPositionProjected;\n\t\tvertexPositionVS.xyz /= vertexPositionVS.w;\n\t\tvertexPositionVS.w = 1.0;\n\t`,\n\n\t// TODO: calculate schlick\n\tcomputeSpecular: `\n\t\tvec3 halfVector = normalize(lightVector + viewVector);\n\t\tfloat dotNormalHalf = max(dot(normal, halfVector), 0.0);\n\t\tfloat specular = D_BlinnPhong(shininess, dotNormalHalf);\n\t`,\n\n\tcombine: `\n\t\tgl_FragColor = vec4(lightIntensity * PI * lightColor * max(dot(lightVector, normal), 0.0) * (diffuseColor + specular * specularColor) * attenuation, 1.0);\n\t`\n\n};\n\nconst DeferredShader = {\n\n\t// rgb: normal, a: depth\n\tnormalDepth: {\n\t\tname: 'deferred_normaldepth',\n\n\t\tvertexShader: `\n\t\t\t#include <common_vert>\n\t\t\t#include <morphtarget_pars_vert>\n\t\t\t#include <skinning_pars_vert>\n\t\t\t#include <normal_pars_vert>\n\t\t\t#include <uv_pars_vert>\n\t\t\tvarying vec4 vPosition;\n\t\t\tvoid main() {\n\t\t\t\t#include <uv_vert>\n\t\t\t\t#include <begin_vert>\n\t\t\t\t#include <morphtarget_vert>\n\t\t\t\t#include <morphnormal_vert>\n\t\t\t\t#include <skinning_vert>\n\t\t\t\t#include <skinnormal_vert>\n\t\t\t\t#include <normal_vert>\n\t\t\t\t#include <pvm_vert>\n\t\t\t\tvPosition = gl_Position;\n\t\t\t}\n\t\t`,\n\n\t\tfragmentShader: `\n\t\t\t#include <common_frag>\n\t\t\t#include <diffuseMap_pars_frag>\n\t\t\t#include <alphaTest_pars_frag>\n\n\t\t\t#include <uv_pars_frag>\n\n\t\t\t#include <packing>\n\t\t\t#include <normal_pars_frag>\n\n\t\t\tvarying vec4 vPosition;\n\n\t\t\tvoid main() {\n\t\t\t\t#if defined(USE_DIFFUSE_MAP) && defined(ALPHATEST)\n\t\t\t\t\tvec4 texelColor = texture2D(diffuseMap, v_Uv);\n\t\t\t\t\tfloat alpha = texelColor.a * u_Opacity;\n\t\t\t\t\tif(alpha < u_AlphaTest) discard;\n\t\t\t\t#endif\n\n\t\t\t\tvec3 normal = normalize(v_Normal);\n\t\t\t\tvec4 position = vPosition;\n\n\t\t\t\t${DeferredShaderChunk.packNormalDepth}\n\n\t\t\t\tgl_FragColor = packedNormalDepth;\n\t\t\t}\n\t\t`\n\t},\n\n\t// r: diffuse, g: emissive, b: speculer, a: shininess\n\tcolor: {\n\t\tname: 'deferred_color',\n\n\t\tuniforms: {\n\t\t\tspecular: [1, 1, 1],\n\t\t\tshininess: 30\n\t\t},\n\n\t\tvertexShader: `\n\t\t\t#include <common_vert>\n\t\t\t#include <uv_pars_vert>\n\t\t\t#include <color_pars_vert>\n\t\t\t#include <diffuseMap_pars_vert>\n\t\t\t#include <envMap_pars_vert>\n\t\t\t#include <skinning_pars_vert>\n\t\t\tvoid main() {\n\t\t\t\t#include <begin_vert>\n\t\t\t\t#include <skinning_vert>\n\t\t\t\t#include <pvm_vert>\n\t\t\t\t#include <uv_vert>\n\t\t\t\t#include <color_vert>\n\t\t\t\t#include <diffuseMap_vert>\n\t\t\t}\n\t\t`,\n\n\t\tfragmentShader: `\n\t\t\tuniform vec3 u_Color;\n\t\t\tuniform vec3 emissive;\n\t\t\tuniform vec3 specular;\n\t\t\tuniform float shininess;\n\n\t\t\t#include <uv_pars_frag>\n\t\t\t#include <diffuseMap_pars_frag>\n\n\t\t\t${DeferredShaderChunk.packVector3}\n\n\t\t\tvoid main() {\n\t\t\t\tvec4 outColor = vec4(u_Color, 1.0);\n\t\t\t\t#include <diffuseMap_frag>\n\t\t\t\tvec4 diffuseColor = outColor;\n\t\t\t\tvec3 emissiveColor = emissive;\n\t\t\t\tvec3 specularColor = specular;\n\n\t\t\t\t${DeferredShaderChunk.packColor}\n\n\t\t\t\tgl_FragColor = packedColor;\n\t\t\t}\n\t\t`\n\t},\n\n\temissiveLight: {\n\t\tname: 'deferred_emissivelight',\n\n\t\tuniforms: {\n\t\t\tsamplerColor: null,\n\n\t\t\tviewWidth: 800,\n\t\t\tviewHeight: 600\n\t\t},\n\n\t\tvertexShader: `\n\t\t\tattribute vec3 a_Position;\n\n\t\t\tuniform mat4 u_ProjectionView;\n\t\t\tuniform mat4 u_Model;\n\n\t\t\tvoid main() {\n\t\t\t\tgl_Position = u_ProjectionView * u_Model * vec4(a_Position, 1.0);\n\t\t\t}\n\t\t`,\n\n\t\tfragmentShader: `\n\t\t\tuniform sampler2D samplerColor;\n\n\t\t\tuniform float viewHeight;\n\t\t\tuniform float viewWidth;\n\n\t\t\t${DeferredShaderChunk.unpackFloat}\n\n\t\t\tvoid main() {\n\t\t\t\t${DeferredShaderChunk.computeTextureCoord}\n\t\t\t\t${DeferredShaderChunk.unpackColor}\n\n\t\t\t\tgl_FragColor = vec4(emissiveColor, 1.0);\n\t\t\t}\n\t\t`\n\t},\n\n\tdirectionalLight: {\n\t\tname: 'deferred_directionallight',\n\n\t\tdefines: {\n\t\t\t'SHADOW': 0\n\t\t},\n\n\t\tuniforms: {\n\t\t\tsamplerNormalDepth: null,\n\t\t\tsamplerColor: null,\n\n\t\t\tlightColor: [0, 0, 0],\n\t\t\tlightDirectionVS: [0, 1, 0],\n\t\t\tlightIntensity: 1,\n\n\t\t\tshadowMatrix: new Float32Array(16),\n\t\t\tshadowMap: null,\n\t\t\tshadowBias: 0,\n\t\t\tshadowRadius: 1,\n\t\t\tshadowMapSize: [1024, 1024],\n\n\t\t\tviewWidth: 800,\n\t\t\tviewHeight: 600,\n\n\t\t\tmatProjViewInverse: new Float32Array(16),\n\t\t\tcameraPos: [0, 0, 0]\n\t\t},\n\n\t\tvertexShader: `\n\t\t\tattribute vec3 a_Position;\n\n\t\t\tuniform mat4 u_ProjectionView;\n\t\t\tuniform mat4 u_Model;\n\n\t\t\tvoid main() {\n\t\t\t\tgl_Position = u_ProjectionView * u_Model * vec4(a_Position, 1.0);\n\t\t\t}\n\t\t`,\n\n\t\tfragmentShader: `\n\t\t\t#include <bsdfs>\n\n\t\t\tuniform sampler2D samplerNormalDepth;\n\t\t\tuniform sampler2D samplerColor;\n\n\t\t\tuniform float viewHeight;\n\t\t\tuniform float viewWidth;\n\n\t\t\tuniform vec3 lightColor;\n\t\t\tuniform vec3 lightDirectionVS;\n\t\t\tuniform float lightIntensity;\n\n\t\t\t#if SHADOW == 1\n\t\t\t\tuniform sampler2D shadowMap;\n\t\t\t\tuniform mat4 shadowMatrix;\n\n\t\t\t\tuniform float shadowBias;\n\t\t\t\tuniform float shadowRadius;\n\t\t\t\tuniform vec2 shadowMapSize;\n\n\t\t\t\t#include <packing>\n\t\t\t\t#include <shadow>\n\t\t\t#endif\n\n\t\t\tuniform mat4 matProjViewInverse;\n\t\t\tuniform vec3 cameraPos;\n\n\t\t\t${DeferredShaderChunk.unpackFloat}\n\n\t\t\tvoid main() {\n\t\t\t\t${DeferredShaderChunk.computeTextureCoord}\n\t\t\t\t${DeferredShaderChunk.unpackNormalDepth}\n\t\t\t\t${DeferredShaderChunk.computeVertexPositionVS}\n\t\t\t\t${DeferredShaderChunk.unpackColor}\n\n\t\t\t\tvec3 lightVector = normalize(lightDirectionVS);\n\t\t\t\tvec3 viewVector = normalize(cameraPos - vertexPositionVS.xyz);\n\n\t\t\t\t${DeferredShaderChunk.computeSpecular}\n\n\t\t\t\tfloat attenuation = 1.0 / PI;\n\n\t\t\t\t#if SHADOW == 1\n\t\t\t\t\tattenuation *= getShadow(shadowMap, shadowMatrix * vertexPositionVS, shadowMapSize, vec2(shadowBias, 0.), vec2(shadowRadius, 0.));\n\t\t\t\t#endif\n\n\t\t\t\t${DeferredShaderChunk.combine}\n\t\t\t}\n\t\t`\n\t},\n\n\tpointLight: {\n\t\tname: 'deferred_pointlight',\n\n\t\tdefines: {\n\t\t\t'SHADOW': 0\n\t\t},\n\n\t\tuniforms: {\n\t\t\tsamplerNormalDepth: null,\n\t\t\tsamplerColor: null,\n\n\t\t\tlightColor: [0, 0, 0],\n\t\t\tlightPositionVS: [0, 1, 0],\n\t\t\tlightRadius: 1,\n\t\t\tlightDecay: 1,\n\t\t\tlightIntensity: 1,\n\n\t\t\tshadowMap: null,\n\t\t\tshadowBias: 0,\n\t\t\tshadowRadius: 1,\n\t\t\tshadowMapSize: [1024, 1024],\n\t\t\tshadowCameraNear: 1,\n\t\t\tshadowCameraFar: 100,\n\n\t\t\tviewWidth: 800,\n\t\t\tviewHeight: 600,\n\n\t\t\tmatProjViewInverse: new Float32Array(16),\n\t\t\tcameraPos: [0, 0, 0]\n\t\t},\n\n\t\tvertexShader: `\n\t\t\tattribute vec3 a_Position;\n\n\t\t\tuniform mat4 u_ProjectionView;\n\t\t\tuniform mat4 u_Model;\n\n\t\t\tvoid main() {\n\t\t\t\tgl_Position = u_ProjectionView * u_Model * vec4(a_Position, 1.0);\n\t\t\t}\n\t\t`,\n\n\t\tfragmentShader: `\n\t\t\t#include <bsdfs>\n\n\t\t\tuniform sampler2D samplerNormalDepth;\n\t\t\tuniform sampler2D samplerColor;\n\n\t\t\tuniform float viewHeight;\n\t\t\tuniform float viewWidth;\n\n\t\t\tuniform vec3 lightColor;\n\t\t\tuniform vec3 lightPositionVS;\n\t\t\tuniform float lightRadius;\n\t\t\tuniform float lightDecay;\n\t\t\tuniform float lightIntensity;\n\n\t\t\t#if SHADOW == 1\n\t\t\t\tuniform samplerCube shadowMap;\n\n\t\t\t\tuniform float shadowBias;\n\t\t\t\tuniform float shadowRadius;\n\t\t\t\tuniform vec2 shadowMapSize;\n\n\t\t\t\tuniform float shadowCameraNear;\n\t\t\t\tuniform float shadowCameraFar;\n\n\t\t\t\t#include <packing>\n\t\t\t\t#include <shadow>\n\t\t\t#endif\n\n\t\t\tuniform mat4 matProjViewInverse;\n\t\t\tuniform vec3 cameraPos;\n\n\t\t\t${DeferredShaderChunk.unpackFloat}\n\n\t\t\tvoid main() {\n\t\t\t\t${DeferredShaderChunk.computeTextureCoord}\n\t\t\t\t${DeferredShaderChunk.unpackNormalDepth}\n\t\t\t\t${DeferredShaderChunk.computeVertexPositionVS}\n\n\t\t\t\tvec3 lightVector = lightPositionVS - vertexPositionVS.xyz;\n\t\t\t\tfloat distance = length(lightVector);\n\n\t\t\t\tif (distance > lightRadius) discard;\n\n\t\t\t\tlightVector = normalize(lightVector);\n\t\t\t\tvec3 viewVector = normalize(cameraPos - vertexPositionVS.xyz);\n\n\t\t\t\t${DeferredShaderChunk.unpackColor}\n\t\t\t\t${DeferredShaderChunk.computeSpecular}\n\n\t\t\t\tfloat attenuation = pow(clamp(1. - distance / lightRadius, 0.0, 1.0), lightDecay) / PI;\n\n\t\t\t\t#if SHADOW == 1\n\t\t\t\t\tattenuation *= getPointShadow(shadowMap, vec4(vertexPositionVS.xyz - lightPositionVS, 1.0), shadowMapSize, vec2(shadowBias, 0.), vec2(shadowRadius, 0.), vec2(shadowCameraNear, shadowCameraFar));\n\t\t\t\t#endif\n\n\t\t\t\t${DeferredShaderChunk.combine}\n\t\t\t}\n\t\t`\n\t},\n\n\tspotLight: {\n\t\tname: 'deferred_spotlight',\n\n\t\tdefines: {\n\t\t\t'SHADOW': 0\n\t\t},\n\n\t\tuniforms: {\n\t\t\tsamplerNormalDepth: null,\n\t\t\tsamplerColor: null,\n\n\t\t\tlightColor: [0, 0, 0],\n\t\t\tlightDirectionVS: [0, 1, 0],\n\t\t\tlightPositionVS: [0, 0, 0],\n\t\t\tlightConeCos: 1,\n\t\t\tlightPenumbraCos: 1,\n\t\t\tlightRadius: 1,\n\t\t\tlightDecay: 1,\n\t\t\tlightIntensity: 1,\n\n\t\t\tshadowMatrix: new Float32Array(16),\n\t\t\tshadowMap: null,\n\t\t\tshadowBias: 0,\n\t\t\tshadowRadius: 1,\n\t\t\tshadowMapSize: [1024, 1024],\n\n\t\t\tviewWidth: 800,\n\t\t\tviewHeight: 600,\n\n\t\t\tmatProjViewInverse: new Float32Array(16),\n\t\t\tcameraPos: [0, 0, 0]\n\t\t},\n\n\t\tvertexShader: `\n\t\t\tattribute vec3 a_Position;\n\n\t\t\tuniform mat4 u_ProjectionView;\n\t\t\tuniform mat4 u_Model;\n\n\t\t\tvoid main() {\n\t\t\t\tgl_Position = u_ProjectionView * u_Model * vec4(a_Position, 1.0);\n\t\t\t}\n\t\t`,\n\n\t\tfragmentShader: `\n\t\t\t#include <bsdfs>\n\n\t\t\tuniform sampler2D samplerNormalDepth;\n\t\t\tuniform sampler2D samplerColor;\n\n\t\t\tuniform float viewHeight;\n\t\t\tuniform float viewWidth;\n\n\t\t\tuniform vec3 lightColor;\n\t\t\tuniform vec3 lightPositionVS;\n\t\t\tuniform vec3 lightDirectionVS;\n\t\t\tuniform float lightConeCos;\n\t\t\tuniform float lightPenumbraCos;\n\t\t\tuniform float lightRadius;\n\t\t\tuniform float lightDecay;\n\t\t\tuniform float lightIntensity;\n\n\t\t\t#if SHADOW == 1\n\t\t\t\tuniform sampler2D shadowMap;\n\t\t\t\tuniform mat4 shadowMatrix;\n\n\t\t\t\tuniform float shadowBias;\n\t\t\t\tuniform float shadowRadius;\n\t\t\t\tuniform vec2 shadowMapSize;\n\n\t\t\t\t#include <packing>\n\t\t\t\t#include <shadow>\n\t\t\t#endif\n\n\t\t\tuniform mat4 matProjViewInverse;\n\t\t\tuniform vec3 cameraPos;\n\n\t\t\t${DeferredShaderChunk.unpackFloat}\n\n\t\t\tvoid main() {\n\t\t\t\t${DeferredShaderChunk.computeTextureCoord}\n\t\t\t\t${DeferredShaderChunk.unpackNormalDepth}\n\t\t\t\t${DeferredShaderChunk.computeVertexPositionVS}\n\t\t\t\t${DeferredShaderChunk.unpackColor}\n\n\t\t\t\tvec3 lightVector = lightPositionVS.xyz - vertexPositionVS.xyz;\n\t\t\t\tfloat distance = length( lightVector );\n\n\t\t\t\tlightVector = normalize( lightVector );\n\n\t\t\t\tfloat angleCos = dot( lightDirectionVS, lightVector );\n\n\t\t\t\tif ( angleCos <= lightConeCos ) discard;\n\t\t\t\tif ( distance > lightRadius ) discard;\n\n\t\t\t\tfloat spotEffect = smoothstep( lightConeCos, lightPenumbraCos, angleCos );\n\t\t\t\tfloat dist = pow(clamp(1. - distance / lightRadius, 0.0, 1.0), lightDecay);\n\n\t\t\t\tfloat spot = dist * spotEffect;\n\n\t\t\t\tdiffuseColor *= spot;\n\t\t\t\tvec3 viewVector = normalize( cameraPos - vertexPositionVS.xyz );\n\n\t\t\t\t${DeferredShaderChunk.computeSpecular}\n\n\t\t\t\tfloat attenuation = 1.0 / PI;\n\n\t\t\t\t#if SHADOW == 1\n\t\t\t\t\tattenuation *= getShadow(shadowMap, shadowMatrix * vertexPositionVS, shadowMapSize, vec2(shadowBias, 0.), vec2(shadowRadius, 0.));\n\t\t\t\t#endif\n\n\t\t\t\t${DeferredShaderChunk.combine}\n\t\t\t}\n\t\t`\n\t},\n\n\tnormalDepthShininess: {\n\t\tname: 'deferred_normaldepthshininess',\n\n\t\tuniforms: {\n\t\t\tshininess: 30\n\t\t},\n\n\t\tvertexShader: `\n\t\t\t#include <common_vert>\n\t\t\t#include <morphtarget_pars_vert>\n\t\t\t#include <skinning_pars_vert>\n\t\t\t#include <normal_pars_vert>\n\t\t\t#include <uv_pars_vert>\n\t\t\tvarying vec4 vPosition;\n\t\t\tvoid main() {\n\t\t\t\t#include <uv_vert>\n\t\t\t\t#include <begin_vert>\n\t\t\t\t#include <morphtarget_vert>\n\t\t\t\t#include <morphnormal_vert>\n\t\t\t\t#include <skinning_vert>\n\t\t\t\t#include <skinnormal_vert>\n\t\t\t\t#include <normal_vert>\n\t\t\t\t#include <pvm_vert>\n\t\t\t\tvPosition = gl_Position; // need this, but not gl_FragCoord.z / gl_FragCoord.w ?\n\t\t\t}\n\t\t`,\n\n\t\tfragmentShader: `\n\t\t\t#include <common_frag>\n\t\t\t#include <diffuseMap_pars_frag>\n\t\t\t#include <alphaTest_pars_frag>\n\n\t\t\t#include <uv_pars_frag>\n\t\t\t#include <packing>\n\t\t\t#include <normal_pars_frag>\n\n\t\t\tvarying vec4 vPosition;\n\n\t\t\tuniform float shininess;\n\n\t\t\t${DeferredShaderChunk.packNormal}\n\n\t\t\tvoid main() {\n\t\t\t\t#if defined(USE_DIFFUSE_MAP) && defined(ALPHATEST)\n\t\t\t\t\tvec4 texelColor = texture2D(diffuseMap, v_Uv);\n\n\t\t\t\t\tfloat alpha = texelColor.a * u_Opacity;\n\t\t\t\t\tif(alpha < u_AlphaTest) discard;\n\t\t\t\t#endif\n\n\t\t\t\tvec3 normal = normalize(v_Normal);\n\t\t\t\tvec4 position = vPosition;\n\n\t\t\t\t${DeferredShaderChunk.packNormalDepthShininess}\n\n\t\t\t\tgl_FragColor = packedNormalDepthShininess;\n\t\t\t}\n\t\t`\n\t},\n\n\tpointLightPre: {\n\t\tname: 'deferred_pointlightpre',\n\n\t\tdefines: {\n\t\t\t'SHADOW': 0\n\t\t},\n\n\t\tuniforms: {\n\t\t\tsamplerNormalDepthShininess: null,\n\n\t\t\tlightColor: [0, 0, 0],\n\t\t\tlightPositionVS: [0, 0, 0],\n\t\t\tlightRadius: 1,\n\t\t\tlightDecay: 1,\n\t\t\tlightIntensity: 1,\n\n\t\t\tshadowMap: null,\n\t\t\tshadowBias: 0,\n\t\t\tshadowRadius: 1,\n\t\t\tshadowMapSize: [1024, 1024],\n\t\t\tshadowCameraNear: 1,\n\t\t\tshadowCameraFar: 100,\n\n\t\t\tviewWidth: 800,\n\t\t\tviewHeight: 600,\n\n\t\t\tmatProjViewInverse: new Float32Array(16),\n\t\t\tcameraPos: [0, 0, 0]\n\t\t},\n\n\t\tvertexShader: `\n\t\t\tattribute vec3 a_Position;\n\n\t\t\tuniform mat4 u_ProjectionView;\n\t\t\tuniform mat4 u_Model;\n\n\t\t\tvoid main() {\n\t\t\t\tgl_Position = u_ProjectionView * u_Model * vec4(a_Position, 1.0);\n\t\t\t}\n\t\t`,\n\n\t\tfragmentShader: `\n\t\t\t#include <bsdfs>\n\n\t\t\tuniform sampler2D samplerNormalDepthShininess;\n\n\t\t\tuniform float viewHeight;\n\t\t\tuniform float viewWidth;\n\n\t\t\tuniform vec3 lightColor;\n\t\t\tuniform vec3 lightPositionVS;\n\t\t\tuniform float lightRadius;\n\t\t\tuniform float lightDecay;\n\t\t\tuniform float lightIntensity;\n\n\t\t\t#if SHADOW == 1\n\t\t\t\tuniform samplerCube shadowMap;\n\n\t\t\t\tuniform float shadowBias;\n\t\t\t\tuniform float shadowRadius;\n\t\t\t\tuniform vec2 shadowMapSize;\n\n\t\t\t\tuniform float shadowCameraNear;\n\t\t\t\tuniform float shadowCameraFar;\n\n\t\t\t\t#include <packing>\n\t\t\t\t#include <shadow>\n\t\t\t#endif\n\n\t\t\tuniform mat4 matProjViewInverse;\n\t\t\tuniform vec3 cameraPos;\n\n\t\t\t${DeferredShaderChunk.unpackFloat}\n\t\t\t${DeferredShaderChunk.unpackVector2}\n\n\t\t\tvoid main() {\n\t\t\t\t${DeferredShaderChunk.computeTextureCoord}\n\t\t\t\t${DeferredShaderChunk.unpackNormalDepthShininess}\n\t\t\t\t${DeferredShaderChunk.computeVertexPositionVS}\n\n\t\t\t\tvec3 lightVector = lightPositionVS - vertexPositionVS.xyz;\n\t\t\t\tfloat distance = length(lightVector);\n\n\t\t\t\tif (distance > lightRadius) discard;\n\n\t\t\t\tlightVector = normalize(lightVector);\n\t\t\t\tvec3 viewVector = normalize(cameraPos - vertexPositionVS.xyz);\n\n\t\t\t\t${DeferredShaderChunk.computeSpecular}\n\n\t\t\t\tfloat attenuation = pow(clamp(1. - distance / lightRadius, 0.0, 1.0), lightDecay) / PI;\n\n\t\t\t\t#if SHADOW == 1\n\t\t\t\tattenuation *= getPointShadow(shadowMap, vec4(vertexPositionVS.xyz - lightPositionVS, 1.0), shadowMapSize, vec2(shadowBias, 0.), vec2(shadowRadius, 0.), vec2(shadowCameraNear, shadowCameraFar));\n\t\t\t\t#endif\n\n\t\t\t\t${DeferredShaderChunk.packLight}\n\n\t\t\t\tgl_FragColor = packedLight;\n\t\t\t}\n\t\t`\n\t},\n\n\tspotLightPre: {\n\t\tname: 'deferred_spotlightpre',\n\n\t\tdefines: {\n\t\t\t'SHADOW': 0\n\t\t},\n\n\t\tuniforms: {\n\t\t\tsamplerNormalDepth: null,\n\n\t\t\tlightColor: [0, 0, 0],\n\t\t\tlightDirectionVS: [0, 1, 0],\n\t\t\tlightPositionVS: [0, 0, 0],\n\t\t\tlightConeCos: 1,\n\t\t\tlightPenumbraCos: 1,\n\t\t\tlightRadius: 1,\n\t\t\tlightDecay: 1,\n\t\t\tlightIntensity: 1,\n\n\t\t\tshadowMatrix: new Float32Array(16),\n\t\t\tshadowMap: null,\n\t\t\tshadowBias: 0,\n\t\t\tshadowRadius: 1,\n\t\t\tshadowMapSize: [1024, 1024],\n\n\t\t\tviewWidth: 800,\n\t\t\tviewHeight: 600,\n\n\t\t\tmatProjViewInverse: new Float32Array(16),\n\t\t\tcameraPos: [0, 0, 0]\n\t\t},\n\n\t\tvertexShader: `\n\t\t\tattribute vec3 a_Position;\n\n\t\t\tuniform mat4 u_ProjectionView;\n\t\t\tuniform mat4 u_Model;\n\n\t\t\tvoid main() {\n\t\t\t\tgl_Position = u_ProjectionView * u_Model * vec4(a_Position, 1.0);\n\t\t\t}\n\t\t`,\n\n\t\tfragmentShader: `\n\t\t\t#include <bsdfs>\n\n\t\t\tuniform sampler2D samplerNormalDepthShininess;\n\n\t\t\tuniform float viewHeight;\n\t\t\tuniform float viewWidth;\n\n\t\t\tuniform vec3 lightColor;\n\t\t\tuniform vec3 lightPositionVS;\n\t\t\tuniform vec3 lightDirectionVS;\n\t\t\tuniform float lightConeCos;\n\t\t\tuniform float lightPenumbraCos;\n\t\t\tuniform float lightRadius;\n\t\t\tuniform float lightDecay;\n\t\t\tuniform float lightIntensity;\n\n\t\t\t#if SHADOW == 1\n\t\t\t\tuniform sampler2D shadowMap;\n\t\t\t\tuniform mat4 shadowMatrix;\n\n\t\t\t\tuniform float shadowBias;\n\t\t\t\tuniform float shadowRadius;\n\t\t\t\tuniform vec2 shadowMapSize;\n\n\t\t\t\t#include <packing>\n\t\t\t\t#include <shadow>\n\t\t\t#endif\n\n\t\t\tuniform mat4 matProjViewInverse;\n\t\t\tuniform vec3 cameraPos;\n\n\t\t\t${DeferredShaderChunk.unpackFloat}\n\t\t\t${DeferredShaderChunk.unpackVector2}\n\n\t\t\tvoid main() {\n\t\t\t\t${DeferredShaderChunk.computeTextureCoord}\n\t\t\t\t${DeferredShaderChunk.unpackNormalDepthShininess}\n\t\t\t\t${DeferredShaderChunk.computeVertexPositionVS}\n\n\t\t\t\tvec3 lightVector = lightPositionVS.xyz - vertexPositionVS.xyz;\n\t\t\t\tfloat distance = length(lightVector);\n\n\t\t\t\tlightVector = normalize(lightVector);\n\n\t\t\t\tfloat angleCos = dot(lightDirectionVS, lightVector);\n\n\t\t\t\tif (angleCos <= lightConeCos) discard;\n\t\t\t\tif (distance > lightRadius) discard;\n\n\t\t\t\tfloat spotEffect = smoothstep(lightConeCos, lightPenumbraCos, angleCos);\n\t\t\t\tfloat dist = pow(clamp(1. - distance / lightRadius, 0.0, 1.0), lightDecay);\n\n\t\t\t\tfloat spot = dist * spotEffect;\n\n\t\t\t\tvec3 viewVector = normalize( cameraPos - vertexPositionVS.xyz );\n\n\t\t\t\t${DeferredShaderChunk.computeSpecular}\n\n\t\t\t\tfloat attenuation = 1.0 / PI;\n\n\t\t\t\t#if SHADOW == 1\n\t\t\t\t\tattenuation *= getShadow(shadowMap, shadowMatrix * vertexPositionVS, shadowMapSize, vec2(shadowBias, 0.), vec2(shadowRadius, 0.));\n\t\t\t\t#endif\n\n\t\t\t\t${DeferredShaderChunk.packLight}\n\n\t\t\t\tgl_FragColor = spot * packedLight;\n\t\t\t}\n\t\t`\n\t},\n\n\tdirectionalLightPre: {\n\t\tname: 'deferred_directionallightpre',\n\n\t\tdefines: {\n\t\t\t'SHADOW': 0\n\t\t},\n\n\t\tuniforms: {\n\t\t\tsamplerNormalDepthShininess: null,\n\n\t\t\tlightColor: [0, 0, 0],\n\t\t\tlightDirectionVS: [0, 1, 0],\n\t\t\tlightIntensity: 1,\n\n\t\t\tshadowMatrix: new Float32Array(16),\n\t\t\tshadowMap: null,\n\t\t\tshadowBias: 0,\n\t\t\tshadowRadius: 1,\n\t\t\tshadowMapSize: [1024, 1024],\n\n\t\t\tviewWidth: 800,\n\t\t\tviewHeight: 600,\n\n\t\t\tmatProjViewInverse: new Float32Array(16),\n\t\t\tcameraPos: [0, 0, 0]\n\t\t},\n\n\t\tvertexShader: `\n\t\t\tattribute vec3 a_Position;\n\n\t\t\tuniform mat4 u_ProjectionView;\n\t\t\tuniform mat4 u_Model;\n\n\t\t\tvoid main() {\n\t\t\t\tgl_Position = u_ProjectionView * u_Model * vec4(a_Position, 1.0);\n\t\t\t}\n\t\t`,\n\n\t\tfragmentShader: `\n\t\t\t#include <bsdfs>\n\n\t\t\tuniform sampler2D samplerNormalDepthShininess;\n\n\t\t\tuniform float viewHeight;\n\t\t\tuniform float viewWidth;\n\n\t\t\tuniform vec3 lightColor;\n\t\t\tuniform vec3 lightDirectionVS;\n\t\t\tuniform float lightIntensity;\n\n\t\t\t#if SHADOW == 1\n\t\t\t\tuniform sampler2D shadowMap;\n\t\t\t\tuniform mat4 shadowMatrix;\n\n\t\t\t\tuniform float shadowBias;\n\t\t\t\tuniform float shadowRadius;\n\t\t\t\tuniform vec2 shadowMapSize;\n\n\t\t\t\t#include <packing>\n\t\t\t\t#include <shadow>\n\t\t\t#endif\n\n\t\t\tuniform mat4 matProjViewInverse;\n\t\t\tuniform vec3 cameraPos;\n\n\t\t\t${DeferredShaderChunk.unpackFloat}\n\t\t\t${DeferredShaderChunk.unpackVector2}\n\n\t\t\tvoid main() {\n\t\t\t\t${DeferredShaderChunk.computeTextureCoord}\n\t\t\t\t${DeferredShaderChunk.unpackNormalDepthShininess}\n\t\t\t\t${DeferredShaderChunk.computeVertexPositionVS}\n\n\t\t\t\tvec3 lightVector = normalize(lightDirectionVS);\n\t\t\t\tvec3 viewVector = normalize(cameraPos - vertexPositionVS.xyz);\n\n\t\t\t\t${DeferredShaderChunk.computeSpecular}\n\n\t\t\t\tfloat attenuation = 1.0 / PI;\n\n\t\t\t\t#if SHADOW == 1\n\t\t\t\t\tattenuation *= getShadow(shadowMap, shadowMatrix * vertexPositionVS, shadowMapSize, vec2(shadowBias, 0.), vec2(shadowRadius, 0.));\n\t\t\t\t#endif\n\n\t\t\t\t${DeferredShaderChunk.packLight}\n\n\t\t\t\tgl_FragColor = packedLight;\n\t\t\t}\n\t\t`\n\t},\n\n\treconstruction: {\n\t\tname: 'deferred_reconstruction',\n\n\t\tuniforms: {\n\t\t\tsamplerLight: null,\n\n\t\t\tspecular: [0, 0, 0],\n\t\t\tshininess: 30,\n\n\t\t\tviewWidth: 800,\n\t\t\tviewHeight: 600\n\t\t},\n\n\t\tvertexShader: `\n\t\t\t#include <common_vert>\n\t\t\t#include <uv_pars_vert>\n\t\t\t#include <color_pars_vert>\n\t\t\t#include <envMap_pars_vert>\n\t\t\t#include <skinning_pars_vert>\n\t\t\tvoid main() {\n\t\t\t\t#include <begin_vert>\n\t\t\t\t#include <skinning_vert>\n\t\t\t\t#include <pvm_vert>\n\t\t\t\t#include <uv_vert>\n\t\t\t\t#include <color_vert>\n\t\t\t}\n\t\t`,\n\n\t\tfragmentShader: `\n\t\t\tuniform sampler2D samplerLight;\n\n\t\t\tuniform vec3 u_Color;\n\t\t\tuniform vec3 emissive;\n\t\t\tuniform vec3 specular;\n\t\t\tuniform float shininess;\n\n\t\t\tuniform float viewHeight;\n\t\t\tuniform float viewWidth;\n\n\t\t\t#include <uv_pars_frag>\n\t\t\t#include <diffuseMap_pars_frag>\n\n\t\t\t${DeferredShaderChunk.unpackFloat}\n\n\t\t\tvoid main() {\n\t\t\t\tvec4 outColor = vec4(u_Color, 1.0);\n\t\t\t\tvec3 emissiveColor = emissive;\n\t\t\t\tvec3 specularColor = specular;\n\n\t\t\t\t${DeferredShaderChunk.computeTextureCoord}\n\n\t\t\t\tvec4 light = texture2D(samplerLight, texCoord);\n\n\t\t\t\t#include <diffuseMap_frag>\n\t\t\t\tvec4 diffuseColor = outColor;\n\n\t\t\t\tvec3 diffuseFinal = diffuseColor.rgb * light.rgb;\n\t\t\t\tvec3 emissiveFinal = emissiveColor;\n\t\t\t\tvec3 specularFinal = specularColor * light.rgb * light.a;\n\n\t\t\t\tgl_FragColor = vec4(diffuseFinal + emissiveFinal + specularFinal, 1.0);\n\t\t\t}\n\t\t`\n\t}\n\n};\n\nexport { DeferredShader };"
  },
  {
    "path": "examples/jsm/shaders/DepthLinearShader.js",
    "content": "/**\n * Depth Linear Shader\n */\nconst DepthLinearShader = {\n\tname: 'depth_linear',\n\n\tdefines: {},\n\n\tuniforms: {\n\t\t'depthTex': null,\n\t\t'cameraNear': 1.0,\n\t\t'cameraFar': 1000.0\n\t},\n\n\tvertexShader: `\n\t\tattribute vec3 a_Position;\n\t\tattribute vec2 a_Uv;\n\n\t\tuniform mat4 u_ProjectionView;\n\t\tuniform mat4 u_Model;\n\n\t\tvarying vec2 v_Uv;\n\n\t\tvoid main() {\n\t\t\tv_Uv = a_Uv;\n\t\t\tgl_Position = u_ProjectionView * u_Model * vec4(a_Position, 1.0);\n\t\t}\n\t`,\n\n\tfragmentShader: `\n\t\tfloat perspectiveDepthToViewZ(const in float invClipZ, const in float near, const in float far) {\n\t\t\treturn (near * far) / ((far - near) * invClipZ - far);\n\t\t}\n\n\t\tfloat viewZToOrthographicDepth(const in float viewZ, const in float near, const in float far) {\n\t\t\treturn (viewZ + near) / (near - far);\n\t\t}\n\n\t\tuniform sampler2D depthTex;\n\n\t\tuniform float cameraNear;\n\t\tuniform float cameraFar;\n\n\t\tvarying vec2 v_Uv;\n\n\t\tvoid main() {\n\t\t\tvec4 texel = texture2D(depthTex, v_Uv);\n\t\t\tfloat depth = perspectiveDepthToViewZ(texel.r, cameraNear, cameraFar);\n\t\t\tgl_FragColor = vec4(vec3(1. - viewZToOrthographicDepth(depth, cameraNear, cameraFar)), 1.);\n\t\t}\n\t`\n};\n\nexport { DepthLinearShader };"
  },
  {
    "path": "examples/jsm/shaders/FXAAShader.js",
    "content": "/**\n * NVIDIA FXAA by Timothy Lottes\n * http://timothylottes.blogspot.com/2011/06/fxaa3-source-released.html\n * - WebGL port by \\@supereggbert\n * http://www.glge.org/demos/fxaa/\n */\nconst FXAAShader = {\n\tname: 'fxaa',\n\n\tuniforms: {\n\t\t'tDiffuse': null\n\t},\n\n\tvertexShader: `\n\t\tattribute vec3 a_Position;\n\t\tattribute vec2 a_Uv;\n\n\t\tuniform mat4 u_ProjectionView;\n\t\tuniform mat4 u_Model;\n\n\t\tvarying vec2 v_Uv;\n\n\t\tvoid main() {\n\t\t\tv_Uv = a_Uv;\n\t\t\tgl_Position = u_ProjectionView * u_Model * vec4(a_Position, 1.0);\n\t\t}\n\t`,\n\n\tfragmentShader: `\n\t\tuniform sampler2D tDiffuse;\n\t\tvarying vec2 v_Uv;\n\n\t\tuniform vec2 u_RenderTargetSize;\n\n\t\t// FXAA 3.11 implementation by NVIDIA, ported to WebGL by Agost Biro (biro@archilogic.com)\n\n\t\t//----------------------------------------------------------------------------------\n\t\t// File:        es3-kepler/FXAA/assets/shaders/FXAA_DefaultES.frag\n\t\t// SDK Version: v3.00\n\t\t// Email:       gameworks@nvidia.com\n\t\t// Site:        http://developer.nvidia.com/\n\t\t//\n\t\t// Copyright (c) 2014-2015, NVIDIA CORPORATION. All rights reserved.\n\t\t//\n\t\t// Redistribution and use in source and binary forms, with or without\n\t\t// modification, are permitted provided that the following conditions\n\t\t// are met:\n\t\t//  * Redistributions of source code must retain the above copyright\n\t\t//    notice, this list of conditions and the following disclaimer.\n\t\t//  * Redistributions in binary form must reproduce the above copyright\n\t\t//    notice, this list of conditions and the following disclaimer in the\n\t\t//    documentation and/or other materials provided with the distribution.\n\t\t//  * Neither the name of NVIDIA CORPORATION nor the names of its\n\t\t//    contributors may be used to endorse or promote products derived\n\t\t//    from this software without specific prior written permission.\n\t\t//\n\t\t// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS \"AS IS\" AND ANY\n\t\t// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n\t\t// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n\t\t// PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR\n\t\t// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n\t\t// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n\t\t// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n\t\t// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY\n\t\t// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n\t\t// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n\t\t// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\t\t//\n\t\t//----------------------------------------------------------------------------------\n\n\t\t#define FXAA_PC 1\n\t\t#define FXAA_GLSL_100 1\n\t\t#define FXAA_QUALITY_PRESET 39\n\n\t\t#define FXAA_GREEN_AS_LUMA 1\n\n\t\t/*--------------------------------------------------------------------------*/\n\t\t#ifndef FXAA_PC_CONSOLE\n\t\t\t//\n\t\t\t// The console algorithm for PC is included\n\t\t\t// for developers targeting really low spec machines.\n\t\t\t// Likely better to just run FXAA_PC, and use a really low preset.\n\t\t\t//\n\t\t\t#define FXAA_PC_CONSOLE 0\n\t\t#endif\n\t\t/*--------------------------------------------------------------------------*/\n\t\t#ifndef FXAA_GLSL_120\n\t\t\t#define FXAA_GLSL_120 0\n\t\t#endif\n\t\t/*--------------------------------------------------------------------------*/\n\t\t#ifndef FXAA_GLSL_130\n\t\t\t#define FXAA_GLSL_130 0\n\t\t#endif\n\t\t/*--------------------------------------------------------------------------*/\n\t\t#ifndef FXAA_HLSL_3\n\t\t\t#define FXAA_HLSL_3 0\n\t\t#endif\n\t\t/*--------------------------------------------------------------------------*/\n\t\t#ifndef FXAA_HLSL_4\n\t\t\t#define FXAA_HLSL_4 0\n\t\t#endif\n\t\t/*--------------------------------------------------------------------------*/\n\t\t#ifndef FXAA_HLSL_5\n\t\t\t#define FXAA_HLSL_5 0\n\t\t#endif\n\t\t/*==========================================================================*/\n\t\t#ifndef FXAA_GREEN_AS_LUMA\n\t\t\t//\n\t\t\t// For those using non-linear color,\n\t\t\t// and either not able to get luma in alpha, or not wanting to,\n\t\t\t// this enables FXAA to run using green as a proxy for luma.\n\t\t\t// So with this enabled, no need to pack luma in alpha.\n\t\t\t//\n\t\t\t// This will turn off AA on anything which lacks some amount of green.\n\t\t\t// Pure red and blue or combination of only R and B, will get no AA.\n\t\t\t//\n\t\t\t// Might want to lower the settings for both,\n\t\t\t//    fxaaConsoleEdgeThresholdMin\n\t\t\t//    fxaaQualityEdgeThresholdMin\n\t\t\t// In order to insure AA does not get turned off on colors\n\t\t\t// which contain a minor amount of green.\n\t\t\t//\n\t\t\t// 1 = On.\n\t\t\t// 0 = Off.\n\t\t\t//\n\t\t\t#define FXAA_GREEN_AS_LUMA 0\n\t\t#endif\n\t\t/*--------------------------------------------------------------------------*/\n\t\t#ifndef FXAA_EARLY_EXIT\n\t\t\t//\n\t\t\t// Controls algorithm's early exit path.\n\t\t\t// On PS3 turning this ON adds 2 cycles to the shader.\n\t\t\t// On 360 turning this OFF adds 10ths of a millisecond to the shader.\n\t\t\t// Turning this off on console will result in a more blurry image.\n\t\t\t// So this defaults to on.\n\t\t\t//\n\t\t\t// 1 = On.\n\t\t\t// 0 = Off.\n\t\t\t//\n\t\t\t#define FXAA_EARLY_EXIT 1\n\t\t#endif\n\t\t/*--------------------------------------------------------------------------*/\n\t\t#ifndef FXAA_DISCARD\n\t\t\t//\n\t\t\t// Only valid for PC OpenGL currently.\n\t\t\t// Probably will not work when FXAA_GREEN_AS_LUMA = 1.\n\t\t\t//\n\t\t\t// 1 = Use discard on pixels which don't need AA.\n\t\t\t//     For APIs which enable concurrent TEX+ROP from same surface.\n\t\t\t// 0 = Return unchanged color on pixels which don't need AA.\n\t\t\t//\n\t\t\t#define FXAA_DISCARD 0\n\t\t#endif\n\t\t/*--------------------------------------------------------------------------*/\n\t\t#ifndef FXAA_FAST_PIXEL_OFFSET\n\t\t\t//\n\t\t\t// Used for GLSL 120 only.\n\t\t\t//\n\t\t\t// 1 = GL API supports fast pixel offsets\n\t\t\t// 0 = do not use fast pixel offsets\n\t\t\t//\n\t\t\t#ifdef GL_EXT_gpu_shader4\n\t\t\t\t#define FXAA_FAST_PIXEL_OFFSET 1\n\t\t\t#endif\n\t\t\t#ifdef GL_NV_gpu_shader5\n\t\t\t\t#define FXAA_FAST_PIXEL_OFFSET 1\n\t\t\t#endif\n\t\t\t#ifdef GL_ARB_gpu_shader5\n\t\t\t\t#define FXAA_FAST_PIXEL_OFFSET 1\n\t\t\t#endif\n\t\t\t#ifndef FXAA_FAST_PIXEL_OFFSET\n\t\t\t\t#define FXAA_FAST_PIXEL_OFFSET 0\n\t\t\t#endif\n\t\t#endif\n\t\t/*--------------------------------------------------------------------------*/\n\t\t#ifndef FXAA_GATHER4_ALPHA\n\t\t\t//\n\t\t\t// 1 = API supports gather4 on alpha channel.\n\t\t\t// 0 = API does not support gather4 on alpha channel.\n\t\t\t//\n\t\t\t#if (FXAA_HLSL_5 == 1)\n\t\t\t\t#define FXAA_GATHER4_ALPHA 1\n\t\t\t#endif\n\t\t\t#ifdef GL_ARB_gpu_shader5\n\t\t\t\t#define FXAA_GATHER4_ALPHA 1\n\t\t\t#endif\n\t\t\t#ifdef GL_NV_gpu_shader5\n\t\t\t\t#define FXAA_GATHER4_ALPHA 1\n\t\t\t#endif\n\t\t\t#ifndef FXAA_GATHER4_ALPHA\n\t\t\t\t#define FXAA_GATHER4_ALPHA 0\n\t\t\t#endif\n\t\t#endif\n\n\n\t\t/*============================================================================\n\t\t\t\t\t\t\t\tFXAA QUALITY - TUNING KNOBS\n\t\t------------------------------------------------------------------------------\n\t\tNOTE the other tuning knobs are now in the shader function inputs!\n\t\t============================================================================*/\n\t\t#ifndef FXAA_QUALITY_PRESET\n\t\t\t//\n\t\t\t// Choose the quality preset.\n\t\t\t// This needs to be compiled into the shader as it effects code.\n\t\t\t// Best option to include multiple presets is to\n\t\t\t// in each shader define the preset, then include this file.\n\t\t\t//\n\t\t\t// OPTIONS\n\t\t\t// -----------------------------------------------------------------------\n\t\t\t// 10 to 15 - default medium dither (10=fastest, 15=highest quality)\n\t\t\t// 20 to 29 - less dither, more expensive (20=fastest, 29=highest quality)\n\t\t\t// 39       - no dither, very expensive\n\t\t\t//\n\t\t\t// NOTES\n\t\t\t// -----------------------------------------------------------------------\n\t\t\t// 12 = slightly faster then FXAA 3.9 and higher edge quality (default)\n\t\t\t// 13 = about same speed as FXAA 3.9 and better than 12\n\t\t\t// 23 = closest to FXAA 3.9 visually and performance wise\n\t\t\t//  _ = the lowest digit is directly related to performance\n\t\t\t// _  = the highest digit is directly related to style\n\t\t\t//\n\t\t\t#define FXAA_QUALITY_PRESET 12\n\t\t#endif\n\n\n\t\t/*============================================================================\n\n\t\t\t\t\t\t\t\tFXAA QUALITY - PRESETS\n\n\t\t============================================================================*/\n\n\t\t/*============================================================================\n\t\t\t\t\t\t\tFXAA QUALITY - MEDIUM DITHER PRESETS\n\t\t============================================================================*/\n\t\t#if (FXAA_QUALITY_PRESET == 10)\n\t\t\t#define FXAA_QUALITY_PS 3\n\t\t\t#define FXAA_QUALITY_P0 1.5\n\t\t\t#define FXAA_QUALITY_P1 3.0\n\t\t\t#define FXAA_QUALITY_P2 12.0\n\t\t#endif\n\t\t/*--------------------------------------------------------------------------*/\n\t\t#if (FXAA_QUALITY_PRESET == 11)\n\t\t\t#define FXAA_QUALITY_PS 4\n\t\t\t#define FXAA_QUALITY_P0 1.0\n\t\t\t#define FXAA_QUALITY_P1 1.5\n\t\t\t#define FXAA_QUALITY_P2 3.0\n\t\t\t#define FXAA_QUALITY_P3 12.0\n\t\t#endif\n\t\t/*--------------------------------------------------------------------------*/\n\t\t#if (FXAA_QUALITY_PRESET == 12)\n\t\t\t#define FXAA_QUALITY_PS 5\n\t\t\t#define FXAA_QUALITY_P0 1.0\n\t\t\t#define FXAA_QUALITY_P1 1.5\n\t\t\t#define FXAA_QUALITY_P2 2.0\n\t\t\t#define FXAA_QUALITY_P3 4.0\n\t\t\t#define FXAA_QUALITY_P4 12.0\n\t\t#endif\n\t\t/*--------------------------------------------------------------------------*/\n\t\t#if (FXAA_QUALITY_PRESET == 13)\n\t\t\t#define FXAA_QUALITY_PS 6\n\t\t\t#define FXAA_QUALITY_P0 1.0\n\t\t\t#define FXAA_QUALITY_P1 1.5\n\t\t\t#define FXAA_QUALITY_P2 2.0\n\t\t\t#define FXAA_QUALITY_P3 2.0\n\t\t\t#define FXAA_QUALITY_P4 4.0\n\t\t\t#define FXAA_QUALITY_P5 12.0\n\t\t#endif\n\t\t/*--------------------------------------------------------------------------*/\n\t\t#if (FXAA_QUALITY_PRESET == 14)\n\t\t\t#define FXAA_QUALITY_PS 7\n\t\t\t#define FXAA_QUALITY_P0 1.0\n\t\t\t#define FXAA_QUALITY_P1 1.5\n\t\t\t#define FXAA_QUALITY_P2 2.0\n\t\t\t#define FXAA_QUALITY_P3 2.0\n\t\t\t#define FXAA_QUALITY_P4 2.0\n\t\t\t#define FXAA_QUALITY_P5 4.0\n\t\t\t#define FXAA_QUALITY_P6 12.0\n\t\t#endif\n\t\t/*--------------------------------------------------------------------------*/\n\t\t#if (FXAA_QUALITY_PRESET == 15)\n\t\t\t#define FXAA_QUALITY_PS 8\n\t\t\t#define FXAA_QUALITY_P0 1.0\n\t\t\t#define FXAA_QUALITY_P1 1.5\n\t\t\t#define FXAA_QUALITY_P2 2.0\n\t\t\t#define FXAA_QUALITY_P3 2.0\n\t\t\t#define FXAA_QUALITY_P4 2.0\n\t\t\t#define FXAA_QUALITY_P5 2.0\n\t\t\t#define FXAA_QUALITY_P6 4.0\n\t\t\t#define FXAA_QUALITY_P7 12.0\n\t\t#endif\n\n\t\t/*============================================================================\n\t\t\t\t\t\t\tFXAA QUALITY - LOW DITHER PRESETS\n\t\t============================================================================*/\n\t\t#if (FXAA_QUALITY_PRESET == 20)\n\t\t\t#define FXAA_QUALITY_PS 3\n\t\t\t#define FXAA_QUALITY_P0 1.5\n\t\t\t#define FXAA_QUALITY_P1 2.0\n\t\t\t#define FXAA_QUALITY_P2 8.0\n\t\t#endif\n\t\t/*--------------------------------------------------------------------------*/\n\t\t#if (FXAA_QUALITY_PRESET == 21)\n\t\t\t#define FXAA_QUALITY_PS 4\n\t\t\t#define FXAA_QUALITY_P0 1.0\n\t\t\t#define FXAA_QUALITY_P1 1.5\n\t\t\t#define FXAA_QUALITY_P2 2.0\n\t\t\t#define FXAA_QUALITY_P3 8.0\n\t\t#endif\n\t\t/*--------------------------------------------------------------------------*/\n\t\t#if (FXAA_QUALITY_PRESET == 22)\n\t\t\t#define FXAA_QUALITY_PS 5\n\t\t\t#define FXAA_QUALITY_P0 1.0\n\t\t\t#define FXAA_QUALITY_P1 1.5\n\t\t\t#define FXAA_QUALITY_P2 2.0\n\t\t\t#define FXAA_QUALITY_P3 2.0\n\t\t\t#define FXAA_QUALITY_P4 8.0\n\t\t#endif\n\t\t/*--------------------------------------------------------------------------*/\n\t\t#if (FXAA_QUALITY_PRESET == 23)\n\t\t\t#define FXAA_QUALITY_PS 6\n\t\t\t#define FXAA_QUALITY_P0 1.0\n\t\t\t#define FXAA_QUALITY_P1 1.5\n\t\t\t#define FXAA_QUALITY_P2 2.0\n\t\t\t#define FXAA_QUALITY_P3 2.0\n\t\t\t#define FXAA_QUALITY_P4 2.0\n\t\t\t#define FXAA_QUALITY_P5 8.0\n\t\t#endif\n\t\t/*--------------------------------------------------------------------------*/\n\t\t#if (FXAA_QUALITY_PRESET == 24)\n\t\t\t#define FXAA_QUALITY_PS 7\n\t\t\t#define FXAA_QUALITY_P0 1.0\n\t\t\t#define FXAA_QUALITY_P1 1.5\n\t\t\t#define FXAA_QUALITY_P2 2.0\n\t\t\t#define FXAA_QUALITY_P3 2.0\n\t\t\t#define FXAA_QUALITY_P4 2.0\n\t\t\t#define FXAA_QUALITY_P5 3.0\n\t\t\t#define FXAA_QUALITY_P6 8.0\n\t\t#endif\n\t\t/*--------------------------------------------------------------------------*/\n\t\t#if (FXAA_QUALITY_PRESET == 25)\n\t\t\t#define FXAA_QUALITY_PS 8\n\t\t\t#define FXAA_QUALITY_P0 1.0\n\t\t\t#define FXAA_QUALITY_P1 1.5\n\t\t\t#define FXAA_QUALITY_P2 2.0\n\t\t\t#define FXAA_QUALITY_P3 2.0\n\t\t\t#define FXAA_QUALITY_P4 2.0\n\t\t\t#define FXAA_QUALITY_P5 2.0\n\t\t\t#define FXAA_QUALITY_P6 4.0\n\t\t\t#define FXAA_QUALITY_P7 8.0\n\t\t#endif\n\t\t/*--------------------------------------------------------------------------*/\n\t\t#if (FXAA_QUALITY_PRESET == 26)\n\t\t\t#define FXAA_QUALITY_PS 9\n\t\t\t#define FXAA_QUALITY_P0 1.0\n\t\t\t#define FXAA_QUALITY_P1 1.5\n\t\t\t#define FXAA_QUALITY_P2 2.0\n\t\t\t#define FXAA_QUALITY_P3 2.0\n\t\t\t#define FXAA_QUALITY_P4 2.0\n\t\t\t#define FXAA_QUALITY_P5 2.0\n\t\t\t#define FXAA_QUALITY_P6 2.0\n\t\t\t#define FXAA_QUALITY_P7 4.0\n\t\t\t#define FXAA_QUALITY_P8 8.0\n\t\t#endif\n\t\t/*--------------------------------------------------------------------------*/\n\t\t#if (FXAA_QUALITY_PRESET == 27)\n\t\t\t#define FXAA_QUALITY_PS 10\n\t\t\t#define FXAA_QUALITY_P0 1.0\n\t\t\t#define FXAA_QUALITY_P1 1.5\n\t\t\t#define FXAA_QUALITY_P2 2.0\n\t\t\t#define FXAA_QUALITY_P3 2.0\n\t\t\t#define FXAA_QUALITY_P4 2.0\n\t\t\t#define FXAA_QUALITY_P5 2.0\n\t\t\t#define FXAA_QUALITY_P6 2.0\n\t\t\t#define FXAA_QUALITY_P7 2.0\n\t\t\t#define FXAA_QUALITY_P8 4.0\n\t\t\t#define FXAA_QUALITY_P9 8.0\n\t\t#endif\n\t\t/*--------------------------------------------------------------------------*/\n\t\t#if (FXAA_QUALITY_PRESET == 28)\n\t\t\t#define FXAA_QUALITY_PS 11\n\t\t\t#define FXAA_QUALITY_P0 1.0\n\t\t\t#define FXAA_QUALITY_P1 1.5\n\t\t\t#define FXAA_QUALITY_P2 2.0\n\t\t\t#define FXAA_QUALITY_P3 2.0\n\t\t\t#define FXAA_QUALITY_P4 2.0\n\t\t\t#define FXAA_QUALITY_P5 2.0\n\t\t\t#define FXAA_QUALITY_P6 2.0\n\t\t\t#define FXAA_QUALITY_P7 2.0\n\t\t\t#define FXAA_QUALITY_P8 2.0\n\t\t\t#define FXAA_QUALITY_P9 4.0\n\t\t\t#define FXAA_QUALITY_P10 8.0\n\t\t#endif\n\t\t/*--------------------------------------------------------------------------*/\n\t\t#if (FXAA_QUALITY_PRESET == 29)\n\t\t\t#define FXAA_QUALITY_PS 12\n\t\t\t#define FXAA_QUALITY_P0 1.0\n\t\t\t#define FXAA_QUALITY_P1 1.5\n\t\t\t#define FXAA_QUALITY_P2 2.0\n\t\t\t#define FXAA_QUALITY_P3 2.0\n\t\t\t#define FXAA_QUALITY_P4 2.0\n\t\t\t#define FXAA_QUALITY_P5 2.0\n\t\t\t#define FXAA_QUALITY_P6 2.0\n\t\t\t#define FXAA_QUALITY_P7 2.0\n\t\t\t#define FXAA_QUALITY_P8 2.0\n\t\t\t#define FXAA_QUALITY_P9 2.0\n\t\t\t#define FXAA_QUALITY_P10 4.0\n\t\t\t#define FXAA_QUALITY_P11 8.0\n\t\t#endif\n\n\t\t/*============================================================================\n\t\t\t\t\t\t\tFXAA QUALITY - EXTREME QUALITY\n\t\t============================================================================*/\n\t\t#if (FXAA_QUALITY_PRESET == 39)\n\t\t\t#define FXAA_QUALITY_PS 12\n\t\t\t#define FXAA_QUALITY_P0 1.0\n\t\t\t#define FXAA_QUALITY_P1 1.0\n\t\t\t#define FXAA_QUALITY_P2 1.0\n\t\t\t#define FXAA_QUALITY_P3 1.0\n\t\t\t#define FXAA_QUALITY_P4 1.0\n\t\t\t#define FXAA_QUALITY_P5 1.5\n\t\t\t#define FXAA_QUALITY_P6 2.0\n\t\t\t#define FXAA_QUALITY_P7 2.0\n\t\t\t#define FXAA_QUALITY_P8 2.0\n\t\t\t#define FXAA_QUALITY_P9 2.0\n\t\t\t#define FXAA_QUALITY_P10 4.0\n\t\t\t#define FXAA_QUALITY_P11 8.0\n\t\t#endif\n\n\n\n\t\t/*============================================================================\n\n\t\t\t\t\t\t\t\t\t\tAPI PORTING\n\n\t\t============================================================================*/\n\t\t#if (FXAA_GLSL_100 == 1) || (FXAA_GLSL_120 == 1) || (FXAA_GLSL_130 == 1)\n\t\t\t#define FxaaBool bool\n\t\t\t#define FxaaDiscard discard\n\t\t\t#define FxaaFloat float\n\t\t\t#define FxaaFloat2 vec2\n\t\t\t#define FxaaFloat3 vec3\n\t\t\t#define FxaaFloat4 vec4\n\t\t\t#define FxaaHalf float\n\t\t\t#define FxaaHalf2 vec2\n\t\t\t#define FxaaHalf3 vec3\n\t\t\t#define FxaaHalf4 vec4\n\t\t\t#define FxaaInt2 ivec2\n\t\t\t#define FxaaSat(x) clamp(x, 0.0, 1.0)\n\t\t\t#define FxaaTex sampler2D\n\t\t#else\n\t\t\t#define FxaaBool bool\n\t\t\t#define FxaaDiscard clip(-1)\n\t\t\t#define FxaaFloat float\n\t\t\t#define FxaaFloat2 float2\n\t\t\t#define FxaaFloat3 float3\n\t\t\t#define FxaaFloat4 float4\n\t\t\t#define FxaaHalf half\n\t\t\t#define FxaaHalf2 half2\n\t\t\t#define FxaaHalf3 half3\n\t\t\t#define FxaaHalf4 half4\n\t\t\t#define FxaaSat(x) saturate(x)\n\t\t#endif\n\t\t/*--------------------------------------------------------------------------*/\n\t\t#if (FXAA_GLSL_100 == 1)\n\t\t#define FxaaTexTop(t, p) texture2D(t, p, 0.0)\n\t\t#define FxaaTexOff(t, p, o, r) texture2D(t, p + (o * r), 0.0)\n\t\t#endif\n\t\t/*--------------------------------------------------------------------------*/\n\t\t#if (FXAA_GLSL_120 == 1)\n\t\t\t// Requires,\n\t\t\t//  #version 120\n\t\t\t// And at least,\n\t\t\t//  #extension GL_EXT_gpu_shader4 : enable\n\t\t\t//  (or set FXAA_FAST_PIXEL_OFFSET 1 to work like DX9)\n\t\t\t#define FxaaTexTop(t, p) texture2DLod(t, p, 0.0)\n\t\t\t#if (FXAA_FAST_PIXEL_OFFSET == 1)\n\t\t\t\t#define FxaaTexOff(t, p, o, r) texture2DLodOffset(t, p, 0.0, o)\n\t\t\t#else\n\t\t\t\t#define FxaaTexOff(t, p, o, r) texture2DLod(t, p + (o * r), 0.0)\n\t\t\t#endif\n\t\t\t#if (FXAA_GATHER4_ALPHA == 1)\n\t\t\t\t// use #extension GL_ARB_gpu_shader5 : enable\n\t\t\t\t#define FxaaTexAlpha4(t, p) textureGather(t, p, 3)\n\t\t\t\t#define FxaaTexOffAlpha4(t, p, o) textureGatherOffset(t, p, o, 3)\n\t\t\t\t#define FxaaTexGreen4(t, p) textureGather(t, p, 1)\n\t\t\t\t#define FxaaTexOffGreen4(t, p, o) textureGatherOffset(t, p, o, 1)\n\t\t\t#endif\n\t\t#endif\n\t\t/*--------------------------------------------------------------------------*/\n\t\t#if (FXAA_GLSL_130 == 1)\n\t\t\t// Requires '#version 130' or better\n\t\t\t#define FxaaTexTop(t, p) textureLod(t, p, 0.0)\n\t\t\t#define FxaaTexOff(t, p, o, r) textureLodOffset(t, p, 0.0, o)\n\t\t\t#if (FXAA_GATHER4_ALPHA == 1)\n\t\t\t\t// use #extension GL_ARB_gpu_shader5 : enable\n\t\t\t\t#define FxaaTexAlpha4(t, p) textureGather(t, p, 3)\n\t\t\t\t#define FxaaTexOffAlpha4(t, p, o) textureGatherOffset(t, p, o, 3)\n\t\t\t\t#define FxaaTexGreen4(t, p) textureGather(t, p, 1)\n\t\t\t\t#define FxaaTexOffGreen4(t, p, o) textureGatherOffset(t, p, o, 1)\n\t\t\t#endif\n\t\t#endif\n\t\t/*--------------------------------------------------------------------------*/\n\t\t#if (FXAA_HLSL_3 == 1)\n\t\t\t#define FxaaInt2 float2\n\t\t\t#define FxaaTex sampler2D\n\t\t\t#define FxaaTexTop(t, p) tex2Dlod(t, float4(p, 0.0, 0.0))\n\t\t\t#define FxaaTexOff(t, p, o, r) tex2Dlod(t, float4(p + (o * r), 0, 0))\n\t\t#endif\n\t\t/*--------------------------------------------------------------------------*/\n\t\t#if (FXAA_HLSL_4 == 1)\n\t\t\t#define FxaaInt2 int2\n\t\t\tstruct FxaaTex { SamplerState smpl; Texture2D tex; };\n\t\t\t#define FxaaTexTop(t, p) t.tex.SampleLevel(t.smpl, p, 0.0)\n\t\t\t#define FxaaTexOff(t, p, o, r) t.tex.SampleLevel(t.smpl, p, 0.0, o)\n\t\t#endif\n\t\t/*--------------------------------------------------------------------------*/\n\t\t#if (FXAA_HLSL_5 == 1)\n\t\t\t#define FxaaInt2 int2\n\t\t\tstruct FxaaTex { SamplerState smpl; Texture2D tex; };\n\t\t\t#define FxaaTexTop(t, p) t.tex.SampleLevel(t.smpl, p, 0.0)\n\t\t\t#define FxaaTexOff(t, p, o, r) t.tex.SampleLevel(t.smpl, p, 0.0, o)\n\t\t\t#define FxaaTexAlpha4(t, p) t.tex.GatherAlpha(t.smpl, p)\n\t\t\t#define FxaaTexOffAlpha4(t, p, o) t.tex.GatherAlpha(t.smpl, p, o)\n\t\t\t#define FxaaTexGreen4(t, p) t.tex.GatherGreen(t.smpl, p)\n\t\t\t#define FxaaTexOffGreen4(t, p, o) t.tex.GatherGreen(t.smpl, p, o)\n\t\t#endif\n\n\n\t\t/*============================================================================\n\t\t\t\t\t\tGREEN AS LUMA OPTION SUPPORT FUNCTION\n\t\t============================================================================*/\n\t\t#if (FXAA_GREEN_AS_LUMA == 0)\n\t\t\tFxaaFloat FxaaLuma(FxaaFloat4 rgba) { return rgba.w; }\n\t\t#else\n\t\t\tFxaaFloat FxaaLuma(FxaaFloat4 rgba) { return rgba.y; }\n\t\t#endif\n\n\n\n\n\t\t/*============================================================================\n\n\t\t\t\t\t\t\t\t\tFXAA3 QUALITY - PC\n\n\t\t============================================================================*/\n\t\t#if (FXAA_PC == 1)\n\t\t/*--------------------------------------------------------------------------*/\n\t\tFxaaFloat4 FxaaPixelShader(\n\t\t\t//\n\t\t\t// Use noperspective interpolation here (turn off perspective interpolation).\n\t\t\t// {xy} = center of pixel\n\t\t\tFxaaFloat2 pos,\n\t\t\t//\n\t\t\t// Used only for FXAA Console, and not used on the 360 version.\n\t\t\t// Use noperspective interpolation here (turn off perspective interpolation).\n\t\t\t// {xy_} = upper left of pixel\n\t\t\t// {_zw} = lower right of pixel\n\t\t\tFxaaFloat4 fxaaConsolePosPos,\n\t\t\t//\n\t\t\t// Input color texture.\n\t\t\t// {rgb_} = color in linear or perceptual color space\n\t\t\t// if (FXAA_GREEN_AS_LUMA == 0)\n\t\t\t//     {__a} = luma in perceptual color space (not linear)\n\t\t\tFxaaTex tex,\n\t\t\t//\n\t\t\t// Only used on the optimized 360 version of FXAA Console.\n\t\t\t// For everything but 360, just use the same input here as for 'tex'.\n\t\t\t// For 360, same diffuseMap, just alias with a 2nd sampler.\n\t\t\t// This sampler needs to have an exponent bias of -1.\n\t\t\tFxaaTex fxaaConsole360TexExpBiasNegOne,\n\t\t\t//\n\t\t\t// Only used on the optimized 360 version of FXAA Console.\n\t\t\t// For everything but 360, just use the same input here as for 'tex'.\n\t\t\t// For 360, same diffuseMap, just alias with a 3nd sampler.\n\t\t\t// This sampler needs to have an exponent bias of -2.\n\t\t\tFxaaTex fxaaConsole360TexExpBiasNegTwo,\n\t\t\t//\n\t\t\t// Only used on FXAA Quality.\n\t\t\t// This must be from a constant/uniform.\n\t\t\t// {x_} = 1.0/screenWidthInPixels\n\t\t\t// {_y} = 1.0/screenHeightInPixels\n\t\t\tFxaaFloat2 fxaaQualityRcpFrame,\n\t\t\t//\n\t\t\t// Only used on FXAA Console.\n\t\t\t// This must be from a constant/uniform.\n\t\t\t// This effects sub-pixel AA quality and inversely sharpness.\n\t\t\t//   Where N ranges between,\n\t\t\t//     N = 0.50 (default)\n\t\t\t//     N = 0.33 (sharper)\n\t\t\t// {x__} = -N/screenWidthInPixels\n\t\t\t// {_y_} = -N/screenHeightInPixels\n\t\t\t// {_z_} =  N/screenWidthInPixels\n\t\t\t// {__w} =  N/screenHeightInPixels\n\t\t\tFxaaFloat4 fxaaConsoleRcpFrameOpt,\n\t\t\t//\n\t\t\t// Only used on FXAA Console.\n\t\t\t// Not used on 360, but used on PS3 and PC.\n\t\t\t// This must be from a constant/uniform.\n\t\t\t// {x__} = -2.0/screenWidthInPixels\n\t\t\t// {_y_} = -2.0/screenHeightInPixels\n\t\t\t// {_z_} =  2.0/screenWidthInPixels\n\t\t\t// {__w} =  2.0/screenHeightInPixels\n\t\t\tFxaaFloat4 fxaaConsoleRcpFrameOpt2,\n\t\t\t//\n\t\t\t// Only used on FXAA Console.\n\t\t\t// Only used on 360 in place of fxaaConsoleRcpFrameOpt2.\n\t\t\t// This must be from a constant/uniform.\n\t\t\t// {x__} =  8.0/screenWidthInPixels\n\t\t\t// {_y_} =  8.0/screenHeightInPixels\n\t\t\t// {_z_} = -4.0/screenWidthInPixels\n\t\t\t// {__w} = -4.0/screenHeightInPixels\n\t\t\tFxaaFloat4 fxaaConsole360RcpFrameOpt2,\n\t\t\t//\n\t\t\t// Only used on FXAA Quality.\n\t\t\t// This used to be the FXAA_QUALITY_SUBPIX define.\n\t\t\t// It is here now to allow easier tuning.\n\t\t\t// Choose the amount of sub-pixel aliasing removal.\n\t\t\t// This can effect sharpness.\n\t\t\t//   1.00 - upper limit (softer)\n\t\t\t//   0.75 - default amount of filtering\n\t\t\t//   0.50 - lower limit (sharper, less sub-pixel aliasing removal)\n\t\t\t//   0.25 - almost off\n\t\t\t//   0.00 - completely off\n\t\t\tFxaaFloat fxaaQualitySubpix,\n\t\t\t//\n\t\t\t// Only used on FXAA Quality.\n\t\t\t// This used to be the FXAA_QUALITY_EDGE_THRESHOLD define.\n\t\t\t// It is here now to allow easier tuning.\n\t\t\t// The minimum amount of local contrast required to apply algorithm.\n\t\t\t//   0.333 - too little (faster)\n\t\t\t//   0.250 - low quality\n\t\t\t//   0.166 - default\n\t\t\t//   0.125 - high quality\n\t\t\t//   0.063 - overkill (slower)\n\t\t\tFxaaFloat fxaaQualityEdgeThreshold,\n\t\t\t//\n\t\t\t// Only used on FXAA Quality.\n\t\t\t// This used to be the FXAA_QUALITY_EDGE_THRESHOLD_MIN define.\n\t\t\t// It is here now to allow easier tuning.\n\t\t\t// Trims the algorithm from processing darks.\n\t\t\t//   0.0833 - upper limit (default, the start of visible unfiltered edges)\n\t\t\t//   0.0625 - high quality (faster)\n\t\t\t//   0.0312 - visible limit (slower)\n\t\t\t// Special notes when using FXAA_GREEN_AS_LUMA,\n\t\t\t//   Likely want to set this to zero.\n\t\t\t//   As colors that are mostly not-green\n\t\t\t//   will appear very dark in the green channel!\n\t\t\t//   Tune by looking at mostly non-green content,\n\t\t\t//   then start at zero and increase until aliasing is a problem.\n\t\t\tFxaaFloat fxaaQualityEdgeThresholdMin,\n\t\t\t//\n\t\t\t// Only used on FXAA Console.\n\t\t\t// This used to be the FXAA_CONSOLE_EDGE_SHARPNESS define.\n\t\t\t// It is here now to allow easier tuning.\n\t\t\t// This does not effect PS3, as this needs to be compiled in.\n\t\t\t//   Use FXAA_CONSOLE_PS3_EDGE_SHARPNESS for PS3.\n\t\t\t//   Due to the PS3 being ALU bound,\n\t\t\t//   there are only three safe values here: 2 and 4 and 8.\n\t\t\t//   These options use the shaders ability to a free *|/ by 2|4|8.\n\t\t\t// For all other platforms can be a non-power of two.\n\t\t\t//   8.0 is sharper (default!!!)\n\t\t\t//   4.0 is softer\n\t\t\t//   2.0 is really soft (good only for vector graphics inputs)\n\t\t\tFxaaFloat fxaaConsoleEdgeSharpness,\n\t\t\t//\n\t\t\t// Only used on FXAA Console.\n\t\t\t// This used to be the FXAA_CONSOLE_EDGE_THRESHOLD define.\n\t\t\t// It is here now to allow easier tuning.\n\t\t\t// This does not effect PS3, as this needs to be compiled in.\n\t\t\t//   Use FXAA_CONSOLE_PS3_EDGE_THRESHOLD for PS3.\n\t\t\t//   Due to the PS3 being ALU bound,\n\t\t\t//   there are only two safe values here: 1/4 and 1/8.\n\t\t\t//   These options use the shaders ability to a free *|/ by 2|4|8.\n\t\t\t// The console setting has a different mapping than the quality setting.\n\t\t\t// Other platforms can use other values.\n\t\t\t//   0.125 leaves less aliasing, but is softer (default!!!)\n\t\t\t//   0.25 leaves more aliasing, and is sharper\n\t\t\tFxaaFloat fxaaConsoleEdgeThreshold,\n\t\t\t//\n\t\t\t// Only used on FXAA Console.\n\t\t\t// This used to be the FXAA_CONSOLE_EDGE_THRESHOLD_MIN define.\n\t\t\t// It is here now to allow easier tuning.\n\t\t\t// Trims the algorithm from processing darks.\n\t\t\t// The console setting has a different mapping than the quality setting.\n\t\t\t// This only applies when FXAA_EARLY_EXIT is 1.\n\t\t\t// This does not apply to PS3,\n\t\t\t// PS3 was simplified to avoid more shader instructions.\n\t\t\t//   0.06 - faster but more aliasing in darks\n\t\t\t//   0.05 - default\n\t\t\t//   0.04 - slower and less aliasing in darks\n\t\t\t// Special notes when using FXAA_GREEN_AS_LUMA,\n\t\t\t//   Likely want to set this to zero.\n\t\t\t//   As colors that are mostly not-green\n\t\t\t//   will appear very dark in the green channel!\n\t\t\t//   Tune by looking at mostly non-green content,\n\t\t\t//   then start at zero and increase until aliasing is a problem.\n\t\t\tFxaaFloat fxaaConsoleEdgeThresholdMin,\n\t\t\t//\n\t\t\t// Extra constants for 360 FXAA Console only.\n\t\t\t// Use zeros or anything else for other platforms.\n\t\t\t// These must be in physical constant registers and NOT immedates.\n\t\t\t// Immedates will result in compiler un-optimizing.\n\t\t\t// {xyzw} = float4(1.0, -1.0, 0.25, -0.25)\n\t\t\tFxaaFloat4 fxaaConsole360ConstDir\n\t\t) {\n\t\t/*--------------------------------------------------------------------------*/\n\t\t\tFxaaFloat2 posM;\n\t\t\tposM.x = pos.x;\n\t\t\tposM.y = pos.y;\n\t\t\t#if (FXAA_GATHER4_ALPHA == 1)\n\t\t\t\t#if (FXAA_DISCARD == 0)\n\t\t\t\t\tFxaaFloat4 rgbyM = FxaaTexTop(tex, posM);\n\t\t\t\t\t#if (FXAA_GREEN_AS_LUMA == 0)\n\t\t\t\t\t\t#define lumaM rgbyM.w\n\t\t\t\t\t#else\n\t\t\t\t\t\t#define lumaM rgbyM.y\n\t\t\t\t\t#endif\n\t\t\t\t#endif\n\t\t\t\t#if (FXAA_GREEN_AS_LUMA == 0)\n\t\t\t\t\tFxaaFloat4 luma4A = FxaaTexAlpha4(tex, posM);\n\t\t\t\t\tFxaaFloat4 luma4B = FxaaTexOffAlpha4(tex, posM, FxaaInt2(-1, -1));\n\t\t\t\t#else\n\t\t\t\t\tFxaaFloat4 luma4A = FxaaTexGreen4(tex, posM);\n\t\t\t\t\tFxaaFloat4 luma4B = FxaaTexOffGreen4(tex, posM, FxaaInt2(-1, -1));\n\t\t\t\t#endif\n\t\t\t\t#if (FXAA_DISCARD == 1)\n\t\t\t\t\t#define lumaM luma4A.w\n\t\t\t\t#endif\n\t\t\t\t#define lumaE luma4A.z\n\t\t\t\t#define lumaS luma4A.x\n\t\t\t\t#define lumaSE luma4A.y\n\t\t\t\t#define lumaNW luma4B.w\n\t\t\t\t#define lumaN luma4B.z\n\t\t\t\t#define lumaW luma4B.x\n\t\t\t#else\n\t\t\t\tFxaaFloat4 rgbyM = FxaaTexTop(tex, posM);\n\t\t\t\t#if (FXAA_GREEN_AS_LUMA == 0)\n\t\t\t\t\t#define lumaM rgbyM.w\n\t\t\t\t#else\n\t\t\t\t\t#define lumaM rgbyM.y\n\t\t\t\t#endif\n\t\t\t\t#if (FXAA_GLSL_100 == 1)\n\t\t\t\tFxaaFloat lumaS = FxaaLuma(FxaaTexOff(tex, posM, FxaaFloat2( 0.0, 1.0), fxaaQualityRcpFrame.xy));\n\t\t\t\tFxaaFloat lumaE = FxaaLuma(FxaaTexOff(tex, posM, FxaaFloat2( 1.0, 0.0), fxaaQualityRcpFrame.xy));\n\t\t\t\tFxaaFloat lumaN = FxaaLuma(FxaaTexOff(tex, posM, FxaaFloat2( 0.0,-1.0), fxaaQualityRcpFrame.xy));\n\t\t\t\tFxaaFloat lumaW = FxaaLuma(FxaaTexOff(tex, posM, FxaaFloat2(-1.0, 0.0), fxaaQualityRcpFrame.xy));\n\t\t\t\t#else\n\t\t\t\tFxaaFloat lumaS = FxaaLuma(FxaaTexOff(tex, posM, FxaaInt2( 0, 1), fxaaQualityRcpFrame.xy));\n\t\t\t\tFxaaFloat lumaE = FxaaLuma(FxaaTexOff(tex, posM, FxaaInt2( 1, 0), fxaaQualityRcpFrame.xy));\n\t\t\t\tFxaaFloat lumaN = FxaaLuma(FxaaTexOff(tex, posM, FxaaInt2( 0,-1), fxaaQualityRcpFrame.xy));\n\t\t\t\tFxaaFloat lumaW = FxaaLuma(FxaaTexOff(tex, posM, FxaaInt2(-1, 0), fxaaQualityRcpFrame.xy));\n\t\t\t\t#endif\n\t\t\t#endif\n\t\t/*--------------------------------------------------------------------------*/\n\t\t\tFxaaFloat maxSM = max(lumaS, lumaM);\n\t\t\tFxaaFloat minSM = min(lumaS, lumaM);\n\t\t\tFxaaFloat maxESM = max(lumaE, maxSM);\n\t\t\tFxaaFloat minESM = min(lumaE, minSM);\n\t\t\tFxaaFloat maxWN = max(lumaN, lumaW);\n\t\t\tFxaaFloat minWN = min(lumaN, lumaW);\n\t\t\tFxaaFloat rangeMax = max(maxWN, maxESM);\n\t\t\tFxaaFloat rangeMin = min(minWN, minESM);\n\t\t\tFxaaFloat rangeMaxScaled = rangeMax * fxaaQualityEdgeThreshold;\n\t\t\tFxaaFloat range = rangeMax - rangeMin;\n\t\t\tFxaaFloat rangeMaxClamped = max(fxaaQualityEdgeThresholdMin, rangeMaxScaled);\n\t\t\tFxaaBool earlyExit = range < rangeMaxClamped;\n\t\t/*--------------------------------------------------------------------------*/\n\t\t\tif(earlyExit)\n\t\t\t\t#if (FXAA_DISCARD == 1)\n\t\t\t\t\tFxaaDiscard;\n\t\t\t\t#else\n\t\t\t\t\treturn rgbyM;\n\t\t\t\t#endif\n\t\t/*--------------------------------------------------------------------------*/\n\t\t\t#if (FXAA_GATHER4_ALPHA == 0)\n\t\t\t\t#if (FXAA_GLSL_100 == 1)\n\t\t\t\tFxaaFloat lumaNW = FxaaLuma(FxaaTexOff(tex, posM, FxaaFloat2(-1.0,-1.0), fxaaQualityRcpFrame.xy));\n\t\t\t\tFxaaFloat lumaSE = FxaaLuma(FxaaTexOff(tex, posM, FxaaFloat2( 1.0, 1.0), fxaaQualityRcpFrame.xy));\n\t\t\t\tFxaaFloat lumaNE = FxaaLuma(FxaaTexOff(tex, posM, FxaaFloat2( 1.0,-1.0), fxaaQualityRcpFrame.xy));\n\t\t\t\tFxaaFloat lumaSW = FxaaLuma(FxaaTexOff(tex, posM, FxaaFloat2(-1.0, 1.0), fxaaQualityRcpFrame.xy));\n\t\t\t\t#else\n\t\t\t\tFxaaFloat lumaNW = FxaaLuma(FxaaTexOff(tex, posM, FxaaInt2(-1,-1), fxaaQualityRcpFrame.xy));\n\t\t\t\tFxaaFloat lumaSE = FxaaLuma(FxaaTexOff(tex, posM, FxaaInt2( 1, 1), fxaaQualityRcpFrame.xy));\n\t\t\t\tFxaaFloat lumaNE = FxaaLuma(FxaaTexOff(tex, posM, FxaaInt2( 1,-1), fxaaQualityRcpFrame.xy));\n\t\t\t\tFxaaFloat lumaSW = FxaaLuma(FxaaTexOff(tex, posM, FxaaInt2(-1, 1), fxaaQualityRcpFrame.xy));\n\t\t\t\t#endif\n\t\t\t#else\n\t\t\t\tFxaaFloat lumaNE = FxaaLuma(FxaaTexOff(tex, posM, FxaaInt2(1, -1), fxaaQualityRcpFrame.xy));\n\t\t\t\tFxaaFloat lumaSW = FxaaLuma(FxaaTexOff(tex, posM, FxaaInt2(-1, 1), fxaaQualityRcpFrame.xy));\n\t\t\t#endif\n\t\t/*--------------------------------------------------------------------------*/\n\t\t\tFxaaFloat lumaNS = lumaN + lumaS;\n\t\t\tFxaaFloat lumaWE = lumaW + lumaE;\n\t\t\tFxaaFloat subpixRcpRange = 1.0/range;\n\t\t\tFxaaFloat subpixNSWE = lumaNS + lumaWE;\n\t\t\tFxaaFloat edgeHorz1 = (-2.0 * lumaM) + lumaNS;\n\t\t\tFxaaFloat edgeVert1 = (-2.0 * lumaM) + lumaWE;\n\t\t/*--------------------------------------------------------------------------*/\n\t\t\tFxaaFloat lumaNESE = lumaNE + lumaSE;\n\t\t\tFxaaFloat lumaNWNE = lumaNW + lumaNE;\n\t\t\tFxaaFloat edgeHorz2 = (-2.0 * lumaE) + lumaNESE;\n\t\t\tFxaaFloat edgeVert2 = (-2.0 * lumaN) + lumaNWNE;\n\t\t/*--------------------------------------------------------------------------*/\n\t\t\tFxaaFloat lumaNWSW = lumaNW + lumaSW;\n\t\t\tFxaaFloat lumaSWSE = lumaSW + lumaSE;\n\t\t\tFxaaFloat edgeHorz4 = (abs(edgeHorz1) * 2.0) + abs(edgeHorz2);\n\t\t\tFxaaFloat edgeVert4 = (abs(edgeVert1) * 2.0) + abs(edgeVert2);\n\t\t\tFxaaFloat edgeHorz3 = (-2.0 * lumaW) + lumaNWSW;\n\t\t\tFxaaFloat edgeVert3 = (-2.0 * lumaS) + lumaSWSE;\n\t\t\tFxaaFloat edgeHorz = abs(edgeHorz3) + edgeHorz4;\n\t\t\tFxaaFloat edgeVert = abs(edgeVert3) + edgeVert4;\n\t\t/*--------------------------------------------------------------------------*/\n\t\t\tFxaaFloat subpixNWSWNESE = lumaNWSW + lumaNESE;\n\t\t\tFxaaFloat lengthSign = fxaaQualityRcpFrame.x;\n\t\t\tFxaaBool horzSpan = edgeHorz >= edgeVert;\n\t\t\tFxaaFloat subpixA = subpixNSWE * 2.0 + subpixNWSWNESE;\n\t\t/*--------------------------------------------------------------------------*/\n\t\t\tif(!horzSpan) lumaN = lumaW;\n\t\t\tif(!horzSpan) lumaS = lumaE;\n\t\t\tif(horzSpan) lengthSign = fxaaQualityRcpFrame.y;\n\t\t\tFxaaFloat subpixB = (subpixA * (1.0/12.0)) - lumaM;\n\t\t/*--------------------------------------------------------------------------*/\n\t\t\tFxaaFloat gradientN = lumaN - lumaM;\n\t\t\tFxaaFloat gradientS = lumaS - lumaM;\n\t\t\tFxaaFloat lumaNN = lumaN + lumaM;\n\t\t\tFxaaFloat lumaSS = lumaS + lumaM;\n\t\t\tFxaaBool pairN = abs(gradientN) >= abs(gradientS);\n\t\t\tFxaaFloat gradient = max(abs(gradientN), abs(gradientS));\n\t\t\tif(pairN) lengthSign = -lengthSign;\n\t\t\tFxaaFloat subpixC = FxaaSat(abs(subpixB) * subpixRcpRange);\n\t\t/*--------------------------------------------------------------------------*/\n\t\t\tFxaaFloat2 posB;\n\t\t\tposB.x = posM.x;\n\t\t\tposB.y = posM.y;\n\t\t\tFxaaFloat2 offNP;\n\t\t\toffNP.x = (!horzSpan) ? 0.0 : fxaaQualityRcpFrame.x;\n\t\t\toffNP.y = ( horzSpan) ? 0.0 : fxaaQualityRcpFrame.y;\n\t\t\tif(!horzSpan) posB.x += lengthSign * 0.5;\n\t\t\tif( horzSpan) posB.y += lengthSign * 0.5;\n\t\t/*--------------------------------------------------------------------------*/\n\t\t\tFxaaFloat2 posN;\n\t\t\tposN.x = posB.x - offNP.x * FXAA_QUALITY_P0;\n\t\t\tposN.y = posB.y - offNP.y * FXAA_QUALITY_P0;\n\t\t\tFxaaFloat2 posP;\n\t\t\tposP.x = posB.x + offNP.x * FXAA_QUALITY_P0;\n\t\t\tposP.y = posB.y + offNP.y * FXAA_QUALITY_P0;\n\t\t\tFxaaFloat subpixD = ((-2.0)*subpixC) + 3.0;\n\t\t\tFxaaFloat lumaEndN = FxaaLuma(FxaaTexTop(tex, posN));\n\t\t\tFxaaFloat subpixE = subpixC * subpixC;\n\t\t\tFxaaFloat lumaEndP = FxaaLuma(FxaaTexTop(tex, posP));\n\t\t/*--------------------------------------------------------------------------*/\n\t\t\tif(!pairN) lumaNN = lumaSS;\n\t\t\tFxaaFloat gradientScaled = gradient * 1.0/4.0;\n\t\t\tFxaaFloat lumaMM = lumaM - lumaNN * 0.5;\n\t\t\tFxaaFloat subpixF = subpixD * subpixE;\n\t\t\tFxaaBool lumaMLTZero = lumaMM < 0.0;\n\t\t/*--------------------------------------------------------------------------*/\n\t\t\tlumaEndN -= lumaNN * 0.5;\n\t\t\tlumaEndP -= lumaNN * 0.5;\n\t\t\tFxaaBool doneN = abs(lumaEndN) >= gradientScaled;\n\t\t\tFxaaBool doneP = abs(lumaEndP) >= gradientScaled;\n\t\t\tif(!doneN) posN.x -= offNP.x * FXAA_QUALITY_P1;\n\t\t\tif(!doneN) posN.y -= offNP.y * FXAA_QUALITY_P1;\n\t\t\tFxaaBool doneNP = (!doneN) || (!doneP);\n\t\t\tif(!doneP) posP.x += offNP.x * FXAA_QUALITY_P1;\n\t\t\tif(!doneP) posP.y += offNP.y * FXAA_QUALITY_P1;\n\t\t/*--------------------------------------------------------------------------*/\n\t\t\tif(doneNP) {\n\t\t\t\tif(!doneN) lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy));\n\t\t\t\tif(!doneP) lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy));\n\t\t\t\tif(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5;\n\t\t\t\tif(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5;\n\t\t\t\tdoneN = abs(lumaEndN) >= gradientScaled;\n\t\t\t\tdoneP = abs(lumaEndP) >= gradientScaled;\n\t\t\t\tif(!doneN) posN.x -= offNP.x * FXAA_QUALITY_P2;\n\t\t\t\tif(!doneN) posN.y -= offNP.y * FXAA_QUALITY_P2;\n\t\t\t\tdoneNP = (!doneN) || (!doneP);\n\t\t\t\tif(!doneP) posP.x += offNP.x * FXAA_QUALITY_P2;\n\t\t\t\tif(!doneP) posP.y += offNP.y * FXAA_QUALITY_P2;\n\t\t/*--------------------------------------------------------------------------*/\n\t\t\t\t#if (FXAA_QUALITY_PS > 3)\n\t\t\t\tif(doneNP) {\n\t\t\t\t\tif(!doneN) lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy));\n\t\t\t\t\tif(!doneP) lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy));\n\t\t\t\t\tif(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5;\n\t\t\t\t\tif(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5;\n\t\t\t\t\tdoneN = abs(lumaEndN) >= gradientScaled;\n\t\t\t\t\tdoneP = abs(lumaEndP) >= gradientScaled;\n\t\t\t\t\tif(!doneN) posN.x -= offNP.x * FXAA_QUALITY_P3;\n\t\t\t\t\tif(!doneN) posN.y -= offNP.y * FXAA_QUALITY_P3;\n\t\t\t\t\tdoneNP = (!doneN) || (!doneP);\n\t\t\t\t\tif(!doneP) posP.x += offNP.x * FXAA_QUALITY_P3;\n\t\t\t\t\tif(!doneP) posP.y += offNP.y * FXAA_QUALITY_P3;\n\t\t/*--------------------------------------------------------------------------*/\n\t\t\t\t\t#if (FXAA_QUALITY_PS > 4)\n\t\t\t\t\tif(doneNP) {\n\t\t\t\t\t\tif(!doneN) lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy));\n\t\t\t\t\t\tif(!doneP) lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy));\n\t\t\t\t\t\tif(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5;\n\t\t\t\t\t\tif(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5;\n\t\t\t\t\t\tdoneN = abs(lumaEndN) >= gradientScaled;\n\t\t\t\t\t\tdoneP = abs(lumaEndP) >= gradientScaled;\n\t\t\t\t\t\tif(!doneN) posN.x -= offNP.x * FXAA_QUALITY_P4;\n\t\t\t\t\t\tif(!doneN) posN.y -= offNP.y * FXAA_QUALITY_P4;\n\t\t\t\t\t\tdoneNP = (!doneN) || (!doneP);\n\t\t\t\t\t\tif(!doneP) posP.x += offNP.x * FXAA_QUALITY_P4;\n\t\t\t\t\t\tif(!doneP) posP.y += offNP.y * FXAA_QUALITY_P4;\n\t\t/*--------------------------------------------------------------------------*/\n\t\t\t\t\t\t#if (FXAA_QUALITY_PS > 5)\n\t\t\t\t\t\tif(doneNP) {\n\t\t\t\t\t\t\tif(!doneN) lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy));\n\t\t\t\t\t\t\tif(!doneP) lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy));\n\t\t\t\t\t\t\tif(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5;\n\t\t\t\t\t\t\tif(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5;\n\t\t\t\t\t\t\tdoneN = abs(lumaEndN) >= gradientScaled;\n\t\t\t\t\t\t\tdoneP = abs(lumaEndP) >= gradientScaled;\n\t\t\t\t\t\t\tif(!doneN) posN.x -= offNP.x * FXAA_QUALITY_P5;\n\t\t\t\t\t\t\tif(!doneN) posN.y -= offNP.y * FXAA_QUALITY_P5;\n\t\t\t\t\t\t\tdoneNP = (!doneN) || (!doneP);\n\t\t\t\t\t\t\tif(!doneP) posP.x += offNP.x * FXAA_QUALITY_P5;\n\t\t\t\t\t\t\tif(!doneP) posP.y += offNP.y * FXAA_QUALITY_P5;\n\t\t/*--------------------------------------------------------------------------*/\n\t\t\t\t\t\t\t#if (FXAA_QUALITY_PS > 6)\n\t\t\t\t\t\t\tif(doneNP) {\n\t\t\t\t\t\t\t\tif(!doneN) lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy));\n\t\t\t\t\t\t\t\tif(!doneP) lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy));\n\t\t\t\t\t\t\t\tif(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5;\n\t\t\t\t\t\t\t\tif(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5;\n\t\t\t\t\t\t\t\tdoneN = abs(lumaEndN) >= gradientScaled;\n\t\t\t\t\t\t\t\tdoneP = abs(lumaEndP) >= gradientScaled;\n\t\t\t\t\t\t\t\tif(!doneN) posN.x -= offNP.x * FXAA_QUALITY_P6;\n\t\t\t\t\t\t\t\tif(!doneN) posN.y -= offNP.y * FXAA_QUALITY_P6;\n\t\t\t\t\t\t\t\tdoneNP = (!doneN) || (!doneP);\n\t\t\t\t\t\t\t\tif(!doneP) posP.x += offNP.x * FXAA_QUALITY_P6;\n\t\t\t\t\t\t\t\tif(!doneP) posP.y += offNP.y * FXAA_QUALITY_P6;\n\t\t/*--------------------------------------------------------------------------*/\n\t\t\t\t\t\t\t\t#if (FXAA_QUALITY_PS > 7)\n\t\t\t\t\t\t\t\tif(doneNP) {\n\t\t\t\t\t\t\t\t\tif(!doneN) lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy));\n\t\t\t\t\t\t\t\t\tif(!doneP) lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy));\n\t\t\t\t\t\t\t\t\tif(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5;\n\t\t\t\t\t\t\t\t\tif(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5;\n\t\t\t\t\t\t\t\t\tdoneN = abs(lumaEndN) >= gradientScaled;\n\t\t\t\t\t\t\t\t\tdoneP = abs(lumaEndP) >= gradientScaled;\n\t\t\t\t\t\t\t\t\tif(!doneN) posN.x -= offNP.x * FXAA_QUALITY_P7;\n\t\t\t\t\t\t\t\t\tif(!doneN) posN.y -= offNP.y * FXAA_QUALITY_P7;\n\t\t\t\t\t\t\t\t\tdoneNP = (!doneN) || (!doneP);\n\t\t\t\t\t\t\t\t\tif(!doneP) posP.x += offNP.x * FXAA_QUALITY_P7;\n\t\t\t\t\t\t\t\t\tif(!doneP) posP.y += offNP.y * FXAA_QUALITY_P7;\n\t\t/*--------------------------------------------------------------------------*/\n\t\t\t#if (FXAA_QUALITY_PS > 8)\n\t\t\tif(doneNP) {\n\t\t\t\tif(!doneN) lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy));\n\t\t\t\tif(!doneP) lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy));\n\t\t\t\tif(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5;\n\t\t\t\tif(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5;\n\t\t\t\tdoneN = abs(lumaEndN) >= gradientScaled;\n\t\t\t\tdoneP = abs(lumaEndP) >= gradientScaled;\n\t\t\t\tif(!doneN) posN.x -= offNP.x * FXAA_QUALITY_P8;\n\t\t\t\tif(!doneN) posN.y -= offNP.y * FXAA_QUALITY_P8;\n\t\t\t\tdoneNP = (!doneN) || (!doneP);\n\t\t\t\tif(!doneP) posP.x += offNP.x * FXAA_QUALITY_P8;\n\t\t\t\tif(!doneP) posP.y += offNP.y * FXAA_QUALITY_P8;\n\t\t/*--------------------------------------------------------------------------*/\n\t\t\t\t#if (FXAA_QUALITY_PS > 9)\n\t\t\t\tif(doneNP) {\n\t\t\t\t\tif(!doneN) lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy));\n\t\t\t\t\tif(!doneP) lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy));\n\t\t\t\t\tif(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5;\n\t\t\t\t\tif(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5;\n\t\t\t\t\tdoneN = abs(lumaEndN) >= gradientScaled;\n\t\t\t\t\tdoneP = abs(lumaEndP) >= gradientScaled;\n\t\t\t\t\tif(!doneN) posN.x -= offNP.x * FXAA_QUALITY_P9;\n\t\t\t\t\tif(!doneN) posN.y -= offNP.y * FXAA_QUALITY_P9;\n\t\t\t\t\tdoneNP = (!doneN) || (!doneP);\n\t\t\t\t\tif(!doneP) posP.x += offNP.x * FXAA_QUALITY_P9;\n\t\t\t\t\tif(!doneP) posP.y += offNP.y * FXAA_QUALITY_P9;\n\t\t/*--------------------------------------------------------------------------*/\n\t\t\t\t\t#if (FXAA_QUALITY_PS > 10)\n\t\t\t\t\tif(doneNP) {\n\t\t\t\t\t\tif(!doneN) lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy));\n\t\t\t\t\t\tif(!doneP) lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy));\n\t\t\t\t\t\tif(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5;\n\t\t\t\t\t\tif(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5;\n\t\t\t\t\t\tdoneN = abs(lumaEndN) >= gradientScaled;\n\t\t\t\t\t\tdoneP = abs(lumaEndP) >= gradientScaled;\n\t\t\t\t\t\tif(!doneN) posN.x -= offNP.x * FXAA_QUALITY_P10;\n\t\t\t\t\t\tif(!doneN) posN.y -= offNP.y * FXAA_QUALITY_P10;\n\t\t\t\t\t\tdoneNP = (!doneN) || (!doneP);\n\t\t\t\t\t\tif(!doneP) posP.x += offNP.x * FXAA_QUALITY_P10;\n\t\t\t\t\t\tif(!doneP) posP.y += offNP.y * FXAA_QUALITY_P10;\n\t\t/*--------------------------------------------------------------------------*/\n\t\t\t\t\t\t#if (FXAA_QUALITY_PS > 11)\n\t\t\t\t\t\tif(doneNP) {\n\t\t\t\t\t\t\tif(!doneN) lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy));\n\t\t\t\t\t\t\tif(!doneP) lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy));\n\t\t\t\t\t\t\tif(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5;\n\t\t\t\t\t\t\tif(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5;\n\t\t\t\t\t\t\tdoneN = abs(lumaEndN) >= gradientScaled;\n\t\t\t\t\t\t\tdoneP = abs(lumaEndP) >= gradientScaled;\n\t\t\t\t\t\t\tif(!doneN) posN.x -= offNP.x * FXAA_QUALITY_P11;\n\t\t\t\t\t\t\tif(!doneN) posN.y -= offNP.y * FXAA_QUALITY_P11;\n\t\t\t\t\t\t\tdoneNP = (!doneN) || (!doneP);\n\t\t\t\t\t\t\tif(!doneP) posP.x += offNP.x * FXAA_QUALITY_P11;\n\t\t\t\t\t\t\tif(!doneP) posP.y += offNP.y * FXAA_QUALITY_P11;\n\t\t/*--------------------------------------------------------------------------*/\n\t\t\t\t\t\t\t#if (FXAA_QUALITY_PS > 12)\n\t\t\t\t\t\t\tif(doneNP) {\n\t\t\t\t\t\t\t\tif(!doneN) lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy));\n\t\t\t\t\t\t\t\tif(!doneP) lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy));\n\t\t\t\t\t\t\t\tif(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5;\n\t\t\t\t\t\t\t\tif(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5;\n\t\t\t\t\t\t\t\tdoneN = abs(lumaEndN) >= gradientScaled;\n\t\t\t\t\t\t\t\tdoneP = abs(lumaEndP) >= gradientScaled;\n\t\t\t\t\t\t\t\tif(!doneN) posN.x -= offNP.x * FXAA_QUALITY_P12;\n\t\t\t\t\t\t\t\tif(!doneN) posN.y -= offNP.y * FXAA_QUALITY_P12;\n\t\t\t\t\t\t\t\tdoneNP = (!doneN) || (!doneP);\n\t\t\t\t\t\t\t\tif(!doneP) posP.x += offNP.x * FXAA_QUALITY_P12;\n\t\t\t\t\t\t\t\tif(!doneP) posP.y += offNP.y * FXAA_QUALITY_P12;\n\t\t/*--------------------------------------------------------------------------*/\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t#endif\n\t\t/*--------------------------------------------------------------------------*/\n\t\t\t\t\t\t}\n\t\t\t\t\t\t#endif\n\t\t/*--------------------------------------------------------------------------*/\n\t\t\t\t\t}\n\t\t\t\t\t#endif\n\t\t/*--------------------------------------------------------------------------*/\n\t\t\t\t}\n\t\t\t\t#endif\n\t\t/*--------------------------------------------------------------------------*/\n\t\t\t}\n\t\t\t#endif\n\t\t/*--------------------------------------------------------------------------*/\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t#endif\n\t\t/*--------------------------------------------------------------------------*/\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t#endif\n\t\t/*--------------------------------------------------------------------------*/\n\t\t\t\t\t\t}\n\t\t\t\t\t\t#endif\n\t\t/*--------------------------------------------------------------------------*/\n\t\t\t\t\t}\n\t\t\t\t\t#endif\n\t\t/*--------------------------------------------------------------------------*/\n\t\t\t\t}\n\t\t\t\t#endif\n\t\t/*--------------------------------------------------------------------------*/\n\t\t\t}\n\t\t/*--------------------------------------------------------------------------*/\n\t\t\tFxaaFloat dstN = posM.x - posN.x;\n\t\t\tFxaaFloat dstP = posP.x - posM.x;\n\t\t\tif(!horzSpan) dstN = posM.y - posN.y;\n\t\t\tif(!horzSpan) dstP = posP.y - posM.y;\n\t\t/*--------------------------------------------------------------------------*/\n\t\t\tFxaaBool goodSpanN = (lumaEndN < 0.0) != lumaMLTZero;\n\t\t\tFxaaFloat spanLength = (dstP + dstN);\n\t\t\tFxaaBool goodSpanP = (lumaEndP < 0.0) != lumaMLTZero;\n\t\t\tFxaaFloat spanLengthRcp = 1.0/spanLength;\n\t\t/*--------------------------------------------------------------------------*/\n\t\t\tFxaaBool directionN = dstN < dstP;\n\t\t\tFxaaFloat dst = min(dstN, dstP);\n\t\t\tFxaaBool goodSpan = directionN ? goodSpanN : goodSpanP;\n\t\t\tFxaaFloat subpixG = subpixF * subpixF;\n\t\t\tFxaaFloat pixelOffset = (dst * (-spanLengthRcp)) + 0.5;\n\t\t\tFxaaFloat subpixH = subpixG * fxaaQualitySubpix;\n\t\t/*--------------------------------------------------------------------------*/\n\t\t\tFxaaFloat pixelOffsetGood = goodSpan ? pixelOffset : 0.0;\n\t\t\tFxaaFloat pixelOffsetSubpix = max(pixelOffsetGood, subpixH);\n\t\t\tif(!horzSpan) posM.x += pixelOffsetSubpix * lengthSign;\n\t\t\tif( horzSpan) posM.y += pixelOffsetSubpix * lengthSign;\n\t\t\t#if (FXAA_DISCARD == 1)\n\t\t\t\treturn FxaaTexTop(tex, posM);\n\t\t\t#else\n\t\t\t\treturn FxaaFloat4(FxaaTexTop(tex, posM).xyz, lumaM);\n\t\t\t#endif\n\t\t}\n\t\t/*==========================================================================*/\n\t\t#endif\n\n\t\tvoid main() {\n\t\t\tgl_FragColor = FxaaPixelShader(\n\t\t\t\tv_Uv,\n\t\t\t\tvec4(0.0),\n\t\t\t\ttDiffuse,\n\t\t\t\ttDiffuse,\n\t\t\t\ttDiffuse,\n\t\t\t\t1.0 / u_RenderTargetSize,\n\t\t\t\tvec4(0.0),\n\t\t\t\tvec4(0.0),\n\t\t\t\tvec4(0.0),\n\t\t\t\t0.75,\n\t\t\t\t0.166,\n\t\t\t\t0.0833,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\tvec4(0.0)\n\t\t\t);\n\n\t\t\t// TODO avoid querying texture twice for same texel\n\t\t\tgl_FragColor.a = texture2D(tDiffuse, v_Uv).a;\n\t\t}\n\t`\n};\n\nexport { FXAAShader };"
  },
  {
    "path": "examples/jsm/shaders/FastGaussianBlurShader.js",
    "content": "/**\n * Fast Gaussian blur shader\n * ref: https://github.com/Jam3/glsl-fast-gaussian-blur\n * ref: http://rastergrid.com/blog/2010/09/efficient-gaussian-blur-with-linear-sampling/\n */\nconst FastGaussianBlurShader = {\n\tname: 'fast_gaussian_blur',\n\n\tdefines: {\n\t\t'SAMPLERS': 9\n\t},\n\n\tuniforms: {\n\t\t'tDiffuse': null,\n\t\t'direction': [1, 0]\n\t},\n\n\tvertexShader: `\n        attribute vec3 a_Position;\n        attribute vec2 a_Uv;\n\n        uniform mat4 u_ProjectionView;\n        uniform mat4 u_Model;\n\n        varying vec2 v_Uv;\n\n        void main() {\n            v_Uv = a_Uv;\n            gl_Position = u_ProjectionView * u_Model * vec4(a_Position, 1.0);\n        }\n    `,\n\n\tfragmentShader: `\n        uniform sampler2D tDiffuse;\n        uniform vec2 u_RenderTargetSize;\n        uniform vec2 direction;\n        varying vec2 v_Uv;\n\n        #if (SAMPLERS == 5)\n            vec4 blur(sampler2D image, vec2 uv, vec2 pixelSize, vec2 direction) {\n                vec4 color = vec4(0.0);\n                vec2 off1 = vec2(1.3333333333333333) * direction;\n                color += texture2D(image, uv) * 0.29411764705882354;\n                color += texture2D(image, uv + (off1 * pixelSize)) * 0.35294117647058826;\n                color += texture2D(image, uv - (off1 * pixelSize)) * 0.35294117647058826;\n                return color;\n            }\n        #endif\n        #if (SAMPLERS == 9)\n            vec4 blur(sampler2D image, vec2 uv, vec2 pixelSize, vec2 direction) {\n                vec4 color = vec4(0.0);\n                vec2 off1 = vec2(1.3846153846) * direction;\n                vec2 off2 = vec2(3.2307692308) * direction;\n                color += texture2D(image, uv) * 0.2270270270;\n                color += texture2D(image, uv + (off1 * pixelSize)) * 0.3162162162;\n                color += texture2D(image, uv - (off1 * pixelSize)) * 0.3162162162;\n                color += texture2D(image, uv + (off2 * pixelSize)) * 0.0702702703;\n                color += texture2D(image, uv - (off2 * pixelSize)) * 0.0702702703;\n                return color;\n            }\n        #endif\n        #if (SAMPLERS == 13)\n            vec4 blur(sampler2D image, vec2 uv, vec2 pixelSize, vec2 direction) {\n                vec4 color = vec4(0.0);\n                vec2 off1 = vec2(1.411764705882353) * direction;\n                vec2 off2 = vec2(3.2941176470588234) * direction;\n                vec2 off3 = vec2(5.176470588235294) * direction;\n                color += texture2D(image, uv) * 0.1964825501511404;\n                color += texture2D(image, uv + (off1 * pixelSize)) * 0.2969069646728344;\n                color += texture2D(image, uv - (off1 * pixelSize)) * 0.2969069646728344;\n                color += texture2D(image, uv + (off2 * pixelSize)) * 0.09447039785044732;\n                color += texture2D(image, uv - (off2 * pixelSize)) * 0.09447039785044732;\n                color += texture2D(image, uv + (off3 * pixelSize)) * 0.010381362401148057;\n                color += texture2D(image, uv - (off3 * pixelSize)) * 0.010381362401148057;\n                return color;\n            }\n        #endif\n\n        void main() {\n            gl_FragColor = blur(tDiffuse, v_Uv, 1.0 / u_RenderTargetSize, direction);\n        }\n    `\n};\n\nexport { FastGaussianBlurShader };"
  },
  {
    "path": "examples/jsm/shaders/FilmShader.js",
    "content": "/**\n * Film Shader\n */\nconst FilmShader = {\n\tname: 'film',\n\n\tuniforms: {\n\t\t'tDiffuse': null,\n\t\t'time': 0.0,\n\t\t'nIntensity': 0.8,\n\t\t'sIntensity': 0.3,\n\t\t'sCount': 4096,\n\t\t'grayscale': 0\n\t},\n\n\tvertexShader: `\n\t\tattribute vec3 a_Position;\n\t\tattribute vec2 a_Uv;\n\n\t\tuniform mat4 u_ProjectionView;\n\t\tuniform mat4 u_Model;\n\n\t\tvarying vec2 v_Uv;\n\n\t\tvoid main() {\n\t\t\tv_Uv = a_Uv;\n\t\t\tgl_Position = u_ProjectionView * u_Model * vec4(a_Position, 1.0);\n\t\t}\n\t`,\n\n\tfragmentShader: `\n\t\t// control parameter\n\t\tuniform float time;\n\n\t\tuniform bool grayscale;\n\n\t\t// noise effect intensity value (0 = no effect, 1 = full effect)\n\t\tuniform float nIntensity;\n\n\t\t// scanlines effect intensity value (0 = no effect, 1 = full effect)\n\t\tuniform float sIntensity;\n\n\t\t// scanlines effect count value (0 = no effect, 4096 = full effect)\n\t\tuniform float sCount;\n\n\t\tuniform sampler2D tDiffuse;\n\n\t\tvarying vec2 v_Uv;\n\n\t\tvoid main() {\n\t\t\t// sample the source\n\t\t\tvec4 cTextureScreen = texture2D(tDiffuse, v_Uv);\n\n\t\t\t// make some noise\n\t\t\tfloat dx = rand(v_Uv + time);\n\n\t\t\t// add noise\n\t\t\tvec3 cResult = cTextureScreen.rgb + cTextureScreen.rgb * clamp(0.1 + dx, 0.0, 1.0);\n\n\t\t\t// get us a sine and cosine\n\t\t\tvec2 sc = vec2(sin(v_Uv.y * sCount), cos(v_Uv.y * sCount));\n\n\t\t\t// add scanlines\n\t\t\tcResult += cTextureScreen.rgb * vec3(sc.x, sc.y, sc.x) * sIntensity;\n\n\t\t\t// interpolate between source and result by intensity\n\t\t\tcResult = cTextureScreen.rgb + clamp(nIntensity, 0.0, 1.0) * (cResult - cTextureScreen.rgb);\n\n\t\t\t// convert to grayscale if desired\n\t\t\tif(grayscale) {\n\t\t    \tcResult = vec3(cResult.r * 0.3 + cResult.g * 0.59 + cResult.b * 0.11);\n\t\t\t}\n\n\t\t\tgl_FragColor =  vec4(cResult, cTextureScreen.a);\n\t\t}\n\t`\n};\n\nexport { FilmShader };"
  },
  {
    "path": "examples/jsm/shaders/GroundProjectedSkyboxShader.js",
    "content": "const GroundProjectedSkyboxShader = {\n\tname: 'ground_projected_skybox',\n\n\tdefines: {\n\t\tGAMMA: false,\n\t\tPANORAMA: false\n\t},\n\n\tuniforms: {\n\t\tlevel: 0,\n\t\tflip: -1,\n\t\theight: 15,\n\t\tradius: 100\n\t},\n\n\tvertexShader: `\n\t\t#include <common_vert>\n\n\t\tvarying vec3 vDir;\n\n\t\tmat4 clearMat4Translate(mat4 m) {\n\t\t\tmat4 outMatrix = m;\n\t\t\toutMatrix[3].xyz = vec3(0., 0., 0.);\n\t\t\treturn outMatrix;\n\t\t}\n\n\t\tvoid main() {\n\t\t\tmat4 modelMatrix = clearMat4Translate(u_Model);\n\t\t\tmat4 viewMatrix = clearMat4Translate(u_View);\n\n\t\t\tvDir = normalize((modelMatrix * vec4(a_Position, 0.0)).xyz);\n\n\t\t\tgl_Position = u_Projection * viewMatrix * modelMatrix * vec4(a_Position, 1.0);\n\t\t\tgl_Position.z = gl_Position.w;\n\t\t}\n    `,\n\n\tfragmentShader: `\n        #include <common_frag>\n\n\t\t#ifdef PANORAMA\n\t\t\tuniform sampler2D diffuseMap; \n        #else\n\t\t\tuniform samplerCube cubeMap;\n\t\t#endif\n\n\t\tuniform float flip;\n\t\tuniform float level;\n\n\t\tvarying vec3 vDir;\n\n\t\tuniform float radius;\n        uniform float height;\n\n        // From: https://www.shadertoy.com/view/4tsBD7\n        float diskIntersectWithBackFaceCulling(vec3 ro, vec3 rd, vec3 c, vec3 n, float r) {\n            float d = dot (rd, n);\n\n            if(d > 0.0) { return 1e6; }\n\n            vec3 o = ro - c;\n            float t = - dot(n, o) / d;\n            vec3 q = o + rd * t;\n\n            return (dot(q, q) < r * r) ? t : 1e6;\n        }\n\n        // From: https://www.iquilezles.org/www/articles/intersectors/intersectors.htm\n        float sphereIntersect(vec3 ro, vec3 rd, vec3 ce, float ra) {\n            vec3 oc = ro - ce;\n            float b = dot(oc, rd);\n            float c = dot(oc, oc) - ra * ra;\n            float h = b * b - c;\n\n            if(h < 0.0) { return -1.0; }\n\n            h = sqrt(h);\n\n            return - b + h;\n        }\n\n        vec3 project() {\n            vec3 p = normalize(vDir);\n            vec3 camPos = u_CameraPosition;\n            camPos.y -= height;\n\n            float intersection = sphereIntersect(camPos, p, vec3(0.0), radius);\n            if (intersection > 0.0) {\n                vec3 h = vec3(0.0, - height, 0.0);\n                float intersection2 = diskIntersectWithBackFaceCulling(camPos, p, h, vec3(0.0, 1.0, 0.0), radius);\n                p = (camPos + min(intersection, intersection2) * p) / radius;\n            } else {\n                p = vec3(0.0, 0.0, 0.0);\n            }\n\n            return p;\n        }\n\n        void main() {\n\t\t\t#include <begin_frag>\n\n            vec3 projectedWorldPosition = project();\n\t\t\tvec3 V = normalize(projectedWorldPosition);\n\n            #ifdef PANORAMA\n\t\t\t\tfloat phi = acos(V.y);\n\t\t\t\t// consistent with cubemap.\n\t\t\t\t// atan(y, x) is same with atan2 ?\n\t\t\t\tfloat theta = flip * atan(V.x, V.z) + PI * 0.5;\n\t\t\t\tvec2 uv = vec2(theta / 2.0 / PI, -phi / PI);\n\t\t\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\t\t\toutColor *= mapTexelToLinear(texture2DLodEXT(diffuseMap, fract(uv), level));\n\t\t\t\t#else\n\t\t\t\t\toutColor *= mapTexelToLinear(texture2D(diffuseMap, fract(uv), level));\n\t\t\t\t#endif\n\t\t\t#else\n\t\t\t\tvec3 coordVec = vec3(flip * V.x, V.yz);\n\t\t\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\t\t\toutColor *= mapTexelToLinear(textureCubeLodEXT(cubeMap, coordVec, level));\n\t\t\t\t#else\n\t\t\t\t\toutColor *= mapTexelToLinear(textureCube(cubeMap, coordVec, level));\n\t\t\t\t#endif\n\t\t\t#endif\n\n\t\t\t#include <end_frag>\n\t\t\t#ifdef GAMMA\n\t\t\t\t#include <encodings_frag>\n\t\t\t#endif\n        }\n\n    `\n};\n\nexport { GroundProjectedSkyboxShader };"
  },
  {
    "path": "examples/jsm/shaders/InfiniteGridShader.js",
    "content": "// ref: https://github.com/galacean/engine-toolkit/blob/main/packages/custom-material/src/grid/Grid.shader\nconst InfiniteGridShader = {\n\tname: 'infinite_grid',\n\n\tdefines: {\n\t\tUSE_LINEARFADE: true\n\t},\n\n\tuniforms: {\n\t\tflipProgress: 0.0,\n\t\taxisIntensity: 0.7,\n\t\tgridIntensity: 0.2,\n\t\tprimaryScale: 5,\n\t\tsecondaryScale: 1,\n\t\tprimaryFade: 0.7,\n\t\tsecondaryFade: 0.4,\n\t\tstart: 30,\n\t\tend: 100\n\t},\n\n\tvertexShader: `\n        #include <common_vert>\n\n        varying vec3 nearPoint;\n        varying vec3 farPoint;\n\n        vec3 unprojectPoint(float x, float y, float z, mat4 pvmInverse) {\n            vec4 unprojectedPoint = pvmInverse * vec4(x, y, z, 1.0);\n            return unprojectedPoint.xyz / unprojectedPoint.w;\n        }\n\n        void main() {\n            mat4 pvmInverse = inverseMat4(u_Projection * u_View * u_Model);\n\n            nearPoint = unprojectPoint(a_Position.x, a_Position.y, -1.0, pvmInverse); // unprojecting on the near plane\n            farPoint = unprojectPoint(a_Position.x, a_Position.y, 1.0, pvmInverse); // unprojecting on the far plane\n\n            gl_Position = vec4(a_Position, 1.0); // using directly the clipped coordinates\n        }\n    `,\n\n\tfragmentShader: `\n        uniform mat4 u_ProjectionView;\n        uniform mat4 u_View;\n        uniform mat4 u_Model;\n\n        uniform float flipProgress;\n        uniform float axisIntensity;\n        uniform float gridIntensity;\n        uniform float primaryScale;\n        uniform float secondaryScale;\n        uniform float primaryFade;\n        uniform float secondaryFade;\n        uniform float start;\n        uniform float end;\n\n        varying vec3 nearPoint;\n        varying vec3 farPoint;\n\n        vec4 grid(vec3 fragPos3D, float scale, float alpha) {\n            vec2 coord = mix(fragPos3D.xz, fragPos3D.xy, flipProgress) / scale; // use the scale variable to set the distance between the lines\n            vec2 derivative = fwidth(coord);\n            vec2 grid = abs(fract(coord - 0.5) - 0.5) / derivative;\n            float line = min(grid.x, grid.y);\n            float minimumz = min(derivative.y, 1.0);\n            float minimumx = min(derivative.x, 1.0);\n            vec4 color = vec4(gridIntensity, gridIntensity, gridIntensity, 1.0 - min(line, 1.0));\n\n            // z axis\n            if(fragPos3D.x >= -axisIntensity * minimumx && fragPos3D.x <= axisIntensity * minimumx) {\n                color *= vec4(0.0, 0.0, 4.0, 1.0);\n                color.b = clamp(color.b, 0.0, 1.0);\n            }\n                \n            // x axis and y axis\n            float xy = mix(fragPos3D.z, fragPos3D.y, flipProgress);\n            if(xy >= -axisIntensity * minimumz && xy <= axisIntensity * minimumz) {\n                color *= vec4(4.0, 0.0, 0.0, 1.0);\n                color.r = clamp(color.r, 0.0, 1.0);\n            }\n                \n            color.a *= alpha;\n\n            return color;\n        }\n\n        float computeDepth(vec3 pos) {\n            vec4 clip_space_pos = u_ProjectionView * u_Model * vec4(pos.xyz, 1.0);\n            return (clip_space_pos.z / clip_space_pos.w) * 0.5 + 0.5;\n        }\n\n        float computeLinearDepth(vec3 pos) {\n            vec4 view_space_pos = u_View * u_Model * vec4(pos.xyz, 1.0);\n            float view_space_depth = abs(view_space_pos.z) / view_space_pos.w;\n            float linearDepth = max(0., view_space_depth - start) / (end - start);\n            return linearDepth;\n        }\n\n        void main() {\n            float ty = -nearPoint.y / (farPoint.y - nearPoint.y);\n            float tz = -nearPoint.z / (farPoint.z - nearPoint.z);\n            float t = mix(ty, tz, flipProgress);\n            vec3 fragPos3D = nearPoint + t * (farPoint - nearPoint);\n            \n            gl_FragDepthEXT = computeDepth(fragPos3D);\n\n            gl_FragColor = (grid(fragPos3D, primaryScale, primaryFade) + grid(fragPos3D, secondaryScale, secondaryFade)) * float(t > 0.0);\n\n            #ifdef USE_LINEARFADE\n                float linearDepth = computeLinearDepth(fragPos3D);\n                gl_FragColor.a *= max(0.0, 1.0 - linearDepth);\n            #endif\n        }\n    `\n};\n\nexport { InfiniteGridShader };"
  },
  {
    "path": "examples/jsm/shaders/LineDashedShader.js",
    "content": "/**\n * Line Dashed Shader\n */\nconst LineDashedShader = {\n\tname: 'line_dashed',\n\n\tuniforms: {\n\t\t'scale': 1, // The scale of the dashed part of a line.\n\t\t'dashSize': 2, // The size of the dash. This is both the gap with the stroke.\n\t\t'totalSize': 4 // The size of the gap.\n\t},\n\n\tvertexShader: `\n\t\t#include <common_vert>\n\n\t\tuniform float scale;\n\t\tattribute float lineDistance;\n\n\t\tvarying float vLineDistance;\n\n\t\tvoid main() {\n\t\t\tvLineDistance = scale * lineDistance;\n\t\t\tvec3 transformed = vec3(a_Position);\n\t\t\t#include <pvm_vert>\n\t\t}\n\t`,\n\n\tfragmentShader: `\n\t\t#include <common_frag>\n\t\t#include <fog_pars_frag>\n\n\t\tuniform float dashSize;\n\t\tuniform float totalSize;\n\n\t\tvarying float vLineDistance;\n\n\t\tvoid main() {\n\t\t\tif (mod(vLineDistance, totalSize) > dashSize) {\n\t\t\t\tdiscard;\n\t\t\t}\n\n\t\t\t#include <begin_frag>\n\t\t\t#include <end_frag>\n\t\t\t#include <premultipliedAlpha_frag>\n\t\t\t#include <fog_frag>\n\t\t}\n\t`\n};\n\nexport { LineDashedShader };"
  },
  {
    "path": "examples/jsm/shaders/LuminosityHighPassShader.js",
    "content": "// ref: github.com/mrdoob/three.js/blob/dev/examples/jsm/shaders/LuminosityHighPassShader.js\n\nconst LuminosityHighPassShader = {\n\tname: 'luminosityHighPass',\n\n\tuniforms: {\n\t\t'tDiffuse': null,\n\t\t'luminosityThreshold': 1.0,\n\t\t'smoothWidth': 0.01,\n\t\t'defaultColor': [0, 0, 0],\n\t\t'defaultOpacity': 0.0\n\t},\n\n\tvertexShader: `\n\t\tattribute vec3 a_Position;\n\t\tattribute vec2 a_Uv;\n\t\t\n\t\tuniform mat4 u_ProjectionView;\n\t\tuniform mat4 u_Model;\n\t\t\n\t\tvarying vec2 v_Uv;\n\t\t\n\t\tvoid main() {\n\t\t\tv_Uv = a_Uv;\n\t\t\tgl_Position = u_ProjectionView * u_Model * vec4( a_Position, 1.0 );\n\t\t}\n\t`,\n\n\tfragmentShader: `\n\t\tuniform sampler2D tDiffuse;\n\t\tuniform vec3 defaultColor;\n\t\tuniform float defaultOpacity;\n\t\tuniform float luminosityThreshold;\n\t\tuniform float smoothWidth;\n\n\t\tvarying vec2 v_Uv;\n\t\t\n\t\tvoid main() {\n\t\t\tvec4 texel = texture2D(tDiffuse, v_Uv);\n\t\t\tvec3 luma = vec3(0.299, 0.587, 0.114);\n\t\t\tfloat v = dot(texel.xyz, luma);\n\t\t\tvec4 outputColor = vec4(defaultColor.rgb, defaultOpacity);\n\t\t\tfloat alpha = smoothstep(luminosityThreshold, luminosityThreshold + smoothWidth, v);\n\t\t\tgl_FragColor = mix(outputColor, texel, alpha);\n\t\t}\n\t`\n};\n\nexport { LuminosityHighPassShader };"
  },
  {
    "path": "examples/jsm/shaders/MSDFTextShader.js",
    "content": "console.warn('MSDFTextShader has been deprecated since v0.4.1.');\n\n// reference - https://github.com/leochocolat/three-msdf-text-utils/tree/main/src/MSDFTextMaterial/shaders\nconst MSDFTextShader = {\n\tname: 'msdf_text',\n\n\tdefines: {\n\t\tIS_SMALL: false,\n\t\tIS_STOKED: false\n\t},\n\n\tuniforms: {\n\t\tuMap: null,\n\t\tuAlphaTest: 0.01,\n\t\tuStrokeColor: [1, 0, 0],\n\t\tuStrokeOutsetWidth: 0,\n\t\tuStrokeInsetWidth: 0.3,\n\t\tuThreshold: 0.05\n\t},\n\n\tvertexShader: `\n\t\tattribute vec3 a_Position;\n\t\tattribute vec2 a_Uv;\n\n\t\tuniform mat4 u_ProjectionView;\n\t\tuniform mat4 u_Model;\n\n\t\tvarying vec2 v_Uv;\n\n\t\tvoid main() {\n\t\t\tgl_Position = u_ProjectionView * u_Model * vec4(a_Position, 1.0);\n\t\t\tv_Uv = a_Uv;\n\t\t}\n\t`,\n\n\tfragmentShader: `\n\t\tuniform vec3 u_Color;\n\t\tuniform float u_Opacity;\n\n\t\tuniform sampler2D uMap;\n\n\t\tuniform float uAlphaTest;\n\n\t\tuniform vec3 uStrokeColor;\n\t\tuniform float uStrokeOutsetWidth;\n\t\tuniform float uStrokeInsetWidth;\n\n\t\tuniform float uThreshold;\n\n\t\tvarying vec2 v_Uv;\n\n\t\tfloat median(float r, float g, float b) {\n\t\t\treturn max(min(r, g), min(max(r, g), b));\n\t\t}\n\n\t\tvoid main() {\n\t\t\tvec3 s = texture2D(uMap, v_Uv).rgb;\n\n\t\t\tfloat sigDist = median(s.r, s.g, s.b) - 0.5;\n\t\t\tfloat afwidth = 1.4142135623730951 / 2.0;\n\n\t\t\t#ifdef IS_SMALL\n\t\t\t\tfloat alpha = smoothstep(uThreshold - afwidth, uThreshold + afwidth, sigDist);\n\t\t\t#else\n\t\t\t\tfloat alpha = clamp(sigDist / fwidth(sigDist) + 0.5, 0.0, 1.0);\n\t\t\t#endif\n\n\t\t\tif(alpha < uAlphaTest) discard;\n\n\t\t\t#ifdef IS_STOKED\n\t\t\t\tfloat sigDistOutset = sigDist + uStrokeOutsetWidth * 0.5;\n\t\t\t\tfloat sigDistInset = sigDist - uStrokeInsetWidth * 0.5;\n\t\t\t\t#ifdef IS_SMALL\n\t\t\t\t\tfloat outset = smoothstep(uThreshold-afwidth, uThreshold+afwidth, sigDistOutset);\n\t\t\t\t\tfloat inset = 1.0-smoothstep(uThreshold-afwidth, uThreshold+afwidth, sigDistInset);\n\t\t\t\t#else\n\t\t\t\t\tfloat outset = clamp(sigDistOutset/fwidth(sigDistOutset)+0.5, 0.0, 1.0);\n\t\t\t\t\tfloat inset = 1.0-clamp(sigDistInset/fwidth(sigDistInset)+0.5, 0.0, 1.0);\n\t\t\t\t#endif\n\t\t\t\tfloat border = outset * inset;\n\t\t\t\tgl_FragColor = vec4(uStrokeColor, u_Opacity * border);\n\t\t\t#else\n\t\t\t\tgl_FragColor = vec4(u_Color, u_Opacity * alpha);\n\t\t\t#endif\n\t\t}\n\t`\n};\n\nexport { MSDFTextShader };"
  },
  {
    "path": "examples/jsm/shaders/MatcapShader.js",
    "content": "const MatcapShader = {\n\tname: 'matcap',\n\n\tdefines: {\n\t\tMATCAP_SRGB: false\n\t},\n\n\tuniforms: {\n\t\tmapcap: null\n\t},\n\n\tvertexShader: `\n\t\tvarying vec3 vViewPosition;\n\n\t\t#include <common_vert>\n\t\t#include <normal_pars_vert>\n\t\t#include <uv_pars_vert>\n\t\t#include <color_pars_vert>\n\t\t#include <diffuseMap_pars_vert>\n\t\t#include <alphamap_pars_vert>\n\t\t#include <modelPos_pars_vert>\n\t\t#include <morphtarget_pars_vert>\n\t\t#include <skinning_pars_vert>\n\t\t#include <logdepthbuf_pars_vert>\n\t\tvoid main() {\n\t\t\t#include <begin_vert>\n\t\t\t#include <morphtarget_vert>\n\t\t\t#include <morphnormal_vert>\n\t\t\t#include <skinning_vert>\n\t\t\t#include <skinnormal_vert>\n\t\t\t#include <pvm_vert>\n\t\t\t#include <normal_vert>\n\t\t\t#include <logdepthbuf_vert>\n\t\t\t#include <uv_vert>\n\t\t\t#include <color_vert>\n\t\t\t#include <diffuseMap_vert>\n\t\t\t#include <alphamap_vert>\n\t\t\t#include <modelPos_vert>\n\n\t\t\tvec4 mvPosition = u_View * worldPosition;\n\t\t\tvViewPosition = - mvPosition.xyz;\n\t\t}\n\t`,\n\n\tfragmentShader: `\n\t\tuniform sampler2D matcap;\n\t\tvarying vec3 vViewPosition;\n\n\t\t#include <common_frag>\n\t\t#include <dithering_pars_frag>\n\t\t#include <uv_pars_frag>\n\t\t#include <color_pars_frag>\n\t\t#include <diffuseMap_pars_frag>\n\t\t#include <alphamap_pars_frag>\n\t\t#include <alphaTest_pars_frag>\n\t\t#include <normalMap_pars_frag>\n\t\t#include <modelPos_pars_frag>\n\t\t#include <bumpMap_pars_frag>\n\t\t#include <normal_pars_frag>\n\t\t#include <fog_pars_frag>\n\t\t#include <logdepthbuf_pars_frag>\n\t\t#include <clippingPlanes_pars_frag>\n\t\tvoid main() {\n\t\t\t#include <clippingPlanes_frag>\n\t\t\t#include <logdepthbuf_frag>\n\t\t\t#include <begin_frag>\n\t\t\t#include <color_frag>\n\t\t\t#include <diffuseMap_frag>\n\t\t\t#include <alphamap_frag>\n\t\t\t#include <alphaTest_frag>\n\t\t\t#include <normal_frag>\n\n\t\t\tvec3 viewDir = normalize(vViewPosition);\n\t\t\tvec3 x = normalize(vec3(viewDir.z, 0.0, -viewDir.x));\n\t\t\tvec3 y = cross(viewDir, x);\n\t\t\tvec3 viewN = (u_View * vec4(N, 0.0)).xyz;\n\t\t\tvec2 uv = vec2(dot(x, viewN), dot(y, viewN)) * 0.495 + 0.5; // 0.495 to remove artifacts caused by undersized matcap disks\n\n\t\t\tvec4 matcapColor = texture2D(matcap, uv);\n\t\t\t#ifdef MATCAP_SRGB\n\t\t\t\tmatcapColor = sRGBToLinear(matcapColor);\n\t\t\t#endif\n\t\t\toutColor.rgb *= matcapColor.rgb;\n\n\t\t\t#include <end_frag>\n\t\t\t#include <encodings_frag>\n\t\t\t#include <premultipliedAlpha_frag>\n\t\t\t#include <fog_frag>\n\t\t\t#include <dithering_frag>\n\t\t}\n\t`\n};\n\nexport { MatcapShader };"
  },
  {
    "path": "examples/jsm/shaders/MotionBlur2Shader.js",
    "content": "const MotionBlur2Shader = {\n\tname: 'motion_blur2',\n\n\tuniforms: {\n\t\t'tMotion': null,\n\t\t'tColor': null,\n\t\t'velocityFactor': 1.0\n\t},\n\n\tvertexShader: `\n\t\tattribute vec3 a_Position;\n\t\tattribute vec2 a_Uv;\n\n\t\tuniform mat4 u_ProjectionView;\n\t\tuniform mat4 u_Model;\n\t\tuniform mat4 u_View;\n\n\t\tvarying vec2 v_Uv;\n\n\t\tvoid main() {\n\t\t\tv_Uv = a_Uv;\n\t\t\tgl_Position = u_ProjectionView * u_Model * vec4(a_Position, 1.0);\n\t\t}\n\t`,\n\n\tfragmentShader: `\n\t\t#define SAMPLES 64.0\n\n        varying vec2 v_Uv;\n\n        uniform sampler2D tMotion;\n        uniform sampler2D tColor;\n\n        uniform float velocityFactor;\n        uniform vec2 u_RenderTargetSize;\n\n        void main() {\n\t\t\tvec2 texelSize = 1.0 / u_RenderTargetSize;\n\t\t\tvec4 velocityColor = texture2D(tMotion, v_Uv);\n\t\t\tvelocityColor.rg = velocityColor.rg * 2.0 - vec2(1.0);\n\t\t\tvec2 velocity = vec2(velocityColor.r, velocityColor.g) * velocityColor.a;\n\t\t\tvelocity *= velocityFactor;\n\t\t\tfloat speed = length(velocity / texelSize);\n\t\t\tint samplesCount = int(clamp(speed, 1.0, SAMPLES));\n\t\t\tvelocity = normalize(velocity) * texelSize;\n\t\t\tfloat hlim = float(-samplesCount) * 0.5 + 0.5;\n\t\t\tvec4 result = texture2D(tColor, v_Uv);\n\t\t\tfor (int i = 1; i < int(SAMPLES); ++i) {\n\t\t\t\tif (i >= samplesCount) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tvec2 offset = v_Uv+velocity * (hlim + float(i));\n\t\t\t\tresult += texture2D(tColor, offset);\n\t\t\t}\n\t\t\tgl_FragColor = result / float(samplesCount);\n\t\t\tgl_FragColor.a = result.a;\n        }\n    `\n};\n\nexport { MotionBlur2Shader };"
  },
  {
    "path": "examples/jsm/shaders/MotionBlurShader.js",
    "content": "const MotionBlurShader = {\n\tname: 'motion_blur',\n\n\tuniforms: {\n\t\t'tDepth': null,\n\t\t'tColor': null,\n\n\t\t'velocityFactor': 1.0,\n\t\t'delta': 16.67,\n\n\t\t'clipToWorldMatrix': new Float32Array(16),\n\t\t'worldToClipMatrix': new Float32Array(16),\n\t\t'previousWorldToClipMatrix': new Float32Array(16),\n\n\t\t'cameraMove': [0, 0, 0]\n\t},\n\n\tvertexShader: `\n\t\tattribute vec3 a_Position;\n\t\tattribute vec2 a_Uv;\n\n\t\tuniform mat4 u_ProjectionView;\n\t\tuniform mat4 u_Model;\n\n\t\tvarying vec2 v_Uv;\n\n\t\tvoid main() {\n\t\t\tv_Uv = a_Uv;\n\t\t\tgl_Position = u_ProjectionView * u_Model * vec4(a_Position, 1.0);\n\t\t}\n\t`,\n\n\tfragmentShader: `\n\t\tvarying vec2 v_Uv;\n\n\t\tuniform sampler2D tDepth;\n\t\tuniform sampler2D tColor;\n\n\t\tuniform mat4 u_Projection;\n\n\t\tuniform mat4 clipToWorldMatrix;\n\t\tuniform mat4 worldToClipMatrix;\n\t\tuniform mat4 previousWorldToClipMatrix;\n\n\t\tuniform vec3 cameraMove;\n\n\t\tuniform float velocityFactor;\n\t\tuniform float delta;\n\n\t\tvoid main() {\n\t\t\tfloat zOverW = texture2D(tDepth, v_Uv).x;\n\n\t\t\t// clipPosition is the viewport position at this pixel in the range -1 to 1.\n\t\t\tvec4 clipPosition = vec4(v_Uv.x * 2. - 1., v_Uv.y * 2. - 1., zOverW * 2. - 1., 1.);\n\n\t\t\tvec4 worldPosition = clipToWorldMatrix * clipPosition;\n\t\t\tworldPosition /= worldPosition.w;\n\n\t\t\tvec4 previousWorldPosition = worldPosition;\n\t\t\tpreviousWorldPosition.xyz -= cameraMove;\n\n\t\t\tvec4 previousClipPosition = previousWorldToClipMatrix * worldPosition;\n\t\t\tpreviousClipPosition /= previousClipPosition.w;\n\n\t\t\tvec4 translatedClipPosition = worldToClipMatrix * previousWorldPosition;\n\t\t\ttranslatedClipPosition /= translatedClipPosition.w;\n\n\t\t\tvec2 velocity = velocityFactor * (clipPosition - previousClipPosition).xy / delta * 16.67;\n\t\t\tvelocity *= clamp(zOverW, 0., 1.);\n\t\t\tvelocity += velocityFactor * (clipPosition - translatedClipPosition).xy / delta * 16.67;\n\n\t\t\tvec4 finalColor = vec4(0.);\n\t\t\tvec2 offset = vec2(0.);\n\t\t\tfloat weight = 0.;\n\t\t\tconst int samples = 20;\n\t\t\tfor (int i = 0; i < samples; i++) {\n\t\t\t\toffset = velocity * (float(i) / (float(samples) - 1.) - .5);\n\t\t\t\tfinalColor += texture2D(tColor, v_Uv + offset);\n\t\t\t}\n\t\t\tfinalColor /= float(samples);\n\t\t\tgl_FragColor = vec4(finalColor.rgb, 1.);\n\n\t\t\t// debug: view velocity values\n\t\t\t// gl_FragColor = vec4(abs(velocity), 0., 1.);\n\t\t}\n\t`\n};\n\nexport { MotionBlurShader };"
  },
  {
    "path": "examples/jsm/shaders/OutputShader.js",
    "content": "const OutputShader = {\n\tname: 'output',\n\n\tdefines: {\n\t\t'SRGB_COLOR_SPACE': true\n\t},\n\n\tuniforms: {\n\t\t'tDiffuse': null,\n\t\t'toneMappingExposure': 1\n\t},\n\n\tvertexShader: `\n        attribute vec3 a_Position;\n        attribute vec2 a_Uv;\n\n        uniform mat4 u_ProjectionView;\n        uniform mat4 u_Model;\n\n        varying vec2 v_Uv;\n\n        void main() {\n            v_Uv = a_Uv;\n            gl_Position = u_ProjectionView * u_Model * vec4(a_Position, 1.0);\n        }\n    `,\n\n\tfragmentShader: `\n        uniform sampler2D tDiffuse;\n\n        varying vec2 v_Uv;\n\n        uniform float toneMappingExposure;\n\n        // exposure only\n        vec3 LinearToneMapping(vec3 color) {\n            return saturate(toneMappingExposure * color);\n        }\n\n        // source: https://www.cs.utah.edu/docs/techreports/2002/pdf/UUCS-02-001.pdf\n        vec3 ReinhardToneMapping(vec3 color) {\n            color *= toneMappingExposure;\n            return saturate(color / (vec3(1.0) + color));\n        }\n\n        // source: http://filmicworlds.com/blog/filmic-tonemapping-operators/\n        vec3 OptimizedCineonToneMapping(vec3 color) {\n            // optimized filmic operator by Jim Hejl and Richard Burgess-Dawson\n            color *= toneMappingExposure;\n            color = max(vec3(0.0), color - 0.004);\n            return pow((color * (6.2 * color + 0.5)) / (color * (6.2 * color + 1.7) + 0.06), vec3(2.2));\n        }\n\n        // source: https://github.com/selfshadow/ltc_code/blob/master/webgl/shaders/ltc/ltc_blit.fs\n        vec3 RRTAndODTFit(vec3 v) {\n            vec3 a = v * (v + 0.0245786) - 0.000090537;\n            vec3 b = v * (0.983729 * v + 0.4329510) + 0.238081;\n            return a / b;\n        }\n\n        // this implementation of ACES is modified to accommodate a brighter viewing environment.\n        // the scale factor of 1/0.6 is subjective. see discussion in https://github.com/mrdoob/three.js/pull/19621.\n\n        vec3 ACESFilmicToneMapping(vec3 color) {\n            // sRGB => XYZ => D65_2_D60 => AP1 => RRT_SAT\n            const mat3 ACESInputMat = mat3(\n                vec3(0.59719, 0.07600, 0.02840), // transposed from source\n                vec3(0.35458, 0.90834, 0.13383),\n                vec3(0.04823, 0.01566, 0.83777)\n            );\n        \n            // ODT_SAT => XYZ => D60_2_D65 => sRGB\n            const mat3 ACESOutputMat = mat3(\n                vec3( 1.60475, -0.10208, -0.00327), // transposed from source\n                vec3(-0.53108,  1.10813, -0.07276),\n                vec3(-0.07367, -0.00605,  1.07602)\n            );\n        \n            color *= toneMappingExposure / 0.6;\n        \n            color = ACESInputMat * color;\n        \n            // Apply RRT and ODT\n            color = RRTAndODTFit(color);\n        \n            color = ACESOutputMat * color;\n        \n            // Clamp to [0, 1]\n            return saturate(color);\n        }\n\n        void main() {\n            gl_FragColor = texture2D(tDiffuse, v_Uv);\n            \n            // tone mapping\n\n\t\t\t#ifdef LINEAR_TONE_MAPPING\n\t\t\t\tgl_FragColor.rgb = LinearToneMapping(gl_FragColor.rgb);\n\t\t\t#elif defined(REINHARD_TONE_MAPPING)\n\t\t\t\tgl_FragColor.rgb = ReinhardToneMapping(gl_FragColor.rgb);\n\t\t\t#elif defined(CINEON_TONE_MAPPING)\n\t\t\t\tgl_FragColor.rgb = OptimizedCineonToneMapping(gl_FragColor.rgb);\n\t\t\t#elif defined(ACES_FILMIC_TONE_MAPPING)\n\t\t\t\tgl_FragColor.rgb = ACESFilmicToneMapping(gl_FragColor.rgb);\n\t\t\t#endif\n\n            // color space\n\n            #ifdef SRGB_COLOR_SPACE\n\t\t\t\tgl_FragColor = LinearTosRGB(gl_FragColor);\n\t\t\t#endif\n        }\n    `\n};\n\nexport { OutputShader };"
  },
  {
    "path": "examples/jsm/shaders/PlanarShadowShader.js",
    "content": "const PlanarShadowShader = {\n\tname: 'planar_shadow',\n\tdefines: {},\n\tuniforms: {\n\t\tlightDir: [1, 1, 1],\n\t\tshadowColor: [0, 0, 0],\n\t\tshadowFalloff: 0.02,\n\t\theight: 0.1\n\t},\n\tvertexShader: `\n        attribute vec3 a_Position;\n\n        uniform mat4 u_ProjectionView;\n        uniform mat4 u_Model;\n\n        uniform vec3 lightDir;\n        uniform vec3 shadowColor;\n        uniform float shadowFalloff;\n        uniform float height;\n\n        varying vec4 v_Color;\n\n        vec3 shadowProjectPos(vec4 pos) {\n            vec3 worldPos = (u_Model * pos).xyz;\n\n            vec3 shadowPos;\n\n            vec3 lightDir = normalize(lightDir);\n\n            shadowPos.xz = worldPos.xz - lightDir.xz * max(0.0, worldPos.y - height) / lightDir.y;\n            shadowPos.y = min(worldPos.y, height);\n\n            return shadowPos;\n        }\n\n        void main() {\n            vec4 position = vec4(a_Position, 1.0);\n            vec3 shadowPos = shadowProjectPos(position);\n            vec3 center = vec3(u_Model[3].x, height, u_Model[3].z);\n            float falloff =  1.0 - clamp(distance(shadowPos , center) * shadowFalloff, 0.0, 1.0);\n\n            v_Color = vec4(shadowColor, falloff);\n\n            gl_Position = u_ProjectionView * vec4(shadowPos, 1.0);\n        }\n    `,\n\tfragmentShader: `\n        varying vec4 v_Color;\n\n        void main() {\n            gl_FragColor = v_Color;\n        }\n\n    `\n};\n\nexport { PlanarShadowShader };"
  },
  {
    "path": "examples/jsm/shaders/SDFTextShader.js",
    "content": "const SDFTextShader = {\n\tname: 'sdf_text',\n\n\tdefines: {\n\t\tDEBUG: false,\n\t\tSHADOW: false,\n\t\tOUTLINE: false\n\t},\n\n\tuniforms: {\n\t\tgamma: 1,\n\t\thalo: 0.75,\n\t\tshadowColor: [0.3, 0.3, 0.3],\n\t\tshadowOffset: [0.016, -0.016],\n\t\tshadowGamma: 1,\n\t\toutlineColor: [1, 0, 0],\n\t\toutlineWidth: 0.04,\n\t\toutlineGamma: 1\n\t},\n\n\tvertexShader: `\n\t\t#include <common_vert>\n\n\t\tattribute vec2 a_Uv;\n\n\t\tuniform mat3 uvTransform;\n\n\t\tvarying vec2 v_Uv;\n\t\tvarying float v_gammaScale;\n\n\t\tvoid main() {\n\t\t\tgl_Position = u_ProjectionView * u_Model * vec4(a_Position, 1.0);\n\t\t\tv_gammaScale = gl_Position.w;\n\t\t\tv_Uv = (uvTransform * vec3(a_Uv, 1.)).xy;\n\t\t}\n\t`,\n\n\tfragmentShader: `\n\t\tuniform vec3 u_Color;\n\t\tuniform float u_Opacity;\n\t\tuniform sampler2D diffuseMap;\n\n\t\tuniform float halo;\n\t\tuniform float gamma;\n\n\t\t#ifdef SHADOW\n\t\t\tuniform vec3 shadowColor;\n\t\t\tuniform vec2 shadowOffset;\n\t\t\tuniform float shadowGamma;\n\t\t#endif\n\t\t\n\t\t#ifdef OUTLINE\n\t\t\tuniform vec3 outlineColor;\n\t\t\tuniform float outlineWidth;\n\t\t\tuniform float outlineGamma;\n\t\t#endif\n\n\t\tvarying vec2 v_Uv;\n\t\tvarying float v_gammaScale;\n\n\t\tvoid main() {\n\t\t\tfloat dist = texture2D(diffuseMap, v_Uv).r;\n\t\t\tfloat gammaSize = gamma * 0.00003 * v_gammaScale;\n\t\t\tfloat alpha = smoothstep(halo - gammaSize, halo + gammaSize, dist);\n\t\t\tvec4 textColor = vec4(u_Color, alpha * u_Opacity);\n\t\t\t\n\t\t\t#ifdef OUTLINE\n\t\t\t\tfloat outlineAlpha = smoothstep(halo - outlineWidth - outlineGamma * 0.046, halo - outlineWidth + outlineGamma * 0.046, dist);\n\t\t\t\tvec4 outlineColor4 = vec4(outlineColor, outlineAlpha * u_Opacity);\n\t\t\t\ttextColor = mix(outlineColor4, textColor, textColor.a);\n\t\t\t#endif\n\n\t\t\t#ifdef SHADOW\n\t\t\t\tfloat shadowDist = texture2D(diffuseMap, v_Uv - shadowOffset).r;\n\t\t\t\tfloat shadowAlpha = smoothstep(halo - shadowGamma * 0.05, halo + shadowGamma * 0.05, shadowDist);\n\t\t\t\tvec4 shadowColor4 = vec4(shadowColor, shadowAlpha * u_Opacity);\n\t\t\t\ttextColor = mix(shadowColor4, textColor, textColor.a);\n\t\t\t#endif\n\n\t\t\t#ifdef DEBUG\n\t\t\t\tgl_FragColor = vec4(dist, dist, dist, 1.0);\n\t\t\t#else\n\t\t\t\tgl_FragColor = textColor;\n\t\t\t#endif\n\t\t}\n\t`\n};\n\nexport { SDFTextShader };"
  },
  {
    "path": "examples/jsm/shaders/SSAOShader.js",
    "content": "/**\n * SSAO Shader\n */\nconst SSAOShader = {\n\tname: 'ssao',\n\n\tdefines: {\n\t\t'DEPTH_PACKING': 0\n\t},\n\n\tuniforms: {\n\t\t'normalTex': null,\n\t\t'depthTex': null,\n\t\t'texSize': [512, 512],\n\t\t'noiseTex': null,\n\t\t'noiseTexSize': [4, 4],\n\t\t'projection': new Float32Array(16),\n\t\t'projectionInv': new Float32Array(16),\n\t\t'viewInverseTranspose': new Float32Array(16),\n\t\t'kernel': null,\n\t\t'radius': 0.2,\n\t\t'power': 1,\n\t\t'bias': 0.0001,\n\t\t'intensity': 1\n\t},\n\n\tvertexShader: `\n\t\tattribute vec3 a_Position;\n\t\tattribute vec2 a_Uv;\n\n\t\tuniform mat4 u_ProjectionView;\n\t\tuniform mat4 u_Model;\n\n\t\tvarying vec2 v_Uv;\n\n\t\tvoid main() {\n\t\t\tv_Uv = a_Uv;\n\t\t\tgl_Position = u_ProjectionView * u_Model * vec4(a_Position, 1.0);\n\t\t}\n\t`,\n\n\tfragmentShader: `\n\t\t#include <packing>\n\n\t\tvarying vec2 v_Uv;\n\n\t\tuniform sampler2D normalTex;\n\t\tuniform sampler2D depthTex;\n\t\tuniform vec2 texSize;\n\t\tuniform sampler2D noiseTex;\n\t\tuniform vec2 noiseTexSize;\n\t\tuniform mat4 projection;\n\t\tuniform mat4 projectionInv;\n\t\tuniform mat4 viewInverseTranspose;\n\t\tuniform vec3 kernel[KERNEL_SIZE];\n\t\tuniform float radius;\n\t\tuniform float power;\n\t\tuniform float bias;\n\t\tuniform float intensity;\n\n\t\tfloat getDepth(const in vec2 screenPosition) {\n\t\t\t#if DEPTH_PACKING == 1\n\t\t\t\treturn unpackRGBAToDepth(texture2D(depthTex, screenPosition));\n\t\t\t#else\n\t\t\t\treturn texture2D(depthTex, screenPosition).r;\n\t\t\t#endif\n\t\t}\n\n\t\tvec3 getViewNormal(const in vec2 screenPosition) {\n\t\t\tvec3 normal = texture2D(normalTex, screenPosition).xyz * 2.0 - 1.0;\n\t\t\t// Convert to view space\n\t\t\treturn (viewInverseTranspose * vec4(normal, 0.0)).xyz;\n\t\t}\n\n\t\tfloat ssaoEstimator(in mat3 kernelBasis, in vec3 originPos, in vec3 N) {\n\t\t\tfloat occlusion = 0.0;\n\n\t\t\tfor (int i = 0; i < KERNEL_SIZE; i++) {\n\t\t\t\tvec3 samplePos = kernel[i];\n\t\t\t\tsamplePos = kernelBasis * samplePos;\n\t\t\t\tsamplePos = samplePos * radius + originPos;\n\n\t\t\t\tvec4 texCoord = projection * vec4(samplePos, 1.0);\n\t\t\t\ttexCoord.xy /= texCoord.w;\n\t\t\t\ttexCoord.xy = texCoord.xy * 0.5 + 0.5;\n\n\t\t\t\tfloat sampleDepth = getDepth(texCoord.xy);\n\t\t\t\tfloat z = sampleDepth * 2.0 - 1.0;\n\n\t\t\t\t#ifdef ALCHEMY\n\t\t\t\t\t// todo not work\n\t\t\t\t\tvec4 projectedPos = vec4(texCoord.xy * 2.0 - 1.0, z, 1.0);\n\t\t\t\t\tvec4 p4 = projectionInv * projectedPos;\n\t\t\t\t\tp4.xyz /= p4.w;\n\t\t\t\t\tvec3 cDir = p4.xyz - originPos;\n\n\t\t\t\t\tfloat vv = dot(cDir, cDir);\n\t\t\t\t\tfloat vn = dot(cDir, N);\n\n\t\t\t\t\tfloat radius2 = radius * radius;\n\n\t\t\t\t\tvn = max(vn + p4.z * bias, 0.0);\n\t\t\t\t\tfloat f = max(radius2 - vv, 0.0) / radius2;\n\t\t\t\t\tocclusion += f * f * f * max(vn / (0.01 + vv), 0.0);\n\t\t\t\t#else\n\t\t\t\t\t// just for perspective camera\n\t\t\t\t\tif (projection[3][3] == 0.0) {\n\t\t\t\t\t\tz = projection[3][2] / (z * projection[2][3] - projection[2][2]);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tz = (z - projection[3][2]) / projection[2][2];\n\t\t\t\t\t}\n\n\t\t\t\t\tfloat factor = step(samplePos.z, z - bias);\n\t\t\t\t\tfloat rangeCheck = smoothstep(0.0, 1.0, radius / abs(originPos.z - z));\n\t\t\t\t\tocclusion += rangeCheck * factor;\n\n\t\t\t\t#endif\n\t\t\t}\n\t\t\tocclusion = 1.0 - occlusion / float(KERNEL_SIZE);\n\t\t\t// occlusion = 1.0 - clamp((occlusion / float(KERNEL_SIZE) - 0.6) * 2.5, 0.0, 1.0);\n\t\t\treturn pow(occlusion, power);\n\t\t}\n\n\t\tvoid main() {\n\t\t\tfloat centerDepth = getDepth(v_Uv);\n\t\t\tif(centerDepth >= (1.0 - EPSILON)) {\n\t\t\t\tdiscard;\n\t\t\t}\n\n\t\t\tvec3 N = getViewNormal(v_Uv);\n\n\t\t\tvec2 noiseTexCoord = texSize / vec2(noiseTexSize) * v_Uv;\n\t\t\tvec3 rvec = texture2D(noiseTex, noiseTexCoord).rgb * 2.0 - 1.0;\n\n\t\t\t// Tangent\n\t\t\tvec3 T = normalize(rvec - N * dot(rvec, N));\n\t\t\t// Bitangent\n\t\t\tvec3 BT = normalize(cross(N, T));\n\t\t\tmat3 kernelBasis = mat3(T, BT, N);\n\n\t\t\t// view position\n\t\t\tfloat z = centerDepth * 2.0 - 1.0;\n\t\t\tvec4 projectedPos = vec4(v_Uv * 2.0 - 1.0, z, 1.0);\n\t\t\tvec4 p4 = projectionInv * projectedPos;\n\t\t\tvec3 position = p4.xyz / p4.w;\n\n\t\t\tfloat ao = ssaoEstimator(kernelBasis, position, N);\n\t\t\tao = clamp(1.0 - (1.0 - ao) * intensity, 0.0, 1.0);\n\t\t\tgl_FragColor = vec4(vec3(ao), 1.0);\n\t\t}\n\t`\n};\n\nexport { SSAOShader };"
  },
  {
    "path": "examples/jsm/shaders/SSRShader.js",
    "content": "/**\n * SSR Shader\n * https://github.com/pissang/claygl/blob/master/example/shader/ssr.glsl\n * http://casual-effects.blogspot.jp/2014/08/screen-space-ray-tracing.html\n */\nconst SSRShader = {\n\tname: 'effect_ssr',\n\n\tdefines: {\n\t\tMAX_ITERATION: 50,\n\t\tMAX_BINARY_SEARCH_ITERATION: 5\n\t},\n\n\tuniforms: {\n\t\tcolorTex: null,\n\t\tgBufferTexture1: null,\n\t\tgBufferTexture2: null,\n\n\t\tprojection: new Float32Array(16),\n\t\tprojectionInv: new Float32Array(16),\n\t\tviewInverseTranspose: new Float32Array(16),\n\n\t\tpixelStride: 8,\n\t\tmaxRayDistance: 200,\n\n\t\tenablePixelStrideZCutoff: 1.0,\n\t\tpixelStrideZCutoff: 50,\n\n\t\tscreenEdgeFadeStart: 0.9,\n\n\t\teyeFadeStart: 0.99,\n\t\teyeFadeEnd: 1,\n\n\t\tminGlossiness: 0.2,\n\t\tnearZ: 0.1,\n\n\t\tzThicknessThreshold: 0.1,\n\t\tjitterOffset: 0,\n\t\tviewportSize: [512, 512]\n\t},\n\n\tvertexShader: `\n\t\tattribute vec3 a_Position;\n\t\tattribute vec2 a_Uv;\n\n\t\tuniform mat4 u_ProjectionView;\n\t\tuniform mat4 u_Model;\n\n\t\tvarying vec2 v_Uv;\n\n\t\tvoid main() {\n\t\t\tv_Uv = a_Uv;\n\t\t\tgl_Position = u_ProjectionView * u_Model * vec4(a_Position, 1.0);\n\t\t}\n\t`,\n\n\tfragmentShader: `\n\t\tvarying vec2 v_Uv;\n\n\t\tuniform sampler2D colorTex;\n\t\tuniform sampler2D gBufferTexture1;\n\t\tuniform sampler2D gBufferTexture2;\n\n\t\tuniform mat4 projection;\n\t\tuniform mat4 projectionInv;\n\t\tuniform mat4 viewInverseTranspose;\n\t\tuniform float maxRayDistance;\n\n\t\tuniform float pixelStride;\n\t\t// ray origin Z at this distance will have a pixel stride of 1.0\n\t\tuniform float pixelStrideZCutoff;\n\n\t\t// distance to screen edge that ray hits will start to fade (0.0 -> 1.0)\n\t\tuniform float screenEdgeFadeStart;\n\n\t\t// ray direction's Z that ray hits will start to fade (0.0 -> 1.0)\n\t\tuniform float eyeFadeStart;\n\t\t// ray direction's Z that ray hits will be cut (0.0 -> 1.0)\n\t\tuniform float eyeFadeEnd;\n\n\t\t// Object larger than minGlossiness will have ssr effect\n\t\tuniform float minGlossiness;\n\t\tuniform float zThicknessThreshold;\n\t\tuniform float jitterOffset;\n\n\t\tuniform float nearZ;\n\t\tuniform vec2 viewportSize;\n\n\t\tuniform float maxMipmapLevel;\n\n\t\tuniform float enablePixelStrideZCutoff;\n\n\t\tfloat fetchDepth(sampler2D depthTexture, vec2 uv) {\n\t\t\tvec4 depthTexel = texture2D(depthTexture, uv);\n\t\t\treturn depthTexel.r * 2.0 - 1.0;\n\t\t}\n\n\t\tfloat linearDepth(float depth) {\n\t\t\treturn projection[3][2] / (depth * projection[2][3] - projection[2][2]);\n\t\t}\n\n\t\tbool rayIntersectDepth(float rayZNear, float rayZFar, vec2 hitPixel) {\n\t\t\t// Swap if bigger\n\t\t\tif (rayZFar > rayZNear) {\n\t\t\t\tfloat t = rayZFar; rayZFar = rayZNear; rayZNear = t;\n\t\t\t}\n\t\t\tfloat cameraZ = linearDepth(fetchDepth(gBufferTexture2, hitPixel));\n\t\t\t// float cameraBackZ = linearDepth(fetchDepth(backDepthTex, hitPixel));\n\t\t\t// Cross z\n\t\t\treturn rayZFar <= cameraZ && rayZNear >= cameraZ - zThicknessThreshold;\n\t\t}\n\n\t\t// Trace a ray in screenspace from rayOrigin (in camera space) pointing in rayDir (in camera space)\n\t\t//\n\t\t// With perspective correct interpolation\n\t\t//\n\t\t// Returns true if the ray hits a pixel in the depth buffer\n\t\t// and outputs the hitPixel (in UV space), the hitPoint (in camera space) and the number\n\t\t// of iterations it took to get there.\n\t\t//\n\t\t// Based on Morgan McGuire & Mike Mara's GLSL implementation:\n\t\t// http://casual-effects.blogspot.com/2014/08/screen-space-ray-tracing.html\n\t\tbool traceScreenSpaceRay(vec3 rayOrigin, vec3 rayDir, float jitter, out vec2 hitPixel, out vec3 hitPoint, out float iterationCount) {\n\t\t\t// Clip to the near plane\n\t\t\tfloat rayLength = ((rayOrigin.z + rayDir.z * maxRayDistance) > -nearZ) ? (-nearZ - rayOrigin.z) / rayDir.z : maxRayDistance;\n\n\t\t\tvec3 rayEnd = rayOrigin + rayDir * rayLength;\n\n\t\t\t// Project into homogeneous clip space\n\t\t\tvec4 H0 = projection * vec4(rayOrigin, 1.0);\n\t\t\tvec4 H1 = projection * vec4(rayEnd, 1.0);\n\n\t\t\tfloat k0 = 1.0 / H0.w, k1 = 1.0 / H1.w;\n\n\t\t\t// The interpolated homogeneous version of the camera space points\n\t\t\tvec3 Q0 = rayOrigin * k0, Q1 = rayEnd * k1;\n\n\t\t\t// Screen space endpoints\n\t\t\t// PENDING viewportSize ?\n\t\t\tvec2 P0 = (H0.xy * k0 * 0.5 + 0.5) * viewportSize;\n\t\t\tvec2 P1 = (H1.xy * k1 * 0.5 + 0.5) * viewportSize;\n\n\t\t\t// If the line is degenerate, make it cover at least one pixel to avoid handling\n\t\t\t// zero-pixel extent as a special case later\n\t\t\tP1 += dot(P1 - P0, P1 - P0) < 0.0001 ? 0.01 : 0.0;\n\t\t\tvec2 delta = P1 - P0;\n\n\t\t\t// Permute so that the primary iteration is in x to collapse\n\t\t\t// all quadrant-specific DDA case later\n\t\t\tbool permute = false;\n\t\t\tif (abs(delta.x) < abs(delta.y)) {\n\t\t\t\t// More vertical line\n\t\t\t\tpermute = true;\n\t\t\t\tdelta = delta.yx;\n\t\t\t\tP0 = P0.yx;\n\t\t\t\tP1 = P1.yx;\n\t\t\t}\n\t\t\tfloat stepDir = sign(delta.x);\n\t\t\tfloat invdx = stepDir / delta.x;\n\n\t\t\t// Track the derivatives of Q and K\n\t\t\tvec3 dQ = (Q1 - Q0) * invdx;\n\t\t\tfloat dk = (k1 - k0) * invdx;\n\n\t\t\tvec2 dP = vec2(stepDir, delta.y * invdx);\n\n\t\t\t// Calculate pixel stride based on distance of ray origin from camera.\n\t\t\t// Since perspective means distant objects will be smaller in screen space\n\t\t\t// we can use this to have higher quality reflections for far away objects\n\t\t\t// while still using a large pixel stride for near objects (and increase performance)\n\t\t\t// this also helps mitigate artifacts on distant reflections when we use a large\n\t\t\t// pixel stride.\n\t\t\tfloat strideScaler = 1.0 - min(1.0, -rayOrigin.z / pixelStrideZCutoff);\n\t\t\tfloat pixStride = mix(pixelStride, 1.0 + strideScaler * pixelStride, enablePixelStrideZCutoff);\n\n\t\t\t// Scale derivatives by the desired pixel stride and the offset the starting values by the jitter fraction\n\t\t\tdP *= pixStride; dQ *= pixStride; dk *= pixStride;\n\n\t\t\t// Track ray step and derivatives in a vec4 to parallelize\n\t\t\tvec4 pqk = vec4(P0, Q0.z, k0);\n\t\t\tvec4 dPQK = vec4(dP, dQ.z, dk);\n\n\t\t\tpqk += dPQK * jitter;\n\t\t\tfloat rayZFar = (dPQK.z * 0.5 + pqk.z) / (dPQK.w * 0.5 + pqk.w);\n\t\t\tfloat rayZNear;\n\n\t\t\tbool intersect = false;\n\n\t\t\tvec2 texelSize = 1.0 / viewportSize;\n\n\t\t\titerationCount = 0.0;\n\t\t\tfloat end = P1.x * stepDir;\n\t\t\tfor (int i = 0; i < MAX_ITERATION; i++) {\n\t\t\t\tpqk += dPQK;\n\t\t\t\tif ((pqk.x * stepDir) >= end) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\trayZNear = rayZFar;\n\t\t\t\trayZFar = (dPQK.z * 0.5 + pqk.z) / (dPQK.w * 0.5 + pqk.w);\n\n\t\t\t\thitPixel = permute ? pqk.yx : pqk.xy;\n\t\t\t\thitPixel *= texelSize;\n\n\t\t\t\tintersect = rayIntersectDepth(rayZNear, rayZFar, hitPixel);\n\n\t\t\t\titerationCount += 1.0;\n\n\t\t\t\t// PENDING Right on all platforms?\n\t\t\t\tif (intersect) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Binary search refinement\n\t\t\t// FIXME If intersect in first iteration binary search may easily lead to the pixel of reflect object it self\n\t\t\tif (pixStride > 1.0 && intersect && iterationCount > 1.0) {\n\t\t\t\t// Roll back\n\t\t\t\tpqk -= dPQK;\n\t\t\t\tdPQK /= pixStride;\n\n\t\t\t\tfloat originalStride = pixStride * 0.5;\n\t\t\t\tfloat stride = originalStride;\n\n\t\t\t\trayZNear = pqk.z / pqk.w;\n\t\t\t\trayZFar = rayZNear;\n\n\t\t\t\tfor (int j = 0; j < MAX_BINARY_SEARCH_ITERATION; j++) {\n\t\t\t\t\tpqk += dPQK * stride;\n\t\t\t\t\trayZNear = rayZFar;\n\t\t\t\t\trayZFar = (dPQK.z * -0.5 + pqk.z) / (dPQK.w * -0.5 + pqk.w);\n\t\t\t\t\thitPixel = permute ? pqk.yx : pqk.xy;\n\t\t\t\t\thitPixel *= texelSize;\n\n\t\t\t\t\toriginalStride *= 0.5;\n\t\t\t\t\tstride = rayIntersectDepth(rayZNear, rayZFar, hitPixel) ? -originalStride : originalStride;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tQ0.xy += dQ.xy * iterationCount;\n\t\t\tQ0.z = pqk.z;\n\t\t\thitPoint = Q0 / pqk.w;\n\n\t\t\treturn intersect;\n\t\t}\n\n\t\tfloat calculateAlpha(float iterationCount, float reflectivity, vec2 hitPixel, vec3 hitPoint, float dist, vec3 rayDir) {\n\t\t\tfloat alpha = clamp(reflectivity, 0.0, 1.0);\n\n\t\t\t// Fade ray hits that approach the maximum iterations\n\t\t\talpha *= 1.0 - (iterationCount / float(MAX_ITERATION));\n\n\t\t\t// Fade ray hits that approach the screen edge\n\t\t\tvec2 hitPixelNDC = hitPixel * 2.0 - 1.0;\n\t\t\tfloat maxDimension = min(1.0, max(abs(hitPixelNDC.x), abs(hitPixelNDC.y)));\n\t\t\talpha *= 1.0 - max(0.0, maxDimension - screenEdgeFadeStart) / (1.0 - screenEdgeFadeStart);\n\n\t\t\t// Fade ray hits base on how much they face the camera\n\t\t\tfloat _eyeFadeStart = eyeFadeStart;\n\t\t\tfloat _eyeFadeEnd = eyeFadeEnd;\n\t\t\tif (_eyeFadeStart > _eyeFadeEnd) {\n\t\t\t\tfloat tmp = _eyeFadeEnd;\n\t\t\t\t_eyeFadeEnd = _eyeFadeStart;\n\t\t\t\t_eyeFadeStart = tmp;\n\t\t\t}\n\t\t\tfloat eyeDir = clamp(rayDir.z, _eyeFadeStart, _eyeFadeEnd);\n\t\t\talpha *= 1.0 - (eyeDir - _eyeFadeStart) / (_eyeFadeEnd - _eyeFadeStart);\n\n\t\t\t// Fade ray hits based on distance from ray origin\n\t\t\talpha *= 1.0 - clamp(dist / maxRayDistance, 0.0, 1.0);\n\n\t\t\treturn alpha;\n\t\t}\n\t\tvoid main() {\n\t\t\tvec4 normalAndGloss = texture2D(gBufferTexture1, v_Uv);\n\n\t\t\tif (dot(normalAndGloss.rgb, vec3(1.0)) == 0.0) {\n\t\t\t\tdiscard;\n\t\t\t}\n\n\t\t\tfloat g = normalAndGloss.a;\n\t\t\tif (g <= minGlossiness) {\n\t\t\t\tdiscard;\n\t\t\t}\n\n\t\t\tfloat reflectivity = g;\n\n\t\t\tvec3 N = normalAndGloss.rgb * 2.0 - 1.0;\n\t\t\tN = normalize((viewInverseTranspose * vec4(N, 0.0)).xyz);\n\n\t\t\t// Position in view\n\t\t\tvec4 projectedPos = vec4(v_Uv * 2.0 - 1.0, fetchDepth(gBufferTexture2, v_Uv), 1.0);\n\t\t\tvec4 pos = projectionInv * projectedPos;\n\t\t\tvec3 rayOrigin = pos.xyz / pos.w;\n\n\t\t\tvec3 rayDir = normalize(reflect(normalize(rayOrigin), N));\n\t\t\tvec2 hitPixel;\n\t\t\tvec3 hitPoint;\n\t\t\tfloat iterationCount;\n\n\t\t\t// Get jitter\n\t\t\tvec2 uv2 = v_Uv * viewportSize;\n\t\t\tfloat jitter = fract((uv2.x + uv2.y) * 0.25);\n\n\t\t\tbool intersect = traceScreenSpaceRay(rayOrigin, rayDir, jitter, hitPixel, hitPoint, iterationCount);\n\t\t\t// Is empty\n\t\t\tif (!intersect) {\n\t\t\t\tdiscard;\n\t\t\t}\n\t\t\tfloat dist = distance(rayOrigin, hitPoint);\n\n\t\t\tfloat alpha = calculateAlpha(iterationCount, reflectivity, hitPixel, hitPoint, dist, rayDir) * float(intersect);\n\n\t\t\tvec3 hitNormal = texture2D(gBufferTexture1, hitPixel).rgb * 2.0 - 1.0;\n\t\t\thitNormal = normalize((viewInverseTranspose * vec4(hitNormal, 0.0)).xyz);\n\n\t\t\t// Ignore the pixel not face the ray\n\t\t\t// TODO fadeout ?\n\t\t\t// PENDING Can be configured?\n\t\t\tif (dot(hitNormal, rayDir) >= 0.0) {\n\t\t\t\tdiscard;\n\t\t\t}\n\n\t\t\tvec4 color = texture2D(colorTex, hitPixel);\n\t\t\tgl_FragColor = vec4(color.rgb * alpha, color.a);\n\t\t}\n    `\n};\n\nexport { SSRShader };"
  },
  {
    "path": "examples/jsm/shaders/ShadowShader.js",
    "content": "const ShadowShader = {\n\tname: 'shadow_shader',\n\n\tdefines: {},\n\n\tuniforms: {},\n\n\tvertexShader: `\n\t\t#include <common_vert>\n\t\t#include <modelPos_pars_vert>\n\t\t#include <shadowMap_pars_vert>\n\t\t#include <morphtarget_pars_vert>\n\t\t#include <skinning_pars_vert>\n\t\tvoid main() {\n\t\t\t#include <begin_vert>\n\t\t\t#include <morphtarget_vert>\n\t\t\t#include <skinning_vert>\n\t\t\t#include <pvm_vert>\n\t\t\t#include <modelPos_vert>\n\t\t\t#include <shadowMap_vert>\n\t\t}\n\t`,\n\n\tfragmentShader: `\n\t\t#include <common_frag>\n\t\t#include <modelPos_pars_frag>\n\t\t#include <light_pars_frag>\n\t\t#include <shadowMap_pars_frag>\n\t\t#include <fog_pars_frag>\n\n\t\tfloat getShadowMask() {\n\t\t\tfloat shadow = 1.0;\n\n\t\t\t#if NUM_DIR_LIGHTS > 0\n\t\t\t\t#pragma unroll_loop_start\n\t\t\t\tfor (int i = 0; i < NUM_DIR_LIGHTS; i++) {\n\t\t\t\t\t#if defined(USE_SHADOW) && (UNROLLED_LOOP_INDEX < NUM_DIR_SHADOWS)\n\t\t\t\t\t\t#ifdef USE_PCSS_SOFT_SHADOW\n\t\t\t\t\t\t\tshadow *= getShadowWithPCSS(directionalDepthMap[i], directionalShadowMap[i], vDirectionalShadowCoord[i], u_DirectionalShadow[i].shadowMapSize, u_DirectionalShadow[i].shadowBias, u_DirectionalShadow[i].shadowParams);\n\t\t\t\t\t\t#else\n\t\t\t\t\t\t\tshadow *= getShadow(directionalShadowMap[i], vDirectionalShadowCoord[i], u_DirectionalShadow[i].shadowMapSize, u_DirectionalShadow[i].shadowBias, u_DirectionalShadow[i].shadowParams);\n\t\t\t\t\t\t#endif\n\t\t\t\t\t#endif\n\t\t\t\t}\n\t\t\t\t#pragma unroll_loop_end\n\t\t\t#endif\n\n\t\t\t#if NUM_POINT_LIGHTS > 0\n\t\t\t\t#pragma unroll_loop_start\n\t\t\t\tfor (int i = 0; i < NUM_POINT_LIGHTS; i++) {\n\t\t\t\t\t#if defined(USE_SHADOW) && (UNROLLED_LOOP_INDEX < NUM_POINT_SHADOWS)\n\t\t\t\t\t\tshadow *= getPointShadow(pointShadowMap[i], vPointShadowCoord[i], u_PointShadow[i].shadowMapSize, u_PointShadow[i].shadowBias, u_PointShadow[i].shadowParams, u_PointShadow[i].shadowCameraRange);\n\t\t\t\t\t#endif\n\t\t\t\t}\n\t\t\t\t#pragma unroll_loop_end\n\t\t\t#endif\n\n\t\t\t#if NUM_SPOT_LIGHTS > 0\n\t\t\t\tfloat lightDistance;\n\t\t\t\tfloat angleCos;\n\n\t\t\t\t#pragma unroll_loop_start\n\t\t\t\tfor (int i = 0; i < NUM_SPOT_LIGHTS; i++) {\n\t\t\t\t\tvec3 L = u_Spot[i].position - v_modelPos;\n\t\t\t\t\tlightDistance = length(L);\n\t\t\t\t\tL = normalize(L);\n\t\t\t\t\tangleCos = dot(L, -normalize(u_Spot[i].direction));\n\t\t\t\t\tif(all(bvec2(angleCos > u_Spot[i].coneCos, lightDistance < u_Spot[i].distance))) {\n\t\t\t\t\t\t#if defined(USE_SHADOW) && (UNROLLED_LOOP_INDEX < NUM_SPOT_SHADOWS)\n\t\t\t\t\t\t\t#ifdef USE_PCSS_SOFT_SHADOW\n\t\t\t\t\t\t\t\tshadow *= getShadowWithPCSS(spotDepthMap[i], spotShadowMap[i], vSpotShadowCoord[i], u_SpotShadow[i].shadowMapSize, u_SpotShadow[i].shadowBias, u_SpotShadow[i].shadowParams);\n\t\t\t\t\t\t\t#else\n\t\t\t\t\t\t\t\tshadow *= getShadow(spotShadowMap[i], vSpotShadowCoord[i], u_SpotShadow[i].shadowMapSize, u_SpotShadow[i].shadowBias, u_SpotShadow[i].shadowParams);\n\t\t\t\t\t\t\t#endif\n\t\t\t\t\t\t#endif\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t#pragma unroll_loop_end\n\t\t\t#endif\n\n\t\t\treturn shadow;\n\t\t}\n\n\t\tvoid main() {\n\t\t\tgl_FragColor = vec4(u_Color, u_Opacity * (1.0 - getShadowMask()));\n\t\t\t#include <fog_frag>\n\t\t}\n\t`\n};\n\nexport { ShadowShader };"
  },
  {
    "path": "examples/jsm/shaders/SketchShader.js",
    "content": "/**\n * Sketch Shader\n */\nconst SketchShader = {\n\tname: 'sketch',\n\n\tdefines: {},\n\n\tuniforms: {\n\t\tnormalTexture: null,\n\t\tdepthTexture: null,\n\t\tuThreshold: 0.55,\n\t\tuContrast: 0.5,\n\t\tmatProjViewInverse: new Float32Array(16),\n\t\tuColor: [0, 0, 0]\n\t},\n\n\tvertexShader: `\n\t\tattribute vec3 a_Position;\n\t\tattribute vec2 a_Uv;\n\n\t\tuniform mat4 u_ProjectionView;\n\t\tuniform mat4 u_Model;\n\n\t\tvarying vec2 v_Uv;\n\n\t\tvoid main() {\n\t\t\tv_Uv = a_Uv;\n\t\t\tgl_Position = u_ProjectionView * u_Model * vec4(a_Position, 1.0);\n\t\t}\n\t`,\n\n\tfragmentShader: `\n\t\tvarying vec2 v_Uv;\n\n\t\tuniform sampler2D normalTexture;\n\t\tuniform sampler2D depthTexture;\n\t\tuniform vec2 u_RenderTargetSize;\n\t\tuniform float uThreshold;\n\t\tuniform float uContrast;\n\t\tuniform mat4 matProjViewInverse;\n\n\t\tvoid getNormalPosition(in vec2 coord, out vec3 position, out vec3 normal) {\n\t\t\tnormal.xyz = texture2D(normalTexture, coord).xyz * 2.0 - 1.0;\n\t\t\tfloat z = texture2D(depthTexture, coord).r * 2.0 - 1.0;\n\t\t\tvec2 xy = coord * 2.0 - 1.0;\n\t\t\tvec4 p4 = vec4(xy, z, 1.0);\n\t\t\tp4 = matProjViewInverse * p4;\n\t\t\tp4.xyz /= p4.w;\n\t\t\tposition.xyz = p4.xyz;\n\t\t}\n\n\t\tfloat planeDistance(vec3 posA, vec3 norA, vec3 posB, vec3 norB) {\n\t\t\tvec3 posDelta = normalize(posB - posA);\n\t\t\tfloat planeDist = max(abs(dot(posDelta, norA)), abs(dot(posDelta, norB)));\n\t\t\tfloat normalDist = max(1.0 - dot(norA, norB), 0.0);\n\t\t\tfloat test = dot(norA, vec3(1.0)) + dot(norB, vec3(1.0));\n\t\t\treturn max(planeDist, normalDist) * step(-5.9, test);\n\t\t}\n\n\t\tuniform vec3 uColor;\n\n\t\tvec4 shade() {\n\t\t\tvec2 vFragCoord = v_Uv;\n\t\t\tvec2 pixelSize = 1.0 / u_RenderTargetSize;\n\t\t\tvec2 coordUp = vFragCoord - vec2(0.0, pixelSize.y);\n\t\t\tvec2 coordDown = vFragCoord + vec2(0.0, pixelSize.y);\n\t\t\tvec2 coordLeft = vFragCoord - vec2(pixelSize.x, 0.0);\n\t\t\tvec2 coordRight = vFragCoord + vec2(pixelSize.x, 0.0);\n\t\t\tvec3 posUp, norUp;\n\t\t\tvec3 posDown, norDown;\n\t\t\tvec3 posLeft, norLeft;\n\t\t\tvec3 posRight, norRight;\n\t\t\tgetNormalPosition(coordUp, posUp, norUp);\n\t\t\tgetNormalPosition(coordDown, posDown, norDown);\n\t\t\tgetNormalPosition(coordLeft, posLeft, norLeft);\n\t\t\tgetNormalPosition(coordRight, posRight, norRight);\n\t\t\tvec2 planeDist = vec2(planeDistance(posLeft, norLeft, posRight, norRight), planeDistance(posUp, norUp, posDown, norDown));\n\t\t\tfloat edge = length(planeDist);\n\t\t\tfloat sketch = step(edge, uThreshold);\n\t\t\tsketch = clamp(uContrast * (1.0 - sketch), 0.0, 1.0);\n\t\t\treturn vec4(uColor, sketch);\n\t\t}\n\n\t\tvoid main() {\n\t\t\tgl_FragColor = shade();\n\t\t}\n\t`\n};\n\nexport { SketchShader };"
  },
  {
    "path": "examples/jsm/shaders/SkyShader.js",
    "content": "// https://www.shadertoy.com/view/MllBR2\n\nexport const SkyShader = {\n\tname: 'sky_bg',\n\n\tdefines: {\n\t\tSAMPLES_NUMS: 16,\n\t\tDISPLAY_SUN: false\n\t},\n\n\tuniforms: {\n\t\tsunU: 1.55,\n\t\tsunV: 0.65,\n\t\teyePos: 1500,\n\t\tsunRadius: 500.0, // = 500.0;\n\t\tsunRadiance: 10.0, // = 20.0;\n\t\tmieG: 0.96, // = 0.76;\n\t\tmieHeight: 1200, // = 1200;\n\t\tsunBrightness: 1.0 // = 1.0;\n\t},\n\n\tvertexShader: `\n\t\tattribute vec3 a_Position;\n\t\tattribute vec2 a_Uv;\n\t\t\n\t\tuniform mat4 u_ProjectionView;\n\t\tuniform mat4 u_Model;\n\n\t\tvarying vec2 v_Uv;\n\n\t\tvoid main() {\n\t\t\tv_Uv = a_Uv;\n\t\t\tgl_Position = u_ProjectionView * u_Model * vec4(a_Position, 1.0);\n\t\t}\n\t`,\n\n\tfragmentShader: `\n\t\tuniform float sunU;\n\t\tuniform float sunV;\n\t\tuniform float eyePos;\n\t\tuniform float sunRadius;\n\t\tuniform float sunRadiance;\n\t\tuniform float mieG;\n\t\tuniform float mieHeight;\n\t\tuniform float sunBrightness;\n\n\t\tvarying vec2 v_Uv;\n\n\t\tstruct ScatteringParams {\n\t\t\tfloat sunRadius;\n\t\t\tfloat sunRadiance;\n\n\t\t\tfloat mieG;\n\t\t\tfloat mieHeight;\n\t\t\tfloat rayleighHeight;\n\n\t\t\tvec3 waveLambdaMie;\n\t\t\tvec3 waveLambdaOzone;\n\t\t\tvec3 waveLambdaRayleigh;\n\n\t\t\tfloat earthRadius;\n\t\t\tfloat earthAtmTopRadius;\n\t\t\tvec3 earthCenter;\n\t\t};\n\n\t\tvec3 transmittance;\n\t\tvec3 insctrMie;\n\t\tvec3 insctrRayleigh;\n\n\t\tvec3 ComputeSphereNormal(vec2 coord, float phiStart, float phiLength, float thetaStart, float thetaLength){\n\t\t\tvec3 normal = vec3(1.0);\n\t\t\tnormal.x = -sin(thetaStart + coord.y * thetaLength) * sin(phiStart + coord.x * phiLength);\n\t\t\tnormal.y = -cos(thetaStart + coord.y * thetaLength);\n\t\t\tnormal.z = -sin(thetaStart + coord.y * thetaLength) * cos(phiStart + coord.x * phiLength);\n\t\t\treturn normalize(normal);\n\t\t}\n\n\t\tvec2 ComputeRaySphereIntersection(vec3 position, vec3 dir, vec3 center, float radius) {\n\t\t\tvec3 origin = position - center;\n\t\t\tfloat B = dot(origin, dir);\n\t\t\tfloat C = dot(origin, origin) - radius * radius;\n\t\t\tfloat D = B * B - C;\n\t\t\tvec2 minimaxIntersections;\n\t\t\tif (D < 0.0)\n\t\t\t{\n\t\t\t\tminimaxIntersections = vec2(-1.0, -1.0);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tD = sqrt(D);\n\t\t\t\tminimaxIntersections = vec2(-B - D, -B + D);\n\t\t\t}\n\t\t\treturn minimaxIntersections;\n\t\t}\n\n\t\tvec3 ComputeWaveLambdaRayleigh(vec3 lambda) {\n\t\t\tfloat n = 1.0003;\n\t\t\tfloat N = 2.545E25;\n\t\t\tfloat pn = 0.035;\n\t\t\tfloat n2 = n * n;\n\t\t\tfloat pi3 = PI * PI * PI;\n\t\t\tfloat rayleighConst = (8.0 * pi3 * pow(n2 - 1.0,2.0)) / (3.0 * N) * ((6.0 + 3.0 * pn) / (6.0 - 7.0 * pn));\n\t\t\treturn vec3(rayleighConst) / (lambda * lambda * lambda * lambda);\n\t\t}\n\n\t\tfloat ComputePhaseMie(float theta, float g) {\n\t\t\tfloat g2 = g * g;\n\t\t\treturn (1.0 - g2) / pow(1.0 + g2 - 2.0 * g * saturate(theta), 1.5) / (4.0 * PI);\n\t\t}\n\n\t\tfloat ComputePhaseRayleigh(float theta) {\n\t\t\tfloat theta2 = theta * theta;\n\t\t\treturn (theta2 * 0.75 + 0.75) / (4.0 * PI);\n\t\t}\n\n\t\tfloat ChapmanApproximation(float X, float h, float cosZenith) {\n\t\t\tfloat c = sqrt(X + h);\n\t\t\tfloat c_exp_h = c * exp(-h);\n\n\t\t\tif (cosZenith >= 0.0)\n\t\t\t{\n\t\t\t\treturn c_exp_h / (c * cosZenith + 1.0);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tfloat x0 = sqrt(1.0 - cosZenith * cosZenith) * (X + h);\n\t\t\t\tfloat c0 = sqrt(x0);\n\t\t\t\treturn 2.0 * c0 * exp(X - x0) - c_exp_h / (1.0 - c * cosZenith);\n\t\t\t}\n\t\t}\n\n\t\tfloat GetOpticalDepthSchueler(float h, float H, float earthRadius, float cosZenith) {\n\t\t\treturn H * ChapmanApproximation(earthRadius / H, h / H, cosZenith);\n\t\t}\n\n\t\tvec3 GetTransmittance(ScatteringParams setting, vec3 L, vec3 V) {\n\t\t\tfloat ch = GetOpticalDepthSchueler(L.y, setting.rayleighHeight, setting.earthRadius, V.y);\n\t\t\treturn exp(-(setting.waveLambdaMie + setting.waveLambdaRayleigh) * ch);\n\t\t}\n\n\t\tvec2 ComputeOpticalDepth(ScatteringParams setting, vec3 samplePoint, vec3 V, vec3 L, float neg) {\n\t\t\tfloat rl = length(samplePoint);\n\t\t\tfloat h = rl - setting.earthRadius;\n\t\t\tvec3 r = samplePoint / rl;\n\n\t\t\tfloat cos_chi_sun = dot(r, L);\n\t\t\tfloat cos_chi_ray = dot(r, V * neg);\n\n\t\t\tfloat opticalDepthSun = GetOpticalDepthSchueler(h, setting.rayleighHeight, setting.earthRadius, cos_chi_sun);\n\t\t\tfloat opticalDepthCamera = GetOpticalDepthSchueler(h, setting.rayleighHeight, setting.earthRadius, cos_chi_ray) * neg;\n\n\t\t\treturn vec2(opticalDepthSun, opticalDepthCamera);\n\t\t}\n\n\t\tvoid AerialPerspective(ScatteringParams setting, vec3 start, vec3 end, vec3 V, vec3 L, int infinite) {\n\t\t\tfloat inf_neg = 1.0;\n\t\t\tif(infinite == 0){\n\t\t\t\tinf_neg = -1.0;\n\t\t\t}\n\t\t\tint a1 = SAMPLES_NUMS;\n\t\t\tfloat a= float(a1);\n\t\t\tvec3 sampleStep = (end - start) / a * 1.0;\n\t\t\tvec3 samplePoint = end - sampleStep;\n\t\t\tvec3 sampleLambda = setting.waveLambdaMie + setting.waveLambdaRayleigh + setting.waveLambdaOzone;\n\n\t\t\tfloat sampleLength = length(sampleStep);\n\n\t\t\tvec3 scattering = vec3(0.0);\n\t\t\tvec2 lastOpticalDepth = ComputeOpticalDepth(setting, end, V, L, inf_neg);\n\n\t\t\tfor (int i = 1; i < a1; i = i + 1) {\n\t\t\t\tvec2 opticalDepth = ComputeOpticalDepth(setting, samplePoint, V, L, inf_neg);\n\n\t\t\t\tvec3 segment_s = exp(-sampleLambda * (opticalDepth.x + lastOpticalDepth.x));\n\t\t\t\tvec3 segment_t = exp(-sampleLambda * (opticalDepth.y - lastOpticalDepth.y));\n\n\t\t\t\ttransmittance *= segment_t;\n\n\t\t\t\tscattering = scattering * segment_t;\n\t\t\t\tscattering += exp(-(length(samplePoint) - setting.earthRadius) / setting.rayleighHeight) * segment_s;\n\n\t\t\t\tlastOpticalDepth = opticalDepth;\n\t\t\t\tsamplePoint = samplePoint - sampleStep;\n\t\t\t}\n\n\t\t\tinsctrMie = scattering * setting.waveLambdaMie * sampleLength;\n\t\t\tinsctrRayleigh = scattering * setting.waveLambdaRayleigh * sampleLength;\n\t\t}\n\t\t\t\n\t\tfloat ComputeSkyboxChapman(ScatteringParams setting, vec3 eye, vec3 V, vec3 L) {\n\t\t\tint neg = 1;\n\t\t\tvec2 outerIntersections = ComputeRaySphereIntersection(eye, V, setting.earthCenter, setting.earthAtmTopRadius);\n\t\t\tif (outerIntersections.y < 0.0){\n\t\t\t\treturn 0.0;\n\t\t\t}\n\t\t\tvec2 innerIntersections = ComputeRaySphereIntersection(eye, V, setting.earthCenter, setting.earthRadius);\n\t\t\tif (innerIntersections.x > 0.0)\n\t\t\t{\n\t\t\t\tneg = 0;\n\t\t\t\touterIntersections.y = innerIntersections.x;\n\t\t\t}\n\n\t\t\tvec3 eye0 = eye - setting.earthCenter;\n\n\t\t\tvec3 start = eye0 + V * max(0.0, outerIntersections.x);\n\t\t\tvec3 end = eye0 + V * outerIntersections.y;\n\n\t\t\tAerialPerspective(setting, start, end, V, L, neg);\n\n\t\t\t//bool intersectionTest = innerIntersections.x < 0.0 && innerIntersections.y < 0.0;\n\t\t\t//return intersectionTest ? 1.0 : 0.0;\n\n\t\t\tif(innerIntersections.x < 0.0 && innerIntersections.y < 0.0){\n\t\t\t\treturn 1.0;\n\t\t\t}\n\t\t\treturn 0.0;\n\t\t}\n\t\t\t\n\t\tvec4 ComputeSkyInscattering(ScatteringParams setting, vec3 eye, vec3 V, vec3 L) {\n\t\t\ttransmittance = vec3(1.0);\n\t\t\tinsctrMie = vec3(0.0);\n\t\t\tinsctrRayleigh = vec3(0.0);\n\t\t\tfloat intersectionTest = ComputeSkyboxChapman(setting, eye, V, L);\n\n\t\t\tfloat phaseTheta = dot(V, L);\n\t\t\tfloat phaseMie = ComputePhaseMie(phaseTheta, setting.mieG);\n\t\t\tfloat phaseRayleigh = ComputePhaseRayleigh(phaseTheta);\n\t\t\tfloat phaseNight = 1.0 - saturate(transmittance.x * 0.00001);\n\n\t\t\tvec3 insctrTotalMie = insctrMie * phaseMie;\n\t\t\tvec3 insctrTotalRayleigh = insctrRayleigh * phaseRayleigh;\n\n\t\t\tvec3 sky = (insctrTotalMie + insctrTotalRayleigh) * setting.sunRadiance;\n\t\t\t#ifdef DISPLAY_SUN\n\t\t\t\tfloat angle = saturate((1.0 - phaseTheta) * setting.sunRadius);\n\t\t\t\tfloat cosAngle = cos(angle * PI * 0.5);\n\t\t\t\tfloat edge= 0.0;\n\t\t\t\tif(angle >= 0.9){\n\t\t\t\t\tedge = smoothstep(0.9, 1.0, angle);\n\t\t\t\t}\n\n\t\t\t\tvec3 limbDarkening = GetTransmittance(setting, -L, V);\n\t\t\t\tlimbDarkening *= pow(vec3(cosAngle), vec3(0.420, 0.503, 0.652)) * mix(vec3(1.0), vec3(1.2, 0.9, 0.5), edge) * intersectionTest;\n\t\t\t\tsky += limbDarkening * sunBrightness; \n\t\t\t#endif\n\t\t\treturn vec4(sky, phaseNight * intersectionTest);\n\t\t}\n\n\t\tvoid main() {\n\t\t\tfloat eyePosition = eyePos;\n\t\t\tvec2 sun = vec2(sunU, sunV);\n\t\t\tfloat fpi = float(PI);\n\t\t\tfloat fpi2 = 2. * PI;\n\n\t\t\tvec3 V = ComputeSphereNormal(v_Uv, 0.0, fpi2, 0.0, fpi);\n\t\t\tvec3 L = ComputeSphereNormal(vec2(sun.x, sun.y), 0.0, fpi, 0.0, PI);\n\n\t\t\tScatteringParams setting;\n\t\t\tsetting.sunRadius = sunRadius;\n\t\t\tsetting.sunRadiance = sunRadiance;\n\t\t\tsetting.mieG = mieG;\n\t\t\tsetting.mieHeight = mieHeight;\n\t\t\tsetting.rayleighHeight = 8000.0;\n\t\t\tsetting.earthRadius = 6360000.0;\n\t\t\tsetting.earthAtmTopRadius = 6420000.0;\n\t\t\tsetting.earthCenter = vec3(0, -setting.earthRadius, 0);\n\t\t\tsetting.waveLambdaMie = vec3(0.0000002);\n\n\t\t\t// wavelength with 680nm, 550nm, 450nm\n\t\t\tsetting.waveLambdaRayleigh = ComputeWaveLambdaRayleigh(vec3(0.000000680, 0.000000550, 0.000000450));\n\n\t\t\tsetting.waveLambdaOzone = vec3(1.36820899679147, 3.31405330400124, 0.13601728252538)* 0.0000006 * 2.504;\n\n\t\t\tvec3 eye = vec3(0,eyePosition, 0);\n\t\t\tvec4 sky0 = ComputeSkyInscattering(setting, eye, V, L);\n\t\t\tvec3 sky = vec3(sky0.rgb);\n\n\t\t\tsky = pow(sky.rgb, vec3(1.0 / 2.2)); // gamma\n\n\t\t\tgl_FragColor = vec4(sky.rgb, 1.0);\n\t\t}\n\t`\n};"
  },
  {
    "path": "examples/jsm/shaders/TAAShader.js",
    "content": "/**\n * TAA Shader\n * Modified from https://github.com/Unity-Technologies/PostProcessing/blob/v2/PostProcessing/Shaders/Builtins/TemporalAntialiasing.shader\n */\nconst TAAShader = {\n\tname: 'taa',\n\n\tuniforms: {\n\t\tprevTex: null,\n\t\tcurrTex: null,\n\t\tvelocityTex: null,\n\t\tdepthTex: null,\n\t\ttexelSize: [1 / 512, 1 / 512],\n\t\tstill: true,\n\t\tstillBlending: 0.95,\n\t\tmotionBlending: 0.85\n\t},\n\n\tvertexShader: `\n\t\tattribute vec3 a_Position;\n\t\tattribute vec2 a_Uv;\n\n\t\tuniform mat4 u_ProjectionView;\n\t\tuniform mat4 u_Model;\n\n\t\tvarying vec2 v_Uv;\n\n\t\tvoid main() {\n\t\t\tv_Uv = a_Uv;\n\t\t\tgl_Position = u_ProjectionView * u_Model * vec4(a_Position, 1.0);\n\t\t}\n\t`,\n\n\tfragmentShader: `\n\t\tuniform sampler2D prevTex;\n\t\tuniform sampler2D currTex;\n\t\tuniform sampler2D velocityTex;\n\t\tuniform sampler2D depthTex;\n\n\t\tuniform vec2 texelSize;\n\n\t\tuniform bool still;\n\t\tuniform float stillBlending;\n\t\tuniform float motionBlending;\n\n\t\tvarying vec2 v_Uv;\n\n\t\tfloat luminance(vec4 color) {\n\t\t\treturn dot(color.rgb, vec3(0.2125, 0.7154, 0.0721));\n\t\t}\n\n\t\t// Tonemap and untonmap from \"High Quality Temporal Supersampling\"\n\t\tvec4 tonemap(vec4 color) {\n\t\t\treturn vec4(color.rgb / (luminance(color) + 1.0), color.a);\n\t\t}\n\t\tvec4 untonemap(vec4 color) {\n\t\t\treturn vec4(color.rgb / max(1.0 - luminance(color), 0.0001), color.a);\n\t\t}\n\n\t\tfloat compareDepth(float a, float b) {\n\t\t\treturn step(a, b);\n\t\t}\n\n\t\tvec2 getClosestFragment(vec2 uv) {\n\t\t\tvec2 k = texelSize.xy;\n\n\t\t\tvec4 neighborhood = vec4(\n\t\t\t\ttexture2D(depthTex, uv - k).r,\n\t\t\t\ttexture2D(depthTex, uv + vec2(k.x, -k.y)).r,\n\t\t\t\ttexture2D(depthTex, uv + vec2(-k.x, k.y)).r,\n\t\t\t\ttexture2D(depthTex, uv + k).r\n\t\t\t);\n\n\t\t\tvec3 result = vec3(0.0, 0.0, texture2D(depthTex, uv));\n\t\t\tresult = mix(result, vec3(-1.0, -1.0, neighborhood.x), compareDepth(neighborhood.x, result.z));\n\t\t\tresult = mix(result, vec3( 1.0, -1.0, neighborhood.y), compareDepth(neighborhood.y, result.z));\n\t\t\tresult = mix(result, vec3(-1.0,  1.0, neighborhood.z), compareDepth(neighborhood.z, result.z));\n\t\t\tresult = mix(result, vec3( 1.0,  1.0, neighborhood.w), compareDepth(neighborhood.w, result.z));\n\n\t\t\treturn (uv + result.xy * k);\n\t\t}\n\n\t\tvec4 clipToAABB(vec4 color, vec3 minimum, vec3 maximum) {\n\t\t\t// Note: only clips towards aabb center (but fast!)\n\t\t\tvec3 center = 0.5 * (maximum + minimum);\n\t\t\tvec3 extents = 0.5 * (maximum - minimum);\n\n\t\t\t// This is actually \"distance\", however the keyword is reserved\n\t\t\tvec3 offset = color.rgb - center;\n\n\t\t\tvec3 ts = abs(extents / (offset + 0.0001));\n\t\t\tfloat t = clamp(min(min(ts.x, ts.y), ts.z), 0.0, 1.0);\n\t\t\tcolor.rgb = center + offset * t;\n\t\t\treturn color;\n\t\t}\n\n\t\tvoid main() {\n\t\t\tif (still) {\n\t\t\t\tgl_FragColor = mix(texture2D(currTex, v_Uv), texture2D(prevTex, v_Uv), stillBlending);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tvec2 closest = getClosestFragment(v_Uv);\n\t\t\tvec4 motionTexel = texture2D(velocityTex, closest);\n\t\t\tif (motionTexel.a < 0.1) {\n\t\t\t\tgl_FragColor = texture2D(currTex, v_Uv);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tvec2 motion = motionTexel.rg - 0.5;\n\t\t\tfloat motionLength = length(motion);\n\n\t\t\tvec4 color = texture2D(currTex, v_Uv);\n\t\t\tvec4 history = texture2D(prevTex, v_Uv - motion);\n\n\t\t\t// handle ghosting, clip history color to AABB\n\t\t\tvec2 k = texelSize.xy;\n\t\t\tvec4 topLeft = texture2D(currTex, v_Uv - k * 0.5);\n\t\t\tvec4 bottomRight = texture2D(currTex, v_Uv + k * 0.5);\n\t\t\tvec4 corners = 4.0 * (topLeft + bottomRight) - 2.0 * color;\n\t\t\tvec4 average = (corners + color) * 0.142857;\n\t\t\tvec2 luma = vec2(luminance(average), luminance(color));\n\t\t\tfloat nudge = 4.0 * abs(luma.x - luma.y);\n\t\t\t// float nudge = mix(4.0, 0.25, clamp(motionLength * 100.0, 0.0, 1.0)) * abs(luma.x - luma.y);\n\t\t\tvec4 minimum = min(bottomRight, topLeft) - nudge;\n\t\t\tvec4 maximum = max(topLeft, bottomRight) + nudge;\n\t\t\thistory = clipToAABB(history, minimum.xyz, maximum.xyz);\n\n\t\t\t// blend weight\n\t\t\tfloat weight = clamp(\n\t\t\t\tmix(stillBlending, motionBlending, motionLength * 6000.),\n\t\t\t\tmotionBlending, stillBlending\n\t\t\t);\n\t\t\t// float weight = motionBlending;\n\n\t\t\t// mix after tonemap\n\t\t\tcolor = mix(tonemap(color), tonemap(history), weight);\n\t\t\tgl_FragColor = untonemap(color);\n\t\t\t// color = mix(color, history, motionBlending);\n\t\t\t// gl_FragColor = color;\n\t\t}\n\t`\n};\n\nexport { TAAShader };"
  },
  {
    "path": "examples/jsm/shaders/TextureVariationShader.js",
    "content": "/**\n * TextureVariation Shader\n * Modified from https://www.shadertoy.com/view/Xtl3zf\n */\nconst TextureVariationShader = {\n\tname: 'texture_variation',\n\n\tuniforms: {\n\t\tmap: null,\n\t\trandomMap: null,\n\t\tfactor: 0.4,\n\t\tscaleFactor: 10,\n\t\tnoiseFactor: 0.05\n\t},\n\n\tvertexShader: `\n\t\tattribute vec3 a_Position;\n\t\tattribute vec2 a_Uv;\n\n\t\tuniform mat4 u_ProjectionView;\n\t\tuniform mat4 u_Model;\n\n\t\tvarying vec2 v_Uv;\n\n\t\tvoid main() {\n\t\t\tv_Uv = a_Uv;\n\t\t\tvec4 worldPosition = u_Model * vec4(a_Position, 1.0);\n\t\t\tgl_Position = u_ProjectionView * worldPosition;\n\t\t}\n\t`,\n\n\tfragmentShader: `\n\t\tuniform sampler2D map;\n\t\tuniform sampler2D randomMap;\n\t\tuniform float factor;\n\t\tuniform float scaleFactor;\n\t\tuniform float noiseFactor;\n\n\t\tvarying vec2 v_Uv;\n\n\t\tfloat sum(vec3 v) { return v.x + v.y + v.z; }\n\n\t\tvec3 textureNoTile(in vec2 x, float v) {\n\t\t\t// sample variation pattern\n\t\t\tfloat k = texture(randomMap, noiseFactor * x).x; // cheap (cache friendly) lookup\n\n\t\t\t// compute index\n\t\t\tfloat index = k * 8.0;\n\t\t\tfloat i = floor(index);\n\t\t\tfloat f = fract(index);\n\n\t\t\t// offsets for the different virtual patterns\n\t\t\tvec2 offa = sin(vec2(3.0, 7.0) * (i + 0.0)); // can replace with any other hash\n\t\t\tvec2 offb = sin(vec2(3.0, 7.0) * (i + 1.0)); // can replace with any other hash\n\n\t\t\t// compute derivatives for mip-mapping\n\t\t\tvec2 dx = dFdx(x), dy = dFdy(x);\n\n\t\t\t// sample the two closest virtual patterns\n\t\t\tvec3 cola = textureGrad(map, x + v * offa, dx, dy).xyz;\n\t\t\tvec3 colb = textureGrad(map, x + v * offb, dx, dy).xyz;\n\n\t\t\t// interpolate between the two virtual patterns\n\t\t\treturn mix(cola, colb, smoothstep(0.2, 0.8, f - 0.1 * sum(cola - colb)));\n\t\t}\n\n\t\tvoid main() {\n\t\t\tvec3 col = textureNoTile(scaleFactor * v_Uv, factor);\n\t\t\tgl_FragColor = vec4(col, 1.0);\n\t\t}\n\t`\n};\n\nexport { TextureVariationShader };"
  },
  {
    "path": "examples/jsm/shaders/VolumeShader.js",
    "content": "/**\n * volume shader\n * refer: https://github.com/modelo/API_samples/tree/master/samples/volume-rendering\n */\nconst VolumeShader = {\n\tname: 'volume',\n\n\tdefines: {},\n\n\tuniforms: {\n\t\tplatteTexture: null,\n\t\tdensityTexture: null,\n\t\tuInvTransform: new Float32Array(16),\n\t\tuAlphaCorrection: 0.09\n\t},\n\n\tvertexShader: `\n\t\t#include <common_vert>\n\t\t#include <modelPos_pars_vert>\n\t\t#include <morphtarget_pars_vert>\n\t\t#include <skinning_pars_vert>\n\t\tvoid main() {\n\t\t\t#include <begin_vert>\n\t\t\t#include <morphtarget_vert>\n\t\t\t#include <skinning_vert>\n\t\t\t#include <pvm_vert>\n\t\t\t#include <modelPos_vert>\n\t\t}\n\t`,\n\n\tfragmentShader: `\n\t\tprecision highp sampler3D;\n\n\t\t#include <common_frag>\n\t\t#include <modelPos_pars_frag>\n\n\t\tuniform sampler2D platteTexture;\n\t\tuniform sampler3D densityTexture;\n\t\tuniform mat4 uInvTransform;\n\t\tuniform float uAlphaCorrection;\n\t\tconst float STEP = 1.73205081 / 256.0;\n\n\t\t// http://iquilezles.org/www/articles/intersectors/intersectors.htm\n\t\t// axis aligned box centered at the origin, with size boxSize\n\t\tvec2 boxIntersection(vec3 ro, vec3 rd, vec3 boxSize) {\n\t\t\tvec3 m = 1.0 / rd; // can precompute if traversing a set of aligned boxes\n\t\t\tvec3 n = m * ro; // can precompute if traversing a set of aligned boxes\n\t\t\tvec3 k = abs(m) * boxSize;\n\t\t\tvec3 t1 = -n - k;\n\t\t\tvec3 t2 = -n + k;\n\t\t\tfloat tN = max(max(t1.x, t1.y), t1.z);\n\t\t\tfloat tF = min(min(t2.x, t2.y), t2.z);\n\t\t\tif (tN > tF || tF < 0.0) return vec2(-1.0); // no intersection\n\t\t\treturn vec2(tN, tF);\n\t\t}\n\n\t\tvec4 getColor(float intensity) {\n\t\t\t// makes the volume looks brighter;\n\t\t\tintensity = min(0.46, intensity) / 0.46;\n\t\t\tvec2 _uv = vec2(intensity, 0);\n\t\t\tvec4 color = texture2D(platteTexture, _uv);\n\t\t\tfloat alpha = intensity;\n\t\t\tif (alpha < 0.03) {\n\t\t\t\talpha = 0.01;\n\t\t\t}\n\t\t\treturn vec4(color.r, color.g, color.b, alpha);\n\t\t}\n\n\t\tvec4 sampleAs3DTexture(vec3 texCoord) {\n\t\t\ttexCoord += vec3(0.5);\n\t\t\treturn getColor(texture(densityTexture, texCoord).r);\n\t\t}\n\n\t\tvec3 shade(inout float transparent, in vec3 P, in vec3 V) {\n\t\t\t// Transform to model space.\n\t\t\tvec3 frontPos = (uInvTransform * vec4(P.xyz, 1.0)).xyz;\n\t\t\tvec3 cameraPos = (uInvTransform * vec4(u_CameraPosition.xyz, 1.0)).xyz;\n\t\t\tvec3 rayDir = normalize(frontPos - cameraPos);\n\t\t\tvec3 backPos = frontPos;\n\t\t\tvec2 t = boxIntersection(cameraPos, rayDir, vec3(0.5));\n\t\t\tif (t.x > -1.0 && t.y > -1.0) {\n\t\t\t\tbackPos = cameraPos + rayDir * t.y;\n\t\t\t}\n\t\t\tfloat rayLength = length(backPos - frontPos);\n\t\t\tint steps = int(max(1.0, floor(rayLength / STEP)));\n\t\t\t// Calculate how long to increment in each step.\n\t\t\tfloat delta = rayLength / float(steps);\n\t\t\t// The increment in each direction for each step.\n\t\t\tvec3 deltaDirection = rayDir * delta;\n\t\t\t// Start the ray casting from the front position.\n\t\t\tvec3 currentPosition = frontPos;\n\t\t\t// The color accumulator.\n\t\t\tvec4 accumulatedColor = vec4(0.0);\n\t\t\t// The alpha value accumulated so far.\n\t\t\tfloat accumulatedAlpha = 0.0;\n\t\t\tvec4 colorSample;\n\t\t\tfloat alphaSample;\n\t\t\t// Perform the ray marching iterations\n\t\t\tfor (int i = 0; i < steps; i++) {\n\t\t\t\tcolorSample = sampleAs3DTexture(currentPosition);\n\t\t\t\talphaSample = colorSample.a * uAlphaCorrection;\n\t\t\t\talphaSample *= (1.0 - accumulatedAlpha);\n\t\t\t\t// Perform the composition.\n\t\t\t\taccumulatedColor += colorSample * alphaSample;\n\t\t\t\t// Store the alpha accumulated so far.\n\t\t\t\taccumulatedAlpha += alphaSample;\n\t\t\t\t// Advance the ray.\n\t\t\t\tcurrentPosition += deltaDirection;\n\t\t\t}\n\t\t\ttransparent = accumulatedAlpha;\n\t\t\treturn accumulatedColor.xyz;\n\t\t}\n\n\t\tvoid main() {\n\t\t\tvec3 V = normalize(v_modelPos - u_CameraPosition);\n\t\t\tvec3 P = v_modelPos;\n\t\t\tfloat transparent;\n\t\t\tvec3 color = shade(transparent, P, V);\n\t\t\tgl_FragColor = vec4(color, transparent);\n\t\t}\n\t`\n};\n\nexport { VolumeShader };"
  },
  {
    "path": "examples/jsm/shaders/WaterShader.js",
    "content": "const WaterShader = {\n\tname: 'water',\n\n\tuniforms: {\n\t\t'normalMap': null,\n\t\t'opacity': 1.0,\n\t\t'size': [0.3, 0.3],\n\t\t'distortionScale': 15.0,\n\t\t'sunColor': [1, 1, 1],\n\t\t'LightPosition': [0.70707, 0.70707, 0],\n\t\t'time': 0.0,\n\t\t'offset': [0, 0],\n\t\t'waterColor': [0, 0.3, 0.5],\n\t\t'waveStrength': 1.0,\n\t\t'reflectWeight': 1.0,\n\t\t'envMap': null,\n\t\t'envMapFlip': -1,\n\t\t'envQuaternion': [0, 0, 0, 1]\n\t},\n\n\tvertexShader: `\n\t\t#include <common_vert>\n\t\tattribute vec2 a_Uv;\n\t\tvarying vec2 vUv;\n\t\tvarying vec3 vObjectNormal;\n\t\tvarying vec3 vNormal;\n\t\tvarying vec3 vViewPosition;\n\t\t#include <logdepthbuf_pars_vert>\n\n\t\tvoid main() {\n\t\t\tvUv=a_Uv;\n\n\t\t\tvec3 transformedNormal = normalize(a_Normal);\n\t\t\tvObjectNormal = transformedNormal;\n\t\t\ttransformedNormal = (transposeMat4(inverseMat4(u_View * u_Model)) * vec4(vObjectNormal, 0.0)).xyz;\n\t\t\tvNormal= transformedNormal;\n\n\t\t\tvec4 mvPosition = u_View * u_Model * vec4(a_Position, 1.0);\n\t\t\tvViewPosition = mvPosition.xyz;\n\t\t\tgl_Position = u_Projection * mvPosition;\n\n\t\t\t#include <logdepthbuf_vert>\n\t\t}\n\t`,\n\n\tfragmentShader: `\n\t\t#include <common_frag>\n\n\t\tuniform vec3 waterColor;\n\t\tuniform float opacity;\n\n\t\tuniform vec2 size;\n\t\tuniform float distortionScale;\n\t\tuniform float waveStrength;\n\t\tuniform float time;\n\t\tuniform vec2 offset;\n\t\tuniform sampler2D normalMap;\n\t\tuniform samplerCube envMap;\n\t\tuniform float envMapFlip;\n\t\tuniform vec4 envQuaternion;\n\t\tuniform float reflectWeight;\n\n\t\tuniform vec3 sunColor;\n\t\tuniform vec3 LightPosition;\n\n\t\tuniform mat4 u_Model;\n\n\t\tvarying vec2 vUv;\n\t\tvarying vec3 vObjectNormal;\n\t\tvarying vec3 vNormal;\n\t\tvarying vec3 vViewPosition;\n\t\t#include <logdepthbuf_pars_frag>\n\t\t#include <fog_pars_frag>\n\n\t\tvec3 inverseTransformDirection(in vec3 dir, in mat4 matrix) {\n\t\t\t// dir can be either a direction vector or a normal vector\n\t\t\t// upper-left 3x3 of matrix is assumed to be orthogonal\n\t\t\treturn normalize( ( vec4( dir, 0.0 ) * matrix ).xyz );\n\t\t}\n\n\t\tvec4 getNoise(vec2 uv) {\n\t\t\tvec2 uv0 = (uv / 103.0) + vec2(time / 17.0, time / 29.0);\n\t\t\tvec2 uv1 = uv / 107.0 - vec2(time / -19.0, time / 31.0);\n\t\t\tvec2 uv2 = uv / vec2(8907.0, 9803.0) + vec2(time / 101.0, time / 97.0);\n\t\t\tvec2 uv3 = uv / vec2(1091.0, 1027.0) - vec2(time / 109.0, time / -113.0);\n\t\t\tvec4 noise = texture2D(normalMap, uv0) +\n\t\t\ttexture2D(normalMap, uv1) +\n\t\t\ttexture2D(normalMap, uv2) +\n\t\t\ttexture2D(normalMap, uv3);\n\t\t\treturn noise * 0.5 - 1.0;\n\t\t}\n\n\t\tvoid sunLight(const vec3 surfaceNormal, const vec3 eyeDirection, const vec3 sunDirection, float Shininess, float spec, float diffuse, inout vec3 diffuseColor, inout vec3 specularColor) {\n\t\t\tvec3 reflection = normalize(reflect(-sunDirection, surfaceNormal));\n\t\t\tfloat direction = max(0.0, dot(eyeDirection, reflection));\n\t\t\tspecularColor += pow(direction, Shininess) * spec;\n\t\t\tdiffuseColor += max(dot(sunDirection, surfaceNormal), 0.0) * diffuse;\n\t\t}\n\n\t\tvec3 applyQuaternionV3 (vec3 v, vec4 q) {\n\t\t\tfloat ix = q.w * v.x + q.y * v.z - q.z * v.y;\n\t\t\tfloat iy = q.w * v.y + q.z * v.x - q.x * v.z;\n\t\t\tfloat iz = q.w * v.z + q.x * v.y - q.y * v.x;\n\t\t\tfloat iw = - q.x * v.x - q.y * v.y - q.z * v.z;\n\t\t\treturn vec3( ix * q.w + iw * ( -q.x ) + iy * ( -q.z ) - iz * ( -q.y ),\n\t\t\t\tiy * q.w + iw * ( -q.y ) + iz * ( -q.x ) - ix * ( -q.z ),\n\t\t\t\tiz * q.w + iw * ( -q.z ) + ix * ( -q.y ) - iy * ( -q.x ) );\n\t\t}\n\n\t\tvoid main() {\n\t\t\t#include <logdepthbuf_frag>\n\t\t\t// Get noise normal from normal map.\n\t\t\t// TODO: remove magic number?\n\t\t\tvec4 noise = getNoise(vUv * size + offset);\n\t\t\tvec3 surfaceNormal = normalize(noise.xzy * vec3(3.5, 1.0, 3.5));\n\n\t\t\t// Use waveStrength to control water face peaceful or not.\n\t\t\tsurfaceNormal = mix(vObjectNormal, surfaceNormal.xzy, waveStrength);\n\n\t\t\t// Sun light\n\t\t\tvec3 diffuseLight = vec3(0.0);\n\t\t\tvec3 specularLight = vec3(0.0);\n\t\t\tvec3 LightPosition2=(u_View * u_Model * vec4(LightPosition,0.)).xyz;\n\t\t\tvec3 sunDirection = normalize(LightPosition2 - vViewPosition);\n\t\t\tvec3 eyeDirection = normalize(-vViewPosition);\n\t\t\tsunLight(surfaceNormal, eyeDirection, sunDirection, 100.0, 2.0, 0.5, diffuseLight, specularLight);\n\n\t\t\t// Get reflect color\n\t\t\tfloat distance = length(vViewPosition);\n\t\t\tvec2 distortion = surfaceNormal.xy * (0.001 + 1.0 / distance) * distortionScale;\n\t\t\tvec3 reflectVec = reflect(normalize(vViewPosition), normalize(vNormal));\n\t\t\treflectVec = inverseTransformDirection(reflectVec, u_View);\n\t\t\treflectVec = vec3(envMapFlip * reflectVec.x, reflectVec.yz + distortion);\n\t\t\treflectVec = applyQuaternionV3(reflectVec, envQuaternion);\n\t\t\tvec4 reflectColor = textureCube(envMap, reflectVec);\n\n\t\t\t// Output\n\t\t\tfloat theta = max(dot(eyeDirection, surfaceNormal), 0.0);\n\t\t\tfloat reflectance = 0.3 + 0.7 * pow((1.0 - theta), 5.0);\n\t\t\tvec3 scatter = theta * waterColor;\n\t\t\tvec3 albedo = mix((sunColor * diffuseLight * 0.3 + scatter) , (vec3(0.1) + reflectColor.rgb  * 0.9 + reflectColor.rgb * specularLight), reflectance * reflectWeight);\n\t\t\tgl_FragColor = vec4(albedo, opacity);\n\t\t\t#include <fog_frag>\n\t\t}\n\t`\n};\n\nexport { WaterShader };"
  },
  {
    "path": "examples/jsm/shaders/XRayShader.js",
    "content": "const XRayShader = {\n\tname: 'xray',\n\n\tdefines: {},\n\n\tuniforms: {\n\t\tpower: 1.0,\n\t\tglowInverse: false,\n\t\tglowColor: [0, 200 / 255, 1]\n\t},\n\n\tvertexShader: `\n        #include <common_vert>\n\n\t\t#include <skinning_pars_vert>\n\n\t\tuniform float power;\n\t\tuniform bool glowInverse;\n\t\t\n\t\tvarying float intensity;\n\n\t\tvoid main() {\n            #include <begin_vert>\n\t\t\t#include <skinning_vert>\n\t\t\t#include <skinnormal_vert>\n\t\t\t#include <pvm_vert>\n\n\t\t\tmat4 normalMatrix = transposeMat4(inverseMat4(u_View * u_Model));\n\t\t\tvec3 viewSpaceNormal = normalize((normalMatrix * vec4(objectNormal, 0.0)).xyz);\n\t\t\tfloat normalFactor = abs(dot(viewSpaceNormal, vec3(0, 0, 1.)));\n\t\t\tif (glowInverse) {\n\t\t\t\tintensity = pow(normalFactor, power);\n\t\t\t} else {\n\t\t\t\tintensity = pow(1.0 - normalFactor, power);\n\t\t\t}\n\t\t}\n    `,\n\n\tfragmentShader: `\n        uniform float u_Opacity;\n\n        uniform vec3 glowColor;\n\n        varying float intensity;\n\n\t\tvoid main() {\n            gl_FragColor = vec4(glowColor, intensity * u_Opacity);\n\t\t}\n    `\n};\n\nexport { XRayShader };"
  },
  {
    "path": "examples/jsm/stereo/AnaglyphRenderer.js",
    "content": "import {\n\tTEXTURE_FILTER,\n\tOffscreenRenderTarget,\n\tMatrix4,\n\tMatrix3,\n\tShaderPostPass\n} from 't3d';\nimport { ForwardRenderer } from '../render/ForwardRenderer.js';\n\nclass AnaglyphRenderer extends ForwardRenderer {\n\n\tconstructor(view, options) {\n\t\tsuper(view, options);\n\n\t\tconst _colorMatrixLeft = new Matrix3().fromArray([\n\t\t\t0.456100, -0.0400822, -0.0152161,\n\t\t\t0.500484, -0.0378246, -0.0205971,\n\t\t\t0.176381, -0.0157589, -0.00546856\n\t\t]);\n\t\tconst _colorMatrixRight = new Matrix3().fromArray([\n\t\t\t-0.0434706, 0.378476, -0.0721527,\n\t\t\t-0.0879388, 0.73364, -0.112961,\n\t\t\t-0.00155529, -0.0184503, 1.2264\n\t\t]);\n\n\t\tthis.eyeSep = 0.064;\n\t\tthis.focus = 10;\n\n\t\tthis._cache = {\n\t\t\tprojection: new Matrix4(),\n\t\t\teyeSep: null,\n\t\t\tfocus: null\n\t\t};\n\n\t\tconst width = view.width;\n\t\tconst height = view.height;\n\n\t\tconst _renderTargetL = this._renderTargetL = OffscreenRenderTarget.create2D(width, height);\n\t\t_renderTargetL.texture.minFilter = TEXTURE_FILTER.LINEAR;\n\t\t_renderTargetL.texture.magFilter = TEXTURE_FILTER.NEAREST;\n\n\t\tconst _renderTargetR = this._renderTargetR = OffscreenRenderTarget.create2D(width, height);\n\t\t_renderTargetR.texture.minFilter = TEXTURE_FILTER.LINEAR;\n\t\t_renderTargetR.texture.magFilter = TEXTURE_FILTER.NEAREST;\n\n\t\tconst _shaderPostPass = this._shaderPostPass = new ShaderPostPass(AnaglyphShader);\n\t\t_shaderPostPass.uniforms.mapLeft = _renderTargetL.texture;\n\t\t_shaderPostPass.uniforms.mapRight = _renderTargetR.texture;\n\t\t_shaderPostPass.uniforms.colorMatrixLeft = _colorMatrixLeft.elements;\n\t\t_shaderPostPass.uniforms.colorMatrixRight = _colorMatrixRight.elements;\n\t\t_shaderPostPass.material.transparent = true;\n\t}\n\n\tresize(width, height) {\n\t\tthis._renderTargetL.resize(width, height);\n\t\tthis._renderTargetR.resize(width, height);\n\t}\n\n\trender(scene, camera, stereoCamera) {\n\t\tconst cameraL = stereoCamera.cameraL;\n\t\tconst cameraR = stereoCamera.cameraR;\n\n\t\tthis.matrixAutoUpdate && scene.updateMatrix();\n\n\t\tthis.updateCamera(camera, stereoCamera);\n\n\t\tscene.updateRenderStates(cameraL);\n\t\tscene.updateRenderQueue(cameraL);\n\n\t\tif (this.shadowAutoUpdate || this.shadowNeedsUpdate) {\n\t\t\tthis.shadowMapPass.render(this, scene);\n\t\t\tthis.shadowNeedsUpdate = false;\n\t\t}\n\n\t\tthis.renderScene(scene, cameraL, this._renderTargetL);\n\n\t\tscene.updateRenderStates(cameraR, false);\n\t\tscene.updateRenderQueue(cameraR, false, false);\n\n\t\tthis.renderScene(scene, cameraR, this._renderTargetR);\n\n\t\tif (this._renderTargetL.texture) {\n\t\t\tthis.generateMipmaps(this._renderTargetL.texture);\n\t\t}\n\t\tif (this._renderTargetR.texture) {\n\t\t\tthis.generateMipmaps(this._renderTargetR.texture);\n\t\t}\n\n\t\tthis._shaderPostPass.render(this, this.screenRenderTarget);\n\t}\n\n\tupdateCamera(camera, stereoCamera) {\n\t\tconst cameraL = stereoCamera.cameraL;\n\t\tconst cameraR = stereoCamera.cameraR;\n\n\t\tconst needsUpdate = !this._cache.projection.equals(camera.projectionMatrix)\n\t\t\t|| this._cache.eyeSep !== this.eyeSep\n\t\t\t|| this._cache.focus !== this.focus;\n\n\t\tif (needsUpdate) {\n\t\t\tthis._cache.projection.copy(camera.projectionMatrix);\n\t\t\tthis._cache.eyeSep = this.eyeSep;\n\t\t\tthis._cache.focus = this.focus;\n\n\t\t\tconst focus = this.focus;\n\t\t\tconst eyeSep = this.eyeSep;\n\n\t\t\tconst fov = getFov(camera.projectionMatrix);\n\t\t\tconst aspect = getAspect(camera.projectionMatrix);\n\t\t\tconst near = getNear(camera.projectionMatrix);\n\n\t\t\t// Off-axis stereoscopic effect based on\n\t\t\t// http://paulbourke.net/stereographics/stereorender/\n\n\t\t\t_projectionMatrix.copy(camera.projectionMatrix);\n\t\t\tconst eyeSepHalf = eyeSep / 2;\n\t\t\tconst eyeSepOnProjection = eyeSepHalf * near / focus;\n\n\t\t\tconst ymax = near * Math.tan(fov / 180 * Math.PI * 0.5);\n\t\t\tlet xmin, xmax;\n\n\t\t\t// translate xOffset\n\n\t\t\t_eyeLeft.elements[12] = -eyeSepHalf;\n\t\t\t_eyeRight.elements[12] = eyeSepHalf;\n\n\t\t\t// for left eye\n\n\t\t\txmin = -ymax * aspect + eyeSepOnProjection;\n\t\t\txmax = ymax * aspect + eyeSepOnProjection;\n\n\t\t\t_projectionMatrix.elements[0] = 2 * near / (xmax - xmin);\n\t\t\t_projectionMatrix.elements[8] = (xmax + xmin) / (xmax - xmin);\n\n\t\t\tcameraL.projectionMatrix.copy(_projectionMatrix);\n\n\t\t\t// for right eye\n\n\t\t\txmin = -ymax * aspect - eyeSepOnProjection;\n\t\t\txmax = ymax * aspect - eyeSepOnProjection;\n\n\t\t\t_projectionMatrix.elements[0] = 2 * near / (xmax - xmin);\n\t\t\t_projectionMatrix.elements[8] = (xmax + xmin) / (xmax - xmin);\n\n\t\t\tcameraR.projectionMatrix.copy(_projectionMatrix);\n\t\t}\n\n\t\tupdateStereoCamera(camera, cameraL, _eyeLeft);\n\t\tupdateStereoCamera(camera, cameraR, _eyeRight);\n\t}\n\n\tdispose() {\n\t\tthis._renderTargetL.dispose();\n\t\tthis._renderTargetR.dispose();\n\t\tthis._shaderPostPass.dispose();\n\t}\n\n}\n\nconst _eyeRight = new Matrix4();\nconst _eyeLeft = new Matrix4();\nconst _projectionMatrix = new Matrix4();\n\nfunction getFov(mat4) {\n\treturn 180 / Math.PI * (2 * Math.atan(1 / mat4.elements[5]));\n}\n\nfunction getNear(mat4) {\n\treturn mat4.elements[14] / (mat4.elements[13] - 1);\n}\n\nfunction getAspect(mat4) {\n\treturn mat4.elements[5] / mat4.elements[0];\n}\n\nfunction updateStereoCamera(camera, stereoCamera, offsetMat) {\n\tstereoCamera.worldMatrix.copy(camera.worldMatrix);\n\tstereoCamera.worldMatrix.multiply(offsetMat);\n\tstereoCamera.viewMatrix.copy(stereoCamera.worldMatrix).invert();\n\tstereoCamera.projectionMatrixInverse.copy(stereoCamera.projectionMatrix).invert();\n\tstereoCamera.projectionViewMatrix.multiplyMatrices(stereoCamera.projectionMatrix, stereoCamera.viewMatrix);\n\tstereoCamera.frustum.setFromMatrix(stereoCamera.projectionViewMatrix);\n}\n\nconst AnaglyphShader = {\n\tname: 'stereo_anaglyph',\n\n\tuniforms: {\n\t\t'mapLeft': null,\n\t\t'mapRight': null,\n\t\t'colorMatrixLeft': new Float32Array(9),\n\t\t'colorMatrixRight': new Float32Array(9)\n\t},\n\n\tvertexShader: `\n\t\tattribute vec3 a_Position;\n\t\tattribute vec2 a_Uv;\n\n\t\tuniform mat4 u_ProjectionView;\n\t\tuniform mat4 u_Model;\n\n\t\tvarying vec2 v_Uv;\n\n\t\tvoid main() {\n\t\t\tv_Uv = a_Uv;\n\t\t\tgl_Position = u_ProjectionView * u_Model * vec4( a_Position, 1.0 );\n\t\t}`,\n\n\tfragmentShader: `\n\t\tuniform sampler2D mapLeft;\n\t\tuniform sampler2D mapRight;\n\t\tvarying vec2 v_Uv;\n\n\t\tuniform mat3 colorMatrixLeft;\n\t\tuniform mat3 colorMatrixRight;\n\n\t\t// These functions implement sRGB linearization and gamma correction\n\n\t\tfloat lin( float c ) {\n\t\t\treturn c <= 0.04045 ? c * 0.0773993808 :\n\t\t\t\t\tpow( c * 0.9478672986 + 0.0521327014, 2.4 );\n\t\t}\n\n\t\tvec4 lin( vec4 c ) {\n\t\t\treturn vec4( lin( c.r ), lin( c.g ), lin( c.b ), c.a );\n\t\t}\n\n\t\tfloat dev( float c ) {\n\t\t\treturn c <= 0.0031308 ? c * 12.92\n\t\t\t\t\t: pow( c, 0.41666 ) * 1.055 - 0.055;\n\t\t}\n\n\t\tvoid main() {\n\t\t\tvec2 uv = v_Uv;\n\n\t\t\tvec4 colorL = lin( texture2D( mapLeft, uv ) );\n\t\t\tvec4 colorR = lin( texture2D( mapRight, uv ) );\n\n\t\t\tvec3 color = clamp(\n\t\t\t\t\tcolorMatrixLeft * colorL.rgb +\n\t\t\t\t\tcolorMatrixRight * colorR.rgb, 0., 1. );\n\n\t\t\tgl_FragColor = vec4(\n\t\t\t\t\tdev( color.r ), dev( color.g ), dev( color.b ),\n\t\t\t\t\tmax( colorL.a, colorR.a ) );\n\t\t}\n\t\t`\n};\n\nexport { AnaglyphRenderer };\n"
  },
  {
    "path": "examples/jsm/stereo/StereoCamera.js",
    "content": "import {\n\tCamera,\n\tObject3D,\n\tTEXEL_ENCODING_TYPE\n} from 't3d';\n\nclass StereoCamera extends Object3D {\n\n\tconstructor() {\n\t\tsuper();\n\n\t\tthis.cameraL = new Camera();\n\t\tthis.cameraR = new Camera();\n\n\t\tthis.near = 1;\n\t\tthis.far = 1000;\n\t}\n\n}\n\nObject.defineProperties(StereoCamera.prototype, {\n\tgammaFactor: {\n\t\tget: function() {\n\t\t\treturn this.cameraL.gammaFactor;\n\t\t},\n\t\tset: function(value) {\n\t\t\tthis.cameraL.gammaFactor = value;\n\t\t\tthis.cameraR.gammaFactor = value;\n\t\t}\n\t},\n\tgammaInput: {\n\t\tconfigurable: true,\n\t\tget: function() {\n\t\t\tconsole.warn('StereoCamera: .gammaInput has been removed. Use texture.encoding instead.');\n\t\t\treturn false;\n\t\t},\n\t\tset: function(value) {\n\t\t\tconsole.warn('StereoCamera: .gammaInput has been removed. Use texture.encoding instead.');\n\t\t}\n\t},\n\tgammaOutput: {\n\t\tconfigurable: true,\n\t\tget: function() {\n\t\t\tconsole.warn('StereoCamera: .gammaOutput has been removed. Use .outputEncoding or renderTarget.texture.encoding instead.');\n\t\t\treturn this.cameraL.outputEncoding == TEXEL_ENCODING_TYPE.GAMMA;\n\t\t},\n\t\tset: function(value) {\n\t\t\tconsole.warn('StereoCamera: .gammaOutput has been removed. Use .outputEncoding or renderTarget.texture.encoding instead.');\n\t\t\tif (value) {\n\t\t\t\tthis.cameraL.outputEncoding = TEXEL_ENCODING_TYPE.GAMMA;\n\t\t\t\tthis.cameraR.outputEncoding = TEXEL_ENCODING_TYPE.GAMMA;\n\t\t\t} else {\n\t\t\t\tthis.cameraL.outputEncoding = TEXEL_ENCODING_TYPE.LINEAR;\n\t\t\t\tthis.cameraR.outputEncoding = TEXEL_ENCODING_TYPE.LINEAR;\n\t\t\t}\n\t\t}\n\t},\n\toutputEncoding: {\n\t\tget: function() {\n\t\t\treturn this.cameraL.outputEncoding;\n\t\t},\n\t\tset: function(value) {\n\t\t\tthis.cameraL.outputEncoding = value;\n\t\t\tthis.cameraR.outputEncoding = value;\n\t\t}\n\t}\n});\n\nexport { StereoCamera };"
  },
  {
    "path": "examples/jsm/stereo/StereoRenderer.js",
    "content": "import { ForwardRenderer } from '../render/ForwardRenderer.js';\n\nclass StereoRenderer extends ForwardRenderer {\n\n\tconstructor(view, options) {\n\t\tsuper(view, options);\n\t}\n\n\trender(scene, camera, renderTarget) {\n\t\tconst cameraL = camera.cameraL;\n\t\tconst cameraR = camera.cameraR;\n\n\t\tthis.matrixAutoUpdate && scene.updateMatrix();\n\n\t\tscene.updateRenderStates(cameraL);\n\t\tscene.updateRenderQueue(cameraL); // TODO generate render queue by combined camera\n\n\t\tif (this.shadowAutoUpdate || this.shadowNeedsUpdate) {\n\t\t\tthis.shadowMapPass.render(this, scene);\n\n\t\t\tthis.shadowNeedsUpdate = false;\n\t\t}\n\n\t\trenderTarget = renderTarget || this.screenRenderTarget;\n\n\t\tthis.renderScene(scene, cameraL, renderTarget);\n\n\t\tscene.updateRenderStates(cameraR, false);\n\t\tscene.updateRenderQueue(cameraR, false, false);\n\n\t\tconst oldClearColor = renderTarget.clearColor;\n\t\tconst oldClearDepth = renderTarget.clearDepth;\n\t\tconst oldClearStencil = renderTarget.clearStencil;\n\n\t\trenderTarget.setClear(false, false, false);\n\t\tthis.renderScene(scene, cameraR, renderTarget);\n\n\t\trenderTarget.setClear(oldClearColor, oldClearDepth, oldClearStencil);\n\t}\n\n}\n\nexport { StereoRenderer };"
  },
  {
    "path": "examples/jsm/stereo/WebVRControls.js",
    "content": "class WebVRControl {\n\n\tconstructor(camera) {\n\t\tthis.camera = camera;\n\n\t\tthis._vrDisplay = null;\n\t\tthis._frameData = null;\n\n\t\tthis._currentDepthNear = 0;\n\t\tthis._currentDepthFar = 0;\n\t}\n\n\tenter() {\n\t\tif (navigator.getVRDisplays) {\n\t\t\treturn navigator.getVRDisplays().then(displays => {\n\t\t\t\tif (displays.length > 0) {\n\t\t\t\t\tthis._vrDisplay = displays[0];\n\t\t\t\t\treturn Promise.resolve();\n\t\t\t\t} else {\n\t\t\t\t\treturn Promise.reject('WebVRControl: displays.length = 0.');\n\t\t\t\t}\n\t\t\t}).then(() => {\n\t\t\t\tif ('VRFrameData' in window) {\n\t\t\t\t\tthis._frameData = new window.VRFrameData();\n\t\t\t\t\treturn Promise.resolve(this._vrDisplay);\n\t\t\t\t} else {\n\t\t\t\t\treturn Promise.reject('WebVRControl: VRFrameData not exist in global.');\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\treturn Promise.reject('WebVRControl: getVRDisplays not exist in navigator.');\n\t\t}\n\t}\n\n\texit() {\n\t\tthis._vrDisplay = null;\n\t\tthis._frameData = null;\n\t}\n\n\tupdate() {\n\t\tconst camera = this.camera;\n\t\tconst vrDisplay = this._vrDisplay;\n\t\tconst frameData = this._frameData;\n\n\t\tif (!vrDisplay || !frameData) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst cameraL = camera.cameraL;\n\t\tconst cameraR = camera.cameraR;\n\n\t\tif (this._currentDepthNear !== camera.near || this._currentDepthFar !== camera.far) {\n\t\t\t// read from camera\n\t\t\tvrDisplay.depthNear = camera.near;\n\t\t\tvrDisplay.depthFar = camera.far;\n\n\t\t\tthis._currentDepthNear = camera.near;\n\t\t\tthis._currentDepthFar = camera.far;\n\t\t}\n\n\t\tvrDisplay.getFrameData(frameData);\n\n\t\t// set Left Camera\n\t\tcameraL.projectionMatrix.elements = frameData.leftProjectionMatrix;\n\t\tcameraL.viewMatrix.elements = frameData.leftViewMatrix;\n\t\tcameraL.viewMatrix.invert().decompose(cameraL.position, cameraL.quaternion, cameraL.scale);\n\t\tcameraL.position.add(camera.position);\n\t\tcameraL.updateMatrix();\n\t\tcameraL.rect.set(0, 0, 0.5, 1);\n\n\t\t// set Right Camera\n\t\tcameraR.projectionMatrix.elements = frameData.leftProjectionMatrix;\n\t\tcameraR.viewMatrix.elements = frameData.rightViewMatrix;\n\t\tcameraR.viewMatrix.invert().decompose(cameraR.position, cameraR.quaternion, cameraR.scale);\n\t\tcameraR.position.add(camera.position);\n\t\tcameraR.updateMatrix();\n\t\tcameraR.rect.set(0.5, 0, 1, 1);\n\t}\n\n\tgetContext() {\n\t\treturn this._vrDisplay;\n\t}\n\n\tsubmit() {\n\t\tif (this._vrDisplay) {\n\t\t\tthis._vrDisplay.submitFrame();\n\t\t}\n\t}\n\n}\n\nexport { WebVRControl };"
  },
  {
    "path": "examples/jsm/stereo/WebXRControls.js",
    "content": "class WebXRControl {\n\n\tconstructor(camera) {\n\t\tthis.camera = camera;\n\n\t\tthis._session = null;\n\t\tthis._referenceSpace = null;\n\n\t\tthis._currentDepthNear = 0;\n\t\tthis._currentDepthFar = 0;\n\t}\n\n\tenter(gl, type = 'immersive-vr') {\n\t\tif (navigator.xr) {\n\t\t\tconst sessionInit = { optionalFeatures: ['local-floor', 'bounded-floor'] };\n\n\t\t\treturn navigator.xr.isSessionSupported(type)\n\t\t\t\t.then(supported => {\n\t\t\t\t\tif (supported) {\n\t\t\t\t\t\treturn Promise.resolve();\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn Promise.reject('WebXR: ' + type + ' is not supported');\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t\t.then(() => {\n\t\t\t\t\treturn navigator.xr.requestSession(type, sessionInit);\n\t\t\t\t})\n\t\t\t\t.then(session => {\n\t\t\t\t\tthis._session = session;\n\t\t\t\t\tconst attributes = gl.getContextAttributes();\n\t\t\t\t\tconst layerInit = {\n\t\t\t\t\t\tantialias: attributes.antialias,\n\t\t\t\t\t\talpha: attributes.alpha,\n\t\t\t\t\t\tdepth: attributes.depth,\n\t\t\t\t\t\tstencil: attributes.stencil,\n\t\t\t\t\t\tframebufferScaleFactor: 1.0\n\t\t\t\t\t};\n\t\t\t\t\tconst baseLayer = new XRWebGLLayer(session, gl, layerInit);\n\t\t\t\t\tsession.updateRenderState({ baseLayer });\n\t\t\t\t\treturn session.requestReferenceSpace('local-floor');\n\t\t\t\t})\n\t\t\t\t.then(referenceSpace => {\n\t\t\t\t\tthis._referenceSpace = referenceSpace;\n\t\t\t\t\treturn Promise.resolve(this._session);\n\t\t\t\t});\n\t\t} else {\n\t\t\treturn Promise.reject('xr not exist in navigator');\n\t\t}\n\t}\n\n\texit() {\n\t\t// todo\n\t}\n\n\tupdate(frame, width, height) {\n\t\tconst camera = this.camera;\n\t\tconst session = this._session;\n\t\tconst referenceSpace = this._referenceSpace;\n\n\t\tconst cameraL = camera.cameraL;\n\t\tconst cameraR = camera.cameraR;\n\n\t\tif (this._currentDepthNear !== camera.near || this._currentDepthFar !== camera.far) {\n\t\t\t// the new renderState won't apply until the next frame\n\t\t\tsession.updateRenderState({\n\t\t\t\tdepthNear: camera.near,\n\t\t\t\tdepthFar: camera.far\n\t\t\t});\n\t\t\tthis._currentDepthNear = camera.near;\n\t\t\tthis._currentDepthFar = camera.far;\n\t\t}\n\n\t\tconst pose = frame.getViewerPose(referenceSpace);\n\t\tif (pose !== null) {\n\t\t\tconst views = pose.views;\n\t\t\tconst baseLayer = session.renderState.baseLayer;\n\n\t\t\t// set cameras\n\t\t\tfor (let i = 0; i < views.length; i++) {\n\t\t\t\tconst view = views[i];\n\t\t\t\tconst viewport = baseLayer.getViewport(view);\n\n\t\t\t\tconst _camera = i === 0 ? cameraL : cameraR;\n\t\t\t\t_camera.matrix.fromArray(view.transform.matrix);\n\t\t\t\t_camera.matrix.decompose(_camera.position, _camera.quaternion, _camera.scale);\n\t\t\t\t_camera.position.add(camera.position);\n\t\t\t\t_camera.updateMatrix();\n\t\t\t\t_camera.projectionMatrix.fromArray(view.projectionMatrix);\n\t\t\t\t_camera.projectionMatrixInverse.copy(_camera.projectionMatrix).invert();\n\n\t\t\t\tconst x = viewport.x / width;\n\t\t\t\tconst y = viewport.y / height;\n\t\t\t\tconst _width = viewport.width / width;\n\t\t\t\tconst _height = viewport.height / height;\n\t\t\t\t_camera.rect.set(x, y, x + _width, y + _height);\n\t\t\t}\n\t\t}\n\t}\n\n\tgetContext() {\n\t\treturn this._session;\n\t}\n\n\tgetFramebuffer() {\n\t\treturn this._session.renderState.baseLayer.framebuffer;\n\t}\n\n}\n\nexport { WebXRControl };"
  },
  {
    "path": "examples/jsm/textures/GradientTextureGenerator.js",
    "content": "import { Texture2D, TEXTURE_FILTER } from 't3d';\n\nclass GradientTextureGenerator {\n\n\tconstructor(width = 256) {\n\t\tconst texture = new Texture2D();\n\t\ttexture.image = { data: null, width: width, height: 1 };\n\t\ttexture.magFilter = texture.minFilter = TEXTURE_FILTER.LINEAR;\n\t\ttexture.generateMipmaps = false;\n\t\tthis._texture = texture;\n\t}\n\n\tgradient(colorGradient) {\n\t\tconst texture = this._texture;\n\t\ttexture.image.data = colorGradient.getUint8Array(texture.image.width);\n\t\ttexture.version++;\n\t\treturn this;\n\t}\n\n\tgetTexture() {\n\t\treturn this._texture;\n\t}\n\n}\n\nexport { GradientTextureGenerator };"
  },
  {
    "path": "examples/jsm/textures/HeatmapGenerator.js",
    "content": "import {\n\tScene,\n\tGeometry,\n\tMesh,\n\tCamera,\n\tDRAW_MODE,\n\tBLEND_TYPE,\n\tShaderMaterial,\n\tOffscreenRenderTarget,\n\tAttribute,\n\tBuffer,\n\tShaderPostPass,\n\tATTACHMENT\n} from 't3d';\n\n/**\n * This class is used to generate heatmap textures.\n */\nclass HeatmapGenerator {\n\n\t/**\n\t * Create a heatmap generator.\n\t * @param {number} [width=1024] The initial width of the heatmap textures.\n\t * @param {number} [height=1024] The initial height of the heatmap textures.\n\t */\n\tconstructor(width = 1024, height = 1024) {\n\t\t// Gray pass\n\n\t\tthis._grayRenderTarget = OffscreenRenderTarget.create2D(width, height);\n\t\tthis._grayRenderTarget.detach(ATTACHMENT.DEPTH_STENCIL_ATTACHMENT);\n\t\tthis._grayRenderTarget\n\t\t\t.setColorClearValue(0, 0, 0, 1)\n\t\t\t.setClear(true, false, false);\n\n\t\tconst scene = new Scene();\n\n\t\tconst pointsGeometry = new Geometry();\n\t\tpointsGeometry.computeBoundingBox = function() {}; // hack for bounding box\n\t\tpointsGeometry.computeBoundingSphere = function() {}; // hack for bounding sphere\n\t\tconst pointsMaterial = new ShaderMaterial(heatmapPointsShader);\n\t\tpointsMaterial.transparent = true;\n\t\tpointsMaterial.blending = BLEND_TYPE.ADD;\n\t\tpointsMaterial.drawMode = DRAW_MODE.POINTS;\n\t\tpointsMaterial.depthTest = false;\n\t\tpointsMaterial.depthWrite = false;\n\t\tconst points = new Mesh(pointsGeometry, pointsMaterial);\n\t\tpoints.raycast = function raycast() { return null }; // hack for raycast\n\t\tpoints.frustumCulled = false;\n\t\tscene.add(points);\n\n\t\tconst camera = new Camera();\n\t\tcamera.frustumCulled = false;\n\t\tscene.add(camera);\n\n\t\tscene.updateMatrix();\n\n\t\tthis._renderStates = scene.updateRenderStates(camera);\n\n\t\tconst renderQueue = scene.updateRenderQueue(camera, false, false);\n\t\tthis._renderQueueLayer = renderQueue.layerList[0];\n\n\t\tthis._points = points;\n\n\t\t// Colorize pass\n\n\t\tthis._colorizeRenderTarget = OffscreenRenderTarget.create2D(width, height);\n\t\tthis._colorizeRenderTarget.detach(ATTACHMENT.DEPTH_STENCIL_ATTACHMENT);\n\t\tthis._colorizeRenderTarget\n\t\t\t.setColorClearValue(0, 0, 0, 0)\n\t\t\t.setClear(true, false, false);\n\n\t\tthis._colorizePass = new ShaderPostPass(heatmapColorizeShader);\n\t\tthis._colorizePass.material.depthTest = false;\n\t\tthis._colorizePass.material.depthWrite = false;\n\t\tthis._colorizePass.material.uniforms.tDiffuse = this._grayRenderTarget.texture;\n\t}\n\n\t/**\n\t * Resize heatmap textures.\n\t * The heatmap texture size only affects the image resolution, and generally does not affect the drawing results.\n\t * Note: resize will clear the content in the texture, so you need to re-execute rendering after resize.\n\t * @param {number} width\n\t * @param {number} height\n\t * @returns {HeatmapGenerator} this\n\t */\n\tresize(width, height) {\n\t\tthis._grayRenderTarget.resize(width, height);\n\t\tthis._colorizeRenderTarget.resize(width, height);\n\t\treturn this;\n\t}\n\n\t/**\n\t * To render a grayscale heatmap.\n\t * This method needs to be executed before executing colorize to generate the final heatmap.\n\t * @param {ThinRenderer} renderer\n\t * @param {Array} data [[x0, y0, value0], [x1, y1, value1], ...]\n\t * @param {object} options\n\t * @param {Array} options.size Dimensions in the data coordinate system with the origin at the center.\n\t * @param {number} options.radius The diffusion radius of the data point, the unit is 1 in the data coordinate system.\n\t * @param {string} options.interpolation (Optional) The interpolation method of the spread of data points, 'gaussian'(default) | 'linear' | 'cos'.\n\t * @param {number} options.gaussianSigma (Optional) Only effective in Gaussian interpolation mode. default is 0.158.\n\t * @param {Array} options.range (Optional) The range of data values, default is [0, 1].\n\t * @returns {HeatmapGenerator} this\n\t */\n\trender(renderer, data, options = {}) {\n\t\tconst size = options.size;\n\n\t\tconst radius = options.radius || 1;\n\t\tconst interpolation = options.interpolation || 'gaussian';\n\t\tconst gaussianSigma = options.gaussianSigma !== undefined ? options.gaussianSigma : 0.158;\n\n\t\tconst rangeMin = options.range !== undefined ? options.range[0] : 0;\n\t\tconst rangeMax = options.range !== undefined ? options.range[1] : 1;\n\t\tconst rangeDist = rangeMax - rangeMin;\n\n\t\tconst pixelWidth = this._grayRenderTarget.width;\n\t\tconst pixelHeight = this._grayRenderTarget.height;\n\n\t\tconst pointSizeX = radius / size[0] * pixelWidth * 2;\n\t\tconst pointSizeY = radius / size[1] * pixelHeight * 2;\n\n\t\tconst pointSize = Math.max(pointSizeX, pointSizeY);\n\n\t\t// When the width and height of the size are different,\n\t\t// in order to ensure that the spread is circular,\n\t\t// the following variables need to be introduced:\n\t\tconst xAxisFactor = Math.min(pointSizeX / pointSizeY, 1.0);\n\t\tconst yAxisFactor = Math.min(pointSizeY / pointSizeX, 1.0);\n\n\t\t// Update points geometry\n\n\t\tconst pointsGeometry = this._points.geometry;\n\t\tconst dataLength = data.length;\n\n\t\tlet attribute = pointsGeometry.getAttribute('a_Position');\n\t\tlet typedArray;\n\n\t\tif (attribute && attribute.buffer.count === dataLength) {\n\t\t\ttypedArray = attribute.buffer.array;\n\t\t\tattribute.buffer.version++;\n\t\t} else {\n\t\t\tpointsGeometry.dispose();\n\n\t\t\ttypedArray = new Float32Array(dataLength * 3);\n\n\t\t\tattribute = new Attribute(new Buffer(typedArray, 3));\n\t\t\tpointsGeometry.addAttribute('a_Position', attribute);\n\t\t\tpointsGeometry.version++;\n\t\t}\n\n\t\tfor (let i = 0; i < dataLength; i++) {\n\t\t\ttypedArray[i * 3 + 0] = data[i][0] / size[0] * 2;\n\t\t\ttypedArray[i * 3 + 1] = data[i][1] / size[1] * 2;\n\t\t\ttypedArray[i * 3 + 2] = (data[i][2] - rangeMin) / rangeDist;\n\t\t}\n\n\t\t// Update points material\n\n\t\tconst pointsMaterial = this._points.material;\n\t\tpointsMaterial.uniforms.pointSize = pointSize;\n\t\tpointsMaterial.uniforms.axisFactors[0] = xAxisFactor;\n\t\tpointsMaterial.uniforms.axisFactors[1] = yAxisFactor;\n\t\tpointsMaterial.uniforms.gaussianSigma = gaussianSigma;\n\n\t\tconst defines = pointsMaterial.defines;\n\t\tfor (const key in defines) {\n\t\t\tdefines[key] = (key === interpolationMap[interpolation]);\n\t\t\tpointsMaterial.needsUpdate = true;\n\t\t}\n\n\t\t// Render gray texture\n\n\t\t// @deprecated\n\t\t// This can be deleted when renderer.setClearColor is completely removed.\n\t\trenderer.getClearColor().toArray(_tempClearColor);\n\n\t\trenderer.beginRender(this._grayRenderTarget);\n\t\trenderer.renderRenderableList(this._renderQueueLayer.transparent, this._renderStates);\n\t\trenderer.endRender();\n\n\t\trenderer.generateMipmaps(this._grayRenderTarget.texture);\n\n\t\t// @deprecated\n\t\t// This can be deleted when renderer.setClearColor is completely removed.\n\t\trenderer.setClearColor(..._tempClearColor);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Colorize the grayscale texture according to the color gradient ribbon map.\n\t * @param {ThinRenderer} renderer\n\t * @param {Texture2D} gradientTexture\n\t * @param {object} options (Optional)\n\t * @param {boolean} options.alpha (Optional) Whether to generate images with alpha gradients, default is false.\n\t * @returns {HeatmapGenerator} this\n\t */\n\tcolorize(renderer, gradientTexture, options = {}) {\n\t\t// @deprecated\n\t\t// This can be deleted when renderer.setClearColor is completely removed.\n\t\trenderer.getClearColor().toArray(_tempClearColor);\n\n\t\tthis._colorizePass.material.uniforms.colormap = gradientTexture;\n\t\tthis._colorizePass.material.uniforms.alphaLerp = options.alpha ? 1 : 0;\n\t\tthis._colorizePass.render(renderer, this._colorizeRenderTarget);\n\n\t\trenderer.generateMipmaps(this._colorizeRenderTarget.texture);\n\n\t\t// @deprecated\n\t\t// This can be deleted when renderer.setClearColor is completely removed.\n\t\trenderer.setClearColor(..._tempClearColor);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Get heatmap gray texture.\n\t * @returns {Texture2D}\n\t */\n\tgetGrayTexture() {\n\t\treturn this._grayRenderTarget.texture;\n\t}\n\n\t/**\n\t * Get the colored heatmap texture.\n\t * @returns {Texture2D}\n\t */\n\tgetTexture() {\n\t\treturn this._colorizeRenderTarget.texture;\n\t}\n\n\t/**\n\t * Release the heatmap generator, including the textures it holds.\n\t */\n\tdispose() {\n\t\tthis._grayRenderTarget.dispose();\n\t\tthis._colorizeRenderTarget.dispose();\n\n\t\tthis._colorizePass.dispose();\n\n\t\tthis._points.geometry.dispose();\n\t\tthis._points.material.dispose();\n\t}\n\n}\n\nconst _tempClearColor = [0, 0, 0, 1];\n\nconst interpolationMap = {\n\t'gaussian': 'INTERPOLATION_GAUSSIAN',\n\t'linear': 'INTERPOLATION_LINEAR',\n\t'cos': 'INTERPOLATION_COS'\n};\n\nconst heatmapPointsShader = {\n\tname: 'heatmap_points',\n\tdefines: {\n\t\tINTERPOLATION_GAUSSIAN: true,\n\t\tINTERPOLATION_LINEAR: false,\n\t\tINTERPOLATION_COS: false\n\t},\n\tuniforms: {\n\t\tpointSize: 1,\n\t\taxisFactors: [1, 1],\n\t\tgaussianSigma: 0.158\n\t},\n\tvertexShader: `\n\t\tattribute vec3 a_Position;\n\t\tuniform float pointSize;\n\t\tvarying float v_Strength;\n\t\tvoid main() {\n\t\t\tv_Strength = clamp(a_Position.z, 0.0, 1.0);\n\t\t\tgl_Position = vec4(a_Position.xy, 0.5, 1.0);\n\t\t\tgl_PointSize = pointSize;\n\t\t}\n\t`,\n\tfragmentShader: `\n\t\tuniform vec2 axisFactors;\n\t\tuniform float gaussianSigma;\n\t\tvarying float v_Strength;\n\t\tvoid main() {\n\t\t\tfloat gray = v_Strength;\n\n\t\t\tfloat dx = gl_PointCoord.x - 0.5;\n\t\t\tfloat dy = gl_PointCoord.y - 0.5;\n\n\t\t\tdx /= axisFactors.x;\n\t\t\tdy /= axisFactors.y;\n\n\t\t\t#if defined(INTERPOLATION_GAUSSIAN)\n\t\t\t\tfloat sigma = gaussianSigma;\n\t\t\t\tfloat sigmaSquare = sigma * sigma;\n\t\t\t\tfloat gaussianKernel = exp(- (dx * dx + dy * dy) / (2. * sigmaSquare));\n\n\t\t\t\tgray *= gaussianKernel;\n\t\t\t#elif defined(INTERPOLATION_LINEAR)\n\t\t\t\tfloat rate = clamp(1.0 - 2.0 * sqrt(dx * dx + dy * dy), 0.0, 1.0);\n\t\t\t\tgray *= rate;\n\t\t\t#elif defined(INTERPOLATION_COS)\n\t\t\t\tfloat rate = clamp(1.0 - 2.0 * sqrt(dx * dx + dy * dy), 0.0, 1.0);\n\t\t\t\tgray *= 1. - cos(rate * 3.141592653 / 2.);\n\t\t\t#endif\n\n\t\t\tgl_FragColor = vec4(gray, gray, gray, 1.0);\n\t\t}\n\t`\n};\n\nconst heatmapColorizeShader = {\n\tname: 'heatmap_colorize',\n\tuniforms: {\n\t\talphaLerp: 0,\n\t\ttDiffuse: null,\n\t\tcolormap: null\n\t},\n\tvertexShader: `\n\t\t#include <common_vert>\n\t\tattribute vec2 a_Uv;\n\t\tvarying vec2 vUv;\n\t\tvoid main() {\n\t\t\tvUv = a_Uv;\n\t\t\tgl_Position = u_ProjectionView * u_Model * vec4(a_Position, 1.0);\n\t\t}\n\t`,\n\tfragmentShader: `\n\t\tuniform float alphaLerp;\n\t\tuniform sampler2D tDiffuse;\n\t\tuniform sampler2D colormap;\n\t\tvarying vec2 vUv;\n\t\tvoid main() {\n\t\t\tfloat value = texture2D(tDiffuse, vUv).r;\n\n\t\t\tvec3 color = texture2D(colormap, vec2(value, 0.5)).rgb;\n\t\t\tfloat alpha = max(1.0 - alphaLerp, min(value * 2.0, 1.0));\n\n\t\t\tgl_FragColor = vec4(color, alpha);\n\t\t}\n\t`\n};\n\nexport { HeatmapGenerator };"
  },
  {
    "path": "examples/jsm/textures/IDWMapGenerator.js",
    "content": "import {\n\tOffscreenRenderTarget,\n\tShaderPostPass,\n\tTexture2D,\n\tTEXTURE_FILTER,\n\tPIXEL_TYPE,\n\tPIXEL_FORMAT,\n\tATTACHMENT,\n\tMathUtils\n} from 't3d';\n\n/**\n * This class is used to generate idwmap textures.\n */\nclass IDWMapGenerator {\n\n\t/**\n\t * Create a idwmap generator.\n\t * @param {number} [width=1024] The initial width of the idwmap textures.\n\t * @param {number} [height=1024] The initial height of the idwmap textures.\n\t */\n\tconstructor(width = 1024, height = 1024) {\n\t\t// Gray pass\n\n\t\tthis._grayRenderTarget = OffscreenRenderTarget.create2D(width, height);\n\t\tthis._grayRenderTarget.detach(ATTACHMENT.DEPTH_STENCIL_ATTACHMENT);\n\t\tthis._grayRenderTarget\n\t\t\t.setColorClearValue(0, 0, 0, 1)\n\t\t\t.setClear(true, false, false);\n\n\t\tconst pointTexture = new Texture2D();\n\t\tpointTexture.type = PIXEL_TYPE.FLOAT;\n\t\tpointTexture.magFilter = TEXTURE_FILTER.NEAREST;\n\t\tpointTexture.minFilter = TEXTURE_FILTER.NEAREST;\n\t\tpointTexture.generateMipmaps = false;\n\t\tpointTexture.format = PIXEL_FORMAT.RGBA;\n\t\tpointTexture.flipY = false;\n\n\t\tthis._grayPass = new ShaderPostPass(idwmapPointsShader);\n\t\tthis._grayPass.material.depthTest = false;\n\t\tthis._grayPass.material.depthWrite = false;\n\t\tthis._grayPass.material.uniforms.pointTexture = pointTexture;\n\n\t\tthis._pointTexture = pointTexture;\n\t\tthis._dataLength = 0;\n\t\tthis._pointTextureSize = 0;\n\n\t\t// Colorize pass\n\n\t\tthis._colorizeRenderTarget = OffscreenRenderTarget.create2D(width, height);\n\t\tthis._colorizeRenderTarget.detach(ATTACHMENT.DEPTH_STENCIL_ATTACHMENT);\n\t\tthis._colorizeRenderTarget\n\t\t\t.setColorClearValue(0, 0, 0, 0)\n\t\t\t.setClear(true, false, false);\n\n\t\tthis._colorizePass = new ShaderPostPass(idwmapColorizeShader);\n\t\tthis._colorizePass.material.depthTest = false;\n\t\tthis._colorizePass.material.depthWrite = false;\n\t\tthis._colorizePass.material.uniforms.tDiffuse = this._grayRenderTarget.texture;\n\n\t\t//\n\n\t\tthis._capabilitiesChecked = false;\n\t}\n\n\t_checkCapabilities(capabilities) {\n\t\tif (this._capabilitiesChecked) return;\n\n\t\tconst isWebGL2 = capabilities.version > 1;\n\n\t\tlet type;\n\n\t\tif (isWebGL2) {\n\t\t\tif (capabilities.getExtension('EXT_color_buffer_float') && capabilities.getExtension('OES_texture_float_linear')) {\n\t\t\t\ttype = PIXEL_TYPE.FLOAT;\n\t\t\t} else {\n\t\t\t\ttype = PIXEL_TYPE.HALF_FLOAT;\n\t\t\t}\n\t\t} else {\n\t\t\tif (capabilities.getExtension('OES_texture_float') && capabilities.getExtension('OES_texture_float_linear')) {\n\t\t\t\ttype = PIXEL_TYPE.FLOAT;\n\t\t\t} else if (capabilities.getExtension('OES_texture_half_float') && capabilities.getExtension('OES_texture_half_float_linear')) {\n\t\t\t\ttype = PIXEL_TYPE.HALF_FLOAT;\n\t\t\t} else {\n\t\t\t\ttype = PIXEL_TYPE.UNSIGNED_BYTE;\n\t\t\t}\n\t\t}\n\n\t\tthis._grayRenderTarget.texture.type = type;\n\n\t\tif (!isWebGL2 && !capabilities.getExtension('OES_texture_float')) {\n\t\t\tthis._pointTexture.type = PIXEL_TYPE.HALF_FLOAT;\n\t\t}\n\n\t\tthis._capabilitiesChecked = true;\n\t}\n\n\t/**\n\t * Resize idwmap textures.\n\t * The idwmap texture size only affects the image resolution, and generally does not affect the drawing results.\n\t * Note: resize will clear the content in the texture, so you need to re-execute rendering after resize.\n\t * @param {number} width\n\t * @param {number} height\n\t * @returns {IDWMapGenerator} this\n\t */\n\tresize(width, height) {\n\t\tthis._grayRenderTarget.resize(width, height);\n\t\tthis._colorizeRenderTarget.resize(width, height);\n\t\treturn this;\n\t}\n\n\t/**\n\t * To render a grayscale idwmap.\n\t * This method needs to be executed before executing colorize to generate the final idwmap.\n\t * @param {ThinRenderer} renderer\n\t * @param {Array} data [[x0, y0, value0], [x1, y1, value1], ...]\n\t * @param {object} options\n\t * @param {Array} options.size Dimensions in the data coordinate system with the origin at the center.\n\t * @param {string} options.exponent (Optional) The exponent for idwmap, default is 2.\n\t * @param {Array} options.range (Optional) The range of data values, default is [0, 1].\n\t * @returns {IDWMapGenerator} this\n\t */\n\trender(renderer, data, options = {}) {\n\t\tthis._checkCapabilities(renderer.capabilities);\n\n\t\tconst size = options.size;\n\n\t\tconst exponent = options.exponent || 2;\n\n\t\tconst rangeMin = options.range !== undefined ? options.range[0] : 0;\n\t\tconst rangeMax = options.range !== undefined ? options.range[1] : 1;\n\t\tconst rangeDist = rangeMax - rangeMin;\n\n\t\tconst dataLength = data.length;\n\n\t\tlet textureSize = this._pointTextureSize;\n\t\tif (this._dataLength !== dataLength) {\n\t\t\tthis._dataLength = dataLength;\n\t\t\ttextureSize = Math.sqrt(dataLength);\n\t\t\ttextureSize = MathUtils.nextPowerOfTwo(Math.ceil(textureSize));\n\t\t\ttextureSize = Math.max(4, textureSize);\n\t\t\tthis._pointTextureSize = textureSize;\n\t\t}\n\t\tlet pointMatrices;\n\t\tif (this._pointTexture.type === PIXEL_TYPE.FLOAT) {\n\t\t\tpointMatrices = new Float32Array(textureSize * textureSize * 4);\n\n\t\t\tfor (let i = 0; i < dataLength; i++) {\n\t\t\t\tpointMatrices[4 * i] = data[i][0] / size[0];\n\t\t\t\tpointMatrices[4 * i + 1] = data[i][1] / size[1];\n\t\t\t\tpointMatrices[4 * i + 2] = (data[i][2] - rangeMin) / rangeDist;\n\t\t\t\tpointMatrices[4 * i + 3] = 1;\n\t\t\t}\n\t\t} else {\n\t\t\tpointMatrices = new Uint16Array(textureSize * textureSize * 4);\n\n\t\t\tfor (let i = 0; i < dataLength; i++) {\n\t\t\t\tpointMatrices[4 * i] = toHalf(data[i][0] / size[0]);\n\t\t\t\tpointMatrices[4 * i + 1] = toHalf(data[i][1] / size[1]);\n\t\t\t\tpointMatrices[4 * i + 2] = toHalf((data[i][2] - rangeMin) / rangeDist);\n\t\t\t\tpointMatrices[4 * i + 3] = toHalf(1);\n\t\t\t}\n\t\t}\n\n\t\tthis._pointTexture.image = {\n\t\t\tdata: pointMatrices,\n\t\t\twidth: textureSize,\n\t\t\theight: textureSize\n\t\t};\n\t\tthis._pointTexture.version++;\n\n\t\t// Render gray texture\n\n\t\t// @deprecated\n\t\t// This can be deleted when renderer.setClearColor is completely removed.\n\t\trenderer.getClearColor().toArray(_tempClearColor);\n\n\t\tif (this._grayPass.material.defines.POINTS_NUM !== dataLength) {\n\t\t\tthis._grayPass.material.defines.POINTS_NUM = dataLength;\n\t\t\tthis._grayPass.material.needsUpdate = true;\n\t\t}\n\t\tthis._grayPass.material.uniforms.pointTexture = this._pointTexture;\n\t\tthis._grayPass.material.uniforms.idw_exponent = exponent;\n\t\tthis._grayPass.material.uniforms.pointTextureSize = textureSize;\n\n\t\tthis._grayPass.render(renderer, this._grayRenderTarget);\n\n\t\trenderer.generateMipmaps(this._grayRenderTarget.texture);\n\n\t\t// @deprecated\n\t\t// This can be deleted when renderer.setClearColor is completely removed.\n\t\trenderer.setClearColor(..._tempClearColor);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Colorize the grayscale texture according to the color gradient ribbon map.\n\t * @param {ThinRenderer} renderer\n\t * @param {Texture2D} gradientTexture\n\t * @param {object} options (Optional)\n\t * @param {boolean} options.isoline (Optional) Whether to show isoline, default is false.\n\t * @returns {IDWMapGenerator} this\n\t */\n\tcolorize(renderer, gradientTexture, options = {}) {\n\t\t// @deprecated\n\t\t// This can be deleted when renderer.setClearColor is completely removed.\n\t\trenderer.getClearColor().toArray(_tempClearColor);\n\n\t\tif (this._colorizePass.material.defines.ISOLINE !== !!options.isoline) {\n\t\t\tthis._colorizePass.material.defines.ISOLINE = !!options.isoline;\n\t\t\tthis._colorizePass.material.needsUpdate = true;\n\t\t}\n\t\tthis._colorizePass.material.uniforms.colormap = gradientTexture;\n\t\tthis._colorizePass.render(renderer, this._colorizeRenderTarget);\n\n\t\trenderer.generateMipmaps(this._colorizeRenderTarget.texture);\n\n\t\t// @deprecated\n\t\t// This can be deleted when renderer.setClearColor is completely removed.\n\t\trenderer.setClearColor(..._tempClearColor);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Get idwmap gray texture.\n\t * @returns {Texture2D}\n\t */\n\tgetGrayTexture() {\n\t\treturn this._grayRenderTarget.texture;\n\t}\n\n\t/**\n\t * Get the colored idwmap texture.\n\t * @returns {Texture2D}\n\t */\n\tgetTexture() {\n\t\treturn this._colorizeRenderTarget.texture;\n\t}\n\n\t/**\n\t * Release the idwmap generator, including the textures it holds.\n\t */\n\tdispose() {\n\t\tthis._grayRenderTarget.dispose();\n\t\tthis._colorizeRenderTarget.dispose();\n\n\t\tthis._grayPass.dispose();\n\t\tthis._colorizePass.dispose();\n\n\t\tthis._pointTexture.dispose();\n\t}\n\n}\n\nconst _tempClearColor = [0, 0, 0, 1];\n\nconst idwmapPointsShader = {\n\tname: 'idwmap_points',\n\tdefines: {\n\t\tPOINTS_NUM: 0\n\t},\n\tuniforms: {\n\t\tidw_exponent: 2,\n\t\tpointTexture: null,\n\t\tpointTextureSize: 1\n\t},\n\tvertexShader: `\n        #include <common_vert>\n        attribute vec2 a_Uv;\n        varying vec2 v_Uv;\n        void main() {\n            v_Uv = a_Uv;\n            gl_Position = u_ProjectionView * u_Model * vec4(a_Position, 1.0);\n        }\n    `,\n\tfragmentShader: `\n        #include <common_frag>\n        uniform float idw_exponent;\n\t\tuniform sampler2D pointTexture;\n        uniform float pointTextureSize;\n        varying vec2 v_Uv;\n\n        struct Accumulator {\n            float m_sumOfWeightedValues;\n            float m_sumOfWeights;\n        };\n\n        float GetWeightedAverage(Accumulator acc) {\n            return acc.m_sumOfWeightedValues / acc.m_sumOfWeights;\n        }\n\n        void main() {\n            float exactThreshold = 0.01; // if we are very close to a point then avoid a divide by zero and set to exact weight of the point\n\n            Accumulator acc = Accumulator(0.0, 0.0);\n\n            vec2 fragCoord = v_Uv;\n\t\t\tfragCoord.x -= 0.5;\n\t\t\tfragCoord.y -= 0.5;\n\n            float interpolatedValue = 0.;\n\n            for (int i = 0; i < POINTS_NUM; ++i) {\n                float i_float = float(i);\n                float j = i_float * 1.0;\n                float x = mod(j, pointTextureSize);\n                float y = floor(j / pointTextureSize);\n\n                float dx = 1.0 / pointTextureSize;\n                float dy = 1.0 / pointTextureSize;\n\n                vec4 pointSampler = texture2D(pointTexture, vec2(dx * (x + 0.5), dy * (y + 0.5)));\n\n                float dist = max(exactThreshold, length(fragCoord.xy - pointSampler.xy));\n\n                float weight = 1.0 / pow(dist, idw_exponent);\n\n                acc.m_sumOfWeights += weight;\n                acc.m_sumOfWeightedValues += weight * pointSampler.z;\n            }\n\n            interpolatedValue = GetWeightedAverage(acc);\n\n\t\t\tinterpolatedValue = clamp(interpolatedValue, 0.0, 1.0);\n\n            gl_FragColor = vec4(interpolatedValue, interpolatedValue, interpolatedValue, 1.0);\n        }\n    `\n};\n\nconst idwmapColorizeShader = {\n\tname: 'idwmap_colorize',\n\tdefines: {\n\t\tISOLINE: false\n\t},\n\tuniforms: {\n\t\ttDiffuse: null,\n\t\tcolormap: null\n\t},\n\tvertexShader: `\n\t\t#include <common_vert>\n\t\tattribute vec2 a_Uv;\n\t\tvarying vec2 vUv;\n\t\tvoid main() {\n\t\t\tvUv = a_Uv;\n\t\t\tgl_Position = u_ProjectionView * u_Model * vec4(a_Position, 1.0);\n\t\t}\n\t`,\n\tfragmentShader: `\n\t\tuniform sampler2D tDiffuse;\n\t\tuniform sampler2D colormap;\n\n\t\tvarying vec2 vUv;\n\n\t\t#ifdef ISOLINE\n\t\t\tfloat isoline(float val, float lg, float ref, float pas, float thickness) {\n\t\t\t\tfloat v = abs(mod(val - ref + pas * .5, pas) - pas * .5) / lg - .1 * thickness;\n\t\t\t\treturn smoothstep(.2, .8, v);\n\t\t\t}\n\t\t#endif\n\n\t\tvoid main() {\n\t\t\tfloat value = texture2D(tDiffuse, vUv).r;\n\t\t\tvec3 color = texture2D(colormap, vec2(value, 0.5)).rgb;\n\n\t\t\t#ifdef ISOLINE\n\t\t\t\tfloat lg = 2. * length(vec2(dFdx(value), dFdy(value)));\n\t\t\t\tfloat k1 = isoline(value, lg, .0, .2, 1.);\n\t\t\t\tfloat k2 = isoline(value, lg, .0, .05, .1);\n\n\t\t\t\tif (lg > 0.0001) {\n\t\t\t\t\tcolor *= step(0.0001, lg) * (.3 + (k1 * .7));\n\t\t\t\t\tcolor *= step(0.0001, lg) * (.7 + (k2 * .3));\n\t\t\t\t}\n\t\t\t#endif\n\n\t\t\tgl_FragColor = vec4(color, 1.0);\n\t\t}\n\t`\n};\n\nconst floatView = new Float32Array(1);\nconst int32View = new Int32Array(floatView.buffer);\n\n// stackoverflow.com/questions/32633585/how-do-you-convert-to-half-floats-in-javascript\nfunction toHalf(fval) {\n\tfloatView[0] = fval;\n\tconst fbits = int32View[0];\n\tconst sign = (fbits >> 16) & 0x8000; // sign only\n\tlet val = (fbits & 0x7fffffff) + 0x1000; // rounded value\n\n\tif (val >= 0x47800000) { // might be or become NaN/Inf\n\t\tif ((fbits & 0x7fffffff) >= 0x47800000) {\n\t\t\t// is or must become NaN/Inf\n\t\t\tif (val < 0x7f800000) { // was value but too large\n\t\t\t\treturn sign | 0x7c00; // make it +/-Inf\n\t\t\t}\n\t\t\treturn sign | 0x7c00 | // remains +/-Inf or NaN\n\t\t\t\t(fbits & 0x007fffff) >> 13; // keep NaN (and Inf) bits\n\t\t}\n\t\treturn sign | 0x7bff; // unrounded not quite Inf\n\t}\n\tif (val >= 0x38800000) { // remains normalized value\n\t\treturn sign | val - 0x38000000 >> 13; // exp - 127 + 15\n\t}\n\tif (val < 0x33000000) { // too small for subnormal\n\t\treturn sign; // becomes +/-0\n\t}\n\tval = (fbits & 0x7fffffff) >> 23; // tmp exp for subnormal calc\n\treturn sign | ((fbits & 0x7fffff | 0x800000) // add subnormal bit\n\t\t\t+ (0x800000 >>> val - 102) // round depending on cut off\n\t\t\t>> 126 - val); // div by 2^(1-(exp-127+15)) and >> 13 | exp=0\n}\n\nexport { IDWMapGenerator };"
  },
  {
    "path": "examples/jsm/textures/PMREMGenerator.js",
    "content": "import {\n\tBoxGeometry,\n\tDRAW_SIDE,\n\tMesh,\n\tOffscreenRenderTarget,\n\tScene,\n\tShaderMaterial,\n\tTexture2D,\n\tTextureCube,\n\tEuler,\n\tQuaternion,\n\tPIXEL_FORMAT,\n\tPIXEL_TYPE,\n\tTEXTURE_FILTER,\n\tATTACHMENT\n} from 't3d';\nimport { ReflectionProbe } from '../probes/ReflectionProbe.js';\n\n/**\n * This class generates a Prefiltered, Mipmapped Radiance Environment Map.\n * Reference to:\n * http://holger.dammertz.org/stuff/notes_HammersleyOnHemisphere.html\n * https://github.com/pissang/claygl/blob/master/src/util/cubemap.js\n * https://github.com/mrdoob/three.js/blob/dev/src/extras/PMREMGenerator.js\n * https://threejs.org/examples/?q=mipmap#webgl_materials_cubemap_render_to_mipmaps\n */\nclass PMREMGenerator {\n\n\t/**\n\t * Constructs a new PMREMGenerator.\n\t * @param {number} [sampleSize=512] - The sample size for the normal distribution.\n\t */\n\tconstructor(sampleSize = 512) {\n\t\t/**\n\t\t * Add rotation to the environment map.\n\t\t * @type {Euler}\n\t\t */\n\t\tthis.rotation = new Euler();\n\n\t\t/**\n\t\t * Whether to use the legacy(webgl1) method to generate PMREM.\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.legacy = true;\n\n\t\t// init\n\n\t\tconst geometry = new BoxGeometry(1, 1, 1);\n\t\tconst material = new ShaderMaterial(prefilterShader);\n\t\tmaterial.side = DRAW_SIDE.BACK;\n\t\tmaterial.uniforms.normalDistribution = this._generateNormalDistribution(256, sampleSize);\n\t\tmaterial.defines.SAMPLE_NUMBER = sampleSize;\n\t\tconst envMesh = new Mesh(geometry, material);\n\t\tenvMesh.frustumCulled = false;\n\n\t\tconst dummyScene = new Scene();\n\t\tdummyScene.add(envMesh);\n\n\t\tconst quaternion = new Quaternion();\n\t\tthis.rotation.onChange(() => { // auto sync rotation to dummyScene\n\t\t\tquaternion.setFromEuler(this.rotation);\n\t\t\tquaternion.toMatrix4(dummyScene.anchorMatrix);\n\t\t});\n\n\t\tthis._envMesh = envMesh;\n\t\tthis._dummyScene = dummyScene;\n\t}\n\n\t/**\n\t * Generate a PMREM from a cubeMap or equirectangular environment texture.\n\t * @param {ThinRenderer} renderer - The renderer.\n\t * @param {TextureCube|Texture2D} source - The environment map.\n\t * @param {TextureCube} [target] - The output texture. If not provided, a new cube texture will be created.\n\t * @returns {TextureCube}\n\t */\n\tprefilter(renderer, source, target = new TextureCube()) {\n\t\t// Check capabilities\n\n\t\tconst capabilities = renderer.capabilities;\n\t\tconst isWebGL2 = capabilities.version > 1;\n\n\t\tif (isWebGL2) {\n\t\t\tcapabilities.getExtension('EXT_color_buffer_float');\n\t\t} else {\n\t\t\tcapabilities.getExtension('OES_texture_half_float');\n\t\t\tcapabilities.getExtension('OES_texture_half_float_linear');\n\t\t}\n\n\t\tcapabilities.getExtension('OES_texture_float_linear');\n\t\tcapabilities.getExtension('EXT_color_buffer_half_float');\n\n\t\tconst legacy = this.legacy || !isWebGL2;\n\n\t\t// Calculate mipmaps number and cube size\n\n\t\tlet cubeSize;\n\t\tif (source.isTextureCube) {\n\t\t\tcubeSize = source.images.length === 0 ? 16 : source.images[0].width;\n\t\t} else {\n\t\t\tcubeSize = source.image.width / 4;\n\t\t}\n\t\tconst mipmapNum = Math.floor(Math.log2(cubeSize));\n\t\tcubeSize = Math.pow(2, mipmapNum);\n\n\t\t// Prepare the target texture\n\n\t\ttarget.type = PIXEL_TYPE.HALF_FLOAT;\n\t\ttarget.format = PIXEL_FORMAT.RGBA;\n\t\ttarget.generateMipmaps = false;\n\n\t\tlet mipmapSize = cubeSize;\n\t\tfor (let i = 0; i < mipmapNum + 1; i++) {\n\t\t\ttarget.mipmaps[i] = [];\n\t\t\tfor (let j = 0; j < 6; j++) {\n\t\t\t\ttarget.mipmaps[i].push({ width: mipmapSize, height: mipmapSize, data: null });\n\t\t\t}\n\t\t\tmipmapSize = mipmapSize / 2;\n\t\t}\n\n\t\t// Prepare render target\n\n\t\tconst renderTarget = OffscreenRenderTarget.createCube(cubeSize, cubeSize);\n\t\trenderTarget.detach(ATTACHMENT.DEPTH_STENCIL_ATTACHMENT);\n\n\t\tif (legacy) {\n\t\t\trenderTarget.texture.type = PIXEL_TYPE.HALF_FLOAT;\n\t\t\trenderTarget.texture.format = PIXEL_FORMAT.RGBA;\n\t\t\trenderTarget.texture.generateMipmaps = false;\n\t\t} else {\n\t\t\trenderTarget.attach(target, ATTACHMENT.COLOR_ATTACHMENT0);\n\t\t}\n\n\t\t// Prepare render stuff\n\n\t\tconst reflectionProbe = new ReflectionProbe(renderTarget);\n\t\tthis._dummyScene.add(reflectionProbe.camera);\n\n\t\tlet envMapFlip = 1;\n\t\tif (source.isTextureCube && source.images[0] && source.images[0].rtt) {\n\t\t\tenvMapFlip = -1;\n\t\t}\n\t\tif (!legacy) {\n\t\t\tenvMapFlip *= -1;\n\t\t}\n\n\t\tthis._envMesh.material.cubeMap = source;\n\t\tthis._envMesh.material.uniforms.environmentMap = source;\n\t\tthis._envMesh.material.uniforms.envMapFlip = envMapFlip;\n\t\tif (this._envMesh.material.defines.PANORAMA !== !source.isTextureCube) {\n\t\t\tthis._envMesh.material.defines.PANORAMA = !source.isTextureCube;\n\t\t\tthis._envMesh.material.needsUpdate = true;\n\t\t}\n\n\t\t// Render mipmaps\n\n\t\tthis._dummyScene.updateRenderStates(reflectionProbe.camera);\n\n\t\tfor (let i = 0; i < mipmapNum + 1; i++) {\n\t\t\tthis._envMesh.material.uniforms.roughness = Math.max(i - 1, 0) / mipmapNum;\n\n\t\t\tif (legacy) {\n\t\t\t\treflectionProbe.render(renderer, this._dummyScene);\n\t\t\t\tfor (let j = 0; j < 6; j++) {\n\t\t\t\t\tconst mipmapData = target.mipmaps[i][j];\n\t\t\t\t\tmipmapData.data = new Uint16Array(mipmapData.width * mipmapData.height * 4);\n\t\t\t\t\trenderer.readTexturePixelsSync(\n\t\t\t\t\t\trenderTarget.texture,\n\t\t\t\t\t\t0, 0, mipmapData.width, mipmapData.height,\n\t\t\t\t\t\tmipmapData.data, j\n\t\t\t\t\t);\n\t\t\t\t\tif (i === 0) {\n\t\t\t\t\t\ttarget.images[j] = mipmapData;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\trenderTarget.resize(renderTarget.width / 2, renderTarget.height / 2);\n\t\t\t} else {\n\t\t\t\trenderTarget.activeMipmapLevel = i;\n\t\t\t\treflectionProbe.render(renderer, this._dummyScene);\n\t\t\t\treflectionProbe.camera.rect.z /= 2;\n\t\t\t\treflectionProbe.camera.rect.w /= 2;\n\t\t\t}\n\t\t}\n\n\t\tlegacy && target.version++;\n\n\t\t// Clear render stuff\n\n\t\t!legacy && renderTarget.detach(ATTACHMENT.COLOR_ATTACHMENT0);\n\t\trenderTarget.dispose();\n\t\tthis._dummyScene.remove(reflectionProbe.camera);\n\n\t\t// Return the target texture\n\n\t\treturn target;\n\t}\n\n\t/**\n\t * Dispose of the PMREMGenerator.\n\t */\n\tdispose() {\n\t\tthis._envMesh.material.uniforms.normalDistribution.dispose();\n\n\t\tthis._envMesh.geometry.dispose();\n\t\tthis._envMesh.material.dispose();\n\t}\n\n\t_generateNormalDistribution(roughnessLevels = 256, sampleSize = 1024) {\n\t\tconst pixels = new Float32Array(sampleSize * roughnessLevels * 4);\n\n\t\tconst tmp = [];\n\n\t\tfor (let j = 0; j < roughnessLevels; j++) {\n\t\t\tconst roughness = j / roughnessLevels;\n\t\t\tconst a = roughness * roughness;\n\n\t\t\tfor (let i = 0; i < sampleSize; i++) {\n\t\t\t\t// http://holger.dammertz.org/stuff/notes_HammersleyOnHemisphere.html\n\t\t\t\t// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Bitwise_Operators\n\t\t\t\t// http://stackoverflow.com/questions/1908492/unsigned-integer-in-javascript\n\t\t\t\t// http://stackoverflow.com/questions/1822350/what-is-the-javascript-operator-and-how-do-you-use-it\n\t\t\t\tlet y = (i << 16 | i >>> 16) >>> 0;\n\t\t\t\ty = ((y & 1431655765) << 1 | (y & 2863311530) >>> 1) >>> 0;\n\t\t\t\ty = ((y & 858993459) << 2 | (y & 3435973836) >>> 2) >>> 0;\n\t\t\t\ty = ((y & 252645135) << 4 | (y & 4042322160) >>> 4) >>> 0;\n\t\t\t\ty = (((y & 16711935) << 8 | (y & 4278255360) >>> 8) >>> 0) / 4294967296;\n\n\t\t\t\t// CDF\n\t\t\t\tconst cosTheta = Math.sqrt((1 - y) / (1 + (a * a - 1.0) * y));\n\t\t\t\ttmp[i] = cosTheta;\n\t\t\t}\n\n\t\t\tfor (let i = 0; i < sampleSize; i++) {\n\t\t\t\tconst offset = (i * roughnessLevels + j) * 4;\n\t\t\t\tconst cosTheta = tmp[i];\n\t\t\t\tconst sinTheta = Math.sqrt(1.0 - cosTheta * cosTheta);\n\t\t\t\tconst x = i / sampleSize;\n\t\t\t\tconst phi = 2.0 * Math.PI * x;\n\t\t\t\tpixels[offset] = sinTheta * Math.cos(phi);\n\t\t\t\tpixels[offset + 1] = cosTheta;\n\t\t\t\tpixels[offset + 2] = sinTheta * Math.sin(phi);\n\t\t\t\tpixels[offset + 3] = 1.0;\n\t\t\t}\n\t\t}\n\n\t\tconst normalDistribution = new Texture2D();\n\t\tnormalDistribution.image = { width: roughnessLevels, height: sampleSize, data: pixels };\n\t\tnormalDistribution.type = PIXEL_TYPE.FLOAT;\n\t\tnormalDistribution.minFilter = TEXTURE_FILTER.NEAREST;\n\t\tnormalDistribution.magFilter = TEXTURE_FILTER.NEAREST;\n\t\tnormalDistribution.generateMipmaps = false;\n\t\tnormalDistribution.version++;\n\n\t\treturn normalDistribution;\n\t}\n\n}\n\nconst prefilterShader = {\n\tname: 'pmrem',\n\n\tdefines: {\n\t\tPANORAMA: false,\n\t\tSAMPLE_NUMBER: 1024\n\t},\n\n\tuniforms: {\n\t\tenvironmentMap: null,\n\t\tnormalDistribution: null,\n\t\troughness: 0.5,\n\t\tenvMapFlip: 1\n\t},\n\n\tvertexShader: `\n\t\t#include <common_vert>\n\t\tvarying vec3 vDir;\n\t\tvoid main() {\n\t\t\tvDir = (u_Model * vec4(a_Position, 0.0)).xyz;\n\t\t\tgl_Position = u_ProjectionView * u_Model * vec4(a_Position, 1.0);\n\t\t\tgl_Position.z = gl_Position.w; // set z to camera.far\n\t\t}\n\t`,\n\n\tfragmentShader: `\n\t\t#include <common_frag>\n\t\t#ifdef PANORAMA\n\t\t\tuniform sampler2D environmentMap;\n\t\t#else\n\t\t\tuniform samplerCube environmentMap;\n\t\t#endif\n\t\tuniform sampler2D normalDistribution;\n\t\tuniform float roughness;\n\t\tuniform float envMapFlip;\n\t\tvarying vec3 vDir;\n\n\t\tvec3 importanceSampleNormal(float i, float roughness, vec3 N) {\n\t\t\tvec3 H = texture2D(normalDistribution, vec2(roughness, i)).rgb;\n\n\t\t\tvec3 upVector = abs(N.y) > 0.999 ? vec3(1.0, 0.0, 0.0) : vec3(0.0, 1.0, 0.0);\n\t\t\tvec3 tangentX = normalize(cross(N, upVector));\n\t\t\tvec3 tangentZ = cross(N, tangentX);\n\t\t\t// Tangent to world space\n\t\t\treturn normalize(tangentX * H.x + N * H.y + tangentZ * H.z);\n\t\t}\n\n\t\tvoid main() {\n\t\t\tvec3 V = normalize(vDir);\n\n\t\t\tvec3 N = V;\n\n\t\t\tvec3 prefilteredColor = vec3(0.0);\n\t\t\tfloat totalWeight = 0.0;\n\t\t\tfloat fMaxSampleNumber = float(SAMPLE_NUMBER);\n\n\t\t\tfor (int i = 0; i < SAMPLE_NUMBER; i++) {\n\t\t\t\tvec3 H = importanceSampleNormal(float(i) / fMaxSampleNumber, roughness, N);\n\t\t\t\tvec3 L = reflect(-V, H);\n\n\t\t\t\tfloat NoL = clamp(dot(N, L), 0.0, 1.0);\n\t\t\t\tif (NoL > 0.0) {\n\t\t\t\t\t#ifdef PANORAMA\n\t\t\t\t\t\tfloat phi = acos(L.y);\n\t\t\t\t\t\tfloat theta = envMapFlip * atan(L.x, L.z) + PI * 0.5;\n\t\t\t\t\t\tvec2 uv = vec2(theta / 2.0 / PI, -phi / PI);\n\t\t\t\t\t\tprefilteredColor += mapTexelToLinear(texture2D(environmentMap, fract(uv))).rgb * NoL;\n\t\t\t\t\t#else\n\t\t\t\t\t\tprefilteredColor += mapTexelToLinear(textureCube(environmentMap, vec3(envMapFlip * L.x, L.yz))).rgb * NoL;\n\t\t\t\t\t#endif\n\t\t\t\t\ttotalWeight += NoL;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tgl_FragColor = vec4(prefilteredColor / totalWeight, 1.0);\n\t\t\t#include <encodings_frag>\n\t\t}\n\t`\n};\n\nexport { PMREMGenerator };"
  },
  {
    "path": "examples/jsm/textures/RGBDDecoder.js",
    "content": "import { ATTACHMENT, BoxGeometry, DRAW_SIDE, Mesh, PIXEL_FORMAT, PIXEL_TYPE, OffscreenRenderTarget, Scene, ShaderMaterial, TextureCube } from 't3d';\nimport { ReflectionProbe } from '../probes/ReflectionProbe.js';\n\n/**\n * RGBD decoder decodes RGBD cube texture to linear color space.\n */\nexport class RGBDDecoder {\n\n\t/**\n\t * Constructs a new RGBD decoder.\n\t */\n\tconstructor() {\n\t\tconst geometry = new BoxGeometry(1, 1, 1);\n\t\tconst material = new ShaderMaterial(decodeShader);\n\t\tmaterial.side = DRAW_SIDE.BACK;\n\t\tconst envMesh = new Mesh(geometry, material);\n\t\tenvMesh.frustumCulled = false;\n\n\t\tconst dummyScene = new Scene();\n\t\tdummyScene.add(envMesh);\n\n\t\tthis._envMesh = envMesh;\n\t\tthis._dummyScene = dummyScene;\n\t}\n\n\t/**\n\t * Decode the RGBD cube texture (in sRGB color space) to linear color space.\n\t * @param {ThinRenderer} renderer - The renderer.\n\t * @param {TextureCube} source - The source RGBD cube texture.\n\t * @param {TextureCube} target - The target cube texture to store the decoded result.\n\t * @returns {TextureCube | null} The target cube texture. This is a render texture, so you can't get the data from the mipmaps attribute directly.\n\t */\n\tdecode(renderer, source, target = new TextureCube()) {\n\t\tif (!source.isTextureCube) {\n\t\t\tconsole.error('RGBDDecoder: The source texture is not a cube texture.');\n\t\t\treturn null;\n\t\t}\n\n\t\t// Check capabilities\n\n\t\tconst capabilities = renderer.capabilities;\n\t\tconst isWebGL2 = capabilities.version > 1;\n\n\t\tif (isWebGL2) {\n\t\t\tcapabilities.getExtension('EXT_color_buffer_float');\n\t\t} else {\n\t\t\tcapabilities.getExtension('OES_texture_half_float');\n\t\t\tcapabilities.getExtension('OES_texture_half_float_linear');\n\t\t}\n\n\t\tcapabilities.getExtension('OES_texture_float_linear');\n\t\tcapabilities.getExtension('EXT_color_buffer_half_float');\n\n\t\t// Calculate mipmaps number and cube size\n\n\t\tlet cubeSize = source.images.length === 0 ? 16 : source.images[0].width;\n\t\tconst mipmapNum = Math.floor(Math.log2(cubeSize));\n\t\tcubeSize = Math.pow(2, mipmapNum);\n\n\t\t// Prepare the target texture\n\n\t\ttarget.type = PIXEL_TYPE.HALF_FLOAT;\n\t\ttarget.format = PIXEL_FORMAT.RGBA;\n\t\ttarget.generateMipmaps = false;\n\n\t\tlet mipmapSize = cubeSize;\n\t\tfor (let i = 0; i < mipmapNum + 1; i++) {\n\t\t\ttarget.mipmaps[i] = [];\n\t\t\tfor (let j = 0; j < 6; j++) {\n\t\t\t\ttarget.mipmaps[i].push({ width: mipmapSize, height: mipmapSize, data: null });\n\t\t\t}\n\t\t\tmipmapSize = mipmapSize / 2;\n\t\t}\n\n\t\t// Prepare render target\n\n\t\tconst renderTarget = OffscreenRenderTarget.createCube(cubeSize, cubeSize);\n\t\trenderTarget.detach(ATTACHMENT.DEPTH_STENCIL_ATTACHMENT);\n\t\trenderTarget.attach(target, ATTACHMENT.COLOR_ATTACHMENT0);\n\n\t\t// Prepare render stuff\n\n\t\tconst reflectionProbe = new ReflectionProbe(renderTarget);\n\t\tthis._dummyScene.add(reflectionProbe.camera);\n\n\t\tlet envMapFlip = 1;\n\t\tif (source.images[0] && source.images[0].rtt) {\n\t\t\tenvMapFlip = -1;\n\t\t}\n\t\tenvMapFlip *= -1;\n\n\t\tthis._envMesh.material.cubeMap = source;\n\t\tthis._envMesh.material.uniforms.environmentMap = source;\n\t\tthis._envMesh.material.uniforms.envMapFlip = envMapFlip;\n\n\t\t// Render mipmaps\n\n\t\tthis._dummyScene.updateRenderStates(reflectionProbe.camera);\n\n\t\tfor (let i = 0; i < mipmapNum + 1; i++) {\n\t\t\tthis._envMesh.material.uniforms.level = i;\n\n\t\t\trenderTarget.activeMipmapLevel = i;\n\t\t\treflectionProbe.render(renderer, this._dummyScene);\n\t\t\treflectionProbe.camera.rect.z /= 2;\n\t\t\treflectionProbe.camera.rect.w /= 2;\n\t\t}\n\n\t\t// Clear render stuff\n\n\t\trenderTarget.detach(ATTACHMENT.COLOR_ATTACHMENT0);\n\t\trenderTarget.dispose();\n\t\tthis._dummyScene.remove(reflectionProbe.camera);\n\n\t\t// Return the target texture\n\n\t\treturn target;\n\t}\n\n}\n\nconst decodeShader = {\n\tname: 'rgbd_decode',\n\tdefines: {},\n\tuniforms: {\n\t\tenvironmentMap: null,\n\t\tenvMapFlip: -1,\n\t\tlevel: 0\n\t},\n\tvertexShader: `\n        #include <common_vert>\n\t\tvarying vec3 vDir;\n\t\tvoid main() {\n\t\t\tvDir = (u_Model * vec4(a_Position, 0.0)).xyz;\n\t\t\tgl_Position = u_ProjectionView * u_Model * vec4(a_Position, 1.0);\n\t\t\tgl_Position.z = gl_Position.w; // set z to camera.far\n\t\t}\n    `,\n\tfragmentShader: `\n        #include <common_frag>\n\n        uniform samplerCube environmentMap;\n        uniform float level;\n\t\tuniform float envMapFlip;\n\n\t\tvarying vec3 vDir;\n\n        vec3 RGBDToLinear(vec4 rgbd) {\n\t\t\trgbd = sRGBToLinear(rgbd);\n            return rgbd.rgb / rgbd.a;\n        }\n\n        void main() {\n            vec3 dir = normalize(vDir);\n            vec3 coordVec = vec3(envMapFlip * dir.x, dir.yz);\n\n            vec3 color;\n\t\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\t\tcolor = RGBDToLinear(textureCubeLodEXT(environmentMap, coordVec, level));\n\t\t\t#else\n\t\t\t\tcolor = RGBDToLinear(textureCube(environmentMap, coordVec, level));\n\t\t\t#endif\n\n            gl_FragColor = vec4(color, 1.0);\n        }\n    `\n};"
  },
  {
    "path": "examples/lab_clouds.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>t3d - clouds</title>\n\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n\t<link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n</head>\n<body>\n    <div id=\"info\">\n        <a href=\"\" target=\"_blank\">t3d</a> - clouds\n\t</div>\n\t\n\t<script id=\"vs\" type=\"x-shader/x-vertex\">\n        attribute vec3 a_Position;\n\n\t\tattribute vec2 a_Uv;\n\t\tvarying vec2 v_Uv;\n\n\t\tuniform mat4 u_ProjectionView;\n\t\tuniform mat4 u_Model;\n\n\t\tvoid main() {\n\t\t\tgl_Position = u_ProjectionView * u_Model * vec4(a_Position, 1.0);\n\t\t\tv_Uv = a_Uv;\n\t\t}\n    </script>\n\n    <script id=\"fs\" type=\"x-shader/x-fragment\">\n        uniform sampler2D tex;\n\n        uniform vec3 fogColor;\n        uniform float fogNear;\n        uniform float fogFar;\n\n        varying vec2 v_Uv;\n\n        void main() {\n            float depth = gl_FragCoord.z / gl_FragCoord.w;\n            float fogFactor = smoothstep( fogNear, fogFar, depth );\n\n            gl_FragColor = texture2D( tex, v_Uv );\n            gl_FragColor.w *= pow( gl_FragCoord.z, 20.0 );\n\t\t\tgl_FragColor = mix( gl_FragColor, vec4( fogColor, gl_FragColor.w ), fogFactor );\n        }\n    </script>\n\n\t<!-- Import maps polyfill -->\n    <!-- Remove this when import maps will be widely supported -->\n    <script async src=\"./libs/es-module-shims.js\"></script>\n\n    <script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n    <script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { GeometryUtils } from 't3d/addons/geometries/GeometryUtils.js';\n\t\timport { ForwardRenderer } from 't3d/addons/render/ForwardRenderer.js';\n\t\timport { Texture2DLoader } from 't3d/addons/loaders/Texture2DLoader.js';\n\t\timport { Timer } from 't3d/addons/misc/Timer.js';\n\n\t\tlet width = window.innerWidth || 2;\n\t\tlet height = window.innerHeight || 2;\n\t\t\n\t\tconst container = document.createElement('div');\n\t\tdocument.body.appendChild(container);\n\n\t\t// 2D gradient Sky\n\n\t\tconst skyCanvas = document.createElement('canvas');\n\t\tskyCanvas.width = 32;\n\t\tskyCanvas.height = window.innerHeight;\n\n\t\tconst context = skyCanvas.getContext('2d');\n\n\t\tconst gradient = context.createLinearGradient(0, 0, 0, skyCanvas.height);\n\t\tgradient.addColorStop(0, '#1e4877');\n\t\tgradient.addColorStop(0.5, '#4584b4');\n\n\t\tcontext.fillStyle = gradient;\n\t\tcontext.fillRect(0, 0, skyCanvas.width, skyCanvas.height);\n\n\t\tcontainer.style.background = 'url(' + skyCanvas.toDataURL('image/png') + ')';\n\t\tcontainer.style.backgroundSize = '32px 100%';\n\t\t\n\t\t// 3d Clouds\n\n\t\tconst cloudsCanvas = document.createElement('canvas');\n\t\tcloudsCanvas.width = width;\n\t\tcloudsCanvas.height = height;\n\t\tcontainer.appendChild(cloudsCanvas);\n\n\t\tconst forwardRenderer = new ForwardRenderer(cloudsCanvas, { antialias: true, alpha: true });\n\t\tforwardRenderer.screenRenderTarget.setColorClearValue(0, 0, 0, 0);\n\n\t\tconst scene = new t3d.Scene();\n\t\t\n\t\tconst texture = new Texture2DLoader().load('./resources/cloud10.png');\n\t\ttexture.anisotropy = 16;\n\n\t\tconst material = new t3d.ShaderMaterial({\n\t\t\tuniforms: {\n\t\t\t\t'tex': texture,\n\t\t\t\t'fogColor': new t3d.Color3().setHex(0x4584b4).toArray(),\n\t\t\t\t'fogNear': -100,\n\t\t\t\t'fogFar': 3000\n\t\t\t},\n\t\t\tvertexShader: document.getElementById('vs').textContent,\n\t\t\tfragmentShader: document.getElementById('fs').textContent\n\t\t});\n\t\tmaterial.depthWrite = false;\n\t\tmaterial.depthTest = false;\n\t\tmaterial.transparent = true;\n\n\t\tconst plane = new t3d.Mesh(new t3d.PlaneGeometry(64, 64), material);\n\t\tconst planeGeometries = [];\n\n\t\tfor (let i = 0; i < 8000; i++) {\n\t\t\tplane.position.x = Math.random() * 1000 - 500;\n\t\t\tplane.position.y = -Math.random() * Math.random() * 200 - 15;\n\t\t\tplane.position.z = i;\n\t\t\tplane.euler.x = Math.PI / 2;\n\t\t\tplane.euler.y = Math.random() * Math.PI;\n\t\t\tplane.scale.x = plane.scale.y = Math.random() * Math.random() * 1.5 + 0.5;\n\t\t\tplane.updateMatrix();\n\n\t\t\tconst cloneGeo = plane.geometry.clone();\n\t\t\tGeometryUtils.applyMatrix4(cloneGeo, plane.matrix);\n\t\t\tplaneGeometries.push(cloneGeo);\n\t\t}\n\n\t\t// merge\n\t\tconst geometry = GeometryUtils.mergeGeometries(planeGeometries);\n\t\t\n\t\tconst mesh0 = new t3d.Mesh(geometry, material);\n\t\tscene.add(mesh0);\n\n\t\tconst mesh = new t3d.Mesh(geometry, material);\n\t\tmesh.position.z = -8000;\n\t\tscene.add(mesh);\n\n\t\tconst camera = new t3d.Camera();\n\t\tcamera.frustumCulled = false;\n\t\tcamera.setPerspective(30 / 180 * Math.PI, width / height, 1, 3000);\n\t\tscene.add(camera);\n\n\t\tlet mouseX = 0, mouseY = 0;\n\n\t\tconst windowHalfX = window.innerWidth / 2;\n\t\tconst windowHalfY = window.innerHeight / 2;\n\n\t\tfunction onDocumentMouseMove(event) {\n\t\t\tmouseX = (event.clientX - windowHalfX) * 0.25;\n\t\t\tmouseY = (event.clientY - windowHalfY) * 0.15;\n\t\t}\n\t\tdocument.addEventListener('mousemove', onDocumentMouseMove, false);\n\n\t\tconst timer = new Timer();\n\n\t\tfunction loop(timestamp) {\n\t\t\trequestAnimationFrame(loop);\n\t\t\n\t\t\ttimer.update(timestamp);\n\n\t\t\tconst position = (timer.getElapsed() * 30) % 8000;\n\n\t\t\tcamera.position.x += (mouseX - camera.position.x) * 0.01;\n\t\t\tcamera.position.y += (-mouseY - camera.position.y) * 0.01;\n\t\t\tcamera.position.z = -position + 8000;\n\n\t\t\tforwardRenderer.render(scene, camera);\n\t\t}\n\t\trequestAnimationFrame(loop);\n\n\t\tfunction onWindowResize() {\n\t\t\twidth = window.innerWidth || 2;\n\t\t\theight = window.innerHeight || 2;\n\n\t\t\tcamera.setPerspective(30 / 180 * Math.PI, width / height, 1, 3000);\n\n\t\t\tforwardRenderer.screenRenderTarget.resize(width, height);\n\t\t}\n\t\twindow.addEventListener('resize', onWindowResize, false);\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "examples/lab_clouds_shader.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>t3d - clouds shader</title>\n\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n\t<link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n</head>\n<body>\n    <div id=\"info\">\n\t\t<a href=\"\" target=\"_blank\">t3d</a> - clouds shader<br/>\n\t\tOriginal shader by <a href=\"https://www.shadertoy.com/view/lsBfDz\" target=\"_blank\">stubbe on ShaderToy</a>\n\t</div>\n\n\t<script async src=\"./libs/es-module-shims.js\"></script>\n    <script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n    <script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { Texture2DLoader } from 't3d/addons/loaders/Texture2DLoader.js';\n\n\t\tlet width = window.innerWidth || 2;\n\t\tlet height = window.innerHeight || 2;\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = width;\n\t\tcanvas.height = height;\n\t\tdocument.body.appendChild(canvas);\n\n\t\tconst contextParams = { antialias: false, alpha: false };\n\t\tconst gl = canvas.getContext('webgl2', contextParams) || canvas.getContext('webgl', contextParams);\n\n\t\tconst renderer = new t3d.WebGLRenderer(gl);\n\t\tconst screenRenderTarget = new t3d.ScreenRenderTarget(canvas);\n\n\t\tconst CloudsShader = {\n\t\t\tname: 'Clouds',\n\t\t\tuniforms: {\n\t\t\t\t'u_CloudNoise': null,\n\t\t\t\t'u_Time': 0\n\t\t\t},\n\t\t\tvertexShader: /* glsl */`\n\t\t\t\tattribute vec3 a_Position;\n\t\t\t\tattribute vec2 a_Uv;\n\t\t\t\tvarying vec2 v_Uv;\n\t\t\t\tvoid main() {\n\t\t\t\t\tgl_Position = vec4(a_Position, 1.0);\n\t\t\t\t\tv_Uv = a_Uv;\n\t\t\t\t}\n\t\t\t`,\n\t\t\tfragmentShader: /* glsl */`\n\t\t\t\tuniform sampler2D u_CloudNoise;\n\t\t\t\tuniform vec2 u_RenderTargetSize;\n\t\t\t\tuniform float u_Time;\n\t\t\t\tvarying vec2 v_Uv;\n\t\t\t\t#define T texture2D(u_CloudNoise, (s * p.zw + ceil(s * p.x)) / 200.0).y / (s += s) * 4.0\n\t\t\t\tvoid main() {\n\t\t\t\t\tvec2 x = v_Uv * u_RenderTargetSize;\n\t\t\t\t\tvec2 zw = x / u_RenderTargetSize.y - 0.8;\n\t\t\t\t\tvec4 p, d = vec4(0.8, 0.0, zw.x, zw.y);\n\t\t\t\t\tvec4 c = vec4(0.6, 0.7, d.x, d.y);\n\t\t\t\t\tvec4 O = c - d.w;\n\t\t\t\t\tfloat f, s, t = 200.0 + sin(dot(x, x));\n\t\t\t\t\tfor (; --t > 0.0; p = 0.05 * t * d) {\n\t\t\t\t\t\tp.xz += u_Time;\n\t\t\t\t\t\ts = 2.0;\n\t\t\t\t\t\tf = p.w + 1.0 - T - T - T - T;\n\t\t\t\t\t\tif (f < 0.0) {\n\t\t\t\t\t\t\tO += (O - 1.0 - f * c.zyxw) * f * 0.4;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tgl_FragColor = O;\n\t\t\t\t}\n\t\t\t`\n\t\t};\n\n\t\tlet cloudsPass;\n\n\t\tnew Texture2DLoader().loadAsync('./resources/cloudNoise.png').then(texture => {\n\t\t\ttexture.wrapS = t3d.TEXTURE_WRAP.REPEAT;\n\t\t\ttexture.wrapT = t3d.TEXTURE_WRAP.REPEAT;\n\t\t\n\t\t\tcloudsPass = new t3d.ShaderPostPass(CloudsShader);\n\t\t\tcloudsPass.uniforms['u_CloudNoise'] = texture;\n\t\t});\n\n\t\tfunction loop(timestamp) {\n\t\t\trequestAnimationFrame(loop);\n\n\t\t\tif (cloudsPass) {\n\t\t\t\tcloudsPass.uniforms['u_Time'] = timestamp * 0.0005;\n\t\t\t\tcloudsPass.render(renderer, screenRenderTarget);\n\t\t\t}\n\t\t}\n\t\trequestAnimationFrame(loop);\n\n\t\twindow.addEventListener('resize', () => {\n\t\t\twidth = window.innerWidth || 2;\n\t\t\theight = window.innerHeight || 2;\n\t\t\n\t\t\tscreenRenderTarget.resize(width, height);\n\t\t});\n\t</script>\n</body>\n</html> "
  },
  {
    "path": "examples/lab_earth.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>t3d - earth</title>\n\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n\t<link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n</head>\n<body>\n    <div id=\"info\">\n        <a href=\"\" target=\"_blank\">t3d</a> - earth\n    </div>\n\n\t<!-- Import maps polyfill -->\n    <!-- Remove this when import maps will be widely supported -->\n    <script async src=\"./libs/es-module-shims.js\"></script>\n\n    <script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n    <script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { ForwardRenderer } from 't3d/addons/render/ForwardRenderer.js';\n\t\timport { Texture2DLoader } from 't3d/addons/loaders/Texture2DLoader.js';\n\n\t\tconst glowShader = {\n\t\t\tuniforms: {\n\t\t\t\tc: 0.34,\n\t\t\t\tp: 9.17// 9.17\n\t\t\t},\n\n\t\t\tvertexShader: [\n\t\t\t\t'attribute vec3 a_Position;',\n\t\t\t\t'attribute vec3 a_Normal;',\n\t\t\t\t'varying vec3 v_Normal;',\n\n\t\t\t\t'#include <transpose>',\n\t\t\t\t'#include <inverse>',\n\n\t\t\t\t'uniform mat4 u_ProjectionView;',\n\t\t\t\t'uniform mat4 u_View;',\n\t\t\t\t'uniform mat4 u_Model;',\n\n\t\t\t\t'void main() {',\n\t\t\t\t'vec3 transformed = vec3(a_Position);',\n\t\t\t\t'vec3 objectNormal = vec3(a_Normal);',\n\t\t\t\t'v_Normal = (transposeMat4(inverseMat4(u_View * u_Model)) * vec4(objectNormal, 1.0)).xyz;',\n\t\t\t\t'gl_Position = u_ProjectionView * u_Model * vec4(transformed, 1.0);',\n\t\t\t\t'}'\n\t\t\t].join('\\n'),\n\n\t\t\tfragmentShader: [\n\t\t\t\t'uniform float c;',\n\t\t\t\t'uniform float p;',\n\t\t\t\t'varying vec3 v_Normal;',\n\t\t\t\t'void main() {',\n\t\t\t\t'float intensity = pow(abs(c - dot(normalize(v_Normal), vec3( 0.0, 0.0, 1.0 ) )), p );',\n\t\t\t\t'gl_FragColor = vec4( 0.2, 0.58, 0.9, 0.3 ) * intensity;',\n\t\t\t\t'}'\n\t\t\t].join('\\n')\n\t\t};\n\n\t\tconst useDevicePixelRatio = true;\n\t\tconst devicePixelRatio = window.devicePixelRatio;\n\n\t\tlet width = window.innerWidth || 2;\n\t\tlet height = window.innerHeight || 2;\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = useDevicePixelRatio ? width * devicePixelRatio : width;\n\t\tcanvas.height = useDevicePixelRatio ? height * devicePixelRatio : height;\n\t\tcanvas.style.width = width + 'px';\n\t\tcanvas.style.height = height + 'px';\n\t\tdocument.body.appendChild(canvas);\n\n\t\tconst forwardRenderer = new ForwardRenderer(canvas);\n\n\t\tconst scene = new t3d.Scene();\n\n\t\tconst earth_geo = new t3d.SphereGeometry(5, 40, 40);\n\t\tconst cloud1_geo = new t3d.SphereGeometry(5.1, 40, 40);\n\t\tconst cloud2_geo = new t3d.SphereGeometry(5.2, 40, 40);\n\t\tconst glow_geo = new t3d.SphereGeometry(5, 40, 40);\n\n\t\tconst loader = new Texture2DLoader();\n\n\t\tconst diff_tex = loader.load('./resources/earth4.jpg');\n\t\t// diff_tex.anisotropy = forwardRenderer.capabilities.maxAnisotropy;\n\t\tconst bump_tex = loader.load('./resources/earth_bump.jpg');\n\t\tconst spec_tex = loader.load('./resources/earth_spec.jpg');\n\t\tconst cloud_tex = loader.load('./resources/earth_cloud.png');\n\n\t\tconst earth_mat = new t3d.PhongMaterial();\n\t\tearth_mat.diffuse.setHex(0xffffff);\n\t\tearth_mat.diffuseMap = diff_tex;\n\t\tearth_mat.bumpMap = bump_tex;\n\t\tearth_mat.specularMap = spec_tex;\n\t\tearth_mat.specular.setHex(0xc9c9c9);\n\t\tearth_mat.shininess = 8;\n\t\t// earth_mat.premultipliedAlpha = true;\n\n\t\tconst glow_mat = new t3d.ShaderMaterial(glowShader);\n\t\tglow_mat.side = t3d.DRAW_SIDE.BACK;\n\t\tglow_mat.transparent = true;\n\t\tglow_mat.blending = t3d.BLEND_TYPE.ADD;\n\n\t\tconst cloud_mat = new t3d.LambertMaterial();\n\t\tcloud_mat.diffuse.setHex(0xffffff);\n\t\tcloud_mat.diffuseMap = cloud_tex;\n\t\tcloud_mat.transparent = true;\n\t\tcloud_mat.opacity = 1;\n\t\tcloud_mat.blending = t3d.BLEND_TYPE.ADD;\n\t\tcloud_mat.side = t3d.DRAW_SIDE.DOUBLE;\n\t\tcloud_mat.premultipliedAlpha = true;\n\n\t\tconst glow = new t3d.Mesh(glow_geo, glow_mat);\n\t\tglow.scale.set(1.8, 1.8, 1.8);\n\t\tscene.add(glow);\n\n\t\tconst earth = new t3d.Mesh(earth_geo, earth_mat);\n\t\tscene.add(earth);\n\n\t\tconst cloud1 = new t3d.Mesh(cloud1_geo, cloud_mat);\n\t\tcloud1.renderOrder = 1;\n\t\tscene.add(cloud1);\n\n\t\tconst cloud2 = new t3d.Mesh(cloud2_geo, cloud_mat);\n\t\tcloud2.renderOrder = 2;\n\t\tscene.add(cloud2);\n\n\t\tconst ambientLight = new t3d.AmbientLight(0xffffff, 0.05);\n\t\tscene.add(ambientLight);\n\n\t\tconst spotLight = new t3d.SpotLight(0xffffff, 0.5, 200, 0.2, 0.4, 1);\n\t\tspotLight.position.set(-22, 20, 42);\n\t\tspotLight.lookAt(new t3d.Vector3(0, 0, 0), new t3d.Vector3(0, 1, 0));\n\t\tscene.add(spotLight);\n\n\t\tconst camera = new t3d.Camera();\n\t\tcamera.outputEncoding = t3d.TEXEL_ENCODING_TYPE.SRGB;\n\t\tcamera.position.set(0, 0, 20);\n\t\tcamera.lookAt(new t3d.Vector3(0, 0, 0), new t3d.Vector3(0, 1, 0));\n\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 0.1, 1000);\n\t\tscene.add(camera);\n\n\t\tfunction loop(count) {\n\t\t\trequestAnimationFrame(loop);\n\n\t\t\tearth.euler.set(0, count / 1000 * .15, 0);\n\t\t\tcloud1.euler.set(0, count / 1000 * .13, 0);\n\t\t\tcloud2.euler.set(0, count / 1000 * .10, Math.PI);\n\n\t\t\tforwardRenderer.render(scene, camera);\n\t\t}\n\t\trequestAnimationFrame(loop);\n\n\t\tfunction onWindowResize() {\n\t\t\twidth = window.innerWidth || 2;\n\t\t\theight = window.innerHeight || 2;\n\n\t\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 1000);\n\n\t\t\tforwardRenderer.screenRenderTarget.resize(useDevicePixelRatio ? width * devicePixelRatio : width, useDevicePixelRatio ? height * devicePixelRatio : height);\n\t\t\tcanvas.style.width = width + 'px';\n\t\t\tcanvas.style.height = height + 'px';\n\t\t}\n\t\twindow.addEventListener('resize', onWindowResize, false);\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "examples/lab_geometry_grass.html",
    "content": "<!DOCTYPE html>\n<html>\n\n<head>\n    <meta charset=\"utf-8\">\n    <title>t3d grass </title>\n    <meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n    <link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n\n<body>\n    <div id=\"info\" class=\"dark\">\n        <a href=\"\" target=\"_blank\">t3d</a> grass </br>\n        Inspired by <a href=\"https://github.com/James-Smyth/three-grass-demo\" target=\"_blank\">James-Smyth/three-grass-demo</a>\n    </div>\n\n    <script id=\"vs\" type=\"x-shader/x-vertex\">\n\t\tattribute vec3 a_Position;\n\t\tattribute vec2 a_Uv;\n\t\tattribute vec3 a_Color;\n\n\t\tuniform mat4 u_View;\n\t\tuniform mat4 u_Model;\n\t\tuniform mat4 u_Projection;\n\n        uniform float time;\n\n\t\tvarying vec2 vUv;\n        varying vec2 cloudUV;\n\n        void main() {\n            vUv = a_Uv;\n            cloudUV = a_Uv;\n            vec3 pos = a_Position;\n\n            float waveSize = 10.0f;\n            float tipDistance = 0.3f;\n            float centerDistance = 0.1f;\n\n            if (a_Color.x > 0.6f) {\n                pos.x += sin((time / 500.) + (a_Uv.x * waveSize)) * tipDistance;\n            }else if (a_Color.x > 0.0f) {\n                pos.x += sin((time / 500.) + (a_Uv.x * waveSize)) * centerDistance;\n            }\n\n            float diff = a_Position.x - pos.x;\n\n            cloudUV.x += time / 20000.;\n            cloudUV.y += time / 10000.;\n\n            gl_Position = u_Projection * u_View * u_Model * vec4(pos, 1.0);\n}\n    </script>\n\n    <script id=\"fs\" type=\"x-shader/x-fragment\">\n\t\tuniform sampler2D grassTexture;\n        uniform sampler2D cloudTexture;\n\n        varying vec2 vUv;\n        varying vec2 cloudUV;\n\n        void main() {\n            float contrast = 1.5;\n            float brightness = 0.1;\n\n            vec3 color = texture2D(grassTexture, vUv).rgb * contrast;\n            color = color + vec3(brightness, brightness, brightness);\n            color = mix(color, texture2D(cloudTexture, cloudUV).rgb, 0.4);\n    \n            gl_FragColor = vec4(color, 1.);\n        }\n    </script>\n\n    <script src=\"./libs/nanobar.js\"></script>\n\n    <!-- Import maps polyfill -->\n    <!-- Remove this when import maps will be widely supported -->\n    <script async src=\"./libs/es-module-shims.js\"></script>\n\n    <script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n    <script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { TextureCubeLoader } from 't3d/addons/loaders/TextureCubeLoader.js';\n\t\timport { Texture2DLoader } from 't3d/addons/loaders/Texture2DLoader.js';\n\t\timport { OrbitControls } from 't3d/addons/controls/OrbitControls.js';\n\t\timport { SkyBox } from 't3d/addons/objects/SkyBox.js';\n\t\timport { ForwardRenderer } from 't3d/addons/render/ForwardRenderer.js';\n\t\timport { GeometryUtils } from 't3d/addons/geometries/GeometryUtils.js';\n\t\timport Stats from './libs/stats.module.js';\n\n\t\tlet width = window.innerWidth || 2;\n\t\tlet height = window.innerHeight || 2;\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = width * window.devicePixelRatio;\n\t\tcanvas.height = height * window.devicePixelRatio;\n\t\tcanvas.style.width = width + 'px';\n\t\tcanvas.style.height = height + 'px';\n\t\tdocument.body.appendChild(canvas);\n\n\t\tconst forwardRenderer = new ForwardRenderer(canvas, { antialias: true, alpha: true });\n\n\t\tconst cubeTexturePath = './resources/skybox/skyboxsun25deg/';\n\t\tconst cubeTexture = new TextureCubeLoader().load([\n\t\t\tcubeTexturePath + 'px.jpg',\n\t\t\tcubeTexturePath + 'nx.jpg',\n\t\t\tcubeTexturePath + 'py.jpg',\n\t\t\tcubeTexturePath + 'ny.jpg',\n\t\t\tcubeTexturePath + 'pz.jpg',\n\t\t\tcubeTexturePath + 'nz.jpg'\n\t\t]);\n\t\tcubeTexture.encoding = t3d.TEXEL_ENCODING_TYPE.SRGB;\n\n\t\tconst scene = new t3d.Scene();\n\n\t\tconst skyBox = new SkyBox(cubeTexture);\n\t\tskyBox.level = 0;\n\t\tskyBox.gamma = true;\n\t\tscene.add(skyBox);\n\n\t\tconst textureLoader = new Texture2DLoader();\n\t\tconst grassTexture = textureLoader.load('./resources/grass/grass.jpg');\n\n\t\t// const cloudTexture = textureLoader.load('./resources/grass/cloud.jpg');\n\t\tconst cloudTexture = textureLoader.load('./resources/grass/grass.jpg');\n\t\tcloudTexture.wrapS = cloudTexture.wrapT = t3d.TEXTURE_WRAP.REPEAT;\n\n\t\t// Parameters\n\t\tconst PLANE_SIZE = 30;\n\t\tconst BLADE_COUNT = 100000;\n\t\tconst BLADE_WIDTH = 0.1;\n\t\tconst BLADE_HEIGHT = 0.8;\n\t\tconst BLADE_HEIGHT_VARIATION = 0.6;\n\n\t\tconst grassMaterial = new t3d.ShaderMaterial({\n\t\t\tuniforms: {\n\t\t\t\ttime: 0.0,\n\t\t\t\tgrassTexture: grassTexture,\n\t\t\t\tcloudTexture: cloudTexture\n\t\t\t},\n\t\t\tvertexShader: document.getElementById('vs').textContent,\n\t\t\tfragmentShader: document.getElementById('fs').textContent\n\t\t});\n\n\t\tgrassMaterial.transparent = true;\n\t\tgrassMaterial.side = 'Double';\n\n\t\tgenerateField();\n\n\t\tfunction generateField() {\n\t\t\tconst positions = [];\n\t\t\tconst uvs = [];\n\t\t\tconst indices = [];\n\t\t\tconst colors = [];\n\n\t\t\tfor (let i = 0; i < BLADE_COUNT; i++) {\n\t\t\t\tconst VERTEX_COUNT = 5;\n\t\t\t\tconst surfaceMin = PLANE_SIZE / 2 * -1;\n\t\t\t\tconst surfaceMax = PLANE_SIZE / 2;\n\t\t\t\tconst radius = PLANE_SIZE / 2;\n\n\t\t\t\tconst r = radius * Math.sqrt(Math.random());\n\t\t\t\tconst theta = Math.random() * 2 * Math.PI;\n\t\t\t\tconst x = r * Math.cos(theta);\n\t\t\t\tconst y = r * Math.sin(theta);\n\n\t\t\t\t// blade position\n\t\t\t\tconst pos = new t3d.Vector3(x, 0, y);\n\n\t\t\t\tconst uv = [convertRange(pos.x, surfaceMin, surfaceMax, 0, 1), convertRange(pos.z, surfaceMin, surfaceMax, 0, 1)];\n\n\t\t\t\tconst blade = generateBlade(pos, i * VERTEX_COUNT, uv);\n\t\t\t\tblade.verts.forEach(vert => {\n\t\t\t\t\tpositions.push(...vert.pos);\n\t\t\t\t\tuvs.push(...vert.uv);\n\t\t\t\t\tcolors.push(...vert.color);\n\t\t\t\t});\n\t\t\t\tblade.indices.forEach(index => indices.push(index));\n\t\t\t}\n\n\t\t\tconst geometry = new t3d.Geometry();\n\n\t\t\tconst position = new t3d.Attribute(new t3d.Buffer(new Float32Array(positions), 3));\n\t\t\tconst uv = new t3d.Attribute(new t3d.Buffer(new Float32Array(uvs), 2));\n\t\t\tconst color = new t3d.Attribute(new t3d.Buffer(new Float32Array(colors), 3));\n\n\t\t\tgeometry.addAttribute('a_Position', position);\n\t\t\tgeometry.addAttribute('a_Uv', uv);\n\t\t\tgeometry.addAttribute('a_Color', color);\n\n\t\t\tgeometry.setIndex(indices);\n\t\t\tGeometryUtils.computeNormals(geometry);\n\n\t\t\tconst mesh = new t3d.Mesh(geometry, grassMaterial);\n\t\t\tscene.add(mesh);\n\t\t}\n\n\t\tfunction convertRange(val, oldMin, oldMax, newMin, newMax) {\n\t\t\treturn (((val - oldMin) * (newMax - newMin)) / (oldMax - oldMin)) + newMin;\n\t\t}\n\n\t\tfunction generateBlade(center, vArrOffset, uv) {\n\t\t\tconst MID_WIDTH = BLADE_WIDTH * 0.5;\n\t\t\tconst TIP_OFFSET = 0.1;\n\t\t\tconst height = BLADE_HEIGHT + (Math.random() * BLADE_HEIGHT_VARIATION);\n\n\t\t\tconst yaw = Math.random() * Math.PI * 2;\n\t\t\tconst yawUnitVec = new t3d.Vector3(Math.sin(yaw), 0, -Math.cos(yaw));\n\t\t\tconst tipBend = Math.random() * Math.PI * 2;\n\t\t\tconst tipBendUnitVec = new t3d.Vector3(Math.sin(tipBend), 0, -Math.cos(tipBend));\n\n\t\t\t// Find the Bottom Left, Bottom Right, Top Left, Top right, Top Center vertex positions\n\t\t\tconst bl = new t3d.Vector3().addVectors(center, new t3d.Vector3().copy(yawUnitVec).multiplyScalar((BLADE_WIDTH / 2) * 1));\n\t\t\tconst br = new t3d.Vector3().addVectors(center, new t3d.Vector3().copy(yawUnitVec).multiplyScalar((BLADE_WIDTH / 2) * -1));\n\t\t\tconst tl = new t3d.Vector3().addVectors(center, new t3d.Vector3().copy(yawUnitVec).multiplyScalar((MID_WIDTH / 2) * 1));\n\t\t\tconst tr = new t3d.Vector3().addVectors(center, new t3d.Vector3().copy(yawUnitVec).multiplyScalar((MID_WIDTH / 2) * -1));\n\t\t\tconst tc = new t3d.Vector3().addVectors(center, new t3d.Vector3().copy(tipBendUnitVec).multiplyScalar(TIP_OFFSET));\n\n\t\t\ttl.y += height / 2;\n\t\t\ttr.y += height / 2;\n\t\t\ttc.y += height;\n\n\t\t\t// Vertex Colors\n\t\t\tconst black = [0, 0, 0];\n\t\t\tconst gray = [0.5, 0, 0.5];\n\t\t\tconst white = [1.0, 0, 0.0];\n\n\t\t\tconst verts = [\n\t\t\t\t{ pos: bl.toArray(), uv: uv, color: black },\n\t\t\t\t{ pos: br.toArray(), uv: uv, color: black },\n\t\t\t\t{ pos: tr.toArray(), uv: uv, color: gray },\n\t\t\t\t{ pos: tl.toArray(), uv: uv, color: gray },\n\t\t\t\t{ pos: tc.toArray(), uv: uv, color: white }\n\t\t\t];\n\n\t\t\tconst indices = [\n\t\t\t\tvArrOffset,\n\t\t\t\tvArrOffset + 1,\n\t\t\t\tvArrOffset + 2,\n\t\t\t\tvArrOffset + 2,\n\t\t\t\tvArrOffset + 4,\n\t\t\t\tvArrOffset + 3,\n\t\t\t\tvArrOffset + 3,\n\t\t\t\tvArrOffset,\n\t\t\t\tvArrOffset + 2\n\t\t\t];\n\n\t\t\treturn { verts, indices };\n\t\t}\n\n\t\tconst camera = new t3d.Camera();\n\t\tcamera.outputEncoding = t3d.TEXEL_ENCODING_TYPE.SRGB;\n\t\tcamera.position.set(3.5, 1.6, 11);\n\t\tcamera.lookAt(new t3d.Vector3(0, 0, 0), new t3d.Vector3(0, 1, 0));\n\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 0.1, 1000);\n\t\tscene.add(camera);\n\n\t\t// stats\n\t\tconst stats = new Stats();\n\t\tstats.showPanel(0);\n\t\tdocument.body.appendChild(stats.dom);\n\n\t\tconst controller = new OrbitControls(camera, canvas);\n\t\tcontroller.enablePan = false;\n\t\tcontroller.maxDistance = 20;\n\t\tcontroller.minPolarAngle = 70 / 180 * Math.PI;\n\t\tcontroller.maxPolarAngle = 85 / 180 * Math.PI;\n\n\t\tfunction loop(count) {\n\t\t\trequestAnimationFrame(loop);\n\n\t\t\tstats.begin();\n\n\t\t\tgrassMaterial.uniforms.time = count;\n\n\t\t\tcontroller.update();\n\n\t\t\tforwardRenderer.render(scene, camera);\n\t\t\tstats.end();\n\t\t}\n\n\t\trequestAnimationFrame(loop);\n\n\t\tfunction onWindowResize() {\n\t\t\twidth = window.innerWidth || 2;\n\t\t\theight = window.innerHeight || 2;\n\n\t\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 0.1, 1000);\n\n\t\t\tforwardRenderer.screenRenderTarget.resize(width * window.devicePixelRatio, height * window.devicePixelRatio);\n\n\t\t\tcanvas.style.width = width + 'px';\n\t\t\tcanvas.style.height = height + 'px';\n\t\t}\n\t\twindow.addEventListener('resize', onWindowResize, false);\n    </script>\n</body>\n\n</html>"
  },
  {
    "path": "examples/lab_geometry_images.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>t3d - geometry images</title>\n\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n\t<link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n</head>\n<body>\n\t<div id=\"info\">\n\t\t<a href=\"\" target=\"_blank\">t3d</a> - geometry images<br/>\n\t\treference to <a href=\"https://hhoppe.com/proj/gim/\" target=\"_blank\">hhoppe.com/proj/gim/</a>\n\t\t<div id=\"notSupported\" style=\"display:none\">Sorry, your graphics card + browser does not support WebGL2</div>\n\t</div>\n\n\t<!-- Import maps polyfill -->\n\t<!-- Remove this when import maps will be widely supported -->\n\t<script async src=\"./libs/es-module-shims.js\"></script>\n\n\t<script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n\t\t\t\t\"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n\t<script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { ForwardRenderer } from 't3d/addons/render/ForwardRenderer.js';\n\t\timport { Texture2DLoader } from 't3d/addons/loaders/Texture2DLoader.js';\n\t\timport { OrbitControls } from 't3d/addons/controls/OrbitControls.js';\n\t\timport { GUI } from './libs/lil-gui.esm.min.js';\n\n\t\t// TODO: use merged geometry instead of instanced geometry for better performance\n\n\t\tlet width = window.innerWidth || 2;\n\t\tlet height = window.innerHeight || 2;\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = width;\n\t\tcanvas.height = height;\n\t\tdocument.body.appendChild(canvas);\n\n\t\tconst forwardRenderer = new ForwardRenderer(canvas);\n\n\t\tconst scene = new t3d.Scene();\n\n\t\tconst camera = new t3d.Camera();\n\t\tcamera.position.set(0, 0, 2);\n\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 0.1, 1000);\n\t\tscene.add(camera);\n\n\t\tconst controller = new OrbitControls(camera, canvas);\n\n\t\tconst mainTex = new Texture2DLoader().load('./resources/bunny.p65.gim257.fmp.bmp');\n\t\tmainTex.wrapS = mainTex.wrapT = t3d.TEXTURE_WRAP.CLAMP_TO_EDGE;\n\t\tconst normalTex = new Texture2DLoader().load('./resources/bunny.p65.nim512.bmp');\n\t\tnormalTex.wrapS = normalTex.wrapT = t3d.TEXTURE_WRAP.CLAMP_TO_EDGE;\n\n\t\tconst shader = {\n\t\t\tname: 'dynamic_mesh',\n\t\t\tuniforms: {\n\t\t\t\tu_gridSize: 1,\n\t\t\t\tu_gridCount: 50,\n\t\t\t\tu_mainTex: mainTex,\n\t\t\t\tu_normalTex: normalTex\n\t\t\t},\n\t\t\tvertexShader: `\n\t\t\t\tattribute int a_VertexID;\n\t\t\t\tattribute int instanceID;\n\n\t\t\t\tuniform float u_gridSize;\n\t\t\t\tuniform int u_gridCount;\n\n\t\t\t\tuniform sampler2D u_mainTex;\n\t\t\t\tuniform sampler2D u_normalTex;\n\n\t\t\t\tuniform mat4 u_ProjectionView;\n\t\t\t\tuniform mat4 u_Model;\n\n\t\t\t\t#ifdef FLAT_SHADED\n\t\t\t\t\tvarying vec3 v_modelPos;\n\t\t\t\t#else\n\t\t\t\t\tvarying vec3 vNormal;\n\t\t\t\t#endif\n\t\t\t\t\n\t\t\t\tvoid main() {\n\t\t\t\t\tint x = instanceID % u_gridCount;\n\t\t\t\t\tint z = instanceID / u_gridCount;\n\n\t\t\t\t\tint checkFace = instanceID % 2;\n\n\t\t\t\t\tvec2 points[4];\n\t\t\t\t\tpoints[0] = vec2(float(x) * u_gridSize, float(z) * u_gridSize);\n\t\t\t\t\tpoints[1] = points[0] + vec2(u_gridSize, 0.0);\n\t\t\t\t\tpoints[3] = points[0] + vec2(0.0, u_gridSize);\n\t\t\t\t\tpoints[2] = points[0] + vec2(u_gridSize, u_gridSize);\n\n\t\t\t\t\tfloat invChunkSize = 1.0 / (u_gridSize * float(u_gridCount));\n\t\t\t\t\tvec2 uv1 = vec2(points[a_VertexID].x * invChunkSize, points[a_VertexID].y * invChunkSize);\n\t\t\t\t\tvec2 uv2 = vec2(points[(a_VertexID + 2) % 4].x * invChunkSize, points[(a_VertexID + 2) % 4].y * invChunkSize);\n\t\t\t\t\tvec2 uv = checkFace == 0 ? uv1 : uv2;\n\n\t\t\t\t\tvec3 pos = texture2D(u_mainTex, uv.xy).xyz;\n\t\t\t\t\tgl_Position = u_ProjectionView * u_Model * vec4(pos, 1.0);\n\n\t\t\t\t\t#ifdef FLAT_SHADED\n\t\t\t\t\t\tv_modelPos = (u_Model * vec4(pos, 1.0)).xyz;\n\t\t\t\t\t#else\n\t\t\t\t\t\tvec3 normal = texture2D(u_normalTex, uv.xy).xyz;\n\t\t\t\t\t\tvNormal = normal;\n\t\t\t\t\t#endif\n\t\t\t\t}\n\t\t\t`,\n\t\t\tfragmentShader: `\n\t\t\t\t#ifdef FLAT_SHADED\n\t\t\t\t\tvarying vec3 v_modelPos;\n\t\t\t\t#else\n\t\t\t\t\tvarying vec3 vNormal;\n\t\t\t\t#endif\n\n\t\t\t\tvoid main() {\n\t\t\t\t\t#ifdef FLAT_SHADED\n\t\t\t\t\t\tvec3 fdx = dFdx(v_modelPos);\n\t\t\t\t\t\tvec3 fdy = dFdy(v_modelPos);\n\t\t\t\t\t\tvec3 N = normalize(cross(fdx, fdy));\n\t\t\t\t\t\tgl_FragColor =vec4(N * 0.5 + 0.5, 1.);\n\t\t\t\t\t#else\n\t\t\t\t\t\tgl_FragColor =vec4(vNormal, 1.);\n\t\t\t\t\t#endif\n\t\t\t\t}\n\t\t\t`\n\t\t};\n\n\t\tconst shaderMaterial = new t3d.ShaderMaterial(shader);\n\t\tshaderMaterial.uniforms.u_mainTex = mainTex;\n\t\tshaderMaterial.uniforms.u_normalTex = normalTex;\n\n\t\tconst maxGridCount = 200;\n\n\t\tconst instancedGeometry = new t3d.Geometry();\n\t\tinstancedGeometry.addAttribute('a_Position', new t3d.Attribute(new t3d.Buffer(new Float32Array([0, 0, 0]), 3))); // just a placeholder\n\t\tconst vertexIDArray = new Int8Array([0, 1, 2, 3]);\n\t\tinstancedGeometry.addAttribute('a_VertexID', new t3d.Attribute(new t3d.Buffer(vertexIDArray, 1)));\n\t\tconst indicesArray = new Uint16Array([0, 1, 2, 0, 2, 3]);\n\t\tinstancedGeometry.setIndex(new t3d.Attribute(new t3d.Buffer(indicesArray, 1)));\n\t\tconst maxCount = 2 * maxGridCount * maxGridCount;\n\t\tconst instanceIDArray = new Int32Array(maxCount);\n\t\tfor (let i = 0; i < maxGridCount; i++) {\n\t\t\tfor (let j = 0; j < maxGridCount; j++) {\n\t\t\t\tconst gridIndex = i * maxGridCount + j;\n\t\t\t\tinstanceIDArray[2 * gridIndex] = gridIndex;\n\t\t\t\tinstanceIDArray[2 * gridIndex + 1] = gridIndex;\n\t\t\t}\n\t\t}\n\t\tconst instanceIDAttribute = new t3d.Attribute(new t3d.Buffer(instanceIDArray, 1));\n\t\tinstanceIDAttribute.divisor = 1;\n\t\tinstancedGeometry.addAttribute('instanceID', instanceIDAttribute);\n\n\t\tinstancedGeometry.instanceCount = 50 * 50 * 2;\n\n\t\tconst instancedMesh = new t3d.Mesh(instancedGeometry, shaderMaterial);\n\t\tinstancedMesh.position.set(-0.5, -0.5, -0.5);\n\t\tinstancedMesh.frustumCulled = false;\n\t\tscene.add(instancedMesh);\n\n\t\tconst gui = new GUI();\n\t\tgui.add(shaderMaterial.uniforms, 'u_gridCount', 20, maxGridCount, 1).name('gridCount').onChange(value => {\n\t\t\tinstancedGeometry.instanceCount = value * value * 2;\n\t\t});\n\t\tgui.add({ flatShading: false }, 'flatShading').onChange(value => {\n\t\t\tshaderMaterial.shading = value ? t3d.SHADING_TYPE.FLAT_SHADING : t3d.SHADING_TYPE.SMOOTH_SHADING;\n\t\t\tshaderMaterial.needsUpdate = true;\n\t\t});\n\n\t\tfunction loop(count) {\n\t\t\trequestAnimationFrame(loop);\n\t\t\n\t\t\tcontroller.update();\n\t\t\n\t\t\tforwardRenderer.render(scene, camera);\n\t\t}\n\n\t\tif (forwardRenderer.capabilities.version < 2) {\n\t\t\tdocument.getElementById('notSupported').style.display = '';\n\t\t} else {\n\t\t\trequestAnimationFrame(loop);\n\t\t}\n\n\t\tfunction onWindowResize() {\n\t\t\twidth = window.innerWidth || 2;\n\t\t\theight = window.innerHeight || 2;\n\n\t\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 0.1, 1000);\n\n\t\t\tforwardRenderer.screenRenderTarget.resize(width, height);\n\t\t}\n\t\twindow.addEventListener('resize', onWindowResize, false);\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "examples/lab_gltf_grass.html",
    "content": "<!DOCTYPE html>\n<html>\n\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>t3d grass - gltf</title>\n\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n\t<link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n\n<body>\n\t<div id=\"info\" class=\"dark\">\n\t\t<a href=\"\" target=\"_blank\">t3d</a> gltf grass </br>\n\t\tInspired by <a href=\"https://github.com/robertlong/three-instanced-grass\" target=\"_blank\">robertlong/three-instanced-grass</a>\n\t</div>\n\n\t<script id=\"vs\" type=\"x-shader/x-vertex\">\n\t\tattribute vec3 a_Position;\n\t\tattribute vec2 a_Uv;\n\n\t\tuniform mat4 u_View;\n\t\tuniform mat4 u_Model;\n\t\tuniform mat4 u_Projection;\n\n\t\tattribute mat4 instanceMatrix;\n\n        uniform vec2 windDirection;\n        uniform float windSpeed;\n        uniform float windStrength;\n        uniform float noiseScale;\n        uniform sampler2D noise;\n        uniform float time;\n\n        attribute float timeOffset;\n\n        varying vec2 v_Uv;\n        varying float vHeight;\n        varying float vColor;\n\n        void main() {\n          vHeight = a_Position.y;\n          v_Uv = a_Uv;\n\n          float adjustedTime = time + timeOffset;\n\n\t\t  vec4 transformed = vec4(a_Position, 1.0);\n\t\t  transformed = instanceMatrix * transformed;\n\n          vec4 worldPosition = u_Model * transformed;\n\n          float influence = smoothstep(0.0, 1.0, vHeight / 2.0);\n          vec2 uv = worldPosition.xz / (noiseScale + 1e-2);\n          vec2 panningUv = uv + fract(adjustedTime * windDirection * windSpeed);\n          float wind = texture2D(noise, panningUv).r * 2.0 - 0.4;\n\n          vColor = texture2D(noise, a_Uv).r;\n          \n          vec2 windOffset = -windDirection * windStrength * influence * wind;\n          worldPosition.xz += windOffset;\n          worldPosition.y -= wind * influence * smoothstep(0.0, vHeight, windStrength);\n\n          worldPosition.x += influence * cos(adjustedTime * 1.0) / 8.0;\n          worldPosition.z += influence * sin(adjustedTime * 1.5) / 8.0;\n\n\t\t  gl_Position = u_Projection * u_View *u_Model * worldPosition;\n        }\n    </script>\n\n\t<script id=\"fs\" type=\"x-shader/x-fragment\">\n\t\tuniform sampler2D map;\n\n        varying vec2 v_Uv;\n        varying float vHeight;\n        varying float vColor;\n\n        void main() {\n          vec4 color = texture2D(map, v_Uv);\n\n          if (color.a < 0.5) {\n             discard;\n          }\n\n          gl_FragColor = vec4(color.rgb, 1.0);\n          \n        }\n    </script>\n\n\t<script src=\"./libs/nanobar.js\"></script>\n\n\t<!-- Import maps polyfill -->\n\t<!-- Remove this when import maps will be widely supported -->\n\t<script async src=\"./libs/es-module-shims.js\"></script>\n\n\t<script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n\t<script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { GLTFLoader } from 't3d/addons/loaders/glTF/GLTFLoader.js';\n\t\timport { TextureCubeLoader } from 't3d/addons/loaders/TextureCubeLoader.js';\n\t\timport { Texture2DLoader } from 't3d/addons/loaders/Texture2DLoader.js';\n\t\timport { OrbitControls } from 't3d/addons/controls/OrbitControls.js';\n\t\timport { SkyBox } from 't3d/addons/objects/SkyBox.js';\n\t\timport { ForwardRenderer } from 't3d/addons/render/ForwardRenderer.js';\n\t\timport { GUI } from './libs/lil-gui.esm.min.js';\n\t\timport Stats from './libs/stats.module.js';\n\n\t\tlet width = window.innerWidth || 2;\n\t\tlet height = window.innerHeight || 2;\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = width * window.devicePixelRatio;\n\t\tcanvas.height = height * window.devicePixelRatio;\n\t\tcanvas.style.width = width + 'px';\n\t\tcanvas.style.height = height + 'px';\n\t\tdocument.body.appendChild(canvas);\n\n\t\tconst forwardRenderer = new ForwardRenderer(canvas);\n\n\t\tconst cubeTexturePath = './resources/skybox/skyboxsun25deg/';\n\t\tconst cubeTexture = new TextureCubeLoader().load([\n\t\t\tcubeTexturePath + 'px.jpg',\n\t\t\tcubeTexturePath + 'nx.jpg',\n\t\t\tcubeTexturePath + 'py.jpg',\n\t\t\tcubeTexturePath + 'ny.jpg',\n\t\t\tcubeTexturePath + 'pz.jpg',\n\t\t\tcubeTexturePath + 'nz.jpg'\n\t\t]);\n\t\tcubeTexture.encoding = t3d.TEXEL_ENCODING_TYPE.SRGB;\n\n\t\tconst scene = new t3d.Scene();\n\n\t\twindow.scene = scene;\n\n\t\tconst skyBox = new SkyBox(cubeTexture);\n\t\tskyBox.level = 0;\n\t\tskyBox.gamma = true;\n\t\tscene.add(skyBox);\n\n\t\tconst textureLoader = new Texture2DLoader();\n\t\tconst noiseTexture = textureLoader.load('./resources/grass/noise.png');\n\t\tnoiseTexture.flipY = true;\n\n\t\tconst grassTexture = textureLoader.load('./resources/grass/grass01.png');\n\t\tgrassTexture.flipY = false;\n\n\t\tconst flowerTexture = textureLoader.load('./resources/grass/flowers02.png');\n\t\tflowerTexture.flipY = false;\n\n\t\tconst flowerTexture2 = textureLoader.load('./resources/grass/flowers01.png');\n\t\tflowerTexture2.flipY = false;\n\n\t\tconst groundTexture = textureLoader.load('./resources/grass/grasslight-small.jpg');\n\t\tgroundTexture.wrapS = t3d.TEXTURE_WRAP.REPEAT;\n\t\tgroundTexture.wrapT = t3d.TEXTURE_WRAP.REPEAT;\n\n\t\tconst nanobar = new Nanobar();\n\t\tnanobar.el.style.background = 'gray';\n\n\t\tconst loadingManager = new t3d.LoadingManager(function() {\n\t\t\tnanobar.go(100);\n\t\t\tnanobar.el.style.background = 'transparent';\n\t\t}, function(url, itemsLoaded, itemsTotal) {\n\t\t\tif (itemsLoaded < itemsTotal) {\n\t\t\t\tnanobar.go(itemsLoaded / itemsTotal * 100);\n\t\t\t}\n\t\t});\n\n\t\tconst GRASS_COUNT = 10000;\n\t\tconst FLOWER1_COUNT = 5000;\n\t\tconst FLOWER2_COUNT = 2500;\n\n\t\tconst windDirection = [1, 0];\n\n\t\tconst grassMaterial = createGrassMaterial(noiseTexture, grassTexture); // grass\n\n\t\tconst flowerMaterial = createGrassMaterial(noiseTexture, flowerTexture); // white flower\n\n\t\tconst flowerMaterial2 = createGrassMaterial(noiseTexture, flowerTexture2); // pink flower\n\n\t\tconst loader = new GLTFLoader(loadingManager);\n\t\tloader.autoLogError = false;\n\n\t\tconsole.time('GLTFLoader');\n\t\tloader.load(\n\t\t\t'./resources/models/gltf/grass/grass.gltf'\n\t\t).then(function(result) {\n\t\t\tconsole.timeEnd('GLTFLoader');\n\n\t\t\tconst object = result.root;\n\n\t\t\tobject.traverse(node => {\n\t\t\t\tif (node.isMesh) {\n\t\t\t\t\tconst instancedGeometry = createInstancedGeometry(node, GRASS_COUNT);\n\t\t\t\t\tconst instancedGeometry2 = createInstancedGeometry(node, FLOWER1_COUNT);\n\t\t\t\t\tconst instancedGeometry3 = createInstancedGeometry(node, FLOWER2_COUNT);\n\n\t\t\t\t\tinstancedGeometry.instanceCount = GRASS_COUNT;\n\t\t\t\t\tinstancedGeometry2.instanceCount = FLOWER1_COUNT;\n\t\t\t\t\tinstancedGeometry3.instanceCount = FLOWER2_COUNT;\n\n\t\t\t\t\tconst mesh = new t3d.Mesh(instancedGeometry, grassMaterial);\n\t\t\t\t\tconst mesh2 = new t3d.Mesh(instancedGeometry2, flowerMaterial);\n\t\t\t\t\tconst mesh3 = new t3d.Mesh(instancedGeometry3, flowerMaterial2);\n\n\t\t\t\t\tscene.add(mesh);\n\t\t\t\t\tscene.add(mesh2);\n\t\t\t\t\tscene.add(mesh3);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tconst params = {\n\t\t\t\twindSpeed: 0.1,\n\t\t\t\twindStrength: 1,\n\t\t\t\tnoiseScale: 20\n\t\t\t};\n\n\t\t\tconst gui = new GUI();\n\n\t\t\tgui.add({ version: 'WebGL ' + forwardRenderer.capabilities.version }, 'version').disable();\n\n\t\t\tgui.add({ angle: 90 }, 'angle', 0, 360, 0.01).onChange(setWindDirection);\n\n\t\t\tgui.add(params, 'windSpeed', 0, 1, 0.1).onChange(value => {\n\t\t\t\tgrassMaterial.uniforms.windSpeed = value;\n\t\t\t\tflowerMaterial.uniforms.windSpeed = value;\n\t\t\t\tflowerMaterial2.uniforms.windSpeed = value;\n\t\t\t});\n\t\t\tgui.add(params, 'windStrength', -2, 2, 0.1).onChange(value => {\n\t\t\t\tgrassMaterial.uniforms.windStrength = value;\n\t\t\t\tflowerMaterial.uniforms.windStrength = value;\n\t\t\t\tflowerMaterial2.uniforms.windStrength = value;\n\t\t\t});\n\t\t\tgui.add(params, 'noiseScale', 0, 40, 1).onChange(value => {\n\t\t\t\tgrassMaterial.uniforms.noiseScale = value;\n\t\t\t\tflowerMaterial.uniforms.noiseScale = value;\n\t\t\t\tflowerMaterial2.uniforms.noiseScale = value;\n\t\t\t});\n\t\t}).catch(e => console.error(e));\n\n\t\tfunction setWindDirection(angle) {\n\t\t\twindDirection[0] = Math.sin(angle / 180 * Math.PI);\n\t\t\twindDirection[1] = Math.cos(angle / 180 * Math.PI);\n\n\t\t\tgrassMaterial.uniforms.windDirection = windDirection;\n\t\t\tflowerMaterial.uniforms.windDirection = windDirection;\n\t\t\tflowerMaterial2.uniforms.windDirection = windDirection;\n\t\t}\n\n\t\tfunction createInstancedGeometry(node, count) {\n\t\t\tconst geometry = node.geometry;\n\n\t\t\tconst instancedGeometry = geometry.clone();\n\n\t\t\tconst matrices = [];\n\n\t\t\tconst position = new t3d.Vector3();\n\t\t\tconst scale = new t3d.Vector3();\n\t\t\tconst matrix = new t3d.Matrix4();\n\n\t\t\tconst timeOffsetArray = new Float32Array(count);\n\t\t\tconst tempQuat = new t3d.Quaternion();\n\t\t\tconst rotAxis = new t3d.Vector3(0, 1, 0);\n\t\t\tconst width = 100;\n\t\t\tconst depth = 100;\n\n\t\t\tfor (let i = 0; i < count; i++) {\n\t\t\t\tposition.x = Math.random() * width - width / 2;\n\t\t\t\tposition.y = 0;\n\t\t\t\tposition.z = Math.random() * depth - depth / 2;\n\n\t\t\t\tconst angle = Math.PI - Math.random() * (2 * Math.PI);\n\t\t\t\ttempQuat.setFromAxisAngle(rotAxis, angle);\n\t\t\t\ttempQuat.normalize();\n\n\t\t\t\tscale.set(1, 1, 1);\n\n\t\t\t\tmatrix.compose(position, tempQuat, scale);\n\t\t\t\tmatrix.toArray(matrices, i * 16);\n\n\t\t\t\ttimeOffsetArray[i] = Math.random() * 1000;\n\t\t\t}\n\n\t\t\tconst timeOffset = new t3d.Attribute(new t3d.Buffer(timeOffsetArray, 1));\n\t\t\ttimeOffset.divisor = 1;\n\t\t\tinstancedGeometry.addAttribute('timeOffset', timeOffset);\n\n\t\t\tconst instanceMatrixAttribute = new t3d.Attribute(new t3d.Buffer(new Float32Array(matrices), 16));\n\t\t\tinstanceMatrixAttribute.divisor = 1;\n\t\t\tinstancedGeometry.addAttribute('instanceMatrix', instanceMatrixAttribute);\n\n\t\t\treturn instancedGeometry;\n\t\t}\n\n\t\tfunction createGrassMaterial(noiseTexture, grassTexture) {\n\t\t\tconst grassMaterial = new t3d.ShaderMaterial({\n\t\t\t\tuniforms: {\n\t\t\t\t\ttime: 0,\n\t\t\t\t\twindDirection: windDirection,\n\t\t\t\t\twindSpeed: 0.1,\n\t\t\t\t\twindStrength: 1,\n\t\t\t\t\tnoiseScale: 20,\n\t\t\t\t\tnoise: noiseTexture,\n\t\t\t\t\tmap: grassTexture\n\t\t\t\t},\n\t\t\t\tvertexShader: document.getElementById('vs').textContent,\n\t\t\t\tfragmentShader: document.getElementById('fs').textContent\n\t\t\t});\n\n\t\t\tgrassMaterial.transparent = true;\n\n\t\t\treturn grassMaterial;\n\t\t}\n\n\t\tconst planeGeometry = new t3d.PlaneGeometry(100, 100);\n\t\tconst planeMaterial = new t3d.BasicMaterial();\n\t\tplaneMaterial.diffuseMap = groundTexture;\n\t\tplaneMaterial.diffuseMapTransform.setUvTransform(0, 0, 10, 10, 0, 0.5, 0.5);\n\n\t\tconst plane = new t3d.Mesh(planeGeometry, planeMaterial);\n\n\t\tscene.add(plane);\n\n\t\tconst ambientLight = new t3d.AmbientLight(0xffffff, 0.1);\n\t\tscene.add(ambientLight);\n\n\t\tconst directionalLight = new t3d.DirectionalLight(0xffffff, 1);\n\t\tdirectionalLight.position.set(0, 10, 30);\n\t\tdirectionalLight.lookAt(new t3d.Vector3(), new t3d.Vector3(0, 1, 0));\n\t\tdirectionalLight.castShadow = true;\n\t\tscene.add(directionalLight);\n\n\t\tconst camera = new t3d.Camera();\n\t\tcamera.outputEncoding = t3d.TEXEL_ENCODING_TYPE.SRGB;\n\t\tcamera.position.set(22, 0.6, 32);\n\t\tcamera.lookAt(new t3d.Vector3(0, 0, 0), new t3d.Vector3(0, 1, 0));\n\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 0.1, 1000);\n\t\tscene.add(camera);\n\n\t\t// stats\n\t\tconst stats = new Stats();\n\t\tstats.showPanel(0);\n\t\tdocument.body.appendChild(stats.dom);\n\n\t\tconst controller = new OrbitControls(camera, canvas);\n\t\tcontroller.enablePan = false;\n\t\tcontroller.maxDistance = 50;\n\t\tcontroller.minPolarAngle = 85 / 180 * Math.PI;\n\t\tcontroller.maxPolarAngle = 89 / 180 * Math.PI;\n\n\t\tfunction loop(count) {\n\t\t\trequestAnimationFrame(loop);\n\n\t\t\tstats.begin();\n\t\t\tgrassMaterial.uniforms.time = count / 1000;\n\t\t\tflowerMaterial.uniforms.time = count / 1000;\n\n\t\t\tcontroller.update();\n\n\t\t\tforwardRenderer.render(scene, camera);\n\t\t\tstats.end();\n\t\t}\n\n\t\trequestAnimationFrame(loop);\n\n\t\tfunction onWindowResize() {\n\t\t\twidth = window.innerWidth || 2;\n\t\t\theight = window.innerHeight || 2;\n\n\t\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 0.1, 1000);\n\n\t\t\tforwardRenderer.screenRenderTarget.resize(width * window.devicePixelRatio, height * window.devicePixelRatio);\n\n\t\t\tcanvas.style.width = width + 'px';\n\t\t\tcanvas.style.height = height + 'px';\n\t\t}\n\t\twindow.addEventListener('resize', onWindowResize, false);\n\t</script>\n</body>\n\n</html>"
  },
  {
    "path": "examples/lab_ground.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>t3d - ground</title>\n\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n\t<link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n</head>\n<body>\n    <div id=\"info\">\n        <a href=\"\" target=\"_blank\">t3d</a> - ground\n    </div>\n\n\t<script src=\"./libs/simplex-noise.js\"></script>\n\n\t<!-- Import maps polyfill -->\n    <!-- Remove this when import maps will be widely supported -->\n    <script async src=\"./libs/es-module-shims.js\"></script>\n\n    <script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n    <script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { ForwardRenderer } from 't3d/addons/render/ForwardRenderer.js';\n\t\timport { Texture2DLoader } from 't3d/addons/loaders/Texture2DLoader.js';\n\t\timport { GUI } from './libs/lil-gui.esm.min.js';\n\n\t\tlet width = window.innerWidth || 2;\n\t\tlet height = window.innerHeight || 2;\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = width;\n\t\tcanvas.height = height;\n\t\tdocument.body.appendChild(canvas);\n\n\t\tconst forwardRenderer = new ForwardRenderer(canvas);\n\t\tforwardRenderer.screenRenderTarget.setColorClearValue(0.1, 0.8, 0.9, 1);\n\n\t\tconst scene = new t3d.Scene();\n\n\t\tconst loader = new Texture2DLoader();\n\n\t\tconst grassTexture = loader.load('./resources/grass.jpg');\n\t\tgrassTexture.wrapT = grassTexture.wrapS = t3d.TEXTURE_WRAP.REPEAT;\n\t\tgrassTexture.anisotropy = forwardRenderer.capabilities.maxAnisotropy;\n\t\tgrassTexture.encoding = t3d.TEXEL_ENCODING_TYPE.SRGB;\n\n\t\tconst dirtTexture = loader.load('./resources/dirt.jpg');\n\t\tdirtTexture.wrapT = dirtTexture.wrapS = t3d.TEXTURE_WRAP.REPEAT;\n\t\tdirtTexture.anisotropy = forwardRenderer.capabilities.maxAnisotropy;\n\t\tdirtTexture.encoding = t3d.TEXEL_ENCODING_TYPE.SRGB;\n\n\t\tconst alphaTexture = loader.load('./resources/ground_alpha.jpg');\n\t\talphaTexture.wrapT = alphaTexture.wrapS = t3d.TEXTURE_WRAP.MIRRORED_REPEAT;\n\n\t\tconst plane_geometry = new t3d.PlaneGeometry(600, 600);\n\t\tplane_geometry.groups = [\n\t\t\t{ start: 0, count: Infinity, materialIndex: 0 },\n\t\t\t{ start: 0, count: Infinity, materialIndex: 1 }\n\t\t];\n\n\t\tconst mat1 = new t3d.BasicMaterial();\n\t\tmat1.diffuseMap = dirtTexture;\n\t\tmat1.diffuseMapTransform.setUvTransform(0, 0, 20, 20, 0, 0, 0);\n\n\t\tconst mat2 = new t3d.BasicMaterial();\n\t\tmat2.diffuseMap = grassTexture;\n\t\tmat2.diffuseMapTransform.setUvTransform(0, 0, 40, 40, 0, 0, 0);\n\t\tmat2.alphaMap = alphaTexture;\n\t\tmat2.transparent = true;\n\n\t\tconst plane = new t3d.Mesh(plane_geometry, [mat1, mat2]);\n\t\tplane.position.y = -10;\n\t\tscene.add(plane);\n\n\t\tconst camera = new t3d.Camera();\n\t\tcamera.outputEncoding = t3d.TEXEL_ENCODING_TYPE.GAMMA;\n\t\tcamera.gammaFactor = 1.5;\n\t\tcamera.position.set(0, 25, 100);\n\t\tcamera.lookAt(new t3d.Vector3(0, 0, 0), new t3d.Vector3(0, 1, 0));\n\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 1000);\n\t\tscene.add(camera);\n\n\t\tconst params = { scaleX: 1, scaleY: 1 };\n\n\t\tconst gui = new GUI();\n\t\tgui.add(params, 'scaleX', 0.1, 5.0, 0.01).onChange(() => {\n\t\t\tmat2.alphaMapTransform.setUvTransform(0, 0, params.scaleX, params.scaleY, 0, 0.5, 0.5);\n\t\t});\n\t\tgui.add(params, 'scaleY', 0.1, 5.0, 0.01).onChange(() => {\n\t\t\tmat2.alphaMapTransform.setUvTransform(0, 0, params.scaleX, params.scaleY, 0, 0.5, 0.5);\n\t\t});\n\n\t\tfunction loop(count) {\n\t\t\trequestAnimationFrame(loop);\n\n\t\t\t// rotate camera\n\t\t\tcamera.position.x = 100 * Math.sin(count / 1000 * .2);\n\t\t\tcamera.position.z = 100 * Math.cos(count / 1000 * .2);\n\t\t\tcamera.lookAt(new t3d.Vector3(0, 0, 0), new t3d.Vector3(0, 1, 0));\n\n\t\t\tforwardRenderer.render(scene, camera);\n\t\t}\n\t\trequestAnimationFrame(loop);\n\n\t\tfunction onWindowResize() {\n\t\t\twidth = window.innerWidth || 2;\n\t\t\theight = window.innerHeight || 2;\n\n\t\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 1000);\n\n\t\t\tforwardRenderer.screenRenderTarget.resize(width, height);\n\t\t}\n\t\twindow.addEventListener('resize', onWindowResize, false);\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "examples/lab_histogram.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>t3d - lab histogram</title>\n\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n\t<link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n</head>\n<body>\n    <div id=\"info\">\n        <a href=\"\" target=\"_blank\">t3d</a> - 3D histogram example\n\t\t<div id=\"notSupported\" style=\"display:none\">\n\t\t\tSorry, your graphics card + browser does not support vertex textures more than 2\n\t\t</div>\n    </div>\n\n\t<!-- Import maps polyfill -->\n    <!-- Remove this when import maps will be widely supported -->\n    <script async src=\"./libs/es-module-shims.js\"></script>\n\n    <script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n    <script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { HeatmapGenerator } from 't3d/addons/textures/HeatmapGenerator.js';\n\t\timport { Texture2DLoader } from 't3d/addons/loaders/Texture2DLoader.js';\n\t\timport { TextureCubeLoader } from 't3d/addons/loaders/TextureCubeLoader.js';\n\t\timport { OrbitControls } from 't3d/addons/controls/OrbitControls.js';\n\t\timport { ForwardRenderer } from 't3d/addons/render/ForwardRenderer.js';\n\t\timport { GUI } from './libs/lil-gui.esm.min.js';\n\t\timport Stats from './libs/stats.module.js';\n\n\t\tlet width = window.innerWidth || 2;\n\t\tlet height = window.innerHeight || 2;\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = width;\n\t\tcanvas.height = height;\n\t\tdocument.body.appendChild(canvas);\n\n\t\tconst forwardRenderer = new ForwardRenderer(canvas);\n\t\tforwardRenderer.screenRenderTarget.setColorClearValue(0, 0, 0, 1);\n\n\t\tconst scene = new t3d.Scene();\n\n\t\tscene.fog = new t3d.Fog(0x000000, 800, 2000);\n\n\t\tconst cubeTexturePath = './resources/skybox/Bridge2/';\n\t\tconst cubeTexture = new TextureCubeLoader().load([\n\t\t\tcubeTexturePath + 'posx.jpg',\n\t\t\tcubeTexturePath + 'negx.jpg',\n\t\t\tcubeTexturePath + 'posy.jpg',\n\t\t\tcubeTexturePath + 'negy.jpg',\n\t\t\tcubeTexturePath + 'posz.jpg',\n\t\t\tcubeTexturePath + 'negz.jpg'\n\t\t]);\n\t\tcubeTexture.encoding = t3d.TEXEL_ENCODING_TYPE.SRGB;\n\n\t\tscene.environment = cubeTexture;\n\n\t\tconst ambientLight = new t3d.AmbientLight(0xffffff, 0.1);\n\t\tscene.add(ambientLight);\n\n\t\tconst directionalLight = new t3d.DirectionalLight(0xffffff, 1.5);\n\t\tdirectionalLight.castShadow = true;\n\t\tdirectionalLight.shadow.windowSize = 450;\n\t\tdirectionalLight.shadow.mapSize.set(2048, 2048);\n\t\tdirectionalLight.shadow.bias = -0.001;\n\t\tdirectionalLight.shadow.normalBias = 0.2;\n\t\tdirectionalLight.shadow.cameraNear = 10;\n\t\tdirectionalLight.position.set(-130, 140, 150);\n\t\tdirectionalLight.lookAt(new t3d.Vector3(), new t3d.Vector3(0, 1, 0));\n\t\tscene.add(directionalLight);\n\n\t\tconst camera = new t3d.Camera();\n\t\tcamera.outputEncoding = t3d.TEXEL_ENCODING_TYPE.SRGB;\n\t\tcamera.position.set(260, 100, 260);\n\t\tcamera.lookAt(new t3d.Vector3(0, 0, 0), new t3d.Vector3(0, 1, 0));\n\t\tcamera.setPerspective(30 / 180 * Math.PI, width / height, 1, 5000);\n\t\tscene.add(camera);\n\n\t\tconst controller = new OrbitControls(camera, canvas);\n\n\t\tconst plane_geometry = new t3d.PlaneGeometry(3000, 3000);\n\t\tconst plane_material = new t3d.PBRMaterial();\n\t\tplane_material.roughness = 0.7;\n\t\tplane_material.diffuse.setHex(0x111111);\n\t\tconst plane = new t3d.Mesh(plane_geometry, plane_material);\n\t\tplane.position.y = -1;\n\t\tplane.receiveShadow = true;\n\t\tscene.add(plane);\n\n\t\t// stats\n\t\tconst stats = new Stats();\n\t\tstats.showPanel(0);\n\t\tdocument.body.appendChild(stats.dom);\n\n\t\tfunction loop(count) {\n\t\t\trequestAnimationFrame(loop);\n\n\t\t\tstats.begin();\n\n\t\t\tcontroller.update();\n\t\t\n\t\t\tforwardRenderer.render(scene, camera);\n\n\t\t\tstats.end();\n\t\t}\n\n\t\tconst supportVertexTextures = forwardRenderer.capabilities.maxVertexTextures > 2;\n\t\tif (!supportVertexTextures) {\n\t\t\tdocument.getElementById('notSupported').style.display = '';\n\t\t} else {\n\t\t\trequestAnimationFrame(loop);\n\t\t}\n\n\t\tfunction onWindowResize() {\n\t\t\twidth = window.innerWidth || 2;\n\t\t\theight = window.innerHeight || 2;\n\n\t\t\tcamera.setPerspective(30 / 180 * Math.PI, width / height, 1, 5000);\n\n\t\t\tforwardRenderer.screenRenderTarget.resize(width, height);\n\t\t}\n\t\twindow.addEventListener('resize', onWindowResize, false);\n\n\t\t// Part1: histogram material\n\n\t\tclass HistogramMaterial extends t3d.PBRMaterial {\n\n\t\t\tconstructor() {\n\t\t\t\tsuper();\n\n\t\t\t\tthis.type = t3d.MATERIAL_TYPE.SHADER;\n\n\t\t\t\tthis.shaderName = 'Histogram';\n\n\t\t\t\tthis.vertexShader = vertexShader;\n\t\t\t\tthis.fragmentShader = fragmentShader;\n\n\t\t\t\tthis.uniforms.heightMap1 = null;\n\t\t\t\tthis.uniforms.heightMap2 = null;\n\t\t\t\tthis.uniforms.colorMap = null;\n\t\t\t\tthis.uniforms.heightLerp = 0;\n\t\t\t\tthis.uniforms.heightScalar = 50;\n\t\t\t}\n\n\t\t}\n\n\t\tHistogramMaterial.prototype.isHistogramMaterial = true;\n\n\t\tconst size = '256.';\n\n\t\tconst batchingParsVert = `\n\t\t\tattribute float batchId;\n\t\t\tuniform sampler2D heightMap1;\n\t\t\tuniform sampler2D heightMap2;\n\t\t\tuniform float heightLerp;\n\t\t\tuniform float heightScalar;\n\t\t\tvarying float heightFactor;\n\t\t\tvec3 getHightMapData(float i) {\n\t\t\t\tfloat x = i - floor((i + 0.5) / ${size}) * ${size};\n\t\t\t\tfloat y = floor((i + 0.5) / ${size});\n\n\t\t\t\tvec4 texel1 = texture2D(heightMap1, vec2(x / ${size}, y / ${size}));\n\t\t\t\tvec4 texel2 = texture2D(heightMap2, vec2(x / ${size}, y / ${size}));\n\n\t\t\t\tfloat height = mix(texel1.r, texel2.r, heightLerp);\n\n\t\t\t\treturn vec3(x * 1.1, y * 1.1, height);\n\t\t\t}\n\t\t`;\n\n\t\tconst batchingPositionVert = `\n\t\t\tvec3 heightMapData = getHightMapData(batchId);\n\n\t\t\tvec4 tPosition = vec4(transformed, 1.0);\n\t\t\ttPosition.y *= heightMapData.z * heightScalar;\n\t\t\ttPosition.y += 0.001;\n\t\t\ttPosition.x += heightMapData.x;\n\t\t\ttPosition.z += heightMapData.y;\n\n\t\t\tvec4 worldPosition = u_Model * tPosition;\n\t\t\tgl_Position = u_ProjectionView * worldPosition;\n\n\t\t\theightFactor = heightMapData.z;\n\t\t`;\n\n\t\tlet vertexShader = t3d.ShaderLib.pbr_vert;\n\n\t\tvertexShader = vertexShader.replace('#include <logdepthbuf_pars_vert>', `\n\t\t\t#include <logdepthbuf_pars_vert>\n\t\t\t${batchingParsVert}\n\t\t`);\n\t\tvertexShader = vertexShader.replace('#include <pvm_vert>', batchingPositionVert);\n\n\t\tlet fragmentShader = t3d.ShaderLib.pbr_frag;\n\n\t\tfragmentShader = fragmentShader.replace(\n\t\t\t'#include <clippingPlanes_pars_frag>',\n\t\t\t`\n\t\t\t#include <clippingPlanes_pars_frag>\n\t\t\tuniform sampler2D colorMap;\n\t\t\tvarying float heightFactor;\n\t\t\t`\n\t\t);\n\n\t\tfragmentShader = fragmentShader.replace(\n\t\t\t'#include <color_frag>',\n\t\t\t`\n\t\t\t#include <color_frag>\n\t\t\t// if (heightFactor < 0.01) discard;\n\t\t\toutColor *= texture2D(colorMap, vec2(heightFactor, 0.5));\n\t\t\t`\n\t\t);\n\n\t\texport class HistogramDepthMaterial extends t3d.DepthMaterial {\n\n\t\t\tconstructor() {\n\t\t\t\tsuper();\n\t\t\t\tthis.type = t3d.MATERIAL_TYPE.SHADER;\n\t\t\t\tthis.packToRGBA = true;\n\t\t\t\tthis.shaderName = 'HistogramDepth';\n\t\t\t\tthis.vertexShader = depthVertexShader;\n\t\t\t\tthis.fragmentShader = t3d.ShaderLib.depth_frag;\n\n\t\t\t\tthis.uniforms.heightMap1 = null;\n\t\t\t\tthis.uniforms.heightMap2 = null;\n\t\t\t\tthis.uniforms.heightLerp = 0;\n\t\t\t}\n\n\t\t}\n\n\t\tconst depthVertexShader = `\n\t\t\t#include <common_vert>\n\t\t\t#include <morphtarget_pars_vert>\n\t\t\t#include <skinning_pars_vert>\n\t\t\t#include <uv_pars_vert>\n\t\t\t#include <logdepthbuf_pars_vert>\n\t\t\t${batchingParsVert}\n\t\t\tvoid main() {\n\t\t\t\t#include <uv_vert>\n\t\t\t\t#include <begin_vert>\n\t\t\t\t#include <morphtarget_vert>\n\t\t\t\t#include <skinning_vert>\n\t\t\t\t${batchingPositionVert}\n\t\t\t\t#include <logdepthbuf_vert>\n\t\t\t}\n\t\t`;\n\n\t\t// Part2: histogram geometry\n\n\t\tclass HistogramGeometry extends t3d.Geometry {\n\n\t\t\tconstructor(count = 256 * 256) {\n\t\t\t\tsuper();\n\n\t\t\t\tconst vertices = new Float32Array(count * 24 * 3);\n\t\t\t\tconst normals = new Float32Array(count * 24 * 3);\n\t\t\t\tconst uvs = new Float32Array(count * 24 * 2);\n\t\t\t\tconst batchIds = new Float32Array(count * 24);\n\n\t\t\t\tconst indices = new Uint32Array(count * 12 * 3);\n\n\t\t\t\tfor (let i = 0; i < count; i++) {\n\t\t\t\t\tvertices.set(tempPositions, i * 24 * 3);\n\t\t\t\t\tnormals.set(tempNormals, i * 24 * 3);\n\t\t\t\t\tuvs.set(tempUvs, i * 24 * 2);\n\n\t\t\t\t\tfor (let j = 0; j < 24; j++) {\n\t\t\t\t\t\tbatchIds[i * 24 + j] = i;\n\t\t\t\t\t}\n\n\t\t\t\t\tconst subIndices = Array.from(tempIndices).map(index => index + i * 24);\n\t\t\t\t\tindices.set(subIndices, i * 12 * 3);\n\t\t\t\t}\n\n\t\t\t\tthis.addAttribute('a_Position', new t3d.Attribute(new t3d.Buffer(vertices, 3)));\n\t\t\t\tthis.addAttribute('a_Normal', new t3d.Attribute(new t3d.Buffer(normals, 3)));\n\t\t\t\tthis.addAttribute('a_Uv', new t3d.Attribute(new t3d.Buffer(uvs, 2)));\n\t\t\t\tthis.addAttribute('batchId', new t3d.Attribute(new t3d.Buffer(batchIds, 1)));\n\n\t\t\t\tthis.setIndex(new t3d.Attribute(new t3d.Buffer(indices, 1)));\n\t\t\t}\n\n\t\t}\n\n\t\tconst tempGeometry = new t3d.BoxGeometry(1, 1, 1, 1, 1, 1);\n\t\tconst tempPositions = tempGeometry.attributes.a_Position.buffer.array;\n\t\tfor (let i = 0; i < tempPositions.length; i += 3) {\n\t\t\ttempPositions[i + 1] += 0.5;\n\t\t}\n\t\tconst tempNormals = tempGeometry.attributes.a_Normal.buffer.array;\n\t\tconst tempUvs = tempGeometry.attributes.a_Uv.buffer.array;\n\t\tconst tempIndices = tempGeometry.index.buffer.array;\n\n\t\t// Part3: create histogram (main)\n\n\t\tnew Texture2DLoader().load('./resources/platte.png', function(texture) {\n\t\t\ttexture.encoding = t3d.TEXEL_ENCODING_TYPE.SRGB;\n\n\t\t\tconst data1 = [];\n\t\t\tfor (let i = 0; i < 130; i++) {\n\t\t\t\tdata1[i] = [Math.random() * 120 - 60, Math.random() * 120 - 60, Math.random() * 0.8];\n\t\t\t}\n\t\t\tconst generator1 = new HeatmapGenerator(256, 256);\n\t\t\tgenerator1.render(forwardRenderer, data1, {\n\t\t\t\tsize: [120, 120],\n\t\t\t\tradius: 5\n\t\t\t});\n\n\t\t\tconst data2 = [];\n\t\t\tfor (let i = 0; i < 150; i++) {\n\t\t\t\tdata2[i] = [Math.random() * 120 - 60, Math.random() * 120 - 60, Math.random() * 0.7];\n\t\t\t}\n\t\t\tconst generator2 = new HeatmapGenerator(256, 256);\n\t\t\tgenerator2.render(forwardRenderer, data2, {\n\t\t\t\tsize: [120, 120],\n\t\t\t\tradius: 8\n\t\t\t});\n\n\t\t\tconst histogramMaterial = new HistogramMaterial();\n\t\t\thistogramMaterial.uniforms.heightMap1 = generator1.getGrayTexture();\n\t\t\thistogramMaterial.uniforms.heightMap2 = generator2.getGrayTexture();\n\t\t\thistogramMaterial.uniforms.colorMap = texture;\n\t\t\thistogramMaterial.metalness = 0.5;\n\t\t\thistogramMaterial.roughness = 0.8;\n\n\t\t\tconst histogramGeometry = new HistogramGeometry();\n\n\t\t\tconst histogram = new t3d.Mesh(histogramGeometry, histogramMaterial);\n\t\t\thistogram.frustumCulled = false;\n\t\t\thistogram.castShadow = true;\n\t\t\thistogram.receiveShadow = true;\n\t\t\thistogram.position.set(-256 / 2, 0, -256 / 2);\n\t\t\tscene.add(histogram);\n\n\t\t\tconst gui = new GUI();\n\t\t\tgui.add(histogramMaterial.uniforms, 'heightScalar', 0, 100, 1);\n\t\t\tgui.add(histogramMaterial.uniforms, 'heightLerp', 0, 1, 0.01);\n\t\t});\n\n\t\t// Part4: set shadow material\n\n\t\tconst depthMaterials = [];\n\t\tconst shadowSide = { 'front': t3d.DRAW_SIDE.BACK, 'back': t3d.DRAW_SIDE.FRONT, 'double': t3d.DRAW_SIDE.DOUBLE };\n\t\tforwardRenderer.shadowMapPass.getDepthMaterial = function(renderable) {\n\t\t\tconst useSkinning = !!renderable.object.skeleton;\n\t\t\tconst useMorphing = renderable.geometry.morphAttributes.position && renderable.geometry.morphAttributes.position.length > 0;\n\t\t\tconst isHistogram = renderable.material.isHistogramMaterial;\n\n\t\t\tconst index = useMorphing << 0 | useSkinning << 1 | isHistogram << 2;\n\n\t\t\tlet material = depthMaterials[index];\n\t\t\tif (material === undefined) {\n\t\t\t\tmaterial = isHistogram ? new HistogramDepthMaterial() : new t3d.DepthMaterial();\n\t\t\t\tdepthMaterials[index] = material;\n\t\t\t}\n\n\t\t\tmaterial.side = shadowSide[renderable.material.side];\n\n\t\t\tif (isHistogram) {\n\t\t\t\tmaterial.uniforms.heightMap1 = renderable.material.uniforms.heightMap1;\n\t\t\t\tmaterial.uniforms.heightMap2 = renderable.material.uniforms.heightMap2;\n\t\t\t\tmaterial.uniforms.heightLerp = renderable.material.uniforms.heightLerp;\n\t\t\t\tmaterial.uniforms.heightScalar = renderable.material.uniforms.heightScalar;\n\t\t\t}\n\n\t\t\treturn material;\n\t\t};\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "examples/lab_ik.html",
    "content": "<!DOCTYPE html>\n<html>\n\t<head>\n\t\t<meta charset=\"utf-8\" />\n\t\t<title>t3d - lab ik</title>\n\t\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\"/>\n\t\t<link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\" />\n\t</head>\n\t<body>\n\t\t<div id=\"info\" class=\"dark\">\n\t\t\t<a href=\"\" target=\"_blank\">t3d</a> - lab ik\n\t\t\t<br/>This model is based on <a href=\"https://sketchfab.com/3d-models/gilberto-a-robot-arm-362d32e0b32945ae8174ebf71dae97f0\"  target=\"_blank\">\"Gilberto A Robot Arm\"</a>\n\t\t\t<br/>by <a href=\"https://sketchfab.com/GilbertoA\"  target=\"_blank\">GilbertoA</a> licensed under <a href=\"http://creativecommons.org/licenses/by/4.0/\"  target=\"_blank\">CC-BY-4.0</a>\n\t\t</div>\n\n\t\t<script src=\"./libs/nanobar.js\"></script>\n\n\t\t<!-- Import maps polyfill -->\n\t\t<!-- Remove this when import maps will be widely supported -->\n\t\t<script async src=\"./libs/es-module-shims.js\"></script>\n\n\t\t<script type=\"importmap\">\n\t\t\t{\n\t\t\t\t\"imports\": {\n\t\t\t\t\t\"t3d\": \"../build/t3d.module.js\",\n\t\t\t\t\t\"t3d/addons/\": \"./jsm/\"\n\t\t\t\t}\n\t\t\t}\n\t\t</script>\n\n\t\t<script type=\"module\">\n\t\t\timport * as t3d from 't3d';\n\t\t\timport { OrbitControls } from 't3d/addons/controls/OrbitControls.js';\n\t\t\timport { TransformControls } from 't3d/addons/controls/TransformControls.js';\n\t\t\timport { GLTFLoader } from 't3d/addons/loaders/glTF/GLTFLoader.js';\n\t\t\timport { ForwardRenderer } from 't3d/addons/render/ForwardRenderer.js';\n\t\t\timport { CCDIKSolver } from 't3d/addons/animation/CCDIKSolver.js';\n\t\t\timport Stats from './libs/stats.module.js';\n\n\t\t\tconst devicePixelRatio = window.devicePixelRatio;\n\n\t\t\tlet width = window.innerWidth || 2;\n\t\t\tlet height = window.innerHeight || 2;\n\n\t\t\tconst canvas = document.createElement('canvas');\n\t\t\tcanvas.width = devicePixelRatio * width;\n\t\t\tcanvas.height = devicePixelRatio * height;\n\t\t\tcanvas.style.width = width + 'px';\n\t\t\tcanvas.style.height = height + 'px';\n\t\t\tdocument.body.appendChild(canvas);\n\n\t\t\tconst forwardRenderer = new ForwardRenderer(canvas);\n\t\t\tforwardRenderer.screenRenderTarget.setColorClearValue(0.6, 0.7, 0.8, 1);\n\n\t\t\tconst stats = new Stats();\n\t\t\tdocument.body.appendChild(stats.dom);\n\n\t\t\tconst scene = new t3d.Scene();\n\t\t\tscene.fog = new t3d.Fog(undefined, 10, 50);\n\t\t\tscene.fog.color.setRGB(0.6, 0.7, 0.8);\n\n\t\t\tconst camera = new t3d.Camera();\n\t\t\tcamera.position.set(0, 2, 5);\n\t\t\tcamera.lookAt(new t3d.Vector3(0, 0, 0), new t3d.Vector3(0, 1, 0));\n\t\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 0.1, 1000);\n\t\t\tcamera.outputEncoding = t3d.TEXEL_ENCODING_TYPE.SRGB;\n\t\t\tscene.add(camera);\n\n\t\t\tconst controls = new OrbitControls(camera, canvas);\n\t\t\tcontrols.target.set(0, 0.5, 0);\n\n\t\t\tconst ambientLight = new t3d.AmbientLight(0xffffff, 0.8);\n\t\t\tscene.add(ambientLight);\n\n\t\t\tconst directionalLight = new t3d.DirectionalLight(0xffffff, 1);\n\t\t\tdirectionalLight.position.set(5, 5, -5);\n\t\t\tdirectionalLight.lookAt(new t3d.Vector3(0, 0, 0), new t3d.Vector3(0, 1, 0));\n\t\t\tdirectionalLight.castShadow = true;\n\t\t\tdirectionalLight.shadow.windowSize = 6;\n\t\t\tdirectionalLight.shadow.mapSize.set(1024, 1024);\n\t\t\tdirectionalLight.shadow.normalBias = 0.01;\n\t\t\tscene.add(directionalLight);\n\n\t\t\tconst nanobar = new Nanobar();\n\t\t\tnanobar.el.style.background = 'gray';\n\t\t\tconst loadingManager = new t3d.LoadingManager(function() {\n\t\t\t\tnanobar.go(100);\n\t\t\t\tnanobar.el.style.background = 'transparent';\n\t\t\t}, function(url, itemsLoaded, itemsTotal) {\n\t\t\t\tif (itemsLoaded < itemsTotal) {\n\t\t\t\t\tnanobar.go((itemsLoaded / itemsTotal) * 100);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tconst plane = new t3d.Mesh(new t3d.PlaneGeometry(100, 100), new t3d.LambertMaterial());\n\t\t\tplane.material.diffuse.setHex(0x666666);\n\t\t\tplane.receiveShadow = true;\n\t\t\tscene.add(plane);\n\n\t\t\tlet ikSolver, bones, sphere, transformControls;\n\n\t\t\tconst iks = [{\n\t\t\t\teffector: 11,\n\t\t\t\titeration: 3,\n\t\t\t\tlinks: [{\n\t\t\t\t\tindex: 10,\n\t\t\t\t\trotationMin: new t3d.Vector3(0, 0, 0),\n\t\t\t\t\trotationMax: new t3d.Vector3(0, 0, 0)\n\t\t\t\t}, {\n\t\t\t\t\tindex: 9,\n\t\t\t\t\trotationMin: new t3d.Vector3(3.141, 0, 1.579),\n\t\t\t\t\trotationMax: new t3d.Vector3(3.141, 0, 1.579)\n\t\t\t\t}, {\n\t\t\t\t\tindex: 8,\n\t\t\t\t\trotationMin: new t3d.Vector3(3.127, 0, 1.721),\n\t\t\t\t\trotationMax: new t3d.Vector3(3.127, 0, 1.721)\n\t\t\t\t}, {\n\t\t\t\t\tindex: 7,\n\t\t\t\t\trotationMin: new t3d.Vector3(0, 1.554, -1.42),\n\t\t\t\t\trotationMax: new t3d.Vector3(0, 1.554, -1.42)\n\t\t\t\t}, {\n\t\t\t\t\tindex: 6,\n\t\t\t\t\trotationMin: new t3d.Vector3(-1.578, 0, 1.578),\n\t\t\t\t\trotationMax: new t3d.Vector3(-1.578, Math.PI / 2, 1.578)\n\t\t\t\t}, {\n\t\t\t\t\tindex: 5,\n\t\t\t\t\trotationMin: new t3d.Vector3(0, 0, 0),\n\t\t\t\t\trotationMax: new t3d.Vector3(0, 0, 0)\n\t\t\t\t}, {\n\t\t\t\t\tindex: 4,\n\t\t\t\t\trotationMin: new t3d.Vector3(-1.572, 0, -Math.PI * 2 / 3),\n\t\t\t\t\trotationMax: new t3d.Vector3(-1.572, 0, 0)\n\t\t\t\t}, {\n\t\t\t\t\tindex: 3,\n\t\t\t\t\trotationMin: new t3d.Vector3(-0.015, -Math.PI / 2, 0.045),\n\t\t\t\t\trotationMax: new t3d.Vector3(-0.015, Math.PI / 2, 0.045)\n\t\t\t\t}, {\n\t\t\t\t\tindex: 2,\n\t\t\t\t\trotationMin: new t3d.Vector3(-Math.PI, 0, 0),\n\t\t\t\t\trotationMax: new t3d.Vector3(Math.PI, 0, 0)\n\t\t\t\t}]\n\t\t\t}];\n\n\t\t\tconst gltfLoader = new GLTFLoader(loadingManager);\n\t\t\tgltfLoader.load('./resources/models/gltf/robot_arm/glTF/scene.gltf').then(function(gltf) {\n\t\t\t\tgltf.nodes.forEach(function(n) {\n\t\t\t\t\tif (n.name === 'J_Claw_Both_Rot_end_010') {\n\t\t\t\t\t\tn.position.set(125, 0, 2.5); // Modify the bone to catch the ball\n\t\t\t\t\t}\n\t\t\t\t\tif (n.name === 'Light_Boi') {\n\t\t\t\t\t\tn.visible = false;\n\t\t\t\t\t}\n\t\t\t\t\tif (n.name === 'Heavy_Boi') {\n\t\t\t\t\t\tn.visible = false;\n\t\t\t\t\t}\n\t\t\t\t\tif (n.name === 'Object_56') {\n\t\t\t\t\t\tbones = n.skeleton.bones;\n\t\t\t\t\t}\n\n\t\t\t\t\tn.castShadow = true;\n\t\t\t\t\tn.receiveShadow = true;\n\t\t\t\t});\n\n\t\t\t\tconst model = gltf.root;\n\t\t\t\tscene.add(model);\n\t\t\t\n\t\t\t\tikSolver = new CCDIKSolver(bones, iks);\n\n\t\t\t\tsphere = new t3d.Mesh(\n\t\t\t\t\tnew t3d.SphereGeometry(0.145, 16, 16),\n\t\t\t\t\tnew t3d.PBRMaterial()\n\t\t\t\t);\n\t\t\t\tsphere.material.diffuse.setHex(0x052255);\n\t\t\t\tsphere.castShadow = true;\n\t\t\t\tsphere.position.set(0.8, 0.15, 1);\n\t\t\t\tsphere.updateMatrix();\n\t\t\t\tscene.add(sphere);\n\n\t\t\t\ttransformControls = new TransformControls(camera, canvas);\n\t\t\t\ttransformControls.mode = 'translate';\n\t\t\t\ttransformControls.group.addObject(sphere);\n\t\t\t\ttransformControls.onDragStart = function() {\n\t\t\t\t\tcontrols.enabled = false;\n\t\t\t\t};\n\t\t\t\ttransformControls.onDragEnd = function() {\n\t\t\t\t\tcontrols.enabled = true;\n\t\t\t\t};\n\t\t\t\tscene.add(transformControls);\n\t\t\t}).catch(e => console.error(e));\n\n\t\t\tfunction loop(count) {\n\t\t\t\trequestAnimationFrame(loop);\n\n\t\t\t\tcontrols.update();\n\t\t\t\tstats.update();\n\t\t\t\n\t\t\t\tif (ikSolver) {\n\t\t\t\t\ttransformControls.update();\n\t\t\t\t\tsphere.updateMatrix();\n\t\t\t\t\tikSolver.target.setFromMatrixPosition(sphere.worldMatrix);\n\t\t\t\t\tikSolver.update();\n\t\t\t\t}\n\n\t\t\t\tforwardRenderer.render(scene, camera);\n\t\t\t}\n\t\t\trequestAnimationFrame(loop);\n\n\t\t\tfunction onWindowResize() {\n\t\t\t\twidth = window.innerWidth || 2;\n\t\t\t\theight = window.innerHeight || 2;\n\n\t\t\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 0.1, 1000);\n\n\t\t\t\tforwardRenderer.screenRenderTarget.resize(devicePixelRatio * width, devicePixelRatio * height);\n\n\t\t\t\tcanvas.style.width = width + 'px';\n\t\t\t\tcanvas.style.height = height + 'px';\n\t\t\t}\n\t\t\twindow.addEventListener('resize', onWindowResize, false);\n\t\t</script>\n\t</body>\n</html>"
  },
  {
    "path": "examples/lab_impostor_octahedral.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>t3d - octahedral impostor</title>\n\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n\t<link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n</head>\n<body>\n    <div id=\"info\">\n        <a href=\"\" target=\"_blank\">t3d</a> -  octahedral impostor\n    </div>\n\n\t<!-- Import maps polyfill -->\n    <!-- Remove this when import maps will be widely supported -->\n    <script async src=\"./libs/es-module-shims.js\"></script>\n\n    <script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n    <script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { OrbitControls } from 't3d/addons/controls/OrbitControls.js';\n\t\timport { GLTFLoader } from 't3d/addons/loaders/glTF/GLTFLoader.js';\n\t\timport { DRACOLoader } from 't3d/addons/loaders/DRACOLoader.js';\n\t\timport { OctahedralTextureGenerator } from 't3d/addons/impostor/OctahedralTextureGenerator.js';\n\t\timport { OctahedralImpostor } from 't3d/addons/impostor/OctahedralImpostor.js';\n\t\timport { GUI } from './libs/lil-gui.esm.min.js';\n\n\t\tlet width = window.innerWidth || 2;\n\t\tlet height = window.innerHeight || 2;\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = width;\n\t\tcanvas.height = height;\n\t\tdocument.body.appendChild(canvas);\n\n\t\tconst screenRenderTarget = new t3d.ScreenRenderTarget(canvas);\n\t\tconst contextParams = { antialias: true, alpha: false };\n\t\tconst gl = canvas.getContext('webgl2', contextParams);\n\t\tconst renderer = new t3d.WebGLRenderer(gl);\n\n\t\tconst scene = new t3d.Scene();\n\t\tscene.fog = new t3d.Fog(0x000000, 1, 500);\n\n\t\tconst camera = new t3d.Camera();\n\t\tcamera.outputEncoding = t3d.TEXEL_ENCODING_TYPE.SRGB;\n\t\tcamera.lookAt(new t3d.Vector3(0, 0, 0), new t3d.Vector3(0, 1, 0));\n\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 1000);\n\t\tcamera.position.set(-8, 8, 15);\n\t\tscene.add(camera);\n\t\t\n\t\tconst controller = new OrbitControls(camera, canvas);\n\n\t\tconst ambientLight = new t3d.AmbientLight(0xffffff, 0.5);\n\t\tscene.add(ambientLight);\n\n\t\tconst directionalLight = new t3d.DirectionalLight(0xffffff, 1);\n\t\tdirectionalLight.position.set(5, 4, 3);\n\t\tdirectionalLight.lookAt(new t3d.Vector3(0, 0, 0), new t3d.Vector3(0, 1, 0));\n\t\tscene.add(directionalLight);\n\n\t\tconst spritesPerSide = 16;\n\t\tconst octahedralTextureGenerator = new OctahedralTextureGenerator(4096, spritesPerSide);\n\t\t\n\t\tconst loader = new GLTFLoader();\n\t\tconst dracoLoader = new DRACOLoader();\n\t\tdracoLoader.setDecoderPath('libs/draco/');\n\t\tloader.setDRACOLoader(dracoLoader);\n\t\tloader.load(\n\t\t\t'./resources/models/gltf/sea_shell.glb'\n\t\t).then(function(result) {\n\t\t\tconst root = result.root;\n\t\t\troot.scale.set(30, 30, 30);\n\t\t\n\t\t\tconst { transform, albedoTexture, infoTexture } = octahedralTextureGenerator.render(renderer, root);\n\n\t\t\tconst impostor = new OctahedralImpostor();\n\t\t\timpostor.material.diffuseMap = albedoTexture;\n\t\t\timpostor.material.normalMap = infoTexture;\n\t\t\timpostor.material.uniforms.spritesPerSide = spritesPerSide;\n\t\t\ttransform.toArray(impostor.material.uniforms.impostorTransform);\n\t\t\timpostor.position.set(-1.5, 0, 0);\n\t\t\tscene.add(impostor);\n\t\t\n\t\t\troot.position.set(1.5, 0, 0);\n\t\t\tscene.add(root);\n\n\t\t\tconst debugPlane = new t3d.Mesh(\n\t\t\t\tnew t3d.PlaneGeometry(4, 4),\n\t\t\t\tnew t3d.BasicMaterial()\n\t\t\t);\n\t\t\tdebugPlane.material.diffuseMap = albedoTexture;\n\t\t\tdebugPlane.position.y = -0.8;\n\t\t\tdebugPlane.scale.set(2, 1, 2);\n\t\t\tscene.add(debugPlane);\n\n\t\t\tconst gui = new GUI();\n\t\t\tgui.add(impostor.material.uniforms, 'octahedralWeightSharpness', 1, 10, 0.01);\n\t\t}).catch(e => console.error(e));\n\t\t\n\t\tfunction loop(count) {\n\t\t\trequestAnimationFrame(loop);\n\t\t\n\t\t\tcontroller.update();\n\n\t\t\tscene.updateMatrix();\n\t\t\tscene.updateRenderStates(camera);\n\t\t\tscene.updateRenderQueue(camera);\n\n\t\t\trenderer.renderScene(scene, camera, screenRenderTarget);\n\t\t}\n\t\trequestAnimationFrame(loop);\n\n\t\tfunction onWindowResize() {\n\t\t\twidth = window.innerWidth || 2;\n\t\t\theight = window.innerHeight || 2;\n\n\t\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 1000);\n\n\t\t\tscreenRenderTarget.resize(width, height);\n\t\t}\n\t\twindow.addEventListener('resize', onWindowResize, false);\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "examples/lab_impostor_octahedral_instancing.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>t3d - octahedral impostor instancing</title>\n\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n\t<link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n</head>\n<body>\n    <div id=\"info\">\n        <a href=\"\" target=\"_blank\">t3d</a> - octahedral impostor instancing (200k)\n    </div>\n\n\t<!-- Import maps polyfill -->\n    <!-- Remove this when import maps will be widely supported -->\n    <script async src=\"./libs/es-module-shims.js\"></script>\n\n    <script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n    <script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { OrbitControls } from 't3d/addons/controls/OrbitControls.js';\n\t\timport { Terrain } from 't3d/addons/objects/Terrain.js';\n\t\timport { LightShadowAdapter } from 't3d/addons/lights/LightShadowAdapter.js';\n\t\timport { Texture2DLoader } from 't3d/addons/loaders/Texture2DLoader.js';\n\t\timport { GLTFLoader } from 't3d/addons/loaders/glTF/GLTFLoader.js';\n\t\timport { OctahedralTextureGenerator } from 't3d/addons/impostor/OctahedralTextureGenerator.js';\n\t\timport { OctahedralImpostor, OctahedralImpostorDepthMaterial } from 't3d/addons/impostor/OctahedralImpostor.js';\n\t\timport { GUI } from './libs/lil-gui.esm.min.js';\n\n\t\tlet width = window.innerWidth || 2;\n\t\tlet height = window.innerHeight || 2;\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = width;\n\t\tcanvas.height = height;\n\t\tdocument.body.appendChild(canvas);\n\n\t\tconst screenRenderTarget = new t3d.ScreenRenderTarget(canvas);\n\t\tconst contextParams = { antialias: true, alpha: false };\n\t\tconst gl = canvas.getContext('webgl2', contextParams);\n\t\tconst renderer = new t3d.WebGLRenderer(gl);\n\n\t\tconst shadowMapPass = new t3d.ShadowMapPass(renderer);\n\n\t\tconst scene = new t3d.Scene();\n\t\tscene.fog = new t3d.Fog(0x000000, 10, 2000);\n\n\t\tconst camera = new t3d.Camera();\n\t\tcamera.outputEncoding = t3d.TEXEL_ENCODING_TYPE.SRGB;\n\t\tcamera.lookAt(new t3d.Vector3(0, 0, 0), new t3d.Vector3(0, 1, 0));\n\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 5000);\n\t\tcamera.position.set(0, 30, 100);\n\t\tscene.add(camera);\n\n\t\tconst controller = new OrbitControls(camera, canvas);\n\n\t\tconst ambientLight = new t3d.AmbientLight(0xffffff, 0.2);\n\t\tscene.add(ambientLight);\n\n\t\tconst directionalLight = new t3d.DirectionalLight(0xffffff, 0.5);\n\t\tdirectionalLight.castShadow = true;\n\t\tdirectionalLight.shadow.mapSize.set(2048, 2048);\n\t\tdirectionalLight.shadow.bias = -0.0001;\n\t\tdirectionalLight.shadow.normalBias = 0.0;\n\t\tdirectionalLight.shadow.frustumEdgeFalloff = -0.5;\n\t\tscene.add(directionalLight);\n\n\t\tconst shadowAdapter = new LightShadowAdapter(directionalLight);\n\t\tshadowAdapter.bindCameraDistance = 400;\n\t\tshadowAdapter.bindCamera = camera;\n\n\t\t// Terrain\n\n\t\tconst heightmapImage = new Image();\n\t\theightmapImage.src = './resources/terrain/heightmap.png';\n\t\tconst texture2DLoader = new Texture2DLoader();\n\t\tconst snow = texture2DLoader.load('./resources/terrain/snow.jpg');\n\t\tconst grass = texture2DLoader.load('./resources/terrain/grass.jpg');\n\t\tconst sand = texture2DLoader.load('./resources/terrain/sand.jpg');\n\t\tconst stone = texture2DLoader.load('./resources/terrain/stone.jpg');\n\n\t\theightmapImage.onload = function() {\n\t\t\tconst terrain = new Terrain({\n\t\t\t\twidth: 1024,\n\t\t\t\theight: 1024,\n\t\t\t\theightmap: heightmapImage,\n\t\t\t\tmaxHeight: 100,\n\t\t\t\tminHeight: -100\n\t\t\t});\n\t\t\tshadowAdapter.bindBox.fromBox3(terrain.geometry.boundingBox);\n\t\t\tterrain.material.uniforms.texture_0 = sand;\n\t\t\tterrain.material.uniforms.texture_1 = grass;\n\t\t\tterrain.material.uniforms.texture_2 = stone;\n\t\t\tterrain.material.uniforms.texture_3 = snow;\n\t\t\tterrain.material.uniforms.texture_4 = stone;\n\t\t\tterrain.receiveShadow = true;\n\n\t\t\tbuildTree(terrain);\n\t\t\tscene.add(terrain);\n\t\t\tloadGltf();\n\t\t};\n\n\t\t// Trees\n\n\t\tconst maxInstanceCount = 200000;\n\n\t\tconst worldMatrices = [];\n\t\tfunction buildTree(terrain) {\n\t\t\tconst position = new t3d.Vector3();\n\t\t\tconst orientation = new t3d.Quaternion();\n\t\t\tconst scale = new t3d.Vector3(0.5, 0.5, 0.5);\n\t\t\tconst matrix = new t3d.Matrix4();\n\t\t\tfor (let i = 0; i < maxInstanceCount; i++) {\n\t\t\t\tconst x = Math.random() * 1023 - 512;\n\t\t\t\tconst z = Math.random() * 1023 - 512;\n\t\t\t\tconst y = terrain.getHeightAt(x, z);\n\n\t\t\t\tconst scaleRange = 0.2 + Math.random() * 0.5;\n\t\t\t\tscale.set(scaleRange, scaleRange, scaleRange);\n\n\t\t\t\tposition.x = x;\n\t\t\t\tposition.y = y;\n\t\t\t\tposition.z = z;\n\n\t\t\t\tmatrix.compose(position, orientation, scale);\n\t\t\t\tmatrix.toArray(worldMatrices, i * 16);\n\t\t\t}\n\t\t}\n\t\t\n\t\tfunction loadGltf() {\n\t\t\tconst loader = new GLTFLoader();\n\t\t\tloader.load(\n\t\t\t\t'./resources/models/gltf/tree.glb'\n\t\t\t).then(function(result) {\n\t\t\t\tconst octahedralTextureGenerator = new OctahedralTextureGenerator(4096 * 2, 16);\n\n\t\t\t\tconst { transform, albedoTexture, infoTexture } = octahedralTextureGenerator.render(renderer, result.root);\n\n\t\t\t\tconst impostor = new OctahedralImpostor();\n\t\t\t\timpostor.castShadow = true;\n\t\t\t\timpostor.geometry.instanceCount = maxInstanceCount;\n\n\t\t\t\timpostor.material.defines.USE_INSTANCING = true;\n\t\t\t\timpostor.material.diffuseMap = albedoTexture;\n\t\t\t\timpostor.material.normalMap = infoTexture;\n\t\t\t\timpostor.material.uniforms.spritesPerSide = 16;\n\t\t\t\ttransform.toArray(impostor.material.uniforms.impostorTransform);\n\n\t\t\t\tconst instanceMatrixAttribute = new t3d.Attribute(new t3d.Buffer(new Float32Array(worldMatrices), 16));\n\t\t\t\tinstanceMatrixAttribute.divisor = 1;\n\n\t\t\t\timpostor.geometry.addAttribute('instanceMatrix', instanceMatrixAttribute);\n\t\t\n\t\t\t\tscene.add(impostor);\n\t\t\t}).catch(e => console.error(e));\n\t\t}\n\n\t\tconst params = { phi: 42, theta: 100 };\n\n\t\tfunction updateLightDirection() {\n\t\t\tshadowAdapter.direction.setFromSphericalAngles(params.phi / 180 * Math.PI, params.theta / 180 * Math.PI);\n\t\t}\n\t\tupdateLightDirection();\n\t\t\n\t\tconst gui = new GUI();\n\n\t\tconst lightFolder = gui.addFolder('Light').onChange(updateLightDirection);\n\t\tlightFolder.add(params, 'phi', 0.1, 90, 0.1);\n\t\tlightFolder.add(params, 'theta', 0, 360, 0.1);\n\n\t\tfunction loop(count) {\n\t\t\trequestAnimationFrame(loop);\n\n\t\t\tcontroller.update();\n\t\t\n\t\t\tcamera.updateMatrix();\n\t\t\tshadowAdapter.update();\n\t\t\n\t\t\tscene.updateMatrix();\n\t\t\tscene.updateRenderStates(camera);\n\t\t\tscene.updateRenderQueue(camera);\n\t\t\n\t\t\tshadowMapPass.render(renderer, scene);\n\n\t\t\trenderer.renderScene(scene, camera, screenRenderTarget);\n\t\t}\n\t\trequestAnimationFrame(loop);\n\n\t\tfunction onWindowResize() {\n\t\t\twidth = window.innerWidth || 2;\n\t\t\theight = window.innerHeight || 2;\n\n\t\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 5000);\n\n\t\t\tscreenRenderTarget.resize(width, height);\n\t\t}\n\t\twindow.addEventListener('resize', onWindowResize, false);\n\n\t\tconst depthMaterials = [];\n\n\t\tshadowMapPass.getDepthMaterial = function(renderable) {\n\t\t\tconst useSkinning = !!renderable.object.skeleton;\n\t\t\tconst useMorphing = renderable.geometry.morphAttributes.position && renderable.geometry.morphAttributes.position.length > 0;\n\t\t\tconst useInstancing = renderable.material.defines.USE_INSTANCING;\n\t\t\tconst index = useMorphing << 0 | useSkinning << 1 | useInstancing << 2;\n\n\t\t\tlet material = depthMaterials[index];\n\t\t\tif (material === undefined) {\n\t\t\t\tmaterial = useInstancing ? new OctahedralImpostorDepthMaterial() : new t3d.DepthMaterial();\n\t\t\t\tif (useInstancing) {\n\t\t\t\t\tmaterial.uniforms.impostorTransform = renderable.material.uniforms.impostorTransform;\n\t\t\t\t\tmaterial.defines.USE_INSTANCING = true;\n\t\t\t\t\tmaterial.uniforms.spritesPerSide = renderable.material.uniforms.spritesPerSide;\n\t\t\t\t\tmaterial.diffuseMap = renderable.material.diffuseMap;\n\t\t\t\t}\n\t\t\t}\n\t\t\tdepthMaterials[index] = material;\n\n\t\t\treturn material;\n\t\t};\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "examples/lab_linechart_fill.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>t3d - linechart fill</title>\n\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n\t<link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n\t<style>\n\t\t.atlas {\n\t\t\tposition: fixed;\n\t\t\tleft: 0;\n\t\t\ttop: 0;\n\t\t\tz-index: 1000;\n\t\t\tbackground: #eeeeee;\n\t\t\twidth: 200px;\n\t\t\theight: 200px;\n\t\t}\n\t</style>\n</head>\n<body>\n    <div id=\"info\">\n        <a href=\"\" target=\"_blank\">t3d</a> - linechart fill\n\t\t<br/>Available only for WebGL 2.0\n\t\t<div id=\"notSupported\" style=\"display:none\">Sorry, your graphics card + browser does not support WebGL2</div>\n    </div>\n\n\t<!-- Import maps polyfill -->\n    <!-- Remove this when import maps will be widely supported -->\n    <script async src=\"./libs/es-module-shims.js\"></script>\n    <script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n    <script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { OrbitControls } from 't3d/addons/controls/OrbitControls.js';\n\t\timport { ForwardRenderer } from 't3d/addons/render/ForwardRenderer.js';\n\t\timport { Texture2DLoader } from 't3d/addons/loaders/Texture2DLoader.js';\n\t\timport { GridHelper } from 't3d/addons/objects/GridHelper.js';\n\t\timport { InstancedLine } from 't3d/addons/objects/InstancedLine.js';\n\t\timport { ColorGradient } from 't3d/addons/math/ColorGradient.js';\n\t\timport { GradientTextureGenerator } from 't3d/addons/textures/GradientTextureGenerator.js';\n\t\timport { LineChartFillMesh } from 't3d/addons/objects/LineChartFillMesh.js';\n\t\timport { CurvePath3 } from 't3d/addons/math/curves/Curves.js';\n\t\timport TWEEN from './libs/tween.module.js';\n\t\timport { GUI } from './libs/lil-gui.esm.min.js';\n\n\t\tlet width = window.innerWidth || 2;\n\t\tlet height = window.innerHeight || 2;\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = width * window.devicePixelRatio;\n\t\tcanvas.height = height * window.devicePixelRatio;\n\t\tcanvas.style.width = width + 'px';\n\t\tcanvas.style.height = height + 'px';\n\t\tdocument.body.appendChild(canvas);\n\n\t\tconst forwardRenderer = new ForwardRenderer(canvas);\n\t\tforwardRenderer.screenRenderTarget.setColorClearValue(0.2, 0.2, 0.2, 1);\n\n\t\tconst scene = new t3d.Scene();\n\n\t\tconst grid = new GridHelper(100, 20, 0x666666, 0x555555);\n\t\tscene.add(grid);\n\n\t\tconst camera = new t3d.Camera();\n\t\tcamera.position.set(0, 50, 110);\n\t\tcamera.lookAt(new t3d.Vector3(0, 0, 0), new t3d.Vector3(0, 0, 1));\n\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 5000);\n\t\tscene.add(camera);\n\n\t\tconst controller = new OrbitControls(camera, canvas);\n\n\t\t// textures\n\n\t\tconst colorTexture = new Texture2DLoader().load('./resources/platte.png');\n\n\t\tconst alphaGradient = new ColorGradient()\n\t\t\t.addColorStop(0.0, new t3d.Color3(0, 0, 0))\n\t\t\t.addColorStop(0.5, new t3d.Color3(0.8, 0.8, 0.8))\n\t\t\t.addColorStop(1.0, new t3d.Color3(1, 1, 1));\n\t\tconst alphaTexture = new GradientTextureGenerator()\n\t\t\t.gradient(alphaGradient)\n\t\t\t.getTexture();\n\n\t\t// data\n\n\t\tconst maxHeight = 15;\n\n\t\tconst basePath = [];\n\t\tconst values = [];\n\n\t\tfor (let i = 0; i < 100; i++) {\n\t\t\tbasePath.push(new t3d.Vector3(i - 50, 0, Math.sin(i / 5) * 10));\n\t\t}\n\n\t\trandomValues();\n\n\t\tfunction randomValues() {\n\t\t\tfor (let i = 0; i < 100; i++) {\n\t\t\t\tvalues[i] = 0.1 + Math.random() * 0.9;\n\t\t\t}\n\t\t}\n\n\t\t// helper path to map 2D points to 3D\n\t\tconst baseCurvePath = new CurvePath3();\n\t\tbaseCurvePath.setPolylines(basePath);\n\t\tconst basePathTotalLength = baseCurvePath.getLength();\n\n\t\t// meshes\n\n\t\tconst container = new t3d.Object3D();\n\t\tscene.add(container);\n\n\t\tconst tweenGroup = new TWEEN.Group();\n\n\t\tfunction fadeIn() {\n\t\t\tcontainer.scale.y = 0;\n\n\t\t\tif (container.__tween && container.__tween.isPlaying) {\n\t\t\t\tcontainer.__tween.stop();\n\t\t\t}\n\n\t\t\tcontainer.__tween = new TWEEN.Tween(container.scale, tweenGroup)\n\t\t\t\t.to({ y: 1 }, 800)\n\t\t\t\t.easing(TWEEN.Easing.Quadratic.Out)\n\t\t\t\t.start();\n\t\t}\n\n\t\tconst fillMesh = new LineChartFillMesh();\n\t\tfillMesh.setPositionAndValue(basePath, values, { smooth: 0.3, height: maxHeight });\n\t\tfillMesh.material.depthWrite = false;\n\t\tfillMesh.material.opacity = 0.8;\n\t\tfillMesh.material.diffuseMap = colorTexture;\n\t\tfillMesh.material.alphaMap = alphaTexture;\n\t\tcontainer.add(fillMesh);\n\n\t\tlet lines0, lines1;\n\n\t\tfunction createChartLines() {\n\t\t\tdestroyLines(lines0);\n\t\t\tdestroyLines(lines1);\n\n\t\t\tconst topPath = fillMesh.curvePath.getPoints(8).map(point => {\n\t\t\t\tconst x = point.x * maxHeight;\n\t\t\t\tconst y = point.y * maxHeight;\n\n\t\t\t\tconst t = x / basePathTotalLength;\n\n\t\t\t\tconst pos = baseCurvePath.getPoint(t);\n\t\t\t\tpos.y = y;\n\n\t\t\t\treturn pos;\n\t\t\t});\n\n\t\t\tlines0 = createLines(basePath);\n\t\t\tlines1 = createLines(topPath);\n\n\t\t\t// fix line uv to match values\n\t\t\tfixLineUV(lines0, values);\n\t\t\tfixLineUV(lines1, topPath.map(v => v.y / maxHeight));\n\t\t}\n\n\t\tfunction fixLineUV(lines, path) {\n\t\t\tconst array = lines.geometry.attributes.instanceNextDist.buffer.array;\n\t\t\tfor (let i = 0; i < array.length - 8; i += 4) {\n\t\t\t\tarray[i + 4 + 3] = path[i / 4];\n\t\t\t}\n\t\t\tlines.geometry.attributes.instanceNextDist.buffer.version++;\n\t\t}\n\n\t\tfunction createLines(points) {\n\t\t\tconst lines = new InstancedLine();\n\t\t\tlines.geometry.setFromPoints(points);\n\t\t\tlines.material.uniforms.lineWidth = 2.2;\n\t\t\tlines.material.defines.SWAP_UV = true;\n\t\t\tlines.material.diffuseMap = colorTexture;\n\t\t\tlines.material.transparent = true;\n\t\t\tlines.renderOrder = -1;\n\t\t\tcontainer.add(lines);\n\n\t\t\treturn lines;\n\t\t}\n\n\t\tfunction destroyLines(lines) {\n\t\t\tif (lines) {\n\t\t\t\tlines.geometry.dispose();\n\t\t\t\tlines.material.dispose();\n\t\t\t\tcontainer.remove(lines);\n\t\t\t}\n\t\t}\n\n\t\tcreateChartLines();\n\t\tfadeIn();\n\n\t\t// gui\n\n\t\tconst gui = new GUI();\n\t\tgui.add(fillMesh.material.defines, 'UV_TYPE', [0, 1]).name('UV Type').onChange(() => {\n\t\t\tfillMesh.material.needsUpdate = true;\n\t\t});\n\t\tgui.add({ smooth: 0.3 }, 'smooth', 0, 0.5, 0.01).onChange(value => {\n\t\t\tfillMesh.setPositionAndValue(basePath, values, { smooth: value, height: maxHeight });\n\t\t\tcreateChartLines();\n\t\t});\n\t\tgui.add(fillMesh.material, 'opacity', 0.0, 1.0, 0.01).name('opacity');\n\t\tgui.add({ alphaMap: true }, 'alphaMap').onChange(value => {\n\t\t\tfillMesh.material.alphaMap = value ? alphaTexture : null;\n\t\t\tfillMesh.material.needsUpdate = true;\n\t\t});\n\n\t\tgui.add({ randomValues: () => {\n\t\t\trandomValues();\n\t\t\tfillMesh.setPositionAndValue(basePath, values, { smooth: 0.3, height: maxHeight });\n\t\t\tcreateChartLines();\n\t\t\tfadeIn();\n\t\t} }, 'randomValues').name('Random Values');\n\n\t\t//\n\t\t\n\t\tfunction loop(count) {\n\t\t\trequestAnimationFrame(loop);\n\n\t\t\tcontroller.update();\n\t\t\ttweenGroup.update();\n\n\t\t\tforwardRenderer.render(scene, camera);\n\t\t}\n\t\t\n\t\tif (forwardRenderer.capabilities.version < 2) {\n\t\t\tdocument.getElementById('notSupported').style.display = '';\n\t\t} else {\n\t\t\trequestAnimationFrame(loop);\n\t\t}\n\n\t\tfunction onWindowResize() {\n\t\t\twidth = window.innerWidth || 2;\n\t\t\theight = window.innerHeight || 2;\n\n\t\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 5000);\n\n\t\t\tforwardRenderer.screenRenderTarget.resize(width * window.devicePixelRatio, height * window.devicePixelRatio);\n\n\t\t\tcanvas.style.width = width + 'px';\n\t\t\tcanvas.style.height = height + 'px';\n\t\t}\n\t\twindow.addEventListener('resize', onWindowResize, false);\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "examples/lab_ocean.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>t3d - ocean</title>\n\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n\t<link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n</head>\n<body>\n    <div id=\"info\">\n        <a href=\"\" target=\"_blank\">t3d</a> - ocean\n\t</div>\n\n\t<!-- Import maps polyfill -->\n    <!-- Remove this when import maps will be widely supported -->\n    <script async src=\"./libs/es-module-shims.js\"></script>\n\n    <script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n    <script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { Water } from 't3d/addons/objects/Water.js';\n\t\timport { Sky } from 't3d/addons/objects/Sky.js';\n\t\timport { SkyBox } from 't3d/addons/objects/SkyBox.js';\n\t\timport { OrbitControls } from 't3d/addons/controls/OrbitControls.js';\n\t\timport { ForwardRenderer } from 't3d/addons/render/ForwardRenderer.js';\n\t\timport { Texture2DLoader } from 't3d/addons/loaders/Texture2DLoader.js';\n\t\timport { ReflectionProbe } from 't3d/addons/probes/ReflectionProbe.js';\n\t\timport { GUI } from './libs/lil-gui.esm.min.js';\n\t\t\n\t\tconst devicePixelRatio = window.devicePixelRatio;\n\n\t\tlet width = window.innerWidth || 2;\n\t\tlet height = window.innerHeight || 2;\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = devicePixelRatio * width;\n\t\tcanvas.height = devicePixelRatio * height;\n\t\tcanvas.style.width = width + 'px';\n\t\tcanvas.style.height = height + 'px';\n\t\tdocument.body.appendChild(canvas);\n\n\t\tconst forwardRenderer = new ForwardRenderer(canvas);\n\t\tforwardRenderer.matrixAutoUpdate = false;\n\t\tforwardRenderer.renderStatesAutoUpdate = false;\n\t\tforwardRenderer.renderQueueAutoUpdate = false;\n\n\t\t// Sky\n\n\t\tconst reflectionProbe = new ReflectionProbe();\n\n\t\tconst skyScene = new t3d.Scene();\n\t\tconst sky = new Sky();\n\t\tskyScene.add(sky);\n\n\t\t// Scene\n\n\t\tconst scene = new t3d.Scene();\n\n\t\tconst light = new t3d.DirectionalLight(0xffffff);\n\t\tlight.color.setHex(0xffffff);\n\t\tscene.add(light);\n\n\t\t// Sphere\n\n\t\tconst geometry = new t3d.SphereGeometry(20, 8, 8);\n\t\tconst material = new t3d.PBRMaterial();\n\t\tmaterial.shading = t3d.SHADING_TYPE.FLAT_SHADING;\n\t\tmaterial.envMap = reflectionProbe.renderTexture;\n\t\tmaterial.envMapIntensity = 0.5;\n\t\tmaterial.side = t3d.DRAW_SIDE.DOUBLE; // fix white edge between sphere and water\n\t\tconst sphere = new t3d.Mesh(geometry, material);\n\t\tscene.add(sphere);\n\n\t\t// Water\n\n\t\tconst waterGeometry = new t3d.PlaneGeometry(10000, 10000);\n\t\tconst waterNormalTexture = new Texture2DLoader().load('./resources/waternormals.jpg');\n\t\twaterNormalTexture.wrapS = t3d.TEXTURE_WRAP.REPEAT;\n\t\twaterNormalTexture.wrapT = t3d.TEXTURE_WRAP.REPEAT;\n\n\t\tconst water = new Water(\n\t\t\twaterGeometry,\n\t\t\t{\n\t\t\t\twaterNormals: waterNormalTexture,\n\t\t\t\talpha: 1.0,\n\t\t\t\tsunDirection: light.position.clone().normalize(),\n\t\t\t\tsunColor: 0xffffff,\n\t\t\t\twaterColor: 0x001e0f,\n\t\t\t\tdistortionScale: 3.7\n\t\t\t}\n\t\t);\n\n\t\tscene.add(water);\n\n\t\t// Camera\n\n\t\tconst camera = new t3d.Camera();\n\t\tcamera.position.set(0, 30, 100);\n\t\tcamera.setPerspective(55 / 180 * Math.PI, width / height, 1, 20000);\n\t\tscene.add(camera);\n\n\t\tconst skyBox = new SkyBox();\n\t\tskyBox.texture = reflectionProbe.renderTexture;\n\t\tscene.add(skyBox);\n\n\t\t// add a hover controller\n\n\t\tconst controller = new OrbitControls(camera, canvas);\n\t\tcontroller.minDistance = 40.0;\n\t\tcontroller.maxDistance = 200.0;\n\t\tcontroller.target.set(0, 10, 0);\n\t\tcontroller.maxPolarAngle = Math.PI * 0.495;\n\t\t\n\t\t// GUI\n\n\t\tconst effectController = {\n\t\t\tturbidity: 10,\n\t\t\trayleigh: 2,\n\t\t\tmieCoefficient: 0.005,\n\t\t\tmieDirectionalG: 0.8,\n\t\t\tluminance: 1,\n\t\t\televation: 2,\n\t\t\tazimuth: 180\n\t\t};\n\n\t\tconst distance = 400;\n\n\t\tconst sun = new t3d.Vector3();\n\t\tconst sunSpherical = new t3d.Spherical();\n\n\t\tfunction skyChanged() {\n\t\t\tconst uniforms = sky.material.uniforms;\n\t\t\tuniforms.turbidity = effectController.turbidity;\n\t\t\tuniforms.rayleigh = effectController.rayleigh;\n\t\t\tuniforms.luminance = effectController.luminance;\n\t\t\tuniforms.mieCoefficient = effectController.mieCoefficient;\n\t\t\tuniforms.mieDirectionalG = effectController.mieDirectionalG;\n\n\t\t\tconst phi = Math.PI / 180 * (90 - effectController.elevation);\n\t\t\tconst theta = Math.PI / 180 * effectController.azimuth;\n\n\t\t\tsunSpherical.set(1, phi, theta);\n\t\t\tsun.setFromSpherical(sunSpherical);\n\n\t\t\tsun.toArray(uniforms.sunPosition);\n\t\t\tsun.toArray(water.material.uniforms['sunDirection']);\n\n\t\t\tlight.position.copy(sun).multiplyScalar(distance);\n\t\t\tlight.lookAt(new t3d.Vector3(0, 0, 0), new t3d.Vector3(0, 1, 0));\n\n\t\t\tskyScene.updateRenderStates(camera);\n\t\t\tskyScene.updateRenderQueue(camera);\n\n\t\t\treflectionProbe.render(forwardRenderer, skyScene);\n\t\t}\n\n\t\tconst gui = new GUI();\n\n\t\tconst skyFolder = gui.addFolder('Sky');\n\t\tskyFolder.add(effectController, 'elevation', 0, 90, 0.1).onChange(skyChanged);\n\t\tskyFolder.add(effectController, 'azimuth', -180, 180, 0.1).onChange(skyChanged);\n\n\t\tconst uniforms = water.material.uniforms;\n\n\t\tconst waterFolder = gui.addFolder('Water');\n\t\twaterFolder.add(uniforms, 'distortionScale', 0, 8, 0.1);\n\t\twaterFolder.add(uniforms, 'size', 0.1, 10, 0.1);\n\t\twaterFolder.add(uniforms, 'alpha', 0.9, 1, .001);\n\n\t\tskyChanged();\n\n\t\tfunction loop(timestamp) {\n\t\t\trequestAnimationFrame(loop);\n\n\t\t\tconst time = timestamp * 0.001;\n\n\t\t\tsphere.position.y = Math.sin(time) * 20 + 5;\n\t\t\tsphere.euler.x = time * 0.5;\n\t\t\tsphere.euler.z = time * 0.51;\n\n\t\t\twater.material.uniforms['time'] += 1.0 / 60.0;\n\n\t\t\tcontroller.update();\n\n\t\t\tscene.updateMatrix();\n\t\t\tscene.updateRenderStates(camera);\n\t\t\tscene.updateRenderQueue(camera);\n\n\t\t\twater.updateReflect(forwardRenderer, scene, camera);\n\n\t\t\tforwardRenderer.render(scene, camera);\n\t\t}\n\t\trequestAnimationFrame(loop);\n\n\t\tfunction onWindowResize() {\n\t\t\twidth = window.innerWidth || 2;\n\t\t\theight = window.innerHeight || 2;\n\n\t\t\tcamera.setPerspective(55 / 180 * Math.PI, width / height, 1, 20000);\n\n\t\t\tforwardRenderer.screenRenderTarget.resize(devicePixelRatio * width, devicePixelRatio * height);\n\n\t\t\tcanvas.style.width = width + 'px';\n\t\t\tcanvas.style.height = height + 'px';\n\t\t}\n\t\twindow.addEventListener('resize', onWindowResize, false);\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "examples/lab_ocean_fft.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n    <meta charset=\"utf-8\">\n    <title>t3d - fft ocean</title>\n    <meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n    <link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n</head>\n\n<body>\n    <div id=\"info\">\n        <a href=\"\" target=\"_blank\">t3d</a> - fft ocean, \n\t\treferrence to <a href=\"https://stackblitz.com/edit/fft-2d\" target=\"_blank\">\"Ocean generator\"</a><br />\n\t\t\"Lighthouse on Island\" model by <a href=\"https://sketchfab.com/spaceexpert\" target=\"_blank\">spaceexpert</a>\n\t\t(<a href=\"http://creativecommons.org/licenses/by/4.0/\" target=\"_blank\">CC BY 4.0</a>) - \n\t\tmodified: water surface removed<br/>\n\t\t<div id=\"notSupported\" style=\"display:none\">Sorry, your graphics card + browser does not support webgl2</div>\n    </div>\n\n\t<script src=\"./libs/nanobar.js\"></script>\n\n    <!-- Import maps polyfill -->\n    <!-- Remove this when import maps will be widely supported -->\n    <script async src=\"./libs/es-module-shims.js\"></script>\n\n    <script type='importmap'>\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n\t</script>\n\n    <script type='module'>\n\t\timport * as t3d from 't3d';\n\t\timport { ForwardRenderer } from 't3d/addons/render/ForwardRenderer.js';\n\t\timport { GBuffer } from 't3d/addons/GBuffer.js';\n\t\timport { GLTFLoader } from 't3d/addons/loaders/glTF/GLTFLoader.js';\n\t\timport { OrbitControls } from 't3d/addons/controls/OrbitControls.js';\n\t\timport { GeometryUtils } from 't3d/addons/geometries/GeometryUtils.js';\n\t\timport { OceanFieldBuilder, OceanMaterial } from 't3d/addons/ocean/index.js';\n\t\timport { Texture2DLoader } from 't3d/addons/loaders/Texture2DLoader.js';\n\t\timport { EnvTextureCubeLoader } from 't3d/addons/loaders/EnvLoader.js';\n\t\timport { SkyBox } from 't3d/addons/objects/SkyBox.js';\n\t\timport { GUI } from './libs/lil-gui.esm.min.js';\n\n\t\tlet width = window.innerWidth || 2;\n\t\tlet height = window.innerHeight || 2;\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = width;\n\t\tcanvas.height = height;\n\t\tdocument.body.appendChild(canvas);\n\n\t\tconst contextParams = { antialias: true, alpha: false };\n\t\tconst gl = canvas.getContext('webgl2', contextParams);\n\n\t\tif (!gl) {\n\t\t\tdocument.getElementById('notSupported').style.display = '';\n\t\t\tthrow new Error('Not supported webgl2 !');\n\t\t}\n\n\t\tconst forwardRenderer = new ForwardRenderer(canvas, gl);\n\t\tforwardRenderer.matrixAutoUpdate = false;\n\t\tforwardRenderer.renderStatesAutoUpdate = false;\n\t\tforwardRenderer.renderQueueAutoUpdate = false;\n\t\tconst gBuffer = new GBuffer(width, height);\n\t\tgBuffer.enableAlbedoMetalness = false;\n\n\t\tconst scene = new t3d.Scene();\n\n\t\tconst camera = new t3d.Camera();\n\t\tcamera.outputEncoding = t3d.TEXEL_ENCODING_TYPE.SRGB;\n\t\tcamera.position.set(-65, 12, 65);\n\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 0.1, 5000);\n\t\tscene.add(camera);\n\n\t\tconst controller = new OrbitControls(camera, canvas);\n\t\tcontroller.maxPolarAngle = Math.PI / 2 - 0.01;\n\n\t\tconst directionalLight = new t3d.DirectionalLight(0xffffff, 1);\n\t\tdirectionalLight.position.set(-77.31, 16.33, -61.28);\n\t\tdirectionalLight.lookAt(new t3d.Vector3(0, 0, 0), new t3d.Vector3(0, 1, 0));\n\t\tdirectionalLight.castShadow = true;\n\t\tdirectionalLight.shadow.windowSize = 30;\n\t\tdirectionalLight.shadow.mapSize.set(1024, 1024);\n\t\tdirectionalLight.shadow.bias = -0.0003;\n\t\tdirectionalLight.shadow.normalBias = 0.05;\n\t\tscene.add(directionalLight);\n\n\t\tconst nanobar = new Nanobar();\n\t\tnanobar.el.style.background = 'gray';\n\n\t\tconst loadingManager = new t3d.LoadingManager(function() {\n\t\t\tnanobar.go(100);\n\t\t\tnanobar.el.style.background = 'transparent';\n\t\t}, function(url, itemsLoaded, itemsTotal) {\n\t\t\tif (itemsLoaded < itemsTotal) {\n\t\t\t\tnanobar.go(itemsLoaded / itemsTotal * 100);\n\t\t\t}\n\t\t});\n\n\t\tconst envTextureLoader = new EnvTextureCubeLoader(loadingManager);\n\t\tenvTextureLoader.setRenderer(forwardRenderer);\n\t\tenvTextureLoader.loadAsync('./resources/hdr/Grand_Canyon_C.env').then(cubeTexture => {\n\t\t\tscene.environment = cubeTexture;\n\n\t\t\tconst skyBox = new SkyBox(cubeTexture);\n\t\t\tskyBox.gamma = true;\n\t\t\tskyBox.level = 4;\n\t\t\tscene.add(skyBox);\n\t\t});\n\n\t\tlet birdModel = null;\n\n\t\tnew GLTFLoader(loadingManager).load(\n\t\t\t'./resources/models/gltf/lighthouse.glb'\n\t\t).then(function(result) {\n\t\t\tconst object = result.root;\n\t\t\tbirdModel = object.children[0].children[0].children[0].children[4];\n\n\t\t\tobject.scale.set(50, 50, 50);\n\t\t\tobject.position.set(0, 6.5, 0);\n\n\t\t\tobject.traverse(node => {\n\t\t\t\tnode.castShadow = true;\n\t\t\t\tnode.receiveShadow = true;\n\t\t\t});\n\n\t\t\tscene.add(object);\n\t\t}).catch(e => console.error(e));\n\n\t\t// Create Ocean Field\n\n\t\tconst buildParams = {\n\t\t\tcascades: [\n\t\t\t\t{\n\t\t\t\t\tsize: 450.0,\n\t\t\t\t\tstrength: 0.8,\n\t\t\t\t\tcroppiness: -1.2,\n\t\t\t\t\tminWave: 0,\n\t\t\t\t\tmaxWave: 100\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tsize: 103.0,\n\t\t\t\t\tstrength: 0.8,\n\t\t\t\t\tcroppiness: -1.5,\n\t\t\t\t\tminWave: 0,\n\t\t\t\t\tmaxWave: 100\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tsize: 13,\n\t\t\t\t\tstrength: 0.9,\n\t\t\t\t\tcroppiness: -1.5,\n\t\t\t\t\tminWave: 0,\n\t\t\t\t\tmaxWave: 7\n\t\t\t\t}\n\t\t\t],\n\t\t\tresolution: 256,\n\t\t\twind: [5.0, 5.0],\n\t\t\talignment: 0.01,\n\t\t\trandomSeed: 0\n\t\t};\n\n\t\tconst oceanBuilder = new OceanFieldBuilder(forwardRenderer);\n\t\tconst oceanField = oceanBuilder.build(buildParams);\n\n\t\t// Create Ocean Mesh\n\n\t\tconst oceanGeometry = new t3d.PlaneGeometry(128, 128, 128, 128);\n\n\t\tconst oceanMaterial = new OceanMaterial();\n\t\toceanMaterial.setOceanField(oceanField);\n\n\t\toceanMaterial.uniforms['tDepth'] = gBuffer.getDepthTexture();\n\t\tnew Texture2DLoader().loadAsync('./resources/cloudNoise.png').then(texture => {\n\t\t\ttexture.wrapS = t3d.TEXTURE_WRAP.REPEAT;\n\t\t\ttexture.wrapT = t3d.TEXTURE_WRAP.REPEAT;\n\t\t\toceanMaterial.uniforms['tNoise'] = texture;\n\t\t});\n\n\t\tconst ocean = new t3d.Mesh(oceanGeometry, oceanMaterial);\n\t\tscene.add(ocean);\n\n\t\tconst wireframeOceanGeometry = new t3d.Geometry();\n\t\twireframeOceanGeometry.attributes = oceanGeometry.attributes;\n\t\twireframeOceanGeometry.morphAttributes = oceanGeometry.morphAttributes;\n\t\twireframeOceanGeometry.index = GeometryUtils.getWireframeAttribute(oceanGeometry);\n\t\twireframeOceanGeometry.boundingBox = oceanGeometry.boundingBox;\n\t\twireframeOceanGeometry.boundingSphere = oceanGeometry.boundingSphere;\n\n\t\t// GUI\n\n\t\tfunction shoreline(enable) {\n\t\t\toceanMaterial.defines.SHORELINE = enable;\n\t\t\toceanMaterial.transparent = enable;\n\t\t\toceanMaterial.needsUpdate = true;\n\t\t}\n\t\tshoreline(true);\n\n\t\tconst runtimeParams = { shoreline: true };\n\n\t\tconst gui = new GUI();\n\n\t\tconst windFolder = gui.addFolder('Wind').onChange(() => {\n\t\t\toceanBuilder.update(oceanField, buildParams);\n\t\t\toceanMaterial.setOceanField(oceanField);\n\t\t});\n\t\twindFolder.add(buildParams.wind, '0', 0, 31, 1).name('X');\n\t\twindFolder.add(buildParams.wind, '1', 0, 31, 1).name('Y');\n\n\t\tgui.add(oceanMaterial.uniforms, 'foamSpreading', 0, 2, 0.1).name('Foam spreading');\n\t\tgui.add(oceanMaterial.uniforms, 'foamContrast', 0, 8, 0.1).name('Foam contrast');\n\t\tgui.add(buildParams, 'alignment', 0, 4, 0.01).onChange(() => {\n\t\t\toceanBuilder.update(oceanField, buildParams);\n\t\t\toceanMaterial.setOceanField(oceanField);\n\t\t}).name('Alignment');\n\t\tgui.add(buildParams, 'randomSeed', 0, 1024, 1).onChange(() => {\n\t\t\toceanBuilder.update(oceanField, buildParams);\n\t\t\toceanMaterial.setOceanField(oceanField);\n\t\t}).name('Random seed');\n\n\t\tgui.add(runtimeParams, 'shoreline').onChange(shoreline);\n\n\t\tlet i = 0;\n\t\tfor (const cascade of buildParams.cascades) {\n\t\t\tconst cascadeFolder = gui.addFolder(`Cascade ${i}`).onChange(() => {\n\t\t\t\toceanBuilder.update(oceanField, buildParams);\n\t\t\t\toceanMaterial.setOceanField(oceanField);\n\t\t\t}).close();\n\t\t\ti++;\n\t\t\tcascadeFolder.add(cascade, 'size', 0, 1000, 1).name('Size');\n\t\t\tcascadeFolder.add(cascade, 'strength', 0, 10, 0.1).name('Strength');\n\t\t\tcascadeFolder.add(cascade, 'croppiness', -2, 2, 0.1).name('Croppiness');\n\t\t\tcascadeFolder.add(cascade, 'minWave', 0, 1000, 1).name('Min wave length');\n\t\t\tcascadeFolder.add(cascade, 'maxWave', 0, 1000, 1).name('Max wave length');\n\t\t}\n\n\t\tconst debugFolder = gui.addFolder('Debug').close();\n\t\tdebugFolder.add({ wireframe: false }, 'wireframe').onChange(v => {\n\t\t\tocean.geometry = v ? wireframeOceanGeometry : oceanGeometry;\n\t\t\toceanMaterial.drawMode = v ? t3d.DRAW_MODE.LINES : t3d.DRAW_MODE.TRIANGLES;\n\t\t});\n\n\t\t//\n\n\t\tfunction loop(timestamp) {\n\t\t\trequestAnimationFrame(loop);\n\t\t\n\t\t\tcontroller.update();\n\n\t\t\tscene.updateMatrix();\n\t\t\tscene.updateRenderStates(camera);\n\t\t\tscene.updateRenderQueue(camera);\n\n\t\t\tif (runtimeParams.shoreline) {\n\t\t\t\tgBuffer.update(forwardRenderer, scene, camera);\n\t\t\t}\n\t\t\n\t\t\toceanField.update(timestamp / 1000);\n\n\t\t\tif (birdModel) {\n\t\t\t\tbirdModel.euler.y = timestamp * 0.0005;\n\t\t\t}\n\n\t\t\tforwardRenderer.render(scene, camera);\n\t\t}\n\t\trequestAnimationFrame(loop);\n\n\t\tfunction onWindowResize() {\n\t\t\twidth = window.innerWidth || 2;\n\t\t\theight = window.innerHeight || 2;\n\t\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 0.1, 5000);\n\t\t\tforwardRenderer.screenRenderTarget.resize(width, height);\n\t\t}\n\t\twindow.addEventListener('resize', onWindowResize, false);\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "examples/lab_terrain.html",
    "content": "<!DOCTYPE html>\n<html>\n\n<head>\n    <meta charset=\"utf-8\">\n    <title>t3d - geometry heightMap terrain</title>\n    <meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n    <link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n</head>\n\n<body>\n    <div id=\"info\" class=\"dark\">\n        <a href=\"\" target=\"_blank\">t3d</a> - HeightMap Terrain\n\t\t<br/>\n\t\tClick: lock mouse to rotate; SPACE: jump; WASD: move\n    </div>\n\n    <script id=\"vertexShader\" type=\"x-shader/x-vertex\">\n\t\tattribute vec3 a_Position;\n\t\tattribute vec2 a_Uv;\n\t\tuniform mat4 u_ProjectionView;\n\t\tuniform mat4 u_Model;\n\n\t\tattribute mat4 instanceMatrix;\n\n\t\tvarying vec2 vUv;\n\n\t\tvoid main(){\n\t\t\tvUv = a_Uv;\n\t\t\tvec4 transformed = vec4(a_Position, 1.0);\n\t\t\ttransformed = instanceMatrix * transformed;\n\t\t\tgl_Position = u_ProjectionView * u_Model * transformed;\n\t\t}\n\t</script>\n\n    <script id=\"fragmentShader\" type=\"x-shader/x-fragment\">\n\t\tvarying vec2 vUv;\n\t\tuniform vec4 color;\n\t\t#ifdef USE_FOG\n\t\t\tuniform vec3 u_FogColor;\n\t\t\t#ifdef USE_EXP2_FOG\n\t\t\t\tuniform float u_FogDensity;\n\t\t\t#else\n\t\t\t\tuniform float u_FogNear;\n\t\t\t\tuniform float u_FogFar;\n\t\t\t#endif\n\t\t#endif\n\n\t\tvoid main() {\n\t\t\tgl_FragColor = color;\n\t\t\t#ifdef USE_FOG\n\t\t\t\tfloat depth = gl_FragCoord.z / gl_FragCoord.w;\n\n\t\t\t\t#ifdef USE_EXP2_FOG\n\t\t\t\t\tfloat fogFactor = 1.0 - exp(-u_FogDensity * u_FogDensity * depth * depth);\n\t\t\t\t#else\n\t\t\t\t\tfloat fogFactor = smoothstep(u_FogNear, u_FogFar, depth);\n\t\t\t\t#endif\n\n\t\t\t\tgl_FragColor.rgb = mix(gl_FragColor.rgb, u_FogColor, fogFactor);\n\t\t\t#endif\n\t\t}\n\t</script>\n\n    <!-- Import maps polyfill -->\n    <!-- Remove this when import maps will be widely supported -->\n    <script async src=\"./libs/es-module-shims.js\"></script>\n\n    <script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n    <script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { Terrain } from 't3d/addons/objects/Terrain.js';\n\t\timport { TextureCubeLoader } from 't3d/addons/loaders/TextureCubeLoader.js';\n\t\timport { SkyBox } from 't3d/addons/objects/SkyBox.js';\n\t\timport { ForwardRenderer } from 't3d/addons/render/ForwardRenderer.js';\n\t\timport { Texture2DLoader } from 't3d/addons/loaders/Texture2DLoader.js';\n\n\t\tlet width = window.innerWidth || 2;\n\t\tlet height = window.innerHeight || 2;\n\n\t\tlet controls;\n\t\tconst instances = 100;\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = width;\n\t\tcanvas.height = height;\n\t\tdocument.body.appendChild(canvas);\n\n\t\tconst forwardRenderer = new ForwardRenderer(canvas);\n\t\tforwardRenderer.screenRenderTarget.setColorClearValue(0.4, 0.9, 0.9, 1);\n\n\t\tconst scene = new t3d.Scene();\n\n\t\tscene.fog = new t3d.Fog(undefined, 10, 1200);\n\t\tscene.fog.color.setRGB(0.83, 0.78, 0.68);\n\n\t\tconst cubeTexturePath = './resources/skybox/skyboxsun25deg/';\n\t\tconst cubeTexture = new TextureCubeLoader().load([\n\t\t\tcubeTexturePath + 'px.jpg',\n\t\t\tcubeTexturePath + 'nx.jpg',\n\t\t\tcubeTexturePath + 'py.jpg',\n\t\t\tcubeTexturePath + 'ny.jpg',\n\t\t\tcubeTexturePath + 'pz.jpg',\n\t\t\tcubeTexturePath + 'nz.jpg'\n\t\t]);\n\n\t\tconst skyBox = new SkyBox(cubeTexture);\n\t\tscene.add(skyBox);\n\n\t\tconst texture2DLoader = new Texture2DLoader();\n\n\t\tconst snow = texture2DLoader.load('./resources/terrain/snow.jpg');\n\t\tconst grass = texture2DLoader.load('./resources/terrain/grass.jpg');\n\t\tconst sand = texture2DLoader.load('./resources/terrain/sand.jpg');\n\t\tconst stone = texture2DLoader.load('./resources/terrain/stone.jpg');\n\n\t\tconst heightmapImage = new Image();\n\t\theightmapImage.src = './resources/terrain/heightmap.png';\n\t\theightmapImage.onload = function() {\n\t\t\tconst terrain = new Terrain({\n\t\t\t\twidth: 1024,\n\t\t\t\theight: 1024,\n\t\t\t\theightmap: heightmapImage,\n\t\t\t\tmaxHeight: 100,\n\t\t\t\tminHeight: -100\n\t\t\t});\n\n\t\t\tterrain.material.uniforms.texture_0 = sand;\n\t\t\tterrain.material.uniforms.texture_1 = grass;\n\t\t\tterrain.material.uniforms.texture_2 = stone;\n\t\t\tterrain.material.uniforms.texture_3 = snow;\n\t\t\tterrain.material.uniforms.texture_4 = stone;\n\n\t\t\tscene.add(terrain);\n\n\t\t\t// build random position tree\n\t\t\tbuildTree(terrain);\n\n\t\t\tcontrols = new FirstPersonControls(canvas, camera, terrain);\n\t\t\tcontrols.rotation.y = Math.PI * 2 / 3;\n\n\t\t\tconst water = createWater();\n\t\t\tscene.add(water);\n\t\t};\n\n\t\tconst ambientLight = new t3d.AmbientLight(0xffffff, 0.5);\n\t\tscene.add(ambientLight);\n\n\t\tconst directionalLight = new t3d.DirectionalLight(0xffffff, 0.8);\n\t\tdirectionalLight.position.set(-10, 20, 30);\n\t\tdirectionalLight.lookAt(new t3d.Vector3(), new t3d.Vector3(0, 1, 0));\n\t\tdirectionalLight.castShadow = true;\n\t\tdirectionalLight.shadow.windowSize = 15;\n\t\tscene.add(directionalLight);\n\n\t\tconst camera = new t3d.Camera();\n\t\tcamera.position.set(450, 300, 370);\n\t\tcamera.lookAt(new t3d.Vector3(0, 0, 0), new t3d.Vector3(0, 1, 0));\n\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 10000);\n\t\tscene.add(camera);\n\n\t\tfunction createWater() {\n\t\t\tconst geo = new t3d.PlaneGeometry(1024, 1024, 16, 16);\n\t\t\tconst mat = new t3d.LambertMaterial();\n\t\t\tmat.diffuse.setHex(0x006ba0);\n\t\t\tmat.transparent = true;\n\t\t\tmat.opacity = 0.6;\n\n\t\t\tconst water = new t3d.Mesh(geo, mat);\n\n\t\t\twater.position.y = -67;\n\n\t\t\treturn water;\n\t\t}\n\n\t\tfunction buildTree(terrain) {\n\t\t\tconst chunkMat = [], bottomMat = [], midMat = [], topMat = [];\n\n\t\t\tconst position = new t3d.Vector3();\n\t\t\tconst orientation = new t3d.Quaternion();\n\t\t\tconst scale = new t3d.Vector3(0.5, 0.5, 0.5);\n\t\t\tconst matrix = new t3d.Matrix4();\n\n\t\t\tconst chunkMaterial = new t3d.ShaderMaterial({\n\t\t\t\tvertexShader: document.getElementById('vertexShader').textContent,\n\t\t\t\tfragmentShader: document.getElementById('fragmentShader').textContent,\n\t\t\t\tuniforms: {\n\t\t\t\t\tcolor: [0.24, 0.15, 0.09, 1]\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tconst treeMaterial = new t3d.ShaderMaterial({\n\t\t\t\tvertexShader: document.getElementById('vertexShader').textContent,\n\t\t\t\tfragmentShader: document.getElementById('fragmentShader').textContent,\n\t\t\t\tuniforms: {\n\t\t\t\t\tcolor: [0.176, 0.298, 0.117, 1]\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tfor (let i = 0; i < instances; i++) {\n\t\t\t\tconst x = Math.random() * 1023 - 512;\n\t\t\t\tconst z = Math.random() * 1023 - 512;\n\n\t\t\t\tconst y = terrain.getHeightAt(x, z);\n\n\t\t\t\tif (y < -67) { // water\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tposition.x = x;\n\t\t\t\tposition.y = y + 3;\n\t\t\t\tposition.z = z;\n\n\t\t\t\tmatrix.compose(position, orientation, scale);\n\t\t\t\tmatrix.toArray(chunkMat, i * 16);\n\n\t\t\t\tposition.y = y + 9;\n\n\t\t\t\tmatrix.compose(position, orientation, scale);\n\t\t\t\tmatrix.toArray(bottomMat, i * 16);\n\n\t\t\t\tposition.y = y + 12.5;\n\n\t\t\t\tmatrix.compose(position, orientation, scale);\n\t\t\t\tmatrix.toArray(midMat, i * 16);\n\n\t\t\t\tposition.y = y + 16;\n\n\t\t\t\tmatrix.compose(position, orientation, scale);\n\t\t\t\tmatrix.toArray(topMat, i * 16);\n\t\t\t}\n\n\t\t\tconst chunkGeometry = new t3d.CylinderGeometry(2, 2, 12, 6, 1, true);\n\t\t\tconst bottomTreeGeometry = new t3d.CylinderGeometry(0, 10, 14, 8);\n\t\t\tconst midTreeGeometry = new t3d.CylinderGeometry(0, 9, 13, 8);\n\t\t\tconst topTreeGeometry = new t3d.CylinderGeometry(0, 8, 12, 8);\n\n\t\t\tconst chunk = createInstanceMesh(chunkGeometry, chunkMat, chunkMaterial);\n\t\t\tconst bottom = createInstanceMesh(bottomTreeGeometry, bottomMat, treeMaterial);\n\t\t\tconst mid = createInstanceMesh(midTreeGeometry, midMat, treeMaterial);\n\t\t\tconst top = createInstanceMesh(topTreeGeometry, topMat, treeMaterial);\n\n\t\t\tscene.add(chunk);\n\t\t\tscene.add(bottom);\n\t\t\tscene.add(mid);\n\t\t\tscene.add(top);\n\t\t}\n\n\t\tfunction createInstanceMesh(geometry, instanceMatrix, material) {\n\t\t\tconst instanceMatrixAttribute = new t3d.Attribute(new t3d.Buffer(new Float32Array(instanceMatrix), 16));\n\t\t\tinstanceMatrixAttribute.divisor = 1;\n\t\t\tgeometry.addAttribute('instanceMatrix', instanceMatrixAttribute);\n\n\t\t\tgeometry.instanceCount = instances;\n\n\t\t\tconst instanceMesh = new t3d.Mesh(geometry, material);\n\t\t\tinstanceMesh.frustumCulled = false;\n\t\t\treturn instanceMesh;\n\t\t}\n\n\t\tlet lastUpdate = 0;\n\n\t\tfunction loop(count) {\n\t\t\trequestAnimationFrame(loop);\n\n\t\t\tconst time = new Date().getTime() / 1000;\n\n\t\t\tconst delta = time - lastUpdate;\n\n\t\t\tcontrols && controls.update(delta);\n\n\t\t\tlastUpdate = time;\n\n\t\t\tforwardRenderer.render(scene, camera);\n\t\t}\n\t\trequestAnimationFrame(loop);\n\n\t\tfunction onWindowResize() {\n\t\t\twidth = window.innerWidth || 2;\n\t\t\theight = window.innerHeight || 2;\n\n\t\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 10000);\n\n\t\t\tforwardRenderer.screenRenderTarget.resize(width, height);\n\t\t}\n\t\twindow.addEventListener('resize', onWindowResize, false);\n\n\t\t// Reference: github.com/wybiral/terrain\n\n\t\tconst K_FORWARD = 'KeyW';\n\t\tconst K_BACKWARD = 'KeyS';\n\t\tconst K_STRAFE_LEFT = 'KeyA';\n\t\tconst K_STRAFE_RIGHT = 'KeyD';\n\n\t\tconst K_UP = 'ArrowUp';\n\t\tconst K_DOWN = 'ArrowDown';\n\t\tconst K_LEFT = 'ArrowLeft';\n\t\tconst K_RIGHT = 'ArrowRight';\n\t\tconst K_SPACE = 'Space';\n\t\tconst K_SHIFT = 'ShiftLeft';\n\n\t\tconst q1 = new t3d.Quaternion();\n\t\tconst _xAxis = new t3d.Vector3(1, 0, 0);\n\t\tconst _yAxis = new t3d.Vector3(0, 1, 0);\n\t\tconst rotation = new t3d.Matrix4();\n\t\tconst motion = new t3d.Vector3(0, 0, 0);\n\n\t\tclass FirstPersonControls {\n\n\t\t\tconstructor(canvas, camera, terrain) {\n\t\t\t\tthis.domElement = canvas;\n\t\t\t\tthis.camera = camera;\n\t\t\t\tthis.terrain = terrain;\n\t\t\n\t\t\t\tthis.onGround = true;\n\t\t\t\tthis.position = new t3d.Vector3(0, 0, 0);\n\t\t\t\tthis.rotation = new t3d.Vector3(0, 0, 0);\n\t\t\t\tthis.velocity = new t3d.Vector3(0, 0, 0);\n\t\t\t\tthis.keystate = {};\n\t\t\t\tthis.bindEvents();\n\t\t\t\tthis.locked = false;\n\t\t\t}\n\n\t\t\tbindEvents() {\n\t\t\t\t// You can only request pointer lock from a user triggered event\n\t\t\t\tconst el = this.domElement;\n\t\t\t\tel.ownerDocument.addEventListener('mousedown', () => {\n\t\t\t\t\tif (!el.requestPointerLock) {\n\t\t\t\t\t\tel.requestPointerLock = el.mozRequestPointerLock;\n\t\t\t\t\t}\n\t\t\t\t\tel.requestPointerLock();\n\t\t\t\t}, false);\n\n\t\t\t\tel.ownerDocument.addEventListener('pointerlockchange', () => {\n\t\t\t\t\tif (el.ownerDocument.pointerLockElement === el) {\n\t\t\t\t\t\tthis.locked = true;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.locked = false;\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\t// mouse move\n\t\t\t\tdocument.body.addEventListener('mousemove', evt => {\n\t\t\t\t\tif (!this.locked) return;\n\t\t\t\t\tconst sensitivity = 0.002;\n\t\t\t\t\tthis.rotation.x -= evt.movementY * sensitivity;\n\t\t\t\t\tthis.rotation.y -= evt.movementX * sensitivity;\n\t\t\t\t\t// Constrain viewing angle\n\t\t\t\t\tif (this.rotation.x < -Math.PI / 2) {\n\t\t\t\t\t\tthis.rotation.x = -Math.PI / 2;\n\t\t\t\t\t}\n\t\t\t\t\tif (this.rotation.x > Math.PI / 2) {\n\t\t\t\t\t\tthis.rotation.x = Math.PI / 2;\n\t\t\t\t\t}\n\t\t\t\t}, false);\n\n\t\t\t\t// keyboard\n\t\t\t\twindow.addEventListener('keydown', evt => {\n\t\t\t\t\tthis.keystate[evt.code] = true;\n\t\t\t\t}, false);\n\t\t\t\twindow.addEventListener('keyup', evt => {\n\t\t\t\t\tthis.keystate[evt.code] = false;\n\t\t\t\t}, false);\n\t\t\t}\n\n\t\t\tupdate(delta) {\n\t\t\t\tlet speed = delta * 2.0;\n\t\t\t\tmotion.set(0, 0, 0);\n\t\t\t\tif (this.keystate[K_SHIFT]) {\n\t\t\t\t\t// Holding shift increases speed\n\t\t\t\t\tspeed *= 1.5;\n\t\t\t\t}\n\t\t\t\tif (this.keystate[K_FORWARD]) {\n\t\t\t\t\tmotion.z -= speed;\n\t\t\t\t}\n\t\t\t\tif (this.keystate[K_BACKWARD]) {\n\t\t\t\t\tmotion.z += speed;\n\t\t\t\t}\n\t\t\t\tif (this.keystate[K_STRAFE_LEFT]) {\n\t\t\t\t\tmotion.x -= speed;\n\t\t\t\t}\n\t\t\t\tif (this.keystate[K_STRAFE_RIGHT]) {\n\t\t\t\t\tmotion.x += speed;\n\t\t\t\t}\n\t\t\t\tif (this.keystate[K_UP]) {\n\t\t\t\t\tthis.rotation.x += speed * 0.5;\n\t\t\t\t}\n\t\t\t\tif (this.keystate[K_DOWN]) {\n\t\t\t\t\tthis.rotation.x -= speed * 0.5;\n\t\t\t\t}\n\t\t\t\tif (this.keystate[K_LEFT]) {\n\t\t\t\t\tthis.rotation.y += speed * 0.5;\n\t\t\t\t}\n\t\t\t\tif (this.keystate[K_RIGHT]) {\n\t\t\t\t\tthis.rotation.y -= speed * 0.5;\n\t\t\t\t}\n\t\t\t\tif (this.keystate[K_SPACE] && this.onGround) {\n\t\t\t\t\tmotion.y = delta * 60;\n\t\t\t\t\tthis.onGround = false;\n\t\t\t\t}\n\n\t\t\t\t// rotation\n\t\t\t\tconst c = Math.cos(this.rotation.y), s = Math.sin(this.rotation.y);\n\n\t\t\t\trotation.set(\n\t\t\t\t\tc, 0, s, 0,\n\t\t\t\t\t0, 1, 0, 0,\n\t\t\t\t\t-s, 0, c, 0,\n\t\t\t\t\t0, 0, 0, 1\n\t\t\t\t);\n\n\t\t\t\tmotion.applyMatrix4(rotation);\n\t\t\t\tthis.velocity.add(motion);\n\t\t\t\tconst nextPosition = this.position.clone();\n\t\t\t\tnextPosition.add(this.velocity);\n\t\t\t\tif (this.onGround) {\n\t\t\t\t\tthis.velocity.x *= 0.95;\n\t\t\t\t\tthis.velocity.z *= 0.95;\n\t\t\t\t} else {\n\t\t\t\t\t// Less friction in air\n\t\t\t\t\tthis.velocity.x *= 0.97;\n\t\t\t\t\tthis.velocity.z *= 0.97;\n\t\t\t\t\t// Gravity\n\t\t\t\t\tthis.velocity.y -= delta * 3;\n\t\t\t\t}\n\t\t\t\tlet x = nextPosition.x;\n\t\t\t\tlet y = nextPosition.y;\n\t\t\t\tlet z = nextPosition.z;\n\t\t\t\tconst terrain = this.terrain;\n\t\t\t\t// Constrain position to terrain bounds\n\t\t\t\tif (x < -terrain.width / 2 + 1 || x >= terrain.width / 2 - 1) {\n\t\t\t\t\tx = this.position.x;\n\t\t\t\t}\n\t\t\t\tif (z < -terrain.height / 2 + 1 || z >= terrain.height / 2 - 1) {\n\t\t\t\t\tz = this.position.z;\n\t\t\t\t}\n\t\t\t\tthis.position.x = x;\n\t\t\t\tthis.position.z = z;\n\t\t\t\tconst scale = terrain.scale.y;\n\t\t\t\tconst ground = 7 + terrain.getHeightAt(x, z) * scale;\n\t\t\t\tif (this.onGround || y <= ground) {\n\t\t\t\t\ty = ground;\n\t\t\t\t\tthis.velocity.y = 0;\n\t\t\t\t\tthis.onGround = true;\n\t\t\t\t}\n\t\t\t\tthis.position.y = y;\n\t\t\t\t// Apply current transformations to camera\n\t\t\t\tconst camera = this.camera;\n\t\t\t\tcamera.position.copy(this.position);\n\t\t\t\tcamera.euler.set(0, 0, 0);\n\n\t\t\t\tq1.setFromAxisAngle(_yAxis, this.rotation.y);\n\t\t\t\tcamera.quaternion.multiply(q1);\n\n\t\t\t\tq1.setFromAxisAngle(_xAxis, this.rotation.x);\n\t\t\t\tcamera.quaternion.multiply(q1);\n\t\t\t}\n\n\t\t}\n    </script>\n</body>\n\n</html>"
  },
  {
    "path": "examples/lab_texture_variation.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>t3d - texture variation</title>\n\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n\t<link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n</head>\n<body>\n    <div id=\"info\">\n        <a href=\"\" target=\"_blank\">t3d</a> - texture variation\n    </div>\n\n\t<!-- Import maps polyfill -->\n    <!-- Remove this when import maps will be widely supported -->\n    <script async src=\"./libs/es-module-shims.js\"></script>\n\n    <script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n    <script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { ForwardRenderer } from 't3d/addons/render/ForwardRenderer.js';\n\t\timport { Texture2DLoader } from 't3d/addons/loaders/Texture2DLoader.js';\n\t\timport { TextureVariationShader } from 't3d/addons/shaders/TextureVariationShader.js';\n\t\timport { OrbitControls } from 't3d/addons/controls/OrbitControls.js';\n\t\timport { GUI } from './libs/lil-gui.esm.min.js';\n\n\t\tlet width = window.innerWidth || 2;\n\t\tlet height = window.innerHeight || 2;\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = width;\n\t\tcanvas.height = height;\n\t\tdocument.body.appendChild(canvas);\n\n\t\tconst forwardRenderer = new ForwardRenderer(canvas);\n\t\tforwardRenderer.screenRenderTarget.setColorClearValue(0.1, 0.8, 0.9, 1);\n\n\t\tconst scene = new t3d.Scene();\n\n\t\tconst loader = new Texture2DLoader();\n\n\t\tconst grassTexture = loader.load('./resources/grass.jpg');\n\t\tgrassTexture.wrapT = grassTexture.wrapS = t3d.TEXTURE_WRAP.REPEAT;\n\t\tgrassTexture.anisotropy = forwardRenderer.capabilities.maxAnisotropy;\n\t\tgrassTexture.encoding = t3d.TEXEL_ENCODING_TYPE.SRGB;\n\n\t\tconst randomTexture = loader.load('./resources/noise.png');\n\t\trandomTexture.wrapT = randomTexture.wrapS = t3d.TEXTURE_WRAP.REPEAT;\n\n\t\tconst plane_geometry = new t3d.PlaneGeometry(600, 600);\n\n\t\tconst textureRepetitionMat = new t3d.ShaderMaterial(TextureVariationShader);\n\t\ttextureRepetitionMat.uniforms.map = grassTexture;\n\t\ttextureRepetitionMat.uniforms.randomMap = randomTexture;\n\n\t\tconst plane = new t3d.Mesh(plane_geometry, textureRepetitionMat);\n\t\tplane.position.y = -10;\n\t\tscene.add(plane);\n\n\t\tconst camera = new t3d.Camera();\n\t\tcamera.position.set(0, 25, 100);\n\t\tcamera.lookAt(new t3d.Vector3(0, 0, 0), new t3d.Vector3(0, 1, 0));\n\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 1000);\n\t\tscene.add(camera);\n\n\t\tconst controller = new OrbitControls(camera, canvas);\n\t\tcontroller.target.set(0, 10, 0);\n\n\t\tconst gui = new GUI();\n\t\tgui.add(textureRepetitionMat.uniforms, 'factor', 0., 1, 0.01);\n\t\tgui.add(textureRepetitionMat.uniforms, 'scaleFactor', 1., 100, 1);\n\t\tgui.add(textureRepetitionMat.uniforms, 'noiseFactor', 0., 1, 0.001);\n\n\t\tfunction loop(count) {\n\t\t\trequestAnimationFrame(loop);\n\n\t\t\tcontroller.update();\n\n\t\t\tforwardRenderer.render(scene, camera);\n\t\t}\n\t\trequestAnimationFrame(loop);\n\n\t\tfunction onWindowResize() {\n\t\t\twidth = window.innerWidth || 2;\n\t\t\theight = window.innerHeight || 2;\n\n\t\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 1000);\n\n\t\t\tforwardRenderer.screenRenderTarget.resize(width, height);\n\t\t}\n\t\twindow.addEventListener('resize', onWindowResize, false);\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "examples/lab_water_simulation.html",
    "content": "<!DOCTYPE html>\n<html>\n\n<head>\n    <meta charset=\"utf-8\" />\n    <title>t3d - water simulation </title>\n    <meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\" />\n    <link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\" />\n</head>\n\n<body>\n    <div id=\"info\">\n        water simulation refer to <a href=\"http://madebyevan.com/webgl-water\" target=\"_blank\">Evan Wallace's webgl-water demo</a> </br>\n        \"Model Pool\" modified by <a href=\"https://sketchfab.com/ATD-London\" target=\"_blank\"\n            rel=\"noopener\">ATD-London</a>, <a href=\"http://creativecommons.org/licenses/by/4.0/\" target=\"_blank\"\n            rel=\"noopener\">CC Attribution</a></br>\n    </div>\n\n    <!-- Import maps polyfill -->\n    <!-- Remove this when import maps will be widely supported -->\n    <script async src=\"./libs/es-module-shims.js\"></script>\n\n    <script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n    <script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { SkyBox } from 't3d/addons/objects/SkyBox.js';\n\t\timport { OrbitControls } from 't3d/addons/controls/OrbitControls.js';\n\t\timport { TextureCubeLoader } from 't3d/addons/loaders/TextureCubeLoader.js';\n\t\timport { Texture2DLoader } from 't3d/addons/loaders/Texture2DLoader.js';\n\t\timport { GLTFLoader } from 't3d/addons/loaders/glTF/GLTFLoader.js';\n\t\timport { WaterSimulation } from 't3d/addons/WaterSimulation.js';\n\t\timport { GUI } from './libs/lil-gui.esm.min.js';\n\n\t\tlet width = window.innerWidth || 2;\n\t\tlet height = window.innerHeight || 2;\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = width;\n\t\tcanvas.height = height;\n\t\tdocument.body.appendChild(canvas);\n\n\t\tconst contextParams = { antialias: true, alpha: false };\n\n\t\tconst gl = canvas.getContext('webgl2', contextParams) || canvas.getContext('webgl', contextParams);\n\n\t\tconst renderer = new t3d.WebGLRenderer(gl);\n\n\t\tif (renderer.capabilities.version < 2) {\n\t\t\trenderer.capabilities.getExtension('OES_texture_half_float');\n\t\t\trenderer.capabilities.getExtension('OES_texture_half_float_linear');\n\t\t\trenderer.capabilities.getExtension('EXT_color_buffer_half_float');\n\t\t}\n\n\t\tconst shadowMapPass = new t3d.ShadowMapPass();\n\n\t\tconst screenRenderTarget = new t3d.ScreenRenderTarget(canvas);\n\n\t\tconst cubeTexturePath = './resources/skybox/Park2/';\n\t\tconst cubeTexture = new TextureCubeLoader().load([\n\t\t\tcubeTexturePath + 'posx.jpg',\n\t\t\tcubeTexturePath + 'negx.jpg',\n\t\t\tcubeTexturePath + 'posy.jpg',\n\t\t\tcubeTexturePath + 'negy.jpg',\n\t\t\tcubeTexturePath + 'posz.jpg',\n\t\t\tcubeTexturePath + 'negz.jpg'\n\t\t]);\n\t\tcubeTexture.encoding = t3d.TEXEL_ENCODING_TYPE.SRGB;\n\n\t\tconst scene = new t3d.Scene();\n\t\tscene.environment = cubeTexture;\n\n\t\tconst skyBox = new SkyBox(cubeTexture);\n\t\tskyBox.gamma = true;\n\t\tscene.add(skyBox);\n\n\t\tconst loader = new GLTFLoader();\n\t\tfunction loadModel(url, position, scale) {\n\t\t\tloader\n\t\t\t\t.load(url)\n\t\t\t\t.then(function(result) {\n\t\t\t\t\tconst object = result.root;\n\t\t\t\t\tobject.traverse(node => {\n\t\t\t\t\t\tnode.castShadow = true;\n\t\t\t\t\t\tnode.receiveShadow = true;\n\t\t\t\t\t});\n\n\t\t\t\t\tobject.position.fromArray(position);\n\t\t\t\t\tobject.scale.fromArray(scale);\n\n\t\t\t\t\tscene.add(object);\n\t\t\t\t})\n\t\t\t\t.catch(e => console.error(e));\n\t\t}\n\n\t\tloadModel('./resources/models/gltf/pool.glb', [0, -0.4, -0.22], [0.14, 0.1, 0.056]);\n\t\tloadModel('./resources/models/gltf/Duck/glTF/Duck.gltf', [0, -0.34, 0], [0.15, 0.15, 0.15]);\n\n\t\tconst gridTex = new Texture2DLoader().load('./resources/tiles.jpg');\n\t\tgridTex.wrapS = gridTex.wrapT = t3d.TEXTURE_WRAP.REPEAT;\n\t\tconst plane_geometry = new t3d.PlaneGeometry(2, 2);\n\t\tconst plane_material = new t3d.PBRMaterial();\n\t\tplane_material.roughness = 0.5;\n\t\tplane_material.metalness = 0;\n\t\tplane_material.diffuseMap = gridTex;\n\t\tconst plane = new t3d.Mesh(plane_geometry, plane_material);\n\t\tplane.receiveShadow = true;\n\t\tplane.position.set(0, -0.33, 0);\n\t\tscene.add(plane);\n\n\t\tconst water = createWater(2, 2);\n\t\tscene.add(water);\n\n\t\tconst directionalLight = new t3d.DirectionalLight(0xffffff, 1);\n\t\tdirectionalLight.castShadow = true;\n\t\tdirectionalLight.shadow.windowSize = 10;\n\t\tdirectionalLight.shadow.mapSize.set(2048, 2048);\n\t\tdirectionalLight.shadow.bias = -0.00003;\n\t\tdirectionalLight.position.set(4, 5, -4);\n\t\tdirectionalLight.lookAt(\n\t\t\tnew t3d.Vector3(0, 0, 0),\n\t\t\tnew t3d.Vector3(0, 1, 0)\n\t\t);\n\t\tscene.add(directionalLight);\n\n\t\tconst camera = new t3d.Camera();\n\t\tcamera.outputEncoding = t3d.TEXEL_ENCODING_TYPE.SRGB;\n\t\tcamera.position.set(0, 1.5, -2.45);\n\t\tcamera.lookAt(new t3d.Vector3(0, 0, 0), new t3d.Vector3(0, 1, 0));\n\t\tcamera.setPerspective((45 / 180) * Math.PI, width / height, 0.1, 1000);\n\t\tscene.add(camera);\n\n\t\tconst controller = new OrbitControls(camera, canvas);\n\n\t\tconst waterSimulation = new WaterSimulation(256, 256);\n\n\t\t// interaction\n\n\t\tconst ray = new t3d.Ray();\n\t\tconst mouse = new t3d.Vector2();\n\n\t\tlet debounceTimeout = null;\n\n\t\tdocument.addEventListener('mousemove', event => {\n\t\t\tif (debounceTimeout) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tdebounceTimeout = setTimeout(() => {\n\t\t\t\tclearTimeout(debounceTimeout);\n\t\t\t\tdebounceTimeout = null;\n\n\t\t\t\tmouse.x = (event.clientX / window.innerWidth) * 2 - 1;\n\t\t\t\tmouse.y = -(event.clientY / window.innerHeight) * 2 + 1;\n\n\t\t\t\tray.origin.setFromMatrixPosition(camera.worldMatrix);\n\t\t\t\tray.direction.set(mouse.x, mouse.y, 0.5).unproject(camera).sub(ray.origin).normalize();\n\n\t\t\t\tconst interSect = ray.intersectBox(water.geometry.boundingBox);\n\n\t\t\t\tif (interSect) {\n\t\t\t\t\tconst pointOnPlane = ray.origin.add(ray.direction.multiplyScalar(-ray.origin.y / ray.direction.y));\n\n\t\t\t\t\twaterSimulation.addDrop(\n\t\t\t\t\t\trenderer,\n\t\t\t\t\t\tpointOnPlane.x / 2 + 0.5,\n\t\t\t\t\t\t-pointOnPlane.z / 2 + 0.5,\n\t\t\t\t\t\tparams.radius,\n\t\t\t\t\t\tparams.strength\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}, 30); // limit drop rate\n\t\t});\n\n\t\tconst params = { 'radius': 0.03, 'strength': 0.015 };\n\n\t\tconst gui = new GUI();\n\t\tgui.add({ version: 'WebGL ' + renderer.capabilities.version }, 'version').disable();\n\t\tconst dropFolder = gui.addFolder('drop');\n\t\tdropFolder.add(params, 'radius', 0.001, 0.1, 0.001);\n\t\tdropFolder.add(params, 'strength', 0.001, 0.1, 0.001);\n\t\tconst waterFolder = gui.addFolder('water');\n\t\twaterFolder.addColor(water.material, 'diffuse');\n\t\twaterFolder\n\t\t\t.add(water.material, 'clearcoat', 0, 1, 0.001)\n\t\t\t.onChange(() => water.material.needsUpdate = true);\n\t\twaterFolder.add(water.material, 'clearcoatRoughness', 0, 1, 0.001);\n\t\twaterFolder.add(water.material, 'metalness', 0, 1, 0.001);\n\t\twaterFolder.add(water.material, 'roughness', 0, 1, 0.001);\n\t\twaterFolder.add(water.material, 'opacity', 0, 1, 0.001);\n\t\twaterFolder.add(water.material.uniforms, 'fresnelInverse');\n\t\twaterFolder.add(water.material.uniforms, 'fresnelPower', 0, 1, 0.001);\n\t\twaterFolder.close();\n\n\t\tfunction createWater(waterWidth, waterHeight) {\n\t\t\tlet water_vert = t3d.ShaderLib.pbr_vert;\n\n\t\t\twater_vert = water_vert.replace(\n\t\t\t\t'#include <common_vert>',\n\t\t\t\t`\n\t\t\t\t#include <common_vert>\n\t\t\t\tuniform sampler2D water; // waterSimulation texture\t// @modify\n\t\t\t\tuniform float waterWidth;\n\t\t\t\tuniform float waterHeight;\n\t\t\t\t`\n\t\t\t);\n\n\t\t\twater_vert = water_vert.replace(\n\t\t\t\t'#include <pvm_vert>',\n\t\t\t\t`\n\t\t\t\t\n\t\t\t\tvec2 uv = vec2((transformed.x + waterWidth / 2. ) / waterWidth, (-transformed.z + waterHeight / 2.) / waterHeight);\n\n\t\t\t\tvec4 info = texture2D(water, uv);\t\n\n\t\t\t\ttransformed.y += info.r;\n\n\t\t\t\t#include <pvm_vert>\n\t\t\t\t`\n\t\t\t);\n\n\t\t\tlet water_frag = t3d.ShaderLib.pbr_frag;\n\n\t\t\twater_frag = water_frag.replace(\n\t\t\t\t'#include <normal_pars_frag>',\n\t\t\t\t`\n\t\t\t\t#ifdef FRESNEL\n\t\t\t\t\tuniform float fresnelPower;\n\t\t\t\t\tuniform bool fresnelInverse;\n\t\t\t\t#endif\n\t\t\t\tuniform sampler2D water;\n\t\t\t\t#include <transpose>\n\t\t\t\t#include <inverse>\n\t\t\t\t#include <normal_pars_frag>\n\t\t\t\t#include <tsn>\n\t\t\t\t`\n\t\t\t);\n\n\t\t\twater_frag = water_frag.replace(\n\t\t\t\t'#include <normal_frag>',\n\t\t\t\t`\n\t\t\t\t#include <normal_frag>\n\t\t\t\t\n\t\t\t\tvec2 coord = v_Uv;\n\n\t\t\t\tvec4 info;\n\n\t\t\t\tfor (int i = 0; i < 5; i++) {\n\t\t\t\t\tcoord += info.ba * 0.005;\n\t\t\t\t\tinfo = texture2D(water, coord);\n\t\t\t\t}\n\n\t\t\t\tN =  vec3(info.b, sqrt(1.0 - dot(info.ba, info.ba)), info.a);\n\n\t\t\t\t`\n\t\t\t);\n\n\t\t\t// fresnel\n\t\t\twater_frag = water_frag.replace(\n\t\t\t\t'#include <end_frag>',\n\t\t\t\t`\n\t\t\t\t#include <end_frag>\n\t\t\t\t#ifdef FRESNEL\n\t\t\t\t\tvec3 normal = (transposeMat4(inverseMat4(u_View)) * vec4(N,0.0)).xyz;\n\t\t\t\t\tnormal = normalize(normal);\n\t\t\t\t\tif (fresnelInverse) {\n\t\t\t\t\t\tgl_FragColor.a *= pow(abs(dot(normal, vec3(0., 0., 1.))), fresnelPower );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tgl_FragColor.a *= pow(1.0 - abs(dot(normal, vec3(0., 0., 1.))), fresnelPower );\n\t\t\t\t\t}\n\t\t\t\t#endif\n\t\t\t\t`\n\t\t\t);\n\n\t\t\tconst waterGeometry = new t3d.PlaneGeometry(waterWidth, waterHeight, 100, 100);\n\n\t\t\tconst waterMaterial = new t3d.PBRMaterial();\n\t\t\twaterMaterial.defines.USE_UV1 = true;\n\t\t\twaterMaterial.defines.FRESNEL = true;\n\t\t\twaterMaterial.type = t3d.MATERIAL_TYPE.SHADER;\n\t\t\twaterMaterial.uniforms = {\n\t\t\t\twater: null,\n\t\t\t\twaterWidth: waterWidth,\n\t\t\t\twaterHeight: waterHeight,\n\t\t\t\tfresnelInverse: false,\n\t\t\t\tfresnelPower: 0.23\n\t\t\t};\n\t\t\twaterMaterial.side = t3d.DRAW_SIDE.DOUBLE;\n\t\t\twaterMaterial.diffuse.setHex(0x0088ff);\n\t\t\twaterMaterial.shaderName = 'dynamic_water';\n\t\t\twaterMaterial.vertexShader = water_vert;\n\t\t\twaterMaterial.fragmentShader = water_frag;\n\t\t\twaterMaterial.metalness = 1.0;\n\t\t\twaterMaterial.roughness = 0.0;\n\t\t\twaterMaterial.transparent = true;\n\t\t\twaterMaterial.opacity = 0.9;\n\n\t\t\treturn new t3d.Mesh(waterGeometry, waterMaterial);\n\t\t}\n\n\t\tfunction loop(count) {\n\t\t\trequestAnimationFrame(loop);\n\n\t\t\tcontroller.update();\n\n\t\t\tscene.updateMatrix();\n\t\t\tscene.updateRenderStates(camera);\n\t\t\tscene.updateRenderQueue(camera);\n\n\t\t\tshadowMapPass.render(renderer, scene);\n\n\t\t\twaterSimulation.stepSimulation(renderer);\n\t\t\twaterSimulation.updateNormals(renderer);\n\n\t\t\tconst waterTexture = waterSimulation._currentRTT.texture;\n\t\t\twater.material.uniforms.water = waterTexture;\n\n\t\t\trenderer.renderScene(scene, camera, screenRenderTarget);\n\t\t}\n\n\t\trequestAnimationFrame(loop);\n\n\t\tfunction onWindowResize() {\n\t\t\twidth = window.innerWidth || 2;\n\t\t\theight = window.innerHeight || 2;\n\n\t\t\tcamera.setPerspective((45 / 180) * Math.PI, width / height, 0.1, 1000);\n\n\t\t\tscreenRenderTarget.resize(width, height);\n\t\t}\n\n\t\twindow.addEventListener('resize', onWindowResize, false);\n    </script>\n</body>\n\n</html>"
  },
  {
    "path": "examples/libs/ammo.wasm.js",
    "content": "\n// This is ammo.js, a port of Bullet Physics to JavaScript. zlib licensed.\n\nvar Ammo = (function() {\n  var _scriptDir = typeof document !== 'undefined' && document.currentScript ? document.currentScript.src : undefined;\n  if (typeof __filename !== 'undefined') _scriptDir = _scriptDir || __filename;\n  return (\nfunction(Ammo) {\n  Ammo = Ammo || {};\n\n\nvar b;b||(b=typeof Ammo !== 'undefined' ? Ammo : {});var ba;b.ready=new Promise(function(a){ba=a});var ca={},da;for(da in b)b.hasOwnProperty(da)&&(ca[da]=b[da]);var ea=!1,fa=!1,ha=!1,ia=!1;ea=\"object\"===typeof window;fa=\"function\"===typeof importScripts;ha=\"object\"===typeof process&&\"object\"===typeof process.versions&&\"string\"===typeof process.versions.node;ia=!ea&&!ha&&!fa;var ja=\"\",ka,la,ma,na;\nif(ha)ja=fa?require(\"path\").dirname(ja)+\"/\":__dirname+\"/\",ka=function(a,c){ma||(ma=require(\"fs\"));na||(na=require(\"path\"));a=na.normalize(a);return ma.readFileSync(a,c?null:\"utf8\")},la=function(a){a=ka(a,!0);a.buffer||(a=new Uint8Array(a));assert(a.buffer);return a},1<process.argv.length&&process.argv[1].replace(/\\\\/g,\"/\"),process.argv.slice(2),process.on(\"uncaughtException\",function(a){throw a;}),process.on(\"unhandledRejection\",oa),b.inspect=function(){return\"[Emscripten Module object]\"};else if(ia)\"undefined\"!=\ntypeof read&&(ka=function(a){return read(a)}),la=function(a){if(\"function\"===typeof readbuffer)return new Uint8Array(readbuffer(a));a=read(a,\"binary\");assert(\"object\"===typeof a);return a},\"undefined\"!==typeof print&&(\"undefined\"===typeof console&&(console={}),console.log=print,console.warn=console.error=\"undefined\"!==typeof printErr?printErr:print);else if(ea||fa)fa?ja=self.location.href:document.currentScript&&(ja=document.currentScript.src),_scriptDir&&(ja=_scriptDir),ja=0!==ja.indexOf(\"blob:\")?\nja.substr(0,ja.lastIndexOf(\"/\")+1):\"\",ka=function(a){var c=new XMLHttpRequest;c.open(\"GET\",a,!1);c.send(null);return c.responseText},fa&&(la=function(a){var c=new XMLHttpRequest;c.open(\"GET\",a,!1);c.responseType=\"arraybuffer\";c.send(null);return new Uint8Array(c.response)});var pa=b.print||console.log.bind(console),qa=b.printErr||console.warn.bind(console);for(da in ca)ca.hasOwnProperty(da)&&(b[da]=ca[da]);ca=null;var ra;b.wasmBinary&&(ra=b.wasmBinary);var noExitRuntime;\nb.noExitRuntime&&(noExitRuntime=b.noExitRuntime);\"object\"!==typeof WebAssembly&&qa(\"no native wasm support detected\");var sa,ua=new WebAssembly.Table({initial:930,maximum:930,element:\"anyfunc\"}),va=!1;function assert(a,c){a||oa(\"Assertion failed: \"+c)}var wa=\"undefined\"!==typeof TextDecoder?new TextDecoder(\"utf8\"):void 0,xa,ya,za,Aa,Ba,Ca,Da=b.INITIAL_MEMORY||67108864;if(sa=b.wasmMemory?b.wasmMemory:new WebAssembly.Memory({initial:Da/65536,maximum:Da/65536}))xa=sa.buffer;Da=xa.byteLength;var Ea=xa;\nxa=Ea;b.HEAP8=ya=new Int8Array(Ea);b.HEAP16=new Int16Array(Ea);b.HEAP32=Aa=new Int32Array(Ea);b.HEAPU8=za=new Uint8Array(Ea);b.HEAPU16=new Uint16Array(Ea);b.HEAPU32=new Uint32Array(Ea);b.HEAPF32=Ba=new Float32Array(Ea);b.HEAPF64=Ca=new Float64Array(Ea);Aa[7848]=5274432;function Fa(a){for(;0<a.length;){var c=a.shift();if(\"function\"==typeof c)c(b);else{var d=c.Xy;\"number\"===typeof d?void 0===c.Ey?b.dynCall_v(d):b.dynCall_vi(d,c.Ey):d(void 0===c.Ey?null:c.Ey)}}}var Ga=[],Ha=[],Ia=[],Ja=[],Ka=!1;\nfunction La(){var a=b.preRun.shift();Ga.unshift(a)}var Ma=0,Na=null,Oa=null;b.preloadedImages={};b.preloadedAudios={};function oa(a){if(b.onAbort)b.onAbort(a);a+=\"\";pa(a);qa(a);va=!0;throw new WebAssembly.RuntimeError(\"abort(\"+a+\"). Build with -s ASSERTIONS=1 for more info.\");}function Pa(a){var c=Qa;return String.prototype.startsWith?c.startsWith(a):0===c.indexOf(a)}function Ra(){return Pa(\"data:application/octet-stream;base64,\")}var Qa=\"ammo.wasm.wasm\";\nif(!Ra()){var Sa=Qa;Qa=b.locateFile?b.locateFile(Sa,ja):ja+Sa}function Ta(){try{if(ra)return new Uint8Array(ra);if(la)return la(Qa);throw\"both async and sync fetching of the wasm failed\";}catch(a){oa(a)}}function Ua(){return ra||!ea&&!fa||\"function\"!==typeof fetch||Pa(\"file://\")?new Promise(function(a){a(Ta())}):fetch(Qa,{credentials:\"same-origin\"}).then(function(a){if(!a.ok)throw\"failed to load wasm binary file at '\"+Qa+\"'\";return a.arrayBuffer()}).catch(function(){return Ta()})}\nvar Va={1960:function(a,c,d,e,g,n,F,aa){a=b.getCache(b.ConcreteContactResultCallback)[a];if(!a.hasOwnProperty(\"addSingleResult\"))throw\"a JSImplementation must implement all functions, you forgot ConcreteContactResultCallback::addSingleResult.\";return a.addSingleResult(c,d,e,g,n,F,aa)},2520:function(a,c,d,e){a=b.getCache(b.DebugDrawer)[a];if(!a.hasOwnProperty(\"drawLine\"))throw\"a JSImplementation must implement all functions, you forgot DebugDrawer::drawLine.\";a.drawLine(c,d,e)},2745:function(a,c,d,\ne,g,n){a=b.getCache(b.DebugDrawer)[a];if(!a.hasOwnProperty(\"drawContactPoint\"))throw\"a JSImplementation must implement all functions, you forgot DebugDrawer::drawContactPoint.\";a.drawContactPoint(c,d,e,g,n)},3002:function(a,c){a=b.getCache(b.DebugDrawer)[a];if(!a.hasOwnProperty(\"reportErrorWarning\"))throw\"a JSImplementation must implement all functions, you forgot DebugDrawer::reportErrorWarning.\";a.reportErrorWarning(c)},3249:function(a,c,d){a=b.getCache(b.DebugDrawer)[a];if(!a.hasOwnProperty(\"draw3dText\"))throw\"a JSImplementation must implement all functions, you forgot DebugDrawer::draw3dText.\";\na.draw3dText(c,d)},3476:function(a,c){a=b.getCache(b.DebugDrawer)[a];if(!a.hasOwnProperty(\"setDebugMode\"))throw\"a JSImplementation must implement all functions, you forgot DebugDrawer::setDebugMode.\";a.setDebugMode(c)},3705:function(a){a=b.getCache(b.DebugDrawer)[a];if(!a.hasOwnProperty(\"getDebugMode\"))throw\"a JSImplementation must implement all functions, you forgot DebugDrawer::getDebugMode.\";return a.getDebugMode()}};Ha.push({Xy:function(){Wa()}});var Xa=[];\nfunction Ya(a,c){Xa.length=0;var d;for(c>>=2;d=za[a++];)Xa.push(105>d?Ca[++c>>1]:Aa[c]),++c;return Xa}var Za={f:function(){oa()},c:function(a,c,d){c=Ya(c,d);return Va[a].apply(null,c)},a:function(a,c,d){c=Ya(c,d);return Va[a].apply(null,c)},d:function(a,c,d){za.copyWithin(a,c,c+d)},e:function(){oa(\"OOM\")},b:function(a){var c=Date.now();Aa[a>>2]=c/1E3|0;Aa[a+4>>2]=c%1E3*1E3|0;return 0},memory:sa,table:ua};\n(function(){function a(g){b.asm=g.exports;Ma--;b.monitorRunDependencies&&b.monitorRunDependencies(Ma);0==Ma&&(null!==Na&&(clearInterval(Na),Na=null),Oa&&(g=Oa,Oa=null,g()))}function c(g){a(g.instance)}function d(g){return Ua().then(function(n){return WebAssembly.instantiate(n,e)}).then(g,function(n){qa(\"failed to asynchronously prepare wasm: \"+n);oa(n)})}var e={a:Za};Ma++;b.monitorRunDependencies&&b.monitorRunDependencies(Ma);if(b.instantiateWasm)try{return b.instantiateWasm(e,a)}catch(g){return qa(\"Module.instantiateWasm callback failed with error: \"+\ng),!1}(function(){if(ra||\"function\"!==typeof WebAssembly.instantiateStreaming||Ra()||Pa(\"file://\")||\"function\"!==typeof fetch)return d(c);fetch(Qa,{credentials:\"same-origin\"}).then(function(g){return WebAssembly.instantiateStreaming(g,e).then(c,function(n){qa(\"wasm streaming compile failed: \"+n);qa(\"falling back to ArrayBuffer instantiation\");return d(c)})})})();return{}})();var Wa=b.___wasm_call_ctors=function(){return(Wa=b.___wasm_call_ctors=b.asm.g).apply(null,arguments)};\nb.___em_js__array_bounds_check_error=function(){return(b.___em_js__array_bounds_check_error=b.asm.h).apply(null,arguments)};\nvar $a=b._emscripten_bind_btCollisionWorld_getDispatcher_0=function(){return($a=b._emscripten_bind_btCollisionWorld_getDispatcher_0=b.asm.i).apply(null,arguments)},ab=b._emscripten_bind_btCollisionWorld_rayTest_3=function(){return(ab=b._emscripten_bind_btCollisionWorld_rayTest_3=b.asm.j).apply(null,arguments)},bb=b._emscripten_bind_btCollisionWorld_getPairCache_0=function(){return(bb=b._emscripten_bind_btCollisionWorld_getPairCache_0=b.asm.k).apply(null,arguments)},cb=b._emscripten_bind_btCollisionWorld_getDispatchInfo_0=\nfunction(){return(cb=b._emscripten_bind_btCollisionWorld_getDispatchInfo_0=b.asm.l).apply(null,arguments)},db=b._emscripten_bind_btCollisionWorld_addCollisionObject_1=function(){return(db=b._emscripten_bind_btCollisionWorld_addCollisionObject_1=b.asm.m).apply(null,arguments)},eb=b._emscripten_bind_btCollisionWorld_addCollisionObject_2=function(){return(eb=b._emscripten_bind_btCollisionWorld_addCollisionObject_2=b.asm.n).apply(null,arguments)},fb=b._emscripten_bind_btCollisionWorld_addCollisionObject_3=\nfunction(){return(fb=b._emscripten_bind_btCollisionWorld_addCollisionObject_3=b.asm.o).apply(null,arguments)},gb=b._emscripten_bind_btCollisionWorld_removeCollisionObject_1=function(){return(gb=b._emscripten_bind_btCollisionWorld_removeCollisionObject_1=b.asm.p).apply(null,arguments)},hb=b._emscripten_bind_btCollisionWorld_getBroadphase_0=function(){return(hb=b._emscripten_bind_btCollisionWorld_getBroadphase_0=b.asm.q).apply(null,arguments)},ib=b._emscripten_bind_btCollisionWorld_convexSweepTest_5=\nfunction(){return(ib=b._emscripten_bind_btCollisionWorld_convexSweepTest_5=b.asm.r).apply(null,arguments)},jb=b._emscripten_bind_btCollisionWorld_contactPairTest_3=function(){return(jb=b._emscripten_bind_btCollisionWorld_contactPairTest_3=b.asm.s).apply(null,arguments)},kb=b._emscripten_bind_btCollisionWorld_contactTest_2=function(){return(kb=b._emscripten_bind_btCollisionWorld_contactTest_2=b.asm.t).apply(null,arguments)},lb=b._emscripten_bind_btCollisionWorld_updateSingleAabb_1=function(){return(lb=\nb._emscripten_bind_btCollisionWorld_updateSingleAabb_1=b.asm.u).apply(null,arguments)},mb=b._emscripten_bind_btCollisionWorld_setDebugDrawer_1=function(){return(mb=b._emscripten_bind_btCollisionWorld_setDebugDrawer_1=b.asm.v).apply(null,arguments)},nb=b._emscripten_bind_btCollisionWorld_getDebugDrawer_0=function(){return(nb=b._emscripten_bind_btCollisionWorld_getDebugDrawer_0=b.asm.w).apply(null,arguments)},ob=b._emscripten_bind_btCollisionWorld_debugDrawWorld_0=function(){return(ob=b._emscripten_bind_btCollisionWorld_debugDrawWorld_0=\nb.asm.x).apply(null,arguments)},pb=b._emscripten_bind_btCollisionWorld_debugDrawObject_3=function(){return(pb=b._emscripten_bind_btCollisionWorld_debugDrawObject_3=b.asm.y).apply(null,arguments)},qb=b._emscripten_bind_btCollisionWorld___destroy___0=function(){return(qb=b._emscripten_bind_btCollisionWorld___destroy___0=b.asm.z).apply(null,arguments)},rb=b._emscripten_bind_btCollisionShape_setLocalScaling_1=function(){return(rb=b._emscripten_bind_btCollisionShape_setLocalScaling_1=b.asm.A).apply(null,\narguments)},sb=b._emscripten_bind_btCollisionShape_getLocalScaling_0=function(){return(sb=b._emscripten_bind_btCollisionShape_getLocalScaling_0=b.asm.B).apply(null,arguments)},tb=b._emscripten_bind_btCollisionShape_calculateLocalInertia_2=function(){return(tb=b._emscripten_bind_btCollisionShape_calculateLocalInertia_2=b.asm.C).apply(null,arguments)},ub=b._emscripten_bind_btCollisionShape_setMargin_1=function(){return(ub=b._emscripten_bind_btCollisionShape_setMargin_1=b.asm.D).apply(null,arguments)},\nvb=b._emscripten_bind_btCollisionShape_getMargin_0=function(){return(vb=b._emscripten_bind_btCollisionShape_getMargin_0=b.asm.E).apply(null,arguments)},wb=b._emscripten_bind_btCollisionShape___destroy___0=function(){return(wb=b._emscripten_bind_btCollisionShape___destroy___0=b.asm.F).apply(null,arguments)},xb=b._emscripten_bind_btCollisionObject_setAnisotropicFriction_2=function(){return(xb=b._emscripten_bind_btCollisionObject_setAnisotropicFriction_2=b.asm.G).apply(null,arguments)},yb=b._emscripten_bind_btCollisionObject_getCollisionShape_0=\nfunction(){return(yb=b._emscripten_bind_btCollisionObject_getCollisionShape_0=b.asm.H).apply(null,arguments)},zb=b._emscripten_bind_btCollisionObject_setContactProcessingThreshold_1=function(){return(zb=b._emscripten_bind_btCollisionObject_setContactProcessingThreshold_1=b.asm.I).apply(null,arguments)},Ab=b._emscripten_bind_btCollisionObject_setActivationState_1=function(){return(Ab=b._emscripten_bind_btCollisionObject_setActivationState_1=b.asm.J).apply(null,arguments)},Bb=b._emscripten_bind_btCollisionObject_forceActivationState_1=\nfunction(){return(Bb=b._emscripten_bind_btCollisionObject_forceActivationState_1=b.asm.K).apply(null,arguments)},Cb=b._emscripten_bind_btCollisionObject_activate_0=function(){return(Cb=b._emscripten_bind_btCollisionObject_activate_0=b.asm.L).apply(null,arguments)},Db=b._emscripten_bind_btCollisionObject_activate_1=function(){return(Db=b._emscripten_bind_btCollisionObject_activate_1=b.asm.M).apply(null,arguments)},Eb=b._emscripten_bind_btCollisionObject_isActive_0=function(){return(Eb=b._emscripten_bind_btCollisionObject_isActive_0=\nb.asm.N).apply(null,arguments)},Fb=b._emscripten_bind_btCollisionObject_isKinematicObject_0=function(){return(Fb=b._emscripten_bind_btCollisionObject_isKinematicObject_0=b.asm.O).apply(null,arguments)},Gb=b._emscripten_bind_btCollisionObject_isStaticObject_0=function(){return(Gb=b._emscripten_bind_btCollisionObject_isStaticObject_0=b.asm.P).apply(null,arguments)},Hb=b._emscripten_bind_btCollisionObject_isStaticOrKinematicObject_0=function(){return(Hb=b._emscripten_bind_btCollisionObject_isStaticOrKinematicObject_0=\nb.asm.Q).apply(null,arguments)},Ib=b._emscripten_bind_btCollisionObject_getRestitution_0=function(){return(Ib=b._emscripten_bind_btCollisionObject_getRestitution_0=b.asm.R).apply(null,arguments)},Jb=b._emscripten_bind_btCollisionObject_getFriction_0=function(){return(Jb=b._emscripten_bind_btCollisionObject_getFriction_0=b.asm.S).apply(null,arguments)},Kb=b._emscripten_bind_btCollisionObject_getRollingFriction_0=function(){return(Kb=b._emscripten_bind_btCollisionObject_getRollingFriction_0=b.asm.T).apply(null,\narguments)},Lb=b._emscripten_bind_btCollisionObject_setRestitution_1=function(){return(Lb=b._emscripten_bind_btCollisionObject_setRestitution_1=b.asm.U).apply(null,arguments)},Mb=b._emscripten_bind_btCollisionObject_setFriction_1=function(){return(Mb=b._emscripten_bind_btCollisionObject_setFriction_1=b.asm.V).apply(null,arguments)},Nb=b._emscripten_bind_btCollisionObject_setRollingFriction_1=function(){return(Nb=b._emscripten_bind_btCollisionObject_setRollingFriction_1=b.asm.W).apply(null,arguments)},\nOb=b._emscripten_bind_btCollisionObject_getWorldTransform_0=function(){return(Ob=b._emscripten_bind_btCollisionObject_getWorldTransform_0=b.asm.X).apply(null,arguments)},Pb=b._emscripten_bind_btCollisionObject_getCollisionFlags_0=function(){return(Pb=b._emscripten_bind_btCollisionObject_getCollisionFlags_0=b.asm.Y).apply(null,arguments)},Qb=b._emscripten_bind_btCollisionObject_setCollisionFlags_1=function(){return(Qb=b._emscripten_bind_btCollisionObject_setCollisionFlags_1=b.asm.Z).apply(null,arguments)},\nSb=b._emscripten_bind_btCollisionObject_setWorldTransform_1=function(){return(Sb=b._emscripten_bind_btCollisionObject_setWorldTransform_1=b.asm._).apply(null,arguments)},Tb=b._emscripten_bind_btCollisionObject_setCollisionShape_1=function(){return(Tb=b._emscripten_bind_btCollisionObject_setCollisionShape_1=b.asm.$).apply(null,arguments)},Ub=b._emscripten_bind_btCollisionObject_setCcdMotionThreshold_1=function(){return(Ub=b._emscripten_bind_btCollisionObject_setCcdMotionThreshold_1=b.asm.aa).apply(null,\narguments)},Vb=b._emscripten_bind_btCollisionObject_setCcdSweptSphereRadius_1=function(){return(Vb=b._emscripten_bind_btCollisionObject_setCcdSweptSphereRadius_1=b.asm.ba).apply(null,arguments)},Wb=b._emscripten_bind_btCollisionObject_getUserIndex_0=function(){return(Wb=b._emscripten_bind_btCollisionObject_getUserIndex_0=b.asm.ca).apply(null,arguments)},Xb=b._emscripten_bind_btCollisionObject_setUserIndex_1=function(){return(Xb=b._emscripten_bind_btCollisionObject_setUserIndex_1=b.asm.da).apply(null,\narguments)},Yb=b._emscripten_bind_btCollisionObject_getUserPointer_0=function(){return(Yb=b._emscripten_bind_btCollisionObject_getUserPointer_0=b.asm.ea).apply(null,arguments)},Zb=b._emscripten_bind_btCollisionObject_setUserPointer_1=function(){return(Zb=b._emscripten_bind_btCollisionObject_setUserPointer_1=b.asm.fa).apply(null,arguments)},$b=b._emscripten_bind_btCollisionObject_getBroadphaseHandle_0=function(){return($b=b._emscripten_bind_btCollisionObject_getBroadphaseHandle_0=b.asm.ga).apply(null,\narguments)},ac=b._emscripten_bind_btCollisionObject___destroy___0=function(){return(ac=b._emscripten_bind_btCollisionObject___destroy___0=b.asm.ha).apply(null,arguments)},bc=b._emscripten_bind_btDynamicsWorld_addAction_1=function(){return(bc=b._emscripten_bind_btDynamicsWorld_addAction_1=b.asm.ia).apply(null,arguments)},cc=b._emscripten_bind_btDynamicsWorld_removeAction_1=function(){return(cc=b._emscripten_bind_btDynamicsWorld_removeAction_1=b.asm.ja).apply(null,arguments)},dc=b._emscripten_bind_btDynamicsWorld_getSolverInfo_0=\nfunction(){return(dc=b._emscripten_bind_btDynamicsWorld_getSolverInfo_0=b.asm.ka).apply(null,arguments)},ec=b._emscripten_bind_btDynamicsWorld_setInternalTickCallback_1=function(){return(ec=b._emscripten_bind_btDynamicsWorld_setInternalTickCallback_1=b.asm.la).apply(null,arguments)},fc=b._emscripten_bind_btDynamicsWorld_setInternalTickCallback_2=function(){return(fc=b._emscripten_bind_btDynamicsWorld_setInternalTickCallback_2=b.asm.ma).apply(null,arguments)},hc=b._emscripten_bind_btDynamicsWorld_setInternalTickCallback_3=\nfunction(){return(hc=b._emscripten_bind_btDynamicsWorld_setInternalTickCallback_3=b.asm.na).apply(null,arguments)},ic=b._emscripten_bind_btDynamicsWorld_getDispatcher_0=function(){return(ic=b._emscripten_bind_btDynamicsWorld_getDispatcher_0=b.asm.oa).apply(null,arguments)},jc=b._emscripten_bind_btDynamicsWorld_rayTest_3=function(){return(jc=b._emscripten_bind_btDynamicsWorld_rayTest_3=b.asm.pa).apply(null,arguments)},kc=b._emscripten_bind_btDynamicsWorld_getPairCache_0=function(){return(kc=b._emscripten_bind_btDynamicsWorld_getPairCache_0=\nb.asm.qa).apply(null,arguments)},lc=b._emscripten_bind_btDynamicsWorld_getDispatchInfo_0=function(){return(lc=b._emscripten_bind_btDynamicsWorld_getDispatchInfo_0=b.asm.ra).apply(null,arguments)},mc=b._emscripten_bind_btDynamicsWorld_addCollisionObject_1=function(){return(mc=b._emscripten_bind_btDynamicsWorld_addCollisionObject_1=b.asm.sa).apply(null,arguments)},nc=b._emscripten_bind_btDynamicsWorld_addCollisionObject_2=function(){return(nc=b._emscripten_bind_btDynamicsWorld_addCollisionObject_2=\nb.asm.ta).apply(null,arguments)},oc=b._emscripten_bind_btDynamicsWorld_addCollisionObject_3=function(){return(oc=b._emscripten_bind_btDynamicsWorld_addCollisionObject_3=b.asm.ua).apply(null,arguments)},pc=b._emscripten_bind_btDynamicsWorld_removeCollisionObject_1=function(){return(pc=b._emscripten_bind_btDynamicsWorld_removeCollisionObject_1=b.asm.va).apply(null,arguments)},qc=b._emscripten_bind_btDynamicsWorld_getBroadphase_0=function(){return(qc=b._emscripten_bind_btDynamicsWorld_getBroadphase_0=\nb.asm.wa).apply(null,arguments)},rc=b._emscripten_bind_btDynamicsWorld_convexSweepTest_5=function(){return(rc=b._emscripten_bind_btDynamicsWorld_convexSweepTest_5=b.asm.xa).apply(null,arguments)},sc=b._emscripten_bind_btDynamicsWorld_contactPairTest_3=function(){return(sc=b._emscripten_bind_btDynamicsWorld_contactPairTest_3=b.asm.ya).apply(null,arguments)},tc=b._emscripten_bind_btDynamicsWorld_contactTest_2=function(){return(tc=b._emscripten_bind_btDynamicsWorld_contactTest_2=b.asm.za).apply(null,\narguments)},uc=b._emscripten_bind_btDynamicsWorld_updateSingleAabb_1=function(){return(uc=b._emscripten_bind_btDynamicsWorld_updateSingleAabb_1=b.asm.Aa).apply(null,arguments)},vc=b._emscripten_bind_btDynamicsWorld_setDebugDrawer_1=function(){return(vc=b._emscripten_bind_btDynamicsWorld_setDebugDrawer_1=b.asm.Ba).apply(null,arguments)},wc=b._emscripten_bind_btDynamicsWorld_getDebugDrawer_0=function(){return(wc=b._emscripten_bind_btDynamicsWorld_getDebugDrawer_0=b.asm.Ca).apply(null,arguments)},xc=\nb._emscripten_bind_btDynamicsWorld_debugDrawWorld_0=function(){return(xc=b._emscripten_bind_btDynamicsWorld_debugDrawWorld_0=b.asm.Da).apply(null,arguments)},yc=b._emscripten_bind_btDynamicsWorld_debugDrawObject_3=function(){return(yc=b._emscripten_bind_btDynamicsWorld_debugDrawObject_3=b.asm.Ea).apply(null,arguments)},zc=b._emscripten_bind_btDynamicsWorld___destroy___0=function(){return(zc=b._emscripten_bind_btDynamicsWorld___destroy___0=b.asm.Fa).apply(null,arguments)},Ac=b._emscripten_bind_btTypedConstraint_enableFeedback_1=\nfunction(){return(Ac=b._emscripten_bind_btTypedConstraint_enableFeedback_1=b.asm.Ga).apply(null,arguments)},Bc=b._emscripten_bind_btTypedConstraint_getBreakingImpulseThreshold_0=function(){return(Bc=b._emscripten_bind_btTypedConstraint_getBreakingImpulseThreshold_0=b.asm.Ha).apply(null,arguments)},Cc=b._emscripten_bind_btTypedConstraint_setBreakingImpulseThreshold_1=function(){return(Cc=b._emscripten_bind_btTypedConstraint_setBreakingImpulseThreshold_1=b.asm.Ia).apply(null,arguments)},Dc=b._emscripten_bind_btTypedConstraint_getParam_2=\nfunction(){return(Dc=b._emscripten_bind_btTypedConstraint_getParam_2=b.asm.Ja).apply(null,arguments)},Ec=b._emscripten_bind_btTypedConstraint_setParam_3=function(){return(Ec=b._emscripten_bind_btTypedConstraint_setParam_3=b.asm.Ka).apply(null,arguments)},Fc=b._emscripten_bind_btTypedConstraint___destroy___0=function(){return(Fc=b._emscripten_bind_btTypedConstraint___destroy___0=b.asm.La).apply(null,arguments)},Gc=b._emscripten_bind_btConcaveShape_setLocalScaling_1=function(){return(Gc=b._emscripten_bind_btConcaveShape_setLocalScaling_1=\nb.asm.Ma).apply(null,arguments)},Hc=b._emscripten_bind_btConcaveShape_getLocalScaling_0=function(){return(Hc=b._emscripten_bind_btConcaveShape_getLocalScaling_0=b.asm.Na).apply(null,arguments)},Ic=b._emscripten_bind_btConcaveShape_calculateLocalInertia_2=function(){return(Ic=b._emscripten_bind_btConcaveShape_calculateLocalInertia_2=b.asm.Oa).apply(null,arguments)},Jc=b._emscripten_bind_btConcaveShape___destroy___0=function(){return(Jc=b._emscripten_bind_btConcaveShape___destroy___0=b.asm.Pa).apply(null,\narguments)},Kc=b._emscripten_bind_btCapsuleShape_btCapsuleShape_2=function(){return(Kc=b._emscripten_bind_btCapsuleShape_btCapsuleShape_2=b.asm.Qa).apply(null,arguments)},Lc=b._emscripten_bind_btCapsuleShape_setMargin_1=function(){return(Lc=b._emscripten_bind_btCapsuleShape_setMargin_1=b.asm.Ra).apply(null,arguments)},Mc=b._emscripten_bind_btCapsuleShape_getMargin_0=function(){return(Mc=b._emscripten_bind_btCapsuleShape_getMargin_0=b.asm.Sa).apply(null,arguments)},Nc=b._emscripten_bind_btCapsuleShape_getUpAxis_0=\nfunction(){return(Nc=b._emscripten_bind_btCapsuleShape_getUpAxis_0=b.asm.Ta).apply(null,arguments)},Oc=b._emscripten_bind_btCapsuleShape_getRadius_0=function(){return(Oc=b._emscripten_bind_btCapsuleShape_getRadius_0=b.asm.Ua).apply(null,arguments)},Pc=b._emscripten_bind_btCapsuleShape_getHalfHeight_0=function(){return(Pc=b._emscripten_bind_btCapsuleShape_getHalfHeight_0=b.asm.Va).apply(null,arguments)},Qc=b._emscripten_bind_btCapsuleShape_setLocalScaling_1=function(){return(Qc=b._emscripten_bind_btCapsuleShape_setLocalScaling_1=\nb.asm.Wa).apply(null,arguments)},Rc=b._emscripten_bind_btCapsuleShape_getLocalScaling_0=function(){return(Rc=b._emscripten_bind_btCapsuleShape_getLocalScaling_0=b.asm.Xa).apply(null,arguments)},Sc=b._emscripten_bind_btCapsuleShape_calculateLocalInertia_2=function(){return(Sc=b._emscripten_bind_btCapsuleShape_calculateLocalInertia_2=b.asm.Ya).apply(null,arguments)},Tc=b._emscripten_bind_btCapsuleShape___destroy___0=function(){return(Tc=b._emscripten_bind_btCapsuleShape___destroy___0=b.asm.Za).apply(null,\narguments)},Uc=b._emscripten_bind_btIDebugDraw_drawLine_3=function(){return(Uc=b._emscripten_bind_btIDebugDraw_drawLine_3=b.asm._a).apply(null,arguments)},Vc=b._emscripten_bind_btIDebugDraw_drawContactPoint_5=function(){return(Vc=b._emscripten_bind_btIDebugDraw_drawContactPoint_5=b.asm.$a).apply(null,arguments)},Wc=b._emscripten_bind_btIDebugDraw_reportErrorWarning_1=function(){return(Wc=b._emscripten_bind_btIDebugDraw_reportErrorWarning_1=b.asm.ab).apply(null,arguments)},Xc=b._emscripten_bind_btIDebugDraw_draw3dText_2=\nfunction(){return(Xc=b._emscripten_bind_btIDebugDraw_draw3dText_2=b.asm.bb).apply(null,arguments)},Yc=b._emscripten_bind_btIDebugDraw_setDebugMode_1=function(){return(Yc=b._emscripten_bind_btIDebugDraw_setDebugMode_1=b.asm.cb).apply(null,arguments)},Zc=b._emscripten_bind_btIDebugDraw_getDebugMode_0=function(){return(Zc=b._emscripten_bind_btIDebugDraw_getDebugMode_0=b.asm.db).apply(null,arguments)},$c=b._emscripten_bind_btIDebugDraw___destroy___0=function(){return($c=b._emscripten_bind_btIDebugDraw___destroy___0=\nb.asm.eb).apply(null,arguments)},ad=b._emscripten_bind_btDefaultCollisionConfiguration_btDefaultCollisionConfiguration_0=function(){return(ad=b._emscripten_bind_btDefaultCollisionConfiguration_btDefaultCollisionConfiguration_0=b.asm.fb).apply(null,arguments)},bd=b._emscripten_bind_btDefaultCollisionConfiguration_btDefaultCollisionConfiguration_1=function(){return(bd=b._emscripten_bind_btDefaultCollisionConfiguration_btDefaultCollisionConfiguration_1=b.asm.gb).apply(null,arguments)},cd=b._emscripten_bind_btDefaultCollisionConfiguration___destroy___0=\nfunction(){return(cd=b._emscripten_bind_btDefaultCollisionConfiguration___destroy___0=b.asm.hb).apply(null,arguments)},dd=b._emscripten_bind_btTriangleMeshShape_setLocalScaling_1=function(){return(dd=b._emscripten_bind_btTriangleMeshShape_setLocalScaling_1=b.asm.ib).apply(null,arguments)},ed=b._emscripten_bind_btTriangleMeshShape_getLocalScaling_0=function(){return(ed=b._emscripten_bind_btTriangleMeshShape_getLocalScaling_0=b.asm.jb).apply(null,arguments)},fd=b._emscripten_bind_btTriangleMeshShape_calculateLocalInertia_2=\nfunction(){return(fd=b._emscripten_bind_btTriangleMeshShape_calculateLocalInertia_2=b.asm.kb).apply(null,arguments)},gd=b._emscripten_bind_btTriangleMeshShape___destroy___0=function(){return(gd=b._emscripten_bind_btTriangleMeshShape___destroy___0=b.asm.lb).apply(null,arguments)},hd=b._emscripten_bind_btGhostObject_btGhostObject_0=function(){return(hd=b._emscripten_bind_btGhostObject_btGhostObject_0=b.asm.mb).apply(null,arguments)},id=b._emscripten_bind_btGhostObject_getNumOverlappingObjects_0=function(){return(id=\nb._emscripten_bind_btGhostObject_getNumOverlappingObjects_0=b.asm.nb).apply(null,arguments)},jd=b._emscripten_bind_btGhostObject_getOverlappingObject_1=function(){return(jd=b._emscripten_bind_btGhostObject_getOverlappingObject_1=b.asm.ob).apply(null,arguments)},kd=b._emscripten_bind_btGhostObject_setAnisotropicFriction_2=function(){return(kd=b._emscripten_bind_btGhostObject_setAnisotropicFriction_2=b.asm.pb).apply(null,arguments)},ld=b._emscripten_bind_btGhostObject_getCollisionShape_0=function(){return(ld=\nb._emscripten_bind_btGhostObject_getCollisionShape_0=b.asm.qb).apply(null,arguments)},md=b._emscripten_bind_btGhostObject_setContactProcessingThreshold_1=function(){return(md=b._emscripten_bind_btGhostObject_setContactProcessingThreshold_1=b.asm.rb).apply(null,arguments)},nd=b._emscripten_bind_btGhostObject_setActivationState_1=function(){return(nd=b._emscripten_bind_btGhostObject_setActivationState_1=b.asm.sb).apply(null,arguments)},od=b._emscripten_bind_btGhostObject_forceActivationState_1=function(){return(od=\nb._emscripten_bind_btGhostObject_forceActivationState_1=b.asm.tb).apply(null,arguments)},pd=b._emscripten_bind_btGhostObject_activate_0=function(){return(pd=b._emscripten_bind_btGhostObject_activate_0=b.asm.ub).apply(null,arguments)},qd=b._emscripten_bind_btGhostObject_activate_1=function(){return(qd=b._emscripten_bind_btGhostObject_activate_1=b.asm.vb).apply(null,arguments)},rd=b._emscripten_bind_btGhostObject_isActive_0=function(){return(rd=b._emscripten_bind_btGhostObject_isActive_0=b.asm.wb).apply(null,\narguments)},sd=b._emscripten_bind_btGhostObject_isKinematicObject_0=function(){return(sd=b._emscripten_bind_btGhostObject_isKinematicObject_0=b.asm.xb).apply(null,arguments)},td=b._emscripten_bind_btGhostObject_isStaticObject_0=function(){return(td=b._emscripten_bind_btGhostObject_isStaticObject_0=b.asm.yb).apply(null,arguments)},ud=b._emscripten_bind_btGhostObject_isStaticOrKinematicObject_0=function(){return(ud=b._emscripten_bind_btGhostObject_isStaticOrKinematicObject_0=b.asm.zb).apply(null,arguments)},\nvd=b._emscripten_bind_btGhostObject_getRestitution_0=function(){return(vd=b._emscripten_bind_btGhostObject_getRestitution_0=b.asm.Ab).apply(null,arguments)},wd=b._emscripten_bind_btGhostObject_getFriction_0=function(){return(wd=b._emscripten_bind_btGhostObject_getFriction_0=b.asm.Bb).apply(null,arguments)},xd=b._emscripten_bind_btGhostObject_getRollingFriction_0=function(){return(xd=b._emscripten_bind_btGhostObject_getRollingFriction_0=b.asm.Cb).apply(null,arguments)},yd=b._emscripten_bind_btGhostObject_setRestitution_1=\nfunction(){return(yd=b._emscripten_bind_btGhostObject_setRestitution_1=b.asm.Db).apply(null,arguments)},zd=b._emscripten_bind_btGhostObject_setFriction_1=function(){return(zd=b._emscripten_bind_btGhostObject_setFriction_1=b.asm.Eb).apply(null,arguments)},Ad=b._emscripten_bind_btGhostObject_setRollingFriction_1=function(){return(Ad=b._emscripten_bind_btGhostObject_setRollingFriction_1=b.asm.Fb).apply(null,arguments)},Bd=b._emscripten_bind_btGhostObject_getWorldTransform_0=function(){return(Bd=b._emscripten_bind_btGhostObject_getWorldTransform_0=\nb.asm.Gb).apply(null,arguments)},Cd=b._emscripten_bind_btGhostObject_getCollisionFlags_0=function(){return(Cd=b._emscripten_bind_btGhostObject_getCollisionFlags_0=b.asm.Hb).apply(null,arguments)},Dd=b._emscripten_bind_btGhostObject_setCollisionFlags_1=function(){return(Dd=b._emscripten_bind_btGhostObject_setCollisionFlags_1=b.asm.Ib).apply(null,arguments)},Ed=b._emscripten_bind_btGhostObject_setWorldTransform_1=function(){return(Ed=b._emscripten_bind_btGhostObject_setWorldTransform_1=b.asm.Jb).apply(null,\narguments)},Fd=b._emscripten_bind_btGhostObject_setCollisionShape_1=function(){return(Fd=b._emscripten_bind_btGhostObject_setCollisionShape_1=b.asm.Kb).apply(null,arguments)},Gd=b._emscripten_bind_btGhostObject_setCcdMotionThreshold_1=function(){return(Gd=b._emscripten_bind_btGhostObject_setCcdMotionThreshold_1=b.asm.Lb).apply(null,arguments)},Hd=b._emscripten_bind_btGhostObject_setCcdSweptSphereRadius_1=function(){return(Hd=b._emscripten_bind_btGhostObject_setCcdSweptSphereRadius_1=b.asm.Mb).apply(null,\narguments)},Id=b._emscripten_bind_btGhostObject_getUserIndex_0=function(){return(Id=b._emscripten_bind_btGhostObject_getUserIndex_0=b.asm.Nb).apply(null,arguments)},Jd=b._emscripten_bind_btGhostObject_setUserIndex_1=function(){return(Jd=b._emscripten_bind_btGhostObject_setUserIndex_1=b.asm.Ob).apply(null,arguments)},Kd=b._emscripten_bind_btGhostObject_getUserPointer_0=function(){return(Kd=b._emscripten_bind_btGhostObject_getUserPointer_0=b.asm.Pb).apply(null,arguments)},Ld=b._emscripten_bind_btGhostObject_setUserPointer_1=\nfunction(){return(Ld=b._emscripten_bind_btGhostObject_setUserPointer_1=b.asm.Qb).apply(null,arguments)},Md=b._emscripten_bind_btGhostObject_getBroadphaseHandle_0=function(){return(Md=b._emscripten_bind_btGhostObject_getBroadphaseHandle_0=b.asm.Rb).apply(null,arguments)},Nd=b._emscripten_bind_btGhostObject___destroy___0=function(){return(Nd=b._emscripten_bind_btGhostObject___destroy___0=b.asm.Sb).apply(null,arguments)},Od=b._emscripten_bind_btConeShape_btConeShape_2=function(){return(Od=b._emscripten_bind_btConeShape_btConeShape_2=\nb.asm.Tb).apply(null,arguments)},Pd=b._emscripten_bind_btConeShape_setLocalScaling_1=function(){return(Pd=b._emscripten_bind_btConeShape_setLocalScaling_1=b.asm.Ub).apply(null,arguments)},Qd=b._emscripten_bind_btConeShape_getLocalScaling_0=function(){return(Qd=b._emscripten_bind_btConeShape_getLocalScaling_0=b.asm.Vb).apply(null,arguments)},Rd=b._emscripten_bind_btConeShape_calculateLocalInertia_2=function(){return(Rd=b._emscripten_bind_btConeShape_calculateLocalInertia_2=b.asm.Wb).apply(null,arguments)},\nSd=b._emscripten_bind_btConeShape___destroy___0=function(){return(Sd=b._emscripten_bind_btConeShape___destroy___0=b.asm.Xb).apply(null,arguments)},Td=b._emscripten_bind_btActionInterface_updateAction_2=function(){return(Td=b._emscripten_bind_btActionInterface_updateAction_2=b.asm.Yb).apply(null,arguments)},Ud=b._emscripten_bind_btActionInterface___destroy___0=function(){return(Ud=b._emscripten_bind_btActionInterface___destroy___0=b.asm.Zb).apply(null,arguments)},Vd=b._emscripten_bind_btVector3_btVector3_0=\nfunction(){return(Vd=b._emscripten_bind_btVector3_btVector3_0=b.asm._b).apply(null,arguments)},Wd=b._emscripten_bind_btVector3_btVector3_3=function(){return(Wd=b._emscripten_bind_btVector3_btVector3_3=b.asm.$b).apply(null,arguments)},Xd=b._emscripten_bind_btVector3_length_0=function(){return(Xd=b._emscripten_bind_btVector3_length_0=b.asm.ac).apply(null,arguments)},Yd=b._emscripten_bind_btVector3_x_0=function(){return(Yd=b._emscripten_bind_btVector3_x_0=b.asm.bc).apply(null,arguments)},Zd=b._emscripten_bind_btVector3_y_0=\nfunction(){return(Zd=b._emscripten_bind_btVector3_y_0=b.asm.cc).apply(null,arguments)},$d=b._emscripten_bind_btVector3_z_0=function(){return($d=b._emscripten_bind_btVector3_z_0=b.asm.dc).apply(null,arguments)},ae=b._emscripten_bind_btVector3_setX_1=function(){return(ae=b._emscripten_bind_btVector3_setX_1=b.asm.ec).apply(null,arguments)},be=b._emscripten_bind_btVector3_setY_1=function(){return(be=b._emscripten_bind_btVector3_setY_1=b.asm.fc).apply(null,arguments)},ce=b._emscripten_bind_btVector3_setZ_1=\nfunction(){return(ce=b._emscripten_bind_btVector3_setZ_1=b.asm.gc).apply(null,arguments)},de=b._emscripten_bind_btVector3_setValue_3=function(){return(de=b._emscripten_bind_btVector3_setValue_3=b.asm.hc).apply(null,arguments)},ee=b._emscripten_bind_btVector3_normalize_0=function(){return(ee=b._emscripten_bind_btVector3_normalize_0=b.asm.ic).apply(null,arguments)},fe=b._emscripten_bind_btVector3_rotate_2=function(){return(fe=b._emscripten_bind_btVector3_rotate_2=b.asm.jc).apply(null,arguments)},ge=\nb._emscripten_bind_btVector3_dot_1=function(){return(ge=b._emscripten_bind_btVector3_dot_1=b.asm.kc).apply(null,arguments)},he=b._emscripten_bind_btVector3_op_mul_1=function(){return(he=b._emscripten_bind_btVector3_op_mul_1=b.asm.lc).apply(null,arguments)},ie=b._emscripten_bind_btVector3_op_add_1=function(){return(ie=b._emscripten_bind_btVector3_op_add_1=b.asm.mc).apply(null,arguments)},je=b._emscripten_bind_btVector3_op_sub_1=function(){return(je=b._emscripten_bind_btVector3_op_sub_1=b.asm.nc).apply(null,\narguments)},ke=b._emscripten_bind_btVector3___destroy___0=function(){return(ke=b._emscripten_bind_btVector3___destroy___0=b.asm.oc).apply(null,arguments)},le=b._emscripten_bind_btVehicleRaycaster_castRay_3=function(){return(le=b._emscripten_bind_btVehicleRaycaster_castRay_3=b.asm.pc).apply(null,arguments)},me=b._emscripten_bind_btVehicleRaycaster___destroy___0=function(){return(me=b._emscripten_bind_btVehicleRaycaster___destroy___0=b.asm.qc).apply(null,arguments)},ne=b._emscripten_bind_btQuadWord_x_0=\nfunction(){return(ne=b._emscripten_bind_btQuadWord_x_0=b.asm.rc).apply(null,arguments)},oe=b._emscripten_bind_btQuadWord_y_0=function(){return(oe=b._emscripten_bind_btQuadWord_y_0=b.asm.sc).apply(null,arguments)},pe=b._emscripten_bind_btQuadWord_z_0=function(){return(pe=b._emscripten_bind_btQuadWord_z_0=b.asm.tc).apply(null,arguments)},qe=b._emscripten_bind_btQuadWord_w_0=function(){return(qe=b._emscripten_bind_btQuadWord_w_0=b.asm.uc).apply(null,arguments)},re=b._emscripten_bind_btQuadWord_setX_1=\nfunction(){return(re=b._emscripten_bind_btQuadWord_setX_1=b.asm.vc).apply(null,arguments)},se=b._emscripten_bind_btQuadWord_setY_1=function(){return(se=b._emscripten_bind_btQuadWord_setY_1=b.asm.wc).apply(null,arguments)},te=b._emscripten_bind_btQuadWord_setZ_1=function(){return(te=b._emscripten_bind_btQuadWord_setZ_1=b.asm.xc).apply(null,arguments)},ue=b._emscripten_bind_btQuadWord_setW_1=function(){return(ue=b._emscripten_bind_btQuadWord_setW_1=b.asm.yc).apply(null,arguments)},ve=b._emscripten_bind_btQuadWord___destroy___0=\nfunction(){return(ve=b._emscripten_bind_btQuadWord___destroy___0=b.asm.zc).apply(null,arguments)},we=b._emscripten_bind_btCylinderShape_btCylinderShape_1=function(){return(we=b._emscripten_bind_btCylinderShape_btCylinderShape_1=b.asm.Ac).apply(null,arguments)},xe=b._emscripten_bind_btCylinderShape_setMargin_1=function(){return(xe=b._emscripten_bind_btCylinderShape_setMargin_1=b.asm.Bc).apply(null,arguments)},ye=b._emscripten_bind_btCylinderShape_getMargin_0=function(){return(ye=b._emscripten_bind_btCylinderShape_getMargin_0=\nb.asm.Cc).apply(null,arguments)},ze=b._emscripten_bind_btCylinderShape_setLocalScaling_1=function(){return(ze=b._emscripten_bind_btCylinderShape_setLocalScaling_1=b.asm.Dc).apply(null,arguments)},Ae=b._emscripten_bind_btCylinderShape_getLocalScaling_0=function(){return(Ae=b._emscripten_bind_btCylinderShape_getLocalScaling_0=b.asm.Ec).apply(null,arguments)},Be=b._emscripten_bind_btCylinderShape_calculateLocalInertia_2=function(){return(Be=b._emscripten_bind_btCylinderShape_calculateLocalInertia_2=\nb.asm.Fc).apply(null,arguments)},Ce=b._emscripten_bind_btCylinderShape___destroy___0=function(){return(Ce=b._emscripten_bind_btCylinderShape___destroy___0=b.asm.Gc).apply(null,arguments)},De=b._emscripten_bind_btDiscreteDynamicsWorld_btDiscreteDynamicsWorld_4=function(){return(De=b._emscripten_bind_btDiscreteDynamicsWorld_btDiscreteDynamicsWorld_4=b.asm.Hc).apply(null,arguments)},Ee=b._emscripten_bind_btDiscreteDynamicsWorld_setGravity_1=function(){return(Ee=b._emscripten_bind_btDiscreteDynamicsWorld_setGravity_1=\nb.asm.Ic).apply(null,arguments)},Fe=b._emscripten_bind_btDiscreteDynamicsWorld_getGravity_0=function(){return(Fe=b._emscripten_bind_btDiscreteDynamicsWorld_getGravity_0=b.asm.Jc).apply(null,arguments)},Ge=b._emscripten_bind_btDiscreteDynamicsWorld_addRigidBody_1=function(){return(Ge=b._emscripten_bind_btDiscreteDynamicsWorld_addRigidBody_1=b.asm.Kc).apply(null,arguments)},He=b._emscripten_bind_btDiscreteDynamicsWorld_addRigidBody_3=function(){return(He=b._emscripten_bind_btDiscreteDynamicsWorld_addRigidBody_3=\nb.asm.Lc).apply(null,arguments)},Ie=b._emscripten_bind_btDiscreteDynamicsWorld_removeRigidBody_1=function(){return(Ie=b._emscripten_bind_btDiscreteDynamicsWorld_removeRigidBody_1=b.asm.Mc).apply(null,arguments)},Je=b._emscripten_bind_btDiscreteDynamicsWorld_addConstraint_1=function(){return(Je=b._emscripten_bind_btDiscreteDynamicsWorld_addConstraint_1=b.asm.Nc).apply(null,arguments)},Ke=b._emscripten_bind_btDiscreteDynamicsWorld_addConstraint_2=function(){return(Ke=b._emscripten_bind_btDiscreteDynamicsWorld_addConstraint_2=\nb.asm.Oc).apply(null,arguments)},Le=b._emscripten_bind_btDiscreteDynamicsWorld_removeConstraint_1=function(){return(Le=b._emscripten_bind_btDiscreteDynamicsWorld_removeConstraint_1=b.asm.Pc).apply(null,arguments)},Me=b._emscripten_bind_btDiscreteDynamicsWorld_stepSimulation_1=function(){return(Me=b._emscripten_bind_btDiscreteDynamicsWorld_stepSimulation_1=b.asm.Qc).apply(null,arguments)},Ne=b._emscripten_bind_btDiscreteDynamicsWorld_stepSimulation_2=function(){return(Ne=b._emscripten_bind_btDiscreteDynamicsWorld_stepSimulation_2=\nb.asm.Rc).apply(null,arguments)},Oe=b._emscripten_bind_btDiscreteDynamicsWorld_stepSimulation_3=function(){return(Oe=b._emscripten_bind_btDiscreteDynamicsWorld_stepSimulation_3=b.asm.Sc).apply(null,arguments)},Pe=b._emscripten_bind_btDiscreteDynamicsWorld_setContactAddedCallback_1=function(){return(Pe=b._emscripten_bind_btDiscreteDynamicsWorld_setContactAddedCallback_1=b.asm.Tc).apply(null,arguments)},Qe=b._emscripten_bind_btDiscreteDynamicsWorld_setContactProcessedCallback_1=function(){return(Qe=\nb._emscripten_bind_btDiscreteDynamicsWorld_setContactProcessedCallback_1=b.asm.Uc).apply(null,arguments)},Re=b._emscripten_bind_btDiscreteDynamicsWorld_setContactDestroyedCallback_1=function(){return(Re=b._emscripten_bind_btDiscreteDynamicsWorld_setContactDestroyedCallback_1=b.asm.Vc).apply(null,arguments)},Se=b._emscripten_bind_btDiscreteDynamicsWorld_getDispatcher_0=function(){return(Se=b._emscripten_bind_btDiscreteDynamicsWorld_getDispatcher_0=b.asm.Wc).apply(null,arguments)},Te=b._emscripten_bind_btDiscreteDynamicsWorld_rayTest_3=\nfunction(){return(Te=b._emscripten_bind_btDiscreteDynamicsWorld_rayTest_3=b.asm.Xc).apply(null,arguments)},Ue=b._emscripten_bind_btDiscreteDynamicsWorld_getPairCache_0=function(){return(Ue=b._emscripten_bind_btDiscreteDynamicsWorld_getPairCache_0=b.asm.Yc).apply(null,arguments)},Ve=b._emscripten_bind_btDiscreteDynamicsWorld_getDispatchInfo_0=function(){return(Ve=b._emscripten_bind_btDiscreteDynamicsWorld_getDispatchInfo_0=b.asm.Zc).apply(null,arguments)},We=b._emscripten_bind_btDiscreteDynamicsWorld_addCollisionObject_1=\nfunction(){return(We=b._emscripten_bind_btDiscreteDynamicsWorld_addCollisionObject_1=b.asm._c).apply(null,arguments)},Xe=b._emscripten_bind_btDiscreteDynamicsWorld_addCollisionObject_2=function(){return(Xe=b._emscripten_bind_btDiscreteDynamicsWorld_addCollisionObject_2=b.asm.$c).apply(null,arguments)},Ye=b._emscripten_bind_btDiscreteDynamicsWorld_addCollisionObject_3=function(){return(Ye=b._emscripten_bind_btDiscreteDynamicsWorld_addCollisionObject_3=b.asm.ad).apply(null,arguments)},Ze=b._emscripten_bind_btDiscreteDynamicsWorld_removeCollisionObject_1=\nfunction(){return(Ze=b._emscripten_bind_btDiscreteDynamicsWorld_removeCollisionObject_1=b.asm.bd).apply(null,arguments)},$e=b._emscripten_bind_btDiscreteDynamicsWorld_getBroadphase_0=function(){return($e=b._emscripten_bind_btDiscreteDynamicsWorld_getBroadphase_0=b.asm.cd).apply(null,arguments)},af=b._emscripten_bind_btDiscreteDynamicsWorld_convexSweepTest_5=function(){return(af=b._emscripten_bind_btDiscreteDynamicsWorld_convexSweepTest_5=b.asm.dd).apply(null,arguments)},bf=b._emscripten_bind_btDiscreteDynamicsWorld_contactPairTest_3=\nfunction(){return(bf=b._emscripten_bind_btDiscreteDynamicsWorld_contactPairTest_3=b.asm.ed).apply(null,arguments)},cf=b._emscripten_bind_btDiscreteDynamicsWorld_contactTest_2=function(){return(cf=b._emscripten_bind_btDiscreteDynamicsWorld_contactTest_2=b.asm.fd).apply(null,arguments)},df=b._emscripten_bind_btDiscreteDynamicsWorld_updateSingleAabb_1=function(){return(df=b._emscripten_bind_btDiscreteDynamicsWorld_updateSingleAabb_1=b.asm.gd).apply(null,arguments)},ef=b._emscripten_bind_btDiscreteDynamicsWorld_setDebugDrawer_1=\nfunction(){return(ef=b._emscripten_bind_btDiscreteDynamicsWorld_setDebugDrawer_1=b.asm.hd).apply(null,arguments)},ff=b._emscripten_bind_btDiscreteDynamicsWorld_getDebugDrawer_0=function(){return(ff=b._emscripten_bind_btDiscreteDynamicsWorld_getDebugDrawer_0=b.asm.id).apply(null,arguments)},gf=b._emscripten_bind_btDiscreteDynamicsWorld_debugDrawWorld_0=function(){return(gf=b._emscripten_bind_btDiscreteDynamicsWorld_debugDrawWorld_0=b.asm.jd).apply(null,arguments)},hf=b._emscripten_bind_btDiscreteDynamicsWorld_debugDrawObject_3=\nfunction(){return(hf=b._emscripten_bind_btDiscreteDynamicsWorld_debugDrawObject_3=b.asm.kd).apply(null,arguments)},jf=b._emscripten_bind_btDiscreteDynamicsWorld_addAction_1=function(){return(jf=b._emscripten_bind_btDiscreteDynamicsWorld_addAction_1=b.asm.ld).apply(null,arguments)},kf=b._emscripten_bind_btDiscreteDynamicsWorld_removeAction_1=function(){return(kf=b._emscripten_bind_btDiscreteDynamicsWorld_removeAction_1=b.asm.md).apply(null,arguments)},lf=b._emscripten_bind_btDiscreteDynamicsWorld_getSolverInfo_0=\nfunction(){return(lf=b._emscripten_bind_btDiscreteDynamicsWorld_getSolverInfo_0=b.asm.nd).apply(null,arguments)},mf=b._emscripten_bind_btDiscreteDynamicsWorld_setInternalTickCallback_1=function(){return(mf=b._emscripten_bind_btDiscreteDynamicsWorld_setInternalTickCallback_1=b.asm.od).apply(null,arguments)},nf=b._emscripten_bind_btDiscreteDynamicsWorld_setInternalTickCallback_2=function(){return(nf=b._emscripten_bind_btDiscreteDynamicsWorld_setInternalTickCallback_2=b.asm.pd).apply(null,arguments)},\nof=b._emscripten_bind_btDiscreteDynamicsWorld_setInternalTickCallback_3=function(){return(of=b._emscripten_bind_btDiscreteDynamicsWorld_setInternalTickCallback_3=b.asm.qd).apply(null,arguments)},pf=b._emscripten_bind_btDiscreteDynamicsWorld___destroy___0=function(){return(pf=b._emscripten_bind_btDiscreteDynamicsWorld___destroy___0=b.asm.rd).apply(null,arguments)},qf=b._emscripten_bind_btConvexShape_setLocalScaling_1=function(){return(qf=b._emscripten_bind_btConvexShape_setLocalScaling_1=b.asm.sd).apply(null,\narguments)},rf=b._emscripten_bind_btConvexShape_getLocalScaling_0=function(){return(rf=b._emscripten_bind_btConvexShape_getLocalScaling_0=b.asm.td).apply(null,arguments)},sf=b._emscripten_bind_btConvexShape_calculateLocalInertia_2=function(){return(sf=b._emscripten_bind_btConvexShape_calculateLocalInertia_2=b.asm.ud).apply(null,arguments)},tf=b._emscripten_bind_btConvexShape_setMargin_1=function(){return(tf=b._emscripten_bind_btConvexShape_setMargin_1=b.asm.vd).apply(null,arguments)},uf=b._emscripten_bind_btConvexShape_getMargin_0=\nfunction(){return(uf=b._emscripten_bind_btConvexShape_getMargin_0=b.asm.wd).apply(null,arguments)},vf=b._emscripten_bind_btConvexShape___destroy___0=function(){return(vf=b._emscripten_bind_btConvexShape___destroy___0=b.asm.xd).apply(null,arguments)},wf=b._emscripten_bind_btDispatcher_getNumManifolds_0=function(){return(wf=b._emscripten_bind_btDispatcher_getNumManifolds_0=b.asm.yd).apply(null,arguments)},xf=b._emscripten_bind_btDispatcher_getManifoldByIndexInternal_1=function(){return(xf=b._emscripten_bind_btDispatcher_getManifoldByIndexInternal_1=\nb.asm.zd).apply(null,arguments)},yf=b._emscripten_bind_btDispatcher___destroy___0=function(){return(yf=b._emscripten_bind_btDispatcher___destroy___0=b.asm.Ad).apply(null,arguments)},zf=b._emscripten_bind_btGeneric6DofConstraint_btGeneric6DofConstraint_3=function(){return(zf=b._emscripten_bind_btGeneric6DofConstraint_btGeneric6DofConstraint_3=b.asm.Bd).apply(null,arguments)},Af=b._emscripten_bind_btGeneric6DofConstraint_btGeneric6DofConstraint_5=function(){return(Af=b._emscripten_bind_btGeneric6DofConstraint_btGeneric6DofConstraint_5=\nb.asm.Cd).apply(null,arguments)},Bf=b._emscripten_bind_btGeneric6DofConstraint_setLinearLowerLimit_1=function(){return(Bf=b._emscripten_bind_btGeneric6DofConstraint_setLinearLowerLimit_1=b.asm.Dd).apply(null,arguments)},Cf=b._emscripten_bind_btGeneric6DofConstraint_setLinearUpperLimit_1=function(){return(Cf=b._emscripten_bind_btGeneric6DofConstraint_setLinearUpperLimit_1=b.asm.Ed).apply(null,arguments)},Df=b._emscripten_bind_btGeneric6DofConstraint_setAngularLowerLimit_1=function(){return(Df=b._emscripten_bind_btGeneric6DofConstraint_setAngularLowerLimit_1=\nb.asm.Fd).apply(null,arguments)},Ef=b._emscripten_bind_btGeneric6DofConstraint_setAngularUpperLimit_1=function(){return(Ef=b._emscripten_bind_btGeneric6DofConstraint_setAngularUpperLimit_1=b.asm.Gd).apply(null,arguments)},Ff=b._emscripten_bind_btGeneric6DofConstraint_getFrameOffsetA_0=function(){return(Ff=b._emscripten_bind_btGeneric6DofConstraint_getFrameOffsetA_0=b.asm.Hd).apply(null,arguments)},Gf=b._emscripten_bind_btGeneric6DofConstraint_enableFeedback_1=function(){return(Gf=b._emscripten_bind_btGeneric6DofConstraint_enableFeedback_1=\nb.asm.Id).apply(null,arguments)},Hf=b._emscripten_bind_btGeneric6DofConstraint_getBreakingImpulseThreshold_0=function(){return(Hf=b._emscripten_bind_btGeneric6DofConstraint_getBreakingImpulseThreshold_0=b.asm.Jd).apply(null,arguments)},If=b._emscripten_bind_btGeneric6DofConstraint_setBreakingImpulseThreshold_1=function(){return(If=b._emscripten_bind_btGeneric6DofConstraint_setBreakingImpulseThreshold_1=b.asm.Kd).apply(null,arguments)},Jf=b._emscripten_bind_btGeneric6DofConstraint_getParam_2=function(){return(Jf=\nb._emscripten_bind_btGeneric6DofConstraint_getParam_2=b.asm.Ld).apply(null,arguments)},Kf=b._emscripten_bind_btGeneric6DofConstraint_setParam_3=function(){return(Kf=b._emscripten_bind_btGeneric6DofConstraint_setParam_3=b.asm.Md).apply(null,arguments)},Lf=b._emscripten_bind_btGeneric6DofConstraint___destroy___0=function(){return(Lf=b._emscripten_bind_btGeneric6DofConstraint___destroy___0=b.asm.Nd).apply(null,arguments)},Mf=b._emscripten_bind_btStridingMeshInterface_setScaling_1=function(){return(Mf=\nb._emscripten_bind_btStridingMeshInterface_setScaling_1=b.asm.Od).apply(null,arguments)},Nf=b._emscripten_bind_btStridingMeshInterface___destroy___0=function(){return(Nf=b._emscripten_bind_btStridingMeshInterface___destroy___0=b.asm.Pd).apply(null,arguments)},Of=b._emscripten_bind_btMotionState_getWorldTransform_1=function(){return(Of=b._emscripten_bind_btMotionState_getWorldTransform_1=b.asm.Qd).apply(null,arguments)},Pf=b._emscripten_bind_btMotionState_setWorldTransform_1=function(){return(Pf=b._emscripten_bind_btMotionState_setWorldTransform_1=\nb.asm.Rd).apply(null,arguments)},Qf=b._emscripten_bind_btMotionState___destroy___0=function(){return(Qf=b._emscripten_bind_btMotionState___destroy___0=b.asm.Sd).apply(null,arguments)},Rf=b._emscripten_bind_ConvexResultCallback_hasHit_0=function(){return(Rf=b._emscripten_bind_ConvexResultCallback_hasHit_0=b.asm.Td).apply(null,arguments)},Sf=b._emscripten_bind_ConvexResultCallback_get_m_collisionFilterGroup_0=function(){return(Sf=b._emscripten_bind_ConvexResultCallback_get_m_collisionFilterGroup_0=\nb.asm.Ud).apply(null,arguments)},Tf=b._emscripten_bind_ConvexResultCallback_set_m_collisionFilterGroup_1=function(){return(Tf=b._emscripten_bind_ConvexResultCallback_set_m_collisionFilterGroup_1=b.asm.Vd).apply(null,arguments)},Uf=b._emscripten_bind_ConvexResultCallback_get_m_collisionFilterMask_0=function(){return(Uf=b._emscripten_bind_ConvexResultCallback_get_m_collisionFilterMask_0=b.asm.Wd).apply(null,arguments)},Vf=b._emscripten_bind_ConvexResultCallback_set_m_collisionFilterMask_1=function(){return(Vf=\nb._emscripten_bind_ConvexResultCallback_set_m_collisionFilterMask_1=b.asm.Xd).apply(null,arguments)},Wf=b._emscripten_bind_ConvexResultCallback_get_m_closestHitFraction_0=function(){return(Wf=b._emscripten_bind_ConvexResultCallback_get_m_closestHitFraction_0=b.asm.Yd).apply(null,arguments)},Xf=b._emscripten_bind_ConvexResultCallback_set_m_closestHitFraction_1=function(){return(Xf=b._emscripten_bind_ConvexResultCallback_set_m_closestHitFraction_1=b.asm.Zd).apply(null,arguments)},Yf=b._emscripten_bind_ConvexResultCallback___destroy___0=\nfunction(){return(Yf=b._emscripten_bind_ConvexResultCallback___destroy___0=b.asm._d).apply(null,arguments)},Zf=b._emscripten_bind_ContactResultCallback_addSingleResult_7=function(){return(Zf=b._emscripten_bind_ContactResultCallback_addSingleResult_7=b.asm.$d).apply(null,arguments)},$f=b._emscripten_bind_ContactResultCallback___destroy___0=function(){return($f=b._emscripten_bind_ContactResultCallback___destroy___0=b.asm.ae).apply(null,arguments)},ag=b._emscripten_bind_btSoftBodySolver___destroy___0=\nfunction(){return(ag=b._emscripten_bind_btSoftBodySolver___destroy___0=b.asm.be).apply(null,arguments)},bg=b._emscripten_bind_RayResultCallback_hasHit_0=function(){return(bg=b._emscripten_bind_RayResultCallback_hasHit_0=b.asm.ce).apply(null,arguments)},cg=b._emscripten_bind_RayResultCallback_get_m_collisionFilterGroup_0=function(){return(cg=b._emscripten_bind_RayResultCallback_get_m_collisionFilterGroup_0=b.asm.de).apply(null,arguments)},dg=b._emscripten_bind_RayResultCallback_set_m_collisionFilterGroup_1=\nfunction(){return(dg=b._emscripten_bind_RayResultCallback_set_m_collisionFilterGroup_1=b.asm.ee).apply(null,arguments)},eg=b._emscripten_bind_RayResultCallback_get_m_collisionFilterMask_0=function(){return(eg=b._emscripten_bind_RayResultCallback_get_m_collisionFilterMask_0=b.asm.fe).apply(null,arguments)},fg=b._emscripten_bind_RayResultCallback_set_m_collisionFilterMask_1=function(){return(fg=b._emscripten_bind_RayResultCallback_set_m_collisionFilterMask_1=b.asm.ge).apply(null,arguments)},gg=b._emscripten_bind_RayResultCallback_get_m_closestHitFraction_0=\nfunction(){return(gg=b._emscripten_bind_RayResultCallback_get_m_closestHitFraction_0=b.asm.he).apply(null,arguments)},hg=b._emscripten_bind_RayResultCallback_set_m_closestHitFraction_1=function(){return(hg=b._emscripten_bind_RayResultCallback_set_m_closestHitFraction_1=b.asm.ie).apply(null,arguments)},ig=b._emscripten_bind_RayResultCallback_get_m_collisionObject_0=function(){return(ig=b._emscripten_bind_RayResultCallback_get_m_collisionObject_0=b.asm.je).apply(null,arguments)},jg=b._emscripten_bind_RayResultCallback_set_m_collisionObject_1=\nfunction(){return(jg=b._emscripten_bind_RayResultCallback_set_m_collisionObject_1=b.asm.ke).apply(null,arguments)},kg=b._emscripten_bind_RayResultCallback___destroy___0=function(){return(kg=b._emscripten_bind_RayResultCallback___destroy___0=b.asm.le).apply(null,arguments)},lg=b._emscripten_bind_btMatrix3x3_setEulerZYX_3=function(){return(lg=b._emscripten_bind_btMatrix3x3_setEulerZYX_3=b.asm.me).apply(null,arguments)},mg=b._emscripten_bind_btMatrix3x3_getRotation_1=function(){return(mg=b._emscripten_bind_btMatrix3x3_getRotation_1=\nb.asm.ne).apply(null,arguments)},ng=b._emscripten_bind_btMatrix3x3_getRow_1=function(){return(ng=b._emscripten_bind_btMatrix3x3_getRow_1=b.asm.oe).apply(null,arguments)},og=b._emscripten_bind_btMatrix3x3___destroy___0=function(){return(og=b._emscripten_bind_btMatrix3x3___destroy___0=b.asm.pe).apply(null,arguments)},pg=b._emscripten_bind_btScalarArray_size_0=function(){return(pg=b._emscripten_bind_btScalarArray_size_0=b.asm.qe).apply(null,arguments)},qg=b._emscripten_bind_btScalarArray_at_1=function(){return(qg=\nb._emscripten_bind_btScalarArray_at_1=b.asm.re).apply(null,arguments)},rg=b._emscripten_bind_btScalarArray___destroy___0=function(){return(rg=b._emscripten_bind_btScalarArray___destroy___0=b.asm.se).apply(null,arguments)},sg=b._emscripten_bind_Material_get_m_kLST_0=function(){return(sg=b._emscripten_bind_Material_get_m_kLST_0=b.asm.te).apply(null,arguments)},tg=b._emscripten_bind_Material_set_m_kLST_1=function(){return(tg=b._emscripten_bind_Material_set_m_kLST_1=b.asm.ue).apply(null,arguments)},ug=\nb._emscripten_bind_Material_get_m_kAST_0=function(){return(ug=b._emscripten_bind_Material_get_m_kAST_0=b.asm.ve).apply(null,arguments)},vg=b._emscripten_bind_Material_set_m_kAST_1=function(){return(vg=b._emscripten_bind_Material_set_m_kAST_1=b.asm.we).apply(null,arguments)},wg=b._emscripten_bind_Material_get_m_kVST_0=function(){return(wg=b._emscripten_bind_Material_get_m_kVST_0=b.asm.xe).apply(null,arguments)},xg=b._emscripten_bind_Material_set_m_kVST_1=function(){return(xg=b._emscripten_bind_Material_set_m_kVST_1=\nb.asm.ye).apply(null,arguments)},yg=b._emscripten_bind_Material_get_m_flags_0=function(){return(yg=b._emscripten_bind_Material_get_m_flags_0=b.asm.ze).apply(null,arguments)},zg=b._emscripten_bind_Material_set_m_flags_1=function(){return(zg=b._emscripten_bind_Material_set_m_flags_1=b.asm.Ae).apply(null,arguments)},Ag=b._emscripten_bind_Material___destroy___0=function(){return(Ag=b._emscripten_bind_Material___destroy___0=b.asm.Be).apply(null,arguments)},Bg=b._emscripten_bind_btDispatcherInfo_get_m_timeStep_0=\nfunction(){return(Bg=b._emscripten_bind_btDispatcherInfo_get_m_timeStep_0=b.asm.Ce).apply(null,arguments)},Cg=b._emscripten_bind_btDispatcherInfo_set_m_timeStep_1=function(){return(Cg=b._emscripten_bind_btDispatcherInfo_set_m_timeStep_1=b.asm.De).apply(null,arguments)},Dg=b._emscripten_bind_btDispatcherInfo_get_m_stepCount_0=function(){return(Dg=b._emscripten_bind_btDispatcherInfo_get_m_stepCount_0=b.asm.Ee).apply(null,arguments)},Eg=b._emscripten_bind_btDispatcherInfo_set_m_stepCount_1=function(){return(Eg=\nb._emscripten_bind_btDispatcherInfo_set_m_stepCount_1=b.asm.Fe).apply(null,arguments)},Fg=b._emscripten_bind_btDispatcherInfo_get_m_dispatchFunc_0=function(){return(Fg=b._emscripten_bind_btDispatcherInfo_get_m_dispatchFunc_0=b.asm.Ge).apply(null,arguments)},Gg=b._emscripten_bind_btDispatcherInfo_set_m_dispatchFunc_1=function(){return(Gg=b._emscripten_bind_btDispatcherInfo_set_m_dispatchFunc_1=b.asm.He).apply(null,arguments)},Hg=b._emscripten_bind_btDispatcherInfo_get_m_timeOfImpact_0=function(){return(Hg=\nb._emscripten_bind_btDispatcherInfo_get_m_timeOfImpact_0=b.asm.Ie).apply(null,arguments)},Ig=b._emscripten_bind_btDispatcherInfo_set_m_timeOfImpact_1=function(){return(Ig=b._emscripten_bind_btDispatcherInfo_set_m_timeOfImpact_1=b.asm.Je).apply(null,arguments)},Jg=b._emscripten_bind_btDispatcherInfo_get_m_useContinuous_0=function(){return(Jg=b._emscripten_bind_btDispatcherInfo_get_m_useContinuous_0=b.asm.Ke).apply(null,arguments)},Kg=b._emscripten_bind_btDispatcherInfo_set_m_useContinuous_1=function(){return(Kg=\nb._emscripten_bind_btDispatcherInfo_set_m_useContinuous_1=b.asm.Le).apply(null,arguments)},Lg=b._emscripten_bind_btDispatcherInfo_get_m_enableSatConvex_0=function(){return(Lg=b._emscripten_bind_btDispatcherInfo_get_m_enableSatConvex_0=b.asm.Me).apply(null,arguments)},Mg=b._emscripten_bind_btDispatcherInfo_set_m_enableSatConvex_1=function(){return(Mg=b._emscripten_bind_btDispatcherInfo_set_m_enableSatConvex_1=b.asm.Ne).apply(null,arguments)},Ng=b._emscripten_bind_btDispatcherInfo_get_m_enableSPU_0=\nfunction(){return(Ng=b._emscripten_bind_btDispatcherInfo_get_m_enableSPU_0=b.asm.Oe).apply(null,arguments)},Og=b._emscripten_bind_btDispatcherInfo_set_m_enableSPU_1=function(){return(Og=b._emscripten_bind_btDispatcherInfo_set_m_enableSPU_1=b.asm.Pe).apply(null,arguments)},Pg=b._emscripten_bind_btDispatcherInfo_get_m_useEpa_0=function(){return(Pg=b._emscripten_bind_btDispatcherInfo_get_m_useEpa_0=b.asm.Qe).apply(null,arguments)},Qg=b._emscripten_bind_btDispatcherInfo_set_m_useEpa_1=function(){return(Qg=\nb._emscripten_bind_btDispatcherInfo_set_m_useEpa_1=b.asm.Re).apply(null,arguments)},Rg=b._emscripten_bind_btDispatcherInfo_get_m_allowedCcdPenetration_0=function(){return(Rg=b._emscripten_bind_btDispatcherInfo_get_m_allowedCcdPenetration_0=b.asm.Se).apply(null,arguments)},Sg=b._emscripten_bind_btDispatcherInfo_set_m_allowedCcdPenetration_1=function(){return(Sg=b._emscripten_bind_btDispatcherInfo_set_m_allowedCcdPenetration_1=b.asm.Te).apply(null,arguments)},Tg=b._emscripten_bind_btDispatcherInfo_get_m_useConvexConservativeDistanceUtil_0=\nfunction(){return(Tg=b._emscripten_bind_btDispatcherInfo_get_m_useConvexConservativeDistanceUtil_0=b.asm.Ue).apply(null,arguments)},Ug=b._emscripten_bind_btDispatcherInfo_set_m_useConvexConservativeDistanceUtil_1=function(){return(Ug=b._emscripten_bind_btDispatcherInfo_set_m_useConvexConservativeDistanceUtil_1=b.asm.Ve).apply(null,arguments)},Vg=b._emscripten_bind_btDispatcherInfo_get_m_convexConservativeDistanceThreshold_0=function(){return(Vg=b._emscripten_bind_btDispatcherInfo_get_m_convexConservativeDistanceThreshold_0=\nb.asm.We).apply(null,arguments)},Wg=b._emscripten_bind_btDispatcherInfo_set_m_convexConservativeDistanceThreshold_1=function(){return(Wg=b._emscripten_bind_btDispatcherInfo_set_m_convexConservativeDistanceThreshold_1=b.asm.Xe).apply(null,arguments)},Xg=b._emscripten_bind_btDispatcherInfo___destroy___0=function(){return(Xg=b._emscripten_bind_btDispatcherInfo___destroy___0=b.asm.Ye).apply(null,arguments)},Yg=b._emscripten_bind_btWheelInfoConstructionInfo_get_m_chassisConnectionCS_0=function(){return(Yg=\nb._emscripten_bind_btWheelInfoConstructionInfo_get_m_chassisConnectionCS_0=b.asm.Ze).apply(null,arguments)},Zg=b._emscripten_bind_btWheelInfoConstructionInfo_set_m_chassisConnectionCS_1=function(){return(Zg=b._emscripten_bind_btWheelInfoConstructionInfo_set_m_chassisConnectionCS_1=b.asm._e).apply(null,arguments)},$g=b._emscripten_bind_btWheelInfoConstructionInfo_get_m_wheelDirectionCS_0=function(){return($g=b._emscripten_bind_btWheelInfoConstructionInfo_get_m_wheelDirectionCS_0=b.asm.$e).apply(null,\narguments)},ah=b._emscripten_bind_btWheelInfoConstructionInfo_set_m_wheelDirectionCS_1=function(){return(ah=b._emscripten_bind_btWheelInfoConstructionInfo_set_m_wheelDirectionCS_1=b.asm.af).apply(null,arguments)},bh=b._emscripten_bind_btWheelInfoConstructionInfo_get_m_wheelAxleCS_0=function(){return(bh=b._emscripten_bind_btWheelInfoConstructionInfo_get_m_wheelAxleCS_0=b.asm.bf).apply(null,arguments)},ch=b._emscripten_bind_btWheelInfoConstructionInfo_set_m_wheelAxleCS_1=function(){return(ch=b._emscripten_bind_btWheelInfoConstructionInfo_set_m_wheelAxleCS_1=\nb.asm.cf).apply(null,arguments)},dh=b._emscripten_bind_btWheelInfoConstructionInfo_get_m_suspensionRestLength_0=function(){return(dh=b._emscripten_bind_btWheelInfoConstructionInfo_get_m_suspensionRestLength_0=b.asm.df).apply(null,arguments)},eh=b._emscripten_bind_btWheelInfoConstructionInfo_set_m_suspensionRestLength_1=function(){return(eh=b._emscripten_bind_btWheelInfoConstructionInfo_set_m_suspensionRestLength_1=b.asm.ef).apply(null,arguments)},fh=b._emscripten_bind_btWheelInfoConstructionInfo_get_m_maxSuspensionTravelCm_0=\nfunction(){return(fh=b._emscripten_bind_btWheelInfoConstructionInfo_get_m_maxSuspensionTravelCm_0=b.asm.ff).apply(null,arguments)},gh=b._emscripten_bind_btWheelInfoConstructionInfo_set_m_maxSuspensionTravelCm_1=function(){return(gh=b._emscripten_bind_btWheelInfoConstructionInfo_set_m_maxSuspensionTravelCm_1=b.asm.gf).apply(null,arguments)},hh=b._emscripten_bind_btWheelInfoConstructionInfo_get_m_wheelRadius_0=function(){return(hh=b._emscripten_bind_btWheelInfoConstructionInfo_get_m_wheelRadius_0=b.asm.hf).apply(null,\narguments)},ih=b._emscripten_bind_btWheelInfoConstructionInfo_set_m_wheelRadius_1=function(){return(ih=b._emscripten_bind_btWheelInfoConstructionInfo_set_m_wheelRadius_1=b.asm.jf).apply(null,arguments)},jh=b._emscripten_bind_btWheelInfoConstructionInfo_get_m_suspensionStiffness_0=function(){return(jh=b._emscripten_bind_btWheelInfoConstructionInfo_get_m_suspensionStiffness_0=b.asm.kf).apply(null,arguments)},kh=b._emscripten_bind_btWheelInfoConstructionInfo_set_m_suspensionStiffness_1=function(){return(kh=\nb._emscripten_bind_btWheelInfoConstructionInfo_set_m_suspensionStiffness_1=b.asm.lf).apply(null,arguments)},lh=b._emscripten_bind_btWheelInfoConstructionInfo_get_m_wheelsDampingCompression_0=function(){return(lh=b._emscripten_bind_btWheelInfoConstructionInfo_get_m_wheelsDampingCompression_0=b.asm.mf).apply(null,arguments)},mh=b._emscripten_bind_btWheelInfoConstructionInfo_set_m_wheelsDampingCompression_1=function(){return(mh=b._emscripten_bind_btWheelInfoConstructionInfo_set_m_wheelsDampingCompression_1=\nb.asm.nf).apply(null,arguments)},nh=b._emscripten_bind_btWheelInfoConstructionInfo_get_m_wheelsDampingRelaxation_0=function(){return(nh=b._emscripten_bind_btWheelInfoConstructionInfo_get_m_wheelsDampingRelaxation_0=b.asm.of).apply(null,arguments)},oh=b._emscripten_bind_btWheelInfoConstructionInfo_set_m_wheelsDampingRelaxation_1=function(){return(oh=b._emscripten_bind_btWheelInfoConstructionInfo_set_m_wheelsDampingRelaxation_1=b.asm.pf).apply(null,arguments)},ph=b._emscripten_bind_btWheelInfoConstructionInfo_get_m_frictionSlip_0=\nfunction(){return(ph=b._emscripten_bind_btWheelInfoConstructionInfo_get_m_frictionSlip_0=b.asm.qf).apply(null,arguments)},qh=b._emscripten_bind_btWheelInfoConstructionInfo_set_m_frictionSlip_1=function(){return(qh=b._emscripten_bind_btWheelInfoConstructionInfo_set_m_frictionSlip_1=b.asm.rf).apply(null,arguments)},rh=b._emscripten_bind_btWheelInfoConstructionInfo_get_m_maxSuspensionForce_0=function(){return(rh=b._emscripten_bind_btWheelInfoConstructionInfo_get_m_maxSuspensionForce_0=b.asm.sf).apply(null,\narguments)},sh=b._emscripten_bind_btWheelInfoConstructionInfo_set_m_maxSuspensionForce_1=function(){return(sh=b._emscripten_bind_btWheelInfoConstructionInfo_set_m_maxSuspensionForce_1=b.asm.tf).apply(null,arguments)},th=b._emscripten_bind_btWheelInfoConstructionInfo_get_m_bIsFrontWheel_0=function(){return(th=b._emscripten_bind_btWheelInfoConstructionInfo_get_m_bIsFrontWheel_0=b.asm.uf).apply(null,arguments)},uh=b._emscripten_bind_btWheelInfoConstructionInfo_set_m_bIsFrontWheel_1=function(){return(uh=\nb._emscripten_bind_btWheelInfoConstructionInfo_set_m_bIsFrontWheel_1=b.asm.vf).apply(null,arguments)},vh=b._emscripten_bind_btWheelInfoConstructionInfo___destroy___0=function(){return(vh=b._emscripten_bind_btWheelInfoConstructionInfo___destroy___0=b.asm.wf).apply(null,arguments)},wh=b._emscripten_bind_btConvexTriangleMeshShape_btConvexTriangleMeshShape_1=function(){return(wh=b._emscripten_bind_btConvexTriangleMeshShape_btConvexTriangleMeshShape_1=b.asm.xf).apply(null,arguments)},xh=b._emscripten_bind_btConvexTriangleMeshShape_btConvexTriangleMeshShape_2=\nfunction(){return(xh=b._emscripten_bind_btConvexTriangleMeshShape_btConvexTriangleMeshShape_2=b.asm.yf).apply(null,arguments)},yh=b._emscripten_bind_btConvexTriangleMeshShape_setLocalScaling_1=function(){return(yh=b._emscripten_bind_btConvexTriangleMeshShape_setLocalScaling_1=b.asm.zf).apply(null,arguments)},zh=b._emscripten_bind_btConvexTriangleMeshShape_getLocalScaling_0=function(){return(zh=b._emscripten_bind_btConvexTriangleMeshShape_getLocalScaling_0=b.asm.Af).apply(null,arguments)},Ah=b._emscripten_bind_btConvexTriangleMeshShape_calculateLocalInertia_2=\nfunction(){return(Ah=b._emscripten_bind_btConvexTriangleMeshShape_calculateLocalInertia_2=b.asm.Bf).apply(null,arguments)},Bh=b._emscripten_bind_btConvexTriangleMeshShape_setMargin_1=function(){return(Bh=b._emscripten_bind_btConvexTriangleMeshShape_setMargin_1=b.asm.Cf).apply(null,arguments)},Ch=b._emscripten_bind_btConvexTriangleMeshShape_getMargin_0=function(){return(Ch=b._emscripten_bind_btConvexTriangleMeshShape_getMargin_0=b.asm.Df).apply(null,arguments)},Dh=b._emscripten_bind_btConvexTriangleMeshShape___destroy___0=\nfunction(){return(Dh=b._emscripten_bind_btConvexTriangleMeshShape___destroy___0=b.asm.Ef).apply(null,arguments)},Eh=b._emscripten_bind_btBroadphaseInterface_getOverlappingPairCache_0=function(){return(Eh=b._emscripten_bind_btBroadphaseInterface_getOverlappingPairCache_0=b.asm.Ff).apply(null,arguments)},Fh=b._emscripten_bind_btBroadphaseInterface___destroy___0=function(){return(Fh=b._emscripten_bind_btBroadphaseInterface___destroy___0=b.asm.Gf).apply(null,arguments)},Gh=b._emscripten_bind_btRigidBodyConstructionInfo_btRigidBodyConstructionInfo_3=\nfunction(){return(Gh=b._emscripten_bind_btRigidBodyConstructionInfo_btRigidBodyConstructionInfo_3=b.asm.Hf).apply(null,arguments)},Hh=b._emscripten_bind_btRigidBodyConstructionInfo_btRigidBodyConstructionInfo_4=function(){return(Hh=b._emscripten_bind_btRigidBodyConstructionInfo_btRigidBodyConstructionInfo_4=b.asm.If).apply(null,arguments)},Ih=b._emscripten_bind_btRigidBodyConstructionInfo_get_m_linearDamping_0=function(){return(Ih=b._emscripten_bind_btRigidBodyConstructionInfo_get_m_linearDamping_0=\nb.asm.Jf).apply(null,arguments)},Jh=b._emscripten_bind_btRigidBodyConstructionInfo_set_m_linearDamping_1=function(){return(Jh=b._emscripten_bind_btRigidBodyConstructionInfo_set_m_linearDamping_1=b.asm.Kf).apply(null,arguments)},Kh=b._emscripten_bind_btRigidBodyConstructionInfo_get_m_angularDamping_0=function(){return(Kh=b._emscripten_bind_btRigidBodyConstructionInfo_get_m_angularDamping_0=b.asm.Lf).apply(null,arguments)},Lh=b._emscripten_bind_btRigidBodyConstructionInfo_set_m_angularDamping_1=function(){return(Lh=\nb._emscripten_bind_btRigidBodyConstructionInfo_set_m_angularDamping_1=b.asm.Mf).apply(null,arguments)},Mh=b._emscripten_bind_btRigidBodyConstructionInfo_get_m_friction_0=function(){return(Mh=b._emscripten_bind_btRigidBodyConstructionInfo_get_m_friction_0=b.asm.Nf).apply(null,arguments)},Nh=b._emscripten_bind_btRigidBodyConstructionInfo_set_m_friction_1=function(){return(Nh=b._emscripten_bind_btRigidBodyConstructionInfo_set_m_friction_1=b.asm.Of).apply(null,arguments)},Oh=b._emscripten_bind_btRigidBodyConstructionInfo_get_m_rollingFriction_0=\nfunction(){return(Oh=b._emscripten_bind_btRigidBodyConstructionInfo_get_m_rollingFriction_0=b.asm.Pf).apply(null,arguments)},Ph=b._emscripten_bind_btRigidBodyConstructionInfo_set_m_rollingFriction_1=function(){return(Ph=b._emscripten_bind_btRigidBodyConstructionInfo_set_m_rollingFriction_1=b.asm.Qf).apply(null,arguments)},Qh=b._emscripten_bind_btRigidBodyConstructionInfo_get_m_restitution_0=function(){return(Qh=b._emscripten_bind_btRigidBodyConstructionInfo_get_m_restitution_0=b.asm.Rf).apply(null,\narguments)},Rh=b._emscripten_bind_btRigidBodyConstructionInfo_set_m_restitution_1=function(){return(Rh=b._emscripten_bind_btRigidBodyConstructionInfo_set_m_restitution_1=b.asm.Sf).apply(null,arguments)},Sh=b._emscripten_bind_btRigidBodyConstructionInfo_get_m_linearSleepingThreshold_0=function(){return(Sh=b._emscripten_bind_btRigidBodyConstructionInfo_get_m_linearSleepingThreshold_0=b.asm.Tf).apply(null,arguments)},Th=b._emscripten_bind_btRigidBodyConstructionInfo_set_m_linearSleepingThreshold_1=function(){return(Th=\nb._emscripten_bind_btRigidBodyConstructionInfo_set_m_linearSleepingThreshold_1=b.asm.Uf).apply(null,arguments)},Uh=b._emscripten_bind_btRigidBodyConstructionInfo_get_m_angularSleepingThreshold_0=function(){return(Uh=b._emscripten_bind_btRigidBodyConstructionInfo_get_m_angularSleepingThreshold_0=b.asm.Vf).apply(null,arguments)},Vh=b._emscripten_bind_btRigidBodyConstructionInfo_set_m_angularSleepingThreshold_1=function(){return(Vh=b._emscripten_bind_btRigidBodyConstructionInfo_set_m_angularSleepingThreshold_1=\nb.asm.Wf).apply(null,arguments)},Wh=b._emscripten_bind_btRigidBodyConstructionInfo_get_m_additionalDamping_0=function(){return(Wh=b._emscripten_bind_btRigidBodyConstructionInfo_get_m_additionalDamping_0=b.asm.Xf).apply(null,arguments)},Xh=b._emscripten_bind_btRigidBodyConstructionInfo_set_m_additionalDamping_1=function(){return(Xh=b._emscripten_bind_btRigidBodyConstructionInfo_set_m_additionalDamping_1=b.asm.Yf).apply(null,arguments)},Yh=b._emscripten_bind_btRigidBodyConstructionInfo_get_m_additionalDampingFactor_0=\nfunction(){return(Yh=b._emscripten_bind_btRigidBodyConstructionInfo_get_m_additionalDampingFactor_0=b.asm.Zf).apply(null,arguments)},Zh=b._emscripten_bind_btRigidBodyConstructionInfo_set_m_additionalDampingFactor_1=function(){return(Zh=b._emscripten_bind_btRigidBodyConstructionInfo_set_m_additionalDampingFactor_1=b.asm._f).apply(null,arguments)},$h=b._emscripten_bind_btRigidBodyConstructionInfo_get_m_additionalLinearDampingThresholdSqr_0=function(){return($h=b._emscripten_bind_btRigidBodyConstructionInfo_get_m_additionalLinearDampingThresholdSqr_0=\nb.asm.$f).apply(null,arguments)},ai=b._emscripten_bind_btRigidBodyConstructionInfo_set_m_additionalLinearDampingThresholdSqr_1=function(){return(ai=b._emscripten_bind_btRigidBodyConstructionInfo_set_m_additionalLinearDampingThresholdSqr_1=b.asm.ag).apply(null,arguments)},bi=b._emscripten_bind_btRigidBodyConstructionInfo_get_m_additionalAngularDampingThresholdSqr_0=function(){return(bi=b._emscripten_bind_btRigidBodyConstructionInfo_get_m_additionalAngularDampingThresholdSqr_0=b.asm.bg).apply(null,\narguments)},ci=b._emscripten_bind_btRigidBodyConstructionInfo_set_m_additionalAngularDampingThresholdSqr_1=function(){return(ci=b._emscripten_bind_btRigidBodyConstructionInfo_set_m_additionalAngularDampingThresholdSqr_1=b.asm.cg).apply(null,arguments)},di=b._emscripten_bind_btRigidBodyConstructionInfo_get_m_additionalAngularDampingFactor_0=function(){return(di=b._emscripten_bind_btRigidBodyConstructionInfo_get_m_additionalAngularDampingFactor_0=b.asm.dg).apply(null,arguments)},ei=b._emscripten_bind_btRigidBodyConstructionInfo_set_m_additionalAngularDampingFactor_1=\nfunction(){return(ei=b._emscripten_bind_btRigidBodyConstructionInfo_set_m_additionalAngularDampingFactor_1=b.asm.eg).apply(null,arguments)},fi=b._emscripten_bind_btRigidBodyConstructionInfo___destroy___0=function(){return(fi=b._emscripten_bind_btRigidBodyConstructionInfo___destroy___0=b.asm.fg).apply(null,arguments)},gi=b._emscripten_bind_btCollisionConfiguration___destroy___0=function(){return(gi=b._emscripten_bind_btCollisionConfiguration___destroy___0=b.asm.gg).apply(null,arguments)},hi=b._emscripten_bind_btPersistentManifold_btPersistentManifold_0=\nfunction(){return(hi=b._emscripten_bind_btPersistentManifold_btPersistentManifold_0=b.asm.hg).apply(null,arguments)},ii=b._emscripten_bind_btPersistentManifold_getBody0_0=function(){return(ii=b._emscripten_bind_btPersistentManifold_getBody0_0=b.asm.ig).apply(null,arguments)},ji=b._emscripten_bind_btPersistentManifold_getBody1_0=function(){return(ji=b._emscripten_bind_btPersistentManifold_getBody1_0=b.asm.jg).apply(null,arguments)},ki=b._emscripten_bind_btPersistentManifold_getNumContacts_0=function(){return(ki=\nb._emscripten_bind_btPersistentManifold_getNumContacts_0=b.asm.kg).apply(null,arguments)},li=b._emscripten_bind_btPersistentManifold_getContactPoint_1=function(){return(li=b._emscripten_bind_btPersistentManifold_getContactPoint_1=b.asm.lg).apply(null,arguments)},mi=b._emscripten_bind_btPersistentManifold___destroy___0=function(){return(mi=b._emscripten_bind_btPersistentManifold___destroy___0=b.asm.mg).apply(null,arguments)},ni=b._emscripten_bind_btCompoundShape_btCompoundShape_0=function(){return(ni=\nb._emscripten_bind_btCompoundShape_btCompoundShape_0=b.asm.ng).apply(null,arguments)},oi=b._emscripten_bind_btCompoundShape_btCompoundShape_1=function(){return(oi=b._emscripten_bind_btCompoundShape_btCompoundShape_1=b.asm.og).apply(null,arguments)},pi=b._emscripten_bind_btCompoundShape_addChildShape_2=function(){return(pi=b._emscripten_bind_btCompoundShape_addChildShape_2=b.asm.pg).apply(null,arguments)},qi=b._emscripten_bind_btCompoundShape_removeChildShape_1=function(){return(qi=b._emscripten_bind_btCompoundShape_removeChildShape_1=\nb.asm.qg).apply(null,arguments)},ri=b._emscripten_bind_btCompoundShape_removeChildShapeByIndex_1=function(){return(ri=b._emscripten_bind_btCompoundShape_removeChildShapeByIndex_1=b.asm.rg).apply(null,arguments)},si=b._emscripten_bind_btCompoundShape_getNumChildShapes_0=function(){return(si=b._emscripten_bind_btCompoundShape_getNumChildShapes_0=b.asm.sg).apply(null,arguments)},ti=b._emscripten_bind_btCompoundShape_getChildShape_1=function(){return(ti=b._emscripten_bind_btCompoundShape_getChildShape_1=\nb.asm.tg).apply(null,arguments)},ui=b._emscripten_bind_btCompoundShape_updateChildTransform_2=function(){return(ui=b._emscripten_bind_btCompoundShape_updateChildTransform_2=b.asm.ug).apply(null,arguments)},vi=b._emscripten_bind_btCompoundShape_updateChildTransform_3=function(){return(vi=b._emscripten_bind_btCompoundShape_updateChildTransform_3=b.asm.vg).apply(null,arguments)},wi=b._emscripten_bind_btCompoundShape_setMargin_1=function(){return(wi=b._emscripten_bind_btCompoundShape_setMargin_1=b.asm.wg).apply(null,\narguments)},xi=b._emscripten_bind_btCompoundShape_getMargin_0=function(){return(xi=b._emscripten_bind_btCompoundShape_getMargin_0=b.asm.xg).apply(null,arguments)},yi=b._emscripten_bind_btCompoundShape_setLocalScaling_1=function(){return(yi=b._emscripten_bind_btCompoundShape_setLocalScaling_1=b.asm.yg).apply(null,arguments)},zi=b._emscripten_bind_btCompoundShape_getLocalScaling_0=function(){return(zi=b._emscripten_bind_btCompoundShape_getLocalScaling_0=b.asm.zg).apply(null,arguments)},Ai=b._emscripten_bind_btCompoundShape_calculateLocalInertia_2=\nfunction(){return(Ai=b._emscripten_bind_btCompoundShape_calculateLocalInertia_2=b.asm.Ag).apply(null,arguments)},Bi=b._emscripten_bind_btCompoundShape___destroy___0=function(){return(Bi=b._emscripten_bind_btCompoundShape___destroy___0=b.asm.Bg).apply(null,arguments)},Ci=b._emscripten_bind_ClosestConvexResultCallback_ClosestConvexResultCallback_2=function(){return(Ci=b._emscripten_bind_ClosestConvexResultCallback_ClosestConvexResultCallback_2=b.asm.Cg).apply(null,arguments)},Di=b._emscripten_bind_ClosestConvexResultCallback_hasHit_0=\nfunction(){return(Di=b._emscripten_bind_ClosestConvexResultCallback_hasHit_0=b.asm.Dg).apply(null,arguments)},Ei=b._emscripten_bind_ClosestConvexResultCallback_get_m_convexFromWorld_0=function(){return(Ei=b._emscripten_bind_ClosestConvexResultCallback_get_m_convexFromWorld_0=b.asm.Eg).apply(null,arguments)},Fi=b._emscripten_bind_ClosestConvexResultCallback_set_m_convexFromWorld_1=function(){return(Fi=b._emscripten_bind_ClosestConvexResultCallback_set_m_convexFromWorld_1=b.asm.Fg).apply(null,arguments)},\nGi=b._emscripten_bind_ClosestConvexResultCallback_get_m_convexToWorld_0=function(){return(Gi=b._emscripten_bind_ClosestConvexResultCallback_get_m_convexToWorld_0=b.asm.Gg).apply(null,arguments)},Hi=b._emscripten_bind_ClosestConvexResultCallback_set_m_convexToWorld_1=function(){return(Hi=b._emscripten_bind_ClosestConvexResultCallback_set_m_convexToWorld_1=b.asm.Hg).apply(null,arguments)},Ii=b._emscripten_bind_ClosestConvexResultCallback_get_m_hitNormalWorld_0=function(){return(Ii=b._emscripten_bind_ClosestConvexResultCallback_get_m_hitNormalWorld_0=\nb.asm.Ig).apply(null,arguments)},Ji=b._emscripten_bind_ClosestConvexResultCallback_set_m_hitNormalWorld_1=function(){return(Ji=b._emscripten_bind_ClosestConvexResultCallback_set_m_hitNormalWorld_1=b.asm.Jg).apply(null,arguments)},Ki=b._emscripten_bind_ClosestConvexResultCallback_get_m_hitPointWorld_0=function(){return(Ki=b._emscripten_bind_ClosestConvexResultCallback_get_m_hitPointWorld_0=b.asm.Kg).apply(null,arguments)},Li=b._emscripten_bind_ClosestConvexResultCallback_set_m_hitPointWorld_1=function(){return(Li=\nb._emscripten_bind_ClosestConvexResultCallback_set_m_hitPointWorld_1=b.asm.Lg).apply(null,arguments)},Mi=b._emscripten_bind_ClosestConvexResultCallback_get_m_collisionFilterGroup_0=function(){return(Mi=b._emscripten_bind_ClosestConvexResultCallback_get_m_collisionFilterGroup_0=b.asm.Mg).apply(null,arguments)},Ni=b._emscripten_bind_ClosestConvexResultCallback_set_m_collisionFilterGroup_1=function(){return(Ni=b._emscripten_bind_ClosestConvexResultCallback_set_m_collisionFilterGroup_1=b.asm.Ng).apply(null,\narguments)},Oi=b._emscripten_bind_ClosestConvexResultCallback_get_m_collisionFilterMask_0=function(){return(Oi=b._emscripten_bind_ClosestConvexResultCallback_get_m_collisionFilterMask_0=b.asm.Og).apply(null,arguments)},Pi=b._emscripten_bind_ClosestConvexResultCallback_set_m_collisionFilterMask_1=function(){return(Pi=b._emscripten_bind_ClosestConvexResultCallback_set_m_collisionFilterMask_1=b.asm.Pg).apply(null,arguments)},Qi=b._emscripten_bind_ClosestConvexResultCallback_get_m_closestHitFraction_0=\nfunction(){return(Qi=b._emscripten_bind_ClosestConvexResultCallback_get_m_closestHitFraction_0=b.asm.Qg).apply(null,arguments)},Ri=b._emscripten_bind_ClosestConvexResultCallback_set_m_closestHitFraction_1=function(){return(Ri=b._emscripten_bind_ClosestConvexResultCallback_set_m_closestHitFraction_1=b.asm.Rg).apply(null,arguments)},Si=b._emscripten_bind_ClosestConvexResultCallback___destroy___0=function(){return(Si=b._emscripten_bind_ClosestConvexResultCallback___destroy___0=b.asm.Sg).apply(null,arguments)},\nTi=b._emscripten_bind_AllHitsRayResultCallback_AllHitsRayResultCallback_2=function(){return(Ti=b._emscripten_bind_AllHitsRayResultCallback_AllHitsRayResultCallback_2=b.asm.Tg).apply(null,arguments)},Ui=b._emscripten_bind_AllHitsRayResultCallback_hasHit_0=function(){return(Ui=b._emscripten_bind_AllHitsRayResultCallback_hasHit_0=b.asm.Ug).apply(null,arguments)},Vi=b._emscripten_bind_AllHitsRayResultCallback_get_m_collisionObjects_0=function(){return(Vi=b._emscripten_bind_AllHitsRayResultCallback_get_m_collisionObjects_0=\nb.asm.Vg).apply(null,arguments)},Wi=b._emscripten_bind_AllHitsRayResultCallback_set_m_collisionObjects_1=function(){return(Wi=b._emscripten_bind_AllHitsRayResultCallback_set_m_collisionObjects_1=b.asm.Wg).apply(null,arguments)},Xi=b._emscripten_bind_AllHitsRayResultCallback_get_m_rayFromWorld_0=function(){return(Xi=b._emscripten_bind_AllHitsRayResultCallback_get_m_rayFromWorld_0=b.asm.Xg).apply(null,arguments)},Yi=b._emscripten_bind_AllHitsRayResultCallback_set_m_rayFromWorld_1=function(){return(Yi=\nb._emscripten_bind_AllHitsRayResultCallback_set_m_rayFromWorld_1=b.asm.Yg).apply(null,arguments)},Zi=b._emscripten_bind_AllHitsRayResultCallback_get_m_rayToWorld_0=function(){return(Zi=b._emscripten_bind_AllHitsRayResultCallback_get_m_rayToWorld_0=b.asm.Zg).apply(null,arguments)},$i=b._emscripten_bind_AllHitsRayResultCallback_set_m_rayToWorld_1=function(){return($i=b._emscripten_bind_AllHitsRayResultCallback_set_m_rayToWorld_1=b.asm._g).apply(null,arguments)},aj=b._emscripten_bind_AllHitsRayResultCallback_get_m_hitNormalWorld_0=\nfunction(){return(aj=b._emscripten_bind_AllHitsRayResultCallback_get_m_hitNormalWorld_0=b.asm.$g).apply(null,arguments)},bj=b._emscripten_bind_AllHitsRayResultCallback_set_m_hitNormalWorld_1=function(){return(bj=b._emscripten_bind_AllHitsRayResultCallback_set_m_hitNormalWorld_1=b.asm.ah).apply(null,arguments)},cj=b._emscripten_bind_AllHitsRayResultCallback_get_m_hitPointWorld_0=function(){return(cj=b._emscripten_bind_AllHitsRayResultCallback_get_m_hitPointWorld_0=b.asm.bh).apply(null,arguments)},\ndj=b._emscripten_bind_AllHitsRayResultCallback_set_m_hitPointWorld_1=function(){return(dj=b._emscripten_bind_AllHitsRayResultCallback_set_m_hitPointWorld_1=b.asm.ch).apply(null,arguments)},ej=b._emscripten_bind_AllHitsRayResultCallback_get_m_hitFractions_0=function(){return(ej=b._emscripten_bind_AllHitsRayResultCallback_get_m_hitFractions_0=b.asm.dh).apply(null,arguments)},fj=b._emscripten_bind_AllHitsRayResultCallback_set_m_hitFractions_1=function(){return(fj=b._emscripten_bind_AllHitsRayResultCallback_set_m_hitFractions_1=\nb.asm.eh).apply(null,arguments)},gj=b._emscripten_bind_AllHitsRayResultCallback_get_m_collisionFilterGroup_0=function(){return(gj=b._emscripten_bind_AllHitsRayResultCallback_get_m_collisionFilterGroup_0=b.asm.fh).apply(null,arguments)},hj=b._emscripten_bind_AllHitsRayResultCallback_set_m_collisionFilterGroup_1=function(){return(hj=b._emscripten_bind_AllHitsRayResultCallback_set_m_collisionFilterGroup_1=b.asm.gh).apply(null,arguments)},ij=b._emscripten_bind_AllHitsRayResultCallback_get_m_collisionFilterMask_0=\nfunction(){return(ij=b._emscripten_bind_AllHitsRayResultCallback_get_m_collisionFilterMask_0=b.asm.hh).apply(null,arguments)},jj=b._emscripten_bind_AllHitsRayResultCallback_set_m_collisionFilterMask_1=function(){return(jj=b._emscripten_bind_AllHitsRayResultCallback_set_m_collisionFilterMask_1=b.asm.ih).apply(null,arguments)},kj=b._emscripten_bind_AllHitsRayResultCallback_get_m_closestHitFraction_0=function(){return(kj=b._emscripten_bind_AllHitsRayResultCallback_get_m_closestHitFraction_0=b.asm.jh).apply(null,\narguments)},lj=b._emscripten_bind_AllHitsRayResultCallback_set_m_closestHitFraction_1=function(){return(lj=b._emscripten_bind_AllHitsRayResultCallback_set_m_closestHitFraction_1=b.asm.kh).apply(null,arguments)},mj=b._emscripten_bind_AllHitsRayResultCallback_get_m_collisionObject_0=function(){return(mj=b._emscripten_bind_AllHitsRayResultCallback_get_m_collisionObject_0=b.asm.lh).apply(null,arguments)},nj=b._emscripten_bind_AllHitsRayResultCallback_set_m_collisionObject_1=function(){return(nj=b._emscripten_bind_AllHitsRayResultCallback_set_m_collisionObject_1=\nb.asm.mh).apply(null,arguments)},oj=b._emscripten_bind_AllHitsRayResultCallback___destroy___0=function(){return(oj=b._emscripten_bind_AllHitsRayResultCallback___destroy___0=b.asm.nh).apply(null,arguments)},pj=b._emscripten_bind_tMaterialArray_size_0=function(){return(pj=b._emscripten_bind_tMaterialArray_size_0=b.asm.oh).apply(null,arguments)},qj=b._emscripten_bind_tMaterialArray_at_1=function(){return(qj=b._emscripten_bind_tMaterialArray_at_1=b.asm.ph).apply(null,arguments)},rj=b._emscripten_bind_tMaterialArray___destroy___0=\nfunction(){return(rj=b._emscripten_bind_tMaterialArray___destroy___0=b.asm.qh).apply(null,arguments)},sj=b._emscripten_bind_btDefaultVehicleRaycaster_btDefaultVehicleRaycaster_1=function(){return(sj=b._emscripten_bind_btDefaultVehicleRaycaster_btDefaultVehicleRaycaster_1=b.asm.rh).apply(null,arguments)},tj=b._emscripten_bind_btDefaultVehicleRaycaster_castRay_3=function(){return(tj=b._emscripten_bind_btDefaultVehicleRaycaster_castRay_3=b.asm.sh).apply(null,arguments)},uj=b._emscripten_bind_btDefaultVehicleRaycaster___destroy___0=\nfunction(){return(uj=b._emscripten_bind_btDefaultVehicleRaycaster___destroy___0=b.asm.th).apply(null,arguments)},vj=b._emscripten_bind_btEmptyShape_btEmptyShape_0=function(){return(vj=b._emscripten_bind_btEmptyShape_btEmptyShape_0=b.asm.uh).apply(null,arguments)},wj=b._emscripten_bind_btEmptyShape_setLocalScaling_1=function(){return(wj=b._emscripten_bind_btEmptyShape_setLocalScaling_1=b.asm.vh).apply(null,arguments)},xj=b._emscripten_bind_btEmptyShape_getLocalScaling_0=function(){return(xj=b._emscripten_bind_btEmptyShape_getLocalScaling_0=\nb.asm.wh).apply(null,arguments)},yj=b._emscripten_bind_btEmptyShape_calculateLocalInertia_2=function(){return(yj=b._emscripten_bind_btEmptyShape_calculateLocalInertia_2=b.asm.xh).apply(null,arguments)},zj=b._emscripten_bind_btEmptyShape___destroy___0=function(){return(zj=b._emscripten_bind_btEmptyShape___destroy___0=b.asm.yh).apply(null,arguments)},Aj=b._emscripten_bind_btConstraintSetting_btConstraintSetting_0=function(){return(Aj=b._emscripten_bind_btConstraintSetting_btConstraintSetting_0=b.asm.zh).apply(null,\narguments)},Bj=b._emscripten_bind_btConstraintSetting_get_m_tau_0=function(){return(Bj=b._emscripten_bind_btConstraintSetting_get_m_tau_0=b.asm.Ah).apply(null,arguments)},Cj=b._emscripten_bind_btConstraintSetting_set_m_tau_1=function(){return(Cj=b._emscripten_bind_btConstraintSetting_set_m_tau_1=b.asm.Bh).apply(null,arguments)},Dj=b._emscripten_bind_btConstraintSetting_get_m_damping_0=function(){return(Dj=b._emscripten_bind_btConstraintSetting_get_m_damping_0=b.asm.Ch).apply(null,arguments)},Ej=b._emscripten_bind_btConstraintSetting_set_m_damping_1=\nfunction(){return(Ej=b._emscripten_bind_btConstraintSetting_set_m_damping_1=b.asm.Dh).apply(null,arguments)},Fj=b._emscripten_bind_btConstraintSetting_get_m_impulseClamp_0=function(){return(Fj=b._emscripten_bind_btConstraintSetting_get_m_impulseClamp_0=b.asm.Eh).apply(null,arguments)},Gj=b._emscripten_bind_btConstraintSetting_set_m_impulseClamp_1=function(){return(Gj=b._emscripten_bind_btConstraintSetting_set_m_impulseClamp_1=b.asm.Fh).apply(null,arguments)},Hj=b._emscripten_bind_btConstraintSetting___destroy___0=\nfunction(){return(Hj=b._emscripten_bind_btConstraintSetting___destroy___0=b.asm.Gh).apply(null,arguments)},Ij=b._emscripten_bind_LocalShapeInfo_get_m_shapePart_0=function(){return(Ij=b._emscripten_bind_LocalShapeInfo_get_m_shapePart_0=b.asm.Hh).apply(null,arguments)},Jj=b._emscripten_bind_LocalShapeInfo_set_m_shapePart_1=function(){return(Jj=b._emscripten_bind_LocalShapeInfo_set_m_shapePart_1=b.asm.Ih).apply(null,arguments)},Kj=b._emscripten_bind_LocalShapeInfo_get_m_triangleIndex_0=function(){return(Kj=\nb._emscripten_bind_LocalShapeInfo_get_m_triangleIndex_0=b.asm.Jh).apply(null,arguments)},Lj=b._emscripten_bind_LocalShapeInfo_set_m_triangleIndex_1=function(){return(Lj=b._emscripten_bind_LocalShapeInfo_set_m_triangleIndex_1=b.asm.Kh).apply(null,arguments)},Mj=b._emscripten_bind_LocalShapeInfo___destroy___0=function(){return(Mj=b._emscripten_bind_LocalShapeInfo___destroy___0=b.asm.Lh).apply(null,arguments)},Nj=b._emscripten_bind_btRigidBody_btRigidBody_1=function(){return(Nj=b._emscripten_bind_btRigidBody_btRigidBody_1=\nb.asm.Mh).apply(null,arguments)},Oj=b._emscripten_bind_btRigidBody_getCenterOfMassTransform_0=function(){return(Oj=b._emscripten_bind_btRigidBody_getCenterOfMassTransform_0=b.asm.Nh).apply(null,arguments)},Pj=b._emscripten_bind_btRigidBody_setCenterOfMassTransform_1=function(){return(Pj=b._emscripten_bind_btRigidBody_setCenterOfMassTransform_1=b.asm.Oh).apply(null,arguments)},Qj=b._emscripten_bind_btRigidBody_setSleepingThresholds_2=function(){return(Qj=b._emscripten_bind_btRigidBody_setSleepingThresholds_2=\nb.asm.Ph).apply(null,arguments)},Rj=b._emscripten_bind_btRigidBody_getLinearDamping_0=function(){return(Rj=b._emscripten_bind_btRigidBody_getLinearDamping_0=b.asm.Qh).apply(null,arguments)},Sj=b._emscripten_bind_btRigidBody_getAngularDamping_0=function(){return(Sj=b._emscripten_bind_btRigidBody_getAngularDamping_0=b.asm.Rh).apply(null,arguments)},Tj=b._emscripten_bind_btRigidBody_setDamping_2=function(){return(Tj=b._emscripten_bind_btRigidBody_setDamping_2=b.asm.Sh).apply(null,arguments)},Uj=b._emscripten_bind_btRigidBody_setMassProps_2=\nfunction(){return(Uj=b._emscripten_bind_btRigidBody_setMassProps_2=b.asm.Th).apply(null,arguments)},Vj=b._emscripten_bind_btRigidBody_getLinearFactor_0=function(){return(Vj=b._emscripten_bind_btRigidBody_getLinearFactor_0=b.asm.Uh).apply(null,arguments)},Wj=b._emscripten_bind_btRigidBody_setLinearFactor_1=function(){return(Wj=b._emscripten_bind_btRigidBody_setLinearFactor_1=b.asm.Vh).apply(null,arguments)},Xj=b._emscripten_bind_btRigidBody_applyTorque_1=function(){return(Xj=b._emscripten_bind_btRigidBody_applyTorque_1=\nb.asm.Wh).apply(null,arguments)},Yj=b._emscripten_bind_btRigidBody_applyLocalTorque_1=function(){return(Yj=b._emscripten_bind_btRigidBody_applyLocalTorque_1=b.asm.Xh).apply(null,arguments)},Zj=b._emscripten_bind_btRigidBody_applyForce_2=function(){return(Zj=b._emscripten_bind_btRigidBody_applyForce_2=b.asm.Yh).apply(null,arguments)},ak=b._emscripten_bind_btRigidBody_applyCentralForce_1=function(){return(ak=b._emscripten_bind_btRigidBody_applyCentralForce_1=b.asm.Zh).apply(null,arguments)},bk=b._emscripten_bind_btRigidBody_applyCentralLocalForce_1=\nfunction(){return(bk=b._emscripten_bind_btRigidBody_applyCentralLocalForce_1=b.asm._h).apply(null,arguments)},ck=b._emscripten_bind_btRigidBody_applyTorqueImpulse_1=function(){return(ck=b._emscripten_bind_btRigidBody_applyTorqueImpulse_1=b.asm.$h).apply(null,arguments)},dk=b._emscripten_bind_btRigidBody_applyImpulse_2=function(){return(dk=b._emscripten_bind_btRigidBody_applyImpulse_2=b.asm.ai).apply(null,arguments)},ek=b._emscripten_bind_btRigidBody_applyCentralImpulse_1=function(){return(ek=b._emscripten_bind_btRigidBody_applyCentralImpulse_1=\nb.asm.bi).apply(null,arguments)},fk=b._emscripten_bind_btRigidBody_updateInertiaTensor_0=function(){return(fk=b._emscripten_bind_btRigidBody_updateInertiaTensor_0=b.asm.ci).apply(null,arguments)},gk=b._emscripten_bind_btRigidBody_getLinearVelocity_0=function(){return(gk=b._emscripten_bind_btRigidBody_getLinearVelocity_0=b.asm.di).apply(null,arguments)},hk=b._emscripten_bind_btRigidBody_getAngularVelocity_0=function(){return(hk=b._emscripten_bind_btRigidBody_getAngularVelocity_0=b.asm.ei).apply(null,\narguments)},ik=b._emscripten_bind_btRigidBody_setLinearVelocity_1=function(){return(ik=b._emscripten_bind_btRigidBody_setLinearVelocity_1=b.asm.fi).apply(null,arguments)},jk=b._emscripten_bind_btRigidBody_setAngularVelocity_1=function(){return(jk=b._emscripten_bind_btRigidBody_setAngularVelocity_1=b.asm.gi).apply(null,arguments)},kk=b._emscripten_bind_btRigidBody_getMotionState_0=function(){return(kk=b._emscripten_bind_btRigidBody_getMotionState_0=b.asm.hi).apply(null,arguments)},lk=b._emscripten_bind_btRigidBody_setMotionState_1=\nfunction(){return(lk=b._emscripten_bind_btRigidBody_setMotionState_1=b.asm.ii).apply(null,arguments)},mk=b._emscripten_bind_btRigidBody_getAngularFactor_0=function(){return(mk=b._emscripten_bind_btRigidBody_getAngularFactor_0=b.asm.ji).apply(null,arguments)},nk=b._emscripten_bind_btRigidBody_setAngularFactor_1=function(){return(nk=b._emscripten_bind_btRigidBody_setAngularFactor_1=b.asm.ki).apply(null,arguments)},ok=b._emscripten_bind_btRigidBody_upcast_1=function(){return(ok=b._emscripten_bind_btRigidBody_upcast_1=\nb.asm.li).apply(null,arguments)},pk=b._emscripten_bind_btRigidBody_getAabb_2=function(){return(pk=b._emscripten_bind_btRigidBody_getAabb_2=b.asm.mi).apply(null,arguments)},qk=b._emscripten_bind_btRigidBody_applyGravity_0=function(){return(qk=b._emscripten_bind_btRigidBody_applyGravity_0=b.asm.ni).apply(null,arguments)},rk=b._emscripten_bind_btRigidBody_getGravity_0=function(){return(rk=b._emscripten_bind_btRigidBody_getGravity_0=b.asm.oi).apply(null,arguments)},sk=b._emscripten_bind_btRigidBody_setGravity_1=\nfunction(){return(sk=b._emscripten_bind_btRigidBody_setGravity_1=b.asm.pi).apply(null,arguments)},tk=b._emscripten_bind_btRigidBody_getBroadphaseProxy_0=function(){return(tk=b._emscripten_bind_btRigidBody_getBroadphaseProxy_0=b.asm.qi).apply(null,arguments)},uk=b._emscripten_bind_btRigidBody_clearForces_0=function(){return(uk=b._emscripten_bind_btRigidBody_clearForces_0=b.asm.ri).apply(null,arguments)},vk=b._emscripten_bind_btRigidBody_setAnisotropicFriction_2=function(){return(vk=b._emscripten_bind_btRigidBody_setAnisotropicFriction_2=\nb.asm.si).apply(null,arguments)},wk=b._emscripten_bind_btRigidBody_getCollisionShape_0=function(){return(wk=b._emscripten_bind_btRigidBody_getCollisionShape_0=b.asm.ti).apply(null,arguments)},xk=b._emscripten_bind_btRigidBody_setContactProcessingThreshold_1=function(){return(xk=b._emscripten_bind_btRigidBody_setContactProcessingThreshold_1=b.asm.ui).apply(null,arguments)},yk=b._emscripten_bind_btRigidBody_setActivationState_1=function(){return(yk=b._emscripten_bind_btRigidBody_setActivationState_1=\nb.asm.vi).apply(null,arguments)},zk=b._emscripten_bind_btRigidBody_forceActivationState_1=function(){return(zk=b._emscripten_bind_btRigidBody_forceActivationState_1=b.asm.wi).apply(null,arguments)},Ak=b._emscripten_bind_btRigidBody_activate_0=function(){return(Ak=b._emscripten_bind_btRigidBody_activate_0=b.asm.xi).apply(null,arguments)},Bk=b._emscripten_bind_btRigidBody_activate_1=function(){return(Bk=b._emscripten_bind_btRigidBody_activate_1=b.asm.yi).apply(null,arguments)},Ck=b._emscripten_bind_btRigidBody_isActive_0=\nfunction(){return(Ck=b._emscripten_bind_btRigidBody_isActive_0=b.asm.zi).apply(null,arguments)},Dk=b._emscripten_bind_btRigidBody_isKinematicObject_0=function(){return(Dk=b._emscripten_bind_btRigidBody_isKinematicObject_0=b.asm.Ai).apply(null,arguments)},Ek=b._emscripten_bind_btRigidBody_isStaticObject_0=function(){return(Ek=b._emscripten_bind_btRigidBody_isStaticObject_0=b.asm.Bi).apply(null,arguments)},Fk=b._emscripten_bind_btRigidBody_isStaticOrKinematicObject_0=function(){return(Fk=b._emscripten_bind_btRigidBody_isStaticOrKinematicObject_0=\nb.asm.Ci).apply(null,arguments)},Gk=b._emscripten_bind_btRigidBody_getRestitution_0=function(){return(Gk=b._emscripten_bind_btRigidBody_getRestitution_0=b.asm.Di).apply(null,arguments)},Hk=b._emscripten_bind_btRigidBody_getFriction_0=function(){return(Hk=b._emscripten_bind_btRigidBody_getFriction_0=b.asm.Ei).apply(null,arguments)},Ik=b._emscripten_bind_btRigidBody_getRollingFriction_0=function(){return(Ik=b._emscripten_bind_btRigidBody_getRollingFriction_0=b.asm.Fi).apply(null,arguments)},Jk=b._emscripten_bind_btRigidBody_setRestitution_1=\nfunction(){return(Jk=b._emscripten_bind_btRigidBody_setRestitution_1=b.asm.Gi).apply(null,arguments)},Kk=b._emscripten_bind_btRigidBody_setFriction_1=function(){return(Kk=b._emscripten_bind_btRigidBody_setFriction_1=b.asm.Hi).apply(null,arguments)},Lk=b._emscripten_bind_btRigidBody_setRollingFriction_1=function(){return(Lk=b._emscripten_bind_btRigidBody_setRollingFriction_1=b.asm.Ii).apply(null,arguments)},Mk=b._emscripten_bind_btRigidBody_getWorldTransform_0=function(){return(Mk=b._emscripten_bind_btRigidBody_getWorldTransform_0=\nb.asm.Ji).apply(null,arguments)},Nk=b._emscripten_bind_btRigidBody_getCollisionFlags_0=function(){return(Nk=b._emscripten_bind_btRigidBody_getCollisionFlags_0=b.asm.Ki).apply(null,arguments)},Ok=b._emscripten_bind_btRigidBody_setCollisionFlags_1=function(){return(Ok=b._emscripten_bind_btRigidBody_setCollisionFlags_1=b.asm.Li).apply(null,arguments)},Pk=b._emscripten_bind_btRigidBody_setWorldTransform_1=function(){return(Pk=b._emscripten_bind_btRigidBody_setWorldTransform_1=b.asm.Mi).apply(null,arguments)},\nQk=b._emscripten_bind_btRigidBody_setCollisionShape_1=function(){return(Qk=b._emscripten_bind_btRigidBody_setCollisionShape_1=b.asm.Ni).apply(null,arguments)},Rk=b._emscripten_bind_btRigidBody_setCcdMotionThreshold_1=function(){return(Rk=b._emscripten_bind_btRigidBody_setCcdMotionThreshold_1=b.asm.Oi).apply(null,arguments)},Sk=b._emscripten_bind_btRigidBody_setCcdSweptSphereRadius_1=function(){return(Sk=b._emscripten_bind_btRigidBody_setCcdSweptSphereRadius_1=b.asm.Pi).apply(null,arguments)},Tk=b._emscripten_bind_btRigidBody_getUserIndex_0=\nfunction(){return(Tk=b._emscripten_bind_btRigidBody_getUserIndex_0=b.asm.Qi).apply(null,arguments)},Uk=b._emscripten_bind_btRigidBody_setUserIndex_1=function(){return(Uk=b._emscripten_bind_btRigidBody_setUserIndex_1=b.asm.Ri).apply(null,arguments)},Vk=b._emscripten_bind_btRigidBody_getUserPointer_0=function(){return(Vk=b._emscripten_bind_btRigidBody_getUserPointer_0=b.asm.Si).apply(null,arguments)},Wk=b._emscripten_bind_btRigidBody_setUserPointer_1=function(){return(Wk=b._emscripten_bind_btRigidBody_setUserPointer_1=\nb.asm.Ti).apply(null,arguments)},Xk=b._emscripten_bind_btRigidBody_getBroadphaseHandle_0=function(){return(Xk=b._emscripten_bind_btRigidBody_getBroadphaseHandle_0=b.asm.Ui).apply(null,arguments)},Yk=b._emscripten_bind_btRigidBody___destroy___0=function(){return(Yk=b._emscripten_bind_btRigidBody___destroy___0=b.asm.Vi).apply(null,arguments)},Zk=b._emscripten_bind_btIndexedMeshArray_size_0=function(){return(Zk=b._emscripten_bind_btIndexedMeshArray_size_0=b.asm.Wi).apply(null,arguments)},$k=b._emscripten_bind_btIndexedMeshArray_at_1=\nfunction(){return($k=b._emscripten_bind_btIndexedMeshArray_at_1=b.asm.Xi).apply(null,arguments)},al=b._emscripten_bind_btIndexedMeshArray___destroy___0=function(){return(al=b._emscripten_bind_btIndexedMeshArray___destroy___0=b.asm.Yi).apply(null,arguments)},bl=b._emscripten_bind_btDbvtBroadphase_btDbvtBroadphase_0=function(){return(bl=b._emscripten_bind_btDbvtBroadphase_btDbvtBroadphase_0=b.asm.Zi).apply(null,arguments)},cl=b._emscripten_bind_btDbvtBroadphase___destroy___0=function(){return(cl=b._emscripten_bind_btDbvtBroadphase___destroy___0=\nb.asm._i).apply(null,arguments)},dl=b._emscripten_bind_btHeightfieldTerrainShape_btHeightfieldTerrainShape_9=function(){return(dl=b._emscripten_bind_btHeightfieldTerrainShape_btHeightfieldTerrainShape_9=b.asm.$i).apply(null,arguments)},el=b._emscripten_bind_btHeightfieldTerrainShape_setMargin_1=function(){return(el=b._emscripten_bind_btHeightfieldTerrainShape_setMargin_1=b.asm.aj).apply(null,arguments)},fl=b._emscripten_bind_btHeightfieldTerrainShape_getMargin_0=function(){return(fl=b._emscripten_bind_btHeightfieldTerrainShape_getMargin_0=\nb.asm.bj).apply(null,arguments)},gl=b._emscripten_bind_btHeightfieldTerrainShape_setLocalScaling_1=function(){return(gl=b._emscripten_bind_btHeightfieldTerrainShape_setLocalScaling_1=b.asm.cj).apply(null,arguments)},hl=b._emscripten_bind_btHeightfieldTerrainShape_getLocalScaling_0=function(){return(hl=b._emscripten_bind_btHeightfieldTerrainShape_getLocalScaling_0=b.asm.dj).apply(null,arguments)},il=b._emscripten_bind_btHeightfieldTerrainShape_calculateLocalInertia_2=function(){return(il=b._emscripten_bind_btHeightfieldTerrainShape_calculateLocalInertia_2=\nb.asm.ej).apply(null,arguments)},jl=b._emscripten_bind_btHeightfieldTerrainShape___destroy___0=function(){return(jl=b._emscripten_bind_btHeightfieldTerrainShape___destroy___0=b.asm.fj).apply(null,arguments)},kl=b._emscripten_bind_btDefaultSoftBodySolver_btDefaultSoftBodySolver_0=function(){return(kl=b._emscripten_bind_btDefaultSoftBodySolver_btDefaultSoftBodySolver_0=b.asm.gj).apply(null,arguments)},ll=b._emscripten_bind_btDefaultSoftBodySolver___destroy___0=function(){return(ll=b._emscripten_bind_btDefaultSoftBodySolver___destroy___0=\nb.asm.hj).apply(null,arguments)},ml=b._emscripten_bind_btCollisionDispatcher_btCollisionDispatcher_1=function(){return(ml=b._emscripten_bind_btCollisionDispatcher_btCollisionDispatcher_1=b.asm.ij).apply(null,arguments)},nl=b._emscripten_bind_btCollisionDispatcher_getNumManifolds_0=function(){return(nl=b._emscripten_bind_btCollisionDispatcher_getNumManifolds_0=b.asm.jj).apply(null,arguments)},ol=b._emscripten_bind_btCollisionDispatcher_getManifoldByIndexInternal_1=function(){return(ol=b._emscripten_bind_btCollisionDispatcher_getManifoldByIndexInternal_1=\nb.asm.kj).apply(null,arguments)},pl=b._emscripten_bind_btCollisionDispatcher___destroy___0=function(){return(pl=b._emscripten_bind_btCollisionDispatcher___destroy___0=b.asm.lj).apply(null,arguments)},ql=b._emscripten_bind_btAxisSweep3_btAxisSweep3_2=function(){return(ql=b._emscripten_bind_btAxisSweep3_btAxisSweep3_2=b.asm.mj).apply(null,arguments)},rl=b._emscripten_bind_btAxisSweep3_btAxisSweep3_3=function(){return(rl=b._emscripten_bind_btAxisSweep3_btAxisSweep3_3=b.asm.nj).apply(null,arguments)},\nsl=b._emscripten_bind_btAxisSweep3_btAxisSweep3_4=function(){return(sl=b._emscripten_bind_btAxisSweep3_btAxisSweep3_4=b.asm.oj).apply(null,arguments)},tl=b._emscripten_bind_btAxisSweep3_btAxisSweep3_5=function(){return(tl=b._emscripten_bind_btAxisSweep3_btAxisSweep3_5=b.asm.pj).apply(null,arguments)},ul=b._emscripten_bind_btAxisSweep3___destroy___0=function(){return(ul=b._emscripten_bind_btAxisSweep3___destroy___0=b.asm.qj).apply(null,arguments)},vl=b._emscripten_bind_VoidPtr___destroy___0=function(){return(vl=\nb._emscripten_bind_VoidPtr___destroy___0=b.asm.rj).apply(null,arguments)},wl=b._emscripten_bind_btSoftBodyWorldInfo_btSoftBodyWorldInfo_0=function(){return(wl=b._emscripten_bind_btSoftBodyWorldInfo_btSoftBodyWorldInfo_0=b.asm.sj).apply(null,arguments)},xl=b._emscripten_bind_btSoftBodyWorldInfo_get_air_density_0=function(){return(xl=b._emscripten_bind_btSoftBodyWorldInfo_get_air_density_0=b.asm.tj).apply(null,arguments)},yl=b._emscripten_bind_btSoftBodyWorldInfo_set_air_density_1=function(){return(yl=\nb._emscripten_bind_btSoftBodyWorldInfo_set_air_density_1=b.asm.uj).apply(null,arguments)},zl=b._emscripten_bind_btSoftBodyWorldInfo_get_water_density_0=function(){return(zl=b._emscripten_bind_btSoftBodyWorldInfo_get_water_density_0=b.asm.vj).apply(null,arguments)},Al=b._emscripten_bind_btSoftBodyWorldInfo_set_water_density_1=function(){return(Al=b._emscripten_bind_btSoftBodyWorldInfo_set_water_density_1=b.asm.wj).apply(null,arguments)},Bl=b._emscripten_bind_btSoftBodyWorldInfo_get_water_offset_0=\nfunction(){return(Bl=b._emscripten_bind_btSoftBodyWorldInfo_get_water_offset_0=b.asm.xj).apply(null,arguments)},Cl=b._emscripten_bind_btSoftBodyWorldInfo_set_water_offset_1=function(){return(Cl=b._emscripten_bind_btSoftBodyWorldInfo_set_water_offset_1=b.asm.yj).apply(null,arguments)},Dl=b._emscripten_bind_btSoftBodyWorldInfo_get_m_maxDisplacement_0=function(){return(Dl=b._emscripten_bind_btSoftBodyWorldInfo_get_m_maxDisplacement_0=b.asm.zj).apply(null,arguments)},El=b._emscripten_bind_btSoftBodyWorldInfo_set_m_maxDisplacement_1=\nfunction(){return(El=b._emscripten_bind_btSoftBodyWorldInfo_set_m_maxDisplacement_1=b.asm.Aj).apply(null,arguments)},Fl=b._emscripten_bind_btSoftBodyWorldInfo_get_water_normal_0=function(){return(Fl=b._emscripten_bind_btSoftBodyWorldInfo_get_water_normal_0=b.asm.Bj).apply(null,arguments)},Gl=b._emscripten_bind_btSoftBodyWorldInfo_set_water_normal_1=function(){return(Gl=b._emscripten_bind_btSoftBodyWorldInfo_set_water_normal_1=b.asm.Cj).apply(null,arguments)},Hl=b._emscripten_bind_btSoftBodyWorldInfo_get_m_broadphase_0=\nfunction(){return(Hl=b._emscripten_bind_btSoftBodyWorldInfo_get_m_broadphase_0=b.asm.Dj).apply(null,arguments)},Il=b._emscripten_bind_btSoftBodyWorldInfo_set_m_broadphase_1=function(){return(Il=b._emscripten_bind_btSoftBodyWorldInfo_set_m_broadphase_1=b.asm.Ej).apply(null,arguments)},Jl=b._emscripten_bind_btSoftBodyWorldInfo_get_m_dispatcher_0=function(){return(Jl=b._emscripten_bind_btSoftBodyWorldInfo_get_m_dispatcher_0=b.asm.Fj).apply(null,arguments)},Kl=b._emscripten_bind_btSoftBodyWorldInfo_set_m_dispatcher_1=\nfunction(){return(Kl=b._emscripten_bind_btSoftBodyWorldInfo_set_m_dispatcher_1=b.asm.Gj).apply(null,arguments)},Ll=b._emscripten_bind_btSoftBodyWorldInfo_get_m_gravity_0=function(){return(Ll=b._emscripten_bind_btSoftBodyWorldInfo_get_m_gravity_0=b.asm.Hj).apply(null,arguments)},Ml=b._emscripten_bind_btSoftBodyWorldInfo_set_m_gravity_1=function(){return(Ml=b._emscripten_bind_btSoftBodyWorldInfo_set_m_gravity_1=b.asm.Ij).apply(null,arguments)},Nl=b._emscripten_bind_btSoftBodyWorldInfo___destroy___0=\nfunction(){return(Nl=b._emscripten_bind_btSoftBodyWorldInfo___destroy___0=b.asm.Jj).apply(null,arguments)},Ol=b._emscripten_bind_btConeTwistConstraint_btConeTwistConstraint_2=function(){return(Ol=b._emscripten_bind_btConeTwistConstraint_btConeTwistConstraint_2=b.asm.Kj).apply(null,arguments)},Pl=b._emscripten_bind_btConeTwistConstraint_btConeTwistConstraint_4=function(){return(Pl=b._emscripten_bind_btConeTwistConstraint_btConeTwistConstraint_4=b.asm.Lj).apply(null,arguments)},Ql=b._emscripten_bind_btConeTwistConstraint_setLimit_2=\nfunction(){return(Ql=b._emscripten_bind_btConeTwistConstraint_setLimit_2=b.asm.Mj).apply(null,arguments)},Rl=b._emscripten_bind_btConeTwistConstraint_setAngularOnly_1=function(){return(Rl=b._emscripten_bind_btConeTwistConstraint_setAngularOnly_1=b.asm.Nj).apply(null,arguments)},Sl=b._emscripten_bind_btConeTwistConstraint_setDamping_1=function(){return(Sl=b._emscripten_bind_btConeTwistConstraint_setDamping_1=b.asm.Oj).apply(null,arguments)},Tl=b._emscripten_bind_btConeTwistConstraint_enableMotor_1=\nfunction(){return(Tl=b._emscripten_bind_btConeTwistConstraint_enableMotor_1=b.asm.Pj).apply(null,arguments)},Ul=b._emscripten_bind_btConeTwistConstraint_setMaxMotorImpulse_1=function(){return(Ul=b._emscripten_bind_btConeTwistConstraint_setMaxMotorImpulse_1=b.asm.Qj).apply(null,arguments)},Vl=b._emscripten_bind_btConeTwistConstraint_setMaxMotorImpulseNormalized_1=function(){return(Vl=b._emscripten_bind_btConeTwistConstraint_setMaxMotorImpulseNormalized_1=b.asm.Rj).apply(null,arguments)},Wl=b._emscripten_bind_btConeTwistConstraint_setMotorTarget_1=\nfunction(){return(Wl=b._emscripten_bind_btConeTwistConstraint_setMotorTarget_1=b.asm.Sj).apply(null,arguments)},Xl=b._emscripten_bind_btConeTwistConstraint_setMotorTargetInConstraintSpace_1=function(){return(Xl=b._emscripten_bind_btConeTwistConstraint_setMotorTargetInConstraintSpace_1=b.asm.Tj).apply(null,arguments)},Yl=b._emscripten_bind_btConeTwistConstraint_enableFeedback_1=function(){return(Yl=b._emscripten_bind_btConeTwistConstraint_enableFeedback_1=b.asm.Uj).apply(null,arguments)},Zl=b._emscripten_bind_btConeTwistConstraint_getBreakingImpulseThreshold_0=\nfunction(){return(Zl=b._emscripten_bind_btConeTwistConstraint_getBreakingImpulseThreshold_0=b.asm.Vj).apply(null,arguments)},$l=b._emscripten_bind_btConeTwistConstraint_setBreakingImpulseThreshold_1=function(){return($l=b._emscripten_bind_btConeTwistConstraint_setBreakingImpulseThreshold_1=b.asm.Wj).apply(null,arguments)},am=b._emscripten_bind_btConeTwistConstraint_getParam_2=function(){return(am=b._emscripten_bind_btConeTwistConstraint_getParam_2=b.asm.Xj).apply(null,arguments)},bm=b._emscripten_bind_btConeTwistConstraint_setParam_3=\nfunction(){return(bm=b._emscripten_bind_btConeTwistConstraint_setParam_3=b.asm.Yj).apply(null,arguments)},cm=b._emscripten_bind_btConeTwistConstraint___destroy___0=function(){return(cm=b._emscripten_bind_btConeTwistConstraint___destroy___0=b.asm.Zj).apply(null,arguments)},dm=b._emscripten_bind_btHingeConstraint_btHingeConstraint_2=function(){return(dm=b._emscripten_bind_btHingeConstraint_btHingeConstraint_2=b.asm._j).apply(null,arguments)},em=b._emscripten_bind_btHingeConstraint_btHingeConstraint_3=\nfunction(){return(em=b._emscripten_bind_btHingeConstraint_btHingeConstraint_3=b.asm.$j).apply(null,arguments)},fm=b._emscripten_bind_btHingeConstraint_btHingeConstraint_4=function(){return(fm=b._emscripten_bind_btHingeConstraint_btHingeConstraint_4=b.asm.ak).apply(null,arguments)},gm=b._emscripten_bind_btHingeConstraint_btHingeConstraint_5=function(){return(gm=b._emscripten_bind_btHingeConstraint_btHingeConstraint_5=b.asm.bk).apply(null,arguments)},hm=b._emscripten_bind_btHingeConstraint_btHingeConstraint_6=\nfunction(){return(hm=b._emscripten_bind_btHingeConstraint_btHingeConstraint_6=b.asm.ck).apply(null,arguments)},im=b._emscripten_bind_btHingeConstraint_btHingeConstraint_7=function(){return(im=b._emscripten_bind_btHingeConstraint_btHingeConstraint_7=b.asm.dk).apply(null,arguments)},jm=b._emscripten_bind_btHingeConstraint_setLimit_4=function(){return(jm=b._emscripten_bind_btHingeConstraint_setLimit_4=b.asm.ek).apply(null,arguments)},km=b._emscripten_bind_btHingeConstraint_setLimit_5=function(){return(km=\nb._emscripten_bind_btHingeConstraint_setLimit_5=b.asm.fk).apply(null,arguments)},lm=b._emscripten_bind_btHingeConstraint_enableAngularMotor_3=function(){return(lm=b._emscripten_bind_btHingeConstraint_enableAngularMotor_3=b.asm.gk).apply(null,arguments)},mm=b._emscripten_bind_btHingeConstraint_setAngularOnly_1=function(){return(mm=b._emscripten_bind_btHingeConstraint_setAngularOnly_1=b.asm.hk).apply(null,arguments)},nm=b._emscripten_bind_btHingeConstraint_enableMotor_1=function(){return(nm=b._emscripten_bind_btHingeConstraint_enableMotor_1=\nb.asm.ik).apply(null,arguments)},om=b._emscripten_bind_btHingeConstraint_setMaxMotorImpulse_1=function(){return(om=b._emscripten_bind_btHingeConstraint_setMaxMotorImpulse_1=b.asm.jk).apply(null,arguments)},pm=b._emscripten_bind_btHingeConstraint_setMotorTarget_2=function(){return(pm=b._emscripten_bind_btHingeConstraint_setMotorTarget_2=b.asm.kk).apply(null,arguments)},qm=b._emscripten_bind_btHingeConstraint_enableFeedback_1=function(){return(qm=b._emscripten_bind_btHingeConstraint_enableFeedback_1=\nb.asm.lk).apply(null,arguments)},rm=b._emscripten_bind_btHingeConstraint_getBreakingImpulseThreshold_0=function(){return(rm=b._emscripten_bind_btHingeConstraint_getBreakingImpulseThreshold_0=b.asm.mk).apply(null,arguments)},sm=b._emscripten_bind_btHingeConstraint_setBreakingImpulseThreshold_1=function(){return(sm=b._emscripten_bind_btHingeConstraint_setBreakingImpulseThreshold_1=b.asm.nk).apply(null,arguments)},tm=b._emscripten_bind_btHingeConstraint_getParam_2=function(){return(tm=b._emscripten_bind_btHingeConstraint_getParam_2=\nb.asm.ok).apply(null,arguments)},um=b._emscripten_bind_btHingeConstraint_setParam_3=function(){return(um=b._emscripten_bind_btHingeConstraint_setParam_3=b.asm.pk).apply(null,arguments)},wm=b._emscripten_bind_btHingeConstraint___destroy___0=function(){return(wm=b._emscripten_bind_btHingeConstraint___destroy___0=b.asm.qk).apply(null,arguments)},xm=b._emscripten_bind_btConeShapeZ_btConeShapeZ_2=function(){return(xm=b._emscripten_bind_btConeShapeZ_btConeShapeZ_2=b.asm.rk).apply(null,arguments)},ym=b._emscripten_bind_btConeShapeZ_setLocalScaling_1=\nfunction(){return(ym=b._emscripten_bind_btConeShapeZ_setLocalScaling_1=b.asm.sk).apply(null,arguments)},zm=b._emscripten_bind_btConeShapeZ_getLocalScaling_0=function(){return(zm=b._emscripten_bind_btConeShapeZ_getLocalScaling_0=b.asm.tk).apply(null,arguments)},Am=b._emscripten_bind_btConeShapeZ_calculateLocalInertia_2=function(){return(Am=b._emscripten_bind_btConeShapeZ_calculateLocalInertia_2=b.asm.uk).apply(null,arguments)},Bm=b._emscripten_bind_btConeShapeZ___destroy___0=function(){return(Bm=b._emscripten_bind_btConeShapeZ___destroy___0=\nb.asm.vk).apply(null,arguments)},Cm=b._emscripten_bind_btConeShapeX_btConeShapeX_2=function(){return(Cm=b._emscripten_bind_btConeShapeX_btConeShapeX_2=b.asm.wk).apply(null,arguments)},Dm=b._emscripten_bind_btConeShapeX_setLocalScaling_1=function(){return(Dm=b._emscripten_bind_btConeShapeX_setLocalScaling_1=b.asm.xk).apply(null,arguments)},Em=b._emscripten_bind_btConeShapeX_getLocalScaling_0=function(){return(Em=b._emscripten_bind_btConeShapeX_getLocalScaling_0=b.asm.yk).apply(null,arguments)},Fm=\nb._emscripten_bind_btConeShapeX_calculateLocalInertia_2=function(){return(Fm=b._emscripten_bind_btConeShapeX_calculateLocalInertia_2=b.asm.zk).apply(null,arguments)},Gm=b._emscripten_bind_btConeShapeX___destroy___0=function(){return(Gm=b._emscripten_bind_btConeShapeX___destroy___0=b.asm.Ak).apply(null,arguments)},Hm=b._emscripten_bind_btTriangleMesh_btTriangleMesh_0=function(){return(Hm=b._emscripten_bind_btTriangleMesh_btTriangleMesh_0=b.asm.Bk).apply(null,arguments)},Im=b._emscripten_bind_btTriangleMesh_btTriangleMesh_1=\nfunction(){return(Im=b._emscripten_bind_btTriangleMesh_btTriangleMesh_1=b.asm.Ck).apply(null,arguments)},Jm=b._emscripten_bind_btTriangleMesh_btTriangleMesh_2=function(){return(Jm=b._emscripten_bind_btTriangleMesh_btTriangleMesh_2=b.asm.Dk).apply(null,arguments)},Km=b._emscripten_bind_btTriangleMesh_addTriangle_3=function(){return(Km=b._emscripten_bind_btTriangleMesh_addTriangle_3=b.asm.Ek).apply(null,arguments)},Lm=b._emscripten_bind_btTriangleMesh_addTriangle_4=function(){return(Lm=b._emscripten_bind_btTriangleMesh_addTriangle_4=\nb.asm.Fk).apply(null,arguments)},Mm=b._emscripten_bind_btTriangleMesh_findOrAddVertex_2=function(){return(Mm=b._emscripten_bind_btTriangleMesh_findOrAddVertex_2=b.asm.Gk).apply(null,arguments)},Nm=b._emscripten_bind_btTriangleMesh_addIndex_1=function(){return(Nm=b._emscripten_bind_btTriangleMesh_addIndex_1=b.asm.Hk).apply(null,arguments)},Om=b._emscripten_bind_btTriangleMesh_getIndexedMeshArray_0=function(){return(Om=b._emscripten_bind_btTriangleMesh_getIndexedMeshArray_0=b.asm.Ik).apply(null,arguments)},\nPm=b._emscripten_bind_btTriangleMesh_setScaling_1=function(){return(Pm=b._emscripten_bind_btTriangleMesh_setScaling_1=b.asm.Jk).apply(null,arguments)},Qm=b._emscripten_bind_btTriangleMesh___destroy___0=function(){return(Qm=b._emscripten_bind_btTriangleMesh___destroy___0=b.asm.Kk).apply(null,arguments)},Rm=b._emscripten_bind_btConvexHullShape_btConvexHullShape_0=function(){return(Rm=b._emscripten_bind_btConvexHullShape_btConvexHullShape_0=b.asm.Lk).apply(null,arguments)},Sm=b._emscripten_bind_btConvexHullShape_btConvexHullShape_1=\nfunction(){return(Sm=b._emscripten_bind_btConvexHullShape_btConvexHullShape_1=b.asm.Mk).apply(null,arguments)},Tm=b._emscripten_bind_btConvexHullShape_btConvexHullShape_2=function(){return(Tm=b._emscripten_bind_btConvexHullShape_btConvexHullShape_2=b.asm.Nk).apply(null,arguments)},Um=b._emscripten_bind_btConvexHullShape_addPoint_1=function(){return(Um=b._emscripten_bind_btConvexHullShape_addPoint_1=b.asm.Ok).apply(null,arguments)},Vm=b._emscripten_bind_btConvexHullShape_addPoint_2=function(){return(Vm=\nb._emscripten_bind_btConvexHullShape_addPoint_2=b.asm.Pk).apply(null,arguments)},Wm=b._emscripten_bind_btConvexHullShape_setMargin_1=function(){return(Wm=b._emscripten_bind_btConvexHullShape_setMargin_1=b.asm.Qk).apply(null,arguments)},Xm=b._emscripten_bind_btConvexHullShape_getMargin_0=function(){return(Xm=b._emscripten_bind_btConvexHullShape_getMargin_0=b.asm.Rk).apply(null,arguments)},Ym=b._emscripten_bind_btConvexHullShape_getNumVertices_0=function(){return(Ym=b._emscripten_bind_btConvexHullShape_getNumVertices_0=\nb.asm.Sk).apply(null,arguments)},Zm=b._emscripten_bind_btConvexHullShape_initializePolyhedralFeatures_1=function(){return(Zm=b._emscripten_bind_btConvexHullShape_initializePolyhedralFeatures_1=b.asm.Tk).apply(null,arguments)},$m=b._emscripten_bind_btConvexHullShape_recalcLocalAabb_0=function(){return($m=b._emscripten_bind_btConvexHullShape_recalcLocalAabb_0=b.asm.Uk).apply(null,arguments)},an=b._emscripten_bind_btConvexHullShape_getConvexPolyhedron_0=function(){return(an=b._emscripten_bind_btConvexHullShape_getConvexPolyhedron_0=\nb.asm.Vk).apply(null,arguments)},bn=b._emscripten_bind_btConvexHullShape_setLocalScaling_1=function(){return(bn=b._emscripten_bind_btConvexHullShape_setLocalScaling_1=b.asm.Wk).apply(null,arguments)},cn=b._emscripten_bind_btConvexHullShape_getLocalScaling_0=function(){return(cn=b._emscripten_bind_btConvexHullShape_getLocalScaling_0=b.asm.Xk).apply(null,arguments)},dn=b._emscripten_bind_btConvexHullShape_calculateLocalInertia_2=function(){return(dn=b._emscripten_bind_btConvexHullShape_calculateLocalInertia_2=\nb.asm.Yk).apply(null,arguments)},en=b._emscripten_bind_btConvexHullShape___destroy___0=function(){return(en=b._emscripten_bind_btConvexHullShape___destroy___0=b.asm.Zk).apply(null,arguments)},fn=b._emscripten_bind_btVehicleTuning_btVehicleTuning_0=function(){return(fn=b._emscripten_bind_btVehicleTuning_btVehicleTuning_0=b.asm._k).apply(null,arguments)},gn=b._emscripten_bind_btVehicleTuning_get_m_suspensionStiffness_0=function(){return(gn=b._emscripten_bind_btVehicleTuning_get_m_suspensionStiffness_0=\nb.asm.$k).apply(null,arguments)},hn=b._emscripten_bind_btVehicleTuning_set_m_suspensionStiffness_1=function(){return(hn=b._emscripten_bind_btVehicleTuning_set_m_suspensionStiffness_1=b.asm.al).apply(null,arguments)},jn=b._emscripten_bind_btVehicleTuning_get_m_suspensionCompression_0=function(){return(jn=b._emscripten_bind_btVehicleTuning_get_m_suspensionCompression_0=b.asm.bl).apply(null,arguments)},kn=b._emscripten_bind_btVehicleTuning_set_m_suspensionCompression_1=function(){return(kn=b._emscripten_bind_btVehicleTuning_set_m_suspensionCompression_1=\nb.asm.cl).apply(null,arguments)},ln=b._emscripten_bind_btVehicleTuning_get_m_suspensionDamping_0=function(){return(ln=b._emscripten_bind_btVehicleTuning_get_m_suspensionDamping_0=b.asm.dl).apply(null,arguments)},mn=b._emscripten_bind_btVehicleTuning_set_m_suspensionDamping_1=function(){return(mn=b._emscripten_bind_btVehicleTuning_set_m_suspensionDamping_1=b.asm.el).apply(null,arguments)},nn=b._emscripten_bind_btVehicleTuning_get_m_maxSuspensionTravelCm_0=function(){return(nn=b._emscripten_bind_btVehicleTuning_get_m_maxSuspensionTravelCm_0=\nb.asm.fl).apply(null,arguments)},on=b._emscripten_bind_btVehicleTuning_set_m_maxSuspensionTravelCm_1=function(){return(on=b._emscripten_bind_btVehicleTuning_set_m_maxSuspensionTravelCm_1=b.asm.gl).apply(null,arguments)},pn=b._emscripten_bind_btVehicleTuning_get_m_frictionSlip_0=function(){return(pn=b._emscripten_bind_btVehicleTuning_get_m_frictionSlip_0=b.asm.hl).apply(null,arguments)},qn=b._emscripten_bind_btVehicleTuning_set_m_frictionSlip_1=function(){return(qn=b._emscripten_bind_btVehicleTuning_set_m_frictionSlip_1=\nb.asm.il).apply(null,arguments)},rn=b._emscripten_bind_btVehicleTuning_get_m_maxSuspensionForce_0=function(){return(rn=b._emscripten_bind_btVehicleTuning_get_m_maxSuspensionForce_0=b.asm.jl).apply(null,arguments)},sn=b._emscripten_bind_btVehicleTuning_set_m_maxSuspensionForce_1=function(){return(sn=b._emscripten_bind_btVehicleTuning_set_m_maxSuspensionForce_1=b.asm.kl).apply(null,arguments)},tn=b._emscripten_bind_btCollisionObjectWrapper_getWorldTransform_0=function(){return(tn=b._emscripten_bind_btCollisionObjectWrapper_getWorldTransform_0=\nb.asm.ll).apply(null,arguments)},un=b._emscripten_bind_btCollisionObjectWrapper_getCollisionObject_0=function(){return(un=b._emscripten_bind_btCollisionObjectWrapper_getCollisionObject_0=b.asm.ml).apply(null,arguments)},vn=b._emscripten_bind_btCollisionObjectWrapper_getCollisionShape_0=function(){return(vn=b._emscripten_bind_btCollisionObjectWrapper_getCollisionShape_0=b.asm.nl).apply(null,arguments)},wn=b._emscripten_bind_btShapeHull_btShapeHull_1=function(){return(wn=b._emscripten_bind_btShapeHull_btShapeHull_1=\nb.asm.ol).apply(null,arguments)},xn=b._emscripten_bind_btShapeHull_buildHull_1=function(){return(xn=b._emscripten_bind_btShapeHull_buildHull_1=b.asm.pl).apply(null,arguments)},yn=b._emscripten_bind_btShapeHull_numVertices_0=function(){return(yn=b._emscripten_bind_btShapeHull_numVertices_0=b.asm.ql).apply(null,arguments)},zn=b._emscripten_bind_btShapeHull_getVertexPointer_0=function(){return(zn=b._emscripten_bind_btShapeHull_getVertexPointer_0=b.asm.rl).apply(null,arguments)},An=b._emscripten_bind_btShapeHull___destroy___0=\nfunction(){return(An=b._emscripten_bind_btShapeHull___destroy___0=b.asm.sl).apply(null,arguments)},Bn=b._emscripten_bind_btDefaultMotionState_btDefaultMotionState_0=function(){return(Bn=b._emscripten_bind_btDefaultMotionState_btDefaultMotionState_0=b.asm.tl).apply(null,arguments)},Cn=b._emscripten_bind_btDefaultMotionState_btDefaultMotionState_1=function(){return(Cn=b._emscripten_bind_btDefaultMotionState_btDefaultMotionState_1=b.asm.ul).apply(null,arguments)},Dn=b._emscripten_bind_btDefaultMotionState_btDefaultMotionState_2=\nfunction(){return(Dn=b._emscripten_bind_btDefaultMotionState_btDefaultMotionState_2=b.asm.vl).apply(null,arguments)},En=b._emscripten_bind_btDefaultMotionState_getWorldTransform_1=function(){return(En=b._emscripten_bind_btDefaultMotionState_getWorldTransform_1=b.asm.wl).apply(null,arguments)},Fn=b._emscripten_bind_btDefaultMotionState_setWorldTransform_1=function(){return(Fn=b._emscripten_bind_btDefaultMotionState_setWorldTransform_1=b.asm.xl).apply(null,arguments)},Gn=b._emscripten_bind_btDefaultMotionState_get_m_graphicsWorldTrans_0=\nfunction(){return(Gn=b._emscripten_bind_btDefaultMotionState_get_m_graphicsWorldTrans_0=b.asm.yl).apply(null,arguments)},Hn=b._emscripten_bind_btDefaultMotionState_set_m_graphicsWorldTrans_1=function(){return(Hn=b._emscripten_bind_btDefaultMotionState_set_m_graphicsWorldTrans_1=b.asm.zl).apply(null,arguments)},In=b._emscripten_bind_btDefaultMotionState___destroy___0=function(){return(In=b._emscripten_bind_btDefaultMotionState___destroy___0=b.asm.Al).apply(null,arguments)},Jn=b._emscripten_bind_btWheelInfo_btWheelInfo_1=\nfunction(){return(Jn=b._emscripten_bind_btWheelInfo_btWheelInfo_1=b.asm.Bl).apply(null,arguments)},Kn=b._emscripten_bind_btWheelInfo_getSuspensionRestLength_0=function(){return(Kn=b._emscripten_bind_btWheelInfo_getSuspensionRestLength_0=b.asm.Cl).apply(null,arguments)},Ln=b._emscripten_bind_btWheelInfo_updateWheel_2=function(){return(Ln=b._emscripten_bind_btWheelInfo_updateWheel_2=b.asm.Dl).apply(null,arguments)},Mn=b._emscripten_bind_btWheelInfo_get_m_suspensionStiffness_0=function(){return(Mn=b._emscripten_bind_btWheelInfo_get_m_suspensionStiffness_0=\nb.asm.El).apply(null,arguments)},Nn=b._emscripten_bind_btWheelInfo_set_m_suspensionStiffness_1=function(){return(Nn=b._emscripten_bind_btWheelInfo_set_m_suspensionStiffness_1=b.asm.Fl).apply(null,arguments)},On=b._emscripten_bind_btWheelInfo_get_m_frictionSlip_0=function(){return(On=b._emscripten_bind_btWheelInfo_get_m_frictionSlip_0=b.asm.Gl).apply(null,arguments)},Pn=b._emscripten_bind_btWheelInfo_set_m_frictionSlip_1=function(){return(Pn=b._emscripten_bind_btWheelInfo_set_m_frictionSlip_1=b.asm.Hl).apply(null,\narguments)},Qn=b._emscripten_bind_btWheelInfo_get_m_engineForce_0=function(){return(Qn=b._emscripten_bind_btWheelInfo_get_m_engineForce_0=b.asm.Il).apply(null,arguments)},Rn=b._emscripten_bind_btWheelInfo_set_m_engineForce_1=function(){return(Rn=b._emscripten_bind_btWheelInfo_set_m_engineForce_1=b.asm.Jl).apply(null,arguments)},Sn=b._emscripten_bind_btWheelInfo_get_m_rollInfluence_0=function(){return(Sn=b._emscripten_bind_btWheelInfo_get_m_rollInfluence_0=b.asm.Kl).apply(null,arguments)},Tn=b._emscripten_bind_btWheelInfo_set_m_rollInfluence_1=\nfunction(){return(Tn=b._emscripten_bind_btWheelInfo_set_m_rollInfluence_1=b.asm.Ll).apply(null,arguments)},Un=b._emscripten_bind_btWheelInfo_get_m_suspensionRestLength1_0=function(){return(Un=b._emscripten_bind_btWheelInfo_get_m_suspensionRestLength1_0=b.asm.Ml).apply(null,arguments)},Vn=b._emscripten_bind_btWheelInfo_set_m_suspensionRestLength1_1=function(){return(Vn=b._emscripten_bind_btWheelInfo_set_m_suspensionRestLength1_1=b.asm.Nl).apply(null,arguments)},Wn=b._emscripten_bind_btWheelInfo_get_m_wheelsRadius_0=\nfunction(){return(Wn=b._emscripten_bind_btWheelInfo_get_m_wheelsRadius_0=b.asm.Ol).apply(null,arguments)},Xn=b._emscripten_bind_btWheelInfo_set_m_wheelsRadius_1=function(){return(Xn=b._emscripten_bind_btWheelInfo_set_m_wheelsRadius_1=b.asm.Pl).apply(null,arguments)},Yn=b._emscripten_bind_btWheelInfo_get_m_wheelsDampingCompression_0=function(){return(Yn=b._emscripten_bind_btWheelInfo_get_m_wheelsDampingCompression_0=b.asm.Ql).apply(null,arguments)},Zn=b._emscripten_bind_btWheelInfo_set_m_wheelsDampingCompression_1=\nfunction(){return(Zn=b._emscripten_bind_btWheelInfo_set_m_wheelsDampingCompression_1=b.asm.Rl).apply(null,arguments)},$n=b._emscripten_bind_btWheelInfo_get_m_wheelsDampingRelaxation_0=function(){return($n=b._emscripten_bind_btWheelInfo_get_m_wheelsDampingRelaxation_0=b.asm.Sl).apply(null,arguments)},ao=b._emscripten_bind_btWheelInfo_set_m_wheelsDampingRelaxation_1=function(){return(ao=b._emscripten_bind_btWheelInfo_set_m_wheelsDampingRelaxation_1=b.asm.Tl).apply(null,arguments)},bo=b._emscripten_bind_btWheelInfo_get_m_steering_0=\nfunction(){return(bo=b._emscripten_bind_btWheelInfo_get_m_steering_0=b.asm.Ul).apply(null,arguments)},co=b._emscripten_bind_btWheelInfo_set_m_steering_1=function(){return(co=b._emscripten_bind_btWheelInfo_set_m_steering_1=b.asm.Vl).apply(null,arguments)},eo=b._emscripten_bind_btWheelInfo_get_m_maxSuspensionForce_0=function(){return(eo=b._emscripten_bind_btWheelInfo_get_m_maxSuspensionForce_0=b.asm.Wl).apply(null,arguments)},fo=b._emscripten_bind_btWheelInfo_set_m_maxSuspensionForce_1=function(){return(fo=\nb._emscripten_bind_btWheelInfo_set_m_maxSuspensionForce_1=b.asm.Xl).apply(null,arguments)},go=b._emscripten_bind_btWheelInfo_get_m_maxSuspensionTravelCm_0=function(){return(go=b._emscripten_bind_btWheelInfo_get_m_maxSuspensionTravelCm_0=b.asm.Yl).apply(null,arguments)},ho=b._emscripten_bind_btWheelInfo_set_m_maxSuspensionTravelCm_1=function(){return(ho=b._emscripten_bind_btWheelInfo_set_m_maxSuspensionTravelCm_1=b.asm.Zl).apply(null,arguments)},io=b._emscripten_bind_btWheelInfo_get_m_wheelsSuspensionForce_0=\nfunction(){return(io=b._emscripten_bind_btWheelInfo_get_m_wheelsSuspensionForce_0=b.asm._l).apply(null,arguments)},jo=b._emscripten_bind_btWheelInfo_set_m_wheelsSuspensionForce_1=function(){return(jo=b._emscripten_bind_btWheelInfo_set_m_wheelsSuspensionForce_1=b.asm.$l).apply(null,arguments)},ko=b._emscripten_bind_btWheelInfo_get_m_bIsFrontWheel_0=function(){return(ko=b._emscripten_bind_btWheelInfo_get_m_bIsFrontWheel_0=b.asm.am).apply(null,arguments)},lo=b._emscripten_bind_btWheelInfo_set_m_bIsFrontWheel_1=\nfunction(){return(lo=b._emscripten_bind_btWheelInfo_set_m_bIsFrontWheel_1=b.asm.bm).apply(null,arguments)},mo=b._emscripten_bind_btWheelInfo_get_m_raycastInfo_0=function(){return(mo=b._emscripten_bind_btWheelInfo_get_m_raycastInfo_0=b.asm.cm).apply(null,arguments)},no=b._emscripten_bind_btWheelInfo_set_m_raycastInfo_1=function(){return(no=b._emscripten_bind_btWheelInfo_set_m_raycastInfo_1=b.asm.dm).apply(null,arguments)},oo=b._emscripten_bind_btWheelInfo_get_m_chassisConnectionPointCS_0=function(){return(oo=\nb._emscripten_bind_btWheelInfo_get_m_chassisConnectionPointCS_0=b.asm.em).apply(null,arguments)},po=b._emscripten_bind_btWheelInfo_set_m_chassisConnectionPointCS_1=function(){return(po=b._emscripten_bind_btWheelInfo_set_m_chassisConnectionPointCS_1=b.asm.fm).apply(null,arguments)},qo=b._emscripten_bind_btWheelInfo_get_m_worldTransform_0=function(){return(qo=b._emscripten_bind_btWheelInfo_get_m_worldTransform_0=b.asm.gm).apply(null,arguments)},ro=b._emscripten_bind_btWheelInfo_set_m_worldTransform_1=\nfunction(){return(ro=b._emscripten_bind_btWheelInfo_set_m_worldTransform_1=b.asm.hm).apply(null,arguments)},so=b._emscripten_bind_btWheelInfo_get_m_wheelDirectionCS_0=function(){return(so=b._emscripten_bind_btWheelInfo_get_m_wheelDirectionCS_0=b.asm.im).apply(null,arguments)},to=b._emscripten_bind_btWheelInfo_set_m_wheelDirectionCS_1=function(){return(to=b._emscripten_bind_btWheelInfo_set_m_wheelDirectionCS_1=b.asm.jm).apply(null,arguments)},uo=b._emscripten_bind_btWheelInfo_get_m_wheelAxleCS_0=function(){return(uo=\nb._emscripten_bind_btWheelInfo_get_m_wheelAxleCS_0=b.asm.km).apply(null,arguments)},vo=b._emscripten_bind_btWheelInfo_set_m_wheelAxleCS_1=function(){return(vo=b._emscripten_bind_btWheelInfo_set_m_wheelAxleCS_1=b.asm.lm).apply(null,arguments)},wo=b._emscripten_bind_btWheelInfo_get_m_rotation_0=function(){return(wo=b._emscripten_bind_btWheelInfo_get_m_rotation_0=b.asm.mm).apply(null,arguments)},xo=b._emscripten_bind_btWheelInfo_set_m_rotation_1=function(){return(xo=b._emscripten_bind_btWheelInfo_set_m_rotation_1=\nb.asm.nm).apply(null,arguments)},yo=b._emscripten_bind_btWheelInfo_get_m_deltaRotation_0=function(){return(yo=b._emscripten_bind_btWheelInfo_get_m_deltaRotation_0=b.asm.om).apply(null,arguments)},zo=b._emscripten_bind_btWheelInfo_set_m_deltaRotation_1=function(){return(zo=b._emscripten_bind_btWheelInfo_set_m_deltaRotation_1=b.asm.pm).apply(null,arguments)},Ao=b._emscripten_bind_btWheelInfo_get_m_brake_0=function(){return(Ao=b._emscripten_bind_btWheelInfo_get_m_brake_0=b.asm.qm).apply(null,arguments)},\nBo=b._emscripten_bind_btWheelInfo_set_m_brake_1=function(){return(Bo=b._emscripten_bind_btWheelInfo_set_m_brake_1=b.asm.rm).apply(null,arguments)},Co=b._emscripten_bind_btWheelInfo_get_m_clippedInvContactDotSuspension_0=function(){return(Co=b._emscripten_bind_btWheelInfo_get_m_clippedInvContactDotSuspension_0=b.asm.sm).apply(null,arguments)},Do=b._emscripten_bind_btWheelInfo_set_m_clippedInvContactDotSuspension_1=function(){return(Do=b._emscripten_bind_btWheelInfo_set_m_clippedInvContactDotSuspension_1=\nb.asm.tm).apply(null,arguments)},Eo=b._emscripten_bind_btWheelInfo_get_m_suspensionRelativeVelocity_0=function(){return(Eo=b._emscripten_bind_btWheelInfo_get_m_suspensionRelativeVelocity_0=b.asm.um).apply(null,arguments)},Fo=b._emscripten_bind_btWheelInfo_set_m_suspensionRelativeVelocity_1=function(){return(Fo=b._emscripten_bind_btWheelInfo_set_m_suspensionRelativeVelocity_1=b.asm.vm).apply(null,arguments)},Go=b._emscripten_bind_btWheelInfo_get_m_skidInfo_0=function(){return(Go=b._emscripten_bind_btWheelInfo_get_m_skidInfo_0=\nb.asm.wm).apply(null,arguments)},Ho=b._emscripten_bind_btWheelInfo_set_m_skidInfo_1=function(){return(Ho=b._emscripten_bind_btWheelInfo_set_m_skidInfo_1=b.asm.xm).apply(null,arguments)},Io=b._emscripten_bind_btWheelInfo___destroy___0=function(){return(Io=b._emscripten_bind_btWheelInfo___destroy___0=b.asm.ym).apply(null,arguments)},Jo=b._emscripten_bind_btVector4_btVector4_0=function(){return(Jo=b._emscripten_bind_btVector4_btVector4_0=b.asm.zm).apply(null,arguments)},Ko=b._emscripten_bind_btVector4_btVector4_4=\nfunction(){return(Ko=b._emscripten_bind_btVector4_btVector4_4=b.asm.Am).apply(null,arguments)},Lo=b._emscripten_bind_btVector4_w_0=function(){return(Lo=b._emscripten_bind_btVector4_w_0=b.asm.Bm).apply(null,arguments)},Mo=b._emscripten_bind_btVector4_setValue_4=function(){return(Mo=b._emscripten_bind_btVector4_setValue_4=b.asm.Cm).apply(null,arguments)},No=b._emscripten_bind_btVector4_length_0=function(){return(No=b._emscripten_bind_btVector4_length_0=b.asm.Dm).apply(null,arguments)},Oo=b._emscripten_bind_btVector4_x_0=\nfunction(){return(Oo=b._emscripten_bind_btVector4_x_0=b.asm.Em).apply(null,arguments)},Po=b._emscripten_bind_btVector4_y_0=function(){return(Po=b._emscripten_bind_btVector4_y_0=b.asm.Fm).apply(null,arguments)},Qo=b._emscripten_bind_btVector4_z_0=function(){return(Qo=b._emscripten_bind_btVector4_z_0=b.asm.Gm).apply(null,arguments)},Ro=b._emscripten_bind_btVector4_setX_1=function(){return(Ro=b._emscripten_bind_btVector4_setX_1=b.asm.Hm).apply(null,arguments)},So=b._emscripten_bind_btVector4_setY_1=\nfunction(){return(So=b._emscripten_bind_btVector4_setY_1=b.asm.Im).apply(null,arguments)},To=b._emscripten_bind_btVector4_setZ_1=function(){return(To=b._emscripten_bind_btVector4_setZ_1=b.asm.Jm).apply(null,arguments)},Uo=b._emscripten_bind_btVector4_normalize_0=function(){return(Uo=b._emscripten_bind_btVector4_normalize_0=b.asm.Km).apply(null,arguments)},Vo=b._emscripten_bind_btVector4_rotate_2=function(){return(Vo=b._emscripten_bind_btVector4_rotate_2=b.asm.Lm).apply(null,arguments)},Wo=b._emscripten_bind_btVector4_dot_1=\nfunction(){return(Wo=b._emscripten_bind_btVector4_dot_1=b.asm.Mm).apply(null,arguments)},Xo=b._emscripten_bind_btVector4_op_mul_1=function(){return(Xo=b._emscripten_bind_btVector4_op_mul_1=b.asm.Nm).apply(null,arguments)},Yo=b._emscripten_bind_btVector4_op_add_1=function(){return(Yo=b._emscripten_bind_btVector4_op_add_1=b.asm.Om).apply(null,arguments)},Zo=b._emscripten_bind_btVector4_op_sub_1=function(){return(Zo=b._emscripten_bind_btVector4_op_sub_1=b.asm.Pm).apply(null,arguments)},$o=b._emscripten_bind_btVector4___destroy___0=\nfunction(){return($o=b._emscripten_bind_btVector4___destroy___0=b.asm.Qm).apply(null,arguments)},ap=b._emscripten_bind_btDefaultCollisionConstructionInfo_btDefaultCollisionConstructionInfo_0=function(){return(ap=b._emscripten_bind_btDefaultCollisionConstructionInfo_btDefaultCollisionConstructionInfo_0=b.asm.Rm).apply(null,arguments)},bp=b._emscripten_bind_btDefaultCollisionConstructionInfo___destroy___0=function(){return(bp=b._emscripten_bind_btDefaultCollisionConstructionInfo___destroy___0=b.asm.Sm).apply(null,\narguments)},cp=b._emscripten_bind_Anchor_get_m_node_0=function(){return(cp=b._emscripten_bind_Anchor_get_m_node_0=b.asm.Tm).apply(null,arguments)},dp=b._emscripten_bind_Anchor_set_m_node_1=function(){return(dp=b._emscripten_bind_Anchor_set_m_node_1=b.asm.Um).apply(null,arguments)},ep=b._emscripten_bind_Anchor_get_m_local_0=function(){return(ep=b._emscripten_bind_Anchor_get_m_local_0=b.asm.Vm).apply(null,arguments)},fp=b._emscripten_bind_Anchor_set_m_local_1=function(){return(fp=b._emscripten_bind_Anchor_set_m_local_1=\nb.asm.Wm).apply(null,arguments)},gp=b._emscripten_bind_Anchor_get_m_body_0=function(){return(gp=b._emscripten_bind_Anchor_get_m_body_0=b.asm.Xm).apply(null,arguments)},hp=b._emscripten_bind_Anchor_set_m_body_1=function(){return(hp=b._emscripten_bind_Anchor_set_m_body_1=b.asm.Ym).apply(null,arguments)},ip=b._emscripten_bind_Anchor_get_m_influence_0=function(){return(ip=b._emscripten_bind_Anchor_get_m_influence_0=b.asm.Zm).apply(null,arguments)},jp=b._emscripten_bind_Anchor_set_m_influence_1=function(){return(jp=\nb._emscripten_bind_Anchor_set_m_influence_1=b.asm._m).apply(null,arguments)},kp=b._emscripten_bind_Anchor_get_m_c0_0=function(){return(kp=b._emscripten_bind_Anchor_get_m_c0_0=b.asm.$m).apply(null,arguments)},lp=b._emscripten_bind_Anchor_set_m_c0_1=function(){return(lp=b._emscripten_bind_Anchor_set_m_c0_1=b.asm.an).apply(null,arguments)},mp=b._emscripten_bind_Anchor_get_m_c1_0=function(){return(mp=b._emscripten_bind_Anchor_get_m_c1_0=b.asm.bn).apply(null,arguments)},np=b._emscripten_bind_Anchor_set_m_c1_1=\nfunction(){return(np=b._emscripten_bind_Anchor_set_m_c1_1=b.asm.cn).apply(null,arguments)},op=b._emscripten_bind_Anchor_get_m_c2_0=function(){return(op=b._emscripten_bind_Anchor_get_m_c2_0=b.asm.dn).apply(null,arguments)},pp=b._emscripten_bind_Anchor_set_m_c2_1=function(){return(pp=b._emscripten_bind_Anchor_set_m_c2_1=b.asm.en).apply(null,arguments)},qp=b._emscripten_bind_Anchor___destroy___0=function(){return(qp=b._emscripten_bind_Anchor___destroy___0=b.asm.fn).apply(null,arguments)},rp=b._emscripten_bind_btVehicleRaycasterResult_get_m_hitPointInWorld_0=\nfunction(){return(rp=b._emscripten_bind_btVehicleRaycasterResult_get_m_hitPointInWorld_0=b.asm.gn).apply(null,arguments)},sp=b._emscripten_bind_btVehicleRaycasterResult_set_m_hitPointInWorld_1=function(){return(sp=b._emscripten_bind_btVehicleRaycasterResult_set_m_hitPointInWorld_1=b.asm.hn).apply(null,arguments)},tp=b._emscripten_bind_btVehicleRaycasterResult_get_m_hitNormalInWorld_0=function(){return(tp=b._emscripten_bind_btVehicleRaycasterResult_get_m_hitNormalInWorld_0=b.asm.jn).apply(null,arguments)},\nup=b._emscripten_bind_btVehicleRaycasterResult_set_m_hitNormalInWorld_1=function(){return(up=b._emscripten_bind_btVehicleRaycasterResult_set_m_hitNormalInWorld_1=b.asm.kn).apply(null,arguments)},vp=b._emscripten_bind_btVehicleRaycasterResult_get_m_distFraction_0=function(){return(vp=b._emscripten_bind_btVehicleRaycasterResult_get_m_distFraction_0=b.asm.ln).apply(null,arguments)},wp=b._emscripten_bind_btVehicleRaycasterResult_set_m_distFraction_1=function(){return(wp=b._emscripten_bind_btVehicleRaycasterResult_set_m_distFraction_1=\nb.asm.mn).apply(null,arguments)},xp=b._emscripten_bind_btVehicleRaycasterResult___destroy___0=function(){return(xp=b._emscripten_bind_btVehicleRaycasterResult___destroy___0=b.asm.nn).apply(null,arguments)},yp=b._emscripten_bind_btVector3Array_size_0=function(){return(yp=b._emscripten_bind_btVector3Array_size_0=b.asm.on).apply(null,arguments)},zp=b._emscripten_bind_btVector3Array_at_1=function(){return(zp=b._emscripten_bind_btVector3Array_at_1=b.asm.pn).apply(null,arguments)},Ap=b._emscripten_bind_btVector3Array___destroy___0=\nfunction(){return(Ap=b._emscripten_bind_btVector3Array___destroy___0=b.asm.qn).apply(null,arguments)},Bp=b._emscripten_bind_btConstraintSolver___destroy___0=function(){return(Bp=b._emscripten_bind_btConstraintSolver___destroy___0=b.asm.rn).apply(null,arguments)},Cp=b._emscripten_bind_btRaycastVehicle_btRaycastVehicle_3=function(){return(Cp=b._emscripten_bind_btRaycastVehicle_btRaycastVehicle_3=b.asm.sn).apply(null,arguments)},Dp=b._emscripten_bind_btRaycastVehicle_applyEngineForce_2=function(){return(Dp=\nb._emscripten_bind_btRaycastVehicle_applyEngineForce_2=b.asm.tn).apply(null,arguments)},Ep=b._emscripten_bind_btRaycastVehicle_setSteeringValue_2=function(){return(Ep=b._emscripten_bind_btRaycastVehicle_setSteeringValue_2=b.asm.un).apply(null,arguments)},Fp=b._emscripten_bind_btRaycastVehicle_getWheelTransformWS_1=function(){return(Fp=b._emscripten_bind_btRaycastVehicle_getWheelTransformWS_1=b.asm.vn).apply(null,arguments)},Gp=b._emscripten_bind_btRaycastVehicle_updateWheelTransform_2=function(){return(Gp=\nb._emscripten_bind_btRaycastVehicle_updateWheelTransform_2=b.asm.wn).apply(null,arguments)},Hp=b._emscripten_bind_btRaycastVehicle_addWheel_7=function(){return(Hp=b._emscripten_bind_btRaycastVehicle_addWheel_7=b.asm.xn).apply(null,arguments)},Ip=b._emscripten_bind_btRaycastVehicle_getNumWheels_0=function(){return(Ip=b._emscripten_bind_btRaycastVehicle_getNumWheels_0=b.asm.yn).apply(null,arguments)},Jp=b._emscripten_bind_btRaycastVehicle_getRigidBody_0=function(){return(Jp=b._emscripten_bind_btRaycastVehicle_getRigidBody_0=\nb.asm.zn).apply(null,arguments)},Kp=b._emscripten_bind_btRaycastVehicle_getWheelInfo_1=function(){return(Kp=b._emscripten_bind_btRaycastVehicle_getWheelInfo_1=b.asm.An).apply(null,arguments)},Lp=b._emscripten_bind_btRaycastVehicle_setBrake_2=function(){return(Lp=b._emscripten_bind_btRaycastVehicle_setBrake_2=b.asm.Bn).apply(null,arguments)},Mp=b._emscripten_bind_btRaycastVehicle_setCoordinateSystem_3=function(){return(Mp=b._emscripten_bind_btRaycastVehicle_setCoordinateSystem_3=b.asm.Cn).apply(null,\narguments)},Np=b._emscripten_bind_btRaycastVehicle_getCurrentSpeedKmHour_0=function(){return(Np=b._emscripten_bind_btRaycastVehicle_getCurrentSpeedKmHour_0=b.asm.Dn).apply(null,arguments)},Op=b._emscripten_bind_btRaycastVehicle_getChassisWorldTransform_0=function(){return(Op=b._emscripten_bind_btRaycastVehicle_getChassisWorldTransform_0=b.asm.En).apply(null,arguments)},Pp=b._emscripten_bind_btRaycastVehicle_rayCast_1=function(){return(Pp=b._emscripten_bind_btRaycastVehicle_rayCast_1=b.asm.Fn).apply(null,\narguments)},Qp=b._emscripten_bind_btRaycastVehicle_updateVehicle_1=function(){return(Qp=b._emscripten_bind_btRaycastVehicle_updateVehicle_1=b.asm.Gn).apply(null,arguments)},Rp=b._emscripten_bind_btRaycastVehicle_resetSuspension_0=function(){return(Rp=b._emscripten_bind_btRaycastVehicle_resetSuspension_0=b.asm.Hn).apply(null,arguments)},Sp=b._emscripten_bind_btRaycastVehicle_getSteeringValue_1=function(){return(Sp=b._emscripten_bind_btRaycastVehicle_getSteeringValue_1=b.asm.In).apply(null,arguments)},\nTp=b._emscripten_bind_btRaycastVehicle_updateWheelTransformsWS_1=function(){return(Tp=b._emscripten_bind_btRaycastVehicle_updateWheelTransformsWS_1=b.asm.Jn).apply(null,arguments)},Up=b._emscripten_bind_btRaycastVehicle_updateWheelTransformsWS_2=function(){return(Up=b._emscripten_bind_btRaycastVehicle_updateWheelTransformsWS_2=b.asm.Kn).apply(null,arguments)},Vp=b._emscripten_bind_btRaycastVehicle_setPitchControl_1=function(){return(Vp=b._emscripten_bind_btRaycastVehicle_setPitchControl_1=b.asm.Ln).apply(null,\narguments)},Wp=b._emscripten_bind_btRaycastVehicle_updateSuspension_1=function(){return(Wp=b._emscripten_bind_btRaycastVehicle_updateSuspension_1=b.asm.Mn).apply(null,arguments)},Xp=b._emscripten_bind_btRaycastVehicle_updateFriction_1=function(){return(Xp=b._emscripten_bind_btRaycastVehicle_updateFriction_1=b.asm.Nn).apply(null,arguments)},Yp=b._emscripten_bind_btRaycastVehicle_getRightAxis_0=function(){return(Yp=b._emscripten_bind_btRaycastVehicle_getRightAxis_0=b.asm.On).apply(null,arguments)},\nZp=b._emscripten_bind_btRaycastVehicle_getUpAxis_0=function(){return(Zp=b._emscripten_bind_btRaycastVehicle_getUpAxis_0=b.asm.Pn).apply(null,arguments)},$p=b._emscripten_bind_btRaycastVehicle_getForwardAxis_0=function(){return($p=b._emscripten_bind_btRaycastVehicle_getForwardAxis_0=b.asm.Qn).apply(null,arguments)},aq=b._emscripten_bind_btRaycastVehicle_getForwardVector_0=function(){return(aq=b._emscripten_bind_btRaycastVehicle_getForwardVector_0=b.asm.Rn).apply(null,arguments)},bq=b._emscripten_bind_btRaycastVehicle_getUserConstraintType_0=\nfunction(){return(bq=b._emscripten_bind_btRaycastVehicle_getUserConstraintType_0=b.asm.Sn).apply(null,arguments)},cq=b._emscripten_bind_btRaycastVehicle_setUserConstraintType_1=function(){return(cq=b._emscripten_bind_btRaycastVehicle_setUserConstraintType_1=b.asm.Tn).apply(null,arguments)},dq=b._emscripten_bind_btRaycastVehicle_setUserConstraintId_1=function(){return(dq=b._emscripten_bind_btRaycastVehicle_setUserConstraintId_1=b.asm.Un).apply(null,arguments)},eq=b._emscripten_bind_btRaycastVehicle_getUserConstraintId_0=\nfunction(){return(eq=b._emscripten_bind_btRaycastVehicle_getUserConstraintId_0=b.asm.Vn).apply(null,arguments)},fq=b._emscripten_bind_btRaycastVehicle_updateAction_2=function(){return(fq=b._emscripten_bind_btRaycastVehicle_updateAction_2=b.asm.Wn).apply(null,arguments)},gq=b._emscripten_bind_btRaycastVehicle___destroy___0=function(){return(gq=b._emscripten_bind_btRaycastVehicle___destroy___0=b.asm.Xn).apply(null,arguments)},hq=b._emscripten_bind_btCylinderShapeX_btCylinderShapeX_1=function(){return(hq=\nb._emscripten_bind_btCylinderShapeX_btCylinderShapeX_1=b.asm.Yn).apply(null,arguments)},iq=b._emscripten_bind_btCylinderShapeX_setMargin_1=function(){return(iq=b._emscripten_bind_btCylinderShapeX_setMargin_1=b.asm.Zn).apply(null,arguments)},jq=b._emscripten_bind_btCylinderShapeX_getMargin_0=function(){return(jq=b._emscripten_bind_btCylinderShapeX_getMargin_0=b.asm._n).apply(null,arguments)},kq=b._emscripten_bind_btCylinderShapeX_setLocalScaling_1=function(){return(kq=b._emscripten_bind_btCylinderShapeX_setLocalScaling_1=\nb.asm.$n).apply(null,arguments)},lq=b._emscripten_bind_btCylinderShapeX_getLocalScaling_0=function(){return(lq=b._emscripten_bind_btCylinderShapeX_getLocalScaling_0=b.asm.ao).apply(null,arguments)},mq=b._emscripten_bind_btCylinderShapeX_calculateLocalInertia_2=function(){return(mq=b._emscripten_bind_btCylinderShapeX_calculateLocalInertia_2=b.asm.bo).apply(null,arguments)},nq=b._emscripten_bind_btCylinderShapeX___destroy___0=function(){return(nq=b._emscripten_bind_btCylinderShapeX___destroy___0=b.asm.co).apply(null,\narguments)},oq=b._emscripten_bind_btCylinderShapeZ_btCylinderShapeZ_1=function(){return(oq=b._emscripten_bind_btCylinderShapeZ_btCylinderShapeZ_1=b.asm.eo).apply(null,arguments)},pq=b._emscripten_bind_btCylinderShapeZ_setMargin_1=function(){return(pq=b._emscripten_bind_btCylinderShapeZ_setMargin_1=b.asm.fo).apply(null,arguments)},qq=b._emscripten_bind_btCylinderShapeZ_getMargin_0=function(){return(qq=b._emscripten_bind_btCylinderShapeZ_getMargin_0=b.asm.go).apply(null,arguments)},rq=b._emscripten_bind_btCylinderShapeZ_setLocalScaling_1=\nfunction(){return(rq=b._emscripten_bind_btCylinderShapeZ_setLocalScaling_1=b.asm.ho).apply(null,arguments)},sq=b._emscripten_bind_btCylinderShapeZ_getLocalScaling_0=function(){return(sq=b._emscripten_bind_btCylinderShapeZ_getLocalScaling_0=b.asm.io).apply(null,arguments)},tq=b._emscripten_bind_btCylinderShapeZ_calculateLocalInertia_2=function(){return(tq=b._emscripten_bind_btCylinderShapeZ_calculateLocalInertia_2=b.asm.jo).apply(null,arguments)},uq=b._emscripten_bind_btCylinderShapeZ___destroy___0=\nfunction(){return(uq=b._emscripten_bind_btCylinderShapeZ___destroy___0=b.asm.ko).apply(null,arguments)},vq=b._emscripten_bind_btConvexPolyhedron_get_m_vertices_0=function(){return(vq=b._emscripten_bind_btConvexPolyhedron_get_m_vertices_0=b.asm.lo).apply(null,arguments)},wq=b._emscripten_bind_btConvexPolyhedron_set_m_vertices_1=function(){return(wq=b._emscripten_bind_btConvexPolyhedron_set_m_vertices_1=b.asm.mo).apply(null,arguments)},xq=b._emscripten_bind_btConvexPolyhedron_get_m_faces_0=function(){return(xq=\nb._emscripten_bind_btConvexPolyhedron_get_m_faces_0=b.asm.no).apply(null,arguments)},yq=b._emscripten_bind_btConvexPolyhedron_set_m_faces_1=function(){return(yq=b._emscripten_bind_btConvexPolyhedron_set_m_faces_1=b.asm.oo).apply(null,arguments)},zq=b._emscripten_bind_btConvexPolyhedron___destroy___0=function(){return(zq=b._emscripten_bind_btConvexPolyhedron___destroy___0=b.asm.po).apply(null,arguments)},Aq=b._emscripten_bind_btSequentialImpulseConstraintSolver_btSequentialImpulseConstraintSolver_0=\nfunction(){return(Aq=b._emscripten_bind_btSequentialImpulseConstraintSolver_btSequentialImpulseConstraintSolver_0=b.asm.qo).apply(null,arguments)},Bq=b._emscripten_bind_btSequentialImpulseConstraintSolver___destroy___0=function(){return(Bq=b._emscripten_bind_btSequentialImpulseConstraintSolver___destroy___0=b.asm.ro).apply(null,arguments)},Cq=b._emscripten_bind_tAnchorArray_size_0=function(){return(Cq=b._emscripten_bind_tAnchorArray_size_0=b.asm.so).apply(null,arguments)},Dq=b._emscripten_bind_tAnchorArray_at_1=\nfunction(){return(Dq=b._emscripten_bind_tAnchorArray_at_1=b.asm.to).apply(null,arguments)},Eq=b._emscripten_bind_tAnchorArray_clear_0=function(){return(Eq=b._emscripten_bind_tAnchorArray_clear_0=b.asm.uo).apply(null,arguments)},Fq=b._emscripten_bind_tAnchorArray_push_back_1=function(){return(Fq=b._emscripten_bind_tAnchorArray_push_back_1=b.asm.vo).apply(null,arguments)},Gq=b._emscripten_bind_tAnchorArray_pop_back_0=function(){return(Gq=b._emscripten_bind_tAnchorArray_pop_back_0=b.asm.wo).apply(null,\narguments)},Hq=b._emscripten_bind_tAnchorArray___destroy___0=function(){return(Hq=b._emscripten_bind_tAnchorArray___destroy___0=b.asm.xo).apply(null,arguments)},Iq=b._emscripten_bind_RaycastInfo_get_m_contactNormalWS_0=function(){return(Iq=b._emscripten_bind_RaycastInfo_get_m_contactNormalWS_0=b.asm.yo).apply(null,arguments)},Jq=b._emscripten_bind_RaycastInfo_set_m_contactNormalWS_1=function(){return(Jq=b._emscripten_bind_RaycastInfo_set_m_contactNormalWS_1=b.asm.zo).apply(null,arguments)},Kq=b._emscripten_bind_RaycastInfo_get_m_contactPointWS_0=\nfunction(){return(Kq=b._emscripten_bind_RaycastInfo_get_m_contactPointWS_0=b.asm.Ao).apply(null,arguments)},Lq=b._emscripten_bind_RaycastInfo_set_m_contactPointWS_1=function(){return(Lq=b._emscripten_bind_RaycastInfo_set_m_contactPointWS_1=b.asm.Bo).apply(null,arguments)},Mq=b._emscripten_bind_RaycastInfo_get_m_suspensionLength_0=function(){return(Mq=b._emscripten_bind_RaycastInfo_get_m_suspensionLength_0=b.asm.Co).apply(null,arguments)},Nq=b._emscripten_bind_RaycastInfo_set_m_suspensionLength_1=\nfunction(){return(Nq=b._emscripten_bind_RaycastInfo_set_m_suspensionLength_1=b.asm.Do).apply(null,arguments)},Oq=b._emscripten_bind_RaycastInfo_get_m_hardPointWS_0=function(){return(Oq=b._emscripten_bind_RaycastInfo_get_m_hardPointWS_0=b.asm.Eo).apply(null,arguments)},Pq=b._emscripten_bind_RaycastInfo_set_m_hardPointWS_1=function(){return(Pq=b._emscripten_bind_RaycastInfo_set_m_hardPointWS_1=b.asm.Fo).apply(null,arguments)},Qq=b._emscripten_bind_RaycastInfo_get_m_wheelDirectionWS_0=function(){return(Qq=\nb._emscripten_bind_RaycastInfo_get_m_wheelDirectionWS_0=b.asm.Go).apply(null,arguments)},Rq=b._emscripten_bind_RaycastInfo_set_m_wheelDirectionWS_1=function(){return(Rq=b._emscripten_bind_RaycastInfo_set_m_wheelDirectionWS_1=b.asm.Ho).apply(null,arguments)},Sq=b._emscripten_bind_RaycastInfo_get_m_wheelAxleWS_0=function(){return(Sq=b._emscripten_bind_RaycastInfo_get_m_wheelAxleWS_0=b.asm.Io).apply(null,arguments)},Tq=b._emscripten_bind_RaycastInfo_set_m_wheelAxleWS_1=function(){return(Tq=b._emscripten_bind_RaycastInfo_set_m_wheelAxleWS_1=\nb.asm.Jo).apply(null,arguments)},Uq=b._emscripten_bind_RaycastInfo_get_m_isInContact_0=function(){return(Uq=b._emscripten_bind_RaycastInfo_get_m_isInContact_0=b.asm.Ko).apply(null,arguments)},Vq=b._emscripten_bind_RaycastInfo_set_m_isInContact_1=function(){return(Vq=b._emscripten_bind_RaycastInfo_set_m_isInContact_1=b.asm.Lo).apply(null,arguments)},Wq=b._emscripten_bind_RaycastInfo_get_m_groundObject_0=function(){return(Wq=b._emscripten_bind_RaycastInfo_get_m_groundObject_0=b.asm.Mo).apply(null,arguments)},\nXq=b._emscripten_bind_RaycastInfo_set_m_groundObject_1=function(){return(Xq=b._emscripten_bind_RaycastInfo_set_m_groundObject_1=b.asm.No).apply(null,arguments)},Yq=b._emscripten_bind_RaycastInfo___destroy___0=function(){return(Yq=b._emscripten_bind_RaycastInfo___destroy___0=b.asm.Oo).apply(null,arguments)},Zq=b._emscripten_bind_btMultiSphereShape_btMultiSphereShape_3=function(){return(Zq=b._emscripten_bind_btMultiSphereShape_btMultiSphereShape_3=b.asm.Po).apply(null,arguments)},$q=b._emscripten_bind_btMultiSphereShape_setLocalScaling_1=\nfunction(){return($q=b._emscripten_bind_btMultiSphereShape_setLocalScaling_1=b.asm.Qo).apply(null,arguments)},ar=b._emscripten_bind_btMultiSphereShape_getLocalScaling_0=function(){return(ar=b._emscripten_bind_btMultiSphereShape_getLocalScaling_0=b.asm.Ro).apply(null,arguments)},br=b._emscripten_bind_btMultiSphereShape_calculateLocalInertia_2=function(){return(br=b._emscripten_bind_btMultiSphereShape_calculateLocalInertia_2=b.asm.So).apply(null,arguments)},cr=b._emscripten_bind_btMultiSphereShape___destroy___0=\nfunction(){return(cr=b._emscripten_bind_btMultiSphereShape___destroy___0=b.asm.To).apply(null,arguments)},dr=b._emscripten_bind_btSoftBody_btSoftBody_4=function(){return(dr=b._emscripten_bind_btSoftBody_btSoftBody_4=b.asm.Uo).apply(null,arguments)},er=b._emscripten_bind_btSoftBody_checkLink_2=function(){return(er=b._emscripten_bind_btSoftBody_checkLink_2=b.asm.Vo).apply(null,arguments)},fr=b._emscripten_bind_btSoftBody_checkFace_3=function(){return(fr=b._emscripten_bind_btSoftBody_checkFace_3=b.asm.Wo).apply(null,\narguments)},gr=b._emscripten_bind_btSoftBody_appendMaterial_0=function(){return(gr=b._emscripten_bind_btSoftBody_appendMaterial_0=b.asm.Xo).apply(null,arguments)},hr=b._emscripten_bind_btSoftBody_appendNode_2=function(){return(hr=b._emscripten_bind_btSoftBody_appendNode_2=b.asm.Yo).apply(null,arguments)},ir=b._emscripten_bind_btSoftBody_appendLink_4=function(){return(ir=b._emscripten_bind_btSoftBody_appendLink_4=b.asm.Zo).apply(null,arguments)},jr=b._emscripten_bind_btSoftBody_appendFace_4=function(){return(jr=\nb._emscripten_bind_btSoftBody_appendFace_4=b.asm._o).apply(null,arguments)},kr=b._emscripten_bind_btSoftBody_appendTetra_5=function(){return(kr=b._emscripten_bind_btSoftBody_appendTetra_5=b.asm.$o).apply(null,arguments)},lr=b._emscripten_bind_btSoftBody_appendAnchor_4=function(){return(lr=b._emscripten_bind_btSoftBody_appendAnchor_4=b.asm.ap).apply(null,arguments)},mr=b._emscripten_bind_btSoftBody_addForce_1=function(){return(mr=b._emscripten_bind_btSoftBody_addForce_1=b.asm.bp).apply(null,arguments)},\nnr=b._emscripten_bind_btSoftBody_addForce_2=function(){return(nr=b._emscripten_bind_btSoftBody_addForce_2=b.asm.cp).apply(null,arguments)},or=b._emscripten_bind_btSoftBody_addAeroForceToNode_2=function(){return(or=b._emscripten_bind_btSoftBody_addAeroForceToNode_2=b.asm.dp).apply(null,arguments)},pr=b._emscripten_bind_btSoftBody_getTotalMass_0=function(){return(pr=b._emscripten_bind_btSoftBody_getTotalMass_0=b.asm.ep).apply(null,arguments)},qr=b._emscripten_bind_btSoftBody_setTotalMass_2=function(){return(qr=\nb._emscripten_bind_btSoftBody_setTotalMass_2=b.asm.fp).apply(null,arguments)},rr=b._emscripten_bind_btSoftBody_setMass_2=function(){return(rr=b._emscripten_bind_btSoftBody_setMass_2=b.asm.gp).apply(null,arguments)},sr=b._emscripten_bind_btSoftBody_transform_1=function(){return(sr=b._emscripten_bind_btSoftBody_transform_1=b.asm.hp).apply(null,arguments)},tr=b._emscripten_bind_btSoftBody_translate_1=function(){return(tr=b._emscripten_bind_btSoftBody_translate_1=b.asm.ip).apply(null,arguments)},ur=b._emscripten_bind_btSoftBody_rotate_1=\nfunction(){return(ur=b._emscripten_bind_btSoftBody_rotate_1=b.asm.jp).apply(null,arguments)},vr=b._emscripten_bind_btSoftBody_scale_1=function(){return(vr=b._emscripten_bind_btSoftBody_scale_1=b.asm.kp).apply(null,arguments)},wr=b._emscripten_bind_btSoftBody_generateClusters_1=function(){return(wr=b._emscripten_bind_btSoftBody_generateClusters_1=b.asm.lp).apply(null,arguments)},xr=b._emscripten_bind_btSoftBody_generateClusters_2=function(){return(xr=b._emscripten_bind_btSoftBody_generateClusters_2=\nb.asm.mp).apply(null,arguments)},yr=b._emscripten_bind_btSoftBody_generateBendingConstraints_2=function(){return(yr=b._emscripten_bind_btSoftBody_generateBendingConstraints_2=b.asm.np).apply(null,arguments)},zr=b._emscripten_bind_btSoftBody_upcast_1=function(){return(zr=b._emscripten_bind_btSoftBody_upcast_1=b.asm.op).apply(null,arguments)},Ar=b._emscripten_bind_btSoftBody_setAnisotropicFriction_2=function(){return(Ar=b._emscripten_bind_btSoftBody_setAnisotropicFriction_2=b.asm.pp).apply(null,arguments)},\nBr=b._emscripten_bind_btSoftBody_getCollisionShape_0=function(){return(Br=b._emscripten_bind_btSoftBody_getCollisionShape_0=b.asm.qp).apply(null,arguments)},Cr=b._emscripten_bind_btSoftBody_setContactProcessingThreshold_1=function(){return(Cr=b._emscripten_bind_btSoftBody_setContactProcessingThreshold_1=b.asm.rp).apply(null,arguments)},Dr=b._emscripten_bind_btSoftBody_setActivationState_1=function(){return(Dr=b._emscripten_bind_btSoftBody_setActivationState_1=b.asm.sp).apply(null,arguments)},Er=b._emscripten_bind_btSoftBody_forceActivationState_1=\nfunction(){return(Er=b._emscripten_bind_btSoftBody_forceActivationState_1=b.asm.tp).apply(null,arguments)},Fr=b._emscripten_bind_btSoftBody_activate_0=function(){return(Fr=b._emscripten_bind_btSoftBody_activate_0=b.asm.up).apply(null,arguments)},Gr=b._emscripten_bind_btSoftBody_activate_1=function(){return(Gr=b._emscripten_bind_btSoftBody_activate_1=b.asm.vp).apply(null,arguments)},Hr=b._emscripten_bind_btSoftBody_isActive_0=function(){return(Hr=b._emscripten_bind_btSoftBody_isActive_0=b.asm.wp).apply(null,\narguments)},Ir=b._emscripten_bind_btSoftBody_isKinematicObject_0=function(){return(Ir=b._emscripten_bind_btSoftBody_isKinematicObject_0=b.asm.xp).apply(null,arguments)},Jr=b._emscripten_bind_btSoftBody_isStaticObject_0=function(){return(Jr=b._emscripten_bind_btSoftBody_isStaticObject_0=b.asm.yp).apply(null,arguments)},Kr=b._emscripten_bind_btSoftBody_isStaticOrKinematicObject_0=function(){return(Kr=b._emscripten_bind_btSoftBody_isStaticOrKinematicObject_0=b.asm.zp).apply(null,arguments)},Lr=b._emscripten_bind_btSoftBody_getRestitution_0=\nfunction(){return(Lr=b._emscripten_bind_btSoftBody_getRestitution_0=b.asm.Ap).apply(null,arguments)},Mr=b._emscripten_bind_btSoftBody_getFriction_0=function(){return(Mr=b._emscripten_bind_btSoftBody_getFriction_0=b.asm.Bp).apply(null,arguments)},Nr=b._emscripten_bind_btSoftBody_getRollingFriction_0=function(){return(Nr=b._emscripten_bind_btSoftBody_getRollingFriction_0=b.asm.Cp).apply(null,arguments)},Or=b._emscripten_bind_btSoftBody_setRestitution_1=function(){return(Or=b._emscripten_bind_btSoftBody_setRestitution_1=\nb.asm.Dp).apply(null,arguments)},Pr=b._emscripten_bind_btSoftBody_setFriction_1=function(){return(Pr=b._emscripten_bind_btSoftBody_setFriction_1=b.asm.Ep).apply(null,arguments)},Qr=b._emscripten_bind_btSoftBody_setRollingFriction_1=function(){return(Qr=b._emscripten_bind_btSoftBody_setRollingFriction_1=b.asm.Fp).apply(null,arguments)},Rr=b._emscripten_bind_btSoftBody_getWorldTransform_0=function(){return(Rr=b._emscripten_bind_btSoftBody_getWorldTransform_0=b.asm.Gp).apply(null,arguments)},Sr=b._emscripten_bind_btSoftBody_getCollisionFlags_0=\nfunction(){return(Sr=b._emscripten_bind_btSoftBody_getCollisionFlags_0=b.asm.Hp).apply(null,arguments)},Tr=b._emscripten_bind_btSoftBody_setCollisionFlags_1=function(){return(Tr=b._emscripten_bind_btSoftBody_setCollisionFlags_1=b.asm.Ip).apply(null,arguments)},Ur=b._emscripten_bind_btSoftBody_setWorldTransform_1=function(){return(Ur=b._emscripten_bind_btSoftBody_setWorldTransform_1=b.asm.Jp).apply(null,arguments)},Vr=b._emscripten_bind_btSoftBody_setCollisionShape_1=function(){return(Vr=b._emscripten_bind_btSoftBody_setCollisionShape_1=\nb.asm.Kp).apply(null,arguments)},Wr=b._emscripten_bind_btSoftBody_setCcdMotionThreshold_1=function(){return(Wr=b._emscripten_bind_btSoftBody_setCcdMotionThreshold_1=b.asm.Lp).apply(null,arguments)},Xr=b._emscripten_bind_btSoftBody_setCcdSweptSphereRadius_1=function(){return(Xr=b._emscripten_bind_btSoftBody_setCcdSweptSphereRadius_1=b.asm.Mp).apply(null,arguments)},Yr=b._emscripten_bind_btSoftBody_getUserIndex_0=function(){return(Yr=b._emscripten_bind_btSoftBody_getUserIndex_0=b.asm.Np).apply(null,\narguments)},Zr=b._emscripten_bind_btSoftBody_setUserIndex_1=function(){return(Zr=b._emscripten_bind_btSoftBody_setUserIndex_1=b.asm.Op).apply(null,arguments)},$r=b._emscripten_bind_btSoftBody_getUserPointer_0=function(){return($r=b._emscripten_bind_btSoftBody_getUserPointer_0=b.asm.Pp).apply(null,arguments)},as=b._emscripten_bind_btSoftBody_setUserPointer_1=function(){return(as=b._emscripten_bind_btSoftBody_setUserPointer_1=b.asm.Qp).apply(null,arguments)},bs=b._emscripten_bind_btSoftBody_getBroadphaseHandle_0=\nfunction(){return(bs=b._emscripten_bind_btSoftBody_getBroadphaseHandle_0=b.asm.Rp).apply(null,arguments)},cs=b._emscripten_bind_btSoftBody_get_m_cfg_0=function(){return(cs=b._emscripten_bind_btSoftBody_get_m_cfg_0=b.asm.Sp).apply(null,arguments)},ds=b._emscripten_bind_btSoftBody_set_m_cfg_1=function(){return(ds=b._emscripten_bind_btSoftBody_set_m_cfg_1=b.asm.Tp).apply(null,arguments)},es=b._emscripten_bind_btSoftBody_get_m_nodes_0=function(){return(es=b._emscripten_bind_btSoftBody_get_m_nodes_0=b.asm.Up).apply(null,\narguments)},gs=b._emscripten_bind_btSoftBody_set_m_nodes_1=function(){return(gs=b._emscripten_bind_btSoftBody_set_m_nodes_1=b.asm.Vp).apply(null,arguments)},hs=b._emscripten_bind_btSoftBody_get_m_faces_0=function(){return(hs=b._emscripten_bind_btSoftBody_get_m_faces_0=b.asm.Wp).apply(null,arguments)},is=b._emscripten_bind_btSoftBody_set_m_faces_1=function(){return(is=b._emscripten_bind_btSoftBody_set_m_faces_1=b.asm.Xp).apply(null,arguments)},js=b._emscripten_bind_btSoftBody_get_m_materials_0=function(){return(js=\nb._emscripten_bind_btSoftBody_get_m_materials_0=b.asm.Yp).apply(null,arguments)},ks=b._emscripten_bind_btSoftBody_set_m_materials_1=function(){return(ks=b._emscripten_bind_btSoftBody_set_m_materials_1=b.asm.Zp).apply(null,arguments)},ls=b._emscripten_bind_btSoftBody_get_m_anchors_0=function(){return(ls=b._emscripten_bind_btSoftBody_get_m_anchors_0=b.asm._p).apply(null,arguments)},ms=b._emscripten_bind_btSoftBody_set_m_anchors_1=function(){return(ms=b._emscripten_bind_btSoftBody_set_m_anchors_1=b.asm.$p).apply(null,\narguments)},ns=b._emscripten_bind_btSoftBody___destroy___0=function(){return(ns=b._emscripten_bind_btSoftBody___destroy___0=b.asm.aq).apply(null,arguments)},ps=b._emscripten_bind_btIntArray_size_0=function(){return(ps=b._emscripten_bind_btIntArray_size_0=b.asm.bq).apply(null,arguments)},qs=b._emscripten_bind_btIntArray_at_1=function(){return(qs=b._emscripten_bind_btIntArray_at_1=b.asm.cq).apply(null,arguments)},rs=b._emscripten_bind_btIntArray___destroy___0=function(){return(rs=b._emscripten_bind_btIntArray___destroy___0=\nb.asm.dq).apply(null,arguments)},ss=b._emscripten_bind_Config_get_kVCF_0=function(){return(ss=b._emscripten_bind_Config_get_kVCF_0=b.asm.eq).apply(null,arguments)},ts=b._emscripten_bind_Config_set_kVCF_1=function(){return(ts=b._emscripten_bind_Config_set_kVCF_1=b.asm.fq).apply(null,arguments)},us=b._emscripten_bind_Config_get_kDP_0=function(){return(us=b._emscripten_bind_Config_get_kDP_0=b.asm.gq).apply(null,arguments)},vs=b._emscripten_bind_Config_set_kDP_1=function(){return(vs=b._emscripten_bind_Config_set_kDP_1=\nb.asm.hq).apply(null,arguments)},xs=b._emscripten_bind_Config_get_kDG_0=function(){return(xs=b._emscripten_bind_Config_get_kDG_0=b.asm.iq).apply(null,arguments)},ys=b._emscripten_bind_Config_set_kDG_1=function(){return(ys=b._emscripten_bind_Config_set_kDG_1=b.asm.jq).apply(null,arguments)},zs=b._emscripten_bind_Config_get_kLF_0=function(){return(zs=b._emscripten_bind_Config_get_kLF_0=b.asm.kq).apply(null,arguments)},As=b._emscripten_bind_Config_set_kLF_1=function(){return(As=b._emscripten_bind_Config_set_kLF_1=\nb.asm.lq).apply(null,arguments)},Bs=b._emscripten_bind_Config_get_kPR_0=function(){return(Bs=b._emscripten_bind_Config_get_kPR_0=b.asm.mq).apply(null,arguments)},Cs=b._emscripten_bind_Config_set_kPR_1=function(){return(Cs=b._emscripten_bind_Config_set_kPR_1=b.asm.nq).apply(null,arguments)},Ds=b._emscripten_bind_Config_get_kVC_0=function(){return(Ds=b._emscripten_bind_Config_get_kVC_0=b.asm.oq).apply(null,arguments)},Es=b._emscripten_bind_Config_set_kVC_1=function(){return(Es=b._emscripten_bind_Config_set_kVC_1=\nb.asm.pq).apply(null,arguments)},Fs=b._emscripten_bind_Config_get_kDF_0=function(){return(Fs=b._emscripten_bind_Config_get_kDF_0=b.asm.qq).apply(null,arguments)},Gs=b._emscripten_bind_Config_set_kDF_1=function(){return(Gs=b._emscripten_bind_Config_set_kDF_1=b.asm.rq).apply(null,arguments)},Hs=b._emscripten_bind_Config_get_kMT_0=function(){return(Hs=b._emscripten_bind_Config_get_kMT_0=b.asm.sq).apply(null,arguments)},Is=b._emscripten_bind_Config_set_kMT_1=function(){return(Is=b._emscripten_bind_Config_set_kMT_1=\nb.asm.tq).apply(null,arguments)},Js=b._emscripten_bind_Config_get_kCHR_0=function(){return(Js=b._emscripten_bind_Config_get_kCHR_0=b.asm.uq).apply(null,arguments)},Ks=b._emscripten_bind_Config_set_kCHR_1=function(){return(Ks=b._emscripten_bind_Config_set_kCHR_1=b.asm.vq).apply(null,arguments)},Ls=b._emscripten_bind_Config_get_kKHR_0=function(){return(Ls=b._emscripten_bind_Config_get_kKHR_0=b.asm.wq).apply(null,arguments)},Ms=b._emscripten_bind_Config_set_kKHR_1=function(){return(Ms=b._emscripten_bind_Config_set_kKHR_1=\nb.asm.xq).apply(null,arguments)},Ns=b._emscripten_bind_Config_get_kSHR_0=function(){return(Ns=b._emscripten_bind_Config_get_kSHR_0=b.asm.yq).apply(null,arguments)},Os=b._emscripten_bind_Config_set_kSHR_1=function(){return(Os=b._emscripten_bind_Config_set_kSHR_1=b.asm.zq).apply(null,arguments)},Ps=b._emscripten_bind_Config_get_kAHR_0=function(){return(Ps=b._emscripten_bind_Config_get_kAHR_0=b.asm.Aq).apply(null,arguments)},Qs=b._emscripten_bind_Config_set_kAHR_1=function(){return(Qs=b._emscripten_bind_Config_set_kAHR_1=\nb.asm.Bq).apply(null,arguments)},Rs=b._emscripten_bind_Config_get_kSRHR_CL_0=function(){return(Rs=b._emscripten_bind_Config_get_kSRHR_CL_0=b.asm.Cq).apply(null,arguments)},Ss=b._emscripten_bind_Config_set_kSRHR_CL_1=function(){return(Ss=b._emscripten_bind_Config_set_kSRHR_CL_1=b.asm.Dq).apply(null,arguments)},Ts=b._emscripten_bind_Config_get_kSKHR_CL_0=function(){return(Ts=b._emscripten_bind_Config_get_kSKHR_CL_0=b.asm.Eq).apply(null,arguments)},Us=b._emscripten_bind_Config_set_kSKHR_CL_1=function(){return(Us=\nb._emscripten_bind_Config_set_kSKHR_CL_1=b.asm.Fq).apply(null,arguments)},Vs=b._emscripten_bind_Config_get_kSSHR_CL_0=function(){return(Vs=b._emscripten_bind_Config_get_kSSHR_CL_0=b.asm.Gq).apply(null,arguments)},Ws=b._emscripten_bind_Config_set_kSSHR_CL_1=function(){return(Ws=b._emscripten_bind_Config_set_kSSHR_CL_1=b.asm.Hq).apply(null,arguments)},Xs=b._emscripten_bind_Config_get_kSR_SPLT_CL_0=function(){return(Xs=b._emscripten_bind_Config_get_kSR_SPLT_CL_0=b.asm.Iq).apply(null,arguments)},Ys=b._emscripten_bind_Config_set_kSR_SPLT_CL_1=\nfunction(){return(Ys=b._emscripten_bind_Config_set_kSR_SPLT_CL_1=b.asm.Jq).apply(null,arguments)},Zs=b._emscripten_bind_Config_get_kSK_SPLT_CL_0=function(){return(Zs=b._emscripten_bind_Config_get_kSK_SPLT_CL_0=b.asm.Kq).apply(null,arguments)},$s=b._emscripten_bind_Config_set_kSK_SPLT_CL_1=function(){return($s=b._emscripten_bind_Config_set_kSK_SPLT_CL_1=b.asm.Lq).apply(null,arguments)},at=b._emscripten_bind_Config_get_kSS_SPLT_CL_0=function(){return(at=b._emscripten_bind_Config_get_kSS_SPLT_CL_0=b.asm.Mq).apply(null,\narguments)},bt=b._emscripten_bind_Config_set_kSS_SPLT_CL_1=function(){return(bt=b._emscripten_bind_Config_set_kSS_SPLT_CL_1=b.asm.Nq).apply(null,arguments)},ct=b._emscripten_bind_Config_get_maxvolume_0=function(){return(ct=b._emscripten_bind_Config_get_maxvolume_0=b.asm.Oq).apply(null,arguments)},dt=b._emscripten_bind_Config_set_maxvolume_1=function(){return(dt=b._emscripten_bind_Config_set_maxvolume_1=b.asm.Pq).apply(null,arguments)},et=b._emscripten_bind_Config_get_timescale_0=function(){return(et=\nb._emscripten_bind_Config_get_timescale_0=b.asm.Qq).apply(null,arguments)},ft=b._emscripten_bind_Config_set_timescale_1=function(){return(ft=b._emscripten_bind_Config_set_timescale_1=b.asm.Rq).apply(null,arguments)},gt=b._emscripten_bind_Config_get_viterations_0=function(){return(gt=b._emscripten_bind_Config_get_viterations_0=b.asm.Sq).apply(null,arguments)},ht=b._emscripten_bind_Config_set_viterations_1=function(){return(ht=b._emscripten_bind_Config_set_viterations_1=b.asm.Tq).apply(null,arguments)},\nit=b._emscripten_bind_Config_get_piterations_0=function(){return(it=b._emscripten_bind_Config_get_piterations_0=b.asm.Uq).apply(null,arguments)},jt=b._emscripten_bind_Config_set_piterations_1=function(){return(jt=b._emscripten_bind_Config_set_piterations_1=b.asm.Vq).apply(null,arguments)},kt=b._emscripten_bind_Config_get_diterations_0=function(){return(kt=b._emscripten_bind_Config_get_diterations_0=b.asm.Wq).apply(null,arguments)},lt=b._emscripten_bind_Config_set_diterations_1=function(){return(lt=\nb._emscripten_bind_Config_set_diterations_1=b.asm.Xq).apply(null,arguments)},mt=b._emscripten_bind_Config_get_citerations_0=function(){return(mt=b._emscripten_bind_Config_get_citerations_0=b.asm.Yq).apply(null,arguments)},nt=b._emscripten_bind_Config_set_citerations_1=function(){return(nt=b._emscripten_bind_Config_set_citerations_1=b.asm.Zq).apply(null,arguments)},ot=b._emscripten_bind_Config_get_collisions_0=function(){return(ot=b._emscripten_bind_Config_get_collisions_0=b.asm._q).apply(null,arguments)},\npt=b._emscripten_bind_Config_set_collisions_1=function(){return(pt=b._emscripten_bind_Config_set_collisions_1=b.asm.$q).apply(null,arguments)},qt=b._emscripten_bind_Config___destroy___0=function(){return(qt=b._emscripten_bind_Config___destroy___0=b.asm.ar).apply(null,arguments)},rt=b._emscripten_bind_Node_get_m_x_0=function(){return(rt=b._emscripten_bind_Node_get_m_x_0=b.asm.br).apply(null,arguments)},st=b._emscripten_bind_Node_set_m_x_1=function(){return(st=b._emscripten_bind_Node_set_m_x_1=b.asm.cr).apply(null,\narguments)},tt=b._emscripten_bind_Node_get_m_q_0=function(){return(tt=b._emscripten_bind_Node_get_m_q_0=b.asm.dr).apply(null,arguments)},ut=b._emscripten_bind_Node_set_m_q_1=function(){return(ut=b._emscripten_bind_Node_set_m_q_1=b.asm.er).apply(null,arguments)},vt=b._emscripten_bind_Node_get_m_v_0=function(){return(vt=b._emscripten_bind_Node_get_m_v_0=b.asm.fr).apply(null,arguments)},wt=b._emscripten_bind_Node_set_m_v_1=function(){return(wt=b._emscripten_bind_Node_set_m_v_1=b.asm.gr).apply(null,arguments)},\nxt=b._emscripten_bind_Node_get_m_f_0=function(){return(xt=b._emscripten_bind_Node_get_m_f_0=b.asm.hr).apply(null,arguments)},yt=b._emscripten_bind_Node_set_m_f_1=function(){return(yt=b._emscripten_bind_Node_set_m_f_1=b.asm.ir).apply(null,arguments)},zt=b._emscripten_bind_Node_get_m_n_0=function(){return(zt=b._emscripten_bind_Node_get_m_n_0=b.asm.jr).apply(null,arguments)},At=b._emscripten_bind_Node_set_m_n_1=function(){return(At=b._emscripten_bind_Node_set_m_n_1=b.asm.kr).apply(null,arguments)},Bt=\nb._emscripten_bind_Node_get_m_im_0=function(){return(Bt=b._emscripten_bind_Node_get_m_im_0=b.asm.lr).apply(null,arguments)},Ct=b._emscripten_bind_Node_set_m_im_1=function(){return(Ct=b._emscripten_bind_Node_set_m_im_1=b.asm.mr).apply(null,arguments)},Dt=b._emscripten_bind_Node_get_m_area_0=function(){return(Dt=b._emscripten_bind_Node_get_m_area_0=b.asm.nr).apply(null,arguments)},Et=b._emscripten_bind_Node_set_m_area_1=function(){return(Et=b._emscripten_bind_Node_set_m_area_1=b.asm.or).apply(null,\narguments)},Ft=b._emscripten_bind_Node___destroy___0=function(){return(Ft=b._emscripten_bind_Node___destroy___0=b.asm.pr).apply(null,arguments)},Gt=b._emscripten_bind_btGhostPairCallback_btGhostPairCallback_0=function(){return(Gt=b._emscripten_bind_btGhostPairCallback_btGhostPairCallback_0=b.asm.qr).apply(null,arguments)},Ht=b._emscripten_bind_btGhostPairCallback___destroy___0=function(){return(Ht=b._emscripten_bind_btGhostPairCallback___destroy___0=b.asm.rr).apply(null,arguments)},It=b._emscripten_bind_btOverlappingPairCallback___destroy___0=\nfunction(){return(It=b._emscripten_bind_btOverlappingPairCallback___destroy___0=b.asm.sr).apply(null,arguments)},Jt=b._emscripten_bind_btKinematicCharacterController_btKinematicCharacterController_3=function(){return(Jt=b._emscripten_bind_btKinematicCharacterController_btKinematicCharacterController_3=b.asm.tr).apply(null,arguments)},Kt=b._emscripten_bind_btKinematicCharacterController_btKinematicCharacterController_4=function(){return(Kt=b._emscripten_bind_btKinematicCharacterController_btKinematicCharacterController_4=\nb.asm.ur).apply(null,arguments)},Lt=b._emscripten_bind_btKinematicCharacterController_setUpAxis_1=function(){return(Lt=b._emscripten_bind_btKinematicCharacterController_setUpAxis_1=b.asm.vr).apply(null,arguments)},Mt=b._emscripten_bind_btKinematicCharacterController_setWalkDirection_1=function(){return(Mt=b._emscripten_bind_btKinematicCharacterController_setWalkDirection_1=b.asm.wr).apply(null,arguments)},Nt=b._emscripten_bind_btKinematicCharacterController_setVelocityForTimeInterval_2=function(){return(Nt=\nb._emscripten_bind_btKinematicCharacterController_setVelocityForTimeInterval_2=b.asm.xr).apply(null,arguments)},Ot=b._emscripten_bind_btKinematicCharacterController_warp_1=function(){return(Ot=b._emscripten_bind_btKinematicCharacterController_warp_1=b.asm.yr).apply(null,arguments)},Pt=b._emscripten_bind_btKinematicCharacterController_preStep_1=function(){return(Pt=b._emscripten_bind_btKinematicCharacterController_preStep_1=b.asm.zr).apply(null,arguments)},Qt=b._emscripten_bind_btKinematicCharacterController_playerStep_2=\nfunction(){return(Qt=b._emscripten_bind_btKinematicCharacterController_playerStep_2=b.asm.Ar).apply(null,arguments)},Rt=b._emscripten_bind_btKinematicCharacterController_setFallSpeed_1=function(){return(Rt=b._emscripten_bind_btKinematicCharacterController_setFallSpeed_1=b.asm.Br).apply(null,arguments)},St=b._emscripten_bind_btKinematicCharacterController_setJumpSpeed_1=function(){return(St=b._emscripten_bind_btKinematicCharacterController_setJumpSpeed_1=b.asm.Cr).apply(null,arguments)},Tt=b._emscripten_bind_btKinematicCharacterController_setMaxJumpHeight_1=\nfunction(){return(Tt=b._emscripten_bind_btKinematicCharacterController_setMaxJumpHeight_1=b.asm.Dr).apply(null,arguments)},Ut=b._emscripten_bind_btKinematicCharacterController_canJump_0=function(){return(Ut=b._emscripten_bind_btKinematicCharacterController_canJump_0=b.asm.Er).apply(null,arguments)},Vt=b._emscripten_bind_btKinematicCharacterController_jump_0=function(){return(Vt=b._emscripten_bind_btKinematicCharacterController_jump_0=b.asm.Fr).apply(null,arguments)},Wt=b._emscripten_bind_btKinematicCharacterController_setGravity_1=\nfunction(){return(Wt=b._emscripten_bind_btKinematicCharacterController_setGravity_1=b.asm.Gr).apply(null,arguments)},Xt=b._emscripten_bind_btKinematicCharacterController_getGravity_0=function(){return(Xt=b._emscripten_bind_btKinematicCharacterController_getGravity_0=b.asm.Hr).apply(null,arguments)},Yt=b._emscripten_bind_btKinematicCharacterController_setMaxSlope_1=function(){return(Yt=b._emscripten_bind_btKinematicCharacterController_setMaxSlope_1=b.asm.Ir).apply(null,arguments)},Zt=b._emscripten_bind_btKinematicCharacterController_getMaxSlope_0=\nfunction(){return(Zt=b._emscripten_bind_btKinematicCharacterController_getMaxSlope_0=b.asm.Jr).apply(null,arguments)},$t=b._emscripten_bind_btKinematicCharacterController_getGhostObject_0=function(){return($t=b._emscripten_bind_btKinematicCharacterController_getGhostObject_0=b.asm.Kr).apply(null,arguments)},au=b._emscripten_bind_btKinematicCharacterController_setUseGhostSweepTest_1=function(){return(au=b._emscripten_bind_btKinematicCharacterController_setUseGhostSweepTest_1=b.asm.Lr).apply(null,arguments)},\nbu=b._emscripten_bind_btKinematicCharacterController_onGround_0=function(){return(bu=b._emscripten_bind_btKinematicCharacterController_onGround_0=b.asm.Mr).apply(null,arguments)},cu=b._emscripten_bind_btKinematicCharacterController_setUpInterpolate_1=function(){return(cu=b._emscripten_bind_btKinematicCharacterController_setUpInterpolate_1=b.asm.Nr).apply(null,arguments)},du=b._emscripten_bind_btKinematicCharacterController_updateAction_2=function(){return(du=b._emscripten_bind_btKinematicCharacterController_updateAction_2=\nb.asm.Or).apply(null,arguments)},eu=b._emscripten_bind_btKinematicCharacterController___destroy___0=function(){return(eu=b._emscripten_bind_btKinematicCharacterController___destroy___0=b.asm.Pr).apply(null,arguments)},fu=b._emscripten_bind_btSoftBodyArray_size_0=function(){return(fu=b._emscripten_bind_btSoftBodyArray_size_0=b.asm.Qr).apply(null,arguments)},gu=b._emscripten_bind_btSoftBodyArray_at_1=function(){return(gu=b._emscripten_bind_btSoftBodyArray_at_1=b.asm.Rr).apply(null,arguments)},hu=b._emscripten_bind_btSoftBodyArray___destroy___0=\nfunction(){return(hu=b._emscripten_bind_btSoftBodyArray___destroy___0=b.asm.Sr).apply(null,arguments)},iu=b._emscripten_bind_btFaceArray_size_0=function(){return(iu=b._emscripten_bind_btFaceArray_size_0=b.asm.Tr).apply(null,arguments)},ju=b._emscripten_bind_btFaceArray_at_1=function(){return(ju=b._emscripten_bind_btFaceArray_at_1=b.asm.Ur).apply(null,arguments)},ku=b._emscripten_bind_btFaceArray___destroy___0=function(){return(ku=b._emscripten_bind_btFaceArray___destroy___0=b.asm.Vr).apply(null,arguments)},\nlu=b._emscripten_bind_btStaticPlaneShape_btStaticPlaneShape_2=function(){return(lu=b._emscripten_bind_btStaticPlaneShape_btStaticPlaneShape_2=b.asm.Wr).apply(null,arguments)},mu=b._emscripten_bind_btStaticPlaneShape_setLocalScaling_1=function(){return(mu=b._emscripten_bind_btStaticPlaneShape_setLocalScaling_1=b.asm.Xr).apply(null,arguments)},nu=b._emscripten_bind_btStaticPlaneShape_getLocalScaling_0=function(){return(nu=b._emscripten_bind_btStaticPlaneShape_getLocalScaling_0=b.asm.Yr).apply(null,\narguments)},ou=b._emscripten_bind_btStaticPlaneShape_calculateLocalInertia_2=function(){return(ou=b._emscripten_bind_btStaticPlaneShape_calculateLocalInertia_2=b.asm.Zr).apply(null,arguments)},pu=b._emscripten_bind_btStaticPlaneShape___destroy___0=function(){return(pu=b._emscripten_bind_btStaticPlaneShape___destroy___0=b.asm._r).apply(null,arguments)},qu=b._emscripten_bind_btOverlappingPairCache_setInternalGhostPairCallback_1=function(){return(qu=b._emscripten_bind_btOverlappingPairCache_setInternalGhostPairCallback_1=\nb.asm.$r).apply(null,arguments)},ru=b._emscripten_bind_btOverlappingPairCache_getNumOverlappingPairs_0=function(){return(ru=b._emscripten_bind_btOverlappingPairCache_getNumOverlappingPairs_0=b.asm.as).apply(null,arguments)},su=b._emscripten_bind_btOverlappingPairCache___destroy___0=function(){return(su=b._emscripten_bind_btOverlappingPairCache___destroy___0=b.asm.bs).apply(null,arguments)},tu=b._emscripten_bind_btIndexedMesh_get_m_numTriangles_0=function(){return(tu=b._emscripten_bind_btIndexedMesh_get_m_numTriangles_0=\nb.asm.cs).apply(null,arguments)},uu=b._emscripten_bind_btIndexedMesh_set_m_numTriangles_1=function(){return(uu=b._emscripten_bind_btIndexedMesh_set_m_numTriangles_1=b.asm.ds).apply(null,arguments)},vu=b._emscripten_bind_btIndexedMesh___destroy___0=function(){return(vu=b._emscripten_bind_btIndexedMesh___destroy___0=b.asm.es).apply(null,arguments)},wu=b._emscripten_bind_btSoftRigidDynamicsWorld_btSoftRigidDynamicsWorld_5=function(){return(wu=b._emscripten_bind_btSoftRigidDynamicsWorld_btSoftRigidDynamicsWorld_5=\nb.asm.fs).apply(null,arguments)},xu=b._emscripten_bind_btSoftRigidDynamicsWorld_addSoftBody_3=function(){return(xu=b._emscripten_bind_btSoftRigidDynamicsWorld_addSoftBody_3=b.asm.gs).apply(null,arguments)},yu=b._emscripten_bind_btSoftRigidDynamicsWorld_removeSoftBody_1=function(){return(yu=b._emscripten_bind_btSoftRigidDynamicsWorld_removeSoftBody_1=b.asm.hs).apply(null,arguments)},zu=b._emscripten_bind_btSoftRigidDynamicsWorld_removeCollisionObject_1=function(){return(zu=b._emscripten_bind_btSoftRigidDynamicsWorld_removeCollisionObject_1=\nb.asm.is).apply(null,arguments)},Au=b._emscripten_bind_btSoftRigidDynamicsWorld_getWorldInfo_0=function(){return(Au=b._emscripten_bind_btSoftRigidDynamicsWorld_getWorldInfo_0=b.asm.js).apply(null,arguments)},Bu=b._emscripten_bind_btSoftRigidDynamicsWorld_getSoftBodyArray_0=function(){return(Bu=b._emscripten_bind_btSoftRigidDynamicsWorld_getSoftBodyArray_0=b.asm.ks).apply(null,arguments)},Cu=b._emscripten_bind_btSoftRigidDynamicsWorld_getDispatcher_0=function(){return(Cu=b._emscripten_bind_btSoftRigidDynamicsWorld_getDispatcher_0=\nb.asm.ls).apply(null,arguments)},Du=b._emscripten_bind_btSoftRigidDynamicsWorld_rayTest_3=function(){return(Du=b._emscripten_bind_btSoftRigidDynamicsWorld_rayTest_3=b.asm.ms).apply(null,arguments)},Eu=b._emscripten_bind_btSoftRigidDynamicsWorld_getPairCache_0=function(){return(Eu=b._emscripten_bind_btSoftRigidDynamicsWorld_getPairCache_0=b.asm.ns).apply(null,arguments)},Fu=b._emscripten_bind_btSoftRigidDynamicsWorld_getDispatchInfo_0=function(){return(Fu=b._emscripten_bind_btSoftRigidDynamicsWorld_getDispatchInfo_0=\nb.asm.os).apply(null,arguments)},Gu=b._emscripten_bind_btSoftRigidDynamicsWorld_addCollisionObject_1=function(){return(Gu=b._emscripten_bind_btSoftRigidDynamicsWorld_addCollisionObject_1=b.asm.ps).apply(null,arguments)},Hu=b._emscripten_bind_btSoftRigidDynamicsWorld_addCollisionObject_2=function(){return(Hu=b._emscripten_bind_btSoftRigidDynamicsWorld_addCollisionObject_2=b.asm.qs).apply(null,arguments)},Iu=b._emscripten_bind_btSoftRigidDynamicsWorld_addCollisionObject_3=function(){return(Iu=b._emscripten_bind_btSoftRigidDynamicsWorld_addCollisionObject_3=\nb.asm.rs).apply(null,arguments)},Ju=b._emscripten_bind_btSoftRigidDynamicsWorld_getBroadphase_0=function(){return(Ju=b._emscripten_bind_btSoftRigidDynamicsWorld_getBroadphase_0=b.asm.ss).apply(null,arguments)},Ku=b._emscripten_bind_btSoftRigidDynamicsWorld_convexSweepTest_5=function(){return(Ku=b._emscripten_bind_btSoftRigidDynamicsWorld_convexSweepTest_5=b.asm.ts).apply(null,arguments)},Lu=b._emscripten_bind_btSoftRigidDynamicsWorld_contactPairTest_3=function(){return(Lu=b._emscripten_bind_btSoftRigidDynamicsWorld_contactPairTest_3=\nb.asm.us).apply(null,arguments)},Mu=b._emscripten_bind_btSoftRigidDynamicsWorld_contactTest_2=function(){return(Mu=b._emscripten_bind_btSoftRigidDynamicsWorld_contactTest_2=b.asm.vs).apply(null,arguments)},Nu=b._emscripten_bind_btSoftRigidDynamicsWorld_updateSingleAabb_1=function(){return(Nu=b._emscripten_bind_btSoftRigidDynamicsWorld_updateSingleAabb_1=b.asm.ws).apply(null,arguments)},Ou=b._emscripten_bind_btSoftRigidDynamicsWorld_setDebugDrawer_1=function(){return(Ou=b._emscripten_bind_btSoftRigidDynamicsWorld_setDebugDrawer_1=\nb.asm.xs).apply(null,arguments)},Pu=b._emscripten_bind_btSoftRigidDynamicsWorld_getDebugDrawer_0=function(){return(Pu=b._emscripten_bind_btSoftRigidDynamicsWorld_getDebugDrawer_0=b.asm.ys).apply(null,arguments)},Qu=b._emscripten_bind_btSoftRigidDynamicsWorld_debugDrawWorld_0=function(){return(Qu=b._emscripten_bind_btSoftRigidDynamicsWorld_debugDrawWorld_0=b.asm.zs).apply(null,arguments)},Ru=b._emscripten_bind_btSoftRigidDynamicsWorld_debugDrawObject_3=function(){return(Ru=b._emscripten_bind_btSoftRigidDynamicsWorld_debugDrawObject_3=\nb.asm.As).apply(null,arguments)},Su=b._emscripten_bind_btSoftRigidDynamicsWorld_setGravity_1=function(){return(Su=b._emscripten_bind_btSoftRigidDynamicsWorld_setGravity_1=b.asm.Bs).apply(null,arguments)},Tu=b._emscripten_bind_btSoftRigidDynamicsWorld_getGravity_0=function(){return(Tu=b._emscripten_bind_btSoftRigidDynamicsWorld_getGravity_0=b.asm.Cs).apply(null,arguments)},Uu=b._emscripten_bind_btSoftRigidDynamicsWorld_addRigidBody_1=function(){return(Uu=b._emscripten_bind_btSoftRigidDynamicsWorld_addRigidBody_1=\nb.asm.Ds).apply(null,arguments)},Vu=b._emscripten_bind_btSoftRigidDynamicsWorld_addRigidBody_3=function(){return(Vu=b._emscripten_bind_btSoftRigidDynamicsWorld_addRigidBody_3=b.asm.Es).apply(null,arguments)},Wu=b._emscripten_bind_btSoftRigidDynamicsWorld_removeRigidBody_1=function(){return(Wu=b._emscripten_bind_btSoftRigidDynamicsWorld_removeRigidBody_1=b.asm.Fs).apply(null,arguments)},Xu=b._emscripten_bind_btSoftRigidDynamicsWorld_addConstraint_1=function(){return(Xu=b._emscripten_bind_btSoftRigidDynamicsWorld_addConstraint_1=\nb.asm.Gs).apply(null,arguments)},Yu=b._emscripten_bind_btSoftRigidDynamicsWorld_addConstraint_2=function(){return(Yu=b._emscripten_bind_btSoftRigidDynamicsWorld_addConstraint_2=b.asm.Hs).apply(null,arguments)},Zu=b._emscripten_bind_btSoftRigidDynamicsWorld_removeConstraint_1=function(){return(Zu=b._emscripten_bind_btSoftRigidDynamicsWorld_removeConstraint_1=b.asm.Is).apply(null,arguments)},$u=b._emscripten_bind_btSoftRigidDynamicsWorld_stepSimulation_1=function(){return($u=b._emscripten_bind_btSoftRigidDynamicsWorld_stepSimulation_1=\nb.asm.Js).apply(null,arguments)},av=b._emscripten_bind_btSoftRigidDynamicsWorld_stepSimulation_2=function(){return(av=b._emscripten_bind_btSoftRigidDynamicsWorld_stepSimulation_2=b.asm.Ks).apply(null,arguments)},bv=b._emscripten_bind_btSoftRigidDynamicsWorld_stepSimulation_3=function(){return(bv=b._emscripten_bind_btSoftRigidDynamicsWorld_stepSimulation_3=b.asm.Ls).apply(null,arguments)},cv=b._emscripten_bind_btSoftRigidDynamicsWorld_setContactAddedCallback_1=function(){return(cv=b._emscripten_bind_btSoftRigidDynamicsWorld_setContactAddedCallback_1=\nb.asm.Ms).apply(null,arguments)},dv=b._emscripten_bind_btSoftRigidDynamicsWorld_setContactProcessedCallback_1=function(){return(dv=b._emscripten_bind_btSoftRigidDynamicsWorld_setContactProcessedCallback_1=b.asm.Ns).apply(null,arguments)},ev=b._emscripten_bind_btSoftRigidDynamicsWorld_setContactDestroyedCallback_1=function(){return(ev=b._emscripten_bind_btSoftRigidDynamicsWorld_setContactDestroyedCallback_1=b.asm.Os).apply(null,arguments)},fv=b._emscripten_bind_btSoftRigidDynamicsWorld_addAction_1=\nfunction(){return(fv=b._emscripten_bind_btSoftRigidDynamicsWorld_addAction_1=b.asm.Ps).apply(null,arguments)},gv=b._emscripten_bind_btSoftRigidDynamicsWorld_removeAction_1=function(){return(gv=b._emscripten_bind_btSoftRigidDynamicsWorld_removeAction_1=b.asm.Qs).apply(null,arguments)},hv=b._emscripten_bind_btSoftRigidDynamicsWorld_getSolverInfo_0=function(){return(hv=b._emscripten_bind_btSoftRigidDynamicsWorld_getSolverInfo_0=b.asm.Rs).apply(null,arguments)},iv=b._emscripten_bind_btSoftRigidDynamicsWorld_setInternalTickCallback_1=\nfunction(){return(iv=b._emscripten_bind_btSoftRigidDynamicsWorld_setInternalTickCallback_1=b.asm.Ss).apply(null,arguments)},jv=b._emscripten_bind_btSoftRigidDynamicsWorld_setInternalTickCallback_2=function(){return(jv=b._emscripten_bind_btSoftRigidDynamicsWorld_setInternalTickCallback_2=b.asm.Ts).apply(null,arguments)},kv=b._emscripten_bind_btSoftRigidDynamicsWorld_setInternalTickCallback_3=function(){return(kv=b._emscripten_bind_btSoftRigidDynamicsWorld_setInternalTickCallback_3=b.asm.Us).apply(null,\narguments)},lv=b._emscripten_bind_btSoftRigidDynamicsWorld___destroy___0=function(){return(lv=b._emscripten_bind_btSoftRigidDynamicsWorld___destroy___0=b.asm.Vs).apply(null,arguments)},mv=b._emscripten_bind_btFixedConstraint_btFixedConstraint_4=function(){return(mv=b._emscripten_bind_btFixedConstraint_btFixedConstraint_4=b.asm.Ws).apply(null,arguments)},nv=b._emscripten_bind_btFixedConstraint_enableFeedback_1=function(){return(nv=b._emscripten_bind_btFixedConstraint_enableFeedback_1=b.asm.Xs).apply(null,\narguments)},ov=b._emscripten_bind_btFixedConstraint_getBreakingImpulseThreshold_0=function(){return(ov=b._emscripten_bind_btFixedConstraint_getBreakingImpulseThreshold_0=b.asm.Ys).apply(null,arguments)},pv=b._emscripten_bind_btFixedConstraint_setBreakingImpulseThreshold_1=function(){return(pv=b._emscripten_bind_btFixedConstraint_setBreakingImpulseThreshold_1=b.asm.Zs).apply(null,arguments)},qv=b._emscripten_bind_btFixedConstraint_getParam_2=function(){return(qv=b._emscripten_bind_btFixedConstraint_getParam_2=\nb.asm._s).apply(null,arguments)},rv=b._emscripten_bind_btFixedConstraint_setParam_3=function(){return(rv=b._emscripten_bind_btFixedConstraint_setParam_3=b.asm.$s).apply(null,arguments)},sv=b._emscripten_bind_btFixedConstraint___destroy___0=function(){return(sv=b._emscripten_bind_btFixedConstraint___destroy___0=b.asm.at).apply(null,arguments)},tv=b._emscripten_bind_btTransform_btTransform_0=function(){return(tv=b._emscripten_bind_btTransform_btTransform_0=b.asm.bt).apply(null,arguments)},uv=b._emscripten_bind_btTransform_btTransform_2=\nfunction(){return(uv=b._emscripten_bind_btTransform_btTransform_2=b.asm.ct).apply(null,arguments)},vv=b._emscripten_bind_btTransform_setIdentity_0=function(){return(vv=b._emscripten_bind_btTransform_setIdentity_0=b.asm.dt).apply(null,arguments)},wv=b._emscripten_bind_btTransform_setOrigin_1=function(){return(wv=b._emscripten_bind_btTransform_setOrigin_1=b.asm.et).apply(null,arguments)},xv=b._emscripten_bind_btTransform_setRotation_1=function(){return(xv=b._emscripten_bind_btTransform_setRotation_1=\nb.asm.ft).apply(null,arguments)},yv=b._emscripten_bind_btTransform_getOrigin_0=function(){return(yv=b._emscripten_bind_btTransform_getOrigin_0=b.asm.gt).apply(null,arguments)},zv=b._emscripten_bind_btTransform_getRotation_0=function(){return(zv=b._emscripten_bind_btTransform_getRotation_0=b.asm.ht).apply(null,arguments)},Av=b._emscripten_bind_btTransform_getBasis_0=function(){return(Av=b._emscripten_bind_btTransform_getBasis_0=b.asm.it).apply(null,arguments)},Bv=b._emscripten_bind_btTransform_setFromOpenGLMatrix_1=\nfunction(){return(Bv=b._emscripten_bind_btTransform_setFromOpenGLMatrix_1=b.asm.jt).apply(null,arguments)},Cv=b._emscripten_bind_btTransform_inverse_0=function(){return(Cv=b._emscripten_bind_btTransform_inverse_0=b.asm.kt).apply(null,arguments)},Dv=b._emscripten_bind_btTransform_op_mul_1=function(){return(Dv=b._emscripten_bind_btTransform_op_mul_1=b.asm.lt).apply(null,arguments)},Ev=b._emscripten_bind_btTransform___destroy___0=function(){return(Ev=b._emscripten_bind_btTransform___destroy___0=b.asm.mt).apply(null,\narguments)},Fv=b._emscripten_bind_ClosestRayResultCallback_ClosestRayResultCallback_2=function(){return(Fv=b._emscripten_bind_ClosestRayResultCallback_ClosestRayResultCallback_2=b.asm.nt).apply(null,arguments)},Gv=b._emscripten_bind_ClosestRayResultCallback_hasHit_0=function(){return(Gv=b._emscripten_bind_ClosestRayResultCallback_hasHit_0=b.asm.ot).apply(null,arguments)},Hv=b._emscripten_bind_ClosestRayResultCallback_get_m_rayFromWorld_0=function(){return(Hv=b._emscripten_bind_ClosestRayResultCallback_get_m_rayFromWorld_0=\nb.asm.pt).apply(null,arguments)},Iv=b._emscripten_bind_ClosestRayResultCallback_set_m_rayFromWorld_1=function(){return(Iv=b._emscripten_bind_ClosestRayResultCallback_set_m_rayFromWorld_1=b.asm.qt).apply(null,arguments)},Jv=b._emscripten_bind_ClosestRayResultCallback_get_m_rayToWorld_0=function(){return(Jv=b._emscripten_bind_ClosestRayResultCallback_get_m_rayToWorld_0=b.asm.rt).apply(null,arguments)},Kv=b._emscripten_bind_ClosestRayResultCallback_set_m_rayToWorld_1=function(){return(Kv=b._emscripten_bind_ClosestRayResultCallback_set_m_rayToWorld_1=\nb.asm.st).apply(null,arguments)},Lv=b._emscripten_bind_ClosestRayResultCallback_get_m_hitNormalWorld_0=function(){return(Lv=b._emscripten_bind_ClosestRayResultCallback_get_m_hitNormalWorld_0=b.asm.tt).apply(null,arguments)},Mv=b._emscripten_bind_ClosestRayResultCallback_set_m_hitNormalWorld_1=function(){return(Mv=b._emscripten_bind_ClosestRayResultCallback_set_m_hitNormalWorld_1=b.asm.ut).apply(null,arguments)},Nv=b._emscripten_bind_ClosestRayResultCallback_get_m_hitPointWorld_0=function(){return(Nv=\nb._emscripten_bind_ClosestRayResultCallback_get_m_hitPointWorld_0=b.asm.vt).apply(null,arguments)},Ov=b._emscripten_bind_ClosestRayResultCallback_set_m_hitPointWorld_1=function(){return(Ov=b._emscripten_bind_ClosestRayResultCallback_set_m_hitPointWorld_1=b.asm.wt).apply(null,arguments)},Pv=b._emscripten_bind_ClosestRayResultCallback_get_m_collisionFilterGroup_0=function(){return(Pv=b._emscripten_bind_ClosestRayResultCallback_get_m_collisionFilterGroup_0=b.asm.xt).apply(null,arguments)},Qv=b._emscripten_bind_ClosestRayResultCallback_set_m_collisionFilterGroup_1=\nfunction(){return(Qv=b._emscripten_bind_ClosestRayResultCallback_set_m_collisionFilterGroup_1=b.asm.yt).apply(null,arguments)},Rv=b._emscripten_bind_ClosestRayResultCallback_get_m_collisionFilterMask_0=function(){return(Rv=b._emscripten_bind_ClosestRayResultCallback_get_m_collisionFilterMask_0=b.asm.zt).apply(null,arguments)},Sv=b._emscripten_bind_ClosestRayResultCallback_set_m_collisionFilterMask_1=function(){return(Sv=b._emscripten_bind_ClosestRayResultCallback_set_m_collisionFilterMask_1=b.asm.At).apply(null,\narguments)},Tv=b._emscripten_bind_ClosestRayResultCallback_get_m_closestHitFraction_0=function(){return(Tv=b._emscripten_bind_ClosestRayResultCallback_get_m_closestHitFraction_0=b.asm.Bt).apply(null,arguments)},Uv=b._emscripten_bind_ClosestRayResultCallback_set_m_closestHitFraction_1=function(){return(Uv=b._emscripten_bind_ClosestRayResultCallback_set_m_closestHitFraction_1=b.asm.Ct).apply(null,arguments)},Vv=b._emscripten_bind_ClosestRayResultCallback_get_m_collisionObject_0=function(){return(Vv=\nb._emscripten_bind_ClosestRayResultCallback_get_m_collisionObject_0=b.asm.Dt).apply(null,arguments)},Wv=b._emscripten_bind_ClosestRayResultCallback_set_m_collisionObject_1=function(){return(Wv=b._emscripten_bind_ClosestRayResultCallback_set_m_collisionObject_1=b.asm.Et).apply(null,arguments)},Xv=b._emscripten_bind_ClosestRayResultCallback___destroy___0=function(){return(Xv=b._emscripten_bind_ClosestRayResultCallback___destroy___0=b.asm.Ft).apply(null,arguments)},Yv=b._emscripten_bind_btSoftBodyRigidBodyCollisionConfiguration_btSoftBodyRigidBodyCollisionConfiguration_0=\nfunction(){return(Yv=b._emscripten_bind_btSoftBodyRigidBodyCollisionConfiguration_btSoftBodyRigidBodyCollisionConfiguration_0=b.asm.Gt).apply(null,arguments)},Zv=b._emscripten_bind_btSoftBodyRigidBodyCollisionConfiguration_btSoftBodyRigidBodyCollisionConfiguration_1=function(){return(Zv=b._emscripten_bind_btSoftBodyRigidBodyCollisionConfiguration_btSoftBodyRigidBodyCollisionConfiguration_1=b.asm.Ht).apply(null,arguments)},$v=b._emscripten_bind_btSoftBodyRigidBodyCollisionConfiguration___destroy___0=\nfunction(){return($v=b._emscripten_bind_btSoftBodyRigidBodyCollisionConfiguration___destroy___0=b.asm.It).apply(null,arguments)},aw=b._emscripten_bind_ConcreteContactResultCallback_ConcreteContactResultCallback_0=function(){return(aw=b._emscripten_bind_ConcreteContactResultCallback_ConcreteContactResultCallback_0=b.asm.Jt).apply(null,arguments)},bw=b._emscripten_bind_ConcreteContactResultCallback_addSingleResult_7=function(){return(bw=b._emscripten_bind_ConcreteContactResultCallback_addSingleResult_7=\nb.asm.Kt).apply(null,arguments)},cw=b._emscripten_bind_ConcreteContactResultCallback___destroy___0=function(){return(cw=b._emscripten_bind_ConcreteContactResultCallback___destroy___0=b.asm.Lt).apply(null,arguments)},dw=b._emscripten_bind_btBvhTriangleMeshShape_btBvhTriangleMeshShape_2=function(){return(dw=b._emscripten_bind_btBvhTriangleMeshShape_btBvhTriangleMeshShape_2=b.asm.Mt).apply(null,arguments)},ew=b._emscripten_bind_btBvhTriangleMeshShape_btBvhTriangleMeshShape_3=function(){return(ew=b._emscripten_bind_btBvhTriangleMeshShape_btBvhTriangleMeshShape_3=\nb.asm.Nt).apply(null,arguments)},fw=b._emscripten_bind_btBvhTriangleMeshShape_setLocalScaling_1=function(){return(fw=b._emscripten_bind_btBvhTriangleMeshShape_setLocalScaling_1=b.asm.Ot).apply(null,arguments)},gw=b._emscripten_bind_btBvhTriangleMeshShape_getLocalScaling_0=function(){return(gw=b._emscripten_bind_btBvhTriangleMeshShape_getLocalScaling_0=b.asm.Pt).apply(null,arguments)},hw=b._emscripten_bind_btBvhTriangleMeshShape_calculateLocalInertia_2=function(){return(hw=b._emscripten_bind_btBvhTriangleMeshShape_calculateLocalInertia_2=\nb.asm.Qt).apply(null,arguments)},iw=b._emscripten_bind_btBvhTriangleMeshShape___destroy___0=function(){return(iw=b._emscripten_bind_btBvhTriangleMeshShape___destroy___0=b.asm.Rt).apply(null,arguments)},jw=b._emscripten_bind_btConstCollisionObjectArray_size_0=function(){return(jw=b._emscripten_bind_btConstCollisionObjectArray_size_0=b.asm.St).apply(null,arguments)},kw=b._emscripten_bind_btConstCollisionObjectArray_at_1=function(){return(kw=b._emscripten_bind_btConstCollisionObjectArray_at_1=b.asm.Tt).apply(null,\narguments)},lw=b._emscripten_bind_btConstCollisionObjectArray___destroy___0=function(){return(lw=b._emscripten_bind_btConstCollisionObjectArray___destroy___0=b.asm.Ut).apply(null,arguments)},mw=b._emscripten_bind_btSliderConstraint_btSliderConstraint_3=function(){return(mw=b._emscripten_bind_btSliderConstraint_btSliderConstraint_3=b.asm.Vt).apply(null,arguments)},nw=b._emscripten_bind_btSliderConstraint_btSliderConstraint_5=function(){return(nw=b._emscripten_bind_btSliderConstraint_btSliderConstraint_5=\nb.asm.Wt).apply(null,arguments)},ow=b._emscripten_bind_btSliderConstraint_setLowerLinLimit_1=function(){return(ow=b._emscripten_bind_btSliderConstraint_setLowerLinLimit_1=b.asm.Xt).apply(null,arguments)},pw=b._emscripten_bind_btSliderConstraint_setUpperLinLimit_1=function(){return(pw=b._emscripten_bind_btSliderConstraint_setUpperLinLimit_1=b.asm.Yt).apply(null,arguments)},qw=b._emscripten_bind_btSliderConstraint_setLowerAngLimit_1=function(){return(qw=b._emscripten_bind_btSliderConstraint_setLowerAngLimit_1=\nb.asm.Zt).apply(null,arguments)},rw=b._emscripten_bind_btSliderConstraint_setUpperAngLimit_1=function(){return(rw=b._emscripten_bind_btSliderConstraint_setUpperAngLimit_1=b.asm._t).apply(null,arguments)},sw=b._emscripten_bind_btSliderConstraint_enableFeedback_1=function(){return(sw=b._emscripten_bind_btSliderConstraint_enableFeedback_1=b.asm.$t).apply(null,arguments)},tw=b._emscripten_bind_btSliderConstraint_getBreakingImpulseThreshold_0=function(){return(tw=b._emscripten_bind_btSliderConstraint_getBreakingImpulseThreshold_0=\nb.asm.au).apply(null,arguments)},uw=b._emscripten_bind_btSliderConstraint_setBreakingImpulseThreshold_1=function(){return(uw=b._emscripten_bind_btSliderConstraint_setBreakingImpulseThreshold_1=b.asm.bu).apply(null,arguments)},vw=b._emscripten_bind_btSliderConstraint_getParam_2=function(){return(vw=b._emscripten_bind_btSliderConstraint_getParam_2=b.asm.cu).apply(null,arguments)},ww=b._emscripten_bind_btSliderConstraint_setParam_3=function(){return(ww=b._emscripten_bind_btSliderConstraint_setParam_3=\nb.asm.du).apply(null,arguments)},xw=b._emscripten_bind_btSliderConstraint___destroy___0=function(){return(xw=b._emscripten_bind_btSliderConstraint___destroy___0=b.asm.eu).apply(null,arguments)},yw=b._emscripten_bind_btPairCachingGhostObject_btPairCachingGhostObject_0=function(){return(yw=b._emscripten_bind_btPairCachingGhostObject_btPairCachingGhostObject_0=b.asm.fu).apply(null,arguments)},zw=b._emscripten_bind_btPairCachingGhostObject_setAnisotropicFriction_2=function(){return(zw=b._emscripten_bind_btPairCachingGhostObject_setAnisotropicFriction_2=\nb.asm.gu).apply(null,arguments)},Aw=b._emscripten_bind_btPairCachingGhostObject_getCollisionShape_0=function(){return(Aw=b._emscripten_bind_btPairCachingGhostObject_getCollisionShape_0=b.asm.hu).apply(null,arguments)},Bw=b._emscripten_bind_btPairCachingGhostObject_setContactProcessingThreshold_1=function(){return(Bw=b._emscripten_bind_btPairCachingGhostObject_setContactProcessingThreshold_1=b.asm.iu).apply(null,arguments)},Cw=b._emscripten_bind_btPairCachingGhostObject_setActivationState_1=function(){return(Cw=\nb._emscripten_bind_btPairCachingGhostObject_setActivationState_1=b.asm.ju).apply(null,arguments)},Dw=b._emscripten_bind_btPairCachingGhostObject_forceActivationState_1=function(){return(Dw=b._emscripten_bind_btPairCachingGhostObject_forceActivationState_1=b.asm.ku).apply(null,arguments)},Ew=b._emscripten_bind_btPairCachingGhostObject_activate_0=function(){return(Ew=b._emscripten_bind_btPairCachingGhostObject_activate_0=b.asm.lu).apply(null,arguments)},Fw=b._emscripten_bind_btPairCachingGhostObject_activate_1=\nfunction(){return(Fw=b._emscripten_bind_btPairCachingGhostObject_activate_1=b.asm.mu).apply(null,arguments)},Gw=b._emscripten_bind_btPairCachingGhostObject_isActive_0=function(){return(Gw=b._emscripten_bind_btPairCachingGhostObject_isActive_0=b.asm.nu).apply(null,arguments)},Hw=b._emscripten_bind_btPairCachingGhostObject_isKinematicObject_0=function(){return(Hw=b._emscripten_bind_btPairCachingGhostObject_isKinematicObject_0=b.asm.ou).apply(null,arguments)},Iw=b._emscripten_bind_btPairCachingGhostObject_isStaticObject_0=\nfunction(){return(Iw=b._emscripten_bind_btPairCachingGhostObject_isStaticObject_0=b.asm.pu).apply(null,arguments)},Jw=b._emscripten_bind_btPairCachingGhostObject_isStaticOrKinematicObject_0=function(){return(Jw=b._emscripten_bind_btPairCachingGhostObject_isStaticOrKinematicObject_0=b.asm.qu).apply(null,arguments)},Kw=b._emscripten_bind_btPairCachingGhostObject_getRestitution_0=function(){return(Kw=b._emscripten_bind_btPairCachingGhostObject_getRestitution_0=b.asm.ru).apply(null,arguments)},Lw=b._emscripten_bind_btPairCachingGhostObject_getFriction_0=\nfunction(){return(Lw=b._emscripten_bind_btPairCachingGhostObject_getFriction_0=b.asm.su).apply(null,arguments)},Mw=b._emscripten_bind_btPairCachingGhostObject_getRollingFriction_0=function(){return(Mw=b._emscripten_bind_btPairCachingGhostObject_getRollingFriction_0=b.asm.tu).apply(null,arguments)},Nw=b._emscripten_bind_btPairCachingGhostObject_setRestitution_1=function(){return(Nw=b._emscripten_bind_btPairCachingGhostObject_setRestitution_1=b.asm.uu).apply(null,arguments)},Ow=b._emscripten_bind_btPairCachingGhostObject_setFriction_1=\nfunction(){return(Ow=b._emscripten_bind_btPairCachingGhostObject_setFriction_1=b.asm.vu).apply(null,arguments)},Pw=b._emscripten_bind_btPairCachingGhostObject_setRollingFriction_1=function(){return(Pw=b._emscripten_bind_btPairCachingGhostObject_setRollingFriction_1=b.asm.wu).apply(null,arguments)},Qw=b._emscripten_bind_btPairCachingGhostObject_getWorldTransform_0=function(){return(Qw=b._emscripten_bind_btPairCachingGhostObject_getWorldTransform_0=b.asm.xu).apply(null,arguments)},Rw=b._emscripten_bind_btPairCachingGhostObject_getCollisionFlags_0=\nfunction(){return(Rw=b._emscripten_bind_btPairCachingGhostObject_getCollisionFlags_0=b.asm.yu).apply(null,arguments)},Sw=b._emscripten_bind_btPairCachingGhostObject_setCollisionFlags_1=function(){return(Sw=b._emscripten_bind_btPairCachingGhostObject_setCollisionFlags_1=b.asm.zu).apply(null,arguments)},Tw=b._emscripten_bind_btPairCachingGhostObject_setWorldTransform_1=function(){return(Tw=b._emscripten_bind_btPairCachingGhostObject_setWorldTransform_1=b.asm.Au).apply(null,arguments)},Uw=b._emscripten_bind_btPairCachingGhostObject_setCollisionShape_1=\nfunction(){return(Uw=b._emscripten_bind_btPairCachingGhostObject_setCollisionShape_1=b.asm.Bu).apply(null,arguments)},Vw=b._emscripten_bind_btPairCachingGhostObject_setCcdMotionThreshold_1=function(){return(Vw=b._emscripten_bind_btPairCachingGhostObject_setCcdMotionThreshold_1=b.asm.Cu).apply(null,arguments)},Ww=b._emscripten_bind_btPairCachingGhostObject_setCcdSweptSphereRadius_1=function(){return(Ww=b._emscripten_bind_btPairCachingGhostObject_setCcdSweptSphereRadius_1=b.asm.Du).apply(null,arguments)},\nXw=b._emscripten_bind_btPairCachingGhostObject_getUserIndex_0=function(){return(Xw=b._emscripten_bind_btPairCachingGhostObject_getUserIndex_0=b.asm.Eu).apply(null,arguments)},Yw=b._emscripten_bind_btPairCachingGhostObject_setUserIndex_1=function(){return(Yw=b._emscripten_bind_btPairCachingGhostObject_setUserIndex_1=b.asm.Fu).apply(null,arguments)},Zw=b._emscripten_bind_btPairCachingGhostObject_getUserPointer_0=function(){return(Zw=b._emscripten_bind_btPairCachingGhostObject_getUserPointer_0=b.asm.Gu).apply(null,\narguments)},$w=b._emscripten_bind_btPairCachingGhostObject_setUserPointer_1=function(){return($w=b._emscripten_bind_btPairCachingGhostObject_setUserPointer_1=b.asm.Hu).apply(null,arguments)},ax=b._emscripten_bind_btPairCachingGhostObject_getBroadphaseHandle_0=function(){return(ax=b._emscripten_bind_btPairCachingGhostObject_getBroadphaseHandle_0=b.asm.Iu).apply(null,arguments)},bx=b._emscripten_bind_btPairCachingGhostObject_getNumOverlappingObjects_0=function(){return(bx=b._emscripten_bind_btPairCachingGhostObject_getNumOverlappingObjects_0=\nb.asm.Ju).apply(null,arguments)},cx=b._emscripten_bind_btPairCachingGhostObject_getOverlappingObject_1=function(){return(cx=b._emscripten_bind_btPairCachingGhostObject_getOverlappingObject_1=b.asm.Ku).apply(null,arguments)},dx=b._emscripten_bind_btPairCachingGhostObject___destroy___0=function(){return(dx=b._emscripten_bind_btPairCachingGhostObject___destroy___0=b.asm.Lu).apply(null,arguments)},ex=b._emscripten_bind_btManifoldPoint_getPositionWorldOnA_0=function(){return(ex=b._emscripten_bind_btManifoldPoint_getPositionWorldOnA_0=\nb.asm.Mu).apply(null,arguments)},fx=b._emscripten_bind_btManifoldPoint_getPositionWorldOnB_0=function(){return(fx=b._emscripten_bind_btManifoldPoint_getPositionWorldOnB_0=b.asm.Nu).apply(null,arguments)},gx=b._emscripten_bind_btManifoldPoint_getAppliedImpulse_0=function(){return(gx=b._emscripten_bind_btManifoldPoint_getAppliedImpulse_0=b.asm.Ou).apply(null,arguments)},hx=b._emscripten_bind_btManifoldPoint_getDistance_0=function(){return(hx=b._emscripten_bind_btManifoldPoint_getDistance_0=b.asm.Pu).apply(null,\narguments)},ix=b._emscripten_bind_btManifoldPoint_get_m_localPointA_0=function(){return(ix=b._emscripten_bind_btManifoldPoint_get_m_localPointA_0=b.asm.Qu).apply(null,arguments)},jx=b._emscripten_bind_btManifoldPoint_set_m_localPointA_1=function(){return(jx=b._emscripten_bind_btManifoldPoint_set_m_localPointA_1=b.asm.Ru).apply(null,arguments)},kx=b._emscripten_bind_btManifoldPoint_get_m_localPointB_0=function(){return(kx=b._emscripten_bind_btManifoldPoint_get_m_localPointB_0=b.asm.Su).apply(null,\narguments)},lx=b._emscripten_bind_btManifoldPoint_set_m_localPointB_1=function(){return(lx=b._emscripten_bind_btManifoldPoint_set_m_localPointB_1=b.asm.Tu).apply(null,arguments)},mx=b._emscripten_bind_btManifoldPoint_get_m_positionWorldOnB_0=function(){return(mx=b._emscripten_bind_btManifoldPoint_get_m_positionWorldOnB_0=b.asm.Uu).apply(null,arguments)},nx=b._emscripten_bind_btManifoldPoint_set_m_positionWorldOnB_1=function(){return(nx=b._emscripten_bind_btManifoldPoint_set_m_positionWorldOnB_1=b.asm.Vu).apply(null,\narguments)},ox=b._emscripten_bind_btManifoldPoint_get_m_positionWorldOnA_0=function(){return(ox=b._emscripten_bind_btManifoldPoint_get_m_positionWorldOnA_0=b.asm.Wu).apply(null,arguments)},px=b._emscripten_bind_btManifoldPoint_set_m_positionWorldOnA_1=function(){return(px=b._emscripten_bind_btManifoldPoint_set_m_positionWorldOnA_1=b.asm.Xu).apply(null,arguments)},qx=b._emscripten_bind_btManifoldPoint_get_m_normalWorldOnB_0=function(){return(qx=b._emscripten_bind_btManifoldPoint_get_m_normalWorldOnB_0=\nb.asm.Yu).apply(null,arguments)},rx=b._emscripten_bind_btManifoldPoint_set_m_normalWorldOnB_1=function(){return(rx=b._emscripten_bind_btManifoldPoint_set_m_normalWorldOnB_1=b.asm.Zu).apply(null,arguments)},sx=b._emscripten_bind_btManifoldPoint_get_m_userPersistentData_0=function(){return(sx=b._emscripten_bind_btManifoldPoint_get_m_userPersistentData_0=b.asm._u).apply(null,arguments)},tx=b._emscripten_bind_btManifoldPoint_set_m_userPersistentData_1=function(){return(tx=b._emscripten_bind_btManifoldPoint_set_m_userPersistentData_1=\nb.asm.$u).apply(null,arguments)},ux=b._emscripten_bind_btManifoldPoint___destroy___0=function(){return(ux=b._emscripten_bind_btManifoldPoint___destroy___0=b.asm.av).apply(null,arguments)},vx=b._emscripten_bind_btPoint2PointConstraint_btPoint2PointConstraint_2=function(){return(vx=b._emscripten_bind_btPoint2PointConstraint_btPoint2PointConstraint_2=b.asm.bv).apply(null,arguments)},wx=b._emscripten_bind_btPoint2PointConstraint_btPoint2PointConstraint_4=function(){return(wx=b._emscripten_bind_btPoint2PointConstraint_btPoint2PointConstraint_4=\nb.asm.cv).apply(null,arguments)},xx=b._emscripten_bind_btPoint2PointConstraint_setPivotA_1=function(){return(xx=b._emscripten_bind_btPoint2PointConstraint_setPivotA_1=b.asm.dv).apply(null,arguments)},yx=b._emscripten_bind_btPoint2PointConstraint_setPivotB_1=function(){return(yx=b._emscripten_bind_btPoint2PointConstraint_setPivotB_1=b.asm.ev).apply(null,arguments)},zx=b._emscripten_bind_btPoint2PointConstraint_getPivotInA_0=function(){return(zx=b._emscripten_bind_btPoint2PointConstraint_getPivotInA_0=\nb.asm.fv).apply(null,arguments)},Ax=b._emscripten_bind_btPoint2PointConstraint_getPivotInB_0=function(){return(Ax=b._emscripten_bind_btPoint2PointConstraint_getPivotInB_0=b.asm.gv).apply(null,arguments)},Bx=b._emscripten_bind_btPoint2PointConstraint_enableFeedback_1=function(){return(Bx=b._emscripten_bind_btPoint2PointConstraint_enableFeedback_1=b.asm.hv).apply(null,arguments)},Cx=b._emscripten_bind_btPoint2PointConstraint_getBreakingImpulseThreshold_0=function(){return(Cx=b._emscripten_bind_btPoint2PointConstraint_getBreakingImpulseThreshold_0=\nb.asm.iv).apply(null,arguments)},Dx=b._emscripten_bind_btPoint2PointConstraint_setBreakingImpulseThreshold_1=function(){return(Dx=b._emscripten_bind_btPoint2PointConstraint_setBreakingImpulseThreshold_1=b.asm.jv).apply(null,arguments)},Ex=b._emscripten_bind_btPoint2PointConstraint_getParam_2=function(){return(Ex=b._emscripten_bind_btPoint2PointConstraint_getParam_2=b.asm.kv).apply(null,arguments)},Fx=b._emscripten_bind_btPoint2PointConstraint_setParam_3=function(){return(Fx=b._emscripten_bind_btPoint2PointConstraint_setParam_3=\nb.asm.lv).apply(null,arguments)},Gx=b._emscripten_bind_btPoint2PointConstraint_get_m_setting_0=function(){return(Gx=b._emscripten_bind_btPoint2PointConstraint_get_m_setting_0=b.asm.mv).apply(null,arguments)},Hx=b._emscripten_bind_btPoint2PointConstraint_set_m_setting_1=function(){return(Hx=b._emscripten_bind_btPoint2PointConstraint_set_m_setting_1=b.asm.nv).apply(null,arguments)},Ix=b._emscripten_bind_btPoint2PointConstraint___destroy___0=function(){return(Ix=b._emscripten_bind_btPoint2PointConstraint___destroy___0=\nb.asm.ov).apply(null,arguments)},Jx=b._emscripten_bind_btSoftBodyHelpers_btSoftBodyHelpers_0=function(){return(Jx=b._emscripten_bind_btSoftBodyHelpers_btSoftBodyHelpers_0=b.asm.pv).apply(null,arguments)},Kx=b._emscripten_bind_btSoftBodyHelpers_CreateRope_5=function(){return(Kx=b._emscripten_bind_btSoftBodyHelpers_CreateRope_5=b.asm.qv).apply(null,arguments)},Lx=b._emscripten_bind_btSoftBodyHelpers_CreatePatch_9=function(){return(Lx=b._emscripten_bind_btSoftBodyHelpers_CreatePatch_9=b.asm.rv).apply(null,\narguments)},Mx=b._emscripten_bind_btSoftBodyHelpers_CreatePatchUV_10=function(){return(Mx=b._emscripten_bind_btSoftBodyHelpers_CreatePatchUV_10=b.asm.sv).apply(null,arguments)},Nx=b._emscripten_bind_btSoftBodyHelpers_CreateEllipsoid_4=function(){return(Nx=b._emscripten_bind_btSoftBodyHelpers_CreateEllipsoid_4=b.asm.tv).apply(null,arguments)},Ox=b._emscripten_bind_btSoftBodyHelpers_CreateFromTriMesh_5=function(){return(Ox=b._emscripten_bind_btSoftBodyHelpers_CreateFromTriMesh_5=b.asm.uv).apply(null,\narguments)},Px=b._emscripten_bind_btSoftBodyHelpers_CreateFromConvexHull_4=function(){return(Px=b._emscripten_bind_btSoftBodyHelpers_CreateFromConvexHull_4=b.asm.vv).apply(null,arguments)},Qx=b._emscripten_bind_btSoftBodyHelpers___destroy___0=function(){return(Qx=b._emscripten_bind_btSoftBodyHelpers___destroy___0=b.asm.wv).apply(null,arguments)},Rx=b._emscripten_bind_btBroadphaseProxy_get_m_collisionFilterGroup_0=function(){return(Rx=b._emscripten_bind_btBroadphaseProxy_get_m_collisionFilterGroup_0=\nb.asm.xv).apply(null,arguments)},Sx=b._emscripten_bind_btBroadphaseProxy_set_m_collisionFilterGroup_1=function(){return(Sx=b._emscripten_bind_btBroadphaseProxy_set_m_collisionFilterGroup_1=b.asm.yv).apply(null,arguments)},Tx=b._emscripten_bind_btBroadphaseProxy_get_m_collisionFilterMask_0=function(){return(Tx=b._emscripten_bind_btBroadphaseProxy_get_m_collisionFilterMask_0=b.asm.zv).apply(null,arguments)},Ux=b._emscripten_bind_btBroadphaseProxy_set_m_collisionFilterMask_1=function(){return(Ux=b._emscripten_bind_btBroadphaseProxy_set_m_collisionFilterMask_1=\nb.asm.Av).apply(null,arguments)},Vx=b._emscripten_bind_btBroadphaseProxy___destroy___0=function(){return(Vx=b._emscripten_bind_btBroadphaseProxy___destroy___0=b.asm.Bv).apply(null,arguments)},Wx=b._emscripten_bind_tNodeArray_size_0=function(){return(Wx=b._emscripten_bind_tNodeArray_size_0=b.asm.Cv).apply(null,arguments)},Xx=b._emscripten_bind_tNodeArray_at_1=function(){return(Xx=b._emscripten_bind_tNodeArray_at_1=b.asm.Dv).apply(null,arguments)},Yx=b._emscripten_bind_tNodeArray___destroy___0=function(){return(Yx=\nb._emscripten_bind_tNodeArray___destroy___0=b.asm.Ev).apply(null,arguments)},Zx=b._emscripten_bind_btBoxShape_btBoxShape_1=function(){return(Zx=b._emscripten_bind_btBoxShape_btBoxShape_1=b.asm.Fv).apply(null,arguments)},$x=b._emscripten_bind_btBoxShape_setMargin_1=function(){return($x=b._emscripten_bind_btBoxShape_setMargin_1=b.asm.Gv).apply(null,arguments)},ay=b._emscripten_bind_btBoxShape_getMargin_0=function(){return(ay=b._emscripten_bind_btBoxShape_getMargin_0=b.asm.Hv).apply(null,arguments)},\nby=b._emscripten_bind_btBoxShape_setLocalScaling_1=function(){return(by=b._emscripten_bind_btBoxShape_setLocalScaling_1=b.asm.Iv).apply(null,arguments)},cy=b._emscripten_bind_btBoxShape_getLocalScaling_0=function(){return(cy=b._emscripten_bind_btBoxShape_getLocalScaling_0=b.asm.Jv).apply(null,arguments)},dy=b._emscripten_bind_btBoxShape_calculateLocalInertia_2=function(){return(dy=b._emscripten_bind_btBoxShape_calculateLocalInertia_2=b.asm.Kv).apply(null,arguments)},ey=b._emscripten_bind_btBoxShape___destroy___0=\nfunction(){return(ey=b._emscripten_bind_btBoxShape___destroy___0=b.asm.Lv).apply(null,arguments)},fy=b._emscripten_bind_btFace_get_m_indices_0=function(){return(fy=b._emscripten_bind_btFace_get_m_indices_0=b.asm.Mv).apply(null,arguments)},gy=b._emscripten_bind_btFace_set_m_indices_1=function(){return(gy=b._emscripten_bind_btFace_set_m_indices_1=b.asm.Nv).apply(null,arguments)},hy=b._emscripten_bind_btFace_get_m_plane_1=function(){return(hy=b._emscripten_bind_btFace_get_m_plane_1=b.asm.Ov).apply(null,\narguments)},iy=b._emscripten_bind_btFace_set_m_plane_2=function(){return(iy=b._emscripten_bind_btFace_set_m_plane_2=b.asm.Pv).apply(null,arguments)},jy=b._emscripten_bind_btFace___destroy___0=function(){return(jy=b._emscripten_bind_btFace___destroy___0=b.asm.Qv).apply(null,arguments)},ky=b._emscripten_bind_DebugDrawer_DebugDrawer_0=function(){return(ky=b._emscripten_bind_DebugDrawer_DebugDrawer_0=b.asm.Rv).apply(null,arguments)},ly=b._emscripten_bind_DebugDrawer_drawLine_3=function(){return(ly=b._emscripten_bind_DebugDrawer_drawLine_3=\nb.asm.Sv).apply(null,arguments)},my=b._emscripten_bind_DebugDrawer_drawContactPoint_5=function(){return(my=b._emscripten_bind_DebugDrawer_drawContactPoint_5=b.asm.Tv).apply(null,arguments)},ny=b._emscripten_bind_DebugDrawer_reportErrorWarning_1=function(){return(ny=b._emscripten_bind_DebugDrawer_reportErrorWarning_1=b.asm.Uv).apply(null,arguments)},oy=b._emscripten_bind_DebugDrawer_draw3dText_2=function(){return(oy=b._emscripten_bind_DebugDrawer_draw3dText_2=b.asm.Vv).apply(null,arguments)},py=b._emscripten_bind_DebugDrawer_setDebugMode_1=\nfunction(){return(py=b._emscripten_bind_DebugDrawer_setDebugMode_1=b.asm.Wv).apply(null,arguments)},qy=b._emscripten_bind_DebugDrawer_getDebugMode_0=function(){return(qy=b._emscripten_bind_DebugDrawer_getDebugMode_0=b.asm.Xv).apply(null,arguments)},ry=b._emscripten_bind_DebugDrawer___destroy___0=function(){return(ry=b._emscripten_bind_DebugDrawer___destroy___0=b.asm.Yv).apply(null,arguments)},sy=b._emscripten_bind_btCapsuleShapeX_btCapsuleShapeX_2=function(){return(sy=b._emscripten_bind_btCapsuleShapeX_btCapsuleShapeX_2=\nb.asm.Zv).apply(null,arguments)},ty=b._emscripten_bind_btCapsuleShapeX_setMargin_1=function(){return(ty=b._emscripten_bind_btCapsuleShapeX_setMargin_1=b.asm._v).apply(null,arguments)},uy=b._emscripten_bind_btCapsuleShapeX_getMargin_0=function(){return(uy=b._emscripten_bind_btCapsuleShapeX_getMargin_0=b.asm.$v).apply(null,arguments)},vy=b._emscripten_bind_btCapsuleShapeX_getUpAxis_0=function(){return(vy=b._emscripten_bind_btCapsuleShapeX_getUpAxis_0=b.asm.aw).apply(null,arguments)},wy=b._emscripten_bind_btCapsuleShapeX_getRadius_0=\nfunction(){return(wy=b._emscripten_bind_btCapsuleShapeX_getRadius_0=b.asm.bw).apply(null,arguments)},xy=b._emscripten_bind_btCapsuleShapeX_getHalfHeight_0=function(){return(xy=b._emscripten_bind_btCapsuleShapeX_getHalfHeight_0=b.asm.cw).apply(null,arguments)},yy=b._emscripten_bind_btCapsuleShapeX_setLocalScaling_1=function(){return(yy=b._emscripten_bind_btCapsuleShapeX_setLocalScaling_1=b.asm.dw).apply(null,arguments)},zy=b._emscripten_bind_btCapsuleShapeX_getLocalScaling_0=function(){return(zy=b._emscripten_bind_btCapsuleShapeX_getLocalScaling_0=\nb.asm.ew).apply(null,arguments)},Ay=b._emscripten_bind_btCapsuleShapeX_calculateLocalInertia_2=function(){return(Ay=b._emscripten_bind_btCapsuleShapeX_calculateLocalInertia_2=b.asm.fw).apply(null,arguments)},By=b._emscripten_bind_btCapsuleShapeX___destroy___0=function(){return(By=b._emscripten_bind_btCapsuleShapeX___destroy___0=b.asm.gw).apply(null,arguments)},Cy=b._emscripten_bind_btQuaternion_btQuaternion_4=function(){return(Cy=b._emscripten_bind_btQuaternion_btQuaternion_4=b.asm.hw).apply(null,\narguments)},Dy=b._emscripten_bind_btQuaternion_setValue_4=function(){return(Dy=b._emscripten_bind_btQuaternion_setValue_4=b.asm.iw).apply(null,arguments)},Ey=b._emscripten_bind_btQuaternion_setEulerZYX_3=function(){return(Ey=b._emscripten_bind_btQuaternion_setEulerZYX_3=b.asm.jw).apply(null,arguments)},Fy=b._emscripten_bind_btQuaternion_setRotation_2=function(){return(Fy=b._emscripten_bind_btQuaternion_setRotation_2=b.asm.kw).apply(null,arguments)},Gy=b._emscripten_bind_btQuaternion_normalize_0=function(){return(Gy=\nb._emscripten_bind_btQuaternion_normalize_0=b.asm.lw).apply(null,arguments)},Hy=b._emscripten_bind_btQuaternion_length2_0=function(){return(Hy=b._emscripten_bind_btQuaternion_length2_0=b.asm.mw).apply(null,arguments)},Iy=b._emscripten_bind_btQuaternion_length_0=function(){return(Iy=b._emscripten_bind_btQuaternion_length_0=b.asm.nw).apply(null,arguments)},Jy=b._emscripten_bind_btQuaternion_dot_1=function(){return(Jy=b._emscripten_bind_btQuaternion_dot_1=b.asm.ow).apply(null,arguments)},Ky=b._emscripten_bind_btQuaternion_normalized_0=\nfunction(){return(Ky=b._emscripten_bind_btQuaternion_normalized_0=b.asm.pw).apply(null,arguments)},Ly=b._emscripten_bind_btQuaternion_getAxis_0=function(){return(Ly=b._emscripten_bind_btQuaternion_getAxis_0=b.asm.qw).apply(null,arguments)},My=b._emscripten_bind_btQuaternion_inverse_0=function(){return(My=b._emscripten_bind_btQuaternion_inverse_0=b.asm.rw).apply(null,arguments)},Ny=b._emscripten_bind_btQuaternion_getAngle_0=function(){return(Ny=b._emscripten_bind_btQuaternion_getAngle_0=b.asm.sw).apply(null,\narguments)},Oy=b._emscripten_bind_btQuaternion_getAngleShortestPath_0=function(){return(Oy=b._emscripten_bind_btQuaternion_getAngleShortestPath_0=b.asm.tw).apply(null,arguments)},Py=b._emscripten_bind_btQuaternion_angle_1=function(){return(Py=b._emscripten_bind_btQuaternion_angle_1=b.asm.uw).apply(null,arguments)},Qy=b._emscripten_bind_btQuaternion_angleShortestPath_1=function(){return(Qy=b._emscripten_bind_btQuaternion_angleShortestPath_1=b.asm.vw).apply(null,arguments)},Ry=b._emscripten_bind_btQuaternion_op_add_1=\nfunction(){return(Ry=b._emscripten_bind_btQuaternion_op_add_1=b.asm.ww).apply(null,arguments)},Sy=b._emscripten_bind_btQuaternion_op_sub_1=function(){return(Sy=b._emscripten_bind_btQuaternion_op_sub_1=b.asm.xw).apply(null,arguments)},Ty=b._emscripten_bind_btQuaternion_op_mul_1=function(){return(Ty=b._emscripten_bind_btQuaternion_op_mul_1=b.asm.yw).apply(null,arguments)},Uy=b._emscripten_bind_btQuaternion_op_mulq_1=function(){return(Uy=b._emscripten_bind_btQuaternion_op_mulq_1=b.asm.zw).apply(null,\narguments)},Vy=b._emscripten_bind_btQuaternion_op_div_1=function(){return(Vy=b._emscripten_bind_btQuaternion_op_div_1=b.asm.Aw).apply(null,arguments)},Wy=b._emscripten_bind_btQuaternion_x_0=function(){return(Wy=b._emscripten_bind_btQuaternion_x_0=b.asm.Bw).apply(null,arguments)},Xy=b._emscripten_bind_btQuaternion_y_0=function(){return(Xy=b._emscripten_bind_btQuaternion_y_0=b.asm.Cw).apply(null,arguments)},Yy=b._emscripten_bind_btQuaternion_z_0=function(){return(Yy=b._emscripten_bind_btQuaternion_z_0=\nb.asm.Dw).apply(null,arguments)},Zy=b._emscripten_bind_btQuaternion_w_0=function(){return(Zy=b._emscripten_bind_btQuaternion_w_0=b.asm.Ew).apply(null,arguments)},$y=b._emscripten_bind_btQuaternion_setX_1=function(){return($y=b._emscripten_bind_btQuaternion_setX_1=b.asm.Fw).apply(null,arguments)},az=b._emscripten_bind_btQuaternion_setY_1=function(){return(az=b._emscripten_bind_btQuaternion_setY_1=b.asm.Gw).apply(null,arguments)},bz=b._emscripten_bind_btQuaternion_setZ_1=function(){return(bz=b._emscripten_bind_btQuaternion_setZ_1=\nb.asm.Hw).apply(null,arguments)},cz=b._emscripten_bind_btQuaternion_setW_1=function(){return(cz=b._emscripten_bind_btQuaternion_setW_1=b.asm.Iw).apply(null,arguments)},dz=b._emscripten_bind_btQuaternion___destroy___0=function(){return(dz=b._emscripten_bind_btQuaternion___destroy___0=b.asm.Jw).apply(null,arguments)},ez=b._emscripten_bind_btCapsuleShapeZ_btCapsuleShapeZ_2=function(){return(ez=b._emscripten_bind_btCapsuleShapeZ_btCapsuleShapeZ_2=b.asm.Kw).apply(null,arguments)},fz=b._emscripten_bind_btCapsuleShapeZ_setMargin_1=\nfunction(){return(fz=b._emscripten_bind_btCapsuleShapeZ_setMargin_1=b.asm.Lw).apply(null,arguments)},gz=b._emscripten_bind_btCapsuleShapeZ_getMargin_0=function(){return(gz=b._emscripten_bind_btCapsuleShapeZ_getMargin_0=b.asm.Mw).apply(null,arguments)},hz=b._emscripten_bind_btCapsuleShapeZ_getUpAxis_0=function(){return(hz=b._emscripten_bind_btCapsuleShapeZ_getUpAxis_0=b.asm.Nw).apply(null,arguments)},iz=b._emscripten_bind_btCapsuleShapeZ_getRadius_0=function(){return(iz=b._emscripten_bind_btCapsuleShapeZ_getRadius_0=\nb.asm.Ow).apply(null,arguments)},jz=b._emscripten_bind_btCapsuleShapeZ_getHalfHeight_0=function(){return(jz=b._emscripten_bind_btCapsuleShapeZ_getHalfHeight_0=b.asm.Pw).apply(null,arguments)},kz=b._emscripten_bind_btCapsuleShapeZ_setLocalScaling_1=function(){return(kz=b._emscripten_bind_btCapsuleShapeZ_setLocalScaling_1=b.asm.Qw).apply(null,arguments)},lz=b._emscripten_bind_btCapsuleShapeZ_getLocalScaling_0=function(){return(lz=b._emscripten_bind_btCapsuleShapeZ_getLocalScaling_0=b.asm.Rw).apply(null,\narguments)},mz=b._emscripten_bind_btCapsuleShapeZ_calculateLocalInertia_2=function(){return(mz=b._emscripten_bind_btCapsuleShapeZ_calculateLocalInertia_2=b.asm.Sw).apply(null,arguments)},nz=b._emscripten_bind_btCapsuleShapeZ___destroy___0=function(){return(nz=b._emscripten_bind_btCapsuleShapeZ___destroy___0=b.asm.Tw).apply(null,arguments)},oz=b._emscripten_bind_btContactSolverInfo_get_m_splitImpulse_0=function(){return(oz=b._emscripten_bind_btContactSolverInfo_get_m_splitImpulse_0=b.asm.Uw).apply(null,\narguments)},pz=b._emscripten_bind_btContactSolverInfo_set_m_splitImpulse_1=function(){return(pz=b._emscripten_bind_btContactSolverInfo_set_m_splitImpulse_1=b.asm.Vw).apply(null,arguments)},qz=b._emscripten_bind_btContactSolverInfo_get_m_splitImpulsePenetrationThreshold_0=function(){return(qz=b._emscripten_bind_btContactSolverInfo_get_m_splitImpulsePenetrationThreshold_0=b.asm.Ww).apply(null,arguments)},rz=b._emscripten_bind_btContactSolverInfo_set_m_splitImpulsePenetrationThreshold_1=function(){return(rz=\nb._emscripten_bind_btContactSolverInfo_set_m_splitImpulsePenetrationThreshold_1=b.asm.Xw).apply(null,arguments)},sz=b._emscripten_bind_btContactSolverInfo_get_m_numIterations_0=function(){return(sz=b._emscripten_bind_btContactSolverInfo_get_m_numIterations_0=b.asm.Yw).apply(null,arguments)},tz=b._emscripten_bind_btContactSolverInfo_set_m_numIterations_1=function(){return(tz=b._emscripten_bind_btContactSolverInfo_set_m_numIterations_1=b.asm.Zw).apply(null,arguments)},uz=b._emscripten_bind_btContactSolverInfo___destroy___0=\nfunction(){return(uz=b._emscripten_bind_btContactSolverInfo___destroy___0=b.asm._w).apply(null,arguments)},vz=b._emscripten_bind_btGeneric6DofSpringConstraint_btGeneric6DofSpringConstraint_3=function(){return(vz=b._emscripten_bind_btGeneric6DofSpringConstraint_btGeneric6DofSpringConstraint_3=b.asm.$w).apply(null,arguments)},wz=b._emscripten_bind_btGeneric6DofSpringConstraint_btGeneric6DofSpringConstraint_5=function(){return(wz=b._emscripten_bind_btGeneric6DofSpringConstraint_btGeneric6DofSpringConstraint_5=\nb.asm.ax).apply(null,arguments)},xz=b._emscripten_bind_btGeneric6DofSpringConstraint_enableSpring_2=function(){return(xz=b._emscripten_bind_btGeneric6DofSpringConstraint_enableSpring_2=b.asm.bx).apply(null,arguments)},yz=b._emscripten_bind_btGeneric6DofSpringConstraint_setStiffness_2=function(){return(yz=b._emscripten_bind_btGeneric6DofSpringConstraint_setStiffness_2=b.asm.cx).apply(null,arguments)},zz=b._emscripten_bind_btGeneric6DofSpringConstraint_setDamping_2=function(){return(zz=b._emscripten_bind_btGeneric6DofSpringConstraint_setDamping_2=\nb.asm.dx).apply(null,arguments)},Az=b._emscripten_bind_btGeneric6DofSpringConstraint_setEquilibriumPoint_0=function(){return(Az=b._emscripten_bind_btGeneric6DofSpringConstraint_setEquilibriumPoint_0=b.asm.ex).apply(null,arguments)},Bz=b._emscripten_bind_btGeneric6DofSpringConstraint_setEquilibriumPoint_1=function(){return(Bz=b._emscripten_bind_btGeneric6DofSpringConstraint_setEquilibriumPoint_1=b.asm.fx).apply(null,arguments)},Cz=b._emscripten_bind_btGeneric6DofSpringConstraint_setEquilibriumPoint_2=\nfunction(){return(Cz=b._emscripten_bind_btGeneric6DofSpringConstraint_setEquilibriumPoint_2=b.asm.gx).apply(null,arguments)},Dz=b._emscripten_bind_btGeneric6DofSpringConstraint_setLinearLowerLimit_1=function(){return(Dz=b._emscripten_bind_btGeneric6DofSpringConstraint_setLinearLowerLimit_1=b.asm.hx).apply(null,arguments)},Ez=b._emscripten_bind_btGeneric6DofSpringConstraint_setLinearUpperLimit_1=function(){return(Ez=b._emscripten_bind_btGeneric6DofSpringConstraint_setLinearUpperLimit_1=b.asm.ix).apply(null,\narguments)},Fz=b._emscripten_bind_btGeneric6DofSpringConstraint_setAngularLowerLimit_1=function(){return(Fz=b._emscripten_bind_btGeneric6DofSpringConstraint_setAngularLowerLimit_1=b.asm.jx).apply(null,arguments)},Gz=b._emscripten_bind_btGeneric6DofSpringConstraint_setAngularUpperLimit_1=function(){return(Gz=b._emscripten_bind_btGeneric6DofSpringConstraint_setAngularUpperLimit_1=b.asm.kx).apply(null,arguments)},Hz=b._emscripten_bind_btGeneric6DofSpringConstraint_getFrameOffsetA_0=function(){return(Hz=\nb._emscripten_bind_btGeneric6DofSpringConstraint_getFrameOffsetA_0=b.asm.lx).apply(null,arguments)},Iz=b._emscripten_bind_btGeneric6DofSpringConstraint_enableFeedback_1=function(){return(Iz=b._emscripten_bind_btGeneric6DofSpringConstraint_enableFeedback_1=b.asm.mx).apply(null,arguments)},Jz=b._emscripten_bind_btGeneric6DofSpringConstraint_getBreakingImpulseThreshold_0=function(){return(Jz=b._emscripten_bind_btGeneric6DofSpringConstraint_getBreakingImpulseThreshold_0=b.asm.nx).apply(null,arguments)},\nKz=b._emscripten_bind_btGeneric6DofSpringConstraint_setBreakingImpulseThreshold_1=function(){return(Kz=b._emscripten_bind_btGeneric6DofSpringConstraint_setBreakingImpulseThreshold_1=b.asm.ox).apply(null,arguments)},Lz=b._emscripten_bind_btGeneric6DofSpringConstraint_getParam_2=function(){return(Lz=b._emscripten_bind_btGeneric6DofSpringConstraint_getParam_2=b.asm.px).apply(null,arguments)},Mz=b._emscripten_bind_btGeneric6DofSpringConstraint_setParam_3=function(){return(Mz=b._emscripten_bind_btGeneric6DofSpringConstraint_setParam_3=\nb.asm.qx).apply(null,arguments)},Nz=b._emscripten_bind_btGeneric6DofSpringConstraint___destroy___0=function(){return(Nz=b._emscripten_bind_btGeneric6DofSpringConstraint___destroy___0=b.asm.rx).apply(null,arguments)},Oz=b._emscripten_bind_btSphereShape_btSphereShape_1=function(){return(Oz=b._emscripten_bind_btSphereShape_btSphereShape_1=b.asm.sx).apply(null,arguments)},Pz=b._emscripten_bind_btSphereShape_setMargin_1=function(){return(Pz=b._emscripten_bind_btSphereShape_setMargin_1=b.asm.tx).apply(null,\narguments)},Qz=b._emscripten_bind_btSphereShape_getMargin_0=function(){return(Qz=b._emscripten_bind_btSphereShape_getMargin_0=b.asm.ux).apply(null,arguments)},Rz=b._emscripten_bind_btSphereShape_setLocalScaling_1=function(){return(Rz=b._emscripten_bind_btSphereShape_setLocalScaling_1=b.asm.vx).apply(null,arguments)},Sz=b._emscripten_bind_btSphereShape_getLocalScaling_0=function(){return(Sz=b._emscripten_bind_btSphereShape_getLocalScaling_0=b.asm.wx).apply(null,arguments)},Tz=b._emscripten_bind_btSphereShape_calculateLocalInertia_2=\nfunction(){return(Tz=b._emscripten_bind_btSphereShape_calculateLocalInertia_2=b.asm.xx).apply(null,arguments)},Uz=b._emscripten_bind_btSphereShape___destroy___0=function(){return(Uz=b._emscripten_bind_btSphereShape___destroy___0=b.asm.yx).apply(null,arguments)},Vz=b._emscripten_bind_Face_get_m_n_1=function(){return(Vz=b._emscripten_bind_Face_get_m_n_1=b.asm.zx).apply(null,arguments)},Wz=b._emscripten_bind_Face_set_m_n_2=function(){return(Wz=b._emscripten_bind_Face_set_m_n_2=b.asm.Ax).apply(null,arguments)},\nXz=b._emscripten_bind_Face_get_m_normal_0=function(){return(Xz=b._emscripten_bind_Face_get_m_normal_0=b.asm.Bx).apply(null,arguments)},Yz=b._emscripten_bind_Face_set_m_normal_1=function(){return(Yz=b._emscripten_bind_Face_set_m_normal_1=b.asm.Cx).apply(null,arguments)},Zz=b._emscripten_bind_Face_get_m_ra_0=function(){return(Zz=b._emscripten_bind_Face_get_m_ra_0=b.asm.Dx).apply(null,arguments)},$z=b._emscripten_bind_Face_set_m_ra_1=function(){return($z=b._emscripten_bind_Face_set_m_ra_1=b.asm.Ex).apply(null,\narguments)},aA=b._emscripten_bind_Face___destroy___0=function(){return(aA=b._emscripten_bind_Face___destroy___0=b.asm.Fx).apply(null,arguments)},bA=b._emscripten_bind_tFaceArray_size_0=function(){return(bA=b._emscripten_bind_tFaceArray_size_0=b.asm.Gx).apply(null,arguments)},cA=b._emscripten_bind_tFaceArray_at_1=function(){return(cA=b._emscripten_bind_tFaceArray_at_1=b.asm.Hx).apply(null,arguments)},dA=b._emscripten_bind_tFaceArray___destroy___0=function(){return(dA=b._emscripten_bind_tFaceArray___destroy___0=\nb.asm.Ix).apply(null,arguments)},eA=b._emscripten_bind_LocalConvexResult_LocalConvexResult_5=function(){return(eA=b._emscripten_bind_LocalConvexResult_LocalConvexResult_5=b.asm.Jx).apply(null,arguments)},fA=b._emscripten_bind_LocalConvexResult_get_m_hitCollisionObject_0=function(){return(fA=b._emscripten_bind_LocalConvexResult_get_m_hitCollisionObject_0=b.asm.Kx).apply(null,arguments)},gA=b._emscripten_bind_LocalConvexResult_set_m_hitCollisionObject_1=function(){return(gA=b._emscripten_bind_LocalConvexResult_set_m_hitCollisionObject_1=\nb.asm.Lx).apply(null,arguments)},hA=b._emscripten_bind_LocalConvexResult_get_m_localShapeInfo_0=function(){return(hA=b._emscripten_bind_LocalConvexResult_get_m_localShapeInfo_0=b.asm.Mx).apply(null,arguments)},iA=b._emscripten_bind_LocalConvexResult_set_m_localShapeInfo_1=function(){return(iA=b._emscripten_bind_LocalConvexResult_set_m_localShapeInfo_1=b.asm.Nx).apply(null,arguments)},jA=b._emscripten_bind_LocalConvexResult_get_m_hitNormalLocal_0=function(){return(jA=b._emscripten_bind_LocalConvexResult_get_m_hitNormalLocal_0=\nb.asm.Ox).apply(null,arguments)},kA=b._emscripten_bind_LocalConvexResult_set_m_hitNormalLocal_1=function(){return(kA=b._emscripten_bind_LocalConvexResult_set_m_hitNormalLocal_1=b.asm.Px).apply(null,arguments)},lA=b._emscripten_bind_LocalConvexResult_get_m_hitPointLocal_0=function(){return(lA=b._emscripten_bind_LocalConvexResult_get_m_hitPointLocal_0=b.asm.Qx).apply(null,arguments)},mA=b._emscripten_bind_LocalConvexResult_set_m_hitPointLocal_1=function(){return(mA=b._emscripten_bind_LocalConvexResult_set_m_hitPointLocal_1=\nb.asm.Rx).apply(null,arguments)},nA=b._emscripten_bind_LocalConvexResult_get_m_hitFraction_0=function(){return(nA=b._emscripten_bind_LocalConvexResult_get_m_hitFraction_0=b.asm.Sx).apply(null,arguments)},oA=b._emscripten_bind_LocalConvexResult_set_m_hitFraction_1=function(){return(oA=b._emscripten_bind_LocalConvexResult_set_m_hitFraction_1=b.asm.Tx).apply(null,arguments)},pA=b._emscripten_bind_LocalConvexResult___destroy___0=function(){return(pA=b._emscripten_bind_LocalConvexResult___destroy___0=\nb.asm.Ux).apply(null,arguments)},qA=b._emscripten_enum_btConstraintParams_BT_CONSTRAINT_ERP=function(){return(qA=b._emscripten_enum_btConstraintParams_BT_CONSTRAINT_ERP=b.asm.Vx).apply(null,arguments)},rA=b._emscripten_enum_btConstraintParams_BT_CONSTRAINT_STOP_ERP=function(){return(rA=b._emscripten_enum_btConstraintParams_BT_CONSTRAINT_STOP_ERP=b.asm.Wx).apply(null,arguments)},sA=b._emscripten_enum_btConstraintParams_BT_CONSTRAINT_CFM=function(){return(sA=b._emscripten_enum_btConstraintParams_BT_CONSTRAINT_CFM=\nb.asm.Xx).apply(null,arguments)},tA=b._emscripten_enum_btConstraintParams_BT_CONSTRAINT_STOP_CFM=function(){return(tA=b._emscripten_enum_btConstraintParams_BT_CONSTRAINT_STOP_CFM=b.asm.Yx).apply(null,arguments)},uA=b._emscripten_enum_PHY_ScalarType_PHY_FLOAT=function(){return(uA=b._emscripten_enum_PHY_ScalarType_PHY_FLOAT=b.asm.Zx).apply(null,arguments)},vA=b._emscripten_enum_PHY_ScalarType_PHY_DOUBLE=function(){return(vA=b._emscripten_enum_PHY_ScalarType_PHY_DOUBLE=b.asm._x).apply(null,arguments)},\nwA=b._emscripten_enum_PHY_ScalarType_PHY_INTEGER=function(){return(wA=b._emscripten_enum_PHY_ScalarType_PHY_INTEGER=b.asm.$x).apply(null,arguments)},xA=b._emscripten_enum_PHY_ScalarType_PHY_SHORT=function(){return(xA=b._emscripten_enum_PHY_ScalarType_PHY_SHORT=b.asm.ay).apply(null,arguments)},yA=b._emscripten_enum_PHY_ScalarType_PHY_FIXEDPOINT88=function(){return(yA=b._emscripten_enum_PHY_ScalarType_PHY_FIXEDPOINT88=b.asm.by).apply(null,arguments)},zA=b._emscripten_enum_PHY_ScalarType_PHY_UCHAR=function(){return(zA=\nb._emscripten_enum_PHY_ScalarType_PHY_UCHAR=b.asm.cy).apply(null,arguments)};b._malloc=function(){return(b._malloc=b.asm.dy).apply(null,arguments)};b._free=function(){return(b._free=b.asm.ey).apply(null,arguments)};b.dynCall_vi=function(){return(b.dynCall_vi=b.asm.fy).apply(null,arguments)};b.dynCall_v=function(){return(b.dynCall_v=b.asm.gy).apply(null,arguments)};\nb.UTF8ToString=function(a,c){if(a){var d=a+c;for(c=a;za[c]&&!(c>=d);)++c;if(16<c-a&&za.subarray&&wa)a=wa.decode(za.subarray(a,c));else{for(d=\"\";a<c;){var e=za[a++];if(e&128){var g=za[a++]&63;if(192==(e&224))d+=String.fromCharCode((e&31)<<6|g);else{var n=za[a++]&63;e=224==(e&240)?(e&15)<<12|g<<6|n:(e&7)<<18|g<<12|n<<6|za[a++]&63;65536>e?d+=String.fromCharCode(e):(e-=65536,d+=String.fromCharCode(55296|e>>10,56320|e&1023))}}else d+=String.fromCharCode(e)}a=d}}else a=\"\";return a};var AA;\nOa=function BA(){AA||CA();AA||(Oa=BA)};\nfunction CA(){function a(){if(!AA&&(AA=!0,b.calledRun=!0,!va)){Ka=!0;Fa(Ha);Fa(Ia);ba(b);if(b.onRuntimeInitialized)b.onRuntimeInitialized();if(b.postRun)for(\"function\"==typeof b.postRun&&(b.postRun=[b.postRun]);b.postRun.length;){var c=b.postRun.shift();Ja.unshift(c)}Fa(Ja)}}if(!(0<Ma)){if(b.preRun)for(\"function\"==typeof b.preRun&&(b.preRun=[b.preRun]);b.preRun.length;)La();Fa(Ga);0<Ma||(b.setStatus?(b.setStatus(\"Running...\"),setTimeout(function(){setTimeout(function(){b.setStatus(\"\")},1);a()},1)):\na())}}b.run=CA;if(b.preInit)for(\"function\"==typeof b.preInit&&(b.preInit=[b.preInit]);0<b.preInit.length;)b.preInit.pop()();noExitRuntime=!0;CA();function f(){}f.prototype=Object.create(f.prototype);f.prototype.constructor=f;f.prototype.iy=f;f.jy={};b.WrapperObject=f;function h(a){return(a||f).jy}b.getCache=h;function k(a,c){var d=h(c),e=d[a];if(e)return e;e=Object.create((c||f).prototype);e.hy=a;return d[a]=e}b.wrapPointer=k;b.castObject=function(a,c){return k(a.hy,c)};b.NULL=k(0);\nb.destroy=function(a){if(!a.__destroy__)throw\"Error: Cannot destroy object. (Did you create it yourself?)\";a.__destroy__();delete h(a.iy)[a.hy]};b.compare=function(a,c){return a.hy===c.hy};b.getPointer=function(a){return a.hy};b.getClass=function(a){return a.iy};var DA=0,EA=0,FA=0,GA=[],HA=0;function IA(){if(HA){for(var a=0;a<GA.length;a++)b._free(GA[a]);GA.length=0;b._free(DA);DA=0;EA+=HA;HA=0}DA||(EA+=128,DA=b._malloc(EA),assert(DA));FA=0}\nfunction JA(a,c){assert(DA);a=a.length*c.BYTES_PER_ELEMENT;a=a+7&-8;FA+a>=EA?(assert(0<a),HA+=a,c=b._malloc(a),GA.push(c)):(c=DA+FA,FA+=a);return c}function KA(a,c,d){d>>>=0;switch(c.BYTES_PER_ELEMENT){case 2:d>>>=1;break;case 4:d>>>=2;break;case 8:d>>>=3}for(var e=0;e<a.length;e++)c[d+e]=a[e]}\nfunction LA(a){if(\"string\"===typeof a){for(var c=0,d=0;d<a.length;++d){var e=a.charCodeAt(d);55296<=e&&57343>=e&&(e=65536+((e&1023)<<10)|a.charCodeAt(++d)&1023);127>=e?++c:c=2047>=e?c+2:65535>=e?c+3:c+4}c=Array(c+1);e=c.length;d=0;if(0<e){e=d+e-1;for(var g=0;g<a.length;++g){var n=a.charCodeAt(g);if(55296<=n&&57343>=n){var F=a.charCodeAt(++g);n=65536+((n&1023)<<10)|F&1023}if(127>=n){if(d>=e)break;c[d++]=n}else{if(2047>=n){if(d+1>=e)break;c[d++]=192|n>>6}else{if(65535>=n){if(d+2>=e)break;c[d++]=224|\nn>>12}else{if(d+3>=e)break;c[d++]=240|n>>18;c[d++]=128|n>>12&63}c[d++]=128|n>>6&63}c[d++]=128|n&63}}c[d]=0}a=JA(c,ya);KA(c,ya,a)}return a}function MA(a){if(\"object\"===typeof a){var c=JA(a,Ba);KA(a,Ba,c);return c}return a}function NA(){throw\"cannot construct a btCollisionWorld, no constructor in IDL\";}NA.prototype=Object.create(f.prototype);NA.prototype.constructor=NA;NA.prototype.iy=NA;NA.jy={};b.btCollisionWorld=NA;NA.prototype.getDispatcher=function(){return k($a(this.hy),OA)};\nNA.prototype.rayTest=function(a,c,d){var e=this.hy;a&&\"object\"===typeof a&&(a=a.hy);c&&\"object\"===typeof c&&(c=c.hy);d&&\"object\"===typeof d&&(d=d.hy);ab(e,a,c,d)};NA.prototype.getPairCache=function(){return k(bb(this.hy),PA)};NA.prototype.getDispatchInfo=function(){return k(cb(this.hy),l)};\nNA.prototype.addCollisionObject=function(a,c,d){var e=this.hy;a&&\"object\"===typeof a&&(a=a.hy);c&&\"object\"===typeof c&&(c=c.hy);d&&\"object\"===typeof d&&(d=d.hy);void 0===c?db(e,a):void 0===d?eb(e,a,c):fb(e,a,c,d)};NA.prototype.removeCollisionObject=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);gb(c,a)};NA.prototype.getBroadphase=function(){return k(hb(this.hy),QA)};\nNA.prototype.convexSweepTest=function(a,c,d,e,g){var n=this.hy;a&&\"object\"===typeof a&&(a=a.hy);c&&\"object\"===typeof c&&(c=c.hy);d&&\"object\"===typeof d&&(d=d.hy);e&&\"object\"===typeof e&&(e=e.hy);g&&\"object\"===typeof g&&(g=g.hy);ib(n,a,c,d,e,g)};NA.prototype.contactPairTest=function(a,c,d){var e=this.hy;a&&\"object\"===typeof a&&(a=a.hy);c&&\"object\"===typeof c&&(c=c.hy);d&&\"object\"===typeof d&&(d=d.hy);jb(e,a,c,d)};\nNA.prototype.contactTest=function(a,c){var d=this.hy;a&&\"object\"===typeof a&&(a=a.hy);c&&\"object\"===typeof c&&(c=c.hy);kb(d,a,c)};NA.prototype.updateSingleAabb=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);lb(c,a)};NA.prototype.setDebugDrawer=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);mb(c,a)};NA.prototype.getDebugDrawer=function(){return k(nb(this.hy),RA)};NA.prototype.debugDrawWorld=function(){ob(this.hy)};\nNA.prototype.debugDrawObject=function(a,c,d){var e=this.hy;a&&\"object\"===typeof a&&(a=a.hy);c&&\"object\"===typeof c&&(c=c.hy);d&&\"object\"===typeof d&&(d=d.hy);pb(e,a,c,d)};NA.prototype.__destroy__=function(){qb(this.hy)};function m(){throw\"cannot construct a btCollisionShape, no constructor in IDL\";}m.prototype=Object.create(f.prototype);m.prototype.constructor=m;m.prototype.iy=m;m.jy={};b.btCollisionShape=m;\nm.prototype.setLocalScaling=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);rb(c,a)};m.prototype.getLocalScaling=function(){return k(sb(this.hy),p)};m.prototype.calculateLocalInertia=function(a,c){var d=this.hy;a&&\"object\"===typeof a&&(a=a.hy);c&&\"object\"===typeof c&&(c=c.hy);tb(d,a,c)};m.prototype.setMargin=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);ub(c,a)};m.prototype.getMargin=function(){return vb(this.hy)};m.prototype.__destroy__=function(){wb(this.hy)};\nfunction q(){throw\"cannot construct a btCollisionObject, no constructor in IDL\";}q.prototype=Object.create(f.prototype);q.prototype.constructor=q;q.prototype.iy=q;q.jy={};b.btCollisionObject=q;q.prototype.setAnisotropicFriction=function(a,c){var d=this.hy;a&&\"object\"===typeof a&&(a=a.hy);c&&\"object\"===typeof c&&(c=c.hy);xb(d,a,c)};q.prototype.getCollisionShape=function(){return k(yb(this.hy),m)};\nq.prototype.setContactProcessingThreshold=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);zb(c,a)};q.prototype.setActivationState=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Ab(c,a)};q.prototype.forceActivationState=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Bb(c,a)};q.prototype.activate=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);void 0===a?Cb(c):Db(c,a)};q.prototype.isActive=function(){return!!Eb(this.hy)};q.prototype.isKinematicObject=function(){return!!Fb(this.hy)};\nq.prototype.isStaticObject=function(){return!!Gb(this.hy)};q.prototype.isStaticOrKinematicObject=function(){return!!Hb(this.hy)};q.prototype.getRestitution=function(){return Ib(this.hy)};q.prototype.getFriction=function(){return Jb(this.hy)};q.prototype.getRollingFriction=function(){return Kb(this.hy)};q.prototype.setRestitution=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Lb(c,a)};q.prototype.setFriction=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Mb(c,a)};\nq.prototype.setRollingFriction=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Nb(c,a)};q.prototype.getWorldTransform=function(){return k(Ob(this.hy),r)};q.prototype.getCollisionFlags=function(){return Pb(this.hy)};q.prototype.setCollisionFlags=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Qb(c,a)};q.prototype.setWorldTransform=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Sb(c,a)};\nq.prototype.setCollisionShape=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Tb(c,a)};q.prototype.setCcdMotionThreshold=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Ub(c,a)};q.prototype.setCcdSweptSphereRadius=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Vb(c,a)};q.prototype.getUserIndex=function(){return Wb(this.hy)};q.prototype.setUserIndex=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Xb(c,a)};\nq.prototype.getUserPointer=function(){return k(Yb(this.hy),SA)};q.prototype.setUserPointer=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Zb(c,a)};q.prototype.getBroadphaseHandle=function(){return k($b(this.hy),t)};q.prototype.__destroy__=function(){ac(this.hy)};function u(){throw\"cannot construct a btDynamicsWorld, no constructor in IDL\";}u.prototype=Object.create(NA.prototype);u.prototype.constructor=u;u.prototype.iy=u;u.jy={};b.btDynamicsWorld=u;\nu.prototype.addAction=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);bc(c,a)};u.prototype.removeAction=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);cc(c,a)};u.prototype.getSolverInfo=function(){return k(dc(this.hy),v)};u.prototype.setInternalTickCallback=function(a,c,d){var e=this.hy;a&&\"object\"===typeof a&&(a=a.hy);c&&\"object\"===typeof c&&(c=c.hy);d&&\"object\"===typeof d&&(d=d.hy);void 0===c?ec(e,a):void 0===d?fc(e,a,c):hc(e,a,c,d)};\nu.prototype.getDispatcher=function(){return k(ic(this.hy),OA)};u.prototype.rayTest=function(a,c,d){var e=this.hy;a&&\"object\"===typeof a&&(a=a.hy);c&&\"object\"===typeof c&&(c=c.hy);d&&\"object\"===typeof d&&(d=d.hy);jc(e,a,c,d)};u.prototype.getPairCache=function(){return k(kc(this.hy),PA)};u.prototype.getDispatchInfo=function(){return k(lc(this.hy),l)};\nu.prototype.addCollisionObject=function(a,c,d){var e=this.hy;a&&\"object\"===typeof a&&(a=a.hy);c&&\"object\"===typeof c&&(c=c.hy);d&&\"object\"===typeof d&&(d=d.hy);void 0===c?mc(e,a):void 0===d?nc(e,a,c):oc(e,a,c,d)};u.prototype.removeCollisionObject=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);pc(c,a)};u.prototype.getBroadphase=function(){return k(qc(this.hy),QA)};\nu.prototype.convexSweepTest=function(a,c,d,e,g){var n=this.hy;a&&\"object\"===typeof a&&(a=a.hy);c&&\"object\"===typeof c&&(c=c.hy);d&&\"object\"===typeof d&&(d=d.hy);e&&\"object\"===typeof e&&(e=e.hy);g&&\"object\"===typeof g&&(g=g.hy);rc(n,a,c,d,e,g)};u.prototype.contactPairTest=function(a,c,d){var e=this.hy;a&&\"object\"===typeof a&&(a=a.hy);c&&\"object\"===typeof c&&(c=c.hy);d&&\"object\"===typeof d&&(d=d.hy);sc(e,a,c,d)};\nu.prototype.contactTest=function(a,c){var d=this.hy;a&&\"object\"===typeof a&&(a=a.hy);c&&\"object\"===typeof c&&(c=c.hy);tc(d,a,c)};u.prototype.updateSingleAabb=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);uc(c,a)};u.prototype.setDebugDrawer=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);vc(c,a)};u.prototype.getDebugDrawer=function(){return k(wc(this.hy),RA)};u.prototype.debugDrawWorld=function(){xc(this.hy)};\nu.prototype.debugDrawObject=function(a,c,d){var e=this.hy;a&&\"object\"===typeof a&&(a=a.hy);c&&\"object\"===typeof c&&(c=c.hy);d&&\"object\"===typeof d&&(d=d.hy);yc(e,a,c,d)};u.prototype.__destroy__=function(){zc(this.hy)};function TA(){throw\"cannot construct a btTypedConstraint, no constructor in IDL\";}TA.prototype=Object.create(f.prototype);TA.prototype.constructor=TA;TA.prototype.iy=TA;TA.jy={};b.btTypedConstraint=TA;\nTA.prototype.enableFeedback=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Ac(c,a)};TA.prototype.getBreakingImpulseThreshold=function(){return Bc(this.hy)};TA.prototype.setBreakingImpulseThreshold=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Cc(c,a)};TA.prototype.getParam=function(a,c){var d=this.hy;a&&\"object\"===typeof a&&(a=a.hy);c&&\"object\"===typeof c&&(c=c.hy);return Dc(d,a,c)};\nTA.prototype.setParam=function(a,c,d){var e=this.hy;a&&\"object\"===typeof a&&(a=a.hy);c&&\"object\"===typeof c&&(c=c.hy);d&&\"object\"===typeof d&&(d=d.hy);Ec(e,a,c,d)};TA.prototype.__destroy__=function(){Fc(this.hy)};function UA(){throw\"cannot construct a btConcaveShape, no constructor in IDL\";}UA.prototype=Object.create(m.prototype);UA.prototype.constructor=UA;UA.prototype.iy=UA;UA.jy={};b.btConcaveShape=UA;\nUA.prototype.setLocalScaling=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Gc(c,a)};UA.prototype.getLocalScaling=function(){return k(Hc(this.hy),p)};UA.prototype.calculateLocalInertia=function(a,c){var d=this.hy;a&&\"object\"===typeof a&&(a=a.hy);c&&\"object\"===typeof c&&(c=c.hy);Ic(d,a,c)};UA.prototype.__destroy__=function(){Jc(this.hy)};function VA(a,c){a&&\"object\"===typeof a&&(a=a.hy);c&&\"object\"===typeof c&&(c=c.hy);this.hy=Kc(a,c);h(VA)[this.hy]=this}VA.prototype=Object.create(m.prototype);\nVA.prototype.constructor=VA;VA.prototype.iy=VA;VA.jy={};b.btCapsuleShape=VA;VA.prototype.setMargin=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Lc(c,a)};VA.prototype.getMargin=function(){return Mc(this.hy)};VA.prototype.getUpAxis=function(){return Nc(this.hy)};VA.prototype.getRadius=function(){return Oc(this.hy)};VA.prototype.getHalfHeight=function(){return Pc(this.hy)};VA.prototype.setLocalScaling=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Qc(c,a)};\nVA.prototype.getLocalScaling=function(){return k(Rc(this.hy),p)};VA.prototype.calculateLocalInertia=function(a,c){var d=this.hy;a&&\"object\"===typeof a&&(a=a.hy);c&&\"object\"===typeof c&&(c=c.hy);Sc(d,a,c)};VA.prototype.__destroy__=function(){Tc(this.hy)};function RA(){throw\"cannot construct a btIDebugDraw, no constructor in IDL\";}RA.prototype=Object.create(f.prototype);RA.prototype.constructor=RA;RA.prototype.iy=RA;RA.jy={};b.btIDebugDraw=RA;\nRA.prototype.drawLine=function(a,c,d){var e=this.hy;a&&\"object\"===typeof a&&(a=a.hy);c&&\"object\"===typeof c&&(c=c.hy);d&&\"object\"===typeof d&&(d=d.hy);Uc(e,a,c,d)};RA.prototype.drawContactPoint=function(a,c,d,e,g){var n=this.hy;a&&\"object\"===typeof a&&(a=a.hy);c&&\"object\"===typeof c&&(c=c.hy);d&&\"object\"===typeof d&&(d=d.hy);e&&\"object\"===typeof e&&(e=e.hy);g&&\"object\"===typeof g&&(g=g.hy);Vc(n,a,c,d,e,g)};\nRA.prototype.reportErrorWarning=function(a){var c=this.hy;IA();a=a&&\"object\"===typeof a?a.hy:LA(a);Wc(c,a)};RA.prototype.draw3dText=function(a,c){var d=this.hy;IA();a&&\"object\"===typeof a&&(a=a.hy);c=c&&\"object\"===typeof c?c.hy:LA(c);Xc(d,a,c)};RA.prototype.setDebugMode=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Yc(c,a)};RA.prototype.getDebugMode=function(){return Zc(this.hy)};RA.prototype.__destroy__=function(){$c(this.hy)};\nfunction WA(a){a&&\"object\"===typeof a&&(a=a.hy);this.hy=void 0===a?ad():bd(a);h(WA)[this.hy]=this}WA.prototype=Object.create(f.prototype);WA.prototype.constructor=WA;WA.prototype.iy=WA;WA.jy={};b.btDefaultCollisionConfiguration=WA;WA.prototype.__destroy__=function(){cd(this.hy)};function XA(){throw\"cannot construct a btTriangleMeshShape, no constructor in IDL\";}XA.prototype=Object.create(UA.prototype);XA.prototype.constructor=XA;XA.prototype.iy=XA;XA.jy={};b.btTriangleMeshShape=XA;\nXA.prototype.setLocalScaling=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);dd(c,a)};XA.prototype.getLocalScaling=function(){return k(ed(this.hy),p)};XA.prototype.calculateLocalInertia=function(a,c){var d=this.hy;a&&\"object\"===typeof a&&(a=a.hy);c&&\"object\"===typeof c&&(c=c.hy);fd(d,a,c)};XA.prototype.__destroy__=function(){gd(this.hy)};function w(){this.hy=hd();h(w)[this.hy]=this}w.prototype=Object.create(q.prototype);w.prototype.constructor=w;w.prototype.iy=w;w.jy={};\nb.btGhostObject=w;w.prototype.getNumOverlappingObjects=function(){return id(this.hy)};w.prototype.getOverlappingObject=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);return k(jd(c,a),q)};w.prototype.setAnisotropicFriction=function(a,c){var d=this.hy;a&&\"object\"===typeof a&&(a=a.hy);c&&\"object\"===typeof c&&(c=c.hy);kd(d,a,c)};w.prototype.getCollisionShape=function(){return k(ld(this.hy),m)};\nw.prototype.setContactProcessingThreshold=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);md(c,a)};w.prototype.setActivationState=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);nd(c,a)};w.prototype.forceActivationState=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);od(c,a)};w.prototype.activate=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);void 0===a?pd(c):qd(c,a)};w.prototype.isActive=function(){return!!rd(this.hy)};w.prototype.isKinematicObject=function(){return!!sd(this.hy)};\nw.prototype.isStaticObject=function(){return!!td(this.hy)};w.prototype.isStaticOrKinematicObject=function(){return!!ud(this.hy)};w.prototype.getRestitution=function(){return vd(this.hy)};w.prototype.getFriction=function(){return wd(this.hy)};w.prototype.getRollingFriction=function(){return xd(this.hy)};w.prototype.setRestitution=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);yd(c,a)};w.prototype.setFriction=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);zd(c,a)};\nw.prototype.setRollingFriction=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Ad(c,a)};w.prototype.getWorldTransform=function(){return k(Bd(this.hy),r)};w.prototype.getCollisionFlags=function(){return Cd(this.hy)};w.prototype.setCollisionFlags=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Dd(c,a)};w.prototype.setWorldTransform=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Ed(c,a)};\nw.prototype.setCollisionShape=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Fd(c,a)};w.prototype.setCcdMotionThreshold=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Gd(c,a)};w.prototype.setCcdSweptSphereRadius=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Hd(c,a)};w.prototype.getUserIndex=function(){return Id(this.hy)};w.prototype.setUserIndex=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Jd(c,a)};\nw.prototype.getUserPointer=function(){return k(Kd(this.hy),SA)};w.prototype.setUserPointer=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Ld(c,a)};w.prototype.getBroadphaseHandle=function(){return k(Md(this.hy),t)};w.prototype.__destroy__=function(){Nd(this.hy)};function YA(a,c){a&&\"object\"===typeof a&&(a=a.hy);c&&\"object\"===typeof c&&(c=c.hy);this.hy=Od(a,c);h(YA)[this.hy]=this}YA.prototype=Object.create(m.prototype);YA.prototype.constructor=YA;YA.prototype.iy=YA;YA.jy={};\nb.btConeShape=YA;YA.prototype.setLocalScaling=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Pd(c,a)};YA.prototype.getLocalScaling=function(){return k(Qd(this.hy),p)};YA.prototype.calculateLocalInertia=function(a,c){var d=this.hy;a&&\"object\"===typeof a&&(a=a.hy);c&&\"object\"===typeof c&&(c=c.hy);Rd(d,a,c)};YA.prototype.__destroy__=function(){Sd(this.hy)};function ZA(){throw\"cannot construct a btActionInterface, no constructor in IDL\";}ZA.prototype=Object.create(f.prototype);\nZA.prototype.constructor=ZA;ZA.prototype.iy=ZA;ZA.jy={};b.btActionInterface=ZA;ZA.prototype.updateAction=function(a,c){var d=this.hy;a&&\"object\"===typeof a&&(a=a.hy);c&&\"object\"===typeof c&&(c=c.hy);Td(d,a,c)};ZA.prototype.__destroy__=function(){Ud(this.hy)};\nfunction p(a,c,d){a&&\"object\"===typeof a&&(a=a.hy);c&&\"object\"===typeof c&&(c=c.hy);d&&\"object\"===typeof d&&(d=d.hy);this.hy=void 0===a?Vd():void 0===c?_emscripten_bind_btVector3_btVector3_1(a):void 0===d?_emscripten_bind_btVector3_btVector3_2(a,c):Wd(a,c,d);h(p)[this.hy]=this}p.prototype=Object.create(f.prototype);p.prototype.constructor=p;p.prototype.iy=p;p.jy={};b.btVector3=p;p.prototype.length=p.prototype.length=function(){return Xd(this.hy)};p.prototype.x=p.prototype.x=function(){return Yd(this.hy)};\np.prototype.y=p.prototype.y=function(){return Zd(this.hy)};p.prototype.z=p.prototype.z=function(){return $d(this.hy)};p.prototype.setX=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);ae(c,a)};p.prototype.setY=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);be(c,a)};p.prototype.setZ=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);ce(c,a)};\np.prototype.setValue=function(a,c,d){var e=this.hy;a&&\"object\"===typeof a&&(a=a.hy);c&&\"object\"===typeof c&&(c=c.hy);d&&\"object\"===typeof d&&(d=d.hy);de(e,a,c,d)};p.prototype.normalize=p.prototype.normalize=function(){ee(this.hy)};p.prototype.rotate=p.prototype.rotate=function(a,c){var d=this.hy;a&&\"object\"===typeof a&&(a=a.hy);c&&\"object\"===typeof c&&(c=c.hy);return k(fe(d,a,c),p)};p.prototype.dot=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);return ge(c,a)};\np.prototype.op_mul=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);return k(he(c,a),p)};p.prototype.op_add=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);return k(ie(c,a),p)};p.prototype.op_sub=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);return k(je(c,a),p)};p.prototype.__destroy__=function(){ke(this.hy)};function $A(){throw\"cannot construct a btVehicleRaycaster, no constructor in IDL\";}$A.prototype=Object.create(f.prototype);$A.prototype.constructor=$A;\n$A.prototype.iy=$A;$A.jy={};b.btVehicleRaycaster=$A;$A.prototype.castRay=function(a,c,d){var e=this.hy;a&&\"object\"===typeof a&&(a=a.hy);c&&\"object\"===typeof c&&(c=c.hy);d&&\"object\"===typeof d&&(d=d.hy);le(e,a,c,d)};$A.prototype.__destroy__=function(){me(this.hy)};function aB(){throw\"cannot construct a btQuadWord, no constructor in IDL\";}aB.prototype=Object.create(f.prototype);aB.prototype.constructor=aB;aB.prototype.iy=aB;aB.jy={};b.btQuadWord=aB;aB.prototype.x=aB.prototype.x=function(){return ne(this.hy)};\naB.prototype.y=aB.prototype.y=function(){return oe(this.hy)};aB.prototype.z=aB.prototype.z=function(){return pe(this.hy)};aB.prototype.w=function(){return qe(this.hy)};aB.prototype.setX=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);re(c,a)};aB.prototype.setY=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);se(c,a)};aB.prototype.setZ=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);te(c,a)};\naB.prototype.setW=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);ue(c,a)};aB.prototype.__destroy__=function(){ve(this.hy)};function bB(a){a&&\"object\"===typeof a&&(a=a.hy);this.hy=we(a);h(bB)[this.hy]=this}bB.prototype=Object.create(m.prototype);bB.prototype.constructor=bB;bB.prototype.iy=bB;bB.jy={};b.btCylinderShape=bB;bB.prototype.setMargin=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);xe(c,a)};bB.prototype.getMargin=function(){return ye(this.hy)};\nbB.prototype.setLocalScaling=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);ze(c,a)};bB.prototype.getLocalScaling=function(){return k(Ae(this.hy),p)};bB.prototype.calculateLocalInertia=function(a,c){var d=this.hy;a&&\"object\"===typeof a&&(a=a.hy);c&&\"object\"===typeof c&&(c=c.hy);Be(d,a,c)};bB.prototype.__destroy__=function(){Ce(this.hy)};\nfunction x(a,c,d,e){a&&\"object\"===typeof a&&(a=a.hy);c&&\"object\"===typeof c&&(c=c.hy);d&&\"object\"===typeof d&&(d=d.hy);e&&\"object\"===typeof e&&(e=e.hy);this.hy=De(a,c,d,e);h(x)[this.hy]=this}x.prototype=Object.create(u.prototype);x.prototype.constructor=x;x.prototype.iy=x;x.jy={};b.btDiscreteDynamicsWorld=x;x.prototype.setGravity=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Ee(c,a)};x.prototype.getGravity=function(){return k(Fe(this.hy),p)};\nx.prototype.addRigidBody=function(a,c,d){var e=this.hy;a&&\"object\"===typeof a&&(a=a.hy);c&&\"object\"===typeof c&&(c=c.hy);d&&\"object\"===typeof d&&(d=d.hy);void 0===c?Ge(e,a):void 0===d?_emscripten_bind_btDiscreteDynamicsWorld_addRigidBody_2(e,a,c):He(e,a,c,d)};x.prototype.removeRigidBody=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Ie(c,a)};\nx.prototype.addConstraint=function(a,c){var d=this.hy;a&&\"object\"===typeof a&&(a=a.hy);c&&\"object\"===typeof c&&(c=c.hy);void 0===c?Je(d,a):Ke(d,a,c)};x.prototype.removeConstraint=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Le(c,a)};x.prototype.stepSimulation=function(a,c,d){var e=this.hy;a&&\"object\"===typeof a&&(a=a.hy);c&&\"object\"===typeof c&&(c=c.hy);d&&\"object\"===typeof d&&(d=d.hy);return void 0===c?Me(e,a):void 0===d?Ne(e,a,c):Oe(e,a,c,d)};\nx.prototype.setContactAddedCallback=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Pe(c,a)};x.prototype.setContactProcessedCallback=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Qe(c,a)};x.prototype.setContactDestroyedCallback=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Re(c,a)};x.prototype.getDispatcher=function(){return k(Se(this.hy),OA)};\nx.prototype.rayTest=function(a,c,d){var e=this.hy;a&&\"object\"===typeof a&&(a=a.hy);c&&\"object\"===typeof c&&(c=c.hy);d&&\"object\"===typeof d&&(d=d.hy);Te(e,a,c,d)};x.prototype.getPairCache=function(){return k(Ue(this.hy),PA)};x.prototype.getDispatchInfo=function(){return k(Ve(this.hy),l)};x.prototype.addCollisionObject=function(a,c,d){var e=this.hy;a&&\"object\"===typeof a&&(a=a.hy);c&&\"object\"===typeof c&&(c=c.hy);d&&\"object\"===typeof d&&(d=d.hy);void 0===c?We(e,a):void 0===d?Xe(e,a,c):Ye(e,a,c,d)};\nx.prototype.removeCollisionObject=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Ze(c,a)};x.prototype.getBroadphase=function(){return k($e(this.hy),QA)};x.prototype.convexSweepTest=function(a,c,d,e,g){var n=this.hy;a&&\"object\"===typeof a&&(a=a.hy);c&&\"object\"===typeof c&&(c=c.hy);d&&\"object\"===typeof d&&(d=d.hy);e&&\"object\"===typeof e&&(e=e.hy);g&&\"object\"===typeof g&&(g=g.hy);af(n,a,c,d,e,g)};\nx.prototype.contactPairTest=function(a,c,d){var e=this.hy;a&&\"object\"===typeof a&&(a=a.hy);c&&\"object\"===typeof c&&(c=c.hy);d&&\"object\"===typeof d&&(d=d.hy);bf(e,a,c,d)};x.prototype.contactTest=function(a,c){var d=this.hy;a&&\"object\"===typeof a&&(a=a.hy);c&&\"object\"===typeof c&&(c=c.hy);cf(d,a,c)};x.prototype.updateSingleAabb=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);df(c,a)};x.prototype.setDebugDrawer=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);ef(c,a)};\nx.prototype.getDebugDrawer=function(){return k(ff(this.hy),RA)};x.prototype.debugDrawWorld=function(){gf(this.hy)};x.prototype.debugDrawObject=function(a,c,d){var e=this.hy;a&&\"object\"===typeof a&&(a=a.hy);c&&\"object\"===typeof c&&(c=c.hy);d&&\"object\"===typeof d&&(d=d.hy);hf(e,a,c,d)};x.prototype.addAction=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);jf(c,a)};x.prototype.removeAction=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);kf(c,a)};\nx.prototype.getSolverInfo=function(){return k(lf(this.hy),v)};x.prototype.setInternalTickCallback=function(a,c,d){var e=this.hy;a&&\"object\"===typeof a&&(a=a.hy);c&&\"object\"===typeof c&&(c=c.hy);d&&\"object\"===typeof d&&(d=d.hy);void 0===c?mf(e,a):void 0===d?nf(e,a,c):of(e,a,c,d)};x.prototype.__destroy__=function(){pf(this.hy)};function cB(){throw\"cannot construct a btConvexShape, no constructor in IDL\";}cB.prototype=Object.create(m.prototype);cB.prototype.constructor=cB;cB.prototype.iy=cB;cB.jy={};\nb.btConvexShape=cB;cB.prototype.setLocalScaling=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);qf(c,a)};cB.prototype.getLocalScaling=function(){return k(rf(this.hy),p)};cB.prototype.calculateLocalInertia=function(a,c){var d=this.hy;a&&\"object\"===typeof a&&(a=a.hy);c&&\"object\"===typeof c&&(c=c.hy);sf(d,a,c)};cB.prototype.setMargin=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);tf(c,a)};cB.prototype.getMargin=function(){return uf(this.hy)};cB.prototype.__destroy__=function(){vf(this.hy)};\nfunction OA(){throw\"cannot construct a btDispatcher, no constructor in IDL\";}OA.prototype=Object.create(f.prototype);OA.prototype.constructor=OA;OA.prototype.iy=OA;OA.jy={};b.btDispatcher=OA;OA.prototype.getNumManifolds=function(){return wf(this.hy)};OA.prototype.getManifoldByIndexInternal=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);return k(xf(c,a),dB)};OA.prototype.__destroy__=function(){yf(this.hy)};\nfunction eB(a,c,d,e,g){a&&\"object\"===typeof a&&(a=a.hy);c&&\"object\"===typeof c&&(c=c.hy);d&&\"object\"===typeof d&&(d=d.hy);e&&\"object\"===typeof e&&(e=e.hy);g&&\"object\"===typeof g&&(g=g.hy);this.hy=void 0===e?zf(a,c,d):void 0===g?_emscripten_bind_btGeneric6DofConstraint_btGeneric6DofConstraint_4(a,c,d,e):Af(a,c,d,e,g);h(eB)[this.hy]=this}eB.prototype=Object.create(TA.prototype);eB.prototype.constructor=eB;eB.prototype.iy=eB;eB.jy={};b.btGeneric6DofConstraint=eB;\neB.prototype.setLinearLowerLimit=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Bf(c,a)};eB.prototype.setLinearUpperLimit=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Cf(c,a)};eB.prototype.setAngularLowerLimit=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Df(c,a)};eB.prototype.setAngularUpperLimit=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Ef(c,a)};eB.prototype.getFrameOffsetA=function(){return k(Ff(this.hy),r)};\neB.prototype.enableFeedback=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Gf(c,a)};eB.prototype.getBreakingImpulseThreshold=function(){return Hf(this.hy)};eB.prototype.setBreakingImpulseThreshold=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);If(c,a)};eB.prototype.getParam=function(a,c){var d=this.hy;a&&\"object\"===typeof a&&(a=a.hy);c&&\"object\"===typeof c&&(c=c.hy);return Jf(d,a,c)};\neB.prototype.setParam=function(a,c,d){var e=this.hy;a&&\"object\"===typeof a&&(a=a.hy);c&&\"object\"===typeof c&&(c=c.hy);d&&\"object\"===typeof d&&(d=d.hy);Kf(e,a,c,d)};eB.prototype.__destroy__=function(){Lf(this.hy)};function fB(){throw\"cannot construct a btStridingMeshInterface, no constructor in IDL\";}fB.prototype=Object.create(f.prototype);fB.prototype.constructor=fB;fB.prototype.iy=fB;fB.jy={};b.btStridingMeshInterface=fB;\nfB.prototype.setScaling=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Mf(c,a)};fB.prototype.__destroy__=function(){Nf(this.hy)};function gB(){throw\"cannot construct a btMotionState, no constructor in IDL\";}gB.prototype=Object.create(f.prototype);gB.prototype.constructor=gB;gB.prototype.iy=gB;gB.jy={};b.btMotionState=gB;gB.prototype.getWorldTransform=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Of(c,a)};\ngB.prototype.setWorldTransform=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Pf(c,a)};gB.prototype.__destroy__=function(){Qf(this.hy)};function y(){throw\"cannot construct a ConvexResultCallback, no constructor in IDL\";}y.prototype=Object.create(f.prototype);y.prototype.constructor=y;y.prototype.iy=y;y.jy={};b.ConvexResultCallback=y;y.prototype.hasHit=function(){return!!Rf(this.hy)};y.prototype.get_m_collisionFilterGroup=y.prototype.ky=function(){return Sf(this.hy)};\ny.prototype.set_m_collisionFilterGroup=y.prototype.my=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Tf(c,a)};Object.defineProperty(y.prototype,\"m_collisionFilterGroup\",{get:y.prototype.ky,set:y.prototype.my});y.prototype.get_m_collisionFilterMask=y.prototype.ly=function(){return Uf(this.hy)};y.prototype.set_m_collisionFilterMask=y.prototype.ny=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Vf(c,a)};\nObject.defineProperty(y.prototype,\"m_collisionFilterMask\",{get:y.prototype.ly,set:y.prototype.ny});y.prototype.get_m_closestHitFraction=y.prototype.oy=function(){return Wf(this.hy)};y.prototype.set_m_closestHitFraction=y.prototype.py=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Xf(c,a)};Object.defineProperty(y.prototype,\"m_closestHitFraction\",{get:y.prototype.oy,set:y.prototype.py});y.prototype.__destroy__=function(){Yf(this.hy)};\nfunction hB(){throw\"cannot construct a ContactResultCallback, no constructor in IDL\";}hB.prototype=Object.create(f.prototype);hB.prototype.constructor=hB;hB.prototype.iy=hB;hB.jy={};b.ContactResultCallback=hB;\nhB.prototype.addSingleResult=function(a,c,d,e,g,n,F){var aa=this.hy;a&&\"object\"===typeof a&&(a=a.hy);c&&\"object\"===typeof c&&(c=c.hy);d&&\"object\"===typeof d&&(d=d.hy);e&&\"object\"===typeof e&&(e=e.hy);g&&\"object\"===typeof g&&(g=g.hy);n&&\"object\"===typeof n&&(n=n.hy);F&&\"object\"===typeof F&&(F=F.hy);return Zf(aa,a,c,d,e,g,n,F)};hB.prototype.__destroy__=function(){$f(this.hy)};function iB(){throw\"cannot construct a btSoftBodySolver, no constructor in IDL\";}iB.prototype=Object.create(f.prototype);\niB.prototype.constructor=iB;iB.prototype.iy=iB;iB.jy={};b.btSoftBodySolver=iB;iB.prototype.__destroy__=function(){ag(this.hy)};function z(){throw\"cannot construct a RayResultCallback, no constructor in IDL\";}z.prototype=Object.create(f.prototype);z.prototype.constructor=z;z.prototype.iy=z;z.jy={};b.RayResultCallback=z;z.prototype.hasHit=function(){return!!bg(this.hy)};z.prototype.get_m_collisionFilterGroup=z.prototype.ky=function(){return cg(this.hy)};\nz.prototype.set_m_collisionFilterGroup=z.prototype.my=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);dg(c,a)};Object.defineProperty(z.prototype,\"m_collisionFilterGroup\",{get:z.prototype.ky,set:z.prototype.my});z.prototype.get_m_collisionFilterMask=z.prototype.ly=function(){return eg(this.hy)};z.prototype.set_m_collisionFilterMask=z.prototype.ny=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);fg(c,a)};\nObject.defineProperty(z.prototype,\"m_collisionFilterMask\",{get:z.prototype.ly,set:z.prototype.ny});z.prototype.get_m_closestHitFraction=z.prototype.oy=function(){return gg(this.hy)};z.prototype.set_m_closestHitFraction=z.prototype.py=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);hg(c,a)};Object.defineProperty(z.prototype,\"m_closestHitFraction\",{get:z.prototype.oy,set:z.prototype.py});z.prototype.get_m_collisionObject=z.prototype.qy=function(){return k(ig(this.hy),q)};\nz.prototype.set_m_collisionObject=z.prototype.xy=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);jg(c,a)};Object.defineProperty(z.prototype,\"m_collisionObject\",{get:z.prototype.qy,set:z.prototype.xy});z.prototype.__destroy__=function(){kg(this.hy)};function jB(){throw\"cannot construct a btMatrix3x3, no constructor in IDL\";}jB.prototype=Object.create(f.prototype);jB.prototype.constructor=jB;jB.prototype.iy=jB;jB.jy={};b.btMatrix3x3=jB;\njB.prototype.setEulerZYX=function(a,c,d){var e=this.hy;a&&\"object\"===typeof a&&(a=a.hy);c&&\"object\"===typeof c&&(c=c.hy);d&&\"object\"===typeof d&&(d=d.hy);lg(e,a,c,d)};jB.prototype.getRotation=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);mg(c,a)};jB.prototype.getRow=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);return k(ng(c,a),p)};jB.prototype.__destroy__=function(){og(this.hy)};function kB(){throw\"cannot construct a btScalarArray, no constructor in IDL\";}kB.prototype=Object.create(f.prototype);\nkB.prototype.constructor=kB;kB.prototype.iy=kB;kB.jy={};b.btScalarArray=kB;kB.prototype.size=kB.prototype.size=function(){return pg(this.hy)};kB.prototype.at=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);return qg(c,a)};kB.prototype.__destroy__=function(){rg(this.hy)};function A(){throw\"cannot construct a Material, no constructor in IDL\";}A.prototype=Object.create(f.prototype);A.prototype.constructor=A;A.prototype.iy=A;A.jy={};b.Material=A;A.prototype.get_m_kLST=A.prototype.vA=function(){return sg(this.hy)};\nA.prototype.set_m_kLST=A.prototype.bD=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);tg(c,a)};Object.defineProperty(A.prototype,\"m_kLST\",{get:A.prototype.vA,set:A.prototype.bD});A.prototype.get_m_kAST=A.prototype.uA=function(){return ug(this.hy)};A.prototype.set_m_kAST=A.prototype.aD=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);vg(c,a)};Object.defineProperty(A.prototype,\"m_kAST\",{get:A.prototype.uA,set:A.prototype.aD});A.prototype.get_m_kVST=A.prototype.wA=function(){return wg(this.hy)};\nA.prototype.set_m_kVST=A.prototype.cD=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);xg(c,a)};Object.defineProperty(A.prototype,\"m_kVST\",{get:A.prototype.wA,set:A.prototype.cD});A.prototype.get_m_flags=A.prototype.cA=function(){return yg(this.hy)};A.prototype.set_m_flags=A.prototype.JC=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);zg(c,a)};Object.defineProperty(A.prototype,\"m_flags\",{get:A.prototype.cA,set:A.prototype.JC});A.prototype.__destroy__=function(){Ag(this.hy)};\nfunction l(){throw\"cannot construct a btDispatcherInfo, no constructor in IDL\";}l.prototype=Object.create(f.prototype);l.prototype.constructor=l;l.prototype.iy=l;l.jy={};b.btDispatcherInfo=l;l.prototype.get_m_timeStep=l.prototype.jB=function(){return Bg(this.hy)};l.prototype.set_m_timeStep=l.prototype.QD=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Cg(c,a)};Object.defineProperty(l.prototype,\"m_timeStep\",{get:l.prototype.jB,set:l.prototype.QD});\nl.prototype.get_m_stepCount=l.prototype.aB=function(){return Dg(this.hy)};l.prototype.set_m_stepCount=l.prototype.HD=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Eg(c,a)};Object.defineProperty(l.prototype,\"m_stepCount\",{get:l.prototype.aB,set:l.prototype.HD});l.prototype.get_m_dispatchFunc=l.prototype.Wz=function(){return Fg(this.hy)};l.prototype.set_m_dispatchFunc=l.prototype.CC=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Gg(c,a)};\nObject.defineProperty(l.prototype,\"m_dispatchFunc\",{get:l.prototype.Wz,set:l.prototype.CC});l.prototype.get_m_timeOfImpact=l.prototype.iB=function(){return Hg(this.hy)};l.prototype.set_m_timeOfImpact=l.prototype.PD=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Ig(c,a)};Object.defineProperty(l.prototype,\"m_timeOfImpact\",{get:l.prototype.iB,set:l.prototype.PD});l.prototype.get_m_useContinuous=l.prototype.lB=function(){return!!Jg(this.hy)};\nl.prototype.set_m_useContinuous=l.prototype.SD=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Kg(c,a)};Object.defineProperty(l.prototype,\"m_useContinuous\",{get:l.prototype.lB,set:l.prototype.SD});l.prototype.get_m_enableSatConvex=l.prototype.$z=function(){return!!Lg(this.hy)};l.prototype.set_m_enableSatConvex=l.prototype.GC=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Mg(c,a)};Object.defineProperty(l.prototype,\"m_enableSatConvex\",{get:l.prototype.$z,set:l.prototype.GC});\nl.prototype.get_m_enableSPU=l.prototype.Zz=function(){return!!Ng(this.hy)};l.prototype.set_m_enableSPU=l.prototype.FC=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Og(c,a)};Object.defineProperty(l.prototype,\"m_enableSPU\",{get:l.prototype.Zz,set:l.prototype.FC});l.prototype.get_m_useEpa=l.prototype.nB=function(){return!!Pg(this.hy)};l.prototype.set_m_useEpa=l.prototype.UD=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Qg(c,a)};\nObject.defineProperty(l.prototype,\"m_useEpa\",{get:l.prototype.nB,set:l.prototype.UD});l.prototype.get_m_allowedCcdPenetration=l.prototype.zz=function(){return Rg(this.hy)};l.prototype.set_m_allowedCcdPenetration=l.prototype.fC=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Sg(c,a)};Object.defineProperty(l.prototype,\"m_allowedCcdPenetration\",{get:l.prototype.zz,set:l.prototype.fC});l.prototype.get_m_useConvexConservativeDistanceUtil=l.prototype.mB=function(){return!!Tg(this.hy)};\nl.prototype.set_m_useConvexConservativeDistanceUtil=l.prototype.TD=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Ug(c,a)};Object.defineProperty(l.prototype,\"m_useConvexConservativeDistanceUtil\",{get:l.prototype.mB,set:l.prototype.TD});l.prototype.get_m_convexConservativeDistanceThreshold=l.prototype.Rz=function(){return Vg(this.hy)};l.prototype.set_m_convexConservativeDistanceThreshold=l.prototype.xC=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Wg(c,a)};\nObject.defineProperty(l.prototype,\"m_convexConservativeDistanceThreshold\",{get:l.prototype.Rz,set:l.prototype.xC});l.prototype.__destroy__=function(){Xg(this.hy)};function B(){throw\"cannot construct a btWheelInfoConstructionInfo, no constructor in IDL\";}B.prototype=Object.create(f.prototype);B.prototype.constructor=B;B.prototype.iy=B;B.jy={};b.btWheelInfoConstructionInfo=B;B.prototype.get_m_chassisConnectionCS=B.prototype.Lz=function(){return k(Yg(this.hy),p)};\nB.prototype.set_m_chassisConnectionCS=B.prototype.rC=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Zg(c,a)};Object.defineProperty(B.prototype,\"m_chassisConnectionCS\",{get:B.prototype.Lz,set:B.prototype.rC});B.prototype.get_m_wheelDirectionCS=B.prototype.Ly=function(){return k($g(this.hy),p)};B.prototype.set_m_wheelDirectionCS=B.prototype.Uy=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);ah(c,a)};Object.defineProperty(B.prototype,\"m_wheelDirectionCS\",{get:B.prototype.Ly,set:B.prototype.Uy});\nB.prototype.get_m_wheelAxleCS=B.prototype.Ky=function(){return k(bh(this.hy),p)};B.prototype.set_m_wheelAxleCS=B.prototype.Ty=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);ch(c,a)};Object.defineProperty(B.prototype,\"m_wheelAxleCS\",{get:B.prototype.Ky,set:B.prototype.Ty});B.prototype.get_m_suspensionRestLength=B.prototype.fB=function(){return dh(this.hy)};B.prototype.set_m_suspensionRestLength=B.prototype.MD=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);eh(c,a)};\nObject.defineProperty(B.prototype,\"m_suspensionRestLength\",{get:B.prototype.fB,set:B.prototype.MD});B.prototype.get_m_maxSuspensionTravelCm=B.prototype.vy=function(){return fh(this.hy)};B.prototype.set_m_maxSuspensionTravelCm=B.prototype.Cy=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);gh(c,a)};Object.defineProperty(B.prototype,\"m_maxSuspensionTravelCm\",{get:B.prototype.vy,set:B.prototype.Cy});B.prototype.get_m_wheelRadius=B.prototype.tB=function(){return hh(this.hy)};\nB.prototype.set_m_wheelRadius=B.prototype.$D=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);ih(c,a)};Object.defineProperty(B.prototype,\"m_wheelRadius\",{get:B.prototype.tB,set:B.prototype.$D});B.prototype.get_m_suspensionStiffness=B.prototype.wy=function(){return jh(this.hy)};B.prototype.set_m_suspensionStiffness=B.prototype.Dy=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);kh(c,a)};Object.defineProperty(B.prototype,\"m_suspensionStiffness\",{get:B.prototype.wy,set:B.prototype.Dy});\nB.prototype.get_m_wheelsDampingCompression=B.prototype.My=function(){return lh(this.hy)};B.prototype.set_m_wheelsDampingCompression=B.prototype.Vy=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);mh(c,a)};Object.defineProperty(B.prototype,\"m_wheelsDampingCompression\",{get:B.prototype.My,set:B.prototype.Vy});B.prototype.get_m_wheelsDampingRelaxation=B.prototype.Ny=function(){return nh(this.hy)};\nB.prototype.set_m_wheelsDampingRelaxation=B.prototype.Wy=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);oh(c,a)};Object.defineProperty(B.prototype,\"m_wheelsDampingRelaxation\",{get:B.prototype.Ny,set:B.prototype.Wy});B.prototype.get_m_frictionSlip=B.prototype.ry=function(){return ph(this.hy)};B.prototype.set_m_frictionSlip=B.prototype.yy=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);qh(c,a)};Object.defineProperty(B.prototype,\"m_frictionSlip\",{get:B.prototype.ry,set:B.prototype.yy});\nB.prototype.get_m_maxSuspensionForce=B.prototype.uy=function(){return rh(this.hy)};B.prototype.set_m_maxSuspensionForce=B.prototype.By=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);sh(c,a)};Object.defineProperty(B.prototype,\"m_maxSuspensionForce\",{get:B.prototype.uy,set:B.prototype.By});B.prototype.get_m_bIsFrontWheel=B.prototype.Fy=function(){return!!th(this.hy)};B.prototype.set_m_bIsFrontWheel=B.prototype.Oy=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);uh(c,a)};\nObject.defineProperty(B.prototype,\"m_bIsFrontWheel\",{get:B.prototype.Fy,set:B.prototype.Oy});B.prototype.__destroy__=function(){vh(this.hy)};function lB(a,c){a&&\"object\"===typeof a&&(a=a.hy);c&&\"object\"===typeof c&&(c=c.hy);this.hy=void 0===c?wh(a):xh(a,c);h(lB)[this.hy]=this}lB.prototype=Object.create(cB.prototype);lB.prototype.constructor=lB;lB.prototype.iy=lB;lB.jy={};b.btConvexTriangleMeshShape=lB;lB.prototype.setLocalScaling=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);yh(c,a)};\nlB.prototype.getLocalScaling=function(){return k(zh(this.hy),p)};lB.prototype.calculateLocalInertia=function(a,c){var d=this.hy;a&&\"object\"===typeof a&&(a=a.hy);c&&\"object\"===typeof c&&(c=c.hy);Ah(d,a,c)};lB.prototype.setMargin=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Bh(c,a)};lB.prototype.getMargin=function(){return Ch(this.hy)};lB.prototype.__destroy__=function(){Dh(this.hy)};function QA(){throw\"cannot construct a btBroadphaseInterface, no constructor in IDL\";}QA.prototype=Object.create(f.prototype);\nQA.prototype.constructor=QA;QA.prototype.iy=QA;QA.jy={};b.btBroadphaseInterface=QA;QA.prototype.getOverlappingPairCache=function(){return k(Eh(this.hy),PA)};QA.prototype.__destroy__=function(){Fh(this.hy)};function C(a,c,d,e){a&&\"object\"===typeof a&&(a=a.hy);c&&\"object\"===typeof c&&(c=c.hy);d&&\"object\"===typeof d&&(d=d.hy);e&&\"object\"===typeof e&&(e=e.hy);this.hy=void 0===e?Gh(a,c,d):Hh(a,c,d,e);h(C)[this.hy]=this}C.prototype=Object.create(f.prototype);C.prototype.constructor=C;C.prototype.iy=C;\nC.jy={};b.btRigidBodyConstructionInfo=C;C.prototype.get_m_linearDamping=C.prototype.xA=function(){return Ih(this.hy)};C.prototype.set_m_linearDamping=C.prototype.dD=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Jh(c,a)};Object.defineProperty(C.prototype,\"m_linearDamping\",{get:C.prototype.xA,set:C.prototype.dD});C.prototype.get_m_angularDamping=C.prototype.Bz=function(){return Kh(this.hy)};\nC.prototype.set_m_angularDamping=C.prototype.hC=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Lh(c,a)};Object.defineProperty(C.prototype,\"m_angularDamping\",{get:C.prototype.Bz,set:C.prototype.hC});C.prototype.get_m_friction=C.prototype.dA=function(){return Mh(this.hy)};C.prototype.set_m_friction=C.prototype.KC=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Nh(c,a)};Object.defineProperty(C.prototype,\"m_friction\",{get:C.prototype.dA,set:C.prototype.KC});\nC.prototype.get_m_rollingFriction=C.prototype.TA=function(){return Oh(this.hy)};C.prototype.set_m_rollingFriction=C.prototype.zD=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Ph(c,a)};Object.defineProperty(C.prototype,\"m_rollingFriction\",{get:C.prototype.TA,set:C.prototype.zD});C.prototype.get_m_restitution=C.prototype.RA=function(){return Qh(this.hy)};C.prototype.set_m_restitution=C.prototype.xD=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Rh(c,a)};\nObject.defineProperty(C.prototype,\"m_restitution\",{get:C.prototype.RA,set:C.prototype.xD});C.prototype.get_m_linearSleepingThreshold=C.prototype.yA=function(){return Sh(this.hy)};C.prototype.set_m_linearSleepingThreshold=C.prototype.eD=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Th(c,a)};Object.defineProperty(C.prototype,\"m_linearSleepingThreshold\",{get:C.prototype.yA,set:C.prototype.eD});C.prototype.get_m_angularSleepingThreshold=C.prototype.Cz=function(){return Uh(this.hy)};\nC.prototype.set_m_angularSleepingThreshold=C.prototype.iC=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Vh(c,a)};Object.defineProperty(C.prototype,\"m_angularSleepingThreshold\",{get:C.prototype.Cz,set:C.prototype.iC});C.prototype.get_m_additionalDamping=C.prototype.wz=function(){return!!Wh(this.hy)};C.prototype.set_m_additionalDamping=C.prototype.cC=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Xh(c,a)};\nObject.defineProperty(C.prototype,\"m_additionalDamping\",{get:C.prototype.wz,set:C.prototype.cC});C.prototype.get_m_additionalDampingFactor=C.prototype.xz=function(){return Yh(this.hy)};C.prototype.set_m_additionalDampingFactor=C.prototype.dC=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Zh(c,a)};Object.defineProperty(C.prototype,\"m_additionalDampingFactor\",{get:C.prototype.xz,set:C.prototype.dC});C.prototype.get_m_additionalLinearDampingThresholdSqr=C.prototype.yz=function(){return $h(this.hy)};\nC.prototype.set_m_additionalLinearDampingThresholdSqr=C.prototype.eC=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);ai(c,a)};Object.defineProperty(C.prototype,\"m_additionalLinearDampingThresholdSqr\",{get:C.prototype.yz,set:C.prototype.eC});C.prototype.get_m_additionalAngularDampingThresholdSqr=C.prototype.vz=function(){return bi(this.hy)};C.prototype.set_m_additionalAngularDampingThresholdSqr=C.prototype.bC=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);ci(c,a)};\nObject.defineProperty(C.prototype,\"m_additionalAngularDampingThresholdSqr\",{get:C.prototype.vz,set:C.prototype.bC});C.prototype.get_m_additionalAngularDampingFactor=C.prototype.uz=function(){return di(this.hy)};C.prototype.set_m_additionalAngularDampingFactor=C.prototype.aC=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);ei(c,a)};Object.defineProperty(C.prototype,\"m_additionalAngularDampingFactor\",{get:C.prototype.uz,set:C.prototype.aC});C.prototype.__destroy__=function(){fi(this.hy)};\nfunction mB(){throw\"cannot construct a btCollisionConfiguration, no constructor in IDL\";}mB.prototype=Object.create(f.prototype);mB.prototype.constructor=mB;mB.prototype.iy=mB;mB.jy={};b.btCollisionConfiguration=mB;mB.prototype.__destroy__=function(){gi(this.hy)};function dB(){this.hy=hi();h(dB)[this.hy]=this}dB.prototype=Object.create(f.prototype);dB.prototype.constructor=dB;dB.prototype.iy=dB;dB.jy={};b.btPersistentManifold=dB;dB.prototype.getBody0=function(){return k(ii(this.hy),q)};\ndB.prototype.getBody1=function(){return k(ji(this.hy),q)};dB.prototype.getNumContacts=function(){return ki(this.hy)};dB.prototype.getContactPoint=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);return k(li(c,a),D)};dB.prototype.__destroy__=function(){mi(this.hy)};function nB(a){a&&\"object\"===typeof a&&(a=a.hy);this.hy=void 0===a?ni():oi(a);h(nB)[this.hy]=this}nB.prototype=Object.create(m.prototype);nB.prototype.constructor=nB;nB.prototype.iy=nB;nB.jy={};b.btCompoundShape=nB;\nnB.prototype.addChildShape=function(a,c){var d=this.hy;a&&\"object\"===typeof a&&(a=a.hy);c&&\"object\"===typeof c&&(c=c.hy);pi(d,a,c)};nB.prototype.removeChildShape=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);qi(c,a)};nB.prototype.removeChildShapeByIndex=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);ri(c,a)};nB.prototype.getNumChildShapes=function(){return si(this.hy)};nB.prototype.getChildShape=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);return k(ti(c,a),m)};\nnB.prototype.updateChildTransform=function(a,c,d){var e=this.hy;a&&\"object\"===typeof a&&(a=a.hy);c&&\"object\"===typeof c&&(c=c.hy);d&&\"object\"===typeof d&&(d=d.hy);void 0===d?ui(e,a,c):vi(e,a,c,d)};nB.prototype.setMargin=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);wi(c,a)};nB.prototype.getMargin=function(){return xi(this.hy)};nB.prototype.setLocalScaling=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);yi(c,a)};nB.prototype.getLocalScaling=function(){return k(zi(this.hy),p)};\nnB.prototype.calculateLocalInertia=function(a,c){var d=this.hy;a&&\"object\"===typeof a&&(a=a.hy);c&&\"object\"===typeof c&&(c=c.hy);Ai(d,a,c)};nB.prototype.__destroy__=function(){Bi(this.hy)};function E(a,c){a&&\"object\"===typeof a&&(a=a.hy);c&&\"object\"===typeof c&&(c=c.hy);this.hy=Ci(a,c);h(E)[this.hy]=this}E.prototype=Object.create(y.prototype);E.prototype.constructor=E;E.prototype.iy=E;E.jy={};b.ClosestConvexResultCallback=E;E.prototype.hasHit=function(){return!!Di(this.hy)};\nE.prototype.get_m_convexFromWorld=E.prototype.Sz=function(){return k(Ei(this.hy),p)};E.prototype.set_m_convexFromWorld=E.prototype.yC=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Fi(c,a)};Object.defineProperty(E.prototype,\"m_convexFromWorld\",{get:E.prototype.Sz,set:E.prototype.yC});E.prototype.get_m_convexToWorld=E.prototype.Tz=function(){return k(Gi(this.hy),p)};E.prototype.set_m_convexToWorld=E.prototype.zC=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Hi(c,a)};\nObject.defineProperty(E.prototype,\"m_convexToWorld\",{get:E.prototype.Tz,set:E.prototype.zC});E.prototype.get_m_hitNormalWorld=E.prototype.sy=function(){return k(Ii(this.hy),p)};E.prototype.set_m_hitNormalWorld=E.prototype.zy=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Ji(c,a)};Object.defineProperty(E.prototype,\"m_hitNormalWorld\",{get:E.prototype.sy,set:E.prototype.zy});E.prototype.get_m_hitPointWorld=E.prototype.ty=function(){return k(Ki(this.hy),p)};\nE.prototype.set_m_hitPointWorld=E.prototype.Ay=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Li(c,a)};Object.defineProperty(E.prototype,\"m_hitPointWorld\",{get:E.prototype.ty,set:E.prototype.Ay});E.prototype.get_m_collisionFilterGroup=E.prototype.ky=function(){return Mi(this.hy)};E.prototype.set_m_collisionFilterGroup=E.prototype.my=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Ni(c,a)};Object.defineProperty(E.prototype,\"m_collisionFilterGroup\",{get:E.prototype.ky,set:E.prototype.my});\nE.prototype.get_m_collisionFilterMask=E.prototype.ly=function(){return Oi(this.hy)};E.prototype.set_m_collisionFilterMask=E.prototype.ny=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Pi(c,a)};Object.defineProperty(E.prototype,\"m_collisionFilterMask\",{get:E.prototype.ly,set:E.prototype.ny});E.prototype.get_m_closestHitFraction=E.prototype.oy=function(){return Qi(this.hy)};\nE.prototype.set_m_closestHitFraction=E.prototype.py=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Ri(c,a)};Object.defineProperty(E.prototype,\"m_closestHitFraction\",{get:E.prototype.oy,set:E.prototype.py});E.prototype.__destroy__=function(){Si(this.hy)};function G(a,c){a&&\"object\"===typeof a&&(a=a.hy);c&&\"object\"===typeof c&&(c=c.hy);this.hy=Ti(a,c);h(G)[this.hy]=this}G.prototype=Object.create(z.prototype);G.prototype.constructor=G;G.prototype.iy=G;G.jy={};b.AllHitsRayResultCallback=G;\nG.prototype.hasHit=function(){return!!Ui(this.hy)};G.prototype.get_m_collisionObjects=G.prototype.Oz=function(){return k(Vi(this.hy),oB)};G.prototype.set_m_collisionObjects=G.prototype.uC=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Wi(c,a)};Object.defineProperty(G.prototype,\"m_collisionObjects\",{get:G.prototype.Oz,set:G.prototype.uC});G.prototype.get_m_rayFromWorld=G.prototype.Iy=function(){return k(Xi(this.hy),p)};\nG.prototype.set_m_rayFromWorld=G.prototype.Ry=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Yi(c,a)};Object.defineProperty(G.prototype,\"m_rayFromWorld\",{get:G.prototype.Iy,set:G.prototype.Ry});G.prototype.get_m_rayToWorld=G.prototype.Jy=function(){return k(Zi(this.hy),p)};G.prototype.set_m_rayToWorld=G.prototype.Sy=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);$i(c,a)};Object.defineProperty(G.prototype,\"m_rayToWorld\",{get:G.prototype.Jy,set:G.prototype.Sy});\nG.prototype.get_m_hitNormalWorld=G.prototype.sy=function(){return k(aj(this.hy),pB)};G.prototype.set_m_hitNormalWorld=G.prototype.zy=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);bj(c,a)};Object.defineProperty(G.prototype,\"m_hitNormalWorld\",{get:G.prototype.sy,set:G.prototype.zy});G.prototype.get_m_hitPointWorld=G.prototype.ty=function(){return k(cj(this.hy),pB)};G.prototype.set_m_hitPointWorld=G.prototype.Ay=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);dj(c,a)};\nObject.defineProperty(G.prototype,\"m_hitPointWorld\",{get:G.prototype.ty,set:G.prototype.Ay});G.prototype.get_m_hitFractions=G.prototype.kA=function(){return k(ej(this.hy),kB)};G.prototype.set_m_hitFractions=G.prototype.RC=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);fj(c,a)};Object.defineProperty(G.prototype,\"m_hitFractions\",{get:G.prototype.kA,set:G.prototype.RC});G.prototype.get_m_collisionFilterGroup=G.prototype.ky=function(){return gj(this.hy)};\nG.prototype.set_m_collisionFilterGroup=G.prototype.my=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);hj(c,a)};Object.defineProperty(G.prototype,\"m_collisionFilterGroup\",{get:G.prototype.ky,set:G.prototype.my});G.prototype.get_m_collisionFilterMask=G.prototype.ly=function(){return ij(this.hy)};G.prototype.set_m_collisionFilterMask=G.prototype.ny=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);jj(c,a)};\nObject.defineProperty(G.prototype,\"m_collisionFilterMask\",{get:G.prototype.ly,set:G.prototype.ny});G.prototype.get_m_closestHitFraction=G.prototype.oy=function(){return kj(this.hy)};G.prototype.set_m_closestHitFraction=G.prototype.py=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);lj(c,a)};Object.defineProperty(G.prototype,\"m_closestHitFraction\",{get:G.prototype.oy,set:G.prototype.py});G.prototype.get_m_collisionObject=G.prototype.qy=function(){return k(mj(this.hy),q)};\nG.prototype.set_m_collisionObject=G.prototype.xy=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);nj(c,a)};Object.defineProperty(G.prototype,\"m_collisionObject\",{get:G.prototype.qy,set:G.prototype.xy});G.prototype.__destroy__=function(){oj(this.hy)};function qB(){throw\"cannot construct a tMaterialArray, no constructor in IDL\";}qB.prototype=Object.create(f.prototype);qB.prototype.constructor=qB;qB.prototype.iy=qB;qB.jy={};b.tMaterialArray=qB;qB.prototype.size=qB.prototype.size=function(){return pj(this.hy)};\nqB.prototype.at=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);return k(qj(c,a),A)};qB.prototype.__destroy__=function(){rj(this.hy)};function rB(a){a&&\"object\"===typeof a&&(a=a.hy);this.hy=sj(a);h(rB)[this.hy]=this}rB.prototype=Object.create($A.prototype);rB.prototype.constructor=rB;rB.prototype.iy=rB;rB.jy={};b.btDefaultVehicleRaycaster=rB;\nrB.prototype.castRay=function(a,c,d){var e=this.hy;a&&\"object\"===typeof a&&(a=a.hy);c&&\"object\"===typeof c&&(c=c.hy);d&&\"object\"===typeof d&&(d=d.hy);tj(e,a,c,d)};rB.prototype.__destroy__=function(){uj(this.hy)};function sB(){this.hy=vj();h(sB)[this.hy]=this}sB.prototype=Object.create(UA.prototype);sB.prototype.constructor=sB;sB.prototype.iy=sB;sB.jy={};b.btEmptyShape=sB;sB.prototype.setLocalScaling=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);wj(c,a)};\nsB.prototype.getLocalScaling=function(){return k(xj(this.hy),p)};sB.prototype.calculateLocalInertia=function(a,c){var d=this.hy;a&&\"object\"===typeof a&&(a=a.hy);c&&\"object\"===typeof c&&(c=c.hy);yj(d,a,c)};sB.prototype.__destroy__=function(){zj(this.hy)};function H(){this.hy=Aj();h(H)[this.hy]=this}H.prototype=Object.create(f.prototype);H.prototype.constructor=H;H.prototype.iy=H;H.jy={};b.btConstraintSetting=H;H.prototype.get_m_tau=H.prototype.hB=function(){return Bj(this.hy)};\nH.prototype.set_m_tau=H.prototype.OD=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Cj(c,a)};Object.defineProperty(H.prototype,\"m_tau\",{get:H.prototype.hB,set:H.prototype.OD});H.prototype.get_m_damping=H.prototype.Uz=function(){return Dj(this.hy)};H.prototype.set_m_damping=H.prototype.AC=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Ej(c,a)};Object.defineProperty(H.prototype,\"m_damping\",{get:H.prototype.Uz,set:H.prototype.AC});\nH.prototype.get_m_impulseClamp=H.prototype.qA=function(){return Fj(this.hy)};H.prototype.set_m_impulseClamp=H.prototype.XC=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Gj(c,a)};Object.defineProperty(H.prototype,\"m_impulseClamp\",{get:H.prototype.qA,set:H.prototype.XC});H.prototype.__destroy__=function(){Hj(this.hy)};function tB(){throw\"cannot construct a LocalShapeInfo, no constructor in IDL\";}tB.prototype=Object.create(f.prototype);tB.prototype.constructor=tB;tB.prototype.iy=tB;\ntB.jy={};b.LocalShapeInfo=tB;tB.prototype.get_m_shapePart=tB.prototype.WA=function(){return Ij(this.hy)};tB.prototype.set_m_shapePart=tB.prototype.CD=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Jj(c,a)};Object.defineProperty(tB.prototype,\"m_shapePart\",{get:tB.prototype.WA,set:tB.prototype.CD});tB.prototype.get_m_triangleIndex=tB.prototype.kB=function(){return Kj(this.hy)};\ntB.prototype.set_m_triangleIndex=tB.prototype.RD=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Lj(c,a)};Object.defineProperty(tB.prototype,\"m_triangleIndex\",{get:tB.prototype.kB,set:tB.prototype.RD});tB.prototype.__destroy__=function(){Mj(this.hy)};function I(a){a&&\"object\"===typeof a&&(a=a.hy);this.hy=Nj(a);h(I)[this.hy]=this}I.prototype=Object.create(q.prototype);I.prototype.constructor=I;I.prototype.iy=I;I.jy={};b.btRigidBody=I;\nI.prototype.getCenterOfMassTransform=function(){return k(Oj(this.hy),r)};I.prototype.setCenterOfMassTransform=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Pj(c,a)};I.prototype.setSleepingThresholds=function(a,c){var d=this.hy;a&&\"object\"===typeof a&&(a=a.hy);c&&\"object\"===typeof c&&(c=c.hy);Qj(d,a,c)};I.prototype.getLinearDamping=function(){return Rj(this.hy)};I.prototype.getAngularDamping=function(){return Sj(this.hy)};\nI.prototype.setDamping=function(a,c){var d=this.hy;a&&\"object\"===typeof a&&(a=a.hy);c&&\"object\"===typeof c&&(c=c.hy);Tj(d,a,c)};I.prototype.setMassProps=function(a,c){var d=this.hy;a&&\"object\"===typeof a&&(a=a.hy);c&&\"object\"===typeof c&&(c=c.hy);Uj(d,a,c)};I.prototype.getLinearFactor=function(){return k(Vj(this.hy),p)};I.prototype.setLinearFactor=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Wj(c,a)};\nI.prototype.applyTorque=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Xj(c,a)};I.prototype.applyLocalTorque=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Yj(c,a)};I.prototype.applyForce=function(a,c){var d=this.hy;a&&\"object\"===typeof a&&(a=a.hy);c&&\"object\"===typeof c&&(c=c.hy);Zj(d,a,c)};I.prototype.applyCentralForce=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);ak(c,a)};\nI.prototype.applyCentralLocalForce=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);bk(c,a)};I.prototype.applyTorqueImpulse=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);ck(c,a)};I.prototype.applyImpulse=function(a,c){var d=this.hy;a&&\"object\"===typeof a&&(a=a.hy);c&&\"object\"===typeof c&&(c=c.hy);dk(d,a,c)};I.prototype.applyCentralImpulse=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);ek(c,a)};I.prototype.updateInertiaTensor=function(){fk(this.hy)};\nI.prototype.getLinearVelocity=function(){return k(gk(this.hy),p)};I.prototype.getAngularVelocity=function(){return k(hk(this.hy),p)};I.prototype.setLinearVelocity=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);ik(c,a)};I.prototype.setAngularVelocity=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);jk(c,a)};I.prototype.getMotionState=function(){return k(kk(this.hy),gB)};I.prototype.setMotionState=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);lk(c,a)};\nI.prototype.getAngularFactor=function(){return k(mk(this.hy),p)};I.prototype.setAngularFactor=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);nk(c,a)};I.prototype.upcast=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);return k(ok(c,a),I)};I.prototype.getAabb=function(a,c){var d=this.hy;a&&\"object\"===typeof a&&(a=a.hy);c&&\"object\"===typeof c&&(c=c.hy);pk(d,a,c)};I.prototype.applyGravity=function(){qk(this.hy)};I.prototype.getGravity=function(){return k(rk(this.hy),p)};\nI.prototype.setGravity=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);sk(c,a)};I.prototype.getBroadphaseProxy=function(){return k(tk(this.hy),t)};I.prototype.clearForces=function(){uk(this.hy)};I.prototype.setAnisotropicFriction=function(a,c){var d=this.hy;a&&\"object\"===typeof a&&(a=a.hy);c&&\"object\"===typeof c&&(c=c.hy);vk(d,a,c)};I.prototype.getCollisionShape=function(){return k(wk(this.hy),m)};\nI.prototype.setContactProcessingThreshold=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);xk(c,a)};I.prototype.setActivationState=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);yk(c,a)};I.prototype.forceActivationState=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);zk(c,a)};I.prototype.activate=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);void 0===a?Ak(c):Bk(c,a)};I.prototype.isActive=function(){return!!Ck(this.hy)};I.prototype.isKinematicObject=function(){return!!Dk(this.hy)};\nI.prototype.isStaticObject=function(){return!!Ek(this.hy)};I.prototype.isStaticOrKinematicObject=function(){return!!Fk(this.hy)};I.prototype.getRestitution=function(){return Gk(this.hy)};I.prototype.getFriction=function(){return Hk(this.hy)};I.prototype.getRollingFriction=function(){return Ik(this.hy)};I.prototype.setRestitution=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Jk(c,a)};I.prototype.setFriction=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Kk(c,a)};\nI.prototype.setRollingFriction=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Lk(c,a)};I.prototype.getWorldTransform=function(){return k(Mk(this.hy),r)};I.prototype.getCollisionFlags=function(){return Nk(this.hy)};I.prototype.setCollisionFlags=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Ok(c,a)};I.prototype.setWorldTransform=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Pk(c,a)};\nI.prototype.setCollisionShape=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Qk(c,a)};I.prototype.setCcdMotionThreshold=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Rk(c,a)};I.prototype.setCcdSweptSphereRadius=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Sk(c,a)};I.prototype.getUserIndex=function(){return Tk(this.hy)};I.prototype.setUserIndex=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Uk(c,a)};\nI.prototype.getUserPointer=function(){return k(Vk(this.hy),SA)};I.prototype.setUserPointer=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Wk(c,a)};I.prototype.getBroadphaseHandle=function(){return k(Xk(this.hy),t)};I.prototype.__destroy__=function(){Yk(this.hy)};function uB(){throw\"cannot construct a btIndexedMeshArray, no constructor in IDL\";}uB.prototype=Object.create(f.prototype);uB.prototype.constructor=uB;uB.prototype.iy=uB;uB.jy={};b.btIndexedMeshArray=uB;\nuB.prototype.size=uB.prototype.size=function(){return Zk(this.hy)};uB.prototype.at=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);return k($k(c,a),vB)};uB.prototype.__destroy__=function(){al(this.hy)};function wB(){this.hy=bl();h(wB)[this.hy]=this}wB.prototype=Object.create(f.prototype);wB.prototype.constructor=wB;wB.prototype.iy=wB;wB.jy={};b.btDbvtBroadphase=wB;wB.prototype.__destroy__=function(){cl(this.hy)};\nfunction xB(a,c,d,e,g,n,F,aa,ta){a&&\"object\"===typeof a&&(a=a.hy);c&&\"object\"===typeof c&&(c=c.hy);d&&\"object\"===typeof d&&(d=d.hy);e&&\"object\"===typeof e&&(e=e.hy);g&&\"object\"===typeof g&&(g=g.hy);n&&\"object\"===typeof n&&(n=n.hy);F&&\"object\"===typeof F&&(F=F.hy);aa&&\"object\"===typeof aa&&(aa=aa.hy);ta&&\"object\"===typeof ta&&(ta=ta.hy);this.hy=dl(a,c,d,e,g,n,F,aa,ta);h(xB)[this.hy]=this}xB.prototype=Object.create(UA.prototype);xB.prototype.constructor=xB;xB.prototype.iy=xB;xB.jy={};\nb.btHeightfieldTerrainShape=xB;xB.prototype.setMargin=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);el(c,a)};xB.prototype.getMargin=function(){return fl(this.hy)};xB.prototype.setLocalScaling=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);gl(c,a)};xB.prototype.getLocalScaling=function(){return k(hl(this.hy),p)};xB.prototype.calculateLocalInertia=function(a,c){var d=this.hy;a&&\"object\"===typeof a&&(a=a.hy);c&&\"object\"===typeof c&&(c=c.hy);il(d,a,c)};\nxB.prototype.__destroy__=function(){jl(this.hy)};function yB(){this.hy=kl();h(yB)[this.hy]=this}yB.prototype=Object.create(iB.prototype);yB.prototype.constructor=yB;yB.prototype.iy=yB;yB.jy={};b.btDefaultSoftBodySolver=yB;yB.prototype.__destroy__=function(){ll(this.hy)};function zB(a){a&&\"object\"===typeof a&&(a=a.hy);this.hy=ml(a);h(zB)[this.hy]=this}zB.prototype=Object.create(OA.prototype);zB.prototype.constructor=zB;zB.prototype.iy=zB;zB.jy={};b.btCollisionDispatcher=zB;\nzB.prototype.getNumManifolds=function(){return nl(this.hy)};zB.prototype.getManifoldByIndexInternal=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);return k(ol(c,a),dB)};zB.prototype.__destroy__=function(){pl(this.hy)};\nfunction AB(a,c,d,e,g){a&&\"object\"===typeof a&&(a=a.hy);c&&\"object\"===typeof c&&(c=c.hy);d&&\"object\"===typeof d&&(d=d.hy);e&&\"object\"===typeof e&&(e=e.hy);g&&\"object\"===typeof g&&(g=g.hy);this.hy=void 0===d?ql(a,c):void 0===e?rl(a,c,d):void 0===g?sl(a,c,d,e):tl(a,c,d,e,g);h(AB)[this.hy]=this}AB.prototype=Object.create(f.prototype);AB.prototype.constructor=AB;AB.prototype.iy=AB;AB.jy={};b.btAxisSweep3=AB;AB.prototype.__destroy__=function(){ul(this.hy)};\nfunction SA(){throw\"cannot construct a VoidPtr, no constructor in IDL\";}SA.prototype=Object.create(f.prototype);SA.prototype.constructor=SA;SA.prototype.iy=SA;SA.jy={};b.VoidPtr=SA;SA.prototype.__destroy__=function(){vl(this.hy)};function J(){this.hy=wl();h(J)[this.hy]=this}J.prototype=Object.create(f.prototype);J.prototype.constructor=J;J.prototype.iy=J;J.jy={};b.btSoftBodyWorldInfo=J;J.prototype.get_air_density=J.prototype.Yy=function(){return xl(this.hy)};\nJ.prototype.set_air_density=J.prototype.FB=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);yl(c,a)};Object.defineProperty(J.prototype,\"air_density\",{get:J.prototype.Yy,set:J.prototype.FB});J.prototype.get_water_density=J.prototype.CB=function(){return zl(this.hy)};J.prototype.set_water_density=J.prototype.iE=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Al(c,a)};Object.defineProperty(J.prototype,\"water_density\",{get:J.prototype.CB,set:J.prototype.iE});\nJ.prototype.get_water_offset=J.prototype.EB=function(){return Bl(this.hy)};J.prototype.set_water_offset=J.prototype.kE=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Cl(c,a)};Object.defineProperty(J.prototype,\"water_offset\",{get:J.prototype.EB,set:J.prototype.kE});J.prototype.get_m_maxDisplacement=J.prototype.EA=function(){return Dl(this.hy)};J.prototype.set_m_maxDisplacement=J.prototype.kD=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);El(c,a)};\nObject.defineProperty(J.prototype,\"m_maxDisplacement\",{get:J.prototype.EA,set:J.prototype.kD});J.prototype.get_water_normal=J.prototype.DB=function(){return k(Fl(this.hy),p)};J.prototype.set_water_normal=J.prototype.jE=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Gl(c,a)};Object.defineProperty(J.prototype,\"water_normal\",{get:J.prototype.DB,set:J.prototype.jE});J.prototype.get_m_broadphase=J.prototype.Gz=function(){return k(Hl(this.hy),QA)};\nJ.prototype.set_m_broadphase=J.prototype.mC=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Il(c,a)};Object.defineProperty(J.prototype,\"m_broadphase\",{get:J.prototype.Gz,set:J.prototype.mC});J.prototype.get_m_dispatcher=J.prototype.Xz=function(){return k(Jl(this.hy),OA)};J.prototype.set_m_dispatcher=J.prototype.DC=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Kl(c,a)};Object.defineProperty(J.prototype,\"m_dispatcher\",{get:J.prototype.Xz,set:J.prototype.DC});\nJ.prototype.get_m_gravity=J.prototype.fA=function(){return k(Ll(this.hy),p)};J.prototype.set_m_gravity=J.prototype.MC=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Ml(c,a)};Object.defineProperty(J.prototype,\"m_gravity\",{get:J.prototype.fA,set:J.prototype.MC});J.prototype.__destroy__=function(){Nl(this.hy)};\nfunction BB(a,c,d,e){a&&\"object\"===typeof a&&(a=a.hy);c&&\"object\"===typeof c&&(c=c.hy);d&&\"object\"===typeof d&&(d=d.hy);e&&\"object\"===typeof e&&(e=e.hy);this.hy=void 0===d?Ol(a,c):void 0===e?_emscripten_bind_btConeTwistConstraint_btConeTwistConstraint_3(a,c,d):Pl(a,c,d,e);h(BB)[this.hy]=this}BB.prototype=Object.create(TA.prototype);BB.prototype.constructor=BB;BB.prototype.iy=BB;BB.jy={};b.btConeTwistConstraint=BB;\nBB.prototype.setLimit=function(a,c){var d=this.hy;a&&\"object\"===typeof a&&(a=a.hy);c&&\"object\"===typeof c&&(c=c.hy);Ql(d,a,c)};BB.prototype.setAngularOnly=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Rl(c,a)};BB.prototype.setDamping=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Sl(c,a)};BB.prototype.enableMotor=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Tl(c,a)};\nBB.prototype.setMaxMotorImpulse=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Ul(c,a)};BB.prototype.setMaxMotorImpulseNormalized=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Vl(c,a)};BB.prototype.setMotorTarget=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Wl(c,a)};BB.prototype.setMotorTargetInConstraintSpace=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Xl(c,a)};\nBB.prototype.enableFeedback=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Yl(c,a)};BB.prototype.getBreakingImpulseThreshold=function(){return Zl(this.hy)};BB.prototype.setBreakingImpulseThreshold=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);$l(c,a)};BB.prototype.getParam=function(a,c){var d=this.hy;a&&\"object\"===typeof a&&(a=a.hy);c&&\"object\"===typeof c&&(c=c.hy);return am(d,a,c)};\nBB.prototype.setParam=function(a,c,d){var e=this.hy;a&&\"object\"===typeof a&&(a=a.hy);c&&\"object\"===typeof c&&(c=c.hy);d&&\"object\"===typeof d&&(d=d.hy);bm(e,a,c,d)};BB.prototype.__destroy__=function(){cm(this.hy)};\nfunction CB(a,c,d,e,g,n,F){a&&\"object\"===typeof a&&(a=a.hy);c&&\"object\"===typeof c&&(c=c.hy);d&&\"object\"===typeof d&&(d=d.hy);e&&\"object\"===typeof e&&(e=e.hy);g&&\"object\"===typeof g&&(g=g.hy);n&&\"object\"===typeof n&&(n=n.hy);F&&\"object\"===typeof F&&(F=F.hy);this.hy=void 0===d?dm(a,c):void 0===e?em(a,c,d):void 0===g?fm(a,c,d,e):void 0===n?gm(a,c,d,e,g):void 0===F?hm(a,c,d,e,g,n):im(a,c,d,e,g,n,F);h(CB)[this.hy]=this}CB.prototype=Object.create(TA.prototype);CB.prototype.constructor=CB;\nCB.prototype.iy=CB;CB.jy={};b.btHingeConstraint=CB;CB.prototype.setLimit=function(a,c,d,e,g){var n=this.hy;a&&\"object\"===typeof a&&(a=a.hy);c&&\"object\"===typeof c&&(c=c.hy);d&&\"object\"===typeof d&&(d=d.hy);e&&\"object\"===typeof e&&(e=e.hy);g&&\"object\"===typeof g&&(g=g.hy);void 0===g?jm(n,a,c,d,e):km(n,a,c,d,e,g)};CB.prototype.enableAngularMotor=function(a,c,d){var e=this.hy;a&&\"object\"===typeof a&&(a=a.hy);c&&\"object\"===typeof c&&(c=c.hy);d&&\"object\"===typeof d&&(d=d.hy);lm(e,a,c,d)};\nCB.prototype.setAngularOnly=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);mm(c,a)};CB.prototype.enableMotor=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);nm(c,a)};CB.prototype.setMaxMotorImpulse=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);om(c,a)};CB.prototype.setMotorTarget=function(a,c){var d=this.hy;a&&\"object\"===typeof a&&(a=a.hy);c&&\"object\"===typeof c&&(c=c.hy);pm(d,a,c)};\nCB.prototype.enableFeedback=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);qm(c,a)};CB.prototype.getBreakingImpulseThreshold=function(){return rm(this.hy)};CB.prototype.setBreakingImpulseThreshold=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);sm(c,a)};CB.prototype.getParam=function(a,c){var d=this.hy;a&&\"object\"===typeof a&&(a=a.hy);c&&\"object\"===typeof c&&(c=c.hy);return tm(d,a,c)};\nCB.prototype.setParam=function(a,c,d){var e=this.hy;a&&\"object\"===typeof a&&(a=a.hy);c&&\"object\"===typeof c&&(c=c.hy);d&&\"object\"===typeof d&&(d=d.hy);um(e,a,c,d)};CB.prototype.__destroy__=function(){wm(this.hy)};function DB(a,c){a&&\"object\"===typeof a&&(a=a.hy);c&&\"object\"===typeof c&&(c=c.hy);this.hy=xm(a,c);h(DB)[this.hy]=this}DB.prototype=Object.create(YA.prototype);DB.prototype.constructor=DB;DB.prototype.iy=DB;DB.jy={};b.btConeShapeZ=DB;\nDB.prototype.setLocalScaling=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);ym(c,a)};DB.prototype.getLocalScaling=function(){return k(zm(this.hy),p)};DB.prototype.calculateLocalInertia=function(a,c){var d=this.hy;a&&\"object\"===typeof a&&(a=a.hy);c&&\"object\"===typeof c&&(c=c.hy);Am(d,a,c)};DB.prototype.__destroy__=function(){Bm(this.hy)};function EB(a,c){a&&\"object\"===typeof a&&(a=a.hy);c&&\"object\"===typeof c&&(c=c.hy);this.hy=Cm(a,c);h(EB)[this.hy]=this}EB.prototype=Object.create(YA.prototype);\nEB.prototype.constructor=EB;EB.prototype.iy=EB;EB.jy={};b.btConeShapeX=EB;EB.prototype.setLocalScaling=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Dm(c,a)};EB.prototype.getLocalScaling=function(){return k(Em(this.hy),p)};EB.prototype.calculateLocalInertia=function(a,c){var d=this.hy;a&&\"object\"===typeof a&&(a=a.hy);c&&\"object\"===typeof c&&(c=c.hy);Fm(d,a,c)};EB.prototype.__destroy__=function(){Gm(this.hy)};\nfunction FB(a,c){a&&\"object\"===typeof a&&(a=a.hy);c&&\"object\"===typeof c&&(c=c.hy);this.hy=void 0===a?Hm():void 0===c?Im(a):Jm(a,c);h(FB)[this.hy]=this}FB.prototype=Object.create(fB.prototype);FB.prototype.constructor=FB;FB.prototype.iy=FB;FB.jy={};b.btTriangleMesh=FB;FB.prototype.addTriangle=function(a,c,d,e){var g=this.hy;a&&\"object\"===typeof a&&(a=a.hy);c&&\"object\"===typeof c&&(c=c.hy);d&&\"object\"===typeof d&&(d=d.hy);e&&\"object\"===typeof e&&(e=e.hy);void 0===e?Km(g,a,c,d):Lm(g,a,c,d,e)};\nFB.prototype.findOrAddVertex=function(a,c){var d=this.hy;a&&\"object\"===typeof a&&(a=a.hy);c&&\"object\"===typeof c&&(c=c.hy);return Mm(d,a,c)};FB.prototype.addIndex=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Nm(c,a)};FB.prototype.getIndexedMeshArray=function(){return k(Om(this.hy),uB)};FB.prototype.setScaling=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Pm(c,a)};FB.prototype.__destroy__=function(){Qm(this.hy)};\nfunction GB(a,c){IA();\"object\"==typeof a&&(a=MA(a));c&&\"object\"===typeof c&&(c=c.hy);this.hy=void 0===a?Rm():void 0===c?Sm(a):Tm(a,c);h(GB)[this.hy]=this}GB.prototype=Object.create(m.prototype);GB.prototype.constructor=GB;GB.prototype.iy=GB;GB.jy={};b.btConvexHullShape=GB;GB.prototype.addPoint=function(a,c){var d=this.hy;a&&\"object\"===typeof a&&(a=a.hy);c&&\"object\"===typeof c&&(c=c.hy);void 0===c?Um(d,a):Vm(d,a,c)};\nGB.prototype.setMargin=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Wm(c,a)};GB.prototype.getMargin=function(){return Xm(this.hy)};GB.prototype.getNumVertices=function(){return Ym(this.hy)};GB.prototype.initializePolyhedralFeatures=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);return!!Zm(c,a)};GB.prototype.recalcLocalAabb=function(){$m(this.hy)};GB.prototype.getConvexPolyhedron=function(){return k(an(this.hy),HB)};\nGB.prototype.setLocalScaling=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);bn(c,a)};GB.prototype.getLocalScaling=function(){return k(cn(this.hy),p)};GB.prototype.calculateLocalInertia=function(a,c){var d=this.hy;a&&\"object\"===typeof a&&(a=a.hy);c&&\"object\"===typeof c&&(c=c.hy);dn(d,a,c)};GB.prototype.__destroy__=function(){en(this.hy)};function K(){this.hy=fn();h(K)[this.hy]=this}K.prototype=Object.create(f.prototype);K.prototype.constructor=K;K.prototype.iy=K;K.jy={};\nb.btVehicleTuning=K;K.prototype.get_m_suspensionStiffness=K.prototype.wy=function(){return gn(this.hy)};K.prototype.set_m_suspensionStiffness=K.prototype.Dy=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);hn(c,a)};Object.defineProperty(K.prototype,\"m_suspensionStiffness\",{get:K.prototype.wy,set:K.prototype.Dy});K.prototype.get_m_suspensionCompression=K.prototype.bB=function(){return jn(this.hy)};\nK.prototype.set_m_suspensionCompression=K.prototype.ID=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);kn(c,a)};Object.defineProperty(K.prototype,\"m_suspensionCompression\",{get:K.prototype.bB,set:K.prototype.ID});K.prototype.get_m_suspensionDamping=K.prototype.cB=function(){return ln(this.hy)};K.prototype.set_m_suspensionDamping=K.prototype.JD=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);mn(c,a)};\nObject.defineProperty(K.prototype,\"m_suspensionDamping\",{get:K.prototype.cB,set:K.prototype.JD});K.prototype.get_m_maxSuspensionTravelCm=K.prototype.vy=function(){return nn(this.hy)};K.prototype.set_m_maxSuspensionTravelCm=K.prototype.Cy=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);on(c,a)};Object.defineProperty(K.prototype,\"m_maxSuspensionTravelCm\",{get:K.prototype.vy,set:K.prototype.Cy});K.prototype.get_m_frictionSlip=K.prototype.ry=function(){return pn(this.hy)};\nK.prototype.set_m_frictionSlip=K.prototype.yy=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);qn(c,a)};Object.defineProperty(K.prototype,\"m_frictionSlip\",{get:K.prototype.ry,set:K.prototype.yy});K.prototype.get_m_maxSuspensionForce=K.prototype.uy=function(){return rn(this.hy)};K.prototype.set_m_maxSuspensionForce=K.prototype.By=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);sn(c,a)};Object.defineProperty(K.prototype,\"m_maxSuspensionForce\",{get:K.prototype.uy,set:K.prototype.By});\nfunction IB(){throw\"cannot construct a btCollisionObjectWrapper, no constructor in IDL\";}IB.prototype=Object.create(f.prototype);IB.prototype.constructor=IB;IB.prototype.iy=IB;IB.jy={};b.btCollisionObjectWrapper=IB;IB.prototype.getWorldTransform=function(){return k(tn(this.hy),r)};IB.prototype.getCollisionObject=function(){return k(un(this.hy),q)};IB.prototype.getCollisionShape=function(){return k(vn(this.hy),m)};function JB(a){a&&\"object\"===typeof a&&(a=a.hy);this.hy=wn(a);h(JB)[this.hy]=this}\nJB.prototype=Object.create(f.prototype);JB.prototype.constructor=JB;JB.prototype.iy=JB;JB.jy={};b.btShapeHull=JB;JB.prototype.buildHull=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);return!!xn(c,a)};JB.prototype.numVertices=function(){return yn(this.hy)};JB.prototype.getVertexPointer=function(){return k(zn(this.hy),p)};JB.prototype.__destroy__=function(){An(this.hy)};\nfunction KB(a,c){a&&\"object\"===typeof a&&(a=a.hy);c&&\"object\"===typeof c&&(c=c.hy);this.hy=void 0===a?Bn():void 0===c?Cn(a):Dn(a,c);h(KB)[this.hy]=this}KB.prototype=Object.create(gB.prototype);KB.prototype.constructor=KB;KB.prototype.iy=KB;KB.jy={};b.btDefaultMotionState=KB;KB.prototype.getWorldTransform=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);En(c,a)};KB.prototype.setWorldTransform=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Fn(c,a)};\nKB.prototype.get_m_graphicsWorldTrans=KB.prototype.eA=function(){return k(Gn(this.hy),r)};KB.prototype.set_m_graphicsWorldTrans=KB.prototype.LC=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Hn(c,a)};Object.defineProperty(KB.prototype,\"m_graphicsWorldTrans\",{get:KB.prototype.eA,set:KB.prototype.LC});KB.prototype.__destroy__=function(){In(this.hy)};function L(a){a&&\"object\"===typeof a&&(a=a.hy);this.hy=Jn(a);h(L)[this.hy]=this}L.prototype=Object.create(f.prototype);\nL.prototype.constructor=L;L.prototype.iy=L;L.jy={};b.btWheelInfo=L;L.prototype.getSuspensionRestLength=function(){return Kn(this.hy)};L.prototype.updateWheel=function(a,c){var d=this.hy;a&&\"object\"===typeof a&&(a=a.hy);c&&\"object\"===typeof c&&(c=c.hy);Ln(d,a,c)};L.prototype.get_m_suspensionStiffness=L.prototype.wy=function(){return Mn(this.hy)};L.prototype.set_m_suspensionStiffness=L.prototype.Dy=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Nn(c,a)};\nObject.defineProperty(L.prototype,\"m_suspensionStiffness\",{get:L.prototype.wy,set:L.prototype.Dy});L.prototype.get_m_frictionSlip=L.prototype.ry=function(){return On(this.hy)};L.prototype.set_m_frictionSlip=L.prototype.yy=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Pn(c,a)};Object.defineProperty(L.prototype,\"m_frictionSlip\",{get:L.prototype.ry,set:L.prototype.yy});L.prototype.get_m_engineForce=L.prototype.aA=function(){return Qn(this.hy)};\nL.prototype.set_m_engineForce=L.prototype.HC=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Rn(c,a)};Object.defineProperty(L.prototype,\"m_engineForce\",{get:L.prototype.aA,set:L.prototype.HC});L.prototype.get_m_rollInfluence=L.prototype.SA=function(){return Sn(this.hy)};L.prototype.set_m_rollInfluence=L.prototype.yD=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Tn(c,a)};Object.defineProperty(L.prototype,\"m_rollInfluence\",{get:L.prototype.SA,set:L.prototype.yD});\nL.prototype.get_m_suspensionRestLength1=L.prototype.gB=function(){return Un(this.hy)};L.prototype.set_m_suspensionRestLength1=L.prototype.ND=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Vn(c,a)};Object.defineProperty(L.prototype,\"m_suspensionRestLength1\",{get:L.prototype.gB,set:L.prototype.ND});L.prototype.get_m_wheelsRadius=L.prototype.uB=function(){return Wn(this.hy)};L.prototype.set_m_wheelsRadius=L.prototype.aE=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Xn(c,a)};\nObject.defineProperty(L.prototype,\"m_wheelsRadius\",{get:L.prototype.uB,set:L.prototype.aE});L.prototype.get_m_wheelsDampingCompression=L.prototype.My=function(){return Yn(this.hy)};L.prototype.set_m_wheelsDampingCompression=L.prototype.Vy=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Zn(c,a)};Object.defineProperty(L.prototype,\"m_wheelsDampingCompression\",{get:L.prototype.My,set:L.prototype.Vy});L.prototype.get_m_wheelsDampingRelaxation=L.prototype.Ny=function(){return $n(this.hy)};\nL.prototype.set_m_wheelsDampingRelaxation=L.prototype.Wy=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);ao(c,a)};Object.defineProperty(L.prototype,\"m_wheelsDampingRelaxation\",{get:L.prototype.Ny,set:L.prototype.Wy});L.prototype.get_m_steering=L.prototype.$A=function(){return bo(this.hy)};L.prototype.set_m_steering=L.prototype.GD=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);co(c,a)};Object.defineProperty(L.prototype,\"m_steering\",{get:L.prototype.$A,set:L.prototype.GD});\nL.prototype.get_m_maxSuspensionForce=L.prototype.uy=function(){return eo(this.hy)};L.prototype.set_m_maxSuspensionForce=L.prototype.By=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);fo(c,a)};Object.defineProperty(L.prototype,\"m_maxSuspensionForce\",{get:L.prototype.uy,set:L.prototype.By});L.prototype.get_m_maxSuspensionTravelCm=L.prototype.vy=function(){return go(this.hy)};\nL.prototype.set_m_maxSuspensionTravelCm=L.prototype.Cy=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);ho(c,a)};Object.defineProperty(L.prototype,\"m_maxSuspensionTravelCm\",{get:L.prototype.vy,set:L.prototype.Cy});L.prototype.get_m_wheelsSuspensionForce=L.prototype.vB=function(){return io(this.hy)};L.prototype.set_m_wheelsSuspensionForce=L.prototype.bE=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);jo(c,a)};\nObject.defineProperty(L.prototype,\"m_wheelsSuspensionForce\",{get:L.prototype.vB,set:L.prototype.bE});L.prototype.get_m_bIsFrontWheel=L.prototype.Fy=function(){return!!ko(this.hy)};L.prototype.set_m_bIsFrontWheel=L.prototype.Oy=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);lo(c,a)};Object.defineProperty(L.prototype,\"m_bIsFrontWheel\",{get:L.prototype.Fy,set:L.prototype.Oy});L.prototype.get_m_raycastInfo=L.prototype.QA=function(){return k(mo(this.hy),M)};\nL.prototype.set_m_raycastInfo=L.prototype.wD=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);no(c,a)};Object.defineProperty(L.prototype,\"m_raycastInfo\",{get:L.prototype.QA,set:L.prototype.wD});L.prototype.get_m_chassisConnectionPointCS=L.prototype.Mz=function(){return k(oo(this.hy),p)};L.prototype.set_m_chassisConnectionPointCS=L.prototype.sC=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);po(c,a)};\nObject.defineProperty(L.prototype,\"m_chassisConnectionPointCS\",{get:L.prototype.Mz,set:L.prototype.sC});L.prototype.get_m_worldTransform=L.prototype.wB=function(){return k(qo(this.hy),r)};L.prototype.set_m_worldTransform=L.prototype.cE=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);ro(c,a)};Object.defineProperty(L.prototype,\"m_worldTransform\",{get:L.prototype.wB,set:L.prototype.cE});L.prototype.get_m_wheelDirectionCS=L.prototype.Ly=function(){return k(so(this.hy),p)};\nL.prototype.set_m_wheelDirectionCS=L.prototype.Uy=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);to(c,a)};Object.defineProperty(L.prototype,\"m_wheelDirectionCS\",{get:L.prototype.Ly,set:L.prototype.Uy});L.prototype.get_m_wheelAxleCS=L.prototype.Ky=function(){return k(uo(this.hy),p)};L.prototype.set_m_wheelAxleCS=L.prototype.Ty=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);vo(c,a)};Object.defineProperty(L.prototype,\"m_wheelAxleCS\",{get:L.prototype.Ky,set:L.prototype.Ty});\nL.prototype.get_m_rotation=L.prototype.UA=function(){return wo(this.hy)};L.prototype.set_m_rotation=L.prototype.AD=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);xo(c,a)};Object.defineProperty(L.prototype,\"m_rotation\",{get:L.prototype.UA,set:L.prototype.AD});L.prototype.get_m_deltaRotation=L.prototype.Vz=function(){return yo(this.hy)};L.prototype.set_m_deltaRotation=L.prototype.BC=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);zo(c,a)};\nObject.defineProperty(L.prototype,\"m_deltaRotation\",{get:L.prototype.Vz,set:L.prototype.BC});L.prototype.get_m_brake=L.prototype.Fz=function(){return Ao(this.hy)};L.prototype.set_m_brake=L.prototype.lC=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Bo(c,a)};Object.defineProperty(L.prototype,\"m_brake\",{get:L.prototype.Fz,set:L.prototype.lC});L.prototype.get_m_clippedInvContactDotSuspension=L.prototype.Nz=function(){return Co(this.hy)};\nL.prototype.set_m_clippedInvContactDotSuspension=L.prototype.tC=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Do(c,a)};Object.defineProperty(L.prototype,\"m_clippedInvContactDotSuspension\",{get:L.prototype.Nz,set:L.prototype.tC});L.prototype.get_m_suspensionRelativeVelocity=L.prototype.eB=function(){return Eo(this.hy)};L.prototype.set_m_suspensionRelativeVelocity=L.prototype.LD=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Fo(c,a)};\nObject.defineProperty(L.prototype,\"m_suspensionRelativeVelocity\",{get:L.prototype.eB,set:L.prototype.LD});L.prototype.get_m_skidInfo=L.prototype.XA=function(){return Go(this.hy)};L.prototype.set_m_skidInfo=L.prototype.DD=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Ho(c,a)};Object.defineProperty(L.prototype,\"m_skidInfo\",{get:L.prototype.XA,set:L.prototype.DD});L.prototype.__destroy__=function(){Io(this.hy)};\nfunction N(a,c,d,e){a&&\"object\"===typeof a&&(a=a.hy);c&&\"object\"===typeof c&&(c=c.hy);d&&\"object\"===typeof d&&(d=d.hy);e&&\"object\"===typeof e&&(e=e.hy);this.hy=void 0===a?Jo():void 0===c?_emscripten_bind_btVector4_btVector4_1(a):void 0===d?_emscripten_bind_btVector4_btVector4_2(a,c):void 0===e?_emscripten_bind_btVector4_btVector4_3(a,c,d):Ko(a,c,d,e);h(N)[this.hy]=this}N.prototype=Object.create(p.prototype);N.prototype.constructor=N;N.prototype.iy=N;N.jy={};b.btVector4=N;N.prototype.w=function(){return Lo(this.hy)};\nN.prototype.setValue=function(a,c,d,e){var g=this.hy;a&&\"object\"===typeof a&&(a=a.hy);c&&\"object\"===typeof c&&(c=c.hy);d&&\"object\"===typeof d&&(d=d.hy);e&&\"object\"===typeof e&&(e=e.hy);Mo(g,a,c,d,e)};N.prototype.length=N.prototype.length=function(){return No(this.hy)};N.prototype.x=N.prototype.x=function(){return Oo(this.hy)};N.prototype.y=N.prototype.y=function(){return Po(this.hy)};N.prototype.z=N.prototype.z=function(){return Qo(this.hy)};\nN.prototype.setX=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Ro(c,a)};N.prototype.setY=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);So(c,a)};N.prototype.setZ=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);To(c,a)};N.prototype.normalize=N.prototype.normalize=function(){Uo(this.hy)};N.prototype.rotate=N.prototype.rotate=function(a,c){var d=this.hy;a&&\"object\"===typeof a&&(a=a.hy);c&&\"object\"===typeof c&&(c=c.hy);return k(Vo(d,a,c),p)};\nN.prototype.dot=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);return Wo(c,a)};N.prototype.op_mul=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);return k(Xo(c,a),p)};N.prototype.op_add=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);return k(Yo(c,a),p)};N.prototype.op_sub=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);return k(Zo(c,a),p)};N.prototype.__destroy__=function(){$o(this.hy)};function LB(){this.hy=ap();h(LB)[this.hy]=this}LB.prototype=Object.create(f.prototype);\nLB.prototype.constructor=LB;LB.prototype.iy=LB;LB.jy={};b.btDefaultCollisionConstructionInfo=LB;LB.prototype.__destroy__=function(){bp(this.hy)};function O(){throw\"cannot construct a Anchor, no constructor in IDL\";}O.prototype=Object.create(f.prototype);O.prototype.constructor=O;O.prototype.iy=O;O.jy={};b.Anchor=O;O.prototype.get_m_node=O.prototype.FA=function(){return k(cp(this.hy),Node)};O.prototype.set_m_node=O.prototype.lD=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);dp(c,a)};\nObject.defineProperty(O.prototype,\"m_node\",{get:O.prototype.FA,set:O.prototype.lD});O.prototype.get_m_local=O.prototype.zA=function(){return k(ep(this.hy),p)};O.prototype.set_m_local=O.prototype.fD=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);fp(c,a)};Object.defineProperty(O.prototype,\"m_local\",{get:O.prototype.zA,set:O.prototype.fD});O.prototype.get_m_body=O.prototype.Ez=function(){return k(gp(this.hy),I)};\nO.prototype.set_m_body=O.prototype.kC=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);hp(c,a)};Object.defineProperty(O.prototype,\"m_body\",{get:O.prototype.Ez,set:O.prototype.kC});O.prototype.get_m_influence=O.prototype.sA=function(){return ip(this.hy)};O.prototype.set_m_influence=O.prototype.ZC=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);jp(c,a)};Object.defineProperty(O.prototype,\"m_influence\",{get:O.prototype.sA,set:O.prototype.ZC});\nO.prototype.get_m_c0=O.prototype.Hz=function(){return k(kp(this.hy),jB)};O.prototype.set_m_c0=O.prototype.nC=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);lp(c,a)};Object.defineProperty(O.prototype,\"m_c0\",{get:O.prototype.Hz,set:O.prototype.nC});O.prototype.get_m_c1=O.prototype.Iz=function(){return k(mp(this.hy),p)};O.prototype.set_m_c1=O.prototype.oC=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);np(c,a)};Object.defineProperty(O.prototype,\"m_c1\",{get:O.prototype.Iz,set:O.prototype.oC});\nO.prototype.get_m_c2=O.prototype.Jz=function(){return op(this.hy)};O.prototype.set_m_c2=O.prototype.pC=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);pp(c,a)};Object.defineProperty(O.prototype,\"m_c2\",{get:O.prototype.Jz,set:O.prototype.pC});O.prototype.__destroy__=function(){qp(this.hy)};function P(){throw\"cannot construct a btVehicleRaycasterResult, no constructor in IDL\";}P.prototype=Object.create(f.prototype);P.prototype.constructor=P;P.prototype.iy=P;P.jy={};\nb.btVehicleRaycasterResult=P;P.prototype.get_m_hitPointInWorld=P.prototype.nA=function(){return k(rp(this.hy),p)};P.prototype.set_m_hitPointInWorld=P.prototype.UC=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);sp(c,a)};Object.defineProperty(P.prototype,\"m_hitPointInWorld\",{get:P.prototype.nA,set:P.prototype.UC});P.prototype.get_m_hitNormalInWorld=P.prototype.lA=function(){return k(tp(this.hy),p)};\nP.prototype.set_m_hitNormalInWorld=P.prototype.SC=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);up(c,a)};Object.defineProperty(P.prototype,\"m_hitNormalInWorld\",{get:P.prototype.lA,set:P.prototype.SC});P.prototype.get_m_distFraction=P.prototype.Yz=function(){return vp(this.hy)};P.prototype.set_m_distFraction=P.prototype.EC=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);wp(c,a)};Object.defineProperty(P.prototype,\"m_distFraction\",{get:P.prototype.Yz,set:P.prototype.EC});\nP.prototype.__destroy__=function(){xp(this.hy)};function pB(){throw\"cannot construct a btVector3Array, no constructor in IDL\";}pB.prototype=Object.create(f.prototype);pB.prototype.constructor=pB;pB.prototype.iy=pB;pB.jy={};b.btVector3Array=pB;pB.prototype.size=pB.prototype.size=function(){return yp(this.hy)};pB.prototype.at=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);return k(zp(c,a),p)};pB.prototype.__destroy__=function(){Ap(this.hy)};\nfunction MB(){throw\"cannot construct a btConstraintSolver, no constructor in IDL\";}MB.prototype=Object.create(f.prototype);MB.prototype.constructor=MB;MB.prototype.iy=MB;MB.jy={};b.btConstraintSolver=MB;MB.prototype.__destroy__=function(){Bp(this.hy)};function Q(a,c,d){a&&\"object\"===typeof a&&(a=a.hy);c&&\"object\"===typeof c&&(c=c.hy);d&&\"object\"===typeof d&&(d=d.hy);this.hy=Cp(a,c,d);h(Q)[this.hy]=this}Q.prototype=Object.create(ZA.prototype);Q.prototype.constructor=Q;Q.prototype.iy=Q;Q.jy={};\nb.btRaycastVehicle=Q;Q.prototype.applyEngineForce=function(a,c){var d=this.hy;a&&\"object\"===typeof a&&(a=a.hy);c&&\"object\"===typeof c&&(c=c.hy);Dp(d,a,c)};Q.prototype.setSteeringValue=function(a,c){var d=this.hy;a&&\"object\"===typeof a&&(a=a.hy);c&&\"object\"===typeof c&&(c=c.hy);Ep(d,a,c)};Q.prototype.getWheelTransformWS=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);return k(Fp(c,a),r)};\nQ.prototype.updateWheelTransform=function(a,c){var d=this.hy;a&&\"object\"===typeof a&&(a=a.hy);c&&\"object\"===typeof c&&(c=c.hy);Gp(d,a,c)};Q.prototype.addWheel=function(a,c,d,e,g,n,F){var aa=this.hy;a&&\"object\"===typeof a&&(a=a.hy);c&&\"object\"===typeof c&&(c=c.hy);d&&\"object\"===typeof d&&(d=d.hy);e&&\"object\"===typeof e&&(e=e.hy);g&&\"object\"===typeof g&&(g=g.hy);n&&\"object\"===typeof n&&(n=n.hy);F&&\"object\"===typeof F&&(F=F.hy);return k(Hp(aa,a,c,d,e,g,n,F),L)};Q.prototype.getNumWheels=function(){return Ip(this.hy)};\nQ.prototype.getRigidBody=function(){return k(Jp(this.hy),I)};Q.prototype.getWheelInfo=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);return k(Kp(c,a),L)};Q.prototype.setBrake=function(a,c){var d=this.hy;a&&\"object\"===typeof a&&(a=a.hy);c&&\"object\"===typeof c&&(c=c.hy);Lp(d,a,c)};Q.prototype.setCoordinateSystem=function(a,c,d){var e=this.hy;a&&\"object\"===typeof a&&(a=a.hy);c&&\"object\"===typeof c&&(c=c.hy);d&&\"object\"===typeof d&&(d=d.hy);Mp(e,a,c,d)};Q.prototype.getCurrentSpeedKmHour=function(){return Np(this.hy)};\nQ.prototype.getChassisWorldTransform=function(){return k(Op(this.hy),r)};Q.prototype.rayCast=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);return Pp(c,a)};Q.prototype.updateVehicle=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Qp(c,a)};Q.prototype.resetSuspension=function(){Rp(this.hy)};Q.prototype.getSteeringValue=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);return Sp(c,a)};\nQ.prototype.updateWheelTransformsWS=function(a,c){var d=this.hy;a&&\"object\"===typeof a&&(a=a.hy);c&&\"object\"===typeof c&&(c=c.hy);void 0===c?Tp(d,a):Up(d,a,c)};Q.prototype.setPitchControl=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Vp(c,a)};Q.prototype.updateSuspension=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Wp(c,a)};Q.prototype.updateFriction=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Xp(c,a)};Q.prototype.getRightAxis=function(){return Yp(this.hy)};\nQ.prototype.getUpAxis=function(){return Zp(this.hy)};Q.prototype.getForwardAxis=function(){return $p(this.hy)};Q.prototype.getForwardVector=function(){return k(aq(this.hy),p)};Q.prototype.getUserConstraintType=function(){return bq(this.hy)};Q.prototype.setUserConstraintType=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);cq(c,a)};Q.prototype.setUserConstraintId=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);dq(c,a)};Q.prototype.getUserConstraintId=function(){return eq(this.hy)};\nQ.prototype.updateAction=function(a,c){var d=this.hy;a&&\"object\"===typeof a&&(a=a.hy);c&&\"object\"===typeof c&&(c=c.hy);fq(d,a,c)};Q.prototype.__destroy__=function(){gq(this.hy)};function NB(a){a&&\"object\"===typeof a&&(a=a.hy);this.hy=hq(a);h(NB)[this.hy]=this}NB.prototype=Object.create(bB.prototype);NB.prototype.constructor=NB;NB.prototype.iy=NB;NB.jy={};b.btCylinderShapeX=NB;NB.prototype.setMargin=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);iq(c,a)};NB.prototype.getMargin=function(){return jq(this.hy)};\nNB.prototype.setLocalScaling=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);kq(c,a)};NB.prototype.getLocalScaling=function(){return k(lq(this.hy),p)};NB.prototype.calculateLocalInertia=function(a,c){var d=this.hy;a&&\"object\"===typeof a&&(a=a.hy);c&&\"object\"===typeof c&&(c=c.hy);mq(d,a,c)};NB.prototype.__destroy__=function(){nq(this.hy)};function OB(a){a&&\"object\"===typeof a&&(a=a.hy);this.hy=oq(a);h(OB)[this.hy]=this}OB.prototype=Object.create(bB.prototype);OB.prototype.constructor=OB;\nOB.prototype.iy=OB;OB.jy={};b.btCylinderShapeZ=OB;OB.prototype.setMargin=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);pq(c,a)};OB.prototype.getMargin=function(){return qq(this.hy)};OB.prototype.setLocalScaling=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);rq(c,a)};OB.prototype.getLocalScaling=function(){return k(sq(this.hy),p)};OB.prototype.calculateLocalInertia=function(a,c){var d=this.hy;a&&\"object\"===typeof a&&(a=a.hy);c&&\"object\"===typeof c&&(c=c.hy);tq(d,a,c)};\nOB.prototype.__destroy__=function(){uq(this.hy)};function HB(){throw\"cannot construct a btConvexPolyhedron, no constructor in IDL\";}HB.prototype=Object.create(f.prototype);HB.prototype.constructor=HB;HB.prototype.iy=HB;HB.jy={};b.btConvexPolyhedron=HB;HB.prototype.get_m_vertices=HB.prototype.qB=function(){return k(vq(this.hy),pB)};HB.prototype.set_m_vertices=HB.prototype.XD=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);wq(c,a)};\nObject.defineProperty(HB.prototype,\"m_vertices\",{get:HB.prototype.qB,set:HB.prototype.XD});HB.prototype.get_m_faces=HB.prototype.Gy=function(){return k(xq(this.hy),PB)};HB.prototype.set_m_faces=HB.prototype.Py=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);yq(c,a)};Object.defineProperty(HB.prototype,\"m_faces\",{get:HB.prototype.Gy,set:HB.prototype.Py});HB.prototype.__destroy__=function(){zq(this.hy)};function QB(){this.hy=Aq();h(QB)[this.hy]=this}QB.prototype=Object.create(f.prototype);\nQB.prototype.constructor=QB;QB.prototype.iy=QB;QB.jy={};b.btSequentialImpulseConstraintSolver=QB;QB.prototype.__destroy__=function(){Bq(this.hy)};function RB(){throw\"cannot construct a tAnchorArray, no constructor in IDL\";}RB.prototype=Object.create(f.prototype);RB.prototype.constructor=RB;RB.prototype.iy=RB;RB.jy={};b.tAnchorArray=RB;RB.prototype.size=RB.prototype.size=function(){return Cq(this.hy)};RB.prototype.at=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);return k(Dq(c,a),O)};\nRB.prototype.clear=RB.prototype.clear=function(){Eq(this.hy)};RB.prototype.push_back=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Fq(c,a)};RB.prototype.pop_back=function(){Gq(this.hy)};RB.prototype.__destroy__=function(){Hq(this.hy)};function M(){throw\"cannot construct a RaycastInfo, no constructor in IDL\";}M.prototype=Object.create(f.prototype);M.prototype.constructor=M;M.prototype.iy=M;M.jy={};b.RaycastInfo=M;\nM.prototype.get_m_contactNormalWS=M.prototype.Pz=function(){return k(Iq(this.hy),p)};M.prototype.set_m_contactNormalWS=M.prototype.vC=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Jq(c,a)};Object.defineProperty(M.prototype,\"m_contactNormalWS\",{get:M.prototype.Pz,set:M.prototype.vC});M.prototype.get_m_contactPointWS=M.prototype.Qz=function(){return k(Kq(this.hy),p)};M.prototype.set_m_contactPointWS=M.prototype.wC=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Lq(c,a)};\nObject.defineProperty(M.prototype,\"m_contactPointWS\",{get:M.prototype.Qz,set:M.prototype.wC});M.prototype.get_m_suspensionLength=M.prototype.dB=function(){return Mq(this.hy)};M.prototype.set_m_suspensionLength=M.prototype.KD=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Nq(c,a)};Object.defineProperty(M.prototype,\"m_suspensionLength\",{get:M.prototype.dB,set:M.prototype.KD});M.prototype.get_m_hardPointWS=M.prototype.hA=function(){return k(Oq(this.hy),p)};\nM.prototype.set_m_hardPointWS=M.prototype.OC=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Pq(c,a)};Object.defineProperty(M.prototype,\"m_hardPointWS\",{get:M.prototype.hA,set:M.prototype.OC});M.prototype.get_m_wheelDirectionWS=M.prototype.sB=function(){return k(Qq(this.hy),p)};M.prototype.set_m_wheelDirectionWS=M.prototype.ZD=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Rq(c,a)};Object.defineProperty(M.prototype,\"m_wheelDirectionWS\",{get:M.prototype.sB,set:M.prototype.ZD});\nM.prototype.get_m_wheelAxleWS=M.prototype.rB=function(){return k(Sq(this.hy),p)};M.prototype.set_m_wheelAxleWS=M.prototype.YD=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Tq(c,a)};Object.defineProperty(M.prototype,\"m_wheelAxleWS\",{get:M.prototype.rB,set:M.prototype.YD});M.prototype.get_m_isInContact=M.prototype.tA=function(){return!!Uq(this.hy)};M.prototype.set_m_isInContact=M.prototype.$C=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Vq(c,a)};\nObject.defineProperty(M.prototype,\"m_isInContact\",{get:M.prototype.tA,set:M.prototype.$C});M.prototype.get_m_groundObject=M.prototype.gA=function(){return Wq(this.hy)};M.prototype.set_m_groundObject=M.prototype.NC=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Xq(c,a)};Object.defineProperty(M.prototype,\"m_groundObject\",{get:M.prototype.gA,set:M.prototype.NC});M.prototype.__destroy__=function(){Yq(this.hy)};\nfunction SB(a,c,d){IA();a&&\"object\"===typeof a&&(a=a.hy);\"object\"==typeof c&&(c=MA(c));d&&\"object\"===typeof d&&(d=d.hy);this.hy=Zq(a,c,d);h(SB)[this.hy]=this}SB.prototype=Object.create(m.prototype);SB.prototype.constructor=SB;SB.prototype.iy=SB;SB.jy={};b.btMultiSphereShape=SB;SB.prototype.setLocalScaling=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);$q(c,a)};SB.prototype.getLocalScaling=function(){return k(ar(this.hy),p)};\nSB.prototype.calculateLocalInertia=function(a,c){var d=this.hy;a&&\"object\"===typeof a&&(a=a.hy);c&&\"object\"===typeof c&&(c=c.hy);br(d,a,c)};SB.prototype.__destroy__=function(){cr(this.hy)};function R(a,c,d,e){IA();a&&\"object\"===typeof a&&(a=a.hy);c&&\"object\"===typeof c&&(c=c.hy);d&&\"object\"===typeof d&&(d=d.hy);\"object\"==typeof e&&(e=MA(e));this.hy=dr(a,c,d,e);h(R)[this.hy]=this}R.prototype=Object.create(q.prototype);R.prototype.constructor=R;R.prototype.iy=R;R.jy={};b.btSoftBody=R;\nR.prototype.checkLink=function(a,c){var d=this.hy;a&&\"object\"===typeof a&&(a=a.hy);c&&\"object\"===typeof c&&(c=c.hy);return!!er(d,a,c)};R.prototype.checkFace=function(a,c,d){var e=this.hy;a&&\"object\"===typeof a&&(a=a.hy);c&&\"object\"===typeof c&&(c=c.hy);d&&\"object\"===typeof d&&(d=d.hy);return!!fr(e,a,c,d)};R.prototype.appendMaterial=function(){return k(gr(this.hy),A)};R.prototype.appendNode=function(a,c){var d=this.hy;a&&\"object\"===typeof a&&(a=a.hy);c&&\"object\"===typeof c&&(c=c.hy);hr(d,a,c)};\nR.prototype.appendLink=function(a,c,d,e){var g=this.hy;a&&\"object\"===typeof a&&(a=a.hy);c&&\"object\"===typeof c&&(c=c.hy);d&&\"object\"===typeof d&&(d=d.hy);e&&\"object\"===typeof e&&(e=e.hy);ir(g,a,c,d,e)};R.prototype.appendFace=function(a,c,d,e){var g=this.hy;a&&\"object\"===typeof a&&(a=a.hy);c&&\"object\"===typeof c&&(c=c.hy);d&&\"object\"===typeof d&&(d=d.hy);e&&\"object\"===typeof e&&(e=e.hy);jr(g,a,c,d,e)};\nR.prototype.appendTetra=function(a,c,d,e,g){var n=this.hy;a&&\"object\"===typeof a&&(a=a.hy);c&&\"object\"===typeof c&&(c=c.hy);d&&\"object\"===typeof d&&(d=d.hy);e&&\"object\"===typeof e&&(e=e.hy);g&&\"object\"===typeof g&&(g=g.hy);kr(n,a,c,d,e,g)};R.prototype.appendAnchor=function(a,c,d,e){var g=this.hy;a&&\"object\"===typeof a&&(a=a.hy);c&&\"object\"===typeof c&&(c=c.hy);d&&\"object\"===typeof d&&(d=d.hy);e&&\"object\"===typeof e&&(e=e.hy);lr(g,a,c,d,e)};\nR.prototype.addForce=function(a,c){var d=this.hy;a&&\"object\"===typeof a&&(a=a.hy);c&&\"object\"===typeof c&&(c=c.hy);void 0===c?mr(d,a):nr(d,a,c)};R.prototype.addAeroForceToNode=function(a,c){var d=this.hy;a&&\"object\"===typeof a&&(a=a.hy);c&&\"object\"===typeof c&&(c=c.hy);or(d,a,c)};R.prototype.getTotalMass=function(){return pr(this.hy)};R.prototype.setTotalMass=function(a,c){var d=this.hy;a&&\"object\"===typeof a&&(a=a.hy);c&&\"object\"===typeof c&&(c=c.hy);qr(d,a,c)};\nR.prototype.setMass=function(a,c){var d=this.hy;a&&\"object\"===typeof a&&(a=a.hy);c&&\"object\"===typeof c&&(c=c.hy);rr(d,a,c)};R.prototype.transform=R.prototype.transform=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);sr(c,a)};R.prototype.translate=R.prototype.translate=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);tr(c,a)};R.prototype.rotate=R.prototype.rotate=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);ur(c,a)};\nR.prototype.scale=R.prototype.scale=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);vr(c,a)};R.prototype.generateClusters=function(a,c){var d=this.hy;a&&\"object\"===typeof a&&(a=a.hy);c&&\"object\"===typeof c&&(c=c.hy);return void 0===c?wr(d,a):xr(d,a,c)};R.prototype.generateBendingConstraints=function(a,c){var d=this.hy;a&&\"object\"===typeof a&&(a=a.hy);c&&\"object\"===typeof c&&(c=c.hy);return yr(d,a,c)};\nR.prototype.upcast=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);return k(zr(c,a),R)};R.prototype.setAnisotropicFriction=function(a,c){var d=this.hy;a&&\"object\"===typeof a&&(a=a.hy);c&&\"object\"===typeof c&&(c=c.hy);Ar(d,a,c)};R.prototype.getCollisionShape=function(){return k(Br(this.hy),m)};R.prototype.setContactProcessingThreshold=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Cr(c,a)};\nR.prototype.setActivationState=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Dr(c,a)};R.prototype.forceActivationState=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Er(c,a)};R.prototype.activate=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);void 0===a?Fr(c):Gr(c,a)};R.prototype.isActive=function(){return!!Hr(this.hy)};R.prototype.isKinematicObject=function(){return!!Ir(this.hy)};R.prototype.isStaticObject=function(){return!!Jr(this.hy)};\nR.prototype.isStaticOrKinematicObject=function(){return!!Kr(this.hy)};R.prototype.getRestitution=function(){return Lr(this.hy)};R.prototype.getFriction=function(){return Mr(this.hy)};R.prototype.getRollingFriction=function(){return Nr(this.hy)};R.prototype.setRestitution=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Or(c,a)};R.prototype.setFriction=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Pr(c,a)};\nR.prototype.setRollingFriction=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Qr(c,a)};R.prototype.getWorldTransform=function(){return k(Rr(this.hy),r)};R.prototype.getCollisionFlags=function(){return Sr(this.hy)};R.prototype.setCollisionFlags=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Tr(c,a)};R.prototype.setWorldTransform=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Ur(c,a)};\nR.prototype.setCollisionShape=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Vr(c,a)};R.prototype.setCcdMotionThreshold=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Wr(c,a)};R.prototype.setCcdSweptSphereRadius=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Xr(c,a)};R.prototype.getUserIndex=function(){return Yr(this.hy)};R.prototype.setUserIndex=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Zr(c,a)};\nR.prototype.getUserPointer=function(){return k($r(this.hy),SA)};R.prototype.setUserPointer=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);as(c,a)};R.prototype.getBroadphaseHandle=function(){return k(bs(this.hy),t)};R.prototype.get_m_cfg=R.prototype.Kz=function(){return k(cs(this.hy),S)};R.prototype.set_m_cfg=R.prototype.qC=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);ds(c,a)};Object.defineProperty(R.prototype,\"m_cfg\",{get:R.prototype.Kz,set:R.prototype.qC});\nR.prototype.get_m_nodes=R.prototype.GA=function(){return k(es(this.hy),TB)};R.prototype.set_m_nodes=R.prototype.mD=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);gs(c,a)};Object.defineProperty(R.prototype,\"m_nodes\",{get:R.prototype.GA,set:R.prototype.mD});R.prototype.get_m_faces=R.prototype.Gy=function(){return k(hs(this.hy),UB)};R.prototype.set_m_faces=R.prototype.Py=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);is(c,a)};\nObject.defineProperty(R.prototype,\"m_faces\",{get:R.prototype.Gy,set:R.prototype.Py});R.prototype.get_m_materials=R.prototype.DA=function(){return k(js(this.hy),qB)};R.prototype.set_m_materials=R.prototype.jD=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);ks(c,a)};Object.defineProperty(R.prototype,\"m_materials\",{get:R.prototype.DA,set:R.prototype.jD});R.prototype.get_m_anchors=R.prototype.Az=function(){return k(ls(this.hy),RB)};\nR.prototype.set_m_anchors=R.prototype.gC=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);ms(c,a)};Object.defineProperty(R.prototype,\"m_anchors\",{get:R.prototype.Az,set:R.prototype.gC});R.prototype.__destroy__=function(){ns(this.hy)};function VB(){throw\"cannot construct a btIntArray, no constructor in IDL\";}VB.prototype=Object.create(f.prototype);VB.prototype.constructor=VB;VB.prototype.iy=VB;VB.jy={};b.btIntArray=VB;VB.prototype.size=VB.prototype.size=function(){return ps(this.hy)};\nVB.prototype.at=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);return qs(c,a)};VB.prototype.__destroy__=function(){rs(this.hy)};function S(){throw\"cannot construct a Config, no constructor in IDL\";}S.prototype=Object.create(f.prototype);S.prototype.constructor=S;S.prototype.iy=S;S.jy={};b.Config=S;S.prototype.get_kVCF=S.prototype.sz=function(){return ss(this.hy)};S.prototype.set_kVCF=S.prototype.$B=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);ts(c,a)};\nObject.defineProperty(S.prototype,\"kVCF\",{get:S.prototype.sz,set:S.prototype.$B});S.prototype.get_kDP=S.prototype.fz=function(){return us(this.hy)};S.prototype.set_kDP=S.prototype.NB=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);vs(c,a)};Object.defineProperty(S.prototype,\"kDP\",{get:S.prototype.fz,set:S.prototype.NB});S.prototype.get_kDG=S.prototype.ez=function(){return xs(this.hy)};S.prototype.set_kDG=S.prototype.MB=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);ys(c,a)};\nObject.defineProperty(S.prototype,\"kDG\",{get:S.prototype.ez,set:S.prototype.MB});S.prototype.get_kLF=S.prototype.hz=function(){return zs(this.hy)};S.prototype.set_kLF=S.prototype.PB=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);As(c,a)};Object.defineProperty(S.prototype,\"kLF\",{get:S.prototype.hz,set:S.prototype.PB});S.prototype.get_kPR=S.prototype.jz=function(){return Bs(this.hy)};S.prototype.set_kPR=S.prototype.RB=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Cs(c,a)};\nObject.defineProperty(S.prototype,\"kPR\",{get:S.prototype.jz,set:S.prototype.RB});S.prototype.get_kVC=S.prototype.rz=function(){return Ds(this.hy)};S.prototype.set_kVC=S.prototype.ZB=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Es(c,a)};Object.defineProperty(S.prototype,\"kVC\",{get:S.prototype.rz,set:S.prototype.ZB});S.prototype.get_kDF=S.prototype.dz=function(){return Fs(this.hy)};S.prototype.set_kDF=S.prototype.LB=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Gs(c,a)};\nObject.defineProperty(S.prototype,\"kDF\",{get:S.prototype.dz,set:S.prototype.LB});S.prototype.get_kMT=S.prototype.iz=function(){return Hs(this.hy)};S.prototype.set_kMT=S.prototype.QB=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Is(c,a)};Object.defineProperty(S.prototype,\"kMT\",{get:S.prototype.iz,set:S.prototype.QB});S.prototype.get_kCHR=S.prototype.cz=function(){return Js(this.hy)};S.prototype.set_kCHR=S.prototype.KB=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Ks(c,a)};\nObject.defineProperty(S.prototype,\"kCHR\",{get:S.prototype.cz,set:S.prototype.KB});S.prototype.get_kKHR=S.prototype.gz=function(){return Ls(this.hy)};S.prototype.set_kKHR=S.prototype.OB=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Ms(c,a)};Object.defineProperty(S.prototype,\"kKHR\",{get:S.prototype.gz,set:S.prototype.OB});S.prototype.get_kSHR=S.prototype.kz=function(){return Ns(this.hy)};\nS.prototype.set_kSHR=S.prototype.SB=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Os(c,a)};Object.defineProperty(S.prototype,\"kSHR\",{get:S.prototype.kz,set:S.prototype.SB});S.prototype.get_kAHR=S.prototype.bz=function(){return Ps(this.hy)};S.prototype.set_kAHR=S.prototype.JB=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Qs(c,a)};Object.defineProperty(S.prototype,\"kAHR\",{get:S.prototype.bz,set:S.prototype.JB});S.prototype.get_kSRHR_CL=S.prototype.nz=function(){return Rs(this.hy)};\nS.prototype.set_kSRHR_CL=S.prototype.VB=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Ss(c,a)};Object.defineProperty(S.prototype,\"kSRHR_CL\",{get:S.prototype.nz,set:S.prototype.VB});S.prototype.get_kSKHR_CL=S.prototype.lz=function(){return Ts(this.hy)};S.prototype.set_kSKHR_CL=S.prototype.TB=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Us(c,a)};Object.defineProperty(S.prototype,\"kSKHR_CL\",{get:S.prototype.lz,set:S.prototype.TB});S.prototype.get_kSSHR_CL=S.prototype.pz=function(){return Vs(this.hy)};\nS.prototype.set_kSSHR_CL=S.prototype.XB=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Ws(c,a)};Object.defineProperty(S.prototype,\"kSSHR_CL\",{get:S.prototype.pz,set:S.prototype.XB});S.prototype.get_kSR_SPLT_CL=S.prototype.oz=function(){return Xs(this.hy)};S.prototype.set_kSR_SPLT_CL=S.prototype.WB=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Ys(c,a)};Object.defineProperty(S.prototype,\"kSR_SPLT_CL\",{get:S.prototype.oz,set:S.prototype.WB});\nS.prototype.get_kSK_SPLT_CL=S.prototype.mz=function(){return Zs(this.hy)};S.prototype.set_kSK_SPLT_CL=S.prototype.UB=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);$s(c,a)};Object.defineProperty(S.prototype,\"kSK_SPLT_CL\",{get:S.prototype.mz,set:S.prototype.UB});S.prototype.get_kSS_SPLT_CL=S.prototype.qz=function(){return at(this.hy)};S.prototype.set_kSS_SPLT_CL=S.prototype.YB=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);bt(c,a)};\nObject.defineProperty(S.prototype,\"kSS_SPLT_CL\",{get:S.prototype.qz,set:S.prototype.YB});S.prototype.get_maxvolume=S.prototype.yB=function(){return ct(this.hy)};S.prototype.set_maxvolume=S.prototype.eE=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);dt(c,a)};Object.defineProperty(S.prototype,\"maxvolume\",{get:S.prototype.yB,set:S.prototype.eE});S.prototype.get_timescale=S.prototype.AB=function(){return et(this.hy)};\nS.prototype.set_timescale=S.prototype.gE=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);ft(c,a)};Object.defineProperty(S.prototype,\"timescale\",{get:S.prototype.AB,set:S.prototype.gE});S.prototype.get_viterations=S.prototype.BB=function(){return gt(this.hy)};S.prototype.set_viterations=S.prototype.hE=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);ht(c,a)};Object.defineProperty(S.prototype,\"viterations\",{get:S.prototype.BB,set:S.prototype.hE});\nS.prototype.get_piterations=S.prototype.zB=function(){return it(this.hy)};S.prototype.set_piterations=S.prototype.fE=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);jt(c,a)};Object.defineProperty(S.prototype,\"piterations\",{get:S.prototype.zB,set:S.prototype.fE});S.prototype.get_diterations=S.prototype.az=function(){return kt(this.hy)};S.prototype.set_diterations=S.prototype.IB=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);lt(c,a)};\nObject.defineProperty(S.prototype,\"diterations\",{get:S.prototype.az,set:S.prototype.IB});S.prototype.get_citerations=S.prototype.Zy=function(){return mt(this.hy)};S.prototype.set_citerations=S.prototype.GB=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);nt(c,a)};Object.defineProperty(S.prototype,\"citerations\",{get:S.prototype.Zy,set:S.prototype.GB});S.prototype.get_collisions=S.prototype.$y=function(){return ot(this.hy)};\nS.prototype.set_collisions=S.prototype.HB=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);pt(c,a)};Object.defineProperty(S.prototype,\"collisions\",{get:S.prototype.$y,set:S.prototype.HB});S.prototype.__destroy__=function(){qt(this.hy)};function Node(){throw\"cannot construct a Node, no constructor in IDL\";}Node.prototype=Object.create(f.prototype);Node.prototype.constructor=Node;Node.prototype.iy=Node;Node.jy={};b.Node=Node;\nNode.prototype.get_m_x=Node.prototype.xB=function(){return k(rt(this.hy),p)};Node.prototype.set_m_x=Node.prototype.dE=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);st(c,a)};Object.defineProperty(Node.prototype,\"m_x\",{get:Node.prototype.xB,set:Node.prototype.dE});Node.prototype.get_m_q=Node.prototype.OA=function(){return k(tt(this.hy),p)};Node.prototype.set_m_q=Node.prototype.uD=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);ut(c,a)};\nObject.defineProperty(Node.prototype,\"m_q\",{get:Node.prototype.OA,set:Node.prototype.uD});Node.prototype.get_m_v=Node.prototype.pB=function(){return k(vt(this.hy),p)};Node.prototype.set_m_v=Node.prototype.WD=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);wt(c,a)};Object.defineProperty(Node.prototype,\"m_v\",{get:Node.prototype.pB,set:Node.prototype.WD});Node.prototype.get_m_f=Node.prototype.bA=function(){return k(xt(this.hy),p)};\nNode.prototype.set_m_f=Node.prototype.IC=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);yt(c,a)};Object.defineProperty(Node.prototype,\"m_f\",{get:Node.prototype.bA,set:Node.prototype.IC});Node.prototype.get_m_n=Node.prototype.Hy=function(){return k(zt(this.hy),p)};Node.prototype.set_m_n=Node.prototype.Qy=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);At(c,a)};Object.defineProperty(Node.prototype,\"m_n\",{get:Node.prototype.Hy,set:Node.prototype.Qy});\nNode.prototype.get_m_im=Node.prototype.pA=function(){return Bt(this.hy)};Node.prototype.set_m_im=Node.prototype.WC=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Ct(c,a)};Object.defineProperty(Node.prototype,\"m_im\",{get:Node.prototype.pA,set:Node.prototype.WC});Node.prototype.get_m_area=Node.prototype.Dz=function(){return Dt(this.hy)};Node.prototype.set_m_area=Node.prototype.jC=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Et(c,a)};\nObject.defineProperty(Node.prototype,\"m_area\",{get:Node.prototype.Dz,set:Node.prototype.jC});Node.prototype.__destroy__=function(){Ft(this.hy)};function WB(){this.hy=Gt();h(WB)[this.hy]=this}WB.prototype=Object.create(f.prototype);WB.prototype.constructor=WB;WB.prototype.iy=WB;WB.jy={};b.btGhostPairCallback=WB;WB.prototype.__destroy__=function(){Ht(this.hy)};function XB(){throw\"cannot construct a btOverlappingPairCallback, no constructor in IDL\";}XB.prototype=Object.create(f.prototype);\nXB.prototype.constructor=XB;XB.prototype.iy=XB;XB.jy={};b.btOverlappingPairCallback=XB;XB.prototype.__destroy__=function(){It(this.hy)};function T(a,c,d,e){a&&\"object\"===typeof a&&(a=a.hy);c&&\"object\"===typeof c&&(c=c.hy);d&&\"object\"===typeof d&&(d=d.hy);e&&\"object\"===typeof e&&(e=e.hy);this.hy=void 0===e?Jt(a,c,d):Kt(a,c,d,e);h(T)[this.hy]=this}T.prototype=Object.create(ZA.prototype);T.prototype.constructor=T;T.prototype.iy=T;T.jy={};b.btKinematicCharacterController=T;\nT.prototype.setUpAxis=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Lt(c,a)};T.prototype.setWalkDirection=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Mt(c,a)};T.prototype.setVelocityForTimeInterval=function(a,c){var d=this.hy;a&&\"object\"===typeof a&&(a=a.hy);c&&\"object\"===typeof c&&(c=c.hy);Nt(d,a,c)};T.prototype.warp=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Ot(c,a)};T.prototype.preStep=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Pt(c,a)};\nT.prototype.playerStep=function(a,c){var d=this.hy;a&&\"object\"===typeof a&&(a=a.hy);c&&\"object\"===typeof c&&(c=c.hy);Qt(d,a,c)};T.prototype.setFallSpeed=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Rt(c,a)};T.prototype.setJumpSpeed=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);St(c,a)};T.prototype.setMaxJumpHeight=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Tt(c,a)};T.prototype.canJump=function(){return!!Ut(this.hy)};T.prototype.jump=function(){Vt(this.hy)};\nT.prototype.setGravity=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Wt(c,a)};T.prototype.getGravity=function(){return Xt(this.hy)};T.prototype.setMaxSlope=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Yt(c,a)};T.prototype.getMaxSlope=function(){return Zt(this.hy)};T.prototype.getGhostObject=function(){return k($t(this.hy),U)};T.prototype.setUseGhostSweepTest=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);au(c,a)};T.prototype.onGround=function(){return!!bu(this.hy)};\nT.prototype.setUpInterpolate=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);cu(c,a)};T.prototype.updateAction=function(a,c){var d=this.hy;a&&\"object\"===typeof a&&(a=a.hy);c&&\"object\"===typeof c&&(c=c.hy);du(d,a,c)};T.prototype.__destroy__=function(){eu(this.hy)};function YB(){throw\"cannot construct a btSoftBodyArray, no constructor in IDL\";}YB.prototype=Object.create(f.prototype);YB.prototype.constructor=YB;YB.prototype.iy=YB;YB.jy={};b.btSoftBodyArray=YB;\nYB.prototype.size=YB.prototype.size=function(){return fu(this.hy)};YB.prototype.at=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);return k(gu(c,a),R)};YB.prototype.__destroy__=function(){hu(this.hy)};function PB(){throw\"cannot construct a btFaceArray, no constructor in IDL\";}PB.prototype=Object.create(f.prototype);PB.prototype.constructor=PB;PB.prototype.iy=PB;PB.jy={};b.btFaceArray=PB;PB.prototype.size=PB.prototype.size=function(){return iu(this.hy)};\nPB.prototype.at=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);return k(ju(c,a),ZB)};PB.prototype.__destroy__=function(){ku(this.hy)};function $B(a,c){a&&\"object\"===typeof a&&(a=a.hy);c&&\"object\"===typeof c&&(c=c.hy);this.hy=lu(a,c);h($B)[this.hy]=this}$B.prototype=Object.create(UA.prototype);$B.prototype.constructor=$B;$B.prototype.iy=$B;$B.jy={};b.btStaticPlaneShape=$B;$B.prototype.setLocalScaling=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);mu(c,a)};\n$B.prototype.getLocalScaling=function(){return k(nu(this.hy),p)};$B.prototype.calculateLocalInertia=function(a,c){var d=this.hy;a&&\"object\"===typeof a&&(a=a.hy);c&&\"object\"===typeof c&&(c=c.hy);ou(d,a,c)};$B.prototype.__destroy__=function(){pu(this.hy)};function PA(){throw\"cannot construct a btOverlappingPairCache, no constructor in IDL\";}PA.prototype=Object.create(f.prototype);PA.prototype.constructor=PA;PA.prototype.iy=PA;PA.jy={};b.btOverlappingPairCache=PA;\nPA.prototype.setInternalGhostPairCallback=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);qu(c,a)};PA.prototype.getNumOverlappingPairs=function(){return ru(this.hy)};PA.prototype.__destroy__=function(){su(this.hy)};function vB(){throw\"cannot construct a btIndexedMesh, no constructor in IDL\";}vB.prototype=Object.create(f.prototype);vB.prototype.constructor=vB;vB.prototype.iy=vB;vB.jy={};b.btIndexedMesh=vB;vB.prototype.get_m_numTriangles=vB.prototype.KA=function(){return tu(this.hy)};\nvB.prototype.set_m_numTriangles=vB.prototype.qD=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);uu(c,a)};Object.defineProperty(vB.prototype,\"m_numTriangles\",{get:vB.prototype.KA,set:vB.prototype.qD});vB.prototype.__destroy__=function(){vu(this.hy)};function V(a,c,d,e,g){a&&\"object\"===typeof a&&(a=a.hy);c&&\"object\"===typeof c&&(c=c.hy);d&&\"object\"===typeof d&&(d=d.hy);e&&\"object\"===typeof e&&(e=e.hy);g&&\"object\"===typeof g&&(g=g.hy);this.hy=wu(a,c,d,e,g);h(V)[this.hy]=this}V.prototype=Object.create(x.prototype);\nV.prototype.constructor=V;V.prototype.iy=V;V.jy={};b.btSoftRigidDynamicsWorld=V;V.prototype.addSoftBody=function(a,c,d){var e=this.hy;a&&\"object\"===typeof a&&(a=a.hy);c&&\"object\"===typeof c&&(c=c.hy);d&&\"object\"===typeof d&&(d=d.hy);xu(e,a,c,d)};V.prototype.removeSoftBody=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);yu(c,a)};V.prototype.removeCollisionObject=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);zu(c,a)};V.prototype.getWorldInfo=function(){return k(Au(this.hy),J)};\nV.prototype.getSoftBodyArray=function(){return k(Bu(this.hy),YB)};V.prototype.getDispatcher=function(){return k(Cu(this.hy),OA)};V.prototype.rayTest=function(a,c,d){var e=this.hy;a&&\"object\"===typeof a&&(a=a.hy);c&&\"object\"===typeof c&&(c=c.hy);d&&\"object\"===typeof d&&(d=d.hy);Du(e,a,c,d)};V.prototype.getPairCache=function(){return k(Eu(this.hy),PA)};V.prototype.getDispatchInfo=function(){return k(Fu(this.hy),l)};\nV.prototype.addCollisionObject=function(a,c,d){var e=this.hy;a&&\"object\"===typeof a&&(a=a.hy);c&&\"object\"===typeof c&&(c=c.hy);d&&\"object\"===typeof d&&(d=d.hy);void 0===c?Gu(e,a):void 0===d?Hu(e,a,c):Iu(e,a,c,d)};V.prototype.getBroadphase=function(){return k(Ju(this.hy),QA)};\nV.prototype.convexSweepTest=function(a,c,d,e,g){var n=this.hy;a&&\"object\"===typeof a&&(a=a.hy);c&&\"object\"===typeof c&&(c=c.hy);d&&\"object\"===typeof d&&(d=d.hy);e&&\"object\"===typeof e&&(e=e.hy);g&&\"object\"===typeof g&&(g=g.hy);Ku(n,a,c,d,e,g)};V.prototype.contactPairTest=function(a,c,d){var e=this.hy;a&&\"object\"===typeof a&&(a=a.hy);c&&\"object\"===typeof c&&(c=c.hy);d&&\"object\"===typeof d&&(d=d.hy);Lu(e,a,c,d)};\nV.prototype.contactTest=function(a,c){var d=this.hy;a&&\"object\"===typeof a&&(a=a.hy);c&&\"object\"===typeof c&&(c=c.hy);Mu(d,a,c)};V.prototype.updateSingleAabb=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Nu(c,a)};V.prototype.setDebugDrawer=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Ou(c,a)};V.prototype.getDebugDrawer=function(){return k(Pu(this.hy),RA)};V.prototype.debugDrawWorld=function(){Qu(this.hy)};\nV.prototype.debugDrawObject=function(a,c,d){var e=this.hy;a&&\"object\"===typeof a&&(a=a.hy);c&&\"object\"===typeof c&&(c=c.hy);d&&\"object\"===typeof d&&(d=d.hy);Ru(e,a,c,d)};V.prototype.setGravity=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Su(c,a)};V.prototype.getGravity=function(){return k(Tu(this.hy),p)};\nV.prototype.addRigidBody=function(a,c,d){var e=this.hy;a&&\"object\"===typeof a&&(a=a.hy);c&&\"object\"===typeof c&&(c=c.hy);d&&\"object\"===typeof d&&(d=d.hy);void 0===c?Uu(e,a):void 0===d?_emscripten_bind_btSoftRigidDynamicsWorld_addRigidBody_2(e,a,c):Vu(e,a,c,d)};V.prototype.removeRigidBody=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Wu(c,a)};\nV.prototype.addConstraint=function(a,c){var d=this.hy;a&&\"object\"===typeof a&&(a=a.hy);c&&\"object\"===typeof c&&(c=c.hy);void 0===c?Xu(d,a):Yu(d,a,c)};V.prototype.removeConstraint=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Zu(c,a)};V.prototype.stepSimulation=function(a,c,d){var e=this.hy;a&&\"object\"===typeof a&&(a=a.hy);c&&\"object\"===typeof c&&(c=c.hy);d&&\"object\"===typeof d&&(d=d.hy);return void 0===c?$u(e,a):void 0===d?av(e,a,c):bv(e,a,c,d)};\nV.prototype.setContactAddedCallback=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);cv(c,a)};V.prototype.setContactProcessedCallback=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);dv(c,a)};V.prototype.setContactDestroyedCallback=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);ev(c,a)};V.prototype.addAction=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);fv(c,a)};V.prototype.removeAction=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);gv(c,a)};\nV.prototype.getSolverInfo=function(){return k(hv(this.hy),v)};V.prototype.setInternalTickCallback=function(a,c,d){var e=this.hy;a&&\"object\"===typeof a&&(a=a.hy);c&&\"object\"===typeof c&&(c=c.hy);d&&\"object\"===typeof d&&(d=d.hy);void 0===c?iv(e,a):void 0===d?jv(e,a,c):kv(e,a,c,d)};V.prototype.__destroy__=function(){lv(this.hy)};\nfunction aC(a,c,d,e){a&&\"object\"===typeof a&&(a=a.hy);c&&\"object\"===typeof c&&(c=c.hy);d&&\"object\"===typeof d&&(d=d.hy);e&&\"object\"===typeof e&&(e=e.hy);this.hy=mv(a,c,d,e);h(aC)[this.hy]=this}aC.prototype=Object.create(TA.prototype);aC.prototype.constructor=aC;aC.prototype.iy=aC;aC.jy={};b.btFixedConstraint=aC;aC.prototype.enableFeedback=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);nv(c,a)};aC.prototype.getBreakingImpulseThreshold=function(){return ov(this.hy)};\naC.prototype.setBreakingImpulseThreshold=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);pv(c,a)};aC.prototype.getParam=function(a,c){var d=this.hy;a&&\"object\"===typeof a&&(a=a.hy);c&&\"object\"===typeof c&&(c=c.hy);return qv(d,a,c)};aC.prototype.setParam=function(a,c,d){var e=this.hy;a&&\"object\"===typeof a&&(a=a.hy);c&&\"object\"===typeof c&&(c=c.hy);d&&\"object\"===typeof d&&(d=d.hy);rv(e,a,c,d)};aC.prototype.__destroy__=function(){sv(this.hy)};\nfunction r(a,c){a&&\"object\"===typeof a&&(a=a.hy);c&&\"object\"===typeof c&&(c=c.hy);this.hy=void 0===a?tv():void 0===c?_emscripten_bind_btTransform_btTransform_1(a):uv(a,c);h(r)[this.hy]=this}r.prototype=Object.create(f.prototype);r.prototype.constructor=r;r.prototype.iy=r;r.jy={};b.btTransform=r;r.prototype.setIdentity=function(){vv(this.hy)};r.prototype.setOrigin=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);wv(c,a)};\nr.prototype.setRotation=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);xv(c,a)};r.prototype.getOrigin=function(){return k(yv(this.hy),p)};r.prototype.getRotation=function(){return k(zv(this.hy),W)};r.prototype.getBasis=function(){return k(Av(this.hy),jB)};r.prototype.setFromOpenGLMatrix=function(a){var c=this.hy;IA();\"object\"==typeof a&&(a=MA(a));Bv(c,a)};r.prototype.inverse=r.prototype.inverse=function(){return k(Cv(this.hy),r)};\nr.prototype.op_mul=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);return k(Dv(c,a),r)};r.prototype.__destroy__=function(){Ev(this.hy)};function X(a,c){a&&\"object\"===typeof a&&(a=a.hy);c&&\"object\"===typeof c&&(c=c.hy);this.hy=Fv(a,c);h(X)[this.hy]=this}X.prototype=Object.create(z.prototype);X.prototype.constructor=X;X.prototype.iy=X;X.jy={};b.ClosestRayResultCallback=X;X.prototype.hasHit=function(){return!!Gv(this.hy)};\nX.prototype.get_m_rayFromWorld=X.prototype.Iy=function(){return k(Hv(this.hy),p)};X.prototype.set_m_rayFromWorld=X.prototype.Ry=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Iv(c,a)};Object.defineProperty(X.prototype,\"m_rayFromWorld\",{get:X.prototype.Iy,set:X.prototype.Ry});X.prototype.get_m_rayToWorld=X.prototype.Jy=function(){return k(Jv(this.hy),p)};X.prototype.set_m_rayToWorld=X.prototype.Sy=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Kv(c,a)};\nObject.defineProperty(X.prototype,\"m_rayToWorld\",{get:X.prototype.Jy,set:X.prototype.Sy});X.prototype.get_m_hitNormalWorld=X.prototype.sy=function(){return k(Lv(this.hy),p)};X.prototype.set_m_hitNormalWorld=X.prototype.zy=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Mv(c,a)};Object.defineProperty(X.prototype,\"m_hitNormalWorld\",{get:X.prototype.sy,set:X.prototype.zy});X.prototype.get_m_hitPointWorld=X.prototype.ty=function(){return k(Nv(this.hy),p)};\nX.prototype.set_m_hitPointWorld=X.prototype.Ay=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Ov(c,a)};Object.defineProperty(X.prototype,\"m_hitPointWorld\",{get:X.prototype.ty,set:X.prototype.Ay});X.prototype.get_m_collisionFilterGroup=X.prototype.ky=function(){return Pv(this.hy)};X.prototype.set_m_collisionFilterGroup=X.prototype.my=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Qv(c,a)};Object.defineProperty(X.prototype,\"m_collisionFilterGroup\",{get:X.prototype.ky,set:X.prototype.my});\nX.prototype.get_m_collisionFilterMask=X.prototype.ly=function(){return Rv(this.hy)};X.prototype.set_m_collisionFilterMask=X.prototype.ny=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Sv(c,a)};Object.defineProperty(X.prototype,\"m_collisionFilterMask\",{get:X.prototype.ly,set:X.prototype.ny});X.prototype.get_m_closestHitFraction=X.prototype.oy=function(){return Tv(this.hy)};\nX.prototype.set_m_closestHitFraction=X.prototype.py=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Uv(c,a)};Object.defineProperty(X.prototype,\"m_closestHitFraction\",{get:X.prototype.oy,set:X.prototype.py});X.prototype.get_m_collisionObject=X.prototype.qy=function(){return k(Vv(this.hy),q)};X.prototype.set_m_collisionObject=X.prototype.xy=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Wv(c,a)};Object.defineProperty(X.prototype,\"m_collisionObject\",{get:X.prototype.qy,set:X.prototype.xy});\nX.prototype.__destroy__=function(){Xv(this.hy)};function bC(a){a&&\"object\"===typeof a&&(a=a.hy);this.hy=void 0===a?Yv():Zv(a);h(bC)[this.hy]=this}bC.prototype=Object.create(WA.prototype);bC.prototype.constructor=bC;bC.prototype.iy=bC;bC.jy={};b.btSoftBodyRigidBodyCollisionConfiguration=bC;bC.prototype.__destroy__=function(){$v(this.hy)};function cC(){this.hy=aw();h(cC)[this.hy]=this}cC.prototype=Object.create(hB.prototype);cC.prototype.constructor=cC;cC.prototype.iy=cC;cC.jy={};\nb.ConcreteContactResultCallback=cC;cC.prototype.addSingleResult=function(a,c,d,e,g,n,F){var aa=this.hy;a&&\"object\"===typeof a&&(a=a.hy);c&&\"object\"===typeof c&&(c=c.hy);d&&\"object\"===typeof d&&(d=d.hy);e&&\"object\"===typeof e&&(e=e.hy);g&&\"object\"===typeof g&&(g=g.hy);n&&\"object\"===typeof n&&(n=n.hy);F&&\"object\"===typeof F&&(F=F.hy);return bw(aa,a,c,d,e,g,n,F)};cC.prototype.__destroy__=function(){cw(this.hy)};\nfunction dC(a,c,d){a&&\"object\"===typeof a&&(a=a.hy);c&&\"object\"===typeof c&&(c=c.hy);d&&\"object\"===typeof d&&(d=d.hy);this.hy=void 0===d?dw(a,c):ew(a,c,d);h(dC)[this.hy]=this}dC.prototype=Object.create(XA.prototype);dC.prototype.constructor=dC;dC.prototype.iy=dC;dC.jy={};b.btBvhTriangleMeshShape=dC;dC.prototype.setLocalScaling=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);fw(c,a)};dC.prototype.getLocalScaling=function(){return k(gw(this.hy),p)};\ndC.prototype.calculateLocalInertia=function(a,c){var d=this.hy;a&&\"object\"===typeof a&&(a=a.hy);c&&\"object\"===typeof c&&(c=c.hy);hw(d,a,c)};dC.prototype.__destroy__=function(){iw(this.hy)};function oB(){throw\"cannot construct a btConstCollisionObjectArray, no constructor in IDL\";}oB.prototype=Object.create(f.prototype);oB.prototype.constructor=oB;oB.prototype.iy=oB;oB.jy={};b.btConstCollisionObjectArray=oB;oB.prototype.size=oB.prototype.size=function(){return jw(this.hy)};\noB.prototype.at=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);return k(kw(c,a),q)};oB.prototype.__destroy__=function(){lw(this.hy)};function eC(a,c,d,e,g){a&&\"object\"===typeof a&&(a=a.hy);c&&\"object\"===typeof c&&(c=c.hy);d&&\"object\"===typeof d&&(d=d.hy);e&&\"object\"===typeof e&&(e=e.hy);g&&\"object\"===typeof g&&(g=g.hy);this.hy=void 0===e?mw(a,c,d):void 0===g?_emscripten_bind_btSliderConstraint_btSliderConstraint_4(a,c,d,e):nw(a,c,d,e,g);h(eC)[this.hy]=this}eC.prototype=Object.create(TA.prototype);\neC.prototype.constructor=eC;eC.prototype.iy=eC;eC.jy={};b.btSliderConstraint=eC;eC.prototype.setLowerLinLimit=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);ow(c,a)};eC.prototype.setUpperLinLimit=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);pw(c,a)};eC.prototype.setLowerAngLimit=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);qw(c,a)};eC.prototype.setUpperAngLimit=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);rw(c,a)};\neC.prototype.enableFeedback=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);sw(c,a)};eC.prototype.getBreakingImpulseThreshold=function(){return tw(this.hy)};eC.prototype.setBreakingImpulseThreshold=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);uw(c,a)};eC.prototype.getParam=function(a,c){var d=this.hy;a&&\"object\"===typeof a&&(a=a.hy);c&&\"object\"===typeof c&&(c=c.hy);return vw(d,a,c)};\neC.prototype.setParam=function(a,c,d){var e=this.hy;a&&\"object\"===typeof a&&(a=a.hy);c&&\"object\"===typeof c&&(c=c.hy);d&&\"object\"===typeof d&&(d=d.hy);ww(e,a,c,d)};eC.prototype.__destroy__=function(){xw(this.hy)};function U(){this.hy=yw();h(U)[this.hy]=this}U.prototype=Object.create(w.prototype);U.prototype.constructor=U;U.prototype.iy=U;U.jy={};b.btPairCachingGhostObject=U;\nU.prototype.setAnisotropicFriction=function(a,c){var d=this.hy;a&&\"object\"===typeof a&&(a=a.hy);c&&\"object\"===typeof c&&(c=c.hy);zw(d,a,c)};U.prototype.getCollisionShape=function(){return k(Aw(this.hy),m)};U.prototype.setContactProcessingThreshold=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Bw(c,a)};U.prototype.setActivationState=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Cw(c,a)};\nU.prototype.forceActivationState=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Dw(c,a)};U.prototype.activate=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);void 0===a?Ew(c):Fw(c,a)};U.prototype.isActive=function(){return!!Gw(this.hy)};U.prototype.isKinematicObject=function(){return!!Hw(this.hy)};U.prototype.isStaticObject=function(){return!!Iw(this.hy)};U.prototype.isStaticOrKinematicObject=function(){return!!Jw(this.hy)};U.prototype.getRestitution=function(){return Kw(this.hy)};\nU.prototype.getFriction=function(){return Lw(this.hy)};U.prototype.getRollingFriction=function(){return Mw(this.hy)};U.prototype.setRestitution=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Nw(c,a)};U.prototype.setFriction=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Ow(c,a)};U.prototype.setRollingFriction=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Pw(c,a)};U.prototype.getWorldTransform=function(){return k(Qw(this.hy),r)};U.prototype.getCollisionFlags=function(){return Rw(this.hy)};\nU.prototype.setCollisionFlags=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Sw(c,a)};U.prototype.setWorldTransform=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Tw(c,a)};U.prototype.setCollisionShape=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Uw(c,a)};U.prototype.setCcdMotionThreshold=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Vw(c,a)};U.prototype.setCcdSweptSphereRadius=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Ww(c,a)};\nU.prototype.getUserIndex=function(){return Xw(this.hy)};U.prototype.setUserIndex=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Yw(c,a)};U.prototype.getUserPointer=function(){return k(Zw(this.hy),SA)};U.prototype.setUserPointer=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);$w(c,a)};U.prototype.getBroadphaseHandle=function(){return k(ax(this.hy),t)};U.prototype.getNumOverlappingObjects=function(){return bx(this.hy)};\nU.prototype.getOverlappingObject=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);return k(cx(c,a),q)};U.prototype.__destroy__=function(){dx(this.hy)};function D(){throw\"cannot construct a btManifoldPoint, no constructor in IDL\";}D.prototype=Object.create(f.prototype);D.prototype.constructor=D;D.prototype.iy=D;D.jy={};b.btManifoldPoint=D;D.prototype.getPositionWorldOnA=function(){return k(ex(this.hy),p)};D.prototype.getPositionWorldOnB=function(){return k(fx(this.hy),p)};\nD.prototype.getAppliedImpulse=function(){return gx(this.hy)};D.prototype.getDistance=function(){return hx(this.hy)};D.prototype.get_m_localPointA=D.prototype.AA=function(){return k(ix(this.hy),p)};D.prototype.set_m_localPointA=D.prototype.gD=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);jx(c,a)};Object.defineProperty(D.prototype,\"m_localPointA\",{get:D.prototype.AA,set:D.prototype.gD});D.prototype.get_m_localPointB=D.prototype.BA=function(){return k(kx(this.hy),p)};\nD.prototype.set_m_localPointB=D.prototype.hD=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);lx(c,a)};Object.defineProperty(D.prototype,\"m_localPointB\",{get:D.prototype.BA,set:D.prototype.hD});D.prototype.get_m_positionWorldOnB=D.prototype.NA=function(){return k(mx(this.hy),p)};D.prototype.set_m_positionWorldOnB=D.prototype.tD=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);nx(c,a)};Object.defineProperty(D.prototype,\"m_positionWorldOnB\",{get:D.prototype.NA,set:D.prototype.tD});\nD.prototype.get_m_positionWorldOnA=D.prototype.MA=function(){return k(ox(this.hy),p)};D.prototype.set_m_positionWorldOnA=D.prototype.sD=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);px(c,a)};Object.defineProperty(D.prototype,\"m_positionWorldOnA\",{get:D.prototype.MA,set:D.prototype.sD});D.prototype.get_m_normalWorldOnB=D.prototype.IA=function(){return k(qx(this.hy),p)};D.prototype.set_m_normalWorldOnB=D.prototype.oD=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);rx(c,a)};\nObject.defineProperty(D.prototype,\"m_normalWorldOnB\",{get:D.prototype.IA,set:D.prototype.oD});D.prototype.get_m_userPersistentData=D.prototype.oB=function(){return sx(this.hy)};D.prototype.set_m_userPersistentData=D.prototype.VD=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);tx(c,a)};Object.defineProperty(D.prototype,\"m_userPersistentData\",{get:D.prototype.oB,set:D.prototype.VD});D.prototype.__destroy__=function(){ux(this.hy)};\nfunction fC(a,c,d,e){a&&\"object\"===typeof a&&(a=a.hy);c&&\"object\"===typeof c&&(c=c.hy);d&&\"object\"===typeof d&&(d=d.hy);e&&\"object\"===typeof e&&(e=e.hy);this.hy=void 0===d?vx(a,c):void 0===e?_emscripten_bind_btPoint2PointConstraint_btPoint2PointConstraint_3(a,c,d):wx(a,c,d,e);h(fC)[this.hy]=this}fC.prototype=Object.create(TA.prototype);fC.prototype.constructor=fC;fC.prototype.iy=fC;fC.jy={};b.btPoint2PointConstraint=fC;\nfC.prototype.setPivotA=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);xx(c,a)};fC.prototype.setPivotB=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);yx(c,a)};fC.prototype.getPivotInA=function(){return k(zx(this.hy),p)};fC.prototype.getPivotInB=function(){return k(Ax(this.hy),p)};fC.prototype.enableFeedback=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Bx(c,a)};fC.prototype.getBreakingImpulseThreshold=function(){return Cx(this.hy)};\nfC.prototype.setBreakingImpulseThreshold=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Dx(c,a)};fC.prototype.getParam=function(a,c){var d=this.hy;a&&\"object\"===typeof a&&(a=a.hy);c&&\"object\"===typeof c&&(c=c.hy);return Ex(d,a,c)};fC.prototype.setParam=function(a,c,d){var e=this.hy;a&&\"object\"===typeof a&&(a=a.hy);c&&\"object\"===typeof c&&(c=c.hy);d&&\"object\"===typeof d&&(d=d.hy);Fx(e,a,c,d)};fC.prototype.get_m_setting=fC.prototype.VA=function(){return k(Gx(this.hy),H)};\nfC.prototype.set_m_setting=fC.prototype.BD=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Hx(c,a)};Object.defineProperty(fC.prototype,\"m_setting\",{get:fC.prototype.VA,set:fC.prototype.BD});fC.prototype.__destroy__=function(){Ix(this.hy)};function gC(){this.hy=Jx();h(gC)[this.hy]=this}gC.prototype=Object.create(f.prototype);gC.prototype.constructor=gC;gC.prototype.iy=gC;gC.jy={};b.btSoftBodyHelpers=gC;\ngC.prototype.CreateRope=function(a,c,d,e,g){var n=this.hy;a&&\"object\"===typeof a&&(a=a.hy);c&&\"object\"===typeof c&&(c=c.hy);d&&\"object\"===typeof d&&(d=d.hy);e&&\"object\"===typeof e&&(e=e.hy);g&&\"object\"===typeof g&&(g=g.hy);return k(Kx(n,a,c,d,e,g),R)};\ngC.prototype.CreatePatch=function(a,c,d,e,g,n,F,aa,ta){var Rb=this.hy;a&&\"object\"===typeof a&&(a=a.hy);c&&\"object\"===typeof c&&(c=c.hy);d&&\"object\"===typeof d&&(d=d.hy);e&&\"object\"===typeof e&&(e=e.hy);g&&\"object\"===typeof g&&(g=g.hy);n&&\"object\"===typeof n&&(n=n.hy);F&&\"object\"===typeof F&&(F=F.hy);aa&&\"object\"===typeof aa&&(aa=aa.hy);ta&&\"object\"===typeof ta&&(ta=ta.hy);return k(Lx(Rb,a,c,d,e,g,n,F,aa,ta),R)};\ngC.prototype.CreatePatchUV=function(a,c,d,e,g,n,F,aa,ta,Rb){var nC=this.hy;IA();a&&\"object\"===typeof a&&(a=a.hy);c&&\"object\"===typeof c&&(c=c.hy);d&&\"object\"===typeof d&&(d=d.hy);e&&\"object\"===typeof e&&(e=e.hy);g&&\"object\"===typeof g&&(g=g.hy);n&&\"object\"===typeof n&&(n=n.hy);F&&\"object\"===typeof F&&(F=F.hy);aa&&\"object\"===typeof aa&&(aa=aa.hy);ta&&\"object\"===typeof ta&&(ta=ta.hy);\"object\"==typeof Rb&&(Rb=MA(Rb));return k(Mx(nC,a,c,d,e,g,n,F,aa,ta,Rb),R)};\ngC.prototype.CreateEllipsoid=function(a,c,d,e){var g=this.hy;a&&\"object\"===typeof a&&(a=a.hy);c&&\"object\"===typeof c&&(c=c.hy);d&&\"object\"===typeof d&&(d=d.hy);e&&\"object\"===typeof e&&(e=e.hy);return k(Nx(g,a,c,d,e),R)};\ngC.prototype.CreateFromTriMesh=function(a,c,d,e,g){var n=this.hy;IA();a&&\"object\"===typeof a&&(a=a.hy);\"object\"==typeof c&&(c=MA(c));if(\"object\"==typeof d&&\"object\"===typeof d){var F=JA(d,Aa);KA(d,Aa,F);d=F}e&&\"object\"===typeof e&&(e=e.hy);g&&\"object\"===typeof g&&(g=g.hy);return k(Ox(n,a,c,d,e,g),R)};\ngC.prototype.CreateFromConvexHull=function(a,c,d,e){var g=this.hy;a&&\"object\"===typeof a&&(a=a.hy);c&&\"object\"===typeof c&&(c=c.hy);d&&\"object\"===typeof d&&(d=d.hy);e&&\"object\"===typeof e&&(e=e.hy);return k(Px(g,a,c,d,e),R)};gC.prototype.__destroy__=function(){Qx(this.hy)};function t(){throw\"cannot construct a btBroadphaseProxy, no constructor in IDL\";}t.prototype=Object.create(f.prototype);t.prototype.constructor=t;t.prototype.iy=t;t.jy={};b.btBroadphaseProxy=t;\nt.prototype.get_m_collisionFilterGroup=t.prototype.ky=function(){return Rx(this.hy)};t.prototype.set_m_collisionFilterGroup=t.prototype.my=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Sx(c,a)};Object.defineProperty(t.prototype,\"m_collisionFilterGroup\",{get:t.prototype.ky,set:t.prototype.my});t.prototype.get_m_collisionFilterMask=t.prototype.ly=function(){return Tx(this.hy)};\nt.prototype.set_m_collisionFilterMask=t.prototype.ny=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Ux(c,a)};Object.defineProperty(t.prototype,\"m_collisionFilterMask\",{get:t.prototype.ly,set:t.prototype.ny});t.prototype.__destroy__=function(){Vx(this.hy)};function TB(){throw\"cannot construct a tNodeArray, no constructor in IDL\";}TB.prototype=Object.create(f.prototype);TB.prototype.constructor=TB;TB.prototype.iy=TB;TB.jy={};b.tNodeArray=TB;TB.prototype.size=TB.prototype.size=function(){return Wx(this.hy)};\nTB.prototype.at=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);return k(Xx(c,a),Node)};TB.prototype.__destroy__=function(){Yx(this.hy)};function hC(a){a&&\"object\"===typeof a&&(a=a.hy);this.hy=Zx(a);h(hC)[this.hy]=this}hC.prototype=Object.create(m.prototype);hC.prototype.constructor=hC;hC.prototype.iy=hC;hC.jy={};b.btBoxShape=hC;hC.prototype.setMargin=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);$x(c,a)};hC.prototype.getMargin=function(){return ay(this.hy)};\nhC.prototype.setLocalScaling=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);by(c,a)};hC.prototype.getLocalScaling=function(){return k(cy(this.hy),p)};hC.prototype.calculateLocalInertia=function(a,c){var d=this.hy;a&&\"object\"===typeof a&&(a=a.hy);c&&\"object\"===typeof c&&(c=c.hy);dy(d,a,c)};hC.prototype.__destroy__=function(){ey(this.hy)};function ZB(){throw\"cannot construct a btFace, no constructor in IDL\";}ZB.prototype=Object.create(f.prototype);ZB.prototype.constructor=ZB;\nZB.prototype.iy=ZB;ZB.jy={};b.btFace=ZB;ZB.prototype.get_m_indices=ZB.prototype.rA=function(){return k(fy(this.hy),VB)};ZB.prototype.set_m_indices=ZB.prototype.YC=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);gy(c,a)};Object.defineProperty(ZB.prototype,\"m_indices\",{get:ZB.prototype.rA,set:ZB.prototype.YC});ZB.prototype.get_m_plane=ZB.prototype.LA=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);return hy(c,a)};\nZB.prototype.set_m_plane=ZB.prototype.rD=function(a,c){var d=this.hy;IA();a&&\"object\"===typeof a&&(a=a.hy);c&&\"object\"===typeof c&&(c=c.hy);iy(d,a,c)};Object.defineProperty(ZB.prototype,\"m_plane\",{get:ZB.prototype.LA,set:ZB.prototype.rD});ZB.prototype.__destroy__=function(){jy(this.hy)};function iC(){this.hy=ky();h(iC)[this.hy]=this}iC.prototype=Object.create(RA.prototype);iC.prototype.constructor=iC;iC.prototype.iy=iC;iC.jy={};b.DebugDrawer=iC;\niC.prototype.drawLine=function(a,c,d){var e=this.hy;a&&\"object\"===typeof a&&(a=a.hy);c&&\"object\"===typeof c&&(c=c.hy);d&&\"object\"===typeof d&&(d=d.hy);ly(e,a,c,d)};iC.prototype.drawContactPoint=function(a,c,d,e,g){var n=this.hy;a&&\"object\"===typeof a&&(a=a.hy);c&&\"object\"===typeof c&&(c=c.hy);d&&\"object\"===typeof d&&(d=d.hy);e&&\"object\"===typeof e&&(e=e.hy);g&&\"object\"===typeof g&&(g=g.hy);my(n,a,c,d,e,g)};\niC.prototype.reportErrorWarning=function(a){var c=this.hy;IA();a=a&&\"object\"===typeof a?a.hy:LA(a);ny(c,a)};iC.prototype.draw3dText=function(a,c){var d=this.hy;IA();a&&\"object\"===typeof a&&(a=a.hy);c=c&&\"object\"===typeof c?c.hy:LA(c);oy(d,a,c)};iC.prototype.setDebugMode=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);py(c,a)};iC.prototype.getDebugMode=function(){return qy(this.hy)};iC.prototype.__destroy__=function(){ry(this.hy)};\nfunction jC(a,c){a&&\"object\"===typeof a&&(a=a.hy);c&&\"object\"===typeof c&&(c=c.hy);this.hy=sy(a,c);h(jC)[this.hy]=this}jC.prototype=Object.create(VA.prototype);jC.prototype.constructor=jC;jC.prototype.iy=jC;jC.jy={};b.btCapsuleShapeX=jC;jC.prototype.setMargin=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);ty(c,a)};jC.prototype.getMargin=function(){return uy(this.hy)};jC.prototype.getUpAxis=function(){return vy(this.hy)};jC.prototype.getRadius=function(){return wy(this.hy)};\njC.prototype.getHalfHeight=function(){return xy(this.hy)};jC.prototype.setLocalScaling=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);yy(c,a)};jC.prototype.getLocalScaling=function(){return k(zy(this.hy),p)};jC.prototype.calculateLocalInertia=function(a,c){var d=this.hy;a&&\"object\"===typeof a&&(a=a.hy);c&&\"object\"===typeof c&&(c=c.hy);Ay(d,a,c)};jC.prototype.__destroy__=function(){By(this.hy)};\nfunction W(a,c,d,e){a&&\"object\"===typeof a&&(a=a.hy);c&&\"object\"===typeof c&&(c=c.hy);d&&\"object\"===typeof d&&(d=d.hy);e&&\"object\"===typeof e&&(e=e.hy);this.hy=Cy(a,c,d,e);h(W)[this.hy]=this}W.prototype=Object.create(aB.prototype);W.prototype.constructor=W;W.prototype.iy=W;W.jy={};b.btQuaternion=W;W.prototype.setValue=function(a,c,d,e){var g=this.hy;a&&\"object\"===typeof a&&(a=a.hy);c&&\"object\"===typeof c&&(c=c.hy);d&&\"object\"===typeof d&&(d=d.hy);e&&\"object\"===typeof e&&(e=e.hy);Dy(g,a,c,d,e)};\nW.prototype.setEulerZYX=function(a,c,d){var e=this.hy;a&&\"object\"===typeof a&&(a=a.hy);c&&\"object\"===typeof c&&(c=c.hy);d&&\"object\"===typeof d&&(d=d.hy);Ey(e,a,c,d)};W.prototype.setRotation=function(a,c){var d=this.hy;a&&\"object\"===typeof a&&(a=a.hy);c&&\"object\"===typeof c&&(c=c.hy);Fy(d,a,c)};W.prototype.normalize=W.prototype.normalize=function(){Gy(this.hy)};W.prototype.length2=function(){return Hy(this.hy)};W.prototype.length=W.prototype.length=function(){return Iy(this.hy)};\nW.prototype.dot=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);return Jy(c,a)};W.prototype.normalized=function(){return k(Ky(this.hy),W)};W.prototype.getAxis=function(){return k(Ly(this.hy),p)};W.prototype.inverse=W.prototype.inverse=function(){return k(My(this.hy),W)};W.prototype.getAngle=function(){return Ny(this.hy)};W.prototype.getAngleShortestPath=function(){return Oy(this.hy)};\nW.prototype.angle=W.prototype.angle=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);return Py(c,a)};W.prototype.angleShortestPath=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);return Qy(c,a)};W.prototype.op_add=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);return k(Ry(c,a),W)};W.prototype.op_sub=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);return k(Sy(c,a),W)};\nW.prototype.op_mul=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);return k(Ty(c,a),W)};W.prototype.op_mulq=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);return k(Uy(c,a),W)};W.prototype.op_div=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);return k(Vy(c,a),W)};W.prototype.x=W.prototype.x=function(){return Wy(this.hy)};W.prototype.y=W.prototype.y=function(){return Xy(this.hy)};W.prototype.z=W.prototype.z=function(){return Yy(this.hy)};W.prototype.w=function(){return Zy(this.hy)};\nW.prototype.setX=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);$y(c,a)};W.prototype.setY=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);az(c,a)};W.prototype.setZ=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);bz(c,a)};W.prototype.setW=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);cz(c,a)};W.prototype.__destroy__=function(){dz(this.hy)};\nfunction kC(a,c){a&&\"object\"===typeof a&&(a=a.hy);c&&\"object\"===typeof c&&(c=c.hy);this.hy=ez(a,c);h(kC)[this.hy]=this}kC.prototype=Object.create(VA.prototype);kC.prototype.constructor=kC;kC.prototype.iy=kC;kC.jy={};b.btCapsuleShapeZ=kC;kC.prototype.setMargin=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);fz(c,a)};kC.prototype.getMargin=function(){return gz(this.hy)};kC.prototype.getUpAxis=function(){return hz(this.hy)};kC.prototype.getRadius=function(){return iz(this.hy)};\nkC.prototype.getHalfHeight=function(){return jz(this.hy)};kC.prototype.setLocalScaling=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);kz(c,a)};kC.prototype.getLocalScaling=function(){return k(lz(this.hy),p)};kC.prototype.calculateLocalInertia=function(a,c){var d=this.hy;a&&\"object\"===typeof a&&(a=a.hy);c&&\"object\"===typeof c&&(c=c.hy);mz(d,a,c)};kC.prototype.__destroy__=function(){nz(this.hy)};function v(){throw\"cannot construct a btContactSolverInfo, no constructor in IDL\";}\nv.prototype=Object.create(f.prototype);v.prototype.constructor=v;v.prototype.iy=v;v.jy={};b.btContactSolverInfo=v;v.prototype.get_m_splitImpulse=v.prototype.YA=function(){return!!oz(this.hy)};v.prototype.set_m_splitImpulse=v.prototype.ED=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);pz(c,a)};Object.defineProperty(v.prototype,\"m_splitImpulse\",{get:v.prototype.YA,set:v.prototype.ED});v.prototype.get_m_splitImpulsePenetrationThreshold=v.prototype.ZA=function(){return qz(this.hy)};\nv.prototype.set_m_splitImpulsePenetrationThreshold=v.prototype.FD=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);rz(c,a)};Object.defineProperty(v.prototype,\"m_splitImpulsePenetrationThreshold\",{get:v.prototype.ZA,set:v.prototype.FD});v.prototype.get_m_numIterations=v.prototype.JA=function(){return sz(this.hy)};v.prototype.set_m_numIterations=v.prototype.pD=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);tz(c,a)};\nObject.defineProperty(v.prototype,\"m_numIterations\",{get:v.prototype.JA,set:v.prototype.pD});v.prototype.__destroy__=function(){uz(this.hy)};function lC(a,c,d,e,g){a&&\"object\"===typeof a&&(a=a.hy);c&&\"object\"===typeof c&&(c=c.hy);d&&\"object\"===typeof d&&(d=d.hy);e&&\"object\"===typeof e&&(e=e.hy);g&&\"object\"===typeof g&&(g=g.hy);this.hy=void 0===e?vz(a,c,d):void 0===g?_emscripten_bind_btGeneric6DofSpringConstraint_btGeneric6DofSpringConstraint_4(a,c,d,e):wz(a,c,d,e,g);h(lC)[this.hy]=this}\nlC.prototype=Object.create(eB.prototype);lC.prototype.constructor=lC;lC.prototype.iy=lC;lC.jy={};b.btGeneric6DofSpringConstraint=lC;lC.prototype.enableSpring=function(a,c){var d=this.hy;a&&\"object\"===typeof a&&(a=a.hy);c&&\"object\"===typeof c&&(c=c.hy);xz(d,a,c)};lC.prototype.setStiffness=function(a,c){var d=this.hy;a&&\"object\"===typeof a&&(a=a.hy);c&&\"object\"===typeof c&&(c=c.hy);yz(d,a,c)};\nlC.prototype.setDamping=function(a,c){var d=this.hy;a&&\"object\"===typeof a&&(a=a.hy);c&&\"object\"===typeof c&&(c=c.hy);zz(d,a,c)};lC.prototype.setEquilibriumPoint=function(a,c){var d=this.hy;a&&\"object\"===typeof a&&(a=a.hy);c&&\"object\"===typeof c&&(c=c.hy);void 0===a?Az(d):void 0===c?Bz(d,a):Cz(d,a,c)};lC.prototype.setLinearLowerLimit=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Dz(c,a)};\nlC.prototype.setLinearUpperLimit=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Ez(c,a)};lC.prototype.setAngularLowerLimit=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Fz(c,a)};lC.prototype.setAngularUpperLimit=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Gz(c,a)};lC.prototype.getFrameOffsetA=function(){return k(Hz(this.hy),r)};lC.prototype.enableFeedback=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Iz(c,a)};\nlC.prototype.getBreakingImpulseThreshold=function(){return Jz(this.hy)};lC.prototype.setBreakingImpulseThreshold=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Kz(c,a)};lC.prototype.getParam=function(a,c){var d=this.hy;a&&\"object\"===typeof a&&(a=a.hy);c&&\"object\"===typeof c&&(c=c.hy);return Lz(d,a,c)};lC.prototype.setParam=function(a,c,d){var e=this.hy;a&&\"object\"===typeof a&&(a=a.hy);c&&\"object\"===typeof c&&(c=c.hy);d&&\"object\"===typeof d&&(d=d.hy);Mz(e,a,c,d)};\nlC.prototype.__destroy__=function(){Nz(this.hy)};function mC(a){a&&\"object\"===typeof a&&(a=a.hy);this.hy=Oz(a);h(mC)[this.hy]=this}mC.prototype=Object.create(m.prototype);mC.prototype.constructor=mC;mC.prototype.iy=mC;mC.jy={};b.btSphereShape=mC;mC.prototype.setMargin=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Pz(c,a)};mC.prototype.getMargin=function(){return Qz(this.hy)};mC.prototype.setLocalScaling=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Rz(c,a)};\nmC.prototype.getLocalScaling=function(){return k(Sz(this.hy),p)};mC.prototype.calculateLocalInertia=function(a,c){var d=this.hy;a&&\"object\"===typeof a&&(a=a.hy);c&&\"object\"===typeof c&&(c=c.hy);Tz(d,a,c)};mC.prototype.__destroy__=function(){Uz(this.hy)};function Y(){throw\"cannot construct a Face, no constructor in IDL\";}Y.prototype=Object.create(f.prototype);Y.prototype.constructor=Y;Y.prototype.iy=Y;Y.jy={};b.Face=Y;\nY.prototype.get_m_n=Y.prototype.Hy=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);return k(Vz(c,a),Node)};Y.prototype.set_m_n=Y.prototype.Qy=function(a,c){var d=this.hy;IA();a&&\"object\"===typeof a&&(a=a.hy);c&&\"object\"===typeof c&&(c=c.hy);Wz(d,a,c)};Object.defineProperty(Y.prototype,\"m_n\",{get:Y.prototype.Hy,set:Y.prototype.Qy});Y.prototype.get_m_normal=Y.prototype.HA=function(){return k(Xz(this.hy),p)};\nY.prototype.set_m_normal=Y.prototype.nD=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);Yz(c,a)};Object.defineProperty(Y.prototype,\"m_normal\",{get:Y.prototype.HA,set:Y.prototype.nD});Y.prototype.get_m_ra=Y.prototype.PA=function(){return Zz(this.hy)};Y.prototype.set_m_ra=Y.prototype.vD=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);$z(c,a)};Object.defineProperty(Y.prototype,\"m_ra\",{get:Y.prototype.PA,set:Y.prototype.vD});Y.prototype.__destroy__=function(){aA(this.hy)};\nfunction UB(){throw\"cannot construct a tFaceArray, no constructor in IDL\";}UB.prototype=Object.create(f.prototype);UB.prototype.constructor=UB;UB.prototype.iy=UB;UB.jy={};b.tFaceArray=UB;UB.prototype.size=UB.prototype.size=function(){return bA(this.hy)};UB.prototype.at=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);return k(cA(c,a),Y)};UB.prototype.__destroy__=function(){dA(this.hy)};\nfunction Z(a,c,d,e,g){a&&\"object\"===typeof a&&(a=a.hy);c&&\"object\"===typeof c&&(c=c.hy);d&&\"object\"===typeof d&&(d=d.hy);e&&\"object\"===typeof e&&(e=e.hy);g&&\"object\"===typeof g&&(g=g.hy);this.hy=eA(a,c,d,e,g);h(Z)[this.hy]=this}Z.prototype=Object.create(f.prototype);Z.prototype.constructor=Z;Z.prototype.iy=Z;Z.jy={};b.LocalConvexResult=Z;Z.prototype.get_m_hitCollisionObject=Z.prototype.iA=function(){return k(fA(this.hy),q)};\nZ.prototype.set_m_hitCollisionObject=Z.prototype.PC=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);gA(c,a)};Object.defineProperty(Z.prototype,\"m_hitCollisionObject\",{get:Z.prototype.iA,set:Z.prototype.PC});Z.prototype.get_m_localShapeInfo=Z.prototype.CA=function(){return k(hA(this.hy),tB)};Z.prototype.set_m_localShapeInfo=Z.prototype.iD=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);iA(c,a)};Object.defineProperty(Z.prototype,\"m_localShapeInfo\",{get:Z.prototype.CA,set:Z.prototype.iD});\nZ.prototype.get_m_hitNormalLocal=Z.prototype.mA=function(){return k(jA(this.hy),p)};Z.prototype.set_m_hitNormalLocal=Z.prototype.TC=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);kA(c,a)};Object.defineProperty(Z.prototype,\"m_hitNormalLocal\",{get:Z.prototype.mA,set:Z.prototype.TC});Z.prototype.get_m_hitPointLocal=Z.prototype.oA=function(){return k(lA(this.hy),p)};Z.prototype.set_m_hitPointLocal=Z.prototype.VC=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);mA(c,a)};\nObject.defineProperty(Z.prototype,\"m_hitPointLocal\",{get:Z.prototype.oA,set:Z.prototype.VC});Z.prototype.get_m_hitFraction=Z.prototype.jA=function(){return nA(this.hy)};Z.prototype.set_m_hitFraction=Z.prototype.QC=function(a){var c=this.hy;a&&\"object\"===typeof a&&(a=a.hy);oA(c,a)};Object.defineProperty(Z.prototype,\"m_hitFraction\",{get:Z.prototype.jA,set:Z.prototype.QC});Z.prototype.__destroy__=function(){pA(this.hy)};\n(function(){function a(){b.BT_CONSTRAINT_ERP=qA();b.BT_CONSTRAINT_STOP_ERP=rA();b.BT_CONSTRAINT_CFM=sA();b.BT_CONSTRAINT_STOP_CFM=tA();b.PHY_FLOAT=uA();b.PHY_DOUBLE=vA();b.PHY_INTEGER=wA();b.PHY_SHORT=xA();b.PHY_FIXEDPOINT88=yA();b.PHY_UCHAR=zA()}Ka?a():Ia.unshift(a)})();this.Ammo=b;\n\n\n  return Ammo.ready\n}\n);\n})();\nif (typeof exports === 'object' && typeof module === 'object')\n      module.exports = Ammo;\n    else if (typeof define === 'function' && define['amd'])\n      define([], function() { return Ammo; });\n    else if (typeof exports === 'object')\n      exports[\"Ammo\"] = Ammo;\n    \n"
  },
  {
    "path": "examples/libs/basis/README.md",
    "content": "# Basis Universal GPU Texture Compression\n\nBasis Universal is a \"[supercompressed](http://gamma.cs.unc.edu/GST/gst.pdf)\"\nGPU texture and texture video compression system that outputs a highly\ncompressed intermediate file format (.basis) that can be quickly transcoded to\na wide variety of GPU texture compression formats.\n\n[GitHub](https://github.com/BinomialLLC/basis_universal)\n\n## Transcoders\n\nBasis Universal texture data may be used in two different file formats:\n`.basis` and `.ktx2`, where `ktx2` is a standardized wrapper around basis texture data.\n\nFor further documentation about the Basis compressor and transcoder, refer to\nthe [Basis GitHub repository](https://github.com/BinomialLLC/basis_universal).\n\nThe folder contains two files required for transcoding `.basis` or `.ktx2` textures:\n\n* `basis_transcoder.js` — JavaScript wrapper for the WebAssembly transcoder.\n* `basis_transcoder.wasm` — WebAssembly transcoder.\n\nBoth are dependencies of `KTX2Loader`:\n\n```js\nconst ktx2Loader = new KTX2Loader();\nktx2Loader.setTranscoderPath( 'examples/jsm/libs/basis/' );\nktx2Loader.detectSupport( renderer );\nktx2Loader.load( 'diffuse.ktx2', function ( texture ) {\n\n\tconst material = new THREE.MeshStandardMaterial( { map: texture } );\n\n}, function () {\n\n\tconsole.log( 'onProgress' );\n\n}, function ( e ) {\n\n\tconsole.error( e );\n\n} );\n```\n\n## License\n\n[Apache License 2.0](https://github.com/BinomialLLC/basis_universal/blob/master/LICENSE)\n"
  },
  {
    "path": "examples/libs/basis/basis_transcoder.js",
    "content": "\nvar BASIS = (() => {\n  var _scriptName = typeof document != 'undefined' ? document.currentScript?.src : undefined;\n  if (typeof __filename != 'undefined') _scriptName ||= __filename;\n  return (\nfunction(moduleArg = {}) {\n  var moduleRtn;\n\nvar Module=moduleArg;var readyPromiseResolve,readyPromiseReject;var readyPromise=new Promise((resolve,reject)=>{readyPromiseResolve=resolve;readyPromiseReject=reject});var ENVIRONMENT_IS_WEB=typeof window==\"object\";var ENVIRONMENT_IS_WORKER=typeof importScripts==\"function\";var ENVIRONMENT_IS_NODE=typeof process==\"object\"&&typeof process.versions==\"object\"&&typeof process.versions.node==\"string\";if(ENVIRONMENT_IS_NODE){}var moduleOverrides=Object.assign({},Module);var arguments_=[];var thisProgram=\"./this.program\";var quit_=(status,toThrow)=>{throw toThrow};var scriptDirectory=\"\";function locateFile(path){if(Module[\"locateFile\"]){return Module[\"locateFile\"](path,scriptDirectory)}return scriptDirectory+path}var readAsync,readBinary;if(ENVIRONMENT_IS_NODE){var fs=require(\"fs\");var nodePath=require(\"path\");scriptDirectory=__dirname+\"/\";readBinary=filename=>{filename=isFileURI(filename)?new URL(filename):nodePath.normalize(filename);var ret=fs.readFileSync(filename);return ret};readAsync=(filename,binary=true)=>{filename=isFileURI(filename)?new URL(filename):nodePath.normalize(filename);return new Promise((resolve,reject)=>{fs.readFile(filename,binary?undefined:\"utf8\",(err,data)=>{if(err)reject(err);else resolve(binary?data.buffer:data)})})};if(!Module[\"thisProgram\"]&&process.argv.length>1){thisProgram=process.argv[1].replace(/\\\\/g,\"/\")}arguments_=process.argv.slice(2);quit_=(status,toThrow)=>{process.exitCode=status;throw toThrow}}else if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){if(ENVIRONMENT_IS_WORKER){scriptDirectory=self.location.href}else if(typeof document!=\"undefined\"&&document.currentScript){scriptDirectory=document.currentScript.src}if(_scriptName){scriptDirectory=_scriptName}if(scriptDirectory.startsWith(\"blob:\")){scriptDirectory=\"\"}else{scriptDirectory=scriptDirectory.substr(0,scriptDirectory.replace(/[?#].*/,\"\").lastIndexOf(\"/\")+1)}{if(ENVIRONMENT_IS_WORKER){readBinary=url=>{var xhr=new XMLHttpRequest;xhr.open(\"GET\",url,false);xhr.responseType=\"arraybuffer\";xhr.send(null);return new Uint8Array(xhr.response)}}readAsync=url=>{if(isFileURI(url)){return new Promise((reject,resolve)=>{var xhr=new XMLHttpRequest;xhr.open(\"GET\",url,true);xhr.responseType=\"arraybuffer\";xhr.onload=()=>{if(xhr.status==200||xhr.status==0&&xhr.response){resolve(xhr.response)}reject(xhr.status)};xhr.onerror=reject;xhr.send(null)})}return fetch(url,{credentials:\"same-origin\"}).then(response=>{if(response.ok){return response.arrayBuffer()}return Promise.reject(new Error(response.status+\" : \"+response.url))})}}}else{}var out=Module[\"print\"]||console.log.bind(console);var err=Module[\"printErr\"]||console.error.bind(console);Object.assign(Module,moduleOverrides);moduleOverrides=null;if(Module[\"arguments\"])arguments_=Module[\"arguments\"];if(Module[\"thisProgram\"])thisProgram=Module[\"thisProgram\"];if(Module[\"quit\"])quit_=Module[\"quit\"];var wasmBinary;if(Module[\"wasmBinary\"])wasmBinary=Module[\"wasmBinary\"];var wasmMemory;var ABORT=false;var EXITSTATUS;var HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64;function updateMemoryViews(){var b=wasmMemory.buffer;Module[\"HEAP8\"]=HEAP8=new Int8Array(b);Module[\"HEAP16\"]=HEAP16=new Int16Array(b);Module[\"HEAPU8\"]=HEAPU8=new Uint8Array(b);Module[\"HEAPU16\"]=HEAPU16=new Uint16Array(b);Module[\"HEAP32\"]=HEAP32=new Int32Array(b);Module[\"HEAPU32\"]=HEAPU32=new Uint32Array(b);Module[\"HEAPF32\"]=HEAPF32=new Float32Array(b);Module[\"HEAPF64\"]=HEAPF64=new Float64Array(b)}var __ATPRERUN__=[];var __ATINIT__=[];var __ATPOSTRUN__=[];var runtimeInitialized=false;function preRun(){if(Module[\"preRun\"]){if(typeof Module[\"preRun\"]==\"function\")Module[\"preRun\"]=[Module[\"preRun\"]];while(Module[\"preRun\"].length){addOnPreRun(Module[\"preRun\"].shift())}}callRuntimeCallbacks(__ATPRERUN__)}function initRuntime(){runtimeInitialized=true;callRuntimeCallbacks(__ATINIT__)}function postRun(){if(Module[\"postRun\"]){if(typeof Module[\"postRun\"]==\"function\")Module[\"postRun\"]=[Module[\"postRun\"]];while(Module[\"postRun\"].length){addOnPostRun(Module[\"postRun\"].shift())}}callRuntimeCallbacks(__ATPOSTRUN__)}function addOnPreRun(cb){__ATPRERUN__.unshift(cb)}function addOnInit(cb){__ATINIT__.unshift(cb)}function addOnPostRun(cb){__ATPOSTRUN__.unshift(cb)}var runDependencies=0;var runDependencyWatcher=null;var dependenciesFulfilled=null;function addRunDependency(id){runDependencies++;Module[\"monitorRunDependencies\"]?.(runDependencies)}function removeRunDependency(id){runDependencies--;Module[\"monitorRunDependencies\"]?.(runDependencies);if(runDependencies==0){if(runDependencyWatcher!==null){clearInterval(runDependencyWatcher);runDependencyWatcher=null}if(dependenciesFulfilled){var callback=dependenciesFulfilled;dependenciesFulfilled=null;callback()}}}function abort(what){Module[\"onAbort\"]?.(what);what=\"Aborted(\"+what+\")\";err(what);ABORT=true;EXITSTATUS=1;what+=\". Build with -sASSERTIONS for more info.\";var e=new WebAssembly.RuntimeError(what);readyPromiseReject(e);throw e}var dataURIPrefix=\"data:application/octet-stream;base64,\";var isDataURI=filename=>filename.startsWith(dataURIPrefix);var isFileURI=filename=>filename.startsWith(\"file://\");function findWasmBinary(){var f=\"basis_transcoder.wasm\";if(!isDataURI(f)){return locateFile(f)}return f}var wasmBinaryFile;function getBinarySync(file){if(file==wasmBinaryFile&&wasmBinary){return new Uint8Array(wasmBinary)}if(readBinary){return readBinary(file)}throw\"both async and sync fetching of the wasm failed\"}function getBinaryPromise(binaryFile){if(!wasmBinary){return readAsync(binaryFile).then(response=>new Uint8Array(response),()=>getBinarySync(binaryFile))}return Promise.resolve().then(()=>getBinarySync(binaryFile))}function instantiateArrayBuffer(binaryFile,imports,receiver){return getBinaryPromise(binaryFile).then(binary=>WebAssembly.instantiate(binary,imports)).then(receiver,reason=>{err(`failed to asynchronously prepare wasm: ${reason}`);abort(reason)})}function instantiateAsync(binary,binaryFile,imports,callback){if(!binary&&typeof WebAssembly.instantiateStreaming==\"function\"&&!isDataURI(binaryFile)&&!isFileURI(binaryFile)&&!ENVIRONMENT_IS_NODE&&typeof fetch==\"function\"){return fetch(binaryFile,{credentials:\"same-origin\"}).then(response=>{var result=WebAssembly.instantiateStreaming(response,imports);return result.then(callback,function(reason){err(`wasm streaming compile failed: ${reason}`);err(\"falling back to ArrayBuffer instantiation\");return instantiateArrayBuffer(binaryFile,imports,callback)})})}return instantiateArrayBuffer(binaryFile,imports,callback)}function getWasmImports(){return{a:wasmImports}}function createWasm(){var info=getWasmImports();function receiveInstance(instance,module){wasmExports=instance.exports;wasmMemory=wasmExports[\"L\"];updateMemoryViews();wasmTable=wasmExports[\"P\"];addOnInit(wasmExports[\"M\"]);removeRunDependency(\"wasm-instantiate\");return wasmExports}addRunDependency(\"wasm-instantiate\");function receiveInstantiationResult(result){receiveInstance(result[\"instance\"])}if(Module[\"instantiateWasm\"]){try{return Module[\"instantiateWasm\"](info,receiveInstance)}catch(e){err(`Module.instantiateWasm callback failed with error: ${e}`);readyPromiseReject(e)}}if(!wasmBinaryFile)wasmBinaryFile=findWasmBinary();instantiateAsync(wasmBinary,wasmBinaryFile,info,receiveInstantiationResult).catch(readyPromiseReject);return{}}var callRuntimeCallbacks=callbacks=>{while(callbacks.length>0){callbacks.shift()(Module)}};var noExitRuntime=Module[\"noExitRuntime\"]||true;class ExceptionInfo{constructor(excPtr){this.excPtr=excPtr;this.ptr=excPtr-24}set_type(type){HEAPU32[this.ptr+4>>2]=type}get_type(){return HEAPU32[this.ptr+4>>2]}set_destructor(destructor){HEAPU32[this.ptr+8>>2]=destructor}get_destructor(){return HEAPU32[this.ptr+8>>2]}set_caught(caught){caught=caught?1:0;HEAP8[this.ptr+12]=caught}get_caught(){return HEAP8[this.ptr+12]!=0}set_rethrown(rethrown){rethrown=rethrown?1:0;HEAP8[this.ptr+13]=rethrown}get_rethrown(){return HEAP8[this.ptr+13]!=0}init(type,destructor){this.set_adjusted_ptr(0);this.set_type(type);this.set_destructor(destructor)}set_adjusted_ptr(adjustedPtr){HEAPU32[this.ptr+16>>2]=adjustedPtr}get_adjusted_ptr(){return HEAPU32[this.ptr+16>>2]}get_exception_ptr(){var isPointer=___cxa_is_pointer_type(this.get_type());if(isPointer){return HEAPU32[this.excPtr>>2]}var adjusted=this.get_adjusted_ptr();if(adjusted!==0)return adjusted;return this.excPtr}}var exceptionLast=0;var uncaughtExceptionCount=0;var ___cxa_throw=(ptr,type,destructor)=>{var info=new ExceptionInfo(ptr);info.init(type,destructor);exceptionLast=ptr;uncaughtExceptionCount++;throw exceptionLast};var __abort_js=()=>{abort(\"\")};var structRegistrations={};var runDestructors=destructors=>{while(destructors.length){var ptr=destructors.pop();var del=destructors.pop();del(ptr)}};function readPointer(pointer){return this[\"fromWireType\"](HEAPU32[pointer>>2])}var awaitingDependencies={};var registeredTypes={};var typeDependencies={};var InternalError;var throwInternalError=message=>{throw new InternalError(message)};var whenDependentTypesAreResolved=(myTypes,dependentTypes,getTypeConverters)=>{myTypes.forEach(function(type){typeDependencies[type]=dependentTypes});function onComplete(typeConverters){var myTypeConverters=getTypeConverters(typeConverters);if(myTypeConverters.length!==myTypes.length){throwInternalError(\"Mismatched type converter count\")}for(var i=0;i<myTypes.length;++i){registerType(myTypes[i],myTypeConverters[i])}}var typeConverters=new Array(dependentTypes.length);var unregisteredTypes=[];var registered=0;dependentTypes.forEach((dt,i)=>{if(registeredTypes.hasOwnProperty(dt)){typeConverters[i]=registeredTypes[dt]}else{unregisteredTypes.push(dt);if(!awaitingDependencies.hasOwnProperty(dt)){awaitingDependencies[dt]=[]}awaitingDependencies[dt].push(()=>{typeConverters[i]=registeredTypes[dt];++registered;if(registered===unregisteredTypes.length){onComplete(typeConverters)}})}});if(0===unregisteredTypes.length){onComplete(typeConverters)}};var __embind_finalize_value_object=structType=>{var reg=structRegistrations[structType];delete structRegistrations[structType];var rawConstructor=reg.rawConstructor;var rawDestructor=reg.rawDestructor;var fieldRecords=reg.fields;var fieldTypes=fieldRecords.map(field=>field.getterReturnType).concat(fieldRecords.map(field=>field.setterArgumentType));whenDependentTypesAreResolved([structType],fieldTypes,fieldTypes=>{var fields={};fieldRecords.forEach((field,i)=>{var fieldName=field.fieldName;var getterReturnType=fieldTypes[i];var getter=field.getter;var getterContext=field.getterContext;var setterArgumentType=fieldTypes[i+fieldRecords.length];var setter=field.setter;var setterContext=field.setterContext;fields[fieldName]={read:ptr=>getterReturnType[\"fromWireType\"](getter(getterContext,ptr)),write:(ptr,o)=>{var destructors=[];setter(setterContext,ptr,setterArgumentType[\"toWireType\"](destructors,o));runDestructors(destructors)}}});return[{name:reg.name,fromWireType:ptr=>{var rv={};for(var i in fields){rv[i]=fields[i].read(ptr)}rawDestructor(ptr);return rv},toWireType:(destructors,o)=>{for(var fieldName in fields){if(!(fieldName in o)){throw new TypeError(`Missing field: \"${fieldName}\"`)}}var ptr=rawConstructor();for(fieldName in fields){fields[fieldName].write(ptr,o[fieldName])}if(destructors!==null){destructors.push(rawDestructor,ptr)}return ptr},argPackAdvance:GenericWireTypeSize,readValueFromPointer:readPointer,destructorFunction:rawDestructor}]})};var __embind_register_bigint=(primitiveType,name,size,minRange,maxRange)=>{};var embind_init_charCodes=()=>{var codes=new Array(256);for(var i=0;i<256;++i){codes[i]=String.fromCharCode(i)}embind_charCodes=codes};var embind_charCodes;var readLatin1String=ptr=>{var ret=\"\";var c=ptr;while(HEAPU8[c]){ret+=embind_charCodes[HEAPU8[c++]]}return ret};var BindingError;var throwBindingError=message=>{throw new BindingError(message)};function sharedRegisterType(rawType,registeredInstance,options={}){var name=registeredInstance.name;if(!rawType){throwBindingError(`type \"${name}\" must have a positive integer typeid pointer`)}if(registeredTypes.hasOwnProperty(rawType)){if(options.ignoreDuplicateRegistrations){return}else{throwBindingError(`Cannot register type '${name}' twice`)}}registeredTypes[rawType]=registeredInstance;delete typeDependencies[rawType];if(awaitingDependencies.hasOwnProperty(rawType)){var callbacks=awaitingDependencies[rawType];delete awaitingDependencies[rawType];callbacks.forEach(cb=>cb())}}function registerType(rawType,registeredInstance,options={}){if(!(\"argPackAdvance\"in registeredInstance)){throw new TypeError(\"registerType registeredInstance requires argPackAdvance\")}return sharedRegisterType(rawType,registeredInstance,options)}var GenericWireTypeSize=8;var __embind_register_bool=(rawType,name,trueValue,falseValue)=>{name=readLatin1String(name);registerType(rawType,{name:name,fromWireType:function(wt){return!!wt},toWireType:function(destructors,o){return o?trueValue:falseValue},argPackAdvance:GenericWireTypeSize,readValueFromPointer:function(pointer){return this[\"fromWireType\"](HEAPU8[pointer])},destructorFunction:null})};var shallowCopyInternalPointer=o=>({count:o.count,deleteScheduled:o.deleteScheduled,preservePointerOnDelete:o.preservePointerOnDelete,ptr:o.ptr,ptrType:o.ptrType,smartPtr:o.smartPtr,smartPtrType:o.smartPtrType});var throwInstanceAlreadyDeleted=obj=>{function getInstanceTypeName(handle){return handle.$$.ptrType.registeredClass.name}throwBindingError(getInstanceTypeName(obj)+\" instance already deleted\")};var finalizationRegistry=false;var detachFinalizer=handle=>{};var runDestructor=$$=>{if($$.smartPtr){$$.smartPtrType.rawDestructor($$.smartPtr)}else{$$.ptrType.registeredClass.rawDestructor($$.ptr)}};var releaseClassHandle=$$=>{$$.count.value-=1;var toDelete=0===$$.count.value;if(toDelete){runDestructor($$)}};var downcastPointer=(ptr,ptrClass,desiredClass)=>{if(ptrClass===desiredClass){return ptr}if(undefined===desiredClass.baseClass){return null}var rv=downcastPointer(ptr,ptrClass,desiredClass.baseClass);if(rv===null){return null}return desiredClass.downcast(rv)};var registeredPointers={};var getInheritedInstanceCount=()=>Object.keys(registeredInstances).length;var getLiveInheritedInstances=()=>{var rv=[];for(var k in registeredInstances){if(registeredInstances.hasOwnProperty(k)){rv.push(registeredInstances[k])}}return rv};var deletionQueue=[];var flushPendingDeletes=()=>{while(deletionQueue.length){var obj=deletionQueue.pop();obj.$$.deleteScheduled=false;obj[\"delete\"]()}};var delayFunction;var setDelayFunction=fn=>{delayFunction=fn;if(deletionQueue.length&&delayFunction){delayFunction(flushPendingDeletes)}};var init_embind=()=>{Module[\"getInheritedInstanceCount\"]=getInheritedInstanceCount;Module[\"getLiveInheritedInstances\"]=getLiveInheritedInstances;Module[\"flushPendingDeletes\"]=flushPendingDeletes;Module[\"setDelayFunction\"]=setDelayFunction};var registeredInstances={};var getBasestPointer=(class_,ptr)=>{if(ptr===undefined){throwBindingError(\"ptr should not be undefined\")}while(class_.baseClass){ptr=class_.upcast(ptr);class_=class_.baseClass}return ptr};var getInheritedInstance=(class_,ptr)=>{ptr=getBasestPointer(class_,ptr);return registeredInstances[ptr]};var makeClassHandle=(prototype,record)=>{if(!record.ptrType||!record.ptr){throwInternalError(\"makeClassHandle requires ptr and ptrType\")}var hasSmartPtrType=!!record.smartPtrType;var hasSmartPtr=!!record.smartPtr;if(hasSmartPtrType!==hasSmartPtr){throwInternalError(\"Both smartPtrType and smartPtr must be specified\")}record.count={value:1};return attachFinalizer(Object.create(prototype,{$$:{value:record,writable:true}}))};function RegisteredPointer_fromWireType(ptr){var rawPointer=this.getPointee(ptr);if(!rawPointer){this.destructor(ptr);return null}var registeredInstance=getInheritedInstance(this.registeredClass,rawPointer);if(undefined!==registeredInstance){if(0===registeredInstance.$$.count.value){registeredInstance.$$.ptr=rawPointer;registeredInstance.$$.smartPtr=ptr;return registeredInstance[\"clone\"]()}else{var rv=registeredInstance[\"clone\"]();this.destructor(ptr);return rv}}function makeDefaultHandle(){if(this.isSmartPointer){return makeClassHandle(this.registeredClass.instancePrototype,{ptrType:this.pointeeType,ptr:rawPointer,smartPtrType:this,smartPtr:ptr})}else{return makeClassHandle(this.registeredClass.instancePrototype,{ptrType:this,ptr:ptr})}}var actualType=this.registeredClass.getActualType(rawPointer);var registeredPointerRecord=registeredPointers[actualType];if(!registeredPointerRecord){return makeDefaultHandle.call(this)}var toType;if(this.isConst){toType=registeredPointerRecord.constPointerType}else{toType=registeredPointerRecord.pointerType}var dp=downcastPointer(rawPointer,this.registeredClass,toType.registeredClass);if(dp===null){return makeDefaultHandle.call(this)}if(this.isSmartPointer){return makeClassHandle(toType.registeredClass.instancePrototype,{ptrType:toType,ptr:dp,smartPtrType:this,smartPtr:ptr})}else{return makeClassHandle(toType.registeredClass.instancePrototype,{ptrType:toType,ptr:dp})}}var attachFinalizer=handle=>{if(\"undefined\"===typeof FinalizationRegistry){attachFinalizer=handle=>handle;return handle}finalizationRegistry=new FinalizationRegistry(info=>{releaseClassHandle(info.$$)});attachFinalizer=handle=>{var $$=handle.$$;var hasSmartPtr=!!$$.smartPtr;if(hasSmartPtr){var info={$$:$$};finalizationRegistry.register(handle,info,handle)}return handle};detachFinalizer=handle=>finalizationRegistry.unregister(handle);return attachFinalizer(handle)};var init_ClassHandle=()=>{Object.assign(ClassHandle.prototype,{isAliasOf(other){if(!(this instanceof ClassHandle)){return false}if(!(other instanceof ClassHandle)){return false}var leftClass=this.$$.ptrType.registeredClass;var left=this.$$.ptr;other.$$=other.$$;var rightClass=other.$$.ptrType.registeredClass;var right=other.$$.ptr;while(leftClass.baseClass){left=leftClass.upcast(left);leftClass=leftClass.baseClass}while(rightClass.baseClass){right=rightClass.upcast(right);rightClass=rightClass.baseClass}return leftClass===rightClass&&left===right},clone(){if(!this.$$.ptr){throwInstanceAlreadyDeleted(this)}if(this.$$.preservePointerOnDelete){this.$$.count.value+=1;return this}else{var clone=attachFinalizer(Object.create(Object.getPrototypeOf(this),{$$:{value:shallowCopyInternalPointer(this.$$)}}));clone.$$.count.value+=1;clone.$$.deleteScheduled=false;return clone}},delete(){if(!this.$$.ptr){throwInstanceAlreadyDeleted(this)}if(this.$$.deleteScheduled&&!this.$$.preservePointerOnDelete){throwBindingError(\"Object already scheduled for deletion\")}detachFinalizer(this);releaseClassHandle(this.$$);if(!this.$$.preservePointerOnDelete){this.$$.smartPtr=undefined;this.$$.ptr=undefined}},isDeleted(){return!this.$$.ptr},deleteLater(){if(!this.$$.ptr){throwInstanceAlreadyDeleted(this)}if(this.$$.deleteScheduled&&!this.$$.preservePointerOnDelete){throwBindingError(\"Object already scheduled for deletion\")}deletionQueue.push(this);if(deletionQueue.length===1&&delayFunction){delayFunction(flushPendingDeletes)}this.$$.deleteScheduled=true;return this}})};function ClassHandle(){}var createNamedFunction=(name,body)=>Object.defineProperty(body,\"name\",{value:name});var ensureOverloadTable=(proto,methodName,humanName)=>{if(undefined===proto[methodName].overloadTable){var prevFunc=proto[methodName];proto[methodName]=function(...args){if(!proto[methodName].overloadTable.hasOwnProperty(args.length)){throwBindingError(`Function '${humanName}' called with an invalid number of arguments (${args.length}) - expects one of (${proto[methodName].overloadTable})!`)}return proto[methodName].overloadTable[args.length].apply(this,args)};proto[methodName].overloadTable=[];proto[methodName].overloadTable[prevFunc.argCount]=prevFunc}};var exposePublicSymbol=(name,value,numArguments)=>{if(Module.hasOwnProperty(name)){if(undefined===numArguments||undefined!==Module[name].overloadTable&&undefined!==Module[name].overloadTable[numArguments]){throwBindingError(`Cannot register public name '${name}' twice`)}ensureOverloadTable(Module,name,name);if(Module.hasOwnProperty(numArguments)){throwBindingError(`Cannot register multiple overloads of a function with the same number of arguments (${numArguments})!`)}Module[name].overloadTable[numArguments]=value}else{Module[name]=value;if(undefined!==numArguments){Module[name].numArguments=numArguments}}};var char_0=48;var char_9=57;var makeLegalFunctionName=name=>{if(undefined===name){return\"_unknown\"}name=name.replace(/[^a-zA-Z0-9_]/g,\"$\");var f=name.charCodeAt(0);if(f>=char_0&&f<=char_9){return`_${name}`}return name};function RegisteredClass(name,constructor,instancePrototype,rawDestructor,baseClass,getActualType,upcast,downcast){this.name=name;this.constructor=constructor;this.instancePrototype=instancePrototype;this.rawDestructor=rawDestructor;this.baseClass=baseClass;this.getActualType=getActualType;this.upcast=upcast;this.downcast=downcast;this.pureVirtualFunctions=[]}var upcastPointer=(ptr,ptrClass,desiredClass)=>{while(ptrClass!==desiredClass){if(!ptrClass.upcast){throwBindingError(`Expected null or instance of ${desiredClass.name}, got an instance of ${ptrClass.name}`)}ptr=ptrClass.upcast(ptr);ptrClass=ptrClass.baseClass}return ptr};function constNoSmartPtrRawPointerToWireType(destructors,handle){if(handle===null){if(this.isReference){throwBindingError(`null is not a valid ${this.name}`)}return 0}if(!handle.$$){throwBindingError(`Cannot pass \"${embindRepr(handle)}\" as a ${this.name}`)}if(!handle.$$.ptr){throwBindingError(`Cannot pass deleted object as a pointer of type ${this.name}`)}var handleClass=handle.$$.ptrType.registeredClass;var ptr=upcastPointer(handle.$$.ptr,handleClass,this.registeredClass);return ptr}function genericPointerToWireType(destructors,handle){var ptr;if(handle===null){if(this.isReference){throwBindingError(`null is not a valid ${this.name}`)}if(this.isSmartPointer){ptr=this.rawConstructor();if(destructors!==null){destructors.push(this.rawDestructor,ptr)}return ptr}else{return 0}}if(!handle||!handle.$$){throwBindingError(`Cannot pass \"${embindRepr(handle)}\" as a ${this.name}`)}if(!handle.$$.ptr){throwBindingError(`Cannot pass deleted object as a pointer of type ${this.name}`)}if(!this.isConst&&handle.$$.ptrType.isConst){throwBindingError(`Cannot convert argument of type ${handle.$$.smartPtrType?handle.$$.smartPtrType.name:handle.$$.ptrType.name} to parameter type ${this.name}`)}var handleClass=handle.$$.ptrType.registeredClass;ptr=upcastPointer(handle.$$.ptr,handleClass,this.registeredClass);if(this.isSmartPointer){if(undefined===handle.$$.smartPtr){throwBindingError(\"Passing raw pointer to smart pointer is illegal\")}switch(this.sharingPolicy){case 0:if(handle.$$.smartPtrType===this){ptr=handle.$$.smartPtr}else{throwBindingError(`Cannot convert argument of type ${handle.$$.smartPtrType?handle.$$.smartPtrType.name:handle.$$.ptrType.name} to parameter type ${this.name}`)}break;case 1:ptr=handle.$$.smartPtr;break;case 2:if(handle.$$.smartPtrType===this){ptr=handle.$$.smartPtr}else{var clonedHandle=handle[\"clone\"]();ptr=this.rawShare(ptr,Emval.toHandle(()=>clonedHandle[\"delete\"]()));if(destructors!==null){destructors.push(this.rawDestructor,ptr)}}break;default:throwBindingError(\"Unsupporting sharing policy\")}}return ptr}function nonConstNoSmartPtrRawPointerToWireType(destructors,handle){if(handle===null){if(this.isReference){throwBindingError(`null is not a valid ${this.name}`)}return 0}if(!handle.$$){throwBindingError(`Cannot pass \"${embindRepr(handle)}\" as a ${this.name}`)}if(!handle.$$.ptr){throwBindingError(`Cannot pass deleted object as a pointer of type ${this.name}`)}if(handle.$$.ptrType.isConst){throwBindingError(`Cannot convert argument of type ${handle.$$.ptrType.name} to parameter type ${this.name}`)}var handleClass=handle.$$.ptrType.registeredClass;var ptr=upcastPointer(handle.$$.ptr,handleClass,this.registeredClass);return ptr}var init_RegisteredPointer=()=>{Object.assign(RegisteredPointer.prototype,{getPointee(ptr){if(this.rawGetPointee){ptr=this.rawGetPointee(ptr)}return ptr},destructor(ptr){this.rawDestructor?.(ptr)},argPackAdvance:GenericWireTypeSize,readValueFromPointer:readPointer,fromWireType:RegisteredPointer_fromWireType})};function RegisteredPointer(name,registeredClass,isReference,isConst,isSmartPointer,pointeeType,sharingPolicy,rawGetPointee,rawConstructor,rawShare,rawDestructor){this.name=name;this.registeredClass=registeredClass;this.isReference=isReference;this.isConst=isConst;this.isSmartPointer=isSmartPointer;this.pointeeType=pointeeType;this.sharingPolicy=sharingPolicy;this.rawGetPointee=rawGetPointee;this.rawConstructor=rawConstructor;this.rawShare=rawShare;this.rawDestructor=rawDestructor;if(!isSmartPointer&&registeredClass.baseClass===undefined){if(isConst){this[\"toWireType\"]=constNoSmartPtrRawPointerToWireType;this.destructorFunction=null}else{this[\"toWireType\"]=nonConstNoSmartPtrRawPointerToWireType;this.destructorFunction=null}}else{this[\"toWireType\"]=genericPointerToWireType}}var replacePublicSymbol=(name,value,numArguments)=>{if(!Module.hasOwnProperty(name)){throwInternalError(\"Replacing nonexistent public symbol\")}if(undefined!==Module[name].overloadTable&&undefined!==numArguments){Module[name].overloadTable[numArguments]=value}else{Module[name]=value;Module[name].argCount=numArguments}};var dynCallLegacy=(sig,ptr,args)=>{sig=sig.replace(/p/g,\"i\");var f=Module[\"dynCall_\"+sig];return f(ptr,...args)};var wasmTableMirror=[];var wasmTable;var getWasmTableEntry=funcPtr=>{var func=wasmTableMirror[funcPtr];if(!func){if(funcPtr>=wasmTableMirror.length)wasmTableMirror.length=funcPtr+1;wasmTableMirror[funcPtr]=func=wasmTable.get(funcPtr)}return func};var dynCall=(sig,ptr,args=[])=>{if(sig.includes(\"j\")){return dynCallLegacy(sig,ptr,args)}var rtn=getWasmTableEntry(ptr)(...args);return rtn};var getDynCaller=(sig,ptr)=>(...args)=>dynCall(sig,ptr,args);var embind__requireFunction=(signature,rawFunction)=>{signature=readLatin1String(signature);function makeDynCaller(){if(signature.includes(\"j\")){return getDynCaller(signature,rawFunction)}return getWasmTableEntry(rawFunction)}var fp=makeDynCaller();if(typeof fp!=\"function\"){throwBindingError(`unknown function pointer with signature ${signature}: ${rawFunction}`)}return fp};var extendError=(baseErrorType,errorName)=>{var errorClass=createNamedFunction(errorName,function(message){this.name=errorName;this.message=message;var stack=new Error(message).stack;if(stack!==undefined){this.stack=this.toString()+\"\\n\"+stack.replace(/^Error(:[^\\n]*)?\\n/,\"\")}});errorClass.prototype=Object.create(baseErrorType.prototype);errorClass.prototype.constructor=errorClass;errorClass.prototype.toString=function(){if(this.message===undefined){return this.name}else{return`${this.name}: ${this.message}`}};return errorClass};var UnboundTypeError;var getTypeName=type=>{var ptr=___getTypeName(type);var rv=readLatin1String(ptr);_free(ptr);return rv};var throwUnboundTypeError=(message,types)=>{var unboundTypes=[];var seen={};function visit(type){if(seen[type]){return}if(registeredTypes[type]){return}if(typeDependencies[type]){typeDependencies[type].forEach(visit);return}unboundTypes.push(type);seen[type]=true}types.forEach(visit);throw new UnboundTypeError(`${message}: `+unboundTypes.map(getTypeName).join([\", \"]))};var __embind_register_class=(rawType,rawPointerType,rawConstPointerType,baseClassRawType,getActualTypeSignature,getActualType,upcastSignature,upcast,downcastSignature,downcast,name,destructorSignature,rawDestructor)=>{name=readLatin1String(name);getActualType=embind__requireFunction(getActualTypeSignature,getActualType);upcast&&=embind__requireFunction(upcastSignature,upcast);downcast&&=embind__requireFunction(downcastSignature,downcast);rawDestructor=embind__requireFunction(destructorSignature,rawDestructor);var legalFunctionName=makeLegalFunctionName(name);exposePublicSymbol(legalFunctionName,function(){throwUnboundTypeError(`Cannot construct ${name} due to unbound types`,[baseClassRawType])});whenDependentTypesAreResolved([rawType,rawPointerType,rawConstPointerType],baseClassRawType?[baseClassRawType]:[],base=>{base=base[0];var baseClass;var basePrototype;if(baseClassRawType){baseClass=base.registeredClass;basePrototype=baseClass.instancePrototype}else{basePrototype=ClassHandle.prototype}var constructor=createNamedFunction(name,function(...args){if(Object.getPrototypeOf(this)!==instancePrototype){throw new BindingError(\"Use 'new' to construct \"+name)}if(undefined===registeredClass.constructor_body){throw new BindingError(name+\" has no accessible constructor\")}var body=registeredClass.constructor_body[args.length];if(undefined===body){throw new BindingError(`Tried to invoke ctor of ${name} with invalid number of parameters (${args.length}) - expected (${Object.keys(registeredClass.constructor_body).toString()}) parameters instead!`)}return body.apply(this,args)});var instancePrototype=Object.create(basePrototype,{constructor:{value:constructor}});constructor.prototype=instancePrototype;var registeredClass=new RegisteredClass(name,constructor,instancePrototype,rawDestructor,baseClass,getActualType,upcast,downcast);if(registeredClass.baseClass){registeredClass.baseClass.__derivedClasses??=[];registeredClass.baseClass.__derivedClasses.push(registeredClass)}var referenceConverter=new RegisteredPointer(name,registeredClass,true,false,false);var pointerConverter=new RegisteredPointer(name+\"*\",registeredClass,false,false,false);var constPointerConverter=new RegisteredPointer(name+\" const*\",registeredClass,false,true,false);registeredPointers[rawType]={pointerType:pointerConverter,constPointerType:constPointerConverter};replacePublicSymbol(legalFunctionName,constructor);return[referenceConverter,pointerConverter,constPointerConverter]})};var heap32VectorToArray=(count,firstElement)=>{var array=[];for(var i=0;i<count;i++){array.push(HEAPU32[firstElement+i*4>>2])}return array};function usesDestructorStack(argTypes){for(var i=1;i<argTypes.length;++i){if(argTypes[i]!==null&&argTypes[i].destructorFunction===undefined){return true}}return false}function newFunc(constructor,argumentList){if(!(constructor instanceof Function)){throw new TypeError(`new_ called with constructor type ${typeof constructor} which is not a function`)}var dummy=createNamedFunction(constructor.name||\"unknownFunctionName\",function(){});dummy.prototype=constructor.prototype;var obj=new dummy;var r=constructor.apply(obj,argumentList);return r instanceof Object?r:obj}function createJsInvoker(argTypes,isClassMethodFunc,returns,isAsync){var needsDestructorStack=usesDestructorStack(argTypes);var argCount=argTypes.length;var argsList=\"\";var argsListWired=\"\";for(var i=0;i<argCount-2;++i){argsList+=(i!==0?\", \":\"\")+\"arg\"+i;argsListWired+=(i!==0?\", \":\"\")+\"arg\"+i+\"Wired\"}var invokerFnBody=`\\n        return function (${argsList}) {\\n        if (arguments.length !== ${argCount-2}) {\\n          throwBindingError('function ' + humanName + ' called with ' + arguments.length + ' arguments, expected ${argCount-2}');\\n        }`;if(needsDestructorStack){invokerFnBody+=\"var destructors = [];\\n\"}var dtorStack=needsDestructorStack?\"destructors\":\"null\";var args1=[\"humanName\",\"throwBindingError\",\"invoker\",\"fn\",\"runDestructors\",\"retType\",\"classParam\"];if(isClassMethodFunc){invokerFnBody+=\"var thisWired = classParam['toWireType'](\"+dtorStack+\", this);\\n\"}for(var i=0;i<argCount-2;++i){invokerFnBody+=\"var arg\"+i+\"Wired = argType\"+i+\"['toWireType'](\"+dtorStack+\", arg\"+i+\");\\n\";args1.push(\"argType\"+i)}if(isClassMethodFunc){argsListWired=\"thisWired\"+(argsListWired.length>0?\", \":\"\")+argsListWired}invokerFnBody+=(returns||isAsync?\"var rv = \":\"\")+\"invoker(fn\"+(argsListWired.length>0?\", \":\"\")+argsListWired+\");\\n\";if(needsDestructorStack){invokerFnBody+=\"runDestructors(destructors);\\n\"}else{for(var i=isClassMethodFunc?1:2;i<argTypes.length;++i){var paramName=i===1?\"thisWired\":\"arg\"+(i-2)+\"Wired\";if(argTypes[i].destructorFunction!==null){invokerFnBody+=`${paramName}_dtor(${paramName});\\n`;args1.push(`${paramName}_dtor`)}}}if(returns){invokerFnBody+=\"var ret = retType['fromWireType'](rv);\\n\"+\"return ret;\\n\"}else{}invokerFnBody+=\"}\\n\";return[args1,invokerFnBody]}function craftInvokerFunction(humanName,argTypes,classType,cppInvokerFunc,cppTargetFunc,isAsync){var argCount=argTypes.length;if(argCount<2){throwBindingError(\"argTypes array size mismatch! Must at least get return value and 'this' types!\")}var isClassMethodFunc=argTypes[1]!==null&&classType!==null;var needsDestructorStack=usesDestructorStack(argTypes);var returns=argTypes[0].name!==\"void\";var closureArgs=[humanName,throwBindingError,cppInvokerFunc,cppTargetFunc,runDestructors,argTypes[0],argTypes[1]];for(var i=0;i<argCount-2;++i){closureArgs.push(argTypes[i+2])}if(!needsDestructorStack){for(var i=isClassMethodFunc?1:2;i<argTypes.length;++i){if(argTypes[i].destructorFunction!==null){closureArgs.push(argTypes[i].destructorFunction)}}}let[args,invokerFnBody]=createJsInvoker(argTypes,isClassMethodFunc,returns,isAsync);args.push(invokerFnBody);var invokerFn=newFunc(Function,args)(...closureArgs);return createNamedFunction(humanName,invokerFn)}var __embind_register_class_constructor=(rawClassType,argCount,rawArgTypesAddr,invokerSignature,invoker,rawConstructor)=>{var rawArgTypes=heap32VectorToArray(argCount,rawArgTypesAddr);invoker=embind__requireFunction(invokerSignature,invoker);whenDependentTypesAreResolved([],[rawClassType],classType=>{classType=classType[0];var humanName=`constructor ${classType.name}`;if(undefined===classType.registeredClass.constructor_body){classType.registeredClass.constructor_body=[]}if(undefined!==classType.registeredClass.constructor_body[argCount-1]){throw new BindingError(`Cannot register multiple constructors with identical number of parameters (${argCount-1}) for class '${classType.name}'! Overload resolution is currently only performed using the parameter count, not actual type info!`)}classType.registeredClass.constructor_body[argCount-1]=()=>{throwUnboundTypeError(`Cannot construct ${classType.name} due to unbound types`,rawArgTypes)};whenDependentTypesAreResolved([],rawArgTypes,argTypes=>{argTypes.splice(1,0,null);classType.registeredClass.constructor_body[argCount-1]=craftInvokerFunction(humanName,argTypes,null,invoker,rawConstructor);return[]});return[]})};var getFunctionName=signature=>{signature=signature.trim();const argsIndex=signature.indexOf(\"(\");if(argsIndex!==-1){return signature.substr(0,argsIndex)}else{return signature}};var __embind_register_class_function=(rawClassType,methodName,argCount,rawArgTypesAddr,invokerSignature,rawInvoker,context,isPureVirtual,isAsync)=>{var rawArgTypes=heap32VectorToArray(argCount,rawArgTypesAddr);methodName=readLatin1String(methodName);methodName=getFunctionName(methodName);rawInvoker=embind__requireFunction(invokerSignature,rawInvoker);whenDependentTypesAreResolved([],[rawClassType],classType=>{classType=classType[0];var humanName=`${classType.name}.${methodName}`;if(methodName.startsWith(\"@@\")){methodName=Symbol[methodName.substring(2)]}if(isPureVirtual){classType.registeredClass.pureVirtualFunctions.push(methodName)}function unboundTypesHandler(){throwUnboundTypeError(`Cannot call ${humanName} due to unbound types`,rawArgTypes)}var proto=classType.registeredClass.instancePrototype;var method=proto[methodName];if(undefined===method||undefined===method.overloadTable&&method.className!==classType.name&&method.argCount===argCount-2){unboundTypesHandler.argCount=argCount-2;unboundTypesHandler.className=classType.name;proto[methodName]=unboundTypesHandler}else{ensureOverloadTable(proto,methodName,humanName);proto[methodName].overloadTable[argCount-2]=unboundTypesHandler}whenDependentTypesAreResolved([],rawArgTypes,argTypes=>{var memberFunction=craftInvokerFunction(humanName,argTypes,classType,rawInvoker,context,isAsync);if(undefined===proto[methodName].overloadTable){memberFunction.argCount=argCount-2;proto[methodName]=memberFunction}else{proto[methodName].overloadTable[argCount-2]=memberFunction}return[]});return[]})};var __embind_register_constant=(name,type,value)=>{name=readLatin1String(name);whenDependentTypesAreResolved([],[type],type=>{type=type[0];Module[name]=type[\"fromWireType\"](value);return[]})};var emval_freelist=[];var emval_handles=[];var __emval_decref=handle=>{if(handle>9&&0===--emval_handles[handle+1]){emval_handles[handle]=undefined;emval_freelist.push(handle)}};var count_emval_handles=()=>emval_handles.length/2-5-emval_freelist.length;var init_emval=()=>{emval_handles.push(0,1,undefined,1,null,1,true,1,false,1);Module[\"count_emval_handles\"]=count_emval_handles};var Emval={toValue:handle=>{if(!handle){throwBindingError(\"Cannot use deleted val. handle = \"+handle)}return emval_handles[handle]},toHandle:value=>{switch(value){case undefined:return 2;case null:return 4;case true:return 6;case false:return 8;default:{const handle=emval_freelist.pop()||emval_handles.length;emval_handles[handle]=value;emval_handles[handle+1]=1;return handle}}}};var EmValType={name:\"emscripten::val\",fromWireType:handle=>{var rv=Emval.toValue(handle);__emval_decref(handle);return rv},toWireType:(destructors,value)=>Emval.toHandle(value),argPackAdvance:GenericWireTypeSize,readValueFromPointer:readPointer,destructorFunction:null};var __embind_register_emval=rawType=>registerType(rawType,EmValType);var enumReadValueFromPointer=(name,width,signed)=>{switch(width){case 1:return signed?function(pointer){return this[\"fromWireType\"](HEAP8[pointer])}:function(pointer){return this[\"fromWireType\"](HEAPU8[pointer])};case 2:return signed?function(pointer){return this[\"fromWireType\"](HEAP16[pointer>>1])}:function(pointer){return this[\"fromWireType\"](HEAPU16[pointer>>1])};case 4:return signed?function(pointer){return this[\"fromWireType\"](HEAP32[pointer>>2])}:function(pointer){return this[\"fromWireType\"](HEAPU32[pointer>>2])};default:throw new TypeError(`invalid integer width (${width}): ${name}`)}};var __embind_register_enum=(rawType,name,size,isSigned)=>{name=readLatin1String(name);function ctor(){}ctor.values={};registerType(rawType,{name:name,constructor:ctor,fromWireType:function(c){return this.constructor.values[c]},toWireType:(destructors,c)=>c.value,argPackAdvance:GenericWireTypeSize,readValueFromPointer:enumReadValueFromPointer(name,size,isSigned),destructorFunction:null});exposePublicSymbol(name,ctor)};var requireRegisteredType=(rawType,humanName)=>{var impl=registeredTypes[rawType];if(undefined===impl){throwBindingError(`${humanName} has unknown type ${getTypeName(rawType)}`)}return impl};var __embind_register_enum_value=(rawEnumType,name,enumValue)=>{var enumType=requireRegisteredType(rawEnumType,\"enum\");name=readLatin1String(name);var Enum=enumType.constructor;var Value=Object.create(enumType.constructor.prototype,{value:{value:enumValue},constructor:{value:createNamedFunction(`${enumType.name}_${name}`,function(){})}});Enum.values[enumValue]=Value;Enum[name]=Value};var embindRepr=v=>{if(v===null){return\"null\"}var t=typeof v;if(t===\"object\"||t===\"array\"||t===\"function\"){return v.toString()}else{return\"\"+v}};var floatReadValueFromPointer=(name,width)=>{switch(width){case 4:return function(pointer){return this[\"fromWireType\"](HEAPF32[pointer>>2])};case 8:return function(pointer){return this[\"fromWireType\"](HEAPF64[pointer>>3])};default:throw new TypeError(`invalid float width (${width}): ${name}`)}};var __embind_register_float=(rawType,name,size)=>{name=readLatin1String(name);registerType(rawType,{name:name,fromWireType:value=>value,toWireType:(destructors,value)=>value,argPackAdvance:GenericWireTypeSize,readValueFromPointer:floatReadValueFromPointer(name,size),destructorFunction:null})};var __embind_register_function=(name,argCount,rawArgTypesAddr,signature,rawInvoker,fn,isAsync)=>{var argTypes=heap32VectorToArray(argCount,rawArgTypesAddr);name=readLatin1String(name);name=getFunctionName(name);rawInvoker=embind__requireFunction(signature,rawInvoker);exposePublicSymbol(name,function(){throwUnboundTypeError(`Cannot call ${name} due to unbound types`,argTypes)},argCount-1);whenDependentTypesAreResolved([],argTypes,argTypes=>{var invokerArgsArray=[argTypes[0],null].concat(argTypes.slice(1));replacePublicSymbol(name,craftInvokerFunction(name,invokerArgsArray,null,rawInvoker,fn,isAsync),argCount-1);return[]})};var integerReadValueFromPointer=(name,width,signed)=>{switch(width){case 1:return signed?pointer=>HEAP8[pointer]:pointer=>HEAPU8[pointer];case 2:return signed?pointer=>HEAP16[pointer>>1]:pointer=>HEAPU16[pointer>>1];case 4:return signed?pointer=>HEAP32[pointer>>2]:pointer=>HEAPU32[pointer>>2];default:throw new TypeError(`invalid integer width (${width}): ${name}`)}};var __embind_register_integer=(primitiveType,name,size,minRange,maxRange)=>{name=readLatin1String(name);if(maxRange===-1){maxRange=4294967295}var fromWireType=value=>value;if(minRange===0){var bitshift=32-8*size;fromWireType=value=>value<<bitshift>>>bitshift}var isUnsignedType=name.includes(\"unsigned\");var checkAssertions=(value,toTypeName)=>{};var toWireType;if(isUnsignedType){toWireType=function(destructors,value){checkAssertions(value,this.name);return value>>>0}}else{toWireType=function(destructors,value){checkAssertions(value,this.name);return value}}registerType(primitiveType,{name:name,fromWireType:fromWireType,toWireType:toWireType,argPackAdvance:GenericWireTypeSize,readValueFromPointer:integerReadValueFromPointer(name,size,minRange!==0),destructorFunction:null})};var __embind_register_memory_view=(rawType,dataTypeIndex,name)=>{var typeMapping=[Int8Array,Uint8Array,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array];var TA=typeMapping[dataTypeIndex];function decodeMemoryView(handle){var size=HEAPU32[handle>>2];var data=HEAPU32[handle+4>>2];return new TA(HEAP8.buffer,data,size)}name=readLatin1String(name);registerType(rawType,{name:name,fromWireType:decodeMemoryView,argPackAdvance:GenericWireTypeSize,readValueFromPointer:decodeMemoryView},{ignoreDuplicateRegistrations:true})};var stringToUTF8Array=(str,heap,outIdx,maxBytesToWrite)=>{if(!(maxBytesToWrite>0))return 0;var startIdx=outIdx;var endIdx=outIdx+maxBytesToWrite-1;for(var i=0;i<str.length;++i){var u=str.charCodeAt(i);if(u>=55296&&u<=57343){var u1=str.charCodeAt(++i);u=65536+((u&1023)<<10)|u1&1023}if(u<=127){if(outIdx>=endIdx)break;heap[outIdx++]=u}else if(u<=2047){if(outIdx+1>=endIdx)break;heap[outIdx++]=192|u>>6;heap[outIdx++]=128|u&63}else if(u<=65535){if(outIdx+2>=endIdx)break;heap[outIdx++]=224|u>>12;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}else{if(outIdx+3>=endIdx)break;heap[outIdx++]=240|u>>18;heap[outIdx++]=128|u>>12&63;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}}heap[outIdx]=0;return outIdx-startIdx};var stringToUTF8=(str,outPtr,maxBytesToWrite)=>stringToUTF8Array(str,HEAPU8,outPtr,maxBytesToWrite);var lengthBytesUTF8=str=>{var len=0;for(var i=0;i<str.length;++i){var c=str.charCodeAt(i);if(c<=127){len++}else if(c<=2047){len+=2}else if(c>=55296&&c<=57343){len+=4;++i}else{len+=3}}return len};var UTF8Decoder=typeof TextDecoder!=\"undefined\"?new TextDecoder:undefined;var UTF8ArrayToString=(heapOrArray,idx,maxBytesToRead)=>{var endIdx=idx+maxBytesToRead;var endPtr=idx;while(heapOrArray[endPtr]&&!(endPtr>=endIdx))++endPtr;if(endPtr-idx>16&&heapOrArray.buffer&&UTF8Decoder){return UTF8Decoder.decode(heapOrArray.subarray(idx,endPtr))}var str=\"\";while(idx<endPtr){var u0=heapOrArray[idx++];if(!(u0&128)){str+=String.fromCharCode(u0);continue}var u1=heapOrArray[idx++]&63;if((u0&224)==192){str+=String.fromCharCode((u0&31)<<6|u1);continue}var u2=heapOrArray[idx++]&63;if((u0&240)==224){u0=(u0&15)<<12|u1<<6|u2}else{u0=(u0&7)<<18|u1<<12|u2<<6|heapOrArray[idx++]&63}if(u0<65536){str+=String.fromCharCode(u0)}else{var ch=u0-65536;str+=String.fromCharCode(55296|ch>>10,56320|ch&1023)}}return str};var UTF8ToString=(ptr,maxBytesToRead)=>ptr?UTF8ArrayToString(HEAPU8,ptr,maxBytesToRead):\"\";var __embind_register_std_string=(rawType,name)=>{name=readLatin1String(name);var stdStringIsUTF8=name===\"std::string\";registerType(rawType,{name:name,fromWireType(value){var length=HEAPU32[value>>2];var payload=value+4;var str;if(stdStringIsUTF8){var decodeStartPtr=payload;for(var i=0;i<=length;++i){var currentBytePtr=payload+i;if(i==length||HEAPU8[currentBytePtr]==0){var maxRead=currentBytePtr-decodeStartPtr;var stringSegment=UTF8ToString(decodeStartPtr,maxRead);if(str===undefined){str=stringSegment}else{str+=String.fromCharCode(0);str+=stringSegment}decodeStartPtr=currentBytePtr+1}}}else{var a=new Array(length);for(var i=0;i<length;++i){a[i]=String.fromCharCode(HEAPU8[payload+i])}str=a.join(\"\")}_free(value);return str},toWireType(destructors,value){if(value instanceof ArrayBuffer){value=new Uint8Array(value)}var length;var valueIsOfTypeString=typeof value==\"string\";if(!(valueIsOfTypeString||value instanceof Uint8Array||value instanceof Uint8ClampedArray||value instanceof Int8Array)){throwBindingError(\"Cannot pass non-string to std::string\")}if(stdStringIsUTF8&&valueIsOfTypeString){length=lengthBytesUTF8(value)}else{length=value.length}var base=_malloc(4+length+1);var ptr=base+4;HEAPU32[base>>2]=length;if(stdStringIsUTF8&&valueIsOfTypeString){stringToUTF8(value,ptr,length+1)}else{if(valueIsOfTypeString){for(var i=0;i<length;++i){var charCode=value.charCodeAt(i);if(charCode>255){_free(ptr);throwBindingError(\"String has UTF-16 code units that do not fit in 8 bits\")}HEAPU8[ptr+i]=charCode}}else{for(var i=0;i<length;++i){HEAPU8[ptr+i]=value[i]}}}if(destructors!==null){destructors.push(_free,base)}return base},argPackAdvance:GenericWireTypeSize,readValueFromPointer:readPointer,destructorFunction(ptr){_free(ptr)}})};var UTF16Decoder=typeof TextDecoder!=\"undefined\"?new TextDecoder(\"utf-16le\"):undefined;var UTF16ToString=(ptr,maxBytesToRead)=>{var endPtr=ptr;var idx=endPtr>>1;var maxIdx=idx+maxBytesToRead/2;while(!(idx>=maxIdx)&&HEAPU16[idx])++idx;endPtr=idx<<1;if(endPtr-ptr>32&&UTF16Decoder)return UTF16Decoder.decode(HEAPU8.subarray(ptr,endPtr));var str=\"\";for(var i=0;!(i>=maxBytesToRead/2);++i){var codeUnit=HEAP16[ptr+i*2>>1];if(codeUnit==0)break;str+=String.fromCharCode(codeUnit)}return str};var stringToUTF16=(str,outPtr,maxBytesToWrite)=>{maxBytesToWrite??=2147483647;if(maxBytesToWrite<2)return 0;maxBytesToWrite-=2;var startPtr=outPtr;var numCharsToWrite=maxBytesToWrite<str.length*2?maxBytesToWrite/2:str.length;for(var i=0;i<numCharsToWrite;++i){var codeUnit=str.charCodeAt(i);HEAP16[outPtr>>1]=codeUnit;outPtr+=2}HEAP16[outPtr>>1]=0;return outPtr-startPtr};var lengthBytesUTF16=str=>str.length*2;var UTF32ToString=(ptr,maxBytesToRead)=>{var i=0;var str=\"\";while(!(i>=maxBytesToRead/4)){var utf32=HEAP32[ptr+i*4>>2];if(utf32==0)break;++i;if(utf32>=65536){var ch=utf32-65536;str+=String.fromCharCode(55296|ch>>10,56320|ch&1023)}else{str+=String.fromCharCode(utf32)}}return str};var stringToUTF32=(str,outPtr,maxBytesToWrite)=>{maxBytesToWrite??=2147483647;if(maxBytesToWrite<4)return 0;var startPtr=outPtr;var endPtr=startPtr+maxBytesToWrite-4;for(var i=0;i<str.length;++i){var codeUnit=str.charCodeAt(i);if(codeUnit>=55296&&codeUnit<=57343){var trailSurrogate=str.charCodeAt(++i);codeUnit=65536+((codeUnit&1023)<<10)|trailSurrogate&1023}HEAP32[outPtr>>2]=codeUnit;outPtr+=4;if(outPtr+4>endPtr)break}HEAP32[outPtr>>2]=0;return outPtr-startPtr};var lengthBytesUTF32=str=>{var len=0;for(var i=0;i<str.length;++i){var codeUnit=str.charCodeAt(i);if(codeUnit>=55296&&codeUnit<=57343)++i;len+=4}return len};var __embind_register_std_wstring=(rawType,charSize,name)=>{name=readLatin1String(name);var decodeString,encodeString,readCharAt,lengthBytesUTF;if(charSize===2){decodeString=UTF16ToString;encodeString=stringToUTF16;lengthBytesUTF=lengthBytesUTF16;readCharAt=pointer=>HEAPU16[pointer>>1]}else if(charSize===4){decodeString=UTF32ToString;encodeString=stringToUTF32;lengthBytesUTF=lengthBytesUTF32;readCharAt=pointer=>HEAPU32[pointer>>2]}registerType(rawType,{name:name,fromWireType:value=>{var length=HEAPU32[value>>2];var str;var decodeStartPtr=value+4;for(var i=0;i<=length;++i){var currentBytePtr=value+4+i*charSize;if(i==length||readCharAt(currentBytePtr)==0){var maxReadBytes=currentBytePtr-decodeStartPtr;var stringSegment=decodeString(decodeStartPtr,maxReadBytes);if(str===undefined){str=stringSegment}else{str+=String.fromCharCode(0);str+=stringSegment}decodeStartPtr=currentBytePtr+charSize}}_free(value);return str},toWireType:(destructors,value)=>{if(!(typeof value==\"string\")){throwBindingError(`Cannot pass non-string to C++ string type ${name}`)}var length=lengthBytesUTF(value);var ptr=_malloc(4+length+charSize);HEAPU32[ptr>>2]=length/charSize;encodeString(value,ptr+4,length+charSize);if(destructors!==null){destructors.push(_free,ptr)}return ptr},argPackAdvance:GenericWireTypeSize,readValueFromPointer:readPointer,destructorFunction(ptr){_free(ptr)}})};var __embind_register_value_object=(rawType,name,constructorSignature,rawConstructor,destructorSignature,rawDestructor)=>{structRegistrations[rawType]={name:readLatin1String(name),rawConstructor:embind__requireFunction(constructorSignature,rawConstructor),rawDestructor:embind__requireFunction(destructorSignature,rawDestructor),fields:[]}};var __embind_register_value_object_field=(structType,fieldName,getterReturnType,getterSignature,getter,getterContext,setterArgumentType,setterSignature,setter,setterContext)=>{structRegistrations[structType].fields.push({fieldName:readLatin1String(fieldName),getterReturnType:getterReturnType,getter:embind__requireFunction(getterSignature,getter),getterContext:getterContext,setterArgumentType:setterArgumentType,setter:embind__requireFunction(setterSignature,setter),setterContext:setterContext})};var __embind_register_void=(rawType,name)=>{name=readLatin1String(name);registerType(rawType,{isVoid:true,name:name,argPackAdvance:0,fromWireType:()=>undefined,toWireType:(destructors,o)=>undefined})};var __emscripten_memcpy_js=(dest,src,num)=>HEAPU8.copyWithin(dest,src,src+num);var emval_returnValue=(returnType,destructorsRef,handle)=>{var destructors=[];var result=returnType[\"toWireType\"](destructors,handle);if(destructors.length){HEAPU32[destructorsRef>>2]=Emval.toHandle(destructors)}return result};var __emval_as=(handle,returnType,destructorsRef)=>{handle=Emval.toValue(handle);returnType=requireRegisteredType(returnType,\"emval::as\");return emval_returnValue(returnType,destructorsRef,handle)};var emval_methodCallers=[];var __emval_call=(caller,handle,destructorsRef,args)=>{caller=emval_methodCallers[caller];handle=Emval.toValue(handle);return caller(null,handle,destructorsRef,args)};var emval_symbols={};var getStringOrSymbol=address=>{var symbol=emval_symbols[address];if(symbol===undefined){return readLatin1String(address)}return symbol};var __emval_call_method=(caller,objHandle,methodName,destructorsRef,args)=>{caller=emval_methodCallers[caller];objHandle=Emval.toValue(objHandle);methodName=getStringOrSymbol(methodName);return caller(objHandle,objHandle[methodName],destructorsRef,args)};var emval_get_global=()=>{if(typeof globalThis==\"object\"){return globalThis}return function(){return Function}()(\"return this\")()};var __emval_get_global=name=>{if(name===0){return Emval.toHandle(emval_get_global())}else{name=getStringOrSymbol(name);return Emval.toHandle(emval_get_global()[name])}};var emval_addMethodCaller=caller=>{var id=emval_methodCallers.length;emval_methodCallers.push(caller);return id};var emval_lookupTypes=(argCount,argTypes)=>{var a=new Array(argCount);for(var i=0;i<argCount;++i){a[i]=requireRegisteredType(HEAPU32[argTypes+i*4>>2],\"parameter \"+i)}return a};var reflectConstruct=Reflect.construct;var __emval_get_method_caller=(argCount,argTypes,kind)=>{var types=emval_lookupTypes(argCount,argTypes);var retType=types.shift();argCount--;var functionBody=`return function (obj, func, destructorsRef, args) {\\n`;var offset=0;var argsList=[];if(kind===0){argsList.push(\"obj\")}var params=[\"retType\"];var args=[retType];for(var i=0;i<argCount;++i){argsList.push(\"arg\"+i);params.push(\"argType\"+i);args.push(types[i]);functionBody+=`  var arg${i} = argType${i}.readValueFromPointer(args${offset?\"+\"+offset:\"\"});\\n`;offset+=types[i][\"argPackAdvance\"]}var invoker=kind===1?\"new func\":\"func.call\";functionBody+=`  var rv = ${invoker}(${argsList.join(\", \")});\\n`;if(!retType.isVoid){params.push(\"emval_returnValue\");args.push(emval_returnValue);functionBody+=\"  return emval_returnValue(retType, destructorsRef, rv);\\n\"}functionBody+=\"};\\n\";params.push(functionBody);var invokerFunction=newFunc(Function,params)(...args);var functionName=`methodCaller<(${types.map(t=>t.name).join(\", \")}) => ${retType.name}>`;return emval_addMethodCaller(createNamedFunction(functionName,invokerFunction))};var __emval_get_module_property=name=>{name=getStringOrSymbol(name);return Emval.toHandle(Module[name])};var __emval_get_property=(handle,key)=>{handle=Emval.toValue(handle);key=Emval.toValue(key);return Emval.toHandle(handle[key])};var __emval_incref=handle=>{if(handle>9){emval_handles[handle+1]+=1}};var __emval_new_cstring=v=>Emval.toHandle(getStringOrSymbol(v));var __emval_run_destructors=handle=>{var destructors=Emval.toValue(handle);runDestructors(destructors);__emval_decref(handle)};var getHeapMax=()=>2147483648;var growMemory=size=>{var b=wasmMemory.buffer;var pages=(size-b.byteLength+65535)/65536;try{wasmMemory.grow(pages);updateMemoryViews();return 1}catch(e){}};var _emscripten_resize_heap=requestedSize=>{var oldSize=HEAPU8.length;requestedSize>>>=0;var maxHeapSize=getHeapMax();if(requestedSize>maxHeapSize){return false}var alignUp=(x,multiple)=>x+(multiple-x%multiple)%multiple;for(var cutDown=1;cutDown<=4;cutDown*=2){var overGrownHeapSize=oldSize*(1+.2/cutDown);overGrownHeapSize=Math.min(overGrownHeapSize,requestedSize+100663296);var newSize=Math.min(maxHeapSize,alignUp(Math.max(requestedSize,overGrownHeapSize),65536));var replacement=growMemory(newSize);if(replacement){return true}}return false};var _fd_close=fd=>52;var convertI32PairToI53Checked=(lo,hi)=>hi+2097152>>>0<4194305-!!lo?(lo>>>0)+hi*4294967296:NaN;function _fd_seek(fd,offset_low,offset_high,whence,newOffset){var offset=convertI32PairToI53Checked(offset_low,offset_high);return 70}var printCharBuffers=[null,[],[]];var printChar=(stream,curr)=>{var buffer=printCharBuffers[stream];if(curr===0||curr===10){(stream===1?out:err)(UTF8ArrayToString(buffer,0));buffer.length=0}else{buffer.push(curr)}};var _fd_write=(fd,iov,iovcnt,pnum)=>{var num=0;for(var i=0;i<iovcnt;i++){var ptr=HEAPU32[iov>>2];var len=HEAPU32[iov+4>>2];iov+=8;for(var j=0;j<len;j++){printChar(fd,HEAPU8[ptr+j])}num+=len}HEAPU32[pnum>>2]=num;return 0};InternalError=Module[\"InternalError\"]=class InternalError extends Error{constructor(message){super(message);this.name=\"InternalError\"}};embind_init_charCodes();BindingError=Module[\"BindingError\"]=class BindingError extends Error{constructor(message){super(message);this.name=\"BindingError\"}};init_ClassHandle();init_embind();init_RegisteredPointer();UnboundTypeError=Module[\"UnboundTypeError\"]=extendError(Error,\"UnboundTypeError\");init_emval();var wasmImports={K:___cxa_throw,G:__abort_js,s:__embind_finalize_value_object,C:__embind_register_bigint,I:__embind_register_bool,w:__embind_register_class,v:__embind_register_class_constructor,d:__embind_register_class_function,m:__embind_register_constant,H:__embind_register_emval,o:__embind_register_enum,a:__embind_register_enum_value,A:__embind_register_float,i:__embind_register_function,l:__embind_register_integer,f:__embind_register_memory_view,z:__embind_register_std_string,u:__embind_register_std_wstring,t:__embind_register_value_object,c:__embind_register_value_object_field,J:__embind_register_void,F:__emscripten_memcpy_js,n:__emval_as,q:__emval_call,p:__emval_call_method,b:__emval_decref,x:__emval_get_global,j:__emval_get_method_caller,r:__emval_get_module_property,g:__emval_get_property,k:__emval_incref,h:__emval_new_cstring,e:__emval_run_destructors,D:_emscripten_resize_heap,E:_fd_close,B:_fd_seek,y:_fd_write};var wasmExports=createWasm();var ___wasm_call_ctors=()=>(___wasm_call_ctors=wasmExports[\"M\"])();var ___getTypeName=a0=>(___getTypeName=wasmExports[\"N\"])(a0);var _malloc=a0=>(_malloc=wasmExports[\"O\"])(a0);var _free=a0=>(_free=wasmExports[\"Q\"])(a0);var ___cxa_is_pointer_type=a0=>(___cxa_is_pointer_type=wasmExports[\"R\"])(a0);var dynCall_jiji=Module[\"dynCall_jiji\"]=(a0,a1,a2,a3,a4)=>(dynCall_jiji=Module[\"dynCall_jiji\"]=wasmExports[\"S\"])(a0,a1,a2,a3,a4);var calledRun;dependenciesFulfilled=function runCaller(){if(!calledRun)run();if(!calledRun)dependenciesFulfilled=runCaller};function run(){if(runDependencies>0){return}preRun();if(runDependencies>0){return}function doRun(){if(calledRun)return;calledRun=true;Module[\"calledRun\"]=true;if(ABORT)return;initRuntime();readyPromiseResolve(Module);Module[\"onRuntimeInitialized\"]?.();postRun()}if(Module[\"setStatus\"]){Module[\"setStatus\"](\"Running...\");setTimeout(function(){setTimeout(function(){Module[\"setStatus\"](\"\")},1);doRun()},1)}else{doRun()}}if(Module[\"preInit\"]){if(typeof Module[\"preInit\"]==\"function\")Module[\"preInit\"]=[Module[\"preInit\"]];while(Module[\"preInit\"].length>0){Module[\"preInit\"].pop()()}}run();moduleRtn=readyPromise;\n\n\n  return moduleRtn;\n}\n);\n})();\nif (typeof exports === 'object' && typeof module === 'object')\n  module.exports = BASIS;\nelse if (typeof define === 'function' && define['amd'])\n  define([], () => BASIS);\n"
  },
  {
    "path": "examples/libs/cannon.js",
    "content": "/*\n * Copyright (c) 2015 cannon.js Authors\n *\n * Permission is hereby granted, free of charge, to any person\n * obtaining a copy of this software and associated documentation\n * files (the \"Software\"), to deal in the Software without\n * restriction, including without limitation the rights to use, copy,\n * modify, merge, publish, distribute, sublicense, and/or sell copies\n * of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\n * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\n * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\n * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n */\n\n!function(e){if(\"object\"==typeof exports&&\"undefined\"!=typeof module)module.exports=e();else if(\"function\"==typeof define&&false)define([],e);else{var f;\"undefined\"!=typeof window?f=window:\"undefined\"!=typeof global?f=global:\"undefined\"!=typeof self&&(f=self),f.CANNON=e()}}(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==\"function\"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);throw new Error(\"Cannot find module '\"+o+\"'\")}var f=n[o]={exports:{}};t[o][0].call(f.exports,function(e){var n=t[o][1][e];return s(n?n:e)},f,f.exports,e,t,n,r)}return n[o].exports}var i=typeof require==\"function\"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(_dereq_,module,exports){\nmodule.exports={\n  \"name\": \"cannon\",\n  \"version\": \"0.6.2\",\n  \"description\": \"A lightweight 3D physics engine written in JavaScript.\",\n  \"homepage\": \"https://github.com/schteppe/cannon.js\",\n  \"author\": \"Stefan Hedman <schteppe@gmail.com> (http://steffe.se)\",\n  \"keywords\": [\n    \"cannon.js\",\n    \"cannon\",\n    \"physics\",\n    \"engine\",\n    \"3d\"\n  ],\n  \"main\": \"./build/cannon.js\",\n  \"engines\": {\n    \"node\": \"*\"\n  },\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/schteppe/cannon.js.git\"\n  },\n  \"bugs\": {\n    \"url\": \"https://github.com/schteppe/cannon.js/issues\"\n  },\n  \"licenses\": [\n    {\n      \"type\": \"MIT\"\n    }\n  ],\n  \"devDependencies\": {\n    \"jshint\": \"latest\",\n    \"uglify-js\": \"latest\",\n    \"nodeunit\": \"^0.9.0\",\n    \"grunt\": \"~0.4.0\",\n    \"grunt-contrib-jshint\": \"~0.1.1\",\n    \"grunt-contrib-nodeunit\": \"^0.4.1\",\n    \"grunt-contrib-concat\": \"~0.1.3\",\n    \"grunt-contrib-uglify\": \"^0.5.1\",\n    \"grunt-browserify\": \"^2.1.4\",\n    \"grunt-contrib-yuidoc\": \"^0.5.2\",\n    \"browserify\": \"*\"\n  },\n  \"dependencies\": {}\n}\n\n},{}],2:[function(_dereq_,module,exports){\n// Export classes\nmodule.exports = {\n    version :                       _dereq_('../package.json').version,\n\n    AABB :                          _dereq_('./collision/AABB'),\n    ArrayCollisionMatrix :          _dereq_('./collision/ArrayCollisionMatrix'),\n    Body :                          _dereq_('./objects/Body'),\n    Box :                           _dereq_('./shapes/Box'),\n    Broadphase :                    _dereq_('./collision/Broadphase'),\n    Constraint :                    _dereq_('./constraints/Constraint'),\n    ContactEquation :               _dereq_('./equations/ContactEquation'),\n    Narrowphase :                   _dereq_('./world/Narrowphase'),\n    ConeTwistConstraint :           _dereq_('./constraints/ConeTwistConstraint'),\n    ContactMaterial :               _dereq_('./material/ContactMaterial'),\n    ConvexPolyhedron :              _dereq_('./shapes/ConvexPolyhedron'),\n    Cylinder :                      _dereq_('./shapes/Cylinder'),\n    DistanceConstraint :            _dereq_('./constraints/DistanceConstraint'),\n    Equation :                      _dereq_('./equations/Equation'),\n    EventTarget :                   _dereq_('./utils/EventTarget'),\n    FrictionEquation :              _dereq_('./equations/FrictionEquation'),\n    GSSolver :                      _dereq_('./solver/GSSolver'),\n    GridBroadphase :                _dereq_('./collision/GridBroadphase'),\n    Heightfield :                   _dereq_('./shapes/Heightfield'),\n    HingeConstraint :               _dereq_('./constraints/HingeConstraint'),\n    LockConstraint :                _dereq_('./constraints/LockConstraint'),\n    Mat3 :                          _dereq_('./math/Mat3'),\n    Material :                      _dereq_('./material/Material'),\n    NaiveBroadphase :               _dereq_('./collision/NaiveBroadphase'),\n    ObjectCollisionMatrix :         _dereq_('./collision/ObjectCollisionMatrix'),\n    Pool :                          _dereq_('./utils/Pool'),\n    Particle :                      _dereq_('./shapes/Particle'),\n    Plane :                         _dereq_('./shapes/Plane'),\n    PointToPointConstraint :        _dereq_('./constraints/PointToPointConstraint'),\n    Quaternion :                    _dereq_('./math/Quaternion'),\n    Ray :                           _dereq_('./collision/Ray'),\n    RaycastVehicle :                _dereq_('./objects/RaycastVehicle'),\n    RaycastResult :                 _dereq_('./collision/RaycastResult'),\n    RigidVehicle :                  _dereq_('./objects/RigidVehicle'),\n    RotationalEquation :            _dereq_('./equations/RotationalEquation'),\n    RotationalMotorEquation :       _dereq_('./equations/RotationalMotorEquation'),\n    SAPBroadphase :                 _dereq_('./collision/SAPBroadphase'),\n    SPHSystem :                     _dereq_('./objects/SPHSystem'),\n    Shape :                         _dereq_('./shapes/Shape'),\n    Solver :                        _dereq_('./solver/Solver'),\n    Sphere :                        _dereq_('./shapes/Sphere'),\n    SplitSolver :                   _dereq_('./solver/SplitSolver'),\n    Spring :                        _dereq_('./objects/Spring'),\n    Trimesh :                       _dereq_('./shapes/Trimesh'),\n    Vec3 :                          _dereq_('./math/Vec3'),\n    Vec3Pool :                      _dereq_('./utils/Vec3Pool'),\n    World :                         _dereq_('./world/World'),\n};\n\n},{\"../package.json\":1,\"./collision/AABB\":3,\"./collision/ArrayCollisionMatrix\":4,\"./collision/Broadphase\":5,\"./collision/GridBroadphase\":6,\"./collision/NaiveBroadphase\":7,\"./collision/ObjectCollisionMatrix\":8,\"./collision/Ray\":9,\"./collision/RaycastResult\":10,\"./collision/SAPBroadphase\":11,\"./constraints/ConeTwistConstraint\":12,\"./constraints/Constraint\":13,\"./constraints/DistanceConstraint\":14,\"./constraints/HingeConstraint\":15,\"./constraints/LockConstraint\":16,\"./constraints/PointToPointConstraint\":17,\"./equations/ContactEquation\":19,\"./equations/Equation\":20,\"./equations/FrictionEquation\":21,\"./equations/RotationalEquation\":22,\"./equations/RotationalMotorEquation\":23,\"./material/ContactMaterial\":24,\"./material/Material\":25,\"./math/Mat3\":27,\"./math/Quaternion\":28,\"./math/Vec3\":30,\"./objects/Body\":31,\"./objects/RaycastVehicle\":32,\"./objects/RigidVehicle\":33,\"./objects/SPHSystem\":34,\"./objects/Spring\":35,\"./shapes/Box\":37,\"./shapes/ConvexPolyhedron\":38,\"./shapes/Cylinder\":39,\"./shapes/Heightfield\":40,\"./shapes/Particle\":41,\"./shapes/Plane\":42,\"./shapes/Shape\":43,\"./shapes/Sphere\":44,\"./shapes/Trimesh\":45,\"./solver/GSSolver\":46,\"./solver/Solver\":47,\"./solver/SplitSolver\":48,\"./utils/EventTarget\":49,\"./utils/Pool\":51,\"./utils/Vec3Pool\":54,\"./world/Narrowphase\":55,\"./world/World\":56}],3:[function(_dereq_,module,exports){\nvar Vec3 = _dereq_('../math/Vec3');\nvar Utils = _dereq_('../utils/Utils');\n\nmodule.exports = AABB;\n\n/**\n * Axis aligned bounding box class.\n * @class AABB\n * @constructor\n * @param {Object} [options]\n * @param {Vec3}   [options.upperBound]\n * @param {Vec3}   [options.lowerBound]\n */\nfunction AABB(options){\n    options = options || {};\n\n    /**\n     * The lower bound of the bounding box.\n     * @property lowerBound\n     * @type {Vec3}\n     */\n    this.lowerBound = new Vec3();\n    if(options.lowerBound){\n        this.lowerBound.copy(options.lowerBound);\n    }\n\n    /**\n     * The upper bound of the bounding box.\n     * @property upperBound\n     * @type {Vec3}\n     */\n    this.upperBound = new Vec3();\n    if(options.upperBound){\n        this.upperBound.copy(options.upperBound);\n    }\n}\n\nvar tmp = new Vec3();\n\n/**\n * Set the AABB bounds from a set of points.\n * @method setFromPoints\n * @param {Array} points An array of Vec3's.\n * @param {Vec3} position\n * @param {Quaternion} quaternion\n * @param {number} skinSize\n * @return {AABB} The self object\n */\nAABB.prototype.setFromPoints = function(points, position, quaternion, skinSize){\n    var l = this.lowerBound,\n        u = this.upperBound,\n        q = quaternion;\n\n    // Set to the first point\n    l.copy(points[0]);\n    if(q){\n        q.vmult(l, l);\n    }\n    u.copy(l);\n\n    for(var i = 1; i<points.length; i++){\n        var p = points[i];\n\n        if(q){\n            q.vmult(p, tmp);\n            p = tmp;\n        }\n\n        if(p.x > u.x){ u.x = p.x; }\n        if(p.x < l.x){ l.x = p.x; }\n        if(p.y > u.y){ u.y = p.y; }\n        if(p.y < l.y){ l.y = p.y; }\n        if(p.z > u.z){ u.z = p.z; }\n        if(p.z < l.z){ l.z = p.z; }\n    }\n\n    // Add offset\n    if (position) {\n        position.vadd(l, l);\n        position.vadd(u, u);\n    }\n\n    if(skinSize){\n        l.x -= skinSize;\n        l.y -= skinSize;\n        l.z -= skinSize;\n        u.x += skinSize;\n        u.y += skinSize;\n        u.z += skinSize;\n    }\n\n    return this;\n};\n\n/**\n * Copy bounds from an AABB to this AABB\n * @method copy\n * @param  {AABB} aabb Source to copy from\n * @return {AABB} The this object, for chainability\n */\nAABB.prototype.copy = function(aabb){\n    this.lowerBound.copy(aabb.lowerBound);\n    this.upperBound.copy(aabb.upperBound);\n    return this;\n};\n\n/**\n * Clone an AABB\n * @method clone\n */\nAABB.prototype.clone = function(){\n    return new AABB().copy(this);\n};\n\n/**\n * Extend this AABB so that it covers the given AABB too.\n * @method extend\n * @param  {AABB} aabb\n */\nAABB.prototype.extend = function(aabb){\n    // Extend lower bound\n    var l = aabb.lowerBound.x;\n    if(this.lowerBound.x > l){\n        this.lowerBound.x = l;\n    }\n\n    // Upper\n    var u = aabb.upperBound.x;\n    if(this.upperBound.x < u){\n        this.upperBound.x = u;\n    }\n\n    // Extend lower bound\n    var l = aabb.lowerBound.y;\n    if(this.lowerBound.y > l){\n        this.lowerBound.y = l;\n    }\n\n    // Upper\n    var u = aabb.upperBound.y;\n    if(this.upperBound.y < u){\n        this.upperBound.y = u;\n    }\n\n    // Extend lower bound\n    var l = aabb.lowerBound.z;\n    if(this.lowerBound.z > l){\n        this.lowerBound.z = l;\n    }\n\n    // Upper\n    var u = aabb.upperBound.z;\n    if(this.upperBound.z < u){\n        this.upperBound.z = u;\n    }\n};\n\n/**\n * Returns true if the given AABB overlaps this AABB.\n * @method overlaps\n * @param  {AABB} aabb\n * @return {Boolean}\n */\nAABB.prototype.overlaps = function(aabb){\n    var l1 = this.lowerBound,\n        u1 = this.upperBound,\n        l2 = aabb.lowerBound,\n        u2 = aabb.upperBound;\n\n    //      l2        u2\n    //      |---------|\n    // |--------|\n    // l1       u1\n\n    return ((l2.x <= u1.x && u1.x <= u2.x) || (l1.x <= u2.x && u2.x <= u1.x)) &&\n           ((l2.y <= u1.y && u1.y <= u2.y) || (l1.y <= u2.y && u2.y <= u1.y)) &&\n           ((l2.z <= u1.z && u1.z <= u2.z) || (l1.z <= u2.z && u2.z <= u1.z));\n};\n\n/**\n * Returns true if the given AABB is fully contained in this AABB.\n * @method contains\n * @param {AABB} aabb\n * @return {Boolean}\n */\nAABB.prototype.contains = function(aabb){\n    var l1 = this.lowerBound,\n        u1 = this.upperBound,\n        l2 = aabb.lowerBound,\n        u2 = aabb.upperBound;\n\n    //      l2        u2\n    //      |---------|\n    // |---------------|\n    // l1              u1\n\n    return (\n        (l1.x <= l2.x && u1.x >= u2.x) &&\n        (l1.y <= l2.y && u1.y >= u2.y) &&\n        (l1.z <= l2.z && u1.z >= u2.z)\n    );\n};\n\n/**\n * @method getCorners\n * @param {Vec3} a\n * @param {Vec3} b\n * @param {Vec3} c\n * @param {Vec3} d\n * @param {Vec3} e\n * @param {Vec3} f\n * @param {Vec3} g\n * @param {Vec3} h\n */\nAABB.prototype.getCorners = function(a, b, c, d, e, f, g, h){\n    var l = this.lowerBound,\n        u = this.upperBound;\n\n    a.copy(l);\n    b.set( u.x, l.y, l.z );\n    c.set( u.x, u.y, l.z );\n    d.set( l.x, u.y, u.z );\n    e.set( u.x, l.y, l.z );\n    f.set( l.x, u.y, l.z );\n    g.set( l.x, l.y, u.z );\n    h.copy(u);\n};\n\nvar transformIntoFrame_corners = [\n    new Vec3(),\n    new Vec3(),\n    new Vec3(),\n    new Vec3(),\n    new Vec3(),\n    new Vec3(),\n    new Vec3(),\n    new Vec3()\n];\n\n/**\n * Get the representation of an AABB in another frame.\n * @method toLocalFrame\n * @param  {Transform} frame\n * @param  {AABB} target\n * @return {AABB} The \"target\" AABB object.\n */\nAABB.prototype.toLocalFrame = function(frame, target){\n\n    var corners = transformIntoFrame_corners;\n    var a = corners[0];\n    var b = corners[1];\n    var c = corners[2];\n    var d = corners[3];\n    var e = corners[4];\n    var f = corners[5];\n    var g = corners[6];\n    var h = corners[7];\n\n    // Get corners in current frame\n    this.getCorners(a, b, c, d, e, f, g, h);\n\n    // Transform them to new local frame\n    for(var i=0; i !== 8; i++){\n        var corner = corners[i];\n        frame.pointToLocal(corner, corner);\n    }\n\n    return target.setFromPoints(corners);\n};\n\n/**\n * Get the representation of an AABB in the global frame.\n * @method toWorldFrame\n * @param  {Transform} frame\n * @param  {AABB} target\n * @return {AABB} The \"target\" AABB object.\n */\nAABB.prototype.toWorldFrame = function(frame, target){\n\n    var corners = transformIntoFrame_corners;\n    var a = corners[0];\n    var b = corners[1];\n    var c = corners[2];\n    var d = corners[3];\n    var e = corners[4];\n    var f = corners[5];\n    var g = corners[6];\n    var h = corners[7];\n\n    // Get corners in current frame\n    this.getCorners(a, b, c, d, e, f, g, h);\n\n    // Transform them to new local frame\n    for(var i=0; i !== 8; i++){\n        var corner = corners[i];\n        frame.pointToWorld(corner, corner);\n    }\n\n    return target.setFromPoints(corners);\n};\n\n},{\"../math/Vec3\":30,\"../utils/Utils\":53}],4:[function(_dereq_,module,exports){\nmodule.exports = ArrayCollisionMatrix;\n\n/**\n * Collision \"matrix\". It's actually a triangular-shaped array of whether two bodies are touching this step, for reference next step\n * @class ArrayCollisionMatrix\n * @constructor\n */\nfunction ArrayCollisionMatrix() {\n\n    /**\n     * The matrix storage\n     * @property matrix\n     * @type {Array}\n     */\n\tthis.matrix = [];\n}\n\n/**\n * Get an element\n * @method get\n * @param  {Number} i\n * @param  {Number} j\n * @return {Number}\n */\nArrayCollisionMatrix.prototype.get = function(i, j) {\n\ti = i.index;\n\tj = j.index;\n    if (j > i) {\n        var temp = j;\n        j = i;\n        i = temp;\n    }\n\treturn this.matrix[(i*(i + 1)>>1) + j-1];\n};\n\n/**\n * Set an element\n * @method set\n * @param {Number} i\n * @param {Number} j\n * @param {Number} value\n */\nArrayCollisionMatrix.prototype.set = function(i, j, value) {\n\ti = i.index;\n\tj = j.index;\n    if (j > i) {\n        var temp = j;\n        j = i;\n        i = temp;\n    }\n\tthis.matrix[(i*(i + 1)>>1) + j-1] = value ? 1 : 0;\n};\n\n/**\n * Sets all elements to zero\n * @method reset\n */\nArrayCollisionMatrix.prototype.reset = function() {\n\tfor (var i=0, l=this.matrix.length; i!==l; i++) {\n\t\tthis.matrix[i]=0;\n\t}\n};\n\n/**\n * Sets the max number of objects\n * @method setNumObjects\n * @param {Number} n\n */\nArrayCollisionMatrix.prototype.setNumObjects = function(n) {\n\tthis.matrix.length = n*(n-1)>>1;\n};\n\n},{}],5:[function(_dereq_,module,exports){\nvar Body = _dereq_('../objects/Body');\nvar Vec3 = _dereq_('../math/Vec3');\nvar Quaternion = _dereq_('../math/Quaternion');\nvar Shape = _dereq_('../shapes/Shape');\nvar Plane = _dereq_('../shapes/Plane');\n\nmodule.exports = Broadphase;\n\n/**\n * Base class for broadphase implementations\n * @class Broadphase\n * @constructor\n * @author schteppe\n */\nfunction Broadphase(){\n    /**\n    * The world to search for collisions in.\n    * @property world\n    * @type {World}\n    */\n    this.world = null;\n\n    /**\n     * If set to true, the broadphase uses bounding boxes for intersection test, else it uses bounding spheres.\n     * @property useBoundingBoxes\n     * @type {Boolean}\n     */\n    this.useBoundingBoxes = false;\n\n    /**\n     * Set to true if the objects in the world moved.\n     * @property {Boolean} dirty\n     */\n    this.dirty = true;\n}\n\n/**\n * Get the collision pairs from the world\n * @method collisionPairs\n * @param {World} world The world to search in\n * @param {Array} p1 Empty array to be filled with body objects\n * @param {Array} p2 Empty array to be filled with body objects\n */\nBroadphase.prototype.collisionPairs = function(world,p1,p2){\n    throw new Error(\"collisionPairs not implemented for this BroadPhase class!\");\n};\n\n/**\n * Check if a body pair needs to be intersection tested at all.\n * @method needBroadphaseCollision\n * @param {Body} bodyA\n * @param {Body} bodyB\n * @return {bool}\n */\nvar Broadphase_needBroadphaseCollision_STATIC_OR_KINEMATIC = Body.STATIC | Body.KINEMATIC;\nBroadphase.prototype.needBroadphaseCollision = function(bodyA,bodyB){\n\n    // Check collision filter masks\n    if( (bodyA.collisionFilterGroup & bodyB.collisionFilterMask)===0 || (bodyB.collisionFilterGroup & bodyA.collisionFilterMask)===0){\n        return false;\n    }\n\n    // Check types\n    if(((bodyA.type & Broadphase_needBroadphaseCollision_STATIC_OR_KINEMATIC)!==0 || bodyA.sleepState === Body.SLEEPING) &&\n       ((bodyB.type & Broadphase_needBroadphaseCollision_STATIC_OR_KINEMATIC)!==0 || bodyB.sleepState === Body.SLEEPING)) {\n        // Both bodies are static, kinematic or sleeping. Skip.\n        return false;\n    }\n\n    return true;\n};\n\n/**\n * Check if the bounding volumes of two bodies intersect.\n * @method intersectionTest\n * @param {Body} bodyA\n * @param {Body} bodyB\n * @param {array} pairs1\n * @param {array} pairs2\n  */\nBroadphase.prototype.intersectionTest = function(bodyA, bodyB, pairs1, pairs2){\n    if(this.useBoundingBoxes){\n        this.doBoundingBoxBroadphase(bodyA,bodyB,pairs1,pairs2);\n    } else {\n        this.doBoundingSphereBroadphase(bodyA,bodyB,pairs1,pairs2);\n    }\n};\n\n/**\n * Check if the bounding spheres of two bodies are intersecting.\n * @method doBoundingSphereBroadphase\n * @param {Body} bodyA\n * @param {Body} bodyB\n * @param {Array} pairs1 bodyA is appended to this array if intersection\n * @param {Array} pairs2 bodyB is appended to this array if intersection\n */\nvar Broadphase_collisionPairs_r = new Vec3(), // Temp objects\n    Broadphase_collisionPairs_normal =  new Vec3(),\n    Broadphase_collisionPairs_quat =  new Quaternion(),\n    Broadphase_collisionPairs_relpos  =  new Vec3();\nBroadphase.prototype.doBoundingSphereBroadphase = function(bodyA,bodyB,pairs1,pairs2){\n    var r = Broadphase_collisionPairs_r;\n    bodyB.position.vsub(bodyA.position,r);\n    var boundingRadiusSum2 = Math.pow(bodyA.boundingRadius + bodyB.boundingRadius, 2);\n    var norm2 = r.norm2();\n    if(norm2 < boundingRadiusSum2){\n        pairs1.push(bodyA);\n        pairs2.push(bodyB);\n    }\n};\n\n/**\n * Check if the bounding boxes of two bodies are intersecting.\n * @method doBoundingBoxBroadphase\n * @param {Body} bodyA\n * @param {Body} bodyB\n * @param {Array} pairs1\n * @param {Array} pairs2\n */\nBroadphase.prototype.doBoundingBoxBroadphase = function(bodyA,bodyB,pairs1,pairs2){\n    if(bodyA.aabbNeedsUpdate){\n        bodyA.computeAABB();\n    }\n    if(bodyB.aabbNeedsUpdate){\n        bodyB.computeAABB();\n    }\n\n    // Check AABB / AABB\n    if(bodyA.aabb.overlaps(bodyB.aabb)){\n        pairs1.push(bodyA);\n        pairs2.push(bodyB);\n    }\n};\n\n/**\n * Removes duplicate pairs from the pair arrays.\n * @method makePairsUnique\n * @param {Array} pairs1\n * @param {Array} pairs2\n */\nvar Broadphase_makePairsUnique_temp = { keys:[] },\n    Broadphase_makePairsUnique_p1 = [],\n    Broadphase_makePairsUnique_p2 = [];\nBroadphase.prototype.makePairsUnique = function(pairs1,pairs2){\n    var t = Broadphase_makePairsUnique_temp,\n        p1 = Broadphase_makePairsUnique_p1,\n        p2 = Broadphase_makePairsUnique_p2,\n        N = pairs1.length;\n\n    for(var i=0; i!==N; i++){\n        p1[i] = pairs1[i];\n        p2[i] = pairs2[i];\n    }\n\n    pairs1.length = 0;\n    pairs2.length = 0;\n\n    for(var i=0; i!==N; i++){\n        var id1 = p1[i].id,\n            id2 = p2[i].id;\n        var key = id1 < id2 ? id1+\",\"+id2 :  id2+\",\"+id1;\n        t[key] = i;\n        t.keys.push(key);\n    }\n\n    for(var i=0; i!==t.keys.length; i++){\n        var key = t.keys.pop(),\n            pairIndex = t[key];\n        pairs1.push(p1[pairIndex]);\n        pairs2.push(p2[pairIndex]);\n        delete t[key];\n    }\n};\n\n/**\n * To be implemented by subcasses\n * @method setWorld\n * @param {World} world\n */\nBroadphase.prototype.setWorld = function(world){\n};\n\n/**\n * Check if the bounding spheres of two bodies overlap.\n * @method boundingSphereCheck\n * @param {Body} bodyA\n * @param {Body} bodyB\n * @return {boolean}\n */\nvar bsc_dist = new Vec3();\nBroadphase.boundingSphereCheck = function(bodyA,bodyB){\n    var dist = bsc_dist;\n    bodyA.position.vsub(bodyB.position,dist);\n    return Math.pow(bodyA.shape.boundingSphereRadius + bodyB.shape.boundingSphereRadius,2) > dist.norm2();\n};\n\n/**\n * Returns all the bodies within the AABB.\n * @method aabbQuery\n * @param  {World} world\n * @param  {AABB} aabb\n * @param  {array} result An array to store resulting bodies in.\n * @return {array}\n */\nBroadphase.prototype.aabbQuery = function(world, aabb, result){\n    console.warn('.aabbQuery is not implemented in this Broadphase subclass.');\n    return [];\n};\n},{\"../math/Quaternion\":28,\"../math/Vec3\":30,\"../objects/Body\":31,\"../shapes/Plane\":42,\"../shapes/Shape\":43}],6:[function(_dereq_,module,exports){\nmodule.exports = GridBroadphase;\n\nvar Broadphase = _dereq_('./Broadphase');\nvar Vec3 = _dereq_('../math/Vec3');\nvar Shape = _dereq_('../shapes/Shape');\n\n/**\n * Axis aligned uniform grid broadphase.\n * @class GridBroadphase\n * @constructor\n * @extends Broadphase\n * @todo Needs support for more than just planes and spheres.\n * @param {Vec3} aabbMin\n * @param {Vec3} aabbMax\n * @param {Number} nx Number of boxes along x\n * @param {Number} ny Number of boxes along y\n * @param {Number} nz Number of boxes along z\n */\nfunction GridBroadphase(aabbMin,aabbMax,nx,ny,nz){\n    Broadphase.apply(this);\n    this.nx = nx || 10;\n    this.ny = ny || 10;\n    this.nz = nz || 10;\n    this.aabbMin = aabbMin || new Vec3(100,100,100);\n    this.aabbMax = aabbMax || new Vec3(-100,-100,-100);\n\tvar nbins = this.nx * this.ny * this.nz;\n\tif (nbins <= 0) {\n\t\tthrow \"GridBroadphase: Each dimension's n must be >0\";\n\t}\n    this.bins = [];\n\tthis.binLengths = []; //Rather than continually resizing arrays (thrashing the memory), just record length and allow them to grow\n\tthis.bins.length = nbins;\n\tthis.binLengths.length = nbins;\n\tfor (var i=0;i<nbins;i++) {\n\t\tthis.bins[i]=[];\n\t\tthis.binLengths[i]=0;\n\t}\n}\nGridBroadphase.prototype = new Broadphase();\nGridBroadphase.prototype.constructor = GridBroadphase;\n\n/**\n * Get all the collision pairs in the physics world\n * @method collisionPairs\n * @param {World} world\n * @param {Array} pairs1\n * @param {Array} pairs2\n */\nvar GridBroadphase_collisionPairs_d = new Vec3();\nvar GridBroadphase_collisionPairs_binPos = new Vec3();\nGridBroadphase.prototype.collisionPairs = function(world,pairs1,pairs2){\n    var N = world.numObjects(),\n        bodies = world.bodies;\n\n    var max = this.aabbMax,\n        min = this.aabbMin,\n        nx = this.nx,\n        ny = this.ny,\n        nz = this.nz;\n\n\tvar xstep = ny*nz;\n\tvar ystep = nz;\n\tvar zstep = 1;\n\n    var xmax = max.x,\n        ymax = max.y,\n        zmax = max.z,\n        xmin = min.x,\n        ymin = min.y,\n        zmin = min.z;\n\n    var xmult = nx / (xmax-xmin),\n        ymult = ny / (ymax-ymin),\n        zmult = nz / (zmax-zmin);\n\n    var binsizeX = (xmax - xmin) / nx,\n        binsizeY = (ymax - ymin) / ny,\n        binsizeZ = (zmax - zmin) / nz;\n\n\tvar binRadius = Math.sqrt(binsizeX*binsizeX + binsizeY*binsizeY + binsizeZ*binsizeZ) * 0.5;\n\n    var types = Shape.types;\n    var SPHERE =            types.SPHERE,\n        PLANE =             types.PLANE,\n        BOX =               types.BOX,\n        COMPOUND =          types.COMPOUND,\n        CONVEXPOLYHEDRON =  types.CONVEXPOLYHEDRON;\n\n    var bins=this.bins,\n\t\tbinLengths=this.binLengths,\n        Nbins=this.bins.length;\n\n    // Reset bins\n    for(var i=0; i!==Nbins; i++){\n        binLengths[i] = 0;\n    }\n\n    var ceil = Math.ceil;\n\tvar min = Math.min;\n\tvar max = Math.max;\n\n\tfunction addBoxToBins(x0,y0,z0,x1,y1,z1,bi) {\n\t\tvar xoff0 = ((x0 - xmin) * xmult)|0,\n\t\t\tyoff0 = ((y0 - ymin) * ymult)|0,\n\t\t\tzoff0 = ((z0 - zmin) * zmult)|0,\n\t\t\txoff1 = ceil((x1 - xmin) * xmult),\n\t\t\tyoff1 = ceil((y1 - ymin) * ymult),\n\t\t\tzoff1 = ceil((z1 - zmin) * zmult);\n\n\t\tif (xoff0 < 0) { xoff0 = 0; } else if (xoff0 >= nx) { xoff0 = nx - 1; }\n\t\tif (yoff0 < 0) { yoff0 = 0; } else if (yoff0 >= ny) { yoff0 = ny - 1; }\n\t\tif (zoff0 < 0) { zoff0 = 0; } else if (zoff0 >= nz) { zoff0 = nz - 1; }\n\t\tif (xoff1 < 0) { xoff1 = 0; } else if (xoff1 >= nx) { xoff1 = nx - 1; }\n\t\tif (yoff1 < 0) { yoff1 = 0; } else if (yoff1 >= ny) { yoff1 = ny - 1; }\n\t\tif (zoff1 < 0) { zoff1 = 0; } else if (zoff1 >= nz) { zoff1 = nz - 1; }\n\n\t\txoff0 *= xstep;\n\t\tyoff0 *= ystep;\n\t\tzoff0 *= zstep;\n\t\txoff1 *= xstep;\n\t\tyoff1 *= ystep;\n\t\tzoff1 *= zstep;\n\n\t\tfor (var xoff = xoff0; xoff <= xoff1; xoff += xstep) {\n\t\t\tfor (var yoff = yoff0; yoff <= yoff1; yoff += ystep) {\n\t\t\t\tfor (var zoff = zoff0; zoff <= zoff1; zoff += zstep) {\n\t\t\t\t\tvar idx = xoff+yoff+zoff;\n\t\t\t\t\tbins[idx][binLengths[idx]++] = bi;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n    // Put all bodies into the bins\n    for(var i=0; i!==N; i++){\n        var bi = bodies[i];\n        var si = bi.shape;\n\n        switch(si.type){\n        case SPHERE:\n            // Put in bin\n            // check if overlap with other bins\n            var x = bi.position.x,\n                y = bi.position.y,\n                z = bi.position.z;\n            var r = si.radius;\n\n\t\t\taddBoxToBins(x-r, y-r, z-r, x+r, y+r, z+r, bi);\n            break;\n\n        case PLANE:\n            if(si.worldNormalNeedsUpdate){\n                si.computeWorldNormal(bi.quaternion);\n            }\n            var planeNormal = si.worldNormal;\n\n\t\t\t//Relative position from origin of plane object to the first bin\n\t\t\t//Incremented as we iterate through the bins\n\t\t\tvar xreset = xmin + binsizeX*0.5 - bi.position.x,\n\t\t\t\tyreset = ymin + binsizeY*0.5 - bi.position.y,\n\t\t\t\tzreset = zmin + binsizeZ*0.5 - bi.position.z;\n\n            var d = GridBroadphase_collisionPairs_d;\n\t\t\td.set(xreset, yreset, zreset);\n\n\t\t\tfor (var xi = 0, xoff = 0; xi !== nx; xi++, xoff += xstep, d.y = yreset, d.x += binsizeX) {\n\t\t\t\tfor (var yi = 0, yoff = 0; yi !== ny; yi++, yoff += ystep, d.z = zreset, d.y += binsizeY) {\n\t\t\t\t\tfor (var zi = 0, zoff = 0; zi !== nz; zi++, zoff += zstep, d.z += binsizeZ) {\n\t\t\t\t\t\tif (d.dot(planeNormal) < binRadius) {\n\t\t\t\t\t\t\tvar idx = xoff + yoff + zoff;\n\t\t\t\t\t\t\tbins[idx][binLengths[idx]++] = bi;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n            break;\n\n        default:\n\t\t\tif (bi.aabbNeedsUpdate) {\n\t\t\t\tbi.computeAABB();\n\t\t\t}\n\n\t\t\taddBoxToBins(\n\t\t\t\tbi.aabb.lowerBound.x,\n\t\t\t\tbi.aabb.lowerBound.y,\n\t\t\t\tbi.aabb.lowerBound.z,\n\t\t\t\tbi.aabb.upperBound.x,\n\t\t\t\tbi.aabb.upperBound.y,\n\t\t\t\tbi.aabb.upperBound.z,\n\t\t\t\tbi);\n            break;\n        }\n    }\n\n    // Check each bin\n    for(var i=0; i!==Nbins; i++){\n\t\tvar binLength = binLengths[i];\n\t\t//Skip bins with no potential collisions\n\t\tif (binLength > 1) {\n\t\t\tvar bin = bins[i];\n\n\t\t\t// Do N^2 broadphase inside\n\t\t\tfor(var xi=0; xi!==binLength; xi++){\n\t\t\t\tvar bi = bin[xi];\n\t\t\t\tfor(var yi=0; yi!==xi; yi++){\n\t\t\t\t\tvar bj = bin[yi];\n\t\t\t\t\tif(this.needBroadphaseCollision(bi,bj)){\n\t\t\t\t\t\tthis.intersectionTest(bi,bj,pairs1,pairs2);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n    }\n\n//\tfor (var zi = 0, zoff=0; zi < nz; zi++, zoff+= zstep) {\n//\t\tconsole.log(\"layer \"+zi);\n//\t\tfor (var yi = 0, yoff=0; yi < ny; yi++, yoff += ystep) {\n//\t\t\tvar row = '';\n//\t\t\tfor (var xi = 0, xoff=0; xi < nx; xi++, xoff += xstep) {\n//\t\t\t\tvar idx = xoff + yoff + zoff;\n//\t\t\t\trow += ' ' + binLengths[idx];\n//\t\t\t}\n//\t\t\tconsole.log(row);\n//\t\t}\n//\t}\n\n    this.makePairsUnique(pairs1,pairs2);\n};\n\n},{\"../math/Vec3\":30,\"../shapes/Shape\":43,\"./Broadphase\":5}],7:[function(_dereq_,module,exports){\nmodule.exports = NaiveBroadphase;\n\nvar Broadphase = _dereq_('./Broadphase');\nvar AABB = _dereq_('./AABB');\n\n/**\n * Naive broadphase implementation, used in lack of better ones.\n * @class NaiveBroadphase\n * @constructor\n * @description The naive broadphase looks at all possible pairs without restriction, therefore it has complexity N^2 (which is bad)\n * @extends Broadphase\n */\nfunction NaiveBroadphase(){\n    Broadphase.apply(this);\n}\nNaiveBroadphase.prototype = new Broadphase();\nNaiveBroadphase.prototype.constructor = NaiveBroadphase;\n\n/**\n * Get all the collision pairs in the physics world\n * @method collisionPairs\n * @param {World} world\n * @param {Array} pairs1\n * @param {Array} pairs2\n */\nNaiveBroadphase.prototype.collisionPairs = function(world,pairs1,pairs2){\n    var bodies = world.bodies,\n        n = bodies.length,\n        i,j,bi,bj;\n\n    // Naive N^2 ftw!\n    for(i=0; i!==n; i++){\n        for(j=0; j!==i; j++){\n\n            bi = bodies[i];\n            bj = bodies[j];\n\n            if(!this.needBroadphaseCollision(bi,bj)){\n                continue;\n            }\n\n            this.intersectionTest(bi,bj,pairs1,pairs2);\n        }\n    }\n};\n\nvar tmpAABB = new AABB();\n\n/**\n * Returns all the bodies within an AABB.\n * @method aabbQuery\n * @param  {World} world\n * @param  {AABB} aabb\n * @param {array} result An array to store resulting bodies in.\n * @return {array}\n */\nNaiveBroadphase.prototype.aabbQuery = function(world, aabb, result){\n    result = result || [];\n\n    for(var i = 0; i < world.bodies.length; i++){\n        var b = world.bodies[i];\n\n        if(b.aabbNeedsUpdate){\n            b.computeAABB();\n        }\n\n        // Ugly hack until Body gets aabb\n        if(b.aabb.overlaps(aabb)){\n            result.push(b);\n        }\n    }\n\n    return result;\n};\n},{\"./AABB\":3,\"./Broadphase\":5}],8:[function(_dereq_,module,exports){\nmodule.exports = ObjectCollisionMatrix;\n\n/**\n * Records what objects are colliding with each other\n * @class ObjectCollisionMatrix\n * @constructor\n */\nfunction ObjectCollisionMatrix() {\n\n    /**\n     * The matrix storage\n     * @property matrix\n     * @type {Object}\n     */\n\tthis.matrix = {};\n}\n\n/**\n * @method get\n * @param  {Number} i\n * @param  {Number} j\n * @return {Number}\n */\nObjectCollisionMatrix.prototype.get = function(i, j) {\n\ti = i.id;\n\tj = j.id;\n    if (j > i) {\n        var temp = j;\n        j = i;\n        i = temp;\n    }\n\treturn i+'-'+j in this.matrix;\n};\n\n/**\n * @method set\n * @param  {Number} i\n * @param  {Number} j\n * @param {Number} value\n */\nObjectCollisionMatrix.prototype.set = function(i, j, value) {\n\ti = i.id;\n\tj = j.id;\n    if (j > i) {\n        var temp = j;\n        j = i;\n        i = temp;\n\t}\n\tif (value) {\n\t\tthis.matrix[i+'-'+j] = true;\n\t}\n\telse {\n\t\tdelete this.matrix[i+'-'+j];\n\t}\n};\n\n/**\n * Empty the matrix\n * @method reset\n */\nObjectCollisionMatrix.prototype.reset = function() {\n\tthis.matrix = {};\n};\n\n/**\n * Set max number of objects\n * @method setNumObjects\n * @param {Number} n\n */\nObjectCollisionMatrix.prototype.setNumObjects = function(n) {\n};\n\n},{}],9:[function(_dereq_,module,exports){\nmodule.exports = Ray;\n\nvar Vec3 = _dereq_('../math/Vec3');\nvar Quaternion = _dereq_('../math/Quaternion');\nvar Transform = _dereq_('../math/Transform');\nvar ConvexPolyhedron = _dereq_('../shapes/ConvexPolyhedron');\nvar Box = _dereq_('../shapes/Box');\nvar RaycastResult = _dereq_('../collision/RaycastResult');\nvar Shape = _dereq_('../shapes/Shape');\nvar AABB = _dereq_('../collision/AABB');\n\n/**\n * A line in 3D space that intersects bodies and return points.\n * @class Ray\n * @constructor\n * @param {Vec3} from\n * @param {Vec3} to\n */\nfunction Ray(from, to){\n    /**\n     * @property {Vec3} from\n     */\n    this.from = from ? from.clone() : new Vec3();\n\n    /**\n     * @property {Vec3} to\n     */\n    this.to = to ? to.clone() : new Vec3();\n\n    /**\n     * @private\n     * @property {Vec3} _direction\n     */\n    this._direction = new Vec3();\n\n    /**\n     * The precision of the ray. Used when checking parallelity etc.\n     * @property {Number} precision\n     */\n    this.precision = 0.0001;\n\n    /**\n     * Set to true if you want the Ray to take .collisionResponse flags into account on bodies and shapes.\n     * @property {Boolean} checkCollisionResponse\n     */\n    this.checkCollisionResponse = true;\n\n    /**\n     * If set to true, the ray skips any hits with normal.dot(rayDirection) < 0.\n     * @property {Boolean} skipBackfaces\n     */\n    this.skipBackfaces = false;\n\n    /**\n     * @property {number} collisionFilterMask\n     * @default -1\n     */\n    this.collisionFilterMask = -1;\n\n    /**\n     * @property {number} collisionFilterGroup\n     * @default -1\n     */\n    this.collisionFilterGroup = -1;\n\n    /**\n     * The intersection mode. Should be Ray.ANY, Ray.ALL or Ray.CLOSEST.\n     * @property {number} mode\n     */\n    this.mode = Ray.ANY;\n\n    /**\n     * Current result object.\n     * @property {RaycastResult} result\n     */\n    this.result = new RaycastResult();\n\n    /**\n     * Will be set to true during intersectWorld() if the ray hit anything.\n     * @property {Boolean} hasHit\n     */\n    this.hasHit = false;\n\n    /**\n     * Current, user-provided result callback. Will be used if mode is Ray.ALL.\n     * @property {Function} callback\n     */\n    this.callback = function(result){};\n}\nRay.prototype.constructor = Ray;\n\nRay.CLOSEST = 1;\nRay.ANY = 2;\nRay.ALL = 4;\n\nvar tmpAABB = new AABB();\nvar tmpArray = [];\n\n/**\n * Do itersection against all bodies in the given World.\n * @method intersectWorld\n * @param  {World} world\n * @param  {object} options\n * @return {Boolean} True if the ray hit anything, otherwise false.\n */\nRay.prototype.intersectWorld = function (world, options) {\n    this.mode = options.mode || Ray.ANY;\n    this.result = options.result || new RaycastResult();\n    this.skipBackfaces = !!options.skipBackfaces;\n    this.collisionFilterMask = typeof(options.collisionFilterMask) !== 'undefined' ? options.collisionFilterMask : -1;\n    this.collisionFilterGroup = typeof(options.collisionFilterGroup) !== 'undefined' ? options.collisionFilterGroup : -1;\n    if(options.from){\n        this.from.copy(options.from);\n    }\n    if(options.to){\n        this.to.copy(options.to);\n    }\n    this.callback = options.callback || function(){};\n    this.hasHit = false;\n\n    this.result.reset();\n    this._updateDirection();\n\n    this.getAABB(tmpAABB);\n    tmpArray.length = 0;\n    world.broadphase.aabbQuery(world, tmpAABB, tmpArray);\n    this.intersectBodies(tmpArray);\n\n    return this.hasHit;\n};\n\nvar v1 = new Vec3(),\n    v2 = new Vec3();\n\n/*\n * As per \"Barycentric Technique\" as named here http://www.blackpawn.com/texts/pointinpoly/default.html But without the division\n */\nRay.pointInTriangle = pointInTriangle;\nfunction pointInTriangle(p, a, b, c) {\n    c.vsub(a,v0);\n    b.vsub(a,v1);\n    p.vsub(a,v2);\n\n    var dot00 = v0.dot( v0 );\n    var dot01 = v0.dot( v1 );\n    var dot02 = v0.dot( v2 );\n    var dot11 = v1.dot( v1 );\n    var dot12 = v1.dot( v2 );\n\n    var u,v;\n\n    return  ( (u = dot11 * dot02 - dot01 * dot12) >= 0 ) &&\n            ( (v = dot00 * dot12 - dot01 * dot02) >= 0 ) &&\n            ( u + v < ( dot00 * dot11 - dot01 * dot01 ) );\n}\n\n/**\n * Shoot a ray at a body, get back information about the hit.\n * @method intersectBody\n * @private\n * @param {Body} body\n * @param {RaycastResult} [result] Deprecated - set the result property of the Ray instead.\n */\nvar intersectBody_xi = new Vec3();\nvar intersectBody_qi = new Quaternion();\nRay.prototype.intersectBody = function (body, result) {\n    if(result){\n        this.result = result;\n        this._updateDirection();\n    }\n    var checkCollisionResponse = this.checkCollisionResponse;\n\n    if(checkCollisionResponse && !body.collisionResponse){\n        return;\n    }\n\n    if((this.collisionFilterGroup & body.collisionFilterMask)===0 || (body.collisionFilterGroup & this.collisionFilterMask)===0){\n        return;\n    }\n\n    var xi = intersectBody_xi;\n    var qi = intersectBody_qi;\n\n    for (var i = 0, N = body.shapes.length; i < N; i++) {\n        var shape = body.shapes[i];\n\n        if(checkCollisionResponse && !shape.collisionResponse){\n            continue; // Skip\n        }\n\n        body.quaternion.mult(body.shapeOrientations[i], qi);\n        body.quaternion.vmult(body.shapeOffsets[i], xi);\n        xi.vadd(body.position, xi);\n\n        this.intersectShape(\n            shape,\n            qi,\n            xi,\n            body\n        );\n\n        if(this.result._shouldStop){\n            break;\n        }\n    }\n};\n\n/**\n * @method intersectBodies\n * @param {Array} bodies An array of Body objects.\n * @param {RaycastResult} [result] Deprecated\n */\nRay.prototype.intersectBodies = function (bodies, result) {\n    if(result){\n        this.result = result;\n        this._updateDirection();\n    }\n\n    for ( var i = 0, l = bodies.length; !this.result._shouldStop && i < l; i ++ ) {\n        this.intersectBody(bodies[i]);\n    }\n};\n\n/**\n * Updates the _direction vector.\n * @private\n * @method _updateDirection\n */\nRay.prototype._updateDirection = function(){\n    this.to.vsub(this.from, this._direction);\n    this._direction.normalize();\n};\n\n/**\n * @method intersectShape\n * @private\n * @param {Shape} shape\n * @param {Quaternion} quat\n * @param {Vec3} position\n * @param {Body} body\n */\nRay.prototype.intersectShape = function(shape, quat, position, body){\n    var from = this.from;\n\n\n    // Checking boundingSphere\n    var distance = distanceFromIntersection(from, this._direction, position);\n    if ( distance > shape.boundingSphereRadius ) {\n        return;\n    }\n\n    var intersectMethod = this[shape.type];\n    if(intersectMethod){\n        intersectMethod.call(this, shape, quat, position, body);\n    }\n};\n\nvar vector = new Vec3();\nvar normal = new Vec3();\nvar intersectPoint = new Vec3();\n\nvar a = new Vec3();\nvar b = new Vec3();\nvar c = new Vec3();\nvar d = new Vec3();\n\nvar tmpRaycastResult = new RaycastResult();\n\n/**\n * @method intersectBox\n * @private\n * @param  {Shape} shape\n * @param  {Quaternion} quat\n * @param  {Vec3} position\n * @param  {Body} body\n */\nRay.prototype.intersectBox = function(shape, quat, position, body){\n    return this.intersectConvex(shape.convexPolyhedronRepresentation, quat, position, body);\n};\nRay.prototype[Shape.types.BOX] = Ray.prototype.intersectBox;\n\n/**\n * @method intersectPlane\n * @private\n * @param  {Shape} shape\n * @param  {Quaternion} quat\n * @param  {Vec3} position\n * @param  {Body} body\n */\nRay.prototype.intersectPlane = function(shape, quat, position, body){\n    var from = this.from;\n    var to = this.to;\n    var direction = this._direction;\n\n    // Get plane normal\n    var worldNormal = new Vec3(0, 0, 1);\n    quat.vmult(worldNormal, worldNormal);\n\n    var len = new Vec3();\n    from.vsub(position, len);\n    var planeToFrom = len.dot(worldNormal);\n    to.vsub(position, len);\n    var planeToTo = len.dot(worldNormal);\n\n    if(planeToFrom * planeToTo > 0){\n        // \"from\" and \"to\" are on the same side of the plane... bail out\n        return;\n    }\n\n    if(from.distanceTo(to) < planeToFrom){\n        return;\n    }\n\n    var n_dot_dir = worldNormal.dot(direction);\n\n    if (Math.abs(n_dot_dir) < this.precision) {\n        // No intersection\n        return;\n    }\n\n    var planePointToFrom = new Vec3();\n    var dir_scaled_with_t = new Vec3();\n    var hitPointWorld = new Vec3();\n\n    from.vsub(position, planePointToFrom);\n    var t = -worldNormal.dot(planePointToFrom) / n_dot_dir;\n    direction.scale(t, dir_scaled_with_t);\n    from.vadd(dir_scaled_with_t, hitPointWorld);\n\n    this.reportIntersection(worldNormal, hitPointWorld, shape, body, -1);\n};\nRay.prototype[Shape.types.PLANE] = Ray.prototype.intersectPlane;\n\n/**\n * Get the world AABB of the ray.\n * @method getAABB\n * @param  {AABB} aabb\n */\nRay.prototype.getAABB = function(result){\n    var to = this.to;\n    var from = this.from;\n    result.lowerBound.x = Math.min(to.x, from.x);\n    result.lowerBound.y = Math.min(to.y, from.y);\n    result.lowerBound.z = Math.min(to.z, from.z);\n    result.upperBound.x = Math.max(to.x, from.x);\n    result.upperBound.y = Math.max(to.y, from.y);\n    result.upperBound.z = Math.max(to.z, from.z);\n};\n\nvar intersectConvexOptions = {\n    faceList: [0]\n};\n\n/**\n * @method intersectHeightfield\n * @private\n * @param  {Shape} shape\n * @param  {Quaternion} quat\n * @param  {Vec3} position\n * @param  {Body} body\n */\nRay.prototype.intersectHeightfield = function(shape, quat, position, body){\n    var data = shape.data,\n        w = shape.elementSize,\n        worldPillarOffset = new Vec3();\n\n    // Convert the ray to local heightfield coordinates\n    var localRay = new Ray(this.from, this.to);\n    Transform.pointToLocalFrame(position, quat, localRay.from, localRay.from);\n    Transform.pointToLocalFrame(position, quat, localRay.to, localRay.to);\n\n    // Get the index of the data points to test against\n    var index = [];\n    var iMinX = null;\n    var iMinY = null;\n    var iMaxX = null;\n    var iMaxY = null;\n\n    var inside = shape.getIndexOfPosition(localRay.from.x, localRay.from.y, index, false);\n    if(inside){\n        iMinX = index[0];\n        iMinY = index[1];\n        iMaxX = index[0];\n        iMaxY = index[1];\n    }\n    inside = shape.getIndexOfPosition(localRay.to.x, localRay.to.y, index, false);\n    if(inside){\n        if (iMinX === null || index[0] < iMinX) { iMinX = index[0]; }\n        if (iMaxX === null || index[0] > iMaxX) { iMaxX = index[0]; }\n        if (iMinY === null || index[1] < iMinY) { iMinY = index[1]; }\n        if (iMaxY === null || index[1] > iMaxY) { iMaxY = index[1]; }\n    }\n\n    if(iMinX === null){\n        return;\n    }\n\n    var minMax = [];\n    shape.getRectMinMax(iMinX, iMinY, iMaxX, iMaxY, minMax);\n    var min = minMax[0];\n    var max = minMax[1];\n\n    // // Bail out if the ray can't touch the bounding box\n    // // TODO\n    // var aabb = new AABB();\n    // this.getAABB(aabb);\n    // if(aabb.intersects()){\n    //     return;\n    // }\n\n    for(var i = iMinX; i <= iMaxX; i++){\n        for(var j = iMinY; j <= iMaxY; j++){\n\n            if(this.result._shouldStop){\n                return;\n            }\n\n            // Lower triangle\n            shape.getConvexTrianglePillar(i, j, false);\n            Transform.pointToWorldFrame(position, quat, shape.pillarOffset, worldPillarOffset);\n            this.intersectConvex(shape.pillarConvex, quat, worldPillarOffset, body, intersectConvexOptions);\n\n            if(this.result._shouldStop){\n                return;\n            }\n\n            // Upper triangle\n            shape.getConvexTrianglePillar(i, j, true);\n            Transform.pointToWorldFrame(position, quat, shape.pillarOffset, worldPillarOffset);\n            this.intersectConvex(shape.pillarConvex, quat, worldPillarOffset, body, intersectConvexOptions);\n        }\n    }\n};\nRay.prototype[Shape.types.HEIGHTFIELD] = Ray.prototype.intersectHeightfield;\n\nvar Ray_intersectSphere_intersectionPoint = new Vec3();\nvar Ray_intersectSphere_normal = new Vec3();\n\n/**\n * @method intersectSphere\n * @private\n * @param  {Shape} shape\n * @param  {Quaternion} quat\n * @param  {Vec3} position\n * @param  {Body} body\n */\nRay.prototype.intersectSphere = function(shape, quat, position, body){\n    var from = this.from,\n        to = this.to,\n        r = shape.radius;\n\n    var a = Math.pow(to.x - from.x, 2) + Math.pow(to.y - from.y, 2) + Math.pow(to.z - from.z, 2);\n    var b = 2 * ((to.x - from.x) * (from.x - position.x) + (to.y - from.y) * (from.y - position.y) + (to.z - from.z) * (from.z - position.z));\n    var c = Math.pow(from.x - position.x, 2) + Math.pow(from.y - position.y, 2) + Math.pow(from.z - position.z, 2) - Math.pow(r, 2);\n\n    var delta = Math.pow(b, 2) - 4 * a * c;\n\n    var intersectionPoint = Ray_intersectSphere_intersectionPoint;\n    var normal = Ray_intersectSphere_normal;\n\n    if(delta < 0){\n        // No intersection\n        return;\n\n    } else if(delta === 0){\n        // single intersection point\n        from.lerp(to, delta, intersectionPoint);\n\n        intersectionPoint.vsub(position, normal);\n        normal.normalize();\n\n        this.reportIntersection(normal, intersectionPoint, shape, body, -1);\n\n    } else {\n        var d1 = (- b - Math.sqrt(delta)) / (2 * a);\n        var d2 = (- b + Math.sqrt(delta)) / (2 * a);\n\n        if(d1 >= 0 && d1 <= 1){\n            from.lerp(to, d1, intersectionPoint);\n            intersectionPoint.vsub(position, normal);\n            normal.normalize();\n            this.reportIntersection(normal, intersectionPoint, shape, body, -1);\n        }\n\n        if(this.result._shouldStop){\n            return;\n        }\n\n        if(d2 >= 0 && d2 <= 1){\n            from.lerp(to, d2, intersectionPoint);\n            intersectionPoint.vsub(position, normal);\n            normal.normalize();\n            this.reportIntersection(normal, intersectionPoint, shape, body, -1);\n        }\n    }\n};\nRay.prototype[Shape.types.SPHERE] = Ray.prototype.intersectSphere;\n\n\nvar intersectConvex_normal = new Vec3();\nvar intersectConvex_minDistNormal = new Vec3();\nvar intersectConvex_minDistIntersect = new Vec3();\nvar intersectConvex_vector = new Vec3();\n\n/**\n * @method intersectConvex\n * @private\n * @param  {Shape} shape\n * @param  {Quaternion} quat\n * @param  {Vec3} position\n * @param  {Body} body\n * @param {object} [options]\n * @param {array} [options.faceList]\n */\nRay.prototype.intersectConvex = function intersectConvex(\n    shape,\n    quat,\n    position,\n    body,\n    options\n){\n    var minDistNormal = intersectConvex_minDistNormal;\n    var normal = intersectConvex_normal;\n    var vector = intersectConvex_vector;\n    var minDistIntersect = intersectConvex_minDistIntersect;\n    var faceList = (options && options.faceList) || null;\n\n    // Checking faces\n    var faces = shape.faces,\n        vertices = shape.vertices,\n        normals = shape.faceNormals;\n    var direction = this._direction;\n\n    var from = this.from;\n    var to = this.to;\n    var fromToDistance = from.distanceTo(to);\n\n    var minDist = -1;\n    var Nfaces = faceList ? faceList.length : faces.length;\n    var result = this.result;\n\n    for (var j = 0; !result._shouldStop && j < Nfaces; j++) {\n        var fi = faceList ? faceList[j] : j;\n\n        var face = faces[fi];\n        var faceNormal = normals[fi];\n        var q = quat;\n        var x = position;\n\n        // determine if ray intersects the plane of the face\n        // note: this works regardless of the direction of the face normal\n\n        // Get plane point in world coordinates...\n        vector.copy(vertices[face[0]]);\n        q.vmult(vector,vector);\n        vector.vadd(x,vector);\n\n        // ...but make it relative to the ray from. We'll fix this later.\n        vector.vsub(from,vector);\n\n        // Get plane normal\n        q.vmult(faceNormal,normal);\n\n        // If this dot product is negative, we have something interesting\n        var dot = direction.dot(normal);\n\n        // Bail out if ray and plane are parallel\n        if ( Math.abs( dot ) < this.precision ){\n            continue;\n        }\n\n        // calc distance to plane\n        var scalar = normal.dot(vector) / dot;\n\n        // if negative distance, then plane is behind ray\n        if (scalar < 0){\n            continue;\n        }\n\n        // if (dot < 0) {\n\n        // Intersection point is from + direction * scalar\n        direction.mult(scalar,intersectPoint);\n        intersectPoint.vadd(from,intersectPoint);\n\n        // a is the point we compare points b and c with.\n        a.copy(vertices[face[0]]);\n        q.vmult(a,a);\n        x.vadd(a,a);\n\n        for(var i = 1; !result._shouldStop && i < face.length - 1; i++){\n            // Transform 3 vertices to world coords\n            b.copy(vertices[face[i]]);\n            c.copy(vertices[face[i+1]]);\n            q.vmult(b,b);\n            q.vmult(c,c);\n            x.vadd(b,b);\n            x.vadd(c,c);\n\n            var distance = intersectPoint.distanceTo(from);\n\n            if(!(pointInTriangle(intersectPoint, a, b, c) || pointInTriangle(intersectPoint, b, a, c)) || distance > fromToDistance){\n                continue;\n            }\n\n            this.reportIntersection(normal, intersectPoint, shape, body, fi);\n        }\n        // }\n    }\n};\nRay.prototype[Shape.types.CONVEXPOLYHEDRON] = Ray.prototype.intersectConvex;\n\nvar intersectTrimesh_normal = new Vec3();\nvar intersectTrimesh_localDirection = new Vec3();\nvar intersectTrimesh_localFrom = new Vec3();\nvar intersectTrimesh_localTo = new Vec3();\nvar intersectTrimesh_worldNormal = new Vec3();\nvar intersectTrimesh_worldIntersectPoint = new Vec3();\nvar intersectTrimesh_localAABB = new AABB();\nvar intersectTrimesh_triangles = [];\nvar intersectTrimesh_treeTransform = new Transform();\n\n/**\n * @method intersectTrimesh\n * @private\n * @param  {Shape} shape\n * @param  {Quaternion} quat\n * @param  {Vec3} position\n * @param  {Body} body\n * @param {object} [options]\n * @todo Optimize by transforming the world to local space first.\n * @todo Use Octree lookup\n */\nRay.prototype.intersectTrimesh = function intersectTrimesh(\n    mesh,\n    quat,\n    position,\n    body,\n    options\n){\n    var normal = intersectTrimesh_normal;\n    var triangles = intersectTrimesh_triangles;\n    var treeTransform = intersectTrimesh_treeTransform;\n    var minDistNormal = intersectConvex_minDistNormal;\n    var vector = intersectConvex_vector;\n    var minDistIntersect = intersectConvex_minDistIntersect;\n    var localAABB = intersectTrimesh_localAABB;\n    var localDirection = intersectTrimesh_localDirection;\n    var localFrom = intersectTrimesh_localFrom;\n    var localTo = intersectTrimesh_localTo;\n    var worldIntersectPoint = intersectTrimesh_worldIntersectPoint;\n    var worldNormal = intersectTrimesh_worldNormal;\n    var faceList = (options && options.faceList) || null;\n\n    // Checking faces\n    var indices = mesh.indices,\n        vertices = mesh.vertices,\n        normals = mesh.faceNormals;\n\n    var from = this.from;\n    var to = this.to;\n    var direction = this._direction;\n\n    var minDist = -1;\n    treeTransform.position.copy(position);\n    treeTransform.quaternion.copy(quat);\n\n    // Transform ray to local space!\n    Transform.vectorToLocalFrame(position, quat, direction, localDirection);\n    //body.vectorToLocalFrame(direction, localDirection);\n    Transform.pointToLocalFrame(position, quat, from, localFrom);\n    //body.pointToLocalFrame(from, localFrom);\n    Transform.pointToLocalFrame(position, quat, to, localTo);\n    //body.pointToLocalFrame(to, localTo);\n    var fromToDistanceSquared = localFrom.distanceSquared(localTo);\n\n    mesh.tree.rayQuery(this, treeTransform, triangles);\n\n    for (var i = 0, N = triangles.length; !this.result._shouldStop && i !== N; i++) {\n        var trianglesIndex = triangles[i];\n\n        mesh.getNormal(trianglesIndex, normal);\n\n        // determine if ray intersects the plane of the face\n        // note: this works regardless of the direction of the face normal\n\n        // Get plane point in world coordinates...\n        mesh.getVertex(indices[trianglesIndex * 3], a);\n\n        // ...but make it relative to the ray from. We'll fix this later.\n        a.vsub(localFrom,vector);\n\n        // Get plane normal\n        // quat.vmult(normal, normal);\n\n        // If this dot product is negative, we have something interesting\n        var dot = localDirection.dot(normal);\n\n        // Bail out if ray and plane are parallel\n        // if (Math.abs( dot ) < this.precision){\n        //     continue;\n        // }\n\n        // calc distance to plane\n        var scalar = normal.dot(vector) / dot;\n\n        // if negative distance, then plane is behind ray\n        if (scalar < 0){\n            continue;\n        }\n\n        // Intersection point is from + direction * scalar\n        localDirection.scale(scalar,intersectPoint);\n        intersectPoint.vadd(localFrom,intersectPoint);\n\n        // Get triangle vertices\n        mesh.getVertex(indices[trianglesIndex * 3 + 1], b);\n        mesh.getVertex(indices[trianglesIndex * 3 + 2], c);\n\n        var squaredDistance = intersectPoint.distanceSquared(localFrom);\n\n        if(!(pointInTriangle(intersectPoint, b, a, c) || pointInTriangle(intersectPoint, a, b, c)) || squaredDistance > fromToDistanceSquared){\n            continue;\n        }\n\n        // transform intersectpoint and normal to world\n        Transform.vectorToWorldFrame(quat, normal, worldNormal);\n        //body.vectorToWorldFrame(normal, worldNormal);\n        Transform.pointToWorldFrame(position, quat, intersectPoint, worldIntersectPoint);\n        //body.pointToWorldFrame(intersectPoint, worldIntersectPoint);\n        this.reportIntersection(worldNormal, worldIntersectPoint, mesh, body, trianglesIndex);\n    }\n    triangles.length = 0;\n};\nRay.prototype[Shape.types.TRIMESH] = Ray.prototype.intersectTrimesh;\n\n\n/**\n * @method reportIntersection\n * @private\n * @param  {Vec3} normal\n * @param  {Vec3} hitPointWorld\n * @param  {Shape} shape\n * @param  {Body} body\n * @return {boolean} True if the intersections should continue\n */\nRay.prototype.reportIntersection = function(normal, hitPointWorld, shape, body, hitFaceIndex){\n    var from = this.from;\n    var to = this.to;\n    var distance = from.distanceTo(hitPointWorld);\n    var result = this.result;\n\n    // Skip back faces?\n    if(this.skipBackfaces && normal.dot(this._direction) > 0){\n        return;\n    }\n\n    result.hitFaceIndex = typeof(hitFaceIndex) !== 'undefined' ? hitFaceIndex : -1;\n\n    switch(this.mode){\n    case Ray.ALL:\n        this.hasHit = true;\n        result.set(\n            from,\n            to,\n            normal,\n            hitPointWorld,\n            shape,\n            body,\n            distance\n        );\n        result.hasHit = true;\n        this.callback(result);\n        break;\n\n    case Ray.CLOSEST:\n\n        // Store if closer than current closest\n        if(distance < result.distance || !result.hasHit){\n            this.hasHit = true;\n            result.hasHit = true;\n            result.set(\n                from,\n                to,\n                normal,\n                hitPointWorld,\n                shape,\n                body,\n                distance\n            );\n        }\n        break;\n\n    case Ray.ANY:\n\n        // Report and stop.\n        this.hasHit = true;\n        result.hasHit = true;\n        result.set(\n            from,\n            to,\n            normal,\n            hitPointWorld,\n            shape,\n            body,\n            distance\n        );\n        result._shouldStop = true;\n        break;\n    }\n};\n\nvar v0 = new Vec3(),\n    intersect = new Vec3();\nfunction distanceFromIntersection(from, direction, position) {\n\n    // v0 is vector from from to position\n    position.vsub(from,v0);\n    var dot = v0.dot(direction);\n\n    // intersect = direction*dot + from\n    direction.mult(dot,intersect);\n    intersect.vadd(from,intersect);\n\n    var distance = position.distanceTo(intersect);\n\n    return distance;\n}\n\n\n},{\"../collision/AABB\":3,\"../collision/RaycastResult\":10,\"../math/Quaternion\":28,\"../math/Transform\":29,\"../math/Vec3\":30,\"../shapes/Box\":37,\"../shapes/ConvexPolyhedron\":38,\"../shapes/Shape\":43}],10:[function(_dereq_,module,exports){\nvar Vec3 = _dereq_('../math/Vec3');\n\nmodule.exports = RaycastResult;\n\n/**\n * Storage for Ray casting data.\n * @class RaycastResult\n * @constructor\n */\nfunction RaycastResult(){\n\n\t/**\n\t * @property {Vec3} rayFromWorld\n\t */\n\tthis.rayFromWorld = new Vec3();\n\n\t/**\n\t * @property {Vec3} rayToWorld\n\t */\n\tthis.rayToWorld = new Vec3();\n\n\t/**\n\t * @property {Vec3} hitNormalWorld\n\t */\n\tthis.hitNormalWorld = new Vec3();\n\n\t/**\n\t * @property {Vec3} hitPointWorld\n\t */\n\tthis.hitPointWorld = new Vec3();\n\n\t/**\n\t * @property {boolean} hasHit\n\t */\n\tthis.hasHit = false;\n\n\t/**\n\t * The hit shape, or null.\n\t * @property {Shape} shape\n\t */\n\tthis.shape = null;\n\n\t/**\n\t * The hit body, or null.\n\t * @property {Body} body\n\t */\n\tthis.body = null;\n\n\t/**\n\t * The index of the hit triangle, if the hit shape was a trimesh.\n\t * @property {number} hitFaceIndex\n\t * @default -1\n\t */\n\tthis.hitFaceIndex = -1;\n\n\t/**\n\t * Distance to the hit. Will be set to -1 if there was no hit.\n\t * @property {number} distance\n\t * @default -1\n\t */\n\tthis.distance = -1;\n\n\t/**\n\t * If the ray should stop traversing the bodies.\n\t * @private\n\t * @property {Boolean} _shouldStop\n\t * @default false\n\t */\n\tthis._shouldStop = false;\n}\n\n/**\n * Reset all result data.\n * @method reset\n */\nRaycastResult.prototype.reset = function () {\n\tthis.rayFromWorld.setZero();\n\tthis.rayToWorld.setZero();\n\tthis.hitNormalWorld.setZero();\n\tthis.hitPointWorld.setZero();\n\tthis.hasHit = false;\n\tthis.shape = null;\n\tthis.body = null;\n\tthis.hitFaceIndex = -1;\n\tthis.distance = -1;\n\tthis._shouldStop = false;\n};\n\n/**\n * @method abort\n */\nRaycastResult.prototype.abort = function(){\n\tthis._shouldStop = true;\n};\n\n/**\n * @method set\n * @param {Vec3} rayFromWorld\n * @param {Vec3} rayToWorld\n * @param {Vec3} hitNormalWorld\n * @param {Vec3} hitPointWorld\n * @param {Shape} shape\n * @param {Body} body\n * @param {number} distance\n */\nRaycastResult.prototype.set = function(\n\trayFromWorld,\n\trayToWorld,\n\thitNormalWorld,\n\thitPointWorld,\n\tshape,\n\tbody,\n\tdistance\n){\n\tthis.rayFromWorld.copy(rayFromWorld);\n\tthis.rayToWorld.copy(rayToWorld);\n\tthis.hitNormalWorld.copy(hitNormalWorld);\n\tthis.hitPointWorld.copy(hitPointWorld);\n\tthis.shape = shape;\n\tthis.body = body;\n\tthis.distance = distance;\n};\n},{\"../math/Vec3\":30}],11:[function(_dereq_,module,exports){\nvar Shape = _dereq_('../shapes/Shape');\nvar Broadphase = _dereq_('../collision/Broadphase');\n\nmodule.exports = SAPBroadphase;\n\n/**\n * Sweep and prune broadphase along one axis.\n *\n * @class SAPBroadphase\n * @constructor\n * @param {World} [world]\n * @extends Broadphase\n */\nfunction SAPBroadphase(world){\n    Broadphase.apply(this);\n\n    /**\n     * List of bodies currently in the broadphase.\n     * @property axisList\n     * @type {Array}\n     */\n    this.axisList = [];\n\n    /**\n     * The world to search in.\n     * @property world\n     * @type {World}\n     */\n    this.world = null;\n\n    /**\n     * Axis to sort the bodies along. Set to 0 for x axis, and 1 for y axis. For best performance, choose an axis that the bodies are spread out more on.\n     * @property axisIndex\n     * @type {Number}\n     */\n    this.axisIndex = 0;\n\n    var axisList = this.axisList;\n\n    this._addBodyHandler = function(e){\n        axisList.push(e.body);\n    };\n\n    this._removeBodyHandler = function(e){\n        var idx = axisList.indexOf(e.body);\n        if(idx !== -1){\n            axisList.splice(idx,1);\n        }\n    };\n\n    if(world){\n        this.setWorld(world);\n    }\n}\nSAPBroadphase.prototype = new Broadphase();\n\n/**\n * Change the world\n * @method setWorld\n * @param  {World} world\n */\nSAPBroadphase.prototype.setWorld = function(world){\n    // Clear the old axis array\n    this.axisList.length = 0;\n\n    // Add all bodies from the new world\n    for(var i=0; i<world.bodies.length; i++){\n        this.axisList.push(world.bodies[i]);\n    }\n\n    // Remove old handlers, if any\n    world.removeEventListener(\"addBody\", this._addBodyHandler);\n    world.removeEventListener(\"removeBody\", this._removeBodyHandler);\n\n    // Add handlers to update the list of bodies.\n    world.addEventListener(\"addBody\", this._addBodyHandler);\n    world.addEventListener(\"removeBody\", this._removeBodyHandler);\n\n    this.world = world;\n    this.dirty = true;\n};\n\n/**\n * @static\n * @method insertionSortX\n * @param  {Array} a\n * @return {Array}\n */\nSAPBroadphase.insertionSortX = function(a) {\n    for(var i=1,l=a.length;i<l;i++) {\n        var v = a[i];\n        for(var j=i - 1;j>=0;j--) {\n            if(a[j].aabb.lowerBound.x <= v.aabb.lowerBound.x){\n                break;\n            }\n            a[j+1] = a[j];\n        }\n        a[j+1] = v;\n    }\n    return a;\n};\n\n/**\n * @static\n * @method insertionSortY\n * @param  {Array} a\n * @return {Array}\n */\nSAPBroadphase.insertionSortY = function(a) {\n    for(var i=1,l=a.length;i<l;i++) {\n        var v = a[i];\n        for(var j=i - 1;j>=0;j--) {\n            if(a[j].aabb.lowerBound.y <= v.aabb.lowerBound.y){\n                break;\n            }\n            a[j+1] = a[j];\n        }\n        a[j+1] = v;\n    }\n    return a;\n};\n\n/**\n * @static\n * @method insertionSortZ\n * @param  {Array} a\n * @return {Array}\n */\nSAPBroadphase.insertionSortZ = function(a) {\n    for(var i=1,l=a.length;i<l;i++) {\n        var v = a[i];\n        for(var j=i - 1;j>=0;j--) {\n            if(a[j].aabb.lowerBound.z <= v.aabb.lowerBound.z){\n                break;\n            }\n            a[j+1] = a[j];\n        }\n        a[j+1] = v;\n    }\n    return a;\n};\n\n/**\n * Collect all collision pairs\n * @method collisionPairs\n * @param  {World} world\n * @param  {Array} p1\n * @param  {Array} p2\n */\nSAPBroadphase.prototype.collisionPairs = function(world,p1,p2){\n    var bodies = this.axisList,\n        N = bodies.length,\n        axisIndex = this.axisIndex,\n        i, j;\n\n    if(this.dirty){\n        this.sortList();\n        this.dirty = false;\n    }\n\n    // Look through the list\n    for(i=0; i !== N; i++){\n        var bi = bodies[i];\n\n        for(j=i+1; j < N; j++){\n            var bj = bodies[j];\n\n            if(!this.needBroadphaseCollision(bi,bj)){\n                continue;\n            }\n\n            if(!SAPBroadphase.checkBounds(bi,bj,axisIndex)){\n                break;\n            }\n\n            this.intersectionTest(bi,bj,p1,p2);\n        }\n    }\n};\n\nSAPBroadphase.prototype.sortList = function(){\n    var axisList = this.axisList;\n    var axisIndex = this.axisIndex;\n    var N = axisList.length;\n\n    // Update AABBs\n    for(var i = 0; i!==N; i++){\n        var bi = axisList[i];\n        if(bi.aabbNeedsUpdate){\n            bi.computeAABB();\n        }\n    }\n\n    // Sort the list\n    if(axisIndex === 0){\n        SAPBroadphase.insertionSortX(axisList);\n    } else if(axisIndex === 1){\n        SAPBroadphase.insertionSortY(axisList);\n    } else if(axisIndex === 2){\n        SAPBroadphase.insertionSortZ(axisList);\n    }\n};\n\n/**\n * Check if the bounds of two bodies overlap, along the given SAP axis.\n * @static\n * @method checkBounds\n * @param  {Body} bi\n * @param  {Body} bj\n * @param  {Number} axisIndex\n * @return {Boolean}\n */\nSAPBroadphase.checkBounds = function(bi, bj, axisIndex){\n    var biPos;\n    var bjPos;\n\n    if(axisIndex === 0){\n        biPos = bi.position.x;\n        bjPos = bj.position.x;\n    } else if(axisIndex === 1){\n        biPos = bi.position.y;\n        bjPos = bj.position.y;\n    } else if(axisIndex === 2){\n        biPos = bi.position.z;\n        bjPos = bj.position.z;\n    }\n\n    var ri = bi.boundingRadius,\n        rj = bj.boundingRadius,\n        boundA1 = biPos - ri,\n        boundA2 = biPos + ri,\n        boundB1 = bjPos - rj,\n        boundB2 = bjPos + rj;\n\n    return boundB1 < boundA2;\n};\n\n/**\n * Computes the variance of the body positions and estimates the best\n * axis to use. Will automatically set property .axisIndex.\n * @method autoDetectAxis\n */\nSAPBroadphase.prototype.autoDetectAxis = function(){\n    var sumX=0,\n        sumX2=0,\n        sumY=0,\n        sumY2=0,\n        sumZ=0,\n        sumZ2=0,\n        bodies = this.axisList,\n        N = bodies.length,\n        invN=1/N;\n\n    for(var i=0; i!==N; i++){\n        var b = bodies[i];\n\n        var centerX = b.position.x;\n        sumX += centerX;\n        sumX2 += centerX*centerX;\n\n        var centerY = b.position.y;\n        sumY += centerY;\n        sumY2 += centerY*centerY;\n\n        var centerZ = b.position.z;\n        sumZ += centerZ;\n        sumZ2 += centerZ*centerZ;\n    }\n\n    var varianceX = sumX2 - sumX*sumX*invN,\n        varianceY = sumY2 - sumY*sumY*invN,\n        varianceZ = sumZ2 - sumZ*sumZ*invN;\n\n    if(varianceX > varianceY){\n        if(varianceX > varianceZ){\n            this.axisIndex = 0;\n        } else{\n            this.axisIndex = 2;\n        }\n    } else if(varianceY > varianceZ){\n        this.axisIndex = 1;\n    } else{\n        this.axisIndex = 2;\n    }\n};\n\n/**\n * Returns all the bodies within an AABB.\n * @method aabbQuery\n * @param  {World} world\n * @param  {AABB} aabb\n * @param {array} result An array to store resulting bodies in.\n * @return {array}\n */\nSAPBroadphase.prototype.aabbQuery = function(world, aabb, result){\n    result = result || [];\n\n    if(this.dirty){\n        this.sortList();\n        this.dirty = false;\n    }\n\n    var axisIndex = this.axisIndex, axis = 'x';\n    if(axisIndex === 1){ axis = 'y'; }\n    if(axisIndex === 2){ axis = 'z'; }\n\n    var axisList = this.axisList;\n    var lower = aabb.lowerBound[axis];\n    var upper = aabb.upperBound[axis];\n    for(var i = 0; i < axisList.length; i++){\n        var b = axisList[i];\n\n        if(b.aabbNeedsUpdate){\n            b.computeAABB();\n        }\n\n        if(b.aabb.overlaps(aabb)){\n            result.push(b);\n        }\n    }\n\n    return result;\n};\n},{\"../collision/Broadphase\":5,\"../shapes/Shape\":43}],12:[function(_dereq_,module,exports){\nmodule.exports = ConeTwistConstraint;\n\nvar Constraint = _dereq_('./Constraint');\nvar PointToPointConstraint = _dereq_('./PointToPointConstraint');\nvar ConeEquation = _dereq_('../equations/ConeEquation');\nvar RotationalEquation = _dereq_('../equations/RotationalEquation');\nvar ContactEquation = _dereq_('../equations/ContactEquation');\nvar Vec3 = _dereq_('../math/Vec3');\n\n/**\n * @class ConeTwistConstraint\n * @constructor\n * @author schteppe\n * @param {Body} bodyA\n * @param {Body} bodyB\n * @param {object} [options]\n * @param {Vec3} [options.pivotA]\n * @param {Vec3} [options.pivotB]\n * @param {Vec3} [options.axisA]\n * @param {Vec3} [options.axisB]\n * @param {Number} [options.maxForce=1e6]\n * @extends PointToPointConstraint\n */\nfunction ConeTwistConstraint(bodyA, bodyB, options){\n    options = options || {};\n    var maxForce = typeof(options.maxForce) !== 'undefined' ? options.maxForce : 1e6;\n\n    // Set pivot point in between\n    var pivotA = options.pivotA ? options.pivotA.clone() : new Vec3();\n    var pivotB = options.pivotB ? options.pivotB.clone() : new Vec3();\n    this.axisA = options.axisA ? options.axisA.clone() : new Vec3();\n    this.axisB = options.axisB ? options.axisB.clone() : new Vec3();\n\n    PointToPointConstraint.call(this, bodyA, pivotA, bodyB, pivotB, maxForce);\n\n    this.collideConnected = !!options.collideConnected;\n\n    this.angle = typeof(options.angle) !== 'undefined' ? options.angle : 0;\n\n    /**\n     * @property {ConeEquation} coneEquation\n     */\n    var c = this.coneEquation = new ConeEquation(bodyA,bodyB,options);\n\n    /**\n     * @property {RotationalEquation} twistEquation\n     */\n    var t = this.twistEquation = new RotationalEquation(bodyA,bodyB,options);\n    this.twistAngle = typeof(options.twistAngle) !== 'undefined' ? options.twistAngle : 0;\n\n    // Make the cone equation push the bodies toward the cone axis, not outward\n    c.maxForce = 0;\n    c.minForce = -maxForce;\n\n    // Make the twist equation add torque toward the initial position\n    t.maxForce = 0;\n    t.minForce = -maxForce;\n\n    this.equations.push(c, t);\n}\nConeTwistConstraint.prototype = new PointToPointConstraint();\nConeTwistConstraint.constructor = ConeTwistConstraint;\n\nvar ConeTwistConstraint_update_tmpVec1 = new Vec3();\nvar ConeTwistConstraint_update_tmpVec2 = new Vec3();\n\nConeTwistConstraint.prototype.update = function(){\n    var bodyA = this.bodyA,\n        bodyB = this.bodyB,\n        cone = this.coneEquation,\n        twist = this.twistEquation;\n\n    PointToPointConstraint.prototype.update.call(this);\n\n    // Update the axes to the cone constraint\n    bodyA.vectorToWorldFrame(this.axisA, cone.axisA);\n    bodyB.vectorToWorldFrame(this.axisB, cone.axisB);\n\n    // Update the world axes in the twist constraint\n    this.axisA.tangents(twist.axisA, twist.axisA);\n    bodyA.vectorToWorldFrame(twist.axisA, twist.axisA);\n\n    this.axisB.tangents(twist.axisB, twist.axisB);\n    bodyB.vectorToWorldFrame(twist.axisB, twist.axisB);\n\n    cone.angle = this.angle;\n    twist.maxAngle = this.twistAngle;\n};\n\n\n},{\"../equations/ConeEquation\":18,\"../equations/ContactEquation\":19,\"../equations/RotationalEquation\":22,\"../math/Vec3\":30,\"./Constraint\":13,\"./PointToPointConstraint\":17}],13:[function(_dereq_,module,exports){\nmodule.exports = Constraint;\n\nvar Utils = _dereq_('../utils/Utils');\n\n/**\n * Constraint base class\n * @class Constraint\n * @author schteppe\n * @constructor\n * @param {Body} bodyA\n * @param {Body} bodyB\n * @param {object} [options]\n * @param {boolean} [options.collideConnected=true]\n * @param {boolean} [options.wakeUpBodies=true]\n */\nfunction Constraint(bodyA, bodyB, options){\n    options = Utils.defaults(options,{\n        collideConnected : true,\n        wakeUpBodies : true,\n    });\n\n    /**\n     * Equations to be solved in this constraint\n     * @property equations\n     * @type {Array}\n     */\n    this.equations = [];\n\n    /**\n     * @property {Body} bodyA\n     */\n    this.bodyA = bodyA;\n\n    /**\n     * @property {Body} bodyB\n     */\n    this.bodyB = bodyB;\n\n    /**\n     * @property {Number} id\n     */\n    this.id = Constraint.idCounter++;\n\n    /**\n     * Set to true if you want the bodies to collide when they are connected.\n     * @property collideConnected\n     * @type {boolean}\n     */\n    this.collideConnected = options.collideConnected;\n\n    if(options.wakeUpBodies){\n        if(bodyA){\n            bodyA.wakeUp();\n        }\n        if(bodyB){\n            bodyB.wakeUp();\n        }\n    }\n}\n\n/**\n * Update all the equations with data.\n * @method update\n */\nConstraint.prototype.update = function(){\n    throw new Error(\"method update() not implmemented in this Constraint subclass!\");\n};\n\n/**\n * Enables all equations in the constraint.\n * @method enable\n */\nConstraint.prototype.enable = function(){\n    var eqs = this.equations;\n    for(var i=0; i<eqs.length; i++){\n        eqs[i].enabled = true;\n    }\n};\n\n/**\n * Disables all equations in the constraint.\n * @method disable\n */\nConstraint.prototype.disable = function(){\n    var eqs = this.equations;\n    for(var i=0; i<eqs.length; i++){\n        eqs[i].enabled = false;\n    }\n};\n\nConstraint.idCounter = 0;\n\n},{\"../utils/Utils\":53}],14:[function(_dereq_,module,exports){\nmodule.exports = DistanceConstraint;\n\nvar Constraint = _dereq_('./Constraint');\nvar ContactEquation = _dereq_('../equations/ContactEquation');\n\n/**\n * Constrains two bodies to be at a constant distance from each others center of mass.\n * @class DistanceConstraint\n * @constructor\n * @author schteppe\n * @param {Body} bodyA\n * @param {Body} bodyB\n * @param {Number} [distance] The distance to keep. If undefined, it will be set to the current distance between bodyA and bodyB\n * @param {Number} [maxForce=1e6]\n * @extends Constraint\n */\nfunction DistanceConstraint(bodyA,bodyB,distance,maxForce){\n    Constraint.call(this,bodyA,bodyB);\n\n    if(typeof(distance)===\"undefined\") {\n        distance = bodyA.position.distanceTo(bodyB.position);\n    }\n\n    if(typeof(maxForce)===\"undefined\") {\n        maxForce = 1e6;\n    }\n\n    /**\n     * @property {number} distance\n     */\n    this.distance = distance;\n\n    /**\n     * @property {ContactEquation} distanceEquation\n     */\n    var eq = this.distanceEquation = new ContactEquation(bodyA, bodyB);\n    this.equations.push(eq);\n\n    // Make it bidirectional\n    eq.minForce = -maxForce;\n    eq.maxForce =  maxForce;\n}\nDistanceConstraint.prototype = new Constraint();\n\nDistanceConstraint.prototype.update = function(){\n    var bodyA = this.bodyA;\n    var bodyB = this.bodyB;\n    var eq = this.distanceEquation;\n    var halfDist = this.distance * 0.5;\n    var normal = eq.ni;\n\n    bodyB.position.vsub(bodyA.position, normal);\n    normal.normalize();\n    normal.mult(halfDist, eq.ri);\n    normal.mult(-halfDist, eq.rj);\n};\n},{\"../equations/ContactEquation\":19,\"./Constraint\":13}],15:[function(_dereq_,module,exports){\nmodule.exports = HingeConstraint;\n\nvar Constraint = _dereq_('./Constraint');\nvar PointToPointConstraint = _dereq_('./PointToPointConstraint');\nvar RotationalEquation = _dereq_('../equations/RotationalEquation');\nvar RotationalMotorEquation = _dereq_('../equations/RotationalMotorEquation');\nvar ContactEquation = _dereq_('../equations/ContactEquation');\nvar Vec3 = _dereq_('../math/Vec3');\n\n/**\n * Hinge constraint. Think of it as a door hinge. It tries to keep the door in the correct place and with the correct orientation.\n * @class HingeConstraint\n * @constructor\n * @author schteppe\n * @param {Body} bodyA\n * @param {Body} bodyB\n * @param {object} [options]\n * @param {Vec3} [options.pivotA] A point defined locally in bodyA. This defines the offset of axisA.\n * @param {Vec3} [options.axisA] An axis that bodyA can rotate around, defined locally in bodyA.\n * @param {Vec3} [options.pivotB]\n * @param {Vec3} [options.axisB]\n * @param {Number} [options.maxForce=1e6]\n * @extends PointToPointConstraint\n */\nfunction HingeConstraint(bodyA, bodyB, options){\n    options = options || {};\n    var maxForce = typeof(options.maxForce) !== 'undefined' ? options.maxForce : 1e6;\n    var pivotA = options.pivotA ? options.pivotA.clone() : new Vec3();\n    var pivotB = options.pivotB ? options.pivotB.clone() : new Vec3();\n\n    PointToPointConstraint.call(this, bodyA, pivotA, bodyB, pivotB, maxForce);\n\n    /**\n     * Rotation axis, defined locally in bodyA.\n     * @property {Vec3} axisA\n     */\n    var axisA = this.axisA = options.axisA ? options.axisA.clone() : new Vec3(1,0,0);\n    axisA.normalize();\n\n    /**\n     * Rotation axis, defined locally in bodyB.\n     * @property {Vec3} axisB\n     */\n    var axisB = this.axisB = options.axisB ? options.axisB.clone() : new Vec3(1,0,0);\n    axisB.normalize();\n\n    /**\n     * @property {RotationalEquation} rotationalEquation1\n     */\n    var r1 = this.rotationalEquation1 = new RotationalEquation(bodyA,bodyB,options);\n\n    /**\n     * @property {RotationalEquation} rotationalEquation2\n     */\n    var r2 = this.rotationalEquation2 = new RotationalEquation(bodyA,bodyB,options);\n\n    /**\n     * @property {RotationalMotorEquation} motorEquation\n     */\n    var motor = this.motorEquation = new RotationalMotorEquation(bodyA,bodyB,maxForce);\n    motor.enabled = false; // Not enabled by default\n\n    // Equations to be fed to the solver\n    this.equations.push(\n        r1, // rotational1\n        r2, // rotational2\n        motor\n    );\n}\nHingeConstraint.prototype = new PointToPointConstraint();\nHingeConstraint.constructor = HingeConstraint;\n\n/**\n * @method enableMotor\n */\nHingeConstraint.prototype.enableMotor = function(){\n    this.motorEquation.enabled = true;\n};\n\n/**\n * @method disableMotor\n */\nHingeConstraint.prototype.disableMotor = function(){\n    this.motorEquation.enabled = false;\n};\n\n/**\n * @method setMotorSpeed\n * @param {number} speed\n */\nHingeConstraint.prototype.setMotorSpeed = function(speed){\n    this.motorEquation.targetVelocity = speed;\n};\n\n/**\n * @method setMotorMaxForce\n * @param {number} maxForce\n */\nHingeConstraint.prototype.setMotorMaxForce = function(maxForce){\n    this.motorEquation.maxForce = maxForce;\n    this.motorEquation.minForce = -maxForce;\n};\n\nvar HingeConstraint_update_tmpVec1 = new Vec3();\nvar HingeConstraint_update_tmpVec2 = new Vec3();\n\nHingeConstraint.prototype.update = function(){\n    var bodyA = this.bodyA,\n        bodyB = this.bodyB,\n        motor = this.motorEquation,\n        r1 = this.rotationalEquation1,\n        r2 = this.rotationalEquation2,\n        worldAxisA = HingeConstraint_update_tmpVec1,\n        worldAxisB = HingeConstraint_update_tmpVec2;\n\n    var axisA = this.axisA;\n    var axisB = this.axisB;\n\n    PointToPointConstraint.prototype.update.call(this);\n\n    // Get world axes\n    bodyA.quaternion.vmult(axisA, worldAxisA);\n    bodyB.quaternion.vmult(axisB, worldAxisB);\n\n    worldAxisA.tangents(r1.axisA, r2.axisA);\n    r1.axisB.copy(worldAxisB);\n    r2.axisB.copy(worldAxisB);\n\n    if(this.motorEquation.enabled){\n        bodyA.quaternion.vmult(this.axisA, motor.axisA);\n        bodyB.quaternion.vmult(this.axisB, motor.axisB);\n    }\n};\n\n\n},{\"../equations/ContactEquation\":19,\"../equations/RotationalEquation\":22,\"../equations/RotationalMotorEquation\":23,\"../math/Vec3\":30,\"./Constraint\":13,\"./PointToPointConstraint\":17}],16:[function(_dereq_,module,exports){\nmodule.exports = LockConstraint;\n\nvar Constraint = _dereq_('./Constraint');\nvar PointToPointConstraint = _dereq_('./PointToPointConstraint');\nvar RotationalEquation = _dereq_('../equations/RotationalEquation');\nvar RotationalMotorEquation = _dereq_('../equations/RotationalMotorEquation');\nvar ContactEquation = _dereq_('../equations/ContactEquation');\nvar Vec3 = _dereq_('../math/Vec3');\n\n/**\n * Lock constraint. Will remove all degrees of freedom between the bodies.\n * @class LockConstraint\n * @constructor\n * @author schteppe\n * @param {Body} bodyA\n * @param {Body} bodyB\n * @param {object} [options]\n * @param {Number} [options.maxForce=1e6]\n * @extends PointToPointConstraint\n */\nfunction LockConstraint(bodyA, bodyB, options){\n    options = options || {};\n    var maxForce = typeof(options.maxForce) !== 'undefined' ? options.maxForce : 1e6;\n\n    // Set pivot point in between\n    var pivotA = new Vec3();\n    var pivotB = new Vec3();\n    var halfWay = new Vec3();\n    bodyA.position.vadd(bodyB.position, halfWay);\n    halfWay.scale(0.5, halfWay);\n    bodyB.pointToLocalFrame(halfWay, pivotB);\n    bodyA.pointToLocalFrame(halfWay, pivotA);\n    PointToPointConstraint.call(this, bodyA, pivotA, bodyB, pivotB, maxForce);\n\n    /**\n     * @property {RotationalEquation} rotationalEquation1\n     */\n    var r1 = this.rotationalEquation1 = new RotationalEquation(bodyA,bodyB,options);\n\n    /**\n     * @property {RotationalEquation} rotationalEquation2\n     */\n    var r2 = this.rotationalEquation2 = new RotationalEquation(bodyA,bodyB,options);\n\n    /**\n     * @property {RotationalEquation} rotationalEquation3\n     */\n    var r3 = this.rotationalEquation3 = new RotationalEquation(bodyA,bodyB,options);\n\n    this.equations.push(r1, r2, r3);\n}\nLockConstraint.prototype = new PointToPointConstraint();\nLockConstraint.constructor = LockConstraint;\n\nvar LockConstraint_update_tmpVec1 = new Vec3();\nvar LockConstraint_update_tmpVec2 = new Vec3();\n\nLockConstraint.prototype.update = function(){\n    var bodyA = this.bodyA,\n        bodyB = this.bodyB,\n        motor = this.motorEquation,\n        r1 = this.rotationalEquation1,\n        r2 = this.rotationalEquation2,\n        r3 = this.rotationalEquation3,\n        worldAxisA = LockConstraint_update_tmpVec1,\n        worldAxisB = LockConstraint_update_tmpVec2;\n\n    PointToPointConstraint.prototype.update.call(this);\n\n    bodyA.vectorToWorldFrame(Vec3.UNIT_X, r1.axisA);\n    bodyB.vectorToWorldFrame(Vec3.UNIT_Y, r1.axisB);\n\n    bodyA.vectorToWorldFrame(Vec3.UNIT_Y, r2.axisA);\n    bodyB.vectorToWorldFrame(Vec3.UNIT_Z, r2.axisB);\n\n    bodyA.vectorToWorldFrame(Vec3.UNIT_Z, r3.axisA);\n    bodyB.vectorToWorldFrame(Vec3.UNIT_X, r3.axisB);\n};\n\n\n},{\"../equations/ContactEquation\":19,\"../equations/RotationalEquation\":22,\"../equations/RotationalMotorEquation\":23,\"../math/Vec3\":30,\"./Constraint\":13,\"./PointToPointConstraint\":17}],17:[function(_dereq_,module,exports){\nmodule.exports = PointToPointConstraint;\n\nvar Constraint = _dereq_('./Constraint');\nvar ContactEquation = _dereq_('../equations/ContactEquation');\nvar Vec3 = _dereq_('../math/Vec3');\n\n/**\n * Connects two bodies at given offset points.\n * @class PointToPointConstraint\n * @extends Constraint\n * @constructor\n * @param {Body} bodyA\n * @param {Vec3} pivotA The point relative to the center of mass of bodyA which bodyA is constrained to.\n * @param {Body} bodyB Body that will be constrained in a similar way to the same point as bodyA. We will therefore get a link between bodyA and bodyB. If not specified, bodyA will be constrained to a static point.\n * @param {Vec3} pivotB See pivotA.\n * @param {Number} maxForce The maximum force that should be applied to constrain the bodies.\n *\n * @example\n *     var bodyA = new Body({ mass: 1 });\n *     var bodyB = new Body({ mass: 1 });\n *     bodyA.position.set(-1, 0, 0);\n *     bodyB.position.set(1, 0, 0);\n *     bodyA.addShape(shapeA);\n *     bodyB.addShape(shapeB);\n *     world.addBody(bodyA);\n *     world.addBody(bodyB);\n *     var localPivotA = new Vec3(1, 0, 0);\n *     var localPivotB = new Vec3(-1, 0, 0);\n *     var constraint = new PointToPointConstraint(bodyA, localPivotA, bodyB, localPivotB);\n *     world.addConstraint(constraint);\n */\nfunction PointToPointConstraint(bodyA,pivotA,bodyB,pivotB,maxForce){\n    Constraint.call(this,bodyA,bodyB);\n\n    maxForce = typeof(maxForce) !== 'undefined' ? maxForce : 1e6;\n\n    /**\n     * Pivot, defined locally in bodyA.\n     * @property {Vec3} pivotA\n     */\n    this.pivotA = pivotA ? pivotA.clone() : new Vec3();\n\n    /**\n     * Pivot, defined locally in bodyB.\n     * @property {Vec3} pivotB\n     */\n    this.pivotB = pivotB ? pivotB.clone() : new Vec3();\n\n    /**\n     * @property {ContactEquation} equationX\n     */\n    var x = this.equationX = new ContactEquation(bodyA,bodyB);\n\n    /**\n     * @property {ContactEquation} equationY\n     */\n    var y = this.equationY = new ContactEquation(bodyA,bodyB);\n\n    /**\n     * @property {ContactEquation} equationZ\n     */\n    var z = this.equationZ = new ContactEquation(bodyA,bodyB);\n\n    // Equations to be fed to the solver\n    this.equations.push(x, y, z);\n\n    // Make the equations bidirectional\n    x.minForce = y.minForce = z.minForce = -maxForce;\n    x.maxForce = y.maxForce = z.maxForce =  maxForce;\n\n    x.ni.set(1, 0, 0);\n    y.ni.set(0, 1, 0);\n    z.ni.set(0, 0, 1);\n}\nPointToPointConstraint.prototype = new Constraint();\n\nPointToPointConstraint.prototype.update = function(){\n    var bodyA = this.bodyA;\n    var bodyB = this.bodyB;\n    var x = this.equationX;\n    var y = this.equationY;\n    var z = this.equationZ;\n\n    // Rotate the pivots to world space\n    bodyA.quaternion.vmult(this.pivotA,x.ri);\n    bodyB.quaternion.vmult(this.pivotB,x.rj);\n\n    y.ri.copy(x.ri);\n    y.rj.copy(x.rj);\n    z.ri.copy(x.ri);\n    z.rj.copy(x.rj);\n};\n},{\"../equations/ContactEquation\":19,\"../math/Vec3\":30,\"./Constraint\":13}],18:[function(_dereq_,module,exports){\nmodule.exports = ConeEquation;\n\nvar Vec3 = _dereq_('../math/Vec3');\nvar Mat3 = _dereq_('../math/Mat3');\nvar Equation = _dereq_('./Equation');\n\n/**\n * Cone equation. Works to keep the given body world vectors aligned, or tilted within a given angle from each other.\n * @class ConeEquation\n * @constructor\n * @author schteppe\n * @param {Body} bodyA\n * @param {Body} bodyB\n * @param {Vec3} [options.axisA] Local axis in A\n * @param {Vec3} [options.axisB] Local axis in B\n * @param {Vec3} [options.angle] The \"cone angle\" to keep\n * @param {number} [options.maxForce=1e6]\n * @extends Equation\n */\nfunction ConeEquation(bodyA, bodyB, options){\n    options = options || {};\n    var maxForce = typeof(options.maxForce) !== 'undefined' ? options.maxForce : 1e6;\n\n    Equation.call(this,bodyA,bodyB,-maxForce, maxForce);\n\n    this.axisA = options.axisA ? options.axisA.clone() : new Vec3(1, 0, 0);\n    this.axisB = options.axisB ? options.axisB.clone() : new Vec3(0, 1, 0);\n\n    /**\n     * The cone angle to keep\n     * @property {number} angle\n     */\n    this.angle = typeof(options.angle) !== 'undefined' ? options.angle : 0;\n}\n\nConeEquation.prototype = new Equation();\nConeEquation.prototype.constructor = ConeEquation;\n\nvar tmpVec1 = new Vec3();\nvar tmpVec2 = new Vec3();\n\nConeEquation.prototype.computeB = function(h){\n    var a = this.a,\n        b = this.b,\n\n        ni = this.axisA,\n        nj = this.axisB,\n\n        nixnj = tmpVec1,\n        njxni = tmpVec2,\n\n        GA = this.jacobianElementA,\n        GB = this.jacobianElementB;\n\n    // Caluclate cross products\n    ni.cross(nj, nixnj);\n    nj.cross(ni, njxni);\n\n    // The angle between two vector is:\n    // cos(theta) = a * b / (length(a) * length(b) = { len(a) = len(b) = 1 } = a * b\n\n    // g = a * b\n    // gdot = (b x a) * wi + (a x b) * wj\n    // G = [0 bxa 0 axb]\n    // W = [vi wi vj wj]\n    GA.rotational.copy(njxni);\n    GB.rotational.copy(nixnj);\n\n    var g = Math.cos(this.angle) - ni.dot(nj),\n        GW = this.computeGW(),\n        GiMf = this.computeGiMf();\n\n    var B = - g * a - GW * b - h * GiMf;\n\n    return B;\n};\n\n\n},{\"../math/Mat3\":27,\"../math/Vec3\":30,\"./Equation\":20}],19:[function(_dereq_,module,exports){\nmodule.exports = ContactEquation;\n\nvar Equation = _dereq_('./Equation');\nvar Vec3 = _dereq_('../math/Vec3');\nvar Mat3 = _dereq_('../math/Mat3');\n\n/**\n * Contact/non-penetration constraint equation\n * @class ContactEquation\n * @constructor\n * @author schteppe\n * @param {Body} bodyA\n * @param {Body} bodyB\n * @extends Equation\n */\nfunction ContactEquation(bodyA, bodyB, maxForce){\n    maxForce = typeof(maxForce) !== 'undefined' ? maxForce : 1e6;\n    Equation.call(this, bodyA, bodyB, 0, maxForce);\n\n    /**\n     * @property restitution\n     * @type {Number}\n     */\n    this.restitution = 0.0; // \"bounciness\": u1 = -e*u0\n\n    /**\n     * World-oriented vector that goes from the center of bi to the contact point.\n     * @property {Vec3} ri\n     */\n    this.ri = new Vec3();\n\n    /**\n     * World-oriented vector that starts in body j position and goes to the contact point.\n     * @property {Vec3} rj\n     */\n    this.rj = new Vec3();\n\n    /**\n     * Contact normal, pointing out of body i.\n     * @property {Vec3} ni\n     */\n    this.ni = new Vec3();\n}\n\nContactEquation.prototype = new Equation();\nContactEquation.prototype.constructor = ContactEquation;\n\nvar ContactEquation_computeB_temp1 = new Vec3(); // Temp vectors\nvar ContactEquation_computeB_temp2 = new Vec3();\nvar ContactEquation_computeB_temp3 = new Vec3();\nContactEquation.prototype.computeB = function(h){\n    var a = this.a,\n        b = this.b,\n        bi = this.bi,\n        bj = this.bj,\n        ri = this.ri,\n        rj = this.rj,\n        rixn = ContactEquation_computeB_temp1,\n        rjxn = ContactEquation_computeB_temp2,\n\n        vi = bi.velocity,\n        wi = bi.angularVelocity,\n        fi = bi.force,\n        taui = bi.torque,\n\n        vj = bj.velocity,\n        wj = bj.angularVelocity,\n        fj = bj.force,\n        tauj = bj.torque,\n\n        penetrationVec = ContactEquation_computeB_temp3,\n\n        GA = this.jacobianElementA,\n        GB = this.jacobianElementB,\n\n        n = this.ni;\n\n    // Caluclate cross products\n    ri.cross(n,rixn);\n    rj.cross(n,rjxn);\n\n    // g = xj+rj -(xi+ri)\n    // G = [ -ni  -rixn  ni  rjxn ]\n    n.negate(GA.spatial);\n    rixn.negate(GA.rotational);\n    GB.spatial.copy(n);\n    GB.rotational.copy(rjxn);\n\n    // Calculate the penetration vector\n    penetrationVec.copy(bj.position);\n    penetrationVec.vadd(rj,penetrationVec);\n    penetrationVec.vsub(bi.position,penetrationVec);\n    penetrationVec.vsub(ri,penetrationVec);\n\n    var g = n.dot(penetrationVec);\n\n    // Compute iteration\n    var ePlusOne = this.restitution + 1;\n    var GW = ePlusOne * vj.dot(n) - ePlusOne * vi.dot(n) + wj.dot(rjxn) - wi.dot(rixn);\n    var GiMf = this.computeGiMf();\n\n    var B = - g * a - GW * b - h*GiMf;\n\n    return B;\n};\n\nvar ContactEquation_getImpactVelocityAlongNormal_vi = new Vec3();\nvar ContactEquation_getImpactVelocityAlongNormal_vj = new Vec3();\nvar ContactEquation_getImpactVelocityAlongNormal_xi = new Vec3();\nvar ContactEquation_getImpactVelocityAlongNormal_xj = new Vec3();\nvar ContactEquation_getImpactVelocityAlongNormal_relVel = new Vec3();\n\n/**\n * Get the current relative velocity in the contact point.\n * @method getImpactVelocityAlongNormal\n * @return {number}\n */\nContactEquation.prototype.getImpactVelocityAlongNormal = function(){\n    var vi = ContactEquation_getImpactVelocityAlongNormal_vi;\n    var vj = ContactEquation_getImpactVelocityAlongNormal_vj;\n    var xi = ContactEquation_getImpactVelocityAlongNormal_xi;\n    var xj = ContactEquation_getImpactVelocityAlongNormal_xj;\n    var relVel = ContactEquation_getImpactVelocityAlongNormal_relVel;\n\n    this.bi.position.vadd(this.ri, xi);\n    this.bj.position.vadd(this.rj, xj);\n\n    this.bi.getVelocityAtWorldPoint(xi, vi);\n    this.bj.getVelocityAtWorldPoint(xj, vj);\n\n    vi.vsub(vj, relVel);\n\n    return this.ni.dot(relVel);\n};\n\n\n},{\"../math/Mat3\":27,\"../math/Vec3\":30,\"./Equation\":20}],20:[function(_dereq_,module,exports){\nmodule.exports = Equation;\n\nvar JacobianElement = _dereq_('../math/JacobianElement'),\n    Vec3 = _dereq_('../math/Vec3');\n\n/**\n * Equation base class\n * @class Equation\n * @constructor\n * @author schteppe\n * @param {Body} bi\n * @param {Body} bj\n * @param {Number} minForce Minimum (read: negative max) force to be applied by the constraint.\n * @param {Number} maxForce Maximum (read: positive max) force to be applied by the constraint.\n */\nfunction Equation(bi,bj,minForce,maxForce){\n    this.id = Equation.id++;\n\n    /**\n     * @property {number} minForce\n     */\n    this.minForce = typeof(minForce)===\"undefined\" ? -1e6 : minForce;\n\n    /**\n     * @property {number} maxForce\n     */\n    this.maxForce = typeof(maxForce)===\"undefined\" ? 1e6 : maxForce;\n\n    /**\n     * @property bi\n     * @type {Body}\n     */\n    this.bi = bi;\n\n    /**\n     * @property bj\n     * @type {Body}\n     */\n    this.bj = bj;\n\n    /**\n     * SPOOK parameter\n     * @property {number} a\n     */\n    this.a = 0.0;\n\n    /**\n     * SPOOK parameter\n     * @property {number} b\n     */\n    this.b = 0.0;\n\n    /**\n     * SPOOK parameter\n     * @property {number} eps\n     */\n    this.eps = 0.0;\n\n    /**\n     * @property {JacobianElement} jacobianElementA\n     */\n    this.jacobianElementA = new JacobianElement();\n\n    /**\n     * @property {JacobianElement} jacobianElementB\n     */\n    this.jacobianElementB = new JacobianElement();\n\n    /**\n     * @property {boolean} enabled\n     * @default true\n     */\n    this.enabled = true;\n\n    // Set typical spook params\n    this.setSpookParams(1e7,4,1/60);\n}\nEquation.prototype.constructor = Equation;\n\nEquation.id = 0;\n\n/**\n * Recalculates a,b,eps.\n * @method setSpookParams\n */\nEquation.prototype.setSpookParams = function(stiffness,relaxation,timeStep){\n    var d = relaxation,\n        k = stiffness,\n        h = timeStep;\n    this.a = 4.0 / (h * (1 + 4 * d));\n    this.b = (4.0 * d) / (1 + 4 * d);\n    this.eps = 4.0 / (h * h * k * (1 + 4 * d));\n};\n\n/**\n * Computes the RHS of the SPOOK equation\n * @method computeB\n * @return {Number}\n */\nEquation.prototype.computeB = function(a,b,h){\n    var GW = this.computeGW(),\n        Gq = this.computeGq(),\n        GiMf = this.computeGiMf();\n    return - Gq * a - GW * b - GiMf*h;\n};\n\n/**\n * Computes G*q, where q are the generalized body coordinates\n * @method computeGq\n * @return {Number}\n */\nEquation.prototype.computeGq = function(){\n    var GA = this.jacobianElementA,\n        GB = this.jacobianElementB,\n        bi = this.bi,\n        bj = this.bj,\n        xi = bi.position,\n        xj = bj.position;\n    return GA.spatial.dot(xi) + GB.spatial.dot(xj);\n};\n\nvar zero = new Vec3();\n\n/**\n * Computes G*W, where W are the body velocities\n * @method computeGW\n * @return {Number}\n */\nEquation.prototype.computeGW = function(){\n    var GA = this.jacobianElementA,\n        GB = this.jacobianElementB,\n        bi = this.bi,\n        bj = this.bj,\n        vi = bi.velocity,\n        vj = bj.velocity,\n        wi = bi.angularVelocity || zero,\n        wj = bj.angularVelocity || zero;\n    return GA.multiplyVectors(vi,wi) + GB.multiplyVectors(vj,wj);\n};\n\n\n/**\n * Computes G*Wlambda, where W are the body velocities\n * @method computeGWlambda\n * @return {Number}\n */\nEquation.prototype.computeGWlambda = function(){\n    var GA = this.jacobianElementA,\n        GB = this.jacobianElementB,\n        bi = this.bi,\n        bj = this.bj,\n        vi = bi.vlambda,\n        vj = bj.vlambda,\n        wi = bi.wlambda || zero,\n        wj = bj.wlambda || zero;\n    return GA.multiplyVectors(vi,wi) + GB.multiplyVectors(vj,wj);\n};\n\n/**\n * Computes G*inv(M)*f, where M is the mass matrix with diagonal blocks for each body, and f are the forces on the bodies.\n * @method computeGiMf\n * @return {Number}\n */\nvar iMfi = new Vec3(),\n    iMfj = new Vec3(),\n    invIi_vmult_taui = new Vec3(),\n    invIj_vmult_tauj = new Vec3();\nEquation.prototype.computeGiMf = function(){\n    var GA = this.jacobianElementA,\n        GB = this.jacobianElementB,\n        bi = this.bi,\n        bj = this.bj,\n        fi = bi.force,\n        ti = bi.torque,\n        fj = bj.force,\n        tj = bj.torque,\n        invMassi = bi.invMassSolve,\n        invMassj = bj.invMassSolve;\n\n    if(bi.invInertiaWorldSolve){ bi.invInertiaWorldSolve.vmult(ti,invIi_vmult_taui); }\n    else { invIi_vmult_taui.set(0,0,0); }\n    if(bj.invInertiaWorldSolve){ bj.invInertiaWorldSolve.vmult(tj,invIj_vmult_tauj); }\n    else { invIj_vmult_tauj.set(0,0,0); }\n\n    fi.mult(invMassi,iMfi);\n    fj.mult(invMassj,iMfj);\n\n    return GA.multiplyVectors(iMfi,invIi_vmult_taui) + GB.multiplyVectors(iMfj,invIj_vmult_tauj);\n};\n\n/**\n * Computes G*inv(M)*G'\n * @method computeGiMGt\n * @return {Number}\n */\nvar tmp = new Vec3();\nEquation.prototype.computeGiMGt = function(){\n    var GA = this.jacobianElementA,\n        GB = this.jacobianElementB,\n        bi = this.bi,\n        bj = this.bj,\n        invMassi = bi.invMassSolve,\n        invMassj = bj.invMassSolve,\n        invIi = bi.invInertiaWorldSolve,\n        invIj = bj.invInertiaWorldSolve,\n        result = invMassi + invMassj;\n\n    if(invIi){\n        invIi.vmult(GA.rotational,tmp);\n        result += tmp.dot(GA.rotational);\n    }\n\n    if(invIj){\n        invIj.vmult(GB.rotational,tmp);\n        result += tmp.dot(GB.rotational);\n    }\n\n    return  result;\n};\n\nvar addToWlambda_temp = new Vec3(),\n    addToWlambda_Gi = new Vec3(),\n    addToWlambda_Gj = new Vec3(),\n    addToWlambda_ri = new Vec3(),\n    addToWlambda_rj = new Vec3(),\n    addToWlambda_Mdiag = new Vec3();\n\n/**\n * Add constraint velocity to the bodies.\n * @method addToWlambda\n * @param {Number} deltalambda\n */\nEquation.prototype.addToWlambda = function(deltalambda){\n    var GA = this.jacobianElementA,\n        GB = this.jacobianElementB,\n        bi = this.bi,\n        bj = this.bj,\n        temp = addToWlambda_temp;\n\n    // Add to linear velocity\n    // v_lambda += inv(M) * delta_lamba * G\n    GA.spatial.mult(bi.invMassSolve * deltalambda,temp);\n    bi.vlambda.vadd(temp, bi.vlambda);\n\n    GB.spatial.mult(bj.invMassSolve * deltalambda,temp);\n    bj.vlambda.vadd(temp, bj.vlambda);\n\n    // Add to angular velocity\n    if(bi.invInertiaWorldSolve){\n        bi.invInertiaWorldSolve.vmult(GA.rotational,temp);\n        temp.mult(deltalambda,temp);\n        bi.wlambda.vadd(temp,bi.wlambda);\n    }\n\n    if(bj.invInertiaWorldSolve){\n        bj.invInertiaWorldSolve.vmult(GB.rotational,temp);\n        temp.mult(deltalambda,temp);\n        bj.wlambda.vadd(temp,bj.wlambda);\n    }\n};\n\n/**\n * Compute the denominator part of the SPOOK equation: C = G*inv(M)*G' + eps\n * @method computeInvC\n * @param  {Number} eps\n * @return {Number}\n */\nEquation.prototype.computeC = function(){\n    return this.computeGiMGt() + this.eps;\n};\n\n},{\"../math/JacobianElement\":26,\"../math/Vec3\":30}],21:[function(_dereq_,module,exports){\nmodule.exports = FrictionEquation;\n\nvar Equation = _dereq_('./Equation');\nvar Vec3 = _dereq_('../math/Vec3');\nvar Mat3 = _dereq_('../math/Mat3');\n\n/**\n * Constrains the slipping in a contact along a tangent\n * @class FrictionEquation\n * @constructor\n * @author schteppe\n * @param {Body} bodyA\n * @param {Body} bodyB\n * @param {Number} slipForce should be +-F_friction = +-mu * F_normal = +-mu * m * g\n * @extends Equation\n */\nfunction FrictionEquation(bodyA, bodyB, slipForce){\n    Equation.call(this,bodyA, bodyB, -slipForce, slipForce);\n    this.ri = new Vec3();\n    this.rj = new Vec3();\n    this.t = new Vec3(); // tangent\n}\n\nFrictionEquation.prototype = new Equation();\nFrictionEquation.prototype.constructor = FrictionEquation;\n\nvar FrictionEquation_computeB_temp1 = new Vec3();\nvar FrictionEquation_computeB_temp2 = new Vec3();\nFrictionEquation.prototype.computeB = function(h){\n    var a = this.a,\n        b = this.b,\n        bi = this.bi,\n        bj = this.bj,\n        ri = this.ri,\n        rj = this.rj,\n        rixt = FrictionEquation_computeB_temp1,\n        rjxt = FrictionEquation_computeB_temp2,\n        t = this.t;\n\n    // Caluclate cross products\n    ri.cross(t,rixt);\n    rj.cross(t,rjxt);\n\n    // G = [-t -rixt t rjxt]\n    // And remember, this is a pure velocity constraint, g is always zero!\n    var GA = this.jacobianElementA,\n        GB = this.jacobianElementB;\n    t.negate(GA.spatial);\n    rixt.negate(GA.rotational);\n    GB.spatial.copy(t);\n    GB.rotational.copy(rjxt);\n\n    var GW = this.computeGW();\n    var GiMf = this.computeGiMf();\n\n    var B = - GW * b - h * GiMf;\n\n    return B;\n};\n\n},{\"../math/Mat3\":27,\"../math/Vec3\":30,\"./Equation\":20}],22:[function(_dereq_,module,exports){\nmodule.exports = RotationalEquation;\n\nvar Vec3 = _dereq_('../math/Vec3');\nvar Mat3 = _dereq_('../math/Mat3');\nvar Equation = _dereq_('./Equation');\n\n/**\n * Rotational constraint. Works to keep the local vectors orthogonal to each other in world space.\n * @class RotationalEquation\n * @constructor\n * @author schteppe\n * @param {Body} bodyA\n * @param {Body} bodyB\n * @param {Vec3} [options.axisA]\n * @param {Vec3} [options.axisB]\n * @param {number} [options.maxForce]\n * @extends Equation\n */\nfunction RotationalEquation(bodyA, bodyB, options){\n    options = options || {};\n    var maxForce = typeof(options.maxForce) !== 'undefined' ? options.maxForce : 1e6;\n\n    Equation.call(this,bodyA,bodyB,-maxForce, maxForce);\n\n    this.axisA = options.axisA ? options.axisA.clone() : new Vec3(1, 0, 0);\n    this.axisB = options.axisB ? options.axisB.clone() : new Vec3(0, 1, 0);\n\n    this.maxAngle = Math.PI / 2;\n}\n\nRotationalEquation.prototype = new Equation();\nRotationalEquation.prototype.constructor = RotationalEquation;\n\nvar tmpVec1 = new Vec3();\nvar tmpVec2 = new Vec3();\n\nRotationalEquation.prototype.computeB = function(h){\n    var a = this.a,\n        b = this.b,\n\n        ni = this.axisA,\n        nj = this.axisB,\n\n        nixnj = tmpVec1,\n        njxni = tmpVec2,\n\n        GA = this.jacobianElementA,\n        GB = this.jacobianElementB;\n\n    // Caluclate cross products\n    ni.cross(nj, nixnj);\n    nj.cross(ni, njxni);\n\n    // g = ni * nj\n    // gdot = (nj x ni) * wi + (ni x nj) * wj\n    // G = [0 njxni 0 nixnj]\n    // W = [vi wi vj wj]\n    GA.rotational.copy(njxni);\n    GB.rotational.copy(nixnj);\n\n    var g = Math.cos(this.maxAngle) - ni.dot(nj),\n        GW = this.computeGW(),\n        GiMf = this.computeGiMf();\n\n    var B = - g * a - GW * b - h * GiMf;\n\n    return B;\n};\n\n\n},{\"../math/Mat3\":27,\"../math/Vec3\":30,\"./Equation\":20}],23:[function(_dereq_,module,exports){\nmodule.exports = RotationalMotorEquation;\n\nvar Vec3 = _dereq_('../math/Vec3');\nvar Mat3 = _dereq_('../math/Mat3');\nvar Equation = _dereq_('./Equation');\n\n/**\n * Rotational motor constraint. Tries to keep the relative angular velocity of the bodies to a given value.\n * @class RotationalMotorEquation\n * @constructor\n * @author schteppe\n * @param {Body} bodyA\n * @param {Body} bodyB\n * @param {Number} maxForce\n * @extends Equation\n */\nfunction RotationalMotorEquation(bodyA, bodyB, maxForce){\n    maxForce = typeof(maxForce)!=='undefined' ? maxForce : 1e6;\n    Equation.call(this,bodyA,bodyB,-maxForce,maxForce);\n\n    /**\n     * World oriented rotational axis\n     * @property {Vec3} axisA\n     */\n    this.axisA = new Vec3();\n\n    /**\n     * World oriented rotational axis\n     * @property {Vec3} axisB\n     */\n    this.axisB = new Vec3(); // World oriented rotational axis\n\n    /**\n     * Motor velocity\n     * @property {Number} targetVelocity\n     */\n    this.targetVelocity = 0;\n}\n\nRotationalMotorEquation.prototype = new Equation();\nRotationalMotorEquation.prototype.constructor = RotationalMotorEquation;\n\nRotationalMotorEquation.prototype.computeB = function(h){\n    var a = this.a,\n        b = this.b,\n        bi = this.bi,\n        bj = this.bj,\n\n        axisA = this.axisA,\n        axisB = this.axisB,\n\n        GA = this.jacobianElementA,\n        GB = this.jacobianElementB;\n\n    // g = 0\n    // gdot = axisA * wi - axisB * wj\n    // gdot = G * W = G * [vi wi vj wj]\n    // =>\n    // G = [0 axisA 0 -axisB]\n\n    GA.rotational.copy(axisA);\n    axisB.negate(GB.rotational);\n\n    var GW = this.computeGW() - this.targetVelocity,\n        GiMf = this.computeGiMf();\n\n    var B = - GW * b - h * GiMf;\n\n    return B;\n};\n\n},{\"../math/Mat3\":27,\"../math/Vec3\":30,\"./Equation\":20}],24:[function(_dereq_,module,exports){\nvar Utils = _dereq_('../utils/Utils');\n\nmodule.exports = ContactMaterial;\n\n/**\n * Defines what happens when two materials meet.\n * @class ContactMaterial\n * @constructor\n * @param {Material} m1\n * @param {Material} m2\n * @param {object} [options]\n * @param {Number} [options.friction=0.3]\n * @param {Number} [options.restitution=0.3]\n * @param {number} [options.contactEquationStiffness=1e7]\n * @param {number} [options.contactEquationRelaxation=3]\n * @param {number} [options.frictionEquationStiffness=1e7]\n * @param {Number} [options.frictionEquationRelaxation=3]\n */\nfunction ContactMaterial(m1, m2, options){\n    options = Utils.defaults(options, {\n        friction: 0.3,\n        restitution: 0.3,\n        contactEquationStiffness: 1e7,\n        contactEquationRelaxation: 3,\n        frictionEquationStiffness: 1e7,\n        frictionEquationRelaxation: 3\n    });\n\n    /**\n     * Identifier of this material\n     * @property {Number} id\n     */\n    this.id = ContactMaterial.idCounter++;\n\n    /**\n     * Participating materials\n     * @property {Array} materials\n     * @todo  Should be .materialA and .materialB instead\n     */\n    this.materials = [m1, m2];\n\n    /**\n     * Friction coefficient\n     * @property {Number} friction\n     */\n    this.friction = options.friction;\n\n    /**\n     * Restitution coefficient\n     * @property {Number} restitution\n     */\n    this.restitution = options.restitution;\n\n    /**\n     * Stiffness of the produced contact equations\n     * @property {Number} contactEquationStiffness\n     */\n    this.contactEquationStiffness = options.contactEquationStiffness;\n\n    /**\n     * Relaxation time of the produced contact equations\n     * @property {Number} contactEquationRelaxation\n     */\n    this.contactEquationRelaxation = options.contactEquationRelaxation;\n\n    /**\n     * Stiffness of the produced friction equations\n     * @property {Number} frictionEquationStiffness\n     */\n    this.frictionEquationStiffness = options.frictionEquationStiffness;\n\n    /**\n     * Relaxation time of the produced friction equations\n     * @property {Number} frictionEquationRelaxation\n     */\n    this.frictionEquationRelaxation = options.frictionEquationRelaxation;\n}\n\nContactMaterial.idCounter = 0;\n\n},{\"../utils/Utils\":53}],25:[function(_dereq_,module,exports){\nmodule.exports = Material;\n\n/**\n * Defines a physics material.\n * @class Material\n * @constructor\n * @param {object} [options]\n * @author schteppe\n */\nfunction Material(options){\n    var name = '';\n    options = options || {};\n\n    // Backwards compatibility fix\n    if(typeof(options) === 'string'){\n        name = options;\n        options = {};\n    } else if(typeof(options) === 'object') {\n        name = '';\n    }\n\n    /**\n     * @property name\n     * @type {String}\n     */\n    this.name = name;\n\n    /**\n     * material id.\n     * @property id\n     * @type {number}\n     */\n    this.id = Material.idCounter++;\n\n    /**\n     * Friction for this material. If non-negative, it will be used instead of the friction given by ContactMaterials. If there's no matching ContactMaterial, the value from .defaultContactMaterial in the World will be used.\n     * @property {number} friction\n     */\n    this.friction = typeof(options.friction) !== 'undefined' ? options.friction : -1;\n\n    /**\n     * Restitution for this material. If non-negative, it will be used instead of the restitution given by ContactMaterials. If there's no matching ContactMaterial, the value from .defaultContactMaterial in the World will be used.\n     * @property {number} restitution\n     */\n    this.restitution = typeof(options.restitution) !== 'undefined' ? options.restitution : -1;\n}\n\nMaterial.idCounter = 0;\n\n},{}],26:[function(_dereq_,module,exports){\nmodule.exports = JacobianElement;\n\nvar Vec3 = _dereq_('./Vec3');\n\n/**\n * An element containing 6 entries, 3 spatial and 3 rotational degrees of freedom.\n * @class JacobianElement\n * @constructor\n */\nfunction JacobianElement(){\n\n    /**\n     * @property {Vec3} spatial\n     */\n    this.spatial = new Vec3();\n\n    /**\n     * @property {Vec3} rotational\n     */\n    this.rotational = new Vec3();\n}\n\n/**\n * Multiply with other JacobianElement\n * @method multiplyElement\n * @param  {JacobianElement} element\n * @return {Number}\n */\nJacobianElement.prototype.multiplyElement = function(element){\n    return element.spatial.dot(this.spatial) + element.rotational.dot(this.rotational);\n};\n\n/**\n * Multiply with two vectors\n * @method multiplyVectors\n * @param  {Vec3} spatial\n * @param  {Vec3} rotational\n * @return {Number}\n */\nJacobianElement.prototype.multiplyVectors = function(spatial,rotational){\n    return spatial.dot(this.spatial) + rotational.dot(this.rotational);\n};\n\n},{\"./Vec3\":30}],27:[function(_dereq_,module,exports){\nmodule.exports = Mat3;\n\nvar Vec3 = _dereq_('./Vec3');\n\n/**\n * A 3x3 matrix.\n * @class Mat3\n * @constructor\n * @param array elements Array of nine elements. Optional.\n * @author schteppe / http://github.com/schteppe\n */\nfunction Mat3(elements){\n    /**\n     * A vector of length 9, containing all matrix elements\n     * @property {Array} elements\n     */\n    if(elements){\n        this.elements = elements;\n    } else {\n        this.elements = [0,0,0,0,0,0,0,0,0];\n    }\n}\n\n/**\n * Sets the matrix to identity\n * @method identity\n * @todo Should perhaps be renamed to setIdentity() to be more clear.\n * @todo Create another function that immediately creates an identity matrix eg. eye()\n */\nMat3.prototype.identity = function(){\n    var e = this.elements;\n    e[0] = 1;\n    e[1] = 0;\n    e[2] = 0;\n\n    e[3] = 0;\n    e[4] = 1;\n    e[5] = 0;\n\n    e[6] = 0;\n    e[7] = 0;\n    e[8] = 1;\n};\n\n/**\n * Set all elements to zero\n * @method setZero\n */\nMat3.prototype.setZero = function(){\n    var e = this.elements;\n    e[0] = 0;\n    e[1] = 0;\n    e[2] = 0;\n    e[3] = 0;\n    e[4] = 0;\n    e[5] = 0;\n    e[6] = 0;\n    e[7] = 0;\n    e[8] = 0;\n};\n\n/**\n * Sets the matrix diagonal elements from a Vec3\n * @method setTrace\n * @param {Vec3} vec3\n */\nMat3.prototype.setTrace = function(vec3){\n    var e = this.elements;\n    e[0] = vec3.x;\n    e[4] = vec3.y;\n    e[8] = vec3.z;\n};\n\n/**\n * Gets the matrix diagonal elements\n * @method getTrace\n * @return {Vec3}\n */\nMat3.prototype.getTrace = function(target){\n    var target = target || new Vec3();\n    var e = this.elements;\n    target.x = e[0];\n    target.y = e[4];\n    target.z = e[8];\n};\n\n/**\n * Matrix-Vector multiplication\n * @method vmult\n * @param {Vec3} v The vector to multiply with\n * @param {Vec3} target Optional, target to save the result in.\n */\nMat3.prototype.vmult = function(v,target){\n    target = target || new Vec3();\n\n    var e = this.elements,\n        x = v.x,\n        y = v.y,\n        z = v.z;\n    target.x = e[0]*x + e[1]*y + e[2]*z;\n    target.y = e[3]*x + e[4]*y + e[5]*z;\n    target.z = e[6]*x + e[7]*y + e[8]*z;\n\n    return target;\n};\n\n/**\n * Matrix-scalar multiplication\n * @method smult\n * @param {Number} s\n */\nMat3.prototype.smult = function(s){\n    for(var i=0; i<this.elements.length; i++){\n        this.elements[i] *= s;\n    }\n};\n\n/**\n * Matrix multiplication\n * @method mmult\n * @param {Mat3} m Matrix to multiply with from left side.\n * @return {Mat3} The result.\n */\nMat3.prototype.mmult = function(m,target){\n    var r = target || new Mat3();\n    for(var i=0; i<3; i++){\n        for(var j=0; j<3; j++){\n            var sum = 0.0;\n            for(var k=0; k<3; k++){\n                sum += m.elements[i+k*3] * this.elements[k+j*3];\n            }\n            r.elements[i+j*3] = sum;\n        }\n    }\n    return r;\n};\n\n/**\n * Scale each column of the matrix\n * @method scale\n * @param {Vec3} v\n * @return {Mat3} The result.\n */\nMat3.prototype.scale = function(v,target){\n    target = target || new Mat3();\n    var e = this.elements,\n        t = target.elements;\n    for(var i=0; i!==3; i++){\n        t[3*i + 0] = v.x * e[3*i + 0];\n        t[3*i + 1] = v.y * e[3*i + 1];\n        t[3*i + 2] = v.z * e[3*i + 2];\n    }\n    return target;\n};\n\n/**\n * Solve Ax=b\n * @method solve\n * @param {Vec3} b The right hand side\n * @param {Vec3} target Optional. Target vector to save in.\n * @return {Vec3} The solution x\n * @todo should reuse arrays\n */\nMat3.prototype.solve = function(b,target){\n    target = target || new Vec3();\n\n    // Construct equations\n    var nr = 3; // num rows\n    var nc = 4; // num cols\n    var eqns = [];\n    for(var i=0; i<nr*nc; i++){\n        eqns.push(0);\n    }\n    var i,j;\n    for(i=0; i<3; i++){\n        for(j=0; j<3; j++){\n            eqns[i+nc*j] = this.elements[i+3*j];\n        }\n    }\n    eqns[3+4*0] = b.x;\n    eqns[3+4*1] = b.y;\n    eqns[3+4*2] = b.z;\n\n    // Compute right upper triangular version of the matrix - Gauss elimination\n    var n = 3, k = n, np;\n    var kp = 4; // num rows\n    var p, els;\n    do {\n        i = k - n;\n        if (eqns[i+nc*i] === 0) {\n            // the pivot is null, swap lines\n            for (j = i + 1; j < k; j++) {\n                if (eqns[i+nc*j] !== 0) {\n                    np = kp;\n                    do {  // do ligne( i ) = ligne( i ) + ligne( k )\n                        p = kp - np;\n                        eqns[p+nc*i] += eqns[p+nc*j];\n                    } while (--np);\n                    break;\n                }\n            }\n        }\n        if (eqns[i+nc*i] !== 0) {\n            for (j = i + 1; j < k; j++) {\n                var multiplier = eqns[i+nc*j] / eqns[i+nc*i];\n                np = kp;\n                do {  // do ligne( k ) = ligne( k ) - multiplier * ligne( i )\n                    p = kp - np;\n                    eqns[p+nc*j] = p <= i ? 0 : eqns[p+nc*j] - eqns[p+nc*i] * multiplier ;\n                } while (--np);\n            }\n        }\n    } while (--n);\n\n    // Get the solution\n    target.z = eqns[2*nc+3] / eqns[2*nc+2];\n    target.y = (eqns[1*nc+3] - eqns[1*nc+2]*target.z) / eqns[1*nc+1];\n    target.x = (eqns[0*nc+3] - eqns[0*nc+2]*target.z - eqns[0*nc+1]*target.y) / eqns[0*nc+0];\n\n    if(isNaN(target.x) || isNaN(target.y) || isNaN(target.z) || target.x===Infinity || target.y===Infinity || target.z===Infinity){\n        throw \"Could not solve equation! Got x=[\"+target.toString()+\"], b=[\"+b.toString()+\"], A=[\"+this.toString()+\"]\";\n    }\n\n    return target;\n};\n\n/**\n * Get an element in the matrix by index. Index starts at 0, not 1!!!\n * @method e\n * @param {Number} row\n * @param {Number} column\n * @param {Number} value Optional. If provided, the matrix element will be set to this value.\n * @return {Number}\n */\nMat3.prototype.e = function( row , column ,value){\n    if(value===undefined){\n        return this.elements[column+3*row];\n    } else {\n        // Set value\n        this.elements[column+3*row] = value;\n    }\n};\n\n/**\n * Copy another matrix into this matrix object.\n * @method copy\n * @param {Mat3} source\n * @return {Mat3} this\n */\nMat3.prototype.copy = function(source){\n    for(var i=0; i < source.elements.length; i++){\n        this.elements[i] = source.elements[i];\n    }\n    return this;\n};\n\n/**\n * Returns a string representation of the matrix.\n * @method toString\n * @return string\n */\nMat3.prototype.toString = function(){\n    var r = \"\";\n    var sep = \",\";\n    for(var i=0; i<9; i++){\n        r += this.elements[i] + sep;\n    }\n    return r;\n};\n\n/**\n * reverse the matrix\n * @method reverse\n * @param {Mat3} target Optional. Target matrix to save in.\n * @return {Mat3} The solution x\n */\nMat3.prototype.reverse = function(target){\n\n    target = target || new Mat3();\n\n    // Construct equations\n    var nr = 3; // num rows\n    var nc = 6; // num cols\n    var eqns = [];\n    for(var i=0; i<nr*nc; i++){\n        eqns.push(0);\n    }\n    var i,j;\n    for(i=0; i<3; i++){\n        for(j=0; j<3; j++){\n            eqns[i+nc*j] = this.elements[i+3*j];\n        }\n    }\n    eqns[3+6*0] = 1;\n    eqns[3+6*1] = 0;\n    eqns[3+6*2] = 0;\n    eqns[4+6*0] = 0;\n    eqns[4+6*1] = 1;\n    eqns[4+6*2] = 0;\n    eqns[5+6*0] = 0;\n    eqns[5+6*1] = 0;\n    eqns[5+6*2] = 1;\n\n    // Compute right upper triangular version of the matrix - Gauss elimination\n    var n = 3, k = n, np;\n    var kp = nc; // num rows\n    var p;\n    do {\n        i = k - n;\n        if (eqns[i+nc*i] === 0) {\n            // the pivot is null, swap lines\n            for (j = i + 1; j < k; j++) {\n                if (eqns[i+nc*j] !== 0) {\n                    np = kp;\n                    do { // do line( i ) = line( i ) + line( k )\n                        p = kp - np;\n                        eqns[p+nc*i] += eqns[p+nc*j];\n                    } while (--np);\n                    break;\n                }\n            }\n        }\n        if (eqns[i+nc*i] !== 0) {\n            for (j = i + 1; j < k; j++) {\n                var multiplier = eqns[i+nc*j] / eqns[i+nc*i];\n                np = kp;\n                do { // do line( k ) = line( k ) - multiplier * line( i )\n                    p = kp - np;\n                    eqns[p+nc*j] = p <= i ? 0 : eqns[p+nc*j] - eqns[p+nc*i] * multiplier ;\n                } while (--np);\n            }\n        }\n    } while (--n);\n\n    // eliminate the upper left triangle of the matrix\n    i = 2;\n    do {\n        j = i-1;\n        do {\n            var multiplier = eqns[i+nc*j] / eqns[i+nc*i];\n            np = nc;\n            do {\n                p = nc - np;\n                eqns[p+nc*j] =  eqns[p+nc*j] - eqns[p+nc*i] * multiplier ;\n            } while (--np);\n        } while (j--);\n    } while (--i);\n\n    // operations on the diagonal\n    i = 2;\n    do {\n        var multiplier = 1 / eqns[i+nc*i];\n        np = nc;\n        do {\n            p = nc - np;\n            eqns[p+nc*i] = eqns[p+nc*i] * multiplier ;\n        } while (--np);\n    } while (i--);\n\n    i = 2;\n    do {\n        j = 2;\n        do {\n            p = eqns[nr+j+nc*i];\n            if( isNaN( p ) || p ===Infinity ){\n                throw \"Could not reverse! A=[\"+this.toString()+\"]\";\n            }\n            target.e( i , j , p );\n        } while (j--);\n    } while (i--);\n\n    return target;\n};\n\n/**\n * Set the matrix from a quaterion\n * @method setRotationFromQuaternion\n * @param {Quaternion} q\n */\nMat3.prototype.setRotationFromQuaternion = function( q ) {\n    var x = q.x, y = q.y, z = q.z, w = q.w,\n        x2 = x + x, y2 = y + y, z2 = z + z,\n        xx = x * x2, xy = x * y2, xz = x * z2,\n        yy = y * y2, yz = y * z2, zz = z * z2,\n        wx = w * x2, wy = w * y2, wz = w * z2,\n        e = this.elements;\n\n    e[3*0 + 0] = 1 - ( yy + zz );\n    e[3*0 + 1] = xy - wz;\n    e[3*0 + 2] = xz + wy;\n\n    e[3*1 + 0] = xy + wz;\n    e[3*1 + 1] = 1 - ( xx + zz );\n    e[3*1 + 2] = yz - wx;\n\n    e[3*2 + 0] = xz - wy;\n    e[3*2 + 1] = yz + wx;\n    e[3*2 + 2] = 1 - ( xx + yy );\n\n    return this;\n};\n\n/**\n * Transpose the matrix\n * @method transpose\n * @param  {Mat3} target Where to store the result.\n * @return {Mat3} The target Mat3, or a new Mat3 if target was omitted.\n */\nMat3.prototype.transpose = function( target ) {\n    target = target || new Mat3();\n\n    var Mt = target.elements,\n        M = this.elements;\n\n    for(var i=0; i!==3; i++){\n        for(var j=0; j!==3; j++){\n            Mt[3*i + j] = M[3*j + i];\n        }\n    }\n\n    return target;\n};\n\n},{\"./Vec3\":30}],28:[function(_dereq_,module,exports){\nmodule.exports = Quaternion;\n\nvar Vec3 = _dereq_('./Vec3');\n\n/**\n * A Quaternion describes a rotation in 3D space. The Quaternion is mathematically defined as Q = x*i + y*j + z*k + w, where (i,j,k) are imaginary basis vectors. (x,y,z) can be seen as a vector related to the axis of rotation, while the real multiplier, w, is related to the amount of rotation.\n * @class Quaternion\n * @constructor\n * @param {Number} x Multiplier of the imaginary basis vector i.\n * @param {Number} y Multiplier of the imaginary basis vector j.\n * @param {Number} z Multiplier of the imaginary basis vector k.\n * @param {Number} w Multiplier of the real part.\n * @see http://en.wikipedia.org/wiki/Quaternion\n */\nfunction Quaternion(x,y,z,w){\n    /**\n     * @property {Number} x\n     */\n    this.x = x!==undefined ? x : 0;\n\n    /**\n     * @property {Number} y\n     */\n    this.y = y!==undefined ? y : 0;\n\n    /**\n     * @property {Number} z\n     */\n    this.z = z!==undefined ? z : 0;\n\n    /**\n     * The multiplier of the real quaternion basis vector.\n     * @property {Number} w\n     */\n    this.w = w!==undefined ? w : 1;\n}\n\n/**\n * Set the value of the quaternion.\n * @method set\n * @param {Number} x\n * @param {Number} y\n * @param {Number} z\n * @param {Number} w\n */\nQuaternion.prototype.set = function(x,y,z,w){\n    this.x = x;\n    this.y = y;\n    this.z = z;\n    this.w = w;\n};\n\n/**\n * Convert to a readable format\n * @method toString\n * @return string\n */\nQuaternion.prototype.toString = function(){\n    return this.x+\",\"+this.y+\",\"+this.z+\",\"+this.w;\n};\n\n/**\n * Convert to an Array\n * @method toArray\n * @return Array\n */\nQuaternion.prototype.toArray = function(){\n    return [this.x, this.y, this.z, this.w];\n};\n\n/**\n * Set the quaternion components given an axis and an angle.\n * @method setFromAxisAngle\n * @param {Vec3} axis\n * @param {Number} angle in radians\n */\nQuaternion.prototype.setFromAxisAngle = function(axis,angle){\n    var s = Math.sin(angle*0.5);\n    this.x = axis.x * s;\n    this.y = axis.y * s;\n    this.z = axis.z * s;\n    this.w = Math.cos(angle*0.5);\n};\n\n/**\n * Converts the quaternion to axis/angle representation.\n * @method toAxisAngle\n * @param {Vec3} targetAxis Optional. A vector object to reuse for storing the axis.\n * @return Array An array, first elemnt is the axis and the second is the angle in radians.\n */\nQuaternion.prototype.toAxisAngle = function(targetAxis){\n    targetAxis = targetAxis || new Vec3();\n    this.normalize(); // if w>1 acos and sqrt will produce errors, this cant happen if quaternion is normalised\n    var angle = 2 * Math.acos(this.w);\n    var s = Math.sqrt(1-this.w*this.w); // assuming quaternion normalised then w is less than 1, so term always positive.\n    if (s < 0.001) { // test to avoid divide by zero, s is always positive due to sqrt\n        // if s close to zero then direction of axis not important\n        targetAxis.x = this.x; // if it is important that axis is normalised then replace with x=1; y=z=0;\n        targetAxis.y = this.y;\n        targetAxis.z = this.z;\n    } else {\n        targetAxis.x = this.x / s; // normalise axis\n        targetAxis.y = this.y / s;\n        targetAxis.z = this.z / s;\n    }\n    return [targetAxis,angle];\n};\n\nvar sfv_t1 = new Vec3(),\n    sfv_t2 = new Vec3();\n\n/**\n * Set the quaternion value given two vectors. The resulting rotation will be the needed rotation to rotate u to v.\n * @method setFromVectors\n * @param {Vec3} u\n * @param {Vec3} v\n */\nQuaternion.prototype.setFromVectors = function(u,v){\n    if(u.isAntiparallelTo(v)){\n        var t1 = sfv_t1;\n        var t2 = sfv_t2;\n\n        u.tangents(t1,t2);\n        this.setFromAxisAngle(t1,Math.PI);\n    } else {\n        var a = u.cross(v);\n        this.x = a.x;\n        this.y = a.y;\n        this.z = a.z;\n        this.w = Math.sqrt(Math.pow(u.norm(),2) * Math.pow(v.norm(),2)) + u.dot(v);\n        this.normalize();\n    }\n};\n\n/**\n * Quaternion multiplication\n * @method mult\n * @param {Quaternion} q\n * @param {Quaternion} target Optional.\n * @return {Quaternion}\n */\nvar Quaternion_mult_va = new Vec3();\nvar Quaternion_mult_vb = new Vec3();\nvar Quaternion_mult_vaxvb = new Vec3();\nQuaternion.prototype.mult = function(q,target){\n    target = target || new Quaternion();\n    var w = this.w,\n        va = Quaternion_mult_va,\n        vb = Quaternion_mult_vb,\n        vaxvb = Quaternion_mult_vaxvb;\n\n    va.set(this.x,this.y,this.z);\n    vb.set(q.x,q.y,q.z);\n    target.w = w*q.w - va.dot(vb);\n    va.cross(vb,vaxvb);\n\n    target.x = w * vb.x + q.w*va.x + vaxvb.x;\n    target.y = w * vb.y + q.w*va.y + vaxvb.y;\n    target.z = w * vb.z + q.w*va.z + vaxvb.z;\n\n    return target;\n};\n\n/**\n * Get the inverse quaternion rotation.\n * @method inverse\n * @param {Quaternion} target\n * @return {Quaternion}\n */\nQuaternion.prototype.inverse = function(target){\n    var x = this.x, y = this.y, z = this.z, w = this.w;\n    target = target || new Quaternion();\n\n    this.conjugate(target);\n    var inorm2 = 1/(x*x + y*y + z*z + w*w);\n    target.x *= inorm2;\n    target.y *= inorm2;\n    target.z *= inorm2;\n    target.w *= inorm2;\n\n    return target;\n};\n\n/**\n * Get the quaternion conjugate\n * @method conjugate\n * @param {Quaternion} target\n * @return {Quaternion}\n */\nQuaternion.prototype.conjugate = function(target){\n    target = target || new Quaternion();\n\n    target.x = -this.x;\n    target.y = -this.y;\n    target.z = -this.z;\n    target.w = this.w;\n\n    return target;\n};\n\n/**\n * Normalize the quaternion. Note that this changes the values of the quaternion.\n * @method normalize\n */\nQuaternion.prototype.normalize = function(){\n    var l = Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z+this.w*this.w);\n    if ( l === 0 ) {\n        this.x = 0;\n        this.y = 0;\n        this.z = 0;\n        this.w = 0;\n    } else {\n        l = 1 / l;\n        this.x *= l;\n        this.y *= l;\n        this.z *= l;\n        this.w *= l;\n    }\n};\n\n/**\n * Approximation of quaternion normalization. Works best when quat is already almost-normalized.\n * @method normalizeFast\n * @see http://jsperf.com/fast-quaternion-normalization\n * @author unphased, https://github.com/unphased\n */\nQuaternion.prototype.normalizeFast = function () {\n    var f = (3.0-(this.x*this.x+this.y*this.y+this.z*this.z+this.w*this.w))/2.0;\n    if ( f === 0 ) {\n        this.x = 0;\n        this.y = 0;\n        this.z = 0;\n        this.w = 0;\n    } else {\n        this.x *= f;\n        this.y *= f;\n        this.z *= f;\n        this.w *= f;\n    }\n};\n\n/**\n * Multiply the quaternion by a vector\n * @method vmult\n * @param {Vec3} v\n * @param {Vec3} target Optional\n * @return {Vec3}\n */\nQuaternion.prototype.vmult = function(v,target){\n    target = target || new Vec3();\n\n    var x = v.x,\n        y = v.y,\n        z = v.z;\n\n    var qx = this.x,\n        qy = this.y,\n        qz = this.z,\n        qw = this.w;\n\n    // q*v\n    var ix =  qw * x + qy * z - qz * y,\n    iy =  qw * y + qz * x - qx * z,\n    iz =  qw * z + qx * y - qy * x,\n    iw = -qx * x - qy * y - qz * z;\n\n    target.x = ix * qw + iw * -qx + iy * -qz - iz * -qy;\n    target.y = iy * qw + iw * -qy + iz * -qx - ix * -qz;\n    target.z = iz * qw + iw * -qz + ix * -qy - iy * -qx;\n\n    return target;\n};\n\n/**\n * Copies value of source to this quaternion.\n * @method copy\n * @param {Quaternion} source\n * @return {Quaternion} this\n */\nQuaternion.prototype.copy = function(source){\n    this.x = source.x;\n    this.y = source.y;\n    this.z = source.z;\n    this.w = source.w;\n    return this;\n};\n\n/**\n * Convert the quaternion to euler angle representation. Order: YZX, as this page describes: http://www.euclideanspace.com/maths/standards/index.htm\n * @method toEuler\n * @param {Vec3} target\n * @param string order Three-character string e.g. \"YZX\", which also is default.\n */\nQuaternion.prototype.toEuler = function(target,order){\n    order = order || \"YZX\";\n\n    var heading, attitude, bank;\n    var x = this.x, y = this.y, z = this.z, w = this.w;\n\n    switch(order){\n    case \"YZX\":\n        var test = x*y + z*w;\n        if (test > 0.499) { // singularity at north pole\n            heading = 2 * Math.atan2(x,w);\n            attitude = Math.PI/2;\n            bank = 0;\n        }\n        if (test < -0.499) { // singularity at south pole\n            heading = -2 * Math.atan2(x,w);\n            attitude = - Math.PI/2;\n            bank = 0;\n        }\n        if(isNaN(heading)){\n            var sqx = x*x;\n            var sqy = y*y;\n            var sqz = z*z;\n            heading = Math.atan2(2*y*w - 2*x*z , 1 - 2*sqy - 2*sqz); // Heading\n            attitude = Math.asin(2*test); // attitude\n            bank = Math.atan2(2*x*w - 2*y*z , 1 - 2*sqx - 2*sqz); // bank\n        }\n        break;\n    default:\n        throw new Error(\"Euler order \"+order+\" not supported yet.\");\n    }\n\n    target.y = heading;\n    target.z = attitude;\n    target.x = bank;\n};\n\n/**\n * See http://www.mathworks.com/matlabcentral/fileexchange/20696-function-to-convert-between-dcm-euler-angles-quaternions-and-euler-vectors/content/SpinCalc.m\n * @method setFromEuler\n * @param {Number} x\n * @param {Number} y\n * @param {Number} z\n * @param {String} order The order to apply angles: 'XYZ' or 'YXZ' or any other combination\n */\nQuaternion.prototype.setFromEuler = function ( x, y, z, order ) {\n    order = order || \"XYZ\";\n\n    var c1 = Math.cos( x / 2 );\n    var c2 = Math.cos( y / 2 );\n    var c3 = Math.cos( z / 2 );\n    var s1 = Math.sin( x / 2 );\n    var s2 = Math.sin( y / 2 );\n    var s3 = Math.sin( z / 2 );\n\n    if ( order === 'XYZ' ) {\n\n        this.x = s1 * c2 * c3 + c1 * s2 * s3;\n        this.y = c1 * s2 * c3 - s1 * c2 * s3;\n        this.z = c1 * c2 * s3 + s1 * s2 * c3;\n        this.w = c1 * c2 * c3 - s1 * s2 * s3;\n\n    } else if ( order === 'YXZ' ) {\n\n        this.x = s1 * c2 * c3 + c1 * s2 * s3;\n        this.y = c1 * s2 * c3 - s1 * c2 * s3;\n        this.z = c1 * c2 * s3 - s1 * s2 * c3;\n        this.w = c1 * c2 * c3 + s1 * s2 * s3;\n\n    } else if ( order === 'ZXY' ) {\n\n        this.x = s1 * c2 * c3 - c1 * s2 * s3;\n        this.y = c1 * s2 * c3 + s1 * c2 * s3;\n        this.z = c1 * c2 * s3 + s1 * s2 * c3;\n        this.w = c1 * c2 * c3 - s1 * s2 * s3;\n\n    } else if ( order === 'ZYX' ) {\n\n        this.x = s1 * c2 * c3 - c1 * s2 * s3;\n        this.y = c1 * s2 * c3 + s1 * c2 * s3;\n        this.z = c1 * c2 * s3 - s1 * s2 * c3;\n        this.w = c1 * c2 * c3 + s1 * s2 * s3;\n\n    } else if ( order === 'YZX' ) {\n\n        this.x = s1 * c2 * c3 + c1 * s2 * s3;\n        this.y = c1 * s2 * c3 + s1 * c2 * s3;\n        this.z = c1 * c2 * s3 - s1 * s2 * c3;\n        this.w = c1 * c2 * c3 - s1 * s2 * s3;\n\n    } else if ( order === 'XZY' ) {\n\n        this.x = s1 * c2 * c3 - c1 * s2 * s3;\n        this.y = c1 * s2 * c3 - s1 * c2 * s3;\n        this.z = c1 * c2 * s3 + s1 * s2 * c3;\n        this.w = c1 * c2 * c3 + s1 * s2 * s3;\n\n    }\n\n    return this;\n\n};\n\nQuaternion.prototype.clone = function(){\n    return new Quaternion(this.x, this.y, this.z, this.w);\n};\n},{\"./Vec3\":30}],29:[function(_dereq_,module,exports){\nvar Vec3 = _dereq_('./Vec3');\nvar Quaternion = _dereq_('./Quaternion');\n\nmodule.exports = Transform;\n\n/**\n * @class Transform\n * @constructor\n */\nfunction Transform(options) {\n    options = options || {};\n\n\t/**\n\t * @property {Vec3} position\n\t */\n\tthis.position = new Vec3();\n    if(options.position){\n        this.position.copy(options.position);\n    }\n\n\t/**\n\t * @property {Quaternion} quaternion\n\t */\n\tthis.quaternion = new Quaternion();\n    if(options.quaternion){\n        this.quaternion.copy(options.quaternion);\n    }\n}\n\nvar tmpQuat = new Quaternion();\n\n/**\n * @static\n * @method pointToLocaFrame\n * @param {Vec3} position\n * @param {Quaternion} quaternion\n * @param {Vec3} worldPoint\n * @param {Vec3} result\n */\nTransform.pointToLocalFrame = function(position, quaternion, worldPoint, result){\n    var result = result || new Vec3();\n    worldPoint.vsub(position, result);\n    quaternion.conjugate(tmpQuat);\n    tmpQuat.vmult(result, result);\n    return result;\n};\n\n/**\n * Get a global point in local transform coordinates.\n * @method pointToLocal\n * @param  {Vec3} point\n * @param  {Vec3} result\n * @return {Vec3} The \"result\" vector object\n */\nTransform.prototype.pointToLocal = function(worldPoint, result){\n    return Transform.pointToLocalFrame(this.position, this.quaternion, worldPoint, result);\n};\n\n/**\n * @static\n * @method pointToWorldFrame\n * @param {Vec3} position\n * @param {Vec3} quaternion\n * @param {Vec3} localPoint\n * @param {Vec3} result\n */\nTransform.pointToWorldFrame = function(position, quaternion, localPoint, result){\n    var result = result || new Vec3();\n    quaternion.vmult(localPoint, result);\n    result.vadd(position, result);\n    return result;\n};\n\n/**\n * Get a local point in global transform coordinates.\n * @method pointToWorld\n * @param  {Vec3} point\n * @param  {Vec3} result\n * @return {Vec3} The \"result\" vector object\n */\nTransform.prototype.pointToWorld = function(localPoint, result){\n    return Transform.pointToWorldFrame(this.position, this.quaternion, localPoint, result);\n};\n\n\nTransform.prototype.vectorToWorldFrame = function(localVector, result){\n    var result = result || new Vec3();\n    this.quaternion.vmult(localVector, result);\n    return result;\n};\n\nTransform.vectorToWorldFrame = function(quaternion, localVector, result){\n    quaternion.vmult(localVector, result);\n    return result;\n};\n\nTransform.vectorToLocalFrame = function(position, quaternion, worldVector, result){\n    var result = result || new Vec3();\n    quaternion.w *= -1;\n    quaternion.vmult(worldVector, result);\n    quaternion.w *= -1;\n    return result;\n};\n\n},{\"./Quaternion\":28,\"./Vec3\":30}],30:[function(_dereq_,module,exports){\nmodule.exports = Vec3;\n\nvar Mat3 = _dereq_('./Mat3');\n\n/**\n * 3-dimensional vector\n * @class Vec3\n * @constructor\n * @param {Number} x\n * @param {Number} y\n * @param {Number} z\n * @author schteppe\n * @example\n *     var v = new Vec3(1, 2, 3);\n *     console.log('x=' + v.x); // x=1\n */\nfunction Vec3(x,y,z){\n    /**\n     * @property x\n     * @type {Number}\n     */\n    this.x = x||0.0;\n\n    /**\n     * @property y\n     * @type {Number}\n     */\n    this.y = y||0.0;\n\n    /**\n     * @property z\n     * @type {Number}\n     */\n    this.z = z||0.0;\n}\n\n/**\n * @static\n * @property {Vec3} ZERO\n */\nVec3.ZERO = new Vec3(0, 0, 0);\n\n/**\n * @static\n * @property {Vec3} UNIT_X\n */\nVec3.UNIT_X = new Vec3(1, 0, 0);\n\n/**\n * @static\n * @property {Vec3} UNIT_Y\n */\nVec3.UNIT_Y = new Vec3(0, 1, 0);\n\n/**\n * @static\n * @property {Vec3} UNIT_Z\n */\nVec3.UNIT_Z = new Vec3(0, 0, 1);\n\n/**\n * Vector cross product\n * @method cross\n * @param {Vec3} v\n * @param {Vec3} target Optional. Target to save in.\n * @return {Vec3}\n */\nVec3.prototype.cross = function(v,target){\n    var vx=v.x, vy=v.y, vz=v.z, x=this.x, y=this.y, z=this.z;\n    target = target || new Vec3();\n\n    target.x = (y * vz) - (z * vy);\n    target.y = (z * vx) - (x * vz);\n    target.z = (x * vy) - (y * vx);\n\n    return target;\n};\n\n/**\n * Set the vectors' 3 elements\n * @method set\n * @param {Number} x\n * @param {Number} y\n * @param {Number} z\n * @return Vec3\n */\nVec3.prototype.set = function(x,y,z){\n    this.x = x;\n    this.y = y;\n    this.z = z;\n    return this;\n};\n\n/**\n * Set all components of the vector to zero.\n * @method setZero\n */\nVec3.prototype.setZero = function(){\n    this.x = this.y = this.z = 0;\n};\n\n/**\n * Vector addition\n * @method vadd\n * @param {Vec3} v\n * @param {Vec3} target Optional.\n * @return {Vec3}\n */\nVec3.prototype.vadd = function(v,target){\n    if(target){\n        target.x = v.x + this.x;\n        target.y = v.y + this.y;\n        target.z = v.z + this.z;\n    } else {\n        return new Vec3(this.x + v.x,\n                               this.y + v.y,\n                               this.z + v.z);\n    }\n};\n\n/**\n * Vector subtraction\n * @method vsub\n * @param {Vec3} v\n * @param {Vec3} target Optional. Target to save in.\n * @return {Vec3}\n */\nVec3.prototype.vsub = function(v,target){\n    if(target){\n        target.x = this.x - v.x;\n        target.y = this.y - v.y;\n        target.z = this.z - v.z;\n    } else {\n        return new Vec3(this.x-v.x,\n                               this.y-v.y,\n                               this.z-v.z);\n    }\n};\n\n/**\n * Get the cross product matrix a_cross from a vector, such that a x b = a_cross * b = c\n * @method crossmat\n * @see http://www8.cs.umu.se/kurser/TDBD24/VT06/lectures/Lecture6.pdf\n * @return {Mat3}\n */\nVec3.prototype.crossmat = function(){\n    return new Mat3([     0,  -this.z,   this.y,\n                            this.z,        0,  -this.x,\n                           -this.y,   this.x,        0]);\n};\n\n/**\n * Normalize the vector. Note that this changes the values in the vector.\n * @method normalize\n * @return {Number} Returns the norm of the vector\n */\nVec3.prototype.normalize = function(){\n    var x=this.x, y=this.y, z=this.z;\n    var n = Math.sqrt(x*x + y*y + z*z);\n    if(n>0.0){\n        var invN = 1/n;\n        this.x *= invN;\n        this.y *= invN;\n        this.z *= invN;\n    } else {\n        // Make something up\n        this.x = 0;\n        this.y = 0;\n        this.z = 0;\n    }\n    return n;\n};\n\n/**\n * Get the version of this vector that is of length 1.\n * @method unit\n * @param {Vec3} target Optional target to save in\n * @return {Vec3} Returns the unit vector\n */\nVec3.prototype.unit = function(target){\n    target = target || new Vec3();\n    var x=this.x, y=this.y, z=this.z;\n    var ninv = Math.sqrt(x*x + y*y + z*z);\n    if(ninv>0.0){\n        ninv = 1.0/ninv;\n        target.x = x * ninv;\n        target.y = y * ninv;\n        target.z = z * ninv;\n    } else {\n        target.x = 1;\n        target.y = 0;\n        target.z = 0;\n    }\n    return target;\n};\n\n/**\n * Get the length of the vector\n * @method norm\n * @return {Number}\n * @deprecated Use .length() instead\n */\nVec3.prototype.norm = function(){\n    var x=this.x, y=this.y, z=this.z;\n    return Math.sqrt(x*x + y*y + z*z);\n};\n\n/**\n * Get the length of the vector\n * @method length\n * @return {Number}\n */\nVec3.prototype.length = Vec3.prototype.norm;\n\n/**\n * Get the squared length of the vector\n * @method norm2\n * @return {Number}\n * @deprecated Use .lengthSquared() instead.\n */\nVec3.prototype.norm2 = function(){\n    return this.dot(this);\n};\n\n/**\n * Get the squared length of the vector.\n * @method lengthSquared\n * @return {Number}\n */\nVec3.prototype.lengthSquared = Vec3.prototype.norm2;\n\n/**\n * Get distance from this point to another point\n * @method distanceTo\n * @param  {Vec3} p\n * @return {Number}\n */\nVec3.prototype.distanceTo = function(p){\n    var x=this.x, y=this.y, z=this.z;\n    var px=p.x, py=p.y, pz=p.z;\n    return Math.sqrt((px-x)*(px-x)+\n                     (py-y)*(py-y)+\n                     (pz-z)*(pz-z));\n};\n\n/**\n * Get squared distance from this point to another point\n * @method distanceSquared\n * @param  {Vec3} p\n * @return {Number}\n */\nVec3.prototype.distanceSquared = function(p){\n    var x=this.x, y=this.y, z=this.z;\n    var px=p.x, py=p.y, pz=p.z;\n    return (px-x)*(px-x) + (py-y)*(py-y) + (pz-z)*(pz-z);\n};\n\n/**\n * Multiply all the components of the vector with a scalar.\n * @deprecated Use .scale instead\n * @method mult\n * @param {Number} scalar\n * @param {Vec3} target The vector to save the result in.\n * @return {Vec3}\n * @deprecated Use .scale() instead\n */\nVec3.prototype.mult = function(scalar,target){\n    target = target || new Vec3();\n    var x = this.x,\n        y = this.y,\n        z = this.z;\n    target.x = scalar * x;\n    target.y = scalar * y;\n    target.z = scalar * z;\n    return target;\n};\n\n/**\n * Multiply the vector with a scalar.\n * @method scale\n * @param {Number} scalar\n * @param {Vec3} target\n * @return {Vec3}\n */\nVec3.prototype.scale = Vec3.prototype.mult;\n\n/**\n * Calculate dot product\n * @method dot\n * @param {Vec3} v\n * @return {Number}\n */\nVec3.prototype.dot = function(v){\n    return this.x * v.x + this.y * v.y + this.z * v.z;\n};\n\n/**\n * @method isZero\n * @return bool\n */\nVec3.prototype.isZero = function(){\n    return this.x===0 && this.y===0 && this.z===0;\n};\n\n/**\n * Make the vector point in the opposite direction.\n * @method negate\n * @param {Vec3} target Optional target to save in\n * @return {Vec3}\n */\nVec3.prototype.negate = function(target){\n    target = target || new Vec3();\n    target.x = -this.x;\n    target.y = -this.y;\n    target.z = -this.z;\n    return target;\n};\n\n/**\n * Compute two artificial tangents to the vector\n * @method tangents\n * @param {Vec3} t1 Vector object to save the first tangent in\n * @param {Vec3} t2 Vector object to save the second tangent in\n */\nvar Vec3_tangents_n = new Vec3();\nvar Vec3_tangents_randVec = new Vec3();\nVec3.prototype.tangents = function(t1,t2){\n    var norm = this.norm();\n    if(norm>0.0){\n        var n = Vec3_tangents_n;\n        var inorm = 1/norm;\n        n.set(this.x*inorm,this.y*inorm,this.z*inorm);\n        var randVec = Vec3_tangents_randVec;\n        if(Math.abs(n.x) < 0.9){\n            randVec.set(1,0,0);\n            n.cross(randVec,t1);\n        } else {\n            randVec.set(0,1,0);\n            n.cross(randVec,t1);\n        }\n        n.cross(t1,t2);\n    } else {\n        // The normal length is zero, make something up\n        t1.set(1, 0, 0);\n        t2.set(0, 1, 0);\n    }\n};\n\n/**\n * Converts to a more readable format\n * @method toString\n * @return string\n */\nVec3.prototype.toString = function(){\n    return this.x+\",\"+this.y+\",\"+this.z;\n};\n\n/**\n * Converts to an array\n * @method toArray\n * @return Array\n */\nVec3.prototype.toArray = function(){\n    return [this.x, this.y, this.z];\n};\n\n/**\n * Copies value of source to this vector.\n * @method copy\n * @param {Vec3} source\n * @return {Vec3} this\n */\nVec3.prototype.copy = function(source){\n    this.x = source.x;\n    this.y = source.y;\n    this.z = source.z;\n    return this;\n};\n\n\n/**\n * Do a linear interpolation between two vectors\n * @method lerp\n * @param {Vec3} v\n * @param {Number} t A number between 0 and 1. 0 will make this function return u, and 1 will make it return v. Numbers in between will generate a vector in between them.\n * @param {Vec3} target\n */\nVec3.prototype.lerp = function(v,t,target){\n    var x=this.x, y=this.y, z=this.z;\n    target.x = x + (v.x-x)*t;\n    target.y = y + (v.y-y)*t;\n    target.z = z + (v.z-z)*t;\n};\n\n/**\n * Check if a vector equals is almost equal to another one.\n * @method almostEquals\n * @param {Vec3} v\n * @param {Number} precision\n * @return bool\n */\nVec3.prototype.almostEquals = function(v,precision){\n    if(precision===undefined){\n        precision = 1e-6;\n    }\n    if( Math.abs(this.x-v.x)>precision ||\n        Math.abs(this.y-v.y)>precision ||\n        Math.abs(this.z-v.z)>precision){\n        return false;\n    }\n    return true;\n};\n\n/**\n * Check if a vector is almost zero\n * @method almostZero\n * @param {Number} precision\n */\nVec3.prototype.almostZero = function(precision){\n    if(precision===undefined){\n        precision = 1e-6;\n    }\n    if( Math.abs(this.x)>precision ||\n        Math.abs(this.y)>precision ||\n        Math.abs(this.z)>precision){\n        return false;\n    }\n    return true;\n};\n\nvar antip_neg = new Vec3();\n\n/**\n * Check if the vector is anti-parallel to another vector.\n * @method isAntiparallelTo\n * @param  {Vec3}  v\n * @param  {Number}  precision Set to zero for exact comparisons\n * @return {Boolean}\n */\nVec3.prototype.isAntiparallelTo = function(v,precision){\n    this.negate(antip_neg);\n    return antip_neg.almostEquals(v,precision);\n};\n\n/**\n * Clone the vector\n * @method clone\n * @return {Vec3}\n */\nVec3.prototype.clone = function(){\n    return new Vec3(this.x, this.y, this.z);\n};\n},{\"./Mat3\":27}],31:[function(_dereq_,module,exports){\nmodule.exports = Body;\n\nvar EventTarget = _dereq_('../utils/EventTarget');\nvar Shape = _dereq_('../shapes/Shape');\nvar Vec3 = _dereq_('../math/Vec3');\nvar Mat3 = _dereq_('../math/Mat3');\nvar Quaternion = _dereq_('../math/Quaternion');\nvar Material = _dereq_('../material/Material');\nvar AABB = _dereq_('../collision/AABB');\nvar Box = _dereq_('../shapes/Box');\n\n/**\n * Base class for all body types.\n * @class Body\n * @constructor\n * @extends EventTarget\n * @param {object} [options]\n * @param {Vec3} [options.position]\n * @param {Vec3} [options.velocity]\n * @param {Vec3} [options.angularVelocity]\n * @param {Quaternion} [options.quaternion]\n * @param {number} [options.mass]\n * @param {Material} [options.material]\n * @param {number} [options.type]\n * @param {number} [options.linearDamping=0.01]\n * @param {number} [options.angularDamping=0.01]\n * @param {boolean} [options.allowSleep=true]\n * @param {number} [options.sleepSpeedLimit=0.1]\n * @param {number} [options.sleepTimeLimit=1]\n * @param {number} [options.collisionFilterGroup=1]\n * @param {number} [options.collisionFilterMask=1]\n * @param {boolean} [options.fixedRotation=false]\n * @param {Body} [options.shape]\n * @example\n *     var body = new Body({\n *         mass: 1\n *     });\n *     var shape = new Sphere(1);\n *     body.addShape(shape);\n *     world.add(body);\n */\nfunction Body(options){\n    options = options || {};\n\n    EventTarget.apply(this);\n\n    this.id = Body.idCounter++;\n\n    /**\n     * Reference to the world the body is living in\n     * @property world\n     * @type {World}\n     */\n    this.world = null;\n\n    /**\n     * Callback function that is used BEFORE stepping the system. Use it to apply forces, for example. Inside the function, \"this\" will refer to this Body object.\n     * @property preStep\n     * @type {Function}\n     * @deprecated Use World events instead\n     */\n    this.preStep = null;\n\n    /**\n     * Callback function that is used AFTER stepping the system. Inside the function, \"this\" will refer to this Body object.\n     * @property postStep\n     * @type {Function}\n     * @deprecated Use World events instead\n     */\n    this.postStep = null;\n\n    this.vlambda = new Vec3();\n\n    /**\n     * @property {Number} collisionFilterGroup\n     */\n    this.collisionFilterGroup = typeof(options.collisionFilterGroup) === 'number' ? options.collisionFilterGroup : 1;\n\n    /**\n     * @property {Number} collisionFilterMask\n     */\n    this.collisionFilterMask = typeof(options.collisionFilterMask) === 'number' ? options.collisionFilterMask : 1;\n\n    /**\n     * Whether to produce contact forces when in contact with other bodies. Note that contacts will be generated, but they will be disabled.\n     * @property {Number} collisionResponse\n     */\n\tthis.collisionResponse = true;\n\n    /**\n     * @property position\n     * @type {Vec3}\n     */\n    this.position = new Vec3();\n\n    if(options.position){\n        this.position.copy(options.position);\n    }\n\n    /**\n     * @property {Vec3} previousPosition\n     */\n    this.previousPosition = new Vec3();\n\n    /**\n     * Initial position of the body\n     * @property initPosition\n     * @type {Vec3}\n     */\n    this.initPosition = new Vec3();\n\n    /**\n     * @property velocity\n     * @type {Vec3}\n     */\n    this.velocity = new Vec3();\n\n    if(options.velocity){\n        this.velocity.copy(options.velocity);\n    }\n\n    /**\n     * @property initVelocity\n     * @type {Vec3}\n     */\n    this.initVelocity = new Vec3();\n\n    /**\n     * Linear force on the body\n     * @property force\n     * @type {Vec3}\n     */\n    this.force = new Vec3();\n\n    var mass = typeof(options.mass) === 'number' ? options.mass : 0;\n\n    /**\n     * @property mass\n     * @type {Number}\n     * @default 0\n     */\n    this.mass = mass;\n\n    /**\n     * @property invMass\n     * @type {Number}\n     */\n    this.invMass = mass > 0 ? 1.0 / mass : 0;\n\n    /**\n     * @property material\n     * @type {Material}\n     */\n    this.material = options.material || null;\n\n    /**\n     * @property linearDamping\n     * @type {Number}\n     */\n    this.linearDamping = typeof(options.linearDamping) === 'number' ? options.linearDamping : 0.01;\n\n    /**\n     * One of: Body.DYNAMIC, Body.STATIC and Body.KINEMATIC.\n     * @property type\n     * @type {Number}\n     */\n    this.type = (mass <= 0.0 ? Body.STATIC : Body.DYNAMIC);\n    if(typeof(options.type) === typeof(Body.STATIC)){\n        this.type = options.type;\n    }\n\n    /**\n     * If true, the body will automatically fall to sleep.\n     * @property allowSleep\n     * @type {Boolean}\n     * @default true\n     */\n    this.allowSleep = typeof(options.allowSleep) !== 'undefined' ? options.allowSleep : true;\n\n    /**\n     * Current sleep state.\n     * @property sleepState\n     * @type {Number}\n     */\n    this.sleepState = 0;\n\n    /**\n     * If the speed (the norm of the velocity) is smaller than this value, the body is considered sleepy.\n     * @property sleepSpeedLimit\n     * @type {Number}\n     * @default 0.1\n     */\n    this.sleepSpeedLimit = typeof(options.sleepSpeedLimit) !== 'undefined' ? options.sleepSpeedLimit : 0.1;\n\n    /**\n     * If the body has been sleepy for this sleepTimeLimit seconds, it is considered sleeping.\n     * @property sleepTimeLimit\n     * @type {Number}\n     * @default 1\n     */\n    this.sleepTimeLimit = typeof(options.sleepTimeLimit) !== 'undefined' ? options.sleepTimeLimit : 1;\n\n    this.timeLastSleepy = 0;\n\n    this._wakeUpAfterNarrowphase = false;\n\n\n    /**\n     * Rotational force on the body, around center of mass\n     * @property {Vec3} torque\n     */\n    this.torque = new Vec3();\n\n    /**\n     * Orientation of the body\n     * @property quaternion\n     * @type {Quaternion}\n     */\n    this.quaternion = new Quaternion();\n\n    if(options.quaternion){\n        this.quaternion.copy(options.quaternion);\n    }\n\n    /**\n     * @property initQuaternion\n     * @type {Quaternion}\n     */\n    this.initQuaternion = new Quaternion();\n\n    /**\n     * @property angularVelocity\n     * @type {Vec3}\n     */\n    this.angularVelocity = new Vec3();\n\n    if(options.angularVelocity){\n        this.angularVelocity.copy(options.angularVelocity);\n    }\n\n    /**\n     * @property initAngularVelocity\n     * @type {Vec3}\n     */\n    this.initAngularVelocity = new Vec3();\n\n    this.interpolatedPosition = new Vec3();\n    this.interpolatedQuaternion = new Quaternion();\n\n    /**\n     * @property shapes\n     * @type {array}\n     */\n    this.shapes = [];\n\n    /**\n     * @property shapeOffsets\n     * @type {array}\n     */\n    this.shapeOffsets = [];\n\n    /**\n     * @property shapeOrientations\n     * @type {array}\n     */\n    this.shapeOrientations = [];\n\n    /**\n     * @property inertia\n     * @type {Vec3}\n     */\n    this.inertia = new Vec3();\n\n    /**\n     * @property {Vec3} invInertia\n     */\n    this.invInertia = new Vec3();\n\n    /**\n     * @property {Mat3} invInertiaWorld\n     */\n    this.invInertiaWorld = new Mat3();\n\n    this.invMassSolve = 0;\n\n    /**\n     * @property {Vec3} invInertiaSolve\n     */\n    this.invInertiaSolve = new Vec3();\n\n    /**\n     * @property {Mat3} invInertiaWorldSolve\n     */\n    this.invInertiaWorldSolve = new Mat3();\n\n    /**\n     * Set to true if you don't want the body to rotate. Make sure to run .updateMassProperties() after changing this.\n     * @property {Boolean} fixedRotation\n     * @default false\n     */\n    this.fixedRotation = typeof(options.fixedRotation) !== \"undefined\" ? options.fixedRotation : false;\n\n    /**\n     * @property {Number} angularDamping\n     */\n    this.angularDamping = typeof(options.angularDamping) !== 'undefined' ? options.angularDamping : 0.01;\n\n    /**\n     * @property aabb\n     * @type {AABB}\n     */\n    this.aabb = new AABB();\n\n    /**\n     * Indicates if the AABB needs to be updated before use.\n     * @property aabbNeedsUpdate\n     * @type {Boolean}\n     */\n    this.aabbNeedsUpdate = true;\n\n    this.wlambda = new Vec3();\n\n    if(options.shape){\n        this.addShape(options.shape);\n    }\n\n    this.updateMassProperties();\n}\nBody.prototype = new EventTarget();\nBody.prototype.constructor = Body;\n\n/**\n * A dynamic body is fully simulated. Can be moved manually by the user, but normally they move according to forces. A dynamic body can collide with all body types. A dynamic body always has finite, non-zero mass.\n * @static\n * @property DYNAMIC\n * @type {Number}\n */\nBody.DYNAMIC = 1;\n\n/**\n * A static body does not move during simulation and behaves as if it has infinite mass. Static bodies can be moved manually by setting the position of the body. The velocity of a static body is always zero. Static bodies do not collide with other static or kinematic bodies.\n * @static\n * @property STATIC\n * @type {Number}\n */\nBody.STATIC = 2;\n\n/**\n * A kinematic body moves under simulation according to its velocity. They do not respond to forces. They can be moved manually, but normally a kinematic body is moved by setting its velocity. A kinematic body behaves as if it has infinite mass. Kinematic bodies do not collide with other static or kinematic bodies.\n * @static\n * @property KINEMATIC\n * @type {Number}\n */\nBody.KINEMATIC = 4;\n\n\n\n/**\n * @static\n * @property AWAKE\n * @type {number}\n */\nBody.AWAKE = 0;\n\n/**\n * @static\n * @property SLEEPY\n * @type {number}\n */\nBody.SLEEPY = 1;\n\n/**\n * @static\n * @property SLEEPING\n * @type {number}\n */\nBody.SLEEPING = 2;\n\nBody.idCounter = 0;\n\n/**\n * Wake the body up.\n * @method wakeUp\n */\nBody.prototype.wakeUp = function(){\n    var s = this.sleepState;\n    this.sleepState = 0;\n    if(s === Body.SLEEPING){\n        this.dispatchEvent({type:\"wakeup\"});\n    }\n};\n\n/**\n * Force body sleep\n * @method sleep\n */\nBody.prototype.sleep = function(){\n    this.sleepState = Body.SLEEPING;\n    this.velocity.set(0,0,0);\n    this.angularVelocity.set(0,0,0);\n};\n\nBody.sleepyEvent = {\n    type: \"sleepy\"\n};\n\nBody.sleepEvent = {\n    type: \"sleep\"\n};\n\n/**\n * Called every timestep to update internal sleep timer and change sleep state if needed.\n * @method sleepTick\n * @param {Number} time The world time in seconds\n */\nBody.prototype.sleepTick = function(time){\n    if(this.allowSleep){\n        var sleepState = this.sleepState;\n        var speedSquared = this.velocity.norm2() + this.angularVelocity.norm2();\n        var speedLimitSquared = Math.pow(this.sleepSpeedLimit,2);\n        if(sleepState===Body.AWAKE && speedSquared < speedLimitSquared){\n            this.sleepState = Body.SLEEPY; // Sleepy\n            this.timeLastSleepy = time;\n            this.dispatchEvent(Body.sleepyEvent);\n        } else if(sleepState===Body.SLEEPY && speedSquared > speedLimitSquared){\n            this.wakeUp(); // Wake up\n        } else if(sleepState===Body.SLEEPY && (time - this.timeLastSleepy ) > this.sleepTimeLimit){\n            this.sleep(); // Sleeping\n            this.dispatchEvent(Body.sleepEvent);\n        }\n    }\n};\n\n/**\n * If the body is sleeping, it should be immovable / have infinite mass during solve. We solve it by having a separate \"solve mass\".\n * @method updateSolveMassProperties\n */\nBody.prototype.updateSolveMassProperties = function(){\n    if(this.sleepState === Body.SLEEPING || this.type === Body.KINEMATIC){\n        this.invMassSolve = 0;\n        this.invInertiaSolve.setZero();\n        this.invInertiaWorldSolve.setZero();\n    } else {\n        this.invMassSolve = this.invMass;\n        this.invInertiaSolve.copy(this.invInertia);\n        this.invInertiaWorldSolve.copy(this.invInertiaWorld);\n    }\n};\n\n/**\n * Convert a world point to local body frame.\n * @method pointToLocalFrame\n * @param  {Vec3} worldPoint\n * @param  {Vec3} result\n * @return {Vec3}\n */\nBody.prototype.pointToLocalFrame = function(worldPoint,result){\n    var result = result || new Vec3();\n    worldPoint.vsub(this.position,result);\n    this.quaternion.conjugate().vmult(result,result);\n    return result;\n};\n\n/**\n * Convert a world vector to local body frame.\n * @method vectorToLocalFrame\n * @param  {Vec3} worldPoint\n * @param  {Vec3} result\n * @return {Vec3}\n */\nBody.prototype.vectorToLocalFrame = function(worldVector, result){\n    var result = result || new Vec3();\n    this.quaternion.conjugate().vmult(worldVector,result);\n    return result;\n};\n\n/**\n * Convert a local body point to world frame.\n * @method pointToWorldFrame\n * @param  {Vec3} localPoint\n * @param  {Vec3} result\n * @return {Vec3}\n */\nBody.prototype.pointToWorldFrame = function(localPoint,result){\n    var result = result || new Vec3();\n    this.quaternion.vmult(localPoint,result);\n    result.vadd(this.position,result);\n    return result;\n};\n\n/**\n * Convert a local body point to world frame.\n * @method vectorToWorldFrame\n * @param  {Vec3} localVector\n * @param  {Vec3} result\n * @return {Vec3}\n */\nBody.prototype.vectorToWorldFrame = function(localVector, result){\n    var result = result || new Vec3();\n    this.quaternion.vmult(localVector, result);\n    return result;\n};\n\nvar tmpVec = new Vec3();\nvar tmpQuat = new Quaternion();\n\n/**\n * Add a shape to the body with a local offset and orientation.\n * @method addShape\n * @param {Shape} shape\n * @param {Vec3} offset\n * @param {Quaternion} quaternion\n * @return {Body} The body object, for chainability.\n */\nBody.prototype.addShape = function(shape, _offset, _orientation){\n    var offset = new Vec3();\n    var orientation = new Quaternion();\n\n    if(_offset){\n        offset.copy(_offset);\n    }\n    if(_orientation){\n        orientation.copy(_orientation);\n    }\n\n    this.shapes.push(shape);\n    this.shapeOffsets.push(offset);\n    this.shapeOrientations.push(orientation);\n    this.updateMassProperties();\n    this.updateBoundingRadius();\n\n    this.aabbNeedsUpdate = true;\n\n    return this;\n};\n\n/**\n * Update the bounding radius of the body. Should be done if any of the shapes are changed.\n * @method updateBoundingRadius\n */\nBody.prototype.updateBoundingRadius = function(){\n    var shapes = this.shapes,\n        shapeOffsets = this.shapeOffsets,\n        N = shapes.length,\n        radius = 0;\n\n    for(var i=0; i!==N; i++){\n        var shape = shapes[i];\n        shape.updateBoundingSphereRadius();\n        var offset = shapeOffsets[i].norm(),\n            r = shape.boundingSphereRadius;\n        if(offset + r > radius){\n            radius = offset + r;\n        }\n    }\n\n    this.boundingRadius = radius;\n};\n\nvar computeAABB_shapeAABB = new AABB();\n\n/**\n * Updates the .aabb\n * @method computeAABB\n * @todo rename to updateAABB()\n */\nBody.prototype.computeAABB = function(){\n    var shapes = this.shapes,\n        shapeOffsets = this.shapeOffsets,\n        shapeOrientations = this.shapeOrientations,\n        N = shapes.length,\n        offset = tmpVec,\n        orientation = tmpQuat,\n        bodyQuat = this.quaternion,\n        aabb = this.aabb,\n        shapeAABB = computeAABB_shapeAABB;\n\n    for(var i=0; i!==N; i++){\n        var shape = shapes[i];\n\n        // Get shape world quaternion\n        shapeOrientations[i].mult(bodyQuat, orientation);\n\n        // Get shape world position\n        orientation.vmult(shapeOffsets[i], offset);\n        offset.vadd(this.position, offset);\n\n        // vec2.rotate(offset, shapeOffsets[i], bodyAngle);\n        // vec2.add(offset, offset, this.position);\n\n        // Get shape AABB\n        shape.calculateWorldAABB(offset, orientation, shapeAABB.lowerBound, shapeAABB.upperBound);\n\n        if(i === 0){\n            aabb.copy(shapeAABB);\n        } else {\n            aabb.extend(shapeAABB);\n        }\n    }\n\n    this.aabbNeedsUpdate = false;\n};\n\nvar uiw_m1 = new Mat3(),\n    uiw_m2 = new Mat3(),\n    uiw_m3 = new Mat3();\n\n/**\n * Update .inertiaWorld and .invInertiaWorld\n * @method updateInertiaWorld\n */\nBody.prototype.updateInertiaWorld = function(force){\n    var I = this.invInertia;\n    if (I.x === I.y && I.y === I.z && !force) {\n        // If inertia M = s*I, where I is identity and s a scalar, then\n        //    R*M*R' = R*(s*I)*R' = s*R*I*R' = s*R*R' = s*I = M\n        // where R is the rotation matrix.\n        // In other words, we don't have to transform the inertia if all\n        // inertia diagonal entries are equal.\n    } else {\n        var m1 = uiw_m1,\n            m2 = uiw_m2,\n            m3 = uiw_m3;\n        m1.setRotationFromQuaternion(this.quaternion);\n        m1.transpose(m2);\n        m1.scale(I,m1);\n        m1.mmult(m2,this.invInertiaWorld);\n        //m3.getTrace(this.invInertiaWorld);\n    }\n\n    /*\n    this.quaternion.vmult(this.inertia,this.inertiaWorld);\n    this.quaternion.vmult(this.invInertia,this.invInertiaWorld);\n    */\n};\n\n/**\n * Apply force to a world point. This could for example be a point on the Body surface. Applying force this way will add to Body.force and Body.torque.\n * @method applyForce\n * @param  {Vec3} force The amount of force to add.\n * @param  {Vec3} worldPoint A world point to apply the force on.\n */\nvar Body_applyForce_r = new Vec3();\nvar Body_applyForce_rotForce = new Vec3();\nBody.prototype.applyForce = function(force,worldPoint){\n    if(this.type !== Body.DYNAMIC){\n        return;\n    }\n\n    // Compute point position relative to the body center\n    var r = Body_applyForce_r;\n    worldPoint.vsub(this.position,r);\n\n    // Compute produced rotational force\n    var rotForce = Body_applyForce_rotForce;\n    r.cross(force,rotForce);\n\n    // Add linear force\n    this.force.vadd(force,this.force);\n\n    // Add rotational force\n    this.torque.vadd(rotForce,this.torque);\n};\n\n/**\n * Apply force to a local point in the body.\n * @method applyLocalForce\n * @param  {Vec3} force The force vector to apply, defined locally in the body frame.\n * @param  {Vec3} localPoint A local point in the body to apply the force on.\n */\nvar Body_applyLocalForce_worldForce = new Vec3();\nvar Body_applyLocalForce_worldPoint = new Vec3();\nBody.prototype.applyLocalForce = function(localForce, localPoint){\n    if(this.type !== Body.DYNAMIC){\n        return;\n    }\n\n    var worldForce = Body_applyLocalForce_worldForce;\n    var worldPoint = Body_applyLocalForce_worldPoint;\n\n    // Transform the force vector to world space\n    this.vectorToWorldFrame(localForce, worldForce);\n    this.pointToWorldFrame(localPoint, worldPoint);\n\n    this.applyForce(worldForce, worldPoint);\n};\n\n/**\n * Apply impulse to a world point. This could for example be a point on the Body surface. An impulse is a force added to a body during a short period of time (impulse = force * time). Impulses will be added to Body.velocity and Body.angularVelocity.\n * @method applyImpulse\n * @param  {Vec3} impulse The amount of impulse to add.\n * @param  {Vec3} worldPoint A world point to apply the force on.\n */\nvar Body_applyImpulse_r = new Vec3();\nvar Body_applyImpulse_velo = new Vec3();\nvar Body_applyImpulse_rotVelo = new Vec3();\nBody.prototype.applyImpulse = function(impulse, worldPoint){\n    if(this.type !== Body.DYNAMIC){\n        return;\n    }\n\n    // Compute point position relative to the body center\n    var r = Body_applyImpulse_r;\n    worldPoint.vsub(this.position,r);\n\n    // Compute produced central impulse velocity\n    var velo = Body_applyImpulse_velo;\n    velo.copy(impulse);\n    velo.mult(this.invMass,velo);\n\n    // Add linear impulse\n    this.velocity.vadd(velo, this.velocity);\n\n    // Compute produced rotational impulse velocity\n    var rotVelo = Body_applyImpulse_rotVelo;\n    r.cross(impulse,rotVelo);\n\n    /*\n    rotVelo.x *= this.invInertia.x;\n    rotVelo.y *= this.invInertia.y;\n    rotVelo.z *= this.invInertia.z;\n    */\n    this.invInertiaWorld.vmult(rotVelo,rotVelo);\n\n    // Add rotational Impulse\n    this.angularVelocity.vadd(rotVelo, this.angularVelocity);\n};\n\n/**\n * Apply locally-defined impulse to a local point in the body.\n * @method applyLocalImpulse\n * @param  {Vec3} force The force vector to apply, defined locally in the body frame.\n * @param  {Vec3} localPoint A local point in the body to apply the force on.\n */\nvar Body_applyLocalImpulse_worldImpulse = new Vec3();\nvar Body_applyLocalImpulse_worldPoint = new Vec3();\nBody.prototype.applyLocalImpulse = function(localImpulse, localPoint){\n    if(this.type !== Body.DYNAMIC){\n        return;\n    }\n\n    var worldImpulse = Body_applyLocalImpulse_worldImpulse;\n    var worldPoint = Body_applyLocalImpulse_worldPoint;\n\n    // Transform the force vector to world space\n    this.vectorToWorldFrame(localImpulse, worldImpulse);\n    this.pointToWorldFrame(localPoint, worldPoint);\n\n    this.applyImpulse(worldImpulse, worldPoint);\n};\n\nvar Body_updateMassProperties_halfExtents = new Vec3();\n\n/**\n * Should be called whenever you change the body shape or mass.\n * @method updateMassProperties\n */\nBody.prototype.updateMassProperties = function(){\n    var halfExtents = Body_updateMassProperties_halfExtents;\n\n    this.invMass = this.mass > 0 ? 1.0 / this.mass : 0;\n    var I = this.inertia;\n    var fixed = this.fixedRotation;\n\n    // Approximate with AABB box\n    this.computeAABB();\n    halfExtents.set(\n        (this.aabb.upperBound.x-this.aabb.lowerBound.x) / 2,\n        (this.aabb.upperBound.y-this.aabb.lowerBound.y) / 2,\n        (this.aabb.upperBound.z-this.aabb.lowerBound.z) / 2\n    );\n    Box.calculateInertia(halfExtents, this.mass, I);\n\n    this.invInertia.set(\n        I.x > 0 && !fixed ? 1.0 / I.x : 0,\n        I.y > 0 && !fixed ? 1.0 / I.y : 0,\n        I.z > 0 && !fixed ? 1.0 / I.z : 0\n    );\n    this.updateInertiaWorld(true);\n};\n\n/**\n * Get world velocity of a point in the body.\n * @method getVelocityAtWorldPoint\n * @param  {Vec3} worldPoint\n * @param  {Vec3} result\n * @return {Vec3} The result vector.\n */\nBody.prototype.getVelocityAtWorldPoint = function(worldPoint, result){\n    var r = new Vec3();\n    worldPoint.vsub(this.position, r);\n    this.angularVelocity.cross(r, result);\n    this.velocity.vadd(result, result);\n    return result;\n};\n\n},{\"../collision/AABB\":3,\"../material/Material\":25,\"../math/Mat3\":27,\"../math/Quaternion\":28,\"../math/Vec3\":30,\"../shapes/Box\":37,\"../shapes/Shape\":43,\"../utils/EventTarget\":49}],32:[function(_dereq_,module,exports){\nvar Body = _dereq_('./Body');\nvar Vec3 = _dereq_('../math/Vec3');\nvar Quaternion = _dereq_('../math/Quaternion');\nvar RaycastResult = _dereq_('../collision/RaycastResult');\nvar Ray = _dereq_('../collision/Ray');\nvar WheelInfo = _dereq_('../objects/WheelInfo');\n\nmodule.exports = RaycastVehicle;\n\n/**\n * Vehicle helper class that casts rays from the wheel positions towards the ground and applies forces.\n * @class RaycastVehicle\n * @constructor\n * @param {object} [options]\n * @param {Body} [options.chassisBody] The car chassis body.\n * @param {integer} [options.indexRightAxis] Axis to use for right. x=0, y=1, z=2\n * @param {integer} [options.indexLeftAxis]\n * @param {integer} [options.indexUpAxis]\n */\nfunction RaycastVehicle(options){\n\n    /**\n     * @property {Body} chassisBody\n     */\n    this.chassisBody = options.chassisBody;\n\n    /**\n     * An array of WheelInfo objects.\n     * @property {array} wheelInfos\n     */\n    this.wheelInfos = [];\n\n    /**\n     * Will be set to true if the car is sliding.\n     * @property {boolean} sliding\n     */\n    this.sliding = false;\n\n    /**\n     * @property {World} world\n     */\n    this.world = null;\n\n    /**\n     * Index of the right axis, 0=x, 1=y, 2=z\n     * @property {integer} indexRightAxis\n     * @default 1\n     */\n    this.indexRightAxis = typeof(options.indexRightAxis) !== 'undefined' ? options.indexRightAxis : 1;\n\n    /**\n     * Index of the forward axis, 0=x, 1=y, 2=z\n     * @property {integer} indexForwardAxis\n     * @default 0\n     */\n    this.indexForwardAxis = typeof(options.indexForwardAxis) !== 'undefined' ? options.indexForwardAxis : 0;\n\n    /**\n     * Index of the up axis, 0=x, 1=y, 2=z\n     * @property {integer} indexUpAxis\n     * @default 2\n     */\n    this.indexUpAxis = typeof(options.indexUpAxis) !== 'undefined' ? options.indexUpAxis : 2;\n}\n\nvar tmpVec1 = new Vec3();\nvar tmpVec2 = new Vec3();\nvar tmpVec3 = new Vec3();\nvar tmpVec4 = new Vec3();\nvar tmpVec5 = new Vec3();\nvar tmpVec6 = new Vec3();\nvar tmpRay = new Ray();\n\n/**\n * Add a wheel. For information about the options, see WheelInfo.\n * @method addWheel\n * @param {object} [options]\n */\nRaycastVehicle.prototype.addWheel = function(options){\n    options = options || {};\n\n    var info = new WheelInfo(options);\n    var index = this.wheelInfos.length;\n    this.wheelInfos.push(info);\n\n    return index;\n};\n\n/**\n * Set the steering value of a wheel.\n * @method setSteeringValue\n * @param {number} value\n * @param {integer} wheelIndex\n */\nRaycastVehicle.prototype.setSteeringValue = function(value, wheelIndex){\n    var wheel = this.wheelInfos[wheelIndex];\n    wheel.steering = value;\n};\n\nvar torque = new Vec3();\n\n/**\n * Set the wheel force to apply on one of the wheels each time step\n * @method applyEngineForce\n * @param  {number} value\n * @param  {integer} wheelIndex\n */\nRaycastVehicle.prototype.applyEngineForce = function(value, wheelIndex){\n    this.wheelInfos[wheelIndex].engineForce = value;\n};\n\n/**\n * Set the braking force of a wheel\n * @method setBrake\n * @param {number} brake\n * @param {integer} wheelIndex\n */\nRaycastVehicle.prototype.setBrake = function(brake, wheelIndex){\n    this.wheelInfos[wheelIndex].brake = brake;\n};\n\n/**\n * Add the vehicle including its constraints to the world.\n * @method addToWorld\n * @param {World} world\n */\nRaycastVehicle.prototype.addToWorld = function(world){\n    var constraints = this.constraints;\n    world.add(this.chassisBody);\n    var that = this;\n    this.preStepCallback = function(){\n        that.updateVehicle(world.dt);\n    };\n    world.addEventListener('preStep', this.preStepCallback);\n    this.world = world;\n};\n\n/**\n * Get one of the wheel axles, world-oriented.\n * @private\n * @method getVehicleAxisWorld\n * @param  {integer} axisIndex\n * @param  {Vec3} result\n */\nRaycastVehicle.prototype.getVehicleAxisWorld = function(axisIndex, result){\n    result.set(\n        axisIndex === 0 ? 1 : 0,\n        axisIndex === 1 ? 1 : 0,\n        axisIndex === 2 ? 1 : 0\n    );\n    this.chassisBody.vectorToWorldFrame(result, result);\n};\n\nRaycastVehicle.prototype.updateVehicle = function(timeStep){\n    var wheelInfos = this.wheelInfos;\n    var numWheels = wheelInfos.length;\n    var chassisBody = this.chassisBody;\n\n    for (var i = 0; i < numWheels; i++) {\n        this.updateWheelTransform(i);\n    }\n\n    this.currentVehicleSpeedKmHour = 3.6 * chassisBody.velocity.norm();\n\n    var forwardWorld = new Vec3();\n    this.getVehicleAxisWorld(this.indexForwardAxis, forwardWorld);\n\n    if (forwardWorld.dot(chassisBody.velocity) < 0){\n        this.currentVehicleSpeedKmHour *= -1;\n    }\n\n    // simulate suspension\n    for (var i = 0; i < numWheels; i++) {\n        this.castRay(wheelInfos[i]);\n    }\n\n    this.updateSuspension(timeStep);\n\n    var impulse = new Vec3();\n    var relpos = new Vec3();\n    for (var i = 0; i < numWheels; i++) {\n        //apply suspension force\n        var wheel = wheelInfos[i];\n        var suspensionForce = wheel.suspensionForce;\n        if (suspensionForce > wheel.maxSuspensionForce) {\n            suspensionForce = wheel.maxSuspensionForce;\n        }\n        wheel.raycastResult.hitNormalWorld.scale(suspensionForce * timeStep, impulse);\n\n        wheel.raycastResult.hitPointWorld.vsub(chassisBody.position, relpos);\n        chassisBody.applyImpulse(impulse, wheel.raycastResult.hitPointWorld/*relpos*/);\n    }\n\n    this.updateFriction(timeStep);\n\n    var hitNormalWorldScaledWithProj = new Vec3();\n    var fwd  = new Vec3();\n    var vel = new Vec3();\n    for (i = 0; i < numWheels; i++) {\n        var wheel = wheelInfos[i];\n        //var relpos = new Vec3();\n        //wheel.chassisConnectionPointWorld.vsub(chassisBody.position, relpos);\n        chassisBody.getVelocityAtWorldPoint(wheel.chassisConnectionPointWorld, vel);\n\n        // Hack to get the rotation in the correct direction\n        var m = 1;\n        switch(this.indexUpAxis){\n        case 1:\n            m = -1;\n            break;\n        }\n\n        if (wheel.isInContact) {\n\n            this.getVehicleAxisWorld(this.indexForwardAxis, fwd);\n            var proj = fwd.dot(wheel.raycastResult.hitNormalWorld);\n            wheel.raycastResult.hitNormalWorld.scale(proj, hitNormalWorldScaledWithProj);\n\n            fwd.vsub(hitNormalWorldScaledWithProj, fwd);\n\n            var proj2 = fwd.dot(vel);\n            wheel.deltaRotation = m * proj2 * timeStep / wheel.radius;\n        }\n\n        if((wheel.sliding || !wheel.isInContact) && wheel.engineForce !== 0 && wheel.useCustomSlidingRotationalSpeed){\n            // Apply custom rotation when accelerating and sliding\n            wheel.deltaRotation = (wheel.engineForce > 0 ? 1 : -1) * wheel.customSlidingRotationalSpeed * timeStep;\n        }\n\n        // Lock wheels\n        if(Math.abs(wheel.brake) > Math.abs(wheel.engineForce)){\n            wheel.deltaRotation = 0;\n        }\n\n        wheel.rotation += wheel.deltaRotation; // Use the old value\n        wheel.deltaRotation *= 0.99; // damping of rotation when not in contact\n    }\n};\n\nRaycastVehicle.prototype.updateSuspension = function(deltaTime) {\n    var chassisBody = this.chassisBody;\n    var chassisMass = chassisBody.mass;\n    var wheelInfos = this.wheelInfos;\n    var numWheels = wheelInfos.length;\n\n    for (var w_it = 0; w_it < numWheels; w_it++){\n        var wheel = wheelInfos[w_it];\n\n        if (wheel.isInContact){\n            var force;\n\n            // Spring\n            var susp_length = wheel.suspensionRestLength;\n            var current_length = wheel.suspensionLength;\n            var length_diff = (susp_length - current_length);\n\n            force = wheel.suspensionStiffness * length_diff * wheel.clippedInvContactDotSuspension;\n\n            // Damper\n            var projected_rel_vel = wheel.suspensionRelativeVelocity;\n            var susp_damping;\n            if (projected_rel_vel < 0) {\n                susp_damping = wheel.dampingCompression;\n            } else {\n                susp_damping = wheel.dampingRelaxation;\n            }\n            force -= susp_damping * projected_rel_vel;\n\n            wheel.suspensionForce = force * chassisMass;\n            if (wheel.suspensionForce < 0) {\n                wheel.suspensionForce = 0;\n            }\n        } else {\n            wheel.suspensionForce = 0;\n        }\n    }\n};\n\n/**\n * Remove the vehicle including its constraints from the world.\n * @method removeFromWorld\n * @param {World} world\n */\nRaycastVehicle.prototype.removeFromWorld = function(world){\n    var constraints = this.constraints;\n    world.remove(this.chassisBody);\n    world.removeEventListener('preStep', this.preStepCallback);\n    this.world = null;\n};\n\nvar castRay_rayvector = new Vec3();\nvar castRay_target = new Vec3();\nRaycastVehicle.prototype.castRay = function(wheel) {\n    var rayvector = castRay_rayvector;\n    var target = castRay_target;\n\n    this.updateWheelTransformWorld(wheel);\n    var chassisBody = this.chassisBody;\n\n    var depth = -1;\n\n    var raylen = wheel.suspensionRestLength + wheel.radius;\n\n    wheel.directionWorld.scale(raylen, rayvector);\n    var source = wheel.chassisConnectionPointWorld;\n    source.vadd(rayvector, target);\n    var raycastResult = wheel.raycastResult;\n\n    var param = 0;\n\n    raycastResult.reset();\n    // Turn off ray collision with the chassis temporarily\n    var oldState = chassisBody.collisionResponse;\n    chassisBody.collisionResponse = false;\n\n    // Cast ray against world\n    this.world.rayTest(source, target, raycastResult);\n    chassisBody.collisionResponse = oldState;\n\n    var object = raycastResult.body;\n\n    wheel.raycastResult.groundObject = 0;\n\n    if (object) {\n        depth = raycastResult.distance;\n        wheel.raycastResult.hitNormalWorld  = raycastResult.hitNormalWorld;\n        wheel.isInContact = true;\n\n        var hitDistance = raycastResult.distance;\n        wheel.suspensionLength = hitDistance - wheel.radius;\n\n        // clamp on max suspension travel\n        var minSuspensionLength = wheel.suspensionRestLength - wheel.maxSuspensionTravel;\n        var maxSuspensionLength = wheel.suspensionRestLength + wheel.maxSuspensionTravel;\n        if (wheel.suspensionLength < minSuspensionLength) {\n            wheel.suspensionLength = minSuspensionLength;\n        }\n        if (wheel.suspensionLength > maxSuspensionLength) {\n            wheel.suspensionLength = maxSuspensionLength;\n            wheel.raycastResult.reset();\n        }\n\n        var denominator = wheel.raycastResult.hitNormalWorld.dot(wheel.directionWorld);\n\n        var chassis_velocity_at_contactPoint = new Vec3();\n        chassisBody.getVelocityAtWorldPoint(wheel.raycastResult.hitPointWorld, chassis_velocity_at_contactPoint);\n\n        var projVel = wheel.raycastResult.hitNormalWorld.dot( chassis_velocity_at_contactPoint );\n\n        if (denominator >= -0.1) {\n            wheel.suspensionRelativeVelocity = 0;\n            wheel.clippedInvContactDotSuspension = 1 / 0.1;\n        } else {\n            var inv = -1 / denominator;\n            wheel.suspensionRelativeVelocity = projVel * inv;\n            wheel.clippedInvContactDotSuspension = inv;\n        }\n\n    } else {\n\n        //put wheel info as in rest position\n        wheel.suspensionLength = wheel.suspensionRestLength + 0 * wheel.maxSuspensionTravel;\n        wheel.suspensionRelativeVelocity = 0.0;\n        wheel.directionWorld.scale(-1, wheel.raycastResult.hitNormalWorld);\n        wheel.clippedInvContactDotSuspension = 1.0;\n    }\n\n    return depth;\n};\n\nRaycastVehicle.prototype.updateWheelTransformWorld = function(wheel){\n    wheel.isInContact = false;\n    var chassisBody = this.chassisBody;\n    chassisBody.pointToWorldFrame(wheel.chassisConnectionPointLocal, wheel.chassisConnectionPointWorld);\n    chassisBody.vectorToWorldFrame(wheel.directionLocal, wheel.directionWorld);\n    chassisBody.vectorToWorldFrame(wheel.axleLocal, wheel.axleWorld);\n};\n\n\n/**\n * Update one of the wheel transform.\n * Note when rendering wheels: during each step, wheel transforms are updated BEFORE the chassis; ie. their position becomes invalid after the step. Thus when you render wheels, you must update wheel transforms before rendering them. See raycastVehicle demo for an example.\n * @method updateWheelTransform\n * @param {integer} wheelIndex The wheel index to update.\n */\nRaycastVehicle.prototype.updateWheelTransform = function(wheelIndex){\n    var up = tmpVec4;\n    var right = tmpVec5;\n    var fwd = tmpVec6;\n\n    var wheel = this.wheelInfos[wheelIndex];\n    this.updateWheelTransformWorld(wheel);\n\n    wheel.directionLocal.scale(-1, up);\n    right.copy(wheel.axleLocal);\n    up.cross(right, fwd);\n    fwd.normalize();\n    right.normalize();\n\n    // Rotate around steering over the wheelAxle\n    var steering = wheel.steering;\n    var steeringOrn = new Quaternion();\n    steeringOrn.setFromAxisAngle(up, steering);\n\n    var rotatingOrn = new Quaternion();\n    rotatingOrn.setFromAxisAngle(right, wheel.rotation);\n\n    // World rotation of the wheel\n    var q = wheel.worldTransform.quaternion;\n    this.chassisBody.quaternion.mult(steeringOrn, q);\n    q.mult(rotatingOrn, q);\n\n    q.normalize();\n\n    // world position of the wheel\n    var p = wheel.worldTransform.position;\n    p.copy(wheel.directionWorld);\n    p.scale(wheel.suspensionLength, p);\n    p.vadd(wheel.chassisConnectionPointWorld, p);\n};\n\nvar directions = [\n    new Vec3(1, 0, 0),\n    new Vec3(0, 1, 0),\n    new Vec3(0, 0, 1)\n];\n\n/**\n * Get the world transform of one of the wheels\n * @method getWheelTransformWorld\n * @param  {integer} wheelIndex\n * @return {Transform}\n */\nRaycastVehicle.prototype.getWheelTransformWorld = function(wheelIndex) {\n    return this.wheelInfos[wheelIndex].worldTransform;\n};\n\n\nvar updateFriction_surfNormalWS_scaled_proj = new Vec3();\nvar updateFriction_axle = [];\nvar updateFriction_forwardWS = [];\nvar sideFrictionStiffness2 = 1;\nRaycastVehicle.prototype.updateFriction = function(timeStep) {\n    var surfNormalWS_scaled_proj = updateFriction_surfNormalWS_scaled_proj;\n\n    //calculate the impulse, so that the wheels don't move sidewards\n    var wheelInfos = this.wheelInfos;\n    var numWheels = wheelInfos.length;\n    var chassisBody = this.chassisBody;\n    var forwardWS = updateFriction_forwardWS;\n    var axle = updateFriction_axle;\n\n    var numWheelsOnGround = 0;\n\n    for (var i = 0; i < numWheels; i++) {\n        var wheel = wheelInfos[i];\n\n        var groundObject = wheel.raycastResult.body;\n        if (groundObject){\n            numWheelsOnGround++;\n        }\n\n        wheel.sideImpulse = 0;\n        wheel.forwardImpulse = 0;\n        if(!forwardWS[i]){\n            forwardWS[i] = new Vec3();\n        }\n        if(!axle[i]){\n            axle[i] = new Vec3();\n        }\n    }\n\n    for (var i = 0; i < numWheels; i++){\n        var wheel = wheelInfos[i];\n\n        var groundObject = wheel.raycastResult.body;\n\n        if (groundObject) {\n            var axlei = axle[i];\n            var wheelTrans = this.getWheelTransformWorld(i);\n\n            // Get world axle\n            wheelTrans.vectorToWorldFrame(directions[this.indexRightAxis], axlei);\n\n            var surfNormalWS = wheel.raycastResult.hitNormalWorld;\n            var proj = axlei.dot(surfNormalWS);\n            surfNormalWS.scale(proj, surfNormalWS_scaled_proj);\n            axlei.vsub(surfNormalWS_scaled_proj, axlei);\n            axlei.normalize();\n\n            surfNormalWS.cross(axlei, forwardWS[i]);\n            forwardWS[i].normalize();\n\n            wheel.sideImpulse = resolveSingleBilateral(\n                chassisBody,\n                wheel.raycastResult.hitPointWorld,\n                groundObject,\n                wheel.raycastResult.hitPointWorld,\n                axlei\n            );\n\n            wheel.sideImpulse *= sideFrictionStiffness2;\n        }\n    }\n\n    var sideFactor = 1;\n    var fwdFactor = 0.5;\n\n    this.sliding = false;\n    for (var i = 0; i < numWheels; i++) {\n        var wheel = wheelInfos[i];\n        var groundObject = wheel.raycastResult.body;\n\n        var rollingFriction = 0;\n\n        wheel.slipInfo = 1;\n        if (groundObject) {\n            var defaultRollingFrictionImpulse = 0;\n            var maxImpulse = wheel.brake ? wheel.brake : defaultRollingFrictionImpulse;\n\n            // btWheelContactPoint contactPt(chassisBody,groundObject,wheelInfraycastInfo.hitPointWorld,forwardWS[wheel],maxImpulse);\n            // rollingFriction = calcRollingFriction(contactPt);\n            rollingFriction = calcRollingFriction(chassisBody, groundObject, wheel.raycastResult.hitPointWorld, forwardWS[i], maxImpulse);\n\n            rollingFriction += wheel.engineForce * timeStep;\n\n            // rollingFriction = 0;\n            var factor = maxImpulse / rollingFriction;\n            wheel.slipInfo *= factor;\n        }\n\n        //switch between active rolling (throttle), braking and non-active rolling friction (nthrottle/break)\n\n        wheel.forwardImpulse = 0;\n        wheel.skidInfo = 1;\n\n        if (groundObject) {\n            wheel.skidInfo = 1;\n\n            var maximp = wheel.suspensionForce * timeStep * wheel.frictionSlip;\n            var maximpSide = maximp;\n\n            var maximpSquared = maximp * maximpSide;\n\n            wheel.forwardImpulse = rollingFriction;//wheelInfo.engineForce* timeStep;\n\n            var x = wheel.forwardImpulse * fwdFactor;\n            var y = wheel.sideImpulse * sideFactor;\n\n            var impulseSquared = x * x + y * y;\n\n            wheel.sliding = false;\n            if (impulseSquared > maximpSquared) {\n                this.sliding = true;\n                wheel.sliding = true;\n\n                var factor = maximp / Math.sqrt(impulseSquared);\n\n                wheel.skidInfo *= factor;\n            }\n        }\n    }\n\n    if (this.sliding) {\n        for (var i = 0; i < numWheels; i++) {\n            var wheel = wheelInfos[i];\n            if (wheel.sideImpulse !== 0) {\n                if (wheel.skidInfo < 1){\n                    wheel.forwardImpulse *= wheel.skidInfo;\n                    wheel.sideImpulse *= wheel.skidInfo;\n                }\n            }\n        }\n    }\n\n    // apply the impulses\n    for (var i = 0; i < numWheels; i++) {\n        var wheel = wheelInfos[i];\n\n        var rel_pos = new Vec3();\n        //wheel.raycastResult.hitPointWorld.vsub(chassisBody.position, rel_pos);\n        // cannons applyimpulse is using world coord for the position\n        rel_pos.copy(wheel.raycastResult.hitPointWorld);\n\n        if (wheel.forwardImpulse !== 0) {\n            var impulse = new Vec3();\n            forwardWS[i].scale(wheel.forwardImpulse, impulse);\n            chassisBody.applyImpulse(impulse, rel_pos);\n        }\n\n        if (wheel.sideImpulse !== 0){\n            var groundObject = wheel.raycastResult.body;\n\n            var rel_pos2 = new Vec3();\n            //wheel.raycastResult.hitPointWorld.vsub(groundObject.position, rel_pos2);\n            rel_pos2.copy(wheel.raycastResult.hitPointWorld);\n            var sideImp = new Vec3();\n            axle[i].scale(wheel.sideImpulse, sideImp);\n\n            // Scale the relative position in the up direction with rollInfluence.\n            // If rollInfluence is 1, the impulse will be applied on the hitPoint (easy to roll over), if it is zero it will be applied in the same plane as the center of mass (not easy to roll over).\n            chassisBody.pointToLocalFrame(rel_pos, rel_pos);\n            rel_pos['xyz'[this.indexUpAxis]] *= wheel.rollInfluence;\n            chassisBody.pointToWorldFrame(rel_pos, rel_pos);\n            chassisBody.applyImpulse(sideImp, rel_pos);\n\n            //apply friction impulse on the ground\n            sideImp.scale(-1, sideImp);\n            groundObject.applyImpulse(sideImp, rel_pos2);\n        }\n    }\n};\n\nvar calcRollingFriction_vel1 = new Vec3();\nvar calcRollingFriction_vel2 = new Vec3();\nvar calcRollingFriction_vel = new Vec3();\n\nfunction calcRollingFriction(body0, body1, frictionPosWorld, frictionDirectionWorld, maxImpulse) {\n    var j1 = 0;\n    var contactPosWorld = frictionPosWorld;\n\n    // var rel_pos1 = new Vec3();\n    // var rel_pos2 = new Vec3();\n    var vel1 = calcRollingFriction_vel1;\n    var vel2 = calcRollingFriction_vel2;\n    var vel = calcRollingFriction_vel;\n    // contactPosWorld.vsub(body0.position, rel_pos1);\n    // contactPosWorld.vsub(body1.position, rel_pos2);\n\n    body0.getVelocityAtWorldPoint(contactPosWorld, vel1);\n    body1.getVelocityAtWorldPoint(contactPosWorld, vel2);\n    vel1.vsub(vel2, vel);\n\n    var vrel = frictionDirectionWorld.dot(vel);\n\n    var denom0 = computeImpulseDenominator(body0, frictionPosWorld, frictionDirectionWorld);\n    var denom1 = computeImpulseDenominator(body1, frictionPosWorld, frictionDirectionWorld);\n    var relaxation = 1;\n    var jacDiagABInv = relaxation / (denom0 + denom1);\n\n    // calculate j that moves us to zero relative velocity\n    j1 = -vrel * jacDiagABInv;\n\n    if (maxImpulse < j1) {\n        j1 = maxImpulse;\n    }\n    if (j1 < -maxImpulse) {\n        j1 = -maxImpulse;\n    }\n\n    return j1;\n}\n\nvar computeImpulseDenominator_r0 = new Vec3();\nvar computeImpulseDenominator_c0 = new Vec3();\nvar computeImpulseDenominator_vec = new Vec3();\nvar computeImpulseDenominator_m = new Vec3();\nfunction computeImpulseDenominator(body, pos, normal) {\n    var r0 = computeImpulseDenominator_r0;\n    var c0 = computeImpulseDenominator_c0;\n    var vec = computeImpulseDenominator_vec;\n    var m = computeImpulseDenominator_m;\n\n    pos.vsub(body.position, r0);\n    r0.cross(normal, c0);\n    body.invInertiaWorld.vmult(c0, m);\n    m.cross(r0, vec);\n\n    return body.invMass + normal.dot(vec);\n}\n\n\nvar resolveSingleBilateral_vel1 = new Vec3();\nvar resolveSingleBilateral_vel2 = new Vec3();\nvar resolveSingleBilateral_vel = new Vec3();\n\n//bilateral constraint between two dynamic objects\nfunction resolveSingleBilateral(body1, pos1, body2, pos2, normal, impulse){\n    var normalLenSqr = normal.norm2();\n    if (normalLenSqr > 1.1){\n        return 0; // no impulse\n    }\n    // var rel_pos1 = new Vec3();\n    // var rel_pos2 = new Vec3();\n    // pos1.vsub(body1.position, rel_pos1);\n    // pos2.vsub(body2.position, rel_pos2);\n\n    var vel1 = resolveSingleBilateral_vel1;\n    var vel2 = resolveSingleBilateral_vel2;\n    var vel = resolveSingleBilateral_vel;\n    body1.getVelocityAtWorldPoint(pos1, vel1);\n    body2.getVelocityAtWorldPoint(pos2, vel2);\n\n    vel1.vsub(vel2, vel);\n\n    var rel_vel = normal.dot(vel);\n\n    var contactDamping = 0.2;\n    var massTerm = 1 / (body1.invMass + body2.invMass);\n    var impulse = - contactDamping * rel_vel * massTerm;\n\n    return impulse;\n}\n},{\"../collision/Ray\":9,\"../collision/RaycastResult\":10,\"../math/Quaternion\":28,\"../math/Vec3\":30,\"../objects/WheelInfo\":36,\"./Body\":31}],33:[function(_dereq_,module,exports){\nvar Body = _dereq_('./Body');\nvar Sphere = _dereq_('../shapes/Sphere');\nvar Box = _dereq_('../shapes/Box');\nvar Vec3 = _dereq_('../math/Vec3');\nvar HingeConstraint = _dereq_('../constraints/HingeConstraint');\n\nmodule.exports = RigidVehicle;\n\n/**\n * Simple vehicle helper class with spherical rigid body wheels.\n * @class RigidVehicle\n * @constructor\n * @param {Body} [options.chassisBody]\n */\nfunction RigidVehicle(options){\n    this.wheelBodies = [];\n\n    /**\n     * @property coordinateSystem\n     * @type {Vec3}\n     */\n    this.coordinateSystem = typeof(options.coordinateSystem)==='undefined' ? new Vec3(1, 2, 3) : options.coordinateSystem.clone();\n\n    /**\n     * @property {Body} chassisBody\n     */\n    this.chassisBody = options.chassisBody;\n\n    if(!this.chassisBody){\n        // No chassis body given. Create it!\n        var chassisShape = new Box(new Vec3(5, 2, 0.5));\n        this.chassisBody = new Body(1, chassisShape);\n    }\n\n    /**\n     * @property constraints\n     * @type {Array}\n     */\n    this.constraints = [];\n\n    this.wheelAxes = [];\n    this.wheelForces = [];\n}\n\n/**\n * Add a wheel\n * @method addWheel\n * @param {object} options\n * @param {boolean} [options.isFrontWheel]\n * @param {Vec3} [options.position] Position of the wheel, locally in the chassis body.\n * @param {Vec3} [options.direction] Slide direction of the wheel along the suspension.\n * @param {Vec3} [options.axis] Axis of rotation of the wheel, locally defined in the chassis.\n * @param {Body} [options.body] The wheel body.\n */\nRigidVehicle.prototype.addWheel = function(options){\n    options = options || {};\n    var wheelBody = options.body;\n    if(!wheelBody){\n        wheelBody =  new Body(1, new Sphere(1.2));\n    }\n    this.wheelBodies.push(wheelBody);\n    this.wheelForces.push(0);\n\n    // Position constrain wheels\n    var zero = new Vec3();\n    var position = typeof(options.position) !== 'undefined' ? options.position.clone() : new Vec3();\n\n    // Set position locally to the chassis\n    var worldPosition = new Vec3();\n    this.chassisBody.pointToWorldFrame(position, worldPosition);\n    wheelBody.position.set(worldPosition.x, worldPosition.y, worldPosition.z);\n\n    // Constrain wheel\n    var axis = typeof(options.axis) !== 'undefined' ? options.axis.clone() : new Vec3(0, 1, 0);\n    this.wheelAxes.push(axis);\n\n    var hingeConstraint = new HingeConstraint(this.chassisBody, wheelBody, {\n        pivotA: position,\n        axisA: axis,\n        pivotB: Vec3.ZERO,\n        axisB: axis,\n        collideConnected: false\n    });\n    this.constraints.push(hingeConstraint);\n\n    return this.wheelBodies.length - 1;\n};\n\n/**\n * Set the steering value of a wheel.\n * @method setSteeringValue\n * @param {number} value\n * @param {integer} wheelIndex\n * @todo check coordinateSystem\n */\nRigidVehicle.prototype.setSteeringValue = function(value, wheelIndex){\n    // Set angle of the hinge axis\n    var axis = this.wheelAxes[wheelIndex];\n\n    var c = Math.cos(value),\n        s = Math.sin(value),\n        x = axis.x,\n        y = axis.y;\n    this.constraints[wheelIndex].axisA.set(\n        c*x -s*y,\n        s*x +c*y,\n        0\n    );\n};\n\n/**\n * Set the target rotational speed of the hinge constraint.\n * @method setMotorSpeed\n * @param {number} value\n * @param {integer} wheelIndex\n */\nRigidVehicle.prototype.setMotorSpeed = function(value, wheelIndex){\n    var hingeConstraint = this.constraints[wheelIndex];\n    hingeConstraint.enableMotor();\n    hingeConstraint.motorTargetVelocity = value;\n};\n\n/**\n * Set the target rotational speed of the hinge constraint.\n * @method disableMotor\n * @param {number} value\n * @param {integer} wheelIndex\n */\nRigidVehicle.prototype.disableMotor = function(wheelIndex){\n    var hingeConstraint = this.constraints[wheelIndex];\n    hingeConstraint.disableMotor();\n};\n\nvar torque = new Vec3();\n\n/**\n * Set the wheel force to apply on one of the wheels each time step\n * @method setWheelForce\n * @param  {number} value\n * @param  {integer} wheelIndex\n */\nRigidVehicle.prototype.setWheelForce = function(value, wheelIndex){\n    this.wheelForces[wheelIndex] = value;\n};\n\n/**\n * Apply a torque on one of the wheels.\n * @method applyWheelForce\n * @param  {number} value\n * @param  {integer} wheelIndex\n */\nRigidVehicle.prototype.applyWheelForce = function(value, wheelIndex){\n    var axis = this.wheelAxes[wheelIndex];\n    var wheelBody = this.wheelBodies[wheelIndex];\n    var bodyTorque = wheelBody.torque;\n\n    axis.scale(value, torque);\n    wheelBody.vectorToWorldFrame(torque, torque);\n    bodyTorque.vadd(torque, bodyTorque);\n};\n\n/**\n * Add the vehicle including its constraints to the world.\n * @method addToWorld\n * @param {World} world\n */\nRigidVehicle.prototype.addToWorld = function(world){\n    var constraints = this.constraints;\n    var bodies = this.wheelBodies.concat([this.chassisBody]);\n\n    for (var i = 0; i < bodies.length; i++) {\n        world.add(bodies[i]);\n    }\n\n    for (var i = 0; i < constraints.length; i++) {\n        world.addConstraint(constraints[i]);\n    }\n\n    world.addEventListener('preStep', this._update.bind(this));\n};\n\nRigidVehicle.prototype._update = function(){\n    var wheelForces = this.wheelForces;\n    for (var i = 0; i < wheelForces.length; i++) {\n        this.applyWheelForce(wheelForces[i], i);\n    }\n};\n\n/**\n * Remove the vehicle including its constraints from the world.\n * @method removeFromWorld\n * @param {World} world\n */\nRigidVehicle.prototype.removeFromWorld = function(world){\n    var constraints = this.constraints;\n    var bodies = this.wheelBodies.concat([this.chassisBody]);\n\n    for (var i = 0; i < bodies.length; i++) {\n        world.remove(bodies[i]);\n    }\n\n    for (var i = 0; i < constraints.length; i++) {\n        world.removeConstraint(constraints[i]);\n    }\n};\n\nvar worldAxis = new Vec3();\n\n/**\n * Get current rotational velocity of a wheel\n * @method getWheelSpeed\n * @param {integer} wheelIndex\n */\nRigidVehicle.prototype.getWheelSpeed = function(wheelIndex){\n    var axis = this.wheelAxes[wheelIndex];\n    var wheelBody = this.wheelBodies[wheelIndex];\n    var w = wheelBody.angularVelocity;\n    this.chassisBody.vectorToWorldFrame(axis, worldAxis);\n    return w.dot(worldAxis);\n};\n\n},{\"../constraints/HingeConstraint\":15,\"../math/Vec3\":30,\"../shapes/Box\":37,\"../shapes/Sphere\":44,\"./Body\":31}],34:[function(_dereq_,module,exports){\nmodule.exports = SPHSystem;\n\nvar Shape = _dereq_('../shapes/Shape');\nvar Vec3 = _dereq_('../math/Vec3');\nvar Quaternion = _dereq_('../math/Quaternion');\nvar Particle = _dereq_('../shapes/Particle');\nvar Body = _dereq_('../objects/Body');\nvar Material = _dereq_('../material/Material');\n\n/**\n * Smoothed-particle hydrodynamics system\n * @class SPHSystem\n * @constructor\n */\nfunction SPHSystem(){\n    this.particles = [];\n\t\n    /**\n     * Density of the system (kg/m3).\n     * @property {number} density\n     */\n    this.density = 1;\n\t\n    /**\n     * Distance below which two particles are considered to be neighbors.\n     * It should be adjusted so there are about 15-20 neighbor particles within this radius.\n     * @property {number} smoothingRadius\n     */\n    this.smoothingRadius = 1;\n    this.speedOfSound = 1;\n\t\n    /**\n     * Viscosity of the system.\n     * @property {number} viscosity\n     */\n    this.viscosity = 0.01;\n    this.eps = 0.000001;\n\n    // Stuff Computed per particle\n    this.pressures = [];\n    this.densities = [];\n    this.neighbors = [];\n}\n\n/**\n * Add a particle to the system.\n * @method add\n * @param {Body} particle\n */\nSPHSystem.prototype.add = function(particle){\n    this.particles.push(particle);\n    if(this.neighbors.length < this.particles.length){\n        this.neighbors.push([]);\n    }\n};\n\n/**\n * Remove a particle from the system.\n * @method remove\n * @param {Body} particle\n */\nSPHSystem.prototype.remove = function(particle){\n    var idx = this.particles.indexOf(particle);\n    if(idx !== -1){\n        this.particles.splice(idx,1);\n        if(this.neighbors.length > this.particles.length){\n            this.neighbors.pop();\n        }\n    }\n};\n\n/**\n * Get neighbors within smoothing volume, save in the array neighbors\n * @method getNeighbors\n * @param {Body} particle\n * @param {Array} neighbors\n */\nvar SPHSystem_getNeighbors_dist = new Vec3();\nSPHSystem.prototype.getNeighbors = function(particle,neighbors){\n    var N = this.particles.length,\n        id = particle.id,\n        R2 = this.smoothingRadius * this.smoothingRadius,\n        dist = SPHSystem_getNeighbors_dist;\n    for(var i=0; i!==N; i++){\n        var p = this.particles[i];\n        p.position.vsub(particle.position,dist);\n        if(id!==p.id && dist.norm2() < R2){\n            neighbors.push(p);\n        }\n    }\n};\n\n// Temp vectors for calculation\nvar SPHSystem_update_dist = new Vec3(),\n    SPHSystem_update_a_pressure = new Vec3(),\n    SPHSystem_update_a_visc = new Vec3(),\n    SPHSystem_update_gradW = new Vec3(),\n    SPHSystem_update_r_vec = new Vec3(),\n    SPHSystem_update_u = new Vec3(); // Relative velocity\nSPHSystem.prototype.update = function(){\n    var N = this.particles.length,\n        dist = SPHSystem_update_dist,\n        cs = this.speedOfSound,\n        eps = this.eps;\n\n    for(var i=0; i!==N; i++){\n        var p = this.particles[i]; // Current particle\n        var neighbors = this.neighbors[i];\n\n        // Get neighbors\n        neighbors.length = 0;\n        this.getNeighbors(p,neighbors);\n        neighbors.push(this.particles[i]); // Add current too\n        var numNeighbors = neighbors.length;\n\n        // Accumulate density for the particle\n        var sum = 0.0;\n        for(var j=0; j!==numNeighbors; j++){\n\n            //printf(\"Current particle has position %f %f %f\\n\",objects[id].pos.x(),objects[id].pos.y(),objects[id].pos.z());\n            p.position.vsub(neighbors[j].position, dist);\n            var len = dist.norm();\n\n            var weight = this.w(len);\n            sum += neighbors[j].mass * weight;\n        }\n\n        // Save\n        this.densities[i] = sum;\n        this.pressures[i] = cs * cs * (this.densities[i] - this.density);\n    }\n\n    // Add forces\n\n    // Sum to these accelerations\n    var a_pressure= SPHSystem_update_a_pressure;\n    var a_visc =    SPHSystem_update_a_visc;\n    var gradW =     SPHSystem_update_gradW;\n    var r_vec =     SPHSystem_update_r_vec;\n    var u =         SPHSystem_update_u;\n\n    for(var i=0; i!==N; i++){\n\n        var particle = this.particles[i];\n\n        a_pressure.set(0,0,0);\n        a_visc.set(0,0,0);\n\n        // Init vars\n        var Pij;\n        var nabla;\n        var Vij;\n\n        // Sum up for all other neighbors\n        var neighbors = this.neighbors[i];\n        var numNeighbors = neighbors.length;\n\n        //printf(\"Neighbors: \");\n        for(var j=0; j!==numNeighbors; j++){\n\n            var neighbor = neighbors[j];\n            //printf(\"%d \",nj);\n\n            // Get r once for all..\n            particle.position.vsub(neighbor.position,r_vec);\n            var r = r_vec.norm();\n\n            // Pressure contribution\n            Pij = -neighbor.mass * (this.pressures[i] / (this.densities[i]*this.densities[i] + eps) + this.pressures[j] / (this.densities[j]*this.densities[j] + eps));\n            this.gradw(r_vec, gradW);\n            // Add to pressure acceleration\n            gradW.mult(Pij , gradW);\n            a_pressure.vadd(gradW, a_pressure);\n\n            // Viscosity contribution\n            neighbor.velocity.vsub(particle.velocity, u);\n            u.mult( 1.0 / (0.0001+this.densities[i] * this.densities[j]) * this.viscosity * neighbor.mass , u );\n            nabla = this.nablaw(r);\n            u.mult(nabla,u);\n            // Add to viscosity acceleration\n            a_visc.vadd( u, a_visc );\n        }\n\n        // Calculate force\n        a_visc.mult(particle.mass, a_visc);\n        a_pressure.mult(particle.mass, a_pressure);\n\n        // Add force to particles\n        particle.force.vadd(a_visc, particle.force);\n        particle.force.vadd(a_pressure, particle.force);\n    }\n};\n\n// Calculate the weight using the W(r) weightfunction\nSPHSystem.prototype.w = function(r){\n    // 315\n    var h = this.smoothingRadius;\n    return 315.0/(64.0*Math.PI*Math.pow(h,9)) * Math.pow(h*h-r*r,3);\n};\n\n// calculate gradient of the weight function\nSPHSystem.prototype.gradw = function(rVec,resultVec){\n    var r = rVec.norm(),\n        h = this.smoothingRadius;\n    rVec.mult(945.0/(32.0*Math.PI*Math.pow(h,9)) * Math.pow((h*h-r*r),2) , resultVec);\n};\n\n// Calculate nabla(W)\nSPHSystem.prototype.nablaw = function(r){\n    var h = this.smoothingRadius;\n    var nabla = 945.0/(32.0*Math.PI*Math.pow(h,9)) * (h*h-r*r)*(7*r*r - 3*h*h);\n    return nabla;\n};\n\n},{\"../material/Material\":25,\"../math/Quaternion\":28,\"../math/Vec3\":30,\"../objects/Body\":31,\"../shapes/Particle\":41,\"../shapes/Shape\":43}],35:[function(_dereq_,module,exports){\nvar Vec3 = _dereq_('../math/Vec3');\n\nmodule.exports = Spring;\n\n/**\n * A spring, connecting two bodies.\n *\n * @class Spring\n * @constructor\n * @param {Body} bodyA\n * @param {Body} bodyB\n * @param {Object} [options]\n * @param {number} [options.restLength]   A number > 0. Default: 1\n * @param {number} [options.stiffness]    A number >= 0. Default: 100\n * @param {number} [options.damping]      A number >= 0. Default: 1\n * @param {Vec3}  [options.worldAnchorA] Where to hook the spring to body A, in world coordinates.\n * @param {Vec3}  [options.worldAnchorB]\n * @param {Vec3}  [options.localAnchorA] Where to hook the spring to body A, in local body coordinates.\n * @param {Vec3}  [options.localAnchorB]\n */\nfunction Spring(bodyA,bodyB,options){\n    options = options || {};\n\n    /**\n     * Rest length of the spring.\n     * @property restLength\n     * @type {number}\n     */\n    this.restLength = typeof(options.restLength) === \"number\" ? options.restLength : 1;\n\n    /**\n     * Stiffness of the spring.\n     * @property stiffness\n     * @type {number}\n     */\n    this.stiffness = options.stiffness || 100;\n\n    /**\n     * Damping of the spring.\n     * @property damping\n     * @type {number}\n     */\n    this.damping = options.damping || 1;\n\n    /**\n     * First connected body.\n     * @property bodyA\n     * @type {Body}\n     */\n    this.bodyA = bodyA;\n\n    /**\n     * Second connected body.\n     * @property bodyB\n     * @type {Body}\n     */\n    this.bodyB = bodyB;\n\n    /**\n     * Anchor for bodyA in local bodyA coordinates.\n     * @property localAnchorA\n     * @type {Vec3}\n     */\n    this.localAnchorA = new Vec3();\n\n    /**\n     * Anchor for bodyB in local bodyB coordinates.\n     * @property localAnchorB\n     * @type {Vec3}\n     */\n    this.localAnchorB = new Vec3();\n\n    if(options.localAnchorA){\n        this.localAnchorA.copy(options.localAnchorA);\n    }\n    if(options.localAnchorB){\n        this.localAnchorB.copy(options.localAnchorB);\n    }\n    if(options.worldAnchorA){\n        this.setWorldAnchorA(options.worldAnchorA);\n    }\n    if(options.worldAnchorB){\n        this.setWorldAnchorB(options.worldAnchorB);\n    }\n}\n\n/**\n * Set the anchor point on body A, using world coordinates.\n * @method setWorldAnchorA\n * @param {Vec3} worldAnchorA\n */\nSpring.prototype.setWorldAnchorA = function(worldAnchorA){\n    this.bodyA.pointToLocalFrame(worldAnchorA,this.localAnchorA);\n};\n\n/**\n * Set the anchor point on body B, using world coordinates.\n * @method setWorldAnchorB\n * @param {Vec3} worldAnchorB\n */\nSpring.prototype.setWorldAnchorB = function(worldAnchorB){\n    this.bodyB.pointToLocalFrame(worldAnchorB,this.localAnchorB);\n};\n\n/**\n * Get the anchor point on body A, in world coordinates.\n * @method getWorldAnchorA\n * @param {Vec3} result The vector to store the result in.\n */\nSpring.prototype.getWorldAnchorA = function(result){\n    this.bodyA.pointToWorldFrame(this.localAnchorA,result);\n};\n\n/**\n * Get the anchor point on body B, in world coordinates.\n * @method getWorldAnchorB\n * @param {Vec3} result The vector to store the result in.\n */\nSpring.prototype.getWorldAnchorB = function(result){\n    this.bodyB.pointToWorldFrame(this.localAnchorB,result);\n};\n\nvar applyForce_r =              new Vec3(),\n    applyForce_r_unit =         new Vec3(),\n    applyForce_u =              new Vec3(),\n    applyForce_f =              new Vec3(),\n    applyForce_worldAnchorA =   new Vec3(),\n    applyForce_worldAnchorB =   new Vec3(),\n    applyForce_ri =             new Vec3(),\n    applyForce_rj =             new Vec3(),\n    applyForce_ri_x_f =         new Vec3(),\n    applyForce_rj_x_f =         new Vec3(),\n    applyForce_tmp =            new Vec3();\n\n/**\n * Apply the spring force to the connected bodies.\n * @method applyForce\n */\nSpring.prototype.applyForce = function(){\n    var k = this.stiffness,\n        d = this.damping,\n        l = this.restLength,\n        bodyA = this.bodyA,\n        bodyB = this.bodyB,\n        r = applyForce_r,\n        r_unit = applyForce_r_unit,\n        u = applyForce_u,\n        f = applyForce_f,\n        tmp = applyForce_tmp;\n\n    var worldAnchorA = applyForce_worldAnchorA,\n        worldAnchorB = applyForce_worldAnchorB,\n        ri = applyForce_ri,\n        rj = applyForce_rj,\n        ri_x_f = applyForce_ri_x_f,\n        rj_x_f = applyForce_rj_x_f;\n\n    // Get world anchors\n    this.getWorldAnchorA(worldAnchorA);\n    this.getWorldAnchorB(worldAnchorB);\n\n    // Get offset points\n    worldAnchorA.vsub(bodyA.position,ri);\n    worldAnchorB.vsub(bodyB.position,rj);\n\n    // Compute distance vector between world anchor points\n    worldAnchorB.vsub(worldAnchorA,r);\n    var rlen = r.norm();\n    r_unit.copy(r);\n    r_unit.normalize();\n\n    // Compute relative velocity of the anchor points, u\n    bodyB.velocity.vsub(bodyA.velocity,u);\n    // Add rotational velocity\n\n    bodyB.angularVelocity.cross(rj,tmp);\n    u.vadd(tmp,u);\n    bodyA.angularVelocity.cross(ri,tmp);\n    u.vsub(tmp,u);\n\n    // F = - k * ( x - L ) - D * ( u )\n    r_unit.mult(-k*(rlen-l) - d*u.dot(r_unit), f);\n\n    // Add forces to bodies\n    bodyA.force.vsub(f,bodyA.force);\n    bodyB.force.vadd(f,bodyB.force);\n\n    // Angular force\n    ri.cross(f,ri_x_f);\n    rj.cross(f,rj_x_f);\n    bodyA.torque.vsub(ri_x_f,bodyA.torque);\n    bodyB.torque.vadd(rj_x_f,bodyB.torque);\n};\n\n},{\"../math/Vec3\":30}],36:[function(_dereq_,module,exports){\nvar Vec3 = _dereq_('../math/Vec3');\nvar Transform = _dereq_('../math/Transform');\nvar RaycastResult = _dereq_('../collision/RaycastResult');\nvar Utils = _dereq_('../utils/Utils');\n\nmodule.exports = WheelInfo;\n\n/**\n * @class WheelInfo\n * @constructor\n * @param {Object} [options]\n *\n * @param {Vec3} [options.chassisConnectionPointLocal]\n * @param {Vec3} [options.chassisConnectionPointWorld]\n * @param {Vec3} [options.directionLocal]\n * @param {Vec3} [options.directionWorld]\n * @param {Vec3} [options.axleLocal]\n * @param {Vec3} [options.axleWorld]\n * @param {number} [options.suspensionRestLength=1]\n * @param {number} [options.suspensionMaxLength=2]\n * @param {number} [options.radius=1]\n * @param {number} [options.suspensionStiffness=100]\n * @param {number} [options.dampingCompression=10]\n * @param {number} [options.dampingRelaxation=10]\n * @param {number} [options.frictionSlip=10000]\n * @param {number} [options.steering=0]\n * @param {number} [options.rotation=0]\n * @param {number} [options.deltaRotation=0]\n * @param {number} [options.rollInfluence=0.01]\n * @param {number} [options.maxSuspensionForce]\n * @param {boolean} [options.isFrontWheel=true]\n * @param {number} [options.clippedInvContactDotSuspension=1]\n * @param {number} [options.suspensionRelativeVelocity=0]\n * @param {number} [options.suspensionForce=0]\n * @param {number} [options.skidInfo=0]\n * @param {number} [options.suspensionLength=0]\n * @param {number} [options.maxSuspensionTravel=1]\n * @param {boolean} [options.useCustomSlidingRotationalSpeed=false]\n * @param {number} [options.customSlidingRotationalSpeed=-0.1]\n */\nfunction WheelInfo(options){\n    options = Utils.defaults(options, {\n        chassisConnectionPointLocal: new Vec3(),\n        chassisConnectionPointWorld: new Vec3(),\n        directionLocal: new Vec3(),\n        directionWorld: new Vec3(),\n        axleLocal: new Vec3(),\n        axleWorld: new Vec3(),\n        suspensionRestLength: 1,\n        suspensionMaxLength: 2,\n        radius: 1,\n        suspensionStiffness: 100,\n        dampingCompression: 10,\n        dampingRelaxation: 10,\n        frictionSlip: 10000,\n        steering: 0,\n        rotation: 0,\n        deltaRotation: 0,\n        rollInfluence: 0.01,\n        maxSuspensionForce: Number.MAX_VALUE,\n        isFrontWheel: true,\n        clippedInvContactDotSuspension: 1,\n        suspensionRelativeVelocity: 0,\n        suspensionForce: 0,\n        skidInfo: 0,\n        suspensionLength: 0,\n        maxSuspensionTravel: 1,\n        useCustomSlidingRotationalSpeed: false,\n        customSlidingRotationalSpeed: -0.1\n    });\n\n    /**\n     * Max travel distance of the suspension, in meters.\n     * @property {number} maxSuspensionTravel\n     */\n    this.maxSuspensionTravel = options.maxSuspensionTravel;\n\n    /**\n     * Speed to apply to the wheel rotation when the wheel is sliding.\n     * @property {number} customSlidingRotationalSpeed\n     */\n    this.customSlidingRotationalSpeed = options.customSlidingRotationalSpeed;\n\n    /**\n     * If the customSlidingRotationalSpeed should be used.\n     * @property {Boolean} useCustomSlidingRotationalSpeed\n     */\n    this.useCustomSlidingRotationalSpeed = options.useCustomSlidingRotationalSpeed;\n\n    /**\n     * @property {Boolean} sliding\n     */\n    this.sliding = false;\n\n    /**\n     * Connection point, defined locally in the chassis body frame.\n     * @property {Vec3} chassisConnectionPointLocal\n     */\n    this.chassisConnectionPointLocal = options.chassisConnectionPointLocal.clone();\n\n    /**\n     * @property {Vec3} chassisConnectionPointWorld\n     */\n    this.chassisConnectionPointWorld = options.chassisConnectionPointWorld.clone();\n\n    /**\n     * @property {Vec3} directionLocal\n     */\n    this.directionLocal = options.directionLocal.clone();\n\n    /**\n     * @property {Vec3} directionWorld\n     */\n    this.directionWorld = options.directionWorld.clone();\n\n    /**\n     * @property {Vec3} axleLocal\n     */\n    this.axleLocal = options.axleLocal.clone();\n\n    /**\n     * @property {Vec3} axleWorld\n     */\n    this.axleWorld = options.axleWorld.clone();\n\n    /**\n     * @property {number} suspensionRestLength\n     */\n    this.suspensionRestLength = options.suspensionRestLength;\n\n    /**\n     * @property {number} suspensionMaxLength\n     */\n    this.suspensionMaxLength = options.suspensionMaxLength;\n\n    /**\n     * @property {number} radius\n     */\n    this.radius = options.radius;\n\n    /**\n     * @property {number} suspensionStiffness\n     */\n    this.suspensionStiffness = options.suspensionStiffness;\n\n    /**\n     * @property {number} dampingCompression\n     */\n    this.dampingCompression = options.dampingCompression;\n\n    /**\n     * @property {number} dampingRelaxation\n     */\n    this.dampingRelaxation = options.dampingRelaxation;\n\n    /**\n     * @property {number} frictionSlip\n     */\n    this.frictionSlip = options.frictionSlip;\n\n    /**\n     * @property {number} steering\n     */\n    this.steering = 0;\n\n    /**\n     * Rotation value, in radians.\n     * @property {number} rotation\n     */\n    this.rotation = 0;\n\n    /**\n     * @property {number} deltaRotation\n     */\n    this.deltaRotation = 0;\n\n    /**\n     * @property {number} rollInfluence\n     */\n    this.rollInfluence = options.rollInfluence;\n\n    /**\n     * @property {number} maxSuspensionForce\n     */\n    this.maxSuspensionForce = options.maxSuspensionForce;\n\n    /**\n     * @property {number} engineForce\n     */\n    this.engineForce = 0;\n\n    /**\n     * @property {number} brake\n     */\n    this.brake = 0;\n\n    /**\n     * @property {number} isFrontWheel\n     */\n    this.isFrontWheel = options.isFrontWheel;\n\n    /**\n     * @property {number} clippedInvContactDotSuspension\n     */\n    this.clippedInvContactDotSuspension = 1;\n\n    /**\n     * @property {number} suspensionRelativeVelocity\n     */\n    this.suspensionRelativeVelocity = 0;\n\n    /**\n     * @property {number} suspensionForce\n     */\n    this.suspensionForce = 0;\n\n    /**\n     * @property {number} skidInfo\n     */\n    this.skidInfo = 0;\n\n    /**\n     * @property {number} suspensionLength\n     */\n    this.suspensionLength = 0;\n\n    /**\n     * @property {number} sideImpulse\n     */\n    this.sideImpulse = 0;\n\n    /**\n     * @property {number} forwardImpulse\n     */\n    this.forwardImpulse = 0;\n\n    /**\n     * The result from raycasting\n     * @property {RaycastResult} raycastResult\n     */\n    this.raycastResult = new RaycastResult();\n\n    /**\n     * Wheel world transform\n     * @property {Transform} worldTransform\n     */\n    this.worldTransform = new Transform();\n\n    /**\n     * @property {boolean} isInContact\n     */\n    this.isInContact = false;\n}\n\nvar chassis_velocity_at_contactPoint = new Vec3();\nvar relpos = new Vec3();\nvar chassis_velocity_at_contactPoint = new Vec3();\nWheelInfo.prototype.updateWheel = function(chassis){\n    var raycastResult = this.raycastResult;\n\n    if (this.isInContact){\n        var project= raycastResult.hitNormalWorld.dot(raycastResult.directionWorld);\n        raycastResult.hitPointWorld.vsub(chassis.position, relpos);\n        chassis.getVelocityAtWorldPoint(relpos, chassis_velocity_at_contactPoint);\n        var projVel = raycastResult.hitNormalWorld.dot( chassis_velocity_at_contactPoint );\n        if (project >= -0.1) {\n            this.suspensionRelativeVelocity = 0.0;\n            this.clippedInvContactDotSuspension = 1.0 / 0.1;\n        } else {\n            var inv = -1 / project;\n            this.suspensionRelativeVelocity = projVel * inv;\n            this.clippedInvContactDotSuspension = inv;\n        }\n\n    } else {\n        // Not in contact : position wheel in a nice (rest length) position\n        raycastResult.suspensionLength = this.suspensionRestLength;\n        this.suspensionRelativeVelocity = 0.0;\n        raycastResult.directionWorld.scale(-1, raycastResult.hitNormalWorld);\n        this.clippedInvContactDotSuspension = 1.0;\n    }\n};\n},{\"../collision/RaycastResult\":10,\"../math/Transform\":29,\"../math/Vec3\":30,\"../utils/Utils\":53}],37:[function(_dereq_,module,exports){\nmodule.exports = Box;\n\nvar Shape = _dereq_('./Shape');\nvar Vec3 = _dereq_('../math/Vec3');\nvar ConvexPolyhedron = _dereq_('./ConvexPolyhedron');\n\n/**\n * A 3d box shape.\n * @class Box\n * @constructor\n * @param {Vec3} halfExtents\n * @author schteppe\n * @extends Shape\n */\nfunction Box(halfExtents){\n    Shape.call(this);\n\n    this.type = Shape.types.BOX;\n\n    /**\n     * @property halfExtents\n     * @type {Vec3}\n     */\n    this.halfExtents = halfExtents;\n\n    /**\n     * Used by the contact generator to make contacts with other convex polyhedra for example\n     * @property convexPolyhedronRepresentation\n     * @type {ConvexPolyhedron}\n     */\n    this.convexPolyhedronRepresentation = null;\n\n    this.updateConvexPolyhedronRepresentation();\n    this.updateBoundingSphereRadius();\n}\nBox.prototype = new Shape();\nBox.prototype.constructor = Box;\n\n/**\n * Updates the local convex polyhedron representation used for some collisions.\n * @method updateConvexPolyhedronRepresentation\n */\nBox.prototype.updateConvexPolyhedronRepresentation = function(){\n    var sx = this.halfExtents.x;\n    var sy = this.halfExtents.y;\n    var sz = this.halfExtents.z;\n    var V = Vec3;\n\n    var vertices = [\n        new V(-sx,-sy,-sz),\n        new V( sx,-sy,-sz),\n        new V( sx, sy,-sz),\n        new V(-sx, sy,-sz),\n        new V(-sx,-sy, sz),\n        new V( sx,-sy, sz),\n        new V( sx, sy, sz),\n        new V(-sx, sy, sz)\n    ];\n\n    var indices = [\n        [3,2,1,0], // -z\n        [4,5,6,7], // +z\n        [5,4,0,1], // -y\n        [2,3,7,6], // +y\n        [0,4,7,3], // -x\n        [1,2,6,5], // +x\n    ];\n\n    var axes = [\n        new V(0, 0, 1),\n        new V(0, 1, 0),\n        new V(1, 0, 0)\n    ];\n\n    var h = new ConvexPolyhedron(vertices, indices);\n    this.convexPolyhedronRepresentation = h;\n    h.material = this.material;\n};\n\n/**\n * @method calculateLocalInertia\n * @param  {Number} mass\n * @param  {Vec3} target\n * @return {Vec3}\n */\nBox.prototype.calculateLocalInertia = function(mass,target){\n    target = target || new Vec3();\n    Box.calculateInertia(this.halfExtents, mass, target);\n    return target;\n};\n\nBox.calculateInertia = function(halfExtents,mass,target){\n    var e = halfExtents;\n    target.x = 1.0 / 12.0 * mass * (   2*e.y*2*e.y + 2*e.z*2*e.z );\n    target.y = 1.0 / 12.0 * mass * (   2*e.x*2*e.x + 2*e.z*2*e.z );\n    target.z = 1.0 / 12.0 * mass * (   2*e.y*2*e.y + 2*e.x*2*e.x );\n};\n\n/**\n * Get the box 6 side normals\n * @method getSideNormals\n * @param {array}      sixTargetVectors An array of 6 vectors, to store the resulting side normals in.\n * @param {Quaternion} quat             Orientation to apply to the normal vectors. If not provided, the vectors will be in respect to the local frame.\n * @return {array}\n */\nBox.prototype.getSideNormals = function(sixTargetVectors,quat){\n    var sides = sixTargetVectors;\n    var ex = this.halfExtents;\n    sides[0].set(  ex.x,     0,     0);\n    sides[1].set(     0,  ex.y,     0);\n    sides[2].set(     0,     0,  ex.z);\n    sides[3].set( -ex.x,     0,     0);\n    sides[4].set(     0, -ex.y,     0);\n    sides[5].set(     0,     0, -ex.z);\n\n    if(quat!==undefined){\n        for(var i=0; i!==sides.length; i++){\n            quat.vmult(sides[i],sides[i]);\n        }\n    }\n\n    return sides;\n};\n\nBox.prototype.volume = function(){\n    return 8.0 * this.halfExtents.x * this.halfExtents.y * this.halfExtents.z;\n};\n\nBox.prototype.updateBoundingSphereRadius = function(){\n    this.boundingSphereRadius = this.halfExtents.norm();\n};\n\nvar worldCornerTempPos = new Vec3();\nvar worldCornerTempNeg = new Vec3();\nBox.prototype.forEachWorldCorner = function(pos,quat,callback){\n\n    var e = this.halfExtents;\n    var corners = [[  e.x,  e.y,  e.z],\n                   [ -e.x,  e.y,  e.z],\n                   [ -e.x, -e.y,  e.z],\n                   [ -e.x, -e.y, -e.z],\n                   [  e.x, -e.y, -e.z],\n                   [  e.x,  e.y, -e.z],\n                   [ -e.x,  e.y, -e.z],\n                   [  e.x, -e.y,  e.z]];\n    for(var i=0; i<corners.length; i++){\n        worldCornerTempPos.set(corners[i][0],corners[i][1],corners[i][2]);\n        quat.vmult(worldCornerTempPos,worldCornerTempPos);\n        pos.vadd(worldCornerTempPos,worldCornerTempPos);\n        callback(worldCornerTempPos.x,\n                 worldCornerTempPos.y,\n                 worldCornerTempPos.z);\n    }\n};\n\nvar worldCornersTemp = [\n    new Vec3(),\n    new Vec3(),\n    new Vec3(),\n    new Vec3(),\n    new Vec3(),\n    new Vec3(),\n    new Vec3(),\n    new Vec3()\n];\nBox.prototype.calculateWorldAABB = function(pos,quat,min,max){\n\n    var e = this.halfExtents;\n    worldCornersTemp[0].set(e.x, e.y, e.z);\n    worldCornersTemp[1].set(-e.x,  e.y, e.z);\n    worldCornersTemp[2].set(-e.x, -e.y, e.z);\n    worldCornersTemp[3].set(-e.x, -e.y, -e.z);\n    worldCornersTemp[4].set(e.x, -e.y, -e.z);\n    worldCornersTemp[5].set(e.x,  e.y, -e.z);\n    worldCornersTemp[6].set(-e.x,  e.y, -e.z);\n    worldCornersTemp[7].set(e.x, -e.y,  e.z);\n\n    var wc = worldCornersTemp[0];\n    quat.vmult(wc, wc);\n    pos.vadd(wc, wc);\n    max.copy(wc);\n    min.copy(wc);\n    for(var i=1; i<8; i++){\n        var wc = worldCornersTemp[i];\n        quat.vmult(wc, wc);\n        pos.vadd(wc, wc);\n        var x = wc.x;\n        var y = wc.y;\n        var z = wc.z;\n        if(x > max.x){\n            max.x = x;\n        }\n        if(y > max.y){\n            max.y = y;\n        }\n        if(z > max.z){\n            max.z = z;\n        }\n\n        if(x < min.x){\n            min.x = x;\n        }\n        if(y < min.y){\n            min.y = y;\n        }\n        if(z < min.z){\n            min.z = z;\n        }\n    }\n\n    // Get each axis max\n    // min.set(Infinity,Infinity,Infinity);\n    // max.set(-Infinity,-Infinity,-Infinity);\n    // this.forEachWorldCorner(pos,quat,function(x,y,z){\n    //     if(x > max.x){\n    //         max.x = x;\n    //     }\n    //     if(y > max.y){\n    //         max.y = y;\n    //     }\n    //     if(z > max.z){\n    //         max.z = z;\n    //     }\n\n    //     if(x < min.x){\n    //         min.x = x;\n    //     }\n    //     if(y < min.y){\n    //         min.y = y;\n    //     }\n    //     if(z < min.z){\n    //         min.z = z;\n    //     }\n    // });\n};\n\n},{\"../math/Vec3\":30,\"./ConvexPolyhedron\":38,\"./Shape\":43}],38:[function(_dereq_,module,exports){\nmodule.exports = ConvexPolyhedron;\n\nvar Shape = _dereq_('./Shape');\nvar Vec3 = _dereq_('../math/Vec3');\nvar Quaternion = _dereq_('../math/Quaternion');\nvar Transform = _dereq_('../math/Transform');\n\n/**\n * A set of polygons describing a convex shape.\n * @class ConvexPolyhedron\n * @constructor\n * @extends Shape\n * @description The shape MUST be convex for the code to work properly. No polygons may be coplanar (contained\n * in the same 3D plane), instead these should be merged into one polygon.\n *\n * @param {array} points An array of Vec3's\n * @param {array} faces Array of integer arrays, describing which vertices that is included in each face.\n *\n * @author qiao / https://github.com/qiao (original author, see https://github.com/qiao/three.js/commit/85026f0c769e4000148a67d45a9e9b9c5108836f)\n * @author schteppe / https://github.com/schteppe\n * @see http://www.altdevblogaday.com/2011/05/13/contact-generation-between-3d-convex-meshes/\n * @see http://bullet.googlecode.com/svn/trunk/src/BulletCollision/NarrowPhaseCollision/btPolyhedralContactClipping.cpp\n *\n * @todo Move the clipping functions to ContactGenerator?\n * @todo Automatically merge coplanar polygons in constructor.\n */\nfunction ConvexPolyhedron(points, faces, uniqueAxes) {\n    var that = this;\n    Shape.call(this);\n    this.type = Shape.types.CONVEXPOLYHEDRON;\n\n    /**\n     * Array of Vec3\n     * @property vertices\n     * @type {Array}\n     */\n    this.vertices = points||[];\n\n    this.worldVertices = []; // World transformed version of .vertices\n    this.worldVerticesNeedsUpdate = true;\n\n    /**\n     * Array of integer arrays, indicating which vertices each face consists of\n     * @property faces\n     * @type {Array}\n     */\n    this.faces = faces||[];\n\n    /**\n     * Array of Vec3\n     * @property faceNormals\n     * @type {Array}\n     */\n    this.faceNormals = [];\n    this.computeNormals();\n\n    this.worldFaceNormalsNeedsUpdate = true;\n    this.worldFaceNormals = []; // World transformed version of .faceNormals\n\n    /**\n     * Array of Vec3\n     * @property uniqueEdges\n     * @type {Array}\n     */\n    this.uniqueEdges = [];\n\n    /**\n     * If given, these locally defined, normalized axes are the only ones being checked when doing separating axis check.\n     * @property {Array} uniqueAxes\n     */\n    this.uniqueAxes = uniqueAxes ? uniqueAxes.slice() : null;\n\n    this.computeEdges();\n    this.updateBoundingSphereRadius();\n}\nConvexPolyhedron.prototype = new Shape();\nConvexPolyhedron.prototype.constructor = ConvexPolyhedron;\n\nvar computeEdges_tmpEdge = new Vec3();\n/**\n * Computes uniqueEdges\n * @method computeEdges\n */\nConvexPolyhedron.prototype.computeEdges = function(){\n    var faces = this.faces;\n    var vertices = this.vertices;\n    var nv = vertices.length;\n    var edges = this.uniqueEdges;\n\n    edges.length = 0;\n\n    var edge = computeEdges_tmpEdge;\n\n    for(var i=0; i !== faces.length; i++){\n        var face = faces[i];\n        var numVertices = face.length;\n        for(var j = 0; j !== numVertices; j++){\n            var k = ( j+1 ) % numVertices;\n            vertices[face[j]].vsub(vertices[face[k]], edge);\n            edge.normalize();\n            var found = false;\n            for(var p=0; p !== edges.length; p++){\n                if (edges[p].almostEquals(edge) || edges[p].almostEquals(edge)){\n                    found = true;\n                    break;\n                }\n            }\n\n            if (!found){\n                edges.push(edge.clone());\n            }\n        }\n    }\n};\n\n/**\n * Compute the normals of the faces. Will reuse existing Vec3 objects in the .faceNormals array if they exist.\n * @method computeNormals\n */\nConvexPolyhedron.prototype.computeNormals = function(){\n    this.faceNormals.length = this.faces.length;\n\n    // Generate normals\n    for(var i=0; i<this.faces.length; i++){\n\n        // Check so all vertices exists for this face\n        for(var j=0; j<this.faces[i].length; j++){\n            if(!this.vertices[this.faces[i][j]]){\n                throw new Error(\"Vertex \"+this.faces[i][j]+\" not found!\");\n            }\n        }\n\n        var n = this.faceNormals[i] || new Vec3();\n        this.getFaceNormal(i,n);\n        n.negate(n);\n        this.faceNormals[i] = n;\n        var vertex = this.vertices[this.faces[i][0]];\n        if(n.dot(vertex) < 0){\n            console.error(\".faceNormals[\" + i + \"] = Vec3(\"+n.toString()+\") looks like it points into the shape? The vertices follow. Make sure they are ordered CCW around the normal, using the right hand rule.\");\n            for(var j=0; j<this.faces[i].length; j++){\n                console.warn(\".vertices[\"+this.faces[i][j]+\"] = Vec3(\"+this.vertices[this.faces[i][j]].toString()+\")\");\n            }\n        }\n    }\n};\n\n/**\n * Get face normal given 3 vertices\n * @static\n * @method getFaceNormal\n * @param {Vec3} va\n * @param {Vec3} vb\n * @param {Vec3} vc\n * @param {Vec3} target\n */\nvar cb = new Vec3();\nvar ab = new Vec3();\nConvexPolyhedron.computeNormal = function ( va, vb, vc, target ) {\n    vb.vsub(va,ab);\n    vc.vsub(vb,cb);\n    cb.cross(ab,target);\n    if ( !target.isZero() ) {\n        target.normalize();\n    }\n};\n\n/**\n * Compute the normal of a face from its vertices\n * @method getFaceNormal\n * @param  {Number} i\n * @param  {Vec3} target\n */\nConvexPolyhedron.prototype.getFaceNormal = function(i,target){\n    var f = this.faces[i];\n    var va = this.vertices[f[0]];\n    var vb = this.vertices[f[1]];\n    var vc = this.vertices[f[2]];\n    return ConvexPolyhedron.computeNormal(va,vb,vc,target);\n};\n\n/**\n * @method clipAgainstHull\n * @param {Vec3} posA\n * @param {Quaternion} quatA\n * @param {ConvexPolyhedron} hullB\n * @param {Vec3} posB\n * @param {Quaternion} quatB\n * @param {Vec3} separatingNormal\n * @param {Number} minDist Clamp distance\n * @param {Number} maxDist\n * @param {array} result The an array of contact point objects, see clipFaceAgainstHull\n * @see http://bullet.googlecode.com/svn/trunk/src/BulletCollision/NarrowPhaseCollision/btPolyhedralContactClipping.cpp\n */\nvar cah_WorldNormal = new Vec3();\nConvexPolyhedron.prototype.clipAgainstHull = function(posA,quatA,hullB,posB,quatB,separatingNormal,minDist,maxDist,result){\n    var WorldNormal = cah_WorldNormal;\n    var hullA = this;\n    var curMaxDist = maxDist;\n    var closestFaceB = -1;\n    var dmax = -Number.MAX_VALUE;\n    for(var face=0; face < hullB.faces.length; face++){\n        WorldNormal.copy(hullB.faceNormals[face]);\n        quatB.vmult(WorldNormal,WorldNormal);\n        //posB.vadd(WorldNormal,WorldNormal);\n        var d = WorldNormal.dot(separatingNormal);\n        if (d > dmax){\n            dmax = d;\n            closestFaceB = face;\n        }\n    }\n    var worldVertsB1 = [];\n    var polyB = hullB.faces[closestFaceB];\n    var numVertices = polyB.length;\n    for(var e0=0; e0<numVertices; e0++){\n        var b = hullB.vertices[polyB[e0]];\n        var worldb = new Vec3();\n        worldb.copy(b);\n        quatB.vmult(worldb,worldb);\n        posB.vadd(worldb,worldb);\n        worldVertsB1.push(worldb);\n    }\n\n    if (closestFaceB>=0){\n        this.clipFaceAgainstHull(separatingNormal,\n                                 posA,\n                                 quatA,\n                                 worldVertsB1,\n                                 minDist,\n                                 maxDist,\n                                 result);\n    }\n};\n\n/**\n * Find the separating axis between this hull and another\n * @method findSeparatingAxis\n * @param {ConvexPolyhedron} hullB\n * @param {Vec3} posA\n * @param {Quaternion} quatA\n * @param {Vec3} posB\n * @param {Quaternion} quatB\n * @param {Vec3} target The target vector to save the axis in\n * @return {bool} Returns false if a separation is found, else true\n */\nvar fsa_faceANormalWS3 = new Vec3(),\n    fsa_Worldnormal1 = new Vec3(),\n    fsa_deltaC = new Vec3(),\n    fsa_worldEdge0 = new Vec3(),\n    fsa_worldEdge1 = new Vec3(),\n    fsa_Cross = new Vec3();\nConvexPolyhedron.prototype.findSeparatingAxis = function(hullB,posA,quatA,posB,quatB,target, faceListA, faceListB){\n    var faceANormalWS3 = fsa_faceANormalWS3,\n        Worldnormal1 = fsa_Worldnormal1,\n        deltaC = fsa_deltaC,\n        worldEdge0 = fsa_worldEdge0,\n        worldEdge1 = fsa_worldEdge1,\n        Cross = fsa_Cross;\n\n    var dmin = Number.MAX_VALUE;\n    var hullA = this;\n    var curPlaneTests=0;\n\n    if(!hullA.uniqueAxes){\n\n        var numFacesA = faceListA ? faceListA.length : hullA.faces.length;\n\n        // Test face normals from hullA\n        for(var i=0; i<numFacesA; i++){\n            var fi = faceListA ? faceListA[i] : i;\n\n            // Get world face normal\n            faceANormalWS3.copy(hullA.faceNormals[fi]);\n            quatA.vmult(faceANormalWS3,faceANormalWS3);\n\n            var d = hullA.testSepAxis(faceANormalWS3, hullB, posA, quatA, posB, quatB);\n            if(d===false){\n                return false;\n            }\n\n            if(d<dmin){\n                dmin = d;\n                target.copy(faceANormalWS3);\n            }\n        }\n\n    } else {\n\n        // Test unique axes\n        for(var i = 0; i !== hullA.uniqueAxes.length; i++){\n\n            // Get world axis\n            quatA.vmult(hullA.uniqueAxes[i],faceANormalWS3);\n\n            var d = hullA.testSepAxis(faceANormalWS3, hullB, posA, quatA, posB, quatB);\n            if(d===false){\n                return false;\n            }\n\n            if(d<dmin){\n                dmin = d;\n                target.copy(faceANormalWS3);\n            }\n        }\n    }\n\n    if(!hullB.uniqueAxes){\n\n        // Test face normals from hullB\n        var numFacesB = faceListB ? faceListB.length : hullB.faces.length;\n        for(var i=0;i<numFacesB;i++){\n\n            var fi = faceListB ? faceListB[i] : i;\n\n            Worldnormal1.copy(hullB.faceNormals[fi]);\n            quatB.vmult(Worldnormal1,Worldnormal1);\n            curPlaneTests++;\n            var d = hullA.testSepAxis(Worldnormal1, hullB,posA,quatA,posB,quatB);\n            if(d===false){\n                return false;\n            }\n\n            if(d<dmin){\n                dmin = d;\n                target.copy(Worldnormal1);\n            }\n        }\n    } else {\n\n        // Test unique axes in B\n        for(var i = 0; i !== hullB.uniqueAxes.length; i++){\n            quatB.vmult(hullB.uniqueAxes[i],Worldnormal1);\n\n            curPlaneTests++;\n            var d = hullA.testSepAxis(Worldnormal1, hullB,posA,quatA,posB,quatB);\n            if(d===false){\n                return false;\n            }\n\n            if(d<dmin){\n                dmin = d;\n                target.copy(Worldnormal1);\n            }\n        }\n    }\n\n    // Test edges\n    for(var e0=0; e0 !== hullA.uniqueEdges.length; e0++){\n\n        // Get world edge\n        quatA.vmult(hullA.uniqueEdges[e0],worldEdge0);\n\n        for(var e1=0; e1 !== hullB.uniqueEdges.length; e1++){\n\n            // Get world edge 2\n            quatB.vmult(hullB.uniqueEdges[e1], worldEdge1);\n            worldEdge0.cross(worldEdge1,Cross);\n\n            if(!Cross.almostZero()){\n                Cross.normalize();\n                var dist = hullA.testSepAxis(Cross, hullB, posA, quatA, posB, quatB);\n                if(dist === false){\n                    return false;\n                }\n                if(dist < dmin){\n                    dmin = dist;\n                    target.copy(Cross);\n                }\n            }\n        }\n    }\n\n    posB.vsub(posA,deltaC);\n    if((deltaC.dot(target))>0.0){\n        target.negate(target);\n    }\n\n    return true;\n};\n\nvar maxminA=[], maxminB=[];\n\n/**\n * Test separating axis against two hulls. Both hulls are projected onto the axis and the overlap size is returned if there is one.\n * @method testSepAxis\n * @param {Vec3} axis\n * @param {ConvexPolyhedron} hullB\n * @param {Vec3} posA\n * @param {Quaternion} quatA\n * @param {Vec3} posB\n * @param {Quaternion} quatB\n * @return {number} The overlap depth, or FALSE if no penetration.\n */\nConvexPolyhedron.prototype.testSepAxis = function(axis, hullB, posA, quatA, posB, quatB){\n    var hullA=this;\n    ConvexPolyhedron.project(hullA, axis, posA, quatA, maxminA);\n    ConvexPolyhedron.project(hullB, axis, posB, quatB, maxminB);\n    var maxA = maxminA[0];\n    var minA = maxminA[1];\n    var maxB = maxminB[0];\n    var minB = maxminB[1];\n    if(maxA<minB || maxB<minA){\n        return false; // Separated\n    }\n    var d0 = maxA - minB;\n    var d1 = maxB - minA;\n    var depth = d0<d1 ? d0:d1;\n    return depth;\n};\n\nvar cli_aabbmin = new Vec3(),\n    cli_aabbmax = new Vec3();\n\n/**\n * @method calculateLocalInertia\n * @param  {Number} mass\n * @param  {Vec3} target\n */\nConvexPolyhedron.prototype.calculateLocalInertia = function(mass,target){\n    // Approximate with box inertia\n    // Exact inertia calculation is overkill, but see http://geometrictools.com/Documentation/PolyhedralMassProperties.pdf for the correct way to do it\n    this.computeLocalAABB(cli_aabbmin,cli_aabbmax);\n    var x = cli_aabbmax.x - cli_aabbmin.x,\n        y = cli_aabbmax.y - cli_aabbmin.y,\n        z = cli_aabbmax.z - cli_aabbmin.z;\n    target.x = 1.0 / 12.0 * mass * ( 2*y*2*y + 2*z*2*z );\n    target.y = 1.0 / 12.0 * mass * ( 2*x*2*x + 2*z*2*z );\n    target.z = 1.0 / 12.0 * mass * ( 2*y*2*y + 2*x*2*x );\n};\n\n/**\n * @method getPlaneConstantOfFace\n * @param  {Number} face_i Index of the face\n * @return {Number}\n */\nConvexPolyhedron.prototype.getPlaneConstantOfFace = function(face_i){\n    var f = this.faces[face_i];\n    var n = this.faceNormals[face_i];\n    var v = this.vertices[f[0]];\n    var c = -n.dot(v);\n    return c;\n};\n\n/**\n * Clip a face against a hull.\n * @method clipFaceAgainstHull\n * @param {Vec3} separatingNormal\n * @param {Vec3} posA\n * @param {Quaternion} quatA\n * @param {Array} worldVertsB1 An array of Vec3 with vertices in the world frame.\n * @param {Number} minDist Distance clamping\n * @param {Number} maxDist\n * @param Array result Array to store resulting contact points in. Will be objects with properties: point, depth, normal. These are represented in world coordinates.\n */\nvar cfah_faceANormalWS = new Vec3(),\n    cfah_edge0 = new Vec3(),\n    cfah_WorldEdge0 = new Vec3(),\n    cfah_worldPlaneAnormal1 = new Vec3(),\n    cfah_planeNormalWS1 = new Vec3(),\n    cfah_worldA1 = new Vec3(),\n    cfah_localPlaneNormal = new Vec3(),\n    cfah_planeNormalWS = new Vec3();\nConvexPolyhedron.prototype.clipFaceAgainstHull = function(separatingNormal, posA, quatA, worldVertsB1, minDist, maxDist,result){\n    var faceANormalWS = cfah_faceANormalWS,\n        edge0 = cfah_edge0,\n        WorldEdge0 = cfah_WorldEdge0,\n        worldPlaneAnormal1 = cfah_worldPlaneAnormal1,\n        planeNormalWS1 = cfah_planeNormalWS1,\n        worldA1 = cfah_worldA1,\n        localPlaneNormal = cfah_localPlaneNormal,\n        planeNormalWS = cfah_planeNormalWS;\n\n    var hullA = this;\n    var worldVertsB2 = [];\n    var pVtxIn = worldVertsB1;\n    var pVtxOut = worldVertsB2;\n    // Find the face with normal closest to the separating axis\n    var closestFaceA = -1;\n    var dmin = Number.MAX_VALUE;\n    for(var face=0; face<hullA.faces.length; face++){\n        faceANormalWS.copy(hullA.faceNormals[face]);\n        quatA.vmult(faceANormalWS,faceANormalWS);\n        //posA.vadd(faceANormalWS,faceANormalWS);\n        var d = faceANormalWS.dot(separatingNormal);\n        if (d < dmin){\n            dmin = d;\n            closestFaceA = face;\n        }\n    }\n    if (closestFaceA < 0){\n        // console.log(\"--- did not find any closest face... ---\");\n        return;\n    }\n    //console.log(\"closest A: \",closestFaceA);\n    // Get the face and construct connected faces\n    var polyA = hullA.faces[closestFaceA];\n    polyA.connectedFaces = [];\n    for(var i=0; i<hullA.faces.length; i++){\n        for(var j=0; j<hullA.faces[i].length; j++){\n            if(polyA.indexOf(hullA.faces[i][j])!==-1 /* Sharing a vertex*/ && i!==closestFaceA /* Not the one we are looking for connections from */ && polyA.connectedFaces.indexOf(i)===-1 /* Not already added */ ){\n                polyA.connectedFaces.push(i);\n            }\n        }\n    }\n    // Clip the polygon to the back of the planes of all faces of hull A, that are adjacent to the witness face\n    var numContacts = pVtxIn.length;\n    var numVerticesA = polyA.length;\n    var res = [];\n    for(var e0=0; e0<numVerticesA; e0++){\n        var a = hullA.vertices[polyA[e0]];\n        var b = hullA.vertices[polyA[(e0+1)%numVerticesA]];\n        a.vsub(b,edge0);\n        WorldEdge0.copy(edge0);\n        quatA.vmult(WorldEdge0,WorldEdge0);\n        posA.vadd(WorldEdge0,WorldEdge0);\n        worldPlaneAnormal1.copy(this.faceNormals[closestFaceA]);//transA.getBasis()* btVector3(polyA.m_plane[0],polyA.m_plane[1],polyA.m_plane[2]);\n        quatA.vmult(worldPlaneAnormal1,worldPlaneAnormal1);\n        posA.vadd(worldPlaneAnormal1,worldPlaneAnormal1);\n        WorldEdge0.cross(worldPlaneAnormal1,planeNormalWS1);\n        planeNormalWS1.negate(planeNormalWS1);\n        worldA1.copy(a);\n        quatA.vmult(worldA1,worldA1);\n        posA.vadd(worldA1,worldA1);\n        var planeEqWS1 = -worldA1.dot(planeNormalWS1);\n        var planeEqWS;\n        if(true){\n            var otherFace = polyA.connectedFaces[e0];\n            localPlaneNormal.copy(this.faceNormals[otherFace]);\n            var localPlaneEq = this.getPlaneConstantOfFace(otherFace);\n\n            planeNormalWS.copy(localPlaneNormal);\n            quatA.vmult(planeNormalWS,planeNormalWS);\n            //posA.vadd(planeNormalWS,planeNormalWS);\n            var planeEqWS = localPlaneEq - planeNormalWS.dot(posA);\n        } else  {\n            planeNormalWS.copy(planeNormalWS1);\n            planeEqWS = planeEqWS1;\n        }\n\n        // Clip face against our constructed plane\n        this.clipFaceAgainstPlane(pVtxIn, pVtxOut, planeNormalWS, planeEqWS);\n\n        // Throw away all clipped points, but save the reamining until next clip\n        while(pVtxIn.length){\n            pVtxIn.shift();\n        }\n        while(pVtxOut.length){\n            pVtxIn.push(pVtxOut.shift());\n        }\n    }\n\n    //console.log(\"Resulting points after clip:\",pVtxIn);\n\n    // only keep contact points that are behind the witness face\n    localPlaneNormal.copy(this.faceNormals[closestFaceA]);\n\n    var localPlaneEq = this.getPlaneConstantOfFace(closestFaceA);\n    planeNormalWS.copy(localPlaneNormal);\n    quatA.vmult(planeNormalWS,planeNormalWS);\n\n    var planeEqWS = localPlaneEq - planeNormalWS.dot(posA);\n    for (var i=0; i<pVtxIn.length; i++){\n        var depth = planeNormalWS.dot(pVtxIn[i]) + planeEqWS; //???\n        /*console.log(\"depth calc from normal=\",planeNormalWS.toString(),\" and constant \"+planeEqWS+\" and vertex \",pVtxIn[i].toString(),\" gives \"+depth);*/\n        if (depth <=minDist){\n            console.log(\"clamped: depth=\"+depth+\" to minDist=\"+(minDist+\"\"));\n            depth = minDist;\n        }\n\n        if (depth <=maxDist){\n            var point = pVtxIn[i];\n            if(depth<=0){\n                /*console.log(\"Got contact point \",point.toString(),\n                  \", depth=\",depth,\n                  \"contact normal=\",separatingNormal.toString(),\n                  \"plane\",planeNormalWS.toString(),\n                  \"planeConstant\",planeEqWS);*/\n                var p = {\n                    point:point,\n                    normal:planeNormalWS,\n                    depth: depth,\n                };\n                result.push(p);\n            }\n        }\n    }\n};\n\n/**\n * Clip a face in a hull against the back of a plane.\n * @method clipFaceAgainstPlane\n * @param {Array} inVertices\n * @param {Array} outVertices\n * @param {Vec3} planeNormal\n * @param {Number} planeConstant The constant in the mathematical plane equation\n */\nConvexPolyhedron.prototype.clipFaceAgainstPlane = function(inVertices,outVertices, planeNormal, planeConstant){\n    var n_dot_first, n_dot_last;\n    var numVerts = inVertices.length;\n\n    if(numVerts < 2){\n        return outVertices;\n    }\n\n    var firstVertex = inVertices[inVertices.length-1],\n        lastVertex =   inVertices[0];\n\n    n_dot_first = planeNormal.dot(firstVertex) + planeConstant;\n\n    for(var vi = 0; vi < numVerts; vi++){\n        lastVertex = inVertices[vi];\n        n_dot_last = planeNormal.dot(lastVertex) + planeConstant;\n        if(n_dot_first < 0){\n            if(n_dot_last < 0){\n                // Start < 0, end < 0, so output lastVertex\n                var newv = new Vec3();\n                newv.copy(lastVertex);\n                outVertices.push(newv);\n            } else {\n                // Start < 0, end >= 0, so output intersection\n                var newv = new Vec3();\n                firstVertex.lerp(lastVertex,\n                                 n_dot_first / (n_dot_first - n_dot_last),\n                                 newv);\n                outVertices.push(newv);\n            }\n        } else {\n            if(n_dot_last<0){\n                // Start >= 0, end < 0 so output intersection and end\n                var newv = new Vec3();\n                firstVertex.lerp(lastVertex,\n                                 n_dot_first / (n_dot_first - n_dot_last),\n                                 newv);\n                outVertices.push(newv);\n                outVertices.push(lastVertex);\n            }\n        }\n        firstVertex = lastVertex;\n        n_dot_first = n_dot_last;\n    }\n    return outVertices;\n};\n\n// Updates .worldVertices and sets .worldVerticesNeedsUpdate to false.\nConvexPolyhedron.prototype.computeWorldVertices = function(position,quat){\n    var N = this.vertices.length;\n    while(this.worldVertices.length < N){\n        this.worldVertices.push( new Vec3() );\n    }\n\n    var verts = this.vertices,\n        worldVerts = this.worldVertices;\n    for(var i=0; i!==N; i++){\n        quat.vmult( verts[i] , worldVerts[i] );\n        position.vadd( worldVerts[i] , worldVerts[i] );\n    }\n\n    this.worldVerticesNeedsUpdate = false;\n};\n\nvar computeLocalAABB_worldVert = new Vec3();\nConvexPolyhedron.prototype.computeLocalAABB = function(aabbmin,aabbmax){\n    var n = this.vertices.length,\n        vertices = this.vertices,\n        worldVert = computeLocalAABB_worldVert;\n\n    aabbmin.set(Number.MAX_VALUE, Number.MAX_VALUE, Number.MAX_VALUE);\n    aabbmax.set(-Number.MAX_VALUE, -Number.MAX_VALUE, -Number.MAX_VALUE);\n\n    for(var i=0; i<n; i++){\n        var v = vertices[i];\n        if     (v.x < aabbmin.x){\n            aabbmin.x = v.x;\n        } else if(v.x > aabbmax.x){\n            aabbmax.x = v.x;\n        }\n        if     (v.y < aabbmin.y){\n            aabbmin.y = v.y;\n        } else if(v.y > aabbmax.y){\n            aabbmax.y = v.y;\n        }\n        if     (v.z < aabbmin.z){\n            aabbmin.z = v.z;\n        } else if(v.z > aabbmax.z){\n            aabbmax.z = v.z;\n        }\n    }\n};\n\n/**\n * Updates .worldVertices and sets .worldVerticesNeedsUpdate to false.\n * @method computeWorldFaceNormals\n * @param  {Quaternion} quat\n */\nConvexPolyhedron.prototype.computeWorldFaceNormals = function(quat){\n    var N = this.faceNormals.length;\n    while(this.worldFaceNormals.length < N){\n        this.worldFaceNormals.push( new Vec3() );\n    }\n\n    var normals = this.faceNormals,\n        worldNormals = this.worldFaceNormals;\n    for(var i=0; i!==N; i++){\n        quat.vmult( normals[i] , worldNormals[i] );\n    }\n\n    this.worldFaceNormalsNeedsUpdate = false;\n};\n\n/**\n * @method updateBoundingSphereRadius\n */\nConvexPolyhedron.prototype.updateBoundingSphereRadius = function(){\n    // Assume points are distributed with local (0,0,0) as center\n    var max2 = 0;\n    var verts = this.vertices;\n    for(var i=0, N=verts.length; i!==N; i++) {\n        var norm2 = verts[i].norm2();\n        if(norm2 > max2){\n            max2 = norm2;\n        }\n    }\n    this.boundingSphereRadius = Math.sqrt(max2);\n};\n\nvar tempWorldVertex = new Vec3();\n\n/**\n * @method calculateWorldAABB\n * @param {Vec3}        pos\n * @param {Quaternion}  quat\n * @param {Vec3}        min\n * @param {Vec3}        max\n */\nConvexPolyhedron.prototype.calculateWorldAABB = function(pos,quat,min,max){\n    var n = this.vertices.length, verts = this.vertices;\n    var minx,miny,minz,maxx,maxy,maxz;\n    for(var i=0; i<n; i++){\n        tempWorldVertex.copy(verts[i]);\n        quat.vmult(tempWorldVertex,tempWorldVertex);\n        pos.vadd(tempWorldVertex,tempWorldVertex);\n        var v = tempWorldVertex;\n        if     (v.x < minx || minx===undefined){\n            minx = v.x;\n        } else if(v.x > maxx || maxx===undefined){\n            maxx = v.x;\n        }\n\n        if     (v.y < miny || miny===undefined){\n            miny = v.y;\n        } else if(v.y > maxy || maxy===undefined){\n            maxy = v.y;\n        }\n\n        if     (v.z < minz || minz===undefined){\n            minz = v.z;\n        } else if(v.z > maxz || maxz===undefined){\n            maxz = v.z;\n        }\n    }\n    min.set(minx,miny,minz);\n    max.set(maxx,maxy,maxz);\n};\n\n/**\n * Get approximate convex volume\n * @method volume\n * @return {Number}\n */\nConvexPolyhedron.prototype.volume = function(){\n    return 4.0 * Math.PI * this.boundingSphereRadius / 3.0;\n};\n\n/**\n * Get an average of all the vertices positions\n * @method getAveragePointLocal\n * @param  {Vec3} target\n * @return {Vec3}\n */\nConvexPolyhedron.prototype.getAveragePointLocal = function(target){\n    target = target || new Vec3();\n    var n = this.vertices.length,\n        verts = this.vertices;\n    for(var i=0; i<n; i++){\n        target.vadd(verts[i],target);\n    }\n    target.mult(1/n,target);\n    return target;\n};\n\n/**\n * Transform all local points. Will change the .vertices\n * @method transformAllPoints\n * @param  {Vec3} offset\n * @param  {Quaternion} quat\n */\nConvexPolyhedron.prototype.transformAllPoints = function(offset,quat){\n    var n = this.vertices.length,\n        verts = this.vertices;\n\n    // Apply rotation\n    if(quat){\n        // Rotate vertices\n        for(var i=0; i<n; i++){\n            var v = verts[i];\n            quat.vmult(v,v);\n        }\n        // Rotate face normals\n        for(var i=0; i<this.faceNormals.length; i++){\n            var v = this.faceNormals[i];\n            quat.vmult(v,v);\n        }\n        /*\n        // Rotate edges\n        for(var i=0; i<this.uniqueEdges.length; i++){\n            var v = this.uniqueEdges[i];\n            quat.vmult(v,v);\n        }*/\n    }\n\n    // Apply offset\n    if(offset){\n        for(var i=0; i<n; i++){\n            var v = verts[i];\n            v.vadd(offset,v);\n        }\n    }\n};\n\n/**\n * Checks whether p is inside the polyhedra. Must be in local coords. The point lies outside of the convex hull of the other points if and only if the direction of all the vectors from it to those other points are on less than one half of a sphere around it.\n * @method pointIsInside\n * @param  {Vec3} p      A point given in local coordinates\n * @return {Boolean}\n */\nvar ConvexPolyhedron_pointIsInside = new Vec3();\nvar ConvexPolyhedron_vToP = new Vec3();\nvar ConvexPolyhedron_vToPointInside = new Vec3();\nConvexPolyhedron.prototype.pointIsInside = function(p){\n    var n = this.vertices.length,\n        verts = this.vertices,\n        faces = this.faces,\n        normals = this.faceNormals;\n    var positiveResult = null;\n    var N = this.faces.length;\n    var pointInside = ConvexPolyhedron_pointIsInside;\n    this.getAveragePointLocal(pointInside);\n    for(var i=0; i<N; i++){\n        var numVertices = this.faces[i].length;\n        var n = normals[i];\n        var v = verts[faces[i][0]]; // We only need one point in the face\n\n        // This dot product determines which side of the edge the point is\n        var vToP = ConvexPolyhedron_vToP;\n        p.vsub(v,vToP);\n        var r1 = n.dot(vToP);\n\n        var vToPointInside = ConvexPolyhedron_vToPointInside;\n        pointInside.vsub(v,vToPointInside);\n        var r2 = n.dot(vToPointInside);\n\n        if((r1<0 && r2>0) || (r1>0 && r2<0)){\n            return false; // Encountered some other sign. Exit.\n        } else {\n        }\n    }\n\n    // If we got here, all dot products were of the same sign.\n    return positiveResult ? 1 : -1;\n};\n\n/**\n * Get max and min dot product of a convex hull at position (pos,quat) projected onto an axis. Results are saved in the array maxmin.\n * @static\n * @method project\n * @param {ConvexPolyhedron} hull\n * @param {Vec3} axis\n * @param {Vec3} pos\n * @param {Quaternion} quat\n * @param {array} result result[0] and result[1] will be set to maximum and minimum, respectively.\n */\nvar project_worldVertex = new Vec3();\nvar project_localAxis = new Vec3();\nvar project_localOrigin = new Vec3();\nConvexPolyhedron.project = function(hull, axis, pos, quat, result){\n    var n = hull.vertices.length,\n        worldVertex = project_worldVertex,\n        localAxis = project_localAxis,\n        max = 0,\n        min = 0,\n        localOrigin = project_localOrigin,\n        vs = hull.vertices;\n\n    localOrigin.setZero();\n\n    // Transform the axis to local\n    Transform.vectorToLocalFrame(pos, quat, axis, localAxis);\n    Transform.pointToLocalFrame(pos, quat, localOrigin, localOrigin);\n    var add = localOrigin.dot(localAxis);\n\n    min = max = vs[0].dot(localAxis);\n\n    for(var i = 1; i < n; i++){\n        var val = vs[i].dot(localAxis);\n\n        if(val > max){\n            max = val;\n        }\n\n        if(val < min){\n            min = val;\n        }\n    }\n\n    min -= add;\n    max -= add;\n\n    if(min > max){\n        // Inconsistent - swap\n        var temp = min;\n        min = max;\n        max = temp;\n    }\n    // Output\n    result[0] = max;\n    result[1] = min;\n};\n\n},{\"../math/Quaternion\":28,\"../math/Transform\":29,\"../math/Vec3\":30,\"./Shape\":43}],39:[function(_dereq_,module,exports){\nmodule.exports = Cylinder;\n\nvar Shape = _dereq_('./Shape');\nvar Vec3 = _dereq_('../math/Vec3');\nvar Quaternion = _dereq_('../math/Quaternion');\nvar ConvexPolyhedron = _dereq_('./ConvexPolyhedron');\n\n/**\n * @class Cylinder\n * @constructor\n * @extends ConvexPolyhedron\n * @author schteppe / https://github.com/schteppe\n * @param {Number} radiusTop\n * @param {Number} radiusBottom\n * @param {Number} height\n * @param {Number} numSegments The number of segments to build the cylinder out of\n */\nfunction Cylinder( radiusTop, radiusBottom, height , numSegments ) {\n    var N = numSegments,\n        verts = [],\n        axes = [],\n        faces = [],\n        bottomface = [],\n        topface = [],\n        cos = Math.cos,\n        sin = Math.sin;\n\n    // First bottom point\n    verts.push(new Vec3(radiusBottom*cos(0),\n                               radiusBottom*sin(0),\n                               -height*0.5));\n    bottomface.push(0);\n\n    // First top point\n    verts.push(new Vec3(radiusTop*cos(0),\n                               radiusTop*sin(0),\n                               height*0.5));\n    topface.push(1);\n\n    for(var i=0; i<N; i++){\n        var theta = 2*Math.PI/N * (i+1);\n        var thetaN = 2*Math.PI/N * (i+0.5);\n        if(i<N-1){\n            // Bottom\n            verts.push(new Vec3(radiusBottom*cos(theta),\n                                       radiusBottom*sin(theta),\n                                       -height*0.5));\n            bottomface.push(2*i+2);\n            // Top\n            verts.push(new Vec3(radiusTop*cos(theta),\n                                       radiusTop*sin(theta),\n                                       height*0.5));\n            topface.push(2*i+3);\n\n            // Face\n            faces.push([2*i+2, 2*i+3, 2*i+1,2*i]);\n        } else {\n            faces.push([0,1, 2*i+1, 2*i]); // Connect\n        }\n\n        // Axis: we can cut off half of them if we have even number of segments\n        if(N % 2 === 1 || i < N / 2){\n            axes.push(new Vec3(cos(thetaN), sin(thetaN), 0));\n        }\n    }\n    faces.push(topface);\n    axes.push(new Vec3(0,0,1));\n\n    // Reorder bottom face\n    var temp = [];\n    for(var i=0; i<bottomface.length; i++){\n        temp.push(bottomface[bottomface.length - i - 1]);\n    }\n    faces.push(temp);\n\n    this.type = Shape.types.CONVEXPOLYHEDRON;\n    ConvexPolyhedron.call( this, verts, faces, axes );\n}\n\nCylinder.prototype = new ConvexPolyhedron();\n\n},{\"../math/Quaternion\":28,\"../math/Vec3\":30,\"./ConvexPolyhedron\":38,\"./Shape\":43}],40:[function(_dereq_,module,exports){\nvar Shape = _dereq_('./Shape');\nvar ConvexPolyhedron = _dereq_('./ConvexPolyhedron');\nvar Vec3 = _dereq_('../math/Vec3');\nvar Utils = _dereq_('../utils/Utils');\n\nmodule.exports = Heightfield;\n\n/**\n * Heightfield shape class. Height data is given as an array. These data points are spread out evenly with a given distance.\n * @class Heightfield\n * @extends Shape\n * @constructor\n * @param {Array} data An array of Y values that will be used to construct the terrain.\n * @param {object} options\n * @param {Number} [options.minValue] Minimum value of the data points in the data array. Will be computed automatically if not given.\n * @param {Number} [options.maxValue] Maximum value.\n * @param {Number} [options.elementSize=0.1] World spacing between the data points in X direction.\n * @todo Should be possible to use along all axes, not just y\n *\n * @example\n *     // Generate some height data (y-values).\n *     var data = [];\n *     for(var i = 0; i < 1000; i++){\n *         var y = 0.5 * Math.cos(0.2 * i);\n *         data.push(y);\n *     }\n *\n *     // Create the heightfield shape\n *     var heightfieldShape = new Heightfield(data, {\n *         elementSize: 1 // Distance between the data points in X and Y directions\n *     });\n *     var heightfieldBody = new Body();\n *     heightfieldBody.addShape(heightfieldShape);\n *     world.addBody(heightfieldBody);\n */\nfunction Heightfield(data, options){\n    options = Utils.defaults(options, {\n        maxValue : null,\n        minValue : null,\n        elementSize : 1\n    });\n\n    /**\n     * An array of numbers, or height values, that are spread out along the x axis.\n     * @property {array} data\n     */\n    this.data = data;\n\n    /**\n     * Max value of the data\n     * @property {number} maxValue\n     */\n    this.maxValue = options.maxValue;\n\n    /**\n     * Max value of the data\n     * @property {number} minValue\n     */\n    this.minValue = options.minValue;\n\n    /**\n     * The width of each element\n     * @property {number} elementSize\n     * @todo elementSizeX and Y\n     */\n    this.elementSize = options.elementSize;\n\n    if(options.minValue === null){\n        this.updateMinValue();\n    }\n    if(options.maxValue === null){\n        this.updateMaxValue();\n    }\n\n    this.cacheEnabled = true;\n\n    Shape.call(this);\n\n    this.pillarConvex = new ConvexPolyhedron();\n    this.pillarOffset = new Vec3();\n\n    this.type = Shape.types.HEIGHTFIELD;\n    this.updateBoundingSphereRadius();\n\n    // \"i_j_isUpper\" => { convex: ..., offset: ... }\n    // for example:\n    // _cachedPillars[\"0_2_1\"]\n    this._cachedPillars = {};\n}\nHeightfield.prototype = new Shape();\n\n/**\n * Call whenever you change the data array.\n * @method update\n */\nHeightfield.prototype.update = function(){\n    this._cachedPillars = {};\n};\n\n/**\n * Update the .minValue property\n * @method updateMinValue\n */\nHeightfield.prototype.updateMinValue = function(){\n    var data = this.data;\n    var minValue = data[0][0];\n    for(var i=0; i !== data.length; i++){\n        for(var j=0; j !== data[i].length; j++){\n            var v = data[i][j];\n            if(v < minValue){\n                minValue = v;\n            }\n        }\n    }\n    this.minValue = minValue;\n};\n\n/**\n * Update the .maxValue property\n * @method updateMaxValue\n */\nHeightfield.prototype.updateMaxValue = function(){\n    var data = this.data;\n    var maxValue = data[0][0];\n    for(var i=0; i !== data.length; i++){\n        for(var j=0; j !== data[i].length; j++){\n            var v = data[i][j];\n            if(v > maxValue){\n                maxValue = v;\n            }\n        }\n    }\n    this.maxValue = maxValue;\n};\n\n/**\n * Set the height value at an index. Don't forget to update maxValue and minValue after you're done.\n * @method setHeightValueAtIndex\n * @param {integer} xi\n * @param {integer} yi\n * @param {number} value\n */\nHeightfield.prototype.setHeightValueAtIndex = function(xi, yi, value){\n    var data = this.data;\n    data[xi][yi] = value;\n\n    // Invalidate cache\n    this.clearCachedConvexTrianglePillar(xi, yi, false);\n    if(xi > 0){\n        this.clearCachedConvexTrianglePillar(xi - 1, yi, true);\n        this.clearCachedConvexTrianglePillar(xi - 1, yi, false);\n    }\n    if(yi > 0){\n        this.clearCachedConvexTrianglePillar(xi, yi - 1, true);\n        this.clearCachedConvexTrianglePillar(xi, yi - 1, false);\n    }\n    if(yi > 0 && xi > 0){\n        this.clearCachedConvexTrianglePillar(xi - 1, yi - 1, true);\n    }\n};\n\n/**\n * Get max/min in a rectangle in the matrix data\n * @method getRectMinMax\n * @param  {integer} iMinX\n * @param  {integer} iMinY\n * @param  {integer} iMaxX\n * @param  {integer} iMaxY\n * @param  {array} [result] An array to store the results in.\n * @return {array} The result array, if it was passed in. Minimum will be at position 0 and max at 1.\n */\nHeightfield.prototype.getRectMinMax = function (iMinX, iMinY, iMaxX, iMaxY, result) {\n    result = result || [];\n\n    // Get max and min of the data\n    var data = this.data,\n        max = this.minValue; // Set first value\n    for(var i = iMinX; i <= iMaxX; i++){\n        for(var j = iMinY; j <= iMaxY; j++){\n            var height = data[i][j];\n            if(height > max){\n                max = height;\n            }\n        }\n    }\n\n    result[0] = this.minValue;\n    result[1] = max;\n};\n\n/**\n * Get the index of a local position on the heightfield. The indexes indicate the rectangles, so if your terrain is made of N x N height data points, you will have rectangle indexes ranging from 0 to N-1.\n * @method getIndexOfPosition\n * @param  {number} x\n * @param  {number} y\n * @param  {array} result Two-element array\n * @param  {boolean} clamp If the position should be clamped to the heightfield edge.\n * @return {boolean}\n */\nHeightfield.prototype.getIndexOfPosition = function (x, y, result, clamp) {\n\n    // Get the index of the data points to test against\n    var w = this.elementSize;\n    var data = this.data;\n    var xi = Math.floor(x / w);\n    var yi = Math.floor(y / w);\n\n    result[0] = xi;\n    result[1] = yi;\n\n    if(clamp){\n        // Clamp index to edges\n        if(xi < 0){ xi = 0; }\n        if(yi < 0){ yi = 0; }\n        if(xi >= data.length - 1){ xi = data.length - 1; }\n        if(yi >= data[0].length - 1){ yi = data[0].length - 1; }\n    }\n\n    // Bail out if we are out of the terrain\n    if(xi < 0 || yi < 0 || xi >= data.length-1 || yi >= data[0].length-1){\n        return false;\n    }\n\n    return true;\n};\n\nHeightfield.prototype.getHeightAt = function(x, y, edgeClamp){\n    var idx = [];\n    this.getIndexOfPosition(x, y, idx, edgeClamp);\n\n    // TODO: get upper or lower triangle, then use barycentric interpolation to get the height in the triangle.\n    var minmax = [];\n    this.getRectMinMax(idx[0], idx[1] + 1, idx[0], idx[1] + 1, minmax);\n\n    return (minmax[0] + minmax[1]) / 2; // average\n};\n\nHeightfield.prototype.getCacheConvexTrianglePillarKey = function(xi, yi, getUpperTriangle){\n    return xi + '_' + yi + '_' + (getUpperTriangle ? 1 : 0);\n};\n\nHeightfield.prototype.getCachedConvexTrianglePillar = function(xi, yi, getUpperTriangle){\n    return this._cachedPillars[this.getCacheConvexTrianglePillarKey(xi, yi, getUpperTriangle)];\n};\n\nHeightfield.prototype.setCachedConvexTrianglePillar = function(xi, yi, getUpperTriangle, convex, offset){\n    this._cachedPillars[this.getCacheConvexTrianglePillarKey(xi, yi, getUpperTriangle)] = {\n        convex: convex,\n        offset: offset\n    };\n};\n\nHeightfield.prototype.clearCachedConvexTrianglePillar = function(xi, yi, getUpperTriangle){\n    delete this._cachedPillars[this.getCacheConvexTrianglePillarKey(xi, yi, getUpperTriangle)];\n};\n\n/**\n * Get a triangle in the terrain in the form of a triangular convex shape.\n * @method getConvexTrianglePillar\n * @param  {integer} i\n * @param  {integer} j\n * @param  {boolean} getUpperTriangle\n */\nHeightfield.prototype.getConvexTrianglePillar = function(xi, yi, getUpperTriangle){\n    var result = this.pillarConvex;\n    var offsetResult = this.pillarOffset;\n\n    if(this.cacheEnabled){\n        var data = this.getCachedConvexTrianglePillar(xi, yi, getUpperTriangle);\n        if(data){\n            this.pillarConvex = data.convex;\n            this.pillarOffset = data.offset;\n            return;\n        }\n\n        result = new ConvexPolyhedron();\n        offsetResult = new Vec3();\n\n        this.pillarConvex = result;\n        this.pillarOffset = offsetResult;\n    }\n\n    var data = this.data;\n    var elementSize = this.elementSize;\n    var faces = result.faces;\n\n    // Reuse verts if possible\n    result.vertices.length = 6;\n    for (var i = 0; i < 6; i++) {\n        if(!result.vertices[i]){\n            result.vertices[i] = new Vec3();\n        }\n    }\n\n    // Reuse faces if possible\n    faces.length = 5;\n    for (var i = 0; i < 5; i++) {\n        if(!faces[i]){\n            faces[i] = [];\n        }\n    }\n\n    var verts = result.vertices;\n\n    var h = (Math.min(\n        data[xi][yi],\n        data[xi+1][yi],\n        data[xi][yi+1],\n        data[xi+1][yi+1]\n    ) - this.minValue ) / 2 + this.minValue;\n\n    if (!getUpperTriangle) {\n\n        // Center of the triangle pillar - all polygons are given relative to this one\n        offsetResult.set(\n            (xi + 0.25) * elementSize, // sort of center of a triangle\n            (yi + 0.25) * elementSize,\n            h // vertical center\n        );\n\n        // Top triangle verts\n        verts[0].set(\n            -0.25 * elementSize,\n            -0.25 * elementSize,\n            data[xi][yi] - h\n        );\n        verts[1].set(\n            0.75 * elementSize,\n            -0.25 * elementSize,\n            data[xi + 1][yi] - h\n        );\n        verts[2].set(\n            -0.25 * elementSize,\n            0.75 * elementSize,\n            data[xi][yi + 1] - h\n        );\n\n        // bottom triangle verts\n        verts[3].set(\n            -0.25 * elementSize,\n            -0.25 * elementSize,\n            -h-1\n        );\n        verts[4].set(\n            0.75 * elementSize,\n            -0.25 * elementSize,\n            -h-1\n        );\n        verts[5].set(\n            -0.25 * elementSize,\n            0.75  * elementSize,\n            -h-1\n        );\n\n        // top triangle\n        faces[0][0] = 0;\n        faces[0][1] = 1;\n        faces[0][2] = 2;\n\n        // bottom triangle\n        faces[1][0] = 5;\n        faces[1][1] = 4;\n        faces[1][2] = 3;\n\n        // -x facing quad\n        faces[2][0] = 0;\n        faces[2][1] = 2;\n        faces[2][2] = 5;\n        faces[2][3] = 3;\n\n        // -y facing quad\n        faces[3][0] = 1;\n        faces[3][1] = 0;\n        faces[3][2] = 3;\n        faces[3][3] = 4;\n\n        // +xy facing quad\n        faces[4][0] = 4;\n        faces[4][1] = 5;\n        faces[4][2] = 2;\n        faces[4][3] = 1;\n\n\n    } else {\n\n        // Center of the triangle pillar - all polygons are given relative to this one\n        offsetResult.set(\n            (xi + 0.75) * elementSize, // sort of center of a triangle\n            (yi + 0.75) * elementSize,\n            h // vertical center\n        );\n\n        // Top triangle verts\n        verts[0].set(\n            0.25 * elementSize,\n            0.25 * elementSize,\n            data[xi + 1][yi + 1] - h\n        );\n        verts[1].set(\n            -0.75 * elementSize,\n            0.25 * elementSize,\n            data[xi][yi + 1] - h\n        );\n        verts[2].set(\n            0.25 * elementSize,\n            -0.75 * elementSize,\n            data[xi + 1][yi] - h\n        );\n\n        // bottom triangle verts\n        verts[3].set(\n            0.25 * elementSize,\n            0.25 * elementSize,\n            - h-1\n        );\n        verts[4].set(\n            -0.75 * elementSize,\n            0.25 * elementSize,\n            - h-1\n        );\n        verts[5].set(\n            0.25 * elementSize,\n            -0.75 * elementSize,\n            - h-1\n        );\n\n        // Top triangle\n        faces[0][0] = 0;\n        faces[0][1] = 1;\n        faces[0][2] = 2;\n\n        // bottom triangle\n        faces[1][0] = 5;\n        faces[1][1] = 4;\n        faces[1][2] = 3;\n\n        // +x facing quad\n        faces[2][0] = 2;\n        faces[2][1] = 5;\n        faces[2][2] = 3;\n        faces[2][3] = 0;\n\n        // +y facing quad\n        faces[3][0] = 3;\n        faces[3][1] = 4;\n        faces[3][2] = 1;\n        faces[3][3] = 0;\n\n        // -xy facing quad\n        faces[4][0] = 1;\n        faces[4][1] = 4;\n        faces[4][2] = 5;\n        faces[4][3] = 2;\n    }\n\n    result.computeNormals();\n    result.computeEdges();\n    result.updateBoundingSphereRadius();\n\n    this.setCachedConvexTrianglePillar(xi, yi, getUpperTriangle, result, offsetResult);\n};\n\nHeightfield.prototype.calculateLocalInertia = function(mass, target){\n    target = target || new Vec3();\n    target.set(0, 0, 0);\n    return target;\n};\n\nHeightfield.prototype.volume = function(){\n    return Number.MAX_VALUE; // The terrain is infinite\n};\n\nHeightfield.prototype.calculateWorldAABB = function(pos, quat, min, max){\n    // TODO: do it properly\n    min.set(-Number.MAX_VALUE, -Number.MAX_VALUE, -Number.MAX_VALUE);\n    max.set(Number.MAX_VALUE, Number.MAX_VALUE, Number.MAX_VALUE);\n};\n\nHeightfield.prototype.updateBoundingSphereRadius = function(){\n    // Use the bounding box of the min/max values\n    var data = this.data,\n        s = this.elementSize;\n    this.boundingSphereRadius = new Vec3(data.length * s, data[0].length * s, Math.max(Math.abs(this.maxValue), Math.abs(this.minValue))).norm();\n};\n\n},{\"../math/Vec3\":30,\"../utils/Utils\":53,\"./ConvexPolyhedron\":38,\"./Shape\":43}],41:[function(_dereq_,module,exports){\nmodule.exports = Particle;\n\nvar Shape = _dereq_('./Shape');\nvar Vec3 = _dereq_('../math/Vec3');\n\n/**\n * Particle shape.\n * @class Particle\n * @constructor\n * @author schteppe\n * @extends Shape\n */\nfunction Particle(){\n    Shape.call(this);\n\n    this.type = Shape.types.PARTICLE;\n}\nParticle.prototype = new Shape();\nParticle.prototype.constructor = Particle;\n\n/**\n * @method calculateLocalInertia\n * @param  {Number} mass\n * @param  {Vec3} target\n * @return {Vec3}\n */\nParticle.prototype.calculateLocalInertia = function(mass,target){\n    target = target || new Vec3();\n    target.set(0, 0, 0);\n    return target;\n};\n\nParticle.prototype.volume = function(){\n    return 0;\n};\n\nParticle.prototype.updateBoundingSphereRadius = function(){\n    this.boundingSphereRadius = 0;\n};\n\nParticle.prototype.calculateWorldAABB = function(pos,quat,min,max){\n    // Get each axis max\n    min.copy(pos);\n    max.copy(pos);\n};\n\n},{\"../math/Vec3\":30,\"./Shape\":43}],42:[function(_dereq_,module,exports){\nmodule.exports = Plane;\n\nvar Shape = _dereq_('./Shape');\nvar Vec3 = _dereq_('../math/Vec3');\n\n/**\n * A plane, facing in the Z direction. The plane has its surface at z=0 and everything below z=0 is assumed to be solid plane. To make the plane face in some other direction than z, you must put it inside a RigidBody and rotate that body. See the demos.\n * @class Plane\n * @constructor\n * @extends Shape\n * @author schteppe\n */\nfunction Plane(){\n    Shape.call(this);\n    this.type = Shape.types.PLANE;\n\n    // World oriented normal\n    this.worldNormal = new Vec3();\n    this.worldNormalNeedsUpdate = true;\n\n    this.boundingSphereRadius = Number.MAX_VALUE;\n}\nPlane.prototype = new Shape();\nPlane.prototype.constructor = Plane;\n\nPlane.prototype.computeWorldNormal = function(quat){\n    var n = this.worldNormal;\n    n.set(0,0,1);\n    quat.vmult(n,n);\n    this.worldNormalNeedsUpdate = false;\n};\n\nPlane.prototype.calculateLocalInertia = function(mass,target){\n    target = target || new Vec3();\n    return target;\n};\n\nPlane.prototype.volume = function(){\n    return Number.MAX_VALUE; // The plane is infinite...\n};\n\nvar tempNormal = new Vec3();\nPlane.prototype.calculateWorldAABB = function(pos, quat, min, max){\n    // The plane AABB is infinite, except if the normal is pointing along any axis\n    tempNormal.set(0,0,1); // Default plane normal is z\n    quat.vmult(tempNormal,tempNormal);\n    var maxVal = Number.MAX_VALUE;\n    min.set(-maxVal, -maxVal, -maxVal);\n    max.set(maxVal, maxVal, maxVal);\n\n    if(tempNormal.x === 1){ max.x = pos.x; }\n    if(tempNormal.y === 1){ max.y = pos.y; }\n    if(tempNormal.z === 1){ max.z = pos.z; }\n\n    if(tempNormal.x === -1){ min.x = pos.x; }\n    if(tempNormal.y === -1){ min.y = pos.y; }\n    if(tempNormal.z === -1){ min.z = pos.z; }\n};\n\nPlane.prototype.updateBoundingSphereRadius = function(){\n    this.boundingSphereRadius = Number.MAX_VALUE;\n};\n},{\"../math/Vec3\":30,\"./Shape\":43}],43:[function(_dereq_,module,exports){\nmodule.exports = Shape;\n\nvar Shape = _dereq_('./Shape');\nvar Vec3 = _dereq_('../math/Vec3');\nvar Quaternion = _dereq_('../math/Quaternion');\nvar Material = _dereq_('../material/Material');\n\n/**\n * Base class for shapes\n * @class Shape\n * @constructor\n * @author schteppe\n * @todo Should have a mechanism for caching bounding sphere radius instead of calculating it each time\n */\nfunction Shape(){\n\n    /**\n     * Identifyer of the Shape.\n     * @property {number} id\n     */\n    this.id = Shape.idCounter++;\n\n    /**\n     * The type of this shape. Must be set to an int > 0 by subclasses.\n     * @property type\n     * @type {Number}\n     * @see Shape.types\n     */\n    this.type = 0;\n\n    /**\n     * The local bounding sphere radius of this shape.\n     * @property {Number} boundingSphereRadius\n     */\n    this.boundingSphereRadius = 0;\n\n    /**\n     * Whether to produce contact forces when in contact with other bodies. Note that contacts will be generated, but they will be disabled.\n     * @property {boolean} collisionResponse\n     */\n    this.collisionResponse = true;\n\n    /**\n     * @property {Material} material\n     */\n    this.material = null;\n}\nShape.prototype.constructor = Shape;\n\n/**\n * Computes the bounding sphere radius. The result is stored in the property .boundingSphereRadius\n * @method updateBoundingSphereRadius\n * @return {Number}\n */\nShape.prototype.updateBoundingSphereRadius = function(){\n    throw \"computeBoundingSphereRadius() not implemented for shape type \"+this.type;\n};\n\n/**\n * Get the volume of this shape\n * @method volume\n * @return {Number}\n */\nShape.prototype.volume = function(){\n    throw \"volume() not implemented for shape type \"+this.type;\n};\n\n/**\n * Calculates the inertia in the local frame for this shape.\n * @method calculateLocalInertia\n * @return {Vec3}\n * @see http://en.wikipedia.org/wiki/List_of_moments_of_inertia\n */\nShape.prototype.calculateLocalInertia = function(mass,target){\n    throw \"calculateLocalInertia() not implemented for shape type \"+this.type;\n};\n\nShape.idCounter = 0;\n\n/**\n * The available shape types.\n * @static\n * @property types\n * @type {Object}\n */\nShape.types = {\n    SPHERE:1,\n    PLANE:2,\n    BOX:4,\n    COMPOUND:8,\n    CONVEXPOLYHEDRON:16,\n    HEIGHTFIELD:32,\n    PARTICLE:64,\n    CYLINDER:128,\n    TRIMESH:256\n};\n\n\n},{\"../material/Material\":25,\"../math/Quaternion\":28,\"../math/Vec3\":30,\"./Shape\":43}],44:[function(_dereq_,module,exports){\nmodule.exports = Sphere;\n\nvar Shape = _dereq_('./Shape');\nvar Vec3 = _dereq_('../math/Vec3');\n\n/**\n * Spherical shape\n * @class Sphere\n * @constructor\n * @extends Shape\n * @param {Number} radius The radius of the sphere, a non-negative number.\n * @author schteppe / http://github.com/schteppe\n */\nfunction Sphere(radius){\n    Shape.call(this);\n\n    /**\n     * @property {Number} radius\n     */\n    this.radius = radius!==undefined ? Number(radius) : 1.0;\n    this.type = Shape.types.SPHERE;\n\n    if(this.radius < 0){\n        throw new Error('The sphere radius cannot be negative.');\n    }\n\n    this.updateBoundingSphereRadius();\n}\nSphere.prototype = new Shape();\nSphere.prototype.constructor = Sphere;\n\nSphere.prototype.calculateLocalInertia = function(mass,target){\n    target = target || new Vec3();\n    var I = 2.0*mass*this.radius*this.radius/5.0;\n    target.x = I;\n    target.y = I;\n    target.z = I;\n    return target;\n};\n\nSphere.prototype.volume = function(){\n    return 4.0 * Math.PI * this.radius / 3.0;\n};\n\nSphere.prototype.updateBoundingSphereRadius = function(){\n    this.boundingSphereRadius = this.radius;\n};\n\nSphere.prototype.calculateWorldAABB = function(pos,quat,min,max){\n    var r = this.radius;\n    var axes = ['x','y','z'];\n    for(var i=0; i<axes.length; i++){\n        var ax = axes[i];\n        min[ax] = pos[ax] - r;\n        max[ax] = pos[ax] + r;\n    }\n};\n\n},{\"../math/Vec3\":30,\"./Shape\":43}],45:[function(_dereq_,module,exports){\nmodule.exports = Trimesh;\n\nvar Shape = _dereq_('./Shape');\nvar Vec3 = _dereq_('../math/Vec3');\nvar Quaternion = _dereq_('../math/Quaternion');\nvar Transform = _dereq_('../math/Transform');\nvar AABB = _dereq_('../collision/AABB');\nvar Octree = _dereq_('../utils/Octree');\n\n/**\n * @class Trimesh\n * @constructor\n * @param {array} vertices\n * @param {array} indices\n * @extends Shape\n * @example\n *     // How to make a mesh with a single triangle\n *     var vertices = [\n *         0, 0, 0, // vertex 0\n *         1, 0, 0, // vertex 1\n *         0, 1, 0  // vertex 2\n *     ];\n *     var indices = [\n *         0, 1, 2  // triangle 0\n *     ];\n *     var trimeshShape = new Trimesh(vertices, indices);\n */\nfunction Trimesh(vertices, indices) {\n    Shape.call(this);\n    this.type = Shape.types.TRIMESH;\n\n    /**\n     * @property vertices\n     * @type {Array}\n     */\n    this.vertices = new Float32Array(vertices);\n\n    /**\n     * Array of integers, indicating which vertices each triangle consists of. The length of this array is thus 3 times the number of triangles.\n     * @property indices\n     * @type {Array}\n     */\n    this.indices = new Int16Array(indices);\n\n    /**\n     * The normals data.\n     * @property normals\n     * @type {Array}\n     */\n    this.normals = new Float32Array(indices.length);\n\n    /**\n     * The local AABB of the mesh.\n     * @property aabb\n     * @type {Array}\n     */\n    this.aabb = new AABB();\n\n    /**\n     * References to vertex pairs, making up all unique edges in the trimesh.\n     * @property {array} edges\n     */\n    this.edges = null;\n\n    /**\n     * Local scaling of the mesh. Use .setScale() to set it.\n     * @property {Vec3} scale\n     */\n    this.scale = new Vec3(1, 1, 1);\n\n    /**\n     * The indexed triangles. Use .updateTree() to update it.\n     * @property {Octree} tree\n     */\n    this.tree = new Octree();\n\n    this.updateEdges();\n    this.updateNormals();\n    this.updateAABB();\n    this.updateBoundingSphereRadius();\n    this.updateTree();\n}\nTrimesh.prototype = new Shape();\nTrimesh.prototype.constructor = Trimesh;\n\nvar computeNormals_n = new Vec3();\n\n/**\n * @method updateTree\n */\nTrimesh.prototype.updateTree = function(){\n    var tree = this.tree;\n\n    tree.reset();\n    tree.aabb.copy(this.aabb);\n    var scale = this.scale; // The local mesh AABB is scaled, but the octree AABB should be unscaled\n    tree.aabb.lowerBound.x *= 1 / scale.x;\n    tree.aabb.lowerBound.y *= 1 / scale.y;\n    tree.aabb.lowerBound.z *= 1 / scale.z;\n    tree.aabb.upperBound.x *= 1 / scale.x;\n    tree.aabb.upperBound.y *= 1 / scale.y;\n    tree.aabb.upperBound.z *= 1 / scale.z;\n\n    // Insert all triangles\n    var triangleAABB = new AABB();\n    var a = new Vec3();\n    var b = new Vec3();\n    var c = new Vec3();\n    var points = [a, b, c];\n    for (var i = 0; i < this.indices.length / 3; i++) {\n        //this.getTriangleVertices(i, a, b, c);\n\n        // Get unscaled triangle verts\n        var i3 = i * 3;\n        this._getUnscaledVertex(this.indices[i3], a);\n        this._getUnscaledVertex(this.indices[i3 + 1], b);\n        this._getUnscaledVertex(this.indices[i3 + 2], c);\n\n        triangleAABB.setFromPoints(points);\n        tree.insert(triangleAABB, i);\n    }\n    tree.removeEmptyNodes();\n};\n\nvar unscaledAABB = new AABB();\n\n/**\n * Get triangles in a local AABB from the trimesh.\n * @method getTrianglesInAABB\n * @param  {AABB} aabb\n * @param  {array} result An array of integers, referencing the queried triangles.\n */\nTrimesh.prototype.getTrianglesInAABB = function(aabb, result){\n    unscaledAABB.copy(aabb);\n\n    // Scale it to local\n    var scale = this.scale;\n    var isx = scale.x;\n    var isy = scale.y;\n    var isz = scale.z;\n    var l = unscaledAABB.lowerBound;\n    var u = unscaledAABB.upperBound;\n    l.x /= isx;\n    l.y /= isy;\n    l.z /= isz;\n    u.x /= isx;\n    u.y /= isy;\n    u.z /= isz;\n\n    return this.tree.aabbQuery(unscaledAABB, result);\n};\n\n/**\n * @method setScale\n * @param {Vec3} scale\n */\nTrimesh.prototype.setScale = function(scale){\n    var wasUniform = this.scale.x === this.scale.y === this.scale.z;\n    var isUniform = scale.x === scale.y === scale.z;\n\n    if(!(wasUniform && isUniform)){\n        // Non-uniform scaling. Need to update normals.\n        this.updateNormals();\n    }\n    this.scale.copy(scale);\n    this.updateAABB();\n    this.updateBoundingSphereRadius();\n};\n\n/**\n * Compute the normals of the faces. Will save in the .normals array.\n * @method updateNormals\n */\nTrimesh.prototype.updateNormals = function(){\n    var n = computeNormals_n;\n\n    // Generate normals\n    var normals = this.normals;\n    for(var i=0; i < this.indices.length / 3; i++){\n        var i3 = i * 3;\n\n        var a = this.indices[i3],\n            b = this.indices[i3 + 1],\n            c = this.indices[i3 + 2];\n\n        this.getVertex(a, va);\n        this.getVertex(b, vb);\n        this.getVertex(c, vc);\n\n        Trimesh.computeNormal(vb, va, vc, n);\n\n        normals[i3] = n.x;\n        normals[i3 + 1] = n.y;\n        normals[i3 + 2] = n.z;\n    }\n};\n\n/**\n * Update the .edges property\n * @method updateEdges\n */\nTrimesh.prototype.updateEdges = function(){\n    var edges = {};\n    var add = function(indexA, indexB){\n        var key = a < b ? a + '_' + b : b + '_' + a;\n        edges[key] = true;\n    };\n    for(var i=0; i < this.indices.length / 3; i++){\n        var i3 = i * 3;\n        var a = this.indices[i3],\n            b = this.indices[i3 + 1],\n            c = this.indices[i3 + 2];\n        add(a,b);\n        add(b,c);\n        add(c,a);\n    }\n    var keys = Object.keys(edges);\n    this.edges = new Int16Array(keys.length * 2);\n    for (var i = 0; i < keys.length; i++) {\n        var indices = keys[i].split('_');\n        this.edges[2 * i] = parseInt(indices[0], 10);\n        this.edges[2 * i + 1] = parseInt(indices[1], 10);\n    }\n};\n\n/**\n * Get an edge vertex\n * @method getEdgeVertex\n * @param  {number} edgeIndex\n * @param  {number} firstOrSecond 0 or 1, depending on which one of the vertices you need.\n * @param  {Vec3} vertexStore Where to store the result\n */\nTrimesh.prototype.getEdgeVertex = function(edgeIndex, firstOrSecond, vertexStore){\n    var vertexIndex = this.edges[edgeIndex * 2 + (firstOrSecond ? 1 : 0)];\n    this.getVertex(vertexIndex, vertexStore);\n};\n\nvar getEdgeVector_va = new Vec3();\nvar getEdgeVector_vb = new Vec3();\n\n/**\n * Get a vector along an edge.\n * @method getEdgeVector\n * @param  {number} edgeIndex\n * @param  {Vec3} vectorStore\n */\nTrimesh.prototype.getEdgeVector = function(edgeIndex, vectorStore){\n    var va = getEdgeVector_va;\n    var vb = getEdgeVector_vb;\n    this.getEdgeVertex(edgeIndex, 0, va);\n    this.getEdgeVertex(edgeIndex, 1, vb);\n    vb.vsub(va, vectorStore);\n};\n\n/**\n * Get face normal given 3 vertices\n * @static\n * @method computeNormal\n * @param {Vec3} va\n * @param {Vec3} vb\n * @param {Vec3} vc\n * @param {Vec3} target\n */\nvar cb = new Vec3();\nvar ab = new Vec3();\nTrimesh.computeNormal = function ( va, vb, vc, target ) {\n    vb.vsub(va,ab);\n    vc.vsub(vb,cb);\n    cb.cross(ab,target);\n    if ( !target.isZero() ) {\n        target.normalize();\n    }\n};\n\nvar va = new Vec3();\nvar vb = new Vec3();\nvar vc = new Vec3();\n\n/**\n * Get vertex i.\n * @method getVertex\n * @param  {number} i\n * @param  {Vec3} out\n * @return {Vec3} The \"out\" vector object\n */\nTrimesh.prototype.getVertex = function(i, out){\n    var scale = this.scale;\n    this._getUnscaledVertex(i, out);\n    out.x *= scale.x;\n    out.y *= scale.y;\n    out.z *= scale.z;\n    return out;\n};\n\n/**\n * Get raw vertex i\n * @private\n * @method _getUnscaledVertex\n * @param  {number} i\n * @param  {Vec3} out\n * @return {Vec3} The \"out\" vector object\n */\nTrimesh.prototype._getUnscaledVertex = function(i, out){\n    var i3 = i * 3;\n    var vertices = this.vertices;\n    return out.set(\n        vertices[i3],\n        vertices[i3 + 1],\n        vertices[i3 + 2]\n    );\n};\n\n/**\n * Get a vertex from the trimesh,transformed by the given position and quaternion.\n * @method getWorldVertex\n * @param  {number} i\n * @param  {Vec3} pos\n * @param  {Quaternion} quat\n * @param  {Vec3} out\n * @return {Vec3} The \"out\" vector object\n */\nTrimesh.prototype.getWorldVertex = function(i, pos, quat, out){\n    this.getVertex(i, out);\n    Transform.pointToWorldFrame(pos, quat, out, out);\n    return out;\n};\n\n/**\n * Get the three vertices for triangle i.\n * @method getTriangleVertices\n * @param  {number} i\n * @param  {Vec3} a\n * @param  {Vec3} b\n * @param  {Vec3} c\n */\nTrimesh.prototype.getTriangleVertices = function(i, a, b, c){\n    var i3 = i * 3;\n    this.getVertex(this.indices[i3], a);\n    this.getVertex(this.indices[i3 + 1], b);\n    this.getVertex(this.indices[i3 + 2], c);\n};\n\n/**\n * Compute the normal of triangle i.\n * @method getNormal\n * @param  {Number} i\n * @param  {Vec3} target\n * @return {Vec3} The \"target\" vector object\n */\nTrimesh.prototype.getNormal = function(i, target){\n    var i3 = i * 3;\n    return target.set(\n        this.normals[i3],\n        this.normals[i3 + 1],\n        this.normals[i3 + 2]\n    );\n};\n\nvar cli_aabb = new AABB();\n\n/**\n * @method calculateLocalInertia\n * @param  {Number} mass\n * @param  {Vec3} target\n * @return {Vec3} The \"target\" vector object\n */\nTrimesh.prototype.calculateLocalInertia = function(mass,target){\n    // Approximate with box inertia\n    // Exact inertia calculation is overkill, but see http://geometrictools.com/Documentation/PolyhedralMassProperties.pdf for the correct way to do it\n    this.computeLocalAABB(cli_aabb);\n    var x = cli_aabb.upperBound.x - cli_aabb.lowerBound.x,\n        y = cli_aabb.upperBound.y - cli_aabb.lowerBound.y,\n        z = cli_aabb.upperBound.z - cli_aabb.lowerBound.z;\n    return target.set(\n        1.0 / 12.0 * mass * ( 2*y*2*y + 2*z*2*z ),\n        1.0 / 12.0 * mass * ( 2*x*2*x + 2*z*2*z ),\n        1.0 / 12.0 * mass * ( 2*y*2*y + 2*x*2*x )\n    );\n};\n\nvar computeLocalAABB_worldVert = new Vec3();\n\n/**\n * Compute the local AABB for the trimesh\n * @method computeLocalAABB\n * @param  {AABB} aabb\n */\nTrimesh.prototype.computeLocalAABB = function(aabb){\n    var l = aabb.lowerBound,\n        u = aabb.upperBound,\n        n = this.vertices.length,\n        vertices = this.vertices,\n        v = computeLocalAABB_worldVert;\n\n    this.getVertex(0, v);\n    l.copy(v);\n    u.copy(v);\n\n    for(var i=0; i !== n; i++){\n        this.getVertex(i, v);\n\n        if(v.x < l.x){\n            l.x = v.x;\n        } else if(v.x > u.x){\n            u.x = v.x;\n        }\n\n        if(v.y < l.y){\n            l.y = v.y;\n        } else if(v.y > u.y){\n            u.y = v.y;\n        }\n\n        if(v.z < l.z){\n            l.z = v.z;\n        } else if(v.z > u.z){\n            u.z = v.z;\n        }\n    }\n};\n\n\n/**\n * Update the .aabb property\n * @method updateAABB\n */\nTrimesh.prototype.updateAABB = function(){\n    this.computeLocalAABB(this.aabb);\n};\n\n/**\n * Will update the .boundingSphereRadius property\n * @method updateBoundingSphereRadius\n */\nTrimesh.prototype.updateBoundingSphereRadius = function(){\n    // Assume points are distributed with local (0,0,0) as center\n    var max2 = 0;\n    var vertices = this.vertices;\n    var v = new Vec3();\n    for(var i=0, N=vertices.length / 3; i !== N; i++) {\n        this.getVertex(i, v);\n        var norm2 = v.norm2();\n        if(norm2 > max2){\n            max2 = norm2;\n        }\n    }\n    this.boundingSphereRadius = Math.sqrt(max2);\n};\n\nvar tempWorldVertex = new Vec3();\nvar calculateWorldAABB_frame = new Transform();\nvar calculateWorldAABB_aabb = new AABB();\n\n/**\n * @method calculateWorldAABB\n * @param {Vec3}        pos\n * @param {Quaternion}  quat\n * @param {Vec3}        min\n * @param {Vec3}        max\n */\nTrimesh.prototype.calculateWorldAABB = function(pos,quat,min,max){\n    /*\n    var n = this.vertices.length / 3,\n        verts = this.vertices;\n    var minx,miny,minz,maxx,maxy,maxz;\n\n    var v = tempWorldVertex;\n    for(var i=0; i<n; i++){\n        this.getVertex(i, v);\n        quat.vmult(v, v);\n        pos.vadd(v, v);\n        if (v.x < minx || minx===undefined){\n            minx = v.x;\n        } else if(v.x > maxx || maxx===undefined){\n            maxx = v.x;\n        }\n\n        if (v.y < miny || miny===undefined){\n            miny = v.y;\n        } else if(v.y > maxy || maxy===undefined){\n            maxy = v.y;\n        }\n\n        if (v.z < minz || minz===undefined){\n            minz = v.z;\n        } else if(v.z > maxz || maxz===undefined){\n            maxz = v.z;\n        }\n    }\n    min.set(minx,miny,minz);\n    max.set(maxx,maxy,maxz);\n    */\n\n    // Faster approximation using local AABB\n    var frame = calculateWorldAABB_frame;\n    var result = calculateWorldAABB_aabb;\n    frame.position = pos;\n    frame.quaternion = quat;\n    this.aabb.toWorldFrame(frame, result);\n    min.copy(result.lowerBound);\n    max.copy(result.upperBound);\n};\n\n/**\n * Get approximate volume\n * @method volume\n * @return {Number}\n */\nTrimesh.prototype.volume = function(){\n    return 4.0 * Math.PI * this.boundingSphereRadius / 3.0;\n};\n\n/**\n * Create a Trimesh instance, shaped as a torus.\n * @static\n * @method createTorus\n * @param  {number} [radius=1]\n * @param  {number} [tube=0.5]\n * @param  {number} [radialSegments=8]\n * @param  {number} [tubularSegments=6]\n * @param  {number} [arc=6.283185307179586]\n * @return {Trimesh} A torus\n */\nTrimesh.createTorus = function (radius, tube, radialSegments, tubularSegments, arc) {\n    radius = radius || 1;\n    tube = tube || 0.5;\n    radialSegments = radialSegments || 8;\n    tubularSegments = tubularSegments || 6;\n    arc = arc || Math.PI * 2;\n\n    var vertices = [];\n    var indices = [];\n\n    for ( var j = 0; j <= radialSegments; j ++ ) {\n        for ( var i = 0; i <= tubularSegments; i ++ ) {\n            var u = i / tubularSegments * arc;\n            var v = j / radialSegments * Math.PI * 2;\n\n            var x = ( radius + tube * Math.cos( v ) ) * Math.cos( u );\n            var y = ( radius + tube * Math.cos( v ) ) * Math.sin( u );\n            var z = tube * Math.sin( v );\n\n            vertices.push( x, y, z );\n        }\n    }\n\n    for ( var j = 1; j <= radialSegments; j ++ ) {\n        for ( var i = 1; i <= tubularSegments; i ++ ) {\n            var a = ( tubularSegments + 1 ) * j + i - 1;\n            var b = ( tubularSegments + 1 ) * ( j - 1 ) + i - 1;\n            var c = ( tubularSegments + 1 ) * ( j - 1 ) + i;\n            var d = ( tubularSegments + 1 ) * j + i;\n\n            indices.push(a, b, d);\n            indices.push(b, c, d);\n        }\n    }\n\n    return new Trimesh(vertices, indices);\n};\n\n},{\"../collision/AABB\":3,\"../math/Quaternion\":28,\"../math/Transform\":29,\"../math/Vec3\":30,\"../utils/Octree\":50,\"./Shape\":43}],46:[function(_dereq_,module,exports){\nmodule.exports = GSSolver;\n\nvar Vec3 = _dereq_('../math/Vec3');\nvar Quaternion = _dereq_('../math/Quaternion');\nvar Solver = _dereq_('./Solver');\n\n/**\n * Constraint equation Gauss-Seidel solver.\n * @class GSSolver\n * @constructor\n * @todo The spook parameters should be specified for each constraint, not globally.\n * @author schteppe / https://github.com/schteppe\n * @see https://www8.cs.umu.se/kurser/5DV058/VT09/lectures/spooknotes.pdf\n * @extends Solver\n */\nfunction GSSolver(){\n    Solver.call(this);\n\n    /**\n     * The number of solver iterations determines quality of the constraints in the world. The more iterations, the more correct simulation. More iterations need more computations though. If you have a large gravity force in your world, you will need more iterations.\n     * @property iterations\n     * @type {Number}\n     * @todo write more about solver and iterations in the wiki\n     */\n    this.iterations = 10;\n\n    /**\n     * When tolerance is reached, the system is assumed to be converged.\n     * @property tolerance\n     * @type {Number}\n     */\n    this.tolerance = 1e-7;\n}\nGSSolver.prototype = new Solver();\n\nvar GSSolver_solve_lambda = []; // Just temporary number holders that we want to reuse each solve.\nvar GSSolver_solve_invCs = [];\nvar GSSolver_solve_Bs = [];\nGSSolver.prototype.solve = function(dt,world){\n    var iter = 0,\n        maxIter = this.iterations,\n        tolSquared = this.tolerance*this.tolerance,\n        equations = this.equations,\n        Neq = equations.length,\n        bodies = world.bodies,\n        Nbodies = bodies.length,\n        h = dt,\n        q, B, invC, deltalambda, deltalambdaTot, GWlambda, lambdaj;\n\n    // Update solve mass\n    if(Neq !== 0){\n        for(var i=0; i!==Nbodies; i++){\n            bodies[i].updateSolveMassProperties();\n        }\n    }\n\n    // Things that does not change during iteration can be computed once\n    var invCs = GSSolver_solve_invCs,\n        Bs = GSSolver_solve_Bs,\n        lambda = GSSolver_solve_lambda;\n    invCs.length = Neq;\n    Bs.length = Neq;\n    lambda.length = Neq;\n    for(var i=0; i!==Neq; i++){\n        var c = equations[i];\n        lambda[i] = 0.0;\n        Bs[i] = c.computeB(h);\n        invCs[i] = 1.0 / c.computeC();\n    }\n\n    if(Neq !== 0){\n\n        // Reset vlambda\n        for(var i=0; i!==Nbodies; i++){\n            var b=bodies[i],\n                vlambda=b.vlambda,\n                wlambda=b.wlambda;\n            vlambda.set(0,0,0);\n            if(wlambda){\n                wlambda.set(0,0,0);\n            }\n        }\n\n        // Iterate over equations\n        for(iter=0; iter!==maxIter; iter++){\n\n            // Accumulate the total error for each iteration.\n            deltalambdaTot = 0.0;\n\n            for(var j=0; j!==Neq; j++){\n\n                var c = equations[j];\n\n                // Compute iteration\n                B = Bs[j];\n                invC = invCs[j];\n                lambdaj = lambda[j];\n                GWlambda = c.computeGWlambda();\n                deltalambda = invC * ( B - GWlambda - c.eps * lambdaj );\n\n                // Clamp if we are not within the min/max interval\n                if(lambdaj + deltalambda < c.minForce){\n                    deltalambda = c.minForce - lambdaj;\n                } else if(lambdaj + deltalambda > c.maxForce){\n                    deltalambda = c.maxForce - lambdaj;\n                }\n                lambda[j] += deltalambda;\n\n                deltalambdaTot += deltalambda > 0.0 ? deltalambda : -deltalambda; // abs(deltalambda)\n\n                c.addToWlambda(deltalambda);\n            }\n\n            // If the total error is small enough - stop iterate\n            if(deltalambdaTot*deltalambdaTot < tolSquared){\n                break;\n            }\n        }\n\n        // Add result to velocity\n        for(var i=0; i!==Nbodies; i++){\n            var b=bodies[i],\n                v=b.velocity,\n                w=b.angularVelocity;\n            v.vadd(b.vlambda, v);\n            if(w){\n                w.vadd(b.wlambda, w);\n            }\n        }\n    }\n\n    return iter;\n};\n\n},{\"../math/Quaternion\":28,\"../math/Vec3\":30,\"./Solver\":47}],47:[function(_dereq_,module,exports){\nmodule.exports = Solver;\n\n/**\n * Constraint equation solver base class.\n * @class Solver\n * @constructor\n * @author schteppe / https://github.com/schteppe\n */\nfunction Solver(){\n    /**\n     * All equations to be solved\n     * @property {Array} equations\n     */\n    this.equations = [];\n}\n\n/**\n * Should be implemented in subclasses!\n * @method solve\n * @param  {Number} dt\n * @param  {World} world\n */\nSolver.prototype.solve = function(dt,world){\n    // Should return the number of iterations done!\n    return 0;\n};\n\n/**\n * Add an equation\n * @method addEquation\n * @param {Equation} eq\n */\nSolver.prototype.addEquation = function(eq){\n    if (eq.enabled) {\n        this.equations.push(eq);\n    }\n};\n\n/**\n * Remove an equation\n * @method removeEquation\n * @param {Equation} eq\n */\nSolver.prototype.removeEquation = function(eq){\n    var eqs = this.equations;\n    var i = eqs.indexOf(eq);\n    if(i !== -1){\n        eqs.splice(i,1);\n    }\n};\n\n/**\n * Add all equations\n * @method removeAllEquations\n */\nSolver.prototype.removeAllEquations = function(){\n    this.equations.length = 0;\n};\n\n\n},{}],48:[function(_dereq_,module,exports){\nmodule.exports = SplitSolver;\n\nvar Vec3 = _dereq_('../math/Vec3');\nvar Quaternion = _dereq_('../math/Quaternion');\nvar Solver = _dereq_('./Solver');\nvar Body = _dereq_('../objects/Body');\n\n/**\n * Splits the equations into islands and solves them independently. Can improve performance.\n * @class SplitSolver\n * @constructor\n * @extends Solver\n * @param {Solver} subsolver\n */\nfunction SplitSolver(subsolver){\n    Solver.call(this);\n    this.iterations = 10;\n    this.tolerance = 1e-7;\n    this.subsolver = subsolver;\n    this.nodes = [];\n    this.nodePool = [];\n\n    // Create needed nodes, reuse if possible\n    while(this.nodePool.length < 128){\n        this.nodePool.push(this.createNode());\n    }\n}\nSplitSolver.prototype = new Solver();\n\n// Returns the number of subsystems\nvar SplitSolver_solve_nodes = []; // All allocated node objects\nvar SplitSolver_solve_nodePool = []; // All allocated node objects\nvar SplitSolver_solve_eqs = [];   // Temp array\nvar SplitSolver_solve_bds = [];   // Temp array\nvar SplitSolver_solve_dummyWorld = {bodies:[]}; // Temp object\n\nvar STATIC = Body.STATIC;\nfunction getUnvisitedNode(nodes){\n    var Nnodes = nodes.length;\n    for(var i=0; i!==Nnodes; i++){\n        var node = nodes[i];\n        if(!node.visited && !(node.body.type & STATIC)){\n            return node;\n        }\n    }\n    return false;\n}\n\nvar queue = [];\nfunction bfs(root,visitFunc,bds,eqs){\n    queue.push(root);\n    root.visited = true;\n    visitFunc(root,bds,eqs);\n    while(queue.length) {\n        var node = queue.pop();\n        // Loop over unvisited child nodes\n        var child;\n        while((child = getUnvisitedNode(node.children))) {\n            child.visited = true;\n            visitFunc(child,bds,eqs);\n            queue.push(child);\n        }\n    }\n}\n\nfunction visitFunc(node,bds,eqs){\n    bds.push(node.body);\n    var Neqs = node.eqs.length;\n    for(var i=0; i!==Neqs; i++){\n        var eq = node.eqs[i];\n        if(eqs.indexOf(eq) === -1){\n            eqs.push(eq);\n        }\n    }\n}\n\nSplitSolver.prototype.createNode = function(){\n    return { body:null, children:[], eqs:[], visited:false };\n};\n\n/**\n * Solve the subsystems\n * @method solve\n * @param  {Number} dt\n * @param  {World} world\n */\nSplitSolver.prototype.solve = function(dt,world){\n    var nodes=SplitSolver_solve_nodes,\n        nodePool=this.nodePool,\n        bodies=world.bodies,\n        equations=this.equations,\n        Neq=equations.length,\n        Nbodies=bodies.length,\n        subsolver=this.subsolver;\n\n    // Create needed nodes, reuse if possible\n    while(nodePool.length < Nbodies){\n        nodePool.push(this.createNode());\n    }\n    nodes.length = Nbodies;\n    for (var i = 0; i < Nbodies; i++) {\n        nodes[i] = nodePool[i];\n    }\n\n    // Reset node values\n    for(var i=0; i!==Nbodies; i++){\n        var node = nodes[i];\n        node.body = bodies[i];\n        node.children.length = 0;\n        node.eqs.length = 0;\n        node.visited = false;\n    }\n    for(var k=0; k!==Neq; k++){\n        var eq=equations[k],\n            i=bodies.indexOf(eq.bi),\n            j=bodies.indexOf(eq.bj),\n            ni=nodes[i],\n            nj=nodes[j];\n        ni.children.push(nj);\n        ni.eqs.push(eq);\n        nj.children.push(ni);\n        nj.eqs.push(eq);\n    }\n\n    var child, n=0, eqs=SplitSolver_solve_eqs;\n\n    subsolver.tolerance = this.tolerance;\n    subsolver.iterations = this.iterations;\n\n    var dummyWorld = SplitSolver_solve_dummyWorld;\n    while((child = getUnvisitedNode(nodes))){\n        eqs.length = 0;\n        dummyWorld.bodies.length = 0;\n        bfs(child, visitFunc, dummyWorld.bodies, eqs);\n\n        var Neqs = eqs.length;\n\n        eqs = eqs.sort(sortById);\n\n        for(var i=0; i!==Neqs; i++){\n            subsolver.addEquation(eqs[i]);\n        }\n\n        var iter = subsolver.solve(dt,dummyWorld);\n        subsolver.removeAllEquations();\n        n++;\n    }\n\n    return n;\n};\n\nfunction sortById(a, b){\n    return b.id - a.id;\n}\n},{\"../math/Quaternion\":28,\"../math/Vec3\":30,\"../objects/Body\":31,\"./Solver\":47}],49:[function(_dereq_,module,exports){\n/**\n * Base class for objects that dispatches events.\n * @class EventTarget\n * @constructor\n */\nvar EventTarget = function () {\n\n};\n\nmodule.exports = EventTarget;\n\nEventTarget.prototype = {\n    constructor: EventTarget,\n\n    /**\n     * Add an event listener\n     * @method addEventListener\n     * @param  {String} type\n     * @param  {Function} listener\n     * @return {EventTarget} The self object, for chainability.\n     */\n    addEventListener: function ( type, listener ) {\n        if ( this._listeners === undefined ){ this._listeners = {}; }\n        var listeners = this._listeners;\n        if ( listeners[ type ] === undefined ) {\n            listeners[ type ] = [];\n        }\n        if ( listeners[ type ].indexOf( listener ) === - 1 ) {\n            listeners[ type ].push( listener );\n        }\n        return this;\n    },\n\n    /**\n     * Check if an event listener is added\n     * @method hasEventListener\n     * @param  {String} type\n     * @param  {Function} listener\n     * @return {Boolean}\n     */\n    hasEventListener: function ( type, listener ) {\n        if ( this._listeners === undefined ){ return false; }\n        var listeners = this._listeners;\n        if ( listeners[ type ] !== undefined && listeners[ type ].indexOf( listener ) !== - 1 ) {\n            return true;\n        }\n        return false;\n    },\n\n    /**\n     * Remove an event listener\n     * @method removeEventListener\n     * @param  {String} type\n     * @param  {Function} listener\n     * @return {EventTarget} The self object, for chainability.\n     */\n    removeEventListener: function ( type, listener ) {\n        if ( this._listeners === undefined ){ return this; }\n        var listeners = this._listeners;\n        if ( listeners[type] === undefined ){ return this; }\n        var index = listeners[ type ].indexOf( listener );\n        if ( index !== - 1 ) {\n            listeners[ type ].splice( index, 1 );\n        }\n        return this;\n    },\n\n    /**\n     * Emit an event.\n     * @method dispatchEvent\n     * @param  {Object} event\n     * @param  {String} event.type\n     * @return {EventTarget} The self object, for chainability.\n     */\n    dispatchEvent: function ( event ) {\n        if ( this._listeners === undefined ){ return this; }\n        var listeners = this._listeners;\n        var listenerArray = listeners[ event.type ];\n        if ( listenerArray !== undefined ) {\n            event.target = this;\n            for ( var i = 0, l = listenerArray.length; i < l; i ++ ) {\n                listenerArray[ i ].call( this, event );\n            }\n        }\n        return this;\n    }\n};\n\n},{}],50:[function(_dereq_,module,exports){\nvar AABB = _dereq_('../collision/AABB');\nvar Vec3 = _dereq_('../math/Vec3');\n\nmodule.exports = Octree;\n\n/**\n * @class OctreeNode\n * @param {object} [options]\n * @param {Octree} [options.root]\n * @param {AABB} [options.aabb]\n */\nfunction OctreeNode(options){\n    options = options || {};\n\n    /**\n     * The root node\n     * @property {OctreeNode} root\n     */\n    this.root = options.root || null;\n\n    /**\n     * Boundary of this node\n     * @property {AABB} aabb\n     */\n    this.aabb = options.aabb ? options.aabb.clone() : new AABB();\n\n    /**\n     * Contained data at the current node level.\n     * @property {Array} data\n     */\n    this.data = [];\n\n    /**\n     * Children to this node\n     * @property {Array} children\n     */\n    this.children = [];\n}\n\n/**\n * @class Octree\n * @param {AABB} aabb The total AABB of the tree\n * @param {object} [options]\n * @param {number} [options.maxDepth=8]\n * @extends OctreeNode\n */\nfunction Octree(aabb, options){\n    options = options || {};\n    options.root = null;\n    options.aabb = aabb;\n    OctreeNode.call(this, options);\n\n    /**\n     * Maximum subdivision depth\n     * @property {number} maxDepth\n     */\n    this.maxDepth = typeof(options.maxDepth) !== 'undefined' ? options.maxDepth : 8;\n}\nOctree.prototype = new OctreeNode();\n\nOctreeNode.prototype.reset = function(aabb, options){\n    this.children.length = this.data.length = 0;\n};\n\n/**\n * Insert data into this node\n * @method insert\n * @param  {AABB} aabb\n * @param  {object} elementData\n * @return {boolean} True if successful, otherwise false\n */\nOctreeNode.prototype.insert = function(aabb, elementData, level){\n    var nodeData = this.data;\n    level = level || 0;\n\n    // Ignore objects that do not belong in this node\n    if (!this.aabb.contains(aabb)){\n        return false; // object cannot be added\n    }\n\n    var children = this.children;\n\n    if(level < (this.maxDepth || this.root.maxDepth)){\n        // Subdivide if there are no children yet\n        var subdivided = false;\n        if (!children.length){\n            this.subdivide();\n            subdivided = true;\n        }\n\n        // add to whichever node will accept it\n        for (var i = 0; i !== 8; i++) {\n            if (children[i].insert(aabb, elementData, level + 1)){\n                return true;\n            }\n        }\n\n        if(subdivided){\n            // No children accepted! Might as well just remove em since they contain none\n            children.length = 0;\n        }\n    }\n\n    // Too deep, or children didnt want it. add it in current node\n    nodeData.push(elementData);\n\n    return true;\n};\n\nvar halfDiagonal = new Vec3();\n\n/**\n * Create 8 equally sized children nodes and put them in the .children array.\n * @method subdivide\n */\nOctreeNode.prototype.subdivide = function() {\n    var aabb = this.aabb;\n    var l = aabb.lowerBound;\n    var u = aabb.upperBound;\n\n    var children = this.children;\n\n    children.push(\n        new OctreeNode({ aabb: new AABB({ lowerBound: new Vec3(0,0,0) }) }),\n        new OctreeNode({ aabb: new AABB({ lowerBound: new Vec3(1,0,0) }) }),\n        new OctreeNode({ aabb: new AABB({ lowerBound: new Vec3(1,1,0) }) }),\n        new OctreeNode({ aabb: new AABB({ lowerBound: new Vec3(1,1,1) }) }),\n        new OctreeNode({ aabb: new AABB({ lowerBound: new Vec3(0,1,1) }) }),\n        new OctreeNode({ aabb: new AABB({ lowerBound: new Vec3(0,0,1) }) }),\n        new OctreeNode({ aabb: new AABB({ lowerBound: new Vec3(1,0,1) }) }),\n        new OctreeNode({ aabb: new AABB({ lowerBound: new Vec3(0,1,0) }) })\n    );\n\n    u.vsub(l, halfDiagonal);\n    halfDiagonal.scale(0.5, halfDiagonal);\n\n    var root = this.root || this;\n\n    for (var i = 0; i !== 8; i++) {\n        var child = children[i];\n\n        // Set current node as root\n        child.root = root;\n\n        // Compute bounds\n        var lowerBound = child.aabb.lowerBound;\n        lowerBound.x *= halfDiagonal.x;\n        lowerBound.y *= halfDiagonal.y;\n        lowerBound.z *= halfDiagonal.z;\n\n        lowerBound.vadd(l, lowerBound);\n\n        // Upper bound is always lower bound + halfDiagonal\n        lowerBound.vadd(halfDiagonal, child.aabb.upperBound);\n    }\n};\n\n/**\n * Get all data, potentially within an AABB\n * @method aabbQuery\n * @param  {AABB} aabb\n * @param  {array} result\n * @return {array} The \"result\" object\n */\nOctreeNode.prototype.aabbQuery = function(aabb, result) {\n\n    var nodeData = this.data;\n\n    // abort if the range does not intersect this node\n    // if (!this.aabb.overlaps(aabb)){\n    //     return result;\n    // }\n\n    // Add objects at this level\n    // Array.prototype.push.apply(result, nodeData);\n\n    // Add child data\n    // @todo unwrap recursion into a queue / loop, that's faster in JS\n    var children = this.children;\n\n\n    // for (var i = 0, N = this.children.length; i !== N; i++) {\n    //     children[i].aabbQuery(aabb, result);\n    // }\n\n    var queue = [this];\n    while (queue.length) {\n        var node = queue.pop();\n        if (node.aabb.overlaps(aabb)){\n            Array.prototype.push.apply(result, node.data);\n        }\n        Array.prototype.push.apply(queue, node.children);\n    }\n\n    return result;\n};\n\nvar tmpAABB = new AABB();\n\n/**\n * Get all data, potentially intersected by a ray.\n * @method rayQuery\n * @param  {Ray} ray\n * @param  {Transform} treeTransform\n * @param  {array} result\n * @return {array} The \"result\" object\n */\nOctreeNode.prototype.rayQuery = function(ray, treeTransform, result) {\n\n    // Use aabb query for now.\n    // @todo implement real ray query which needs less lookups\n    ray.getAABB(tmpAABB);\n    tmpAABB.toLocalFrame(treeTransform, tmpAABB);\n    this.aabbQuery(tmpAABB, result);\n\n    return result;\n};\n\n/**\n * @method removeEmptyNodes\n */\nOctreeNode.prototype.removeEmptyNodes = function() {\n    var queue = [this];\n    while (queue.length) {\n        var node = queue.pop();\n        for (var i = node.children.length - 1; i >= 0; i--) {\n            if(!node.children[i].data.length){\n                node.children.splice(i, 1);\n            }\n        }\n        Array.prototype.push.apply(queue, node.children);\n    }\n};\n\n},{\"../collision/AABB\":3,\"../math/Vec3\":30}],51:[function(_dereq_,module,exports){\nmodule.exports = Pool;\n\n/**\n * For pooling objects that can be reused.\n * @class Pool\n * @constructor\n */\nfunction Pool(){\n    /**\n     * The pooled objects\n     * @property {Array} objects\n     */\n    this.objects = [];\n\n    /**\n     * Constructor of the objects\n     * @property {mixed} type\n     */\n    this.type = Object;\n}\n\n/**\n * Release an object after use\n * @method release\n * @param {Object} obj\n */\nPool.prototype.release = function(){\n    var Nargs = arguments.length;\n    for(var i=0; i!==Nargs; i++){\n        this.objects.push(arguments[i]);\n    }\n};\n\n/**\n * Get an object\n * @method get\n * @return {mixed}\n */\nPool.prototype.get = function(){\n    if(this.objects.length===0){\n        return this.constructObject();\n    } else {\n        return this.objects.pop();\n    }\n};\n\n/**\n * Construct an object. Should be implmented in each subclass.\n * @method constructObject\n * @return {mixed}\n */\nPool.prototype.constructObject = function(){\n    throw new Error(\"constructObject() not implemented in this Pool subclass yet!\");\n};\n\n},{}],52:[function(_dereq_,module,exports){\nmodule.exports = TupleDictionary;\n\n/**\n * @class TupleDictionary\n * @constructor\n */\nfunction TupleDictionary() {\n\n    /**\n     * The data storage\n     * @property data\n     * @type {Object}\n     */\n    this.data = { keys:[] };\n}\n\n/**\n * @method get\n * @param  {Number} i\n * @param  {Number} j\n * @return {Number}\n */\nTupleDictionary.prototype.get = function(i, j) {\n    if (i > j) {\n        // swap\n        var temp = j;\n        j = i;\n        i = temp;\n    }\n    return this.data[i+'-'+j];\n};\n\n/**\n * @method set\n * @param  {Number} i\n * @param  {Number} j\n * @param {Number} value\n */\nTupleDictionary.prototype.set = function(i, j, value) {\n    if (i > j) {\n        var temp = j;\n        j = i;\n        i = temp;\n    }\n    var key = i+'-'+j;\n\n    // Check if key already exists\n    if(!this.get(i,j)){\n        this.data.keys.push(key);\n    }\n\n    this.data[key] = value;\n};\n\n/**\n * @method reset\n */\nTupleDictionary.prototype.reset = function() {\n    var data = this.data,\n        keys = data.keys;\n    while(keys.length > 0){\n        var key = keys.pop();\n        delete data[key];\n    }\n};\n\n},{}],53:[function(_dereq_,module,exports){\nfunction Utils(){}\n\nmodule.exports = Utils;\n\n/**\n * Extend an options object with default values.\n * @static\n * @method defaults\n * @param  {object} options The options object. May be falsy: in this case, a new object is created and returned.\n * @param  {object} defaults An object containing default values.\n * @return {object} The modified options object.\n */\nUtils.defaults = function(options, defaults){\n    options = options || {};\n\n    for(var key in defaults){\n        if(!(key in options)){\n            options[key] = defaults[key];\n        }\n    }\n\n    return options;\n};\n\n},{}],54:[function(_dereq_,module,exports){\nmodule.exports = Vec3Pool;\n\nvar Vec3 = _dereq_('../math/Vec3');\nvar Pool = _dereq_('./Pool');\n\n/**\n * @class Vec3Pool\n * @constructor\n * @extends Pool\n */\nfunction Vec3Pool(){\n    Pool.call(this);\n    this.type = Vec3;\n}\nVec3Pool.prototype = new Pool();\n\n/**\n * Construct a vector\n * @method constructObject\n * @return {Vec3}\n */\nVec3Pool.prototype.constructObject = function(){\n    return new Vec3();\n};\n\n},{\"../math/Vec3\":30,\"./Pool\":51}],55:[function(_dereq_,module,exports){\nmodule.exports = Narrowphase;\n\nvar AABB = _dereq_('../collision/AABB');\nvar Shape = _dereq_('../shapes/Shape');\nvar Ray = _dereq_('../collision/Ray');\nvar Vec3 = _dereq_('../math/Vec3');\nvar Transform = _dereq_('../math/Transform');\nvar ConvexPolyhedron = _dereq_('../shapes/ConvexPolyhedron');\nvar Quaternion = _dereq_('../math/Quaternion');\nvar Solver = _dereq_('../solver/Solver');\nvar Vec3Pool = _dereq_('../utils/Vec3Pool');\nvar ContactEquation = _dereq_('../equations/ContactEquation');\nvar FrictionEquation = _dereq_('../equations/FrictionEquation');\n\n/**\n * Helper class for the World. Generates ContactEquations.\n * @class Narrowphase\n * @constructor\n * @todo Sphere-ConvexPolyhedron contacts\n * @todo Contact reduction\n * @todo  should move methods to prototype\n */\nfunction Narrowphase(world){\n\n    /**\n     * Internal storage of pooled contact points.\n     * @property {Array} contactPointPool\n     */\n    this.contactPointPool = [];\n\n    this.frictionEquationPool = [];\n\n    this.result = [];\n    this.frictionResult = [];\n\n    /**\n     * Pooled vectors.\n     * @property {Vec3Pool} v3pool\n     */\n    this.v3pool = new Vec3Pool();\n\n    this.world = world;\n    this.currentContactMaterial = null;\n\n    /**\n     * @property {Boolean} enableFrictionReduction\n     */\n    this.enableFrictionReduction = false;\n}\n\n/**\n * Make a contact object, by using the internal pool or creating a new one.\n * @method createContactEquation\n * @return {ContactEquation}\n */\nNarrowphase.prototype.createContactEquation = function(bi, bj, si, sj, rsi, rsj){\n    var c;\n    if(this.contactPointPool.length){\n        c = this.contactPointPool.pop();\n        c.bi = bi;\n        c.bj = bj;\n    } else {\n        c = new ContactEquation(bi, bj);\n    }\n\n    c.enabled = bi.collisionResponse && bj.collisionResponse && si.collisionResponse && sj.collisionResponse;\n\n    var cm = this.currentContactMaterial;\n\n    c.restitution = cm.restitution;\n\n    c.setSpookParams(\n        cm.contactEquationStiffness,\n        cm.contactEquationRelaxation,\n        this.world.dt\n    );\n\n    var matA = si.material || bi.material;\n    var matB = sj.material || bj.material;\n    if(matA && matB && matA.restitution >= 0 && matB.restitution >= 0){\n        c.restitution = matA.restitution * matB.restitution;\n    }\n\n    c.si = rsi || si;\n    c.sj = rsj || sj;\n\n    return c;\n};\n\nNarrowphase.prototype.createFrictionEquationsFromContact = function(contactEquation, outArray){\n    var bodyA = contactEquation.bi;\n    var bodyB = contactEquation.bj;\n    var shapeA = contactEquation.si;\n    var shapeB = contactEquation.sj;\n\n    var world = this.world;\n    var cm = this.currentContactMaterial;\n\n    // If friction or restitution were specified in the material, use them\n    var friction = cm.friction;\n    var matA = shapeA.material || bodyA.material;\n    var matB = shapeB.material || bodyB.material;\n    if(matA && matB && matA.friction >= 0 && matB.friction >= 0){\n        friction = matA.friction * matB.friction;\n    }\n\n    if(friction > 0){\n\n        // Create 2 tangent equations\n        var mug = friction * world.gravity.length();\n        var reducedMass = (bodyA.invMass + bodyB.invMass);\n        if(reducedMass > 0){\n            reducedMass = 1/reducedMass;\n        }\n        var pool = this.frictionEquationPool;\n        var c1 = pool.length ? pool.pop() : new FrictionEquation(bodyA,bodyB,mug*reducedMass);\n        var c2 = pool.length ? pool.pop() : new FrictionEquation(bodyA,bodyB,mug*reducedMass);\n\n        c1.bi = c2.bi = bodyA;\n        c1.bj = c2.bj = bodyB;\n        c1.minForce = c2.minForce = -mug*reducedMass;\n        c1.maxForce = c2.maxForce = mug*reducedMass;\n\n        // Copy over the relative vectors\n        c1.ri.copy(contactEquation.ri);\n        c1.rj.copy(contactEquation.rj);\n        c2.ri.copy(contactEquation.ri);\n        c2.rj.copy(contactEquation.rj);\n\n        // Construct tangents\n        contactEquation.ni.tangents(c1.t, c2.t);\n\n        // Set spook params\n        c1.setSpookParams(cm.frictionEquationStiffness, cm.frictionEquationRelaxation, world.dt);\n        c2.setSpookParams(cm.frictionEquationStiffness, cm.frictionEquationRelaxation, world.dt);\n\n        c1.enabled = c2.enabled = contactEquation.enabled;\n\n        outArray.push(c1, c2);\n\n        return true;\n    }\n\n    return false;\n};\n\nvar averageNormal = new Vec3();\nvar averageContactPointA = new Vec3();\nvar averageContactPointB = new Vec3();\n\n// Take the average N latest contact point on the plane.\nNarrowphase.prototype.createFrictionFromAverage = function(numContacts){\n    // The last contactEquation\n    var c = this.result[this.result.length - 1];\n\n    // Create the result: two \"average\" friction equations\n    if (!this.createFrictionEquationsFromContact(c, this.frictionResult) || numContacts === 1) {\n        return;\n    }\n\n    var f1 = this.frictionResult[this.frictionResult.length - 2];\n    var f2 = this.frictionResult[this.frictionResult.length - 1];\n\n    averageNormal.setZero();\n    averageContactPointA.setZero();\n    averageContactPointB.setZero();\n\n    var bodyA = c.bi;\n    var bodyB = c.bj;\n    for(var i=0; i!==numContacts; i++){\n        c = this.result[this.result.length - 1 - i];\n        if(c.bodyA !== bodyA){\n            averageNormal.vadd(c.ni, averageNormal); // vec2.add(eq.t, eq.t, c.normalA);\n            averageContactPointA.vadd(c.ri, averageContactPointA); // vec2.add(eq.contactPointA, eq.contactPointA, c.contactPointA);\n            averageContactPointB.vadd(c.rj, averageContactPointB);\n        } else {\n            averageNormal.vsub(c.ni, averageNormal); // vec2.sub(eq.t, eq.t, c.normalA);\n            averageContactPointA.vadd(c.rj, averageContactPointA); // vec2.add(eq.contactPointA, eq.contactPointA, c.contactPointA);\n            averageContactPointB.vadd(c.ri, averageContactPointB);\n        }\n    }\n\n    var invNumContacts = 1 / numContacts;\n    averageContactPointA.scale(invNumContacts, f1.ri); // vec2.scale(eq.contactPointA, eq.contactPointA, invNumContacts);\n    averageContactPointB.scale(invNumContacts, f1.rj); // vec2.scale(eq.contactPointB, eq.contactPointB, invNumContacts);\n    f2.ri.copy(f1.ri); // Should be the same\n    f2.rj.copy(f1.rj);\n    averageNormal.normalize();\n    averageNormal.tangents(f1.t, f2.t);\n    // return eq;\n};\n\n\nvar tmpVec1 = new Vec3();\nvar tmpVec2 = new Vec3();\nvar tmpQuat1 = new Quaternion();\nvar tmpQuat2 = new Quaternion();\n\n/**\n * Generate all contacts between a list of body pairs\n * @method getContacts\n * @param {array} p1 Array of body indices\n * @param {array} p2 Array of body indices\n * @param {World} world\n * @param {array} result Array to store generated contacts\n * @param {array} oldcontacts Optional. Array of reusable contact objects\n */\nNarrowphase.prototype.getContacts = function(p1, p2, world, result, oldcontacts, frictionResult, frictionPool){\n    // Save old contact objects\n    this.contactPointPool = oldcontacts;\n    this.frictionEquationPool = frictionPool;\n    this.result = result;\n    this.frictionResult = frictionResult;\n\n    var qi = tmpQuat1;\n    var qj = tmpQuat2;\n    var xi = tmpVec1;\n    var xj = tmpVec2;\n\n    for(var k=0, N=p1.length; k!==N; k++){\n\n        // Get current collision bodies\n        var bi = p1[k],\n            bj = p2[k];\n\n        // Get contact material\n        var bodyContactMaterial = null;\n        if(bi.material && bj.material){\n            bodyContactMaterial = world.getContactMaterial(bi.material,bj.material) || null;\n        }\n\n        for (var i = 0; i < bi.shapes.length; i++) {\n            bi.quaternion.mult(bi.shapeOrientations[i], qi);\n            bi.quaternion.vmult(bi.shapeOffsets[i], xi);\n            xi.vadd(bi.position, xi);\n            var si = bi.shapes[i];\n\n            for (var j = 0; j < bj.shapes.length; j++) {\n\n                // Compute world transform of shapes\n                bj.quaternion.mult(bj.shapeOrientations[j], qj);\n                bj.quaternion.vmult(bj.shapeOffsets[j], xj);\n                xj.vadd(bj.position, xj);\n                var sj = bj.shapes[j];\n\n                if(xi.distanceTo(xj) > si.boundingSphereRadius + sj.boundingSphereRadius){\n                    continue;\n                }\n\n                // Get collision material\n                var shapeContactMaterial = null;\n                if(si.material && sj.material){\n                    shapeContactMaterial = world.getContactMaterial(si.material,sj.material) || null;\n                }\n\n                this.currentContactMaterial = shapeContactMaterial || bodyContactMaterial || world.defaultContactMaterial;\n\n                // Get contacts\n                var resolver = this[si.type | sj.type];\n                if(resolver){\n                    if (si.type < sj.type) {\n                        resolver.call(this, si, sj, xi, xj, qi, qj, bi, bj, si, sj);\n                    } else {\n                        resolver.call(this, sj, si, xj, xi, qj, qi, bj, bi, si, sj);\n                    }\n                }\n            }\n        }\n    }\n};\n\nvar numWarnings = 0;\nvar maxWarnings = 10;\n\nfunction warn(msg){\n    if(numWarnings > maxWarnings){\n        return;\n    }\n\n    numWarnings++;\n\n    console.warn(msg);\n}\n\nNarrowphase.prototype[Shape.types.BOX | Shape.types.BOX] =\nNarrowphase.prototype.boxBox = function(si,sj,xi,xj,qi,qj,bi,bj){\n    si.convexPolyhedronRepresentation.material = si.material;\n    sj.convexPolyhedronRepresentation.material = sj.material;\n    si.convexPolyhedronRepresentation.collisionResponse = si.collisionResponse;\n    sj.convexPolyhedronRepresentation.collisionResponse = sj.collisionResponse;\n    this.convexConvex(si.convexPolyhedronRepresentation,sj.convexPolyhedronRepresentation,xi,xj,qi,qj,bi,bj,si,sj);\n};\n\nNarrowphase.prototype[Shape.types.BOX | Shape.types.CONVEXPOLYHEDRON] =\nNarrowphase.prototype.boxConvex = function(si,sj,xi,xj,qi,qj,bi,bj){\n    si.convexPolyhedronRepresentation.material = si.material;\n    si.convexPolyhedronRepresentation.collisionResponse = si.collisionResponse;\n    this.convexConvex(si.convexPolyhedronRepresentation,sj,xi,xj,qi,qj,bi,bj,si,sj);\n};\n\nNarrowphase.prototype[Shape.types.BOX | Shape.types.PARTICLE] =\nNarrowphase.prototype.boxParticle = function(si,sj,xi,xj,qi,qj,bi,bj){\n    si.convexPolyhedronRepresentation.material = si.material;\n    si.convexPolyhedronRepresentation.collisionResponse = si.collisionResponse;\n    this.convexParticle(si.convexPolyhedronRepresentation,sj,xi,xj,qi,qj,bi,bj,si,sj);\n};\n\n/**\n * @method sphereSphere\n * @param  {Shape}      si\n * @param  {Shape}      sj\n * @param  {Vec3}       xi\n * @param  {Vec3}       xj\n * @param  {Quaternion} qi\n * @param  {Quaternion} qj\n * @param  {Body}       bi\n * @param  {Body}       bj\n */\nNarrowphase.prototype[Shape.types.SPHERE] =\nNarrowphase.prototype.sphereSphere = function(si,sj,xi,xj,qi,qj,bi,bj){\n    // We will have only one contact in this case\n    var r = this.createContactEquation(bi,bj,si,sj);\n\n    // Contact normal\n    xj.vsub(xi, r.ni);\n    r.ni.normalize();\n\n    // Contact point locations\n    r.ri.copy(r.ni);\n    r.rj.copy(r.ni);\n    r.ri.mult(si.radius, r.ri);\n    r.rj.mult(-sj.radius, r.rj);\n\n    r.ri.vadd(xi, r.ri);\n    r.ri.vsub(bi.position, r.ri);\n\n    r.rj.vadd(xj, r.rj);\n    r.rj.vsub(bj.position, r.rj);\n\n    this.result.push(r);\n\n    this.createFrictionEquationsFromContact(r, this.frictionResult);\n};\n\n/**\n * @method planeTrimesh\n * @param  {Shape}      si\n * @param  {Shape}      sj\n * @param  {Vec3}       xi\n * @param  {Vec3}       xj\n * @param  {Quaternion} qi\n * @param  {Quaternion} qj\n * @param  {Body}       bi\n * @param  {Body}       bj\n */\nvar planeTrimesh_normal = new Vec3();\nvar planeTrimesh_relpos = new Vec3();\nvar planeTrimesh_projected = new Vec3();\nNarrowphase.prototype[Shape.types.PLANE | Shape.types.TRIMESH] =\nNarrowphase.prototype.planeTrimesh = function(\n    planeShape,\n    trimeshShape,\n    planePos,\n    trimeshPos,\n    planeQuat,\n    trimeshQuat,\n    planeBody,\n    trimeshBody\n){\n    // Make contacts!\n    var v = new Vec3();\n\n    var normal = planeTrimesh_normal;\n    normal.set(0,0,1);\n    planeQuat.vmult(normal,normal); // Turn normal according to plane\n\n    for(var i=0; i<trimeshShape.vertices.length / 3; i++){\n\n        // Get world vertex from trimesh\n        trimeshShape.getVertex(i, v);\n\n        // Safe up\n        var v2 = new Vec3();\n        v2.copy(v);\n        Transform.pointToWorldFrame(trimeshPos, trimeshQuat, v2, v);\n\n        // Check plane side\n        var relpos = planeTrimesh_relpos;\n        v.vsub(planePos, relpos);\n        var dot = normal.dot(relpos);\n\n        if(dot <= 0.0){\n            var r = this.createContactEquation(planeBody,trimeshBody,planeShape,trimeshShape);\n\n            r.ni.copy(normal); // Contact normal is the plane normal\n\n            // Get vertex position projected on plane\n            var projected = planeTrimesh_projected;\n            normal.scale(relpos.dot(normal), projected);\n            v.vsub(projected,projected);\n\n            // ri is the projected world position minus plane position\n            r.ri.copy(projected);\n            r.ri.vsub(planeBody.position, r.ri);\n\n            r.rj.copy(v);\n            r.rj.vsub(trimeshBody.position, r.rj);\n\n            // Store result\n            this.result.push(r);\n            this.createFrictionEquationsFromContact(r, this.frictionResult);\n        }\n    }\n};\n\n/**\n * @method sphereTrimesh\n * @param  {Shape}      sphereShape\n * @param  {Shape}      trimeshShape\n * @param  {Vec3}       spherePos\n * @param  {Vec3}       trimeshPos\n * @param  {Quaternion} sphereQuat\n * @param  {Quaternion} trimeshQuat\n * @param  {Body}       sphereBody\n * @param  {Body}       trimeshBody\n */\nvar sphereTrimesh_normal = new Vec3();\nvar sphereTrimesh_relpos = new Vec3();\nvar sphereTrimesh_projected = new Vec3();\nvar sphereTrimesh_v = new Vec3();\nvar sphereTrimesh_v2 = new Vec3();\nvar sphereTrimesh_edgeVertexA = new Vec3();\nvar sphereTrimesh_edgeVertexB = new Vec3();\nvar sphereTrimesh_edgeVector = new Vec3();\nvar sphereTrimesh_edgeVectorUnit = new Vec3();\nvar sphereTrimesh_localSpherePos = new Vec3();\nvar sphereTrimesh_tmp = new Vec3();\nvar sphereTrimesh_va = new Vec3();\nvar sphereTrimesh_vb = new Vec3();\nvar sphereTrimesh_vc = new Vec3();\nvar sphereTrimesh_localSphereAABB = new AABB();\nvar sphereTrimesh_triangles = [];\nNarrowphase.prototype[Shape.types.SPHERE | Shape.types.TRIMESH] =\nNarrowphase.prototype.sphereTrimesh = function (\n    sphereShape,\n    trimeshShape,\n    spherePos,\n    trimeshPos,\n    sphereQuat,\n    trimeshQuat,\n    sphereBody,\n    trimeshBody\n) {\n\n    var edgeVertexA = sphereTrimesh_edgeVertexA;\n    var edgeVertexB = sphereTrimesh_edgeVertexB;\n    var edgeVector = sphereTrimesh_edgeVector;\n    var edgeVectorUnit = sphereTrimesh_edgeVectorUnit;\n    var localSpherePos = sphereTrimesh_localSpherePos;\n    var tmp = sphereTrimesh_tmp;\n    var localSphereAABB = sphereTrimesh_localSphereAABB;\n    var v2 = sphereTrimesh_v2;\n    var relpos = sphereTrimesh_relpos;\n    var triangles = sphereTrimesh_triangles;\n\n    // Convert sphere position to local in the trimesh\n    Transform.pointToLocalFrame(trimeshPos, trimeshQuat, spherePos, localSpherePos);\n\n    // Get the aabb of the sphere locally in the trimesh\n    var sphereRadius = sphereShape.radius;\n    localSphereAABB.lowerBound.set(\n        localSpherePos.x - sphereRadius,\n        localSpherePos.y - sphereRadius,\n        localSpherePos.z - sphereRadius\n    );\n    localSphereAABB.upperBound.set(\n        localSpherePos.x + sphereRadius,\n        localSpherePos.y + sphereRadius,\n        localSpherePos.z + sphereRadius\n    );\n\n    trimeshShape.getTrianglesInAABB(localSphereAABB, triangles);\n    //for (var i = 0; i < trimeshShape.indices.length / 3; i++) triangles.push(i); // All\n\n    // Vertices\n    var v = sphereTrimesh_v;\n    var radiusSquared = sphereShape.radius * sphereShape.radius;\n    for(var i=0; i<triangles.length; i++){\n        for (var j = 0; j < 3; j++) {\n\n            trimeshShape.getVertex(trimeshShape.indices[triangles[i] * 3 + j], v);\n\n            // Check vertex overlap in sphere\n            v.vsub(localSpherePos, relpos);\n\n            if(relpos.norm2() <= radiusSquared){\n\n                // Safe up\n                v2.copy(v);\n                Transform.pointToWorldFrame(trimeshPos, trimeshQuat, v2, v);\n\n                v.vsub(spherePos, relpos);\n\n                var r = this.createContactEquation(sphereBody,trimeshBody,sphereShape,trimeshShape);\n                r.ni.copy(relpos);\n                r.ni.normalize();\n\n                // ri is the vector from sphere center to the sphere surface\n                r.ri.copy(r.ni);\n                r.ri.scale(sphereShape.radius, r.ri);\n                r.ri.vadd(spherePos, r.ri);\n                r.ri.vsub(sphereBody.position, r.ri);\n\n                r.rj.copy(v);\n                r.rj.vsub(trimeshBody.position, r.rj);\n\n                // Store result\n                this.result.push(r);\n                this.createFrictionEquationsFromContact(r, this.frictionResult);\n            }\n        }\n    }\n\n    // Check all edges\n    for(var i=0; i<triangles.length; i++){\n        for (var j = 0; j < 3; j++) {\n\n            trimeshShape.getVertex(trimeshShape.indices[triangles[i] * 3 + j], edgeVertexA);\n            trimeshShape.getVertex(trimeshShape.indices[triangles[i] * 3 + ((j+1)%3)], edgeVertexB);\n            edgeVertexB.vsub(edgeVertexA, edgeVector);\n\n            // Project sphere position to the edge\n            localSpherePos.vsub(edgeVertexB, tmp);\n            var positionAlongEdgeB = tmp.dot(edgeVector);\n\n            localSpherePos.vsub(edgeVertexA, tmp);\n            var positionAlongEdgeA = tmp.dot(edgeVector);\n\n            if(positionAlongEdgeA > 0 && positionAlongEdgeB < 0){\n\n                // Now check the orthogonal distance from edge to sphere center\n                localSpherePos.vsub(edgeVertexA, tmp);\n\n                edgeVectorUnit.copy(edgeVector);\n                edgeVectorUnit.normalize();\n                positionAlongEdgeA = tmp.dot(edgeVectorUnit);\n\n                edgeVectorUnit.scale(positionAlongEdgeA, tmp);\n                tmp.vadd(edgeVertexA, tmp);\n\n                // tmp is now the sphere center position projected to the edge, defined locally in the trimesh frame\n                var dist = tmp.distanceTo(localSpherePos);\n                if(dist < sphereShape.radius){\n                    var r = this.createContactEquation(sphereBody, trimeshBody, sphereShape, trimeshShape);\n\n                    tmp.vsub(localSpherePos, r.ni);\n                    r.ni.normalize();\n                    r.ni.scale(sphereShape.radius, r.ri);\n\n                    Transform.pointToWorldFrame(trimeshPos, trimeshQuat, tmp, tmp);\n                    tmp.vsub(trimeshBody.position, r.rj);\n\n                    Transform.vectorToWorldFrame(trimeshQuat, r.ni, r.ni);\n                    Transform.vectorToWorldFrame(trimeshQuat, r.ri, r.ri);\n\n                    this.result.push(r);\n                    this.createFrictionEquationsFromContact(r, this.frictionResult);\n                }\n            }\n        }\n    }\n\n    // Triangle faces\n    var va = sphereTrimesh_va;\n    var vb = sphereTrimesh_vb;\n    var vc = sphereTrimesh_vc;\n    var normal = sphereTrimesh_normal;\n    for(var i=0, N = triangles.length; i !== N; i++){\n        trimeshShape.getTriangleVertices(triangles[i], va, vb, vc);\n        trimeshShape.getNormal(triangles[i], normal);\n        localSpherePos.vsub(va, tmp);\n        var dist = tmp.dot(normal);\n        normal.scale(dist, tmp);\n        localSpherePos.vsub(tmp, tmp);\n\n        // tmp is now the sphere position projected to the triangle plane\n        dist = tmp.distanceTo(localSpherePos);\n        if(Ray.pointInTriangle(tmp, va, vb, vc) && dist < sphereShape.radius){\n            var r = this.createContactEquation(sphereBody, trimeshBody, sphereShape, trimeshShape);\n\n            tmp.vsub(localSpherePos, r.ni);\n            r.ni.normalize();\n            r.ni.scale(sphereShape.radius, r.ri);\n\n            Transform.pointToWorldFrame(trimeshPos, trimeshQuat, tmp, tmp);\n            tmp.vsub(trimeshBody.position, r.rj);\n\n            Transform.vectorToWorldFrame(trimeshQuat, r.ni, r.ni);\n            Transform.vectorToWorldFrame(trimeshQuat, r.ri, r.ri);\n\n            this.result.push(r);\n            this.createFrictionEquationsFromContact(r, this.frictionResult);\n        }\n    }\n\n    triangles.length = 0;\n};\n\nvar point_on_plane_to_sphere = new Vec3();\nvar plane_to_sphere_ortho = new Vec3();\n\n/**\n * @method spherePlane\n * @param  {Shape}      si\n * @param  {Shape}      sj\n * @param  {Vec3}       xi\n * @param  {Vec3}       xj\n * @param  {Quaternion} qi\n * @param  {Quaternion} qj\n * @param  {Body}       bi\n * @param  {Body}       bj\n */\nNarrowphase.prototype[Shape.types.SPHERE | Shape.types.PLANE] =\nNarrowphase.prototype.spherePlane = function(si,sj,xi,xj,qi,qj,bi,bj){\n    // We will have one contact in this case\n    var r = this.createContactEquation(bi,bj,si,sj);\n\n    // Contact normal\n    r.ni.set(0,0,1);\n    qj.vmult(r.ni, r.ni);\n    r.ni.negate(r.ni); // body i is the sphere, flip normal\n    r.ni.normalize(); // Needed?\n\n    // Vector from sphere center to contact point\n    r.ni.mult(si.radius, r.ri);\n\n    // Project down sphere on plane\n    xi.vsub(xj, point_on_plane_to_sphere);\n    r.ni.mult(r.ni.dot(point_on_plane_to_sphere), plane_to_sphere_ortho);\n    point_on_plane_to_sphere.vsub(plane_to_sphere_ortho,r.rj); // The sphere position projected to plane\n\n    if(-point_on_plane_to_sphere.dot(r.ni) <= si.radius){\n\n        // Make it relative to the body\n        var ri = r.ri;\n        var rj = r.rj;\n        ri.vadd(xi, ri);\n        ri.vsub(bi.position, ri);\n        rj.vadd(xj, rj);\n        rj.vsub(bj.position, rj);\n\n        this.result.push(r);\n        this.createFrictionEquationsFromContact(r, this.frictionResult);\n    }\n};\n\n// See http://bulletphysics.com/Bullet/BulletFull/SphereTriangleDetector_8cpp_source.html\nvar pointInPolygon_edge = new Vec3();\nvar pointInPolygon_edge_x_normal = new Vec3();\nvar pointInPolygon_vtp = new Vec3();\nfunction pointInPolygon(verts, normal, p){\n    var positiveResult = null;\n    var N = verts.length;\n    for(var i=0; i!==N; i++){\n        var v = verts[i];\n\n        // Get edge to the next vertex\n        var edge = pointInPolygon_edge;\n        verts[(i+1) % (N)].vsub(v,edge);\n\n        // Get cross product between polygon normal and the edge\n        var edge_x_normal = pointInPolygon_edge_x_normal;\n        //var edge_x_normal = new Vec3();\n        edge.cross(normal,edge_x_normal);\n\n        // Get vector between point and current vertex\n        var vertex_to_p = pointInPolygon_vtp;\n        p.vsub(v,vertex_to_p);\n\n        // This dot product determines which side of the edge the point is\n        var r = edge_x_normal.dot(vertex_to_p);\n\n        // If all such dot products have same sign, we are inside the polygon.\n        if(positiveResult===null || (r>0 && positiveResult===true) || (r<=0 && positiveResult===false)){\n            if(positiveResult===null){\n                positiveResult = r>0;\n            }\n            continue;\n        } else {\n            return false; // Encountered some other sign. Exit.\n        }\n    }\n\n    // If we got here, all dot products were of the same sign.\n    return true;\n}\n\nvar box_to_sphere = new Vec3();\nvar sphereBox_ns = new Vec3();\nvar sphereBox_ns1 = new Vec3();\nvar sphereBox_ns2 = new Vec3();\nvar sphereBox_sides = [new Vec3(),new Vec3(),new Vec3(),new Vec3(),new Vec3(),new Vec3()];\nvar sphereBox_sphere_to_corner = new Vec3();\nvar sphereBox_side_ns = new Vec3();\nvar sphereBox_side_ns1 = new Vec3();\nvar sphereBox_side_ns2 = new Vec3();\n\n/**\n * @method sphereBox\n * @param  {Shape}      si\n * @param  {Shape}      sj\n * @param  {Vec3}       xi\n * @param  {Vec3}       xj\n * @param  {Quaternion} qi\n * @param  {Quaternion} qj\n * @param  {Body}       bi\n * @param  {Body}       bj\n */\nNarrowphase.prototype[Shape.types.SPHERE | Shape.types.BOX] =\nNarrowphase.prototype.sphereBox = function(si,sj,xi,xj,qi,qj,bi,bj){\n    var v3pool = this.v3pool;\n\n    // we refer to the box as body j\n    var sides = sphereBox_sides;\n    xi.vsub(xj,box_to_sphere);\n    sj.getSideNormals(sides,qj);\n    var R =     si.radius;\n    var penetrating_sides = [];\n\n    // Check side (plane) intersections\n    var found = false;\n\n    // Store the resulting side penetration info\n    var side_ns = sphereBox_side_ns;\n    var side_ns1 = sphereBox_side_ns1;\n    var side_ns2 = sphereBox_side_ns2;\n    var side_h = null;\n    var side_penetrations = 0;\n    var side_dot1 = 0;\n    var side_dot2 = 0;\n    var side_distance = null;\n    for(var idx=0,nsides=sides.length; idx!==nsides && found===false; idx++){\n        // Get the plane side normal (ns)\n        var ns = sphereBox_ns;\n        ns.copy(sides[idx]);\n\n        var h = ns.norm();\n        ns.normalize();\n\n        // The normal/distance dot product tells which side of the plane we are\n        var dot = box_to_sphere.dot(ns);\n\n        if(dot<h+R && dot>0){\n            // Intersects plane. Now check the other two dimensions\n            var ns1 = sphereBox_ns1;\n            var ns2 = sphereBox_ns2;\n            ns1.copy(sides[(idx+1)%3]);\n            ns2.copy(sides[(idx+2)%3]);\n            var h1 = ns1.norm();\n            var h2 = ns2.norm();\n            ns1.normalize();\n            ns2.normalize();\n            var dot1 = box_to_sphere.dot(ns1);\n            var dot2 = box_to_sphere.dot(ns2);\n            if(dot1<h1 && dot1>-h1 && dot2<h2 && dot2>-h2){\n                var dist = Math.abs(dot-h-R);\n                if(side_distance===null || dist < side_distance){\n                    side_distance = dist;\n                    side_dot1 = dot1;\n                    side_dot2 = dot2;\n                    side_h = h;\n                    side_ns.copy(ns);\n                    side_ns1.copy(ns1);\n                    side_ns2.copy(ns2);\n                    side_penetrations++;\n                }\n            }\n        }\n    }\n    if(side_penetrations){\n        found = true;\n        var r = this.createContactEquation(bi,bj,si,sj);\n        side_ns.mult(-R,r.ri); // Sphere r\n        r.ni.copy(side_ns);\n        r.ni.negate(r.ni); // Normal should be out of sphere\n        side_ns.mult(side_h,side_ns);\n        side_ns1.mult(side_dot1,side_ns1);\n        side_ns.vadd(side_ns1,side_ns);\n        side_ns2.mult(side_dot2,side_ns2);\n        side_ns.vadd(side_ns2,r.rj);\n\n        // Make relative to bodies\n        r.ri.vadd(xi, r.ri);\n        r.ri.vsub(bi.position, r.ri);\n        r.rj.vadd(xj, r.rj);\n        r.rj.vsub(bj.position, r.rj);\n\n        this.result.push(r);\n        this.createFrictionEquationsFromContact(r, this.frictionResult);\n    }\n\n    // Check corners\n    var rj = v3pool.get();\n    var sphere_to_corner = sphereBox_sphere_to_corner;\n    for(var j=0; j!==2 && !found; j++){\n        for(var k=0; k!==2 && !found; k++){\n            for(var l=0; l!==2 && !found; l++){\n                rj.set(0,0,0);\n                if(j){\n                    rj.vadd(sides[0],rj);\n                } else {\n                    rj.vsub(sides[0],rj);\n                }\n                if(k){\n                    rj.vadd(sides[1],rj);\n                } else {\n                    rj.vsub(sides[1],rj);\n                }\n                if(l){\n                    rj.vadd(sides[2],rj);\n                } else {\n                    rj.vsub(sides[2],rj);\n                }\n\n                // World position of corner\n                xj.vadd(rj,sphere_to_corner);\n                sphere_to_corner.vsub(xi,sphere_to_corner);\n\n                if(sphere_to_corner.norm2() < R*R){\n                    found = true;\n                    var r = this.createContactEquation(bi,bj,si,sj);\n                    r.ri.copy(sphere_to_corner);\n                    r.ri.normalize();\n                    r.ni.copy(r.ri);\n                    r.ri.mult(R,r.ri);\n                    r.rj.copy(rj);\n\n                    // Make relative to bodies\n                    r.ri.vadd(xi, r.ri);\n                    r.ri.vsub(bi.position, r.ri);\n                    r.rj.vadd(xj, r.rj);\n                    r.rj.vsub(bj.position, r.rj);\n\n                    this.result.push(r);\n                    this.createFrictionEquationsFromContact(r, this.frictionResult);\n                }\n            }\n        }\n    }\n    v3pool.release(rj);\n    rj = null;\n\n    // Check edges\n    var edgeTangent = v3pool.get();\n    var edgeCenter = v3pool.get();\n    var r = v3pool.get(); // r = edge center to sphere center\n    var orthogonal = v3pool.get();\n    var dist = v3pool.get();\n    var Nsides = sides.length;\n    for(var j=0; j!==Nsides && !found; j++){\n        for(var k=0; k!==Nsides && !found; k++){\n            if(j%3 !== k%3){\n                // Get edge tangent\n                sides[k].cross(sides[j],edgeTangent);\n                edgeTangent.normalize();\n                sides[j].vadd(sides[k], edgeCenter);\n                r.copy(xi);\n                r.vsub(edgeCenter,r);\n                r.vsub(xj,r);\n                var orthonorm = r.dot(edgeTangent); // distance from edge center to sphere center in the tangent direction\n                edgeTangent.mult(orthonorm,orthogonal); // Vector from edge center to sphere center in the tangent direction\n\n                // Find the third side orthogonal to this one\n                var l = 0;\n                while(l===j%3 || l===k%3){\n                    l++;\n                }\n\n                // vec from edge center to sphere projected to the plane orthogonal to the edge tangent\n                dist.copy(xi);\n                dist.vsub(orthogonal,dist);\n                dist.vsub(edgeCenter,dist);\n                dist.vsub(xj,dist);\n\n                // Distances in tangent direction and distance in the plane orthogonal to it\n                var tdist = Math.abs(orthonorm);\n                var ndist = dist.norm();\n\n                if(tdist < sides[l].norm() && ndist<R){\n                    found = true;\n                    var res = this.createContactEquation(bi,bj,si,sj);\n                    edgeCenter.vadd(orthogonal,res.rj); // box rj\n                    res.rj.copy(res.rj);\n                    dist.negate(res.ni);\n                    res.ni.normalize();\n\n                    res.ri.copy(res.rj);\n                    res.ri.vadd(xj,res.ri);\n                    res.ri.vsub(xi,res.ri);\n                    res.ri.normalize();\n                    res.ri.mult(R,res.ri);\n\n                    // Make relative to bodies\n                    res.ri.vadd(xi, res.ri);\n                    res.ri.vsub(bi.position, res.ri);\n                    res.rj.vadd(xj, res.rj);\n                    res.rj.vsub(bj.position, res.rj);\n\n                    this.result.push(res);\n                    this.createFrictionEquationsFromContact(res, this.frictionResult);\n                }\n            }\n        }\n    }\n    v3pool.release(edgeTangent,edgeCenter,r,orthogonal,dist);\n};\n\nvar convex_to_sphere = new Vec3();\nvar sphereConvex_edge = new Vec3();\nvar sphereConvex_edgeUnit = new Vec3();\nvar sphereConvex_sphereToCorner = new Vec3();\nvar sphereConvex_worldCorner = new Vec3();\nvar sphereConvex_worldNormal = new Vec3();\nvar sphereConvex_worldPoint = new Vec3();\nvar sphereConvex_worldSpherePointClosestToPlane = new Vec3();\nvar sphereConvex_penetrationVec = new Vec3();\nvar sphereConvex_sphereToWorldPoint = new Vec3();\n\n/**\n * @method sphereConvex\n * @param  {Shape}      si\n * @param  {Shape}      sj\n * @param  {Vec3}       xi\n * @param  {Vec3}       xj\n * @param  {Quaternion} qi\n * @param  {Quaternion} qj\n * @param  {Body}       bi\n * @param  {Body}       bj\n */\nNarrowphase.prototype[Shape.types.SPHERE | Shape.types.CONVEXPOLYHEDRON] =\nNarrowphase.prototype.sphereConvex = function(si,sj,xi,xj,qi,qj,bi,bj){\n    var v3pool = this.v3pool;\n    xi.vsub(xj,convex_to_sphere);\n    var normals = sj.faceNormals;\n    var faces = sj.faces;\n    var verts = sj.vertices;\n    var R =     si.radius;\n    var penetrating_sides = [];\n\n    // if(convex_to_sphere.norm2() > si.boundingSphereRadius + sj.boundingSphereRadius){\n    //     return;\n    // }\n\n    // Check corners\n    for(var i=0; i!==verts.length; i++){\n        var v = verts[i];\n\n        // World position of corner\n        var worldCorner = sphereConvex_worldCorner;\n        qj.vmult(v,worldCorner);\n        xj.vadd(worldCorner,worldCorner);\n        var sphere_to_corner = sphereConvex_sphereToCorner;\n        worldCorner.vsub(xi, sphere_to_corner);\n        if(sphere_to_corner.norm2() < R * R){\n            found = true;\n            var r = this.createContactEquation(bi,bj,si,sj);\n            r.ri.copy(sphere_to_corner);\n            r.ri.normalize();\n            r.ni.copy(r.ri);\n            r.ri.mult(R,r.ri);\n            worldCorner.vsub(xj,r.rj);\n\n            // Should be relative to the body.\n            r.ri.vadd(xi, r.ri);\n            r.ri.vsub(bi.position, r.ri);\n\n            // Should be relative to the body.\n            r.rj.vadd(xj, r.rj);\n            r.rj.vsub(bj.position, r.rj);\n\n            this.result.push(r);\n            this.createFrictionEquationsFromContact(r, this.frictionResult);\n            return;\n        }\n    }\n\n    // Check side (plane) intersections\n    var found = false;\n    for(var i=0, nfaces=faces.length; i!==nfaces && found===false; i++){\n        var normal = normals[i];\n        var face = faces[i];\n\n        // Get world-transformed normal of the face\n        var worldNormal = sphereConvex_worldNormal;\n        qj.vmult(normal,worldNormal);\n\n        // Get a world vertex from the face\n        var worldPoint = sphereConvex_worldPoint;\n        qj.vmult(verts[face[0]],worldPoint);\n        worldPoint.vadd(xj,worldPoint);\n\n        // Get a point on the sphere, closest to the face normal\n        var worldSpherePointClosestToPlane = sphereConvex_worldSpherePointClosestToPlane;\n        worldNormal.mult(-R, worldSpherePointClosestToPlane);\n        xi.vadd(worldSpherePointClosestToPlane, worldSpherePointClosestToPlane);\n\n        // Vector from a face point to the closest point on the sphere\n        var penetrationVec = sphereConvex_penetrationVec;\n        worldSpherePointClosestToPlane.vsub(worldPoint,penetrationVec);\n\n        // The penetration. Negative value means overlap.\n        var penetration = penetrationVec.dot(worldNormal);\n\n        var worldPointToSphere = sphereConvex_sphereToWorldPoint;\n        xi.vsub(worldPoint, worldPointToSphere);\n\n        if(penetration < 0 && worldPointToSphere.dot(worldNormal)>0){\n            // Intersects plane. Now check if the sphere is inside the face polygon\n            var faceVerts = []; // Face vertices, in world coords\n            for(var j=0, Nverts=face.length; j!==Nverts; j++){\n                var worldVertex = v3pool.get();\n                qj.vmult(verts[face[j]], worldVertex);\n                xj.vadd(worldVertex,worldVertex);\n                faceVerts.push(worldVertex);\n            }\n\n            if(pointInPolygon(faceVerts,worldNormal,xi)){ // Is the sphere center in the face polygon?\n                found = true;\n                var r = this.createContactEquation(bi,bj,si,sj);\n\n                worldNormal.mult(-R, r.ri); // Contact offset, from sphere center to contact\n                worldNormal.negate(r.ni); // Normal pointing out of sphere\n\n                var penetrationVec2 = v3pool.get();\n                worldNormal.mult(-penetration, penetrationVec2);\n                var penetrationSpherePoint = v3pool.get();\n                worldNormal.mult(-R, penetrationSpherePoint);\n\n                //xi.vsub(xj).vadd(penetrationSpherePoint).vadd(penetrationVec2 , r.rj);\n                xi.vsub(xj,r.rj);\n                r.rj.vadd(penetrationSpherePoint,r.rj);\n                r.rj.vadd(penetrationVec2 , r.rj);\n\n                // Should be relative to the body.\n                r.rj.vadd(xj, r.rj);\n                r.rj.vsub(bj.position, r.rj);\n\n                // Should be relative to the body.\n                r.ri.vadd(xi, r.ri);\n                r.ri.vsub(bi.position, r.ri);\n\n                v3pool.release(penetrationVec2);\n                v3pool.release(penetrationSpherePoint);\n\n                this.result.push(r);\n                this.createFrictionEquationsFromContact(r, this.frictionResult);\n\n                // Release world vertices\n                for(var j=0, Nfaceverts=faceVerts.length; j!==Nfaceverts; j++){\n                    v3pool.release(faceVerts[j]);\n                }\n\n                return; // We only expect *one* face contact\n            } else {\n                // Edge?\n                for(var j=0; j!==face.length; j++){\n\n                    // Get two world transformed vertices\n                    var v1 = v3pool.get();\n                    var v2 = v3pool.get();\n                    qj.vmult(verts[face[(j+1)%face.length]], v1);\n                    qj.vmult(verts[face[(j+2)%face.length]], v2);\n                    xj.vadd(v1, v1);\n                    xj.vadd(v2, v2);\n\n                    // Construct edge vector\n                    var edge = sphereConvex_edge;\n                    v2.vsub(v1,edge);\n\n                    // Construct the same vector, but normalized\n                    var edgeUnit = sphereConvex_edgeUnit;\n                    edge.unit(edgeUnit);\n\n                    // p is xi projected onto the edge\n                    var p = v3pool.get();\n                    var v1_to_xi = v3pool.get();\n                    xi.vsub(v1, v1_to_xi);\n                    var dot = v1_to_xi.dot(edgeUnit);\n                    edgeUnit.mult(dot, p);\n                    p.vadd(v1, p);\n\n                    // Compute a vector from p to the center of the sphere\n                    var xi_to_p = v3pool.get();\n                    p.vsub(xi, xi_to_p);\n\n                    // Collision if the edge-sphere distance is less than the radius\n                    // AND if p is in between v1 and v2\n                    if(dot > 0 && dot*dot<edge.norm2() && xi_to_p.norm2() < R*R){ // Collision if the edge-sphere distance is less than the radius\n                        // Edge contact!\n                        var r = this.createContactEquation(bi,bj,si,sj);\n                        p.vsub(xj,r.rj);\n\n                        p.vsub(xi,r.ni);\n                        r.ni.normalize();\n\n                        r.ni.mult(R,r.ri);\n\n                        // Should be relative to the body.\n                        r.rj.vadd(xj, r.rj);\n                        r.rj.vsub(bj.position, r.rj);\n\n                        // Should be relative to the body.\n                        r.ri.vadd(xi, r.ri);\n                        r.ri.vsub(bi.position, r.ri);\n\n                        this.result.push(r);\n                        this.createFrictionEquationsFromContact(r, this.frictionResult);\n\n                        // Release world vertices\n                        for(var j=0, Nfaceverts=faceVerts.length; j!==Nfaceverts; j++){\n                            v3pool.release(faceVerts[j]);\n                        }\n\n                        v3pool.release(v1);\n                        v3pool.release(v2);\n                        v3pool.release(p);\n                        v3pool.release(xi_to_p);\n                        v3pool.release(v1_to_xi);\n\n                        return;\n                    }\n\n                    v3pool.release(v1);\n                    v3pool.release(v2);\n                    v3pool.release(p);\n                    v3pool.release(xi_to_p);\n                    v3pool.release(v1_to_xi);\n                }\n            }\n\n            // Release world vertices\n            for(var j=0, Nfaceverts=faceVerts.length; j!==Nfaceverts; j++){\n                v3pool.release(faceVerts[j]);\n            }\n        }\n    }\n};\n\nvar planeBox_normal = new Vec3();\nvar plane_to_corner = new Vec3();\n\n/**\n * @method planeBox\n * @param  {Array}      result\n * @param  {Shape}      si\n * @param  {Shape}      sj\n * @param  {Vec3}       xi\n * @param  {Vec3}       xj\n * @param  {Quaternion} qi\n * @param  {Quaternion} qj\n * @param  {Body}       bi\n * @param  {Body}       bj\n */\nNarrowphase.prototype[Shape.types.PLANE | Shape.types.BOX] =\nNarrowphase.prototype.planeBox = function(si,sj,xi,xj,qi,qj,bi,bj){\n    sj.convexPolyhedronRepresentation.material = sj.material;\n    sj.convexPolyhedronRepresentation.collisionResponse = sj.collisionResponse;\n    this.planeConvex(si,sj.convexPolyhedronRepresentation,xi,xj,qi,qj,bi,bj);\n};\n\nvar planeConvex_v = new Vec3();\nvar planeConvex_normal = new Vec3();\nvar planeConvex_relpos = new Vec3();\nvar planeConvex_projected = new Vec3();\n\n/**\n * @method planeConvex\n * @param  {Shape}      si\n * @param  {Shape}      sj\n * @param  {Vec3}       xi\n * @param  {Vec3}       xj\n * @param  {Quaternion} qi\n * @param  {Quaternion} qj\n * @param  {Body}       bi\n * @param  {Body}       bj\n */\nNarrowphase.prototype[Shape.types.PLANE | Shape.types.CONVEXPOLYHEDRON] =\nNarrowphase.prototype.planeConvex = function(\n    planeShape,\n    convexShape,\n    planePosition,\n    convexPosition,\n    planeQuat,\n    convexQuat,\n    planeBody,\n    convexBody\n){\n    // Simply return the points behind the plane.\n    var worldVertex = planeConvex_v,\n        worldNormal = planeConvex_normal;\n    worldNormal.set(0,0,1);\n    planeQuat.vmult(worldNormal,worldNormal); // Turn normal according to plane orientation\n\n    var numContacts = 0;\n    var relpos = planeConvex_relpos;\n    for(var i = 0; i !== convexShape.vertices.length; i++){\n\n        // Get world convex vertex\n        worldVertex.copy(convexShape.vertices[i]);\n        convexQuat.vmult(worldVertex, worldVertex);\n        convexPosition.vadd(worldVertex, worldVertex);\n        worldVertex.vsub(planePosition, relpos);\n\n        var dot = worldNormal.dot(relpos);\n        if(dot <= 0.0){\n\n            var r = this.createContactEquation(planeBody, convexBody, planeShape, convexShape);\n\n            // Get vertex position projected on plane\n            var projected = planeConvex_projected;\n            worldNormal.mult(worldNormal.dot(relpos),projected);\n            worldVertex.vsub(projected, projected);\n            projected.vsub(planePosition, r.ri); // From plane to vertex projected on plane\n\n            r.ni.copy(worldNormal); // Contact normal is the plane normal out from plane\n\n            // rj is now just the vector from the convex center to the vertex\n            worldVertex.vsub(convexPosition, r.rj);\n\n            // Make it relative to the body\n            r.ri.vadd(planePosition, r.ri);\n            r.ri.vsub(planeBody.position, r.ri);\n            r.rj.vadd(convexPosition, r.rj);\n            r.rj.vsub(convexBody.position, r.rj);\n\n            this.result.push(r);\n            numContacts++;\n            if(!this.enableFrictionReduction){\n                this.createFrictionEquationsFromContact(r, this.frictionResult);\n            }\n        }\n    }\n\n    if(this.enableFrictionReduction && numContacts){\n        this.createFrictionFromAverage(numContacts);\n    }\n};\n\nvar convexConvex_sepAxis = new Vec3();\nvar convexConvex_q = new Vec3();\n\n/**\n * @method convexConvex\n * @param  {Shape}      si\n * @param  {Shape}      sj\n * @param  {Vec3}       xi\n * @param  {Vec3}       xj\n * @param  {Quaternion} qi\n * @param  {Quaternion} qj\n * @param  {Body}       bi\n * @param  {Body}       bj\n */\nNarrowphase.prototype[Shape.types.CONVEXPOLYHEDRON] =\nNarrowphase.prototype.convexConvex = function(si,sj,xi,xj,qi,qj,bi,bj,rsi,rsj,faceListA,faceListB){\n    var sepAxis = convexConvex_sepAxis;\n\n    if(xi.distanceTo(xj) > si.boundingSphereRadius + sj.boundingSphereRadius){\n        return;\n    }\n\n    if(si.findSeparatingAxis(sj,xi,qi,xj,qj,sepAxis,faceListA,faceListB)){\n        var res = [];\n        var q = convexConvex_q;\n        si.clipAgainstHull(xi,qi,sj,xj,qj,sepAxis,-100,100,res);\n        var numContacts = 0;\n        for(var j = 0; j !== res.length; j++){\n            var r = this.createContactEquation(bi,bj,si,sj,rsi,rsj),\n                ri = r.ri,\n                rj = r.rj;\n            sepAxis.negate(r.ni);\n            res[j].normal.negate(q);\n            q.mult(res[j].depth, q);\n            res[j].point.vadd(q, ri);\n            rj.copy(res[j].point);\n\n            // Contact points are in world coordinates. Transform back to relative\n            ri.vsub(xi,ri);\n            rj.vsub(xj,rj);\n\n            // Make relative to bodies\n            ri.vadd(xi, ri);\n            ri.vsub(bi.position, ri);\n            rj.vadd(xj, rj);\n            rj.vsub(bj.position, rj);\n\n            this.result.push(r);\n            numContacts++;\n            if(!this.enableFrictionReduction){\n                this.createFrictionEquationsFromContact(r, this.frictionResult);\n            }\n        }\n        if(this.enableFrictionReduction && numContacts){\n            this.createFrictionFromAverage(numContacts);\n        }\n    }\n};\n\n\n/**\n * @method convexTrimesh\n * @param  {Array}      result\n * @param  {Shape}      si\n * @param  {Shape}      sj\n * @param  {Vec3}       xi\n * @param  {Vec3}       xj\n * @param  {Quaternion} qi\n * @param  {Quaternion} qj\n * @param  {Body}       bi\n * @param  {Body}       bj\n */\n// Narrowphase.prototype[Shape.types.CONVEXPOLYHEDRON | Shape.types.TRIMESH] =\n// Narrowphase.prototype.convexTrimesh = function(si,sj,xi,xj,qi,qj,bi,bj,rsi,rsj,faceListA,faceListB){\n//     var sepAxis = convexConvex_sepAxis;\n\n//     if(xi.distanceTo(xj) > si.boundingSphereRadius + sj.boundingSphereRadius){\n//         return;\n//     }\n\n//     // Construct a temp hull for each triangle\n//     var hullB = new ConvexPolyhedron();\n\n//     hullB.faces = [[0,1,2]];\n//     var va = new Vec3();\n//     var vb = new Vec3();\n//     var vc = new Vec3();\n//     hullB.vertices = [\n//         va,\n//         vb,\n//         vc\n//     ];\n\n//     for (var i = 0; i < sj.indices.length / 3; i++) {\n\n//         var triangleNormal = new Vec3();\n//         sj.getNormal(i, triangleNormal);\n//         hullB.faceNormals = [triangleNormal];\n\n//         sj.getTriangleVertices(i, va, vb, vc);\n\n//         var d = si.testSepAxis(triangleNormal, hullB, xi, qi, xj, qj);\n//         if(!d){\n//             triangleNormal.scale(-1, triangleNormal);\n//             d = si.testSepAxis(triangleNormal, hullB, xi, qi, xj, qj);\n\n//             if(!d){\n//                 continue;\n//             }\n//         }\n\n//         var res = [];\n//         var q = convexConvex_q;\n//         si.clipAgainstHull(xi,qi,hullB,xj,qj,triangleNormal,-100,100,res);\n//         for(var j = 0; j !== res.length; j++){\n//             var r = this.createContactEquation(bi,bj,si,sj,rsi,rsj),\n//                 ri = r.ri,\n//                 rj = r.rj;\n//             r.ni.copy(triangleNormal);\n//             r.ni.negate(r.ni);\n//             res[j].normal.negate(q);\n//             q.mult(res[j].depth, q);\n//             res[j].point.vadd(q, ri);\n//             rj.copy(res[j].point);\n\n//             // Contact points are in world coordinates. Transform back to relative\n//             ri.vsub(xi,ri);\n//             rj.vsub(xj,rj);\n\n//             // Make relative to bodies\n//             ri.vadd(xi, ri);\n//             ri.vsub(bi.position, ri);\n//             rj.vadd(xj, rj);\n//             rj.vsub(bj.position, rj);\n\n//             result.push(r);\n//         }\n//     }\n// };\n\nvar particlePlane_normal = new Vec3();\nvar particlePlane_relpos = new Vec3();\nvar particlePlane_projected = new Vec3();\n\n/**\n * @method particlePlane\n * @param  {Array}      result\n * @param  {Shape}      si\n * @param  {Shape}      sj\n * @param  {Vec3}       xi\n * @param  {Vec3}       xj\n * @param  {Quaternion} qi\n * @param  {Quaternion} qj\n * @param  {Body}       bi\n * @param  {Body}       bj\n */\nNarrowphase.prototype[Shape.types.PLANE | Shape.types.PARTICLE] =\nNarrowphase.prototype.planeParticle = function(sj,si,xj,xi,qj,qi,bj,bi){\n    var normal = particlePlane_normal;\n    normal.set(0,0,1);\n    bj.quaternion.vmult(normal,normal); // Turn normal according to plane orientation\n    var relpos = particlePlane_relpos;\n    xi.vsub(bj.position,relpos);\n    var dot = normal.dot(relpos);\n    if(dot <= 0.0){\n        var r = this.createContactEquation(bi,bj,si,sj);\n        r.ni.copy(normal); // Contact normal is the plane normal\n        r.ni.negate(r.ni);\n        r.ri.set(0,0,0); // Center of particle\n\n        // Get particle position projected on plane\n        var projected = particlePlane_projected;\n        normal.mult(normal.dot(xi),projected);\n        xi.vsub(projected,projected);\n        //projected.vadd(bj.position,projected);\n\n        // rj is now the projected world position minus plane position\n        r.rj.copy(projected);\n        this.result.push(r);\n        this.createFrictionEquationsFromContact(r, this.frictionResult);\n    }\n};\n\nvar particleSphere_normal = new Vec3();\n\n/**\n * @method particleSphere\n * @param  {Array}      result\n * @param  {Shape}      si\n * @param  {Shape}      sj\n * @param  {Vec3}       xi\n * @param  {Vec3}       xj\n * @param  {Quaternion} qi\n * @param  {Quaternion} qj\n * @param  {Body}       bi\n * @param  {Body}       bj\n */\nNarrowphase.prototype[Shape.types.PARTICLE | Shape.types.SPHERE] =\nNarrowphase.prototype.sphereParticle = function(sj,si,xj,xi,qj,qi,bj,bi){\n    // The normal is the unit vector from sphere center to particle center\n    var normal = particleSphere_normal;\n    normal.set(0,0,1);\n    xi.vsub(xj,normal);\n    var lengthSquared = normal.norm2();\n\n    if(lengthSquared <= sj.radius * sj.radius){\n        var r = this.createContactEquation(bi,bj,si,sj);\n        normal.normalize();\n        r.rj.copy(normal);\n        r.rj.mult(sj.radius,r.rj);\n        r.ni.copy(normal); // Contact normal\n        r.ni.negate(r.ni);\n        r.ri.set(0,0,0); // Center of particle\n        this.result.push(r);\n        this.createFrictionEquationsFromContact(r, this.frictionResult);\n    }\n};\n\n// WIP\nvar cqj = new Quaternion();\nvar convexParticle_local = new Vec3();\nvar convexParticle_normal = new Vec3();\nvar convexParticle_penetratedFaceNormal = new Vec3();\nvar convexParticle_vertexToParticle = new Vec3();\nvar convexParticle_worldPenetrationVec = new Vec3();\n\n/**\n * @method convexParticle\n * @param  {Array}      result\n * @param  {Shape}      si\n * @param  {Shape}      sj\n * @param  {Vec3}       xi\n * @param  {Vec3}       xj\n * @param  {Quaternion} qi\n * @param  {Quaternion} qj\n * @param  {Body}       bi\n * @param  {Body}       bj\n */\nNarrowphase.prototype[Shape.types.PARTICLE | Shape.types.CONVEXPOLYHEDRON] =\nNarrowphase.prototype.convexParticle = function(sj,si,xj,xi,qj,qi,bj,bi){\n    var penetratedFaceIndex = -1;\n    var penetratedFaceNormal = convexParticle_penetratedFaceNormal;\n    var worldPenetrationVec = convexParticle_worldPenetrationVec;\n    var minPenetration = null;\n    var numDetectedFaces = 0;\n\n    // Convert particle position xi to local coords in the convex\n    var local = convexParticle_local;\n    local.copy(xi);\n    local.vsub(xj,local); // Convert position to relative the convex origin\n    qj.conjugate(cqj);\n    cqj.vmult(local,local);\n\n    if(sj.pointIsInside(local)){\n\n        if(sj.worldVerticesNeedsUpdate){\n            sj.computeWorldVertices(xj,qj);\n        }\n        if(sj.worldFaceNormalsNeedsUpdate){\n            sj.computeWorldFaceNormals(qj);\n        }\n\n        // For each world polygon in the polyhedra\n        for(var i=0,nfaces=sj.faces.length; i!==nfaces; i++){\n\n            // Construct world face vertices\n            var verts = [ sj.worldVertices[ sj.faces[i][0] ] ];\n            var normal = sj.worldFaceNormals[i];\n\n            // Check how much the particle penetrates the polygon plane.\n            xi.vsub(verts[0],convexParticle_vertexToParticle);\n            var penetration = -normal.dot(convexParticle_vertexToParticle);\n            if(minPenetration===null || Math.abs(penetration)<Math.abs(minPenetration)){\n                minPenetration = penetration;\n                penetratedFaceIndex = i;\n                penetratedFaceNormal.copy(normal);\n                numDetectedFaces++;\n            }\n        }\n\n        if(penetratedFaceIndex!==-1){\n            // Setup contact\n            var r = this.createContactEquation(bi,bj,si,sj);\n            penetratedFaceNormal.mult(minPenetration, worldPenetrationVec);\n\n            // rj is the particle position projected to the face\n            worldPenetrationVec.vadd(xi,worldPenetrationVec);\n            worldPenetrationVec.vsub(xj,worldPenetrationVec);\n            r.rj.copy(worldPenetrationVec);\n            //var projectedToFace = xi.vsub(xj).vadd(worldPenetrationVec);\n            //projectedToFace.copy(r.rj);\n\n            //qj.vmult(r.rj,r.rj);\n            penetratedFaceNormal.negate( r.ni ); // Contact normal\n            r.ri.set(0,0,0); // Center of particle\n\n            var ri = r.ri,\n                rj = r.rj;\n\n            // Make relative to bodies\n            ri.vadd(xi, ri);\n            ri.vsub(bi.position, ri);\n            rj.vadd(xj, rj);\n            rj.vsub(bj.position, rj);\n\n            this.result.push(r);\n            this.createFrictionEquationsFromContact(r, this.frictionResult);\n        } else {\n            console.warn(\"Point found inside convex, but did not find penetrating face!\");\n        }\n    }\n};\n\nNarrowphase.prototype[Shape.types.BOX | Shape.types.HEIGHTFIELD] =\nNarrowphase.prototype.boxHeightfield = function (si,sj,xi,xj,qi,qj,bi,bj){\n    si.convexPolyhedronRepresentation.material = si.material;\n    si.convexPolyhedronRepresentation.collisionResponse = si.collisionResponse;\n    this.convexHeightfield(si.convexPolyhedronRepresentation,sj,xi,xj,qi,qj,bi,bj);\n};\n\nvar convexHeightfield_tmp1 = new Vec3();\nvar convexHeightfield_tmp2 = new Vec3();\nvar convexHeightfield_faceList = [0];\n\n/**\n * @method convexHeightfield\n */\nNarrowphase.prototype[Shape.types.CONVEXPOLYHEDRON | Shape.types.HEIGHTFIELD] =\nNarrowphase.prototype.convexHeightfield = function (\n    convexShape,\n    hfShape,\n    convexPos,\n    hfPos,\n    convexQuat,\n    hfQuat,\n    convexBody,\n    hfBody\n){\n    var data = hfShape.data,\n        w = hfShape.elementSize,\n        radius = convexShape.boundingSphereRadius,\n        worldPillarOffset = convexHeightfield_tmp2,\n        faceList = convexHeightfield_faceList;\n\n    // Get sphere position to heightfield local!\n    var localConvexPos = convexHeightfield_tmp1;\n    Transform.pointToLocalFrame(hfPos, hfQuat, convexPos, localConvexPos);\n\n    // Get the index of the data points to test against\n    var iMinX = Math.floor((localConvexPos.x - radius) / w) - 1,\n        iMaxX = Math.ceil((localConvexPos.x + radius) / w) + 1,\n        iMinY = Math.floor((localConvexPos.y - radius) / w) - 1,\n        iMaxY = Math.ceil((localConvexPos.y + radius) / w) + 1;\n\n    // Bail out if we are out of the terrain\n    if(iMaxX < 0 || iMaxY < 0 || iMinX > data.length || iMinY > data[0].length){\n        return;\n    }\n\n    // Clamp index to edges\n    if(iMinX < 0){ iMinX = 0; }\n    if(iMaxX < 0){ iMaxX = 0; }\n    if(iMinY < 0){ iMinY = 0; }\n    if(iMaxY < 0){ iMaxY = 0; }\n    if(iMinX >= data.length){ iMinX = data.length - 1; }\n    if(iMaxX >= data.length){ iMaxX = data.length - 1; }\n    if(iMaxY >= data[0].length){ iMaxY = data[0].length - 1; }\n    if(iMinY >= data[0].length){ iMinY = data[0].length - 1; }\n\n    var minMax = [];\n    hfShape.getRectMinMax(iMinX, iMinY, iMaxX, iMaxY, minMax);\n    var min = minMax[0];\n    var max = minMax[1];\n\n    // Bail out if we're cant touch the bounding height box\n    if(localConvexPos.z - radius > max || localConvexPos.z + radius < min){\n        return;\n    }\n\n    for(var i = iMinX; i < iMaxX; i++){\n        for(var j = iMinY; j < iMaxY; j++){\n\n            // Lower triangle\n            hfShape.getConvexTrianglePillar(i, j, false);\n            Transform.pointToWorldFrame(hfPos, hfQuat, hfShape.pillarOffset, worldPillarOffset);\n            if (convexPos.distanceTo(worldPillarOffset) < hfShape.pillarConvex.boundingSphereRadius + convexShape.boundingSphereRadius) {\n                this.convexConvex(convexShape, hfShape.pillarConvex, convexPos, worldPillarOffset, convexQuat, hfQuat, convexBody, hfBody, null, null, faceList, null);\n            }\n\n            // Upper triangle\n            hfShape.getConvexTrianglePillar(i, j, true);\n            Transform.pointToWorldFrame(hfPos, hfQuat, hfShape.pillarOffset, worldPillarOffset);\n            if (convexPos.distanceTo(worldPillarOffset) < hfShape.pillarConvex.boundingSphereRadius + convexShape.boundingSphereRadius) {\n                this.convexConvex(convexShape, hfShape.pillarConvex, convexPos, worldPillarOffset, convexQuat, hfQuat, convexBody, hfBody, null, null, faceList, null);\n            }\n        }\n    }\n};\n\nvar sphereHeightfield_tmp1 = new Vec3();\nvar sphereHeightfield_tmp2 = new Vec3();\n\n/**\n * @method sphereHeightfield\n */\nNarrowphase.prototype[Shape.types.SPHERE | Shape.types.HEIGHTFIELD] =\nNarrowphase.prototype.sphereHeightfield = function (\n    sphereShape,\n    hfShape,\n    spherePos,\n    hfPos,\n    sphereQuat,\n    hfQuat,\n    sphereBody,\n    hfBody\n){\n    var data = hfShape.data,\n        radius = sphereShape.radius,\n        w = hfShape.elementSize,\n        worldPillarOffset = sphereHeightfield_tmp2;\n\n    // Get sphere position to heightfield local!\n    var localSpherePos = sphereHeightfield_tmp1;\n    Transform.pointToLocalFrame(hfPos, hfQuat, spherePos, localSpherePos);\n\n    // Get the index of the data points to test against\n    var iMinX = Math.floor((localSpherePos.x - radius) / w) - 1,\n        iMaxX = Math.ceil((localSpherePos.x + radius) / w) + 1,\n        iMinY = Math.floor((localSpherePos.y - radius) / w) - 1,\n        iMaxY = Math.ceil((localSpherePos.y + radius) / w) + 1;\n\n    // Bail out if we are out of the terrain\n    if(iMaxX < 0 || iMaxY < 0 || iMinX > data.length || iMaxY > data[0].length){\n        return;\n    }\n\n    // Clamp index to edges\n    if(iMinX < 0){ iMinX = 0; }\n    if(iMaxX < 0){ iMaxX = 0; }\n    if(iMinY < 0){ iMinY = 0; }\n    if(iMaxY < 0){ iMaxY = 0; }\n    if(iMinX >= data.length){ iMinX = data.length - 1; }\n    if(iMaxX >= data.length){ iMaxX = data.length - 1; }\n    if(iMaxY >= data[0].length){ iMaxY = data[0].length - 1; }\n    if(iMinY >= data[0].length){ iMinY = data[0].length - 1; }\n\n    var minMax = [];\n    hfShape.getRectMinMax(iMinX, iMinY, iMaxX, iMaxY, minMax);\n    var min = minMax[0];\n    var max = minMax[1];\n\n    // Bail out if we're cant touch the bounding height box\n    if(localSpherePos.z - radius > max || localSpherePos.z + radius < min){\n        return;\n    }\n\n    var result = this.result;\n    for(var i = iMinX; i < iMaxX; i++){\n        for(var j = iMinY; j < iMaxY; j++){\n\n            var numContactsBefore = result.length;\n\n            // Lower triangle\n            hfShape.getConvexTrianglePillar(i, j, false);\n            Transform.pointToWorldFrame(hfPos, hfQuat, hfShape.pillarOffset, worldPillarOffset);\n            if (spherePos.distanceTo(worldPillarOffset) < hfShape.pillarConvex.boundingSphereRadius + sphereShape.boundingSphereRadius) {\n                this.sphereConvex(sphereShape, hfShape.pillarConvex, spherePos, worldPillarOffset, sphereQuat, hfQuat, sphereBody, hfBody);\n            }\n\n            // Upper triangle\n            hfShape.getConvexTrianglePillar(i, j, true);\n            Transform.pointToWorldFrame(hfPos, hfQuat, hfShape.pillarOffset, worldPillarOffset);\n            if (spherePos.distanceTo(worldPillarOffset) < hfShape.pillarConvex.boundingSphereRadius + sphereShape.boundingSphereRadius) {\n                this.sphereConvex(sphereShape, hfShape.pillarConvex, spherePos, worldPillarOffset, sphereQuat, hfQuat, sphereBody, hfBody);\n            }\n\n            var numContacts = result.length - numContactsBefore;\n\n            if(numContacts > 2){\n                return;\n            }\n            /*\n            // Skip all but 1\n            for (var k = 0; k < numContacts - 1; k++) {\n                result.pop();\n            }\n            */\n        }\n    }\n};\n\n},{\"../collision/AABB\":3,\"../collision/Ray\":9,\"../equations/ContactEquation\":19,\"../equations/FrictionEquation\":21,\"../math/Quaternion\":28,\"../math/Transform\":29,\"../math/Vec3\":30,\"../shapes/ConvexPolyhedron\":38,\"../shapes/Shape\":43,\"../solver/Solver\":47,\"../utils/Vec3Pool\":54}],56:[function(_dereq_,module,exports){\n/* global performance */\n\nmodule.exports = World;\n\nvar Shape = _dereq_('../shapes/Shape');\nvar Vec3 = _dereq_('../math/Vec3');\nvar Quaternion = _dereq_('../math/Quaternion');\nvar GSSolver = _dereq_('../solver/GSSolver');\nvar Vec3Pool = _dereq_('../utils/Vec3Pool');\nvar ContactEquation = _dereq_('../equations/ContactEquation');\nvar FrictionEquation = _dereq_('../equations/FrictionEquation');\nvar Narrowphase = _dereq_('./Narrowphase');\nvar EventTarget = _dereq_('../utils/EventTarget');\nvar ArrayCollisionMatrix = _dereq_('../collision/ArrayCollisionMatrix');\nvar Material = _dereq_('../material/Material');\nvar ContactMaterial = _dereq_('../material/ContactMaterial');\nvar Body = _dereq_('../objects/Body');\nvar TupleDictionary = _dereq_('../utils/TupleDictionary');\nvar RaycastResult = _dereq_('../collision/RaycastResult');\nvar AABB = _dereq_('../collision/AABB');\nvar Ray = _dereq_('../collision/Ray');\nvar NaiveBroadphase = _dereq_('../collision/NaiveBroadphase');\n\n/**\n * The physics world\n * @class World\n * @constructor\n * @extends EventTarget\n */\nfunction World(){\n    EventTarget.apply(this);\n\n    /**\n     * Currently / last used timestep. Is set to -1 if not available. This value is updated before each internal step, which means that it is \"fresh\" inside event callbacks.\n     * @property {Number} dt\n     */\n    this.dt = -1;\n\n    /**\n     * Makes bodies go to sleep when they've been inactive\n     * @property allowSleep\n     * @type {Boolean}\n     */\n    this.allowSleep = false;\n\n    /**\n     * All the current contacts (instances of ContactEquation) in the world.\n     * @property contacts\n     * @type {Array}\n     */\n    this.contacts = [];\n    this.frictionEquations = [];\n\n    /**\n     * How often to normalize quaternions. Set to 0 for every step, 1 for every second etc.. A larger value increases performance. If bodies tend to explode, set to a smaller value (zero to be sure nothing can go wrong).\n     * @property quatNormalizeSkip\n     * @type {Number}\n     */\n    this.quatNormalizeSkip = 0;\n\n    /**\n     * Set to true to use fast quaternion normalization. It is often enough accurate to use. If bodies tend to explode, set to false.\n     * @property quatNormalizeFast\n     * @type {Boolean}\n     * @see Quaternion.normalizeFast\n     * @see Quaternion.normalize\n     */\n    this.quatNormalizeFast = false;\n\n    /**\n     * The wall-clock time since simulation start\n     * @property time\n     * @type {Number}\n     */\n    this.time = 0.0;\n\n    /**\n     * Number of timesteps taken since start\n     * @property stepnumber\n     * @type {Number}\n     */\n    this.stepnumber = 0;\n\n    /// Default and last timestep sizes\n    this.default_dt = 1/60;\n\n    this.nextId = 0;\n    /**\n     * @property gravity\n     * @type {Vec3}\n     */\n    this.gravity = new Vec3();\n\n    /**\n     * @property broadphase\n     * @type {Broadphase}\n     */\n    this.broadphase = new NaiveBroadphase();\n\n    /**\n     * @property bodies\n     * @type {Array}\n     */\n    this.bodies = [];\n\n    /**\n     * @property solver\n     * @type {Solver}\n     */\n    this.solver = new GSSolver();\n\n    /**\n     * @property constraints\n     * @type {Array}\n     */\n    this.constraints = [];\n\n    /**\n     * @property narrowphase\n     * @type {Narrowphase}\n     */\n    this.narrowphase = new Narrowphase(this);\n\n    /**\n     * @property {ArrayCollisionMatrix} collisionMatrix\n\t * @type {ArrayCollisionMatrix}\n\t */\n\tthis.collisionMatrix = new ArrayCollisionMatrix();\n\n    /**\n     * CollisionMatrix from the previous step.\n     * @property {ArrayCollisionMatrix} collisionMatrixPrevious\n\t * @type {ArrayCollisionMatrix}\n\t */\n\tthis.collisionMatrixPrevious = new ArrayCollisionMatrix();\n\n    /**\n     * All added materials\n     * @property materials\n     * @type {Array}\n     */\n    this.materials = [];\n\n    /**\n     * @property contactmaterials\n     * @type {Array}\n     */\n    this.contactmaterials = [];\n\n    /**\n     * Used to look up a ContactMaterial given two instances of Material.\n     * @property {TupleDictionary} contactMaterialTable\n     */\n    this.contactMaterialTable = new TupleDictionary();\n\n    this.defaultMaterial = new Material(\"default\");\n\n    /**\n     * This contact material is used if no suitable contactmaterial is found for a contact.\n     * @property defaultContactMaterial\n     * @type {ContactMaterial}\n     */\n    this.defaultContactMaterial = new ContactMaterial(this.defaultMaterial, this.defaultMaterial, { friction: 0.3, restitution: 0.0 });\n\n    /**\n     * @property doProfiling\n     * @type {Boolean}\n     */\n    this.doProfiling = false;\n\n    /**\n     * @property profile\n     * @type {Object}\n     */\n    this.profile = {\n        solve:0,\n        makeContactConstraints:0,\n        broadphase:0,\n        integrate:0,\n        narrowphase:0,\n    };\n\n    /**\n     * @property subsystems\n     * @type {Array}\n     */\n    this.subsystems = [];\n\n    this.addBodyEvent = {\n        type:\"addBody\",\n        body : null,\n    };\n\n    this.removeBodyEvent = {\n        type:\"removeBody\",\n        body : null,\n    };\n}\nWorld.prototype = new EventTarget();\n\n// Temp stuff\nvar tmpAABB1 = new AABB();\nvar tmpArray1 = [];\nvar tmpRay = new Ray();\n\n/**\n * Get the contact material between materials m1 and m2\n * @method getContactMaterial\n * @param {Material} m1\n * @param {Material} m2\n * @return {ContactMaterial} The contact material if it was found.\n */\nWorld.prototype.getContactMaterial = function(m1,m2){\n    return this.contactMaterialTable.get(m1.id,m2.id); //this.contactmaterials[this.mats2cmat[i+j*this.materials.length]];\n};\n\n/**\n * Get number of objects in the world.\n * @method numObjects\n * @return {Number}\n * @deprecated\n */\nWorld.prototype.numObjects = function(){\n    return this.bodies.length;\n};\n\n/**\n * Store old collision state info\n * @method collisionMatrixTick\n */\nWorld.prototype.collisionMatrixTick = function(){\n\tvar temp = this.collisionMatrixPrevious;\n\tthis.collisionMatrixPrevious = this.collisionMatrix;\n\tthis.collisionMatrix = temp;\n\tthis.collisionMatrix.reset();\n};\n\n/**\n * Add a rigid body to the simulation.\n * @method add\n * @param {Body} body\n * @todo If the simulation has not yet started, why recrete and copy arrays for each body? Accumulate in dynamic arrays in this case.\n * @todo Adding an array of bodies should be possible. This would save some loops too\n * @deprecated Use .addBody instead\n */\nWorld.prototype.add = World.prototype.addBody = function(body){\n    if(this.bodies.indexOf(body) !== -1){\n        return;\n    }\n    body.index = this.bodies.length;\n    this.bodies.push(body);\n    body.world = this;\n    body.initPosition.copy(body.position);\n    body.initVelocity.copy(body.velocity);\n    body.timeLastSleepy = this.time;\n    if(body instanceof Body){\n        body.initAngularVelocity.copy(body.angularVelocity);\n        body.initQuaternion.copy(body.quaternion);\n    }\n\tthis.collisionMatrix.setNumObjects(this.bodies.length);\n    this.addBodyEvent.body = body;\n    this.dispatchEvent(this.addBodyEvent);\n};\n\n/**\n * Add a constraint to the simulation.\n * @method addConstraint\n * @param {Constraint} c\n */\nWorld.prototype.addConstraint = function(c){\n    this.constraints.push(c);\n};\n\n/**\n * Removes a constraint\n * @method removeConstraint\n * @param {Constraint} c\n */\nWorld.prototype.removeConstraint = function(c){\n    var idx = this.constraints.indexOf(c);\n    if(idx!==-1){\n        this.constraints.splice(idx,1);\n    }\n};\n\n/**\n * Raycast test\n * @method rayTest\n * @param {Vec3} from\n * @param {Vec3} to\n * @param {Function|RaycastResult} result\n * @deprecated Use .raycastAll, .raycastClosest or .raycastAny instead.\n */\nWorld.prototype.rayTest = function(from, to, result){\n    if(result instanceof RaycastResult){\n        // Do raycastclosest\n        this.raycastClosest(from, to, {\n            skipBackfaces: true\n        }, result);\n    } else {\n        // Do raycastAll\n        this.raycastAll(from, to, {\n            skipBackfaces: true\n        }, result);\n    }\n};\n\n/**\n * Ray cast against all bodies. The provided callback will be executed for each hit with a RaycastResult as single argument.\n * @method raycastAll\n * @param  {Vec3} from\n * @param  {Vec3} to\n * @param  {Object} options\n * @param  {number} [options.collisionFilterMask=-1]\n * @param  {number} [options.collisionFilterGroup=-1]\n * @param  {boolean} [options.skipBackfaces=false]\n * @param  {boolean} [options.checkCollisionResponse=true]\n * @param  {Function} callback\n * @return {boolean} True if any body was hit.\n */\nWorld.prototype.raycastAll = function(from, to, options, callback){\n    options.mode = Ray.ALL;\n    options.from = from;\n    options.to = to;\n    options.callback = callback;\n    return tmpRay.intersectWorld(this, options);\n};\n\n/**\n * Ray cast, and stop at the first result. Note that the order is random - but the method is fast.\n * @method raycastAny\n * @param  {Vec3} from\n * @param  {Vec3} to\n * @param  {Object} options\n * @param  {number} [options.collisionFilterMask=-1]\n * @param  {number} [options.collisionFilterGroup=-1]\n * @param  {boolean} [options.skipBackfaces=false]\n * @param  {boolean} [options.checkCollisionResponse=true]\n * @param  {RaycastResult} result\n * @return {boolean} True if any body was hit.\n */\nWorld.prototype.raycastAny = function(from, to, options, result){\n    options.mode = Ray.ANY;\n    options.from = from;\n    options.to = to;\n    options.result = result;\n    return tmpRay.intersectWorld(this, options);\n};\n\n/**\n * Ray cast, and return information of the closest hit.\n * @method raycastClosest\n * @param  {Vec3} from\n * @param  {Vec3} to\n * @param  {Object} options\n * @param  {number} [options.collisionFilterMask=-1]\n * @param  {number} [options.collisionFilterGroup=-1]\n * @param  {boolean} [options.skipBackfaces=false]\n * @param  {boolean} [options.checkCollisionResponse=true]\n * @param  {RaycastResult} result\n * @return {boolean} True if any body was hit.\n */\nWorld.prototype.raycastClosest = function(from, to, options, result){\n    options.mode = Ray.CLOSEST;\n    options.from = from;\n    options.to = to;\n    options.result = result;\n    return tmpRay.intersectWorld(this, options);\n};\n\n/**\n * Remove a rigid body from the simulation.\n * @method remove\n * @param {Body} body\n * @deprecated Use .removeBody instead\n */\nWorld.prototype.remove = function(body){\n    body.world = null;\n    var n = this.bodies.length-1,\n        bodies = this.bodies,\n        idx = bodies.indexOf(body);\n    if(idx !== -1){\n        bodies.splice(idx, 1); // Todo: should use a garbage free method\n\n        // Recompute index\n        for(var i=0; i!==bodies.length; i++){\n            bodies[i].index = i;\n        }\n\n        this.collisionMatrix.setNumObjects(n);\n        this.removeBodyEvent.body = body;\n        this.dispatchEvent(this.removeBodyEvent);\n    }\n};\n\n/**\n * Remove a rigid body from the simulation.\n * @method removeBody\n * @param {Body} body\n */\nWorld.prototype.removeBody = World.prototype.remove;\n\n/**\n * Adds a material to the World.\n * @method addMaterial\n * @param {Material} m\n * @todo Necessary?\n */\nWorld.prototype.addMaterial = function(m){\n    this.materials.push(m);\n};\n\n/**\n * Adds a contact material to the World\n * @method addContactMaterial\n * @param {ContactMaterial} cmat\n */\nWorld.prototype.addContactMaterial = function(cmat) {\n\n    // Add contact material\n    this.contactmaterials.push(cmat);\n\n    // Add current contact material to the material table\n    this.contactMaterialTable.set(cmat.materials[0].id,cmat.materials[1].id,cmat);\n};\n\n// performance.now()\nif(typeof performance === 'undefined'){\n    performance = {};\n}\nif(!performance.now){\n    var nowOffset = Date.now();\n    if (performance.timing && performance.timing.navigationStart){\n        nowOffset = performance.timing.navigationStart;\n    }\n    performance.now = function(){\n        return Date.now() - nowOffset;\n    };\n}\n\nvar step_tmp1 = new Vec3();\n\n/**\n * Step the physics world forward in time.\n *\n * There are two modes. The simple mode is fixed timestepping without interpolation. In this case you only use the first argument. The second case uses interpolation. In that you also provide the time since the function was last used, as well as the maximum fixed timesteps to take.\n *\n * @method step\n * @param {Number} dt                       The fixed time step size to use.\n * @param {Number} [timeSinceLastCalled]    The time elapsed since the function was last called.\n * @param {Number} [maxSubSteps=10]         Maximum number of fixed steps to take per function call.\n *\n * @example\n *     // fixed timestepping without interpolation\n *     world.step(1/60);\n *\n * @see http://bulletphysics.org/mediawiki-1.5.8/index.php/Stepping_The_World\n */\nWorld.prototype.step = function(dt, timeSinceLastCalled, maxSubSteps){\n    maxSubSteps = maxSubSteps || 10;\n    timeSinceLastCalled = timeSinceLastCalled || 0;\n\n    if(timeSinceLastCalled === 0){ // Fixed, simple stepping\n\n        this.internalStep(dt);\n\n        // Increment time\n        this.time += dt;\n\n    } else {\n\n        // Compute the number of fixed steps we should have taken since the last step\n        var internalSteps = Math.floor((this.time + timeSinceLastCalled) / dt) - Math.floor(this.time / dt);\n        internalSteps = Math.min(internalSteps,maxSubSteps);\n\n        // Do some fixed steps to catch up\n        var t0 = performance.now();\n        for(var i=0; i!==internalSteps; i++){\n            this.internalStep(dt);\n            if(performance.now() - t0 > dt * 1000){\n                // We are slower than real-time. Better bail out.\n                break;\n            }\n        }\n\n        // Increment internal clock\n        this.time += timeSinceLastCalled;\n\n        // Compute \"Left over\" time step\n        var h = this.time % dt;\n        var h_div_dt = h / dt;\n        var interpvelo = step_tmp1;\n        var bodies = this.bodies;\n\n        for(var j=0; j !== bodies.length; j++){\n            var b = bodies[j];\n            if(b.type !== Body.STATIC && b.sleepState !== Body.SLEEPING){\n\n                // Interpolate\n                b.position.vsub(b.previousPosition, interpvelo);\n                interpvelo.scale(h_div_dt, interpvelo);\n                b.position.vadd(interpvelo, b.interpolatedPosition);\n\n                // TODO: interpolate quaternion\n                // b.interpolatedAngle = b.angle + (b.angle - b.previousAngle) * h_div_dt;\n\n            } else {\n\n                // For static bodies, just copy. Who else will do it?\n                b.interpolatedPosition.copy(b.position);\n                b.interpolatedQuaternion.copy(b.quaternion);\n            }\n        }\n    }\n};\n\n/**\n * Step the simulation\n * @method step\n * @param {Number} dt\n */\nvar World_step_postStepEvent = {type:\"postStep\"}, // Reusable event objects to save memory\n    World_step_preStepEvent = {type:\"preStep\"},\n    World_step_collideEvent = {type:\"collide\", body:null, contact:null },\n    World_step_oldContacts = [], // Pools for unused objects\n    World_step_frictionEquationPool = [],\n    World_step_p1 = [], // Reusable arrays for collision pairs\n    World_step_p2 = [],\n    World_step_gvec = new Vec3(), // Temporary vectors and quats\n    World_step_vi = new Vec3(),\n    World_step_vj = new Vec3(),\n    World_step_wi = new Vec3(),\n    World_step_wj = new Vec3(),\n    World_step_t1 = new Vec3(),\n    World_step_t2 = new Vec3(),\n    World_step_rixn = new Vec3(),\n    World_step_rjxn = new Vec3(),\n    World_step_step_q = new Quaternion(),\n    World_step_step_w = new Quaternion(),\n    World_step_step_wq = new Quaternion(),\n    invI_tau_dt = new Vec3();\nWorld.prototype.internalStep = function(dt){\n    this.dt = dt;\n\n    var world = this,\n        that = this,\n        contacts = this.contacts,\n        p1 = World_step_p1,\n        p2 = World_step_p2,\n        N = this.numObjects(),\n        bodies = this.bodies,\n        solver = this.solver,\n        gravity = this.gravity,\n        doProfiling = this.doProfiling,\n        profile = this.profile,\n        DYNAMIC = Body.DYNAMIC,\n        profilingStart,\n        constraints = this.constraints,\n        frictionEquationPool = World_step_frictionEquationPool,\n        gnorm = gravity.norm(),\n        gx = gravity.x,\n        gy = gravity.y,\n        gz = gravity.z,\n        i=0;\n\n    if(doProfiling){\n        profilingStart = performance.now();\n    }\n\n    // Add gravity to all objects\n    for(i=0; i!==N; i++){\n        var bi = bodies[i];\n        if(bi.type & DYNAMIC){ // Only for dynamic bodies\n            var f = bi.force, m = bi.mass;\n            f.x += m*gx;\n            f.y += m*gy;\n            f.z += m*gz;\n        }\n    }\n\n    // Update subsystems\n    for(var i=0, Nsubsystems=this.subsystems.length; i!==Nsubsystems; i++){\n        this.subsystems[i].update();\n    }\n\n    // Collision detection\n    if(doProfiling){ profilingStart = performance.now(); }\n    p1.length = 0; // Clean up pair arrays from last step\n    p2.length = 0;\n    this.broadphase.collisionPairs(this,p1,p2);\n    if(doProfiling){ profile.broadphase = performance.now() - profilingStart; }\n\n    // Remove constrained pairs with collideConnected == false\n    var Nconstraints = constraints.length;\n    for(i=0; i!==Nconstraints; i++){\n        var c = constraints[i];\n        if(!c.collideConnected){\n            for(var j = p1.length-1; j>=0; j-=1){\n                if( (c.bodyA === p1[j] && c.bodyB === p2[j]) ||\n                    (c.bodyB === p1[j] && c.bodyA === p2[j])){\n                    p1.splice(j, 1);\n                    p2.splice(j, 1);\n                }\n            }\n        }\n    }\n\n    this.collisionMatrixTick();\n\n    // Generate contacts\n    if(doProfiling){ profilingStart = performance.now(); }\n    var oldcontacts = World_step_oldContacts;\n    var NoldContacts = contacts.length;\n\n    for(i=0; i!==NoldContacts; i++){\n        oldcontacts.push(contacts[i]);\n    }\n    contacts.length = 0;\n\n    // Transfer FrictionEquation from current list to the pool for reuse\n    var NoldFrictionEquations = this.frictionEquations.length;\n    for(i=0; i!==NoldFrictionEquations; i++){\n        frictionEquationPool.push(this.frictionEquations[i]);\n    }\n    this.frictionEquations.length = 0;\n\n    this.narrowphase.getContacts(\n        p1,\n        p2,\n        this,\n        contacts,\n        oldcontacts, // To be reused\n        this.frictionEquations,\n        frictionEquationPool\n    );\n\n    if(doProfiling){\n        profile.narrowphase = performance.now() - profilingStart;\n    }\n\n    // Loop over all collisions\n    if(doProfiling){\n        profilingStart = performance.now();\n    }\n\n    // Add all friction eqs\n    for (var i = 0; i < this.frictionEquations.length; i++) {\n        solver.addEquation(this.frictionEquations[i]);\n    }\n\n    var ncontacts = contacts.length;\n    for(var k=0; k!==ncontacts; k++){\n\n        // Current contact\n        var c = contacts[k];\n\n        // Get current collision indeces\n        var bi = c.bi,\n            bj = c.bj,\n            si = c.si,\n            sj = c.sj;\n\n        // Get collision properties\n        var cm;\n        if(bi.material && bj.material){\n            cm = this.getContactMaterial(bi.material,bj.material) || this.defaultContactMaterial;\n        } else {\n            cm = this.defaultContactMaterial;\n        }\n\n        // c.enabled = bi.collisionResponse && bj.collisionResponse && si.collisionResponse && sj.collisionResponse;\n\n        var mu = cm.friction;\n        // c.restitution = cm.restitution;\n\n        // If friction or restitution were specified in the material, use them\n        if(bi.material && bj.material){\n            if(bi.material.friction >= 0 && bj.material.friction >= 0){\n                mu = bi.material.friction * bj.material.friction;\n            }\n\n            if(bi.material.restitution >= 0 && bj.material.restitution >= 0){\n                c.restitution = bi.material.restitution * bj.material.restitution;\n            }\n        }\n\n\t\t// c.setSpookParams(\n  //           cm.contactEquationStiffness,\n  //           cm.contactEquationRelaxation,\n  //           dt\n  //       );\n\n\t\tsolver.addEquation(c);\n\n\t\t// // Add friction constraint equation\n\t\t// if(mu > 0){\n\n\t\t// \t// Create 2 tangent equations\n\t\t// \tvar mug = mu * gnorm;\n\t\t// \tvar reducedMass = (bi.invMass + bj.invMass);\n\t\t// \tif(reducedMass > 0){\n\t\t// \t\treducedMass = 1/reducedMass;\n\t\t// \t}\n\t\t// \tvar pool = frictionEquationPool;\n\t\t// \tvar c1 = pool.length ? pool.pop() : new FrictionEquation(bi,bj,mug*reducedMass);\n\t\t// \tvar c2 = pool.length ? pool.pop() : new FrictionEquation(bi,bj,mug*reducedMass);\n\t\t// \tthis.frictionEquations.push(c1, c2);\n\n\t\t// \tc1.bi = c2.bi = bi;\n\t\t// \tc1.bj = c2.bj = bj;\n\t\t// \tc1.minForce = c2.minForce = -mug*reducedMass;\n\t\t// \tc1.maxForce = c2.maxForce = mug*reducedMass;\n\n\t\t// \t// Copy over the relative vectors\n\t\t// \tc1.ri.copy(c.ri);\n\t\t// \tc1.rj.copy(c.rj);\n\t\t// \tc2.ri.copy(c.ri);\n\t\t// \tc2.rj.copy(c.rj);\n\n\t\t// \t// Construct tangents\n\t\t// \tc.ni.tangents(c1.t, c2.t);\n\n  //           // Set spook params\n  //           c1.setSpookParams(cm.frictionEquationStiffness, cm.frictionEquationRelaxation, dt);\n  //           c2.setSpookParams(cm.frictionEquationStiffness, cm.frictionEquationRelaxation, dt);\n\n  //           c1.enabled = c2.enabled = c.enabled;\n\n\t\t// \t// Add equations to solver\n\t\t// \tsolver.addEquation(c1);\n\t\t// \tsolver.addEquation(c2);\n\t\t// }\n\n        if( bi.allowSleep &&\n            bi.type === Body.DYNAMIC &&\n            bi.sleepState  === Body.SLEEPING &&\n            bj.sleepState  === Body.AWAKE &&\n            bj.type !== Body.STATIC\n        ){\n            var speedSquaredB = bj.velocity.norm2() + bj.angularVelocity.norm2();\n            var speedLimitSquaredB = Math.pow(bj.sleepSpeedLimit,2);\n            if(speedSquaredB >= speedLimitSquaredB*2){\n                bi._wakeUpAfterNarrowphase = true;\n            }\n        }\n\n        if( bj.allowSleep &&\n            bj.type === Body.DYNAMIC &&\n            bj.sleepState  === Body.SLEEPING &&\n            bi.sleepState  === Body.AWAKE &&\n            bi.type !== Body.STATIC\n        ){\n            var speedSquaredA = bi.velocity.norm2() + bi.angularVelocity.norm2();\n            var speedLimitSquaredA = Math.pow(bi.sleepSpeedLimit,2);\n            if(speedSquaredA >= speedLimitSquaredA*2){\n                bj._wakeUpAfterNarrowphase = true;\n            }\n        }\n\n        // Now we know that i and j are in contact. Set collision matrix state\n\t\tthis.collisionMatrix.set(bi, bj, true);\n\n        if (!this.collisionMatrixPrevious.get(bi, bj)) {\n            // First contact!\n            // We reuse the collideEvent object, otherwise we will end up creating new objects for each new contact, even if there's no event listener attached.\n            World_step_collideEvent.body = bj;\n            World_step_collideEvent.contact = c;\n            bi.dispatchEvent(World_step_collideEvent);\n\n            World_step_collideEvent.body = bi;\n            bj.dispatchEvent(World_step_collideEvent);\n        }\n    }\n    if(doProfiling){\n        profile.makeContactConstraints = performance.now() - profilingStart;\n        profilingStart = performance.now();\n    }\n\n    // Wake up bodies\n    for(i=0; i!==N; i++){\n        var bi = bodies[i];\n        if(bi._wakeUpAfterNarrowphase){\n            bi.wakeUp();\n            bi._wakeUpAfterNarrowphase = false;\n        }\n    }\n\n    // Add user-added constraints\n    var Nconstraints = constraints.length;\n    for(i=0; i!==Nconstraints; i++){\n        var c = constraints[i];\n        c.update();\n        for(var j=0, Neq=c.equations.length; j!==Neq; j++){\n            var eq = c.equations[j];\n            solver.addEquation(eq);\n        }\n    }\n\n    // Solve the constrained system\n    solver.solve(dt,this);\n\n    if(doProfiling){\n        profile.solve = performance.now() - profilingStart;\n    }\n\n    // Remove all contacts from solver\n    solver.removeAllEquations();\n\n    // Apply damping, see http://code.google.com/p/bullet/issues/detail?id=74 for details\n    var pow = Math.pow;\n    for(i=0; i!==N; i++){\n        var bi = bodies[i];\n        if(bi.type & DYNAMIC){ // Only for dynamic bodies\n            var ld = pow(1.0 - bi.linearDamping,dt);\n            var v = bi.velocity;\n            v.mult(ld,v);\n            var av = bi.angularVelocity;\n            if(av){\n                var ad = pow(1.0 - bi.angularDamping,dt);\n                av.mult(ad,av);\n            }\n        }\n    }\n\n    this.dispatchEvent(World_step_preStepEvent);\n\n    // Invoke pre-step callbacks\n    for(i=0; i!==N; i++){\n        var bi = bodies[i];\n        if(bi.preStep){\n            bi.preStep.call(bi);\n        }\n    }\n\n    // Leap frog\n    // vnew = v + h*f/m\n    // xnew = x + h*vnew\n    if(doProfiling){\n        profilingStart = performance.now();\n    }\n    var q = World_step_step_q;\n    var w = World_step_step_w;\n    var wq = World_step_step_wq;\n    var stepnumber = this.stepnumber;\n    var DYNAMIC_OR_KINEMATIC = Body.DYNAMIC | Body.KINEMATIC;\n    var quatNormalize = stepnumber % (this.quatNormalizeSkip+1) === 0;\n    var quatNormalizeFast = this.quatNormalizeFast;\n    var half_dt = dt * 0.5;\n    var PLANE = Shape.types.PLANE,\n        CONVEX = Shape.types.CONVEXPOLYHEDRON;\n\n    for(i=0; i!==N; i++){\n        var b = bodies[i],\n            force = b.force,\n            tau = b.torque;\n        if((b.type & DYNAMIC_OR_KINEMATIC) && b.sleepState !== Body.SLEEPING){ // Only for dynamic\n            var velo = b.velocity,\n                angularVelo = b.angularVelocity,\n                pos = b.position,\n                quat = b.quaternion,\n                invMass = b.invMass,\n                invInertia = b.invInertiaWorld;\n\n            velo.x += force.x * invMass * dt;\n            velo.y += force.y * invMass * dt;\n            velo.z += force.z * invMass * dt;\n\n            if(b.angularVelocity){\n                invInertia.vmult(tau,invI_tau_dt);\n                invI_tau_dt.mult(dt,invI_tau_dt);\n                invI_tau_dt.vadd(angularVelo,angularVelo);\n            }\n\n            // Use new velocity  - leap frog\n            pos.x += velo.x * dt;\n            pos.y += velo.y * dt;\n            pos.z += velo.z * dt;\n\n            if(b.angularVelocity){\n                w.set(angularVelo.x, angularVelo.y, angularVelo.z, 0);\n                w.mult(quat,wq);\n                quat.x += half_dt * wq.x;\n                quat.y += half_dt * wq.y;\n                quat.z += half_dt * wq.z;\n                quat.w += half_dt * wq.w;\n                if(quatNormalize){\n                    if(quatNormalizeFast){\n                        quat.normalizeFast();\n                    } else {\n                        quat.normalize();\n                    }\n                }\n            }\n\n            if(b.aabb){\n                b.aabbNeedsUpdate = true;\n            }\n\n            // Update world inertia\n            if(b.updateInertiaWorld){\n                b.updateInertiaWorld();\n            }\n        }\n    }\n    this.clearForces();\n\n    this.broadphase.dirty = true;\n\n    if(doProfiling){\n        profile.integrate = performance.now() - profilingStart;\n    }\n\n    // Update world time\n    this.time += dt;\n    this.stepnumber += 1;\n\n    this.dispatchEvent(World_step_postStepEvent);\n\n    // Invoke post-step callbacks\n    for(i=0; i!==N; i++){\n        var bi = bodies[i];\n        var postStep = bi.postStep;\n        if(postStep){\n            postStep.call(bi);\n        }\n    }\n\n    // Sleeping update\n    if(this.allowSleep){\n        for(i=0; i!==N; i++){\n            bodies[i].sleepTick(this.time);\n        }\n    }\n};\n\n/**\n * Sets all body forces in the world to zero.\n * @method clearForces\n */\nWorld.prototype.clearForces = function(){\n    var bodies = this.bodies;\n    var N = bodies.length;\n    for(var i=0; i !== N; i++){\n        var b = bodies[i],\n            force = b.force,\n            tau = b.torque;\n\n        b.force.set(0,0,0);\n        b.torque.set(0,0,0);\n    }\n};\n\n},{\"../collision/AABB\":3,\"../collision/ArrayCollisionMatrix\":4,\"../collision/NaiveBroadphase\":7,\"../collision/Ray\":9,\"../collision/RaycastResult\":10,\"../equations/ContactEquation\":19,\"../equations/FrictionEquation\":21,\"../material/ContactMaterial\":24,\"../material/Material\":25,\"../math/Quaternion\":28,\"../math/Vec3\":30,\"../objects/Body\":31,\"../shapes/Shape\":43,\"../solver/GSSolver\":46,\"../utils/EventTarget\":49,\"../utils/TupleDictionary\":52,\"../utils/Vec3Pool\":54,\"./Narrowphase\":55}]},{},[2])\n(2)\n});"
  },
  {
    "path": "examples/libs/draco/README.md",
    "content": "# Draco 3D Data Compression\n\nDraco is an open-source library for compressing and decompressing 3D geometric meshes and point clouds. It is intended to improve the storage and transmission of 3D graphics.\n\n[Website](https://google.github.io/draco/) | [GitHub](https://github.com/google/draco)\n\n## Contents\n\nThis folder contains three utilities:\n\n* `draco_decoder.js` — Emscripten-compiled decoder, compatible with any modern browser.\n* `draco_decoder.wasm` — WebAssembly decoder, compatible with newer browsers and devices.\n* `draco_wasm_wrapper.js` — JavaScript wrapper for the WASM decoder.\n\nEach file is provided in two variations:\n\n* **Default:** Latest stable builds, tracking the project's [master branch](https://github.com/google/draco).\n* **glTF:** Builds targeted by the [glTF mesh compression extension](https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_draco_mesh_compression), tracking the [corresponding Draco branch](https://github.com/google/draco/tree/gltf_2.0_draco_extension).\n\nEither variation may be used with `DRACOLoader`:\n\n```js\nconst dracoLoader = new DRACOLoader();\ndracoLoader.setDecoderPath('path/to/decoders/');\ndracoLoader.setDecoderConfig({type: 'js'}); // (Optional) Override detection of WASM support.\n```\n\nFurther [documentation on GitHub](https://github.com/google/draco/tree/master/javascript/example#static-loading-javascript-decoder).\n\n## License\n\n[Apache License 2.0](https://github.com/google/draco/blob/master/LICENSE)\n"
  },
  {
    "path": "examples/libs/draco/draco_decoder.js",
    "content": "\nvar DracoDecoderModule = (() => {\n  var _scriptDir = typeof document !== 'undefined' && document.currentScript ? document.currentScript.src : undefined;\n  if (typeof __filename !== 'undefined') _scriptDir = _scriptDir || __filename;\n  return (\nfunction(DracoDecoderModule = {})  {\n\nvar Module=typeof DracoDecoderModule!=\"undefined\"?DracoDecoderModule:{};var readyPromiseResolve,readyPromiseReject;Module[\"ready\"]=new Promise(function(resolve,reject){readyPromiseResolve=resolve;readyPromiseReject=reject});var isRuntimeInitialized=false;var isModuleParsed=false;Module[\"onRuntimeInitialized\"]=function(){isRuntimeInitialized=true;if(isModuleParsed){if(typeof Module[\"onModuleLoaded\"]===\"function\"){Module[\"onModuleLoaded\"](Module)}}};Module[\"onModuleParsed\"]=function(){isModuleParsed=true;if(isRuntimeInitialized){if(typeof Module[\"onModuleLoaded\"]===\"function\"){Module[\"onModuleLoaded\"](Module)}}};function isVersionSupported(versionString){if(typeof versionString!==\"string\")return false;const version=versionString.split(\".\");if(version.length<2||version.length>3)return false;if(version[0]==1&&version[1]>=0&&version[1]<=5)return true;if(version[0]!=0||version[1]>10)return false;return true}Module[\"isVersionSupported\"]=isVersionSupported;var moduleOverrides=Object.assign({},Module);var arguments_=[];var thisProgram=\"./this.program\";var quit_=(status,toThrow)=>{throw toThrow};var ENVIRONMENT_IS_WEB=typeof window==\"object\";var ENVIRONMENT_IS_WORKER=typeof importScripts==\"function\";var ENVIRONMENT_IS_NODE=typeof process==\"object\"&&typeof process.versions==\"object\"&&typeof process.versions.node==\"string\";var scriptDirectory=\"\";function locateFile(path){if(Module[\"locateFile\"]){return Module[\"locateFile\"](path,scriptDirectory)}return scriptDirectory+path}var read_,readAsync,readBinary,setWindowTitle;function logExceptionOnExit(e){if(e instanceof ExitStatus)return;let toLog=e;err(\"exiting due to exception: \"+toLog)}if(ENVIRONMENT_IS_NODE){var fs=require(\"fs\");var nodePath=require(\"path\");if(ENVIRONMENT_IS_WORKER){scriptDirectory=nodePath.dirname(scriptDirectory)+\"/\"}else{scriptDirectory=__dirname+\"/\"}read_=(filename,binary)=>{var ret=tryParseAsDataURI(filename);if(ret){return binary?ret:ret.toString()}filename=isFileURI(filename)?new URL(filename):nodePath.normalize(filename);return fs.readFileSync(filename,binary?undefined:\"utf8\")};readBinary=filename=>{var ret=read_(filename,true);if(!ret.buffer){ret=new Uint8Array(ret)}return ret};readAsync=(filename,onload,onerror)=>{var ret=tryParseAsDataURI(filename);if(ret){onload(ret)}filename=isFileURI(filename)?new URL(filename):nodePath.normalize(filename);fs.readFile(filename,function(err,data){if(err)onerror(err);else onload(data.buffer)})};if(process[\"argv\"].length>1){thisProgram=process[\"argv\"][1].replace(/\\\\/g,\"/\")}arguments_=process[\"argv\"].slice(2);quit_=(status,toThrow)=>{if(keepRuntimeAlive()){process[\"exitCode\"]=status;throw toThrow}logExceptionOnExit(toThrow);process[\"exit\"](status)};Module[\"inspect\"]=function(){return\"[Emscripten Module object]\"}}else if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){if(ENVIRONMENT_IS_WORKER){scriptDirectory=self.location.href}else if(typeof document!=\"undefined\"&&document.currentScript){scriptDirectory=document.currentScript.src}if(_scriptDir){scriptDirectory=_scriptDir}if(scriptDirectory.indexOf(\"blob:\")!==0){scriptDirectory=scriptDirectory.substr(0,scriptDirectory.replace(/[?#].*/,\"\").lastIndexOf(\"/\")+1)}else{scriptDirectory=\"\"}{read_=url=>{try{var xhr=new XMLHttpRequest;xhr.open(\"GET\",url,false);xhr.send(null);return xhr.responseText}catch(err){var data=tryParseAsDataURI(url);if(data){return intArrayToString(data)}throw err}};if(ENVIRONMENT_IS_WORKER){readBinary=url=>{try{var xhr=new XMLHttpRequest;xhr.open(\"GET\",url,false);xhr.responseType=\"arraybuffer\";xhr.send(null);return new Uint8Array(xhr.response)}catch(err){var data=tryParseAsDataURI(url);if(data){return data}throw err}}}readAsync=(url,onload,onerror)=>{var xhr=new XMLHttpRequest;xhr.open(\"GET\",url,true);xhr.responseType=\"arraybuffer\";xhr.onload=()=>{if(xhr.status==200||xhr.status==0&&xhr.response){onload(xhr.response);return}var data=tryParseAsDataURI(url);if(data){onload(data.buffer);return}onerror()};xhr.onerror=onerror;xhr.send(null)}}setWindowTitle=title=>document.title=title}else{}var out=Module[\"print\"]||console.log.bind(console);var err=Module[\"printErr\"]||console.warn.bind(console);Object.assign(Module,moduleOverrides);moduleOverrides=null;if(Module[\"arguments\"])arguments_=Module[\"arguments\"];if(Module[\"thisProgram\"])thisProgram=Module[\"thisProgram\"];if(Module[\"quit\"])quit_=Module[\"quit\"];var wasmBinary;if(Module[\"wasmBinary\"])wasmBinary=Module[\"wasmBinary\"];var noExitRuntime=Module[\"noExitRuntime\"]||true;var WebAssembly={Memory:function(opts){this.buffer=new ArrayBuffer(opts[\"initial\"]*65536)},Module:function(binary){},Instance:function(module,info){this.exports=(\n// EMSCRIPTEN_START_ASM\nfunction instantiate(na){function c(d){d.set=function(a,b){this[a]=b};d.get=function(a){return this[a]};return d}var e;var f=new Uint8Array(123);for(var a=25;a>=0;--a){f[48+a]=52+a;f[65+a]=a;f[97+a]=26+a}f[43]=62;f[47]=63;function l(m,n,o){var g,h,a=0,i=n,j=o.length,k=n+(j*3>>2)-(o[j-2]==\"=\")-(o[j-1]==\"=\");for(;a<j;a+=4){g=f[o.charCodeAt(a+1)];h=f[o.charCodeAt(a+2)];m[i++]=f[o.charCodeAt(a)]<<2|g>>4;if(i<k)m[i++]=g<<4|h>>2;if(i<k)m[i++]=h<<6|f[o.charCodeAt(a+3)]}}function p(q){l(e,1028,\"YAQAAAIAAAADAAAABAAAAAUAAAAGAAAABwAAAAgAAAAJAAAACgAAAAsAAAAMAAAADQAAAE41ZHJhY28yOEF0dHJpYnV0ZU9jdGFoZWRyb25UcmFuc2Zvcm1FAAAYOwAAOAQAALAHAAAtKyAgIDBYMHgAX19uZXh0X3ByaW1lIG92ZXJmbG93AHZlY3RvcgBzdGQ6OmV4Y2VwdGlvbgBza2lwX2F0dHJpYnV0ZV90cmFuc2Zvcm0AYmFkX2FycmF5X25ld19sZW5ndGgAYmFzaWNfc3RyaW5nAHN0ZDo6YmFkX2FsbG9jAERSQUNPAFVzaW5nIGluY29tcGF0aWJsZSBkZWNvZGVyIGZvciB0aGUgaW5wdXQgZ2VvbWV0cnkuAEZhaWxlZCB0byBkZWNvZGUgcG9pbnQgYXR0cmlidXRlcy4ARmFpbGVkIHRvIGluaXRpYWxpemUgdGhlIGRlY29kZXIuAFVua25vd24gbWlub3IgdmVyc2lvbi4AVW5rbm93biBtYWpvciB2ZXJzaW9uLgBJbnB1dCBpcyBub3QgYSBtZXNoLgBVbnN1cHBvcnRlZCBnZW9tZXRyeSB0eXBlLgBOb3QgYSBEcmFjbyBmaWxlLgBJbnB1dCBpcyBub3QgYSBwb2ludCBjbG91ZC4AVW5zdXBwb3J0ZWQgZW5jb2RpbmcgbWV0aG9kLgBGYWlsZWQgdG8gZGVjb2RlIG1ldGFkYXRhLgBGYWlsZWQgdG8gZGVjb2RlIGdlb21ldHJ5IGRhdGEuAChudWxsKQBQdXJlIHZpcnR1YWwgZnVuY3Rpb24gY2FsbGVkIQBLZFRyZWVBdHRyaWJ1dGVzRGVjb2RlcjogY29tcHJlc3Npb24gbGV2ZWwgJWkgbm90IHN1cHBvcnRlZC4KAEZsb2F0UG9pbnRzVHJlZURlY29kZXI6IGNvbXByZXNzaW9uIGxldmVsICVpIG5vdCBzdXBwb3J0ZWQuCgBWZXJzaW9uIG5vdCBzdXBwb3J0ZWQuIAoATWV0aG9kIG5vdCBzdXBwb3J0ZWQuIAoAAAAAAACEBwAADwAAABAAAAARAAAAEgAAABMAAAAUAAAAFQAAABYAAAAXAAAACwAAABgAAAAZAAAATjVkcmFjbzMwQXR0cmlidXRlUXVhbnRpemF0aW9uVHJhbnNmb3JtRQAAAAAYOwAAWAcAALAHAABONWRyYWNvMThBdHRyaWJ1dGVUcmFuc2Zvcm1FAAAAAPA6AACQBwAAAAAAADwIAAAaAAAAGwAAABwAAAAdAAAAHgAAAB8AAAAgAAAAIQAAACIAAAAjAAAAJAAAACUAAABONWRyYWNvMTdBdHRyaWJ1dGVzRGVjb2RlckUATjVkcmFjbzI2QXR0cmlidXRlc0RlY29kZXJJbnRlcmZhY2VFAAAAAPA6AAAMCAAAGDsAAPAHAAA0CAAAAAAAAKQIAAAmAAAAJwAAABwAAAAdAAAAHgAAAB8AAAAgAAAAIQAAACIAAAAoAAAAKQAAACoAAABONWRyYWNvMjNLZFRyZWVBdHRyaWJ1dGVzRGVjb2RlckUAAAAYOwAAgAgAADwIAAAAAAAABAkAACsAAAAsAAAALQAAAC4AAAAvAAAAMAAAADEAAAAyAAAAMwAAAE41ZHJhY28yNlNlcXVlbnRpYWxBdHRyaWJ1dGVEZWNvZGVyRQAAAADwOgAA3AgAAP////8AAAAAfAkAADQAAAA1AAAAHAAAADYAAAA3AAAAHwAAACAAAAAhAAAAOAAAADkAAAA6AAAAOwAAADwAAABONWRyYWNvMzdTZXF1ZW50aWFsQXR0cmlidXRlRGVjb2RlcnNDb250cm9sbGVyRQAYOwAATAkAADwIAAAAAAAA8AkAAD0AAAA+AAAAPwAAAC4AAAAvAAAAMAAAAEAAAAAyAAAAQQAAAEIAAABDAAAARAAAAEUAAABONWRyYWNvMzNTZXF1ZW50aWFsSW50ZWdlckF0dHJpYnV0ZURlY29kZXJFABg7AADECQAABAkAAAAAAAB8DAAARgAAAEcAAABIAAAASQAAAEoAAABLAAAATAAAAE0AAABOAAAATwAAAFAAAABRAAAATjVkcmFjbzQwTWVzaFByZWRpY3Rpb25TY2hlbWVQYXJhbGxlbG9ncmFtRGVjb2RlcklpTlNfMzdQcmVkaWN0aW9uU2NoZW1lV3JhcERlY29kaW5nVHJhbnNmb3JtSWlpRUVOU18yNE1lc2hQcmVkaWN0aW9uU2NoZW1lRGF0YUlOU18yNE1lc2hBdHRyaWJ1dGVDb3JuZXJUYWJsZUVFRUVFAE41ZHJhY28yN01lc2hQcmVkaWN0aW9uU2NoZW1lRGVjb2RlcklpTlNfMzdQcmVkaWN0aW9uU2NoZW1lV3JhcERlY29kaW5nVHJhbnNmb3JtSWlpRUVOU18yNE1lc2hQcmVkaWN0aW9uU2NoZW1lRGF0YUlOU18yNE1lc2hBdHRyaWJ1dGVDb3JuZXJUYWJsZUVFRUVFAE41ZHJhY28yM1ByZWRpY3Rpb25TY2hlbWVEZWNvZGVySWlOU18zN1ByZWRpY3Rpb25TY2hlbWVXcmFwRGVjb2RpbmdUcmFuc2Zvcm1JaWlFRUVFAE41ZHJhY28zN1ByZWRpY3Rpb25TY2hlbWVUeXBlZERlY29kZXJJbnRlcmZhY2VJaWlFRQBONWRyYWNvMzJQcmVkaWN0aW9uU2NoZW1lRGVjb2RlckludGVyZmFjZUUATjVkcmFjbzI1UHJlZGljdGlvblNjaGVtZUludGVyZmFjZUUA8DoAACAMAAAYOwAA9QsAAEQMAAAYOwAAwQsAAEwMAAAYOwAAbQsAAFgMAAAYOwAA1woAAGQMAAAYOwAANAoAAHAMAAAAAAAAcAwAAEYAAABSAAAAIwAAAEkAAAAjAAAASwAAAEwAAABNAAAATgAAAE8AAABQAAAAIwAAAAAAAABkDAAARgAAAFMAAAAjAAAASQAAACMAAABLAAAATAAAAE0AAABOAAAATwAAAFAAAAAjAAAAAAAAANgNAABGAAAAVAAAAFUAAABJAAAAVgAAAEsAAABMAAAATQAAAE4AAABPAAAAUAAAAFcAAABONWRyYWNvNDVNZXNoUHJlZGljdGlvblNjaGVtZU11bHRpUGFyYWxsZWxvZ3JhbURlY29kZXJJaU5TXzM3UHJlZGljdGlvblNjaGVtZVdyYXBEZWNvZGluZ1RyYW5zZm9ybUlpaUVFTlNfMjRNZXNoUHJlZGljdGlvblNjaGVtZURhdGFJTlNfMjRNZXNoQXR0cmlidXRlQ29ybmVyVGFibGVFRUVFRQAYOwAAMA0AAHAMAAAAAAAA0A4AAFgAAABZAAAAWgAAAEkAAABbAAAASwAAAEwAAABNAAAATgAAAE8AAABcAAAAXQAAAE41ZHJhY281Nk1lc2hQcmVkaWN0aW9uU2NoZW1lQ29uc3RyYWluZWRNdWx0aVBhcmFsbGVsb2dyYW1EZWNvZGVySWlOU18zN1ByZWRpY3Rpb25TY2hlbWVXcmFwRGVjb2RpbmdUcmFuc2Zvcm1JaWlFRU5TXzI0TWVzaFByZWRpY3Rpb25TY2hlbWVEYXRhSU5TXzI0TWVzaEF0dHJpYnV0ZUNvcm5lclRhYmxlRUVFRUUAABg7AAAcDgAAcAwAAAAAAAC0DwAAXgAAAF8AAABgAAAASQAAAGEAAABiAAAAYwAAAGQAAABOAAAATwAAAGUAAABmAAAATjVkcmFjbzM2TWVzaFByZWRpY3Rpb25TY2hlbWVUZXhDb29yZHNEZWNvZGVySWlOU18zN1ByZWRpY3Rpb25TY2hlbWVXcmFwRGVjb2RpbmdUcmFuc2Zvcm1JaWlFRU5TXzI0TWVzaFByZWRpY3Rpb25TY2hlbWVEYXRhSU5TXzI0TWVzaEF0dHJpYnV0ZUNvcm5lclRhYmxlRUVFRUUAABg7AAAUDwAAcAwAAAAAAACgEAAAZwAAAGgAAABpAAAASQAAAGoAAABrAAAAbAAAAG0AAABOAAAATwAAAG4AAABvAAAATjVkcmFjbzQ0TWVzaFByZWRpY3Rpb25TY2hlbWVUZXhDb29yZHNQb3J0YWJsZURlY29kZXJJaU5TXzM3UHJlZGljdGlvblNjaGVtZVdyYXBEZWNvZGluZ1RyYW5zZm9ybUlpaUVFTlNfMjRNZXNoUHJlZGljdGlvblNjaGVtZURhdGFJTlNfMjRNZXNoQXR0cmlidXRlQ29ybmVyVGFibGVFRUVFRQAAGDsAAPgPAABwDAAAAAAAAIwRAABwAAAAcQAAAHIAAABJAAAAcwAAAHQAAAB1AAAAdgAAAE4AAABPAAAAdwAAAHgAAABONWRyYWNvNDJNZXNoUHJlZGljdGlvblNjaGVtZUdlb21ldHJpY05vcm1hbERlY29kZXJJaU5TXzM3UHJlZGljdGlvblNjaGVtZVdyYXBEZWNvZGluZ1RyYW5zZm9ybUlpaUVFTlNfMjRNZXNoUHJlZGljdGlvblNjaGVtZURhdGFJTlNfMjRNZXNoQXR0cmlidXRlQ29ybmVyVGFibGVFRUVFRQAAAAAYOwAA5BAAAHAMAAAAAAAAFBMAAHkAAAB6AAAAewAAAHwAAAB9AAAATjVkcmFjbzQ4TWVzaFByZWRpY3Rpb25TY2hlbWVHZW9tZXRyaWNOb3JtYWxQcmVkaWN0b3JBcmVhSWlOU18zN1ByZWRpY3Rpb25TY2hlbWVXcmFwRGVjb2RpbmdUcmFuc2Zvcm1JaWlFRU5TXzI0TWVzaFByZWRpY3Rpb25TY2hlbWVEYXRhSU5TXzI0TWVzaEF0dHJpYnV0ZUNvcm5lclRhYmxlRUVFRUUATjVkcmFjbzQ4TWVzaFByZWRpY3Rpb25TY2hlbWVHZW9tZXRyaWNOb3JtYWxQcmVkaWN0b3JCYXNlSWlOU18zN1ByZWRpY3Rpb25TY2hlbWVXcmFwRGVjb2RpbmdUcmFuc2Zvcm1JaWlFRU5TXzI0TWVzaFByZWRpY3Rpb25TY2hlbWVEYXRhSU5TXzI0TWVzaEF0dHJpYnV0ZUNvcm5lclRhYmxlRUVFRUUAAADwOgAAXxIAABg7AAC0EQAADBMAAAAAAAAMEwAAeQAAAH4AAAAjAAAAfAAAACMAAAAAAAAAoBQAAEYAAAB/AAAAgAAAAEkAAACBAAAASwAAAEwAAABNAAAATgAAAE8AAABQAAAAggAAAE41ZHJhY280ME1lc2hQcmVkaWN0aW9uU2NoZW1lUGFyYWxsZWxvZ3JhbURlY29kZXJJaU5TXzM3UHJlZGljdGlvblNjaGVtZVdyYXBEZWNvZGluZ1RyYW5zZm9ybUlpaUVFTlNfMjRNZXNoUHJlZGljdGlvblNjaGVtZURhdGFJTlNfMTFDb3JuZXJUYWJsZUVFRUVFAE41ZHJhY28yN01lc2hQcmVkaWN0aW9uU2NoZW1lRGVjb2RlcklpTlNfMzdQcmVkaWN0aW9uU2NoZW1lV3JhcERlY29kaW5nVHJhbnNmb3JtSWlpRUVOU18yNE1lc2hQcmVkaWN0aW9uU2NoZW1lRGF0YUlOU18xMUNvcm5lclRhYmxlRUVFRUUAABg7AAAKFAAAZAwAABg7AAB0EwAAlBQAAAAAAACUFAAARgAAAIMAAAAjAAAASQAAACMAAABLAAAATAAAAE0AAABOAAAATwAAAFAAAAAjAAAAAAAAALgVAABGAAAAhAAAAIUAAABJAAAAhgAAAEsAAABMAAAATQAAAE4AAABPAAAAUAAAAIcAAABONWRyYWNvNDVNZXNoUHJlZGljdGlvblNjaGVtZU11bHRpUGFyYWxsZWxvZ3JhbURlY29kZXJJaU5TXzM3UHJlZGljdGlvblNjaGVtZVdyYXBEZWNvZGluZ1RyYW5zZm9ybUlpaUVFTlNfMjRNZXNoUHJlZGljdGlvblNjaGVtZURhdGFJTlNfMTFDb3JuZXJUYWJsZUVFRUVFAAAYOwAAHBUAAJQUAAAAAAAApBYAAIgAAACJAAAAigAAAEkAAACLAAAASwAAAEwAAABNAAAATgAAAE8AAACMAAAAjQAAAE41ZHJhY281Nk1lc2hQcmVkaWN0aW9uU2NoZW1lQ29uc3RyYWluZWRNdWx0aVBhcmFsbGVsb2dyYW1EZWNvZGVySWlOU18zN1ByZWRpY3Rpb25TY2hlbWVXcmFwRGVjb2RpbmdUcmFuc2Zvcm1JaWlFRU5TXzI0TWVzaFByZWRpY3Rpb25TY2hlbWVEYXRhSU5TXzExQ29ybmVyVGFibGVFRUVFRQAAABg7AAD8FQAAlBQAAAAAAAB8FwAAjgAAAI8AAACQAAAASQAAAJEAAACSAAAAkwAAAJQAAABOAAAATwAAAJUAAACWAAAATjVkcmFjbzM2TWVzaFByZWRpY3Rpb25TY2hlbWVUZXhDb29yZHNEZWNvZGVySWlOU18zN1ByZWRpY3Rpb25TY2hlbWVXcmFwRGVjb2RpbmdUcmFuc2Zvcm1JaWlFRU5TXzI0TWVzaFByZWRpY3Rpb25TY2hlbWVEYXRhSU5TXzExQ29ybmVyVGFibGVFRUVFRQAAABg7AADoFgAAlBQAAAAAAABcGAAAlwAAAJgAAACZAAAASQAAAJoAAACbAAAAnAAAAJ0AAABOAAAATwAAAJ4AAACfAAAATjVkcmFjbzQ0TWVzaFByZWRpY3Rpb25TY2hlbWVUZXhDb29yZHNQb3J0YWJsZURlY29kZXJJaU5TXzM3UHJlZGljdGlvblNjaGVtZVdyYXBEZWNvZGluZ1RyYW5zZm9ybUlpaUVFTlNfMjRNZXNoUHJlZGljdGlvblNjaGVtZURhdGFJTlNfMTFDb3JuZXJUYWJsZUVFRUVFAAAAGDsAAMAXAACUFAAAAAAAADgZAACgAAAAoQAAAKIAAABJAAAAowAAAKQAAAClAAAApgAAAE4AAABPAAAApwAAAKgAAABONWRyYWNvNDJNZXNoUHJlZGljdGlvblNjaGVtZUdlb21ldHJpY05vcm1hbERlY29kZXJJaU5TXzM3UHJlZGljdGlvblNjaGVtZVdyYXBEZWNvZGluZ1RyYW5zZm9ybUlpaUVFTlNfMjRNZXNoUHJlZGljdGlvblNjaGVtZURhdGFJTlNfMTFDb3JuZXJUYWJsZUVFRUVFABg7AACgGAAAlBQAAAAAAACkGgAAqQAAAKoAAACrAAAArAAAAK0AAABONWRyYWNvNDhNZXNoUHJlZGljdGlvblNjaGVtZUdlb21ldHJpY05vcm1hbFByZWRpY3RvckFyZWFJaU5TXzM3UHJlZGljdGlvblNjaGVtZVdyYXBEZWNvZGluZ1RyYW5zZm9ybUlpaUVFTlNfMjRNZXNoUHJlZGljdGlvblNjaGVtZURhdGFJTlNfMTFDb3JuZXJUYWJsZUVFRUVFAE41ZHJhY280OE1lc2hQcmVkaWN0aW9uU2NoZW1lR2VvbWV0cmljTm9ybWFsUHJlZGljdG9yQmFzZUlpTlNfMzdQcmVkaWN0aW9uU2NoZW1lV3JhcERlY29kaW5nVHJhbnNmb3JtSWlpRUVOU18yNE1lc2hQcmVkaWN0aW9uU2NoZW1lRGF0YUlOU18xMUNvcm5lclRhYmxlRUVFRUUA8DoAAP4ZAAAYOwAAYBkAAJwaAAAAAAAAnBoAAKkAAACuAAAAIwAAAKwAAAAjAAAAAAAAAGAbAABGAAAArwAAALAAAABJAAAAsQAAAEsAAABMAAAATQAAAE4AAABPAAAAUAAAALIAAABONWRyYWNvMjhQcmVkaWN0aW9uU2NoZW1lRGVsdGFEZWNvZGVySWlOU18zN1ByZWRpY3Rpb25TY2hlbWVXcmFwRGVjb2RpbmdUcmFuc2Zvcm1JaWlFRUVFAAAAABg7AAAEGwAAZAwAAAAAAADUGwAAswAAALQAAAC1AAAALgAAAC8AAAC2AAAAQAAAADIAAABBAAAAtwAAALgAAAC5AAAAugAAAE41ZHJhY28zMlNlcXVlbnRpYWxOb3JtYWxBdHRyaWJ1dGVEZWNvZGVyRQAAGDsAAKgbAADwCQAAAAAAAOAdAAC7AAAAvAAAAL0AAAC+AAAAvwAAAMAAAADBAAAAwgAAAMMAAADEAAAAxQAAAMYAAABONWRyYWNvNDJNZXNoUHJlZGljdGlvblNjaGVtZUdlb21ldHJpY05vcm1hbERlY29kZXJJaU5TXzQ5UHJlZGljdGlvblNjaGVtZU5vcm1hbE9jdGFoZWRyb25EZWNvZGluZ1RyYW5zZm9ybUlpRUVOU18yNE1lc2hQcmVkaWN0aW9uU2NoZW1lRGF0YUlOU18yNE1lc2hBdHRyaWJ1dGVDb3JuZXJUYWJsZUVFRUVFAE41ZHJhY28yN01lc2hQcmVkaWN0aW9uU2NoZW1lRGVjb2RlcklpTlNfNDlQcmVkaWN0aW9uU2NoZW1lTm9ybWFsT2N0YWhlZHJvbkRlY29kaW5nVHJhbnNmb3JtSWlFRU5TXzI0TWVzaFByZWRpY3Rpb25TY2hlbWVEYXRhSU5TXzI0TWVzaEF0dHJpYnV0ZUNvcm5lclRhYmxlRUVFRUUATjVkcmFjbzIzUHJlZGljdGlvblNjaGVtZURlY29kZXJJaU5TXzQ5UHJlZGljdGlvblNjaGVtZU5vcm1hbE9jdGFoZWRyb25EZWNvZGluZ1RyYW5zZm9ybUlpRUVFRQAYOwAAaR0AAFgMAAAYOwAAyBwAAMgdAAAYOwAAGBwAANQdAAAAAAAAfB8AAMcAAADIAAAAyQAAAMoAAADLAAAATjVkcmFjbzQ4TWVzaFByZWRpY3Rpb25TY2hlbWVHZW9tZXRyaWNOb3JtYWxQcmVkaWN0b3JBcmVhSWlOU180OVByZWRpY3Rpb25TY2hlbWVOb3JtYWxPY3RhaGVkcm9uRGVjb2RpbmdUcmFuc2Zvcm1JaUVFTlNfMjRNZXNoUHJlZGljdGlvblNjaGVtZURhdGFJTlNfMjRNZXNoQXR0cmlidXRlQ29ybmVyVGFibGVFRUVFRQBONWRyYWNvNDhNZXNoUHJlZGljdGlvblNjaGVtZUdlb21ldHJpY05vcm1hbFByZWRpY3RvckJhc2VJaU5TXzQ5UHJlZGljdGlvblNjaGVtZU5vcm1hbE9jdGFoZWRyb25EZWNvZGluZ1RyYW5zZm9ybUlpRUVOU18yNE1lc2hQcmVkaWN0aW9uU2NoZW1lRGF0YUlOU18yNE1lc2hBdHRyaWJ1dGVDb3JuZXJUYWJsZUVFRUVFAPA6AAC+HgAAGDsAAAgeAAB0HwAAAAAAAAQhAADMAAAAzQAAAM4AAAC+AAAAzwAAANAAAADRAAAA0gAAAMMAAADEAAAA0wAAANQAAABONWRyYWNvNDJNZXNoUHJlZGljdGlvblNjaGVtZUdlb21ldHJpY05vcm1hbERlY29kZXJJaU5TXzQ5UHJlZGljdGlvblNjaGVtZU5vcm1hbE9jdGFoZWRyb25EZWNvZGluZ1RyYW5zZm9ybUlpRUVOU18yNE1lc2hQcmVkaWN0aW9uU2NoZW1lRGF0YUlOU18xMUNvcm5lclRhYmxlRUVFRUUATjVkcmFjbzI3TWVzaFByZWRpY3Rpb25TY2hlbWVEZWNvZGVySWlOU180OVByZWRpY3Rpb25TY2hlbWVOb3JtYWxPY3RhaGVkcm9uRGVjb2RpbmdUcmFuc2Zvcm1JaUVFTlNfMjRNZXNoUHJlZGljdGlvblNjaGVtZURhdGFJTlNfMTFDb3JuZXJUYWJsZUVFRUVFAAAYOwAAYyAAAMgdAAAYOwAAwB8AAPggAAAAAAAAiCIAANUAAADWAAAA1wAAANgAAADZAAAATjVkcmFjbzQ4TWVzaFByZWRpY3Rpb25TY2hlbWVHZW9tZXRyaWNOb3JtYWxQcmVkaWN0b3JBcmVhSWlOU180OVByZWRpY3Rpb25TY2hlbWVOb3JtYWxPY3RhaGVkcm9uRGVjb2RpbmdUcmFuc2Zvcm1JaUVFTlNfMjRNZXNoUHJlZGljdGlvblNjaGVtZURhdGFJTlNfMTFDb3JuZXJUYWJsZUVFRUVFAE41ZHJhY280OE1lc2hQcmVkaWN0aW9uU2NoZW1lR2VvbWV0cmljTm9ybWFsUHJlZGljdG9yQmFzZUlpTlNfNDlQcmVkaWN0aW9uU2NoZW1lTm9ybWFsT2N0YWhlZHJvbkRlY29kaW5nVHJhbnNmb3JtSWlFRU5TXzI0TWVzaFByZWRpY3Rpb25TY2hlbWVEYXRhSU5TXzExQ29ybmVyVGFibGVFRUVFRQAAAPA6AADVIQAAGDsAACwhAACAIgAAAAAAADAjAADaAAAA2wAAANwAAAC+AAAA3QAAAN4AAADfAAAA4AAAAMMAAADEAAAA4QAAAOIAAABONWRyYWNvMjhQcmVkaWN0aW9uU2NoZW1lRGVsdGFEZWNvZGVySWlOU180OVByZWRpY3Rpb25TY2hlbWVOb3JtYWxPY3RhaGVkcm9uRGVjb2RpbmdUcmFuc2Zvcm1JaUVFRUUAGDsAAMwiAADIHQAAAAAAAGQlAADjAAAA5AAAAOUAAADmAAAA5wAAAOgAAADpAAAA6gAAAOsAAADsAAAA7QAAAO4AAABONWRyYWNvNDJNZXNoUHJlZGljdGlvblNjaGVtZUdlb21ldHJpY05vcm1hbERlY29kZXJJaU5TXzYyUHJlZGljdGlvblNjaGVtZU5vcm1hbE9jdGFoZWRyb25DYW5vbmljYWxpemVkRGVjb2RpbmdUcmFuc2Zvcm1JaUVFTlNfMjRNZXNoUHJlZGljdGlvblNjaGVtZURhdGFJTlNfMjRNZXNoQXR0cmlidXRlQ29ybmVyVGFibGVFRUVFRQBONWRyYWNvMjdNZXNoUHJlZGljdGlvblNjaGVtZURlY29kZXJJaU5TXzYyUHJlZGljdGlvblNjaGVtZU5vcm1hbE9jdGFoZWRyb25DYW5vbmljYWxpemVkRGVjb2RpbmdUcmFuc2Zvcm1JaUVFTlNfMjRNZXNoUHJlZGljdGlvblNjaGVtZURhdGFJTlNfMjRNZXNoQXR0cmlidXRlQ29ybmVyVGFibGVFRUVFRQBONWRyYWNvMjNQcmVkaWN0aW9uU2NoZW1lRGVjb2RlcklpTlNfNjJQcmVkaWN0aW9uU2NoZW1lTm9ybWFsT2N0YWhlZHJvbkNhbm9uaWNhbGl6ZWREZWNvZGluZ1RyYW5zZm9ybUlpRUVFRQAAGDsAAN8kAABYDAAAGDsAADEkAABMJQAAGDsAAHQjAABYJQAAAAAAABwnAADvAAAA8AAAAPEAAADyAAAA8wAAAE41ZHJhY280OE1lc2hQcmVkaWN0aW9uU2NoZW1lR2VvbWV0cmljTm9ybWFsUHJlZGljdG9yQXJlYUlpTlNfNjJQcmVkaWN0aW9uU2NoZW1lTm9ybWFsT2N0YWhlZHJvbkNhbm9uaWNhbGl6ZWREZWNvZGluZ1RyYW5zZm9ybUlpRUVOU18yNE1lc2hQcmVkaWN0aW9uU2NoZW1lRGF0YUlOU18yNE1lc2hBdHRyaWJ1dGVDb3JuZXJUYWJsZUVFRUVFAE41ZHJhY280OE1lc2hQcmVkaWN0aW9uU2NoZW1lR2VvbWV0cmljTm9ybWFsUHJlZGljdG9yQmFzZUlpTlNfNjJQcmVkaWN0aW9uU2NoZW1lTm9ybWFsT2N0YWhlZHJvbkNhbm9uaWNhbGl6ZWREZWNvZGluZ1RyYW5zZm9ybUlpRUVOU18yNE1lc2hQcmVkaWN0aW9uU2NoZW1lRGF0YUlOU18yNE1lc2hBdHRyaWJ1dGVDb3JuZXJUYWJsZUVFRUVFAAAA8DoAAE8mAAAYOwAAjCUAABQnAAAAAAAAwCgAAPQAAAD1AAAA9gAAAOYAAAD3AAAA+AAAAPkAAAD6AAAA6wAAAOwAAAD7AAAA/AAAAE41ZHJhY280Mk1lc2hQcmVkaWN0aW9uU2NoZW1lR2VvbWV0cmljTm9ybWFsRGVjb2RlcklpTlNfNjJQcmVkaWN0aW9uU2NoZW1lTm9ybWFsT2N0YWhlZHJvbkNhbm9uaWNhbGl6ZWREZWNvZGluZ1RyYW5zZm9ybUlpRUVOU18yNE1lc2hQcmVkaWN0aW9uU2NoZW1lRGF0YUlOU18xMUNvcm5lclRhYmxlRUVFRUUATjVkcmFjbzI3TWVzaFByZWRpY3Rpb25TY2hlbWVEZWNvZGVySWlOU182MlByZWRpY3Rpb25TY2hlbWVOb3JtYWxPY3RhaGVkcm9uQ2Fub25pY2FsaXplZERlY29kaW5nVHJhbnNmb3JtSWlFRU5TXzI0TWVzaFByZWRpY3Rpb25TY2hlbWVEYXRhSU5TXzExQ29ybmVyVGFibGVFRUVFRQAAAAAYOwAAECgAAEwlAAAYOwAAYCcAALQoAAAAAAAAXCoAAP0AAAD+AAAA/wAAAAABAAABAQAATjVkcmFjbzQ4TWVzaFByZWRpY3Rpb25TY2hlbWVHZW9tZXRyaWNOb3JtYWxQcmVkaWN0b3JBcmVhSWlOU182MlByZWRpY3Rpb25TY2hlbWVOb3JtYWxPY3RhaGVkcm9uQ2Fub25pY2FsaXplZERlY29kaW5nVHJhbnNmb3JtSWlFRU5TXzI0TWVzaFByZWRpY3Rpb25TY2hlbWVEYXRhSU5TXzExQ29ybmVyVGFibGVFRUVFRQBONWRyYWNvNDhNZXNoUHJlZGljdGlvblNjaGVtZUdlb21ldHJpY05vcm1hbFByZWRpY3RvckJhc2VJaU5TXzYyUHJlZGljdGlvblNjaGVtZU5vcm1hbE9jdGFoZWRyb25DYW5vbmljYWxpemVkRGVjb2RpbmdUcmFuc2Zvcm1JaUVFTlNfMjRNZXNoUHJlZGljdGlvblNjaGVtZURhdGFJTlNfMTFDb3JuZXJUYWJsZUVFRUVFAPA6AACeKQAAGDsAAOgoAABUKgAAAAAAABQrAADaAAAAAgEAAAMBAADmAAAABAEAAAUBAAAGAQAABwEAAOsAAADsAAAACAEAAAkBAABONWRyYWNvMjhQcmVkaWN0aW9uU2NoZW1lRGVsdGFEZWNvZGVySWlOU182MlByZWRpY3Rpb25TY2hlbWVOb3JtYWxPY3RhaGVkcm9uQ2Fub25pY2FsaXplZERlY29kaW5nVHJhbnNmb3JtSWlFRUVFAAAAABg7AACgKgAATCUAAAAAAACYKwAACgEAAAsBAAAMAQAALgAAAC8AAAANAQAAQAAAADIAAABBAAAADgEAAEMAAABEAAAADwEAABABAAARAQAATjVkcmFjbzM4U2VxdWVudGlhbFF1YW50aXphdGlvbkF0dHJpYnV0ZURlY29kZXJFAAAAABg7AABkKwAA8AkAAAAAAAD4KwAAEgEAABMBAAAUAQAAFQEAACMAAAAWAQAAFwEAABgBAAAZAQAAGgEAABsBAAAcAQAAIwAAAE41ZHJhY28xMU1lc2hEZWNvZGVyRQAAABg7AADgKwAATDQAAAAAAABkLAAAHQEAAB4BAAAUAQAAHwEAACABAAAWAQAAFwEAABgBAAAhAQAAIgEAACMBAAAkAQAAJQEAAE41ZHJhY28yMk1lc2hFZGdlYnJlYWtlckRlY29kZXJFAAAAABg7AABALAAA+CsAAAAAAACILQAAJgEAACcBAAAoAQAAKQEAACoBAAArAQAALAEAAC0BAAAuAQAALwEAAP////8AAAAA7C0AADABAAAxAQAAMgEAADMBAAA0AQAANQEAADYBAAA3AQAAOAEAADkBAAAAAAAATC4AADoBAAA7AQAAPAEAAD0BAAA+AQAAPwEAAEABAABBAQAAQgEAAEMBAABONWRyYWNvMjZNZXNoRWRnZWJyZWFrZXJEZWNvZGVySW1wbElOU18zMU1lc2hFZGdlYnJlYWtlclRyYXZlcnNhbERlY29kZXJFRUUATjVkcmFjbzM1TWVzaEVkZ2VicmVha2VyRGVjb2RlckltcGxJbnRlcmZhY2VFAAAA8DoAAFAtAAAYOwAABC0AAIAtAABONWRyYWNvMjZNZXNoRWRnZWJyZWFrZXJEZWNvZGVySW1wbElOU180MU1lc2hFZGdlYnJlYWtlclRyYXZlcnNhbFByZWRpY3RpdmVEZWNvZGVyRUVFAAAAGDsAAJQtAACALQAATjVkcmFjbzI2TWVzaEVkZ2VicmVha2VyRGVjb2RlckltcGxJTlNfMzhNZXNoRWRnZWJyZWFrZXJUcmF2ZXJzYWxWYWxlbmNlRGVjb2RlckVFRQAAGDsAAPgtAACALQAAAAAAAEgvAABEAQAARQEAAEYBAABONWRyYWNvMTlEZXB0aEZpcnN0VHJhdmVyc2VySU5TXzI0TWVzaEF0dHJpYnV0ZUNvcm5lclRhYmxlRU5TXzM2TWVzaEF0dHJpYnV0ZUluZGljZXNFbmNvZGluZ09ic2VydmVySVMxX0VFRUUATjVkcmFjbzEzVHJhdmVyc2VyQmFzZUlOU18yNE1lc2hBdHRyaWJ1dGVDb3JuZXJUYWJsZUVOU18zNk1lc2hBdHRyaWJ1dGVJbmRpY2VzRW5jb2RpbmdPYnNlcnZlcklTMV9FRUVFAPA6AADZLgAAGDsAAGwuAABALwAAAAAAAEAvAABHAQAASAEAAEYB\");l(e,12148,\"AQAAAAMAAAAFAAAABwAAAAAAAABIMAAASQEAAEoBAABLAQAATAEAAE41ZHJhY28yMk1lc2hUcmF2ZXJzYWxTZXF1ZW5jZXJJTlNfMjhNYXhQcmVkaWN0aW9uRGVncmVlVHJhdmVyc2VySU5TXzExQ29ybmVyVGFibGVFTlNfMzZNZXNoQXR0cmlidXRlSW5kaWNlc0VuY29kaW5nT2JzZXJ2ZXJJUzJfRUVFRUVFAE41ZHJhY28xNVBvaW50c1NlcXVlbmNlckUAAAAA8DoAACMwAAAYOwAAnC8AAEAwAAD/////AAAAADgxAABNAQAATgEAAE8BAABONWRyYWNvMjhNYXhQcmVkaWN0aW9uRGVncmVlVHJhdmVyc2VySU5TXzExQ29ybmVyVGFibGVFTlNfMzZNZXNoQXR0cmlidXRlSW5kaWNlc0VuY29kaW5nT2JzZXJ2ZXJJUzFfRUVFRQBONWRyYWNvMTNUcmF2ZXJzZXJCYXNlSU5TXzExQ29ybmVyVGFibGVFTlNfMzZNZXNoQXR0cmlidXRlSW5kaWNlc0VuY29kaW5nT2JzZXJ2ZXJJUzFfRUVFRQAA8DoAANUwAAAYOwAAbDAAADAxAAAAAAAAMDEAAFABAABRAQAATwEAAAAAAADwMQAAUgEAAFMBAABUAQAAVQEAAE41ZHJhY28yMk1lc2hUcmF2ZXJzYWxTZXF1ZW5jZXJJTlNfMTlEZXB0aEZpcnN0VHJhdmVyc2VySU5TXzExQ29ybmVyVGFibGVFTlNfMzZNZXNoQXR0cmlidXRlSW5kaWNlc0VuY29kaW5nT2JzZXJ2ZXJJUzJfRUVFRUVFAAAAGDsAAHAxAABAMAAAAAAAAHAyAABWAQAAVwEAAE8BAABONWRyYWNvMTlEZXB0aEZpcnN0VHJhdmVyc2VySU5TXzExQ29ybmVyVGFibGVFTlNfMzZNZXNoQXR0cmlidXRlSW5kaWNlc0VuY29kaW5nT2JzZXJ2ZXJJUzFfRUVFRQAYOwAAEDIAADAxAAAAAAAAIDMAAFgBAABZAQAAWgEAAFsBAABONWRyYWNvMjJNZXNoVHJhdmVyc2FsU2VxdWVuY2VySU5TXzE5RGVwdGhGaXJzdFRyYXZlcnNlcklOU18yNE1lc2hBdHRyaWJ1dGVDb3JuZXJUYWJsZUVOU18zNk1lc2hBdHRyaWJ1dGVJbmRpY2VzRW5jb2RpbmdPYnNlcnZlcklTMl9FRUVFRUUAABg7AACUMgAAQDA=\");l(e,13108,\"jDMAABIBAABcAQAAFAEAABUBAABdAQAAFgEAABcBAAAYAQAAGQEAABoBAAAbAQAAHAEAAF4BAABONWRyYWNvMjFNZXNoU2VxdWVudGlhbERlY29kZXJFABg7AABsMwAA+CsAAAAAAADMMwAAXwEAAGABAABhAQAAYgEAAE41ZHJhY28xNUxpbmVhclNlcXVlbmNlckUAAAAYOwAAsDMAAEAwAAAAAAAATDQAABIBAABjAQAAZAEAABUBAAAjAAAAZQEAABcBAAAYAQAAGQE=\");l(e,13328,\"RmFpbGVkIHRvIHBhcnNlIERyYWNvIGhlYWRlci4ATjVkcmFjbzE3UG9pbnRDbG91ZERlY29kZXJFAAAA8DoAAC40AAAAAAAApDQAABIBAABmAQAAZAEAABUBAABnAQAAaAEAABcBAAAYAQAAGQEAAE41ZHJhY28yM1BvaW50Q2xvdWRLZFRyZWVEZWNvZGVyRQAAABg7AACANAAATDQAAAAAAAAENQAAEgEAAGkBAABkAQAAFQEAAGoBAABrAQAAFwEAABgBAAAZAQAATjVkcmFjbzI3UG9pbnRDbG91ZFNlcXVlbnRpYWxEZWNvZGVyRQAAABg7AADcNAAATDQAAAEAAAABAAAAAgAAAAIAAAAEAAAABAAAAAgAAAAIAAAABAAAAAgAAAAB\");l(e,13635,\"wAAAAMAAAADAAAAAwP//////////AAAAAIA1AABsAQAAbQEAAG4BAABvAQAATjVkcmFjbzRNZXNoRQAAABg7AABwNQAAxDUAAP////8AAAAAAAAAAMQ1AABwAQAAcQEAAHIBAABzAQAATjVkcmFjbzEwUG9pbnRDbG91ZEUAAAAA8DoAAKw1AAC4PAAAGQAKABkZGQAAAAAFAAAAAAAACQAAAAALAAAAAAAAAAAZABEKGRkZAwoHAAEACQsYAAAJBgsAAAsABhkAAAAZGRk=\");l(e,13857,\"DgAAAAAAAAAAGQAKDRkZGQANAAACAAkOAAAACQAOAAAO\");l(e,13915,\"DA==\");l(e,13927,\"EwAAAAATAAAAAAkMAAAAAAAMAAAM\");l(e,13973,\"EA==\");l(e,13985,\"DwAAAAQPAAAAAAkQAAAAAAAQAAAQ\");l(e,14031,\"Eg==\");l(e,14043,\"EQAAAAARAAAAAAkSAAAAAAASAAASAAAaAAAAGhoa\");l(e,14098,\"GgAAABoaGgAAAAAAAAk=\");l(e,14147,\"FA==\");l(e,14159,\"FwAAAAAXAAAAAAkUAAAAAAAUAAAU\");l(e,14205,\"Fg==\");l(e,14217,\"FQAAAAAVAAAAAAkWAAAAAAAWAAAWAAAwMTIzNDU2Nzg5QUJDREVGAAAAAAIAAAADAAAABQAAAAcAAAALAAAADQAAABEAAAATAAAAFwAAAB0AAAAfAAAAJQAAACkAAAArAAAALwAAADUAAAA7AAAAPQAAAEMAAABHAAAASQAAAE8AAABTAAAAWQAAAGEAAABlAAAAZwAAAGsAAABtAAAAcQAAAH8AAACDAAAAiQAAAIsAAACVAAAAlwAAAJ0AAACjAAAApwAAAK0AAACzAAAAtQAAAL8AAADBAAAAxQAAAMcAAADTAAAAAQAAAAsAAAANAAAAEQAAABMAAAAXAAAAHQAAAB8AAAAlAAAAKQAAACsAAAAvAAAANQAAADsAAAA9AAAAQwAAAEcAAABJAAAATwAAAFMAAABZAAAAYQAAAGUAAABnAAAAawAAAG0AAABxAAAAeQAAAH8AAACDAAAAiQAAAIsAAACPAAAAlQAAAJcAAACdAAAAowAAAKcAAACpAAAArQAAALMAAAC1AAAAuwAAAL8AAADBAAAAxQAAAMcAAADRAAAAAAAAAAoAAABkAAAA6AMAABAnAACghgEAQEIPAICWmAAA4fUFAMqaOwAAAAAAAAAAMDAwMTAyMDMwNDA1MDYwNzA4MDkxMDExMTIxMzE0MTUxNjE3MTgxOTIwMjEyMjIzMjQyNTI2MjcyODI5MzAzMTMyMzMzNDM1MzYzNzM4Mzk0MDQxNDI0MzQ0NDU0NjQ3NDg0OTUwNTE1MjUzNTQ1NTU2NTc1ODU5NjA2MTYyNjM2NDY1NjY2NzY4Njk3MDcxNzI3Mzc0NzU3Njc3Nzg3OTgwODE4MjgzODQ4NTg2ODc4ODg5OTA5MTkyOTM5NDk1OTY5Nzk4OTlOMTBfX2N4eGFiaXYxMTZfX3NoaW1fdHlwZV9pbmZvRQAAAAAYOwAAKDoAAKw8AABOMTBfX2N4eGFiaXYxMTdfX2NsYXNzX3R5cGVfaW5mb0UAAAAYOwAAWDoAAEw6AABOMTBfX2N4eGFiaXYxMTdfX3BiYXNlX3R5cGVfaW5mb0UAAAAYOwAAiDoAAEw6AABOMTBfX2N4eGFiaXYxMTlfX3BvaW50ZXJfdHlwZV9pbmZvRQAYOwAAuDoAAKw6AAAAAAAAfDoAAHkBAAB6AQAAewEAAHwBAAB9AQAAfgEAAH8BAACAAQAAAAAAAGA7AAB5AQAAgQEAAHsBAAB8AQAAfQEAAIIBAACDAQAAhAEAAE4xMF9fY3h4YWJpdjEyMF9fc2lfY2xhc3NfdHlwZV9pbmZvRQAAAAAYOwAAODsAAHw6AAAAAAAA0DsAAA4AAACFAQAAhgEAAAAAAAD4OwAADgAAAIcBAACIAQAAAAAAALg7AAAOAAAAiQEAAIoBAABTdDlleGNlcHRpb24AAAAA8DoAAKg7AABTdDliYWRfYWxsb2MAAAAAGDsAAMA7AAC4OwAAU3QyMGJhZF9hcnJheV9uZXdfbGVuZ3RoAAAAABg7AADcOwAA0DsAAAAAAAAoPAAAAQAAAIsBAACMAQAAU3QxMWxvZ2ljX2Vycm9yABg7AAAYPAAAuDsAAAAAAABcPAAAAQAAAI0BAACMAQAAU3QxMmxlbmd0aF9lcnJvcgAAAAAYOwAASDwAACg8AAAAAAAAkDwAAAEAAACOAQAAjAEAAFN0MTJvdXRfb2ZfcmFuZ2UAAAAAGDsAAHw8AAAoPAAAU3Q5dHlwZV9pbmZvAAAAAPA6AACcPA==\");l(e,15544,\"BQ==\");l(e,15556,\"dAE=\");l(e,15580,\"dQEAAHYBAABsPg==\");l(e,15604,\"Ag==\");l(e,15620,\"//////////8=\");l(e,15688,\"BQ==\");l(e,15700,\"dwE=\");l(e,15724,\"dQEAAHgBAAB4PgAAAAQ=\");l(e,15748,\"AQ==\");l(e,15764,\"/////wo=\");l(e,15832,\"IEUB\")}var r=new ArrayBuffer(16);var s=new Int32Array(r);var t=new Float32Array(r);var u=new Float64Array(r);function v(){throw new Error(\"abort\")}function w(x){t[2]=x}function y(z){return s[z]}function A(z,x){s[z]=x}function B(){return t[2]}function ma(q){var C=q.a;var D=C.a;var E=D.buffer;D.grow=ka;var F=new Int8Array(E);var G=new Int16Array(E);var H=new Int32Array(E);var I=new Uint8Array(E);var J=new Uint16Array(E);var K=new Uint32Array(E);var L=new Float32Array(E);var M=new Float64Array(E);var N=Math.imul;var O=Math.fround;var P=Math.abs;var Q=Math.clz32;var R=Math.min;var S=Math.max;var T=Math.floor;var U=Math.ceil;var V=Math.trunc;var W=Math.sqrt;var X=C.b;var Y=C.c;var Z=C.d;var _=C.e;var $=C.f;var aa=C.g;var ba=C.h;var ca=83232;var da=0;\n// EMSCRIPTEN_START_FUNCS\nfunction Ud(a,b,c){var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0;B=ca-672|0;ca=B;k=H[b+8>>2];s=H[b+12>>2];d=H[b+20>>2];e=H[b+16>>2];g=e+4|0;d=g>>>0<4?d+1|0:d;a:{b:{c:{if(g>>>0>k>>>0&(d|0)>=(s|0)|(d|0)>(s|0)){break c}d=e+H[b>>2]|0;H[a>>2]=I[d|0]|I[d+1|0]<<8|(I[d+2|0]<<16|I[d+3|0]<<24);d=H[b+20>>2];k=d;g=H[b+16>>2];e=g+4|0;d=e>>>0<4?d+1|0:d;H[b+16>>2]=e;H[b+20>>2]=d;if(K[a>>2]>31){break c}s=H[b+8>>2];y=H[b+12>>2];d=k;g=g+8|0;d=g>>>0<8?d+1|0:d;if(g>>>0>s>>>0&(d|0)>=(y|0)|(d|0)>(y|0)){break c}d=e+H[b>>2]|0;H[a+4>>2]=I[d|0]|I[d+1|0]<<8|(I[d+2|0]<<16|I[d+3|0]<<24);d=H[b+20>>2];k=d;g=H[b+16>>2];e=g+4|0;d=e>>>0<4?d+1|0:d;H[b+16>>2]=e;H[b+20>>2]=d;s=H[b+8>>2];y=H[b+12>>2];d=k;g=g+8|0;d=g>>>0<8?d+1|0:d;if(g>>>0>s>>>0&(d|0)>=(y|0)|(d|0)>(y|0)){break c}d=e+H[b>>2]|0;H[a+12>>2]=I[d|0]|I[d+1|0]<<8|(I[d+2|0]<<16|I[d+3|0]<<24);d=H[b+20>>2];k=d;g=H[b+16>>2];e=g+4|0;d=e>>>0<4?d+1|0:d;H[b+16>>2]=e;H[b+20>>2]=d;d=H[a+20>>2];x=H[a+12>>2];if((x|0)!=(d|0)?d:0){break c}s=H[b+8>>2];y=H[b+12>>2];d=k;g=g+8|0;d=g>>>0<8?d+1|0:d;if(g>>>0>s>>>0&(d|0)>=(y|0)|(d|0)>(y|0)){break c}d=e+H[b>>2]|0;e=I[d|0]|I[d+1|0]<<8|(I[d+2|0]<<16|I[d+3|0]<<24);H[a+16>>2]=e;g=H[b+20>>2];d=H[b+16>>2]+4|0;g=d>>>0<4?g+1|0:g;H[b+16>>2]=d;H[b+20>>2]=g;if(e>>>0>=7){H[B>>2]=e;Qd(1713,B);break c}H[B+664>>2]=c;d:{if(!x){break d}e:{k=H[c>>2];if(x>>>0<=(H[c+8>>2]-k|0)/12>>>0){break e}if(x>>>0<357913942){l=H[c+4>>2];d=N(x,12);e=pa(d);g=d+e|0;e=e+N((l-k|0)/12|0,12)|0;d=e;if((k|0)!=(l|0)){while(1){d=d-12|0;l=l-12|0;H[d>>2]=H[l>>2];H[d+4>>2]=H[l+4>>2];H[d+8>>2]=H[l+8>>2];if((k|0)!=(l|0)){continue}break}}H[c+8>>2]=g;H[c+4>>2]=e;H[c>>2]=d;if(!k){break e}oa(k);break e}break b}f:{switch(H[a+16>>2]){case 0:i=wb(B+8|0,3);z=B+664|0;k=H[b+8>>2];n=H[b+12>>2];d=H[b+20>>2];e=H[b+16>>2];g=e+4|0;d=g>>>0<4?d+1|0:d;g:{if(g>>>0>k>>>0&(d|0)>=(n|0)|(d|0)>(n|0)){break g}d=e+H[b>>2]|0;H[i>>2]=I[d|0]|I[d+1|0]<<8|(I[d+2|0]<<16|I[d+3|0]<<24);d=H[b+20>>2];k=d;g=H[b+16>>2];e=g+4|0;d=e>>>0<4?d+1|0:d;H[b+16>>2]=e;H[b+20>>2]=d;if(K[i>>2]>32){break g}n=H[b+8>>2];s=H[b+12>>2];d=k;g=g+8|0;d=g>>>0<8?d+1|0:d;if(g>>>0>n>>>0&(d|0)>=(s|0)|(d|0)>(s|0)){break g}d=e+H[b>>2]|0;e=I[d|0]|I[d+1|0]<<8|(I[d+2|0]<<16|I[d+3|0]<<24);H[i+4>>2]=e;g=H[b+20>>2];d=H[b+16>>2]+4|0;g=d>>>0<4?g+1|0:g;H[b+16>>2]=d;H[b+20>>2]=g;if(!e){break g}H[i+8>>2]=0;if(!ua(i+16|0,b)){break g}if(!ua(i+36|0,b)){break g}if(!ua(i+56|0,b)){break g}if(!ua(i+76|0,b)){break g}A=H[i+4>>2];d=0;g=0;f=ca-32|0;ca=f;m=H[i+12>>2];H[f+16>>2]=0;H[f+8>>2]=0;H[f+12>>2]=0;if(m){if(m>>>0>=1073741824){break b}b=m<<2;g=pa(b);H[f+8>>2]=g;d=b+g|0;H[f+16>>2]=d;ra(g,0,b);H[f+12>>2]=d}e=H[i+120>>2];b=H[e>>2];if(b){H[e+4>>2]=b;oa(b);m=H[i+12>>2];g=H[f+8>>2];d=H[f+12>>2]}H[e+4>>2]=d;H[e>>2]=g;H[e+8>>2]=H[f+16>>2];g=0;H[f+16>>2]=0;H[f+8>>2]=0;H[f+12>>2]=0;h:{if(m){if(m>>>0>=1073741824){break b}b=m<<2;w=pa(b);H[f+8>>2]=w;g=b+w|0;H[f+16>>2]=g;ra(w,0,b);H[f+12>>2]=g}d=H[i+132>>2];b=H[d>>2];if(b){H[d+4>>2]=b;oa(b);w=H[f+8>>2];g=H[f+12>>2]}H[d+4>>2]=g;H[d>>2]=w;H[d+8>>2]=H[f+16>>2];H[f+24>>2]=0;H[f+28>>2]=0;H[f+16>>2]=0;H[f+20>>2]=0;H[f+8>>2]=0;H[f+12>>2]=0;xa(f+8|0);d=H[f+24>>2]+H[f+28>>2]|0;b=(d>>>0)/341|0;b=H[H[f+12>>2]+(b<<2)>>2]+N(d-N(b,341)|0,12)|0;H[b+4>>2]=0;H[b+8>>2]=0;H[b>>2]=A;m=H[f+28>>2]+1|0;H[f+28>>2]=m;i:{if(!m){break i}y=i+96|0;while(1){n=H[f+12>>2];g=H[f+24>>2];e=m-1|0;d=g+e|0;b=(d>>>0)/341|0;b=H[n+(b<<2)>>2]+N(d-N(b,341)|0,12)|0;o=H[b+8>>2];k=H[b+4>>2];t=H[b>>2];H[f+28>>2]=e;b=H[f+16>>2];if((((b|0)!=(n|0)?N(b-n>>2,341)-1|0:0)-(g+m|0)|0)+1>>>0>=682){oa(H[b-4>>2]);H[f+16>>2]=H[f+16>>2]-4}b=0;if(t>>>0>A>>>0){break i}d=H[i+12>>2];m=(k|0)!=(d-1|0)?k+1|0:0;if(m>>>0>=d>>>0){break i}q=N(o,12);p=q+H[i+132>>2]|0;l=q+H[i+120>>2]|0;g=H[i>>2];r=m<<2;e=H[r+H[p>>2]>>2];j:{k:{if((g|0)==(e|0)){if(!t){break k}while(1){d=H[l>>2];x=H[d+8>>2];s=H[d+4>>2];n=H[d>>2];q=H[z>>2];m=H[q+4>>2];d=H[q+8>>2];l:{if(m>>>0<d>>>0){H[m+8>>2]=x;H[m+4>>2]=s;H[m>>2]=n;H[q+4>>2]=m+12;break l}r=H[q>>2];g=(m-r|0)/12|0;k=g+1|0;if(k>>>0>=357913942){break b}e=(d-r|0)/12|0;d=e<<1;k=e>>>0>=178956970?357913941:d>>>0>k>>>0?d:k;if(k){if(k>>>0>=357913942){break a}d=pa(N(k,12))}else{d=0}w=d+N(g,12)|0;H[w+8>>2]=x;H[w+4>>2]=s;H[w>>2]=n;e=w+12|0;if((m|0)!=(r|0)){while(1){w=w-12|0;m=m-12|0;H[w>>2]=H[m>>2];H[w+4>>2]=H[m+4>>2];H[w+8>>2]=H[m+8>>2];if((m|0)!=(r|0)){continue}break}}H[q+8>>2]=d+N(k,12);H[q+4>>2]=e;H[q>>2]=w;if(!r){break l}oa(r)}H[i+8>>2]=H[i+8>>2]+1;b=b+1|0;if((t|0)!=(b|0)){continue}break}break k}m:{n:{o:{p:{if(t>>>0<=2){d=H[i+108>>2];H[d>>2]=m;w=1;g=H[i+12>>2];if(g>>>0>1){break p}break m}if(K[i+8>>2]>K[i+4>>2]){break i}b=H[i+120>>2];s=o+1|0;x=N(s,12);d=b+x|0;if((d|0)!=(l|0)){Aa(d,H[l>>2],H[l+4>>2]);b=H[i+120>>2]}b=r+H[b+x>>2]|0;H[b>>2]=H[b>>2]+(1<<g+(e^-1));n=Q(t)^31;k=H[i+32>>2];e=32-k|0;q:{if((n|0)<=(e|0)){e=H[i+28>>2];if((e|0)==H[i+20>>2]){break o}d=H[e>>2];b=k+n|0;H[i+32>>2]=b;w=d<<k>>>32-n|0;if((b|0)!=32){break q}H[i+32>>2]=0;H[i+28>>2]=e+4;break q}g=H[i+28>>2];b=g+4|0;if((b|0)==H[i+20>>2]){break o}d=H[g>>2];H[i+28>>2]=b;b=n-e|0;H[i+32>>2]=b;w=H[g+4>>2]>>>32-b|d<<k>>>32-n}d=t>>>1|0;if(w>>>0>d>>>0){break i}break n}while(1){m=(g-1|0)!=(m|0)?m+1|0:0;H[d+(w<<2)>>2]=m;g=H[i+12>>2];w=w+1|0;if(g>>>0>w>>>0){continue}break}break m}d=t>>>1|0;w=0}r:{s:{e=d-w|0;b=t-e|0;t:{if((b|0)==(e|0)){b=e;break t}n=H[i+88>>2];if((n|0)==H[i+80>>2]){break s}k=H[n>>2];g=H[i+92>>2];d=g+1|0;H[i+92>>2]=d;g=k&-2147483648>>>g;u:{if((d|0)==32){H[i+92>>2]=0;H[i+88>>2]=n+4;if(g){break u}break s}if(!g){break s}}}d=b;b=e;break r}d=e}n=H[i+132>>2];k=n+q|0;g=H[k>>2];e=g+r|0;H[e>>2]=H[e>>2]+1;Aa(n+x|0,g,H[k+4>>2]);if(b){g=H[f+28>>2]+H[f+24>>2]|0;e=H[f+16>>2];w=H[f+12>>2];if((g|0)==(((e|0)!=(w|0)?N(e-w>>2,341)-1|0:0)|0)){xa(f+8|0);w=H[f+12>>2];g=H[f+24>>2]+H[f+28>>2]|0}e=(g>>>0)/341|0;e=H[(e<<2)+w>>2]+N(g-N(e,341)|0,12)|0;H[e+8>>2]=o;H[e+4>>2]=m;H[e>>2]=b;H[f+28>>2]=H[f+28>>2]+1}if(!d){break k}g=H[f+28>>2]+H[f+24>>2]|0;b=H[f+16>>2];w=H[f+12>>2];if((g|0)==(((b|0)!=(w|0)?N(b-w>>2,341)-1|0:0)|0)){xa(f+8|0);w=H[f+12>>2];g=H[f+24>>2]+H[f+28>>2]|0}b=(g>>>0)/341|0;b=H[(b<<2)+w>>2]+N(g-N(b,341)|0,12)|0;H[b+8>>2]=s;H[b+4>>2]=m;H[b>>2]=d;m=H[f+28>>2]+1|0;H[f+28>>2]=m;break j}if(!t){break k}while(1){if(H[i+12>>2]){o=H[i+40>>2];n=H[p>>2];w=H[i+96>>2];k=H[i+108>>2];m=0;while(1){q=k+(m<<2)|0;H[w+(H[q>>2]<<2)>>2]=0;g=H[i>>2];e=H[q>>2]<<2;d=H[e+n>>2];v:{if((g|0)==(d|0)){break v}r=e+w|0;u=g-d|0;x=H[i+52>>2];g=32-x|0;if((u|0)<=(g|0)){e=H[i+48>>2];if((e|0)==(o|0)){break i}H[r>>2]=H[e>>2]<<x>>>32-u;d=u+H[i+52>>2]|0;H[i+52>>2]=d;if((d|0)!=32){break v}H[i+52>>2]=0;H[i+48>>2]=e+4;break v}s=H[i+48>>2];d=s+4|0;if((d|0)==(o|0)){break i}e=H[s>>2];H[i+48>>2]=d;d=u-g|0;H[i+52>>2]=d;H[r>>2]=H[s+4>>2]>>>32-d|e<<x>>>32-u}e=H[q>>2]<<2;d=e+w|0;H[d>>2]=H[d>>2]|H[e+H[l>>2]>>2];m=m+1|0;if(m>>>0<K[i+12>>2]){continue}break}}jb(z,y);H[i+8>>2]=H[i+8>>2]+1;b=b+1|0;if((t|0)!=(b|0)){continue}break}}m=H[f+28>>2]}if(m){continue}break}}H[f+28>>2]=0;w=H[f+16>>2];m=H[f+12>>2];g=w-m|0;if(g>>>0>=9){while(1){oa(H[m>>2]);m=H[f+12>>2]+4|0;H[f+12>>2]=m;w=H[f+16>>2];g=w-m|0;if(g>>>0>8){continue}break}}b=170;w:{switch((g>>>2|0)-1|0){case 1:b=341;case 0:H[f+24>>2]=b;break;default:break w}}x:{if((m|0)==(w|0)){break x}while(1){oa(H[m>>2]);m=m+4|0;if((w|0)!=(m|0)){continue}break}d=H[f+16>>2];b=H[f+12>>2];if((d|0)==(b|0)){break x}H[f+16>>2]=d+((b-d|0)+3&-4)}b=H[f+8>>2];if(b){oa(b)}ca=f+32|0;break h}}xb(i);break d;case 1:i=wb(B+8|0,3);A=B+664|0;k=H[b+8>>2];n=H[b+12>>2];d=H[b+20>>2];e=H[b+16>>2];g=e+4|0;d=g>>>0<4?d+1|0:d;y:{if(g>>>0>k>>>0&(d|0)>=(n|0)|(d|0)>(n|0)){break y}d=e+H[b>>2]|0;H[i>>2]=I[d|0]|I[d+1|0]<<8|(I[d+2|0]<<16|I[d+3|0]<<24);d=H[b+20>>2];k=d;g=H[b+16>>2];e=g+4|0;d=e>>>0<4?d+1|0:d;H[b+16>>2]=e;H[b+20>>2]=d;if(K[i>>2]>32){break y}n=H[b+8>>2];s=H[b+12>>2];d=k;g=g+8|0;d=g>>>0<8?d+1|0:d;if(g>>>0>n>>>0&(d|0)>=(s|0)|(d|0)>(s|0)){break y}d=e+H[b>>2]|0;e=I[d|0]|I[d+1|0]<<8|(I[d+2|0]<<16|I[d+3|0]<<24);H[i+4>>2]=e;g=H[b+20>>2];d=H[b+16>>2]+4|0;g=d>>>0<4?g+1|0:g;H[b+16>>2]=d;H[b+20>>2]=g;if(!e){break y}H[i+8>>2]=0;if(!ua(i+16|0,b)){break y}if(!ua(i+36|0,b)){break y}if(!ua(i+56|0,b)){break y}if(!ua(i+76|0,b)){break y}p=H[i+4>>2];d=0;f=ca-32|0;ca=f;m=H[i+12>>2];H[f+16>>2]=0;H[f+8>>2]=0;H[f+12>>2]=0;if(m){if(m>>>0>=1073741824){break b}b=m<<2;t=pa(b);H[f+8>>2]=t;d=b+t|0;H[f+16>>2]=d;ra(t,0,b);H[f+12>>2]=d}e=H[i+120>>2];b=H[e>>2];if(b){H[e+4>>2]=b;oa(b);m=H[i+12>>2];t=H[f+8>>2];d=H[f+12>>2]}H[e+4>>2]=d;H[e>>2]=t;H[e+8>>2]=H[f+16>>2];t=0;H[f+16>>2]=0;H[f+8>>2]=0;H[f+12>>2]=0;z:{if(m){if(m>>>0>=1073741824){break b}b=m<<2;o=pa(b);H[f+8>>2]=o;t=b+o|0;H[f+16>>2]=t;ra(o,0,b);H[f+12>>2]=t}d=H[i+132>>2];b=H[d>>2];if(b){H[d+4>>2]=b;oa(b);t=H[f+12>>2];o=H[f+8>>2]}H[d+4>>2]=t;H[d>>2]=o;H[d+8>>2]=H[f+16>>2];H[f+24>>2]=0;H[f+28>>2]=0;H[f+16>>2]=0;H[f+20>>2]=0;H[f+8>>2]=0;H[f+12>>2]=0;xa(f+8|0);d=H[f+24>>2]+H[f+28>>2]|0;b=(d>>>0)/341|0;b=H[H[f+12>>2]+(b<<2)>>2]+N(d-N(b,341)|0,12)|0;H[b+4>>2]=0;H[b+8>>2]=0;H[b>>2]=p;m=H[f+28>>2]+1|0;H[f+28>>2]=m;A:{if(!m){break A}s=i+96|0;while(1){k=H[f+12>>2];g=H[f+24>>2];e=m-1|0;d=g+e|0;b=(d>>>0)/341|0;b=H[k+(b<<2)>>2]+N(d-N(b,341)|0,12)|0;q=H[b+8>>2];d=H[b+4>>2];l=H[b>>2];H[f+28>>2]=e;b=H[f+16>>2];if((((b|0)!=(k|0)?N(b-k>>2,341)-1|0:0)-(g+m|0)|0)+1>>>0>=682){oa(H[b-4>>2]);H[f+16>>2]=H[f+16>>2]-4}if(l>>>0>p>>>0){break A}b=H[i+12>>2];m=(d|0)!=(b-1|0)?d+1|0:0;if(m>>>0>=b>>>0){break A}b=H[i+120>>2];r=N(q,12);u=b+r|0;e=H[i>>2];x=m<<2;n=r+H[i+132>>2]|0;d=H[x+H[n>>2]>>2];B:{C:{if((e|0)==(d|0)){x=0;if(!l){break C}while(1){b=H[u>>2];y=H[b+8>>2];n=H[b+4>>2];k=H[b>>2];q=H[A>>2];m=H[q+4>>2];b=H[q+8>>2];D:{if(m>>>0<b>>>0){H[m+8>>2]=y;H[m+4>>2]=n;H[m>>2]=k;H[q+4>>2]=m+12;break D}r=H[q>>2];e=(m-r|0)/12|0;g=e+1|0;if(g>>>0>=357913942){break b}d=(b-r|0)/12|0;b=d<<1;g=d>>>0>=178956970?357913941:b>>>0>g>>>0?b:g;if(g){if(g>>>0>=357913942){break a}b=pa(N(g,12))}else{b=0}o=b+N(e,12)|0;H[o+8>>2]=y;H[o+4>>2]=n;H[o>>2]=k;d=o+12|0;if((m|0)!=(r|0)){while(1){o=o-12|0;m=m-12|0;H[o>>2]=H[m>>2];H[o+4>>2]=H[m+4>>2];H[o+8>>2]=H[m+8>>2];if((m|0)!=(r|0)){continue}break}}H[q+8>>2]=b+N(g,12);H[q+4>>2]=d;H[q>>2]=o;if(!r){break D}oa(r)}H[i+8>>2]=H[i+8>>2]+1;x=x+1|0;if((l|0)!=(x|0)){continue}break}break C}E:{F:{G:{H:{if(l>>>0<=2){b=H[i+108>>2];H[b>>2]=m;o=1;t=H[i+12>>2];if(t>>>0>1){break H}break E}if(K[i+8>>2]>K[i+4>>2]){break A}k=b;b=r+12|0;Aa(k+b|0,H[u>>2],H[u+4>>2]);b=x+H[b+H[i+120>>2]>>2]|0;H[b>>2]=H[b>>2]+(1<<e+(d^-1));n=Q(l)^31;k=H[i+32>>2];e=32-k|0;I:{if((n|0)<=(e|0)){e=H[i+28>>2];if((e|0)==H[i+20>>2]){break G}d=H[e>>2];b=k+n|0;H[i+32>>2]=b;d=d<<k>>>32-n|0;if((b|0)!=32){break I}H[i+32>>2]=0;H[i+28>>2]=e+4;break I}g=H[i+28>>2];b=g+4|0;if((b|0)==H[i+20>>2]){break G}d=H[g>>2];H[i+28>>2]=b;b=n-e|0;H[i+32>>2]=b;d=H[g+4>>2]>>>32-b|d<<k>>>32-n}o=l>>>1|0;if(o>>>0<d>>>0){break A}break F}while(1){m=(t-1|0)!=(m|0)?m+1|0:0;H[b+(o<<2)>>2]=m;o=o+1|0;t=H[i+12>>2];if(o>>>0<t>>>0){continue}break}break E}o=l>>>1|0;d=0}y=q+1|0;J:{K:{e=o-d|0;d=l-e|0;L:{if((d|0)==(e|0)){b=e;break L}n=H[i+88>>2];if((n|0)==H[i+80>>2]){break K}k=H[n>>2];g=H[i+92>>2];b=g+1|0;H[i+92>>2]=b;g=k&-2147483648>>>g;M:{if((b|0)==32){H[i+92>>2]=0;H[i+88>>2]=n+4;if(g){break M}break K}if(!g){break K}}b=d}d=e;break J}b=e}n=H[i+132>>2];k=n+r|0;g=H[k>>2];e=g+x|0;H[e>>2]=H[e>>2]+1;Aa(n+N(y,12)|0,g,H[k+4>>2]);if(d){t=H[f+28>>2]+H[f+24>>2]|0;e=H[f+16>>2];o=H[f+12>>2];if((t|0)==(((e|0)!=(o|0)?N(e-o>>2,341)-1|0:0)|0)){xa(f+8|0);t=H[f+24>>2]+H[f+28>>2]|0;o=H[f+12>>2]}e=(t>>>0)/341|0;e=H[o+(e<<2)>>2]+N(t-N(e,341)|0,12)|0;H[e+8>>2]=q;H[e+4>>2]=m;H[e>>2]=d;H[f+28>>2]=H[f+28>>2]+1}if(!b){break C}t=H[f+28>>2]+H[f+24>>2]|0;d=H[f+16>>2];o=H[f+12>>2];if((t|0)==(((d|0)!=(o|0)?N(d-o>>2,341)-1|0:0)|0)){xa(f+8|0);t=H[f+24>>2]+H[f+28>>2]|0;o=H[f+12>>2]}d=(t>>>0)/341|0;d=H[o+(d<<2)>>2]+N(t-N(d,341)|0,12)|0;H[d+8>>2]=y;H[d+4>>2]=m;H[d>>2]=b;m=H[f+28>>2]+1|0;H[f+28>>2]=m;break B}t=0;if(!l){break C}while(1){if(H[i+12>>2]){o=H[i+40>>2];k=H[n>>2];z=H[i+96>>2];g=H[i+108>>2];m=0;while(1){q=g+(m<<2)|0;H[z+(H[q>>2]<<2)>>2]=0;e=H[i>>2];d=H[q>>2]<<2;b=H[d+k>>2];N:{if((e|0)==(b|0)){break N}r=d+z|0;w=e-b|0;x=H[i+52>>2];e=32-x|0;if((w|0)<=(e|0)){d=H[i+48>>2];if((d|0)==(o|0)){break A}H[r>>2]=H[d>>2]<<x>>>32-w;b=w+H[i+52>>2]|0;H[i+52>>2]=b;if((b|0)!=32){break N}H[i+52>>2]=0;H[i+48>>2]=d+4;break N}y=H[i+48>>2];b=y+4|0;if((b|0)==(o|0)){break A}d=H[y>>2];H[i+48>>2]=b;b=w-e|0;H[i+52>>2]=b;H[r>>2]=H[y+4>>2]>>>32-b|d<<x>>>32-w}d=H[q>>2]<<2;b=d+z|0;H[b>>2]=H[b>>2]|H[d+H[u>>2]>>2];m=m+1|0;if(m>>>0<K[i+12>>2]){continue}break}}jb(A,s);H[i+8>>2]=H[i+8>>2]+1;t=t+1|0;if((l|0)!=(t|0)){continue}break}}m=H[f+28>>2]}if(m){continue}break}}H[f+28>>2]=0;o=H[f+16>>2];m=H[f+12>>2];t=o-m|0;if(t>>>0>=9){while(1){oa(H[m>>2]);m=H[f+12>>2]+4|0;H[f+12>>2]=m;o=H[f+16>>2];t=o-m|0;if(t>>>0>8){continue}break}}b=170;O:{switch((t>>>2|0)-1|0){case 1:b=341;case 0:H[f+24>>2]=b;break;default:break O}}P:{if((m|0)==(o|0)){break P}while(1){oa(H[m>>2]);m=m+4|0;if((o|0)!=(m|0)){continue}break}d=H[f+16>>2];b=H[f+12>>2];if((d|0)==(b|0)){break P}H[f+16>>2]=d+((b-d|0)+3&-4)}b=H[f+8>>2];if(b){oa(b)}ca=f+32|0;break z}}xb(i);break d;case 2:f=ub(B+8|0,3);w=B+664|0;k=H[b+8>>2];n=H[b+12>>2];d=H[b+20>>2];e=H[b+16>>2];g=e+4|0;d=g>>>0<4?d+1|0:d;Q:{if(g>>>0>k>>>0&(d|0)>=(n|0)|(d|0)>(n|0)){break Q}d=e+H[b>>2]|0;H[f>>2]=I[d|0]|I[d+1|0]<<8|(I[d+2|0]<<16|I[d+3|0]<<24);d=H[b+20>>2];k=d;g=H[b+16>>2];e=g+4|0;d=e>>>0<4?d+1|0:d;H[b+16>>2]=e;H[b+20>>2]=d;if(K[f>>2]>32){break Q}n=H[b+8>>2];s=H[b+12>>2];d=k;g=g+8|0;d=g>>>0<8?d+1|0:d;if(g>>>0>n>>>0&(d|0)>=(s|0)|(d|0)>(s|0)){break Q}d=e+H[b>>2]|0;e=I[d|0]|I[d+1|0]<<8|(I[d+2|0]<<16|I[d+3|0]<<24);H[f+4>>2]=e;g=H[b+20>>2];d=H[b+16>>2]+4|0;g=d>>>0<4?g+1|0:g;H[b+16>>2]=d;H[b+20>>2]=g;if(!e){break Q}H[f+8>>2]=0;if(!ta(f+16|0,b)){break Q}if(!ua(f+32|0,b)){break Q}if(!ua(f+52|0,b)){break Q}if(!ua(f+72|0,b)){break Q}z=H[f+4>>2];g=0;b=0;h=ca-32|0;ca=h;j=H[f+12>>2];H[h+16>>2]=0;H[h+8>>2]=0;H[h+12>>2]=0;if(j){if(j>>>0>=1073741824){break b}d=j<<2;g=pa(d);H[h+8>>2]=g;b=d+g|0;H[h+16>>2]=b;ra(g,0,d);H[h+12>>2]=b}e=H[f+116>>2];d=H[e>>2];if(d){H[e+4>>2]=d;oa(d);j=H[f+12>>2];g=H[h+8>>2];b=H[h+12>>2]}H[e+4>>2]=b;H[e>>2]=g;H[e+8>>2]=H[h+16>>2];g=0;H[h+16>>2]=0;H[h+8>>2]=0;H[h+12>>2]=0;R:{if(j){if(j>>>0>=1073741824){break b}b=j<<2;u=pa(b);H[h+8>>2]=u;g=b+u|0;H[h+16>>2]=g;ra(u,0,b);H[h+12>>2]=g}d=H[f+128>>2];b=H[d>>2];if(b){H[d+4>>2]=b;oa(b);u=H[h+8>>2];g=H[h+12>>2]}H[d+4>>2]=g;H[d>>2]=u;H[d+8>>2]=H[h+16>>2];H[h+24>>2]=0;H[h+28>>2]=0;H[h+16>>2]=0;H[h+20>>2]=0;H[h+8>>2]=0;H[h+12>>2]=0;xa(h+8|0);d=H[h+24>>2]+H[h+28>>2]|0;b=(d>>>0)/341|0;b=H[H[h+12>>2]+(b<<2)>>2]+N(d-N(b,341)|0,12)|0;H[b+4>>2]=0;H[b+8>>2]=0;H[b>>2]=z;j=H[h+28>>2]+1|0;H[h+28>>2]=j;S:{if(!j){break S}x=f+92|0;y=f+16|0;while(1){n=H[h+12>>2];g=H[h+24>>2];e=j-1|0;d=g+e|0;b=(d>>>0)/341|0;b=H[n+(b<<2)>>2]+N(d-N(b,341)|0,12)|0;p=H[b+8>>2];k=H[b+4>>2];i=H[b>>2];H[h+28>>2]=e;b=H[h+16>>2];if((((b|0)!=(n|0)?N(b-n>>2,341)-1|0:0)-(g+j|0)|0)+1>>>0>=682){oa(H[b-4>>2]);H[h+16>>2]=H[h+16>>2]-4}d=0;if(i>>>0>z>>>0){break S}b=H[f+12>>2];j=(k|0)!=(b-1|0)?k+1|0:0;if(j>>>0>=b>>>0){break S}o=N(p,12);A=o+H[f+128>>2]|0;t=o+H[f+116>>2]|0;g=H[f>>2];q=j<<2;e=H[q+H[A>>2]>>2];T:{if((g|0)==(e|0)){if(!i){break T}while(1){b=H[t>>2];r=H[b+8>>2];s=H[b+4>>2];n=H[b>>2];o=H[w>>2];j=H[o+4>>2];b=H[o+8>>2];U:{if(j>>>0<b>>>0){H[j+8>>2]=r;H[j+4>>2]=s;H[j>>2]=n;H[o+4>>2]=j+12;break U}q=H[o>>2];g=(j-q|0)/12|0;k=g+1|0;if(k>>>0>=357913942){break b}e=(b-q|0)/12|0;b=e<<1;k=e>>>0>=178956970?357913941:b>>>0>k>>>0?b:k;if(k){if(k>>>0>=357913942){break a}b=pa(N(k,12))}else{b=0}u=b+N(g,12)|0;H[u+8>>2]=r;H[u+4>>2]=s;H[u>>2]=n;e=u+12|0;if((j|0)!=(q|0)){while(1){u=u-12|0;j=j-12|0;H[u>>2]=H[j>>2];H[u+4>>2]=H[j+4>>2];H[u+8>>2]=H[j+8>>2];if((j|0)!=(q|0)){continue}break}}H[o+8>>2]=b+N(k,12);H[o+4>>2]=e;H[o>>2]=u;if(!q){break U}oa(q)}H[f+8>>2]=H[f+8>>2]+1;d=d+1|0;if((i|0)!=(d|0)){continue}break}break T}V:{W:{X:{Y:{if(i>>>0<=2){b=H[f+104>>2];H[b>>2]=j;u=1;g=H[f+12>>2];if(g>>>0>1){break Y}break V}if(K[f+8>>2]>K[f+4>>2]){break S}b=H[f+116>>2];s=p+1|0;r=N(s,12);d=b+r|0;if((d|0)!=(t|0)){Aa(d,H[t>>2],H[t+4>>2]);b=H[f+116>>2]}b=q+H[b+r>>2]|0;H[b>>2]=H[b>>2]+(1<<g+(e^-1));H[h+4>>2]=0;pc(y,Q(i)^31,h+4|0);d=i>>>1|0;b=H[h+4>>2];if(d>>>0<b>>>0){break S}e=d-b|0;d=i-e|0;Z:{if((d|0)==(e|0)){b=e;break Z}n=H[f+84>>2];if((n|0)==H[f+76>>2]){break X}k=H[n>>2];g=H[f+88>>2];b=g+1|0;H[f+88>>2]=b;g=k&-2147483648>>>g;_:{if((b|0)==32){H[f+88>>2]=0;H[f+84>>2]=n+4;if(g){break _}break X}if(!g){break X}}b=d}d=e;break W}while(1){j=(g-1|0)!=(j|0)?j+1|0:0;H[b+(u<<2)>>2]=j;g=H[f+12>>2];u=u+1|0;if(g>>>0>u>>>0){continue}break}break V}b=e}n=H[f+128>>2];k=n+o|0;g=H[k>>2];e=g+q|0;H[e>>2]=H[e>>2]+1;Aa(n+r|0,g,H[k+4>>2]);if(d){g=H[h+28>>2]+H[h+24>>2]|0;e=H[h+16>>2];u=H[h+12>>2];if((g|0)==(((e|0)!=(u|0)?N(e-u>>2,341)-1|0:0)|0)){xa(h+8|0);u=H[h+12>>2];g=H[h+24>>2]+H[h+28>>2]|0}e=(g>>>0)/341|0;e=H[(e<<2)+u>>2]+N(g-N(e,341)|0,12)|0;H[e+8>>2]=p;H[e+4>>2]=j;H[e>>2]=d;H[h+28>>2]=H[h+28>>2]+1}if(!b){break T}g=H[h+28>>2]+H[h+24>>2]|0;d=H[h+16>>2];u=H[h+12>>2];if((g|0)==(((d|0)!=(u|0)?N(d-u>>2,341)-1|0:0)|0)){xa(h+8|0);u=H[h+12>>2];g=H[h+24>>2]+H[h+28>>2]|0}d=(g>>>0)/341|0;d=H[(d<<2)+u>>2]+N(g-N(d,341)|0,12)|0;H[d+8>>2]=s;H[d+4>>2]=j;H[d>>2]=b;H[h+28>>2]=H[h+28>>2]+1;break T}if(!i){break T}while(1){if(H[f+12>>2]){p=H[f+36>>2];n=H[A>>2];u=H[f+92>>2];k=H[f+104>>2];j=0;while(1){o=k+(j<<2)|0;H[u+(H[o>>2]<<2)>>2]=0;g=H[f>>2];e=H[o>>2]<<2;b=H[e+n>>2];$:{if((g|0)==(b|0)){break $}q=e+u|0;l=g-b|0;r=H[f+48>>2];g=32-r|0;if((l|0)<=(g|0)){e=H[f+44>>2];if((e|0)==(p|0)){break S}H[q>>2]=H[e>>2]<<r>>>32-l;b=l+H[f+48>>2]|0;H[f+48>>2]=b;if((b|0)!=32){break $}H[f+48>>2]=0;H[f+44>>2]=e+4;break $}s=H[f+44>>2];b=s+4|0;if((b|0)==(p|0)){break S}e=H[s>>2];H[f+44>>2]=b;b=l-g|0;H[f+48>>2]=b;H[q>>2]=H[s+4>>2]>>>32-b|e<<r>>>32-l}e=H[o>>2]<<2;b=e+u|0;H[b>>2]=H[b>>2]|H[e+H[t>>2]>>2];j=j+1|0;if(j>>>0<K[f+12>>2]){continue}break}}jb(w,x);H[f+8>>2]=H[f+8>>2]+1;d=d+1|0;if((i|0)!=(d|0)){continue}break}}j=H[h+28>>2];if(j){continue}break}}H[h+28>>2]=0;u=H[h+16>>2];j=H[h+12>>2];g=u-j|0;if(g>>>0>=9){while(1){oa(H[j>>2]);j=H[h+12>>2]+4|0;H[h+12>>2]=j;u=H[h+16>>2];g=u-j|0;if(g>>>0>8){continue}break}}b=170;aa:{switch((g>>>2|0)-1|0){case 1:b=341;case 0:H[h+24>>2]=b;break;default:break aa}}ba:{if((j|0)==(u|0)){break ba}while(1){oa(H[j>>2]);j=j+4|0;if((u|0)!=(j|0)){continue}break}d=H[h+16>>2];b=H[h+12>>2];if((d|0)==(b|0)){break ba}H[h+16>>2]=d+((b-d|0)+3&-4)}b=H[h+8>>2];if(b){oa(b)}ca=h+32|0;break R}}vb(f);break d;case 3:i=ub(B+8|0,3);z=B+664|0;k=H[b+8>>2];n=H[b+12>>2];d=H[b+20>>2];e=H[b+16>>2];g=e+4|0;d=g>>>0<4?d+1|0:d;ca:{if(g>>>0>k>>>0&(d|0)>=(n|0)|(d|0)>(n|0)){break ca}d=e+H[b>>2]|0;H[i>>2]=I[d|0]|I[d+1|0]<<8|(I[d+2|0]<<16|I[d+3|0]<<24);d=H[b+20>>2];k=d;g=H[b+16>>2];e=g+4|0;d=e>>>0<4?d+1|0:d;H[b+16>>2]=e;H[b+20>>2]=d;if(K[i>>2]>32){break ca}n=H[b+8>>2];s=H[b+12>>2];d=k;g=g+8|0;d=g>>>0<8?d+1|0:d;if(g>>>0>n>>>0&(d|0)>=(s|0)|(d|0)>(s|0)){break ca}d=e+H[b>>2]|0;e=I[d|0]|I[d+1|0]<<8|(I[d+2|0]<<16|I[d+3|0]<<24);H[i+4>>2]=e;g=H[b+20>>2];d=H[b+16>>2]+4|0;g=d>>>0<4?g+1|0:g;H[b+16>>2]=d;H[b+20>>2]=g;if(!e){break ca}H[i+8>>2]=0;if(!ta(i+16|0,b)){break ca}if(!ua(i+32|0,b)){break ca}if(!ua(i+52|0,b)){break ca}if(!ua(i+72|0,b)){break ca}A=H[i+4>>2];d=0;f=ca-32|0;ca=f;j=H[i+12>>2];H[f+16>>2]=0;H[f+8>>2]=0;H[f+12>>2]=0;if(j){if(j>>>0>=1073741824){break b}b=j<<2;m=pa(b);H[f+8>>2]=m;d=b+m|0;H[f+16>>2]=d;ra(m,0,b);H[f+12>>2]=d}e=H[i+116>>2];b=H[e>>2];if(b){H[e+4>>2]=b;oa(b);j=H[i+12>>2];m=H[f+8>>2];d=H[f+12>>2]}H[e+4>>2]=d;H[e>>2]=m;H[e+8>>2]=H[f+16>>2];m=0;H[f+16>>2]=0;H[f+8>>2]=0;H[f+12>>2]=0;da:{if(j){if(j>>>0>=1073741824){break b}b=j<<2;p=pa(b);H[f+8>>2]=p;m=b+p|0;H[f+16>>2]=m;ra(p,0,b);H[f+12>>2]=m}d=H[i+128>>2];b=H[d>>2];if(b){H[d+4>>2]=b;oa(b);m=H[f+12>>2];p=H[f+8>>2]}H[d+4>>2]=m;H[d>>2]=p;H[d+8>>2]=H[f+16>>2];H[f+24>>2]=0;H[f+28>>2]=0;H[f+16>>2]=0;H[f+20>>2]=0;H[f+8>>2]=0;H[f+12>>2]=0;xa(f+8|0);d=H[f+24>>2]+H[f+28>>2]|0;b=(d>>>0)/341|0;b=H[H[f+12>>2]+(b<<2)>>2]+N(d-N(b,341)|0,12)|0;H[b+4>>2]=0;H[b+8>>2]=0;H[b>>2]=A;j=H[f+28>>2]+1|0;H[f+28>>2]=j;ea:{if(!j){break ea}y=i+92|0;s=i+16|0;while(1){k=H[f+12>>2];g=H[f+24>>2];e=j-1|0;d=g+e|0;b=(d>>>0)/341|0;b=H[k+(b<<2)>>2]+N(d-N(b,341)|0,12)|0;o=H[b+8>>2];d=H[b+4>>2];t=H[b>>2];H[f+28>>2]=e;b=H[f+16>>2];if((((b|0)!=(k|0)?N(b-k>>2,341)-1|0:0)-(g+j|0)|0)+1>>>0>=682){oa(H[b-4>>2]);H[f+16>>2]=H[f+16>>2]-4}if(t>>>0>A>>>0){break ea}b=H[i+12>>2];j=(d|0)!=(b-1|0)?d+1|0:0;if(j>>>0>=b>>>0){break ea}b=H[i+116>>2];q=N(o,12);l=b+q|0;e=H[i>>2];r=j<<2;n=q+H[i+128>>2]|0;d=H[r+H[n>>2]>>2];fa:{if((e|0)==(d|0)){r=0;if(!t){break fa}while(1){b=H[l>>2];x=H[b+8>>2];n=H[b+4>>2];k=H[b>>2];o=H[z>>2];j=H[o+4>>2];b=H[o+8>>2];ga:{if(j>>>0<b>>>0){H[j+8>>2]=x;H[j+4>>2]=n;H[j>>2]=k;H[o+4>>2]=j+12;break ga}q=H[o>>2];e=(j-q|0)/12|0;g=e+1|0;if(g>>>0>=357913942){break b}d=(b-q|0)/12|0;b=d<<1;g=d>>>0>=178956970?357913941:b>>>0>g>>>0?b:g;if(g){if(g>>>0>=357913942){break a}b=pa(N(g,12))}else{b=0}p=b+N(e,12)|0;H[p+8>>2]=x;H[p+4>>2]=n;H[p>>2]=k;d=p+12|0;if((j|0)!=(q|0)){while(1){p=p-12|0;j=j-12|0;H[p>>2]=H[j>>2];H[p+4>>2]=H[j+4>>2];H[p+8>>2]=H[j+8>>2];if((j|0)!=(q|0)){continue}break}}H[o+8>>2]=b+N(g,12);H[o+4>>2]=d;H[o>>2]=p;if(!q){break ga}oa(q)}H[i+8>>2]=H[i+8>>2]+1;r=r+1|0;if((t|0)!=(r|0)){continue}break}break fa}ha:{ia:{ja:{ka:{if(t>>>0<=2){b=H[i+104>>2];H[b>>2]=j;p=1;m=H[i+12>>2];if(m>>>0>1){break ka}break ha}if(K[i+8>>2]>K[i+4>>2]){break ea}k=b;b=q+12|0;Aa(k+b|0,H[l>>2],H[l+4>>2]);b=r+H[b+H[i+116>>2]>>2]|0;H[b>>2]=H[b>>2]+(1<<e+(d^-1));H[f+4>>2]=0;pc(s,Q(t)^31,f+4|0);d=t>>>1|0;b=H[f+4>>2];if(d>>>0<b>>>0){break ea}x=o+1|0;e=d-b|0;d=t-e|0;la:{if((d|0)==(e|0)){b=e;break la}n=H[i+84>>2];if((n|0)==H[i+76>>2]){break ja}k=H[n>>2];g=H[i+88>>2];b=g+1|0;H[i+88>>2]=b;g=k&-2147483648>>>g;ma:{if((b|0)==32){H[i+88>>2]=0;H[i+84>>2]=n+4;if(g){break ma}break ja}if(!g){break ja}}b=d}d=e;break ia}while(1){j=(m-1|0)!=(j|0)?j+1|0:0;H[b+(p<<2)>>2]=j;m=H[i+12>>2];p=p+1|0;if(m>>>0>p>>>0){continue}break}break ha}b=e}n=H[i+128>>2];k=n+q|0;g=H[k>>2];e=g+r|0;H[e>>2]=H[e>>2]+1;Aa(n+N(x,12)|0,g,H[k+4>>2]);if(d){m=H[f+28>>2]+H[f+24>>2]|0;e=H[f+16>>2];p=H[f+12>>2];if((m|0)==(((e|0)!=(p|0)?N(e-p>>2,341)-1|0:0)|0)){xa(f+8|0);m=H[f+24>>2]+H[f+28>>2]|0;p=H[f+12>>2]}e=(m>>>0)/341|0;e=H[p+(e<<2)>>2]+N(m-N(e,341)|0,12)|0;H[e+8>>2]=o;H[e+4>>2]=j;H[e>>2]=d;H[f+28>>2]=H[f+28>>2]+1}if(!b){break fa}m=H[f+28>>2]+H[f+24>>2]|0;d=H[f+16>>2];p=H[f+12>>2];if((m|0)==(((d|0)!=(p|0)?N(d-p>>2,341)-1|0:0)|0)){xa(f+8|0);m=H[f+24>>2]+H[f+28>>2]|0;p=H[f+12>>2]}d=(m>>>0)/341|0;d=H[p+(d<<2)>>2]+N(m-N(d,341)|0,12)|0;H[d+8>>2]=x;H[d+4>>2]=j;H[d>>2]=b;H[f+28>>2]=H[f+28>>2]+1;break fa}m=0;if(!t){break fa}while(1){if(H[i+12>>2]){p=H[i+36>>2];k=H[n>>2];w=H[i+92>>2];g=H[i+104>>2];j=0;while(1){o=g+(j<<2)|0;H[w+(H[o>>2]<<2)>>2]=0;e=H[i>>2];d=H[o>>2]<<2;b=H[d+k>>2];na:{if((e|0)==(b|0)){break na}q=d+w|0;u=e-b|0;r=H[i+48>>2];e=32-r|0;if((u|0)<=(e|0)){d=H[i+44>>2];if((d|0)==(p|0)){break ea}H[q>>2]=H[d>>2]<<r>>>32-u;b=u+H[i+48>>2]|0;H[i+48>>2]=b;if((b|0)!=32){break na}H[i+48>>2]=0;H[i+44>>2]=d+4;break na}x=H[i+44>>2];b=x+4|0;if((b|0)==(p|0)){break ea}d=H[x>>2];H[i+44>>2]=b;b=u-e|0;H[i+48>>2]=b;H[q>>2]=H[x+4>>2]>>>32-b|d<<r>>>32-u}d=H[o>>2]<<2;b=d+w|0;H[b>>2]=H[b>>2]|H[d+H[l>>2]>>2];j=j+1|0;if(j>>>0<K[i+12>>2]){continue}break}}jb(z,y);H[i+8>>2]=H[i+8>>2]+1;m=m+1|0;if((t|0)!=(m|0)){continue}break}}j=H[f+28>>2];if(j){continue}break}}H[f+28>>2]=0;p=H[f+16>>2];j=H[f+12>>2];m=p-j|0;if(m>>>0>=9){while(1){oa(H[j>>2]);j=H[f+12>>2]+4|0;H[f+12>>2]=j;p=H[f+16>>2];m=p-j|0;if(m>>>0>8){continue}break}}b=170;oa:{switch((m>>>2|0)-1|0){case 1:b=341;case 0:H[f+24>>2]=b;break;default:break oa}}pa:{if((j|0)==(p|0)){break pa}while(1){oa(H[j>>2]);j=j+4|0;if((p|0)!=(j|0)){continue}break}d=H[f+16>>2];b=H[f+12>>2];if((d|0)==(b|0)){break pa}H[f+16>>2]=d+((b-d|0)+3&-4)}b=H[f+8>>2];if(b){oa(b)}ca=f+32|0;break da}}vb(i);break d;case 4:f=$a(B+8|0,3);w=B+664|0;k=H[b+8>>2];n=H[b+12>>2];d=H[b+20>>2];e=H[b+16>>2];g=e+4|0;d=g>>>0<4?d+1|0:d;qa:{if(g>>>0>k>>>0&(d|0)>=(n|0)|(d|0)>(n|0)){break qa}d=e+H[b>>2]|0;H[f>>2]=I[d|0]|I[d+1|0]<<8|(I[d+2|0]<<16|I[d+3|0]<<24);d=H[b+20>>2];k=d;g=H[b+16>>2];e=g+4|0;d=e>>>0<4?d+1|0:d;H[b+16>>2]=e;H[b+20>>2]=d;if(K[f>>2]>32){break qa}n=H[b+8>>2];s=H[b+12>>2];d=k;g=g+8|0;d=g>>>0<8?d+1|0:d;if(g>>>0>n>>>0&(d|0)>=(s|0)|(d|0)>(s|0)){break qa}d=e+H[b>>2]|0;e=I[d|0]|I[d+1|0]<<8|(I[d+2|0]<<16|I[d+3|0]<<24);H[f+4>>2]=e;g=H[b+20>>2];d=H[b+16>>2]+4|0;g=d>>>0<4?g+1|0:g;H[b+16>>2]=d;H[b+20>>2]=g;if(!e){break qa}H[f+8>>2]=0;if(!sb(f+16|0,b)){break qa}if(!ua(f+544|0,b)){break qa}if(!ua(f+564|0,b)){break qa}if(!ua(f+584|0,b)){break qa}z=H[f+4>>2];l=0;b=0;h=ca-32|0;ca=h;d=H[f+12>>2];H[h+16>>2]=0;H[h+8>>2]=0;H[h+12>>2]=0;if(d){if(d>>>0>=1073741824){break b}e=d<<2;l=pa(e);H[h+8>>2]=l;b=e+l|0;H[h+16>>2]=b;ra(l,0,e);H[h+12>>2]=b}g=H[f+628>>2];e=H[g>>2];if(e){H[g+4>>2]=e;oa(e);d=H[f+12>>2];l=H[h+8>>2];b=H[h+12>>2]}H[g+4>>2]=b;H[g>>2]=l;H[g+8>>2]=H[h+16>>2];l=0;H[h+16>>2]=0;H[h+8>>2]=0;H[h+12>>2]=0;ra:{if(d){if(d>>>0>=1073741824){break b}b=d<<2;j=pa(b);H[h+8>>2]=j;l=b+j|0;H[h+16>>2]=l;ra(j,0,b);H[h+12>>2]=l}d=H[f+640>>2];b=H[d>>2];if(b){H[d+4>>2]=b;oa(b);j=H[h+8>>2];l=H[h+12>>2]}H[d+4>>2]=l;H[d>>2]=j;H[d+8>>2]=H[h+16>>2];H[h+24>>2]=0;H[h+28>>2]=0;H[h+16>>2]=0;H[h+20>>2]=0;H[h+8>>2]=0;H[h+12>>2]=0;xa(h+8|0);d=H[h+24>>2]+H[h+28>>2]|0;b=(d>>>0)/341|0;b=H[H[h+12>>2]+(b<<2)>>2]+N(d-N(b,341)|0,12)|0;H[b+4>>2]=0;H[b+8>>2]=0;H[b>>2]=z;d=H[h+28>>2]+1|0;H[h+28>>2]=d;sa:{if(!d){break sa}x=f+604|0;y=f+16|0;while(1){n=H[h+12>>2];k=H[h+24>>2];g=d-1|0;e=k+g|0;b=(e>>>0)/341|0;b=H[n+(b<<2)>>2]+N(e-N(b,341)|0,12)|0;p=H[b+8>>2];e=H[b+4>>2];i=H[b>>2];H[h+28>>2]=g;b=H[h+16>>2];if((((b|0)!=(n|0)?N(b-n>>2,341)-1|0:0)-(d+k|0)|0)+1>>>0>=682){oa(H[b-4>>2]);H[h+16>>2]=H[h+16>>2]-4}if(i>>>0>z>>>0){break sa}b=H[f+12>>2];j=(e|0)!=(b-1|0)?e+1|0:0;if(j>>>0>=b>>>0){break sa}o=N(p,12);A=o+H[f+640>>2]|0;t=o+H[f+628>>2]|0;g=H[f>>2];q=j<<2;e=H[q+H[A>>2]>>2];ta:{ua:{if((g|0)==(e|0)){o=0;if(!i){break ua}while(1){b=H[t>>2];r=H[b+8>>2];s=H[b+4>>2];n=H[b>>2];p=H[w>>2];d=H[p+4>>2];b=H[p+8>>2];va:{if(d>>>0<b>>>0){H[d+8>>2]=r;H[d+4>>2]=s;H[d>>2]=n;H[p+4>>2]=d+12;break va}q=H[p>>2];g=(d-q|0)/12|0;k=g+1|0;if(k>>>0>=357913942){break b}e=(b-q|0)/12|0;b=e<<1;k=e>>>0>=178956970?357913941:b>>>0>k>>>0?b:k;if(k){if(k>>>0>=357913942){break a}b=pa(N(k,12))}else{b=0}j=b+N(g,12)|0;H[j+8>>2]=r;H[j+4>>2]=s;H[j>>2]=n;e=j+12|0;if((d|0)!=(q|0)){while(1){j=j-12|0;d=d-12|0;H[j>>2]=H[d>>2];H[j+4>>2]=H[d+4>>2];H[j+8>>2]=H[d+8>>2];if((d|0)!=(q|0)){continue}break}}H[p+8>>2]=b+N(k,12);H[p+4>>2]=e;H[p>>2]=j;if(!q){break va}oa(q)}H[f+8>>2]=H[f+8>>2]+1;o=o+1|0;if((i|0)!=(o|0)){continue}break}break ua}wa:{xa:{ya:{if(i>>>0<=2){b=H[f+616>>2];H[b>>2]=j;d=1;l=H[f+12>>2];if(l>>>0>1){break ya}break wa}if(K[f+8>>2]>K[f+4>>2]){break sa}b=H[f+628>>2];s=p+1|0;r=N(s,12);d=b+r|0;if((d|0)!=(t|0)){Aa(d,H[t>>2],H[t+4>>2]);b=H[f+628>>2]}b=q+H[b+r>>2]|0;H[b>>2]=H[b>>2]+(1<<g+(e^-1));l=0;d=0;b=Q(i)^31;if(!b){d=i>>>1|0;break xa}while(1){l=Ba(y+(d<<4)|0)|l<<1;d=d+1|0;if((b|0)!=(d|0)){continue}break}d=i>>>1|0;if(l>>>0<=d>>>0){break xa}break sa}while(1){j=(l-1|0)!=(j|0)?j+1|0:0;H[b+(d<<2)>>2]=j;d=d+1|0;l=H[f+12>>2];if(d>>>0<l>>>0){continue}break}break wa}za:{Aa:{e=d-l|0;d=i-e|0;Ba:{if((d|0)==(e|0)){b=e;break Ba}n=H[f+596>>2];if((n|0)==H[f+588>>2]){break Aa}k=H[n>>2];g=H[f+600>>2];b=g+1|0;H[f+600>>2]=b;g=k&-2147483648>>>g;Ca:{if((b|0)==32){H[f+600>>2]=0;H[f+596>>2]=n+4;if(g){break Ca}break Aa}if(!g){break Aa}}b=d}d=e;break za}b=e}n=H[f+640>>2];k=n+o|0;g=H[k>>2];e=g+q|0;H[e>>2]=H[e>>2]+1;Aa(n+r|0,g,H[k+4>>2]);if(d){g=H[h+28>>2]+H[h+24>>2]|0;e=H[h+16>>2];l=H[h+12>>2];if((g|0)==(((e|0)!=(l|0)?N(e-l>>2,341)-1|0:0)|0)){xa(h+8|0);l=H[h+12>>2];g=H[h+24>>2]+H[h+28>>2]|0}e=(g>>>0)/341|0;e=H[(e<<2)+l>>2]+N(g-N(e,341)|0,12)|0;H[e+8>>2]=p;H[e+4>>2]=j;H[e>>2]=d;H[h+28>>2]=H[h+28>>2]+1}if(!b){break ua}l=H[h+28>>2]+H[h+24>>2]|0;e=H[h+16>>2];d=H[h+12>>2];if((l|0)==(((d|0)!=(e|0)?N(e-d>>2,341)-1|0:0)|0)){xa(h+8|0);l=H[h+24>>2]+H[h+28>>2]|0;e=H[h+12>>2]}else{e=d}d=(l>>>0)/341|0;d=H[e+(d<<2)>>2]+N(l-N(d,341)|0,12)|0;H[d+8>>2]=s;H[d+4>>2]=j;H[d>>2]=b;d=H[h+28>>2]+1|0;H[h+28>>2]=d;break ta}j=0;if(!i){break ua}while(1){if(H[f+12>>2]){p=H[f+548>>2];n=H[A>>2];u=H[f+604>>2];k=H[f+616>>2];d=0;while(1){o=k+(d<<2)|0;H[u+(H[o>>2]<<2)>>2]=0;g=H[f>>2];e=H[o>>2]<<2;b=H[e+n>>2];Da:{if((g|0)==(b|0)){break Da}q=e+u|0;l=g-b|0;r=H[f+560>>2];g=32-r|0;if((l|0)<=(g|0)){e=H[f+556>>2];if((e|0)==(p|0)){break sa}H[q>>2]=H[e>>2]<<r>>>32-l;b=l+H[f+560>>2]|0;H[f+560>>2]=b;if((b|0)!=32){break Da}H[f+560>>2]=0;H[f+556>>2]=e+4;break Da}s=H[f+556>>2];b=s+4|0;if((b|0)==(p|0)){break sa}e=H[s>>2];H[f+556>>2]=b;b=l-g|0;H[f+560>>2]=b;H[q>>2]=H[s+4>>2]>>>32-b|e<<r>>>32-l}e=H[o>>2]<<2;b=e+u|0;H[b>>2]=H[b>>2]|H[e+H[t>>2]>>2];d=d+1|0;if(d>>>0<K[f+12>>2]){continue}break}}jb(w,x);H[f+8>>2]=H[f+8>>2]+1;j=j+1|0;if((i|0)!=(j|0)){continue}break}}d=H[h+28>>2]}if(d){continue}break}}H[h+28>>2]=0;j=H[h+16>>2];d=H[h+12>>2];l=j-d|0;if(l>>>0>=9){while(1){oa(H[d>>2]);d=H[h+12>>2]+4|0;H[h+12>>2]=d;j=H[h+16>>2];l=j-d|0;if(l>>>0>8){continue}break}}b=170;Ea:{switch((l>>>2|0)-1|0){case 1:b=341;case 0:H[h+24>>2]=b;break;default:break Ea}}Fa:{if((d|0)==(j|0)){break Fa}while(1){oa(H[d>>2]);d=d+4|0;if((j|0)!=(d|0)){continue}break}d=H[h+16>>2];b=H[h+12>>2];if((d|0)==(b|0)){break Fa}H[h+16>>2]=d+((b-d|0)+3&-4)}b=H[h+8>>2];if(b){oa(b)}ca=h+32|0;break ra}}ab(f);break d;case 5:f=$a(B+8|0,3);w=B+664|0;k=H[b+8>>2];n=H[b+12>>2];d=H[b+20>>2];e=H[b+16>>2];g=e+4|0;d=g>>>0<4?d+1|0:d;Ga:{if(g>>>0>k>>>0&(d|0)>=(n|0)|(d|0)>(n|0)){break Ga}d=e+H[b>>2]|0;H[f>>2]=I[d|0]|I[d+1|0]<<8|(I[d+2|0]<<16|I[d+3|0]<<24);d=H[b+20>>2];k=d;g=H[b+16>>2];e=g+4|0;d=e>>>0<4?d+1|0:d;H[b+16>>2]=e;H[b+20>>2]=d;if(K[f>>2]>32){break Ga}n=H[b+8>>2];s=H[b+12>>2];d=k;g=g+8|0;d=g>>>0<8?d+1|0:d;if(g>>>0>n>>>0&(d|0)>=(s|0)|(d|0)>(s|0)){break Ga}d=e+H[b>>2]|0;e=I[d|0]|I[d+1|0]<<8|(I[d+2|0]<<16|I[d+3|0]<<24);H[f+4>>2]=e;g=H[b+20>>2];d=H[b+16>>2]+4|0;g=d>>>0<4?g+1|0:g;H[b+16>>2]=d;H[b+20>>2]=g;if(!e){break Ga}H[f+8>>2]=0;if(!sb(f+16|0,b)){break Ga}if(!ua(f+544|0,b)){break Ga}if(!ua(f+564|0,b)){break Ga}if(!ua(f+584|0,b)){break Ga}z=H[f+4>>2];l=0;b=0;h=ca-32|0;ca=h;d=H[f+12>>2];H[h+16>>2]=0;H[h+8>>2]=0;H[h+12>>2]=0;if(d){if(d>>>0>=1073741824){break b}e=d<<2;l=pa(e);H[h+8>>2]=l;b=e+l|0;H[h+16>>2]=b;ra(l,0,e);H[h+12>>2]=b}g=H[f+628>>2];e=H[g>>2];if(e){H[g+4>>2]=e;oa(e);d=H[f+12>>2];l=H[h+8>>2];b=H[h+12>>2]}H[g+4>>2]=b;H[g>>2]=l;H[g+8>>2]=H[h+16>>2];l=0;H[h+16>>2]=0;H[h+8>>2]=0;H[h+12>>2]=0;Ha:{if(d){if(d>>>0>=1073741824){break b}b=d<<2;p=pa(b);H[h+8>>2]=p;l=b+p|0;H[h+16>>2]=l;ra(p,0,b);H[h+12>>2]=l}d=H[f+640>>2];b=H[d>>2];if(b){H[d+4>>2]=b;oa(b);l=H[h+12>>2];p=H[h+8>>2]}H[d+4>>2]=l;H[d>>2]=p;H[d+8>>2]=H[h+16>>2];H[h+24>>2]=0;H[h+28>>2]=0;H[h+16>>2]=0;H[h+20>>2]=0;H[h+8>>2]=0;H[h+12>>2]=0;xa(h+8|0);d=H[h+24>>2]+H[h+28>>2]|0;b=(d>>>0)/341|0;b=H[H[h+12>>2]+(b<<2)>>2]+N(d-N(b,341)|0,12)|0;H[b+4>>2]=0;H[b+8>>2]=0;H[b>>2]=z;d=H[h+28>>2]+1|0;H[h+28>>2]=d;Ia:{if(!d){break Ia}x=f+604|0;y=f+16|0;while(1){n=H[h+12>>2];k=H[h+24>>2];g=d-1|0;e=k+g|0;b=(e>>>0)/341|0;b=H[n+(b<<2)>>2]+N(e-N(b,341)|0,12)|0;o=H[b+8>>2];e=H[b+4>>2];i=H[b>>2];H[h+28>>2]=g;b=H[h+16>>2];if((((b|0)!=(n|0)?N(b-n>>2,341)-1|0:0)-(d+k|0)|0)+1>>>0>=682){oa(H[b-4>>2]);H[h+16>>2]=H[h+16>>2]-4}if(i>>>0>z>>>0){break Ia}m=0;b=H[f+12>>2];p=(e|0)!=(b-1|0)?e+1|0:0;if(p>>>0>=b>>>0){break Ia}b=H[f+628>>2];q=N(o,12);t=b+q|0;e=H[f>>2];r=p<<2;s=q+H[f+640>>2]|0;d=H[r+H[s>>2]>>2];Ja:{Ka:{if((e|0)==(d|0)){if(!i){break Ka}while(1){b=H[t>>2];r=H[b+8>>2];s=H[b+4>>2];n=H[b>>2];o=H[w>>2];d=H[o+4>>2];b=H[o+8>>2];La:{if(d>>>0<b>>>0){H[d+8>>2]=r;H[d+4>>2]=s;H[d>>2]=n;H[o+4>>2]=d+12;break La}q=H[o>>2];g=(d-q|0)/12|0;k=g+1|0;if(k>>>0>=357913942){break b}e=(b-q|0)/12|0;b=e<<1;k=e>>>0>=178956970?357913941:b>>>0>k>>>0?b:k;if(k){if(k>>>0>=357913942){break a}b=pa(N(k,12))}else{b=0}p=b+N(g,12)|0;H[p+8>>2]=r;H[p+4>>2]=s;H[p>>2]=n;e=p+12|0;if((d|0)!=(q|0)){while(1){p=p-12|0;d=d-12|0;H[p>>2]=H[d>>2];H[p+4>>2]=H[d+4>>2];H[p+8>>2]=H[d+8>>2];if((d|0)!=(q|0)){continue}break}}H[o+8>>2]=b+N(k,12);H[o+4>>2]=e;H[o>>2]=p;if(!q){break La}oa(q)}H[f+8>>2]=H[f+8>>2]+1;m=m+1|0;if((i|0)!=(m|0)){continue}break}break Ka}Ma:{Na:{Oa:{if(i>>>0<=2){b=H[f+616>>2];H[b>>2]=p;d=1;l=H[f+12>>2];if(l>>>0>1){break Oa}break Ma}if(K[f+8>>2]>K[f+4>>2]){break Ia}k=b;b=q+12|0;Aa(k+b|0,H[t>>2],H[t+4>>2]);b=r+H[b+H[f+628>>2]>>2]|0;H[b>>2]=H[b>>2]+(1<<e+(d^-1));l=0;d=0;b=Q(i)^31;if(!b){d=i>>>1|0;break Na}while(1){l=Ba(y+(d<<4)|0)|l<<1;d=d+1|0;if((b|0)!=(d|0)){continue}break}d=i>>>1|0;if(l>>>0<=d>>>0){break Na}break Ia}while(1){p=(l-1|0)!=(p|0)?p+1|0:0;H[b+(d<<2)>>2]=p;d=d+1|0;l=H[f+12>>2];if(d>>>0<l>>>0){continue}break}break Ma}s=o+1|0;Pa:{Qa:{e=d-l|0;d=i-e|0;Ra:{if((d|0)==(e|0)){b=e;break Ra}n=H[f+596>>2];if((n|0)==H[f+588>>2]){break Qa}k=H[n>>2];g=H[f+600>>2];b=g+1|0;H[f+600>>2]=b;g=k&-2147483648>>>g;Sa:{if((b|0)==32){H[f+600>>2]=0;H[f+596>>2]=n+4;if(g){break Sa}break Qa}if(!g){break Qa}}b=d}d=e;break Pa}b=e}n=H[f+640>>2];k=n+q|0;g=H[k>>2];e=g+r|0;H[e>>2]=H[e>>2]+1;Aa(n+N(s,12)|0,g,H[k+4>>2]);if(d){m=H[h+28>>2]+H[h+24>>2]|0;e=H[h+16>>2];l=H[h+12>>2];if((m|0)==(((e|0)!=(l|0)?N(e-l>>2,341)-1|0:0)|0)){xa(h+8|0);m=H[h+24>>2]+H[h+28>>2]|0;l=H[h+12>>2]}e=(m>>>0)/341|0;e=H[l+(e<<2)>>2]+N(m-N(e,341)|0,12)|0;H[e+8>>2]=o;H[e+4>>2]=p;H[e>>2]=d;H[h+28>>2]=H[h+28>>2]+1}if(!b){break Ka}l=H[h+28>>2]+H[h+24>>2]|0;e=H[h+16>>2];d=H[h+12>>2];if((l|0)==(((d|0)!=(e|0)?N(e-d>>2,341)-1|0:0)|0)){xa(h+8|0);l=H[h+24>>2]+H[h+28>>2]|0;e=H[h+12>>2]}else{e=d}d=(l>>>0)/341|0;d=H[e+(d<<2)>>2]+N(l-N(d,341)|0,12)|0;H[d+8>>2]=s;H[d+4>>2]=p;H[d>>2]=b;d=H[h+28>>2]+1|0;H[h+28>>2]=d;break Ja}if(!i){break Ka}while(1){if(H[f+12>>2]){A=H[f+548>>2];n=H[s>>2];u=H[f+604>>2];k=H[f+616>>2];d=0;while(1){p=k+(d<<2)|0;H[u+(H[p>>2]<<2)>>2]=0;g=H[f>>2];e=H[p>>2]<<2;b=H[e+n>>2];Ta:{if((g|0)==(b|0)){break Ta}o=e+u|0;l=g-b|0;q=H[f+560>>2];g=32-q|0;if((l|0)<=(g|0)){e=H[f+556>>2];if((e|0)==(A|0)){break Ia}H[o>>2]=H[e>>2]<<q>>>32-l;b=l+H[f+560>>2]|0;H[f+560>>2]=b;if((b|0)!=32){break Ta}H[f+560>>2]=0;H[f+556>>2]=e+4;break Ta}r=H[f+556>>2];b=r+4|0;if((b|0)==(A|0)){break Ia}e=H[r>>2];H[f+556>>2]=b;b=l-g|0;H[f+560>>2]=b;H[o>>2]=H[r+4>>2]>>>32-b|e<<q>>>32-l}e=H[p>>2]<<2;b=e+u|0;H[b>>2]=H[b>>2]|H[e+H[t>>2]>>2];d=d+1|0;if(d>>>0<K[f+12>>2]){continue}break}}jb(w,x);H[f+8>>2]=H[f+8>>2]+1;m=m+1|0;if((i|0)!=(m|0)){continue}break}}d=H[h+28>>2]}if(d){continue}break}}H[h+28>>2]=0;p=H[h+16>>2];d=H[h+12>>2];l=p-d|0;if(l>>>0>=9){while(1){oa(H[d>>2]);d=H[h+12>>2]+4|0;H[h+12>>2]=d;p=H[h+16>>2];l=p-d|0;if(l>>>0>8){continue}break}}b=170;Ua:{switch((l>>>2|0)-1|0){case 1:b=341;case 0:H[h+24>>2]=b;break;default:break Ua}}Va:{if((d|0)==(p|0)){break Va}while(1){oa(H[d>>2]);d=d+4|0;if((p|0)!=(d|0)){continue}break}d=H[h+16>>2];b=H[h+12>>2];if((d|0)==(b|0)){break Va}H[h+16>>2]=d+((b-d|0)+3&-4)}b=H[h+8>>2];if(b){oa(b)}ca=h+32|0;break Ha}}ab(f);break d;case 6:break f;default:break c}}f=$a(B+8|0,3);w=B+664|0;k=H[b+8>>2];n=H[b+12>>2];d=H[b+20>>2];e=H[b+16>>2];g=e+4|0;d=g>>>0<4?d+1|0:d;Wa:{if(g>>>0>k>>>0&(d|0)>=(n|0)|(d|0)>(n|0)){break Wa}d=e+H[b>>2]|0;H[f>>2]=I[d|0]|I[d+1|0]<<8|(I[d+2|0]<<16|I[d+3|0]<<24);d=H[b+20>>2];k=d;g=H[b+16>>2];e=g+4|0;d=e>>>0<4?d+1|0:d;H[b+16>>2]=e;H[b+20>>2]=d;if(K[f>>2]>32){break Wa}n=H[b+8>>2];s=H[b+12>>2];d=k;g=g+8|0;d=g>>>0<8?d+1|0:d;if(g>>>0>n>>>0&(d|0)>=(s|0)|(d|0)>(s|0)){break Wa}d=e+H[b>>2]|0;e=I[d|0]|I[d+1|0]<<8|(I[d+2|0]<<16|I[d+3|0]<<24);H[f+4>>2]=e;g=H[b+20>>2];d=H[b+16>>2]+4|0;g=d>>>0<4?g+1|0:g;H[b+16>>2]=d;H[b+20>>2]=g;if(!e){break Wa}H[f+8>>2]=0;if(!sb(f+16|0,b)){break Wa}if(!ua(f+544|0,b)){break Wa}if(!ua(f+564|0,b)){break Wa}if(!ua(f+584|0,b)){break Wa}z=H[f+4>>2];l=0;b=0;h=ca-32|0;ca=h;d=H[f+12>>2];H[h+16>>2]=0;H[h+8>>2]=0;H[h+12>>2]=0;if(d){if(d>>>0>=1073741824){break b}e=d<<2;l=pa(e);H[h+8>>2]=l;b=e+l|0;H[h+16>>2]=b;ra(l,0,e);H[h+12>>2]=b}g=H[f+628>>2];e=H[g>>2];if(e){H[g+4>>2]=e;oa(e);d=H[f+12>>2];l=H[h+8>>2];b=H[h+12>>2]}H[g+4>>2]=b;H[g>>2]=l;H[g+8>>2]=H[h+16>>2];l=0;H[h+16>>2]=0;H[h+8>>2]=0;H[h+12>>2]=0;Xa:{if(d){if(d>>>0>=1073741824){break b}b=d<<2;j=pa(b);H[h+8>>2]=j;l=b+j|0;H[h+16>>2]=l;ra(j,0,b);H[h+12>>2]=l}d=H[f+640>>2];b=H[d>>2];if(b){H[d+4>>2]=b;oa(b);j=H[h+8>>2];l=H[h+12>>2]}H[d+4>>2]=l;H[d>>2]=j;H[d+8>>2]=H[h+16>>2];H[h+24>>2]=0;H[h+28>>2]=0;H[h+16>>2]=0;H[h+20>>2]=0;H[h+8>>2]=0;H[h+12>>2]=0;xa(h+8|0);d=H[h+24>>2]+H[h+28>>2]|0;b=(d>>>0)/341|0;b=H[H[h+12>>2]+(b<<2)>>2]+N(d-N(b,341)|0,12)|0;H[b+4>>2]=0;H[b+8>>2]=0;H[b>>2]=z;d=H[h+28>>2]+1|0;H[h+28>>2]=d;Ya:{if(!d){break Ya}x=f+604|0;y=f+16|0;while(1){n=H[h+12>>2];k=H[h+24>>2];g=d-1|0;e=k+g|0;b=(e>>>0)/341|0;b=H[n+(b<<2)>>2]+N(e-N(b,341)|0,12)|0;p=H[b+8>>2];i=H[b>>2];H[h+28>>2]=g;b=H[h+16>>2];if((((b|0)!=(n|0)?N(b-n>>2,341)-1|0:0)-(d+k|0)|0)+1>>>0>=682){oa(H[b-4>>2]);H[h+16>>2]=H[h+16>>2]-4}if(i>>>0>z>>>0){break Ya}b=H[f+628>>2];o=N(p,12);A=o+H[f+640>>2]|0;j=Vd(f,i,A);if(j>>>0>=K[f+12>>2]){break Ya}t=b+o|0;g=H[f>>2];q=j<<2;e=H[q+H[A>>2]>>2];Za:{_a:{if((g|0)==(e|0)){o=0;if(!i){break _a}while(1){b=H[t>>2];r=H[b+8>>2];s=H[b+4>>2];n=H[b>>2];p=H[w>>2];d=H[p+4>>2];b=H[p+8>>2];$a:{if(d>>>0<b>>>0){H[d+8>>2]=r;H[d+4>>2]=s;H[d>>2]=n;H[p+4>>2]=d+12;break $a}q=H[p>>2];g=(d-q|0)/12|0;k=g+1|0;if(k>>>0>=357913942){break b}e=(b-q|0)/12|0;b=e<<1;k=e>>>0>=178956970?357913941:b>>>0>k>>>0?b:k;if(k){if(k>>>0>=357913942){break a}b=pa(N(k,12))}else{b=0}j=b+N(g,12)|0;H[j+8>>2]=r;H[j+4>>2]=s;H[j>>2]=n;e=j+12|0;if((d|0)!=(q|0)){while(1){j=j-12|0;d=d-12|0;H[j>>2]=H[d>>2];H[j+4>>2]=H[d+4>>2];H[j+8>>2]=H[d+8>>2];if((d|0)!=(q|0)){continue}break}}H[p+8>>2]=b+N(k,12);H[p+4>>2]=e;H[p>>2]=j;if(!q){break $a}oa(q)}H[f+8>>2]=H[f+8>>2]+1;o=o+1|0;if((i|0)!=(o|0)){continue}break}break _a}ab:{bb:{cb:{if(i>>>0<=2){b=H[f+616>>2];H[b>>2]=j;d=1;l=H[f+12>>2];if(l>>>0>1){break cb}break ab}if(K[f+8>>2]>K[f+4>>2]){break Ya}b=H[f+628>>2];s=p+1|0;r=N(s,12);d=b+r|0;if((d|0)!=(t|0)){Aa(d,H[t>>2],H[t+4>>2]);b=H[f+628>>2]}b=q+H[b+r>>2]|0;H[b>>2]=H[b>>2]+(1<<g+(e^-1));l=0;d=0;b=Q(i)^31;if(!b){d=i>>>1|0;break bb}while(1){l=Ba(y+(d<<4)|0)|l<<1;d=d+1|0;if((b|0)!=(d|0)){continue}break}d=i>>>1|0;if(l>>>0<=d>>>0){break bb}break Ya}while(1){j=(l-1|0)!=(j|0)?j+1|0:0;H[b+(d<<2)>>2]=j;d=d+1|0;l=H[f+12>>2];if(d>>>0<l>>>0){continue}break}break ab}db:{eb:{e=d-l|0;d=i-e|0;fb:{if((d|0)==(e|0)){b=e;break fb}n=H[f+596>>2];if((n|0)==H[f+588>>2]){break eb}k=H[n>>2];g=H[f+600>>2];b=g+1|0;H[f+600>>2]=b;g=k&-2147483648>>>g;gb:{if((b|0)==32){H[f+600>>2]=0;H[f+596>>2]=n+4;if(g){break gb}break eb}if(!g){break eb}}b=d}d=e;break db}b=e}n=H[f+640>>2];k=n+o|0;g=H[k>>2];e=g+q|0;H[e>>2]=H[e>>2]+1;Aa(n+r|0,g,H[k+4>>2]);if(d){g=H[h+28>>2]+H[h+24>>2]|0;e=H[h+16>>2];l=H[h+12>>2];if((g|0)==(((e|0)!=(l|0)?N(e-l>>2,341)-1|0:0)|0)){xa(h+8|0);l=H[h+12>>2];g=H[h+24>>2]+H[h+28>>2]|0}e=(g>>>0)/341|0;e=H[(e<<2)+l>>2]+N(g-N(e,341)|0,12)|0;H[e+8>>2]=p;H[e+4>>2]=j;H[e>>2]=d;H[h+28>>2]=H[h+28>>2]+1}if(!b){break _a}l=H[h+28>>2]+H[h+24>>2]|0;e=H[h+16>>2];d=H[h+12>>2];if((l|0)==(((d|0)!=(e|0)?N(e-d>>2,341)-1|0:0)|0)){xa(h+8|0);l=H[h+24>>2]+H[h+28>>2]|0;e=H[h+12>>2]}else{e=d}d=(l>>>0)/341|0;d=H[e+(d<<2)>>2]+N(l-N(d,341)|0,12)|0;H[d+8>>2]=s;H[d+4>>2]=j;H[d>>2]=b;d=H[h+28>>2]+1|0;H[h+28>>2]=d;break Za}j=0;if(!i){break _a}while(1){if(H[f+12>>2]){p=H[f+548>>2];n=H[A>>2];u=H[f+604>>2];k=H[f+616>>2];d=0;while(1){o=k+(d<<2)|0;H[u+(H[o>>2]<<2)>>2]=0;g=H[f>>2];e=H[o>>2]<<2;b=H[e+n>>2];hb:{if((g|0)==(b|0)){break hb}q=e+u|0;l=g-b|0;r=H[f+560>>2];g=32-r|0;if((l|0)<=(g|0)){e=H[f+556>>2];if((e|0)==(p|0)){break Ya}H[q>>2]=H[e>>2]<<r>>>32-l;b=l+H[f+560>>2]|0;H[f+560>>2]=b;if((b|0)!=32){break hb}H[f+560>>2]=0;H[f+556>>2]=e+4;break hb}s=H[f+556>>2];b=s+4|0;if((b|0)==(p|0)){break Ya}e=H[s>>2];H[f+556>>2]=b;b=l-g|0;H[f+560>>2]=b;H[q>>2]=H[s+4>>2]>>>32-b|e<<r>>>32-l}e=H[o>>2]<<2;b=e+u|0;H[b>>2]=H[b>>2]|H[e+H[t>>2]>>2];d=d+1|0;if(d>>>0<K[f+12>>2]){continue}break}}jb(w,x);H[f+8>>2]=H[f+8>>2]+1;j=j+1|0;if((i|0)!=(j|0)){continue}break}}d=H[h+28>>2]}if(d){continue}break}}H[h+28>>2]=0;j=H[h+16>>2];d=H[h+12>>2];l=j-d|0;if(l>>>0>=9){while(1){oa(H[d>>2]);d=H[h+12>>2]+4|0;H[h+12>>2]=d;j=H[h+16>>2];l=j-d|0;if(l>>>0>8){continue}break}}b=170;ib:{switch((l>>>2|0)-1|0){case 1:b=341;case 0:H[h+24>>2]=b;break;default:break ib}}jb:{if((d|0)==(j|0)){break jb}while(1){oa(H[d>>2]);d=d+4|0;if((j|0)!=(d|0)){continue}break}d=H[h+16>>2];b=H[h+12>>2];if((d|0)==(b|0)){break jb}H[h+16>>2]=d+((b-d|0)+3&-4)}b=H[h+8>>2];if(b){oa(b)}ca=h+32|0;break Xa}}ab(f)}n=H[a+12>>2]==((H[c+4>>2]-H[c>>2]|0)/12|0)}ca=B+672|0;return n}sa();v()}wa();v()}function kd(a,b,c,d){var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0;if(!a){return 1}e=H[c+20>>2];g=H[c+12>>2];i=H[c+16>>2];a:{if((e|0)>=(g|0)&i>>>0>=K[c+8>>2]|(e|0)>(g|0)){break a}g=I[i+H[c>>2]|0];i=i+1|0;e=i?e:e+1|0;H[c+16>>2]=i;H[c+20>>2]=e;b:{switch(g|0){case 0:e=a;f=b;i=d;a=0;d=0;m=ca+-64|0;ca=m;H[m+56>>2]=0;H[m+48>>2]=0;H[m+52>>2]=0;H[m+40>>2]=0;H[m+44>>2]=0;H[m+32>>2]=0;H[m+36>>2]=0;H[m+24>>2]=0;H[m+28>>2]=0;H[m+16>>2]=0;H[m+20>>2]=0;H[m+8>>2]=0;H[m+12>>2]=0;c:{if(!Ne(m+8|0,c)){break c}if(!Me(m+8|0,c)|(H[m+20>>2]?0:e)){break c}Db(c,0,0);if(e){s=f<<2;t=H[m+36>>2];w=H[m+48>>2];x=H[m+24>>2];l=H[m+56>>2];j=H[m+52>>2];while(1){d:{if(l>>>0>16383){break d}while(1){if((j|0)<=0){break d}j=j-1|0;H[m+52>>2]=j;l=I[j+w|0]|l<<8;H[m+56>>2]=l;if(l>>>0<16384){continue}break}}a=l&4095;r=H[(a<<2)+x>>2];b=(r<<3)+t|0;l=(N(H[b>>2],l>>>12|0)+a|0)-H[b+4>>2]|0;H[m+56>>2]=l;if((f|0)>0){a=0;if(!I[c+36|0]|r>>>0>32){break c}g=d+f|0;e:{if(!r){ra(i+(d<<2)|0,0,s);break e}y=r&-2;z=r&1;b=H[c+32>>2];h=H[c+28>>2];n=H[c+24>>2];while(1){k=0;a=b;o=0;q=0;if((r|0)!=1){while(1){p=n+(a>>>3|0)|0;f:{if(p>>>0>=h>>>0){p=0;break f}p=I[p|0];b=a+1|0;H[c+32>>2]=b;p=p>>>(a&7)&1;a=b}p=p<<k|o;o=0;u=n+(a>>>3|0)|0;if(u>>>0<h>>>0){o=I[u|0];b=a+1|0;H[c+32>>2]=b;o=o>>>(a&7)&1;a=b}u=k|1;k=k+2|0;o=p|o<<u;q=q+2|0;if((y|0)!=(q|0)){continue}break}}q=i+(d<<2)|0;if(z){p=n+(a>>>3|0)|0;if(p>>>0<h>>>0){p=I[p|0];b=a+1|0;H[c+32>>2]=b;a=p>>>(a&7)&1}else{a=0}o=a<<k|o}H[q>>2]=o;d=d+1|0;if((g|0)!=(d|0)){continue}break}}d=g}v=f+v|0;if(e>>>0>v>>>0){continue}break}}F[c+36|0]=0;b=H[c+20>>2];e=0;d=H[c+32>>2]+7|0;e=d>>>0<7?1:e;d=(e&7)<<29|d>>>3;a=d+H[c+16>>2]|0;e=(e>>>3|0)+b|0;H[c+16>>2]=a;H[c+20>>2]=a>>>0<d>>>0?e+1|0:e;a=1}b=H[m+36>>2];if(b){H[m+40>>2]=b;oa(b)}b=H[m+24>>2];if(b){H[m+28>>2]=b;oa(b)}b=H[m+8>>2];if(b){H[m+12>>2]=b;oa(b)}ca=m- -64|0;return a;case 1:break b;default:break a}}b=0;e=H[c+20>>2];g=H[c+12>>2];i=H[c+16>>2];g:{if((e|0)>=(g|0)&i>>>0>=K[c+8>>2]|(e|0)>(g|0)){break g}g=I[i+H[c>>2]|0];i=i+1|0;e=i?e:e+1|0;H[c+16>>2]=i;H[c+20>>2]=e;h:{switch(g-1|0){case 8:g=a;r=d;i=ca+-64|0;ca=i;H[i+56>>2]=0;H[i+48>>2]=0;H[i+52>>2]=0;H[i+40>>2]=0;H[i+44>>2]=0;H[i+32>>2]=0;H[i+36>>2]=0;H[i+24>>2]=0;H[i+28>>2]=0;H[i+16>>2]=0;H[i+20>>2]=0;H[i+8>>2]=0;H[i+12>>2]=0;j=i+8|0;a=J[c+38>>1];i:{j:{if(!a){break j}k:{if(a>>>0<=511){d=H[c+8>>2];b=H[c+12>>2];e=H[c+20>>2];a=H[c+16>>2];f=a+4|0;e=f>>>0<4?e+1|0:e;if(d>>>0<f>>>0&(b|0)<=(e|0)|(b|0)<(e|0)){break j}a=a+H[c>>2]|0;h=I[a|0]|I[a+1|0]<<8|(I[a+2|0]<<16|I[a+3|0]<<24);H[j+12>>2]=h;e=H[c+20>>2];f=H[c+16>>2]+4|0;e=f>>>0<4?e+1|0:e;H[c+16>>2]=f;H[c+20>>2]=e;break k}if(!hb(1,j+12|0,c)){break j}f=H[c+16>>2];e=H[c+20>>2];h=H[j+12>>2]}a=H[c+8>>2];d=a-f|0;a=H[c+12>>2]-((a>>>0<f>>>0)+e|0)|0;if(d>>>0<h>>>6>>>0&(a|0)<=0|(a|0)<0){break j}b=H[j>>2];a=H[j+4>>2]-b>>2;l:{if(a>>>0<h>>>0){ya(j,h-a|0);h=H[j+12>>2];break l}if(a>>>0<=h>>>0){break l}H[j+4>>2]=b+(h<<2)}d=1;if(!h){break i}f=H[c+16>>2];e=H[c+20>>2];s=H[j>>2];m=H[c+8>>2];n=H[c+12>>2];b=0;while(1){d=0;if((e|0)>=(n|0)&f>>>0>=m>>>0|(e|0)>(n|0)){break i}d=H[c>>2];p=I[d+f|0];f=f+1|0;e=f?e:e+1|0;H[c+16>>2]=f;H[c+20>>2]=e;a=p>>>2|0;l=0;m:{n:{o:{p:{t=p&3;switch(t|0){case 0:break n;case 3:break p;default:break o}}a=a+b|0;d=0;if(a>>>0>=h>>>0){break i}ra(s+(b<<2)|0,0,(p&252)+4|0);b=a;break m}while(1){if((f|0)==(m|0)&(e|0)==(n|0)){break j}h=I[d+f|0];f=f+1|0;e=f?e:e+1|0;H[c+16>>2]=f;H[c+20>>2]=e;a=h<<(l<<3|6)|a;l=l+1|0;if((t|0)!=(l|0)){continue}break}}H[s+(b<<2)>>2]=a}b=b+1|0;h=H[j+12>>2];if(b>>>0<h>>>0){continue}break}a=j+16|0;n=H[j>>2];d=H[j+16>>2];b=H[j+20>>2]-d|0;q:{if(b>>>0<=32767){ya(a,8192-(b>>>2|0)|0);break q}if((b|0)==32768){break q}H[j+20>>2]=d+32768}d=j+28|0;b=H[d>>2];f=H[j+32>>2]-b>>3;r:{if(f>>>0<h>>>0){ob(d,h-f|0);b=H[d>>2];break r}if(f>>>0>h>>>0){H[j+32>>2]=(h<<3)+b}if(!h){break j}}m=H[a>>2];f=0;d=0;while(1){e=n+(f<<2)|0;j=H[e>>2];l=(f<<3)+b|0;a=d;H[l+4>>2]=a;H[l>>2]=j;e=H[e>>2];d=e+a|0;if(d>>>0>8192){break j}s:{if(a>>>0>=d>>>0){break s}l=0;j=e&7;if(j){while(1){H[m+(a<<2)>>2]=f;a=a+1|0;l=l+1|0;if((j|0)!=(l|0)){continue}break}}if(e-1>>>0<=6){break s}while(1){e=m+(a<<2)|0;H[e>>2]=f;H[e+28>>2]=f;H[e+24>>2]=f;H[e+20>>2]=f;H[e+16>>2]=f;H[e+12>>2]=f;H[e+8>>2]=f;H[e+4>>2]=f;a=a+8|0;if((d|0)!=(a|0)){continue}break}}f=f+1|0;if((h|0)!=(f|0)){continue}break}k=(d|0)==8192}d=k}t:{if(!d|(H[i+20>>2]?0:g)){break t}d=0;m=ca-16|0;ca=m;u:{v:{if(J[c+38>>1]<=511){b=H[c+8>>2];a=H[c+12>>2];h=a;e=H[c+20>>2];k=H[c+16>>2];f=k+8|0;e=f>>>0<8?e+1|0:e;if(b>>>0<f>>>0&(a|0)<=(e|0)|(a|0)<(e|0)){break u}k=k+H[c>>2]|0;a=I[k|0]|I[k+1|0]<<8|(I[k+2|0]<<16|I[k+3|0]<<24);k=I[k+4|0]|I[k+5|0]<<8|(I[k+6|0]<<16|I[k+7|0]<<24);H[c+16>>2]=f;H[c+20>>2]=e;break v}if(!gb(1,m+8|0,c)){break u}f=H[c+16>>2];e=H[c+20>>2];b=H[c+8>>2];h=H[c+12>>2];a=H[m+8>>2];k=H[m+12>>2]}j=b-f|0;b=h-((b>>>0<f>>>0)+e|0)|0;if((b|0)==(k|0)&a>>>0>j>>>0|b>>>0<k>>>0){break u}e=e+k|0;b=a+f|0;e=b>>>0<a>>>0?e+1|0:e;H[c+16>>2]=b;H[c+20>>2]=e;if((a|0)<=0){break u}b=H[c>>2]+f|0;H[i+48>>2]=b;c=a-1|0;f=c+b|0;e=I[f|0];w:{if(e>>>0<=63){H[i+52>>2]=c;a=I[f|0]&63;break w}x:{switch((e>>>6|0)-1|0){case 0:if(a>>>0<2){break u}a=a-2|0;H[i+52>>2]=a;a=a+b|0;a=I[a+1|0]<<8&16128|I[a|0];break w;case 1:if(a>>>0<3){break u}a=a-3|0;H[i+52>>2]=a;a=a+b|0;a=I[a+1|0]<<8|I[a+2|0]<<16&4128768|I[a|0];break w;default:break x}}a=a-4|0;H[i+52>>2]=a;a=a+b|0;a=(I[a|0]|I[a+1|0]<<8|(I[a+2|0]<<16|I[a+3|0]<<24))&1073741823}H[i+56>>2]=a+32768;d=a>>>0<8355840}ca=m+16|0;if(!d){break t}if(!g){o=1;break t}b=H[i+52>>2];a=H[i+56>>2];c=H[i+36>>2];d=H[i+48>>2];f=H[i+24>>2];while(1){y:{if(a>>>0>32767){break y}while(1){if((b|0)<=0){break y}b=b-1|0;H[i+52>>2]=b;a=I[b+d|0]|a<<8;H[i+56>>2]=a;if(a>>>0<32768){continue}break}}e=a&8191;o=H[f+(e<<2)>>2];k=c+(o<<3)|0;a=(N(H[k>>2],a>>>13|0)+e|0)-H[k+4>>2]|0;H[i+56>>2]=a;H[r+(q<<2)>>2]=o;o=1;q=q+1|0;if((g|0)!=(q|0)){continue}break}}a=H[i+36>>2];if(a){H[i+40>>2]=a;oa(a)}a=H[i+24>>2];if(a){H[i+28>>2]=a;oa(a)}a=H[i+8>>2];if(a){H[i+12>>2]=a;oa(a)}ca=i- -64|0;b=o;break g;case 9:m=a;r=d;g=ca+-64|0;ca=g;H[g+56>>2]=0;H[g+48>>2]=0;H[g+52>>2]=0;H[g+40>>2]=0;H[g+44>>2]=0;H[g+32>>2]=0;H[g+36>>2]=0;H[g+24>>2]=0;H[g+28>>2]=0;H[g+16>>2]=0;H[g+20>>2]=0;H[g+8>>2]=0;H[g+12>>2]=0;j=g+8|0;a=J[c+38>>1];z:{A:{if(!a){break A}B:{if(a>>>0<=511){d=H[c+8>>2];b=H[c+12>>2];e=H[c+20>>2];a=H[c+16>>2];f=a+4|0;e=f>>>0<4?e+1|0:e;if(d>>>0<f>>>0&(b|0)<=(e|0)|(b|0)<(e|0)){break A}a=a+H[c>>2]|0;h=I[a|0]|I[a+1|0]<<8|(I[a+2|0]<<16|I[a+3|0]<<24);H[j+12>>2]=h;e=H[c+20>>2];f=H[c+16>>2]+4|0;e=f>>>0<4?e+1|0:e;H[c+16>>2]=f;H[c+20>>2]=e;break B}if(!hb(1,j+12|0,c)){break A}f=H[c+16>>2];e=H[c+20>>2];h=H[j+12>>2]}a=H[c+8>>2];d=a-f|0;a=H[c+12>>2]-((a>>>0<f>>>0)+e|0)|0;if(d>>>0<h>>>6>>>0&(a|0)<=0|(a|0)<0){break A}b=H[j>>2];a=H[j+4>>2]-b>>2;C:{if(a>>>0<h>>>0){ya(j,h-a|0);h=H[j+12>>2];break C}if(a>>>0<=h>>>0){break C}H[j+4>>2]=b+(h<<2)}d=1;if(!h){break z}f=H[c+16>>2];e=H[c+20>>2];s=H[j>>2];i=H[c+8>>2];n=H[c+12>>2];b=0;while(1){d=0;if((e|0)>=(n|0)&f>>>0>=i>>>0|(e|0)>(n|0)){break z}d=H[c>>2];p=I[d+f|0];f=f+1|0;e=f?e:e+1|0;H[c+16>>2]=f;H[c+20>>2]=e;a=p>>>2|0;l=0;D:{E:{F:{G:{t=p&3;switch(t|0){case 0:break E;case 3:break G;default:break F}}a=a+b|0;d=0;if(a>>>0>=h>>>0){break z}ra(s+(b<<2)|0,0,(p&252)+4|0);b=a;break D}while(1){if((f|0)==(i|0)&(e|0)==(n|0)){break A}h=I[d+f|0];f=f+1|0;e=f?e:e+1|0;H[c+16>>2]=f;H[c+20>>2]=e;a=h<<(l<<3|6)|a;l=l+1|0;if((t|0)!=(l|0)){continue}break}}H[s+(b<<2)>>2]=a}b=b+1|0;h=H[j+12>>2];if(b>>>0<h>>>0){continue}break}a=j+16|0;n=H[j>>2];d=H[j+16>>2];b=H[j+20>>2]-d|0;H:{if(b>>>0<=131071){ya(a,32768-(b>>>2|0)|0);break H}if((b|0)==131072){break H}H[j+20>>2]=d+131072}d=j+28|0;b=H[d>>2];f=H[j+32>>2]-b>>3;I:{if(f>>>0<h>>>0){ob(d,h-f|0);b=H[d>>2];break I}if(f>>>0>h>>>0){H[j+32>>2]=(h<<3)+b}if(!h){break A}}i=H[a>>2];f=0;d=0;while(1){e=n+(f<<2)|0;j=H[e>>2];l=(f<<3)+b|0;a=d;H[l+4>>2]=a;H[l>>2]=j;e=H[e>>2];d=e+a|0;if(d>>>0>32768){break A}J:{if(a>>>0>=d>>>0){break J}l=0;j=e&7;if(j){while(1){H[i+(a<<2)>>2]=f;a=a+1|0;l=l+1|0;if((j|0)!=(l|0)){continue}break}}if(e-1>>>0<=6){break J}while(1){e=i+(a<<2)|0;H[e>>2]=f;H[e+28>>2]=f;H[e+24>>2]=f;H[e+20>>2]=f;H[e+16>>2]=f;H[e+12>>2]=f;H[e+8>>2]=f;H[e+4>>2]=f;a=a+8|0;if((d|0)!=(a|0)){continue}break}}f=f+1|0;if((h|0)!=(f|0)){continue}break}k=(d|0)==32768}d=k}K:{if(!d|(H[g+20>>2]?0:m)){break K}d=0;j=ca-16|0;ca=j;L:{M:{if(J[c+38>>1]<=511){b=H[c+8>>2];a=H[c+12>>2];h=a;e=H[c+20>>2];k=H[c+16>>2];f=k+8|0;e=f>>>0<8?e+1|0:e;if(b>>>0<f>>>0&(a|0)<=(e|0)|(a|0)<(e|0)){break L}k=k+H[c>>2]|0;a=I[k|0]|I[k+1|0]<<8|(I[k+2|0]<<16|I[k+3|0]<<24);k=I[k+4|0]|I[k+5|0]<<8|(I[k+6|0]<<16|I[k+7|0]<<24);H[c+16>>2]=f;H[c+20>>2]=e;break M}if(!gb(1,j+8|0,c)){break L}f=H[c+16>>2];e=H[c+20>>2];b=H[c+8>>2];h=H[c+12>>2];a=H[j+8>>2];k=H[j+12>>2]}i=b-f|0;b=h-((b>>>0<f>>>0)+e|0)|0;if((b|0)==(k|0)&a>>>0>i>>>0|b>>>0<k>>>0){break L}i=e+k|0;b=a+f|0;i=b>>>0<a>>>0?i+1|0:i;H[c+16>>2]=b;H[c+20>>2]=i;if((a|0)<=0){break L}b=H[c>>2]+f|0;H[g+48>>2]=b;c=a-1|0;f=c+b|0;e=I[f|0];N:{if(e>>>0<=63){H[g+52>>2]=c;a=I[f|0]&63;break N}O:{switch((e>>>6|0)-1|0){case 0:if(a>>>0<2){break L}a=a-2|0;H[g+52>>2]=a;a=a+b|0;a=I[a+1|0]<<8&16128|I[a|0];break N;case 1:if(a>>>0<3){break L}a=a-3|0;H[g+52>>2]=a;a=a+b|0;a=I[a+1|0]<<8|I[a+2|0]<<16&4128768|I[a|0];break N;default:break O}}a=a-4|0;H[g+52>>2]=a;a=a+b|0;a=(I[a|0]|I[a+1|0]<<8|(I[a+2|0]<<16|I[a+3|0]<<24))&1073741823}H[g+56>>2]=a+131072;d=a>>>0<33423360}ca=j+16|0;if(!d){break K}if(!m){o=1;break K}b=H[g+52>>2];a=H[g+56>>2];c=H[g+36>>2];d=H[g+48>>2];f=H[g+24>>2];while(1){P:{if(a>>>0>131071){break P}while(1){if((b|0)<=0){break P}b=b-1|0;H[g+52>>2]=b;a=I[b+d|0]|a<<8;H[g+56>>2]=a;if(a>>>0<131072){continue}break}}e=a&32767;o=H[f+(e<<2)>>2];k=c+(o<<3)|0;a=(N(H[k>>2],a>>>15|0)+e|0)-H[k+4>>2]|0;H[g+56>>2]=a;H[r+(q<<2)>>2]=o;o=1;q=q+1|0;if((m|0)!=(q|0)){continue}break}}a=H[g+36>>2];if(a){H[g+40>>2]=a;oa(a)}a=H[g+24>>2];if(a){H[g+28>>2]=a;oa(a)}a=H[g+8>>2];if(a){H[g+12>>2]=a;oa(a)}ca=g- -64|0;b=o;break g;case 10:m=a;j=d;g=ca+-64|0;ca=g;H[g+56>>2]=0;H[g+48>>2]=0;H[g+52>>2]=0;H[g+40>>2]=0;H[g+44>>2]=0;H[g+32>>2]=0;H[g+36>>2]=0;H[g+24>>2]=0;H[g+28>>2]=0;H[g+16>>2]=0;H[g+20>>2]=0;H[g+8>>2]=0;H[g+12>>2]=0;n=g+8|0;a=J[c+38>>1];Q:{R:{if(!a){break R}S:{if(a>>>0<=511){d=H[c+8>>2];b=H[c+12>>2];e=H[c+20>>2];a=H[c+16>>2];f=a+4|0;e=f>>>0<4?e+1|0:e;if(d>>>0<f>>>0&(b|0)<=(e|0)|(b|0)<(e|0)){break R}a=a+H[c>>2]|0;h=I[a|0]|I[a+1|0]<<8|(I[a+2|0]<<16|I[a+3|0]<<24);H[n+12>>2]=h;e=H[c+20>>2];f=H[c+16>>2]+4|0;e=f>>>0<4?e+1|0:e;H[c+16>>2]=f;H[c+20>>2]=e;break S}if(!hb(1,n+12|0,c)){break R}f=H[c+16>>2];e=H[c+20>>2];h=H[n+12>>2]}a=H[c+8>>2];d=a-f|0;a=H[c+12>>2]-((a>>>0<f>>>0)+e|0)|0;if(d>>>0<h>>>6>>>0&(a|0)<=0|(a|0)<0){break R}b=H[n>>2];a=H[n+4>>2]-b>>2;T:{if(a>>>0<h>>>0){ya(n,h-a|0);h=H[n+12>>2];break T}if(a>>>0<=h>>>0){break T}H[n+4>>2]=b+(h<<2)}d=1;if(!h){break Q}f=H[c+16>>2];e=H[c+20>>2];t=H[n>>2];r=H[c+8>>2];p=H[c+12>>2];b=0;while(1){d=0;if((e|0)>=(p|0)&f>>>0>=r>>>0|(e|0)>(p|0)){break Q}d=H[c>>2];s=I[d+f|0];f=f+1|0;i=f?e:e+1|0;H[c+16>>2]=f;e=i;H[c+20>>2]=e;a=s>>>2|0;l=0;U:{V:{W:{X:{i=s&3;switch(i|0){case 0:break V;case 3:break X;default:break W}}a=a+b|0;d=0;if(a>>>0>=h>>>0){break Q}ra(t+(b<<2)|0,0,(s&252)+4|0);b=a;break U}while(1){if((f|0)==(r|0)&(e|0)==(p|0)){break R}h=I[d+f|0];f=f+1|0;e=f?e:e+1|0;H[c+16>>2]=f;H[c+20>>2]=e;a=h<<(l<<3|6)|a;l=l+1|0;if((i|0)!=(l|0)){continue}break}}H[t+(b<<2)>>2]=a}b=b+1|0;h=H[n+12>>2];if(b>>>0<h>>>0){continue}break}a=n+16|0;r=H[n>>2];d=H[n+16>>2];b=H[n+20>>2]-d|0;Y:{if(b>>>0<=262143){ya(a,65536-(b>>>2|0)|0);break Y}if((b|0)==262144){break Y}H[n+20>>2]=d+262144}d=n+28|0;b=H[d>>2];f=H[n+32>>2]-b>>3;Z:{if(f>>>0<h>>>0){ob(d,h-f|0);b=H[d>>2];break Z}if(f>>>0>h>>>0){H[n+32>>2]=(h<<3)+b}if(!h){break R}}i=H[a>>2];f=0;d=0;while(1){e=r+(f<<2)|0;l=H[e>>2];n=(f<<3)+b|0;a=d;H[n+4>>2]=a;H[n>>2]=l;e=H[e>>2];d=e+a|0;if(d>>>0>65536){break R}_:{if(a>>>0>=d>>>0){break _}l=0;n=e&7;if(n){while(1){H[i+(a<<2)>>2]=f;a=a+1|0;l=l+1|0;if((n|0)!=(l|0)){continue}break}}if(e-1>>>0<=6){break _}while(1){e=i+(a<<2)|0;H[e>>2]=f;H[e+28>>2]=f;H[e+24>>2]=f;H[e+20>>2]=f;H[e+16>>2]=f;H[e+12>>2]=f;H[e+8>>2]=f;H[e+4>>2]=f;a=a+8|0;if((d|0)!=(a|0)){continue}break}}f=f+1|0;if((h|0)!=(f|0)){continue}break}k=(d|0)==65536}d=k}$:{if(!d|(H[g+20>>2]?0:m)){break $}d=0;i=ca-16|0;ca=i;aa:{ba:{if(J[c+38>>1]<=511){b=H[c+8>>2];a=H[c+12>>2];h=a;e=H[c+20>>2];k=H[c+16>>2];f=k+8|0;e=f>>>0<8?e+1|0:e;if(b>>>0<f>>>0&(a|0)<=(e|0)|(a|0)<(e|0)){break aa}k=k+H[c>>2]|0;a=I[k|0]|I[k+1|0]<<8|(I[k+2|0]<<16|I[k+3|0]<<24);k=I[k+4|0]|I[k+5|0]<<8|(I[k+6|0]<<16|I[k+7|0]<<24);H[c+16>>2]=f;H[c+20>>2]=e;break ba}if(!gb(1,i+8|0,c)){break aa}f=H[c+16>>2];e=H[c+20>>2];b=H[c+8>>2];h=H[c+12>>2];a=H[i+8>>2];k=H[i+12>>2]}r=b-f|0;b=h-((b>>>0<f>>>0)+e|0)|0;if((b|0)==(k|0)&a>>>0>r>>>0|b>>>0<k>>>0){break aa}e=e+k|0;b=a+f|0;e=b>>>0<a>>>0?e+1|0:e;H[c+16>>2]=b;H[c+20>>2]=e;if((a|0)<=0){break aa}b=H[c>>2]+f|0;H[g+48>>2]=b;c=a-1|0;f=c+b|0;e=I[f|0];ca:{if(e>>>0<=63){H[g+52>>2]=c;a=I[f|0]&63;break ca}da:{switch((e>>>6|0)-1|0){case 0:if(a>>>0<2){break aa}a=a-2|0;H[g+52>>2]=a;a=a+b|0;a=I[a+1|0]<<8&16128|I[a|0];break ca;case 1:if(a>>>0<3){break aa}a=a-3|0;H[g+52>>2]=a;a=a+b|0;a=I[a+1|0]<<8|I[a+2|0]<<16&4128768|I[a|0];break ca;default:break da}}a=a-4|0;H[g+52>>2]=a;a=a+b|0;a=(I[a|0]|I[a+1|0]<<8|(I[a+2|0]<<16|I[a+3|0]<<24))&1073741823}H[g+56>>2]=a+262144;d=a>>>0<66846720}ca=i+16|0;if(!d){break $}if(!m){o=1;break $}b=H[g+52>>2];a=H[g+56>>2];c=H[g+36>>2];d=H[g+48>>2];f=H[g+24>>2];while(1){ea:{if(a>>>0>262143){break ea}while(1){if((b|0)<=0){break ea}b=b-1|0;H[g+52>>2]=b;a=I[b+d|0]|a<<8;H[g+56>>2]=a;if(a>>>0<262144){continue}break}}e=a&65535;o=H[f+(e<<2)>>2];k=c+(o<<3)|0;a=(N(H[k>>2],a>>>16|0)+e|0)-H[k+4>>2]|0;H[g+56>>2]=a;H[j+(q<<2)>>2]=o;o=1;q=q+1|0;if((m|0)!=(q|0)){continue}break}}a=H[g+36>>2];if(a){H[g+40>>2]=a;oa(a)}a=H[g+24>>2];if(a){H[g+28>>2]=a;oa(a)}a=H[g+8>>2];if(a){H[g+12>>2]=a;oa(a)}ca=g- -64|0;b=o;break g;case 11:m=a;r=d;g=ca+-64|0;ca=g;H[g+56>>2]=0;H[g+48>>2]=0;H[g+52>>2]=0;H[g+40>>2]=0;H[g+44>>2]=0;H[g+32>>2]=0;H[g+36>>2]=0;H[g+24>>2]=0;H[g+28>>2]=0;H[g+16>>2]=0;H[g+20>>2]=0;H[g+8>>2]=0;H[g+12>>2]=0;j=g+8|0;a=J[c+38>>1];fa:{ga:{if(!a){break ga}ha:{if(a>>>0<=511){d=H[c+8>>2];b=H[c+12>>2];e=H[c+20>>2];a=H[c+16>>2];f=a+4|0;e=f>>>0<4?e+1|0:e;if(d>>>0<f>>>0&(b|0)<=(e|0)|(b|0)<(e|0)){break ga}a=a+H[c>>2]|0;h=I[a|0]|I[a+1|0]<<8|(I[a+2|0]<<16|I[a+3|0]<<24);H[j+12>>2]=h;i=H[c+20>>2];f=H[c+16>>2]+4|0;i=f>>>0<4?i+1|0:i;H[c+16>>2]=f;e=i;H[c+20>>2]=e;break ha}if(!hb(1,j+12|0,c)){break ga}f=H[c+16>>2];e=H[c+20>>2];h=H[j+12>>2]}a=H[c+8>>2];d=a-f|0;a=H[c+12>>2]-((a>>>0<f>>>0)+e|0)|0;if(d>>>0<h>>>6>>>0&(a|0)<=0|(a|0)<0){break ga}b=H[j>>2];a=H[j+4>>2]-b>>2;ia:{if(a>>>0<h>>>0){ya(j,h-a|0);h=H[j+12>>2];break ia}if(a>>>0<=h>>>0){break ia}H[j+4>>2]=b+(h<<2)}d=1;if(!h){break fa}f=H[c+16>>2];e=H[c+20>>2];s=H[j>>2];i=H[c+8>>2];n=H[c+12>>2];b=0;while(1){d=0;if((e|0)>=(n|0)&f>>>0>=i>>>0|(e|0)>(n|0)){break fa}d=H[c>>2];p=I[d+f|0];f=f+1|0;e=f?e:e+1|0;H[c+16>>2]=f;H[c+20>>2]=e;a=p>>>2|0;l=0;ja:{ka:{la:{ma:{t=p&3;switch(t|0){case 0:break ka;case 3:break ma;default:break la}}a=a+b|0;d=0;if(a>>>0>=h>>>0){break fa}ra(s+(b<<2)|0,0,(p&252)+4|0);b=a;break ja}while(1){if((f|0)==(i|0)&(e|0)==(n|0)){break ga}h=I[d+f|0];f=f+1|0;e=f?e:e+1|0;H[c+16>>2]=f;H[c+20>>2]=e;a=h<<(l<<3|6)|a;l=l+1|0;if((t|0)!=(l|0)){continue}break}}H[s+(b<<2)>>2]=a}b=b+1|0;h=H[j+12>>2];if(b>>>0<h>>>0){continue}break}a=j+16|0;n=H[j>>2];d=H[j+16>>2];b=H[j+20>>2]-d|0;na:{if(b>>>0<=1048575){ya(a,262144-(b>>>2|0)|0);break na}if((b|0)==1048576){break na}H[j+20>>2]=d- -1048576}d=j+28|0;b=H[d>>2];f=H[j+32>>2]-b>>3;oa:{if(f>>>0<h>>>0){ob(d,h-f|0);b=H[d>>2];break oa}if(f>>>0>h>>>0){H[j+32>>2]=(h<<3)+b}if(!h){break ga}}i=H[a>>2];f=0;d=0;while(1){e=n+(f<<2)|0;j=H[e>>2];l=(f<<3)+b|0;a=d;H[l+4>>2]=a;H[l>>2]=j;e=H[e>>2];d=e+a|0;if(d>>>0>262144){break ga}pa:{if(a>>>0>=d>>>0){break pa}l=0;j=e&7;if(j){while(1){H[i+(a<<2)>>2]=f;a=a+1|0;l=l+1|0;if((j|0)!=(l|0)){continue}break}}if(e-1>>>0<=6){break pa}while(1){e=i+(a<<2)|0;H[e>>2]=f;H[e+28>>2]=f;H[e+24>>2]=f;H[e+20>>2]=f;H[e+16>>2]=f;H[e+12>>2]=f;H[e+8>>2]=f;H[e+4>>2]=f;a=a+8|0;if((d|0)!=(a|0)){continue}break}}f=f+1|0;if((h|0)!=(f|0)){continue}break}k=(d|0)==262144}d=k}qa:{if(!d|(H[g+20>>2]?0:m)){break qa}d=0;j=ca-16|0;ca=j;ra:{sa:{if(J[c+38>>1]<=511){b=H[c+8>>2];a=H[c+12>>2];h=a;i=H[c+20>>2];k=H[c+16>>2];f=k+8|0;i=f>>>0<8?i+1|0:i;e=i;if(b>>>0<f>>>0&(e|0)>=(a|0)|(a|0)<(e|0)){break ra}k=k+H[c>>2]|0;a=I[k|0]|I[k+1|0]<<8|(I[k+2|0]<<16|I[k+3|0]<<24);k=I[k+4|0]|I[k+5|0]<<8|(I[k+6|0]<<16|I[k+7|0]<<24);H[c+16>>2]=f;H[c+20>>2]=e;break sa}if(!gb(1,j+8|0,c)){break ra}f=H[c+16>>2];e=H[c+20>>2];b=H[c+8>>2];h=H[c+12>>2];a=H[j+8>>2];k=H[j+12>>2]}i=b-f|0;b=h-((b>>>0<f>>>0)+e|0)|0;if((b|0)==(k|0)&a>>>0>i>>>0|b>>>0<k>>>0){break ra}e=e+k|0;b=a+f|0;e=b>>>0<a>>>0?e+1|0:e;H[c+16>>2]=b;H[c+20>>2]=e;if((a|0)<=0){break ra}b=H[c>>2]+f|0;H[g+48>>2]=b;c=a-1|0;f=c+b|0;e=I[f|0];ta:{if(e>>>0<=63){H[g+52>>2]=c;a=I[f|0]&63;break ta}ua:{switch((e>>>6|0)-1|0){case 0:if(a>>>0<2){break ra}a=a-2|0;H[g+52>>2]=a;a=a+b|0;a=I[a+1|0]<<8&16128|I[a|0];break ta;case 1:if(a>>>0<3){break ra}a=a-3|0;H[g+52>>2]=a;a=a+b|0;a=I[a+1|0]<<8|I[a+2|0]<<16&4128768|I[a|0];break ta;default:break ua}}a=a-4|0;H[g+52>>2]=a;a=a+b|0;a=(I[a|0]|I[a+1|0]<<8|(I[a+2|0]<<16|I[a+3|0]<<24))&1073741823}H[g+56>>2]=a- -1048576;d=a>>>0<267386880}ca=j+16|0;if(!d){break qa}if(!m){o=1;break qa}b=H[g+52>>2];a=H[g+56>>2];c=H[g+36>>2];d=H[g+48>>2];f=H[g+24>>2];while(1){va:{if(a>>>0>1048575){break va}while(1){if((b|0)<=0){break va}b=b-1|0;H[g+52>>2]=b;a=I[b+d|0]|a<<8;H[g+56>>2]=a;if(a>>>0<1048576){continue}break}}e=a&262143;o=H[f+(e<<2)>>2];k=c+(o<<3)|0;a=(N(H[k>>2],a>>>18|0)+e|0)-H[k+4>>2]|0;H[g+56>>2]=a;H[r+(q<<2)>>2]=o;o=1;q=q+1|0;if((m|0)!=(q|0)){continue}break}}a=H[g+36>>2];if(a){H[g+40>>2]=a;oa(a)}a=H[g+24>>2];if(a){H[g+28>>2]=a;oa(a)}a=H[g+8>>2];if(a){H[g+12>>2]=a;oa(a)}ca=g- -64|0;b=o;break g;case 12:m=a;r=d;g=ca+-64|0;ca=g;H[g+56>>2]=0;H[g+48>>2]=0;H[g+52>>2]=0;H[g+40>>2]=0;H[g+44>>2]=0;H[g+32>>2]=0;H[g+36>>2]=0;H[g+24>>2]=0;H[g+28>>2]=0;H[g+16>>2]=0;H[g+20>>2]=0;H[g+8>>2]=0;H[g+12>>2]=0;j=g+8|0;a=J[c+38>>1];wa:{xa:{if(!a){break xa}ya:{if(a>>>0<=511){d=H[c+8>>2];b=H[c+12>>2];i=H[c+20>>2];a=H[c+16>>2];f=a+4|0;i=f>>>0<4?i+1|0:i;if(d>>>0<f>>>0&(b|0)<=(i|0)|(b|0)<(i|0)){break xa}a=a+H[c>>2]|0;h=I[a|0]|I[a+1|0]<<8|(I[a+2|0]<<16|I[a+3|0]<<24);H[j+12>>2]=h;e=H[c+20>>2];f=H[c+16>>2]+4|0;e=f>>>0<4?e+1|0:e;H[c+16>>2]=f;H[c+20>>2]=e;break ya}if(!hb(1,j+12|0,c)){break xa}f=H[c+16>>2];e=H[c+20>>2];h=H[j+12>>2]}a=H[c+8>>2];d=a-f|0;a=H[c+12>>2]-((a>>>0<f>>>0)+e|0)|0;if(d>>>0<h>>>6>>>0&(a|0)<=0|(a|0)<0){break xa}b=H[j>>2];a=H[j+4>>2]-b>>2;za:{if(a>>>0<h>>>0){ya(j,h-a|0);h=H[j+12>>2];break za}if(a>>>0<=h>>>0){break za}H[j+4>>2]=b+(h<<2)}d=1;if(!h){break wa}f=H[c+16>>2];e=H[c+20>>2];s=H[j>>2];i=H[c+8>>2];n=H[c+12>>2];b=0;while(1){d=0;if((e|0)>=(n|0)&f>>>0>=i>>>0|(e|0)>(n|0)){break wa}d=H[c>>2];p=I[d+f|0];f=f+1|0;e=f?e:e+1|0;H[c+16>>2]=f;H[c+20>>2]=e;a=p>>>2|0;l=0;Aa:{Ba:{Ca:{Da:{t=p&3;switch(t|0){case 0:break Ba;case 3:break Da;default:break Ca}}a=a+b|0;d=0;if(a>>>0>=h>>>0){break wa}ra(s+(b<<2)|0,0,(p&252)+4|0);b=a;break Aa}while(1){if((f|0)==(i|0)&(e|0)==(n|0)){break xa}h=I[d+f|0];f=f+1|0;e=f?e:e+1|0;H[c+16>>2]=f;H[c+20>>2]=e;a=h<<(l<<3|6)|a;l=l+1|0;if((t|0)!=(l|0)){continue}break}}H[s+(b<<2)>>2]=a}b=b+1|0;h=H[j+12>>2];if(b>>>0<h>>>0){continue}break}a=j+16|0;n=H[j>>2];d=H[j+16>>2];b=H[j+20>>2]-d|0;Ea:{if(b>>>0<=2097151){ya(a,524288-(b>>>2|0)|0);break Ea}if((b|0)==2097152){break Ea}H[j+20>>2]=d+2097152}d=j+28|0;b=H[d>>2];f=H[j+32>>2]-b>>3;Fa:{if(f>>>0<h>>>0){ob(d,h-f|0);b=H[d>>2];break Fa}if(f>>>0>h>>>0){H[j+32>>2]=(h<<3)+b}if(!h){break xa}}i=H[a>>2];f=0;d=0;while(1){e=n+(f<<2)|0;j=H[e>>2];l=(f<<3)+b|0;a=d;H[l+4>>2]=a;H[l>>2]=j;e=H[e>>2];d=e+a|0;if(d>>>0>524288){break xa}Ga:{if(a>>>0>=d>>>0){break Ga}l=0;j=e&7;if(j){while(1){H[i+(a<<2)>>2]=f;a=a+1|0;l=l+1|0;if((j|0)!=(l|0)){continue}break}}if(e-1>>>0<=6){break Ga}while(1){e=i+(a<<2)|0;H[e>>2]=f;H[e+28>>2]=f;H[e+24>>2]=f;H[e+20>>2]=f;H[e+16>>2]=f;H[e+12>>2]=f;H[e+8>>2]=f;H[e+4>>2]=f;a=a+8|0;if((d|0)!=(a|0)){continue}break}}f=f+1|0;if((h|0)!=(f|0)){continue}break}k=(d|0)==524288}d=k}Ha:{if(!d|(H[g+20>>2]?0:m)){break Ha}d=0;i=ca-16|0;ca=i;Ia:{Ja:{if(J[c+38>>1]<=511){b=H[c+8>>2];a=H[c+12>>2];h=a;e=H[c+20>>2];k=H[c+16>>2];f=k+8|0;e=f>>>0<8?e+1|0:e;if(b>>>0<f>>>0&(a|0)<=(e|0)|(a|0)<(e|0)){break Ia}k=k+H[c>>2]|0;a=I[k|0]|I[k+1|0]<<8|(I[k+2|0]<<16|I[k+3|0]<<24);k=I[k+4|0]|I[k+5|0]<<8|(I[k+6|0]<<16|I[k+7|0]<<24);H[c+16>>2]=f;H[c+20>>2]=e;break Ja}if(!gb(1,i+8|0,c)){break Ia}f=H[c+16>>2];e=H[c+20>>2];b=H[c+8>>2];h=H[c+12>>2];a=H[i+8>>2];k=H[i+12>>2]}j=b-f|0;b=h-((b>>>0<f>>>0)+e|0)|0;if((b|0)==(k|0)&a>>>0>j>>>0|b>>>0<k>>>0){break Ia}e=e+k|0;b=a+f|0;e=b>>>0<a>>>0?e+1|0:e;H[c+16>>2]=b;H[c+20>>2]=e;if((a|0)<=0){break Ia}b=H[c>>2]+f|0;H[g+48>>2]=b;c=a-1|0;f=c+b|0;e=I[f|0];Ka:{if(e>>>0<=63){H[g+52>>2]=c;a=I[f|0]&63;break Ka}La:{switch((e>>>6|0)-1|0){case 0:if(a>>>0<2){break Ia}a=a-2|0;H[g+52>>2]=a;a=a+b|0;a=I[a+1|0]<<8&16128|I[a|0];break Ka;case 1:if(a>>>0<3){break Ia}a=a-3|0;H[g+52>>2]=a;a=a+b|0;a=I[a+1|0]<<8|I[a+2|0]<<16&4128768|I[a|0];break Ka;default:break La}}a=a-4|0;H[g+52>>2]=a;a=a+b|0;a=(I[a|0]|I[a+1|0]<<8|(I[a+2|0]<<16|I[a+3|0]<<24))&1073741823}H[g+56>>2]=a+2097152;d=a>>>0<534773760}ca=i+16|0;if(!d){break Ha}if(!m){o=1;break Ha}b=H[g+52>>2];a=H[g+56>>2];c=H[g+36>>2];d=H[g+48>>2];f=H[g+24>>2];while(1){Ma:{if(a>>>0>2097151){break Ma}while(1){if((b|0)<=0){break Ma}b=b-1|0;H[g+52>>2]=b;a=I[b+d|0]|a<<8;H[g+56>>2]=a;if(a>>>0<2097152){continue}break}}e=a&524287;o=H[f+(e<<2)>>2];k=c+(o<<3)|0;a=(N(H[k>>2],a>>>19|0)+e|0)-H[k+4>>2]|0;H[g+56>>2]=a;H[r+(q<<2)>>2]=o;o=1;q=q+1|0;if((m|0)!=(q|0)){continue}break}}a=H[g+36>>2];if(a){H[g+40>>2]=a;oa(a)}a=H[g+24>>2];if(a){H[g+28>>2]=a;oa(a)}a=H[g+8>>2];if(a){H[g+12>>2]=a;oa(a)}ca=g- -64|0;b=o;break g;case 17:b=Le(a,c,d);break g;case 0:case 1:case 2:case 3:case 4:case 5:case 6:case 7:b=ca+-64|0;ca=b;H[b+56>>2]=0;H[b+48>>2]=0;H[b+52>>2]=0;H[b+40>>2]=0;H[b+44>>2]=0;H[b+32>>2]=0;H[b+36>>2]=0;H[b+24>>2]=0;H[b+28>>2]=0;H[b+16>>2]=0;H[b+20>>2]=0;H[b+8>>2]=0;H[b+12>>2]=0;Na:{if(!Ne(b+8|0,c)|(H[b+20>>2]?0:a)){break Na}if(!Me(b+8|0,c)){break Na}if(!a){f=1;break Na}e=H[b+52>>2];c=H[b+56>>2];k=H[b+36>>2];i=H[b+48>>2];g=H[b+24>>2];while(1){Oa:{if(c>>>0>16383){break Oa}while(1){if((e|0)<=0){break Oa}e=e-1|0;H[b+52>>2]=e;c=I[e+i|0]|c<<8;H[b+56>>2]=c;if(c>>>0<16384){continue}break}}f=c&4095;m=H[g+(f<<2)>>2];r=k+(m<<3)|0;c=(N(H[r>>2],c>>>12|0)+f|0)-H[r+4>>2]|0;H[b+56>>2]=c;H[(o<<2)+d>>2]=m;f=1;o=o+1|0;if((o|0)!=(a|0)){continue}break}}a=H[b+36>>2];if(a){H[b+40>>2]=a;oa(a)}a=H[b+24>>2];if(a){H[b+28>>2]=a;oa(a)}a=H[b+8>>2];if(a){H[b+12>>2]=a;oa(a)}ca=b- -64|0;b=f;break g;case 13:case 14:case 15:case 16:break h;default:break g}}b=Le(a,c,d)}f=b}return f}function gi(a){a=a|0;var b=0,c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,L=0,M=0,O=0,P=0,Q=0,R=0;s=ca+-64|0;ca=s;H[a+132>>2]=0;if(H[a+148>>2]){c=H[a+144>>2];if(c){while(1){d=H[c>>2];oa(c);c=d;if(c){continue}break}}c=0;H[a+144>>2]=0;d=H[a+140>>2];a:{if(!d){break a}if(d>>>0>=4){g=d&-4;while(1){e=c<<2;H[e+H[a+136>>2]>>2]=0;H[H[a+136>>2]+(e|4)>>2]=0;H[H[a+136>>2]+(e|8)>>2]=0;H[H[a+136>>2]+(e|12)>>2]=0;c=c+4|0;b=b+4|0;if((g|0)!=(b|0)){continue}break}}b=d&3;if(!b){break a}while(1){H[H[a+136>>2]+(c<<2)>>2]=0;c=c+1|0;u=u+1|0;if((b|0)!=(u|0)){continue}break}}H[a+148>>2]=0}b:{c:{d:{c=H[a+4>>2];u=I[c+36|0];b=u<<8|I[c+37|0];if(b>>>0<=513){i=H[c+32>>2];e:{if(b>>>0<=511){b=H[i+20>>2];e=H[i+16>>2];d=e+4|0;b=d>>>0<4?b+1|0:b;g=b;h=H[i+12>>2];if(K[i+8>>2]<d>>>0&(b|0)>=(h|0)|(b|0)>(h|0)){break d}b=e+H[i>>2]|0;b=I[b|0]|I[b+1|0]<<8|(I[b+2|0]<<16|I[b+3|0]<<24);H[i+16>>2]=d;H[i+20>>2]=g;break e}if(!Ea(1,s,i)){break d}c=H[a+4>>2];u=I[c+36|0];b=H[s>>2]}H[a+132>>2]=b}g=H[c+32>>2];f:{g:{h:{if((u&255)>>>0<=1){u=0;d=H[g+20>>2];e=H[g+16>>2];b=e+4|0;d=b>>>0<4?d+1|0:d;i=H[g+12>>2];if(K[g+8>>2]<b>>>0&(i|0)<=(d|0)|(d|0)>(i|0)){break c}e=e+H[g>>2]|0;e=I[e|0]|I[e+1|0]<<8|(I[e+2|0]<<16|I[e+3|0]<<24);H[s+60>>2]=e;H[g+16>>2]=b;H[g+20>>2]=d;H[a+156>>2]=e;n=a+156|0;break h}u=0;if(!Ea(1,s+60|0,g)){break c}c=H[a+4>>2];b=I[c+36|0];H[a+156>>2]=H[s+60>>2];n=a+156|0;if(b>>>0>1){break g}}g=H[c+32>>2];h=H[g+8>>2];i=H[g+12>>2];c=H[g+20>>2];d=H[g+16>>2];b=d+4|0;c=b>>>0<4?c+1|0:c;e=b;if(b>>>0>h>>>0&(c|0)>=(i|0)|(c|0)>(i|0)){break c}b=d+H[g>>2]|0;b=I[b|0]|I[b+1|0]<<8|(I[b+2|0]<<16|I[b+3|0]<<24);H[s+56>>2]=b;H[g+16>>2]=e;H[g+20>>2]=c;break f}if(!Ea(1,s+56|0,H[c+32>>2])){break c}b=H[s+56>>2]}if(b>>>0>1431655765|K[n>>2]>N(b,3)>>>0){break c}f=H[a+4>>2];g=H[f+32>>2];c=g;e=H[c+8>>2];i=H[c+16>>2];j=H[c+12>>2];d=H[c+20>>2];c=d;if((j|0)<=(c|0)&e>>>0<=i>>>0|(c|0)>(j|0)){break c}n=H[g>>2];o=I[n+i|0];h=i+1|0;c=h?c:c+1|0;H[g+16>>2]=h;H[g+20>>2]=c;i:{if(I[f+36|0]<=1){f=e;c=j;e=i+5|0;d=e>>>0<5?d+1|0:d;if((c|0)<=(d|0)&e>>>0>f>>>0|(c|0)<(d|0)){break c}c=h+n|0;n=I[c|0]|I[c+1|0]<<8|(I[c+2|0]<<16|I[c+3|0]<<24);H[s+52>>2]=n;H[g+16>>2]=e;H[g+20>>2]=d;break i}if(!Ea(1,s+52|0,g)){break c}n=H[s+52>>2]}if(b>>>0<n>>>0|((n>>>0)/3|0)+n>>>0<b>>>0){break c}c=H[a+4>>2];i=H[c+32>>2];j:{if(I[c+36|0]<=1){c=H[i+20>>2];e=H[i+16>>2];d=e+4|0;c=d>>>0<4?c+1|0:c;g=d;f=K[i+8>>2]<d>>>0;d=H[i+12>>2];if(f&(d|0)<=(c|0)|(c|0)>(d|0)){break c}d=e+H[i>>2]|0;d=I[d|0]|I[d+1|0]<<8|(I[d+2|0]<<16|I[d+3|0]<<24);H[s+48>>2]=d;H[i+16>>2]=g;H[i+20>>2]=c;break j}if(!Ea(1,s+48|0,i)){break c}d=H[s+48>>2]}if(d>>>0>n>>>0){break c}H[a+28>>2]=H[a+24>>2];e=$b(pa(88));c=H[a+8>>2];H[a+8>>2]=e;if(c){cb(c);if(!H[a+8>>2]){break c}}H[a+164>>2]=H[a+160>>2];Jb(a+160|0,b);H[a+176>>2]=H[a+172>>2];Jb(a+172|0,b);H[a- -64>>2]=0;H[a+92>>2]=-1;H[a+84>>2]=-1;H[a+88>>2]=-1;H[a+40>>2]=H[a+36>>2];H[a+52>>2]=H[a+48>>2];H[a+76>>2]=H[a+72>>2];B=a+216|0;ed(B);dd(B,o);if(!Lc(H[a+8>>2],b,H[a+156>>2]+d|0)){break c}c=H[a+156>>2];F[s|0]=1;Oa(a+120|0,c+d|0,s);c=H[a+4>>2];b=J[c+36>>1];b=(b<<8|b>>>8)&65535;k:{if(b>>>0<=513){i=H[c+32>>2];l:{if(b>>>0<=511){b=H[i+20>>2];e=H[i+16>>2];c=e+4|0;b=c>>>0<4?b+1|0:b;g=b;h=H[i+12>>2];if(K[i+8>>2]<c>>>0&(b|0)>=(h|0)|(b|0)>(h|0)){break c}b=e+H[i>>2]|0;b=I[b|0]|I[b+1|0]<<8|(I[b+2|0]<<16|I[b+3|0]<<24);H[i+16>>2]=c;H[i+20>>2]=g;break l}if(!Ea(1,s+44|0,i)){break c}b=H[s+44>>2]}if(!b){break c}c=H[H[a+4>>2]+32>>2];e=H[c+8>>2];g=H[c+16>>2];i=e-g|0;c=H[c+12>>2]-(H[c+20>>2]+(e>>>0<g>>>0)|0)|0;if((c|0)<=0&b>>>0>i>>>0|(c|0)<0){break c}c=Ha(s);e=H[H[a+4>>2]+32>>2];g=H[e+16>>2];i=(g+H[e>>2]|0)+b|0;g=H[e+8>>2]-g|0;G[c+38>>1]=J[e+38>>1];H[c>>2]=i;H[c+16>>2]=0;H[c+20>>2]=0;H[c+8>>2]=g-b;H[c+12>>2]=0;C=Ib(a,c);if((C|0)==-1){break c}M=C>>31;break k}C=-1;M=-1;if((Ib(a,H[c+32>>2])|0)==-1){break c}}e=a+232|0;Ee(e,a);H[a+372>>2]=o;H[a+384>>2]=H[a+156>>2]+d;O=Ha(s);g=O;b=0;j=ca-16|0;ca=j;m:{n:{c=H[e+144>>2];c=J[(ea[H[H[c>>2]+32>>2]](c)|0)+36>>1];if(((c<<8|c>>>8)&65535)>>>0<=513){c=H[e+4>>2];H[e+40>>2]=H[e>>2];H[e+44>>2]=c;c=H[e+36>>2];H[e+72>>2]=H[e+32>>2];H[e+76>>2]=c;d=H[e+28>>2];c=e- -64|0;H[c>>2]=H[e+24>>2];H[c+4>>2]=d;c=H[e+20>>2];H[e+56>>2]=H[e+16>>2];H[e+60>>2]=c;c=H[e+12>>2];H[e+48>>2]=H[e+8>>2];H[e+52>>2]=c;if(!Db(e+40|0,1,j+8|0)){break n}c=H[e+44>>2];H[e>>2]=H[e+40>>2];H[e+4>>2]=c;c=H[e+76>>2];H[e+32>>2]=H[e+72>>2];H[e+36>>2]=c;c=H[e+68>>2];H[e+24>>2]=H[e+64>>2];H[e+28>>2]=c;c=H[e+60>>2];h=c;d=H[e+56>>2];H[e+16>>2]=d;H[e+20>>2]=c;i=H[e+52>>2];f=i;c=H[e+48>>2];H[e+8>>2]=c;H[e+12>>2]=f;o=c-d|0;k=H[j+12>>2];c=f-((c>>>0<d>>>0)+h|0)|0;i=H[j+8>>2];if((k|0)==(c|0)&o>>>0<i>>>0|c>>>0<k>>>0){break n}c=h+k|0;f=d;d=d+i|0;c=f>>>0>d>>>0?c+1|0:c;H[e+16>>2]=d;H[e+20>>2]=c}o:{if(J[e+38>>1]<=513){c=H[e+4>>2];H[e+96>>2]=H[e>>2];H[e+100>>2]=c;c=H[e+36>>2];H[e+128>>2]=H[e+32>>2];H[e+132>>2]=c;c=H[e+28>>2];H[e+120>>2]=H[e+24>>2];H[e+124>>2]=c;c=H[e+20>>2];H[e+112>>2]=H[e+16>>2];H[e+116>>2]=c;c=H[e+12>>2];H[e+104>>2]=H[e+8>>2];H[e+108>>2]=c;if(!Db(e+96|0,1,j+8|0)){break n}c=H[e+100>>2];H[e>>2]=H[e+96>>2];H[e+4>>2]=c;c=H[e+132>>2];H[e+32>>2]=H[e+128>>2];H[e+36>>2]=c;c=H[e+124>>2];H[e+24>>2]=H[e+120>>2];H[e+28>>2]=c;d=H[e+116>>2];h=d;c=H[e+112>>2];H[e+16>>2]=c;H[e+20>>2]=d;i=H[e+108>>2];f=i;d=H[e+104>>2];H[e+8>>2]=d;H[e+12>>2]=f;o=d-c|0;k=H[j+12>>2];d=f-((c>>>0>d>>>0)+h|0)|0;i=H[j+8>>2];if((k|0)==(d|0)&o>>>0<i>>>0|d>>>0<k>>>0){break n}d=h+k|0;f=c;c=c+i|0;d=f>>>0>c>>>0?d+1|0:d;H[e+16>>2]=c;H[e+20>>2]=d;break o}if(!ta(e+80|0,e)){break m}}if(!Fe(e)){break m}c=H[e+4>>2];H[g>>2]=H[e>>2];H[g+4>>2]=c;c=H[e+36>>2];H[g+32>>2]=H[e+32>>2];H[g+36>>2]=c;c=H[e+28>>2];H[g+24>>2]=H[e+24>>2];H[g+28>>2]=c;c=H[e+20>>2];H[g+16>>2]=H[e+16>>2];H[g+20>>2]=c;c=H[e+12>>2];H[g+8>>2]=H[e+8>>2];H[g+12>>2]=c;c=H[e+144>>2];c=J[(ea[H[H[c>>2]+32>>2]](c)|0)+36>>1];p:{if(((c<<8|c>>>8)&65535)>>>0<=513){c=H[e+144>>2];q:{if(I[(ea[H[H[c>>2]+32>>2]](c)|0)+36|0]<=1){c=H[g+20>>2];i=H[g+16>>2];d=i+4|0;c=d>>>0<4?c+1|0:c;h=d;f=K[g+8>>2]<d>>>0;d=H[g+12>>2];if(f&(d|0)<=(c|0)|(c|0)>(d|0)){break m}d=i+H[g>>2]|0;d=I[d|0]|I[d+1|0]<<8|(I[d+2|0]<<16|I[d+3|0]<<24);H[g+16>>2]=h;H[g+20>>2]=c;break q}if(!Ea(1,j+8|0,g)){break m}d=H[j+8>>2]}c=H[e+152>>2];if(d>>>0>=c>>>0){break m}d=H[g+20>>2];h=H[g+12>>2];i=H[g+16>>2];if((d|0)>=(h|0)&i>>>0>=K[g+8>>2]|(d|0)>(h|0)){break m}h=I[i+H[g>>2]|0];i=i+1|0;d=i?d:d+1|0;H[g+16>>2]=i;H[g+20>>2]=d;if(h){break m}H[e+176>>2]=2;H[e+180>>2]=7;break p}H[e+176>>2]=2;H[e+180>>2]=7;c=H[e+152>>2]}if((c|0)<0){break m}H[j+8>>2]=0;b=2;h=H[e+156>>2];i=H[e+160>>2]-h>>2;r:{if(i>>>0<c>>>0){Pa(e+156|0,c-i|0,j+8|0);b=H[e+176>>2];d=H[e+180>>2];break r}d=7;if(c>>>0>=i>>>0){break r}H[e+160>>2]=h+(c<<2)}i=e+184|0;b=(d-b|0)+1|0;c=H[e+188>>2];h=H[e+184>>2];d=(c-h|0)/12|0;s:{if(b>>>0>d>>>0){o=0;d=b-d|0;f=H[i+8>>2];c=H[i+4>>2];t:{if(d>>>0<=(f-c|0)/12>>>0){if(d){b=c;c=N(d,12)-12|0;c=(c-((c>>>0)%12|0)|0)+12|0;c=ra(b,0,c)+c|0}H[i+4>>2]=c;break t}u:{v:{w:{h=H[i>>2];k=(c-h|0)/12|0;b=k+d|0;if(b>>>0<357913942){f=(f-h|0)/12|0;l=f<<1;f=f>>>0>=178956970?357913941:b>>>0<l>>>0?l:b;if(f){if(f>>>0>=357913942){break w}o=pa(N(f,12))}b=N(k,12)+o|0;d=N(d,12)-12|0;k=(d-((d>>>0)%12|0)|0)+12|0;d=ra(b,0,k);k=d+k|0;f=N(f,12)+o|0;if((c|0)==(h|0)){break v}while(1){b=b-12|0;c=c-12|0;H[b>>2]=H[c>>2];H[b+4>>2]=H[c+4>>2];H[b+8>>2]=H[c+8>>2];H[c+8>>2]=0;H[c>>2]=0;H[c+4>>2]=0;if((c|0)!=(h|0)){continue}break}H[i+8>>2]=f;d=H[i+4>>2];H[i+4>>2]=k;c=H[i>>2];H[i>>2]=b;if((c|0)==(d|0)){break u}while(1){b=d-12|0;h=H[b>>2];if(h){H[d-8>>2]=h;oa(h)}d=b;if((b|0)!=(c|0)){continue}break}break u}break b}wa();v()}H[i+8>>2]=f;H[i+4>>2]=k;H[i>>2]=d}if(c){oa(c)}}d=H[e+188>>2];break s}if(b>>>0>=d>>>0){d=c;break s}d=h+N(b,12)|0;if((d|0)!=(c|0)){while(1){b=c-12|0;h=H[b>>2];if(h){H[c-8>>2]=h;oa(h)}c=b;if((d|0)!=(b|0)){continue}break}}H[e+188>>2]=d}f=e+196|0;b=H[e+184>>2];c=(d-b|0)/12|0;o=H[e+196>>2];h=H[e+200>>2]-o>>2;x:{if(c>>>0>h>>>0){ya(f,c-h|0);b=H[e+184>>2];d=H[e+188>>2];break x}if(c>>>0>=h>>>0){break x}H[e+200>>2]=o+(c<<2)}if((b|0)==(d|0)){b=1;break m}c=0;while(1){if(!Ea(1,j+8|0,g)){break n}b=H[e+148>>2];d=(H[b+4>>2]-H[b>>2]>>2>>>0)/3|0;b=H[j+8>>2];if(d>>>0<b>>>0){break n}if(b){k=N(c,12);h=k+H[i>>2]|0;d=H[h>>2];o=H[h+4>>2]-d>>2;y:{if(o>>>0<b>>>0){ya(h,b-o|0);d=H[k+H[i>>2]>>2];break y}if(b>>>0>=o>>>0){break y}H[h+4>>2]=(b<<2)+d}kd(b,1,g,d);H[H[f>>2]+(c<<2)>>2]=b}b=1;c=c+1|0;if(c>>>0<(H[e+188>>2]-H[e+184>>2]|0)/12>>>0){continue}break}break m}b=0}ca=j+16|0;z:{if(!b){break z}d=0;c=0;g=0;i=0;o=0;l=ca-96|0;ca=l;H[l+72>>2]=0;H[l+64>>2]=0;H[l+68>>2]=0;H[l+48>>2]=0;H[l+52>>2]=0;H[l+40>>2]=0;H[l+44>>2]=0;H[l+56>>2]=1065353216;H[l+32>>2]=0;H[l+24>>2]=0;H[l+28>>2]=0;j=a;L=H[a+124>>2];A:{B:{C:{D:{E:{if((n|0)<=0){break E}r=j+232|0;P=H[j+216>>2]!=H[j+220>>2];D=1;while(1){h=i;i=h+1|0;a=H[r+172>>2];F:{G:{if((a|0)!=-1){b=H[r+196>>2]+(a<<2)|0;f=H[b>>2];a=f-1|0;H[b>>2]=a;b=9;if((f|0)<=0){break F}a=H[H[H[r+184>>2]+N(H[r+172>>2],12)>>2]+(a<<2)>>2];if(a>>>0>4){break F}b=H[(a<<2)+12144>>2];break G}b=7;a=H[r+144>>2];a=J[(ea[H[H[a>>2]+32>>2]](a)|0)+36>>1];if(((a<<8|a>>>8)&65535)>>>0>513|!I[r+76|0]){break G}b=0;m=H[r- -64>>2];k=H[r+72>>2];a=m+(k>>>3|0)|0;p=H[r+68>>2];if(a>>>0>=p>>>0){break G}f=I[a|0];a=k+1|0;H[r+72>>2]=a;f=f>>>(k&7)&1;if(!f){break G}q=a>>>3|0;b=m+q|0;H:{if(b>>>0>=p>>>0){b=a;a=0;break H}t=I[b|0];b=k+2|0;H[r+72>>2]=b;q=b>>>3|0;a=t>>>(a&7)&1}k=m+q|0;if(k>>>0<p>>>0){k=I[k|0];H[r+72>>2]=b+1;b=k>>>(b&7)<<1&2}else{b=0}b=(a|b)<<1|f}H[r+168>>2]=b}a=b;I:{J:{if(!a){if((c|0)==(g|0)){b=-1;break D}d=-1;m=H[j+8>>2];t=H[m+24>>2];D=c-4|0;f=H[D>>2];a=-1;K:{if((f|0)==-1){break K}k=f+1|0;k=(k>>>0)%3|0?k:f-2|0;a=-1;if((k|0)==-1){break K}a=H[H[m>>2]+(k<<2)>>2]}b=H[t+(a<<2)>>2];if((b|0)!=-1){d=b+1|0;d=(d>>>0)%3|0?d:b-2|0}if((d|0)==(f|0)){b=-1;break D}if((f|0)!=-1){b=-1;if(H[H[m+12>>2]+(f<<2)>>2]!=-1){break D}}k=H[m+12>>2];if((d|0)!=-1){b=-1;if(H[k+(d<<2)>>2]!=-1){break D}}p=N(h,3);b=p+1|0;H[k+(f<<2)>>2]=b;w=b<<2;H[w+k>>2]=f;q=p+2|0;H[k+(d<<2)>>2]=q;y=q<<2;H[y+k>>2]=d;k=-1;h=-1;L:{if((f|0)==-1){break L}M:{if((f>>>0)%3|0){b=f-1|0;break M}b=f+2|0;h=-1;if((b|0)==-1){break L}}h=H[H[m>>2]+(b<<2)>>2]}N:{if((d|0)==-1){break N}b=d+1|0;b=(b>>>0)%3|0?b:d-2|0;if((b|0)==-1){break N}k=H[H[m>>2]+(b<<2)>>2]}b=-1;if((a|0)==(h|0)|(a|0)==(k|0)){break D}b=H[m>>2];H[b+(p<<2)>>2]=a;H[b+w>>2]=k;H[b+y>>2]=h;if((h|0)!=-1){H[t+(h<<2)>>2]=q}b=H[j+120>>2]+(a>>>3&536870908)|0;d=H[b>>2];Q=b,R=Vj(a)&d,H[Q>>2]=R;H[D>>2]=p;k=H[c-4>>2];break J}b=-1;O:{P:{Q:{R:{S:{T:{U:{V:{W:{switch(a-1|0){case 2:case 4:if((c|0)==(g|0)){break D}t=c-4|0;d=H[t>>2];f=H[j+8>>2];m=H[f+12>>2];if((d|0)!=-1&H[m+(d<<2)>>2]!=-1){break D}k=N(h,3);p=(a|0)==5;q=k+(p?2:1)|0;w=q<<2;H[w+m>>2]=d;H[m+(d<<2)>>2]=q;Ka(f+24|0,11424);a=H[j+8>>2];m=H[a+24>>2];if(H[a+28>>2]-m>>2>(L|0)){break D}a=H[a>>2];y=a+w|0;b=H[f+28>>2];f=H[f+24>>2];w=(b-f>>2)-1|0;H[y>>2]=w;if((b|0)!=(f|0)){H[m+(w<<2)>>2]=q}b=p?k:k+2|0;q=a+(k+p<<2)|0;X:{if((d|0)==-1){H[a+(b<<2)>>2]=-1;b=-1;break X}Y:{Z:{_:{if((d>>>0)%3|0){f=d-1|0;break _}f=d+2|0;if((f|0)==-1){break Z}}f=H[a+(f<<2)>>2];H[a+(b<<2)>>2]=f;if((f|0)==-1){break Y}H[m+(f<<2)>>2]=b;break Y}H[a+(b<<2)>>2]=-1}f=d+1|0;d=(f>>>0)%3|0?f:d-2|0;b=-1;if((d|0)==-1){break X}b=H[a+(d<<2)>>2]}H[q>>2]=b;H[t>>2]=k;break V;case 0:if((c|0)==(d|0)){break D}a=c-4|0;m=H[a>>2];H[l+68>>2]=a;p=H[l+44>>2];$:{if(!p){c=a;break $}f=H[l+40>>2];q=Uj(p)>>>0>1;b=h&p+2147483647;aa:{if(!q){break aa}b=h;if(b>>>0<p>>>0){break aa}b=(h>>>0)%(p>>>0)|0}k=b;b=H[f+(k<<2)>>2];if(!b){c=a;break $}b=H[b>>2];if(!b){c=a;break $}ba:{if(!q){f=p-1|0;while(1){p=H[b+4>>2];ca:{if((p|0)!=(h|0)){if((k|0)==(f&p)){break ca}c=a;break $}if((h|0)==H[b+8>>2]){break ba}}b=H[b>>2];if(b){continue}break}c=a;break $}while(1){f=H[b+4>>2];da:{if((f|0)!=(h|0)){if(f>>>0>=p>>>0){f=(f>>>0)%(p>>>0)|0}if((f|0)==(k|0)){break da}c=a;break $}if((h|0)==H[b+8>>2]){break ba}}b=H[b>>2];if(b){continue}break}c=a;break $}if((a|0)!=(x|0)){H[a>>2]=H[b+12>>2];H[l+68>>2]=c;break $}a=x-d|0;g=a>>2;c=g+1|0;if(c>>>0>=1073741824){break b}f=a>>>1|0;f=a>>>0>=2147483644?1073741823:c>>>0<f>>>0?f:c;if(f){if(f>>>0>=1073741824){break B}a=pa(f<<2)}else{a=0}g=a+(g<<2)|0;H[g>>2]=H[b+12>>2];c=g+4|0;if((d|0)!=(x|0)){while(1){g=g-4|0;x=x-4|0;H[g>>2]=H[x>>2];if((d|0)!=(x|0)){continue}break}}x=a+(f<<2)|0;H[l+72>>2]=x;H[l+68>>2]=c;H[l+64>>2]=g;if(d){oa(d)}}if((c|0)==(g|0)){break P}w=c-4|0;a=H[w>>2];if((a|0)==(m|0)){break P}b=(a|0)==-1;p=H[j+8>>2];if(!b&H[H[p+12>>2]+(a<<2)>>2]!=-1){break P}q=H[p+12>>2];if((m|0)!=-1&H[q+(m<<2)>>2]!=-1){break P}k=N(h,3);t=k+2|0;H[q+(a<<2)>>2]=t;h=t<<2;H[h+q>>2]=a;d=k+1|0;H[q+(m<<2)>>2]=d;y=d<<2;H[y+q>>2]=m;if(b){break T}if((a>>>0)%3|0){f=a-1|0;break S}f=a+2|0;if((f|0)!=-1){break S}d=H[p>>2];f=-1;break R;case 6:break W;default:break D}}k=H[j+8>>2];Ka(k+24|0,11424);f=H[j+8>>2];a=N(h,3);m=H[k+28>>2];p=H[k+24>>2];q=m-p|0;k=q>>2;t=k-1|0;H[H[f>>2]+(a<<2)>>2]=t;Ka(f+24|0,11424);w=a+1|0;H[H[f>>2]+(w<<2)>>2]=(H[f+28>>2]-H[f+24>>2]>>2)-1;f=H[j+8>>2];Ka(f+24|0,11424);y=a+2|0;H[H[f>>2]+(y<<2)>>2]=(H[f+28>>2]-H[f+24>>2]>>2)-1;E=H[j+8>>2];f=H[E+24>>2];if(H[E+28>>2]-f>>2>(L|0)){break D}ea:{fa:{if((m|0)!=(p|0)){H[f+(t<<2)>>2]=a;b=0;if((q|0)==-4){break fa}}H[f+(k<<2)>>2]=w;b=k+1|0;if((b|0)==-1){break ea}}H[f+(b<<2)>>2]=y}if((c|0)!=(x|0)){H[c>>2]=a;c=c+4|0;H[l+68>>2]=c;break U}b=c-d|0;k=b>>2;g=k+1|0;if(g>>>0>=1073741824){break b}f=b>>>1|0;b=b>>>0>=2147483644?1073741823:g>>>0<f>>>0?f:g;if(b){if(b>>>0>=1073741824){break B}f=pa(b<<2)}else{f=0}g=f+(k<<2)|0;H[g>>2]=a;x=f+(b<<2)|0;a=g+4|0;if((c|0)!=(d|0)){while(1){g=g-4|0;c=c-4|0;H[g>>2]=H[c>>2];if((c|0)!=(d|0)){continue}break}}H[l+72>>2]=x;H[l+68>>2]=a;H[l+64>>2]=g;if(d){oa(d)}c=a}d=g}Ce(r,H[c-4>>2]);a=H[j+40>>2];if((a|0)==H[j+36>>2]){break I}b=a-12|0;f=H[b+4>>2];h=(h^-1)+n|0;if(f>>>0>h>>>0){break P}if((f|0)!=(h|0)){break I}k=I[a-4|0];f=H[b>>2];H[j+40>>2]=b;if((f|0)<0){break P}m=c-4|0;a=H[m>>2];H[l+20>>2]=(f^-1)+n;b=l+20|0;H[l+88>>2]=b;Gb(l,l+40|0,b,l+88|0);f=H[l>>2];ga:{if(k&1){b=-1;if((a|0)==-1){break ga}b=a+1|0;b=(b>>>0)%3|0?b:a-2|0;break ga}b=-1;if((a|0)==-1){break ga}b=a-1|0;if((a>>>0)%3|0){break ga}b=a+2|0}H[f+12>>2]=b;b=H[j+40>>2];if((b|0)==H[j+36>>2]){break I}while(1){a=b-12|0;f=H[a+4>>2];if(f>>>0>h>>>0){break P}if((f|0)!=(h|0)){break I}f=I[b-4|0];b=H[a>>2];H[j+40>>2]=a;if((b|0)<0){break P}a=H[m>>2];H[l+20>>2]=(b^-1)+n;b=l+20|0;H[l+88>>2]=b;Gb(l,l+40|0,b,l+88|0);k=H[l>>2];ha:{if(f&1){b=-1;if((a|0)==-1){break ha}b=a+1|0;b=(b>>>0)%3|0?b:a-2|0;break ha}b=-1;if((a|0)==-1){break ha}b=a-1|0;if((a>>>0)%3|0){break ha}b=a+2|0}H[k+12>>2]=b;b=H[j+40>>2];if((b|0)!=H[j+36>>2]){continue}break}break I}f=-1;d=H[p>>2];H[d+(k<<2)>>2]=-1;b=-1;break Q}d=H[p>>2];f=H[d+(f<<2)>>2]}H[(k<<2)+d>>2]=f;E=a+1|0;a=(E>>>0)%3|0?E:a-2|0;b=-1;if((a|0)==-1){break Q}b=H[(a<<2)+d>>2]}H[d+y>>2]=b;ia:{if((m|0)==-1){H[d+h>>2]=-1;t=-1;a=-1;break ia}ja:{ka:{la:{if((m>>>0)%3|0){b=m-1|0;break la}b=m+2|0;if((b|0)==-1){break ka}}a=H[(b<<2)+d>>2];H[d+h>>2]=a;if((a|0)==-1){break ja}H[H[p+24>>2]+(a<<2)>>2]=t;break ja}H[d+h>>2]=-1}t=-1;b=m+1|0;b=(b>>>0)%3|0?b:m-2|0;a=-1;if((b|0)==-1){break ia}t=H[(b<<2)+d>>2];a=b}b=H[j+388>>2];h=f<<2;m=b+h|0;y=b;b=t<<2;H[m>>2]=H[m>>2]+H[y+b>>2];m=b;b=H[p+24>>2];m=m+b|0;if((f|0)!=-1){H[b+h>>2]=H[m>>2]}b=a;while(1){if((b|0)==-1){break O}H[(b<<2)+d>>2]=f;p=b+1|0;b=(p>>>0)%3|0?p:b-2|0;h=-1;ma:{if((b|0)==-1){break ma}b=H[q+(b<<2)>>2];h=-1;if((b|0)==-1){break ma}h=b+1|0;h=(h>>>0)%3|0?h:b-2|0}b=h;if((a|0)!=(b|0)){continue}break}}b=-1;if(!D){break E}break D}H[m>>2]=-1;na:{if(P){break na}if((z|0)!=(A|0)){H[A>>2]=t;A=A+4|0;H[l+28>>2]=A;break na}a=z-o|0;h=a>>2;b=h+1|0;if(b>>>0>=1073741824){break b}d=a>>>1|0;d=a>>>0>=2147483644?1073741823:b>>>0<d>>>0?d:b;if(d){if(d>>>0>=1073741824){break B}a=pa(d<<2)}else{a=0}b=a+(h<<2)|0;H[b>>2]=t;A=b+4|0;if((o|0)!=(z|0)){while(1){b=b-4|0;z=z-4|0;H[b>>2]=H[z>>2];if((o|0)!=(z|0)){continue}break}}z=a+(d<<2)|0;H[l+32>>2]=z;H[l+28>>2]=A;H[l+24>>2]=b;if(o){oa(o)}o=b}H[w>>2]=k}Ce(r,k);d=g}D=(i|0)<(n|0);if((i|0)!=(n|0)){continue}break}i=n}b=-1;d=H[j+8>>2];if(H[d+28>>2]-H[d+24>>2]>>2>(L|0)){break D}if((c|0)!=(g|0)){x=j+72|0;h=j+60|0;p=j+312|0;while(1){c=c-4|0;o=H[c>>2];H[l+68>>2]=c;oa:{pa:{qa:{if(J[j+270>>1]<=513){if(!I[j+364|0]){break pa}a=H[j+360>>2];b=H[j+352>>2]+(a>>>3|0)|0;if(b>>>0>=K[j+356>>2]){break qa}b=I[b|0];H[j+360>>2]=a+1;if(!(b>>>(a&7)&1)){break qa}break pa}if(Ba(p)){break pa}}b=H[j+64>>2];a=H[j+68>>2];if((b|0)==a<<5){if((b+1|0)<0){break b}if(b>>>0<=1073741822){a=a<<6;b=(b&-32)+32|0;a=a>>>0>b>>>0?a:b}else{a=2147483647}pb(h,a);b=H[j+64>>2]}H[j+64>>2]=b+1;a=H[j+60>>2]+(b>>>3&536870908)|0;d=H[a>>2];Q=a,R=Vj(b)&d,H[Q>>2]=R;b=H[j+76>>2];if((b|0)!=H[j+80>>2]){H[b>>2]=o;H[j+76>>2]=b+4;break oa}d=H[x>>2];a=b-d|0;k=a>>2;f=k+1|0;if(f>>>0<1073741824){n=a>>>1|0;n=a>>>0>=2147483644?1073741823:f>>>0<n>>>0?n:f;if(n){if(n>>>0>=1073741824){break B}a=pa(n<<2)}else{a=0}f=a+(k<<2)|0;H[f>>2]=o;o=f+4|0;if((b|0)!=(d|0)){while(1){f=f-4|0;b=b-4|0;H[f>>2]=H[b>>2];if((b|0)!=(d|0)){continue}break}}H[j+80>>2]=a+(n<<2);H[j+76>>2]=o;H[j+72>>2]=f;if(!d){break oa}oa(d);break oa}break b}m=H[j+8>>2];r=H[m>>2];if(((H[m+4>>2]-r>>2>>>0)/3|0)<=(i|0)){b=-1;break D}d=-1;q=H[m+24>>2];n=-1;ra:{if((o|0)==-1){break ra}g=o+1|0;g=(g>>>0)%3|0?g:o-2|0;n=-1;if((g|0)==-1){break ra}n=H[r+(g<<2)>>2]}a=H[q+(n<<2)>>2];sa:{if((a|0)==-1){k=1;f=-1;break sa}k=1;f=-1;b=a+1|0;a=(b>>>0)%3|0?b:a-2|0;if((a|0)==-1){break sa}k=0;d=a;b=a+1|0;b=(b>>>0)%3|0?b:a-2|0;if((b|0)!=-1){f=H[r+(b<<2)>>2]}}b=-1;g=-1;a=H[q+(f<<2)>>2];if((a|0)!=-1){g=a+1|0;g=(g>>>0)%3|0?g:a-2|0}if((d|0)==(o|0)|(g|0)==(o|0)|((o|0)!=-1&H[H[m+12>>2]+(o<<2)>>2]!=-1|(d|0)==(g|0))){break D}if(!k&H[H[m+12>>2]+(d<<2)>>2]!=-1){break D}k=-1;a=H[m+12>>2];m=-1;ta:{if((g|0)==-1){break ta}if(H[a+(g<<2)>>2]!=-1){break D}b=g+1|0;b=(b>>>0)%3|0?b:g-2|0;m=-1;if((b|0)==-1){break ta}m=H[r+(b<<2)>>2]}b=N(i,3);H[l>>2]=b;H[a+(b<<2)>>2]=o;H[a+(o<<2)>>2]=b;b=H[l>>2]+1|0;H[a+(b<<2)>>2]=d;H[a+(d<<2)>>2]=b;b=H[l>>2]+2|0;H[a+(b<<2)>>2]=g;H[a+(g<<2)>>2]=b;a=H[l>>2];H[r+(a<<2)>>2]=f;b=a+1|0;d=r+(b<<2)|0;H[d>>2]=m;g=a+2|0;o=r+(g<<2)|0;H[o>>2]=n;a=H[j+120>>2];f=b?f:-1;n=a+(f>>>3&536870908)|0;r=H[n>>2];Q=n,R=Vj(f)&r,H[Q>>2]=R;k=(b|0)!=-1?H[d>>2]:k;b=a+(k>>>3&536870908)|0;d=H[b>>2];Q=b,R=Vj(k)&d,H[Q>>2]=R;b=-1;b=(g|0)!=-1?H[o>>2]:b;a=a+(b>>>3&536870908)|0;d=H[a>>2];Q=a,R=Vj(b)&d,H[Q>>2]=R;F[l+88|0]=1;_c(h,l+88|0);Ka(x,l);i=i+1|0;g=H[l+64>>2]}if((c|0)!=(g|0)){continue}break}d=H[j+8>>2]}b=-1;if(((H[d+4>>2]-H[d>>2]>>2>>>0)/3|0)!=(i|0)){break D}b=H[d+28>>2]-H[d+24>>2]>>2;i=H[l+24>>2];f=H[l+28>>2];if((i|0)==(f|0)){break C}while(1){a=H[i>>2];h=H[d+24>>2];c=b-1|0;g=h+(c<<2)|0;if(H[g>>2]==-1){while(1){c=b-2|0;b=b-1|0;g=h+(c<<2)|0;if(H[g>>2]==-1){continue}break}}if(a>>>0<=c>>>0){H[l>>2]=d;g=H[g>>2];F[l+12|0]=1;H[l+8>>2]=g;H[l+4>>2]=g;if((g|0)!=-1){while(1){d=H[H[j+8>>2]>>2]+(g<<2)|0;if(H[d>>2]!=(c|0)){b=-1;break D}H[d>>2]=a;uc(l);g=H[l+8>>2];if((g|0)!=-1){continue}break}d=H[j+8>>2]}h=H[d+24>>2];g=h+(c<<2)|0;if((a|0)!=-1){H[h+(a<<2)>>2]=H[g>>2]}H[g>>2]=-1;g=1<<a;h=H[j+120>>2];a=h+(a>>>3&536870908)|0;h=h+(c>>>3&536870908)|0;c=1<<c;if(H[h>>2]&c){g=g|H[a>>2]}else{g=H[a>>2]&(g^-1)}H[a>>2]=g;H[h>>2]=H[h>>2]&(c^-1);b=b-1|0}i=i+4|0;if((f|0)!=(i|0)){continue}break}}i=H[l+24>>2]}if(i){oa(i)}a=H[l+48>>2];if(a){while(1){c=H[a>>2];oa(a);a=c;if(a){continue}break}}a=H[l+40>>2];H[l+40>>2]=0;if(a){oa(a)}a=H[l+64>>2];if(a){H[l+68>>2]=a;oa(a)}ca=l+96|0;break A}wa();v()}if((b|0)==-1){break z}a=O;c=H[a+16>>2];d=c+H[a>>2]|0;c=H[a+8>>2]-c|0;a=H[H[j+4>>2]+32>>2];G[a+38>>1]=J[a+38>>1];H[a>>2]=d;H[a+16>>2]=0;H[a+20>>2]=0;H[a+8>>2]=c;H[a+12>>2]=0;a=H[j+4>>2];c=J[a+36>>1];g=c<<8|c>>>8;if((g&65535)>>>0<=513){a=H[a+32>>2];c=H[a+16>>2];d=M+H[a+20>>2]|0;c=c+C|0;d=c>>>0<C>>>0?d+1|0:d;H[a+16>>2]=c;H[a+20>>2]=d}ua:{if(H[j+216>>2]==H[j+220>>2]){break ua}c=H[j+8>>2];a=H[c>>2];c=H[c+4>>2];va:{if((g&65535)>>>0>=513){if((a|0)==(c|0)){break ua}c=0;break va}if((a|0)==(c|0)){break ua}c=0;while(1){if(cd(j,c)){c=c+3|0;a=H[j+8>>2];if(c>>>0<H[a+4>>2]-H[a>>2]>>2>>>0){continue}break ua}break}break z}while(1){if(bd(j,c)){c=c+3|0;a=H[j+8>>2];if(c>>>0<H[a+4>>2]-H[a>>2]>>2>>>0){continue}break ua}break}break z}ad(e);c=H[j+216>>2];if((c|0)!=H[j+220>>2]){n=0;while(1){d=N(n,144);Jc((d+c|0)+4|0,H[j+8>>2]);a=H[B>>2];e=a+d|0;c=H[e+132>>2];e=H[e+136>>2];if((c|0)!=(e|0)){while(1){Hc((d+H[B>>2]|0)+4|0,H[c>>2]);c=c+4|0;if((e|0)!=(c|0)){continue}break}a=H[B>>2]}if(!Ic((a+d|0)+4|0)){break z}n=n+1|0;c=H[j+216>>2];if(n>>>0<(H[j+220>>2]-c|0)/144>>>0){continue}break}}a=H[j+8>>2];Hb(j+184|0,H[a+28>>2]-H[a+24>>2]>>2);u=H[j+216>>2];if((u|0)!=H[j+220>>2]){c=0;while(1){a=N(c,144)+u|0;d=H[a+60>>2]-H[a+56>>2]>>2;f=a+104|0;a=H[j+8>>2];a=H[a+28>>2]-H[a+24>>2]>>2;Hb(f,(a|0)<(d|0)?d:a);c=c+1|0;u=H[j+216>>2];if(c>>>0<(H[j+220>>2]-u|0)/144>>>0){continue}break}}u=$c(j,b)}break c}u=0}ca=s- -64|0;return u|0}sa();v()}function ii(a){a=a|0;var b=0,c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,L=0,M=0,O=0,P=0,Q=0,R=0,S=0;u=ca+-64|0;ca=u;H[a+132>>2]=0;if(H[a+148>>2]){c=H[a+144>>2];if(c){while(1){b=H[c>>2];oa(c);c=b;if(b){continue}break}}c=0;H[a+144>>2]=0;l=H[a+140>>2];a:{if(!l){break a}if(l>>>0>=4){b=l&-4;while(1){e=c<<2;H[e+H[a+136>>2]>>2]=0;H[H[a+136>>2]+(e|4)>>2]=0;H[H[a+136>>2]+(e|8)>>2]=0;H[H[a+136>>2]+(e|12)>>2]=0;c=c+4|0;f=f+4|0;if((b|0)!=(f|0)){continue}break}}b=l&3;if(!b){break a}while(1){H[H[a+136>>2]+(c<<2)>>2]=0;c=c+1|0;w=w+1|0;if((b|0)!=(w|0)){continue}break}}H[a+148>>2]=0}b:{c:{c=H[a+4>>2];w=I[c+36|0];b=w<<8|I[c+37|0];if(b>>>0<=513){g=H[c+32>>2];d:{if(b>>>0<=511){f=H[g+20>>2];l=H[g+16>>2];e=l+4|0;f=e>>>0<4?f+1|0:f;b=f;d=H[g+12>>2];if(K[g+8>>2]<e>>>0&(b|0)>=(d|0)|(b|0)>(d|0)){break c}f=l+H[g>>2]|0;f=I[f|0]|I[f+1|0]<<8|(I[f+2|0]<<16|I[f+3|0]<<24);H[g+16>>2]=e;H[g+20>>2]=b;break d}if(!Ea(1,u,g)){break c}c=H[a+4>>2];w=I[c+36|0];f=H[u>>2]}H[a+132>>2]=f}d=H[c+32>>2];e:{f:{g:{if((w&255)>>>0<=1){w=0;b=H[d+20>>2];e=H[d+16>>2];f=e+4|0;b=f>>>0<4?b+1|0:b;l=H[d+12>>2];if(K[d+8>>2]<f>>>0&(l|0)<=(b|0)|(b|0)>(l|0)){break b}e=e+H[d>>2]|0;e=I[e|0]|I[e+1|0]<<8|(I[e+2|0]<<16|I[e+3|0]<<24);H[u+60>>2]=e;H[d+16>>2]=f;H[d+20>>2]=b;H[a+156>>2]=e;t=a+156|0;break g}w=0;if(!Ea(1,u+60|0,d)){break b}c=H[a+4>>2];b=I[c+36|0];H[a+156>>2]=H[u+60>>2];t=a+156|0;if(b>>>0>1){break f}}d=H[c+32>>2];e=H[d+8>>2];l=H[d+12>>2];c=H[d+20>>2];f=H[d+16>>2];b=f+4|0;c=b>>>0<4?c+1|0:c;if(b>>>0>e>>>0&(c|0)>=(l|0)|(c|0)>(l|0)){break b}f=f+H[d>>2]|0;f=I[f|0]|I[f+1|0]<<8|(I[f+2|0]<<16|I[f+3|0]<<24);H[u+56>>2]=f;H[d+16>>2]=b;H[d+20>>2]=c;break e}if(!Ea(1,u+56|0,H[c+32>>2])){break b}f=H[u+56>>2]}if(f>>>0>1431655765|K[t>>2]>N(f,3)>>>0){break b}E=H[a+4>>2];x=H[E+32>>2];c=H[x+8>>2];d=H[x+12>>2];b=H[x+20>>2];h=H[x+16>>2];if((d|0)<=(b|0)&h>>>0>=c>>>0|(b|0)>(d|0)){break b}j=H[x>>2];k=I[j+h|0];e=x;l=h+1|0;g=l?b:b+1|0;H[e+16>>2]=l;H[e+20>>2]=g;h:{if(I[E+36|0]<=1){e=c;c=h+5|0;b=c>>>0<5?b+1|0:b;if(c>>>0>e>>>0&(b|0)>=(d|0)|(b|0)>(d|0)){break b}e=j+l|0;t=I[e|0]|I[e+1|0]<<8|(I[e+2|0]<<16|I[e+3|0]<<24);H[u+52>>2]=t;H[x+16>>2]=c;H[x+20>>2]=b;break h}if(!Ea(1,u+52|0,x)){break b}t=H[u+52>>2]}if(f>>>0<t>>>0|((t>>>0)/3|0)+t>>>0<f>>>0){break b}c=H[a+4>>2];d=H[c+32>>2];i:{if(I[c+36|0]<=1){c=H[d+20>>2];b=H[d+16>>2];e=b+4|0;c=e>>>0<4?c+1|0:c;l=H[d+12>>2];if(K[d+8>>2]<e>>>0&(l|0)<=(c|0)|(c|0)>(l|0)){break b}b=b+H[d>>2]|0;b=I[b|0]|I[b+1|0]<<8|(I[b+2|0]<<16|I[b+3|0]<<24);H[u+48>>2]=b;H[d+16>>2]=e;H[d+20>>2]=c;break i}if(!Ea(1,u+48|0,d)){break b}b=H[u+48>>2]}if(b>>>0>t>>>0){break b}H[a+28>>2]=H[a+24>>2];c=$b(pa(88));e=H[a+8>>2];H[a+8>>2]=c;if(e){cb(e);if(!H[a+8>>2]){break b}}H[a+164>>2]=H[a+160>>2];Jb(a+160|0,f);H[a+176>>2]=H[a+172>>2];Jb(a+172|0,f);H[a- -64>>2]=0;H[a+92>>2]=-1;H[a+84>>2]=-1;H[a+88>>2]=-1;H[a+40>>2]=H[a+36>>2];H[a+52>>2]=H[a+48>>2];H[a+76>>2]=H[a+72>>2];M=a+216|0;ed(M);dd(M,k);if(!Lc(H[a+8>>2],f,H[a+156>>2]+b|0)){break b}c=H[a+156>>2];F[u|0]=1;Oa(a+120|0,b+c|0,u);f=H[a+4>>2];c=J[f+36>>1];c=(c<<8|c>>>8)&65535;j:{if(c>>>0<=513){g=H[f+32>>2];k:{if(c>>>0<=511){f=H[g+20>>2];l=H[g+16>>2];e=l+4|0;f=e>>>0<4?f+1|0:f;c=f;d=H[g+12>>2];if(K[g+8>>2]<e>>>0&(c|0)>=(d|0)|(c|0)>(d|0)){break b}f=l+H[g>>2]|0;f=I[f|0]|I[f+1|0]<<8|(I[f+2|0]<<16|I[f+3|0]<<24);H[g+16>>2]=e;H[g+20>>2]=c;break k}if(!Ea(1,u+44|0,g)){break b}f=H[u+44>>2]}if(!f){break b}d=H[H[a+4>>2]+32>>2];l=H[d+8>>2];c=H[d+16>>2];e=l-c|0;c=H[d+12>>2]-(H[d+20>>2]+(c>>>0>l>>>0)|0)|0;if((c|0)<=0&f>>>0>e>>>0|(c|0)<0){break b}g=Ha(u);d=H[H[a+4>>2]+32>>2];l=H[d+16>>2];e=(l+H[d>>2]|0)+f|0;c=H[d+8>>2]-l|0;G[g+38>>1]=J[d+38>>1];H[g>>2]=e;H[g+16>>2]=0;H[g+20>>2]=0;H[g+8>>2]=c-f;H[g+12>>2]=0;c=Ib(a,g);if((c|0)==-1){break b}E=c;P=c>>31;break j}E=-1;P=-1;if((Ib(a,H[f+32>>2])|0)==-1){break b}}B=a+232|0;Ee(B,a);H[a+372>>2]=k;H[a+384>>2]=H[a+156>>2]+b;x=Ha(u);g=x;d=0;l=ca-16|0;ca=l;l:{if(!Ge(B,g)){break l}b=H[g+20>>2];f=H[g+16>>2];c=f+4|0;b=c>>>0<4?b+1|0:b;e=H[g+12>>2];if(K[g+8>>2]<c>>>0&(e|0)<=(b|0)|(b|0)>(e|0)){break l}f=f+H[g>>2]|0;f=I[f|0]|I[f+1|0]<<8|(I[f+2|0]<<16|I[f+3|0]<<24);H[g+16>>2]=c;H[g+20>>2]=b;if((f|0)<0){break l}b=f;f=H[B+152>>2];if((b|0)>=(f|0)){break l}H[l+12>>2]=0;c=H[B+156>>2];b=H[B+160>>2]-c>>2;m:{if(b>>>0<f>>>0){Pa(B+156|0,f-b|0,l+12|0);break m}if(b>>>0<=f>>>0){break m}H[B+160>>2]=c+(f<<2)}d=ta(B+168|0,g)}ca=l+16|0;n:{if(!d){break n}d=0;c=0;f=0;l=0;i=ca-96|0;ca=i;H[i+72>>2]=0;H[i+64>>2]=0;H[i+68>>2]=0;H[i+48>>2]=0;H[i+52>>2]=0;H[i+40>>2]=0;H[i+44>>2]=0;H[i+56>>2]=1065353216;H[i+32>>2]=0;H[i+24>>2]=0;H[i+28>>2]=0;g=a;O=H[a+124>>2];o:{p:{q:{r:{s:{t:{if((t|0)<=0){break t}z=g+400|0;Q=g+232|0;C=H[g+216>>2]!=H[g+220>>2];y=1;while(1){e=l;l=e+1|0;u:{v:{w:{x:{y:{if(H[g+420>>2]!=-1){if(Ba(z)){break y}}if(!I[g+308|0]){break x}z:{o=H[g+296>>2];r=H[g+304>>2];a=o+(r>>>3|0)|0;k=H[g+300>>2];if(a>>>0>=k>>>0){break z}b=I[a|0];a=r+1|0;H[g+304>>2]=a;h=b>>>(r&7)&1;if(!h){break z}n=a>>>3|0;b=o+n|0;A:{if(b>>>0>=k>>>0){b=a;a=0;break A}j=I[b|0];b=r+2|0;H[g+304>>2]=b;n=b>>>3|0;a=j>>>(a&7)&1}j=n+o|0;if(j>>>0<k>>>0){j=I[j|0];H[g+304>>2]=b+1;b=j>>>(b&7)<<1&2}else{b=0}p=(a|b)<<1|h;H[g+416>>2]=p;break w}H[g+416>>2]=0;break x}p=H[g+420>>2];H[g+416>>2]=p;if(p){break w}}if((c|0)==(f|0)){b=-1;break s}p=-1;n=H[g+8>>2];o=H[n+24>>2];j=c-4|0;m=H[j>>2];d=-1;B:{if((m|0)==-1){break B}b=m+1|0;b=(b>>>0)%3|0?b:m-2|0;d=-1;if((b|0)==-1){break B}d=H[H[n>>2]+(b<<2)>>2]}b=H[o+(d<<2)>>2];if((b|0)!=-1){a=b+1|0;p=(a>>>0)%3|0?a:b-2|0}if((m|0)==(p|0)){b=-1;break s}if((m|0)!=-1){b=-1;if(H[H[n+12>>2]+(m<<2)>>2]!=-1){break s}}k=H[n+12>>2];if((p|0)!=-1){b=-1;if(H[k+(p<<2)>>2]!=-1){break s}}q=N(e,3);a=q+1|0;H[k+(m<<2)>>2]=a;h=a<<2;H[h+k>>2]=m;r=q+2|0;H[k+(p<<2)>>2]=r;e=r<<2;H[e+k>>2]=p;k=-1;a=-1;C:{if((m|0)==-1){break C}D:{if((m>>>0)%3|0){b=m-1|0;break D}b=m+2|0;a=-1;if((b|0)==-1){break C}}a=H[H[n>>2]+(b<<2)>>2]}E:{if((p|0)==-1){break E}b=p+1|0;b=(b>>>0)%3|0?b:p-2|0;if((b|0)==-1){break E}k=H[H[n>>2]+(b<<2)>>2]}b=-1;if((a|0)==(d|0)|(d|0)==(k|0)){break s}b=H[n>>2];H[b+(q<<2)>>2]=d;H[b+h>>2]=k;H[b+e>>2]=a;if((a|0)!=-1){H[o+(a<<2)>>2]=r}b=H[g+120>>2]+(d>>>3&536870908)|0;a=H[b>>2];R=b,S=Vj(d)&a,H[R>>2]=S;H[j>>2]=q;p=H[c-4>>2];break v}b=-1;F:{G:{H:{I:{J:{K:{L:{M:{N:{O:{P:{switch(p-1|0){case 2:case 4:if((c|0)==(f|0)){break s}h=c-4|0;m=H[h>>2];r=H[g+8>>2];d=H[r+12>>2];if((m|0)!=-1&H[d+(m<<2)>>2]!=-1){break s}q=N(e,3);k=(p|0)==5;j=q+(k?2:1)|0;a=j<<2;H[a+d>>2]=m;H[d+(m<<2)>>2]=j;Ka(r+24|0,11424);d=H[g+8>>2];o=H[d+24>>2];if(H[d+28>>2]-o>>2>(O|0)){break s}n=H[d>>2];p=n+a|0;d=H[r+28>>2];b=H[r+24>>2];a=(d-b>>2)-1|0;H[p>>2]=a;if((b|0)!=(d|0)){H[o+(a<<2)>>2]=j}d=k?q:q+2|0;j=n+(k+q<<2)|0;Q:{if((m|0)==-1){H[n+(d<<2)>>2]=-1;b=-1;break Q}R:{S:{T:{if((m>>>0)%3|0){a=m-1|0;break T}a=m+2|0;if((a|0)==-1){break S}}a=H[n+(a<<2)>>2];H[n+(d<<2)>>2]=a;if((a|0)==-1){break R}H[o+(a<<2)>>2]=d;break R}H[n+(d<<2)>>2]=-1}a=m+1|0;a=(a>>>0)%3|0?a:m-2|0;b=-1;if((a|0)==-1){break Q}b=H[n+(a<<2)>>2]}H[j>>2]=b;H[h>>2]=q;break O;case 0:if((c|0)==(d|0)){break s}a=c-4|0;m=H[a>>2];H[i+68>>2]=a;k=H[i+44>>2];U:{if(!k){c=a;break U}o=H[i+40>>2];h=Uj(k)>>>0>1;b=e&k+2147483647;V:{if(!h){break V}b=e;if(b>>>0<k>>>0){break V}b=(e>>>0)%(k>>>0)|0}j=b;b=H[o+(j<<2)>>2];if(!b){c=a;break U}b=H[b>>2];if(!b){c=a;break U}W:{if(!h){k=k-1|0;while(1){h=H[b+4>>2];X:{if((h|0)!=(e|0)){if((j|0)==(h&k)){break X}c=a;break U}if((e|0)==H[b+8>>2]){break W}}b=H[b>>2];if(b){continue}break}c=a;break U}while(1){h=H[b+4>>2];Y:{if((h|0)!=(e|0)){if(h>>>0>=k>>>0){h=(h>>>0)%(k>>>0)|0}if((h|0)==(j|0)){break Y}c=a;break U}if((e|0)==H[b+8>>2]){break W}}b=H[b>>2];if(b){continue}break}c=a;break U}if((a|0)!=(A|0)){H[a>>2]=H[b+12>>2];H[i+68>>2]=c;break U}h=A-d|0;c=h>>2;f=c+1|0;if(f>>>0>=1073741824){break M}a=h>>>1|0;h=h>>>0>=2147483644?1073741823:a>>>0>f>>>0?a:f;if(h){if(h>>>0>=1073741824){break p}a=pa(h<<2)}else{a=0}f=a+(c<<2)|0;H[f>>2]=H[b+12>>2];c=f+4|0;if((d|0)!=(A|0)){while(1){f=f-4|0;A=A-4|0;H[f>>2]=H[A>>2];if((d|0)!=(A|0)){continue}break}}A=a+(h<<2)|0;H[i+72>>2]=A;H[i+68>>2]=c;H[i+64>>2]=f;if(d){oa(d)}}if((c|0)==(f|0)){break G}j=c-4|0;n=H[j>>2];if((n|0)==(m|0)){break G}d=(n|0)==-1;q=H[g+8>>2];if(!d&H[H[q+12>>2]+(n<<2)>>2]!=-1){break G}r=H[q+12>>2];if((m|0)!=-1&H[r+(m<<2)>>2]!=-1){break G}p=N(e,3);e=p+2|0;H[r+(n<<2)>>2]=e;o=e<<2;H[o+r>>2]=n;a=p+1|0;H[r+(m<<2)>>2]=a;b=a<<2;H[b+r>>2]=m;if(d){break L}if((n>>>0)%3|0){k=n-1|0;break J}k=n+2|0;if((k|0)!=-1){break J}d=H[q>>2];a=-1;break I;case 6:break P;default:break s}}a=H[g+8>>2];Ka(a+24|0,11424);h=H[g+8>>2];p=N(e,3);q=H[a+28>>2];r=H[a+24>>2];o=q-r|0;n=o>>2;k=n-1|0;H[H[h>>2]+(p<<2)>>2]=k;Ka(h+24|0,11424);j=p+1|0;H[H[h>>2]+(j<<2)>>2]=(H[h+28>>2]-H[h+24>>2]>>2)-1;a=H[g+8>>2];Ka(a+24|0,11424);h=p+2|0;H[H[a>>2]+(h<<2)>>2]=(H[a+28>>2]-H[a+24>>2]>>2)-1;a=H[g+8>>2];m=H[a+24>>2];if(H[a+28>>2]-m>>2>(O|0)){break s}Z:{_:{if((q|0)!=(r|0)){H[m+(k<<2)>>2]=p;b=0;if((o|0)==-4){break _}}H[m+(n<<2)>>2]=j;b=n+1|0;if((b|0)==-1){break Z}}H[m+(b<<2)>>2]=h}if((c|0)!=(A|0)){H[c>>2]=p;c=c+4|0;H[i+68>>2]=c;break N}h=c-d|0;b=h>>2;f=b+1|0;if(f>>>0>=1073741824){break K}a=h>>>1|0;h=h>>>0>=2147483644?1073741823:a>>>0>f>>>0?a:f;if(h){if(h>>>0>=1073741824){break p}a=pa(h<<2)}else{a=0}f=a+(b<<2)|0;H[f>>2]=p;A=a+(h<<2)|0;a=f+4|0;if((c|0)!=(d|0)){while(1){f=f-4|0;c=c-4|0;H[f>>2]=H[c>>2];if((c|0)!=(d|0)){continue}break}}H[i+72>>2]=A;H[i+68>>2]=a;H[i+64>>2]=f;if(d){oa(d)}c=a}d=f}De(Q,H[c-4>>2]);h=H[g+40>>2];if((h|0)==H[g+36>>2]){break u}b=h-12|0;a=H[b+4>>2];k=(e^-1)+t|0;if(a>>>0>k>>>0){break G}if((a|0)!=(k|0)){break u}e=I[h-4|0];a=H[b>>2];H[g+40>>2]=b;if((a|0)<0){break G}h=c-4|0;j=H[h>>2];H[i+20>>2]=(a^-1)+t;a=i+20|0;H[i+88>>2]=a;Gb(i,i+40|0,a,i+88|0);b=H[i>>2];$:{if(e&1){a=-1;if((j|0)==-1){break $}a=j+1|0;a=(a>>>0)%3|0?a:j-2|0;break $}a=-1;if((j|0)==-1){break $}a=j-1|0;if((j>>>0)%3|0){break $}a=j+2|0}H[b+12>>2]=a;b=H[g+40>>2];if((b|0)==H[g+36>>2]){break u}while(1){j=b-12|0;a=H[j+4>>2];if(a>>>0>k>>>0){break G}if((a|0)!=(k|0)){break u}e=I[b-4|0];a=H[j>>2];H[g+40>>2]=j;if((a|0)<0){break G}j=H[h>>2];H[i+20>>2]=(a^-1)+t;a=i+20|0;H[i+88>>2]=a;Gb(i,i+40|0,a,i+88|0);b=H[i>>2];aa:{if(e&1){a=-1;if((j|0)==-1){break aa}a=j+1|0;a=(a>>>0)%3|0?a:j-2|0;break aa}a=-1;if((j|0)==-1){break aa}a=j-1|0;if((j>>>0)%3|0){break aa}a=j+2|0}H[b+12>>2]=a;b=H[g+40>>2];if((b|0)!=H[g+36>>2]){continue}break}break u}sa();v()}k=-1;d=H[q>>2];H[d+(p<<2)>>2]=-1;h=-1;break H}sa();v()}d=H[q>>2];a=H[d+(k<<2)>>2]}k=a;H[(p<<2)+d>>2]=a;a=n+1|0;a=(a>>>0)%3|0?a:n-2|0;h=-1;if((a|0)==-1){break H}h=H[(a<<2)+d>>2]}H[b+d>>2]=h;ba:{if((m|0)==-1){H[d+o>>2]=-1;n=-1;a=-1;break ba}ca:{da:{ea:{if((m>>>0)%3|0){b=m-1|0;break ea}b=m+2|0;if((b|0)==-1){break da}}a=H[(b<<2)+d>>2];H[d+o>>2]=a;if((a|0)==-1){break ca}H[H[q+24>>2]+(a<<2)>>2]=e;break ca}H[d+o>>2]=-1}n=-1;b=m+1|0;b=(b>>>0)%3|0?b:m-2|0;a=-1;if((b|0)==-1){break ba}n=H[(b<<2)+d>>2];a=b}h=H[g+388>>2];e=k<<2;b=h+e|0;o=b;m=H[b>>2];b=n<<2;H[o>>2]=m+H[b+h>>2];h=b;b=H[q+24>>2];o=h+b|0;if((k|0)!=-1){H[b+e>>2]=H[o>>2]}b=a;while(1){if((b|0)==-1){break F}H[(b<<2)+d>>2]=k;h=b+1|0;b=(h>>>0)%3|0?h:b-2|0;e=-1;fa:{if((b|0)==-1){break fa}h=H[r+(b<<2)>>2];e=-1;if((h|0)==-1){break fa}b=h+1|0;e=(b>>>0)%3|0?b:h-2|0}b=e;if((a|0)!=(b|0)){continue}break}}b=-1;if(!(y&1)){break t}break s}H[o>>2]=-1;ga:{if(C){break ga}if((D|0)!=(L|0)){H[L>>2]=n;L=L+4|0;H[i+28>>2]=L;break ga}d=D-s|0;b=d>>2;e=b+1|0;if(e>>>0>=1073741824){break q}a=d>>>1|0;e=d>>>0>=2147483644?1073741823:a>>>0>e>>>0?a:e;if(e){if(e>>>0>=1073741824){break p}a=pa(e<<2)}else{a=0}b=a+(b<<2)|0;H[b>>2]=n;L=b+4|0;if((s|0)!=(D|0)){while(1){b=b-4|0;D=D-4|0;H[b>>2]=H[D>>2];if((s|0)!=(D|0)){continue}break}}D=a+(e<<2)|0;H[i+32>>2]=D;H[i+28>>2]=L;H[i+24>>2]=b;if(s){oa(s)}s=b}H[j>>2]=p}De(Q,p);d=f}y=(l|0)<(t|0);if((l|0)!=(t|0)){continue}break}l=t}b=-1;y=H[g+8>>2];if(H[y+28>>2]-H[y+24>>2]>>2>(O|0)){break s}if((c|0)!=(f|0)){r=g+72|0;j=g+60|0;t=g+312|0;while(1){c=c-4|0;z=H[c>>2];H[i+68>>2]=c;ha:{ia:{ja:{if(J[g+270>>1]<=513){if(!I[g+364|0]){break ia}b=H[g+360>>2];a=H[g+352>>2]+(b>>>3|0)|0;if(a>>>0>=K[g+356>>2]){break ja}a=I[a|0];H[g+360>>2]=b+1;if(!(a>>>(b&7)&1)){break ja}break ia}if(Ba(t)){break ia}}ka:{la:{b=H[g+64>>2];e=H[g+68>>2];if((b|0)==e<<5){if((b+1|0)<0){break la}if(b>>>0<=1073741822){e=e<<6;b=(b&-32)+32|0;a=b>>>0<e>>>0?e:b}else{a=2147483647}pb(j,a);b=H[g+64>>2]}H[g+64>>2]=b+1;e=H[g+60>>2]+(b>>>3&536870908)|0;a=H[e>>2];R=e,S=Vj(b)&a,H[R>>2]=S;b=H[g+76>>2];if((b|0)!=H[g+80>>2]){H[b>>2]=z;H[g+76>>2]=b+4;break ha}s=H[r>>2];h=b-s|0;e=h>>2;d=e+1|0;if(d>>>0>=1073741824){break ka}a=h>>>1|0;h=h>>>0>=2147483644?1073741823:a>>>0>d>>>0?a:d;if(h){if(h>>>0>=1073741824){break p}a=pa(h<<2)}else{a=0}d=a+(e<<2)|0;H[d>>2]=z;e=d+4|0;if((b|0)!=(s|0)){while(1){d=d-4|0;b=b-4|0;H[d>>2]=H[b>>2];if((b|0)!=(s|0)){continue}break}}H[g+80>>2]=a+(h<<2);H[g+76>>2]=e;H[g+72>>2]=d;if(!s){break ha}oa(s);break ha}sa();v()}sa();v()}q=H[g+8>>2];C=H[q>>2];if(((H[q+4>>2]-C>>2>>>0)/3|0)<=(l|0)){b=-1;break s}f=-1;b=-1;d=-1;s=H[q+24>>2];e=-1;ma:{if((z|0)==-1){break ma}a=z+1|0;a=(a>>>0)%3|0?a:z-2|0;e=-1;if((a|0)==-1){break ma}e=H[C+(a<<2)>>2]}o=H[s+(e<<2)>>2];na:{if((o|0)==-1){k=1;a=-1;break na}k=1;h=o+1|0;h=(h>>>0)%3|0?h:o-2|0;a=-1;if((h|0)==-1){break na}k=0;a=h+1|0;f=h;a=(a>>>0)%3|0?a:f-2|0;if((a|0)!=-1){a=H[C+(a<<2)>>2]}else{a=-1}}h=H[(a<<2)+s>>2];if((h|0)!=-1){d=h+1|0;d=(d>>>0)%3|0?d:h-2|0}if((f|0)==(z|0)|(d|0)==(z|0)|((z|0)!=-1&H[H[q+12>>2]+(z<<2)>>2]!=-1|(d|0)==(f|0))){break s}if(!k&H[H[q+12>>2]+(f<<2)>>2]!=-1){break s}k=-1;s=H[q+12>>2];h=-1;oa:{if((d|0)==-1){break oa}if(H[s+(d<<2)>>2]!=-1){break s}b=d+1|0;b=(b>>>0)%3|0?b:d-2|0;h=-1;if((b|0)==-1){break oa}h=H[C+(b<<2)>>2]}b=N(l,3);H[i>>2]=b;H[s+(b<<2)>>2]=z;H[s+(z<<2)>>2]=b;b=H[i>>2]+1|0;H[s+(b<<2)>>2]=f;H[s+(f<<2)>>2]=b;b=H[i>>2]+2|0;H[s+(b<<2)>>2]=d;H[s+(d<<2)>>2]=b;b=H[i>>2];H[C+(b<<2)>>2]=a;o=b+1|0;s=C+(o<<2)|0;H[s>>2]=h;h=b+2|0;d=C+(h<<2)|0;H[d>>2]=e;e=H[g+120>>2];f=o?a:-1;b=e+(f>>>3&536870908)|0;a=H[b>>2];R=b,S=Vj(f)&a,H[R>>2]=S;k=(o|0)!=-1?H[s>>2]:k;b=e+(k>>>3&536870908)|0;a=H[b>>2];R=b,S=Vj(k)&a,H[R>>2]=S;b=-1;b=(h|0)!=-1?H[d>>2]:b;f=e+(b>>>3&536870908)|0;a=H[f>>2];R=f,S=Vj(b)&a,H[R>>2]=S;F[i+88|0]=1;_c(j,i+88|0);Ka(r,i);l=l+1|0;f=H[i+64>>2]}if((c|0)!=(f|0)){continue}break}y=H[g+8>>2]}b=-1;if(((H[y+4>>2]-H[y>>2]>>2>>>0)/3|0)!=(l|0)){break s}b=H[y+28>>2]-H[y+24>>2]>>2;l=H[i+24>>2];e=H[i+28>>2];if((l|0)==(e|0)){break r}while(1){j=H[l>>2];a=H[y+24>>2];c=b-1|0;d=a+(c<<2)|0;if(H[d>>2]==-1){while(1){c=b-2|0;b=b-1|0;d=a+(c<<2)|0;if(H[d>>2]==-1){continue}break}}if(c>>>0>=j>>>0){H[i>>2]=y;d=H[d>>2];F[i+12|0]=1;H[i+8>>2]=d;H[i+4>>2]=d;if((d|0)!=-1){while(1){a=H[H[g+8>>2]>>2]+(d<<2)|0;if(H[a>>2]!=(c|0)){b=-1;break s}H[a>>2]=j;uc(i);d=H[i+8>>2];if((d|0)!=-1){continue}break}y=H[g+8>>2]}a=H[y+24>>2];f=a+(c<<2)|0;if((j|0)!=-1){H[a+(j<<2)>>2]=H[f>>2]}H[f>>2]=-1;h=1<<j;a=H[g+120>>2];f=a+(j>>>3&536870908)|0;d=a+(c>>>3&536870908)|0;a=1<<c;if(H[d>>2]&a){c=h|H[f>>2]}else{c=H[f>>2]&(h^-1)}H[f>>2]=c;H[d>>2]=H[d>>2]&(a^-1);b=b-1|0}l=l+4|0;if((e|0)!=(l|0)){continue}break}}l=H[i+24>>2]}if(l){oa(l)}a=H[i+48>>2];if(a){while(1){c=H[a>>2];oa(a);a=c;if(a){continue}break}}a=H[i+40>>2];H[i+40>>2]=0;if(a){oa(a)}a=H[i+64>>2];if(a){H[i+68>>2]=a;oa(a)}ca=i+96|0;break o}sa();v()}wa();v()}f=b;if((b|0)==-1){break n}b=H[x+16>>2];c=b+H[x>>2]|0;a=H[x+8>>2]-b|0;b=H[H[g+4>>2]+32>>2];G[b+38>>1]=J[b+38>>1];H[b>>2]=c;H[b+16>>2]=0;H[b+20>>2]=0;H[b+8>>2]=a;H[b+12>>2]=0;b=H[g+4>>2];a=J[b+36>>1];c=a<<8|a>>>8;if((c&65535)>>>0<=513){b=H[b+32>>2];e=b;a=H[b+16>>2];b=P+H[b+20>>2]|0;a=a+E|0;b=a>>>0<E>>>0?b+1|0:b;H[e+16>>2]=a;H[e+20>>2]=b}pa:{if(H[g+216>>2]==H[g+220>>2]){break pa}a=H[g+8>>2];b=H[a>>2];a=H[a+4>>2];qa:{if((c&65535)>>>0>=513){if((a|0)==(b|0)){break pa}c=0;break qa}if((a|0)==(b|0)){break pa}c=0;while(1){if(cd(g,c)){c=c+3|0;a=H[g+8>>2];if(c>>>0<H[a+4>>2]-H[a>>2]>>2>>>0){continue}break pa}break}break n}while(1){if(bd(g,c)){c=c+3|0;a=H[g+8>>2];if(c>>>0<H[a+4>>2]-H[a>>2]>>2>>>0){continue}break pa}break}break n}ad(B);c=H[g+216>>2];if((c|0)!=H[g+220>>2]){t=0;while(1){e=N(t,144);Jc((e+c|0)+4|0,H[g+8>>2]);a=H[M>>2];b=a+e|0;c=H[b+132>>2];b=H[b+136>>2];if((c|0)!=(b|0)){while(1){Hc((e+H[M>>2]|0)+4|0,H[c>>2]);c=c+4|0;if((b|0)!=(c|0)){continue}break}a=H[M>>2]}if(!Ic((a+e|0)+4|0)){break n}t=t+1|0;c=H[g+216>>2];if(t>>>0<(H[g+220>>2]-c|0)/144>>>0){continue}break}}a=H[g+8>>2];Hb(g+184|0,H[a+28>>2]-H[a+24>>2]>>2);w=H[g+216>>2];if((w|0)!=H[g+220>>2]){c=0;while(1){a=N(c,144)+w|0;b=H[a+60>>2]-H[a+56>>2]>>2;e=a+104|0;a=H[g+8>>2];a=H[a+28>>2]-H[a+24>>2]>>2;Hb(e,(a|0)<(b|0)?b:a);c=c+1|0;w=H[g+216>>2];if(c>>>0<(H[g+220>>2]-w|0)/144>>>0){continue}break}}w=$c(g,f)}break b}w=0}ca=u- -64|0;return w|0}function ki(a){a=a|0;var b=0,c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,L=0,M=0,O=0,P=0,Q=0;t=ca+-64|0;ca=t;H[a+132>>2]=0;if(H[a+148>>2]){d=H[a+144>>2];if(d){while(1){b=H[d>>2];oa(d);d=b;if(b){continue}break}}d=0;H[a+144>>2]=0;k=H[a+140>>2];a:{if(!k){break a}if(k>>>0>=4){b=k&-4;while(1){c=d<<2;H[c+H[a+136>>2]>>2]=0;H[H[a+136>>2]+(c|4)>>2]=0;H[H[a+136>>2]+(c|8)>>2]=0;H[H[a+136>>2]+(c|12)>>2]=0;d=d+4|0;e=e+4|0;if((b|0)!=(e|0)){continue}break}}b=k&3;if(!b){break a}while(1){H[H[a+136>>2]+(d<<2)>>2]=0;d=d+1|0;x=x+1|0;if((b|0)!=(x|0)){continue}break}}H[a+148>>2]=0}b:{c:{d=H[a+4>>2];x=I[d+36|0];b=x<<8|I[d+37|0];if(b>>>0<=513){f=H[d+32>>2];d:{if(b>>>0<=511){b=H[f+20>>2];e=H[f+16>>2];c=e+4|0;b=c>>>0<4?b+1|0:b;k=H[f+12>>2];if(K[f+8>>2]<c>>>0&(k|0)<=(b|0)|(b|0)>(k|0)){break c}e=e+H[f>>2]|0;e=I[e|0]|I[e+1|0]<<8|(I[e+2|0]<<16|I[e+3|0]<<24);H[f+16>>2]=c;H[f+20>>2]=b;break d}if(!Ea(1,t,f)){break c}d=H[a+4>>2];x=I[d+36|0];e=H[t>>2]}H[a+132>>2]=e}f=H[d+32>>2];e:{f:{g:{if((x&255)>>>0<=1){x=0;b=H[f+20>>2];c=H[f+16>>2];e=c+4|0;b=e>>>0<4?b+1|0:b;k=H[f+12>>2];if(K[f+8>>2]<e>>>0&(k|0)<=(b|0)|(b|0)>(k|0)){break b}c=c+H[f>>2]|0;c=I[c|0]|I[c+1|0]<<8|(I[c+2|0]<<16|I[c+3|0]<<24);H[t+60>>2]=c;H[f+16>>2]=e;H[f+20>>2]=b;H[a+156>>2]=c;l=a+156|0;break g}x=0;if(!Ea(1,t+60|0,f)){break b}d=H[a+4>>2];b=I[d+36|0];H[a+156>>2]=H[t+60>>2];l=a+156|0;if(b>>>0>1){break f}}f=H[d+32>>2];c=H[f+8>>2];k=H[f+12>>2];d=H[f+20>>2];e=H[f+16>>2];b=e+4|0;d=b>>>0<4?d+1|0:d;if(b>>>0>c>>>0&(d|0)>=(k|0)|(d|0)>(k|0)){break b}e=e+H[f>>2]|0;e=I[e|0]|I[e+1|0]<<8|(I[e+2|0]<<16|I[e+3|0]<<24);H[t+56>>2]=e;H[f+16>>2]=b;H[f+20>>2]=d;break e}if(!Ea(1,t+56|0,H[d+32>>2])){break b}e=H[t+56>>2]}if(e>>>0>1431655765|K[l>>2]>N(e,3)>>>0){break b}j=H[a+4>>2];y=H[j+32>>2];d=H[y+8>>2];f=H[y+12>>2];b=H[y+20>>2];m=H[y+16>>2];if((f|0)<=(b|0)&m>>>0>=d>>>0|(b|0)>(f|0)){break b}l=H[y>>2];g=I[l+m|0];c=y;k=m+1|0;C=k?b:b+1|0;H[c+16>>2]=k;H[c+20>>2]=C;h:{if(I[j+36|0]<=1){c=d;d=m+5|0;b=d>>>0<5?b+1|0:b;if(c>>>0<d>>>0&(b|0)>=(f|0)|(b|0)>(f|0)){break b}c=k+l|0;l=I[c|0]|I[c+1|0]<<8|(I[c+2|0]<<16|I[c+3|0]<<24);H[t+52>>2]=l;H[y+16>>2]=d;H[y+20>>2]=b;break h}if(!Ea(1,t+52|0,y)){break b}l=H[t+52>>2]}if(e>>>0<l>>>0|((l>>>0)/3|0)+l>>>0<e>>>0){break b}d=H[a+4>>2];f=H[d+32>>2];i:{if(I[d+36|0]<=1){d=H[f+20>>2];b=H[f+16>>2];c=b+4|0;d=c>>>0<4?d+1|0:d;k=H[f+12>>2];if(K[f+8>>2]<c>>>0&(k|0)<=(d|0)|(d|0)>(k|0)){break b}b=b+H[f>>2]|0;b=I[b|0]|I[b+1|0]<<8|(I[b+2|0]<<16|I[b+3|0]<<24);H[t+48>>2]=b;H[f+16>>2]=c;H[f+20>>2]=d;break i}if(!Ea(1,t+48|0,f)){break b}b=H[t+48>>2]}if(b>>>0>l>>>0){break b}H[a+28>>2]=H[a+24>>2];d=$b(pa(88));c=H[a+8>>2];H[a+8>>2]=d;if(c){cb(c);if(!H[a+8>>2]){break b}}H[a+164>>2]=H[a+160>>2];Jb(a+160|0,e);H[a+176>>2]=H[a+172>>2];Jb(a+172|0,e);H[a- -64>>2]=0;H[a+92>>2]=-1;H[a+84>>2]=-1;H[a+88>>2]=-1;H[a+40>>2]=H[a+36>>2];H[a+52>>2]=H[a+48>>2];H[a+76>>2]=H[a+72>>2];E=a+216|0;ed(E);dd(E,g);if(!Lc(H[a+8>>2],e,H[a+156>>2]+b|0)){break b}d=H[a+156>>2];F[t|0]=1;Oa(a+120|0,b+d|0,t);b=H[a+4>>2];d=J[b+36>>1];d=(d<<8|d>>>8)&65535;j:{if(d>>>0<=513){k=H[b+32>>2];k:{if(d>>>0<=511){b=H[k+20>>2];e=H[k+16>>2];d=e+4|0;b=d>>>0<4?b+1|0:b;c=H[k+12>>2];if(K[k+8>>2]<d>>>0&(c|0)<=(b|0)|(b|0)>(c|0)){break b}e=e+H[k>>2]|0;e=I[e|0]|I[e+1|0]<<8|(I[e+2|0]<<16|I[e+3|0]<<24);H[k+16>>2]=d;H[k+20>>2]=b;break k}if(!Ea(1,t+44|0,k)){break b}e=H[t+44>>2]}if(!e){break b}k=H[H[a+4>>2]+32>>2];c=H[k+8>>2];d=H[k+16>>2];b=c-d|0;d=H[k+12>>2]-(H[k+20>>2]+(c>>>0<d>>>0)|0)|0;if(b>>>0<e>>>0&(d|0)<=0|(d|0)<0){break b}f=Ha(t);k=H[H[a+4>>2]+32>>2];c=H[k+16>>2];b=(c+H[k>>2]|0)+e|0;d=H[k+8>>2]-c|0;G[f+38>>1]=J[k+38>>1];H[f>>2]=b;H[f+16>>2]=0;H[f+20>>2]=0;H[f+8>>2]=d-e;H[f+12>>2]=0;d=Ib(a,f);if((d|0)==-1){break b}y=d;M=d>>31;break j}y=-1;M=-1;if((Ib(a,H[b+32>>2])|0)==-1){break b}}O=a+232|0;e=O;H[e+144>>2]=a;d=H[(ea[H[H[a>>2]+32>>2]](a)|0)+32>>2];b=H[d>>2]+H[d+16>>2]|0;d=H[(ea[H[H[a>>2]+32>>2]](a)|0)+32>>2];d=H[d+8>>2]-H[d+16>>2]|0;P=e,Q=J[H[(ea[H[H[a>>2]+32>>2]](a)|0)+32>>2]+38>>1],G[P+38>>1]=Q;H[e>>2]=b;H[e+16>>2]=0;H[e+20>>2]=0;H[e+8>>2]=d;H[e+12>>2]=0;H[a+372>>2]=g;C=Ha(t);l:{if(!Ge(e,C)){break l}b=0;d=0;e=0;k=0;i=ca-96|0;ca=i;H[i+72>>2]=0;H[i+64>>2]=0;H[i+68>>2]=0;H[i+48>>2]=0;H[i+52>>2]=0;H[i+40>>2]=0;H[i+44>>2]=0;H[i+56>>2]=1065353216;H[i+32>>2]=0;H[i+24>>2]=0;H[i+28>>2]=0;h=a;L=H[a+124>>2];m:{n:{o:{p:{q:{r:{if((l|0)<=0){break r}A=H[h+216>>2]!=H[h+220>>2];s=1;while(1){f=k;k=f+1|0;s:{t:{u:{v:{w:{x:{y:{z:{A:{B:{C:{D:{E:{F:{G:{if(!I[h+308|0]){break G}u=H[h+296>>2];g=H[h+304>>2];a=u+(g>>>3|0)|0;p=H[h+300>>2];if(a>>>0>=p>>>0){break G}c=I[a|0];a=g+1|0;H[h+304>>2]=a;m=c>>>(g&7)&1;if(!m){break G}n=0;j=a>>>3|0;c=u+j|0;H:{if(c>>>0>=p>>>0){g=a;a=0;break H}c=I[c|0];g=g+2|0;H[h+304>>2]=g;j=g>>>3|0;a=c>>>(a&7)&1}c=j+u|0;if(c>>>0<p>>>0){c=I[c|0];H[h+304>>2]=g+1;n=c>>>(g&7)<<1&2}j=-1;a=m|(a|n)<<1;switch(a-1|0){case 6:break D;case 0:break E;case 2:case 4:break F;default:break q}}if((d|0)==(e|0)){j=-1;break q}g=-1;q=H[h+8>>2];u=H[q+24>>2];p=d-4|0;s=H[p>>2];c=-1;I:{if((s|0)==-1){break I}b=s+1|0;b=(b>>>0)%3|0?b:s-2|0;c=-1;if((b|0)==-1){break I}c=H[H[q>>2]+(b<<2)>>2]}b=H[u+(c<<2)>>2];if((b|0)!=-1){a=b+1|0;g=(a>>>0)%3|0?a:b-2|0}if((g|0)==(s|0)){j=-1;break q}if((s|0)!=-1){j=-1;if(H[H[q+12>>2]+(s<<2)>>2]!=-1){break q}}b=H[q+12>>2];if((g|0)!=-1){j=-1;if(H[b+(g<<2)>>2]!=-1){break q}}n=N(f,3);a=n+1|0;H[b+(s<<2)>>2]=a;m=a<<2;H[m+b>>2]=s;r=n+2|0;H[b+(g<<2)>>2]=r;f=r<<2;H[f+b>>2]=g;o=-1;a=-1;J:{if((s|0)==-1){break J}K:{if((s>>>0)%3|0){b=s-1|0;break K}b=s+2|0;a=-1;if((b|0)==-1){break J}}a=H[H[q>>2]+(b<<2)>>2]}L:{if((g|0)==-1){break L}b=g+1|0;b=(b>>>0)%3|0?b:g-2|0;if((b|0)==-1){break L}o=H[H[q>>2]+(b<<2)>>2]}j=-1;if((a|0)==(c|0)|(c|0)==(o|0)){break q}b=H[q>>2];H[b+(n<<2)>>2]=c;H[b+m>>2]=o;H[b+f>>2]=a;if((a|0)!=-1){H[u+(a<<2)>>2]=r}b=H[h+120>>2]+(c>>>3&536870908)|0;a=H[b>>2];P=b,Q=Vj(c)&a,H[P>>2]=Q;H[p>>2]=n;b=e;break s}if((d|0)==(e|0)){break q}m=d-4|0;n=H[m>>2];r=H[h+8>>2];b=H[r+12>>2];if((n|0)!=-1&H[b+(n<<2)>>2]!=-1){break q}o=N(f,3);p=(a|0)==5;g=o+(p?2:1)|0;a=g<<2;H[a+b>>2]=n;H[b+(n<<2)>>2]=g;Ka(r+24|0,11424);b=H[h+8>>2];u=H[b+24>>2];if(H[b+28>>2]-u>>2>(L|0)){break q}j=H[b>>2];q=j+a|0;c=H[r+28>>2];b=H[r+24>>2];a=(c-b>>2)-1|0;H[q>>2]=a;if((b|0)!=(c|0)){H[u+(a<<2)>>2]=g}c=p?o:o+2|0;g=j+(o+p<<2)|0;M:{if((n|0)==-1){H[j+(c<<2)>>2]=-1;b=-1;break M}N:{O:{P:{if((n>>>0)%3|0){a=n-1|0;break P}a=n+2|0;if((a|0)==-1){break O}}a=H[j+(a<<2)>>2];H[j+(c<<2)>>2]=a;if((a|0)==-1){break N}H[u+(a<<2)>>2]=c;break N}H[j+(c<<2)>>2]=-1}a=n+1|0;a=(a>>>0)%3|0?a:n-2|0;b=-1;if((a|0)==-1){break M}b=H[j+(a<<2)>>2]}H[g>>2]=b;H[m>>2]=o;b=e;break y}if((b|0)==(d|0)){break q}a=d-4|0;q=H[a>>2];H[i+68>>2]=a;p=H[i+44>>2];Q:{if(!p){d=a;break Q}g=H[i+40>>2];j=Uj(p)>>>0>1;c=f&p+2147483647;R:{if(!j){break R}c=f;if(c>>>0<p>>>0){break R}c=(f>>>0)%(p>>>0)|0}m=c;c=H[g+(m<<2)>>2];if(!c){d=a;break Q}g=H[c>>2];if(!g){d=a;break Q}S:{if(!j){j=p-1|0;while(1){c=H[g+4>>2];T:{if((c|0)!=(f|0)){if((m|0)==(c&j)){break T}d=a;break Q}if((f|0)==H[g+8>>2]){break S}}g=H[g>>2];if(g){continue}break}d=a;break Q}while(1){c=H[g+4>>2];U:{if((c|0)!=(f|0)){if(c>>>0>=p>>>0){c=(c>>>0)%(p>>>0)|0}if((c|0)==(m|0)){break U}d=a;break Q}if((f|0)==H[g+8>>2]){break S}}g=H[g>>2];if(g){continue}break}d=a;break Q}if((a|0)!=(z|0)){H[a>>2]=H[g+12>>2];H[i+68>>2]=d;break Q}c=z-b|0;d=c>>2;e=d+1|0;if(e>>>0>=1073741824){break C}a=c>>>1|0;c=c>>>0>=2147483644?1073741823:a>>>0>e>>>0?a:e;if(c){if(c>>>0>=1073741824){break n}a=pa(c<<2)}else{a=0}e=a+(d<<2)|0;H[e>>2]=H[g+12>>2];d=e+4|0;if((b|0)!=(z|0)){while(1){e=e-4|0;z=z-4|0;H[e>>2]=H[z>>2];if((b|0)!=(z|0)){continue}break}}z=a+(c<<2)|0;H[i+72>>2]=z;H[i+68>>2]=d;H[i+64>>2]=e;if(b){oa(b)}}if((d|0)==(e|0)){break u}g=d-4|0;n=H[g>>2];if((n|0)==(q|0)){break u}b=(n|0)==-1;o=H[h+8>>2];if(!b&H[H[o+12>>2]+(n<<2)>>2]!=-1){break u}r=H[o+12>>2];if((q|0)!=-1&H[r+(q<<2)>>2]!=-1){break u}u=N(f,3);f=u+2|0;H[r+(n<<2)>>2]=f;p=f<<2;H[p+r>>2]=n;a=u+1|0;H[r+(q<<2)>>2]=a;c=a<<2;H[c+r>>2]=q;if(b){break B}if((n>>>0)%3|0){m=n-1|0;break x}m=n+2|0;if((m|0)!=-1){break x}a=H[o>>2];b=-1;break w}a=H[h+8>>2];Ka(a+24|0,11424);c=H[h+8>>2];q=N(f,3);r=H[a+28>>2];u=H[a+24>>2];p=r-u|0;o=p>>2;g=o-1|0;H[H[c>>2]+(q<<2)>>2]=g;Ka(c+24|0,11424);m=q+1|0;H[H[c>>2]+(m<<2)>>2]=(H[c+28>>2]-H[c+24>>2]>>2)-1;a=H[h+8>>2];Ka(a+24|0,11424);c=q+2|0;H[H[a>>2]+(c<<2)>>2]=(H[a+28>>2]-H[a+24>>2]>>2)-1;a=H[h+8>>2];n=H[a+24>>2];if(H[a+28>>2]-n>>2>(L|0)){break q}V:{W:{if((r|0)!=(u|0)){H[n+(g<<2)>>2]=q;j=0;if((p|0)==-4){break W}}H[n+(o<<2)>>2]=m;j=o+1|0;if((j|0)==-1){break V}}H[n+(j<<2)>>2]=c}if((d|0)!=(z|0)){H[d>>2]=q;d=d+4|0;H[i+68>>2]=d;break y}m=d-b|0;e=m>>2;c=e+1|0;if(c>>>0>=1073741824){break A}a=m>>>1|0;c=m>>>0>=2147483644?1073741823:a>>>0>c>>>0?a:c;if(c){if(c>>>0>=1073741824){break n}a=pa(c<<2)}else{a=0}e=a+(e<<2)|0;H[e>>2]=q;z=a+(c<<2)|0;a=e+4|0;if((b|0)!=(d|0)){while(1){e=e-4|0;d=d-4|0;H[e>>2]=H[d>>2];if((b|0)!=(d|0)){continue}break}}H[i+72>>2]=z;H[i+68>>2]=a;H[i+64>>2]=e;if(!b){break z}oa(b);break z}sa();v()}m=-1;a=H[o>>2];H[a+(u<<2)>>2]=-1;j=-1;break v}sa();v()}d=a;b=e}m=H[h+40>>2];if((m|0)==H[h+36>>2]){break s}c=m-12|0;a=H[c+4>>2];j=(f^-1)+l|0;if(a>>>0>j>>>0){break u}if((a|0)!=(j|0)){break s}f=I[m-4|0];a=H[c>>2];H[h+40>>2]=c;if((a|0)<0){break u}m=d-4|0;g=H[m>>2];H[i+20>>2]=(a^-1)+l;a=i+20|0;H[i+88>>2]=a;Gb(i,i+40|0,a,i+88|0);c=H[i>>2];X:{if(f&1){a=-1;if((g|0)==-1){break X}a=g+1|0;a=(a>>>0)%3|0?a:g-2|0;break X}a=-1;if((g|0)==-1){break X}a=g-1|0;if((g>>>0)%3|0){break X}a=g+2|0}H[c+12>>2]=a;g=H[h+40>>2];if((g|0)==H[h+36>>2]){break s}while(1){c=g-12|0;a=H[c+4>>2];if(a>>>0>j>>>0){break u}if((a|0)!=(j|0)){break s}f=I[g-4|0];a=H[c>>2];H[h+40>>2]=c;if((a|0)<0){break u}g=H[m>>2];H[i+20>>2]=(a^-1)+l;a=i+20|0;H[i+88>>2]=a;Gb(i,i+40|0,a,i+88|0);c=H[i>>2];Y:{if(f&1){a=-1;if((g|0)==-1){break Y}a=g+1|0;a=(a>>>0)%3|0?a:g-2|0;break Y}a=-1;if((g|0)==-1){break Y}a=g-1|0;if((g>>>0)%3|0){break Y}a=g+2|0}H[c+12>>2]=a;g=H[h+40>>2];if((g|0)!=H[h+36>>2]){continue}break}break s}a=H[o>>2];b=H[a+(m<<2)>>2]}m=b;H[(u<<2)+a>>2]=b;b=n+1|0;b=(b>>>0)%3|0?b:n-2|0;j=-1;if((b|0)==-1){break v}j=H[(b<<2)+a>>2]}H[a+c>>2]=j;Z:{if((q|0)==-1){H[a+p>>2]=-1;n=-1;c=-1;break Z}_:{$:{aa:{if((q>>>0)%3|0){b=q-1|0;break aa}b=q+2|0;if((b|0)==-1){break $}}b=H[(b<<2)+a>>2];H[a+p>>2]=b;if((b|0)==-1){break _}H[H[o+24>>2]+(b<<2)>>2]=f;break _}H[a+p>>2]=-1}n=-1;b=q+1|0;b=(b>>>0)%3|0?b:q-2|0;c=-1;if((b|0)==-1){break Z}n=H[(b<<2)+a>>2];c=b}b=H[o+24>>2];p=b+(n<<2)|0;if((m|0)!=-1){H[b+(m<<2)>>2]=H[p>>2]}b=c;while(1){if((b|0)==-1){break t}H[(b<<2)+a>>2]=m;j=b+1|0;b=(j>>>0)%3|0?j:b-2|0;f=-1;ba:{if((b|0)==-1){break ba}j=H[r+(b<<2)>>2];f=-1;if((j|0)==-1){break ba}b=j+1|0;f=(b>>>0)%3|0?b:j-2|0}b=f;if((c|0)!=(b|0)){continue}break}}j=-1;if(!(s&1)){break r}break q}H[p>>2]=-1;ca:{if(A){break ca}if((B|0)!=(D|0)){H[D>>2]=n;D=D+4|0;H[i+28>>2]=D;break ca}f=B-w|0;b=f>>2;c=b+1|0;if(c>>>0>=1073741824){break o}a=f>>>1|0;c=f>>>0>=2147483644?1073741823:a>>>0>c>>>0?a:c;if(c){if(c>>>0>=1073741824){break n}a=pa(c<<2)}else{a=0}b=a+(b<<2)|0;H[b>>2]=n;D=b+4|0;if((w|0)!=(B|0)){while(1){b=b-4|0;B=B-4|0;H[b>>2]=H[B>>2];if((w|0)!=(B|0)){continue}break}}B=a+(c<<2)|0;H[i+32>>2]=B;H[i+28>>2]=D;H[i+24>>2]=b;if(w){oa(w)}w=b}H[g>>2]=u;b=e}s=(k|0)<(l|0);if((k|0)!=(l|0)){continue}break}k=l}j=-1;a=H[h+8>>2];if(H[a+28>>2]-H[a+24>>2]>>2>(L|0)){break q}if((d|0)!=(e|0)){u=h+72|0;m=h+60|0;p=h+312|0;while(1){d=d-4|0;o=H[d>>2];H[i+68>>2]=d;da:{ea:{fa:{if(J[h+270>>1]<=513){if(!I[h+364|0]){break ea}b=H[h+360>>2];a=H[h+352>>2]+(b>>>3|0)|0;if(a>>>0>=K[h+356>>2]){break fa}a=I[a|0];H[h+360>>2]=b+1;if(!(a>>>(b&7)&1)){break fa}break ea}if(Ba(p)){break ea}}ga:{ha:{b=H[h+64>>2];c=H[h+68>>2];if((b|0)==c<<5){if((b+1|0)<0){break ha}if(b>>>0<=1073741822){c=c<<6;b=(b&-32)+32|0;a=b>>>0<c>>>0?c:b}else{a=2147483647}pb(m,a);b=H[h+64>>2]}H[h+64>>2]=b+1;c=H[h+60>>2]+(b>>>3&536870908)|0;a=H[c>>2];P=c,Q=Vj(b)&a,H[P>>2]=Q;b=H[h+76>>2];if((b|0)!=H[h+80>>2]){H[b>>2]=o;H[h+76>>2]=b+4;break da}l=H[u>>2];w=b-l|0;c=w>>2;f=c+1|0;if(f>>>0>=1073741824){break ga}a=w>>>1|0;f=w>>>0>=2147483644?1073741823:a>>>0>f>>>0?a:f;if(f){if(f>>>0>=1073741824){break n}a=pa(f<<2)}else{a=0}g=a+(c<<2)|0;H[g>>2]=o;c=g+4|0;if((b|0)!=(l|0)){while(1){g=g-4|0;b=b-4|0;H[g>>2]=H[b>>2];if((b|0)!=(l|0)){continue}break}}H[h+80>>2]=a+(f<<2);H[h+76>>2]=c;H[h+72>>2]=g;if(!l){break da}oa(l);break da}sa();v()}sa();v()}r=H[h+8>>2];A=H[r>>2];if(((H[r+4>>2]-A>>2>>>0)/3|0)<=(k|0)){j=-1;break q}a=-1;j=-1;b=-1;w=H[r+24>>2];f=-1;ia:{if((o|0)==-1){break ia}e=o+1|0;e=(e>>>0)%3|0?e:o-2|0;f=-1;if((e|0)==-1){break ia}f=H[A+(e<<2)>>2]}l=H[w+(f<<2)>>2];ja:{if((l|0)==-1){g=1;e=-1;break ja}g=1;c=l+1|0;c=(c>>>0)%3|0?c:l-2|0;e=-1;if((c|0)==-1){break ja}g=0;a=c;e=a+1|0;e=(e>>>0)%3|0?e:a-2|0;if((e|0)!=-1){e=H[A+(e<<2)>>2]}else{e=-1}}c=H[(e<<2)+w>>2];if((c|0)!=-1){b=c+1|0;b=(b>>>0)%3|0?b:c-2|0}if((a|0)==(o|0)|(b|0)==(o|0)|((o|0)!=-1&H[H[r+12>>2]+(o<<2)>>2]!=-1|(a|0)==(b|0))){break q}if(!g&H[H[r+12>>2]+(a<<2)>>2]!=-1){break q}g=-1;l=H[r+12>>2];w=-1;ka:{if((b|0)==-1){break ka}if(H[l+(b<<2)>>2]!=-1){break q}c=b+1|0;c=(c>>>0)%3|0?c:b-2|0;w=-1;if((c|0)==-1){break ka}w=H[A+(c<<2)>>2]}c=N(k,3);H[i>>2]=c;H[l+(c<<2)>>2]=o;H[l+(o<<2)>>2]=c;c=H[i>>2]+1|0;H[l+(c<<2)>>2]=a;H[l+(a<<2)>>2]=c;a=H[i>>2]+2|0;H[l+(a<<2)>>2]=b;H[l+(b<<2)>>2]=a;a=H[i>>2];H[A+(a<<2)>>2]=e;j=a+1|0;l=A+(j<<2)|0;H[l>>2]=w;w=a+2|0;c=A+(w<<2)|0;H[c>>2]=f;f=H[h+120>>2];e=j?e:-1;b=f+(e>>>3&536870908)|0;a=H[b>>2];P=b,Q=Vj(e)&a,H[P>>2]=Q;g=(j|0)!=-1?H[l>>2]:g;b=f+(g>>>3&536870908)|0;a=H[b>>2];P=b,Q=Vj(g)&a,H[P>>2]=Q;b=-1;b=(w|0)!=-1?H[c>>2]:b;e=f+(b>>>3&536870908)|0;a=H[e>>2];P=e,Q=Vj(b)&a,H[P>>2]=Q;F[i+88|0]=1;_c(m,i+88|0);Ka(u,i);k=k+1|0;e=H[i+64>>2]}if((d|0)!=(e|0)){continue}break}a=H[h+8>>2]}j=-1;if(((H[a+4>>2]-H[a>>2]>>2>>>0)/3|0)!=(k|0)){break q}j=H[a+28>>2]-H[a+24>>2]>>2;s=H[i+24>>2];c=H[i+28>>2];if((s|0)==(c|0)){break p}while(1){k=H[s>>2];d=H[a+24>>2];b=j-1|0;g=d+(b<<2)|0;if(H[g>>2]==-1){while(1){b=j-2|0;j=j-1|0;g=d+(b<<2)|0;if(H[g>>2]==-1){continue}break}}if(b>>>0>=k>>>0){H[i>>2]=a;g=H[g>>2];F[i+12|0]=1;H[i+8>>2]=g;H[i+4>>2]=g;if((g|0)!=-1){while(1){a=H[H[h+8>>2]>>2]+(g<<2)|0;if(H[a>>2]!=(b|0)){j=-1;break q}H[a>>2]=k;uc(i);g=H[i+8>>2];if((g|0)!=-1){continue}break}a=H[h+8>>2]}d=H[a+24>>2];e=d+(b<<2)|0;if((k|0)!=-1){H[d+(k<<2)>>2]=H[e>>2]}H[e>>2]=-1;f=1<<k;d=H[h+120>>2];e=d+(k>>>3&536870908)|0;k=d+(b>>>3&536870908)|0;d=1<<b;if(H[k>>2]&d){b=f|H[e>>2]}else{b=H[e>>2]&(f^-1)}H[e>>2]=b;H[k>>2]=H[k>>2]&(d^-1);j=j-1|0}s=s+4|0;if((c|0)!=(s|0)){continue}break}}s=H[i+24>>2]}if(s){oa(s)}a=H[i+48>>2];if(a){while(1){d=H[a>>2];oa(a);a=d;if(a){continue}break}}a=H[i+40>>2];H[i+40>>2]=0;if(a){oa(a)}a=H[i+64>>2];if(a){H[i+68>>2]=a;oa(a)}ca=i+96|0;a=j;break m}sa();v()}wa();v()}e=a;if((a|0)==-1){break l}b=H[C+16>>2];d=b+H[C>>2]|0;a=H[C+8>>2]-b|0;b=H[H[h+4>>2]+32>>2];G[b+38>>1]=J[b+38>>1];H[b>>2]=d;H[b+16>>2]=0;H[b+20>>2]=0;H[b+8>>2]=a;H[b+12>>2]=0;b=H[h+4>>2];a=J[b+36>>1];d=a<<8|a>>>8;if((d&65535)>>>0<=513){b=H[b+32>>2];c=b;a=H[b+16>>2];b=M+H[b+20>>2]|0;a=a+y|0;b=a>>>0<y>>>0?b+1|0:b;H[c+16>>2]=a;H[c+20>>2]=b}la:{if(H[h+216>>2]==H[h+220>>2]){break la}a=H[h+8>>2];b=H[a>>2];a=H[a+4>>2];ma:{if((d&65535)>>>0>=513){if((a|0)==(b|0)){break la}d=0;break ma}if((a|0)==(b|0)){break la}d=0;while(1){if(cd(h,d)){d=d+3|0;a=H[h+8>>2];if(d>>>0<H[a+4>>2]-H[a>>2]>>2>>>0){continue}break la}break}break l}while(1){if(bd(h,d)){d=d+3|0;a=H[h+8>>2];if(d>>>0<H[a+4>>2]-H[a>>2]>>2>>>0){continue}break la}break}break l}ad(O);d=H[h+216>>2];if((d|0)!=H[h+220>>2]){l=0;while(1){c=N(l,144);Jc((c+d|0)+4|0,H[h+8>>2]);a=H[E>>2];b=a+c|0;d=H[b+132>>2];b=H[b+136>>2];if((d|0)!=(b|0)){while(1){Hc((c+H[E>>2]|0)+4|0,H[d>>2]);d=d+4|0;if((b|0)!=(d|0)){continue}break}a=H[E>>2]}if(!Ic((a+c|0)+4|0)){break l}l=l+1|0;d=H[h+216>>2];if(l>>>0<(H[h+220>>2]-d|0)/144>>>0){continue}break}}a=H[h+8>>2];Hb(h+184|0,H[a+28>>2]-H[a+24>>2]>>2);x=H[h+216>>2];if((x|0)!=H[h+220>>2]){d=0;while(1){a=N(d,144)+x|0;b=H[a+60>>2]-H[a+56>>2]>>2;c=a+104|0;a=H[h+8>>2];a=H[a+28>>2]-H[a+24>>2]>>2;Hb(c,(a|0)<(b|0)?b:a);d=d+1|0;x=H[h+216>>2];if(d>>>0<(H[h+220>>2]-x|0)/144>>>0){continue}break}}x=$c(h,e)}break b}x=0}ca=t- -64|0;return x|0}function Bg(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,G=0,J=0,K=0,L=0,M=0,O=0;B=c;c=0;m=ca-96|0;ca=m;l=m+16|0;ra(l,0,76);H[m+92>>2]=-1;H[m+8>>2]=0;H[m>>2]=0;H[m+4>>2]=0;r=ca-16|0;ca=r;H[l+68>>2]=0;H[l+72>>2]=0;H[l>>2]=b;s=ca-16|0;ca=s;u=b;a=H[b+20>>2];a:{if((H[b+24>>2]-a|0)<=0){break a}a=H[a>>2];if((a|0)==-1){break a}c=H[H[u+8>>2]+(a<<2)>>2]}b:{c:{d:{if(!c){a=0;break d}a=H[u+100>>2];e=H[u+96>>2];H[s+8>>2]=0;H[s>>2]=0;H[s+4>>2]=0;f=a-e|0;b=(f|0)/12|0;e:{if((a|0)==(e|0)){break e}if(b>>>0>=357913942){break c}d=pa(f);H[s>>2]=d;H[s+8>>2]=d+N(b,12);a=0;n=d;f=f-12|0;d=(f-((f>>>0)%12|0)|0)+12|0;f=ra(n,0,d);H[s+4>>2]=d+f;if(I[c+84|0]){c=b>>>0<=1?1:b;h=c&1;if(b>>>0>=2){g=c&-2;c=0;while(1){d=N(a,12);b=d+e|0;i=H[b+4>>2];j=H[b>>2];d=d+f|0;H[d+8>>2]=H[b+8>>2];H[d>>2]=j;H[d+4>>2]=i;d=N(a|1,12);b=d+e|0;i=H[b+4>>2];j=H[b>>2];d=d+f|0;H[d+8>>2]=H[b+8>>2];H[d>>2]=j;H[d+4>>2]=i;a=a+2|0;c=c+2|0;if((g|0)!=(c|0)){continue}break}}if(!h){break e}b=N(a,12);a=b+e|0;c=H[a+4>>2];e=H[a>>2];b=b+f|0;H[b+8>>2]=H[a+8>>2];H[b>>2]=e;H[b+4>>2]=c;break e}h=b>>>0<=1?1:b;a=H[c+68>>2];c=0;while(1){d=N(c,12);b=d+e|0;g=H[a+(H[b>>2]<<2)>>2];i=H[a+(H[b+4>>2]<<2)>>2];d=d+f|0;H[d+8>>2]=H[a+(H[b+8>>2]<<2)>>2];H[d+4>>2]=i;H[d>>2]=g;c=c+1|0;if((h|0)!=(c|0)){continue}break}}d=0;E=ca-16|0;ca=E;h=pa(88);$b(h);C=ca-16|0;ca=C;H[h+80>>2]=0;H[h+84>>2]=0;a=H[h+76>>2];H[h+76>>2]=0;if(a){oa(a)}H[h+68>>2]=0;H[h+72>>2]=0;b=h- -64|0;a=H[b>>2];H[b>>2]=0;if(a){oa(a)}g=H[s+4>>2];b=H[s>>2];c=(g-b|0)/12|0;a=N(c,3);f=H[h>>2];e=H[h+4>>2]-f>>2;f:{if(a>>>0>e>>>0){ue(h,a-e|0);g=H[s+4>>2];b=H[s>>2];c=(g-b|0)/12|0;break f}if(a>>>0>=e>>>0){break f}H[h+4>>2]=f+(a<<2)}g:{if((b|0)==(g|0)){break g}e=c>>>0<=1?1:c;g=e&1;a=H[h>>2];if(c>>>0>=2){i=e&-2;c=0;while(1){e=N(d,12);j=e+a|0;f=b+e|0;H[j>>2]=H[f>>2];H[a+(e|4)>>2]=H[f+4>>2];H[j+8>>2]=H[f+8>>2];f=N(d|1,12);e=f+a|0;f=b+f|0;H[e>>2]=H[f>>2];H[e+4>>2]=H[f+4>>2];H[e+8>>2]=H[f+8>>2];d=d+2|0;c=c+2|0;if((i|0)!=(c|0)){continue}break}}if(!g){break g}c=N(d,12);a=c+a|0;b=b+c|0;H[a>>2]=H[b>>2];H[a+4>>2]=H[b+4>>2];H[a+8>>2]=H[b+8>>2]}H[C+12>>2]=-1;a=0;e=0;g=0;f=ca-32|0;ca=f;h:{i:{w=C+12|0;j:{if(!w){break j}c=H[h+4>>2];j=H[h>>2];d=c-j|0;i=d>>2;n=H[h+12>>2];b=H[h+16>>2]-n>>2;k:{if(i>>>0>b>>>0){qb(h+12|0,i-b|0,13652);c=H[h+4>>2];j=H[h>>2];d=c-j|0;i=d>>2;break k}if(b>>>0<=i>>>0){break k}H[h+16>>2]=n+(i<<2)}H[f+24>>2]=0;H[f+16>>2]=0;H[f+20>>2]=0;b=(c|0)==(j|0);if(!b){if((d|0)<0){break i}e=pa(d);H[f+20>>2]=e;H[f+16>>2]=e;H[f+24>>2]=(i<<2)+e}l:{m:{n:{o:{p:{if(d){while(1){i=H[(a<<2)+j>>2];b=H[f+20>>2]-e>>2;q:{if(i>>>0<b>>>0){break q}H[f>>2]=0;d=i+1|0;if(d>>>0>b>>>0){Pa(f+16|0,d-b|0,f);j=H[h>>2];c=H[h+4>>2];e=H[f+16>>2];break q}if(b>>>0<=d>>>0){break q}H[f+20>>2]=(d<<2)+e}b=(i<<2)+e|0;H[b>>2]=H[b>>2]+1;a=a+1|0;d=c-j|0;i=d>>2;if(a>>>0<i>>>0){continue}break}break p}d=0;if(!b){break o}break n}if((c|0)==(j|0)){d=0;break n}if(d>>>0>=2147483645){break m}}d=pa(d<<1);ra(d,255,i<<3)}H[f+8>>2]=0;H[f>>2]=0;H[f+4>>2]=0;b=H[f+20>>2];a=b-e|0;t=a>>2;r:{s:{if((b|0)==(e|0)){break s}if((a|0)<0){break r}q=pa(a);H[f>>2]=q;H[f+8>>2]=(t<<2)+q;b=ra(q,0,a);H[f+4>>2]=b+a;c=t>>>0<=1?1:t;n=c&3;a=0;if(c-1>>>0>=3){o=c&-4;while(1){c=g<<2;H[c+b>>2]=a;x=c|4;a=H[c+e>>2]+a|0;H[x+b>>2]=a;y=c|8;a=a+H[e+x>>2]|0;H[y+b>>2]=a;c=c|12;a=a+H[e+y>>2]|0;H[c+b>>2]=a;a=a+H[c+e>>2]|0;g=g+4|0;p=p+4|0;if((o|0)!=(p|0)){continue}break}}if(!n){break s}while(1){c=g<<2;H[c+b>>2]=a;g=g+1|0;a=H[c+e>>2]+a|0;k=k+1|0;if((n|0)!=(k|0)){continue}break}}if(!i){break l}x=H[h+40>>2];y=H[h+12>>2];n=0;while(1){G=n<<2;a=G+j|0;k=-1;c=n+1|0;b=(c>>>0)%3|0?c:n-2|0;if((b|0)!=-1){k=H[(b<<2)+j>>2]}b=H[a>>2];t:{u:{if(!((n>>>0)%3|0)){p=-1;a=n+2|0;if((a|0)!=-1){p=H[(a<<2)+j>>2]}if(!((b|0)==(k|0)|(b|0)==(p|0))&(k|0)!=(p|0)){break u}x=x+1|0;H[h+40>>2]=x;c=n+3|0;break t}p=H[a-4>>2]}a=p<<2;A=H[a+e>>2];v:{w:{if((A|0)<=0){break w}a=H[a+q>>2];g=0;while(1){o=(a<<3)+d|0;z=H[o>>2];if((z|0)==-1){break w}x:{if((k|0)!=(z|0)){break x}o=H[o+4>>2];if((o|0)!=-1){z=H[(o<<2)+j>>2]}else{z=-1}if((z|0)==(b|0)){break x}while(1){y:{b=a;g=g+1|0;if((A|0)<=(g|0)){break y}a=b+1|0;J=(a<<3)+d|0;z=H[J>>2];K=(b<<3)+d|0;H[K+4>>2]=H[J+4>>2];H[K>>2]=z;if((z|0)!=-1){continue}}break}H[(b<<3)+d>>2]=-1;if((o|0)==-1){break w}H[y+G>>2]=o;H[y+(o<<2)>>2]=n;break v}a=a+1|0;g=g+1|0;if((A|0)!=(g|0)){continue}break}}a=k<<2;k=H[a+e>>2];if((k|0)<=0){break v}a=H[a+q>>2];g=0;while(1){b=(a<<3)+d|0;if(H[b>>2]==-1){H[b>>2]=p;H[b+4>>2]=n;break v}a=a+1|0;g=g+1|0;if((k|0)!=(g|0)){continue}break}}}n=c;if(n>>>0<i>>>0){continue}break}break l}break i}sa();v()}H[w>>2]=t;if(q){oa(q)}if(d){oa(d)}a=H[f+16>>2];if(!a){break j}H[f+20>>2]=a;oa(a)}ca=f+32|0;x=(w|0)!=0;if(x){k=ca-32|0;ca=k;a=H[h>>2];g=H[h+4>>2];H[k+24>>2]=0;H[k+16>>2]=0;H[k+20>>2]=0;if((a|0)==(g|0)){c=g}else{a=g-a|0;if((a|0)<0){break i}a=a>>2;b=(a-1>>>5|0)+1|0;c=pa(b<<2);H[k+24>>2]=b;H[k+20>>2]=0;H[k+16>>2]=c;Mc(k+16|0,a);g=H[h>>2];c=H[h+4>>2]}H[k+8>>2]=0;H[k>>2]=0;while(1){z:{o=0;i=0;if((c|0)==(g|0)){break z}while(1){b=H[k+16>>2];A:{if(H[b+(i>>>3&536870908)>>2]>>>i&1){break A}c=H[k>>2];H[k+4>>2]=c;e=H[h+12>>2];a=i;while(1){B:{f=a+1|0;d=a;a=(f>>>0)%3|0?f:a-2|0;if((a|0)==-1){break B}a=H[e+(a<<2)>>2];if((a|0)==-1){break B}f=a+1|0;a=(f>>>0)%3|0?f:a-2|0;if((i|0)==(a|0)|(a|0)==-1){break B}if(!(H[b+(a>>>3&536870908)>>2]>>>a&1)){continue}}break}j=d;C:{D:{E:{while(1){a=H[k+16>>2]+(j>>>3&536870908)|0;H[a>>2]=H[a>>2]|1<<j;a=j+1|0;f=(a>>>0)%3|0?a:j-2|0;g=H[h>>2];y=(j>>>0)%3|0;b=(y?-1:2)+j|0;n=H[k>>2];A=(n|0)==(c|0);F:{if(A){break F}w=H[(f<<2)+g>>2];q=H[h+12>>2];a=n;if((b|0)!=-1){e=q+(b<<2)|0;while(1){G:{if((w|0)!=H[a>>2]){break G}p=H[a+4>>2];t=H[e>>2];if((p|0)==(t|0)){break G}e=b;c=-1;a=-1;if((p|0)==-1){break C}break D}a=a+8|0;if((c|0)!=(a|0)){continue}break}break F}while(1){if((w|0)==H[a>>2]){t=-1;e=-1;p=H[a+4>>2];if((p|0)!=-1){break D}}a=a+8|0;if((c|0)!=(a|0)){continue}break}}b=H[(b<<2)+g>>2];H:{if(H[k+8>>2]!=(c|0)){H[c>>2]=b;H[c+4>>2]=f;c=c+8|0;H[k+4>>2]=c;break H}a=c-n|0;p=a>>3;e=p+1|0;if(e>>>0>=536870912){break i}g=a>>>2|0;g=a>>>0>=2147483640?536870911:e>>>0<g>>>0?g:e;if(g){if(g>>>0>=536870912){break E}e=pa(g<<3)}else{e=0}a=e+(p<<3)|0;H[a>>2]=b;H[a+4>>2]=f;b=a+8|0;if(!A){while(1){c=c-8|0;f=H[c+4>>2];a=a-8|0;H[a>>2]=H[c>>2];H[a+4>>2]=f;if((c|0)!=(n|0)){continue}break}c=H[k>>2]}H[k+8>>2]=e+(g<<3);H[k+4>>2]=b;H[k>>2]=a;if(c){oa(c)}c=b}I:{J:{if(y){a=j-1|0;break J}a=j+2|0;if((a|0)==-1){break I}}a=H[H[h+12>>2]+(a<<2)>>2];if((a|0)==-1){break I}j=a+((a>>>0)%3|0?-1:2)|0;if((d|0)==(j|0)){break I}if((j|0)!=-1){continue}}break}g=H[h>>2];break A}wa();v()}c=H[q+(p<<2)>>2];b=e;a=p}if((t|0)!=-1){H[q+(t<<2)>>2]=-1}if((c|0)!=-1){H[q+(c<<2)>>2]=-1}H[q+(b<<2)>>2]=-1;H[q+(a<<2)>>2]=-1;o=1}i=i+1|0;c=H[h+4>>2];if(i>>>0<c-g>>2>>>0){continue}break}if(o){continue}}break}a=H[k>>2];if(a){oa(a)}a=H[k+16>>2];if(a){oa(a)}ca=k+32|0;n=0;g=ca-32|0;ca=g;e=H[C+12>>2];H[h+36>>2]=e;p=h+24|0;b=H[h+24>>2];a=H[h+28>>2]-b>>2;K:{L:{if(a>>>0<e>>>0){qb(p,e-a|0,13652);H[g+24>>2]=0;H[g+16>>2]=0;H[g+20>>2]=0;break L}if(a>>>0>e>>>0){H[h+28>>2]=b+(e<<2)}H[g+24>>2]=0;H[g+16>>2]=0;H[g+20>>2]=0;if(!e){break K}}if((e|0)<0){break i}a=(e-1>>>5|0)+1|0;b=pa(a<<2);H[g+24>>2]=a;H[g+20>>2]=0;H[g+16>>2]=b;Mc(g+16|0,e)}a=H[h>>2];b=H[h+4>>2];H[g+8>>2]=0;H[g>>2]=0;H[g+4>>2]=0;M:{if((a|0)==(b|0)){a=b}else{a=b-a|0;if((a|0)<0){break i}a=a>>2;b=(a-1>>>5|0)+1|0;c=pa(b<<2);H[g+8>>2]=b;H[g+4>>2]=0;H[g>>2]=c;Mc(g,a);b=H[h>>2];a=H[h+4>>2]}if(a-b>>>0<12){break M}N:{while(1){q=N(n,3);d=(q<<2)+b|0;f=H[d>>2];c=-1;i=q+1|0;if((i|0)!=-1){c=H[(i<<2)+b>>2]}O:{if((c|0)==(f|0)){break O}i=f;f=H[d+8>>2];if((i|0)==(f|0)|(c|0)==(f|0)){break O}k=0;i=H[g>>2];while(1){f=k+q|0;if(!(H[(f>>>3&536870908)+i>>2]>>>f&1)){a=H[(f<<2)+b>>2];c=1<<a;d=H[g+16>>2];b=a>>>5|0;i=H[d+(b<<2)>>2];t=c&i;if(t){c=H[h+28>>2];P:{if((c|0)!=H[h+32>>2]){H[c>>2]=-1;H[h+28>>2]=c+4;break P}i=H[p>>2];b=c-i|0;o=b>>2;d=o+1|0;if(d>>>0>=1073741824){break i}j=b>>>1|0;j=b>>>0>=2147483644?1073741823:d>>>0<j>>>0?j:d;if(j){if(j>>>0>=1073741824){break N}b=pa(j<<2)}else{b=0}d=b+(o<<2)|0;H[d>>2]=-1;o=d+4|0;if((c|0)!=(i|0)){while(1){d=d-4|0;c=c-4|0;H[d>>2]=H[c>>2];if((c|0)!=(i|0)){continue}break}}H[h+32>>2]=b+(j<<2);H[h+28>>2]=o;H[h+24>>2]=d;if(!i){break P}oa(i)}c=H[h+52>>2];Q:{if((c|0)!=H[h+56>>2]){H[c>>2]=a;H[h+52>>2]=c+4;break Q}i=H[h+48>>2];b=c-i|0;o=b>>2;d=o+1|0;if(d>>>0>=1073741824){break i}j=b>>>1|0;j=b>>>0>=2147483644?1073741823:d>>>0<j>>>0?j:d;if(j){if(j>>>0>=1073741824){break N}b=pa(j<<2)}else{b=0}d=b+(o<<2)|0;H[d>>2]=a;a=d+4|0;if((c|0)!=(i|0)){while(1){d=d-4|0;c=c-4|0;H[d>>2]=H[c>>2];if((c|0)!=(i|0)){continue}break}}H[h+56>>2]=b+(j<<2);H[h+52>>2]=a;H[h+48>>2]=d;if(!i){break Q}oa(i)}c=H[g+20>>2];a=H[g+24>>2];if((c|0)==a<<5){if((c+1|0)<0){break i}b=g+16|0;if(c>>>0<=1073741822){a=a<<6;c=(c&-32)+32|0;a=a>>>0>c>>>0?a:c}else{a=2147483647}pb(b,a);c=H[g+20>>2]}H[g+20>>2]=c+1;d=H[g+16>>2];a=d+(c>>>3&536870908)|0;b=H[a>>2];M=a,O=Vj(c)&b,H[M>>2]=O;c=1<<e;b=e>>>5|0;i=H[(b<<2)+d>>2];a=e;e=a+1|0}H[(b<<2)+d>>2]=c|i;o=H[h+24>>2]+(a<<2)|0;j=H[h+12>>2];b=H[h>>2];i=H[g>>2];c=f;R:{S:{T:{while(1){if((c|0)==-1){break T}d=(c>>>3&536870908)+i|0;H[d>>2]=H[d>>2]|1<<c;H[o>>2]=c;if(t){H[(c<<2)+b>>2]=a}w=c+1|0;c=(w>>>0)%3|0?w:c-2|0;d=-1;U:{if((c|0)==-1){break U}c=H[j+(c<<2)>>2];d=-1;if((c|0)==-1){break U}d=c+1|0;d=(d>>>0)%3|0?d:c-2|0}c=d;if((f|0)!=(c|0)){continue}break}if((f|0)!=-1){break R}c=1;break S}if((f>>>0)%3|0){c=f-1|0;break S}c=f+2|0;if((c|0)==-1){break R}}c=H[j+(c<<2)>>2];if((c|0)==-1){break R}V:{if((c>>>0)%3|0){c=c-1|0;break V}c=c+2|0;if((c|0)==-1){break R}}f=H[h+12>>2];b=H[h>>2];while(1){d=(c>>>3&536870908)+i|0;H[d>>2]=H[d>>2]|1<<c;if(t){H[(c<<2)+b>>2]=a}W:{if((c>>>0)%3|0){c=c-1|0;break W}c=c+2|0;if((c|0)==-1){break R}}c=H[f+(c<<2)>>2];if((c|0)==-1){break R}c=c+((c>>>0)%3|0?-1:2)|0;if((c|0)!=-1){continue}break}}}k=k+1|0;if((k|0)!=3){continue}break}b=H[h>>2];a=H[h+4>>2]}n=n+1|0;if(n>>>0<(a-b>>2>>>0)/3>>>0){continue}break}break M}wa();v()}c=0;H[h+44>>2]=0;a=H[g+16>>2];b=H[g+20>>2];if(b){e=b&31;b=(b>>>3&536870908)+a|0;d=a;i=0;while(1){if(!(H[d>>2]>>>c&1)){i=i+1|0;H[h+44>>2]=i}f=(c|0)==31;c=f?0:c+1|0;d=(f<<2)+d|0;if((b|0)!=(d|0)|(c|0)!=(e|0)){continue}break}}b=H[g>>2];if(b){oa(b);a=H[g+16>>2]}if(a){oa(a)}ca=g+32|0}ca=C+16|0;if(!x){H[E+8>>2]=0;cb(h);h=0}ca=E+16|0;a=h;break h}sa();v()}b=H[s>>2];if(!b){break d}H[s+4>>2]=b;oa(b)}ca=s+16|0;break b}sa();v()}c=H[l+4>>2];b=a;H[l+4>>2]=a;if(c){cb(c);b=H[l+4>>2]}X:{if(!b){break X}a=H[u+100>>2];c=H[u+96>>2];F[r+12|0]=0;Oa(l+56|0,(a-c|0)/12|0,r+12|0);a=H[u+100>>2];c=H[u+96>>2];if((a|0)==(c|0)){break X}while(1){if(!(H[H[l+56>>2]+(D>>>3&536870908)>>2]>>>D&1)){a=N(D,3);Gc(l,0,a);c=H[l+8>>2];e=H[l+12>>2];Gc(l,1,a+1|0);f=H[l+20>>2];d=H[l+24>>2];Gc(l,2,a+2|0);n=(c|0)==(e|0)?-1:0;a=d-f>>2;c=e-c>>2;e=a>>>0>c>>>0;c=H[l+36>>2]-H[l+32>>2]>>2>>>0>(e?a:c)>>>0?2:e?1:n;Y:{if(H[l+68>>2]<=0){break Y}H[r+12>>2]=H[l+76>>2];H[r+8>>2]=m;bb(r+8|0,r+12|0);a=H[((c<<2)+l|0)+44>>2];if((a|0)<0){a=-1}else{e=(a>>>0)/3|0;a=H[(H[H[l>>2]+96>>2]+N(e,12)|0)+(a-N(e,3)<<2)>>2]}H[r+12>>2]=a;H[r+8>>2]=m;bb(r+8|0,r+12|0);e=H[l+72>>2];H[l+72>>2]=e+2;if(!(e&1)){break Y}H[r+12>>2]=a;H[r+8>>2]=m;bb(r+8|0,r+12|0);H[l+72>>2]=H[l+72>>2]+1}d=0;e=ca-16|0;ca=e;H[l+68>>2]=H[l+68>>2]+1;a=N(c,12)+l|0;a=H[a+12>>2]-H[a+8>>2]|0;if((a|0)>0){a=a>>>2|0;h=a>>>0<=1?1:a;c=H[((c<<2)+l|0)+44>>2];while(1){a=c;f=(a>>>0)/3|0;c=(a|0)==-1;g=c?-1:f;i=H[l+56>>2]+(g>>>3&536870908)|0;H[i>>2]=H[i>>2]|1<<g;H[l+72>>2]=H[l+72>>2]+1;Z:{_:{$:{aa:{ba:{if(!d){ca:{if((a|0)>=0){H[e+12>>2]=H[(H[H[l>>2]+96>>2]+N(f,12)|0)+((a>>>0)%3<<2)>>2];H[e+8>>2]=m;bb(e+8|0,e+12|0);break ca}H[e+12>>2]=-1;H[e+8>>2]=m;bb(e+8|0,e+12|0);if(c){break ba}}c=-1;f=a+1|0;f=(f>>>0)%3|0?f:a-2|0;if((f|0)>=0){g=(f>>>0)/3|0;f=H[(H[H[l>>2]+96>>2]+N(g,12)|0)+(f-N(g,3)<<2)>>2]}else{f=-1}H[e+12>>2]=f;H[e+8>>2]=m;bb(e+8|0,e+12|0);f=((a>>>0)%3|0?-1:2)+a|0;if((f|0)<0){break aa}c=(f>>>0)/3|0;c=H[(H[H[l>>2]+96>>2]+N(c,12)|0)+(f-N(c,3)<<2)>>2];break aa}c=(a|0)<0?-1:H[(H[H[l>>2]+96>>2]+N(f,12)|0)+((a>>>0)%3<<2)>>2];H[l+76>>2]=c;H[e+12>>2]=c;H[e+8>>2]=m;bb(e+8|0,e+12|0);if(d&1){c=-1;if((a|0)==-1){break Z}if((N(f,3)|0)!=(a|0)){a=a-1|0;break _}a=a+2|0;break $}c=-1;if((a|0)==-1){break Z}c=a+1|0;a=(c>>>0)%3|0?c:a-2|0;break $}c=-1;H[e+12>>2]=-1;H[e+8>>2]=m;bb(e+8|0,e+12|0)}H[l+76>>2]=c;H[e+12>>2]=c;H[e+8>>2]=m;bb(e+8|0,e+12|0)}c=-1;if((a|0)==-1){break Z}}c=H[H[H[l+4>>2]+12>>2]+(a<<2)>>2]}d=d+1|0;if((h|0)!=(d|0)){continue}break}}ca=e+16|0;c=H[u+96>>2];a=H[u+100>>2]}D=D+1|0;if(D>>>0<(a-c|0)/12>>>0){continue}break}}ca=r+16|0;da:{if(b){a=H[B>>2];if(a){H[B+4>>2]=a;oa(a)}H[B>>2]=H[m>>2];H[B+4>>2]=H[m+4>>2];H[B+8>>2]=H[m+8>>2];L=H[m+84>>2];break da}a=H[m>>2];if(!a){break da}H[m+4>>2]=a;oa(a)}a=H[m+72>>2];if(a){oa(a)}a=H[m+48>>2];if(a){H[m+52>>2]=a;oa(a)}a=H[m+36>>2];if(a){H[m+40>>2]=a;oa(a)}a=H[m+24>>2];if(a){H[m+28>>2]=a;oa(a)}a=H[m+20>>2];H[m+20>>2]=0;if(a){cb(a)}ca=m+96|0;return L|0}function qg(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;i=b;a=0;b=0;a:{b:{switch(d-1|0){case 0:j=H[i+80>>2];h=I[c+24|0];c:{if((N(j,h)|0)!=(e|0)){break c}d=H[c+28>>2]!=1;b=I[c+84|0];if(!(d|!b)){qa(f,H[H[c>>2]>>2]+H[c+48>>2]|0,e);b=1;break c}if(h){a=pa(h);ra(a,0,h)}d:{if(!j){b=1;break d}if(!d){if(h){d=0;e=0;while(1){i=d+f|0;k=H[H[c>>2]>>2];m=H[c+48>>2];g=H[c+40>>2];b=Rj(g,H[c+44>>2],I[c+84|0]?e:H[H[c+68>>2]+(e<<2)>>2],0);n=b;b=b+m|0;qa(i,qa(a,b+k|0,g),h);d=d+h|0;b=1;e=e+1|0;if((j|0)!=(e|0)){continue}break}break d}if(b){b=1;h=H[c>>2];e=H[c+48>>2];f=H[c+40>>2];i=H[c+44>>2];if((j|0)!=1){g=j&-2;c=0;d=0;while(1){k=H[h>>2];m=Rj(f,i,c,0)+e|0;k=qa(a,k+m|0,f);m=H[h>>2];n=Rj(f,i,c|1,0)+e|0;qa(k,m+n|0,f);c=c+2|0;d=d+2|0;if((g|0)!=(d|0)){continue}break}g=c}if(!(j&1)){break d}c=H[h>>2];d=Rj(g,0,f,i)+e|0;qa(a,c+d|0,f);break d}b=1;h=H[c>>2];e=H[c+48>>2];g=H[c+68>>2];f=H[c+40>>2];i=H[c+44>>2];c=0;if((j|0)!=1){k=j&-2;d=0;while(1){m=H[h>>2];n=c<<2;l=Rj(f,i,H[n+g>>2],0)+e|0;m=qa(a,m+l|0,f);l=H[h>>2];n=Rj(f,i,H[g+(n|4)>>2],0)+e|0;qa(m,l+n|0,f);c=c+2|0;d=d+2|0;if((k|0)!=(d|0)){continue}break}}if(!(j&1)){break d}d=H[h>>2];c=Rj(f,i,H[g+(c<<2)>>2],0)+e|0;qa(a,c+d|0,f);break d}b=0;if(!h){d=0;while(1){if(!ic(c,I[c+84|0]?d:H[H[c+68>>2]+(d<<2)>>2],F[c+24|0],a)){break d}d=d+1|0;b=j>>>0<=d>>>0;if((d|0)!=(j|0)){continue}break}break d}d=0;e=0;while(1){if(!ic(c,I[c+84|0]?e:H[H[c+68>>2]+(e<<2)>>2],F[c+24|0],a)){break d}qa(d+f|0,a,h);d=d+h|0;e=e+1|0;b=j>>>0<=e>>>0;if((e|0)!=(j|0)){continue}break}}if(!a){break c}oa(a)}break a;case 2:n=I[c+24|0];l=n<<1;j=H[i+80>>2];e:{if((N(l,j)|0)!=(e|0)){break e}i=H[c+28>>2]!=3;d=I[c+84|0];if(!(i|!d)){qa(f,H[H[c>>2]>>2]+H[c+48>>2]|0,e);a=1;break e}f:{if(!n){e=0;break f}e=pa(l);ra(e,0,l)}g:{if(!j){a=1;break g}if(!i){o=H[c+68>>2];k=H[c>>2];b=H[c+48>>2];i=H[c+40>>2];m=H[c+44>>2];if(n){if(!d){c=0;d=0;while(1){a=1;g=H[k>>2];p=Rj(i,m,H[o+(d<<2)>>2],0)+b|0;qa((c<<1)+f|0,qa(e,g+p|0,i),l);c=c+n|0;d=d+1|0;if((j|0)!=(d|0)){continue}break}break g}c=0;while(1){a=1;o=H[k>>2];p=Rj(g,h,i,m)+b|0;qa((c<<1)+f|0,qa(e,o+p|0,i),l);c=c+n|0;d=h;g=g+1|0;d=g?d:d+1|0;h=d;if((j|0)!=(g|0)|d){continue}break}break g}if(!d){a=1;c=0;if((j|0)!=1){f=j&-2;d=0;while(1){h=H[k>>2];g=c<<2;n=Rj(i,m,H[g+o>>2],0)+b|0;h=qa(e,h+n|0,i);n=H[k>>2];g=Rj(i,m,H[o+(g|4)>>2],0)+b|0;qa(h,g+n|0,i);c=c+2|0;d=d+2|0;if((f|0)!=(d|0)){continue}break}}if(!(j&1)){break g}d=H[k>>2];b=Rj(i,m,H[o+(c<<2)>>2],0)+b|0;qa(e,b+d|0,i);break g}n=j&1;a=1;if((j|0)!=1){j=j&-2;f=0;c=0;while(1){d=H[k>>2];l=Rj(g,h,i,m)+b|0;d=qa(e,d+l|0,i);l=H[k>>2];o=Rj(i,m,g|1,h)+b|0;qa(d,l+o|0,i);g=g+2|0;h=g>>>0<2?h+1|0:h;f=f+2|0;d=f>>>0<2?c+1|0:c;c=d;if((f|0)!=(j|0)|c){continue}break}}if(!n){break g}c=H[k>>2];b=Rj(g,h,i,m)+b|0;qa(e,b+c|0,i);break g}if(!n){d=0;while(1){if(!gc(c,I[c+84|0]?d:H[H[c+68>>2]+(d<<2)>>2],F[c+24|0],e)){break g}d=d+1|0;a=j>>>0<=d>>>0;if((d|0)!=(j|0)){continue}break}break g}d=0;while(1){if(!gc(c,I[c+84|0]?d:H[H[c+68>>2]+(d<<2)>>2],F[c+24|0],e)){break g}qa((b<<1)+f|0,e,l);b=b+n|0;d=d+1|0;a=j>>>0<=d>>>0;if((d|0)!=(j|0)){continue}break}}if(!e){break e}oa(e)}b=a;break a;case 4:l=I[c+24|0];o=l<<2;j=H[i+80>>2];h:{if((N(o,j)|0)!=(e|0)){break h}i=H[c+28>>2]!=5;d=I[c+84|0];if(!(i|!d)){qa(f,H[H[c>>2]>>2]+H[c+48>>2]|0,e);b=1;break h}i:{if(!l){e=0;break i}e=pa(o);ra(e,0,o)}b=1;j:{if(!j){break j}if(!i){a=H[c+68>>2];m=H[c>>2];i=H[c+48>>2];k=H[c+40>>2];n=H[c+44>>2];if(l){if(!d){c=0;d=0;while(1){g=H[m>>2];p=Rj(k,n,H[a+(d<<2)>>2],0)+i|0;qa((c<<2)+f|0,qa(e,g+p|0,k),o);c=c+l|0;d=d+1|0;if((j|0)!=(d|0)){continue}break}break j}c=0;while(1){d=H[m>>2];p=Rj(g,h,k,n)+i|0;qa((c<<2)+f|0,qa(e,d+p|0,k),o);c=c+l|0;g=g+1|0;a=g?h:h+1|0;h=a;if((j|0)!=(g|0)|h){continue}break}break j}if(!d){c=0;if((j|0)!=1){f=j&-2;d=0;while(1){h=H[m>>2];g=c<<2;l=Rj(k,n,H[g+a>>2],0)+i|0;h=qa(e,h+l|0,k);l=H[m>>2];g=Rj(k,n,H[a+(g|4)>>2],0)+i|0;qa(h,g+l|0,k);c=c+2|0;d=d+2|0;if((f|0)!=(d|0)){continue}break}}if(!(j&1)){break j}d=H[m>>2];a=Rj(k,n,H[a+(c<<2)>>2],0)+i|0;qa(e,a+d|0,k);break j}l=j&1;if((j|0)!=1){j=j&-2;f=0;c=0;while(1){a=H[m>>2];d=Rj(g,h,k,n)+i|0;a=qa(e,a+d|0,k);d=H[m>>2];o=Rj(k,n,g|1,h)+i|0;qa(a,d+o|0,k);d=h;g=g+2|0;h=g>>>0<2?d+1|0:d;f=f+2|0;a=f>>>0<2?c+1|0:c;c=a;if((f|0)!=(j|0)|c){continue}break}}if(!l){break j}a=H[m>>2];c=Rj(g,h,k,n)+i|0;qa(e,a+c|0,k);break j}b=0;if(!l){d=0;while(1){if(!ec(c,I[c+84|0]?d:H[H[c+68>>2]+(d<<2)>>2],F[c+24|0],e)){break j}d=d+1|0;b=j>>>0<=d>>>0;if((d|0)!=(j|0)){continue}break}break j}d=0;while(1){if(!ec(c,I[c+84|0]?d:H[H[c+68>>2]+(d<<2)>>2],F[c+24|0],e)){break j}qa((a<<2)+f|0,e,o);a=a+l|0;d=d+1|0;b=j>>>0<=d>>>0;if((d|0)!=(j|0)){continue}break}}if(!e){break h}oa(e)}break a;case 1:j=H[i+80>>2];h=I[c+24|0];k:{if((N(j,h)|0)!=(e|0)){break k}d=H[c+28>>2]!=2;b=I[c+84|0];if(!(d|!b)){qa(f,H[H[c>>2]>>2]+H[c+48>>2]|0,e);b=1;break k}if(h){a=pa(h);ra(a,0,h)}l:{if(!j){b=1;break l}if(!d){if(h){d=0;e=0;while(1){i=d+f|0;k=H[H[c>>2]>>2];m=H[c+48>>2];g=H[c+40>>2];b=Rj(g,H[c+44>>2],I[c+84|0]?e:H[H[c+68>>2]+(e<<2)>>2],0);n=b;b=b+m|0;qa(i,qa(a,b+k|0,g),h);d=d+h|0;b=1;e=e+1|0;if((j|0)!=(e|0)){continue}break}break l}if(b){b=1;h=H[c>>2];e=H[c+48>>2];f=H[c+40>>2];i=H[c+44>>2];if((j|0)!=1){g=j&-2;c=0;d=0;while(1){k=H[h>>2];m=Rj(f,i,c,0)+e|0;k=qa(a,k+m|0,f);m=H[h>>2];n=Rj(f,i,c|1,0)+e|0;qa(k,m+n|0,f);c=c+2|0;d=d+2|0;if((g|0)!=(d|0)){continue}break}g=c}if(!(j&1)){break l}c=H[h>>2];d=Rj(g,0,f,i)+e|0;qa(a,c+d|0,f);break l}b=1;h=H[c>>2];e=H[c+48>>2];g=H[c+68>>2];f=H[c+40>>2];i=H[c+44>>2];c=0;if((j|0)!=1){k=j&-2;d=0;while(1){m=H[h>>2];n=c<<2;l=Rj(f,i,H[n+g>>2],0)+e|0;m=qa(a,m+l|0,f);l=H[h>>2];n=Rj(f,i,H[g+(n|4)>>2],0)+e|0;qa(m,l+n|0,f);c=c+2|0;d=d+2|0;if((k|0)!=(d|0)){continue}break}}if(!(j&1)){break l}d=H[h>>2];c=Rj(f,i,H[g+(c<<2)>>2],0)+e|0;qa(a,c+d|0,f);break l}b=0;if(!h){d=0;while(1){if(!hc(c,I[c+84|0]?d:H[H[c+68>>2]+(d<<2)>>2],F[c+24|0],a)){break l}d=d+1|0;b=j>>>0<=d>>>0;if((d|0)!=(j|0)){continue}break}break l}d=0;e=0;while(1){if(!hc(c,I[c+84|0]?e:H[H[c+68>>2]+(e<<2)>>2],F[c+24|0],a)){break l}qa(d+f|0,a,h);d=d+h|0;e=e+1|0;b=j>>>0<=e>>>0;if((e|0)!=(j|0)){continue}break}}if(!a){break k}oa(a)}break a;case 3:n=I[c+24|0];l=n<<1;j=H[i+80>>2];m:{if((N(l,j)|0)!=(e|0)){break m}i=H[c+28>>2]!=4;d=I[c+84|0];if(!(i|!d)){qa(f,H[H[c>>2]>>2]+H[c+48>>2]|0,e);a=1;break m}n:{if(!n){e=0;break n}e=pa(l);ra(e,0,l)}o:{if(!j){a=1;break o}if(!i){o=H[c+68>>2];k=H[c>>2];b=H[c+48>>2];i=H[c+40>>2];m=H[c+44>>2];if(n){if(!d){c=0;d=0;while(1){a=1;g=H[k>>2];p=Rj(i,m,H[o+(d<<2)>>2],0)+b|0;qa((c<<1)+f|0,qa(e,g+p|0,i),l);c=c+n|0;d=d+1|0;if((j|0)!=(d|0)){continue}break}break o}c=0;while(1){a=1;o=H[k>>2];p=Rj(g,h,i,m)+b|0;qa((c<<1)+f|0,qa(e,o+p|0,i),l);c=c+n|0;d=h;g=g+1|0;d=g?d:d+1|0;h=d;if((j|0)!=(g|0)|d){continue}break}break o}if(!d){a=1;c=0;if((j|0)!=1){f=j&-2;d=0;while(1){h=H[k>>2];g=c<<2;n=Rj(i,m,H[g+o>>2],0)+b|0;h=qa(e,h+n|0,i);n=H[k>>2];g=Rj(i,m,H[o+(g|4)>>2],0)+b|0;qa(h,g+n|0,i);c=c+2|0;d=d+2|0;if((f|0)!=(d|0)){continue}break}}if(!(j&1)){break o}d=H[k>>2];b=Rj(i,m,H[o+(c<<2)>>2],0)+b|0;qa(e,b+d|0,i);break o}n=j&1;a=1;if((j|0)!=1){j=j&-2;f=0;c=0;while(1){d=H[k>>2];l=Rj(g,h,i,m)+b|0;d=qa(e,d+l|0,i);l=H[k>>2];o=Rj(i,m,g|1,h)+b|0;qa(d,l+o|0,i);g=g+2|0;h=g>>>0<2?h+1|0:h;f=f+2|0;d=f>>>0<2?c+1|0:c;c=d;if((f|0)!=(j|0)|c){continue}break}}if(!n){break o}c=H[k>>2];b=Rj(g,h,i,m)+b|0;qa(e,b+c|0,i);break o}if(!n){d=0;while(1){if(!fc(c,I[c+84|0]?d:H[H[c+68>>2]+(d<<2)>>2],F[c+24|0],e)){break o}d=d+1|0;a=j>>>0<=d>>>0;if((d|0)!=(j|0)){continue}break}break o}d=0;while(1){if(!fc(c,I[c+84|0]?d:H[H[c+68>>2]+(d<<2)>>2],F[c+24|0],e)){break o}qa((b<<1)+f|0,e,l);b=b+n|0;d=d+1|0;a=j>>>0<=d>>>0;if((d|0)!=(j|0)){continue}break}}if(!e){break m}oa(e)}b=a;break a;case 5:l=I[c+24|0];o=l<<2;j=H[i+80>>2];p:{if((N(o,j)|0)!=(e|0)){break p}i=H[c+28>>2]!=6;d=I[c+84|0];if(!(i|!d)){qa(f,H[H[c>>2]>>2]+H[c+48>>2]|0,e);b=1;break p}q:{if(!l){e=0;break q}e=pa(o);ra(e,0,o)}b=1;r:{if(!j){break r}if(!i){a=H[c+68>>2];m=H[c>>2];i=H[c+48>>2];k=H[c+40>>2];n=H[c+44>>2];if(l){if(!d){c=0;d=0;while(1){g=H[m>>2];p=Rj(k,n,H[a+(d<<2)>>2],0)+i|0;qa((c<<2)+f|0,qa(e,g+p|0,k),o);c=c+l|0;d=d+1|0;if((j|0)!=(d|0)){continue}break}break r}c=0;while(1){d=H[m>>2];p=Rj(g,h,k,n)+i|0;qa((c<<2)+f|0,qa(e,d+p|0,k),o);c=c+l|0;g=g+1|0;a=g?h:h+1|0;h=a;if((j|0)!=(g|0)|h){continue}break}break r}if(!d){c=0;if((j|0)!=1){f=j&-2;d=0;while(1){h=H[m>>2];g=c<<2;l=Rj(k,n,H[g+a>>2],0)+i|0;h=qa(e,h+l|0,k);l=H[m>>2];g=Rj(k,n,H[a+(g|4)>>2],0)+i|0;qa(h,g+l|0,k);c=c+2|0;d=d+2|0;if((f|0)!=(d|0)){continue}break}}if(!(j&1)){break r}d=H[m>>2];a=Rj(k,n,H[a+(c<<2)>>2],0)+i|0;qa(e,a+d|0,k);break r}l=j&1;if((j|0)!=1){j=j&-2;f=0;c=0;while(1){a=H[m>>2];d=Rj(g,h,k,n)+i|0;a=qa(e,a+d|0,k);d=H[m>>2];o=Rj(k,n,g|1,h)+i|0;qa(a,d+o|0,k);d=h;g=g+2|0;h=g>>>0<2?d+1|0:d;f=f+2|0;a=f>>>0<2?c+1|0:c;c=a;if((f|0)!=(j|0)|c){continue}break}}if(!l){break r}a=H[m>>2];c=Rj(g,h,k,n)+i|0;qa(e,a+c|0,k);break r}b=0;if(!l){d=0;while(1){if(!dc(c,I[c+84|0]?d:H[H[c+68>>2]+(d<<2)>>2],F[c+24|0],e)){break r}d=d+1|0;b=j>>>0<=d>>>0;if((d|0)!=(j|0)){continue}break}break r}d=0;while(1){if(!dc(c,I[c+84|0]?d:H[H[c+68>>2]+(d<<2)>>2],F[c+24|0],e)){break r}qa((a<<2)+f|0,e,o);a=a+l|0;d=d+1|0;b=j>>>0<=d>>>0;if((d|0)!=(j|0)){continue}break}}if(!e){break p}oa(e)}break a;case 8:p=I[c+24|0];q=p<<2;k=H[i+80>>2];s:{if((N(q,k)|0)!=(e|0)){break s}i=H[c+28>>2];t:{if(!p){break t}a=pa(q);d=a;m=q-4|0;l=(m>>>2|0)+1&7;if(l){e=0;while(1){H[d>>2]=-1073741824;d=d+4|0;e=e+1|0;if((l|0)!=(e|0)){continue}break}}if(m>>>0<28){break t}e=(p<<2)+a|0;while(1){H[d+24>>2]=-1073741824;H[d+28>>2]=-1073741824;H[d+16>>2]=-1073741824;H[d+20>>2]=-1073741824;H[d+8>>2]=-1073741824;H[d+12>>2]=-1073741824;H[d>>2]=-1073741824;H[d+4>>2]=-1073741824;d=d+32|0;if((e|0)!=(d|0)){continue}break}}u:{if(!k){b=1;break u}if((i|0)==9){r=H[c+68>>2];l=H[c>>2];i=H[c+48>>2];s=I[c+84|0];m=H[c+44>>2];c=H[c+40>>2];o=c;if(p){e=0;d=0;while(1){h=(e<<2)+f|0;g=H[l>>2];b=Rj(c,m,s?d:H[r+(d<<2)>>2],0)+i|0;qa(h,qa(a,b+g|0,o),q);e=e+p|0;b=1;d=d+1|0;if((k|0)!=(d|0)){continue}break}break u}if(!s){b=1;d=0;if((k|0)!=1){f=k&-2;e=0;while(1){h=H[l>>2];g=d<<2;j=Rj(c,m,H[g+r>>2],0)+i|0;h=qa(a,h+j|0,o);j=H[l>>2];g=Rj(c,m,H[r+(g|4)>>2],0)+i|0;qa(h,j+g|0,o);d=d+2|0;e=e+2|0;if((f|0)!=(e|0)){continue}break}}if(!(k&1)){break u}e=H[l>>2];c=Rj(c,m,H[r+(d<<2)>>2],0)+i|0;qa(a,c+e|0,o);break u}f=k&1;b=1;if((k|0)!=1){k=k&-2;while(1){d=H[l>>2];e=Rj(g,h,c,m)+i|0;d=qa(a,d+e|0,o);e=H[l>>2];p=Rj(c,m,g|1,h)+i|0;qa(d,e+p|0,o);g=g+2|0;h=g>>>0<2?h+1|0:h;d=j;e=n+2|0;d=e>>>0<2?d+1|0:d;n=e;j=d;if((e|0)!=(k|0)|d){continue}break}}if(!f){break u}d=H[l>>2];c=Rj(g,h,c,m)+i|0;qa(a,c+d|0,o);break u}if(!p){d=0;while(1){if(!Va(c,I[c+84|0]?d:H[H[c+68>>2]+(d<<2)>>2],F[c+24|0],a)){break u}d=d+1|0;b=k>>>0<=d>>>0;if((d|0)!=(k|0)){continue}break}break u}e=0;d=0;while(1){if(!Va(c,I[c+84|0]?d:H[H[c+68>>2]+(d<<2)>>2],F[c+24|0],a)){break u}qa((e<<2)+f|0,a,q);e=e+p|0;d=d+1|0;b=k>>>0<=d>>>0;if((d|0)!=(k|0)){continue}break}}if(!a){break s}oa(a)}a=b;break;default:break b}}b=a}return b|0}function ef(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;i=ca-48|0;ca=i;a:{b:{if((c|0)!=1){break b}c=H[a+4>>2];g=H[a+12>>2];H[i+40>>2]=0;a=i;H[a+32>>2]=0;H[a+36>>2]=0;H[a+24>>2]=0;H[a+28>>2]=0;H[a+16>>2]=0;H[a+20>>2]=0;H[a+8>>2]=0;H[a+12>>2]=0;e=a+8|0;c:{if((b|0)==-2){break c}l=H[H[H[c+4>>2]+8>>2]+(g<<2)>>2];if((ea[H[H[c>>2]+8>>2]](c)|0)==1){a=J[c+36>>1];j=(a<<8|a>>>8)&65535;a=0;h=ca-32|0;ca=h;d=H[H[H[c+4>>2]+8>>2]+(g<<2)>>2];d:{if((ea[H[H[c>>2]+8>>2]](c)|0)!=1|b-1>>>0>5){break d}k=ea[H[H[c>>2]+36>>2]](c)|0;f=ea[H[H[c>>2]+44>>2]](c,g)|0;if(!k|!f){break d}a=ea[H[H[c>>2]+40>>2]](c,g)|0;if(a){c=H[c+44>>2];H[h+12>>2]=a;H[h+8>>2]=c;H[h+20>>2]=f;H[h+16>>2]=f+12;c=h+8|0;a=0;e:{f:{switch(b-1|0){case 0:a=pa(60);H[a+4>>2]=d;H[a>>2]=3272;b=H[e+4>>2];H[a+8>>2]=H[e>>2];H[a+12>>2]=b;b=H[e+12>>2];H[a+16>>2]=H[e+8>>2];H[a+20>>2]=b;b=H[e+20>>2];H[a+24>>2]=H[e+16>>2];H[a+28>>2]=b;H[a+40>>2]=0;H[a+32>>2]=0;H[a+36>>2]=0;d=H[e+24>>2];f=H[e+28>>2];if((d|0)!=(f|0)){g=f-d|0;if((g|0)<0){break a}b=pa(g);H[a+32>>2]=b;H[a+40>>2]=(g&-4)+b;while(1){H[b>>2]=H[d>>2];b=b+4|0;d=d+4|0;if((f|0)!=(d|0)){continue}break}H[a+36>>2]=b}b=H[c+4>>2];H[a+44>>2]=H[c>>2];H[a+48>>2]=b;b=H[c+12>>2];H[a+52>>2]=H[c+8>>2];H[a+56>>2]=b;H[a>>2]=2564;break e;case 1:a=pa(60);H[a+4>>2]=d;H[a>>2]=3272;b=H[e+4>>2];H[a+8>>2]=H[e>>2];H[a+12>>2]=b;b=H[e+12>>2];H[a+16>>2]=H[e+8>>2];H[a+20>>2]=b;b=H[e+20>>2];H[a+24>>2]=H[e+16>>2];H[a+28>>2]=b;H[a+40>>2]=0;H[a+32>>2]=0;H[a+36>>2]=0;d=H[e+24>>2];f=H[e+28>>2];if((d|0)!=(f|0)){g=f-d|0;if((g|0)<0){break a}b=pa(g);H[a+32>>2]=b;H[a+40>>2]=(g&-4)+b;while(1){H[b>>2]=H[d>>2];b=b+4|0;d=d+4|0;if((f|0)!=(d|0)){continue}break}H[a+36>>2]=b}b=H[c+4>>2];H[a+44>>2]=H[c>>2];H[a+48>>2]=b;b=H[c+12>>2];H[a+52>>2]=H[c+8>>2];H[a+56>>2]=b;H[a>>2]=3328;break e;case 3:a=pa(112);H[a+4>>2]=d;H[a>>2]=3272;b=H[e+4>>2];H[a+8>>2]=H[e>>2];H[a+12>>2]=b;b=H[e+12>>2];H[a+16>>2]=H[e+8>>2];H[a+20>>2]=b;b=H[e+20>>2];H[a+24>>2]=H[e+16>>2];H[a+28>>2]=b;H[a+40>>2]=0;H[a+32>>2]=0;H[a+36>>2]=0;d=H[e+24>>2];f=H[e+28>>2];if((d|0)!=(f|0)){g=f-d|0;if((g|0)<0){break a}b=pa(g);H[a+32>>2]=b;H[a+40>>2]=(g&-4)+b;while(1){H[b>>2]=H[d>>2];b=b+4|0;d=d+4|0;if((f|0)!=(d|0)){continue}break}H[a+36>>2]=b}b=H[c+4>>2];H[a+44>>2]=H[c>>2];H[a+48>>2]=b;b=H[c+12>>2];H[a+52>>2]=H[c+8>>2];H[a+56>>2]=b;H[a+60>>2]=0;H[a+64>>2]=0;H[a>>2]=3564;H[a+68>>2]=0;H[a+72>>2]=0;H[a+76>>2]=0;H[a+80>>2]=0;H[a+84>>2]=0;H[a+88>>2]=0;H[a+92>>2]=0;H[a+96>>2]=0;H[a+100>>2]=0;H[a+104>>2]=0;H[a+108>>2]=0;break e;case 2:a=pa(92);H[a+4>>2]=d;H[a>>2]=3272;b=H[e+4>>2];H[a+8>>2]=H[e>>2];H[a+12>>2]=b;b=H[e+12>>2];H[a+16>>2]=H[e+8>>2];H[a+20>>2]=b;b=H[e+20>>2];H[a+24>>2]=H[e+16>>2];H[a+28>>2]=b;H[a+40>>2]=0;H[a+32>>2]=0;H[a+36>>2]=0;d=H[e+24>>2];f=H[e+28>>2];if((d|0)!=(f|0)){g=f-d|0;if((g|0)<0){break a}b=pa(g);H[a+32>>2]=b;H[a+40>>2]=(g&-4)+b;while(1){H[b>>2]=H[d>>2];b=b+4|0;d=d+4|0;if((f|0)!=(d|0)){continue}break}H[a+36>>2]=b}b=H[c+4>>2];H[a+44>>2]=H[c>>2];H[a+48>>2]=b;b=H[c+12>>2];H[a+52>>2]=H[c+8>>2];H[a+56>>2]=b;H[a+60>>2]=0;H[a+64>>2]=0;H[a>>2]=3812;H[a+68>>2]=0;H[a+72>>2]=0;H[a+76>>2]=0;H[a+80>>2]=0;H[a+84>>2]=0;H[a+88>>2]=j;break e;case 4:a=pa(104);H[a+4>>2]=d;H[a>>2]=3272;b=H[e+4>>2];H[a+8>>2]=H[e>>2];H[a+12>>2]=b;b=H[e+12>>2];H[a+16>>2]=H[e+8>>2];H[a+20>>2]=b;b=H[e+20>>2];H[a+24>>2]=H[e+16>>2];H[a+28>>2]=b;H[a+40>>2]=0;H[a+32>>2]=0;H[a+36>>2]=0;d=H[e+24>>2];f=H[e+28>>2];if((d|0)!=(f|0)){g=f-d|0;if((g|0)<0){break a}b=pa(g);H[a+32>>2]=b;H[a+40>>2]=(g&-4)+b;while(1){H[b>>2]=H[d>>2];b=b+4|0;d=d+4|0;if((f|0)!=(d|0)){continue}break}H[a+36>>2]=b}b=H[c+4>>2];H[a+44>>2]=H[c>>2];H[a+48>>2]=b;b=H[c+12>>2];H[a+52>>2]=H[c+8>>2];H[a+56>>2]=b;H[a+84>>2]=0;H[a+76>>2]=0;H[a+80>>2]=0;H[a+60>>2]=0;H[a+64>>2]=0;H[a>>2]=4040;b=H[c+4>>2];H[a+88>>2]=H[c>>2];H[a+92>>2]=b;b=H[c+12>>2];H[a+96>>2]=H[c+8>>2];H[a+100>>2]=b;break e;case 5:break f;default:break e}}a=pa(128);H[a+4>>2]=d;H[a>>2]=3272;b=H[e+4>>2];H[a+8>>2]=H[e>>2];H[a+12>>2]=b;b=H[e+12>>2];H[a+16>>2]=H[e+8>>2];H[a+20>>2]=b;b=H[e+20>>2];H[a+24>>2]=H[e+16>>2];H[a+28>>2]=b;H[a+40>>2]=0;H[a+32>>2]=0;H[a+36>>2]=0;g:{b=H[e+28>>2];d=H[e+24>>2];if((b|0)!=(d|0)){d=b-d|0;if((d|0)<0){break a}b=pa(d);H[a+36>>2]=b;H[a+32>>2]=b;H[a+40>>2]=(d&-4)+b;d=H[e+24>>2];f=H[e+28>>2];if((d|0)!=(f|0)){while(1){H[b>>2]=H[d>>2];b=b+4|0;d=d+4|0;if((f|0)!=(d|0)){continue}break}}H[a+36>>2]=b}H[a>>2]=3216;b=H[c+4>>2];H[a+44>>2]=H[c>>2];H[a+48>>2]=b;b=H[c+12>>2];H[a+52>>2]=H[c+8>>2];H[a+56>>2]=b;b=a- -64|0;H[b>>2]=0;H[b+4>>2]=0;H[a+60>>2]=4904;H[a>>2]=4276;b=H[c+4>>2];H[a+72>>2]=H[c>>2];H[a+76>>2]=b;b=H[c+12>>2];H[a+80>>2]=H[c+8>>2];H[a+84>>2]=b;H[a+104>>2]=1065353216;H[a+108>>2]=-1;H[a+96>>2]=-1;H[a+100>>2]=-1;H[a+88>>2]=1;H[a+92>>2]=-1;H[a+60>>2]=4512;H[a+112>>2]=0;H[a+116>>2]=0;F[a+117|0]=0;F[a+118|0]=0;F[a+119|0]=0;F[a+120|0]=0;F[a+121|0]=0;F[a+122|0]=0;F[a+123|0]=0;F[a+124|0]=0;break g}}break d}a=H[c+44>>2];H[h+12>>2]=k;H[h+8>>2]=a;H[h+20>>2]=f;H[h+16>>2]=f+12;c=h+8|0;a=0;h:{i:{switch(b-1|0){case 0:a=pa(60);H[a+4>>2]=d;H[a>>2]=3272;b=H[e+4>>2];H[a+8>>2]=H[e>>2];H[a+12>>2]=b;b=H[e+12>>2];H[a+16>>2]=H[e+8>>2];H[a+20>>2]=b;b=H[e+20>>2];H[a+24>>2]=H[e+16>>2];H[a+28>>2]=b;H[a+40>>2]=0;H[a+32>>2]=0;H[a+36>>2]=0;d=H[e+24>>2];f=H[e+28>>2];if((d|0)!=(f|0)){g=f-d|0;if((g|0)<0){break a}b=pa(g);H[a+32>>2]=b;H[a+40>>2]=(g&-4)+b;while(1){H[b>>2]=H[d>>2];b=b+4|0;d=d+4|0;if((f|0)!=(d|0)){continue}break}H[a+36>>2]=b}b=H[c+4>>2];H[a+44>>2]=H[c>>2];H[a+48>>2]=b;b=H[c+12>>2];H[a+52>>2]=H[c+8>>2];H[a+56>>2]=b;H[a>>2]=4932;break h;case 1:a=pa(60);H[a+4>>2]=d;H[a>>2]=3272;b=H[e+4>>2];H[a+8>>2]=H[e>>2];H[a+12>>2]=b;b=H[e+12>>2];H[a+16>>2]=H[e+8>>2];H[a+20>>2]=b;b=H[e+20>>2];H[a+24>>2]=H[e+16>>2];H[a+28>>2]=b;H[a+40>>2]=0;H[a+32>>2]=0;H[a+36>>2]=0;d=H[e+24>>2];f=H[e+28>>2];if((d|0)!=(f|0)){g=f-d|0;if((g|0)<0){break a}b=pa(g);H[a+32>>2]=b;H[a+40>>2]=(g&-4)+b;while(1){H[b>>2]=H[d>>2];b=b+4|0;d=d+4|0;if((f|0)!=(d|0)){continue}break}H[a+36>>2]=b}b=H[c+4>>2];H[a+44>>2]=H[c>>2];H[a+48>>2]=b;b=H[c+12>>2];H[a+52>>2]=H[c+8>>2];H[a+56>>2]=b;H[a>>2]=5356;break h;case 3:a=pa(112);H[a+4>>2]=d;H[a>>2]=3272;b=H[e+4>>2];H[a+8>>2]=H[e>>2];H[a+12>>2]=b;b=H[e+12>>2];H[a+16>>2]=H[e+8>>2];H[a+20>>2]=b;b=H[e+20>>2];H[a+24>>2]=H[e+16>>2];H[a+28>>2]=b;H[a+40>>2]=0;H[a+32>>2]=0;H[a+36>>2]=0;d=H[e+24>>2];f=H[e+28>>2];if((d|0)!=(f|0)){g=f-d|0;if((g|0)<0){break a}b=pa(g);H[a+32>>2]=b;H[a+40>>2]=(g&-4)+b;while(1){H[b>>2]=H[d>>2];b=b+4|0;d=d+4|0;if((f|0)!=(d|0)){continue}break}H[a+36>>2]=b}b=H[c+4>>2];H[a+44>>2]=H[c>>2];H[a+48>>2]=b;b=H[c+12>>2];H[a+52>>2]=H[c+8>>2];H[a+56>>2]=b;H[a+60>>2]=0;H[a+64>>2]=0;H[a>>2]=5580;H[a+68>>2]=0;H[a+72>>2]=0;H[a+76>>2]=0;H[a+80>>2]=0;H[a+84>>2]=0;H[a+88>>2]=0;H[a+92>>2]=0;H[a+96>>2]=0;H[a+100>>2]=0;H[a+104>>2]=0;H[a+108>>2]=0;break h;case 2:a=pa(92);H[a+4>>2]=d;H[a>>2]=3272;b=H[e+4>>2];H[a+8>>2]=H[e>>2];H[a+12>>2]=b;b=H[e+12>>2];H[a+16>>2]=H[e+8>>2];H[a+20>>2]=b;b=H[e+20>>2];H[a+24>>2]=H[e+16>>2];H[a+28>>2]=b;H[a+40>>2]=0;H[a+32>>2]=0;H[a+36>>2]=0;d=H[e+24>>2];f=H[e+28>>2];if((d|0)!=(f|0)){g=f-d|0;if((g|0)<0){break a}b=pa(g);H[a+32>>2]=b;H[a+40>>2]=(g&-4)+b;while(1){H[b>>2]=H[d>>2];b=b+4|0;d=d+4|0;if((f|0)!=(d|0)){continue}break}H[a+36>>2]=b}b=H[c+4>>2];H[a+44>>2]=H[c>>2];H[a+48>>2]=b;b=H[c+12>>2];H[a+52>>2]=H[c+8>>2];H[a+56>>2]=b;H[a+60>>2]=0;H[a+64>>2]=0;H[a>>2]=5816;H[a+68>>2]=0;H[a+72>>2]=0;H[a+76>>2]=0;H[a+80>>2]=0;H[a+84>>2]=0;H[a+88>>2]=j;break h;case 4:a=pa(104);H[a+4>>2]=d;H[a>>2]=3272;b=H[e+4>>2];H[a+8>>2]=H[e>>2];H[a+12>>2]=b;b=H[e+12>>2];H[a+16>>2]=H[e+8>>2];H[a+20>>2]=b;b=H[e+20>>2];H[a+24>>2]=H[e+16>>2];H[a+28>>2]=b;H[a+40>>2]=0;H[a+32>>2]=0;H[a+36>>2]=0;d=H[e+24>>2];f=H[e+28>>2];if((d|0)!=(f|0)){g=f-d|0;if((g|0)<0){break a}b=pa(g);H[a+32>>2]=b;H[a+40>>2]=(g&-4)+b;while(1){H[b>>2]=H[d>>2];b=b+4|0;d=d+4|0;if((f|0)!=(d|0)){continue}break}H[a+36>>2]=b}b=H[c+4>>2];H[a+44>>2]=H[c>>2];H[a+48>>2]=b;b=H[c+12>>2];H[a+52>>2]=H[c+8>>2];H[a+56>>2]=b;H[a+84>>2]=0;H[a+76>>2]=0;H[a+80>>2]=0;H[a+60>>2]=0;H[a+64>>2]=0;H[a>>2]=6032;b=H[c+4>>2];H[a+88>>2]=H[c>>2];H[a+92>>2]=b;b=H[c+12>>2];H[a+96>>2]=H[c+8>>2];H[a+100>>2]=b;break h;case 5:break i;default:break h}}a=pa(128);H[a+4>>2]=d;H[a>>2]=3272;b=H[e+4>>2];H[a+8>>2]=H[e>>2];H[a+12>>2]=b;b=H[e+12>>2];H[a+16>>2]=H[e+8>>2];H[a+20>>2]=b;b=H[e+20>>2];H[a+24>>2]=H[e+16>>2];H[a+28>>2]=b;H[a+40>>2]=0;H[a+32>>2]=0;H[a+36>>2]=0;j:{b=H[e+28>>2];d=H[e+24>>2];if((b|0)!=(d|0)){d=b-d|0;if((d|0)<0){break a}b=pa(d);H[a+36>>2]=b;H[a+32>>2]=b;H[a+40>>2]=(d&-4)+b;d=H[e+24>>2];f=H[e+28>>2];if((d|0)!=(f|0)){while(1){H[b>>2]=H[d>>2];b=b+4|0;d=d+4|0;if((f|0)!=(d|0)){continue}break}}H[a+36>>2]=b}H[a>>2]=5300;b=H[c+4>>2];H[a+44>>2]=H[c>>2];H[a+48>>2]=b;b=H[c+12>>2];H[a+52>>2]=H[c+8>>2];H[a+56>>2]=b;b=a- -64|0;H[b>>2]=0;H[b+4>>2]=0;H[a+60>>2]=6840;H[a>>2]=6256;b=H[c+4>>2];H[a+72>>2]=H[c>>2];H[a+76>>2]=b;b=H[c+12>>2];H[a+80>>2]=H[c+8>>2];H[a+84>>2]=b;H[a+104>>2]=1065353216;H[a+108>>2]=-1;H[a+96>>2]=-1;H[a+100>>2]=-1;H[a+88>>2]=1;H[a+92>>2]=-1;H[a+60>>2]=6476;H[a+112>>2]=0;H[a+116>>2]=0;F[a+117|0]=0;F[a+118|0]=0;F[a+119|0]=0;F[a+120|0]=0;F[a+121|0]=0;F[a+122|0]=0;F[a+123|0]=0;F[a+124|0]=0;break j}}}ca=h+32|0;d=a;if(a){break c}}d=pa(44);H[d+4>>2]=l;H[d>>2]=3272;a=H[e+4>>2];H[d+8>>2]=H[e>>2];H[d+12>>2]=a;a=H[e+12>>2];H[d+16>>2]=H[e+8>>2];H[d+20>>2]=a;a=H[e+20>>2];H[d+24>>2]=H[e+16>>2];H[d+28>>2]=a;H[d+40>>2]=0;H[d+32>>2]=0;H[d+36>>2]=0;c=H[e+24>>2];a=H[e+28>>2];if((c|0)!=(a|0)){b=a-c|0;if((b|0)<0){break a}e=pa(b);H[d+32>>2]=e;H[d+40>>2]=(b&-4)+e;while(1){H[e>>2]=H[c>>2];e=e+4|0;c=c+4|0;if((a|0)!=(c|0)){continue}break}H[d+36>>2]=e}H[d>>2]=6868;break c}e=d;a=H[i+32>>2];if(!a){break b}H[i+36>>2]=a;oa(a)}ca=i+48|0;return e|0}sa();v()}function Ec(a){a=a|0;var b=0,c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;l=ca-16|0;ca=l;a:{b:{c:{d:{e:{f:{g:{h:{i:{if(a>>>0<=244){g=H[4298];h=a>>>0<11?16:a+11&-8;c=h>>>3|0;b=g>>>c|0;if(b&3){c=c+((b^-1)&1)|0;a=c<<3;b=a+17232|0;d=H[a+17240>>2];a=H[d+8>>2];j:{if((b|0)==(a|0)){m=17192,n=Vj(c)&g,H[m>>2]=n;break j}H[a+12>>2]=b;H[b+8>>2]=a}a=d+8|0;b=c<<3;H[d+4>>2]=b|3;b=b+d|0;H[b+4>>2]=H[b+4>>2]|1;break a}k=H[4300];if(k>>>0>=h>>>0){break i}if(b){a=2<<c;a=(0-a|a)&b<<c;d=Qj(0-a&a);a=d<<3;b=a+17232|0;e=H[a+17240>>2];a=H[e+8>>2];k:{if((b|0)==(a|0)){g=Vj(d)&g;H[4298]=g;break k}H[a+12>>2]=b;H[b+8>>2]=a}H[e+4>>2]=h|3;c=e+h|0;a=d<<3;d=a-h|0;H[c+4>>2]=d|1;H[a+e>>2]=d;if(k){b=(k&-8)+17232|0;f=H[4303];a=1<<(k>>>3);l:{if(!(a&g)){H[4298]=a|g;a=b;break l}a=H[b+8>>2]}H[b+8>>2]=f;H[a+12>>2]=f;H[f+12>>2]=b;H[f+8>>2]=a}a=e+8|0;H[4303]=c;H[4300]=d;break a}j=H[4299];if(!j){break i}c=H[(Qj(0-j&j)<<2)+17496>>2];f=(H[c+4>>2]&-8)-h|0;b=c;while(1){m:{a=H[b+16>>2];if(!a){a=H[b+20>>2];if(!a){break m}}b=(H[a+4>>2]&-8)-h|0;d=b>>>0<f>>>0;f=d?b:f;c=d?a:c;b=a;continue}break}i=H[c+24>>2];d=H[c+12>>2];if((d|0)!=(c|0)){a=H[c+8>>2];H[a+12>>2]=d;H[d+8>>2]=a;break b}b=c+20|0;a=H[b>>2];if(!a){a=H[c+16>>2];if(!a){break h}b=c+16|0}while(1){e=b;d=a;b=a+20|0;a=H[b>>2];if(a){continue}b=d+16|0;a=H[d+16>>2];if(a){continue}break}H[e>>2]=0;break b}h=-1;if(a>>>0>4294967231){break i}a=a+11|0;h=a&-8;j=H[4299];if(!j){break i}f=0-h|0;g=0;n:{if(h>>>0<256){break n}g=31;if(h>>>0>16777215){break n}a=Q(a>>>8|0);g=((h>>>38-a&1)-(a<<1)|0)+62|0}b=H[(g<<2)+17496>>2];o:{p:{q:{if(!b){a=0;break q}a=0;c=h<<((g|0)!=31?25-(g>>>1|0)|0:0);while(1){r:{e=(H[b+4>>2]&-8)-h|0;if(e>>>0>=f>>>0){break r}d=b;f=e;if(e){break r}f=0;a=b;break p}e=H[b+20>>2];b=H[((c>>>29&4)+b|0)+16>>2];a=e?(e|0)==(b|0)?a:e:a;c=c<<1;if(b){continue}break}}if(!(a|d)){d=0;a=2<<g;a=(0-a|a)&j;if(!a){break i}a=H[(Qj(a&0-a)<<2)+17496>>2]}if(!a){break o}}while(1){b=(H[a+4>>2]&-8)-h|0;c=b>>>0<f>>>0;f=c?b:f;d=c?a:d;b=H[a+16>>2];if(b){a=b}else{a=H[a+20>>2]}if(a){continue}break}}if(!d|H[4300]-h>>>0<=f>>>0){break i}g=H[d+24>>2];c=H[d+12>>2];if((d|0)!=(c|0)){a=H[d+8>>2];H[a+12>>2]=c;H[c+8>>2]=a;break c}b=d+20|0;a=H[b>>2];if(!a){a=H[d+16>>2];if(!a){break g}b=d+16|0}while(1){e=b;c=a;b=a+20|0;a=H[b>>2];if(a){continue}b=c+16|0;a=H[c+16>>2];if(a){continue}break}H[e>>2]=0;break c}a=H[4300];if(a>>>0>=h>>>0){d=H[4303];b=a-h|0;s:{if(b>>>0>=16){c=d+h|0;H[c+4>>2]=b|1;H[a+d>>2]=b;H[d+4>>2]=h|3;break s}H[d+4>>2]=a|3;a=a+d|0;H[a+4>>2]=H[a+4>>2]|1;c=0;b=0}H[4300]=b;H[4303]=c;a=d+8|0;break a}i=H[4301];if(i>>>0>h>>>0){b=i-h|0;H[4301]=b;c=H[4304];a=c+h|0;H[4304]=a;H[a+4>>2]=b|1;H[c+4>>2]=h|3;a=c+8|0;break a}a=0;j=h+47|0;if(H[4416]){c=H[4418]}else{H[4419]=-1;H[4420]=-1;H[4417]=4096;H[4418]=4096;H[4416]=l+12&-16^1431655768;H[4421]=0;H[4409]=0;c=4096}e=j+c|0;f=0-c|0;b=e&f;if(b>>>0<=h>>>0){break a}d=H[4408];if(d){c=H[4406];g=c+b|0;if(d>>>0<g>>>0|c>>>0>=g>>>0){break a}}t:{if(!(I[17636]&4)){u:{v:{w:{x:{d=H[4304];if(d){a=17640;while(1){c=H[a>>2];if(c>>>0<=d>>>0&d>>>0<c+H[a+4>>2]>>>0){break x}a=H[a+8>>2];if(a){continue}break}}c=zb(0);if((c|0)==-1){break u}g=b;d=H[4417];a=d-1|0;if(a&c){g=(b-c|0)+(a+c&0-d)|0}if(g>>>0<=h>>>0){break u}d=H[4408];if(d){a=H[4406];f=a+g|0;if(d>>>0<f>>>0|a>>>0>=f>>>0){break u}}a=zb(g);if((c|0)!=(a|0)){break w}break t}g=f&e-i;c=zb(g);if((c|0)==(H[a>>2]+H[a+4>>2]|0)){break v}a=c}if((a|0)==-1){break u}if(h+48>>>0<=g>>>0){c=a;break t}c=H[4418];c=c+(j-g|0)&0-c;if((zb(c)|0)==-1){break u}g=c+g|0;c=a;break t}if((c|0)!=-1){break t}}H[4409]=H[4409]|4}c=zb(b);a=zb(0);if((c|0)==-1|(a|0)==-1|a>>>0<=c>>>0){break d}g=a-c|0;if(g>>>0<=h+40>>>0){break d}}a=H[4406]+g|0;H[4406]=a;if(a>>>0>K[4407]){H[4407]=a}y:{e=H[4304];if(e){a=17640;while(1){d=H[a>>2];b=H[a+4>>2];if((d+b|0)==(c|0)){break y}a=H[a+8>>2];if(a){continue}break}break f}a=H[4302];if(!(a>>>0<=c>>>0?a:0)){H[4302]=c}a=0;H[4411]=g;H[4410]=c;H[4306]=-1;H[4307]=H[4416];H[4413]=0;while(1){d=a<<3;b=d+17232|0;H[d+17240>>2]=b;H[d+17244>>2]=b;a=a+1|0;if((a|0)!=32){continue}break}d=g-40|0;a=c+8&7?-8-c&7:0;b=d-a|0;H[4301]=b;a=a+c|0;H[4304]=a;H[a+4>>2]=b|1;H[(c+d|0)+4>>2]=40;H[4305]=H[4420];break e}if(I[a+12|0]&8|d>>>0>e>>>0|c>>>0<=e>>>0){break f}H[a+4>>2]=b+g;a=e+8&7?-8-e&7:0;c=a+e|0;H[4304]=c;b=H[4301]+g|0;a=b-a|0;H[4301]=a;H[c+4>>2]=a|1;H[(b+e|0)+4>>2]=40;H[4305]=H[4420];break e}d=0;break b}c=0;break c}if(K[4302]>c>>>0){H[4302]=c}b=c+g|0;a=17640;z:{A:{B:{C:{D:{E:{while(1){if((b|0)!=H[a>>2]){a=H[a+8>>2];if(a){continue}break E}break}if(!(I[a+12|0]&8)){break D}}a=17640;while(1){b=H[a>>2];if(b>>>0<=e>>>0){f=b+H[a+4>>2]|0;if(f>>>0>e>>>0){break C}}a=H[a+8>>2];continue}}H[a>>2]=c;H[a+4>>2]=H[a+4>>2]+g;j=(c+8&7?-8-c&7:0)+c|0;H[j+4>>2]=h|3;g=b+(b+8&7?-8-b&7:0)|0;i=h+j|0;a=g-i|0;if((e|0)==(g|0)){H[4304]=i;a=H[4301]+a|0;H[4301]=a;H[i+4>>2]=a|1;break A}if(H[4303]==(g|0)){H[4303]=i;a=H[4300]+a|0;H[4300]=a;H[i+4>>2]=a|1;H[a+i>>2]=a;break A}f=H[g+4>>2];if((f&3)==1){e=f&-8;F:{if(f>>>0<=255){d=H[g+8>>2];b=f>>>3|0;c=H[g+12>>2];if((c|0)==(d|0)){m=17192,n=H[4298]&Vj(b),H[m>>2]=n;break F}H[d+12>>2]=c;H[c+8>>2]=d;break F}h=H[g+24>>2];c=H[g+12>>2];G:{if((g|0)!=(c|0)){b=H[g+8>>2];H[b+12>>2]=c;H[c+8>>2]=b;break G}H:{f=g+20|0;b=H[f>>2];if(b){break H}f=g+16|0;b=H[f>>2];if(b){break H}c=0;break G}while(1){d=f;c=b;f=c+20|0;b=H[f>>2];if(b){continue}f=c+16|0;b=H[c+16>>2];if(b){continue}break}H[d>>2]=0}if(!h){break F}d=H[g+28>>2];b=(d<<2)+17496|0;I:{if(H[b>>2]==(g|0)){H[b>>2]=c;if(c){break I}m=17196,n=H[4299]&Vj(d),H[m>>2]=n;break F}H[h+(H[h+16>>2]==(g|0)?16:20)>>2]=c;if(!c){break F}}H[c+24>>2]=h;b=H[g+16>>2];if(b){H[c+16>>2]=b;H[b+24>>2]=c}b=H[g+20>>2];if(!b){break F}H[c+20>>2]=b;H[b+24>>2]=c}g=e+g|0;f=H[g+4>>2];a=a+e|0}H[g+4>>2]=f&-2;H[i+4>>2]=a|1;H[a+i>>2]=a;if(a>>>0<=255){b=(a&-8)+17232|0;c=H[4298];a=1<<(a>>>3);J:{if(!(c&a)){H[4298]=a|c;a=b;break J}a=H[b+8>>2]}H[b+8>>2]=i;H[a+12>>2]=i;H[i+12>>2]=b;H[i+8>>2]=a;break A}f=31;if(a>>>0<=16777215){b=Q(a>>>8|0);f=((a>>>38-b&1)-(b<<1)|0)+62|0}H[i+28>>2]=f;H[i+16>>2]=0;H[i+20>>2]=0;b=(f<<2)+17496|0;d=H[4299];c=1<<f;K:{if(!(d&c)){H[4299]=c|d;H[b>>2]=i;break K}f=a<<((f|0)!=31?25-(f>>>1|0)|0:0);c=H[b>>2];while(1){b=c;if((H[c+4>>2]&-8)==(a|0)){break B}c=f>>>29|0;f=f<<1;d=(c&4)+b|0;c=H[d+16>>2];if(c){continue}break}H[d+16>>2]=i}H[i+24>>2]=b;H[i+12>>2]=i;H[i+8>>2]=i;break A}d=g-40|0;a=c+8&7?-8-c&7:0;b=d-a|0;H[4301]=b;a=a+c|0;H[4304]=a;H[a+4>>2]=b|1;H[(c+d|0)+4>>2]=40;H[4305]=H[4420];a=(f+(f-39&7?39-f&7:0)|0)-47|0;d=a>>>0<e+16>>>0?e:a;H[d+4>>2]=27;a=H[4413];H[d+16>>2]=H[4412];H[d+20>>2]=a;a=H[4411];H[d+8>>2]=H[4410];H[d+12>>2]=a;H[4412]=d+8;H[4411]=g;H[4410]=c;H[4413]=0;a=d+24|0;while(1){H[a+4>>2]=7;b=a+8|0;a=a+4|0;if(b>>>0<f>>>0){continue}break}if((d|0)==(e|0)){break e}H[d+4>>2]=H[d+4>>2]&-2;f=d-e|0;H[e+4>>2]=f|1;H[d>>2]=f;if(f>>>0<=255){b=(f&-8)+17232|0;c=H[4298];a=1<<(f>>>3);L:{if(!(c&a)){H[4298]=a|c;a=b;break L}a=H[b+8>>2]}H[b+8>>2]=e;H[a+12>>2]=e;H[e+12>>2]=b;H[e+8>>2]=a;break e}a=31;if(f>>>0<=16777215){a=Q(f>>>8|0);a=((f>>>38-a&1)-(a<<1)|0)+62|0}H[e+28>>2]=a;H[e+16>>2]=0;H[e+20>>2]=0;b=(a<<2)+17496|0;d=H[4299];c=1<<a;M:{if(!(d&c)){H[4299]=c|d;H[b>>2]=e;break M}a=f<<((a|0)!=31?25-(a>>>1|0)|0:0);d=H[b>>2];while(1){b=d;if((f|0)==(H[b+4>>2]&-8)){break z}c=a>>>29|0;a=a<<1;c=(c&4)+b|0;d=H[c+16>>2];if(d){continue}break}H[c+16>>2]=e}H[e+24>>2]=b;H[e+12>>2]=e;H[e+8>>2]=e;break e}a=H[b+8>>2];H[a+12>>2]=i;H[b+8>>2]=i;H[i+24>>2]=0;H[i+12>>2]=b;H[i+8>>2]=a}a=j+8|0;break a}a=H[b+8>>2];H[a+12>>2]=e;H[b+8>>2]=e;H[e+24>>2]=0;H[e+12>>2]=b;H[e+8>>2]=a}a=H[4301];if(a>>>0<=h>>>0){break d}b=a-h|0;H[4301]=b;c=H[4304];a=c+h|0;H[4304]=a;H[a+4>>2]=b|1;H[c+4>>2]=h|3;a=c+8|0;break a}H[3992]=48;a=0;break a}N:{if(!g){break N}b=H[d+28>>2];a=(b<<2)+17496|0;O:{if(H[a>>2]==(d|0)){H[a>>2]=c;if(c){break O}j=Vj(b)&j;H[4299]=j;break N}H[g+(H[g+16>>2]==(d|0)?16:20)>>2]=c;if(!c){break N}}H[c+24>>2]=g;a=H[d+16>>2];if(a){H[c+16>>2]=a;H[a+24>>2]=c}a=H[d+20>>2];if(!a){break N}H[c+20>>2]=a;H[a+24>>2]=c}P:{if(f>>>0<=15){a=f+h|0;H[d+4>>2]=a|3;a=a+d|0;H[a+4>>2]=H[a+4>>2]|1;break P}H[d+4>>2]=h|3;e=d+h|0;H[e+4>>2]=f|1;H[e+f>>2]=f;if(f>>>0<=255){b=(f&-8)+17232|0;c=H[4298];a=1<<(f>>>3);Q:{if(!(c&a)){H[4298]=a|c;a=b;break Q}a=H[b+8>>2]}H[b+8>>2]=e;H[a+12>>2]=e;H[e+12>>2]=b;H[e+8>>2]=a;break P}a=31;if(f>>>0<=16777215){a=Q(f>>>8|0);a=((f>>>38-a&1)-(a<<1)|0)+62|0}H[e+28>>2]=a;H[e+16>>2]=0;H[e+20>>2]=0;b=(a<<2)+17496|0;R:{c=1<<a;S:{if(!(c&j)){H[4299]=c|j;H[b>>2]=e;break S}a=f<<((a|0)!=31?25-(a>>>1|0)|0:0);h=H[b>>2];while(1){b=h;if((H[b+4>>2]&-8)==(f|0)){break R}c=a>>>29|0;a=a<<1;c=(c&4)+b|0;h=H[c+16>>2];if(h){continue}break}H[c+16>>2]=e}H[e+24>>2]=b;H[e+12>>2]=e;H[e+8>>2]=e;break P}a=H[b+8>>2];H[a+12>>2]=e;H[b+8>>2]=e;H[e+24>>2]=0;H[e+12>>2]=b;H[e+8>>2]=a}a=d+8|0;break a}T:{if(!i){break T}b=H[c+28>>2];a=(b<<2)+17496|0;U:{if(H[a>>2]==(c|0)){H[a>>2]=d;if(d){break U}m=17196,n=Vj(b)&j,H[m>>2]=n;break T}H[i+(H[i+16>>2]==(c|0)?16:20)>>2]=d;if(!d){break T}}H[d+24>>2]=i;a=H[c+16>>2];if(a){H[d+16>>2]=a;H[a+24>>2]=d}a=H[c+20>>2];if(!a){break T}H[d+20>>2]=a;H[a+24>>2]=d}V:{if(f>>>0<=15){a=f+h|0;H[c+4>>2]=a|3;a=a+c|0;H[a+4>>2]=H[a+4>>2]|1;break V}H[c+4>>2]=h|3;d=c+h|0;H[d+4>>2]=f|1;H[d+f>>2]=f;if(k){b=(k&-8)+17232|0;e=H[4303];a=1<<(k>>>3);W:{if(!(a&g)){H[4298]=a|g;a=b;break W}a=H[b+8>>2]}H[b+8>>2]=e;H[a+12>>2]=e;H[e+12>>2]=b;H[e+8>>2]=a}H[4303]=d;H[4300]=f}a=c+8|0}ca=l+16|0;return a|0}function ce(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0;m=ca-32|0;ca=m;o=pa(12);H[o+8>>2]=0;H[o+4>>2]=b;H[o>>2]=0;s=o+12|0;b=s;a:{b:{c:{while(1){b=b-12|0;w=H[b+8>>2];j=H[b+4>>2];t=H[b>>2];if(t){if((w|0)>1e3){break a}H[m+24>>2]=0;H[m+16>>2]=0;H[m+20>>2]=0;d=1;c=H[a>>2];e=H[c+8>>2];h=H[c+12>>2];g=H[c+20>>2];f=H[c+16>>2];d:{if((h|0)<=(g|0)&f>>>0>=e>>>0|(g|0)>(h|0)){break d}e=I[f+H[c>>2]|0];h=c;c=g;f=f+1|0;c=f?c:c+1|0;H[h+16>>2]=f;H[h+20>>2]=c;Cc(m+16|0,e);if(e){c=H[a>>2];n=Dc(m+16|0);p=H[c+8>>2];g=H[c+12>>2];h=H[c+20>>2];f=H[c+16>>2];k=f+e|0;h=k>>>0<e>>>0?h+1|0:h;if((g|0)<=(h|0)&k>>>0>p>>>0|(g|0)<(h|0)){break d}qa(n,f+H[c>>2]|0,e);d=H[c+20>>2];f=e;e=e+H[c+16>>2]|0;d=f>>>0>e>>>0?d+1|0:d;H[c+16>>2]=e;H[c+20>>2]=d}j=pa(24);c=j;H[c+4>>2]=0;H[c+8>>2]=0;c=c+16|0;H[c>>2]=0;H[c+4>>2]=0;H[j>>2]=j+4;H[j+12>>2]=c;e=ca-32|0;ca=e;h=t+12|0;c=m+16|0;u=nb(h,c);i=t+16|0;e:{if((u|0)==(i|0)){H[e+16>>2]=c;f:{g:{d=H[h+4>>2];h:{if(!d){f=h+4|0;c=f;break h}f=I[c+11|0];g=f<<24>>24<0;n=g?H[c>>2]:c;g=g?H[c+4>>2]:f;while(1){c=d;d=I[c+27|0];f=d<<24>>24<0;d=f?H[c+20>>2]:d;p=d>>>0<g>>>0;i:{j:{k:{l:{k=p?d:g;m:{if(k){f=f?H[c+16>>2]:c+16|0;q=Fa(n,f,k);if(!q){if(d>>>0>g>>>0){break m}break l}if((q|0)>=0){break l}break m}if(d>>>0<=g>>>0){break k}}f=c;d=H[c>>2];if(d){continue}break h}d=Fa(f,n,k);if(d){break j}}if(p){break i}break g}if((d|0)>=0){break g}}d=H[c+4>>2];if(d){continue}break}f=c+4|0}d=pa(32);n=d+16|0;g=H[e+16>>2];n:{if(F[g+11|0]>=0){p=H[g+4>>2];H[n>>2]=H[g>>2];H[n+4>>2]=p;H[n+8>>2]=H[g+8>>2];break n}za(n,H[g>>2],H[g+4>>2])}H[d+8>>2]=c;H[d>>2]=0;H[d+4>>2]=0;H[d+28>>2]=0;H[f>>2]=d;c=d;g=H[H[h>>2]>>2];if(g){H[h>>2]=g;c=H[f>>2]}Sb(H[h+4>>2],c);H[h+8>>2]=H[h+8>>2]+1;c=1;break f}d=c;c=0}F[e+28|0]=c;H[e+24>>2]=d;d=H[e+24>>2];c=H[d+28>>2];H[d+28>>2]=j;if(!c){break e}Ra(c+12|0,H[c+16>>2]);Qa(c,H[c+4>>2]);oa(c);break e}if(!j){break e}Ra(j+12|0,H[j+16>>2]);Qa(j,H[j+4>>2]);oa(j)}ca=e+32|0;d=(i|0)!=(u|0)}if(F[m+27|0]<0){oa(H[m+16>>2])}if(d){break a}}if(!j){break a}H[m+16>>2]=0;if(!Bb(1,m+16|0,H[a>>2])){break a}q=0;x=H[m+16>>2];if(x){while(1){d=0;i=ca-32|0;ca=i;H[i+24>>2]=0;H[i+16>>2]=0;H[i+20>>2]=0;c=H[a>>2];f=H[c+8>>2];o:{p:{h=H[c+12>>2];g=H[c+20>>2];e=H[c+16>>2];q:{if((h|0)<=(g|0)&e>>>0>=f>>>0|(g|0)>(h|0)){break q}f=I[e+H[c>>2]|0];h=c;c=g;e=e+1|0;c=e?c:c+1|0;H[h+16>>2]=e;H[h+20>>2]=c;Cc(i+16|0,f);if(f){e=H[a>>2];n=Dc(i+16|0);p=H[e+8>>2];g=H[e+12>>2];c=H[e+20>>2];h=H[e+16>>2];k=h+f|0;c=k>>>0<f>>>0?c+1|0:c;if(k>>>0>p>>>0&(c|0)>=(g|0)|(c|0)>(g|0)){break q}qa(n,h+H[e>>2]|0,f);c=H[e+20>>2];g=f;f=f+H[e+16>>2]|0;c=g>>>0>f>>>0?c+1|0:c;H[e+16>>2]=f;H[e+20>>2]=c}H[i+12>>2]=0;if(!Bb(1,i+12|0,H[a>>2])){break q}f=H[i+12>>2];if(!f){break q}e=H[a>>2];c=H[e+8>>2];h=H[e+16>>2];g=c-h|0;c=H[e+12>>2]-(H[e+20>>2]+(c>>>0<h>>>0)|0)|0;if((c|0)<=0&f>>>0>g>>>0|(c|0)<0){break q}H[i+8>>2]=0;H[i>>2]=0;H[i+4>>2]=0;if((f|0)<0){break p}d=pa(f);H[i>>2]=d;c=d+f|0;H[i+8>>2]=c;l=ra(d,0,f);H[i+4>>2]=c;h=H[e+12>>2];y=h;p=H[e+8>>2];c=H[e+20>>2];k=H[e+16>>2];g=f+k|0;c=g>>>0<f>>>0?c+1|0:c;u=g;n=c;r:{if((c|0)<=(h|0)&g>>>0<=p>>>0|(c|0)<(h|0)){qa(l,H[e>>2]+k|0,f);d=H[e+20>>2];c=f+H[e+16>>2]|0;d=c>>>0<f>>>0?d+1|0:d;H[e+16>>2]=c;H[e+20>>2]=d;h=ca-48|0;ca=h;e=nb(j,i+16|0);if((e|0)!=(j+4|0)){c=H[e+4>>2];s:{if(!c){c=e;while(1){d=H[c+8>>2];f=H[d>>2]!=(c|0);c=d;if(f){continue}break}break s}while(1){d=c;c=H[c>>2];if(c){continue}break}}if((e|0)==H[j>>2]){H[j>>2]=d}H[j+8>>2]=H[j+8>>2]-1;f=H[j+4>>2];t:{u:{g=e;d=e;e=H[d>>2];if(e){c=H[g+4>>2];if(!c){break u}while(1){d=c;c=H[c>>2];if(c){continue}break}}e=H[d+4>>2];if(e){break u}e=0;k=1;break t}H[e+8>>2]=H[d+8>>2];k=0}l=H[d+8>>2];c=H[l>>2];v:{if((d|0)==(c|0)){H[l>>2]=e;if((d|0)==(f|0)){c=0;f=e;break v}c=H[l+4>>2];break v}H[l+4>>2]=e}r=!I[d+12|0];if((d|0)!=(g|0)){l=H[g+8>>2];H[d+8>>2]=l;H[l+(((g|0)!=H[H[g+8>>2]>>2])<<2)>>2]=d;l=H[g>>2];H[d>>2]=l;H[l+8>>2]=d;l=H[g+4>>2];H[d+4>>2]=l;if(l){H[l+8>>2]=d}F[d+12|0]=I[g+12|0];f=(f|0)==(g|0)?d:f}w:{if(r|!f){break w}if(k){while(1){e=I[c+12|0];x:{d=H[c+8>>2];if(H[d>>2]!=(c|0)){if(!e){F[c+12|0]=1;F[d+12|0]=0;e=H[d+4>>2];k=H[e>>2];H[d+4>>2]=k;if(k){H[k+8>>2]=d}H[e+8>>2]=H[d+8>>2];k=H[d+8>>2];H[(((d|0)!=H[k>>2])<<2)+k>>2]=e;H[e>>2]=d;H[d+8>>2]=e;d=c;c=H[c>>2];f=(c|0)==(f|0)?d:f;c=H[c+4>>2]}y:{z:{d=H[c>>2];A:{if(!(I[d+12|0]?0:d)){e=H[c+4>>2];if(I[e+12|0]?0:e){break A}F[c+12|0]=0;c=H[c+8>>2];B:{if((f|0)==(c|0)){c=f;break B}if(I[c+12|0]){break x}}F[c+12|0]=1;break w}e=H[c+4>>2];if(!e){break z}}if(I[e+12|0]){break z}d=c;break y}F[d+12|0]=1;F[c+12|0]=0;e=H[d+4>>2];H[c>>2]=e;if(e){H[e+8>>2]=c}H[d+8>>2]=H[c+8>>2];e=H[c+8>>2];H[((H[e>>2]!=(c|0))<<2)+e>>2]=d;H[d+4>>2]=c;H[c+8>>2]=d;e=c}c=H[d+8>>2];F[d+12|0]=I[c+12|0];F[c+12|0]=1;F[e+12|0]=1;d=H[c+4>>2];e=H[d>>2];H[c+4>>2]=e;if(e){H[e+8>>2]=c}H[d+8>>2]=H[c+8>>2];e=H[c+8>>2];H[(((c|0)!=H[e>>2])<<2)+e>>2]=d;H[d>>2]=c;H[c+8>>2]=d;break w}if(!e){F[c+12|0]=1;F[d+12|0]=0;e=H[c+4>>2];H[d>>2]=e;if(e){H[e+8>>2]=d}H[c+8>>2]=H[d+8>>2];e=H[d+8>>2];H[(((d|0)!=H[e>>2])<<2)+e>>2]=c;H[c+4>>2]=d;H[d+8>>2]=c;f=(d|0)==(f|0)?c:f;c=H[d>>2]}e=H[c>>2];C:{if(!(!e|I[e+12|0])){d=c;break C}d=H[c+4>>2];if(!(I[d+12|0]?0:d)){F[c+12|0]=0;c=H[c+8>>2];if((c|0)!=(f|0)?I[c+12|0]:0){break x}F[c+12|0]=1;break w}if(e){if(!I[e+12|0]){d=c;break C}d=H[c+4>>2]}F[d+12|0]=1;F[c+12|0]=0;e=H[d>>2];H[c+4>>2]=e;if(e){H[e+8>>2]=c}H[d+8>>2]=H[c+8>>2];e=H[c+8>>2];H[((H[e>>2]!=(c|0))<<2)+e>>2]=d;H[d>>2]=c;H[c+8>>2]=d;e=c}c=H[d+8>>2];F[d+12|0]=I[c+12|0];F[c+12|0]=1;F[e+12|0]=1;d=H[c>>2];e=H[d+4>>2];H[c>>2]=e;if(e){H[e+8>>2]=c}H[d+8>>2]=H[c+8>>2];e=H[c+8>>2];H[(((c|0)!=H[e>>2])<<2)+e>>2]=d;H[d+4>>2]=c;H[c+8>>2]=d;break w}d=c;c=H[c+8>>2];c=H[(((d|0)==H[c>>2])<<2)+c>>2];continue}}F[e+12|0]=1}c=H[g+28>>2];if(c){H[g+32>>2]=c;oa(c)}if(F[g+27|0]<0){oa(H[g+16>>2])}oa(g)}H[h+8>>2]=0;H[h>>2]=0;H[h+4>>2]=0;c=H[i+4>>2];d=H[i>>2];f=c-d|0;e=0;D:{E:{if((c|0)!=(d|0)){if((f|0)<0){break E}e=pa(f);c=ra(e,0,f);g=c+f|0;H[h+8>>2]=g;H[h+4>>2]=g;H[h>>2]=c;c=d}qa(e,c,f);F:{if(F[i+27|0]>=0){H[h+24>>2]=H[i+24>>2];c=H[i+20>>2];H[h+16>>2]=H[i+16>>2];H[h+20>>2]=c;break F}za(h+16|0,H[i+16>>2],H[i+20>>2])}ae(h+28|0,h);f=h+16|0;c=f;G:{H:{d=H[j+4>>2];I:{if(!d){e=j+4|0;c=e;break I}e=I[c+11|0];g=e<<24>>24<0;k=g?H[c>>2]:c;g=g?H[c+4>>2]:e;while(1){c=d;d=I[c+27|0];e=d<<24>>24<0;d=e?H[c+20>>2]:d;l=d>>>0<g>>>0;J:{K:{L:{M:{r=l?d:g;N:{if(r){e=e?H[c+16>>2]:c+16|0;z=Fa(k,e,r);if(!z){if(d>>>0>g>>>0){break N}break M}if((z|0)>=0){break M}break N}if(d>>>0<=g>>>0){break L}}e=c;d=H[c>>2];if(d){continue}break I}d=Fa(e,k,r);if(d){break K}}if(l){break J}break H}if((d|0)>=0){break H}}d=H[c+4>>2];if(d){continue}break}e=c+4|0}d=pa(40);H[d+24>>2]=H[f+8>>2];g=H[f+4>>2];H[d+16>>2]=H[f>>2];H[d+20>>2]=g;H[f>>2]=0;H[f+4>>2]=0;H[f+8>>2]=0;ae(d+28|0,f+12|0);H[d+8>>2]=c;H[d>>2]=0;H[d+4>>2]=0;H[e>>2]=d;c=d;f=H[H[j>>2]>>2];if(f){H[j>>2]=f;c=H[e>>2]}Sb(H[j+4>>2],c);H[j+8>>2]=H[j+8>>2]+1;c=1;break G}d=c;c=0}F[h+44|0]=c;H[h+40>>2]=d;c=H[h+28>>2];if(c){H[h+32>>2]=c;oa(c)}if(F[h+27|0]<0){oa(H[h+16>>2])}c=H[h>>2];if(c){H[h+4>>2]=c;oa(c)}ca=h+48|0;break D}sa();v()}d=H[i>>2];if(!d){break r}}H[i+4>>2]=d;oa(d)}d=(n|0)<=(y|0)&p>>>0>=u>>>0|(n|0)<(y|0)}if(F[i+27|0]<0){oa(H[i+16>>2])}ca=i+32|0;break o}sa();v()}if(!d){break a}q=q+1|0;if((x|0)!=(q|0)){continue}break}}H[m+12>>2]=0;if(!Bb(1,m+12|0,H[a>>2])){break a}c=H[a>>2];e=H[c+8>>2];f=H[c+16>>2];h=e-f|0;d=H[m+12>>2];c=H[c+12>>2]-(H[c+20>>2]+(e>>>0<f>>>0)|0)|0;if(h>>>0<d>>>0&(c|0)<=0|(c|0)<0){break a}if(d){q=0;h=((t|0)!=0)+w|0;while(1){O:{if(b>>>0<s>>>0){H[b+8>>2]=h;H[b+4>>2]=0;H[b>>2]=j;b=b+12|0;d=H[m+12>>2];break O}c=b-o|0;g=(c|0)/12|0;b=g+1|0;if(b>>>0>=357913942){break c}e=(s-o|0)/12|0;f=e<<1;e=e>>>0>=178956970?357913941:b>>>0<f>>>0?f:b;if(e){if(e>>>0>=357913942){break b}f=pa(N(e,12))}else{f=0}b=f+N(g,12)|0;H[b+8>>2]=h;H[b+4>>2]=0;H[b>>2]=j;c=va(b+N((c|0)/-12|0,12)|0,o,c);s=f+N(e,12)|0;b=b+12|0;if(o){oa(o)}o=c}q=q+1|0;if(q>>>0<d>>>0){continue}break}}if((b|0)!=(o|0)){continue}break}A=1;break a}sa();v()}wa();v()}if(o){oa(o)}ca=m+32|0;return A}function Af(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=O(0),q=0,r=0;e=ca-720|0;ca=e;a:{b:{c:{d:{e:{f:{g:{h:{i:{if(J[b+38>>1]>=515){H[e+680>>2]=0;H[e+672>>2]=0;H[e+676>>2]=0;if((ea[H[H[a>>2]+24>>2]](a)|0)<=0){break d}while(1){c=ea[H[H[a>>2]+20>>2]](a,n)|0;d=H[H[H[(ea[H[H[a>>2]+28>>2]](a)|0)+4>>2]+8>>2]+(c<<2)>>2];if(H[d+28>>2]==9){f=H[e+672>>2];c=H[e+676>>2]-f>>2;k=I[d+24|0];j:{if(c>>>0<k>>>0){ya(e+672|0,k-c|0);break j}if(c>>>0<=k>>>0){break j}H[e+676>>2]=f+(k<<2)}j=0;i=H[b+8>>2];h=H[b+12>>2];c=H[b+20>>2];d=k<<2;f=H[b+16>>2];l=f+d|0;c=d>>>0>l>>>0?c+1|0:c;if(i>>>0<l>>>0&(c|0)>=(h|0)|(c|0)>(h|0)){break b}qa(H[e+672>>2],f+H[b>>2]|0,d);c=H[b+20>>2];f=d;d=d+H[b+16>>2]|0;c=f>>>0>d>>>0?c+1|0:c;i=d;H[b+16>>2]=d;H[b+20>>2]=c;l=H[b+12>>2];g=H[b+8>>2];h=d+4|0;f=h>>>0<4?c+1|0:c;d=f;if(g>>>0<h>>>0&(d|0)>=(l|0)|(d|0)>(l|0)){break b}o=H[b>>2];f=o+i|0;f=I[f|0]|I[f+1|0]<<8|(I[f+2|0]<<16|I[f+3|0]<<24);H[b+16>>2]=h;H[b+20>>2]=d;if(g>>>0<=h>>>0&(d|0)>=(l|0)|(d|0)>(l|0)){break b}d=I[h+o|0];h=i+5|0;c=h>>>0<5?c+1|0:c;H[b+16>>2]=h;H[b+20>>2]=c;if(d>>>0>31){break b}p=(A(2,f),B());H[e+20>>2]=-1;H[e+16>>2]=1832;H[e+32>>2]=0;H[e+36>>2]=0;H[e+24>>2]=0;H[e+28>>2]=0;c=H[e+672>>2];o=d-1|0;if(o>>>0<=29){H[e+20>>2]=d;k:{h=c+(k<<2)|0;l=h-c|0;f=l>>2;i=H[e+32>>2];d=H[e+24>>2];if(f>>>0<=i-d>>2>>>0){i=H[e+28>>2]-d|0;l=i>>2;i=f>>>0>l>>>0?c+i|0:h;g=i-c|0;if((c|0)!=(i|0)){va(d,c,g)}if(f>>>0>l>>>0){c=h-i|0;d=H[e+28>>2];if((h|0)!=(i|0)){va(d,i,c)}H[e+28>>2]=c+d;break k}H[e+28>>2]=d+g;break k}if(d){H[e+28>>2]=d;oa(d);H[e+32>>2]=0;H[e+24>>2]=0;H[e+28>>2]=0;i=0}l:{if((l|0)<0){break l}d=i>>>1|0;d=i>>>0>=2147483644?1073741823:d>>>0>f>>>0?d:f;if(d>>>0>=1073741824){break l}i=d<<2;d=pa(i);H[e+28>>2]=d;H[e+24>>2]=d;H[e+32>>2]=d+i;if((c|0)!=(h|0)){qa(d,c,l)}H[e+28>>2]=d+(f<<2);break k}sa();v()}L[e+36>>2]=p}m:{if(o>>>0>=30){break m}if(!Xc(e+16|0,H[H[a+60>>2]+((H[a+40>>2]-H[a+36>>2]|0)/24<<2)>>2])){break m}c=H[a+40>>2];n:{if((c|0)!=H[a+44>>2]){H[c>>2]=1832;d=H[e+20>>2];H[c+16>>2]=0;H[c+8>>2]=0;H[c+12>>2]=0;H[c+4>>2]=d;d=H[e+28>>2];f=H[e+24>>2];if((d|0)!=(f|0)){d=d-f|0;if((d|0)<0){break i}g=pa(d);H[c+12>>2]=g;H[c+8>>2]=g;H[c+16>>2]=(d&-4)+g;k=H[e+24>>2];d=H[e+28>>2];if((k|0)!=(d|0)){while(1){L[g>>2]=L[k>>2];g=g+4|0;k=k+4|0;if((d|0)!=(k|0)){continue}break}}H[c+12>>2]=g}L[c+20>>2]=L[e+36>>2];H[a+40>>2]=c+24;break n}d=0;o:{p:{q:{r:{j=H[a+40>>2];f=H[a+36>>2];i=(j-f|0)/24|0;c=i+1|0;if(c>>>0<178956971){h=(H[a+44>>2]-f|0)/24|0;l=h<<1;h=h>>>0>=89478485?178956970:c>>>0<l>>>0?l:c;if(h){if(h>>>0>=178956971){break r}d=pa(N(h,24))}g=N(i,24)+d|0;H[g>>2]=1832;c=H[e+20>>2];H[g+16>>2]=0;H[g+8>>2]=0;H[g+12>>2]=0;H[g+4>>2]=c;c=H[e+24>>2];i=H[e+28>>2];if((c|0)!=(i|0)){l=i-c|0;if((l|0)<0){break q}k=pa(l);H[g+8>>2]=k;H[g+16>>2]=(l&-4)+k;while(1){L[k>>2]=L[c>>2];k=k+4|0;c=c+4|0;if((i|0)!=(c|0)){continue}break}H[g+12>>2]=k}c=N(h,24)+d|0;L[g+20>>2]=L[e+36>>2];d=g+24|0;if((f|0)==(j|0)){break p}while(1){g=g-24|0;H[g>>2]=1832;j=j-24|0;H[g+4>>2]=H[j+4>>2];H[g+8>>2]=H[j+8>>2];H[g+12>>2]=H[j+12>>2];H[g+16>>2]=H[j+16>>2];H[j+16>>2]=0;H[j+8>>2]=0;H[j+12>>2]=0;L[g+20>>2]=L[j+20>>2];if((f|0)!=(j|0)){continue}break}H[a+44>>2]=c;k=H[a+40>>2];H[a+40>>2]=d;j=H[a+36>>2];H[a+36>>2]=g;if((j|0)==(k|0)){break o}while(1){k=k-24|0;ea[H[H[k>>2]>>2]](k)|0;if((j|0)!=(k|0)){continue}break}break o}sa();v()}wa();v()}sa();v()}H[a+44>>2]=c;H[a+40>>2]=d;H[a+36>>2]=g}if(j){oa(j)}}j=1}H[e+16>>2]=1832;c=H[e+24>>2];if(c){H[e+28>>2]=c;oa(c)}if(!j){break c}}n=n+1|0;if((ea[H[H[a>>2]+24>>2]](a)|0)>(n|0)){continue}break}break d}k=ea[H[H[a>>2]+24>>2]](a)|0;H[e+712>>2]=0;H[e+704>>2]=0;H[e+708>>2]=0;if(k){if(k>>>0>=214748365){break h}c=N(k,20);d=pa(c);H[e+704>>2]=d;H[e+712>>2]=c+d;c=c-20|0;c=(c-((c>>>0)%20|0)|0)+20|0;q=e,r=ra(d,0,c)+c|0,H[q+708>>2]=r;while(1){c=ea[H[H[a>>2]+20>>2]](a,m)|0;d=H[H[H[(ea[H[H[a>>2]+28>>2]](a)|0)+4>>2]+8>>2]+(c<<2)>>2];f=H[d+28>>2];c=f-1|0;if(c>>>0<=10){c=H[(c<<2)+13584>>2]}else{c=-1}h=(c|0)>0?c:0;if(h>>>0>4){break f}c=H[e+704>>2]+N(m,20)|0;i=I[d+24|0];H[c+16>>2]=i;H[c+12>>2]=h;H[c+8>>2]=f;H[c+4>>2]=g;H[c>>2]=d;g=g+i|0;m=m+1|0;if((k|0)!=(m|0)){continue}break}}c=ea[H[H[a>>2]+20>>2]](a,0)|0;m=H[H[H[(ea[H[H[a>>2]+28>>2]](a)|0)+4>>2]+8>>2]+(c<<2)>>2];F[m+84|0]=1;H[m+72>>2]=H[m+68>>2];h=H[b+12>>2];c=h;d=H[b+20>>2];f=H[b+8>>2];i=H[b+16>>2];if((c|0)<=(d|0)&f>>>0<=i>>>0|(c|0)<(d|0)){break f}n=H[b>>2];o=I[n+i|0];c=d;l=i+1|0;c=l?c:c+1|0;H[b+16>>2]=l;H[b+20>>2]=c;s:{switch(o|0){case 0:a=H[e+704>>2];if((H[e+708>>2]-a|0)!=20){break e}if(H[a+16>>2]!=3){break f}t:{if(f>>>0<=l>>>0&(c|0)>=(h|0)|(c|0)>(h|0)){break t}c=d;a=i+2|0;c=a>>>0<2?c+1|0:c;l=a;H[b+16>>2]=a;H[b+20>>2]=c;c=d;a=i+6|0;c=a>>>0<6?c+1|0:c;if(a>>>0>f>>>0&(c|0)>=(h|0)|(c|0)>(h|0)){break t}d=l+n|0;d=I[d|0]|I[d+1|0]<<8|(I[d+2|0]<<16|I[d+3|0]<<24);H[b+16>>2]=a;H[b+20>>2]=c;mb(m,d);j=e+672|0;H[j+20>>2]=0;H[j+12>>2]=0;H[j+16>>2]=0;H[j>>2]=0;H[j+4>>2]=0;H[j+20>>2]=d;d=Ac(e+16|0,e+704|0);k=0;g=ca-32|0;ca=g;H[g+24>>2]=0;H[g+16>>2]=0;H[g+20>>2]=0;f=H[b+12>>2];m=f;i=H[b+8>>2];c=H[b+20>>2];l=c;h=H[b+16>>2];a=h+4|0;c=a>>>0<4?c+1|0:c;u:{if(a>>>0>i>>>0&(c|0)>=(f|0)|(c|0)>(f|0)){break u}n=H[b>>2];f=n+h|0;f=I[f|0]|I[f+1|0]<<8|(I[f+2|0]<<16|I[f+3|0]<<24);H[b+16>>2]=a;H[b+20>>2]=c;v:{w:{switch(f-2|0){case 1:if((c|0)>=(m|0)&a>>>0>=i>>>0|(c|0)>(m|0)){break u}a=F[a+n|0];c=l;f=h+5|0;c=f>>>0<5?c+1|0:c;H[b+16>>2]=f;H[b+20>>2]=c;H[j+8>>2]=a;if((a|0)==1){if(Ud(j,b,g+16|0)){break v}break u}Rd(1799,23,H[3443]);break u;default:Rd(1774,24,H[3443]);break u;case 0:break w}}if(!Ud(j,b,g+16|0)){break u}}H[g+8>>2]=H[g+16>>2];H[g>>2]=H[g+20>>2];c=ca-32|0;ca=c;a=H[j>>2];p=L[j+4>>2];H[c+24>>2]=1065353216;h=-1<<a^-1;a=h;if((a|0)>0){L[c+24>>2]=p/O(a|0)}m=H[g+8>>2];n=H[g>>2];if((m|0)!=(n|0)){a=H[d+28>>2];while(1){b=H[m>>2];f=H[m+4>>2];p=L[c+24>>2];L[c+16>>2]=p*O(H[m+8>>2]-h|0);L[c+12>>2]=p*O(f-h|0);L[c+8>>2]=p*O(b-h|0);b=a;i=H[d+16>>2];f=H[i>>2];if(!I[f+84|0]){b=H[H[f+68>>2]+(a<<2)>>2]}if(K[f+80>>2]>b>>>0){a=H[f+40>>2];qa(H[H[f>>2]>>2]+N(a,b)|0,(c+8|0)+(H[i+4>>2]<<2)|0,a);n=H[g>>2];a=H[d+28>>2]}a=a+1|0;H[d+28>>2]=a;m=m+12|0;if((n|0)!=(m|0)){continue}break}}ca=c+32|0;k=1}a=H[g+16>>2];if(a){H[g+20>>2]=a;oa(a)}ca=g+32|0;yc(d);j=1;if(k){break f}}j=0;break f;case 1:break s;default:break f}}if(f>>>0<=l>>>0&(c|0)>=(h|0)|(c|0)>(h|0)){break f}o=I[l+n|0];c=d;l=i+2|0;c=l>>>0<2?c+1|0:c;H[b+16>>2]=l;H[b+20>>2]=c;if(o>>>0>=7){H[e>>2]=o;Qd(1651,e);break f}c=d;d=i+6|0;c=d>>>0<6?c+1|0:c;if(d>>>0>f>>>0&(c|0)>=(h|0)|(c|0)>(h|0)){break f}f=l+n|0;f=I[f|0]|I[f+1|0]<<8|(I[f+2|0]<<16|I[f+3|0]<<24);H[b+16>>2]=d;H[b+20>>2]=c;if(k){m=0;while(1){c=ea[H[H[a>>2]+20>>2]](a,m)|0;c=H[H[H[(ea[H[H[a>>2]+28>>2]](a)|0)+4>>2]+8>>2]+(c<<2)>>2];mb(c,f);F[c+84|0]=1;H[c+72>>2]=H[c+68>>2];m=m+1|0;if((k|0)!=(m|0)){continue}break}}a=Ac(e+672|0,e+704|0);x:{y:{switch(o|0){case 1:c=wb(e+16|0,g);b=zd(c,b,a,-1);xb(c);if(!b){break g}break x;case 2:c=ub(e+16|0,g);b=yd(c,b,a,-1);vb(c);if(!b){break g}break x;case 3:c=ub(e+16|0,g);b=xd(c,b,a,-1);vb(c);if(!b){break g}break x;case 4:c=$a(e+16|0,g);b=wd(c,b,a,-1);ab(c);if(!b){break g}break x;case 5:c=$a(e+16|0,g);b=vd(c,b,a,-1);ab(c);if(!b){break g}break x;case 6:c=$a(e+16|0,g);b=ud(c,b,a,-1);ab(c);if(b){break x}break g;case 0:break y;default:break g}}c=wb(e+16|0,g);b=Bd(c,b,a,-1);xb(c);if(!b){break g}}yc(a);j=1;break f}sa();v()}sa();v()}yc(a)}a=H[e+704>>2]}if(!a){break a}H[e+708>>2]=a;oa(a);break a}j=1;if(H[a+52>>2]==H[a+48>>2]){break b}while(1){if(!td(1,e+16|0,b)){break c}c=H[a+48>>2];d=H[e+16>>2];H[c+(m<<2)>>2]=d>>>1^0-(d&1);m=m+1|0;if(m>>>0<H[a+52>>2]-c>>2>>>0){continue}break}break b}j=0}a=H[e+672>>2];if(!a){break a}H[e+676>>2]=a;oa(a)}ca=e+720|0;return j|0}function te(a,b,c,d,e){var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;h=ca-32|0;ca=h;H[b+32>>2]=d;H[b+40>>2]=c;H[b+4>>2]=e;nc(a,d,h+16|0);a:{if(H[a>>2]){break a}if(F[a+15|0]<0){oa(H[a+4>>2])}d=I[h+23|0];if((ea[H[H[b>>2]+8>>2]](b)|0)!=(d|0)){b=pa(64);F[b+50|0]=0;c=I[1314]|I[1315]<<8;F[b+48|0]=c;F[b+49|0]=c>>>8;c=I[1310]|I[1311]<<8|(I[1312]<<16|I[1313]<<24);d=I[1306]|I[1307]<<8|(I[1308]<<16|I[1309]<<24);F[b+40|0]=d;F[b+41|0]=d>>>8;F[b+42|0]=d>>>16;F[b+43|0]=d>>>24;F[b+44|0]=c;F[b+45|0]=c>>>8;F[b+46|0]=c>>>16;F[b+47|0]=c>>>24;c=I[1302]|I[1303]<<8|(I[1304]<<16|I[1305]<<24);d=I[1298]|I[1299]<<8|(I[1300]<<16|I[1301]<<24);F[b+32|0]=d;F[b+33|0]=d>>>8;F[b+34|0]=d>>>16;F[b+35|0]=d>>>24;F[b+36|0]=c;F[b+37|0]=c>>>8;F[b+38|0]=c>>>16;F[b+39|0]=c>>>24;c=I[1294]|I[1295]<<8|(I[1296]<<16|I[1297]<<24);d=I[1290]|I[1291]<<8|(I[1292]<<16|I[1293]<<24);F[b+24|0]=d;F[b+25|0]=d>>>8;F[b+26|0]=d>>>16;F[b+27|0]=d>>>24;F[b+28|0]=c;F[b+29|0]=c>>>8;F[b+30|0]=c>>>16;F[b+31|0]=c>>>24;c=I[1286]|I[1287]<<8|(I[1288]<<16|I[1289]<<24);d=I[1282]|I[1283]<<8|(I[1284]<<16|I[1285]<<24);F[b+16|0]=d;F[b+17|0]=d>>>8;F[b+18|0]=d>>>16;F[b+19|0]=d>>>24;F[b+20|0]=c;F[b+21|0]=c>>>8;F[b+22|0]=c>>>16;F[b+23|0]=c>>>24;c=I[1278]|I[1279]<<8|(I[1280]<<16|I[1281]<<24);d=I[1274]|I[1275]<<8|(I[1276]<<16|I[1277]<<24);F[b+8|0]=d;F[b+9|0]=d>>>8;F[b+10|0]=d>>>16;F[b+11|0]=d>>>24;F[b+12|0]=c;F[b+13|0]=c>>>8;F[b+14|0]=c>>>16;F[b+15|0]=c>>>24;c=I[1270]|I[1271]<<8|(I[1272]<<16|I[1273]<<24);d=I[1266]|I[1267]<<8|(I[1268]<<16|I[1269]<<24);F[b|0]=d;F[b+1|0]=d>>>8;F[b+2|0]=d>>>16;F[b+3|0]=d>>>24;F[b+4|0]=c;F[b+5|0]=c>>>8;F[b+6|0]=c>>>16;F[b+7|0]=c>>>24;H[a>>2]=-1;za(a+4|0,b,50);oa(b);break a}c=I[h+21|0];F[b+36|0]=c;e=I[h+22|0];F[b+37|0]=e;if((c-3&255)>>>0<=253){b=pa(32);F[b+22|0]=0;c=I[1427]|I[1428]<<8|(I[1429]<<16|I[1430]<<24);d=I[1423]|I[1424]<<8|(I[1425]<<16|I[1426]<<24);F[b+14|0]=d;F[b+15|0]=d>>>8;F[b+16|0]=d>>>16;F[b+17|0]=d>>>24;F[b+18|0]=c;F[b+19|0]=c>>>8;F[b+20|0]=c>>>16;F[b+21|0]=c>>>24;c=I[1421]|I[1422]<<8|(I[1423]<<16|I[1424]<<24);d=I[1417]|I[1418]<<8|(I[1419]<<16|I[1420]<<24);F[b+8|0]=d;F[b+9|0]=d>>>8;F[b+10|0]=d>>>16;F[b+11|0]=d>>>24;F[b+12|0]=c;F[b+13|0]=c>>>8;F[b+14|0]=c>>>16;F[b+15|0]=c>>>24;c=I[1413]|I[1414]<<8|(I[1415]<<16|I[1416]<<24);d=I[1409]|I[1410]<<8|(I[1411]<<16|I[1412]<<24);F[b|0]=d;F[b+1|0]=d>>>8;F[b+2|0]=d>>>16;F[b+3|0]=d>>>24;F[b+4|0]=c;F[b+5|0]=c>>>8;F[b+6|0]=c>>>16;F[b+7|0]=c>>>24;H[a>>2]=-5;za(a+4|0,b,22);oa(b);break a}if(!((c|0)!=2|e>>>0<=(d?2:3)>>>0)){b=pa(32);F[b+22|0]=0;c=I[1404]|I[1405]<<8|(I[1406]<<16|I[1407]<<24);d=I[1400]|I[1401]<<8|(I[1402]<<16|I[1403]<<24);F[b+14|0]=d;F[b+15|0]=d>>>8;F[b+16|0]=d>>>16;F[b+17|0]=d>>>24;F[b+18|0]=c;F[b+19|0]=c>>>8;F[b+20|0]=c>>>16;F[b+21|0]=c>>>24;c=I[1398]|I[1399]<<8|(I[1400]<<16|I[1401]<<24);d=I[1394]|I[1395]<<8|(I[1396]<<16|I[1397]<<24);F[b+8|0]=d;F[b+9|0]=d>>>8;F[b+10|0]=d>>>16;F[b+11|0]=d>>>24;F[b+12|0]=c;F[b+13|0]=c>>>8;F[b+14|0]=c>>>16;F[b+15|0]=c>>>24;c=I[1390]|I[1391]<<8|(I[1392]<<16|I[1393]<<24);d=I[1386]|I[1387]<<8|(I[1388]<<16|I[1389]<<24);F[b|0]=d;F[b+1|0]=d>>>8;F[b+2|0]=d>>>16;F[b+3|0]=d>>>24;F[b+4|0]=c;F[b+5|0]=c>>>8;F[b+6|0]=c>>>16;F[b+7|0]=c>>>24;H[a>>2]=-5;za(a+4|0,b,22);oa(b);break a}c=e|c<<8;G[H[b+32>>2]+38>>1]=c;b:{if((c&65535)>>>0<259|G[h+26>>1]>=0){break b}i=ca-16|0;ca=i;e=pa(36);c=e;H[c+4>>2]=0;H[c+8>>2]=0;H[c+24>>2]=0;H[c+28>>2]=0;c=c+16|0;H[c>>2]=0;H[c+4>>2]=0;H[e>>2]=e+4;H[e+32>>2]=0;H[e+12>>2]=c;H[i>>2]=0;d=H[b+32>>2];j=ca-16|0;ca=j;c=0;c:{if(!e){break c}H[i>>2]=d;H[j+12>>2]=0;c=0;if(!Bb(1,j+12|0,d)){break c}m=H[j+12>>2];if(m){while(1){d:{if(Bb(1,j+8|0,H[i>>2])){c=pa(28);H[c+4>>2]=0;H[c+8>>2]=0;d=c+16|0;H[d>>2]=0;H[d+4>>2]=0;H[c>>2]=c+4;H[c+12>>2]=d;H[c+24>>2]=H[j+8>>2];if(ce(i,c)){break d}Ra(c+12|0,H[c+16>>2]);Qa(c,H[c+4>>2]);oa(c)}c=0;break c}f=ca-16|0;ca=f;H[f+8>>2]=c;e:{if(!c){break e}d=H[e+28>>2];f:{if(d>>>0<K[e+32>>2]){H[f+8>>2]=0;H[d>>2]=c;H[e+28>>2]=d+4;break f}d=0;g:{h:{i:{g=H[e+24>>2];l=H[e+28>>2]-g>>2;c=l+1|0;if(c>>>0<1073741824){g=H[e+32>>2]-g|0;k=g>>>1|0;g=g>>>0>=2147483644?1073741823:c>>>0<k>>>0?k:c;if(g){if(g>>>0>=1073741824){break i}d=pa(g<<2)}k=H[f+8>>2];H[f+8>>2]=0;c=(l<<2)+d|0;H[c>>2]=k;g=(g<<2)+d|0;l=c+4|0;d=H[e+28>>2];k=H[e+24>>2];if((d|0)==(k|0)){break h}while(1){d=d-4|0;o=H[d>>2];H[d>>2]=0;c=c-4|0;H[c>>2]=o;if((d|0)!=(k|0)){continue}break}H[e+32>>2]=g;g=H[e+28>>2];H[e+28>>2]=l;d=H[e+24>>2];H[e+24>>2]=c;if((d|0)==(g|0)){break g}while(1){g=g-4|0;c=H[g>>2];H[g>>2]=0;if(c){Ra(c+12|0,H[c+16>>2]);Qa(c,H[c+4>>2]);oa(c)}if((d|0)!=(g|0)){continue}break}break g}sa();v()}wa();v()}H[e+32>>2]=g;H[e+28>>2]=l;H[e+24>>2]=c}if(d){oa(d)}}c=H[f+8>>2];H[f+8>>2]=0;if(!c){break e}Ra(c+12|0,H[c+16>>2]);Qa(c,H[c+4>>2]);oa(c)}ca=f+16|0;n=n+1|0;if((m|0)!=(n|0)){continue}break}}c=ce(i,e)}ca=j+16|0;j:{if(c){d=H[b+4>>2];c=H[d+4>>2];H[d+4>>2]=e;if(c){Uc(c)}H[a>>2]=0;H[a+4>>2]=0;H[a+8>>2]=0;H[a+12>>2]=0;break j}c=pa(32);F[c+26|0]=0;d=I[1579]|I[1580]<<8;F[c+24|0]=d;F[c+25|0]=d>>>8;d=I[1575]|I[1576]<<8|(I[1577]<<16|I[1578]<<24);f=I[1571]|I[1572]<<8|(I[1573]<<16|I[1574]<<24);F[c+16|0]=f;F[c+17|0]=f>>>8;F[c+18|0]=f>>>16;F[c+19|0]=f>>>24;F[c+20|0]=d;F[c+21|0]=d>>>8;F[c+22|0]=d>>>16;F[c+23|0]=d>>>24;d=I[1567]|I[1568]<<8|(I[1569]<<16|I[1570]<<24);f=I[1563]|I[1564]<<8|(I[1565]<<16|I[1566]<<24);F[c+8|0]=f;F[c+9|0]=f>>>8;F[c+10|0]=f>>>16;F[c+11|0]=f>>>24;F[c+12|0]=d;F[c+13|0]=d>>>8;F[c+14|0]=d>>>16;F[c+15|0]=d>>>24;d=I[1559]|I[1560]<<8|(I[1561]<<16|I[1562]<<24);f=I[1555]|I[1556]<<8|(I[1557]<<16|I[1558]<<24);F[c|0]=f;F[c+1|0]=f>>>8;F[c+2|0]=f>>>16;F[c+3|0]=f>>>24;F[c+4|0]=d;F[c+5|0]=d>>>8;F[c+6|0]=d>>>16;F[c+7|0]=d>>>24;H[a>>2]=-1;za(a+4|0,c,26);oa(c);H[i+8>>2]=0;Uc(e)}ca=i+16|0;if(H[a>>2]){break a}if(F[a+15|0]>=0){break b}oa(H[a+4>>2])}if(!(ea[H[H[b>>2]+12>>2]](b)|0)){b=pa(48);F[b+33|0]=0;F[b+32|0]=I[1384];c=I[1380]|I[1381]<<8|(I[1382]<<16|I[1383]<<24);d=I[1376]|I[1377]<<8|(I[1378]<<16|I[1379]<<24);F[b+24|0]=d;F[b+25|0]=d>>>8;F[b+26|0]=d>>>16;F[b+27|0]=d>>>24;F[b+28|0]=c;F[b+29|0]=c>>>8;F[b+30|0]=c>>>16;F[b+31|0]=c>>>24;c=I[1372]|I[1373]<<8|(I[1374]<<16|I[1375]<<24);d=I[1368]|I[1369]<<8|(I[1370]<<16|I[1371]<<24);F[b+16|0]=d;F[b+17|0]=d>>>8;F[b+18|0]=d>>>16;F[b+19|0]=d>>>24;F[b+20|0]=c;F[b+21|0]=c>>>8;F[b+22|0]=c>>>16;F[b+23|0]=c>>>24;c=I[1364]|I[1365]<<8|(I[1366]<<16|I[1367]<<24);d=I[1360]|I[1361]<<8|(I[1362]<<16|I[1363]<<24);F[b+8|0]=d;F[b+9|0]=d>>>8;F[b+10|0]=d>>>16;F[b+11|0]=d>>>24;F[b+12|0]=c;F[b+13|0]=c>>>8;F[b+14|0]=c>>>16;F[b+15|0]=c>>>24;c=I[1356]|I[1357]<<8|(I[1358]<<16|I[1359]<<24);d=I[1352]|I[1353]<<8|(I[1354]<<16|I[1355]<<24);F[b|0]=d;F[b+1|0]=d>>>8;F[b+2|0]=d>>>16;F[b+3|0]=d>>>24;F[b+4|0]=c;F[b+5|0]=c>>>8;F[b+6|0]=c>>>16;F[b+7|0]=c>>>24;H[a>>2]=-1;za(a+4|0,b,33);oa(b);break a}if(!(ea[H[H[b>>2]+20>>2]](b)|0)){b=mc(h,1582);H[a>>2]=-1;a=a+4|0;if(F[b+11|0]>=0){c=H[b+4>>2];H[a>>2]=H[b>>2];H[a+4>>2]=c;H[a+8>>2]=H[b+8>>2];break a}za(a,H[b>>2],H[b+4>>2]);if(F[b+11|0]>=0){break a}oa(H[b>>2]);break a}if(!(ea[H[H[b>>2]+24>>2]](b)|0)){b=mc(h,1317);H[a>>2]=-1;a=a+4|0;if(F[b+11|0]>=0){c=H[b+4>>2];H[a>>2]=H[b>>2];H[a+4>>2]=c;H[a+8>>2]=H[b+8>>2];break a}za(a,H[b>>2],H[b+4>>2]);if(F[b+11|0]>=0){break a}oa(H[b>>2]);break a}H[a>>2]=0;H[a+4>>2]=0;H[a+8>>2]=0;H[a+12>>2]=0}ca=h+32|0}function pg(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0;m=ca-16|0;ca=m;H[m+12>>2]=b;b=pa(32);H[m>>2]=b;H[m+4>>2]=24;H[m+8>>2]=-2147483616;c=I[1206]|I[1207]<<8|(I[1208]<<16|I[1209]<<24);d=I[1202]|I[1203]<<8|(I[1204]<<16|I[1205]<<24);F[b+16|0]=d;F[b+17|0]=d>>>8;F[b+18|0]=d>>>16;F[b+19|0]=d>>>24;F[b+20|0]=c;F[b+21|0]=c>>>8;F[b+22|0]=c>>>16;F[b+23|0]=c>>>24;c=I[1198]|I[1199]<<8|(I[1200]<<16|I[1201]<<24);d=I[1194]|I[1195]<<8|(I[1196]<<16|I[1197]<<24);F[b+8|0]=d;F[b+9|0]=d>>>8;F[b+10|0]=d>>>16;F[b+11|0]=d>>>24;F[b+12|0]=c;F[b+13|0]=c>>>8;F[b+14|0]=c>>>16;F[b+15|0]=c>>>24;c=I[1190]|I[1191]<<8|(I[1192]<<16|I[1193]<<24);d=I[1186]|I[1187]<<8|(I[1188]<<16|I[1189]<<24);F[b|0]=d;F[b+1|0]=d>>>8;F[b+2|0]=d>>>16;F[b+3|0]=d>>>24;F[b+4|0]=c;F[b+5|0]=c>>>8;F[b+6|0]=c>>>16;F[b+7|0]=c>>>24;F[b+24|0]=0;l=ca-48|0;ca=l;f=H[m+12>>2];d=a;a=a+16|0;b=H[a>>2];a:{b:{if(!b){break b}c=a;while(1){e=(f|0)>H[b+16>>2];c=e?c:b;b=H[(e?b+4|0:b)>>2];if(b){continue}break}if((a|0)==(c|0)){break b}if((f|0)>=H[c+16>>2]){break a}}H[l+28>>2]=0;H[l+32>>2]=0;y=l+24|0;H[l+24>>2]=y|4;a=l+16|0;H[a>>2]=0;H[a+4>>2]=0;H[l+8>>2]=f;H[l+12>>2]=a;t=l+8|0;a=t;x=ca-16|0;ca=x;u=d+12|0;c=H[u+4>>2];c:{d:{if(!c){o=u+4|0;d=o;break d}a=H[a>>2];while(1){d=c;b=H[c+16>>2];if((b|0)>(a|0)){o=d;c=H[d>>2];if(c){continue}break d}if((a|0)<=(b|0)){g=d;a=0;break c}c=H[d+4>>2];if(c){continue}break}o=d+4|0}g=pa(32);b=H[t>>2];q=g+24|0;a=q;H[a>>2]=0;H[a+4>>2]=0;H[g+16>>2]=b;r=g+20|0;H[r>>2]=a;c=H[t+4>>2];z=t+8|0;if((c|0)!=(z|0)){while(1){p=ca-16|0;ca=p;a=p+8|0;k=c+16|0;e:{f:{g:{h:{i:{j:{k:{f=q;e=r+4|0;l:{if((f|0)==(e|0)){break l}b=I[f+27|0];h=b<<24>>24<0;i=I[k+11|0];n=i<<24>>24;j=(n|0)<0;i=j?H[k+4>>2]:i;b=h?H[f+20>>2]:b;s=i>>>0>b>>>0;w=s?b:i;if(w){j=j?H[k>>2]:k;h=h?H[f+16>>2]:f+16|0;A=Fa(j,h,w);if(!A){if(b>>>0>i>>>0){break l}break k}if((A|0)>=0){break k}break l}if(b>>>0<=i>>>0){break j}}h=H[f>>2];m:{a=f;n:{if((a|0)==H[r>>2]){break n}o:{if(!h){b=f;while(1){a=H[b+8>>2];i=H[a>>2]==(b|0);b=a;if(i){continue}break}break o}b=h;while(1){a=b;b=H[b+4>>2];if(b){continue}break}}i=I[k+11|0];s=i<<24>>24;b=(s|0)<0;j=I[a+27|0];n=j<<24>>24<0;p:{i=b?H[k+4>>2]:i;j=n?H[a+20>>2]:j;w=i>>>0<j>>>0?i:j;if(w){b=Fa(n?H[a+16>>2]:a+16|0,b?H[k>>2]:k,w);if(b){break p}}if(i>>>0>j>>>0){break n}break m}if((b|0)>=0){break m}}if(!h){H[p+12>>2]=f;a=f;break e}H[p+12>>2]=a;a=a+4|0;break e}b=H[e>>2];if(!b){H[p+12>>2]=e;a=e;break e}h=(s|0)<0?H[k>>2]:k;f=e;while(1){a=b;b=I[b+27|0];e=b<<24>>24<0;b=e?H[a+20>>2]:b;k=b>>>0<i>>>0;q:{r:{s:{t:{n=k?b:i;u:{if(n){e=e?H[a+16>>2]:a+16|0;j=Fa(h,e,n);if(!j){if(b>>>0>i>>>0){break u}break t}if((j|0)>=0){break t}break u}if(b>>>0<=i>>>0){break s}}f=a;b=H[a>>2];if(b){continue}break g}b=Fa(e,h,n);if(b){break r}}if(k){break q}break g}if((b|0)>=0){break g}}f=a+4|0;b=H[a+4>>2];if(b){continue}break}break g}b=Fa(h,j,w);if(b){break i}}if(s){break h}break f}if((b|0)>=0){break f}}h=H[f+4>>2];v:{if(!h){b=f;while(1){a=H[b+8>>2];j=H[a>>2]!=(b|0);b=a;if(j){continue}break}break v}b=h;while(1){a=b;b=H[b>>2];if(b){continue}break}}w:{x:{if((a|0)==(e|0)){break x}j=I[a+27|0];b=j<<24>>24<0;y:{j=b?H[a+20>>2]:j;s=i>>>0>j>>>0?j:i;if(s){b=Fa((n|0)<0?H[k>>2]:k,b?H[a+16>>2]:a+16|0,s);if(b){break y}}if(i>>>0<j>>>0){break x}break w}if((b|0)>=0){break w}}if(!h){H[p+12>>2]=f;a=f+4|0;break e}H[p+12>>2]=a;break e}b=H[e>>2];if(!b){H[p+12>>2]=e;a=e;break e}h=(n|0)<0?H[k>>2]:k;f=e;while(1){a=b;b=I[b+27|0];e=b<<24>>24<0;b=e?H[a+20>>2]:b;k=b>>>0<i>>>0;z:{A:{B:{C:{n=k?b:i;D:{if(n){e=e?H[a+16>>2]:a+16|0;j=Fa(h,e,n);if(!j){if(b>>>0>i>>>0){break D}break C}if((j|0)>=0){break C}break D}if(b>>>0<=i>>>0){break B}}f=a;b=H[a>>2];if(b){continue}break g}b=Fa(e,h,n);if(b){break A}}if(k){break z}break g}if((b|0)>=0){break g}}f=a+4|0;b=H[a+4>>2];if(b){continue}break}}H[p+12>>2]=a;a=f;break e}H[p+12>>2]=f;H[a>>2]=f}f=a;a=H[a>>2];if(a){b=0}else{a=pa(40);b=a+16|0;E:{if(F[c+27|0]>=0){e=H[c+20>>2];H[b>>2]=H[c+16>>2];H[b+4>>2]=e;H[b+8>>2]=H[c+24>>2];break E}za(b,H[c+16>>2],H[c+20>>2])}b=a+28|0;F:{if(F[c+39|0]>=0){e=H[c+32>>2];H[b>>2]=H[c+28>>2];H[b+4>>2]=e;H[b+8>>2]=H[c+36>>2];break F}za(b,H[c+28>>2],H[c+32>>2])}H[a+8>>2]=H[p+12>>2];H[a>>2]=0;H[a+4>>2]=0;H[f>>2]=a;b=a;e=H[H[r>>2]>>2];if(e){H[r>>2]=e;b=H[f>>2]}Sb(H[r+4>>2],b);H[r+8>>2]=H[r+8>>2]+1;b=1}F[x+12|0]=b;H[x+8>>2]=a;ca=p+16|0;b=H[c+4>>2];G:{if(b){while(1){c=b;b=H[b>>2];if(b){continue}break G}}while(1){a=c;c=H[c+8>>2];if((a|0)!=H[c>>2]){continue}break}}if((c|0)!=(z|0)){continue}break}}H[g+8>>2]=d;H[g>>2]=0;H[g+4>>2]=0;H[o>>2]=g;c=g;a=H[H[u>>2]>>2];if(a){H[u>>2]=a;c=H[o>>2]}Sb(H[u+4>>2],c);H[u+8>>2]=H[u+8>>2]+1;a=1}F[l+44|0]=a;H[l+40>>2]=g;ca=x+16|0;c=H[l+40>>2];Kb(t|4,H[l+16>>2]);Kb(y,H[l+28>>2])}f=ca-48|0;ca=f;d=f+8|0;g=ca-32|0;ca=g;o=g+32|0;b=o;a=g+21|0;H:{if((b|0)==(a|0)){break H}}e=b-a|0;I:{if((e|0)<=9){h=61;if((e|0)<(K[3660]<=1|0)){break I}}F[a|0]=49;b=a+1|0;h=0}H[g+12>>2]=h;H[g+8>>2]=b;h=ca-16|0;ca=h;e=ca-16|0;ca=e;J:{q=H[g+8>>2];g=q-a|0;if(g>>>0<=2147483631){K:{if(g>>>0<11){F[d+11|0]=g|I[d+11|0]&128;F[d+11|0]=I[d+11|0]&127;b=d;break K}t=e+8|0;if(g>>>0>=11){k=g+16&-16;b=k-1|0;b=(b|0)==11?k:b}else{b=10}Zb(t,b+1|0);b=H[e+8>>2];H[d>>2]=b;H[d+8>>2]=H[d+8>>2]&-2147483648|H[e+12>>2]&2147483647;H[d+8>>2]=H[d+8>>2]|-2147483648;H[d+4>>2]=g}while(1){if((a|0)!=(q|0)){F[b|0]=I[a|0];b=b+1|0;a=a+1|0;continue}break}F[e+7|0]=0;F[b|0]=I[e+7|0];ca=e+16|0;break J}Na();v()}ca=h+16|0;ca=o;H[f+32>>2]=m;L:{M:{a=c+20|0;d=H[a+4>>2];N:{if(!d){g=a+4|0;c=g;break N}b=I[m+11|0];c=b<<24>>24<0;e=c?H[m>>2]:m;b=c?H[m+4>>2]:b;while(1){c=d;d=I[c+27|0];g=d<<24>>24<0;d=g?H[c+20>>2]:d;o=d>>>0<b>>>0;O:{P:{Q:{R:{h=o?d:b;S:{if(h){g=g?H[c+16>>2]:c+16|0;q=Fa(e,g,h);if(!q){if(b>>>0<d>>>0){break S}break R}if((q|0)>=0){break R}break S}if(b>>>0>=d>>>0){break Q}}g=c;d=H[c>>2];if(d){continue}break N}d=Fa(g,e,h);if(d){break P}}if(o){break O}break M}if((d|0)>=0){break M}}d=H[c+4>>2];if(d){continue}break}g=c+4|0}d=pa(40);e=d+16|0;b=H[f+32>>2];T:{if(F[b+11|0]>=0){o=H[b+4>>2];H[e>>2]=H[b>>2];H[e+4>>2]=o;H[e+8>>2]=H[b+8>>2];break T}za(e,H[b>>2],H[b+4>>2])}H[d+8>>2]=c;H[d>>2]=0;H[d+4>>2]=0;H[d+36>>2]=0;H[d+28>>2]=0;H[d+32>>2]=0;H[g>>2]=d;c=d;b=H[H[a>>2]>>2];if(b){H[a>>2]=b;c=H[g>>2]}Sb(H[a+4>>2],c);H[a+8>>2]=H[a+8>>2]+1;a=1;break L}d=c;a=0}F[f+44|0]=a;H[f+40>>2]=d;a=H[f+40>>2];if(F[a+39|0]<0){oa(H[a+28>>2])}b=H[f+12>>2];H[a+28>>2]=H[f+8>>2];H[a+32>>2]=b;H[a+36>>2]=H[f+16>>2];ca=f+48|0;ca=l+48|0;if(F[m+11|0]<0){oa(H[m>>2])}ca=m+16|0}function Bd(a,b,c,d){var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;j=H[b+8>>2];e=H[b+12>>2];g=H[b+20>>2];h=H[b+16>>2];k=h+4|0;g=k>>>0<4?g+1|0:g;a:{if(j>>>0<k>>>0&(e|0)<=(g|0)|(e|0)<(g|0)){break a}h=h+H[b>>2]|0;H[a>>2]=I[h|0]|I[h+1|0]<<8|(I[h+2|0]<<16|I[h+3|0]<<24);h=H[b+20>>2];e=h;j=H[b+16>>2];g=j+4|0;h=g>>>0<4?e+1|0:e;H[b+16>>2]=g;H[b+20>>2]=h;if(K[a>>2]>32){break a}l=H[b+8>>2];k=H[b+12>>2];h=e;e=j+8|0;h=e>>>0<8?h+1|0:h;if(e>>>0>l>>>0&(h|0)>=(k|0)|(h|0)>(k|0)){break a}h=H[b>>2]+g|0;g=I[h|0]|I[h+1|0]<<8|(I[h+2|0]<<16|I[h+3|0]<<24);H[a+4>>2]=g;h=H[b+20>>2];e=H[b+16>>2]+4|0;h=e>>>0<4?h+1|0:h;H[b+16>>2]=e;H[b+20>>2]=h;if(!g){return 1}if(d>>>0<g>>>0){break a}H[a+8>>2]=0;if(!ua(a+16|0,b)){break a}if(!ua(a+36|0,b)){break a}if(!ua(a+56|0,b)){break a}if(!ua(a+76|0,b)){break a}s=H[a+4>>2];h=c;b=0;g=0;e=ca-32|0;ca=e;d=a;a=H[a+12>>2];H[e+16>>2]=0;H[e+8>>2]=0;H[e+12>>2]=0;b:{c:{if(a){if(a>>>0>=1073741824){break c}c=a<<2;b=pa(c);H[e+8>>2]=b;g=b+c|0;H[e+16>>2]=g;ra(b,0,c);H[e+12>>2]=g}c=H[d+120>>2];i=H[c>>2];if(i){H[c+4>>2]=i;oa(i);g=H[e+12>>2];b=H[e+8>>2];a=H[d+12>>2]}H[c+4>>2]=g;H[c>>2]=b;H[c+8>>2]=H[e+16>>2];b=0;H[e+16>>2]=0;H[e+8>>2]=0;H[e+12>>2]=0;d:{if(a){if(a>>>0>=1073741824){break d}a=a<<2;f=pa(a);H[e+8>>2]=f;b=a+f|0;H[e+16>>2]=b;ra(f,0,a);H[e+12>>2]=b}a=H[d+132>>2];c=H[a>>2];if(c){H[a+4>>2]=c;oa(c);f=H[e+8>>2];b=H[e+12>>2]}H[a+4>>2]=b;H[a>>2]=f;H[a+8>>2]=H[e+16>>2];H[e+24>>2]=0;H[e+28>>2]=0;H[e+16>>2]=0;H[e+20>>2]=0;H[e+8>>2]=0;H[e+12>>2]=0;xa(e+8|0);a=H[e+24>>2]+H[e+28>>2]|0;b=(a>>>0)/341|0;a=H[H[e+12>>2]+(b<<2)>>2]+N(a-N(b,341)|0,12)|0;H[a+4>>2]=0;H[a+8>>2]=0;H[a>>2]=s;c=1;a=H[e+28>>2]+1|0;H[e+28>>2]=a;e:{if(!a){break e}while(1){b=H[e+12>>2];f=H[e+24>>2];k=a-1|0;c=f+k|0;i=(c>>>0)/341|0;c=H[b+(i<<2)>>2]+N(c-N(i,341)|0,12)|0;g=H[c+8>>2];i=H[c+4>>2];j=H[c>>2];H[e+28>>2]=k;c=H[e+16>>2];if((((b|0)!=(c|0)?N(c-b>>2,341)-1|0:0)-(a+f|0)|0)+1>>>0>=682){oa(H[c-4>>2]);H[e+16>>2]=H[e+16>>2]-4}c=0;if(j>>>0>s>>>0){break e}b=H[d+12>>2];a=(b-1|0)!=(i|0)?i+1|0:0;if(a>>>0>=b>>>0){break e}f=N(g,12);o=f+H[d+132>>2]|0;k=f+H[d+120>>2]|0;i=H[d>>2];l=a<<2;m=H[l+H[o>>2]>>2];f:{g:{if((i|0)==(m|0)){if(!j){break g}o=0;b=H[h+20>>2];g=H[h+16>>2];if((b|0)==(g|0)){a=H[d+8>>2];H[h+28>>2]=j+H[h+28>>2];H[d+8>>2]=a+j;break g}while(1){c=(b|0)==(g|0);a=b;i=0;b=g;h:{if(c){break h}while(1){f=H[h+28>>2];b=a;c=N(i,20)+g|0;l=H[c>>2];if(!I[l+84|0]){f=H[H[l+68>>2]+(f<<2)>>2]}if(K[l+80>>2]<=f>>>0){break h}m=H[k>>2]+(H[c+4>>2]<<2)|0;g=H[c+12>>2];b=m;i:{if(g>>>0>3){break i}a=0;b=H[h+12>>2];if(!H[c+16>>2]){break i}while(1){b=qa(b,m+(a<<2)|0,g);g=H[c+12>>2];b=b+g|0;a=a+1|0;if(a>>>0<K[c+16>>2]){continue}break}b=H[h+12>>2]}a=H[l+40>>2];qa(H[H[l>>2]>>2]+N(a,f)|0,b,a);i=i+1|0;a=H[h+20>>2];b=a;g=H[h+16>>2];if(i>>>0<(b-g|0)/20>>>0){continue}break}}H[h+28>>2]=H[h+28>>2]+1;H[d+8>>2]=H[d+8>>2]+1;o=o+1|0;if((j|0)!=(o|0)){continue}break}break g}j:{k:{l:{m:{if(j>>>0<=2){c=H[d+108>>2];H[c>>2]=a;f=1;b=H[d+12>>2];if(b>>>0>1){break m}break j}if(K[d+8>>2]>K[d+4>>2]){break e}b=H[d+120>>2];n=g+1|0;o=N(n,12);p=b+o|0;if((p|0)!=(k|0)){Aa(p,H[k>>2],H[k+4>>2]);b=H[d+120>>2]}b=l+H[b+o>>2]|0;H[b>>2]=H[b>>2]+(1<<i+(m^-1));b=Q(j)^31;i=H[d+32>>2];m=32-i|0;n:{if((b|0)<=(m|0)){k=H[d+28>>2];if((k|0)==H[d+20>>2]){break l}m=H[k>>2];p=b+i|0;H[d+32>>2]=p;b=m<<i>>>32-b|0;if((p|0)!=32){break n}H[d+32>>2]=0;H[d+28>>2]=k+4;break n}k=H[d+28>>2];p=k+4|0;if((p|0)==H[d+20>>2]){break l}r=H[k>>2];H[d+28>>2]=p;m=b-m|0;H[d+32>>2]=m;b=H[k+4>>2]>>>32-m|r<<i>>>32-b}i=j>>>1|0;if(i>>>0<b>>>0){break e}break k}while(1){a=(b-1|0)!=(a|0)?a+1|0:0;H[c+(f<<2)>>2]=a;b=H[d+12>>2];f=f+1|0;if(b>>>0>f>>>0){continue}break}break j}i=j>>>1|0;b=0}o:{p:{b=i-b|0;c=j-b|0;q:{if((c|0)==(b|0)){c=b;break q}i=H[d+88>>2];if((i|0)==H[d+80>>2]){break p}j=H[i>>2];k=H[d+92>>2];m=k+1|0;H[d+92>>2]=m;j=j&-2147483648>>>k;r:{if((m|0)==32){H[d+92>>2]=0;H[d+88>>2]=i+4;if(j){break r}break p}if(!j){break p}}}i=c;c=b;break o}i=b}b=H[d+132>>2];j=b+f|0;f=H[j>>2];k=f+l|0;H[k>>2]=H[k>>2]+1;Aa(b+o|0,f,H[j+4>>2]);if(c){b=H[e+28>>2]+H[e+24>>2]|0;j=H[e+16>>2];f=H[e+12>>2];if((b|0)==(((f|0)!=(j|0)?N(j-f>>2,341)-1|0:0)|0)){xa(e+8|0);f=H[e+12>>2];b=H[e+24>>2]+H[e+28>>2]|0}j=(b>>>0)/341|0;b=H[(j<<2)+f>>2]+N(b-N(j,341)|0,12)|0;H[b+8>>2]=g;H[b+4>>2]=a;H[b>>2]=c;H[e+28>>2]=H[e+28>>2]+1}if(!i){break g}b=H[e+28>>2]+H[e+24>>2]|0;c=H[e+16>>2];f=H[e+12>>2];if((b|0)==(((c|0)!=(f|0)?N(c-f>>2,341)-1|0:0)|0)){xa(e+8|0);f=H[e+12>>2];b=H[e+24>>2]+H[e+28>>2]|0}c=(b>>>0)/341|0;b=H[(c<<2)+f>>2]+N(b-N(c,341)|0,12)|0;H[b+8>>2]=n;H[b+4>>2]=a;H[b>>2]=i;a=H[e+28>>2]+1|0;H[e+28>>2]=a;break f}m=0;if(!j){break g}while(1){if(H[d+12>>2]){i=H[d+40>>2];p=H[o>>2];c=H[d+96>>2];r=H[d+108>>2];a=0;while(1){g=r+(a<<2)|0;H[c+(H[g>>2]<<2)>>2]=0;b=H[d>>2];f=H[g>>2]<<2;l=H[f+p>>2];s:{if((b|0)==(l|0)){break s}f=c+f|0;b=b-l|0;l=H[d+52>>2];q=32-l|0;if((b|0)<=(q|0)){n=H[d+48>>2];if((n|0)==(i|0)){c=0;break e}H[f>>2]=H[n>>2]<<l>>>32-b;b=b+H[d+52>>2]|0;H[d+52>>2]=b;if((b|0)!=32){break s}H[d+52>>2]=0;H[d+48>>2]=n+4;break s}n=H[d+48>>2];t=n+4|0;if((i|0)==(t|0)){c=0;break e}u=H[n>>2];H[d+48>>2]=t;q=b-q|0;H[d+52>>2]=q;H[f>>2]=H[n+4>>2]>>>32-q|u<<l>>>32-b}b=H[g>>2]<<2;g=b+c|0;H[g>>2]=H[g>>2]|H[b+H[k>>2]>>2];a=a+1|0;if(a>>>0<K[d+12>>2]){continue}break}}i=0;a=H[h+16>>2];t:{if((a|0)==H[h+20>>2]){break t}while(1){f=H[h+28>>2];c=N(i,20)+a|0;l=H[c>>2];if(!I[l+84|0]){f=H[H[l+68>>2]+(f<<2)>>2]}if(K[l+80>>2]<=f>>>0){break t}n=H[d+96>>2]+(H[c+4>>2]<<2)|0;g=H[c+12>>2];b=n;u:{if(g>>>0>3){break u}a=0;b=H[h+12>>2];if(!H[c+16>>2]){break u}while(1){b=qa(b,n+(a<<2)|0,g);g=H[c+12>>2];b=b+g|0;a=a+1|0;if(a>>>0<K[c+16>>2]){continue}break}b=H[h+12>>2]}a=H[l+40>>2];qa(H[H[l>>2]>>2]+N(a,f)|0,b,a);i=i+1|0;a=H[h+16>>2];if(i>>>0<(H[h+20>>2]-a|0)/20>>>0){continue}break}}H[h+28>>2]=H[h+28>>2]+1;H[d+8>>2]=H[d+8>>2]+1;m=m+1|0;if((j|0)!=(m|0)){continue}break}}a=H[e+28>>2]}if(a){continue}break}c=1}H[e+28>>2]=0;f=H[e+16>>2];a=H[e+12>>2];b=f-a|0;if(b>>>0>=9){while(1){oa(H[a>>2]);a=H[e+12>>2]+4|0;H[e+12>>2]=a;f=H[e+16>>2];b=f-a|0;if(b>>>0>8){continue}break}}g=170;v:{switch((b>>>2|0)-1|0){case 1:g=341;case 0:H[e+24>>2]=g;break;default:break v}}w:{if((a|0)==(f|0)){break w}while(1){oa(H[a>>2]);a=a+4|0;if((f|0)!=(a|0)){continue}break}a=H[e+16>>2];b=H[e+12>>2];if((a|0)==(b|0)){break w}H[e+16>>2]=a+((b-a|0)+3&-4)}a=H[e+8>>2];if(a){oa(a)}ca=e+32|0;break b}sa();v()}sa();v()}i=c}return i}function zd(a,b,c,d){var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;j=H[b+8>>2];l=H[b+12>>2];k=H[b+20>>2];i=H[b+16>>2];f=i+4|0;k=f>>>0<4?k+1|0:k;a:{if(f>>>0>j>>>0&(k|0)>=(l|0)|(k|0)>(l|0)){break a}i=i+H[b>>2]|0;H[a>>2]=I[i|0]|I[i+1|0]<<8|(I[i+2|0]<<16|I[i+3|0]<<24);i=H[b+20>>2];j=i;f=H[b+16>>2];i=f+4|0;l=i>>>0<4?j+1|0:j;H[b+16>>2]=i;H[b+20>>2]=l;if(K[a>>2]>32){break a}l=H[b+8>>2];k=H[b+12>>2];f=f+8|0;j=f>>>0<8?j+1|0:j;if((k|0)<=(j|0)&f>>>0>l>>>0|(k|0)<(j|0)){break a}i=H[b>>2]+i|0;f=I[i|0]|I[i+1|0]<<8|(I[i+2|0]<<16|I[i+3|0]<<24);H[a+4>>2]=f;j=H[b+20>>2];i=H[b+16>>2]+4|0;j=i>>>0<4?j+1|0:j;H[b+16>>2]=i;H[b+20>>2]=j;if(!f){return 1}if(d>>>0<f>>>0){break a}H[a+8>>2]=0;if(!ua(a+16|0,b)){break a}if(!ua(a+36|0,b)){break a}if(!ua(a+56|0,b)){break a}if(!ua(a+76|0,b)){break a}t=H[a+4>>2];i=c;b=0;c=0;e=ca-32|0;ca=e;f=a;a=H[a+12>>2];H[e+16>>2]=0;H[e+8>>2]=0;H[e+12>>2]=0;b:{c:{if(a){if(a>>>0>=1073741824){break c}d=a<<2;b=pa(d);H[e+8>>2]=b;c=b+d|0;H[e+16>>2]=c;ra(b,0,d);H[e+12>>2]=c}g=H[f+120>>2];d=H[g>>2];if(d){H[g+4>>2]=d;oa(d);c=H[e+12>>2];b=H[e+8>>2];a=H[f+12>>2]}H[g+4>>2]=c;H[g>>2]=b;H[g+8>>2]=H[e+16>>2];b=0;H[e+16>>2]=0;H[e+8>>2]=0;H[e+12>>2]=0;d:{if(a){if(a>>>0>=1073741824){break d}a=a<<2;h=pa(a);H[e+8>>2]=h;b=a+h|0;H[e+16>>2]=b;ra(h,0,a);H[e+12>>2]=b}c=H[f+132>>2];a=H[c>>2];if(a){H[c+4>>2]=a;oa(a);h=H[e+8>>2];b=H[e+12>>2]}H[c+4>>2]=b;H[c>>2]=h;H[c+8>>2]=H[e+16>>2];H[e+24>>2]=0;H[e+28>>2]=0;H[e+16>>2]=0;H[e+20>>2]=0;H[e+8>>2]=0;H[e+12>>2]=0;xa(e+8|0);b=H[e+24>>2]+H[e+28>>2]|0;a=(b>>>0)/341|0;a=H[H[e+12>>2]+(a<<2)>>2]+N(b-N(a,341)|0,12)|0;H[a+4>>2]=0;H[a+8>>2]=0;H[a>>2]=t;d=1;a=H[e+28>>2]+1|0;H[e+28>>2]=a;e:{if(!a){break e}while(1){j=H[e+12>>2];g=H[e+24>>2];d=a-1|0;c=g+d|0;b=(c>>>0)/341|0;b=H[j+(b<<2)>>2]+N(c-N(b,341)|0,12)|0;n=H[b+8>>2];c=H[b+4>>2];m=H[b>>2];H[e+28>>2]=d;b=H[e+16>>2];if((((b|0)!=(j|0)?N(b-j>>2,341)-1|0:0)-(a+g|0)|0)+1>>>0>=682){oa(H[b-4>>2]);H[e+16>>2]=H[e+16>>2]-4}if(m>>>0>t>>>0){d=0;break e}d=0;b=H[f+12>>2];a=(c|0)!=(b-1|0)?c+1|0:0;if(a>>>0>=b>>>0){break e}b=H[f+120>>2];o=N(n,12);q=b+o|0;g=H[f>>2];h=a<<2;l=o+H[f+132>>2]|0;c=H[h+H[l>>2]>>2];f:{g:{if((g|0)==(c|0)){if(!m){break g}h=0;b=H[i+20>>2];c=H[i+16>>2];if((b|0)==(c|0)){a=H[f+8>>2];H[i+28>>2]=m+H[i+28>>2];H[f+8>>2]=a+m;break g}while(1){d=(b|0)==(c|0);a=b;g=0;b=c;h:{if(d){break h}while(1){d=H[i+28>>2];b=a;k=N(g,20)+c|0;l=H[k>>2];if(!I[l+84|0]){d=H[H[l+68>>2]+(d<<2)>>2]}if(K[l+80>>2]<=d>>>0){break h}j=H[q>>2]+(H[k+4>>2]<<2)|0;c=H[k+12>>2];b=j;i:{if(c>>>0>3){break i}a=0;b=H[i+12>>2];if(!H[k+16>>2]){break i}while(1){b=qa(b,j+(a<<2)|0,c);c=H[k+12>>2];b=b+c|0;a=a+1|0;if(a>>>0<K[k+16>>2]){continue}break}b=H[i+12>>2]}a=H[l+40>>2];qa(H[H[l>>2]>>2]+N(a,d)|0,b,a);g=g+1|0;a=H[i+20>>2];b=a;c=H[i+16>>2];if(g>>>0<(b-c|0)/20>>>0){continue}break}}H[i+28>>2]=H[i+28>>2]+1;H[f+8>>2]=H[f+8>>2]+1;h=h+1|0;if((m|0)!=(h|0)){continue}break}break g}j:{k:{l:{m:{if(m>>>0<=2){c=H[f+108>>2];H[c>>2]=a;h=1;b=H[f+12>>2];if(b>>>0>1){break m}break j}if(K[f+8>>2]>K[f+4>>2]){break e}j=b;b=o+12|0;Aa(j+b|0,H[q>>2],H[q+4>>2]);b=h+H[b+H[f+120>>2]>>2]|0;H[b>>2]=H[b>>2]+(1<<g+(c^-1));k=Q(m)^31;l=H[f+32>>2];g=32-l|0;n:{if((k|0)<=(g|0)){g=H[f+28>>2];if((g|0)==H[f+20>>2]){break l}c=H[g>>2];b=k+l|0;H[f+32>>2]=b;c=c<<l>>>32-k|0;if((b|0)!=32){break n}H[f+32>>2]=0;H[f+28>>2]=g+4;break n}j=H[f+28>>2];b=j+4|0;if((b|0)==H[f+20>>2]){break l}c=H[j>>2];H[f+28>>2]=b;b=k-g|0;H[f+32>>2]=b;c=H[j+4>>2]>>>32-b|c<<l>>>32-k}g=m>>>1|0;if(g>>>0<c>>>0){break e}break k}while(1){a=(b-1|0)!=(a|0)?a+1|0:0;H[c+(h<<2)>>2]=a;b=H[f+12>>2];h=h+1|0;if(b>>>0>h>>>0){continue}break}break j}g=m>>>1|0;c=0}k=n+1|0;o:{p:{b=g-c|0;c=m-b|0;q:{if((c|0)==(b|0)){c=b;break q}l=H[f+88>>2];if((l|0)==H[f+80>>2]){break p}j=H[l>>2];g=H[f+92>>2];d=g+1|0;H[f+92>>2]=d;g=j&-2147483648>>>g;r:{if((d|0)==32){H[f+92>>2]=0;H[f+88>>2]=l+4;if(g){break r}break p}if(!g){break p}}}g=c;c=b;break o}g=b}l=H[f+132>>2];j=l+o|0;d=H[j>>2];b=d+h|0;H[b>>2]=H[b>>2]+1;Aa(l+N(k,12)|0,d,H[j+4>>2]);if(c){b=H[e+28>>2]+H[e+24>>2]|0;d=H[e+16>>2];h=H[e+12>>2];if((b|0)==(((d|0)!=(h|0)?N(d-h>>2,341)-1|0:0)|0)){xa(e+8|0);h=H[e+12>>2];b=H[e+24>>2]+H[e+28>>2]|0}d=(b>>>0)/341|0;b=H[(d<<2)+h>>2]+N(b-N(d,341)|0,12)|0;H[b+8>>2]=n;H[b+4>>2]=a;H[b>>2]=c;H[e+28>>2]=H[e+28>>2]+1}if(!g){break g}b=H[e+28>>2]+H[e+24>>2]|0;c=H[e+16>>2];h=H[e+12>>2];if((b|0)==(((c|0)!=(h|0)?N(c-h>>2,341)-1|0:0)|0)){xa(e+8|0);h=H[e+12>>2];b=H[e+24>>2]+H[e+28>>2]|0}c=(b>>>0)/341|0;b=H[(c<<2)+h>>2]+N(b-N(c,341)|0,12)|0;H[b+8>>2]=k;H[b+4>>2]=a;H[b>>2]=g;a=H[e+28>>2]+1|0;H[e+28>>2]=a;break f}r=0;if(!m){break g}while(1){if(H[f+12>>2]){u=H[f+40>>2];j=H[l>>2];s=H[f+96>>2];g=H[f+108>>2];a=0;while(1){n=(a<<2)+g|0;H[s+(H[n>>2]<<2)>>2]=0;d=H[f>>2];c=H[n>>2]<<2;b=H[c+j>>2];s:{if((d|0)==(b|0)){break s}o=c+s|0;p=d-b|0;h=H[f+52>>2];d=32-h|0;if((p|0)<=(d|0)){c=H[f+48>>2];if((c|0)==(u|0)){d=0;break e}H[o>>2]=H[c>>2]<<h>>>32-p;b=p+H[f+52>>2]|0;H[f+52>>2]=b;if((b|0)!=32){break s}H[f+52>>2]=0;H[f+48>>2]=c+4;break s}k=H[f+48>>2];b=k+4|0;if((u|0)==(b|0)){d=0;break e}c=H[k>>2];H[f+48>>2]=b;b=p-d|0;H[f+52>>2]=b;H[o>>2]=H[k+4>>2]>>>32-b|c<<h>>>32-p}c=H[n>>2]<<2;b=c+s|0;H[b>>2]=H[b>>2]|H[c+H[q>>2]>>2];a=a+1|0;if(a>>>0<K[f+12>>2]){continue}break}}g=0;a=H[i+16>>2];t:{if((a|0)==H[i+20>>2]){break t}while(1){d=H[i+28>>2];h=N(g,20)+a|0;k=H[h>>2];if(!I[k+84|0]){d=H[H[k+68>>2]+(d<<2)>>2]}if(K[k+80>>2]<=d>>>0){break t}j=H[f+96>>2]+(H[h+4>>2]<<2)|0;c=H[h+12>>2];b=j;u:{if(c>>>0>3){break u}a=0;b=H[i+12>>2];if(!H[h+16>>2]){break u}while(1){b=qa(b,j+(a<<2)|0,c);c=H[h+12>>2];b=b+c|0;a=a+1|0;if(a>>>0<K[h+16>>2]){continue}break}b=H[i+12>>2]}a=H[k+40>>2];qa(H[H[k>>2]>>2]+N(a,d)|0,b,a);g=g+1|0;a=H[i+16>>2];if(g>>>0<(H[i+20>>2]-a|0)/20>>>0){continue}break}}H[i+28>>2]=H[i+28>>2]+1;H[f+8>>2]=H[f+8>>2]+1;r=r+1|0;if((m|0)!=(r|0)){continue}break}}a=H[e+28>>2]}if(a){continue}break}d=1}H[e+28>>2]=0;h=H[e+16>>2];a=H[e+12>>2];b=h-a|0;if(b>>>0>=9){while(1){oa(H[a>>2]);a=H[e+12>>2]+4|0;H[e+12>>2]=a;h=H[e+16>>2];b=h-a|0;if(b>>>0>8){continue}break}}c=170;v:{switch((b>>>2|0)-1|0){case 1:c=341;case 0:H[e+24>>2]=c;break;default:break v}}w:{if((a|0)==(h|0)){break w}while(1){oa(H[a>>2]);a=a+4|0;if((h|0)!=(a|0)){continue}break}b=H[e+16>>2];a=H[e+12>>2];if((b|0)==(a|0)){break w}H[e+16>>2]=b+((a-b|0)+3&-4)}a=H[e+8>>2];if(a){oa(a)}ca=e+32|0;g=d;break b}sa();v()}sa();v()}}return g}function wd(a,b,c,d){var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0;i=H[b+8>>2];j=H[b+12>>2];n=H[b+20>>2];e=H[b+16>>2];h=e+4|0;n=h>>>0<4?n+1|0:n;a:{if(i>>>0<h>>>0&(j|0)<=(n|0)|(j|0)<(n|0)){break a}e=e+H[b>>2]|0;H[a>>2]=I[e|0]|I[e+1|0]<<8|(I[e+2|0]<<16|I[e+3|0]<<24);e=H[b+20>>2];i=e;h=H[b+16>>2];e=h+4|0;j=e>>>0<4?i+1|0:i;H[b+16>>2]=e;H[b+20>>2]=j;if(K[a>>2]>32){break a}j=H[b+8>>2];n=H[b+12>>2];h=h+8|0;i=h>>>0<8?i+1|0:i;if(h>>>0>j>>>0&(i|0)>=(n|0)|(i|0)>(n|0)){break a}e=H[b>>2]+e|0;h=I[e|0]|I[e+1|0]<<8|(I[e+2|0]<<16|I[e+3|0]<<24);H[a+4>>2]=h;i=H[b+20>>2];e=H[b+16>>2]+4|0;i=e>>>0<4?i+1|0:i;H[b+16>>2]=e;H[b+20>>2]=i;if(!h){return 1}if(d>>>0<h>>>0){break a}H[a+8>>2]=0;if(!sb(a+16|0,b)){break a}if(!ua(a+544|0,b)){break a}if(!ua(a+564|0,b)){break a}if(!ua(a+584|0,b)){break a}u=H[a+4>>2];d=c;b=0;c=0;f=ca-32|0;ca=f;g=a;a=H[a+12>>2];H[f+16>>2]=0;H[f+8>>2]=0;H[f+12>>2]=0;b:{c:{if(a){if(a>>>0>=1073741824){break c}e=a<<2;b=pa(e);H[f+8>>2]=b;c=b+e|0;H[f+16>>2]=c;ra(b,0,e);H[f+12>>2]=c}h=H[g+628>>2];e=H[h>>2];if(e){H[h+4>>2]=e;oa(e);c=H[f+12>>2];b=H[f+8>>2];a=H[g+12>>2]}H[h+4>>2]=c;H[h>>2]=b;H[h+8>>2]=H[f+16>>2];b=0;H[f+16>>2]=0;H[f+8>>2]=0;H[f+12>>2]=0;d:{if(a){if(a>>>0>=1073741824){break d}a=a<<2;k=pa(a);H[f+8>>2]=k;b=a+k|0;H[f+16>>2]=b;ra(k,0,a);H[f+12>>2]=b}c=H[g+640>>2];a=H[c>>2];if(a){H[c+4>>2]=a;oa(a);k=H[f+8>>2];b=H[f+12>>2]}H[c+4>>2]=b;H[c>>2]=k;H[c+8>>2]=H[f+16>>2];H[f+24>>2]=0;H[f+28>>2]=0;H[f+16>>2]=0;H[f+20>>2]=0;H[f+8>>2]=0;H[f+12>>2]=0;xa(f+8|0);b=H[f+24>>2]+H[f+28>>2]|0;a=(b>>>0)/341|0;a=H[H[f+12>>2]+(a<<2)>>2]+N(b-N(a,341)|0,12)|0;H[a+4>>2]=0;H[a+8>>2]=0;H[a>>2]=u;c=1;a=H[f+28>>2]+1|0;H[f+28>>2]=a;e:{if(!a){break e}n=g+16|0;while(1){j=H[f+12>>2];h=H[f+24>>2];e=a-1|0;c=h+e|0;b=(c>>>0)/341|0;b=H[j+(b<<2)>>2]+N(c-N(b,341)|0,12)|0;q=H[b+8>>2];i=H[b+4>>2];o=H[b>>2];H[f+28>>2]=e;b=H[f+16>>2];if((((b|0)!=(j|0)?N(b-j>>2,341)-1|0:0)-(a+h|0)|0)+1>>>0>=682){oa(H[b-4>>2]);H[f+16>>2]=H[f+16>>2]-4}c=0;if(o>>>0>u>>>0){break e}a=H[g+12>>2];k=(i|0)!=(a-1|0)?i+1|0:0;if(k>>>0>=a>>>0){break e}p=N(q,12);w=p+H[g+640>>2]|0;r=p+H[g+628>>2]|0;h=H[g>>2];l=k<<2;e=H[l+H[w>>2]>>2];f:{g:{if((h|0)==(e|0)){if(!o){break g}c=H[d+16>>2];b=H[d+20>>2];m=0;while(1){e=(b|0)==(c|0);a=b;j=0;b=c;h:{if(e){break h}while(1){l=H[d+28>>2];b=a;i=N(j,20)+c|0;h=H[i>>2];if(!I[h+84|0]){l=H[H[h+68>>2]+(l<<2)>>2]}if(K[h+80>>2]<=l>>>0){break h}e=H[r>>2]+(H[i+4>>2]<<2)|0;c=H[i+12>>2];b=e;i:{if(c>>>0>3){break i}a=0;b=H[d+12>>2];if(!H[i+16>>2]){break i}while(1){b=qa(b,e+(a<<2)|0,c);c=H[i+12>>2];b=b+c|0;a=a+1|0;if(a>>>0<K[i+16>>2]){continue}break}b=H[d+12>>2]}a=H[h+40>>2];qa(H[H[h>>2]>>2]+N(a,l)|0,b,a);a=H[d+20>>2];b=a;j=j+1|0;c=H[d+16>>2];if(j>>>0<(a-c|0)/20>>>0){continue}break}}H[d+28>>2]=H[d+28>>2]+1;H[g+8>>2]=H[g+8>>2]+1;m=m+1|0;if((o|0)!=(m|0)){continue}break}break g}j:{k:{l:{if(o>>>0<=2){c=H[g+616>>2];H[c>>2]=k;a=1;b=H[g+12>>2];if(b>>>0>1){break l}break j}if(K[g+8>>2]>K[g+4>>2]){break e}a=H[g+628>>2];j=q+1|0;m=N(j,12);b=a+m|0;if((b|0)!=(r|0)){Aa(b,H[r>>2],H[r+4>>2]);a=H[g+628>>2]}a=l+H[a+m>>2]|0;H[a>>2]=H[a>>2]+(1<<h+(e^-1));b=0;a=0;c=Q(o)^31;if(!c){a=o>>>1|0;break k}while(1){b=Ba((a<<4)+n|0)|b<<1;a=a+1|0;if((c|0)!=(a|0)){continue}break}a=o>>>1|0;if(b>>>0<=a>>>0){break k}c=0;break e}while(1){k=(b-1|0)!=(k|0)?k+1|0:0;H[c+(a<<2)>>2]=k;a=a+1|0;b=H[g+12>>2];if(a>>>0<b>>>0){continue}break}break j}m:{n:{b=a-b|0;a=o-b|0;o:{if((a|0)==(b|0)){a=b;break o}i=H[g+596>>2];if((i|0)==H[g+588>>2]){break n}h=H[i>>2];e=H[g+600>>2];c=e+1|0;H[g+600>>2]=c;e=h&-2147483648>>>e;p:{if((c|0)==32){H[g+600>>2]=0;H[g+596>>2]=i+4;if(e){break p}break n}if(!e){break n}}}c=a;a=b;break m}c=b}i=H[g+640>>2];h=i+p|0;e=H[h>>2];b=e+l|0;H[b>>2]=H[b>>2]+1;Aa(i+m|0,e,H[h+4>>2]);if(a){m=H[f+28>>2]+H[f+24>>2]|0;e=H[f+16>>2];b=H[f+12>>2];if((m|0)==(((b|0)!=(e|0)?N(e-b>>2,341)-1|0:0)|0)){xa(f+8|0);m=H[f+24>>2]+H[f+28>>2]|0;e=H[f+12>>2]}else{e=b}b=(m>>>0)/341|0;b=H[e+(b<<2)>>2]+N(m-N(b,341)|0,12)|0;H[b+8>>2]=q;H[b+4>>2]=k;H[b>>2]=a;H[f+28>>2]=H[f+28>>2]+1}if(!c){break g}b=H[f+28>>2]+H[f+24>>2]|0;e=H[f+16>>2];a=H[f+12>>2];if((b|0)==(((a|0)!=(e|0)?N(e-a>>2,341)-1|0:0)|0)){xa(f+8|0);b=H[f+24>>2]+H[f+28>>2]|0;e=H[f+12>>2]}else{e=a}a=(b>>>0)/341|0;a=H[e+(a<<2)>>2]+N(b-N(a,341)|0,12)|0;H[a+8>>2]=j;H[a+4>>2]=k;H[a>>2]=c;a=H[f+28>>2]+1|0;H[f+28>>2]=a;break f}k=0;if(!o){break g}while(1){if(H[g+12>>2]){q=H[g+548>>2];i=H[w>>2];t=H[g+604>>2];h=H[g+616>>2];a=0;while(1){p=(a<<2)+h|0;H[t+(H[p>>2]<<2)>>2]=0;e=H[g>>2];c=H[p>>2]<<2;b=H[c+i>>2];q:{if((e|0)==(b|0)){break q}l=c+t|0;s=e-b|0;m=H[g+560>>2];e=32-m|0;if((s|0)<=(e|0)){c=H[g+556>>2];if((c|0)==(q|0)){c=0;break e}H[l>>2]=H[c>>2]<<m>>>32-s;b=s+H[g+560>>2]|0;H[g+560>>2]=b;if((b|0)!=32){break q}H[g+560>>2]=0;H[g+556>>2]=c+4;break q}j=H[g+556>>2];b=j+4|0;if((q|0)==(b|0)){c=0;break e}c=H[j>>2];H[g+556>>2]=b;b=s-e|0;H[g+560>>2]=b;H[l>>2]=H[j+4>>2]>>>32-b|c<<m>>>32-s}c=H[p>>2]<<2;b=c+t|0;H[b>>2]=H[b>>2]|H[c+H[r>>2]>>2];a=a+1|0;if(a>>>0<K[g+12>>2]){continue}break}}j=0;a=H[d+16>>2];r:{if((a|0)==H[d+20>>2]){break r}while(1){l=H[d+28>>2];i=N(j,20)+a|0;h=H[i>>2];if(!I[h+84|0]){l=H[H[h+68>>2]+(l<<2)>>2]}if(K[h+80>>2]<=l>>>0){break r}e=H[g+604>>2]+(H[i+4>>2]<<2)|0;c=H[i+12>>2];b=e;s:{if(c>>>0>3){break s}a=0;b=H[d+12>>2];if(!H[i+16>>2]){break s}while(1){b=qa(b,e+(a<<2)|0,c);c=H[i+12>>2];b=b+c|0;a=a+1|0;if(a>>>0<K[i+16>>2]){continue}break}b=H[d+12>>2]}a=H[h+40>>2];qa(H[H[h>>2]>>2]+N(a,l)|0,b,a);j=j+1|0;a=H[d+16>>2];if(j>>>0<(H[d+20>>2]-a|0)/20>>>0){continue}break}}H[d+28>>2]=H[d+28>>2]+1;H[g+8>>2]=H[g+8>>2]+1;k=k+1|0;if((o|0)!=(k|0)){continue}break}}a=H[f+28>>2]}if(a){continue}break}c=1}H[f+28>>2]=0;k=H[f+16>>2];a=H[f+12>>2];b=k-a|0;if(b>>>0>=9){while(1){oa(H[a>>2]);a=H[f+12>>2]+4|0;H[f+12>>2]=a;k=H[f+16>>2];b=k-a|0;if(b>>>0>8){continue}break}}d=170;t:{switch((b>>>2|0)-1|0){case 1:d=341;case 0:H[f+24>>2]=d;break;default:break t}}u:{if((a|0)==(k|0)){break u}while(1){oa(H[a>>2]);a=a+4|0;if((k|0)!=(a|0)){continue}break}b=H[f+16>>2];a=H[f+12>>2];if((b|0)==(a|0)){break u}H[f+16>>2]=b+((a-b|0)+3&-4)}a=H[f+8>>2];if(a){oa(a)}ca=f+32|0;break b}sa();v()}sa();v()}g=c}return g}function ud(a,b,c,d){var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0;i=H[b+8>>2];k=H[b+12>>2];o=H[b+20>>2];e=H[b+16>>2];h=e+4|0;o=h>>>0<4?o+1|0:o;a:{if(i>>>0<h>>>0&(k|0)<=(o|0)|(k|0)<(o|0)){break a}e=e+H[b>>2]|0;H[a>>2]=I[e|0]|I[e+1|0]<<8|(I[e+2|0]<<16|I[e+3|0]<<24);e=H[b+20>>2];i=e;h=H[b+16>>2];e=h+4|0;k=e>>>0<4?i+1|0:i;H[b+16>>2]=e;H[b+20>>2]=k;if(K[a>>2]>32){break a}k=H[b+8>>2];o=H[b+12>>2];h=h+8|0;i=h>>>0<8?i+1|0:i;if(h>>>0>k>>>0&(i|0)>=(o|0)|(i|0)>(o|0)){break a}e=H[b>>2]+e|0;h=I[e|0]|I[e+1|0]<<8|(I[e+2|0]<<16|I[e+3|0]<<24);H[a+4>>2]=h;i=H[b+20>>2];e=H[b+16>>2]+4|0;i=e>>>0<4?i+1|0:i;H[b+16>>2]=e;H[b+20>>2]=i;if(!h){return 1}if(d>>>0<h>>>0){break a}H[a+8>>2]=0;if(!sb(a+16|0,b)){break a}if(!ua(a+544|0,b)){break a}if(!ua(a+564|0,b)){break a}if(!ua(a+584|0,b)){break a}w=H[a+4>>2];d=c;b=0;c=0;f=ca-32|0;ca=f;g=a;a=H[a+12>>2];H[f+16>>2]=0;H[f+8>>2]=0;H[f+12>>2]=0;b:{c:{if(a){if(a>>>0>=1073741824){break c}e=a<<2;b=pa(e);H[f+8>>2]=b;c=b+e|0;H[f+16>>2]=c;ra(b,0,e);H[f+12>>2]=c}h=H[g+628>>2];e=H[h>>2];if(e){H[h+4>>2]=e;oa(e);c=H[f+12>>2];b=H[f+8>>2];a=H[g+12>>2]}H[h+4>>2]=c;H[h>>2]=b;H[h+8>>2]=H[f+16>>2];b=0;H[f+16>>2]=0;H[f+8>>2]=0;H[f+12>>2]=0;d:{if(a){if(a>>>0>=1073741824){break d}a=a<<2;j=pa(a);H[f+8>>2]=j;b=a+j|0;H[f+16>>2]=b;ra(j,0,a);H[f+12>>2]=b}c=H[g+640>>2];a=H[c>>2];if(a){H[c+4>>2]=a;oa(a);j=H[f+8>>2];b=H[f+12>>2]}H[c+4>>2]=b;H[c>>2]=j;H[c+8>>2]=H[f+16>>2];H[f+24>>2]=0;H[f+28>>2]=0;H[f+16>>2]=0;H[f+20>>2]=0;H[f+8>>2]=0;H[f+12>>2]=0;xa(f+8|0);b=H[f+24>>2]+H[f+28>>2]|0;a=(b>>>0)/341|0;a=H[H[f+12>>2]+(a<<2)>>2]+N(b-N(a,341)|0,12)|0;H[a+4>>2]=0;H[a+8>>2]=0;H[a>>2]=w;c=1;a=H[f+28>>2]+1|0;H[f+28>>2]=a;e:{if(!a){break e}o=g+16|0;while(1){i=H[f+12>>2];h=H[f+24>>2];e=a-1|0;c=h+e|0;b=(c>>>0)/341|0;b=H[i+(b<<2)>>2]+N(c-N(b,341)|0,12)|0;q=H[b+8>>2];n=H[b>>2];H[f+28>>2]=e;b=H[f+16>>2];if((((b|0)!=(i|0)?N(b-i>>2,341)-1|0:0)-(a+h|0)|0)+1>>>0>=682){oa(H[b-4>>2]);H[f+16>>2]=H[f+16>>2]-4}c=0;if(n>>>0>w>>>0){break e}a=H[g+628>>2];p=N(q,12);t=p+H[g+640>>2]|0;j=Vd(g,n,t);if(j>>>0>=K[g+12>>2]){break e}r=a+p|0;h=H[g>>2];l=j<<2;e=H[l+H[t>>2]>>2];f:{g:{if((h|0)==(e|0)){if(!n){break g}c=H[d+16>>2];b=H[d+20>>2];m=0;while(1){e=(b|0)==(c|0);a=b;k=0;b=c;h:{if(e){break h}while(1){l=H[d+28>>2];b=a;i=N(k,20)+c|0;h=H[i>>2];if(!I[h+84|0]){l=H[H[h+68>>2]+(l<<2)>>2]}if(K[h+80>>2]<=l>>>0){break h}e=H[r>>2]+(H[i+4>>2]<<2)|0;c=H[i+12>>2];b=e;i:{if(c>>>0>3){break i}a=0;b=H[d+12>>2];if(!H[i+16>>2]){break i}while(1){b=qa(b,e+(a<<2)|0,c);c=H[i+12>>2];b=b+c|0;a=a+1|0;if(a>>>0<K[i+16>>2]){continue}break}b=H[d+12>>2]}a=H[h+40>>2];qa(H[H[h>>2]>>2]+N(a,l)|0,b,a);a=H[d+20>>2];b=a;k=k+1|0;c=H[d+16>>2];if(k>>>0<(a-c|0)/20>>>0){continue}break}}H[d+28>>2]=H[d+28>>2]+1;H[g+8>>2]=H[g+8>>2]+1;m=m+1|0;if((n|0)!=(m|0)){continue}break}break g}j:{k:{l:{if(n>>>0<=2){c=H[g+616>>2];H[c>>2]=j;a=1;b=H[g+12>>2];if(b>>>0>1){break l}break j}if(K[g+8>>2]>K[g+4>>2]){break e}a=H[g+628>>2];k=q+1|0;m=N(k,12);b=a+m|0;if((b|0)!=(r|0)){Aa(b,H[r>>2],H[r+4>>2]);a=H[g+628>>2]}a=l+H[a+m>>2]|0;H[a>>2]=H[a>>2]+(1<<h+(e^-1));b=0;a=0;c=Q(n)^31;if(!c){a=n>>>1|0;break k}while(1){b=Ba((a<<4)+o|0)|b<<1;a=a+1|0;if((c|0)!=(a|0)){continue}break}a=n>>>1|0;if(b>>>0<=a>>>0){break k}c=0;break e}while(1){j=(b-1|0)!=(j|0)?j+1|0:0;H[c+(a<<2)>>2]=j;a=a+1|0;b=H[g+12>>2];if(a>>>0<b>>>0){continue}break}break j}m:{n:{b=a-b|0;a=n-b|0;o:{if((a|0)==(b|0)){a=b;break o}i=H[g+596>>2];if((i|0)==H[g+588>>2]){break n}h=H[i>>2];e=H[g+600>>2];c=e+1|0;H[g+600>>2]=c;e=h&-2147483648>>>e;p:{if((c|0)==32){H[g+600>>2]=0;H[g+596>>2]=i+4;if(e){break p}break n}if(!e){break n}}}c=a;a=b;break m}c=b}i=H[g+640>>2];h=i+p|0;e=H[h>>2];b=e+l|0;H[b>>2]=H[b>>2]+1;Aa(i+m|0,e,H[h+4>>2]);if(a){m=H[f+28>>2]+H[f+24>>2]|0;e=H[f+16>>2];b=H[f+12>>2];if((m|0)==(((b|0)!=(e|0)?N(e-b>>2,341)-1|0:0)|0)){xa(f+8|0);m=H[f+24>>2]+H[f+28>>2]|0;e=H[f+12>>2]}else{e=b}b=(m>>>0)/341|0;b=H[e+(b<<2)>>2]+N(m-N(b,341)|0,12)|0;H[b+8>>2]=q;H[b+4>>2]=j;H[b>>2]=a;H[f+28>>2]=H[f+28>>2]+1}if(!c){break g}b=H[f+28>>2]+H[f+24>>2]|0;e=H[f+16>>2];a=H[f+12>>2];if((b|0)==(((a|0)!=(e|0)?N(e-a>>2,341)-1|0:0)|0)){xa(f+8|0);b=H[f+24>>2]+H[f+28>>2]|0;e=H[f+12>>2]}else{e=a}a=(b>>>0)/341|0;a=H[e+(a<<2)>>2]+N(b-N(a,341)|0,12)|0;H[a+8>>2]=k;H[a+4>>2]=j;H[a>>2]=c;a=H[f+28>>2]+1|0;H[f+28>>2]=a;break f}j=0;if(!n){break g}while(1){if(H[g+12>>2]){q=H[g+548>>2];i=H[t>>2];u=H[g+604>>2];h=H[g+616>>2];a=0;while(1){p=(a<<2)+h|0;H[u+(H[p>>2]<<2)>>2]=0;e=H[g>>2];c=H[p>>2]<<2;b=H[c+i>>2];q:{if((e|0)==(b|0)){break q}l=c+u|0;s=e-b|0;m=H[g+560>>2];e=32-m|0;if((s|0)<=(e|0)){c=H[g+556>>2];if((c|0)==(q|0)){c=0;break e}H[l>>2]=H[c>>2]<<m>>>32-s;b=s+H[g+560>>2]|0;H[g+560>>2]=b;if((b|0)!=32){break q}H[g+560>>2]=0;H[g+556>>2]=c+4;break q}k=H[g+556>>2];b=k+4|0;if((q|0)==(b|0)){c=0;break e}c=H[k>>2];H[g+556>>2]=b;b=s-e|0;H[g+560>>2]=b;H[l>>2]=H[k+4>>2]>>>32-b|c<<m>>>32-s}c=H[p>>2]<<2;b=c+u|0;H[b>>2]=H[b>>2]|H[c+H[r>>2]>>2];a=a+1|0;if(a>>>0<K[g+12>>2]){continue}break}}k=0;a=H[d+16>>2];r:{if((a|0)==H[d+20>>2]){break r}while(1){l=H[d+28>>2];i=N(k,20)+a|0;h=H[i>>2];if(!I[h+84|0]){l=H[H[h+68>>2]+(l<<2)>>2]}if(K[h+80>>2]<=l>>>0){break r}e=H[g+604>>2]+(H[i+4>>2]<<2)|0;c=H[i+12>>2];b=e;s:{if(c>>>0>3){break s}a=0;b=H[d+12>>2];if(!H[i+16>>2]){break s}while(1){b=qa(b,e+(a<<2)|0,c);c=H[i+12>>2];b=b+c|0;a=a+1|0;if(a>>>0<K[i+16>>2]){continue}break}b=H[d+12>>2]}a=H[h+40>>2];qa(H[H[h>>2]>>2]+N(a,l)|0,b,a);k=k+1|0;a=H[d+16>>2];if(k>>>0<(H[d+20>>2]-a|0)/20>>>0){continue}break}}H[d+28>>2]=H[d+28>>2]+1;H[g+8>>2]=H[g+8>>2]+1;j=j+1|0;if((n|0)!=(j|0)){continue}break}}a=H[f+28>>2]}if(a){continue}break}c=1}H[f+28>>2]=0;j=H[f+16>>2];a=H[f+12>>2];b=j-a|0;if(b>>>0>=9){while(1){oa(H[a>>2]);a=H[f+12>>2]+4|0;H[f+12>>2]=a;j=H[f+16>>2];b=j-a|0;if(b>>>0>8){continue}break}}d=170;t:{switch((b>>>2|0)-1|0){case 1:d=341;case 0:H[f+24>>2]=d;break;default:break t}}u:{if((a|0)==(j|0)){break u}while(1){oa(H[a>>2]);a=a+4|0;if((j|0)!=(a|0)){continue}break}b=H[f+16>>2];a=H[f+12>>2];if((b|0)==(a|0)){break u}H[f+16>>2]=b+((a-b|0)+3&-4)}a=H[f+8>>2];if(a){oa(a)}ca=f+32|0;break b}sa();v()}sa();v()}g=c}return g}function vd(a,b,c,d){var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0;i=H[b+8>>2];k=H[b+12>>2];m=H[b+20>>2];f=H[b+16>>2];h=f+4|0;m=h>>>0<4?m+1|0:m;a:{if(i>>>0<h>>>0&(k|0)<=(m|0)|(k|0)<(m|0)){break a}f=f+H[b>>2]|0;H[a>>2]=I[f|0]|I[f+1|0]<<8|(I[f+2|0]<<16|I[f+3|0]<<24);f=H[b+20>>2];i=f;h=H[b+16>>2];f=h+4|0;k=f>>>0<4?i+1|0:i;H[b+16>>2]=f;H[b+20>>2]=k;if(K[a>>2]>32){break a}k=H[b+8>>2];m=H[b+12>>2];h=h+8|0;i=h>>>0<8?i+1|0:i;if(h>>>0>k>>>0&(i|0)>=(m|0)|(i|0)>(m|0)){break a}f=f+H[b>>2]|0;h=I[f|0]|I[f+1|0]<<8|(I[f+2|0]<<16|I[f+3|0]<<24);H[a+4>>2]=h;i=H[b+20>>2];f=H[b+16>>2]+4|0;i=f>>>0<4?i+1|0:i;H[b+16>>2]=f;H[b+20>>2]=i;if(!h){return 1}if(d>>>0<h>>>0){break a}H[a+8>>2]=0;if(!sb(a+16|0,b)){break a}if(!ua(a+544|0,b)){break a}if(!ua(a+564|0,b)){break a}if(!ua(a+584|0,b)){break a}u=H[a+4>>2];b=0;e=ca-32|0;ca=e;f=a;a=H[a+12>>2];H[e+16>>2]=0;H[e+8>>2]=0;H[e+12>>2]=0;b:{c:{if(a){if(a>>>0>=1073741824){break c}d=a<<2;b=pa(d);H[e+8>>2]=b;g=b+d|0;H[e+16>>2]=g;ra(b,0,d);H[e+12>>2]=g}h=H[f+628>>2];d=H[h>>2];if(d){H[h+4>>2]=d;oa(d);g=H[e+12>>2];b=H[e+8>>2];a=H[f+12>>2]}H[h+4>>2]=g;H[h>>2]=b;H[h+8>>2]=H[e+16>>2];b=0;H[e+16>>2]=0;H[e+8>>2]=0;H[e+12>>2]=0;d:{if(a){if(a>>>0>=1073741824){break d}a=a<<2;j=pa(a);H[e+8>>2]=j;b=a+j|0;H[e+16>>2]=b;ra(j,0,a);H[e+12>>2]=b}d=H[f+640>>2];a=H[d>>2];if(a){H[d+4>>2]=a;oa(a);j=H[e+8>>2];b=H[e+12>>2]}H[d+4>>2]=b;H[d>>2]=j;H[d+8>>2]=H[e+16>>2];H[e+24>>2]=0;H[e+28>>2]=0;H[e+16>>2]=0;H[e+20>>2]=0;H[e+8>>2]=0;H[e+12>>2]=0;xa(e+8|0);b=H[e+24>>2]+H[e+28>>2]|0;a=(b>>>0)/341|0;a=H[H[e+12>>2]+(a<<2)>>2]+N(b-N(a,341)|0,12)|0;H[a+4>>2]=0;H[a+8>>2]=0;H[a>>2]=u;d=1;a=H[e+28>>2]+1|0;H[e+28>>2]=a;e:{if(!a){break e}m=f+16|0;while(1){k=H[e+12>>2];h=H[e+24>>2];g=a-1|0;d=h+g|0;b=(d>>>0)/341|0;b=H[k+(b<<2)>>2]+N(d-N(b,341)|0,12)|0;q=H[b+8>>2];i=H[b+4>>2];n=H[b>>2];H[e+28>>2]=g;b=H[e+16>>2];if((((b|0)!=(k|0)?N(b-k>>2,341)-1|0:0)-(a+h|0)|0)+1>>>0>=682){oa(H[b-4>>2]);H[e+16>>2]=H[e+16>>2]-4}if(n>>>0>u>>>0){d=0;break e}d=0;a=H[f+12>>2];j=(i|0)!=(a-1|0)?i+1|0:0;if(j>>>0>=a>>>0){break e}a=H[f+628>>2];o=N(q,12);s=a+o|0;g=H[f>>2];l=j<<2;k=o+H[f+640>>2]|0;b=H[l+H[k>>2]>>2];f:{g:{if((g|0)==(b|0)){if(!n){break g}g=H[c+16>>2];b=H[c+20>>2];p=0;while(1){d=(b|0)==(g|0);a=b;j=0;b=g;h:{if(d){break h}while(1){d=H[c+28>>2];b=a;k=N(j,20)+g|0;i=H[k>>2];if(!I[i+84|0]){d=H[H[i+68>>2]+(d<<2)>>2]}if(K[i+80>>2]<=d>>>0){break h}h=H[s>>2]+(H[k+4>>2]<<2)|0;g=H[k+12>>2];b=h;i:{if(g>>>0>3){break i}a=0;b=H[c+12>>2];if(!H[k+16>>2]){break i}while(1){b=qa(b,h+(a<<2)|0,g);g=H[k+12>>2];b=b+g|0;a=a+1|0;if(a>>>0<K[k+16>>2]){continue}break}b=H[c+12>>2]}a=H[i+40>>2];qa(H[H[i>>2]>>2]+N(a,d)|0,b,a);a=H[c+20>>2];b=a;j=j+1|0;g=H[c+16>>2];if(j>>>0<(a-g|0)/20>>>0){continue}break}}H[c+28>>2]=H[c+28>>2]+1;H[f+8>>2]=H[f+8>>2]+1;p=p+1|0;if((p|0)!=(n|0)){continue}break}break g}j:{k:{l:{if(n>>>0<=2){d=H[f+616>>2];H[d>>2]=j;a=1;b=H[f+12>>2];if(b>>>0>1){break l}break j}if(K[f+8>>2]>K[f+4>>2]){break e}d=a;a=o+12|0;Aa(d+a|0,H[s>>2],H[s+4>>2]);a=l+H[a+H[f+628>>2]>>2]|0;H[a>>2]=H[a>>2]+(1<<g+(b^-1));b=0;a=0;d=Q(n)^31;if(!d){a=n>>>1|0;break k}while(1){b=Ba((a<<4)+m|0)|b<<1;a=a+1|0;if((d|0)!=(a|0)){continue}break}a=n>>>1|0;if(b>>>0<=a>>>0){break k}d=0;break e}while(1){j=(b-1|0)!=(j|0)?j+1|0:0;H[d+(a<<2)>>2]=j;a=a+1|0;b=H[f+12>>2];if(a>>>0<b>>>0){continue}break}break j}k=q+1|0;m:{n:{b=a-b|0;a=n-b|0;o:{if((a|0)==(b|0)){a=b;break o}i=H[f+596>>2];if((i|0)==H[f+588>>2]){break n}h=H[i>>2];g=H[f+600>>2];d=g+1|0;H[f+600>>2]=d;g=h&-2147483648>>>g;p:{if((d|0)==32){H[f+600>>2]=0;H[f+596>>2]=i+4;if(g){break p}break n}if(!g){break n}}}d=a;a=b;break m}d=b}i=H[f+640>>2];h=i+o|0;g=H[h>>2];b=g+l|0;H[b>>2]=H[b>>2]+1;Aa(i+N(k,12)|0,g,H[h+4>>2]);if(a){h=H[e+28>>2]+H[e+24>>2]|0;g=H[e+16>>2];b=H[e+12>>2];if((h|0)==(((b|0)!=(g|0)?N(g-b>>2,341)-1|0:0)|0)){xa(e+8|0);h=H[e+24>>2]+H[e+28>>2]|0;g=H[e+12>>2]}else{g=b}b=(h>>>0)/341|0;b=H[g+(b<<2)>>2]+N(h-N(b,341)|0,12)|0;H[b+8>>2]=q;H[b+4>>2]=j;H[b>>2]=a;H[e+28>>2]=H[e+28>>2]+1}if(!d){break g}b=H[e+28>>2]+H[e+24>>2]|0;g=H[e+16>>2];a=H[e+12>>2];if((b|0)==(((a|0)!=(g|0)?N(g-a>>2,341)-1|0:0)|0)){xa(e+8|0);b=H[e+24>>2]+H[e+28>>2]|0;g=H[e+12>>2]}else{g=a}a=(b>>>0)/341|0;a=H[g+(a<<2)>>2]+N(b-N(a,341)|0,12)|0;H[a+8>>2]=k;H[a+4>>2]=j;H[a>>2]=d;a=H[e+28>>2]+1|0;H[e+28>>2]=a;break f}p=0;if(!n){break g}while(1){if(H[f+12>>2]){w=H[f+548>>2];i=H[k>>2];t=H[f+604>>2];h=H[f+616>>2];a=0;while(1){j=h+(a<<2)|0;H[(H[j>>2]<<2)+t>>2]=0;g=H[f>>2];d=H[j>>2]<<2;b=H[d+i>>2];q:{if((g|0)==(b|0)){break q}q=d+t|0;r=g-b|0;o=H[f+560>>2];g=32-o|0;if((r|0)<=(g|0)){d=H[f+556>>2];if((d|0)==(w|0)){d=0;break e}H[q>>2]=H[d>>2]<<o>>>32-r;b=H[f+560>>2]+r|0;H[f+560>>2]=b;if((b|0)!=32){break q}H[f+560>>2]=0;H[f+556>>2]=d+4;break q}l=H[f+556>>2];b=l+4|0;if((b|0)==(w|0)){d=0;break e}d=H[l>>2];H[f+556>>2]=b;b=r-g|0;H[f+560>>2]=b;H[q>>2]=H[l+4>>2]>>>32-b|d<<o>>>32-r}d=H[j>>2]<<2;b=d+t|0;H[b>>2]=H[b>>2]|H[d+H[s>>2]>>2];a=a+1|0;if(a>>>0<K[f+12>>2]){continue}break}}j=0;a=H[c+16>>2];r:{if((a|0)==H[c+20>>2]){break r}while(1){d=H[c+28>>2];l=N(j,20)+a|0;i=H[l>>2];if(!I[i+84|0]){d=H[H[i+68>>2]+(d<<2)>>2]}if(K[i+80>>2]<=d>>>0){break r}h=H[f+604>>2]+(H[l+4>>2]<<2)|0;g=H[l+12>>2];b=h;s:{if(g>>>0>3){break s}a=0;b=H[c+12>>2];if(!H[l+16>>2]){break s}while(1){b=qa(b,h+(a<<2)|0,g);g=H[l+12>>2];b=b+g|0;a=a+1|0;if(a>>>0<K[l+16>>2]){continue}break}b=H[c+12>>2]}a=H[i+40>>2];qa(H[H[i>>2]>>2]+N(a,d)|0,b,a);j=j+1|0;a=H[c+16>>2];if(j>>>0<(H[c+20>>2]-a|0)/20>>>0){continue}break}}H[c+28>>2]=H[c+28>>2]+1;H[f+8>>2]=H[f+8>>2]+1;p=p+1|0;if((p|0)!=(n|0)){continue}break}}a=H[e+28>>2]}if(a){continue}break}d=1}H[e+28>>2]=0;j=H[e+16>>2];a=H[e+12>>2];b=j-a|0;if(b>>>0>=9){while(1){oa(H[a>>2]);a=H[e+12>>2]+4|0;H[e+12>>2]=a;j=H[e+16>>2];b=j-a|0;if(b>>>0>8){continue}break}}g=170;t:{switch((b>>>2|0)-1|0){case 1:g=341;case 0:H[e+24>>2]=g;break;default:break t}}u:{if((a|0)==(j|0)){break u}while(1){oa(H[a>>2]);a=a+4|0;if((j|0)!=(a|0)){continue}break}b=H[e+16>>2];a=H[e+12>>2];if((b|0)==(a|0)){break u}H[e+16>>2]=b+((a-b|0)+3&-4)}a=H[e+8>>2];if(a){oa(a)}ca=e+32|0;break b}sa();v()}sa();v()}g=d}return g}function yd(a,b,c,d){var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0;j=H[b+8>>2];e=H[b+12>>2];g=H[b+20>>2];h=H[b+16>>2];l=h+4|0;g=l>>>0<4?g+1|0:g;a:{if(j>>>0<l>>>0&(e|0)<=(g|0)|(e|0)<(g|0)){break a}h=h+H[b>>2]|0;H[a>>2]=I[h|0]|I[h+1|0]<<8|(I[h+2|0]<<16|I[h+3|0]<<24);h=H[b+20>>2];e=h;j=H[b+16>>2];g=j+4|0;h=g>>>0<4?e+1|0:e;H[b+16>>2]=g;H[b+20>>2]=h;if(K[a>>2]>32){break a}k=H[b+8>>2];l=H[b+12>>2];h=e;e=j+8|0;h=e>>>0<8?h+1|0:h;if(e>>>0>k>>>0&(h|0)>=(l|0)|(h|0)>(l|0)){break a}h=H[b>>2]+g|0;g=I[h|0]|I[h+1|0]<<8|(I[h+2|0]<<16|I[h+3|0]<<24);H[a+4>>2]=g;h=H[b+20>>2];e=H[b+16>>2]+4|0;h=e>>>0<4?h+1|0:h;H[b+16>>2]=e;H[b+20>>2]=h;if(!g){return 1}if(d>>>0<g>>>0){break a}H[a+8>>2]=0;if(!ta(a+16|0,b)){break a}if(!ua(a+32|0,b)){break a}if(!ua(a+52|0,b)){break a}if(!ua(a+72|0,b)){break a}r=H[a+4>>2];h=c;b=0;g=0;e=ca-32|0;ca=e;d=a;a=H[a+12>>2];H[e+16>>2]=0;H[e+8>>2]=0;H[e+12>>2]=0;b:{c:{if(a){if(a>>>0>=1073741824){break c}c=a<<2;b=pa(c);H[e+8>>2]=b;g=b+c|0;H[e+16>>2]=g;ra(b,0,c);H[e+12>>2]=g}c=H[d+116>>2];i=H[c>>2];if(i){H[c+4>>2]=i;oa(i);g=H[e+12>>2];b=H[e+8>>2];a=H[d+12>>2]}H[c+4>>2]=g;H[c>>2]=b;H[c+8>>2]=H[e+16>>2];b=0;H[e+16>>2]=0;H[e+8>>2]=0;H[e+12>>2]=0;d:{if(a){if(a>>>0>=1073741824){break d}a=a<<2;f=pa(a);H[e+8>>2]=f;b=a+f|0;H[e+16>>2]=b;ra(f,0,a);H[e+12>>2]=b}a=H[d+128>>2];c=H[a>>2];if(c){H[a+4>>2]=c;oa(c);f=H[e+8>>2];b=H[e+12>>2]}H[a+4>>2]=b;H[a>>2]=f;H[a+8>>2]=H[e+16>>2];H[e+24>>2]=0;H[e+28>>2]=0;H[e+16>>2]=0;H[e+20>>2]=0;H[e+8>>2]=0;H[e+12>>2]=0;xa(e+8|0);a=H[e+24>>2]+H[e+28>>2]|0;b=(a>>>0)/341|0;a=H[H[e+12>>2]+(b<<2)>>2]+N(a-N(b,341)|0,12)|0;H[a+4>>2]=0;H[a+8>>2]=0;H[a>>2]=r;c=1;a=H[e+28>>2]+1|0;H[e+28>>2]=a;e:{if(!a){break e}t=d+16|0;while(1){b=H[e+12>>2];f=H[e+24>>2];l=a-1|0;c=f+l|0;i=(c>>>0)/341|0;c=H[b+(i<<2)>>2]+N(c-N(i,341)|0,12)|0;g=H[c+8>>2];i=H[c+4>>2];j=H[c>>2];H[e+28>>2]=l;c=H[e+16>>2];if((((b|0)!=(c|0)?N(c-b>>2,341)-1|0:0)-(a+f|0)|0)+1>>>0>=682){oa(H[c-4>>2]);H[e+16>>2]=H[e+16>>2]-4}c=0;if(j>>>0>r>>>0){break e}b=H[d+12>>2];a=(b-1|0)!=(i|0)?i+1|0:0;if(a>>>0>=b>>>0){break e}f=N(g,12);o=f+H[d+128>>2]|0;l=f+H[d+116>>2]|0;i=H[d>>2];k=a<<2;n=H[k+H[o>>2]>>2];f:{if((i|0)==(n|0)){if(!j){break f}o=0;b=H[h+20>>2];g=H[h+16>>2];if((b|0)==(g|0)){a=H[d+8>>2];H[h+28>>2]=j+H[h+28>>2];H[d+8>>2]=a+j;break f}while(1){c=(b|0)==(g|0);a=b;i=0;b=g;g:{if(c){break g}while(1){f=H[h+28>>2];b=a;c=N(i,20)+g|0;k=H[c>>2];if(!I[k+84|0]){f=H[H[k+68>>2]+(f<<2)>>2]}if(K[k+80>>2]<=f>>>0){break g}n=H[l>>2]+(H[c+4>>2]<<2)|0;g=H[c+12>>2];b=n;h:{if(g>>>0>3){break h}a=0;b=H[h+12>>2];if(!H[c+16>>2]){break h}while(1){b=qa(b,n+(a<<2)|0,g);g=H[c+12>>2];b=b+g|0;a=a+1|0;if(a>>>0<K[c+16>>2]){continue}break}b=H[h+12>>2]}a=H[k+40>>2];qa(H[H[k>>2]>>2]+N(a,f)|0,b,a);i=i+1|0;a=H[h+20>>2];b=a;g=H[h+16>>2];if(i>>>0<(b-g|0)/20>>>0){continue}break}}H[h+28>>2]=H[h+28>>2]+1;H[d+8>>2]=H[d+8>>2]+1;o=o+1|0;if((j|0)!=(o|0)){continue}break}break f}i:{j:{k:{l:{if(j>>>0<=2){c=H[d+104>>2];H[c>>2]=a;f=1;b=H[d+12>>2];if(b>>>0>1){break l}break i}if(K[d+8>>2]>K[d+4>>2]){break e}b=H[d+116>>2];m=g+1|0;o=N(m,12);q=b+o|0;if((q|0)!=(l|0)){Aa(q,H[l>>2],H[l+4>>2]);b=H[d+116>>2]}b=k+H[b+o>>2]|0;H[b>>2]=H[b>>2]+(1<<i+(n^-1));H[e+4>>2]=0;pc(t,Q(j)^31,e+4|0);b=j>>>1|0;i=H[e+4>>2];if(b>>>0<i>>>0){break e}b=b-i|0;c=j-b|0;m:{if((c|0)==(b|0)){c=b;break m}i=H[d+84>>2];if((i|0)==H[d+76>>2]){break k}j=H[i>>2];l=H[d+88>>2];n=l+1|0;H[d+88>>2]=n;j=j&-2147483648>>>l;n:{if((n|0)==32){H[d+88>>2]=0;H[d+84>>2]=i+4;if(j){break n}break k}if(!j){break k}}}i=c;c=b;break j}while(1){a=(b-1|0)!=(a|0)?a+1|0:0;H[c+(f<<2)>>2]=a;b=H[d+12>>2];f=f+1|0;if(b>>>0>f>>>0){continue}break}break i}i=b}b=H[d+128>>2];j=b+f|0;f=H[j>>2];l=f+k|0;H[l>>2]=H[l>>2]+1;Aa(b+o|0,f,H[j+4>>2]);if(c){b=H[e+28>>2]+H[e+24>>2]|0;j=H[e+16>>2];f=H[e+12>>2];if((b|0)==(((f|0)!=(j|0)?N(j-f>>2,341)-1|0:0)|0)){xa(e+8|0);f=H[e+12>>2];b=H[e+24>>2]+H[e+28>>2]|0}j=(b>>>0)/341|0;b=H[(j<<2)+f>>2]+N(b-N(j,341)|0,12)|0;H[b+8>>2]=g;H[b+4>>2]=a;H[b>>2]=c;H[e+28>>2]=H[e+28>>2]+1}if(!i){break f}b=H[e+28>>2]+H[e+24>>2]|0;c=H[e+16>>2];f=H[e+12>>2];if((b|0)==(((c|0)!=(f|0)?N(c-f>>2,341)-1|0:0)|0)){xa(e+8|0);f=H[e+12>>2];b=H[e+24>>2]+H[e+28>>2]|0}c=(b>>>0)/341|0;b=H[(c<<2)+f>>2]+N(b-N(c,341)|0,12)|0;H[b+8>>2]=m;H[b+4>>2]=a;H[b>>2]=i;H[e+28>>2]=H[e+28>>2]+1;break f}n=0;if(!j){break f}while(1){if(H[d+12>>2]){i=H[d+36>>2];q=H[o>>2];c=H[d+92>>2];u=H[d+104>>2];a=0;while(1){g=(a<<2)+u|0;H[c+(H[g>>2]<<2)>>2]=0;b=H[d>>2];f=H[g>>2]<<2;k=H[f+q>>2];o:{if((b|0)==(k|0)){break o}f=c+f|0;b=b-k|0;k=H[d+48>>2];p=32-k|0;if((b|0)<=(p|0)){m=H[d+44>>2];if((m|0)==(i|0)){c=0;break e}H[f>>2]=H[m>>2]<<k>>>32-b;b=b+H[d+48>>2]|0;H[d+48>>2]=b;if((b|0)!=32){break o}H[d+48>>2]=0;H[d+44>>2]=m+4;break o}m=H[d+44>>2];s=m+4|0;if((i|0)==(s|0)){c=0;break e}w=H[m>>2];H[d+44>>2]=s;p=b-p|0;H[d+48>>2]=p;H[f>>2]=H[m+4>>2]>>>32-p|w<<k>>>32-b}b=H[g>>2]<<2;g=b+c|0;H[g>>2]=H[g>>2]|H[b+H[l>>2]>>2];a=a+1|0;if(a>>>0<K[d+12>>2]){continue}break}}i=0;a=H[h+16>>2];p:{if((a|0)==H[h+20>>2]){break p}while(1){f=H[h+28>>2];c=N(i,20)+a|0;k=H[c>>2];if(!I[k+84|0]){f=H[H[k+68>>2]+(f<<2)>>2]}if(K[k+80>>2]<=f>>>0){break p}m=H[d+92>>2]+(H[c+4>>2]<<2)|0;g=H[c+12>>2];b=m;q:{if(g>>>0>3){break q}a=0;b=H[h+12>>2];if(!H[c+16>>2]){break q}while(1){b=qa(b,m+(a<<2)|0,g);g=H[c+12>>2];b=b+g|0;a=a+1|0;if(a>>>0<K[c+16>>2]){continue}break}b=H[h+12>>2]}a=H[k+40>>2];qa(H[H[k>>2]>>2]+N(a,f)|0,b,a);i=i+1|0;a=H[h+16>>2];if(i>>>0<(H[h+20>>2]-a|0)/20>>>0){continue}break}}H[h+28>>2]=H[h+28>>2]+1;H[d+8>>2]=H[d+8>>2]+1;n=n+1|0;if((j|0)!=(n|0)){continue}break}}a=H[e+28>>2];if(a){continue}break}c=1}H[e+28>>2]=0;f=H[e+16>>2];a=H[e+12>>2];b=f-a|0;if(b>>>0>=9){while(1){oa(H[a>>2]);a=H[e+12>>2]+4|0;H[e+12>>2]=a;f=H[e+16>>2];b=f-a|0;if(b>>>0>8){continue}break}}g=170;r:{switch((b>>>2|0)-1|0){case 1:g=341;case 0:H[e+24>>2]=g;break;default:break r}}s:{if((a|0)==(f|0)){break s}while(1){oa(H[a>>2]);a=a+4|0;if((f|0)!=(a|0)){continue}break}a=H[e+16>>2];b=H[e+12>>2];if((a|0)==(b|0)){break s}H[e+16>>2]=a+((b-a|0)+3&-4)}a=H[e+8>>2];if(a){oa(a)}ca=e+32|0;break b}sa();v()}sa();v()}i=c}return i}function xd(a,b,c,d){var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0;i=H[b+8>>2];k=H[b+12>>2];n=H[b+20>>2];h=H[b+16>>2];f=h+4|0;n=f>>>0<4?n+1|0:n;a:{if((k|0)<=(n|0)&f>>>0>i>>>0|(k|0)<(n|0)){break a}h=h+H[b>>2]|0;H[a>>2]=I[h|0]|I[h+1|0]<<8|(I[h+2|0]<<16|I[h+3|0]<<24);h=H[b+20>>2];i=h;f=H[b+16>>2];h=f+4|0;k=h>>>0<4?i+1|0:i;H[b+16>>2]=h;H[b+20>>2]=k;if(K[a>>2]>32){break a}k=H[b+8>>2];n=H[b+12>>2];f=f+8|0;i=f>>>0<8?i+1|0:i;if(f>>>0>k>>>0&(i|0)>=(n|0)|(i|0)>(n|0)){break a}h=H[b>>2]+h|0;f=I[h|0]|I[h+1|0]<<8|(I[h+2|0]<<16|I[h+3|0]<<24);H[a+4>>2]=f;i=H[b+20>>2];h=H[b+16>>2]+4|0;i=h>>>0<4?i+1|0:i;H[b+16>>2]=h;H[b+20>>2]=i;if(!f){return 1}if(d>>>0<f>>>0){break a}H[a+8>>2]=0;if(!ta(a+16|0,b)){break a}if(!ua(a+32|0,b)){break a}if(!ua(a+52|0,b)){break a}if(!ua(a+72|0,b)){break a}u=H[a+4>>2];h=c;b=0;c=0;e=ca-32|0;ca=e;f=a;a=H[a+12>>2];H[e+16>>2]=0;H[e+8>>2]=0;H[e+12>>2]=0;b:{c:{if(a){if(a>>>0>=1073741824){break c}d=a<<2;b=pa(d);H[e+8>>2]=b;c=b+d|0;H[e+16>>2]=c;ra(b,0,d);H[e+12>>2]=c}j=H[f+116>>2];d=H[j>>2];if(d){H[j+4>>2]=d;oa(d);c=H[e+12>>2];b=H[e+8>>2];a=H[f+12>>2]}H[j+4>>2]=c;H[j>>2]=b;H[j+8>>2]=H[e+16>>2];b=0;H[e+16>>2]=0;H[e+8>>2]=0;H[e+12>>2]=0;d:{if(a){if(a>>>0>=1073741824){break d}a=a<<2;g=pa(a);H[e+8>>2]=g;b=a+g|0;H[e+16>>2]=b;ra(g,0,a);H[e+12>>2]=b}c=H[f+128>>2];a=H[c>>2];if(a){H[c+4>>2]=a;oa(a);g=H[e+8>>2];b=H[e+12>>2]}H[c+4>>2]=b;H[c>>2]=g;H[c+8>>2]=H[e+16>>2];H[e+24>>2]=0;H[e+28>>2]=0;H[e+16>>2]=0;H[e+20>>2]=0;H[e+8>>2]=0;H[e+12>>2]=0;xa(e+8|0);b=H[e+24>>2]+H[e+28>>2]|0;a=(b>>>0)/341|0;a=H[H[e+12>>2]+(a<<2)>>2]+N(b-N(a,341)|0,12)|0;H[a+4>>2]=0;H[a+8>>2]=0;H[a>>2]=u;d=1;a=H[e+28>>2]+1|0;H[e+28>>2]=a;e:{if(!a){break e}n=f+16|0;while(1){i=H[e+12>>2];j=H[e+24>>2];d=a-1|0;c=j+d|0;b=(c>>>0)/341|0;b=H[i+(b<<2)>>2]+N(c-N(b,341)|0,12)|0;o=H[b+8>>2];c=H[b+4>>2];m=H[b>>2];H[e+28>>2]=d;b=H[e+16>>2];if((((b|0)!=(i|0)?N(b-i>>2,341)-1|0:0)-(a+j|0)|0)+1>>>0>=682){oa(H[b-4>>2]);H[e+16>>2]=H[e+16>>2]-4}if(m>>>0>u>>>0){d=0;break e}d=0;b=H[f+12>>2];a=(c|0)!=(b-1|0)?c+1|0:0;if(a>>>0>=b>>>0){break e}b=H[f+116>>2];p=N(o,12);r=b+p|0;j=H[f>>2];g=a<<2;k=p+H[f+128>>2]|0;c=H[g+H[k>>2]>>2];f:{if((j|0)==(c|0)){if(!m){break f}b=H[h+20>>2];c=H[h+16>>2];if((b|0)==(c|0)){a=H[f+8>>2];H[h+28>>2]=m+H[h+28>>2];H[f+8>>2]=a+m;break f}while(1){i=(b|0)==(c|0);a=b;j=0;b=c;g:{if(i){break g}while(1){g=H[h+28>>2];b=a;l=N(j,20)+c|0;k=H[l>>2];if(!I[k+84|0]){g=H[H[k+68>>2]+(g<<2)>>2]}if(K[k+80>>2]<=g>>>0){break g}i=H[r>>2]+(H[l+4>>2]<<2)|0;c=H[l+12>>2];b=i;h:{if(c>>>0>3){break h}a=0;b=H[h+12>>2];if(!H[l+16>>2]){break h}while(1){b=qa(b,i+(a<<2)|0,c);c=H[l+12>>2];b=b+c|0;a=a+1|0;if(a>>>0<K[l+16>>2]){continue}break}b=H[h+12>>2]}a=H[k+40>>2];qa(H[H[k>>2]>>2]+N(a,g)|0,b,a);j=j+1|0;a=H[h+20>>2];b=a;c=H[h+16>>2];if(j>>>0<(b-c|0)/20>>>0){continue}break}}H[h+28>>2]=H[h+28>>2]+1;H[f+8>>2]=H[f+8>>2]+1;d=d+1|0;if((m|0)!=(d|0)){continue}break}break f}i:{j:{k:{l:{if(m>>>0<=2){c=H[f+104>>2];H[c>>2]=a;g=1;b=H[f+12>>2];if(b>>>0>1){break l}break i}if(K[f+8>>2]>K[f+4>>2]){break e}i=b;b=p+12|0;Aa(i+b|0,H[r>>2],H[r+4>>2]);b=g+H[b+H[f+116>>2]>>2]|0;H[b>>2]=H[b>>2]+(1<<j+(c^-1));H[e+4>>2]=0;pc(n,Q(m)^31,e+4|0);c=m>>>1|0;b=H[e+4>>2];if(c>>>0<b>>>0){break e}l=o+1|0;b=c-b|0;c=m-b|0;m:{if((c|0)==(b|0)){c=b;break m}k=H[f+84>>2];if((k|0)==H[f+76>>2]){break k}i=H[k>>2];j=H[f+88>>2];d=j+1|0;H[f+88>>2]=d;j=i&-2147483648>>>j;n:{if((d|0)==32){H[f+88>>2]=0;H[f+84>>2]=k+4;if(j){break n}break k}if(!j){break k}}}j=c;c=b;break j}while(1){a=(b-1|0)!=(a|0)?a+1|0:0;H[c+(g<<2)>>2]=a;b=H[f+12>>2];g=g+1|0;if(b>>>0>g>>>0){continue}break}break i}j=b}k=H[f+128>>2];i=k+p|0;d=H[i>>2];b=d+g|0;H[b>>2]=H[b>>2]+1;Aa(k+N(l,12)|0,d,H[i+4>>2]);if(c){b=H[e+28>>2]+H[e+24>>2]|0;d=H[e+16>>2];g=H[e+12>>2];if((b|0)==(((d|0)!=(g|0)?N(d-g>>2,341)-1|0:0)|0)){xa(e+8|0);g=H[e+12>>2];b=H[e+24>>2]+H[e+28>>2]|0}d=(b>>>0)/341|0;b=H[(d<<2)+g>>2]+N(b-N(d,341)|0,12)|0;H[b+8>>2]=o;H[b+4>>2]=a;H[b>>2]=c;H[e+28>>2]=H[e+28>>2]+1}if(!j){break f}b=H[e+28>>2]+H[e+24>>2]|0;c=H[e+16>>2];g=H[e+12>>2];if((b|0)==(((c|0)!=(g|0)?N(c-g>>2,341)-1|0:0)|0)){xa(e+8|0);g=H[e+12>>2];b=H[e+24>>2]+H[e+28>>2]|0}c=(b>>>0)/341|0;b=H[(c<<2)+g>>2]+N(b-N(c,341)|0,12)|0;H[b+8>>2]=l;H[b+4>>2]=a;H[b>>2]=j;H[e+28>>2]=H[e+28>>2]+1;break f}s=0;if(!m){break f}while(1){if(H[f+12>>2]){w=H[f+36>>2];i=H[k>>2];t=H[f+92>>2];j=H[f+104>>2];a=0;while(1){o=(a<<2)+j|0;H[t+(H[o>>2]<<2)>>2]=0;d=H[f>>2];c=H[o>>2]<<2;b=H[c+i>>2];o:{if((d|0)==(b|0)){break o}p=c+t|0;q=d-b|0;g=H[f+48>>2];d=32-g|0;if((q|0)<=(d|0)){c=H[f+44>>2];if((c|0)==(w|0)){d=0;break e}H[p>>2]=H[c>>2]<<g>>>32-q;b=q+H[f+48>>2]|0;H[f+48>>2]=b;if((b|0)!=32){break o}H[f+48>>2]=0;H[f+44>>2]=c+4;break o}l=H[f+44>>2];b=l+4|0;if((w|0)==(b|0)){d=0;break e}c=H[l>>2];H[f+44>>2]=b;b=q-d|0;H[f+48>>2]=b;H[p>>2]=H[l+4>>2]>>>32-b|c<<g>>>32-q}c=H[o>>2]<<2;b=c+t|0;H[b>>2]=H[b>>2]|H[c+H[r>>2]>>2];a=a+1|0;if(a>>>0<K[f+12>>2]){continue}break}}j=0;a=H[h+16>>2];p:{if((a|0)==H[h+20>>2]){break p}while(1){g=H[h+28>>2];l=N(j,20)+a|0;i=H[l>>2];if(!I[i+84|0]){g=H[H[i+68>>2]+(g<<2)>>2]}if(K[i+80>>2]<=g>>>0){break p}d=H[f+92>>2]+(H[l+4>>2]<<2)|0;c=H[l+12>>2];b=d;q:{if(c>>>0>3){break q}a=0;b=H[h+12>>2];if(!H[l+16>>2]){break q}while(1){b=qa(b,d+(a<<2)|0,c);c=H[l+12>>2];b=b+c|0;a=a+1|0;if(a>>>0<K[l+16>>2]){continue}break}b=H[h+12>>2]}a=H[i+40>>2];qa(H[H[i>>2]>>2]+N(a,g)|0,b,a);j=j+1|0;a=H[h+16>>2];if(j>>>0<(H[h+20>>2]-a|0)/20>>>0){continue}break}}H[h+28>>2]=H[h+28>>2]+1;H[f+8>>2]=H[f+8>>2]+1;s=s+1|0;if((m|0)!=(s|0)){continue}break}}a=H[e+28>>2];if(a){continue}break}d=1}H[e+28>>2]=0;g=H[e+16>>2];a=H[e+12>>2];b=g-a|0;if(b>>>0>=9){while(1){oa(H[a>>2]);a=H[e+12>>2]+4|0;H[e+12>>2]=a;g=H[e+16>>2];b=g-a|0;if(b>>>0>8){continue}break}}c=170;r:{switch((b>>>2|0)-1|0){case 1:c=341;case 0:H[e+24>>2]=c;break;default:break r}}s:{if((a|0)==(g|0)){break s}while(1){oa(H[a>>2]);a=a+4|0;if((g|0)!=(a|0)){continue}break}b=H[e+16>>2];a=H[e+12>>2];if((b|0)==(a|0)){break s}H[e+16>>2]=b+((a-b|0)+3&-4)}a=H[e+8>>2];if(a){oa(a)}ca=e+32|0;j=d;break b}sa();v()}sa();v()}}return j}function $c(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0;h=ca-32|0;ca=h;g=H[H[a+4>>2]+44>>2];c=H[a+8>>2];d=H[c>>2];c=H[c+4>>2];H[h+24>>2]=0;H[h+16>>2]=0;H[h+20>>2]=0;d=(c-d>>2>>>0)/3|0;c=H[g+96>>2];f=(H[g+100>>2]-c|0)/12|0;a:{if(d>>>0>f>>>0){e=d-f|0;i=H[g+104>>2];c=H[g+100>>2];if(e>>>0<=(i-c|0)/12>>>0){b:{if(!e){break b}d=c;f=N(e,12)-12|0;i=((f>>>0)/12|0)+1&3;if(i){while(1){l=H[h+20>>2];H[d>>2]=H[h+16>>2];H[d+4>>2]=l;H[d+8>>2]=H[h+24>>2];d=d+12|0;j=j+1|0;if((i|0)!=(j|0)){continue}break}}c=N(e,12)+c|0;if(f>>>0<36){break b}while(1){f=H[h+20>>2];H[d>>2]=H[h+16>>2];H[d+4>>2]=f;H[d+8>>2]=H[h+24>>2];H[d+20>>2]=H[h+24>>2];f=H[h+20>>2];H[d+12>>2]=H[h+16>>2];H[d+16>>2]=f;H[d+32>>2]=H[h+24>>2];f=H[h+20>>2];H[d+24>>2]=H[h+16>>2];H[d+28>>2]=f;f=H[h+20>>2];H[d+36>>2]=H[h+16>>2];H[d+40>>2]=f;H[d+44>>2]=H[h+24>>2];d=d+48|0;if((d|0)!=(c|0)){continue}break}}H[g+100>>2]=c;break a}c:{f=H[g+96>>2];n=(c-f|0)/12|0;d=n+e|0;if(d>>>0<357913942){f=(i-f|0)/12|0;i=f<<1;i=f>>>0>=178956970?357913941:d>>>0<i>>>0?i:d;if(i){if(i>>>0>=357913942){break c}l=pa(N(i,12))}f=N(n,12)+l|0;d=f;e=N(e,12);n=e-12|0;q=((n>>>0)/12|0)+1&3;if(q){while(1){r=H[h+20>>2];H[d>>2]=H[h+16>>2];H[d+4>>2]=r;H[d+8>>2]=H[h+24>>2];d=d+12|0;j=j+1|0;if((q|0)!=(j|0)){continue}break}}e=e+f|0;if(n>>>0>=36){while(1){j=H[h+20>>2];H[d>>2]=H[h+16>>2];H[d+4>>2]=j;H[d+8>>2]=H[h+24>>2];H[d+20>>2]=H[h+24>>2];j=H[h+20>>2];H[d+12>>2]=H[h+16>>2];H[d+16>>2]=j;H[d+32>>2]=H[h+24>>2];j=H[h+20>>2];H[d+24>>2]=H[h+16>>2];H[d+28>>2]=j;j=H[h+20>>2];H[d+36>>2]=H[h+16>>2];H[d+40>>2]=j;H[d+44>>2]=H[h+24>>2];d=d+48|0;if((e|0)!=(d|0)){continue}break}}j=H[g+96>>2];if((j|0)!=(c|0)){while(1){c=c-12|0;n=H[c+4>>2];f=f-12|0;d=f;H[d>>2]=H[c>>2];H[d+4>>2]=n;H[d+8>>2]=H[c+8>>2];if((c|0)!=(j|0)){continue}break}c=H[g+96>>2]}H[g+104>>2]=N(i,12)+l;H[g+100>>2]=e;H[g+96>>2]=f;if(c){oa(c)}break a}sa();v()}wa();v()}if(d>>>0>=f>>>0){break a}H[g+100>>2]=c+N(d,12)}d:{if(H[a+216>>2]==H[a+220>>2]){j=H[a+4>>2];c=H[j+44>>2];d=H[c+100>>2];f=H[c+96>>2];if((d|0)!=(f|0)){c=(d-f|0)/12|0;o=c>>>0<=1?1:c;c=0;while(1){d=H[a+8>>2];i=f+N(c,12)|0;g=N(c,3);e:{f:{if((g|0)==-1){e=H[(H[d>>2]+(g<<2)|0)+4>>2];k=-1;g=1;break f}e=-1;k=H[H[d>>2]+(g<<2)>>2];l=g+1|0;if((l|0)==-1){g=0;break f}e=H[H[d>>2]+(l<<2)>>2];g=g+2|0;m=-1;if((g|0)==-1){break e}}m=H[H[d>>2]+(g<<2)>>2]}H[i+8>>2]=m;H[i+4>>2]=e;H[i>>2]=k;c=c+1|0;if((o|0)!=(c|0)){continue}break}}H[H[j+4>>2]+80>>2]=b;c=1;break d}d=0;H[h+24>>2]=0;H[h+16>>2]=0;H[h+20>>2]=0;l=H[a+8>>2];c=H[l>>2];g=H[l+4>>2];H[h+8>>2]=0;H[h>>2]=0;H[h+4>>2]=0;b=0;g:{h:{i:{j:{k:{l:{if((c|0)!=(g|0)){c=g-c|0;if((c|0)<0){break l}b=pa(c);H[h>>2]=b;H[h+8>>2]=(c&-4)+b;u=h,w=ra(b,0,c)+c|0,H[u+4>>2]=w}c=H[l+24>>2];if((H[l+28>>2]-c|0)<4){break h}f=0;while(1){g=H[(p<<2)+c>>2];m:{if((g|0)==-1){break m}n:{if(H[H[a+120>>2]+(p>>>3&536870908)>>2]>>>p&1){break n}n=H[a+216>>2];c=H[a+220>>2];if((n|0)==(c|0)){break n}e=g+2|0;i=(g>>>0)%3|0;q=i?g-1|0:e;c=(c-n|0)/144|0;r=c>>>0<=1?1:c;j=0;t=(i|0)!=0|(e|0)!=-1;while(1){s=g<<2;i=N(j,144)+n|0;c=H[s+H[H[i+68>>2]>>2]>>2];o:{if(!(H[H[i+16>>2]+(c>>>3&536870908)>>2]>>>c&1)){break o}c=-1;p:{if(!t){break p}e=H[H[l+12>>2]+(q<<2)>>2];c=-1;if((e|0)==-1){break p}c=e-1|0;if((e>>>0)%3|0){break p}c=e+2|0}if((g|0)==(c|0)){break o}e=s;s=H[i+32>>2];i=H[e+s>>2];while(1){e=0;if((c|0)==-1){break g}if((i|0)!=H[s+(c<<2)>>2]){g=c;break n}q:{r:{if((c>>>0)%3|0){e=c-1|0;break r}e=c+2|0;m=-1;if((e|0)==-1){break q}}c=H[H[l+12>>2]+(e<<2)>>2];m=-1;if((c|0)==-1){break q}m=c-1|0;if((c>>>0)%3|0){break q}m=c+2|0}c=m;if((g|0)!=(c|0)){continue}break}}j=j+1|0;if((r|0)!=(j|0)){continue}break}}i=k-f|0;e=i>>2;H[(g<<2)+b>>2]=e;s:{if(k>>>0<o>>>0){H[k>>2]=g;k=k+4|0;H[h+20>>2]=k;break s}c=e+1|0;if(c>>>0>=1073741824){break k}d=o-f|0;k=d>>>1|0;c=d>>>0>=2147483644?1073741823:c>>>0<k>>>0?k:c;if(c){if(c>>>0>=1073741824){break j}d=pa(c<<2)}else{d=0}e=d+(e<<2)|0;H[e>>2]=g;m=c<<2;c=va(d,f,i);o=m+c|0;H[h+24>>2]=o;k=e+4|0;H[h+20>>2]=k;H[h+16>>2]=c;if(f){oa(f);l=H[a+8>>2]}f=c}if((g|0)==-1){break m}t:{if((g>>>0)%3|0){c=g-1|0;break t}c=g+2|0;if((c|0)==-1){break m}}c=H[H[l+12>>2]+(c<<2)>>2];if((c|0)==-1){break m}c=c+((c>>>0)%3|0?-1:2)|0;if((c|0)==-1){break m}e=g;if((c|0)==(g|0)){break m}while(1){i=c;u:{v:{c=H[a+220>>2];j=H[a+216>>2];if((c|0)==(j|0)){break v}c=(c-j|0)/144|0;n=c>>>0<=1?1:c;c=0;while(1){q=H[(j+N(c,144)|0)+32>>2];r=i<<2;if(H[q+r>>2]==H[q+(e<<2)>>2]){c=c+1|0;if((n|0)!=(c|0)){continue}break v}break}j=k-d|0;e=j>>2;H[b+r>>2]=e;if(k>>>0<o>>>0){H[k>>2]=i;k=k+4|0;H[h+20>>2]=k;f=d;break u}c=e+1|0;if(c>>>0>=1073741824){break i}f=o-d|0;k=f>>>1|0;c=f>>>0>=2147483644?1073741823:c>>>0<k>>>0?k:c;if(c){if(c>>>0>=1073741824){break j}f=pa(c<<2)}else{f=0}e=f+(e<<2)|0;H[e>>2]=i;m=c<<2;c=va(f,d,j);o=m+c|0;H[h+24>>2]=o;k=e+4|0;H[h+20>>2]=k;H[h+16>>2]=c;if(!d){d=c;break u}oa(d);l=H[a+8>>2];d=c;break u}H[(i<<2)+b>>2]=H[(e<<2)+b>>2]}if((i|0)==-1){break m}w:{if((i>>>0)%3|0){c=i-1|0;break w}c=i+2|0;if((c|0)==-1){break m}}c=H[H[l+12>>2]+(c<<2)>>2];if((c|0)==-1){break m}c=c+((c>>>0)%3|0?-1:2)|0;if((c|0)==-1){break m}e=i;if((c|0)!=(g|0)){continue}break}}p=p+1|0;c=H[l+24>>2];if((p|0)<H[l+28>>2]-c>>2){continue}break}break h}sa();v()}sa();v()}wa();v()}sa();v()}i=H[a+4>>2];a=H[i+44>>2];c=H[a+100>>2];a=H[a+96>>2];x:{if((c|0)==(a|0)){break x}g=(c-a|0)/12|0;f=g>>>0<=1?1:g;l=f&1;c=0;if(g>>>0>=2){j=f&-2;g=0;while(1){e=N(c,12);f=e+b|0;o=H[f>>2];p=H[f+4>>2];e=a+e|0;H[e+8>>2]=H[f+8>>2];H[e>>2]=o;H[e+4>>2]=p;e=N(c|1,12);f=e+b|0;o=H[f>>2];p=H[f+4>>2];e=a+e|0;H[e+8>>2]=H[f+8>>2];H[e>>2]=o;H[e+4>>2]=p;c=c+2|0;g=g+2|0;if((j|0)!=(g|0)){continue}break}}if(!l){break x}g=N(c,12);c=g+b|0;f=H[c>>2];e=H[c+4>>2];a=a+g|0;H[a+8>>2]=H[c+8>>2];H[a>>2]=f;H[a+4>>2]=e}H[H[i+4>>2]+80>>2]=k-d>>2;e=1}c=e;if(b){oa(b)}if(!d){break d}H[h+20>>2]=d;oa(d)}ca=h+32|0;return c}function Fj(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,I=0,J=0,K=0,L=0,M=0,O=0,P=0;g=ca+-64|0;ca=g;H[a+8>>2]=e;y=a+32|0;f=H[y>>2];d=H[a+36>>2]-f>>2;a:{b:{if(d>>>0<e>>>0){ya(y,e-d|0);H[g+56>>2]=0;H[g+60>>2]=0;H[g+48>>2]=0;H[g+52>>2]=0;H[g+40>>2]=0;H[g+44>>2]=0;H[g+32>>2]=0;H[g+36>>2]=0;H[g+24>>2]=0;H[g+28>>2]=0;H[g+16>>2]=0;H[g+20>>2]=0;H[g>>2]=0;break b}if(d>>>0>e>>>0){H[a+36>>2]=f+(e<<2)}H[g+56>>2]=0;H[g+60>>2]=0;H[g+48>>2]=0;H[g+52>>2]=0;H[g+40>>2]=0;H[g+44>>2]=0;H[g+32>>2]=0;H[g+36>>2]=0;H[g+24>>2]=0;H[g+28>>2]=0;H[g+16>>2]=0;H[g+20>>2]=0;H[g>>2]=0;d=0;if(!e){break a}}Pa(g+16|0,e,g);h=H[g+28>>2];d=H[g+32>>2]}H[g>>2]=0;d=d-h>>2;c:{if(d>>>0>=e>>>0){if(d>>>0<=e>>>0){break c}H[g+32>>2]=(e<<2)+h;break c}Pa(g+16|12,e-d|0,g)}H[g>>2]=0;f=H[g+40>>2];d=H[g+44>>2]-f>>2;d:{if(d>>>0>=e>>>0){if(d>>>0<=e>>>0){break d}H[g+44>>2]=f+(e<<2);break d}Pa(g+40|0,e-d|0,g)}H[g>>2]=0;f=H[g+52>>2];d=H[g+56>>2]-f>>2;e:{if(d>>>0>=e>>>0){if(d>>>0<=e>>>0){break e}H[g+56>>2]=f+(e<<2);break e}Pa(g+52|0,e-d|0,g)}f:{if(H[a+8>>2]<=0){break f}i=H[g+16>>2];j=H[a+32>>2];h=0;while(1){d=h<<2;f=H[d+i>>2];m=H[a+16>>2];g:{if((f|0)>(m|0)){H[d+j>>2]=m;break g}d=d+j|0;m=H[a+12>>2];if((m|0)>(f|0)){H[d>>2]=m;break g}H[d>>2]=f}h=h+1|0;d=H[a+8>>2];if((h|0)<(d|0)){continue}break}if((d|0)<=0){break f}d=0;while(1){i=d<<2;f=i+c|0;i=H[b+i>>2]+H[j+i>>2]|0;H[f>>2]=i;h:{if((i|0)>H[a+16>>2]){i=i-H[a+20>>2]|0}else{if((i|0)>=H[a+12>>2]){break h}i=i+H[a+20>>2]|0}H[f>>2]=i}d=d+1|0;if((d|0)<H[a+8>>2]){continue}break}}G=H[a+52>>2];t=H[a+48>>2];z=pa(16);d=z;H[d>>2]=0;H[d+4>>2]=0;H[d+8>>2]=0;H[d+12>>2]=0;H[g+8>>2]=0;H[g>>2]=0;H[g+4>>2]=0;i:{if(e){if(e>>>0>=1073741824){break i}d=e<<2;r=pa(d);H[g>>2]=r;H[g+8>>2]=d+r;ra(r,0,d)}A=1;d=H[a+56>>2];B=H[d>>2];d=H[d+4>>2]-B|0;j:{if((d|0)<8){break j}w=d>>2;I=(w|0)<=2?2:w;J=w>>>0<=1?1:w;C=e&-2;D=e&1;K=e&-4;E=e&3;F=e-1|0;L=e<<2;M=e>>>0<4;A=0;m=1;while(1){k:{l:{m:{n:{if((m|0)!=(J|0)){o:{p:{f=H[(m<<2)+B>>2];if((f|0)==-1){break p}k=1;d=f+2|0;j=(f>>>0)%3|0;x=j?f-1|0:d;s=1<<x;n=H[t>>2];O=n+(x>>>3&536870908)|0;i=0;P=(j|0)!=0|(d|0)!=-1;d=f;q:{while(1){r:{if(H[n+(d>>>3&536870908)>>2]>>>d&1){break r}j=H[H[H[t+64>>2]+12>>2]+(d<<2)>>2];if((j|0)==-1){break r}l=H[G>>2];h=H[t+28>>2];p=H[l+(H[h+(j<<2)>>2]<<2)>>2];if((p|0)>=(m|0)){break r}q=j+1|0;q=H[l+(H[h+(((q>>>0)%3|0?q:j-2|0)<<2)>>2]<<2)>>2];if((q|0)>=(m|0)){break r}h=H[l+(H[h+(j+((j>>>0)%3|0?-1:2)<<2)>>2]<<2)>>2];if((h|0)>=(m|0)){break r}s:{if(!e){break s}j=H[(g+16|0)+N(i,12)>>2];l=N(e,h);q=N(e,q);p=N(e,p);h=0;o=0;if(F){while(1){H[j+(h<<2)>>2]=(H[(h+l<<2)+c>>2]+H[(h+q<<2)+c>>2]|0)-H[(h+p<<2)+c>>2];u=h|1;H[j+(u<<2)>>2]=(H[(l+u<<2)+c>>2]+H[(q+u<<2)+c>>2]|0)-H[(p+u<<2)+c>>2];h=h+2|0;o=o+2|0;if((C|0)!=(o|0)){continue}break}}if(!D){break s}H[j+(h<<2)>>2]=(H[(h+l<<2)+c>>2]+H[(h+q<<2)+c>>2]|0)-H[(h+p<<2)+c>>2]}j=4;i=i+1|0;if((i|0)==4){break q}}t:{if(k&1){h=d-2|0;j=d+1|0;d=-1;j=(j>>>0)%3|0?j:h;if((j|0)==-1|H[n+(j>>>3&536870908)>>2]>>>j&1){break t}j=H[H[H[t+64>>2]+12>>2]+(j<<2)>>2];if((j|0)==-1){break t}d=j+1|0;d=(d>>>0)%3|0?d:j-2|0;break t}u:{if((d>>>0)%3|0){h=d-1|0;break u}h=d+2|0;d=-1;if((h|0)==-1){break t}}d=-1;if(H[n+(h>>>3&536870908)>>2]>>>h&1){break t}j=H[H[H[t+64>>2]+12>>2]+(h<<2)>>2];if((j|0)==-1){break t}if((j>>>0)%3|0){d=j-1|0;break t}d=j+2|0}v:{if((d|0)==(f|0)){break v}if((d|0)==-1&k){if(!P|s&H[O>>2]){break v}d=H[H[H[t+64>>2]+12>>2]+(x<<2)>>2];if((d|0)==-1){break v}k=0;d=(d>>>0)%3|0?d-1|0:d+2|0}if((d|0)!=-1){continue}}break}j=i;if((j|0)<=0){break p}}if(e){ra(r,0,L)}d=j-1|0;q=(d<<2)+z|0;d=N(d,12)+a|0;u=d;x=H[d- -64>>2];k=0;d=H[g>>2];f=0;while(1){i=H[q>>2];H[q>>2]=i+1;if(i>>>0>=x>>>0){break j}w:{if(H[H[u+60>>2]+(i>>>3&536870908)>>2]>>>i&1){break w}f=f+1|0;if(!e){break w}n=H[(g+16|0)+N(k,12)>>2];i=0;h=0;p=0;if(!M){while(1){l=h<<2;o=l+d|0;H[o>>2]=H[l+n>>2]+H[o>>2];o=l|4;s=o+d|0;H[s>>2]=H[n+o>>2]+H[s>>2];o=l|8;s=o+d|0;H[s>>2]=H[n+o>>2]+H[s>>2];l=l|12;o=l+d|0;H[o>>2]=H[l+n>>2]+H[o>>2];h=h+4|0;p=p+4|0;if((K|0)!=(p|0)){continue}break}}if(!E){break w}while(1){l=h<<2;p=l+d|0;H[p>>2]=H[l+n>>2]+H[p>>2];h=h+1|0;i=i+1|0;if((E|0)!=(i|0)){continue}break}}k=k+1|0;if((k|0)!=(j|0)){continue}break}i=N(e,m);if(!f){break o}if(!e){break l}h=0;d=0;if(F){break n}break m}i=N(e,m)}if(H[a+8>>2]<=0){break k}k=(N(m-1|0,e)<<2)+c|0;j=H[y>>2];h=0;while(1){d=h<<2;f=H[d+k>>2];n=H[a+16>>2];x:{if((f|0)>(n|0)){H[d+j>>2]=n;break x}d=d+j|0;n=H[a+12>>2];if((n|0)>(f|0)){H[d>>2]=n;break x}H[d>>2]=f}h=h+1|0;f=H[a+8>>2];if((h|0)<(f|0)){continue}break}d=0;if((f|0)<=0){break k}f=i<<2;h=f+c|0;k=b+f|0;while(1){i=d<<2;f=i+h|0;i=H[i+k>>2]+H[j+i>>2]|0;H[f>>2]=i;y:{if((i|0)>H[a+16>>2]){i=i-H[a+20>>2]|0}else{if((i|0)>=H[a+12>>2]){break y}i=i+H[a+20>>2]|0}H[f>>2]=i}d=d+1|0;if((d|0)<H[a+8>>2]){continue}break}break k}Ca();v()}while(1){j=h<<2;k=j+r|0;H[k>>2]=H[k>>2]/(f|0);j=(j|4)+r|0;H[j>>2]=H[j>>2]/(f|0);h=h+2|0;d=d+2|0;if((C|0)!=(d|0)){continue}break}}if(!D){break l}d=(h<<2)+r|0;H[d>>2]=H[d>>2]/(f|0)}if(H[a+8>>2]<=0){break k}j=H[y>>2];h=0;while(1){d=h<<2;f=H[d+r>>2];k=H[a+16>>2];z:{if((f|0)>(k|0)){H[d+j>>2]=k;break z}d=d+j|0;k=H[a+12>>2];if((k|0)>(f|0)){H[d>>2]=k;break z}H[d>>2]=f}h=h+1|0;f=H[a+8>>2];if((h|0)<(f|0)){continue}break}d=0;if((f|0)<=0){break k}f=i<<2;h=f+c|0;k=b+f|0;while(1){i=d<<2;f=i+h|0;i=H[i+k>>2]+H[j+i>>2]|0;H[f>>2]=i;A:{if((i|0)>H[a+16>>2]){i=i-H[a+20>>2]|0}else{if((i|0)>=H[a+12>>2]){break A}i=i+H[a+20>>2]|0}H[f>>2]=i}d=d+1|0;if((d|0)<H[a+8>>2]){continue}break}}m=m+1|0;A=(w|0)<=(m|0);if((m|0)!=(I|0)){continue}break}}a=H[g>>2];if(a){oa(a)}oa(z);a=H[g+52>>2];if(a){H[g+56>>2]=a;oa(a)}a=H[g+40>>2];if(a){H[g+44>>2]=a;oa(a)}a=H[g+28>>2];if(a){H[g+32>>2]=a;oa(a)}a=H[g+16>>2];if(a){H[g+20>>2]=a;oa(a)}ca=g- -64|0;return A|0}sa();v()}function oj(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,I=0,J=0,K=0,L=0,M=0;h=ca+-64|0;ca=h;H[a+8>>2]=e;x=a+32|0;f=H[x>>2];d=H[a+36>>2]-f>>2;a:{b:{if(d>>>0<e>>>0){ya(x,e-d|0);H[h+56>>2]=0;H[h+60>>2]=0;H[h+48>>2]=0;H[h+52>>2]=0;H[h+40>>2]=0;H[h+44>>2]=0;H[h+32>>2]=0;H[h+36>>2]=0;H[h+24>>2]=0;H[h+28>>2]=0;H[h+16>>2]=0;H[h+20>>2]=0;H[h>>2]=0;break b}if(d>>>0>e>>>0){H[a+36>>2]=f+(e<<2)}H[h+56>>2]=0;H[h+60>>2]=0;H[h+48>>2]=0;H[h+52>>2]=0;H[h+40>>2]=0;H[h+44>>2]=0;H[h+32>>2]=0;H[h+36>>2]=0;H[h+24>>2]=0;H[h+28>>2]=0;H[h+16>>2]=0;H[h+20>>2]=0;H[h>>2]=0;d=0;if(!e){break a}}Pa(h+16|0,e,h);i=H[h+28>>2];d=H[h+32>>2]}H[h>>2]=0;d=d-i>>2;c:{if(d>>>0>=e>>>0){if(d>>>0<=e>>>0){break c}H[h+32>>2]=(e<<2)+i;break c}Pa(h+16|12,e-d|0,h)}H[h>>2]=0;f=H[h+40>>2];d=H[h+44>>2]-f>>2;d:{if(d>>>0>=e>>>0){if(d>>>0<=e>>>0){break d}H[h+44>>2]=f+(e<<2);break d}Pa(h+40|0,e-d|0,h)}H[h>>2]=0;f=H[h+52>>2];d=H[h+56>>2]-f>>2;e:{if(d>>>0>=e>>>0){if(d>>>0<=e>>>0){break e}H[h+56>>2]=f+(e<<2);break e}Pa(h+52|0,e-d|0,h)}f:{if(H[a+8>>2]<=0){break f}g=H[h+16>>2];j=H[a+32>>2];i=0;while(1){d=i<<2;f=H[d+g>>2];m=H[a+16>>2];g:{if((f|0)>(m|0)){H[d+j>>2]=m;break g}d=d+j|0;m=H[a+12>>2];if((m|0)>(f|0)){H[d>>2]=m;break g}H[d>>2]=f}i=i+1|0;d=H[a+8>>2];if((i|0)<(d|0)){continue}break}if((d|0)<=0){break f}d=0;while(1){g=d<<2;f=g+c|0;g=H[b+g>>2]+H[g+j>>2]|0;H[f>>2]=g;h:{if((g|0)>H[a+16>>2]){g=g-H[a+20>>2]|0}else{if((g|0)>=H[a+12>>2]){break h}g=g+H[a+20>>2]|0}H[f>>2]=g}d=d+1|0;if((d|0)<H[a+8>>2]){continue}break}}G=H[a+52>>2];A=H[a+48>>2];y=pa(16);d=y;H[d>>2]=0;H[d+4>>2]=0;H[d+8>>2]=0;H[d+12>>2]=0;H[h+8>>2]=0;H[h>>2]=0;H[h+4>>2]=0;i:{if(e){if(e>>>0>=1073741824){break i}d=e<<2;t=pa(d);H[h>>2]=t;H[h+8>>2]=d+t;ra(t,0,d)}z=1;d=H[a+56>>2];B=H[d>>2];d=H[d+4>>2]-B|0;j:{if((d|0)<8){break j}w=d>>2;I=(w|0)<=2?2:w;J=w>>>0<=1?1:w;C=e&-2;D=e&1;K=e&-4;E=e&3;F=e-1|0;L=e<<2;M=e>>>0<4;z=0;m=1;while(1){k:{l:{m:{n:{if((m|0)!=(J|0)){o:{p:{f=H[(m<<2)+B>>2];if((f|0)==-1){break p}n=H[A+12>>2];d=f+2|0;g=(f>>>0)%3|0;q=n+((g?f-1|0:d)<<2)|0;j=0;u=(g|0)!=0|(d|0)!=-1;k=1;d=f;q:{while(1){g=H[n+(d<<2)>>2];r:{if((g|0)==-1){break r}l=-1;p=H[G>>2];r=H[A>>2];i=p+(H[r+(g<<2)>>2]<<2)|0;o=g+1|0;o=(o>>>0)%3|0?o:g-2|0;if((o|0)!=-1){l=H[r+(o<<2)>>2]}o=H[i>>2];s:{t:{if((g>>>0)%3|0){i=g-1|0;break t}i=g+2|0;s=-1;if((i|0)==-1){break s}}s=H[r+(i<<2)>>2]}if((m|0)<=(o|0)){break r}i=H[p+(l<<2)>>2];if((i|0)>=(m|0)){break r}l=H[p+(s<<2)>>2];if((l|0)>=(m|0)){break r}g=H[(h+16|0)+N(j,12)>>2];u:{if(!e){break u}l=N(e,l);r=N(e,i);p=N(e,o);i=0;s=0;if(F){while(1){H[g+(i<<2)>>2]=(H[(i+l<<2)+c>>2]+H[(i+r<<2)+c>>2]|0)-H[(i+p<<2)+c>>2];o=i|1;H[g+(o<<2)>>2]=(H[(l+o<<2)+c>>2]+H[(o+r<<2)+c>>2]|0)-H[(o+p<<2)+c>>2];i=i+2|0;s=s+2|0;if((C|0)!=(s|0)){continue}break}}if(!D){break u}H[g+(i<<2)>>2]=(H[(i+l<<2)+c>>2]+H[(i+r<<2)+c>>2]|0)-H[(i+p<<2)+c>>2]}g=4;j=j+1|0;if((j|0)==4){break q}}v:{if(k&1){i=d+1|0;d=(i>>>0)%3|0?i:d-2|0;g=-1;if((d|0)==-1){break v}d=H[n+(d<<2)>>2];g=-1;if((d|0)==-1){break v}g=d+1|0;g=(g>>>0)%3|0?g:d-2|0;break v}w:{if((d>>>0)%3|0){i=d-1|0;break w}i=d+2|0;g=-1;if((i|0)==-1){break v}}d=H[n+(i<<2)>>2];g=-1;if((d|0)==-1){break v}g=d-1|0;if((d>>>0)%3|0){break v}g=d+2|0}d=g;x:{if((f|0)==(d|0)){break x}if((d|0)==-1&k){if(!u){break x}d=H[q>>2];if((d|0)==-1){break x}k=0;d=(d>>>0)%3|0?d-1|0:d+2|0}if((d|0)!=-1){continue}}break}g=j;if((g|0)<=0){break p}}if(e){ra(t,0,L)}d=g-1|0;r=(d<<2)+y|0;d=N(d,12)+a|0;o=d;s=H[d- -64>>2];k=0;d=H[h>>2];f=0;while(1){j=H[r>>2];H[r>>2]=j+1;if(j>>>0>=s>>>0){break j}y:{if(H[H[o+60>>2]+(j>>>3&536870908)>>2]>>>j&1){break y}f=f+1|0;if(!e){break y}j=H[(h+16|0)+N(k,12)>>2];l=0;i=0;p=0;if(!M){while(1){n=i<<2;q=n+d|0;H[q>>2]=H[j+n>>2]+H[q>>2];q=n|4;u=q+d|0;H[u>>2]=H[j+q>>2]+H[u>>2];q=n|8;u=q+d|0;H[u>>2]=H[j+q>>2]+H[u>>2];n=n|12;q=n+d|0;H[q>>2]=H[j+n>>2]+H[q>>2];i=i+4|0;p=p+4|0;if((K|0)!=(p|0)){continue}break}}if(!E){break y}while(1){n=i<<2;p=n+d|0;H[p>>2]=H[j+n>>2]+H[p>>2];i=i+1|0;l=l+1|0;if((E|0)!=(l|0)){continue}break}}k=k+1|0;if((k|0)!=(g|0)){continue}break}g=N(e,m);if(!f){break o}if(!e){break l}i=0;d=0;if(F){break n}break m}g=N(e,m)}if(H[a+8>>2]<=0){break k}k=(N(m-1|0,e)<<2)+c|0;j=H[x>>2];i=0;while(1){d=i<<2;f=H[d+k>>2];l=H[a+16>>2];z:{if((f|0)>(l|0)){H[d+j>>2]=l;break z}d=d+j|0;l=H[a+12>>2];if((l|0)>(f|0)){H[d>>2]=l;break z}H[d>>2]=f}i=i+1|0;f=H[a+8>>2];if((i|0)<(f|0)){continue}break}d=0;if((f|0)<=0){break k}f=g<<2;i=f+c|0;k=b+f|0;while(1){g=d<<2;f=g+i|0;g=H[g+k>>2]+H[g+j>>2]|0;H[f>>2]=g;A:{if((g|0)>H[a+16>>2]){g=g-H[a+20>>2]|0}else{if((g|0)>=H[a+12>>2]){break A}g=g+H[a+20>>2]|0}H[f>>2]=g}d=d+1|0;if((d|0)<H[a+8>>2]){continue}break}break k}Ca();v()}while(1){j=i<<2;k=j+t|0;H[k>>2]=H[k>>2]/(f|0);j=(j|4)+t|0;H[j>>2]=H[j>>2]/(f|0);i=i+2|0;d=d+2|0;if((C|0)!=(d|0)){continue}break}}if(!D){break l}d=(i<<2)+t|0;H[d>>2]=H[d>>2]/(f|0)}if(H[a+8>>2]<=0){break k}j=H[x>>2];i=0;while(1){d=i<<2;f=H[d+t>>2];k=H[a+16>>2];B:{if((f|0)>(k|0)){H[d+j>>2]=k;break B}d=d+j|0;k=H[a+12>>2];if((k|0)>(f|0)){H[d>>2]=k;break B}H[d>>2]=f}i=i+1|0;f=H[a+8>>2];if((i|0)<(f|0)){continue}break}d=0;if((f|0)<=0){break k}f=g<<2;i=f+c|0;k=b+f|0;while(1){g=d<<2;f=g+i|0;g=H[g+k>>2]+H[g+j>>2]|0;H[f>>2]=g;C:{if((g|0)>H[a+16>>2]){g=g-H[a+20>>2]|0}else{if((g|0)>=H[a+12>>2]){break C}g=g+H[a+20>>2]|0}H[f>>2]=g}d=d+1|0;if((d|0)<H[a+8>>2]){continue}break}}m=m+1|0;z=(w|0)<=(m|0);if((m|0)!=(I|0)){continue}break}}a=H[h>>2];if(a){oa(a)}oa(y);a=H[h+52>>2];if(a){H[h+56>>2]=a;oa(a)}a=H[h+40>>2];if(a){H[h+44>>2]=a;oa(a)}a=H[h+28>>2];if(a){H[h+32>>2]=a;oa(a)}a=H[h+16>>2];if(a){H[h+20>>2]=a;oa(a)}ca=h- -64|0;return z|0}sa();v()}function Od(a,b,c,d,e){var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0;i=ca-80|0;ca=i;H[i+76>>2]=b;y=i+55|0;r=i+56|0;a:{b:{c:{d:{e:while(1){h=b;if((o^2147483647)<(f|0)){break d}o=f+o|0;f:{g:{h:{f=h;g=I[f|0];if(g){while(1){i:{b=g&255;j:{if(!b){b=f;break j}if((b|0)!=37){break i}g=f;while(1){if(I[g+1|0]!=37){b=g;break j}f=f+1|0;j=I[g+2|0];b=g+2|0;g=b;if((j|0)==37){continue}break}}f=f-h|0;x=o^2147483647;if((f|0)>(x|0)){break d}if(a){Ab(a,h,f)}if(f){continue e}H[i+76>>2]=b;f=b+1|0;p=-1;if(!(I[b+2|0]!=36|F[b+1|0]-48>>>0>=10)){p=F[b+1|0]-48|0;s=1;f=b+3|0}H[i+76>>2]=f;n=0;g=F[f|0];b=g-32|0;k:{if(b>>>0>31){k=f;break k}k=f;b=1<<b;if(!(b&75913)){break k}while(1){k=f+1|0;H[i+76>>2]=k;n=b|n;g=F[f+1|0];b=g-32|0;if(b>>>0>=32){break k}f=k;b=1<<b;if(b&75913){continue}break}}l:{if((g|0)==42){m:{if(!(I[k+2|0]!=36|F[k+1|0]-48>>>0>=10)){H[((F[k+1|0]<<2)+e|0)-192>>2]=10;g=k+3|0;s=1;b=H[((F[k+1|0]<<3)+d|0)-384>>2];break m}if(s){break h}g=k+1|0;if(!a){H[i+76>>2]=g;s=0;q=0;break l}b=H[c>>2];H[c>>2]=b+4;s=0;b=H[b>>2]}H[i+76>>2]=g;q=b;if((b|0)>=0){break l}q=0-q|0;n=n|8192;break l}q=Nd(i+76|0);if((q|0)<0){break d}g=H[i+76>>2]}f=0;m=-1;n:{if(I[g|0]!=46){b=g;u=0;break n}if(I[g+1|0]==42){o:{if(!(I[g+3|0]!=36|F[g+2|0]-48>>>0>=10)){H[((F[g+2|0]<<2)+e|0)-192>>2]=10;b=g+4|0;m=H[((F[g+2|0]<<3)+d|0)-384>>2];break o}if(s){break h}b=g+2|0;m=0;if(!a){break o}j=H[c>>2];H[c>>2]=j+4;m=H[j>>2]}H[i+76>>2]=b;u=(m^-1)>>>31|0;break n}H[i+76>>2]=g+1;m=Nd(i+76|0);b=H[i+76>>2];u=1}while(1){g=f;k=28;l=b;f=F[b|0];if(f-123>>>0<4294967238){break c}b=l+1|0;f=I[(f+N(g,58)|0)+13711|0];if(f-1>>>0<8){continue}break}H[i+76>>2]=b;p:{q:{if((f|0)!=27){if(!f){break c}if((p|0)>=0){H[(p<<2)+e>>2]=f;j=(p<<3)+d|0;f=H[j+4>>2];H[i+64>>2]=H[j>>2];H[i+68>>2]=f;break q}if(!a){break f}Md(i- -64|0,f,c);break p}if((p|0)>=0){break c}}f=0;if(!a){continue e}}j=n&-65537;n=n&8192?j:n;p=0;t=1132;k=r;r:{s:{t:{u:{v:{w:{x:{y:{z:{A:{B:{C:{D:{E:{F:{G:{f=F[l|0];f=g?(f&15)==3?f&-33:f:f;switch(f-88|0){case 11:break r;case 9:case 13:case 14:case 15:break s;case 27:break x;case 12:case 17:break A;case 23:break B;case 0:case 32:break C;case 24:break D;case 22:break E;case 29:break F;case 1:case 2:case 3:case 4:case 5:case 6:case 7:case 8:case 10:case 16:case 18:case 19:case 20:case 21:case 25:case 26:case 28:case 30:case 31:break g;default:break G}}H:{switch(f-65|0){case 0:case 4:case 5:case 6:break s;case 2:break v;case 1:case 3:break g;default:break H}}if((f|0)==83){break w}break g}l=H[i+64>>2];j=H[i+68>>2];t=1132;break z}f=0;I:{switch(g&255){case 0:H[H[i+64>>2]>>2]=o;continue e;case 1:H[H[i+64>>2]>>2]=o;continue e;case 2:h=H[i+64>>2];H[h>>2]=o;H[h+4>>2]=o>>31;continue e;case 3:G[H[i+64>>2]>>1]=o;continue e;case 4:F[H[i+64>>2]]=o;continue e;case 6:H[H[i+64>>2]>>2]=o;continue e;case 7:break I;default:continue e}}h=H[i+64>>2];H[h>>2]=o;H[h+4>>2]=o>>31;continue e}m=m>>>0<=8?8:m;n=n|8;f=120}h=r;l=H[i+64>>2];j=H[i+68>>2];if(l|j){z=f&32;while(1){h=h-1|0;F[h|0]=z|I[(l&15)+14240|0];w=!j&l>>>0>15|(j|0)!=0;g=j;j=g>>>4|0;l=(g&15)<<28|l>>>4;if(w){continue}break}}if(!(H[i+64>>2]|H[i+68>>2])|!(n&8)){break y}t=(f>>>4|0)+1132|0;p=2;break y}f=r;h=H[i+68>>2];j=h;l=H[i+64>>2];if(h|l){while(1){f=f-1|0;F[f|0]=l&7|48;g=!j&l>>>0>7|(j|0)!=0;h=j;j=h>>>3|0;l=(h&7)<<29|l>>>3;if(g){continue}break}}h=f;if(!(n&8)){break y}f=r-h|0;m=(f|0)<(m|0)?m:f+1|0;break y}l=H[i+64>>2];h=H[i+68>>2];j=h;if((h|0)<0){f=0-(((l|0)!=0)+j|0)|0;j=f;l=0-l|0;H[i+64>>2]=l;H[i+68>>2]=f;p=1;t=1132;break z}if(n&2048){p=1;t=1133;break z}p=n&1;t=p?1134:1132}g=r;if(j){while(1){g=g-1|0;f=j;w=Tj(l,f,10,0);h=da;A=g,B=l-Rj(w,h,10,0)|48,F[A|0]=B;l=w;j=h;if(f>>>0>9){continue}break}}h=l;if(h){while(1){g=g-1|0;f=(h>>>0)/10|0;F[g|0]=h-N(f,10)|48;j=h>>>0>9;h=f;if(j){continue}break}}h=g}if((m|0)<0?u:0){break d}n=u?n&-65537:n;f=H[i+64>>2];j=H[i+68>>2];if(!(m|(f|j)!=0)){h=r;m=0;break g}f=!(f|j)+(r-h|0)|0;m=(f|0)<(m|0)?m:f;break g}g=m>>>0>=2147483647?2147483647:m;k=g;n=(g|0)!=0;h=H[i+64>>2];h=h?h:1614;f=h;J:{K:{L:{M:{if(!(f&3)|!g){break M}while(1){if(!I[f|0]){break L}k=k-1|0;n=(k|0)!=0;f=f+1|0;if(!(f&3)){break M}if(k){continue}break}}if(!n){break K}if(!(!I[f|0]|k>>>0<4)){while(1){l=H[f>>2];if((l^-1)&l-16843009&-2139062144){break L}f=f+4|0;k=k-4|0;if(k>>>0>3){continue}break}}if(!k){break K}}while(1){if(!I[f|0]){break J}f=f+1|0;k=k-1|0;if(k){continue}break}}f=0}f=f?f-h|0:g;k=f+h|0;if((m|0)>=0){n=j;m=f;break g}n=j;m=f;if(I[k|0]){break d}break g}if(m){g=H[i+64>>2];break u}f=0;ib(a,32,q,0,n);break t}H[i+12>>2]=0;H[i+8>>2]=H[i+64>>2];g=i+8|0;H[i+64>>2]=g;m=-1}f=0;N:{while(1){h=H[g>>2];if(!h){break N}j=Ld(i+4|0,h);h=(j|0)<0;if(!(h|j>>>0>m-f>>>0)){g=g+4|0;f=f+j|0;if(m>>>0>f>>>0){continue}break N}break}if(h){break b}}k=61;if((f|0)<0){break c}ib(a,32,q,f,n);if(!f){f=0;break t}k=0;g=H[i+64>>2];while(1){h=H[g>>2];if(!h){break t}h=Ld(i+4|0,h);k=h+k|0;if(k>>>0>f>>>0){break t}Ab(a,i+4|0,h);g=g+4|0;if(f>>>0>k>>>0){continue}break}}ib(a,32,q,f,n^8192);f=(f|0)<(q|0)?q:f;continue e}if((m|0)<0?u:0){break d}v()}F[i+55|0]=H[i+64>>2];m=1;h=y;n=j;break g}g=I[f+1|0];f=f+1|0;continue}}if(a){break a}if(!s){break f}f=1;while(1){a=H[(f<<2)+e>>2];if(a){Md((f<<3)+d|0,a,c);o=1;f=f+1|0;if((f|0)!=10){continue}break a}break}o=1;if(f>>>0>=10){break a}while(1){if(H[(f<<2)+e>>2]){break h}f=f+1|0;if((f|0)!=10){continue}break}break a}k=28;break c}l=k-h|0;j=(m|0)>(l|0)?m:l;if((j|0)>(p^2147483647)){break d}k=61;g=j+p|0;f=(g|0)<(q|0)?q:g;if((x|0)<(f|0)){break c}ib(a,32,f,g,n);Ab(a,t,p);ib(a,48,f,g,n^65536);ib(a,48,j,l,0);Ab(a,h,l);ib(a,32,f,g,n^8192);continue}break}o=0;break a}k=61}H[3992]=k}o=-1}ca=i+80|0;return o}function hj(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,G=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0;a:{b:{if((e|0)!=2){break b}H[a+8>>2]=2;H[a- -64>>2]=f;M=a+32|0;e=H[M>>2];d=H[a+36>>2]-e|0;c:{if(d>>>0<=7){ya(M,2-(d>>>2|0)|0);break c}if((d|0)==8){break c}H[a+36>>2]=e+8}i=1;d=H[a+56>>2];d=H[d+4>>2]-H[d>>2]|0;if((d|0)<=0){break b}o=a+60|0;d=d>>>2|0;X=d>>>0<=1?1:d;Y=a+68|0;d=0;while(1){f=H[a+56>>2];e=H[f>>2];if(H[f+4>>2]-e>>2>>>0<=d>>>0){break a}k=ca-80|0;ca=k;f=-1;d:{e:{e=H[e+(d<<2)>>2];if((e|0)==-1){break e}i=H[o+32>>2];g=e+1|0;g=(g>>>0)%3|0?g:e-2|0;if((g|0)!=-1){f=H[H[i>>2]+(g<<2)>>2]}p=-1;e=e+((e>>>0)%3|0?-1:2)|0;if((e|0)!=-1){p=H[H[i>>2]+(e<<2)>>2]}i=H[o+36>>2];e=H[i>>2];i=H[i+4>>2]-e>>2;if(i>>>0<=f>>>0|i>>>0<=p>>>0){break e}f:{g:{h:{i:{j:{k:{j=H[e+(p<<2)>>2];f=H[e+(f<<2)>>2];if((j|0)>=(d|0)|(f|0)>=(d|0)){break k}i=(j<<3)+c|0;w=H[i+4>>2];g=(f<<3)+c|0;e=H[g+4>>2];l=H[i>>2];i=H[g>>2];if(!((l|0)!=(i|0)|(e|0)!=(w|0))){H[o+8>>2]=i;H[o+12>>2]=e;break j}p=H[H[o+4>>2]+(d<<2)>>2];H[k+72>>2]=0;H[k+76>>2]=0;g=k- -64|0;H[g>>2]=0;H[g+4>>2]=0;H[k+56>>2]=0;H[k+60>>2]=0;g=H[o>>2];if(!I[g+84|0]){p=H[H[g+68>>2]+(p<<2)>>2]}Sa(g,p,F[g+24|0],k+56|0);p=H[H[o+4>>2]+(f<<2)>>2];H[k+48>>2]=0;H[k+52>>2]=0;H[k+40>>2]=0;H[k+44>>2]=0;H[k+32>>2]=0;H[k+36>>2]=0;g=H[o>>2];if(!I[g+84|0]){p=H[H[g+68>>2]+(p<<2)>>2]}Sa(g,p,F[g+24|0],k+32|0);p=H[H[o+4>>2]+(j<<2)>>2];H[k+24>>2]=0;H[k+28>>2]=0;H[k+16>>2]=0;H[k+20>>2]=0;H[k+8>>2]=0;H[k+12>>2]=0;g=H[o>>2];if(!I[g+84|0]){p=H[H[g+68>>2]+(p<<2)>>2]}Sa(g,p,F[g+24|0],k+8|0);g=H[k+16>>2];n=H[k+40>>2];x=g-n|0;N=H[k+44>>2];g=H[k+20>>2]-(N+(g>>>0<n>>>0)|0)|0;E=g;j=Rj(x,g,x,g);q=da;g=H[k+8>>2];z=H[k+32>>2];A=g-z|0;O=H[k+36>>2];g=H[k+12>>2]-(O+(g>>>0<z>>>0)|0)|0;G=g;h=j;j=Rj(A,g,A,g);g=h+j|0;h=da+q|0;h=g>>>0<j>>>0?h+1|0:h;j=H[k+24>>2];B=H[k+48>>2];C=j-B|0;P=H[k+52>>2];j=H[k+28>>2]-(P+(j>>>0<B>>>0)|0)|0;J=j;m=g;g=Rj(C,j,C,j);r=m+g|0;h=da+h|0;s=g>>>0>r>>>0?h+1|0:h;if(!(s|r)){break k}p=0;D=Tj(-1,2147483647,r,s);f=i>>31;R=f;h=f>>31;Q=i;g=h;q=i^g;i=q-g|0;f=(f^g)-((g>>>0>q>>>0)+g|0)|0;g=f;f=e>>31;S=f;K=e;e=f>>31;q=K^e;m=q-e|0;h=f>>31;e=(h^f)-((e>>>0>q>>>0)+h|0)|0;f=(g|0)==(e|0)&i>>>0>m>>>0|e>>>0<g>>>0;i=f?i:m;j=da;e=f?g:e;if((j|0)==(e|0)&i>>>0>D>>>0|e>>>0>j>>>0){break f}i=H[k+64>>2];T=H[k+68>>2];e=Rj(i-n|0,T-((i>>>0<n>>>0)+N|0)|0,x,E);f=da;g=H[k+56>>2];U=H[k+60>>2];j=Rj(g-z|0,U-((g>>>0<z>>>0)+O|0)|0,A,G);e=j+e|0;h=da+f|0;h=e>>>0<j>>>0?h+1|0:h;f=e;m=H[k+72>>2];V=H[k+76>>2];e=Rj(m-B|0,V-((m>>>0<B>>>0)+P|0)|0,C,J);j=f+e|0;f=da+h|0;q=e>>>0>j>>>0?f+1|0:f;e=l;D=e-Q|0;e=(e>>31)-((e>>>0<Q>>>0)+R|0)|0;W=e;l=e>>31;y=l^D;f=y-l|0;h=e>>31;e=(h^e)-((l>>>0>y>>>0)+h|0)|0;h=e;y=w-K|0;e=(w>>31)-((w>>>0<K>>>0)+S|0)|0;w=e;l=f;t=e>>31;u=t^y;L=u-t|0;f=e>>31;e=(f^e)-((t>>>0>u>>>0)+f|0)|0;f=(h|0)==(e|0)&l>>>0>L>>>0|e>>>0<h>>>0;f=Tj(-1,2147483647,f?l:L,f?h:e)>>>0<j>>>0;e=da;if(f&(e|0)<=(q|0)|(e|0)<(q|0)){break f}e=G>>31;f=e;l=e^A;e=l-e|0;f=(f^G)-((f>>>0>l>>>0)+f|0)|0;h=E>>31;t=h^x;u=t-h|0;l=(h^E)-((h>>>0>t>>>0)+h|0)|0;h=(f|0)==(l|0)&e>>>0>u>>>0|f>>>0>l>>>0;e=h?e:u;f=h?f:l;h=J>>31;L=e;t=h^C;u=t-h|0;l=(h^J)-((h>>>0>t>>>0)+h|0)|0;e=(f|0)==(l|0)&e>>>0>u>>>0|f>>>0>l>>>0;f=Tj(-1,2147483647,e?L:u,e?f:l)>>>0<j>>>0;e=da;if(f&(e|0)<=(q|0)|(e|0)<(q|0)){break f}l=1;e=0;f=n;n=Sj(Rj(j,q,x,E),da,r,s);f=f+n|0;h=da+N|0;h=f>>>0<n>>>0?h+1|0:h;n=i-f|0;f=T-((f>>>0>i>>>0)+h|0)|0;n=Rj(n,f,n,f);x=da;f=g;h=Sj(Rj(j,q,A,G),da,r,s);i=h+z|0;g=da+O|0;g=h>>>0>i>>>0?g+1|0:g;h=f-i|0;f=U-((f>>>0<i>>>0)+g|0)|0;g=Rj(h,f,h,f);i=g+n|0;f=da+x|0;f=g>>>0>i>>>0?f+1|0:f;n=i;g=Sj(Rj(j,q,C,J),da,r,s);i=g+B|0;h=da+P|0;h=g>>>0>i>>>0?h+1|0:h;g=m-i|0;i=V-((i>>>0>m>>>0)+h|0)|0;m=Rj(g,i,g,i);i=m+n|0;g=da+f|0;f=Rj(i,i>>>0<m>>>0?g+1|0:g,r,s);i=da;m=i;if(!i&f>>>0<=1){break i}h=f;while(1){g=e<<1|l>>>31;l=l<<1;e=g;n=!i&h>>>0>7|(i|0)!=0;h=(i&3)<<30|h>>>2;i=i>>>2|0;if(n){continue}break}break h}if((d|0)>(f|0)){e=f<<1}else{if((d|0)<=0){H[o+8>>2]=0;H[o+12>>2]=0;break j}e=(d<<1)-2|0}e=(e<<2)+c|0;H[o+8>>2]=H[e>>2];H[o+12>>2]=H[e+4>>2]}p=1;break f}e=m;l=f;if(f-1|0){break g}}while(1){i=Tj(f,m,l,e);h=e+da|0;e=i+l|0;h=e>>>0<l>>>0?h+1|0:h;l=(h&1)<<31|e>>>1;e=h>>>1|0;i=Rj(l,e,l,e);g=da;if((m|0)==(g|0)&f>>>0<i>>>0|g>>>0>m>>>0){continue}break}}f=H[o+20>>2];if(!f){break f}g=f-1|0;h=H[H[o+16>>2]+(g>>>3&536870908)>>2];H[o+20>>2]=g;p=1;f=Rj(j,q,y,w);i=da;n=Rj(r,s,K,S);m=n+f|0;f=da+i|0;f=m>>>0<n>>>0?f+1|0:f;i=Rj(l,e,D,W);g=h>>>g&1;h=g?0-i|0:i;m=h+m|0;n=f;f=da;i=n+(g?0-(f+((i|0)!=0)|0)|0:f)|0;Z=o,_=Sj(m,h>>>0>m>>>0?i+1|0:i,r,s),H[Z+12>>2]=_;f=Rj(j,q,D,W);i=da;j=Rj(r,s,Q,R);f=j+f|0;h=da+i|0;e=Rj(l,e,y,w);i=0-e|0;l=da;h=(f>>>0<j>>>0?h+1|0:h)+(g?l:0-(((e|0)!=0)+l|0)|0)|0;i=g?e:i;f=i+f|0;Z=o,_=Sj(f,f>>>0<i>>>0?h+1|0:h,r,s),H[Z+8>>2]=_}ca=k+80|0;e=p;break d}Ca();v()}i=e;if(!e){return 0}l:{if(H[a+8>>2]<=0){break l}l=H[M>>2];e=0;while(1){f=e<<2;g=H[f+Y>>2];j=H[a+16>>2];m:{if((g|0)>(j|0)){H[f+l>>2]=j;break m}f=f+l|0;j=H[a+12>>2];if((j|0)>(g|0)){H[f>>2]=j;break m}H[f>>2]=g}e=e+1|0;g=H[a+8>>2];if((e|0)<(g|0)){continue}break}f=0;if((g|0)<=0){break l}e=d<<3;j=e+c|0;q=b+e|0;while(1){g=f<<2;e=g+j|0;g=H[g+q>>2]+H[g+l>>2]|0;H[e>>2]=g;n:{if((g|0)>H[a+16>>2]){g=g-H[a+20>>2]|0}else{if((g|0)>=H[a+12>>2]){break n}g=g+H[a+20>>2]|0}H[e>>2]=g}f=f+1|0;if((f|0)<H[a+8>>2]){continue}break}}d=d+1|0;if((X|0)!=(d|0)){continue}break}}return i|0}Ca();v()}function xj(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,G=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0;a:{b:{if((e|0)!=2){break b}H[a+8>>2]=2;H[a- -64>>2]=f;M=a+32|0;e=H[M>>2];d=H[a+36>>2]-e|0;c:{if(d>>>0<=7){ya(M,2-(d>>>2|0)|0);break c}if((d|0)==8){break c}H[a+36>>2]=e+8}p=1;d=H[a+56>>2];d=H[d+4>>2]-H[d>>2]|0;if((d|0)<=0){break b}o=a+60|0;d=d>>>2|0;X=d>>>0<=1?1:d;Y=a+68|0;d=0;while(1){e=H[a+56>>2];h=H[e>>2];if(H[e+4>>2]-h>>2>>>0<=d>>>0){break a}k=ca-80|0;ca=k;f=-1;h=H[h+(d<<2)>>2];e=-1;d:{if((h|0)==-1){break d}e=h+1|0;f=(e>>>0)%3|0?e:h-2|0;e=h-1|0;if((h>>>0)%3|0){break d}e=h+2|0}g=H[o+36>>2];h=H[g>>2];e:{f:{g:{h:{i:{g=H[g+4>>2]-h>>2;i=f<<2;f=H[H[o+32>>2]+28>>2];j=H[i+f>>2];if(g>>>0<=j>>>0){break i}e=H[f+(e<<2)>>2];if(e>>>0>=g>>>0){break i}j:{k:{l=H[h+(e<<2)>>2];f=H[h+(j<<2)>>2];if((l|0)>=(d|0)|(f|0)>=(d|0)){break k}h=(l<<3)+c|0;w=H[h+4>>2];g=(f<<3)+c|0;e=H[g+4>>2];j=H[h>>2];h=H[g>>2];if(!((j|0)!=(h|0)|(e|0)!=(w|0))){H[o+8>>2]=h;H[o+12>>2]=e;break j}p=H[H[o+4>>2]+(d<<2)>>2];H[k+72>>2]=0;H[k+76>>2]=0;g=k- -64|0;H[g>>2]=0;H[g+4>>2]=0;H[k+56>>2]=0;H[k+60>>2]=0;g=H[o>>2];if(!I[g+84|0]){p=H[H[g+68>>2]+(p<<2)>>2]}Sa(g,p,F[g+24|0],k+56|0);p=H[H[o+4>>2]+(f<<2)>>2];H[k+48>>2]=0;H[k+52>>2]=0;H[k+40>>2]=0;H[k+44>>2]=0;H[k+32>>2]=0;H[k+36>>2]=0;g=H[o>>2];if(!I[g+84|0]){p=H[H[g+68>>2]+(p<<2)>>2]}Sa(g,p,F[g+24|0],k+32|0);p=H[H[o+4>>2]+(l<<2)>>2];H[k+24>>2]=0;H[k+28>>2]=0;H[k+16>>2]=0;H[k+20>>2]=0;H[k+8>>2]=0;H[k+12>>2]=0;g=H[o>>2];if(!I[g+84|0]){p=H[H[g+68>>2]+(p<<2)>>2]}Sa(g,p,F[g+24|0],k+8|0);g=H[k+16>>2];n=H[k+40>>2];x=g-n|0;N=H[k+44>>2];g=H[k+20>>2]-(N+(g>>>0<n>>>0)|0)|0;E=g;l=Rj(x,g,x,g);q=da;g=H[k+8>>2];z=H[k+32>>2];A=g-z|0;O=H[k+36>>2];g=H[k+12>>2]-(O+(g>>>0<z>>>0)|0)|0;G=g;i=l;l=Rj(A,g,A,g);g=i+l|0;i=da+q|0;i=g>>>0<l>>>0?i+1|0:i;l=H[k+24>>2];B=H[k+48>>2];C=l-B|0;P=H[k+52>>2];l=H[k+28>>2]-(P+(l>>>0<B>>>0)|0)|0;J=l;m=g;g=Rj(C,l,C,l);r=m+g|0;i=da+i|0;s=g>>>0>r>>>0?i+1|0:i;if(!(s|r)){break k}p=0;D=Tj(-1,2147483647,r,s);f=h>>31;R=f;i=f>>31;Q=h;g=i;q=h^g;h=q-g|0;f=(f^g)-((g>>>0>q>>>0)+g|0)|0;g=f;f=e>>31;S=f;K=e;e=f>>31;q=K^e;m=q-e|0;i=f>>31;e=(i^f)-((e>>>0>q>>>0)+i|0)|0;f=(g|0)==(e|0)&h>>>0>m>>>0|e>>>0<g>>>0;h=f?h:m;l=da;e=f?g:e;if((l|0)==(e|0)&h>>>0>D>>>0|e>>>0>l>>>0){break e}h=H[k+64>>2];T=H[k+68>>2];e=Rj(h-n|0,T-((h>>>0<n>>>0)+N|0)|0,x,E);f=da;g=H[k+56>>2];U=H[k+60>>2];l=Rj(g-z|0,U-((g>>>0<z>>>0)+O|0)|0,A,G);e=l+e|0;i=da+f|0;i=e>>>0<l>>>0?i+1|0:i;f=e;m=H[k+72>>2];V=H[k+76>>2];e=Rj(m-B|0,V-((m>>>0<B>>>0)+P|0)|0,C,J);l=f+e|0;f=da+i|0;q=e>>>0>l>>>0?f+1|0:f;e=j;D=e-Q|0;e=(e>>31)-((e>>>0<Q>>>0)+R|0)|0;W=e;j=e>>31;y=j^D;f=y-j|0;i=e>>31;e=(i^e)-((j>>>0>y>>>0)+i|0)|0;i=e;y=w-K|0;e=(w>>31)-((w>>>0<K>>>0)+S|0)|0;w=e;j=f;t=e>>31;u=t^y;L=u-t|0;f=e>>31;e=(f^e)-((t>>>0>u>>>0)+f|0)|0;f=(i|0)==(e|0)&j>>>0>L>>>0|e>>>0<i>>>0;f=Tj(-1,2147483647,f?j:L,f?i:e)>>>0<l>>>0;e=da;if(f&(e|0)<=(q|0)|(e|0)<(q|0)){break e}e=G>>31;f=e;j=e^A;e=j-e|0;f=(f^G)-((f>>>0>j>>>0)+f|0)|0;i=E>>31;t=i^x;u=t-i|0;j=(i^E)-((i>>>0>t>>>0)+i|0)|0;i=(f|0)==(j|0)&e>>>0>u>>>0|f>>>0>j>>>0;e=i?e:u;f=i?f:j;i=J>>31;L=e;t=i^C;u=t-i|0;j=(i^J)-((i>>>0>t>>>0)+i|0)|0;e=(f|0)==(j|0)&e>>>0>u>>>0|f>>>0>j>>>0;f=Tj(-1,2147483647,e?L:u,e?f:j)>>>0<l>>>0;e=da;if(f&(e|0)<=(q|0)|(e|0)<(q|0)){break e}j=1;e=0;f=n;n=Sj(Rj(l,q,x,E),da,r,s);f=f+n|0;i=da+N|0;i=f>>>0<n>>>0?i+1|0:i;n=h-f|0;f=T-((f>>>0>h>>>0)+i|0)|0;n=Rj(n,f,n,f);x=da;f=g;i=Sj(Rj(l,q,A,G),da,r,s);h=i+z|0;g=da+O|0;g=h>>>0<i>>>0?g+1|0:g;i=f-h|0;f=U-((f>>>0<h>>>0)+g|0)|0;g=Rj(i,f,i,f);h=g+n|0;f=da+x|0;f=h>>>0<g>>>0?f+1|0:f;n=h;g=Sj(Rj(l,q,C,J),da,r,s);h=g+B|0;i=da+P|0;i=h>>>0<g>>>0?i+1|0:i;g=m-h|0;h=V-((h>>>0>m>>>0)+i|0)|0;m=Rj(g,h,g,h);h=m+n|0;g=da+f|0;f=Rj(h,h>>>0<m>>>0?g+1|0:g,r,s);h=da;m=h;if(!h&f>>>0<=1){break h}i=f;while(1){g=e<<1|j>>>31;j=j<<1;e=g;n=!h&i>>>0>7|(h|0)!=0;i=(h&3)<<30|i>>>2;h=h>>>2|0;if(n){continue}break}break g}if((d|0)>(f|0)){e=f<<1}else{if((d|0)<=0){H[o+8>>2]=0;H[o+12>>2]=0;break j}e=(d<<1)-2|0}e=(e<<2)+c|0;H[o+8>>2]=H[e>>2];H[o+12>>2]=H[e+4>>2]}p=1;break e}Ca();v()}e=m;j=f;if(f-1|0){break f}}while(1){h=Tj(f,m,j,e);i=e+da|0;e=h+j|0;i=e>>>0<j>>>0?i+1|0:i;j=(i&1)<<31|e>>>1;e=i>>>1|0;h=Rj(j,e,j,e);g=da;if((m|0)==(g|0)&f>>>0<h>>>0|g>>>0>m>>>0){continue}break}}f=H[o+20>>2];if(!f){break e}g=f-1|0;i=H[H[o+16>>2]+(g>>>3&536870908)>>2];H[o+20>>2]=g;p=1;f=Rj(l,q,y,w);h=da;n=Rj(r,s,K,S);m=n+f|0;f=da+h|0;f=m>>>0<n>>>0?f+1|0:f;h=Rj(j,e,D,W);g=i>>>g&1;i=g?0-h|0:h;m=i+m|0;n=f;f=da;h=n+(g?0-(f+((h|0)!=0)|0)|0:f)|0;Z=o,_=Sj(m,i>>>0>m>>>0?h+1|0:h,r,s),H[Z+12>>2]=_;f=Rj(l,q,D,W);h=da;l=Rj(r,s,Q,R);f=l+f|0;i=da+h|0;e=Rj(j,e,y,w);h=0-e|0;j=da;i=(f>>>0<l>>>0?i+1|0:i)+(g?j:0-(((e|0)!=0)+j|0)|0)|0;h=g?e:h;f=h+f|0;Z=o,_=Sj(f,f>>>0<h>>>0?i+1|0:i,r,s),H[Z+8>>2]=_}ca=k+80|0;if(!p){return 0}l:{if(H[a+8>>2]<=0){break l}g=H[M>>2];e=0;while(1){f=e<<2;h=H[f+Y>>2];j=H[a+16>>2];m:{if((h|0)>(j|0)){H[f+g>>2]=j;break m}f=f+g|0;j=H[a+12>>2];if((j|0)>(h|0)){H[f>>2]=j;break m}H[f>>2]=h}e=e+1|0;h=H[a+8>>2];if((e|0)<(h|0)){continue}break}f=0;if((h|0)<=0){break l}e=d<<3;j=e+c|0;l=b+e|0;while(1){h=f<<2;e=h+j|0;h=H[h+l>>2]+H[h+g>>2]|0;H[e>>2]=h;n:{if((h|0)>H[a+16>>2]){i=h-H[a+20>>2]|0}else{if((h|0)>=H[a+12>>2]){break n}i=h+H[a+20>>2]|0}H[e>>2]=i}f=f+1|0;if((f|0)<H[a+8>>2]){continue}break}}d=d+1|0;if((X|0)!=(d|0)){continue}break}}return p|0}Ca();v()}function $a(a,b){var c=0,d=0,e=0,f=0,g=0;e=ca-16|0;ca=e;H[a+12>>2]=b;H[a+8>>2]=0;H[a>>2]=0;H[a+4>>2]=0;d=a+16|0;H[d>>2]=0;H[d+4>>2]=0;F[d+5|0]=0;F[d+6|0]=0;F[d+7|0]=0;F[d+8|0]=0;F[d+9|0]=0;F[d+10|0]=0;F[d+11|0]=0;F[d+12|0]=0;c=d+16|0;H[c>>2]=0;H[c+4>>2]=0;F[c+5|0]=0;F[c+6|0]=0;F[c+7|0]=0;F[c+8|0]=0;F[c+9|0]=0;F[c+10|0]=0;F[c+11|0]=0;F[c+12|0]=0;c=d+32|0;H[c>>2]=0;H[c+4>>2]=0;F[c+5|0]=0;F[c+6|0]=0;F[c+7|0]=0;F[c+8|0]=0;F[c+9|0]=0;F[c+10|0]=0;F[c+11|0]=0;F[c+12|0]=0;c=d+48|0;H[c>>2]=0;H[c+4>>2]=0;F[c+5|0]=0;F[c+6|0]=0;F[c+7|0]=0;F[c+8|0]=0;F[c+9|0]=0;F[c+10|0]=0;F[c+11|0]=0;F[c+12|0]=0;c=d- -64|0;H[c>>2]=0;H[c+4>>2]=0;F[c+5|0]=0;F[c+6|0]=0;F[c+7|0]=0;F[c+8|0]=0;F[c+9|0]=0;F[c+10|0]=0;F[c+11|0]=0;F[c+12|0]=0;c=d+80|0;H[c>>2]=0;H[c+4>>2]=0;F[c+5|0]=0;F[c+6|0]=0;F[c+7|0]=0;F[c+8|0]=0;F[c+9|0]=0;F[c+10|0]=0;F[c+11|0]=0;F[c+12|0]=0;c=d+96|0;H[c>>2]=0;H[c+4>>2]=0;F[c+5|0]=0;F[c+6|0]=0;F[c+7|0]=0;F[c+8|0]=0;F[c+9|0]=0;F[c+10|0]=0;F[c+11|0]=0;F[c+12|0]=0;c=d+112|0;H[c>>2]=0;H[c+4>>2]=0;F[c+5|0]=0;F[c+6|0]=0;F[c+7|0]=0;F[c+8|0]=0;F[c+9|0]=0;F[c+10|0]=0;F[c+11|0]=0;F[c+12|0]=0;c=d+128|0;H[c>>2]=0;H[c+4>>2]=0;F[c+5|0]=0;F[c+6|0]=0;F[c+7|0]=0;F[c+8|0]=0;F[c+9|0]=0;F[c+10|0]=0;F[c+11|0]=0;F[c+12|0]=0;c=d+144|0;H[c>>2]=0;H[c+4>>2]=0;F[c+5|0]=0;F[c+6|0]=0;F[c+7|0]=0;F[c+8|0]=0;F[c+9|0]=0;F[c+10|0]=0;F[c+11|0]=0;F[c+12|0]=0;c=d+160|0;H[c>>2]=0;H[c+4>>2]=0;F[c+5|0]=0;F[c+6|0]=0;F[c+7|0]=0;F[c+8|0]=0;F[c+9|0]=0;F[c+10|0]=0;F[c+11|0]=0;F[c+12|0]=0;c=d+176|0;H[c>>2]=0;H[c+4>>2]=0;F[c+5|0]=0;F[c+6|0]=0;F[c+7|0]=0;F[c+8|0]=0;F[c+9|0]=0;F[c+10|0]=0;F[c+11|0]=0;F[c+12|0]=0;c=d+192|0;H[c>>2]=0;H[c+4>>2]=0;F[c+5|0]=0;F[c+6|0]=0;F[c+7|0]=0;F[c+8|0]=0;F[c+9|0]=0;F[c+10|0]=0;F[c+11|0]=0;F[c+12|0]=0;c=d+208|0;H[c>>2]=0;H[c+4>>2]=0;F[c+5|0]=0;F[c+6|0]=0;F[c+7|0]=0;F[c+8|0]=0;F[c+9|0]=0;F[c+10|0]=0;F[c+11|0]=0;F[c+12|0]=0;c=d+224|0;H[c>>2]=0;H[c+4>>2]=0;F[c+5|0]=0;F[c+6|0]=0;F[c+7|0]=0;F[c+8|0]=0;F[c+9|0]=0;F[c+10|0]=0;F[c+11|0]=0;F[c+12|0]=0;c=d+240|0;H[c>>2]=0;H[c+4>>2]=0;F[c+5|0]=0;F[c+6|0]=0;F[c+7|0]=0;F[c+8|0]=0;F[c+9|0]=0;F[c+10|0]=0;F[c+11|0]=0;F[c+12|0]=0;c=d+256|0;H[c>>2]=0;H[c+4>>2]=0;F[c+5|0]=0;F[c+6|0]=0;F[c+7|0]=0;F[c+8|0]=0;F[c+9|0]=0;F[c+10|0]=0;F[c+11|0]=0;F[c+12|0]=0;c=d+272|0;H[c>>2]=0;H[c+4>>2]=0;F[c+5|0]=0;F[c+6|0]=0;F[c+7|0]=0;F[c+8|0]=0;F[c+9|0]=0;F[c+10|0]=0;F[c+11|0]=0;F[c+12|0]=0;c=d+288|0;H[c>>2]=0;H[c+4>>2]=0;F[c+5|0]=0;F[c+6|0]=0;F[c+7|0]=0;F[c+8|0]=0;F[c+9|0]=0;F[c+10|0]=0;F[c+11|0]=0;F[c+12|0]=0;c=d+304|0;H[c>>2]=0;H[c+4>>2]=0;F[c+5|0]=0;F[c+6|0]=0;F[c+7|0]=0;F[c+8|0]=0;F[c+9|0]=0;F[c+10|0]=0;F[c+11|0]=0;F[c+12|0]=0;c=d+320|0;H[c>>2]=0;H[c+4>>2]=0;F[c+5|0]=0;F[c+6|0]=0;F[c+7|0]=0;F[c+8|0]=0;F[c+9|0]=0;F[c+10|0]=0;F[c+11|0]=0;F[c+12|0]=0;c=d+336|0;H[c>>2]=0;H[c+4>>2]=0;F[c+5|0]=0;F[c+6|0]=0;F[c+7|0]=0;F[c+8|0]=0;F[c+9|0]=0;F[c+10|0]=0;F[c+11|0]=0;F[c+12|0]=0;c=d+352|0;H[c>>2]=0;H[c+4>>2]=0;F[c+5|0]=0;F[c+6|0]=0;F[c+7|0]=0;F[c+8|0]=0;F[c+9|0]=0;F[c+10|0]=0;F[c+11|0]=0;F[c+12|0]=0;c=d+368|0;H[c>>2]=0;H[c+4>>2]=0;F[c+5|0]=0;F[c+6|0]=0;F[c+7|0]=0;F[c+8|0]=0;F[c+9|0]=0;F[c+10|0]=0;F[c+11|0]=0;F[c+12|0]=0;c=d+384|0;H[c>>2]=0;H[c+4>>2]=0;F[c+5|0]=0;F[c+6|0]=0;F[c+7|0]=0;F[c+8|0]=0;F[c+9|0]=0;F[c+10|0]=0;F[c+11|0]=0;F[c+12|0]=0;c=d+400|0;H[c>>2]=0;H[c+4>>2]=0;F[c+5|0]=0;F[c+6|0]=0;F[c+7|0]=0;F[c+8|0]=0;F[c+9|0]=0;F[c+10|0]=0;F[c+11|0]=0;F[c+12|0]=0;c=d+416|0;H[c>>2]=0;H[c+4>>2]=0;F[c+5|0]=0;F[c+6|0]=0;F[c+7|0]=0;F[c+8|0]=0;F[c+9|0]=0;F[c+10|0]=0;F[c+11|0]=0;F[c+12|0]=0;c=d+432|0;H[c>>2]=0;H[c+4>>2]=0;F[c+5|0]=0;F[c+6|0]=0;F[c+7|0]=0;F[c+8|0]=0;F[c+9|0]=0;F[c+10|0]=0;F[c+11|0]=0;F[c+12|0]=0;c=d+448|0;H[c>>2]=0;H[c+4>>2]=0;F[c+5|0]=0;F[c+6|0]=0;F[c+7|0]=0;F[c+8|0]=0;F[c+9|0]=0;F[c+10|0]=0;F[c+11|0]=0;F[c+12|0]=0;c=d+464|0;H[c>>2]=0;H[c+4>>2]=0;F[c+5|0]=0;F[c+6|0]=0;F[c+7|0]=0;F[c+8|0]=0;F[c+9|0]=0;F[c+10|0]=0;F[c+11|0]=0;F[c+12|0]=0;c=d+480|0;H[c>>2]=0;H[c+4>>2]=0;F[c+5|0]=0;F[c+6|0]=0;F[c+7|0]=0;F[c+8|0]=0;F[c+9|0]=0;F[c+10|0]=0;F[c+11|0]=0;F[c+12|0]=0;d=d+496|0;H[d>>2]=0;H[d+4>>2]=0;F[d+5|0]=0;F[d+6|0]=0;F[d+7|0]=0;F[d+8|0]=0;F[d+9|0]=0;F[d+10|0]=0;F[d+11|0]=0;F[d+12|0]=0;H[a+528>>2]=0;H[a+532>>2]=0;F[a+533|0]=0;F[a+534|0]=0;F[a+535|0]=0;F[a+536|0]=0;F[a+537|0]=0;F[a+538|0]=0;F[a+539|0]=0;F[a+540|0]=0;H[a+544>>2]=0;H[a+548>>2]=0;H[a+560>>2]=0;H[a+552>>2]=0;H[a+556>>2]=0;H[a+564>>2]=0;H[a+568>>2]=0;H[a+580>>2]=0;H[a+572>>2]=0;H[a+576>>2]=0;H[a+584>>2]=0;H[a+588>>2]=0;H[a+600>>2]=0;H[a+592>>2]=0;H[a+596>>2]=0;H[a+612>>2]=0;H[a+604>>2]=0;H[a+608>>2]=0;g=a+628|0;a:{b:{if(b){if(b>>>0<1073741824){break b}sa();v()}H[a+616>>2]=0;H[a+620>>2]=0;H[a+624>>2]=0;H[e+8>>2]=0;H[e>>2]=0;H[e+4>>2]=0;d=1;break a}d=b<<2;c=pa(d);H[a+604>>2]=c;f=c+d|0;H[a+612>>2]=f;ra(c,0,d);H[a+624>>2]=0;H[a+616>>2]=0;H[a+620>>2]=0;H[a+608>>2]=f;c=pa(d);H[a+616>>2]=c;f=c+d|0;H[a+624>>2]=f;ra(c,0,d);H[a+620>>2]=f;c=pa(d);H[e>>2]=c;f=c+d|0;H[e+8>>2]=f;ra(c,0,d);H[e+4>>2]=f;d=b<<5|1}tb(g,d,e);c=H[e>>2];if(c){H[e+4>>2]=c;oa(c)}H[e+8>>2]=0;H[e>>2]=0;H[e+4>>2]=0;if(b){b=b<<2;c=pa(b);H[e>>2]=c;f=b+c|0;H[e+8>>2]=f;ra(c,0,b);H[e+4>>2]=f}tb(a+640|0,d,e);b=H[e>>2];if(b){H[e+4>>2]=b;oa(b)}ca=e+16|0;return a}function gc(a,b,c,d){var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=O(0),n=O(0),o=0;a:{b:{if(!d){break b}c:{switch(H[a+28>>2]-1|0){case 0:e=I[a+24|0];f=c&255;if(e>>>0<f>>>0?e:f){e=H[a>>2];h=H[e>>2];k=H[a+48>>2];b=Rj(H[a+40>>2],H[a+44>>2],b,0);i=b;b=b+k|0;b=b+h|0;h=H[e+4>>2];while(1){if(b>>>0>=h>>>0){break b}G[(g<<1)+d>>1]=F[b|0];b=b+1|0;g=g+1|0;e=I[a+24|0];if(g>>>0<(e>>>0<f>>>0?e:f)>>>0){continue}break}}j=1;if(e>>>0>=f>>>0){break b}break a;case 1:e=I[a+24|0];f=c&255;if(e>>>0<f>>>0?e:f){e=H[a>>2];h=H[e>>2];k=H[a+48>>2];b=Rj(H[a+40>>2],H[a+44>>2],b,0);i=b;b=b+k|0;b=b+h|0;h=H[e+4>>2];while(1){if(b>>>0>=h>>>0){break b}G[(g<<1)+d>>1]=I[b|0];b=b+1|0;g=g+1|0;e=I[a+24|0];if(g>>>0<(e>>>0<f>>>0?e:f)>>>0){continue}break}}j=1;if(e>>>0>=f>>>0){break b}break a;case 2:e=I[a+24|0];f=c&255;if(e>>>0<f>>>0?e:f){e=H[a>>2];h=H[e>>2];k=H[a+48>>2];b=Rj(H[a+40>>2],H[a+44>>2],b,0);i=b;b=b+k|0;b=b+h|0;h=H[e+4>>2];while(1){if(b>>>0>=h>>>0){break b}G[(g<<1)+d>>1]=J[b>>1];b=b+2|0;g=g+1|0;e=I[a+24|0];if(g>>>0<(e>>>0<f>>>0?e:f)>>>0){continue}break}}j=1;if(e>>>0>=f>>>0){break b}break a;case 3:e=I[a+24|0];f=c&255;if(e>>>0<f>>>0?e:f){e=H[a>>2];h=H[e>>2];k=H[a+48>>2];b=Rj(H[a+40>>2],H[a+44>>2],b,0);i=b;b=b+k|0;b=b+h|0;h=H[e+4>>2];while(1){if(b>>>0>=h>>>0){return 0}e=G[b>>1];if((e|0)<0){break b}G[(g<<1)+d>>1]=e;b=b+2|0;g=g+1|0;e=I[a+24|0];if(g>>>0<(e>>>0<f>>>0?e:f)>>>0){continue}break}}j=1;if(e>>>0>=f>>>0){break b}break a;case 4:e=I[a+24|0];f=c&255;if(e>>>0<f>>>0?e:f){e=H[a>>2];h=H[e>>2];k=H[a+48>>2];b=Rj(H[a+40>>2],H[a+44>>2],b,0);i=b;b=b+k|0;b=b+h|0;h=H[e+4>>2];while(1){if(b>>>0>=h>>>0){break b}e=H[b>>2];if(e+32768>>>0>65535){break b}G[(g<<1)+d>>1]=e;b=b+4|0;g=g+1|0;e=I[a+24|0];if(g>>>0<(e>>>0<f>>>0?e:f)>>>0){continue}break}}j=1;if(e>>>0>=f>>>0){break b}break a;case 5:e=I[a+24|0];f=c&255;if(e>>>0<f>>>0?e:f){e=H[a>>2];h=H[e>>2];k=H[a+48>>2];b=Rj(H[a+40>>2],H[a+44>>2],b,0);i=b;b=b+k|0;b=b+h|0;h=H[e+4>>2];while(1){if(b>>>0>=h>>>0){break b}e=H[b>>2];if(e>>>0>32767){break b}G[(g<<1)+d>>1]=e;b=b+4|0;g=g+1|0;e=I[a+24|0];if(g>>>0<(e>>>0<f>>>0?e:f)>>>0){continue}break}}j=1;if(e>>>0>=f>>>0){break b}break a;case 6:e=I[a+24|0];f=c&255;if(e>>>0<f>>>0?e:f){e=H[a>>2];h=H[e>>2];k=H[a+48>>2];b=Rj(H[a+40>>2],H[a+44>>2],b,0);i=b;b=b+k|0;b=b+h|0;k=H[e+4>>2];while(1){if(b>>>0>=k>>>0){break b}h=H[b+4>>2];e=H[b>>2];i=e+32768|0;h=i>>>0<32768?h+1|0:h;if(!h&i>>>0>65535|h){break b}G[(g<<1)+d>>1]=e;b=b+8|0;g=g+1|0;e=I[a+24|0];if(g>>>0<(e>>>0<f>>>0?e:f)>>>0){continue}break}}j=1;if(e>>>0>=f>>>0){break b}break a;case 7:e=I[a+24|0];f=c&255;if(e>>>0<f>>>0?e:f){e=H[a>>2];h=H[e>>2];k=H[a+48>>2];b=Rj(H[a+40>>2],H[a+44>>2],b,0);i=b;b=b+k|0;b=b+h|0;h=H[e+4>>2];while(1){if(b>>>0>=h>>>0){break b}k=H[b+4>>2];e=H[b>>2];if(!k&e>>>0>32767|k){break b}G[(g<<1)+d>>1]=e;b=b+8|0;g=g+1|0;e=I[a+24|0];if(g>>>0<(e>>>0<f>>>0?e:f)>>>0){continue}break}}j=1;if(e>>>0>=f>>>0){break b}break a;case 8:d:{e:{e=I[a+24|0];c=c&255;if(!(c>>>0>e>>>0?e:c)){break e}e=H[a>>2];j=H[e>>2];g=j;f=H[a+48>>2];b=Rj(H[a+40>>2],H[a+44>>2],b,0);i=b;b=b+f|0;g=b+g|0;f=H[e+4>>2];e=f-j|0;if(!I[a+32|0]){j=0;if((b|0)>=(e|0)){break d}b=0;while(1){m=L[g>>2];if(m>=O(32767)|m<O(-32768)|m!=m){break d}n=O(P(m));if(n==O(Infinity)){break d}e=(b<<1)+d|0;if(n<O(2147483648)){i=~~m}else{i=-2147483648}G[e>>1]=i;b=b+1|0;e=I[a+24|0];if(b>>>0>=(c>>>0>e>>>0?e:c)>>>0){break e}g=g+4|0;if(f>>>0>g>>>0){continue}break}break d}j=0;if((b|0)>=(e|0)){break d}b=0;while(1){m=L[g>>2];if(m>=O(32767)|m<O(-32768)|(O(P(m))==O(Infinity)|m!=m)){break d}if(m<O(0)|m>O(1)){break d}e=(b<<1)+d|0;l=T(+m*32767+.5);f:{if(P(l)<2147483648){i=~~l;break f}i=-2147483648}G[e>>1]=i;b=b+1|0;e=I[a+24|0];if(b>>>0>=(c>>>0>e>>>0?e:c)>>>0){break e}g=g+4|0;if(f>>>0>g>>>0){continue}break}break d}j=1;if(c>>>0<=e>>>0){break d}ra((e<<1)+d|0,0,c-e<<1)}return j;case 9:g:{h:{e=I[a+24|0];c=c&255;if(!(c>>>0>e>>>0?e:c)){break h}e=H[a>>2];j=H[e>>2];g=j;f=H[a+48>>2];b=Rj(H[a+40>>2],H[a+44>>2],b,0);i=b;b=b+f|0;g=b+g|0;f=H[e+4>>2];e=f-j|0;if(!I[a+32|0]){j=0;if((b|0)>=(e|0)){break g}b=0;while(1){l=M[g>>3];if(l>=32767|l<-32768|l!=l){break g}o=P(l);if(o==Infinity){break g}e=(b<<1)+d|0;if(o<2147483648){i=~~l}else{i=-2147483648}G[e>>1]=i;b=b+1|0;e=I[a+24|0];if(b>>>0>=(c>>>0>e>>>0?e:c)>>>0){break h}g=g+8|0;if(f>>>0>g>>>0){continue}break}break g}j=0;if((b|0)>=(e|0)){break g}b=0;while(1){l=M[g>>3];if(l>=32767|l<-32768|(P(l)==Infinity|l!=l)){break g}if(l<0|l>1){break g}e=(b<<1)+d|0;l=T(l*32767+.5);i:{if(P(l)<2147483648){i=~~l;break i}i=-2147483648}G[e>>1]=i;b=b+1|0;e=I[a+24|0];if(b>>>0>=(c>>>0>e>>>0?e:c)>>>0){break h}g=g+8|0;if(f>>>0>g>>>0){continue}break}break g}j=1;if(c>>>0<=e>>>0){break g}ra((e<<1)+d|0,0,c-e<<1)}return j;case 10:break c;default:break b}}e=I[a+24|0];f=c&255;if(e>>>0<f>>>0?e:f){e=H[a>>2];h=H[e>>2];k=H[a+48>>2];b=Rj(H[a+40>>2],H[a+44>>2],b,0);i=b;b=b+k|0;b=b+h|0;h=H[e+4>>2];while(1){if(b>>>0>=h>>>0){break b}G[(g<<1)+d>>1]=I[b|0];b=b+1|0;g=g+1|0;e=I[a+24|0];if(g>>>0<(e>>>0<f>>>0?e:f)>>>0){continue}break}}j=1;if(e>>>0>=f>>>0){break b}ra((e<<1)+d|0,0,(c&255)-e<<1)}return j}ra((e<<1)+d|0,0,(c&255)-e<<1);return 1}function ec(a,b,c,d){var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=O(0),n=O(0),o=0;a:{b:{if(!d){break b}c:{switch(H[a+28>>2]-1|0){case 0:e=I[a+24|0];f=c&255;if(e>>>0<f>>>0?e:f){e=H[a>>2];h=H[e>>2];k=H[a+48>>2];b=Rj(H[a+40>>2],H[a+44>>2],b,0);i=b;b=b+k|0;b=b+h|0;h=H[e+4>>2];while(1){if(b>>>0>=h>>>0){break b}H[(g<<2)+d>>2]=F[b|0];b=b+1|0;g=g+1|0;e=I[a+24|0];if(g>>>0<(e>>>0<f>>>0?e:f)>>>0){continue}break}}j=1;if(e>>>0>=f>>>0){break b}break a;case 1:e=I[a+24|0];f=c&255;if(e>>>0<f>>>0?e:f){e=H[a>>2];h=H[e>>2];k=H[a+48>>2];b=Rj(H[a+40>>2],H[a+44>>2],b,0);i=b;b=b+k|0;b=b+h|0;h=H[e+4>>2];while(1){if(b>>>0>=h>>>0){break b}H[(g<<2)+d>>2]=I[b|0];b=b+1|0;g=g+1|0;e=I[a+24|0];if(g>>>0<(e>>>0<f>>>0?e:f)>>>0){continue}break}}j=1;if(e>>>0>=f>>>0){break b}break a;case 2:e=I[a+24|0];f=c&255;if(e>>>0<f>>>0?e:f){e=H[a>>2];h=H[e>>2];k=H[a+48>>2];b=Rj(H[a+40>>2],H[a+44>>2],b,0);i=b;b=b+k|0;b=b+h|0;h=H[e+4>>2];while(1){if(b>>>0>=h>>>0){break b}H[(g<<2)+d>>2]=G[b>>1];b=b+2|0;g=g+1|0;e=I[a+24|0];if(g>>>0<(e>>>0<f>>>0?e:f)>>>0){continue}break}}j=1;if(e>>>0>=f>>>0){break b}break a;case 3:e=I[a+24|0];f=c&255;if(e>>>0<f>>>0?e:f){e=H[a>>2];h=H[e>>2];k=H[a+48>>2];b=Rj(H[a+40>>2],H[a+44>>2],b,0);i=b;b=b+k|0;b=b+h|0;h=H[e+4>>2];while(1){if(b>>>0>=h>>>0){break b}H[(g<<2)+d>>2]=J[b>>1];b=b+2|0;g=g+1|0;e=I[a+24|0];if(g>>>0<(e>>>0<f>>>0?e:f)>>>0){continue}break}}j=1;if(e>>>0>=f>>>0){break b}break a;case 4:e=I[a+24|0];f=c&255;if(e>>>0<f>>>0?e:f){e=H[a>>2];h=H[e>>2];k=H[a+48>>2];b=Rj(H[a+40>>2],H[a+44>>2],b,0);i=b;b=b+k|0;b=b+h|0;h=H[e+4>>2];while(1){if(b>>>0>=h>>>0){break b}H[(g<<2)+d>>2]=H[b>>2];b=b+4|0;g=g+1|0;e=I[a+24|0];if(g>>>0<(e>>>0<f>>>0?e:f)>>>0){continue}break}}j=1;if(e>>>0>=f>>>0){break b}break a;case 5:e=I[a+24|0];f=c&255;if(e>>>0<f>>>0?e:f){e=H[a>>2];h=H[e>>2];k=H[a+48>>2];b=Rj(H[a+40>>2],H[a+44>>2],b,0);i=b;b=b+k|0;b=b+h|0;h=H[e+4>>2];while(1){if(b>>>0>=h>>>0){return 0}e=H[b>>2];if((e|0)<0){break b}H[(g<<2)+d>>2]=e;b=b+4|0;g=g+1|0;e=I[a+24|0];if(g>>>0<(e>>>0<f>>>0?e:f)>>>0){continue}break}}j=1;if(e>>>0>=f>>>0){break b}break a;case 6:e=I[a+24|0];f=c&255;if(e>>>0<f>>>0?e:f){e=H[a>>2];h=H[e>>2];k=H[a+48>>2];b=Rj(H[a+40>>2],H[a+44>>2],b,0);i=b;b=b+k|0;b=b+h|0;k=H[e+4>>2];while(1){if(b>>>0>=k>>>0){break b}h=H[b+4>>2];e=H[b>>2];if(e- -2147483648>>>0<2147483648?h+1|0:h){break b}H[(g<<2)+d>>2]=e;b=b+8|0;g=g+1|0;e=I[a+24|0];if(g>>>0<(e>>>0<f>>>0?e:f)>>>0){continue}break}}j=1;if(e>>>0>=f>>>0){break b}break a;case 7:e=I[a+24|0];f=c&255;if(e>>>0<f>>>0?e:f){e=H[a>>2];h=H[e>>2];k=H[a+48>>2];b=Rj(H[a+40>>2],H[a+44>>2],b,0);i=b;b=b+k|0;b=b+h|0;h=H[e+4>>2];while(1){if(b>>>0>=h>>>0){break b}k=H[b+4>>2];e=H[b>>2];if(!k&e>>>0>2147483647|k){break b}H[(g<<2)+d>>2]=e;b=b+8|0;g=g+1|0;e=I[a+24|0];if(g>>>0<(e>>>0<f>>>0?e:f)>>>0){continue}break}}j=1;if(e>>>0>=f>>>0){break b}break a;case 8:d:{e:{e=I[a+24|0];c=c&255;if(!(c>>>0>e>>>0?e:c)){break e}e=H[a>>2];j=H[e>>2];g=j;f=H[a+48>>2];b=Rj(H[a+40>>2],H[a+44>>2],b,0);i=b;b=b+f|0;g=b+g|0;f=H[e+4>>2];e=f-j|0;if(!I[a+32|0]){j=0;if((b|0)>=(e|0)){break d}b=0;while(1){m=L[g>>2];if(m>=O(2147483648)|m<O(-2147483648)|m!=m){break d}n=O(P(m));if(n==O(Infinity)){break d}e=(b<<2)+d|0;if(n<O(2147483648)){i=~~m}else{i=-2147483648}H[e>>2]=i;b=b+1|0;e=I[a+24|0];if(b>>>0>=(c>>>0>e>>>0?e:c)>>>0){break e}g=g+4|0;if(f>>>0>g>>>0){continue}break}break d}j=0;if((b|0)>=(e|0)){break d}b=0;while(1){m=L[g>>2];if(m>=O(2147483648)|m<O(-2147483648)|(O(P(m))==O(Infinity)|m!=m)){break d}if(m<O(0)|m>O(1)){break d}e=(b<<2)+d|0;l=T(+m*2147483647+.5);f:{if(P(l)<2147483648){i=~~l;break f}i=-2147483648}H[e>>2]=i;b=b+1|0;e=I[a+24|0];if(b>>>0>=(c>>>0>e>>>0?e:c)>>>0){break e}g=g+4|0;if(f>>>0>g>>>0){continue}break}break d}j=1;if(c>>>0<=e>>>0){break d}ra((e<<2)+d|0,0,c-e<<2)}return j;case 9:g:{h:{e=I[a+24|0];c=c&255;if(!(c>>>0>e>>>0?e:c)){break h}e=H[a>>2];j=H[e>>2];g=j;f=H[a+48>>2];b=Rj(H[a+40>>2],H[a+44>>2],b,0);i=b;b=b+f|0;g=b+g|0;f=H[e+4>>2];e=f-j|0;if(!I[a+32|0]){j=0;if((b|0)>=(e|0)){break g}b=0;while(1){l=M[g>>3];if(l>=2147483647|l<-2147483648|l!=l){break g}o=P(l);if(o==Infinity){break g}e=(b<<2)+d|0;if(o<2147483648){i=~~l}else{i=-2147483648}H[e>>2]=i;b=b+1|0;e=I[a+24|0];if(b>>>0>=(c>>>0>e>>>0?e:c)>>>0){break h}g=g+8|0;if(f>>>0>g>>>0){continue}break}break g}j=0;if((b|0)>=(e|0)){break g}b=0;while(1){l=M[g>>3];if(l>=2147483647|l<-2147483648|(P(l)==Infinity|l!=l)){break g}if(l<0|l>1){break g}e=(b<<2)+d|0;l=T(l*2147483647+.5);i:{if(P(l)<2147483648){i=~~l;break i}i=-2147483648}H[e>>2]=i;b=b+1|0;e=I[a+24|0];if(b>>>0>=(c>>>0>e>>>0?e:c)>>>0){break h}g=g+8|0;if(f>>>0>g>>>0){continue}break}break g}j=1;if(c>>>0<=e>>>0){break g}ra((e<<2)+d|0,0,c-e<<2)}return j;case 10:break c;default:break b}}e=I[a+24|0];f=c&255;if(e>>>0<f>>>0?e:f){e=H[a>>2];h=H[e>>2];k=H[a+48>>2];b=Rj(H[a+40>>2],H[a+44>>2],b,0);i=b;b=b+k|0;b=b+h|0;h=H[e+4>>2];while(1){if(b>>>0>=h>>>0){break b}H[(g<<2)+d>>2]=I[b|0];b=b+1|0;g=g+1|0;e=I[a+24|0];if(g>>>0<(e>>>0<f>>>0?e:f)>>>0){continue}break}}j=1;if(e>>>0>=f>>>0){break b}ra((e<<2)+d|0,0,(c&255)-e<<2)}return j}ra((e<<2)+d|0,0,(c&255)-e<<2);return 1}function fc(a,b,c,d){var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=O(0);a:{b:{if(!d){break b}c:{switch(H[a+28>>2]-1|0){case 0:e=I[a+24|0];f=c&255;if(e>>>0<f>>>0?e:f){e=H[a>>2];h=H[e>>2];k=H[a+48>>2];b=Rj(H[a+40>>2],H[a+44>>2],b,0);i=b;b=b+k|0;b=b+h|0;h=H[e+4>>2];while(1){if(b>>>0>=h>>>0){return 0}e=F[b|0];if((e|0)<0){break b}G[(g<<1)+d>>1]=e&255;b=b+1|0;g=g+1|0;e=I[a+24|0];if(g>>>0<(e>>>0<f>>>0?e:f)>>>0){continue}break}}l=1;if(e>>>0>=f>>>0){break b}break a;case 1:e=I[a+24|0];f=c&255;if(e>>>0<f>>>0?e:f){e=H[a>>2];h=H[e>>2];k=H[a+48>>2];b=Rj(H[a+40>>2],H[a+44>>2],b,0);i=b;b=b+k|0;b=b+h|0;h=H[e+4>>2];while(1){if(b>>>0>=h>>>0){break b}G[(g<<1)+d>>1]=I[b|0];b=b+1|0;g=g+1|0;e=I[a+24|0];if(g>>>0<(e>>>0<f>>>0?e:f)>>>0){continue}break}}l=1;if(e>>>0>=f>>>0){break b}break a;case 2:e=I[a+24|0];f=c&255;if(e>>>0<f>>>0?e:f){e=H[a>>2];h=H[e>>2];k=H[a+48>>2];b=Rj(H[a+40>>2],H[a+44>>2],b,0);i=b;b=b+k|0;b=b+h|0;h=H[e+4>>2];while(1){if(b>>>0>=h>>>0){return 0}e=G[b>>1];if((e|0)<0){break b}G[(g<<1)+d>>1]=e;b=b+2|0;g=g+1|0;e=I[a+24|0];if(g>>>0<(e>>>0<f>>>0?e:f)>>>0){continue}break}}l=1;if(e>>>0>=f>>>0){break b}break a;case 3:e=I[a+24|0];f=c&255;if(e>>>0<f>>>0?e:f){e=H[a>>2];h=H[e>>2];k=H[a+48>>2];b=Rj(H[a+40>>2],H[a+44>>2],b,0);i=b;b=b+k|0;b=b+h|0;h=H[e+4>>2];while(1){if(b>>>0>=h>>>0){break b}G[(g<<1)+d>>1]=J[b>>1];b=b+2|0;g=g+1|0;e=I[a+24|0];if(g>>>0<(e>>>0<f>>>0?e:f)>>>0){continue}break}}l=1;if(e>>>0>=f>>>0){break b}break a;case 4:e=I[a+24|0];f=c&255;if(e>>>0<f>>>0?e:f){e=H[a>>2];h=H[e>>2];k=H[a+48>>2];b=Rj(H[a+40>>2],H[a+44>>2],b,0);i=b;b=b+k|0;b=b+h|0;h=H[e+4>>2];while(1){if(b>>>0>=h>>>0){break b}e=H[b>>2];if(e>>>0>65535){break b}G[(g<<1)+d>>1]=e;b=b+4|0;g=g+1|0;e=I[a+24|0];if(g>>>0<(e>>>0<f>>>0?e:f)>>>0){continue}break}}l=1;if(e>>>0>=f>>>0){break b}break a;case 5:e=I[a+24|0];f=c&255;if(e>>>0<f>>>0?e:f){e=H[a>>2];h=H[e>>2];k=H[a+48>>2];b=Rj(H[a+40>>2],H[a+44>>2],b,0);i=b;b=b+k|0;b=b+h|0;h=H[e+4>>2];while(1){if(b>>>0>=h>>>0){break b}e=H[b>>2];if(e>>>0>65535){break b}G[(g<<1)+d>>1]=e;b=b+4|0;g=g+1|0;e=I[a+24|0];if(g>>>0<(e>>>0<f>>>0?e:f)>>>0){continue}break}}l=1;if(e>>>0>=f>>>0){break b}break a;case 6:e=I[a+24|0];f=c&255;if(e>>>0<f>>>0?e:f){e=H[a>>2];h=H[e>>2];k=H[a+48>>2];b=Rj(H[a+40>>2],H[a+44>>2],b,0);i=b;b=b+k|0;b=b+h|0;h=H[e+4>>2];while(1){if(b>>>0>=h>>>0){break b}k=H[b+4>>2];e=H[b>>2];if(!k&e>>>0>65535|k){break b}G[(g<<1)+d>>1]=e;b=b+8|0;g=g+1|0;e=I[a+24|0];if(g>>>0<(e>>>0<f>>>0?e:f)>>>0){continue}break}}l=1;if(e>>>0>=f>>>0){break b}break a;case 7:e=I[a+24|0];f=c&255;if(e>>>0<f>>>0?e:f){e=H[a>>2];h=H[e>>2];k=H[a+48>>2];b=Rj(H[a+40>>2],H[a+44>>2],b,0);i=b;b=b+k|0;b=b+h|0;h=H[e+4>>2];while(1){if(b>>>0>=h>>>0){break b}k=H[b+4>>2];e=H[b>>2];if(!k&e>>>0>65535|k){break b}G[(g<<1)+d>>1]=e;b=b+8|0;g=g+1|0;e=I[a+24|0];if(g>>>0<(e>>>0<f>>>0?e:f)>>>0){continue}break}}l=1;if(e>>>0>=f>>>0){break b}break a;case 8:d:{e:{e=I[a+24|0];c=c&255;if(!(c>>>0>e>>>0?e:c)){break e}e=H[a>>2];l=H[e>>2];g=l;f=H[a+48>>2];b=Rj(H[a+40>>2],H[a+44>>2],b,0);i=b;b=b+f|0;g=b+g|0;f=H[e+4>>2];e=f-l|0;if(!I[a+32|0]){l=0;if((b|0)>=(e|0)){break d}b=0;while(1){m=L[g>>2];if(m>=O(65535)|m<O(0)|(O(P(m))==O(Infinity)|m!=m)){break d}e=(b<<1)+d|0;if(m<O(4294967296)&m>=O(0)){i=~~m>>>0}else{i=0}G[e>>1]=i;b=b+1|0;e=I[a+24|0];if(b>>>0>=(c>>>0>e>>>0?e:c)>>>0){break e}g=g+4|0;if(f>>>0>g>>>0){continue}break}break d}l=0;if((b|0)>=(e|0)){break d}b=0;while(1){m=L[g>>2];if(m>=O(65535)|m<O(0)|(O(P(m))==O(Infinity)|m!=m)){break d}if(m>O(1)){break d}e=(b<<1)+d|0;j=T(+m*65535+.5);f:{if(j<4294967296&j>=0){i=~~j>>>0;break f}i=0}G[e>>1]=i;b=b+1|0;e=I[a+24|0];if(b>>>0>=(c>>>0>e>>>0?e:c)>>>0){break e}g=g+4|0;if(f>>>0>g>>>0){continue}break}break d}l=1;if(c>>>0<=e>>>0){break d}ra((e<<1)+d|0,0,c-e<<1)}return l;case 9:g:{h:{e=I[a+24|0];c=c&255;if(!(c>>>0>e>>>0?e:c)){break h}e=H[a>>2];l=H[e>>2];g=l;f=H[a+48>>2];b=Rj(H[a+40>>2],H[a+44>>2],b,0);i=b;b=b+f|0;g=b+g|0;f=H[e+4>>2];e=f-l|0;if(!I[a+32|0]){l=0;if((b|0)>=(e|0)){break g}b=0;while(1){j=M[g>>3];if(j>=65535|j<0|(P(j)==Infinity|j!=j)){break g}e=(b<<1)+d|0;if(j<4294967296&j>=0){i=~~j>>>0}else{i=0}G[e>>1]=i;b=b+1|0;e=I[a+24|0];if(b>>>0>=(c>>>0>e>>>0?e:c)>>>0){break h}g=g+8|0;if(f>>>0>g>>>0){continue}break}break g}l=0;if((b|0)>=(e|0)){break g}b=0;while(1){j=M[g>>3];if(j>=65535|j<0|(P(j)==Infinity|j!=j)){break g}if(j>1){break g}e=(b<<1)+d|0;j=T(j*65535+.5);i:{if(j<4294967296&j>=0){i=~~j>>>0;break i}i=0}G[e>>1]=i;b=b+1|0;e=I[a+24|0];if(b>>>0>=(c>>>0>e>>>0?e:c)>>>0){break h}g=g+8|0;if(f>>>0>g>>>0){continue}break}break g}l=1;if(c>>>0<=e>>>0){break g}ra((e<<1)+d|0,0,c-e<<1)}return l;case 10:break c;default:break b}}e=I[a+24|0];f=c&255;if(e>>>0<f>>>0?e:f){e=H[a>>2];h=H[e>>2];k=H[a+48>>2];b=Rj(H[a+40>>2],H[a+44>>2],b,0);i=b;b=b+k|0;b=b+h|0;h=H[e+4>>2];while(1){if(b>>>0>=h>>>0){break b}G[(g<<1)+d>>1]=I[b|0];b=b+1|0;g=g+1|0;e=I[a+24|0];if(g>>>0<(e>>>0<f>>>0?e:f)>>>0){continue}break}}l=1;if(e>>>0>=f>>>0){break b}ra((e<<1)+d|0,0,(c&255)-e<<1)}return l}ra((e<<1)+d|0,0,(c&255)-e<<1);return 1}function Sa(a,b,c,d){var e=0,f=0,g=0,h=0,i=0,j=0,k=O(0),l=0,m=0,n=O(0),o=0;a:{if(!d){break a}b:{c:{switch(H[a+28>>2]-1|0){case 0:e=I[a+24|0];f=c&255;if(e>>>0<f>>>0?e:f){e=H[a>>2];h=H[e>>2];i=H[a+48>>2];b=Rj(H[a+40>>2],H[a+44>>2],b,0);j=b;b=b+i|0;b=b+h|0;h=H[e+4>>2];while(1){if(b>>>0>=h>>>0){break a}e=(g<<3)+d|0;i=F[b|0];H[e>>2]=i;H[e+4>>2]=i>>31;b=b+1|0;g=g+1|0;e=I[a+24|0];if(g>>>0<(e>>>0<f>>>0?e:f)>>>0){continue}break}}if(e>>>0>=f>>>0){break a}d=(e<<3)+d|0;a=(c&255)-e|0;break b;case 1:e=I[a+24|0];f=c&255;if(e>>>0<f>>>0?e:f){e=H[a>>2];h=H[e>>2];i=H[a+48>>2];b=Rj(H[a+40>>2],H[a+44>>2],b,0);j=b;b=b+i|0;b=b+h|0;h=H[e+4>>2];while(1){if(b>>>0>=h>>>0){break a}e=(g<<3)+d|0;H[e>>2]=I[b|0];H[e+4>>2]=0;b=b+1|0;g=g+1|0;e=I[a+24|0];if(g>>>0<(e>>>0<f>>>0?e:f)>>>0){continue}break}}if(e>>>0>=f>>>0){break a}d=(e<<3)+d|0;a=(c&255)-e|0;break b;case 2:e=I[a+24|0];f=c&255;if(e>>>0<f>>>0?e:f){e=H[a>>2];h=H[e>>2];i=H[a+48>>2];b=Rj(H[a+40>>2],H[a+44>>2],b,0);j=b;b=b+i|0;b=b+h|0;h=H[e+4>>2];while(1){if(b>>>0>=h>>>0){break a}e=(g<<3)+d|0;i=G[b>>1];H[e>>2]=i;H[e+4>>2]=i>>31;b=b+2|0;g=g+1|0;e=I[a+24|0];if(g>>>0<(e>>>0<f>>>0?e:f)>>>0){continue}break}}if(e>>>0>=f>>>0){break a}d=(e<<3)+d|0;a=(c&255)-e|0;break b;case 3:e=I[a+24|0];f=c&255;if(e>>>0<f>>>0?e:f){e=H[a>>2];h=H[e>>2];i=H[a+48>>2];b=Rj(H[a+40>>2],H[a+44>>2],b,0);j=b;b=b+i|0;b=b+h|0;h=H[e+4>>2];while(1){if(b>>>0>=h>>>0){break a}e=(g<<3)+d|0;H[e>>2]=J[b>>1];H[e+4>>2]=0;b=b+2|0;g=g+1|0;e=I[a+24|0];if(g>>>0<(e>>>0<f>>>0?e:f)>>>0){continue}break}}if(e>>>0>=f>>>0){break a}d=(e<<3)+d|0;a=(c&255)-e|0;break b;case 4:e=I[a+24|0];f=c&255;if(e>>>0<f>>>0?e:f){e=H[a>>2];h=H[e>>2];i=H[a+48>>2];b=Rj(H[a+40>>2],H[a+44>>2],b,0);j=b;b=b+i|0;b=b+h|0;h=H[e+4>>2];while(1){if(b>>>0>=h>>>0){break a}e=(g<<3)+d|0;i=H[b>>2];H[e>>2]=i;H[e+4>>2]=i>>31;b=b+4|0;g=g+1|0;e=I[a+24|0];if(g>>>0<(e>>>0<f>>>0?e:f)>>>0){continue}break}}if(e>>>0>=f>>>0){break a}d=(e<<3)+d|0;a=(c&255)-e|0;break b;case 5:e=I[a+24|0];f=c&255;if(e>>>0<f>>>0?e:f){e=H[a>>2];h=H[e>>2];i=H[a+48>>2];b=Rj(H[a+40>>2],H[a+44>>2],b,0);j=b;b=b+i|0;b=b+h|0;h=H[e+4>>2];while(1){if(b>>>0>=h>>>0){break a}e=(g<<3)+d|0;H[e>>2]=H[b>>2];H[e+4>>2]=0;b=b+4|0;g=g+1|0;e=I[a+24|0];if(g>>>0<(e>>>0<f>>>0?e:f)>>>0){continue}break}}if(e>>>0>=f>>>0){break a}d=(e<<3)+d|0;a=(c&255)-e|0;break b;case 6:e=I[a+24|0];f=c&255;if(e>>>0<f>>>0?e:f){e=H[a>>2];h=H[e>>2];i=H[a+48>>2];b=Rj(H[a+40>>2],H[a+44>>2],b,0);j=b;b=b+i|0;b=b+h|0;h=H[e+4>>2];while(1){if(b>>>0>=h>>>0){break a}i=H[b+4>>2];e=(g<<3)+d|0;H[e>>2]=H[b>>2];H[e+4>>2]=i;b=b+8|0;g=g+1|0;e=I[a+24|0];if(g>>>0<(e>>>0<f>>>0?e:f)>>>0){continue}break}}if(e>>>0>=f>>>0){break a}d=(e<<3)+d|0;a=(c&255)-e|0;break b;case 7:e=I[a+24|0];f=c&255;if(e>>>0<f>>>0?e:f){e=H[a>>2];h=H[e>>2];i=H[a+48>>2];b=Rj(H[a+40>>2],H[a+44>>2],b,0);j=b;b=b+i|0;b=b+h|0;h=H[e+4>>2];while(1){if(b>>>0>=h>>>0){break a}e=H[b>>2];i=H[b+4>>2];if((i|0)<0){break a}j=(g<<3)+d|0;H[j>>2]=e;H[j+4>>2]=i;b=b+8|0;g=g+1|0;e=I[a+24|0];if(g>>>0<(e>>>0<f>>>0?e:f)>>>0){continue}break}}if(e>>>0>=f>>>0){break a}d=(e<<3)+d|0;a=(c&255)-e|0;break b;case 8:d:{e=I[a+24|0];f=c&255;if(!(e>>>0<f>>>0?e:f)){break d}if(I[a+32|0]){break a}e=H[a+48>>2];b=Rj(H[a+40>>2],H[a+44>>2],b,0);j=b;b=b+e|0;e=H[a>>2];i=H[e+4>>2];e=H[e>>2];if((b|0)>=(i-e|0)){break a}g=b+e|0;h=c&255;b=0;while(1){k=L[g>>2];if(k>=O(0x8000000000000000)|k<O(-0x8000000000000000)|k!=k){break a}n=O(P(k));if(n==O(Infinity)){break a}e=(b<<3)+d|0;e:{if(n<O(0x8000000000000000)){j=O(P(k))>=O(1)?~~(k>O(0)?O(R(O(T(O(k*O(2.3283064365386963e-10)))),O(4294967296))):O(U(O(O(k-O(~~k>>>0>>>0))*O(2.3283064365386963e-10)))))>>>0:0;m=~~k>>>0;break e}j=-2147483648;m=0}H[e>>2]=m;H[e+4>>2]=j;b=b+1|0;e=I[a+24|0];if(b>>>0>=(e>>>0<h>>>0?e:h)>>>0){break d}g=g+4|0;if(i>>>0>g>>>0){continue}break}break a}if(e>>>0>=f>>>0){break a}d=(e<<3)+d|0;a=(c&255)-e|0;break b;case 9:f:{e=I[a+24|0];f=c&255;if(!(e>>>0<f>>>0?e:f)){break f}if(I[a+32|0]){break a}e=H[a+48>>2];b=Rj(H[a+40>>2],H[a+44>>2],b,0);j=b;b=b+e|0;e=H[a>>2];i=H[e+4>>2];e=H[e>>2];if((b|0)>=(i-e|0)){break a}g=b+e|0;h=c&255;b=0;while(1){l=M[g>>3];if(l>=0x8000000000000000|l<-0x8000000000000000|l!=l){break a}o=P(l);if(o==Infinity){break a}e=(b<<3)+d|0;g:{if(o<0x8000000000000000){j=P(l)>=1?~~(l>0?R(T(l*2.3283064365386963e-10),4294967295):U((l-+(~~l>>>0>>>0))*2.3283064365386963e-10))>>>0:0;m=~~l>>>0;break g}j=-2147483648;m=0}H[e>>2]=m;H[e+4>>2]=j;b=b+1|0;e=I[a+24|0];if(b>>>0>=(e>>>0<h>>>0?e:h)>>>0){break f}g=g+8|0;if(i>>>0>g>>>0){continue}break}break a}if(e>>>0>=f>>>0){break a}d=(e<<3)+d|0;a=(c&255)-e|0;break b;case 10:break c;default:break a}}e=I[a+24|0];f=c&255;if(e>>>0<f>>>0?e:f){e=H[a>>2];h=H[e>>2];i=H[a+48>>2];b=Rj(H[a+40>>2],H[a+44>>2],b,0);j=b;b=b+i|0;b=b+h|0;h=H[e+4>>2];while(1){if(b>>>0>=h>>>0){break a}e=(g<<3)+d|0;H[e>>2]=I[b|0];H[e+4>>2]=0;b=b+1|0;g=g+1|0;e=I[a+24|0];if(g>>>0<(e>>>0<f>>>0?e:f)>>>0){continue}break}}if(e>>>0>=f>>>0){break a}d=(e<<3)+d|0;a=(c&255)-e|0}ra(d,0,a<<3)}}function Oj(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;j=a;a:{b:{c:{d:{e:{f:{g:{h:{a=H[a+8>>2];switch(H[a+28>>2]-1|0){case 4:break c;case 5:break d;case 2:break e;case 3:break f;case 0:break g;case 1:break h;default:break a}}f=I[a+24|0];c=pa(f);a=H[j+16>>2];if(H[a+80>>2]){g=H[H[a>>2]>>2]+H[a+48>>2]|0}else{g=0}if(!b){break b}if(f){o=f&252;l=f&3;h=f>>>0<4;while(1){a=0;e=0;if(!h){while(1){k=g+(d<<2)|0;F[a+c|0]=H[k>>2];F[(a|1)+c|0]=H[k+4>>2];F[(a|2)+c|0]=H[k+8>>2];F[(a|3)+c|0]=H[k+12>>2];a=a+4|0;d=d+4|0;e=e+4|0;if((o|0)!=(e|0)){continue}break}}e=0;if(l){while(1){F[a+c|0]=H[g+(d<<2)>>2];a=a+1|0;d=d+1|0;e=e+1|0;if((l|0)!=(e|0)){continue}break}}qa(H[H[H[j+8>>2]+64>>2]>>2]+m|0,c,f);m=f+m|0;n=n+1|0;if((n|0)!=(b|0)){continue}break}break b}a=0;if((b|0)!=1){g=b&-2;while(1){qa(H[H[H[j+8>>2]+64>>2]>>2]+a|0,c,f);a=a+f|0;qa(a+H[H[H[j+8>>2]+64>>2]>>2]|0,c,f);a=a+f|0;d=d+2|0;if((g|0)!=(d|0)){continue}break}}if(!(b&1)){break b}qa(H[H[H[j+8>>2]+64>>2]>>2]+a|0,c,f);break b}f=I[a+24|0];c=pa(f);a=H[j+16>>2];if(H[a+80>>2]){g=H[H[a>>2]>>2]+H[a+48>>2]|0}else{g=0}if(!b){break b}if(f){o=f&252;l=f&3;h=f>>>0<4;while(1){a=0;e=0;if(!h){while(1){k=g+(d<<2)|0;F[a+c|0]=H[k>>2];F[(a|1)+c|0]=H[k+4>>2];F[(a|2)+c|0]=H[k+8>>2];F[(a|3)+c|0]=H[k+12>>2];a=a+4|0;d=d+4|0;e=e+4|0;if((o|0)!=(e|0)){continue}break}}e=0;if(l){while(1){F[a+c|0]=H[g+(d<<2)>>2];a=a+1|0;d=d+1|0;e=e+1|0;if((l|0)!=(e|0)){continue}break}}qa(H[H[H[j+8>>2]+64>>2]>>2]+m|0,c,f);m=f+m|0;n=n+1|0;if((n|0)!=(b|0)){continue}break}break b}a=0;if((b|0)!=1){g=b&-2;while(1){qa(H[H[H[j+8>>2]+64>>2]>>2]+a|0,c,f);a=a+f|0;qa(a+H[H[H[j+8>>2]+64>>2]>>2]|0,c,f);a=a+f|0;d=d+2|0;if((g|0)!=(d|0)){continue}break}}if(!(b&1)){break b}qa(H[H[H[j+8>>2]+64>>2]>>2]+a|0,c,f);break b}h=I[a+24|0];i=h<<1;c=pa(i);a=H[j+16>>2];if(H[a+80>>2]){g=H[H[a>>2]>>2]+H[a+48>>2]|0}else{g=0}if(!b){break b}if(h){o=h&252;l=h&3;h=h>>>0<4;while(1){a=0;e=0;if(!h){while(1){f=a<<1;k=g+(d<<2)|0;G[f+c>>1]=H[k>>2];G[(f|2)+c>>1]=H[k+4>>2];G[(f|4)+c>>1]=H[k+8>>2];G[(f|6)+c>>1]=H[k+12>>2];a=a+4|0;d=d+4|0;e=e+4|0;if((o|0)!=(e|0)){continue}break}}e=0;if(l){while(1){G[(a<<1)+c>>1]=H[g+(d<<2)>>2];a=a+1|0;d=d+1|0;e=e+1|0;if((l|0)!=(e|0)){continue}break}}qa(H[H[H[j+8>>2]+64>>2]>>2]+n|0,c,i);n=i+n|0;m=m+1|0;if((m|0)!=(b|0)){continue}break}break b}a=0;if((b|0)!=1){g=b&-2;while(1){qa(H[H[H[j+8>>2]+64>>2]>>2]+a|0,c,i);a=a+i|0;qa(a+H[H[H[j+8>>2]+64>>2]>>2]|0,c,i);a=a+i|0;d=d+2|0;if((g|0)!=(d|0)){continue}break}}if(!(b&1)){break b}qa(H[H[H[j+8>>2]+64>>2]>>2]+a|0,c,i);break b}h=I[a+24|0];i=h<<1;c=pa(i);a=H[j+16>>2];if(H[a+80>>2]){g=H[H[a>>2]>>2]+H[a+48>>2]|0}else{g=0}if(!b){break b}if(h){o=h&252;l=h&3;h=h>>>0<4;while(1){a=0;e=0;if(!h){while(1){f=a<<1;k=g+(d<<2)|0;G[f+c>>1]=H[k>>2];G[(f|2)+c>>1]=H[k+4>>2];G[(f|4)+c>>1]=H[k+8>>2];G[(f|6)+c>>1]=H[k+12>>2];a=a+4|0;d=d+4|0;e=e+4|0;if((o|0)!=(e|0)){continue}break}}e=0;if(l){while(1){G[(a<<1)+c>>1]=H[g+(d<<2)>>2];a=a+1|0;d=d+1|0;e=e+1|0;if((l|0)!=(e|0)){continue}break}}qa(H[H[H[j+8>>2]+64>>2]>>2]+n|0,c,i);n=i+n|0;m=m+1|0;if((m|0)!=(b|0)){continue}break}break b}a=0;if((b|0)!=1){g=b&-2;while(1){qa(H[H[H[j+8>>2]+64>>2]>>2]+a|0,c,i);a=a+i|0;qa(a+H[H[H[j+8>>2]+64>>2]>>2]|0,c,i);a=a+i|0;d=d+2|0;if((g|0)!=(d|0)){continue}break}}if(!(b&1)){break b}qa(H[H[H[j+8>>2]+64>>2]>>2]+a|0,c,i);break b}h=I[a+24|0];i=h<<2;c=pa(i);a=H[j+16>>2];if(H[a+80>>2]){g=H[H[a>>2]>>2]+H[a+48>>2]|0}else{g=0}if(!b){break b}if(h){o=h&252;l=h&3;h=h>>>0<4;while(1){a=0;e=0;if(!h){while(1){f=a<<2;k=g+(d<<2)|0;H[f+c>>2]=H[k>>2];H[(f|4)+c>>2]=H[k+4>>2];H[(f|8)+c>>2]=H[k+8>>2];H[(f|12)+c>>2]=H[k+12>>2];a=a+4|0;d=d+4|0;e=e+4|0;if((o|0)!=(e|0)){continue}break}}e=0;if(l){while(1){H[(a<<2)+c>>2]=H[g+(d<<2)>>2];a=a+1|0;d=d+1|0;e=e+1|0;if((l|0)!=(e|0)){continue}break}}qa(H[H[H[j+8>>2]+64>>2]>>2]+n|0,c,i);n=i+n|0;m=m+1|0;if((m|0)!=(b|0)){continue}break}break b}a=0;if((b|0)!=1){g=b&-2;while(1){qa(H[H[H[j+8>>2]+64>>2]>>2]+a|0,c,i);a=a+i|0;qa(a+H[H[H[j+8>>2]+64>>2]>>2]|0,c,i);a=a+i|0;d=d+2|0;if((g|0)!=(d|0)){continue}break}}if(!(b&1)){break b}qa(H[H[H[j+8>>2]+64>>2]>>2]+a|0,c,i);break b}h=I[a+24|0];i=h<<2;c=pa(i);a=H[j+16>>2];if(H[a+80>>2]){g=H[H[a>>2]>>2]+H[a+48>>2]|0}else{g=0}if(!b){break b}if(h){o=h&252;l=h&3;h=h>>>0<4;while(1){a=0;e=0;if(!h){while(1){f=a<<2;k=g+(d<<2)|0;H[f+c>>2]=H[k>>2];H[(f|4)+c>>2]=H[k+4>>2];H[(f|8)+c>>2]=H[k+8>>2];H[(f|12)+c>>2]=H[k+12>>2];a=a+4|0;d=d+4|0;e=e+4|0;if((o|0)!=(e|0)){continue}break}}e=0;if(l){while(1){H[(a<<2)+c>>2]=H[g+(d<<2)>>2];a=a+1|0;d=d+1|0;e=e+1|0;if((l|0)!=(e|0)){continue}break}}qa(H[H[H[j+8>>2]+64>>2]>>2]+n|0,c,i);n=i+n|0;m=m+1|0;if((m|0)!=(b|0)){continue}break}break b}a=0;if((b|0)!=1){g=b&-2;while(1){qa(H[H[H[j+8>>2]+64>>2]>>2]+a|0,c,i);a=a+i|0;qa(a+H[H[H[j+8>>2]+64>>2]>>2]|0,c,i);a=a+i|0;d=d+2|0;if((g|0)!=(d|0)){continue}break}}if(!(b&1)){break b}qa(H[H[H[j+8>>2]+64>>2]>>2]+a|0,c,i)}oa(c);c=1}return c|0}function dc(a,b,c,d){var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=O(0);a:{b:{if(!d){break b}c:{switch(H[a+28>>2]-1|0){case 0:e=I[a+24|0];f=c&255;if(e>>>0<f>>>0?e:f){e=H[a>>2];h=H[e>>2];l=H[a+48>>2];b=Rj(H[a+40>>2],H[a+44>>2],b,0);i=b;b=b+l|0;b=b+h|0;h=H[e+4>>2];while(1){if(b>>>0>=h>>>0){break b}H[(g<<2)+d>>2]=F[b|0];b=b+1|0;g=g+1|0;e=I[a+24|0];if(g>>>0<(e>>>0<f>>>0?e:f)>>>0){continue}break}}k=1;if(e>>>0>=f>>>0){break b}break a;case 1:e=I[a+24|0];f=c&255;if(e>>>0<f>>>0?e:f){e=H[a>>2];h=H[e>>2];l=H[a+48>>2];b=Rj(H[a+40>>2],H[a+44>>2],b,0);i=b;b=b+l|0;b=b+h|0;h=H[e+4>>2];while(1){if(b>>>0>=h>>>0){break b}H[(g<<2)+d>>2]=I[b|0];b=b+1|0;g=g+1|0;e=I[a+24|0];if(g>>>0<(e>>>0<f>>>0?e:f)>>>0){continue}break}}k=1;if(e>>>0>=f>>>0){break b}break a;case 2:e=I[a+24|0];f=c&255;if(e>>>0<f>>>0?e:f){e=H[a>>2];h=H[e>>2];l=H[a+48>>2];b=Rj(H[a+40>>2],H[a+44>>2],b,0);i=b;b=b+l|0;b=b+h|0;h=H[e+4>>2];while(1){if(b>>>0>=h>>>0){break b}H[(g<<2)+d>>2]=G[b>>1];b=b+2|0;g=g+1|0;e=I[a+24|0];if(g>>>0<(e>>>0<f>>>0?e:f)>>>0){continue}break}}k=1;if(e>>>0>=f>>>0){break b}break a;case 3:e=I[a+24|0];f=c&255;if(e>>>0<f>>>0?e:f){e=H[a>>2];h=H[e>>2];l=H[a+48>>2];b=Rj(H[a+40>>2],H[a+44>>2],b,0);i=b;b=b+l|0;b=b+h|0;h=H[e+4>>2];while(1){if(b>>>0>=h>>>0){break b}H[(g<<2)+d>>2]=J[b>>1];b=b+2|0;g=g+1|0;e=I[a+24|0];if(g>>>0<(e>>>0<f>>>0?e:f)>>>0){continue}break}}k=1;if(e>>>0>=f>>>0){break b}break a;case 4:e=I[a+24|0];f=c&255;if(e>>>0<f>>>0?e:f){e=H[a>>2];h=H[e>>2];l=H[a+48>>2];b=Rj(H[a+40>>2],H[a+44>>2],b,0);i=b;b=b+l|0;b=b+h|0;h=H[e+4>>2];while(1){if(b>>>0>=h>>>0){break b}H[(g<<2)+d>>2]=H[b>>2];b=b+4|0;g=g+1|0;e=I[a+24|0];if(g>>>0<(e>>>0<f>>>0?e:f)>>>0){continue}break}}k=1;if(e>>>0>=f>>>0){break b}break a;case 5:e=I[a+24|0];f=c&255;if(e>>>0<f>>>0?e:f){e=H[a>>2];h=H[e>>2];l=H[a+48>>2];b=Rj(H[a+40>>2],H[a+44>>2],b,0);i=b;b=b+l|0;b=b+h|0;h=H[e+4>>2];while(1){if(b>>>0>=h>>>0){break b}H[(g<<2)+d>>2]=H[b>>2];b=b+4|0;g=g+1|0;e=I[a+24|0];if(g>>>0<(e>>>0<f>>>0?e:f)>>>0){continue}break}}k=1;if(e>>>0>=f>>>0){break b}break a;case 6:e=I[a+24|0];f=c&255;if(e>>>0<f>>>0?e:f){e=H[a>>2];h=H[e>>2];l=H[a+48>>2];b=Rj(H[a+40>>2],H[a+44>>2],b,0);i=b;b=b+l|0;b=b+h|0;h=H[e+4>>2];while(1){if(b>>>0>=h>>>0){break b}e=H[b>>2];if(H[b+4>>2]){break b}H[(g<<2)+d>>2]=e;b=b+8|0;g=g+1|0;e=I[a+24|0];if(g>>>0<(e>>>0<f>>>0?e:f)>>>0){continue}break}}k=1;if(e>>>0>=f>>>0){break b}break a;case 7:e=I[a+24|0];f=c&255;if(e>>>0<f>>>0?e:f){e=H[a>>2];h=H[e>>2];l=H[a+48>>2];b=Rj(H[a+40>>2],H[a+44>>2],b,0);i=b;b=b+l|0;b=b+h|0;h=H[e+4>>2];while(1){if(b>>>0>=h>>>0){break b}e=H[b>>2];if(H[b+4>>2]){break b}H[(g<<2)+d>>2]=e;b=b+8|0;g=g+1|0;e=I[a+24|0];if(g>>>0<(e>>>0<f>>>0?e:f)>>>0){continue}break}}k=1;if(e>>>0>=f>>>0){break b}break a;case 8:d:{e:{e=I[a+24|0];c=c&255;if(!(c>>>0>e>>>0?e:c)){break e}e=H[a>>2];k=H[e>>2];g=k;f=H[a+48>>2];b=Rj(H[a+40>>2],H[a+44>>2],b,0);i=b;b=b+f|0;g=b+g|0;f=H[e+4>>2];e=f-k|0;if(!I[a+32|0]){k=0;if((b|0)>=(e|0)){break d}b=0;while(1){m=L[g>>2];if(m>=O(4294967296)|m<O(0)|(O(P(m))==O(Infinity)|m!=m)){break d}e=(b<<2)+d|0;if(m<O(4294967296)&m>=O(0)){i=~~m>>>0}else{i=0}H[e>>2]=i;b=b+1|0;e=I[a+24|0];if(b>>>0>=(c>>>0>e>>>0?e:c)>>>0){break e}g=g+4|0;if(f>>>0>g>>>0){continue}break}break d}k=0;if((b|0)>=(e|0)){break d}b=0;while(1){m=L[g>>2];if(m>=O(4294967296)|m<O(0)|(O(P(m))==O(Infinity)|m!=m)){break d}if(m>O(1)){break d}e=(b<<2)+d|0;j=T(+m*4294967295+.5);f:{if(j<4294967296&j>=0){i=~~j>>>0;break f}i=0}H[e>>2]=i;b=b+1|0;e=I[a+24|0];if(b>>>0>=(c>>>0>e>>>0?e:c)>>>0){break e}g=g+4|0;if(f>>>0>g>>>0){continue}break}break d}k=1;if(c>>>0<=e>>>0){break d}ra((e<<2)+d|0,0,c-e<<2)}return k;case 9:g:{h:{e=I[a+24|0];c=c&255;if(!(c>>>0>e>>>0?e:c)){break h}e=H[a>>2];k=H[e>>2];g=k;f=H[a+48>>2];b=Rj(H[a+40>>2],H[a+44>>2],b,0);i=b;b=b+f|0;g=b+g|0;f=H[e+4>>2];e=f-k|0;if(!I[a+32|0]){k=0;if((b|0)>=(e|0)){break g}b=0;while(1){j=M[g>>3];if(j>=4294967295|j<0|(P(j)==Infinity|j!=j)){break g}e=(b<<2)+d|0;if(j<4294967296&j>=0){i=~~j>>>0}else{i=0}H[e>>2]=i;b=b+1|0;e=I[a+24|0];if(b>>>0>=(c>>>0>e>>>0?e:c)>>>0){break h}g=g+8|0;if(f>>>0>g>>>0){continue}break}break g}k=0;if((b|0)>=(e|0)){break g}b=0;while(1){j=M[g>>3];if(j>=4294967295|j<0|(P(j)==Infinity|j!=j)){break g}if(j>1){break g}e=(b<<2)+d|0;j=T(j*4294967295+.5);i:{if(j<4294967296&j>=0){i=~~j>>>0;break i}i=0}H[e>>2]=i;b=b+1|0;e=I[a+24|0];if(b>>>0>=(c>>>0>e>>>0?e:c)>>>0){break h}g=g+8|0;if(f>>>0>g>>>0){continue}break}break g}k=1;if(c>>>0<=e>>>0){break g}ra((e<<2)+d|0,0,c-e<<2)}return k;case 10:break c;default:break b}}e=I[a+24|0];f=c&255;if(e>>>0<f>>>0?e:f){e=H[a>>2];h=H[e>>2];l=H[a+48>>2];b=Rj(H[a+40>>2],H[a+44>>2],b,0);i=b;b=b+l|0;b=b+h|0;h=H[e+4>>2];while(1){if(b>>>0>=h>>>0){break b}H[(g<<2)+d>>2]=I[b|0];b=b+1|0;g=g+1|0;e=I[a+24|0];if(g>>>0<(e>>>0<f>>>0?e:f)>>>0){continue}break}}k=1;if(e>>>0>=f>>>0){break b}ra((e<<2)+d|0,0,(c&255)-e<<2)}return k}ra((e<<2)+d|0,0,(c&255)-e<<2);return 1}function ye(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;a:{b:{c:{d:{e:{if(H[a+92>>2]==H[a+88>>2]){break e}c=H[a+52>>2];f:{if((c|0)!=H[a+56>>2]){H[c>>2]=b;H[a+52>>2]=c+4;break f}h=H[a+48>>2];g=c-h|0;d=g>>2;f=d+1|0;if(f>>>0>=1073741824){break a}e=g>>>1|0;g=g>>>0>=2147483644?1073741823:f>>>0<e>>>0?e:f;if(g){if(g>>>0>=1073741824){break d}e=pa(g<<2)}else{e=0}f=e+(d<<2)|0;H[f>>2]=b;d=f+4|0;if((c|0)!=(h|0)){while(1){f=f-4|0;c=c-4|0;H[f>>2]=H[c>>2];if((c|0)!=(h|0)){continue}break}}H[a+56>>2]=e+(g<<2);H[a+52>>2]=d;H[a+48>>2]=f;if(!h){break f}oa(h)}H[a+84>>2]=0;c=-1;e=-1;g:{if((b|0)==-1){break g}d=H[a+4>>2];e=b+1|0;e=(e>>>0)%3|0?e:b-2|0;if((e|0)!=-1){c=H[H[d>>2]+(e<<2)>>2]}h:{if((b>>>0)%3|0){l=b-1|0;break h}l=b+2|0;e=-1;if((l|0)==-1){break g}}e=H[H[d>>2]+(l<<2)>>2]}i=e>>>3&536870908;d=H[a+36>>2];h=d+(c>>>3&536870908)|0;g=H[h>>2];f=1<<c;if(!(g&f)){H[h>>2]=f|g;f=a+8|0;if((b|0)!=-1){d=b+1|0;d=(d>>>0)%3|0?d:b-2|0}else{d=-1}Ua(f,c,d);d=H[a+36>>2]}f=d+i|0;d=H[f>>2];c=1<<e;if(!(d&c)){H[f>>2]=c|d;d=a+8|0;c=-1;i:{if((b|0)==-1){break i}c=b-1|0;if((b>>>0)%3|0){break i}c=b+2|0}Ua(d,e,c)}c=-1;c=(b|0)!=-1?H[H[H[a+4>>2]>>2]+(b<<2)>>2]:c;f=H[a+36>>2]+(c>>>3&536870908)|0;d=H[f>>2];e=1<<c;if(!(d&e)){H[f>>2]=d|e;Ua(a+8|0,c,b)}d=H[a+84>>2];if((d|0)>2){break e}while(1){e=N(d,12)+a|0;b=H[e+52>>2];if((b|0)==H[e+48>>2]){d=d+1|0;if((d|0)!=3){continue}break e}b=b-4|0;c=H[b>>2];H[e+52>>2]=b;H[a+84>>2]=d;if((c|0)==-1){break e}f=H[a+24>>2];b=(c>>>0)/3|0;j:{if(H[f+(b>>>3&268435452)>>2]>>>b&1){break j}k:{while(1){k=(c>>>0)/3|0;b=(k>>>3&268435452)+f|0;H[b>>2]=H[b>>2]|1<<k;d=-1;l:{m:{n:{o:{p:{q:{r:{s:{d=(c|0)!=-1?H[H[H[a+4>>2]>>2]+(c<<2)>>2]:d;f=H[a+36>>2]+(d>>>3&536870908)|0;e=H[f>>2];b=1<<d;if(!(e&b)){H[f>>2]=b|e;i=H[(H[H[a+16>>2]+96>>2]+N(k,12)|0)+((c>>>0)%3<<2)>>2];l=H[H[a+20>>2]+4>>2];f=H[l+4>>2];t:{if((f|0)!=H[l+8>>2]){H[f>>2]=i;H[l+4>>2]=f+4;break t}j=H[l>>2];h=f-j|0;g=h>>2;e=g+1|0;if(e>>>0>=1073741824){break s}b=h>>>1|0;h=h>>>0>=2147483644?1073741823:b>>>0>e>>>0?b:e;if(h){if(h>>>0>=1073741824){break d}e=pa(h<<2)}else{e=0}b=e+(g<<2)|0;H[b>>2]=i;g=b+4|0;if((f|0)!=(j|0)){while(1){b=b-4|0;f=f-4|0;H[b>>2]=H[f>>2];if((f|0)!=(j|0)){continue}break}}H[l+8>>2]=e+(h<<2);H[l+4>>2]=g;H[l>>2]=b;if(!j){break t}oa(j)}j=H[a+12>>2];f=H[j+4>>2];u:{if((f|0)!=H[j+8>>2]){H[f>>2]=c;H[j+4>>2]=f+4;break u}i=H[j>>2];h=f-i|0;g=h>>2;e=g+1|0;if(e>>>0>=1073741824){break r}b=h>>>1|0;h=h>>>0>=2147483644?1073741823:b>>>0>e>>>0?b:e;if(h){if(h>>>0>=1073741824){break d}e=pa(h<<2)}else{e=0}b=e+(g<<2)|0;H[b>>2]=c;g=b+4|0;if((f|0)!=(i|0)){while(1){b=b-4|0;f=f-4|0;H[b>>2]=H[f>>2];if((f|0)!=(i|0)){continue}break}}H[j+8>>2]=e+(h<<2);H[j+4>>2]=g;H[j>>2]=b;if(!i){break u}oa(i)}b=H[a+12>>2];H[H[b+12>>2]+(d<<2)>>2]=H[b+24>>2];H[b+24>>2]=H[b+24>>2]+1}if((c|0)==-1){break k}g=H[a+4>>2];f=-1;b=c+1|0;b=(b>>>0)%3|0?b:c-2|0;if((b|0)!=-1){f=H[H[g+12>>2]+(b<<2)>>2]}v:{w:{if((N(k,3)|0)!=(c|0)){d=c-1|0;break w}d=c+2|0;c=-1;if((d|0)==-1){break v}}c=H[H[g+12>>2]+(d<<2)>>2]}d=(c|0)==-1;e=(c>>>0)/3|0;if((f|0)!=-1){b=(f>>>0)/3|0;b=H[H[a+24>>2]+(b>>>3&268435452)>>2]&1<<b;if(d){break q}l=(b|0)!=0;break p}l=1;if(!d){break p}break k}sa();v()}sa();v()}if(!b){break o}break k}b=d?-1:e;x:{if(H[H[a+24>>2]+(b>>>3&536870908)>>2]>>>b&1){break x}k=0;b=H[H[g>>2]+(c<<2)>>2];if(!(H[H[a+36>>2]+(b>>>3&536870908)>>2]>>>b&1)){b=H[a+88>>2]+(b<<2)|0;e=H[b>>2];H[b>>2]=e+1;k=(e|0)<=0?2:1}if(H[a+84>>2]>=(k|0)&l){break m}j=N(k,12)+a|0;b=H[j+52>>2];y:{if((b|0)!=H[j+56>>2]){H[b>>2]=c;H[j+52>>2]=b+4;break y}i=H[j+48>>2];h=b-i|0;d=h>>2;g=d+1|0;if(g>>>0>=1073741824){break c}e=h>>>1|0;g=h>>>0>=2147483644?1073741823:e>>>0>g>>>0?e:g;if(g){if(g>>>0>=1073741824){break d}e=pa(g<<2)}else{e=0}d=e+(d<<2)|0;H[d>>2]=c;c=d+4|0;if((b|0)!=(i|0)){while(1){d=d-4|0;b=b-4|0;H[d>>2]=H[b>>2];if((b|0)!=(i|0)){continue}break}}H[j+48>>2]=d;H[j+52>>2]=c;H[j+56>>2]=e+(g<<2);if(!i){break y}oa(i)}if(H[a+84>>2]<=(k|0)){break x}H[a+84>>2]=k}if(l){break k}c=-1;if((f|0)==-1){break n}}c=H[H[H[a+4>>2]>>2]+(f<<2)>>2]}b=0;if(!(H[H[a+36>>2]+(c>>>3&536870908)>>2]>>>c&1)){b=H[a+88>>2]+(c<<2)|0;c=H[b>>2];H[b>>2]=c+1;b=(c|0)<=0?2:1}if(H[a+84>>2]<(b|0)){break l}c=f}f=H[a+24>>2];continue}break}k=N(b,12)+a|0;c=H[k+52>>2];z:{if((c|0)!=H[k+56>>2]){H[c>>2]=f;H[k+52>>2]=c+4;break z}i=H[k+48>>2];h=c-i|0;d=h>>2;g=d+1|0;if(g>>>0>=1073741824){break b}e=h>>>1|0;g=h>>>0>=2147483644?1073741823:e>>>0>g>>>0?e:g;if(g){if(g>>>0>=1073741824){break d}e=pa(g<<2)}else{e=0}d=e+(d<<2)|0;H[d>>2]=f;f=d+4|0;if((c|0)!=(i|0)){while(1){d=d-4|0;c=c-4|0;H[d>>2]=H[c>>2];if((c|0)!=(i|0)){continue}break}}H[k+48>>2]=d;H[k+52>>2]=f;H[k+56>>2]=e+(g<<2);if(!i){break z}oa(i)}d=H[a+84>>2];if((d|0)<=(b|0)){break j}H[a+84>>2]=b;d=b;break j}d=H[a+84>>2]}if((d|0)<3){continue}break}}return 1}wa();v()}sa();v()}sa();v()}sa();v()}function gd(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;n=ca-96|0;ca=n;o=H[a+4>>2];d=H[o+32>>2];i=H[d+8>>2];j=H[d+12>>2];e=j;c=H[d+20>>2];f=H[d+16>>2];a:{if((e|0)<=(c|0)&f>>>0>=i>>>0|(c|0)>(e|0)){break a}p=H[d>>2];g=I[p+f|0];h=f+1|0;e=h?c:c+1|0;H[d+16>>2]=h;H[d+20>>2]=e;if((e|0)>=(j|0)&h>>>0>=i>>>0|(e|0)>(j|0)){break a}m=I[h+p|0];h=f+2|0;e=h>>>0<2?c+1|0:c;H[d+16>>2]=h;H[d+20>>2]=e;l=g<<24>>24;b:{if((l|0)>=0){k=H[a+216>>2];if(g>>>0>=(H[a+220>>2]-k|0)/144>>>0){break a}k=k+N(g,144)|0;if(H[k>>2]<0){break b}break a}if(H[a+212>>2]>=0){break a}k=a+212|0}H[k>>2]=b;c:{d:{e:{f:{g:{h:{k=J[o+36>>1];i:{if(((k<<8|k>>>8)&65535)>>>0>=258){if((e|0)>=(j|0)&h>>>0>=i>>>0|(e|0)>(j|0)){break a}e=I[h+p|0];f=f+3|0;c=f>>>0<3?c+1|0:c;H[d+16>>2]=f;H[d+20>>2]=c;if(e>>>0>1){break a}d=e>>>0<2?e:0;if(!m){break i}if(!d){break h}break a}if(m){break g}d=0}if((l|0)<0){e=a+184|0}else{c=H[a+216>>2]+N(g,144)|0;F[c+100|0]=0;e=c+104|0}if((d|0)!=1){break e}c=ca-112|0;ca=c;h=H[H[a+4>>2]+44>>2];d=pa(120);H[d>>2]=12172;H[d+4>>2]=0;H[d+116>>2]=0;H[d+112>>2]=e;H[d+108>>2]=h;H[d+12>>2]=0;H[d+16>>2]=0;H[d+20>>2]=0;H[d+24>>2]=0;H[d+28>>2]=0;H[d+32>>2]=0;H[d+36>>2]=0;H[d+40>>2]=0;H[d+44>>2]=0;H[d+48>>2]=0;H[d+52>>2]=0;H[d+56>>2]=0;H[d+60>>2]=0;H[d+8>>2]=12384;f=d- -64|0;H[f>>2]=0;H[f+4>>2]=0;H[d+72>>2]=0;H[d+76>>2]=0;H[d+80>>2]=0;H[d+84>>2]=0;H[d+88>>2]=0;H[d+104>>2]=0;H[d+96>>2]=0;H[d+100>>2]=0;f=H[a+8>>2];H[c+48>>2]=0;H[c+52>>2]=0;H[c+40>>2]=0;H[c+44>>2]=0;i=c+32|0;H[i>>2]=0;H[i+4>>2]=0;H[c+24>>2]=0;H[c+28>>2]=0;g=c- -64|0;H[g>>2]=0;H[g+4>>2]=0;H[c+72>>2]=0;H[c+76>>2]=0;H[c+80>>2]=0;H[c+84>>2]=0;H[c+88>>2]=0;H[c+104>>2]=0;H[c+16>>2]=0;H[c+20>>2]=0;H[c+56>>2]=0;H[c+60>>2]=0;H[c+8>>2]=12384;H[c+96>>2]=0;H[c+100>>2]=0;H[c+12>>2]=f;g=H[f>>2];j=H[f+4>>2];F[c+111|0]=0;m=i;i=c+111|0;Oa(m,(j-g>>2>>>0)/3|0,i);g=H[c+12>>2];j=H[g+28>>2];g=H[g+24>>2];F[c+111|0]=0;Oa(c+44|0,j-g>>2,i);H[c+28>>2]=d;H[c+24>>2]=h;H[c+20>>2]=e;H[c+16>>2]=f;f=d+8|0;e=c+8|0;fd(f,e);j:{if((e|0)==(f|0)){H[d+92>>2]=H[e+84>>2];break j}Cb(d+56|0,H[e+48>>2],H[e+52>>2]);Cb(d+68|0,H[e+60>>2],H[e- -64>>2]);Cb(d+80|0,H[e+72>>2],H[e+76>>2]);H[d+92>>2]=H[e+84>>2];Aa(d+96|0,H[e+88>>2],H[e+92>>2])}H[c+8>>2]=12384;e=H[c+96>>2];if(e){H[c+100>>2]=e;oa(e)}e=H[c+80>>2];if(e){H[c+84>>2]=e;oa(e)}e=H[c+68>>2];if(e){H[c+72>>2]=e;oa(e)}e=H[c+56>>2];if(e){H[c+60>>2]=e;oa(e)}H[c+8>>2]=12620;e=H[c+44>>2];if(e){oa(e)}e=H[c+32>>2];if(e){oa(e)}ca=c+112|0;break d}if((l|0)>=0){break f}break a}if((l|0)<0){break a}}e=H[a+216>>2];c=H[o+44>>2];d=pa(80);H[d>>2]=12932;H[d+4>>2]=0;H[d+76>>2]=0;H[d+68>>2]=c;H[d+8>>2]=11872;H[d+12>>2]=0;H[d+16>>2]=0;H[d+20>>2]=0;H[d+24>>2]=0;H[d+28>>2]=0;H[d+32>>2]=0;H[d+36>>2]=0;H[d+40>>2]=0;H[d+44>>2]=0;H[d+48>>2]=0;H[d+52>>2]=0;e=e+N(g,144)|0;f=e+104|0;H[d+72>>2]=f;H[d- -64>>2]=0;H[d+56>>2]=0;H[d+60>>2]=0;H[n+24>>2]=c;c=n;H[c+68>>2]=0;H[c+72>>2]=0;H[c+60>>2]=0;H[c+64>>2]=0;H[c+52>>2]=0;H[c+56>>2]=0;H[c+44>>2]=0;H[c+48>>2]=0;H[c+84>>2]=0;H[c+88>>2]=0;H[c+76>>2]=0;H[c+80>>2]=0;H[c+28>>2]=d;h=H[c+28>>2];H[c+8>>2]=H[c+24>>2];H[c+12>>2]=h;H[c+20>>2]=f;f=e+4|0;H[c+16>>2]=f;H[c+36>>2]=0;H[c+40>>2]=0;H[c+32>>2]=11872;e=H[c+20>>2];H[c>>2]=H[c+16>>2];H[c+4>>2]=e;e=c+32|0;Ie(e,f,c);c=d+8|0;fd(c,e);if((c|0)!=(e|0)){Cb(d+56|0,H[e+48>>2],H[e+52>>2])}He(e);break c}c=ca+-64|0;ca=c;h=H[H[a+4>>2]+44>>2];d=pa(80);H[d>>2]=12640;H[d+4>>2]=0;H[d+76>>2]=0;H[d+72>>2]=e;H[d+68>>2]=h;H[d+8>>2]=12804;H[d+12>>2]=0;H[d+16>>2]=0;H[d+20>>2]=0;H[d+24>>2]=0;H[d+28>>2]=0;H[d+32>>2]=0;H[d+36>>2]=0;H[d+40>>2]=0;H[d+44>>2]=0;H[d+48>>2]=0;H[d+52>>2]=0;H[d- -64>>2]=0;i=d+56|0;f=i;H[f>>2]=0;H[f+4>>2]=0;f=H[a+8>>2];H[c+40>>2]=0;H[c+44>>2]=0;H[c+32>>2]=0;H[c+36>>2]=0;g=c+24|0;H[g>>2]=0;H[g+4>>2]=0;H[c+16>>2]=0;H[c+20>>2]=0;H[c+56>>2]=0;H[c+8>>2]=0;H[c+12>>2]=0;H[c+48>>2]=0;H[c+52>>2]=0;H[c>>2]=12804;H[c+4>>2]=f;j=H[f>>2];l=H[f+4>>2];F[c+63|0]=0;m=g;g=c+63|0;Oa(m,(l-j>>2>>>0)/3|0,g);j=H[c+4>>2];l=H[j+28>>2];j=H[j+24>>2];F[c+63|0]=0;Oa(c+36|0,l-j>>2,g);H[c+20>>2]=d;H[c+16>>2]=h;H[c+12>>2]=e;H[c+8>>2]=f;fd(d+8|0,c);Cb(i,H[c+48>>2],H[c+52>>2]);H[c>>2]=12804;e=H[c+48>>2];if(e){H[c+52>>2]=e;oa(e)}H[c>>2]=12620;e=H[c+36>>2];if(e){oa(e)}e=H[c+24>>2];if(e){oa(e)}ca=c- -64|0}if(!d){break a}}d=od(pa(64),d);c=H[a+4>>2];a=d;d=b;k:{l:{if((d|0)>=0){h=c+8|0;b=H[c+12>>2];i=H[c+8>>2];e=b-i>>2;m:{if((e|0)>(d|0)){break m}f=d+1|0;if(d>>>0>=e>>>0){Vb(h,f-e|0);break m}if(e>>>0<=f>>>0){break m}f=i+(f<<2)|0;if((f|0)!=(b|0)){while(1){b=b-4|0;e=H[b>>2];H[b>>2]=0;if(e){ea[H[H[e>>2]+4>>2]](e)}if((b|0)!=(f|0)){continue}break}}H[c+12>>2]=f}c=H[h>>2]+(d<<2)|0;b=H[c>>2];H[c>>2]=a;if(b){break l}break k}b=a;if(!a){break k}}ea[H[H[b>>2]+4>>2]](b)}q=(d^-1)>>>31|0}ca=n+96|0;return q|0}function Kd(a){var b=0,c=0,d=0,e=0,f=0,g=0;e=ca-16|0;ca=e;H[e+12>>2]=a;a:{if(a>>>0<=211){d=H[Jd(14256,14448,e+12|0)>>2];break a}if(a>>>0>=4294967292){X();v()}f=(a>>>0)/210|0;d=N(f,210);H[e+8>>2]=a-d;g=Jd(14448,14640,e+8|0)-14448>>2;while(1){d=H[(g<<2)+14448>>2]+d|0;a=5;while(1){b:{if((a|0)==47){a=211;while(1){b=(d>>>0)/(a>>>0)|0;if(b>>>0<a>>>0){break a}if((N(a,b)|0)==(d|0)){break b}b=a+10|0;c=(d>>>0)/(b>>>0)|0;if(b>>>0>c>>>0){break a}if((N(b,c)|0)==(d|0)){break b}b=a+12|0;c=(d>>>0)/(b>>>0)|0;if(b>>>0>c>>>0){break a}if((N(b,c)|0)==(d|0)){break b}b=a+16|0;c=(d>>>0)/(b>>>0)|0;if(b>>>0>c>>>0){break a}if((N(b,c)|0)==(d|0)){break b}b=a+18|0;c=(d>>>0)/(b>>>0)|0;if(b>>>0>c>>>0){break a}if((N(b,c)|0)==(d|0)){break b}b=a+22|0;c=(d>>>0)/(b>>>0)|0;if(b>>>0>c>>>0){break a}if((N(b,c)|0)==(d|0)){break b}b=a+28|0;c=(d>>>0)/(b>>>0)|0;if(b>>>0>c>>>0){break a}if((N(b,c)|0)==(d|0)){break b}b=a+30|0;c=(d>>>0)/(b>>>0)|0;if(b>>>0>c>>>0){break a}if((N(b,c)|0)==(d|0)){break b}b=a+36|0;c=(d>>>0)/(b>>>0)|0;if(b>>>0>c>>>0){break a}if((N(b,c)|0)==(d|0)){break b}b=a+40|0;c=(d>>>0)/(b>>>0)|0;if(b>>>0>c>>>0){break a}if((N(b,c)|0)==(d|0)){break b}b=a+42|0;c=(d>>>0)/(b>>>0)|0;if(b>>>0>c>>>0){break a}if((N(b,c)|0)==(d|0)){break b}b=a+46|0;c=(d>>>0)/(b>>>0)|0;if(b>>>0>c>>>0){break a}if((N(b,c)|0)==(d|0)){break b}b=a+52|0;c=(d>>>0)/(b>>>0)|0;if(b>>>0>c>>>0){break a}if((N(b,c)|0)==(d|0)){break b}b=a+58|0;c=(d>>>0)/(b>>>0)|0;if(b>>>0>c>>>0){break a}if((N(b,c)|0)==(d|0)){break b}b=a+60|0;c=(d>>>0)/(b>>>0)|0;if(b>>>0>c>>>0){break a}if((N(b,c)|0)==(d|0)){break b}b=a+66|0;c=(d>>>0)/(b>>>0)|0;if(b>>>0>c>>>0){break a}if((N(b,c)|0)==(d|0)){break b}b=a+70|0;c=(d>>>0)/(b>>>0)|0;if(b>>>0>c>>>0){break a}if((N(b,c)|0)==(d|0)){break b}b=a+72|0;c=(d>>>0)/(b>>>0)|0;if(b>>>0>c>>>0){break a}if((N(b,c)|0)==(d|0)){break b}b=a+78|0;c=(d>>>0)/(b>>>0)|0;if(b>>>0>c>>>0){break a}if((N(b,c)|0)==(d|0)){break b}b=a+82|0;c=(d>>>0)/(b>>>0)|0;if(b>>>0>c>>>0){break a}if((N(b,c)|0)==(d|0)){break b}b=a+88|0;c=(d>>>0)/(b>>>0)|0;if(b>>>0>c>>>0){break a}if((N(b,c)|0)==(d|0)){break b}b=a+96|0;c=(d>>>0)/(b>>>0)|0;if(b>>>0>c>>>0){break a}if((N(b,c)|0)==(d|0)){break b}b=a+100|0;c=(d>>>0)/(b>>>0)|0;if(b>>>0>c>>>0){break a}if((N(b,c)|0)==(d|0)){break b}b=a+102|0;c=(d>>>0)/(b>>>0)|0;if(b>>>0>c>>>0){break a}if((N(b,c)|0)==(d|0)){break b}b=a+106|0;c=(d>>>0)/(b>>>0)|0;if(b>>>0>c>>>0){break a}if((N(b,c)|0)==(d|0)){break b}b=a+108|0;c=(d>>>0)/(b>>>0)|0;if(b>>>0>c>>>0){break a}if((N(b,c)|0)==(d|0)){break b}b=a+112|0;c=(d>>>0)/(b>>>0)|0;if(b>>>0>c>>>0){break a}if((N(b,c)|0)==(d|0)){break b}b=a+120|0;c=(d>>>0)/(b>>>0)|0;if(b>>>0>c>>>0){break a}if((N(b,c)|0)==(d|0)){break b}b=a+126|0;c=(d>>>0)/(b>>>0)|0;if(b>>>0>c>>>0){break a}if((N(b,c)|0)==(d|0)){break b}b=a+130|0;c=(d>>>0)/(b>>>0)|0;if(b>>>0>c>>>0){break a}if((N(b,c)|0)==(d|0)){break b}b=a+136|0;c=(d>>>0)/(b>>>0)|0;if(b>>>0>c>>>0){break a}if((N(b,c)|0)==(d|0)){break b}b=a+138|0;c=(d>>>0)/(b>>>0)|0;if(b>>>0>c>>>0){break a}if((N(b,c)|0)==(d|0)){break b}b=a+142|0;c=(d>>>0)/(b>>>0)|0;if(b>>>0>c>>>0){break a}if((N(b,c)|0)==(d|0)){break b}b=a+148|0;c=(d>>>0)/(b>>>0)|0;if(b>>>0>c>>>0){break a}if((N(b,c)|0)==(d|0)){break b}b=a+150|0;c=(d>>>0)/(b>>>0)|0;if(b>>>0>c>>>0){break a}if((N(b,c)|0)==(d|0)){break b}b=a+156|0;c=(d>>>0)/(b>>>0)|0;if(b>>>0>c>>>0){break a}if((N(b,c)|0)==(d|0)){break b}b=a+162|0;c=(d>>>0)/(b>>>0)|0;if(b>>>0>c>>>0){break a}if((N(b,c)|0)==(d|0)){break b}b=a+166|0;c=(d>>>0)/(b>>>0)|0;if(b>>>0>c>>>0){break a}if((N(b,c)|0)==(d|0)){break b}b=a+168|0;c=(d>>>0)/(b>>>0)|0;if(b>>>0>c>>>0){break a}if((N(b,c)|0)==(d|0)){break b}b=a+172|0;c=(d>>>0)/(b>>>0)|0;if(b>>>0>c>>>0){break a}if((N(b,c)|0)==(d|0)){break b}b=a+178|0;c=(d>>>0)/(b>>>0)|0;if(b>>>0>c>>>0){break a}if((N(b,c)|0)==(d|0)){break b}b=a+180|0;c=(d>>>0)/(b>>>0)|0;if(b>>>0>c>>>0){break a}if((N(b,c)|0)==(d|0)){break b}b=a+186|0;c=(d>>>0)/(b>>>0)|0;if(b>>>0>c>>>0){break a}if((N(b,c)|0)==(d|0)){break b}b=a+190|0;c=(d>>>0)/(b>>>0)|0;if(b>>>0>c>>>0){break a}if((N(b,c)|0)==(d|0)){break b}b=a+192|0;c=(d>>>0)/(b>>>0)|0;if(b>>>0>c>>>0){break a}if((N(b,c)|0)==(d|0)){break b}b=a+196|0;c=(d>>>0)/(b>>>0)|0;if(b>>>0>c>>>0){break a}if((N(b,c)|0)==(d|0)){break b}b=a+198|0;c=(d>>>0)/(b>>>0)|0;if(b>>>0>c>>>0){break a}if((N(b,c)|0)==(d|0)){break b}b=a+208|0;c=(d>>>0)/(b>>>0)|0;if(b>>>0>c>>>0){break a}a=a+210|0;if((N(b,c)|0)!=(d|0)){continue}break}break b}b=H[(a<<2)+14256>>2];c=(d>>>0)/(b>>>0)|0;if(b>>>0>c>>>0){break a}a=a+1|0;if((N(b,c)|0)!=(d|0)){continue}}break}d=g+1|0;a=(d|0)==48;g=a?0:d;f=a+f|0;d=N(f,210);continue}}ca=e+16|0;return d}function Ib(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;j=ca-16|0;ca=j;a:{b:{c:{d:{if(I[H[a+4>>2]+36|0]<=1){k=-1;c=H[b+20>>2];d=H[b+16>>2];e=d+4|0;c=e>>>0<4?c+1|0:c;g=H[b+12>>2];if(K[b+8>>2]<e>>>0&(g|0)<=(c|0)|(c|0)>(g|0)){break c}d=d+H[b>>2]|0;l=I[d|0]|I[d+1|0]<<8|(I[d+2|0]<<16|I[d+3|0]<<24);H[j+12>>2]=l;H[b+16>>2]=e;H[b+20>>2]=c;break d}k=-1;if(!Ea(1,j+12|0,b)){break c}l=H[j+12>>2]}e:{f:{g:{h:{i:{if(!l){break i}c=H[a+8>>2];if((H[c+4>>2]-H[c>>2]>>2>>>0)/3>>>0<l>>>0){break c}c=J[H[a+4>>2]+36>>1];if(((c<<8|c>>>8)&65535)>>>0>=258){j:{while(1){if(!Ea(1,j+8|0,b)){break c}c=H[j+8>>2];if(!Ea(1,j+8|0,b)){break c}f=c+f|0;c=H[j+8>>2];if(f>>>0<c>>>0){break c}g=f-c|0;c=H[a+40>>2];k:{if((c|0)!=H[a+44>>2]){H[c+4>>2]=f;H[c>>2]=g;H[a+40>>2]=c+12;l=H[j+12>>2];break k}m=H[a+36>>2];d=c-m|0;o=(d|0)/12|0;e=o+1|0;if(e>>>0>=357913942){break j}c=o<<1;h=o>>>0>=178956970?357913941:c>>>0>e>>>0?c:e;if(h){if(h>>>0>=357913942){break b}i=pa(N(h,12))}else{i=0}e=i+N(o,12)|0;H[e+4>>2]=f;H[e>>2]=g;c=va(e+N((d|0)/-12|0,12)|0,m,d);H[a+44>>2]=i+N(h,12);H[a+40>>2]=e+12;H[a+36>>2]=c;if(!m){break k}oa(m)}p=p+1|0;if(l>>>0>p>>>0){continue}break}k=0;Db(b,0,0);if(l){while(1){e=I[b+36|0];c=J[H[a+4>>2]+36>>1];l:{m:{if(((c<<8|c>>>8)&65535)>>>0<=513){if(!e){break l}p=0;c=H[b+32>>2];n=c>>>3|0;g=H[b+24>>2];e=n+g|0;d=H[b+28>>2];n:{if(e>>>0>=d>>>0){f=c;break n}e=I[e|0];f=c+1|0;H[b+32>>2]=f;n=f>>>3|0;p=e>>>(c&7)&1}if(d>>>0>g+n>>>0){break m}break l}if(!e){break l}p=0;f=H[b+32>>2];c=H[b+24>>2]+(f>>>3|0)|0;if(c>>>0>=K[b+28>>2]){break l}p=I[c|0]>>>(f&7)&1}H[b+32>>2]=f+1}c=H[a+36>>2]+N(k,12)|0;F[c+8|0]=I[c+8|0]&254|p&1;k=k+1|0;if((k|0)!=(l|0)){continue}break}}F[b+36|0]=0;f=H[b+20>>2];e=0;d=H[b+32>>2]+7|0;e=d>>>0<7?1:e;c=e>>>3|0;e=(e&7)<<29|d>>>3;d=e+H[b+16>>2]|0;c=c+f|0;H[b+16>>2]=d;H[b+20>>2]=d>>>0<e>>>0?c+1|0:c;break i}sa();v()}while(1){d=H[b+8>>2];c=H[b+12>>2];g=c;c=H[b+20>>2];e=c;h=H[b+16>>2];f=h+4|0;c=f>>>0<4?c+1|0:c;i=f;if(f>>>0>d>>>0&(c|0)>=(g|0)|(c|0)>(g|0)){break c}m=H[b>>2];f=m+h|0;o=I[f|0]|I[f+1|0]<<8|(I[f+2|0]<<16|I[f+3|0]<<24);H[b+16>>2]=i;H[b+20>>2]=c;c=e;f=h+8|0;c=f>>>0<8?c+1|0:c;if(d>>>0<f>>>0&(c|0)>=(g|0)|(c|0)>(g|0)){break c}i=i+m|0;i=I[i|0]|I[i+1|0]<<8|(I[i+2|0]<<16|I[i+3|0]<<24);H[b+16>>2]=f;H[b+20>>2]=c;if(d>>>0<=f>>>0&(c|0)>=(g|0)|(c|0)>(g|0)){break c}d=I[f+m|0];c=h+9|0;e=c>>>0<9?e+1|0:e;H[b+16>>2]=c;H[b+20>>2]=e;f=d&1;c=H[a+40>>2];o:{if((c|0)!=H[a+44>>2]){F[c+8|0]=f;H[c+4>>2]=i;H[c>>2]=o;H[a+40>>2]=c+12;l=H[j+12>>2];break o}m=H[a+36>>2];d=c-m|0;h=(d|0)/12|0;e=h+1|0;if(e>>>0>=357913942){break h}c=h<<1;g=h>>>0>=178956970?357913941:c>>>0>e>>>0?c:e;if(g){if(g>>>0>=357913942){break b}e=pa(N(g,12))}else{e=0}h=e+N(h,12)|0;F[h+8|0]=f;H[h+4>>2]=i;H[h>>2]=o;c=va(h+N((d|0)/-12|0,12)|0,m,d);H[a+44>>2]=e+N(g,12);H[a+40>>2]=h+12;H[a+36>>2]=c;if(!m){break o}oa(m)}n=n+1|0;if(l>>>0>n>>>0){continue}break}}H[j+8>>2]=0;c=J[H[a+4>>2]+36>>1];c=(c<<8|c>>>8)&65535;p:{if(c>>>0<=511){k=-1;c=H[b+20>>2];d=H[b+16>>2];e=d+4|0;c=e>>>0<4?c+1|0:c;f=H[b+12>>2];if(K[b+8>>2]<e>>>0&(f|0)<=(c|0)|(c|0)>(f|0)){break c}d=d+H[b>>2]|0;f=I[d|0]|I[d+1|0]<<8|(I[d+2|0]<<16|I[d+3|0]<<24);H[b+16>>2]=e;H[b+20>>2]=c;break p}if((c|0)!=512){break e}k=-1;if(!Ea(1,j+8|0,b)){break c}f=H[j+8>>2]}if(!f){break e}c=J[H[a+4>>2]+36>>1];if(((c<<8|c>>>8)&65535)>>>0<258){break f}n=0;l=0;while(1){if(!Ea(1,j+4|0,b)){break c}l=H[j+4>>2]+l|0;c=H[a+52>>2];q:{if((c|0)!=H[a+56>>2]){H[c>>2]=l;H[a+52>>2]=c+4;break q}i=H[a+48>>2];g=c-i|0;e=g>>2;d=e+1|0;if(d>>>0>=1073741824){break g}c=g>>>1|0;d=g>>>0>=2147483644?1073741823:c>>>0>d>>>0?c:d;if(d){if(d>>>0>=1073741824){break b}c=pa(d<<2)}else{c=0}e=c+(e<<2)|0;H[e>>2]=l;c=va(c,i,g);H[a+56>>2]=c+(d<<2);H[a+52>>2]=e+4;H[a+48>>2]=c;if(!i){break q}oa(i)}n=n+1|0;if((n|0)!=(f|0)){continue}break}break e}sa();v()}sa();v()}k=0;while(1){c=H[b+20>>2];d=H[b+16>>2];e=d+4|0;c=e>>>0<4?c+1|0:c;g=H[b+12>>2];if(K[b+8>>2]<e>>>0&(g|0)<=(c|0)|(c|0)>(g|0)){k=-1;break c}d=d+H[b>>2]|0;g=I[d|0]|I[d+1|0]<<8|(I[d+2|0]<<16|I[d+3|0]<<24);H[b+16>>2]=e;H[b+20>>2]=c;c=H[a+52>>2];r:{if((c|0)!=H[a+56>>2]){H[c>>2]=g;H[a+52>>2]=c+4;break r}h=H[a+48>>2];i=c-h|0;e=i>>2;d=e+1|0;if(d>>>0>=1073741824){break a}c=i>>>1|0;d=i>>>0>=2147483644?1073741823:c>>>0>d>>>0?c:d;if(d){if(d>>>0>=1073741824){break b}c=pa(d<<2)}else{c=0}e=c+(e<<2)|0;H[e>>2]=g;c=va(c,h,i);H[a+56>>2]=c+(d<<2);H[a+52>>2]=e+4;H[a+48>>2]=c;if(!h){break r}oa(h)}k=k+1|0;if((k|0)!=(f|0)){continue}break}}k=H[b+16>>2]}ca=j+16|0;return k}wa();v()}sa();v()}function Va(a,b,c,d){var e=0,f=0,g=0,h=0,i=0,j=O(0),k=0,l=0;a:{if(!d){break a}b:{c:{switch(H[a+28>>2]-1|0){case 0:e=I[a+24|0];f=c&255;if(e>>>0<f>>>0?e:f){e=H[a>>2];g=H[e>>2];i=H[a+48>>2];b=Rj(H[a+40>>2],H[a+44>>2],b,0);k=b;b=b+i|0;b=b+g|0;g=H[e+4>>2];i=I[a+32|0];while(1){if(b>>>0>=g>>>0){break a}j=O(F[b|0]);L[(h<<2)+d>>2]=i?O(j/O(127)):j;b=b+1|0;h=h+1|0;e=I[a+24|0];if(h>>>0<(e>>>0<f>>>0?e:f)>>>0){continue}break}}l=1;if(e>>>0>=f>>>0){break a}d=(e<<2)+d|0;a=(c&255)-e|0;break b;case 1:e=I[a+24|0];f=c&255;if(e>>>0<f>>>0?e:f){e=H[a>>2];g=H[e>>2];i=H[a+48>>2];b=Rj(H[a+40>>2],H[a+44>>2],b,0);k=b;b=b+i|0;b=b+g|0;g=H[e+4>>2];i=I[a+32|0];while(1){if(b>>>0>=g>>>0){break a}j=O(I[b|0]);L[(h<<2)+d>>2]=i?O(j/O(255)):j;b=b+1|0;h=h+1|0;e=I[a+24|0];if(h>>>0<(e>>>0<f>>>0?e:f)>>>0){continue}break}}l=1;if(e>>>0>=f>>>0){break a}d=(e<<2)+d|0;a=(c&255)-e|0;break b;case 2:e=I[a+24|0];f=c&255;if(e>>>0<f>>>0?e:f){e=H[a>>2];g=H[e>>2];i=H[a+48>>2];b=Rj(H[a+40>>2],H[a+44>>2],b,0);k=b;b=b+i|0;b=b+g|0;g=H[e+4>>2];i=I[a+32|0];while(1){if(b>>>0>=g>>>0){break a}j=O(G[b>>1]);L[(h<<2)+d>>2]=i?O(j/O(32767)):j;b=b+2|0;h=h+1|0;e=I[a+24|0];if(h>>>0<(e>>>0<f>>>0?e:f)>>>0){continue}break}}l=1;if(e>>>0>=f>>>0){break a}d=(e<<2)+d|0;a=(c&255)-e|0;break b;case 3:e=I[a+24|0];f=c&255;if(e>>>0<f>>>0?e:f){e=H[a>>2];g=H[e>>2];i=H[a+48>>2];b=Rj(H[a+40>>2],H[a+44>>2],b,0);k=b;b=b+i|0;b=b+g|0;g=H[e+4>>2];i=I[a+32|0];while(1){if(b>>>0>=g>>>0){break a}j=O(J[b>>1]);L[(h<<2)+d>>2]=i?O(j/O(65535)):j;b=b+2|0;h=h+1|0;e=I[a+24|0];if(h>>>0<(e>>>0<f>>>0?e:f)>>>0){continue}break}}l=1;if(e>>>0>=f>>>0){break a}d=(e<<2)+d|0;a=(c&255)-e|0;break b;case 4:e=I[a+24|0];f=c&255;if(e>>>0<f>>>0?e:f){e=H[a>>2];g=H[e>>2];i=H[a+48>>2];b=Rj(H[a+40>>2],H[a+44>>2],b,0);k=b;b=b+i|0;b=b+g|0;g=H[e+4>>2];i=I[a+32|0];while(1){if(b>>>0>=g>>>0){break a}j=O(H[b>>2]);L[(h<<2)+d>>2]=i?O(j*O(4.656612873077393e-10)):j;b=b+4|0;h=h+1|0;e=I[a+24|0];if(h>>>0<(e>>>0<f>>>0?e:f)>>>0){continue}break}}l=1;if(e>>>0>=f>>>0){break a}d=(e<<2)+d|0;a=(c&255)-e|0;break b;case 5:e=I[a+24|0];f=c&255;if(e>>>0<f>>>0?e:f){e=H[a>>2];g=H[e>>2];i=H[a+48>>2];b=Rj(H[a+40>>2],H[a+44>>2],b,0);k=b;b=b+i|0;b=b+g|0;g=H[e+4>>2];i=I[a+32|0];while(1){if(b>>>0>=g>>>0){break a}j=O(K[b>>2]);L[(h<<2)+d>>2]=i?O(j*O(2.3283064365386963e-10)):j;b=b+4|0;h=h+1|0;e=I[a+24|0];if(h>>>0<(e>>>0<f>>>0?e:f)>>>0){continue}break}}l=1;if(e>>>0>=f>>>0){break a}d=(e<<2)+d|0;a=(c&255)-e|0;break b;case 6:e=I[a+24|0];f=c&255;if(e>>>0<f>>>0?e:f){e=H[a>>2];g=H[e>>2];i=H[a+48>>2];b=Rj(H[a+40>>2],H[a+44>>2],b,0);k=b;b=b+i|0;b=b+g|0;g=H[e+4>>2];i=I[a+32|0];while(1){if(b>>>0>=g>>>0){break a}j=O(+K[b>>2]+ +H[b+4>>2]*4294967296);L[(h<<2)+d>>2]=i?O(j*O(10842021724855044e-35)):j;b=b+8|0;h=h+1|0;e=I[a+24|0];if(h>>>0<(e>>>0<f>>>0?e:f)>>>0){continue}break}}l=1;if(e>>>0>=f>>>0){break a}d=(e<<2)+d|0;a=(c&255)-e|0;break b;case 7:e=I[a+24|0];f=c&255;if(e>>>0<f>>>0?e:f){e=H[a>>2];g=H[e>>2];i=H[a+48>>2];b=Rj(H[a+40>>2],H[a+44>>2],b,0);k=b;b=b+i|0;b=b+g|0;g=H[e+4>>2];i=I[a+32|0];while(1){if(b>>>0>=g>>>0){break a}j=O(+K[b>>2]+ +K[b+4>>2]*4294967296);L[(h<<2)+d>>2]=i?O(j*O(5.421010862427522e-20)):j;b=b+8|0;h=h+1|0;e=I[a+24|0];if(h>>>0<(e>>>0<f>>>0?e:f)>>>0){continue}break}}l=1;if(e>>>0>=f>>>0){break a}d=(e<<2)+d|0;a=(c&255)-e|0;break b;case 8:e=I[a+24|0];f=c&255;if(e>>>0<f>>>0?e:f){e=H[a>>2];g=H[e>>2];i=H[a+48>>2];b=Rj(H[a+40>>2],H[a+44>>2],b,0);k=b;b=b+i|0;b=b+g|0;g=H[e+4>>2];while(1){if(b>>>0>=g>>>0){break a}L[(h<<2)+d>>2]=L[b>>2];b=b+4|0;h=h+1|0;e=I[a+24|0];if(h>>>0<(e>>>0<f>>>0?e:f)>>>0){continue}break}}l=1;if(e>>>0>=f>>>0){break a}d=(e<<2)+d|0;a=(c&255)-e|0;break b;case 9:e=I[a+24|0];f=c&255;if(e>>>0<f>>>0?e:f){e=H[a>>2];g=H[e>>2];i=H[a+48>>2];b=Rj(H[a+40>>2],H[a+44>>2],b,0);k=b;b=b+i|0;b=b+g|0;g=H[e+4>>2];while(1){if(b>>>0>=g>>>0){break a}L[(h<<2)+d>>2]=M[b>>3];b=b+8|0;h=h+1|0;e=I[a+24|0];if(h>>>0<(e>>>0<f>>>0?e:f)>>>0){continue}break}}l=1;if(e>>>0>=f>>>0){break a}d=(e<<2)+d|0;a=(c&255)-e|0;break b;case 10:break c;default:break a}}e=I[a+24|0];f=c&255;if(e>>>0<f>>>0?e:f){e=H[a>>2];g=H[e>>2];i=H[a+48>>2];b=Rj(H[a+40>>2],H[a+44>>2],b,0);k=b;b=b+i|0;b=b+g|0;g=H[e+4>>2];while(1){if(b>>>0>=g>>>0){break a}L[(h<<2)+d>>2]=I[b|0]?O(1):O(0);b=b+1|0;h=h+1|0;e=I[a+24|0];if(h>>>0<(e>>>0<f>>>0?e:f)>>>0){continue}break}}l=1;if(e>>>0>=f>>>0){break a}d=(e<<2)+d|0;a=(c&255)-e|0}ra(d,0,a<<2)}return l}function ic(a,b,c,d){var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=O(0),m=O(0);a:{b:{if(!d){break b}c:{switch(H[a+28>>2]-1|0){case 0:e=I[a+24|0];f=c&255;if(e>>>0<f>>>0?e:f){e=H[H[a>>2]>>2];i=H[a+48>>2];b=Rj(H[a+40>>2],H[a+44>>2],b,0);h=b;b=b+i|0;b=b+e|0;while(1){if(K[H[a>>2]+4>>2]<=b>>>0){break b}F[d+g|0]=I[b|0];b=b+1|0;g=g+1|0;e=I[a+24|0];if(g>>>0<(e>>>0<f>>>0?e:f)>>>0){continue}break}}k=1;if(e>>>0>=f>>>0){break b}break a;case 1:e=I[a+24|0];f=c&255;if(e>>>0<f>>>0?e:f){e=H[H[a>>2]>>2];i=H[a+48>>2];b=Rj(H[a+40>>2],H[a+44>>2],b,0);h=b;b=b+i|0;b=b+e|0;while(1){if(K[H[a>>2]+4>>2]<=b>>>0){return 0}e=F[b|0];if((e|0)<0){break b}F[d+g|0]=e;b=b+1|0;g=g+1|0;e=I[a+24|0];if(g>>>0<(e>>>0<f>>>0?e:f)>>>0){continue}break}}k=1;if(e>>>0>=f>>>0){break b}break a;case 2:e=I[a+24|0];f=c&255;if(e>>>0<f>>>0?e:f){e=H[H[a>>2]>>2];i=H[a+48>>2];b=Rj(H[a+40>>2],H[a+44>>2],b,0);h=b;b=b+i|0;b=b+e|0;while(1){if(K[H[a>>2]+4>>2]<=b>>>0){break b}e=J[b>>1];if((e+128&65535)>>>0>255){break b}F[d+g|0]=e;b=b+2|0;g=g+1|0;e=I[a+24|0];if(g>>>0<(e>>>0<f>>>0?e:f)>>>0){continue}break}}k=1;if(e>>>0>=f>>>0){break b}break a;case 3:e=I[a+24|0];f=c&255;if(e>>>0<f>>>0?e:f){e=H[H[a>>2]>>2];i=H[a+48>>2];b=Rj(H[a+40>>2],H[a+44>>2],b,0);h=b;b=b+i|0;b=b+e|0;while(1){if(K[H[a>>2]+4>>2]<=b>>>0){break b}e=J[b>>1];if(e>>>0>127){break b}F[d+g|0]=e;b=b+2|0;g=g+1|0;e=I[a+24|0];if(g>>>0<(e>>>0<f>>>0?e:f)>>>0){continue}break}}k=1;if(e>>>0>=f>>>0){break b}break a;case 4:e=I[a+24|0];f=c&255;if(e>>>0<f>>>0?e:f){e=H[H[a>>2]>>2];i=H[a+48>>2];b=Rj(H[a+40>>2],H[a+44>>2],b,0);h=b;b=b+i|0;b=b+e|0;while(1){if(K[H[a>>2]+4>>2]<=b>>>0){break b}e=H[b>>2];if(e+128>>>0>255){break b}F[d+g|0]=e;b=b+4|0;g=g+1|0;e=I[a+24|0];if(g>>>0<(e>>>0<f>>>0?e:f)>>>0){continue}break}}k=1;if(e>>>0>=f>>>0){break b}break a;case 5:e=I[a+24|0];f=c&255;if(e>>>0<f>>>0?e:f){e=H[H[a>>2]>>2];i=H[a+48>>2];b=Rj(H[a+40>>2],H[a+44>>2],b,0);h=b;b=b+i|0;b=b+e|0;while(1){if(K[H[a>>2]+4>>2]<=b>>>0){break b}e=H[b>>2];if(e>>>0>127){break b}F[d+g|0]=e;b=b+4|0;g=g+1|0;e=I[a+24|0];if(g>>>0<(e>>>0<f>>>0?e:f)>>>0){continue}break}}k=1;if(e>>>0>=f>>>0){break b}break a;case 6:e=I[a+24|0];f=c&255;if(e>>>0<f>>>0?e:f){e=H[H[a>>2]>>2];i=H[a+48>>2];b=Rj(H[a+40>>2],H[a+44>>2],b,0);h=b;b=b+i|0;b=b+e|0;while(1){if(K[H[a>>2]+4>>2]<=b>>>0){break b}i=H[b+4>>2];e=H[b>>2];h=e+128|0;i=h>>>0<128?i+1|0:i;if(!i&h>>>0>255|i){break b}F[d+g|0]=e;b=b+8|0;g=g+1|0;e=I[a+24|0];if(g>>>0<(e>>>0<f>>>0?e:f)>>>0){continue}break}}k=1;if(e>>>0>=f>>>0){break b}break a;case 7:e=I[a+24|0];f=c&255;if(e>>>0<f>>>0?e:f){e=H[H[a>>2]>>2];i=H[a+48>>2];b=Rj(H[a+40>>2],H[a+44>>2],b,0);h=b;b=b+i|0;b=b+e|0;while(1){if(K[H[a>>2]+4>>2]<=b>>>0){break b}i=H[b+4>>2];e=H[b>>2];if(!i&e>>>0>127|i){break b}F[d+g|0]=e;b=b+8|0;g=g+1|0;e=I[a+24|0];if(g>>>0<(e>>>0<f>>>0?e:f)>>>0){continue}break}}k=1;if(e>>>0>=f>>>0){break b}break a;case 8:e=I[a+24|0];c=c&255;d:{if(c>>>0>e>>>0?e:c){e=H[H[a>>2]>>2];f=H[a+48>>2];b=Rj(H[a+40>>2],H[a+44>>2],b,0);h=b;b=b+f|0;b=b+e|0;while(1){if(K[H[a>>2]+4>>2]<=b>>>0){break d}l=L[b>>2];if(l>=O(127)|l<O(-128)|l!=l){break d}m=O(P(l));if(m==O(Infinity)){break d}e=d+g|0;e:{f:{if(I[a+32|0]){if(l<O(0)|l>O(1)){break d}j=T(+l*127+.5);if(!(P(j)<2147483648)){break f}h=~~j;break e}if(!(m<O(2147483648))){break f}h=~~l;break e}h=-2147483648}F[e|0]=h;b=b+4|0;g=g+1|0;e=I[a+24|0];if(g>>>0<(c>>>0>e>>>0?e:c)>>>0){continue}break}}k=1;if(c>>>0<=e>>>0){break d}ra(d+e|0,0,c-e|0)}return k;case 9:e=I[a+24|0];f=c&255;if(e>>>0<f>>>0?e:f){e=H[H[a>>2]>>2];i=H[a+48>>2];b=Rj(H[a+40>>2],H[a+44>>2],b,0);h=b;b=b+i|0;b=b+e|0;while(1){if(K[H[a>>2]+4>>2]<=b>>>0){break b}j=M[b>>3];if(j>=127|j<-128|(P(j)==Infinity|j!=j)){break b}e=d+g|0;if(I[a+32|0]){if(j<0|j>1){break b}j=T(j*127+.5)}g:{if(P(j)<2147483648){h=~~j;break g}h=-2147483648}F[e|0]=h;b=b+8|0;g=g+1|0;e=I[a+24|0];if(g>>>0<(e>>>0<f>>>0?e:f)>>>0){continue}break}}k=1;if(e>>>0>=f>>>0){break b}break a;case 10:break c;default:break b}}e=I[a+24|0];f=c&255;if(e>>>0<f>>>0?e:f){e=H[H[a>>2]>>2];i=H[a+48>>2];b=Rj(H[a+40>>2],H[a+44>>2],b,0);h=b;b=b+i|0;b=b+e|0;while(1){if(K[H[a>>2]+4>>2]<=b>>>0){break b}F[d+g|0]=I[b|0];b=b+1|0;g=g+1|0;e=I[a+24|0];if(g>>>0<(e>>>0<f>>>0?e:f)>>>0){continue}break}}k=1;if(e>>>0>=f>>>0){break b}ra(d+e|0,0,(c&255)-e|0)}return k}ra(d+e|0,0,(c&255)-e|0);return 1}function hc(a,b,c,d){var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=O(0);a:{b:{if(!d){break b}c:{switch(H[a+28>>2]-1|0){case 0:e=I[a+24|0];f=c&255;if(e>>>0<f>>>0?e:f){e=H[H[a>>2]>>2];i=H[a+48>>2];b=Rj(H[a+40>>2],H[a+44>>2],b,0);h=b;b=b+i|0;b=b+e|0;while(1){if(K[H[a>>2]+4>>2]<=b>>>0){return 0}e=F[b|0];if((e|0)<0){break b}F[d+g|0]=e;b=b+1|0;g=g+1|0;e=I[a+24|0];if(g>>>0<(e>>>0<f>>>0?e:f)>>>0){continue}break}}k=1;if(e>>>0>=f>>>0){break b}break a;case 1:e=I[a+24|0];f=c&255;if(e>>>0<f>>>0?e:f){e=H[H[a>>2]>>2];i=H[a+48>>2];b=Rj(H[a+40>>2],H[a+44>>2],b,0);h=b;b=b+i|0;b=b+e|0;while(1){if(K[H[a>>2]+4>>2]<=b>>>0){break b}F[d+g|0]=I[b|0];b=b+1|0;g=g+1|0;e=I[a+24|0];if(g>>>0<(e>>>0<f>>>0?e:f)>>>0){continue}break}}k=1;if(e>>>0>=f>>>0){break b}break a;case 2:e=I[a+24|0];f=c&255;if(e>>>0<f>>>0?e:f){e=H[H[a>>2]>>2];i=H[a+48>>2];b=Rj(H[a+40>>2],H[a+44>>2],b,0);h=b;b=b+i|0;b=b+e|0;while(1){if(K[H[a>>2]+4>>2]<=b>>>0){break b}e=J[b>>1];if(e>>>0>255){break b}F[d+g|0]=e;b=b+2|0;g=g+1|0;e=I[a+24|0];if(g>>>0<(e>>>0<f>>>0?e:f)>>>0){continue}break}}k=1;if(e>>>0>=f>>>0){break b}break a;case 3:e=I[a+24|0];f=c&255;if(e>>>0<f>>>0?e:f){e=H[H[a>>2]>>2];i=H[a+48>>2];b=Rj(H[a+40>>2],H[a+44>>2],b,0);h=b;b=b+i|0;b=b+e|0;while(1){if(K[H[a>>2]+4>>2]<=b>>>0){break b}e=J[b>>1];if(e>>>0>255){break b}F[d+g|0]=e;b=b+2|0;g=g+1|0;e=I[a+24|0];if(g>>>0<(e>>>0<f>>>0?e:f)>>>0){continue}break}}k=1;if(e>>>0>=f>>>0){break b}break a;case 4:e=I[a+24|0];f=c&255;if(e>>>0<f>>>0?e:f){e=H[H[a>>2]>>2];i=H[a+48>>2];b=Rj(H[a+40>>2],H[a+44>>2],b,0);h=b;b=b+i|0;b=b+e|0;while(1){if(K[H[a>>2]+4>>2]<=b>>>0){break b}e=H[b>>2];if(e>>>0>255){break b}F[d+g|0]=e;b=b+4|0;g=g+1|0;e=I[a+24|0];if(g>>>0<(e>>>0<f>>>0?e:f)>>>0){continue}break}}k=1;if(e>>>0>=f>>>0){break b}break a;case 5:e=I[a+24|0];f=c&255;if(e>>>0<f>>>0?e:f){e=H[H[a>>2]>>2];i=H[a+48>>2];b=Rj(H[a+40>>2],H[a+44>>2],b,0);h=b;b=b+i|0;b=b+e|0;while(1){if(K[H[a>>2]+4>>2]<=b>>>0){break b}e=H[b>>2];if(e>>>0>255){break b}F[d+g|0]=e;b=b+4|0;g=g+1|0;e=I[a+24|0];if(g>>>0<(e>>>0<f>>>0?e:f)>>>0){continue}break}}k=1;if(e>>>0>=f>>>0){break b}break a;case 6:e=I[a+24|0];f=c&255;if(e>>>0<f>>>0?e:f){e=H[H[a>>2]>>2];i=H[a+48>>2];b=Rj(H[a+40>>2],H[a+44>>2],b,0);h=b;b=b+i|0;b=b+e|0;while(1){if(K[H[a>>2]+4>>2]<=b>>>0){break b}i=H[b+4>>2];e=H[b>>2];if(!i&e>>>0>255|i){break b}F[d+g|0]=e;b=b+8|0;g=g+1|0;e=I[a+24|0];if(g>>>0<(e>>>0<f>>>0?e:f)>>>0){continue}break}}k=1;if(e>>>0>=f>>>0){break b}break a;case 7:e=I[a+24|0];f=c&255;if(e>>>0<f>>>0?e:f){e=H[H[a>>2]>>2];i=H[a+48>>2];b=Rj(H[a+40>>2],H[a+44>>2],b,0);h=b;b=b+i|0;b=b+e|0;while(1){if(K[H[a>>2]+4>>2]<=b>>>0){break b}i=H[b+4>>2];e=H[b>>2];if(!i&e>>>0>255|i){break b}F[d+g|0]=e;b=b+8|0;g=g+1|0;e=I[a+24|0];if(g>>>0<(e>>>0<f>>>0?e:f)>>>0){continue}break}}k=1;if(e>>>0>=f>>>0){break b}break a;case 8:e=I[a+24|0];c=c&255;d:{if(c>>>0>e>>>0?e:c){e=H[H[a>>2]>>2];f=H[a+48>>2];b=Rj(H[a+40>>2],H[a+44>>2],b,0);h=b;b=b+f|0;b=b+e|0;while(1){if(K[H[a>>2]+4>>2]<=b>>>0){break d}l=L[b>>2];if(l>=O(255)|l<O(0)|(O(P(l))==O(Infinity)|l!=l)){break d}e=d+g|0;e:{f:{if(I[a+32|0]){if(l>O(1)){break d}j=T(+l*255+.5);if(!(j<4294967296&j>=0)){break f}h=~~j>>>0;break e}if(!(l<O(4294967296)&l>=O(0))){break f}h=~~l>>>0;break e}h=0}F[e|0]=h;b=b+4|0;g=g+1|0;e=I[a+24|0];if(g>>>0<(c>>>0>e>>>0?e:c)>>>0){continue}break}}k=1;if(c>>>0<=e>>>0){break d}ra(d+e|0,0,c-e|0)}return k;case 9:e=I[a+24|0];f=c&255;if(e>>>0<f>>>0?e:f){e=H[H[a>>2]>>2];i=H[a+48>>2];b=Rj(H[a+40>>2],H[a+44>>2],b,0);h=b;b=b+i|0;b=b+e|0;while(1){if(K[H[a>>2]+4>>2]<=b>>>0){break b}j=M[b>>3];if(j>=255|j<0|(P(j)==Infinity|j!=j)){break b}e=d+g|0;if(I[a+32|0]){if(j>1){break b}j=T(j*255+.5)}g:{if(j<4294967296&j>=0){h=~~j>>>0;break g}h=0}F[e|0]=h;b=b+8|0;g=g+1|0;e=I[a+24|0];if(g>>>0<(e>>>0<f>>>0?e:f)>>>0){continue}break}}k=1;if(e>>>0>=f>>>0){break b}break a;case 10:break c;default:break b}}e=I[a+24|0];f=c&255;if(e>>>0<f>>>0?e:f){e=H[H[a>>2]>>2];i=H[a+48>>2];b=Rj(H[a+40>>2],H[a+44>>2],b,0);h=b;b=b+i|0;b=b+e|0;while(1){if(K[H[a>>2]+4>>2]<=b>>>0){break b}F[d+g|0]=I[b|0];b=b+1|0;g=g+1|0;e=I[a+24|0];if(g>>>0<(e>>>0<f>>>0?e:f)>>>0){continue}break}}k=1;if(e>>>0>=f>>>0){break b}ra(d+e|0,0,(c&255)-e|0)}return k}ra(d+e|0,0,(c&255)-e|0);return 1}function Hh(a){a=a|0;var b=0,c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;g=ca-32|0;ca=g;i=H[a+32>>2];b=J[a+36>>1];a:{b:{if(((b<<8|b>>>8)&65535)>>>0<=513){b=H[i+8>>2];d=H[i+12>>2];c=b;b=H[i+20>>2];e=b;j=H[i+16>>2];f=j+4|0;b=f>>>0<4?b+1|0:b;if(c>>>0<f>>>0&(b|0)>=(d|0)|(b|0)>(d|0)){break a}n=H[i>>2];k=n+j|0;k=I[k|0]|I[k+1|0]<<8|(I[k+2|0]<<16|I[k+3|0]<<24);H[i+16>>2]=f;H[i+20>>2]=b;h=c;c=d;b=e;d=j+8|0;b=d>>>0<8?b+1|0:b;if(d>>>0>h>>>0&(b|0)>=(c|0)|(b|0)>(c|0)){break a}c=f+n|0;n=I[c|0]|I[c+1|0]<<8|(I[c+2|0]<<16|I[c+3|0]<<24);H[i+16>>2]=d;H[i+20>>2]=b;break b}if(!Fb(1,g+28|0,i)){break a}if(!Fb(1,g+24|0,H[a+32>>2])){break a}k=H[g+28>>2];n=H[g+24>>2]}if(k>>>0>1431655765){break a}d=H[a+32>>2];b=d;j=H[b+8>>2];c=H[b+16>>2];f=H[b+12>>2];b=H[b+20>>2];e=Sj(j-c|0,f-(b+(c>>>0>j>>>0)|0)|0,3,0);if(!da&e>>>0<k>>>0){break a}e=Rj(k,0,3,0);if(!da&e>>>0<n>>>0|((b|0)>=(f|0)&c>>>0>=j>>>0|(b|0)>(f|0))){break a}j=I[c+H[d>>2]|0];c=c+1|0;b=c?b:b+1|0;H[d+16>>2]=c;H[d+20>>2]=b;c:{d:{if(!j){d=0;c=ca-32|0;ca=c;H[c+24>>2]=0;H[c+16>>2]=0;H[c+20>>2]=0;e:{f:{b=N(k,3);if(b){if(b>>>0>=1073741824){break f}j=N(k,12);d=pa(j);ra(d,0,j)}b=kd(b,1,H[a+32>>2],d);g:{h:{if(!(!k|!b)){j=0;while(1){i:{b=(j<<2)+d|0;f=H[b>>2];e=f>>>1|0;f=(f&1?0-e|0:e)+l|0;if((f|0)<0){break i}H[c>>2]=f;e=H[b+4>>2];h=e>>>1|0;f=f+(e&1?0-h|0:h)|0;if((f|0)<0){break i}H[c+4>>2]=f;b=H[b+8>>2];e=b>>>1|0;l=f+(b&1?0-e|0:e)|0;if((l|0)<0){break i}H[c+8>>2]=l;Rb(H[a+44>>2]+96|0,c);j=j+3|0;b=1;o=o+1|0;if((o|0)!=(k|0)){continue}break h}break}b=0;break h}if(!d){break g}}oa(d)}ca=c+32|0;break e}sa();v()}if(b){break d}break a}if(n>>>0<=255){if(!k){break d}while(1){j:{H[g+16>>2]=0;H[g+8>>2]=0;H[g+12>>2]=0;d=H[a+32>>2];b=d;j=H[b+16>>2];e=H[b+8>>2];c=H[b+20>>2];h=H[b+12>>2];b=h;if(e>>>0<=j>>>0&(c|0)>=(b|0)|(b|0)<(c|0)){break j}i=H[d>>2];l=I[i+j|0];b=c;f=j+1|0;b=f?b:b+1|0;H[d+16>>2]=f;H[d+20>>2]=b;H[g+8>>2]=l;l=e>>>0<j>>>0&(c|0)>=(h|0)|(c|0)>(h|0);e=l?j:e;h=l?c:h;if((e|0)==(f|0)&(h|0)==(b|0)){break j}l=I[f+i|0];b=c;f=j+2|0;b=f>>>0<2?b+1|0:b;H[d+16>>2]=f;H[d+20>>2]=b;H[g+12>>2]=l;if((e|0)==(f|0)&(b|0)==(h|0)){break j}f=I[f+i|0];b=c;c=j+3|0;b=c>>>0<3?b+1|0:b;H[d+16>>2]=c;H[d+20>>2]=b;H[g+16>>2]=f;Rb(H[a+44>>2]+96|0,g+8|0);m=m+1|0;if((m|0)!=(k|0)){continue}break d}break}m=0;break a}if(n>>>0<=65535){if(!k){break d}while(1){k:{H[g+16>>2]=0;H[g+8>>2]=0;H[g+12>>2]=0;i=H[a+32>>2];b=i;c=H[b+8>>2];d=H[b+12>>2];f=H[b+16>>2];b=H[b+20>>2];j=b;e=f+2|0;b=e>>>0<2?b+1|0:b;if(c>>>0<e>>>0&(b|0)>=(d|0)|(b|0)>(d|0)){break k}l=H[i>>2];h=l+f|0;h=I[h|0]|I[h+1|0]<<8;H[i+16>>2]=e;H[i+20>>2]=b;H[g+8>>2]=h;b=j;h=f+4|0;b=h>>>0<4?b+1|0:b;if(c>>>0<h>>>0&(b|0)>=(d|0)|(b|0)>(d|0)){break k}e=e+l|0;e=I[e|0]|I[e+1|0]<<8;H[i+16>>2]=h;H[i+20>>2]=b;H[g+12>>2]=e;e=c;b=j;c=f+6|0;b=c>>>0<6?b+1|0:b;if(c>>>0>e>>>0&(b|0)>=(d|0)|(b|0)>(d|0)){break k}d=h+l|0;d=I[d|0]|I[d+1|0]<<8;H[i+16>>2]=c;H[i+20>>2]=b;H[g+16>>2]=d;Rb(H[a+44>>2]+96|0,g+8|0);m=m+1|0;if((m|0)!=(k|0)){continue}break d}break}m=0;break a}l:{if(n>>>0>2097151){break l}b=J[a+36>>1];if(((b<<8|b>>>8)&65535)>>>0<514){break l}if(!k){break d}while(1){m:{H[g+16>>2]=0;H[g+8>>2]=0;H[g+12>>2]=0;if(!Fb(1,g+4|0,H[a+32>>2])){break m}H[g+8>>2]=H[g+4>>2];if(!Fb(1,g+4|0,H[a+32>>2])){break m}H[g+12>>2]=H[g+4>>2];if(!Fb(1,g+4|0,H[a+32>>2])){break m}H[g+16>>2]=H[g+4>>2];Rb(H[a+44>>2]+96|0,g+8|0);m=m+1|0;if((m|0)!=(k|0)){continue}break d}break}m=0;break a}if(!k){break d}while(1){H[g+16>>2]=0;H[g+8>>2]=0;H[g+12>>2]=0;i=H[a+32>>2];b=i;c=H[b+8>>2];d=H[b+12>>2];f=H[b+16>>2];b=H[b+20>>2];j=b;e=f+4|0;b=e>>>0<4?b+1|0:b;if(c>>>0<e>>>0&(b|0)>=(d|0)|(b|0)>(d|0)){break c}l=H[i>>2];h=l+f|0;h=I[h|0]|I[h+1|0]<<8|(I[h+2|0]<<16|I[h+3|0]<<24);H[i+16>>2]=e;H[i+20>>2]=b;H[g+8>>2]=h;b=j;h=f+8|0;b=h>>>0<8?b+1|0:b;if(c>>>0<h>>>0&(b|0)>=(d|0)|(b|0)>(d|0)){break c}e=e+l|0;e=I[e|0]|I[e+1|0]<<8|(I[e+2|0]<<16|I[e+3|0]<<24);H[i+16>>2]=h;H[i+20>>2]=b;H[g+12>>2]=e;e=c;b=j;c=f+12|0;b=c>>>0<12?b+1|0:b;if(c>>>0>e>>>0&(b|0)>=(d|0)|(b|0)>(d|0)){break c}d=h+l|0;d=I[d|0]|I[d+1|0]<<8|(I[d+2|0]<<16|I[d+3|0]<<24);H[i+16>>2]=c;H[i+20>>2]=b;H[g+16>>2]=d;Rb(H[a+44>>2]+96|0,g+8|0);m=m+1|0;if((m|0)!=(k|0)){continue}break}}H[H[a+4>>2]+80>>2]=n;m=1;break a}m=0}ca=g+32|0;return m|0}function zf(a){a=a|0;var b=0,c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=O(0),w=0;p=ca-16|0;ca=p;a:{if(!(H[a+60>>2]!=H[a- -64>>2]|H[a+48>>2]!=H[a+52>>2])){j=1;break a}j=1;if((ea[H[H[a>>2]+24>>2]](a)|0)<=0){break a}while(1){b:{b=ea[H[H[a>>2]+20>>2]](a,w)|0;c:{d:{e:{f=H[H[H[(ea[H[H[a>>2]+28>>2]](a)|0)+4>>2]+8>>2]+(b<<2)>>2];switch(H[f+28>>2]-1|0){case 8:break d;case 0:case 2:case 4:break e;default:break c}}b=I[f+24|0];f:{if(!b){n=0;j=0;break f}j=0;b=b<<2;n=pa(b);ra(n,0,b);b=I[f+24|0];if(!b){break f}b=b<<2;j=pa(b);ra(j,0,b)}g:{h:{i:{switch(H[f+28>>2]-1|0){case 4:i=0;h=0;d=0;b=0;k=0;e=I[f+24|0];j:{if(!e){g=0;break j}e=e<<2;h=pa(e);ra(h,0,e);g=pa(e);ra(g,0,e)}k:{if(H[f+80>>2]){while(1){o=H[f>>2];c=H[o>>2];m=H[f+48>>2];e=H[f+40>>2];l=Rj(e,H[f+44>>2],d,b);m=m+l|0;s=c+m|0;c=e;m=qa(h,s,c);l=I[f+24|0];if(l){t=H[a+48>>2];e=0;while(1){r=e<<2;s=H[r+m>>2];if((s|0)<0){break k}H[g+r>>2]=s+H[t+(e+u<<2)>>2];e=e+1|0;if((l|0)!=(e|0)){continue}break}}qa(H[o>>2]+N(d,c)|0,g,c);d=d+1|0;b=d?b:b+1|0;if(!b&K[f+80>>2]>d>>>0){continue}break}}k=1}if(g){oa(g)}if(h){oa(h)}if(k){break h}break g;case 2:g=0;e=0;d=0;b=0;c=I[f+24|0];if(c){c=c<<1;e=pa(c);ra(e,0,c);g=pa(c);ra(g,0,c)}if(H[f+80>>2]){while(1){l=H[f>>2];h=H[l>>2];i=H[f+48>>2];c=H[f+40>>2];k=Rj(c,H[f+44>>2],d,b);i=i+k|0;k=qa(e,h+i|0,c);o=I[f+24|0];l:{if(!o){break l}m=H[a+48>>2];h=0;if((o|0)!=1){t=o&254;i=0;while(1){r=h<<1;G[r+g>>1]=J[k+r>>1]+J[m+(h+u<<2)>>1];r=h|1;s=r<<1;G[s+g>>1]=J[k+s>>1]+J[m+(r+u<<2)>>1];h=h+2|0;i=i+2|0;if((t|0)!=(i|0)){continue}break}}if(!(o&1)){break l}i=h<<1;G[i+g>>1]=J[i+k>>1]+J[m+(h+u<<2)>>1]}qa(H[l>>2]+N(d,c)|0,g,c);d=d+1|0;b=d?b:b+1|0;if(!b&K[f+80>>2]>d>>>0){continue}break}}if(g){oa(g)}if(e){oa(e)}break h;case 0:break i;default:break h}}h=0;e=0;d=0;b=0;c=I[f+24|0];if(c){e=pa(c);ra(e,0,c);h=pa(c);ra(h,0,c)}if(H[f+80>>2]){while(1){t=H[f>>2];g=H[t>>2];i=H[f+48>>2];c=H[f+40>>2];k=Rj(c,H[f+44>>2],d,b);i=i+k|0;k=qa(e,g+i|0,c);o=I[f+24|0];m:{if(!o){break m}m=H[a+48>>2];g=0;if((o|0)!=1){r=o&254;i=0;while(1){F[g+h|0]=I[g+k|0]+I[m+(g+u<<2)|0];l=g|1;F[l+h|0]=I[k+l|0]+I[m+(l+u<<2)|0];g=g+2|0;i=i+2|0;if((r|0)!=(i|0)){continue}break}}if(!(o&1)){break m}F[g+h|0]=I[g+k|0]+I[m+(g+u<<2)|0]}qa(H[t>>2]+N(d,c)|0,h,c);d=d+1|0;b=d?b:b+1|0;if(!b&K[f+80>>2]>d>>>0){continue}break}}if(h){oa(h)}if(e){oa(e)}}u=I[f+24|0]+u|0;i=1}if(j){oa(j)}if(n){oa(n)}if(i){break c}j=0;break a}e=H[H[a+60>>2]+(q<<2)>>2];h=H[a+36>>2];g=H[(ea[H[H[a>>2]+28>>2]](a)|0)+40>>2];H[p+12>>2]=H[f+56>>2];b=pa(32);H[p>>2]=b;H[p+4>>2]=24;H[p+8>>2]=-2147483616;d=I[1206]|I[1207]<<8|(I[1208]<<16|I[1209]<<24);c=I[1202]|I[1203]<<8|(I[1204]<<16|I[1205]<<24);F[b+16|0]=c;F[b+17|0]=c>>>8;F[b+18|0]=c>>>16;F[b+19|0]=c>>>24;F[b+20|0]=d;F[b+21|0]=d>>>8;F[b+22|0]=d>>>16;F[b+23|0]=d>>>24;d=I[1198]|I[1199]<<8|(I[1200]<<16|I[1201]<<24);c=I[1194]|I[1195]<<8|(I[1196]<<16|I[1197]<<24);F[b+8|0]=c;F[b+9|0]=c>>>8;F[b+10|0]=c>>>16;F[b+11|0]=c>>>24;F[b+12|0]=d;F[b+13|0]=d>>>8;F[b+14|0]=d>>>16;F[b+15|0]=d>>>24;d=I[1190]|I[1191]<<8|(I[1192]<<16|I[1193]<<24);c=I[1186]|I[1187]<<8|(I[1188]<<16|I[1189]<<24);F[b|0]=c;F[b+1|0]=c>>>8;F[b+2|0]=c>>>16;F[b+3|0]=c>>>24;F[b+4|0]=d;F[b+5|0]=d>>>8;F[b+6|0]=d>>>16;F[b+7|0]=d>>>24;F[b+24|0]=0;d=sd(g,p+12|0,p);if(F[p+11|0]<0){oa(H[p>>2])}b=q+1|0;n:{if(d){oe(f,e);break n}g=h+N(q,24)|0;q=H[g+4>>2];c=I[f+24|0];h=c<<2;d=pa(h);H[p>>2]=1065353216;v=L[g+20>>2];q=-1<<q^-1;if((q|0)>0){L[p>>2]=v/O(q|0)}if((q|0)<=0){break b}o:{if(!H[e+80>>2]){break o}if(!c){n=0;j=0;while(1){qa(H[H[f+64>>2]>>2]+j|0,d,h);j=h+j|0;n=n+1|0;if(n>>>0<K[e+80>>2]){continue}break}break o}o=H[H[e>>2]>>2]+H[e+48>>2]|0;t=c&254;r=c&1;i=0;k=0;j=0;while(1){q=H[g+8>>2];v=L[p>>2];n=0;m=0;if((c|0)!=1){while(1){l=n<<2;s=o+(j<<2)|0;L[l+d>>2]=O(v*O(H[s>>2]))+L[l+q>>2];l=l|4;L[l+d>>2]=O(v*O(H[s+4>>2]))+L[l+q>>2];n=n+2|0;j=j+2|0;m=m+2|0;if((t|0)!=(m|0)){continue}break}}if(r){n=n<<2;L[n+d>>2]=O(v*O(H[o+(j<<2)>>2]))+L[n+q>>2];j=j+1|0}qa(H[H[f+64>>2]>>2]+k|0,d,h);k=h+k|0;i=i+1|0;if(i>>>0<K[e+80>>2]){continue}break}}oa(d)}q=b}j=1;w=w+1|0;if((ea[H[H[a>>2]+24>>2]](a)|0)>(w|0)){continue}break a}break}oa(d);j=0}ca=p+16|0;return j|0}function Le(a,b,c){var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;g=ca+-64|0;ca=g;H[g+56>>2]=0;H[g+48>>2]=0;H[g+52>>2]=0;H[g+40>>2]=0;H[g+44>>2]=0;H[g+32>>2]=0;H[g+36>>2]=0;H[g+24>>2]=0;H[g+28>>2]=0;H[g+16>>2]=0;H[g+20>>2]=0;H[g+8>>2]=0;H[g+12>>2]=0;j=g+8|0;d=J[b+38>>1];a:{b:{if(!d){break b}c:{if(d>>>0<=511){h=H[b+8>>2];f=H[b+12>>2];e=H[b+20>>2];d=H[b+16>>2];i=d+4|0;e=i>>>0<4?e+1|0:e;if(h>>>0<i>>>0&(e|0)>=(f|0)|(e|0)>(f|0)){break b}d=d+H[b>>2]|0;l=I[d|0]|I[d+1|0]<<8|(I[d+2|0]<<16|I[d+3|0]<<24);H[j+12>>2]=l;e=H[b+20>>2];d=H[b+16>>2]+4|0;e=d>>>0<4?e+1|0:e;H[b+16>>2]=d;H[b+20>>2]=e;break c}if(!hb(1,j+12|0,b)){break b}d=H[b+16>>2];e=H[b+20>>2];l=H[j+12>>2]}f=H[b+8>>2];i=f-d|0;d=H[b+12>>2]-((d>>>0>f>>>0)+e|0)|0;if(i>>>0<l>>>6>>>0&(d|0)<=0|(d|0)<0){break b}e=H[j>>2];d=H[j+4>>2]-e>>2;d:{if(d>>>0<l>>>0){ya(j,l-d|0);l=H[j+12>>2];break d}if(d>>>0<=l>>>0){break d}H[j+4>>2]=e+(l<<2)}i=1;if(!l){break a}d=H[b+16>>2];e=H[b+20>>2];r=H[j>>2];k=H[b+8>>2];o=H[b+12>>2];h=0;while(1){i=0;if((e|0)>=(o|0)&d>>>0>=k>>>0|(e|0)>(o|0)){break a}i=H[b>>2];p=I[i+d|0];d=d+1|0;e=d?e:e+1|0;H[b+16>>2]=d;H[b+20>>2]=e;f=p>>>2|0;m=0;e:{f:{g:{h:{s=p&3;switch(s|0){case 0:break f;case 3:break h;default:break g}}f=f+h|0;i=0;if(f>>>0>=l>>>0){break a}ra(r+(h<<2)|0,0,(p&252)+4|0);h=f;break e}while(1){if((d|0)==(k|0)&(e|0)==(o|0)){break b}l=I[d+i|0];d=d+1|0;e=d?e:e+1|0;H[b+16>>2]=d;H[b+20>>2]=e;f=l<<(m<<3|6)|f;m=m+1|0;if((s|0)!=(m|0)){continue}break}}H[r+(h<<2)>>2]=f}l=H[j+12>>2];h=h+1|0;if(l>>>0>h>>>0){continue}break}d=j+16|0;o=H[j>>2];f=H[j+16>>2];e=H[j+20>>2]-f|0;i:{if(e>>>0<=4194303){ya(d,1048576-(e>>>2|0)|0);break i}if((e|0)==4194304){break i}H[j+20>>2]=f+4194304}e=j+28|0;h=H[e>>2];f=H[j+32>>2]-h>>3;j:{if(f>>>0<l>>>0){ob(e,l-f|0);h=H[e>>2];break j}if(f>>>0>l>>>0){H[j+32>>2]=(l<<3)+h}if(!l){break b}}k=H[d>>2];d=0;i=0;while(1){e=o+(d<<2)|0;j=H[e>>2];m=(d<<3)+h|0;f=i;H[m+4>>2]=f;H[m>>2]=j;e=H[e>>2];i=e+f|0;if(i>>>0>1048576){break b}k:{if(f>>>0>=i>>>0){break k}m=0;j=e&7;if(j){while(1){H[k+(f<<2)>>2]=d;f=f+1|0;m=m+1|0;if((j|0)!=(m|0)){continue}break}}if(e-1>>>0<=6){break k}while(1){e=k+(f<<2)|0;H[e>>2]=d;H[e+28>>2]=d;H[e+24>>2]=d;H[e+20>>2]=d;H[e+16>>2]=d;H[e+12>>2]=d;H[e+8>>2]=d;H[e+4>>2]=d;f=f+8|0;if((i|0)!=(f|0)){continue}break}}d=d+1|0;if((l|0)!=(d|0)){continue}break}n=(i|0)==1048576}i=n}l:{if(!i|(H[g+20>>2]?0:a)){break l}i=0;n=ca-16|0;ca=n;m:{n:{if(J[b+38>>1]<=511){h=H[b+8>>2];f=H[b+12>>2];j=f;e=H[b+20>>2];k=H[b+16>>2];d=k+8|0;e=d>>>0<8?e+1|0:e;if(d>>>0>h>>>0&(e|0)>=(f|0)|(e|0)>(f|0)){break m}k=k+H[b>>2]|0;f=I[k|0]|I[k+1|0]<<8|(I[k+2|0]<<16|I[k+3|0]<<24);k=I[k+4|0]|I[k+5|0]<<8|(I[k+6|0]<<16|I[k+7|0]<<24);H[b+16>>2]=d;H[b+20>>2]=e;break n}if(!gb(1,n+8|0,b)){break m}d=H[b+16>>2];e=H[b+20>>2];h=H[b+8>>2];j=H[b+12>>2];f=H[n+8>>2];k=H[n+12>>2]}l=h-d|0;h=j-((d>>>0>h>>>0)+e|0)|0;if((h|0)==(k|0)&f>>>0>l>>>0|h>>>0<k>>>0){break m}e=e+k|0;h=d+f|0;e=h>>>0<f>>>0?e+1|0:e;H[b+16>>2]=h;H[b+20>>2]=e;if((f|0)<=0){break m}b=H[b>>2]+d|0;H[g+48>>2]=b;d=f-1|0;e=d+b|0;h=I[e|0];o:{if(h>>>0<=63){H[g+52>>2]=d;b=I[e|0]&63;break o}p:{switch((h>>>6|0)-1|0){case 0:if(f>>>0<2){break m}d=f-2|0;H[g+52>>2]=d;b=b+d|0;b=I[b+1|0]<<8&16128|I[b|0];break o;case 1:if(f>>>0<3){break m}d=f-3|0;H[g+52>>2]=d;b=b+d|0;b=I[b+1|0]<<8|I[b+2|0]<<16&4128768|I[b|0];break o;default:break p}}d=f-4|0;H[g+52>>2]=d;b=b+d|0;b=(I[b|0]|I[b+1|0]<<8|(I[b+2|0]<<16|I[b+3|0]<<24))&1073741823}H[g+56>>2]=b+4194304;i=b>>>0<1069547520}ca=n+16|0;if(!i){break l}if(!a){t=1;break l}b=H[g+52>>2];f=H[g+56>>2];d=H[g+36>>2];e=H[g+48>>2];h=H[g+24>>2];while(1){q:{if(f>>>0>4194303){break q}while(1){if((b|0)<=0){break q}b=b-1|0;H[g+52>>2]=b;f=I[b+e|0]|f<<8;H[g+56>>2]=f;if(f>>>0<4194304){continue}break}}i=f&1048575;k=H[h+(i<<2)>>2];n=d+(k<<3)|0;f=(N(H[n>>2],f>>>20|0)+i|0)-H[n+4>>2]|0;H[g+56>>2]=f;H[(q<<2)+c>>2]=k;t=1;q=q+1|0;if((q|0)!=(a|0)){continue}break}}a=H[g+36>>2];if(a){H[g+40>>2]=a;oa(a)}a=H[g+24>>2];if(a){H[g+28>>2]=a;oa(a)}a=H[g+8>>2];if(a){H[g+12>>2]=a;oa(a)}ca=g- -64|0;return t}function nc(a,b,c){var d=0,e=0,f=0,g=0,h=0,i=0;e=ca-48|0;ca=e;f=J[6677]|J[6678]<<16;d=J[6675]|J[6676]<<16;G[e+38>>1]=d;G[e+40>>1]=d>>>16;G[e+42>>1]=f;G[e+44>>1]=f>>>16;d=H[3337];H[e+32>>2]=H[3336];H[e+36>>2]=d;d=H[3335];H[e+24>>2]=H[3334];H[e+28>>2]=d;d=H[3333];H[e+16>>2]=H[3332];H[e+20>>2]=d;g=H[b+8>>2];i=H[b+12>>2];h=H[b+20>>2];d=H[b+16>>2];f=d+5|0;h=f>>>0<5?h+1|0:h;a:{b:{if(g>>>0<f>>>0&(h|0)>=(i|0)|(h|0)>(i|0)){d=Ma(e+16|0);if(d>>>0>=2147483632){break a}c:{d:{if(d>>>0>=11){b=(d|15)+1|0;c=pa(b);H[e+8>>2]=b|-2147483648;H[e>>2]=c;H[e+4>>2]=d;b=c+d|0;break d}F[e+11|0]=d;b=d+e|0;c=e;if(!d){break c}}qa(c,e+16|0,d)}F[b|0]=0;H[a>>2]=-2;b=a+4|0;if(F[e+11|0]>=0){a=H[e+4>>2];H[b>>2]=H[e>>2];H[b+4>>2]=a;H[b+8>>2]=H[e+8>>2];break b}za(b,H[e>>2],H[e+4>>2]);if(F[e+11|0]>=0){break b}oa(H[e>>2]);break b}f=d+H[b>>2]|0;d=I[f|0]|I[f+1|0]<<8|(I[f+2|0]<<16|I[f+3|0]<<24);F[c|0]=d;F[c+1|0]=d>>>8;F[c+2|0]=d>>>16;F[c+3|0]=d>>>24;F[c+4|0]=I[f+4|0];d=H[b+20>>2];f=H[b+16>>2]+5|0;d=f>>>0<5?d+1|0:d;H[b+16>>2]=f;H[b+20>>2]=d;if(Fa(c,1260,5)){d=pa(32);F[d+17|0]=0;F[d+16|0]=I[1496];c=I[1492]|I[1493]<<8|(I[1494]<<16|I[1495]<<24);b=I[1488]|I[1489]<<8|(I[1490]<<16|I[1491]<<24);F[d+8|0]=b;F[d+9|0]=b>>>8;F[d+10|0]=b>>>16;F[d+11|0]=b>>>24;F[d+12|0]=c;F[d+13|0]=c>>>8;F[d+14|0]=c>>>16;F[d+15|0]=c>>>24;c=I[1484]|I[1485]<<8|(I[1486]<<16|I[1487]<<24);b=I[1480]|I[1481]<<8|(I[1482]<<16|I[1483]<<24);F[d|0]=b;F[d+1|0]=b>>>8;F[d+2|0]=b>>>16;F[d+3|0]=b>>>24;F[d+4|0]=c;F[d+5|0]=c>>>8;F[d+6|0]=c>>>16;F[d+7|0]=c>>>24;H[a>>2]=-1;za(a+4|0,d,17);oa(d);break b}g=H[b+12>>2];if((g|0)<=(d|0)&K[b+8>>2]<=f>>>0|(d|0)>(g|0)){d=Ma(e+16|0);if(d>>>0>=2147483632){break a}e:{f:{if(d>>>0>=11){b=(d|15)+1|0;c=pa(b);H[e+8>>2]=b|-2147483648;H[e>>2]=c;H[e+4>>2]=d;b=c+d|0;break f}F[e+11|0]=d;b=d+e|0;c=e;if(!d){break e}}qa(c,e+16|0,d)}F[b|0]=0;H[a>>2]=-2;b=a+4|0;if(F[e+11|0]>=0){a=H[e+4>>2];H[b>>2]=H[e>>2];H[b+4>>2]=a;H[b+8>>2]=H[e+8>>2];break b}za(b,H[e>>2],H[e+4>>2]);if(F[e+11|0]>=0){break b}oa(H[e>>2]);break b}F[c+5|0]=I[f+H[b>>2]|0];g=H[b+20>>2];d=H[b+16>>2]+1|0;g=d?g:g+1|0;H[b+16>>2]=d;H[b+20>>2]=g;f=H[b+12>>2];if((f|0)<=(g|0)&K[b+8>>2]<=d>>>0|(g|0)>(f|0)){d=Ma(e+16|0);if(d>>>0>=2147483632){break a}g:{h:{if(d>>>0>=11){b=(d|15)+1|0;c=pa(b);H[e+8>>2]=b|-2147483648;H[e>>2]=c;H[e+4>>2]=d;b=c+d|0;break h}F[e+11|0]=d;b=d+e|0;c=e;if(!d){break g}}qa(c,e+16|0,d)}F[b|0]=0;H[a>>2]=-2;b=a+4|0;if(F[e+11|0]>=0){a=H[e+4>>2];H[b>>2]=H[e>>2];H[b+4>>2]=a;H[b+8>>2]=H[e+8>>2];break b}za(b,H[e>>2],H[e+4>>2]);if(F[e+11|0]>=0){break b}oa(H[e>>2]);break b}F[c+6|0]=I[d+H[b>>2]|0];h=H[b+20>>2];d=H[b+16>>2]+1|0;h=d?h:h+1|0;H[b+16>>2]=d;H[b+20>>2]=h;f=H[b+12>>2];if((f|0)<=(h|0)&K[b+8>>2]<=d>>>0|(f|0)<(h|0)){d=Ma(e+16|0);if(d>>>0>=2147483632){break a}i:{j:{if(d>>>0>=11){b=(d|15)+1|0;c=pa(b);H[e+8>>2]=b|-2147483648;H[e>>2]=c;H[e+4>>2]=d;b=c+d|0;break j}F[e+11|0]=d;b=d+e|0;c=e;if(!d){break i}}qa(c,e+16|0,d)}F[b|0]=0;H[a>>2]=-2;b=a+4|0;if(F[e+11|0]>=0){a=H[e+4>>2];H[b>>2]=H[e>>2];H[b+4>>2]=a;H[b+8>>2]=H[e+8>>2];break b}za(b,H[e>>2],H[e+4>>2]);if(F[e+11|0]>=0){break b}oa(H[e>>2]);break b}F[c+7|0]=I[d+H[b>>2]|0];g=H[b+20>>2];d=H[b+16>>2]+1|0;g=d?g:g+1|0;H[b+16>>2]=d;H[b+20>>2]=g;f=H[b+12>>2];if((f|0)<=(g|0)&K[b+8>>2]<=d>>>0|(g|0)>(f|0)){c=mc(e,e+16|0);H[a>>2]=-2;b=a+4|0;if(F[c+11|0]>=0){a=H[c+4>>2];H[b>>2]=H[c>>2];H[b+4>>2]=a;H[b+8>>2]=H[c+8>>2];break b}za(b,H[c>>2],H[c+4>>2]);if(F[c+11|0]>=0){break b}oa(H[c>>2]);break b}F[c+8|0]=I[d+H[b>>2]|0];d=H[b+20>>2];g=H[b+16>>2];f=g+1|0;i=f?d:d+1|0;H[b+16>>2]=f;H[b+20>>2]=i;i=H[b+8>>2];h=H[b+12>>2];g=g+3|0;d=g>>>0<3?d+1|0:d;if(g>>>0>i>>>0&(d|0)>=(h|0)|(d|0)>(h|0)){c=mc(e,e+16|0);H[a>>2]=-2;b=a+4|0;if(F[c+11|0]>=0){a=H[c+4>>2];H[b>>2]=H[c>>2];H[b+4>>2]=a;H[b+8>>2]=H[c+8>>2];break b}za(b,H[c>>2],H[c+4>>2]);if(F[c+11|0]>=0){break b}oa(H[c>>2]);break b}d=c;c=H[b>>2]+f|0;G[d+10>>1]=I[c|0]|I[c+1|0]<<8;g=H[b+20>>2];c=H[b+16>>2]+2|0;g=c>>>0<2?g+1|0:g;H[b+16>>2]=c;H[b+20>>2]=g;H[a+8>>2]=0;H[a+12>>2]=0;H[a>>2]=0;H[a+4>>2]=0}ca=e+48|0;return}Na();v()}function Nb(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0;e=ca-96|0;ca=e;f=H[a+16>>2];F[e+92|0]=1;H[e+88>>2]=b;H[e+84>>2]=b;H[e+80>>2]=f;j=H[a+20>>2];d=H[j>>2];a:{b:{f=H[H[f+28>>2]+(b<<2)>>2];if(f>>>0<H[j+4>>2]-d>>2>>>0){d=H[H[a+8>>2]+(H[d+(f<<2)>>2]<<2)>>2];f=H[a+4>>2];if(!I[f+84|0]){d=H[H[f+68>>2]+(d<<2)>>2]}H[e+72>>2]=0;H[e+76>>2]=0;j=e- -64|0;H[j>>2]=0;H[j+4>>2]=0;H[e+56>>2]=0;H[e+60>>2]=0;Sa(f,d,F[f+24|0],e+56|0);if((b|0)!=-1){f=b+1|0;j=(f>>>0)%3|0?f:b-2|0;m=((b>>>0)%3|0?-1:2)+b|0;while(1){d=j;f=m;c:{if(!H[a+28>>2]){break c}f=b+1|0;d=(f>>>0)%3|0?f:b-2|0;f=b-1|0;if((b>>>0)%3|0){break c}f=b+2|0}n=H[a+20>>2];b=H[n>>2];d=H[H[H[a+16>>2]+28>>2]+(d<<2)>>2];if(d>>>0>=H[n+4>>2]-b>>2>>>0){break b}d=H[H[a+8>>2]+(H[b+(d<<2)>>2]<<2)>>2];b=H[a+4>>2];if(!I[b+84|0]){d=H[H[b+68>>2]+(d<<2)>>2]}H[e+48>>2]=0;H[e+52>>2]=0;H[e+40>>2]=0;H[e+44>>2]=0;H[e+32>>2]=0;H[e+36>>2]=0;Sa(b,d,F[b+24|0],e+32|0);d=H[a+20>>2];b=H[d>>2];f=H[H[H[a+16>>2]+28>>2]+(f<<2)>>2];if(f>>>0>=H[d+4>>2]-b>>2>>>0){break a}d=H[H[a+8>>2]+(H[b+(f<<2)>>2]<<2)>>2];b=H[a+4>>2];if(!I[b+84|0]){d=H[H[b+68>>2]+(d<<2)>>2]}H[e+24>>2]=0;H[e+28>>2]=0;H[e+16>>2]=0;H[e+20>>2]=0;H[e+8>>2]=0;H[e+12>>2]=0;Sa(b,d,F[b+24|0],e+8|0);g=H[e+8>>2];b=H[e+56>>2];d=g-b|0;p=H[e+60>>2];t=H[e+12>>2]-(p+(b>>>0>g>>>0)|0)|0;h=H[e+40>>2];f=H[e+64>>2];n=h-f|0;u=H[e+68>>2];y=H[e+44>>2]-(u+(f>>>0>h>>>0)|0)|0;g=Rj(d,t,n,y);w=o-g|0;x=i-(da+(g>>>0>o>>>0)|0)|0;i=w;h=H[e+16>>2];g=h-f|0;u=H[e+20>>2]-((f>>>0>h>>>0)+u|0)|0;k=H[e+32>>2];h=k-b|0;w=H[e+36>>2]-((b>>>0>k>>>0)+p|0)|0;b=Rj(g,u,h,w);o=i+b|0;i=da+x|0;i=b>>>0>o>>>0?i+1|0:i;b=l;l=d;p=t;k=H[e+48>>2];f=H[e+72>>2];d=k-f|0;t=H[e+76>>2];x=H[e+52>>2]-(t+(f>>>0>k>>>0)|0)|0;l=Rj(l,p,d,x);k=b+l|0;b=da+q|0;b=k>>>0<l>>>0?b+1|0:b;l=H[e+24>>2];p=l-f|0;f=H[e+28>>2]-((f>>>0>l>>>0)+t|0)|0;q=Rj(p,f,h,w);l=k-q|0;q=b-(da+(k>>>0<q>>>0)|0)|0;b=Rj(g,u,d,x);d=r-b|0;b=s-(da+(b>>>0>r>>>0)|0)|0;s=Rj(p,f,n,y);r=s+d|0;b=da+b|0;s=r>>>0<s>>>0?b+1|0:b;b=H[e+88>>2];f=H[e+80>>2];d:{if(I[e+92|0]){e:{f:{g:{h:{if((b|0)==-1){break h}d=b+1|0;b=(d>>>0)%3|0?d:b-2|0;if((b|0)==-1|H[H[f>>2]+(b>>>3&536870908)>>2]>>>b&1){break h}b=H[H[H[f+64>>2]+12>>2]+(b<<2)>>2];if((b|0)!=-1){break g}}H[e+88>>2]=-1;break f}d=b+1|0;b=(d>>>0)%3|0?d:b-2|0;H[e+88>>2]=b;if((b|0)!=-1){break e}}b=H[e+84>>2];d=-1;i:{if((b|0)==-1){break i}j:{if((b>>>0)%3|0){b=b-1|0;break j}b=b+2|0;d=-1;if((b|0)==-1){break i}}d=-1;if(H[H[f>>2]+(b>>>3&536870908)>>2]>>>b&1){break i}b=H[H[H[f+64>>2]+12>>2]+(b<<2)>>2];d=-1;if((b|0)==-1){break i}d=b-1|0;if((b>>>0)%3|0){break i}d=b+2|0}F[e+92|0]=0;H[e+88>>2]=d;break d}if((b|0)!=H[e+84>>2]){break d}H[e+88>>2]=-1;break d}d=-1;k:{if((b|0)==-1){break k}l:{if((b>>>0)%3|0){b=b-1|0;break l}b=b+2|0;d=-1;if((b|0)==-1){break k}}d=-1;if(H[H[f>>2]+(b>>>3&536870908)>>2]>>>b&1){break k}b=H[H[H[f+64>>2]+12>>2]+(b<<2)>>2];d=-1;if((b|0)==-1){break k}d=b-1|0;if((b>>>0)%3|0){break k}d=b+2|0}H[e+88>>2]=d}b=H[e+88>>2];if((b|0)!=-1){continue}break}}b=s>>31;f=b^r;d=f-b|0;b=(b^s)-((b>>>0>f>>>0)+b|0)|0;m=-1;f=2147483647;g=q>>31;h=g^l;j=h-g|0;n=(g^q)-((h>>>0<g>>>0)+g|0)|0;h=n;k=j^-1;g=h^2147483647;n=i;m:{n:{if(!H[a+28>>2]){if((b|0)==(g|0)&d>>>0>k>>>0|b>>>0>g>>>0){break m}b=b+h|0;a=d+j|0;b=a>>>0<j>>>0?b+1|0:b;f=a;g=i;a=g>>31;d=a;m=d^o;a=m-d|0;i=a;d=(d^g)-((d>>>0>m>>>0)+d|0)|0;a=a+f|0;d=d^2147483647;i=(d|0)==(b|0)&(i^-1)>>>0<f>>>0|b>>>0>d>>>0;a=i?-1:a;if(!(i&0)&(a|0)<=536870912|(a|0)<536870912){break m}b=0;a=a>>>29|0;break n}o:{if((b|0)==(g|0)&d>>>0>k>>>0|b>>>0>g>>>0){break o}b=b+h|0;a=d+j|0;b=a>>>0<j>>>0?b+1|0:b;k=i;d=i>>31;h=d^o;i=h-d|0;j=(d^k)-((d>>>0>h>>>0)+d|0)|0;g=j^2147483647;d=a;a=i;if((g|0)==(b|0)&d>>>0>(a^-1)>>>0|b>>>0>g>>>0){break o}b=b+j|0;m=a+d|0;b=m>>>0<a>>>0?b+1|0:b;f=b;if(!b&m>>>0<536870913){break m}}b=f>>>29|0;a=(f&536870911)<<3|m>>>29}o=Sj(o,n,a,b);l=Sj(l,q,a,b);r=Sj(r,s,a,b)}H[c+8>>2]=o;H[c+4>>2]=l;H[c>>2]=r;ca=e+96|0;return}Ca();v()}Ca();v()}Ca();v()}function Jj(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0;H[a+8>>2]=e;r=a+32|0;g=H[r>>2];f=H[a+36>>2]-g>>2;a:{if(f>>>0<e>>>0){ya(r,e-f|0);d=H[a+8>>2];break a}d=e;if(d>>>0>=f>>>0){break a}H[a+36>>2]=g+(e<<2);d=e}w=e<<2;f=e>>>0>1073741823?-1:w;m=ra(pa(f),0,f);p=ra(pa(f),0,f);b:{if((d|0)<=0){break b}i=H[a+32>>2];while(1){d=h<<2;f=H[d+m>>2];g=H[a+16>>2];c:{if((f|0)>(g|0)){H[d+i>>2]=g;break c}d=d+i|0;g=H[a+12>>2];if((g|0)>(f|0)){H[d>>2]=g;break c}H[d>>2]=f}d=H[a+8>>2];h=h+1|0;if((d|0)>(h|0)){continue}break}if((d|0)<=0){break b}f=0;while(1){g=f<<2;d=g+c|0;g=H[b+g>>2]+H[g+i>>2]|0;H[d>>2]=g;d:{if((g|0)>H[a+16>>2]){g=g-H[a+20>>2]|0}else{if((g|0)>=H[a+12>>2]){break d}g=g+H[a+20>>2]|0}H[d>>2]=g}d=H[a+8>>2];f=f+1|0;if((d|0)>(f|0)){continue}break}}f=H[a+56>>2];x=H[f>>2];f=H[f+4>>2]-x|0;if((f|0)>=5){D=H[a+52>>2];s=H[a+48>>2];u=f>>>2|0;E=u>>>0<=2?2:u;y=e&-2;z=e&1;F=e&-4;A=e&3;B=e-1|0;n=1;while(1){e:{f:{g:{h:{if((n|0)!=(u|0)){g=H[(n<<2)+x>>2];t=(e|0)<=0;if(!t){ra(m,0,w)}if((g|0)==-1){i=N(e,n);break f}C=H[s>>2];l=0;f=g;while(1){i:{if(H[(f>>>3&536870908)+C>>2]>>>f&1){break i}i=H[H[H[s+64>>2]+12>>2]+(f<<2)>>2];if((i|0)==-1){break i}j=H[D>>2];h=H[s+28>>2];o=H[j+(H[h+(i<<2)>>2]<<2)>>2];if((o|0)>=(n|0)){break i}k=i+1|0;k=H[j+(H[h+(((k>>>0)%3|0?k:i-2|0)<<2)>>2]<<2)>>2];if((k|0)>=(n|0)){break i}i=H[j+(H[h+(i+((i>>>0)%3|0?-1:2)<<2)>>2]<<2)>>2];if((i|0)>=(n|0)){break i}j:{if(t){break j}i=N(e,i);j=N(e,k);o=N(e,o);h=0;q=0;if(B){while(1){H[(h<<2)+p>>2]=(H[(h+i<<2)+c>>2]+H[(h+j<<2)+c>>2]|0)-H[(h+o<<2)+c>>2];k=h|1;H[(k<<2)+p>>2]=(H[(i+k<<2)+c>>2]+H[(j+k<<2)+c>>2]|0)-H[(k+o<<2)+c>>2];h=h+2|0;q=q+2|0;if((y|0)!=(q|0)){continue}break}}if(z){H[(h<<2)+p>>2]=(H[(h+i<<2)+c>>2]+H[(h+j<<2)+c>>2]|0)-H[(h+o<<2)+c>>2]}if(t){break j}o=0;h=0;i=0;if(e>>>0>3){while(1){j=h<<2;k=j+m|0;H[k>>2]=H[j+p>>2]+H[k>>2];k=j|4;q=k+m|0;H[q>>2]=H[k+p>>2]+H[q>>2];k=j|8;q=k+m|0;H[q>>2]=H[k+p>>2]+H[q>>2];j=j|12;k=j+m|0;H[k>>2]=H[j+p>>2]+H[k>>2];h=h+4|0;i=i+4|0;if((F|0)!=(i|0)){continue}break}}if(!A){break j}while(1){i=h<<2;j=i+m|0;H[j>>2]=H[i+p>>2]+H[j>>2];h=h+1|0;o=o+1|0;if((A|0)!=(o|0)){continue}break}}l=l+1|0}k:{l:{if((f>>>0)%3|0){h=f-1|0;break l}h=f+2|0;i=-1;if((h|0)==-1){break k}}i=-1;if(H[(h>>>3&536870908)+C>>2]>>>h&1){break k}f=H[H[H[s+64>>2]+12>>2]+(h<<2)>>2];i=-1;if((f|0)==-1){break k}i=f-1|0;if((f>>>0)%3|0){break k}i=f+2|0}f=i;if((g|0)!=(f|0)&(f|0)!=-1){continue}break}i=N(e,n);if(!l){break f}if(t){break g}h=0;f=0;if(!B){break h}while(1){g=h<<2;j=g+m|0;H[j>>2]=H[j>>2]/(l|0);g=(g|4)+m|0;H[g>>2]=H[g>>2]/(l|0);h=h+2|0;f=f+2|0;if((y|0)!=(f|0)){continue}break}break h}Ca();v()}if(!z){break g}f=(h<<2)+m|0;H[f>>2]=H[f>>2]/(l|0)}if((d|0)<=0){break e}l=H[r>>2];h=0;while(1){d=h<<2;f=H[d+m>>2];g=H[a+16>>2];m:{if((f|0)>(g|0)){H[d+l>>2]=g;break m}d=d+l|0;g=H[a+12>>2];if((g|0)>(f|0)){H[d>>2]=g;break m}H[d>>2]=f}d=H[a+8>>2];h=h+1|0;if((d|0)>(h|0)){continue}break}f=0;if((d|0)<=0){break e}d=i<<2;i=d+c|0;h=b+d|0;while(1){g=f<<2;d=g+i|0;g=H[h+g>>2]+H[g+l>>2]|0;H[d>>2]=g;n:{if((g|0)>H[a+16>>2]){g=g-H[a+20>>2]|0}else{if((g|0)>=H[a+12>>2]){break n}g=g+H[a+20>>2]|0}H[d>>2]=g}d=H[a+8>>2];f=f+1|0;if((d|0)>(f|0)){continue}break}break e}if((d|0)<=0){break e}g=(N(n-1|0,e)<<2)+c|0;l=H[r>>2];h=0;while(1){d=h<<2;f=H[d+g>>2];j=H[a+16>>2];o:{if((f|0)>(j|0)){H[d+l>>2]=j;break o}d=d+l|0;j=H[a+12>>2];if((j|0)>(f|0)){H[d>>2]=j;break o}H[d>>2]=f}d=H[a+8>>2];h=h+1|0;if((d|0)>(h|0)){continue}break}f=0;if((d|0)<=0){break e}d=i<<2;i=d+c|0;h=b+d|0;while(1){g=f<<2;d=g+i|0;g=H[h+g>>2]+H[g+l>>2]|0;H[d>>2]=g;p:{if((g|0)>H[a+16>>2]){g=g-H[a+20>>2]|0}else{if((g|0)>=H[a+12>>2]){break p}g=g+H[a+20>>2]|0}H[d>>2]=g}d=H[a+8>>2];f=f+1|0;if((d|0)>(f|0)){continue}break}}n=n+1|0;if((E|0)!=(n|0)){continue}break}}oa(p);oa(m);return 1}function sj(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0;H[a+8>>2]=e;r=a+32|0;f=H[r>>2];j=H[a+36>>2]-f>>2;a:{if(j>>>0<e>>>0){ya(r,e-j|0);d=H[a+8>>2];break a}d=e;if(e>>>0>=j>>>0){break a}H[a+36>>2]=f+(e<<2);d=e}u=e<<2;f=e>>>0>1073741823?-1:u;m=ra(pa(f),0,f);p=ra(pa(f),0,f);b:{if((d|0)<=0){break b}i=H[a+32>>2];while(1){f=h<<2;j=H[f+m>>2];d=H[a+16>>2];c:{if((j|0)>(d|0)){H[f+i>>2]=d;break c}f=f+i|0;d=H[a+12>>2];if((d|0)>(j|0)){H[f>>2]=d;break c}H[f>>2]=j}d=H[a+8>>2];h=h+1|0;if((d|0)>(h|0)){continue}break}if((d|0)<=0){break b}f=0;while(1){j=f<<2;d=j+c|0;j=H[b+j>>2]+H[j+i>>2]|0;H[d>>2]=j;d:{if((j|0)>H[a+16>>2]){j=j-H[a+20>>2]|0}else{if((j|0)>=H[a+12>>2]){break d}j=j+H[a+20>>2]|0}H[d>>2]=j}d=H[a+8>>2];f=f+1|0;if((d|0)>(f|0)){continue}break}}f=H[a+56>>2];w=H[f>>2];f=H[f+4>>2]-w|0;if((f|0)>=5){D=H[a+52>>2];x=H[a+48>>2];t=f>>>2|0;E=t>>>0<=2?2:t;y=e&-2;z=e&1;F=e&-4;A=e&3;B=e-1|0;n=1;while(1){e:{f:{g:{h:{if((n|0)!=(t|0)){j=H[(n<<2)+w>>2];s=(e|0)<=0;if(!s){ra(m,0,u)}if((j|0)==-1){g=N(e,n);break f}C=H[x+12>>2];q=0;f=j;while(1){h=H[(f<<2)+C>>2];i:{if((h|0)==-1){break i}o=H[D>>2];l=H[x>>2];k=H[o+(H[l+(h<<2)>>2]<<2)>>2];i=h+1|0;i=(i>>>0)%3|0?i:h-2|0;if((i|0)!=-1){g=H[l+(i<<2)>>2]}else{g=-1}j:{k:{if((h>>>0)%3|0){h=h-1|0;break k}h=h+2|0;i=-1;if((h|0)==-1){break j}}i=H[l+(h<<2)>>2]}if((k|0)>=(n|0)){break i}g=H[(g<<2)+o>>2];if((g|0)>=(n|0)){break i}i=H[o+(i<<2)>>2];if((i|0)>=(n|0)){break i}l:{if(s){break l}l=N(e,i);o=N(e,g);k=N(e,k);h=0;i=0;if(B){while(1){H[(h<<2)+p>>2]=(H[(h+l<<2)+c>>2]+H[(h+o<<2)+c>>2]|0)-H[(h+k<<2)+c>>2];g=h|1;H[(g<<2)+p>>2]=(H[(g+l<<2)+c>>2]+H[(g+o<<2)+c>>2]|0)-H[(g+k<<2)+c>>2];h=h+2|0;i=i+2|0;if((y|0)!=(i|0)){continue}break}}if(z){H[(h<<2)+p>>2]=(H[(h+l<<2)+c>>2]+H[(h+o<<2)+c>>2]|0)-H[(h+k<<2)+c>>2]}if(s){break l}o=0;h=0;k=0;if(e>>>0>3){while(1){l=h<<2;i=l+m|0;H[i>>2]=H[l+p>>2]+H[i>>2];g=l|4;i=g+m|0;H[i>>2]=H[g+p>>2]+H[i>>2];g=l|8;i=g+m|0;H[i>>2]=H[g+p>>2]+H[i>>2];g=l|12;i=g+m|0;H[i>>2]=H[g+p>>2]+H[i>>2];h=h+4|0;k=k+4|0;if((F|0)!=(k|0)){continue}break}}if(!A){break l}while(1){g=h<<2;i=g+m|0;H[i>>2]=H[g+p>>2]+H[i>>2];h=h+1|0;o=o+1|0;if((A|0)!=(o|0)){continue}break}}q=q+1|0}m:{n:{if((f>>>0)%3|0){h=f-1|0;break n}h=f+2|0;g=-1;if((h|0)==-1){break m}}f=H[(h<<2)+C>>2];g=-1;if((f|0)==-1){break m}g=f-1|0;if((f>>>0)%3|0){break m}g=f+2|0}f=g;if((j|0)!=(f|0)&(f|0)!=-1){continue}break}g=N(e,n);if(!q){break f}if(s){break g}h=0;f=0;if(!B){break h}while(1){i=h<<2;j=i+m|0;H[j>>2]=H[j>>2]/(q|0);j=(i|4)+m|0;H[j>>2]=H[j>>2]/(q|0);h=h+2|0;f=f+2|0;if((y|0)!=(f|0)){continue}break}break h}Ca();v()}if(!z){break g}f=(h<<2)+m|0;H[f>>2]=H[f>>2]/(q|0)}if((d|0)<=0){break e}k=H[r>>2];h=0;while(1){f=h<<2;j=H[f+m>>2];d=H[a+16>>2];o:{if((j|0)>(d|0)){H[f+k>>2]=d;break o}f=f+k|0;d=H[a+12>>2];if((d|0)>(j|0)){H[f>>2]=d;break o}H[f>>2]=j}d=H[a+8>>2];h=h+1|0;if((d|0)>(h|0)){continue}break}f=0;if((d|0)<=0){break e}d=g<<2;i=d+c|0;j=b+d|0;while(1){g=f<<2;d=g+i|0;g=H[g+j>>2]+H[g+k>>2]|0;H[d>>2]=g;p:{if((g|0)>H[a+16>>2]){g=g-H[a+20>>2]|0}else{if((g|0)>=H[a+12>>2]){break p}g=g+H[a+20>>2]|0}H[d>>2]=g}d=H[a+8>>2];f=f+1|0;if((d|0)>(f|0)){continue}break}break e}if((d|0)<=0){break e}f=(N(n-1|0,e)<<2)+c|0;k=H[r>>2];h=0;while(1){j=h<<2;i=H[j+f>>2];d=H[a+16>>2];q:{if((i|0)>(d|0)){H[j+k>>2]=d;break q}j=j+k|0;d=H[a+12>>2];if((d|0)>(i|0)){H[j>>2]=d;break q}H[j>>2]=i}d=H[a+8>>2];h=h+1|0;if((d|0)>(h|0)){continue}break}f=0;if((d|0)<=0){break e}d=g<<2;i=d+c|0;j=b+d|0;while(1){g=f<<2;d=g+i|0;g=H[g+j>>2]+H[g+k>>2]|0;H[d>>2]=g;r:{if((g|0)>H[a+16>>2]){g=g-H[a+20>>2]|0}else{if((g|0)>=H[a+12>>2]){break r}g=g+H[a+20>>2]|0}H[d>>2]=g}d=H[a+8>>2];f=f+1|0;if((d|0)>(f|0)){continue}break}}n=n+1|0;if((E|0)!=(n|0)){continue}break}}oa(p);oa(m);return 1}function xa(a){var b=0,c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;f=ca-32|0;ca=f;a:{b=H[a+16>>2];b:{if(b>>>0>=341){H[a+16>>2]=b-341;b=H[a+4>>2];j=H[b>>2];c=b+4|0;H[a+4>>2]=c;b=H[a+8>>2];c:{if((b|0)!=H[a+12>>2]){d=b;break c}k=H[a>>2];if(k>>>0<c>>>0){e=((c-k>>2)+1|0)/-2<<2;b=b-c|0;d=va(e+c|0,c,b)+b|0;H[a+8>>2]=d;H[a+4>>2]=e+H[a+4>>2];break c}d=(b|0)==(k|0)?1:b-k>>1;if(d>>>0>=1073741824){break a}e=d<<2;h=pa(e);l=e+h|0;e=h+(d&-4)|0;d=e;d:{if((b|0)==(c|0)){break d}b=b-c|0;m=b&-4;i=b-4|0;g=(i>>>2|0)+1&7;e:{if(!g){b=e;break e}d=0;b=e;while(1){H[b>>2]=H[c>>2];c=c+4|0;b=b+4|0;d=d+1|0;if((g|0)!=(d|0)){continue}break}}d=e+m|0;if(i>>>0<28){break d}while(1){H[b>>2]=H[c>>2];H[b+4>>2]=H[c+4>>2];H[b+8>>2]=H[c+8>>2];H[b+12>>2]=H[c+12>>2];H[b+16>>2]=H[c+16>>2];H[b+20>>2]=H[c+20>>2];H[b+24>>2]=H[c+24>>2];H[b+28>>2]=H[c+28>>2];c=c+32|0;b=b+32|0;if((d|0)!=(b|0)){continue}break}}H[a+12>>2]=l;H[a+8>>2]=d;H[a+4>>2]=e;H[a>>2]=h;if(!k){break c}oa(k);d=H[a+8>>2]}H[d>>2]=j;H[a+8>>2]=H[a+8>>2]+4;break b}c=H[a+8>>2];b=H[a+4>>2];l=c-b|0;h=l>>2;g=H[a+12>>2];d=H[a>>2];e=g-d|0;if(h>>>0<e>>2>>>0){if((c|0)!=(g|0)){n=f,o=pa(4092),H[n+8>>2]=o;d=a;f:{g:{b=H[a+8>>2];h:{if((b|0)!=H[a+12>>2]){e=b;break h}c=H[d+4>>2];h=H[d>>2];if(c>>>0>h>>>0){g=((c-h>>2)+1|0)/-2<<2;a=b-c|0;e=va(g+c|0,c,a)+a|0;H[d+8>>2]=e;H[d+4>>2]=g+H[d+4>>2];break h}e=(b|0)==(h|0)?1:b-h>>1;if(e>>>0>=1073741824){break g}a=e<<2;j=pa(a);l=a+j|0;a=j+(e&-4)|0;e=a;i:{if((b|0)==(c|0)){break i}b=b-c|0;m=b&-4;i=b-4|0;g=(i>>>2|0)+1&7;j:{if(!g){b=a;break j}e=0;b=a;while(1){H[b>>2]=H[c>>2];c=c+4|0;b=b+4|0;e=e+1|0;if((g|0)!=(e|0)){continue}break}}e=a+m|0;if(i>>>0<28){break i}while(1){H[b>>2]=H[c>>2];H[b+4>>2]=H[c+4>>2];H[b+8>>2]=H[c+8>>2];H[b+12>>2]=H[c+12>>2];H[b+16>>2]=H[c+16>>2];H[b+20>>2]=H[c+20>>2];H[b+24>>2]=H[c+24>>2];H[b+28>>2]=H[c+28>>2];c=c+32|0;b=b+32|0;if((e|0)!=(b|0)){continue}break}}H[d+12>>2]=l;H[d+8>>2]=e;H[d+4>>2]=a;H[d>>2]=j;if(!h){break h}oa(h);e=H[d+8>>2]}H[e>>2]=H[f+8>>2];H[d+8>>2]=H[d+8>>2]+4;break f}wa();v()}break b}n=f,o=pa(4092),H[n+8>>2]=o;qd(a,f+8|0);b=H[a+4>>2];j=H[b>>2];c=b+4|0;H[a+4>>2]=c;b=H[a+8>>2];k:{if((b|0)!=H[a+12>>2]){d=b;break k}k=H[a>>2];if(k>>>0<c>>>0){e=((c-k>>2)+1|0)/-2<<2;b=b-c|0;d=va(e+c|0,c,b)+b|0;H[a+8>>2]=d;H[a+4>>2]=e+H[a+4>>2];break k}d=(b|0)==(k|0)?1:b-k>>1;if(d>>>0>=1073741824){break a}e=d<<2;h=pa(e);l=e+h|0;e=h+(d&-4)|0;d=e;l:{if((b|0)==(c|0)){break l}b=b-c|0;m=b&-4;i=b-4|0;g=(i>>>2|0)+1&7;m:{if(!g){b=e;break m}d=0;b=e;while(1){H[b>>2]=H[c>>2];c=c+4|0;b=b+4|0;d=d+1|0;if((g|0)!=(d|0)){continue}break}}d=e+m|0;if(i>>>0<28){break l}while(1){H[b>>2]=H[c>>2];H[b+4>>2]=H[c+4>>2];H[b+8>>2]=H[c+8>>2];H[b+12>>2]=H[c+12>>2];H[b+16>>2]=H[c+16>>2];H[b+20>>2]=H[c+20>>2];H[b+24>>2]=H[c+24>>2];H[b+28>>2]=H[c+28>>2];c=c+32|0;b=b+32|0;if((d|0)!=(b|0)){continue}break}}H[a+12>>2]=l;H[a+8>>2]=d;H[a+4>>2]=e;H[a>>2]=h;if(!k){break k}oa(k);d=H[a+8>>2]}H[d>>2]=j;H[a+8>>2]=H[a+8>>2]+4;break b}H[f+24>>2]=a+12;m=(d|0)==(g|0)?1:e>>1;if(m>>>0>=1073741824){break a}e=m<<2;g=pa(e);H[f+8>>2]=g;j=e+g|0;H[f+20>>2]=j;d=(h<<2)+g|0;H[f+12>>2]=d;i=pa(4092);n:{if((h|0)!=(m|0)){break n}if((l|0)>0){d=((h+1|0)/-2<<2)+d|0;H[f+12>>2]=d;break n}d=(b|0)==(c|0)?1:l>>1;if(d>>>0>=1073741824){break a}b=d<<2;e=pa(b);H[f+8>>2]=e;j=b+e|0;H[f+20>>2]=j;d=e+(d&-4)|0;H[f+12>>2]=d;oa(g);b=H[a+4>>2];c=H[a+8>>2];g=e}H[d>>2]=i;i=d+4|0;H[f+16>>2]=i;e=b;if((b|0)!=(c|0)){while(1){c=c-4|0;qd(f+8|0,c);if(H[a+4>>2]!=(c|0)){continue}break}j=H[f+20>>2];i=H[f+16>>2];d=H[f+12>>2];g=H[f+8>>2];e=c;b=H[a+8>>2]}c=H[a>>2];H[a>>2]=g;H[f+8>>2]=c;H[a+4>>2]=d;H[f+12>>2]=e;H[a+8>>2]=i;H[f+16>>2]=b;d=H[a+12>>2];H[a+12>>2]=j;H[f+20>>2]=d;if((b|0)!=(e|0)){H[f+16>>2]=((e-b|0)+3&-4)+b}if(!c){break b}oa(c)}ca=f+32|0;return}wa();v()}function Aj(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=O(0),j=0,k=0,l=0,m=O(0),n=O(0),o=O(0),p=O(0),q=O(0),r=0,s=O(0),t=O(0),u=O(0),w=O(0),x=0,y=O(0),z=O(0),A=O(0),B=0;a:{b:{if((e|0)!=2){break b}H[a+64>>2]=f;H[a+72>>2]=2;e=pa(8);d=H[a+68>>2];H[a+68>>2]=e;if(d){oa(d)}H[a+8>>2]=2;x=a+32|0;e=H[x>>2];d=H[a+36>>2]-e|0;c:{if(d>>>0<=7){ya(x,2-(d>>>2|0)|0);break c}if((d|0)==8){break c}H[a+36>>2]=e+8}h=1;d=H[a+56>>2];d=H[d+4>>2]-H[d>>2]|0;if((d|0)<=0){break b}d=d>>>2|0;B=d>>>0<=1?1:d;d=0;while(1){e=H[a+56>>2];h=H[e>>2];if(H[e+4>>2]-h>>2>>>0<=d>>>0){break a}q=O(0);g=ca-48|0;ca=g;e=-1;h=H[h+(d<<2)>>2];f=-1;d:{if((h|0)==-1){break d}e=h+1|0;e=(e>>>0)%3|0?e:h-2|0;f=h-1|0;if((h>>>0)%3|0){break d}f=h+2|0}j=H[a+52>>2];h=H[j>>2];e:{f:{j=H[j+4>>2]-h>>2;l=e<<2;e=H[H[a+48>>2]+28>>2];r=H[l+e>>2];if(j>>>0<=r>>>0){break f}e=H[e+(f<<2)>>2];if(e>>>0>=j>>>0){break f}j=H[h+(e<<2)>>2];f=H[h+(r<<2)>>2];g:{if(!((j|0)>=(d|0)|(f|0)>=(d|0))){e=H[a+72>>2];h=(N(e,j)<<2)+c|0;m=O(H[h+4>>2]);e=(N(e,f)<<2)+c|0;p=O(H[e+4>>2]);y=O(H[e>>2]);n=O(H[h>>2]);if(!(y!=n|m!=p)){h=+m>2147483647;e=H[a+68>>2];if(O(P(m))<O(2147483648)){f=~~m}else{f=-2147483648}H[e+4>>2]=m<O(-2147483648)?-2147483648:h?-2147483648:f;h=+n>2147483647;if(O(P(n))<O(2147483648)){f=~~n}else{f=-2147483648}H[e>>2]=n<O(-2147483648)?-2147483648:h?-2147483648:f;f=1;break g}e=H[H[a+64>>2]+(d<<2)>>2];H[g+40>>2]=0;H[g+32>>2]=0;H[g+36>>2]=0;h=H[a+60>>2];if(!I[h+84|0]){e=H[H[h+68>>2]+(e<<2)>>2]}Va(h,e,F[h+24|0],g+32|0);f=H[H[a+64>>2]+(f<<2)>>2];H[g+24>>2]=0;H[g+16>>2]=0;H[g+20>>2]=0;e=H[a+60>>2];if(!I[e+84|0]){f=H[H[e+68>>2]+(f<<2)>>2]}Va(e,f,F[e+24|0],g+16|0);f=H[H[a+64>>2]+(j<<2)>>2];H[g+8>>2]=0;H[g>>2]=0;H[g+4>>2]=0;e=H[a+60>>2];if(!I[e+84|0]){f=H[H[e+68>>2]+(f<<2)>>2]}Va(e,f,F[e+24|0],g);o=L[g+24>>2];s=O(L[g+8>>2]-o);t=L[g+20>>2];u=O(L[g+4>>2]-t);A=L[g+16>>2];w=O(L[g>>2]-A);z=O(O(s*s)+O(O(u*u)+O(O(w*w)+O(0))));h:{if(H[a+88>>2]>=258){i=O(0);if(!(z>O(0))){break h}}i=O(L[g+40>>2]-o);o=O(L[g+36>>2]-t);t=O(L[g+32>>2]-A);q=O(O(O(s*i)+O(O(u*o)+O(O(w*t)+O(0))))/z);i=O(i-O(s*q));s=O(i*i);i=O(o-O(u*q));o=O(i*i);i=O(t-O(w*q));i=O(W(O(O(s+O(o+O(O(i*i)+O(0))))/z)))}f=H[a+80>>2];if(f){e=f-1|0;h=H[H[a+76>>2]+(e>>>3&536870908)>>2];H[a+80>>2]=e;m=O(m-p);o=O(O(m*q)+p);n=O(n-y);p=O(n*i);e=h>>>e&1;p=O(o+(e?p:O(-p)));i=O(i*m);k=T(+O(O(O(n*q)+y)+(e?O(-i):i))+.5);i:{if(k<-2147483648|k!=k|k>2147483647){e=H[a+68>>2];H[e>>2]=-2147483648;break i}e=H[a+68>>2];if(P(k)<2147483648){h=~~k}else{h=-2147483648}H[e>>2]=h}k=T(+p+.5);j=k>2147483647;if(P(k)<2147483648){h=~~k}else{h=-2147483648}H[e+4>>2]=k<-2147483648?-2147483648:k!=k?-2147483648:j?-2147483648:h}f=(f|0)!=0;break g}j:{if((d|0)>(f|0)){e=H[a+72>>2];h=N(f,e);break j}if((d|0)<=0){f=1;if(H[a+72>>2]<=0){break g}h=H[a+68>>2];e=0;while(1){H[h+(e<<2)>>2]=0;e=e+1|0;if((e|0)<H[a+72>>2]){continue}break}break g}e=H[a+72>>2];h=N(e,d-1|0)}f=1;if((e|0)<=0){break g}j=H[a+68>>2];e=0;while(1){H[j+(e<<2)>>2]=H[(e+h<<2)+c>>2];e=e+1|0;if((e|0)<H[a+72>>2]){continue}break}}ca=g+48|0;break e}Ca();v()}h=f;if(!h){return 0}k:{if(H[a+8>>2]<=0){break k}r=H[a+68>>2];j=H[x>>2];e=0;while(1){f=e<<2;g=H[f+r>>2];l=H[a+16>>2];l:{if((g|0)>(l|0)){H[f+j>>2]=l;break l}f=f+j|0;l=H[a+12>>2];if((l|0)>(g|0)){H[f>>2]=l;break l}H[f>>2]=g}e=e+1|0;g=H[a+8>>2];if((e|0)<(g|0)){continue}break}f=0;if((g|0)<=0){break k}e=d<<3;r=e+c|0;l=b+e|0;while(1){g=f<<2;e=g+r|0;g=H[g+l>>2]+H[g+j>>2]|0;H[e>>2]=g;m:{if((g|0)>H[a+16>>2]){g=g-H[a+20>>2]|0}else{if((g|0)>=H[a+12>>2]){break m}g=g+H[a+20>>2]|0}H[e>>2]=g}f=f+1|0;if((f|0)<H[a+8>>2]){continue}break}}d=d+1|0;if((B|0)!=(d|0)){continue}break}}return h|0}Ca();v()}function kj(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=O(0),j=0,k=0,l=O(0),m=O(0),n=O(0),o=O(0),p=0,q=O(0),r=O(0),s=O(0),t=O(0),u=O(0),w=0,x=O(0),y=O(0),z=0,A=O(0),B=0;a:{b:{if((e|0)!=2){break b}H[a+64>>2]=f;H[a+72>>2]=2;e=pa(8);d=H[a+68>>2];H[a+68>>2]=e;if(d){oa(d)}H[a+8>>2]=2;w=a+32|0;e=H[w>>2];d=H[a+36>>2]-e|0;c:{if(d>>>0<=7){ya(w,2-(d>>>2|0)|0);break c}if((d|0)==8){break c}H[a+36>>2]=e+8}h=1;d=H[a+56>>2];d=H[d+4>>2]-H[d>>2]|0;if((d|0)<=0){break b}d=d>>>2|0;B=d>>>0<=1?1:d;d=0;while(1){f=H[a+56>>2];e=H[f>>2];if(H[f+4>>2]-e>>2>>>0<=d>>>0){break a}q=O(0);g=ca-48|0;ca=g;h=-1;d:{e:{e=H[e+(d<<2)>>2];if((e|0)==-1){break e}j=H[a+48>>2];f=e+1|0;f=(f>>>0)%3|0?f:e-2|0;if((f|0)!=-1){h=H[H[j>>2]+(f<<2)>>2]}f=-1;e=e+((e>>>0)%3|0?-1:2)|0;if((e|0)!=-1){f=H[H[j>>2]+(e<<2)>>2]}e=H[a+52>>2];j=H[e>>2];e=H[e+4>>2]-j>>2;if(e>>>0<=h>>>0|e>>>0<=f>>>0){break e}e=H[j+(h<<2)>>2];j=H[j+(f<<2)>>2];f:{if(!((d|0)<=(e|0)|(j|0)>=(d|0))){f=H[a+72>>2];h=(N(f,j)<<2)+c|0;l=O(H[h+4>>2]);f=(N(e,f)<<2)+c|0;o=O(H[f+4>>2]);x=O(H[f>>2]);m=O(H[h>>2]);if(!(x!=m|l!=o)){h=+l>2147483647;e=H[a+68>>2];if(O(P(l))<O(2147483648)){f=~~l}else{f=-2147483648}H[e+4>>2]=l<O(-2147483648)?-2147483648:h?-2147483648:f;h=+m>2147483647;if(O(P(m))<O(2147483648)){f=~~m}else{f=-2147483648}H[e>>2]=m<O(-2147483648)?-2147483648:h?-2147483648:f;h=1;break f}f=H[H[a+64>>2]+(d<<2)>>2];H[g+40>>2]=0;H[g+32>>2]=0;H[g+36>>2]=0;h=H[a+60>>2];if(!I[h+84|0]){f=H[H[h+68>>2]+(f<<2)>>2]}Va(h,f,F[h+24|0],g+32|0);f=H[H[a+64>>2]+(e<<2)>>2];H[g+24>>2]=0;H[g+16>>2]=0;H[g+20>>2]=0;e=H[a+60>>2];if(!I[e+84|0]){f=H[H[e+68>>2]+(f<<2)>>2]}Va(e,f,F[e+24|0],g+16|0);h=H[H[a+64>>2]+(j<<2)>>2];H[g+8>>2]=0;H[g>>2]=0;H[g+4>>2]=0;e=H[a+60>>2];if(!I[e+84|0]){h=H[H[e+68>>2]+(h<<2)>>2]}Va(e,h,F[e+24|0],g);n=L[g+24>>2];r=O(L[g+8>>2]-n);s=L[g+20>>2];t=O(L[g+4>>2]-s);A=L[g+16>>2];u=O(L[g>>2]-A);y=O(O(r*r)+O(O(t*t)+O(O(u*u)+O(0))));g:{if(H[a+88>>2]>=258){i=O(0);if(!(y>O(0))){break g}}i=O(L[g+40>>2]-n);n=O(L[g+36>>2]-s);s=O(L[g+32>>2]-A);q=O(O(O(r*i)+O(O(t*n)+O(O(u*s)+O(0))))/y);i=O(i-O(r*q));r=O(i*i);i=O(n-O(t*q));n=O(i*i);i=O(s-O(u*q));i=O(W(O(O(r+O(n+O(O(i*i)+O(0))))/y)))}e=H[a+80>>2];if(e){f=e-1|0;h=H[H[a+76>>2]+(f>>>3&536870908)>>2];H[a+80>>2]=f;l=O(l-o);n=O(O(l*q)+o);m=O(m-x);o=O(m*i);f=h>>>f&1;o=O(n+(f?o:O(-o)));i=O(i*l);k=T(+O(O(O(m*q)+x)+(f?O(-i):i))+.5);h:{if(k<-2147483648|k!=k|k>2147483647){h=H[a+68>>2];H[h>>2]=-2147483648;break h}h=H[a+68>>2];if(P(k)<2147483648){f=~~k}else{f=-2147483648}H[h>>2]=f}k=T(+o+.5);j=k>2147483647;if(P(k)<2147483648){f=~~k}else{f=-2147483648}H[h+4>>2]=k<-2147483648?-2147483648:k!=k?-2147483648:j?-2147483648:f}h=(e|0)!=0;break f}i:{if((d|0)>(e|0)){f=H[a+72>>2];e=N(e,f);break i}if((d|0)<=0){h=1;if(H[a+72>>2]<=0){break f}e=H[a+68>>2];f=0;while(1){H[e+(f<<2)>>2]=0;f=f+1|0;if((f|0)<H[a+72>>2]){continue}break}break f}f=H[a+72>>2];e=N(f,d-1|0)}h=1;if((f|0)<=0){break f}j=H[a+68>>2];f=0;while(1){H[j+(f<<2)>>2]=H[(e+f<<2)+c>>2];f=f+1|0;if((f|0)<H[a+72>>2]){continue}break}}ca=g+48|0;break d}Ca();v()}if(!h){return 0}j:{if(H[a+8>>2]<=0){break j}z=H[a+68>>2];j=H[w>>2];e=0;while(1){f=e<<2;g=H[f+z>>2];p=H[a+16>>2];k:{if((g|0)>(p|0)){H[f+j>>2]=p;break k}f=f+j|0;p=H[a+12>>2];if((p|0)>(g|0)){H[f>>2]=p;break k}H[f>>2]=g}e=e+1|0;g=H[a+8>>2];if((e|0)<(g|0)){continue}break}f=0;if((g|0)<=0){break j}e=d<<3;z=e+c|0;p=b+e|0;while(1){g=f<<2;e=g+z|0;g=H[g+p>>2]+H[g+j>>2]|0;H[e>>2]=g;l:{if((g|0)>H[a+16>>2]){g=g-H[a+20>>2]|0}else{if((g|0)>=H[a+12>>2]){break l}g=g+H[a+20>>2]|0}H[e>>2]=g}f=f+1|0;if((f|0)<H[a+8>>2]){continue}break}}d=d+1|0;if((B|0)!=(d|0)){continue}break}}return h|0}Ca();v()}function Of(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;f=ca-704|0;ca=f;n=1;a:{b:{c:{d:{if(J[b+38>>1]<515){break d}n=0;c=H[b+20>>2];d=H[b+12>>2];g=H[b+16>>2];if((c|0)>=(d|0)&g>>>0>=K[b+8>>2]|(c|0)>(d|0)){break d}p=I[H[b>>2]+g|0];g=g+1|0;c=g?c:c+1|0;H[b+16>>2]=g;H[b+20>>2]=c;g=H[H[(ea[H[H[a>>2]+28>>2]](a)|0)+4>>2]+80>>2];c=ea[H[H[a>>2]+24>>2]](a)|0;H[f+40>>2]=0;H[f+32>>2]=0;H[f+36>>2]=0;if(c){if(c>>>0>=214748365){break c}c=N(c,20);d=pa(c);H[f+32>>2]=d;H[f+40>>2]=c+d;c=c-20|0;c=(c-((c>>>0)%20|0)|0)+20|0;q=f,r=ra(d,0,c)+c|0,H[q+36>>2]=r}e:{if((ea[H[H[a>>2]+24>>2]](a)|0)>0){while(1){c=ea[H[H[a>>2]+20>>2]](a,l)|0;c=H[H[H[(ea[H[H[a>>2]+28>>2]](a)|0)+4>>2]+8>>2]+(c<<2)>>2];mb(c,g);F[c+84|0]=1;H[c+72>>2]=H[c+68>>2];d=H[c+28>>2];if(d>>>0>9){break e}f:{g:{h:{e=1<<d;if(!(e&42)){if(e&84){break f}if((d|0)!=9){break e}d=I[c+24|0];e=Eb(f+48|0);i=N(d,H[3401]);lc(e,H[c+56>>2],d,6,0,i,i>>31);c=jc(pa(96),e);H[f>>2]=c;F[c+84|0]=1;H[c+72>>2]=H[c+68>>2];mb(c,g);c=H[a+64>>2];if(c>>>0>=K[a+68>>2]){break h}d=H[f>>2];H[f>>2]=0;H[c>>2]=d;c=c+4|0;H[a+64>>2]=c;break g}j=0;if(!I[c+24|0]){break f}while(1){d=H[a+52>>2];i=H[a+56>>2];i:{if(d>>>0<i>>>0){H[d>>2]=0;H[a+52>>2]=d+4;break i}e=d;d=H[a+48>>2];m=e-d|0;k=m>>2;e=k+1|0;if(e>>>0>=1073741824){break b}o=k<<2;i=i-d|0;k=i>>>1|0;e=i>>>0>=2147483644?1073741823:e>>>0<k>>>0?k:e;if(e){if(e>>>0>=1073741824){break a}i=pa(e<<2)}else{i=0}k=o+i|0;H[k>>2]=0;o=e<<2;e=va(i,d,m);H[a+56>>2]=o+e;H[a+52>>2]=k+4;H[a+48>>2]=e;if(!d){break i}oa(d)}j=j+1|0;if(j>>>0<I[c+24|0]){continue}break}break f}c=0;j:{k:{l:{e=H[a+60>>2];i=H[a+64>>2]-e>>2;d=i+1|0;if(d>>>0<1073741824){e=H[a+68>>2]-e|0;j=e>>>1|0;e=e>>>0>=2147483644?1073741823:d>>>0<j>>>0?j:d;if(e){if(e>>>0>=1073741824){break l}c=pa(e<<2)}j=H[f>>2];H[f>>2]=0;d=(i<<2)+c|0;H[d>>2]=j;e=(e<<2)+c|0;i=d+4|0;c=H[a+64>>2];j=H[a+60>>2];if((c|0)==(j|0)){break k}while(1){c=c-4|0;m=H[c>>2];H[c>>2]=0;d=d-4|0;H[d>>2]=m;if((c|0)!=(j|0)){continue}break}H[a+68>>2]=e;e=H[a+64>>2];H[a+64>>2]=i;c=H[a+60>>2];H[a+60>>2]=d;if((c|0)==(e|0)){break j}while(1){e=e-4|0;d=H[e>>2];H[e>>2]=0;if(d){Ga(d)}if((c|0)!=(e|0)){continue}break}break j}sa();v()}wa();v()}H[a+68>>2]=e;H[a+64>>2]=i;H[a+60>>2]=d}if(c){oa(c)}c=H[a+64>>2]}c=H[c-4>>2];d=H[f>>2];H[f>>2]=0;if(!d){break f}Ga(d)}i=H[c+28>>2];d=i-1|0;if(d>>>0<=10){e=H[(d<<2)+13584>>2]}else{e=-1}d=H[f+32>>2]+N(l,20)|0;j=I[c+24|0];H[d+16>>2]=j;H[d+12>>2]=(e|0)>0?e:0;H[d+8>>2]=i;H[d+4>>2]=h;H[d>>2]=c;h=h+j|0;l=l+1|0;if((ea[H[H[a>>2]+24>>2]](a)|0)>(l|0)){continue}break}}a=Ac(f,f+32|0);m:{n:{o:{switch(p|0){case 0:c=wb(f+48|0,h);b=Bd(c,b,a,g);h=H[c+8>>2];xb(c);if(!b){break m}if((h|0)==(g|0)){break n}break m;case 1:c=wb(f+48|0,h);b=zd(c,b,a,g);h=H[c+8>>2];xb(c);if(!b){break m}if((h|0)==(g|0)){break n}break m;case 2:c=ub(f+48|0,h);b=yd(c,b,a,g);h=H[c+8>>2];vb(c);if(!b){break m}if((h|0)==(g|0)){break n}break m;case 3:c=ub(f+48|0,h);b=xd(c,b,a,g);h=H[c+8>>2];vb(c);if(!b){break m}if((h|0)==(g|0)){break n}break m;case 4:c=$a(f+48|0,h);b=wd(c,b,a,g);h=H[c+8>>2];ab(c);if(!b){break m}if((h|0)==(g|0)){break n}break m;case 5:c=$a(f+48|0,h);b=vd(c,b,a,g);h=H[c+8>>2];ab(c);if(!b){break m}if((h|0)==(g|0)){break n}break m;case 6:break o;default:break m}}c=$a(f+48|0,h);b=ud(c,b,a,g);h=H[c+8>>2];ab(c);if(!b|(h|0)!=(g|0)){break m}}n=1}b=H[a+16>>2];if(b){H[a+20>>2]=b;oa(b)}b=H[a>>2];if(!b){break e}H[a+4>>2]=b;oa(b)}a=H[f+32>>2];if(!a){break d}H[f+36>>2]=a;oa(a)}ca=f+704|0;return n|0}sa();v()}sa();v()}wa();v()}function Zi(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0;e=ca-32|0;ca=e;a:{b:{switch(c-2|0){case 0:c=H[a+4>>2];f=H[a+12>>2];H[e+24>>2]=-1;H[e+16>>2]=-1;H[e+20>>2]=1065353216;H[e+8>>2]=-1;H[e+12>>2]=-1;if((b|0)==-2){break a}i=H[H[H[c+4>>2]+8>>2]+(f<<2)>>2];if((ea[H[H[c>>2]+8>>2]](c)|0)==1){h=H[H[H[c+4>>2]+8>>2]+(f<<2)>>2];c:{if((ea[H[H[c>>2]+8>>2]](c)|0)!=1|b-1>>>0>5){break c}g=ea[H[H[c>>2]+36>>2]](c)|0;a=ea[H[H[c>>2]+44>>2]](c,f)|0;if(!g|!a){break c}f=ea[H[H[c>>2]+40>>2]](c,f)|0;d:{if(f){if((b|0)!=6){break c}b=H[c+44>>2];d=pa(112);H[d+4>>2]=h;c=H[e+12>>2];H[d+8>>2]=H[e+8>>2];H[d+12>>2]=c;c=H[e+20>>2];H[d+16>>2]=H[e+16>>2];H[d+20>>2]=c;H[d+24>>2]=H[e+24>>2];H[d+40>>2]=a;c=a+12|0;H[d+36>>2]=c;H[d+32>>2]=f;H[d+28>>2]=b;H[d+68>>2]=a;H[d- -64>>2]=c;H[d+60>>2]=f;H[d+56>>2]=b;H[d+48>>2]=0;H[d+52>>2]=0;H[d>>2]=7144;H[d+88>>2]=1065353216;H[d+92>>2]=-1;H[d+80>>2]=-1;H[d+84>>2]=-1;H[d+72>>2]=1;H[d+76>>2]=-1;H[d+44>>2]=7668;a=d+96|0;break d}if((b|0)!=6){break c}b=H[c+44>>2];d=pa(112);H[d+4>>2]=h;c=H[e+12>>2];H[d+8>>2]=H[e+8>>2];H[d+12>>2]=c;c=H[e+20>>2];H[d+16>>2]=H[e+16>>2];H[d+20>>2]=c;H[d+24>>2]=H[e+24>>2];H[d+40>>2]=a;c=a+12|0;H[d+36>>2]=c;H[d+32>>2]=g;H[d+28>>2]=b;H[d+68>>2]=a;H[d- -64>>2]=c;H[d+60>>2]=g;H[d+56>>2]=b;H[d+48>>2]=0;H[d+52>>2]=0;H[d>>2]=8080;H[d+88>>2]=1065353216;H[d+92>>2]=-1;H[d+80>>2]=-1;H[d+84>>2]=-1;H[d+72>>2]=1;H[d+76>>2]=-1;H[d+44>>2]=8472;a=d+96|0}H[a>>2]=0;H[a+4>>2]=0;F[a+5|0]=0;F[a+6|0]=0;F[a+7|0]=0;F[a+8|0]=0;F[a+9|0]=0;F[a+10|0]=0;F[a+11|0]=0;F[a+12|0]=0}if(d){break a}}d=pa(28);H[d+4>>2]=i;a=H[e+12>>2];H[d+8>>2]=H[e+8>>2];H[d+12>>2]=a;a=H[e+20>>2];H[d+16>>2]=H[e+16>>2];H[d+20>>2]=a;H[d+24>>2]=H[e+24>>2];H[d>>2]=8860;break a;case 1:break b;default:break a}}c=H[a+4>>2];f=H[a+12>>2];H[e+24>>2]=-1;H[e+16>>2]=-1;H[e+20>>2]=1065353216;H[e+8>>2]=-1;H[e+12>>2]=-1;if((b|0)==-2){break a}i=H[H[H[c+4>>2]+8>>2]+(f<<2)>>2];if((ea[H[H[c>>2]+8>>2]](c)|0)==1){h=H[H[H[c+4>>2]+8>>2]+(f<<2)>>2];e:{if((ea[H[H[c>>2]+8>>2]](c)|0)!=1|b-1>>>0>5){break e}g=ea[H[H[c>>2]+36>>2]](c)|0;a=ea[H[H[c>>2]+44>>2]](c,f)|0;if(!g|!a){break e}f=ea[H[H[c>>2]+40>>2]](c,f)|0;f:{if(f){if((b|0)!=6){break e}b=H[c+44>>2];d=pa(112);H[d+4>>2]=h;c=H[e+12>>2];H[d+8>>2]=H[e+8>>2];H[d+12>>2]=c;c=H[e+20>>2];H[d+16>>2]=H[e+16>>2];H[d+20>>2]=c;H[d+24>>2]=H[e+24>>2];H[d+40>>2]=a;c=a+12|0;H[d+36>>2]=c;H[d+32>>2]=f;H[d+28>>2]=b;H[d+68>>2]=a;H[d- -64>>2]=c;H[d+60>>2]=f;H[d+56>>2]=b;H[d+48>>2]=0;H[d+52>>2]=0;H[d>>2]=9028;H[d+88>>2]=1065353216;H[d+92>>2]=-1;H[d+80>>2]=-1;H[d+84>>2]=-1;H[d+72>>2]=1;H[d+76>>2]=-1;H[d+44>>2]=9592;a=d+96|0;break f}if((b|0)!=6){break e}b=H[c+44>>2];d=pa(112);H[d+4>>2]=h;c=H[e+12>>2];H[d+8>>2]=H[e+8>>2];H[d+12>>2]=c;c=H[e+20>>2];H[d+16>>2]=H[e+16>>2];H[d+20>>2]=c;H[d+24>>2]=H[e+24>>2];H[d+40>>2]=a;c=a+12|0;H[d+36>>2]=c;H[d+32>>2]=g;H[d+28>>2]=b;H[d+68>>2]=a;H[d- -64>>2]=c;H[d+60>>2]=g;H[d+56>>2]=b;H[d+48>>2]=0;H[d+52>>2]=0;H[d>>2]=10032;H[d+88>>2]=1065353216;H[d+92>>2]=-1;H[d+80>>2]=-1;H[d+84>>2]=-1;H[d+72>>2]=1;H[d+76>>2]=-1;H[d+44>>2]=10452;a=d+96|0}H[a>>2]=0;H[a+4>>2]=0;F[a+5|0]=0;F[a+6|0]=0;F[a+7|0]=0;F[a+8|0]=0;F[a+9|0]=0;F[a+10|0]=0;F[a+11|0]=0;F[a+12|0]=0}if(d){break a}}d=pa(28);H[d+4>>2]=i;a=H[e+12>>2];H[d+8>>2]=H[e+8>>2];H[d+12>>2]=a;a=H[e+20>>2];H[d+16>>2]=H[e+16>>2];H[d+20>>2]=a;H[d+24>>2]=H[e+24>>2];H[d>>2]=10864}ca=e+32|0;return d|0}function Ki(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=O(0),f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=O(0),p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0;if(H[c>>2]==H[c+4>>2]){m=H[d+80>>2];u=ca-16|0;ca=u;g=H[a+4>>2];k=I[b+24|0];h=H[d+48>>2];n=H[H[d>>2]>>2];c=u+8|0;H[c>>2]=1065353216;d=c;L[c>>2]=O(-1<<g^-1)/L[a+20>>2];c=pa(k<<2);a:{if(!m|!k){break a}p=h+n|0;o=L[d>>2];n=H[a+8>>2];v=H[b>>2];d=H[b+48>>2];g=H[b+40>>2];w=H[b+44>>2];if(!I[b+84|0]){f=H[b+68>>2];s=k&254;t=k&1;a=0;while(1){b=H[v>>2];l=Rj(g,w,H[f+(i<<2)>>2],0)+d|0;h=qa(c,b+l|0,g);b=0;q=0;if((k|0)!=1){while(1){l=p+(a<<2)|0;j=b<<2;e=O(T(O(O(o*O(L[j+h>>2]-L[n+j>>2]))+O(.5))));b:{if(O(P(e))<O(2147483648)){r=~~e;break b}r=-2147483648}H[l>>2]=r;j=j|4;e=O(T(O(O(o*O(L[j+h>>2]-L[n+j>>2]))+O(.5))));c:{if(O(P(e))<O(2147483648)){j=~~e;break c}j=-2147483648}H[l+4>>2]=j;b=b+2|0;a=a+2|0;q=q+2|0;if((s|0)!=(q|0)){continue}break}}if(t){l=p+(a<<2)|0;b=b<<2;e=O(T(O(O(o*O(L[b+h>>2]-L[b+n>>2]))+O(.5))));d:{if(O(P(e))<O(2147483648)){b=~~e;break d}b=-2147483648}H[l>>2]=b;a=a+1|0}i=i+1|0;if((m|0)!=(i|0)){continue}break}break a}s=k&254;t=k&1;a=0;while(1){b=H[v>>2];h=Rj(g,w,i,l)+d|0;j=qa(c,b+h|0,g);b=0;q=0;if((k|0)!=1){while(1){h=p+(a<<2)|0;f=b<<2;e=O(T(O(O(o*O(L[f+j>>2]-L[f+n>>2]))+O(.5))));e:{if(O(P(e))<O(2147483648)){r=~~e;break e}r=-2147483648}H[h>>2]=r;f=f|4;e=O(T(O(O(o*O(L[f+j>>2]-L[f+n>>2]))+O(.5))));f:{if(O(P(e))<O(2147483648)){f=~~e;break f}f=-2147483648}H[h+4>>2]=f;b=b+2|0;a=a+2|0;q=q+2|0;if((s|0)!=(q|0)){continue}break}}if(t){h=p+(a<<2)|0;b=b<<2;e=O(T(O(O(o*O(L[b+j>>2]-L[b+n>>2]))+O(.5))));g:{if(O(P(e))<O(2147483648)){b=~~e;break g}b=-2147483648}H[h>>2]=b;a=a+1|0}b=l;i=i+1|0;b=i?b:b+1|0;l=b;if((i|0)!=(m|0)|b){continue}break}}oa(c);ca=u+16|0;return 1}j=ca-16|0;ca=j;m=H[a+4>>2];i=I[b+24|0];g=H[d+48>>2];h=H[H[d>>2]>>2];d=j+8|0;H[d>>2]=1065353216;l=d;L[d>>2]=O(-1<<m^-1)/L[a+20>>2];d=pa(i<<2);m=H[c+4>>2];q=H[c>>2];h:{if(!i|(m|0)==(q|0)){break h}n=h+g|0;c=m-q>>2;u=c>>>0<=1?1:c;o=L[l>>2];h=H[a+8>>2];v=H[b>>2];l=H[b+48>>2];m=H[b+40>>2];w=H[b+44>>2];if(I[b+84|0]){s=i&254;t=i&1;a=0;c=0;while(1){b=H[v>>2];g=Rj(m,w,H[q+(c<<2)>>2],0)+l|0;p=qa(d,b+g|0,m);b=0;k=0;if((i|0)!=1){while(1){g=n+(a<<2)|0;f=b<<2;e=O(T(O(O(o*O(L[f+p>>2]-L[h+f>>2]))+O(.5))));i:{if(O(P(e))<O(2147483648)){r=~~e;break i}r=-2147483648}H[g>>2]=r;f=f|4;e=O(T(O(O(o*O(L[f+p>>2]-L[h+f>>2]))+O(.5))));j:{if(O(P(e))<O(2147483648)){f=~~e;break j}f=-2147483648}H[g+4>>2]=f;b=b+2|0;a=a+2|0;k=k+2|0;if((s|0)!=(k|0)){continue}break}}if(t){g=n+(a<<2)|0;b=b<<2;e=O(T(O(O(o*O(L[b+p>>2]-L[b+h>>2]))+O(.5))));k:{if(O(P(e))<O(2147483648)){b=~~e;break k}b=-2147483648}H[g>>2]=b;a=a+1|0}c=c+1|0;if((u|0)!=(c|0)){continue}break}break h}s=H[b+68>>2];t=i&254;x=i&1;a=0;c=0;while(1){b=H[v>>2];g=Rj(m,w,H[s+(H[q+(c<<2)>>2]<<2)>>2],0)+l|0;p=qa(d,b+g|0,m);b=0;k=0;if((i|0)!=1){while(1){g=n+(a<<2)|0;f=b<<2;e=O(T(O(O(o*O(L[f+p>>2]-L[h+f>>2]))+O(.5))));l:{if(O(P(e))<O(2147483648)){r=~~e;break l}r=-2147483648}H[g>>2]=r;f=f|4;e=O(T(O(O(o*O(L[f+p>>2]-L[h+f>>2]))+O(.5))));m:{if(O(P(e))<O(2147483648)){f=~~e;break m}f=-2147483648}H[g+4>>2]=f;b=b+2|0;a=a+2|0;k=k+2|0;if((t|0)!=(k|0)){continue}break}}if(x){g=n+(a<<2)|0;b=b<<2;e=O(T(O(O(o*O(L[b+p>>2]-L[b+h>>2]))+O(.5))));n:{if(O(P(e))<O(2147483648)){b=~~e;break n}b=-2147483648}H[g>>2]=b;a=a+1|0}c=c+1|0;if((u|0)!=(c|0)){continue}break}}oa(d);ca=j+16|0;return 1}function dd(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0;c=H[a+4>>2];e=H[a>>2];f=(c-e|0)/144|0;if(f>>>0<b>>>0){e=a;b=b-f|0;h=H[a+8>>2];c=H[a+4>>2];a:{if(b>>>0<=(h-c|0)/144>>>0){b:{if(!b){break b}a=c;f=b&7;if(f){while(1){Ia(a);a=a+144|0;d=d+1|0;if((f|0)!=(d|0)){continue}break}}c=N(b,144)+c|0;if((b-1&268435455)>>>0<7){break b}while(1){Ia(a);Ia(a+144|0);Ia(a+288|0);Ia(a+432|0);Ia(a+576|0);Ia(a+720|0);Ia(a+864|0);Ia(a+1008|0);a=a+1152|0;if((c|0)!=(a|0)){continue}break}}H[e+4>>2]=c;break a}c:{d:{e:{a=c;c=H[e>>2];i=(a-c|0)/144|0;a=i+b|0;if(a>>>0<29826162){c=(h-c|0)/144|0;f=c<<1;f=c>>>0>=14913080?29826161:a>>>0<f>>>0?f:a;if(f){if(f>>>0>=29826162){break e}g=pa(N(f,144))}c=N(i,144)+g|0;a=c;h=b&7;if(h){while(1){Ia(a);a=a+144|0;d=d+1|0;if((h|0)!=(d|0)){continue}break}}h=N(b,144)+c|0;if((b-1&268435455)>>>0>=7){while(1){Ia(a);Ia(a+144|0);Ia(a+288|0);Ia(a+432|0);Ia(a+576|0);Ia(a+720|0);Ia(a+864|0);Ia(a+1008|0);a=a+1152|0;if((h|0)!=(a|0)){continue}break}}b=N(f,144)+g|0;d=H[e+4>>2];f=H[e>>2];if((d|0)==(f|0)){break d}while(1){c=c-144|0;d=d-144|0;a=d;H[c>>2]=H[a>>2];H[c+4>>2]=H[a+4>>2];H[c+8>>2]=H[a+8>>2];H[c+12>>2]=H[a+12>>2];H[a+12>>2]=0;H[a+4>>2]=0;H[a+8>>2]=0;H[c+16>>2]=H[a+16>>2];H[c+20>>2]=H[a+20>>2];H[c+24>>2]=H[a+24>>2];H[a+24>>2]=0;H[a+16>>2]=0;H[a+20>>2]=0;g=I[a+28|0];H[c+40>>2]=0;H[c+32>>2]=0;H[c+36>>2]=0;F[c+28|0]=g;H[c+32>>2]=H[a+32>>2];H[c+36>>2]=H[a+36>>2];H[c+40>>2]=H[a+40>>2];H[a+40>>2]=0;H[a+32>>2]=0;H[a+36>>2]=0;H[c+52>>2]=0;H[c+44>>2]=0;H[c+48>>2]=0;H[c+44>>2]=H[a+44>>2];H[c+48>>2]=H[a+48>>2];H[c+52>>2]=H[a+52>>2];H[a+52>>2]=0;H[a+44>>2]=0;H[a+48>>2]=0;g=c- -64|0;H[g>>2]=0;H[c+56>>2]=0;H[c+60>>2]=0;H[c+56>>2]=H[a+56>>2];H[c+60>>2]=H[a+60>>2];i=g;g=a- -64|0;H[i>>2]=H[g>>2];H[g>>2]=0;H[a+56>>2]=0;H[a+60>>2]=0;H[c+68>>2]=H[a+68>>2];g=H[a+72>>2];H[c+84>>2]=0;H[c+76>>2]=0;H[c+80>>2]=0;H[c+72>>2]=g;H[c+76>>2]=H[a+76>>2];H[c+80>>2]=H[a+80>>2];H[c+84>>2]=H[a+84>>2];H[a+84>>2]=0;H[a+76>>2]=0;H[a+80>>2]=0;H[c+96>>2]=0;H[c+88>>2]=0;H[c+92>>2]=0;H[c+88>>2]=H[a+88>>2];H[c+92>>2]=H[a+92>>2];H[c+96>>2]=H[a+96>>2];H[a+96>>2]=0;H[a+88>>2]=0;H[a+92>>2]=0;g=I[a+100|0];H[c+112>>2]=0;H[c+104>>2]=0;H[c+108>>2]=0;F[c+100|0]=g;H[c+104>>2]=H[a+104>>2];H[c+108>>2]=H[a+108>>2];H[c+112>>2]=H[a+112>>2];H[a+112>>2]=0;H[a+104>>2]=0;H[a+108>>2]=0;H[c+124>>2]=0;H[c+116>>2]=0;H[c+120>>2]=0;H[c+116>>2]=H[a+116>>2];H[c+120>>2]=H[a+120>>2];H[c+124>>2]=H[a+124>>2];H[a+124>>2]=0;H[a+116>>2]=0;H[a+120>>2]=0;g=H[a+128>>2];H[c+140>>2]=0;H[c+132>>2]=0;H[c+136>>2]=0;H[c+128>>2]=g;H[c+132>>2]=H[a+132>>2];H[c+136>>2]=H[a+136>>2];H[c+140>>2]=H[a+140>>2];H[a+140>>2]=0;H[a+132>>2]=0;H[a+136>>2]=0;if((a|0)!=(f|0)){continue}break}H[e+8>>2]=b;a=H[e+4>>2];H[e+4>>2]=h;d=H[e>>2];H[e>>2]=c;if((a|0)==(d|0)){break c}while(1){b=a-144|0;c=H[b+132>>2];if(c){H[a-8>>2]=c;oa(c)}c=H[a-28>>2];if(c){H[a-24>>2]=c;oa(c)}c=H[a-40>>2];if(c){H[a-36>>2]=c;oa(c)}oc(a-140|0);a=b;if((d|0)!=(a|0)){continue}break}break c}sa();v()}wa();v()}H[e+8>>2]=b;H[e+4>>2]=h;H[e>>2]=c}if(d){oa(d)}}return}if(b>>>0<f>>>0){e=e+N(b,144)|0;if((e|0)!=(c|0)){while(1){b=c-144|0;d=H[b+132>>2];if(d){H[c-8>>2]=d;oa(d)}d=H[c-28>>2];if(d){H[c-24>>2]=d;oa(d)}d=H[c-40>>2];if(d){H[c-36>>2]=d;oa(d)}oc(c-140|0);c=b;if((e|0)!=(c|0)){continue}break}}H[a+4>>2]=e}}function Pe(a,b,c,d){var e=0,f=0,g=0,h=0,i=0,j=0;f=ca-80|0;ca=f;e=H[c+36>>2];H[f+72>>2]=H[c+32>>2];H[f+76>>2]=e;g=H[c+28>>2];e=f- -64|0;H[e>>2]=H[c+24>>2];H[e+4>>2]=g;e=H[c+20>>2];H[f+56>>2]=H[c+16>>2];H[f+60>>2]=e;e=H[c+12>>2];H[f+48>>2]=H[c+8>>2];H[f+52>>2]=e;e=H[c+4>>2];H[f+40>>2]=H[c>>2];H[f+44>>2]=e;nc(a,f+40|0,f+24|0);a:{if(H[a>>2]){break a}if(F[a+15|0]<0){oa(H[a+4>>2])}if(I[f+31|0]){b=pa(32);F[b+27|0]=0;c=I[1521]|I[1522]<<8|(I[1523]<<16|I[1524]<<24);F[b+23|0]=c;F[b+24|0]=c>>>8;F[b+25|0]=c>>>16;F[b+26|0]=c>>>24;c=I[1518]|I[1519]<<8|(I[1520]<<16|I[1521]<<24);d=I[1514]|I[1515]<<8|(I[1516]<<16|I[1517]<<24);F[b+16|0]=d;F[b+17|0]=d>>>8;F[b+18|0]=d>>>16;F[b+19|0]=d>>>24;F[b+20|0]=c;F[b+21|0]=c>>>8;F[b+22|0]=c>>>16;F[b+23|0]=c>>>24;c=I[1510]|I[1511]<<8|(I[1512]<<16|I[1513]<<24);d=I[1506]|I[1507]<<8|(I[1508]<<16|I[1509]<<24);F[b+8|0]=d;F[b+9|0]=d>>>8;F[b+10|0]=d>>>16;F[b+11|0]=d>>>24;F[b+12|0]=c;F[b+13|0]=c>>>8;F[b+14|0]=c>>>16;F[b+15|0]=c>>>24;c=I[1502]|I[1503]<<8|(I[1504]<<16|I[1505]<<24);d=I[1498]|I[1499]<<8|(I[1500]<<16|I[1501]<<24);F[b|0]=d;F[b+1|0]=d>>>8;F[b+2|0]=d>>>16;F[b+3|0]=d>>>24;F[b+4|0]=c;F[b+5|0]=c>>>8;F[b+6|0]=c>>>16;F[b+7|0]=c>>>24;H[a>>2]=-1;za(a+4|0,b,27);oa(b);break a}i=ca-16|0;ca=i;b:{c:{switch(F[f+32|0]){case 0:e=pa(44);H[e>>2]=0;H[e+4>>2]=0;H[e+40>>2]=0;H[e+32>>2]=0;H[e+36>>2]=0;H[e+24>>2]=0;H[e+28>>2]=0;H[e+16>>2]=0;H[e+20>>2]=0;H[e+8>>2]=0;H[e+12>>2]=0;e=Vc(e);H[e>>2]=13496;H[f+8>>2]=0;H[f+12>>2]=0;H[f>>2]=0;H[f+4>>2]=0;H[f+16>>2]=e;break b;case 1:e=pa(44);H[e>>2]=0;H[e+4>>2]=0;H[e+40>>2]=0;H[e+32>>2]=0;H[e+36>>2]=0;H[e+24>>2]=0;H[e+28>>2]=0;H[e+16>>2]=0;H[e+20>>2]=0;H[e+8>>2]=0;H[e+12>>2]=0;e=Vc(e);H[e>>2]=13404;H[f+8>>2]=0;H[f+12>>2]=0;H[f>>2]=0;H[f+4>>2]=0;H[f+16>>2]=e;break b;default:break c}}g=pa(32);F[g+28|0]=0;e=I[1550]|I[1551]<<8|(I[1552]<<16|I[1553]<<24);F[g+24|0]=e;F[g+25|0]=e>>>8;F[g+26|0]=e>>>16;F[g+27|0]=e>>>24;e=I[1546]|I[1547]<<8|(I[1548]<<16|I[1549]<<24);h=I[1542]|I[1543]<<8|(I[1544]<<16|I[1545]<<24);F[g+16|0]=h;F[g+17|0]=h>>>8;F[g+18|0]=h>>>16;F[g+19|0]=h>>>24;F[g+20|0]=e;F[g+21|0]=e>>>8;F[g+22|0]=e>>>16;F[g+23|0]=e>>>24;e=I[1538]|I[1539]<<8|(I[1540]<<16|I[1541]<<24);h=I[1534]|I[1535]<<8|(I[1536]<<16|I[1537]<<24);F[g+8|0]=h;F[g+9|0]=h>>>8;F[g+10|0]=h>>>16;F[g+11|0]=h>>>24;F[g+12|0]=e;F[g+13|0]=e>>>8;F[g+14|0]=e>>>16;F[g+15|0]=e>>>24;e=I[1530]|I[1531]<<8|(I[1532]<<16|I[1533]<<24);h=I[1526]|I[1527]<<8|(I[1528]<<16|I[1529]<<24);F[g|0]=h;F[g+1|0]=h>>>8;F[g+2|0]=h>>>16;F[g+3|0]=h>>>24;F[g+4|0]=e;F[g+5|0]=e>>>8;F[g+6|0]=e>>>16;F[g+7|0]=e>>>24;H[i>>2]=-1;e=i|4;za(e,g,28);j=F[i+15|0];H[f>>2]=H[i>>2];h=f+4|0;d:{if((j|0)>=0){j=H[e+4>>2];H[h>>2]=H[e>>2];H[h+4>>2]=j;H[h+8>>2]=H[e+8>>2];H[f+16>>2]=0;break d}za(h,H[i+4>>2],H[i+8>>2]);e=F[i+15|0];H[f+16>>2]=0;if((e|0)>=0){break d}oa(H[i+4>>2])}oa(g)}ca=i+16|0;e=H[f>>2];e:{if(e){H[a>>2]=e;a=a+4|0;if(F[f+15|0]>=0){b=f|4;c=H[b+4>>2];H[a>>2]=H[b>>2];H[a+4>>2]=c;H[a+8>>2]=H[b+8>>2];break e}za(a,H[f+4>>2],H[f+8>>2]);break e}e=H[f+16>>2];H[f+16>>2]=0;te(a,e,b,c,d);if(!H[a>>2]){if(F[a+15|0]<0){oa(H[a+4>>2])}H[a>>2]=0;H[a+4>>2]=0;H[a+8>>2]=0;H[a+12>>2]=0}ea[H[H[e>>2]+4>>2]](e)}a=H[f+16>>2];H[f+16>>2]=0;if(a){ea[H[H[a>>2]+4>>2]](a)}if(F[f+15|0]>=0){break a}oa(H[f+4>>2])}ca=f+80|0}function Ic(a){var b=0,c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;H[a+56>>2]=H[a+52>>2];H[a+44>>2]=H[a+40>>2];b=H[a+64>>2];c=H[b+24>>2];if((c|0)==H[b+28>>2]){return 1}a:{b:{c:{while(1){g=i;i=H[(k<<2)+c>>2];d:{if((i|0)==-1){i=g;break d}b=H[a+56>>2];e:{if((b|0)!=H[a+60>>2]){H[b>>2]=g;H[a+56>>2]=b+4;break e}d=H[a+52>>2];e=b-d|0;h=e>>2;c=h+1|0;if(c>>>0>=1073741824){break c}f=e>>>1|0;f=e>>>0>=2147483644?1073741823:c>>>0<f>>>0?f:c;if(f){if(f>>>0>=1073741824){break b}e=pa(f<<2)}else{e=0}c=e+(h<<2)|0;H[c>>2]=g;h=c+4|0;if((b|0)!=(d|0)){while(1){c=c-4|0;b=b-4|0;H[c>>2]=H[b>>2];if((b|0)!=(d|0)){continue}break}}H[a+60>>2]=e+(f<<2);H[a+56>>2]=h;H[a+52>>2]=c;if(!d){break e}oa(d)}f:{g:{if(!(H[H[a+12>>2]+(k>>>3&536870908)>>2]>>>k&1)){break g}e=i+1|0;e=(e>>>0)%3|0?e:i-2|0;if((e|0)==-1|H[H[a>>2]+(e>>>3&536870908)>>2]>>>e&1){break g}e=H[H[H[a+64>>2]+12>>2]+(e<<2)>>2];if((e|0)==-1){break g}b=e+1|0;b=(b>>>0)%3|0?b:e-2|0;if((b|0)==-1){break g}c=H[a+64>>2];f=H[a>>2];while(1){e=b;b=-1;d=e+1|0;d=(d>>>0)%3|0?d:e-2|0;h:{if((d|0)==-1|H[f+(d>>>3&536870908)>>2]>>>d&1){break h}d=H[H[c+12>>2]+(d<<2)>>2];if((d|0)==-1){break h}b=d+1|0;b=(b>>>0)%3|0?b:d-2|0}if((b|0)!=(i|0)){if((b|0)==-1){break f}continue}break}return 0}e=i}H[H[a+28>>2]+(e<<2)>>2]=g;b=H[a+44>>2];i:{if((b|0)!=H[a+48>>2]){H[b>>2]=e;H[a+44>>2]=b+4;break i}d=H[a+40>>2];i=b-d|0;h=i>>2;c=h+1|0;if(c>>>0>=1073741824){break a}f=i>>>1|0;f=i>>>0>=2147483644?1073741823:c>>>0<f>>>0?f:c;if(f){if(f>>>0>=1073741824){break b}i=pa(f<<2)}else{i=0}c=i+(h<<2)|0;H[c>>2]=e;h=c+4|0;if((b|0)!=(d|0)){while(1){c=c-4|0;b=b-4|0;H[c>>2]=H[b>>2];if((b|0)!=(d|0)){continue}break}}H[a+48>>2]=i+(f<<2);H[a+44>>2]=h;H[a+40>>2]=c;if(!d){break i}oa(d)}i=g+1|0;b=H[a+64>>2];if((e|0)==-1){break d}j:{if((e>>>0)%3|0){c=e-1|0;break j}c=e+2|0;if((c|0)==-1){break d}}d=H[H[b+12>>2]+(c<<2)>>2];if((d|0)==-1){break d}f=d+((d>>>0)%3|0?-1:2)|0;if((f|0)==-1|(e|0)==(f|0)){break d}while(1){b=f+1|0;b=(b>>>0)%3|0?b:f-2|0;if(H[H[a>>2]+(b>>>3&536870908)>>2]>>>b&1){b=H[a+56>>2];k:{if((b|0)!=H[a+60>>2]){H[b>>2]=i;H[a+56>>2]=b+4;break k}d=H[a+52>>2];g=b-d|0;j=g>>2;c=j+1|0;if(c>>>0>=1073741824){break c}h=g>>>1|0;h=g>>>0>=2147483644?1073741823:c>>>0<h>>>0?h:c;if(h){if(h>>>0>=1073741824){break b}g=pa(h<<2)}else{g=0}c=g+(j<<2)|0;H[c>>2]=i;j=c+4|0;if((b|0)!=(d|0)){while(1){c=c-4|0;b=b-4|0;H[c>>2]=H[b>>2];if((b|0)!=(d|0)){continue}break}}H[a+60>>2]=g+(h<<2);H[a+56>>2]=j;H[a+52>>2]=c;if(!d){break k}oa(d)}d=i+1|0;b=H[a+44>>2];l:{if((b|0)!=H[a+48>>2]){H[b>>2]=f;H[a+44>>2]=b+4;break l}h=H[a+40>>2];g=b-h|0;l=g>>2;c=l+1|0;if(c>>>0>=1073741824){break a}j=g>>>1|0;j=g>>>0>=2147483644?1073741823:c>>>0<j>>>0?j:c;if(j){if(j>>>0>=1073741824){break b}g=pa(j<<2)}else{g=0}c=g+(l<<2)|0;H[c>>2]=f;l=c+4|0;if((b|0)!=(h|0)){while(1){c=c-4|0;b=b-4|0;H[c>>2]=H[b>>2];if((b|0)!=(h|0)){continue}break}}H[a+48>>2]=g+(j<<2);H[a+44>>2]=l;H[a+40>>2]=c;if(!h){break l}oa(h)}g=i;i=d}H[H[a+28>>2]+(f<<2)>>2]=g;b=H[a+64>>2];m:{if((f>>>0)%3|0){c=f-1|0;break m}c=f+2|0;if((c|0)==-1){break d}}d=H[H[b+12>>2]+(c<<2)>>2];if((d|0)==-1){break d}f=d+((d>>>0)%3|0?-1:2)|0;if((f|0)==-1){break d}if((e|0)!=(f|0)){continue}break}}k=k+1|0;c=H[b+24>>2];if(k>>>0<H[b+28>>2]-c>>2>>>0){continue}break}return 1}sa();v()}wa();v()}sa();v()}function ti(a){a=a|0;var b=0,c=0,d=0,e=0;c=H[a+32>>2];d=H[c+16>>2];e=H[c+12>>2];b=H[c+20>>2];if(K[c+8>>2]>d>>>0&(e|0)>=(b|0)|(b|0)<(e|0)){e=I[H[c>>2]+d|0];d=d+1|0;b=d?b:b+1|0;H[c+16>>2]=d;H[c+20>>2]=b;b=H[a+48>>2];H[a+48>>2]=0;if(b){ea[H[H[b>>2]+4>>2]](b)}a:{b:{c:{d:{switch(e|0){case 0:b=pa(384);H[b>>2]=11384;ra(b+4|0,0,80);H[b+96>>2]=0;H[b+100>>2]=0;H[b+92>>2]=-1;H[b+84>>2]=-1;H[b+88>>2]=-1;H[b+104>>2]=0;H[b+108>>2]=0;H[b+112>>2]=0;H[b+116>>2]=0;H[b+120>>2]=0;H[b+124>>2]=0;H[b+128>>2]=0;H[b+132>>2]=0;H[b+136>>2]=0;H[b+140>>2]=0;H[b+144>>2]=0;H[b+148>>2]=0;H[b+156>>2]=0;H[b+160>>2]=0;H[b+152>>2]=1065353216;H[b+164>>2]=0;H[b+168>>2]=0;H[b+172>>2]=0;H[b+176>>2]=0;H[b+180>>2]=0;H[b+184>>2]=0;H[b+188>>2]=0;H[b+192>>2]=0;H[b+196>>2]=0;H[b+200>>2]=0;H[b+204>>2]=0;H[b+208>>2]=0;H[b+212>>2]=-1;H[b+216>>2]=0;H[b+220>>2]=0;H[b+224>>2]=0;Ha(b+232|0);Ha(b+272|0);c=b+312|0;H[c>>2]=0;H[c+4>>2]=0;F[c+5|0]=0;F[c+6|0]=0;F[c+7|0]=0;F[c+8|0]=0;F[c+9|0]=0;F[c+10|0]=0;F[c+11|0]=0;F[c+12|0]=0;Ha(b+328|0);H[b+376>>2]=0;H[b+368>>2]=0;H[b+372>>2]=0;break c;case 1:b=pa(424);H[b>>2]=11436;ra(b+4|0,0,80);H[b+96>>2]=0;H[b+100>>2]=0;H[b+92>>2]=-1;H[b+84>>2]=-1;H[b+88>>2]=-1;H[b+104>>2]=0;H[b+108>>2]=0;H[b+112>>2]=0;H[b+116>>2]=0;H[b+120>>2]=0;H[b+124>>2]=0;H[b+128>>2]=0;H[b+132>>2]=0;H[b+136>>2]=0;H[b+140>>2]=0;H[b+144>>2]=0;H[b+148>>2]=0;H[b+156>>2]=0;H[b+160>>2]=0;H[b+152>>2]=1065353216;H[b+164>>2]=0;H[b+168>>2]=0;H[b+172>>2]=0;H[b+176>>2]=0;H[b+180>>2]=0;H[b+184>>2]=0;H[b+188>>2]=0;H[b+192>>2]=0;H[b+196>>2]=0;H[b+200>>2]=0;H[b+204>>2]=0;H[b+208>>2]=0;H[b+212>>2]=-1;H[b+216>>2]=0;H[b+220>>2]=0;H[b+224>>2]=0;Ha(b+232|0);Ha(b+272|0);c=b+312|0;H[c>>2]=0;H[c+4>>2]=0;F[c+5|0]=0;F[c+6|0]=0;F[c+7|0]=0;F[c+8|0]=0;F[c+9|0]=0;F[c+10|0]=0;F[c+11|0]=0;F[c+12|0]=0;Ha(b+328|0);H[b+392>>2]=0;H[b+396>>2]=0;H[b+384>>2]=0;H[b+388>>2]=0;H[b+376>>2]=0;H[b+380>>2]=0;H[b+368>>2]=0;H[b+372>>2]=0;c=b+400|0;H[c>>2]=0;H[c+4>>2]=0;F[c+5|0]=0;F[c+6|0]=0;F[c+7|0]=0;F[c+8|0]=0;F[c+9|0]=0;F[c+10|0]=0;F[c+11|0]=0;F[c+12|0]=0;H[b+416>>2]=-1;H[b+420>>2]=-1;break c;case 2:break d;default:break b}}b=pa(440);H[b>>2]=11484;ra(b+4|0,0,80);H[b+96>>2]=0;H[b+100>>2]=0;H[b+92>>2]=-1;H[b+84>>2]=-1;H[b+88>>2]=-1;H[b+104>>2]=0;H[b+108>>2]=0;H[b+112>>2]=0;H[b+116>>2]=0;H[b+120>>2]=0;H[b+124>>2]=0;H[b+128>>2]=0;H[b+132>>2]=0;H[b+136>>2]=0;H[b+140>>2]=0;H[b+144>>2]=0;H[b+148>>2]=0;H[b+156>>2]=0;H[b+160>>2]=0;H[b+152>>2]=1065353216;H[b+164>>2]=0;H[b+168>>2]=0;H[b+172>>2]=0;H[b+176>>2]=0;H[b+180>>2]=0;H[b+184>>2]=0;H[b+188>>2]=0;H[b+192>>2]=0;H[b+196>>2]=0;H[b+200>>2]=0;H[b+204>>2]=0;H[b+208>>2]=0;H[b+212>>2]=-1;H[b+216>>2]=0;H[b+220>>2]=0;H[b+224>>2]=0;Ha(b+232|0);Ha(b+272|0);c=b+312|0;H[c>>2]=0;H[c+4>>2]=0;F[c+5|0]=0;F[c+6|0]=0;F[c+7|0]=0;F[c+8|0]=0;F[c+9|0]=0;F[c+10|0]=0;F[c+11|0]=0;F[c+12|0]=0;Ha(b+328|0);H[b+392>>2]=0;H[b+396>>2]=0;H[b+384>>2]=0;H[b+388>>2]=0;H[b+376>>2]=0;H[b+380>>2]=0;H[b+368>>2]=0;H[b+372>>2]=0;H[b+416>>2]=0;H[b+420>>2]=0;H[b+408>>2]=2;H[b+412>>2]=7;H[b+400>>2]=-1;H[b+404>>2]=-1;H[b+424>>2]=0;H[b+428>>2]=0;H[b+432>>2]=0;H[b+436>>2]=0}c=H[a+48>>2];H[a+48>>2]=b;if(!c){break a}ea[H[H[c>>2]+4>>2]](c)}b=H[a+48>>2];if(b){break a}return 0}a=ea[H[H[b>>2]+8>>2]](b,a)|0}else{a=0}return a|0}function Lb(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0;f=ca-96|0;ca=f;e=H[a+16>>2];F[f+92|0]=1;H[f+88>>2]=b;H[f+84>>2]=b;H[f+80>>2]=e;a:{if((b|0)==-1){break a}j=H[a+20>>2];d=H[j>>2];e=H[H[e>>2]+(b<<2)>>2];if(e>>>0>=H[j+4>>2]-d>>2>>>0){break a}e=H[H[a+8>>2]+(H[d+(e<<2)>>2]<<2)>>2];d=H[a+4>>2];if(!I[d+84|0]){e=H[H[d+68>>2]+(e<<2)>>2]}H[f+72>>2]=0;H[f+76>>2]=0;j=f- -64|0;H[j>>2]=0;H[j+4>>2]=0;H[f+56>>2]=0;H[f+60>>2]=0;Sa(d,e,F[d+24|0],f+56|0);e=b+1|0;j=(e>>>0)%3|0?e:b-2|0;n=((b>>>0)%3|0?-1:2)+b|0;b:{c:{while(1){d=j;e=n;d:{if(!H[a+28>>2]){break d}e=b+1|0;d=(e>>>0)%3|0?e:b-2|0;e=b-1|0;if((b>>>0)%3|0){break d}e=b+2|0}if((d|0)==-1){break b}m=H[a+20>>2];b=H[m>>2];d=H[H[H[a+16>>2]>>2]+(d<<2)>>2];if(d>>>0>=H[m+4>>2]-b>>2>>>0){break b}d=H[H[a+8>>2]+(H[(d<<2)+b>>2]<<2)>>2];b=H[a+4>>2];if(!I[b+84|0]){d=H[H[b+68>>2]+(d<<2)>>2]}H[f+48>>2]=0;H[f+52>>2]=0;H[f+40>>2]=0;H[f+44>>2]=0;H[f+32>>2]=0;H[f+36>>2]=0;Sa(b,d,F[b+24|0],f+32|0);if((e|0)==-1){break c}d=H[a+20>>2];b=H[d>>2];e=H[H[H[a+16>>2]>>2]+(e<<2)>>2];if(e>>>0>=H[d+4>>2]-b>>2>>>0){break c}d=H[H[a+8>>2]+(H[b+(e<<2)>>2]<<2)>>2];b=H[a+4>>2];if(!I[b+84|0]){d=H[H[b+68>>2]+(d<<2)>>2]}H[f+24>>2]=0;H[f+28>>2]=0;H[f+16>>2]=0;H[f+20>>2]=0;H[f+8>>2]=0;H[f+12>>2]=0;Sa(b,d,F[b+24|0],f+8|0);g=H[f+8>>2];b=H[f+56>>2];d=g-b|0;p=H[f+60>>2];t=H[f+12>>2]-(p+(b>>>0>g>>>0)|0)|0;i=H[f+40>>2];e=H[f+64>>2];m=i-e|0;u=H[f+68>>2];y=H[f+44>>2]-(u+(e>>>0>i>>>0)|0)|0;g=Rj(d,t,m,y);w=o-g|0;x=h-(da+(g>>>0>o>>>0)|0)|0;h=w;i=H[f+16>>2];g=i-e|0;u=H[f+20>>2]-((e>>>0>i>>>0)+u|0)|0;k=H[f+32>>2];i=k-b|0;w=H[f+36>>2]-((b>>>0>k>>>0)+p|0)|0;b=Rj(g,u,i,w);o=h+b|0;h=da+x|0;h=b>>>0>o>>>0?h+1|0:h;b=l;l=d;p=t;k=H[f+48>>2];e=H[f+72>>2];d=k-e|0;t=H[f+76>>2];x=H[f+52>>2]-(t+(e>>>0>k>>>0)|0)|0;l=Rj(l,p,d,x);k=b+l|0;b=da+q|0;b=k>>>0<l>>>0?b+1|0:b;l=H[f+24>>2];p=l-e|0;e=H[f+28>>2]-((e>>>0>l>>>0)+t|0)|0;q=Rj(p,e,i,w);l=k-q|0;q=b-(da+(k>>>0<q>>>0)|0)|0;b=Rj(g,u,d,x);d=r-b|0;b=s-(da+(b>>>0>r>>>0)|0)|0;s=Rj(p,e,m,y);r=s+d|0;b=da+b|0;s=r>>>0<s>>>0?b+1|0:b;uc(f+80|0);b=H[f+88>>2];if((b|0)!=-1){continue}break}b=s>>31;e=b^r;d=e-b|0;b=(b^s)-((b>>>0>e>>>0)+b|0)|0;n=-1;e=2147483647;m=q>>31;g=m;i=g^l;j=i-g|0;m=(g^q)-((i>>>0<g>>>0)+g|0)|0;i=m;k=j^-1;g=i^2147483647;m=h;e:{f:{if(!H[a+28>>2]){if((b|0)==(g|0)&d>>>0>k>>>0|b>>>0>g>>>0){break e}b=b+i|0;a=d+j|0;b=a>>>0<j>>>0?b+1|0:b;e=a;g=h;a=g>>31;d=a;n=d^o;a=n-d|0;h=a;d=(d^g)-((d>>>0>n>>>0)+d|0)|0;a=a+e|0;d=d^2147483647;h=(d|0)==(b|0)&(h^-1)>>>0<e>>>0|b>>>0>d>>>0;a=h?-1:a;if(!(h&0)&(a|0)<=536870912|(a|0)<536870912){break e}b=0;a=a>>>29|0;break f}g:{if((b|0)==(g|0)&d>>>0>k>>>0|b>>>0>g>>>0){break g}b=b+i|0;a=d+j|0;b=a>>>0<j>>>0?b+1|0:b;k=h;h=h>>31;g=h;i=g^o;h=i-g|0;j=(g^k)-((g>>>0>i>>>0)+g|0)|0;g=j^2147483647;d=a;a=h;if((g|0)==(b|0)&d>>>0>(a^-1)>>>0|b>>>0>g>>>0){break g}b=b+j|0;n=a+d|0;b=n>>>0<a>>>0?b+1|0:b;e=b;if(!b&n>>>0<536870913){break e}}b=e>>>29|0;a=(e&536870911)<<3|n>>>29}o=Sj(o,m,a,b);l=Sj(l,q,a,b);r=Sj(r,s,a,b)}H[c+8>>2]=o;H[c+4>>2]=l;H[c>>2]=r;ca=f+96|0;return}Ca();v()}Ca();v()}Ca();v()}function Wd(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0;a:{if((b|0)<0){break a}c=H[a+12>>2];d=H[a+8>>2];if(c-d>>2>>>0<=b>>>0){break a}d=d+(b<<2)|0;e=H[d>>2];i=H[e+60>>2];f=H[e+56>>2];e=d+4|0;if((e|0)!=(c|0)){while(1){h=H[e>>2];H[e>>2]=0;g=H[d>>2];H[d>>2]=h;if(g){Ga(g)}d=d+4|0;e=e+4|0;if((e|0)!=(c|0)){continue}break}c=H[a+12>>2]}if((c|0)!=(d|0)){while(1){c=c-4|0;e=H[c>>2];H[c>>2]=0;if(e){Ga(e)}if((c|0)!=(d|0)){continue}break}}H[a+12>>2]=d;g=H[a+4>>2];b:{if(!g|(i|0)<0){break b}c=H[g+24>>2];d=H[g+28>>2];if((c|0)==(d|0)){break b}while(1){if((i|0)==H[H[c>>2]+24>>2]){d=c+4|0;i=H[g+28>>2];if((d|0)!=(i|0)){while(1){h=H[d>>2];H[d>>2]=0;e=H[c>>2];H[c>>2]=h;if(e){Ra(e+12|0,H[e+16>>2]);Qa(e,H[e+4>>2]);oa(e)}c=c+4|0;d=d+4|0;if((i|0)!=(d|0)){continue}break}d=H[g+28>>2]}if((c|0)!=(d|0)){while(1){d=d-4|0;e=H[d>>2];H[d>>2]=0;if(e){Ra(e+12|0,H[e+16>>2]);Qa(e,H[e+4>>2]);oa(e)}if((c|0)!=(d|0)){continue}break}}H[g+28>>2]=c;break b}c=c+4|0;if((d|0)!=(c|0)){continue}break}}c:{if((f|0)>4){break c}d:{e=N(f,12)+a|0;c=H[e+20>>2];d=H[e+24>>2];if((c|0)==(d|0)){break d}while(1){if(H[c>>2]==(b|0)){break d}c=c+4|0;if((d|0)!=(c|0)){continue}break}break c}if((c|0)==(d|0)){break c}f=c;c=c+4|0;va(f,c,d-c|0);H[e+24>>2]=d-4}c=H[a+24>>2];d=H[a+20>>2];e:{if((c|0)==(d|0)){break e}e=c-d|0;c=e>>2;g=c>>>0<=1?1:c;i=g&1;c=0;if(e>>>0>=8){g=g&-2;e=0;while(1){f=c<<2;h=f+d|0;j=H[h>>2];if((j|0)>(b|0)){H[h>>2]=j-1}f=d+(f|4)|0;h=H[f>>2];if((h|0)>(b|0)){H[f>>2]=h-1}c=c+2|0;e=e+2|0;if((g|0)!=(e|0)){continue}break}}if(!i){break e}c=d+(c<<2)|0;d=H[c>>2];if((d|0)<=(b|0)){break e}H[c>>2]=d-1}c=H[a+36>>2];d=H[a+32>>2];f:{if((c|0)==(d|0)){break f}e=c-d|0;c=e>>2;g=c>>>0<=1?1:c;i=g&1;c=0;if(e>>>0>=8){g=g&-2;e=0;while(1){f=c<<2;h=f+d|0;j=H[h>>2];if((j|0)>(b|0)){H[h>>2]=j-1}f=d+(f|4)|0;h=H[f>>2];if((h|0)>(b|0)){H[f>>2]=h-1}c=c+2|0;e=e+2|0;if((g|0)!=(e|0)){continue}break}}if(!i){break f}c=d+(c<<2)|0;d=H[c>>2];if((d|0)<=(b|0)){break f}H[c>>2]=d-1}c=H[a+48>>2];d=H[a+44>>2];g:{if((c|0)==(d|0)){break g}e=c-d|0;c=e>>2;g=c>>>0<=1?1:c;i=g&1;c=0;if(e>>>0>=8){g=g&-2;e=0;while(1){f=c<<2;h=f+d|0;j=H[h>>2];if((j|0)>(b|0)){H[h>>2]=j-1}f=d+(f|4)|0;h=H[f>>2];if((h|0)>(b|0)){H[f>>2]=h-1}c=c+2|0;e=e+2|0;if((g|0)!=(e|0)){continue}break}}if(!i){break g}c=d+(c<<2)|0;d=H[c>>2];if((d|0)<=(b|0)){break g}H[c>>2]=d-1}c=H[a+60>>2];d=H[a+56>>2];h:{if((c|0)==(d|0)){break h}e=c-d|0;c=e>>2;g=c>>>0<=1?1:c;i=g&1;c=0;if(e>>>0>=8){g=g&-2;e=0;while(1){f=c<<2;h=f+d|0;j=H[h>>2];if((j|0)>(b|0)){H[h>>2]=j-1}f=d+(f|4)|0;h=H[f>>2];if((h|0)>(b|0)){H[f>>2]=h-1}c=c+2|0;e=e+2|0;if((g|0)!=(e|0)){continue}break}}if(!i){break h}c=d+(c<<2)|0;d=H[c>>2];if((d|0)<=(b|0)){break h}H[c>>2]=d-1}c=H[a+72>>2];a=H[a+68>>2];if((c|0)==(a|0)){break a}d=c-a|0;c=d>>2;e=c>>>0<=1?1:c;g=e&1;c=0;if(d>>>0>=8){d=e&-2;e=0;while(1){i=c<<2;f=i+a|0;h=H[f>>2];if((h|0)>(b|0)){H[f>>2]=h-1}i=a+(i|4)|0;f=H[i>>2];if((f|0)>(b|0)){H[i>>2]=f-1}c=c+2|0;e=e+2|0;if((d|0)!=(e|0)){continue}break}}if(!g){break a}f=b;a=a+(c<<2)|0;b=H[a>>2];if((f|0)>=(b|0)){break a}H[a>>2]=b-1}}function oa(a){a=a|0;var b=0,c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0;a:{if(!a){break a}d=a-8|0;b=H[a-4>>2];a=b&-8;f=d+a|0;b:{if(b&1){break b}if(!(b&3)){break a}b=H[d>>2];d=d-b|0;if(d>>>0<K[4302]){break a}a=a+b|0;if(H[4303]!=(d|0)){if(b>>>0<=255){e=H[d+8>>2];b=b>>>3|0;c=H[d+12>>2];if((c|0)==(e|0)){i=17192,j=H[4298]&Vj(b),H[i>>2]=j;break b}H[e+12>>2]=c;H[c+8>>2]=e;break b}h=H[d+24>>2];b=H[d+12>>2];c:{if((d|0)!=(b|0)){c=H[d+8>>2];H[c+12>>2]=b;H[b+8>>2]=c;break c}d:{e=d+20|0;c=H[e>>2];if(c){break d}e=d+16|0;c=H[e>>2];if(c){break d}b=0;break c}while(1){g=e;b=c;e=b+20|0;c=H[e>>2];if(c){continue}e=b+16|0;c=H[b+16>>2];if(c){continue}break}H[g>>2]=0}if(!h){break b}e=H[d+28>>2];c=(e<<2)+17496|0;e:{if(H[c>>2]==(d|0)){H[c>>2]=b;if(b){break e}i=17196,j=H[4299]&Vj(e),H[i>>2]=j;break b}H[h+(H[h+16>>2]==(d|0)?16:20)>>2]=b;if(!b){break b}}H[b+24>>2]=h;c=H[d+16>>2];if(c){H[b+16>>2]=c;H[c+24>>2]=b}c=H[d+20>>2];if(!c){break b}H[b+20>>2]=c;H[c+24>>2]=b;break b}b=H[f+4>>2];if((b&3)!=3){break b}H[4300]=a;H[f+4>>2]=b&-2;H[d+4>>2]=a|1;H[a+d>>2]=a;return}if(d>>>0>=f>>>0){break a}b=H[f+4>>2];if(!(b&1)){break a}f:{if(!(b&2)){if(H[4304]==(f|0)){H[4304]=d;a=H[4301]+a|0;H[4301]=a;H[d+4>>2]=a|1;if(H[4303]!=(d|0)){break a}H[4300]=0;H[4303]=0;return}if(H[4303]==(f|0)){H[4303]=d;a=H[4300]+a|0;H[4300]=a;H[d+4>>2]=a|1;H[a+d>>2]=a;return}a=(b&-8)+a|0;g:{if(b>>>0<=255){e=H[f+8>>2];b=b>>>3|0;c=H[f+12>>2];if((c|0)==(e|0)){i=17192,j=H[4298]&Vj(b),H[i>>2]=j;break g}H[e+12>>2]=c;H[c+8>>2]=e;break g}h=H[f+24>>2];b=H[f+12>>2];h:{if((f|0)!=(b|0)){c=H[f+8>>2];H[c+12>>2]=b;H[b+8>>2]=c;break h}i:{e=f+20|0;c=H[e>>2];if(c){break i}e=f+16|0;c=H[e>>2];if(c){break i}b=0;break h}while(1){g=e;b=c;e=b+20|0;c=H[e>>2];if(c){continue}e=b+16|0;c=H[b+16>>2];if(c){continue}break}H[g>>2]=0}if(!h){break g}e=H[f+28>>2];c=(e<<2)+17496|0;j:{if(H[c>>2]==(f|0)){H[c>>2]=b;if(b){break j}i=17196,j=H[4299]&Vj(e),H[i>>2]=j;break g}H[h+(H[h+16>>2]==(f|0)?16:20)>>2]=b;if(!b){break g}}H[b+24>>2]=h;c=H[f+16>>2];if(c){H[b+16>>2]=c;H[c+24>>2]=b}c=H[f+20>>2];if(!c){break g}H[b+20>>2]=c;H[c+24>>2]=b}H[d+4>>2]=a|1;H[a+d>>2]=a;if(H[4303]!=(d|0)){break f}H[4300]=a;return}H[f+4>>2]=b&-2;H[d+4>>2]=a|1;H[a+d>>2]=a}if(a>>>0<=255){b=(a&-8)+17232|0;c=H[4298];a=1<<(a>>>3);k:{if(!(c&a)){H[4298]=a|c;a=b;break k}a=H[b+8>>2]}H[b+8>>2]=d;H[a+12>>2]=d;H[d+12>>2]=b;H[d+8>>2]=a;return}e=31;if(a>>>0<=16777215){b=Q(a>>>8|0);e=((a>>>38-b&1)-(b<<1)|0)+62|0}H[d+28>>2]=e;H[d+16>>2]=0;H[d+20>>2]=0;g=(e<<2)+17496|0;l:{m:{c=H[4299];b=1<<e;n:{if(!(c&b)){H[4299]=b|c;H[g>>2]=d;H[d+24>>2]=g;break n}e=a<<((e|0)!=31?25-(e>>>1|0)|0:0);b=H[g>>2];while(1){c=b;if((H[b+4>>2]&-8)==(a|0)){break m}b=e>>>29|0;e=e<<1;g=c+(b&4)|0;b=H[g+16>>2];if(b){continue}break}H[g+16>>2]=d;H[d+24>>2]=c}H[d+12>>2]=d;H[d+8>>2]=d;break l}a=H[c+8>>2];H[a+12>>2]=d;H[c+8>>2]=d;H[d+24>>2]=0;H[d+12>>2]=c;H[d+8>>2]=a}a=H[4306]-1|0;H[4306]=a?a:-1}}function tj(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0;H[a+8>>2]=e;n=a+32|0;h=H[n>>2];f=H[a+36>>2]-h>>2;a:{if(f>>>0<e>>>0){ya(n,e-f|0);d=H[a+8>>2];break a}d=e;if(d>>>0>=f>>>0){break a}H[a+36>>2]=h+(e<<2);d=e}s=H[a+52>>2];p=H[a+48>>2];f=0;h=e>>>0>1073741823?-1:e<<2;m=ra(pa(h),0,h);b:{if((d|0)<=0){break b}g=H[a+32>>2];while(1){d=f<<2;h=H[d+m>>2];j=H[a+16>>2];c:{if((h|0)>(j|0)){H[d+g>>2]=j;break c}d=d+g|0;j=H[a+12>>2];if((j|0)>(h|0)){H[d>>2]=j;break c}H[d>>2]=h}d=H[a+8>>2];f=f+1|0;if((d|0)>(f|0)){continue}break}if((d|0)<=0){break b}f=0;while(1){h=f<<2;d=h+c|0;h=H[b+h>>2]+H[g+h>>2]|0;H[d>>2]=h;d:{if((h|0)>H[a+16>>2]){i=h-H[a+20>>2]|0}else{if((h|0)>=H[a+12>>2]){break d}i=h+H[a+20>>2]|0}H[d>>2]=i}d=H[a+8>>2];f=f+1|0;if((d|0)>(f|0)){continue}break}}f=H[a+56>>2];q=H[f>>2];f=H[f+4>>2]-q|0;if((f|0)>=5){o=f>>>2|0;t=o>>>0<=2?2:o;u=e&-2;w=e&1;h=1;while(1){e:{f:{if((h|0)!=(o|0)){r=N(e,h);f=H[(h<<2)+q>>2];if((f|0)==-1){break f}f=H[H[p+12>>2]+(f<<2)>>2];if((f|0)==-1){break f}j=H[s>>2];g=H[p>>2];k=H[j+(H[g+(f<<2)>>2]<<2)>>2];i=f+1|0;i=(i>>>0)%3|0?i:f-2|0;if((i|0)!=-1){i=H[g+(i<<2)>>2]}else{i=-1}g:{h:{if((f>>>0)%3|0){f=f-1|0;break h}f=f+2|0;l=-1;if((f|0)==-1){break g}}l=H[g+(f<<2)>>2]}if((h|0)<=(k|0)){break f}f=H[(i<<2)+j>>2];if((f|0)>=(h|0)){break f}g=H[j+(l<<2)>>2];if((g|0)>=(h|0)){break f}i:{if((e|0)<=0){break i}g=N(e,g);j=N(e,f);k=N(e,k);f=0;l=0;if((e|0)!=1){while(1){H[(f<<2)+m>>2]=(H[(f+g<<2)+c>>2]+H[(f+j<<2)+c>>2]|0)-H[(f+k<<2)+c>>2];i=f|1;H[(i<<2)+m>>2]=(H[(g+i<<2)+c>>2]+H[(j+i<<2)+c>>2]|0)-H[(i+k<<2)+c>>2];f=f+2|0;l=l+2|0;if((u|0)!=(l|0)){continue}break}}if(!w){break i}H[(f<<2)+m>>2]=(H[(f+g<<2)+c>>2]+H[(f+j<<2)+c>>2]|0)-H[(f+k<<2)+c>>2]}if((d|0)<=0){break e}j=H[n>>2];f=0;while(1){d=f<<2;g=H[d+m>>2];k=H[a+16>>2];j:{if((g|0)>(k|0)){H[d+j>>2]=k;break j}d=d+j|0;k=H[a+12>>2];if((k|0)>(g|0)){H[d>>2]=k;break j}H[d>>2]=g}d=H[a+8>>2];f=f+1|0;if((d|0)>(f|0)){continue}break}f=0;if((d|0)<=0){break e}d=r<<2;k=d+c|0;i=b+d|0;while(1){g=f<<2;d=g+k|0;g=H[g+i>>2]+H[g+j>>2]|0;H[d>>2]=g;k:{if((g|0)>H[a+16>>2]){l=g-H[a+20>>2]|0}else{if((g|0)>=H[a+12>>2]){break k}l=g+H[a+20>>2]|0}H[d>>2]=l}d=H[a+8>>2];f=f+1|0;if((d|0)>(f|0)){continue}break}break e}Ca();v()}if((d|0)<=0){break e}k=(N(h-1|0,e)<<2)+c|0;j=H[n>>2];f=0;while(1){d=f<<2;g=H[d+k>>2];i=H[a+16>>2];l:{if((g|0)>(i|0)){H[d+j>>2]=i;break l}d=d+j|0;i=H[a+12>>2];if((i|0)>(g|0)){H[d>>2]=i;break l}H[d>>2]=g}d=H[a+8>>2];f=f+1|0;if((d|0)>(f|0)){continue}break}f=0;if((d|0)<=0){break e}d=r<<2;k=d+c|0;i=b+d|0;while(1){g=f<<2;d=g+k|0;g=H[g+i>>2]+H[g+j>>2]|0;H[d>>2]=g;m:{if((g|0)>H[a+16>>2]){l=g-H[a+20>>2]|0}else{if((g|0)>=H[a+12>>2]){break m}l=g+H[a+20>>2]|0}H[d>>2]=l}d=H[a+8>>2];f=f+1|0;if((d|0)>(f|0)){continue}break}}h=h+1|0;if((t|0)!=(h|0)){continue}break}}oa(m);return 1}function we(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;if((b|0)==-1){return 1}g=(b>>>0)/3|0;if(!(H[H[a+24>>2]+(g>>>3&268435452)>>2]>>>g&1)){e=H[a+48>>2];H[a+52>>2]=e;a:{if((e|0)!=H[a+56>>2]){H[e>>2]=b;H[a+52>>2]=e+4;break a}d=pa(4);H[d>>2]=b;c=d+4|0;H[a+56>>2]=c;H[a+52>>2]=c;H[a+48>>2]=d;if(!e){break a}oa(e)}c=b+1|0;i=(c>>>0)%3|0?c:b-2|0;c=H[H[a+4>>2]+28>>2];k=H[(i<<2)+c>>2];if((k|0)==-1){return 0}e=(b-N(g,3)|0?-1:2)+b|0;j=H[c+(e<<2)>>2];if((j|0)==-1){return 0}b=H[a+36>>2];g=b+(k>>>3&536870908)|0;d=H[g>>2];c=1<<k;if(!(d&c)){H[g>>2]=c|d;Ua(a+8|0,k,i);b=H[a+36>>2]}d=(j>>>3&536870908)+b|0;c=H[d>>2];b=1<<j;if(!(c&b)){H[d>>2]=b|c;Ua(a+8|0,j,e)}f=H[a+52>>2];if((f|0)==H[a+48>>2]){return 1}k=a+8|0;while(1){b:{c:{f=f-4|0;b=H[f>>2];if((b|0)==-1){break c}c=(b>>>0)/3|0;g=H[a+24>>2]+(c>>>3&268435452)|0;d=H[g>>2];c=1<<c;if(d&c){break c}H[g>>2]=c|d;h=H[a+4>>2];c=H[H[h+28>>2]+(b<<2)>>2];if((c|0)==-1){return 0}while(1){d=b;d:{e:{j=H[a+36>>2]+(c>>>3&536870908)|0;i=H[j>>2];e=1<<c;if(i&e){break e}f:{g=H[H[h+40>>2]+(c<<2)>>2];g:{if((g|0)==-1){break g}b=g+1|0;b=(b>>>0)%3|0?b:g-2|0;if((b|0)==-1|H[H[h>>2]+(b>>>3&536870908)>>2]>>>b&1){break g}g=H[H[H[h+64>>2]+12>>2]+(b<<2)>>2];if((g|0)!=-1){break f}}H[j>>2]=e|i;Ua(k,c,d);h=H[a+4>>2];break e}H[j>>2]=e|i;Ua(k,c,d);h=H[a+4>>2];b=g+1|0;if((((b>>>0)%3|0?b:g-2|0)|0)==-1){break e}b=-1;h:{if((d|0)==-1){break h}c=d+1|0;c=(c>>>0)%3|0?c:d-2|0;if((c|0)==-1|H[H[h>>2]+(c>>>3&536870908)>>2]>>>c&1){break h}b=H[H[H[h+64>>2]+12>>2]+(c<<2)>>2]}c=(b>>>0)/3|0;d=1<<c;f=H[a+24>>2];e=c>>>5|0;j=H[f+(e<<2)>>2];break d}i:{j:{if((d|0)==-1){break j}c=-1;b=d+1|0;b=(b>>>0)%3|0?b:d-2|0;if(!((b|0)==-1|H[H[h>>2]+(b>>>3&536870908)>>2]>>>b&1)){c=H[H[H[h+64>>2]+12>>2]+(b<<2)>>2]}k:{l:{if((d>>>0)%3|0){f=d-1|0;break l}f=d+2|0;b=-1;if((f|0)==-1){break k}}b=-1;if(H[H[h>>2]+(f>>>3&536870908)>>2]>>>f&1){break k}b=H[H[H[h+64>>2]+12>>2]+(f<<2)>>2]}g=(b|0)==-1;i=g?-1:(b>>>0)/3|0;if((c|0)!=-1){f=H[a+24>>2];d=(c>>>0)/3|0;e=d>>>5|0;j=H[f+(e<<2)>>2];d=1<<d;if(!(j&d)){break i}}if(g){break j}d=1<<i;f=H[a+24>>2];e=i>>>5|0;j=H[f+(e<<2)>>2];if(!(d&j)){break d}}f=H[a+52>>2]-4|0;H[a+52>>2]=f;break b}if(g){b=c;break d}if(H[(i>>>3&536870908)+f>>2]>>>i&1){b=c;break d}h=H[a+52>>2];H[h-4>>2]=b;if(H[a+56>>2]!=(h|0)){H[h>>2]=c;f=h+4|0;break c}m:{i=H[a+48>>2];e=h-i|0;g=e>>2;d=g+1|0;if(d>>>0<1073741824){b=e>>>1|0;e=e>>>0>=2147483644?1073741823:b>>>0>d>>>0?b:d;if(e){if(e>>>0>=1073741824){break m}d=pa(e<<2)}else{d=0}b=d+(g<<2)|0;H[b>>2]=c;f=b+4|0;if((h|0)!=(i|0)){while(1){b=b-4|0;h=h-4|0;H[b>>2]=H[h>>2];if((h|0)!=(i|0)){continue}break}}H[a+56>>2]=d+(e<<2);H[a+52>>2]=f;H[a+48>>2]=b;if(!i){break b}oa(i);f=H[a+52>>2];break b}sa();v()}wa();v()}H[(e<<2)+f>>2]=d|j;c=H[H[h+28>>2]+(b<<2)>>2];if((c|0)!=-1){continue}break}return 0}H[a+52>>2]=f}if(H[a+48>>2]!=(f|0)){continue}break}}return 1}function Lj(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0;H[a+8>>2]=e;m=a+32|0;h=H[m>>2];f=H[a+36>>2]-h>>2;a:{if(f>>>0<e>>>0){ya(m,e-f|0);d=H[a+8>>2];break a}d=e;if(d>>>0>=f>>>0){break a}H[a+36>>2]=h+(e<<2);d=e}s=H[a+52>>2];n=H[a+48>>2];f=0;h=e>>>0>1073741823?-1:e<<2;l=ra(pa(h),0,h);b:{if((d|0)<=0){break b}g=H[a+32>>2];while(1){d=f<<2;h=H[d+l>>2];i=H[a+16>>2];c:{if((h|0)>(i|0)){H[d+g>>2]=i;break c}d=d+g|0;i=H[a+12>>2];if((i|0)>(h|0)){H[d>>2]=i;break c}H[d>>2]=h}d=H[a+8>>2];f=f+1|0;if((d|0)>(f|0)){continue}break}if((d|0)<=0){break b}f=0;while(1){h=f<<2;d=h+c|0;h=H[b+h>>2]+H[g+h>>2]|0;H[d>>2]=h;d:{if((h|0)>H[a+16>>2]){h=h-H[a+20>>2]|0}else{if((h|0)>=H[a+12>>2]){break d}h=h+H[a+20>>2]|0}H[d>>2]=h}d=H[a+8>>2];f=f+1|0;if((d|0)>(f|0)){continue}break}}f=H[a+56>>2];q=H[f>>2];f=H[f+4>>2]-q|0;if((f|0)>=5){o=f>>>2|0;t=o>>>0<=2?2:o;u=e&-2;w=e&1;h=1;while(1){e:{f:{if((h|0)!=(o|0)){r=N(e,h);f=H[(h<<2)+q>>2];if((f|0)==-1|H[H[n>>2]+(f>>>3&536870908)>>2]>>>f&1){break f}f=H[H[H[n+64>>2]+12>>2]+(f<<2)>>2];if((f|0)==-1){break f}i=H[s>>2];g=H[n+28>>2];k=H[i+(H[g+(f<<2)>>2]<<2)>>2];if((k|0)>=(h|0)){break f}j=f+1|0;j=H[i+(H[g+(((j>>>0)%3|0?j:f-2|0)<<2)>>2]<<2)>>2];if((j|0)>=(h|0)){break f}f=H[i+(H[g+(f+((f>>>0)%3|0?-1:2)<<2)>>2]<<2)>>2];if((f|0)>=(h|0)){break f}g:{if((e|0)<=0){break g}g=N(e,f);i=N(e,j);k=N(e,k);f=0;p=0;if((e|0)!=1){while(1){H[(f<<2)+l>>2]=(H[(f+g<<2)+c>>2]+H[(f+i<<2)+c>>2]|0)-H[(f+k<<2)+c>>2];j=f|1;H[(j<<2)+l>>2]=(H[(g+j<<2)+c>>2]+H[(i+j<<2)+c>>2]|0)-H[(k+j<<2)+c>>2];f=f+2|0;p=p+2|0;if((u|0)!=(p|0)){continue}break}}if(!w){break g}H[(f<<2)+l>>2]=(H[(f+g<<2)+c>>2]+H[(f+i<<2)+c>>2]|0)-H[(f+k<<2)+c>>2]}if((d|0)<=0){break e}i=H[m>>2];f=0;while(1){d=f<<2;g=H[d+l>>2];k=H[a+16>>2];h:{if((g|0)>(k|0)){H[d+i>>2]=k;break h}d=d+i|0;k=H[a+12>>2];if((k|0)>(g|0)){H[d>>2]=k;break h}H[d>>2]=g}d=H[a+8>>2];f=f+1|0;if((d|0)>(f|0)){continue}break}f=0;if((d|0)<=0){break e}d=r<<2;k=d+c|0;j=b+d|0;while(1){g=f<<2;d=g+k|0;g=H[g+j>>2]+H[g+i>>2]|0;H[d>>2]=g;i:{if((g|0)>H[a+16>>2]){g=g-H[a+20>>2]|0}else{if((g|0)>=H[a+12>>2]){break i}g=g+H[a+20>>2]|0}H[d>>2]=g}d=H[a+8>>2];f=f+1|0;if((d|0)>(f|0)){continue}break}break e}Ca();v()}if((d|0)<=0){break e}k=(N(h-1|0,e)<<2)+c|0;i=H[m>>2];f=0;while(1){d=f<<2;g=H[d+k>>2];j=H[a+16>>2];j:{if((g|0)>(j|0)){H[d+i>>2]=j;break j}d=d+i|0;j=H[a+12>>2];if((j|0)>(g|0)){H[d>>2]=j;break j}H[d>>2]=g}d=H[a+8>>2];f=f+1|0;if((d|0)>(f|0)){continue}break}f=0;if((d|0)<=0){break e}d=r<<2;k=d+c|0;j=b+d|0;while(1){g=f<<2;d=g+k|0;g=H[g+j>>2]+H[g+i>>2]|0;H[d>>2]=g;k:{if((g|0)>H[a+16>>2]){g=g-H[a+20>>2]|0}else{if((g|0)>=H[a+12>>2]){break k}g=g+H[a+20>>2]|0}H[d>>2]=g}d=H[a+8>>2];f=f+1|0;if((d|0)>(f|0)){continue}break}}h=h+1|0;if((t|0)!=(h|0)){continue}break}}oa(l);return 1}function Gb(a,b,c,d){var e=0,f=0,g=0,h=0,i=0,j=O(0),k=0,l=0,m=O(0);i=H[c>>2];a:{b:{f=H[b+4>>2];if(!f){break b}g=Uj(f);c:{if(g>>>0>=2){e=i;if(f>>>0<=e>>>0){e=(i>>>0)%(f>>>0)|0}c=H[H[b>>2]+(e<<2)>>2];if(!c){break b}if(g>>>0<=1){break c}while(1){c=H[c>>2];if(!c){break b}g=H[c+4>>2];if((g|0)!=(i|0)){if(f>>>0<=g>>>0){g=(g>>>0)%(f>>>0)|0}if((e|0)!=(g|0)){break b}}if(H[c+8>>2]!=(i|0)){continue}break}b=0;break a}e=f-1&i;c=H[H[b>>2]+(e<<2)>>2];if(!c){break b}}h=f-1|0;while(1){c=H[c>>2];if(!c){break b}g=H[c+4>>2];if((g|0)!=(i|0)&(g&h)!=(e|0)){break b}if(H[c+8>>2]!=(i|0)){continue}break}b=0;break a}c=pa(16);d=H[H[d>>2]>>2];H[c+12>>2]=0;H[c+8>>2]=d;H[c+4>>2]=i;H[c>>2]=0;m=O(H[b+12>>2]+1>>>0);j=L[b+16>>2];d:{if(m>O(j*O(f>>>0))?0:f){break d}e=2;d=(f-1&f)!=0|f>>>0<3|f<<1;j=O(U(O(m/j)));e:{if(j<O(4294967296)&j>=O(0)){g=~~j>>>0;break e}g=0}d=d>>>0>g>>>0?d:g;f:{if((d|0)==1){break f}if(!(d&d-1)){e=d;break f}e=Kd(d);f=H[b+4>>2]}g:{if(e>>>0<=f>>>0){if(e>>>0>=f>>>0){break g}g=f>>>0<3;j=O(U(O(O(K[b+12>>2])/L[b+16>>2])));h:{if(j<O(4294967296)&j>=O(0)){d=~~j>>>0;break h}d=0}i:{j:{if(g){break j}if(Uj(f)>>>0>1){break j}d=d>>>0<2?d:1<<32-Q(d-1|0);break i}d=Kd(d)}e=d>>>0<e>>>0?e:d;if(f>>>0<=e>>>0){break g}}f=0;g=0;h=e;k:{l:{m:{n:{if(e){if(h>>>0>=1073741824){break n}d=pa(h<<2);e=H[b>>2];H[b>>2]=d;if(e){oa(e)}H[b+4>>2]=h;d=0;if(h>>>0>=4){e=h&-4;while(1){k=d<<2;H[k+H[b>>2]>>2]=0;H[H[b>>2]+(k|4)>>2]=0;H[H[b>>2]+(k|8)>>2]=0;H[H[b>>2]+(k|12)>>2]=0;d=d+4|0;g=g+4|0;if((e|0)!=(g|0)){continue}break}}e=h&3;if(e){while(1){H[H[b>>2]+(d<<2)>>2]=0;d=d+1|0;f=f+1|0;if((e|0)!=(f|0)){continue}break}}e=H[b+8>>2];if(!e){break k}d=b+8|0;f=H[e+4>>2];g=Uj(h);if(g>>>0<2){break m}f=f>>>0>=h>>>0?(f>>>0)%(h>>>0)|0:f;H[H[b>>2]+(f<<2)>>2]=d;d=H[e>>2];if(!d){break k}if(g>>>0<=1){break l}while(1){g=H[d+4>>2];if(h>>>0<=g>>>0){g=(g>>>0)%(h>>>0)|0}o:{if((f|0)==(g|0)){e=d;break o}l=g<<2;k=l+H[b>>2]|0;if(!H[k>>2]){H[k>>2]=e;e=d;f=g;break o}H[e>>2]=H[d>>2];H[d>>2]=H[H[l+H[b>>2]>>2]>>2];H[H[l+H[b>>2]>>2]>>2]=d}d=H[e>>2];if(d){continue}break}break k}d=H[b>>2];H[b>>2]=0;if(d){oa(d)}H[b+4>>2]=0;break k}wa();v()}f=h-1&f;H[H[b>>2]+(f<<2)>>2]=d;d=H[e>>2];if(!d){break k}}k=h-1|0;while(1){g=k&H[d+4>>2];p:{if((g|0)==(f|0)){e=d;break p}l=g<<2;h=l+H[b>>2]|0;if(H[h>>2]){H[e>>2]=H[d>>2];H[d>>2]=H[H[l+H[b>>2]>>2]>>2];H[H[l+H[b>>2]>>2]>>2]=d;break p}H[h>>2]=e;e=d;f=g}d=H[e>>2];if(d){continue}break}}}f=H[b+4>>2];d=f-1|0;if(!(d&f)){e=d&i;break d}if(f>>>0>i>>>0){e=i;break d}e=(i>>>0)%(f>>>0)|0}e=H[b>>2]+(e<<2)|0;d=H[e>>2];q:{r:{if(!d){d=b+8|0;H[c>>2]=H[d>>2];H[b+8>>2]=c;H[e>>2]=d;d=H[c>>2];if(!d){break q}d=H[d+4>>2];e=f-1|0;s:{if(!(e&f)){d=d&e;break s}if(d>>>0<f>>>0){break s}d=(d>>>0)%(f>>>0)|0}d=H[b>>2]+(d<<2)|0;break r}H[c>>2]=H[d>>2]}H[d>>2]=c}H[b+12>>2]=H[b+12>>2]+1;b=1}F[a+4|0]=b;H[a>>2]=c}function Oe(a,b,c,d){var e=0,f=0,g=0,h=0,i=0,j=0;f=ca-80|0;ca=f;e=H[c+36>>2];H[f+72>>2]=H[c+32>>2];H[f+76>>2]=e;g=H[c+28>>2];e=f- -64|0;H[e>>2]=H[c+24>>2];H[e+4>>2]=g;e=H[c+20>>2];H[f+56>>2]=H[c+16>>2];H[f+60>>2]=e;e=H[c+12>>2];H[f+48>>2]=H[c+8>>2];H[f+52>>2]=e;e=H[c+4>>2];H[f+40>>2]=H[c>>2];H[f+44>>2]=e;nc(a,f+40|0,f+24|0);a:{if(H[a>>2]){break a}if(F[a+15|0]<0){oa(H[a+4>>2])}if(I[f+31|0]!=1){b=pa(32);F[b+20|0]=0;c=I[1448]|I[1449]<<8|(I[1450]<<16|I[1451]<<24);F[b+16|0]=c;F[b+17|0]=c>>>8;F[b+18|0]=c>>>16;F[b+19|0]=c>>>24;c=I[1444]|I[1445]<<8|(I[1446]<<16|I[1447]<<24);d=I[1440]|I[1441]<<8|(I[1442]<<16|I[1443]<<24);F[b+8|0]=d;F[b+9|0]=d>>>8;F[b+10|0]=d>>>16;F[b+11|0]=d>>>24;F[b+12|0]=c;F[b+13|0]=c>>>8;F[b+14|0]=c>>>16;F[b+15|0]=c>>>24;c=I[1436]|I[1437]<<8|(I[1438]<<16|I[1439]<<24);d=I[1432]|I[1433]<<8|(I[1434]<<16|I[1435]<<24);F[b|0]=d;F[b+1|0]=d>>>8;F[b+2|0]=d>>>16;F[b+3|0]=d>>>24;F[b+4|0]=c;F[b+5|0]=c>>>8;F[b+6|0]=c>>>16;F[b+7|0]=c>>>24;H[a>>2]=-1;za(a+4|0,b,20);oa(b);break a}i=ca-16|0;ca=i;b:{c:{switch(I[f+32|0]){case 0:e=Ke(pa(48));H[e>>2]=13112;H[f+8>>2]=0;H[f+12>>2]=0;H[f>>2]=0;H[f+4>>2]=0;H[f+16>>2]=e;break b;case 1:e=Ke(pa(52));H[e+48>>2]=0;H[e>>2]=11276;H[f+8>>2]=0;H[f+12>>2]=0;H[f>>2]=0;H[f+4>>2]=0;H[f+16>>2]=e;break b;default:break c}}g=pa(32);F[g+28|0]=0;e=I[1550]|I[1551]<<8|(I[1552]<<16|I[1553]<<24);F[g+24|0]=e;F[g+25|0]=e>>>8;F[g+26|0]=e>>>16;F[g+27|0]=e>>>24;e=I[1546]|I[1547]<<8|(I[1548]<<16|I[1549]<<24);h=I[1542]|I[1543]<<8|(I[1544]<<16|I[1545]<<24);F[g+16|0]=h;F[g+17|0]=h>>>8;F[g+18|0]=h>>>16;F[g+19|0]=h>>>24;F[g+20|0]=e;F[g+21|0]=e>>>8;F[g+22|0]=e>>>16;F[g+23|0]=e>>>24;e=I[1538]|I[1539]<<8|(I[1540]<<16|I[1541]<<24);h=I[1534]|I[1535]<<8|(I[1536]<<16|I[1537]<<24);F[g+8|0]=h;F[g+9|0]=h>>>8;F[g+10|0]=h>>>16;F[g+11|0]=h>>>24;F[g+12|0]=e;F[g+13|0]=e>>>8;F[g+14|0]=e>>>16;F[g+15|0]=e>>>24;e=I[1530]|I[1531]<<8|(I[1532]<<16|I[1533]<<24);h=I[1526]|I[1527]<<8|(I[1528]<<16|I[1529]<<24);F[g|0]=h;F[g+1|0]=h>>>8;F[g+2|0]=h>>>16;F[g+3|0]=h>>>24;F[g+4|0]=e;F[g+5|0]=e>>>8;F[g+6|0]=e>>>16;F[g+7|0]=e>>>24;H[i>>2]=-1;e=i|4;za(e,g,28);j=F[i+15|0];H[f>>2]=H[i>>2];h=f+4|0;d:{if((j|0)>=0){j=H[e+4>>2];H[h>>2]=H[e>>2];H[h+4>>2]=j;H[h+8>>2]=H[e+8>>2];H[f+16>>2]=0;break d}za(h,H[i+4>>2],H[i+8>>2]);e=F[i+15|0];H[f+16>>2]=0;if((e|0)>=0){break d}oa(H[i+4>>2])}oa(g)}ca=i+16|0;e=H[f>>2];e:{if(e){H[a>>2]=e;a=a+4|0;if(F[f+15|0]>=0){b=f|4;c=H[b+4>>2];H[a>>2]=H[b>>2];H[a+4>>2]=c;H[a+8>>2]=H[b+8>>2];break e}za(a,H[f+4>>2],H[f+8>>2]);break e}e=H[f+16>>2];H[f+16>>2]=0;H[e+44>>2]=d;te(a,e,b,c,d);if(!H[a>>2]){if(F[a+15|0]<0){oa(H[a+4>>2])}H[a>>2]=0;H[a+4>>2]=0;H[a+8>>2]=0;H[a+12>>2]=0}ea[H[H[e>>2]+4>>2]](e)}a=H[f+16>>2];H[f+16>>2]=0;if(a){ea[H[H[a>>2]+4>>2]](a)}if(F[f+15|0]>=0){break a}oa(H[f+4>>2])}ca=f+80|0}function Gc(a,b,c){var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;j=N(b,12)+a|0;H[j+12>>2]=H[j+8>>2];m=(c|0)==-1?-1:(c>>>0)/3|0;d=1;k=c;a:{b:{c:{while(1){d:{l=d;if(!d){if((k|0)==-1){break d}if((de(a,((k>>>0)%3|0?-1:2)+k|0)|0)==-1){break a}c=k+1|0;d=(c>>>0)%3|0?c:k-2|0;if((d|0)==-1){break a}c=d+1|0;c=(c>>>0)%3|0?c:d-2|0;if((c|0)==-1){break a}d=H[H[H[a+4>>2]+12>>2]+(c<<2)>>2];if((d|0)==-1){break a}c=d+1|0;c=(c>>>0)%3|0?c:d-2|0;if((c|0)==-1){break a}m=(c>>>0)/3|0}e:{d=H[a+56>>2]+(m>>>3&536870908)|0;h=H[d>>2];e=1<<m;if(h&e){break e}f=0;while(1){H[d>>2]=e|h;d=H[j+12>>2];f:{if((d|0)!=H[j+16>>2]){H[d>>2]=m;H[j+12>>2]=d+4;break f}n=H[j+8>>2];h=d-n|0;e=h>>2;i=e+1|0;if(i>>>0>=1073741824){break c}g=h>>>1|0;i=h>>>0>=2147483644?1073741823:i>>>0<g>>>0?g:i;if(i){if(i>>>0>=1073741824){break b}g=pa(i<<2)}else{g=0}h=g+(e<<2)|0;H[h>>2]=m;e=h+4|0;if((d|0)!=(n|0)){while(1){h=h-4|0;d=d-4|0;H[h>>2]=H[d>>2];if((d|0)!=(n|0)){continue}break}}H[j+8>>2]=h;H[j+12>>2]=e;H[j+16>>2]=g+(i<<2);if(!n){break f}oa(n)}g=f+1|0;g:{h:{i:{if(!f){break i}if(g&1){if((c|0)==-1){c=-1;break g}d=c+1|0;c=(d>>>0)%3|0?d:c-2|0;break i}k=l?k:c;if((c|0)==-1){c=-1;break g}if((c>>>0)%3|0){d=c-1|0;break h}c=c+2|0}d=c;c=-1;if((d|0)==-1){break g}}c=H[H[H[a+4>>2]+12>>2]+(d<<2)>>2];h=-1;f=-1;e=d+1|0;e=(e>>>0)%3|0?e:d-2|0;if((e|0)>=0){f=(e>>>0)/3|0;f=H[(H[H[a>>2]+96>>2]+N(f,12)|0)+(e-N(f,3)<<2)>>2]}j:{if((c|0)==-1){break j}i=((c>>>0)%3|0?-1:2)+c|0;if((i|0)<0){break j}e=(i>>>0)/3|0;h=H[(H[H[a>>2]+96>>2]+N(e,12)|0)+(i-N(e,3)<<2)>>2]}if((f|0)!=(h|0)){c=-1;break g}k:{l:{f=((d>>>0)%3|0?-1:2)+d|0;if((f|0)>=0){d=(f>>>0)/3|0;if((c|0)!=-1){break l}c=-1;break g}d=-1;if((c|0)!=-1){break k}c=-1;break g}d=H[(H[H[a>>2]+96>>2]+N(d,12)|0)+(f-N(d,3)<<2)>>2]}f=c+1|0;e=(f>>>0)%3|0?f:c-2|0;if((e|0)>=0){f=(e>>>0)/3|0;f=H[(H[H[a>>2]+96>>2]+N(f,12)|0)+(e-N(f,3)<<2)>>2]}else{f=-1}if((f|0)!=(d|0)){c=-1;break g}f=g;m=(c>>>0)/3|0;d=H[a+56>>2]+(m>>>3&268435452)|0;h=H[d>>2];e=1<<m;if(!(h&e)){continue}}break}if(l|!(g&1)){break e}l=H[j+12>>2]-4|0;g=H[l>>2];d=H[a+56>>2]+(g>>>3&536870908)|0;c=H[d>>2];o=d,p=Vj(g)&c,H[o>>2]=p;H[j+12>>2]=l;break a}d=0;if(l){continue}break a}break}k=-1;de(a,-1);break a}sa();v()}wa();v()}H[((b<<2)+a|0)+44>>2]=k;b=H[j+12>>2];i=H[j+8>>2];m:{if((b|0)==(i|0)){break m}c=b-i|0;b=c>>2;b=b>>>0<=1?1:b;k=b&1;e=H[a+56>>2];d=0;if(c>>>0>=8){f=b&-2;c=0;while(1){l=d<<2;g=H[l+i>>2];b=e+(g>>>3&536870908)|0;a=H[b>>2];o=b,p=Vj(g)&a,H[o>>2]=p;g=H[i+(l|4)>>2];b=e+(g>>>3&536870908)|0;a=H[b>>2];o=b,p=Vj(g)&a,H[o>>2]=p;d=d+2|0;c=c+2|0;if((f|0)!=(c|0)){continue}break}}if(!k){break m}c=H[i+(d<<2)>>2];b=e+(c>>>3&536870908)|0;a=H[b>>2];o=b,p=Vj(c)&a,H[o>>2]=p}}function Gj(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;h=ca-32|0;ca=h;a:{if(J[b+38>>1]<=513){c=H[b+20>>2];f=H[b+12>>2];d=H[b+16>>2];if((c|0)>=(f|0)&d>>>0>=K[b+8>>2]|(c|0)>(f|0)){break a}f=I[d+H[b>>2]|0];d=d+1|0;c=d?c:c+1|0;H[b+16>>2]=d;H[b+20>>2]=c;if(f){break a}}b:{if(!Xa(1,h+28|0,b)){break b}d=H[h+28>>2];c=H[H[a+48>>2]+64>>2];if(d>>>0>H[c+4>>2]-H[c>>2]>>2>>>0){break b}c:{if(d){Wa(a+60|0,d);c=h+8|0;H[c>>2]=0;H[c+4>>2]=0;F[c+5|0]=0;F[c+6|0]=0;F[c+7|0]=0;F[c+8|0]=0;F[c+9|0]=0;F[c+10|0]=0;F[c+11|0]=0;F[c+12|0]=0;if(!ta(c,b)){break c}while(1){f=1<<e;j=Ba(c);g=H[a+60>>2]+(e>>>3&536870908)|0;if(j){i=f|H[g>>2]}else{i=H[g>>2]&(f^-1)}H[g>>2]=i;e=e+1|0;if((d|0)!=(e|0)){continue}break}}if(!Xa(1,h+28|0,b)){break b}d=H[h+28>>2];c=H[H[a+48>>2]+64>>2];if(d>>>0>H[c+4>>2]-H[c>>2]>>2>>>0){break b}if(d){e=0;Wa(a+72|0,d);c=h+8|0;H[c>>2]=0;H[c+4>>2]=0;F[c+5|0]=0;F[c+6|0]=0;F[c+7|0]=0;F[c+8|0]=0;F[c+9|0]=0;F[c+10|0]=0;F[c+11|0]=0;F[c+12|0]=0;if(!ta(c,b)){break c}while(1){f=1<<e;j=Ba(c);g=H[a+72>>2]+(e>>>3&536870908)|0;if(j){i=f|H[g>>2]}else{i=H[g>>2]&(f^-1)}H[g>>2]=i;e=e+1|0;if((d|0)!=(e|0)){continue}break}}if(!Xa(1,h+28|0,b)){break b}d=H[h+28>>2];c=H[H[a+48>>2]+64>>2];if(d>>>0>H[c+4>>2]-H[c>>2]>>2>>>0){break b}if(d){e=0;Wa(a+84|0,d);c=h+8|0;H[c>>2]=0;H[c+4>>2]=0;F[c+5|0]=0;F[c+6|0]=0;F[c+7|0]=0;F[c+8|0]=0;F[c+9|0]=0;F[c+10|0]=0;F[c+11|0]=0;F[c+12|0]=0;if(!ta(c,b)){break c}while(1){f=1<<e;j=Ba(c);g=H[a+84>>2]+(e>>>3&536870908)|0;if(j){i=f|H[g>>2]}else{i=H[g>>2]&(f^-1)}H[g>>2]=i;e=e+1|0;if((d|0)!=(e|0)){continue}break}}if(!Xa(1,h+28|0,b)){break b}d=H[h+28>>2];c=H[H[a+48>>2]+64>>2];if(d>>>0>H[c+4>>2]-H[c>>2]>>2>>>0){break b}if(d){e=0;Wa(a+96|0,d);c=h+8|0;H[c>>2]=0;H[c+4>>2]=0;F[c+5|0]=0;F[c+6|0]=0;F[c+7|0]=0;F[c+8|0]=0;F[c+9|0]=0;F[c+10|0]=0;F[c+11|0]=0;F[c+12|0]=0;if(!ta(c,b)){break c}while(1){f=1<<e;j=Ba(c);g=H[a+96>>2]+(e>>>3&536870908)|0;if(j){i=f|H[g>>2]}else{i=H[g>>2]&(f^-1)}H[g>>2]=i;e=e+1|0;if((d|0)!=(e|0)){continue}break}}e=0;c=H[b+8>>2];f=H[b+12>>2];d=c;c=H[b+20>>2];i=c;g=H[b+16>>2];j=g+4|0;c=j>>>0<4?c+1|0:c;if(d>>>0<j>>>0&(c|0)>=(f|0)|(c|0)>(f|0)){break a}m=H[b>>2];k=m+g|0;l=I[k|0]|I[k+1|0]<<8|(I[k+2|0]<<16|I[k+3|0]<<24);H[b+16>>2]=j;H[b+20>>2]=c;k=d;d=f;c=i;f=g+8|0;c=f>>>0<8?c+1|0:c;if(f>>>0>k>>>0&(c|0)>=(d|0)|(c|0)>(d|0)){break a}d=j+m|0;d=I[d|0]|I[d+1|0]<<8|(I[d+2|0]<<16|I[d+3|0]<<24);H[b+16>>2]=f;H[b+20>>2]=c;if((d|0)<(l|0)){break a}H[a+16>>2]=d;H[a+12>>2]=l;c=(d>>31)-((l>>31)+(d>>>0<l>>>0)|0)|0;b=d-l|0;if(!c&b>>>0>2147483646|c){break a}e=1;b=b+1|0;H[a+20>>2]=b;c=b>>>1|0;H[a+24>>2]=c;H[a+28>>2]=0-c;if(b&1){break a}H[a+24>>2]=c-1;break a}}e=0}ca=h+32|0;return e|0}function pj(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;h=ca-32|0;ca=h;a:{if(J[b+38>>1]<=513){c=H[b+20>>2];f=H[b+12>>2];d=H[b+16>>2];if((c|0)>=(f|0)&d>>>0>=K[b+8>>2]|(c|0)>(f|0)){break a}f=I[d+H[b>>2]|0];d=d+1|0;c=d?c:c+1|0;H[b+16>>2]=d;H[b+20>>2]=c;if(f){break a}}b:{if(!Xa(1,h+28|0,b)){break b}d=H[h+28>>2];c=H[a+48>>2];if(d>>>0>H[c+4>>2]-H[c>>2]>>2>>>0){break b}c:{if(d){Wa(a+60|0,d);c=h+8|0;H[c>>2]=0;H[c+4>>2]=0;F[c+5|0]=0;F[c+6|0]=0;F[c+7|0]=0;F[c+8|0]=0;F[c+9|0]=0;F[c+10|0]=0;F[c+11|0]=0;F[c+12|0]=0;if(!ta(c,b)){break c}while(1){f=1<<e;j=Ba(c);g=H[a+60>>2]+(e>>>3&536870908)|0;if(j){i=f|H[g>>2]}else{i=H[g>>2]&(f^-1)}H[g>>2]=i;e=e+1|0;if((d|0)!=(e|0)){continue}break}}if(!Xa(1,h+28|0,b)){break b}d=H[h+28>>2];c=H[a+48>>2];if(d>>>0>H[c+4>>2]-H[c>>2]>>2>>>0){break b}if(d){e=0;Wa(a+72|0,d);c=h+8|0;H[c>>2]=0;H[c+4>>2]=0;F[c+5|0]=0;F[c+6|0]=0;F[c+7|0]=0;F[c+8|0]=0;F[c+9|0]=0;F[c+10|0]=0;F[c+11|0]=0;F[c+12|0]=0;if(!ta(c,b)){break c}while(1){f=1<<e;j=Ba(c);g=H[a+72>>2]+(e>>>3&536870908)|0;if(j){i=f|H[g>>2]}else{i=H[g>>2]&(f^-1)}H[g>>2]=i;e=e+1|0;if((d|0)!=(e|0)){continue}break}}if(!Xa(1,h+28|0,b)){break b}d=H[h+28>>2];c=H[a+48>>2];if(d>>>0>H[c+4>>2]-H[c>>2]>>2>>>0){break b}if(d){e=0;Wa(a+84|0,d);c=h+8|0;H[c>>2]=0;H[c+4>>2]=0;F[c+5|0]=0;F[c+6|0]=0;F[c+7|0]=0;F[c+8|0]=0;F[c+9|0]=0;F[c+10|0]=0;F[c+11|0]=0;F[c+12|0]=0;if(!ta(c,b)){break c}while(1){f=1<<e;j=Ba(c);g=H[a+84>>2]+(e>>>3&536870908)|0;if(j){i=f|H[g>>2]}else{i=H[g>>2]&(f^-1)}H[g>>2]=i;e=e+1|0;if((d|0)!=(e|0)){continue}break}}if(!Xa(1,h+28|0,b)){break b}d=H[h+28>>2];c=H[a+48>>2];if(d>>>0>H[c+4>>2]-H[c>>2]>>2>>>0){break b}if(d){e=0;Wa(a+96|0,d);c=h+8|0;H[c>>2]=0;H[c+4>>2]=0;F[c+5|0]=0;F[c+6|0]=0;F[c+7|0]=0;F[c+8|0]=0;F[c+9|0]=0;F[c+10|0]=0;F[c+11|0]=0;F[c+12|0]=0;if(!ta(c,b)){break c}while(1){f=1<<e;j=Ba(c);g=H[a+96>>2]+(e>>>3&536870908)|0;if(j){i=f|H[g>>2]}else{i=H[g>>2]&(f^-1)}H[g>>2]=i;e=e+1|0;if((d|0)!=(e|0)){continue}break}}e=0;c=H[b+8>>2];f=H[b+12>>2];d=c;c=H[b+20>>2];i=c;g=H[b+16>>2];j=g+4|0;c=j>>>0<4?c+1|0:c;if(d>>>0<j>>>0&(c|0)>=(f|0)|(c|0)>(f|0)){break a}m=H[b>>2];k=m+g|0;l=I[k|0]|I[k+1|0]<<8|(I[k+2|0]<<16|I[k+3|0]<<24);H[b+16>>2]=j;H[b+20>>2]=c;k=d;d=f;c=i;f=g+8|0;c=f>>>0<8?c+1|0:c;if(f>>>0>k>>>0&(c|0)>=(d|0)|(c|0)>(d|0)){break a}d=j+m|0;d=I[d|0]|I[d+1|0]<<8|(I[d+2|0]<<16|I[d+3|0]<<24);H[b+16>>2]=f;H[b+20>>2]=c;if((d|0)<(l|0)){break a}H[a+16>>2]=d;H[a+12>>2]=l;c=(d>>31)-((l>>31)+(d>>>0<l>>>0)|0)|0;b=d-l|0;if(!c&b>>>0>2147483646|c){break a}e=1;b=b+1|0;H[a+20>>2]=b;c=b>>>1|0;H[a+24>>2]=c;H[a+28>>2]=0-c;if(b&1){break a}H[a+24>>2]=c-1;break a}}e=0}ca=h+32|0;return e|0}function xe(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0;if((b|0)==-1){return 1}g=(b>>>0)/3|0;if(!(H[H[a+24>>2]+(g>>>3&268435452)>>2]>>>g&1)){f=H[a+48>>2];H[a+52>>2]=f;a:{if((f|0)!=H[a+56>>2]){H[f>>2]=b;H[a+52>>2]=f+4;break a}d=pa(4);H[d>>2]=b;c=d+4|0;H[a+56>>2]=c;H[a+52>>2]=c;H[a+48>>2]=d;if(!f){break a}oa(f)}e=-1;d=H[a+4>>2];c=b+1|0;i=(c>>>0)%3|0?c:b-2|0;if((i|0)!=-1){e=H[H[d>>2]+(i<<2)>>2]}b:{h=b-N(g,3)|0;if(h){c=b-1|0;break b}c=b+2|0;if((c|0)!=-1){break b}return 0}if((e|0)==-1){return 0}j=H[H[d>>2]+(c<<2)>>2];if((j|0)==-1){return 0}c=H[a+36>>2];f=c+(e>>>3&536870908)|0;g=H[f>>2];d=1<<e;if(!(g&d)){H[f>>2]=d|g;Ua(a+8|0,e,i);c=H[a+36>>2]}g=(j>>>3&536870908)+c|0;d=H[g>>2];c=1<<j;if(!(d&c)){H[g>>2]=c|d;Ua(a+8|0,j,(h?-1:2)+b|0)}c=H[a+52>>2];if((c|0)==H[a+48>>2]){return 1}j=a+8|0;while(1){c:{d:{c=c-4|0;b=H[c>>2];if((b|0)==-1){break d}d=(b>>>0)/3|0;f=H[a+24>>2]+(d>>>3&268435452)|0;g=H[f>>2];d=1<<d;if(g&d){break d}H[f>>2]=d|g;while(1){i=H[a+4>>2];e=H[H[i>>2]+(b<<2)>>2];if((e|0)==-1){return 0}e:{f:{h=H[a+36>>2]+(e>>>3&536870908)|0;f=H[h>>2];g=1<<e;if(f&g){break f}g:{d=H[H[i+24>>2]+(e<<2)>>2];h:{if((d|0)==-1){break h}c=d+1|0;c=(c>>>0)%3|0?c:d-2|0;if((c|0)==-1){break h}d=H[H[i+12>>2]+(c<<2)>>2];if((d|0)!=-1){break g}}H[h>>2]=f|g;Ua(j,e,b);break f}H[h>>2]=f|g;Ua(j,e,b);c=d+1|0;if((((c>>>0)%3|0?c:d-2|0)|0)==-1){break f}c=b-2|0;d=b+1|0;b=-1;c=(d>>>0)%3|0?d:c;if((c|0)!=-1){b=H[H[H[a+4>>2]+12>>2]+(c<<2)>>2]}c=(b>>>0)/3|0;d=1<<c;e=H[a+24>>2];f=c>>>5|0;i=H[e+(f<<2)>>2];break e}c=-1;g=H[a+4>>2];d=b+1|0;d=(d>>>0)%3|0?d:b-2|0;if((d|0)!=-1){c=H[H[g+12>>2]+(d<<2)>>2]}i:{j:{if((b>>>0)%3|0){e=b-1|0;break j}e=b+2|0;b=-1;if((e|0)==-1){break i}}b=H[H[g+12>>2]+(e<<2)>>2]}g=(b|0)==-1;h=g?-1:(b>>>0)/3|0;k:{if((c|0)!=-1){e=H[a+24>>2];d=(c>>>0)/3|0;f=d>>>5|0;i=H[e+(f<<2)>>2];d=1<<d;if(!(i&d)){break k}}if(!g){d=1<<h;e=H[a+24>>2];f=h>>>5|0;i=H[e+(f<<2)>>2];if(!(d&i)){break e}}c=H[a+52>>2]-4|0;H[a+52>>2]=c;break c}if(g){b=c;break e}if(H[(h>>>3&536870908)+e>>2]>>>h&1){b=c;break e}e=H[a+52>>2];H[e-4>>2]=b;if(H[a+56>>2]!=(e|0)){H[e>>2]=c;c=e+4|0;break d}l:{h=H[a+48>>2];f=e-h|0;g=f>>2;d=g+1|0;if(d>>>0<1073741824){b=f>>>1|0;f=f>>>0>=2147483644?1073741823:b>>>0>d>>>0?b:d;if(f){if(f>>>0>=1073741824){break l}d=pa(f<<2)}else{d=0}b=d+(g<<2)|0;H[b>>2]=c;c=b+4|0;if((e|0)!=(h|0)){while(1){b=b-4|0;e=e-4|0;H[b>>2]=H[e>>2];if((e|0)!=(h|0)){continue}break}}H[a+56>>2]=d+(f<<2);H[a+52>>2]=c;H[a+48>>2]=b;if(!h){break c}oa(h);c=H[a+52>>2];break c}sa();v()}wa();v()}H[(f<<2)+e>>2]=d|i;if((b|0)!=-1){continue}break}return 0}H[a+52>>2]=c}if(H[a+48>>2]!=(c|0)){continue}break}}return 1}function uj(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;g=ca-32|0;ca=g;H[a+68>>2]=f;d=H[a+56>>2];e=H[d>>2];d=H[d+4>>2];H[g+24>>2]=0;H[g+16>>2]=0;H[g+20>>2]=0;a:{d=d-e|0;if((d|0)>0){m=a+60|0;d=d>>>2|0;n=d>>>0<=1?1:d;o=a+112|0;while(1){e=H[a+56>>2];d=H[e>>2];if(H[e+4>>2]-d>>2>>>0<=j>>>0){break a}Nb(m,H[d+(j<<2)>>2],g+16|0);i=H[g+20>>2];d=i>>31;h=H[g+16>>2];e=h>>31;f=(d^i)-d+((e^h)-e)|0;k=H[g+24>>2];d=k>>31;e=(d^k)-d|0;d=0;l=e;e=e+f|0;d=l>>>0>e>>>0?1:d;b:{if(!(d|e)){H[g+16>>2]=H[a+108>>2];break b}f=H[a+108>>2];l=f>>31;h=Sj(Rj(f,l,h,h>>31),da,e,d);H[g+16>>2]=h;d=Sj(Rj(f,l,i,i>>31),da,e,d);H[g+20>>2]=d;e=d;d=d>>31;e=(e^d)-d|0;d=h>>31;d=e+((d^h)-d|0)|0;if((k|0)>=0){H[g+24>>2]=f-d;break b}H[g+24>>2]=d-f}d=Ba(o);f=H[g+16>>2];c:{if(d){H[g+24>>2]=0-H[g+24>>2];e=0-H[g+20>>2]|0;H[g+20>>2]=e;f=0-f|0;H[g+16>>2]=f;break c}e=H[g+20>>2]}d:{if((f|0)>=0){f=H[a+108>>2];d=f+H[g+24>>2]|0;f=e+f|0;break d}e:{if((e|0)<0){d=H[g+24>>2];f=d>>31;f=(d^f)-f|0;break e}d=H[g+24>>2];f=d>>31;f=H[a+100>>2]+(f-(d^f)|0)|0}if((d|0)<0){d=e>>31;d=(d^e)-d|0;break d}d=e>>31;d=H[a+100>>2]+(d-(d^e)|0)|0}e=H[a+100>>2];f:{if(!(d|f)){d=e;f=d;break f}if(!((d|0)!=(e|0)|f)){f=d;break f}if(!((e|0)!=(f|0)|d)){d=f;break f}g:{if(f){break g}i=H[a+108>>2];if((i|0)>=(d|0)){break g}d=(i<<1)-d|0;f=0;break f}h:{if((e|0)!=(f|0)){break h}i=H[a+108>>2];if((i|0)<=(d|0)){break h}d=(i<<1)-d|0;break f}i:{if((d|0)!=(e|0)){break i}e=H[a+108>>2];if((e|0)<=(f|0)){break i}f=(e<<1)-f|0;break f}if(d){break f}d=0;e=H[a+108>>2];if((e|0)>=(f|0)){break f}f=(e<<1)-f|0}H[g+12>>2]=d;H[g+8>>2]=f;j:{if(H[a+8>>2]<=0){break j}i=H[a+32>>2];f=0;while(1){d=f<<2;e=H[d+(g+8|0)>>2];h=H[a+16>>2];k:{if((e|0)>(h|0)){H[d+i>>2]=h;break k}d=d+i|0;h=H[a+12>>2];if((h|0)>(e|0)){H[d>>2]=h;break k}H[d>>2]=e}f=f+1|0;e=H[a+8>>2];if((f|0)<(e|0)){continue}break}d=0;if((e|0)<=0){break j}e=j<<3;h=e+c|0;k=b+e|0;while(1){f=d<<2;e=f+h|0;f=H[f+k>>2]+H[f+i>>2]|0;H[e>>2]=f;l:{if((f|0)>H[a+16>>2]){f=f-H[a+20>>2]|0}else{if((f|0)>=H[a+12>>2]){break l}f=f+H[a+20>>2]|0}H[e>>2]=f}d=d+1|0;if((d|0)<H[a+8>>2]){continue}break}}j=j+1|0;if((n|0)!=(j|0)){continue}break}}ca=g+32|0;return 1}Ca();v()}function dj(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;g=ca-32|0;ca=g;H[a+68>>2]=f;d=H[a+56>>2];e=H[d>>2];d=H[d+4>>2];H[g+24>>2]=0;H[g+16>>2]=0;H[g+20>>2]=0;a:{d=d-e|0;if((d|0)>0){m=a+60|0;d=d>>>2|0;n=d>>>0<=1?1:d;o=a+112|0;while(1){e=H[a+56>>2];d=H[e>>2];if(H[e+4>>2]-d>>2>>>0<=j>>>0){break a}Lb(m,H[d+(j<<2)>>2],g+16|0);i=H[g+20>>2];d=i>>31;h=H[g+16>>2];e=h>>31;f=(d^i)-d+((e^h)-e)|0;k=H[g+24>>2];d=k>>31;e=(d^k)-d|0;d=0;l=e;e=e+f|0;d=l>>>0>e>>>0?1:d;b:{if(!(d|e)){H[g+16>>2]=H[a+108>>2];break b}f=H[a+108>>2];l=f>>31;h=Sj(Rj(f,l,h,h>>31),da,e,d);H[g+16>>2]=h;d=Sj(Rj(f,l,i,i>>31),da,e,d);H[g+20>>2]=d;e=d;d=d>>31;e=(e^d)-d|0;d=h>>31;d=e+((d^h)-d|0)|0;if((k|0)>=0){H[g+24>>2]=f-d;break b}H[g+24>>2]=d-f}d=Ba(o);f=H[g+16>>2];c:{if(d){H[g+24>>2]=0-H[g+24>>2];e=0-H[g+20>>2]|0;H[g+20>>2]=e;f=0-f|0;H[g+16>>2]=f;break c}e=H[g+20>>2]}d:{if((f|0)>=0){f=H[a+108>>2];d=f+H[g+24>>2]|0;f=e+f|0;break d}e:{if((e|0)<0){d=H[g+24>>2];f=d>>31;f=(d^f)-f|0;break e}d=H[g+24>>2];f=d>>31;f=H[a+100>>2]+(f-(d^f)|0)|0}if((d|0)<0){d=e>>31;d=(d^e)-d|0;break d}d=e>>31;d=H[a+100>>2]+(d-(d^e)|0)|0}e=H[a+100>>2];f:{if(!(d|f)){d=e;f=d;break f}if(!((d|0)!=(e|0)|f)){f=d;break f}if(!((e|0)!=(f|0)|d)){d=f;break f}g:{if(f){break g}i=H[a+108>>2];if((i|0)>=(d|0)){break g}d=(i<<1)-d|0;f=0;break f}h:{if((e|0)!=(f|0)){break h}i=H[a+108>>2];if((i|0)<=(d|0)){break h}d=(i<<1)-d|0;break f}i:{if((d|0)!=(e|0)){break i}e=H[a+108>>2];if((e|0)<=(f|0)){break i}f=(e<<1)-f|0;break f}if(d){break f}d=0;e=H[a+108>>2];if((e|0)>=(f|0)){break f}f=(e<<1)-f|0}H[g+12>>2]=d;H[g+8>>2]=f;j:{if(H[a+8>>2]<=0){break j}i=H[a+32>>2];f=0;while(1){d=f<<2;e=H[d+(g+8|0)>>2];h=H[a+16>>2];k:{if((e|0)>(h|0)){H[d+i>>2]=h;break k}d=d+i|0;h=H[a+12>>2];if((h|0)>(e|0)){H[d>>2]=h;break k}H[d>>2]=e}f=f+1|0;e=H[a+8>>2];if((f|0)<(e|0)){continue}break}d=0;if((e|0)<=0){break j}e=j<<3;h=e+c|0;k=b+e|0;while(1){f=d<<2;e=f+h|0;f=H[f+k>>2]+H[f+i>>2]|0;H[e>>2]=f;l:{if((f|0)>H[a+16>>2]){f=f-H[a+20>>2]|0}else{if((f|0)>=H[a+12>>2]){break l}f=f+H[a+20>>2]|0}H[e>>2]=f}d=d+1|0;if((d|0)<H[a+8>>2]){continue}break}}j=j+1|0;if((n|0)!=(j|0)){continue}break}}ca=g+32|0;return 1}Ca();v()}function ke(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;h=ca-80|0;ca=h;a:{b:{if(I[H[a+28>>2]+36|0]<=1){d=H[b+20>>2];f=H[b+16>>2];c=f+4|0;d=c>>>0<4?d+1|0:d;g=H[b+12>>2];if(K[b+8>>2]<c>>>0&(g|0)<=(d|0)|(d|0)>(g|0)){break a}f=f+H[b>>2]|0;j=I[f|0]|I[f+1|0]<<8|(I[f+2|0]<<16|I[f+3|0]<<24);H[b+16>>2]=c;H[b+20>>2]=d;break b}if(!Pc(1,h+76|0,b)){break a}j=H[h+76>>2]}if(!j){break a}d=H[b+8>>2];c=H[b+16>>2];d=Rj(d-c|0,H[b+12>>2]-(H[b+20>>2]+(c>>>0>d>>>0)|0)|0,5,0);c=da;if(d>>>0<j>>>0&(c|0)<=0|(c|0)<0){break a}c=H[a+4>>2];d=H[a+8>>2]-c>>2;c:{if(d>>>0<j>>>0){ya(a+4|0,j-d|0);break c}if(d>>>0<=j>>>0){break c}H[a+8>>2]=c+(j<<2)}p=a+16|0;l=H[a+32>>2];while(1){i=H[b+12>>2];c=i;d=H[b+20>>2];e=H[b+8>>2];f=H[b+16>>2];if((c|0)<=(d|0)&e>>>0<=f>>>0|(c|0)<(d|0)){e=0;break a}n=H[b>>2];q=I[n+f|0];c=d;g=f+1|0;c=g?c:c+1|0;H[b+16>>2]=g;H[b+20>>2]=c;if(e>>>0<=g>>>0&(c|0)>=(i|0)|(c|0)>(i|0)){e=0;break a}g=I[g+n|0];c=d;k=f+2|0;c=k>>>0<2?c+1|0:c;H[b+16>>2]=k;H[b+20>>2]=c;if(e>>>0<=k>>>0&(c|0)>=(i|0)|(c|0)>(i|0)){e=0;break a}k=I[k+n|0];c=d;m=f+3|0;c=m>>>0<3?c+1|0:c;H[b+16>>2]=m;H[b+20>>2]=c;if(e>>>0<=m>>>0&(c|0)>=(i|0)|(c|0)>(i|0)){e=0;break a}e=I[m+n|0];c=d;d=f+4|0;c=d>>>0<4?c+1|0:c;H[b+16>>2]=d;H[b+20>>2]=c;if(q>>>0>4){e=0;break a}if((g-12&255)>>>0<245){e=0;break a}if(!k){e=0;break a}m=Eb(h+8|0);i=(e|0)!=0;d=g-1|0;if(d>>>0<=10){c=H[(d<<2)+13584>>2]}else{c=-1}d=N(c,k);lc(m,q,k,g,i,d,d>>31);d:{d=J[H[a+28>>2]+36>>1];e:{if(((d<<8|d>>>8)&65535)>>>0<=258){c=H[b+20>>2];f=H[b+16>>2];d=f+2|0;c=d>>>0<2?c+1|0:c;e=H[b+12>>2];if(K[b+8>>2]<d>>>0&(e|0)<=(c|0)|(c|0)>(e|0)){break d}f=f+H[b>>2]|0;e=I[f|0]|I[f+1|0]<<8;H[b+16>>2]=d;H[b+20>>2]=c;break e}if(!Pc(1,h+4|0,b)){break d}e=H[h+4>>2]}H[h+68>>2]=e;d=jc(pa(96),m);ea[H[H[l>>2]+8>>2]](l,H[l+12>>2]-H[l+8>>2]>>2,d);d=(H[l+12>>2]-H[l+8>>2]>>2)-1|0;f=d<<2;H[H[f+H[l+8>>2]>>2]+60>>2]=e;H[H[a+4>>2]+(o<<2)>>2]=d;e=H[a+16>>2];c=H[a+20>>2]-e>>2;f:{if((c|0)>(d|0)){break f}H[h>>2]=-1;d=d+1|0;if(d>>>0>c>>>0){Pa(p,d-c|0,h);e=H[p>>2];break f}if(c>>>0<=d>>>0){break f}H[a+20>>2]=(d<<2)+e}H[e+f>>2]=o;e=1;o=o+1|0;if((o|0)!=(j|0)){continue}break a}break}e=0}ca=h+80|0;return e|0}function nd(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;n=ea[H[H[a>>2]+44>>2]](a)|0;a:{if((n|0)<=0){break a}i=H[b+4>>2]-H[b>>2]>>2;e=ca+-64|0;ca=e;f=Eb(e);d=N(H[3400],n);lc(f,H[H[a+8>>2]+56>>2],n&255,5,0,d,d>>31);f=jc(pa(96),f);F[f+84|0]=1;H[f+72>>2]=H[f+68>>2];mb(f,i);H[f+60>>2]=H[H[a+8>>2]+60>>2];d=H[a+16>>2];H[a+16>>2]=f;if(d){Ga(d)}ca=e- -64|0;h=H[a+16>>2];if(!H[h+80>>2]){break a}j=H[H[h>>2]>>2];if(!j){break a}m=H[c+12>>2];e=m;d=H[c+20>>2];g=H[c+8>>2];k=H[c+16>>2];if((e|0)<=(d|0)&g>>>0<=k>>>0|(d|0)>(e|0)){break a}l=N(i,n);i=j+H[h+48>>2]|0;h=H[c>>2];j=I[h+k|0];e=k+1|0;f=e?d:d+1|0;H[c+16>>2]=e;H[c+20>>2]=f;b:{c:{if(j){if(kd(l,n,c,i)){break c}break a}if((f|0)>=(m|0)&e>>>0>=g>>>0|(f|0)>(m|0)){break a}g=I[e+h|0];f=k+2|0;d=f>>>0<2?d+1|0:d;H[c+16>>2]=f;H[c+20>>2]=d;d=H[H[a+16>>2]+64>>2];d=H[d+4>>2]-H[d>>2]|0;if((g|0)==H[3400]){e=l<<2;if(e>>>0>d>>>0){break a}g=H[c+8>>2];k=H[c+12>>2];j=H[c+20>>2];d=H[c+16>>2];f=e+d|0;j=f>>>0<e>>>0?j+1|0:j;if(f>>>0>g>>>0&(j|0)>=(k|0)|(j|0)>(k|0)){break a}qa(i,d+H[c>>2]|0,e);f=H[c+20>>2];d=e+H[c+16>>2]|0;f=d>>>0<e>>>0?f+1|0:f;H[c+16>>2]=d;H[c+20>>2]=f;break c}if(d>>>0<N(g,l)>>>0){break a}d=H[c+8>>2];f=H[c+16>>2];e=d-f|0;m=d>>>0<f>>>0;d=H[c+20>>2];k=H[c+12>>2]-(m+d|0)|0;m=Rj(g,0,l,0)>>>0>e>>>0;e=da;if(m&(e|0)>=(k|0)|(e|0)>(k|0)){break a}e=1;if(!l){break b}h=0;while(1){k=H[c+8>>2];j=H[c+12>>2];e=f+g|0;d=e>>>0<g>>>0?d+1|0:d;if(e>>>0>k>>>0&(d|0)>=(j|0)|(d|0)>(j|0)){return 0}qa(i+(h<<2)|0,H[c>>2]+f|0,g);d=H[c+20>>2];f=g+H[c+16>>2]|0;d=f>>>0<g>>>0?d+1|0:d;H[c+16>>2]=f;H[c+20>>2]=d;h=h+1|0;if((l|0)!=(h|0)){continue}break}}e=1;if(!l){break b}d=H[a+20>>2];if(d){e=0;if(ea[H[H[d>>2]+32>>2]](d)|0){break b}}g=0;h=0;d:{if((l|0)<=0){break d}if((l|0)!=1){f=l&-2;while(1){e=g<<2;d=H[e+i>>2];H[e+i>>2]=0-(d&1)^d>>>1;d=e|4;e=H[d+i>>2];H[d+i>>2]=0-(e&1)^e>>>1;g=g+2|0;h=h+2|0;if((f|0)!=(h|0)){continue}break}}if(!(l&1)){break d}d=g<<2;f=H[d+i>>2];H[d+i>>2]=0-(f&1)^f>>>1}e=0}d=e;f=H[a+20>>2];e:{if(!f){break e}if(!(ea[H[H[f>>2]+40>>2]](f,c)|0)){break a}if(d){break e}a=H[a+20>>2];if(!(ea[H[H[a>>2]+44>>2]](a,i,i,l,n,H[b>>2])|0)){break a}}o=1}return o|0}function pb(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;h=ca-32|0;ca=h;a:{b:{if(H[a+8>>2]<<5>>>0>=b>>>0){break b}if((b|0)<0){break a}b=(b-1>>>5|0)+1|0;c=pa(b<<2);H[h+24>>2]=b;H[h+20>>2]=0;H[h+16>>2]=c;b=H[a>>2];H[h+12>>2]=0;H[h+8>>2]=b;c=H[a+4>>2];H[h+4>>2]=c&31;H[h>>2]=b+(c>>>3&536870908);e=ca-32|0;ca=e;i=H[h+4>>2];g=H[h+12>>2];j=H[h>>2];d=H[h+8>>2];b=(i-g|0)+(j-d<<3)|0;f=H[h+20>>2];c=b+f|0;H[h+20>>2]=c;if(!((c-1^f-1)>>>0<32?f:0)){H[H[h+16>>2]+((c>>>0>=33?c-1>>>5|0:0)<<2)>>2]=0}c=H[h+16>>2]+(f>>>3&536870908)|0;f=f&31;c:{if((f|0)==(g|0)){if((b|0)<=0){break c}if(g){i=32-g|0;f=(b|0)<(i|0)?b:i;i=-1<<g&-1>>>i-f;H[c>>2]=H[c>>2]&(i^-1)|i&H[d>>2];d=d+4|0;c=(g+f>>>3&536870908)+c|0;b=b-f|0}g=(b|0)/32|0;if(b+31>>>0>=63){va(c,d,g<<2)}b=b-(g<<5)|0;if((b|0)<=0){break c}f=c;c=g<<2;g=f+c|0;b=-1>>>32-b|0;H[g>>2]=H[g>>2]&(b^-1)|b&H[c+d>>2];break c}H[e+28>>2]=g;H[e+24>>2]=d;H[e+20>>2]=i;H[e+16>>2]=j;H[e+12>>2]=f;H[e+8>>2]=c;b=H[e+28>>2];c=H[e+24>>2];g=(H[e+20>>2]-b|0)+(H[e+16>>2]-c<<3)|0;d:{if((g|0)<=0){b=H[e+12>>2];d=H[e+8>>2];break d}e:{if(!b){b=H[e+12>>2];break e}d=H[e+12>>2];j=32-d|0;k=32-b|0;f=(g|0)<(k|0)?g:k;i=f>>>0>j>>>0?j:f;l=H[e+8>>2];m=H[l>>2]&(-1<<d&-1>>>j-i^-1);j=H[c>>2]&(-1<<b&-1>>>k-f);H[l>>2]=m|(b>>>0<d>>>0?j<<d-b:j>>>b-d|0);c=d+i|0;b=c&31;H[e+12>>2]=b;d=l+(c>>>3&536870908)|0;H[e+8>>2]=d;c=f-i|0;if((c|0)>0){H[d>>2]=H[d>>2]&(-1>>>32-c^-1)|j>>>i+H[e+28>>2];H[e+12>>2]=c;b=c}g=g-f|0;c=H[e+24>>2]+4|0;H[e+24>>2]=c}i=-1<<b;f=32-b|0;if((g|0)>=32){j=i^-1;while(1){d=H[e+8>>2];c=H[c>>2];H[d>>2]=j&H[d>>2]|c<<b;H[e+8>>2]=d+4;H[d+4>>2]=i&H[d+4>>2]|c>>>f;c=H[e+24>>2]+4|0;H[e+24>>2]=c;d=g>>>0>63;g=g-32|0;if(d){continue}break}}d=H[e+8>>2];if((g|0)<=0){break d}j=f;f=(g|0)>(f|0)?f:g;j=H[d>>2]&(i&-1>>>j-f^-1);i=H[c>>2]&-1>>>32-g;H[d>>2]=j|i<<b;b=b+f|0;c=b&31;H[e+12>>2]=c;d=(b>>>3&536870908)+d|0;H[e+8>>2]=d;b=g-f|0;if((b|0)<=0){b=c;break d}H[d>>2]=H[d>>2]&(-1>>>32-b^-1)|i>>>f;H[e+12>>2]=b}H[e+4>>2]=b;H[e>>2]=d}ca=e+32|0;b=H[a>>2];H[a>>2]=H[h+16>>2];H[h+16>>2]=b;c=H[a+4>>2];H[a+4>>2]=H[h+20>>2];H[h+20>>2]=c;c=H[a+8>>2];H[a+8>>2]=H[h+24>>2];H[h+24>>2]=c;if(!b){break b}oa(b)}ca=h+32|0;return}sa();v()}function Ne(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;c=J[b+38>>1];a:{if(!c){break a}b:{if(c>>>0<=511){g=H[b+8>>2];e=H[b+12>>2];d=H[b+20>>2];c=H[b+16>>2];i=c+4|0;d=i>>>0<4?d+1|0:d;if(g>>>0<i>>>0&(d|0)>=(e|0)|(d|0)>(e|0)){break a}c=c+H[b>>2]|0;f=I[c|0]|I[c+1|0]<<8|(I[c+2|0]<<16|I[c+3|0]<<24);H[a+12>>2]=f;d=H[b+20>>2];c=H[b+16>>2]+4|0;d=c>>>0<4?d+1|0:d;H[b+16>>2]=c;H[b+20>>2]=d;break b}if(!hb(1,a+12|0,b)){break a}c=H[b+16>>2];d=H[b+20>>2];f=H[a+12>>2]}e=H[b+8>>2];i=e-c|0;c=H[b+12>>2]-(d+(c>>>0>e>>>0)|0)|0;if(i>>>0<f>>>6>>>0&(c|0)<=0|(c|0)<0){break a}d=H[a>>2];c=H[a+4>>2]-d>>2;c:{if(c>>>0<f>>>0){ya(a,f-c|0);f=H[a+12>>2];break c}if(c>>>0<=f>>>0){break c}H[a+4>>2]=d+(f<<2)}if(!f){return 1}c=H[b+16>>2];d=H[b+20>>2];l=H[a>>2];i=H[b+8>>2];j=H[b+12>>2];g=0;while(1){if((d|0)>=(j|0)&c>>>0>=i>>>0|(d|0)>(j|0)){return 0}m=H[b>>2];k=I[m+c|0];c=c+1|0;d=c?d:d+1|0;H[b+16>>2]=c;H[b+20>>2]=d;e=k>>>2|0;h=0;d:{e:{f:{g:{n=k&3;switch(n|0){case 0:break e;case 3:break g;default:break f}}e=e+g|0;if(e>>>0>=f>>>0){return 0}ra(l+(g<<2)|0,0,(k&252)+4|0);g=e;break d}while(1){if((c|0)==(i|0)&(d|0)==(j|0)){break a}f=I[c+m|0];c=c+1|0;d=c?d:d+1|0;H[b+16>>2]=c;H[b+20>>2]=d;e=f<<(h<<3|6)|e;h=h+1|0;if((n|0)!=(h|0)){continue}break}}H[l+(g<<2)>>2]=e}f=H[a+12>>2];g=g+1|0;if(f>>>0>g>>>0){continue}break}b=a+16|0;i=H[a>>2];d=H[a+16>>2];c=H[a+20>>2]-d|0;h:{if(c>>>0<=16383){ya(b,4096-(c>>>2|0)|0);break h}if((c|0)==16384){break h}H[a+20>>2]=d+16384}c=a+28|0;g=H[c>>2];d=H[a+32>>2]-g>>3;i:{if(d>>>0<f>>>0){ob(c,f-d|0);g=H[c>>2];break i}if(d>>>0>f>>>0){H[a+32>>2]=(f<<3)+g}if(!f){break a}}d=H[b>>2];b=0;a=0;while(1){c=i+(b<<2)|0;h=H[c>>2];e=a;j=(b<<3)+g|0;H[j+4>>2]=a;H[j>>2]=h;c=H[c>>2];a=c+a|0;if(a>>>0>4096){break a}j:{if(a>>>0<=e>>>0){break j}h=0;j=c&7;if(j){while(1){H[d+(e<<2)>>2]=b;e=e+1|0;h=h+1|0;if((j|0)!=(h|0)){continue}break}}if(c-1>>>0<=6){break j}while(1){c=d+(e<<2)|0;H[c>>2]=b;H[c+28>>2]=b;H[c+24>>2]=b;H[c+20>>2]=b;H[c+16>>2]=b;H[c+12>>2]=b;H[c+8>>2]=b;H[c+4>>2]=b;e=e+8|0;if((e|0)!=(a|0)){continue}break}}b=b+1|0;if((f|0)!=(b|0)){continue}break}o=(a|0)==4096}return o}function Ni(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;g=ca-48|0;ca=g;d=H[a+8>>2];if(d-2>>>0<=28){H[a+76>>2]=d;e=-1<<d;d=-2-e|0;H[a+84>>2]=d;H[a+80>>2]=e^-1;H[a+92>>2]=(d|0)/2;L[a+88>>2]=O(2)/O(d|0)}H[a+52>>2]=f;d=H[a+40>>2];e=H[d>>2];d=H[d+4>>2];H[g+16>>2]=0;H[g+8>>2]=0;H[g+12>>2]=0;a:{d=d-e|0;if((d|0)>0){m=a+8|0;n=a+44|0;d=d>>>2|0;o=d>>>0<=1?1:d;p=a+96|0;while(1){e=H[a+40>>2];d=H[e>>2];if(H[e+4>>2]-d>>2>>>0<=j>>>0){break a}Nb(n,H[d+(j<<2)>>2],g+8|0);h=H[g+12>>2];d=h>>31;i=H[g+8>>2];e=i>>31;f=(d^h)-d+((e^i)-e)|0;l=H[g+16>>2];d=l>>31;e=(d^l)-d|0;d=0;k=e;e=e+f|0;d=k>>>0>e>>>0?1:d;b:{if(!(d|e)){H[g+8>>2]=H[a+92>>2];break b}f=H[a+92>>2];k=f>>31;i=Sj(Rj(f,k,i,i>>31),da,e,d);H[g+8>>2]=i;d=Sj(Rj(f,k,h,h>>31),da,e,d);H[g+12>>2]=d;e=d>>31;e=(d^e)-e|0;d=i>>31;d=e+((d^i)-d|0)|0;if((l|0)>=0){H[g+16>>2]=f-d;break b}H[g+16>>2]=d-f}d=Ba(p);f=H[g+8>>2];c:{if(d){H[g+16>>2]=0-H[g+16>>2];e=0-H[g+12>>2]|0;H[g+12>>2]=e;f=0-f|0;H[g+8>>2]=f;break c}e=H[g+12>>2]}d:{if((f|0)>=0){f=H[a+92>>2];d=f+H[g+16>>2]|0;f=e+f|0;break d}e:{if((e|0)<0){d=H[g+16>>2];f=d>>31;f=(d^f)-f|0;break e}d=H[g+16>>2];f=d>>31;f=H[a+84>>2]+(f-(d^f)|0)|0}if((d|0)<0){d=e>>31;d=(d^e)-d|0;break d}d=e>>31;d=H[a+84>>2]+(d-(d^e)|0)|0}e=H[a+84>>2];f:{if(!(d|f)){d=e;f=d;break f}if(!((d|0)!=(e|0)|f)){f=d;break f}if(!((e|0)!=(f|0)|d)){d=f;break f}g:{if(f){break g}h=H[a+92>>2];if((h|0)>=(d|0)){break g}d=(h<<1)-d|0;f=0;break f}h:{if((e|0)!=(f|0)){break h}h=H[a+92>>2];if((h|0)<=(d|0)){break h}d=(h<<1)-d|0;break f}i:{if((d|0)!=(e|0)){break i}e=H[a+92>>2];if((e|0)<=(f|0)){break i}f=(e<<1)-f|0;break f}if(d){break f}d=0;e=H[a+92>>2];if((e|0)>=(f|0)){break f}f=(e<<1)-f|0}e=j<<3;h=e+b|0;i=H[h>>2];h=H[h+4>>2];H[g+36>>2]=d;H[g+32>>2]=f;H[g+24>>2]=i;H[g+28>>2]=h;qc(g+40|0,m,g+32|0,g+24|0);d=c+e|0;H[d>>2]=H[g+40>>2];H[d+4>>2]=H[g+44>>2];j=j+1|0;if((o|0)!=(j|0)){continue}break}}ca=g+48|0;return 1}Ca();v()}function Ii(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;g=ca-48|0;ca=g;d=H[a+8>>2];if(d-2>>>0<=28){H[a+76>>2]=d;e=-1<<d;d=-2-e|0;H[a+84>>2]=d;H[a+80>>2]=e^-1;H[a+92>>2]=(d|0)/2;L[a+88>>2]=O(2)/O(d|0)}H[a+52>>2]=f;d=H[a+40>>2];e=H[d>>2];d=H[d+4>>2];H[g+16>>2]=0;H[g+8>>2]=0;H[g+12>>2]=0;a:{d=d-e|0;if((d|0)>0){m=a+8|0;n=a+44|0;d=d>>>2|0;o=d>>>0<=1?1:d;p=a+96|0;while(1){e=H[a+40>>2];d=H[e>>2];if(H[e+4>>2]-d>>2>>>0<=j>>>0){break a}Lb(n,H[d+(j<<2)>>2],g+8|0);h=H[g+12>>2];d=h>>31;i=H[g+8>>2];e=i>>31;f=(d^h)-d+((e^i)-e)|0;l=H[g+16>>2];d=l>>31;e=(d^l)-d|0;d=0;k=e;e=e+f|0;d=k>>>0>e>>>0?1:d;b:{if(!(d|e)){H[g+8>>2]=H[a+92>>2];break b}f=H[a+92>>2];k=f>>31;i=Sj(Rj(f,k,i,i>>31),da,e,d);H[g+8>>2]=i;d=Sj(Rj(f,k,h,h>>31),da,e,d);H[g+12>>2]=d;e=d>>31;e=(d^e)-e|0;d=i>>31;d=e+((d^i)-d|0)|0;if((l|0)>=0){H[g+16>>2]=f-d;break b}H[g+16>>2]=d-f}d=Ba(p);f=H[g+8>>2];c:{if(d){H[g+16>>2]=0-H[g+16>>2];e=0-H[g+12>>2]|0;H[g+12>>2]=e;f=0-f|0;H[g+8>>2]=f;break c}e=H[g+12>>2]}d:{if((f|0)>=0){f=H[a+92>>2];d=f+H[g+16>>2]|0;f=e+f|0;break d}e:{if((e|0)<0){d=H[g+16>>2];f=d>>31;f=(d^f)-f|0;break e}d=H[g+16>>2];f=d>>31;f=H[a+84>>2]+(f-(d^f)|0)|0}if((d|0)<0){d=e>>31;d=(d^e)-d|0;break d}d=e>>31;d=H[a+84>>2]+(d-(d^e)|0)|0}e=H[a+84>>2];f:{if(!(d|f)){d=e;f=d;break f}if(!((d|0)!=(e|0)|f)){f=d;break f}if(!((e|0)!=(f|0)|d)){d=f;break f}g:{if(f){break g}h=H[a+92>>2];if((h|0)>=(d|0)){break g}d=(h<<1)-d|0;f=0;break f}h:{if((e|0)!=(f|0)){break h}h=H[a+92>>2];if((h|0)<=(d|0)){break h}d=(h<<1)-d|0;break f}i:{if((d|0)!=(e|0)){break i}e=H[a+92>>2];if((e|0)<=(f|0)){break i}f=(e<<1)-f|0;break f}if(d){break f}d=0;e=H[a+92>>2];if((e|0)>=(f|0)){break f}f=(e<<1)-f|0}e=j<<3;h=e+b|0;i=H[h>>2];h=H[h+4>>2];H[g+36>>2]=d;H[g+32>>2]=f;H[g+24>>2]=i;H[g+28>>2]=h;qc(g+40|0,m,g+32|0,g+24|0);d=c+e|0;H[d>>2]=H[g+40>>2];H[d+4>>2]=H[g+44>>2];j=j+1|0;if((o|0)!=(j|0)){continue}break}}ca=g+48|0;return 1}Ca();v()}function Wi(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;g=ca-48|0;ca=g;d=H[a+8>>2];if(d-2>>>0<=28){H[a+76>>2]=d;e=-1<<d;d=-2-e|0;H[a+84>>2]=d;H[a+80>>2]=e^-1;H[a+92>>2]=(d|0)/2;L[a+88>>2]=O(2)/O(d|0)}H[a+52>>2]=f;d=H[a+40>>2];e=H[d>>2];d=H[d+4>>2];H[g+16>>2]=0;H[g+8>>2]=0;H[g+12>>2]=0;a:{d=d-e|0;if((d|0)>0){m=a+8|0;n=a+44|0;d=d>>>2|0;o=d>>>0<=1?1:d;p=a+96|0;while(1){e=H[a+40>>2];d=H[e>>2];if(H[e+4>>2]-d>>2>>>0<=j>>>0){break a}Nb(n,H[d+(j<<2)>>2],g+8|0);h=H[g+12>>2];d=h>>31;i=H[g+8>>2];e=i>>31;f=(d^h)-d+((e^i)-e)|0;l=H[g+16>>2];d=l>>31;e=(d^l)-d|0;d=0;k=e;e=e+f|0;d=k>>>0>e>>>0?1:d;b:{if(!(d|e)){H[g+8>>2]=H[a+92>>2];break b}f=H[a+92>>2];k=f>>31;i=Sj(Rj(f,k,i,i>>31),da,e,d);H[g+8>>2]=i;d=Sj(Rj(f,k,h,h>>31),da,e,d);H[g+12>>2]=d;e=d>>31;e=(d^e)-e|0;d=i>>31;d=e+((d^i)-d|0)|0;if((l|0)>=0){H[g+16>>2]=f-d;break b}H[g+16>>2]=d-f}d=Ba(p);f=H[g+8>>2];c:{if(d){H[g+16>>2]=0-H[g+16>>2];e=0-H[g+12>>2]|0;H[g+12>>2]=e;f=0-f|0;H[g+8>>2]=f;break c}e=H[g+12>>2]}d:{if((f|0)>=0){f=H[a+92>>2];d=f+H[g+16>>2]|0;f=e+f|0;break d}e:{if((e|0)<0){d=H[g+16>>2];f=d>>31;f=(d^f)-f|0;break e}d=H[g+16>>2];f=d>>31;f=H[a+84>>2]+(f-(d^f)|0)|0}if((d|0)<0){d=e>>31;d=(d^e)-d|0;break d}d=e>>31;d=H[a+84>>2]+(d-(d^e)|0)|0}e=H[a+84>>2];f:{if(!(d|f)){d=e;f=d;break f}if(!((d|0)!=(e|0)|f)){f=d;break f}if(!((e|0)!=(f|0)|d)){d=f;break f}g:{if(f){break g}h=H[a+92>>2];if((h|0)>=(d|0)){break g}d=(h<<1)-d|0;f=0;break f}h:{if((e|0)!=(f|0)){break h}h=H[a+92>>2];if((h|0)<=(d|0)){break h}d=(h<<1)-d|0;break f}i:{if((d|0)!=(e|0)){break i}e=H[a+92>>2];if((e|0)<=(f|0)){break i}f=(e<<1)-f|0;break f}if(d){break f}d=0;e=H[a+92>>2];if((e|0)>=(f|0)){break f}f=(e<<1)-f|0}e=j<<3;h=e+b|0;i=H[h+4>>2];H[g+40>>2]=H[h>>2];H[g+44>>2]=i;H[g+28>>2]=d;H[g+24>>2]=f;rc(g+32|0,m,g+24|0,g+40|0);d=c+e|0;H[d>>2]=H[g+32>>2];H[d+4>>2]=H[g+36>>2];j=j+1|0;if((o|0)!=(j|0)){continue}break}}ca=g+48|0;return 1}Ca();v()}function Ri(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;g=ca-48|0;ca=g;d=H[a+8>>2];if(d-2>>>0<=28){H[a+76>>2]=d;e=-1<<d;d=-2-e|0;H[a+84>>2]=d;H[a+80>>2]=e^-1;H[a+92>>2]=(d|0)/2;L[a+88>>2]=O(2)/O(d|0)}H[a+52>>2]=f;d=H[a+40>>2];e=H[d>>2];d=H[d+4>>2];H[g+16>>2]=0;H[g+8>>2]=0;H[g+12>>2]=0;a:{d=d-e|0;if((d|0)>0){m=a+8|0;n=a+44|0;d=d>>>2|0;o=d>>>0<=1?1:d;p=a+96|0;while(1){e=H[a+40>>2];d=H[e>>2];if(H[e+4>>2]-d>>2>>>0<=j>>>0){break a}Lb(n,H[d+(j<<2)>>2],g+8|0);h=H[g+12>>2];d=h>>31;i=H[g+8>>2];e=i>>31;f=(d^h)-d+((e^i)-e)|0;l=H[g+16>>2];d=l>>31;e=(d^l)-d|0;d=0;k=e;e=e+f|0;d=k>>>0>e>>>0?1:d;b:{if(!(d|e)){H[g+8>>2]=H[a+92>>2];break b}f=H[a+92>>2];k=f>>31;i=Sj(Rj(f,k,i,i>>31),da,e,d);H[g+8>>2]=i;d=Sj(Rj(f,k,h,h>>31),da,e,d);H[g+12>>2]=d;e=d>>31;e=(d^e)-e|0;d=i>>31;d=e+((d^i)-d|0)|0;if((l|0)>=0){H[g+16>>2]=f-d;break b}H[g+16>>2]=d-f}d=Ba(p);f=H[g+8>>2];c:{if(d){H[g+16>>2]=0-H[g+16>>2];e=0-H[g+12>>2]|0;H[g+12>>2]=e;f=0-f|0;H[g+8>>2]=f;break c}e=H[g+12>>2]}d:{if((f|0)>=0){f=H[a+92>>2];d=f+H[g+16>>2]|0;f=e+f|0;break d}e:{if((e|0)<0){d=H[g+16>>2];f=d>>31;f=(d^f)-f|0;break e}d=H[g+16>>2];f=d>>31;f=H[a+84>>2]+(f-(d^f)|0)|0}if((d|0)<0){d=e>>31;d=(d^e)-d|0;break d}d=e>>31;d=H[a+84>>2]+(d-(d^e)|0)|0}e=H[a+84>>2];f:{if(!(d|f)){d=e;f=d;break f}if(!((d|0)!=(e|0)|f)){f=d;break f}if(!((e|0)!=(f|0)|d)){d=f;break f}g:{if(f){break g}h=H[a+92>>2];if((h|0)>=(d|0)){break g}d=(h<<1)-d|0;f=0;break f}h:{if((e|0)!=(f|0)){break h}h=H[a+92>>2];if((h|0)<=(d|0)){break h}d=(h<<1)-d|0;break f}i:{if((d|0)!=(e|0)){break i}e=H[a+92>>2];if((e|0)<=(f|0)){break i}f=(e<<1)-f|0;break f}if(d){break f}d=0;e=H[a+92>>2];if((e|0)>=(f|0)){break f}f=(e<<1)-f|0}e=j<<3;h=e+b|0;i=H[h+4>>2];H[g+40>>2]=H[h>>2];H[g+44>>2]=i;H[g+28>>2]=d;H[g+24>>2]=f;rc(g+32|0,m,g+24|0,g+40|0);d=c+e|0;H[d>>2]=H[g+32>>2];H[d+4>>2]=H[g+36>>2];j=j+1|0;if((o|0)!=(j|0)){continue}break}}ca=g+48|0;return 1}Ca();v()}function Ge(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0;f=ca-16|0;ca=f;c=H[a+4>>2];H[a+40>>2]=H[a>>2];H[a+44>>2]=c;c=H[a+36>>2];H[a+72>>2]=H[a+32>>2];H[a+76>>2]=c;d=H[a+28>>2];c=a- -64|0;H[c>>2]=H[a+24>>2];H[c+4>>2]=d;c=H[a+20>>2];H[a+56>>2]=H[a+16>>2];H[a+60>>2]=c;c=H[a+12>>2];H[a+48>>2]=H[a+8>>2];H[a+52>>2]=c;a:{b:{if(Db(a+40|0,1,f+8|0)){c=H[a+44>>2];H[a>>2]=H[a+40>>2];H[a+4>>2]=c;c=H[a+76>>2];H[a+32>>2]=H[a+72>>2];H[a+36>>2]=c;c=H[a+68>>2];H[a+24>>2]=H[a+64>>2];H[a+28>>2]=c;d=H[a+60>>2];h=d;c=H[a+56>>2];H[a+16>>2]=c;H[a+20>>2]=d;e=H[a+52>>2];d=H[a+48>>2];H[a+8>>2]=d;H[a+12>>2]=e;i=d-c|0;g=H[f+12>>2];e=e-((c>>>0>d>>>0)+h|0)|0;d=H[f+8>>2];if((g|0)==(e|0)&i>>>0>=d>>>0|e>>>0>g>>>0){break b}}c=0;break a}e=h+g|0;c=c+d|0;e=c>>>0<d>>>0?e+1|0:e;H[a+16>>2]=c;H[a+20>>2]=e;c:{if(J[a+38>>1]<=513){c=H[a+4>>2];H[a+96>>2]=H[a>>2];H[a+100>>2]=c;c=H[a+36>>2];H[a+128>>2]=H[a+32>>2];H[a+132>>2]=c;c=H[a+28>>2];H[a+120>>2]=H[a+24>>2];H[a+124>>2]=c;c=H[a+20>>2];H[a+112>>2]=H[a+16>>2];H[a+116>>2]=c;c=H[a+12>>2];H[a+104>>2]=H[a+8>>2];H[a+108>>2]=c;d:{if(Db(a+96|0,1,f+8|0)){c=H[a+100>>2];H[a>>2]=H[a+96>>2];H[a+4>>2]=c;c=H[a+132>>2];H[a+32>>2]=H[a+128>>2];H[a+36>>2]=c;c=H[a+124>>2];H[a+24>>2]=H[a+120>>2];H[a+28>>2]=c;d=H[a+116>>2];h=d;c=H[a+112>>2];H[a+16>>2]=c;H[a+20>>2]=d;e=H[a+108>>2];d=H[a+104>>2];H[a+8>>2]=d;H[a+12>>2]=e;i=d-c|0;g=H[f+12>>2];e=e-((c>>>0>d>>>0)+h|0)|0;d=H[f+8>>2];if((g|0)==(e|0)&i>>>0>=d>>>0|e>>>0>g>>>0){break d}}c=0;break a}e=h+g|0;c=c+d|0;e=c>>>0<d>>>0?e+1|0:e;H[a+16>>2]=c;H[a+20>>2]=e;break c}c=0;if(!ta(a+80|0,a)){break a}}c=0;if(!Fe(a)){break a}c=H[a+4>>2];H[b>>2]=H[a>>2];H[b+4>>2]=c;c=H[a+36>>2];H[b+32>>2]=H[a+32>>2];H[b+36>>2]=c;c=H[a+28>>2];H[b+24>>2]=H[a+24>>2];H[b+28>>2]=c;c=H[a+20>>2];H[b+16>>2]=H[a+16>>2];H[b+20>>2]=c;c=H[a+12>>2];H[b+8>>2]=H[a+8>>2];H[b+12>>2]=c;c=1}ca=f+16|0;return c}function oe(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0;if(!H[a+64>>2]){c=pa(32);H[c+16>>2]=0;H[c+20>>2]=0;H[c+8>>2]=0;H[c>>2]=0;H[c+4>>2]=0;H[c+24>>2]=0;H[c+28>>2]=0;d=H[a+64>>2];H[a+64>>2]=c;if(d){c=H[d>>2];if(c){H[d+4>>2]=c;oa(c)}oa(d);c=H[a+64>>2]}H[a>>2]=c;d=H[c+20>>2];H[a+8>>2]=H[c+16>>2];H[a+12>>2]=d;d=H[c+24>>2];c=H[c+28>>2];H[a+48>>2]=0;H[a+52>>2]=0;H[a+40>>2]=0;H[a+44>>2]=0;H[a+16>>2]=d;H[a+20>>2]=c}a:{F[a+24|0]=I[b+24|0];H[a+28>>2]=H[b+28>>2];F[a+32|0]=I[b+32|0];c=H[b+44>>2];H[a+40>>2]=H[b+40>>2];H[a+44>>2]=c;c=H[b+52>>2];H[a+48>>2]=H[b+48>>2];H[a+52>>2]=c;H[a+56>>2]=H[b+56>>2];c=H[b+12>>2];H[a+8>>2]=H[b+8>>2];H[a+12>>2]=c;c=H[b+20>>2];H[a+16>>2]=H[b+16>>2];H[a+20>>2]=c;H[a+60>>2]=H[b+60>>2];c=H[b>>2];b:{if(!c){H[a>>2]=0;d=1;break b}g=H[a>>2];d=0;if(!g){break b}d=H[c>>2];c=H[c+4>>2]-d|0;se(g,d,c,0);d=1}c:{if(!d){break c}F[a+84|0]=I[b+84|0];H[a+80>>2]=H[b+80>>2];if((a|0)!=(b|0)){Cb(a+68|0,H[b+68>>2],H[b+72>>2])}f=H[b+88>>2];d:{if(f){e=pa(40);b=H[f>>2];H[e+16>>2]=0;H[e+8>>2]=0;H[e+12>>2]=0;H[e>>2]=b;c=H[f+12>>2];b=H[f+8>>2];if((c|0)!=(b|0)){c=c-b|0;if((c|0)<0){break a}b=pa(c);H[e+12>>2]=b;H[e+8>>2]=b;H[e+16>>2]=b+c;c=H[f+8>>2];h=H[f+12>>2];e:{if((c|0)==(h|0)){break e}g=(c^-1)+h|0;d=h-c&7;if(d){while(1){F[b|0]=I[c|0];b=b+1|0;c=c+1|0;i=i+1|0;if((d|0)!=(i|0)){continue}break}}if(g>>>0<7){break e}while(1){F[b|0]=I[c|0];F[b+1|0]=I[c+1|0];F[b+2|0]=I[c+2|0];F[b+3|0]=I[c+3|0];F[b+4|0]=I[c+4|0];F[b+5|0]=I[c+5|0];F[b+6|0]=I[c+6|0];F[b+7|0]=I[c+7|0];b=b+8|0;c=c+8|0;if((h|0)!=(c|0)){continue}break}}H[e+12>>2]=b}b=H[f+36>>2];H[e+32>>2]=H[f+32>>2];H[e+36>>2]=b;b=H[f+28>>2];H[e+24>>2]=H[f+24>>2];H[e+28>>2]=b;b=H[a+88>>2];H[a+88>>2]=e;if(b){break d}break c}b=H[a+88>>2];H[a+88>>2]=0;if(!b){break c}}a=H[b+8>>2];if(a){H[b+12>>2]=a;oa(a)}oa(b)}return}sa();v()}function og(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0;f=ca-32|0;ca=f;e=f+8|0;c=ca-80|0;ca=c;a=H[b+36>>2];H[c+72>>2]=H[b+32>>2];H[c+76>>2]=a;d=H[b+28>>2];a=c- -64|0;H[a>>2]=H[b+24>>2];H[a+4>>2]=d;a=H[b+20>>2];H[c+56>>2]=H[b+16>>2];H[c+60>>2]=a;a=H[b+12>>2];H[c+48>>2]=H[b+8>>2];H[c+52>>2]=a;a=H[b+4>>2];H[c+40>>2]=H[b>>2];H[c+44>>2]=a;nc(c+8|0,c+40|0,c+24|0);a=H[c+8>>2];a:{if(a){H[e>>2]=a;a=e+4|0;if(F[c+23|0]>=0){b=c+8|4;e=H[b+4>>2];H[a>>2]=H[b>>2];H[a+4>>2]=e;H[a+8>>2]=H[b+8>>2];break a}za(a,H[c+12>>2],H[c+16>>2]);if(F[c+23|0]>=0){break a}oa(H[c+12>>2]);break a}if(F[c+23|0]<0){oa(H[c+12>>2])}a=I[c+31|0];if(a>>>0>=2){b=pa(32);F[b+26|0]=0;a=I[1477]|I[1478]<<8;F[b+24|0]=a;F[b+25|0]=a>>>8;a=I[1473]|I[1474]<<8|(I[1475]<<16|I[1476]<<24);d=I[1469]|I[1470]<<8|(I[1471]<<16|I[1472]<<24);F[b+16|0]=d;F[b+17|0]=d>>>8;F[b+18|0]=d>>>16;F[b+19|0]=d>>>24;F[b+20|0]=a;F[b+21|0]=a>>>8;F[b+22|0]=a>>>16;F[b+23|0]=a>>>24;a=I[1465]|I[1466]<<8|(I[1467]<<16|I[1468]<<24);d=I[1461]|I[1462]<<8|(I[1463]<<16|I[1464]<<24);F[b+8|0]=d;F[b+9|0]=d>>>8;F[b+10|0]=d>>>16;F[b+11|0]=d>>>24;F[b+12|0]=a;F[b+13|0]=a>>>8;F[b+14|0]=a>>>16;F[b+15|0]=a>>>24;a=I[1457]|I[1458]<<8|(I[1459]<<16|I[1460]<<24);d=I[1453]|I[1454]<<8|(I[1455]<<16|I[1456]<<24);F[b|0]=d;F[b+1|0]=d>>>8;F[b+2|0]=d>>>16;F[b+3|0]=d>>>24;F[b+4|0]=a;F[b+5|0]=a>>>8;F[b+6|0]=a>>>16;F[b+7|0]=a>>>24;H[c+8>>2]=-1;a=c+8|4;za(a,b,26);d=F[c+23|0];H[e>>2]=H[c+8>>2];e=e+4|0;if((d|0)>=0){d=H[a+4>>2];H[e>>2]=H[a>>2];H[e+4>>2]=d;H[e+8>>2]=H[a+8>>2];oa(b);break a}za(e,H[c+12>>2],H[c+16>>2]);if(F[c+23|0]<0){oa(H[c+12>>2])}oa(b);break a}H[e>>2]=0;H[e+4>>2]=0;H[e+16>>2]=a;H[e+8>>2]=0;H[e+12>>2]=0}ca=c+80|0;a=H[f+24>>2];if(F[f+23|0]<0){oa(H[f+12>>2])}ca=f+32|0;return a|0}function Xd(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;k=ca-16|0;ca=k;H[k+8>>2]=c;h=H[a+12>>2];d=H[a+8>>2];g=h-d>>2;a:{if((g|0)>(b|0)){break a}e=b+1|0;if(e>>>0>g>>>0){l=e-g|0;f=H[a+16>>2];d=H[a+12>>2];if(l>>>0<=f-d>>2>>>0){if(l){e=d;d=l<<2;d=ra(e,0,d)+d|0}H[a+12>>2]=d;break a}b:{c:{d:{m=H[a+8>>2];g=d-m>>2;i=g+l|0;if(i>>>0<1073741824){e=f-m|0;f=e>>>1|0;e=e>>>0>=2147483644?1073741823:f>>>0>i>>>0?f:i;if(e){if(e>>>0>=1073741824){break d}j=pa(e<<2)}h=(g<<2)+j|0;f=l<<2;i=ra(h,0,f);g=f+i|0;e=(e<<2)+j|0;if((d|0)==(m|0)){break c}while(1){d=d-4|0;f=H[d>>2];H[d>>2]=0;h=h-4|0;H[h>>2]=f;if((d|0)!=(m|0)){continue}break}H[a+16>>2]=e;e=H[a+12>>2];H[a+12>>2]=g;d=H[a+8>>2];H[a+8>>2]=h;if((d|0)==(e|0)){break b}while(1){e=e-4|0;f=H[e>>2];H[e>>2]=0;if(f){Ga(f)}if((d|0)!=(e|0)){continue}break}break b}sa();v()}wa();v()}H[a+16>>2]=e;H[a+12>>2]=g;H[a+8>>2]=i}if(d){oa(d)}break a}if(e>>>0>=g>>>0){break a}d=d+(e<<2)|0;if((d|0)!=(h|0)){while(1){h=h-4|0;c=H[h>>2];H[h>>2]=0;if(c){Ga(c)}if((d|0)!=(h|0)){continue}break}c=H[k+8>>2]}H[a+12>>2]=d}e:{f:{d=H[c+56>>2];g:{if((d|0)>4){break g}j=N(d,12)+a|0;d=H[j+24>>2];if((d|0)!=H[j+28>>2]){H[d>>2]=b;H[j+24>>2]=d+4;break g}i=H[j+20>>2];g=d-i|0;f=g>>2;e=f+1|0;if(e>>>0>=1073741824){break f}d=g>>>1|0;e=g>>>0>=2147483644?1073741823:d>>>0>e>>>0?d:e;if(e){if(e>>>0>=1073741824){break e}d=pa(e<<2)}else{d=0}f=d+(f<<2)|0;H[f>>2]=b;d=va(d,i,g);H[j+20>>2]=d;H[j+24>>2]=f+4;H[j+28>>2]=d+(e<<2);if(!i){break g}oa(i)}H[c+60>>2]=b;a=H[a+8>>2];H[k+8>>2]=0;a=a+(b<<2)|0;b=H[a>>2];H[a>>2]=c;if(b){Ga(b)}a=H[k+8>>2];H[k+8>>2]=0;if(a){Ga(a)}ca=k+16|0;return}sa();v()}wa();v()}function Og(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;i=c;d=a;a:{if(H[a+12>>2]==(b|0)){break a}a=b;b=H[d+4>>2];e=H[d>>2];if((b|0)!=(e|0)){while(1){c=b-12|0;if(F[b-1|0]<0){oa(H[c>>2])}b=c;if((e|0)!=(b|0)){continue}break}}H[d+12>>2]=a;H[d+4>>2]=e;c=H[a>>2];j=a+4|0;if((c|0)==(j|0)){break a}while(1){a=H[d+4>>2];b:{if((a|0)!=H[d+8>>2]){c:{if(F[c+27|0]>=0){b=H[c+20>>2];H[a>>2]=H[c+16>>2];H[a+4>>2]=b;H[a+8>>2]=H[c+24>>2];break c}za(a,H[c+16>>2],H[c+20>>2])}H[d+4>>2]=a+12;break b}g=0;d:{e:{f:{a=H[d+4>>2];e=H[d>>2];f=(a-e|0)/12|0;b=f+1|0;if(b>>>0<357913942){h=(H[d+8>>2]-e|0)/12|0;k=h<<1;b=h>>>0>=178956970?357913941:b>>>0<k>>>0?k:b;if(b){if(b>>>0>=357913942){break f}g=pa(N(b,12))}h=N(b,12);b=N(f,12)+g|0;g:{if(F[c+27|0]>=0){f=H[c+20>>2];H[b>>2]=H[c+16>>2];H[b+4>>2]=f;H[b+8>>2]=H[c+24>>2];break g}za(b,H[c+16>>2],H[c+20>>2]);e=H[d>>2];a=H[d+4>>2]}g=g+h|0;f=b+12|0;if((a|0)==(e|0)){break e}while(1){a=a-12|0;h=H[a+4>>2];b=b-12|0;H[b>>2]=H[a>>2];H[b+4>>2]=h;H[b+8>>2]=H[a+8>>2];H[a>>2]=0;H[a+4>>2]=0;H[a+8>>2]=0;if((a|0)!=(e|0)){continue}break}H[d+8>>2]=g;a=H[d+4>>2];H[d+4>>2]=f;e=H[d>>2];H[d>>2]=b;if((a|0)==(e|0)){break d}while(1){b=a-12|0;if(F[a-1|0]<0){oa(H[b>>2])}a=b;if((e|0)!=(b|0)){continue}break}break d}sa();v()}wa();v()}H[d+8>>2]=g;H[d+4>>2]=f;H[d>>2]=b}if(e){oa(e)}}b=H[c+4>>2];h:{if(b){while(1){a=b;b=H[b>>2];if(b){continue}break h}}while(1){a=H[c+8>>2];b=H[a>>2]!=(c|0);c=a;if(b){continue}break}}c=a;if((j|0)!=(a|0)){continue}break}}a=0;i:{if((i|0)<0){break i}b=H[d>>2];if((H[d+4>>2]-b|0)/12>>>0<=i>>>0){break i}a=b+N(i,12)|0;a=F[a+11|0]<0?H[a>>2]:a}return a|0}function bd(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;i=ca-16|0;ca=i;H[i>>2]=b;f=-1;a:{if((b|0)==-1){H[i+4>>2]=-1;break a}f=b+1|0;H[i+4>>2]=(f>>>0)%3|0?f:b-2|0;if((b>>>0)%3|0){f=b-1|0;break a}f=b+2|0}H[i+8>>2]=f;n=(b>>>0)/3|0;b:{c:{d:{while(1){e:{f:{j=H[(l<<2)+i>>2];if((j|0)!=-1){f=H[H[H[a+8>>2]+12>>2]+(j<<2)>>2];if((f|0)!=-1){break f}}f=0;g=H[a+216>>2];if((g|0)==H[a+220>>2]){break e}while(1){g=N(f,144)+g|0;d=H[g+136>>2];c=H[g+140>>2];g:{if(d>>>0<c>>>0){H[d>>2]=j;H[g+136>>2]=d+4;break g}e=d;d=H[g+132>>2];k=e-d|0;e=k>>2;h=e+1|0;if(h>>>0>=1073741824){break d}m=e<<2;c=c-d|0;e=c>>>1|0;h=c>>>0>=2147483644?1073741823:h>>>0<e>>>0?e:h;if(h){if(h>>>0>=1073741824){break c}c=pa(h<<2)}else{c=0}e=m+c|0;H[e>>2]=j;c=va(c,d,k);H[g+132>>2]=c;H[g+136>>2]=e+4;H[g+140>>2]=c+(h<<2);if(!d){break g}oa(d)}f=f+1|0;g=H[a+216>>2];if(f>>>0<(H[a+220>>2]-g|0)/144>>>0){continue}break}break e}if((b|0)==-1|(f>>>0)/3>>>0<n>>>0){break e}f=0;if(H[a+220>>2]==H[a+216>>2]){break e}while(1){h:{if(!Ba(H[a+368>>2]+(f<<4)|0)){break h}g=H[a+216>>2]+N(f,144)|0;d=H[g+136>>2];c=H[g+140>>2];if(d>>>0<c>>>0){H[d>>2]=j;H[g+136>>2]=d+4;break h}e=d;d=H[g+132>>2];k=e-d|0;e=k>>2;h=e+1|0;if(h>>>0>=1073741824){break b}m=e<<2;c=c-d|0;e=c>>>1|0;h=c>>>0>=2147483644?1073741823:h>>>0<e>>>0?e:h;if(h){if(h>>>0>=1073741824){break c}c=pa(h<<2)}else{c=0}e=m+c|0;H[e>>2]=j;c=va(c,d,k);H[g+132>>2]=c;H[g+136>>2]=e+4;H[g+140>>2]=c+(h<<2);if(!d){break h}oa(d)}f=f+1|0;if(f>>>0<(H[a+220>>2]-H[a+216>>2]|0)/144>>>0){continue}break}}l=l+1|0;if((l|0)!=3){continue}break}ca=i+16|0;return 1}sa();v()}wa();v()}sa();v()}function cd(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;h=ca-16|0;ca=h;H[h>>2]=b;c=-1;a:{if((b|0)==-1){H[h+4>>2]=-1;break a}c=b+1|0;H[h+4>>2]=(c>>>0)%3|0?c:b-2|0;if((b>>>0)%3|0){c=b-1|0;break a}c=b+2|0}H[h+8>>2]=c;b:{c:{while(1){i=H[(k<<2)+h>>2];d:{if(!((i|0)==-1|H[H[H[a+8>>2]+12>>2]+(i<<2)>>2]==-1)){b=0;if(H[a+220>>2]==H[a+216>>2]){break d}while(1){e:{f:{if(!Ba(H[a+368>>2]+(b<<4)|0)){break f}c=H[a+216>>2]+N(b,144)|0;e=H[c+136>>2];d=H[c+140>>2];if(e>>>0<d>>>0){H[e>>2]=i;H[c+136>>2]=e+4;break f}f=e;e=H[c+132>>2];j=f-e|0;f=j>>2;g=f+1|0;if(g>>>0>=1073741824){break e}l=f<<2;d=d-e|0;f=d>>>1|0;g=d>>>0>=2147483644?1073741823:g>>>0<f>>>0?f:g;if(g){if(g>>>0>=1073741824){break b}d=pa(g<<2)}else{d=0}f=l+d|0;H[f>>2]=i;d=va(d,e,j);H[c+132>>2]=d;H[c+136>>2]=f+4;H[c+140>>2]=d+(g<<2);if(!e){break f}oa(e)}b=b+1|0;if(b>>>0<(H[a+220>>2]-H[a+216>>2]|0)/144>>>0){continue}break d}break}sa();v()}b=0;c=H[a+216>>2];if((c|0)==H[a+220>>2]){break d}while(1){c=N(b,144)+c|0;e=H[c+136>>2];d=H[c+140>>2];g:{if(e>>>0<d>>>0){H[e>>2]=i;H[c+136>>2]=e+4;break g}f=e;e=H[c+132>>2];j=f-e|0;f=j>>2;g=f+1|0;if(g>>>0>=1073741824){break c}l=f<<2;d=d-e|0;f=d>>>1|0;g=d>>>0>=2147483644?1073741823:g>>>0<f>>>0?f:g;if(g){if(g>>>0>=1073741824){break b}d=pa(g<<2)}else{d=0}f=l+d|0;H[f>>2]=i;d=va(d,e,j);H[c+132>>2]=d;H[c+136>>2]=f+4;H[c+140>>2]=d+(g<<2);if(!e){break g}oa(e)}b=b+1|0;c=H[a+216>>2];if(b>>>0<(H[a+220>>2]-c|0)/144>>>0){continue}break}}k=k+1|0;if((k|0)!=3){continue}break}ca=h+16|0;return 1}sa();v()}wa();v()}function vg(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;m=ca-16|0;ca=m;l=H[b+80>>2];e=I[c+24|0];a=N(l,e);a:{b:{c:{d:{b=H[c+28>>2];if(!(!I[c+84|0]|(b|0)!=1&(b|0)!=2)){b=H[c+48>>2];c=H[H[c>>2]>>2];H[m+8>>2]=0;H[m>>2]=0;H[m+4>>2]=0;if(a){if((a|0)<0){break d}f=pa(a);h=qa(f,b+c|0,a)+a|0}a=H[d>>2];if(a){H[d+4>>2]=a;oa(a)}H[d+8>>2]=h;H[d+4>>2]=h;H[d>>2]=f;b=1;break a}if(e){f=pa(e);ra(f,0,e)}e:{i=H[d+4>>2];b=H[d>>2];g=i-b|0;f:{if(g>>>0<a>>>0){k=a-g|0;j=H[d+8>>2];if(k>>>0<=j-i>>>0){n=d,o=ra(i,0,k)+k|0,H[n+4>>2]=o;break f}if((a|0)<0){break e}i=j-b|0;j=i<<1;i=i>>>0>=1073741823?2147483647:a>>>0<j>>>0?j:a;j=pa(i);ra(j+g|0,0,k);g=va(j,b,g);H[d+8>>2]=g+i;H[d+4>>2]=a+g;H[d>>2]=g;if(!b){break f}oa(b);break f}if(a>>>0>=g>>>0){break f}H[d+4>>2]=a+b}if(!l){b=1;break c}if(!e){b=0;a=0;while(1){if(!ic(c,I[c+84|0]?a:H[H[c+68>>2]+(a<<2)>>2],F[c+24|0],f)){break c}a=a+1|0;b=l>>>0<=a>>>0;if((a|0)!=(l|0)){continue}break}break c}i=e&252;g=e&3;b=0;j=e>>>0<4;e=0;while(1){if(!ic(c,I[c+84|0]?e:H[H[c+68>>2]+(e<<2)>>2],F[c+24|0],f)){break c}b=0;a=0;k=0;if(!j){while(1){F[H[d>>2]+h|0]=I[a+f|0];F[(H[d>>2]+h|0)+1|0]=I[(a|1)+f|0];F[(H[d>>2]+h|0)+2|0]=I[(a|2)+f|0];F[(H[d>>2]+h|0)+3|0]=I[(a|3)+f|0];a=a+4|0;h=h+4|0;k=k+4|0;if((i|0)!=(k|0)){continue}break}}if(g){while(1){F[H[d>>2]+h|0]=I[a+f|0];a=a+1|0;h=h+1|0;b=b+1|0;if((g|0)!=(b|0)){continue}break}}e=e+1|0;b=l>>>0<=e>>>0;if((e|0)!=(l|0)){continue}break}break b}sa();v()}sa();v()}if(!f){break a}}oa(f)}ca=m+16|0;return b&1}function ug(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;m=ca-16|0;ca=m;l=H[b+80>>2];e=I[c+24|0];a=N(l,e);a:{b:{c:{d:{b=H[c+28>>2];if(!(!I[c+84|0]|(b|0)!=1&(b|0)!=2)){b=H[c+48>>2];c=H[H[c>>2]>>2];H[m+8>>2]=0;H[m>>2]=0;H[m+4>>2]=0;if(a){if((a|0)<0){break d}f=pa(a);h=qa(f,b+c|0,a)+a|0}a=H[d>>2];if(a){H[d+4>>2]=a;oa(a)}H[d+8>>2]=h;H[d+4>>2]=h;H[d>>2]=f;b=1;break a}if(e){f=pa(e);ra(f,0,e)}e:{i=H[d+4>>2];b=H[d>>2];g=i-b|0;f:{if(g>>>0<a>>>0){k=a-g|0;j=H[d+8>>2];if(k>>>0<=j-i>>>0){n=d,o=ra(i,0,k)+k|0,H[n+4>>2]=o;break f}if((a|0)<0){break e}i=j-b|0;j=i<<1;i=i>>>0>=1073741823?2147483647:a>>>0<j>>>0?j:a;j=pa(i);ra(j+g|0,0,k);g=va(j,b,g);H[d+8>>2]=g+i;H[d+4>>2]=a+g;H[d>>2]=g;if(!b){break f}oa(b);break f}if(a>>>0>=g>>>0){break f}H[d+4>>2]=a+b}if(!l){b=1;break c}if(!e){b=0;a=0;while(1){if(!hc(c,I[c+84|0]?a:H[H[c+68>>2]+(a<<2)>>2],F[c+24|0],f)){break c}a=a+1|0;b=l>>>0<=a>>>0;if((a|0)!=(l|0)){continue}break}break c}i=e&252;g=e&3;b=0;j=e>>>0<4;e=0;while(1){if(!hc(c,I[c+84|0]?e:H[H[c+68>>2]+(e<<2)>>2],F[c+24|0],f)){break c}b=0;a=0;k=0;if(!j){while(1){F[H[d>>2]+h|0]=I[a+f|0];F[(H[d>>2]+h|0)+1|0]=I[(a|1)+f|0];F[(H[d>>2]+h|0)+2|0]=I[(a|2)+f|0];F[(H[d>>2]+h|0)+3|0]=I[(a|3)+f|0];a=a+4|0;h=h+4|0;k=k+4|0;if((i|0)!=(k|0)){continue}break}}if(g){while(1){F[H[d>>2]+h|0]=I[a+f|0];a=a+1|0;h=h+1|0;b=b+1|0;if((g|0)!=(b|0)){continue}break}}e=e+1|0;b=l>>>0<=e>>>0;if((e|0)!=(l|0)){continue}break}break b}sa();v()}sa();v()}if(!f){break a}}oa(f)}ca=m+16|0;return b&1}function qc(a,b,c,d){var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;k=H[b+16>>2];h=H[c+4>>2]-k|0;e=H[c>>2]-k|0;H[c>>2]=e;f=h;H[c+4>>2]=f;l=H[b+16>>2];f=f>>31;g=(h^f)-f|0;f=e>>31;m=l>>>0>=g+((f^e)-f|0)>>>0;a:{if(m){f=h;break a}b:{c:{if((e|0)>=0){g=1;j=1;if((h|0)>=0){break b}i=1;g=-1;j=-1;if(e){break c}break b}i=-1;g=-1;j=-1;if((h|0)<=0){break b}}g=(h|0)<=0?-1:1;j=i}n=N(j,l);f=(e<<1)-n|0;i=(N(g,j)|0)>=0;e=N(g,l);f=((i?0-f|0:f)+e|0)/2|0;H[c+4>>2]=f;e=(h<<1)-e|0;e=((i?0-e|0:e)+n|0)/2|0;H[c>>2]=e}d:{e:{f:{g:{h:{i:{j:{if(e){if((e|0)<0){break j}if((f|0)>=0){break i}break f}if(f){break h}j=1;g=0;f=0;i=0;break d}j=1;if((f|0)>0){break g}i=(f|0)>0?3:0;g=f;f=e;break d}g=0-f|0;f=0-e|0;i=2;break e}if((f|0)<=0){break f}}f=0-f|0;g=e;i=3;break e}g=0-e|0;i=1}H[c>>2]=f;H[c+4>>2]=g;j=0}e=H[d>>2]+f|0;h=H[b+16>>2];k:{if((e|0)>(h|0)){e=e-H[b+4>>2]|0;break k}if((0-h|0)<=(e|0)){break k}e=H[b+4>>2]+e|0}c=H[d+4>>2]+g|0;l:{if((h|0)<(c|0)){c=c-H[b+4>>2]|0;break l}if((0-h|0)<=(c|0)){break l}c=H[b+4>>2]+c|0}m:{if(j){b=c;break m}b=c;n:{o:{p:{d=4-i|0;switch((d>>>0<4?d:0-i|0)-1|0){case 2:break n;case 1:break o;case 0:break p;default:break m}}b=0-e|0;e=c;break m}b=0-c|0;e=0-e|0;break m}b=e;e=0-c|0}q:{if(m){c=b;break q}r:{s:{if((e|0)>=0){c=1;f=1;if((b|0)>=0){break r}d=1;c=-1;f=-1;if(e){break s}break r}d=-1;c=-1;f=-1;if((b|0)<=0){break r}}c=(b|0)<=0?-1:1;f=d}d=e<<1;e=N(f,h);d=d-e|0;f=(N(c,f)|0)>=0;g=f?0-d|0:d;d=N(c,h);c=(g+d|0)/2|0;b=(b<<1)-d|0;e=(e+(f?0-b|0:b)|0)/2|0}b=a;H[b>>2]=e+k;H[b+4>>2]=c+k}function Cj(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;j=ca-32|0;ca=j;H[j+28>>2]=0;a:{b:{if(J[b+38>>1]<=513){c=H[b+20>>2];d=H[b+16>>2];e=d+4|0;c=e>>>0<4?c+1|0:c;h=H[b+12>>2];if(K[b+8>>2]<e>>>0&(h|0)<=(c|0)|(c|0)>(h|0)){break a}d=d+H[b>>2]|0;f=I[d|0]|I[d+1|0]<<8|(I[d+2|0]<<16|I[d+3|0]<<24);H[b+16>>2]=e;H[b+20>>2]=c;break b}if(!Xa(1,j+28|0,b)){break a}f=H[j+28>>2]}if(!f){break a}c=H[H[a+48>>2]+64>>2];if(H[c+4>>2]-H[c>>2]>>2>>>0<f>>>0){break a}Wa(a+76|0,f);c=j+8|0;H[c>>2]=0;H[c+4>>2]=0;F[c+5|0]=0;F[c+6|0]=0;F[c+7|0]=0;F[c+8|0]=0;F[c+9|0]=0;F[c+10|0]=0;F[c+11|0]=0;F[c+12|0]=0;c:{if(!ta(c,b)){break c}h=1;while(1){d=1<<i;e=Ba(c);g=H[a+76>>2]+(i>>>3&536870908)|0;e=e^h;if(e&1){d=H[g>>2]&(d^-1)}else{d=d|H[g>>2]}h=e^1;H[g>>2]=d;i=i+1|0;if((f|0)!=(i|0)){continue}break}c=H[b+8>>2];e=H[b+12>>2];g=e;e=H[b+20>>2];h=e;f=H[b+16>>2];d=f+4|0;e=d>>>0<4?e+1|0:e;i=d;if(d>>>0>c>>>0&(e|0)>=(g|0)|(e|0)>(g|0)){break c}l=H[b>>2];d=l+f|0;k=I[d|0]|I[d+1|0]<<8|(I[d+2|0]<<16|I[d+3|0]<<24);H[b+16>>2]=i;H[b+20>>2]=e;d=c;c=h;e=f+8|0;c=e>>>0<8?c+1|0:c;if(d>>>0<e>>>0&(c|0)>=(g|0)|(c|0)>(g|0)){break c}d=i+l|0;d=I[d|0]|I[d+1|0]<<8|(I[d+2|0]<<16|I[d+3|0]<<24);H[b+16>>2]=e;H[b+20>>2]=c;if((d|0)<(k|0)){break c}H[a+16>>2]=d;H[a+12>>2]=k;c=(d>>31)-((k>>31)+(d>>>0<k>>>0)|0)|0;b=d-k|0;if(!c&b>>>0>2147483646|c){break c}m=1;c=b+1|0;H[a+20>>2]=c;b=c>>>1|0;H[a+24>>2]=b;H[a+28>>2]=0-b;if(c&1){break c}H[a+24>>2]=b-1}}ca=j+32|0;return m|0}function lj(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;j=ca-32|0;ca=j;H[j+28>>2]=0;a:{b:{if(J[b+38>>1]<=513){c=H[b+20>>2];d=H[b+16>>2];e=d+4|0;c=e>>>0<4?c+1|0:c;h=H[b+12>>2];if(K[b+8>>2]<e>>>0&(h|0)<=(c|0)|(c|0)>(h|0)){break a}d=d+H[b>>2]|0;f=I[d|0]|I[d+1|0]<<8|(I[d+2|0]<<16|I[d+3|0]<<24);H[b+16>>2]=e;H[b+20>>2]=c;break b}if(!Xa(1,j+28|0,b)){break a}f=H[j+28>>2]}if(!f){break a}c=H[a+48>>2];if(H[c+4>>2]-H[c>>2]>>2>>>0<f>>>0){break a}Wa(a+76|0,f);c=j+8|0;H[c>>2]=0;H[c+4>>2]=0;F[c+5|0]=0;F[c+6|0]=0;F[c+7|0]=0;F[c+8|0]=0;F[c+9|0]=0;F[c+10|0]=0;F[c+11|0]=0;F[c+12|0]=0;c:{if(!ta(c,b)){break c}h=1;while(1){d=1<<i;e=Ba(c);g=H[a+76>>2]+(i>>>3&536870908)|0;e=e^h;if(e&1){d=H[g>>2]&(d^-1)}else{d=d|H[g>>2]}h=e^1;H[g>>2]=d;i=i+1|0;if((f|0)!=(i|0)){continue}break}c=H[b+8>>2];e=H[b+12>>2];g=e;e=H[b+20>>2];h=e;f=H[b+16>>2];d=f+4|0;e=d>>>0<4?e+1|0:e;i=d;if(d>>>0>c>>>0&(e|0)>=(g|0)|(e|0)>(g|0)){break c}l=H[b>>2];d=l+f|0;k=I[d|0]|I[d+1|0]<<8|(I[d+2|0]<<16|I[d+3|0]<<24);H[b+16>>2]=i;H[b+20>>2]=e;d=c;c=h;e=f+8|0;c=e>>>0<8?c+1|0:c;if(d>>>0<e>>>0&(c|0)>=(g|0)|(c|0)>(g|0)){break c}d=i+l|0;d=I[d|0]|I[d+1|0]<<8|(I[d+2|0]<<16|I[d+3|0]<<24);H[b+16>>2]=e;H[b+20>>2]=c;if((d|0)<(k|0)){break c}H[a+16>>2]=d;H[a+12>>2]=k;c=(d>>31)-((k>>31)+(d>>>0<k>>>0)|0)|0;b=d-k|0;if(!c&b>>>0>2147483646|c){break c}m=1;c=b+1|0;H[a+20>>2]=c;b=c>>>1|0;H[a+24>>2]=b;H[a+28>>2]=0-b;if(c&1){break c}H[a+24>>2]=b-1}}ca=j+32|0;return m|0}function cj(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;H[a+8>>2]=e;m=a+32|0;h=H[m>>2];g=H[a+36>>2]-h>>2;a:{if(g>>>0<e>>>0){ya(m,e-g|0);f=H[a+8>>2];break a}f=e;if(f>>>0>=g>>>0){break a}H[a+36>>2]=h+(e<<2);f=e}g=e>>>0>1073741823?-1:e<<2;n=ra(pa(g),0,g);b:{if((f|0)<=0){break b}h=H[a+32>>2];while(1){f=i<<2;g=H[f+n>>2];j=H[a+16>>2];c:{if((g|0)>(j|0)){H[f+h>>2]=j;break c}f=f+h|0;j=H[a+12>>2];if((j|0)>(g|0)){H[f>>2]=j;break c}H[f>>2]=g}f=H[a+8>>2];i=i+1|0;if((f|0)>(i|0)){continue}break}if((f|0)<=0){break b}i=0;while(1){g=i<<2;f=g+c|0;g=H[b+g>>2]+H[g+h>>2]|0;H[f>>2]=g;d:{if((g|0)>H[a+16>>2]){g=g-H[a+20>>2]|0}else{if((g|0)>=H[a+12>>2]){break d}g=g+H[a+20>>2]|0}H[f>>2]=g}f=H[a+8>>2];i=i+1|0;if((f|0)>(i|0)){continue}break}}if(!((d|0)<=(e|0)|(f|0)<=0)){p=0-e<<2;g=e;while(1){e:{if((f|0)<=0){break e}l=g<<2;o=l+c|0;q=o+p|0;j=H[m>>2];i=0;while(1){f=i<<2;h=H[f+q>>2];k=H[a+16>>2];f:{if((h|0)>(k|0)){H[f+j>>2]=k;break f}f=f+j|0;k=H[a+12>>2];if((k|0)>(h|0)){H[f>>2]=k;break f}H[f>>2]=h}f=H[a+8>>2];i=i+1|0;if((f|0)>(i|0)){continue}break}i=0;if((f|0)<=0){break e}l=b+l|0;while(1){h=i<<2;f=h+o|0;h=H[h+l>>2]+H[h+j>>2]|0;H[f>>2]=h;g:{if((h|0)>H[a+16>>2]){h=h-H[a+20>>2]|0}else{if((h|0)>=H[a+12>>2]){break g}h=h+H[a+20>>2]|0}H[f>>2]=h}f=H[a+8>>2];i=i+1|0;if((f|0)>(i|0)){continue}break}}g=e+g|0;if((g|0)<(d|0)){continue}break}}oa(n);return 1}function De(a,b){var c=0,d=0,e=0,f=0,g=0;d=-1;f=-1;a:{if((b|0)==-1){break a}c=b+1|0;d=(c>>>0)%3|0?c:b-2|0;f=b-1|0;if((b>>>0)%3|0){break a}f=b+2|0}b:{c:{d:{e:{f:{g:{e=H[a+184>>2];switch(e|0){case 7:break d;case 3:break e;case 5:break f;case 0:case 1:break g;default:break b}}g=H[a+148>>2];c=-1;e=1;d=((d|0)!=-1?H[H[g>>2]+(d<<2)>>2]:c)<<2;c=H[a+156>>2];d=d+c|0;H[d>>2]=H[d>>2]+1;c=(((f|0)==-1?-1:H[H[g>>2]+(f<<2)>>2])<<2)+c|0;break c}g=H[a+148>>2];c=H[a+156>>2];e=c+(((b|0)==-1?-1:H[H[g>>2]+(b<<2)>>2])<<2)|0;H[e>>2]=H[e>>2]+1;d=(((d|0)==-1?-1:H[H[g>>2]+(d<<2)>>2])<<2)+c|0;H[d>>2]=H[d>>2]+1;e=2;c=(((f|0)==-1?-1:H[H[g>>2]+(f<<2)>>2])<<2)+c|0;break c}g=H[a+148>>2];c=H[a+156>>2];e=c+(((b|0)==-1?-1:H[H[g>>2]+(b<<2)>>2])<<2)|0;H[e>>2]=H[e>>2]+1;d=(((d|0)==-1?-1:H[H[g>>2]+(d<<2)>>2])<<2)+c|0;H[d>>2]=H[d>>2]+2;e=1;c=(((f|0)==-1?-1:H[H[g>>2]+(f<<2)>>2])<<2)+c|0;break c}g=H[a+148>>2];c=H[a+156>>2];e=c+(((b|0)==-1?-1:H[H[g>>2]+(b<<2)>>2])<<2)|0;H[e>>2]=H[e>>2]+2;d=(((d|0)==-1?-1:H[H[g>>2]+(d<<2)>>2])<<2)+c|0;H[d>>2]=H[d>>2]+2;e=2;c=(((f|0)==-1?-1:H[H[g>>2]+(f<<2)>>2])<<2)+c|0}H[c>>2]=H[c>>2]+e;e=H[a+184>>2]}h:{switch(e|0){case 0:case 5:f=H[a+156>>2];c=-1;i:{if((b|0)==-1){break i}d=b+1|0;b=(d>>>0)%3|0?d:b-2|0;c=-1;if((b|0)==-1){break i}c=H[H[H[a+148>>2]>>2]+(b<<2)>>2]}if(H[f+(c<<2)>>2]<=5){H[a+188>>2]=5;return}H[a+188>>2]=0;return;default:break h}}H[a+188>>2]=-1}function xg(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;j=H[b+80>>2];b=I[c+24|0];g=N(j,b);a:{if(!b){break a}h=b<<2;f=pa(h);a=f;k=b&7;if(k){while(1){H[a>>2]=-1073741824;a=a+4|0;e=e+1|0;if((k|0)!=(e|0)){continue}break}}if((b-1&1073741823)>>>0<7){break a}e=f+h|0;while(1){H[a+24>>2]=-1073741824;H[a+28>>2]=-1073741824;H[a+16>>2]=-1073741824;H[a+20>>2]=-1073741824;H[a+8>>2]=-1073741824;H[a+12>>2]=-1073741824;H[a>>2]=-1073741824;H[a+4>>2]=-1073741824;a=a+32|0;if((e|0)!=(a|0)){continue}break}}e=H[d>>2];a=H[d+4>>2]-e>>2;b:{if(a>>>0<g>>>0){ya(d,g-a|0);break b}if(a>>>0<=g>>>0){break b}H[d+4>>2]=e+(g<<2)}c:{d:{e:{if(!j){i=1;break e}if(!b){a=0;while(1){if(!Va(c,I[c+84|0]?a:H[H[c+68>>2]+(a<<2)>>2],F[c+24|0],f)){break e}a=a+1|0;i=j>>>0<=a>>>0;if((a|0)!=(j|0)){continue}break}break e}n=b&252;k=b&3;o=b>>>0<4;e=0;b=0;while(1){if(!Va(c,I[c+84|0]?b:H[H[c+68>>2]+(b<<2)>>2],F[c+24|0],f)){break e}m=H[d>>2];i=0;a=0;l=0;if(!o){while(1){g=(e<<2)+m|0;h=a<<2;L[g>>2]=L[h+f>>2];L[g+4>>2]=L[(h|4)+f>>2];L[g+8>>2]=L[(h|8)+f>>2];L[g+12>>2]=L[(h|12)+f>>2];a=a+4|0;e=e+4|0;l=l+4|0;if((n|0)!=(l|0)){continue}break}}if(k){while(1){L[(e<<2)+m>>2]=L[(a<<2)+f>>2];a=a+1|0;e=e+1|0;i=i+1|0;if((k|0)!=(i|0)){continue}break}}b=b+1|0;i=j>>>0<=b>>>0;if((b|0)!=(j|0)){continue}break}break d}if(!f){break c}}oa(f)}return i|0}function mf(a){a=a|0;var b=0,c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;e=ca-16|0;ca=e;h=1;i=ea[H[H[a>>2]+24>>2]](a)|0;a:{if((i|0)<=0){break a}l=a+48|0;h=0;while(1){b:{c:{if(!H[(ea[H[H[a>>2]+28>>2]](a)|0)+40>>2]){break c}j=f<<2;g=H[j+H[a+36>>2]>>2];b=H[g+8>>2];k=rb(g);if(!k){break c}g=H[(ea[H[H[a>>2]+28>>2]](a)|0)+40>>2];H[e+12>>2]=H[b+56>>2];b=pa(32);H[e>>2]=b;H[e+4>>2]=24;H[e+8>>2]=-2147483616;c=I[1206]|I[1207]<<8|(I[1208]<<16|I[1209]<<24);d=I[1202]|I[1203]<<8|(I[1204]<<16|I[1205]<<24);F[b+16|0]=d;F[b+17|0]=d>>>8;F[b+18|0]=d>>>16;F[b+19|0]=d>>>24;F[b+20|0]=c;F[b+21|0]=c>>>8;F[b+22|0]=c>>>16;F[b+23|0]=c>>>24;c=I[1198]|I[1199]<<8|(I[1200]<<16|I[1201]<<24);d=I[1194]|I[1195]<<8|(I[1196]<<16|I[1197]<<24);F[b+8|0]=d;F[b+9|0]=d>>>8;F[b+10|0]=d>>>16;F[b+11|0]=d>>>24;F[b+12|0]=c;F[b+13|0]=c>>>8;F[b+14|0]=c>>>16;F[b+15|0]=c>>>24;c=I[1190]|I[1191]<<8|(I[1192]<<16|I[1193]<<24);d=I[1186]|I[1187]<<8|(I[1188]<<16|I[1189]<<24);F[b|0]=d;F[b+1|0]=d>>>8;F[b+2|0]=d>>>16;F[b+3|0]=d>>>24;F[b+4|0]=c;F[b+5|0]=c>>>8;F[b+6|0]=c>>>16;F[b+7|0]=c>>>24;F[b+24|0]=0;b=sd(g,e+12|0,e);if(F[e+11|0]<0){oa(H[e>>2])}if(!b){break c}oe(H[H[H[a+36>>2]+j>>2]+8>>2],k);break b}b=H[H[a+36>>2]+(f<<2)>>2];if(!(ea[H[H[b>>2]+24>>2]](b,l)|0)){break a}}f=f+1|0;h=(i|0)<=(f|0);if((f|0)!=(i|0)){continue}break}}ca=e+16|0;return h|0}function Ye(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;k=ca-16|0;ca=k;c=H[b+20>>2];d=H[b+16>>2];e=d+4|0;c=e>>>0<4?c+1|0:c;g=H[b+12>>2];a:{if(K[b+8>>2]<e>>>0&(g|0)<=(c|0)|(c|0)>(g|0)){break a}d=d+H[b>>2]|0;h=I[d|0]|I[d+1|0]<<8|(I[d+2|0]<<16|I[d+3|0]<<24);H[b+16>>2]=e;H[b+20>>2]=c;if((h|0)<0){break a}Wa(a+76|0,h);c=k;H[c>>2]=0;H[c+4>>2]=0;F[c+5|0]=0;F[c+6|0]=0;F[c+7|0]=0;F[c+8|0]=0;F[c+9|0]=0;F[c+10|0]=0;F[c+11|0]=0;F[c+12|0]=0;b:{if(!ta(c,b)){break b}if(h){g=1;while(1){d=1<<i;e=Ba(c);f=H[a+76>>2]+(i>>>3&536870908)|0;e=e^g;if(e&1){d=H[f>>2]&(d^-1)}else{d=d|H[f>>2]}g=e^1;H[f>>2]=d;i=i+1|0;if((h|0)!=(i|0)){continue}break}}i=0;c=H[b+8>>2];e=H[b+12>>2];f=e;e=H[b+20>>2];g=e;l=H[b+16>>2];d=l+4|0;e=d>>>0<4?e+1|0:e;h=d;if(d>>>0>c>>>0&(e|0)>=(f|0)|(e|0)>(f|0)){break b}m=H[b>>2];d=m+l|0;j=I[d|0]|I[d+1|0]<<8|(I[d+2|0]<<16|I[d+3|0]<<24);H[b+16>>2]=h;H[b+20>>2]=e;d=c;c=g;e=l+8|0;c=e>>>0<8?c+1|0:c;if(d>>>0<e>>>0&(c|0)>=(f|0)|(c|0)>(f|0)){break b}d=h+m|0;d=I[d|0]|I[d+1|0]<<8|(I[d+2|0]<<16|I[d+3|0]<<24);H[b+16>>2]=e;H[b+20>>2]=c;if((d|0)<(j|0)){break b}H[a+16>>2]=d;H[a+12>>2]=j;c=(d>>31)-((j>>31)+(d>>>0<j>>>0)|0)|0;b=d-j|0;if(!c&b>>>0>2147483646|c){break b}i=1;c=b+1|0;H[a+20>>2]=c;b=c>>>1|0;H[a+24>>2]=b;H[a+28>>2]=0-b;if(c&1){break b}H[a+24>>2]=b-1}}ca=k+16|0;return i|0}function rg(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;a=0;k=ca-16|0;ca=k;j=H[b+80>>2];e=I[c+24|0];b=N(j,e);a:{b:{c:{d:{f=H[c+28>>2];if(!(!I[c+84|0]|(f|0)!=5&(f|0)!=6)){e=H[c+48>>2];c=H[H[c>>2]>>2];H[k+8>>2]=0;H[k>>2]=0;H[k+4>>2]=0;if(b){if((b|0)<0){break d}b=b<<2;a=pa(b);g=qa(a,c+e|0,b)+b|0}b=H[d>>2];if(b){H[d+4>>2]=b;oa(b)}H[d+8>>2]=g;H[d+4>>2]=g;H[d>>2]=a;h=1;break a}if(e){f=e<<2;a=pa(f);ra(a,0,f)}i=H[d>>2];f=H[d+4>>2]-i>>2;e:{if(f>>>0<b>>>0){ya(d,b-f|0);break e}if(b>>>0>=f>>>0){break e}H[d+4>>2]=i+(b<<2)}if(!j){h=1;break c}if(!e){b=0;while(1){if(!dc(c,I[c+84|0]?b:H[H[c+68>>2]+(b<<2)>>2],F[c+24|0],a)){break c}b=b+1|0;h=j>>>0<=b>>>0;if((b|0)!=(j|0)){continue}break}break c}o=e&252;m=e&3;p=e>>>0<4;e=0;while(1){if(!dc(c,I[c+84|0]?e:H[H[c+68>>2]+(e<<2)>>2],F[c+24|0],a)){break c}n=H[d>>2];l=0;b=0;h=0;if(!p){while(1){f=(g<<2)+n|0;i=b<<2;H[f>>2]=H[i+a>>2];H[f+4>>2]=H[(i|4)+a>>2];H[f+8>>2]=H[(i|8)+a>>2];H[f+12>>2]=H[(i|12)+a>>2];b=b+4|0;g=g+4|0;h=h+4|0;if((o|0)!=(h|0)){continue}break}}if(m){while(1){H[(g<<2)+n>>2]=H[(b<<2)+a>>2];b=b+1|0;g=g+1|0;l=l+1|0;if((l|0)!=(m|0)){continue}break}}e=e+1|0;h=j>>>0<=e>>>0;if((e|0)!=(j|0)){continue}break}break b}sa();v()}if(!a){break a}}oa(a)}ca=k+16|0;return h|0}function ge(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;a=0;k=ca-16|0;ca=k;j=H[b+80>>2];e=I[c+24|0];b=N(j,e);a:{b:{c:{d:{f=H[c+28>>2];if(!(!I[c+84|0]|(f|0)!=5&(f|0)!=6)){e=H[c+48>>2];c=H[H[c>>2]>>2];H[k+8>>2]=0;H[k>>2]=0;H[k+4>>2]=0;if(b){if((b|0)<0){break d}b=b<<2;a=pa(b);g=qa(a,c+e|0,b)+b|0}b=H[d>>2];if(b){H[d+4>>2]=b;oa(b)}H[d+8>>2]=g;H[d+4>>2]=g;H[d>>2]=a;h=1;break a}if(e){f=e<<2;a=pa(f);ra(a,0,f)}i=H[d>>2];f=H[d+4>>2]-i>>2;e:{if(f>>>0<b>>>0){ya(d,b-f|0);break e}if(b>>>0>=f>>>0){break e}H[d+4>>2]=i+(b<<2)}if(!j){h=1;break c}if(!e){b=0;while(1){if(!ec(c,I[c+84|0]?b:H[H[c+68>>2]+(b<<2)>>2],F[c+24|0],a)){break c}b=b+1|0;h=j>>>0<=b>>>0;if((b|0)!=(j|0)){continue}break}break c}o=e&252;m=e&3;p=e>>>0<4;e=0;while(1){if(!ec(c,I[c+84|0]?e:H[H[c+68>>2]+(e<<2)>>2],F[c+24|0],a)){break c}n=H[d>>2];l=0;b=0;h=0;if(!p){while(1){f=(g<<2)+n|0;i=b<<2;H[f>>2]=H[i+a>>2];H[f+4>>2]=H[(i|4)+a>>2];H[f+8>>2]=H[(i|8)+a>>2];H[f+12>>2]=H[(i|12)+a>>2];b=b+4|0;g=g+4|0;h=h+4|0;if((o|0)!=(h|0)){continue}break}}if(m){while(1){H[(g<<2)+n>>2]=H[(b<<2)+a>>2];b=b+1|0;g=g+1|0;l=l+1|0;if((l|0)!=(m|0)){continue}break}}e=e+1|0;h=j>>>0<=e>>>0;if((e|0)!=(j|0)){continue}break}break b}sa();v()}if(!a){break a}}oa(a)}ca=k+16|0;return h|0}function tg(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;a=0;k=ca-16|0;ca=k;j=H[b+80>>2];e=I[c+24|0];b=N(j,e);a:{b:{c:{d:{f=H[c+28>>2];if(!(!I[c+84|0]|(f|0)!=3&(f|0)!=4)){e=H[c+48>>2];c=H[H[c>>2]>>2];H[k+8>>2]=0;H[k>>2]=0;H[k+4>>2]=0;if(b){if((b|0)<0){break d}b=b<<1;a=pa(b);g=qa(a,c+e|0,b)+b|0}b=H[d>>2];if(b){H[d+4>>2]=b;oa(b)}H[d+8>>2]=g;H[d+4>>2]=g;H[d>>2]=a;h=1;break a}if(e){f=e<<1;a=pa(f);ra(a,0,f)}i=H[d>>2];f=H[d+4>>2]-i>>1;e:{if(f>>>0<b>>>0){qe(d,b-f|0);break e}if(b>>>0>=f>>>0){break e}H[d+4>>2]=i+(b<<1)}if(!j){h=1;break c}if(!e){b=0;while(1){if(!gc(c,I[c+84|0]?b:H[H[c+68>>2]+(b<<2)>>2],F[c+24|0],a)){break c}b=b+1|0;h=j>>>0<=b>>>0;if((b|0)!=(j|0)){continue}break}break c}o=e&252;m=e&3;p=e>>>0<4;e=0;while(1){if(!gc(c,I[c+84|0]?e:H[H[c+68>>2]+(e<<2)>>2],F[c+24|0],a)){break c}n=H[d>>2];l=0;b=0;h=0;if(!p){while(1){f=(g<<1)+n|0;i=b<<1;G[f>>1]=J[i+a>>1];G[f+2>>1]=J[(i|2)+a>>1];G[f+4>>1]=J[(i|4)+a>>1];G[f+6>>1]=J[(i|6)+a>>1];b=b+4|0;g=g+4|0;h=h+4|0;if((o|0)!=(h|0)){continue}break}}if(m){while(1){G[(g<<1)+n>>1]=J[(b<<1)+a>>1];b=b+1|0;g=g+1|0;l=l+1|0;if((l|0)!=(m|0)){continue}break}}e=e+1|0;h=j>>>0<=e>>>0;if((e|0)!=(j|0)){continue}break}break b}sa();v()}if(!a){break a}}oa(a)}ca=k+16|0;return h|0}function sg(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;a=0;k=ca-16|0;ca=k;j=H[b+80>>2];e=I[c+24|0];b=N(j,e);a:{b:{c:{d:{f=H[c+28>>2];if(!(!I[c+84|0]|(f|0)!=3&(f|0)!=4)){e=H[c+48>>2];c=H[H[c>>2]>>2];H[k+8>>2]=0;H[k>>2]=0;H[k+4>>2]=0;if(b){if((b|0)<0){break d}b=b<<1;a=pa(b);g=qa(a,c+e|0,b)+b|0}b=H[d>>2];if(b){H[d+4>>2]=b;oa(b)}H[d+8>>2]=g;H[d+4>>2]=g;H[d>>2]=a;h=1;break a}if(e){f=e<<1;a=pa(f);ra(a,0,f)}i=H[d>>2];f=H[d+4>>2]-i>>1;e:{if(f>>>0<b>>>0){qe(d,b-f|0);break e}if(b>>>0>=f>>>0){break e}H[d+4>>2]=i+(b<<1)}if(!j){h=1;break c}if(!e){b=0;while(1){if(!fc(c,I[c+84|0]?b:H[H[c+68>>2]+(b<<2)>>2],F[c+24|0],a)){break c}b=b+1|0;h=j>>>0<=b>>>0;if((b|0)!=(j|0)){continue}break}break c}o=e&252;m=e&3;p=e>>>0<4;e=0;while(1){if(!fc(c,I[c+84|0]?e:H[H[c+68>>2]+(e<<2)>>2],F[c+24|0],a)){break c}n=H[d>>2];l=0;b=0;h=0;if(!p){while(1){f=(g<<1)+n|0;i=b<<1;G[f>>1]=J[i+a>>1];G[f+2>>1]=J[(i|2)+a>>1];G[f+4>>1]=J[(i|4)+a>>1];G[f+6>>1]=J[(i|6)+a>>1];b=b+4|0;g=g+4|0;h=h+4|0;if((o|0)!=(h|0)){continue}break}}if(m){while(1){G[(g<<1)+n>>1]=J[(b<<1)+a>>1];b=b+1|0;g=g+1|0;l=l+1|0;if((l|0)!=(m|0)){continue}break}}e=e+1|0;h=j>>>0<=e>>>0;if((e|0)!=(j|0)){continue}break}break b}sa();v()}if(!a){break a}}oa(a)}ca=k+16|0;return h|0}function Ce(a,b){var c=0,d=0,e=0,f=0,g=0;f=-1;d=-1;a:{if((b|0)==-1){break a}d=b+1|0;f=(d>>>0)%3|0?d:b-2|0;d=b-1|0;if((b>>>0)%3|0){break a}d=b+2|0}b:{c:{d:{switch(H[a+168>>2]){case 0:case 1:e=H[a+148>>2];c=1;b=H[a+156>>2];g=b+(((f|0)==-1?-1:H[H[e>>2]+(f<<2)>>2])<<2)|0;H[g>>2]=H[g>>2]+1;b=(((d|0)==-1?-1:H[H[e>>2]+(d<<2)>>2])<<2)+b|0;break c;case 5:e=H[a+148>>2];c=-1;c=((b|0)!=-1?H[H[e>>2]+(b<<2)>>2]:c)<<2;b=H[a+156>>2];c=c+b|0;H[c>>2]=H[c>>2]+1;c=(((f|0)==-1?-1:H[H[e>>2]+(f<<2)>>2])<<2)+b|0;H[c>>2]=H[c>>2]+1;c=2;b=(((d|0)==-1?-1:H[H[e>>2]+(d<<2)>>2])<<2)+b|0;break c;case 3:e=H[a+148>>2];c=-1;c=((b|0)!=-1?H[H[e>>2]+(b<<2)>>2]:c)<<2;b=H[a+156>>2];c=c+b|0;H[c>>2]=H[c>>2]+1;c=(((f|0)==-1?-1:H[H[e>>2]+(f<<2)>>2])<<2)+b|0;H[c>>2]=H[c>>2]+2;c=1;b=(((d|0)==-1?-1:H[H[e>>2]+(d<<2)>>2])<<2)+b|0;break c;case 7:break d;default:break b}}e=H[a+148>>2];c=-1;c=((b|0)!=-1?H[H[e>>2]+(b<<2)>>2]:c)<<2;b=H[a+156>>2];c=c+b|0;H[c>>2]=H[c>>2]+2;c=(((f|0)==-1?-1:H[H[e>>2]+(f<<2)>>2])<<2)+b|0;H[c>>2]=H[c>>2]+2;c=2;b=(((d|0)==-1?-1:H[H[e>>2]+(d<<2)>>2])<<2)+b|0}H[b>>2]=H[b>>2]+c}c=a;b=H[H[a+156>>2]+(((f|0)==-1?-1:H[H[H[a+148>>2]>>2]+(f<<2)>>2])<<2)>>2];d=H[a+180>>2];a=H[a+176>>2];H[c+172>>2]=(a|0)<=(b|0)?((b|0)<(d|0)?b:d)-a|0:0}function Ac(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0;H[a+16>>2]=0;H[a+20>>2]=0;H[a+8>>2]=0;H[a>>2]=0;H[a+4>>2]=0;H[a+24>>2]=0;f=H[b+4>>2];g=H[b>>2];e=f-g|0;c=(e|0)/20|0;a:{if((f|0)==(g|0)){break a}b:{if(c>>>0<214748365){f=pa(e);H[a+20>>2]=f;H[a+16>>2]=f;H[a+24>>2]=f+N(c,20);c=H[b>>2];g=H[b+4>>2];if((c|0)==(g|0)){break a}b=f;while(1){e=H[c+4>>2];H[b>>2]=H[c>>2];H[b+4>>2]=e;H[b+16>>2]=H[c+16>>2];e=H[c+12>>2];H[b+8>>2]=H[c+8>>2];H[b+12>>2]=e;b=b+20|0;c=c+20|0;if((g|0)!=(c|0)){continue}break}g=0;H[a+28>>2]=0;H[a+20>>2]=b;if((b|0)!=(f|0)){b=(b-f|0)/20|0;e=b>>>0<=1?1:b;h=e&3;b=0;c=0;if(e-1>>>0>=3){i=e&-4;e=0;while(1){d=f+N(b,20)|0;d=N(H[d+16>>2],H[d+12>>2]);c=c>>>0>d>>>0?c:d;d=f+N(b|1,20)|0;d=N(H[d+16>>2],H[d+12>>2]);c=c>>>0>d>>>0?c:d;d=f+N(b|2,20)|0;d=N(H[d+16>>2],H[d+12>>2]);c=c>>>0>d>>>0?c:d;d=f+N(b|3,20)|0;d=N(H[d+16>>2],H[d+12>>2]);c=c>>>0>d>>>0?c:d;b=b+4|0;e=e+4|0;if((i|0)!=(e|0)){continue}break}}if(h){while(1){e=f+N(b,20)|0;e=N(H[e+16>>2],H[e+12>>2]);c=c>>>0>e>>>0?c:e;b=b+1|0;g=g+1|0;if((h|0)!=(g|0)){continue}break}}if(!c){H[a+12>>2]=0;return a}if((c|0)<0){break b}g=pa(c);b=ra(g,0,c);f=b+c|0;H[a+8>>2]=f;H[a+4>>2]=f;H[a>>2]=b}H[a+12>>2]=g;return a}sa();v()}sa();v()}H[a+28>>2]=0;H[a+12>>2]=0;return a}function Dh(a){a=a|0;var b=0,c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;a:{b=H[a+32>>2];f=H[b+8>>2];h=H[b+12>>2];g=H[b+20>>2];c=H[b+16>>2];e=0;b:{if((h|0)<=(g|0)&c>>>0>=f>>>0|(g|0)>(h|0)){break b}f=I[H[b>>2]+c|0];e=b;b=g;c=c+1|0;b=c?b:b+1|0;H[e+16>>2]=c;H[e+20>>2]=b;c:{if(!f){break c}while(1){if(ea[H[H[a>>2]+16>>2]](a,d)|0){d=d+1|0;if((f|0)!=(d|0)){continue}break c}break}return 0}d=H[a+8>>2];b=H[a+12>>2];if((d|0)!=(b|0)){while(1){c=H[d>>2];if(!(ea[H[H[c>>2]+8>>2]](c,a,H[a+4>>2])|0)){break a}d=d+4|0;if((b|0)!=(d|0)){continue}break}}d:{if(!f){break d}d=0;while(1){b=H[H[a+8>>2]+(d<<2)>>2];if(!(ea[H[H[b>>2]+12>>2]](b,H[a+32>>2])|0)){break a}d=d+1|0;if((f|0)!=(d|0)){continue}break}if(!f){break d}i=a+20|0;b=0;while(1){d=0;j=b<<2;c=H[j+H[a+8>>2]>>2];k=ea[H[H[c>>2]+24>>2]](c)|0;if((k|0)>0){while(1){c=H[H[a+8>>2]+j>>2];c=ea[H[H[c>>2]+20>>2]](c,d)|0;e=H[a+20>>2];g=H[a+24>>2]-e>>2;e:{if(c>>>0<g>>>0){break e}h=c+1|0;if(h>>>0>g>>>0){ya(i,h-g|0);e=H[i>>2];break e}if(g>>>0<=h>>>0){break e}H[a+24>>2]=(h<<2)+e}H[(c<<2)+e>>2]=b;d=d+1|0;if((k|0)!=(d|0)){continue}break}}b=b+1|0;if((f|0)!=(b|0)){continue}break}}e=0;if(!(ea[H[H[a>>2]+28>>2]](a)|0)){break b}e=ea[H[H[a>>2]+32>>2]](a)|0}return e|0}return 0}function ta(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;i=ca-16|0;ca=i;f=H[b+20>>2];d=H[b+12>>2];c=H[b+16>>2];a:{if((f|0)>=(d|0)&c>>>0>=K[b+8>>2]|(d|0)<(f|0)){break a}F[a+12|0]=I[c+H[b>>2]|0];c=H[b+20>>2];g=c;f=H[b+16>>2];e=f+1|0;c=e?c:c+1|0;H[b+16>>2]=e;H[b+20>>2]=c;b:{if(J[b+38>>1]<=513){d=H[b+8>>2];c=H[b+12>>2];h=c;c=g;f=f+5|0;c=f>>>0<5?c+1|0:c;if(d>>>0<f>>>0&(c|0)>=(h|0)|(c|0)>(h|0)){break a}e=e+H[b>>2]|0;e=I[e|0]|I[e+1|0]<<8|(I[e+2|0]<<16|I[e+3|0]<<24);H[b+16>>2]=f;H[b+20>>2]=c;break b}if(!Qe(1,i+12|0,b)){break a}f=H[b+16>>2];c=H[b+20>>2];d=H[b+8>>2];h=H[b+12>>2];e=H[i+12>>2]}g=d-f|0;d=h-(c+(d>>>0<f>>>0)|0)|0;if((d|0)<=0&e>>>0>g>>>0|(d|0)<0|(e|0)<=0){break a}j=H[b>>2]+f|0;H[a>>2]=j;c:{d:{h=e-1|0;g=h+j|0;d=I[g|0];e:{if(d>>>0<=63){H[a+4>>2]=h;g=I[g|0]&63;break e}f:{switch((d>>>6|0)-1|0){case 1:break d;case 0:break f;default:break a}}if(e>>>0<2){break a}d=e-2|0;H[a+4>>2]=d;d=d+j|0;g=I[d+1|0]<<8&16128|I[d|0]}H[a+8>>2]=g+4096;break c}if(e>>>0<3){break a}d=e-3|0;H[a+4>>2]=d;g=a;a=d+j|0;a=I[a+1|0]<<8|I[a+2|0]<<16&4128768|I[a|0];H[g+8>>2]=a+4096;if(a>>>0>1044479){break a}}a=e+f|0;c=a>>>0<e>>>0?c+1|0:c;H[b+16>>2]=a;H[b+20>>2]=c;k=1}ca=i+16|0;return k}function Wf(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0;Xd(a,b,c);c=H[a+84>>2];d=H[a+88>>2]-c>>2;a:{if((d|0)>(b|0)){break a}b=b+1|0;if(b>>>0>d>>>0){b:{d=b-d|0;e=H[a+92>>2];c=H[a+88>>2];if(d>>>0<=e-c>>2>>>0){c:{if(!d){break c}b=c;e=d&7;if(e){while(1){H[b>>2]=1;b=b+4|0;f=f+1|0;if((e|0)!=(f|0)){continue}break}}c=(d<<2)+c|0;if((d-1&1073741823)>>>0<7){break c}while(1){H[b+24>>2]=1;H[b+28>>2]=1;H[b+16>>2]=1;H[b+20>>2]=1;H[b+8>>2]=1;H[b+12>>2]=1;H[b>>2]=1;H[b+4>>2]=1;b=b+32|0;if((c|0)!=(b|0)){continue}break}}H[a+88>>2]=c;break b}d:{b=c;c=H[a+84>>2];i=b-c|0;g=i>>2;b=g+d|0;if(b>>>0<1073741824){e=e-c|0;h=e>>>1|0;e=e>>>0>=2147483644?1073741823:b>>>0<h>>>0?h:b;if(e){if(e>>>0>=1073741824){break d}j=pa(e<<2)}g=(g<<2)+j|0;b=g;h=d&7;if(h){while(1){H[b>>2]=1;b=b+4|0;f=f+1|0;if((h|0)!=(f|0)){continue}break}}f=g+(d<<2)|0;if((d-1&1073741823)>>>0>=7){while(1){H[b+24>>2]=1;H[b+28>>2]=1;H[b+16>>2]=1;H[b+20>>2]=1;H[b+8>>2]=1;H[b+12>>2]=1;H[b>>2]=1;H[b+4>>2]=1;b=b+32|0;if((f|0)!=(b|0)){continue}break}}b=va(j,c,i);H[a+88>>2]=f;H[a+84>>2]=b;H[a+92>>2]=b+(e<<2);if(c){oa(c)}break b}sa();v()}wa();v()}return}if(b>>>0>=d>>>0){break a}H[a+88>>2]=c+(b<<2)}}function qb(a,b,c){var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;d=H[a+8>>2];e=H[a+4>>2];if(d-e>>2>>>0>=b>>>0){a:{if(!b){break a}d=e;g=b&7;if(g){while(1){H[d>>2]=H[c>>2];d=d+4|0;f=f+1|0;if((g|0)!=(f|0)){continue}break}}e=(b<<2)+e|0;if((b-1&1073741823)>>>0<7){break a}while(1){H[d>>2]=H[c>>2];H[d+4>>2]=H[c>>2];H[d+8>>2]=H[c>>2];H[d+12>>2]=H[c>>2];H[d+16>>2]=H[c>>2];H[d+20>>2]=H[c>>2];H[d+24>>2]=H[c>>2];H[d+28>>2]=H[c>>2];d=d+32|0;if((e|0)!=(d|0)){continue}break}}H[a+4>>2]=e;return}b:{i=H[a>>2];f=e-i>>2;h=f+b|0;if(h>>>0<1073741824){j=d-i|0;d=j>>>1|0;h=j>>>0>=2147483644?1073741823:d>>>0>h>>>0?d:h;if(h){if(h>>>0>=1073741824){break b}k=pa(h<<2)}f=(f<<2)+k|0;d=f;j=b&7;if(j){while(1){H[d>>2]=H[c>>2];d=d+4|0;g=g+1|0;if((j|0)!=(g|0)){continue}break}}g=(b<<2)+f|0;if((b-1&1073741823)>>>0>=7){while(1){H[d>>2]=H[c>>2];H[d+4>>2]=H[c>>2];H[d+8>>2]=H[c>>2];H[d+12>>2]=H[c>>2];H[d+16>>2]=H[c>>2];H[d+20>>2]=H[c>>2];H[d+24>>2]=H[c>>2];H[d+28>>2]=H[c>>2];d=d+32|0;if((g|0)!=(d|0)){continue}break}}if((e|0)!=(i|0)){while(1){f=f-4|0;e=e-4|0;H[f>>2]=H[e>>2];if((e|0)!=(i|0)){continue}break}}H[a+8>>2]=(h<<2)+k;H[a+4>>2]=g;H[a>>2]=f;if(i){oa(i)}return}sa();v()}wa();v()}function Kc(a,b,c){var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;d=H[a+8>>2];e=H[a>>2];if(d-e>>2>>>0>=b>>>0){f=H[a+4>>2];h=f-e>>2;i=b>>>0>h>>>0?h:b;a:{if(!i){break a}d=e;g=i;j=g&7;if(j){while(1){H[d>>2]=H[c>>2];g=g-1|0;d=d+4|0;k=k+1|0;if((k|0)!=(j|0)){continue}break}}if(i>>>0<8){break a}while(1){H[d>>2]=H[c>>2];H[d+4>>2]=H[c>>2];H[d+8>>2]=H[c>>2];H[d+12>>2]=H[c>>2];H[d+16>>2]=H[c>>2];H[d+20>>2]=H[c>>2];H[d+24>>2]=H[c>>2];H[d+28>>2]=H[c>>2];d=d+32|0;g=g-8|0;if(g){continue}break}}if(b>>>0>h>>>0){b=(b-h<<2)+f|0;while(1){H[f>>2]=H[c>>2];f=f+4|0;if((b|0)!=(f|0)){continue}break}H[a+4>>2]=b;return}H[a+4>>2]=e+(b<<2);return}if(e){H[a+4>>2]=e;oa(e);H[a+8>>2]=0;H[a>>2]=0;H[a+4>>2]=0;d=0}b:{if(b>>>0>=1073741824){break b}e=d>>>1|0;d=d>>>0>=2147483644?1073741823:b>>>0<e>>>0?e:b;if(d>>>0>=1073741824){break b}d=d<<2;e=pa(d);H[a>>2]=e;H[a+8>>2]=d+e;c=H[c>>2];d=e;g=b&7;if(g){while(1){H[d>>2]=c;d=d+4|0;f=f+1|0;if((g|0)!=(f|0)){continue}break}}e=e+(b<<2)|0;if((b-1&1073741823)>>>0>=7){while(1){H[d+28>>2]=c;H[d+24>>2]=c;H[d+20>>2]=c;H[d+16>>2]=c;H[d+12>>2]=c;H[d+8>>2]=c;H[d+4>>2]=c;H[d>>2]=c;d=d+32|0;if((e|0)!=(d|0)){continue}break}}H[a+4>>2]=e;return}sa();v()}function Me(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;h=ca-16|0;ca=h;a:{b:{if(J[b+38>>1]<=511){e=H[b+8>>2];c=H[b+12>>2];i=c;f=H[b+20>>2];d=H[b+16>>2];g=d+8|0;f=g>>>0<8?f+1|0:f;if(e>>>0<g>>>0&(c|0)<=(f|0)|(c|0)<(f|0)){break a}d=d+H[b>>2]|0;c=I[d|0]|I[d+1|0]<<8|(I[d+2|0]<<16|I[d+3|0]<<24);d=I[d+4|0]|I[d+5|0]<<8|(I[d+6|0]<<16|I[d+7|0]<<24);H[b+16>>2]=g;H[b+20>>2]=f;break b}if(!gb(1,h+8|0,b)){break a}g=H[b+16>>2];f=H[b+20>>2];e=H[b+8>>2];i=H[b+12>>2];c=H[h+8>>2];d=H[h+12>>2]}j=e-g|0;e=i-(f+(e>>>0<g>>>0)|0)|0;if((e|0)==(d|0)&c>>>0>j>>>0|d>>>0>e>>>0){break a}e=d+f|0;f=c+g|0;e=f>>>0<g>>>0?e+1|0:e;H[b+16>>2]=f;H[b+20>>2]=e;if((c|0)<=0){break a}b=H[b>>2]+g|0;H[a+40>>2]=b;g=c-1|0;e=b+g|0;f=I[e|0];c:{if(f>>>0<=63){H[a+44>>2]=g;b=I[e|0]&63;break c}d:{switch((f>>>6|0)-1|0){case 0:if(c>>>0<2){break a}c=c-2|0;H[a+44>>2]=c;b=b+c|0;b=I[b+1|0]<<8&16128|I[b|0];break c;case 1:if(c>>>0<3){break a}c=c-3|0;H[a+44>>2]=c;b=b+c|0;b=I[b+1|0]<<8|I[b+2|0]<<16&4128768|I[b|0];break c;default:break d}}c=c-4|0;H[a+44>>2]=c;b=b+c|0;b=(I[b|0]|I[b+1|0]<<8|(I[b+2|0]<<16|I[b+3|0]<<24))&1073741823}H[a+48>>2]=b+16384;k=b>>>0<4177920}ca=h+16|0;return k}function Ua(a,b,c){var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;f=(c>>>0)/3|0;j=H[(H[H[a+8>>2]+96>>2]+N(f,12)|0)+(c-N(f,3)<<2)>>2];a:{h=H[H[a+12>>2]+4>>2];e=H[h+4>>2];if((e|0)!=H[h+8>>2]){H[e>>2]=j;H[h+4>>2]=e+4;break a}b:{i=H[h>>2];f=e-i|0;g=f>>2;d=g+1|0;if(d>>>0<1073741824){k=g<<2;g=f>>>1|0;g=f>>>0>=2147483644?1073741823:d>>>0<g>>>0?g:d;if(g){if(g>>>0>=1073741824){break b}f=pa(g<<2)}else{f=0}d=k+f|0;H[d>>2]=j;j=d+4|0;if((e|0)!=(i|0)){while(1){d=d-4|0;e=e-4|0;H[d>>2]=H[e>>2];if((e|0)!=(i|0)){continue}break}}H[h+8>>2]=f+(g<<2);H[h+4>>2]=j;H[h>>2]=d;if(i){oa(i)}break a}sa();v()}wa();v()}c:{d:{h=H[a+4>>2];e=H[h+4>>2];e:{if((e|0)!=H[h+8>>2]){H[e>>2]=c;H[h+4>>2]=e+4;break e}i=H[h>>2];f=e-i|0;j=f>>2;d=j+1|0;if(d>>>0>=1073741824){break d}g=f>>>1|0;g=f>>>0>=2147483644?1073741823:d>>>0<g>>>0?g:d;if(g){if(g>>>0>=1073741824){break c}f=pa(g<<2)}else{f=0}d=f+(j<<2)|0;H[d>>2]=c;c=d+4|0;if((e|0)!=(i|0)){while(1){d=d-4|0;e=e-4|0;H[d>>2]=H[e>>2];if((e|0)!=(i|0)){continue}break}}H[h+8>>2]=f+(g<<2);H[h+4>>2]=c;H[h>>2]=d;if(!i){break e}oa(i)}a=H[a+4>>2];H[H[a+12>>2]+(b<<2)>>2]=H[a+24>>2];H[a+24>>2]=H[a+24>>2]+1;return}sa();v()}wa();v()}function Wb(a,b,c,d){var e=0,f=0,g=0,h=0,i=0,j=0,k=0;h=d-c|0;if((h|0)<=0){return}a:{e=H[a+8>>2];i=H[a+4>>2];if((e-i|0)>=(h|0)){j=i-b|0;if((j|0)>=(h|0)){f=i;g=d;break a}f=i;g=c+j|0;if((g|0)!=(d|0)){e=g;while(1){F[f|0]=I[e|0];f=f+1|0;e=e+1|0;if((e|0)!=(d|0)){continue}break}}H[a+4>>2]=f;if((j|0)>0){break a}return}k=H[a>>2];g=(i-k|0)+h|0;if((g|0)>=0){j=b-k|0;f=e-k|0;e=f<<1;f=f>>>0>=1073741823?2147483647:e>>>0>g>>>0?e:g;if(f){e=pa(f)}else{e=0}g=j+e|0;if((c|0)!=(d|0)){g=qa(g,c,h)+h|0}d=va(e,k,j);c=i-b|0;b=va(g,b,c);H[a+8>>2]=e+f;H[a+4>>2]=b+c;H[a>>2]=d;if(k){oa(k)}return}sa();v()}e=f;d=e-h|0;if(i>>>0>d>>>0){while(1){F[e|0]=I[d|0];e=e+1|0;d=d+1|0;if(i>>>0>d>>>0){continue}break}}H[a+4>>2]=e;a=b+h|0;if((a|0)!=(f|0)){a=f-a|0;va(f-a|0,b,a)}if((c|0)==(g|0)){return}f=(c^-1)+g|0;a=g-c&7;b:{if(!a){e=b;break b}d=0;e=b;while(1){F[e|0]=I[c|0];e=e+1|0;c=c+1|0;d=d+1|0;if((a|0)!=(d|0)){continue}break}}if(f>>>0<7){return}while(1){F[e|0]=I[c|0];F[e+1|0]=I[c+1|0];F[e+2|0]=I[c+2|0];F[e+3|0]=I[c+3|0];F[e+4|0]=I[c+4|0];F[e+5|0]=I[c+5|0];F[e+6|0]=I[c+6|0];F[e+7|0]=I[c+7|0];e=e+8|0;c=c+8|0;if((g|0)!=(c|0)){continue}break}}function qa(a,b,c){var d=0,e=0,f=0;if(c>>>0>=512){ba(a|0,b|0,c|0);return a}e=a+c|0;a:{if(!((a^b)&3)){b:{if(!(a&3)){c=a;break b}if(!c){c=a;break b}c=a;while(1){F[c|0]=I[b|0];b=b+1|0;c=c+1|0;if(!(c&3)){break b}if(c>>>0<e>>>0){continue}break}}d=e&-4;c:{if(d>>>0<64){break c}f=d+-64|0;if(f>>>0<c>>>0){break c}while(1){H[c>>2]=H[b>>2];H[c+4>>2]=H[b+4>>2];H[c+8>>2]=H[b+8>>2];H[c+12>>2]=H[b+12>>2];H[c+16>>2]=H[b+16>>2];H[c+20>>2]=H[b+20>>2];H[c+24>>2]=H[b+24>>2];H[c+28>>2]=H[b+28>>2];H[c+32>>2]=H[b+32>>2];H[c+36>>2]=H[b+36>>2];H[c+40>>2]=H[b+40>>2];H[c+44>>2]=H[b+44>>2];H[c+48>>2]=H[b+48>>2];H[c+52>>2]=H[b+52>>2];H[c+56>>2]=H[b+56>>2];H[c+60>>2]=H[b+60>>2];b=b- -64|0;c=c- -64|0;if(f>>>0>=c>>>0){continue}break}}if(c>>>0>=d>>>0){break a}while(1){H[c>>2]=H[b>>2];b=b+4|0;c=c+4|0;if(d>>>0>c>>>0){continue}break}break a}if(e>>>0<4){c=a;break a}d=e-4|0;if(d>>>0<a>>>0){c=a;break a}c=a;while(1){F[c|0]=I[b|0];F[c+1|0]=I[b+1|0];F[c+2|0]=I[b+2|0];F[c+3|0]=I[b+3|0];b=b+4|0;c=c+4|0;if(d>>>0>=c>>>0){continue}break}}if(c>>>0<e>>>0){while(1){F[c|0]=I[b|0];b=b+1|0;c=c+1|0;if((e|0)!=(c|0)){continue}break}}return a}function ub(a,b){var c=0,d=0,e=0,f=0,g=0;d=ca-16|0;ca=d;H[a+12>>2]=b;H[a+8>>2]=0;H[a>>2]=0;H[a+4>>2]=0;c=a+16|0;H[c>>2]=0;H[c+4>>2]=0;F[c+5|0]=0;F[c+6|0]=0;F[c+7|0]=0;F[c+8|0]=0;F[c+9|0]=0;F[c+10|0]=0;F[c+11|0]=0;F[c+12|0]=0;H[a+32>>2]=0;H[a+36>>2]=0;H[a+48>>2]=0;H[a+40>>2]=0;H[a+44>>2]=0;H[a+52>>2]=0;H[a+56>>2]=0;H[a+68>>2]=0;H[a+60>>2]=0;H[a+64>>2]=0;H[a+72>>2]=0;H[a+76>>2]=0;H[a+88>>2]=0;H[a+80>>2]=0;H[a+84>>2]=0;H[a+100>>2]=0;H[a+92>>2]=0;H[a+96>>2]=0;g=a+116|0;a:{b:{if(b){if(b>>>0<1073741824){break b}sa();v()}H[a+104>>2]=0;H[a+108>>2]=0;H[a+112>>2]=0;H[d+8>>2]=0;H[d>>2]=0;H[d+4>>2]=0;c=1;break a}c=b<<2;e=pa(c);H[a+92>>2]=e;f=c+e|0;H[a+100>>2]=f;ra(e,0,c);H[a+112>>2]=0;H[a+104>>2]=0;H[a+108>>2]=0;H[a+96>>2]=f;e=pa(c);H[a+104>>2]=e;f=c+e|0;H[a+112>>2]=f;ra(e,0,c);H[a+108>>2]=f;e=pa(c);H[d>>2]=e;f=c+e|0;H[d+8>>2]=f;ra(e,0,c);H[d+4>>2]=f;c=b<<5|1}tb(g,c,d);e=H[d>>2];if(e){H[d+4>>2]=e;oa(e)}H[d+8>>2]=0;H[d>>2]=0;H[d+4>>2]=0;if(b){b=b<<2;e=pa(b);H[d>>2]=e;f=b+e|0;H[d+8>>2]=f;ra(e,0,b);H[d+4>>2]=f}tb(a+128|0,c,d);b=H[d>>2];if(b){H[d+4>>2]=b;oa(b)}ca=d+16|0;return a}function ze(a){a=a|0;var b=0,c=0,d=0,e=0,f=0;H[a>>2]=11484;d=a+232|0;b=H[d+196>>2];if(b){H[d+200>>2]=b;oa(b)}c=H[d+184>>2];if(c){b=c;e=H[d+188>>2];if((b|0)!=(e|0)){while(1){b=e-12|0;f=H[b>>2];if(f){H[e-8>>2]=f;oa(f)}e=b;if((b|0)!=(c|0)){continue}break}b=H[d+184>>2]}H[d+188>>2]=c;oa(b)}b=H[d+156>>2];if(b){H[d+160>>2]=b;oa(b)}c=H[d+136>>2];H[d+136>>2]=0;if(c){e=c-4|0;b=H[e>>2];if(b){b=c+(b<<4)|0;while(1){b=b-16|0;if((c|0)!=(b|0)){continue}break}}oa(e)}Yc(a+216|0);b=H[a+196>>2];if(b){H[a+200>>2]=b;oa(b)}b=H[a+184>>2];if(b){H[a+188>>2]=b;oa(b)}b=H[a+172>>2];if(b){H[a+176>>2]=b;oa(b)}b=H[a+160>>2];if(b){H[a+164>>2]=b;oa(b)}b=H[a+144>>2];if(b){while(1){c=H[b>>2];oa(b);b=c;if(b){continue}break}}b=H[a+136>>2];H[a+136>>2]=0;if(b){oa(b)}b=H[a+120>>2];if(b){oa(b)}b=H[a+108>>2];if(b){oa(b)}b=H[a+96>>2];if(b){oa(b)}b=H[a+72>>2];if(b){H[a+76>>2]=b;oa(b)}b=H[a+60>>2];if(b){oa(b)}b=H[a+48>>2];if(b){H[a+52>>2]=b;oa(b)}b=H[a+36>>2];if(b){H[a+40>>2]=b;oa(b)}b=H[a+24>>2];if(b){H[a+28>>2]=b;oa(b)}b=H[a+12>>2];if(b){H[a+16>>2]=b;oa(b)}b=H[a+8>>2];H[a+8>>2]=0;if(b){cb(b)}return a|0}function Pa(a,b,c){var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;d=H[a+8>>2];e=H[a+4>>2];if(d-e>>2>>>0>=b>>>0){a:{if(!b){break a}d=e;f=b&7;if(f){while(1){H[d>>2]=H[c>>2];d=d+4|0;h=h+1|0;if((f|0)!=(h|0)){continue}break}}e=(b<<2)+e|0;if((b-1&1073741823)>>>0<7){break a}while(1){H[d>>2]=H[c>>2];H[d+4>>2]=H[c>>2];H[d+8>>2]=H[c>>2];H[d+12>>2]=H[c>>2];H[d+16>>2]=H[c>>2];H[d+20>>2]=H[c>>2];H[d+24>>2]=H[c>>2];H[d+28>>2]=H[c>>2];d=d+32|0;if((e|0)!=(d|0)){continue}break}}H[a+4>>2]=e;return}b:{i=H[a>>2];j=e-i|0;f=j>>2;g=f+b|0;if(g>>>0<1073741824){d=d-i|0;e=d>>>1|0;g=d>>>0>=2147483644?1073741823:e>>>0>g>>>0?e:g;if(g){if(g>>>0>=1073741824){break b}k=pa(g<<2)}f=(f<<2)+k|0;d=f;e=b&7;if(e){while(1){H[d>>2]=H[c>>2];d=d+4|0;h=h+1|0;if((e|0)!=(h|0)){continue}break}}e=f+(b<<2)|0;if((b-1&1073741823)>>>0>=7){while(1){H[d>>2]=H[c>>2];H[d+4>>2]=H[c>>2];H[d+8>>2]=H[c>>2];H[d+12>>2]=H[c>>2];H[d+16>>2]=H[c>>2];H[d+20>>2]=H[c>>2];H[d+24>>2]=H[c>>2];H[d+28>>2]=H[c>>2];d=d+32|0;if((e|0)!=(d|0)){continue}break}}b=va(k,i,j);H[a+4>>2]=e;H[a>>2]=b;H[a+8>>2]=b+(g<<2);if(i){oa(i)}return}sa();v()}wa();v()}function Cc(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0;if(I[a+11|0]>>>7|0){d=H[a+4>>2]}else{d=I[a+11|0]&127}if(d>>>0<b>>>0){h=ca-16|0;ca=h;b=b-d|0;if(b){g=I[a+11|0]>>>7|0?(H[a+8>>2]&2147483647)-1|0:10;if(I[a+11|0]>>>7|0){d=H[a+4>>2]}else{d=I[a+11|0]&127}i=d+b|0;if(g-d>>>0<b>>>0){a:{e=ca-16|0;ca=e;c=i-g|0;if(c>>>0<=2147483631-g>>>0){if(I[a+11|0]>>>7|0){f=H[a>>2]}else{f=a}if(g>>>0<1073741799){H[e+12>>2]=g<<1;H[e>>2]=c+g;c=ca-16|0;ca=c;ca=c+16|0;c=e+12|0;c=H[(K[e>>2]<K[c>>2]?c:e)>>2];if(c>>>0>=11){j=c+16&-16;c=j-1|0;c=(c|0)==11?j:c}else{c=10}c=c+1|0}else{c=2147483631}Zb(e,c);c=H[e>>2];if(d){yb(c,f,d)}if((g|0)!=10){oa(f)}H[a>>2]=c;H[a+8>>2]=H[a+8>>2]&-2147483648|H[e+4>>2]&2147483647;H[a+8>>2]=H[a+8>>2]|-2147483648;ca=e+16|0;break a}Na();v()}}f=d;if(I[a+11|0]>>>7|0){d=H[a>>2]}else{d=a}f=f+d|0;e=ca-16|0;ca=e;F[e+15|0]=0;while(1){if(b){F[f|0]=I[e+15|0];b=b-1|0;f=f+1|0;continue}break}ca=e+16|0;Id(a,i);F[h+15|0]=0;F[d+i|0]=I[h+15|0]}ca=h+16|0;return}if(I[a+11|0]>>>7|0){d=H[a>>2]}else{d=a}f=ca-16|0;ca=f;Id(a,b);F[f+15|0]=0;F[b+d|0]=I[f+15|0];ca=f+16|0}function Jc(a,b){var c=0,d=0,e=0,f=0,g=0,h=0;g=ca-16|0;ca=g;a:{b:{if(b){H[a+88>>2]=0;H[a+92>>2]=0;d=H[a+84>>2];H[a+84>>2]=0;if(d){oa(d)}H[a+76>>2]=0;H[a+80>>2]=0;d=H[a+72>>2];H[a+72>>2]=0;if(d){oa(d)}d=H[b>>2];c=H[b+4>>2];F[g+15|0]=0;Oa(a,c-d>>2,g+15|0);d=H[b+28>>2];c=H[b+24>>2];F[g+14|0]=0;Oa(a+12|0,d-c>>2,g+14|0);Kc(a+28|0,H[b+4>>2]-H[b>>2]>>2,13708);c=H[b+28>>2]-H[b+24>>2]|0;f=c>>2;e=H[a+52>>2];c:{if(f>>>0<=H[a+60>>2]-e>>2>>>0){break c}if((c|0)<0){break b}d=H[a+56>>2];c=pa(c);f=c+(f<<2)|0;h=c+(d-e&-4)|0;c=h;if((d|0)!=(e|0)){while(1){c=c-4|0;d=d-4|0;H[c>>2]=H[d>>2];if((d|0)!=(e|0)){continue}break}}H[a+60>>2]=f;H[a+56>>2]=h;H[a+52>>2]=c;if(!e){break c}oa(e)}c=H[b+28>>2]-H[b+24>>2]|0;f=c>>2;e=H[a+40>>2];d:{if(f>>>0<=H[a+48>>2]-e>>2>>>0){break d}if((c|0)<0){break a}d=H[a+44>>2];c=pa(c);f=c+(f<<2)|0;h=c+(d-e&-4)|0;c=h;if((d|0)!=(e|0)){while(1){c=c-4|0;d=d-4|0;H[c>>2]=H[d>>2];if((d|0)!=(e|0)){continue}break}}H[a+48>>2]=f;H[a+44>>2]=h;H[a+40>>2]=c;if(!e){break d}oa(e)}F[a+24|0]=1;H[a+64>>2]=b}ca=g+16|0;return}sa();v()}sa();v()}function wb(a,b){var c=0,d=0,e=0,f=0,g=0;c=ca-16|0;ca=c;H[a+12>>2]=b;H[a+8>>2]=0;H[a>>2]=0;H[a+4>>2]=0;H[a+16>>2]=0;H[a+20>>2]=0;H[a+32>>2]=0;H[a+24>>2]=0;H[a+28>>2]=0;H[a+36>>2]=0;H[a+40>>2]=0;H[a+52>>2]=0;H[a+44>>2]=0;H[a+48>>2]=0;H[a+56>>2]=0;H[a+60>>2]=0;H[a+72>>2]=0;H[a+64>>2]=0;H[a+68>>2]=0;H[a+76>>2]=0;H[a+80>>2]=0;H[a+92>>2]=0;H[a+84>>2]=0;H[a+88>>2]=0;H[a+104>>2]=0;H[a+96>>2]=0;H[a+100>>2]=0;g=a+120|0;a:{b:{if(b){if(b>>>0<1073741824){break b}sa();v()}H[a+108>>2]=0;H[a+112>>2]=0;H[a+116>>2]=0;H[c+8>>2]=0;H[c>>2]=0;H[c+4>>2]=0;e=1;break a}e=b<<2;d=pa(e);H[a+96>>2]=d;f=d+e|0;H[a+104>>2]=f;ra(d,0,e);H[a+116>>2]=0;H[a+108>>2]=0;H[a+112>>2]=0;H[a+100>>2]=f;d=pa(e);H[a+108>>2]=d;f=d+e|0;H[a+116>>2]=f;ra(d,0,e);H[a+112>>2]=f;d=pa(e);H[c>>2]=d;f=d+e|0;H[c+8>>2]=f;ra(d,0,e);H[c+4>>2]=f;e=b<<5|1}tb(g,e,c);d=H[c>>2];if(d){H[c+4>>2]=d;oa(d)}H[c+8>>2]=0;H[c>>2]=0;H[c+4>>2]=0;if(b){b=b<<2;d=pa(b);H[c>>2]=d;f=b+d|0;H[c+8>>2]=f;ra(d,0,b);H[c+4>>2]=f}tb(a+132|0,e,c);b=H[c>>2];if(b){H[c+4>>2]=b;oa(b)}ca=c+16|0;return a}function Sb(a,b){var c=0,d=0,e=0;c=(a|0)==(b|0);F[b+12|0]=c;a:{if(c){break a}while(1){d=H[b+8>>2];if(I[d+12|0]){break a}b:{c=H[d+8>>2];e=H[c>>2];if((e|0)==(d|0)){e=H[c+4>>2];if(!(!e|I[e+12|0])){break b}c:{if(H[d>>2]==(b|0)){b=d;break c}b=H[d+4>>2];a=H[b>>2];H[d+4>>2]=a;if(a){H[a+8>>2]=d;c=H[d+8>>2]}H[b+8>>2]=c;a=H[d+8>>2];H[((H[a>>2]!=(d|0))<<2)+a>>2]=b;H[b>>2]=d;H[d+8>>2]=b;c=H[b+8>>2];d=H[c>>2]}F[b+12|0]=1;F[c+12|0]=0;a=H[d+4>>2];H[c>>2]=a;if(a){H[a+8>>2]=c}H[d+8>>2]=H[c+8>>2];a=H[c+8>>2];H[((H[a>>2]!=(c|0))<<2)+a>>2]=d;H[d+4>>2]=c;H[c+8>>2]=d;return}if(!(I[e+12|0]|!e)){break b}d:{if(H[d>>2]!=(b|0)){b=d;break d}a=H[b+4>>2];H[d>>2]=a;if(a){H[a+8>>2]=d;c=H[d+8>>2]}H[b+8>>2]=c;a=H[d+8>>2];H[((H[a>>2]!=(d|0))<<2)+a>>2]=b;H[b+4>>2]=d;H[d+8>>2]=b;c=H[b+8>>2]}F[b+12|0]=1;F[c+12|0]=0;a=H[c+4>>2];b=H[a>>2];H[c+4>>2]=b;if(b){H[b+8>>2]=c}H[a+8>>2]=H[c+8>>2];b=H[c+8>>2];H[((H[b>>2]!=(c|0))<<2)+b>>2]=a;H[a>>2]=c;H[c+8>>2]=a;break a}F[d+12|0]=1;F[c+12|0]=(a|0)==(c|0);F[e+12|0]=1;b=c;if((c|0)!=(a|0)){continue}break}}}function Tj(a,b,c,d){var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;a:{b:{c:{d:{e:{f:{g:{h:{i:{j:{k:{if(b){if(!c){break k}if(!d){break j}e=Q(d)-Q(b)|0;if(e>>>0<=31){break i}break c}if((d|0)==1|d>>>0>1){break c}da=0;a=(a>>>0)/(c>>>0)|0;break a}if(!a){break h}if(!d|d-1&d){break g}a=b>>>Qj(d)|0;da=0;break a}if(!(c-1&c)){break f}h=(Q(c)+33|0)-Q(b)|0;g=0-h|0;break d}h=e+1|0;g=63-e|0;break d}da=0;a=(b>>>0)/(d>>>0)|0;break a}e=Q(d)-Q(b)|0;if(e>>>0<31){break e}break c}if((c|0)==1){break b}d=Qj(c);c=d&31;if((d&63)>>>0>=32){a=b>>>c|0}else{e=b>>>c|0;a=((1<<c)-1&b)<<32-c|a>>>c}da=e;break a}h=e+1|0;g=63-e|0}e=h&63;f=e&31;if(e>>>0>=32){e=0;i=b>>>f|0}else{e=b>>>f|0;i=((1<<f)-1&b)<<32-f|a>>>f}g=g&63;f=g&31;if(g>>>0>=32){b=a<<f;a=0}else{b=(1<<f)-1&a>>>32-f|b<<f;a=a<<f}if(h){f=d-1|0;g=c-1|0;m=(g|0)!=-1?f+1|0:f;while(1){j=e<<1|i>>>31;e=i<<1|b>>>31;f=m-(j+(e>>>0>g>>>0)|0)>>31;k=c&f;i=e-k|0;e=j-((d&f)+(e>>>0<k>>>0)|0)|0;b=b<<1|a>>>31;a=l|a<<1;l=f&1;h=h-1|0;if(h){continue}break}}da=b<<1|a>>>31;a=l|a<<1;break a}a=0;b=0}da=b}return a}function rc(a,b,c,d){var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;k=H[b+16>>2];h=H[c+4>>2]-k|0;e=H[c>>2]-k|0;H[c>>2]=e;H[c+4>>2]=h;g=H[b+16>>2];f=h>>31;i=(f^h)-f|0;f=e>>31;l=g>>>0>=i+((f^e)-f|0)>>>0;a:{if(l){f=h;break a}b:{c:{if((e|0)>=0){f=1;i=1;if((h|0)>=0){break b}j=1;f=-1;i=-1;if(e){break c}break b}j=-1;f=-1;i=-1;if((h|0)<=0){break b}}f=(h|0)<=0?-1:1;i=j}j=N(g,i);e=(e<<1)-j|0;i=(N(f,i)|0)>=0;g=N(f,g);f=((i?0-e|0:e)+g|0)/2|0;H[c+4>>2]=f;m=c;c=(h<<1)-g|0;e=(j+(i?0-c|0:c)|0)/2|0;H[m>>2]=e;g=H[b+16>>2]}c=H[d+4>>2]+f|0;e=H[d>>2]+e|0;d:{if((g|0)<(e|0)){e=e-H[b+4>>2]|0;break d}if((0-g|0)<=(e|0)){break d}e=H[b+4>>2]+e|0}e:{if((c|0)>(g|0)){c=c-H[b+4>>2]|0;break e}if((0-g|0)<=(c|0)){break e}c=H[b+4>>2]+c|0}f:{if(l){g=c;break f}g:{h:{if((e|0)>=0){b=1;f=1;if((c|0)>=0){break g}d=1;b=-1;f=-1;if(e){break h}break g}d=-1;b=-1;f=-1;if((c|0)<=0){break g}}b=(c|0)<=0?-1:1;f=d}d=N(f,g);h=(e<<1)-d|0;f=(N(b,f)|0)>=0;b=N(b,g);g=((f?0-h|0:h)+b|0)/2|0;b=(c<<1)-b|0;e=(d+(f?0-b|0:b)|0)/2|0}c=a;H[c>>2]=e+k;H[c+4>>2]=g+k}function Wh(a){a=a|0;var b=0,c=0,d=0,e=0,f=0,g=0,h=0;g=ca-16|0;ca=g;e=H[a+4>>2];d=H[e>>2];a:{b=H[a+12>>2];c=H[b+28>>2]-H[b+24>>2]|0;f=c>>2;b:{if(f>>>0<=H[e+8>>2]-d>>2>>>0){break b}if((c|0)<0){break a}b=H[e+4>>2];c=pa(c);f=c+(f<<2)|0;h=c+(b-d&-4)|0;c=h;if((b|0)!=(d|0)){while(1){c=c-4|0;b=b-4|0;H[c>>2]=H[b>>2];if((b|0)!=(d|0)){continue}break}}H[e+8>>2]=f;H[e+4>>2]=h;H[e>>2]=c;if(!d){break b}oa(d)}b=H[a+12>>2];c=H[b+28>>2];b=H[b+24>>2];H[g+12>>2]=0;b=c-b>>2;d=a+96|0;e=H[d>>2];c=H[a+100>>2]-e>>2;c:{if(b>>>0>c>>>0){Pa(d,b-c|0,g+12|0);break c}if(b>>>0>=c>>>0){break c}H[a+100>>2]=e+(b<<2)}e=a+8|0;b=H[a+116>>2];d:{if(b){d=H[b>>2];if((d|0)==H[b+4>>2]){c=1;break d}b=0;while(1){c=ye(e,H[(b<<2)+d>>2]);if(!c){break d}f=H[a+116>>2];d=H[f>>2];b=b+1|0;if(b>>>0<H[f+4>>2]-d>>2>>>0){continue}break}break d}c=1;a=H[a+12>>2];a=H[a+4>>2]-H[a>>2]|0;if(a>>>0<12){break d}a=(a>>2>>>0)/3|0;b=0;while(1){c=ye(e,N(b,3));if(!c){break d}b=b+1|0;if((a|0)!=(b|0)){continue}break}}ca=g+16|0;return c|0}sa();v()}function gj(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;c=H[b+88>>2];if(!(!c|H[c>>2]!=1)){e=H[c+8>>2];H[a+4>>2]=I[e|0]|I[e+1|0]<<8|(I[e+2|0]<<16|I[e+3|0]<<24);f=a+8|0;d=I[b+24|0];h=H[a+8>>2];g=H[a+12>>2]-h>>2;a:{if(d>>>0>g>>>0){ya(f,d-g|0);d=I[b+24|0];e=H[c+8>>2];break a}if(d>>>0>=g>>>0){break a}H[a+12>>2]=h+(d<<2)}b:{if(!d){b=4;break b}h=d&3;f=H[f>>2];c:{if(d-1>>>0<3){b=4;d=0;break c}k=d&252;d=0;b=4;while(1){g=d<<2;c=b+e|0;H[g+f>>2]=I[c|0]|I[c+1|0]<<8|(I[c+2|0]<<16|I[c+3|0]<<24);H[f+(g|4)>>2]=I[c+4|0]|I[c+5|0]<<8|(I[c+6|0]<<16|I[c+7|0]<<24);H[f+(g|8)>>2]=I[c+8|0]|I[c+9|0]<<8|(I[c+10|0]<<16|I[c+11|0]<<24);H[f+(g|12)>>2]=I[c+12|0]|I[c+13|0]<<8|(I[c+14|0]<<16|I[c+15|0]<<24);d=d+4|0;b=b+16|0;i=i+4|0;if((k|0)!=(i|0)){continue}break}}if(!h){break b}while(1){c=b+e|0;H[f+(d<<2)>>2]=I[c|0]|I[c+1|0]<<8|(I[c+2|0]<<16|I[c+3|0]<<24);d=d+1|0;b=b+4|0;j=j+1|0;if((h|0)!=(j|0)){continue}break}}d=a;a=b+e|0;H[d+20>>2]=I[a|0]|I[a+1|0]<<8|(I[a+2|0]<<16|I[a+3|0]<<24);d=1}return d|0}function se(a,b,c,d){var e=0,f=0,g=0,h=0,i=0,j=0;a:{b:{c:{if(!b){if((d|0)<0){break a}f=H[a+4>>2];b=H[a>>2];d=f-b|0;if(c>>>0>d>>>0){g=c-d|0;e=H[a+8>>2];if(g>>>0<=e-f>>>0){i=a,j=ra(f,0,g)+g|0,H[i+4>>2]=j;break c}if((c|0)<0){break b}f=e-b|0;e=f<<1;f=f>>>0>=1073741823?2147483647:c>>>0<e>>>0?e:c;e=pa(f);ra(e+d|0,0,g);d=va(e,b,d);H[a+8>>2]=d+f;H[a+4>>2]=c+d;H[a>>2]=d;if(!b){break c}oa(b);break c}if(c>>>0>=d>>>0){break c}H[a+4>>2]=b+c;break c}if((d|0)<0){break a}e=H[a+4>>2];f=H[a>>2];g=e-f|0;d:{if((d|0)<=0&c>>>0<=g>>>0|(d|0)<0){break d}if(c>>>0>g>>>0){d=c-g|0;h=H[a+8>>2];if(d>>>0<=h-e>>>0){i=a,j=ra(e,0,d)+d|0,H[i+4>>2]=j;break d}if((c|0)<0){break b}e=h-f|0;h=e<<1;e=e>>>0>=1073741823?2147483647:c>>>0<h>>>0?h:c;h=pa(e);ra(h+g|0,0,d);d=va(h,f,g);H[a+8>>2]=d+e;H[a+4>>2]=c+d;H[a>>2]=d;if(!f){break d}oa(f);break d}if(c>>>0>=g>>>0){break d}H[a+4>>2]=c+f}if(!c){break c}va(H[a>>2],b,c)}b=H[a+28>>2];c=H[a+24>>2]+1|0;b=c?b:b+1|0;H[a+24>>2]=c;H[a+28>>2]=b;g=1;break a}sa();v()}return g}function Jh(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;k=H[a+12>>2];c=H[a+68>>2];d=H[c+80>>2];F[b+84|0]=0;n=b+68|0;i=H[b+68>>2];e=H[b+72>>2]-i>>2;a:{if(e>>>0<d>>>0){qb(n,d-e|0,12372);c=H[a+68>>2];d=H[c+80>>2];break a}if(d>>>0>=e>>>0){break a}H[b+72>>2]=i+(d<<2)}b=H[c+100>>2];e=H[c+96>>2];i=(b-e|0)/12|0;m=1;b:{if((b|0)==(e|0)){break b}k=H[k+28>>2];f=H[k>>2];if((f|0)==-1){return 0}o=i>>>0<=1?1:i;c=e;b=0;m=0;while(1){g=H[c>>2];if(g>>>0>=d>>>0){break b}j=H[H[a+72>>2]+12>>2];h=H[j+(f<<2)>>2];if(h>>>0>=d>>>0){break b}f=H[n>>2];H[f+(g<<2)>>2]=h;g=k+(l<<2)|0;h=H[g+4>>2];if((h|0)==-1){break b}l=H[c+4>>2];if(l>>>0>=d>>>0){break b}h=H[(h<<2)+j>>2];if(h>>>0>=d>>>0){break b}H[f+(l<<2)>>2]=h;g=H[g+8>>2];if((g|0)==-1){break b}c=H[c+8>>2];if(c>>>0>=d>>>0){break b}j=H[(g<<2)+j>>2];if(j>>>0>=d>>>0){break b}H[f+(c<<2)>>2]=j;b=b+1|0;m=i>>>0<=b>>>0;if((b|0)==(o|0)){break b}c=e+N(b,12)|0;l=N(b,3);f=H[k+(l<<2)>>2];if((f|0)!=-1){continue}break}}return m|0}function Gh(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;h=H[d+80>>2];e=ca-48|0;ca=e;a=H[a+4>>2];m=a-2|0;a:{if(m>>>0>28){break a}j=H[H[d>>2]>>2]+H[d+48>>2]|0;H[e+16>>2]=a;a=-1<<a;H[e+20>>2]=a^-1;a=-2-a|0;H[e+24>>2]=a;H[e+32>>2]=(a|0)/2;L[e+28>>2]=O(2)/O(a|0);f=H[c>>2];if((f|0)!=H[c+4>>2]){a=0;d=0;while(1){g=H[(d<<2)+f>>2];h=e+36|0;k=H[H[b>>2]>>2];l=H[b+48>>2];f=H[b+40>>2];i=H[b+44>>2];if(!I[b+84|0]){g=H[H[b+68>>2]+(g<<2)>>2]}g=Rj(f,i,g,0);i=g;g=g+l|0;qa(h,g+k|0,f);he(e+16|0,h,e+12|0,e+8|0);f=a<<2;H[f+j>>2]=H[e+12>>2];H[(f|4)+j>>2]=H[e+8>>2];a=a+2|0;d=d+1|0;f=H[c>>2];if(d>>>0<H[c+4>>2]-f>>2>>>0){continue}break}break a}if(!h){break a}d=0;a=0;while(1){k=e+36|0;l=H[H[b>>2]>>2];i=H[b+48>>2];c=H[b+40>>2];f=Rj(c,H[b+44>>2],I[b+84|0]?a:H[H[b+68>>2]+(a<<2)>>2],0);g=f;f=f+i|0;qa(k,f+l|0,c);he(e+16|0,k,e+12|0,e+8|0);c=d<<2;H[c+j>>2]=H[e+12>>2];H[(c|4)+j>>2]=H[e+8>>2];d=d+2|0;a=a+1|0;if((h|0)!=(a|0)){continue}break}}ca=e+48|0;return m>>>0<29|0}function Re(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=O(0),j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;k=ca-16|0;ca=k;if(H[c+28>>2]==9){d=H[a+4>>2];h=I[c+24|0];e=h<<2;f=pa(e);l=k+8|0;H[l>>2]=1065353216;i=L[a+20>>2];d=-1<<d^-1;if((d|0)>0){L[l>>2]=i/O(d|0)}o=(d|0)>0;a:{if(!o){break a}j=H[c+80>>2];if(!j){break a}if(h){p=H[H[b>>2]>>2]+H[b+48>>2]|0;t=h&254;u=h&1;b=0;while(1){m=H[a+8>>2];i=L[l>>2];d=0;n=0;if((h|0)!=1){while(1){g=d<<2;q=(b<<2)+p|0;L[g+f>>2]=O(i*O(H[q>>2]))+L[g+m>>2];g=g|4;L[g+f>>2]=O(i*O(H[q+4>>2]))+L[g+m>>2];d=d+2|0;b=b+2|0;n=n+2|0;if((t|0)!=(n|0)){continue}break}}if(u){d=d<<2;L[d+f>>2]=O(i*O(H[(b<<2)+p>>2]))+L[d+m>>2];b=b+1|0}qa(H[H[c+64>>2]>>2]+r|0,f,e);r=e+r|0;s=s+1|0;if((s|0)!=(j|0)){continue}break}break a}b=0;if((j|0)!=1){a=j&-2;d=0;while(1){qa(H[H[c+64>>2]>>2]+b|0,f,e);b=b+e|0;qa(b+H[H[c+64>>2]>>2]|0,f,e);b=b+e|0;d=d+2|0;if((a|0)!=(d|0)){continue}break}}if(!(j&1)){break a}qa(H[H[c+64>>2]>>2]+b|0,f,e)}oa(f)}ca=k+16|0;return o|0}function Xh(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;c=H[a+12>>2];d=H[a+108>>2];e=H[d+80>>2];F[b+84|0]=0;m=b+68|0;h=H[b+68>>2];f=H[b+72>>2]-h>>2;a:{if(f>>>0<e>>>0){qb(m,e-f|0,12372);d=H[a+108>>2];e=H[d+80>>2];break a}if(e>>>0>=f>>>0){break a}H[b+72>>2]=h+(e<<2)}b=H[d+100>>2];f=H[d+96>>2];h=(b-f|0)/12|0;k=1;b:{if((b|0)==(f|0)){break b}n=h>>>0<=1?1:h;o=H[c>>2];c=0;d=f;b=0;k=0;while(1){c=(c<<2)+o|0;i=H[c>>2];if((i|0)==-1){break b}g=H[d>>2];if(g>>>0>=e>>>0){break b}l=H[H[a+112>>2]+12>>2];j=H[l+(i<<2)>>2];if(j>>>0>=e>>>0){break b}i=H[m>>2];H[i+(g<<2)>>2]=j;g=H[c+4>>2];if((g|0)==-1){break b}j=H[d+4>>2];if(j>>>0>=e>>>0){break b}g=H[(g<<2)+l>>2];if(g>>>0>=e>>>0){break b}H[i+(j<<2)>>2]=g;c=H[c+8>>2];if((c|0)==-1){break b}d=H[d+8>>2];if(d>>>0>=e>>>0){break b}c=H[(c<<2)+l>>2];if(c>>>0>=e>>>0){break b}H[i+(d<<2)>>2]=c;b=b+1|0;k=h>>>0<=b>>>0;if((b|0)==(n|0)){break b}c=N(b,3);d=f+N(b,12)|0;if((b|0)!=1431655765){continue}break}}return k|0}function Ph(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;c=H[a+12>>2];d=H[a+68>>2];e=H[d+80>>2];F[b+84|0]=0;m=b+68|0;h=H[b+68>>2];f=H[b+72>>2]-h>>2;a:{if(f>>>0<e>>>0){qb(m,e-f|0,12372);d=H[a+68>>2];e=H[d+80>>2];break a}if(e>>>0>=f>>>0){break a}H[b+72>>2]=h+(e<<2)}b=H[d+100>>2];f=H[d+96>>2];h=(b-f|0)/12|0;k=1;b:{if((b|0)==(f|0)){break b}n=h>>>0<=1?1:h;o=H[c>>2];c=0;d=f;b=0;k=0;while(1){c=(c<<2)+o|0;i=H[c>>2];if((i|0)==-1){break b}g=H[d>>2];if(g>>>0>=e>>>0){break b}l=H[H[a+72>>2]+12>>2];j=H[l+(i<<2)>>2];if(j>>>0>=e>>>0){break b}i=H[m>>2];H[i+(g<<2)>>2]=j;g=H[c+4>>2];if((g|0)==-1){break b}j=H[d+4>>2];if(j>>>0>=e>>>0){break b}g=H[(g<<2)+l>>2];if(g>>>0>=e>>>0){break b}H[i+(j<<2)>>2]=g;c=H[c+8>>2];if((c|0)==-1){break b}d=H[d+8>>2];if(d>>>0>=e>>>0){break b}c=H[(c<<2)+l>>2];if(c>>>0>=e>>>0){break b}H[i+(d<<2)>>2]=c;b=b+1|0;k=h>>>0<=b>>>0;if((b|0)==(n|0)){break b}c=N(b,3);d=f+N(b,12)|0;if((b|0)!=1431655765){continue}break}}return k|0}function Wa(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0;d=ca-16|0;ca=d;a:{f=H[a+4>>2];b:{if(f>>>0<b>>>0){e=b-f|0;c=H[a+8>>2];g=c<<5;c:{if(!(e>>>0>g>>>0|f>>>0>g-e>>>0)){H[a+4>>2]=b;h=f&31;b=H[a>>2]+(f>>>3&536870908)|0;break c}H[d+8>>2]=0;H[d>>2]=0;H[d+4>>2]=0;if((b|0)<0){break a}if(g>>>0<=1073741822){c=c<<6;b=b+31&-32;b=b>>>0<c>>>0?c:b}else{b=2147483647}pb(d,b);f=H[a+4>>2];H[d+4>>2]=f+e;i=H[a>>2];b=H[d>>2];d:{if((f|0)<=0){break d}c=f>>>5|0;if(f>>>0>=32){va(b,i,c<<2)}g=c<<2;b=g+b|0;h=f&31;if(h){c=-1>>>32-h|0;H[b>>2]=H[b>>2]&(c^-1)|H[i+g>>2]&c}i=H[a>>2]}H[a>>2]=H[d>>2];H[d>>2]=i;c=H[a+4>>2];H[a+4>>2]=H[d+4>>2];H[d+4>>2]=c;c=H[a+8>>2];H[a+8>>2]=H[d+8>>2];H[d+8>>2]=c;if(!i){break c}oa(i)}if(!e){break b}if(h){c=32-h|0;a=c>>>0<e>>>0?c:e;H[b>>2]=H[b>>2]&(-1<<h&-1>>>c-a^-1);e=e-a|0;b=b+4|0}a=e>>>5|0;if(e>>>0>=32){ra(b,0,a<<2)}if((e&-32)==(e|0)){break b}a=(a<<2)+b|0;H[a>>2]=H[a>>2]&(-1>>>32-(e&31)^-1);break b}H[a+4>>2]=b}ca=d+16|0;return}sa();v()}function Je(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0;e=H[a+12>>2];i=H[a+8>>2];d=e-i>>2;b=I[b+24|0];a:{if(d>>>0<b>>>0){ya(a+8|0,b-d|0);i=H[a+8>>2];e=H[a+12>>2];break a}if(b>>>0>=d>>>0){break a}e=(b<<2)+i|0;H[a+12>>2]=e}b=0;f=H[c+8>>2];h=H[c+12>>2];j=H[c+20>>2];e=e-i|0;d=H[c+16>>2];g=e+d|0;j=e>>>0>g>>>0?j+1|0:j;b:{if(f>>>0<g>>>0&(h|0)<=(j|0)|(h|0)<(j|0)){break b}qa(i,d+H[c>>2]|0,e);d=H[c+20>>2];g=e;e=e+H[c+16>>2]|0;d=g>>>0>e>>>0?d+1|0:d;H[c+16>>2]=e;H[c+20>>2]=d;f=H[c+8>>2];h=H[c+12>>2];g=e+4|0;d=g>>>0<4?d+1|0:d;if(f>>>0<g>>>0&(d|0)>=(h|0)|(d|0)>(h|0)){break b}d=e+H[c>>2]|0;H[a+20>>2]=I[d|0]|I[d+1|0]<<8|(I[d+2|0]<<16|I[d+3|0]<<24);d=H[c+20>>2];g=d;f=d;e=H[c+16>>2];d=e+4|0;f=d>>>0<4?f+1|0:f;H[c+16>>2]=d;H[c+20>>2]=f;h=H[c+12>>2];if((f|0)>=(h|0)&d>>>0>=K[c+8>>2]|(f|0)>(h|0)){break b}f=I[d+H[c>>2]|0];d=g;e=e+5|0;d=e>>>0<5?d+1|0:d;H[c+16>>2]=e;H[c+20>>2]=d;if(f-1>>>0>29){break b}H[a+4>>2]=f;b=1}return b|0}function qd(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;a:{f=H[a+4>>2];b:{if((f|0)!=H[a>>2]){c=f;break b}g=H[a+8>>2];c=H[a+12>>2];if(g>>>0<c>>>0){e=((c-g>>2)+1|0)/2<<2;c=e+g|0;if((f|0)!=(g|0)){d=g-f|0;c=c-d|0;va(c,f,d);f=H[a+8>>2]}H[a+4>>2]=c;H[a+8>>2]=e+f;break b}d=(c|0)==(f|0)?1:c-f>>1;if(d>>>0>=1073741824){break a}c=d<<2;i=pa(c);k=i+c|0;c=(d+3&-4)+i|0;h=c;c:{if((f|0)==(g|0)){break c}g=g-f|0;l=g&-4;e=c;d=f;j=g-4|0;g=(j>>>2|0)+1&7;if(g){h=0;while(1){H[e>>2]=H[d>>2];d=d+4|0;e=e+4|0;h=h+1|0;if((g|0)!=(h|0)){continue}break}}h=c+l|0;if(j>>>0<28){break c}while(1){H[e>>2]=H[d>>2];H[e+4>>2]=H[d+4>>2];H[e+8>>2]=H[d+8>>2];H[e+12>>2]=H[d+12>>2];H[e+16>>2]=H[d+16>>2];H[e+20>>2]=H[d+20>>2];H[e+24>>2]=H[d+24>>2];H[e+28>>2]=H[d+28>>2];d=d+32|0;e=e+32|0;if((h|0)!=(e|0)){continue}break}}H[a+12>>2]=k;H[a+8>>2]=h;H[a+4>>2]=c;H[a>>2]=i;if(!f){break b}oa(f);c=H[a+4>>2]}H[c-4>>2]=H[b>>2];H[a+4>>2]=H[a+4>>2]-4;return}wa();v()}function sb(a,b){var c=0;a:{if(!ta(a,b)){break a}if(!ta(a+16|0,b)){break a}if(!ta(a+32|0,b)){break a}if(!ta(a+48|0,b)){break a}if(!ta(a- -64|0,b)){break a}if(!ta(a+80|0,b)){break a}if(!ta(a+96|0,b)){break a}if(!ta(a+112|0,b)){break a}if(!ta(a+128|0,b)){break a}if(!ta(a+144|0,b)){break a}if(!ta(a+160|0,b)){break a}if(!ta(a+176|0,b)){break a}if(!ta(a+192|0,b)){break a}if(!ta(a+208|0,b)){break a}if(!ta(a+224|0,b)){break a}if(!ta(a+240|0,b)){break a}if(!ta(a+256|0,b)){break a}if(!ta(a+272|0,b)){break a}if(!ta(a+288|0,b)){break a}if(!ta(a+304|0,b)){break a}if(!ta(a+320|0,b)){break a}if(!ta(a+336|0,b)){break a}if(!ta(a+352|0,b)){break a}if(!ta(a+368|0,b)){break a}if(!ta(a+384|0,b)){break a}if(!ta(a+400|0,b)){break a}if(!ta(a+416|0,b)){break a}if(!ta(a+432|0,b)){break a}if(!ta(a+448|0,b)){break a}if(!ta(a+464|0,b)){break a}if(!ta(a+480|0,b)){break a}if(!ta(a+496|0,b)){break a}c=ta(a+512|0,b)}return c}function qf(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;a:{if(!ke(a,b)){break a}h=a+36|0;g=ea[H[H[a>>2]+24>>2]](a)|0;e=H[a+40>>2];d=H[a+36>>2];c=e-d>>2;b:{if(g>>>0>c>>>0){Vb(h,g-c|0);break b}if(c>>>0<=g>>>0){break b}d=d+(g<<2)|0;if((d|0)!=(e|0)){while(1){e=e-4|0;c=H[e>>2];H[e>>2]=0;if(c){ea[H[H[c>>2]+4>>2]](c)}if((d|0)!=(e|0)){continue}break}}H[a+40>>2]=d}c=1;if((g|0)<=0){break a}e=0;while(1){c:{c=H[b+20>>2];f=H[b+12>>2];d=H[b+16>>2];if((c|0)>=(f|0)&d>>>0>=K[b+8>>2]|(c|0)>(f|0)){break c}f=I[H[b>>2]+d|0];d=d+1|0;c=d?c:c+1|0;H[b+16>>2]=d;H[b+20>>2]=c;d=ea[H[H[a>>2]+48>>2]](a,f)|0;f=e<<2;i=f+H[a+36>>2]|0;c=H[i>>2];H[i>>2]=d;if(c){ea[H[H[c>>2]+4>>2]](c)}c=H[H[h>>2]+f>>2];if(!c){break c}if(!(k=c,l=ea[H[H[a>>2]+28>>2]](a)|0,m=ea[H[H[a>>2]+20>>2]](a,e)|0,j=H[H[c>>2]+8>>2],ea[j](k|0,l|0,m|0)|0)){break c}c=1;e=e+1|0;if((g|0)!=(e|0)){continue}break a}break}c=0}return c|0}function he(a,b,c,d){var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;j=+L[b>>2];k=+L[b+4>>2];l=+L[b+8>>2];g=P(j)+P(k)+P(l);a:{if(!(g>1e-6)){j=1;k=0;e=0;break a}g=1/g;k=g*k;j=g*j;e=g*l<0}h=H[a+16>>2];l=+(h|0);g=T(j*l+.5);b:{if(P(g)<2147483648){m=~~g;break b}m=-2147483648}f=m>>31;i=(f^m)-f|0;g=T(k*l+.5);c:{if(P(g)<2147483648){f=~~g;break c}f=-2147483648}b=f>>31;b=h-(i+((f^b)-b|0)|0)|0;i=(b|0)>0?b:0;e=e?0-i|0:i;f=f+(b>>31&((f|0)>0?b:0-b|0))|0;d:{if((m|0)>=0){b=e+h|0;a=H[a+8>>2];e=h+f|0;break d}b=f>>31;b=(b^f)-b|0;a=H[a+8>>2];b=(e|0)<0?b:a-b|0;e=(f|0)<0?i:a-i|0}e:{if(!(b|e)){b=a;break e}if(!((a|0)!=(b|0)|e)){b=a;break e}if(!((a|0)!=(e|0)|b)){b=a;break e}if(!((b|0)<=(h|0)|e)){b=(h<<1)-b|0;a=0;break e}if(!((a|0)!=(e|0)|(b|0)>=(h|0))){b=(h<<1)-b|0;break e}if(!((a|0)!=(b|0)|(e|0)>=(h|0))){b=a;a=(h<<1)-e|0;break e}if(b){a=e;break e}b=0;if((e|0)<=(h|0)){a=e;break e}a=(h<<1)-e|0}H[c>>2]=a;H[d>>2]=b}function Ve(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;g=H[b+8>>2];h=H[b+12>>2];c=H[b+20>>2];i=c;k=H[b+16>>2];d=k+4|0;c=d>>>0<4?c+1|0:c;a:{if(d>>>0>g>>>0&(c|0)>=(h|0)|(c|0)>(h|0)){break a}l=H[b>>2];f=k+l|0;e=I[f|0]|I[f+1|0]<<8|(I[f+2|0]<<16|I[f+3|0]<<24);H[b+16>>2]=d;H[b+20>>2]=c;c=i;f=k+8|0;c=f>>>0<8?c+1|0:c;if(f>>>0>g>>>0&(c|0)>=(h|0)|(c|0)>(h|0)){break a}d=d+l|0;j=I[d|0]|I[d+1|0]<<8|(I[d+2|0]<<16|I[d+3|0]<<24);H[b+16>>2]=f;H[b+20>>2]=c;if((e|0)>(j|0)){break a}H[a+16>>2]=j;H[a+12>>2]=e;d=j-e|0;e=(j>>31)-((e>>31)+(e>>>0>j>>>0)|0)|0;if(!e&d>>>0>2147483646|e){break a}d=d+1|0;H[a+20>>2]=d;e=d>>>1|0;H[a+24>>2]=e;H[a+28>>2]=0-e;if(!(d&1)){H[a+24>>2]=e-1}if(J[b+38>>1]<=513){if((c|0)>=(h|0)&f>>>0>=g>>>0|(c|0)>(h|0)){break a}g=I[f+l|0];c=i;i=k+9|0;c=i>>>0<9?c+1|0:c;H[b+16>>2]=i;H[b+20>>2]=c;if(g>>>0>1){break a}H[a+88>>2]=g}m=ta(a+112|0,b)}return m|0}function Hc(a,b){var c=0,d=0,e=0,f=0,g=0,h=0;g=H[a>>2];c=g+(b>>>3&536870908)|0;H[c>>2]=H[c>>2]|1<<b;f=H[a+64>>2];e=(b|0)==-1;d=-1;a:{if(e){break a}c=b+1|0;c=(c>>>0)%3|0?c:b-2|0;d=-1;if((c|0)==-1){break a}d=H[H[f>>2]+(c<<2)>>2]}c=H[a+12>>2];h=(d>>>3&536870908)+c|0;H[h>>2]=H[h>>2]|1<<d;b:{c:{if(!e){d:{e:{if((b>>>0)%3|0){e=b-1|0;break e}e=b+2|0;d=-1;if((e|0)==-1){break d}}d=H[H[f>>2]+(e<<2)>>2]}e=(d>>>3&536870908)+c|0;H[e>>2]=H[e>>2]|1<<d;d=-1;b=H[H[f+12>>2]+(b<<2)>>2];if((b|0)==-1){break b}F[a+24|0]=0;a=(b>>>3&536870908)+g|0;H[a>>2]=H[a>>2]|1<<b;a=b+1|0;a=(a>>>0)%3|0?a:b-2|0;if((a|0)!=-1){d=H[H[f>>2]+(a<<2)>>2]}a=c+(d>>>3&536870908)|0;H[a>>2]=H[a>>2]|1<<d;f:{g:{if((b>>>0)%3|0){b=b-1|0;break g}b=b+2|0;a=-1;if((b|0)==-1){break f}}a=H[H[f>>2]+(b<<2)>>2]}b=1<<a;a=c+(a>>>3&536870908)|0;c=H[a>>2];break c}a=c+536870908|0;b=H[c+536870908>>2];c=-2147483648}H[a>>2]=b|c}}function Fd(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=O(0),f=O(0),g=O(0),h=O(0),i=O(0),j=0,k=O(0),l=O(0),m=O(0),n=O(0),o=0;a:{if(H[c+28>>2]!=9|I[c+24|0]!=3){break a}a=H[a+4>>2];if(a-2>>>0>28){break a}o=1;j=H[c+80>>2];if(!j){break a}k=O(O(2)/O((1<<a)-2|0));c=H[H[c>>2]>>2]+H[c+48>>2]|0;a=H[H[b>>2]>>2]+H[b+48>>2]|0;b=0;while(1){g=O(0);l=O(0);m=O(0);e=O(O(O(H[a>>2])*k)+O(-1));f=O(O(O(H[a+4>>2])*k)+O(-1));i=O(O(O(1)-O(P(e)))-O(P(f)));h=O(S(O(-i),O(0)));n=O(-h);f=O(f+(f<O(0)?h:n));e=O(e+(e<O(0)?h:n));h=O(O(f*f)+O(O(i*i)+O(e*e)));if(!(+h<1e-6)){g=O(O(1)/O(W(h)));m=O(f*g);l=O(e*g);g=O(i*g)}a=a+8|0;d=(w(m),y(2));F[c+8|0]=d;F[c+9|0]=d>>>8;F[c+10|0]=d>>>16;F[c+11|0]=d>>>24;d=(w(l),y(2));F[c+4|0]=d;F[c+5|0]=d>>>8;F[c+6|0]=d>>>16;F[c+7|0]=d>>>24;d=(w(g),y(2));F[c|0]=d;F[c+1|0]=d>>>8;F[c+2|0]=d>>>16;F[c+3|0]=d>>>24;c=c+12|0;b=b+1|0;if((j|0)!=(b|0)){continue}break}}return o|0}function Vd(a,b,c){var d=0,e=0,f=0,g=0,h=0,i=0,j=0;a:{if(b>>>0<=63){b=0;a=H[a+12>>2];if(a>>>0<2){break a}b=a-1|0;e=b&3;d=H[c>>2];c=0;b:{if(a-2>>>0<3){a=1;b=0;break b}f=b&-4;b=0;a=1;while(1){g=a+3|0;h=a+2|0;i=a+1|0;b=K[d+(b<<2)>>2]>K[d+(a<<2)>>2]?a:b;b=K[d+(b<<2)>>2]>K[d+(i<<2)>>2]?i:b;b=K[d+(b<<2)>>2]>K[d+(h<<2)>>2]?h:b;b=K[d+(b<<2)>>2]>K[d+(g<<2)>>2]?g:b;a=a+4|0;j=j+4|0;if((f|0)!=(j|0)){continue}break}}if(!e){break a}while(1){b=K[d+(b<<2)>>2]>K[d+(a<<2)>>2]?a:b;a=a+1|0;c=c+1|0;if((e|0)!=(c|0)){continue}break}break a}b=H[a+580>>2];d=32-b|0;if((d|0)>=4){c=H[a+576>>2];if((c|0)==H[a+568>>2]){return 0}d=H[c>>2];e=b+4|0;H[a+580>>2]=e;b=d<<b>>>28|0;if((e|0)!=32){break a}H[a+580>>2]=0;H[a+576>>2]=c+4;return b}c=H[a+576>>2];e=c+4|0;if((e|0)==H[a+568>>2]){return 0}f=H[c>>2];H[a+576>>2]=e;H[a+580>>2]=b-28;a=60-b|0;b=H[c+4>>2]>>>a|f<<b>>>a-d}return b}function Ae(a){a=a|0;var b=0,c=0,d=0,e=0;H[a>>2]=11436;b=H[a+388>>2];if(b){H[a+392>>2]=b;oa(b)}d=H[a+368>>2];H[a+368>>2]=0;if(d){e=d-4|0;b=H[e>>2];if(b){c=(b<<4)+d|0;while(1){c=c-16|0;if((d|0)!=(c|0)){continue}break}}oa(e)}Yc(a+216|0);b=H[a+196>>2];if(b){H[a+200>>2]=b;oa(b)}b=H[a+184>>2];if(b){H[a+188>>2]=b;oa(b)}b=H[a+172>>2];if(b){H[a+176>>2]=b;oa(b)}b=H[a+160>>2];if(b){H[a+164>>2]=b;oa(b)}c=H[a+144>>2];if(c){while(1){b=H[c>>2];oa(c);c=b;if(b){continue}break}}b=H[a+136>>2];H[a+136>>2]=0;if(b){oa(b)}b=H[a+120>>2];if(b){oa(b)}b=H[a+108>>2];if(b){oa(b)}b=H[a+96>>2];if(b){oa(b)}b=H[a+72>>2];if(b){H[a+76>>2]=b;oa(b)}b=H[a+60>>2];if(b){oa(b)}b=H[a+48>>2];if(b){H[a+52>>2]=b;oa(b)}b=H[a+36>>2];if(b){H[a+40>>2]=b;oa(b)}b=H[a+24>>2];if(b){H[a+28>>2]=b;oa(b)}b=H[a+12>>2];if(b){H[a+16>>2]=b;oa(b)}b=H[a+8>>2];H[a+8>>2]=0;if(b){cb(b)}return a|0}function Sg(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0;a:{a=ca-32|0;ca=a;e=Ma(c);if(e>>>0<2147483632){b:{c:{if(e>>>0>=11){g=(e|15)+1|0;f=pa(g);H[a+24>>2]=g|-2147483648;H[a+16>>2]=f;H[a+20>>2]=e;g=e+f|0;break c}F[a+27|0]=e;f=a+16|0;g=e+f|0;if(!e){break b}}qa(f,c,e)}F[g|0]=0;H[a+8>>2]=0;H[a>>2]=0;H[a+4>>2]=0;d:{c=nb(b,a+16|0);if((c|0)==(b+4|0)){break d}b=H[c+28>>2];e=H[c+32>>2];if((b|0)==(e|0)){break d}b=e-b|0;if(b&3){break d}e=b>>>2|0;f=H[a+4>>2];b=H[a>>2];g=f-b>>2;e:{if(e>>>0>g>>>0){ya(a,e-g|0);b=H[a>>2];f=H[a+4>>2];break e}if(e>>>0>=g>>>0){break e}f=(e<<2)+b|0;H[a+4>>2]=f}if((b|0)!=(f|0)){e=b;b=H[c+28>>2];qa(e,b,H[c+32>>2]-b|0);break d}Ca();v()}b=H[d>>2];if(b){H[d+4>>2]=b;oa(b)}H[d>>2]=H[a>>2];H[d+4>>2]=H[a+4>>2];H[d+8>>2]=H[a+8>>2];if(F[a+27|0]<0){oa(H[a+16>>2])}ca=a+32|0;break a}Na();v()}}function Be(a){a=a|0;var b=0,c=0,d=0,e=0;H[a>>2]=11384;d=H[a+368>>2];H[a+368>>2]=0;if(d){e=d-4|0;b=H[e>>2];if(b){c=(b<<4)+d|0;while(1){c=c-16|0;if((d|0)!=(c|0)){continue}break}}oa(e)}Yc(a+216|0);b=H[a+196>>2];if(b){H[a+200>>2]=b;oa(b)}b=H[a+184>>2];if(b){H[a+188>>2]=b;oa(b)}b=H[a+172>>2];if(b){H[a+176>>2]=b;oa(b)}b=H[a+160>>2];if(b){H[a+164>>2]=b;oa(b)}c=H[a+144>>2];if(c){while(1){b=H[c>>2];oa(c);c=b;if(b){continue}break}}b=H[a+136>>2];H[a+136>>2]=0;if(b){oa(b)}b=H[a+120>>2];if(b){oa(b)}b=H[a+108>>2];if(b){oa(b)}b=H[a+96>>2];if(b){oa(b)}b=H[a+72>>2];if(b){H[a+76>>2]=b;oa(b)}b=H[a+60>>2];if(b){oa(b)}b=H[a+48>>2];if(b){H[a+52>>2]=b;oa(b)}b=H[a+36>>2];if(b){H[a+40>>2]=b;oa(b)}b=H[a+24>>2];if(b){H[a+28>>2]=b;oa(b)}b=H[a+12>>2];if(b){H[a+16>>2]=b;oa(b)}b=H[a+8>>2];H[a+8>>2]=0;if(b){cb(b)}return a|0}function Ug(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0;d=ca-16|0;ca=d;a:{e=Ma(c);if(e>>>0<2147483632){b:{c:{if(e>>>0>=11){f=(e|15)+1|0;a=pa(f);H[d+8>>2]=f|-2147483648;H[d>>2]=a;H[d+4>>2]=e;f=a+e|0;break c}F[d+11|0]=e;f=d+e|0;a=d;if(!e){break b}}qa(a,c,e)}F[f|0]=0;c=I[d+11|0];e=c<<24>>24;b=H[b+4>>2];a=0;d:{if(!b){break d}a=c;c=(e|0)<0;a=c?H[d+4>>2]:a;f=c?H[d>>2]:d;while(1){c=I[b+27|0];g=c<<24>>24<0;c=g?H[b+20>>2]:c;i=c>>>0<a>>>0;e:{f:{g:{h:{i:{j:{h=i?c:a;if(h){g=g?H[b+16>>2]:b+16|0;j=Fa(f,g,h);if(j){break j}if(a>>>0>=c>>>0){break i}break e}if(a>>>0>=c>>>0){break h}break e}if((j|0)<0){break e}}c=Fa(g,f,h);if(c){break g}}if(i){break f}a=1;break d}if((c|0)<0){break f}a=1;break d}b=b+4|0}b=H[b>>2];if(b){continue}break}a=0}if((e|0)<0){oa(H[d>>2])}ca=d+16|0;break a}Na();v()}return a|0}function fd(a,b){var c=0,d=0;c=H[b+8>>2];H[a+4>>2]=H[b+4>>2];H[a+8>>2]=c;H[a+20>>2]=H[b+20>>2];c=H[b+16>>2];H[a+12>>2]=H[b+12>>2];H[a+16>>2]=c;a:{b:{if((a|0)!=(b|0)){c=H[b+28>>2];if(c){d=H[a+24>>2];if(H[a+32>>2]<<5>>>0<c>>>0){if(d){oa(d);H[a+32>>2]=0;H[a+24>>2]=0;H[a+28>>2]=0;c=H[b+28>>2]}if((c|0)<0){break b}c=(c-1>>>5|0)+1|0;d=pa(c<<2);H[a+32>>2]=c;H[a+28>>2]=0;H[a+24>>2]=d;c=H[b+28>>2]}va(d,H[b+24>>2],(c-1>>>3&536870908)+4|0);c=H[b+28>>2]}else{c=0}H[a+28>>2]=c;c=H[b+40>>2];if(c){d=H[a+36>>2];if(H[a+44>>2]<<5>>>0<c>>>0){if(d){oa(d);H[a+44>>2]=0;H[a+36>>2]=0;H[a+40>>2]=0;c=H[b+40>>2]}if((c|0)<0){break a}c=(c-1>>>5|0)+1|0;d=pa(c<<2);H[a+44>>2]=c;H[a+40>>2]=0;H[a+36>>2]=d;c=H[b+40>>2]}va(d,H[b+36>>2],(c-1>>>3&536870908)+4|0);b=H[b+40>>2]}else{b=0}H[a+40>>2]=b}return}sa();v()}sa();v()}function uc(a){var b=0,c=0,d=0;b=H[a+8>>2];d=H[a>>2];a:{if(I[a+12|0]){b:{c:{d:{e:{if((b|0)==-1){break e}c=b+1|0;b=(c>>>0)%3|0?c:b-2|0;if((b|0)==-1){break e}b=H[H[d+12>>2]+(b<<2)>>2];if((b|0)!=-1){break d}}H[a+8>>2]=-1;break c}c=b+1|0;b=(c>>>0)%3|0?c:b-2|0;H[a+8>>2]=b;if((b|0)!=-1){break b}}c=H[a+4>>2];b=-1;f:{if((c|0)==-1){break f}g:{if((c>>>0)%3|0){c=c-1|0;break g}c=c+2|0;b=-1;if((c|0)==-1){break f}}c=H[H[d+12>>2]+(c<<2)>>2];b=-1;if((c|0)==-1){break f}b=c-1|0;if((c>>>0)%3|0){break f}b=c+2|0}F[a+12|0]=0;H[a+8>>2]=b;return}if((b|0)!=H[a+4>>2]){break a}H[a+8>>2]=-1;return}c=-1;h:{if((b|0)==-1){break h}i:{if((b>>>0)%3|0){b=b-1|0;break i}b=b+2|0;c=-1;if((b|0)==-1){break h}}b=H[H[d+12>>2]+(b<<2)>>2];c=-1;if((b|0)==-1){break h}c=b-1|0;if((b>>>0)%3|0){break h}c=b+2|0}H[a+8>>2]=c}}function Rf(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0;f=ca-32|0;ca=f;d=H[a+28>>2];H[f+16>>2]=d;g=H[a+20>>2];H[f+28>>2]=c;H[f+24>>2]=b;b=g-d|0;H[f+20>>2]=b;g=b+c|0;i=2;a:{b:{b=f+16|0;d=Z(H[a+60>>2],b|0,2,f+12|0)|0;if(d){H[3992]=d;d=-1}else{d=0}c:{d:{if(d){d=b;break d}while(1){e=H[f+12>>2];if((e|0)==(g|0)){break c}if((e|0)<0){d=b;break b}h=H[b+4>>2];j=h>>>0<e>>>0;d=(j<<3)+b|0;h=e-(j?h:0)|0;H[d>>2]=h+H[d>>2];b=(j?12:4)+b|0;H[b>>2]=H[b>>2]-h;g=g-e|0;b=d;i=i-j|0;e=Z(H[a+60>>2],b|0,i|0,f+12|0)|0;if(e){H[3992]=e;e=-1}else{e=0}if(!e){continue}break}}if((g|0)!=-1){break b}}b=H[a+44>>2];H[a+28>>2]=b;H[a+20>>2]=b;H[a+16>>2]=b+H[a+48>>2];a=c;break a}H[a+28>>2]=0;H[a+16>>2]=0;H[a+20>>2]=0;H[a>>2]=H[a>>2]|32;a=0;if((i|0)==2){break a}a=c-H[d+4>>2]|0}ca=f+32|0;return a|0}function Ih(a){a=a|0;var b=0,c=0,d=0,e=0,f=0,g=0;e=H[a+4>>2];d=H[e>>2];a:{b=H[a+12>>2];c=H[b+56>>2]-H[b+52>>2]|0;f=c>>2;b:{if(f>>>0<=H[e+8>>2]-d>>2>>>0){break b}if((c|0)<0){break a}b=H[e+4>>2];c=pa(c);f=c+(f<<2)|0;g=c+(b-d&-4)|0;c=g;if((b|0)!=(d|0)){while(1){c=c-4|0;b=b-4|0;H[c>>2]=H[b>>2];if((b|0)!=(d|0)){continue}break}}H[e+8>>2]=f;H[e+4>>2]=g;H[e>>2]=c;if(!d){break b}oa(d)}e=a+8|0;b=H[a+76>>2];c:{if(b){d=H[b>>2];if((d|0)==H[b+4>>2]){return 1}b=0;while(1){c=we(e,H[(b<<2)+d>>2]);if(!c){break c}f=H[a+76>>2];d=H[f>>2];b=b+1|0;if(b>>>0<H[f+4>>2]-d>>2>>>0){continue}break}break c}c=1;a=H[H[a+12>>2]+64>>2];a=H[a+4>>2]-H[a>>2]|0;if(a>>>0<12){break c}a=(a>>2>>>0)/3|0;b=0;while(1){c=we(e,N(b,3));if(!c){break c}b=b+1|0;if((a|0)!=(b|0)){continue}break}}return c|0}sa();v()}function Oh(a){a=a|0;var b=0,c=0,d=0,e=0,f=0,g=0;e=H[a+4>>2];d=H[e>>2];a:{b=H[a+12>>2];c=H[b+28>>2]-H[b+24>>2]|0;f=c>>2;b:{if(f>>>0<=H[e+8>>2]-d>>2>>>0){break b}if((c|0)<0){break a}b=H[e+4>>2];c=pa(c);f=c+(f<<2)|0;g=c+(b-d&-4)|0;c=g;if((b|0)!=(d|0)){while(1){c=c-4|0;b=b-4|0;H[c>>2]=H[b>>2];if((b|0)!=(d|0)){continue}break}}H[e+8>>2]=f;H[e+4>>2]=g;H[e>>2]=c;if(!d){break b}oa(d)}e=a+8|0;b=H[a+76>>2];c:{if(b){d=H[b>>2];if((d|0)==H[b+4>>2]){return 1}b=0;while(1){c=xe(e,H[(b<<2)+d>>2]);if(!c){break c}f=H[a+76>>2];d=H[f>>2];b=b+1|0;if(b>>>0<H[f+4>>2]-d>>2>>>0){continue}break}break c}c=1;a=H[a+12>>2];a=H[a+4>>2]-H[a>>2]|0;if(a>>>0<12){break c}a=(a>>2>>>0)/3|0;b=0;while(1){c=xe(e,N(b,3));if(!c){break c}b=b+1|0;if((a|0)!=(b|0)){continue}break}}return c|0}sa();v()}function Te(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;g=H[b+8>>2];h=H[b+12>>2];c=H[b+20>>2];i=c;e=H[b+16>>2];d=e+4|0;c=d>>>0<4?c+1|0:c;a:{if(d>>>0>g>>>0&(c|0)>=(h|0)|(c|0)>(h|0)){break a}j=H[b>>2];f=e+j|0;f=I[f|0]|I[f+1|0]<<8|(I[f+2|0]<<16|I[f+3|0]<<24);H[b+16>>2]=d;H[b+20>>2]=c;k=J[b+38>>1];if(k>>>0<=513){c=i;d=e+8|0;c=d>>>0<8?c+1|0:c;if(d>>>0>g>>>0&(c|0)>=(h|0)|(c|0)>(h|0)){break a}H[b+16>>2]=d;H[b+20>>2]=c}if(!(f&1)){break a}e=Q(f)^31;if(e-1>>>0>28){break a}H[a+8>>2]=e+1;i=-2<<e;e=i^-2;H[a+16>>2]=e;H[a+12>>2]=i^-1;H[a+24>>2]=e>>1;L[a+20>>2]=O(2)/O(e|0);if(k>>>0<=513){if((c|0)>=(h|0)&d>>>0>=g>>>0|(c|0)>(h|0)){break a}g=I[d+j|0];d=d+1|0;c=d?c:c+1|0;H[b+16>>2]=d;H[b+20>>2]=c;if(g>>>0>1){break a}H[a+72>>2]=g}l=ta(a+96|0,b)}return l|0}function Se(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;f=H[b+8>>2];g=H[b+12>>2];c=H[b+20>>2];h=c;i=H[b+16>>2];e=i+4|0;c=e>>>0<4?c+1|0:c;a:{if(e>>>0>f>>>0&(c|0)>=(g|0)|(c|0)>(g|0)){break a}j=H[b>>2];d=i+j|0;d=I[d|0]|I[d+1|0]<<8|(I[d+2|0]<<16|I[d+3|0]<<24);H[b+16>>2]=e;H[b+20>>2]=c;c=h;e=i+8|0;c=e>>>0<8?c+1|0:c;if(e>>>0>f>>>0&(c|0)>=(g|0)|(c|0)>(g|0)){break a}H[b+16>>2]=e;H[b+20>>2]=c;if(!(d&1)){break a}d=Q(d)^31;if(d-1>>>0>28){break a}H[a+8>>2]=d+1;k=-2<<d;d=k^-2;H[a+16>>2]=d;H[a+12>>2]=k^-1;H[a+24>>2]=d>>1;L[a+20>>2]=O(2)/O(d|0);if(J[b+38>>1]<=513){if((c|0)>=(g|0)&e>>>0>=f>>>0|(c|0)>(g|0)){break a}c=I[e+j|0];f=i+9|0;h=f>>>0<9?h+1|0:h;H[b+16>>2]=f;H[b+20>>2]=h;if(c>>>0>1){break a}H[a+72>>2]=c}l=ta(a+96|0,b)}return l|0}\nfunction va(a,b,c){var d=0,e=0;a:{if((a|0)==(b|0)){break a}e=a+c|0;if(b-e>>>0<=0-(c<<1)>>>0){return qa(a,b,c)}d=(a^b)&3;b:{c:{if(a>>>0<b>>>0){if(d){d=a;break b}if(!(a&3)){d=a;break c}d=a;while(1){if(!c){break a}F[d|0]=I[b|0];b=b+1|0;c=c-1|0;d=d+1|0;if(d&3){continue}break}break c}d:{if(d){break d}if(e&3){while(1){if(!c){break a}c=c-1|0;d=c+a|0;F[d|0]=I[b+c|0];if(d&3){continue}break}}if(c>>>0<=3){break d}while(1){c=c-4|0;H[c+a>>2]=H[b+c>>2];if(c>>>0>3){continue}break}}if(!c){break a}while(1){c=c-1|0;F[c+a|0]=I[b+c|0];if(c){continue}break}break a}if(c>>>0<=3){break b}while(1){H[d>>2]=H[b>>2];b=b+4|0;d=d+4|0;c=c-4|0;if(c>>>0>3){continue}break}}if(!c){break a}while(1){F[d|0]=I[b|0];d=d+1|0;b=b+1|0;c=c-1|0;if(c){continue}break}}return a}function ff(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;h=H[c+12>>2];f=h;e=H[c+20>>2];i=H[c+8>>2];g=H[c+16>>2];a:{if((f|0)<=(e|0)&i>>>0<=g>>>0|(e|0)>(f|0)){break a}j=H[c>>2];k=F[j+g|0];d=e;f=g+1|0;d=f?d:d+1|0;H[c+16>>2]=f;H[c+20>>2]=d;b:{if((k|0)==-2){break b}if((d|0)>=(h|0)&f>>>0>=i>>>0|(d|0)>(h|0)){break a}d=F[f+j|0];g=g+2|0;e=g>>>0<2?e+1|0:e;H[c+16>>2]=g;H[c+20>>2]=e;if((d-4&255)>>>0<251){break a}e=ea[H[H[a>>2]+40>>2]](a,k,d)|0;d=H[a+20>>2];H[a+20>>2]=e;if(!d){break b}ea[H[H[d>>2]+4>>2]](d)}d=H[a+20>>2];if(d){if(!(ea[H[H[a>>2]+28>>2]](a,d)|0)){break a}}if(!(ea[H[H[a>>2]+36>>2]](a,b,c)|0)){break a}c=H[a+4>>2];if(!(!c|I[c+36|0]>1)){if(!(ea[H[H[a>>2]+48>>2]](a,H[b+4>>2]-H[b>>2]>>2)|0)){break a}}l=1}return l|0}function Vb(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0;d=H[a+8>>2];c=H[a+4>>2];if(d-c>>2>>>0>=b>>>0){if(b){b=b<<2;c=ra(c,0,b)+b|0}H[a+4>>2]=c;return}a:{b:{c:{g=H[a>>2];f=c-g>>2;e=f+b|0;if(e>>>0<1073741824){d=d-g|0;h=d>>>1|0;e=d>>>0>=2147483644?1073741823:e>>>0<h>>>0?h:e;if(e){if(e>>>0>=1073741824){break c}i=pa(e<<2)}d=(f<<2)+i|0;f=b<<2;b=ra(d,0,f);f=b+f|0;e=(e<<2)+i|0;if((c|0)==(g|0)){break b}while(1){c=c-4|0;b=H[c>>2];H[c>>2]=0;d=d-4|0;H[d>>2]=b;if((c|0)!=(g|0)){continue}break}H[a+8>>2]=e;b=H[a+4>>2];H[a+4>>2]=f;c=H[a>>2];H[a>>2]=d;if((b|0)==(c|0)){break a}while(1){b=b-4|0;a=H[b>>2];H[b>>2]=0;if(a){ea[H[H[a>>2]+4>>2]](a)}if((b|0)!=(c|0)){continue}break}break a}sa();v()}wa();v()}H[a+8>>2]=e;H[a+4>>2]=f;H[a>>2]=b}if(c){oa(c)}}function Md(a,b,c){a:{switch(b-9|0){case 0:b=H[c>>2];H[c>>2]=b+4;H[a>>2]=H[b>>2];return;case 6:b=H[c>>2];H[c>>2]=b+4;b=G[b>>1];H[a>>2]=b;H[a+4>>2]=b>>31;return;case 7:b=H[c>>2];H[c>>2]=b+4;H[a>>2]=J[b>>1];H[a+4>>2]=0;return;case 8:b=H[c>>2];H[c>>2]=b+4;b=F[b|0];H[a>>2]=b;H[a+4>>2]=b>>31;return;case 9:b=H[c>>2];H[c>>2]=b+4;H[a>>2]=I[b|0];H[a+4>>2]=0;return;case 16:b=H[c>>2]+7&-8;H[c>>2]=b+8;M[a>>3]=M[b>>3];return;case 17:v();default:return;case 1:case 4:case 14:b=H[c>>2];H[c>>2]=b+4;b=H[b>>2];H[a>>2]=b;H[a+4>>2]=b>>31;return;case 2:case 5:case 11:case 15:b=H[c>>2];H[c>>2]=b+4;H[a>>2]=H[b>>2];H[a+4>>2]=0;return;case 3:case 10:case 12:case 13:break a}}b=H[c>>2]+7&-8;H[c>>2]=b+8;c=H[b+4>>2];H[a>>2]=H[b>>2];H[a+4>>2]=c}function Ed(a,b){var c=0,d=0,e=0;c=ca+-64|0;ca=c;d=H[a>>2];e=H[d-4>>2];d=H[d-8>>2];H[c+32>>2]=0;H[c+36>>2]=0;H[c+40>>2]=0;H[c+44>>2]=0;H[c+48>>2]=0;H[c+52>>2]=0;F[c+55|0]=0;F[c+56|0]=0;F[c+57|0]=0;F[c+58|0]=0;F[c+59|0]=0;F[c+60|0]=0;F[c+61|0]=0;F[c+62|0]=0;H[c+24>>2]=0;H[c+28>>2]=0;H[c+20>>2]=0;H[c+16>>2]=14924;H[c+12>>2]=a;H[c+8>>2]=b;a=a+d|0;d=0;a:{if(Ya(e,b,0)){H[c+56>>2]=1;ea[H[H[e>>2]+20>>2]](e,c+8|0,a,a,1,0);d=H[c+32>>2]==1?a:0;break a}ea[H[H[e>>2]+24>>2]](e,c+8|0,a,1,0);b:{switch(H[c+44>>2]){case 0:d=H[c+48>>2]==1?H[c+36>>2]==1?H[c+40>>2]==1?H[c+28>>2]:0:0:0;break a;case 1:break b;default:break a}}if(H[c+32>>2]!=1){if(H[c+48>>2]|H[c+36>>2]!=1|H[c+40>>2]!=1){break a}}d=H[c+24>>2]}ca=c- -64|0;return d}function ua(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0;H[a+16>>2]=0;e=H[a>>2];H[a+4>>2]=e;H[a+12>>2]=e;e=H[b+8>>2];c=H[b+12>>2];h=c;d=H[b+20>>2];f=H[b+16>>2];g=f+4|0;d=g>>>0<4?d+1|0:d;a:{if(e>>>0<g>>>0&(d|0)>=(c|0)|(d|0)>(c|0)){break a}c=f+H[b>>2]|0;c=I[c|0]|I[c+1|0]<<8|(I[c+2|0]<<16|I[c+3|0]<<24);H[b+16>>2]=g;H[b+20>>2]=d;if(!c|c&3){break a}f=h-(d+(e>>>0<g>>>0)|0)|0;if(e-g>>>0<c>>>0&(f|0)<=0|(f|0)<0){break a}if(c>>>0>=4){ya(a,c>>>2|0);h=H[b+12>>2];g=H[b+16>>2];d=H[b+20>>2];e=H[b+8>>2]}f=c+g|0;d=f>>>0<c>>>0?d+1|0:d;if(e>>>0<f>>>0&(d|0)>=(h|0)|(d|0)>(h|0)){break a}qa(H[a>>2],H[b>>2]+g|0,c);d=H[b+20>>2];e=c+H[b+16>>2]|0;d=e>>>0<c>>>0?d+1|0:d;H[b+16>>2]=e;H[b+20>>2]=d;H[a+16>>2]=0;H[a+12>>2]=H[a>>2];i=1}return i}function de(a,b){var c=0,d=0,e=0,f=0;d=-1;e=-1;f=-1;a:{b:{if((b|0)==-1){break b}e=H[H[H[a+4>>2]+12>>2]+(b<<2)>>2];c=b+1|0;c=(c>>>0)%3|0?c:b-2|0;if((c|0)>=0){f=(c>>>0)/3|0;f=H[(H[H[a>>2]+96>>2]+N(f,12)|0)+(c-N(f,3)<<2)>>2]}c:{if((e|0)==-1){break c}c=((e>>>0)%3|0?-1:2)+e|0;if((c|0)<0){break c}d=(c>>>0)/3|0;d=H[(H[H[a>>2]+96>>2]+N(d,12)|0)+(c-N(d,3)<<2)>>2]}c=-1;if((d|0)!=(f|0)){break a}f=-1;d:{b=((b>>>0)%3|0?-1:2)+b|0;if((b|0)>=0){d=(b>>>0)/3|0;d=H[(H[H[a>>2]+96>>2]+N(d,12)|0)+(b-N(d,3)<<2)>>2];if((e|0)==-1){break b}break d}d=-1;if((e|0)!=-1){break d}break b}b=e+1|0;b=(b>>>0)%3|0?b:e-2|0;if((b|0)<0){break b}c=H[H[a>>2]+96>>2];a=(b>>>0)/3|0;f=H[(c+N(a,12)|0)+(b-N(a,3)<<2)>>2]}c=(d|0)!=(f|0)?-1:e}return c}function Ah(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0;c=pa(72);H[c+4>>2]=0;H[c+8>>2]=0;H[c>>2]=1984;H[c+12>>2]=0;H[c+16>>2]=0;H[c+20>>2]=0;H[c+24>>2]=0;H[c+28>>2]=0;H[c+32>>2]=0;H[c+36>>2]=0;H[c+40>>2]=0;H[c>>2]=2128;H[c+44>>2]=0;H[c+48>>2]=0;H[c+52>>2]=0;H[c+56>>2]=0;H[c+60>>2]=0;H[c+64>>2]=0;H[c+68>>2]=0;h=c;a:{if((b|0)>=0){g=a+8|0;c=H[a+12>>2];e=H[a+8>>2];f=c-e>>2;b:{if((f|0)>(b|0)){break b}d=b+1|0;if(b>>>0>=f>>>0){Vb(g,d-f|0);break b}if(d>>>0>=f>>>0){break b}e=(d<<2)+e|0;if((e|0)!=(c|0)){while(1){c=c-4|0;d=H[c>>2];H[c>>2]=0;if(d){ea[H[H[d>>2]+4>>2]](d)}if((c|0)!=(e|0)){continue}break}}H[a+12>>2]=e}a=H[g>>2]+(b<<2)|0;c=H[a>>2];H[a>>2]=h;if(!c){break a}}ea[H[H[c>>2]+4>>2]](c)}return(b^-1)>>>31|0}function ra(a,b,c){var d=0,e=0,f=0,g=0;a:{if(!c){break a}F[a|0]=b;d=a+c|0;F[d-1|0]=b;if(c>>>0<3){break a}F[a+2|0]=b;F[a+1|0]=b;F[d-3|0]=b;F[d-2|0]=b;if(c>>>0<7){break a}F[a+3|0]=b;F[d-4|0]=b;if(c>>>0<9){break a}d=0-a&3;e=d+a|0;b=N(b&255,16843009);H[e>>2]=b;d=c-d&-4;c=d+e|0;H[c-4>>2]=b;if(d>>>0<9){break a}H[e+8>>2]=b;H[e+4>>2]=b;H[c-8>>2]=b;H[c-12>>2]=b;if(d>>>0<25){break a}H[e+24>>2]=b;H[e+20>>2]=b;H[e+16>>2]=b;H[e+12>>2]=b;H[c-16>>2]=b;H[c-20>>2]=b;H[c-24>>2]=b;H[c-28>>2]=b;g=e&4|24;c=d-g|0;if(c>>>0<32){break a}d=Rj(b,0,1,1);f=da;b=e+g|0;while(1){H[b+24>>2]=d;H[b+28>>2]=f;H[b+16>>2]=d;H[b+20>>2]=f;H[b+8>>2]=d;H[b+12>>2]=f;H[b>>2]=d;H[b+4>>2]=f;b=b+32|0;c=c-32|0;if(c>>>0>31){continue}break}}return a}function Mj(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;d=H[b+8>>2];e=H[b+12>>2];g=e;e=H[b+20>>2];k=e;h=H[b+16>>2];c=h+4|0;e=c>>>0<4?e+1|0:e;i=c;a:{if(c>>>0>d>>>0&(e|0)>=(g|0)|(e|0)>(g|0)){break a}j=H[b>>2];c=j+h|0;f=I[c|0]|I[c+1|0]<<8|(I[c+2|0]<<16|I[c+3|0]<<24);H[b+16>>2]=i;H[b+20>>2]=e;c=d;d=k;e=h+8|0;d=e>>>0<8?d+1|0:d;if(c>>>0<e>>>0&(d|0)>=(g|0)|(d|0)>(g|0)){break a}c=i+j|0;c=I[c|0]|I[c+1|0]<<8|(I[c+2|0]<<16|I[c+3|0]<<24);H[b+16>>2]=e;H[b+20>>2]=d;if((c|0)<(f|0)){break a}H[a+16>>2]=c;H[a+12>>2]=f;d=(c>>31)-((f>>31)+(c>>>0<f>>>0)|0)|0;b=c-f|0;if(!d&b>>>0>2147483646|d){break a}l=1;d=b+1|0;H[a+20>>2]=d;b=d>>>1|0;H[a+24>>2]=b;H[a+28>>2]=0-b;if(d&1){break a}H[a+24>>2]=b-1}return l|0}function sd(a,b,c){var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;e=a+16|0;d=H[e>>2];a:{if(!d){break a}f=H[b>>2];b=e;while(1){g=(f|0)>H[d+16>>2];b=g?b:d;d=H[(g?d+4|0:d)>>2];if(d){continue}break}if((b|0)==(e|0)|(f|0)<H[b+16>>2]){break a}d=H[b+24>>2];if(!d){break a}f=b+20|0;b=I[c+11|0];e=b<<24>>24<0;g=e?H[c>>2]:c;b=e?H[c+4>>2]:b;while(1){e=I[d+27|0];h=e<<24>>24<0;e=h?H[d+20>>2]:e;j=e>>>0<b>>>0;b:{c:{d:{e:{f:{g:{i=j?e:b;if(i){h=h?H[d+16>>2]:d+16|0;k=Fa(g,h,i);if(k){break g}if(b>>>0>=e>>>0){break f}break b}if(b>>>0>=e>>>0){break e}break b}if((k|0)<0){break b}}e=Fa(h,g,i);if(e){break d}}if(j){break c}return Tc(f,c)}if((e|0)<0){break c}return Tc(f,c)}d=d+4|0}d=H[d>>2];if(d){continue}break}}return Tc(a,c)}function be(a,b,c){var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;d=ca-16|0;ca=d;f=H[a+24>>2];k=H[a+28>>2];a:{if((f|0)!=(k|0)){while(1){H[d+8>>2]=0;H[d>>2]=0;H[d+4>>2]=0;a=$d(H[f>>2],b,d);g=I[d+11|0];h=g<<24>>24;i=3;b:{c:{d:{if(!a){break d}i=0;a=I[c+11|0];e=a<<24>>24;j=(h|0)<0?H[d+4>>2]:g;if((j|0)!=(((e|0)<0?H[c+4>>2]:a)|0)){break d}a=(e|0)<0?H[c>>2]:c;e=(h|0)<0;e:{if(!e){e=d;if(!h){break e}while(1){if(I[e|0]!=I[a|0]){break d}a=a+1|0;e=e+1|0;g=g-1|0;if(g){continue}break}break e}if(!j){break e}if(Fa(e?H[d>>2]:d,a,j)){break c}}l=H[f>>2];i=1}if((h|0)>=0){break b}}oa(H[d>>2])}f:{switch(i|0){case 0:case 3:break f;default:break a}}f=f+4|0;if((k|0)!=(f|0)){continue}break}}l=0}ca=d+16|0;return l}function Cb(a,b,c){var d=0,e=0,f=0,g=0,h=0,i=0;f=c-b|0;h=f>>2;d=H[a+8>>2];e=H[a>>2];if(h>>>0<=d-e>>2>>>0){d=H[a+4>>2];g=d-e|0;f=g+b|0;i=g>>2;g=i>>>0<h>>>0?f:c;if((g|0)!=(b|0)){while(1){H[e>>2]=H[b>>2];e=e+4|0;b=b+4|0;if((g|0)!=(b|0)){continue}break}}if(h>>>0>i>>>0){if((c|0)!=(g|0)){while(1){H[d>>2]=H[f>>2];d=d+4|0;f=f+4|0;if((f|0)!=(c|0)){continue}break}}H[a+4>>2]=d;return}H[a+4>>2]=e;return}if(e){H[a+4>>2]=e;oa(e);H[a+8>>2]=0;H[a>>2]=0;H[a+4>>2]=0;d=0}a:{if((f|0)<0){break a}e=d>>>1|0;d=d>>>0>=2147483644?1073741823:e>>>0>h>>>0?e:h;if(d>>>0>=1073741824){break a}e=d<<2;d=pa(e);H[a>>2]=d;H[a+8>>2]=d+e;if((b|0)!=(c|0)){c=b;b=(f-4&-4)+4|0;d=qa(d,c,b)+b|0}H[a+4>>2]=d;return}sa();v()}function Oa(a,b,c){var d=0,e=0,f=0;e=ca-16|0;ca=e;H[a+4>>2]=0;a:{b:{if(!b){break b}f=H[a+8>>2];d=f<<5;c:{if(d>>>0>=b>>>0){H[a+4>>2]=b;break c}H[e+8>>2]=0;H[e>>2]=0;H[e+4>>2]=0;if((b|0)<0){break a}if(d>>>0<=1073741822){f=f<<6;d=b+31&-32;d=d>>>0<f>>>0?f:d}else{d=2147483647}pb(e,d);f=H[a>>2];H[a>>2]=H[e>>2];H[e>>2]=f;d=H[a+4>>2];H[a+4>>2]=b;H[e+4>>2]=d;d=H[a+8>>2];H[a+8>>2]=H[e+8>>2];H[e+8>>2]=d;if(!f){break c}oa(f)}d=b>>>5|0;a=H[a>>2];if(I[c|0]){if(b>>>0>=32){ra(a,255,d<<2)}if((b&-32)==(b|0)){break b}a=a+(d<<2)|0;H[a>>2]=H[a>>2]|-1>>>32-(b&31);break b}if(b>>>0>=32){ra(a,0,d<<2)}if((b&-32)==(b|0)){break b}a=a+(d<<2)|0;H[a>>2]=H[a>>2]&(-1>>>32-(b&31)^-1)}ca=e+16|0;return}sa();v()}function Hg(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0;e=ca-32|0;ca=e;a:{b:{f=Ma(c);if(f>>>0<2147483632){c:{d:{if(f>>>0>=11){a=(f|15)+1|0;g=pa(a);H[e+24>>2]=a|-2147483648;H[e+16>>2]=g;H[e+20>>2]=f;a=f+g|0;break d}F[e+27|0]=f;g=e+16|0;a=f+g|0;if(!f){break c}}qa(g,c,f)}F[a|0]=0;c=Ma(d);if(c>>>0>=2147483632){break b}e:{f:{if(c>>>0>=11){f=(c|15)+1|0;a=pa(f);H[e+8>>2]=f|-2147483648;H[e>>2]=a;H[e+4>>2]=c;g=a+c|0;break f}F[e+11|0]=c;g=c+e|0;a=e;if(!c){break e}}qa(a,d,c)}F[g|0]=0;c=H[b+4>>2];a=-1;g:{if(!c){break g}c=be(c,e+16|0,e);a=-1;if(!c){break g}a=Yd(b,H[c+24>>2])}if(F[e+11|0]<0){oa(H[e>>2])}if(F[e+27|0]<0){oa(H[e+16>>2])}ca=e+32|0;break a}Na();v()}Na();v()}return a|0}function jb(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0;b=H[b>>2];h=H[b+8>>2];i=H[b+4>>2];j=H[b>>2];d=H[a>>2];b=H[d+4>>2];a=H[d+8>>2];if(b>>>0<a>>>0){H[b+8>>2]=h;H[b+4>>2]=i;H[b>>2]=j;H[d+4>>2]=b+12;return}a:{e=H[d>>2];g=(b-e|0)/12|0;c=g+1|0;if(c>>>0<357913942){f=(a-e|0)/12|0;a=f<<1;c=f>>>0>=178956970?357913941:a>>>0>c>>>0?a:c;if(c){if(c>>>0>=357913942){break a}f=pa(N(c,12))}else{f=0}a=f+N(g,12)|0;H[a+8>>2]=h;H[a+4>>2]=i;H[a>>2]=j;g=a+12|0;if((b|0)!=(e|0)){while(1){a=a-12|0;b=b-12|0;H[a>>2]=H[b>>2];H[a+4>>2]=H[b+4>>2];H[a+8>>2]=H[b+8>>2];if((b|0)!=(e|0)){continue}break}}H[d+8>>2]=f+N(c,12);H[d+4>>2]=g;H[d>>2]=a;if(e){oa(e)}return}sa();v()}wa();v()}function lf(a,b){a=a|0;b=b|0;a=0;a:{switch(b|0){case 0:a=pa(20);H[a+12>>2]=-1;H[a+16>>2]=0;H[a+4>>2]=0;H[a+8>>2]=0;H[a>>2]=2232;return a|0;case 1:a=pa(24);H[a+12>>2]=-1;H[a+16>>2]=0;H[a+4>>2]=0;H[a+8>>2]=0;H[a>>2]=2232;H[a+20>>2]=0;H[a>>2]=2448;return a|0;case 2:a=pa(48);H[a+12>>2]=-1;H[a+16>>2]=0;H[a+4>>2]=0;H[a+8>>2]=0;H[a>>2]=2232;H[a+20>>2]=0;H[a>>2]=2448;H[a+24>>2]=1832;H[a>>2]=11048;H[a+32>>2]=0;H[a+36>>2]=0;H[a+28>>2]=-1;H[a+40>>2]=0;H[a+44>>2]=0;return a|0;case 3:a=pa(32);H[a+12>>2]=-1;H[a+16>>2]=0;H[a+4>>2]=0;H[a+8>>2]=0;H[a>>2]=2232;H[a+20>>2]=0;H[a>>2]=2448;H[a+24>>2]=1032;H[a>>2]=7028;H[a+28>>2]=-1;break;default:break a}}return a|0}function tf(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;f=H[b>>2];b=H[b+4>>2];d=H[H[a+8>>2]+40>>2];j=d;m=pa((d|0)<0?-1:d);i=b-f|0;e=1;a:{if((i|0)<4){break a}b=0;g=H[c+16>>2];k=d;f=g+d|0;d=0+H[c+20>>2]|0;d=f>>>0<k>>>0?d+1|0:d;h=H[c+12>>2];e=0;if(K[c+8>>2]<f>>>0&(d|0)>=(h|0)|(d|0)>(h|0)){break a}e=i>>2;i=(e|0)<=1?1:e;while(1){b:{g=qa(m,H[c>>2]+g|0,j);H[c+16>>2]=f;H[c+20>>2]=d;qa(H[H[H[a+8>>2]+64>>2]>>2]+b|0,g,j);l=l+1|0;if((i|0)==(l|0)){break b}b=b+j|0;d=n+H[c+20>>2]|0;g=H[c+16>>2];f=k+g|0;d=f>>>0<k>>>0?d+1|0:d;h=H[c+12>>2];if((d|0)<=(h|0)&K[c+8>>2]>=f>>>0|(d|0)<(h|0)){continue}}break}e=(e|0)<=(l|0)}oa(m);return e|0}function Ti(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0;H[b>>2]=1;f=b+8|0;c=H[b+8>>2];d=H[b+12>>2]-c|0;if(d>>>0<=4294967291){kc(f,d+4|0);c=H[f>>2]}c=c+d|0;d=H[a+4>>2];F[c|0]=d;F[c+1|0]=d>>>8;F[c+2|0]=d>>>16;F[c+3|0]=d>>>24;c=H[a+8>>2];if((c|0)!=H[a+12>>2]){d=0;while(1){g=(d<<2)+c|0;c=H[b+8>>2];e=H[b+12>>2]-c|0;if(e>>>0<=4294967291){kc(f,e+4|0);c=H[f>>2]}c=c+e|0;e=H[g>>2];F[c|0]=e;F[c+1|0]=e>>>8;F[c+2|0]=e>>>16;F[c+3|0]=e>>>24;d=d+1|0;c=H[a+8>>2];if(d>>>0<H[a+12>>2]-c>>2>>>0){continue}break}}c=H[b+12>>2];b=H[b+8>>2];c=c-b|0;if(c>>>0<=4294967291){kc(f,c+4|0);b=H[f>>2]}b=b+c|0;a=H[a+20>>2];F[b|0]=a;F[b+1|0]=a>>>8;F[b+2|0]=a>>>16;F[b+3|0]=a>>>24}function Aa(a,b,c){var d=0,e=0,f=0,g=0,h=0,i=0;f=c-b|0;g=f>>2;d=H[a+8>>2];e=H[a>>2];if(g>>>0<=d-e>>2>>>0){f=H[a+4>>2]-e|0;d=f+b|0;h=f>>2;f=h>>>0<g>>>0?d:c;i=f-b|0;if((b|0)!=(f|0)){va(e,b,i)}if(g>>>0>h>>>0){b=H[a+4>>2];if((c|0)!=(f|0)){while(1){H[b>>2]=H[d>>2];b=b+4|0;d=d+4|0;if((d|0)!=(c|0)){continue}break}}H[a+4>>2]=b;return}H[a+4>>2]=e+i;return}if(e){H[a+4>>2]=e;oa(e);H[a+8>>2]=0;H[a>>2]=0;H[a+4>>2]=0;d=0}a:{if((f|0)<0){break a}e=d>>>1|0;d=d>>>0>=2147483644?1073741823:e>>>0>g>>>0?e:g;if(d>>>0>=1073741824){break a}e=d<<2;d=pa(e);H[a>>2]=d;H[a+8>>2]=d+e;if((b|0)!=(c|0)){c=b;b=(f-4&-4)+4|0;d=qa(d,c,b)+b|0}H[a+4>>2]=d;return}sa();v()}function Rb(a,b){var c=0,d=0,e=0,f=0,g=0,h=0;c=H[a+4>>2];if((c|0)!=H[a+8>>2]){e=H[b+4>>2];H[c>>2]=H[b>>2];H[c+4>>2]=e;H[c+8>>2]=H[b+8>>2];H[a+4>>2]=c+12;return}a:{g=H[a>>2];d=(c-g|0)/12|0;e=d+1|0;if(e>>>0<357913942){f=d<<1;f=d>>>0>=178956970?357913941:e>>>0<f>>>0?f:e;if(f){if(f>>>0>=357913942){break a}e=pa(N(f,12))}else{e=0}d=e+N(d,12)|0;h=H[b+4>>2];H[d>>2]=H[b>>2];H[d+4>>2]=h;H[d+8>>2]=H[b+8>>2];b=d+12|0;if((c|0)!=(g|0)){while(1){c=c-12|0;h=H[c+4>>2];d=d-12|0;H[d>>2]=H[c>>2];H[d+4>>2]=h;H[d+8>>2]=H[c+8>>2];if((c|0)!=(g|0)){continue}break}c=H[a>>2]}H[a+8>>2]=e+N(f,12);H[a+4>>2]=b;H[a>>2]=d;if(c){oa(c)}return}sa();v()}wa();v()}function Qi(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;f=ca-32|0;ca=f;g=e>>>0>1073741823?-1:e<<2;l=ra(pa(g),0,g);g=l;i=H[g>>2];g=H[g+4>>2];k=H[b+4>>2];H[f+24>>2]=H[b>>2];H[f+28>>2]=k;H[f+8>>2]=i;H[f+12>>2]=g;i=a+8|0;rc(f+16|0,i,f+8|0,f+24|0);H[c>>2]=H[f+16>>2];H[c+4>>2]=H[f+20>>2];if((d|0)>(e|0)){k=0-e<<2;a=e;while(1){h=a<<2;g=h+c|0;j=g+k|0;m=H[j>>2];j=H[j+4>>2];h=b+h|0;n=H[h+4>>2];H[f+24>>2]=H[h>>2];H[f+28>>2]=n;H[f+8>>2]=m;H[f+12>>2]=j;rc(f+16|0,i,f+8|0,f+24|0);H[g>>2]=H[f+16>>2];H[g+4>>2]=H[f+20>>2];a=a+e|0;if((d|0)>(a|0)){continue}break}}oa(l);ca=f+32|0;return 1}function Hi(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;f=ca-32|0;ca=f;h=e>>>0>1073741823?-1:e<<2;h=ra(pa(h),0,h);g=H[b>>2];i=H[b+4>>2];k=H[h+4>>2];H[f+16>>2]=H[h>>2];H[f+20>>2]=k;H[f+8>>2]=g;H[f+12>>2]=i;i=a+8|0;qc(f+24|0,i,f+16|0,f+8|0);H[c>>2]=H[f+24>>2];H[c+4>>2]=H[f+28>>2];if((d|0)>(e|0)){k=0-e<<2;a=e;while(1){g=a<<2;j=g+b|0;m=H[j>>2];j=H[j+4>>2];g=c+g|0;l=g+k|0;n=H[l+4>>2];H[f+16>>2]=H[l>>2];H[f+20>>2]=n;H[f+8>>2]=m;H[f+12>>2]=j;qc(f+24|0,i,f+16|0,f+8|0);H[g>>2]=H[f+24>>2];H[g+4>>2]=H[f+28>>2];a=a+e|0;if((d|0)>(a|0)){continue}break}}oa(h);ca=f+32|0;return 1}function Ag(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;a:{if(K[b+80>>2]>65535){break a}a=H[b+100>>2];b=H[b+96>>2];e=(a-b|0)/12|0;f=N(e,6);g=(f|0)==(c|0);if((a|0)==(b|0)|(c|0)!=(f|0)){break a}g=1;c=e>>>0<=1?1:e;i=c&1;a=0;if(e>>>0>=2){j=c&-2;c=0;while(1){f=N(a,6);h=f+d|0;e=b+N(a,12)|0;G[h>>1]=H[e>>2];G[(f|2)+d>>1]=H[e+4>>2];G[h+4>>1]=H[e+8>>2];f=a|1;e=N(f,6)+d|0;f=b+N(f,12)|0;G[e>>1]=H[f>>2];G[e+2>>1]=H[f+4>>2];G[e+4>>1]=H[f+8>>2];a=a+2|0;c=c+2|0;if((j|0)!=(c|0)){continue}break}}if(!i){break a}c=N(a,6)+d|0;a=b+N(a,12)|0;G[c>>1]=H[a>>2];G[c+2>>1]=H[a+4>>2];G[c+4>>1]=H[a+8>>2]}return g|0}function Gd(a,b,c,d,e,f,g){var h=0,i=0,j=0;h=ca-16|0;ca=h;if((b^-1)+2147483631>>>0>=c>>>0){if(I[a+11|0]>>>7|0){i=H[a>>2]}else{i=a}if(b>>>0<1073741799){H[h+12>>2]=b<<1;H[h>>2]=b+c;c=ca-16|0;ca=c;ca=c+16|0;c=h+12|0;c=H[(K[h>>2]<K[c>>2]?c:h)>>2];if(c>>>0>=11){j=c+16&-16;c=j-1|0;c=(c|0)==11?j:c}else{c=10}c=c+1|0}else{c=2147483631}Zb(h,c);c=H[h>>2];if(f){yb(c,g,f)}g=d-e|0;if((d|0)!=(e|0)){yb(c+f|0,e+i|0,g)}if((b|0)!=10){oa(i)}H[a>>2]=c;H[a+8>>2]=H[a+8>>2]&-2147483648|H[h+4>>2]&2147483647;H[a+8>>2]=H[a+8>>2]|-2147483648;b=a;a=f+g|0;H[b+4>>2]=a;F[h+12|0]=0;F[a+c|0]=I[h+12|0];ca=h+16|0;return}Na();v()}function Rg(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0;a=ca-32|0;ca=a;H[a+24>>2]=0;H[a+28>>2]=0;a:{d=Ma(c);if(d>>>0<2147483632){b:{c:{if(d>>>0>=11){e=(d|15)+1|0;f=pa(e);H[a+16>>2]=e|-2147483648;H[a+8>>2]=f;H[a+12>>2]=d;e=d+f|0;break c}F[a+19|0]=d;f=a+8|0;e=f+d|0;if(!d){break b}}qa(f,c,d)}F[e|0]=0;c=b+4|0;b=nb(b,a+8|0);d:{if((c|0)==(b|0)){break d}c=H[b+32>>2];b=H[b+28>>2];if((c-b|0)!=8){break d}c=I[b+4|0]|I[b+5|0]<<8|(I[b+6|0]<<16|I[b+7|0]<<24);H[a+24>>2]=I[b|0]|I[b+1|0]<<8|(I[b+2|0]<<16|I[b+3|0]<<24);H[a+28>>2]=c}g=M[a+24>>3];if(F[a+19|0]<0){oa(H[a+8>>2])}ca=a+32|0;break a}Na();v()}return+g}function uf(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0;f=1;a:{if((ea[H[H[b>>2]+20>>2]](b)|0)<=0){break a}while(1){f=0;c=Zd(H[H[a+4>>2]+4>>2],ea[H[H[b>>2]+24>>2]](b,g)|0);if((c|0)==-1){break a}e=H[a+4>>2];b:{if(I[e+36|0]<=1){if(ea[H[H[b>>2]+28>>2]](b,H[H[H[e+4>>2]+8>>2]+(c<<2)>>2])|0){break b}break a}d=0;c:{if((c|0)<0){break c}h=H[e+4>>2];if(H[h+12>>2]-H[h+8>>2]>>2<=(c|0)){break c}d=H[H[e+8>>2]+(H[H[e+20>>2]+(c<<2)>>2]<<2)>>2];d=ea[H[H[d>>2]+32>>2]](d,c)|0}if(!d){break a}if(!(ea[H[H[b>>2]+28>>2]](b,d)|0)){break a}}f=1;g=g+1|0;if((ea[H[H[b>>2]+20>>2]](b)|0)>(g|0)){continue}break}}return f|0}function tb(a,b,c){var d=0,e=0,f=0,g=0,h=0,i=0;H[a+8>>2]=0;H[a>>2]=0;H[a+4>>2]=0;a:{b:{if(b){if(b>>>0>=357913942){break b}b=N(b,12);d=pa(b);H[a+4>>2]=d;H[a>>2]=d;e=b+d|0;H[a+8>>2]=e;f=H[c+4>>2];g=H[c>>2];c:{if((f|0)==(g|0)){b=b-12|0;ra(d,0,(b-((b>>>0)%12|0)|0)+12|0);break c}h=f-g|0;if((h|0)<0){break a}i=h&-4;while(1){H[d+8>>2]=0;H[d>>2]=0;H[d+4>>2]=0;b=pa(h);H[d>>2]=b;H[d+8>>2]=b+i;c=g;while(1){H[b>>2]=H[c>>2];b=b+4|0;c=c+4|0;if((f|0)!=(c|0)){continue}break}H[d+4>>2]=b;d=d+12|0;if((e|0)!=(d|0)){continue}break}}H[a+4>>2]=e}return}sa();v()}H[d+8>>2]=0;H[d>>2]=0;H[d+4>>2]=0;sa();v()}function Vi(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0;c=H[b+8>>2];d=H[b+12>>2];g=d;d=H[b+20>>2];i=d;h=H[b+16>>2];f=h+4|0;d=f>>>0<4?d+1|0:d;a:{if(c>>>0<f>>>0&(d|0)>=(g|0)|(d|0)>(g|0)){break a}e=h+H[b>>2]|0;e=I[e|0]|I[e+1|0]<<8|(I[e+2|0]<<16|I[e+3|0]<<24);H[b+16>>2]=f;H[b+20>>2]=d;if(J[b+38>>1]<=513){f=c;c=i;d=h+8|0;c=d>>>0<8?c+1|0:c;if(d>>>0>f>>>0&(c|0)>=(g|0)|(c|0)>(g|0)){break a}H[b+16>>2]=d;H[b+20>>2]=c}if(!(e&1)){break a}b=Q(e)^31;if(b-1>>>0>28){break a}j=1;H[a+8>>2]=b+1;b=-2<<b;c=b^-2;H[a+16>>2]=c;H[a+12>>2]=b^-1;H[a+24>>2]=c>>1;L[a+20>>2]=O(2)/O(c|0)}return j|0}function Lc(a,b,c){var d=0,e=0,f=0,g=0;a:{f=b>>>0<1431655766&(b|c)>=0;b:{if(!f){break b}b=N(b,3);Kc(a,b,13648);Kc(a+12|0,b,13652);d=H[a+24>>2];c:{if(H[a+32>>2]-d>>2>>>0>=c>>>0){break c}if(c>>>0>=1073741824){break a}b=H[a+28>>2];e=c<<2;c=pa(e);e=c+e|0;g=c+(b-d&-4)|0;c=g;if((b|0)!=(d|0)){while(1){c=c-4|0;b=b-4|0;H[c>>2]=H[b>>2];if((b|0)!=(d|0)){continue}break}}H[a+32>>2]=e;H[a+28>>2]=g;H[a+24>>2]=c;if(!d){break c}oa(d)}H[a+80>>2]=0;H[a+84>>2]=0;b=H[a+76>>2];H[a+76>>2]=0;if(b){oa(b)}H[a+68>>2]=0;H[a+72>>2]=0;b=a- -64|0;a=H[b>>2];H[b>>2]=0;if(!a){break b}oa(a)}return f}sa();v()}function Fe(a){var b=0,c=0,d=0,e=0,f=0;f=1;c=H[a+140>>2];a:{if((c|0)<=0){break a}b=c<<4;d=pa(c>>>0>268435455?-1:b|4);H[d>>2]=c;d=d+4|0;c=d+b|0;b=d;while(1){H[b>>2]=0;H[b+4>>2]=0;F[b+5|0]=0;F[b+6|0]=0;F[b+7|0]=0;F[b+8|0]=0;F[b+9|0]=0;F[b+10|0]=0;F[b+11|0]=0;F[b+12|0]=0;b=b+16|0;if((c|0)!=(b|0)){continue}break}e=H[a+136>>2];H[a+136>>2]=d;if(e){c=e-4|0;d=H[c>>2];if(d){b=(d<<4)+e|0;while(1){b=b-16|0;if((e|0)!=(b|0)){continue}break}}oa(c)}b=0;if(H[a+140>>2]<=0){break a}while(1){f=ta(H[a+136>>2]+(b<<4)|0,a);if(!f){break a}b=b+1|0;if((b|0)<H[a+140>>2]){continue}break}}return f}function mb(a,b){var c=0,d=0,e=0,f=0,g=0;a:{if(H[a+64>>2]){break a}c=pa(32);H[c+16>>2]=0;H[c+20>>2]=0;H[c+8>>2]=0;H[c>>2]=0;H[c+4>>2]=0;H[c+24>>2]=0;H[c+28>>2]=0;d=H[a+64>>2];H[a+64>>2]=c;if(!d){break a}c=H[d>>2];if(c){H[d+4>>2]=c;oa(c)}oa(d)}d=H[a+64>>2];c=H[a+28>>2]-1|0;if(c>>>0<=10){c=H[(c<<2)+13584>>2]}else{c=-1}c=N(c,I[a+24|0]);f=c>>31;g=se(d,0,Rj(c,f,b,0),da);if(g){d=H[a+64>>2];H[a>>2]=d;e=H[d+20>>2];H[a+8>>2]=H[d+16>>2];H[a+12>>2]=e;e=H[d+24>>2];d=H[d+28>>2];H[a+48>>2]=0;H[a+52>>2]=0;H[a+40>>2]=c;H[a+44>>2]=f;H[a+16>>2]=e;H[a+20>>2]=d;H[a+80>>2]=b}return g}function jc(a,b){var c=0;c=H[b+4>>2];H[a>>2]=H[b>>2];H[a+4>>2]=c;c=H[b+60>>2];H[a+56>>2]=H[b+56>>2];H[a+60>>2]=c;c=H[b+52>>2];H[a+48>>2]=H[b+48>>2];H[a+52>>2]=c;c=H[b+44>>2];H[a+40>>2]=H[b+40>>2];H[a+44>>2]=c;c=H[b+36>>2];H[a+32>>2]=H[b+32>>2];H[a+36>>2]=c;c=H[b+28>>2];H[a+24>>2]=H[b+24>>2];H[a+28>>2]=c;c=H[b+20>>2];H[a+16>>2]=H[b+16>>2];H[a+20>>2]=c;c=H[b+12>>2];H[a+8>>2]=H[b+8>>2];H[a+12>>2]=c;H[a+88>>2]=0;H[a+64>>2]=0;H[a+68>>2]=0;H[a+72>>2]=0;H[a+76>>2]=0;F[a+77|0]=0;F[a+78|0]=0;F[a+79|0]=0;F[a+80|0]=0;F[a+81|0]=0;F[a+82|0]=0;F[a+83|0]=0;F[a+84|0]=0;return a}function zg(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0;a=H[b+100>>2];b=H[b+96>>2];h=a-b|0;a:{if((h|0)!=(c|0)|(a|0)==(b|0)){break a}g=(c|0)/12|0;e=g>>>0<=1?1:g;j=e&1;a=0;if(g>>>0>=2){k=e&-2;g=0;while(1){e=N(a,12);i=e+d|0;f=b+e|0;H[i>>2]=H[f>>2];H[(e|4)+d>>2]=H[f+4>>2];H[i+8>>2]=H[f+8>>2];f=N(a|1,12);e=f+d|0;f=b+f|0;H[e>>2]=H[f>>2];H[e+4>>2]=H[f+4>>2];H[e+8>>2]=H[f+8>>2];a=a+2|0;g=g+2|0;if((k|0)!=(g|0)){continue}break}}if(!j){break a}e=d;d=N(a,12);a=e+d|0;b=b+d|0;H[a>>2]=H[b>>2];H[a+4>>2]=H[b+4>>2];H[a+8>>2]=H[b+8>>2]}return(c|0)==(h|0)|0}function Mi(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0;c=H[b+8>>2];d=H[b+12>>2];g=d;d=H[b+20>>2];i=d;h=H[b+16>>2];f=h+4|0;d=f>>>0<4?d+1|0:d;a:{if(c>>>0<f>>>0&(d|0)>=(g|0)|(d|0)>(g|0)){break a}e=h+H[b>>2]|0;e=I[e|0]|I[e+1|0]<<8|(I[e+2|0]<<16|I[e+3|0]<<24);H[b+16>>2]=f;H[b+20>>2]=d;f=c;c=i;d=h+8|0;c=d>>>0<8?c+1|0:c;if(d>>>0>f>>>0&(c|0)>=(g|0)|(c|0)>(g|0)){break a}H[b+16>>2]=d;H[b+20>>2]=c;if(!(e&1)){break a}b=Q(e)^31;if(b-1>>>0>28){break a}j=1;H[a+8>>2]=b+1;b=-2<<b;c=b^-2;H[a+16>>2]=c;H[a+12>>2]=b^-1;H[a+24>>2]=c>>1;L[a+20>>2]=O(2)/O(c|0)}return j|0}function nb(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0;f=a+4|0;a=H[a+4>>2];a:{b:{if(!a){break b}d=I[b+11|0];c=d<<24>>24<0;g=c?H[b>>2]:b;d=c?H[b+4>>2]:d;b=f;while(1){e=I[a+27|0];c=e<<24>>24<0;e=c?H[a+20>>2]:e;h=e>>>0>d>>>0;i=h?d:e;c:{if(i){c=Fa(c?H[a+16>>2]:a+16|0,g,i);if(c){break c}}c=d>>>0>e>>>0?-1:h}c=(c|0)<0;b=c?b:a;a=H[(c?a+4|0:a)>>2];if(a){continue}break}if((b|0)==(f|0)){break b}c=I[b+27|0];a=c<<24>>24<0;d:{c=a?H[b+20>>2]:c;e=c>>>0<d>>>0?c:d;if(e){a=Fa(g,a?H[b+16>>2]:b+16|0,e);if(a){break d}}if(c>>>0>d>>>0){break b}break a}if((a|0)>=0){break a}}b=f}return b}function Jf(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;if(Ya(a,H[b+8>>2],e)){if(!(H[b+28>>2]==1|H[b+4>>2]!=(c|0))){H[b+28>>2]=d}return}a:{if(Ya(a,H[b>>2],e)){if(!(H[b+16>>2]!=(c|0)&H[b+20>>2]!=(c|0))){if((d|0)!=1){break a}H[b+32>>2]=1;return}H[b+32>>2]=d;b:{if(H[b+44>>2]==4){break b}G[b+52>>1]=0;a=H[a+8>>2];ea[H[H[a>>2]+20>>2]](a,b,c,c,1,e);if(I[b+53|0]){H[b+44>>2]=3;if(!I[b+52|0]){break b}break a}H[b+44>>2]=4}H[b+20>>2]=c;H[b+40>>2]=H[b+40>>2]+1;if(H[b+36>>2]!=1|H[b+24>>2]!=2){break a}F[b+54|0]=1;return}a=H[a+8>>2];ea[H[H[a>>2]+24>>2]](a,b,c,d,e)}}function Db(a,b,c){var d=0,e=0,f=0,g=0;a:{b:{if(!b){break b}if(J[a+38>>1]<=513){f=H[a+12>>2];d=H[a+20>>2];b=H[a+16>>2];g=b+8|0;d=g>>>0<8?d+1|0:d;e=0;if(K[a+8>>2]<g>>>0&(d|0)>=(f|0)|(d|0)>(f|0)){break a}b=b+H[a>>2]|0;d=I[b+4|0]|I[b+5|0]<<8|(I[b+6|0]<<16|I[b+7|0]<<24);H[c>>2]=I[b|0]|I[b+1|0]<<8|(I[b+2|0]<<16|I[b+3|0]<<24);H[c+4>>2]=d;b=H[a+20>>2];c=H[a+16>>2]+8|0;b=c>>>0<8?b+1|0:b;H[a+16>>2]=c;H[a+20>>2]=b;break b}e=0;if(!re(1,c,a)){break a}}F[a+36|0]=1;H[a+32>>2]=0;b=H[a+16>>2];c=b+H[a>>2]|0;H[a+24>>2]=c;H[a+28>>2]=(H[a+8>>2]-b|0)+c;e=1}return e}function ve(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0;f=pa(64);c=pa(12);H[c+8>>2]=H[H[a+4>>2]+80>>2];H[c>>2]=13216;H[c+4>>2]=0;f=od(f,c);a:{b:{if((b|0)<0){c=f;break b}h=a+8|0;c=H[a+12>>2];e=H[a+8>>2];g=c-e>>2;c:{if((g|0)>(b|0)){break c}d=b+1|0;if(b>>>0>=g>>>0){Vb(h,d-g|0);break c}if(d>>>0>=g>>>0){break c}e=e+(d<<2)|0;if((e|0)!=(c|0)){while(1){c=c-4|0;d=H[c>>2];H[c>>2]=0;if(d){ea[H[H[d>>2]+4>>2]](d)}if((c|0)!=(e|0)){continue}break}}H[a+12>>2]=e}a=H[h>>2]+(b<<2)|0;c=H[a>>2];H[a>>2]=f;if(!c){break a}}ea[H[H[c>>2]+4>>2]](c)}return(b^-1)>>>31|0}function Qd(a,b){var c=0,d=0,e=0,f=0;d=ca-16|0;ca=d;H[d+12>>2]=b;c=ca-208|0;ca=c;H[c+204>>2]=b;b=c+160|0;ra(b,0,40);H[c+200>>2]=H[c+204>>2];a:{if((Od(0,a,c+200|0,c+80|0,b)|0)<0){break a}f=H[3941]>=0;b=H[3922];if(H[3940]<=0){H[3922]=b&-33}b:{c:{d:{if(!H[3934]){H[3934]=80;H[3929]=0;H[3926]=0;H[3927]=0;e=H[3933];H[3933]=c;break d}if(H[3926]){break c}}if(Sd(15688)){break b}}Od(15688,a,c+200|0,c+80|0,c+160|0)}if(e){ea[H[3931]](15688,0,0)|0;H[3934]=0;H[3933]=e;H[3929]=0;H[3926]=0;H[3927]=0}H[3922]=H[3922]|b&32;if(!f){break a}}ca=c+208|0;ca=d+16|0}function pf(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0;c=H[a+60>>2];a:{if(!c){break a}H[c+4>>2]=a+48;if(!(ea[H[H[c>>2]+12>>2]](c)|0)){break a}b:{c=ea[H[H[a>>2]+24>>2]](a)|0;if((c|0)<=0){break b}while(1){c:{f=H[(ea[H[H[a>>2]+28>>2]](a)|0)+4>>2];g=ea[H[H[a>>2]+20>>2]](a,d)|0;e=H[a+60>>2];if(!(ea[H[H[e>>2]+8>>2]](e,H[H[f+8>>2]+(g<<2)>>2])|0)){break c}d=d+1|0;if((c|0)!=(d|0)){continue}break b}break}return 0}d=0;if(!(ea[H[H[a>>2]+36>>2]](a,b)|0)){break a}if(!(ea[H[H[a>>2]+40>>2]](a,b)|0)){break a}d=ea[H[H[a>>2]+44>>2]](a)|0}return d|0}function id(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0;c=H[a+216>>2];if((c|0)!=H[a+220>>2]){while(1){a:{c=H[N(e,144)+c>>2];if((c|0)<0){break a}d=H[a+4>>2];f=H[d+8>>2];if((c|0)>=H[d+12>>2]-f>>2){break a}d=0;c=H[(c<<2)+f>>2];if((ea[H[H[c>>2]+24>>2]](c)|0)<=0){break a}while(1){if((ea[H[H[c>>2]+20>>2]](c,d)|0)!=(b|0)){d=d+1|0;if((ea[H[H[c>>2]+24>>2]](c)|0)>(d|0)){continue}break a}break}a=H[a+216>>2]+N(e,144)|0;return(I[a+100|0]?a+4|0:0)|0}e=e+1|0;c=H[a+216>>2];if(e>>>0<(H[a+220>>2]-c|0)/144>>>0){continue}break}}return 0}function xb(a){var b=0,c=0,d=0,e=0;c=H[a+132>>2];if(c){d=c;b=H[a+136>>2];if((c|0)!=(b|0)){while(1){d=b-12|0;e=H[d>>2];if(e){H[b-8>>2]=e;oa(e)}b=d;if((c|0)!=(b|0)){continue}break}d=H[a+132>>2]}H[a+136>>2]=c;oa(d)}c=H[a+120>>2];if(c){d=c;b=H[a+124>>2];if((c|0)!=(b|0)){while(1){d=b-12|0;e=H[d>>2];if(e){H[b-8>>2]=e;oa(e)}b=d;if((c|0)!=(b|0)){continue}break}d=H[a+120>>2]}H[a+124>>2]=c;oa(d)}b=H[a+108>>2];if(b){H[a+112>>2]=b;oa(b)}b=H[a+96>>2];if(b){H[a+100>>2]=b;oa(b)}Za(a+76|0);Za(a+56|0);Za(a+36|0);Za(a+16|0)}function rd(a){a=a|0;var b=0,c=0,d=0;H[a>>2]=2128;d=H[a+60>>2];if(d){b=d;c=H[a- -64>>2];if((b|0)!=(c|0)){while(1){c=c-4|0;b=H[c>>2];H[c>>2]=0;if(b){Ga(b)}if((c|0)!=(d|0)){continue}break}b=H[a+60>>2]}H[a+64>>2]=d;oa(b)}b=H[a+48>>2];if(b){H[a+52>>2]=b;oa(b)}d=H[a+36>>2];if(d){b=d;c=H[a+40>>2];if((b|0)!=(c|0)){while(1){c=c-24|0;ea[H[H[c>>2]>>2]](c)|0;if((c|0)!=(d|0)){continue}break}b=H[a+36>>2]}H[a+40>>2]=d;oa(b)}H[a>>2]=1984;b=H[a+16>>2];if(b){H[a+20>>2]=b;oa(b)}b=H[a+4>>2];if(b){H[a+8>>2]=b;oa(b)}return a|0}function ue(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0;c=H[a+8>>2];d=H[a+4>>2];if(c-d>>2>>>0>=b>>>0){if(b){b=b<<2;d=ra(d,0,b)+b|0}H[a+4>>2]=d;return}a:{f=H[a>>2];g=d-f>>2;e=g+b|0;if(e>>>0<1073741824){c=c-f|0;h=c>>>1|0;e=c>>>0>=2147483644?1073741823:e>>>0<h>>>0?h:e;if(e){if(e>>>0>=1073741824){break a}i=pa(e<<2)}c=(g<<2)+i|0;b=b<<2;b=ra(c,0,b)+b|0;if((d|0)!=(f|0)){while(1){c=c-4|0;d=d-4|0;H[c>>2]=H[d>>2];if((d|0)!=(f|0)){continue}break}}H[a+8>>2]=(e<<2)+i;H[a+4>>2]=b;H[a>>2]=c;if(f){oa(f)}return}sa();v()}wa();v()}function rb(a){var b=0,c=0,d=0,e=0,f=0;d=H[a+8>>2];a:{if(I[d+84|0]){break a}b=H[a+16>>2];if(!b|!I[b+84|0]){break a}c=H[d+72>>2];e=H[d+68>>2];F[b+84|0]=0;c=c-e>>2;f=H[b+68>>2];e=H[b+72>>2]-f>>2;b:{if(c>>>0>e>>>0){qb(b+68|0,c-e|0,2316);d=H[a+8>>2];break b}if(c>>>0>=e>>>0){break b}H[b+72>>2]=f+(c<<2)}if(I[d+84|0]){break a}c=H[d+68>>2];if((c|0)==H[d+72>>2]){break a}e=H[H[a+16>>2]+68>>2];b=0;while(1){f=b<<2;H[f+e>>2]=H[c+f>>2];b=b+1|0;c=H[d+68>>2];if(b>>>0<H[d+72>>2]-c>>2>>>0){continue}break}}return H[a+16>>2]}function Lg(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0;e=ca+-64|0;ca=e;f=Ha(e+8|0);H[f+16>>2]=0;H[f+20>>2]=0;H[f>>2]=b;H[f+8>>2]=c;H[f+12>>2]=0;b=e+48|0;Pe(b,a,f,d);H[a+24>>2]=H[e+48>>2];f=a+24|0;a:{if((f|0)==(b|0)){break a}b=a+28|0;c=e+48|4;g=I[e+63|0];d=g<<24>>24;if(F[a+39|0]>=0){if((d|0)>=0){a=H[c+4>>2];H[b>>2]=H[c>>2];H[b+4>>2]=a;H[b+8>>2]=H[c+8>>2];break a}Xb(b,H[e+52>>2],H[e+56>>2]);break a}a=(d|0)<0;Yb(b,a?H[e+52>>2]:c,a?H[e+56>>2]:g)}if(F[e+63|0]<0){oa(H[e+52>>2])}ca=e- -64|0;return f|0}function Kg(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0;e=ca+-64|0;ca=e;f=Ha(e+8|0);H[f+16>>2]=0;H[f+20>>2]=0;H[f>>2]=b;H[f+8>>2]=c;H[f+12>>2]=0;b=e+48|0;Oe(b,a,f,d);H[a+24>>2]=H[e+48>>2];f=a+24|0;a:{if((f|0)==(b|0)){break a}b=a+28|0;c=e+48|4;g=I[e+63|0];d=g<<24>>24;if(F[a+39|0]>=0){if((d|0)>=0){a=H[c+4>>2];H[b>>2]=H[c>>2];H[b+4>>2]=a;H[b+8>>2]=H[c+8>>2];break a}Xb(b,H[e+52>>2],H[e+56>>2]);break a}a=(d|0)<0;Yb(b,a?H[e+52>>2]:c,a?H[e+56>>2]:g)}if(F[e+63|0]<0){oa(H[e+52>>2])}ca=e- -64|0;return f|0}function Ig(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0;a=ca-32|0;ca=a;a:{d=Ma(c);if(d>>>0<2147483632){b:{c:{if(d>>>0>=11){e=(d|15)+1|0;f=pa(e);H[a+24>>2]=e|-2147483648;H[a+16>>2]=f;H[a+20>>2]=d;e=d+f|0;break c}F[a+27|0]=d;f=a+16|0;e=f+d|0;if(!d){break b}}qa(f,c,d)}F[e|0]=0;F[a+4|0]=0;H[a>>2]=1701667182;F[a+11|0]=4;d=H[b+4>>2];c=-1;d:{if(!d){break d}d=be(d,a,a+16|0);c=-1;if(!d){break d}c=Yd(b,H[d+24>>2])}b=c;if(F[a+11|0]<0){oa(H[a>>2])}if(F[a+27|0]<0){oa(H[a+16>>2])}ca=a+32|0;break a}Na();v()}return b|0}function hd(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0;c=H[a+216>>2];if((c|0)!=H[a+220>>2]){while(1){a:{c=H[N(e,144)+c>>2];if((c|0)<0){break a}d=H[a+4>>2];f=H[d+8>>2];if((c|0)>=H[d+12>>2]-f>>2){break a}d=0;c=H[(c<<2)+f>>2];if((ea[H[H[c>>2]+24>>2]](c)|0)<=0){break a}while(1){if((ea[H[H[c>>2]+20>>2]](c,d)|0)!=(b|0)){d=d+1|0;if((ea[H[H[c>>2]+24>>2]](c)|0)>(d|0)){continue}break a}break}return(H[a+216>>2]+N(e,144)|0)+104|0}e=e+1|0;c=H[a+216>>2];if(e>>>0<(H[a+220>>2]-c|0)/144>>>0){continue}break}}return a+184|0}function ab(a){var b=0,c=0,d=0,e=0;c=H[a+640>>2];if(c){d=c;b=H[a+644>>2];if((c|0)!=(b|0)){while(1){d=b-12|0;e=H[d>>2];if(e){H[b-8>>2]=e;oa(e)}b=d;if((c|0)!=(b|0)){continue}break}d=H[a+640>>2]}H[a+644>>2]=c;oa(d)}c=H[a+628>>2];if(c){d=c;b=H[a+632>>2];if((c|0)!=(b|0)){while(1){d=b-12|0;e=H[d>>2];if(e){H[b-8>>2]=e;oa(e)}b=d;if((c|0)!=(b|0)){continue}break}d=H[a+628>>2]}H[a+632>>2]=c;oa(d)}b=H[a+616>>2];if(b){H[a+620>>2]=b;oa(b)}b=H[a+604>>2];if(b){H[a+608>>2]=b;oa(b)}Za(a+584|0);Za(a+564|0);Za(a+544|0)}function Tg(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0;d=ca-16|0;ca=d;H[d+12>>2]=0;a:{e=Ma(c);if(e>>>0<2147483632){b:{c:{if(e>>>0>=11){f=(e|15)+1|0;a=pa(f);H[d+8>>2]=f|-2147483648;H[d>>2]=a;H[d+4>>2]=e;f=a+e|0;break c}F[d+11|0]=e;f=d+e|0;a=d;if(!e){break b}}qa(a,c,e)}F[f|0]=0;a=nb(b,d);d:{if((a|0)==(b+4|0)){break d}b=H[a+32>>2];a=H[a+28>>2];if((b-a|0)!=4){break d}H[d+12>>2]=I[a|0]|I[a+1|0]<<8|(I[a+2|0]<<16|I[a+3|0]<<24)}a=H[d+12>>2];if(F[d+11|0]<0){oa(H[d>>2])}ca=d+16|0;break a}Na();v()}return a|0}function vb(a){var b=0,c=0,d=0,e=0;c=H[a+128>>2];if(c){d=c;b=H[a+132>>2];if((c|0)!=(b|0)){while(1){d=b-12|0;e=H[d>>2];if(e){H[b-8>>2]=e;oa(e)}b=d;if((c|0)!=(b|0)){continue}break}d=H[a+128>>2]}H[a+132>>2]=c;oa(d)}c=H[a+116>>2];if(c){d=c;b=H[a+120>>2];if((c|0)!=(b|0)){while(1){d=b-12|0;e=H[d>>2];if(e){H[b-8>>2]=e;oa(e)}b=d;if((c|0)!=(b|0)){continue}break}d=H[a+116>>2]}H[a+120>>2]=c;oa(d)}b=H[a+104>>2];if(b){H[a+108>>2]=b;oa(b)}b=H[a+92>>2];if(b){H[a+96>>2]=b;oa(b)}Za(a+72|0);Za(a+52|0);Za(a+32|0)}function kc(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0;a:{c=H[a+4>>2];e=H[a>>2];d=c-e|0;b:{if(d>>>0<b>>>0){g=b-d|0;f=H[a+8>>2];if(g>>>0<=f-c>>>0){h=a,i=ra(c,0,g)+g|0,H[h+4>>2]=i;break b}if((b|0)<0){break a}c=f-e|0;f=c<<1;c=c>>>0>=1073741823?2147483647:b>>>0<f>>>0?f:b;f=pa(c);ra(f+d|0,0,g);d=va(f,e,d);H[a+8>>2]=d+c;H[a+4>>2]=b+d;H[a>>2]=d;if(!e){break b}oa(e);break b}if(b>>>0>=d>>>0){break b}H[a+4>>2]=b+e}b=H[a+28>>2];c=b;d=b+1|0;b=H[a+24>>2]+1|0;e=b?c:d;H[a+24>>2]=b;H[a+28>>2]=e;return}sa();v()}function Ka(a,b){var c=0,d=0,e=0,f=0,g=0,h=0;e=H[a+4>>2];if((e|0)!=H[a+8>>2]){H[e>>2]=H[b>>2];H[a+4>>2]=e+4;return}a:{g=H[a>>2];f=e-g|0;c=f>>2;d=c+1|0;if(d>>>0<1073741824){h=c<<2;c=f>>>1|0;c=f>>>0>=2147483644?1073741823:c>>>0>d>>>0?c:d;if(c){if(c>>>0>=1073741824){break a}f=pa(c<<2)}else{f=0}d=h+f|0;H[d>>2]=H[b>>2];b=d+4|0;if((e|0)!=(g|0)){while(1){d=d-4|0;e=e-4|0;H[d>>2]=H[e>>2];if((e|0)!=(g|0)){continue}break}}H[a+8>>2]=f+(c<<2);H[a+4>>2]=b;H[a>>2]=d;if(g){oa(g)}return}sa();v()}wa();v()}function Ia(a){H[a>>2]=-1;H[a+4>>2]=0;H[a+8>>2]=0;H[a+32>>2]=0;H[a+36>>2]=0;F[a+28|0]=1;H[a+20>>2]=0;H[a+24>>2]=0;H[a+12>>2]=0;H[a+16>>2]=0;H[a+40>>2]=0;H[a+44>>2]=0;H[a+48>>2]=0;H[a+52>>2]=0;H[a+56>>2]=0;H[a+60>>2]=0;H[a+64>>2]=0;H[a+68>>2]=0;H[a+76>>2]=0;H[a+80>>2]=0;H[a+84>>2]=0;H[a+88>>2]=0;H[a+92>>2]=0;H[a+96>>2]=0;H[a+72>>2]=a+4;H[a+104>>2]=0;H[a+108>>2]=0;F[a+100|0]=1;H[a+112>>2]=0;H[a+116>>2]=0;H[a+120>>2]=0;H[a+124>>2]=0;H[a+128>>2]=0;H[a+132>>2]=0;H[a+136>>2]=0;H[a+140>>2]=0}function Ld(a,b){if(!a){return 0}a:{b:{if(a){if(b>>>0<=127){break b}c:{if(!H[H[4292]>>2]){if((b&-128)==57216){break b}break c}if(b>>>0<=2047){F[a+1|0]=b&63|128;F[a|0]=b>>>6|192;a=2;break a}if(!((b&-8192)!=57344&b>>>0>=55296)){F[a+2|0]=b&63|128;F[a|0]=b>>>12|224;F[a+1|0]=b>>>6&63|128;a=3;break a}if(b-65536>>>0<=1048575){F[a+3|0]=b&63|128;F[a|0]=b>>>18|240;F[a+2|0]=b>>>6&63|128;F[a+1|0]=b>>>12&63|128;a=4;break a}}H[3992]=25;a=-1}else{a=1}break a}F[a|0]=b;a=1}return a}function Hb(a,b){var c=0,d=0,e=0,f=0;d=H[a+12>>2];c=H[a+16>>2]-d>>2;a:{if(c>>>0<b>>>0){ya(a+12|0,b-c|0);break a}if(b>>>0>=c>>>0){break a}H[a+16>>2]=d+(b<<2)}b:{c=H[a>>2];c:{if(H[a+8>>2]-c>>2>>>0>=b>>>0){break c}if(b>>>0>=1073741824){break b}d=H[a+4>>2];e=b<<2;b=pa(e);e=b+e|0;f=b+(d-c&-4)|0;b=f;if((c|0)!=(d|0)){while(1){b=b-4|0;d=d-4|0;H[b>>2]=H[d>>2];if((c|0)!=(d|0)){continue}break}}H[a+8>>2]=e;H[a+4>>2]=f;H[a>>2]=b;if(!c){break c}oa(c)}return}sa();v()}function _b(a){a=a|0;var b=0,c=0,d=0;H[a>>2]=13724;b=H[a+68>>2];if(b){H[a+72>>2]=b;oa(b)}b=H[a+56>>2];if(b){H[a+60>>2]=b;oa(b)}b=H[a+44>>2];if(b){H[a+48>>2]=b;oa(b)}b=H[a+32>>2];if(b){H[a+36>>2]=b;oa(b)}b=H[a+20>>2];if(b){H[a+24>>2]=b;oa(b)}b=H[a+8>>2];if(b){d=b;c=H[a+12>>2];if((b|0)!=(c|0)){while(1){c=c-4|0;d=H[c>>2];H[c>>2]=0;if(d){Ga(d)}if((b|0)!=(c|0)){continue}break}d=H[a+8>>2]}H[a+12>>2]=b;oa(d)}b=H[a+4>>2];H[a+4>>2]=0;if(b){Uc(b)}return a|0}function yb(a,b,c){var d=0,e=0,f=0,g=0,h=0;f=ca-16|0;ca=f;d=ca-32|0;ca=d;e=ca-16|0;ca=e;H[e+12>>2]=b;H[e+8>>2]=b+c;H[d+24>>2]=H[e+12>>2];H[d+28>>2]=H[e+8>>2];ca=e+16|0;c=ca-16|0;ca=c;h=H[d+28>>2];e=H[d+24>>2];g=h-e|0;if((e|0)!=(h|0)){va(a,e,g)}H[c+12>>2]=e+g;H[c+8>>2]=a+g;H[d+16>>2]=H[c+12>>2];H[d+20>>2]=H[c+8>>2];ca=c+16|0;H[d+12>>2]=(H[d+16>>2]-b|0)+b;H[d+8>>2]=(H[d+20>>2]-a|0)+a;H[f+8>>2]=H[d+12>>2];H[f+12>>2]=H[d+8>>2];ca=d+32|0;ca=f+16|0}function ya(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0;e=H[a+8>>2];c=H[a+4>>2];if(e-c>>2>>>0>=b>>>0){if(b){b=b<<2;c=ra(c,0,b)+b|0}H[a+4>>2]=c;return}a:{f=c;c=H[a>>2];g=f-c|0;h=g>>2;d=h+b|0;if(d>>>0<1073741824){e=e-c|0;f=e>>>1|0;d=e>>>0>=2147483644?1073741823:d>>>0<f>>>0?f:d;if(d){if(d>>>0>=1073741824){break a}i=pa(d<<2)}b=b<<2;e=ra((h<<2)+i|0,0,b);f=d<<2;d=va(i,c,g);H[a+8>>2]=f+d;H[a+4>>2]=b+e;H[a>>2]=d;if(c){oa(c)}return}sa();v()}wa();v()}function Tc(a,b){var c=0,d=0,e=0,f=0;c=a+4|0;a=nb(a,b);a:{if((c|0)==(a|0)){break a}b=a+28|0;b=F[a+39|0]<0?H[b>>2]:b;while(1){a=b;b=a+1|0;c=F[a|0];if((c|0)==32|c-9>>>0<5){continue}break}b:{c:{d:{c=F[a|0];switch(c-43|0){case 0:break c;case 2:break d;default:break b}}e=1}c=F[b|0];a=b}if(c-48>>>0<10){while(1){d=(N(d,10)-F[a|0]|0)+48|0;b=F[a+1|0];a=a+1|0;if(b-48>>>0<10){continue}break}}a=e?d:0-d|0;if((a|0)==-1){break a}f=(a|0)!=0}return f}function bb(a,b){var c=0,d=0,e=0,f=0,g=0,h=0;a=H[a>>2];c=H[a+4>>2];e=H[a+8>>2];if(c>>>0<e>>>0){H[c>>2]=H[b>>2];H[a+4>>2]=c+4;return}a:{d=c;c=H[a>>2];g=d-c|0;d=g>>2;f=d+1|0;if(f>>>0<1073741824){h=d<<2;e=e-c|0;d=e>>>1|0;f=e>>>0>=2147483644?1073741823:f>>>0<d>>>0?d:f;if(f){if(f>>>0>=1073741824){break a}e=pa(f<<2)}else{e=0}d=h+e|0;H[d>>2]=H[b>>2];b=va(e,c,g);H[a+8>>2]=b+(f<<2);H[a+4>>2]=d+4;H[a>>2]=b;if(c){oa(c)}return}sa();v()}wa();v()}function ob(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0;e=H[a+8>>2];c=H[a+4>>2];if(e-c>>3>>>0>=b>>>0){if(b){b=b<<3;c=ra(c,0,b)+b|0}H[a+4>>2]=c;return}a:{f=c;c=H[a>>2];g=f-c|0;h=g>>3;d=h+b|0;if(d>>>0<536870912){e=e-c|0;f=e>>>2|0;d=e>>>0>=2147483640?536870911:d>>>0<f>>>0?f:d;if(d){if(d>>>0>=536870912){break a}i=pa(d<<3)}b=b<<3;e=ra((h<<3)+i|0,0,b);f=d<<3;d=va(i,c,g);H[a+8>>2]=f+d;H[a+4>>2]=b+e;H[a>>2]=d;if(c){oa(c)}return}sa();v()}wa();v()}function kf(a){a=a|0;var b=0,c=0,d=0;H[a>>2]=2328;b=H[a+60>>2];H[a+60>>2]=0;if(b){ea[H[H[b>>2]+4>>2]](b)}b=H[a+48>>2];if(b){H[a+52>>2]=b;oa(b)}d=H[a+36>>2];if(d){c=H[a+40>>2];b=d;if((c|0)!=(b|0)){while(1){c=c-4|0;b=H[c>>2];H[c>>2]=0;if(b){ea[H[H[b>>2]+4>>2]](b)}if((c|0)!=(d|0)){continue}break}b=H[a+36>>2]}H[a+40>>2]=d;oa(b)}H[a>>2]=1984;b=H[a+16>>2];if(b){H[a+20>>2]=b;oa(b)}b=H[a+4>>2];if(b){H[a+8>>2]=b;oa(b)}return a|0}function jf(a){a=a|0;var b=0,c=0,d=0;H[a>>2]=2328;b=H[a+60>>2];H[a+60>>2]=0;if(b){ea[H[H[b>>2]+4>>2]](b)}b=H[a+48>>2];if(b){H[a+52>>2]=b;oa(b)}d=H[a+36>>2];if(d){c=H[a+40>>2];b=d;if((c|0)!=(b|0)){while(1){c=c-4|0;b=H[c>>2];H[c>>2]=0;if(b){ea[H[H[b>>2]+4>>2]](b)}if((c|0)!=(d|0)){continue}break}b=H[a+36>>2]}H[a+40>>2]=d;oa(b)}H[a>>2]=1984;b=H[a+16>>2];if(b){H[a+20>>2]=b;oa(b)}b=H[a+4>>2];if(b){H[a+8>>2]=b;oa(b)}oa(a)}function xi(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0;d=ca-16|0;ca=d;e=H[a+4>>2];a:{if((e|0)==-1){break a}c=H[b+20>>2];if(!!H[b+16>>2]&(c|0)>=0|(c|0)>0){break a}Wb(b,H[b+4>>2],H[a+8>>2],H[a+12>>2]);c=H[b+20>>2];if(!!H[b+16>>2]&(c|0)>=0|(c|0)>0){break a}Wb(b,H[b+4>>2],a+20|0,a+24|0);c=H[b+20>>2];f=H[b+16>>2];F[d+15|0]=H[a+4>>2];if(!!f&(c|0)>=0|(c|0)>0){break a}Wb(b,H[b+4>>2],d+15|0,d+16|0)}ca=d+16|0;return(e|0)!=-1|0}function Eh(a){a=a|0;var b=0,c=0,d=0,e=0,f=0;a:{b=H[a+8>>2];b:{if((b|0)<0){break b}c=H[a+4>>2];e=H[c>>2];d=H[c+4>>2]-e>>2;c:{if(d>>>0<b>>>0){ue(c,b-d|0);f=H[a+8>>2];break c}f=b;if(b>>>0>=d>>>0){break c}H[c+4>>2]=e+(b<<2);f=b}d=f;if((d|0)<=0){break b}a=H[a+4>>2];c=H[a>>2];e=H[a+4>>2]-c>>2;a=0;while(1){if((a|0)==(e|0)){break a}H[c+(a<<2)>>2]=a;a=a+1|0;if((d|0)!=(a|0)){continue}break}}return(b^-1)>>>31|0}Ca();v()}function qe(a,b){var c=0,d=0,e=0,f=0,g=0,h=0;e=H[a+8>>2];c=H[a+4>>2];if(e-c>>1>>>0>=b>>>0){if(b){b=b<<1;c=ra(c,0,b)+b|0}H[a+4>>2]=c;return}a:{f=c;c=H[a>>2];g=f-c|0;f=g>>1;d=f+b|0;if((d|0)>=0){e=e-c|0;d=e>>>0>=2147483646?2147483647:d>>>0<e>>>0?e:d;if(d){if((d|0)<0){break a}h=pa(d<<1)}b=b<<1;e=ra((f<<1)+h|0,0,b);f=d<<1;d=va(h,c,g);H[a+8>>2]=f+d;H[a+4>>2]=b+e;H[a>>2]=d;if(c){oa(c)}return}sa();v()}wa();v()}function ng(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0;d=ca-16|0;ca=d;Pe(d,a,b,c);H[a+24>>2]=H[d>>2];e=a+24|0;a:{if((e|0)==(d|0)){break a}b=a+28|0;c=d|4;f=I[d+15|0];g=f<<24>>24;if(F[a+39|0]>=0){if((g|0)>=0){a=H[c+4>>2];H[b>>2]=H[c>>2];H[b+4>>2]=a;H[b+8>>2]=H[c+8>>2];break a}Xb(b,H[d+4>>2],H[d+8>>2]);break a}a=(g|0)<0;Yb(b,a?H[d+4>>2]:c,a?H[d+8>>2]:f)}if(F[d+15|0]<0){oa(H[d+4>>2])}ca=d+16|0;return e|0}function mg(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0;d=ca-16|0;ca=d;Oe(d,a,b,c);H[a+24>>2]=H[d>>2];e=a+24|0;a:{if((e|0)==(d|0)){break a}b=a+28|0;c=d|4;f=I[d+15|0];g=f<<24>>24;if(F[a+39|0]>=0){if((g|0)>=0){a=H[c+4>>2];H[b>>2]=H[c>>2];H[b+4>>2]=a;H[b+8>>2]=H[c+8>>2];break a}Xb(b,H[d+4>>2],H[d+8>>2]);break a}a=(g|0)<0;Yb(b,a?H[d+4>>2]:c,a?H[d+8>>2]:f)}if(F[d+15|0]<0){oa(H[d+4>>2])}ca=d+16|0;return e|0}function za(a,b,c){var d=0,e=0,f=0,g=0;e=ca-16|0;ca=e;a:{b:{if(c>>>0<11){d=a;F[a+11|0]=I[a+11|0]&128|c;F[a+11|0]=I[a+11|0]&127;break b}if(c>>>0>2147483631){break a}g=e+8|0;if(c>>>0>=11){f=c+16&-16;d=f-1|0;d=(d|0)==11?f:d}else{d=10}Zb(g,d+1|0);d=H[e+8>>2];H[a>>2]=d;H[a+8>>2]=H[a+8>>2]&-2147483648|H[e+12>>2]&2147483647;H[a+8>>2]=H[a+8>>2]|-2147483648;H[a+4>>2]=c}yb(d,b,c+1|0);ca=e+16|0;return}Na();v()}function Qg(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0;d=ca-16|0;ca=d;a:{e=Ma(c);if(e>>>0<2147483632){b:{c:{if(e>>>0>=11){g=(e|15)+1|0;f=pa(g);H[d+8>>2]=g|-2147483648;H[d>>2]=f;H[d+4>>2]=e;g=e+f|0;break c}F[d+11|0]=e;g=d+e|0;f=d;if(!e){break b}}qa(f,c,e)}F[g|0]=0;f=a+16|0;c=$d(b,d,f);b=H[a+16>>2];a=F[a+27|0];if(F[d+11|0]<0){oa(H[d>>2])}ca=d+16|0;a=c?(a|0)<0?b:f:0;break a}Na();v()}return a|0}function Mc(a,b){var c=0,d=0,e=0;c=H[a+4>>2];d=c+b|0;H[a+4>>2]=d;if(!((d-1^c-1)>>>0<32?c:0)){H[H[a>>2]+((d>>>0>=33?d-1>>>5|0:0)<<2)>>2]=0}a:{if(!b){break a}a=H[a>>2]+(c>>>3&536870908)|0;c=c&31;if(c){d=32-c|0;e=b>>>0>d>>>0?d:b;H[a>>2]=H[a>>2]&(-1<<c&-1>>>d-e^-1);b=b-e|0;a=a+4|0}c=b>>>5|0;if(b>>>0>=32){ra(a,0,c<<2)}if((b&-32)==(b|0)){break a}a=(c<<2)+a|0;H[a>>2]=H[a>>2]&(-1>>>32-(b&31)^-1)}}function Fc(a,b,c){var d=0,e=0,f=0;d=H[c+16>>2];a:{if(!d){if(Sd(c)){break a}d=H[c+16>>2]}f=H[c+20>>2];if(d-f>>>0<b>>>0){return ea[H[c+36>>2]](c,a,b)|0}b:{if(H[c+80>>2]<0){d=0;break b}e=b;while(1){d=e;if(!d){d=0;break b}e=d-1|0;if(I[e+a|0]!=10){continue}break}e=ea[H[c+36>>2]](c,a,d)|0;if(e>>>0<d>>>0){break a}a=a+d|0;b=b-d|0;f=H[c+20>>2]}qa(f,a,b);H[c+20>>2]=H[c+20>>2]+b;e=b+d|0}return e}function ad(a){var b=0,c=0,d=0,e=0;if(I[a+76|0]){F[a+76|0]=0;e=H[a+60>>2];c=H[a+72>>2]+7|0;b=c>>>0<7?1:b;d=b<<29|c>>>3;c=d+H[a+56>>2]|0;b=(b>>>3|0)+e|0;H[a+56>>2]=c;H[a+60>>2]=c>>>0<d>>>0?b+1|0:b}if(J[a+38>>1]<=513){F[a+132|0]=0;e=H[a+116>>2];b=0;c=H[a+128>>2]+7|0;b=c>>>0<7?1:b;d=b<<29|c>>>3;c=d+H[a+112>>2]|0;b=(b>>>3|0)+e|0;H[a+112>>2]=c;H[a+116>>2]=c>>>0<d>>>0?b+1|0:b}}function re(a,b,c){var d=0,e=0,f=0,g=0;a:{if(a>>>0>10){break a}d=H[c+20>>2];f=H[c+12>>2];e=H[c+16>>2];if((d|0)>=(f|0)&e>>>0>=K[c+8>>2]|(d|0)>(f|0)){break a}f=F[e+H[c>>2]|0];e=e+1|0;d=e?d:d+1|0;H[c+16>>2]=e;H[c+20>>2]=d;d=f;b:{if((d|0)<0){if(!re(a+1|0,b,c)){break a}a=H[b>>2];d=d&127|a<<7;a=H[b+4>>2]<<7|a>>>25;break b}d=d&255;a=0}H[b>>2]=d;H[b+4>>2]=a;g=1}return g}function gb(a,b,c){var d=0,e=0,f=0,g=0;a:{if(a>>>0>10){break a}d=H[c+20>>2];f=H[c+12>>2];e=H[c+16>>2];if((d|0)>=(f|0)&e>>>0>=K[c+8>>2]|(d|0)>(f|0)){break a}f=F[e+H[c>>2]|0];e=e+1|0;d=e?d:d+1|0;H[c+16>>2]=e;H[c+20>>2]=d;d=f;b:{if((d|0)<0){if(!gb(a+1|0,b,c)){break a}a=H[b>>2];d=d&127|a<<7;a=H[b+4>>2]<<7|a>>>25;break b}d=d&255;a=0}H[b>>2]=d;H[b+4>>2]=a;g=1}return g}function Nh(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0;e=ca+-64|0;ca=e;d=ea[H[H[a>>2]+44>>2]](a,b)|0;a=ea[H[H[a>>2]+40>>2]](a,b)|0;f=Eb(e);g=H[b+56>>2];h=d&255;i=a;a=a-1|0;if(a>>>0<=10){a=H[(a<<2)+13584>>2]}else{a=-1}d=N(a,d);lc(f,g,h,i,0,d,d>>31);a=jc(pa(96),f);mb(a,c);F[a+84|0]=1;H[a+72>>2]=H[a+68>>2];H[a+60>>2]=H[b+60>>2];ca=e- -64|0;return a|0}function If(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;if(Ya(a,H[b+8>>2],e)){if(!(H[b+28>>2]==1|H[b+4>>2]!=(c|0))){H[b+28>>2]=d}return}a:{if(!Ya(a,H[b>>2],e)){break a}if(!(H[b+16>>2]!=(c|0)&H[b+20>>2]!=(c|0))){if((d|0)!=1){break a}H[b+32>>2]=1;return}H[b+20>>2]=c;H[b+32>>2]=d;H[b+40>>2]=H[b+40>>2]+1;if(!(H[b+36>>2]!=1|H[b+24>>2]!=2)){F[b+54|0]=1}H[b+44>>2]=4}}function Bh(a){a=a|0;var b=0,c=0,d=0,e=0,f=0,g=0,h=0;e=H[a+32>>2];b=e;h=H[b+8>>2];g=H[b+12>>2];c=H[b+16>>2];b=H[b+20>>2];f=c+4|0;b=f>>>0<4?b+1|0:b;d=0;a:{if(f>>>0>h>>>0&(b|0)>=(g|0)|(b|0)>(g|0)){break a}c=H[e>>2]+c|0;c=I[c|0]|I[c+1|0]<<8|(I[c+2|0]<<16|I[c+3|0]<<24);H[e+16>>2]=f;H[e+20>>2]=b;d=0;if((c|0)<0){break a}H[H[a+4>>2]+80>>2]=c;d=1}return d|0}function qi(a){a=a|0;var b=0,c=0,d=0;H[a>>2]=11276;b=H[a+48>>2];H[a+48>>2]=0;if(b){ea[H[H[b>>2]+4>>2]](b)}H[a>>2]=13280;b=H[a+20>>2];if(b){H[a+24>>2]=b;oa(b)}d=H[a+8>>2];if(d){c=H[a+12>>2];b=d;if((c|0)!=(b|0)){while(1){c=c-4|0;b=H[c>>2];H[c>>2]=0;if(b){ea[H[H[b>>2]+4>>2]](b)}if((c|0)!=(d|0)){continue}break}b=H[a+8>>2]}H[a+12>>2]=d;oa(b)}return a|0}function Ee(a,b){var c=0,d=0,e=0,f=0;H[a+144>>2]=b;c=H[(ea[H[H[b>>2]+32>>2]](b)|0)+32>>2];c=H[c>>2]+H[c+16>>2]|0;d=H[(ea[H[H[b>>2]+32>>2]](b)|0)+32>>2];d=H[d+8>>2]-H[d+16>>2]|0;e=a,f=J[H[(ea[H[H[b>>2]+32>>2]](b)|0)+32>>2]+38>>1],G[e+38>>1]=f;H[a>>2]=c;H[a+16>>2]=0;H[a+20>>2]=0;H[a+8>>2]=d;H[a+12>>2]=0;e=a,f=ea[H[H[b>>2]+36>>2]](b)|0,H[e+148>>2]=f}function Cd(a,b,c,d){F[a+53|0]=1;a:{if(H[a+4>>2]!=(c|0)){break a}F[a+52|0]=1;c=H[a+16>>2];b:{if(!c){H[a+36>>2]=1;H[a+24>>2]=d;H[a+16>>2]=b;if((d|0)!=1){break a}if(H[a+48>>2]==1){break b}break a}if((b|0)==(c|0)){c=H[a+24>>2];if((c|0)==2){H[a+24>>2]=d;c=d}if(H[a+48>>2]!=1){break a}if((c|0)==1){break b}break a}H[a+36>>2]=H[a+36>>2]+1}F[a+54|0]=1}}function pi(a){a=a|0;var b=0,c=0,d=0;H[a>>2]=11276;b=H[a+48>>2];H[a+48>>2]=0;if(b){ea[H[H[b>>2]+4>>2]](b)}H[a>>2]=13280;b=H[a+20>>2];if(b){H[a+24>>2]=b;oa(b)}d=H[a+8>>2];if(d){c=H[a+12>>2];b=d;if((c|0)!=(b|0)){while(1){c=c-4|0;b=H[c>>2];H[c>>2]=0;if(b){ea[H[H[b>>2]+4>>2]](b)}if((c|0)!=(d|0)){continue}break}b=H[a+8>>2]}H[a+12>>2]=d;oa(b)}oa(a)}function zh(a){a=a|0;var b=0,c=0,d=0,e=0,f=0,g=0;e=H[a+32>>2];b=e;g=H[b+8>>2];d=H[b+12>>2];c=H[b+16>>2];b=H[b+20>>2];f=d;d=c+4|0;b=d>>>0<4?b+1|0:b;if((f|0)>=(b|0)&d>>>0<=g>>>0|(b|0)<(f|0)){c=H[e>>2]+c|0;c=I[c|0]|I[c+1|0]<<8|(I[c+2|0]<<16|I[c+3|0]<<24);H[e+16>>2]=d;H[e+20>>2]=b;H[H[a+4>>2]+80>>2]=c}return(b|0)<=(f|0)&d>>>0<=g>>>0|(b|0)<(f|0)}function Mf(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;e=ca+-64|0;ca=e;d=1;a:{if(Ya(a,b,0)){break a}d=0;if(!b){break a}b=Ed(b,14972);d=0;if(!b){break a}d=e+8|0;ra(d|4,0,52);H[e+56>>2]=1;H[e+20>>2]=-1;H[e+16>>2]=a;H[e+8>>2]=b;ea[H[H[b>>2]+28>>2]](b,d,H[c>>2],1);a=H[e+32>>2];if((a|0)==1){H[c>>2]=H[e+24>>2]}d=(a|0)==1}ca=e- -64|0;return d|0}function Ie(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;d=ca-16|0;ca=d;H[a+4>>2]=b;b=H[b+64>>2];e=H[b>>2];b=H[b+4>>2];F[d+15|0]=0;Oa(a+24|0,(b-e>>2>>>0)/3|0,d+15|0);b=H[a+4>>2];e=H[b+56>>2];b=H[b+52>>2];F[d+14|0]=0;Oa(a+36|0,e-b>>2,d+14|0);b=H[c+12>>2];H[a+16>>2]=H[c+8>>2];H[a+20>>2]=b;b=H[c+4>>2];H[a+8>>2]=H[c>>2];H[a+12>>2]=b;ca=d+16|0}function pc(a,b,c){var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;if(!b){H[c>>2]=0;return}h=0-I[a+12|0]&255;e=H[a+4>>2];d=H[a+8>>2];i=H[a>>2];while(1){j=f<<1;if(!((e|0)<=0|d>>>0>4095)){e=e-1|0;H[a+4>>2]=e;d=I[e+i|0]|d<<8}g=d&255;f=g>>>0<h>>>0;k=g;g=N(d>>>8|0,h);d=f?k+g|0:d-(h+g|0)|0;H[a+8>>2]=d;f=f|j;b=b-1|0;if(b){continue}break}H[c>>2]=f}function yg(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0;a=ca-16|0;ca=a;f=F[b+24|0];e=H[3411];H[a+8>>2]=H[3410];H[a+12>>2]=e;e=H[3409];H[a>>2]=H[3408];H[a+4>>2]=e;e=Va(b,c,f,a);if(e){b=0;if(f){c=(f&255)<<2;b=pa(c);g=qa(b,a,c)+c|0}c=H[d>>2];if(c){H[d+4>>2]=c;oa(c)}H[d+8>>2]=g;H[d+4>>2]=g;H[d>>2]=b}ca=a+16|0;return e|0}function of(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0;f=ea[H[H[a>>2]+24>>2]](a)|0;c=1;a:{if((f|0)<=0){break a}d=H[H[a+36>>2]>>2];g=a+48|0;c=0;if(!(ea[H[H[d>>2]+16>>2]](d,g,b)|0)){break a}while(1){e=e+1|0;if((f|0)!=(e|0)){d=H[H[a+36>>2]+(e<<2)>>2];if(ea[H[H[d>>2]+16>>2]](d,g,b)|0){continue}}break}c=(e|0)>=(f|0)}return c|0}function nf(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0;f=ea[H[H[a>>2]+24>>2]](a)|0;c=1;a:{if((f|0)<=0){break a}d=H[H[a+36>>2]>>2];g=a+48|0;c=0;if(!(ea[H[H[d>>2]+20>>2]](d,g,b)|0)){break a}while(1){e=e+1|0;if((f|0)!=(e|0)){d=H[H[a+36>>2]+(e<<2)>>2];if(ea[H[H[d>>2]+20>>2]](d,g,b)|0){continue}}break}c=(e|0)>=(f|0)}return c|0}function _c(a,b){var c=0,d=0;a:{c=H[a+4>>2];d=H[a+8>>2];if((c|0)==d<<5){if((c+1|0)<0){break a}if(c>>>0<=1073741822){d=d<<6;c=(c&-32)+32|0;c=c>>>0<d>>>0?d:c}else{c=2147483647}pb(a,c);c=H[a+4>>2]}H[a+4>>2]=c+1;d=1<<c;a=H[a>>2]+(c>>>3&536870908)|0;if(I[b|0]){H[a>>2]=d|H[a>>2];return}H[a>>2]=H[a>>2]&(d^-1);return}sa();v()}function $h(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;d=ca-16|0;ca=d;H[a+4>>2]=b;e=H[b>>2];b=H[b+4>>2];F[d+15|0]=0;Oa(a+24|0,(b-e>>2>>>0)/3|0,d+15|0);b=H[a+4>>2];e=H[b+28>>2];b=H[b+24>>2];F[d+14|0]=0;Oa(a+36|0,e-b>>2,d+14|0);b=H[c+12>>2];H[a+16>>2]=H[c+8>>2];H[a+20>>2]=b;b=H[c+4>>2];H[a+8>>2]=H[c>>2];H[a+12>>2]=b;ca=d+16|0}function $b(a){var b=0;H[a>>2]=0;H[a+4>>2]=0;H[a+56>>2]=0;H[a+48>>2]=0;H[a+52>>2]=0;H[a+40>>2]=0;H[a+44>>2]=0;H[a+32>>2]=0;H[a+36>>2]=0;H[a+24>>2]=0;H[a+28>>2]=0;H[a+16>>2]=0;H[a+20>>2]=0;H[a+8>>2]=0;H[a+12>>2]=0;b=a- -64|0;H[b>>2]=0;H[b+4>>2]=0;H[a+72>>2]=0;H[a+76>>2]=0;H[a+80>>2]=0;H[a+84>>2]=0;H[a+60>>2]=a;return a}function td(a,b,c){var d=0,e=0,f=0,g=0;a:{if(a>>>0>5){break a}d=H[c+20>>2];e=H[c+12>>2];f=H[c+16>>2];if((d|0)>=(e|0)&f>>>0>=K[c+8>>2]|(d|0)>(e|0)){break a}e=I[H[c>>2]+f|0];f=f+1|0;d=f?d:d+1|0;H[c+16>>2]=f;H[c+20>>2]=d;d=e<<24>>24;if((d|0)<0){if(!td(a+1|0,b,c)){break a}e=d&127|H[b>>2]<<7}H[b>>2]=e;g=1}return g}\nfunction hb(a,b,c){var d=0,e=0,f=0,g=0;a:{if(a>>>0>5){break a}d=H[c+20>>2];e=H[c+12>>2];f=H[c+16>>2];if((d|0)>=(e|0)&f>>>0>=K[c+8>>2]|(d|0)>(e|0)){break a}e=I[H[c>>2]+f|0];f=f+1|0;d=f?d:d+1|0;H[c+16>>2]=f;H[c+20>>2]=d;d=e<<24>>24;if((d|0)<0){if(!hb(a+1|0,b,c)){break a}e=d&127|H[b>>2]<<7}H[b>>2]=e;g=1}return g}function Xa(a,b,c){var d=0,e=0,f=0,g=0;a:{if(a>>>0>5){break a}d=H[c+20>>2];e=H[c+12>>2];f=H[c+16>>2];if((d|0)>=(e|0)&f>>>0>=K[c+8>>2]|(d|0)>(e|0)){break a}e=I[H[c>>2]+f|0];f=f+1|0;d=f?d:d+1|0;H[c+16>>2]=f;H[c+20>>2]=d;d=e<<24>>24;if((d|0)<0){if(!Xa(a+1|0,b,c)){break a}e=d&127|H[b>>2]<<7}H[b>>2]=e;g=1}return g}function Qe(a,b,c){var d=0,e=0,f=0,g=0;a:{if(a>>>0>5){break a}d=H[c+20>>2];e=H[c+12>>2];f=H[c+16>>2];if((d|0)>=(e|0)&f>>>0>=K[c+8>>2]|(d|0)>(e|0)){break a}e=I[H[c>>2]+f|0];f=f+1|0;d=f?d:d+1|0;H[c+16>>2]=f;H[c+20>>2]=d;d=e<<24>>24;if((d|0)<0){if(!Qe(a+1|0,b,c)){break a}e=d&127|H[b>>2]<<7}H[b>>2]=e;g=1}return g}function Pc(a,b,c){var d=0,e=0,f=0,g=0;a:{if(a>>>0>5){break a}d=H[c+20>>2];e=H[c+12>>2];f=H[c+16>>2];if((d|0)>=(e|0)&f>>>0>=K[c+8>>2]|(d|0)>(e|0)){break a}e=I[H[c>>2]+f|0];f=f+1|0;d=f?d:d+1|0;H[c+16>>2]=f;H[c+20>>2]=d;d=e<<24>>24;if((d|0)<0){if(!Pc(a+1|0,b,c)){break a}e=d&127|H[b>>2]<<7}H[b>>2]=e;g=1}return g}function Fb(a,b,c){var d=0,e=0,f=0,g=0;a:{if(a>>>0>5){break a}d=H[c+20>>2];e=H[c+12>>2];f=H[c+16>>2];if((d|0)>=(e|0)&f>>>0>=K[c+8>>2]|(d|0)>(e|0)){break a}e=I[H[c>>2]+f|0];f=f+1|0;d=f?d:d+1|0;H[c+16>>2]=f;H[c+20>>2]=d;d=e<<24>>24;if((d|0)<0){if(!Fb(a+1|0,b,c)){break a}e=d&127|H[b>>2]<<7}H[b>>2]=e;g=1}return g}function Ea(a,b,c){var d=0,e=0,f=0,g=0;a:{if(a>>>0>5){break a}d=H[c+20>>2];e=H[c+12>>2];f=H[c+16>>2];if((d|0)>=(e|0)&f>>>0>=K[c+8>>2]|(d|0)>(e|0)){break a}e=I[H[c>>2]+f|0];f=f+1|0;d=f?d:d+1|0;H[c+16>>2]=f;H[c+20>>2]=d;d=e<<24>>24;if((d|0)<0){if(!Ea(a+1|0,b,c)){break a}e=d&127|H[b>>2]<<7}H[b>>2]=e;g=1}return g}function Bb(a,b,c){var d=0,e=0,f=0,g=0;a:{if(a>>>0>5){break a}d=H[c+20>>2];e=H[c+12>>2];f=H[c+16>>2];if((d|0)>=(e|0)&f>>>0>=K[c+8>>2]|(d|0)>(e|0)){break a}e=I[H[c>>2]+f|0];f=f+1|0;d=f?d:d+1|0;H[c+16>>2]=f;H[c+20>>2]=d;d=e<<24>>24;if((d|0)<0){if(!Bb(a+1|0,b,c)){break a}e=d&127|H[b>>2]<<7}H[b>>2]=e;g=1}return g}function Fa(a,b,c){var d=0,e=0;a:{b:{if(c>>>0>=4){if((a|b)&3){break b}while(1){if(H[a>>2]!=H[b>>2]){break b}b=b+4|0;a=a+4|0;c=c-4|0;if(c>>>0>3){continue}break}}if(!c){break a}}while(1){d=I[a|0];e=I[b|0];if((d|0)==(e|0)){b=b+1|0;a=a+1|0;c=c-1|0;if(c){continue}break a}break}return d-e|0}return 0}function Yc(a){var b=0,c=0,d=0,e=0;d=H[a>>2];if(d){e=d;c=H[a+4>>2];if((d|0)!=(c|0)){while(1){e=c-144|0;b=H[e+132>>2];if(b){H[c-8>>2]=b;oa(b)}b=H[c-28>>2];if(b){H[c-24>>2]=b;oa(b)}b=H[c-40>>2];if(b){H[c-36>>2]=b;oa(b)}oc(c-140|0);c=e;if((d|0)!=(c|0)){continue}break}e=H[a>>2]}H[a+4>>2]=d;oa(e)}}function Dg(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;d=H[b+4>>2];a:{if(!d){break a}b=H[H[H[b+8>>2]+(c<<2)>>2]+60>>2];if((b|0)<0){break a}a=H[d+24>>2];c=H[d+28>>2];if((a|0)==(c|0)){break a}b:{while(1){e=H[a>>2];if((b|0)==H[e+24>>2]){break b}a=a+4|0;if((c|0)!=(a|0)){continue}break}e=0}}return e|0}function Zh(a){a=a|0;var b=0;H[a+8>>2]=12384;H[a>>2]=12172;b=H[a+96>>2];if(b){H[a+100>>2]=b;oa(b)}b=H[a+80>>2];if(b){H[a+84>>2]=b;oa(b)}b=H[a+68>>2];if(b){H[a+72>>2]=b;oa(b)}b=H[a+56>>2];if(b){H[a+60>>2]=b;oa(b)}H[a+8>>2]=12620;b=H[a+44>>2];if(b){oa(b)}b=H[a+32>>2];if(b){oa(b)}return a|0}function Uc(a){var b=0,c=0,d=0;if(a){d=H[a+24>>2];if(d){b=d;c=H[a+28>>2];if((b|0)!=(c|0)){while(1){c=c-4|0;b=H[c>>2];H[c>>2]=0;if(b){Ra(b+12|0,H[b+16>>2]);Qa(b,H[b+4>>2]);oa(b)}if((c|0)!=(d|0)){continue}break}b=H[a+24>>2]}H[a+28>>2]=d;oa(b)}Ra(a+12|0,H[a+16>>2]);Qa(a,H[a+4>>2]);oa(a)}}function Yh(a){a=a|0;var b=0;H[a+8>>2]=12384;H[a>>2]=12172;b=H[a+96>>2];if(b){H[a+100>>2]=b;oa(b)}b=H[a+80>>2];if(b){H[a+84>>2]=b;oa(b)}b=H[a+68>>2];if(b){H[a+72>>2]=b;oa(b)}b=H[a+56>>2];if(b){H[a+60>>2]=b;oa(b)}H[a+8>>2]=12620;b=H[a+44>>2];if(b){oa(b)}b=H[a+32>>2];if(b){oa(b)}oa(a)}function vi(a){a=a|0;var b=0,c=0,d=0;H[a>>2]=13280;b=H[a+20>>2];if(b){H[a+24>>2]=b;oa(b)}d=H[a+8>>2];if(d){c=H[a+12>>2];b=d;if((c|0)!=(b|0)){while(1){c=c-4|0;b=H[c>>2];H[c>>2]=0;if(b){ea[H[H[b>>2]+4>>2]](b)}if((c|0)!=(d|0)){continue}break}b=H[a+8>>2]}H[a+12>>2]=d;oa(b)}return a|0}function xc(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0;h=H[c+8>>2];e=H[c+16>>2];g=H[c+12>>2];f=g;d=H[c+20>>2];if(h>>>0>e>>>0&(f|0)>=(d|0)|(d|0)<(f|0)){b=I[H[c>>2]+e|0];i=e+1|0;f=i?d:d+1|0;H[c+16>>2]=i;H[c+20>>2]=f;H[a+4>>2]=b}return e>>>0<h>>>0&(d|0)<=(g|0)|(d|0)<(g|0)}function Wc(a){a=a|0;var b=0,c=0,d=0;H[a>>2]=13280;b=H[a+20>>2];if(b){H[a+24>>2]=b;oa(b)}d=H[a+8>>2];if(d){c=H[a+12>>2];b=d;if((c|0)!=(b|0)){while(1){c=c-4|0;b=H[c>>2];H[c>>2]=0;if(b){ea[H[H[b>>2]+4>>2]](b)}if((c|0)!=(d|0)){continue}break}b=H[a+8>>2]}H[a+12>>2]=d;oa(b)}oa(a)}function Ya(a,b,c){var d=0;if(!c){return H[a+4>>2]==H[b+4>>2]}if((a|0)==(b|0)){return 1}d=H[a+4>>2];a=I[d|0];c=H[b+4>>2];b=I[c|0];a:{if(!a|(b|0)!=(a|0)){break a}while(1){b=I[c+1|0];a=I[d+1|0];if(!a){break a}c=c+1|0;d=d+1|0;if((a|0)==(b|0)){continue}break}}return(a|0)==(b|0)}function _h(a){a=a|0;var b=0;H[a>>2]=12384;b=H[a+88>>2];if(b){H[a+92>>2]=b;oa(b)}b=H[a+72>>2];if(b){H[a+76>>2]=b;oa(b)}b=H[a+60>>2];if(b){H[a- -64>>2]=b;oa(b)}b=H[a+48>>2];if(b){H[a+52>>2]=b;oa(b)}H[a>>2]=12620;b=H[a+36>>2];if(b){oa(b)}b=H[a+24>>2];if(b){oa(b)}return a|0}function Fg(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;d=H[b+12>>2];b=H[b+8>>2];a=0;a:{if((d|0)==(b|0)){break a}a=d-b>>2;d=a>>>0<=1?1:a;a=0;b:{while(1){e=H[b+(a<<2)>>2];if(H[e+60>>2]==(c|0)){break b}a=a+1|0;if((d|0)!=(a|0)){continue}break}a=0;break a}a=(a|0)!=-1?e:0}return a|0}function ae(a,b){var c=0,d=0,e=0;H[a+8>>2]=0;H[a>>2]=0;H[a+4>>2]=0;a:{c=H[b+4>>2];d=H[b>>2];b:{if((c|0)==(d|0)){a=c;break b}c=c-d|0;if((c|0)<0){break a}d=c;e=pa(c);c=ra(e,0,c);d=d+c|0;H[a+8>>2]=d;H[a+4>>2]=d;H[a>>2]=c;c=H[b>>2];a=H[b+4>>2]}qa(e,c,a-c|0);return}sa();v()}function ed(a){var b=0,c=0,d=0,e=0;c=H[a+4>>2];d=H[a>>2];if((c|0)!=(d|0)){while(1){e=c-144|0;b=H[e+132>>2];if(b){H[c-8>>2]=b;oa(b)}b=H[c-28>>2];if(b){H[c-24>>2]=b;oa(b)}b=H[c-40>>2];if(b){H[c-36>>2]=b;oa(b)}oc(c-140|0);c=e;if((d|0)!=(c|0)){continue}break}}H[a+4>>2]=d}function Vh(a){a=a|0;var b=0;H[a>>2]=12384;b=H[a+88>>2];if(b){H[a+92>>2]=b;oa(b)}b=H[a+72>>2];if(b){H[a+76>>2]=b;oa(b)}b=H[a+60>>2];if(b){H[a- -64>>2]=b;oa(b)}b=H[a+48>>2];if(b){H[a+52>>2]=b;oa(b)}H[a>>2]=12620;b=H[a+36>>2];if(b){oa(b)}b=H[a+24>>2];if(b){oa(b)}oa(a)}function cb(a){var b=0;if(a){b=H[a+76>>2];if(b){H[a+80>>2]=b;oa(b)}b=H[a- -64>>2];if(b){H[a+68>>2]=b;oa(b)}b=H[a+48>>2];if(b){H[a+52>>2]=b;oa(b)}b=H[a+24>>2];if(b){H[a+28>>2]=b;oa(b)}b=H[a+12>>2];if(b){H[a+16>>2]=b;oa(b)}b=H[a>>2];if(b){H[a+4>>2]=b;oa(b)}oa(a)}}function Jd(a,b,c){var d=0,e=0,f=0,g=0;f=ca-16|0;ca=f;d=ca-16|0;ca=d;b=b-a>>2;while(1){if(b){H[d+12>>2]=a;e=b>>>1|0;H[d+12>>2]=H[d+12>>2]+(e<<2);g=(e^-1)+b|0;b=e;e=K[H[d+12>>2]>>2]<K[c>>2];b=e?g:b;a=e?H[d+12>>2]+4|0:a;continue}break}ca=d+16|0;ca=f+16|0;return a}function oc(a){var b=0;b=H[a+84>>2];if(b){H[a+88>>2]=b;oa(b)}b=H[a+72>>2];if(b){H[a+76>>2]=b;oa(b)}b=H[a+52>>2];if(b){H[a+56>>2]=b;oa(b)}b=H[a+40>>2];if(b){H[a+44>>2]=b;oa(b)}b=H[a+28>>2];if(b){H[a+32>>2]=b;oa(b)}b=H[a+12>>2];if(b){oa(b)}a=H[a>>2];if(a){oa(a)}}function Xc(a,b){var c=0,d=0;d=pa(40);H[d>>2]=-1;c=d+8|0;H[c+16>>2]=0;H[c+20>>2]=0;H[c+8>>2]=0;H[c>>2]=0;H[c+4>>2]=0;H[c+24>>2]=0;H[c+28>>2]=0;ea[H[H[a>>2]+16>>2]](a,d);a=H[b+88>>2];H[b+88>>2]=d;if(a){b=H[a+8>>2];if(b){H[a+12>>2]=b;oa(b)}oa(a)}return 1}function Ma(a){var b=0,c=0,d=0;b=a;a:{if(b&3){while(1){if(!I[b|0]){break a}b=b+1|0;if(b&3){continue}break}}while(1){c=b;b=b+4|0;d=H[c>>2];if(!((d^-1)&d-16843009&-2139062144)){continue}break}while(1){b=c;c=b+1|0;if(I[b|0]){continue}break}}return b-a|0}function Ba(a){var b=0,c=0,d=0,e=0,f=0;d=I[a+12|0];c=H[a+8>>2];a:{if(c>>>0>4095){break a}b=H[a+4>>2];if((b|0)<=0){break a}b=b-1|0;H[a+4>>2]=b;c=I[b+H[a>>2]|0]|c<<8}d=0-d&255;b=N(d,c>>>8|0);e=c&255;f=e>>>0<d>>>0;H[a+8>>2]=f?b+e|0:c-(b+d|0)|0;return f}function od(a,b){H[a+4>>2]=0;H[a+8>>2]=0;H[a>>2]=1984;H[a+12>>2]=0;H[a+16>>2]=0;H[a+20>>2]=0;H[a+24>>2]=0;H[a+28>>2]=0;H[a+32>>2]=0;H[a+36>>2]=0;H[a+40>>2]=0;H[a>>2]=2328;H[a+60>>2]=b;H[a+44>>2]=0;H[a+48>>2]=0;H[a+52>>2]=0;H[a+56>>2]=0;return a}function mc(a,b){var c=0,d=0,e=0;c=Ma(b);if(c>>>0<2147483632){a:{b:{if(c>>>0>=11){d=(c|15)+1|0;e=pa(d);H[a+8>>2]=d|-2147483648;H[a>>2]=e;H[a+4>>2]=c;d=c+e|0;break b}F[a+11|0]=c;d=a+c|0;e=a;if(!c){break a}}va(e,b,c)}F[d|0]=0;return a}Na();v()}function Ng(a){a=a|0;var b=0,c=0,d=0;if(a){if(F[a+27|0]<0){oa(H[a+16>>2])}b=H[a>>2];if(b){c=b;d=H[a+4>>2];if((b|0)!=(d|0)){while(1){c=d-12|0;if(F[d-1|0]<0){oa(H[c>>2])}d=c;if((d|0)!=(b|0)){continue}break}c=H[a>>2]}H[a+4>>2]=b;oa(c)}oa(a)}}function Jb(a,b){var c=0,d=0,e=0;a:{c=H[a>>2];b:{if(H[a+8>>2]-c>>2>>>0>=b>>>0){break b}if(b>>>0>=1073741824){break a}d=H[a+4>>2]-c|0;e=b<<2;b=va(pa(e),c,d);H[a+8>>2]=b+e;H[a+4>>2]=b+d;H[a>>2]=b;if(!c){break b}oa(c)}return}sa();v()}function Ga(a){a=a|0;var b=0,c=0;if(a){b=H[a+88>>2];H[a+88>>2]=0;if(b){c=H[b+8>>2];if(c){H[b+12>>2]=c;oa(c)}oa(b)}b=H[a+68>>2];if(b){H[a+72>>2]=b;oa(b)}b=H[a+64>>2];H[a+64>>2]=0;if(b){c=H[b>>2];if(c){H[b+4>>2]=c;oa(c)}oa(b)}oa(a)}}function Nd(a){var b=0,c=0,d=0;if(F[H[a>>2]]-48>>>0>=10){return 0}while(1){d=H[a>>2];c=-1;if(b>>>0<=214748364){c=F[d|0]-48|0;b=N(b,10);c=(c|0)>(b^2147483647)?-1:c+b|0}H[a>>2]=d+1;b=c;if(F[d+1|0]-48>>>0<10){continue}break}return b}function Cg(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;b=H[b+96>>2];a=pa(12);b=b+N(c,12)|0;c=H[b+4>>2];H[a>>2]=H[b>>2];H[a+4>>2]=c;H[a+8>>2]=H[b+8>>2];b=H[d>>2];if(b){H[d+4>>2]=b;oa(b)}H[d>>2]=a;a=a+12|0;H[d+8>>2]=a;H[d+4>>2]=a;return 1}function Ai(a){a=a|0;var b=0;H[a+24>>2]=1832;H[a>>2]=11048;b=H[a+32>>2];if(b){H[a+36>>2]=b;oa(b)}H[a>>2]=2448;b=H[a+20>>2];H[a+20>>2]=0;if(b){ea[H[H[b>>2]+4>>2]](b)}H[a>>2]=2232;b=H[a+16>>2];H[a+16>>2]=0;if(b){Ga(b)}return a|0}function Sj(a,b,c,d){var e=0,f=0,g=0,h=0;f=b^d;g=f>>31;e=b>>31;a=a^e;h=a-e|0;e=(b^e)-((a>>>0<e>>>0)+e|0)|0;a=d>>31;b=c^a;f=f>>31;a=Tj(h,e,b-a|0,(a^d)-((a>>>0>b>>>0)+a|0)|0)^f;b=a-f|0;da=(g^da)-((a>>>0<f>>>0)+g|0)|0;return b}function yi(a){a=a|0;var b=0;H[a+24>>2]=1832;H[a>>2]=11048;b=H[a+32>>2];if(b){H[a+36>>2]=b;oa(b)}H[a>>2]=2448;b=H[a+20>>2];H[a+20>>2]=0;if(b){ea[H[H[b>>2]+4>>2]](b)}H[a>>2]=2232;b=H[a+16>>2];H[a+16>>2]=0;if(b){Ga(b)}oa(a)}function Yb(a,b,c){var d=0,e=0,f=0;e=ca-16|0;ca=e;d=H[a+8>>2]&2147483647;a:{if(d>>>0>c>>>0){d=H[a>>2];H[a+4>>2]=c;yb(d,b,c);F[e+15|0]=0;F[c+d|0]=I[e+15|0];break a}f=a;a=H[a+4>>2];Gd(f,d-1|0,(c-d|0)+1|0,a,a,c,b)}ca=e+16|0}function Bf(a,b){a=a|0;b=b|0;var c=0,d=0;c=ca-16|0;ca=c;a=H[a+4>>2];a:{if((a|0)==-1){break a}F[c+15|0]=a;d=H[b+20>>2];if(!!H[b+16>>2]&(d|0)>=0|(d|0)>0){break a}Wb(b,H[b+4>>2],c+15|0,c+16|0)}ca=c+16|0;return(a|0)!=-1|0}function Xb(a,b,c){var d=0,e=0;d=ca-16|0;ca=d;a:{if(c>>>0<=10){F[a+11|0]=I[a+11|0]&128|c;F[a+11|0]=I[a+11|0]&127;yb(a,b,c);F[d+15|0]=0;F[a+c|0]=I[d+15|0];break a}e=a;a=I[a+11|0]&127;Gd(e,10,c-10|0,a,a,c,b)}ca=d+16|0}function Rj(a,b,c,d){var e=0,f=0,g=0,h=0,i=0,j=0;e=c>>>16|0;f=a>>>16|0;j=N(e,f);g=c&65535;h=a&65535;i=N(g,h);f=(i>>>16|0)+N(f,g)|0;e=(f&65535)+N(e,h)|0;da=(N(b,c)+j|0)+N(a,d)+(f>>>16)+(e>>>16)|0;return i&65535|e<<16}function Dd(a,b,c){var d=0;d=H[a+16>>2];if(!d){H[a+36>>2]=1;H[a+24>>2]=c;H[a+16>>2]=b;return}a:{if((b|0)==(d|0)){if(H[a+24>>2]!=2){break a}H[a+24>>2]=c;return}F[a+54|0]=1;H[a+24>>2]=2;H[a+36>>2]=H[a+36>>2]+1}}function th(){var a=0;a=Eb(pa(96));H[a+64>>2]=0;H[a+68>>2]=0;H[a+88>>2]=0;H[a+72>>2]=0;H[a+76>>2]=0;F[a+77|0]=0;F[a+78|0]=0;F[a+79|0]=0;F[a+80|0]=0;F[a+81|0]=0;F[a+82|0]=0;F[a+83|0]=0;F[a+84|0]=0;return a|0}function zi(a,b){a=a|0;b=b|0;var c=0,d=0;H[b>>2]=2;c=H[b+8>>2];d=H[b+12>>2]-c|0;if(d>>>0<=4294967291){kc(b+8|0,d+4|0);c=H[b+8>>2]}b=c+d|0;a=H[a+4>>2];F[b|0]=a;F[b+1|0]=a>>>8;F[b+2|0]=a>>>16;F[b+3|0]=a>>>24}function rj(a){a=a|0;var b=0;H[a>>2]=5580;b=H[a+96>>2];if(b){oa(b)}b=H[a+84>>2];if(b){oa(b)}b=H[a+72>>2];if(b){oa(b)}b=H[a+60>>2];if(b){oa(b)}H[a>>2]=3272;b=H[a+32>>2];if(b){H[a+36>>2]=b;oa(b)}return a|0}function ib(a,b,c,d,e){var f=0;f=ca-256|0;ca=f;if(!(e&73728|(c|0)<=(d|0))){d=c-d|0;c=d>>>0<256;ra(f,b&255,c?d:256);if(!c){while(1){Ab(a,f,256);d=d-256|0;if(d>>>0>255){continue}break}}Ab(a,f,d)}ca=f+256|0}function Ij(a){a=a|0;var b=0;H[a>>2]=3564;b=H[a+96>>2];if(b){oa(b)}b=H[a+84>>2];if(b){oa(b)}b=H[a+72>>2];if(b){oa(b)}b=H[a+60>>2];if(b){oa(b)}H[a>>2]=3272;b=H[a+32>>2];if(b){H[a+36>>2]=b;oa(b)}return a|0}function Ch(a){a=a|0;var b=0,c=0,d=0;b=H[a+8>>2];d=H[a+12>>2];if((b|0)==(d|0)){return 1}while(1){c=H[b>>2];c=ea[H[H[c>>2]+16>>2]](c,H[a+32>>2])|0;if(c){b=b+4|0;if((d|0)!=(b|0)){continue}}break}return c|0}function Yd(a,b){var c=0,d=0;c=H[a+8>>2];a=H[a+12>>2];if((c|0)!=(a|0)){a=a-c>>2;d=a>>>0<=1?1:a;a=0;while(1){if(H[H[(a<<2)+c>>2]+60>>2]==(b|0)){return a}a=a+1|0;if((d|0)!=(a|0)){continue}break}}return-1}function qj(a){a=a|0;var b=0;H[a>>2]=5580;b=H[a+96>>2];if(b){oa(b)}b=H[a+84>>2];if(b){oa(b)}b=H[a+72>>2];if(b){oa(b)}b=H[a+60>>2];if(b){oa(b)}H[a>>2]=3272;b=H[a+32>>2];if(b){H[a+36>>2]=b;oa(b)}oa(a)}function Hj(a){a=a|0;var b=0;H[a>>2]=3564;b=H[a+96>>2];if(b){oa(b)}b=H[a+84>>2];if(b){oa(b)}b=H[a+72>>2];if(b){oa(b)}b=H[a+60>>2];if(b){oa(b)}H[a>>2]=3272;b=H[a+32>>2];if(b){H[a+36>>2]=b;oa(b)}oa(a)}function $d(a,b,c){var d=0,e=0;d=a+4|0;a=nb(a,b);a:{if((d|0)==(a|0)){break a}b=H[a+32>>2];d=H[a+28>>2];if((b|0)==(d|0)){break a}Cc(c,b-d|0);c=Dc(c);b=H[a+28>>2];qa(c,b,H[a+32>>2]-b|0);e=1}return e}function Qf(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0;e=ca-16|0;ca=e;a=_(H[a+60>>2],b|0,c|0,d&255,e+8|0)|0;if(a){H[3992]=a;a=-1}else{a=0}ca=e+16|0;da=a?-1:H[e+12>>2];return(a?-1:H[e+8>>2])|0}function Sd(a){var b=0;b=H[a+72>>2];H[a+72>>2]=b-1|b;b=H[a>>2];if(b&8){H[a>>2]=b|32;return-1}H[a+4>>2]=0;H[a+8>>2]=0;b=H[a+44>>2];H[a+28>>2]=b;H[a+20>>2]=b;H[a+16>>2]=b+H[a+48>>2];return 0}function Eb(a){H[a+8>>2]=0;H[a+12>>2]=0;H[a>>2]=0;H[a+40>>2]=0;H[a+44>>2]=0;H[a+28>>2]=9;F[a+24|0]=1;H[a+56>>2]=-1;H[a+60>>2]=0;H[a+16>>2]=0;H[a+20>>2]=0;H[a+48>>2]=0;H[a+52>>2]=0;return a}function hf(a,b){a=a|0;b=b|0;var c=0,d=0;d=H[a+16>>2];c=0;a:{if(H[a+20>>2]-d>>2<=(b|0)){break a}b=H[(b<<2)+d>>2];c=0;if((b|0)<0){break a}c=rb(H[H[a+36>>2]+(b<<2)>>2])}return c|0}function Mg(){var a=0,b=0;a=pa(40);H[a+4>>2]=0;H[a+8>>2]=0;H[a+24>>2]=0;H[a+28>>2]=0;b=a+16|0;H[b>>2]=0;H[b+4>>2]=0;H[a>>2]=a+4;H[a+12>>2]=b;H[a+32>>2]=0;H[a+36>>2]=0;return a|0}function Vf(a,b){a=a|0;b=b|0;var c=0,d=0;Wd(a,b);a:{if((b|0)<0){break a}d=H[a+88>>2];c=H[a+84>>2];if(d-c>>2<=(b|0)){break a}c=(b<<2)+c|0;b=c+4|0;va(c,b,d-b|0);H[a+88>>2]=d-4}}function Rh(a){a=a|0;var b=0;H[a+8>>2]=12804;H[a>>2]=12640;b=H[a+56>>2];if(b){H[a+60>>2]=b;oa(b)}H[a+8>>2]=12620;b=H[a+44>>2];if(b){oa(b)}b=H[a+32>>2];if(b){oa(b)}return a|0}function Lh(a){a=a|0;var b=0;H[a+8>>2]=11872;H[a>>2]=12932;b=H[a+56>>2];if(b){H[a+60>>2]=b;oa(b)}H[a+8>>2]=12124;b=H[a+44>>2];if(b){oa(b)}b=H[a+32>>2];if(b){oa(b)}return a|0}function zb(a){var b=0,c=0;b=H[3958];c=a+7&-8;a=b+c|0;a:{if(a>>>0<=b>>>0?c:0){break a}if(a>>>0>fa()<<16>>>0){if(!($(a|0)|0)){break a}}H[3958]=a;return b}H[3992]=48;return-1}function bj(a,b,c){a=a|0;b=b|0;c=c|0;var d=0;H[a+4>>2]=b;b=H[H[H[b+4>>2]+8>>2]+(c<<2)>>2];H[a+12>>2]=c;H[a+8>>2]=b;a=H[a+8>>2];if(I[a+24|0]==3){d=H[a+28>>2]==9}return d|0}function wf(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;d=H[a+8>>2];a:{if(!I[d+24|0]){break a}if(!mb(d,H[b+4>>2]-H[b>>2]>>2)){break a}e=ea[H[H[a>>2]+32>>2]](a,b,c)|0}return e|0}function Qh(a){a=a|0;var b=0;H[a+8>>2]=12804;H[a>>2]=12640;b=H[a+56>>2];if(b){H[a+60>>2]=b;oa(b)}H[a+8>>2]=12620;b=H[a+44>>2];if(b){oa(b)}b=H[a+32>>2];if(b){oa(b)}oa(a)}function Kh(a){a=a|0;var b=0;H[a+8>>2]=11872;H[a>>2]=12932;b=H[a+56>>2];if(b){H[a+60>>2]=b;oa(b)}H[a+8>>2]=12124;b=H[a+44>>2];if(b){oa(b)}b=H[a+32>>2];if(b){oa(b)}oa(a)}function nj(a){a=a|0;var b=0;H[a>>2]=5816;b=H[a+76>>2];if(b){oa(b)}b=H[a+68>>2];H[a+68>>2]=0;if(b){oa(b)}H[a>>2]=3272;b=H[a+32>>2];if(b){H[a+36>>2]=b;oa(b)}return a|0}function Ra(a,b){if(b){Ra(a,H[b>>2]);Ra(a,H[b+4>>2]);a=H[b+28>>2];H[b+28>>2]=0;if(a){Ra(a+12|0,H[a+16>>2]);Qa(a,H[a+4>>2]);oa(a)}if(F[b+27|0]<0){oa(H[b+16>>2])}oa(b)}}function Gi(a,b,c){a=a|0;b=b|0;c=c|0;var d=0;H[a+4>>2]=b;d=H[H[H[b+4>>2]+8>>2]+(c<<2)>>2];H[a+12>>2]=c;H[a+8>>2]=d;return H[H[H[H[b+4>>2]+8>>2]+(c<<2)>>2]+28>>2]==9|0}function Ej(a){a=a|0;var b=0;H[a>>2]=3812;b=H[a+76>>2];if(b){oa(b)}b=H[a+68>>2];H[a+68>>2]=0;if(b){oa(b)}H[a>>2]=3272;b=H[a+32>>2];if(b){H[a+36>>2]=b;oa(b)}return a|0}function Vc(a){H[a+40>>2]=0;H[a+4>>2]=0;H[a+8>>2]=0;H[a>>2]=13280;H[a+12>>2]=0;H[a+16>>2]=0;H[a+20>>2]=0;H[a+24>>2]=0;H[a+28>>2]=0;H[a+32>>2]=0;G[a+36>>1]=0;return a}function Hd(a,b){var c=0,d=0,e=0,f=0;H[a>>2]=15260;H[a>>2]=15372;c=Ma(b);d=pa(c+13|0);H[d+8>>2]=0;H[d+4>>2]=c;H[d>>2]=c;e=a,f=qa(d+12|0,b,c+1|0),H[e+4>>2]=f;return a}function jg(a,b){a=a|0;b=b|0;var c=0;a:{if(!(ea[H[H[a>>2]+36>>2]](a,b)|0)){break a}if(!(ea[H[H[a>>2]+40>>2]](a,b)|0)){break a}c=ea[H[H[a>>2]+44>>2]](a)|0}return c|0}function mj(a){a=a|0;var b=0;H[a>>2]=5816;b=H[a+76>>2];if(b){oa(b)}b=H[a+68>>2];H[a+68>>2]=0;if(b){oa(b)}H[a>>2]=3272;b=H[a+32>>2];if(b){H[a+36>>2]=b;oa(b)}oa(a)}function Dj(a){a=a|0;var b=0;H[a>>2]=3812;b=H[a+76>>2];if(b){oa(b)}b=H[a+68>>2];H[a+68>>2]=0;if(b){oa(b)}H[a>>2]=3272;b=H[a+32>>2];if(b){H[a+36>>2]=b;oa(b)}oa(a)}function Xe(a){a=a|0;var b=0;a:{if(!H[a- -64>>2]|!H[a+68>>2]|(!H[a+44>>2]|!H[a+48>>2])){break a}if(!H[a+52>>2]|!H[a+56>>2]){break a}b=H[a+92>>2]!=-1}return b|0}function cf(a){a=a|0;var b=0;H[a>>2]=2448;b=H[a+20>>2];H[a+20>>2]=0;if(b){ea[H[H[b>>2]+4>>2]](b)}H[a>>2]=2232;b=H[a+16>>2];H[a+16>>2]=0;if(b){Ga(b)}return a|0}function Pj(a,b){a=a|0;b=b|0;var c=0;b=H[b+88>>2];if(!(!b|H[b>>2]!=2)){c=a;a=H[b+8>>2];H[c+4>>2]=I[a|0]|I[a+1|0]<<8|(I[a+2|0]<<16|I[a+3|0]<<24);c=1}return c|0}function tc(a){a=a|0;var b=0;a:{if(!H[a+48>>2]|!H[a+52>>2]|(!H[a+28>>2]|!H[a+32>>2])){break a}if(!H[a+36>>2]|!H[a+40>>2]){break a}b=H[a+76>>2]!=-1}return b|0}function Sh(a){a=a|0;var b=0;H[a>>2]=12804;b=H[a+48>>2];if(b){H[a+52>>2]=b;oa(b)}H[a>>2]=12620;b=H[a+36>>2];if(b){oa(b)}b=H[a+24>>2];if(b){oa(b)}return a|0}function He(a){a=a|0;var b=0;H[a>>2]=11872;b=H[a+48>>2];if(b){H[a+52>>2]=b;oa(b)}H[a>>2]=12124;b=H[a+36>>2];if(b){oa(b)}b=H[a+24>>2];if(b){oa(b)}return a|0}function bf(a){a=a|0;var b=0;H[a>>2]=2448;b=H[a+20>>2];H[a+20>>2]=0;if(b){ea[H[H[b>>2]+4>>2]](b)}H[a>>2]=2232;b=H[a+16>>2];H[a+16>>2]=0;if(b){Ga(b)}oa(a)}function wh(){var a=0,b=0;b=pa(40);H[b>>2]=-1;a=b+8|0;H[a+16>>2]=0;H[a+20>>2]=0;H[a+8>>2]=0;H[a>>2]=0;H[a+4>>2]=0;H[a+24>>2]=0;H[a+28>>2]=0;return b|0}function gf(a,b){a=a|0;b=b|0;var c=0,d=0;d=H[a+4>>2];a:{if(d){c=1;if(I[d+36|0]<2){break a}}c=ea[H[H[a>>2]+48>>2]](a,H[b+4>>2]-H[b>>2]>>2)|0}return c|0}function ci(a){a=a|0;var b=0;H[a>>2]=11872;b=H[a+48>>2];if(b){H[a+52>>2]=b;oa(b)}H[a>>2]=12124;b=H[a+36>>2];if(b){oa(b)}b=H[a+24>>2];if(b){oa(b)}oa(a)}function Mh(a){a=a|0;var b=0;H[a>>2]=12804;b=H[a+48>>2];if(b){H[a+52>>2]=b;oa(b)}H[a>>2]=12620;b=H[a+36>>2];if(b){oa(b)}b=H[a+24>>2];if(b){oa(b)}oa(a)}function Ha(a){H[a+8>>2]=0;H[a+12>>2]=0;H[a>>2]=0;H[a+16>>2]=0;H[a+20>>2]=0;H[a+32>>2]=0;H[a+24>>2]=0;H[a+28>>2]=0;G[a+38>>1]=0;F[a+36|0]=0;return a}function Hf(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;if(Ya(a,H[b+8>>2],f)){Cd(b,c,d,e);return}a=H[a+8>>2];ea[H[H[a>>2]+20>>2]](a,b,c,d,e,f)}function Ei(a,b,c){a=a|0;b=b|0;c=c|0;a:{if(I[H[a+4>>2]+36|0]>=2){b=0;if(!(ea[H[H[a>>2]+52>>2]](a)|0)){break a}}b=Xc(a+24|0,H[a+16>>2])}return b|0}function Fi(a,b,c){a=a|0;b=b|0;c=c|0;var d=0;a:{if(I[H[a+4>>2]+36|0]<=1){d=0;if(!(ea[H[H[a>>2]+52>>2]](a)|0)){break a}}d=nd(a,b,c)}return d|0}function gh(){var a=0;a=_d(pa(108));H[a+84>>2]=0;H[a+88>>2]=0;H[a>>2]=13664;H[a+92>>2]=0;H[a+96>>2]=0;H[a+100>>2]=0;H[a+104>>2]=0;return a|0}function Zd(a,b){var c=0;c=-1;a:{if((b|0)==-1|(b|0)>4){break a}b=N(b,12)+a|0;a=H[b+20>>2];if((H[b+24>>2]-a|0)<=0){break a}c=H[a>>2]}return c}function lc(a,b,c,d,e,f,g){H[a>>2]=0;H[a+56>>2]=b;H[a+48>>2]=0;H[a+52>>2]=0;H[a+40>>2]=f;H[a+44>>2]=g;F[a+32|0]=e;H[a+28>>2]=d;F[a+24|0]=c}function aj(a,b,c){a=a|0;b=b|0;c=c|0;var d=0;a:{if(I[H[a+4>>2]+36|0]<=1){d=0;if(!xc(a+24|0,H[a+8>>2],c)){break a}}d=nd(a,b,c)}return d|0}function $i(a,b,c){a=a|0;b=b|0;c=c|0;a:{if(I[H[a+4>>2]+36|0]>=2){b=0;if(!xc(a+24|0,rb(a),c)){break a}}b=Xc(a+24|0,H[a+16>>2])}return b|0}function Yf(a){a=a|0;var b=0;H[a>>2]=13664;b=H[a+96>>2];if(b){H[a+100>>2]=b;oa(b)}b=H[a+84>>2];if(b){H[a+88>>2]=b;oa(b)}return _b(a)|0}function Dc(a){var b=0;if(I[a+11|0]>>>7|0){b=H[a+4>>2]}else{b=I[a+11|0]&127}if(!b){af(1232);v()}if(I[a+11|0]>>>7|0){a=H[a>>2]}return a}function Xf(a){a=a|0;var b=0;H[a>>2]=13664;b=H[a+96>>2];if(b){H[a+100>>2]=b;oa(b)}b=H[a+84>>2];if(b){H[a+88>>2]=b;oa(b)}oa(_b(a))}function zj(a){a=a|0;var b=0;H[a>>2]=4040;b=H[a+76>>2];if(b){oa(b)}H[a>>2]=3272;b=H[a+32>>2];if(b){H[a+36>>2]=b;oa(b)}return a|0}function jj(a){a=a|0;var b=0;H[a>>2]=6032;b=H[a+76>>2];if(b){oa(b)}H[a>>2]=3272;b=H[a+32>>2];if(b){H[a+36>>2]=b;oa(b)}return a|0}function Qa(a,b){if(b){Qa(a,H[b>>2]);Qa(a,H[b+4>>2]);a=H[b+28>>2];if(a){H[b+32>>2]=a;oa(a)}if(F[b+27|0]<0){oa(H[b+16>>2])}oa(b)}}function Vg(){var a=0;a=pa(28);H[a>>2]=0;H[a+4>>2]=0;H[a+24>>2]=0;H[a+16>>2]=0;H[a+20>>2]=0;H[a+8>>2]=0;H[a+12>>2]=0;return a|0}function wg(a){a=a|0;var b=0;H[a>>2]=1984;b=H[a+16>>2];if(b){H[a+20>>2]=b;oa(b)}b=H[a+4>>2];if(b){H[a+8>>2]=b;oa(b)}return a|0}function eh(){var a=0,b=0;a=pa(24);H[a+4>>2]=0;H[a+8>>2]=0;b=a+16|0;H[b>>2]=0;H[b+4>>2]=0;H[a>>2]=a+4;H[a+12>>2]=b;return a|0}function Kf(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;if(Ya(a,H[b+8>>2],0)){Dd(b,c,d);return}a=H[a+8>>2];ea[H[H[a>>2]+28>>2]](a,b,c,d)}function yj(a){a=a|0;var b=0;H[a>>2]=4040;b=H[a+76>>2];if(b){oa(b)}H[a>>2]=3272;b=H[a+32>>2];if(b){H[a+36>>2]=b;oa(b)}oa(a)}function ij(a){a=a|0;var b=0;H[a>>2]=6032;b=H[a+76>>2];if(b){oa(b)}H[a>>2]=3272;b=H[a+32>>2];if(b){H[a+36>>2]=b;oa(b)}oa(a)}function pa(a){var b=0;a=a?a:1;a:{while(1){b=Ec(a);if(b){break a}b=H[4422];if(b){ea[b|0]();continue}break}X();v()}return b}function Kb(a,b){if(b){Kb(a,H[b>>2]);Kb(a,H[b+4>>2]);if(F[b+39|0]<0){oa(H[b+28>>2])}if(F[b+27|0]<0){oa(H[b+16>>2])}oa(b)}}function Ad(a){a=a|0;var b=0,c=0;H[a>>2]=15372;b=H[a+4>>2]-12|0;c=H[b+8>>2]-1|0;H[b+8>>2]=c;if((c|0)<0){oa(b)}return a|0}function lh(){var a=0;a=pa(24);H[a+8>>2]=0;H[a+12>>2]=0;H[a+4>>2]=-1;H[a>>2]=1832;H[a+16>>2]=0;H[a+20>>2]=0;return a|0}function pd(a,b,c){a=a|0;b=b|0;c=c|0;H[a+4>>2]=b;b=H[H[H[b+4>>2]+8>>2]+(c<<2)>>2];H[a+12>>2]=c;H[a+8>>2]=b;return 1}function wc(a){a=a|0;var b=0;if(!(!H[a+60>>2]|!H[a+44>>2]|(!H[a+48>>2]|!H[a+52>>2]))){b=H[a+56>>2]!=0}return b|0}function Id(a,b){if(I[a+11|0]>>>7|0){H[a+4>>2]=b;return}F[a+11|0]=I[a+11|0]&128|b;F[a+11|0]=I[a+11|0]&127}function wj(a){a=a|0;var b=0;H[a>>2]=4276;H[a>>2]=3272;b=H[a+32>>2];if(b){H[a+36>>2]=b;oa(b)}return a|0}function fj(a){a=a|0;var b=0;H[a>>2]=6256;H[a>>2]=3272;b=H[a+32>>2];if(b){H[a+36>>2]=b;oa(b)}return a|0}function bi(a){a=a|0;var b=0;H[a>>2]=12124;b=H[a+36>>2];if(b){oa(b)}b=H[a+24>>2];if(b){oa(b)}return a|0}function Uh(a){a=a|0;var b=0;H[a>>2]=12620;b=H[a+36>>2];if(b){oa(b)}b=H[a+24>>2];if(b){oa(b)}return a|0}function lg(a){a=a|0;if(a){if(F[a+39|0]<0){oa(H[a+28>>2])}Oc(a+12|0,H[a+16>>2]);Kb(a,H[a+4>>2]);oa(a)}}function Pb(a){a=a|0;var b=0;if(!(!H[a+52>>2]|(!H[a+44>>2]|!H[a+48>>2]))){b=H[a+56>>2]!=0}return b|0}function vj(a){a=a|0;var b=0;H[a>>2]=4276;H[a>>2]=3272;b=H[a+32>>2];if(b){H[a+36>>2]=b;oa(b)}oa(a)}function vc(a,b){a=a|0;b=b|0;var c=0;if(!(H[b+56>>2]|!b|I[b+24|0]!=3)){H[a+60>>2]=b;c=1}return c|0}function ej(a){a=a|0;var b=0;H[a>>2]=6256;H[a>>2]=3272;b=H[a+32>>2];if(b){H[a+36>>2]=b;oa(b)}oa(a)}function ai(a){a=a|0;var b=0;H[a>>2]=12124;b=H[a+36>>2];if(b){oa(b)}b=H[a+24>>2];if(b){oa(b)}oa(a)}function Th(a){a=a|0;var b=0;H[a>>2]=12620;b=H[a+36>>2];if(b){oa(b)}b=H[a+24>>2];if(b){oa(b)}oa(a)}function xh(a,b,c){a=a|0;b=b|0;c=c|0;H[a+16>>2]=0;H[a+20>>2]=0;H[a>>2]=b;H[a+8>>2]=c;H[a+12>>2]=0}function We(a,b){a=a|0;b=b|0;var c=0;if(!(H[b+56>>2]|I[b+24|0]!=3)){H[a- -64>>2]=b;c=1}return c|0}function yc(a){var b=0;b=H[a+16>>2];if(b){H[a+20>>2]=b;oa(b)}b=H[a>>2];if(b){H[a+4>>2]=b;oa(b)}}function sc(a,b){a=a|0;b=b|0;var c=0;if(!(H[b+56>>2]|I[b+24|0]!=3)){H[a+48>>2]=b;c=1}return c|0}function Gf(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;if(Ya(a,H[b+8>>2],f)){Cd(b,c,d,e)}}function wa(){var a=0;a=Bc(4);H[a>>2]=15260;H[a>>2]=15220;H[a>>2]=15240;Y(a|0,15352,14);v()}function sf(a){a=a|0;var b=0;H[a>>2]=2232;b=H[a+16>>2];H[a+16>>2]=0;if(b){Ga(b)}return a|0}function Kj(a){a=a|0;var b=0;H[a>>2]=3272;b=H[a+32>>2];if(b){H[a+36>>2]=b;oa(b)}return a|0}function mi(a){a=a|0;var b=0;H[a>>2]=1832;b=H[a+8>>2];if(b){H[a+12>>2]=b;oa(b)}return a|0}function Ci(a){a=a|0;var b=0;b=rb(a);return Je(a+24|0,b?b:H[a+8>>2],H[H[a+4>>2]+32>>2])|0}function rf(a){a=a|0;var b=0;H[a>>2]=2232;b=H[a+16>>2];H[a+16>>2]=0;if(b){Ga(b)}oa(a)}function ji(a){a=a|0;var b=0;H[a>>2]=1832;b=H[a+8>>2];if(b){H[a+12>>2]=b;oa(b)}oa(a)}\nfunction Ub(a){a=a|0;var b=0;H[a>>2]=3272;b=H[a+32>>2];if(b){H[a+36>>2]=b;oa(b)}oa(a)}function Za(a){var b=0;H[a+16>>2]=0;b=H[a>>2];H[a+4>>2]=b;H[a+12>>2]=b;if(b){oa(b)}}function Oc(a,b){if(b){Oc(a,H[b>>2]);Oc(a,H[b+4>>2]);Kb(b+20|0,H[b+24>>2]);oa(b)}}function wi(a){a=a|0;if(!H[a+44>>2]){return 0}return ea[H[H[a>>2]+48>>2]](a)|0}function vh(a){a=a|0;var b=0;if(a){b=H[a+8>>2];if(b){H[a+12>>2]=b;oa(b)}oa(a)}}function Uj(a){var b=0;while(1){if(a){a=a-1&a;b=b+1|0;continue}break}return b}function Lf(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;if(Ya(a,H[b+8>>2],0)){Dd(b,c,d)}}function ui(a,b){a=a|0;b=b|0;a=H[a+48>>2];return ea[H[H[a>>2]+20>>2]](a,b)|0}function ni(a,b){a=a|0;b=b|0;a=H[a+48>>2];return ea[H[H[a>>2]+12>>2]](a,b)|0}function li(a,b){a=a|0;b=b|0;a=H[a+48>>2];return ea[H[H[a>>2]+16>>2]](a,b)|0}function lb(){var a=0;a=pa(12);H[a>>2]=0;H[a+4>>2]=0;H[a+8>>2]=0;return a|0}function kb(a){a=a|0;var b=0;if(a){b=H[a>>2];if(b){H[a+4>>2]=b;oa(b)}oa(a)}}function Vj(a){var b=0;b=a&31;a=0-a&31;return(-1>>>b&-2)<<b|(-1<<a&-2)>>>a}\nfunction dh(a,b,c){a=a|0;b=b|0;c=c|0;H[a+32>>2]=c;H[a+28>>2]=b;return 1}function ch(a){a=a|0;if(a){Ra(a+12|0,H[a+16>>2]);Qa(a,H[a+4>>2]);oa(a)}}function Rd(a,b,c){a:{if(H[c+76>>2]<0){a=Fc(a,b,c);break a}a=Fc(a,b,c)}}function Mb(a,b){a=a|0;b=b|0;if(b>>>0<=1){H[a+28>>2]=b}return b>>>0<2|0}function Fh(a,b){a=a|0;b=b|0;F[b+84|0]=1;H[b+72>>2]=H[b+68>>2];return 1}function si(a){a=a|0;a=H[a+48>>2];return ea[H[H[a>>2]+24>>2]](a)|0}function ri(a){a=a|0;a=H[a+48>>2];return ea[H[H[a>>2]+28>>2]](a)|0}function oi(a){a=a|0;a=H[a+48>>2];return ea[H[H[a>>2]+36>>2]](a)|0}function ih(){var a=0;a=pa(8);H[a+4>>2]=-1;H[a>>2]=1032;return a|0}function Gg(a,b,c){a=a|0;b=b|0;c=c|0;return H[H[b+8>>2]+(c<<2)>>2]}function _i(a,b){a=a|0;b=b|0;return Fd(a+24|0,rb(a),H[a+8>>2])|0}function Bi(a,b){a=a|0;b=b|0;return Re(a+24|0,rb(a),H[a+8>>2])|0}function xf(a,b){a=a|0;b=b|0;H[a+12>>2]=-1;H[a+8>>2]=b;return 1}function ne(a,b){a=a|0;b=b|0;return ea[H[H[a>>2]+12>>2]](a,b)|0}function Ff(a){a=a|0;if(!a){return 0}return(Ed(a,15068)|0)!=0|0}function Di(a,b){a=a|0;b=b|0;return ea[H[H[a>>2]+56>>2]](a,b)|0}function $g(a){a=a|0;if(a){if(F[a+15|0]<0){oa(H[a+4>>2])}oa(a)}}function kh(a,b){a=a|0;b=b|0;return O(L[H[a+8>>2]+(b<<2)>>2])}function af(a){a=Hd(Bc(8),a);H[a>>2]=15472;Y(a|0,15504,1);v()}function Ue(a){a=Hd(Bc(8),a);H[a>>2]=15420;Y(a|0,15452,1);v()}function _g(a,b){a=a|0;b=b|0;return O(L[H[a>>2]+(b<<2)>>2])}function fh(a){a=a|0;return(H[a+100>>2]-H[a+96>>2]|0)/12|0}function ah(a){a=a|0;return(F[a+15|0]<0?H[a+4>>2]:a+4|0)|0}function _f(a,b){a=a|0;b=b|0;return H[H[a+4>>2]+(b<<2)>>2]}function Pf(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;da=0;return 0}function Ke(a){a=Vc(a);H[a+44>>2]=0;H[a>>2]=11180;return a}function ie(a,b){a=a|0;b=b|0;return H[H[a>>2]+(b<<2)>>2]}function Xg(a,b){a=a|0;b=b|0;return G[H[a>>2]+(b<<1)>>1]}function Wg(a,b){a=a|0;b=b|0;return J[H[a>>2]+(b<<1)>>1]}function Zb(a,b){var c=0;c=pa(b);H[a+4>>2]=b;H[a>>2]=c}function Jg(a,b,c){a=a|0;b=b|0;c=c|0;return Zd(b,c)|0}function _d(a){H[a>>2]=13724;ra(a+4|0,0,80);return a}function me(a){a=a|0;return H[a+12>>2]-H[a+8>>2]>>2}function Qj(a){if(a){return 31-Q(a-1^a)|0}return 32}function cc(a){a=a|0;if(a){ea[H[H[a>>2]+4>>2]](a)}}function Zg(a,b){a=a|0;b=b|0;return F[H[a>>2]+b|0]}function Yg(a,b){a=a|0;b=b|0;return I[H[a>>2]+b|0]}function Uf(a){a=a|0;return H[a+8>>2]-H[a+4>>2]>>2}function jd(a,b){a=a|0;b=b|0;H[a+4>>2]=b;return 1}function je(a){a=a|0;return H[a+4>>2]-H[a>>2]>>1}function Qc(a){a=a|0;return H[a+4>>2]-H[a>>2]>>2}function le(a){a=a|0;return H[a+4>>2]-H[a>>2]|0}function Ab(a,b,c){if(!(I[a|0]&32)){Fc(b,c,a)}}function vf(a,b,c){a=a|0;b=b|0;c=c|0;return 1}function hi(a,b){a=a|0;b=b|0;return I[b+24|0]}function Pg(a,b){a=a|0;b=b|0;return H[b+8>>2]}function Nj(a){a=a|0;return I[H[a+8>>2]+24|0]}function Li(a){a=a|0;H[a>>2]=10032;return a|0}function Eg(a,b){a=a|0;b=b|0;return H[b+4>>2]}function Yi(a){a=a|0;H[a>>2]=7144;return a|0}function Ui(a){a=a|0;H[a>>2]=8080;return a|0}function Sf(a){a=a|0;return aa(H[a+60>>2])|0}function Pi(a){a=a|0;H[a>>2]=9028;return a|0}function jh(a){a=a|0;return O(L[a+20>>2])}function Ji(a){a=a|0;H[a>>2]=10032;oa(a)}function Xi(a){a=a|0;H[a>>2]=7144;oa(a)}function Si(a){a=a|0;H[a>>2]=8080;oa(a)}function Oi(a){a=a|0;H[a>>2]=9028;oa(a)}function sh(a){a=a|0;return H[a+88>>2]}function rh(a){a=a|0;return H[a+56>>2]}function oh(a){a=a|0;return H[a+40>>2]}function nh(a){a=a|0;return H[a+48>>2]}function mh(a){a=a|0;return H[a+60>>2]}function eb(a){a=a|0;return H[a+28>>2]}function df(){H[4292]=17048;H[4274]=42}function Rc(a){a=a|0;return H[a+80>>2]}function qh(a){a=a|0;return F[a+24|0]}function ph(a){a=a|0;return I[a+32|0]}function md(a,b){a=a|0;b=b|0;return-1}function db(a){a=a|0;return H[a+4>>2]}function bh(a){a=a|0;return!H[a>>2]|0}function _e(a,b){a=a|0;b=b|0;return 6}function Zc(a){a=a|0;return H[a+8>>2]}function Pd(a,b){a=a|0;b=b|0;return 1}function Ja(a,b){a=a|0;b=b|0;return 0}function Bj(a,b){a=a|0;b=b|0;return 2}function Bc(a){return Ec(a+80|0)+80|0}function pe(a){a=a|0;return H[a>>2]}function yh(){return Ha(pa(40))|0}function uh(){return Eb(pa(64))|0}function hh(){return _d(pa(84))|0}function Sc(a){a=a|0;if(a){oa(a)}}function zc(a){a=a|0;Ad(a);oa(a)}function Ef(a){a=a|0;return 1171}function Df(a){a=a|0;return 1245}function Cf(a){a=a|0;return 1211}function Ta(a){a=a|0;return a|0}function yf(a){a=a|0;oa(rd(a))}function fi(a){a=a|0;oa(Be(a))}function ei(a){a=a|0;oa(Ae(a))}function di(a){a=a|0;oa(ze(a))}function Tf(a){a=a|0;oa(_b(a))}function ld(a){a=a|0;return 3}function _a(a){a=a|0;return 0}function Ze(a){a=a|0;return 5}function Tb(a){a=a|0;return 2}function Ob(a){a=a|0;return 6}function Da(a){a=a|0;return 1}function $e(a){a=a|0;return 4}function sa(){Ue(1164);v()}function Na(){Ue(1232);v()}function La(a){a=a|0;oa(a)}function Ca(){af(1164);v()}function fb(a){a=a|0;v()}function eg(){return 10}function dg(){return 11}function cg(){return 12}function kg(){return 5}function ig(){return 6}function hg(){return 7}function gg(){return 8}function fg(){return 9}function fe(){return 3}function ee(){return 4}function bg(){return-2}function bc(){return-1}function ag(){return-3}function ac(){return 1}function Zf(){return-5}function Qb(){return 0}function Nc(){return 2}function $f(){return-4}function Nf(){X();v()}function Td(a){a=a|0}\n// EMSCRIPTEN_END_FUNCS\ne=I;p(q);var ea=c([null,Ad,Ta,La,Tb,Pj,zi,Gh,Fd,Bf,xc,Nh,_e,Bj,Ta,mi,ji,Da,gj,Ti,Ki,Re,xi,Je,_e,hi,wg,fb,dh,ke,jg,_f,Uf,eb,Ja,Nf,Pd,Da,rd,yf,Of,Af,zf,sf,rf,pd,xf,wf,vf,Pd,uf,tf,kf,jf,qf,pf,hf,of,nf,mf,lf,cf,bf,pd,gf,ff,nd,ef,Nj,Oj,Kj,Ub,Da,db,Pb,_a,md,Ja,_a,Da,Mj,Lj,fb,fb,Ub,Tb,Pb,Jj,Ij,Hj,$e,Pb,Gj,Fj,Ej,Dj,ld,wc,Da,Ja,vc,Cj,Aj,zj,yj,Ze,wc,Da,Ja,vc,Ye,xj,wj,vj,Ob,Xe,Da,Ja,We,Ve,uj,Ta,La,Mb,eb,Nb,fb,Ub,Da,Pb,tj,fb,Ub,Tb,Pb,sj,rj,qj,$e,Pb,pj,oj,nj,mj,ld,wc,Da,Ja,vc,lj,kj,jj,ij,Ze,wc,Da,Ja,vc,Ye,hj,fj,ej,Ob,Xe,Da,Ja,We,Ve,dj,Ta,La,Mb,eb,Lb,fb,Ub,_a,Da,cj,cf,bf,bj,$i,aj,Zi,Tb,_i,Yi,Xi,Ob,db,tc,Da,Ja,sc,Da,Tb,Te,Wi,Ta,La,Mb,eb,Nb,Ui,Si,Ob,tc,Da,Ja,sc,Te,Ri,Ta,La,Mb,eb,Lb,Ta,La,_a,Da,_a,md,Ja,Vi,Qi,Pi,Oi,Ob,db,tc,Da,Ja,sc,Da,ld,Se,Ni,Ta,La,Mb,eb,Nb,Li,Ji,Ob,tc,Da,Ja,sc,Se,Ii,Ta,La,Mb,eb,Lb,La,_a,Da,_a,md,Ja,Mi,Hi,Ai,yi,Gi,Ei,Fi,Di,Ci,Bi,vi,fb,Da,Da,wi,Dh,Ch,Da,_a,Ja,Ja,qi,pi,ti,ui,ri,oi,ni,li,si,Be,fi,jd,id,hd,gd,ki,Da,db,Zc,Ae,ei,jd,id,hd,gd,ii,Da,db,Zc,ze,di,jd,id,hd,gd,gi,Da,db,Zc,He,ci,Ie,bi,ai,Zh,Yh,Xh,Wh,_h,Vh,$h,Uh,Th,Rh,Qh,Ph,Oh,Sh,Mh,Lh,Kh,Jh,Ih,Wc,ve,Hh,Ta,La,Fh,Eh,fb,_a,Da,Wc,Ah,Bh,Wc,ve,zh,Yf,Xf,Wf,Vf,_b,Tf,Xd,Wd,Sf,Rf,Qf,_a,Pf,Ta,La,Td,Td,Mf,Gf,If,Lf,La,Hf,Jf,Kf,La,Df,La,Cf,La,Ef,zc,db,zc,zc]);function fa(){return E.byteLength/65536|0}function ka(la){la=la|0;var ga=fa()|0;var ha=ga+la|0;if(ga<ha&&ha<65536){var ia=new ArrayBuffer(N(ha,65536));var ja=new Int8Array(ia);ja.set(F);F=new Int8Array(ia);G=new Int16Array(ia);H=new Int32Array(ia);I=new Uint8Array(ia);J=new Uint16Array(ia);K=new Uint32Array(ia);L=new Float32Array(ia);M=new Float64Array(ia);E=ia;D.buffer=E;e=I}return ga}return{\"i\":df,\"j\":ea,\"k\":Sc,\"l\":yh,\"m\":xh,\"n\":Sc,\"o\":wh,\"p\":pe,\"q\":vh,\"r\":uh,\"s\":Sc,\"t\":th,\"u\":Rc,\"v\":sh,\"w\":rh,\"x\":eb,\"y\":qh,\"z\":ph,\"A\":oh,\"B\":nh,\"C\":mh,\"D\":Ga,\"E\":lh,\"F\":ne,\"G\":db,\"H\":kh,\"I\":jh,\"J\":cc,\"K\":ih,\"L\":ne,\"M\":db,\"N\":cc,\"O\":hh,\"P\":me,\"Q\":Rc,\"R\":cc,\"S\":gh,\"T\":fh,\"U\":me,\"V\":Rc,\"W\":cc,\"X\":eh,\"Y\":ch,\"Z\":pe,\"_\":bh,\"$\":ah,\"aa\":$g,\"ba\":lb,\"ca\":_g,\"da\":Qc,\"ea\":kb,\"fa\":lb,\"ga\":Zg,\"ha\":le,\"ia\":kb,\"ja\":lb,\"ka\":Yg,\"la\":le,\"ma\":kb,\"na\":lb,\"oa\":Xg,\"pa\":je,\"qa\":kb,\"ra\":lb,\"sa\":Wg,\"ta\":je,\"ua\":kb,\"va\":lb,\"wa\":ie,\"xa\":Qc,\"ya\":kb,\"za\":lb,\"Aa\":ie,\"Ba\":Qc,\"Ca\":kb,\"Da\":Vg,\"Ea\":Ug,\"Fa\":Tg,\"Ga\":Sg,\"Ha\":Rg,\"Ia\":Qg,\"Ja\":Pg,\"Ka\":Og,\"La\":Ng,\"Ma\":Mg,\"Na\":Lg,\"Oa\":Kg,\"Pa\":Jg,\"Qa\":Ig,\"Ra\":Hg,\"Sa\":Gg,\"Ta\":Fg,\"Ua\":Eg,\"Va\":Dg,\"Wa\":Cg,\"Xa\":Bg,\"Ya\":Ag,\"Za\":zg,\"_a\":yg,\"$a\":xg,\"ab\":ge,\"bb\":vg,\"cb\":ug,\"db\":tg,\"eb\":sg,\"fb\":ge,\"gb\":rg,\"hb\":qg,\"ib\":pg,\"jb\":og,\"kb\":ng,\"lb\":mg,\"mb\":lg,\"nb\":bc,\"ob\":Qb,\"pb\":ac,\"qb\":Nc,\"rb\":bc,\"sb\":Qb,\"tb\":ac,\"ub\":Nc,\"vb\":fe,\"wb\":ee,\"xb\":bc,\"yb\":Qb,\"zb\":ac,\"Ab\":Qb,\"Bb\":ac,\"Cb\":Nc,\"Db\":fe,\"Eb\":ee,\"Fb\":kg,\"Gb\":ig,\"Hb\":hg,\"Ib\":gg,\"Jb\":fg,\"Kb\":eg,\"Lb\":dg,\"Mb\":cg,\"Nb\":Qb,\"Ob\":bc,\"Pb\":bg,\"Qb\":ag,\"Rb\":$f,\"Sb\":Zf,\"Tb\":Ec,\"Ub\":oa,\"Vb\":Ff}}return ma(na)}\n// EMSCRIPTEN_END_ASM\n\n\n)(info)},instantiate:function(binary,info){return{then:function(ok){var module=new WebAssembly.Module(binary);ok({\"instance\":new WebAssembly.Instance(module,info)})}}},RuntimeError:Error};wasmBinary=[];if(typeof WebAssembly!=\"object\"){abort(\"no native wasm support detected\")}var wasmMemory;var ABORT=false;var EXITSTATUS;function assert(condition,text){if(!condition){abort(text)}}var UTF8Decoder=typeof TextDecoder!=\"undefined\"?new TextDecoder(\"utf8\"):undefined;function UTF8ArrayToString(heapOrArray,idx,maxBytesToRead){var endIdx=idx+maxBytesToRead;var endPtr=idx;while(heapOrArray[endPtr]&&!(endPtr>=endIdx))++endPtr;if(endPtr-idx>16&&heapOrArray.buffer&&UTF8Decoder){return UTF8Decoder.decode(heapOrArray.subarray(idx,endPtr))}var str=\"\";while(idx<endPtr){var u0=heapOrArray[idx++];if(!(u0&128)){str+=String.fromCharCode(u0);continue}var u1=heapOrArray[idx++]&63;if((u0&224)==192){str+=String.fromCharCode((u0&31)<<6|u1);continue}var u2=heapOrArray[idx++]&63;if((u0&240)==224){u0=(u0&15)<<12|u1<<6|u2}else{u0=(u0&7)<<18|u1<<12|u2<<6|heapOrArray[idx++]&63}if(u0<65536){str+=String.fromCharCode(u0)}else{var ch=u0-65536;str+=String.fromCharCode(55296|ch>>10,56320|ch&1023)}}return str}function UTF8ToString(ptr,maxBytesToRead){return ptr?UTF8ArrayToString(HEAPU8,ptr,maxBytesToRead):\"\"}function stringToUTF8Array(str,heap,outIdx,maxBytesToWrite){if(!(maxBytesToWrite>0))return 0;var startIdx=outIdx;var endIdx=outIdx+maxBytesToWrite-1;for(var i=0;i<str.length;++i){var u=str.charCodeAt(i);if(u>=55296&&u<=57343){var u1=str.charCodeAt(++i);u=65536+((u&1023)<<10)|u1&1023}if(u<=127){if(outIdx>=endIdx)break;heap[outIdx++]=u}else if(u<=2047){if(outIdx+1>=endIdx)break;heap[outIdx++]=192|u>>6;heap[outIdx++]=128|u&63}else if(u<=65535){if(outIdx+2>=endIdx)break;heap[outIdx++]=224|u>>12;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}else{if(outIdx+3>=endIdx)break;heap[outIdx++]=240|u>>18;heap[outIdx++]=128|u>>12&63;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}}heap[outIdx]=0;return outIdx-startIdx}function lengthBytesUTF8(str){var len=0;for(var i=0;i<str.length;++i){var c=str.charCodeAt(i);if(c<=127){len++}else if(c<=2047){len+=2}else if(c>=55296&&c<=57343){len+=4;++i}else{len+=3}}return len}var HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64;function updateMemoryViews(){var b=wasmMemory.buffer;Module[\"HEAP8\"]=HEAP8=new Int8Array(b);Module[\"HEAP16\"]=HEAP16=new Int16Array(b);Module[\"HEAP32\"]=HEAP32=new Int32Array(b);Module[\"HEAPU8\"]=HEAPU8=new Uint8Array(b);Module[\"HEAPU16\"]=HEAPU16=new Uint16Array(b);Module[\"HEAPU32\"]=HEAPU32=new Uint32Array(b);Module[\"HEAPF32\"]=HEAPF32=new Float32Array(b);Module[\"HEAPF64\"]=HEAPF64=new Float64Array(b)}var INITIAL_MEMORY=Module[\"INITIAL_MEMORY\"]||16777216;assert(INITIAL_MEMORY>=65536,\"INITIAL_MEMORY should be larger than STACK_SIZE, was \"+INITIAL_MEMORY+\"! (STACK_SIZE=\"+65536+\")\");if(Module[\"wasmMemory\"]){wasmMemory=Module[\"wasmMemory\"]}else{wasmMemory=new WebAssembly.Memory({\"initial\":INITIAL_MEMORY/65536,\"maximum\":2147483648/65536})}updateMemoryViews();INITIAL_MEMORY=wasmMemory.buffer.byteLength;var wasmTable;var __ATPRERUN__=[];var __ATINIT__=[];var __ATPOSTRUN__=[];var runtimeInitialized=false;function keepRuntimeAlive(){return noExitRuntime}function preRun(){if(Module[\"preRun\"]){if(typeof Module[\"preRun\"]==\"function\")Module[\"preRun\"]=[Module[\"preRun\"]];while(Module[\"preRun\"].length){addOnPreRun(Module[\"preRun\"].shift())}}callRuntimeCallbacks(__ATPRERUN__)}function initRuntime(){runtimeInitialized=true;callRuntimeCallbacks(__ATINIT__)}function postRun(){if(Module[\"postRun\"]){if(typeof Module[\"postRun\"]==\"function\")Module[\"postRun\"]=[Module[\"postRun\"]];while(Module[\"postRun\"].length){addOnPostRun(Module[\"postRun\"].shift())}}callRuntimeCallbacks(__ATPOSTRUN__)}function addOnPreRun(cb){__ATPRERUN__.unshift(cb)}function addOnInit(cb){__ATINIT__.unshift(cb)}function addOnPostRun(cb){__ATPOSTRUN__.unshift(cb)}var runDependencies=0;var runDependencyWatcher=null;var dependenciesFulfilled=null;function addRunDependency(id){runDependencies++;if(Module[\"monitorRunDependencies\"]){Module[\"monitorRunDependencies\"](runDependencies)}}function removeRunDependency(id){runDependencies--;if(Module[\"monitorRunDependencies\"]){Module[\"monitorRunDependencies\"](runDependencies)}if(runDependencies==0){if(runDependencyWatcher!==null){clearInterval(runDependencyWatcher);runDependencyWatcher=null}if(dependenciesFulfilled){var callback=dependenciesFulfilled;dependenciesFulfilled=null;callback()}}}function abort(what){if(Module[\"onAbort\"]){Module[\"onAbort\"](what)}what=\"Aborted(\"+what+\")\";err(what);ABORT=true;EXITSTATUS=1;what+=\". Build with -sASSERTIONS for more info.\";var e=new WebAssembly.RuntimeError(what);readyPromiseReject(e);throw e}var dataURIPrefix=\"data:application/octet-stream;base64,\";function isDataURI(filename){return filename.startsWith(dataURIPrefix)}function isFileURI(filename){return filename.startsWith(\"file://\")}var wasmBinaryFile;wasmBinaryFile=\"draco_decoder.wasm\";if(!isDataURI(wasmBinaryFile)){wasmBinaryFile=locateFile(wasmBinaryFile)}function getBinary(file){try{if(file==wasmBinaryFile&&wasmBinary){return new Uint8Array(wasmBinary)}var binary=tryParseAsDataURI(file);if(binary){return binary}if(readBinary){return readBinary(file)}throw\"both async and sync fetching of the wasm failed\"}catch(err){abort(err)}}function getBinaryPromise(){if(!wasmBinary&&(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER)){if(typeof fetch==\"function\"&&!isFileURI(wasmBinaryFile)){return fetch(wasmBinaryFile,{credentials:\"same-origin\"}).then(function(response){if(!response[\"ok\"]){throw\"failed to load wasm binary file at '\"+wasmBinaryFile+\"'\"}return response[\"arrayBuffer\"]()}).catch(function(){return getBinary(wasmBinaryFile)})}else{if(readAsync){return new Promise(function(resolve,reject){readAsync(wasmBinaryFile,function(response){resolve(new Uint8Array(response))},reject)})}}}return Promise.resolve().then(function(){return getBinary(wasmBinaryFile)})}function createWasm(){var info={\"a\":wasmImports};function receiveInstance(instance,module){var exports=instance.exports;Module[\"asm\"]=exports;wasmTable=Module[\"asm\"][\"j\"];addOnInit(Module[\"asm\"][\"i\"]);removeRunDependency(\"wasm-instantiate\")}addRunDependency(\"wasm-instantiate\");function receiveInstantiationResult(result){receiveInstance(result[\"instance\"])}function instantiateArrayBuffer(receiver){return getBinaryPromise().then(function(binary){return WebAssembly.instantiate(binary,info)}).then(function(instance){return instance}).then(receiver,function(reason){err(\"failed to asynchronously prepare wasm: \"+reason);abort(reason)})}function instantiateAsync(){if(!wasmBinary&&typeof WebAssembly.instantiateStreaming==\"function\"&&!isDataURI(wasmBinaryFile)&&!isFileURI(wasmBinaryFile)&&!ENVIRONMENT_IS_NODE&&typeof fetch==\"function\"){return fetch(wasmBinaryFile,{credentials:\"same-origin\"}).then(function(response){var result=WebAssembly.instantiateStreaming(response,info);return result.then(receiveInstantiationResult,function(reason){err(\"wasm streaming compile failed: \"+reason);err(\"falling back to ArrayBuffer instantiation\");return instantiateArrayBuffer(receiveInstantiationResult)})})}else{return instantiateArrayBuffer(receiveInstantiationResult)}}if(Module[\"instantiateWasm\"]){try{var exports=Module[\"instantiateWasm\"](info,receiveInstance);return exports}catch(e){err(\"Module.instantiateWasm callback failed with error: \"+e);readyPromiseReject(e)}}instantiateAsync().catch(readyPromiseReject);return{}}function ExitStatus(status){this.name=\"ExitStatus\";this.message=\"Program terminated with exit(\"+status+\")\";this.status=status}function callRuntimeCallbacks(callbacks){while(callbacks.length>0){callbacks.shift()(Module)}}function intArrayToString(array){var ret=[];for(var i=0;i<array.length;i++){var chr=array[i];if(chr>255){chr&=255}ret.push(String.fromCharCode(chr))}return ret.join(\"\")}function ExceptionInfo(excPtr){this.excPtr=excPtr;this.ptr=excPtr-24;this.set_type=function(type){HEAPU32[this.ptr+4>>2]=type};this.get_type=function(){return HEAPU32[this.ptr+4>>2]};this.set_destructor=function(destructor){HEAPU32[this.ptr+8>>2]=destructor};this.get_destructor=function(){return HEAPU32[this.ptr+8>>2]};this.set_refcount=function(refcount){HEAP32[this.ptr>>2]=refcount};this.set_caught=function(caught){caught=caught?1:0;HEAP8[this.ptr+12>>0]=caught};this.get_caught=function(){return HEAP8[this.ptr+12>>0]!=0};this.set_rethrown=function(rethrown){rethrown=rethrown?1:0;HEAP8[this.ptr+13>>0]=rethrown};this.get_rethrown=function(){return HEAP8[this.ptr+13>>0]!=0};this.init=function(type,destructor){this.set_adjusted_ptr(0);this.set_type(type);this.set_destructor(destructor);this.set_refcount(0);this.set_caught(false);this.set_rethrown(false)};this.add_ref=function(){var value=HEAP32[this.ptr>>2];HEAP32[this.ptr>>2]=value+1};this.release_ref=function(){var prev=HEAP32[this.ptr>>2];HEAP32[this.ptr>>2]=prev-1;return prev===1};this.set_adjusted_ptr=function(adjustedPtr){HEAPU32[this.ptr+16>>2]=adjustedPtr};this.get_adjusted_ptr=function(){return HEAPU32[this.ptr+16>>2]};this.get_exception_ptr=function(){var isPointer=___cxa_is_pointer_type(this.get_type());if(isPointer){return HEAPU32[this.excPtr>>2]}var adjusted=this.get_adjusted_ptr();if(adjusted!==0)return adjusted;return this.excPtr}}var exceptionLast=0;var uncaughtExceptionCount=0;function ___cxa_throw(ptr,type,destructor){var info=new ExceptionInfo(ptr);info.init(type,destructor);exceptionLast=ptr;uncaughtExceptionCount++;throw ptr}function _abort(){abort(\"\")}function _emscripten_memcpy_big(dest,src,num){HEAPU8.copyWithin(dest,src,src+num)}function getHeapMax(){return 2147483648}function emscripten_realloc_buffer(size){var b=wasmMemory.buffer;try{wasmMemory.grow(size-b.byteLength+65535>>>16);updateMemoryViews();return 1}catch(e){}}function _emscripten_resize_heap(requestedSize){var oldSize=HEAPU8.length;requestedSize=requestedSize>>>0;var maxHeapSize=getHeapMax();if(requestedSize>maxHeapSize){return false}let alignUp=(x,multiple)=>x+(multiple-x%multiple)%multiple;for(var cutDown=1;cutDown<=4;cutDown*=2){var overGrownHeapSize=oldSize*(1+.2/cutDown);overGrownHeapSize=Math.min(overGrownHeapSize,requestedSize+100663296);var newSize=Math.min(maxHeapSize,alignUp(Math.max(requestedSize,overGrownHeapSize),65536));var replacement=emscripten_realloc_buffer(newSize);if(replacement){return true}}return false}var SYSCALLS={varargs:undefined,get:function(){SYSCALLS.varargs+=4;var ret=HEAP32[SYSCALLS.varargs-4>>2];return ret},getStr:function(ptr){var ret=UTF8ToString(ptr);return ret}};function _fd_close(fd){return 52}function _fd_seek(fd,offset_low,offset_high,whence,newOffset){return 70}var printCharBuffers=[null,[],[]];function printChar(stream,curr){var buffer=printCharBuffers[stream];if(curr===0||curr===10){(stream===1?out:err)(UTF8ArrayToString(buffer,0));buffer.length=0}else{buffer.push(curr)}}function _fd_write(fd,iov,iovcnt,pnum){var num=0;for(var i=0;i<iovcnt;i++){var ptr=HEAPU32[iov>>2];var len=HEAPU32[iov+4>>2];iov+=8;for(var j=0;j<len;j++){printChar(fd,HEAPU8[ptr+j])}num+=len}HEAPU32[pnum>>2]=num;return 0}function intArrayFromString(stringy,dontAddNull,length){var len=length>0?length:lengthBytesUTF8(stringy)+1;var u8array=new Array(len);var numBytesWritten=stringToUTF8Array(stringy,u8array,0,u8array.length);if(dontAddNull)u8array.length=numBytesWritten;return u8array}var decodeBase64=typeof atob==\"function\"?atob:function(input){var keyStr=\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\";var output=\"\";var chr1,chr2,chr3;var enc1,enc2,enc3,enc4;var i=0;input=input.replace(/[^A-Za-z0-9\\+\\/\\=]/g,\"\");do{enc1=keyStr.indexOf(input.charAt(i++));enc2=keyStr.indexOf(input.charAt(i++));enc3=keyStr.indexOf(input.charAt(i++));enc4=keyStr.indexOf(input.charAt(i++));chr1=enc1<<2|enc2>>4;chr2=(enc2&15)<<4|enc3>>2;chr3=(enc3&3)<<6|enc4;output=output+String.fromCharCode(chr1);if(enc3!==64){output=output+String.fromCharCode(chr2)}if(enc4!==64){output=output+String.fromCharCode(chr3)}}while(i<input.length);return output};function intArrayFromBase64(s){if(typeof ENVIRONMENT_IS_NODE==\"boolean\"&&ENVIRONMENT_IS_NODE){var buf=Buffer.from(s,\"base64\");return new Uint8Array(buf[\"buffer\"],buf[\"byteOffset\"],buf[\"byteLength\"])}try{var decoded=decodeBase64(s);var bytes=new Uint8Array(decoded.length);for(var i=0;i<decoded.length;++i){bytes[i]=decoded.charCodeAt(i)}return bytes}catch(_){throw new Error(\"Converting base64 string to bytes failed.\")}}function tryParseAsDataURI(filename){if(!isDataURI(filename)){return}return intArrayFromBase64(filename.slice(dataURIPrefix.length))}var wasmImports={\"c\":___cxa_throw,\"b\":_abort,\"h\":_emscripten_memcpy_big,\"f\":_emscripten_resize_heap,\"g\":_fd_close,\"e\":_fd_seek,\"d\":_fd_write,\"a\":wasmMemory};var asm=createWasm();var ___wasm_call_ctors=function(){return(___wasm_call_ctors=Module[\"asm\"][\"i\"]).apply(null,arguments)};var _emscripten_bind_VoidPtr___destroy___0=Module[\"_emscripten_bind_VoidPtr___destroy___0\"]=function(){return(_emscripten_bind_VoidPtr___destroy___0=Module[\"_emscripten_bind_VoidPtr___destroy___0\"]=Module[\"asm\"][\"k\"]).apply(null,arguments)};var _emscripten_bind_DecoderBuffer_DecoderBuffer_0=Module[\"_emscripten_bind_DecoderBuffer_DecoderBuffer_0\"]=function(){return(_emscripten_bind_DecoderBuffer_DecoderBuffer_0=Module[\"_emscripten_bind_DecoderBuffer_DecoderBuffer_0\"]=Module[\"asm\"][\"l\"]).apply(null,arguments)};var _emscripten_bind_DecoderBuffer_Init_2=Module[\"_emscripten_bind_DecoderBuffer_Init_2\"]=function(){return(_emscripten_bind_DecoderBuffer_Init_2=Module[\"_emscripten_bind_DecoderBuffer_Init_2\"]=Module[\"asm\"][\"m\"]).apply(null,arguments)};var _emscripten_bind_DecoderBuffer___destroy___0=Module[\"_emscripten_bind_DecoderBuffer___destroy___0\"]=function(){return(_emscripten_bind_DecoderBuffer___destroy___0=Module[\"_emscripten_bind_DecoderBuffer___destroy___0\"]=Module[\"asm\"][\"n\"]).apply(null,arguments)};var _emscripten_bind_AttributeTransformData_AttributeTransformData_0=Module[\"_emscripten_bind_AttributeTransformData_AttributeTransformData_0\"]=function(){return(_emscripten_bind_AttributeTransformData_AttributeTransformData_0=Module[\"_emscripten_bind_AttributeTransformData_AttributeTransformData_0\"]=Module[\"asm\"][\"o\"]).apply(null,arguments)};var _emscripten_bind_AttributeTransformData_transform_type_0=Module[\"_emscripten_bind_AttributeTransformData_transform_type_0\"]=function(){return(_emscripten_bind_AttributeTransformData_transform_type_0=Module[\"_emscripten_bind_AttributeTransformData_transform_type_0\"]=Module[\"asm\"][\"p\"]).apply(null,arguments)};var _emscripten_bind_AttributeTransformData___destroy___0=Module[\"_emscripten_bind_AttributeTransformData___destroy___0\"]=function(){return(_emscripten_bind_AttributeTransformData___destroy___0=Module[\"_emscripten_bind_AttributeTransformData___destroy___0\"]=Module[\"asm\"][\"q\"]).apply(null,arguments)};var _emscripten_bind_GeometryAttribute_GeometryAttribute_0=Module[\"_emscripten_bind_GeometryAttribute_GeometryAttribute_0\"]=function(){return(_emscripten_bind_GeometryAttribute_GeometryAttribute_0=Module[\"_emscripten_bind_GeometryAttribute_GeometryAttribute_0\"]=Module[\"asm\"][\"r\"]).apply(null,arguments)};var _emscripten_bind_GeometryAttribute___destroy___0=Module[\"_emscripten_bind_GeometryAttribute___destroy___0\"]=function(){return(_emscripten_bind_GeometryAttribute___destroy___0=Module[\"_emscripten_bind_GeometryAttribute___destroy___0\"]=Module[\"asm\"][\"s\"]).apply(null,arguments)};var _emscripten_bind_PointAttribute_PointAttribute_0=Module[\"_emscripten_bind_PointAttribute_PointAttribute_0\"]=function(){return(_emscripten_bind_PointAttribute_PointAttribute_0=Module[\"_emscripten_bind_PointAttribute_PointAttribute_0\"]=Module[\"asm\"][\"t\"]).apply(null,arguments)};var _emscripten_bind_PointAttribute_size_0=Module[\"_emscripten_bind_PointAttribute_size_0\"]=function(){return(_emscripten_bind_PointAttribute_size_0=Module[\"_emscripten_bind_PointAttribute_size_0\"]=Module[\"asm\"][\"u\"]).apply(null,arguments)};var _emscripten_bind_PointAttribute_GetAttributeTransformData_0=Module[\"_emscripten_bind_PointAttribute_GetAttributeTransformData_0\"]=function(){return(_emscripten_bind_PointAttribute_GetAttributeTransformData_0=Module[\"_emscripten_bind_PointAttribute_GetAttributeTransformData_0\"]=Module[\"asm\"][\"v\"]).apply(null,arguments)};var _emscripten_bind_PointAttribute_attribute_type_0=Module[\"_emscripten_bind_PointAttribute_attribute_type_0\"]=function(){return(_emscripten_bind_PointAttribute_attribute_type_0=Module[\"_emscripten_bind_PointAttribute_attribute_type_0\"]=Module[\"asm\"][\"w\"]).apply(null,arguments)};var _emscripten_bind_PointAttribute_data_type_0=Module[\"_emscripten_bind_PointAttribute_data_type_0\"]=function(){return(_emscripten_bind_PointAttribute_data_type_0=Module[\"_emscripten_bind_PointAttribute_data_type_0\"]=Module[\"asm\"][\"x\"]).apply(null,arguments)};var _emscripten_bind_PointAttribute_num_components_0=Module[\"_emscripten_bind_PointAttribute_num_components_0\"]=function(){return(_emscripten_bind_PointAttribute_num_components_0=Module[\"_emscripten_bind_PointAttribute_num_components_0\"]=Module[\"asm\"][\"y\"]).apply(null,arguments)};var _emscripten_bind_PointAttribute_normalized_0=Module[\"_emscripten_bind_PointAttribute_normalized_0\"]=function(){return(_emscripten_bind_PointAttribute_normalized_0=Module[\"_emscripten_bind_PointAttribute_normalized_0\"]=Module[\"asm\"][\"z\"]).apply(null,arguments)};var _emscripten_bind_PointAttribute_byte_stride_0=Module[\"_emscripten_bind_PointAttribute_byte_stride_0\"]=function(){return(_emscripten_bind_PointAttribute_byte_stride_0=Module[\"_emscripten_bind_PointAttribute_byte_stride_0\"]=Module[\"asm\"][\"A\"]).apply(null,arguments)};var _emscripten_bind_PointAttribute_byte_offset_0=Module[\"_emscripten_bind_PointAttribute_byte_offset_0\"]=function(){return(_emscripten_bind_PointAttribute_byte_offset_0=Module[\"_emscripten_bind_PointAttribute_byte_offset_0\"]=Module[\"asm\"][\"B\"]).apply(null,arguments)};var _emscripten_bind_PointAttribute_unique_id_0=Module[\"_emscripten_bind_PointAttribute_unique_id_0\"]=function(){return(_emscripten_bind_PointAttribute_unique_id_0=Module[\"_emscripten_bind_PointAttribute_unique_id_0\"]=Module[\"asm\"][\"C\"]).apply(null,arguments)};var _emscripten_bind_PointAttribute___destroy___0=Module[\"_emscripten_bind_PointAttribute___destroy___0\"]=function(){return(_emscripten_bind_PointAttribute___destroy___0=Module[\"_emscripten_bind_PointAttribute___destroy___0\"]=Module[\"asm\"][\"D\"]).apply(null,arguments)};var _emscripten_bind_AttributeQuantizationTransform_AttributeQuantizationTransform_0=Module[\"_emscripten_bind_AttributeQuantizationTransform_AttributeQuantizationTransform_0\"]=function(){return(_emscripten_bind_AttributeQuantizationTransform_AttributeQuantizationTransform_0=Module[\"_emscripten_bind_AttributeQuantizationTransform_AttributeQuantizationTransform_0\"]=Module[\"asm\"][\"E\"]).apply(null,arguments)};var _emscripten_bind_AttributeQuantizationTransform_InitFromAttribute_1=Module[\"_emscripten_bind_AttributeQuantizationTransform_InitFromAttribute_1\"]=function(){return(_emscripten_bind_AttributeQuantizationTransform_InitFromAttribute_1=Module[\"_emscripten_bind_AttributeQuantizationTransform_InitFromAttribute_1\"]=Module[\"asm\"][\"F\"]).apply(null,arguments)};var _emscripten_bind_AttributeQuantizationTransform_quantization_bits_0=Module[\"_emscripten_bind_AttributeQuantizationTransform_quantization_bits_0\"]=function(){return(_emscripten_bind_AttributeQuantizationTransform_quantization_bits_0=Module[\"_emscripten_bind_AttributeQuantizationTransform_quantization_bits_0\"]=Module[\"asm\"][\"G\"]).apply(null,arguments)};var _emscripten_bind_AttributeQuantizationTransform_min_value_1=Module[\"_emscripten_bind_AttributeQuantizationTransform_min_value_1\"]=function(){return(_emscripten_bind_AttributeQuantizationTransform_min_value_1=Module[\"_emscripten_bind_AttributeQuantizationTransform_min_value_1\"]=Module[\"asm\"][\"H\"]).apply(null,arguments)};var _emscripten_bind_AttributeQuantizationTransform_range_0=Module[\"_emscripten_bind_AttributeQuantizationTransform_range_0\"]=function(){return(_emscripten_bind_AttributeQuantizationTransform_range_0=Module[\"_emscripten_bind_AttributeQuantizationTransform_range_0\"]=Module[\"asm\"][\"I\"]).apply(null,arguments)};var _emscripten_bind_AttributeQuantizationTransform___destroy___0=Module[\"_emscripten_bind_AttributeQuantizationTransform___destroy___0\"]=function(){return(_emscripten_bind_AttributeQuantizationTransform___destroy___0=Module[\"_emscripten_bind_AttributeQuantizationTransform___destroy___0\"]=Module[\"asm\"][\"J\"]).apply(null,arguments)};var _emscripten_bind_AttributeOctahedronTransform_AttributeOctahedronTransform_0=Module[\"_emscripten_bind_AttributeOctahedronTransform_AttributeOctahedronTransform_0\"]=function(){return(_emscripten_bind_AttributeOctahedronTransform_AttributeOctahedronTransform_0=Module[\"_emscripten_bind_AttributeOctahedronTransform_AttributeOctahedronTransform_0\"]=Module[\"asm\"][\"K\"]).apply(null,arguments)};var _emscripten_bind_AttributeOctahedronTransform_InitFromAttribute_1=Module[\"_emscripten_bind_AttributeOctahedronTransform_InitFromAttribute_1\"]=function(){return(_emscripten_bind_AttributeOctahedronTransform_InitFromAttribute_1=Module[\"_emscripten_bind_AttributeOctahedronTransform_InitFromAttribute_1\"]=Module[\"asm\"][\"L\"]).apply(null,arguments)};var _emscripten_bind_AttributeOctahedronTransform_quantization_bits_0=Module[\"_emscripten_bind_AttributeOctahedronTransform_quantization_bits_0\"]=function(){return(_emscripten_bind_AttributeOctahedronTransform_quantization_bits_0=Module[\"_emscripten_bind_AttributeOctahedronTransform_quantization_bits_0\"]=Module[\"asm\"][\"M\"]).apply(null,arguments)};var _emscripten_bind_AttributeOctahedronTransform___destroy___0=Module[\"_emscripten_bind_AttributeOctahedronTransform___destroy___0\"]=function(){return(_emscripten_bind_AttributeOctahedronTransform___destroy___0=Module[\"_emscripten_bind_AttributeOctahedronTransform___destroy___0\"]=Module[\"asm\"][\"N\"]).apply(null,arguments)};var _emscripten_bind_PointCloud_PointCloud_0=Module[\"_emscripten_bind_PointCloud_PointCloud_0\"]=function(){return(_emscripten_bind_PointCloud_PointCloud_0=Module[\"_emscripten_bind_PointCloud_PointCloud_0\"]=Module[\"asm\"][\"O\"]).apply(null,arguments)};var _emscripten_bind_PointCloud_num_attributes_0=Module[\"_emscripten_bind_PointCloud_num_attributes_0\"]=function(){return(_emscripten_bind_PointCloud_num_attributes_0=Module[\"_emscripten_bind_PointCloud_num_attributes_0\"]=Module[\"asm\"][\"P\"]).apply(null,arguments)};var _emscripten_bind_PointCloud_num_points_0=Module[\"_emscripten_bind_PointCloud_num_points_0\"]=function(){return(_emscripten_bind_PointCloud_num_points_0=Module[\"_emscripten_bind_PointCloud_num_points_0\"]=Module[\"asm\"][\"Q\"]).apply(null,arguments)};var _emscripten_bind_PointCloud___destroy___0=Module[\"_emscripten_bind_PointCloud___destroy___0\"]=function(){return(_emscripten_bind_PointCloud___destroy___0=Module[\"_emscripten_bind_PointCloud___destroy___0\"]=Module[\"asm\"][\"R\"]).apply(null,arguments)};var _emscripten_bind_Mesh_Mesh_0=Module[\"_emscripten_bind_Mesh_Mesh_0\"]=function(){return(_emscripten_bind_Mesh_Mesh_0=Module[\"_emscripten_bind_Mesh_Mesh_0\"]=Module[\"asm\"][\"S\"]).apply(null,arguments)};var _emscripten_bind_Mesh_num_faces_0=Module[\"_emscripten_bind_Mesh_num_faces_0\"]=function(){return(_emscripten_bind_Mesh_num_faces_0=Module[\"_emscripten_bind_Mesh_num_faces_0\"]=Module[\"asm\"][\"T\"]).apply(null,arguments)};var _emscripten_bind_Mesh_num_attributes_0=Module[\"_emscripten_bind_Mesh_num_attributes_0\"]=function(){return(_emscripten_bind_Mesh_num_attributes_0=Module[\"_emscripten_bind_Mesh_num_attributes_0\"]=Module[\"asm\"][\"U\"]).apply(null,arguments)};var _emscripten_bind_Mesh_num_points_0=Module[\"_emscripten_bind_Mesh_num_points_0\"]=function(){return(_emscripten_bind_Mesh_num_points_0=Module[\"_emscripten_bind_Mesh_num_points_0\"]=Module[\"asm\"][\"V\"]).apply(null,arguments)};var _emscripten_bind_Mesh___destroy___0=Module[\"_emscripten_bind_Mesh___destroy___0\"]=function(){return(_emscripten_bind_Mesh___destroy___0=Module[\"_emscripten_bind_Mesh___destroy___0\"]=Module[\"asm\"][\"W\"]).apply(null,arguments)};var _emscripten_bind_Metadata_Metadata_0=Module[\"_emscripten_bind_Metadata_Metadata_0\"]=function(){return(_emscripten_bind_Metadata_Metadata_0=Module[\"_emscripten_bind_Metadata_Metadata_0\"]=Module[\"asm\"][\"X\"]).apply(null,arguments)};var _emscripten_bind_Metadata___destroy___0=Module[\"_emscripten_bind_Metadata___destroy___0\"]=function(){return(_emscripten_bind_Metadata___destroy___0=Module[\"_emscripten_bind_Metadata___destroy___0\"]=Module[\"asm\"][\"Y\"]).apply(null,arguments)};var _emscripten_bind_Status_code_0=Module[\"_emscripten_bind_Status_code_0\"]=function(){return(_emscripten_bind_Status_code_0=Module[\"_emscripten_bind_Status_code_0\"]=Module[\"asm\"][\"Z\"]).apply(null,arguments)};var _emscripten_bind_Status_ok_0=Module[\"_emscripten_bind_Status_ok_0\"]=function(){return(_emscripten_bind_Status_ok_0=Module[\"_emscripten_bind_Status_ok_0\"]=Module[\"asm\"][\"_\"]).apply(null,arguments)};var _emscripten_bind_Status_error_msg_0=Module[\"_emscripten_bind_Status_error_msg_0\"]=function(){return(_emscripten_bind_Status_error_msg_0=Module[\"_emscripten_bind_Status_error_msg_0\"]=Module[\"asm\"][\"$\"]).apply(null,arguments)};var _emscripten_bind_Status___destroy___0=Module[\"_emscripten_bind_Status___destroy___0\"]=function(){return(_emscripten_bind_Status___destroy___0=Module[\"_emscripten_bind_Status___destroy___0\"]=Module[\"asm\"][\"aa\"]).apply(null,arguments)};var _emscripten_bind_DracoFloat32Array_DracoFloat32Array_0=Module[\"_emscripten_bind_DracoFloat32Array_DracoFloat32Array_0\"]=function(){return(_emscripten_bind_DracoFloat32Array_DracoFloat32Array_0=Module[\"_emscripten_bind_DracoFloat32Array_DracoFloat32Array_0\"]=Module[\"asm\"][\"ba\"]).apply(null,arguments)};var _emscripten_bind_DracoFloat32Array_GetValue_1=Module[\"_emscripten_bind_DracoFloat32Array_GetValue_1\"]=function(){return(_emscripten_bind_DracoFloat32Array_GetValue_1=Module[\"_emscripten_bind_DracoFloat32Array_GetValue_1\"]=Module[\"asm\"][\"ca\"]).apply(null,arguments)};var _emscripten_bind_DracoFloat32Array_size_0=Module[\"_emscripten_bind_DracoFloat32Array_size_0\"]=function(){return(_emscripten_bind_DracoFloat32Array_size_0=Module[\"_emscripten_bind_DracoFloat32Array_size_0\"]=Module[\"asm\"][\"da\"]).apply(null,arguments)};var _emscripten_bind_DracoFloat32Array___destroy___0=Module[\"_emscripten_bind_DracoFloat32Array___destroy___0\"]=function(){return(_emscripten_bind_DracoFloat32Array___destroy___0=Module[\"_emscripten_bind_DracoFloat32Array___destroy___0\"]=Module[\"asm\"][\"ea\"]).apply(null,arguments)};var _emscripten_bind_DracoInt8Array_DracoInt8Array_0=Module[\"_emscripten_bind_DracoInt8Array_DracoInt8Array_0\"]=function(){return(_emscripten_bind_DracoInt8Array_DracoInt8Array_0=Module[\"_emscripten_bind_DracoInt8Array_DracoInt8Array_0\"]=Module[\"asm\"][\"fa\"]).apply(null,arguments)};var _emscripten_bind_DracoInt8Array_GetValue_1=Module[\"_emscripten_bind_DracoInt8Array_GetValue_1\"]=function(){return(_emscripten_bind_DracoInt8Array_GetValue_1=Module[\"_emscripten_bind_DracoInt8Array_GetValue_1\"]=Module[\"asm\"][\"ga\"]).apply(null,arguments)};var _emscripten_bind_DracoInt8Array_size_0=Module[\"_emscripten_bind_DracoInt8Array_size_0\"]=function(){return(_emscripten_bind_DracoInt8Array_size_0=Module[\"_emscripten_bind_DracoInt8Array_size_0\"]=Module[\"asm\"][\"ha\"]).apply(null,arguments)};var _emscripten_bind_DracoInt8Array___destroy___0=Module[\"_emscripten_bind_DracoInt8Array___destroy___0\"]=function(){return(_emscripten_bind_DracoInt8Array___destroy___0=Module[\"_emscripten_bind_DracoInt8Array___destroy___0\"]=Module[\"asm\"][\"ia\"]).apply(null,arguments)};var _emscripten_bind_DracoUInt8Array_DracoUInt8Array_0=Module[\"_emscripten_bind_DracoUInt8Array_DracoUInt8Array_0\"]=function(){return(_emscripten_bind_DracoUInt8Array_DracoUInt8Array_0=Module[\"_emscripten_bind_DracoUInt8Array_DracoUInt8Array_0\"]=Module[\"asm\"][\"ja\"]).apply(null,arguments)};var _emscripten_bind_DracoUInt8Array_GetValue_1=Module[\"_emscripten_bind_DracoUInt8Array_GetValue_1\"]=function(){return(_emscripten_bind_DracoUInt8Array_GetValue_1=Module[\"_emscripten_bind_DracoUInt8Array_GetValue_1\"]=Module[\"asm\"][\"ka\"]).apply(null,arguments)};var _emscripten_bind_DracoUInt8Array_size_0=Module[\"_emscripten_bind_DracoUInt8Array_size_0\"]=function(){return(_emscripten_bind_DracoUInt8Array_size_0=Module[\"_emscripten_bind_DracoUInt8Array_size_0\"]=Module[\"asm\"][\"la\"]).apply(null,arguments)};var _emscripten_bind_DracoUInt8Array___destroy___0=Module[\"_emscripten_bind_DracoUInt8Array___destroy___0\"]=function(){return(_emscripten_bind_DracoUInt8Array___destroy___0=Module[\"_emscripten_bind_DracoUInt8Array___destroy___0\"]=Module[\"asm\"][\"ma\"]).apply(null,arguments)};var _emscripten_bind_DracoInt16Array_DracoInt16Array_0=Module[\"_emscripten_bind_DracoInt16Array_DracoInt16Array_0\"]=function(){return(_emscripten_bind_DracoInt16Array_DracoInt16Array_0=Module[\"_emscripten_bind_DracoInt16Array_DracoInt16Array_0\"]=Module[\"asm\"][\"na\"]).apply(null,arguments)};var _emscripten_bind_DracoInt16Array_GetValue_1=Module[\"_emscripten_bind_DracoInt16Array_GetValue_1\"]=function(){return(_emscripten_bind_DracoInt16Array_GetValue_1=Module[\"_emscripten_bind_DracoInt16Array_GetValue_1\"]=Module[\"asm\"][\"oa\"]).apply(null,arguments)};var _emscripten_bind_DracoInt16Array_size_0=Module[\"_emscripten_bind_DracoInt16Array_size_0\"]=function(){return(_emscripten_bind_DracoInt16Array_size_0=Module[\"_emscripten_bind_DracoInt16Array_size_0\"]=Module[\"asm\"][\"pa\"]).apply(null,arguments)};var _emscripten_bind_DracoInt16Array___destroy___0=Module[\"_emscripten_bind_DracoInt16Array___destroy___0\"]=function(){return(_emscripten_bind_DracoInt16Array___destroy___0=Module[\"_emscripten_bind_DracoInt16Array___destroy___0\"]=Module[\"asm\"][\"qa\"]).apply(null,arguments)};var _emscripten_bind_DracoUInt16Array_DracoUInt16Array_0=Module[\"_emscripten_bind_DracoUInt16Array_DracoUInt16Array_0\"]=function(){return(_emscripten_bind_DracoUInt16Array_DracoUInt16Array_0=Module[\"_emscripten_bind_DracoUInt16Array_DracoUInt16Array_0\"]=Module[\"asm\"][\"ra\"]).apply(null,arguments)};var _emscripten_bind_DracoUInt16Array_GetValue_1=Module[\"_emscripten_bind_DracoUInt16Array_GetValue_1\"]=function(){return(_emscripten_bind_DracoUInt16Array_GetValue_1=Module[\"_emscripten_bind_DracoUInt16Array_GetValue_1\"]=Module[\"asm\"][\"sa\"]).apply(null,arguments)};var _emscripten_bind_DracoUInt16Array_size_0=Module[\"_emscripten_bind_DracoUInt16Array_size_0\"]=function(){return(_emscripten_bind_DracoUInt16Array_size_0=Module[\"_emscripten_bind_DracoUInt16Array_size_0\"]=Module[\"asm\"][\"ta\"]).apply(null,arguments)};var _emscripten_bind_DracoUInt16Array___destroy___0=Module[\"_emscripten_bind_DracoUInt16Array___destroy___0\"]=function(){return(_emscripten_bind_DracoUInt16Array___destroy___0=Module[\"_emscripten_bind_DracoUInt16Array___destroy___0\"]=Module[\"asm\"][\"ua\"]).apply(null,arguments)};var _emscripten_bind_DracoInt32Array_DracoInt32Array_0=Module[\"_emscripten_bind_DracoInt32Array_DracoInt32Array_0\"]=function(){return(_emscripten_bind_DracoInt32Array_DracoInt32Array_0=Module[\"_emscripten_bind_DracoInt32Array_DracoInt32Array_0\"]=Module[\"asm\"][\"va\"]).apply(null,arguments)};var _emscripten_bind_DracoInt32Array_GetValue_1=Module[\"_emscripten_bind_DracoInt32Array_GetValue_1\"]=function(){return(_emscripten_bind_DracoInt32Array_GetValue_1=Module[\"_emscripten_bind_DracoInt32Array_GetValue_1\"]=Module[\"asm\"][\"wa\"]).apply(null,arguments)};var _emscripten_bind_DracoInt32Array_size_0=Module[\"_emscripten_bind_DracoInt32Array_size_0\"]=function(){return(_emscripten_bind_DracoInt32Array_size_0=Module[\"_emscripten_bind_DracoInt32Array_size_0\"]=Module[\"asm\"][\"xa\"]).apply(null,arguments)};var _emscripten_bind_DracoInt32Array___destroy___0=Module[\"_emscripten_bind_DracoInt32Array___destroy___0\"]=function(){return(_emscripten_bind_DracoInt32Array___destroy___0=Module[\"_emscripten_bind_DracoInt32Array___destroy___0\"]=Module[\"asm\"][\"ya\"]).apply(null,arguments)};var _emscripten_bind_DracoUInt32Array_DracoUInt32Array_0=Module[\"_emscripten_bind_DracoUInt32Array_DracoUInt32Array_0\"]=function(){return(_emscripten_bind_DracoUInt32Array_DracoUInt32Array_0=Module[\"_emscripten_bind_DracoUInt32Array_DracoUInt32Array_0\"]=Module[\"asm\"][\"za\"]).apply(null,arguments)};var _emscripten_bind_DracoUInt32Array_GetValue_1=Module[\"_emscripten_bind_DracoUInt32Array_GetValue_1\"]=function(){return(_emscripten_bind_DracoUInt32Array_GetValue_1=Module[\"_emscripten_bind_DracoUInt32Array_GetValue_1\"]=Module[\"asm\"][\"Aa\"]).apply(null,arguments)};var _emscripten_bind_DracoUInt32Array_size_0=Module[\"_emscripten_bind_DracoUInt32Array_size_0\"]=function(){return(_emscripten_bind_DracoUInt32Array_size_0=Module[\"_emscripten_bind_DracoUInt32Array_size_0\"]=Module[\"asm\"][\"Ba\"]).apply(null,arguments)};var _emscripten_bind_DracoUInt32Array___destroy___0=Module[\"_emscripten_bind_DracoUInt32Array___destroy___0\"]=function(){return(_emscripten_bind_DracoUInt32Array___destroy___0=Module[\"_emscripten_bind_DracoUInt32Array___destroy___0\"]=Module[\"asm\"][\"Ca\"]).apply(null,arguments)};var _emscripten_bind_MetadataQuerier_MetadataQuerier_0=Module[\"_emscripten_bind_MetadataQuerier_MetadataQuerier_0\"]=function(){return(_emscripten_bind_MetadataQuerier_MetadataQuerier_0=Module[\"_emscripten_bind_MetadataQuerier_MetadataQuerier_0\"]=Module[\"asm\"][\"Da\"]).apply(null,arguments)};var _emscripten_bind_MetadataQuerier_HasEntry_2=Module[\"_emscripten_bind_MetadataQuerier_HasEntry_2\"]=function(){return(_emscripten_bind_MetadataQuerier_HasEntry_2=Module[\"_emscripten_bind_MetadataQuerier_HasEntry_2\"]=Module[\"asm\"][\"Ea\"]).apply(null,arguments)};var _emscripten_bind_MetadataQuerier_GetIntEntry_2=Module[\"_emscripten_bind_MetadataQuerier_GetIntEntry_2\"]=function(){return(_emscripten_bind_MetadataQuerier_GetIntEntry_2=Module[\"_emscripten_bind_MetadataQuerier_GetIntEntry_2\"]=Module[\"asm\"][\"Fa\"]).apply(null,arguments)};var _emscripten_bind_MetadataQuerier_GetIntEntryArray_3=Module[\"_emscripten_bind_MetadataQuerier_GetIntEntryArray_3\"]=function(){return(_emscripten_bind_MetadataQuerier_GetIntEntryArray_3=Module[\"_emscripten_bind_MetadataQuerier_GetIntEntryArray_3\"]=Module[\"asm\"][\"Ga\"]).apply(null,arguments)};var _emscripten_bind_MetadataQuerier_GetDoubleEntry_2=Module[\"_emscripten_bind_MetadataQuerier_GetDoubleEntry_2\"]=function(){return(_emscripten_bind_MetadataQuerier_GetDoubleEntry_2=Module[\"_emscripten_bind_MetadataQuerier_GetDoubleEntry_2\"]=Module[\"asm\"][\"Ha\"]).apply(null,arguments)};var _emscripten_bind_MetadataQuerier_GetStringEntry_2=Module[\"_emscripten_bind_MetadataQuerier_GetStringEntry_2\"]=function(){return(_emscripten_bind_MetadataQuerier_GetStringEntry_2=Module[\"_emscripten_bind_MetadataQuerier_GetStringEntry_2\"]=Module[\"asm\"][\"Ia\"]).apply(null,arguments)};var _emscripten_bind_MetadataQuerier_NumEntries_1=Module[\"_emscripten_bind_MetadataQuerier_NumEntries_1\"]=function(){return(_emscripten_bind_MetadataQuerier_NumEntries_1=Module[\"_emscripten_bind_MetadataQuerier_NumEntries_1\"]=Module[\"asm\"][\"Ja\"]).apply(null,arguments)};var _emscripten_bind_MetadataQuerier_GetEntryName_2=Module[\"_emscripten_bind_MetadataQuerier_GetEntryName_2\"]=function(){return(_emscripten_bind_MetadataQuerier_GetEntryName_2=Module[\"_emscripten_bind_MetadataQuerier_GetEntryName_2\"]=Module[\"asm\"][\"Ka\"]).apply(null,arguments)};var _emscripten_bind_MetadataQuerier___destroy___0=Module[\"_emscripten_bind_MetadataQuerier___destroy___0\"]=function(){return(_emscripten_bind_MetadataQuerier___destroy___0=Module[\"_emscripten_bind_MetadataQuerier___destroy___0\"]=Module[\"asm\"][\"La\"]).apply(null,arguments)};var _emscripten_bind_Decoder_Decoder_0=Module[\"_emscripten_bind_Decoder_Decoder_0\"]=function(){return(_emscripten_bind_Decoder_Decoder_0=Module[\"_emscripten_bind_Decoder_Decoder_0\"]=Module[\"asm\"][\"Ma\"]).apply(null,arguments)};var _emscripten_bind_Decoder_DecodeArrayToPointCloud_3=Module[\"_emscripten_bind_Decoder_DecodeArrayToPointCloud_3\"]=function(){return(_emscripten_bind_Decoder_DecodeArrayToPointCloud_3=Module[\"_emscripten_bind_Decoder_DecodeArrayToPointCloud_3\"]=Module[\"asm\"][\"Na\"]).apply(null,arguments)};var _emscripten_bind_Decoder_DecodeArrayToMesh_3=Module[\"_emscripten_bind_Decoder_DecodeArrayToMesh_3\"]=function(){return(_emscripten_bind_Decoder_DecodeArrayToMesh_3=Module[\"_emscripten_bind_Decoder_DecodeArrayToMesh_3\"]=Module[\"asm\"][\"Oa\"]).apply(null,arguments)};var _emscripten_bind_Decoder_GetAttributeId_2=Module[\"_emscripten_bind_Decoder_GetAttributeId_2\"]=function(){return(_emscripten_bind_Decoder_GetAttributeId_2=Module[\"_emscripten_bind_Decoder_GetAttributeId_2\"]=Module[\"asm\"][\"Pa\"]).apply(null,arguments)};var _emscripten_bind_Decoder_GetAttributeIdByName_2=Module[\"_emscripten_bind_Decoder_GetAttributeIdByName_2\"]=function(){return(_emscripten_bind_Decoder_GetAttributeIdByName_2=Module[\"_emscripten_bind_Decoder_GetAttributeIdByName_2\"]=Module[\"asm\"][\"Qa\"]).apply(null,arguments)};var _emscripten_bind_Decoder_GetAttributeIdByMetadataEntry_3=Module[\"_emscripten_bind_Decoder_GetAttributeIdByMetadataEntry_3\"]=function(){return(_emscripten_bind_Decoder_GetAttributeIdByMetadataEntry_3=Module[\"_emscripten_bind_Decoder_GetAttributeIdByMetadataEntry_3\"]=Module[\"asm\"][\"Ra\"]).apply(null,arguments)};var _emscripten_bind_Decoder_GetAttribute_2=Module[\"_emscripten_bind_Decoder_GetAttribute_2\"]=function(){return(_emscripten_bind_Decoder_GetAttribute_2=Module[\"_emscripten_bind_Decoder_GetAttribute_2\"]=Module[\"asm\"][\"Sa\"]).apply(null,arguments)};var _emscripten_bind_Decoder_GetAttributeByUniqueId_2=Module[\"_emscripten_bind_Decoder_GetAttributeByUniqueId_2\"]=function(){return(_emscripten_bind_Decoder_GetAttributeByUniqueId_2=Module[\"_emscripten_bind_Decoder_GetAttributeByUniqueId_2\"]=Module[\"asm\"][\"Ta\"]).apply(null,arguments)};var _emscripten_bind_Decoder_GetMetadata_1=Module[\"_emscripten_bind_Decoder_GetMetadata_1\"]=function(){return(_emscripten_bind_Decoder_GetMetadata_1=Module[\"_emscripten_bind_Decoder_GetMetadata_1\"]=Module[\"asm\"][\"Ua\"]).apply(null,arguments)};var _emscripten_bind_Decoder_GetAttributeMetadata_2=Module[\"_emscripten_bind_Decoder_GetAttributeMetadata_2\"]=function(){return(_emscripten_bind_Decoder_GetAttributeMetadata_2=Module[\"_emscripten_bind_Decoder_GetAttributeMetadata_2\"]=Module[\"asm\"][\"Va\"]).apply(null,arguments)};var _emscripten_bind_Decoder_GetFaceFromMesh_3=Module[\"_emscripten_bind_Decoder_GetFaceFromMesh_3\"]=function(){return(_emscripten_bind_Decoder_GetFaceFromMesh_3=Module[\"_emscripten_bind_Decoder_GetFaceFromMesh_3\"]=Module[\"asm\"][\"Wa\"]).apply(null,arguments)};var _emscripten_bind_Decoder_GetTriangleStripsFromMesh_2=Module[\"_emscripten_bind_Decoder_GetTriangleStripsFromMesh_2\"]=function(){return(_emscripten_bind_Decoder_GetTriangleStripsFromMesh_2=Module[\"_emscripten_bind_Decoder_GetTriangleStripsFromMesh_2\"]=Module[\"asm\"][\"Xa\"]).apply(null,arguments)};var _emscripten_bind_Decoder_GetTrianglesUInt16Array_3=Module[\"_emscripten_bind_Decoder_GetTrianglesUInt16Array_3\"]=function(){return(_emscripten_bind_Decoder_GetTrianglesUInt16Array_3=Module[\"_emscripten_bind_Decoder_GetTrianglesUInt16Array_3\"]=Module[\"asm\"][\"Ya\"]).apply(null,arguments)};var _emscripten_bind_Decoder_GetTrianglesUInt32Array_3=Module[\"_emscripten_bind_Decoder_GetTrianglesUInt32Array_3\"]=function(){return(_emscripten_bind_Decoder_GetTrianglesUInt32Array_3=Module[\"_emscripten_bind_Decoder_GetTrianglesUInt32Array_3\"]=Module[\"asm\"][\"Za\"]).apply(null,arguments)};var _emscripten_bind_Decoder_GetAttributeFloat_3=Module[\"_emscripten_bind_Decoder_GetAttributeFloat_3\"]=function(){return(_emscripten_bind_Decoder_GetAttributeFloat_3=Module[\"_emscripten_bind_Decoder_GetAttributeFloat_3\"]=Module[\"asm\"][\"_a\"]).apply(null,arguments)};var _emscripten_bind_Decoder_GetAttributeFloatForAllPoints_3=Module[\"_emscripten_bind_Decoder_GetAttributeFloatForAllPoints_3\"]=function(){return(_emscripten_bind_Decoder_GetAttributeFloatForAllPoints_3=Module[\"_emscripten_bind_Decoder_GetAttributeFloatForAllPoints_3\"]=Module[\"asm\"][\"$a\"]).apply(null,arguments)};var _emscripten_bind_Decoder_GetAttributeIntForAllPoints_3=Module[\"_emscripten_bind_Decoder_GetAttributeIntForAllPoints_3\"]=function(){return(_emscripten_bind_Decoder_GetAttributeIntForAllPoints_3=Module[\"_emscripten_bind_Decoder_GetAttributeIntForAllPoints_3\"]=Module[\"asm\"][\"ab\"]).apply(null,arguments)};var _emscripten_bind_Decoder_GetAttributeInt8ForAllPoints_3=Module[\"_emscripten_bind_Decoder_GetAttributeInt8ForAllPoints_3\"]=function(){return(_emscripten_bind_Decoder_GetAttributeInt8ForAllPoints_3=Module[\"_emscripten_bind_Decoder_GetAttributeInt8ForAllPoints_3\"]=Module[\"asm\"][\"bb\"]).apply(null,arguments)};var _emscripten_bind_Decoder_GetAttributeUInt8ForAllPoints_3=Module[\"_emscripten_bind_Decoder_GetAttributeUInt8ForAllPoints_3\"]=function(){return(_emscripten_bind_Decoder_GetAttributeUInt8ForAllPoints_3=Module[\"_emscripten_bind_Decoder_GetAttributeUInt8ForAllPoints_3\"]=Module[\"asm\"][\"cb\"]).apply(null,arguments)};var _emscripten_bind_Decoder_GetAttributeInt16ForAllPoints_3=Module[\"_emscripten_bind_Decoder_GetAttributeInt16ForAllPoints_3\"]=function(){return(_emscripten_bind_Decoder_GetAttributeInt16ForAllPoints_3=Module[\"_emscripten_bind_Decoder_GetAttributeInt16ForAllPoints_3\"]=Module[\"asm\"][\"db\"]).apply(null,arguments)};var _emscripten_bind_Decoder_GetAttributeUInt16ForAllPoints_3=Module[\"_emscripten_bind_Decoder_GetAttributeUInt16ForAllPoints_3\"]=function(){return(_emscripten_bind_Decoder_GetAttributeUInt16ForAllPoints_3=Module[\"_emscripten_bind_Decoder_GetAttributeUInt16ForAllPoints_3\"]=Module[\"asm\"][\"eb\"]).apply(null,arguments)};var _emscripten_bind_Decoder_GetAttributeInt32ForAllPoints_3=Module[\"_emscripten_bind_Decoder_GetAttributeInt32ForAllPoints_3\"]=function(){return(_emscripten_bind_Decoder_GetAttributeInt32ForAllPoints_3=Module[\"_emscripten_bind_Decoder_GetAttributeInt32ForAllPoints_3\"]=Module[\"asm\"][\"fb\"]).apply(null,arguments)};var _emscripten_bind_Decoder_GetAttributeUInt32ForAllPoints_3=Module[\"_emscripten_bind_Decoder_GetAttributeUInt32ForAllPoints_3\"]=function(){return(_emscripten_bind_Decoder_GetAttributeUInt32ForAllPoints_3=Module[\"_emscripten_bind_Decoder_GetAttributeUInt32ForAllPoints_3\"]=Module[\"asm\"][\"gb\"]).apply(null,arguments)};var _emscripten_bind_Decoder_GetAttributeDataArrayForAllPoints_5=Module[\"_emscripten_bind_Decoder_GetAttributeDataArrayForAllPoints_5\"]=function(){return(_emscripten_bind_Decoder_GetAttributeDataArrayForAllPoints_5=Module[\"_emscripten_bind_Decoder_GetAttributeDataArrayForAllPoints_5\"]=Module[\"asm\"][\"hb\"]).apply(null,arguments)};var _emscripten_bind_Decoder_SkipAttributeTransform_1=Module[\"_emscripten_bind_Decoder_SkipAttributeTransform_1\"]=function(){return(_emscripten_bind_Decoder_SkipAttributeTransform_1=Module[\"_emscripten_bind_Decoder_SkipAttributeTransform_1\"]=Module[\"asm\"][\"ib\"]).apply(null,arguments)};var _emscripten_bind_Decoder_GetEncodedGeometryType_Deprecated_1=Module[\"_emscripten_bind_Decoder_GetEncodedGeometryType_Deprecated_1\"]=function(){return(_emscripten_bind_Decoder_GetEncodedGeometryType_Deprecated_1=Module[\"_emscripten_bind_Decoder_GetEncodedGeometryType_Deprecated_1\"]=Module[\"asm\"][\"jb\"]).apply(null,arguments)};var _emscripten_bind_Decoder_DecodeBufferToPointCloud_2=Module[\"_emscripten_bind_Decoder_DecodeBufferToPointCloud_2\"]=function(){return(_emscripten_bind_Decoder_DecodeBufferToPointCloud_2=Module[\"_emscripten_bind_Decoder_DecodeBufferToPointCloud_2\"]=Module[\"asm\"][\"kb\"]).apply(null,arguments)};var _emscripten_bind_Decoder_DecodeBufferToMesh_2=Module[\"_emscripten_bind_Decoder_DecodeBufferToMesh_2\"]=function(){return(_emscripten_bind_Decoder_DecodeBufferToMesh_2=Module[\"_emscripten_bind_Decoder_DecodeBufferToMesh_2\"]=Module[\"asm\"][\"lb\"]).apply(null,arguments)};var _emscripten_bind_Decoder___destroy___0=Module[\"_emscripten_bind_Decoder___destroy___0\"]=function(){return(_emscripten_bind_Decoder___destroy___0=Module[\"_emscripten_bind_Decoder___destroy___0\"]=Module[\"asm\"][\"mb\"]).apply(null,arguments)};var _emscripten_enum_draco_AttributeTransformType_ATTRIBUTE_INVALID_TRANSFORM=Module[\"_emscripten_enum_draco_AttributeTransformType_ATTRIBUTE_INVALID_TRANSFORM\"]=function(){return(_emscripten_enum_draco_AttributeTransformType_ATTRIBUTE_INVALID_TRANSFORM=Module[\"_emscripten_enum_draco_AttributeTransformType_ATTRIBUTE_INVALID_TRANSFORM\"]=Module[\"asm\"][\"nb\"]).apply(null,arguments)};var _emscripten_enum_draco_AttributeTransformType_ATTRIBUTE_NO_TRANSFORM=Module[\"_emscripten_enum_draco_AttributeTransformType_ATTRIBUTE_NO_TRANSFORM\"]=function(){return(_emscripten_enum_draco_AttributeTransformType_ATTRIBUTE_NO_TRANSFORM=Module[\"_emscripten_enum_draco_AttributeTransformType_ATTRIBUTE_NO_TRANSFORM\"]=Module[\"asm\"][\"ob\"]).apply(null,arguments)};var _emscripten_enum_draco_AttributeTransformType_ATTRIBUTE_QUANTIZATION_TRANSFORM=Module[\"_emscripten_enum_draco_AttributeTransformType_ATTRIBUTE_QUANTIZATION_TRANSFORM\"]=function(){return(_emscripten_enum_draco_AttributeTransformType_ATTRIBUTE_QUANTIZATION_TRANSFORM=Module[\"_emscripten_enum_draco_AttributeTransformType_ATTRIBUTE_QUANTIZATION_TRANSFORM\"]=Module[\"asm\"][\"pb\"]).apply(null,arguments)};var _emscripten_enum_draco_AttributeTransformType_ATTRIBUTE_OCTAHEDRON_TRANSFORM=Module[\"_emscripten_enum_draco_AttributeTransformType_ATTRIBUTE_OCTAHEDRON_TRANSFORM\"]=function(){return(_emscripten_enum_draco_AttributeTransformType_ATTRIBUTE_OCTAHEDRON_TRANSFORM=Module[\"_emscripten_enum_draco_AttributeTransformType_ATTRIBUTE_OCTAHEDRON_TRANSFORM\"]=Module[\"asm\"][\"qb\"]).apply(null,arguments)};var _emscripten_enum_draco_GeometryAttribute_Type_INVALID=Module[\"_emscripten_enum_draco_GeometryAttribute_Type_INVALID\"]=function(){return(_emscripten_enum_draco_GeometryAttribute_Type_INVALID=Module[\"_emscripten_enum_draco_GeometryAttribute_Type_INVALID\"]=Module[\"asm\"][\"rb\"]).apply(null,arguments)};var _emscripten_enum_draco_GeometryAttribute_Type_POSITION=Module[\"_emscripten_enum_draco_GeometryAttribute_Type_POSITION\"]=function(){return(_emscripten_enum_draco_GeometryAttribute_Type_POSITION=Module[\"_emscripten_enum_draco_GeometryAttribute_Type_POSITION\"]=Module[\"asm\"][\"sb\"]).apply(null,arguments)};var _emscripten_enum_draco_GeometryAttribute_Type_NORMAL=Module[\"_emscripten_enum_draco_GeometryAttribute_Type_NORMAL\"]=function(){return(_emscripten_enum_draco_GeometryAttribute_Type_NORMAL=Module[\"_emscripten_enum_draco_GeometryAttribute_Type_NORMAL\"]=Module[\"asm\"][\"tb\"]).apply(null,arguments)};var _emscripten_enum_draco_GeometryAttribute_Type_COLOR=Module[\"_emscripten_enum_draco_GeometryAttribute_Type_COLOR\"]=function(){return(_emscripten_enum_draco_GeometryAttribute_Type_COLOR=Module[\"_emscripten_enum_draco_GeometryAttribute_Type_COLOR\"]=Module[\"asm\"][\"ub\"]).apply(null,arguments)};var _emscripten_enum_draco_GeometryAttribute_Type_TEX_COORD=Module[\"_emscripten_enum_draco_GeometryAttribute_Type_TEX_COORD\"]=function(){return(_emscripten_enum_draco_GeometryAttribute_Type_TEX_COORD=Module[\"_emscripten_enum_draco_GeometryAttribute_Type_TEX_COORD\"]=Module[\"asm\"][\"vb\"]).apply(null,arguments)};var _emscripten_enum_draco_GeometryAttribute_Type_GENERIC=Module[\"_emscripten_enum_draco_GeometryAttribute_Type_GENERIC\"]=function(){return(_emscripten_enum_draco_GeometryAttribute_Type_GENERIC=Module[\"_emscripten_enum_draco_GeometryAttribute_Type_GENERIC\"]=Module[\"asm\"][\"wb\"]).apply(null,arguments)};var _emscripten_enum_draco_EncodedGeometryType_INVALID_GEOMETRY_TYPE=Module[\"_emscripten_enum_draco_EncodedGeometryType_INVALID_GEOMETRY_TYPE\"]=function(){return(_emscripten_enum_draco_EncodedGeometryType_INVALID_GEOMETRY_TYPE=Module[\"_emscripten_enum_draco_EncodedGeometryType_INVALID_GEOMETRY_TYPE\"]=Module[\"asm\"][\"xb\"]).apply(null,arguments)};var _emscripten_enum_draco_EncodedGeometryType_POINT_CLOUD=Module[\"_emscripten_enum_draco_EncodedGeometryType_POINT_CLOUD\"]=function(){return(_emscripten_enum_draco_EncodedGeometryType_POINT_CLOUD=Module[\"_emscripten_enum_draco_EncodedGeometryType_POINT_CLOUD\"]=Module[\"asm\"][\"yb\"]).apply(null,arguments)};var _emscripten_enum_draco_EncodedGeometryType_TRIANGULAR_MESH=Module[\"_emscripten_enum_draco_EncodedGeometryType_TRIANGULAR_MESH\"]=function(){return(_emscripten_enum_draco_EncodedGeometryType_TRIANGULAR_MESH=Module[\"_emscripten_enum_draco_EncodedGeometryType_TRIANGULAR_MESH\"]=Module[\"asm\"][\"zb\"]).apply(null,arguments)};var _emscripten_enum_draco_DataType_DT_INVALID=Module[\"_emscripten_enum_draco_DataType_DT_INVALID\"]=function(){return(_emscripten_enum_draco_DataType_DT_INVALID=Module[\"_emscripten_enum_draco_DataType_DT_INVALID\"]=Module[\"asm\"][\"Ab\"]).apply(null,arguments)};var _emscripten_enum_draco_DataType_DT_INT8=Module[\"_emscripten_enum_draco_DataType_DT_INT8\"]=function(){return(_emscripten_enum_draco_DataType_DT_INT8=Module[\"_emscripten_enum_draco_DataType_DT_INT8\"]=Module[\"asm\"][\"Bb\"]).apply(null,arguments)};var _emscripten_enum_draco_DataType_DT_UINT8=Module[\"_emscripten_enum_draco_DataType_DT_UINT8\"]=function(){return(_emscripten_enum_draco_DataType_DT_UINT8=Module[\"_emscripten_enum_draco_DataType_DT_UINT8\"]=Module[\"asm\"][\"Cb\"]).apply(null,arguments)};var _emscripten_enum_draco_DataType_DT_INT16=Module[\"_emscripten_enum_draco_DataType_DT_INT16\"]=function(){return(_emscripten_enum_draco_DataType_DT_INT16=Module[\"_emscripten_enum_draco_DataType_DT_INT16\"]=Module[\"asm\"][\"Db\"]).apply(null,arguments)};var _emscripten_enum_draco_DataType_DT_UINT16=Module[\"_emscripten_enum_draco_DataType_DT_UINT16\"]=function(){return(_emscripten_enum_draco_DataType_DT_UINT16=Module[\"_emscripten_enum_draco_DataType_DT_UINT16\"]=Module[\"asm\"][\"Eb\"]).apply(null,arguments)};var _emscripten_enum_draco_DataType_DT_INT32=Module[\"_emscripten_enum_draco_DataType_DT_INT32\"]=function(){return(_emscripten_enum_draco_DataType_DT_INT32=Module[\"_emscripten_enum_draco_DataType_DT_INT32\"]=Module[\"asm\"][\"Fb\"]).apply(null,arguments)};var _emscripten_enum_draco_DataType_DT_UINT32=Module[\"_emscripten_enum_draco_DataType_DT_UINT32\"]=function(){return(_emscripten_enum_draco_DataType_DT_UINT32=Module[\"_emscripten_enum_draco_DataType_DT_UINT32\"]=Module[\"asm\"][\"Gb\"]).apply(null,arguments)};var _emscripten_enum_draco_DataType_DT_INT64=Module[\"_emscripten_enum_draco_DataType_DT_INT64\"]=function(){return(_emscripten_enum_draco_DataType_DT_INT64=Module[\"_emscripten_enum_draco_DataType_DT_INT64\"]=Module[\"asm\"][\"Hb\"]).apply(null,arguments)};var _emscripten_enum_draco_DataType_DT_UINT64=Module[\"_emscripten_enum_draco_DataType_DT_UINT64\"]=function(){return(_emscripten_enum_draco_DataType_DT_UINT64=Module[\"_emscripten_enum_draco_DataType_DT_UINT64\"]=Module[\"asm\"][\"Ib\"]).apply(null,arguments)};var _emscripten_enum_draco_DataType_DT_FLOAT32=Module[\"_emscripten_enum_draco_DataType_DT_FLOAT32\"]=function(){return(_emscripten_enum_draco_DataType_DT_FLOAT32=Module[\"_emscripten_enum_draco_DataType_DT_FLOAT32\"]=Module[\"asm\"][\"Jb\"]).apply(null,arguments)};var _emscripten_enum_draco_DataType_DT_FLOAT64=Module[\"_emscripten_enum_draco_DataType_DT_FLOAT64\"]=function(){return(_emscripten_enum_draco_DataType_DT_FLOAT64=Module[\"_emscripten_enum_draco_DataType_DT_FLOAT64\"]=Module[\"asm\"][\"Kb\"]).apply(null,arguments)};var _emscripten_enum_draco_DataType_DT_BOOL=Module[\"_emscripten_enum_draco_DataType_DT_BOOL\"]=function(){return(_emscripten_enum_draco_DataType_DT_BOOL=Module[\"_emscripten_enum_draco_DataType_DT_BOOL\"]=Module[\"asm\"][\"Lb\"]).apply(null,arguments)};var _emscripten_enum_draco_DataType_DT_TYPES_COUNT=Module[\"_emscripten_enum_draco_DataType_DT_TYPES_COUNT\"]=function(){return(_emscripten_enum_draco_DataType_DT_TYPES_COUNT=Module[\"_emscripten_enum_draco_DataType_DT_TYPES_COUNT\"]=Module[\"asm\"][\"Mb\"]).apply(null,arguments)};var _emscripten_enum_draco_StatusCode_OK=Module[\"_emscripten_enum_draco_StatusCode_OK\"]=function(){return(_emscripten_enum_draco_StatusCode_OK=Module[\"_emscripten_enum_draco_StatusCode_OK\"]=Module[\"asm\"][\"Nb\"]).apply(null,arguments)};var _emscripten_enum_draco_StatusCode_DRACO_ERROR=Module[\"_emscripten_enum_draco_StatusCode_DRACO_ERROR\"]=function(){return(_emscripten_enum_draco_StatusCode_DRACO_ERROR=Module[\"_emscripten_enum_draco_StatusCode_DRACO_ERROR\"]=Module[\"asm\"][\"Ob\"]).apply(null,arguments)};var _emscripten_enum_draco_StatusCode_IO_ERROR=Module[\"_emscripten_enum_draco_StatusCode_IO_ERROR\"]=function(){return(_emscripten_enum_draco_StatusCode_IO_ERROR=Module[\"_emscripten_enum_draco_StatusCode_IO_ERROR\"]=Module[\"asm\"][\"Pb\"]).apply(null,arguments)};var _emscripten_enum_draco_StatusCode_INVALID_PARAMETER=Module[\"_emscripten_enum_draco_StatusCode_INVALID_PARAMETER\"]=function(){return(_emscripten_enum_draco_StatusCode_INVALID_PARAMETER=Module[\"_emscripten_enum_draco_StatusCode_INVALID_PARAMETER\"]=Module[\"asm\"][\"Qb\"]).apply(null,arguments)};var _emscripten_enum_draco_StatusCode_UNSUPPORTED_VERSION=Module[\"_emscripten_enum_draco_StatusCode_UNSUPPORTED_VERSION\"]=function(){return(_emscripten_enum_draco_StatusCode_UNSUPPORTED_VERSION=Module[\"_emscripten_enum_draco_StatusCode_UNSUPPORTED_VERSION\"]=Module[\"asm\"][\"Rb\"]).apply(null,arguments)};var _emscripten_enum_draco_StatusCode_UNKNOWN_VERSION=Module[\"_emscripten_enum_draco_StatusCode_UNKNOWN_VERSION\"]=function(){return(_emscripten_enum_draco_StatusCode_UNKNOWN_VERSION=Module[\"_emscripten_enum_draco_StatusCode_UNKNOWN_VERSION\"]=Module[\"asm\"][\"Sb\"]).apply(null,arguments)};var ___errno_location=function(){return(___errno_location=Module[\"asm\"][\"__errno_location\"]).apply(null,arguments)};var _malloc=Module[\"_malloc\"]=function(){return(_malloc=Module[\"_malloc\"]=Module[\"asm\"][\"Tb\"]).apply(null,arguments)};var _free=Module[\"_free\"]=function(){return(_free=Module[\"_free\"]=Module[\"asm\"][\"Ub\"]).apply(null,arguments)};var ___cxa_is_pointer_type=function(){return(___cxa_is_pointer_type=Module[\"asm\"][\"Vb\"]).apply(null,arguments)};var ___start_em_js=Module[\"___start_em_js\"]=15856;var ___stop_em_js=Module[\"___stop_em_js\"]=15954;var calledRun;dependenciesFulfilled=function runCaller(){if(!calledRun)run();if(!calledRun)dependenciesFulfilled=runCaller};function run(){if(runDependencies>0){return}preRun();if(runDependencies>0){return}function doRun(){if(calledRun)return;calledRun=true;Module[\"calledRun\"]=true;if(ABORT)return;initRuntime();readyPromiseResolve(Module);if(Module[\"onRuntimeInitialized\"])Module[\"onRuntimeInitialized\"]();postRun()}if(Module[\"setStatus\"]){Module[\"setStatus\"](\"Running...\");setTimeout(function(){setTimeout(function(){Module[\"setStatus\"](\"\")},1);doRun()},1)}else{doRun()}}if(Module[\"preInit\"]){if(typeof Module[\"preInit\"]==\"function\")Module[\"preInit\"]=[Module[\"preInit\"]];while(Module[\"preInit\"].length>0){Module[\"preInit\"].pop()()}}run();function WrapperObject(){}WrapperObject.prototype=Object.create(WrapperObject.prototype);WrapperObject.prototype.constructor=WrapperObject;WrapperObject.prototype.__class__=WrapperObject;WrapperObject.__cache__={};Module[\"WrapperObject\"]=WrapperObject;function getCache(__class__){return(__class__||WrapperObject).__cache__}Module[\"getCache\"]=getCache;function wrapPointer(ptr,__class__){var cache=getCache(__class__);var ret=cache[ptr];if(ret)return ret;ret=Object.create((__class__||WrapperObject).prototype);ret.ptr=ptr;return cache[ptr]=ret}Module[\"wrapPointer\"]=wrapPointer;function castObject(obj,__class__){return wrapPointer(obj.ptr,__class__)}Module[\"castObject\"]=castObject;Module[\"NULL\"]=wrapPointer(0);function destroy(obj){if(!obj[\"__destroy__\"])throw\"Error: Cannot destroy object. (Did you create it yourself?)\";obj[\"__destroy__\"]();delete getCache(obj.__class__)[obj.ptr]}Module[\"destroy\"]=destroy;function compare(obj1,obj2){return obj1.ptr===obj2.ptr}Module[\"compare\"]=compare;function getPointer(obj){return obj.ptr}Module[\"getPointer\"]=getPointer;function getClass(obj){return obj.__class__}Module[\"getClass\"]=getClass;var ensureCache={buffer:0,size:0,pos:0,temps:[],needed:0,prepare:function(){if(ensureCache.needed){for(var i=0;i<ensureCache.temps.length;i++){Module[\"_free\"](ensureCache.temps[i])}ensureCache.temps.length=0;Module[\"_free\"](ensureCache.buffer);ensureCache.buffer=0;ensureCache.size+=ensureCache.needed;ensureCache.needed=0}if(!ensureCache.buffer){ensureCache.size+=128;ensureCache.buffer=Module[\"_malloc\"](ensureCache.size);assert(ensureCache.buffer)}ensureCache.pos=0},alloc:function(array,view){assert(ensureCache.buffer);var bytes=view.BYTES_PER_ELEMENT;var len=array.length*bytes;len=len+7&-8;var ret;if(ensureCache.pos+len>=ensureCache.size){assert(len>0);ensureCache.needed+=len;ret=Module[\"_malloc\"](len);ensureCache.temps.push(ret)}else{ret=ensureCache.buffer+ensureCache.pos;ensureCache.pos+=len}return ret},copy:function(array,view,offset){offset>>>=0;var bytes=view.BYTES_PER_ELEMENT;switch(bytes){case 2:offset>>>=1;break;case 4:offset>>>=2;break;case 8:offset>>>=3;break}for(var i=0;i<array.length;i++){view[offset+i]=array[i]}}};function ensureString(value){if(typeof value===\"string\"){var intArray=intArrayFromString(value);var offset=ensureCache.alloc(intArray,HEAP8);ensureCache.copy(intArray,HEAP8,offset);return offset}return value}function ensureInt8(value){if(typeof value===\"object\"){var offset=ensureCache.alloc(value,HEAP8);ensureCache.copy(value,HEAP8,offset);return offset}return value}function VoidPtr(){throw\"cannot construct a VoidPtr, no constructor in IDL\"}VoidPtr.prototype=Object.create(WrapperObject.prototype);VoidPtr.prototype.constructor=VoidPtr;VoidPtr.prototype.__class__=VoidPtr;VoidPtr.__cache__={};Module[\"VoidPtr\"]=VoidPtr;VoidPtr.prototype[\"__destroy__\"]=VoidPtr.prototype.__destroy__=function(){var self=this.ptr;_emscripten_bind_VoidPtr___destroy___0(self)};function DecoderBuffer(){this.ptr=_emscripten_bind_DecoderBuffer_DecoderBuffer_0();getCache(DecoderBuffer)[this.ptr]=this}DecoderBuffer.prototype=Object.create(WrapperObject.prototype);DecoderBuffer.prototype.constructor=DecoderBuffer;DecoderBuffer.prototype.__class__=DecoderBuffer;DecoderBuffer.__cache__={};Module[\"DecoderBuffer\"]=DecoderBuffer;DecoderBuffer.prototype[\"Init\"]=DecoderBuffer.prototype.Init=function(data,data_size){var self=this.ptr;ensureCache.prepare();if(typeof data==\"object\"){data=ensureInt8(data)}if(data_size&&typeof data_size===\"object\")data_size=data_size.ptr;_emscripten_bind_DecoderBuffer_Init_2(self,data,data_size)};DecoderBuffer.prototype[\"__destroy__\"]=DecoderBuffer.prototype.__destroy__=function(){var self=this.ptr;_emscripten_bind_DecoderBuffer___destroy___0(self)};function AttributeTransformData(){this.ptr=_emscripten_bind_AttributeTransformData_AttributeTransformData_0();getCache(AttributeTransformData)[this.ptr]=this}AttributeTransformData.prototype=Object.create(WrapperObject.prototype);AttributeTransformData.prototype.constructor=AttributeTransformData;AttributeTransformData.prototype.__class__=AttributeTransformData;AttributeTransformData.__cache__={};Module[\"AttributeTransformData\"]=AttributeTransformData;AttributeTransformData.prototype[\"transform_type\"]=AttributeTransformData.prototype.transform_type=function(){var self=this.ptr;return _emscripten_bind_AttributeTransformData_transform_type_0(self)};AttributeTransformData.prototype[\"__destroy__\"]=AttributeTransformData.prototype.__destroy__=function(){var self=this.ptr;_emscripten_bind_AttributeTransformData___destroy___0(self)};function GeometryAttribute(){this.ptr=_emscripten_bind_GeometryAttribute_GeometryAttribute_0();getCache(GeometryAttribute)[this.ptr]=this}GeometryAttribute.prototype=Object.create(WrapperObject.prototype);GeometryAttribute.prototype.constructor=GeometryAttribute;GeometryAttribute.prototype.__class__=GeometryAttribute;GeometryAttribute.__cache__={};Module[\"GeometryAttribute\"]=GeometryAttribute;GeometryAttribute.prototype[\"__destroy__\"]=GeometryAttribute.prototype.__destroy__=function(){var self=this.ptr;_emscripten_bind_GeometryAttribute___destroy___0(self)};function PointAttribute(){this.ptr=_emscripten_bind_PointAttribute_PointAttribute_0();getCache(PointAttribute)[this.ptr]=this}PointAttribute.prototype=Object.create(WrapperObject.prototype);PointAttribute.prototype.constructor=PointAttribute;PointAttribute.prototype.__class__=PointAttribute;PointAttribute.__cache__={};Module[\"PointAttribute\"]=PointAttribute;PointAttribute.prototype[\"size\"]=PointAttribute.prototype.size=function(){var self=this.ptr;return _emscripten_bind_PointAttribute_size_0(self)};PointAttribute.prototype[\"GetAttributeTransformData\"]=PointAttribute.prototype.GetAttributeTransformData=function(){var self=this.ptr;return wrapPointer(_emscripten_bind_PointAttribute_GetAttributeTransformData_0(self),AttributeTransformData)};PointAttribute.prototype[\"attribute_type\"]=PointAttribute.prototype.attribute_type=function(){var self=this.ptr;return _emscripten_bind_PointAttribute_attribute_type_0(self)};PointAttribute.prototype[\"data_type\"]=PointAttribute.prototype.data_type=function(){var self=this.ptr;return _emscripten_bind_PointAttribute_data_type_0(self)};PointAttribute.prototype[\"num_components\"]=PointAttribute.prototype.num_components=function(){var self=this.ptr;return _emscripten_bind_PointAttribute_num_components_0(self)};PointAttribute.prototype[\"normalized\"]=PointAttribute.prototype.normalized=function(){var self=this.ptr;return!!_emscripten_bind_PointAttribute_normalized_0(self)};PointAttribute.prototype[\"byte_stride\"]=PointAttribute.prototype.byte_stride=function(){var self=this.ptr;return _emscripten_bind_PointAttribute_byte_stride_0(self)};PointAttribute.prototype[\"byte_offset\"]=PointAttribute.prototype.byte_offset=function(){var self=this.ptr;return _emscripten_bind_PointAttribute_byte_offset_0(self)};PointAttribute.prototype[\"unique_id\"]=PointAttribute.prototype.unique_id=function(){var self=this.ptr;return _emscripten_bind_PointAttribute_unique_id_0(self)};PointAttribute.prototype[\"__destroy__\"]=PointAttribute.prototype.__destroy__=function(){var self=this.ptr;_emscripten_bind_PointAttribute___destroy___0(self)};function AttributeQuantizationTransform(){this.ptr=_emscripten_bind_AttributeQuantizationTransform_AttributeQuantizationTransform_0();getCache(AttributeQuantizationTransform)[this.ptr]=this}AttributeQuantizationTransform.prototype=Object.create(WrapperObject.prototype);AttributeQuantizationTransform.prototype.constructor=AttributeQuantizationTransform;AttributeQuantizationTransform.prototype.__class__=AttributeQuantizationTransform;AttributeQuantizationTransform.__cache__={};Module[\"AttributeQuantizationTransform\"]=AttributeQuantizationTransform;AttributeQuantizationTransform.prototype[\"InitFromAttribute\"]=AttributeQuantizationTransform.prototype.InitFromAttribute=function(att){var self=this.ptr;if(att&&typeof att===\"object\")att=att.ptr;return!!_emscripten_bind_AttributeQuantizationTransform_InitFromAttribute_1(self,att)};AttributeQuantizationTransform.prototype[\"quantization_bits\"]=AttributeQuantizationTransform.prototype.quantization_bits=function(){var self=this.ptr;return _emscripten_bind_AttributeQuantizationTransform_quantization_bits_0(self)};AttributeQuantizationTransform.prototype[\"min_value\"]=AttributeQuantizationTransform.prototype.min_value=function(axis){var self=this.ptr;if(axis&&typeof axis===\"object\")axis=axis.ptr;return _emscripten_bind_AttributeQuantizationTransform_min_value_1(self,axis)};AttributeQuantizationTransform.prototype[\"range\"]=AttributeQuantizationTransform.prototype.range=function(){var self=this.ptr;return _emscripten_bind_AttributeQuantizationTransform_range_0(self)};AttributeQuantizationTransform.prototype[\"__destroy__\"]=AttributeQuantizationTransform.prototype.__destroy__=function(){var self=this.ptr;_emscripten_bind_AttributeQuantizationTransform___destroy___0(self)};function AttributeOctahedronTransform(){this.ptr=_emscripten_bind_AttributeOctahedronTransform_AttributeOctahedronTransform_0();getCache(AttributeOctahedronTransform)[this.ptr]=this}AttributeOctahedronTransform.prototype=Object.create(WrapperObject.prototype);AttributeOctahedronTransform.prototype.constructor=AttributeOctahedronTransform;AttributeOctahedronTransform.prototype.__class__=AttributeOctahedronTransform;AttributeOctahedronTransform.__cache__={};Module[\"AttributeOctahedronTransform\"]=AttributeOctahedronTransform;AttributeOctahedronTransform.prototype[\"InitFromAttribute\"]=AttributeOctahedronTransform.prototype.InitFromAttribute=function(att){var self=this.ptr;if(att&&typeof att===\"object\")att=att.ptr;return!!_emscripten_bind_AttributeOctahedronTransform_InitFromAttribute_1(self,att)};AttributeOctahedronTransform.prototype[\"quantization_bits\"]=AttributeOctahedronTransform.prototype.quantization_bits=function(){var self=this.ptr;return _emscripten_bind_AttributeOctahedronTransform_quantization_bits_0(self)};AttributeOctahedronTransform.prototype[\"__destroy__\"]=AttributeOctahedronTransform.prototype.__destroy__=function(){var self=this.ptr;_emscripten_bind_AttributeOctahedronTransform___destroy___0(self)};function PointCloud(){this.ptr=_emscripten_bind_PointCloud_PointCloud_0();getCache(PointCloud)[this.ptr]=this}PointCloud.prototype=Object.create(WrapperObject.prototype);PointCloud.prototype.constructor=PointCloud;PointCloud.prototype.__class__=PointCloud;PointCloud.__cache__={};Module[\"PointCloud\"]=PointCloud;PointCloud.prototype[\"num_attributes\"]=PointCloud.prototype.num_attributes=function(){var self=this.ptr;return _emscripten_bind_PointCloud_num_attributes_0(self)};PointCloud.prototype[\"num_points\"]=PointCloud.prototype.num_points=function(){var self=this.ptr;return _emscripten_bind_PointCloud_num_points_0(self)};PointCloud.prototype[\"__destroy__\"]=PointCloud.prototype.__destroy__=function(){var self=this.ptr;_emscripten_bind_PointCloud___destroy___0(self)};function Mesh(){this.ptr=_emscripten_bind_Mesh_Mesh_0();getCache(Mesh)[this.ptr]=this}Mesh.prototype=Object.create(WrapperObject.prototype);Mesh.prototype.constructor=Mesh;Mesh.prototype.__class__=Mesh;Mesh.__cache__={};Module[\"Mesh\"]=Mesh;Mesh.prototype[\"num_faces\"]=Mesh.prototype.num_faces=function(){var self=this.ptr;return _emscripten_bind_Mesh_num_faces_0(self)};Mesh.prototype[\"num_attributes\"]=Mesh.prototype.num_attributes=function(){var self=this.ptr;return _emscripten_bind_Mesh_num_attributes_0(self)};Mesh.prototype[\"num_points\"]=Mesh.prototype.num_points=function(){var self=this.ptr;return _emscripten_bind_Mesh_num_points_0(self)};Mesh.prototype[\"__destroy__\"]=Mesh.prototype.__destroy__=function(){var self=this.ptr;_emscripten_bind_Mesh___destroy___0(self)};function Metadata(){this.ptr=_emscripten_bind_Metadata_Metadata_0();getCache(Metadata)[this.ptr]=this}Metadata.prototype=Object.create(WrapperObject.prototype);Metadata.prototype.constructor=Metadata;Metadata.prototype.__class__=Metadata;Metadata.__cache__={};Module[\"Metadata\"]=Metadata;Metadata.prototype[\"__destroy__\"]=Metadata.prototype.__destroy__=function(){var self=this.ptr;_emscripten_bind_Metadata___destroy___0(self)};function Status(){throw\"cannot construct a Status, no constructor in IDL\"}Status.prototype=Object.create(WrapperObject.prototype);Status.prototype.constructor=Status;Status.prototype.__class__=Status;Status.__cache__={};Module[\"Status\"]=Status;Status.prototype[\"code\"]=Status.prototype.code=function(){var self=this.ptr;return _emscripten_bind_Status_code_0(self)};Status.prototype[\"ok\"]=Status.prototype.ok=function(){var self=this.ptr;return!!_emscripten_bind_Status_ok_0(self)};Status.prototype[\"error_msg\"]=Status.prototype.error_msg=function(){var self=this.ptr;return UTF8ToString(_emscripten_bind_Status_error_msg_0(self))};Status.prototype[\"__destroy__\"]=Status.prototype.__destroy__=function(){var self=this.ptr;_emscripten_bind_Status___destroy___0(self)};function DracoFloat32Array(){this.ptr=_emscripten_bind_DracoFloat32Array_DracoFloat32Array_0();getCache(DracoFloat32Array)[this.ptr]=this}DracoFloat32Array.prototype=Object.create(WrapperObject.prototype);DracoFloat32Array.prototype.constructor=DracoFloat32Array;DracoFloat32Array.prototype.__class__=DracoFloat32Array;DracoFloat32Array.__cache__={};Module[\"DracoFloat32Array\"]=DracoFloat32Array;DracoFloat32Array.prototype[\"GetValue\"]=DracoFloat32Array.prototype.GetValue=function(index){var self=this.ptr;if(index&&typeof index===\"object\")index=index.ptr;return _emscripten_bind_DracoFloat32Array_GetValue_1(self,index)};DracoFloat32Array.prototype[\"size\"]=DracoFloat32Array.prototype.size=function(){var self=this.ptr;return _emscripten_bind_DracoFloat32Array_size_0(self)};DracoFloat32Array.prototype[\"__destroy__\"]=DracoFloat32Array.prototype.__destroy__=function(){var self=this.ptr;_emscripten_bind_DracoFloat32Array___destroy___0(self)};function DracoInt8Array(){this.ptr=_emscripten_bind_DracoInt8Array_DracoInt8Array_0();getCache(DracoInt8Array)[this.ptr]=this}DracoInt8Array.prototype=Object.create(WrapperObject.prototype);DracoInt8Array.prototype.constructor=DracoInt8Array;DracoInt8Array.prototype.__class__=DracoInt8Array;DracoInt8Array.__cache__={};Module[\"DracoInt8Array\"]=DracoInt8Array;DracoInt8Array.prototype[\"GetValue\"]=DracoInt8Array.prototype.GetValue=function(index){var self=this.ptr;if(index&&typeof index===\"object\")index=index.ptr;return _emscripten_bind_DracoInt8Array_GetValue_1(self,index)};DracoInt8Array.prototype[\"size\"]=DracoInt8Array.prototype.size=function(){var self=this.ptr;return _emscripten_bind_DracoInt8Array_size_0(self)};DracoInt8Array.prototype[\"__destroy__\"]=DracoInt8Array.prototype.__destroy__=function(){var self=this.ptr;_emscripten_bind_DracoInt8Array___destroy___0(self)};function DracoUInt8Array(){this.ptr=_emscripten_bind_DracoUInt8Array_DracoUInt8Array_0();getCache(DracoUInt8Array)[this.ptr]=this}DracoUInt8Array.prototype=Object.create(WrapperObject.prototype);DracoUInt8Array.prototype.constructor=DracoUInt8Array;DracoUInt8Array.prototype.__class__=DracoUInt8Array;DracoUInt8Array.__cache__={};Module[\"DracoUInt8Array\"]=DracoUInt8Array;DracoUInt8Array.prototype[\"GetValue\"]=DracoUInt8Array.prototype.GetValue=function(index){var self=this.ptr;if(index&&typeof index===\"object\")index=index.ptr;return _emscripten_bind_DracoUInt8Array_GetValue_1(self,index)};DracoUInt8Array.prototype[\"size\"]=DracoUInt8Array.prototype.size=function(){var self=this.ptr;return _emscripten_bind_DracoUInt8Array_size_0(self)};DracoUInt8Array.prototype[\"__destroy__\"]=DracoUInt8Array.prototype.__destroy__=function(){var self=this.ptr;_emscripten_bind_DracoUInt8Array___destroy___0(self)};function DracoInt16Array(){this.ptr=_emscripten_bind_DracoInt16Array_DracoInt16Array_0();getCache(DracoInt16Array)[this.ptr]=this}DracoInt16Array.prototype=Object.create(WrapperObject.prototype);DracoInt16Array.prototype.constructor=DracoInt16Array;DracoInt16Array.prototype.__class__=DracoInt16Array;DracoInt16Array.__cache__={};Module[\"DracoInt16Array\"]=DracoInt16Array;DracoInt16Array.prototype[\"GetValue\"]=DracoInt16Array.prototype.GetValue=function(index){var self=this.ptr;if(index&&typeof index===\"object\")index=index.ptr;return _emscripten_bind_DracoInt16Array_GetValue_1(self,index)};DracoInt16Array.prototype[\"size\"]=DracoInt16Array.prototype.size=function(){var self=this.ptr;return _emscripten_bind_DracoInt16Array_size_0(self)};DracoInt16Array.prototype[\"__destroy__\"]=DracoInt16Array.prototype.__destroy__=function(){var self=this.ptr;_emscripten_bind_DracoInt16Array___destroy___0(self)};function DracoUInt16Array(){this.ptr=_emscripten_bind_DracoUInt16Array_DracoUInt16Array_0();getCache(DracoUInt16Array)[this.ptr]=this}DracoUInt16Array.prototype=Object.create(WrapperObject.prototype);DracoUInt16Array.prototype.constructor=DracoUInt16Array;DracoUInt16Array.prototype.__class__=DracoUInt16Array;DracoUInt16Array.__cache__={};Module[\"DracoUInt16Array\"]=DracoUInt16Array;DracoUInt16Array.prototype[\"GetValue\"]=DracoUInt16Array.prototype.GetValue=function(index){var self=this.ptr;if(index&&typeof index===\"object\")index=index.ptr;return _emscripten_bind_DracoUInt16Array_GetValue_1(self,index)};DracoUInt16Array.prototype[\"size\"]=DracoUInt16Array.prototype.size=function(){var self=this.ptr;return _emscripten_bind_DracoUInt16Array_size_0(self)};DracoUInt16Array.prototype[\"__destroy__\"]=DracoUInt16Array.prototype.__destroy__=function(){var self=this.ptr;_emscripten_bind_DracoUInt16Array___destroy___0(self)};function DracoInt32Array(){this.ptr=_emscripten_bind_DracoInt32Array_DracoInt32Array_0();getCache(DracoInt32Array)[this.ptr]=this}DracoInt32Array.prototype=Object.create(WrapperObject.prototype);DracoInt32Array.prototype.constructor=DracoInt32Array;DracoInt32Array.prototype.__class__=DracoInt32Array;DracoInt32Array.__cache__={};Module[\"DracoInt32Array\"]=DracoInt32Array;DracoInt32Array.prototype[\"GetValue\"]=DracoInt32Array.prototype.GetValue=function(index){var self=this.ptr;if(index&&typeof index===\"object\")index=index.ptr;return _emscripten_bind_DracoInt32Array_GetValue_1(self,index)};DracoInt32Array.prototype[\"size\"]=DracoInt32Array.prototype.size=function(){var self=this.ptr;return _emscripten_bind_DracoInt32Array_size_0(self)};DracoInt32Array.prototype[\"__destroy__\"]=DracoInt32Array.prototype.__destroy__=function(){var self=this.ptr;_emscripten_bind_DracoInt32Array___destroy___0(self)};function DracoUInt32Array(){this.ptr=_emscripten_bind_DracoUInt32Array_DracoUInt32Array_0();getCache(DracoUInt32Array)[this.ptr]=this}DracoUInt32Array.prototype=Object.create(WrapperObject.prototype);DracoUInt32Array.prototype.constructor=DracoUInt32Array;DracoUInt32Array.prototype.__class__=DracoUInt32Array;DracoUInt32Array.__cache__={};Module[\"DracoUInt32Array\"]=DracoUInt32Array;DracoUInt32Array.prototype[\"GetValue\"]=DracoUInt32Array.prototype.GetValue=function(index){var self=this.ptr;if(index&&typeof index===\"object\")index=index.ptr;return _emscripten_bind_DracoUInt32Array_GetValue_1(self,index)};DracoUInt32Array.prototype[\"size\"]=DracoUInt32Array.prototype.size=function(){var self=this.ptr;return _emscripten_bind_DracoUInt32Array_size_0(self)};DracoUInt32Array.prototype[\"__destroy__\"]=DracoUInt32Array.prototype.__destroy__=function(){var self=this.ptr;_emscripten_bind_DracoUInt32Array___destroy___0(self)};function MetadataQuerier(){this.ptr=_emscripten_bind_MetadataQuerier_MetadataQuerier_0();getCache(MetadataQuerier)[this.ptr]=this}MetadataQuerier.prototype=Object.create(WrapperObject.prototype);MetadataQuerier.prototype.constructor=MetadataQuerier;MetadataQuerier.prototype.__class__=MetadataQuerier;MetadataQuerier.__cache__={};Module[\"MetadataQuerier\"]=MetadataQuerier;MetadataQuerier.prototype[\"HasEntry\"]=MetadataQuerier.prototype.HasEntry=function(metadata,entry_name){var self=this.ptr;ensureCache.prepare();if(metadata&&typeof metadata===\"object\")metadata=metadata.ptr;if(entry_name&&typeof entry_name===\"object\")entry_name=entry_name.ptr;else entry_name=ensureString(entry_name);return!!_emscripten_bind_MetadataQuerier_HasEntry_2(self,metadata,entry_name)};MetadataQuerier.prototype[\"GetIntEntry\"]=MetadataQuerier.prototype.GetIntEntry=function(metadata,entry_name){var self=this.ptr;ensureCache.prepare();if(metadata&&typeof metadata===\"object\")metadata=metadata.ptr;if(entry_name&&typeof entry_name===\"object\")entry_name=entry_name.ptr;else entry_name=ensureString(entry_name);return _emscripten_bind_MetadataQuerier_GetIntEntry_2(self,metadata,entry_name)};MetadataQuerier.prototype[\"GetIntEntryArray\"]=MetadataQuerier.prototype.GetIntEntryArray=function(metadata,entry_name,out_values){var self=this.ptr;ensureCache.prepare();if(metadata&&typeof metadata===\"object\")metadata=metadata.ptr;if(entry_name&&typeof entry_name===\"object\")entry_name=entry_name.ptr;else entry_name=ensureString(entry_name);if(out_values&&typeof out_values===\"object\")out_values=out_values.ptr;_emscripten_bind_MetadataQuerier_GetIntEntryArray_3(self,metadata,entry_name,out_values)};MetadataQuerier.prototype[\"GetDoubleEntry\"]=MetadataQuerier.prototype.GetDoubleEntry=function(metadata,entry_name){var self=this.ptr;ensureCache.prepare();if(metadata&&typeof metadata===\"object\")metadata=metadata.ptr;if(entry_name&&typeof entry_name===\"object\")entry_name=entry_name.ptr;else entry_name=ensureString(entry_name);return _emscripten_bind_MetadataQuerier_GetDoubleEntry_2(self,metadata,entry_name)};MetadataQuerier.prototype[\"GetStringEntry\"]=MetadataQuerier.prototype.GetStringEntry=function(metadata,entry_name){var self=this.ptr;ensureCache.prepare();if(metadata&&typeof metadata===\"object\")metadata=metadata.ptr;if(entry_name&&typeof entry_name===\"object\")entry_name=entry_name.ptr;else entry_name=ensureString(entry_name);return UTF8ToString(_emscripten_bind_MetadataQuerier_GetStringEntry_2(self,metadata,entry_name))};MetadataQuerier.prototype[\"NumEntries\"]=MetadataQuerier.prototype.NumEntries=function(metadata){var self=this.ptr;if(metadata&&typeof metadata===\"object\")metadata=metadata.ptr;return _emscripten_bind_MetadataQuerier_NumEntries_1(self,metadata)};MetadataQuerier.prototype[\"GetEntryName\"]=MetadataQuerier.prototype.GetEntryName=function(metadata,entry_id){var self=this.ptr;if(metadata&&typeof metadata===\"object\")metadata=metadata.ptr;if(entry_id&&typeof entry_id===\"object\")entry_id=entry_id.ptr;return UTF8ToString(_emscripten_bind_MetadataQuerier_GetEntryName_2(self,metadata,entry_id))};MetadataQuerier.prototype[\"__destroy__\"]=MetadataQuerier.prototype.__destroy__=function(){var self=this.ptr;_emscripten_bind_MetadataQuerier___destroy___0(self)};function Decoder(){this.ptr=_emscripten_bind_Decoder_Decoder_0();getCache(Decoder)[this.ptr]=this}Decoder.prototype=Object.create(WrapperObject.prototype);Decoder.prototype.constructor=Decoder;Decoder.prototype.__class__=Decoder;Decoder.__cache__={};Module[\"Decoder\"]=Decoder;Decoder.prototype[\"DecodeArrayToPointCloud\"]=Decoder.prototype.DecodeArrayToPointCloud=function(data,data_size,out_point_cloud){var self=this.ptr;ensureCache.prepare();if(typeof data==\"object\"){data=ensureInt8(data)}if(data_size&&typeof data_size===\"object\")data_size=data_size.ptr;if(out_point_cloud&&typeof out_point_cloud===\"object\")out_point_cloud=out_point_cloud.ptr;return wrapPointer(_emscripten_bind_Decoder_DecodeArrayToPointCloud_3(self,data,data_size,out_point_cloud),Status)};Decoder.prototype[\"DecodeArrayToMesh\"]=Decoder.prototype.DecodeArrayToMesh=function(data,data_size,out_mesh){var self=this.ptr;ensureCache.prepare();if(typeof data==\"object\"){data=ensureInt8(data)}if(data_size&&typeof data_size===\"object\")data_size=data_size.ptr;if(out_mesh&&typeof out_mesh===\"object\")out_mesh=out_mesh.ptr;return wrapPointer(_emscripten_bind_Decoder_DecodeArrayToMesh_3(self,data,data_size,out_mesh),Status)};Decoder.prototype[\"GetAttributeId\"]=Decoder.prototype.GetAttributeId=function(pc,type){var self=this.ptr;if(pc&&typeof pc===\"object\")pc=pc.ptr;if(type&&typeof type===\"object\")type=type.ptr;return _emscripten_bind_Decoder_GetAttributeId_2(self,pc,type)};Decoder.prototype[\"GetAttributeIdByName\"]=Decoder.prototype.GetAttributeIdByName=function(pc,name){var self=this.ptr;ensureCache.prepare();if(pc&&typeof pc===\"object\")pc=pc.ptr;if(name&&typeof name===\"object\")name=name.ptr;else name=ensureString(name);return _emscripten_bind_Decoder_GetAttributeIdByName_2(self,pc,name)};Decoder.prototype[\"GetAttributeIdByMetadataEntry\"]=Decoder.prototype.GetAttributeIdByMetadataEntry=function(pc,name,value){var self=this.ptr;ensureCache.prepare();if(pc&&typeof pc===\"object\")pc=pc.ptr;if(name&&typeof name===\"object\")name=name.ptr;else name=ensureString(name);if(value&&typeof value===\"object\")value=value.ptr;else value=ensureString(value);return _emscripten_bind_Decoder_GetAttributeIdByMetadataEntry_3(self,pc,name,value)};Decoder.prototype[\"GetAttribute\"]=Decoder.prototype.GetAttribute=function(pc,att_id){var self=this.ptr;if(pc&&typeof pc===\"object\")pc=pc.ptr;if(att_id&&typeof att_id===\"object\")att_id=att_id.ptr;return wrapPointer(_emscripten_bind_Decoder_GetAttribute_2(self,pc,att_id),PointAttribute)};Decoder.prototype[\"GetAttributeByUniqueId\"]=Decoder.prototype.GetAttributeByUniqueId=function(pc,unique_id){var self=this.ptr;if(pc&&typeof pc===\"object\")pc=pc.ptr;if(unique_id&&typeof unique_id===\"object\")unique_id=unique_id.ptr;return wrapPointer(_emscripten_bind_Decoder_GetAttributeByUniqueId_2(self,pc,unique_id),PointAttribute)};Decoder.prototype[\"GetMetadata\"]=Decoder.prototype.GetMetadata=function(pc){var self=this.ptr;if(pc&&typeof pc===\"object\")pc=pc.ptr;return wrapPointer(_emscripten_bind_Decoder_GetMetadata_1(self,pc),Metadata)};Decoder.prototype[\"GetAttributeMetadata\"]=Decoder.prototype.GetAttributeMetadata=function(pc,att_id){var self=this.ptr;if(pc&&typeof pc===\"object\")pc=pc.ptr;if(att_id&&typeof att_id===\"object\")att_id=att_id.ptr;return wrapPointer(_emscripten_bind_Decoder_GetAttributeMetadata_2(self,pc,att_id),Metadata)};Decoder.prototype[\"GetFaceFromMesh\"]=Decoder.prototype.GetFaceFromMesh=function(m,face_id,out_values){var self=this.ptr;if(m&&typeof m===\"object\")m=m.ptr;if(face_id&&typeof face_id===\"object\")face_id=face_id.ptr;if(out_values&&typeof out_values===\"object\")out_values=out_values.ptr;return!!_emscripten_bind_Decoder_GetFaceFromMesh_3(self,m,face_id,out_values)};Decoder.prototype[\"GetTriangleStripsFromMesh\"]=Decoder.prototype.GetTriangleStripsFromMesh=function(m,strip_values){var self=this.ptr;if(m&&typeof m===\"object\")m=m.ptr;if(strip_values&&typeof strip_values===\"object\")strip_values=strip_values.ptr;return _emscripten_bind_Decoder_GetTriangleStripsFromMesh_2(self,m,strip_values)};Decoder.prototype[\"GetTrianglesUInt16Array\"]=Decoder.prototype.GetTrianglesUInt16Array=function(m,out_size,out_values){var self=this.ptr;if(m&&typeof m===\"object\")m=m.ptr;if(out_size&&typeof out_size===\"object\")out_size=out_size.ptr;if(out_values&&typeof out_values===\"object\")out_values=out_values.ptr;return!!_emscripten_bind_Decoder_GetTrianglesUInt16Array_3(self,m,out_size,out_values)};Decoder.prototype[\"GetTrianglesUInt32Array\"]=Decoder.prototype.GetTrianglesUInt32Array=function(m,out_size,out_values){var self=this.ptr;if(m&&typeof m===\"object\")m=m.ptr;if(out_size&&typeof out_size===\"object\")out_size=out_size.ptr;if(out_values&&typeof out_values===\"object\")out_values=out_values.ptr;return!!_emscripten_bind_Decoder_GetTrianglesUInt32Array_3(self,m,out_size,out_values)};Decoder.prototype[\"GetAttributeFloat\"]=Decoder.prototype.GetAttributeFloat=function(pa,att_index,out_values){var self=this.ptr;if(pa&&typeof pa===\"object\")pa=pa.ptr;if(att_index&&typeof att_index===\"object\")att_index=att_index.ptr;if(out_values&&typeof out_values===\"object\")out_values=out_values.ptr;return!!_emscripten_bind_Decoder_GetAttributeFloat_3(self,pa,att_index,out_values)};Decoder.prototype[\"GetAttributeFloatForAllPoints\"]=Decoder.prototype.GetAttributeFloatForAllPoints=function(pc,pa,out_values){var self=this.ptr;if(pc&&typeof pc===\"object\")pc=pc.ptr;if(pa&&typeof pa===\"object\")pa=pa.ptr;if(out_values&&typeof out_values===\"object\")out_values=out_values.ptr;return!!_emscripten_bind_Decoder_GetAttributeFloatForAllPoints_3(self,pc,pa,out_values)};Decoder.prototype[\"GetAttributeIntForAllPoints\"]=Decoder.prototype.GetAttributeIntForAllPoints=function(pc,pa,out_values){var self=this.ptr;if(pc&&typeof pc===\"object\")pc=pc.ptr;if(pa&&typeof pa===\"object\")pa=pa.ptr;if(out_values&&typeof out_values===\"object\")out_values=out_values.ptr;return!!_emscripten_bind_Decoder_GetAttributeIntForAllPoints_3(self,pc,pa,out_values)};Decoder.prototype[\"GetAttributeInt8ForAllPoints\"]=Decoder.prototype.GetAttributeInt8ForAllPoints=function(pc,pa,out_values){var self=this.ptr;if(pc&&typeof pc===\"object\")pc=pc.ptr;if(pa&&typeof pa===\"object\")pa=pa.ptr;if(out_values&&typeof out_values===\"object\")out_values=out_values.ptr;return!!_emscripten_bind_Decoder_GetAttributeInt8ForAllPoints_3(self,pc,pa,out_values)};Decoder.prototype[\"GetAttributeUInt8ForAllPoints\"]=Decoder.prototype.GetAttributeUInt8ForAllPoints=function(pc,pa,out_values){var self=this.ptr;if(pc&&typeof pc===\"object\")pc=pc.ptr;if(pa&&typeof pa===\"object\")pa=pa.ptr;if(out_values&&typeof out_values===\"object\")out_values=out_values.ptr;return!!_emscripten_bind_Decoder_GetAttributeUInt8ForAllPoints_3(self,pc,pa,out_values)};Decoder.prototype[\"GetAttributeInt16ForAllPoints\"]=Decoder.prototype.GetAttributeInt16ForAllPoints=function(pc,pa,out_values){var self=this.ptr;if(pc&&typeof pc===\"object\")pc=pc.ptr;if(pa&&typeof pa===\"object\")pa=pa.ptr;if(out_values&&typeof out_values===\"object\")out_values=out_values.ptr;return!!_emscripten_bind_Decoder_GetAttributeInt16ForAllPoints_3(self,pc,pa,out_values)};Decoder.prototype[\"GetAttributeUInt16ForAllPoints\"]=Decoder.prototype.GetAttributeUInt16ForAllPoints=function(pc,pa,out_values){var self=this.ptr;if(pc&&typeof pc===\"object\")pc=pc.ptr;if(pa&&typeof pa===\"object\")pa=pa.ptr;if(out_values&&typeof out_values===\"object\")out_values=out_values.ptr;return!!_emscripten_bind_Decoder_GetAttributeUInt16ForAllPoints_3(self,pc,pa,out_values)};Decoder.prototype[\"GetAttributeInt32ForAllPoints\"]=Decoder.prototype.GetAttributeInt32ForAllPoints=function(pc,pa,out_values){var self=this.ptr;if(pc&&typeof pc===\"object\")pc=pc.ptr;if(pa&&typeof pa===\"object\")pa=pa.ptr;if(out_values&&typeof out_values===\"object\")out_values=out_values.ptr;return!!_emscripten_bind_Decoder_GetAttributeInt32ForAllPoints_3(self,pc,pa,out_values)};Decoder.prototype[\"GetAttributeUInt32ForAllPoints\"]=Decoder.prototype.GetAttributeUInt32ForAllPoints=function(pc,pa,out_values){var self=this.ptr;if(pc&&typeof pc===\"object\")pc=pc.ptr;if(pa&&typeof pa===\"object\")pa=pa.ptr;if(out_values&&typeof out_values===\"object\")out_values=out_values.ptr;return!!_emscripten_bind_Decoder_GetAttributeUInt32ForAllPoints_3(self,pc,pa,out_values)};Decoder.prototype[\"GetAttributeDataArrayForAllPoints\"]=Decoder.prototype.GetAttributeDataArrayForAllPoints=function(pc,pa,data_type,out_size,out_values){var self=this.ptr;if(pc&&typeof pc===\"object\")pc=pc.ptr;if(pa&&typeof pa===\"object\")pa=pa.ptr;if(data_type&&typeof data_type===\"object\")data_type=data_type.ptr;if(out_size&&typeof out_size===\"object\")out_size=out_size.ptr;if(out_values&&typeof out_values===\"object\")out_values=out_values.ptr;return!!_emscripten_bind_Decoder_GetAttributeDataArrayForAllPoints_5(self,pc,pa,data_type,out_size,out_values)};Decoder.prototype[\"SkipAttributeTransform\"]=Decoder.prototype.SkipAttributeTransform=function(att_type){var self=this.ptr;if(att_type&&typeof att_type===\"object\")att_type=att_type.ptr;_emscripten_bind_Decoder_SkipAttributeTransform_1(self,att_type)};Decoder.prototype[\"GetEncodedGeometryType_Deprecated\"]=Decoder.prototype.GetEncodedGeometryType_Deprecated=function(in_buffer){var self=this.ptr;if(in_buffer&&typeof in_buffer===\"object\")in_buffer=in_buffer.ptr;return _emscripten_bind_Decoder_GetEncodedGeometryType_Deprecated_1(self,in_buffer)};Decoder.prototype[\"DecodeBufferToPointCloud\"]=Decoder.prototype.DecodeBufferToPointCloud=function(in_buffer,out_point_cloud){var self=this.ptr;if(in_buffer&&typeof in_buffer===\"object\")in_buffer=in_buffer.ptr;if(out_point_cloud&&typeof out_point_cloud===\"object\")out_point_cloud=out_point_cloud.ptr;return wrapPointer(_emscripten_bind_Decoder_DecodeBufferToPointCloud_2(self,in_buffer,out_point_cloud),Status)};Decoder.prototype[\"DecodeBufferToMesh\"]=Decoder.prototype.DecodeBufferToMesh=function(in_buffer,out_mesh){var self=this.ptr;if(in_buffer&&typeof in_buffer===\"object\")in_buffer=in_buffer.ptr;if(out_mesh&&typeof out_mesh===\"object\")out_mesh=out_mesh.ptr;return wrapPointer(_emscripten_bind_Decoder_DecodeBufferToMesh_2(self,in_buffer,out_mesh),Status)};Decoder.prototype[\"__destroy__\"]=Decoder.prototype.__destroy__=function(){var self=this.ptr;_emscripten_bind_Decoder___destroy___0(self)};(function(){function setupEnums(){Module[\"ATTRIBUTE_INVALID_TRANSFORM\"]=_emscripten_enum_draco_AttributeTransformType_ATTRIBUTE_INVALID_TRANSFORM();Module[\"ATTRIBUTE_NO_TRANSFORM\"]=_emscripten_enum_draco_AttributeTransformType_ATTRIBUTE_NO_TRANSFORM();Module[\"ATTRIBUTE_QUANTIZATION_TRANSFORM\"]=_emscripten_enum_draco_AttributeTransformType_ATTRIBUTE_QUANTIZATION_TRANSFORM();Module[\"ATTRIBUTE_OCTAHEDRON_TRANSFORM\"]=_emscripten_enum_draco_AttributeTransformType_ATTRIBUTE_OCTAHEDRON_TRANSFORM();Module[\"INVALID\"]=_emscripten_enum_draco_GeometryAttribute_Type_INVALID();Module[\"POSITION\"]=_emscripten_enum_draco_GeometryAttribute_Type_POSITION();Module[\"NORMAL\"]=_emscripten_enum_draco_GeometryAttribute_Type_NORMAL();Module[\"COLOR\"]=_emscripten_enum_draco_GeometryAttribute_Type_COLOR();Module[\"TEX_COORD\"]=_emscripten_enum_draco_GeometryAttribute_Type_TEX_COORD();Module[\"GENERIC\"]=_emscripten_enum_draco_GeometryAttribute_Type_GENERIC();Module[\"INVALID_GEOMETRY_TYPE\"]=_emscripten_enum_draco_EncodedGeometryType_INVALID_GEOMETRY_TYPE();Module[\"POINT_CLOUD\"]=_emscripten_enum_draco_EncodedGeometryType_POINT_CLOUD();Module[\"TRIANGULAR_MESH\"]=_emscripten_enum_draco_EncodedGeometryType_TRIANGULAR_MESH();Module[\"DT_INVALID\"]=_emscripten_enum_draco_DataType_DT_INVALID();Module[\"DT_INT8\"]=_emscripten_enum_draco_DataType_DT_INT8();Module[\"DT_UINT8\"]=_emscripten_enum_draco_DataType_DT_UINT8();Module[\"DT_INT16\"]=_emscripten_enum_draco_DataType_DT_INT16();Module[\"DT_UINT16\"]=_emscripten_enum_draco_DataType_DT_UINT16();Module[\"DT_INT32\"]=_emscripten_enum_draco_DataType_DT_INT32();Module[\"DT_UINT32\"]=_emscripten_enum_draco_DataType_DT_UINT32();Module[\"DT_INT64\"]=_emscripten_enum_draco_DataType_DT_INT64();Module[\"DT_UINT64\"]=_emscripten_enum_draco_DataType_DT_UINT64();Module[\"DT_FLOAT32\"]=_emscripten_enum_draco_DataType_DT_FLOAT32();Module[\"DT_FLOAT64\"]=_emscripten_enum_draco_DataType_DT_FLOAT64();Module[\"DT_BOOL\"]=_emscripten_enum_draco_DataType_DT_BOOL();Module[\"DT_TYPES_COUNT\"]=_emscripten_enum_draco_DataType_DT_TYPES_COUNT();Module[\"OK\"]=_emscripten_enum_draco_StatusCode_OK();Module[\"DRACO_ERROR\"]=_emscripten_enum_draco_StatusCode_DRACO_ERROR();Module[\"IO_ERROR\"]=_emscripten_enum_draco_StatusCode_IO_ERROR();Module[\"INVALID_PARAMETER\"]=_emscripten_enum_draco_StatusCode_INVALID_PARAMETER();Module[\"UNSUPPORTED_VERSION\"]=_emscripten_enum_draco_StatusCode_UNSUPPORTED_VERSION();Module[\"UNKNOWN_VERSION\"]=_emscripten_enum_draco_StatusCode_UNKNOWN_VERSION()}if(runtimeInitialized)setupEnums();else addOnInit(setupEnums)})();if(typeof Module[\"onModuleParsed\"]===\"function\"){Module[\"onModuleParsed\"]()}Module[\"Decoder\"].prototype.GetEncodedGeometryType=function(array){if(array.__class__&&array.__class__===Module.DecoderBuffer){return Module.Decoder.prototype.GetEncodedGeometryType_Deprecated(array)}if(array.byteLength<8)return Module.INVALID_GEOMETRY_TYPE;switch(array[7]){case 0:return Module.POINT_CLOUD;case 1:return Module.TRIANGULAR_MESH;default:return Module.INVALID_GEOMETRY_TYPE}};\n\n\n  return DracoDecoderModule.ready\n}\n);\n})();\nif (typeof exports === 'object' && typeof module === 'object')\n  module.exports = DracoDecoderModule;\nelse if (typeof define === 'function' && define['amd'])\n  define([], function() { return DracoDecoderModule; });\nelse if (typeof exports === 'object')\n  exports[\"DracoDecoderModule\"] = DracoDecoderModule;\n"
  },
  {
    "path": "examples/libs/draco/draco_encoder.js",
    "content": "var DracoEncoderModule = function(DracoEncoderModule) {\n  DracoEncoderModule = DracoEncoderModule || {};\n\nvar Module=typeof DracoEncoderModule!==\"undefined\"?DracoEncoderModule:{};var isRuntimeInitialized=false;var isModuleParsed=false;Module[\"onRuntimeInitialized\"]=(function(){isRuntimeInitialized=true;if(isModuleParsed){if(typeof Module[\"onModuleLoaded\"]===\"function\"){Module[\"onModuleLoaded\"](Module)}}});Module[\"onModuleParsed\"]=(function(){isModuleParsed=true;if(isRuntimeInitialized){if(typeof Module[\"onModuleLoaded\"]===\"function\"){Module[\"onModuleLoaded\"](Module)}}});function isVersionSupported(versionString){if(typeof versionString!==\"string\")return false;const version=versionString.split(\".\");if(version.length<2||version.length>3)return false;if(version[0]==1&&version[1]>=0&&version[1]<=3)return true;if(version[0]!=0||version[1]>10)return false;return true}Module[\"isVersionSupported\"]=isVersionSupported;var moduleOverrides={};var key;for(key in Module){if(Module.hasOwnProperty(key)){moduleOverrides[key]=Module[key]}}Module[\"arguments\"]=[];Module[\"thisProgram\"]=\"./this.program\";Module[\"quit\"]=(function(status,toThrow){throw toThrow});Module[\"preRun\"]=[];Module[\"postRun\"]=[];var ENVIRONMENT_IS_WEB=false;var ENVIRONMENT_IS_WORKER=false;var ENVIRONMENT_IS_NODE=false;var ENVIRONMENT_IS_SHELL=false;if(Module[\"ENVIRONMENT\"]){if(Module[\"ENVIRONMENT\"]===\"WEB\"){ENVIRONMENT_IS_WEB=true}else if(Module[\"ENVIRONMENT\"]===\"WORKER\"){ENVIRONMENT_IS_WORKER=true}else if(Module[\"ENVIRONMENT\"]===\"NODE\"){ENVIRONMENT_IS_NODE=true}else if(Module[\"ENVIRONMENT\"]===\"SHELL\"){ENVIRONMENT_IS_SHELL=true}else{throw new Error(\"Module['ENVIRONMENT'] value is not valid. must be one of: WEB|WORKER|NODE|SHELL.\")}}else{ENVIRONMENT_IS_WEB=typeof window===\"object\";ENVIRONMENT_IS_WORKER=typeof importScripts===\"function\";ENVIRONMENT_IS_NODE=typeof process===\"object\"&&typeof require===\"function\"&&!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_WORKER;ENVIRONMENT_IS_SHELL=!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_NODE&&!ENVIRONMENT_IS_WORKER}if(ENVIRONMENT_IS_NODE){var nodeFS;var nodePath;Module[\"read\"]=function shell_read(filename,binary){var ret;ret=tryParseAsDataURI(filename);if(!ret){if(!nodeFS)nodeFS=require(\"fs\");if(!nodePath)nodePath=require(\"path\");filename=nodePath[\"normalize\"](filename);ret=nodeFS[\"readFileSync\"](filename)}return binary?ret:ret.toString()};Module[\"readBinary\"]=function readBinary(filename){var ret=Module[\"read\"](filename,true);if(!ret.buffer){ret=new Uint8Array(ret)}assert(ret.buffer);return ret};if(process[\"argv\"].length>1){Module[\"thisProgram\"]=process[\"argv\"][1].replace(/\\\\/g,\"/\")}Module[\"arguments\"]=process[\"argv\"].slice(2);process[\"on\"](\"uncaughtException\",(function(ex){if(!(ex instanceof ExitStatus)){throw ex}}));process[\"on\"](\"unhandledRejection\",(function(reason,p){process[\"exit\"](1)}));Module[\"inspect\"]=(function(){return\"[Emscripten Module object]\"})}else if(ENVIRONMENT_IS_SHELL){if(typeof read!=\"undefined\"){Module[\"read\"]=function shell_read(f){var data=tryParseAsDataURI(f);if(data){return intArrayToString(data)}return read(f)}}Module[\"readBinary\"]=function readBinary(f){var data;data=tryParseAsDataURI(f);if(data){return data}if(typeof readbuffer===\"function\"){return new Uint8Array(readbuffer(f))}data=read(f,\"binary\");assert(typeof data===\"object\");return data};if(typeof scriptArgs!=\"undefined\"){Module[\"arguments\"]=scriptArgs}else if(typeof arguments!=\"undefined\"){Module[\"arguments\"]=arguments}if(typeof quit===\"function\"){Module[\"quit\"]=(function(status,toThrow){quit(status)})}}else if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){Module[\"read\"]=function shell_read(url){try{var xhr=new XMLHttpRequest;xhr.open(\"GET\",url,false);xhr.send(null);return xhr.responseText}catch(err){var data=tryParseAsDataURI(url);if(data){return intArrayToString(data)}throw err}};if(ENVIRONMENT_IS_WORKER){Module[\"readBinary\"]=function readBinary(url){try{var xhr=new XMLHttpRequest;xhr.open(\"GET\",url,false);xhr.responseType=\"arraybuffer\";xhr.send(null);return new Uint8Array(xhr.response)}catch(err){var data=tryParseAsDataURI(url);if(data){return data}throw err}}}Module[\"readAsync\"]=function readAsync(url,onload,onerror){var xhr=new XMLHttpRequest;xhr.open(\"GET\",url,true);xhr.responseType=\"arraybuffer\";xhr.onload=function xhr_onload(){if(xhr.status==200||xhr.status==0&&xhr.response){onload(xhr.response);return}var data=tryParseAsDataURI(url);if(data){onload(data.buffer);return}onerror()};xhr.onerror=onerror;xhr.send(null)};Module[\"setWindowTitle\"]=(function(title){document.title=title})}Module[\"print\"]=typeof console!==\"undefined\"?console.log.bind(console):typeof print!==\"undefined\"?print:null;Module[\"printErr\"]=typeof printErr!==\"undefined\"?printErr:typeof console!==\"undefined\"&&console.warn.bind(console)||Module[\"print\"];Module.print=Module[\"print\"];Module.printErr=Module[\"printErr\"];for(key in moduleOverrides){if(moduleOverrides.hasOwnProperty(key)){Module[key]=moduleOverrides[key]}}moduleOverrides=undefined;var STACK_ALIGN=16;function staticAlloc(size){assert(!staticSealed);var ret=STATICTOP;STATICTOP=STATICTOP+size+15&-16;return ret}function dynamicAlloc(size){assert(DYNAMICTOP_PTR);var ret=HEAP32[DYNAMICTOP_PTR>>2];var end=ret+size+15&-16;HEAP32[DYNAMICTOP_PTR>>2]=end;if(end>=TOTAL_MEMORY){var success=enlargeMemory();if(!success){HEAP32[DYNAMICTOP_PTR>>2]=ret;return 0}}return ret}function alignMemory(size,factor){if(!factor)factor=STACK_ALIGN;var ret=size=Math.ceil(size/factor)*factor;return ret}function getNativeTypeSize(type){switch(type){case\"i1\":case\"i8\":return 1;case\"i16\":return 2;case\"i32\":return 4;case\"i64\":return 8;case\"float\":return 4;case\"double\":return 8;default:{if(type[type.length-1]===\"*\"){return 4}else if(type[0]===\"i\"){var bits=parseInt(type.substr(1));assert(bits%8===0);return bits/8}else{return 0}}}}function warnOnce(text){if(!warnOnce.shown)warnOnce.shown={};if(!warnOnce.shown[text]){warnOnce.shown[text]=1;Module.printErr(text)}}var jsCallStartIndex=1;var functionPointers=new Array(0);var funcWrappers={};function dynCall(sig,ptr,args){if(args&&args.length){return Module[\"dynCall_\"+sig].apply(null,[ptr].concat(args))}else{return Module[\"dynCall_\"+sig].call(null,ptr)}}var GLOBAL_BASE=8;var ABORT=0;var EXITSTATUS=0;function assert(condition,text){if(!condition){abort(\"Assertion failed: \"+text)}}function getCFunc(ident){var func=Module[\"_\"+ident];assert(func,\"Cannot call unknown function \"+ident+\", make sure it is exported\");return func}var JSfuncs={\"stackSave\":(function(){stackSave()}),\"stackRestore\":(function(){stackRestore()}),\"arrayToC\":(function(arr){var ret=stackAlloc(arr.length);writeArrayToMemory(arr,ret);return ret}),\"stringToC\":(function(str){var ret=0;if(str!==null&&str!==undefined&&str!==0){var len=(str.length<<2)+1;ret=stackAlloc(len);stringToUTF8(str,ret,len)}return ret})};var toC={\"string\":JSfuncs[\"stringToC\"],\"array\":JSfuncs[\"arrayToC\"]};function ccall(ident,returnType,argTypes,args,opts){var func=getCFunc(ident);var cArgs=[];var stack=0;if(args){for(var i=0;i<args.length;i++){var converter=toC[argTypes[i]];if(converter){if(stack===0)stack=stackSave();cArgs[i]=converter(args[i])}else{cArgs[i]=args[i]}}}var ret=func.apply(null,cArgs);if(returnType===\"string\")ret=Pointer_stringify(ret);if(returnType===\"boolean\")ret=Boolean(ret);if(stack!==0){stackRestore(stack)}return ret}function setValue(ptr,value,type,noSafe){type=type||\"i8\";if(type.charAt(type.length-1)===\"*\")type=\"i32\";switch(type){case\"i1\":HEAP8[ptr>>0]=value;break;case\"i8\":HEAP8[ptr>>0]=value;break;case\"i16\":HEAP16[ptr>>1]=value;break;case\"i32\":HEAP32[ptr>>2]=value;break;case\"i64\":tempI64=[value>>>0,(tempDouble=value,+Math_abs(tempDouble)>=+1?tempDouble>+0?(Math_min(+Math_floor(tempDouble/+4294967296),+4294967295)|0)>>>0:~~+Math_ceil((tempDouble- +(~~tempDouble>>>0))/+4294967296)>>>0:0)],HEAP32[ptr>>2]=tempI64[0],HEAP32[ptr+4>>2]=tempI64[1];break;case\"float\":HEAPF32[ptr>>2]=value;break;case\"double\":HEAPF64[ptr>>3]=value;break;default:abort(\"invalid type for setValue: \"+type)}}var ALLOC_STATIC=2;var ALLOC_NONE=4;function allocate(slab,types,allocator,ptr){var zeroinit,size;if(typeof slab===\"number\"){zeroinit=true;size=slab}else{zeroinit=false;size=slab.length}var singleType=typeof types===\"string\"?types:null;var ret;if(allocator==ALLOC_NONE){ret=ptr}else{ret=[typeof _malloc===\"function\"?_malloc:staticAlloc,stackAlloc,staticAlloc,dynamicAlloc][allocator===undefined?ALLOC_STATIC:allocator](Math.max(size,singleType?1:types.length))}if(zeroinit){var stop;ptr=ret;assert((ret&3)==0);stop=ret+(size&~3);for(;ptr<stop;ptr+=4){HEAP32[ptr>>2]=0}stop=ret+size;while(ptr<stop){HEAP8[ptr++>>0]=0}return ret}if(singleType===\"i8\"){if(slab.subarray||slab.slice){HEAPU8.set(slab,ret)}else{HEAPU8.set(new Uint8Array(slab),ret)}return ret}var i=0,type,typeSize,previousType;while(i<size){var curr=slab[i];type=singleType||types[i];if(type===0){i++;continue}if(type==\"i64\")type=\"i32\";setValue(ret+i,curr,type);if(previousType!==type){typeSize=getNativeTypeSize(type);previousType=type}i+=typeSize}return ret}function Pointer_stringify(ptr,length){if(length===0||!ptr)return\"\";var hasUtf=0;var t;var i=0;while(1){t=HEAPU8[ptr+i>>0];hasUtf|=t;if(t==0&&!length)break;i++;if(length&&i==length)break}if(!length)length=i;var ret=\"\";if(hasUtf<128){var MAX_CHUNK=1024;var curr;while(length>0){curr=String.fromCharCode.apply(String,HEAPU8.subarray(ptr,ptr+Math.min(length,MAX_CHUNK)));ret=ret?ret+curr:curr;ptr+=MAX_CHUNK;length-=MAX_CHUNK}return ret}return UTF8ToString(ptr)}var UTF8Decoder=typeof TextDecoder!==\"undefined\"?new TextDecoder(\"utf8\"):undefined;function UTF8ArrayToString(u8Array,idx){var endPtr=idx;while(u8Array[endPtr])++endPtr;if(endPtr-idx>16&&u8Array.subarray&&UTF8Decoder){return UTF8Decoder.decode(u8Array.subarray(idx,endPtr))}else{var u0,u1,u2,u3,u4,u5;var str=\"\";while(1){u0=u8Array[idx++];if(!u0)return str;if(!(u0&128)){str+=String.fromCharCode(u0);continue}u1=u8Array[idx++]&63;if((u0&224)==192){str+=String.fromCharCode((u0&31)<<6|u1);continue}u2=u8Array[idx++]&63;if((u0&240)==224){u0=(u0&15)<<12|u1<<6|u2}else{u3=u8Array[idx++]&63;if((u0&248)==240){u0=(u0&7)<<18|u1<<12|u2<<6|u3}else{u4=u8Array[idx++]&63;if((u0&252)==248){u0=(u0&3)<<24|u1<<18|u2<<12|u3<<6|u4}else{u5=u8Array[idx++]&63;u0=(u0&1)<<30|u1<<24|u2<<18|u3<<12|u4<<6|u5}}}if(u0<65536){str+=String.fromCharCode(u0)}else{var ch=u0-65536;str+=String.fromCharCode(55296|ch>>10,56320|ch&1023)}}}}function UTF8ToString(ptr){return UTF8ArrayToString(HEAPU8,ptr)}function stringToUTF8Array(str,outU8Array,outIdx,maxBytesToWrite){if(!(maxBytesToWrite>0))return 0;var startIdx=outIdx;var endIdx=outIdx+maxBytesToWrite-1;for(var i=0;i<str.length;++i){var u=str.charCodeAt(i);if(u>=55296&&u<=57343)u=65536+((u&1023)<<10)|str.charCodeAt(++i)&1023;if(u<=127){if(outIdx>=endIdx)break;outU8Array[outIdx++]=u}else if(u<=2047){if(outIdx+1>=endIdx)break;outU8Array[outIdx++]=192|u>>6;outU8Array[outIdx++]=128|u&63}else if(u<=65535){if(outIdx+2>=endIdx)break;outU8Array[outIdx++]=224|u>>12;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}else if(u<=2097151){if(outIdx+3>=endIdx)break;outU8Array[outIdx++]=240|u>>18;outU8Array[outIdx++]=128|u>>12&63;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}else if(u<=67108863){if(outIdx+4>=endIdx)break;outU8Array[outIdx++]=248|u>>24;outU8Array[outIdx++]=128|u>>18&63;outU8Array[outIdx++]=128|u>>12&63;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}else{if(outIdx+5>=endIdx)break;outU8Array[outIdx++]=252|u>>30;outU8Array[outIdx++]=128|u>>24&63;outU8Array[outIdx++]=128|u>>18&63;outU8Array[outIdx++]=128|u>>12&63;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}}outU8Array[outIdx]=0;return outIdx-startIdx}function stringToUTF8(str,outPtr,maxBytesToWrite){return stringToUTF8Array(str,HEAPU8,outPtr,maxBytesToWrite)}function lengthBytesUTF8(str){var len=0;for(var i=0;i<str.length;++i){var u=str.charCodeAt(i);if(u>=55296&&u<=57343)u=65536+((u&1023)<<10)|str.charCodeAt(++i)&1023;if(u<=127){++len}else if(u<=2047){len+=2}else if(u<=65535){len+=3}else if(u<=2097151){len+=4}else if(u<=67108863){len+=5}else{len+=6}}return len}var UTF16Decoder=typeof TextDecoder!==\"undefined\"?new TextDecoder(\"utf-16le\"):undefined;function demangle(func){return func}function demangleAll(text){var regex=/__Z[\\w\\d_]+/g;return text.replace(regex,(function(x){var y=demangle(x);return x===y?x:x+\" [\"+y+\"]\"}))}function jsStackTrace(){var err=new Error;if(!err.stack){try{throw new Error(0)}catch(e){err=e}if(!err.stack){return\"(no stack trace available)\"}}return err.stack.toString()}var WASM_PAGE_SIZE=65536;var ASMJS_PAGE_SIZE=16777216;var MIN_TOTAL_MEMORY=16777216;function alignUp(x,multiple){if(x%multiple>0){x+=multiple-x%multiple}return x}var buffer,HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64;function updateGlobalBuffer(buf){Module[\"buffer\"]=buffer=buf}function updateGlobalBufferViews(){Module[\"HEAP8\"]=HEAP8=new Int8Array(buffer);Module[\"HEAP16\"]=HEAP16=new Int16Array(buffer);Module[\"HEAP32\"]=HEAP32=new Int32Array(buffer);Module[\"HEAPU8\"]=HEAPU8=new Uint8Array(buffer);Module[\"HEAPU16\"]=HEAPU16=new Uint16Array(buffer);Module[\"HEAPU32\"]=HEAPU32=new Uint32Array(buffer);Module[\"HEAPF32\"]=HEAPF32=new Float32Array(buffer);Module[\"HEAPF64\"]=HEAPF64=new Float64Array(buffer)}var STATIC_BASE,STATICTOP,staticSealed;var STACK_BASE,STACKTOP,STACK_MAX;var DYNAMIC_BASE,DYNAMICTOP_PTR;STATIC_BASE=STATICTOP=STACK_BASE=STACKTOP=STACK_MAX=DYNAMIC_BASE=DYNAMICTOP_PTR=0;staticSealed=false;function abortOnCannotGrowMemory(){abort(\"Cannot enlarge memory arrays. Either (1) compile with  -s TOTAL_MEMORY=X  with X higher than the current value \"+TOTAL_MEMORY+\", (2) compile with  -s ALLOW_MEMORY_GROWTH=1  which allows increasing the size at runtime but prevents some optimizations, (3) set Module.TOTAL_MEMORY to a higher value before the program runs, or (4) if you want malloc to return NULL (0) instead of this abort, compile with  -s ABORTING_MALLOC=0 \")}if(!Module[\"reallocBuffer\"])Module[\"reallocBuffer\"]=(function(size){var ret;try{if(ArrayBuffer.transfer){ret=ArrayBuffer.transfer(buffer,size)}else{var oldHEAP8=HEAP8;ret=new ArrayBuffer(size);var temp=new Int8Array(ret);temp.set(oldHEAP8)}}catch(e){return false}var success=_emscripten_replace_memory(ret);if(!success)return false;return ret});function enlargeMemory(){var PAGE_MULTIPLE=Module[\"usingWasm\"]?WASM_PAGE_SIZE:ASMJS_PAGE_SIZE;var LIMIT=2147483648-PAGE_MULTIPLE;if(HEAP32[DYNAMICTOP_PTR>>2]>LIMIT){return false}var OLD_TOTAL_MEMORY=TOTAL_MEMORY;TOTAL_MEMORY=Math.max(TOTAL_MEMORY,MIN_TOTAL_MEMORY);while(TOTAL_MEMORY<HEAP32[DYNAMICTOP_PTR>>2]){if(TOTAL_MEMORY<=536870912){TOTAL_MEMORY=alignUp(2*TOTAL_MEMORY,PAGE_MULTIPLE)}else{TOTAL_MEMORY=Math.min(alignUp((3*TOTAL_MEMORY+2147483648)/4,PAGE_MULTIPLE),LIMIT)}}var replacement=Module[\"reallocBuffer\"](TOTAL_MEMORY);if(!replacement||replacement.byteLength!=TOTAL_MEMORY){TOTAL_MEMORY=OLD_TOTAL_MEMORY;return false}updateGlobalBuffer(replacement);updateGlobalBufferViews();return true}var byteLength;try{byteLength=Function.prototype.call.bind(Object.getOwnPropertyDescriptor(ArrayBuffer.prototype,\"byteLength\").get);byteLength(new ArrayBuffer(4))}catch(e){byteLength=(function(buffer){return buffer.byteLength})}var TOTAL_STACK=Module[\"TOTAL_STACK\"]||5242880;var TOTAL_MEMORY=Module[\"TOTAL_MEMORY\"]||16777216;if(TOTAL_MEMORY<TOTAL_STACK)Module.printErr(\"TOTAL_MEMORY should be larger than TOTAL_STACK, was \"+TOTAL_MEMORY+\"! (TOTAL_STACK=\"+TOTAL_STACK+\")\");if(Module[\"buffer\"]){buffer=Module[\"buffer\"]}else{{buffer=new ArrayBuffer(TOTAL_MEMORY)}Module[\"buffer\"]=buffer}updateGlobalBufferViews();function getTotalMemory(){return TOTAL_MEMORY}HEAP32[0]=1668509029;HEAP16[1]=25459;if(HEAPU8[2]!==115||HEAPU8[3]!==99)throw\"Runtime error: expected the system to be little-endian!\";function callRuntimeCallbacks(callbacks){while(callbacks.length>0){var callback=callbacks.shift();if(typeof callback==\"function\"){callback();continue}var func=callback.func;if(typeof func===\"number\"){if(callback.arg===undefined){Module[\"dynCall_v\"](func)}else{Module[\"dynCall_vi\"](func,callback.arg)}}else{func(callback.arg===undefined?null:callback.arg)}}}var __ATPRERUN__=[];var __ATINIT__=[];var __ATMAIN__=[];var __ATEXIT__=[];var __ATPOSTRUN__=[];var runtimeInitialized=false;var runtimeExited=false;function preRun(){if(Module[\"preRun\"]){if(typeof Module[\"preRun\"]==\"function\")Module[\"preRun\"]=[Module[\"preRun\"]];while(Module[\"preRun\"].length){addOnPreRun(Module[\"preRun\"].shift())}}callRuntimeCallbacks(__ATPRERUN__)}function ensureInitRuntime(){if(runtimeInitialized)return;runtimeInitialized=true;callRuntimeCallbacks(__ATINIT__)}function preMain(){callRuntimeCallbacks(__ATMAIN__)}function exitRuntime(){callRuntimeCallbacks(__ATEXIT__);runtimeExited=true}function postRun(){if(Module[\"postRun\"]){if(typeof Module[\"postRun\"]==\"function\")Module[\"postRun\"]=[Module[\"postRun\"]];while(Module[\"postRun\"].length){addOnPostRun(Module[\"postRun\"].shift())}}callRuntimeCallbacks(__ATPOSTRUN__)}function addOnPreRun(cb){__ATPRERUN__.unshift(cb)}function addOnPreMain(cb){__ATMAIN__.unshift(cb)}function addOnPostRun(cb){__ATPOSTRUN__.unshift(cb)}function writeArrayToMemory(array,buffer){HEAP8.set(array,buffer)}function writeAsciiToMemory(str,buffer,dontAddNull){for(var i=0;i<str.length;++i){HEAP8[buffer++>>0]=str.charCodeAt(i)}if(!dontAddNull)HEAP8[buffer>>0]=0}var Math_abs=Math.abs;var Math_cos=Math.cos;var Math_sin=Math.sin;var Math_tan=Math.tan;var Math_acos=Math.acos;var Math_asin=Math.asin;var Math_atan=Math.atan;var Math_atan2=Math.atan2;var Math_exp=Math.exp;var Math_log=Math.log;var Math_sqrt=Math.sqrt;var Math_ceil=Math.ceil;var Math_floor=Math.floor;var Math_pow=Math.pow;var Math_imul=Math.imul;var Math_fround=Math.fround;var Math_round=Math.round;var Math_min=Math.min;var Math_max=Math.max;var Math_clz32=Math.clz32;var Math_trunc=Math.trunc;var runDependencies=0;var runDependencyWatcher=null;var dependenciesFulfilled=null;function addRunDependency(id){runDependencies++;if(Module[\"monitorRunDependencies\"]){Module[\"monitorRunDependencies\"](runDependencies)}}function removeRunDependency(id){runDependencies--;if(Module[\"monitorRunDependencies\"]){Module[\"monitorRunDependencies\"](runDependencies)}if(runDependencies==0){if(runDependencyWatcher!==null){clearInterval(runDependencyWatcher);runDependencyWatcher=null}if(dependenciesFulfilled){var callback=dependenciesFulfilled;dependenciesFulfilled=null;callback()}}}Module[\"preloadedImages\"]={};Module[\"preloadedAudios\"]={};var memoryInitializer=null;var dataURIPrefix=\"data:application/octet-stream;base64,\";function isDataURI(filename){return String.prototype.startsWith?filename.startsWith(dataURIPrefix):filename.indexOf(dataURIPrefix)===0}STATIC_BASE=GLOBAL_BASE;STATICTOP=STATIC_BASE+18640;__ATINIT__.push();memoryInitializer=\"data:application/octet-stream;base64,vBoAACwbAADkGgAAehsAACAAAAAAAAAAvBoAAKEbAADkGgAAvhsAACAAAAAAAAAAvBoAAOcbAADkGgAAAxwAADgAAAAAAAAAvBoAACUcAADkGgAAShwAADgAAAAAAAAA5BoAAI4mAABQAAAAAAAAAOQaAAB6HAAAiAAAAAAAAADkGgAA0xwAAJgAAAAAAAAA5BoAACcdAACoAAAAAAAAAOQaAABbHQAAuAAAAAAAAAC8GgAAhh0AAOQaAACqHQAA0AAAAAAAAAC8GgAASB4AAOQaAADmHgAA6AAAAAAAAADkGgAAfh8AAIgAAAAAAAAA5BoAAAcgAADoAAAAAAAAAOQaAAChIAAA6AAAAAAAAADkGgAARyEAAOgAAAAAAAAA5BoAAN0hAAA4AQAAAAAAALwaAACIIgAA5BoAADMjAABQAQAAAAAAAOQaAADYIwAAiAAAAAAAAADkGgAAbiQAAFABAAAAAAAA5BoAABUlAABQAQAAAAAAAOQaAADIJQAAUAEAAAAAAADkGgAAqDEAAGgAAAAAAAAA5BoAALomAACwAQAAAAAAAOQaAAArJwAAmAAAAAAAAADkGgAAlycAANABAAAAAAAAvBoAAE0oAADkGgAAAykAAOgBAAAAAAAA5BoAALMpAACwAQAAAAAAAOQaAABUKgAA6AEAAAAAAADkGgAABisAAOgBAAAAAAAA5BoAAMQrAADoAQAAAAAAAOQaAAByLAAAOAIAAAAAAAC8GgAANS0AAOQaAAD4LQAAUAIAAAAAAADkGgAAtS4AALABAAAAAAAA5BoAAGMvAABQAgAAAAAAAOQaAAAiMAAAUAIAAAAAAADkGgAA7TAAAFACAAAAAAAA5BoAANMxAABoAAAAAAAAAOQaAABJMgAACAAAAAAAAAC8GgAAFjIAAOQaAABcMgAAsAIAAAAAAADkGgAAbDMAAHgDAAAAAAAA5BoAAOE3AABgAwAAAAAAALwaAAAsNAAA5BoAAJM0AADoAgAAAAAAAOQaAAAANQAAEAMAAAAAAAC8GgAAizUAALwaAAClNQAA5BoAAP81AAAYAwAAAAAAAOQaAABfNgAAEAMAAAAAAADkGgAA3TYAABgDAAAAAAAA5BoAAEY3AAAQAwAAAAAAALwaAAAtOAAA5BoAAFs4AABgAwAAAAAAAOQaAADMOAAAqAMAAAAAAADkGgAAEjkAAHgDAAAAAAAA5BoAAPg4AAAQAwAAAAAAALwaAAAyOQAA5BoAAAc6AACoAwAAAAAAAOQaAAApOgAAqAMAAAAAAADkGgAATzoAAOADAAAAAAAAvBoAAKE6AAC8GgAA0EQAAOQaAAAwRQAAAAQAAAAAAADkGgAA3UQAABAEAAAAAAAAvBoAAP5EAADkGgAAC0UAAPADAAAAAAAA5BoAABJGAADoAwAAAAAAAOQaAAAiRgAAKAQAAAAAAADkGgAAV0YAAAAEAAAAAAAA5BoAADNGAABIBAAAAAAAAAAAAAAIAAAAAQAAAAIAAAAAAAAAEAAAAAMAAAAEAAAAAQAAAAEAAAABAAAAAAAAACgAAAAFAAAABgAAAAIAAAACAAAAAgAAAP//////////AAAAADgAAAAHAAAACAAAAAEAAAADAAAAAQAAAAQAAAAFAAAAAgAAAAYAAAAHAAAAAwAAAAEAAAAIAAAAAAAAAEAAAAAJAAAACgAAAAEAAAADAAAABAAAAAQAAAAFAAAAAgAAAAYAAAAHAAAABQAAAAkAAAAKAAAAAAAAAFAAAAALAAAADAAAAAMAAAALAAAADAAAAAQAAAANAAAABgAAAAcAAAAOAAAADwAAAAUAAAAAAAAAWAAAAA0AAAAOAAAABgAAABAAAAAIAAAAEQAAABIAAAAHAAAAEwAAABQAAAAJAAAAFQAAABYAAAAKAAAAAQAAAAAAAABoAAAADwAAABAAAAAIAAAACwAAABcAAAAEAAAADQAAAAYAAAALAAAADgAAAA8AAAAJAAAAAgAAAAoAAAD/////AAAAAIgAAAARAAAAEgAAAAEAAAAMAAAAAQAAAA0AAAAYAAAAGQAAAA4AAAAPAAAAGgAAAAEAAAAAAAAAeAAAABEAAAATAAAAEAAAAAwAAAARAAAADQAAABgAAAAZAAAADgAAAA8AAAAaAAAAAQAAAAAAAAAYAQAAEQAAABQAAAASAAAADAAAABMAAAANAAAAGAAAABkAAAAOAAAADwAAABoAAAACAAAAAAAAAPgAAAAVAAAAFgAAABQAAAAMAAAAFQAAABYAAAAbAAAAHAAAAA4AAAAPAAAAHQAAAAMAAAAAAAAA2AAAABcAAAAYAAAAFwAAAAwAAAAYAAAAGQAAAB4AAAAfAAAADgAAAA8AAAAgAAAABAAAAAAAAADAAAAAGQAAABoAAAAhAAAAGgAAAAMAAAAAAAAA6AAAABEAAAAbAAAAAQAAAAwAAAABAAAADQAAABgAAAAZAAAADgAAAA8AAAAaAAAAAQAAAAAAAAAIAQAAHAAAAB0AAAAbAAAADAAAABwAAAANAAAAGAAAABkAAAAOAAAADwAAACIAAAAFAAAAAAAAAIABAAARAAAAHgAAAB0AAAAMAAAAHgAAAA0AAAAYAAAAGQAAAA4AAAAPAAAAGgAAAAYAAAAAAAAAYAEAAB8AAAAgAAAAHwAAAAwAAAAgAAAAIQAAACMAAAAkAAAADgAAAA8AAAAlAAAABwAAAAAAAABAAQAAIQAAACIAAAAiAAAADAAAACMAAAAkAAAAJgAAACcAAAAOAAAADwAAACgAAAAIAAAAAAAAACgBAAAjAAAAJAAAACkAAAAlAAAABAAAAAAAAABQAQAAEQAAACUAAAABAAAADAAAAAEAAAANAAAAGAAAABkAAAAOAAAADwAAABoAAAABAAAAAAAAAHABAAAmAAAAJwAAACYAAAAMAAAAJwAAAA0AAAAYAAAAGQAAAA4AAAAPAAAAKgAAAAkAAAAAAAAAkAEAACgAAAApAAAACwAAAAsAAAAXAAAABAAAACsAAAAoAAAAKQAAAA4AAAAPAAAACQAAAAUAAAAMAAAAAAAAAKABAAAqAAAAKwAAACoAAAArAAAALAAAAC0AAAAsAAAALQAAAC4AAAAvAAAALgAAAAoAAAAAAAAAGAIAACoAAAAsAAAAMAAAACsAAAAxAAAALQAAACwAAAAtAAAALgAAAC8AAAAuAAAACwAAAAAAAAAIAgAALQAAAC4AAAAyAAAAKwAAADMAAAAtAAAALAAAAC0AAAAuAAAALwAAAC8AAAAMAAAAAAAAAPgBAAAvAAAAMAAAADQAAAArAAAANQAAADYAAAAwAAAAMQAAAC4AAAAvAAAAMgAAAA0AAAAAAAAA2AEAADEAAAAyAAAANwAAACsAAAA4AAAAOQAAADMAAAA0AAAALgAAAC8AAAA1AAAADgAAAAAAAADAAQAAMwAAADQAAAA2AAAAOgAAAAYAAAAAAAAAgAIAACoAAAA1AAAAOwAAACsAAAA8AAAALQAAACwAAAAtAAAALgAAAC8AAAAuAAAADwAAAAAAAABwAgAANgAAADcAAAA9AAAAKwAAAD4AAAAtAAAALAAAAC0AAAAuAAAALwAAADcAAAAQAAAAAAAAAGACAAA4AAAAOQAAAD8AAAArAAAAQAAAAEEAAAA4AAAAOQAAAC4AAAAvAAAAOgAAABEAAAAAAAAAQAIAADoAAAA7AAAAQgAAACsAAABDAAAARAAAADsAAAA8AAAALgAAAC8AAAA9AAAAEgAAAAAAAAAoAgAAPAAAAD0AAAA+AAAARQAAAAcAAAAAAAAAkAIAAD4AAAA/AAAADQAAAAsAAAAXAAAABAAAAD8AAABGAAAARwAAAA4AAAAPAAAACQAAAAIAAAAOAAAAAAAAAKACAAABAAAAQAAAAAEAAAACAAAAAAAAALACAABBAAAAQgAAAAAAAAC4AgAAQQAAAEMAAAAAAAAAyAIAAEQAAABFAAAASAAAAEkAAABKAAAASwAAAAMAAABMAAAATQAAAEAAAABBAAAATgAAAEYAAABPAAAAQgAAAEMAAAAEAAAARwAAAAAAAADYAgAASAAAAEkAAABEAAAARQAAAEYAAABHAAAASAAAAAUAAABQAAAASQAAAFEAAAABAAAAAwAAAAAAAAADAAAAAAAAAAMAAAAAAAAAAwAAAAAAAAAAAwAASgAAAEsAAABKAAAAUgAAAAAAAADwAgAATAAAAE0AAAAIAAAAAAAAAOgCAABOAAAATwAAAAgAAAD/////AAAAADADAABQAAAAUQAAAEsAAABTAAAAAAAAACADAABSAAAAUwAAAAkAAAAAAAAAGAMAAFQAAABVAAAACQAAAAAAAABQAwAAVgAAAFcAAABMAAAAVAAAAAAAAABAAwAAWAAAAFkAAAAJAAAAAAAAAGgDAABaAAAAWwAAAE0AAABOAAAATwAAAFAAAABRAAAABgAAAFUAAABSAAAAVgAAAAAAAAABAAAABQAAAAIAAAAFAAAAAwAAAAUAAAAEAAAAAAAAAHgDAABcAAAAXQAAAEgAAAABAAAAVwAAAEsAAAADAAAATAAAAE0AAAABAAAAUwAAAE4AAAABAAAAWAAAAFQAAABVAAAAAQAAAAEAAAAAAAAAiAMAAFwAAABeAAAASAAAAFkAAABXAAAASwAAAAMAAABMAAAATQAAAFYAAABTAAAATgAAAF8AAABYAAAAVAAAAFUAAAAHAAAAYAAAAAAAAACYAwAAYQAAAGIAAABXAAAAWgAAAAAAAACoAwAAXAAAAGMAAABbAAAAAQAAAFcAAABLAAAACAAAAEwAAABNAAAAAQAAAFMAAABOAAAAAQAAAAAAAACwAwAAXAAAAGQAAABbAAAAXAAAAFcAAABLAAAACQAAAEwAAABNAAAAWAAAAFMAAABOAAAAZQAAAAAAAADAAwAAXAAAAGYAAABbAAAAXQAAAFcAAABLAAAACgAAAEwAAABNAAAAWQAAAFMAAABOAAAAZwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAFZVVVUCAAAAAAAAAAIAAACamZmZAwAAAFZVVVUDAAAAJUmSJAMAAAAAAAAAAwAAAMhxHMcEAAAAmpmZmQQAAABGF110BAAAAFZVVVUEAAAAPLETOwQAAAAlSZIkBAAAABIREREEAAAAAAAAAAQAAADi4eHhBQAAAMhxHMcFAAAAy2sorwUAAACamZmZBQAAAIdhGIYFAAAARhdddAUAAACRhSxkBQAAAFZVVVUFAAAAexSuRwUAAAA8sRM7BQAAANtLaC8FAAAAJUmSJAUAAAASlnsaBQAAABIREREFAAAAhRBCCAUAAAAAAAAABQAAAAgffPAGAAAA4uHh4QYAAADVQR3UBgAAAMhxHMcGAAAATZHPugYAAADLayivBgAAAKVBGqQGAAAAmpmZmQYAAAD6GJyPBgAAAIdhGIYGAAAAGPQFfQYAAABGF110BgAAAG3BFmwGAAAAkYUsZAYAAAC6gphcBgAAAFZVVVUGAAAAcwpeTgYAAAB7FK5HBgAAAEJBQUEGAAAAPLETOwYAAACzzyE1BgAAANtLaC8GAAAAnxLkKQYAAAAlSZIkBgAAAN1HcB8GAAAAEpZ7GgYAAAD45bEVBgAAABIREREGAAAA/BSXDAYAAACFEEIIBgAAAAVBEAQGAAAAAAAAAAYAAAD5gR/4BwAAAAgffPAHAAAAwBoT6QcAAADi4eHhBwAAAGwH5toHAAAA1UEd1AcAAACRaIXNBwAAAMhxHMcHAAAAOXDgwAcAAABNkc+6BwAAAE8b6LQHAAAAy2sorwcAAAAH9o6pBwAAAKVBGqQHAAAAUunIngcAAACamZmZBwAAAM4Pi5QHAAAA+hicjwcAAAD3kMuKBwAAAIdhGIYHAAAAgoGBgQcAAAAY9AV9BwAAABjIpHgHAAAARhdddAcAAADBBS5wBwAAAG3BFmwHAAAAaYEWaAcAAACRhSxkBwAAAAYWWGAHAAAAuoKYXAcAAAAJI+1YBwAAAFZVVVUHAAAAr37QUQcAAABzCl5OBwAAAAZq/UoHAAAAexSuRwcAAABXhm9EBwAAAEJBQUEHAAAAz8siPgcAAAA8sRM7BwAAADmBEzgHAAAAs88hNQcAAACjND4yBwAAANtLaC8HAAAA2bSfLAcAAACfEuQpBwAAAIkLNScHAAAAJUmSJAcAAAATePshBwAAAN1HcB8HAAAA22rwHAcAAAASlnsaBwAAABmBERgHAAAA+OWxFQcAAAAUgVwTBwAAABIREREHAAAAv1bPDgcAAAD8FJcMBwAAAKcQaAoHAAAAhRBCCAcAAAAw3SQGBwAAAAVBEAQHAAAAEQgEAgcAAAAAAAAABwAAACDwB/wIAAAA+YEf+AgAAADlWUb0CAAAAAgffPAIAAAAMXvA7AgAAADAGhPpCAAAAJGsc+UIAAAA4uHh4QgAAABAbl3eCAAAAGwH5toIAAAATGV71wgAAADVQR3UCAAAAPdYy9AIAAAAkWiFzQgAAABWMEvKCAAAAMhxHMcIAAAAHfD4wwgAAAA5cODACAAAAJq40r0IAAAATZHPuggAAADew9a3CAAAAE8b6LQIAAAAB2QDsggAAADLayivCAAAAK0BV6wIAAAAB/aOqQgAAABuGtCmCAAAAKVBGqQIAAAAmD9toQgAAABS6cieCAAAAO8ULZwIAAAAmpmZmQgAAACBTw6XCAAAAM4Pi5QIAAAAnrQPkggAAAD6GJyPCAAAANQYMI0IAAAA95DLiggAAAALX26ICAAAAIdhGIYIAAAArHfJgwgAAACCgYGBCAAAANFfQH8IAAAAGPQFfQgAAACPINJ6CAAAABjIpHgIAAAARM59dggAAABGF110CAAAAPWHQnIIAAAAwQUucAgAAAC1dh9uCAAAAG3BFmwIAAAAFs0TaggAAABpgRZoCAAAAKbGHmYIAAAAkYUsZAgAAABxpz9iCAAAAAYWWGAIAAAAjrt1XggAAAC6gphcCAAAALFWwFoIAAAACSPtWAgAAADG0x5XCAAAAFZVVVUIAAAAkJSQUwgAAACvftBRCAAAAFEBFVAIAAAAcwpeTggAAABziKtMCAAAAAZq/UoIAAAAPJ5TSQgAAAB7FK5HCAAAAIC8DEYIAAAAV4ZvRAgAAABeYtZCCAAAAEJBQUEIAAAA/BOwPwgAAADPyyI+CAAAAEhamTwIAAAAPLETOwgAAADCwpE5CAAAADmBEzgIAAAAPt+YNggAAACzzyE1CAAAALZFrjMIAAAAozQ+MggAAAAUkNEwCAAAANtLaC8IAAAABVwCLggAAADZtJ8sCAAAANFKQCsIAAAAnxLkKQgAAAApAYsoCAAAAIkLNScIAAAACSfiJQgAAAAlSZIkCAAAAIpnRSMIAAAAE3j7IQgAAADHcLQgCAAAAN1HcB8IAAAAtPMuHggAAADbavAcCAAAAAWktBsIAAAAEpZ7GggAAAAJOEUZCAAAABmBERgIAAAAlWjgFggAAAD45bEVCAAAAOHwhRQIAAAAFIFcEwgAAAB2jjUSCAAAABIREREIAAAAEAHvDwgAAAC/Vs8OCAAAAIkKsg0IAAAA/BSXDAgAAADDbn4LCAAAAKcQaAoIAAAAkfNTCQgAAACFEEIICAAAAKVgMgcIAAAAMN0kBggAAAB+fxkFCAAAAAVBEAQIAAAAUhsJAwgAAAARCAQCCAAAAAIBAQEIAAAA/////wAAAADQAwAAaAAAAGkAAAAKAAAACwAAAF4AAABqAAAACwAAAP////8AAAAA4AMAAGsAAABsAAAADAAAAAwAAABeAAAAagAAAA0AAAD/////HBcAAAUAAAAAAAAAAAAAAF8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8AAAAQAAAAyEgAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAP//////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJxIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoAAABkAAAA6AMAABAnAACghgEAQEIPAICWmAAA4fUFX3CJAP8JLw8AAAAAAgAAAAMAAAAFAAAABwAAAAsAAAANAAAAEQAAABMAAAAXAAAAHQAAAB8AAAAlAAAAKQAAACsAAAAvAAAANQAAADsAAAA9AAAAQwAAAEcAAABJAAAATwAAAFMAAABZAAAAYQAAAGUAAABnAAAAawAAAG0AAABxAAAAfwAAAIMAAACJAAAAiwAAAJUAAACXAAAAnQAAAKMAAACnAAAArQAAALMAAAC1AAAAvwAAAMEAAADFAAAAxwAAANMAAAABAAAACwAAAA0AAAARAAAAEwAAABcAAAAdAAAAHwAAACUAAAApAAAAKwAAAC8AAAA1AAAAOwAAAD0AAABDAAAARwAAAEkAAABPAAAAUwAAAFkAAABhAAAAZQAAAGcAAABrAAAAbQAAAHEAAAB5AAAAfwAAAIMAAACJAAAAiwAAAI8AAACVAAAAlwAAAJ0AAACjAAAApwAAAKkAAACtAAAAswAAALUAAAC7AAAAvwAAAMEAAADFAAAAxwAAANEAAAACAAAAAAAAAPADAABtAAAAbgAAAG8AAABwAAAAEgAAAAEAAAABAAAAAwAAAAAAAAAYBAAAbQAAAHEAAABvAAAAcAAAABIAAAACAAAAAgAAAAQAAAAAAAAAKAQAAHIAAABzAAAAYAAAAAAAAAA4BAAAcgAAAHQAAABgAAAATjVkcmFjbzExRW5jb2RlckJhc2VJTlNfMThFbmNvZGVyT3B0aW9uc0Jhc2VJTlNfMTdHZW9tZXRyeUF0dHJpYnV0ZTRUeXBlRUVFRUUATjVkcmFjbzI4QXR0cmlidXRlT2N0YWhlZHJvblRyYW5zZm9ybUUATjVkcmFjbzE4QXR0cmlidXRlVHJhbnNmb3JtRQBONWRyYWNvMzBBdHRyaWJ1dGVRdWFudGl6YXRpb25UcmFuc2Zvcm1FAE41ZHJhY28xN0F0dHJpYnV0ZXNFbmNvZGVyRQBONWRyYWNvMjNLZFRyZWVBdHRyaWJ1dGVzRW5jb2RlckUATjVkcmFjbzI2U2VxdWVudGlhbEF0dHJpYnV0ZUVuY29kZXJFAE41ZHJhY28zN1NlcXVlbnRpYWxBdHRyaWJ1dGVFbmNvZGVyc0NvbnRyb2xsZXJFAE41ZHJhY28yOFByZWRpY3Rpb25TY2hlbWVEZWx0YUVuY29kZXJJaU5TXzM3UHJlZGljdGlvblNjaGVtZVdyYXBFbmNvZGluZ1RyYW5zZm9ybUlpaUVFRUUATjVkcmFjbzIzUHJlZGljdGlvblNjaGVtZUVuY29kZXJJaU5TXzM3UHJlZGljdGlvblNjaGVtZVdyYXBFbmNvZGluZ1RyYW5zZm9ybUlpaUVFRUUATjVkcmFjbzM3UHJlZGljdGlvblNjaGVtZVR5cGVkRW5jb2RlckludGVyZmFjZUlpaUVFAE41ZHJhY28zMlByZWRpY3Rpb25TY2hlbWVFbmNvZGVySW50ZXJmYWNlRQBONWRyYWNvMjVQcmVkaWN0aW9uU2NoZW1lSW50ZXJmYWNlRQBONWRyYWNvNDhNZXNoUHJlZGljdGlvblNjaGVtZUdlb21ldHJpY05vcm1hbFByZWRpY3RvckFyZWFJaU5TXzM3UHJlZGljdGlvblNjaGVtZVdyYXBFbmNvZGluZ1RyYW5zZm9ybUlpaUVFTlNfMjRNZXNoUHJlZGljdGlvblNjaGVtZURhdGFJTlNfMTFDb3JuZXJUYWJsZUVFRUVFAE41ZHJhY280OE1lc2hQcmVkaWN0aW9uU2NoZW1lR2VvbWV0cmljTm9ybWFsUHJlZGljdG9yQmFzZUlpTlNfMzdQcmVkaWN0aW9uU2NoZW1lV3JhcEVuY29kaW5nVHJhbnNmb3JtSWlpRUVOU18yNE1lc2hQcmVkaWN0aW9uU2NoZW1lRGF0YUlOU18xMUNvcm5lclRhYmxlRUVFRUUATjVkcmFjbzQyTWVzaFByZWRpY3Rpb25TY2hlbWVHZW9tZXRyaWNOb3JtYWxFbmNvZGVySWlOU18zN1ByZWRpY3Rpb25TY2hlbWVXcmFwRW5jb2RpbmdUcmFuc2Zvcm1JaWlFRU5TXzI0TWVzaFByZWRpY3Rpb25TY2hlbWVEYXRhSU5TXzExQ29ybmVyVGFibGVFRUVFRQBONWRyYWNvMjdNZXNoUHJlZGljdGlvblNjaGVtZUVuY29kZXJJaU5TXzM3UHJlZGljdGlvblNjaGVtZVdyYXBFbmNvZGluZ1RyYW5zZm9ybUlpaUVFTlNfMjRNZXNoUHJlZGljdGlvblNjaGVtZURhdGFJTlNfMTFDb3JuZXJUYWJsZUVFRUVFAE41ZHJhY280NE1lc2hQcmVkaWN0aW9uU2NoZW1lVGV4Q29vcmRzUG9ydGFibGVFbmNvZGVySWlOU18zN1ByZWRpY3Rpb25TY2hlbWVXcmFwRW5jb2RpbmdUcmFuc2Zvcm1JaWlFRU5TXzI0TWVzaFByZWRpY3Rpb25TY2hlbWVEYXRhSU5TXzExQ29ybmVyVGFibGVFRUVFRQBONWRyYWNvNTZNZXNoUHJlZGljdGlvblNjaGVtZUNvbnN0cmFpbmVkTXVsdGlQYXJhbGxlbG9ncmFtRW5jb2RlcklpTlNfMzdQcmVkaWN0aW9uU2NoZW1lV3JhcEVuY29kaW5nVHJhbnNmb3JtSWlpRUVOU18yNE1lc2hQcmVkaWN0aW9uU2NoZW1lRGF0YUlOU18xMUNvcm5lclRhYmxlRUVFRUUATjVkcmFjbzQwTWVzaFByZWRpY3Rpb25TY2hlbWVQYXJhbGxlbG9ncmFtRW5jb2RlcklpTlNfMzdQcmVkaWN0aW9uU2NoZW1lV3JhcEVuY29kaW5nVHJhbnNmb3JtSWlpRUVOU18yNE1lc2hQcmVkaWN0aW9uU2NoZW1lRGF0YUlOU18xMUNvcm5lclRhYmxlRUVFRUUATjVkcmFjbzQ4TWVzaFByZWRpY3Rpb25TY2hlbWVHZW9tZXRyaWNOb3JtYWxQcmVkaWN0b3JBcmVhSWlOU18zN1ByZWRpY3Rpb25TY2hlbWVXcmFwRW5jb2RpbmdUcmFuc2Zvcm1JaWlFRU5TXzI0TWVzaFByZWRpY3Rpb25TY2hlbWVEYXRhSU5TXzI0TWVzaEF0dHJpYnV0ZUNvcm5lclRhYmxlRUVFRUUATjVkcmFjbzQ4TWVzaFByZWRpY3Rpb25TY2hlbWVHZW9tZXRyaWNOb3JtYWxQcmVkaWN0b3JCYXNlSWlOU18zN1ByZWRpY3Rpb25TY2hlbWVXcmFwRW5jb2RpbmdUcmFuc2Zvcm1JaWlFRU5TXzI0TWVzaFByZWRpY3Rpb25TY2hlbWVEYXRhSU5TXzI0TWVzaEF0dHJpYnV0ZUNvcm5lclRhYmxlRUVFRUUATjVkcmFjbzQyTWVzaFByZWRpY3Rpb25TY2hlbWVHZW9tZXRyaWNOb3JtYWxFbmNvZGVySWlOU18zN1ByZWRpY3Rpb25TY2hlbWVXcmFwRW5jb2RpbmdUcmFuc2Zvcm1JaWlFRU5TXzI0TWVzaFByZWRpY3Rpb25TY2hlbWVEYXRhSU5TXzI0TWVzaEF0dHJpYnV0ZUNvcm5lclRhYmxlRUVFRUUATjVkcmFjbzI3TWVzaFByZWRpY3Rpb25TY2hlbWVFbmNvZGVySWlOU18zN1ByZWRpY3Rpb25TY2hlbWVXcmFwRW5jb2RpbmdUcmFuc2Zvcm1JaWlFRU5TXzI0TWVzaFByZWRpY3Rpb25TY2hlbWVEYXRhSU5TXzI0TWVzaEF0dHJpYnV0ZUNvcm5lclRhYmxlRUVFRUUATjVkcmFjbzQ0TWVzaFByZWRpY3Rpb25TY2hlbWVUZXhDb29yZHNQb3J0YWJsZUVuY29kZXJJaU5TXzM3UHJlZGljdGlvblNjaGVtZVdyYXBFbmNvZGluZ1RyYW5zZm9ybUlpaUVFTlNfMjRNZXNoUHJlZGljdGlvblNjaGVtZURhdGFJTlNfMjRNZXNoQXR0cmlidXRlQ29ybmVyVGFibGVFRUVFRQBONWRyYWNvNTZNZXNoUHJlZGljdGlvblNjaGVtZUNvbnN0cmFpbmVkTXVsdGlQYXJhbGxlbG9ncmFtRW5jb2RlcklpTlNfMzdQcmVkaWN0aW9uU2NoZW1lV3JhcEVuY29kaW5nVHJhbnNmb3JtSWlpRUVOU18yNE1lc2hQcmVkaWN0aW9uU2NoZW1lRGF0YUlOU18yNE1lc2hBdHRyaWJ1dGVDb3JuZXJUYWJsZUVFRUVFAE41ZHJhY280ME1lc2hQcmVkaWN0aW9uU2NoZW1lUGFyYWxsZWxvZ3JhbUVuY29kZXJJaU5TXzM3UHJlZGljdGlvblNjaGVtZVdyYXBFbmNvZGluZ1RyYW5zZm9ybUlpaUVFTlNfMjRNZXNoUHJlZGljdGlvblNjaGVtZURhdGFJTlNfMjRNZXNoQXR0cmlidXRlQ29ybmVyVGFibGVFRUVFRQB1c2VfYnVpbHRfaW5fYXR0cmlidXRlX2NvbXByZXNzaW9uAE41ZHJhY28zM1NlcXVlbnRpYWxJbnRlZ2VyQXR0cmlidXRlRW5jb2RlckUATjVkcmFjbzI4UHJlZGljdGlvblNjaGVtZURlbHRhRW5jb2RlcklpTlNfNjJQcmVkaWN0aW9uU2NoZW1lTm9ybWFsT2N0YWhlZHJvbkNhbm9uaWNhbGl6ZWRFbmNvZGluZ1RyYW5zZm9ybUlpRUVFRQBONWRyYWNvMjNQcmVkaWN0aW9uU2NoZW1lRW5jb2RlcklpTlNfNjJQcmVkaWN0aW9uU2NoZW1lTm9ybWFsT2N0YWhlZHJvbkNhbm9uaWNhbGl6ZWRFbmNvZGluZ1RyYW5zZm9ybUlpRUVFRQBONWRyYWNvNDhNZXNoUHJlZGljdGlvblNjaGVtZUdlb21ldHJpY05vcm1hbFByZWRpY3RvckFyZWFJaU5TXzYyUHJlZGljdGlvblNjaGVtZU5vcm1hbE9jdGFoZWRyb25DYW5vbmljYWxpemVkRW5jb2RpbmdUcmFuc2Zvcm1JaUVFTlNfMjRNZXNoUHJlZGljdGlvblNjaGVtZURhdGFJTlNfMTFDb3JuZXJUYWJsZUVFRUVFAE41ZHJhY280OE1lc2hQcmVkaWN0aW9uU2NoZW1lR2VvbWV0cmljTm9ybWFsUHJlZGljdG9yQmFzZUlpTlNfNjJQcmVkaWN0aW9uU2NoZW1lTm9ybWFsT2N0YWhlZHJvbkNhbm9uaWNhbGl6ZWRFbmNvZGluZ1RyYW5zZm9ybUlpRUVOU18yNE1lc2hQcmVkaWN0aW9uU2NoZW1lRGF0YUlOU18xMUNvcm5lclRhYmxlRUVFRUUATjVkcmFjbzQyTWVzaFByZWRpY3Rpb25TY2hlbWVHZW9tZXRyaWNOb3JtYWxFbmNvZGVySWlOU182MlByZWRpY3Rpb25TY2hlbWVOb3JtYWxPY3RhaGVkcm9uQ2Fub25pY2FsaXplZEVuY29kaW5nVHJhbnNmb3JtSWlFRU5TXzI0TWVzaFByZWRpY3Rpb25TY2hlbWVEYXRhSU5TXzExQ29ybmVyVGFibGVFRUVFRQBONWRyYWNvMjdNZXNoUHJlZGljdGlvblNjaGVtZUVuY29kZXJJaU5TXzYyUHJlZGljdGlvblNjaGVtZU5vcm1hbE9jdGFoZWRyb25DYW5vbmljYWxpemVkRW5jb2RpbmdUcmFuc2Zvcm1JaUVFTlNfMjRNZXNoUHJlZGljdGlvblNjaGVtZURhdGFJTlNfMTFDb3JuZXJUYWJsZUVFRUVFAE41ZHJhY280NE1lc2hQcmVkaWN0aW9uU2NoZW1lVGV4Q29vcmRzUG9ydGFibGVFbmNvZGVySWlOU182MlByZWRpY3Rpb25TY2hlbWVOb3JtYWxPY3RhaGVkcm9uQ2Fub25pY2FsaXplZEVuY29kaW5nVHJhbnNmb3JtSWlFRU5TXzI0TWVzaFByZWRpY3Rpb25TY2hlbWVEYXRhSU5TXzExQ29ybmVyVGFibGVFRUVFRQBONWRyYWNvNTZNZXNoUHJlZGljdGlvblNjaGVtZUNvbnN0cmFpbmVkTXVsdGlQYXJhbGxlbG9ncmFtRW5jb2RlcklpTlNfNjJQcmVkaWN0aW9uU2NoZW1lTm9ybWFsT2N0YWhlZHJvbkNhbm9uaWNhbGl6ZWRFbmNvZGluZ1RyYW5zZm9ybUlpRUVOU18yNE1lc2hQcmVkaWN0aW9uU2NoZW1lRGF0YUlOU18xMUNvcm5lclRhYmxlRUVFRUUATjVkcmFjbzQwTWVzaFByZWRpY3Rpb25TY2hlbWVQYXJhbGxlbG9ncmFtRW5jb2RlcklpTlNfNjJQcmVkaWN0aW9uU2NoZW1lTm9ybWFsT2N0YWhlZHJvbkNhbm9uaWNhbGl6ZWRFbmNvZGluZ1RyYW5zZm9ybUlpRUVOU18yNE1lc2hQcmVkaWN0aW9uU2NoZW1lRGF0YUlOU18xMUNvcm5lclRhYmxlRUVFRUUATjVkcmFjbzQ4TWVzaFByZWRpY3Rpb25TY2hlbWVHZW9tZXRyaWNOb3JtYWxQcmVkaWN0b3JBcmVhSWlOU182MlByZWRpY3Rpb25TY2hlbWVOb3JtYWxPY3RhaGVkcm9uQ2Fub25pY2FsaXplZEVuY29kaW5nVHJhbnNmb3JtSWlFRU5TXzI0TWVzaFByZWRpY3Rpb25TY2hlbWVEYXRhSU5TXzI0TWVzaEF0dHJpYnV0ZUNvcm5lclRhYmxlRUVFRUUATjVkcmFjbzQ4TWVzaFByZWRpY3Rpb25TY2hlbWVHZW9tZXRyaWNOb3JtYWxQcmVkaWN0b3JCYXNlSWlOU182MlByZWRpY3Rpb25TY2hlbWVOb3JtYWxPY3RhaGVkcm9uQ2Fub25pY2FsaXplZEVuY29kaW5nVHJhbnNmb3JtSWlFRU5TXzI0TWVzaFByZWRpY3Rpb25TY2hlbWVEYXRhSU5TXzI0TWVzaEF0dHJpYnV0ZUNvcm5lclRhYmxlRUVFRUUATjVkcmFjbzQyTWVzaFByZWRpY3Rpb25TY2hlbWVHZW9tZXRyaWNOb3JtYWxFbmNvZGVySWlOU182MlByZWRpY3Rpb25TY2hlbWVOb3JtYWxPY3RhaGVkcm9uQ2Fub25pY2FsaXplZEVuY29kaW5nVHJhbnNmb3JtSWlFRU5TXzI0TWVzaFByZWRpY3Rpb25TY2hlbWVEYXRhSU5TXzI0TWVzaEF0dHJpYnV0ZUNvcm5lclRhYmxlRUVFRUUATjVkcmFjbzI3TWVzaFByZWRpY3Rpb25TY2hlbWVFbmNvZGVySWlOU182MlByZWRpY3Rpb25TY2hlbWVOb3JtYWxPY3RhaGVkcm9uQ2Fub25pY2FsaXplZEVuY29kaW5nVHJhbnNmb3JtSWlFRU5TXzI0TWVzaFByZWRpY3Rpb25TY2hlbWVEYXRhSU5TXzI0TWVzaEF0dHJpYnV0ZUNvcm5lclRhYmxlRUVFRUUATjVkcmFjbzQ0TWVzaFByZWRpY3Rpb25TY2hlbWVUZXhDb29yZHNQb3J0YWJsZUVuY29kZXJJaU5TXzYyUHJlZGljdGlvblNjaGVtZU5vcm1hbE9jdGFoZWRyb25DYW5vbmljYWxpemVkRW5jb2RpbmdUcmFuc2Zvcm1JaUVFTlNfMjRNZXNoUHJlZGljdGlvblNjaGVtZURhdGFJTlNfMjRNZXNoQXR0cmlidXRlQ29ybmVyVGFibGVFRUVFRQBONWRyYWNvNTZNZXNoUHJlZGljdGlvblNjaGVtZUNvbnN0cmFpbmVkTXVsdGlQYXJhbGxlbG9ncmFtRW5jb2RlcklpTlNfNjJQcmVkaWN0aW9uU2NoZW1lTm9ybWFsT2N0YWhlZHJvbkNhbm9uaWNhbGl6ZWRFbmNvZGluZ1RyYW5zZm9ybUlpRUVOU18yNE1lc2hQcmVkaWN0aW9uU2NoZW1lRGF0YUlOU18yNE1lc2hBdHRyaWJ1dGVDb3JuZXJUYWJsZUVFRUVFAE41ZHJhY280ME1lc2hQcmVkaWN0aW9uU2NoZW1lUGFyYWxsZWxvZ3JhbUVuY29kZXJJaU5TXzYyUHJlZGljdGlvblNjaGVtZU5vcm1hbE9jdGFoZWRyb25DYW5vbmljYWxpemVkRW5jb2RpbmdUcmFuc2Zvcm1JaUVFTlNfMjRNZXNoUHJlZGljdGlvblNjaGVtZURhdGFJTlNfMjRNZXNoQXR0cmlidXRlQ29ybmVyVGFibGVFRUVFRQBONWRyYWNvMzJTZXF1ZW50aWFsTm9ybWFsQXR0cmlidXRlRW5jb2RlckUATjVkcmFjbzM4U2VxdWVudGlhbFF1YW50aXphdGlvbkF0dHJpYnV0ZUVuY29kZXJFAHByZWRpY3Rpb25fc2NoZW1lAE41ZHJhY28xMUVuY29kZXJCYXNlSU5TXzE4RW5jb2Rlck9wdGlvbnNCYXNlSWlFRUVFAE41ZHJhY283RW5jb2RlckUAIABONWRyYWNvMTNFeHBlcnRFbmNvZGVyRQBlbmNvZGluZ19tZXRob2QAcXVhbnRpemF0aW9uX2JpdHMASW52YWxpZCBlbmNvZGluZyBtZXRob2QuAGVuY29kaW5nX3NwZWVkAGRlY29kaW5nX3NwZWVkAHF1YW50aXphdGlvbl9vcmlnaW4AcXVhbnRpemF0aW9uX3JhbmdlAHN5bWJvbF9lbmNvZGluZ19tZXRob2QAc3ltYm9sX2VuY29kaW5nX2NvbXByZXNzaW9uX2xldmVsAHN0YW5kYXJkX2VkZ2VicmVha2VyAHByZWRpY3RpdmVfZWRnZWJyZWFrZXIAZWRnZWJyZWFrZXJfbWV0aG9kAE41ZHJhY28yMk1lc2hFZGdlYnJlYWtlckVuY29kZXJFAEFsbCB0cmlhbmdsZXMgYXJlIGRlZ2VuZXJhdGUuAEZhaWxlZCB0byBwcm9jZXNzIG1lc2ggaG9sZXMuAEZhaWxlZCB0byBpbml0aWFsaXplIGF0dHJpYnV0ZSBkYXRhLgBGYWlsZWQgdG8gZW5jb2RlIG1lc2ggY29tcG9uZW50LgBGYWlsZWQgdG8gZW5jb2RlIHNwbGl0IGRhdGEuAE41ZHJhY28xM1RyYXZlcnNlckJhc2VJTlNfMjRNZXNoQXR0cmlidXRlQ29ybmVyVGFibGVFTlNfMzZNZXNoQXR0cmlidXRlSW5kaWNlc0VuY29kaW5nT2JzZXJ2ZXJJUzFfRUVFRQBONWRyYWNvMTlEZXB0aEZpcnN0VHJhdmVyc2VySU5TXzI0TWVzaEF0dHJpYnV0ZUNvcm5lclRhYmxlRU5TXzM2TWVzaEF0dHJpYnV0ZUluZGljZXNFbmNvZGluZ09ic2VydmVySVMxX0VFRUUATjVkcmFjbzIyTWVzaFRyYXZlcnNhbFNlcXVlbmNlcklOU18xOURlcHRoRmlyc3RUcmF2ZXJzZXJJTlNfMjRNZXNoQXR0cmlidXRlQ29ybmVyVGFibGVFTlNfMzZNZXNoQXR0cmlidXRlSW5kaWNlc0VuY29kaW5nT2JzZXJ2ZXJJUzJfRUVFRUVFAE41ZHJhY28xNVBvaW50c1NlcXVlbmNlckUATjVkcmFjbzEzVHJhdmVyc2VyQmFzZUlOU18xMUNvcm5lclRhYmxlRU5TXzM2TWVzaEF0dHJpYnV0ZUluZGljZXNFbmNvZGluZ09ic2VydmVySVMxX0VFRUUATjVkcmFjbzE5RGVwdGhGaXJzdFRyYXZlcnNlcklOU18xMUNvcm5lclRhYmxlRU5TXzM2TWVzaEF0dHJpYnV0ZUluZGljZXNFbmNvZGluZ09ic2VydmVySVMxX0VFRUUATjVkcmFjbzIyTWVzaFRyYXZlcnNhbFNlcXVlbmNlcklOU18xOURlcHRoRmlyc3RUcmF2ZXJzZXJJTlNfMTFDb3JuZXJUYWJsZUVOU18zNk1lc2hBdHRyaWJ1dGVJbmRpY2VzRW5jb2RpbmdPYnNlcnZlcklTMl9FRUVFRUUATjVkcmFjbzI4TWF4UHJlZGljdGlvbkRlZ3JlZVRyYXZlcnNlcklOU18xMUNvcm5lclRhYmxlRU5TXzM2TWVzaEF0dHJpYnV0ZUluZGljZXNFbmNvZGluZ09ic2VydmVySVMxX0VFRUUATjVkcmFjbzIyTWVzaFRyYXZlcnNhbFNlcXVlbmNlcklOU18yOE1heFByZWRpY3Rpb25EZWdyZWVUcmF2ZXJzZXJJTlNfMTFDb3JuZXJUYWJsZUVOU18zNk1lc2hBdHRyaWJ1dGVJbmRpY2VzRW5jb2RpbmdPYnNlcnZlcklTMl9FRUVFRUUAc3BsaXRfbWVzaF9vbl9zZWFtcwBONWRyYWNvMjZNZXNoRWRnZWJyZWFrZXJFbmNvZGVySW1wbElOU18zMU1lc2hFZGdlYnJlYWtlclRyYXZlcnNhbEVuY29kZXJFRUUATjVkcmFjbzM1TWVzaEVkZ2VicmVha2VyRW5jb2RlckltcGxJbnRlcmZhY2VFAE41ZHJhY28yNk1lc2hFZGdlYnJlYWtlckVuY29kZXJJbXBsSU5TXzM4TWVzaEVkZ2VicmVha2VyVHJhdmVyc2FsVmFsZW5jZUVuY29kZXJFRUUAc3RvcmVfbnVtYmVyX29mX2VuY29kZWRfZmFjZXMATjVkcmFjbzExTWVzaEVuY29kZXJFAGNvbXByZXNzX2Nvbm5lY3Rpdml0eQBONWRyYWNvMTVMaW5lYXJTZXF1ZW5jZXJFAE41ZHJhY28yMU1lc2hTZXF1ZW50aWFsRW5jb2RlckUATjVkcmFjbzE3UG9pbnRDbG91ZEVuY29kZXJFAEludmFsaWQgaW5wdXQgZ2VvbWV0cnkuAEZhaWxlZCB0byBpbml0aWFsaXplIGVuY29kZXIuAEZhaWxlZCB0byBlbmNvZGUgaW50ZXJuYWwgZGF0YS4ARmFpbGVkIHRvIGVuY29kZSBwb2ludCBhdHRyaWJ1dGVzLgBzdG9yZV9udW1iZXJfb2ZfZW5jb2RlZF9wb2ludHMARmFpbGVkIHRvIGVuY29kZSBtZXRhZGF0YS4ARFJBQ08ATjVkcmFjbzIzUG9pbnRDbG91ZEtkVHJlZUVuY29kZXJFAE41ZHJhY28yN1BvaW50Q2xvdWRTZXF1ZW50aWFsRW5jb2RlckUATjVkcmFjbzRNZXNoRQBhbGxvY2F0b3I8VD46OmFsbG9jYXRlKHNpemVfdCBuKSAnbicgZXhjZWVkcyBtYXhpbXVtIHN1cHBvcnRlZCBzaXplAE41ZHJhY28xMFBvaW50Q2xvdWRFABEACgAREREAAAAABQAAAAAAAAkAAAAACwAAAAAAAAAAEQAPChEREQMKBwABEwkLCwAACQYLAAALAAYRAAAAERERAAAAAAAAAAAAAAAAAAAAAAsAAAAAAAAAABEACgoREREACgAAAgAJCwAAAAkACwAACwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAAAAAAAAAAAAMAAAAAAwAAAAACQwAAAAAAAwAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAAAAAAAAAAAAAADQAAAAQNAAAAAAkOAAAAAAAOAAAOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAA8AAAAADwAAAAAJEAAAAAAAEAAAEAAAEgAAABISEgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASAAAAEhISAAAAAAAACQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACwAAAAAAAAAAAAAACgAAAAAKAAAAAAkLAAAAAAALAAALAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAAAAAAAAAwAAAAADAAAAAAJDAAAAAAADAAADAAALSsgICAwWDB4AChudWxsKQAtMFgrMFggMFgtMHgrMHggMHgAaW5mAElORgBOQU4AMDEyMzQ1Njc4OUFCQ0RFRi4AVCEiGQ0BAgMRSxwMEAQLHRIeJ2hub3BxYiAFBg8TFBUaCBYHKCQXGAkKDhsfJSODgn0mKis8PT4/Q0dKTVhZWltcXV5fYGFjZGVmZ2lqa2xyc3R5ent8AElsbGVnYWwgYnl0ZSBzZXF1ZW5jZQBEb21haW4gZXJyb3IAUmVzdWx0IG5vdCByZXByZXNlbnRhYmxlAE5vdCBhIHR0eQBQZXJtaXNzaW9uIGRlbmllZABPcGVyYXRpb24gbm90IHBlcm1pdHRlZABObyBzdWNoIGZpbGUgb3IgZGlyZWN0b3J5AE5vIHN1Y2ggcHJvY2VzcwBGaWxlIGV4aXN0cwBWYWx1ZSB0b28gbGFyZ2UgZm9yIGRhdGEgdHlwZQBObyBzcGFjZSBsZWZ0IG9uIGRldmljZQBPdXQgb2YgbWVtb3J5AFJlc291cmNlIGJ1c3kASW50ZXJydXB0ZWQgc3lzdGVtIGNhbGwAUmVzb3VyY2UgdGVtcG9yYXJpbHkgdW5hdmFpbGFibGUASW52YWxpZCBzZWVrAENyb3NzLWRldmljZSBsaW5rAFJlYWQtb25seSBmaWxlIHN5c3RlbQBEaXJlY3Rvcnkgbm90IGVtcHR5AENvbm5lY3Rpb24gcmVzZXQgYnkgcGVlcgBPcGVyYXRpb24gdGltZWQgb3V0AENvbm5lY3Rpb24gcmVmdXNlZABIb3N0IGlzIGRvd24ASG9zdCBpcyB1bnJlYWNoYWJsZQBBZGRyZXNzIGluIHVzZQBCcm9rZW4gcGlwZQBJL08gZXJyb3IATm8gc3VjaCBkZXZpY2Ugb3IgYWRkcmVzcwBCbG9jayBkZXZpY2UgcmVxdWlyZWQATm8gc3VjaCBkZXZpY2UATm90IGEgZGlyZWN0b3J5AElzIGEgZGlyZWN0b3J5AFRleHQgZmlsZSBidXN5AEV4ZWMgZm9ybWF0IGVycm9yAEludmFsaWQgYXJndW1lbnQAQXJndW1lbnQgbGlzdCB0b28gbG9uZwBTeW1ib2xpYyBsaW5rIGxvb3AARmlsZW5hbWUgdG9vIGxvbmcAVG9vIG1hbnkgb3BlbiBmaWxlcyBpbiBzeXN0ZW0ATm8gZmlsZSBkZXNjcmlwdG9ycyBhdmFpbGFibGUAQmFkIGZpbGUgZGVzY3JpcHRvcgBObyBjaGlsZCBwcm9jZXNzAEJhZCBhZGRyZXNzAEZpbGUgdG9vIGxhcmdlAFRvbyBtYW55IGxpbmtzAE5vIGxvY2tzIGF2YWlsYWJsZQBSZXNvdXJjZSBkZWFkbG9jayB3b3VsZCBvY2N1cgBTdGF0ZSBub3QgcmVjb3ZlcmFibGUAUHJldmlvdXMgb3duZXIgZGllZABPcGVyYXRpb24gY2FuY2VsZWQARnVuY3Rpb24gbm90IGltcGxlbWVudGVkAE5vIG1lc3NhZ2Ugb2YgZGVzaXJlZCB0eXBlAElkZW50aWZpZXIgcmVtb3ZlZABEZXZpY2Ugbm90IGEgc3RyZWFtAE5vIGRhdGEgYXZhaWxhYmxlAERldmljZSB0aW1lb3V0AE91dCBvZiBzdHJlYW1zIHJlc291cmNlcwBMaW5rIGhhcyBiZWVuIHNldmVyZWQAUHJvdG9jb2wgZXJyb3IAQmFkIG1lc3NhZ2UARmlsZSBkZXNjcmlwdG9yIGluIGJhZCBzdGF0ZQBOb3QgYSBzb2NrZXQARGVzdGluYXRpb24gYWRkcmVzcyByZXF1aXJlZABNZXNzYWdlIHRvbyBsYXJnZQBQcm90b2NvbCB3cm9uZyB0eXBlIGZvciBzb2NrZXQAUHJvdG9jb2wgbm90IGF2YWlsYWJsZQBQcm90b2NvbCBub3Qgc3VwcG9ydGVkAFNvY2tldCB0eXBlIG5vdCBzdXBwb3J0ZWQATm90IHN1cHBvcnRlZABQcm90b2NvbCBmYW1pbHkgbm90IHN1cHBvcnRlZABBZGRyZXNzIGZhbWlseSBub3Qgc3VwcG9ydGVkIGJ5IHByb3RvY29sAEFkZHJlc3Mgbm90IGF2YWlsYWJsZQBOZXR3b3JrIGlzIGRvd24ATmV0d29yayB1bnJlYWNoYWJsZQBDb25uZWN0aW9uIHJlc2V0IGJ5IG5ldHdvcmsAQ29ubmVjdGlvbiBhYm9ydGVkAE5vIGJ1ZmZlciBzcGFjZSBhdmFpbGFibGUAU29ja2V0IGlzIGNvbm5lY3RlZABTb2NrZXQgbm90IGNvbm5lY3RlZABDYW5ub3Qgc2VuZCBhZnRlciBzb2NrZXQgc2h1dGRvd24AT3BlcmF0aW9uIGFscmVhZHkgaW4gcHJvZ3Jlc3MAT3BlcmF0aW9uIGluIHByb2dyZXNzAFN0YWxlIGZpbGUgaGFuZGxlAFJlbW90ZSBJL08gZXJyb3IAUXVvdGEgZXhjZWVkZWQATm8gbWVkaXVtIGZvdW5kAFdyb25nIG1lZGl1bSB0eXBlAE5vIGVycm9yIGluZm9ybWF0aW9uAABpbmZpbml0eQBuYW4AJWQAJWYAdGVybWluYXRpbmcgd2l0aCAlcyBleGNlcHRpb24gb2YgdHlwZSAlczogJXMAdGVybWluYXRpbmcgd2l0aCAlcyBleGNlcHRpb24gb2YgdHlwZSAlcwB0ZXJtaW5hdGluZyB3aXRoICVzIGZvcmVpZ24gZXhjZXB0aW9uAHRlcm1pbmF0aW5nAHVuY2F1Z2h0AFN0OWV4Y2VwdGlvbgBOMTBfX2N4eGFiaXYxMTZfX3NoaW1fdHlwZV9pbmZvRQBTdDl0eXBlX2luZm8ATjEwX19jeHhhYml2MTIwX19zaV9jbGFzc190eXBlX2luZm9FAE4xMF9fY3h4YWJpdjExN19fY2xhc3NfdHlwZV9pbmZvRQBwdGhyZWFkX29uY2UgZmFpbHVyZSBpbiBfX2N4YV9nZXRfZ2xvYmFsc19mYXN0KCkAY2Fubm90IGNyZWF0ZSBwdGhyZWFkIGtleSBmb3IgX19jeGFfZ2V0X2dsb2JhbHMoKQBjYW5ub3QgemVybyBvdXQgdGhyZWFkIHZhbHVlIGZvciBfX2N4YV9nZXRfZ2xvYmFscygpAHRlcm1pbmF0ZV9oYW5kbGVyIHVuZXhwZWN0ZWRseSByZXR1cm5lZABTdDExbG9naWNfZXJyb3IAU3QxMmxlbmd0aF9lcnJvcgBOMTBfX2N4eGFiaXYxMTlfX3BvaW50ZXJfdHlwZV9pbmZvRQBOMTBfX2N4eGFiaXYxMTdfX3BiYXNlX3R5cGVfaW5mb0U=\";var tempDoublePtr=STATICTOP;STATICTOP+=16;function ___cxa_allocate_exception(size){return _malloc(size)}function __ZSt18uncaught_exceptionv(){return!!__ZSt18uncaught_exceptionv.uncaught_exception}var EXCEPTIONS={last:0,caught:[],infos:{},deAdjust:(function(adjusted){if(!adjusted||EXCEPTIONS.infos[adjusted])return adjusted;for(var ptr in EXCEPTIONS.infos){var info=EXCEPTIONS.infos[ptr];if(info.adjusted===adjusted){return ptr}}return adjusted}),addRef:(function(ptr){if(!ptr)return;var info=EXCEPTIONS.infos[ptr];info.refcount++}),decRef:(function(ptr){if(!ptr)return;var info=EXCEPTIONS.infos[ptr];assert(info.refcount>0);info.refcount--;if(info.refcount===0&&!info.rethrown){if(info.destructor){Module[\"dynCall_vi\"](info.destructor,ptr)}delete EXCEPTIONS.infos[ptr];___cxa_free_exception(ptr)}}),clearRef:(function(ptr){if(!ptr)return;var info=EXCEPTIONS.infos[ptr];info.refcount=0})};function ___cxa_begin_catch(ptr){var info=EXCEPTIONS.infos[ptr];if(info&&!info.caught){info.caught=true;__ZSt18uncaught_exceptionv.uncaught_exception--}if(info)info.rethrown=false;EXCEPTIONS.caught.push(ptr);EXCEPTIONS.addRef(EXCEPTIONS.deAdjust(ptr));return ptr}function ___cxa_pure_virtual(){ABORT=true;throw\"Pure virtual function called!\"}function ___resumeException(ptr){if(!EXCEPTIONS.last){EXCEPTIONS.last=ptr}throw ptr+\" - Exception catching is disabled, this exception cannot be caught. Compile with -s DISABLE_EXCEPTION_CATCHING=0 or DISABLE_EXCEPTION_CATCHING=2 to catch.\"}function ___cxa_find_matching_catch(){var thrown=EXCEPTIONS.last;if(!thrown){return(setTempRet0(0),0)|0}var info=EXCEPTIONS.infos[thrown];var throwntype=info.type;if(!throwntype){return(setTempRet0(0),thrown)|0}var typeArray=Array.prototype.slice.call(arguments);var pointer=Module[\"___cxa_is_pointer_type\"](throwntype);if(!___cxa_find_matching_catch.buffer)___cxa_find_matching_catch.buffer=_malloc(4);HEAP32[___cxa_find_matching_catch.buffer>>2]=thrown;thrown=___cxa_find_matching_catch.buffer;for(var i=0;i<typeArray.length;i++){if(typeArray[i]&&Module[\"___cxa_can_catch\"](typeArray[i],throwntype,thrown)){thrown=HEAP32[thrown>>2];info.adjusted=thrown;return(setTempRet0(typeArray[i]),thrown)|0}}thrown=HEAP32[thrown>>2];return(setTempRet0(throwntype),thrown)|0}function ___cxa_throw(ptr,type,destructor){EXCEPTIONS.infos[ptr]={ptr:ptr,adjusted:ptr,type:type,destructor:destructor,refcount:0,caught:false,rethrown:false};EXCEPTIONS.last=ptr;if(!(\"uncaught_exception\"in __ZSt18uncaught_exceptionv)){__ZSt18uncaught_exceptionv.uncaught_exception=1}else{__ZSt18uncaught_exceptionv.uncaught_exception++}throw ptr+\" - Exception catching is disabled, this exception cannot be caught. Compile with -s DISABLE_EXCEPTION_CATCHING=0 or DISABLE_EXCEPTION_CATCHING=2 to catch.\"}var cttz_i8=allocate([8,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,6,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,7,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,6,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0],\"i8\",ALLOC_STATIC);function ___gxx_personality_v0(){}var SYSCALLS={varargs:0,get:(function(varargs){SYSCALLS.varargs+=4;var ret=HEAP32[SYSCALLS.varargs-4>>2];return ret}),getStr:(function(){var ret=Pointer_stringify(SYSCALLS.get());return ret}),get64:(function(){var low=SYSCALLS.get(),high=SYSCALLS.get();if(low>=0)assert(high===0);else assert(high===-1);return low}),getZero:(function(){assert(SYSCALLS.get()===0)})};function ___syscall140(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(),offset_high=SYSCALLS.get(),offset_low=SYSCALLS.get(),result=SYSCALLS.get(),whence=SYSCALLS.get();var offset=offset_low;FS.llseek(stream,offset,whence);HEAP32[result>>2]=stream.position;if(stream.getdents&&offset===0&&whence===0)stream.getdents=null;return 0}catch(e){if(typeof FS===\"undefined\"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function flush_NO_FILESYSTEM(){var fflush=Module[\"_fflush\"];if(fflush)fflush(0);var printChar=___syscall146.printChar;if(!printChar)return;var buffers=___syscall146.buffers;if(buffers[1].length)printChar(1,10);if(buffers[2].length)printChar(2,10)}function ___syscall146(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.get(),iov=SYSCALLS.get(),iovcnt=SYSCALLS.get();var ret=0;if(!___syscall146.buffers){___syscall146.buffers=[null,[],[]];___syscall146.printChar=(function(stream,curr){var buffer=___syscall146.buffers[stream];assert(buffer);if(curr===0||curr===10){(stream===1?Module[\"print\"]:Module[\"printErr\"])(UTF8ArrayToString(buffer,0));buffer.length=0}else{buffer.push(curr)}})}for(var i=0;i<iovcnt;i++){var ptr=HEAP32[iov+i*8>>2];var len=HEAP32[iov+(i*8+4)>>2];for(var j=0;j<len;j++){___syscall146.printChar(stream,HEAPU8[ptr+j])}ret+=len}return ret}catch(e){if(typeof FS===\"undefined\"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall6(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD();FS.close(stream);return 0}catch(e){if(typeof FS===\"undefined\"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function _abort(){Module[\"abort\"]()}var _llvm_ceil_f64=Math_ceil;var _llvm_fabs_f64=Math_abs;var _llvm_floor_f64=Math_floor;function _llvm_trap(){abort(\"trap!\")}function _emscripten_memcpy_big(dest,src,num){HEAPU8.set(HEAPU8.subarray(src,src+num),dest);return dest}var PTHREAD_SPECIFIC={};function _pthread_getspecific(key){return PTHREAD_SPECIFIC[key]||0}var PTHREAD_SPECIFIC_NEXT_KEY=1;var ERRNO_CODES={EPERM:1,ENOENT:2,ESRCH:3,EINTR:4,EIO:5,ENXIO:6,E2BIG:7,ENOEXEC:8,EBADF:9,ECHILD:10,EAGAIN:11,EWOULDBLOCK:11,ENOMEM:12,EACCES:13,EFAULT:14,ENOTBLK:15,EBUSY:16,EEXIST:17,EXDEV:18,ENODEV:19,ENOTDIR:20,EISDIR:21,EINVAL:22,ENFILE:23,EMFILE:24,ENOTTY:25,ETXTBSY:26,EFBIG:27,ENOSPC:28,ESPIPE:29,EROFS:30,EMLINK:31,EPIPE:32,EDOM:33,ERANGE:34,ENOMSG:42,EIDRM:43,ECHRNG:44,EL2NSYNC:45,EL3HLT:46,EL3RST:47,ELNRNG:48,EUNATCH:49,ENOCSI:50,EL2HLT:51,EDEADLK:35,ENOLCK:37,EBADE:52,EBADR:53,EXFULL:54,ENOANO:55,EBADRQC:56,EBADSLT:57,EDEADLOCK:35,EBFONT:59,ENOSTR:60,ENODATA:61,ETIME:62,ENOSR:63,ENONET:64,ENOPKG:65,EREMOTE:66,ENOLINK:67,EADV:68,ESRMNT:69,ECOMM:70,EPROTO:71,EMULTIHOP:72,EDOTDOT:73,EBADMSG:74,ENOTUNIQ:76,EBADFD:77,EREMCHG:78,ELIBACC:79,ELIBBAD:80,ELIBSCN:81,ELIBMAX:82,ELIBEXEC:83,ENOSYS:38,ENOTEMPTY:39,ENAMETOOLONG:36,ELOOP:40,EOPNOTSUPP:95,EPFNOSUPPORT:96,ECONNRESET:104,ENOBUFS:105,EAFNOSUPPORT:97,EPROTOTYPE:91,ENOTSOCK:88,ENOPROTOOPT:92,ESHUTDOWN:108,ECONNREFUSED:111,EADDRINUSE:98,ECONNABORTED:103,ENETUNREACH:101,ENETDOWN:100,ETIMEDOUT:110,EHOSTDOWN:112,EHOSTUNREACH:113,EINPROGRESS:115,EALREADY:114,EDESTADDRREQ:89,EMSGSIZE:90,EPROTONOSUPPORT:93,ESOCKTNOSUPPORT:94,EADDRNOTAVAIL:99,ENETRESET:102,EISCONN:106,ENOTCONN:107,ETOOMANYREFS:109,EUSERS:87,EDQUOT:122,ESTALE:116,ENOTSUP:95,ENOMEDIUM:123,EILSEQ:84,EOVERFLOW:75,ECANCELED:125,ENOTRECOVERABLE:131,EOWNERDEAD:130,ESTRPIPE:86};function _pthread_key_create(key,destructor){if(key==0){return ERRNO_CODES.EINVAL}HEAP32[key>>2]=PTHREAD_SPECIFIC_NEXT_KEY;PTHREAD_SPECIFIC[PTHREAD_SPECIFIC_NEXT_KEY]=0;PTHREAD_SPECIFIC_NEXT_KEY++;return 0}function _pthread_once(ptr,func){if(!_pthread_once.seen)_pthread_once.seen={};if(ptr in _pthread_once.seen)return;Module[\"dynCall_v\"](func);_pthread_once.seen[ptr]=1}function _pthread_setspecific(key,value){if(!(key in PTHREAD_SPECIFIC)){return ERRNO_CODES.EINVAL}PTHREAD_SPECIFIC[key]=value;return 0}function ___setErrNo(value){if(Module[\"___errno_location\"])HEAP32[Module[\"___errno_location\"]()>>2]=value;return value}DYNAMICTOP_PTR=staticAlloc(4);STACK_BASE=STACKTOP=alignMemory(STATICTOP);STACK_MAX=STACK_BASE+TOTAL_STACK;DYNAMIC_BASE=alignMemory(STACK_MAX);HEAP32[DYNAMICTOP_PTR>>2]=DYNAMIC_BASE;staticSealed=true;var ASSERTIONS=false;function intArrayFromString(stringy,dontAddNull,length){var len=length>0?length:lengthBytesUTF8(stringy)+1;var u8array=new Array(len);var numBytesWritten=stringToUTF8Array(stringy,u8array,0,u8array.length);if(dontAddNull)u8array.length=numBytesWritten;return u8array}function intArrayToString(array){var ret=[];for(var i=0;i<array.length;i++){var chr=array[i];if(chr>255){if(ASSERTIONS){assert(false,\"Character code \"+chr+\" (\"+String.fromCharCode(chr)+\")  at offset \"+i+\" not in 0x00-0xFF.\")}chr&=255}ret.push(String.fromCharCode(chr))}return ret.join(\"\")}var decodeBase64=typeof atob===\"function\"?atob:(function(input){var keyStr=\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\";var output=\"\";var chr1,chr2,chr3;var enc1,enc2,enc3,enc4;var i=0;input=input.replace(/[^A-Za-z0-9\\+\\/\\=]/g,\"\");do{enc1=keyStr.indexOf(input.charAt(i++));enc2=keyStr.indexOf(input.charAt(i++));enc3=keyStr.indexOf(input.charAt(i++));enc4=keyStr.indexOf(input.charAt(i++));chr1=enc1<<2|enc2>>4;chr2=(enc2&15)<<4|enc3>>2;chr3=(enc3&3)<<6|enc4;output=output+String.fromCharCode(chr1);if(enc3!==64){output=output+String.fromCharCode(chr2)}if(enc4!==64){output=output+String.fromCharCode(chr3)}}while(i<input.length);return output});function intArrayFromBase64(s){if(typeof ENVIRONMENT_IS_NODE===\"boolean\"&&ENVIRONMENT_IS_NODE){var buf;try{buf=Buffer.from(s,\"base64\")}catch(_){buf=new Buffer(s,\"base64\")}return new Uint8Array(buf.buffer,buf.byteOffset,buf.byteLength)}try{var decoded=decodeBase64(s);var bytes=new Uint8Array(decoded.length);for(var i=0;i<decoded.length;++i){bytes[i]=decoded.charCodeAt(i)}return bytes}catch(_){throw new Error(\"Converting base64 string to bytes failed.\")}}function tryParseAsDataURI(filename){if(!isDataURI(filename)){return}return intArrayFromBase64(filename.slice(dataURIPrefix.length))}function invoke_ii(index,a1){try{return Module[\"dynCall_ii\"](index,a1)}catch(e){if(typeof e!==\"number\"&&e!==\"longjmp\")throw e;Module[\"setThrew\"](1,0)}}function invoke_iii(index,a1,a2){try{return Module[\"dynCall_iii\"](index,a1,a2)}catch(e){if(typeof e!==\"number\"&&e!==\"longjmp\")throw e;Module[\"setThrew\"](1,0)}}function invoke_iiii(index,a1,a2,a3){try{return Module[\"dynCall_iiii\"](index,a1,a2,a3)}catch(e){if(typeof e!==\"number\"&&e!==\"longjmp\")throw e;Module[\"setThrew\"](1,0)}}function invoke_iiiiiii(index,a1,a2,a3,a4,a5,a6){try{return Module[\"dynCall_iiiiiii\"](index,a1,a2,a3,a4,a5,a6)}catch(e){if(typeof e!==\"number\"&&e!==\"longjmp\")throw e;Module[\"setThrew\"](1,0)}}function invoke_v(index){try{Module[\"dynCall_v\"](index)}catch(e){if(typeof e!==\"number\"&&e!==\"longjmp\")throw e;Module[\"setThrew\"](1,0)}}function invoke_vi(index,a1){try{Module[\"dynCall_vi\"](index,a1)}catch(e){if(typeof e!==\"number\"&&e!==\"longjmp\")throw e;Module[\"setThrew\"](1,0)}}function invoke_vii(index,a1,a2){try{Module[\"dynCall_vii\"](index,a1,a2)}catch(e){if(typeof e!==\"number\"&&e!==\"longjmp\")throw e;Module[\"setThrew\"](1,0)}}function invoke_viii(index,a1,a2,a3){try{Module[\"dynCall_viii\"](index,a1,a2,a3)}catch(e){if(typeof e!==\"number\"&&e!==\"longjmp\")throw e;Module[\"setThrew\"](1,0)}}function invoke_viiii(index,a1,a2,a3,a4){try{Module[\"dynCall_viiii\"](index,a1,a2,a3,a4)}catch(e){if(typeof e!==\"number\"&&e!==\"longjmp\")throw e;Module[\"setThrew\"](1,0)}}function invoke_viiiii(index,a1,a2,a3,a4,a5){try{Module[\"dynCall_viiiii\"](index,a1,a2,a3,a4,a5)}catch(e){if(typeof e!==\"number\"&&e!==\"longjmp\")throw e;Module[\"setThrew\"](1,0)}}function invoke_viiiiii(index,a1,a2,a3,a4,a5,a6){try{Module[\"dynCall_viiiiii\"](index,a1,a2,a3,a4,a5,a6)}catch(e){if(typeof e!==\"number\"&&e!==\"longjmp\")throw e;Module[\"setThrew\"](1,0)}}Module.asmGlobalArg={\"Math\":Math,\"Int8Array\":Int8Array,\"Int16Array\":Int16Array,\"Int32Array\":Int32Array,\"Uint8Array\":Uint8Array,\"Uint16Array\":Uint16Array,\"Uint32Array\":Uint32Array,\"Float32Array\":Float32Array,\"Float64Array\":Float64Array,\"NaN\":NaN,\"Infinity\":Infinity,\"byteLength\":byteLength};Module.asmLibraryArg={\"abort\":abort,\"assert\":assert,\"enlargeMemory\":enlargeMemory,\"getTotalMemory\":getTotalMemory,\"abortOnCannotGrowMemory\":abortOnCannotGrowMemory,\"invoke_ii\":invoke_ii,\"invoke_iii\":invoke_iii,\"invoke_iiii\":invoke_iiii,\"invoke_iiiiiii\":invoke_iiiiiii,\"invoke_v\":invoke_v,\"invoke_vi\":invoke_vi,\"invoke_vii\":invoke_vii,\"invoke_viii\":invoke_viii,\"invoke_viiii\":invoke_viiii,\"invoke_viiiii\":invoke_viiiii,\"invoke_viiiiii\":invoke_viiiiii,\"__ZSt18uncaught_exceptionv\":__ZSt18uncaught_exceptionv,\"___cxa_allocate_exception\":___cxa_allocate_exception,\"___cxa_begin_catch\":___cxa_begin_catch,\"___cxa_find_matching_catch\":___cxa_find_matching_catch,\"___cxa_pure_virtual\":___cxa_pure_virtual,\"___cxa_throw\":___cxa_throw,\"___gxx_personality_v0\":___gxx_personality_v0,\"___resumeException\":___resumeException,\"___setErrNo\":___setErrNo,\"___syscall140\":___syscall140,\"___syscall146\":___syscall146,\"___syscall6\":___syscall6,\"_abort\":_abort,\"_emscripten_memcpy_big\":_emscripten_memcpy_big,\"_llvm_ceil_f64\":_llvm_ceil_f64,\"_llvm_fabs_f64\":_llvm_fabs_f64,\"_llvm_floor_f64\":_llvm_floor_f64,\"_llvm_trap\":_llvm_trap,\"_pthread_getspecific\":_pthread_getspecific,\"_pthread_key_create\":_pthread_key_create,\"_pthread_once\":_pthread_once,\"_pthread_setspecific\":_pthread_setspecific,\"flush_NO_FILESYSTEM\":flush_NO_FILESYSTEM,\"DYNAMICTOP_PTR\":DYNAMICTOP_PTR,\"tempDoublePtr\":tempDoublePtr,\"ABORT\":ABORT,\"STACKTOP\":STACKTOP,\"STACK_MAX\":STACK_MAX,\"cttz_i8\":cttz_i8};// EMSCRIPTEN_START_ASM\nvar asm=(/** @suppress {uselessCode} */ function(global,env,buffer) {\n\"almost asm\";var a=global.Int8Array;var b=new a(buffer);var c=global.Int16Array;var d=new c(buffer);var e=global.Int32Array;var f=new e(buffer);var g=global.Uint8Array;var h=new g(buffer);var i=global.Uint16Array;var j=new i(buffer);var k=global.Uint32Array;var l=new k(buffer);var m=global.Float32Array;var n=new m(buffer);var o=global.Float64Array;var p=new o(buffer);var q=global.byteLength;var r=env.DYNAMICTOP_PTR|0;var s=env.tempDoublePtr|0;var t=env.ABORT|0;var u=env.STACKTOP|0;var v=env.STACK_MAX|0;var w=env.cttz_i8|0;var x=0;var y=0;var z=0;var A=0;var B=global.NaN,C=global.Infinity;var D=0,E=0,F=0,G=0,H=0.0;var I=0;var J=global.Math.floor;var K=global.Math.abs;var L=global.Math.sqrt;var M=global.Math.pow;var N=global.Math.cos;var O=global.Math.sin;var P=global.Math.tan;var Q=global.Math.acos;var R=global.Math.asin;var S=global.Math.atan;var T=global.Math.atan2;var U=global.Math.exp;var V=global.Math.log;var W=global.Math.ceil;var X=global.Math.imul;var Y=global.Math.min;var Z=global.Math.max;var _=global.Math.clz32;var $=global.Math.fround;var aa=env.abort;var ba=env.assert;var ca=env.enlargeMemory;var da=env.getTotalMemory;var ea=env.abortOnCannotGrowMemory;var fa=env.invoke_ii;var ga=env.invoke_iii;var ha=env.invoke_iiii;var ia=env.invoke_iiiiiii;var ja=env.invoke_v;var ka=env.invoke_vi;var la=env.invoke_vii;var ma=env.invoke_viii;var na=env.invoke_viiii;var oa=env.invoke_viiiii;var pa=env.invoke_viiiiii;var qa=env.__ZSt18uncaught_exceptionv;var ra=env.___cxa_allocate_exception;var sa=env.___cxa_begin_catch;var ta=env.___cxa_find_matching_catch;var ua=env.___cxa_pure_virtual;var va=env.___cxa_throw;var wa=env.___gxx_personality_v0;var xa=env.___resumeException;var ya=env.___setErrNo;var za=env.___syscall140;var Aa=env.___syscall146;var Ba=env.___syscall6;var Ca=env._abort;var Da=env._emscripten_memcpy_big;var Ea=env._llvm_ceil_f64;var Fa=env._llvm_fabs_f64;var Ga=env._llvm_floor_f64;var Ha=env._llvm_trap;var Ia=env._pthread_getspecific;var Ja=env._pthread_key_create;var Ka=env._pthread_once;var La=env._pthread_setspecific;var Ma=env.flush_NO_FILESYSTEM;var Na=$(0);const Oa=$(0);function Pa(newBuffer){if(q(newBuffer)&16777215||q(newBuffer)<=16777215||q(newBuffer)>2147483648)return false;b=new a(newBuffer);d=new c(newBuffer);f=new e(newBuffer);h=new g(newBuffer);j=new i(newBuffer);l=new k(newBuffer);n=new m(newBuffer);p=new o(newBuffer);buffer=newBuffer;return true}\n// EMSCRIPTEN_START_FUNCS\nfunction wc(a){a=a|0;var b=0,c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0;if(!a)return;b=a+-8|0;c=f[4516]|0;d=f[a+-4>>2]|0;a=d&-8;e=b+a|0;do if(!(d&1)){g=f[b>>2]|0;if(!(d&3))return;h=b+(0-g)|0;i=g+a|0;if(h>>>0<c>>>0)return;if((f[4517]|0)==(h|0)){j=e+4|0;k=f[j>>2]|0;if((k&3|0)!=3){l=h;m=i;n=h;break}f[4514]=i;f[j>>2]=k&-2;f[h+4>>2]=i|1;f[h+i>>2]=i;return}k=g>>>3;if(g>>>0<256){g=f[h+8>>2]|0;j=f[h+12>>2]|0;if((j|0)==(g|0)){f[4512]=f[4512]&~(1<<k);l=h;m=i;n=h;break}else{f[g+12>>2]=j;f[j+8>>2]=g;l=h;m=i;n=h;break}}g=f[h+24>>2]|0;j=f[h+12>>2]|0;do if((j|0)==(h|0)){k=h+16|0;o=k+4|0;p=f[o>>2]|0;if(!p){q=f[k>>2]|0;if(!q){r=0;break}else{s=q;t=k}}else{s=p;t=o}while(1){o=s+20|0;p=f[o>>2]|0;if(p|0){s=p;t=o;continue}o=s+16|0;p=f[o>>2]|0;if(!p)break;else{s=p;t=o}}f[t>>2]=0;r=s}else{o=f[h+8>>2]|0;f[o+12>>2]=j;f[j+8>>2]=o;r=j}while(0);if(g){j=f[h+28>>2]|0;o=18352+(j<<2)|0;if((f[o>>2]|0)==(h|0)){f[o>>2]=r;if(!r){f[4513]=f[4513]&~(1<<j);l=h;m=i;n=h;break}}else{f[g+16+(((f[g+16>>2]|0)!=(h|0)&1)<<2)>>2]=r;if(!r){l=h;m=i;n=h;break}}f[r+24>>2]=g;j=h+16|0;o=f[j>>2]|0;if(o|0){f[r+16>>2]=o;f[o+24>>2]=r}o=f[j+4>>2]|0;if(o){f[r+20>>2]=o;f[o+24>>2]=r;l=h;m=i;n=h}else{l=h;m=i;n=h}}else{l=h;m=i;n=h}}else{l=b;m=a;n=b}while(0);if(n>>>0>=e>>>0)return;b=e+4|0;a=f[b>>2]|0;if(!(a&1))return;if(!(a&2)){if((f[4518]|0)==(e|0)){r=(f[4515]|0)+m|0;f[4515]=r;f[4518]=l;f[l+4>>2]=r|1;if((l|0)!=(f[4517]|0))return;f[4517]=0;f[4514]=0;return}if((f[4517]|0)==(e|0)){r=(f[4514]|0)+m|0;f[4514]=r;f[4517]=n;f[l+4>>2]=r|1;f[n+r>>2]=r;return}r=(a&-8)+m|0;s=a>>>3;do if(a>>>0<256){t=f[e+8>>2]|0;c=f[e+12>>2]|0;if((c|0)==(t|0)){f[4512]=f[4512]&~(1<<s);break}else{f[t+12>>2]=c;f[c+8>>2]=t;break}}else{t=f[e+24>>2]|0;c=f[e+12>>2]|0;do if((c|0)==(e|0)){d=e+16|0;o=d+4|0;j=f[o>>2]|0;if(!j){p=f[d>>2]|0;if(!p){u=0;break}else{v=p;w=d}}else{v=j;w=o}while(1){o=v+20|0;j=f[o>>2]|0;if(j|0){v=j;w=o;continue}o=v+16|0;j=f[o>>2]|0;if(!j)break;else{v=j;w=o}}f[w>>2]=0;u=v}else{o=f[e+8>>2]|0;f[o+12>>2]=c;f[c+8>>2]=o;u=c}while(0);if(t|0){c=f[e+28>>2]|0;h=18352+(c<<2)|0;if((f[h>>2]|0)==(e|0)){f[h>>2]=u;if(!u){f[4513]=f[4513]&~(1<<c);break}}else{f[t+16+(((f[t+16>>2]|0)!=(e|0)&1)<<2)>>2]=u;if(!u)break}f[u+24>>2]=t;c=e+16|0;h=f[c>>2]|0;if(h|0){f[u+16>>2]=h;f[h+24>>2]=u}h=f[c+4>>2]|0;if(h|0){f[u+20>>2]=h;f[h+24>>2]=u}}}while(0);f[l+4>>2]=r|1;f[n+r>>2]=r;if((l|0)==(f[4517]|0)){f[4514]=r;return}else x=r}else{f[b>>2]=a&-2;f[l+4>>2]=m|1;f[n+m>>2]=m;x=m}m=x>>>3;if(x>>>0<256){n=18088+(m<<1<<2)|0;a=f[4512]|0;b=1<<m;if(!(a&b)){f[4512]=a|b;y=n;z=n+8|0}else{b=n+8|0;y=f[b>>2]|0;z=b}f[z>>2]=l;f[y+12>>2]=l;f[l+8>>2]=y;f[l+12>>2]=n;return}n=x>>>8;if(n)if(x>>>0>16777215)A=31;else{y=(n+1048320|0)>>>16&8;z=n<<y;n=(z+520192|0)>>>16&4;b=z<<n;z=(b+245760|0)>>>16&2;a=14-(n|y|z)+(b<<z>>>15)|0;A=x>>>(a+7|0)&1|a<<1}else A=0;a=18352+(A<<2)|0;f[l+28>>2]=A;f[l+20>>2]=0;f[l+16>>2]=0;z=f[4513]|0;b=1<<A;do if(z&b){y=x<<((A|0)==31?0:25-(A>>>1)|0);n=f[a>>2]|0;while(1){if((f[n+4>>2]&-8|0)==(x|0)){B=73;break}C=n+16+(y>>>31<<2)|0;m=f[C>>2]|0;if(!m){B=72;break}else{y=y<<1;n=m}}if((B|0)==72){f[C>>2]=l;f[l+24>>2]=n;f[l+12>>2]=l;f[l+8>>2]=l;break}else if((B|0)==73){y=n+8|0;t=f[y>>2]|0;f[t+12>>2]=l;f[y>>2]=l;f[l+8>>2]=t;f[l+12>>2]=n;f[l+24>>2]=0;break}}else{f[4513]=z|b;f[a>>2]=l;f[l+24>>2]=a;f[l+12>>2]=l;f[l+8>>2]=l}while(0);l=(f[4520]|0)+-1|0;f[4520]=l;if(!l)D=18504;else return;while(1){l=f[D>>2]|0;if(!l)break;else D=l+8|0}f[4520]=-1;return}function xc(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,i=0,j=0,k=0,l=0,m=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=Oa,F=Oa,G=Oa,H=0,I=0,J=0,K=0;d=b[c+11>>0]|0;e=d<<24>>24<0;g=e?f[c>>2]|0:c;i=e?f[c+4>>2]|0:d&255;if(i>>>0>3){d=g;e=i;j=i;while(1){k=X(h[d>>0]|h[d+1>>0]<<8|h[d+2>>0]<<16|h[d+3>>0]<<24,1540483477)|0;e=(X(k>>>24^k,1540483477)|0)^(X(e,1540483477)|0);j=j+-4|0;if(j>>>0<=3)break;else d=d+4|0}d=i+-4|0;j=d&-4;l=d-j|0;m=g+(j+4)|0;o=e}else{l=i;m=g;o=i}switch(l|0){case 3:{p=h[m+2>>0]<<16^o;q=6;break}case 2:{p=o;q=6;break}case 1:{r=o;q=7;break}default:s=o}if((q|0)==6){r=h[m+1>>0]<<8^p;q=7}if((q|0)==7)s=X(r^h[m>>0],1540483477)|0;m=X(s>>>13^s,1540483477)|0;s=m>>>15^m;m=a+4|0;r=f[m>>2]|0;p=(r|0)==0;a:do if(!p){o=r+-1|0;l=(o&r|0)==0;if(!l)if(s>>>0<r>>>0)t=s;else t=(s>>>0)%(r>>>0)|0;else t=s&o;e=f[(f[a>>2]|0)+(t<<2)>>2]|0;if((e|0)!=0?(j=f[e>>2]|0,(j|0)!=0):0){e=(i|0)==0;if(l){if(e){l=j;while(1){d=f[l+4>>2]|0;if(!((d|0)==(s|0)|(d&o|0)==(t|0))){u=t;break a}d=b[l+8+11>>0]|0;if(!((d<<24>>24<0?f[l+12>>2]|0:d&255)|0)){v=l;break}l=f[l>>2]|0;if(!l){u=t;break a}}w=v+20|0;return w|0}else x=j;b:while(1){l=f[x+4>>2]|0;if(!((l|0)==(s|0)|(l&o|0)==(t|0))){u=t;break a}l=x+8|0;d=b[l+11>>0]|0;k=d<<24>>24<0;y=d&255;do if(((k?f[x+12>>2]|0:y)|0)==(i|0)){d=f[l>>2]|0;if(k)if(!(Pk(d,g,i)|0)){v=x;q=63;break b}else break;if((b[g>>0]|0)==(d&255)<<24>>24){d=l;z=y;A=g;do{z=z+-1|0;d=d+1|0;if(!z){v=x;q=63;break b}A=A+1|0}while((b[d>>0]|0)==(b[A>>0]|0))}}while(0);x=f[x>>2]|0;if(!x){u=t;break a}}if((q|0)==63){w=v+20|0;return w|0}}if(e){o=j;while(1){y=f[o+4>>2]|0;if((y|0)!=(s|0)){if(y>>>0<r>>>0)B=y;else B=(y>>>0)%(r>>>0)|0;if((B|0)!=(t|0)){u=t;break a}}y=b[o+8+11>>0]|0;if(!((y<<24>>24<0?f[o+12>>2]|0:y&255)|0)){v=o;break}o=f[o>>2]|0;if(!o){u=t;break a}}w=v+20|0;return w|0}else C=j;c:while(1){o=f[C+4>>2]|0;if((o|0)!=(s|0)){if(o>>>0<r>>>0)D=o;else D=(o>>>0)%(r>>>0)|0;if((D|0)!=(t|0)){u=t;break a}}o=C+8|0;e=b[o+11>>0]|0;y=e<<24>>24<0;l=e&255;do if(((y?f[C+12>>2]|0:l)|0)==(i|0)){e=f[o>>2]|0;if(y)if(!(Pk(e,g,i)|0)){v=C;q=63;break c}else break;if((b[g>>0]|0)==(e&255)<<24>>24){e=o;k=l;A=g;do{k=k+-1|0;e=e+1|0;if(!k){v=C;q=63;break c}A=A+1|0}while((b[e>>0]|0)==(b[A>>0]|0))}}while(0);C=f[C>>2]|0;if(!C){u=t;break a}}if((q|0)==63){w=v+20|0;return w|0}}else u=t}else u=0;while(0);t=dn(24)|0;dj(t+8|0,c);f[t+20>>2]=0;f[t+4>>2]=s;f[t>>2]=0;c=a+12|0;E=$(((f[c>>2]|0)+1|0)>>>0);F=$(r>>>0);G=$(n[a+16>>2]);do if(p|$(G*F)<E){C=r<<1|(r>>>0<3|(r+-1&r|0)!=0)&1;g=~~$(W($(E/G)))>>>0;Ph(a,C>>>0<g>>>0?g:C);C=f[m>>2]|0;g=C+-1|0;if(!(g&C)){H=C;I=g&s;break}if(s>>>0<C>>>0){H=C;I=s}else{H=C;I=(s>>>0)%(C>>>0)|0}}else{H=r;I=u}while(0);u=(f[a>>2]|0)+(I<<2)|0;I=f[u>>2]|0;if(!I){r=a+8|0;f[t>>2]=f[r>>2];f[r>>2]=t;f[u>>2]=r;r=f[t>>2]|0;if(r|0){u=f[r+4>>2]|0;r=H+-1|0;if(r&H)if(u>>>0<H>>>0)J=u;else J=(u>>>0)%(H>>>0)|0;else J=u&r;K=(f[a>>2]|0)+(J<<2)|0;q=61}}else{f[t>>2]=f[I>>2];K=I;q=61}if((q|0)==61)f[K>>2]=t;f[c>>2]=(f[c>>2]|0)+1;v=t;w=v+20|0;return w|0}function yc(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var g=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0.0,q=0.0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0.0,G=0.0,H=0,J=0,K=0,L=0,M=0,N=0,O=0.0,P=0,Q=0.0,R=0.0,S=0,T=0.0,U=0,V=0,W=0,X=0.0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0.0,da=0,ea=0.0;g=a+4|0;i=f[g>>2]|0;j=a+100|0;if(i>>>0<(f[j>>2]|0)>>>0){f[g>>2]=i+1;k=h[i>>0]|0;l=0}else{k=Di(a)|0;l=0}a:while(1){switch(k|0){case 46:{m=8;break a;break}case 48:break;default:{n=0;o=0;p=1.0;q=0.0;r=0;s=k;t=l;u=0;v=0;w=0;x=0;break a}}i=f[g>>2]|0;if(i>>>0<(f[j>>2]|0)>>>0){f[g>>2]=i+1;k=h[i>>0]|0;l=1;continue}else{k=Di(a)|0;l=1;continue}}if((m|0)==8){k=f[g>>2]|0;if(k>>>0<(f[j>>2]|0)>>>0){f[g>>2]=k+1;y=h[k>>0]|0}else y=Di(a)|0;if((y|0)==48){k=0;i=0;while(1){z=f[g>>2]|0;if(z>>>0<(f[j>>2]|0)>>>0){f[g>>2]=z+1;A=h[z>>0]|0}else A=Di(a)|0;z=Tn(k|0,i|0,-1,-1)|0;B=I;if((A|0)==48){k=z;i=B}else{n=1;o=0;p=1.0;q=0.0;r=0;s=A;t=1;u=0;v=0;w=z;x=B;break}}}else{n=1;o=0;p=1.0;q=0.0;r=0;s=y;t=l;u=0;v=0;w=0;x=0}}while(1){l=s+-48|0;y=s|32;if(l>>>0>=10){A=(s|0)==46;if(!(A|(y+-97|0)>>>0<6)){C=s;break}if(A)if(!n){D=1;E=o;F=p;G=q;H=r;J=t;K=v;L=u;M=v;N=u}else{C=46;break}else m=20}else m=20;if((m|0)==20){m=0;A=(s|0)>57?y+-87|0:l;do if(!((u|0)<0|(u|0)==0&v>>>0<8))if((u|0)<0|(u|0)==0&v>>>0<14){O=p*.0625;P=o;Q=O;R=q+O*+(A|0);S=r;break}else{l=(o|0)!=0|(A|0)==0;P=l?o:1;Q=p;R=l?q:q+p*.5;S=r;break}else{P=o;Q=p;R=q;S=A+(r<<4)|0}while(0);A=Tn(v|0,u|0,1,0)|0;D=n;E=P;F=Q;G=R;H=S;J=1;K=w;L=x;M=A;N=I}A=f[g>>2]|0;if(A>>>0<(f[j>>2]|0)>>>0){f[g>>2]=A+1;n=D;o=E;p=F;q=G;r=H;s=h[A>>0]|0;t=J;u=N;v=M;w=K;x=L;continue}else{n=D;o=E;p=F;q=G;r=H;s=Di(a)|0;t=J;u=N;v=M;w=K;x=L;continue}}do if(!t){L=(f[j>>2]|0)==0;if(!L)f[g>>2]=(f[g>>2]|0)+-1;if(e){if(!L)f[g>>2]=(f[g>>2]|0)+-1;if(!((n|0)==0|L))f[g>>2]=(f[g>>2]|0)+-1}else Rm(a,0);T=+(d|0)*0.0}else{L=(n|0)==0;K=L?v:w;M=L?u:x;if((u|0)<0|(u|0)==0&v>>>0<8){L=r;N=v;J=u;while(1){s=L<<4;H=N;N=Tn(N|0,J|0,1,0)|0;if(!((J|0)<0|(J|0)==0&H>>>0<7)){U=s;break}else{L=s;J=I}}}else U=r;if((C|32|0)==112){J=De(a,e)|0;L=I;if((J|0)==0&(L|0)==-2147483648){if(!e){Rm(a,0);T=0.0;break}if(!(f[j>>2]|0)){V=0;W=0}else{f[g>>2]=(f[g>>2]|0)+-1;V=0;W=0}}else{V=J;W=L}}else if(!(f[j>>2]|0)){V=0;W=0}else{f[g>>2]=(f[g>>2]|0)+-1;V=0;W=0}L=Rn(K|0,M|0,2)|0;J=Tn(L|0,I|0,-32,-1)|0;L=Tn(J|0,I|0,V|0,W|0)|0;J=I;if(!U){T=+(d|0)*0.0;break}N=0-c|0;s=((N|0)<0)<<31>>31;if((J|0)>(s|0)|(J|0)==(s|0)&L>>>0>N>>>0){N=ir()|0;f[N>>2]=34;T=+(d|0)*1797693134862315708145274.0e284*1797693134862315708145274.0e284;break}N=c+-106|0;s=((N|0)<0)<<31>>31;if((J|0)<(s|0)|(J|0)==(s|0)&L>>>0<N>>>0){N=ir()|0;f[N>>2]=34;T=+(d|0)*2.2250738585072014e-308*2.2250738585072014e-308;break}if((U|0)>-1){G=q;N=U;s=L;H=J;while(1){E=!(G>=.5);o=N<<1|(E^1)&1;F=G+(E?G:G+-1.0);E=Tn(s|0,H|0,-1,-1)|0;D=I;if((o|0)>-1){G=F;N=o;s=E;H=D}else{X=F;Y=o;Z=E;_=D;break}}}else{X=q;Y=U;Z=L;_=J}H=((b|0)<0)<<31>>31;s=Vn(32,0,c|0,((c|0)<0)<<31>>31|0)|0;N=Tn(s|0,I|0,Z|0,_|0)|0;s=I;if((s|0)<(H|0)|(s|0)==(H|0)&N>>>0<b>>>0)if((N|0)>0){$=N;m=59}else{aa=0;ba=84;m=61}else{$=b;m=59}if((m|0)==59)if(($|0)<53){aa=$;ba=84-$|0;m=61}else{ca=0.0;da=$;ea=+(d|0)}if((m|0)==61){G=+(d|0);ca=+Gq(+Wj(1.0,ba),G);da=aa;ea=G}N=(Y&1|0)==0&(X!=0.0&(da|0)<32);G=(N?0.0:X)*ea+(ca+ea*+((Y+(N&1)|0)>>>0))-ca;if(!(G!=0.0)){N=ir()|0;f[N>>2]=34}T=+Hq(G,Z)}while(0);return +T}function zc(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0;g=u;u=u+16|0;h=g+4|0;i=g;if(!(oh(a,d)|0)){j=0;u=g;return j|0}d=a+84|0;k=f[d>>2]|0;l=a+88|0;m=f[l>>2]|0;if((m|0)!=(k|0))f[l>>2]=m+(~((m+-4-k|0)>>>2)<<2);f[d>>2]=0;f[l>>2]=0;f[a+92>>2]=0;if(k|0)br(k);k=a+72|0;l=f[k>>2]|0;d=a+76|0;if((f[d>>2]|0)!=(l|0))f[d>>2]=l;f[k>>2]=0;f[d>>2]=0;f[a+80>>2]=0;if(l|0)br(l);l=a+64|0;d=f[l>>2]|0;if((f[d+4>>2]|0)!=(f[d>>2]|0)){k=a+12|0;m=e+84|0;n=e+68|0;o=c+96|0;p=a+24|0;q=0;r=d;do{f[i>>2]=(q>>>0)/3|0;f[h>>2]=f[i>>2];d=Rj(r,h)|0;r=f[l>>2]|0;do if(!d){s=f[(f[r+12>>2]|0)+(q<<2)>>2]|0;if((s|0)==-1){t=(f[a>>2]|0)+(q>>>5<<2)|0;f[t>>2]=f[t>>2]|1<<(q&31);t=q+1|0;v=((t>>>0)%3|0|0)==0?q+-2|0:t;if((v|0)==-1)w=-1;else w=f[(f[r>>2]|0)+(v<<2)>>2]|0;v=(f[k>>2]|0)+(w>>>5<<2)|0;f[v>>2]=f[v>>2]|1<<(w&31);v=(((q>>>0)%3|0|0)==0?2:-1)+q|0;if((v|0)==-1)x=-1;else x=f[(f[r>>2]|0)+(v<<2)>>2]|0;v=(f[k>>2]|0)+(x>>>5<<2)|0;f[v>>2]=f[v>>2]|1<<(x&31);break}if(s>>>0>=q>>>0){v=q+1|0;t=((v>>>0)%3|0|0)==0?q+-2|0:v;y=s+(((s>>>0)%3|0|0)==0?2:-1)|0;z=(t|0)==-1;if(!(b[m>>0]|0)){if(z)A=-1;else A=f[(f[o>>2]|0)+(((t|0)/3|0)*12|0)+(((t|0)%3|0)<<2)>>2]|0;B=(y|0)==-1;if(B)C=-1;else C=f[(f[o>>2]|0)+(((y|0)/3|0)*12|0)+(((y|0)%3|0)<<2)>>2]|0;D=f[n>>2]|0;if((f[D+(A<<2)>>2]|0)==(f[D+(C<<2)>>2]|0)){E=t+1|0;if(z)F=-1;else F=((E>>>0)%3|0|0)==0?t+-2|0:E;do if(!B)if(!((y>>>0)%3|0)){G=y+2|0;break}else{G=y+-1|0;break}else G=-1;while(0);if((F|0)==-1)H=-1;else H=f[(f[o>>2]|0)+(((F|0)/3|0)*12|0)+(((F|0)%3|0)<<2)>>2]|0;if((G|0)==-1)I=-1;else I=f[(f[o>>2]|0)+(((G|0)/3|0)*12|0)+(((G|0)%3|0)<<2)>>2]|0;if((f[D+(H<<2)>>2]|0)==(f[D+(I<<2)>>2]|0))break}}else{if(z)J=-1;else J=f[(f[o>>2]|0)+(((t|0)/3|0)*12|0)+(((t|0)%3|0)<<2)>>2]|0;B=(y|0)==-1;if(B)K=-1;else K=f[(f[o>>2]|0)+(((y|0)/3|0)*12|0)+(((y|0)%3|0)<<2)>>2]|0;if((J|0)==(K|0)){E=t+1|0;if(z)L=-1;else L=((E>>>0)%3|0|0)==0?t+-2|0:E;do if(!B)if(!((y>>>0)%3|0)){M=y+2|0;break}else{M=y+-1|0;break}else M=-1;while(0);if((L|0)==-1)N=-1;else N=f[(f[o>>2]|0)+(((L|0)/3|0)*12|0)+(((L|0)%3|0)<<2)>>2]|0;if((M|0)==-1)O=-1;else O=f[(f[o>>2]|0)+(((M|0)/3|0)*12|0)+(((M|0)%3|0)<<2)>>2]|0;if((N|0)==(O|0))break}}b[p>>0]=0;y=f[a>>2]|0;B=y+(q>>>5<<2)|0;f[B>>2]=f[B>>2]|1<<(q&31);B=y+(s>>>5<<2)|0;f[B>>2]=f[B>>2]|1<<(s&31);B=((v>>>0)%3|0|0)==0?q+-2|0:v;if((B|0)==-1)P=-1;else P=f[(f[r>>2]|0)+(B<<2)>>2]|0;B=(f[k>>2]|0)+(P>>>5<<2)|0;f[B>>2]=f[B>>2]|1<<(P&31);B=(((q>>>0)%3|0|0)==0?2:-1)+q|0;if((B|0)==-1)Q=-1;else Q=f[(f[r>>2]|0)+(B<<2)>>2]|0;B=(f[k>>2]|0)+(Q>>>5<<2)|0;f[B>>2]=f[B>>2]|1<<(Q&31);B=s+1|0;y=((B>>>0)%3|0|0)==0?s+-2|0:B;if((y|0)==-1)R=-1;else R=f[(f[r>>2]|0)+(y<<2)>>2]|0;y=(f[k>>2]|0)+(R>>>5<<2)|0;f[y>>2]=f[y>>2]|1<<(R&31);y=(((s>>>0)%3|0|0)==0?2:-1)+s|0;if((y|0)==-1)S=-1;else S=f[(f[r>>2]|0)+(y<<2)>>2]|0;y=(f[k>>2]|0)+(S>>>5<<2)|0;f[y>>2]=f[y>>2]|1<<(S&31)}}while(0);q=q+1|0}while(q>>>0<(f[r+4>>2]|0)-(f[r>>2]|0)>>2>>>0)}if((c|0)!=0&(e|0)!=0){Kc(a,c,e);j=1;u=g;return j|0}else{gd(a,0,0);j=1;u=g;return j|0}return 0}function Ac(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0;d=u;u=u+32|0;e=d+12|0;g=d+8|0;h=d+4|0;i=d;j=a+8|0;a:do if(f[j>>2]|0?(k=f[a>>2]|0,l=a+4|0,f[a>>2]=l,f[(f[l>>2]|0)+8>>2]=0,f[l>>2]=0,f[j>>2]=0,m=f[k+4>>2]|0,n=(m|0)==0?k:m,n|0):0){m=a+4|0;k=n;n=f[b>>2]|0;while(1){if((n|0)==(f[c>>2]|0))break;o=k+16|0;f[o>>2]=f[n+16>>2];if((k|0)!=(n|0)){f[h>>2]=f[n+20>>2];f[i>>2]=n+24;f[g>>2]=f[h>>2];f[e>>2]=f[i>>2];Hc(k+20|0,g,e)}p=k+8|0;q=f[p>>2]|0;do if(q){r=f[q>>2]|0;if((r|0)==(k|0)){f[q>>2]=0;s=f[q+4>>2]|0;if(!s){t=q;break}else v=s;while(1){s=f[v>>2]|0;if(s|0){v=s;continue}s=f[v+4>>2]|0;if(!s)break;else v=s}t=v;break}else{f[q+4>>2]=0;if(!r){t=q;break}else w=r;while(1){s=f[w>>2]|0;if(s|0){w=s;continue}s=f[w+4>>2]|0;if(!s)break;else w=s}t=w;break}}else t=0;while(0);q=f[l>>2]|0;do if(q){r=f[o>>2]|0;s=q;while(1){if((r|0)<(f[s+16>>2]|0)){x=f[s>>2]|0;if(!x){y=22;break}else z=x}else{A=s+4|0;x=f[A>>2]|0;if(!x){y=25;break}else z=x}s=z}if((y|0)==22){y=0;B=s;C=s;break}else if((y|0)==25){y=0;B=s;C=A;break}}else{B=l;C=l}while(0);f[k>>2]=0;f[k+4>>2]=0;f[p>>2]=B;f[C>>2]=k;q=f[f[a>>2]>>2]|0;if(!q)D=k;else{f[a>>2]=q;D=f[C>>2]|0}Ae(f[m>>2]|0,D);f[j>>2]=(f[j>>2]|0)+1;q=f[n+4>>2]|0;if(!q){o=n+8|0;r=f[o>>2]|0;if((f[r>>2]|0)==(n|0))E=r;else{r=o;do{o=f[r>>2]|0;r=o+8|0;x=f[r>>2]|0}while((f[x>>2]|0)!=(o|0));E=x}}else{r=q;while(1){p=f[r>>2]|0;if(!p)break;else r=p}E=r}f[b>>2]=E;if(!t)break a;else{k=t;n=E}}n=f[k+8>>2]|0;if(!n)F=k;else{m=n;while(1){n=f[m+8>>2]|0;if(!n)break;else m=n}F=m}Dj(a,F)}while(0);F=f[b>>2]|0;E=f[c>>2]|0;if((F|0)==(E|0)){u=d;return}c=a+4|0;t=a+4|0;D=F;while(1){tg(e,a,D+16|0);F=f[c>>2]|0;do if(F){C=f[e>>2]|0;B=f[C+16>>2]|0;A=F;while(1){if((B|0)<(f[A+16>>2]|0)){z=f[A>>2]|0;if(!z){y=43;break}else G=z}else{H=A+4|0;z=f[H>>2]|0;if(!z){y=46;break}else G=z}A=G}if((y|0)==43){y=0;I=A;J=A;K=C;break}else if((y|0)==46){y=0;I=A;J=H;K=C;break}}else{I=c;J=c;K=f[e>>2]|0}while(0);f[K>>2]=0;f[K+4>>2]=0;f[K+8>>2]=I;f[J>>2]=K;F=f[f[a>>2]>>2]|0;if(!F)L=K;else{f[a>>2]=F;L=f[J>>2]|0}Ae(f[t>>2]|0,L);f[j>>2]=(f[j>>2]|0)+1;F=f[D+4>>2]|0;if(!F){m=D+8|0;B=f[m>>2]|0;if((f[B>>2]|0)==(D|0))M=B;else{B=m;do{m=f[B>>2]|0;B=m+8|0;r=f[B>>2]|0}while((f[r>>2]|0)!=(m|0));M=r}}else{B=F;while(1){r=f[B>>2]|0;if(!r)break;else B=r}M=B}f[b>>2]=M;if((M|0)==(E|0))break;else D=M}u=d;return}function Bc(a,b,c,d,e,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0;g=a+8|0;Ah(g,b,d,e);d=e>>>0>1073741823?-1:e<<2;h=_q(d)|0;hj(h|0,0,d|0)|0;d=f[a+48>>2]|0;i=f[a+56>>2]|0;j=f[i>>2]|0;k=(f[i+4>>2]|0)-j|0;l=k>>2;a:do if((k|0)>4){m=f[a+52>>2]|0;n=a+16|0;o=a+32|0;p=a+12|0;q=a+28|0;r=a+20|0;s=a+24|0;t=d+12|0;u=(e|0)>0;v=j;w=l;while(1){x=w;w=w+-1|0;if(l>>>0<=w>>>0)break;y=f[v+(w<<2)>>2]|0;z=X(w,e)|0;if((y|0)!=-1?(A=f[(f[t>>2]|0)+(y<<2)>>2]|0,(A|0)!=-1):0){y=f[d>>2]|0;B=f[m>>2]|0;C=f[B+(f[y+(A<<2)>>2]<<2)>>2]|0;D=A+1|0;E=((D>>>0)%3|0|0)==0?A+-2|0:D;if((E|0)==-1)F=-1;else F=f[y+(E<<2)>>2]|0;E=f[B+(F<<2)>>2]|0;D=(((A>>>0)%3|0|0)==0?2:-1)+A|0;if((D|0)==-1)G=-1;else G=f[y+(D<<2)>>2]|0;D=f[B+(G<<2)>>2]|0;if((C|0)<(w|0)&(E|0)<(w|0)&(D|0)<(w|0)){B=X(C,e)|0;C=X(E,e)|0;E=X(D,e)|0;if(u){D=0;do{f[h+(D<<2)>>2]=(f[b+(D+E<<2)>>2]|0)+(f[b+(D+C<<2)>>2]|0)-(f[b+(D+B<<2)>>2]|0);D=D+1|0}while((D|0)!=(e|0))}D=b+(z<<2)|0;B=c+(z<<2)|0;C=f[g>>2]|0;if((C|0)>0){E=0;y=h;A=C;while(1){if((A|0)>0){C=0;do{H=f[y+(C<<2)>>2]|0;I=f[n>>2]|0;if((H|0)>(I|0)){J=f[o>>2]|0;f[J+(C<<2)>>2]=I;K=J}else{J=f[p>>2]|0;I=f[o>>2]|0;f[I+(C<<2)>>2]=(H|0)<(J|0)?J:H;K=I}C=C+1|0}while((C|0)<(f[g>>2]|0));L=K}else L=f[o>>2]|0;C=(f[D+(E<<2)>>2]|0)-(f[L+(E<<2)>>2]|0)|0;I=B+(E<<2)|0;f[I>>2]=C;if((C|0)>=(f[q>>2]|0)){if((C|0)>(f[s>>2]|0)){M=C-(f[r>>2]|0)|0;N=42}}else{M=(f[r>>2]|0)+C|0;N=42}if((N|0)==42){N=0;f[I>>2]=M}E=E+1|0;A=f[g>>2]|0;if((E|0)>=(A|0))break;else y=L}}}else N=16}else N=16;if((N|0)==16?(N=0,y=b+(z<<2)|0,A=c+(z<<2)|0,E=f[g>>2]|0,(E|0)>0):0){B=0;D=b+((X(x+-2|0,e)|0)<<2)|0;I=E;while(1){if((I|0)>0){E=0;do{C=f[D+(E<<2)>>2]|0;H=f[n>>2]|0;if((C|0)>(H|0)){J=f[o>>2]|0;f[J+(E<<2)>>2]=H;O=J}else{J=f[p>>2]|0;H=f[o>>2]|0;f[H+(E<<2)>>2]=(C|0)<(J|0)?J:C;O=H}E=E+1|0}while((E|0)<(f[g>>2]|0));P=O}else P=f[o>>2]|0;E=(f[y+(B<<2)>>2]|0)-(f[P+(B<<2)>>2]|0)|0;H=A+(B<<2)|0;f[H>>2]=E;if((E|0)>=(f[q>>2]|0)){if((E|0)>(f[s>>2]|0)){Q=E-(f[r>>2]|0)|0;N=29}}else{Q=(f[r>>2]|0)+E|0;N=29}if((N|0)==29){N=0;f[H>>2]=Q}B=B+1|0;I=f[g>>2]|0;if((B|0)>=(I|0))break;else D=P}}if((x|0)<=2)break a}mq(i)}while(0);if((e|0)>0)hj(h|0,0,e<<2|0)|0;e=f[g>>2]|0;if((e|0)<=0){$q(h);return 1}i=a+16|0;P=a+32|0;Q=a+12|0;O=a+28|0;L=a+20|0;M=a+24|0;a=0;K=h;G=e;while(1){if((G|0)>0){e=0;do{F=f[K+(e<<2)>>2]|0;d=f[i>>2]|0;if((F|0)>(d|0)){l=f[P>>2]|0;f[l+(e<<2)>>2]=d;R=l}else{l=f[Q>>2]|0;d=f[P>>2]|0;f[d+(e<<2)>>2]=(F|0)<(l|0)?l:F;R=d}e=e+1|0}while((e|0)<(f[g>>2]|0));S=R}else S=f[P>>2]|0;e=(f[b+(a<<2)>>2]|0)-(f[S+(a<<2)>>2]|0)|0;d=c+(a<<2)|0;f[d>>2]=e;if((e|0)>=(f[O>>2]|0)){if((e|0)>(f[M>>2]|0)){T=e-(f[L>>2]|0)|0;N=56}}else{T=(f[L>>2]|0)+e|0;N=56}if((N|0)==56){N=0;f[d>>2]=T}a=a+1|0;G=f[g>>2]|0;if((a|0)>=(G|0))break;else K=S}$q(h);return 1}function Cc(a,b,c,d,e,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0;g=a+8|0;Ah(g,b,d,e);d=e>>>0>1073741823?-1:e<<2;h=_q(d)|0;hj(h|0,0,d|0)|0;d=f[a+48>>2]|0;i=f[a+56>>2]|0;j=f[i>>2]|0;k=(f[i+4>>2]|0)-j|0;l=k>>2;a:do if((k|0)>4){m=f[a+52>>2]|0;n=a+16|0;o=a+32|0;p=a+12|0;q=a+28|0;r=a+20|0;s=a+24|0;t=d+64|0;u=d+28|0;v=(e|0)>0;w=j;x=l;while(1){y=x;x=x+-1|0;if(l>>>0<=x>>>0)break;z=f[w+(x<<2)>>2]|0;A=X(x,e)|0;if((((z|0)!=-1?(f[(f[d>>2]|0)+(z>>>5<<2)>>2]&1<<(z&31)|0)==0:0)?(B=f[(f[(f[t>>2]|0)+12>>2]|0)+(z<<2)>>2]|0,(B|0)!=-1):0)?(z=f[u>>2]|0,C=f[m>>2]|0,D=f[C+(f[z+(B<<2)>>2]<<2)>>2]|0,E=B+1|0,F=f[C+(f[z+((((E>>>0)%3|0|0)==0?B+-2|0:E)<<2)>>2]<<2)>>2]|0,E=f[C+(f[z+((((B>>>0)%3|0|0)==0?2:-1)+B<<2)>>2]<<2)>>2]|0,(D|0)<(x|0)&(F|0)<(x|0)&(E|0)<(x|0)):0){B=X(D,e)|0;D=X(F,e)|0;F=X(E,e)|0;if(v){E=0;do{f[h+(E<<2)>>2]=(f[b+(E+F<<2)>>2]|0)+(f[b+(E+D<<2)>>2]|0)-(f[b+(E+B<<2)>>2]|0);E=E+1|0}while((E|0)!=(e|0))}E=b+(A<<2)|0;B=c+(A<<2)|0;D=f[g>>2]|0;if((D|0)>0){F=0;z=h;C=D;while(1){if((C|0)>0){D=0;do{G=f[z+(D<<2)>>2]|0;H=f[n>>2]|0;if((G|0)>(H|0)){I=f[o>>2]|0;f[I+(D<<2)>>2]=H;J=I}else{I=f[p>>2]|0;H=f[o>>2]|0;f[H+(D<<2)>>2]=(G|0)<(I|0)?I:G;J=H}D=D+1|0}while((D|0)<(f[g>>2]|0));K=J}else K=f[o>>2]|0;D=(f[E+(F<<2)>>2]|0)-(f[K+(F<<2)>>2]|0)|0;H=B+(F<<2)|0;f[H>>2]=D;if((D|0)>=(f[q>>2]|0)){if((D|0)>(f[s>>2]|0)){L=D-(f[r>>2]|0)|0;M=39}}else{L=(f[r>>2]|0)+D|0;M=39}if((M|0)==39){M=0;f[H>>2]=L}F=F+1|0;C=f[g>>2]|0;if((F|0)>=(C|0))break;else z=K}}}else M=13;if((M|0)==13?(M=0,z=b+(A<<2)|0,C=c+(A<<2)|0,F=f[g>>2]|0,(F|0)>0):0){B=0;E=b+((X(y+-2|0,e)|0)<<2)|0;H=F;while(1){if((H|0)>0){F=0;do{D=f[E+(F<<2)>>2]|0;G=f[n>>2]|0;if((D|0)>(G|0)){I=f[o>>2]|0;f[I+(F<<2)>>2]=G;N=I}else{I=f[p>>2]|0;G=f[o>>2]|0;f[G+(F<<2)>>2]=(D|0)<(I|0)?I:D;N=G}F=F+1|0}while((F|0)<(f[g>>2]|0));O=N}else O=f[o>>2]|0;F=(f[z+(B<<2)>>2]|0)-(f[O+(B<<2)>>2]|0)|0;G=C+(B<<2)|0;f[G>>2]=F;if((F|0)>=(f[q>>2]|0)){if((F|0)>(f[s>>2]|0)){P=F-(f[r>>2]|0)|0;M=26}}else{P=(f[r>>2]|0)+F|0;M=26}if((M|0)==26){M=0;f[G>>2]=P}B=B+1|0;H=f[g>>2]|0;if((B|0)>=(H|0))break;else E=O}}if((y|0)<=2)break a}mq(i)}while(0);if((e|0)>0)hj(h|0,0,e<<2|0)|0;e=f[g>>2]|0;if((e|0)<=0){$q(h);return 1}i=a+16|0;O=a+32|0;P=a+12|0;N=a+28|0;K=a+20|0;L=a+24|0;a=0;J=h;d=e;while(1){if((d|0)>0){e=0;do{l=f[J+(e<<2)>>2]|0;j=f[i>>2]|0;if((l|0)>(j|0)){k=f[O>>2]|0;f[k+(e<<2)>>2]=j;Q=k}else{k=f[P>>2]|0;j=f[O>>2]|0;f[j+(e<<2)>>2]=(l|0)<(k|0)?k:l;Q=j}e=e+1|0}while((e|0)<(f[g>>2]|0));R=Q}else R=f[O>>2]|0;e=(f[b+(a<<2)>>2]|0)-(f[R+(a<<2)>>2]|0)|0;j=c+(a<<2)|0;f[j>>2]=e;if((e|0)>=(f[N>>2]|0)){if((e|0)>(f[L>>2]|0)){S=e-(f[K>>2]|0)|0;M=53}}else{S=(f[K>>2]|0)+e|0;M=53}if((M|0)==53){M=0;f[j>>2]=S}a=a+1|0;d=f[g>>2]|0;if((a|0)>=(d|0))break;else J=R}$q(h);return 1}function Dc(a,c,d,e,g){a=a|0;c=c|0;d=d|0;e=e|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,J=0;h=u;u=u+48|0;i=h+28|0;j=h+24|0;k=h;l=h+12|0;m=h+40|0;if((c|0)<0){n=0;u=h;return n|0}if(!c){n=1;u=h;return n|0}o=(d|0)>1;p=o?d:1;f[k>>2]=0;d=k+4|0;f[d>>2]=0;f[k+8>>2]=0;$j(k,c);q=k+8|0;if(o){o=0;r=0;while(1){s=1;t=f[a+(r<<2)>>2]|0;do{v=f[a+(s+r<<2)>>2]|0;t=t>>>0<v>>>0?v:t;s=s+1|0}while((s|0)!=(p|0));s=(_(t|0)|0)^31;v=t>>>0>o>>>0?t:o;w=(t|0)==0?1:s+1|0;f[i>>2]=w;s=f[d>>2]|0;if(s>>>0<(f[q>>2]|0)>>>0){f[s>>2]=w;f[d>>2]=s+4}else Ci(k,i);r=r+p|0;if((r|0)>=(c|0)){x=v;break}else o=v}}else{o=0;r=0;while(1){v=f[a+(o<<2)>>2]|0;s=(_(v|0)|0)^31;w=v>>>0>r>>>0?v:r;y=(v|0)==0?1:s+1|0;f[i>>2]=y;s=f[d>>2]|0;if(s>>>0<(f[q>>2]|0)>>>0){f[s>>2]=y;f[d>>2]=s+4}else Ci(k,i);o=o+p|0;if((o|0)>=(c|0)){x=w;break}else r=w}}f[l>>2]=0;r=l+4|0;f[r>>2]=0;f[l+8>>2]=0;o=f[k>>2]|0;q=(f[d>>2]|0)-o|0;w=q>>2;if(w){if(w>>>0>1073741823)mq(l);s=dn(q)|0;f[r>>2]=s;f[l>>2]=s;f[l+8>>2]=s+(w<<2);w=s;if((q|0)>0){y=s+(q>>>2<<2)|0;Rg(s|0,o|0,q|0)|0;f[r>>2]=y;q=y-w>>2;if((y|0)==(s|0)){z=q;A=s;B=0;C=0}else{y=0;o=0;v=0;while(1){D=Tn(o|0,v|0,f[s+(y<<2)>>2]|0,0)|0;E=I;y=y+1|0;if(y>>>0>=q>>>0){z=q;A=s;B=D;C=E;break}else{o=D;v=E}}}}else{F=w;G=18}}else{F=0;G=18}if((G|0)==18){z=0;A=F;B=0;C=0}F=rg(A,z,32,i)|0;z=I;A=f[i>>2]<<3;w=Rn(A|0,((A|0)<0)<<31>>31|0,1)|0;A=I;v=on(B|0,C|0,p|0,0)|0;C=Tn(F|0,z|0,v|0,I|0)|0;v=Tn(C|0,I|0,w|0,A|0)|0;A=I;w=f[l>>2]|0;if(w|0){l=f[r>>2]|0;if((l|0)!=(w|0))f[r>>2]=l+(~((l+-4-w|0)>>>2)<<2);br(w)}w=rg(a,c,x,i)|0;l=f[i>>2]|0;r=((x-l|0)/64|0)+l<<3;C=l<<3;z=Tn(w|0,I|0,C|0,((C|0)<0)<<31>>31|0)|0;C=Tn(z|0,I|0,r|0,((r|0)<0)<<31>>31|0)|0;r=I;z=(_((x>>>0>1?x:1)|0)|0)^30;if(e){f[i>>2]=0;f[i+4>>2]=0;f[i+8>>2]=0;w=dn(32)|0;f[i>>2]=w;f[i+8>>2]=-2147483616;f[i+4>>2]=22;F=w;B=13044;o=F+22|0;do{b[F>>0]=b[B>>0]|0;F=F+1|0;B=B+1|0}while((F|0)<(o|0));b[w+22>>0]=0;w=(sh(e,i)|0)==0;if((b[i+11>>0]|0)<0)br(f[i>>2]|0);if(!w){f[i>>2]=0;f[i+4>>2]=0;f[i+8>>2]=0;w=dn(32)|0;f[i>>2]=w;f[i+8>>2]=-2147483616;f[i+4>>2]=22;F=w;B=13044;o=F+22|0;do{b[F>>0]=b[B>>0]|0;F=F+1|0;B=B+1|0}while((F|0)<(o|0));b[w+22>>0]=0;w=Ck(e,i)|0;if((b[i+11>>0]|0)<0)br(f[i>>2]|0);H=w}else G=32}else G=32;if((G|0)==32)H=z>>>0<18&((A|0)>(r|0)|(A|0)==(r|0)&v>>>0>=C>>>0)&1;b[m>>0]=H;C=g+16|0;v=f[C+4>>2]|0;if(!((v|0)>0|(v|0)==0&(f[C>>2]|0)>>>0>0)){f[j>>2]=f[g+4>>2];f[i>>2]=f[j>>2];ye(g,i,m,m+1|0)|0}switch(H|0){case 0:{J=md(a,c,p,k,g)|0;break}case 1:{J=Nc(a,c,x,l,e,g)|0;break}default:J=0}g=f[k>>2]|0;if(g|0){k=f[d>>2]|0;if((k|0)!=(g|0))f[d>>2]=k+(~((k+-4-g|0)>>>2)<<2);br(g)}n=J;u=h;return n|0}function Ec(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;if((b|0)<0)return;c=a+12|0;d=f[c>>2]|0;e=f[a+8>>2]|0;g=e;h=d;if(d-e>>2>>>0<=b>>>0)return;e=g+(b<<2)|0;d=f[(f[e>>2]|0)+56>>2]|0;i=f[(f[g+(b<<2)>>2]|0)+60>>2]|0;g=e+4|0;if((g|0)!=(h|0)){j=g;g=e;do{k=f[j>>2]|0;f[j>>2]=0;l=f[g>>2]|0;f[g>>2]=k;if(l|0){k=l+88|0;m=f[k>>2]|0;f[k>>2]=0;if(m|0){k=f[m+8>>2]|0;if(k|0){n=m+12|0;if((f[n>>2]|0)!=(k|0))f[n>>2]=k;br(k)}br(m)}m=f[l+68>>2]|0;if(m|0){k=l+72|0;n=f[k>>2]|0;if((n|0)!=(m|0))f[k>>2]=n+(~((n+-4-m|0)>>>2)<<2);br(m)}m=l+64|0;n=f[m>>2]|0;f[m>>2]=0;if(n|0){m=f[n>>2]|0;if(m|0){k=n+4|0;if((f[k>>2]|0)!=(m|0))f[k>>2]=m;br(m)}br(n)}br(l)}j=j+4|0;g=g+4|0}while((j|0)!=(h|0));j=f[c>>2]|0;if((j|0)!=(g|0)){o=g;p=j;q=24}}else{o=e;p=h;q=24}if((q|0)==24){q=p;do{p=q+-4|0;f[c>>2]=p;h=f[p>>2]|0;f[p>>2]=0;if(h|0){p=h+88|0;e=f[p>>2]|0;f[p>>2]=0;if(e|0){p=f[e+8>>2]|0;if(p|0){j=e+12|0;if((f[j>>2]|0)!=(p|0))f[j>>2]=p;br(p)}br(e)}e=f[h+68>>2]|0;if(e|0){p=h+72|0;j=f[p>>2]|0;if((j|0)!=(e|0))f[p>>2]=j+(~((j+-4-e|0)>>>2)<<2);br(e)}e=h+64|0;j=f[e>>2]|0;f[e>>2]=0;if(j|0){e=f[j>>2]|0;if(e|0){p=j+4|0;if((f[p>>2]|0)!=(e|0))f[p>>2]=e;br(e)}br(j)}br(h)}q=f[c>>2]|0}while((q|0)!=(o|0))}o=f[a+4>>2]|0;a:do if(o|0){q=o+44|0;c=f[q>>2]|0;h=f[o+40>>2]|0;while(1){if((h|0)==(c|0))break a;r=h+4|0;if((f[(f[h>>2]|0)+40>>2]|0)==(i|0))break;else h=r}if((r|0)!=(c|0)){j=r;e=h;do{p=f[j>>2]|0;f[j>>2]=0;g=f[e>>2]|0;f[e>>2]=p;if(g|0){Qi(g);br(g)}j=j+4|0;e=e+4|0}while((j|0)!=(c|0));j=f[q>>2]|0;if((j|0)==(e|0))break;else{s=e;t=j}}else{s=h;t=c}j=t;do{g=j+-4|0;f[q>>2]=g;p=f[g>>2]|0;f[g>>2]=0;if(p|0){Qi(p);br(p)}j=f[q>>2]|0}while((j|0)!=(s|0))}while(0);b:do if((d|0)<5){s=f[a+20+(d*12|0)>>2]|0;t=a+20+(d*12|0)+4|0;r=f[t>>2]|0;i=r;c:do if((s|0)==(r|0))u=s;else{o=s;while(1){if((f[o>>2]|0)==(b|0)){u=o;break c}o=o+4|0;if((o|0)==(r|0))break b}}while(0);if((u|0)!=(r|0)){s=u+4|0;o=i-s|0;j=o>>2;if(!j)v=r;else{Xl(u|0,s|0,o|0)|0;v=f[t>>2]|0}o=u+(j<<2)|0;if((v|0)!=(o|0))f[t>>2]=v+(~((v+-4-o|0)>>>2)<<2)}}while(0);v=f[a+24>>2]|0;u=f[a+20>>2]|0;d=u;if((v|0)!=(u|0)){o=v-u>>2;u=0;do{v=d+(u<<2)|0;j=f[v>>2]|0;if((j|0)>(b|0))f[v>>2]=j+-1;u=u+1|0}while(u>>>0<o>>>0)}o=f[a+36>>2]|0;u=f[a+32>>2]|0;d=u;if((o|0)!=(u|0)){j=o-u>>2;u=0;do{o=d+(u<<2)|0;v=f[o>>2]|0;if((v|0)>(b|0))f[o>>2]=v+-1;u=u+1|0}while(u>>>0<j>>>0)}j=f[a+48>>2]|0;u=f[a+44>>2]|0;d=u;if((j|0)!=(u|0)){v=j-u>>2;u=0;do{j=d+(u<<2)|0;o=f[j>>2]|0;if((o|0)>(b|0))f[j>>2]=o+-1;u=u+1|0}while(u>>>0<v>>>0)}v=f[a+60>>2]|0;u=f[a+56>>2]|0;d=u;if((v|0)!=(u|0)){o=v-u>>2;u=0;do{v=d+(u<<2)|0;j=f[v>>2]|0;if((j|0)>(b|0))f[v>>2]=j+-1;u=u+1|0}while(u>>>0<o>>>0)}o=f[a+72>>2]|0;u=f[a+68>>2]|0;a=u;if((o|0)==(u|0))return;d=o-u>>2;u=0;do{o=a+(u<<2)|0;j=f[o>>2]|0;if((j|0)>(b|0))f[o>>2]=j+-1;u=u+1|0}while(u>>>0<d>>>0);return}function Fc(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0;d=u;u=u+32|0;e=d+16|0;g=d;h=c+4|0;i=f[(f[h>>2]|0)+48>>2]|0;j=c+12|0;c=f[j>>2]|0;k=dn(32)|0;f[e>>2]=k;f[e+8>>2]=-2147483616;f[e+4>>2]=17;l=k;m=12932;n=l+17|0;do{b[l>>0]=b[m>>0]|0;l=l+1|0;m=m+1|0}while((l|0)<(n|0));b[k+17>>0]=0;k=i+16|0;o=f[k>>2]|0;if(o){p=k;q=o;a:while(1){o=q;while(1){if((f[o+16>>2]|0)>=(c|0))break;r=f[o+4>>2]|0;if(!r){s=p;break a}else o=r}q=f[o>>2]|0;if(!q){s=o;break}else p=o}if(((s|0)!=(k|0)?(c|0)>=(f[s+16>>2]|0):0)?(c=s+20|0,(sh(c,e)|0)!=0):0)t=yk(c,e,-1)|0;else v=10}else v=10;if((v|0)==10)t=yk(i,e,-1)|0;if((b[e+11>>0]|0)<0)br(f[e>>2]|0);i=(1<<t)+-1|0;f[e>>2]=-1;f[e+4>>2]=-1;f[e+8>>2]=-1;f[e+12>>2]=-1;if(i&1|0?(t=(_(i|0)|0)^31,(t+-1|0)>>>0<=28):0){f[e>>2]=t+1;i=2<<t;f[e+4>>2]=i+-1;t=i+-2|0;f[e+8>>2]=t;f[e+12>>2]=(t|0)/2|0}t=Ki(f[j>>2]|0,f[h>>2]|0)|0;i=f[(f[h>>2]|0)+48>>2]|0;c=f[j>>2]|0;s=dn(32)|0;f[g>>2]=s;f[g+8>>2]=-2147483616;f[g+4>>2]=17;l=s;m=12804;n=l+17|0;do{b[l>>0]=b[m>>0]|0;l=l+1|0;m=m+1|0}while((l|0)<(n|0));b[s+17>>0]=0;s=i+16|0;m=f[s>>2]|0;if(m){l=s;n=m;b:while(1){m=n;while(1){if((f[m+16>>2]|0)>=(c|0))break;k=f[m+4>>2]|0;if(!k){w=l;break b}else m=k}n=f[m>>2]|0;if(!n){w=m;break}else l=m}if(((w|0)!=(s|0)?(c|0)>=(f[w+16>>2]|0):0)?(c=w+20|0,(sh(c,g)|0)!=0):0)x=yk(c,g,t)|0;else v=25}else v=25;if((v|0)==25)x=yk(i,g,t)|0;if((b[g+11>>0]|0)<0)br(f[g>>2]|0);switch(x|0){case 6:{x=f[j>>2]|0;t=f[h>>2]|0;i=f[(f[(f[t+4>>2]|0)+8>>2]|0)+(x<<2)>>2]|0;do if((Qa[f[(f[t>>2]|0)+8>>2]&127](t)|0)==1){rf(g,t,6,x,e,514);c=f[g>>2]|0;if(!c){f[g>>2]=0;y=g;v=34;break}else{z=g;A=c;break}}else{y=g;v=34}while(0);if((v|0)==34){x=dn(24)|0;f[x+4>>2]=i;i=x+8|0;f[i>>2]=f[e>>2];f[i+4>>2]=f[e+4>>2];f[i+8>>2]=f[e+8>>2];f[i+12>>2]=f[e+12>>2];f[x>>2]=2320;i=x;f[g>>2]=i;z=y;A=i}f[a>>2]=A;f[z>>2]=0;u=d;return}case 0:{z=f[j>>2]|0;j=f[h>>2]|0;h=f[(f[(f[j+4>>2]|0)+8>>2]|0)+(z<<2)>>2]|0;do if((Qa[f[(f[j>>2]|0)+8>>2]&127](j)|0)==1){rf(g,j,0,z,e,514);A=f[g>>2]|0;if(!A){f[g>>2]=0;B=g;v=41;break}else{C=g;D=A;break}}else{B=g;v=41}while(0);if((v|0)==41){v=dn(24)|0;f[v+4>>2]=h;h=v+8|0;f[h>>2]=f[e>>2];f[h+4>>2]=f[e+4>>2];f[h+8>>2]=f[e+8>>2];f[h+12>>2]=f[e+12>>2];f[v>>2]=2320;e=v;f[g>>2]=e;C=B;D=e}f[a>>2]=D;f[C>>2]=0;u=d;return}default:{f[a>>2]=0;u=d;return}}}function Gc(a){a=a|0;var b=0,c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0;b=u;u=u+32|0;c=b+20|0;d=b+8|0;e=b;g=a+4|0;h=f[g>>2]|0;i=f[a>>2]|0;j=h-i|0;k=j>>2;f[c>>2]=0;l=c+4|0;f[l>>2]=0;m=c+8|0;f[m>>2]=0;n=i;if(k|0){if((j|0)<0)mq(c);j=((k+-1|0)>>>5)+1|0;o=dn(j<<2)|0;f[c>>2]=o;f[m>>2]=j;f[l>>2]=k;l=k>>>5;hj(o|0,0,l<<2|0)|0;j=k&31;k=o+(l<<2)|0;if(j|0)f[k>>2]=f[k>>2]&~(-1>>>(32-j|0))}f[d>>2]=0;j=d+4|0;f[j>>2]=0;f[d+8>>2]=0;k=a+12|0;l=e+4|0;o=d+8|0;m=n;n=h;h=i;while(1){if((n|0)==(h|0))break;else{p=0;q=0;r=h;s=m}while(1){i=f[c>>2]|0;do if(!(f[i+(q>>>5<<2)>>2]&1<<(q&31))){t=f[d>>2]|0;v=f[j>>2]|0;if((v|0)==(t|0))w=t;else{x=v+(~((v+-8-t|0)>>>3)<<3)|0;f[j>>2]=x;w=x}x=q;while(1){v=x+1|0;y=((v>>>0)%3|0|0)==0?x+-2|0:v;if((y|0)==-1){z=x;A=r;B=i;C=s;D=t;E=w;break}v=f[(f[k>>2]|0)+(y<<2)>>2]|0;y=v+1|0;if((v|0)==-1){z=x;A=r;B=i;C=s;D=t;E=w;break}F=((y>>>0)%3|0|0)==0?v+-2|0:y;if(!((F|0)!=(q|0)&(F|0)!=-1)){z=x;A=r;B=i;C=s;D=t;E=w;break}if(!(f[i+(F>>>5<<2)>>2]&1<<(F&31)))x=F;else{z=x;A=r;B=i;C=s;D=t;E=w;break}}a:while(1){t=B+(z>>>5<<2)|0;f[t>>2]=f[t>>2]|1<<(z&31);t=z+1|0;F=((t>>>0)%3|0|0)==0?z+-2|0:t;t=f[C+(F<<2)>>2]|0;G=(((z>>>0)%3|0|0)==0?2:-1)+z|0;if((D|0)!=(E|0))if((G|0)==-1){y=D;do{if((f[y>>2]|0)==(t|0)?(v=f[y+4>>2]|0,(v|0)!=-1):0){H=v;I=-1;J=-1;K=25;break a}y=y+8|0}while((y|0)!=(E|0))}else{y=D;do{if((f[y>>2]|0)==(t|0)?(L=f[y+4>>2]|0,M=f[(f[k>>2]|0)+(G<<2)>>2]|0,(M|0)!=(L|0)):0){K=24;break a}y=y+8|0}while((y|0)!=(E|0))}f[e>>2]=0;f[e>>2]=f[C+(G<<2)>>2];f[l>>2]=F;if((E|0)==(f[o>>2]|0))ei(d,e);else{y=e;t=f[y+4>>2]|0;v=E;f[v>>2]=f[y>>2];f[v+4>>2]=t;f[j>>2]=(f[j>>2]|0)+8}if((G|0)==-1){K=38;break}t=f[(f[k>>2]|0)+(G<<2)>>2]|0;if((t|0)==-1){K=38;break}v=t+(((t>>>0)%3|0|0)==0?2:-1)|0;if(!((v|0)!=(x|0)&(v|0)!=-1)){K=40;break}t=f[a>>2]|0;z=v;A=t;B=f[c>>2]|0;C=t;D=f[d>>2]|0;E=f[j>>2]|0}if((K|0)==24){K=0;if((L|0)==-1){N=-1;O=-1;P=M;Q=G}else{H=L;I=M;J=G;K=25}}else if((K|0)==38){K=0;K=40}if((K|0)==25){K=0;N=H;O=f[(f[k>>2]|0)+(H<<2)>>2]|0;P=I;Q=J}else if((K|0)==40){K=0;R=p;S=f[a>>2]|0;break}if((P|0)!=-1)f[(f[k>>2]|0)+(P<<2)>>2]=-1;x=f[k>>2]|0;if((O|0)!=-1)f[x+(O<<2)>>2]=-1;f[x+(Q<<2)>>2]=-1;f[x+(N<<2)>>2]=-1;R=1;S=A}else{R=p;S=r}while(0);q=q+1|0;T=f[g>>2]|0;s=S;if(q>>>0>=T-S>>2>>>0)break;else{p=R;r=S}}if(R){m=s;n=T;h=S}else break}S=f[d>>2]|0;if(S|0){d=f[j>>2]|0;if((d|0)!=(S|0))f[j>>2]=d+(~((d+-8-S|0)>>>3)<<3);br(S)}S=f[c>>2]|0;if(!S){u=b;return 1}br(S);u=b;return 1}function Hc(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0;e=a+8|0;a:do if(f[e>>2]|0?(g=f[a>>2]|0,h=a+4|0,f[a>>2]=h,f[(f[h>>2]|0)+8>>2]=0,f[h>>2]=0,f[e>>2]=0,i=f[g+4>>2]|0,j=(i|0)==0?g:i,j|0):0){i=a+4|0;g=j;j=f[c>>2]|0;while(1){if((j|0)==(f[d>>2]|0))break;k=g+16|0;Ql(k,j+16|0)|0;Ql(g+28|0,j+28|0)|0;l=g+8|0;m=f[l>>2]|0;do if(m){n=f[m>>2]|0;if((n|0)==(g|0)){f[m>>2]=0;o=f[m+4>>2]|0;if(!o){p=m;break}else q=o;while(1){o=f[q>>2]|0;if(o|0){q=o;continue}o=f[q+4>>2]|0;if(!o)break;else q=o}p=q;break}else{f[m+4>>2]=0;if(!n){p=m;break}else r=n;while(1){o=f[r>>2]|0;if(o|0){r=o;continue}o=f[r+4>>2]|0;if(!o)break;else r=o}p=r;break}}else p=0;while(0);m=f[h>>2]|0;do if(m){n=b[k+11>>0]|0;o=n<<24>>24<0;s=o?f[g+20>>2]|0:n&255;n=o?f[k>>2]|0:k;o=m;while(1){t=o+16|0;u=b[t+11>>0]|0;v=u<<24>>24<0;w=v?f[o+20>>2]|0:u&255;u=w>>>0<s>>>0?w:s;if((u|0)!=0?(x=Pk(n,v?f[t>>2]|0:t,u)|0,(x|0)!=0):0)if((x|0)<0)y=22;else y=24;else if(s>>>0<w>>>0)y=22;else y=24;if((y|0)==22){y=0;w=f[o>>2]|0;if(!w){y=23;break}else z=w}else if((y|0)==24){y=0;A=o+4|0;w=f[A>>2]|0;if(!w){y=26;break}else z=w}o=z}if((y|0)==23){y=0;B=o;C=o;break}else if((y|0)==26){y=0;B=A;C=o;break}}else{B=h;C=h}while(0);f[g>>2]=0;f[g+4>>2]=0;f[l>>2]=C;f[B>>2]=g;m=f[f[a>>2]>>2]|0;if(!m)D=g;else{f[a>>2]=m;D=f[B>>2]|0}Ae(f[i>>2]|0,D);f[e>>2]=(f[e>>2]|0)+1;m=f[j+4>>2]|0;if(!m){k=j+8|0;s=f[k>>2]|0;if((f[s>>2]|0)==(j|0))E=s;else{s=k;do{k=f[s>>2]|0;s=k+8|0;n=f[s>>2]|0}while((f[n>>2]|0)!=(k|0));E=n}}else{s=m;while(1){l=f[s>>2]|0;if(!l)break;else s=l}E=s}f[c>>2]=E;if(!p)break a;else{g=p;j=E}}j=f[g+8>>2]|0;if(!j)F=g;else{i=j;while(1){j=f[i+8>>2]|0;if(!j)break;else i=j}F=i}sj(a,F)}while(0);F=f[c>>2]|0;E=f[d>>2]|0;if((F|0)==(E|0))return;else G=F;while(1){Qe(a,G+16|0)|0;F=f[G+4>>2]|0;if(!F){d=G+8|0;p=f[d>>2]|0;if((f[p>>2]|0)==(G|0))H=p;else{p=d;do{d=f[p>>2]|0;p=d+8|0;e=f[p>>2]|0}while((f[e>>2]|0)!=(d|0));H=e}}else{p=F;while(1){i=f[p>>2]|0;if(!i)break;else p=i}H=p}f[c>>2]=H;if((H|0)==(E|0))break;else G=H}return}function Ic(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0;g=u;u=u+16|0;h=g;i=c+4|0;f[h>>2]=0;f[h+4>>2]=0;f[h+8>>2]=0;j=dn(16)|0;f[h>>2]=j;f[h+8>>2]=-2147483632;f[h+4>>2]=15;k=j;l=12916;m=k+15|0;do{b[k>>0]=b[l>>0]|0;k=k+1|0;l=l+1|0}while((k|0)<(m|0));b[j+15>>0]=0;j=yk(i,h,-1)|0;if((b[h+11>>0]|0)<0)br(f[h>>2]|0);switch(j|0){case 0:{n=dn(56)|0;k=n;m=k+56|0;do{f[k>>2]=0;k=k+4|0}while((k|0)<(m|0));zn(n);o=3728;p=n;break}case -1:{if((Yh(i)|0)==10){n=dn(56)|0;k=n;m=k+56|0;do{f[k>>2]=0;k=k+4|0}while((k|0)<(m|0));zn(n);o=3728;p=n}else q=6;break}default:q=6}a:do if((q|0)==6){n=d+8|0;r=d+12|0;s=f[r>>2]|0;t=f[n>>2]|0;b:do if((s-t|0)>0){v=h+8|0;w=h+4|0;x=c+20|0;y=h+11|0;z=0;A=t;B=s;c:while(1){C=f[(f[A+(z<<2)>>2]|0)+28>>2]|0;switch(C|0){case 9:{q=12;break}case 6:case 5:case 4:case 2:{D=A;E=B;break}default:{if((C|2|0)!=3)break c;if((C|0)==9)q=12;else{D=A;E=B}}}if((q|0)==12){q=0;f[h>>2]=0;f[h+4>>2]=0;f[h+8>>2]=0;C=dn(32)|0;f[h>>2]=C;f[v>>2]=-2147483616;f[w>>2]=17;k=C;l=12932;m=k+17|0;do{b[k>>0]=b[l>>0]|0;k=k+1|0;l=l+1|0}while((k|0)<(m|0));b[C+17>>0]=0;F=f[x>>2]|0;if(F){G=x;H=F;d:while(1){F=H;while(1){if((f[F+16>>2]|0)>=0)break;I=f[F+4>>2]|0;if(!I){J=G;break d}else F=I}H=f[F>>2]|0;if(!H){J=F;break}else G=F}if(((J|0)!=(x|0)?(f[J+16>>2]|0)<=0:0)?(G=J+20|0,(sh(G,h)|0)!=0):0)K=yk(G,h,-1)|0;else q=21}else q=21;if((q|0)==21){q=0;K=yk(i,h,-1)|0}if((b[y>>0]|0)<0)br(f[h>>2]|0);if((K|0)<1)break;D=f[n>>2]|0;E=f[r>>2]|0}z=z+1|0;if((z|0)>=(E-D>>2|0))break b;else{A=D;B=E}}if((j|0)!=1){B=dn(56)|0;k=B;m=k+56|0;do{f[k>>2]=0;k=k+4|0}while((k|0)<(m|0));zn(B);o=3728;p=B;break a}f[h>>2]=0;f[h+4>>2]=0;f[h+8>>2]=0;A=dn(32)|0;f[h>>2]=A;f[h+8>>2]=-2147483616;f[h+4>>2]=24;k=A;l=12950;m=k+24|0;do{b[k>>0]=b[l>>0]|0;k=k+1|0;l=l+1|0}while((k|0)<(m|0));b[A+24>>0]=0;f[a>>2]=-1;dj(a+4|0,h);if((b[h+11>>0]|0)<0)br(f[h>>2]|0);u=g;return}while(0);r=dn(56)|0;k=r;m=k+56|0;do{f[k>>2]=0;k=k+4|0}while((k|0)<(m|0));zn(r);o=3668;p=r}while(0);f[p>>2]=o;tp(p,d);Ad(a,p,i,e);if(!(f[a>>2]|0)){e=a+4|0;if((b[e+11>>0]|0)<0)br(f[e>>2]|0);f[c+40>>2]=f[p+52>>2];f[c+44>>2]=0;f[a>>2]=0;f[a+4>>2]=0;f[a+8>>2]=0;f[a+12>>2]=0}Va[f[(f[p>>2]|0)+4>>2]&127](p);u=g;return}function Jc(a){a=a|0;var b=0,c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0;b=u;u=u+32|0;c=b+4|0;d=b;e=a+16|0;g=f[e>>2]|0;if(g>>>0>112){f[e>>2]=g+-113;g=a+4|0;e=f[g>>2]|0;h=f[e>>2]|0;i=e+4|0;f[g>>2]=i;e=a+8|0;j=f[e>>2]|0;k=a+12|0;l=f[k>>2]|0;m=l;do if((j|0)==(l|0)){n=f[a>>2]|0;o=n;if(i>>>0>n>>>0){p=i;q=((p-o>>2)+1|0)/-2|0;r=i+(q<<2)|0;s=j-p|0;p=s>>2;if(!p)t=i;else{Xl(r|0,i|0,s|0)|0;t=f[g>>2]|0}s=r+(p<<2)|0;f[e>>2]=s;f[g>>2]=t+(q<<2);v=s;break}s=m-o>>1;o=(s|0)==0?1:s;if(o>>>0>1073741823){s=ra(8)|0;Wo(s,14941);f[s>>2]=6944;va(s|0,1080,114)}s=dn(o<<2)|0;q=s;p=s+(o>>>2<<2)|0;r=p;w=s+(o<<2)|0;if((i|0)==(j|0)){x=r;y=n}else{n=p;p=r;o=i;do{f[n>>2]=f[o>>2];n=p+4|0;p=n;o=o+4|0}while((o|0)!=(j|0));x=p;y=f[a>>2]|0}f[a>>2]=q;f[g>>2]=r;f[e>>2]=x;f[k>>2]=w;if(!y)v=x;else{br(y);v=f[e>>2]|0}}else v=j;while(0);f[v>>2]=h;f[e>>2]=(f[e>>2]|0)+4;u=b;return}e=a+8|0;h=f[e>>2]|0;v=a+4|0;j=h-(f[v>>2]|0)|0;y=a+12|0;x=f[y>>2]|0;k=x-(f[a>>2]|0)|0;if(j>>>0>=k>>>0){g=k>>1;k=(g|0)==0?1:g;f[c+12>>2]=0;f[c+16>>2]=a+12;if(k>>>0>1073741823){g=ra(8)|0;Wo(g,14941);f[g>>2]=6944;va(g|0,1080,114)}g=dn(k<<2)|0;f[c>>2]=g;i=g+(j>>2<<2)|0;j=c+8|0;f[j>>2]=i;m=c+4|0;f[m>>2]=i;i=c+12|0;f[i>>2]=g+(k<<2);k=dn(4068)|0;f[d>>2]=k;kg(c,d);d=f[e>>2]|0;while(1){z=f[v>>2]|0;if((d|0)==(z|0))break;k=d+-4|0;dg(c,k);d=k}k=z;z=f[a>>2]|0;f[a>>2]=f[c>>2];f[c>>2]=z;f[v>>2]=f[m>>2];f[m>>2]=k;m=f[e>>2]|0;f[e>>2]=f[j>>2];f[j>>2]=m;g=f[y>>2]|0;f[y>>2]=f[i>>2];f[i>>2]=g;g=m;if((d|0)!=(g|0))f[j>>2]=g+(~((g+-4-k|0)>>>2)<<2);if(z|0)br(z);u=b;return}if((x|0)!=(h|0)){h=dn(4068)|0;f[c>>2]=h;kg(a,c);u=b;return}h=dn(4068)|0;f[c>>2]=h;dg(a,c);c=f[v>>2]|0;h=f[c>>2]|0;x=c+4|0;f[v>>2]=x;c=f[e>>2]|0;z=f[y>>2]|0;k=z;do if((c|0)==(z|0)){g=f[a>>2]|0;j=g;if(x>>>0>g>>>0){d=x;m=((d-j>>2)+1|0)/-2|0;i=x+(m<<2)|0;t=c-d|0;d=t>>2;if(!d)A=x;else{Xl(i|0,x|0,t|0)|0;A=f[v>>2]|0}t=i+(d<<2)|0;f[e>>2]=t;f[v>>2]=A+(m<<2);B=t;break}t=k-j>>1;j=(t|0)==0?1:t;if(j>>>0>1073741823){t=ra(8)|0;Wo(t,14941);f[t>>2]=6944;va(t|0,1080,114)}t=dn(j<<2)|0;m=t;d=t+(j>>>2<<2)|0;i=d;l=t+(j<<2)|0;if((x|0)==(c|0)){C=i;D=g}else{g=d;d=i;j=x;do{f[g>>2]=f[j>>2];g=d+4|0;d=g;j=j+4|0}while((j|0)!=(c|0));C=d;D=f[a>>2]|0}f[a>>2]=m;f[v>>2]=i;f[e>>2]=C;f[y>>2]=l;if(!D)B=C;else{br(D);B=f[e>>2]|0}}else B=c;while(0);f[B>>2]=h;f[e>>2]=(f[e>>2]|0)+4;u=b;return}function Kc(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0;e=u;u=u+16|0;g=e+8|0;h=e+4|0;i=e;j=a+64|0;k=f[j>>2]|0;if((f[k+28>>2]|0)==(f[k+24>>2]|0)){u=e;return}l=c+96|0;c=a+52|0;m=d+84|0;n=d+68|0;d=a+56|0;o=a+60|0;p=a+12|0;q=a+28|0;r=a+40|0;s=a+44|0;t=a+48|0;v=0;w=0;x=k;while(1){k=f[(f[x+24>>2]|0)+(w<<2)>>2]|0;if((k|0)==-1){y=v;z=x}else{A=v+1|0;B=f[(f[l>>2]|0)+(((k|0)/3|0)*12|0)+(((k|0)%3|0)<<2)>>2]|0;if(!(b[m>>0]|0))C=f[(f[n>>2]|0)+(B<<2)>>2]|0;else C=B;f[g>>2]=C;B=f[d>>2]|0;if(B>>>0<(f[o>>2]|0)>>>0){f[B>>2]=C;f[d>>2]=B+4}else Ci(c,g);f[g>>2]=k;f[h>>2]=0;a:do if(!(f[(f[p>>2]|0)+(w>>>5<<2)>>2]&1<<(w&31)))D=k;else{B=k+1|0;E=((B>>>0)%3|0|0)==0?k+-2|0:B;if(((E|0)!=-1?(f[(f[a>>2]|0)+(E>>>5<<2)>>2]&1<<(E&31)|0)==0:0)?(B=f[(f[(f[j>>2]|0)+12>>2]|0)+(E<<2)>>2]|0,E=B+1|0,(B|0)!=-1):0){F=((E>>>0)%3|0|0)==0?B+-2|0:E;f[h>>2]=F;if((F|0)==-1){D=k;break}else G=F;while(1){f[g>>2]=G;F=G+1|0;E=((F>>>0)%3|0|0)==0?G+-2|0:F;if((E|0)==-1)break;if(f[(f[a>>2]|0)+(E>>>5<<2)>>2]&1<<(E&31)|0)break;F=f[(f[(f[j>>2]|0)+12>>2]|0)+(E<<2)>>2]|0;E=F+1|0;if((F|0)==-1)break;B=((E>>>0)%3|0|0)==0?F+-2|0:E;f[h>>2]=B;if((B|0)==-1){D=G;break a}else G=B}f[h>>2]=-1;D=G;break}f[h>>2]=-1;D=k}while(0);f[(f[q>>2]|0)+(D<<2)>>2]=v;k=f[s>>2]|0;if((k|0)==(f[t>>2]|0))Ci(r,g);else{f[k>>2]=f[g>>2];f[s>>2]=k+4}k=f[j>>2]|0;B=f[g>>2]|0;b:do if(((B|0)!=-1?(E=(((B>>>0)%3|0|0)==0?2:-1)+B|0,(E|0)!=-1):0)?(F=f[(f[k+12>>2]|0)+(E<<2)>>2]|0,(F|0)!=-1):0){E=F+(((F>>>0)%3|0|0)==0?2:-1)|0;f[h>>2]=E;if((E|0)!=-1&(E|0)!=(B|0)){F=A;H=v;I=E;while(1){E=I+1|0;J=((E>>>0)%3|0|0)==0?I+-2|0:E;do if(f[(f[a>>2]|0)+(J>>>5<<2)>>2]&1<<(J&31)){E=F+1|0;K=f[(f[l>>2]|0)+(((I|0)/3|0)*12|0)+(((I|0)%3|0)<<2)>>2]|0;if(!(b[m>>0]|0))L=f[(f[n>>2]|0)+(K<<2)>>2]|0;else L=K;f[i>>2]=L;K=f[d>>2]|0;if(K>>>0<(f[o>>2]|0)>>>0){f[K>>2]=L;f[d>>2]=K+4}else Ci(c,i);K=f[s>>2]|0;if((K|0)==(f[t>>2]|0)){Ci(r,h);M=E;N=F;break}else{f[K>>2]=f[h>>2];f[s>>2]=K+4;M=E;N=F;break}}else{M=F;N=H}while(0);f[(f[q>>2]|0)+(f[h>>2]<<2)>>2]=N;O=f[j>>2]|0;J=f[h>>2]|0;if((J|0)==-1)break;E=(((J>>>0)%3|0|0)==0?2:-1)+J|0;if((E|0)==-1)break;J=f[(f[O+12>>2]|0)+(E<<2)>>2]|0;if((J|0)==-1)break;I=J+(((J>>>0)%3|0|0)==0?2:-1)|0;f[h>>2]=I;if(!((I|0)!=-1?(I|0)!=(f[g>>2]|0):0)){P=M;Q=O;break b}else{F=M;H=N}}f[h>>2]=-1;P=M;Q=O}else{P=A;Q=k}}else R=28;while(0);if((R|0)==28){R=0;f[h>>2]=-1;P=A;Q=k}y=P;z=Q}w=w+1|0;if(w>>>0>=(f[z+28>>2]|0)-(f[z+24>>2]|0)>>2>>>0)break;else{v=y;x=z}}u=e;return}function Lc(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,i=0,j=0.0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,D=0,E=0,F=0;switch(c|0){case 0:{e=-149;g=24;i=4;break}case 1:{e=-1074;g=53;i=4;break}case 2:{e=-1074;g=53;i=4;break}default:j=0.0}a:do if((i|0)==4){c=a+4|0;k=a+100|0;do{l=f[c>>2]|0;if(l>>>0<(f[k>>2]|0)>>>0){f[c>>2]=l+1;m=h[l>>0]|0}else m=Di(a)|0}while((tq(m)|0)!=0);b:do switch(m|0){case 43:case 45:{l=1-(((m|0)==45&1)<<1)|0;n=f[c>>2]|0;if(n>>>0<(f[k>>2]|0)>>>0){f[c>>2]=n+1;o=h[n>>0]|0;p=l;break b}else{o=Di(a)|0;p=l;break b}break}default:{o=m;p=1}}while(0);l=0;n=o;while(1){if((n|32|0)!=(b[17452+l>>0]|0)){q=l;r=n;break}do if(l>>>0<7){s=f[c>>2]|0;if(s>>>0<(f[k>>2]|0)>>>0){f[c>>2]=s+1;t=h[s>>0]|0;break}else{t=Di(a)|0;break}}else t=n;while(0);s=l+1|0;if(s>>>0<8){l=s;n=t}else{q=s;r=t;break}}c:do switch(q|0){case 8:break;case 3:{i=23;break}default:{n=(d|0)!=0;if(n&q>>>0>3)if((q|0)==8)break c;else{i=23;break c}d:do if(!q){l=0;s=r;while(1){if((s|32|0)!=(b[17461+l>>0]|0)){u=l;v=s;break d}do if(l>>>0<2){w=f[c>>2]|0;if(w>>>0<(f[k>>2]|0)>>>0){f[c>>2]=w+1;x=h[w>>0]|0;break}else{x=Di(a)|0;break}}else x=s;while(0);w=l+1|0;if(w>>>0<3){l=w;s=x}else{u=w;v=x;break}}}else{u=q;v=r}while(0);switch(u|0){case 3:{s=f[c>>2]|0;if(s>>>0<(f[k>>2]|0)>>>0){f[c>>2]=s+1;y=h[s>>0]|0}else y=Di(a)|0;if((y|0)==40)z=1;else{if(!(f[k>>2]|0)){j=B;break a}f[c>>2]=(f[c>>2]|0)+-1;j=B;break a}while(1){s=f[c>>2]|0;if(s>>>0<(f[k>>2]|0)>>>0){f[c>>2]=s+1;A=h[s>>0]|0}else A=Di(a)|0;if(!((A+-48|0)>>>0<10|(A+-65|0)>>>0<26)?!((A|0)==95|(A+-97|0)>>>0<26):0)break;z=z+1|0}if((A|0)==41){j=B;break a}s=(f[k>>2]|0)==0;if(!s)f[c>>2]=(f[c>>2]|0)+-1;if(!n){l=ir()|0;f[l>>2]=22;Rm(a,0);j=0.0;break a}if(!z){j=B;break a}else D=z;while(1){D=D+-1|0;if(!s)f[c>>2]=(f[c>>2]|0)+-1;if(!D){j=B;break a}}break}case 0:{if((v|0)==48){s=f[c>>2]|0;if(s>>>0<(f[k>>2]|0)>>>0){f[c>>2]=s+1;E=h[s>>0]|0}else E=Di(a)|0;if((E|32|0)==120){j=+yc(a,g,e,p,d);break a}if(!(f[k>>2]|0))F=48;else{f[c>>2]=(f[c>>2]|0)+-1;F=48}}else F=v;j=+ob(a,F,g,e,p,d);break a;break}default:{if(f[k>>2]|0)f[c>>2]=(f[c>>2]|0)+-1;s=ir()|0;f[s>>2]=22;Rm(a,0);j=0.0;break a}}}}while(0);if((i|0)==23){s=(f[k>>2]|0)==0;if(!s)f[c>>2]=(f[c>>2]|0)+-1;if((d|0)!=0&q>>>0>3){n=q;do{if(!s)f[c>>2]=(f[c>>2]|0)+-1;n=n+-1|0}while(n>>>0>3)}}j=+$($(p|0)*$(C))}while(0);return +j}function Mc(a){a=a|0;var b=0,c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0;b=u;u=u+16|0;c=b+4|0;d=b;e=f[a+64>>2]|0;if(!e){u=b;return}g=Qa[f[(f[e>>2]|0)+32>>2]&127](e)|0;if(!g){u=b;return}e=g+24|0;h=g+28|0;i=((f[h>>2]|0)-(f[e>>2]|0)>>2)-(f[g+44>>2]|0)|0;j=a+56|0;k=f[j>>2]|0;if(((f[k+12>>2]|0)-(f[k+8>>2]|0)|0)>4){f[c>>2]=0;l=c+4|0;f[l>>2]=0;f[c+8>>2]=0;m=c+8|0;n=0;o=k;while(1){if(!(f[(f[(f[o+8>>2]|0)+(n<<2)>>2]|0)+56>>2]|0))p=o;else{k=Ra[f[(f[a>>2]|0)+56>>2]&127](a,n)|0;f[d>>2]=k;q=k;do if(k|0){r=f[l>>2]|0;if((r|0)==(f[m>>2]|0)){Ci(c,d);break}else{f[r>>2]=q;f[l>>2]=(f[l>>2]|0)+4;break}}while(0);p=f[j>>2]|0}n=n+1|0;if((n|0)>=((f[p+12>>2]|0)-(f[p+8>>2]|0)>>2|0))break;else o=p}o=f[h>>2]|0;h=f[e>>2]|0;e=h;if((o|0)==(h|0)){s=i;t=f[c>>2]|0}else{n=o-h>>2;h=g+12|0;g=f[l>>2]|0;o=f[c>>2]|0;c=(g|0)==(o|0);j=o;d=g-o>>2;o=p+96|0;p=i;g=0;while(1){m=f[e+(g<<2)>>2]|0;if((m|0)==-1)v=p;else{q=f[o>>2]|0;k=f[q+(((m|0)/3|0)*12|0)+(((m|0)%3|0)<<2)>>2]|0;r=(((m>>>0)%3|0|0)==0?2:-1)+m|0;a:do if(((r|0)!=-1?(w=f[(f[h>>2]|0)+(r<<2)>>2]|0,(w|0)!=-1):0)?(x=w+(((w>>>0)%3|0|0)==0?2:-1)|0,(x|0)!=-1):0){if(c){w=0;y=x;z=k;while(1){A=z;z=f[q+(((y|0)/3|0)*12|0)+(((y|0)%3|0)<<2)>>2]|0;B=w+((z|0)!=(A|0)&1)|0;if((y|0)==(m|0)){C=B;break a}A=(((y>>>0)%3|0|0)==0?2:-1)+y|0;if((A|0)==-1){C=B;break a}D=f[(f[h>>2]|0)+(A<<2)>>2]|0;if((D|0)==-1){C=B;break a}y=D+(((D>>>0)%3|0|0)==0?2:-1)|0;if((y|0)==-1){C=B;break a}else w=B}}else{E=0;F=x;G=m;H=k}while(1){w=f[q+(((F|0)/3|0)*12|0)+(((F|0)%3|0)<<2)>>2]|0;b:do if((w|0)==(H|0)){y=0;while(1){z=f[(f[j+(y<<2)>>2]|0)+28>>2]|0;y=y+1|0;if((f[z+(F<<2)>>2]|0)!=(f[z+(G<<2)>>2]|0)){I=H;J=28;break b}if(y>>>0>=d>>>0){K=H;L=E;break}}}else{I=w;J=28}while(0);if((J|0)==28){J=0;K=I;L=E+1|0}if((F|0)==(m|0)){C=L;break a}w=(((F>>>0)%3|0|0)==0?2:-1)+F|0;if((w|0)==-1){C=L;break a}y=f[(f[h>>2]|0)+(w<<2)>>2]|0;if((y|0)==-1){C=L;break a}w=y+(((y>>>0)%3|0|0)==0?2:-1)|0;if((w|0)==-1){C=L;break}else{y=F;E=L;F=w;H=K;G=y}}}else C=0;while(0);m=f[e+(g<<2)>>2]|0;q=m+1|0;if(((m|0)!=-1?(k=((q>>>0)%3|0|0)==0?m+-2|0:q,(k|0)!=-1):0)?(q=f[(f[h>>2]|0)+(k<<2)>>2]|0,k=q+1|0,(q|0)!=-1):0)M=((((k>>>0)%3|0|0)==0?q+-2|0:k)|0)==-1;else M=1;v=C+p+(((C|0)!=0&(M^1))<<31>>31)|0}g=g+1|0;if(g>>>0>=n>>>0){s=v;t=j;break}else p=v}}if(t|0){v=f[l>>2]|0;if((v|0)!=(t|0))f[l>>2]=v+(~((v+-4-t|0)>>>2)<<2);br(t)}N=s}else N=i;f[a+52>>2]=N;u=b;return}function Nc(a,c,d,e,g,h){a=a|0;c=c|0;d=d|0;e=e|0;g=g|0;h=h|0;var i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;i=u;u=u+32|0;j=i+4|0;k=i;l=i+16|0;m=(_(e|0)|0)^31;if((e|0)>0)if(m>>>0>17){n=0;u=i;return n|0}else o=m+1|0;else o=1;do if(g){m=dn(48)|0;f[j>>2]=m;f[j+8>>2]=-2147483600;f[j+4>>2]=33;e=m;p=13067;q=e+33|0;do{b[e>>0]=b[p>>0]|0;e=e+1|0;p=p+1|0}while((e|0)<(q|0));b[m+33>>0]=0;r=(sh(g,j)|0)==0;if((b[j+11>>0]|0)<0)br(f[j>>2]|0);if(!r){r=dn(48)|0;f[j>>2]=r;f[j+8>>2]=-2147483600;f[j+4>>2]=33;e=r;p=13067;q=e+33|0;do{b[e>>0]=b[p>>0]|0;e=e+1|0;p=p+1|0}while((e|0)<(q|0));b[r+33>>0]=0;p=Ck(g,j)|0;if((b[j+11>>0]|0)<0)br(f[j>>2]|0);if((p|0)<4){s=o+-2|0;break}if((p|0)<6){s=o+-1|0;break}if((p|0)>9){s=o+2|0;break}else{s=o+((p|0)>7&1)|0;break}}else s=o}else s=o;while(0);o=(s|0)>1?s:1;s=(o|0)<18?o:18;b[l>>0]=s;o=h+16|0;g=f[o+4>>2]|0;if(!((g|0)>0|(g|0)==0&(f[o>>2]|0)>>>0>0)){f[k>>2]=f[h+4>>2];f[j>>2]=f[k>>2];ye(h,j,l,l+1|0)|0}do switch(s&31){case 1:case 0:{n=je(a,c,d,h)|0;u=i;return n|0}case 2:{n=ie(a,c,d,h)|0;u=i;return n|0}case 3:{n=he(a,c,d,h)|0;u=i;return n|0}case 4:{n=ge(a,c,d,h)|0;u=i;return n|0}case 5:{n=fe(a,c,d,h)|0;u=i;return n|0}case 6:{n=ee(a,c,d,h)|0;u=i;return n|0}case 7:{n=de(a,c,d,h)|0;u=i;return n|0}case 8:{n=ce(a,c,d,h)|0;u=i;return n|0}case 9:{n=be(a,c,d,h)|0;u=i;return n|0}case 10:{n=ae(a,c,d,h)|0;u=i;return n|0}case 11:{n=$d(a,c,d,h)|0;u=i;return n|0}case 12:{n=_d(a,c,d,h)|0;u=i;return n|0}case 13:{n=Zd(a,c,d,h)|0;u=i;return n|0}case 14:{n=Yd(a,c,d,h)|0;u=i;return n|0}case 15:{n=Xd(a,c,d,h)|0;u=i;return n|0}case 16:{n=Wd(a,c,d,h)|0;u=i;return n|0}case 17:{n=Vd(a,c,d,h)|0;u=i;return n|0}case 18:{n=Ud(a,c,d,h)|0;u=i;return n|0}default:{n=0;u=i;return n|0}}while(0);return 0}function Oc(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0.0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0.0,F=0.0,G=0.0;e=u;u=u+16|0;g=e;h=e+4|0;if((c|0)>0){i=0;j=0;k=0;l=0;while(1){m=b+(j<<3)|0;n=f[m>>2]|0;o=f[m+4>>2]|0;m=Tn(n|0,o|0,k|0,l|0)|0;p=I;q=(n|0)==0&(o|0)==0?i:j;j=j+1|0;if((j|0)==(c|0)){r=q;s=p;t=m;break}else{i=q;k=m;l=p}}}else{r=0;s=0;t=0}l=r+1|0;f[a+12>>2]=l;k=a+4|0;i=f[k>>2]|0;c=f[a>>2]|0;j=i-c>>3;p=c;c=i;if(l>>>0<=j>>>0){if(l>>>0<j>>>0?(i=p+(l<<3)|0,(i|0)!=(c|0)):0)f[k>>2]=c+(~((c+-8-i|0)>>>3)<<3)}else dh(a,l-j|0);v=+(t>>>0)+4294967296.0*+(s>>>0);s=(r|0)<0;if(!s){t=f[a>>2]|0;j=0;i=0;do{c=b+(i<<3)|0;k=f[c>>2]|0;p=f[c+4>>2]|0;c=~~((+(k>>>0)+4294967296.0*+(p>>>0))/v*1048576.0+.5)>>>0;m=((k|0)!=0|(p|0)!=0)&(c|0)==0?1:c;f[t+(i<<3)>>2]=m;j=m+j|0;i=i+1|0}while((i|0)!=(l|0));if((j|0)==1048576){if(s){w=0;u=e;return w|0}}else{x=j;y=12}}else{x=0;y=12}if((y|0)==12){f[h>>2]=0;j=h+4|0;f[j>>2]=0;f[h+8>>2]=0;do if(l)if(l>>>0>1073741823)mq(h);else{i=l<<2;t=dn(i)|0;f[h>>2]=t;m=t+(l<<2)|0;f[h+8>>2]=m;hj(t|0,0,i|0)|0;f[j>>2]=m;z=t;A=m;break}else{z=0;A=0}while(0);if(!s?(f[z>>2]=0,r|0):0){m=1;do{f[z+(m<<2)>>2]=m;m=m+1|0}while((m|0)!=(l|0))}f[g>>2]=a;wb(z,A,g);a:do if((x|0)<1048576){g=(f[a>>2]|0)+(f[(f[j>>2]|0)+-4>>2]<<3)|0;f[g>>2]=1048576-x+(f[g>>2]|0);B=0}else{g=f[h>>2]|0;if((r|0)<=0){A=(x|0)>1048576;while(1)if(!A){B=0;break a}}A=f[a>>2]|0;z=x+-1048576|0;m=x;while(1){v=1048576.0/+(m|0);t=r;i=z;c=m;while(1){p=A+(f[g+(t<<2)>>2]<<3)|0;k=f[p>>2]|0;if(k>>>0<2){y=28;break}q=k-~~+J(+(v*+(k>>>0)))|0;o=(q|0)==0?1:q;q=(o|0)<(k|0)?o:k+-1|0;o=(q|0)>(i|0)?i:q;f[p>>2]=k-o;k=c-o|0;p=i-o|0;if((k|0)==1048576){C=p;D=1048576;break}if((t|0)>1){t=t+-1|0;i=p;c=k}else{C=p;D=k;break}}if((y|0)==28){y=0;if((t|0)==(r|0)){B=1;break a}else{C=i;D=c}}if((C|0)>0){z=C;m=D}else{B=0;break}}}while(0);D=f[h>>2]|0;if(D|0){h=f[j>>2]|0;if((h|0)!=(D|0))f[j>>2]=h+(~((h+-4-D|0)>>>2)<<2);br(D)}if((B|0)!=0|s){w=0;u=e;return w|0}}B=f[a>>2]|0;D=0;h=0;do{f[B+(D<<3)+4>>2]=h;h=(f[B+(D<<3)>>2]|0)+h|0;D=D+1|0}while((D|0)!=(l|0));if((h|0)!=1048576){w=0;u=e;return w|0}if(s)E=0.0;else{s=f[a>>2]|0;h=0;v=0.0;while(1){D=f[s+(h<<3)>>2]|0;if(!D)F=v;else{B=b+(h<<3)|0;G=+((f[B>>2]|0)>>>0)+4294967296.0*+((f[B+4>>2]|0)>>>0);F=v+ +Fg(+(D>>>0)*9.5367431640625e-07)*G}h=h+1|0;if((h|0)==(l|0)){E=F;break}else v=F}}F=+W(+-E);l=+K(F)>=1.0?(F>0.0?~~+Y(+J(F/4294967296.0),4294967295.0)>>>0:~~+W((F-+(~~F>>>0))/4294967296.0)>>>0):0;h=a+16|0;f[h>>2]=~~F>>>0;f[h+4>>2]=l;w=xe(a,d)|0;u=e;return w|0}function Pc(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0.0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0.0,F=0.0,G=0.0;e=u;u=u+16|0;g=e;h=e+4|0;if((c|0)>0){i=0;j=0;k=0;l=0;while(1){m=b+(j<<3)|0;n=f[m>>2]|0;o=f[m+4>>2]|0;m=Tn(n|0,o|0,k|0,l|0)|0;p=I;q=(n|0)==0&(o|0)==0?i:j;j=j+1|0;if((j|0)==(c|0)){r=q;s=p;t=m;break}else{i=q;k=m;l=p}}}else{r=0;s=0;t=0}l=r+1|0;f[a+12>>2]=l;k=a+4|0;i=f[k>>2]|0;c=f[a>>2]|0;j=i-c>>3;p=c;c=i;if(l>>>0<=j>>>0){if(l>>>0<j>>>0?(i=p+(l<<3)|0,(i|0)!=(c|0)):0)f[k>>2]=c+(~((c+-8-i|0)>>>3)<<3)}else dh(a,l-j|0);v=+(t>>>0)+4294967296.0*+(s>>>0);s=(r|0)<0;if(!s){t=f[a>>2]|0;j=0;i=0;do{c=b+(i<<3)|0;k=f[c>>2]|0;p=f[c+4>>2]|0;c=~~((+(k>>>0)+4294967296.0*+(p>>>0))/v*1048576.0+.5)>>>0;m=((k|0)!=0|(p|0)!=0)&(c|0)==0?1:c;f[t+(i<<3)>>2]=m;j=m+j|0;i=i+1|0}while((i|0)!=(l|0));if((j|0)==1048576){if(s){w=0;u=e;return w|0}}else{x=j;y=12}}else{x=0;y=12}if((y|0)==12){f[h>>2]=0;j=h+4|0;f[j>>2]=0;f[h+8>>2]=0;do if(l)if(l>>>0>1073741823)mq(h);else{i=l<<2;t=dn(i)|0;f[h>>2]=t;m=t+(l<<2)|0;f[h+8>>2]=m;hj(t|0,0,i|0)|0;f[j>>2]=m;z=t;A=m;break}else{z=0;A=0}while(0);if(!s?(f[z>>2]=0,r|0):0){m=1;do{f[z+(m<<2)>>2]=m;m=m+1|0}while((m|0)!=(l|0))}f[g>>2]=a;xb(z,A,g);a:do if((x|0)<1048576){g=(f[a>>2]|0)+(f[(f[j>>2]|0)+-4>>2]<<3)|0;f[g>>2]=1048576-x+(f[g>>2]|0);B=0}else{g=f[h>>2]|0;if((r|0)<=0){A=(x|0)>1048576;while(1)if(!A){B=0;break a}}A=f[a>>2]|0;z=x+-1048576|0;m=x;while(1){v=1048576.0/+(m|0);t=r;i=z;c=m;while(1){p=A+(f[g+(t<<2)>>2]<<3)|0;k=f[p>>2]|0;if(k>>>0<2){y=28;break}q=k-~~+J(+(v*+(k>>>0)))|0;o=(q|0)==0?1:q;q=(o|0)<(k|0)?o:k+-1|0;o=(q|0)>(i|0)?i:q;f[p>>2]=k-o;k=c-o|0;p=i-o|0;if((k|0)==1048576){C=p;D=1048576;break}if((t|0)>1){t=t+-1|0;i=p;c=k}else{C=p;D=k;break}}if((y|0)==28){y=0;if((t|0)==(r|0)){B=1;break a}else{C=i;D=c}}if((C|0)>0){z=C;m=D}else{B=0;break}}}while(0);D=f[h>>2]|0;if(D|0){h=f[j>>2]|0;if((h|0)!=(D|0))f[j>>2]=h+(~((h+-4-D|0)>>>2)<<2);br(D)}if((B|0)!=0|s){w=0;u=e;return w|0}}B=f[a>>2]|0;D=0;h=0;do{f[B+(D<<3)+4>>2]=h;h=(f[B+(D<<3)>>2]|0)+h|0;D=D+1|0}while((D|0)!=(l|0));if((h|0)!=1048576){w=0;u=e;return w|0}if(s)E=0.0;else{s=f[a>>2]|0;h=0;v=0.0;while(1){D=f[s+(h<<3)>>2]|0;if(!D)F=v;else{B=b+(h<<3)|0;G=+((f[B>>2]|0)>>>0)+4294967296.0*+((f[B+4>>2]|0)>>>0);F=v+ +Fg(+(D>>>0)*9.5367431640625e-07)*G}h=h+1|0;if((h|0)==(l|0)){E=F;break}else v=F}}F=+W(+-E);l=+K(F)>=1.0?(F>0.0?~~+Y(+J(F/4294967296.0),4294967295.0)>>>0:~~+W((F-+(~~F>>>0))/4294967296.0)>>>0):0;h=a+16|0;f[h>>2]=~~F>>>0;f[h+4>>2]=l;w=xe(a,d)|0;u=e;return w|0}function Qc(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0.0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0.0,F=0.0,G=0.0;e=u;u=u+16|0;g=e;h=e+4|0;if((c|0)>0){i=0;j=0;k=0;l=0;while(1){m=b+(j<<3)|0;n=f[m>>2]|0;o=f[m+4>>2]|0;m=Tn(n|0,o|0,k|0,l|0)|0;p=I;q=(n|0)==0&(o|0)==0?i:j;j=j+1|0;if((j|0)==(c|0)){r=q;s=p;t=m;break}else{i=q;k=m;l=p}}}else{r=0;s=0;t=0}l=r+1|0;f[a+12>>2]=l;k=a+4|0;i=f[k>>2]|0;c=f[a>>2]|0;j=i-c>>3;p=c;c=i;if(l>>>0<=j>>>0){if(l>>>0<j>>>0?(i=p+(l<<3)|0,(i|0)!=(c|0)):0)f[k>>2]=c+(~((c+-8-i|0)>>>3)<<3)}else dh(a,l-j|0);v=+(t>>>0)+4294967296.0*+(s>>>0);s=(r|0)<0;if(!s){t=f[a>>2]|0;j=0;i=0;do{c=b+(i<<3)|0;k=f[c>>2]|0;p=f[c+4>>2]|0;c=~~((+(k>>>0)+4294967296.0*+(p>>>0))/v*1048576.0+.5)>>>0;m=((k|0)!=0|(p|0)!=0)&(c|0)==0?1:c;f[t+(i<<3)>>2]=m;j=m+j|0;i=i+1|0}while((i|0)!=(l|0));if((j|0)==1048576){if(s){w=0;u=e;return w|0}}else{x=j;y=12}}else{x=0;y=12}if((y|0)==12){f[h>>2]=0;j=h+4|0;f[j>>2]=0;f[h+8>>2]=0;do if(l)if(l>>>0>1073741823)mq(h);else{i=l<<2;t=dn(i)|0;f[h>>2]=t;m=t+(l<<2)|0;f[h+8>>2]=m;hj(t|0,0,i|0)|0;f[j>>2]=m;z=t;A=m;break}else{z=0;A=0}while(0);if(!s?(f[z>>2]=0,r|0):0){m=1;do{f[z+(m<<2)>>2]=m;m=m+1|0}while((m|0)!=(l|0))}f[g>>2]=a;yb(z,A,g);a:do if((x|0)<1048576){g=(f[a>>2]|0)+(f[(f[j>>2]|0)+-4>>2]<<3)|0;f[g>>2]=1048576-x+(f[g>>2]|0);B=0}else{g=f[h>>2]|0;if((r|0)<=0){A=(x|0)>1048576;while(1)if(!A){B=0;break a}}A=f[a>>2]|0;z=x+-1048576|0;m=x;while(1){v=1048576.0/+(m|0);t=r;i=z;c=m;while(1){p=A+(f[g+(t<<2)>>2]<<3)|0;k=f[p>>2]|0;if(k>>>0<2){y=28;break}q=k-~~+J(+(v*+(k>>>0)))|0;o=(q|0)==0?1:q;q=(o|0)<(k|0)?o:k+-1|0;o=(q|0)>(i|0)?i:q;f[p>>2]=k-o;k=c-o|0;p=i-o|0;if((k|0)==1048576){C=p;D=1048576;break}if((t|0)>1){t=t+-1|0;i=p;c=k}else{C=p;D=k;break}}if((y|0)==28){y=0;if((t|0)==(r|0)){B=1;break a}else{C=i;D=c}}if((C|0)>0){z=C;m=D}else{B=0;break}}}while(0);D=f[h>>2]|0;if(D|0){h=f[j>>2]|0;if((h|0)!=(D|0))f[j>>2]=h+(~((h+-4-D|0)>>>2)<<2);br(D)}if((B|0)!=0|s){w=0;u=e;return w|0}}B=f[a>>2]|0;D=0;h=0;do{f[B+(D<<3)+4>>2]=h;h=(f[B+(D<<3)>>2]|0)+h|0;D=D+1|0}while((D|0)!=(l|0));if((h|0)!=1048576){w=0;u=e;return w|0}if(s)E=0.0;else{s=f[a>>2]|0;h=0;v=0.0;while(1){D=f[s+(h<<3)>>2]|0;if(!D)F=v;else{B=b+(h<<3)|0;G=+((f[B>>2]|0)>>>0)+4294967296.0*+((f[B+4>>2]|0)>>>0);F=v+ +Fg(+(D>>>0)*9.5367431640625e-07)*G}h=h+1|0;if((h|0)==(l|0)){E=F;break}else v=F}}F=+W(+-E);l=+K(F)>=1.0?(F>0.0?~~+Y(+J(F/4294967296.0),4294967295.0)>>>0:~~+W((F-+(~~F>>>0))/4294967296.0)>>>0):0;h=a+16|0;f[h>>2]=~~F>>>0;f[h+4>>2]=l;w=xe(a,d)|0;u=e;return w|0}function Rc(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0.0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0.0,F=0.0,G=0.0;e=u;u=u+16|0;g=e;h=e+4|0;if((c|0)>0){i=0;j=0;k=0;l=0;while(1){m=b+(j<<3)|0;n=f[m>>2]|0;o=f[m+4>>2]|0;m=Tn(n|0,o|0,k|0,l|0)|0;p=I;q=(n|0)==0&(o|0)==0?i:j;j=j+1|0;if((j|0)==(c|0)){r=q;s=p;t=m;break}else{i=q;k=m;l=p}}}else{r=0;s=0;t=0}l=r+1|0;f[a+12>>2]=l;k=a+4|0;i=f[k>>2]|0;c=f[a>>2]|0;j=i-c>>3;p=c;c=i;if(l>>>0<=j>>>0){if(l>>>0<j>>>0?(i=p+(l<<3)|0,(i|0)!=(c|0)):0)f[k>>2]=c+(~((c+-8-i|0)>>>3)<<3)}else dh(a,l-j|0);v=+(t>>>0)+4294967296.0*+(s>>>0);s=(r|0)<0;if(!s){t=f[a>>2]|0;j=0;i=0;do{c=b+(i<<3)|0;k=f[c>>2]|0;p=f[c+4>>2]|0;c=~~((+(k>>>0)+4294967296.0*+(p>>>0))/v*1048576.0+.5)>>>0;m=((k|0)!=0|(p|0)!=0)&(c|0)==0?1:c;f[t+(i<<3)>>2]=m;j=m+j|0;i=i+1|0}while((i|0)!=(l|0));if((j|0)==1048576){if(s){w=0;u=e;return w|0}}else{x=j;y=12}}else{x=0;y=12}if((y|0)==12){f[h>>2]=0;j=h+4|0;f[j>>2]=0;f[h+8>>2]=0;do if(l)if(l>>>0>1073741823)mq(h);else{i=l<<2;t=dn(i)|0;f[h>>2]=t;m=t+(l<<2)|0;f[h+8>>2]=m;hj(t|0,0,i|0)|0;f[j>>2]=m;z=t;A=m;break}else{z=0;A=0}while(0);if(!s?(f[z>>2]=0,r|0):0){m=1;do{f[z+(m<<2)>>2]=m;m=m+1|0}while((m|0)!=(l|0))}f[g>>2]=a;zb(z,A,g);a:do if((x|0)<1048576){g=(f[a>>2]|0)+(f[(f[j>>2]|0)+-4>>2]<<3)|0;f[g>>2]=1048576-x+(f[g>>2]|0);B=0}else{g=f[h>>2]|0;if((r|0)<=0){A=(x|0)>1048576;while(1)if(!A){B=0;break a}}A=f[a>>2]|0;z=x+-1048576|0;m=x;while(1){v=1048576.0/+(m|0);t=r;i=z;c=m;while(1){p=A+(f[g+(t<<2)>>2]<<3)|0;k=f[p>>2]|0;if(k>>>0<2){y=28;break}q=k-~~+J(+(v*+(k>>>0)))|0;o=(q|0)==0?1:q;q=(o|0)<(k|0)?o:k+-1|0;o=(q|0)>(i|0)?i:q;f[p>>2]=k-o;k=c-o|0;p=i-o|0;if((k|0)==1048576){C=p;D=1048576;break}if((t|0)>1){t=t+-1|0;i=p;c=k}else{C=p;D=k;break}}if((y|0)==28){y=0;if((t|0)==(r|0)){B=1;break a}else{C=i;D=c}}if((C|0)>0){z=C;m=D}else{B=0;break}}}while(0);D=f[h>>2]|0;if(D|0){h=f[j>>2]|0;if((h|0)!=(D|0))f[j>>2]=h+(~((h+-4-D|0)>>>2)<<2);br(D)}if((B|0)!=0|s){w=0;u=e;return w|0}}B=f[a>>2]|0;D=0;h=0;do{f[B+(D<<3)+4>>2]=h;h=(f[B+(D<<3)>>2]|0)+h|0;D=D+1|0}while((D|0)!=(l|0));if((h|0)!=1048576){w=0;u=e;return w|0}if(s)E=0.0;else{s=f[a>>2]|0;h=0;v=0.0;while(1){D=f[s+(h<<3)>>2]|0;if(!D)F=v;else{B=b+(h<<3)|0;G=+((f[B>>2]|0)>>>0)+4294967296.0*+((f[B+4>>2]|0)>>>0);F=v+ +Fg(+(D>>>0)*9.5367431640625e-07)*G}h=h+1|0;if((h|0)==(l|0)){E=F;break}else v=F}}F=+W(+-E);l=+K(F)>=1.0?(F>0.0?~~+Y(+J(F/4294967296.0),4294967295.0)>>>0:~~+W((F-+(~~F>>>0))/4294967296.0)>>>0):0;h=a+16|0;f[h>>2]=~~F>>>0;f[h+4>>2]=l;w=xe(a,d)|0;u=e;return w|0}function Sc(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0.0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0.0,F=0.0,G=0.0;e=u;u=u+16|0;g=e;h=e+4|0;if((c|0)>0){i=0;j=0;k=0;l=0;while(1){m=b+(j<<3)|0;n=f[m>>2]|0;o=f[m+4>>2]|0;m=Tn(n|0,o|0,k|0,l|0)|0;p=I;q=(n|0)==0&(o|0)==0?i:j;j=j+1|0;if((j|0)==(c|0)){r=q;s=p;t=m;break}else{i=q;k=m;l=p}}}else{r=0;s=0;t=0}l=r+1|0;f[a+12>>2]=l;k=a+4|0;i=f[k>>2]|0;c=f[a>>2]|0;j=i-c>>3;p=c;c=i;if(l>>>0<=j>>>0){if(l>>>0<j>>>0?(i=p+(l<<3)|0,(i|0)!=(c|0)):0)f[k>>2]=c+(~((c+-8-i|0)>>>3)<<3)}else dh(a,l-j|0);v=+(t>>>0)+4294967296.0*+(s>>>0);s=(r|0)<0;if(!s){t=f[a>>2]|0;j=0;i=0;do{c=b+(i<<3)|0;k=f[c>>2]|0;p=f[c+4>>2]|0;c=~~((+(k>>>0)+4294967296.0*+(p>>>0))/v*1048576.0+.5)>>>0;m=((k|0)!=0|(p|0)!=0)&(c|0)==0?1:c;f[t+(i<<3)>>2]=m;j=m+j|0;i=i+1|0}while((i|0)!=(l|0));if((j|0)==1048576){if(s){w=0;u=e;return w|0}}else{x=j;y=12}}else{x=0;y=12}if((y|0)==12){f[h>>2]=0;j=h+4|0;f[j>>2]=0;f[h+8>>2]=0;do if(l)if(l>>>0>1073741823)mq(h);else{i=l<<2;t=dn(i)|0;f[h>>2]=t;m=t+(l<<2)|0;f[h+8>>2]=m;hj(t|0,0,i|0)|0;f[j>>2]=m;z=t;A=m;break}else{z=0;A=0}while(0);if(!s?(f[z>>2]=0,r|0):0){m=1;do{f[z+(m<<2)>>2]=m;m=m+1|0}while((m|0)!=(l|0))}f[g>>2]=a;Ab(z,A,g);a:do if((x|0)<1048576){g=(f[a>>2]|0)+(f[(f[j>>2]|0)+-4>>2]<<3)|0;f[g>>2]=1048576-x+(f[g>>2]|0);B=0}else{g=f[h>>2]|0;if((r|0)<=0){A=(x|0)>1048576;while(1)if(!A){B=0;break a}}A=f[a>>2]|0;z=x+-1048576|0;m=x;while(1){v=1048576.0/+(m|0);t=r;i=z;c=m;while(1){p=A+(f[g+(t<<2)>>2]<<3)|0;k=f[p>>2]|0;if(k>>>0<2){y=28;break}q=k-~~+J(+(v*+(k>>>0)))|0;o=(q|0)==0?1:q;q=(o|0)<(k|0)?o:k+-1|0;o=(q|0)>(i|0)?i:q;f[p>>2]=k-o;k=c-o|0;p=i-o|0;if((k|0)==1048576){C=p;D=1048576;break}if((t|0)>1){t=t+-1|0;i=p;c=k}else{C=p;D=k;break}}if((y|0)==28){y=0;if((t|0)==(r|0)){B=1;break a}else{C=i;D=c}}if((C|0)>0){z=C;m=D}else{B=0;break}}}while(0);D=f[h>>2]|0;if(D|0){h=f[j>>2]|0;if((h|0)!=(D|0))f[j>>2]=h+(~((h+-4-D|0)>>>2)<<2);br(D)}if((B|0)!=0|s){w=0;u=e;return w|0}}B=f[a>>2]|0;D=0;h=0;do{f[B+(D<<3)+4>>2]=h;h=(f[B+(D<<3)>>2]|0)+h|0;D=D+1|0}while((D|0)!=(l|0));if((h|0)!=1048576){w=0;u=e;return w|0}if(s)E=0.0;else{s=f[a>>2]|0;h=0;v=0.0;while(1){D=f[s+(h<<3)>>2]|0;if(!D)F=v;else{B=b+(h<<3)|0;G=+((f[B>>2]|0)>>>0)+4294967296.0*+((f[B+4>>2]|0)>>>0);F=v+ +Fg(+(D>>>0)*9.5367431640625e-07)*G}h=h+1|0;if((h|0)==(l|0)){E=F;break}else v=F}}F=+W(+-E);l=+K(F)>=1.0?(F>0.0?~~+Y(+J(F/4294967296.0),4294967295.0)>>>0:~~+W((F-+(~~F>>>0))/4294967296.0)>>>0):0;h=a+16|0;f[h>>2]=~~F>>>0;f[h+4>>2]=l;w=xe(a,d)|0;u=e;return w|0}function Tc(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0.0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0.0,F=0.0,G=0.0;e=u;u=u+16|0;g=e;h=e+4|0;if((c|0)>0){i=0;j=0;k=0;l=0;while(1){m=b+(j<<3)|0;n=f[m>>2]|0;o=f[m+4>>2]|0;m=Tn(n|0,o|0,k|0,l|0)|0;p=I;q=(n|0)==0&(o|0)==0?i:j;j=j+1|0;if((j|0)==(c|0)){r=q;s=p;t=m;break}else{i=q;k=m;l=p}}}else{r=0;s=0;t=0}l=r+1|0;f[a+12>>2]=l;k=a+4|0;i=f[k>>2]|0;c=f[a>>2]|0;j=i-c>>3;p=c;c=i;if(l>>>0<=j>>>0){if(l>>>0<j>>>0?(i=p+(l<<3)|0,(i|0)!=(c|0)):0)f[k>>2]=c+(~((c+-8-i|0)>>>3)<<3)}else dh(a,l-j|0);v=+(t>>>0)+4294967296.0*+(s>>>0);s=(r|0)<0;if(!s){t=f[a>>2]|0;j=0;i=0;do{c=b+(i<<3)|0;k=f[c>>2]|0;p=f[c+4>>2]|0;c=~~((+(k>>>0)+4294967296.0*+(p>>>0))/v*524288.0+.5)>>>0;m=((k|0)!=0|(p|0)!=0)&(c|0)==0?1:c;f[t+(i<<3)>>2]=m;j=m+j|0;i=i+1|0}while((i|0)!=(l|0));if((j|0)==524288){if(s){w=0;u=e;return w|0}}else{x=j;y=12}}else{x=0;y=12}if((y|0)==12){f[h>>2]=0;j=h+4|0;f[j>>2]=0;f[h+8>>2]=0;do if(l)if(l>>>0>1073741823)mq(h);else{i=l<<2;t=dn(i)|0;f[h>>2]=t;m=t+(l<<2)|0;f[h+8>>2]=m;hj(t|0,0,i|0)|0;f[j>>2]=m;z=t;A=m;break}else{z=0;A=0}while(0);if(!s?(f[z>>2]=0,r|0):0){m=1;do{f[z+(m<<2)>>2]=m;m=m+1|0}while((m|0)!=(l|0))}f[g>>2]=a;Eb(z,A,g);a:do if((x|0)<524288){g=(f[a>>2]|0)+(f[(f[j>>2]|0)+-4>>2]<<3)|0;f[g>>2]=524288-x+(f[g>>2]|0);B=0}else{g=f[h>>2]|0;if((r|0)<=0){A=(x|0)>524288;while(1)if(!A){B=0;break a}}A=f[a>>2]|0;z=x+-524288|0;m=x;while(1){v=524288.0/+(m|0);t=r;i=z;c=m;while(1){p=A+(f[g+(t<<2)>>2]<<3)|0;k=f[p>>2]|0;if(k>>>0<2){y=28;break}q=k-~~+J(+(v*+(k>>>0)))|0;o=(q|0)==0?1:q;q=(o|0)<(k|0)?o:k+-1|0;o=(q|0)>(i|0)?i:q;f[p>>2]=k-o;k=c-o|0;p=i-o|0;if((k|0)==524288){C=p;D=524288;break}if((t|0)>1){t=t+-1|0;i=p;c=k}else{C=p;D=k;break}}if((y|0)==28){y=0;if((t|0)==(r|0)){B=1;break a}else{C=i;D=c}}if((C|0)>0){z=C;m=D}else{B=0;break}}}while(0);D=f[h>>2]|0;if(D|0){h=f[j>>2]|0;if((h|0)!=(D|0))f[j>>2]=h+(~((h+-4-D|0)>>>2)<<2);br(D)}if((B|0)!=0|s){w=0;u=e;return w|0}}B=f[a>>2]|0;D=0;h=0;do{f[B+(D<<3)+4>>2]=h;h=(f[B+(D<<3)>>2]|0)+h|0;D=D+1|0}while((D|0)!=(l|0));if((h|0)!=524288){w=0;u=e;return w|0}if(s)E=0.0;else{s=f[a>>2]|0;h=0;v=0.0;while(1){D=f[s+(h<<3)>>2]|0;if(!D)F=v;else{B=b+(h<<3)|0;G=+((f[B>>2]|0)>>>0)+4294967296.0*+((f[B+4>>2]|0)>>>0);F=v+ +Fg(+(D>>>0)*1.9073486328125e-06)*G}h=h+1|0;if((h|0)==(l|0)){E=F;break}else v=F}}F=+W(+-E);l=+K(F)>=1.0?(F>0.0?~~+Y(+J(F/4294967296.0),4294967295.0)>>>0:~~+W((F-+(~~F>>>0))/4294967296.0)>>>0):0;h=a+16|0;f[h>>2]=~~F>>>0;f[h+4>>2]=l;w=xe(a,d)|0;u=e;return w|0}function Uc(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0.0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0.0,F=0.0,G=0.0;e=u;u=u+16|0;g=e;h=e+4|0;if((c|0)>0){i=0;j=0;k=0;l=0;while(1){m=b+(j<<3)|0;n=f[m>>2]|0;o=f[m+4>>2]|0;m=Tn(n|0,o|0,k|0,l|0)|0;p=I;q=(n|0)==0&(o|0)==0?i:j;j=j+1|0;if((j|0)==(c|0)){r=q;s=p;t=m;break}else{i=q;k=m;l=p}}}else{r=0;s=0;t=0}l=r+1|0;f[a+12>>2]=l;k=a+4|0;i=f[k>>2]|0;c=f[a>>2]|0;j=i-c>>3;p=c;c=i;if(l>>>0<=j>>>0){if(l>>>0<j>>>0?(i=p+(l<<3)|0,(i|0)!=(c|0)):0)f[k>>2]=c+(~((c+-8-i|0)>>>3)<<3)}else dh(a,l-j|0);v=+(t>>>0)+4294967296.0*+(s>>>0);s=(r|0)<0;if(!s){t=f[a>>2]|0;j=0;i=0;do{c=b+(i<<3)|0;k=f[c>>2]|0;p=f[c+4>>2]|0;c=~~((+(k>>>0)+4294967296.0*+(p>>>0))/v*262144.0+.5)>>>0;m=((k|0)!=0|(p|0)!=0)&(c|0)==0?1:c;f[t+(i<<3)>>2]=m;j=m+j|0;i=i+1|0}while((i|0)!=(l|0));if((j|0)==262144){if(s){w=0;u=e;return w|0}}else{x=j;y=12}}else{x=0;y=12}if((y|0)==12){f[h>>2]=0;j=h+4|0;f[j>>2]=0;f[h+8>>2]=0;do if(l)if(l>>>0>1073741823)mq(h);else{i=l<<2;t=dn(i)|0;f[h>>2]=t;m=t+(l<<2)|0;f[h+8>>2]=m;hj(t|0,0,i|0)|0;f[j>>2]=m;z=t;A=m;break}else{z=0;A=0}while(0);if(!s?(f[z>>2]=0,r|0):0){m=1;do{f[z+(m<<2)>>2]=m;m=m+1|0}while((m|0)!=(l|0))}f[g>>2]=a;Bb(z,A,g);a:do if((x|0)<262144){g=(f[a>>2]|0)+(f[(f[j>>2]|0)+-4>>2]<<3)|0;f[g>>2]=262144-x+(f[g>>2]|0);B=0}else{g=f[h>>2]|0;if((r|0)<=0){A=(x|0)>262144;while(1)if(!A){B=0;break a}}A=f[a>>2]|0;z=x+-262144|0;m=x;while(1){v=262144.0/+(m|0);t=r;i=z;c=m;while(1){p=A+(f[g+(t<<2)>>2]<<3)|0;k=f[p>>2]|0;if(k>>>0<2){y=28;break}q=k-~~+J(+(v*+(k>>>0)))|0;o=(q|0)==0?1:q;q=(o|0)<(k|0)?o:k+-1|0;o=(q|0)>(i|0)?i:q;f[p>>2]=k-o;k=c-o|0;p=i-o|0;if((k|0)==262144){C=p;D=262144;break}if((t|0)>1){t=t+-1|0;i=p;c=k}else{C=p;D=k;break}}if((y|0)==28){y=0;if((t|0)==(r|0)){B=1;break a}else{C=i;D=c}}if((C|0)>0){z=C;m=D}else{B=0;break}}}while(0);D=f[h>>2]|0;if(D|0){h=f[j>>2]|0;if((h|0)!=(D|0))f[j>>2]=h+(~((h+-4-D|0)>>>2)<<2);br(D)}if((B|0)!=0|s){w=0;u=e;return w|0}}B=f[a>>2]|0;D=0;h=0;do{f[B+(D<<3)+4>>2]=h;h=(f[B+(D<<3)>>2]|0)+h|0;D=D+1|0}while((D|0)!=(l|0));if((h|0)!=262144){w=0;u=e;return w|0}if(s)E=0.0;else{s=f[a>>2]|0;h=0;v=0.0;while(1){D=f[s+(h<<3)>>2]|0;if(!D)F=v;else{B=b+(h<<3)|0;G=+((f[B>>2]|0)>>>0)+4294967296.0*+((f[B+4>>2]|0)>>>0);F=v+ +Fg(+(D>>>0)*3.814697265625e-06)*G}h=h+1|0;if((h|0)==(l|0)){E=F;break}else v=F}}F=+W(+-E);l=+K(F)>=1.0?(F>0.0?~~+Y(+J(F/4294967296.0),4294967295.0)>>>0:~~+W((F-+(~~F>>>0))/4294967296.0)>>>0):0;h=a+16|0;f[h>>2]=~~F>>>0;f[h+4>>2]=l;w=xe(a,d)|0;u=e;return w|0}function Vc(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0.0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0.0,F=0.0,G=0.0;e=u;u=u+16|0;g=e;h=e+4|0;if((c|0)>0){i=0;j=0;k=0;l=0;while(1){m=b+(j<<3)|0;n=f[m>>2]|0;o=f[m+4>>2]|0;m=Tn(n|0,o|0,k|0,l|0)|0;p=I;q=(n|0)==0&(o|0)==0?i:j;j=j+1|0;if((j|0)==(c|0)){r=q;s=p;t=m;break}else{i=q;k=m;l=p}}}else{r=0;s=0;t=0}l=r+1|0;f[a+12>>2]=l;k=a+4|0;i=f[k>>2]|0;c=f[a>>2]|0;j=i-c>>3;p=c;c=i;if(l>>>0<=j>>>0){if(l>>>0<j>>>0?(i=p+(l<<3)|0,(i|0)!=(c|0)):0)f[k>>2]=c+(~((c+-8-i|0)>>>3)<<3)}else dh(a,l-j|0);v=+(t>>>0)+4294967296.0*+(s>>>0);s=(r|0)<0;if(!s){t=f[a>>2]|0;j=0;i=0;do{c=b+(i<<3)|0;k=f[c>>2]|0;p=f[c+4>>2]|0;c=~~((+(k>>>0)+4294967296.0*+(p>>>0))/v*65536.0+.5)>>>0;m=((k|0)!=0|(p|0)!=0)&(c|0)==0?1:c;f[t+(i<<3)>>2]=m;j=m+j|0;i=i+1|0}while((i|0)!=(l|0));if((j|0)==65536){if(s){w=0;u=e;return w|0}}else{x=j;y=12}}else{x=0;y=12}if((y|0)==12){f[h>>2]=0;j=h+4|0;f[j>>2]=0;f[h+8>>2]=0;do if(l)if(l>>>0>1073741823)mq(h);else{i=l<<2;t=dn(i)|0;f[h>>2]=t;m=t+(l<<2)|0;f[h+8>>2]=m;hj(t|0,0,i|0)|0;f[j>>2]=m;z=t;A=m;break}else{z=0;A=0}while(0);if(!s?(f[z>>2]=0,r|0):0){m=1;do{f[z+(m<<2)>>2]=m;m=m+1|0}while((m|0)!=(l|0))}f[g>>2]=a;Cb(z,A,g);a:do if((x|0)<65536){g=(f[a>>2]|0)+(f[(f[j>>2]|0)+-4>>2]<<3)|0;f[g>>2]=65536-x+(f[g>>2]|0);B=0}else{g=f[h>>2]|0;if((r|0)<=0){A=(x|0)>65536;while(1)if(!A){B=0;break a}}A=f[a>>2]|0;z=x+-65536|0;m=x;while(1){v=65536.0/+(m|0);t=r;i=z;c=m;while(1){p=A+(f[g+(t<<2)>>2]<<3)|0;k=f[p>>2]|0;if(k>>>0<2){y=28;break}q=k-~~+J(+(v*+(k>>>0)))|0;o=(q|0)==0?1:q;q=(o|0)<(k|0)?o:k+-1|0;o=(q|0)>(i|0)?i:q;f[p>>2]=k-o;k=c-o|0;p=i-o|0;if((k|0)==65536){C=p;D=65536;break}if((t|0)>1){t=t+-1|0;i=p;c=k}else{C=p;D=k;break}}if((y|0)==28){y=0;if((t|0)==(r|0)){B=1;break a}else{C=i;D=c}}if((C|0)>0){z=C;m=D}else{B=0;break}}}while(0);D=f[h>>2]|0;if(D|0){h=f[j>>2]|0;if((h|0)!=(D|0))f[j>>2]=h+(~((h+-4-D|0)>>>2)<<2);br(D)}if((B|0)!=0|s){w=0;u=e;return w|0}}B=f[a>>2]|0;D=0;h=0;do{f[B+(D<<3)+4>>2]=h;h=(f[B+(D<<3)>>2]|0)+h|0;D=D+1|0}while((D|0)!=(l|0));if((h|0)!=65536){w=0;u=e;return w|0}if(s)E=0.0;else{s=f[a>>2]|0;h=0;v=0.0;while(1){D=f[s+(h<<3)>>2]|0;if(!D)F=v;else{B=b+(h<<3)|0;G=+((f[B>>2]|0)>>>0)+4294967296.0*+((f[B+4>>2]|0)>>>0);F=v+ +Fg(+(D>>>0)*.0000152587890625)*G}h=h+1|0;if((h|0)==(l|0)){E=F;break}else v=F}}F=+W(+-E);l=+K(F)>=1.0?(F>0.0?~~+Y(+J(F/4294967296.0),4294967295.0)>>>0:~~+W((F-+(~~F>>>0))/4294967296.0)>>>0):0;h=a+16|0;f[h>>2]=~~F>>>0;f[h+4>>2]=l;w=xe(a,d)|0;u=e;return w|0}function Wc(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0.0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0.0,F=0.0,G=0.0;e=u;u=u+16|0;g=e;h=e+4|0;if((c|0)>0){i=0;j=0;k=0;l=0;while(1){m=b+(j<<3)|0;n=f[m>>2]|0;o=f[m+4>>2]|0;m=Tn(n|0,o|0,k|0,l|0)|0;p=I;q=(n|0)==0&(o|0)==0?i:j;j=j+1|0;if((j|0)==(c|0)){r=q;s=p;t=m;break}else{i=q;k=m;l=p}}}else{r=0;s=0;t=0}l=r+1|0;f[a+12>>2]=l;k=a+4|0;i=f[k>>2]|0;c=f[a>>2]|0;j=i-c>>3;p=c;c=i;if(l>>>0<=j>>>0){if(l>>>0<j>>>0?(i=p+(l<<3)|0,(i|0)!=(c|0)):0)f[k>>2]=c+(~((c+-8-i|0)>>>3)<<3)}else dh(a,l-j|0);v=+(t>>>0)+4294967296.0*+(s>>>0);s=(r|0)<0;if(!s){t=f[a>>2]|0;j=0;i=0;do{c=b+(i<<3)|0;k=f[c>>2]|0;p=f[c+4>>2]|0;c=~~((+(k>>>0)+4294967296.0*+(p>>>0))/v*32768.0+.5)>>>0;m=((k|0)!=0|(p|0)!=0)&(c|0)==0?1:c;f[t+(i<<3)>>2]=m;j=m+j|0;i=i+1|0}while((i|0)!=(l|0));if((j|0)==32768){if(s){w=0;u=e;return w|0}}else{x=j;y=12}}else{x=0;y=12}if((y|0)==12){f[h>>2]=0;j=h+4|0;f[j>>2]=0;f[h+8>>2]=0;do if(l)if(l>>>0>1073741823)mq(h);else{i=l<<2;t=dn(i)|0;f[h>>2]=t;m=t+(l<<2)|0;f[h+8>>2]=m;hj(t|0,0,i|0)|0;f[j>>2]=m;z=t;A=m;break}else{z=0;A=0}while(0);if(!s?(f[z>>2]=0,r|0):0){m=1;do{f[z+(m<<2)>>2]=m;m=m+1|0}while((m|0)!=(l|0))}f[g>>2]=a;Db(z,A,g);a:do if((x|0)<32768){g=(f[a>>2]|0)+(f[(f[j>>2]|0)+-4>>2]<<3)|0;f[g>>2]=32768-x+(f[g>>2]|0);B=0}else{g=f[h>>2]|0;if((r|0)<=0){A=(x|0)>32768;while(1)if(!A){B=0;break a}}A=f[a>>2]|0;z=x+-32768|0;m=x;while(1){v=32768.0/+(m|0);t=r;i=z;c=m;while(1){p=A+(f[g+(t<<2)>>2]<<3)|0;k=f[p>>2]|0;if(k>>>0<2){y=28;break}q=k-~~+J(+(v*+(k>>>0)))|0;o=(q|0)==0?1:q;q=(o|0)<(k|0)?o:k+-1|0;o=(q|0)>(i|0)?i:q;f[p>>2]=k-o;k=c-o|0;p=i-o|0;if((k|0)==32768){C=p;D=32768;break}if((t|0)>1){t=t+-1|0;i=p;c=k}else{C=p;D=k;break}}if((y|0)==28){y=0;if((t|0)==(r|0)){B=1;break a}else{C=i;D=c}}if((C|0)>0){z=C;m=D}else{B=0;break}}}while(0);D=f[h>>2]|0;if(D|0){h=f[j>>2]|0;if((h|0)!=(D|0))f[j>>2]=h+(~((h+-4-D|0)>>>2)<<2);br(D)}if((B|0)!=0|s){w=0;u=e;return w|0}}B=f[a>>2]|0;D=0;h=0;do{f[B+(D<<3)+4>>2]=h;h=(f[B+(D<<3)>>2]|0)+h|0;D=D+1|0}while((D|0)!=(l|0));if((h|0)!=32768){w=0;u=e;return w|0}if(s)E=0.0;else{s=f[a>>2]|0;h=0;v=0.0;while(1){D=f[s+(h<<3)>>2]|0;if(!D)F=v;else{B=b+(h<<3)|0;G=+((f[B>>2]|0)>>>0)+4294967296.0*+((f[B+4>>2]|0)>>>0);F=v+ +Fg(+(D>>>0)*.000030517578125)*G}h=h+1|0;if((h|0)==(l|0)){E=F;break}else v=F}}F=+W(+-E);l=+K(F)>=1.0?(F>0.0?~~+Y(+J(F/4294967296.0),4294967295.0)>>>0:~~+W((F-+(~~F>>>0))/4294967296.0)>>>0):0;h=a+16|0;f[h>>2]=~~F>>>0;f[h+4>>2]=l;w=xe(a,d)|0;u=e;return w|0}function Xc(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0.0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0.0,F=0.0,G=0.0;e=u;u=u+16|0;g=e;h=e+4|0;if((c|0)>0){i=0;j=0;k=0;l=0;while(1){m=b+(j<<3)|0;n=f[m>>2]|0;o=f[m+4>>2]|0;m=Tn(n|0,o|0,k|0,l|0)|0;p=I;q=(n|0)==0&(o|0)==0?i:j;j=j+1|0;if((j|0)==(c|0)){r=q;s=p;t=m;break}else{i=q;k=m;l=p}}}else{r=0;s=0;t=0}l=r+1|0;f[a+12>>2]=l;k=a+4|0;i=f[k>>2]|0;c=f[a>>2]|0;j=i-c>>3;p=c;c=i;if(l>>>0<=j>>>0){if(l>>>0<j>>>0?(i=p+(l<<3)|0,(i|0)!=(c|0)):0)f[k>>2]=c+(~((c+-8-i|0)>>>3)<<3)}else dh(a,l-j|0);v=+(t>>>0)+4294967296.0*+(s>>>0);s=(r|0)<0;if(!s){t=f[a>>2]|0;j=0;i=0;do{c=b+(i<<3)|0;k=f[c>>2]|0;p=f[c+4>>2]|0;c=~~((+(k>>>0)+4294967296.0*+(p>>>0))/v*8192.0+.5)>>>0;m=((k|0)!=0|(p|0)!=0)&(c|0)==0?1:c;f[t+(i<<3)>>2]=m;j=m+j|0;i=i+1|0}while((i|0)!=(l|0));if((j|0)==8192){if(s){w=0;u=e;return w|0}}else{x=j;y=12}}else{x=0;y=12}if((y|0)==12){f[h>>2]=0;j=h+4|0;f[j>>2]=0;f[h+8>>2]=0;do if(l)if(l>>>0>1073741823)mq(h);else{i=l<<2;t=dn(i)|0;f[h>>2]=t;m=t+(l<<2)|0;f[h+8>>2]=m;hj(t|0,0,i|0)|0;f[j>>2]=m;z=t;A=m;break}else{z=0;A=0}while(0);if(!s?(f[z>>2]=0,r|0):0){m=1;do{f[z+(m<<2)>>2]=m;m=m+1|0}while((m|0)!=(l|0))}f[g>>2]=a;Fb(z,A,g);a:do if((x|0)<8192){g=(f[a>>2]|0)+(f[(f[j>>2]|0)+-4>>2]<<3)|0;f[g>>2]=8192-x+(f[g>>2]|0);B=0}else{g=f[h>>2]|0;if((r|0)<=0){A=(x|0)>8192;while(1)if(!A){B=0;break a}}A=f[a>>2]|0;z=x+-8192|0;m=x;while(1){v=8192.0/+(m|0);t=r;i=z;c=m;while(1){p=A+(f[g+(t<<2)>>2]<<3)|0;k=f[p>>2]|0;if(k>>>0<2){y=28;break}q=k-~~+J(+(v*+(k>>>0)))|0;o=(q|0)==0?1:q;q=(o|0)<(k|0)?o:k+-1|0;o=(q|0)>(i|0)?i:q;f[p>>2]=k-o;k=c-o|0;p=i-o|0;if((k|0)==8192){C=p;D=8192;break}if((t|0)>1){t=t+-1|0;i=p;c=k}else{C=p;D=k;break}}if((y|0)==28){y=0;if((t|0)==(r|0)){B=1;break a}else{C=i;D=c}}if((C|0)>0){z=C;m=D}else{B=0;break}}}while(0);D=f[h>>2]|0;if(D|0){h=f[j>>2]|0;if((h|0)!=(D|0))f[j>>2]=h+(~((h+-4-D|0)>>>2)<<2);br(D)}if((B|0)!=0|s){w=0;u=e;return w|0}}B=f[a>>2]|0;D=0;h=0;do{f[B+(D<<3)+4>>2]=h;h=(f[B+(D<<3)>>2]|0)+h|0;D=D+1|0}while((D|0)!=(l|0));if((h|0)!=8192){w=0;u=e;return w|0}if(s)E=0.0;else{s=f[a>>2]|0;h=0;v=0.0;while(1){D=f[s+(h<<3)>>2]|0;if(!D)F=v;else{B=b+(h<<3)|0;G=+((f[B>>2]|0)>>>0)+4294967296.0*+((f[B+4>>2]|0)>>>0);F=v+ +Fg(+(D>>>0)*.0001220703125)*G}h=h+1|0;if((h|0)==(l|0)){E=F;break}else v=F}}F=+W(+-E);l=+K(F)>=1.0?(F>0.0?~~+Y(+J(F/4294967296.0),4294967295.0)>>>0:~~+W((F-+(~~F>>>0))/4294967296.0)>>>0):0;h=a+16|0;f[h>>2]=~~F>>>0;f[h+4>>2]=l;w=xe(a,d)|0;u=e;return w|0}function Yc(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0.0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0.0,F=0.0,G=0.0;e=u;u=u+16|0;g=e;h=e+4|0;if((c|0)>0){i=0;j=0;k=0;l=0;while(1){m=b+(j<<3)|0;n=f[m>>2]|0;o=f[m+4>>2]|0;m=Tn(n|0,o|0,k|0,l|0)|0;p=I;q=(n|0)==0&(o|0)==0?i:j;j=j+1|0;if((j|0)==(c|0)){r=q;s=p;t=m;break}else{i=q;k=m;l=p}}}else{r=0;s=0;t=0}l=r+1|0;f[a+12>>2]=l;k=a+4|0;i=f[k>>2]|0;c=f[a>>2]|0;j=i-c>>3;p=c;c=i;if(l>>>0<=j>>>0){if(l>>>0<j>>>0?(i=p+(l<<3)|0,(i|0)!=(c|0)):0)f[k>>2]=c+(~((c+-8-i|0)>>>3)<<3)}else dh(a,l-j|0);v=+(t>>>0)+4294967296.0*+(s>>>0);s=(r|0)<0;if(!s){t=f[a>>2]|0;j=0;i=0;do{c=b+(i<<3)|0;k=f[c>>2]|0;p=f[c+4>>2]|0;c=~~((+(k>>>0)+4294967296.0*+(p>>>0))/v*4096.0+.5)>>>0;m=((k|0)!=0|(p|0)!=0)&(c|0)==0?1:c;f[t+(i<<3)>>2]=m;j=m+j|0;i=i+1|0}while((i|0)!=(l|0));if((j|0)==4096){if(s){w=0;u=e;return w|0}}else{x=j;y=12}}else{x=0;y=12}if((y|0)==12){f[h>>2]=0;j=h+4|0;f[j>>2]=0;f[h+8>>2]=0;do if(l)if(l>>>0>1073741823)mq(h);else{i=l<<2;t=dn(i)|0;f[h>>2]=t;m=t+(l<<2)|0;f[h+8>>2]=m;hj(t|0,0,i|0)|0;f[j>>2]=m;z=t;A=m;break}else{z=0;A=0}while(0);if(!s?(f[z>>2]=0,r|0):0){m=1;do{f[z+(m<<2)>>2]=m;m=m+1|0}while((m|0)!=(l|0))}f[g>>2]=a;Gb(z,A,g);a:do if((x|0)<4096){g=(f[a>>2]|0)+(f[(f[j>>2]|0)+-4>>2]<<3)|0;f[g>>2]=4096-x+(f[g>>2]|0);B=0}else{g=f[h>>2]|0;if((r|0)<=0){A=(x|0)>4096;while(1)if(!A){B=0;break a}}A=f[a>>2]|0;z=x+-4096|0;m=x;while(1){v=4096.0/+(m|0);t=r;i=z;c=m;while(1){p=A+(f[g+(t<<2)>>2]<<3)|0;k=f[p>>2]|0;if(k>>>0<2){y=28;break}q=k-~~+J(+(v*+(k>>>0)))|0;o=(q|0)==0?1:q;q=(o|0)<(k|0)?o:k+-1|0;o=(q|0)>(i|0)?i:q;f[p>>2]=k-o;k=c-o|0;p=i-o|0;if((k|0)==4096){C=p;D=4096;break}if((t|0)>1){t=t+-1|0;i=p;c=k}else{C=p;D=k;break}}if((y|0)==28){y=0;if((t|0)==(r|0)){B=1;break a}else{C=i;D=c}}if((C|0)>0){z=C;m=D}else{B=0;break}}}while(0);D=f[h>>2]|0;if(D|0){h=f[j>>2]|0;if((h|0)!=(D|0))f[j>>2]=h+(~((h+-4-D|0)>>>2)<<2);br(D)}if((B|0)!=0|s){w=0;u=e;return w|0}}B=f[a>>2]|0;D=0;h=0;do{f[B+(D<<3)+4>>2]=h;h=(f[B+(D<<3)>>2]|0)+h|0;D=D+1|0}while((D|0)!=(l|0));if((h|0)!=4096){w=0;u=e;return w|0}if(s)E=0.0;else{s=f[a>>2]|0;h=0;v=0.0;while(1){D=f[s+(h<<3)>>2]|0;if(!D)F=v;else{B=b+(h<<3)|0;G=+((f[B>>2]|0)>>>0)+4294967296.0*+((f[B+4>>2]|0)>>>0);F=v+ +Fg(+(D>>>0)*.000244140625)*G}h=h+1|0;if((h|0)==(l|0)){E=F;break}else v=F}}F=+W(+-E);l=+K(F)>=1.0?(F>0.0?~~+Y(+J(F/4294967296.0),4294967295.0)>>>0:~~+W((F-+(~~F>>>0))/4294967296.0)>>>0):0;h=a+16|0;f[h>>2]=~~F>>>0;f[h+4>>2]=l;w=xe(a,d)|0;u=e;return w|0}function Zc(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0.0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0.0,F=0.0,G=0.0;e=u;u=u+16|0;g=e;h=e+4|0;if((c|0)>0){i=0;j=0;k=0;l=0;while(1){m=b+(j<<3)|0;n=f[m>>2]|0;o=f[m+4>>2]|0;m=Tn(n|0,o|0,k|0,l|0)|0;p=I;q=(n|0)==0&(o|0)==0?i:j;j=j+1|0;if((j|0)==(c|0)){r=q;s=p;t=m;break}else{i=q;k=m;l=p}}}else{r=0;s=0;t=0}l=r+1|0;f[a+12>>2]=l;k=a+4|0;i=f[k>>2]|0;c=f[a>>2]|0;j=i-c>>3;p=c;c=i;if(l>>>0<=j>>>0){if(l>>>0<j>>>0?(i=p+(l<<3)|0,(i|0)!=(c|0)):0)f[k>>2]=c+(~((c+-8-i|0)>>>3)<<3)}else dh(a,l-j|0);v=+(t>>>0)+4294967296.0*+(s>>>0);s=(r|0)<0;if(!s){t=f[a>>2]|0;j=0;i=0;do{c=b+(i<<3)|0;k=f[c>>2]|0;p=f[c+4>>2]|0;c=~~((+(k>>>0)+4294967296.0*+(p>>>0))/v*4096.0+.5)>>>0;m=((k|0)!=0|(p|0)!=0)&(c|0)==0?1:c;f[t+(i<<3)>>2]=m;j=m+j|0;i=i+1|0}while((i|0)!=(l|0));if((j|0)==4096){if(s){w=0;u=e;return w|0}}else{x=j;y=12}}else{x=0;y=12}if((y|0)==12){f[h>>2]=0;j=h+4|0;f[j>>2]=0;f[h+8>>2]=0;do if(l)if(l>>>0>1073741823)mq(h);else{i=l<<2;t=dn(i)|0;f[h>>2]=t;m=t+(l<<2)|0;f[h+8>>2]=m;hj(t|0,0,i|0)|0;f[j>>2]=m;z=t;A=m;break}else{z=0;A=0}while(0);if(!s?(f[z>>2]=0,r|0):0){m=1;do{f[z+(m<<2)>>2]=m;m=m+1|0}while((m|0)!=(l|0))}f[g>>2]=a;Hb(z,A,g);a:do if((x|0)<4096){g=(f[a>>2]|0)+(f[(f[j>>2]|0)+-4>>2]<<3)|0;f[g>>2]=4096-x+(f[g>>2]|0);B=0}else{g=f[h>>2]|0;if((r|0)<=0){A=(x|0)>4096;while(1)if(!A){B=0;break a}}A=f[a>>2]|0;z=x+-4096|0;m=x;while(1){v=4096.0/+(m|0);t=r;i=z;c=m;while(1){p=A+(f[g+(t<<2)>>2]<<3)|0;k=f[p>>2]|0;if(k>>>0<2){y=28;break}q=k-~~+J(+(v*+(k>>>0)))|0;o=(q|0)==0?1:q;q=(o|0)<(k|0)?o:k+-1|0;o=(q|0)>(i|0)?i:q;f[p>>2]=k-o;k=c-o|0;p=i-o|0;if((k|0)==4096){C=p;D=4096;break}if((t|0)>1){t=t+-1|0;i=p;c=k}else{C=p;D=k;break}}if((y|0)==28){y=0;if((t|0)==(r|0)){B=1;break a}else{C=i;D=c}}if((C|0)>0){z=C;m=D}else{B=0;break}}}while(0);D=f[h>>2]|0;if(D|0){h=f[j>>2]|0;if((h|0)!=(D|0))f[j>>2]=h+(~((h+-4-D|0)>>>2)<<2);br(D)}if((B|0)!=0|s){w=0;u=e;return w|0}}B=f[a>>2]|0;D=0;h=0;do{f[B+(D<<3)+4>>2]=h;h=(f[B+(D<<3)>>2]|0)+h|0;D=D+1|0}while((D|0)!=(l|0));if((h|0)!=4096){w=0;u=e;return w|0}if(s)E=0.0;else{s=f[a>>2]|0;h=0;v=0.0;while(1){D=f[s+(h<<3)>>2]|0;if(!D)F=v;else{B=b+(h<<3)|0;G=+((f[B>>2]|0)>>>0)+4294967296.0*+((f[B+4>>2]|0)>>>0);F=v+ +Fg(+(D>>>0)*.000244140625)*G}h=h+1|0;if((h|0)==(l|0)){E=F;break}else v=F}}F=+W(+-E);l=+K(F)>=1.0?(F>0.0?~~+Y(+J(F/4294967296.0),4294967295.0)>>>0:~~+W((F-+(~~F>>>0))/4294967296.0)>>>0):0;h=a+16|0;f[h>>2]=~~F>>>0;f[h+4>>2]=l;w=xe(a,d)|0;u=e;return w|0}function _c(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0.0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0.0,F=0.0,G=0.0;e=u;u=u+16|0;g=e;h=e+4|0;if((c|0)>0){i=0;j=0;k=0;l=0;while(1){m=b+(j<<3)|0;n=f[m>>2]|0;o=f[m+4>>2]|0;m=Tn(n|0,o|0,k|0,l|0)|0;p=I;q=(n|0)==0&(o|0)==0?i:j;j=j+1|0;if((j|0)==(c|0)){r=q;s=p;t=m;break}else{i=q;k=m;l=p}}}else{r=0;s=0;t=0}l=r+1|0;f[a+12>>2]=l;k=a+4|0;i=f[k>>2]|0;c=f[a>>2]|0;j=i-c>>3;p=c;c=i;if(l>>>0<=j>>>0){if(l>>>0<j>>>0?(i=p+(l<<3)|0,(i|0)!=(c|0)):0)f[k>>2]=c+(~((c+-8-i|0)>>>3)<<3)}else dh(a,l-j|0);v=+(t>>>0)+4294967296.0*+(s>>>0);s=(r|0)<0;if(!s){t=f[a>>2]|0;j=0;i=0;do{c=b+(i<<3)|0;k=f[c>>2]|0;p=f[c+4>>2]|0;c=~~((+(k>>>0)+4294967296.0*+(p>>>0))/v*4096.0+.5)>>>0;m=((k|0)!=0|(p|0)!=0)&(c|0)==0?1:c;f[t+(i<<3)>>2]=m;j=m+j|0;i=i+1|0}while((i|0)!=(l|0));if((j|0)==4096){if(s){w=0;u=e;return w|0}}else{x=j;y=12}}else{x=0;y=12}if((y|0)==12){f[h>>2]=0;j=h+4|0;f[j>>2]=0;f[h+8>>2]=0;do if(l)if(l>>>0>1073741823)mq(h);else{i=l<<2;t=dn(i)|0;f[h>>2]=t;m=t+(l<<2)|0;f[h+8>>2]=m;hj(t|0,0,i|0)|0;f[j>>2]=m;z=t;A=m;break}else{z=0;A=0}while(0);if(!s?(f[z>>2]=0,r|0):0){m=1;do{f[z+(m<<2)>>2]=m;m=m+1|0}while((m|0)!=(l|0))}f[g>>2]=a;Ib(z,A,g);a:do if((x|0)<4096){g=(f[a>>2]|0)+(f[(f[j>>2]|0)+-4>>2]<<3)|0;f[g>>2]=4096-x+(f[g>>2]|0);B=0}else{g=f[h>>2]|0;if((r|0)<=0){A=(x|0)>4096;while(1)if(!A){B=0;break a}}A=f[a>>2]|0;z=x+-4096|0;m=x;while(1){v=4096.0/+(m|0);t=r;i=z;c=m;while(1){p=A+(f[g+(t<<2)>>2]<<3)|0;k=f[p>>2]|0;if(k>>>0<2){y=28;break}q=k-~~+J(+(v*+(k>>>0)))|0;o=(q|0)==0?1:q;q=(o|0)<(k|0)?o:k+-1|0;o=(q|0)>(i|0)?i:q;f[p>>2]=k-o;k=c-o|0;p=i-o|0;if((k|0)==4096){C=p;D=4096;break}if((t|0)>1){t=t+-1|0;i=p;c=k}else{C=p;D=k;break}}if((y|0)==28){y=0;if((t|0)==(r|0)){B=1;break a}else{C=i;D=c}}if((C|0)>0){z=C;m=D}else{B=0;break}}}while(0);D=f[h>>2]|0;if(D|0){h=f[j>>2]|0;if((h|0)!=(D|0))f[j>>2]=h+(~((h+-4-D|0)>>>2)<<2);br(D)}if((B|0)!=0|s){w=0;u=e;return w|0}}B=f[a>>2]|0;D=0;h=0;do{f[B+(D<<3)+4>>2]=h;h=(f[B+(D<<3)>>2]|0)+h|0;D=D+1|0}while((D|0)!=(l|0));if((h|0)!=4096){w=0;u=e;return w|0}if(s)E=0.0;else{s=f[a>>2]|0;h=0;v=0.0;while(1){D=f[s+(h<<3)>>2]|0;if(!D)F=v;else{B=b+(h<<3)|0;G=+((f[B>>2]|0)>>>0)+4294967296.0*+((f[B+4>>2]|0)>>>0);F=v+ +Fg(+(D>>>0)*.000244140625)*G}h=h+1|0;if((h|0)==(l|0)){E=F;break}else v=F}}F=+W(+-E);l=+K(F)>=1.0?(F>0.0?~~+Y(+J(F/4294967296.0),4294967295.0)>>>0:~~+W((F-+(~~F>>>0))/4294967296.0)>>>0):0;h=a+16|0;f[h>>2]=~~F>>>0;f[h+4>>2]=l;w=xe(a,d)|0;u=e;return w|0}function $c(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0.0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0.0,F=0.0,G=0.0;e=u;u=u+16|0;g=e;h=e+4|0;if((c|0)>0){i=0;j=0;k=0;l=0;while(1){m=b+(j<<3)|0;n=f[m>>2]|0;o=f[m+4>>2]|0;m=Tn(n|0,o|0,k|0,l|0)|0;p=I;q=(n|0)==0&(o|0)==0?i:j;j=j+1|0;if((j|0)==(c|0)){r=q;s=p;t=m;break}else{i=q;k=m;l=p}}}else{r=0;s=0;t=0}l=r+1|0;f[a+12>>2]=l;k=a+4|0;i=f[k>>2]|0;c=f[a>>2]|0;j=i-c>>3;p=c;c=i;if(l>>>0<=j>>>0){if(l>>>0<j>>>0?(i=p+(l<<3)|0,(i|0)!=(c|0)):0)f[k>>2]=c+(~((c+-8-i|0)>>>3)<<3)}else dh(a,l-j|0);v=+(t>>>0)+4294967296.0*+(s>>>0);s=(r|0)<0;if(!s){t=f[a>>2]|0;j=0;i=0;do{c=b+(i<<3)|0;k=f[c>>2]|0;p=f[c+4>>2]|0;c=~~((+(k>>>0)+4294967296.0*+(p>>>0))/v*4096.0+.5)>>>0;m=((k|0)!=0|(p|0)!=0)&(c|0)==0?1:c;f[t+(i<<3)>>2]=m;j=m+j|0;i=i+1|0}while((i|0)!=(l|0));if((j|0)==4096){if(s){w=0;u=e;return w|0}}else{x=j;y=12}}else{x=0;y=12}if((y|0)==12){f[h>>2]=0;j=h+4|0;f[j>>2]=0;f[h+8>>2]=0;do if(l)if(l>>>0>1073741823)mq(h);else{i=l<<2;t=dn(i)|0;f[h>>2]=t;m=t+(l<<2)|0;f[h+8>>2]=m;hj(t|0,0,i|0)|0;f[j>>2]=m;z=t;A=m;break}else{z=0;A=0}while(0);if(!s?(f[z>>2]=0,r|0):0){m=1;do{f[z+(m<<2)>>2]=m;m=m+1|0}while((m|0)!=(l|0))}f[g>>2]=a;Jb(z,A,g);a:do if((x|0)<4096){g=(f[a>>2]|0)+(f[(f[j>>2]|0)+-4>>2]<<3)|0;f[g>>2]=4096-x+(f[g>>2]|0);B=0}else{g=f[h>>2]|0;if((r|0)<=0){A=(x|0)>4096;while(1)if(!A){B=0;break a}}A=f[a>>2]|0;z=x+-4096|0;m=x;while(1){v=4096.0/+(m|0);t=r;i=z;c=m;while(1){p=A+(f[g+(t<<2)>>2]<<3)|0;k=f[p>>2]|0;if(k>>>0<2){y=28;break}q=k-~~+J(+(v*+(k>>>0)))|0;o=(q|0)==0?1:q;q=(o|0)<(k|0)?o:k+-1|0;o=(q|0)>(i|0)?i:q;f[p>>2]=k-o;k=c-o|0;p=i-o|0;if((k|0)==4096){C=p;D=4096;break}if((t|0)>1){t=t+-1|0;i=p;c=k}else{C=p;D=k;break}}if((y|0)==28){y=0;if((t|0)==(r|0)){B=1;break a}else{C=i;D=c}}if((C|0)>0){z=C;m=D}else{B=0;break}}}while(0);D=f[h>>2]|0;if(D|0){h=f[j>>2]|0;if((h|0)!=(D|0))f[j>>2]=h+(~((h+-4-D|0)>>>2)<<2);br(D)}if((B|0)!=0|s){w=0;u=e;return w|0}}B=f[a>>2]|0;D=0;h=0;do{f[B+(D<<3)+4>>2]=h;h=(f[B+(D<<3)>>2]|0)+h|0;D=D+1|0}while((D|0)!=(l|0));if((h|0)!=4096){w=0;u=e;return w|0}if(s)E=0.0;else{s=f[a>>2]|0;h=0;v=0.0;while(1){D=f[s+(h<<3)>>2]|0;if(!D)F=v;else{B=b+(h<<3)|0;G=+((f[B>>2]|0)>>>0)+4294967296.0*+((f[B+4>>2]|0)>>>0);F=v+ +Fg(+(D>>>0)*.000244140625)*G}h=h+1|0;if((h|0)==(l|0)){E=F;break}else v=F}}F=+W(+-E);l=+K(F)>=1.0?(F>0.0?~~+Y(+J(F/4294967296.0),4294967295.0)>>>0:~~+W((F-+(~~F>>>0))/4294967296.0)>>>0):0;h=a+16|0;f[h>>2]=~~F>>>0;f[h+4>>2]=l;w=xe(a,d)|0;u=e;return w|0}function ad(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0.0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0.0,F=0.0,G=0.0;e=u;u=u+16|0;g=e;h=e+4|0;if((c|0)>0){i=0;j=0;k=0;l=0;while(1){m=b+(j<<3)|0;n=f[m>>2]|0;o=f[m+4>>2]|0;m=Tn(n|0,o|0,k|0,l|0)|0;p=I;q=(n|0)==0&(o|0)==0?i:j;j=j+1|0;if((j|0)==(c|0)){r=q;s=p;t=m;break}else{i=q;k=m;l=p}}}else{r=0;s=0;t=0}l=r+1|0;f[a+12>>2]=l;k=a+4|0;i=f[k>>2]|0;c=f[a>>2]|0;j=i-c>>3;p=c;c=i;if(l>>>0<=j>>>0){if(l>>>0<j>>>0?(i=p+(l<<3)|0,(i|0)!=(c|0)):0)f[k>>2]=c+(~((c+-8-i|0)>>>3)<<3)}else dh(a,l-j|0);v=+(t>>>0)+4294967296.0*+(s>>>0);s=(r|0)<0;if(!s){t=f[a>>2]|0;j=0;i=0;do{c=b+(i<<3)|0;k=f[c>>2]|0;p=f[c+4>>2]|0;c=~~((+(k>>>0)+4294967296.0*+(p>>>0))/v*4096.0+.5)>>>0;m=((k|0)!=0|(p|0)!=0)&(c|0)==0?1:c;f[t+(i<<3)>>2]=m;j=m+j|0;i=i+1|0}while((i|0)!=(l|0));if((j|0)==4096){if(s){w=0;u=e;return w|0}}else{x=j;y=12}}else{x=0;y=12}if((y|0)==12){f[h>>2]=0;j=h+4|0;f[j>>2]=0;f[h+8>>2]=0;do if(l)if(l>>>0>1073741823)mq(h);else{i=l<<2;t=dn(i)|0;f[h>>2]=t;m=t+(l<<2)|0;f[h+8>>2]=m;hj(t|0,0,i|0)|0;f[j>>2]=m;z=t;A=m;break}else{z=0;A=0}while(0);if(!s?(f[z>>2]=0,r|0):0){m=1;do{f[z+(m<<2)>>2]=m;m=m+1|0}while((m|0)!=(l|0))}f[g>>2]=a;Kb(z,A,g);a:do if((x|0)<4096){g=(f[a>>2]|0)+(f[(f[j>>2]|0)+-4>>2]<<3)|0;f[g>>2]=4096-x+(f[g>>2]|0);B=0}else{g=f[h>>2]|0;if((r|0)<=0){A=(x|0)>4096;while(1)if(!A){B=0;break a}}A=f[a>>2]|0;z=x+-4096|0;m=x;while(1){v=4096.0/+(m|0);t=r;i=z;c=m;while(1){p=A+(f[g+(t<<2)>>2]<<3)|0;k=f[p>>2]|0;if(k>>>0<2){y=28;break}q=k-~~+J(+(v*+(k>>>0)))|0;o=(q|0)==0?1:q;q=(o|0)<(k|0)?o:k+-1|0;o=(q|0)>(i|0)?i:q;f[p>>2]=k-o;k=c-o|0;p=i-o|0;if((k|0)==4096){C=p;D=4096;break}if((t|0)>1){t=t+-1|0;i=p;c=k}else{C=p;D=k;break}}if((y|0)==28){y=0;if((t|0)==(r|0)){B=1;break a}else{C=i;D=c}}if((C|0)>0){z=C;m=D}else{B=0;break}}}while(0);D=f[h>>2]|0;if(D|0){h=f[j>>2]|0;if((h|0)!=(D|0))f[j>>2]=h+(~((h+-4-D|0)>>>2)<<2);br(D)}if((B|0)!=0|s){w=0;u=e;return w|0}}B=f[a>>2]|0;D=0;h=0;do{f[B+(D<<3)+4>>2]=h;h=(f[B+(D<<3)>>2]|0)+h|0;D=D+1|0}while((D|0)!=(l|0));if((h|0)!=4096){w=0;u=e;return w|0}if(s)E=0.0;else{s=f[a>>2]|0;h=0;v=0.0;while(1){D=f[s+(h<<3)>>2]|0;if(!D)F=v;else{B=b+(h<<3)|0;G=+((f[B>>2]|0)>>>0)+4294967296.0*+((f[B+4>>2]|0)>>>0);F=v+ +Fg(+(D>>>0)*.000244140625)*G}h=h+1|0;if((h|0)==(l|0)){E=F;break}else v=F}}F=+W(+-E);l=+K(F)>=1.0?(F>0.0?~~+Y(+J(F/4294967296.0),4294967295.0)>>>0:~~+W((F-+(~~F>>>0))/4294967296.0)>>>0):0;h=a+16|0;f[h>>2]=~~F>>>0;f[h+4>>2]=l;w=xe(a,d)|0;u=e;return w|0}function bd(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0.0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0.0,F=0.0,G=0.0;e=u;u=u+16|0;g=e;h=e+4|0;if((c|0)>0){i=0;j=0;k=0;l=0;while(1){m=b+(j<<3)|0;n=f[m>>2]|0;o=f[m+4>>2]|0;m=Tn(n|0,o|0,k|0,l|0)|0;p=I;q=(n|0)==0&(o|0)==0?i:j;j=j+1|0;if((j|0)==(c|0)){r=q;s=p;t=m;break}else{i=q;k=m;l=p}}}else{r=0;s=0;t=0}l=r+1|0;f[a+12>>2]=l;k=a+4|0;i=f[k>>2]|0;c=f[a>>2]|0;j=i-c>>3;p=c;c=i;if(l>>>0<=j>>>0){if(l>>>0<j>>>0?(i=p+(l<<3)|0,(i|0)!=(c|0)):0)f[k>>2]=c+(~((c+-8-i|0)>>>3)<<3)}else dh(a,l-j|0);v=+(t>>>0)+4294967296.0*+(s>>>0);s=(r|0)<0;if(!s){t=f[a>>2]|0;j=0;i=0;do{c=b+(i<<3)|0;k=f[c>>2]|0;p=f[c+4>>2]|0;c=~~((+(k>>>0)+4294967296.0*+(p>>>0))/v*4096.0+.5)>>>0;m=((k|0)!=0|(p|0)!=0)&(c|0)==0?1:c;f[t+(i<<3)>>2]=m;j=m+j|0;i=i+1|0}while((i|0)!=(l|0));if((j|0)==4096){if(s){w=0;u=e;return w|0}}else{x=j;y=12}}else{x=0;y=12}if((y|0)==12){f[h>>2]=0;j=h+4|0;f[j>>2]=0;f[h+8>>2]=0;do if(l)if(l>>>0>1073741823)mq(h);else{i=l<<2;t=dn(i)|0;f[h>>2]=t;m=t+(l<<2)|0;f[h+8>>2]=m;hj(t|0,0,i|0)|0;f[j>>2]=m;z=t;A=m;break}else{z=0;A=0}while(0);if(!s?(f[z>>2]=0,r|0):0){m=1;do{f[z+(m<<2)>>2]=m;m=m+1|0}while((m|0)!=(l|0))}f[g>>2]=a;Lb(z,A,g);a:do if((x|0)<4096){g=(f[a>>2]|0)+(f[(f[j>>2]|0)+-4>>2]<<3)|0;f[g>>2]=4096-x+(f[g>>2]|0);B=0}else{g=f[h>>2]|0;if((r|0)<=0){A=(x|0)>4096;while(1)if(!A){B=0;break a}}A=f[a>>2]|0;z=x+-4096|0;m=x;while(1){v=4096.0/+(m|0);t=r;i=z;c=m;while(1){p=A+(f[g+(t<<2)>>2]<<3)|0;k=f[p>>2]|0;if(k>>>0<2){y=28;break}q=k-~~+J(+(v*+(k>>>0)))|0;o=(q|0)==0?1:q;q=(o|0)<(k|0)?o:k+-1|0;o=(q|0)>(i|0)?i:q;f[p>>2]=k-o;k=c-o|0;p=i-o|0;if((k|0)==4096){C=p;D=4096;break}if((t|0)>1){t=t+-1|0;i=p;c=k}else{C=p;D=k;break}}if((y|0)==28){y=0;if((t|0)==(r|0)){B=1;break a}else{C=i;D=c}}if((C|0)>0){z=C;m=D}else{B=0;break}}}while(0);D=f[h>>2]|0;if(D|0){h=f[j>>2]|0;if((h|0)!=(D|0))f[j>>2]=h+(~((h+-4-D|0)>>>2)<<2);br(D)}if((B|0)!=0|s){w=0;u=e;return w|0}}B=f[a>>2]|0;D=0;h=0;do{f[B+(D<<3)+4>>2]=h;h=(f[B+(D<<3)>>2]|0)+h|0;D=D+1|0}while((D|0)!=(l|0));if((h|0)!=4096){w=0;u=e;return w|0}if(s)E=0.0;else{s=f[a>>2]|0;h=0;v=0.0;while(1){D=f[s+(h<<3)>>2]|0;if(!D)F=v;else{B=b+(h<<3)|0;G=+((f[B>>2]|0)>>>0)+4294967296.0*+((f[B+4>>2]|0)>>>0);F=v+ +Fg(+(D>>>0)*.000244140625)*G}h=h+1|0;if((h|0)==(l|0)){E=F;break}else v=F}}F=+W(+-E);l=+K(F)>=1.0?(F>0.0?~~+Y(+J(F/4294967296.0),4294967295.0)>>>0:~~+W((F-+(~~F>>>0))/4294967296.0)>>>0):0;h=a+16|0;f[h>>2]=~~F>>>0;f[h+4>>2]=l;w=xe(a,d)|0;u=e;return w|0}function cd(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0.0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0.0,F=0.0,G=0.0;e=u;u=u+16|0;g=e;h=e+4|0;if((c|0)>0){i=0;j=0;k=0;l=0;while(1){m=b+(j<<3)|0;n=f[m>>2]|0;o=f[m+4>>2]|0;m=Tn(n|0,o|0,k|0,l|0)|0;p=I;q=(n|0)==0&(o|0)==0?i:j;j=j+1|0;if((j|0)==(c|0)){r=q;s=p;t=m;break}else{i=q;k=m;l=p}}}else{r=0;s=0;t=0}l=r+1|0;f[a+12>>2]=l;k=a+4|0;i=f[k>>2]|0;c=f[a>>2]|0;j=i-c>>3;p=c;c=i;if(l>>>0<=j>>>0){if(l>>>0<j>>>0?(i=p+(l<<3)|0,(i|0)!=(c|0)):0)f[k>>2]=c+(~((c+-8-i|0)>>>3)<<3)}else dh(a,l-j|0);v=+(t>>>0)+4294967296.0*+(s>>>0);s=(r|0)<0;if(!s){t=f[a>>2]|0;j=0;i=0;do{c=b+(i<<3)|0;k=f[c>>2]|0;p=f[c+4>>2]|0;c=~~((+(k>>>0)+4294967296.0*+(p>>>0))/v*4096.0+.5)>>>0;m=((k|0)!=0|(p|0)!=0)&(c|0)==0?1:c;f[t+(i<<3)>>2]=m;j=m+j|0;i=i+1|0}while((i|0)!=(l|0));if((j|0)==4096){if(s){w=0;u=e;return w|0}}else{x=j;y=12}}else{x=0;y=12}if((y|0)==12){f[h>>2]=0;j=h+4|0;f[j>>2]=0;f[h+8>>2]=0;do if(l)if(l>>>0>1073741823)mq(h);else{i=l<<2;t=dn(i)|0;f[h>>2]=t;m=t+(l<<2)|0;f[h+8>>2]=m;hj(t|0,0,i|0)|0;f[j>>2]=m;z=t;A=m;break}else{z=0;A=0}while(0);if(!s?(f[z>>2]=0,r|0):0){m=1;do{f[z+(m<<2)>>2]=m;m=m+1|0}while((m|0)!=(l|0))}f[g>>2]=a;Mb(z,A,g);a:do if((x|0)<4096){g=(f[a>>2]|0)+(f[(f[j>>2]|0)+-4>>2]<<3)|0;f[g>>2]=4096-x+(f[g>>2]|0);B=0}else{g=f[h>>2]|0;if((r|0)<=0){A=(x|0)>4096;while(1)if(!A){B=0;break a}}A=f[a>>2]|0;z=x+-4096|0;m=x;while(1){v=4096.0/+(m|0);t=r;i=z;c=m;while(1){p=A+(f[g+(t<<2)>>2]<<3)|0;k=f[p>>2]|0;if(k>>>0<2){y=28;break}q=k-~~+J(+(v*+(k>>>0)))|0;o=(q|0)==0?1:q;q=(o|0)<(k|0)?o:k+-1|0;o=(q|0)>(i|0)?i:q;f[p>>2]=k-o;k=c-o|0;p=i-o|0;if((k|0)==4096){C=p;D=4096;break}if((t|0)>1){t=t+-1|0;i=p;c=k}else{C=p;D=k;break}}if((y|0)==28){y=0;if((t|0)==(r|0)){B=1;break a}else{C=i;D=c}}if((C|0)>0){z=C;m=D}else{B=0;break}}}while(0);D=f[h>>2]|0;if(D|0){h=f[j>>2]|0;if((h|0)!=(D|0))f[j>>2]=h+(~((h+-4-D|0)>>>2)<<2);br(D)}if((B|0)!=0|s){w=0;u=e;return w|0}}B=f[a>>2]|0;D=0;h=0;do{f[B+(D<<3)+4>>2]=h;h=(f[B+(D<<3)>>2]|0)+h|0;D=D+1|0}while((D|0)!=(l|0));if((h|0)!=4096){w=0;u=e;return w|0}if(s)E=0.0;else{s=f[a>>2]|0;h=0;v=0.0;while(1){D=f[s+(h<<3)>>2]|0;if(!D)F=v;else{B=b+(h<<3)|0;G=+((f[B>>2]|0)>>>0)+4294967296.0*+((f[B+4>>2]|0)>>>0);F=v+ +Fg(+(D>>>0)*.000244140625)*G}h=h+1|0;if((h|0)==(l|0)){E=F;break}else v=F}}F=+W(+-E);l=+K(F)>=1.0?(F>0.0?~~+Y(+J(F/4294967296.0),4294967295.0)>>>0:~~+W((F-+(~~F>>>0))/4294967296.0)>>>0):0;h=a+16|0;f[h>>2]=~~F>>>0;f[h+4>>2]=l;w=xe(a,d)|0;u=e;return w|0}function dd(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0.0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0.0,F=0.0,G=0.0;e=u;u=u+16|0;g=e;h=e+4|0;if((c|0)>0){i=0;j=0;k=0;l=0;while(1){m=b+(j<<3)|0;n=f[m>>2]|0;o=f[m+4>>2]|0;m=Tn(n|0,o|0,k|0,l|0)|0;p=I;q=(n|0)==0&(o|0)==0?i:j;j=j+1|0;if((j|0)==(c|0)){r=q;s=p;t=m;break}else{i=q;k=m;l=p}}}else{r=0;s=0;t=0}l=r+1|0;f[a+12>>2]=l;k=a+4|0;i=f[k>>2]|0;c=f[a>>2]|0;j=i-c>>3;p=c;c=i;if(l>>>0<=j>>>0){if(l>>>0<j>>>0?(i=p+(l<<3)|0,(i|0)!=(c|0)):0)f[k>>2]=c+(~((c+-8-i|0)>>>3)<<3)}else dh(a,l-j|0);v=+(t>>>0)+4294967296.0*+(s>>>0);s=(r|0)<0;if(!s){t=f[a>>2]|0;j=0;i=0;do{c=b+(i<<3)|0;k=f[c>>2]|0;p=f[c+4>>2]|0;c=~~((+(k>>>0)+4294967296.0*+(p>>>0))/v*4096.0+.5)>>>0;m=((k|0)!=0|(p|0)!=0)&(c|0)==0?1:c;f[t+(i<<3)>>2]=m;j=m+j|0;i=i+1|0}while((i|0)!=(l|0));if((j|0)==4096){if(s){w=0;u=e;return w|0}}else{x=j;y=12}}else{x=0;y=12}if((y|0)==12){f[h>>2]=0;j=h+4|0;f[j>>2]=0;f[h+8>>2]=0;do if(l)if(l>>>0>1073741823)mq(h);else{i=l<<2;t=dn(i)|0;f[h>>2]=t;m=t+(l<<2)|0;f[h+8>>2]=m;hj(t|0,0,i|0)|0;f[j>>2]=m;z=t;A=m;break}else{z=0;A=0}while(0);if(!s?(f[z>>2]=0,r|0):0){m=1;do{f[z+(m<<2)>>2]=m;m=m+1|0}while((m|0)!=(l|0))}f[g>>2]=a;Nb(z,A,g);a:do if((x|0)<4096){g=(f[a>>2]|0)+(f[(f[j>>2]|0)+-4>>2]<<3)|0;f[g>>2]=4096-x+(f[g>>2]|0);B=0}else{g=f[h>>2]|0;if((r|0)<=0){A=(x|0)>4096;while(1)if(!A){B=0;break a}}A=f[a>>2]|0;z=x+-4096|0;m=x;while(1){v=4096.0/+(m|0);t=r;i=z;c=m;while(1){p=A+(f[g+(t<<2)>>2]<<3)|0;k=f[p>>2]|0;if(k>>>0<2){y=28;break}q=k-~~+J(+(v*+(k>>>0)))|0;o=(q|0)==0?1:q;q=(o|0)<(k|0)?o:k+-1|0;o=(q|0)>(i|0)?i:q;f[p>>2]=k-o;k=c-o|0;p=i-o|0;if((k|0)==4096){C=p;D=4096;break}if((t|0)>1){t=t+-1|0;i=p;c=k}else{C=p;D=k;break}}if((y|0)==28){y=0;if((t|0)==(r|0)){B=1;break a}else{C=i;D=c}}if((C|0)>0){z=C;m=D}else{B=0;break}}}while(0);D=f[h>>2]|0;if(D|0){h=f[j>>2]|0;if((h|0)!=(D|0))f[j>>2]=h+(~((h+-4-D|0)>>>2)<<2);br(D)}if((B|0)!=0|s){w=0;u=e;return w|0}}B=f[a>>2]|0;D=0;h=0;do{f[B+(D<<3)+4>>2]=h;h=(f[B+(D<<3)>>2]|0)+h|0;D=D+1|0}while((D|0)!=(l|0));if((h|0)!=4096){w=0;u=e;return w|0}if(s)E=0.0;else{s=f[a>>2]|0;h=0;v=0.0;while(1){D=f[s+(h<<3)>>2]|0;if(!D)F=v;else{B=b+(h<<3)|0;G=+((f[B>>2]|0)>>>0)+4294967296.0*+((f[B+4>>2]|0)>>>0);F=v+ +Fg(+(D>>>0)*.000244140625)*G}h=h+1|0;if((h|0)==(l|0)){E=F;break}else v=F}}F=+W(+-E);l=+K(F)>=1.0?(F>0.0?~~+Y(+J(F/4294967296.0),4294967295.0)>>>0:~~+W((F-+(~~F>>>0))/4294967296.0)>>>0):0;h=a+16|0;f[h>>2]=~~F>>>0;f[h+4>>2]=l;w=xe(a,d)|0;u=e;return w|0}function ed(a,b,c,d,e,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0;g=u;u=u+32|0;d=g+16|0;h=g+8|0;i=g;j=e>>>0>1073741823?-1:e<<2;k=_q(j)|0;hj(k|0,0,j|0)|0;j=f[a+28>>2]|0;l=a+36|0;m=f[l>>2]|0;n=f[m+4>>2]|0;o=f[m>>2]|0;p=n-o|0;a:do if((p|0)>4){q=p>>2;r=f[a+32>>2]|0;s=a+8|0;t=h+4|0;v=i+4|0;w=d+4|0;x=j+12|0;y=(e|0)>0;z=k+4|0;A=h+4|0;B=i+4|0;C=d+4|0;D=q+-1|0;if(n-o>>2>>>0>D>>>0){E=q;F=D;G=o}else{H=m;mq(H)}while(1){D=f[G+(F<<2)>>2]|0;q=X(F,e)|0;if((D|0)!=-1?(I=f[(f[x>>2]|0)+(D<<2)>>2]|0,(I|0)!=-1):0){D=f[j>>2]|0;J=f[r>>2]|0;K=f[J+(f[D+(I<<2)>>2]<<2)>>2]|0;L=I+1|0;M=((L>>>0)%3|0|0)==0?I+-2|0:L;if((M|0)==-1)N=-1;else N=f[D+(M<<2)>>2]|0;M=f[J+(N<<2)>>2]|0;L=(((I>>>0)%3|0|0)==0?2:-1)+I|0;if((L|0)==-1)O=-1;else O=f[D+(L<<2)>>2]|0;L=f[J+(O<<2)>>2]|0;if((K|0)<(F|0)&(M|0)<(F|0)&(L|0)<(F|0)){J=X(K,e)|0;K=X(M,e)|0;M=X(L,e)|0;if(y){L=0;do{f[k+(L<<2)>>2]=(f[b+(L+M<<2)>>2]|0)+(f[b+(L+K<<2)>>2]|0)-(f[b+(L+J<<2)>>2]|0);L=L+1|0}while((L|0)!=(e|0))}L=b+(q<<2)|0;J=c+(q<<2)|0;K=f[L+4>>2]|0;M=f[k>>2]|0;D=f[z>>2]|0;f[h>>2]=f[L>>2];f[A>>2]=K;f[i>>2]=M;f[B>>2]=D;Dd(d,s,h,i);f[J>>2]=f[d>>2];f[J+4>>2]=f[C>>2]}else P=15}else P=15;if((P|0)==15){P=0;J=b+(q<<2)|0;D=b+((X(E+-2|0,e)|0)<<2)|0;M=c+(q<<2)|0;K=f[J+4>>2]|0;L=f[D>>2]|0;I=f[D+4>>2]|0;f[h>>2]=f[J>>2];f[t>>2]=K;f[i>>2]=L;f[v>>2]=I;Dd(d,s,h,i);f[M>>2]=f[d>>2];f[M+4>>2]=f[w>>2]}if((E|0)<=2)break a;M=f[l>>2]|0;G=f[M>>2]|0;I=F+-1|0;if((f[M+4>>2]|0)-G>>2>>>0<=I>>>0){H=M;break}else{M=F;F=I;E=M}}mq(H)}while(0);if((e|0)<=0){Q=a+8|0;R=b+4|0;S=f[b>>2]|0;T=f[R>>2]|0;U=k+4|0;V=f[k>>2]|0;W=f[U>>2]|0;f[h>>2]=S;Y=h+4|0;f[Y>>2]=T;f[i>>2]=V;Z=i+4|0;f[Z>>2]=W;Dd(d,Q,h,i);_=f[d>>2]|0;f[c>>2]=_;$=d+4|0;aa=f[$>>2]|0;ba=c+4|0;f[ba>>2]=aa;$q(k);u=g;return 1}hj(k|0,0,e<<2|0)|0;Q=a+8|0;R=b+4|0;S=f[b>>2]|0;T=f[R>>2]|0;U=k+4|0;V=f[k>>2]|0;W=f[U>>2]|0;f[h>>2]=S;Y=h+4|0;f[Y>>2]=T;f[i>>2]=V;Z=i+4|0;f[Z>>2]=W;Dd(d,Q,h,i);_=f[d>>2]|0;f[c>>2]=_;$=d+4|0;aa=f[$>>2]|0;ba=c+4|0;f[ba>>2]=aa;$q(k);u=g;return 1}function fd(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,J=0,K=0,L=0,M=0;d=u;u=u+32|0;e=d;g=d+20|0;h=d+24|0;i=d+8|0;j=f[a>>2]|0;k=j+8|0;l=j;j=f[l>>2]|0;m=f[l+4>>2]|0;l=Tn(j|0,m|0,f[k>>2]|0,f[k+4>>2]|0)|0;k=I;n=Tn(l|0,k|0,(l|0)==0&(k|0)==0&1|0,0)|0;k=~~((+(j>>>0)+4294967296.0*+(m>>>0))/(+(n>>>0)+4294967296.0*+(I>>>0))*256.0+.5)>>>0;n=k>>>0<255?k:255;k=n+((n|0)==0&1)&255;b[h>>0]=k;n=a+12|0;m=a+16|0;j=((f[m>>2]|0)-(f[n>>2]|0)<<1)+64|0;f[i>>2]=0;l=i+4|0;f[l>>2]=0;f[i+8>>2]=0;if(!j)o=0;else{if((j|0)<0)mq(i);p=dn(j)|0;f[l>>2]=p;f[i>>2]=p;f[i+8>>2]=p+j;q=j;j=p;do{b[j>>0]=0;j=(f[l>>2]|0)+1|0;f[l>>2]=j;q=q+-1|0}while((q|0)!=0);o=f[i>>2]|0}q=a+28|0;j=(f[q>>2]|0)+-1|0;a:do if((j|0)>-1){p=a+24|0;r=j;s=0;t=4096;v=k;while(1){w=(f[p>>2]&1<<r|0)!=0;x=(w?0-(v&255)&255:v)&255;if(t>>>0<x<<12>>>0){y=s;z=t}else{b[o+s>>0]=t;y=s+1|0;z=t>>>8}on(f[3780+(x<<3)>>2]|0,0,z|0,0)|0;A=z+(w?0:0-v&255)+(X((z+I|0)>>>(f[3780+(x<<3)+4>>2]|0),256-x|0)|0)|0;x=r+-1|0;if((x|0)<=-1){B=y;C=A;break a}r=x;s=y;t=A;v=b[h>>0]|0}}else{B=0;C=4096}while(0);y=f[m>>2]|0;if((f[n>>2]|0)==(y|0)){D=B;E=C}else{z=B;B=C;C=y;while(1){C=C+-4|0;y=f[C>>2]|0;k=31;j=z;v=B;while(1){t=b[h>>0]|0;s=(1<<k&y|0)!=0;r=(s?0-(t&255)&255:t)&255;if(v>>>0<r<<12>>>0){F=j;G=v}else{b[o+j>>0]=v;F=j+1|0;G=v>>>8}on(f[3780+(r<<3)>>2]|0,0,G|0,0)|0;v=G+(s?0:0-t&255)+(X((G+I|0)>>>(f[3780+(r<<3)+4>>2]|0),256-r|0)|0)|0;if((k|0)<=0)break;else{k=k+-1|0;j=F}}if((f[n>>2]|0)==(C|0)){D=F;E=v;break}else{z=F;B=v}}}B=E+-4096|0;do if(B>>>0>=64){if(B>>>0<16384){F=o+D|0;z=E+12288|0;b[F>>0]=z;H=2;J=z>>>8;K=F+1|0;L=25;break}if(B>>>0<4194304){F=o+D|0;z=E+8384512|0;b[F>>0]=z;b[F+1>>0]=z>>>8;H=3;J=z>>>16;K=F+2|0;L=25}else M=D}else{H=1;J=B;K=o+D|0;L=25}while(0);if((L|0)==25){b[K>>0]=J;M=H+D|0}D=c+16|0;H=D;J=f[H+4>>2]|0;if(!((J|0)>0|(J|0)==0&(f[H>>2]|0)>>>0>0)){f[g>>2]=f[c+4>>2];f[e>>2]=f[g>>2];ye(c,e,h,h+1|0)|0}Nh(M,c)|0;h=f[i>>2]|0;H=D;D=f[H+4>>2]|0;if(!((D|0)>0|(D|0)==0&(f[H>>2]|0)>>>0>0)){f[g>>2]=f[c+4>>2];f[e>>2]=f[g>>2];ye(c,e,h,h+M|0)|0}M=e;f[M>>2]=0;f[M+4>>2]=0;cf(a,2,e);e=f[a+12>>2]|0;M=f[m>>2]|0;if((M|0)!=(e|0))f[m>>2]=M+(~((M+-4-e|0)>>>2)<<2);f[a+24>>2]=0;f[q>>2]=0;q=f[i>>2]|0;if(!q){u=d;return}if((f[l>>2]|0)!=(q|0))f[l>>2]=q;br(q);u=d;return}function gd(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0;c=u;u=u+16|0;b=c+8|0;d=c+4|0;e=c;g=a+64|0;h=f[g>>2]|0;if((f[h+28>>2]|0)==(f[h+24>>2]|0)){u=c;return}i=a+52|0;j=a+56|0;k=a+60|0;l=a+12|0;m=a+28|0;n=a+40|0;o=a+44|0;p=a+48|0;q=0;r=0;s=h;while(1){h=f[(f[s+24>>2]|0)+(r<<2)>>2]|0;if((h|0)==-1){t=q;v=s}else{w=q+1|0;f[b>>2]=q;x=f[j>>2]|0;if((x|0)==(f[k>>2]|0))Ci(i,b);else{f[x>>2]=q;f[j>>2]=x+4}f[d>>2]=h;f[e>>2]=0;a:do if(!(f[(f[l>>2]|0)+(r>>>5<<2)>>2]&1<<(r&31)))y=h;else{x=h+1|0;z=((x>>>0)%3|0|0)==0?h+-2|0:x;if(((z|0)!=-1?(f[(f[a>>2]|0)+(z>>>5<<2)>>2]&1<<(z&31)|0)==0:0)?(x=f[(f[(f[g>>2]|0)+12>>2]|0)+(z<<2)>>2]|0,z=x+1|0,(x|0)!=-1):0){A=((z>>>0)%3|0|0)==0?x+-2|0:z;f[e>>2]=A;if((A|0)==-1){y=h;break}else B=A;while(1){f[d>>2]=B;A=B+1|0;z=((A>>>0)%3|0|0)==0?B+-2|0:A;if((z|0)==-1)break;if(f[(f[a>>2]|0)+(z>>>5<<2)>>2]&1<<(z&31)|0)break;A=f[(f[(f[g>>2]|0)+12>>2]|0)+(z<<2)>>2]|0;z=A+1|0;if((A|0)==-1)break;x=((z>>>0)%3|0|0)==0?A+-2|0:z;f[e>>2]=x;if((x|0)==-1){y=B;break a}else B=x}f[e>>2]=-1;y=B;break}f[e>>2]=-1;y=h}while(0);f[(f[m>>2]|0)+(y<<2)>>2]=f[b>>2];h=f[o>>2]|0;if((h|0)==(f[p>>2]|0))Ci(n,d);else{f[h>>2]=f[d>>2];f[o>>2]=h+4}h=f[g>>2]|0;x=f[d>>2]|0;b:do if(((x|0)!=-1?(z=(((x>>>0)%3|0|0)==0?2:-1)+x|0,(z|0)!=-1):0)?(A=f[(f[h+12>>2]|0)+(z<<2)>>2]|0,(A|0)!=-1):0){z=A+(((A>>>0)%3|0|0)==0?2:-1)|0;f[e>>2]=z;if((z|0)!=-1&(z|0)!=(x|0)){A=w;C=z;while(1){z=C+1|0;D=((z>>>0)%3|0|0)==0?C+-2|0:z;do if(f[(f[a>>2]|0)+(D>>>5<<2)>>2]&1<<(D&31)){z=A+1|0;f[b>>2]=A;E=f[j>>2]|0;if((E|0)==(f[k>>2]|0))Ci(i,b);else{f[E>>2]=A;f[j>>2]=E+4}E=f[o>>2]|0;if((E|0)==(f[p>>2]|0)){Ci(n,e);F=z;break}else{f[E>>2]=f[e>>2];f[o>>2]=E+4;F=z;break}}else F=A;while(0);f[(f[m>>2]|0)+(f[e>>2]<<2)>>2]=f[b>>2];G=f[g>>2]|0;D=f[e>>2]|0;if((D|0)==-1)break;z=(((D>>>0)%3|0|0)==0?2:-1)+D|0;if((z|0)==-1)break;D=f[(f[G+12>>2]|0)+(z<<2)>>2]|0;if((D|0)==-1)break;C=D+(((D>>>0)%3|0|0)==0?2:-1)|0;f[e>>2]=C;if(!((C|0)!=-1?(C|0)!=(f[d>>2]|0):0)){H=F;I=G;break b}else A=F}f[e>>2]=-1;H=F;I=G}else{H=w;I=h}}else J=26;while(0);if((J|0)==26){J=0;f[e>>2]=-1;H=w;I=h}t=H;v=I}r=r+1|0;if(r>>>0>=(f[v+28>>2]|0)-(f[v+24>>2]|0)>>2>>>0)break;else{q=t;s=v}}u=c;return}function hd(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0;c=u;u=u+16|0;d=c+8|0;e=c+4|0;g=c;h=a+124|0;f[h>>2]=(f[h>>2]|0)+1;h=a+88|0;i=a+120|0;j=f[i>>2]|0;k=j+1|0;do if((j|0)!=-1){l=((k>>>0)%3|0|0)==0?j+-2|0:k;if(!((j>>>0)%3|0)){m=j+2|0;n=l;break}else{m=j+-1|0;n=l;break}}else{m=-1;n=-1}while(0);k=a+104|0;l=a+92|0;o=f[l>>2]|0;p=o+(n<<2)|0;q=f[k>>2]|0;r=q+(f[p>>2]<<2)|0;s=f[r>>2]|0;switch(b|0){case 1:case 0:{f[r>>2]=s+-1;r=q+(f[o+(m<<2)>>2]<<2)|0;f[r>>2]=(f[r>>2]|0)+-1;if((b|0)==1){if((m|0)!=-1?(r=f[(f[(f[h>>2]|0)+12>>2]|0)+(m<<2)>>2]|0,(r|0)!=-1):0){t=a+64|0;v=1;w=r;while(1){r=f[t>>2]|0;x=f[(f[r>>2]|0)+36>>2]|0;f[e>>2]=(w>>>0)/3|0;f[d>>2]=f[e>>2];if(Ra[x&127](r,d)|0){y=v;break}r=w+1|0;x=((r>>>0)%3|0|0)==0?w+-2|0:r;if((x|0)==-1){z=12;break}w=f[(f[(f[h>>2]|0)+12>>2]|0)+(x<<2)>>2]|0;x=v+1|0;if((w|0)==-1){y=x;break}else v=x}if((z|0)==12)y=v+1|0;A=y;B=f[k>>2]|0;C=f[l>>2]|0}else{A=1;B=q;C=o}f[B+(f[C+(f[i>>2]<<2)>>2]<<2)>>2]=A;A=a+108|0;i=f[A>>2]|0;C=i-B>>2;B=i;if((n|0)!=-1?(i=f[(f[(f[h>>2]|0)+12>>2]|0)+(n<<2)>>2]|0,(i|0)!=-1):0){n=a+64|0;y=1;v=i;while(1){i=f[n>>2]|0;w=f[(f[i>>2]|0)+36>>2]|0;f[g>>2]=(v>>>0)/3|0;f[d>>2]=f[g>>2];if(Ra[w&127](i,d)|0){D=y;break}i=v+1|0;f[(f[l>>2]|0)+((((i>>>0)%3|0|0)==0?v+-2|0:i)<<2)>>2]=C;i=(((v>>>0)%3|0|0)==0?2:-1)+v|0;if((i|0)==-1){z=20;break}v=f[(f[(f[h>>2]|0)+12>>2]|0)+(i<<2)>>2]|0;i=y+1|0;if((v|0)==-1){D=i;break}else y=i}if((z|0)==20)D=y+1|0;E=D;F=f[A>>2]|0}else{E=1;F=B}f[d>>2]=E;if(F>>>0<(f[a+112>>2]|0)>>>0){f[F>>2]=E;f[A>>2]=F+4}else Ci(k,d)}break}case 5:{k=q+(f[o+(j<<2)>>2]<<2)|0;f[k>>2]=(f[k>>2]|0)+-1;k=q+(f[p>>2]<<2)|0;f[k>>2]=(f[k>>2]|0)+-1;k=q+(f[o+(m<<2)>>2]<<2)|0;f[k>>2]=(f[k>>2]|0)+-2;break}case 3:{k=q+(f[o+(j<<2)>>2]<<2)|0;f[k>>2]=(f[k>>2]|0)+-1;k=q+(f[p>>2]<<2)|0;f[k>>2]=(f[k>>2]|0)+-2;k=q+(f[o+(m<<2)>>2]<<2)|0;f[k>>2]=(f[k>>2]|0)+-1;break}case 7:{k=q+(f[o+(j<<2)>>2]<<2)|0;f[k>>2]=(f[k>>2]|0)+-2;k=q+(f[p>>2]<<2)|0;f[k>>2]=(f[k>>2]|0)+-2;k=q+(f[o+(m<<2)>>2]<<2)|0;f[k>>2]=(f[k>>2]|0)+-2;break}default:{}}k=a+116|0;m=f[k>>2]|0;if((m|0)==-1){f[k>>2]=b;u=c;return}o=f[a+128>>2]|0;if((s|0)<(o|0))G=o;else{q=f[a+132>>2]|0;G=(s|0)>(q|0)?q:s}s=G-o|0;o=f[a+136>>2]|0;a=f[3384+(m<<2)>>2]|0;f[d>>2]=a;m=o+(s*12|0)+4|0;G=f[m>>2]|0;if(G>>>0<(f[o+(s*12|0)+8>>2]|0)>>>0){f[G>>2]=a;f[m>>2]=G+4}else Ci(o+(s*12|0)|0,d);f[k>>2]=b;u=c;return}function id(a,b,c,d,e,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,Y=0,Z=0,_=0,$=0;g=u;u=u+32|0;d=g+16|0;h=g+8|0;i=g;j=e>>>0>1073741823?-1:e<<2;k=_q(j)|0;hj(k|0,0,j|0)|0;j=f[a+28>>2]|0;l=a+36|0;m=f[l>>2]|0;n=f[m+4>>2]|0;o=f[m>>2]|0;p=n-o|0;a:do if((p|0)>4){q=p>>2;r=f[a+32>>2]|0;s=a+8|0;t=h+4|0;v=i+4|0;w=d+4|0;x=j+64|0;y=j+28|0;z=(e|0)>0;A=k+4|0;B=h+4|0;C=i+4|0;D=d+4|0;E=q+-1|0;if(n-o>>2>>>0>E>>>0){F=q;G=E;H=o}else{I=m;mq(I)}while(1){E=f[H+(G<<2)>>2]|0;q=X(G,e)|0;if((((E|0)!=-1?(f[(f[j>>2]|0)+(E>>>5<<2)>>2]&1<<(E&31)|0)==0:0)?(J=f[(f[(f[x>>2]|0)+12>>2]|0)+(E<<2)>>2]|0,(J|0)!=-1):0)?(E=f[y>>2]|0,K=f[r>>2]|0,L=f[K+(f[E+(J<<2)>>2]<<2)>>2]|0,M=J+1|0,N=f[K+(f[E+((((M>>>0)%3|0|0)==0?J+-2|0:M)<<2)>>2]<<2)>>2]|0,M=f[K+(f[E+((((J>>>0)%3|0|0)==0?2:-1)+J<<2)>>2]<<2)>>2]|0,(L|0)<(G|0)&(N|0)<(G|0)&(M|0)<(G|0)):0){J=X(L,e)|0;L=X(N,e)|0;N=X(M,e)|0;if(z){M=0;do{f[k+(M<<2)>>2]=(f[b+(M+N<<2)>>2]|0)+(f[b+(M+L<<2)>>2]|0)-(f[b+(M+J<<2)>>2]|0);M=M+1|0}while((M|0)!=(e|0))}M=b+(q<<2)|0;J=c+(q<<2)|0;L=f[M+4>>2]|0;N=f[k>>2]|0;E=f[A>>2]|0;f[h>>2]=f[M>>2];f[B>>2]=L;f[i>>2]=N;f[C>>2]=E;Dd(d,s,h,i);f[J>>2]=f[d>>2];f[J+4>>2]=f[D>>2]}else{J=b+(q<<2)|0;E=b+((X(F+-2|0,e)|0)<<2)|0;N=c+(q<<2)|0;L=f[J+4>>2]|0;M=f[E>>2]|0;K=f[E+4>>2]|0;f[h>>2]=f[J>>2];f[t>>2]=L;f[i>>2]=M;f[v>>2]=K;Dd(d,s,h,i);f[N>>2]=f[d>>2];f[N+4>>2]=f[w>>2]}if((F|0)<=2)break a;N=f[l>>2]|0;H=f[N>>2]|0;K=G+-1|0;if((f[N+4>>2]|0)-H>>2>>>0<=K>>>0){I=N;break}else{N=G;G=K;F=N}}mq(I)}while(0);if((e|0)<=0){O=a+8|0;P=b+4|0;Q=f[b>>2]|0;R=f[P>>2]|0;S=k+4|0;T=f[k>>2]|0;U=f[S>>2]|0;f[h>>2]=Q;V=h+4|0;f[V>>2]=R;f[i>>2]=T;W=i+4|0;f[W>>2]=U;Dd(d,O,h,i);Y=f[d>>2]|0;f[c>>2]=Y;Z=d+4|0;_=f[Z>>2]|0;$=c+4|0;f[$>>2]=_;$q(k);u=g;return 1}hj(k|0,0,e<<2|0)|0;O=a+8|0;P=b+4|0;Q=f[b>>2]|0;R=f[P>>2]|0;S=k+4|0;T=f[k>>2]|0;U=f[S>>2]|0;f[h>>2]=Q;V=h+4|0;f[V>>2]=R;f[i>>2]=T;W=i+4|0;f[W>>2]=U;Dd(d,O,h,i);Y=f[d>>2]|0;f[c>>2]=Y;Z=d+4|0;_=f[Z>>2]|0;$=c+4|0;f[$>>2]=_;$q(k);u=g;return 1}function jd(a,b){a=a|0;b=b|0;var c=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0;c=a+4|0;if(!b){e=f[a>>2]|0;f[a>>2]=0;if(e|0)br(e);f[c>>2]=0;return}if(b>>>0>1073741823){e=ra(8)|0;Wo(e,14941);f[e>>2]=6944;va(e|0,1080,114)}e=dn(b<<2)|0;g=f[a>>2]|0;f[a>>2]=e;if(g|0)br(g);f[c>>2]=b;c=0;do{f[(f[a>>2]|0)+(c<<2)>>2]=0;c=c+1|0}while((c|0)!=(b|0));c=a+8|0;g=f[c>>2]|0;if(!g)return;e=f[g+4>>2]|0;h=b+-1|0;i=(h&b|0)==0;if(!i)if(e>>>0<b>>>0)j=e;else j=(e>>>0)%(b>>>0)|0;else j=e&h;f[(f[a>>2]|0)+(j<<2)>>2]=c;c=f[g>>2]|0;if(!c)return;else{k=j;l=g;m=c;n=g}a:while(1){g=l;c=m;j=n;b:while(1){c:do if(i){e=c;while(1){o=f[e+4>>2]&h;if((o|0)==(k|0)){p=e;break c}q=(f[a>>2]|0)+(o<<2)|0;if(!(f[q>>2]|0)){r=e;s=o;t=q;break b}q=e+8|0;u=q+2|0;v=e+12|0;w=q+6|0;x=f[e>>2]|0;d:do if(!x)y=e;else{z=d[q>>1]|0;A=e;B=x;while(1){C=B+8|0;if(z<<16>>16!=(d[C>>1]|0)){y=A;break d}if((d[u>>1]|0)!=(d[C+2>>1]|0)){y=A;break d}if((d[v>>1]|0)!=(d[B+12>>1]|0)){y=A;break d}if((d[w>>1]|0)!=(d[C+6>>1]|0)){y=A;break d}C=f[B>>2]|0;if(!C){y=B;break}else{D=B;B=C;A=D}}}while(0);f[j>>2]=f[y>>2];f[y>>2]=f[f[(f[a>>2]|0)+(o<<2)>>2]>>2];f[f[(f[a>>2]|0)+(o<<2)>>2]>>2]=e;e=f[g>>2]|0;if(!e){E=43;break a}}}else{e=c;while(1){w=f[e+4>>2]|0;if(w>>>0<b>>>0)F=w;else F=(w>>>0)%(b>>>0)|0;if((F|0)==(k|0)){p=e;break c}w=(f[a>>2]|0)+(F<<2)|0;if(!(f[w>>2]|0)){r=e;s=F;t=w;break b}w=e+8|0;v=w+2|0;u=e+12|0;x=w+6|0;q=f[e>>2]|0;e:do if(!q)G=e;else{A=d[w>>1]|0;B=e;z=q;while(1){D=z+8|0;if(A<<16>>16!=(d[D>>1]|0)){G=B;break e}if((d[v>>1]|0)!=(d[D+2>>1]|0)){G=B;break e}if((d[u>>1]|0)!=(d[z+12>>1]|0)){G=B;break e}if((d[x>>1]|0)!=(d[D+6>>1]|0)){G=B;break e}D=f[z>>2]|0;if(!D){G=z;break}else{C=z;z=D;B=C}}}while(0);f[j>>2]=f[G>>2];f[G>>2]=f[f[(f[a>>2]|0)+(F<<2)>>2]>>2];f[f[(f[a>>2]|0)+(F<<2)>>2]>>2]=e;e=f[g>>2]|0;if(!e){E=43;break a}}}while(0);c=f[p>>2]|0;if(!c){E=43;break a}else{g=p;j=p}}f[t>>2]=j;m=f[r>>2]|0;if(!m){E=43;break}else{k=s;l=r;n=r}}if((E|0)==43)return}function kd(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0;d=a+4|0;if(!c){e=f[a>>2]|0;f[a>>2]=0;if(e|0)br(e);f[d>>2]=0;return}if(c>>>0>1073741823){e=ra(8)|0;Wo(e,14941);f[e>>2]=6944;va(e|0,1080,114)}e=dn(c<<2)|0;g=f[a>>2]|0;f[a>>2]=e;if(g|0)br(g);f[d>>2]=c;d=0;do{f[(f[a>>2]|0)+(d<<2)>>2]=0;d=d+1|0}while((d|0)!=(c|0));d=a+8|0;g=f[d>>2]|0;if(!g)return;e=f[g+4>>2]|0;h=c+-1|0;i=(h&c|0)==0;if(!i)if(e>>>0<c>>>0)j=e;else j=(e>>>0)%(c>>>0)|0;else j=e&h;f[(f[a>>2]|0)+(j<<2)>>2]=d;d=f[g>>2]|0;if(!d)return;else{k=j;l=g;m=d;n=g}a:while(1){g=l;d=m;j=n;b:while(1){c:do if(i){e=d;while(1){o=f[e+4>>2]&h;if((o|0)==(k|0)){p=e;break c}q=(f[a>>2]|0)+(o<<2)|0;if(!(f[q>>2]|0)){r=e;s=o;t=q;break b}q=e+8|0;u=q+1|0;v=q+2|0;w=q+3|0;x=f[e>>2]|0;d:do if(!x)y=e;else{z=b[q>>0]|0;A=e;B=x;while(1){C=B+8|0;if(z<<24>>24!=(b[C>>0]|0)){y=A;break d}if((b[u>>0]|0)!=(b[C+1>>0]|0)){y=A;break d}if((b[v>>0]|0)!=(b[C+2>>0]|0)){y=A;break d}if((b[w>>0]|0)!=(b[C+3>>0]|0)){y=A;break d}C=f[B>>2]|0;if(!C){y=B;break}else{D=B;B=C;A=D}}}while(0);f[j>>2]=f[y>>2];f[y>>2]=f[f[(f[a>>2]|0)+(o<<2)>>2]>>2];f[f[(f[a>>2]|0)+(o<<2)>>2]>>2]=e;e=f[g>>2]|0;if(!e){E=43;break a}}}else{e=d;while(1){w=f[e+4>>2]|0;if(w>>>0<c>>>0)F=w;else F=(w>>>0)%(c>>>0)|0;if((F|0)==(k|0)){p=e;break c}w=(f[a>>2]|0)+(F<<2)|0;if(!(f[w>>2]|0)){r=e;s=F;t=w;break b}w=e+8|0;v=w+1|0;u=w+2|0;x=w+3|0;q=f[e>>2]|0;e:do if(!q)G=e;else{A=b[w>>0]|0;B=e;z=q;while(1){D=z+8|0;if(A<<24>>24!=(b[D>>0]|0)){G=B;break e}if((b[v>>0]|0)!=(b[D+1>>0]|0)){G=B;break e}if((b[u>>0]|0)!=(b[D+2>>0]|0)){G=B;break e}if((b[x>>0]|0)!=(b[D+3>>0]|0)){G=B;break e}D=f[z>>2]|0;if(!D){G=z;break}else{C=z;z=D;B=C}}}while(0);f[j>>2]=f[G>>2];f[G>>2]=f[f[(f[a>>2]|0)+(F<<2)>>2]>>2];f[f[(f[a>>2]|0)+(F<<2)>>2]>>2]=e;e=f[g>>2]|0;if(!e){E=43;break a}}}while(0);d=f[p>>2]|0;if(!d){E=43;break a}else{g=p;j=p}}f[t>>2]=j;m=f[r>>2]|0;if(!m){E=43;break}else{k=s;l=r;n=r}}if((E|0)==43)return}function ld(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0;c=a+4|0;if(!b){d=f[a>>2]|0;f[a>>2]=0;if(d|0)br(d);f[c>>2]=0;return}if(b>>>0>1073741823){d=ra(8)|0;Wo(d,14941);f[d>>2]=6944;va(d|0,1080,114)}d=dn(b<<2)|0;e=f[a>>2]|0;f[a>>2]=d;if(e|0)br(e);f[c>>2]=b;c=0;do{f[(f[a>>2]|0)+(c<<2)>>2]=0;c=c+1|0}while((c|0)!=(b|0));c=a+8|0;e=f[c>>2]|0;if(!e)return;d=f[e+4>>2]|0;g=b+-1|0;h=(g&b|0)==0;if(!h)if(d>>>0<b>>>0)i=d;else i=(d>>>0)%(b>>>0)|0;else i=d&g;f[(f[a>>2]|0)+(i<<2)>>2]=c;c=f[e>>2]|0;if(!c)return;else{j=i;k=e;l=c;m=e}a:while(1){e=k;c=l;i=m;b:while(1){c:do if(h){d=c;while(1){n=f[d+4>>2]&g;if((n|0)==(j|0)){o=d;break c}p=(f[a>>2]|0)+(n<<2)|0;if(!(f[p>>2]|0)){q=d;r=n;s=p;break b}p=d+12|0;t=d+16|0;u=d+20|0;v=f[d>>2]|0;d:do if(!v)w=d;else{x=f[d+8>>2]|0;y=d;z=v;while(1){if((x|0)!=(f[z+8>>2]|0)){w=y;break d}if((f[p>>2]|0)!=(f[z+12>>2]|0)){w=y;break d}if((f[t>>2]|0)!=(f[z+16>>2]|0)){w=y;break d}if((f[u>>2]|0)!=(f[z+20>>2]|0)){w=y;break d}A=f[z>>2]|0;if(!A){w=z;break}else{B=z;z=A;y=B}}}while(0);f[i>>2]=f[w>>2];f[w>>2]=f[f[(f[a>>2]|0)+(n<<2)>>2]>>2];f[f[(f[a>>2]|0)+(n<<2)>>2]>>2]=d;d=f[e>>2]|0;if(!d){C=43;break a}}}else{d=c;while(1){u=f[d+4>>2]|0;if(u>>>0<b>>>0)D=u;else D=(u>>>0)%(b>>>0)|0;if((D|0)==(j|0)){o=d;break c}u=(f[a>>2]|0)+(D<<2)|0;if(!(f[u>>2]|0)){q=d;r=D;s=u;break b}u=d+12|0;t=d+16|0;p=d+20|0;v=f[d>>2]|0;e:do if(!v)E=d;else{y=f[d+8>>2]|0;z=d;x=v;while(1){if((y|0)!=(f[x+8>>2]|0)){E=z;break e}if((f[u>>2]|0)!=(f[x+12>>2]|0)){E=z;break e}if((f[t>>2]|0)!=(f[x+16>>2]|0)){E=z;break e}if((f[p>>2]|0)!=(f[x+20>>2]|0)){E=z;break e}B=f[x>>2]|0;if(!B){E=x;break}else{A=x;x=B;z=A}}}while(0);f[i>>2]=f[E>>2];f[E>>2]=f[f[(f[a>>2]|0)+(D<<2)>>2]>>2];f[f[(f[a>>2]|0)+(D<<2)>>2]>>2]=d;d=f[e>>2]|0;if(!d){C=43;break a}}}while(0);c=f[o>>2]|0;if(!c){C=43;break a}else{e=o;i=o}}f[s>>2]=i;l=f[q>>2]|0;if(!l){C=43;break}else{j=r;k=q;m=q}}if((C|0)==43)return}function md(a,c,d,e,g){a=a|0;c=c|0;d=d|0;e=e|0;g=g|0;var i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,J=0,K=0,L=0,M=0,N=0;i=u;u=u+352|0;j=i+340|0;k=i+336|0;l=i+80|0;m=i+48|0;n=i;hj(l|0,0,256)|0;o=f[e+4>>2]|0;p=f[e>>2]|0;q=p;if((o|0)!=(p|0)){r=o-p>>2;p=0;do{o=l+(f[q+(p<<2)>>2]<<3)|0;s=o;t=Tn(f[s>>2]|0,f[s+4>>2]|0,1,0)|0;s=o;f[s>>2]=t;f[s+4>>2]=I;p=p+1|0}while(p>>>0<r>>>0)}Cn(m);r=Rn(c|0,((c|0)<0)<<31>>31|0,5)|0;p=I;q=n+40|0;s=q;f[s>>2]=0;f[s+4>>2]=0;s=n;t=s+36|0;do{f[s>>2]=0;s=s+4|0}while((s|0)<(t|0));$c(n,l,32,g)|0;l=n+16|0;s=Rn(f[l>>2]|0,f[l+4>>2]|0,1)|0;l=g+4|0;t=(f[l>>2]|0)-(f[g>>2]|0)|0;o=q;f[o>>2]=t;f[o+4>>2]=0;o=Tn(s|0,I|0,39,0)|0;s=Wn(o|0,I|0,3)|0;o=Tn(s|0,I|0,8,0)|0;s=Tn(o|0,I|0,t|0,0)|0;vl(g,s,I);s=n+24|0;f[s>>2]=(f[g>>2]|0)+(f[q>>2]|0);q=n+28|0;f[q>>2]=0;t=n+32|0;f[t>>2]=16384;li(m,r,p,0)|0;p=c-d|0;if((p|0)>-1){c=(d|0)>0;r=m+16|0;o=m+12|0;v=p;do{w=f[e>>2]|0;x=f[w+(((v|0)/(d|0)|0)<<2)>>2]|0;y=f[n>>2]|0;z=f[y+(x<<3)>>2]|0;A=f[t>>2]|0;B=z<<10;if(A>>>0<B>>>0){C=A;D=w}else{w=A;do{A=f[s>>2]|0;E=f[q>>2]|0;f[q>>2]=E+1;b[A+E>>0]=w;w=(f[t>>2]|0)>>>8;f[t>>2]=w}while(w>>>0>=B>>>0);C=w;D=f[e>>2]|0}f[t>>2]=(((C>>>0)/(z>>>0)|0)<<12)+((C>>>0)%(z>>>0)|0)+(f[y+(x<<3)+4>>2]|0);B=p-v|0;E=f[D+(((B|0)/(d|0)|0)<<2)>>2]|0;if(c&(E|0)>0){A=0;do{F=f[a+(A+B<<2)>>2]|0;G=r;H=f[G+4>>2]|0;if((H|0)>0|(H|0)==0&(f[G>>2]|0)>>>0>0){G=f[o>>2]|0;H=G+4|0;J=0;K=f[H>>2]|0;do{L=K>>>3;M=K&7;N=(f[G>>2]|0)+L|0;b[N>>0]=(1<<M^255)&(h[N>>0]|0);N=(f[G>>2]|0)+L|0;b[N>>0]=(F>>>J&1)<<M|(h[N>>0]|0);K=(f[H>>2]|0)+1|0;f[H>>2]=K;J=J+1|0}while((J|0)!=(E|0))}A=A+1|0}while((A|0)!=(d|0))}v=v-d|0}while((v|0)>-1)}Lf(n,g);Qf(m);v=f[m>>2]|0;d=m+4|0;o=g+16|0;r=f[o+4>>2]|0;if(!((r|0)>0|(r|0)==0&(f[o>>2]|0)>>>0>0)){o=(f[d>>2]|0)-v|0;f[k>>2]=f[l>>2];f[j>>2]=f[k>>2];ye(g,j,v,v+o|0)|0}o=f[n>>2]|0;if(o|0){v=n+4|0;n=f[v>>2]|0;if((n|0)!=(o|0))f[v>>2]=n+(~((n+-8-o|0)>>>3)<<3);br(o)}o=m+12|0;n=f[o>>2]|0;f[o>>2]=0;if(n|0)br(n);n=f[m>>2]|0;if(!n){u=i;return 1}if((f[d>>2]|0)!=(n|0))f[d>>2]=n;br(n);u=i;return 1}function nd(a,b){a=a|0;b=b|0;var c=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0;c=a+4|0;if(!b){e=f[a>>2]|0;f[a>>2]=0;if(e|0)br(e);f[c>>2]=0;return}if(b>>>0>1073741823){e=ra(8)|0;Wo(e,14941);f[e>>2]=6944;va(e|0,1080,114)}e=dn(b<<2)|0;g=f[a>>2]|0;f[a>>2]=e;if(g|0)br(g);f[c>>2]=b;c=0;do{f[(f[a>>2]|0)+(c<<2)>>2]=0;c=c+1|0}while((c|0)!=(b|0));c=a+8|0;g=f[c>>2]|0;if(!g)return;e=f[g+4>>2]|0;h=b+-1|0;i=(h&b|0)==0;if(!i)if(e>>>0<b>>>0)j=e;else j=(e>>>0)%(b>>>0)|0;else j=e&h;f[(f[a>>2]|0)+(j<<2)>>2]=c;c=f[g>>2]|0;if(!c)return;else{k=j;l=g;m=c;n=g}a:while(1){g=l;c=m;j=n;b:while(1){c:do if(i){e=c;while(1){o=f[e+4>>2]&h;if((o|0)==(k|0)){p=e;break c}q=(f[a>>2]|0)+(o<<2)|0;if(!(f[q>>2]|0)){r=e;s=o;t=q;break b}q=e+8|0;u=e+12|0;v=f[e>>2]|0;d:do if(!v)w=e;else{x=d[q>>1]|0;y=q+2|0;z=e;A=v;while(1){B=A+8|0;if(x<<16>>16!=(d[B>>1]|0)){w=z;break d}if((d[y>>1]|0)!=(d[B+2>>1]|0)){w=z;break d}if((d[u>>1]|0)!=(d[A+12>>1]|0)){w=z;break d}B=f[A>>2]|0;if(!B){w=A;break}else{C=A;A=B;z=C}}}while(0);f[j>>2]=f[w>>2];f[w>>2]=f[f[(f[a>>2]|0)+(o<<2)>>2]>>2];f[f[(f[a>>2]|0)+(o<<2)>>2]>>2]=e;e=f[g>>2]|0;if(!e){D=41;break a}}}else{e=c;while(1){u=f[e+4>>2]|0;if(u>>>0<b>>>0)E=u;else E=(u>>>0)%(b>>>0)|0;if((E|0)==(k|0)){p=e;break c}u=(f[a>>2]|0)+(E<<2)|0;if(!(f[u>>2]|0)){r=e;s=E;t=u;break b}u=e+8|0;v=e+12|0;q=f[e>>2]|0;e:do if(!q)F=e;else{z=d[u>>1]|0;A=u+2|0;y=e;x=q;while(1){C=x+8|0;if(z<<16>>16!=(d[C>>1]|0)){F=y;break e}if((d[A>>1]|0)!=(d[C+2>>1]|0)){F=y;break e}if((d[v>>1]|0)!=(d[x+12>>1]|0)){F=y;break e}C=f[x>>2]|0;if(!C){F=x;break}else{B=x;x=C;y=B}}}while(0);f[j>>2]=f[F>>2];f[F>>2]=f[f[(f[a>>2]|0)+(E<<2)>>2]>>2];f[f[(f[a>>2]|0)+(E<<2)>>2]>>2]=e;e=f[g>>2]|0;if(!e){D=41;break a}}}while(0);c=f[p>>2]|0;if(!c){D=41;break a}else{g=p;j=p}}f[t>>2]=j;m=f[r>>2]|0;if(!m){D=41;break}else{k=s;l=r;n=r}}if((D|0)==41)return}function od(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0;d=a+4|0;if(!c){e=f[a>>2]|0;f[a>>2]=0;if(e|0)br(e);f[d>>2]=0;return}if(c>>>0>1073741823){e=ra(8)|0;Wo(e,14941);f[e>>2]=6944;va(e|0,1080,114)}e=dn(c<<2)|0;g=f[a>>2]|0;f[a>>2]=e;if(g|0)br(g);f[d>>2]=c;d=0;do{f[(f[a>>2]|0)+(d<<2)>>2]=0;d=d+1|0}while((d|0)!=(c|0));d=a+8|0;g=f[d>>2]|0;if(!g)return;e=f[g+4>>2]|0;h=c+-1|0;i=(h&c|0)==0;if(!i)if(e>>>0<c>>>0)j=e;else j=(e>>>0)%(c>>>0)|0;else j=e&h;f[(f[a>>2]|0)+(j<<2)>>2]=d;d=f[g>>2]|0;if(!d)return;else{k=j;l=g;m=d;n=g}a:while(1){g=l;d=m;j=n;b:while(1){c:do if(i){e=d;while(1){o=f[e+4>>2]&h;if((o|0)==(k|0)){p=e;break c}q=(f[a>>2]|0)+(o<<2)|0;if(!(f[q>>2]|0)){r=e;s=o;t=q;break b}q=e+8|0;u=q+1|0;v=q+2|0;w=f[e>>2]|0;d:do if(!w)x=e;else{y=b[q>>0]|0;z=e;A=w;while(1){B=A+8|0;if(y<<24>>24!=(b[B>>0]|0)){x=z;break d}if((b[u>>0]|0)!=(b[B+1>>0]|0)){x=z;break d}if((b[v>>0]|0)!=(b[B+2>>0]|0)){x=z;break d}B=f[A>>2]|0;if(!B){x=A;break}else{C=A;A=B;z=C}}}while(0);f[j>>2]=f[x>>2];f[x>>2]=f[f[(f[a>>2]|0)+(o<<2)>>2]>>2];f[f[(f[a>>2]|0)+(o<<2)>>2]>>2]=e;e=f[g>>2]|0;if(!e){D=41;break a}}}else{e=d;while(1){v=f[e+4>>2]|0;if(v>>>0<c>>>0)E=v;else E=(v>>>0)%(c>>>0)|0;if((E|0)==(k|0)){p=e;break c}v=(f[a>>2]|0)+(E<<2)|0;if(!(f[v>>2]|0)){r=e;s=E;t=v;break b}v=e+8|0;u=v+1|0;w=v+2|0;q=f[e>>2]|0;e:do if(!q)F=e;else{z=b[v>>0]|0;A=e;y=q;while(1){C=y+8|0;if(z<<24>>24!=(b[C>>0]|0)){F=A;break e}if((b[u>>0]|0)!=(b[C+1>>0]|0)){F=A;break e}if((b[w>>0]|0)!=(b[C+2>>0]|0)){F=A;break e}C=f[y>>2]|0;if(!C){F=y;break}else{B=y;y=C;A=B}}}while(0);f[j>>2]=f[F>>2];f[F>>2]=f[f[(f[a>>2]|0)+(E<<2)>>2]>>2];f[f[(f[a>>2]|0)+(E<<2)>>2]>>2]=e;e=f[g>>2]|0;if(!e){D=41;break a}}}while(0);d=f[p>>2]|0;if(!d){D=41;break a}else{g=p;j=p}}f[t>>2]=j;m=f[r>>2]|0;if(!m){D=41;break}else{k=s;l=r;n=r}}if((D|0)==41)return}function pd(a,b){a=+a;b=+b;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,q=0,r=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0.0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0.0;p[s>>3]=a;c=f[s>>2]|0;d=f[s+4>>2]|0;p[s>>3]=b;e=f[s>>2]|0;g=f[s+4>>2]|0;h=Wn(c|0,d|0,52)|0;i=h&2047;h=Wn(e|0,g|0,52)|0;j=h&2047;h=d&-2147483648;k=Rn(e|0,g|0,1)|0;l=I;a:do if(!((k|0)==0&(l|0)==0)?(m=xo(b)|0,n=I&2147483647,!((i|0)==2047|(n>>>0>2146435072|(n|0)==2146435072&m>>>0>0))):0){m=Rn(c|0,d|0,1)|0;n=I;if(!(n>>>0>l>>>0|(n|0)==(l|0)&m>>>0>k>>>0))return +((m|0)==(k|0)&(n|0)==(l|0)?a*0.0:a);if(!i){n=Rn(c|0,d|0,12)|0;m=I;if((m|0)>-1|(m|0)==-1&n>>>0>4294967295){o=0;q=n;n=m;while(1){m=o+-1|0;q=Rn(q|0,n|0,1)|0;n=I;if(!((n|0)>-1|(n|0)==-1&q>>>0>4294967295)){r=m;break}else o=m}}else r=0;o=Rn(c|0,d|0,1-r|0)|0;t=r;u=o;v=I}else{t=i;u=c;v=d&1048575|1048576}if(!j){o=Rn(e|0,g|0,12)|0;q=I;if((q|0)>-1|(q|0)==-1&o>>>0>4294967295){n=0;m=o;o=q;while(1){q=n+-1|0;m=Rn(m|0,o|0,1)|0;o=I;if(!((o|0)>-1|(o|0)==-1&m>>>0>4294967295)){w=q;break}else n=q}}else w=0;n=Rn(e|0,g|0,1-w|0)|0;x=w;y=n;z=I}else{x=j;y=e;z=g&1048575|1048576}n=Vn(u|0,v|0,y|0,z|0)|0;m=I;o=(m|0)>-1|(m|0)==-1&n>>>0>4294967295;b:do if((t|0)>(x|0)){q=t;A=m;B=o;C=u;D=v;E=n;while(1){if(B)if((E|0)==0&(A|0)==0)break;else{F=E;G=A}else{F=C;G=D}H=Rn(F|0,G|0,1)|0;J=I;K=q+-1|0;L=Vn(H|0,J|0,y|0,z|0)|0;M=I;N=(M|0)>-1|(M|0)==-1&L>>>0>4294967295;if((K|0)>(x|0)){q=K;A=M;B=N;C=H;D=J;E=L}else{O=K;P=N;Q=L;R=M;S=H;T=J;break b}}U=a*0.0;break a}else{O=t;P=o;Q=n;R=m;S=u;T=v}while(0);if(P)if((Q|0)==0&(R|0)==0){U=a*0.0;break}else{V=R;W=Q}else{V=T;W=S}if(V>>>0<1048576|(V|0)==1048576&W>>>0<0){m=O;n=W;o=V;while(1){E=Rn(n|0,o|0,1)|0;D=I;C=m+-1|0;if(D>>>0<1048576|(D|0)==1048576&E>>>0<0){m=C;n=E;o=D}else{X=C;Y=E;Z=D;break}}}else{X=O;Y=W;Z=V}if((X|0)>0){o=Tn(Y|0,Z|0,0,-1048576)|0;n=I;m=Rn(X|0,0,52)|0;_=n|I;$=o|m}else{m=Wn(Y|0,Z|0,1-X|0)|0;_=I;$=m}f[s>>2]=$;f[s+4>>2]=_|h;U=+p[s>>3]}else aa=3;while(0);if((aa|0)==3){ba=a*b;U=ba/ba}return +U}function qd(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0;c=a+4|0;if(!b){d=f[a>>2]|0;f[a>>2]=0;if(d|0)br(d);f[c>>2]=0;return}if(b>>>0>1073741823){d=ra(8)|0;Wo(d,14941);f[d>>2]=6944;va(d|0,1080,114)}d=dn(b<<2)|0;e=f[a>>2]|0;f[a>>2]=d;if(e|0)br(e);f[c>>2]=b;c=0;do{f[(f[a>>2]|0)+(c<<2)>>2]=0;c=c+1|0}while((c|0)!=(b|0));c=a+8|0;e=f[c>>2]|0;if(!e)return;d=f[e+4>>2]|0;g=b+-1|0;h=(g&b|0)==0;if(!h)if(d>>>0<b>>>0)i=d;else i=(d>>>0)%(b>>>0)|0;else i=d&g;f[(f[a>>2]|0)+(i<<2)>>2]=c;c=f[e>>2]|0;if(!c)return;else{j=i;k=e;l=c;m=e}a:while(1){e=k;c=l;i=m;b:while(1){c:do if(h){d=c;while(1){n=f[d+4>>2]&g;if((n|0)==(j|0)){o=d;break c}p=(f[a>>2]|0)+(n<<2)|0;if(!(f[p>>2]|0)){q=d;r=n;s=p;break b}p=d+12|0;t=d+16|0;u=f[d>>2]|0;d:do if(!u)v=d;else{w=f[d+8>>2]|0;x=d;y=u;while(1){if((w|0)!=(f[y+8>>2]|0)){v=x;break d}if((f[p>>2]|0)!=(f[y+12>>2]|0)){v=x;break d}if((f[t>>2]|0)!=(f[y+16>>2]|0)){v=x;break d}z=f[y>>2]|0;if(!z){v=y;break}else{A=y;y=z;x=A}}}while(0);f[i>>2]=f[v>>2];f[v>>2]=f[f[(f[a>>2]|0)+(n<<2)>>2]>>2];f[f[(f[a>>2]|0)+(n<<2)>>2]>>2]=d;d=f[e>>2]|0;if(!d){B=41;break a}}}else{d=c;while(1){t=f[d+4>>2]|0;if(t>>>0<b>>>0)C=t;else C=(t>>>0)%(b>>>0)|0;if((C|0)==(j|0)){o=d;break c}t=(f[a>>2]|0)+(C<<2)|0;if(!(f[t>>2]|0)){q=d;r=C;s=t;break b}t=d+12|0;p=d+16|0;u=f[d>>2]|0;e:do if(!u)D=d;else{x=f[d+8>>2]|0;y=d;w=u;while(1){if((x|0)!=(f[w+8>>2]|0)){D=y;break e}if((f[t>>2]|0)!=(f[w+12>>2]|0)){D=y;break e}if((f[p>>2]|0)!=(f[w+16>>2]|0)){D=y;break e}A=f[w>>2]|0;if(!A){D=w;break}else{z=w;w=A;y=z}}}while(0);f[i>>2]=f[D>>2];f[D>>2]=f[f[(f[a>>2]|0)+(C<<2)>>2]>>2];f[f[(f[a>>2]|0)+(C<<2)>>2]>>2]=d;d=f[e>>2]|0;if(!d){B=41;break a}}}while(0);c=f[o>>2]|0;if(!c){B=41;break a}else{e=o;i=o}}f[s>>2]=i;l=f[q>>2]|0;if(!l){B=41;break}else{j=r;k=q;m=q}}if((B|0)==41)return}function rd(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0;d=a+4|0;if(!c){e=f[a>>2]|0;f[a>>2]=0;if(e|0)br(e);f[d>>2]=0;return}if(c>>>0>1073741823){e=ra(8)|0;Wo(e,14941);f[e>>2]=6944;va(e|0,1080,114)}e=dn(c<<2)|0;g=f[a>>2]|0;f[a>>2]=e;if(g|0)br(g);f[d>>2]=c;d=0;do{f[(f[a>>2]|0)+(d<<2)>>2]=0;d=d+1|0}while((d|0)!=(c|0));d=a+8|0;g=f[d>>2]|0;if(!g)return;e=f[g+4>>2]|0;h=c+-1|0;i=(h&c|0)==0;if(!i)if(e>>>0<c>>>0)j=e;else j=(e>>>0)%(c>>>0)|0;else j=e&h;f[(f[a>>2]|0)+(j<<2)>>2]=d;d=f[g>>2]|0;if(!d)return;else{k=j;l=g;m=d;n=g}a:while(1){g=l;d=m;j=n;b:while(1){o=d;while(1){e=f[o+4>>2]|0;if(!i)if(e>>>0<c>>>0)p=e;else p=(e>>>0)%(c>>>0)|0;else p=e&h;if((p|0)==(k|0))break;q=(f[a>>2]|0)+(p<<2)|0;if(!(f[q>>2]|0))break b;e=f[o>>2]|0;c:do if(!e)r=o;else{s=o+8|0;t=b[s+11>>0]|0;u=t<<24>>24<0;v=t&255;t=u?f[o+12>>2]|0:v;w=(t|0)==0;if(u){u=o;x=e;while(1){y=x+8|0;z=b[y+11>>0]|0;A=z<<24>>24<0;if((t|0)!=((A?f[x+12>>2]|0:z&255)|0)){r=u;break c}if(!w?Pk(f[s>>2]|0,A?f[y>>2]|0:y,t)|0:0){r=u;break c}y=f[x>>2]|0;if(!y){r=x;break c}else{A=x;x=y;u=A}}}if(w){u=o;x=e;while(1){A=b[x+8+11>>0]|0;if((A<<24>>24<0?f[x+12>>2]|0:A&255)|0){r=u;break c}A=f[x>>2]|0;if(!A){r=x;break c}else{y=x;x=A;u=y}}}u=o;x=e;while(1){w=x+8|0;y=b[w+11>>0]|0;A=y<<24>>24<0;if((t|0)!=((A?f[x+12>>2]|0:y&255)|0)){r=u;break c}y=A?f[w>>2]|0:w;if((b[y>>0]|0)==(f[s>>2]&255)<<24>>24){B=s;C=v;D=y}else{r=u;break c}while(1){C=C+-1|0;B=B+1|0;if(!C)break;D=D+1|0;if((b[B>>0]|0)!=(b[D>>0]|0)){r=u;break c}}y=f[x>>2]|0;if(!y){r=x;break}else{w=x;x=y;u=w}}}while(0);f[j>>2]=f[r>>2];f[r>>2]=f[f[(f[a>>2]|0)+(p<<2)>>2]>>2];f[f[(f[a>>2]|0)+(p<<2)>>2]>>2]=o;e=f[g>>2]|0;if(!e){E=43;break a}else o=e}d=f[o>>2]|0;if(!d){E=43;break a}else{g=o;j=o}}f[q>>2]=j;m=f[o>>2]|0;if(!m){E=43;break}else{k=p;l=o;n=o}}if((E|0)==43)return}function sd(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;c=u;u=u+48|0;d=c+8|0;e=c+4|0;g=c;h=a+44|0;Nh(f[h>>2]|0,b)|0;if(f[h>>2]|0){rn(d);lk(d);i=f[h>>2]|0;if((i|0)>0){h=a+40|0;j=i;do{i=j;j=j+-1|0;Vi(d,(f[(f[h>>2]|0)+(j>>>5<<2)>>2]&1<<(j&31)|0)!=0)}while((i|0)>1)}fd(d,b);tj(d)}j=a+56|0;Nh(f[j>>2]|0,b)|0;if(f[j>>2]|0){rn(d);lk(d);h=f[j>>2]|0;if((h|0)>1){j=a+52|0;i=h;do{h=i;i=i+-2|0;Vi(d,(f[(f[j>>2]|0)+(i>>>5<<2)>>2]&1<<(i&31)|0)!=0);k=h+-1|0;Vi(d,(f[(f[j>>2]|0)+(k>>>5<<2)>>2]&1<<(k&31)|0)!=0)}while((h|0)>3)}fd(d,b);tj(d)}j=a+68|0;Nh(f[j>>2]|0,b)|0;if(f[j>>2]|0){rn(d);lk(d);i=f[j>>2]|0;if((i|0)>2){j=a+64|0;h=i;do{i=h;h=h+-3|0;Vi(d,(f[(f[j>>2]|0)+(h>>>5<<2)>>2]&1<<(h&31)|0)!=0);k=i+-2|0;Vi(d,(f[(f[j>>2]|0)+(k>>>5<<2)>>2]&1<<(k&31)|0)!=0);k=i+-1|0;Vi(d,(f[(f[j>>2]|0)+(k>>>5<<2)>>2]&1<<(k&31)|0)!=0)}while((i|0)>5)}fd(d,b);tj(d)}j=a+80|0;Nh(f[j>>2]|0,b)|0;if(f[j>>2]|0){rn(d);lk(d);h=f[j>>2]|0;if((h|0)>3){j=a+76|0;i=h;do{h=i;i=i+-4|0;Vi(d,(f[(f[j>>2]|0)+(i>>>5<<2)>>2]&1<<(i&31)|0)!=0);k=h+-3|0;Vi(d,(f[(f[j>>2]|0)+(k>>>5<<2)>>2]&1<<(k&31)|0)!=0);k=h+-2|0;Vi(d,(f[(f[j>>2]|0)+(k>>>5<<2)>>2]&1<<(k&31)|0)!=0);k=h+-1|0;Vi(d,(f[(f[j>>2]|0)+(k>>>5<<2)>>2]&1<<(k&31)|0)!=0)}while((h|0)>7)}fd(d,b);tj(d)}f[g>>2]=f[a+12>>2];j=b+16|0;i=j;h=f[i>>2]|0;k=f[i+4>>2]|0;if((k|0)>0|(k|0)==0&h>>>0>0){l=k;m=h}else{f[e>>2]=f[b+4>>2];f[d>>2]=f[e>>2];ye(b,d,g,g+4|0)|0;h=j;l=f[h+4>>2]|0;m=f[h>>2]|0}f[g>>2]=f[a+20>>2];if((l|0)>0|(l|0)==0&m>>>0>0){u=c;return 1}f[e>>2]=f[b+4>>2];f[d>>2]=f[e>>2];ye(b,d,g,g+4|0)|0;u=c;return 1}function td(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;c=u;u=u+48|0;d=c+8|0;e=c+4|0;g=c;h=a+64|0;Nh(f[h>>2]|0,b)|0;if(f[h>>2]|0){rn(d);lk(d);i=f[h>>2]|0;if((i|0)>0){h=a+60|0;j=i;do{i=j;j=j+-1|0;Vi(d,(f[(f[h>>2]|0)+(j>>>5<<2)>>2]&1<<(j&31)|0)!=0)}while((i|0)>1)}fd(d,b);tj(d)}j=a+76|0;Nh(f[j>>2]|0,b)|0;if(f[j>>2]|0){rn(d);lk(d);h=f[j>>2]|0;if((h|0)>1){j=a+72|0;i=h;do{h=i;i=i+-2|0;Vi(d,(f[(f[j>>2]|0)+(i>>>5<<2)>>2]&1<<(i&31)|0)!=0);k=h+-1|0;Vi(d,(f[(f[j>>2]|0)+(k>>>5<<2)>>2]&1<<(k&31)|0)!=0)}while((h|0)>3)}fd(d,b);tj(d)}j=a+88|0;Nh(f[j>>2]|0,b)|0;if(f[j>>2]|0){rn(d);lk(d);i=f[j>>2]|0;if((i|0)>2){j=a+84|0;h=i;do{i=h;h=h+-3|0;Vi(d,(f[(f[j>>2]|0)+(h>>>5<<2)>>2]&1<<(h&31)|0)!=0);k=i+-2|0;Vi(d,(f[(f[j>>2]|0)+(k>>>5<<2)>>2]&1<<(k&31)|0)!=0);k=i+-1|0;Vi(d,(f[(f[j>>2]|0)+(k>>>5<<2)>>2]&1<<(k&31)|0)!=0)}while((i|0)>5)}fd(d,b);tj(d)}j=a+100|0;Nh(f[j>>2]|0,b)|0;if(f[j>>2]|0){rn(d);lk(d);h=f[j>>2]|0;if((h|0)>3){j=a+96|0;i=h;do{h=i;i=i+-4|0;Vi(d,(f[(f[j>>2]|0)+(i>>>5<<2)>>2]&1<<(i&31)|0)!=0);k=h+-3|0;Vi(d,(f[(f[j>>2]|0)+(k>>>5<<2)>>2]&1<<(k&31)|0)!=0);k=h+-2|0;Vi(d,(f[(f[j>>2]|0)+(k>>>5<<2)>>2]&1<<(k&31)|0)!=0);k=h+-1|0;Vi(d,(f[(f[j>>2]|0)+(k>>>5<<2)>>2]&1<<(k&31)|0)!=0)}while((h|0)>7)}fd(d,b);tj(d)}f[g>>2]=f[a+12>>2];j=b+16|0;i=j;h=f[i>>2]|0;k=f[i+4>>2]|0;if((k|0)>0|(k|0)==0&h>>>0>0){l=k;m=h}else{f[e>>2]=f[b+4>>2];f[d>>2]=f[e>>2];ye(b,d,g,g+4|0)|0;h=j;l=f[h+4>>2]|0;m=f[h>>2]|0}f[g>>2]=f[a+16>>2];if((l|0)>0|(l|0)==0&m>>>0>0){u=c;return 1}f[e>>2]=f[b+4>>2];f[d>>2]=f[e>>2];ye(b,d,g,g+4|0)|0;u=c;return 1}function ud(a,b){a=a|0;b=b|0;var c=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0;c=a+4|0;if(!b){e=f[a>>2]|0;f[a>>2]=0;if(e|0)br(e);f[c>>2]=0;return}if(b>>>0>1073741823){e=ra(8)|0;Wo(e,14941);f[e>>2]=6944;va(e|0,1080,114)}e=dn(b<<2)|0;g=f[a>>2]|0;f[a>>2]=e;if(g|0)br(g);f[c>>2]=b;c=0;do{f[(f[a>>2]|0)+(c<<2)>>2]=0;c=c+1|0}while((c|0)!=(b|0));c=a+8|0;g=f[c>>2]|0;if(!g)return;e=f[g+4>>2]|0;h=b+-1|0;i=(h&b|0)==0;if(!i)if(e>>>0<b>>>0)j=e;else j=(e>>>0)%(b>>>0)|0;else j=e&h;f[(f[a>>2]|0)+(j<<2)>>2]=c;c=f[g>>2]|0;if(!c)return;else{k=j;l=g;m=c;n=g}a:while(1){g=l;c=m;j=n;b:while(1){c:do if(i){e=c;while(1){o=f[e+4>>2]&h;if((o|0)==(k|0)){p=e;break c}q=(f[a>>2]|0)+(o<<2)|0;if(!(f[q>>2]|0)){r=e;s=o;t=q;break b}q=e+8|0;u=f[e>>2]|0;d:do if(!u)v=e;else{w=d[q>>1]|0;x=q+2|0;y=e;z=u;while(1){A=z+8|0;if(w<<16>>16!=(d[A>>1]|0)){v=y;break d}if((d[x>>1]|0)!=(d[A+2>>1]|0)){v=y;break d}A=f[z>>2]|0;if(!A){v=z;break}else{B=z;z=A;y=B}}}while(0);f[j>>2]=f[v>>2];f[v>>2]=f[f[(f[a>>2]|0)+(o<<2)>>2]>>2];f[f[(f[a>>2]|0)+(o<<2)>>2]>>2]=e;e=f[g>>2]|0;if(!e){C=39;break a}}}else{e=c;while(1){u=f[e+4>>2]|0;if(u>>>0<b>>>0)D=u;else D=(u>>>0)%(b>>>0)|0;if((D|0)==(k|0)){p=e;break c}u=(f[a>>2]|0)+(D<<2)|0;if(!(f[u>>2]|0)){r=e;s=D;t=u;break b}u=e+8|0;q=f[e>>2]|0;e:do if(!q)E=e;else{y=d[u>>1]|0;z=u+2|0;x=e;w=q;while(1){B=w+8|0;if(y<<16>>16!=(d[B>>1]|0)){E=x;break e}if((d[z>>1]|0)!=(d[B+2>>1]|0)){E=x;break e}B=f[w>>2]|0;if(!B){E=w;break}else{A=w;w=B;x=A}}}while(0);f[j>>2]=f[E>>2];f[E>>2]=f[f[(f[a>>2]|0)+(D<<2)>>2]>>2];f[f[(f[a>>2]|0)+(D<<2)>>2]>>2]=e;e=f[g>>2]|0;if(!e){C=39;break a}}}while(0);c=f[p>>2]|0;if(!c){C=39;break a}else{g=p;j=p}}f[t>>2]=j;m=f[r>>2]|0;if(!m){C=39;break}else{k=s;l=r;n=r}}if((C|0)==39)return}function vd(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0;d=a+4|0;if(!c){e=f[a>>2]|0;f[a>>2]=0;if(e|0)br(e);f[d>>2]=0;return}if(c>>>0>1073741823){e=ra(8)|0;Wo(e,14941);f[e>>2]=6944;va(e|0,1080,114)}e=dn(c<<2)|0;g=f[a>>2]|0;f[a>>2]=e;if(g|0)br(g);f[d>>2]=c;d=0;do{f[(f[a>>2]|0)+(d<<2)>>2]=0;d=d+1|0}while((d|0)!=(c|0));d=a+8|0;g=f[d>>2]|0;if(!g)return;e=f[g+4>>2]|0;h=c+-1|0;i=(h&c|0)==0;if(!i)if(e>>>0<c>>>0)j=e;else j=(e>>>0)%(c>>>0)|0;else j=e&h;f[(f[a>>2]|0)+(j<<2)>>2]=d;d=f[g>>2]|0;if(!d)return;else{k=j;l=g;m=d;n=g}a:while(1){g=l;d=m;j=n;b:while(1){c:do if(i){e=d;while(1){o=f[e+4>>2]&h;if((o|0)==(k|0)){p=e;break c}q=(f[a>>2]|0)+(o<<2)|0;if(!(f[q>>2]|0)){r=e;s=o;t=q;break b}q=e+8|0;u=f[e>>2]|0;d:do if(!u)v=e;else{w=b[q>>0]|0;x=q+1|0;y=e;z=u;while(1){A=z+8|0;if(w<<24>>24!=(b[A>>0]|0)){v=y;break d}if((b[x>>0]|0)!=(b[A+1>>0]|0)){v=y;break d}A=f[z>>2]|0;if(!A){v=z;break}else{B=z;z=A;y=B}}}while(0);f[j>>2]=f[v>>2];f[v>>2]=f[f[(f[a>>2]|0)+(o<<2)>>2]>>2];f[f[(f[a>>2]|0)+(o<<2)>>2]>>2]=e;e=f[g>>2]|0;if(!e){C=39;break a}}}else{e=d;while(1){u=f[e+4>>2]|0;if(u>>>0<c>>>0)D=u;else D=(u>>>0)%(c>>>0)|0;if((D|0)==(k|0)){p=e;break c}u=(f[a>>2]|0)+(D<<2)|0;if(!(f[u>>2]|0)){r=e;s=D;t=u;break b}u=e+8|0;q=f[e>>2]|0;e:do if(!q)E=e;else{y=b[u>>0]|0;z=u+1|0;x=e;w=q;while(1){B=w+8|0;if(y<<24>>24!=(b[B>>0]|0)){E=x;break e}if((b[z>>0]|0)!=(b[B+1>>0]|0)){E=x;break e}B=f[w>>2]|0;if(!B){E=w;break}else{A=w;w=B;x=A}}}while(0);f[j>>2]=f[E>>2];f[E>>2]=f[f[(f[a>>2]|0)+(D<<2)>>2]>>2];f[f[(f[a>>2]|0)+(D<<2)>>2]>>2]=e;e=f[g>>2]|0;if(!e){C=39;break a}}}while(0);d=f[p>>2]|0;if(!d){C=39;break a}else{g=p;j=p}}f[t>>2]=j;m=f[r>>2]|0;if(!m){C=39;break}else{k=s;l=r;n=r}}if((C|0)==39)return}function wd(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0;c=u;u=u+48|0;d=c+32|0;e=c+28|0;g=c+16|0;h=c;i=a+16|0;j=f[i>>2]|0;if(j|0){k=f[b>>2]|0;l=i;m=j;a:while(1){j=m;while(1){if((f[j+16>>2]|0)>=(k|0))break;n=f[j+4>>2]|0;if(!n){o=l;break a}else j=n}m=f[j>>2]|0;if(!m){o=j;break}else l=j}if((o|0)!=(i|0)?(k|0)>=(f[o+16>>2]|0):0){p=o;q=p+20|0;u=c;return q|0}}wp(g);f[h>>2]=f[b>>2];b=h+4|0;f[h+8>>2]=0;o=h+12|0;f[o>>2]=0;k=h+8|0;f[b>>2]=k;l=f[g>>2]|0;m=g+4|0;if((l|0)!=(m|0)){n=k;r=l;while(1){l=r+16|0;f[e>>2]=n;f[d>>2]=f[e>>2];Wg(b,d,l,l)|0;l=f[r+4>>2]|0;if(!l){s=r+8|0;t=f[s>>2]|0;if((f[t>>2]|0)==(r|0))v=t;else{t=s;do{s=f[t>>2]|0;t=s+8|0;w=f[t>>2]|0}while((f[w>>2]|0)!=(s|0));v=w}}else{t=l;while(1){j=f[t>>2]|0;if(!j)break;else t=j}v=t}if((v|0)==(m|0))break;else r=v}}v=a+12|0;r=f[i>>2]|0;do if(r){d=f[h>>2]|0;e=a+16|0;n=r;while(1){l=f[n+16>>2]|0;if((d|0)<(l|0)){j=f[n>>2]|0;if(!j){x=23;break}else{y=n;z=j}}else{if((l|0)>=(d|0)){x=27;break}A=n+4|0;l=f[A>>2]|0;if(!l){x=26;break}else{y=A;z=l}}e=y;n=z}if((x|0)==23){B=n;C=n;break}else if((x|0)==26){B=n;C=A;break}else if((x|0)==27){B=n;C=e;break}}else{B=i;C=i}while(0);i=f[C>>2]|0;if(!i){x=dn(32)|0;f[x+16>>2]=f[h>>2];A=x+20|0;f[A>>2]=f[b>>2];z=x+24|0;y=f[h+8>>2]|0;f[z>>2]=y;r=f[o>>2]|0;f[x+28>>2]=r;if(!r)f[A>>2]=z;else{f[y+8>>2]=z;f[b>>2]=k;f[k>>2]=0;f[o>>2]=0}f[x>>2]=0;f[x+4>>2]=0;f[x+8>>2]=B;f[C>>2]=x;B=f[f[v>>2]>>2]|0;if(!B)D=x;else{f[v>>2]=B;D=f[C>>2]|0}Ae(f[a+16>>2]|0,D);D=a+20|0;f[D>>2]=(f[D>>2]|0)+1;E=x}else E=i;sj(h+4|0,f[k>>2]|0);sj(g,f[m>>2]|0);p=E;q=p+20|0;u=c;return q|0}function xd(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;d=b[c+11>>0]|0;e=d<<24>>24<0;g=e?f[c>>2]|0:c;i=e?f[c+4>>2]|0:d&255;if(i>>>0>3){d=g;c=i;e=i;while(1){j=X(h[d>>0]|h[d+1>>0]<<8|h[d+2>>0]<<16|h[d+3>>0]<<24,1540483477)|0;c=(X(j>>>24^j,1540483477)|0)^(X(c,1540483477)|0);e=e+-4|0;if(e>>>0<=3)break;else d=d+4|0}d=i+-4|0;e=d&-4;k=d-e|0;l=g+(e+4)|0;m=c}else{k=i;l=g;m=i}switch(k|0){case 3:{n=h[l+2>>0]<<16^m;o=6;break}case 2:{n=m;o=6;break}case 1:{p=m;o=7;break}default:q=m}if((o|0)==6){p=h[l+1>>0]<<8^n;o=7}if((o|0)==7)q=X(p^h[l>>0],1540483477)|0;l=X(q>>>13^q,1540483477)|0;q=l>>>15^l;l=f[a+4>>2]|0;if(!l){r=0;return r|0}p=l+-1|0;n=(p&l|0)==0;if(!n)if(q>>>0<l>>>0)s=q;else s=(q>>>0)%(l>>>0)|0;else s=q&p;m=f[(f[a>>2]|0)+(s<<2)>>2]|0;if(!m){r=0;return r|0}a=f[m>>2]|0;if(!a){r=0;return r|0}m=(i|0)==0;if(n){n=a;a:while(1){k=f[n+4>>2]|0;c=(k|0)==(q|0);if(!(c|(k&p|0)==(s|0))){r=0;o=40;break}do if(c?(k=n+8|0,e=b[k+11>>0]|0,d=e<<24>>24<0,j=e&255,((d?f[n+12>>2]|0:j)|0)==(i|0)):0){e=f[k>>2]|0;t=d?e:k;if(d){if(m){r=n;o=40;break a}if(!(Pk(t,g,i)|0)){r=n;o=40;break a}else break}if(m){r=n;o=40;break a}if((b[g>>0]|0)==(e&255)<<24>>24){e=k;k=j;j=g;do{k=k+-1|0;e=e+1|0;if(!k){r=n;o=40;break a}j=j+1|0}while((b[e>>0]|0)==(b[j>>0]|0))}}while(0);n=f[n>>2]|0;if(!n){r=0;o=40;break}}if((o|0)==40)return r|0}else u=a;b:while(1){a=f[u+4>>2]|0;do if((a|0)==(q|0)){n=u+8|0;p=b[n+11>>0]|0;c=p<<24>>24<0;j=p&255;if(((c?f[u+12>>2]|0:j)|0)==(i|0)){p=f[n>>2]|0;e=c?p:n;if(c){if(m){r=u;o=40;break b}if(!(Pk(e,g,i)|0)){r=u;o=40;break b}else break}if(m){r=u;o=40;break b}if((b[g>>0]|0)==(p&255)<<24>>24){p=n;n=j;j=g;do{n=n+-1|0;p=p+1|0;if(!n){r=u;o=40;break b}j=j+1|0}while((b[p>>0]|0)==(b[j>>0]|0))}}}else{if(a>>>0<l>>>0)v=a;else v=(a>>>0)%(l>>>0)|0;if((v|0)!=(s|0)){r=0;o=40;break b}}while(0);u=f[u>>2]|0;if(!u){r=0;o=40;break}}if((o|0)==40)return r|0;return 0}function yd(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0;c=a+4|0;if(!b){d=f[a>>2]|0;f[a>>2]=0;if(d|0)br(d);f[c>>2]=0;return}if(b>>>0>1073741823){d=ra(8)|0;Wo(d,14941);f[d>>2]=6944;va(d|0,1080,114)}d=dn(b<<2)|0;e=f[a>>2]|0;f[a>>2]=d;if(e|0)br(e);f[c>>2]=b;c=0;do{f[(f[a>>2]|0)+(c<<2)>>2]=0;c=c+1|0}while((c|0)!=(b|0));c=a+8|0;e=f[c>>2]|0;if(!e)return;d=f[e+4>>2]|0;g=b+-1|0;h=(g&b|0)==0;if(!h)if(d>>>0<b>>>0)i=d;else i=(d>>>0)%(b>>>0)|0;else i=d&g;f[(f[a>>2]|0)+(i<<2)>>2]=c;c=f[e>>2]|0;if(!c)return;else{j=i;k=e;l=c;m=e}a:while(1){e=k;c=l;i=m;b:while(1){c:do if(h){d=c;while(1){n=f[d+4>>2]&g;if((n|0)==(j|0)){o=d;break c}p=(f[a>>2]|0)+(n<<2)|0;if(!(f[p>>2]|0)){q=d;r=n;s=p;break b}p=d+12|0;t=f[d>>2]|0;d:do if(!t)u=d;else{v=f[d+8>>2]|0;w=d;x=t;while(1){if((v|0)!=(f[x+8>>2]|0)){u=w;break d}if((f[p>>2]|0)!=(f[x+12>>2]|0)){u=w;break d}y=f[x>>2]|0;if(!y){u=x;break}else{z=x;x=y;w=z}}}while(0);f[i>>2]=f[u>>2];f[u>>2]=f[f[(f[a>>2]|0)+(n<<2)>>2]>>2];f[f[(f[a>>2]|0)+(n<<2)>>2]>>2]=d;d=f[e>>2]|0;if(!d){A=39;break a}}}else{d=c;while(1){p=f[d+4>>2]|0;if(p>>>0<b>>>0)B=p;else B=(p>>>0)%(b>>>0)|0;if((B|0)==(j|0)){o=d;break c}p=(f[a>>2]|0)+(B<<2)|0;if(!(f[p>>2]|0)){q=d;r=B;s=p;break b}p=d+12|0;t=f[d>>2]|0;e:do if(!t)C=d;else{w=f[d+8>>2]|0;x=d;v=t;while(1){if((w|0)!=(f[v+8>>2]|0)){C=x;break e}if((f[p>>2]|0)!=(f[v+12>>2]|0)){C=x;break e}z=f[v>>2]|0;if(!z){C=v;break}else{y=v;v=z;x=y}}}while(0);f[i>>2]=f[C>>2];f[C>>2]=f[f[(f[a>>2]|0)+(B<<2)>>2]>>2];f[f[(f[a>>2]|0)+(B<<2)>>2]>>2]=d;d=f[e>>2]|0;if(!d){A=39;break a}}}while(0);c=f[o>>2]|0;if(!c){A=39;break a}else{e=o;i=o}}f[s>>2]=i;l=f[q>>2]|0;if(!l){A=39;break}else{j=r;k=q;m=q}}if((A|0)==39)return}function zd(a,c,d,e,g){a=a|0;c=c|0;d=d|0;e=e|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;h=a+4|0;i=f[c>>2]|0;c=i;do if((i|0)!=(h|0)){j=i+16|0;k=b[j+11>>0]|0;l=k<<24>>24<0;m=l?f[i+20>>2]|0:k&255;k=b[g+11>>0]|0;n=k<<24>>24<0;o=n?f[g+4>>2]|0:k&255;k=m>>>0<o>>>0;p=k?m:o;if((p|0)!=0?(q=Pk(n?f[g>>2]|0:g,l?f[j>>2]|0:j,p)|0,(q|0)!=0):0){if((q|0)<0)break}else r=4;if((r|0)==4?o>>>0<m>>>0:0)break;q=o>>>0<m>>>0?o:m;if((q|0)!=0?(m=Pk(l?f[j>>2]|0:j,n?f[g>>2]|0:g,q)|0,(m|0)!=0):0){if((m|0)>=0)r=37}else r=21;if((r|0)==21?!k:0)r=37;if((r|0)==37){f[d>>2]=c;f[e>>2]=c;s=e;return s|0}k=f[i+4>>2]|0;m=(k|0)==0;if(m){q=i+8|0;j=f[q>>2]|0;if((f[j>>2]|0)==(i|0))t=j;else{j=q;do{q=f[j>>2]|0;j=q+8|0;l=f[j>>2]|0}while((f[l>>2]|0)!=(q|0));t=l}}else{j=k;while(1){l=f[j>>2]|0;if(!l)break;else j=l}t=j}do if((t|0)!=(h|0)){k=t+16|0;l=b[k+11>>0]|0;q=l<<24>>24<0;p=q?f[t+20>>2]|0:l&255;l=p>>>0<o>>>0?p:o;if((l|0)!=0?(u=Pk(n?f[g>>2]|0:g,q?f[k>>2]|0:k,l)|0,(u|0)!=0):0){if((u|0)<0)break}else r=31;if((r|0)==31?o>>>0<p>>>0:0)break;s=hg(a,d,g)|0;return s|0}while(0);if(m){f[d>>2]=c;s=i+4|0;return s|0}else{f[d>>2]=t;s=t;return s|0}}while(0);t=f[i>>2]|0;do if((f[a>>2]|0)==(i|0))v=c;else{if(!t){h=i;while(1){e=f[h+8>>2]|0;if((f[e>>2]|0)==(h|0))h=e;else{w=e;break}}}else{h=t;while(1){m=f[h+4>>2]|0;if(!m){w=h;break}else h=m}}h=w;m=w+16|0;e=b[g+11>>0]|0;o=e<<24>>24<0;n=o?f[g+4>>2]|0:e&255;e=b[m+11>>0]|0;j=e<<24>>24<0;p=j?f[w+20>>2]|0:e&255;e=n>>>0<p>>>0?n:p;if((e|0)!=0?(u=Pk(j?f[m>>2]|0:m,o?f[g>>2]|0:g,e)|0,(u|0)!=0):0){if((u|0)<0){v=h;break}}else r=13;if((r|0)==13?p>>>0<n>>>0:0){v=h;break}s=hg(a,d,g)|0;return s|0}while(0);if(!t){f[d>>2]=i;s=i;return s|0}else{f[d>>2]=v;s=v+4|0;return s|0}return 0}function Ad(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;g=u;u=u+16|0;h=g;f[c+48>>2]=d;f[c+44>>2]=e;e=f[c+8>>2]|0;i=c+12|0;j=f[i>>2]|0;if((j|0)!=(e|0)){k=j;do{j=k+-4|0;f[i>>2]=j;l=f[j>>2]|0;f[j>>2]=0;if(l|0)Va[f[(f[l>>2]|0)+4>>2]&127](l);k=f[i>>2]|0}while((k|0)!=(e|0))}e=f[c+20>>2]|0;k=c+24|0;i=f[k>>2]|0;if((i|0)!=(e|0))f[k>>2]=i+(~((i+-4-e|0)>>>2)<<2);e=f[c+32>>2]|0;i=c+36|0;k=f[i>>2]|0;if((k|0)!=(e|0))f[i>>2]=k+(~((k+-4-e|0)>>>2)<<2);if(!(f[c+4>>2]|0)){e=dn(32)|0;f[h>>2]=e;f[h+8>>2]=-2147483616;f[h+4>>2]=23;m=e;n=14670;o=m+23|0;do{b[m>>0]=b[n>>0]|0;m=m+1|0;n=n+1|0}while((m|0)<(o|0));b[e+23>>0]=0;f[a>>2]=-1;dj(a+4|0,h);if((b[h+11>>0]|0)<0)br(f[h>>2]|0);u=g;return}Jd(a,c);if(f[a>>2]|0){u=g;return}e=a+4|0;k=e+11|0;if((b[k>>0]|0)<0)br(f[e>>2]|0);Ji(a,c);if(f[a>>2]|0){u=g;return}if((b[k>>0]|0)<0)br(f[e>>2]|0);if(!(Qa[f[(f[c>>2]|0)+16>>2]&127](c)|0)){i=dn(32)|0;f[h>>2]=i;f[h+8>>2]=-2147483616;f[h+4>>2]=29;m=i;n=14694;o=m+29|0;do{b[m>>0]=b[n>>0]|0;m=m+1|0;n=n+1|0}while((m|0)<(o|0));b[i+29>>0]=0;f[a>>2]=-1;dj(e,h);if((b[h+11>>0]|0)<0)br(f[h>>2]|0);u=g;return}if(!(Qa[f[(f[c>>2]|0)+20>>2]&127](c)|0)){i=dn(32)|0;f[h>>2]=i;f[h+8>>2]=-2147483616;f[h+4>>2]=31;m=i;n=14724;o=m+31|0;do{b[m>>0]=b[n>>0]|0;m=m+1|0;n=n+1|0}while((m|0)<(o|0));b[i+31>>0]=0;f[a>>2]=-1;dj(e,h);if((b[h+11>>0]|0)<0)br(f[h>>2]|0);u=g;return}Wa[f[(f[c>>2]|0)+24>>2]&15](a,c);if(f[a>>2]|0){u=g;return}if((b[k>>0]|0)<0)br(f[e>>2]|0);if(!(Qa[f[(f[c>>2]|0)+28>>2]&127](c)|0)){k=dn(48)|0;f[h>>2]=k;f[h+8>>2]=-2147483600;f[h+4>>2]=34;m=k;n=14756;o=m+34|0;do{b[m>>0]=b[n>>0]|0;m=m+1|0;n=n+1|0}while((m|0)<(o|0));b[k+34>>0]=0;f[a>>2]=-1;dj(e,h);if((b[h+11>>0]|0)<0)br(f[h>>2]|0);u=g;return}e=dn(32)|0;f[h>>2]=e;f[h+8>>2]=-2147483616;f[h+4>>2]=30;m=e;n=14791;o=m+30|0;do{b[m>>0]=b[n>>0]|0;m=m+1|0;n=n+1|0}while((m|0)<(o|0));b[e+30>>0]=0;e=Oj(d,h,0)|0;if((b[h+11>>0]|0)<0)br(f[h>>2]|0);if(e)Va[f[(f[c>>2]|0)+48>>2]&127](c);f[a>>2]=0;f[a+4>>2]=0;f[a+8>>2]=0;f[a+12>>2]=0;u=g;return}function Bd(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0;g=a;h=b;i=h;j=c;k=d;l=k;if(!i){m=(e|0)!=0;if(!l){if(m){f[e>>2]=(g>>>0)%(j>>>0);f[e+4>>2]=0}n=0;o=(g>>>0)/(j>>>0)>>>0;return (I=n,o)|0}else{if(!m){n=0;o=0;return (I=n,o)|0}f[e>>2]=a|0;f[e+4>>2]=b&0;n=0;o=0;return (I=n,o)|0}}m=(l|0)==0;do if(j){if(!m){p=(_(l|0)|0)-(_(i|0)|0)|0;if(p>>>0<=31){q=p+1|0;r=31-p|0;s=p-31>>31;t=q;u=g>>>(q>>>0)&s|i<<r;v=i>>>(q>>>0)&s;w=0;x=g<<r;break}if(!e){n=0;o=0;return (I=n,o)|0}f[e>>2]=a|0;f[e+4>>2]=h|b&0;n=0;o=0;return (I=n,o)|0}r=j-1|0;if(r&j|0){s=(_(j|0)|0)+33-(_(i|0)|0)|0;q=64-s|0;p=32-s|0;y=p>>31;z=s-32|0;A=z>>31;t=s;u=p-1>>31&i>>>(z>>>0)|(i<<p|g>>>(s>>>0))&A;v=A&i>>>(s>>>0);w=g<<q&y;x=(i<<q|g>>>(z>>>0))&y|g<<p&s-33>>31;break}if(e|0){f[e>>2]=r&g;f[e+4>>2]=0}if((j|0)==1){n=h|b&0;o=a|0|0;return (I=n,o)|0}else{r=im(j|0)|0;n=i>>>(r>>>0)|0;o=i<<32-r|g>>>(r>>>0)|0;return (I=n,o)|0}}else{if(m){if(e|0){f[e>>2]=(i>>>0)%(j>>>0);f[e+4>>2]=0}n=0;o=(i>>>0)/(j>>>0)>>>0;return (I=n,o)|0}if(!g){if(e|0){f[e>>2]=0;f[e+4>>2]=(i>>>0)%(l>>>0)}n=0;o=(i>>>0)/(l>>>0)>>>0;return (I=n,o)|0}r=l-1|0;if(!(r&l)){if(e|0){f[e>>2]=a|0;f[e+4>>2]=r&i|b&0}n=0;o=i>>>((im(l|0)|0)>>>0);return (I=n,o)|0}r=(_(l|0)|0)-(_(i|0)|0)|0;if(r>>>0<=30){s=r+1|0;p=31-r|0;t=s;u=i<<p|g>>>(s>>>0);v=i>>>(s>>>0);w=0;x=g<<p;break}if(!e){n=0;o=0;return (I=n,o)|0}f[e>>2]=a|0;f[e+4>>2]=h|b&0;n=0;o=0;return (I=n,o)|0}while(0);if(!t){B=x;C=w;D=v;E=u;F=0;G=0}else{b=c|0|0;c=k|d&0;d=Tn(b|0,c|0,-1,-1)|0;k=I;h=x;x=w;w=v;v=u;u=t;t=0;do{a=h;h=x>>>31|h<<1;x=t|x<<1;g=v<<1|a>>>31|0;a=v>>>31|w<<1|0;Vn(d|0,k|0,g|0,a|0)|0;i=I;l=i>>31|((i|0)<0?-1:0)<<1;t=l&1;v=Vn(g|0,a|0,l&b|0,(((i|0)<0?-1:0)>>31|((i|0)<0?-1:0)<<1)&c|0)|0;w=I;u=u-1|0}while((u|0)!=0);B=h;C=x;D=w;E=v;F=0;G=t}t=C;C=0;if(e|0){f[e>>2]=E;f[e+4>>2]=D}n=(t|0)>>>31|(B|C)<<1|(C<<1|t>>>31)&0|F;o=(t<<1|0>>>31)&-2|G;return (I=n,o)|0}function Cd(a){a=a|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;c=u;u=u+32|0;d=c+4|0;e=c;g=c+16|0;h=a+48|0;i=f[h>>2]|0;j=dn(32)|0;f[d>>2]=j;f[d+8>>2]=-2147483616;f[d+4>>2]=20;k=j;l=13101;m=k+20|0;do{b[k>>0]=b[l>>0]|0;k=k+1|0;l=l+1|0}while((k|0)<(m|0));b[j+20>>0]=0;j=vk(i+24|0,d)|0;if((b[d+11>>0]|0)<0)br(f[d>>2]|0);i=f[h>>2]|0;n=dn(32)|0;f[d>>2]=n;f[d+8>>2]=-2147483616;f[d+4>>2]=22;k=n;l=13122;m=k+22|0;do{b[k>>0]=b[l>>0]|0;k=k+1|0;l=l+1|0}while((k|0)<(m|0));b[n+22>>0]=0;n=vk(i+24|0,d)|0;if((b[d+11>>0]|0)<0)br(f[d>>2]|0);i=a+64|0;o=f[i>>2]|0;f[i>>2]=0;if(o|0)Va[f[(f[o>>2]|0)+4>>2]&127](o);o=f[a+56>>2]|0;p=(((f[o+100>>2]|0)-(f[o+96>>2]|0)|0)/12|0)>>>0<1e3;o=f[h>>2]|0;q=dn(32)|0;f[d>>2]=q;f[d+8>>2]=-2147483616;f[d+4>>2]=18;k=q;l=13145;m=k+18|0;do{b[k>>0]=b[l>>0]|0;k=k+1|0;l=l+1|0}while((k|0)<(m|0));b[q+18>>0]=0;q=yk(o,d,-1)|0;if((b[d+11>>0]|0)<0)br(f[d>>2]|0);switch(q|0){case -1:{if(j?p|((Yh(f[h>>2]|0)|0)>4|n^1):0)r=13;else r=17;break}case 0:{if(j)r=13;else r=21;break}case 2:{r=17;break}default:r=21}if((r|0)==13){j=f[a+44>>2]|0;b[g>>0]=0;n=j+16|0;h=f[n+4>>2]|0;if(!((h|0)>0|(h|0)==0&(f[n>>2]|0)>>>0>0)){f[e>>2]=f[j+4>>2];f[d>>2]=f[e>>2];ye(j,d,g,g+1|0)|0}j=dn(296)|0;Ni(j);n=f[i>>2]|0;f[i>>2]=j;if(!n)s=j;else{Va[f[(f[n>>2]|0)+4>>2]&127](n);r=21}}else if((r|0)==17){n=f[a+44>>2]|0;b[g>>0]=2;j=n+16|0;h=f[j+4>>2]|0;if(!((h|0)>0|(h|0)==0&(f[j>>2]|0)>>>0>0)){f[e>>2]=f[n+4>>2];f[d>>2]=f[e>>2];ye(n,d,g,g+1|0)|0}g=dn(360)|0;ji(g);d=f[i>>2]|0;f[i>>2]=g;if(!d)s=g;else{Va[f[(f[d>>2]|0)+4>>2]&127](d);r=21}}if((r|0)==21){r=f[i>>2]|0;if(!r){t=0;u=c;return t|0}else s=r}t=Ra[f[(f[s>>2]|0)+8>>2]&127](s,a)|0;u=c;return t|0}function Dd(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0;e=b+12|0;g=f[e>>2]|0;h=c+4|0;i=(f[h>>2]|0)-g|0;j=c;f[j>>2]=(f[c>>2]|0)-g;f[j+4>>2]=i;i=(f[d>>2]|0)-g|0;j=d+4|0;k=(f[j>>2]|0)-g|0;g=d;f[g>>2]=i;f[g+4>>2]=k;g=f[e>>2]|0;if((((k|0)>-1?k:0-k|0)+((i|0)>-1?i:0-i|0)|0)>(g|0)){l=f[c>>2]|0;m=f[h>>2]|0;if((l|0)>-1)if((m|0)<=-1)if((l|0)<1){n=-1;o=-1}else p=6;else{n=1;o=1}else if((m|0)<1){n=-1;o=-1}else p=6;if((p|0)==6){n=(l|0)>0?1:-1;o=(m|0)>0?1:-1}q=X(g,n)|0;r=X(g,o)|0;g=(l<<1)-q|0;f[c>>2]=g;l=(m<<1)-r|0;f[h>>2]=l;if((X(n,o)|0)>-1){o=0-l|0;f[c>>2]=o;s=0-g|0;t=o}else{f[c>>2]=l;s=g;t=l}f[c>>2]=(t+q|0)/2|0;f[h>>2]=(s+r|0)/2|0;r=f[d>>2]|0;s=f[j>>2]|0;if((r|0)>-1)if((s|0)<=-1)if((r|0)<1){u=-1;v=-1}else p=14;else{u=1;v=1}else if((s|0)<1){u=-1;v=-1}else p=14;if((p|0)==14){u=(r|0)>0?1:-1;v=(s|0)>0?1:-1}q=f[e>>2]|0;e=X(q,u)|0;t=X(q,v)|0;q=(r<<1)-e|0;f[d>>2]=q;r=(s<<1)-t|0;f[j>>2]=r;if((X(u,v)|0)>-1){v=0-r|0;f[d>>2]=v;w=0-q|0;x=v}else{f[d>>2]=r;w=q;x=r}r=(x+e|0)/2|0;f[d>>2]=r;e=(w+t|0)/2|0;f[j>>2]=e;y=r;z=e}else{y=i;z=k}if(!y)if(!z){A=y;B=z}else p=22;else if((y|0)<0&(z|0)<1){A=y;B=z}else p=22;if((p|0)==22){if(!y)C=(z|0)==0?0:(z|0)>0?3:1;else C=(y|0)>0?(z>>31)+2|0:(z|0)<1?0:3;z=f[c>>2]|0;y=f[h>>2]|0;switch(C|0){case 1:{C=c;f[C>>2]=y;f[C+4>>2]=0-z;D=f[j>>2]|0;E=0-(f[d>>2]|0)|0;break}case 2:{C=c;f[C>>2]=0-z;f[C+4>>2]=0-y;D=0-(f[d>>2]|0)|0;E=0-(f[j>>2]|0)|0;break}case 3:{C=c;f[C>>2]=0-y;f[C+4>>2]=z;D=0-(f[j>>2]|0)|0;E=f[d>>2]|0;break}default:{C=c;f[C>>2]=z;f[C+4>>2]=y;D=f[d>>2]|0;E=f[j>>2]|0}}j=d;f[j>>2]=D;f[j+4>>2]=E;A=D;B=E}E=(f[c>>2]|0)-A|0;f[a>>2]=E;A=(f[h>>2]|0)-B|0;B=a+4|0;f[B>>2]=A;if((E|0)<0)F=(f[b+4>>2]|0)+E|0;else F=E;f[a>>2]=F;if((A|0)>=0){G=A;f[B>>2]=G;return}G=(f[b+4>>2]|0)+A|0;f[B>>2]=G;return}function Ed(a,b){a=a|0;b=b|0;var c=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0;c=a+4|0;if(!b){e=f[a>>2]|0;f[a>>2]=0;if(e|0)br(e);f[c>>2]=0;return}if(b>>>0>1073741823){e=ra(8)|0;Wo(e,14941);f[e>>2]=6944;va(e|0,1080,114)}e=dn(b<<2)|0;g=f[a>>2]|0;f[a>>2]=e;if(g|0)br(g);f[c>>2]=b;c=0;do{f[(f[a>>2]|0)+(c<<2)>>2]=0;c=c+1|0}while((c|0)!=(b|0));c=a+8|0;g=f[c>>2]|0;if(!g)return;e=f[g+4>>2]|0;h=b+-1|0;i=(h&b|0)==0;if(!i)if(e>>>0<b>>>0)j=e;else j=(e>>>0)%(b>>>0)|0;else j=e&h;f[(f[a>>2]|0)+(j<<2)>>2]=c;c=f[g>>2]|0;if(!c)return;else{k=j;l=g;m=c;n=g}a:while(1){b:do if(i){g=l;c=m;j=n;while(1){e=c;while(1){o=f[e+4>>2]&h;if((o|0)==(k|0))break;p=(f[a>>2]|0)+(o<<2)|0;if(!(f[p>>2]|0)){q=e;r=j;s=o;t=p;break b}p=e+8|0;u=e;while(1){v=f[u>>2]|0;if(!v)break;if((d[p>>1]|0)==(d[v+8>>1]|0))u=v;else break}f[j>>2]=v;f[u>>2]=f[f[(f[a>>2]|0)+(o<<2)>>2]>>2];f[f[(f[a>>2]|0)+(o<<2)>>2]>>2]=e;p=f[g>>2]|0;if(!p){w=37;break a}else e=p}c=f[e>>2]|0;if(!c){w=37;break a}else{g=e;j=e}}}else{j=l;g=m;c=n;while(1){p=g;while(1){x=f[p+4>>2]|0;if(x>>>0<b>>>0)y=x;else y=(x>>>0)%(b>>>0)|0;if((y|0)==(k|0))break;x=(f[a>>2]|0)+(y<<2)|0;if(!(f[x>>2]|0)){q=p;r=c;s=y;t=x;break b}x=p+8|0;z=p;while(1){A=f[z>>2]|0;if(!A)break;if((d[x>>1]|0)==(d[A+8>>1]|0))z=A;else break}f[c>>2]=A;f[z>>2]=f[f[(f[a>>2]|0)+(y<<2)>>2]>>2];f[f[(f[a>>2]|0)+(y<<2)>>2]>>2]=p;x=f[j>>2]|0;if(!x){w=37;break a}else p=x}g=f[p>>2]|0;if(!g){w=37;break a}else{j=p;c=p}}}while(0);f[t>>2]=r;m=f[q>>2]|0;if(!m){w=37;break}else{k=s;l=q;n=q}}if((w|0)==37)return}function Fd(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0;d=a+4|0;if(!c){e=f[a>>2]|0;f[a>>2]=0;if(e|0)br(e);f[d>>2]=0;return}if(c>>>0>1073741823){e=ra(8)|0;Wo(e,14941);f[e>>2]=6944;va(e|0,1080,114)}e=dn(c<<2)|0;g=f[a>>2]|0;f[a>>2]=e;if(g|0)br(g);f[d>>2]=c;d=0;do{f[(f[a>>2]|0)+(d<<2)>>2]=0;d=d+1|0}while((d|0)!=(c|0));d=a+8|0;g=f[d>>2]|0;if(!g)return;e=f[g+4>>2]|0;h=c+-1|0;i=(h&c|0)==0;if(!i)if(e>>>0<c>>>0)j=e;else j=(e>>>0)%(c>>>0)|0;else j=e&h;f[(f[a>>2]|0)+(j<<2)>>2]=d;d=f[g>>2]|0;if(!d)return;else{k=j;l=g;m=d;n=g}a:while(1){b:do if(i){g=l;d=m;j=n;while(1){e=d;while(1){o=f[e+4>>2]&h;if((o|0)==(k|0))break;p=(f[a>>2]|0)+(o<<2)|0;if(!(f[p>>2]|0)){q=e;r=j;s=o;t=p;break b}p=e+8|0;u=e;while(1){v=f[u>>2]|0;if(!v)break;if((b[p>>0]|0)==(b[v+8>>0]|0))u=v;else break}f[j>>2]=v;f[u>>2]=f[f[(f[a>>2]|0)+(o<<2)>>2]>>2];f[f[(f[a>>2]|0)+(o<<2)>>2]>>2]=e;p=f[g>>2]|0;if(!p){w=37;break a}else e=p}d=f[e>>2]|0;if(!d){w=37;break a}else{g=e;j=e}}}else{j=l;g=m;d=n;while(1){p=g;while(1){x=f[p+4>>2]|0;if(x>>>0<c>>>0)y=x;else y=(x>>>0)%(c>>>0)|0;if((y|0)==(k|0))break;x=(f[a>>2]|0)+(y<<2)|0;if(!(f[x>>2]|0)){q=p;r=d;s=y;t=x;break b}x=p+8|0;z=p;while(1){A=f[z>>2]|0;if(!A)break;if((b[x>>0]|0)==(b[A+8>>0]|0))z=A;else break}f[d>>2]=A;f[z>>2]=f[f[(f[a>>2]|0)+(y<<2)>>2]>>2];f[f[(f[a>>2]|0)+(y<<2)>>2]>>2]=p;x=f[j>>2]|0;if(!x){w=37;break a}else p=x}g=f[p>>2]|0;if(!g){w=37;break a}else{j=p;d=p}}}while(0);f[t>>2]=r;m=f[q>>2]|0;if(!m){w=37;break}else{k=s;l=q;n=q}}if((w|0)==37)return}function Gd(a,b,c,d,e,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0;g=f[c>>2]|0;c=f[b>>2]|0;h=g-c|0;i=a+8|0;j=f[i>>2]|0;if(h>>>0<64){if(j>>>0<=1){k=0;return k|0}l=f[e>>2]|0;m=0;n=1;while(1){o=(f[l+(m<<2)>>2]|0)>>>0>(f[l+(n<<2)>>2]|0)>>>0?n:m;n=n+1|0;if(n>>>0>=j>>>0){k=o;break}else m=o}return k|0}if(j){j=f[a+1128>>2]|0;m=f[e>>2]|0;e=f[a+1140>>2]|0;n=f[d>>2]|0;d=b+4|0;l=b+8|0;if((g|0)==(c|0)){b=0;do{o=j+(b<<2)|0;f[o>>2]=0;p=(f[a>>2]|0)-(f[m+(b<<2)>>2]|0)|0;f[e+(b<<2)>>2]=p;if(p|0){p=f[o>>2]|0;q=h-p|0;f[o>>2]=q>>>0<p>>>0?p:q}b=b+1|0;q=f[i>>2]|0}while(b>>>0<q>>>0);r=q}else{b=0;do{q=j+(b<<2)|0;f[q>>2]=0;p=(f[a>>2]|0)-(f[m+(b<<2)>>2]|0)|0;f[e+(b<<2)>>2]=p;if(p|0){o=(f[n+(b<<2)>>2]|0)+(1<<p+-1)|0;p=f[l>>2]|0;s=f[(f[d>>2]|0)+24>>2]|0;t=c;u=f[q>>2]|0;do{v=s+((X(t,p)|0)<<2)+(b<<2)|0;u=u+((f[v>>2]|0)>>>0<o>>>0&1)|0;f[q>>2]=u;t=t+1|0}while((t|0)!=(g|0));t=h-u|0;f[q>>2]=t>>>0<u>>>0?u:t}b=b+1|0;t=f[i>>2]|0}while(b>>>0<t>>>0);r=t}if(r){b=f[a+1140>>2]|0;i=a+1128|0;h=0;g=0;c=0;while(1){if(!(f[b+(g<<2)>>2]|0)){w=h;x=c}else{d=f[(f[i>>2]|0)+(g<<2)>>2]|0;l=h>>>0<d>>>0;w=l?d:h;x=l?g:c}g=g+1|0;if(g>>>0>=r>>>0){y=x;break}else{h=w;c=x}}}else y=0}else y=0;x=a+1088|0;c=a+1104|0;w=f[c>>2]|0;h=32-w|0;if((h|0)<4){r=y&15;g=4-h|0;f[c>>2]=g;h=a+1100|0;i=f[h>>2]|r>>>g;f[h>>2]=i;g=a+1092|0;b=f[g>>2]|0;if((b|0)==(f[a+1096>>2]|0))Ci(x,h);else{f[b>>2]=i;f[g>>2]=b+4}f[h>>2]=r<<32-(f[c>>2]|0);k=y;return k|0}r=a+1100|0;h=f[r>>2]|y<<28>>>w;f[r>>2]=h;b=w+4|0;f[c>>2]=b;if((b|0)!=32){k=y;return k|0}b=a+1092|0;w=f[b>>2]|0;if((w|0)==(f[a+1096>>2]|0))Ci(x,r);else{f[w>>2]=h;f[b>>2]=w+4}f[r>>2]=0;f[c>>2]=0;k=y;return k|0}function Hd(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0;c=a+4|0;if(!b){d=f[a>>2]|0;f[a>>2]=0;if(d|0)br(d);f[c>>2]=0;return}if(b>>>0>1073741823){d=ra(8)|0;Wo(d,14941);f[d>>2]=6944;va(d|0,1080,114)}d=dn(b<<2)|0;e=f[a>>2]|0;f[a>>2]=d;if(e|0)br(e);f[c>>2]=b;c=0;do{f[(f[a>>2]|0)+(c<<2)>>2]=0;c=c+1|0}while((c|0)!=(b|0));c=a+8|0;e=f[c>>2]|0;if(!e)return;d=f[e+4>>2]|0;g=b+-1|0;h=(g&b|0)==0;if(!h)if(d>>>0<b>>>0)i=d;else i=(d>>>0)%(b>>>0)|0;else i=d&g;f[(f[a>>2]|0)+(i<<2)>>2]=c;c=f[e>>2]|0;if(!c)return;else{j=i;k=e;l=c;m=e}a:while(1){b:do if(h){e=k;c=l;i=m;while(1){d=c;while(1){n=f[d+4>>2]&g;if((n|0)==(j|0))break;o=(f[a>>2]|0)+(n<<2)|0;if(!(f[o>>2]|0)){p=d;q=i;r=n;s=o;break b}o=d+8|0;t=d;while(1){u=f[t>>2]|0;if(!u)break;if((f[o>>2]|0)==(f[u+8>>2]|0))t=u;else break}f[i>>2]=u;f[t>>2]=f[f[(f[a>>2]|0)+(n<<2)>>2]>>2];f[f[(f[a>>2]|0)+(n<<2)>>2]>>2]=d;o=f[e>>2]|0;if(!o){v=37;break a}else d=o}c=f[d>>2]|0;if(!c){v=37;break a}else{e=d;i=d}}}else{i=k;e=l;c=m;while(1){o=e;while(1){w=f[o+4>>2]|0;if(w>>>0<b>>>0)x=w;else x=(w>>>0)%(b>>>0)|0;if((x|0)==(j|0))break;w=(f[a>>2]|0)+(x<<2)|0;if(!(f[w>>2]|0)){p=o;q=c;r=x;s=w;break b}w=o+8|0;y=o;while(1){z=f[y>>2]|0;if(!z)break;if((f[w>>2]|0)==(f[z+8>>2]|0))y=z;else break}f[c>>2]=z;f[y>>2]=f[f[(f[a>>2]|0)+(x<<2)>>2]>>2];f[f[(f[a>>2]|0)+(x<<2)>>2]>>2]=o;w=f[i>>2]|0;if(!w){v=37;break a}else o=w}e=f[o>>2]|0;if(!e){v=37;break a}else{i=o;c=o}}}while(0);f[s>>2]=q;l=f[p>>2]|0;if(!l){v=37;break}else{j=r;k=p;m=p}}if((v|0)==37)return}function Id(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0;d=a+4|0;if(!c){e=f[a>>2]|0;f[a>>2]=0;if(e|0)br(e);f[d>>2]=0;return}if(c>>>0>1073741823){e=ra(8)|0;Wo(e,14941);f[e>>2]=6944;va(e|0,1080,114)}e=dn(c<<2)|0;g=f[a>>2]|0;f[a>>2]=e;if(g|0)br(g);f[d>>2]=c;d=0;do{f[(f[a>>2]|0)+(d<<2)>>2]=0;d=d+1|0}while((d|0)!=(c|0));d=a+8|0;g=f[d>>2]|0;if(!g)return;e=f[g+4>>2]|0;h=c+-1|0;i=(h&c|0)==0;if(!i)if(e>>>0<c>>>0)j=e;else j=(e>>>0)%(c>>>0)|0;else j=e&h;f[(f[a>>2]|0)+(j<<2)>>2]=d;d=f[g>>2]|0;if(!d)return;e=a+24|0;k=j;j=g;l=d;d=g;a:while(1){g=j;m=l;n=d;b:while(1){o=m;while(1){p=f[o+4>>2]|0;if(!i)if(p>>>0<c>>>0)q=p;else q=(p>>>0)%(c>>>0)|0;else q=p&h;if((q|0)==(k|0))break;r=(f[a>>2]|0)+(q<<2)|0;if(!(f[r>>2]|0))break b;p=f[o>>2]|0;c:do if(!p)s=o;else{t=f[o+8>>2]|0;u=f[e>>2]|0;v=f[u+8>>2]|0;w=(f[u+12>>2]|0)-v|0;u=v;v=w>>>2;if((w|0)>0){x=o;y=p}else{w=p;while(1){z=f[w>>2]|0;if(!z){s=w;break c}else w=z}}while(1){w=f[y+8>>2]|0;z=0;do{A=f[u+(z<<2)>>2]|0;if(!(b[A+84>>0]|0)){B=f[A+68>>2]|0;C=f[B+(w<<2)>>2]|0;D=f[B+(t<<2)>>2]|0}else{C=w;D=t}z=z+1|0;if((D|0)!=(C|0)){s=x;break c}}while((z|0)<(v|0));z=f[y>>2]|0;if(!z){s=y;break}else{w=y;y=z;x=w}}}while(0);f[n>>2]=f[s>>2];f[s>>2]=f[f[(f[a>>2]|0)+(q<<2)>>2]>>2];f[f[(f[a>>2]|0)+(q<<2)>>2]>>2]=o;p=f[g>>2]|0;if(!p){E=38;break a}else o=p}m=f[o>>2]|0;if(!m){E=38;break a}else{g=o;n=o}}f[r>>2]=n;l=f[o>>2]|0;if(!l){E=38;break}else{k=q;j=o;d=o}}if((E|0)==38)return}function Jd(a,c){a=a|0;c=c|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0;e=u;u=u+16|0;g=e+4|0;h=e;i=e+12|0;j=e+11|0;k=e+10|0;l=e+8|0;m=c+44|0;n=f[m>>2]|0;o=n+16|0;p=f[o+4>>2]|0;if(!((p|0)>0|(p|0)==0&(f[o>>2]|0)>>>0>0)){f[h>>2]=f[n+4>>2];f[g>>2]=f[h>>2];ye(n,g,14849,14854)|0}n=Qa[f[(f[c>>2]|0)+8>>2]&127](c)|0;b[i>>0]=n;b[j>>0]=2;b[k>>0]=(n&255|0)==0?3:2;n=f[m>>2]|0;o=n+16|0;p=f[o+4>>2]|0;if(!((p|0)>0|(p|0)==0&(f[o>>2]|0)>>>0>0)){f[h>>2]=f[n+4>>2];f[g>>2]=f[h>>2];ye(n,g,j,j+1|0)|0;j=f[m>>2]|0;o=j+16|0;p=f[o+4>>2]|0;if(!((p|0)>0|(p|0)==0&(f[o>>2]|0)>>>0>0)){f[h>>2]=f[j+4>>2];f[g>>2]=f[h>>2];ye(j,g,k,k+1|0)|0;k=f[m>>2]|0;o=k+16|0;p=f[o+4>>2]|0;if((p|0)>0|(p|0)==0&(f[o>>2]|0)>>>0>0){q=h;r=k}else{f[h>>2]=f[k+4>>2];f[g>>2]=f[h>>2];ye(k,g,i,i+1|0)|0;q=h;r=f[m>>2]|0}}else{s=h;t=j;v=6}}else{s=h;t=n;v=6}if((v|0)==6){q=h;r=t}t=Qa[f[(f[c>>2]|0)+12>>2]&127](c)|0;b[l>>0]=t;t=r+16|0;q=f[t+4>>2]|0;if(!((q|0)>0|(q|0)==0&(f[t>>2]|0)>>>0>0)){f[h>>2]=f[r+4>>2];f[g>>2]=f[h>>2];ye(r,g,l,l+1|0)|0}d[l>>1]=(f[(f[c+4>>2]|0)+4>>2]|0)==0?0:-32768;c=f[m>>2]|0;m=c+16|0;r=f[m+4>>2]|0;if((r|0)>0|(r|0)==0&(f[m>>2]|0)>>>0>0){f[a>>2]=0;f[a+4>>2]=0;f[a+8>>2]=0;f[a+12>>2]=0;u=e;return}f[h>>2]=f[c+4>>2];f[g>>2]=f[h>>2];ye(c,g,l,l+2|0)|0;f[a>>2]=0;f[a+4>>2]=0;f[a+8>>2]=0;f[a+12>>2]=0;u=e;return}function Kd(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=Oa,x=0,y=Oa,z=Oa,A=Oa,B=Oa;e=u;u=u+16|0;g=e;h=a+4|0;if((f[h>>2]|0)!=-1){i=0;u=e;return i|0}f[h>>2]=d;d=b[c+24>>0]|0;h=d<<24>>24;j=a+20|0;n[j>>2]=$(0.0);f[g>>2]=0;k=g+4|0;f[k>>2]=0;f[g+8>>2]=0;do if(d<<24>>24)if(d<<24>>24<0)mq(g);else{l=h<<2;m=dn(l)|0;f[g>>2]=m;o=m+(h<<2)|0;f[g+8>>2]=o;hj(m|0,0,l|0)|0;l=m+(h<<2)|0;f[k>>2]=l;p=m;q=l;r=o;break}else{p=0;q=0;r=0}while(0);k=a+8|0;g=f[k>>2]|0;o=a+12|0;if(!g)s=a+16|0;else{l=f[o>>2]|0;if((l|0)!=(g|0))f[o>>2]=l+(~((l+-4-g|0)>>>2)<<2);br(g);g=a+16|0;f[g>>2]=0;f[o>>2]=0;f[k>>2]=0;s=g}f[k>>2]=p;f[o>>2]=q;f[s>>2]=r;r=h>>>0>1073741823?-1:h<<2;s=_q(r)|0;q=_q(r)|0;r=c+48|0;o=f[r>>2]|0;g=c+40|0;a=f[g>>2]|0;l=f[c>>2]|0;Rg(q|0,(f[l>>2]|0)+o|0,a|0)|0;Rg(p|0,(f[l>>2]|0)+o|0,a|0)|0;a=r;r=f[a>>2]|0;o=f[a+4>>2]|0;a=g;g=f[a>>2]|0;l=f[a+4>>2]|0;a=f[c>>2]|0;Rg(s|0,(f[a>>2]|0)+r|0,g|0)|0;p=f[c+80>>2]|0;a:do if(p>>>0>1){if(d<<24>>24<=0){c=1;while(1){m=on(g|0,l|0,c|0,0)|0;t=Tn(m|0,I|0,r|0,o|0)|0;Rg(q|0,(f[a>>2]|0)+t|0,g|0)|0;c=c+1|0;if(c>>>0>=p>>>0)break a}}c=f[k>>2]|0;t=1;do{m=on(g|0,l|0,t|0,0)|0;v=Tn(m|0,I|0,r|0,o|0)|0;Rg(q|0,(f[a>>2]|0)+v|0,g|0)|0;v=0;do{m=c+(v<<2)|0;w=$(n[m>>2]);x=q+(v<<2)|0;y=$(n[x>>2]);if(w>y){n[m>>2]=y;z=$(n[x>>2])}else z=y;x=s+(v<<2)|0;if($(n[x>>2])<z)n[x>>2]=z;v=v+1|0}while((v|0)!=(h|0));t=t+1|0}while(t>>>0<p>>>0)}while(0);if(d<<24>>24>0){d=f[k>>2]|0;k=0;z=$(n[j>>2]);while(1){y=$(n[s+(k<<2)>>2]);w=$(y-$(n[d+(k<<2)>>2]));if(w>z){n[j>>2]=w;A=w}else A=z;k=k+1|0;if((k|0)==(h|0)){B=A;break}else z=A}}else B=$(n[j>>2]);if(B==$(0.0))n[j>>2]=$(1.0);$q(q);$q(s);i=1;u=e;return i|0}function Ld(a,b,c,d,e,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0;g=a+8|0;Ah(g,b,d,e);h=d-e|0;if((h|0)>0){d=0-e|0;i=a+16|0;j=a+32|0;k=a+12|0;l=a+28|0;m=a+20|0;n=a+24|0;o=h;h=f[g>>2]|0;while(1){p=b+(o<<2)|0;q=c+(o<<2)|0;if((h|0)>0){r=0;s=p+(d<<2)|0;t=h;while(1){if((t|0)>0){u=0;do{v=f[s+(u<<2)>>2]|0;w=f[i>>2]|0;if((v|0)>(w|0)){x=f[j>>2]|0;f[x+(u<<2)>>2]=w;y=x}else{x=f[k>>2]|0;w=f[j>>2]|0;f[w+(u<<2)>>2]=(v|0)<(x|0)?x:v;y=w}u=u+1|0}while((u|0)<(f[g>>2]|0));z=y}else z=f[j>>2]|0;u=(f[p+(r<<2)>>2]|0)-(f[z+(r<<2)>>2]|0)|0;w=q+(r<<2)|0;f[w>>2]=u;if((u|0)>=(f[l>>2]|0)){if((u|0)>(f[n>>2]|0)){A=u-(f[m>>2]|0)|0;B=31}}else{A=(f[m>>2]|0)+u|0;B=31}if((B|0)==31){B=0;f[w>>2]=A}r=r+1|0;w=f[g>>2]|0;if((r|0)>=(w|0)){C=w;break}else{s=z;t=w}}}else C=h;o=o-e|0;if((o|0)<=0){D=C;break}else h=C}}else D=f[g>>2]|0;C=e>>>0>1073741823?-1:e<<2;e=_q(C)|0;hj(e|0,0,C|0)|0;if((D|0)<=0){$q(e);return 1}C=a+16|0;h=a+32|0;o=a+12|0;z=a+28|0;A=a+20|0;m=a+24|0;a=0;n=e;l=D;while(1){if((l|0)>0){D=0;do{j=f[n+(D<<2)>>2]|0;y=f[C>>2]|0;if((j|0)>(y|0)){k=f[h>>2]|0;f[k+(D<<2)>>2]=y;E=k}else{k=f[o>>2]|0;y=f[h>>2]|0;f[y+(D<<2)>>2]=(j|0)<(k|0)?k:j;E=y}D=D+1|0}while((D|0)<(f[g>>2]|0));F=E}else F=f[h>>2]|0;D=(f[b+(a<<2)>>2]|0)-(f[F+(a<<2)>>2]|0)|0;y=c+(a<<2)|0;f[y>>2]=D;if((D|0)>=(f[z>>2]|0)){if((D|0)>(f[m>>2]|0)){G=D-(f[A>>2]|0)|0;B=16}}else{G=(f[A>>2]|0)+D|0;B=16}if((B|0)==16){B=0;f[y>>2]=G}a=a+1|0;l=f[g>>2]|0;if((a|0)>=(l|0))break;else n=F}$q(e);return 1}function Md(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0;e=f[a>>2]|0;g=e;h=(f[b>>2]|0)-g|0;b=e+(h>>2<<2)|0;i=f[c>>2]|0;c=f[d>>2]|0;d=c-i|0;j=d>>2;k=i;l=c;if((d|0)<=0){m=b;return m|0}d=a+8|0;n=f[d>>2]|0;o=a+4|0;p=f[o>>2]|0;q=p;if((j|0)<=(n-q>>2|0)){r=b;s=q-r|0;t=s>>2;if((j|0)>(t|0)){u=k+(t<<2)|0;t=u;if((u|0)==(l|0))v=p;else{w=l+-4-t|0;x=u;u=p;while(1){f[u>>2]=f[x>>2];x=x+4|0;if((x|0)==(l|0))break;else u=u+4|0}u=p+((w>>>2)+1<<2)|0;f[o>>2]=u;v=u}if((s|0)>0){y=t;z=v}else{m=b;return m|0}}else{y=c;z=p}c=z-(b+(j<<2))>>2;v=b+(c<<2)|0;if(v>>>0<p>>>0){t=(p+(0-c<<2)+~r|0)>>>2;r=v;s=z;while(1){f[s>>2]=f[r>>2];r=r+4|0;if(r>>>0>=p>>>0)break;else s=s+4|0}f[o>>2]=z+(t+1<<2)}if(c|0){c=v;v=z;do{c=c+-4|0;v=v+-4|0;f[v>>2]=f[c>>2]}while((c|0)!=(b|0))}c=y;if((k|0)==(c|0)){m=b;return m|0}else{A=b;B=k}while(1){f[A>>2]=f[B>>2];B=B+4|0;if((B|0)==(c|0)){m=b;break}else A=A+4|0}return m|0}A=(q-g>>2)+j|0;if(A>>>0>1073741823)mq(a);j=n-g|0;g=j>>1;n=j>>2>>>0<536870911?(g>>>0<A>>>0?A:g):1073741823;g=b;A=h>>2;do if(n)if(n>>>0>1073741823){j=ra(8)|0;Wo(j,14941);f[j>>2]=6944;va(j|0,1080,114)}else{j=dn(n<<2)|0;C=j;D=j;break}else{C=0;D=0}while(0);j=D+(A<<2)|0;A=D+(n<<2)|0;if((l|0)==(k|0))E=j;else{n=((l+-4-i|0)>>>2)+1|0;i=k;k=j;while(1){f[k>>2]=f[i>>2];i=i+4|0;if((i|0)==(l|0))break;else k=k+4|0}E=j+(n<<2)|0}if((h|0)>0)Rg(C|0,e|0,h|0)|0;h=q-g|0;if((h|0)>0){Rg(E|0,b|0,h|0)|0;F=E+(h>>>2<<2)|0}else F=E;f[a>>2]=D;f[o>>2]=F;f[d>>2]=A;if(!e){m=j;return m|0}br(e);m=j;return m|0}function Nd(a,b,c,d,e,g,h){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;g=g|0;h=h|0;var i=0;switch(c|0){case 1:{c=dn(60)|0;f[c>>2]=1528;f[c+4>>2]=d;h=c+8|0;f[h>>2]=f[e>>2];f[h+4>>2]=f[e+4>>2];f[h+8>>2]=f[e+8>>2];f[h+12>>2]=f[e+12>>2];f[h+16>>2]=f[e+16>>2];f[h+20>>2]=f[e+20>>2];_j(c+32|0,e+24|0);h=c+44|0;f[h>>2]=f[g>>2];f[h+4>>2]=f[g+4>>2];f[h+8>>2]=f[g+8>>2];f[h+12>>2]=f[g+12>>2];f[c>>2]=1948;i=c;f[a>>2]=i;return}case 4:{c=dn(168)|0;Ei(c,d,e,g);i=c;f[a>>2]=i;return}case 5:{c=dn(104)|0;f[c>>2]=1528;f[c+4>>2]=d;h=c+8|0;f[h>>2]=f[e>>2];f[h+4>>2]=f[e+4>>2];f[h+8>>2]=f[e+8>>2];f[h+12>>2]=f[e+12>>2];f[h+16>>2]=f[e+16>>2];f[h+20>>2]=f[e+20>>2];_j(c+32|0,e+24|0);h=c+44|0;f[h>>2]=f[g>>2];f[h+4>>2]=f[g+4>>2];f[h+8>>2]=f[g+8>>2];f[h+12>>2]=f[g+12>>2];f[c>>2]=2004;f[c+60>>2]=0;f[c+64>>2]=0;f[c+76>>2]=0;f[c+80>>2]=0;f[c+84>>2]=0;h=c+88|0;f[h>>2]=f[g>>2];f[h+4>>2]=f[g+4>>2];f[h+8>>2]=f[g+8>>2];f[h+12>>2]=f[g+12>>2];i=c;f[a>>2]=i;return}case 6:{c=dn(140)|0;f[c>>2]=1528;f[c+4>>2]=d;d=c+8|0;f[d>>2]=f[e>>2];f[d+4>>2]=f[e+4>>2];f[d+8>>2]=f[e+8>>2];f[d+12>>2]=f[e+12>>2];f[d+16>>2]=f[e+16>>2];f[d+20>>2]=f[e+20>>2];_j(c+32|0,e+24|0);e=c+44|0;f[e>>2]=f[g>>2];f[e+4>>2]=f[g+4>>2];f[e+8>>2]=f[g+8>>2];f[e+12>>2]=f[g+12>>2];f[c>>2]=2060;f[c+64>>2]=0;f[c+68>>2]=0;e=c+72|0;f[e>>2]=f[g>>2];f[e+4>>2]=f[g+4>>2];f[e+8>>2]=f[g+8>>2];f[e+12>>2]=f[g+12>>2];f[c+60>>2]=2116;f[c+88>>2]=1;g=c+92|0;f[g>>2]=-1;f[g+4>>2]=-1;f[g+8>>2]=-1;f[g+12>>2]=-1;rn(c+108|0);i=c;f[a>>2]=i;return}default:{i=0;f[a>>2]=i;return}}}function Od(a,b,c,d,e,g,h){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;g=g|0;h=h|0;var i=0;switch(c|0){case 1:{c=dn(60)|0;f[c>>2]=1528;f[c+4>>2]=d;h=c+8|0;f[h>>2]=f[e>>2];f[h+4>>2]=f[e+4>>2];f[h+8>>2]=f[e+8>>2];f[h+12>>2]=f[e+12>>2];f[h+16>>2]=f[e+16>>2];f[h+20>>2]=f[e+20>>2];_j(c+32|0,e+24|0);h=c+44|0;f[h>>2]=f[g>>2];f[h+4>>2]=f[g+4>>2];f[h+8>>2]=f[g+8>>2];f[h+12>>2]=f[g+12>>2];f[c>>2]=1640;i=c;f[a>>2]=i;return}case 4:{c=dn(168)|0;Hi(c,d,e,g);i=c;f[a>>2]=i;return}case 5:{c=dn(104)|0;f[c>>2]=1528;f[c+4>>2]=d;h=c+8|0;f[h>>2]=f[e>>2];f[h+4>>2]=f[e+4>>2];f[h+8>>2]=f[e+8>>2];f[h+12>>2]=f[e+12>>2];f[h+16>>2]=f[e+16>>2];f[h+20>>2]=f[e+20>>2];_j(c+32|0,e+24|0);h=c+44|0;f[h>>2]=f[g>>2];f[h+4>>2]=f[g+4>>2];f[h+8>>2]=f[g+8>>2];f[h+12>>2]=f[g+12>>2];f[c>>2]=1696;f[c+60>>2]=0;f[c+64>>2]=0;f[c+76>>2]=0;f[c+80>>2]=0;f[c+84>>2]=0;h=c+88|0;f[h>>2]=f[g>>2];f[h+4>>2]=f[g+4>>2];f[h+8>>2]=f[g+8>>2];f[h+12>>2]=f[g+12>>2];i=c;f[a>>2]=i;return}case 6:{c=dn(140)|0;f[c>>2]=1528;f[c+4>>2]=d;d=c+8|0;f[d>>2]=f[e>>2];f[d+4>>2]=f[e+4>>2];f[d+8>>2]=f[e+8>>2];f[d+12>>2]=f[e+12>>2];f[d+16>>2]=f[e+16>>2];f[d+20>>2]=f[e+20>>2];_j(c+32|0,e+24|0);e=c+44|0;f[e>>2]=f[g>>2];f[e+4>>2]=f[g+4>>2];f[e+8>>2]=f[g+8>>2];f[e+12>>2]=f[g+12>>2];f[c>>2]=1752;f[c+64>>2]=0;f[c+68>>2]=0;e=c+72|0;f[e>>2]=f[g>>2];f[e+4>>2]=f[g+4>>2];f[e+8>>2]=f[g+8>>2];f[e+12>>2]=f[g+12>>2];f[c+60>>2]=1808;f[c+88>>2]=1;g=c+92|0;f[g>>2]=-1;f[g+4>>2]=-1;f[g+8>>2]=-1;f[g+12>>2]=-1;rn(c+108|0);i=c;f[a>>2]=i;return}default:{i=0;f[a>>2]=i;return}}}function Pd(a,b,c,d,e,g,h){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;g=g|0;h=h|0;var i=0,j=0;switch(c|0){case 1:{c=dn(40)|0;f[c+4>>2]=d;h=c+8|0;f[h>>2]=f[e>>2];f[h+4>>2]=f[e+4>>2];f[h+8>>2]=f[e+8>>2];f[h+12>>2]=f[e+12>>2];h=c+24|0;f[h>>2]=f[g>>2];f[h+4>>2]=f[g+4>>2];f[h+8>>2]=f[g+8>>2];f[h+12>>2]=f[g+12>>2];f[c>>2]=2628;i=c;f[a>>2]=i;return}case 4:{c=dn(152)|0;f[c+4>>2]=d;h=c+8|0;f[h>>2]=f[e>>2];f[h+4>>2]=f[e+4>>2];f[h+8>>2]=f[e+8>>2];f[h+12>>2]=f[e+12>>2];h=c+24|0;f[h>>2]=f[g>>2];f[h+4>>2]=f[g+4>>2];f[h+8>>2]=f[g+8>>2];f[h+12>>2]=f[g+12>>2];f[c>>2]=2684;h=c+96|0;b=c+40|0;j=b+52|0;do{f[b>>2]=0;b=b+4|0}while((b|0)<(j|0));Sm(h);f[c+136>>2]=0;f[c+140>>2]=0;f[c+144>>2]=0;i=c;f[a>>2]=i;return}case 5:{c=dn(84)|0;f[c+4>>2]=d;h=c+8|0;f[h>>2]=f[e>>2];f[h+4>>2]=f[e+4>>2];f[h+8>>2]=f[e+8>>2];f[h+12>>2]=f[e+12>>2];h=c+24|0;f[h>>2]=f[g>>2];f[h+4>>2]=f[g+4>>2];f[h+8>>2]=f[g+8>>2];f[h+12>>2]=f[g+12>>2];f[c>>2]=2740;f[c+40>>2]=0;f[c+44>>2]=0;f[c+56>>2]=0;f[c+60>>2]=0;f[c+64>>2]=0;h=c+68|0;f[h>>2]=f[g>>2];f[h+4>>2]=f[g+4>>2];f[h+8>>2]=f[g+8>>2];f[h+12>>2]=f[g+12>>2];i=c;f[a>>2]=i;return}case 6:{c=dn(120)|0;f[c+4>>2]=d;d=c+8|0;f[d>>2]=f[e>>2];f[d+4>>2]=f[e+4>>2];f[d+8>>2]=f[e+8>>2];f[d+12>>2]=f[e+12>>2];e=c+24|0;f[e>>2]=f[g>>2];f[e+4>>2]=f[g+4>>2];f[e+8>>2]=f[g+8>>2];f[e+12>>2]=f[g+12>>2];f[c>>2]=2796;f[c+44>>2]=0;f[c+48>>2]=0;e=c+52|0;f[e>>2]=f[g>>2];f[e+4>>2]=f[g+4>>2];f[e+8>>2]=f[g+8>>2];f[e+12>>2]=f[g+12>>2];f[c+40>>2]=2852;f[c+68>>2]=1;g=c+72|0;f[g>>2]=-1;f[g+4>>2]=-1;f[g+8>>2]=-1;f[g+12>>2]=-1;rn(c+88|0);i=c;f[a>>2]=i;return}default:{i=0;f[a>>2]=i;return}}}function Qd(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0;switch(b-a>>2|0){case 2:{d=b+-4|0;e=f[d>>2]|0;g=f[a>>2]|0;h=f[c>>2]|0;i=f[h>>2]|0;j=(f[h+4>>2]|0)-i>>3;if(j>>>0<=e>>>0)mq(h);k=i;if(j>>>0<=g>>>0)mq(h);if((f[k+(e<<3)>>2]|0)>>>0>=(f[k+(g<<3)>>2]|0)>>>0){l=1;return l|0}f[a>>2]=e;f[d>>2]=g;l=1;return l|0}case 3:{Cg(a,a+4|0,b+-4|0,c)|0;l=1;return l|0}case 4:{Qg(a,a+4|0,a+8|0,b+-4|0,c)|0;l=1;return l|0}case 5:{Tf(a,a+4|0,a+8|0,a+12|0,b+-4|0,c)|0;l=1;return l|0}case 1:case 0:{l=1;return l|0}default:{g=a+8|0;Cg(a,a+4|0,g,c)|0;d=a+12|0;a:do if((d|0)!=(b|0)){e=f[c>>2]|0;k=f[e>>2]|0;h=(f[e+4>>2]|0)-k>>3;j=k;k=d;i=0;m=g;b:while(1){n=f[k>>2]|0;o=f[m>>2]|0;if(h>>>0<=n>>>0){p=14;break}if(h>>>0<=o>>>0){p=16;break}q=j+(n<<3)|0;if((f[q>>2]|0)>>>0<(f[j+(o<<3)>>2]|0)>>>0){r=m;s=k;t=o;while(1){f[s>>2]=t;if((r|0)==(a|0)){u=a;break}o=r+-4|0;t=f[o>>2]|0;if(h>>>0<=t>>>0){p=20;break b}if((f[q>>2]|0)>>>0>=(f[j+(t<<3)>>2]|0)>>>0){u=r;break}else{v=r;r=o;s=v}}f[u>>2]=n;s=i+1|0;if((s|0)==8){w=0;x=(k+4|0)==(b|0);break a}else y=s}else y=i;s=k+4|0;if((s|0)==(b|0)){w=1;x=0;break a}else{r=k;k=s;i=y;m=r}}if((p|0)==14)mq(e);else if((p|0)==16)mq(e);else if((p|0)==20)mq(e)}else{w=1;x=0}while(0);l=x|w;return l|0}}return 0}function Rd(a,b,c,d,e,g,h){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;g=g|0;h=h|0;var i=0,j=0;switch(c|0){case 1:{c=dn(40)|0;f[c+4>>2]=d;h=c+8|0;f[h>>2]=f[e>>2];f[h+4>>2]=f[e+4>>2];f[h+8>>2]=f[e+8>>2];f[h+12>>2]=f[e+12>>2];h=c+24|0;f[h>>2]=f[g>>2];f[h+4>>2]=f[g+4>>2];f[h+8>>2]=f[g+8>>2];f[h+12>>2]=f[g+12>>2];f[c>>2]=2376;i=c;f[a>>2]=i;return}case 4:{c=dn(152)|0;f[c+4>>2]=d;h=c+8|0;f[h>>2]=f[e>>2];f[h+4>>2]=f[e+4>>2];f[h+8>>2]=f[e+8>>2];f[h+12>>2]=f[e+12>>2];h=c+24|0;f[h>>2]=f[g>>2];f[h+4>>2]=f[g+4>>2];f[h+8>>2]=f[g+8>>2];f[h+12>>2]=f[g+12>>2];f[c>>2]=2432;h=c+96|0;b=c+40|0;j=b+52|0;do{f[b>>2]=0;b=b+4|0}while((b|0)<(j|0));Sm(h);f[c+136>>2]=0;f[c+140>>2]=0;f[c+144>>2]=0;i=c;f[a>>2]=i;return}case 5:{c=dn(84)|0;f[c+4>>2]=d;h=c+8|0;f[h>>2]=f[e>>2];f[h+4>>2]=f[e+4>>2];f[h+8>>2]=f[e+8>>2];f[h+12>>2]=f[e+12>>2];h=c+24|0;f[h>>2]=f[g>>2];f[h+4>>2]=f[g+4>>2];f[h+8>>2]=f[g+8>>2];f[h+12>>2]=f[g+12>>2];f[c>>2]=2488;f[c+40>>2]=0;f[c+44>>2]=0;f[c+56>>2]=0;f[c+60>>2]=0;f[c+64>>2]=0;h=c+68|0;f[h>>2]=f[g>>2];f[h+4>>2]=f[g+4>>2];f[h+8>>2]=f[g+8>>2];f[h+12>>2]=f[g+12>>2];i=c;f[a>>2]=i;return}case 6:{c=dn(120)|0;f[c+4>>2]=d;d=c+8|0;f[d>>2]=f[e>>2];f[d+4>>2]=f[e+4>>2];f[d+8>>2]=f[e+8>>2];f[d+12>>2]=f[e+12>>2];e=c+24|0;f[e>>2]=f[g>>2];f[e+4>>2]=f[g+4>>2];f[e+8>>2]=f[g+8>>2];f[e+12>>2]=f[g+12>>2];f[c>>2]=2544;f[c+44>>2]=0;f[c+48>>2]=0;e=c+52|0;f[e>>2]=f[g>>2];f[e+4>>2]=f[g+4>>2];f[e+8>>2]=f[g+8>>2];f[e+12>>2]=f[g+12>>2];f[c+40>>2]=2600;f[c+68>>2]=1;g=c+72|0;f[g>>2]=-1;f[g+4>>2]=-1;f[g+8>>2]=-1;f[g+12>>2]=-1;rn(c+88|0);i=c;f[a>>2]=i;return}default:{i=0;f[a>>2]=i;return}}}function Sd(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,o=0,p=0,q=0,r=0,s=Oa,t=Oa,u=Oa,v=0,w=0,x=0,y=0,z=0;c=f[b>>2]|0;b=a+4|0;d=f[b>>2]|0;e=(d|0)==0;a:do if(!e){g=d+-1|0;h=(g&d|0)==0;if(!h)if(c>>>0<d>>>0)i=c;else i=(c>>>0)%(d>>>0)|0;else i=g&c;j=f[(f[a>>2]|0)+(i<<2)>>2]|0;if(!j)k=i;else{if(h){h=j;while(1){l=f[h>>2]|0;if(!l){k=i;break a}m=f[l+4>>2]|0;if(!((m|0)==(c|0)|(m&g|0)==(i|0))){k=i;break a}if((f[l+8>>2]|0)==(c|0)){o=l;break}else h=l}p=o+12|0;return p|0}else q=j;while(1){h=f[q>>2]|0;if(!h){k=i;break a}g=f[h+4>>2]|0;if((g|0)!=(c|0)){if(g>>>0<d>>>0)r=g;else r=(g>>>0)%(d>>>0)|0;if((r|0)!=(i|0)){k=i;break a}}if((f[h+8>>2]|0)==(c|0)){o=h;break}else q=h}p=o+12|0;return p|0}}else k=0;while(0);q=dn(16)|0;f[q+8>>2]=c;f[q+12>>2]=0;f[q+4>>2]=c;f[q>>2]=0;i=a+12|0;s=$(((f[i>>2]|0)+1|0)>>>0);t=$(d>>>0);u=$(n[a+16>>2]);do if(e|$(u*t)<s){r=d<<1|(d>>>0<3|(d+-1&d|0)!=0)&1;j=~~$(W($(s/u)))>>>0;ti(a,r>>>0<j>>>0?j:r);r=f[b>>2]|0;j=r+-1|0;if(!(j&r)){v=r;w=j&c;break}if(c>>>0<r>>>0){v=r;w=c}else{v=r;w=(c>>>0)%(r>>>0)|0}}else{v=d;w=k}while(0);k=(f[a>>2]|0)+(w<<2)|0;w=f[k>>2]|0;if(!w){d=a+8|0;f[q>>2]=f[d>>2];f[d>>2]=q;f[k>>2]=d;d=f[q>>2]|0;if(d|0){k=f[d+4>>2]|0;d=v+-1|0;if(d&v)if(k>>>0<v>>>0)x=k;else x=(k>>>0)%(v>>>0)|0;else x=k&d;y=(f[a>>2]|0)+(x<<2)|0;z=30}}else{f[q>>2]=f[w>>2];y=w;z=30}if((z|0)==30)f[y>>2]=q;f[i>>2]=(f[i>>2]|0)+1;o=q;p=o+12|0;return p|0}function Td(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0;c=u;u=u+16|0;d=c+4|0;e=c;f[a+64>>2]=b;g=a+128|0;f[g>>2]=2;h=a+132|0;f[h>>2]=7;i=Qa[f[(f[b>>2]|0)+32>>2]&127](b)|0;b=a+88|0;f[b>>2]=i;j=a+104|0;k=(f[i+28>>2]|0)-(f[i+24>>2]|0)>>2;i=a+108|0;l=f[i>>2]|0;m=f[j>>2]|0;n=l-m>>2;o=m;p=l;if(k>>>0<=n>>>0)if(k>>>0<n>>>0?(q=o+(k<<2)|0,(q|0)!=(p|0)):0){o=p+(~((p+-4-q|0)>>>2)<<2)|0;f[i>>2]=o;r=o;s=m}else{r=l;s=m}else{oi(j,k-n|0);r=f[i>>2]|0;s=f[j>>2]|0}if((r|0)!=(s|0)){s=0;do{r=f[b>>2]|0;f[e>>2]=s;f[d>>2]=f[e>>2];n=Og(r,d)|0;r=f[j>>2]|0;f[r+(s<<2)>>2]=n;s=s+1|0}while(s>>>0<(f[i>>2]|0)-r>>2>>>0)}i=a+92|0;s=f[b>>2]|0;j=f[s>>2]|0;d=(f[s+4>>2]|0)-j>>2;e=a+96|0;r=f[e>>2]|0;n=f[i>>2]|0;k=r-n>>2;m=n;n=r;if(d>>>0<=k>>>0)if(d>>>0<k>>>0?(r=m+(d<<2)|0,(r|0)!=(n|0)):0){f[e>>2]=n+(~((n+-4-r|0)>>>2)<<2);t=s;v=j}else{t=s;v=j}else{oi(i,d-k|0);k=f[b>>2]|0;t=k;v=f[k>>2]|0}k=f[t+4>>2]|0;if((k|0)!=(v|0)){v=f[i>>2]|0;i=f[t>>2]|0;t=k-i>>2;k=0;do{f[v+(k<<2)>>2]=f[i+(k<<2)>>2];k=k+1|0}while(k>>>0<t>>>0)}t=(f[h>>2]|0)-(f[g>>2]|0)+1|0;g=a+136|0;h=a+140|0;a=f[h>>2]|0;k=f[g>>2]|0;i=(a-k|0)/12|0;v=a;if(t>>>0>i>>>0){vf(g,t-i|0);u=c;return 1}if(t>>>0>=i>>>0){u=c;return 1}i=k+(t*12|0)|0;if((i|0)==(v|0)){u=c;return 1}else w=v;while(1){v=w+-12|0;f[h>>2]=v;t=f[v>>2]|0;if(!t)x=v;else{v=w+-8|0;k=f[v>>2]|0;if((k|0)!=(t|0))f[v>>2]=k+(~((k+-4-t|0)>>>2)<<2);br(t);x=f[h>>2]|0}if((x|0)==(i|0))break;else w=x}u=c;return 1}function Ud(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0;g=u;u=u+64|0;h=g+48|0;i=g;j=d+1|0;f[h>>2]=0;k=h+4|0;f[k>>2]=0;f[h+8>>2]=0;do if(j)if(j>>>0>536870911)mq(h);else{l=dn(j<<3)|0;f[h>>2]=l;m=l+(j<<3)|0;f[h+8>>2]=m;hj(l|0,0,(d<<3)+8|0)|0;f[k>>2]=m;n=l;o=m;break}else{n=0;o=0}while(0);d=(c|0)>0;if(d){j=0;do{m=n+(f[a+(j<<2)>>2]<<3)|0;l=m;p=Tn(f[l>>2]|0,f[l+4>>2]|0,1,0)|0;l=m;f[l>>2]=p;f[l+4>>2]=I;j=j+1|0}while((j|0)!=(c|0))}j=i+40|0;l=j;f[l>>2]=0;f[l+4>>2]=0;l=i;p=l+36|0;do{f[l>>2]=0;l=l+4|0}while((l|0)<(p|0));Oc(i,n,o-n>>3,e)|0;n=i+16|0;o=Rn(f[n>>2]|0,f[n+4>>2]|0,1)|0;n=(f[e+4>>2]|0)-(f[e>>2]|0)|0;l=j;f[l>>2]=n;f[l+4>>2]=0;l=Tn(o|0,I|0,39,0)|0;o=Wn(l|0,I|0,3)|0;l=Tn(o|0,I|0,8,0)|0;o=Tn(l|0,I|0,n|0,0)|0;vl(e,o,I);o=i+24|0;f[o>>2]=(f[e>>2]|0)+(f[j>>2]|0);j=i+28|0;f[j>>2]=0;n=i+32|0;f[n>>2]=4194304;if(d){d=c;c=4194304;do{l=d;d=d+-1|0;p=f[a+(d<<2)>>2]|0;m=f[i>>2]|0;q=f[m+(p<<3)>>2]|0;r=q<<10;if(c>>>0<r>>>0)s=c;else{t=c;while(1){v=f[o>>2]|0;w=f[j>>2]|0;f[j>>2]=w+1;b[v+w>>0]=t;w=(f[n>>2]|0)>>>8;f[n>>2]=w;if(w>>>0<r>>>0){s=w;break}else t=w}}c=(((s>>>0)/(q>>>0)|0)<<20)+((s>>>0)%(q>>>0)|0)+(f[m+(p<<3)+4>>2]|0)|0;f[n>>2]=c}while((l|0)>1)}xf(i,e);e=f[i>>2]|0;if(e|0){c=i+4|0;i=f[c>>2]|0;if((i|0)!=(e|0))f[c>>2]=i+(~((i+-8-e|0)>>>3)<<3);br(e)}e=f[h>>2]|0;if(!e){u=g;return 1}h=f[k>>2]|0;if((h|0)!=(e|0))f[k>>2]=h+(~((h+-8-e|0)>>>3)<<3);br(e);u=g;return 1}function Vd(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0;g=u;u=u+64|0;h=g+48|0;i=g;j=d+1|0;f[h>>2]=0;k=h+4|0;f[k>>2]=0;f[h+8>>2]=0;do if(j)if(j>>>0>536870911)mq(h);else{l=dn(j<<3)|0;f[h>>2]=l;m=l+(j<<3)|0;f[h+8>>2]=m;hj(l|0,0,(d<<3)+8|0)|0;f[k>>2]=m;n=l;o=m;break}else{n=0;o=0}while(0);d=(c|0)>0;if(d){j=0;do{m=n+(f[a+(j<<2)>>2]<<3)|0;l=m;p=Tn(f[l>>2]|0,f[l+4>>2]|0,1,0)|0;l=m;f[l>>2]=p;f[l+4>>2]=I;j=j+1|0}while((j|0)!=(c|0))}j=i+40|0;l=j;f[l>>2]=0;f[l+4>>2]=0;l=i;p=l+36|0;do{f[l>>2]=0;l=l+4|0}while((l|0)<(p|0));Pc(i,n,o-n>>3,e)|0;n=i+16|0;o=Rn(f[n>>2]|0,f[n+4>>2]|0,1)|0;n=(f[e+4>>2]|0)-(f[e>>2]|0)|0;l=j;f[l>>2]=n;f[l+4>>2]=0;l=Tn(o|0,I|0,39,0)|0;o=Wn(l|0,I|0,3)|0;l=Tn(o|0,I|0,8,0)|0;o=Tn(l|0,I|0,n|0,0)|0;vl(e,o,I);o=i+24|0;f[o>>2]=(f[e>>2]|0)+(f[j>>2]|0);j=i+28|0;f[j>>2]=0;n=i+32|0;f[n>>2]=4194304;if(d){d=c;c=4194304;do{l=d;d=d+-1|0;p=f[a+(d<<2)>>2]|0;m=f[i>>2]|0;q=f[m+(p<<3)>>2]|0;r=q<<10;if(c>>>0<r>>>0)s=c;else{t=c;while(1){v=f[o>>2]|0;w=f[j>>2]|0;f[j>>2]=w+1;b[v+w>>0]=t;w=(f[n>>2]|0)>>>8;f[n>>2]=w;if(w>>>0<r>>>0){s=w;break}else t=w}}c=(((s>>>0)/(q>>>0)|0)<<20)+((s>>>0)%(q>>>0)|0)+(f[m+(p<<3)+4>>2]|0)|0;f[n>>2]=c}while((l|0)>1)}xf(i,e);e=f[i>>2]|0;if(e|0){c=i+4|0;i=f[c>>2]|0;if((i|0)!=(e|0))f[c>>2]=i+(~((i+-8-e|0)>>>3)<<3);br(e)}e=f[h>>2]|0;if(!e){u=g;return 1}h=f[k>>2]|0;if((h|0)!=(e|0))f[k>>2]=h+(~((h+-8-e|0)>>>3)<<3);br(e);u=g;return 1}function Wd(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0;g=u;u=u+64|0;h=g+48|0;i=g;j=d+1|0;f[h>>2]=0;k=h+4|0;f[k>>2]=0;f[h+8>>2]=0;do if(j)if(j>>>0>536870911)mq(h);else{l=dn(j<<3)|0;f[h>>2]=l;m=l+(j<<3)|0;f[h+8>>2]=m;hj(l|0,0,(d<<3)+8|0)|0;f[k>>2]=m;n=l;o=m;break}else{n=0;o=0}while(0);d=(c|0)>0;if(d){j=0;do{m=n+(f[a+(j<<2)>>2]<<3)|0;l=m;p=Tn(f[l>>2]|0,f[l+4>>2]|0,1,0)|0;l=m;f[l>>2]=p;f[l+4>>2]=I;j=j+1|0}while((j|0)!=(c|0))}j=i+40|0;l=j;f[l>>2]=0;f[l+4>>2]=0;l=i;p=l+36|0;do{f[l>>2]=0;l=l+4|0}while((l|0)<(p|0));Qc(i,n,o-n>>3,e)|0;n=i+16|0;o=Rn(f[n>>2]|0,f[n+4>>2]|0,1)|0;n=(f[e+4>>2]|0)-(f[e>>2]|0)|0;l=j;f[l>>2]=n;f[l+4>>2]=0;l=Tn(o|0,I|0,39,0)|0;o=Wn(l|0,I|0,3)|0;l=Tn(o|0,I|0,8,0)|0;o=Tn(l|0,I|0,n|0,0)|0;vl(e,o,I);o=i+24|0;f[o>>2]=(f[e>>2]|0)+(f[j>>2]|0);j=i+28|0;f[j>>2]=0;n=i+32|0;f[n>>2]=4194304;if(d){d=c;c=4194304;do{l=d;d=d+-1|0;p=f[a+(d<<2)>>2]|0;m=f[i>>2]|0;q=f[m+(p<<3)>>2]|0;r=q<<10;if(c>>>0<r>>>0)s=c;else{t=c;while(1){v=f[o>>2]|0;w=f[j>>2]|0;f[j>>2]=w+1;b[v+w>>0]=t;w=(f[n>>2]|0)>>>8;f[n>>2]=w;if(w>>>0<r>>>0){s=w;break}else t=w}}c=(((s>>>0)/(q>>>0)|0)<<20)+((s>>>0)%(q>>>0)|0)+(f[m+(p<<3)+4>>2]|0)|0;f[n>>2]=c}while((l|0)>1)}xf(i,e);e=f[i>>2]|0;if(e|0){c=i+4|0;i=f[c>>2]|0;if((i|0)!=(e|0))f[c>>2]=i+(~((i+-8-e|0)>>>3)<<3);br(e)}e=f[h>>2]|0;if(!e){u=g;return 1}h=f[k>>2]|0;if((h|0)!=(e|0))f[k>>2]=h+(~((h+-8-e|0)>>>3)<<3);br(e);u=g;return 1}function Xd(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0;g=u;u=u+64|0;h=g+48|0;i=g;j=d+1|0;f[h>>2]=0;k=h+4|0;f[k>>2]=0;f[h+8>>2]=0;do if(j)if(j>>>0>536870911)mq(h);else{l=dn(j<<3)|0;f[h>>2]=l;m=l+(j<<3)|0;f[h+8>>2]=m;hj(l|0,0,(d<<3)+8|0)|0;f[k>>2]=m;n=l;o=m;break}else{n=0;o=0}while(0);d=(c|0)>0;if(d){j=0;do{m=n+(f[a+(j<<2)>>2]<<3)|0;l=m;p=Tn(f[l>>2]|0,f[l+4>>2]|0,1,0)|0;l=m;f[l>>2]=p;f[l+4>>2]=I;j=j+1|0}while((j|0)!=(c|0))}j=i+40|0;l=j;f[l>>2]=0;f[l+4>>2]=0;l=i;p=l+36|0;do{f[l>>2]=0;l=l+4|0}while((l|0)<(p|0));Rc(i,n,o-n>>3,e)|0;n=i+16|0;o=Rn(f[n>>2]|0,f[n+4>>2]|0,1)|0;n=(f[e+4>>2]|0)-(f[e>>2]|0)|0;l=j;f[l>>2]=n;f[l+4>>2]=0;l=Tn(o|0,I|0,39,0)|0;o=Wn(l|0,I|0,3)|0;l=Tn(o|0,I|0,8,0)|0;o=Tn(l|0,I|0,n|0,0)|0;vl(e,o,I);o=i+24|0;f[o>>2]=(f[e>>2]|0)+(f[j>>2]|0);j=i+28|0;f[j>>2]=0;n=i+32|0;f[n>>2]=4194304;if(d){d=c;c=4194304;do{l=d;d=d+-1|0;p=f[a+(d<<2)>>2]|0;m=f[i>>2]|0;q=f[m+(p<<3)>>2]|0;r=q<<10;if(c>>>0<r>>>0)s=c;else{t=c;while(1){v=f[o>>2]|0;w=f[j>>2]|0;f[j>>2]=w+1;b[v+w>>0]=t;w=(f[n>>2]|0)>>>8;f[n>>2]=w;if(w>>>0<r>>>0){s=w;break}else t=w}}c=(((s>>>0)/(q>>>0)|0)<<20)+((s>>>0)%(q>>>0)|0)+(f[m+(p<<3)+4>>2]|0)|0;f[n>>2]=c}while((l|0)>1)}xf(i,e);e=f[i>>2]|0;if(e|0){c=i+4|0;i=f[c>>2]|0;if((i|0)!=(e|0))f[c>>2]=i+(~((i+-8-e|0)>>>3)<<3);br(e)}e=f[h>>2]|0;if(!e){u=g;return 1}h=f[k>>2]|0;if((h|0)!=(e|0))f[k>>2]=h+(~((h+-8-e|0)>>>3)<<3);br(e);u=g;return 1}function Yd(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0;g=u;u=u+64|0;h=g+48|0;i=g;j=d+1|0;f[h>>2]=0;k=h+4|0;f[k>>2]=0;f[h+8>>2]=0;do if(j)if(j>>>0>536870911)mq(h);else{l=dn(j<<3)|0;f[h>>2]=l;m=l+(j<<3)|0;f[h+8>>2]=m;hj(l|0,0,(d<<3)+8|0)|0;f[k>>2]=m;n=l;o=m;break}else{n=0;o=0}while(0);d=(c|0)>0;if(d){j=0;do{m=n+(f[a+(j<<2)>>2]<<3)|0;l=m;p=Tn(f[l>>2]|0,f[l+4>>2]|0,1,0)|0;l=m;f[l>>2]=p;f[l+4>>2]=I;j=j+1|0}while((j|0)!=(c|0))}j=i+40|0;l=j;f[l>>2]=0;f[l+4>>2]=0;l=i;p=l+36|0;do{f[l>>2]=0;l=l+4|0}while((l|0)<(p|0));Sc(i,n,o-n>>3,e)|0;n=i+16|0;o=Rn(f[n>>2]|0,f[n+4>>2]|0,1)|0;n=(f[e+4>>2]|0)-(f[e>>2]|0)|0;l=j;f[l>>2]=n;f[l+4>>2]=0;l=Tn(o|0,I|0,39,0)|0;o=Wn(l|0,I|0,3)|0;l=Tn(o|0,I|0,8,0)|0;o=Tn(l|0,I|0,n|0,0)|0;vl(e,o,I);o=i+24|0;f[o>>2]=(f[e>>2]|0)+(f[j>>2]|0);j=i+28|0;f[j>>2]=0;n=i+32|0;f[n>>2]=4194304;if(d){d=c;c=4194304;do{l=d;d=d+-1|0;p=f[a+(d<<2)>>2]|0;m=f[i>>2]|0;q=f[m+(p<<3)>>2]|0;r=q<<10;if(c>>>0<r>>>0)s=c;else{t=c;while(1){v=f[o>>2]|0;w=f[j>>2]|0;f[j>>2]=w+1;b[v+w>>0]=t;w=(f[n>>2]|0)>>>8;f[n>>2]=w;if(w>>>0<r>>>0){s=w;break}else t=w}}c=(((s>>>0)/(q>>>0)|0)<<20)+((s>>>0)%(q>>>0)|0)+(f[m+(p<<3)+4>>2]|0)|0;f[n>>2]=c}while((l|0)>1)}xf(i,e);e=f[i>>2]|0;if(e|0){c=i+4|0;i=f[c>>2]|0;if((i|0)!=(e|0))f[c>>2]=i+(~((i+-8-e|0)>>>3)<<3);br(e)}e=f[h>>2]|0;if(!e){u=g;return 1}h=f[k>>2]|0;if((h|0)!=(e|0))f[k>>2]=h+(~((h+-8-e|0)>>>3)<<3);br(e);u=g;return 1}function Zd(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0;g=u;u=u+64|0;h=g+48|0;i=g;j=d+1|0;f[h>>2]=0;k=h+4|0;f[k>>2]=0;f[h+8>>2]=0;do if(j)if(j>>>0>536870911)mq(h);else{l=dn(j<<3)|0;f[h>>2]=l;m=l+(j<<3)|0;f[h+8>>2]=m;hj(l|0,0,(d<<3)+8|0)|0;f[k>>2]=m;n=l;o=m;break}else{n=0;o=0}while(0);d=(c|0)>0;if(d){j=0;do{m=n+(f[a+(j<<2)>>2]<<3)|0;l=m;p=Tn(f[l>>2]|0,f[l+4>>2]|0,1,0)|0;l=m;f[l>>2]=p;f[l+4>>2]=I;j=j+1|0}while((j|0)!=(c|0))}j=i+40|0;l=j;f[l>>2]=0;f[l+4>>2]=0;l=i;p=l+36|0;do{f[l>>2]=0;l=l+4|0}while((l|0)<(p|0));Tc(i,n,o-n>>3,e)|0;n=i+16|0;o=Rn(f[n>>2]|0,f[n+4>>2]|0,1)|0;n=(f[e+4>>2]|0)-(f[e>>2]|0)|0;l=j;f[l>>2]=n;f[l+4>>2]=0;l=Tn(o|0,I|0,39,0)|0;o=Wn(l|0,I|0,3)|0;l=Tn(o|0,I|0,8,0)|0;o=Tn(l|0,I|0,n|0,0)|0;vl(e,o,I);o=i+24|0;f[o>>2]=(f[e>>2]|0)+(f[j>>2]|0);j=i+28|0;f[j>>2]=0;n=i+32|0;f[n>>2]=2097152;if(d){d=c;c=2097152;do{l=d;d=d+-1|0;p=f[a+(d<<2)>>2]|0;m=f[i>>2]|0;q=f[m+(p<<3)>>2]|0;r=q<<10;if(c>>>0<r>>>0)s=c;else{t=c;while(1){v=f[o>>2]|0;w=f[j>>2]|0;f[j>>2]=w+1;b[v+w>>0]=t;w=(f[n>>2]|0)>>>8;f[n>>2]=w;if(w>>>0<r>>>0){s=w;break}else t=w}}c=(((s>>>0)/(q>>>0)|0)<<19)+((s>>>0)%(q>>>0)|0)+(f[m+(p<<3)+4>>2]|0)|0;f[n>>2]=c}while((l|0)>1)}yf(i,e);e=f[i>>2]|0;if(e|0){c=i+4|0;i=f[c>>2]|0;if((i|0)!=(e|0))f[c>>2]=i+(~((i+-8-e|0)>>>3)<<3);br(e)}e=f[h>>2]|0;if(!e){u=g;return 1}h=f[k>>2]|0;if((h|0)!=(e|0))f[k>>2]=h+(~((h+-8-e|0)>>>3)<<3);br(e);u=g;return 1}function _d(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0;g=u;u=u+64|0;h=g+48|0;i=g;j=d+1|0;f[h>>2]=0;k=h+4|0;f[k>>2]=0;f[h+8>>2]=0;do if(j)if(j>>>0>536870911)mq(h);else{l=dn(j<<3)|0;f[h>>2]=l;m=l+(j<<3)|0;f[h+8>>2]=m;hj(l|0,0,(d<<3)+8|0)|0;f[k>>2]=m;n=l;o=m;break}else{n=0;o=0}while(0);d=(c|0)>0;if(d){j=0;do{m=n+(f[a+(j<<2)>>2]<<3)|0;l=m;p=Tn(f[l>>2]|0,f[l+4>>2]|0,1,0)|0;l=m;f[l>>2]=p;f[l+4>>2]=I;j=j+1|0}while((j|0)!=(c|0))}j=i+40|0;l=j;f[l>>2]=0;f[l+4>>2]=0;l=i;p=l+36|0;do{f[l>>2]=0;l=l+4|0}while((l|0)<(p|0));Uc(i,n,o-n>>3,e)|0;n=i+16|0;o=Rn(f[n>>2]|0,f[n+4>>2]|0,1)|0;n=(f[e+4>>2]|0)-(f[e>>2]|0)|0;l=j;f[l>>2]=n;f[l+4>>2]=0;l=Tn(o|0,I|0,39,0)|0;o=Wn(l|0,I|0,3)|0;l=Tn(o|0,I|0,8,0)|0;o=Tn(l|0,I|0,n|0,0)|0;vl(e,o,I);o=i+24|0;f[o>>2]=(f[e>>2]|0)+(f[j>>2]|0);j=i+28|0;f[j>>2]=0;n=i+32|0;f[n>>2]=1048576;if(d){d=c;c=1048576;do{l=d;d=d+-1|0;p=f[a+(d<<2)>>2]|0;m=f[i>>2]|0;q=f[m+(p<<3)>>2]|0;r=q<<10;if(c>>>0<r>>>0)s=c;else{t=c;while(1){v=f[o>>2]|0;w=f[j>>2]|0;f[j>>2]=w+1;b[v+w>>0]=t;w=(f[n>>2]|0)>>>8;f[n>>2]=w;if(w>>>0<r>>>0){s=w;break}else t=w}}c=(((s>>>0)/(q>>>0)|0)<<18)+((s>>>0)%(q>>>0)|0)+(f[m+(p<<3)+4>>2]|0)|0;f[n>>2]=c}while((l|0)>1)}zf(i,e);e=f[i>>2]|0;if(e|0){c=i+4|0;i=f[c>>2]|0;if((i|0)!=(e|0))f[c>>2]=i+(~((i+-8-e|0)>>>3)<<3);br(e)}e=f[h>>2]|0;if(!e){u=g;return 1}h=f[k>>2]|0;if((h|0)!=(e|0))f[k>>2]=h+(~((h+-8-e|0)>>>3)<<3);br(e);u=g;return 1}function $d(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0;g=u;u=u+64|0;h=g+48|0;i=g;j=d+1|0;f[h>>2]=0;k=h+4|0;f[k>>2]=0;f[h+8>>2]=0;do if(j)if(j>>>0>536870911)mq(h);else{l=dn(j<<3)|0;f[h>>2]=l;m=l+(j<<3)|0;f[h+8>>2]=m;hj(l|0,0,(d<<3)+8|0)|0;f[k>>2]=m;n=l;o=m;break}else{n=0;o=0}while(0);d=(c|0)>0;if(d){j=0;do{m=n+(f[a+(j<<2)>>2]<<3)|0;l=m;p=Tn(f[l>>2]|0,f[l+4>>2]|0,1,0)|0;l=m;f[l>>2]=p;f[l+4>>2]=I;j=j+1|0}while((j|0)!=(c|0))}j=i+40|0;l=j;f[l>>2]=0;f[l+4>>2]=0;l=i;p=l+36|0;do{f[l>>2]=0;l=l+4|0}while((l|0)<(p|0));Vc(i,n,o-n>>3,e)|0;n=i+16|0;o=Rn(f[n>>2]|0,f[n+4>>2]|0,1)|0;n=(f[e+4>>2]|0)-(f[e>>2]|0)|0;l=j;f[l>>2]=n;f[l+4>>2]=0;l=Tn(o|0,I|0,39,0)|0;o=Wn(l|0,I|0,3)|0;l=Tn(o|0,I|0,8,0)|0;o=Tn(l|0,I|0,n|0,0)|0;vl(e,o,I);o=i+24|0;f[o>>2]=(f[e>>2]|0)+(f[j>>2]|0);j=i+28|0;f[j>>2]=0;n=i+32|0;f[n>>2]=262144;if(d){d=c;c=262144;do{l=d;d=d+-1|0;p=f[a+(d<<2)>>2]|0;m=f[i>>2]|0;q=f[m+(p<<3)>>2]|0;r=q<<10;if(c>>>0<r>>>0)s=c;else{t=c;while(1){v=f[o>>2]|0;w=f[j>>2]|0;f[j>>2]=w+1;b[v+w>>0]=t;w=(f[n>>2]|0)>>>8;f[n>>2]=w;if(w>>>0<r>>>0){s=w;break}else t=w}}c=(((s>>>0)/(q>>>0)|0)<<16)+((s>>>0)%(q>>>0)|0)+(f[m+(p<<3)+4>>2]|0)|0;f[n>>2]=c}while((l|0)>1)}Cf(i,e);e=f[i>>2]|0;if(e|0){c=i+4|0;i=f[c>>2]|0;if((i|0)!=(e|0))f[c>>2]=i+(~((i+-8-e|0)>>>3)<<3);br(e)}e=f[h>>2]|0;if(!e){u=g;return 1}h=f[k>>2]|0;if((h|0)!=(e|0))f[k>>2]=h+(~((h+-8-e|0)>>>3)<<3);br(e);u=g;return 1}function ae(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0;g=u;u=u+64|0;h=g+48|0;i=g;j=d+1|0;f[h>>2]=0;k=h+4|0;f[k>>2]=0;f[h+8>>2]=0;do if(j)if(j>>>0>536870911)mq(h);else{l=dn(j<<3)|0;f[h>>2]=l;m=l+(j<<3)|0;f[h+8>>2]=m;hj(l|0,0,(d<<3)+8|0)|0;f[k>>2]=m;n=l;o=m;break}else{n=0;o=0}while(0);d=(c|0)>0;if(d){j=0;do{m=n+(f[a+(j<<2)>>2]<<3)|0;l=m;p=Tn(f[l>>2]|0,f[l+4>>2]|0,1,0)|0;l=m;f[l>>2]=p;f[l+4>>2]=I;j=j+1|0}while((j|0)!=(c|0))}j=i+40|0;l=j;f[l>>2]=0;f[l+4>>2]=0;l=i;p=l+36|0;do{f[l>>2]=0;l=l+4|0}while((l|0)<(p|0));Wc(i,n,o-n>>3,e)|0;n=i+16|0;o=Rn(f[n>>2]|0,f[n+4>>2]|0,1)|0;n=(f[e+4>>2]|0)-(f[e>>2]|0)|0;l=j;f[l>>2]=n;f[l+4>>2]=0;l=Tn(o|0,I|0,39,0)|0;o=Wn(l|0,I|0,3)|0;l=Tn(o|0,I|0,8,0)|0;o=Tn(l|0,I|0,n|0,0)|0;vl(e,o,I);o=i+24|0;f[o>>2]=(f[e>>2]|0)+(f[j>>2]|0);j=i+28|0;f[j>>2]=0;n=i+32|0;f[n>>2]=131072;if(d){d=c;c=131072;do{l=d;d=d+-1|0;p=f[a+(d<<2)>>2]|0;m=f[i>>2]|0;q=f[m+(p<<3)>>2]|0;r=q<<10;if(c>>>0<r>>>0)s=c;else{t=c;while(1){v=f[o>>2]|0;w=f[j>>2]|0;f[j>>2]=w+1;b[v+w>>0]=t;w=(f[n>>2]|0)>>>8;f[n>>2]=w;if(w>>>0<r>>>0){s=w;break}else t=w}}c=(((s>>>0)/(q>>>0)|0)<<15)+((s>>>0)%(q>>>0)|0)+(f[m+(p<<3)+4>>2]|0)|0;f[n>>2]=c}while((l|0)>1)}Df(i,e);e=f[i>>2]|0;if(e|0){c=i+4|0;i=f[c>>2]|0;if((i|0)!=(e|0))f[c>>2]=i+(~((i+-8-e|0)>>>3)<<3);br(e)}e=f[h>>2]|0;if(!e){u=g;return 1}h=f[k>>2]|0;if((h|0)!=(e|0))f[k>>2]=h+(~((h+-8-e|0)>>>3)<<3);br(e);u=g;return 1}function be(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0;g=u;u=u+64|0;h=g+48|0;i=g;j=d+1|0;f[h>>2]=0;k=h+4|0;f[k>>2]=0;f[h+8>>2]=0;do if(j)if(j>>>0>536870911)mq(h);else{l=dn(j<<3)|0;f[h>>2]=l;m=l+(j<<3)|0;f[h+8>>2]=m;hj(l|0,0,(d<<3)+8|0)|0;f[k>>2]=m;n=l;o=m;break}else{n=0;o=0}while(0);d=(c|0)>0;if(d){j=0;do{m=n+(f[a+(j<<2)>>2]<<3)|0;l=m;p=Tn(f[l>>2]|0,f[l+4>>2]|0,1,0)|0;l=m;f[l>>2]=p;f[l+4>>2]=I;j=j+1|0}while((j|0)!=(c|0))}j=i+40|0;l=j;f[l>>2]=0;f[l+4>>2]=0;l=i;p=l+36|0;do{f[l>>2]=0;l=l+4|0}while((l|0)<(p|0));Xc(i,n,o-n>>3,e)|0;n=i+16|0;o=Rn(f[n>>2]|0,f[n+4>>2]|0,1)|0;n=(f[e+4>>2]|0)-(f[e>>2]|0)|0;l=j;f[l>>2]=n;f[l+4>>2]=0;l=Tn(o|0,I|0,39,0)|0;o=Wn(l|0,I|0,3)|0;l=Tn(o|0,I|0,8,0)|0;o=Tn(l|0,I|0,n|0,0)|0;vl(e,o,I);o=i+24|0;f[o>>2]=(f[e>>2]|0)+(f[j>>2]|0);j=i+28|0;f[j>>2]=0;n=i+32|0;f[n>>2]=32768;if(d){d=c;c=32768;do{l=d;d=d+-1|0;p=f[a+(d<<2)>>2]|0;m=f[i>>2]|0;q=f[m+(p<<3)>>2]|0;r=q<<10;if(c>>>0<r>>>0)s=c;else{t=c;while(1){v=f[o>>2]|0;w=f[j>>2]|0;f[j>>2]=w+1;b[v+w>>0]=t;w=(f[n>>2]|0)>>>8;f[n>>2]=w;if(w>>>0<r>>>0){s=w;break}else t=w}}c=(((s>>>0)/(q>>>0)|0)<<13)+((s>>>0)%(q>>>0)|0)+(f[m+(p<<3)+4>>2]|0)|0;f[n>>2]=c}while((l|0)>1)}Ef(i,e);e=f[i>>2]|0;if(e|0){c=i+4|0;i=f[c>>2]|0;if((i|0)!=(e|0))f[c>>2]=i+(~((i+-8-e|0)>>>3)<<3);br(e)}e=f[h>>2]|0;if(!e){u=g;return 1}h=f[k>>2]|0;if((h|0)!=(e|0))f[k>>2]=h+(~((h+-8-e|0)>>>3)<<3);br(e);u=g;return 1}function ce(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0;g=u;u=u+64|0;h=g+48|0;i=g;j=d+1|0;f[h>>2]=0;k=h+4|0;f[k>>2]=0;f[h+8>>2]=0;do if(j)if(j>>>0>536870911)mq(h);else{l=dn(j<<3)|0;f[h>>2]=l;m=l+(j<<3)|0;f[h+8>>2]=m;hj(l|0,0,(d<<3)+8|0)|0;f[k>>2]=m;n=l;o=m;break}else{n=0;o=0}while(0);d=(c|0)>0;if(d){j=0;do{m=n+(f[a+(j<<2)>>2]<<3)|0;l=m;p=Tn(f[l>>2]|0,f[l+4>>2]|0,1,0)|0;l=m;f[l>>2]=p;f[l+4>>2]=I;j=j+1|0}while((j|0)!=(c|0))}j=i+40|0;l=j;f[l>>2]=0;f[l+4>>2]=0;l=i;p=l+36|0;do{f[l>>2]=0;l=l+4|0}while((l|0)<(p|0));Yc(i,n,o-n>>3,e)|0;n=i+16|0;o=Rn(f[n>>2]|0,f[n+4>>2]|0,1)|0;n=(f[e+4>>2]|0)-(f[e>>2]|0)|0;l=j;f[l>>2]=n;f[l+4>>2]=0;l=Tn(o|0,I|0,39,0)|0;o=Wn(l|0,I|0,3)|0;l=Tn(o|0,I|0,8,0)|0;o=Tn(l|0,I|0,n|0,0)|0;vl(e,o,I);o=i+24|0;f[o>>2]=(f[e>>2]|0)+(f[j>>2]|0);j=i+28|0;f[j>>2]=0;n=i+32|0;f[n>>2]=16384;if(d){d=c;c=16384;do{l=d;d=d+-1|0;p=f[a+(d<<2)>>2]|0;m=f[i>>2]|0;q=f[m+(p<<3)>>2]|0;r=q<<10;if(c>>>0<r>>>0)s=c;else{t=c;while(1){v=f[o>>2]|0;w=f[j>>2]|0;f[j>>2]=w+1;b[v+w>>0]=t;w=(f[n>>2]|0)>>>8;f[n>>2]=w;if(w>>>0<r>>>0){s=w;break}else t=w}}c=(((s>>>0)/(q>>>0)|0)<<12)+((s>>>0)%(q>>>0)|0)+(f[m+(p<<3)+4>>2]|0)|0;f[n>>2]=c}while((l|0)>1)}Lf(i,e);e=f[i>>2]|0;if(e|0){c=i+4|0;i=f[c>>2]|0;if((i|0)!=(e|0))f[c>>2]=i+(~((i+-8-e|0)>>>3)<<3);br(e)}e=f[h>>2]|0;if(!e){u=g;return 1}h=f[k>>2]|0;if((h|0)!=(e|0))f[k>>2]=h+(~((h+-8-e|0)>>>3)<<3);br(e);u=g;return 1}function de(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0;g=u;u=u+64|0;h=g+48|0;i=g;j=d+1|0;f[h>>2]=0;k=h+4|0;f[k>>2]=0;f[h+8>>2]=0;do if(j)if(j>>>0>536870911)mq(h);else{l=dn(j<<3)|0;f[h>>2]=l;m=l+(j<<3)|0;f[h+8>>2]=m;hj(l|0,0,(d<<3)+8|0)|0;f[k>>2]=m;n=l;o=m;break}else{n=0;o=0}while(0);d=(c|0)>0;if(d){j=0;do{m=n+(f[a+(j<<2)>>2]<<3)|0;l=m;p=Tn(f[l>>2]|0,f[l+4>>2]|0,1,0)|0;l=m;f[l>>2]=p;f[l+4>>2]=I;j=j+1|0}while((j|0)!=(c|0))}j=i+40|0;l=j;f[l>>2]=0;f[l+4>>2]=0;l=i;p=l+36|0;do{f[l>>2]=0;l=l+4|0}while((l|0)<(p|0));Zc(i,n,o-n>>3,e)|0;n=i+16|0;o=Rn(f[n>>2]|0,f[n+4>>2]|0,1)|0;n=(f[e+4>>2]|0)-(f[e>>2]|0)|0;l=j;f[l>>2]=n;f[l+4>>2]=0;l=Tn(o|0,I|0,39,0)|0;o=Wn(l|0,I|0,3)|0;l=Tn(o|0,I|0,8,0)|0;o=Tn(l|0,I|0,n|0,0)|0;vl(e,o,I);o=i+24|0;f[o>>2]=(f[e>>2]|0)+(f[j>>2]|0);j=i+28|0;f[j>>2]=0;n=i+32|0;f[n>>2]=16384;if(d){d=c;c=16384;do{l=d;d=d+-1|0;p=f[a+(d<<2)>>2]|0;m=f[i>>2]|0;q=f[m+(p<<3)>>2]|0;r=q<<10;if(c>>>0<r>>>0)s=c;else{t=c;while(1){v=f[o>>2]|0;w=f[j>>2]|0;f[j>>2]=w+1;b[v+w>>0]=t;w=(f[n>>2]|0)>>>8;f[n>>2]=w;if(w>>>0<r>>>0){s=w;break}else t=w}}c=(((s>>>0)/(q>>>0)|0)<<12)+((s>>>0)%(q>>>0)|0)+(f[m+(p<<3)+4>>2]|0)|0;f[n>>2]=c}while((l|0)>1)}Lf(i,e);e=f[i>>2]|0;if(e|0){c=i+4|0;i=f[c>>2]|0;if((i|0)!=(e|0))f[c>>2]=i+(~((i+-8-e|0)>>>3)<<3);br(e)}e=f[h>>2]|0;if(!e){u=g;return 1}h=f[k>>2]|0;if((h|0)!=(e|0))f[k>>2]=h+(~((h+-8-e|0)>>>3)<<3);br(e);u=g;return 1}function ee(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0;g=u;u=u+64|0;h=g+48|0;i=g;j=d+1|0;f[h>>2]=0;k=h+4|0;f[k>>2]=0;f[h+8>>2]=0;do if(j)if(j>>>0>536870911)mq(h);else{l=dn(j<<3)|0;f[h>>2]=l;m=l+(j<<3)|0;f[h+8>>2]=m;hj(l|0,0,(d<<3)+8|0)|0;f[k>>2]=m;n=l;o=m;break}else{n=0;o=0}while(0);d=(c|0)>0;if(d){j=0;do{m=n+(f[a+(j<<2)>>2]<<3)|0;l=m;p=Tn(f[l>>2]|0,f[l+4>>2]|0,1,0)|0;l=m;f[l>>2]=p;f[l+4>>2]=I;j=j+1|0}while((j|0)!=(c|0))}j=i+40|0;l=j;f[l>>2]=0;f[l+4>>2]=0;l=i;p=l+36|0;do{f[l>>2]=0;l=l+4|0}while((l|0)<(p|0));_c(i,n,o-n>>3,e)|0;n=i+16|0;o=Rn(f[n>>2]|0,f[n+4>>2]|0,1)|0;n=(f[e+4>>2]|0)-(f[e>>2]|0)|0;l=j;f[l>>2]=n;f[l+4>>2]=0;l=Tn(o|0,I|0,39,0)|0;o=Wn(l|0,I|0,3)|0;l=Tn(o|0,I|0,8,0)|0;o=Tn(l|0,I|0,n|0,0)|0;vl(e,o,I);o=i+24|0;f[o>>2]=(f[e>>2]|0)+(f[j>>2]|0);j=i+28|0;f[j>>2]=0;n=i+32|0;f[n>>2]=16384;if(d){d=c;c=16384;do{l=d;d=d+-1|0;p=f[a+(d<<2)>>2]|0;m=f[i>>2]|0;q=f[m+(p<<3)>>2]|0;r=q<<10;if(c>>>0<r>>>0)s=c;else{t=c;while(1){v=f[o>>2]|0;w=f[j>>2]|0;f[j>>2]=w+1;b[v+w>>0]=t;w=(f[n>>2]|0)>>>8;f[n>>2]=w;if(w>>>0<r>>>0){s=w;break}else t=w}}c=(((s>>>0)/(q>>>0)|0)<<12)+((s>>>0)%(q>>>0)|0)+(f[m+(p<<3)+4>>2]|0)|0;f[n>>2]=c}while((l|0)>1)}Lf(i,e);e=f[i>>2]|0;if(e|0){c=i+4|0;i=f[c>>2]|0;if((i|0)!=(e|0))f[c>>2]=i+(~((i+-8-e|0)>>>3)<<3);br(e)}e=f[h>>2]|0;if(!e){u=g;return 1}h=f[k>>2]|0;if((h|0)!=(e|0))f[k>>2]=h+(~((h+-8-e|0)>>>3)<<3);br(e);u=g;return 1}function fe(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0;g=u;u=u+64|0;h=g+48|0;i=g;j=d+1|0;f[h>>2]=0;k=h+4|0;f[k>>2]=0;f[h+8>>2]=0;do if(j)if(j>>>0>536870911)mq(h);else{l=dn(j<<3)|0;f[h>>2]=l;m=l+(j<<3)|0;f[h+8>>2]=m;hj(l|0,0,(d<<3)+8|0)|0;f[k>>2]=m;n=l;o=m;break}else{n=0;o=0}while(0);d=(c|0)>0;if(d){j=0;do{m=n+(f[a+(j<<2)>>2]<<3)|0;l=m;p=Tn(f[l>>2]|0,f[l+4>>2]|0,1,0)|0;l=m;f[l>>2]=p;f[l+4>>2]=I;j=j+1|0}while((j|0)!=(c|0))}j=i+40|0;l=j;f[l>>2]=0;f[l+4>>2]=0;l=i;p=l+36|0;do{f[l>>2]=0;l=l+4|0}while((l|0)<(p|0));$c(i,n,o-n>>3,e)|0;n=i+16|0;o=Rn(f[n>>2]|0,f[n+4>>2]|0,1)|0;n=(f[e+4>>2]|0)-(f[e>>2]|0)|0;l=j;f[l>>2]=n;f[l+4>>2]=0;l=Tn(o|0,I|0,39,0)|0;o=Wn(l|0,I|0,3)|0;l=Tn(o|0,I|0,8,0)|0;o=Tn(l|0,I|0,n|0,0)|0;vl(e,o,I);o=i+24|0;f[o>>2]=(f[e>>2]|0)+(f[j>>2]|0);j=i+28|0;f[j>>2]=0;n=i+32|0;f[n>>2]=16384;if(d){d=c;c=16384;do{l=d;d=d+-1|0;p=f[a+(d<<2)>>2]|0;m=f[i>>2]|0;q=f[m+(p<<3)>>2]|0;r=q<<10;if(c>>>0<r>>>0)s=c;else{t=c;while(1){v=f[o>>2]|0;w=f[j>>2]|0;f[j>>2]=w+1;b[v+w>>0]=t;w=(f[n>>2]|0)>>>8;f[n>>2]=w;if(w>>>0<r>>>0){s=w;break}else t=w}}c=(((s>>>0)/(q>>>0)|0)<<12)+((s>>>0)%(q>>>0)|0)+(f[m+(p<<3)+4>>2]|0)|0;f[n>>2]=c}while((l|0)>1)}Lf(i,e);e=f[i>>2]|0;if(e|0){c=i+4|0;i=f[c>>2]|0;if((i|0)!=(e|0))f[c>>2]=i+(~((i+-8-e|0)>>>3)<<3);br(e)}e=f[h>>2]|0;if(!e){u=g;return 1}h=f[k>>2]|0;if((h|0)!=(e|0))f[k>>2]=h+(~((h+-8-e|0)>>>3)<<3);br(e);u=g;return 1}function ge(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0;g=u;u=u+64|0;h=g+48|0;i=g;j=d+1|0;f[h>>2]=0;k=h+4|0;f[k>>2]=0;f[h+8>>2]=0;do if(j)if(j>>>0>536870911)mq(h);else{l=dn(j<<3)|0;f[h>>2]=l;m=l+(j<<3)|0;f[h+8>>2]=m;hj(l|0,0,(d<<3)+8|0)|0;f[k>>2]=m;n=l;o=m;break}else{n=0;o=0}while(0);d=(c|0)>0;if(d){j=0;do{m=n+(f[a+(j<<2)>>2]<<3)|0;l=m;p=Tn(f[l>>2]|0,f[l+4>>2]|0,1,0)|0;l=m;f[l>>2]=p;f[l+4>>2]=I;j=j+1|0}while((j|0)!=(c|0))}j=i+40|0;l=j;f[l>>2]=0;f[l+4>>2]=0;l=i;p=l+36|0;do{f[l>>2]=0;l=l+4|0}while((l|0)<(p|0));ad(i,n,o-n>>3,e)|0;n=i+16|0;o=Rn(f[n>>2]|0,f[n+4>>2]|0,1)|0;n=(f[e+4>>2]|0)-(f[e>>2]|0)|0;l=j;f[l>>2]=n;f[l+4>>2]=0;l=Tn(o|0,I|0,39,0)|0;o=Wn(l|0,I|0,3)|0;l=Tn(o|0,I|0,8,0)|0;o=Tn(l|0,I|0,n|0,0)|0;vl(e,o,I);o=i+24|0;f[o>>2]=(f[e>>2]|0)+(f[j>>2]|0);j=i+28|0;f[j>>2]=0;n=i+32|0;f[n>>2]=16384;if(d){d=c;c=16384;do{l=d;d=d+-1|0;p=f[a+(d<<2)>>2]|0;m=f[i>>2]|0;q=f[m+(p<<3)>>2]|0;r=q<<10;if(c>>>0<r>>>0)s=c;else{t=c;while(1){v=f[o>>2]|0;w=f[j>>2]|0;f[j>>2]=w+1;b[v+w>>0]=t;w=(f[n>>2]|0)>>>8;f[n>>2]=w;if(w>>>0<r>>>0){s=w;break}else t=w}}c=(((s>>>0)/(q>>>0)|0)<<12)+((s>>>0)%(q>>>0)|0)+(f[m+(p<<3)+4>>2]|0)|0;f[n>>2]=c}while((l|0)>1)}Lf(i,e);e=f[i>>2]|0;if(e|0){c=i+4|0;i=f[c>>2]|0;if((i|0)!=(e|0))f[c>>2]=i+(~((i+-8-e|0)>>>3)<<3);br(e)}e=f[h>>2]|0;if(!e){u=g;return 1}h=f[k>>2]|0;if((h|0)!=(e|0))f[k>>2]=h+(~((h+-8-e|0)>>>3)<<3);br(e);u=g;return 1}function he(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0;g=u;u=u+64|0;h=g+48|0;i=g;j=d+1|0;f[h>>2]=0;k=h+4|0;f[k>>2]=0;f[h+8>>2]=0;do if(j)if(j>>>0>536870911)mq(h);else{l=dn(j<<3)|0;f[h>>2]=l;m=l+(j<<3)|0;f[h+8>>2]=m;hj(l|0,0,(d<<3)+8|0)|0;f[k>>2]=m;n=l;o=m;break}else{n=0;o=0}while(0);d=(c|0)>0;if(d){j=0;do{m=n+(f[a+(j<<2)>>2]<<3)|0;l=m;p=Tn(f[l>>2]|0,f[l+4>>2]|0,1,0)|0;l=m;f[l>>2]=p;f[l+4>>2]=I;j=j+1|0}while((j|0)!=(c|0))}j=i+40|0;l=j;f[l>>2]=0;f[l+4>>2]=0;l=i;p=l+36|0;do{f[l>>2]=0;l=l+4|0}while((l|0)<(p|0));bd(i,n,o-n>>3,e)|0;n=i+16|0;o=Rn(f[n>>2]|0,f[n+4>>2]|0,1)|0;n=(f[e+4>>2]|0)-(f[e>>2]|0)|0;l=j;f[l>>2]=n;f[l+4>>2]=0;l=Tn(o|0,I|0,39,0)|0;o=Wn(l|0,I|0,3)|0;l=Tn(o|0,I|0,8,0)|0;o=Tn(l|0,I|0,n|0,0)|0;vl(e,o,I);o=i+24|0;f[o>>2]=(f[e>>2]|0)+(f[j>>2]|0);j=i+28|0;f[j>>2]=0;n=i+32|0;f[n>>2]=16384;if(d){d=c;c=16384;do{l=d;d=d+-1|0;p=f[a+(d<<2)>>2]|0;m=f[i>>2]|0;q=f[m+(p<<3)>>2]|0;r=q<<10;if(c>>>0<r>>>0)s=c;else{t=c;while(1){v=f[o>>2]|0;w=f[j>>2]|0;f[j>>2]=w+1;b[v+w>>0]=t;w=(f[n>>2]|0)>>>8;f[n>>2]=w;if(w>>>0<r>>>0){s=w;break}else t=w}}c=(((s>>>0)/(q>>>0)|0)<<12)+((s>>>0)%(q>>>0)|0)+(f[m+(p<<3)+4>>2]|0)|0;f[n>>2]=c}while((l|0)>1)}Lf(i,e);e=f[i>>2]|0;if(e|0){c=i+4|0;i=f[c>>2]|0;if((i|0)!=(e|0))f[c>>2]=i+(~((i+-8-e|0)>>>3)<<3);br(e)}e=f[h>>2]|0;if(!e){u=g;return 1}h=f[k>>2]|0;if((h|0)!=(e|0))f[k>>2]=h+(~((h+-8-e|0)>>>3)<<3);br(e);u=g;return 1}function ie(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0;g=u;u=u+64|0;h=g+48|0;i=g;j=d+1|0;f[h>>2]=0;k=h+4|0;f[k>>2]=0;f[h+8>>2]=0;do if(j)if(j>>>0>536870911)mq(h);else{l=dn(j<<3)|0;f[h>>2]=l;m=l+(j<<3)|0;f[h+8>>2]=m;hj(l|0,0,(d<<3)+8|0)|0;f[k>>2]=m;n=l;o=m;break}else{n=0;o=0}while(0);d=(c|0)>0;if(d){j=0;do{m=n+(f[a+(j<<2)>>2]<<3)|0;l=m;p=Tn(f[l>>2]|0,f[l+4>>2]|0,1,0)|0;l=m;f[l>>2]=p;f[l+4>>2]=I;j=j+1|0}while((j|0)!=(c|0))}j=i+40|0;l=j;f[l>>2]=0;f[l+4>>2]=0;l=i;p=l+36|0;do{f[l>>2]=0;l=l+4|0}while((l|0)<(p|0));cd(i,n,o-n>>3,e)|0;n=i+16|0;o=Rn(f[n>>2]|0,f[n+4>>2]|0,1)|0;n=(f[e+4>>2]|0)-(f[e>>2]|0)|0;l=j;f[l>>2]=n;f[l+4>>2]=0;l=Tn(o|0,I|0,39,0)|0;o=Wn(l|0,I|0,3)|0;l=Tn(o|0,I|0,8,0)|0;o=Tn(l|0,I|0,n|0,0)|0;vl(e,o,I);o=i+24|0;f[o>>2]=(f[e>>2]|0)+(f[j>>2]|0);j=i+28|0;f[j>>2]=0;n=i+32|0;f[n>>2]=16384;if(d){d=c;c=16384;do{l=d;d=d+-1|0;p=f[a+(d<<2)>>2]|0;m=f[i>>2]|0;q=f[m+(p<<3)>>2]|0;r=q<<10;if(c>>>0<r>>>0)s=c;else{t=c;while(1){v=f[o>>2]|0;w=f[j>>2]|0;f[j>>2]=w+1;b[v+w>>0]=t;w=(f[n>>2]|0)>>>8;f[n>>2]=w;if(w>>>0<r>>>0){s=w;break}else t=w}}c=(((s>>>0)/(q>>>0)|0)<<12)+((s>>>0)%(q>>>0)|0)+(f[m+(p<<3)+4>>2]|0)|0;f[n>>2]=c}while((l|0)>1)}Lf(i,e);e=f[i>>2]|0;if(e|0){c=i+4|0;i=f[c>>2]|0;if((i|0)!=(e|0))f[c>>2]=i+(~((i+-8-e|0)>>>3)<<3);br(e)}e=f[h>>2]|0;if(!e){u=g;return 1}h=f[k>>2]|0;if((h|0)!=(e|0))f[k>>2]=h+(~((h+-8-e|0)>>>3)<<3);br(e);u=g;return 1}function je(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0;g=u;u=u+64|0;h=g+48|0;i=g;j=d+1|0;f[h>>2]=0;k=h+4|0;f[k>>2]=0;f[h+8>>2]=0;do if(j)if(j>>>0>536870911)mq(h);else{l=dn(j<<3)|0;f[h>>2]=l;m=l+(j<<3)|0;f[h+8>>2]=m;hj(l|0,0,(d<<3)+8|0)|0;f[k>>2]=m;n=l;o=m;break}else{n=0;o=0}while(0);d=(c|0)>0;if(d){j=0;do{m=n+(f[a+(j<<2)>>2]<<3)|0;l=m;p=Tn(f[l>>2]|0,f[l+4>>2]|0,1,0)|0;l=m;f[l>>2]=p;f[l+4>>2]=I;j=j+1|0}while((j|0)!=(c|0))}j=i+40|0;l=j;f[l>>2]=0;f[l+4>>2]=0;l=i;p=l+36|0;do{f[l>>2]=0;l=l+4|0}while((l|0)<(p|0));dd(i,n,o-n>>3,e)|0;n=i+16|0;o=Rn(f[n>>2]|0,f[n+4>>2]|0,1)|0;n=(f[e+4>>2]|0)-(f[e>>2]|0)|0;l=j;f[l>>2]=n;f[l+4>>2]=0;l=Tn(o|0,I|0,39,0)|0;o=Wn(l|0,I|0,3)|0;l=Tn(o|0,I|0,8,0)|0;o=Tn(l|0,I|0,n|0,0)|0;vl(e,o,I);o=i+24|0;f[o>>2]=(f[e>>2]|0)+(f[j>>2]|0);j=i+28|0;f[j>>2]=0;n=i+32|0;f[n>>2]=16384;if(d){d=c;c=16384;do{l=d;d=d+-1|0;p=f[a+(d<<2)>>2]|0;m=f[i>>2]|0;q=f[m+(p<<3)>>2]|0;r=q<<10;if(c>>>0<r>>>0)s=c;else{t=c;while(1){v=f[o>>2]|0;w=f[j>>2]|0;f[j>>2]=w+1;b[v+w>>0]=t;w=(f[n>>2]|0)>>>8;f[n>>2]=w;if(w>>>0<r>>>0){s=w;break}else t=w}}c=(((s>>>0)/(q>>>0)|0)<<12)+((s>>>0)%(q>>>0)|0)+(f[m+(p<<3)+4>>2]|0)|0;f[n>>2]=c}while((l|0)>1)}Lf(i,e);e=f[i>>2]|0;if(e|0){c=i+4|0;i=f[c>>2]|0;if((i|0)!=(e|0))f[c>>2]=i+(~((i+-8-e|0)>>>3)<<3);br(e)}e=f[h>>2]|0;if(!e){u=g;return 1}h=f[k>>2]|0;if((h|0)!=(e|0))f[k>>2]=h+(~((h+-8-e|0)>>>3)<<3);br(e);u=g;return 1}function ke(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0;e=f[b>>2]|0;g=b+4|0;h=f[g>>2]|0;i=((f[c>>2]|0)-e<<3)+(f[c+4>>2]|0)-h|0;c=e;if((i|0)<=0){j=d+4|0;k=f[d>>2]|0;f[a>>2]=k;l=a+4|0;m=f[j>>2]|0;f[l>>2]=m;return}if(!h){e=d+4|0;n=i;o=e;p=c;q=f[e>>2]|0}else{e=32-h|0;r=(i|0)<(e|0)?i:e;s=-1>>>(e-r|0)&-1<<h&f[c>>2];c=d+4|0;h=f[c>>2]|0;e=32-h|0;t=e>>>0<r>>>0?e:r;u=f[d>>2]|0;v=f[u>>2]&~(-1>>>(e-t|0)&-1<<h);f[u>>2]=v;h=f[c>>2]|0;e=f[g>>2]|0;f[u>>2]=(h>>>0>e>>>0?s<<h-e:s>>>(e-h|0))|v;v=(f[c>>2]|0)+t|0;h=u+(v>>>5<<2)|0;f[d>>2]=h;u=v&31;f[c>>2]=u;v=r-t|0;if((v|0)>0){e=f[h>>2]&~(-1>>>(32-v|0));f[h>>2]=e;f[h>>2]=e|s>>>((f[g>>2]|0)+t|0);f[c>>2]=v;w=v}else w=u;u=(f[b>>2]|0)+4|0;f[b>>2]=u;n=i-r|0;o=c;p=u;q=w}w=32-q|0;u=-1<<q;if((n|0)>31){q=~u;c=~n;r=n+((c|0)>-64?c:-64)+32&-32;c=n;i=p;while(1){v=f[i>>2]|0;t=f[d>>2]|0;g=f[t>>2]&q;f[t>>2]=g;f[t>>2]=g|v<<f[o>>2];g=t+4|0;f[d>>2]=g;f[g>>2]=f[g>>2]&u|v>>>w;i=(f[b>>2]|0)+4|0;f[b>>2]=i;if((c|0)<=63)break;else c=c+-32|0}x=n+-32-r|0;y=i}else{x=n;y=p}if((x|0)<=0){j=o;k=f[d>>2]|0;f[a>>2]=k;l=a+4|0;m=f[j>>2]|0;f[l>>2]=m;return}p=f[y>>2]&-1>>>(32-x|0);y=(w|0)<(x|0)?w:x;n=f[d>>2]|0;i=f[n>>2]&~(-1<<f[o>>2]&-1>>>(w-y|0));f[n>>2]=i;f[n>>2]=i|p<<f[o>>2];i=(f[o>>2]|0)+y|0;w=n+(i>>>5<<2)|0;f[d>>2]=w;f[o>>2]=i&31;i=x-y|0;if((i|0)<=0){j=o;k=f[d>>2]|0;f[a>>2]=k;l=a+4|0;m=f[j>>2]|0;f[l>>2]=m;return}f[w>>2]=f[w>>2]&~(-1>>>(32-i|0))|p>>>y;f[o>>2]=i;j=o;k=f[d>>2]|0;f[a>>2]=k;l=a+4|0;m=f[j>>2]|0;f[l>>2]=m;return}function le(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;d=u;u=u+16|0;e=d+4|0;g=d;h=d+9|0;i=d+8|0;j=f[(f[a+184>>2]|0)+(c<<2)>>2]&255;b[h>>0]=j;c=a+4|0;k=f[(f[c>>2]|0)+44>>2]|0;l=k+16|0;m=f[l+4>>2]|0;if((m|0)>0|(m|0)==0&(f[l>>2]|0)>>>0>0)n=j;else{f[g>>2]=f[k+4>>2];f[e>>2]=f[g>>2];ye(k,e,h,h+1|0)|0;n=b[h>>0]|0}a:do if(n<<24>>24>-1){k=a+172|0;j=f[(f[k>>2]|0)+((n<<24>>24)*136|0)>>2]|0;l=(Qa[f[(f[a>>2]|0)+40>>2]&127](a)|0)+56|0;m=b[h>>0]|0;o=f[k>>2]|0;k=f[o+(m*136|0)+132>>2]|0;switch(f[(f[(f[l>>2]|0)+84>>2]|0)+(j<<2)>>2]|0){case 0:{p=k;q=7;break a;break}case 1:{if(b[o+(m*136|0)+28>>0]|0){p=k;q=7;break a}break}default:{}}m=f[(f[c>>2]|0)+44>>2]|0;b[i>>0]=1;o=m+16|0;j=f[o+4>>2]|0;if(!((j|0)>0|(j|0)==0&(f[o>>2]|0)>>>0>0)){f[g>>2]=f[m+4>>2];f[e>>2]=f[g>>2];ye(m,e,i,i+1|0)|0}r=k}else{p=f[a+68>>2]|0;q=7}while(0);if((q|0)==7){q=f[(f[c>>2]|0)+44>>2]|0;b[i>>0]=0;a=q+16|0;h=f[a+4>>2]|0;if(!((h|0)>0|(h|0)==0&(f[a>>2]|0)>>>0>0)){f[g>>2]=f[q+4>>2];f[e>>2]=f[g>>2];ye(q,e,i,i+1|0)|0}r=p}p=f[(f[c>>2]|0)+44>>2]|0;b[i>>0]=r;r=p+16|0;c=f[r+4>>2]|0;if((c|0)>0|(c|0)==0&(f[r>>2]|0)>>>0>0){u=d;return 1}f[g>>2]=f[p+4>>2];f[e>>2]=f[g>>2];ye(p,e,i,i+1|0)|0;u=d;return 1}function me(a,b,c,d,e,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0;h=u;u=u+16|0;i=h+4|0;j=h;k=a+60|0;f[a+64>>2]=g;g=a+8|0;Ah(g,b,d,e);d=a+56|0;l=f[d>>2]|0;m=f[l+4>>2]|0;n=f[l>>2]|0;o=m-n|0;if((o|0)<=0){u=h;return 1}p=(o>>>2)+-1|0;o=a+68|0;q=a+16|0;r=a+32|0;s=a+12|0;t=a+28|0;v=a+20|0;w=a+24|0;if(m-n>>2>>>0>p>>>0){x=p;y=n}else{z=l;mq(z)}while(1){f[j>>2]=f[y+(x<<2)>>2];f[i>>2]=f[j>>2];tb(k,i,b,x)|0;l=X(x,e)|0;n=b+(l<<2)|0;p=c+(l<<2)|0;l=f[g>>2]|0;if((l|0)>0){m=0;a=o;A=l;while(1){if((A|0)>0){l=0;do{B=f[a+(l<<2)>>2]|0;C=f[q>>2]|0;if((B|0)>(C|0)){D=f[r>>2]|0;f[D+(l<<2)>>2]=C;E=D}else{D=f[s>>2]|0;C=f[r>>2]|0;f[C+(l<<2)>>2]=(B|0)<(D|0)?D:B;E=C}l=l+1|0}while((l|0)<(f[g>>2]|0));F=E}else F=f[r>>2]|0;l=(f[n+(m<<2)>>2]|0)-(f[F+(m<<2)>>2]|0)|0;C=p+(m<<2)|0;f[C>>2]=l;if((l|0)>=(f[t>>2]|0)){if((l|0)>(f[w>>2]|0)){G=l-(f[v>>2]|0)|0;H=18}}else{G=(f[v>>2]|0)+l|0;H=18}if((H|0)==18){H=0;f[C>>2]=G}m=m+1|0;A=f[g>>2]|0;if((m|0)>=(A|0))break;else a=F}}x=x+-1|0;if((x|0)<=-1){H=3;break}a=f[d>>2]|0;y=f[a>>2]|0;if((f[a+4>>2]|0)-y>>2>>>0<=x>>>0){z=a;H=4;break}}if((H|0)==3){u=h;return 1}else if((H|0)==4)mq(z);return 0}function ne(a,b,c,d,e,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0;h=u;u=u+16|0;i=h+4|0;j=h;k=a+60|0;f[a+64>>2]=g;g=a+8|0;Ah(g,b,d,e);d=a+56|0;l=f[d>>2]|0;m=f[l+4>>2]|0;n=f[l>>2]|0;o=m-n|0;if((o|0)<=0){u=h;return 1}p=(o>>>2)+-1|0;o=a+68|0;q=a+16|0;r=a+32|0;s=a+12|0;t=a+28|0;v=a+20|0;w=a+24|0;if(m-n>>2>>>0>p>>>0){x=p;y=n}else{z=l;mq(z)}while(1){f[j>>2]=f[y+(x<<2)>>2];f[i>>2]=f[j>>2];sb(k,i,b,x)|0;l=X(x,e)|0;n=b+(l<<2)|0;p=c+(l<<2)|0;l=f[g>>2]|0;if((l|0)>0){m=0;a=o;A=l;while(1){if((A|0)>0){l=0;do{B=f[a+(l<<2)>>2]|0;C=f[q>>2]|0;if((B|0)>(C|0)){D=f[r>>2]|0;f[D+(l<<2)>>2]=C;E=D}else{D=f[s>>2]|0;C=f[r>>2]|0;f[C+(l<<2)>>2]=(B|0)<(D|0)?D:B;E=C}l=l+1|0}while((l|0)<(f[g>>2]|0));F=E}else F=f[r>>2]|0;l=(f[n+(m<<2)>>2]|0)-(f[F+(m<<2)>>2]|0)|0;C=p+(m<<2)|0;f[C>>2]=l;if((l|0)>=(f[t>>2]|0)){if((l|0)>(f[w>>2]|0)){G=l-(f[v>>2]|0)|0;H=18}}else{G=(f[v>>2]|0)+l|0;H=18}if((H|0)==18){H=0;f[C>>2]=G}m=m+1|0;A=f[g>>2]|0;if((m|0)>=(A|0))break;else a=F}}x=x+-1|0;if((x|0)<=-1){H=3;break}a=f[d>>2]|0;y=f[a>>2]|0;if((f[a+4>>2]|0)-y>>2>>>0<=x>>>0){z=a;H=4;break}}if((H|0)==3){u=h;return 1}else if((H|0)==4)mq(z);return 0}function oe(a){a=a|0;var b=0,c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0;b=u;u=u+16|0;c=b+4|0;d=b;e=a+12|0;g=f[e>>2]|0;h=(f[g+4>>2]|0)-(f[g>>2]|0)>>2;if(!h){u=b;return 1}i=a+152|0;j=a+140|0;k=a+144|0;l=a+148|0;a=0;m=g;while(1){f[d>>2]=(a>>>0)/3|0;f[c>>2]=f[d>>2];if(!(Rj(m,c)|0)?(g=f[e>>2]|0,(f[(f[g+12>>2]|0)+(a<<2)>>2]|0)==-1):0){n=a+1|0;o=((n>>>0)%3|0|0)==0?a+-2|0:n;if((o|0)==-1)p=-1;else p=f[(f[g>>2]|0)+(o<<2)>>2]|0;o=f[i>>2]|0;if((f[o+(p<<2)>>2]|0)==-1){g=f[k>>2]|0;n=f[l>>2]|0;if((g|0)==(n<<5|0)){if((g+1|0)<0){q=11;break}r=n<<6;n=g+32&-32;hi(j,g>>>0<1073741823?(r>>>0<n>>>0?n:r):2147483647);s=f[k>>2]|0;t=f[i>>2]|0}else{s=g;t=o}f[k>>2]=s+1;o=(f[j>>2]|0)+(s>>>5<<2)|0;f[o>>2]=f[o>>2]&~(1<<(s&31));o=t+(p<<2)|0;if((f[o>>2]|0)==-1){r=a;n=o;while(1){f[n>>2]=g;o=r+1|0;a:do if((r|0)!=-1?(v=((o>>>0)%3|0|0)==0?r+-2|0:o,(v|0)!=-1):0){w=f[e>>2]|0;x=f[w+12>>2]|0;y=v;while(1){v=f[x+(y<<2)>>2]|0;if((v|0)==-1)break;z=v+1|0;A=((z>>>0)%3|0|0)==0?v+-2|0:z;if((A|0)==-1){B=-1;C=-1;break a}else y=A}x=y+1|0;A=((x>>>0)%3|0|0)==0?y+-2|0:x;if((A|0)==-1){B=y;C=-1}else{B=y;C=f[(f[w>>2]|0)+(A<<2)>>2]|0}}else{B=-1;C=-1}while(0);n=t+(C<<2)|0;if((f[n>>2]|0)!=-1)break;else r=B}}}}r=a+1|0;if(r>>>0>=h>>>0){q=3;break}a=r;m=f[e>>2]|0}if((q|0)==3){u=b;return 1}else if((q|0)==11)mq(j);return 0}\nfunction pe(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0;d=u;u=u+32|0;e=d+8|0;g=d;h=a+4|0;i=f[h>>2]|0;if(i>>>0>=b>>>0){f[h>>2]=b;u=d;return}j=a+8|0;k=f[j>>2]|0;l=k<<5;m=b-i|0;if(l>>>0<m>>>0|i>>>0>(l-m|0)>>>0){f[e>>2]=0;n=e+4|0;f[n>>2]=0;o=e+8|0;f[o>>2]=0;if((b|0)<0)mq(a);p=k<<6;k=b+31&-32;hi(e,l>>>0<1073741823?(p>>>0<k>>>0?k:p):2147483647);p=f[h>>2]|0;f[n>>2]=p+m;k=f[a>>2]|0;l=k;q=f[e>>2]|0;r=(l+(p>>>5<<2)-k<<3)+(p&31)|0;if((r|0)>0){p=r>>>5;Xl(q|0,k|0,p<<2|0)|0;k=r&31;r=q+(p<<2)|0;s=r;if(!k){t=0;v=s}else{w=-1>>>(32-k|0);f[r>>2]=f[r>>2]&~w|f[l+(p<<2)>>2]&w;t=k;v=s}}else{t=0;v=q}f[g>>2]=v;f[g+4>>2]=t;t=g;g=f[t>>2]|0;v=f[t+4>>2]|0;t=f[a>>2]|0;f[a>>2]=f[e>>2];f[e>>2]=t;e=f[h>>2]|0;f[h>>2]=f[n>>2];f[n>>2]=e;e=f[j>>2]|0;f[j>>2]=f[o>>2];f[o>>2]=e;if(t|0)br(t);x=g;y=v}else{v=(f[a>>2]|0)+(i>>>5<<2)|0;f[h>>2]=b;x=v;y=i&31}if(!m){u=d;return}i=(y|0)==0;v=x;if(c){if(i){z=m;A=x;B=v}else{c=32-y|0;b=c>>>0>m>>>0?m:c;f[v>>2]=f[v>>2]|-1>>>(c-b|0)&-1<<y;c=v+4|0;z=m-b|0;A=c;B=c}c=z>>>5;hj(A|0,-1,c<<2|0)|0;A=z&31;z=B+(c<<2)|0;if(!A){u=d;return}f[z>>2]=f[z>>2]|-1>>>(32-A|0);u=d;return}else{if(i){C=m;D=x;E=v}else{x=32-y|0;i=x>>>0>m>>>0?m:x;f[v>>2]=f[v>>2]&~(-1>>>(x-i|0)&-1<<y);y=v+4|0;C=m-i|0;D=y;E=y}y=C>>>5;hj(D|0,0,y<<2|0)|0;D=C&31;C=E+(y<<2)|0;if(!D){u=d;return}f[C>>2]=f[C>>2]&~(-1>>>(32-D|0));u=d;return}}function qe(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0;a=u;u=u+48|0;g=a+36|0;h=a+24|0;i=a+12|0;j=a;if(!c){k=0;u=a;return k|0}f[g>>2]=0;f[g+4>>2]=0;f[g+8>>2]=0;l=vj(d)|0;if(l>>>0>4294967279)mq(g);if(l>>>0<11){b[g+11>>0]=l;if(!l)m=g;else{n=g;o=7}}else{p=l+16&-16;q=dn(p)|0;f[g>>2]=q;f[g+8>>2]=p|-2147483648;f[g+4>>2]=l;n=q;o=7}if((o|0)==7){Rg(n|0,d|0,l|0)|0;m=n}b[m+l>>0]=0;f[h>>2]=0;f[h+4>>2]=0;f[h+8>>2]=0;l=vj(e)|0;if(l>>>0>4294967279)mq(h);if(l>>>0<11){b[h+11>>0]=l;if(!l)r=h;else{s=h;o=13}}else{m=l+16&-16;n=dn(m)|0;f[h>>2]=n;f[h+8>>2]=m|-2147483648;f[h+4>>2]=l;s=n;o=13}if((o|0)==13){Rg(s|0,e|0,l|0)|0;r=s}b[r+l>>0]=0;f[i>>2]=0;f[i+4>>2]=0;f[i+8>>2]=0;l=vj(d)|0;if(l>>>0>4294967279)mq(i);if(l>>>0<11){b[i+11>>0]=l;if(!l)t=i;else{v=i;o=19}}else{r=l+16&-16;s=dn(r)|0;f[i>>2]=s;f[i+8>>2]=r|-2147483648;f[i+4>>2]=l;v=s;o=19}if((o|0)==19){Rg(v|0,d|0,l|0)|0;t=v}b[t+l>>0]=0;f[j>>2]=0;f[j+4>>2]=0;f[j+8>>2]=0;l=vj(e)|0;if(l>>>0>4294967279)mq(j);if(l>>>0<11){b[j+11>>0]=l;if(!l)w=j;else{x=j;o=25}}else{t=l+16&-16;v=dn(t)|0;f[j>>2]=v;f[j+8>>2]=t|-2147483648;f[j+4>>2]=l;x=v;o=25}if((o|0)==25){Rg(x|0,e|0,l|0)|0;w=x}b[w+l>>0]=0;en(c,i,j);if((b[j+11>>0]|0)<0)br(f[j>>2]|0);if((b[i+11>>0]|0)<0)br(f[i>>2]|0);if((b[h+11>>0]|0)<0)br(f[h>>2]|0);if((b[g+11>>0]|0)<0)br(f[g>>2]|0);k=1;u=a;return k|0}function re(a,c){a=a|0;c=c|0;var d=0,e=0,g=0;f[a>>2]=f[c>>2];d=c+4|0;f[a+4>>2]=f[d>>2];e=c+8|0;f[a+8>>2]=f[e>>2];g=c+12|0;f[a+12>>2]=f[g>>2];f[d>>2]=0;f[e>>2]=0;f[g>>2]=0;g=c+16|0;f[a+16>>2]=f[g>>2];e=c+20|0;f[a+20>>2]=f[e>>2];d=c+24|0;f[a+24>>2]=f[d>>2];f[g>>2]=0;f[e>>2]=0;f[d>>2]=0;b[a+28>>0]=b[c+28>>0]|0;d=a+32|0;e=c+32|0;f[d>>2]=0;g=a+36|0;f[g>>2]=0;f[a+40>>2]=0;f[d>>2]=f[e>>2];d=c+36|0;f[g>>2]=f[d>>2];g=c+40|0;f[a+40>>2]=f[g>>2];f[g>>2]=0;f[d>>2]=0;f[e>>2]=0;e=a+44|0;d=c+44|0;f[e>>2]=0;g=a+48|0;f[g>>2]=0;f[a+52>>2]=0;f[e>>2]=f[d>>2];e=c+48|0;f[g>>2]=f[e>>2];g=c+52|0;f[a+52>>2]=f[g>>2];f[g>>2]=0;f[e>>2]=0;f[d>>2]=0;d=a+56|0;e=c+56|0;f[d>>2]=0;g=a+60|0;f[g>>2]=0;f[a+64>>2]=0;f[d>>2]=f[e>>2];d=c+60|0;f[g>>2]=f[d>>2];g=c+64|0;f[a+64>>2]=f[g>>2];f[g>>2]=0;f[d>>2]=0;f[e>>2]=0;f[a+68>>2]=f[c+68>>2];f[a+72>>2]=f[c+72>>2];e=a+76|0;d=c+76|0;f[e>>2]=0;g=a+80|0;f[g>>2]=0;f[a+84>>2]=0;f[e>>2]=f[d>>2];e=c+80|0;f[g>>2]=f[e>>2];g=c+84|0;f[a+84>>2]=f[g>>2];f[g>>2]=0;f[e>>2]=0;f[d>>2]=0;d=a+88|0;e=c+88|0;f[d>>2]=0;g=a+92|0;f[g>>2]=0;f[a+96>>2]=0;f[d>>2]=f[e>>2];d=c+92|0;f[g>>2]=f[d>>2];g=c+96|0;f[a+96>>2]=f[g>>2];f[g>>2]=0;f[d>>2]=0;f[e>>2]=0;b[a+100>>0]=b[c+100>>0]|0;e=a+104|0;d=c+104|0;f[e>>2]=0;g=a+108|0;f[g>>2]=0;f[a+112>>2]=0;f[e>>2]=f[d>>2];e=c+108|0;f[g>>2]=f[e>>2];g=c+112|0;f[a+112>>2]=f[g>>2];f[g>>2]=0;f[e>>2]=0;f[d>>2]=0;d=a+116|0;e=c+116|0;f[d>>2]=0;g=a+120|0;f[g>>2]=0;f[a+124>>2]=0;f[d>>2]=f[e>>2];d=c+120|0;f[g>>2]=f[d>>2];g=c+124|0;f[a+124>>2]=f[g>>2];f[g>>2]=0;f[d>>2]=0;f[e>>2]=0;f[a+128>>2]=f[c+128>>2];f[a+132>>2]=f[c+132>>2];return}function se(a,c,d,e,g){a=a|0;c=c|0;d=d|0;e=e|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0;h=u;u=u+48|0;i=h+36|0;j=h+24|0;k=h+8|0;l=h+4|0;m=h;n=e+4|0;Bh(i,c,(f[n>>2]|0)-(f[e>>2]|0)>>2,2,g,d,1);g=f[i>>2]|0;o=(f[f[g>>2]>>2]|0)+(f[g+48>>2]|0)|0;f[k>>2]=-1;f[k+4>>2]=-1;f[k+8>>2]=-1;f[k+12>>2]=-1;p=f[c+4>>2]|0;if((p+-2|0)>>>0<=28){f[k>>2]=p;c=1<<p;f[k+4>>2]=c+-1;p=c+-2|0;f[k+8>>2]=p;f[k+12>>2]=(p|0)/2|0;p=f[e>>2]|0;if((f[n>>2]|0)==(p|0))q=g;else{c=d+84|0;r=d+68|0;s=d+48|0;t=d+40|0;v=0;w=0;x=p;while(1){p=f[x+(v<<2)>>2]|0;if(!(b[c>>0]|0))y=f[(f[r>>2]|0)+(p<<2)>>2]|0;else y=p;p=s;z=f[p>>2]|0;A=f[p+4>>2]|0;p=t;B=f[p>>2]|0;C=on(B|0,f[p+4>>2]|0,y|0,0)|0;p=Tn(C|0,I|0,z|0,A|0)|0;Rg(j|0,(f[f[d>>2]>>2]|0)+p|0,B|0)|0;df(k,j,l,m);f[o+(w<<2)>>2]=f[l>>2];f[o+((w|1)<<2)>>2]=f[m>>2];v=v+1|0;x=f[e>>2]|0;if(v>>>0>=(f[n>>2]|0)-x>>2>>>0)break;else w=w+2|0}q=f[i>>2]|0}f[a>>2]=q;f[i>>2]=0;u=h;return}f[a>>2]=0;f[i>>2]=0;if(!g){u=h;return}i=g+88|0;a=f[i>>2]|0;f[i>>2]=0;if(a|0){i=f[a+8>>2]|0;if(i|0){q=a+12|0;if((f[q>>2]|0)!=(i|0))f[q>>2]=i;br(i)}br(a)}a=f[g+68>>2]|0;if(a|0){i=g+72|0;q=f[i>>2]|0;if((q|0)!=(a|0))f[i>>2]=q+(~((q+-4-a|0)>>>2)<<2);br(a)}a=g+64|0;q=f[a>>2]|0;f[a>>2]=0;if(q|0){a=f[q>>2]|0;if(a|0){i=q+4|0;if((f[i>>2]|0)!=(a|0))f[i>>2]=a;br(a)}br(q)}br(g);u=h;return}function te(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;d=a+8|0;e=f[d>>2]|0;g=a+4|0;h=f[g>>2]|0;if(((e-h|0)/136|0)>>>0>=c>>>0){i=c;j=h;do{f[j>>2]=-1;Ek(j+4|0);b[j+100>>0]=1;k=j+104|0;f[k>>2]=0;f[k+4>>2]=0;f[k+8>>2]=0;f[k+12>>2]=0;f[k+16>>2]=0;f[k+20>>2]=0;f[k+24>>2]=0;j=(f[g>>2]|0)+136|0;f[g>>2]=j;i=i+-1|0}while((i|0)!=0);return}i=f[a>>2]|0;j=(h-i|0)/136|0;h=j+c|0;if(h>>>0>31580641)mq(a);k=(e-i|0)/136|0;i=k<<1;e=k>>>0<15790320?(i>>>0<h>>>0?h:i):31580641;do if(e)if(e>>>0>31580641){i=ra(8)|0;Wo(i,14941);f[i>>2]=6944;va(i|0,1080,114)}else{l=dn(e*136|0)|0;break}else l=0;while(0);i=l+(j*136|0)|0;j=i;h=l+(e*136|0)|0;e=c;c=j;l=i;do{f[l>>2]=-1;Ek(l+4|0);b[l+100>>0]=1;k=l+104|0;f[k>>2]=0;f[k+4>>2]=0;f[k+8>>2]=0;f[k+12>>2]=0;f[k+16>>2]=0;f[k+20>>2]=0;f[k+24>>2]=0;l=c+136|0;c=l;e=e+-1|0}while((e|0)!=0);e=f[a>>2]|0;l=f[g>>2]|0;if((l|0)==(e|0)){m=j;n=e;o=e}else{k=l;l=j;j=i;do{k=k+-136|0;re(j+-136|0,k);j=l+-136|0;l=j}while((k|0)!=(e|0));m=l;n=f[a>>2]|0;o=f[g>>2]|0}f[a>>2]=m;f[g>>2]=c;f[d>>2]=h;h=n;if((o|0)!=(h|0)){d=o;do{o=f[d+-20>>2]|0;if(o|0){c=d+-16|0;g=f[c>>2]|0;if((g|0)!=(o|0))f[c>>2]=g+(~((g+-4-o|0)>>>2)<<2);br(o)}o=f[d+-32>>2]|0;if(o|0){g=d+-28|0;c=f[g>>2]|0;if((c|0)!=(o|0))f[g>>2]=c+(~((c+-4-o|0)>>>2)<<2);br(o)}yi(d+-132|0);d=d+-136|0}while((d|0)!=(h|0))}if(!n)return;br(n);return}function ue(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;c=f[b>>2]|0;b=a+12|0;d=(c|0)==-1;e=c+1|0;do if(!d){g=((e>>>0)%3|0|0)==0?c+-2|0:e;if(!((c>>>0)%3|0)){h=g;i=c+2|0;break}else{h=g;i=c+-1|0;break}}else{h=-1;i=-1}while(0);e=d?-1:(c>>>0)/3|0;g=a+28|0;j=(f[g>>2]|0)+(e>>>5<<2)|0;f[j>>2]=1<<(e&31)|f[j>>2];j=a+172|0;e=a+176|0;k=a+280|0;if(((!d?(d=f[(f[(f[b>>2]|0)+12>>2]|0)+(c<<2)>>2]|0,(d|0)!=-1):0)?(a=(d>>>0)/3|0,(f[(f[g>>2]|0)+(a>>>5<<2)>>2]&1<<(a&31)|0)==0):0)?(a=f[j>>2]|0,(f[e>>2]|0)!=(a|0)):0){d=c>>>5;l=1<<(c&31);c=0;m=a;do{a=(f[k>>2]|0)+(c<<5)|0;if(!(l&f[(f[m+(c*136|0)+4>>2]|0)+(d<<2)>>2]))Vi(a,0);else Vi(a,1);c=c+1|0;m=f[j>>2]|0}while(c>>>0<(((f[e>>2]|0)-m|0)/136|0)>>>0)}if((((h|0)!=-1?(m=f[(f[(f[b>>2]|0)+12>>2]|0)+(h<<2)>>2]|0,(m|0)!=-1):0)?(c=(m>>>0)/3|0,(f[(f[g>>2]|0)+(c>>>5<<2)>>2]&1<<(c&31)|0)==0):0)?(c=f[j>>2]|0,(f[e>>2]|0)!=(c|0)):0){m=h>>>5;d=1<<(h&31);h=0;l=c;do{c=(f[k>>2]|0)+(h<<5)|0;if(!(d&f[(f[l+(h*136|0)+4>>2]|0)+(m<<2)>>2]))Vi(c,0);else Vi(c,1);h=h+1|0;l=f[j>>2]|0}while(h>>>0<(((f[e>>2]|0)-l|0)/136|0)>>>0)}if((i|0)==-1)return 1;l=f[(f[(f[b>>2]|0)+12>>2]|0)+(i<<2)>>2]|0;if((l|0)==-1)return 1;b=(l>>>0)/3|0;if(f[(f[g>>2]|0)+(b>>>5<<2)>>2]&1<<(b&31)|0)return 1;b=f[j>>2]|0;if((f[e>>2]|0)==(b|0))return 1;g=i>>>5;l=1<<(i&31);i=0;h=b;do{b=(f[k>>2]|0)+(i<<5)|0;if(!(l&f[(f[h+(i*136|0)+4>>2]|0)+(g<<2)>>2]))Vi(b,0);else Vi(b,1);i=i+1|0;h=f[j>>2]|0}while(i>>>0<(((f[e>>2]|0)-h|0)/136|0)>>>0);return 1}function ve(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0;d=u;u=u+16|0;e=d+4|0;g=d;h=d+8|0;i=a+4|0;j=a+8|0;Nh((f[j>>2]|0)-(f[i>>2]|0)>>2,c)|0;k=f[i>>2]|0;if((f[j>>2]|0)==(k|0)){u=d;return 1}l=a+32|0;a=c+16|0;m=c+4|0;n=h+1|0;o=h+1|0;p=h+1|0;q=h+1|0;r=0;s=k;do{k=f[(f[(f[l>>2]|0)+8>>2]|0)+(f[s+(r<<2)>>2]<<2)>>2]|0;b[h>>0]=f[k+56>>2];t=a;v=f[t>>2]|0;w=f[t+4>>2]|0;if((w|0)>0|(w|0)==0&v>>>0>0){x=w;y=v}else{f[g>>2]=f[m>>2];f[e>>2]=f[g>>2];ye(c,e,h,q)|0;v=a;x=f[v+4>>2]|0;y=f[v>>2]|0}b[h>>0]=f[k+28>>2];if((x|0)>0|(x|0)==0&y>>>0>0){z=x;A=y}else{f[g>>2]=f[m>>2];f[e>>2]=f[g>>2];ye(c,e,h,p)|0;v=a;z=f[v+4>>2]|0;A=f[v>>2]|0}b[h>>0]=b[k+24>>0]|0;if((z|0)>0|(z|0)==0&A>>>0>0){B=z;C=A}else{f[g>>2]=f[m>>2];f[e>>2]=f[g>>2];ye(c,e,h,o)|0;v=a;B=f[v+4>>2]|0;C=f[v>>2]|0}b[h>>0]=b[k+32>>0]|0;if(!((B|0)>0|(B|0)==0&C>>>0>0)){f[g>>2]=f[m>>2];f[e>>2]=f[g>>2];ye(c,e,h,n)|0}Nh(f[k+60>>2]|0,c)|0;r=r+1|0;s=f[i>>2]|0}while(r>>>0<(f[j>>2]|0)-s>>2>>>0);u=d;return 1}function we(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0;d=u;u=u+32|0;e=d+16|0;g=d+12|0;h=d+8|0;i=d+4|0;j=d;wp(a);f[a+16>>2]=0;f[a+20>>2]=0;f[a+12>>2]=a+16;k=a+24|0;wp(k);l=b+4|0;if((a|0)!=(l|0)){f[h>>2]=f[l>>2];f[i>>2]=b+8;f[g>>2]=f[h>>2];f[e>>2]=f[i>>2];Hc(a,g,e)}l=b+28|0;if((k|0)!=(l|0)){f[h>>2]=f[l>>2];f[i>>2]=b+32;f[g>>2]=f[h>>2];f[e>>2]=f[i>>2];Hc(k,g,e)}f[j>>2]=0;k=c+8|0;l=c+12|0;c=f[l>>2]|0;m=f[k>>2]|0;if((c-m|0)<=0){u=d;return}n=b+20|0;b=m;m=c;c=0;while(1){o=f[(f[b+(c<<2)>>2]|0)+56>>2]|0;p=f[n>>2]|0;if(p){q=n;r=p;a:while(1){p=r;while(1){if((f[p+16>>2]|0)>=(o|0))break;s=f[p+4>>2]|0;if(!s){t=q;break a}else p=s}r=f[p>>2]|0;if(!r){t=p;break}else q=p}if((t|0)!=(n|0)?(o|0)>=(f[t+16>>2]|0):0){q=t+20|0;r=wd(a,j)|0;if((r|0)!=(q|0)){f[h>>2]=f[q>>2];f[i>>2]=t+24;f[g>>2]=f[h>>2];f[e>>2]=f[i>>2];Hc(r,g,e)}v=f[j>>2]|0;w=f[k>>2]|0;x=f[l>>2]|0}else{v=c;w=b;x=m}}else{v=c;w=b;x=m}c=v+1|0;f[j>>2]=c;if((c|0)>=(x-w>>2|0))break;else{b=w;m=x}}u=d;return}function xe(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0;d=u;u=u+16|0;e=d+4|0;g=d;h=d+8|0;i=a+12|0;Nh(f[i>>2]|0,c)|0;if(!(f[i>>2]|0)){j=1;u=d;return j|0}k=c+16|0;l=c+4|0;m=h+1|0;n=h+1|0;o=h+1|0;p=0;while(1){q=f[a>>2]|0;r=f[q+(p<<3)>>2]|0;if(r>>>0>63)if(r>>>0>16383)if(r>>>0>4194303){j=0;s=20;break}else{t=2;s=13}else{t=1;s=13}else if(!r){v=p+1|0;w=0;while(1){if(f[q+(v+w<<3)>>2]|0){x=w;break}y=w+1|0;if(y>>>0<63)w=y;else{x=y;break}}b[h>>0]=x<<2|3;w=k;v=f[w+4>>2]|0;if(!((v|0)>0|(v|0)==0&(f[w>>2]|0)>>>0>0)){f[g>>2]=f[l>>2];f[e>>2]=f[g>>2];ye(c,e,h,o)|0}z=x+p|0}else{t=0;s=13}if((s|0)==13){s=0;b[h>>0]=t|r<<2;w=k;v=f[w+4>>2]|0;if(!((v|0)>0|(v|0)==0&(f[w>>2]|0)>>>0>0)){f[g>>2]=f[l>>2];f[e>>2]=f[g>>2];ye(c,e,h,n)|0}if(!t)z=p;else{w=0;do{w=w+1|0;b[h>>0]=r>>>((w<<3)+-2|0);v=k;q=f[v+4>>2]|0;if(!((q|0)>0|(q|0)==0&(f[v>>2]|0)>>>0>0)){f[g>>2]=f[l>>2];f[e>>2]=f[g>>2];ye(c,e,h,m)|0}}while((w|0)<(t|0));z=p}}p=z+1|0;if(p>>>0>=(f[i>>2]|0)>>>0){j=1;s=20;break}}if((s|0)==20){u=d;return j|0}return 0}function ye(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0;g=f[a>>2]|0;h=g;i=(f[c>>2]|0)-h|0;c=g+i|0;j=e-d|0;if((j|0)<=0){k=c;return k|0}l=a+8|0;m=f[l>>2]|0;n=a+4|0;o=f[n>>2]|0;p=o;if((j|0)<=(m-p|0)){q=p-c|0;if((j|0)>(q|0)){r=d+q|0;if((r|0)==(e|0))s=o;else{t=r;u=o;while(1){b[u>>0]=b[t>>0]|0;t=t+1|0;v=(f[n>>2]|0)+1|0;f[n>>2]=v;if((t|0)==(e|0)){s=v;break}else u=v}}if((q|0)>0){w=r;x=s}else{k=c;return k|0}}else{w=e;x=o}s=x-(c+j)|0;r=c+s|0;if(r>>>0<o>>>0){q=r;r=x;do{b[r>>0]=b[q>>0]|0;q=q+1|0;r=(f[n>>2]|0)+1|0;f[n>>2]=r}while((q|0)!=(o|0))}if(s|0)Xl(x+(0-s)|0,c|0,s|0)|0;if((w|0)==(d|0)){k=c;return k|0}else{y=d;z=c}while(1){b[z>>0]=b[y>>0]|0;y=y+1|0;if((y|0)==(w|0)){k=c;break}else z=z+1|0}return k|0}z=p-h+j|0;if((z|0)<0)mq(a);j=m-h|0;h=j<<1;m=j>>>0<1073741823?(h>>>0<z>>>0?z:h):2147483647;h=c;if(!m)A=0;else A=dn(m)|0;z=A+i|0;i=z;j=A+m|0;if((d|0)==(e|0)){B=i;C=g}else{g=d;d=i;i=z;do{b[i>>0]=b[g>>0]|0;i=d+1|0;d=i;g=g+1|0}while((g|0)!=(e|0));B=d;C=f[a>>2]|0}d=h-C|0;e=z+(0-d)|0;if((d|0)>0)Rg(e|0,C|0,d|0)|0;d=(f[n>>2]|0)-h|0;if((d|0)>0){h=B;Rg(h|0,c|0,d|0)|0;D=h+d|0;E=f[a>>2]|0}else{D=B;E=C}f[a>>2]=e;f[n>>2]=D;f[l>>2]=j;if(!E){k=z;return k|0}br(E);k=z;return k|0}function ze(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;e=u;u=u+16|0;g=e;h=f[(f[c+4>>2]|0)+(d<<2)>>2]|0;d=f[c+28>>2]|0;c=f[(f[(f[d+4>>2]|0)+8>>2]|0)+(h<<2)>>2]|0;switch(f[c+28>>2]|0){case 5:case 6:case 3:case 4:case 1:case 2:{i=dn(40)|0;Ao(i);j=i;k=j;f[a>>2]=k;u=e;return}case 9:{l=3;break}default:{}}if((l|0)==3){i=f[d+48>>2]|0;d=dn(32)|0;f[g>>2]=d;f[g+8>>2]=-2147483616;f[g+4>>2]=17;m=d;n=12932;o=m+17|0;do{b[m>>0]=b[n>>0]|0;m=m+1|0;n=n+1|0}while((m|0)<(o|0));b[d+17>>0]=0;d=i+16|0;n=f[d>>2]|0;if(n){p=d;q=n;a:while(1){n=q;while(1){if((f[n+16>>2]|0)>=(h|0))break;r=f[n+4>>2]|0;if(!r){s=p;break a}else n=r}q=f[n>>2]|0;if(!q){s=n;break}else p=n}if(((s|0)!=(d|0)?(h|0)>=(f[s+16>>2]|0):0)?(h=s+20|0,(sh(h,g)|0)!=0):0)t=yk(h,g,-1)|0;else l=12}else l=12;if((l|0)==12)t=yk(i,g,-1)|0;if((b[g+11>>0]|0)<0)br(f[g>>2]|0);if((t|0)>0)if((f[c+56>>2]|0)==1){c=dn(48)|0;m=c;o=m+48|0;do{f[m>>2]=0;m=m+4|0}while((m|0)<(o|0));Ao(c);f[c>>2]=2256;f[c+40>>2]=1152;f[c+44>>2]=-1;j=c;k=j;f[a>>2]=k;u=e;return}else{c=dn(64)|0;mm(c);j=c;k=j;f[a>>2]=k;u=e;return}}c=dn(36)|0;wm(c);j=c;k=j;f[a>>2]=k;u=e;return}function Ae(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;d=(c|0)==(a|0);b[c+12>>0]=d&1;if(d)return;else e=c;while(1){g=e+8|0;h=f[g>>2]|0;c=h+12|0;if(b[c>>0]|0){i=23;break}j=h+8|0;k=f[j>>2]|0;d=f[k>>2]|0;if((d|0)==(h|0)){l=f[k+4>>2]|0;if(!l){i=7;break}m=l+12|0;if(!(b[m>>0]|0))n=m;else{i=7;break}}else{if(!d){i=16;break}m=d+12|0;if(!(b[m>>0]|0))n=m;else{i=16;break}}b[c>>0]=1;c=(k|0)==(a|0);b[k+12>>0]=c&1;b[n>>0]=1;if(c){i=23;break}else e=k}if((i|0)==7){if((f[h>>2]|0)==(e|0)){o=h;p=k}else{n=h+4|0;a=f[n>>2]|0;c=f[a>>2]|0;f[n>>2]=c;if(!c)q=k;else{f[c+8>>2]=h;q=f[j>>2]|0}f[a+8>>2]=q;q=f[j>>2]|0;f[((f[q>>2]|0)==(h|0)?q:q+4|0)>>2]=a;f[a>>2]=h;f[j>>2]=a;o=a;p=f[a+8>>2]|0}b[o+12>>0]=1;b[p+12>>0]=0;o=f[p>>2]|0;a=o+4|0;q=f[a>>2]|0;f[p>>2]=q;if(q|0)f[q+8>>2]=p;q=p+8|0;f[o+8>>2]=f[q>>2];c=f[q>>2]|0;f[((f[c>>2]|0)==(p|0)?c:c+4|0)>>2]=o;f[a>>2]=p;f[q>>2]=o;return}else if((i|0)==16){if((f[h>>2]|0)==(e|0)){o=e+4|0;q=f[o>>2]|0;f[h>>2]=q;if(!q)r=k;else{f[q+8>>2]=h;r=f[j>>2]|0}f[g>>2]=r;r=f[j>>2]|0;f[((f[r>>2]|0)==(h|0)?r:r+4|0)>>2]=e;f[o>>2]=h;f[j>>2]=e;s=e;t=f[e+8>>2]|0}else{s=h;t=k}b[s+12>>0]=1;b[t+12>>0]=0;s=t+4|0;k=f[s>>2]|0;h=f[k>>2]|0;f[s>>2]=h;if(h|0)f[h+8>>2]=t;h=t+8|0;f[k+8>>2]=f[h>>2];s=f[h>>2]|0;f[((f[s>>2]|0)==(t|0)?s:s+4|0)>>2]=k;f[k>>2]=t;f[h>>2]=k;return}else if((i|0)==23)return}function Be(a,c,d,e,g){a=a|0;c=c|0;d=d|0;e=e|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=Oa,C=Oa;h=u;u=u+16|0;i=h;j=e+4|0;k=b[d+24>>0]|0;l=k<<24>>24;Bh(a,c,(f[j>>2]|0)-(f[e>>2]|0)>>2,l,g,d,1);g=f[a>>2]|0;a=(f[f[g>>2]>>2]|0)+(f[g+48>>2]|0)|0;g=f[c+4>>2]|0;sq(i);yo(i,$(n[c+20>>2]),(1<<g)+-1|0);g=_q(l>>>0>1073741823?-1:l<<2)|0;m=f[j>>2]|0;j=f[e>>2]|0;e=j;if((m|0)==(j|0)){$q(g);u=h;return}o=d+68|0;p=d+48|0;q=d+40|0;r=c+8|0;c=(b[d+84>>0]|0)==0;s=m-j>>2;if(k<<24>>24>0){t=0;v=0}else{k=0;do{j=f[e+(k<<2)>>2]|0;if(c)w=f[(f[o>>2]|0)+(j<<2)>>2]|0;else w=j;j=p;m=f[j>>2]|0;x=f[j+4>>2]|0;j=q;y=f[j>>2]|0;z=on(y|0,f[j+4>>2]|0,w|0,0)|0;j=Tn(z|0,I|0,m|0,x|0)|0;Rg(g|0,(f[f[d>>2]>>2]|0)+j|0,y|0)|0;k=k+1|0}while(k>>>0<s>>>0);$q(g);u=h;return}while(1){k=f[e+(t<<2)>>2]|0;if(c)A=f[(f[o>>2]|0)+(k<<2)>>2]|0;else A=k;k=p;w=f[k>>2]|0;y=f[k+4>>2]|0;k=q;j=f[k>>2]|0;x=on(j|0,f[k+4>>2]|0,A|0,0)|0;k=Tn(x|0,I|0,w|0,y|0)|0;Rg(g|0,(f[f[d>>2]>>2]|0)+k|0,j|0)|0;j=f[r>>2]|0;B=$(n[i>>2]);k=0;y=v;while(1){C=$(n[g+(k<<2)>>2]);w=~~$(J($($(B*$(C-$(n[j+(k<<2)>>2])))+$(.5))));f[a+(y<<2)>>2]=w;k=k+1|0;if((k|0)==(l|0))break;else y=y+1|0}t=t+1|0;if(t>>>0>=s>>>0)break;else v=v+l|0}$q(g);u=h;return}function Ce(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;d=f[b>>2]|0;b=a+12|0;e=(d|0)==-1;do if(e){g=1;h=-1;i=-1}else{j=d+(((d>>>0)%3|0|0)==0?2:-1)|0;if((j|0)!=-1){k=f[(f[b>>2]|0)+12>>2]|0;l=j;while(1){j=f[k+(l<<2)>>2]|0;if((j|0)==-1){m=0;n=l;break}o=j+1|0;l=((o>>>0)%3|0|0)==0?j+-2|0:o;if((l|0)==-1){m=1;n=-1;break}}if(e){g=m;h=-1;i=n;break}else{p=m;q=n}}else{p=1;q=-1}g=p;h=f[(f[f[b>>2]>>2]|0)+(d<<2)>>2]|0;i=q}while(0);if(c){c=(f[a+84>>2]|0)+(h>>>5<<2)|0;f[c>>2]=f[c>>2]|1<<(h&31);r=1}else r=0;c=f[(f[a+152>>2]|0)+(h<<2)>>2]|0;q=(f[a+140>>2]|0)+(c>>>5<<2)|0;f[q>>2]=f[q>>2]|1<<(c&31);if(!g){g=(((i>>>0)%3|0|0)==0?2:-1)+i|0;if((g|0)==-1){s=-1;t=i}else{s=f[(f[f[b>>2]>>2]|0)+(g<<2)>>2]|0;t=i}}else{s=-1;t=-1}if((s|0)==(h|0)){u=r;return u|0}i=f[a+84>>2]|0;a=r;r=s;s=t;while(1){t=i+(r>>>5<<2)|0;f[t>>2]=f[t>>2]|1<<(r&31);t=a+1|0;g=s+1|0;a:do if((s|0)!=-1?(c=((g>>>0)%3|0|0)==0?s+-2|0:g,(c|0)!=-1):0){q=f[b>>2]|0;d=f[q+12>>2]|0;p=c;while(1){c=f[d+(p<<2)>>2]|0;if((c|0)==-1)break;n=c+1|0;m=((n>>>0)%3|0|0)==0?c+-2|0:n;if((m|0)==-1){v=-1;w=-1;break a}else p=m}d=(((p>>>0)%3|0|0)==0?2:-1)+p|0;if((d|0)==-1){v=-1;w=p}else{v=f[(f[q>>2]|0)+(d<<2)>>2]|0;w=p}}else{v=-1;w=-1}while(0);if((v|0)==(h|0)){u=t;break}else{a=t;r=v;s=w}}return u|0}function De(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;c=a+4|0;d=f[c>>2]|0;e=a+100|0;if(d>>>0<(f[e>>2]|0)>>>0){f[c>>2]=d+1;g=h[d>>0]|0}else g=Di(a)|0;switch(g|0){case 43:case 45:{d=(g|0)==45&1;i=f[c>>2]|0;if(i>>>0<(f[e>>2]|0)>>>0){f[c>>2]=i+1;j=h[i>>0]|0}else j=Di(a)|0;if((b|0)!=0&(j+-48|0)>>>0>9?(f[e>>2]|0)!=0:0){f[c>>2]=(f[c>>2]|0)+-1;k=d;l=j}else{k=d;l=j}break}default:{k=0;l=g}}if((l+-48|0)>>>0>9)if(!(f[e>>2]|0)){m=-2147483648;n=0}else{f[c>>2]=(f[c>>2]|0)+-1;m=-2147483648;n=0}else{g=0;j=l;while(1){g=j+-48+(g*10|0)|0;l=f[c>>2]|0;if(l>>>0<(f[e>>2]|0)>>>0){f[c>>2]=l+1;o=h[l>>0]|0}else o=Di(a)|0;if(!((o+-48|0)>>>0<10&(g|0)<214748364))break;else j=o}j=((g|0)<0)<<31>>31;if((o+-48|0)>>>0<10){l=o;d=g;b=j;while(1){i=on(d|0,b|0,10,0)|0;p=I;q=Tn(l|0,((l|0)<0)<<31>>31|0,-48,-1)|0;r=Tn(q|0,I|0,i|0,p|0)|0;p=I;i=f[c>>2]|0;if(i>>>0<(f[e>>2]|0)>>>0){f[c>>2]=i+1;s=h[i>>0]|0}else s=Di(a)|0;if((s+-48|0)>>>0<10&((p|0)<21474836|(p|0)==21474836&r>>>0<2061584302)){l=s;d=r;b=p}else{t=s;u=r;v=p;break}}}else{t=o;u=g;v=j}if((t+-48|0)>>>0<10)do{t=f[c>>2]|0;if(t>>>0<(f[e>>2]|0)>>>0){f[c>>2]=t+1;w=h[t>>0]|0}else w=Di(a)|0}while((w+-48|0)>>>0<10);if(f[e>>2]|0)f[c>>2]=(f[c>>2]|0)+-1;c=(k|0)!=0;k=Vn(0,0,u|0,v|0)|0;m=c?I:v;n=c?k:u}I=m;return n|0}function Ee(a){a=a|0;var b=0,c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;b=a+1176|0;c=f[b>>2]|0;if(c|0){d=a+1180|0;e=f[d>>2]|0;if((e|0)==(c|0))g=c;else{h=e;while(1){e=h+-12|0;f[d>>2]=e;i=f[e>>2]|0;if(!i)j=e;else{e=h+-8|0;k=f[e>>2]|0;if((k|0)!=(i|0))f[e>>2]=k+(~((k+-4-i|0)>>>2)<<2);br(i);j=f[d>>2]|0}if((j|0)==(c|0))break;else h=j}g=f[b>>2]|0}br(g)}g=a+1164|0;b=f[g>>2]|0;if(b|0){j=a+1168|0;h=f[j>>2]|0;if((h|0)==(b|0))l=b;else{c=h;while(1){h=c+-12|0;f[j>>2]=h;d=f[h>>2]|0;if(!d)m=h;else{h=c+-8|0;i=f[h>>2]|0;if((i|0)!=(d|0))f[h>>2]=i+(~((i+-4-d|0)>>>2)<<2);br(d);m=f[j>>2]|0}if((m|0)==(b|0))break;else c=m}l=f[g>>2]|0}br(l)}l=f[a+1152>>2]|0;if(l|0){g=a+1156|0;m=f[g>>2]|0;if((m|0)!=(l|0))f[g>>2]=m+(~((m+-4-l|0)>>>2)<<2);br(l)}l=f[a+1140>>2]|0;if(l|0){m=a+1144|0;g=f[m>>2]|0;if((g|0)!=(l|0))f[m>>2]=g+(~((g+-4-l|0)>>>2)<<2);br(l)}l=f[a+1128>>2]|0;if(!l){n=a+1108|0;dl(n);o=a+1088|0;dl(o);p=a+1068|0;dl(p);q=a+1036|0;tj(q);r=a+12|0;xh(r);return}g=a+1132|0;m=f[g>>2]|0;if((m|0)!=(l|0))f[g>>2]=m+(~((m+-4-l|0)>>>2)<<2);br(l);n=a+1108|0;dl(n);o=a+1088|0;dl(o);p=a+1068|0;dl(p);q=a+1036|0;tj(q);r=a+12|0;xh(r);return}function Fe(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;d=u;u=u+16|0;e=d;g=a+4|0;h=f[g>>2]|0;i=f[(f[a>>2]|0)+52>>2]|0;if(!h){if(!(Sa[i&31](a,c,0)|0)){j=0;u=d;return j|0}}else if(!(Sa[i&31](a,c,f[(f[h+4>>2]|0)+80>>2]|0)|0)){j=0;u=d;return j|0}if(!(b[a+28>>0]|0)){j=1;u=d;return j|0}h=f[a+8>>2]|0;i=f[a+32>>2]|0;a=f[h+80>>2]|0;f[e>>2]=0;k=e+4|0;f[k>>2]=0;f[e+8>>2]=0;do if(a)if(a>>>0>1073741823)mq(e);else{l=a<<2;m=dn(l)|0;f[e>>2]=m;n=m+(a<<2)|0;f[e+8>>2]=n;hj(m|0,0,l|0)|0;f[k>>2]=n;o=m;p=n;q=m;break}else{o=0;p=0;q=0}while(0);e=f[c+4>>2]|0;a=f[c>>2]|0;c=a;a:do if((e|0)!=(a|0)){m=e-a>>2;if(b[h+84>>0]|0){n=0;while(1){f[o+(f[c+(n<<2)>>2]<<2)>>2]=n;n=n+1|0;if(n>>>0>=m>>>0)break a}}n=f[h+68>>2]|0;l=0;do{f[o+(f[n+(f[c+(l<<2)>>2]<<2)>>2]<<2)>>2]=l;l=l+1|0}while(l>>>0<m>>>0)}while(0);c=f[(f[(f[g>>2]|0)+4>>2]|0)+80>>2]|0;b:do if(c|0){g=f[i+68>>2]|0;if(b[h+84>>0]|0){a=0;while(1){f[g+(a<<2)>>2]=f[o+(a<<2)>>2];a=a+1|0;if(a>>>0>=c>>>0)break b}}a=f[h+68>>2]|0;e=0;do{f[g+(e<<2)>>2]=f[o+(f[a+(e<<2)>>2]<<2)>>2];e=e+1|0}while(e>>>0<c>>>0)}while(0);if(o|0){if((p|0)!=(o|0))f[k>>2]=p+(~((p+-4-o|0)>>>2)<<2);br(q)}j=1;u=d;return j|0}function Ge(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0;c=u;u=u+16|0;d=c;f[a>>2]=0;f[a+8>>2]=b;yh(a+12|0);rn(a+1036|0);to(a+1068|0);to(a+1088|0);to(a+1108|0);e=a+1128|0;f[e>>2]=0;g=a+1132|0;f[g>>2]=0;f[a+1136>>2]=0;h=(b|0)==0;do if(!h)if(b>>>0>1073741823)mq(e);else{i=b<<2;j=dn(i)|0;f[e>>2]=j;k=j+(b<<2)|0;f[a+1136>>2]=k;hj(j|0,0,i|0)|0;f[g>>2]=k;break}while(0);g=a+1140|0;f[g>>2]=0;e=a+1144|0;f[e>>2]=0;f[a+1148>>2]=0;if(!h){k=b<<2;i=dn(k)|0;f[g>>2]=i;g=i+(b<<2)|0;f[a+1148>>2]=g;hj(i|0,0,k|0)|0;f[e>>2]=g}g=a+1152|0;f[g>>2]=0;e=a+1156|0;f[e>>2]=0;f[a+1160>>2]=0;if(!h){k=b<<2;i=dn(k)|0;f[g>>2]=i;g=i+(b<<2)|0;f[a+1160>>2]=g;hj(i|0,0,k|0)|0;f[e>>2]=g}g=b<<5|1;f[d>>2]=0;e=d+4|0;f[e>>2]=0;f[d+8>>2]=0;if(!h){k=b<<2;i=dn(k)|0;f[d>>2]=i;j=i+(b<<2)|0;f[d+8>>2]=j;hj(i|0,0,k|0)|0;f[e>>2]=j}fk(a+1164|0,g,d);j=f[d>>2]|0;if(j|0){k=f[e>>2]|0;if((k|0)!=(j|0))f[e>>2]=k+(~((k+-4-j|0)>>>2)<<2);br(j)}f[d>>2]=0;j=d+4|0;f[j>>2]=0;f[d+8>>2]=0;if(!h){h=b<<2;k=dn(h)|0;f[d>>2]=k;e=k+(b<<2)|0;f[d+8>>2]=e;hj(k|0,0,h|0)|0;f[j>>2]=e}fk(a+1176|0,g,d);g=f[d>>2]|0;if(!g){u=c;return}d=f[j>>2]|0;if((d|0)!=(g|0))f[j>>2]=d+(~((d+-4-g|0)>>>2)<<2);br(g);u=c;return}function He(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0.0,D=0.0,E=0.0;g=u;u=u+16|0;h=g;i=b+16|0;f[a>>2]=f[i>>2];f[a+4>>2]=f[i+4>>2];f[a+8>>2]=f[i+8>>2];f[a+12>>2]=f[i+12>>2];f[a+16>>2]=f[i+16>>2];f[a+20>>2]=f[i+20>>2];j=a+8|0;f[j>>2]=(f[j>>2]|0)+d;j=(d|0)>0;if(j){k=b+4|0;l=a+16|0;m=a+12|0;n=f[b>>2]|0;o=n;q=0;r=o;s=n;n=o;while(1){o=f[c+(q<<2)>>2]|0;t=f[k>>2]|0;if(t-s>>2>>>0>o>>>0){v=r;w=n}else{x=o+1|0;f[h>>2]=0;y=t-s>>2;z=s;A=t;if(x>>>0<=y>>>0)if(x>>>0<y>>>0?(t=z+(x<<2)|0,(t|0)!=(A|0)):0){f[k>>2]=A+(~((A+-4-t|0)>>>2)<<2);B=r}else B=r;else{kh(b,x-y|0,h);B=f[b>>2]|0}v=B;w=B}y=w+(o<<2)|0;x=f[y>>2]|0;s=w;if((x|0)<=1)if((x|0)==0?(f[l>>2]=(f[l>>2]|0)+1,o>>>0>(f[m>>2]|0)>>>0):0){f[m>>2]=o;C=0.0}else C=0.0;else{D=+(x|0);C=+Fg(D)*D}x=(f[y>>2]|0)+1|0;f[y>>2]=x;D=+(x|0);E=+Fg(D)*D-C;p[a>>3]=+p[a>>3]+E;q=q+1|0;if((q|0)==(d|0))break;else{r=v;n=w}}}if(e){f[i>>2]=f[a>>2];f[i+4>>2]=f[a+4>>2];f[i+8>>2]=f[a+8>>2];f[i+12>>2]=f[a+12>>2];f[i+16>>2]=f[a+16>>2];u=g;return}if(!j){u=g;return}j=f[b>>2]|0;b=0;do{a=j+(f[c+(b<<2)>>2]<<2)|0;f[a>>2]=(f[a>>2]|0)+-1;b=b+1|0}while((b|0)!=(d|0));u=g;return}function Ie(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0.0;a:do if(b>>>0<=20)do switch(b|0){case 9:{d=(f[c>>2]|0)+(4-1)&~(4-1);e=f[d>>2]|0;f[c>>2]=d+4;f[a>>2]=e;break a;break}case 10:{e=(f[c>>2]|0)+(4-1)&~(4-1);d=f[e>>2]|0;f[c>>2]=e+4;e=a;f[e>>2]=d;f[e+4>>2]=((d|0)<0)<<31>>31;break a;break}case 11:{d=(f[c>>2]|0)+(4-1)&~(4-1);e=f[d>>2]|0;f[c>>2]=d+4;d=a;f[d>>2]=e;f[d+4>>2]=0;break a;break}case 12:{d=(f[c>>2]|0)+(8-1)&~(8-1);e=d;g=f[e>>2]|0;h=f[e+4>>2]|0;f[c>>2]=d+8;d=a;f[d>>2]=g;f[d+4>>2]=h;break a;break}case 13:{h=(f[c>>2]|0)+(4-1)&~(4-1);d=f[h>>2]|0;f[c>>2]=h+4;h=(d&65535)<<16>>16;d=a;f[d>>2]=h;f[d+4>>2]=((h|0)<0)<<31>>31;break a;break}case 14:{h=(f[c>>2]|0)+(4-1)&~(4-1);d=f[h>>2]|0;f[c>>2]=h+4;h=a;f[h>>2]=d&65535;f[h+4>>2]=0;break a;break}case 15:{h=(f[c>>2]|0)+(4-1)&~(4-1);d=f[h>>2]|0;f[c>>2]=h+4;h=(d&255)<<24>>24;d=a;f[d>>2]=h;f[d+4>>2]=((h|0)<0)<<31>>31;break a;break}case 16:{h=(f[c>>2]|0)+(4-1)&~(4-1);d=f[h>>2]|0;f[c>>2]=h+4;h=a;f[h>>2]=d&255;f[h+4>>2]=0;break a;break}case 17:{h=(f[c>>2]|0)+(8-1)&~(8-1);i=+p[h>>3];f[c>>2]=h+8;p[a>>3]=i;break a;break}case 18:{h=(f[c>>2]|0)+(8-1)&~(8-1);i=+p[h>>3];f[c>>2]=h+8;p[a>>3]=i;break a;break}default:break a}while(0);while(0);return}function Je(a){a=a|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;c=u;u=u+16|0;d=c+4|0;e=c;g=c+8|0;if(!(Qa[f[(f[a>>2]|0)+32>>2]&127](a)|0)){h=0;u=c;return h|0}i=a+44|0;j=f[i>>2]|0;k=a+8|0;l=a+12|0;m=f[l>>2]|0;n=f[k>>2]|0;b[g>>0]=(m-n|0)>>>2;o=j+16|0;p=f[o+4>>2]|0;if((p|0)>0|(p|0)==0&(f[o>>2]|0)>>>0>0){q=k;r=n;s=m}else{f[e>>2]=f[j+4>>2];f[d>>2]=f[e>>2];ye(j,d,g,g+1|0)|0;q=k;r=f[k>>2]|0;s=f[l>>2]|0}a:do if((r|0)!=(s|0)){l=a+4|0;k=r;while(1){g=f[k>>2]|0;k=k+4|0;if(!(Sa[f[(f[g>>2]|0)+8>>2]&31](g,a,f[l>>2]|0)|0)){h=0;break}if((k|0)==(s|0))break a}u=c;return h|0}while(0);if(!(vc(a)|0)){h=0;u=c;return h|0}s=a+32|0;r=f[s>>2]|0;k=a+36|0;l=f[k>>2]|0;b:do if((r|0)!=(l|0)){g=r;do{if(!(Ra[f[(f[a>>2]|0)+40>>2]&127](a,f[g>>2]|0)|0)){h=0;t=18;break}g=g+4|0}while((g|0)!=(l|0));if((t|0)==18){u=c;return h|0}g=f[s>>2]|0;d=f[k>>2]|0;if((g|0)!=(d|0)){j=g;while(1){g=f[(f[q>>2]|0)+(f[j>>2]<<2)>>2]|0;j=j+4|0;if(!(Ra[f[(f[g>>2]|0)+12>>2]&127](g,f[i>>2]|0)|0)){h=0;break}if((j|0)==(d|0))break b}u=c;return h|0}}while(0);h=Qa[f[(f[a>>2]|0)+44>>2]&127](a)|0;u=c;return h|0}function Ke(a,b){a=a|0;b=b|0;fd(a,b);fd(a+32|0,b);fd(a+64|0,b);fd(a+96|0,b);fd(a+128|0,b);fd(a+160|0,b);fd(a+192|0,b);fd(a+224|0,b);fd(a+256|0,b);fd(a+288|0,b);fd(a+320|0,b);fd(a+352|0,b);fd(a+384|0,b);fd(a+416|0,b);fd(a+448|0,b);fd(a+480|0,b);fd(a+512|0,b);fd(a+544|0,b);fd(a+576|0,b);fd(a+608|0,b);fd(a+640|0,b);fd(a+672|0,b);fd(a+704|0,b);fd(a+736|0,b);fd(a+768|0,b);fd(a+800|0,b);fd(a+832|0,b);fd(a+864|0,b);fd(a+896|0,b);fd(a+928|0,b);fd(a+960|0,b);fd(a+992|0,b);fd(a+1024|0,b);return}function Le(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;e=u;u=u+64|0;g=e+60|0;h=e;i=dn(80)|0;j=f[c+8>>2]|0;f[i+4>>2]=0;f[i>>2]=3232;k=i+8|0;l=i+12|0;m=l+44|0;do{f[l>>2]=0;l=l+4|0}while((l|0)<(m|0));f[k>>2]=3256;n=i+56|0;f[n>>2]=0;f[i+60>>2]=0;f[i+64>>2]=0;f[i+68>>2]=j;f[i+72>>2]=d;o=i+76|0;f[o>>2]=0;p=i;q=f[c+12>>2]|0;r=h+4|0;l=r+4|0;m=l+40|0;do{f[l>>2]=0;l=l+4|0}while((l|0)<(m|0));f[h>>2]=3256;l=h+48|0;f[l>>2]=0;m=h+52|0;f[m>>2]=0;f[h+56>>2]=0;s=q;f[r>>2]=s;t=((f[s+4>>2]|0)-(f[q>>2]|0)>>2>>>0)/3|0;b[g>>0]=0;Xg(h+24|0,t,g);t=f[r>>2]|0;r=(f[t+28>>2]|0)-(f[t+24>>2]|0)>>2;b[g>>0]=0;Xg(h+36|0,r,g);f[h+8>>2]=q;f[h+12>>2]=d;f[h+16>>2]=j;f[h+20>>2]=i;f[o>>2]=c+72;ef(k,h)|0;Yf(n,f[l>>2]|0,f[m>>2]|0);f[a>>2]=p;f[h>>2]=3256;p=f[l>>2]|0;if(p|0){l=f[m>>2]|0;if((l|0)!=(p|0))f[m>>2]=l+(~((l+-4-p|0)>>>2)<<2);br(p)}f[h>>2]=3276;p=f[h+36>>2]|0;if(p|0)br(p);p=f[h+24>>2]|0;if(!p){u=e;return}br(p);u=e;return}function Me(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0;c=u;u=u+32|0;d=c;e=a+4|0;g=f[a>>2]|0;h=(f[e>>2]|0)-g>>2;i=h+1|0;if(i>>>0>1073741823)mq(a);j=a+8|0;k=(f[j>>2]|0)-g|0;g=k>>1;l=k>>2>>>0<536870911?(g>>>0<i>>>0?i:g):1073741823;f[d+12>>2]=0;f[d+16>>2]=a+8;do if(l)if(l>>>0>1073741823){g=ra(8)|0;Wo(g,14941);f[g>>2]=6944;va(g|0,1080,114)}else{m=dn(l<<2)|0;break}else m=0;while(0);f[d>>2]=m;g=m+(h<<2)|0;h=d+8|0;i=d+4|0;f[i>>2]=g;k=m+(l<<2)|0;l=d+12|0;f[l>>2]=k;m=f[b>>2]|0;f[b>>2]=0;f[g>>2]=m;m=g+4|0;f[h>>2]=m;b=f[a>>2]|0;n=f[e>>2]|0;if((n|0)==(b|0)){o=g;p=l;q=h;r=b;s=m;t=n;v=k;w=o;f[a>>2]=w;f[i>>2]=r;f[e>>2]=s;f[q>>2]=t;x=f[j>>2]|0;f[j>>2]=v;f[p>>2]=x;f[d>>2]=r;Wh(d);u=c;return}else{y=n;z=g}do{y=y+-4|0;g=f[y>>2]|0;f[y>>2]=0;f[z+-4>>2]=g;z=(f[i>>2]|0)+-4|0;f[i>>2]=z}while((y|0)!=(b|0));o=z;p=l;q=h;r=f[a>>2]|0;s=f[h>>2]|0;t=f[e>>2]|0;v=f[l>>2]|0;w=o;f[a>>2]=w;f[i>>2]=r;f[e>>2]=s;f[q>>2]=t;x=f[j>>2]|0;f[j>>2]=v;f[p>>2]=x;f[d>>2]=r;Wh(d);u=c;return}function Ne(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;d=u;u=u+32|0;e=d+12|0;g=d;h=hl(c,0)|0;if(!h){f[a>>2]=0;u=d;return}i=f[c+100>>2]|0;j=f[c+96>>2]|0;c=i-j|0;k=(c|0)/12|0;f[e>>2]=0;l=e+4|0;f[l>>2]=0;f[e+8>>2]=0;m=j;do if(c)if(k>>>0>357913941)mq(e);else{n=dn(c)|0;f[e>>2]=n;f[e+8>>2]=n+(k*12|0);hj(n|0,0,c|0)|0;f[l>>2]=n+c;o=n;break}else o=0;while(0);f[g>>2]=0;f[g+4>>2]=0;f[g+8>>2]=0;a:do if((i|0)!=(j|0)){c=g+4|0;n=g+8|0;if(b[h+84>>0]|0){p=0;while(1){q=m+(p*12|0)|0;f[g>>2]=f[q>>2];f[g+4>>2]=f[q+4>>2];f[g+8>>2]=f[q+8>>2];f[o+(p*12|0)>>2]=f[g>>2];f[o+(p*12|0)+4>>2]=f[c>>2];f[o+(p*12|0)+8>>2]=f[n>>2];p=p+1|0;if(p>>>0>=k>>>0)break a}}p=f[h+68>>2]|0;q=0;do{r=f[p+(f[m+(q*12|0)>>2]<<2)>>2]|0;f[g>>2]=r;s=f[p+(f[m+(q*12|0)+4>>2]<<2)>>2]|0;f[c>>2]=s;t=f[p+(f[m+(q*12|0)+8>>2]<<2)>>2]|0;f[n>>2]=t;f[o+(q*12|0)>>2]=r;f[o+(q*12|0)+4>>2]=s;f[o+(q*12|0)+8>>2]=t;q=q+1|0}while(q>>>0<k>>>0)}while(0);Cj(a,e);a=f[e>>2]|0;if(a|0){e=f[l>>2]|0;if((e|0)!=(a|0))f[l>>2]=e+(~(((e+-12-a|0)>>>0)/12|0)*12|0);br(a)}u=d;return}function Oe(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0;c=u;u=u+16|0;d=c;f[a>>2]=0;f[a+8>>2]=b;rn(a+12|0);to(a+44|0);to(a+64|0);to(a+84|0);e=a+104|0;f[e>>2]=0;g=a+108|0;f[g>>2]=0;f[a+112>>2]=0;h=(b|0)==0;do if(!h)if(b>>>0>1073741823)mq(e);else{i=b<<2;j=dn(i)|0;f[e>>2]=j;k=j+(b<<2)|0;f[a+112>>2]=k;hj(j|0,0,i|0)|0;f[g>>2]=k;break}while(0);g=a+116|0;f[g>>2]=0;e=a+120|0;f[e>>2]=0;f[a+124>>2]=0;if(!h){k=b<<2;i=dn(k)|0;f[g>>2]=i;g=i+(b<<2)|0;f[a+124>>2]=g;hj(i|0,0,k|0)|0;f[e>>2]=g}g=a+128|0;f[g>>2]=0;e=a+132|0;f[e>>2]=0;f[a+136>>2]=0;if(!h){k=b<<2;i=dn(k)|0;f[g>>2]=i;g=i+(b<<2)|0;f[a+136>>2]=g;hj(i|0,0,k|0)|0;f[e>>2]=g}g=b<<5|1;f[d>>2]=0;e=d+4|0;f[e>>2]=0;f[d+8>>2]=0;if(!h){k=b<<2;i=dn(k)|0;f[d>>2]=i;j=i+(b<<2)|0;f[d+8>>2]=j;hj(i|0,0,k|0)|0;f[e>>2]=j}fk(a+140|0,g,d);j=f[d>>2]|0;if(j|0){k=f[e>>2]|0;if((k|0)!=(j|0))f[e>>2]=k+(~((k+-4-j|0)>>>2)<<2);br(j)}f[d>>2]=0;j=d+4|0;f[j>>2]=0;f[d+8>>2]=0;if(!h){h=b<<2;k=dn(h)|0;f[d>>2]=k;e=k+(b<<2)|0;f[d+8>>2]=e;hj(k|0,0,h|0)|0;f[j>>2]=e}fk(a+152|0,g,d);g=f[d>>2]|0;if(!g){u=c;return}d=f[j>>2]|0;if((d|0)!=(g|0))f[j>>2]=d+(~((d+-4-g|0)>>>2)<<2);br(g);u=c;return}function Pe(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0;c=u;u=u+16|0;d=c;f[a>>2]=0;f[a+8>>2]=b;to(a+12|0);to(a+32|0);to(a+52|0);to(a+72|0);e=a+92|0;f[e>>2]=0;g=a+96|0;f[g>>2]=0;f[a+100>>2]=0;h=(b|0)==0;do if(!h)if(b>>>0>1073741823)mq(e);else{i=b<<2;j=dn(i)|0;f[e>>2]=j;k=j+(b<<2)|0;f[a+100>>2]=k;hj(j|0,0,i|0)|0;f[g>>2]=k;break}while(0);g=a+104|0;f[g>>2]=0;e=a+108|0;f[e>>2]=0;f[a+112>>2]=0;if(!h){k=b<<2;i=dn(k)|0;f[g>>2]=i;g=i+(b<<2)|0;f[a+112>>2]=g;hj(i|0,0,k|0)|0;f[e>>2]=g}g=a+116|0;f[g>>2]=0;e=a+120|0;f[e>>2]=0;f[a+124>>2]=0;if(!h){k=b<<2;i=dn(k)|0;f[g>>2]=i;g=i+(b<<2)|0;f[a+124>>2]=g;hj(i|0,0,k|0)|0;f[e>>2]=g}g=b<<5|1;f[d>>2]=0;e=d+4|0;f[e>>2]=0;f[d+8>>2]=0;if(!h){k=b<<2;i=dn(k)|0;f[d>>2]=i;j=i+(b<<2)|0;f[d+8>>2]=j;hj(i|0,0,k|0)|0;f[e>>2]=j}fk(a+128|0,g,d);j=f[d>>2]|0;if(j|0){k=f[e>>2]|0;if((k|0)!=(j|0))f[e>>2]=k+(~((k+-4-j|0)>>>2)<<2);br(j)}f[d>>2]=0;j=d+4|0;f[j>>2]=0;f[d+8>>2]=0;if(!h){h=b<<2;k=dn(h)|0;f[d>>2]=k;e=k+(b<<2)|0;f[d+8>>2]=e;hj(k|0,0,h|0)|0;f[j>>2]=e}fk(a+140|0,g,d);g=f[d>>2]|0;if(!g){u=c;return}d=f[j>>2]|0;if((d|0)!=(g|0))f[j>>2]=d+(~((d+-4-g|0)>>>2)<<2);br(g);u=c;return}function Qe(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0;d=dn(40)|0;e=d+16|0;dj(e,c);dj(d+28|0,c+12|0);c=a+4|0;g=f[c>>2]|0;do if(g){h=b[d+27>>0]|0;i=h<<24>>24<0;j=i?f[d+20>>2]|0:h&255;h=i?f[e>>2]|0:e;i=g;while(1){k=i+16|0;l=b[k+11>>0]|0;m=l<<24>>24<0;n=m?f[i+20>>2]|0:l&255;l=n>>>0<j>>>0?n:j;if((l|0)!=0?(o=Pk(h,m?f[k>>2]|0:k,l)|0,(o|0)!=0):0)if((o|0)<0)p=7;else p=9;else if(j>>>0<n>>>0)p=7;else p=9;if((p|0)==7){p=0;n=f[i>>2]|0;if(!n){p=8;break}else q=n}else if((p|0)==9){p=0;r=i+4|0;n=f[r>>2]|0;if(!n){p=11;break}else q=n}i=q}if((p|0)==8){s=i;t=i;break}else if((p|0)==11){s=i;t=r;break}}else{s=c;t=c}while(0);f[d>>2]=0;f[d+4>>2]=0;f[d+8>>2]=s;f[t>>2]=d;s=f[f[a>>2]>>2]|0;if(!s){u=d;v=a+4|0;w=f[v>>2]|0;Ae(w,u);x=a+8|0;y=f[x>>2]|0;z=y+1|0;f[x>>2]=z;return d|0}f[a>>2]=s;u=f[t>>2]|0;v=a+4|0;w=f[v>>2]|0;Ae(w,u);x=a+8|0;y=f[x>>2]|0;z=y+1|0;f[x>>2]=z;return d|0}function Re(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=Oa,B=Oa;g=u;u=u+16|0;h=g;i=b[d+24>>0]|0;j=i<<24>>24;Bh(a,c,e,j,0,d,1);k=f[a>>2]|0;a=(f[f[k>>2]>>2]|0)+(f[k+48>>2]|0)|0;k=f[c+4>>2]|0;sq(h);yo(h,$(n[c+20>>2]),(1<<k)+-1|0);k=_q(j>>>0>1073741823?-1:j<<2)|0;if(!e){$q(k);u=g;return}l=d+68|0;m=d+48|0;o=d+40|0;p=c+8|0;c=(b[d+84>>0]|0)==0;if(i<<24>>24>0){q=0;r=0}else{i=0;do{if(c)s=f[(f[l>>2]|0)+(i<<2)>>2]|0;else s=i;t=m;v=f[t>>2]|0;w=f[t+4>>2]|0;t=o;x=f[t>>2]|0;y=on(x|0,f[t+4>>2]|0,s|0,0)|0;t=Tn(y|0,I|0,v|0,w|0)|0;Rg(k|0,(f[f[d>>2]>>2]|0)+t|0,x|0)|0;i=i+1|0}while((i|0)!=(e|0));$q(k);u=g;return}while(1){if(c)z=f[(f[l>>2]|0)+(r<<2)>>2]|0;else z=r;i=m;s=f[i>>2]|0;x=f[i+4>>2]|0;i=o;t=f[i>>2]|0;w=on(t|0,f[i+4>>2]|0,z|0,0)|0;i=Tn(w|0,I|0,s|0,x|0)|0;Rg(k|0,(f[f[d>>2]>>2]|0)+i|0,t|0)|0;t=f[p>>2]|0;A=$(n[h>>2]);i=0;x=q;while(1){B=$(n[k+(i<<2)>>2]);s=~~$(J($($(A*$(B-$(n[t+(i<<2)>>2])))+$(.5))));f[a+(x<<2)>>2]=s;i=i+1|0;if((i|0)==(j|0))break;else x=x+1|0}r=r+1|0;if((r|0)==(e|0))break;else q=q+j|0}$q(k);u=g;return}function Se(a){a=a|0;var b=0,c=0,d=0;f[a>>2]=3340;ii(a+200|0);b=f[a+184>>2]|0;if(b|0){c=a+188|0;d=f[c>>2]|0;if((d|0)!=(b|0))f[c>>2]=d+(~((d+-4-b|0)>>>2)<<2);br(b)}_i(a+172|0);b=f[a+152>>2]|0;if(b|0){d=a+156|0;c=f[d>>2]|0;if((c|0)!=(b|0))f[d>>2]=c+(~((c+-4-b|0)>>>2)<<2);br(b)}b=f[a+140>>2]|0;if(b|0)br(b);b=f[a+128>>2]|0;if(b|0){c=b;do{b=c;c=f[c>>2]|0;br(b)}while((c|0)!=0)}c=a+120|0;b=f[c>>2]|0;f[c>>2]=0;if(b|0)br(b);b=f[a+108>>2]|0;if(b|0){c=a+112|0;d=f[c>>2]|0;if((d|0)!=(b|0))f[c>>2]=d+(~(((d+-12-b|0)>>>0)/12|0)*12|0);br(b)}b=f[a+96>>2]|0;if(b|0){d=a+100|0;c=f[d>>2]|0;if((c|0)!=(b|0))f[d>>2]=c+(~((c+-4-b|0)>>>2)<<2);br(b)}b=f[a+84>>2]|0;if(b|0)br(b);b=f[a+72>>2]|0;if(b|0){c=a+76|0;d=f[c>>2]|0;if((d|0)!=(b|0))f[c>>2]=d+(~((d+-4-b|0)>>>2)<<2);br(b)}b=f[a+52>>2]|0;if(b|0){d=a+56|0;c=f[d>>2]|0;if((c|0)!=(b|0))f[d>>2]=c+(~((c+-4-b|0)>>>2)<<2);br(b)}b=f[a+40>>2]|0;if(b|0){c=a+44|0;d=f[c>>2]|0;if((d|0)!=(b|0))f[c>>2]=d+(~((d+-4-b|0)>>>2)<<2);br(b)}b=f[a+28>>2]|0;if(b|0)br(b);b=f[a+16>>2]|0;if(b|0){d=a+20|0;c=f[d>>2]|0;if((c|0)!=(b|0))f[d>>2]=c+(~((c+-4-b|0)>>>2)<<2);br(b)}b=a+12|0;a=f[b>>2]|0;f[b>>2]=0;if(!a)return;ui(a);br(a);return}function Te(a){a=a|0;var b=0,c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;b=a+140|0;c=f[b>>2]|0;if(c|0){d=a+144|0;e=f[d>>2]|0;if((e|0)==(c|0))g=c;else{h=e;while(1){e=h+-12|0;f[d>>2]=e;i=f[e>>2]|0;if(!i)j=e;else{e=h+-8|0;k=f[e>>2]|0;if((k|0)!=(i|0))f[e>>2]=k+(~((k+-4-i|0)>>>2)<<2);br(i);j=f[d>>2]|0}if((j|0)==(c|0))break;else h=j}g=f[b>>2]|0}br(g)}g=a+128|0;b=f[g>>2]|0;if(b|0){j=a+132|0;h=f[j>>2]|0;if((h|0)==(b|0))l=b;else{c=h;while(1){h=c+-12|0;f[j>>2]=h;d=f[h>>2]|0;if(!d)m=h;else{h=c+-8|0;i=f[h>>2]|0;if((i|0)!=(d|0))f[h>>2]=i+(~((i+-4-d|0)>>>2)<<2);br(d);m=f[j>>2]|0}if((m|0)==(b|0))break;else c=m}l=f[g>>2]|0}br(l)}l=f[a+116>>2]|0;if(l|0){g=a+120|0;m=f[g>>2]|0;if((m|0)!=(l|0))f[g>>2]=m+(~((m+-4-l|0)>>>2)<<2);br(l)}l=f[a+104>>2]|0;if(l|0){m=a+108|0;g=f[m>>2]|0;if((g|0)!=(l|0))f[m>>2]=g+(~((g+-4-l|0)>>>2)<<2);br(l)}l=f[a+92>>2]|0;if(!l){n=a+72|0;dl(n);o=a+52|0;dl(o);p=a+32|0;dl(p);q=a+12|0;dl(q);return}g=a+96|0;m=f[g>>2]|0;if((m|0)!=(l|0))f[g>>2]=m+(~((m+-4-l|0)>>>2)<<2);br(l);n=a+72|0;dl(n);o=a+52|0;dl(o);p=a+32|0;dl(p);q=a+12|0;dl(q);return}function Ue(a){a=a|0;var b=0,c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;b=a+152|0;c=f[b>>2]|0;if(c|0){d=a+156|0;e=f[d>>2]|0;if((e|0)==(c|0))g=c;else{h=e;while(1){e=h+-12|0;f[d>>2]=e;i=f[e>>2]|0;if(!i)j=e;else{e=h+-8|0;k=f[e>>2]|0;if((k|0)!=(i|0))f[e>>2]=k+(~((k+-4-i|0)>>>2)<<2);br(i);j=f[d>>2]|0}if((j|0)==(c|0))break;else h=j}g=f[b>>2]|0}br(g)}g=a+140|0;b=f[g>>2]|0;if(b|0){j=a+144|0;h=f[j>>2]|0;if((h|0)==(b|0))l=b;else{c=h;while(1){h=c+-12|0;f[j>>2]=h;d=f[h>>2]|0;if(!d)m=h;else{h=c+-8|0;i=f[h>>2]|0;if((i|0)!=(d|0))f[h>>2]=i+(~((i+-4-d|0)>>>2)<<2);br(d);m=f[j>>2]|0}if((m|0)==(b|0))break;else c=m}l=f[g>>2]|0}br(l)}l=f[a+128>>2]|0;if(l|0){g=a+132|0;m=f[g>>2]|0;if((m|0)!=(l|0))f[g>>2]=m+(~((m+-4-l|0)>>>2)<<2);br(l)}l=f[a+116>>2]|0;if(l|0){m=a+120|0;g=f[m>>2]|0;if((g|0)!=(l|0))f[m>>2]=g+(~((g+-4-l|0)>>>2)<<2);br(l)}l=f[a+104>>2]|0;if(!l){n=a+84|0;dl(n);o=a+64|0;dl(o);p=a+44|0;dl(p);q=a+12|0;tj(q);return}g=a+108|0;m=f[g>>2]|0;if((m|0)!=(l|0))f[g>>2]=m+(~((m+-4-l|0)>>>2)<<2);br(l);n=a+84|0;dl(n);o=a+64|0;dl(o);p=a+44|0;dl(p);q=a+12|0;tj(q);return}function Ve(a){a=a|0;var b=0,c=0,d=0;f[a>>2]=3080;jj(a+200|0);b=f[a+184>>2]|0;if(b|0){c=a+188|0;d=f[c>>2]|0;if((d|0)!=(b|0))f[c>>2]=d+(~((d+-4-b|0)>>>2)<<2);br(b)}_i(a+172|0);b=f[a+152>>2]|0;if(b|0){d=a+156|0;c=f[d>>2]|0;if((c|0)!=(b|0))f[d>>2]=c+(~((c+-4-b|0)>>>2)<<2);br(b)}b=f[a+140>>2]|0;if(b|0)br(b);b=f[a+128>>2]|0;if(b|0){c=b;do{b=c;c=f[c>>2]|0;br(b)}while((c|0)!=0)}c=a+120|0;b=f[c>>2]|0;f[c>>2]=0;if(b|0)br(b);b=f[a+108>>2]|0;if(b|0){c=a+112|0;d=f[c>>2]|0;if((d|0)!=(b|0))f[c>>2]=d+(~(((d+-12-b|0)>>>0)/12|0)*12|0);br(b)}b=f[a+96>>2]|0;if(b|0){d=a+100|0;c=f[d>>2]|0;if((c|0)!=(b|0))f[d>>2]=c+(~((c+-4-b|0)>>>2)<<2);br(b)}b=f[a+84>>2]|0;if(b|0)br(b);b=f[a+72>>2]|0;if(b|0){c=a+76|0;d=f[c>>2]|0;if((d|0)!=(b|0))f[c>>2]=d+(~((d+-4-b|0)>>>2)<<2);br(b)}b=f[a+52>>2]|0;if(b|0){d=a+56|0;c=f[d>>2]|0;if((c|0)!=(b|0))f[d>>2]=c+(~((c+-4-b|0)>>>2)<<2);br(b)}b=f[a+40>>2]|0;if(b|0){c=a+44|0;d=f[c>>2]|0;if((d|0)!=(b|0))f[c>>2]=d+(~((d+-4-b|0)>>>2)<<2);br(b)}b=f[a+28>>2]|0;if(b|0)br(b);b=f[a+16>>2]|0;if(b|0){d=a+20|0;c=f[d>>2]|0;if((c|0)!=(b|0))f[d>>2]=c+(~((c+-4-b|0)>>>2)<<2);br(b)}b=a+12|0;a=f[b>>2]|0;f[b>>2]=0;if(!a)return;ui(a);br(a);return}function We(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;c=u;u=u+48|0;d=c+44|0;e=c+40|0;g=c+36|0;h=c+32|0;i=c;f[h>>2]=f[a+60>>2];j=b+16|0;k=j;l=f[k+4>>2]|0;if(!((l|0)>0|(l|0)==0&(f[k>>2]|0)>>>0>0)){f[e>>2]=f[b+4>>2];f[d>>2]=f[e>>2];ye(b,d,h,h+4|0)|0}rn(i);lk(i);if((f[h>>2]|0)>0){k=a+56|0;l=1;m=0;do{n=l;l=(f[(f[k>>2]|0)+(m>>>5<<2)>>2]&1<<(m&31)|0)!=0;Vi(i,n^l^1);m=m+1|0}while((m|0)<(f[h>>2]|0))}fd(i,b);f[g>>2]=f[a+12>>2];h=j;m=f[h>>2]|0;l=f[h+4>>2]|0;if((l|0)>0|(l|0)==0&m>>>0>0){o=l;p=m}else{f[e>>2]=f[b+4>>2];f[d>>2]=f[e>>2];ye(b,d,g,g+4|0)|0;m=j;o=f[m+4>>2]|0;p=f[m>>2]|0}f[g>>2]=f[a+20>>2];if((o|0)>0|(o|0)==0&p>>>0>0){tj(i);u=c;return 1}f[e>>2]=f[b+4>>2];f[d>>2]=f[e>>2];ye(b,d,g,g+4|0)|0;tj(i);u=c;return 1}function Xe(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;d=f[c>>2]|0;c=f[d>>2]|0;e=f[a+4>>2]|0;g=f[d+4>>2]|0;h=e+-1|0;i=(h&e|0)==0;if(!i)if(g>>>0<e>>>0)j=g;else j=(g>>>0)%(e>>>0)|0;else j=h&g;g=(f[a>>2]|0)+(j<<2)|0;k=f[g>>2]|0;while(1){l=f[k>>2]|0;if((l|0)==(d|0))break;else k=l}if((k|0)!=(a+8|0)){l=f[k+4>>2]|0;if(!i)if(l>>>0<e>>>0)m=l;else m=(l>>>0)%(e>>>0)|0;else m=l&h;if((m|0)==(j|0)){n=c;o=21}else o=13}else o=13;do if((o|0)==13){if(c|0){m=f[c+4>>2]|0;if(!i)if(m>>>0<e>>>0)p=m;else p=(m>>>0)%(e>>>0)|0;else p=m&h;if((p|0)==(j|0)){q=c;r=c;o=22;break}}f[g>>2]=0;n=f[d>>2]|0;o=21}while(0);if((o|0)==21){g=n;if(!n)s=g;else{q=n;r=g;o=22}}if((o|0)==22){o=f[q+4>>2]|0;if(!i)if(o>>>0<e>>>0)t=o;else t=(o>>>0)%(e>>>0)|0;else t=o&h;if((t|0)==(j|0))s=r;else{f[(f[a>>2]|0)+(t<<2)>>2]=k;s=f[d>>2]|0}}f[k>>2]=s;f[d>>2]=0;s=a+12|0;f[s>>2]=(f[s>>2]|0)+-1;if(!d)return c|0;s=d+8|0;a=f[d+20>>2]|0;if(a|0){k=d+24|0;if((f[k>>2]|0)!=(a|0))f[k>>2]=a;br(a)}if((b[s+11>>0]|0)<0)br(f[s>>2]|0);br(d);return c|0}function Ye(a){a=a|0;var b=0,c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0;b=u;u=u+16|0;c=b+4|0;d=b;f[c>>2]=0;e=c+4|0;f[e>>2]=0;f[c+8>>2]=0;g=a+56|0;h=f[g>>2]|0;i=(f[h+100>>2]|0)-(f[h+96>>2]|0)|0;j=(i|0)/12|0;if(!i){k=0;l=0}else{i=c+8|0;m=0;n=0;o=h;h=0;p=0;while(1){q=f[o+96>>2]|0;r=f[q+(n*12|0)>>2]|0;s=r-m|0;t=((s|0)>-1?s:0-s|0)<<1|s>>>31;f[d>>2]=t;if((h|0)==(p|0)){Ci(c,d);v=f[e>>2]|0;w=f[i>>2]|0}else{f[h>>2]=t;t=h+4|0;f[e>>2]=t;v=t;w=p}t=f[q+(n*12|0)+4>>2]|0;s=t-r|0;r=((s|0)>-1?s:0-s|0)<<1|s>>>31;f[d>>2]=r;if((v|0)==(w|0)){Ci(c,d);x=f[e>>2]|0;y=f[i>>2]|0}else{f[v>>2]=r;r=v+4|0;f[e>>2]=r;x=r;y=w}r=f[q+(n*12|0)+8>>2]|0;q=r-t|0;t=((q|0)>-1?q:0-q|0)<<1|q>>>31;f[d>>2]=t;if((x|0)==(y|0))Ci(c,d);else{f[x>>2]=t;f[e>>2]=x+4}t=n+1|0;if(t>>>0>=j>>>0)break;m=r;n=t;o=f[g>>2]|0;h=f[e>>2]|0;p=f[i>>2]|0}k=f[c>>2]|0;l=f[e>>2]|0}Dc(k,l-k>>2,1,0,f[a+44>>2]|0)|0;a=f[c>>2]|0;if(!a){u=b;return 1}c=f[e>>2]|0;if((c|0)!=(a|0))f[e>>2]=c+(~((c+-4-a|0)>>>2)<<2);br(a);u=b;return 1}function Ze(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;d=f[a+12>>2]|0;e=a+108|0;g=f[e>>2]|0;h=f[g+80>>2]|0;b[c+84>>0]=0;i=c+68|0;j=c+72|0;k=f[j>>2]|0;l=f[i>>2]|0;m=k-l>>2;n=l;l=k;if(h>>>0<=m>>>0)if(h>>>0<m>>>0?(k=n+(h<<2)|0,(k|0)!=(l|0)):0){f[j>>2]=l+(~((l+-4-k|0)>>>2)<<2);o=g;p=h}else{o=g;p=h}else{kh(i,h-m|0,3220);m=f[e>>2]|0;o=m;p=f[m+80>>2]|0}m=(f[o+100>>2]|0)-(f[o+96>>2]|0)|0;e=(m|0)/12|0;if(!m){q=1;return q|0}m=a+112|0;a=c+68|0;c=f[o+96>>2]|0;o=0;while(1){h=o*3|0;if((h|0)==-1){q=0;r=12;break}i=f[d>>2]|0;g=f[i+(h<<2)>>2]|0;if((g|0)==-1){q=0;r=12;break}k=f[(f[m>>2]|0)+12>>2]|0;l=f[k+(g<<2)>>2]|0;if(l>>>0>=p>>>0){q=0;r=12;break}g=f[a>>2]|0;f[g+(f[c+(o*12|0)>>2]<<2)>>2]=l;l=h+1|0;if((l|0)==-1){q=0;r=12;break}j=f[i+(l<<2)>>2]|0;if((j|0)==-1){q=0;r=12;break}l=f[k+(j<<2)>>2]|0;if(l>>>0>=p>>>0){q=0;r=12;break}f[g+(f[c+(o*12|0)+4>>2]<<2)>>2]=l;l=h+2|0;if((l|0)==-1){q=0;r=12;break}h=f[i+(l<<2)>>2]|0;if((h|0)==-1){q=0;r=12;break}l=f[k+(h<<2)>>2]|0;if(l>>>0>=p>>>0){q=0;r=12;break}f[g+(f[c+(o*12|0)+8>>2]<<2)>>2]=l;o=o+1|0;if(o>>>0>=e>>>0){q=1;r=12;break}}if((r|0)==12)return q|0;return 0}function _e(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;c=u;u=u+48|0;d=c+44|0;e=c+40|0;g=c+36|0;h=c+32|0;i=c;f[h>>2]=f[a+80>>2];j=b+16|0;k=j;l=f[k+4>>2]|0;if(!((l|0)>0|(l|0)==0&(f[k>>2]|0)>>>0>0)){f[e>>2]=f[b+4>>2];f[d>>2]=f[e>>2];ye(b,d,h,h+4|0)|0}rn(i);lk(i);if((f[h>>2]|0)>0){k=a+76|0;l=1;m=0;do{n=l;l=(f[(f[k>>2]|0)+(m>>>5<<2)>>2]&1<<(m&31)|0)!=0;Vi(i,n^l^1);m=m+1|0}while((m|0)<(f[h>>2]|0))}fd(i,b);f[g>>2]=f[a+12>>2];h=j;m=f[h>>2]|0;l=f[h+4>>2]|0;if((l|0)>0|(l|0)==0&m>>>0>0){o=l;p=m}else{f[e>>2]=f[b+4>>2];f[d>>2]=f[e>>2];ye(b,d,g,g+4|0)|0;m=j;o=f[m+4>>2]|0;p=f[m>>2]|0}f[g>>2]=f[a+16>>2];if((o|0)>0|(o|0)==0&p>>>0>0){tj(i);u=c;return 1}f[e>>2]=f[b+4>>2];f[d>>2]=f[e>>2];ye(b,d,g,g+4|0)|0;tj(i);u=c;return 1}function $e(a){a=a|0;var b=0,c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;b=u;u=u+16|0;c=b+4|0;d=b;e=a+8|0;g=a+12|0;h=f[g>>2]|0;$j(f[a+4>>2]|0,(f[h+28>>2]|0)-(f[h+24>>2]|0)>>2);h=a+96|0;i=f[g>>2]|0;j=(f[i+28>>2]|0)-(f[i+24>>2]|0)>>2;f[c>>2]=0;i=a+100|0;k=f[i>>2]|0;l=f[h>>2]|0;m=k-l>>2;n=l;l=k;if(j>>>0<=m>>>0){if(j>>>0<m>>>0?(k=n+(j<<2)|0,(k|0)!=(l|0)):0)f[i>>2]=l+(~((l+-4-k|0)>>>2)<<2)}else kh(h,j-m|0,c);m=a+116|0;a=f[m>>2]|0;if(!a){j=f[g>>2]|0;g=(f[j+4>>2]|0)-(f[j>>2]|0)>>2;j=(g>>>0)/3|0;if(g>>>0<=2){o=1;u=b;return o|0}g=0;while(1){f[d>>2]=g*3;f[c>>2]=f[d>>2];g=g+1|0;if(!(vb(e,c)|0)){o=0;p=15;break}if((g|0)>=(j|0)){o=1;p=15;break}}if((p|0)==15){u=b;return o|0}}else{j=f[a>>2]|0;if((f[a+4>>2]|0)==(j|0)){o=1;u=b;return o|0}a=0;g=j;while(1){f[d>>2]=f[g+(a<<2)>>2];f[c>>2]=f[d>>2];a=a+1|0;if(!(vb(e,c)|0)){o=0;p=15;break}j=f[m>>2]|0;g=f[j>>2]|0;if(a>>>0>=(f[j+4>>2]|0)-g>>2>>>0){o=1;p=15;break}}if((p|0)==15){u=b;return o|0}}return 0}function af(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;d=f[a+12>>2]|0;e=a+68|0;g=f[e>>2]|0;h=f[g+80>>2]|0;b[c+84>>0]=0;i=c+68|0;j=c+72|0;k=f[j>>2]|0;l=f[i>>2]|0;m=k-l>>2;n=l;l=k;if(h>>>0<=m>>>0)if(h>>>0<m>>>0?(k=n+(h<<2)|0,(k|0)!=(l|0)):0){f[j>>2]=l+(~((l+-4-k|0)>>>2)<<2);o=g;p=h}else{o=g;p=h}else{kh(i,h-m|0,3220);m=f[e>>2]|0;o=m;p=f[m+80>>2]|0}m=(f[o+100>>2]|0)-(f[o+96>>2]|0)|0;e=(m|0)/12|0;if(!m){q=1;return q|0}m=a+72|0;a=c+68|0;c=f[o+96>>2]|0;o=0;while(1){h=o*3|0;if((h|0)==-1){q=0;r=12;break}i=f[d>>2]|0;g=f[i+(h<<2)>>2]|0;if((g|0)==-1){q=0;r=12;break}k=f[(f[m>>2]|0)+12>>2]|0;l=f[k+(g<<2)>>2]|0;if(l>>>0>=p>>>0){q=0;r=12;break}g=f[a>>2]|0;f[g+(f[c+(o*12|0)>>2]<<2)>>2]=l;l=h+1|0;if((l|0)==-1){q=0;r=12;break}j=f[i+(l<<2)>>2]|0;if((j|0)==-1){q=0;r=12;break}l=f[k+(j<<2)>>2]|0;if(l>>>0>=p>>>0){q=0;r=12;break}f[g+(f[c+(o*12|0)+4>>2]<<2)>>2]=l;l=h+2|0;if((l|0)==-1){q=0;r=12;break}h=f[i+(l<<2)>>2]|0;if((h|0)==-1){q=0;r=12;break}l=f[k+(h<<2)>>2]|0;if(l>>>0>=p>>>0){q=0;r=12;break}f[g+(f[c+(o*12|0)+8>>2]<<2)>>2]=l;o=o+1|0;if(o>>>0>=e>>>0){q=1;r=12;break}}if((r|0)==12)return q|0;return 0}function bf(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;c=u;u=u+16|0;d=c+12|0;e=c+8|0;g=c+4|0;h=c;if(!b){i=dn(76)|0;j=dn(12)|0;k=f[(f[a+4>>2]|0)+80>>2]|0;f[j+4>>2]=0;f[j>>2]=3584;f[j+8>>2]=k;f[h>>2]=j;ml(i,h,0);j=i;f[g>>2]=j;i=a+12|0;k=f[i>>2]|0;if(k>>>0<(f[a+16>>2]|0)>>>0){f[g>>2]=0;f[k>>2]=j;f[i>>2]=k+4;l=g}else{yg(a+8|0,g);l=g}g=f[l>>2]|0;f[l>>2]=0;if(g|0)Va[f[(f[g>>2]|0)+4>>2]&127](g);g=f[h>>2]|0;f[h>>2]=0;if(!g){u=c;return 1}Va[f[(f[g>>2]|0)+4>>2]&127](g);u=c;return 1}g=f[f[a+8>>2]>>2]|0;f[d>>2]=b;a=g+4|0;h=g+8|0;l=f[h>>2]|0;if((l|0)==(f[g+12>>2]|0))Ci(a,d);else{f[l>>2]=b;f[h>>2]=l+4}l=f[d>>2]|0;b=g+16|0;k=g+20|0;g=f[k>>2]|0;i=f[b>>2]|0;j=g-i>>2;m=i;if((l|0)<(j|0)){n=m;o=l}else{i=l+1|0;f[e>>2]=-1;p=g;if(i>>>0<=j>>>0)if(i>>>0<j>>>0?(g=m+(i<<2)|0,(g|0)!=(p|0)):0){f[k>>2]=p+(~((p+-4-g|0)>>>2)<<2);q=l;r=m}else{q=l;r=m}else{kh(b,i-j|0,e);q=f[d>>2]|0;r=f[b>>2]|0}n=r;o=q}f[n+(o<<2)>>2]=((f[h>>2]|0)-(f[a>>2]|0)>>2)+-1;u=c;return 1}function cf(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;d=a+8|0;e=f[d>>2]|0;g=f[a>>2]|0;h=g;do if(e-g>>3>>>0>=b>>>0){i=a+4|0;j=f[i>>2]|0;k=j-g>>3;l=k>>>0<b>>>0;m=l?k:b;n=j;if(m|0){j=m;m=h;while(1){o=c;p=f[o+4>>2]|0;q=m;f[q>>2]=f[o>>2];f[q+4>>2]=p;j=j+-1|0;if(!j)break;else m=m+8|0}}if(!l){m=h+(b<<3)|0;if((m|0)==(n|0))return;else{r=i;s=n+(~((n+-8-m|0)>>>3)<<3)|0;break}}else{m=b-k|0;j=m;p=n;while(1){q=c;o=f[q+4>>2]|0;t=p;f[t>>2]=f[q>>2];f[t+4>>2]=o;j=j+-1|0;if(!j)break;else p=p+8|0}r=i;s=n+(m<<3)|0;break}}else{p=g;if(!g)u=e;else{j=a+4|0;k=f[j>>2]|0;if((k|0)!=(h|0))f[j>>2]=k+(~((k+-8-g|0)>>>3)<<3);br(p);f[d>>2]=0;f[j>>2]=0;f[a>>2]=0;u=0}if(b>>>0>536870911)mq(a);j=u>>2;p=u>>3>>>0<268435455?(j>>>0<b>>>0?b:j):536870911;if(p>>>0>536870911)mq(a);j=dn(p<<3)|0;k=a+4|0;f[k>>2]=j;f[a>>2]=j;f[d>>2]=j+(p<<3);p=b;l=j;while(1){o=c;t=f[o+4>>2]|0;q=l;f[q>>2]=f[o>>2];f[q+4>>2]=t;p=p+-1|0;if(!p)break;else l=l+8|0}r=k;s=j+(b<<3)|0}while(0);f[r>>2]=s;return}function df(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0.0,g=0.0,h=0.0,i=0.0,j=0.0,k=0,l=0,m=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;e=+$(n[b>>2]);g=+K(+e);h=+$(n[b+4>>2]);i=g+ +K(+h);g=+$(n[b+8>>2]);j=i+ +K(+g);b=j>1.0e-06;i=1.0/j;k=f[a+12>>2]|0;j=+(k|0);l=~~+J(+((b?i*e:1.0)*j+.5));m=~~+J(+((b?i*h:0.0)*j+.5));o=(l|0)>-1;p=k-(o?l:0-l|0)-((m|0)>-1?m:0-m|0)|0;l=(p|0)<0;q=(l?((m|0)>0?p:0-p|0):0)+m|0;m=l?0:p;p=(b?i*g:0.0)<0.0?0-m|0:m;do if(!o){if((q|0)<0)r=(p|0)>-1?p:0-p|0;else r=(f[a+8>>2]|0)-((p|0)>-1?p:0-p|0)|0;if((p|0)<0){s=(q|0)>-1?q:0-q|0;t=r;break}else{s=(f[a+8>>2]|0)-((q|0)>-1?q:0-q|0)|0;t=r;break}}else{s=k+p|0;t=k+q|0}while(0);q=(t|0)==0;p=(s|0)==0;r=f[a+8>>2]|0;if(!(s|t)){u=r;v=r;f[c>>2]=u;f[d>>2]=v;return}a=(r|0)==(s|0);if(q&a){u=s;v=s;f[c>>2]=u;f[d>>2]=v;return}o=(r|0)==(t|0);if(p&o){u=t;v=t;f[c>>2]=u;f[d>>2]=v;return}if(q&(k|0)<(s|0)){u=0;v=(k<<1)-s|0;f[c>>2]=u;f[d>>2]=v;return}if(o&(k|0)>(s|0)){u=t;v=(k<<1)-s|0;f[c>>2]=u;f[d>>2]=v;return}if(a&(k|0)>(t|0)){u=(k<<1)-t|0;v=s;f[c>>2]=u;f[d>>2]=v;return}if(!p){u=t;v=s;f[c>>2]=u;f[d>>2]=v;return}u=(k|0)<(t|0)?(k<<1)-t|0:t;v=0;f[c>>2]=u;f[d>>2]=v;return}function ef(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;c=a+4|0;d=b+4|0;f[c>>2]=f[d>>2];f[c+4>>2]=f[d+4>>2];f[c+8>>2]=f[d+8>>2];f[c+12>>2]=f[d+12>>2];f[c+16>>2]=f[d+16>>2];d=a+24|0;c=b+24|0;if((a|0)==(b|0))return a|0;e=b+28|0;g=f[e>>2]|0;if(!g)h=0;else{i=a+32|0;do if(g>>>0>f[i>>2]<<5>>>0){j=f[d>>2]|0;if(!j)k=g;else{br(j);f[d>>2]=0;f[i>>2]=0;f[a+28>>2]=0;k=f[e>>2]|0}if((k|0)<0)mq(d);else{j=((k+-1|0)>>>5)+1|0;l=dn(j<<2)|0;f[d>>2]=l;f[a+28>>2]=0;f[i>>2]=j;m=f[e>>2]|0;n=l;break}}else{m=g;n=f[d>>2]|0}while(0);Xl(n|0,f[c>>2]|0,((m+-1|0)>>>5<<2)+4|0)|0;h=f[e>>2]|0}f[a+28>>2]=h;h=a+36|0;e=b+36|0;m=b+40|0;b=f[m>>2]|0;if(!b)o=0;else{c=a+44|0;do if(b>>>0>f[c>>2]<<5>>>0){n=f[h>>2]|0;if(!n)p=b;else{br(n);f[h>>2]=0;f[c>>2]=0;f[a+40>>2]=0;p=f[m>>2]|0}if((p|0)<0)mq(h);else{n=((p+-1|0)>>>5)+1|0;d=dn(n<<2)|0;f[h>>2]=d;f[a+40>>2]=0;f[c>>2]=n;q=f[m>>2]|0;r=d;break}}else{q=b;r=f[h>>2]|0}while(0);Xl(r|0,f[e>>2]|0,((q+-1|0)>>>5<<2)+4|0)|0;o=f[m>>2]|0}f[a+40>>2]=o;return a|0}function ff(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0;g=u;u=u+32|0;h=g+12|0;i=g;f[a>>2]=f[d>>2];d=a+4|0;f[d>>2]=(f[c>>2]|0)-(f[b>>2]|0);j=e+16|0;k=j;l=f[k+4>>2]|0;if(!((l|0)>0|(l|0)==0&(f[k>>2]|0)>>>0>0)?(k=e+4|0,f[i>>2]=f[k>>2],f[h>>2]=f[i>>2],ye(e,h,a,a+4|0)|0,l=j,j=f[l+4>>2]|0,!((j|0)>0|(j|0)==0&(f[l>>2]|0)>>>0>0)):0){f[i>>2]=f[k>>2];f[h>>2]=f[i>>2];ye(e,h,d,d+4|0)|0;m=i}else m=i;if(!(f[d>>2]|0)){u=g;return 1}d=a+12|0;og(d);m=a+1068|0;Cm(m);k=a+1088|0;Cm(k);l=a+1108|0;Cm(l);f[i>>2]=f[b>>2];f[i+4>>2]=f[b+4>>2];f[i+8>>2]=f[b+8>>2];f[h>>2]=f[c>>2];f[h+4>>2]=f[c+4>>2];f[h+8>>2]=f[c+8>>2];jb(a,i,h);Ke(d,e);mg(m,e);mg(k,e);mg(l,e);u=g;return 1}function gf(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0;g=u;u=u+32|0;h=g+12|0;i=g;f[a>>2]=f[d>>2];d=a+4|0;f[d>>2]=(f[c>>2]|0)-(f[b>>2]|0);j=e+16|0;k=j;l=f[k+4>>2]|0;if(!((l|0)>0|(l|0)==0&(f[k>>2]|0)>>>0>0)?(k=e+4|0,f[i>>2]=f[k>>2],f[h>>2]=f[i>>2],ye(e,h,a,a+4|0)|0,l=j,j=f[l+4>>2]|0,!((j|0)>0|(j|0)==0&(f[l>>2]|0)>>>0>0)):0){f[i>>2]=f[k>>2];f[h>>2]=f[i>>2];ye(e,h,d,d+4|0)|0;m=i}else m=i;if(!(f[d>>2]|0)){u=g;return 1}d=a+12|0;og(d);m=a+1068|0;Cm(m);k=a+1088|0;Cm(k);l=a+1108|0;Cm(l);f[i>>2]=f[b>>2];f[i+4>>2]=f[b+4>>2];f[i+8>>2]=f[b+8>>2];f[h>>2]=f[c>>2];f[h+4>>2]=f[c+4>>2];f[h+8>>2]=f[c+8>>2];mb(a,i,h);Ke(d,e);mg(m,e);mg(k,e);mg(l,e);u=g;return 1}function hf(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0;c=u;u=u+32|0;d=c;e=a+8|0;g=f[e>>2]|0;h=a+4|0;i=f[h>>2]|0;j=i;if(g-i>>2>>>0>=b>>>0){hj(i|0,0,b<<2|0)|0;f[h>>2]=i+(b<<2);u=c;return}k=f[a>>2]|0;l=i-k>>2;m=l+b|0;n=k;if(m>>>0>1073741823)mq(a);o=g-k|0;p=o>>1;q=o>>2>>>0<536870911?(p>>>0<m>>>0?m:p):1073741823;f[d+12>>2]=0;f[d+16>>2]=a+8;do if(q)if(q>>>0>1073741823){p=ra(8)|0;Wo(p,14941);f[p>>2]=6944;va(p|0,1080,114)}else{r=dn(q<<2)|0;break}else r=0;while(0);f[d>>2]=r;p=r+(l<<2)|0;l=d+8|0;m=d+4|0;f[m>>2]=p;o=r+(q<<2)|0;q=d+12|0;f[q>>2]=o;r=p+(b<<2)|0;hj(p|0,0,b<<2|0)|0;f[l>>2]=r;if((j|0)==(n|0)){s=p;t=q;v=l;w=k;x=r;y=i;z=o;A=g}else{g=j;j=p;do{g=g+-4|0;p=f[g>>2]|0;f[g>>2]=0;f[j+-4>>2]=p;j=(f[m>>2]|0)+-4|0;f[m>>2]=j}while((g|0)!=(n|0));s=j;t=q;v=l;w=f[a>>2]|0;x=f[l>>2]|0;y=f[h>>2]|0;z=f[q>>2]|0;A=f[e>>2]|0}f[a>>2]=s;f[m>>2]=w;f[h>>2]=x;f[v>>2]=y;f[e>>2]=z;f[t>>2]=A;f[d>>2]=w;Wh(d);u=c;return}function jf(a,c,d,e,g){a=a|0;c=c|0;d=d|0;e=e|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;d=u;u=u+16|0;h=d;i=f[a+124>>2]|0;if(!i){u=d;return}j=i+-1|0;k=(j&i|0)==0;if(!k)if(i>>>0>g>>>0)l=g;else l=(g>>>0)%(i>>>0)|0;else l=j&g;m=f[(f[a+120>>2]|0)+(l<<2)>>2]|0;if(!m){u=d;return}n=f[m>>2]|0;if(!n){u=d;return}a:do if(k){m=n;while(1){o=f[m+4>>2]|0;p=(o|0)==(g|0);if(!(p|(o&j|0)==(l|0))){q=24;break}if(p?(f[m+8>>2]|0)==(g|0):0){r=m;break a}m=f[m>>2]|0;if(!m){q=24;break}}if((q|0)==24){u=d;return}}else{m=n;while(1){p=f[m+4>>2]|0;if((p|0)==(g|0)){if((f[m+8>>2]|0)==(g|0)){r=m;break a}}else{if(p>>>0<i>>>0)s=p;else s=(p>>>0)%(i>>>0)|0;if((s|0)!=(l|0)){q=24;break}}m=f[m>>2]|0;if(!m){q=24;break}}if((q|0)==24){u=d;return}}while(0);q=f[r+12>>2]|0;if((q|0)==-1){u=d;return}f[h>>2]=q;f[h+4>>2]=c;b[h+8>>0]=e&1;e=a+112|0;c=f[e>>2]|0;if((c|0)==(f[a+116>>2]|0))ki(a+108|0,h);else{f[c>>2]=f[h>>2];f[c+4>>2]=f[h+4>>2];f[c+8>>2]=f[h+8>>2];f[e>>2]=(f[e>>2]|0)+12}u=d;return}function kf(a,b){a=a|0;b=b|0;var c=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;c=d[b>>1]|0;e=d[b+2>>1]|0;g=d[b+4>>1]|0;h=d[b+6>>1]|0;b=((((c^318)&65535)+239^e&65535)+239^g&65535)+239^h&65535;i=f[a+4>>2]|0;if(!i){j=0;return j|0}k=i+-1|0;l=(k&i|0)==0;if(!l)if(b>>>0<i>>>0)m=b;else m=(b>>>0)%(i>>>0)|0;else m=b&k;n=f[(f[a>>2]|0)+(m<<2)>>2]|0;if(!n){j=0;return j|0}a=f[n>>2]|0;if(!a){j=0;return j|0}if(l){l=a;while(1){n=f[l+4>>2]|0;o=(n|0)==(b|0);if(!(o|(n&k|0)==(m|0))){j=0;p=25;break}if((((o?(o=l+8|0,(d[o>>1]|0)==c<<16>>16):0)?(d[o+2>>1]|0)==e<<16>>16:0)?(d[l+12>>1]|0)==g<<16>>16:0)?(d[o+6>>1]|0)==h<<16>>16:0){j=l;p=25;break}l=f[l>>2]|0;if(!l){j=0;p=25;break}}if((p|0)==25)return j|0}else q=a;while(1){a=f[q+4>>2]|0;if((a|0)==(b|0)){l=q+8|0;if((((d[l>>1]|0)==c<<16>>16?(d[l+2>>1]|0)==e<<16>>16:0)?(d[q+12>>1]|0)==g<<16>>16:0)?(d[l+6>>1]|0)==h<<16>>16:0){j=q;p=25;break}}else{if(a>>>0<i>>>0)r=a;else r=(a>>>0)%(i>>>0)|0;if((r|0)!=(m|0)){j=0;p=25;break}}q=f[q>>2]|0;if(!q){j=0;p=25;break}}if((p|0)==25)return j|0;return 0}function lf(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0;g=u;u=u+32|0;h=g+12|0;i=g;f[a>>2]=f[d>>2];d=a+4|0;f[d>>2]=(f[c>>2]|0)-(f[b>>2]|0);j=e+16|0;k=j;l=f[k+4>>2]|0;if(!((l|0)>0|(l|0)==0&(f[k>>2]|0)>>>0>0)?(k=e+4|0,f[i>>2]=f[k>>2],f[h>>2]=f[i>>2],ye(e,h,a,a+4|0)|0,l=j,j=f[l+4>>2]|0,!((j|0)>0|(j|0)==0&(f[l>>2]|0)>>>0>0)):0){f[i>>2]=f[k>>2];f[h>>2]=f[i>>2];ye(e,h,d,d+4|0)|0;m=i}else m=i;if(!(f[d>>2]|0)){u=g;return 1}d=a+12|0;Cm(d);m=a+32|0;Cm(m);k=a+52|0;Cm(k);l=a+72|0;Cm(l);f[i>>2]=f[b>>2];f[i+4>>2]=f[b+4>>2];f[i+8>>2]=f[b+8>>2];f[h>>2]=f[c>>2];f[h+4>>2]=f[c+4>>2];f[h+8>>2]=f[c+8>>2];hb(a,i,h);mg(d,e);mg(m,e);mg(k,e);mg(l,e);u=g;return 1}function mf(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0;g=u;u=u+32|0;h=g+12|0;i=g;f[a>>2]=f[d>>2];d=a+4|0;f[d>>2]=(f[c>>2]|0)-(f[b>>2]|0);j=e+16|0;k=j;l=f[k+4>>2]|0;if(!((l|0)>0|(l|0)==0&(f[k>>2]|0)>>>0>0)?(k=e+4|0,f[i>>2]=f[k>>2],f[h>>2]=f[i>>2],ye(e,h,a,a+4|0)|0,l=j,j=f[l+4>>2]|0,!((j|0)>0|(j|0)==0&(f[l>>2]|0)>>>0>0)):0){f[i>>2]=f[k>>2];f[h>>2]=f[i>>2];ye(e,h,d,d+4|0)|0;m=i}else m=i;if(!(f[d>>2]|0)){u=g;return 1}d=a+12|0;lk(d);m=a+44|0;Cm(m);k=a+64|0;Cm(k);l=a+84|0;Cm(l);f[i>>2]=f[b>>2];f[i+4>>2]=f[b+4>>2];f[i+8>>2]=f[b+8>>2];f[h>>2]=f[c>>2];f[h+4>>2]=f[c+4>>2];f[h+8>>2]=f[c+8>>2];nb(a,i,h);fd(d,e);mg(m,e);mg(k,e);mg(l,e);u=g;return 1}function nf(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0;a=u;u=u+16|0;e=a+4|0;g=a;h=a+8|0;i=d+11|0;j=b[i>>0]|0;k=j<<24>>24<0;if(k){l=f[d+4>>2]|0;if(l>>>0>255){m=0;u=a;return m|0}else n=l}else n=j&255;if(!n){b[h>>0]=0;n=c+16|0;l=f[n+4>>2]|0;if(!((l|0)>0|(l|0)==0&(f[n>>2]|0)>>>0>0)){f[g>>2]=f[c+4>>2];f[e>>2]=f[g>>2];ye(c,e,h,h+1|0)|0}m=1;u=a;return m|0}n=d+4|0;l=f[n>>2]|0;b[h>>0]=k?l:j&255;k=c+16|0;o=k;p=f[o>>2]|0;q=f[o+4>>2]|0;if((q|0)>0|(q|0)==0&p>>>0>0){r=j;s=q;t=p;v=l}else{f[g>>2]=f[c+4>>2];f[e>>2]=f[g>>2];ye(c,e,h,h+1|0)|0;h=k;r=b[i>>0]|0;s=f[h+4>>2]|0;t=f[h>>2]|0;v=f[n>>2]|0}n=r<<24>>24<0;h=n?f[d>>2]|0:d;if(!((s|0)>0|(s|0)==0&t>>>0>0)){f[g>>2]=f[c+4>>2];f[e>>2]=f[g>>2];ye(c,e,h,h+(n?v:r&255)|0)|0}m=1;u=a;return m|0}function of(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;c=a+4|0;d=f[a>>2]|0;e=((f[c>>2]|0)-d|0)/24|0;g=e+1|0;if(g>>>0>178956970)mq(a);h=a+8|0;i=((f[h>>2]|0)-d|0)/24|0;d=i<<1;j=i>>>0<89478485?(d>>>0<g>>>0?g:d):178956970;do if(j)if(j>>>0>178956970){d=ra(8)|0;Wo(d,14941);f[d>>2]=6944;va(d|0,1080,114)}else{k=dn(j*24|0)|0;break}else k=0;while(0);d=k+(e*24|0)|0;g=d;i=k+(j*24|0)|0;f[d>>2]=1180;f[k+(e*24|0)+4>>2]=f[b+4>>2];_j(k+(e*24|0)+8|0,b+8|0);f[k+(e*24|0)+20>>2]=f[b+20>>2];b=d+24|0;e=f[a>>2]|0;k=f[c>>2]|0;if((k|0)==(e|0)){l=g;m=e;n=e}else{j=k;k=g;g=d;do{f[g+-24>>2]=1180;f[g+-20>>2]=f[j+-20>>2];d=g+-16|0;o=j+-16|0;f[d>>2]=0;p=g+-12|0;f[p>>2]=0;f[g+-8>>2]=0;f[d>>2]=f[o>>2];d=j+-12|0;f[p>>2]=f[d>>2];p=j+-8|0;f[g+-8>>2]=f[p>>2];f[p>>2]=0;f[d>>2]=0;f[o>>2]=0;f[g+-4>>2]=f[j+-4>>2];j=j+-24|0;g=k+-24|0;k=g}while((j|0)!=(e|0));l=k;m=f[a>>2]|0;n=f[c>>2]|0}f[a>>2]=l;f[c>>2]=b;f[h>>2]=i;i=m;if((n|0)!=(i|0)){h=n;do{h=h+-24|0;Va[f[f[h>>2]>>2]&127](h)}while((h|0)!=(i|0))}if(!m)return;br(m);return}function pf(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;d=b[c>>0]|0;e=b[c+1>>0]|0;g=b[c+2>>0]|0;h=b[c+3>>0]|0;c=(((d&255^318)+239^e&255)+239^g&255)+239^h&255;i=f[a+4>>2]|0;if(!i){j=0;return j|0}k=i+-1|0;l=(k&i|0)==0;if(!l)if(c>>>0<i>>>0)m=c;else m=(c>>>0)%(i>>>0)|0;else m=c&k;n=f[(f[a>>2]|0)+(m<<2)>>2]|0;if(!n){j=0;return j|0}a=f[n>>2]|0;if(!a){j=0;return j|0}if(l){l=a;while(1){n=f[l+4>>2]|0;o=(n|0)==(c|0);if(!(o|(n&k|0)==(m|0))){j=0;p=25;break}if((((o?(o=l+8|0,(b[o>>0]|0)==d<<24>>24):0)?(b[o+1>>0]|0)==e<<24>>24:0)?(b[o+2>>0]|0)==g<<24>>24:0)?(b[o+3>>0]|0)==h<<24>>24:0){j=l;p=25;break}l=f[l>>2]|0;if(!l){j=0;p=25;break}}if((p|0)==25)return j|0}else q=a;while(1){a=f[q+4>>2]|0;if((a|0)==(c|0)){l=q+8|0;if((((b[l>>0]|0)==d<<24>>24?(b[l+1>>0]|0)==e<<24>>24:0)?(b[l+2>>0]|0)==g<<24>>24:0)?(b[l+3>>0]|0)==h<<24>>24:0){j=q;p=25;break}}else{if(a>>>0<i>>>0)r=a;else r=(a>>>0)%(i>>>0)|0;if((r|0)!=(m|0)){j=0;p=25;break}}q=f[q>>2]|0;if(!q){j=0;p=25;break}}if((p|0)==25)return j|0;return 0}function qf(a,b,c,d,e,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0;d=u;u=u+32|0;h=d+24|0;i=d+16|0;j=d;k=d+8|0;l=a+40|0;f[a+44>>2]=g;g=a+36|0;m=f[g>>2]|0;n=f[m+4>>2]|0;o=f[m>>2]|0;p=n-o|0;if((p|0)<=0){u=d;return 1}q=(p>>>2)+-1|0;p=a+8|0;r=a+48|0;s=a+52|0;a=i+4|0;t=j+4|0;v=h+4|0;if(n-o>>2>>>0>q>>>0){w=q;x=o}else{y=m;mq(y)}while(1){f[k>>2]=f[x+(w<<2)>>2];f[h>>2]=f[k>>2];tb(l,h,b,w)|0;m=X(w,e)|0;o=b+(m<<2)|0;q=c+(m<<2)|0;m=f[o+4>>2]|0;n=f[r>>2]|0;z=f[s>>2]|0;f[i>>2]=f[o>>2];f[a>>2]=m;f[j>>2]=n;f[t>>2]=z;Dd(h,p,i,j);f[q>>2]=f[h>>2];f[q+4>>2]=f[v>>2];w=w+-1|0;if((w|0)<=-1){A=3;break}q=f[g>>2]|0;x=f[q>>2]|0;if((f[q+4>>2]|0)-x>>2>>>0<=w>>>0){y=q;A=4;break}}if((A|0)==3){u=d;return 1}else if((A|0)==4)mq(y);return 0}function rf(a,b,c,d,e,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0;h=u;u=u+32|0;i=h;j=h+16|0;k=f[(f[(f[b+4>>2]|0)+8>>2]|0)+(d<<2)>>2]|0;do if((c+-1|0)>>>0<6&(Qa[f[(f[b>>2]|0)+8>>2]&127](b)|0)==1){l=Qa[f[(f[b>>2]|0)+52>>2]&127](b)|0;m=Ra[f[(f[b>>2]|0)+60>>2]&127](b,d)|0;if((l|0)==0|(m|0)==0){f[a>>2]=0;u=h;return}n=Ra[f[(f[b>>2]|0)+56>>2]&127](b,d)|0;if(!n){f[i>>2]=f[b+56>>2];f[i+4>>2]=l;f[i+12>>2]=m;f[i+8>>2]=m+12;Rd(a,j,c,k,e,i,g);if(!(f[a>>2]|0)){f[a>>2]=0;break}u=h;return}else{f[i>>2]=f[b+56>>2];f[i+4>>2]=n;f[i+12>>2]=m;f[i+8>>2]=m+12;Pd(a,j,c,k,e,i,g);if(!(f[a>>2]|0)){f[a>>2]=0;break}u=h;return}}while(0);f[a>>2]=0;u=h;return}function sf(a,b,c,d,e,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0;d=u;u=u+32|0;h=d+24|0;i=d+16|0;j=d;k=d+8|0;l=a+40|0;f[a+44>>2]=g;g=a+36|0;m=f[g>>2]|0;n=f[m+4>>2]|0;o=f[m>>2]|0;p=n-o|0;if((p|0)<=0){u=d;return 1}q=(p>>>2)+-1|0;p=a+8|0;r=a+48|0;s=a+52|0;a=i+4|0;t=j+4|0;v=h+4|0;if(n-o>>2>>>0>q>>>0){w=q;x=o}else{y=m;mq(y)}while(1){f[k>>2]=f[x+(w<<2)>>2];f[h>>2]=f[k>>2];sb(l,h,b,w)|0;m=X(w,e)|0;o=b+(m<<2)|0;q=c+(m<<2)|0;m=f[o+4>>2]|0;n=f[r>>2]|0;z=f[s>>2]|0;f[i>>2]=f[o>>2];f[a>>2]=m;f[j>>2]=n;f[t>>2]=z;Dd(h,p,i,j);f[q>>2]=f[h>>2];f[q+4>>2]=f[v>>2];w=w+-1|0;if((w|0)<=-1){A=3;break}q=f[g>>2]|0;x=f[q>>2]|0;if((f[q+4>>2]|0)-x>>2>>>0<=w>>>0){y=q;A=4;break}}if((A|0)==3){u=d;return 1}else if((A|0)==4)mq(y);return 0}function tf(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;d=f[b>>2]|0;b=f[c>>2]|0;e=b-d>>2;g=a+8|0;h=f[g>>2]|0;i=f[a>>2]|0;j=i;k=b;if(e>>>0<=h-i>>2>>>0){l=a+4|0;m=(f[l>>2]|0)-i>>2;n=e>>>0>m>>>0;o=n?d+(m<<2)|0:b;b=o-d|0;m=b>>2;if(m|0)Xl(i|0,d|0,b|0)|0;b=j+(m<<2)|0;if(!n){n=f[l>>2]|0;if((n|0)==(b|0))return;f[l>>2]=n+(~((n+-4-b|0)>>>2)<<2);return}b=f[c>>2]|0;c=o;if((b|0)==(c|0))return;n=f[l>>2]|0;m=b+-4-o|0;o=c;c=n;while(1){f[c>>2]=f[o>>2];o=o+4|0;if((o|0)==(b|0))break;else c=c+4|0}f[l>>2]=n+((m>>>2)+1<<2);return}m=i;if(!i)p=h;else{h=a+4|0;n=f[h>>2]|0;if((n|0)!=(j|0))f[h>>2]=n+(~((n+-4-i|0)>>>2)<<2);br(m);f[g>>2]=0;f[h>>2]=0;f[a>>2]=0;p=0}if(e>>>0>1073741823)mq(a);h=p>>1;m=p>>2>>>0<536870911?(h>>>0<e>>>0?e:h):1073741823;if(m>>>0>1073741823)mq(a);h=dn(m<<2)|0;e=a+4|0;f[e>>2]=h;f[a>>2]=h;f[g>>2]=h+(m<<2);m=d;if((k|0)==(m|0))return;g=k+-4-d|0;d=m;m=h;while(1){f[m>>2]=f[d>>2];d=d+4|0;if((d|0)==(k|0))break;else m=m+4|0}f[e>>2]=h+((g>>>2)+1<<2);return}function uf(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;e=u;u=u+112|0;g=e+100|0;h=e;i=dn(120)|0;j=f[c+8>>2]|0;f[i+4>>2]=0;f[i>>2]=3296;k=i+8|0;l=i+12|0;m=l+44|0;do{f[l>>2]=0;l=l+4|0}while((l|0)<(m|0));f[k>>2]=3320;l=i+56|0;m=l+36|0;do{f[l>>2]=0;l=l+4|0}while((l|0)<(m|0));f[i+96>>2]=0;f[i+100>>2]=0;f[i+104>>2]=0;f[i+108>>2]=j;f[i+112>>2]=d;k=i+116|0;f[k>>2]=0;n=i;o=f[c+12>>2]|0;p=h+4|0;l=p+4|0;m=l+40|0;do{f[l>>2]=0;l=l+4|0}while((l|0)<(m|0));f[h>>2]=3320;l=h+48|0;m=l+36|0;do{f[l>>2]=0;l=l+4|0}while((l|0)<(m|0));f[h+88>>2]=0;f[h+92>>2]=0;f[h+96>>2]=0;l=o;f[p>>2]=l;m=((f[l+4>>2]|0)-(f[o>>2]|0)>>2>>>0)/3|0;b[g>>0]=0;Xg(h+24|0,m,g);m=f[p>>2]|0;p=(f[m+28>>2]|0)-(f[m+24>>2]|0)>>2;b[g>>0]=0;Xg(h+36|0,p,g);f[h+8>>2]=o;f[h+12>>2]=d;f[h+16>>2]=j;f[h+20>>2]=i;f[k>>2]=c+72;fh(i,h);f[a>>2]=n;Gi(h);u=e;return}function vf(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;c=a+8|0;d=f[c>>2]|0;e=a+4|0;g=f[e>>2]|0;h=g;if(((d-g|0)/12|0)>>>0>=b>>>0){hj(g|0,0,b*12|0)|0;f[e>>2]=h+(b*12|0);return}i=f[a>>2]|0;j=(g-i|0)/12|0;g=j+b|0;k=i;if(g>>>0>357913941)mq(a);l=(d-i|0)/12|0;d=l<<1;m=l>>>0<178956970?(d>>>0<g>>>0?g:d):357913941;do if(m)if(m>>>0>357913941){d=ra(8)|0;Wo(d,14941);f[d>>2]=6944;va(d|0,1080,114)}else{n=dn(m*12|0)|0;break}else n=0;while(0);d=n+(j*12|0)|0;j=d;g=n+(m*12|0)|0;hj(d|0,0,b*12|0)|0;m=d+(b*12|0)|0;if((h|0)==(k|0)){o=j;p=i;q=h}else{i=h;h=j;j=d;do{d=j+-12|0;b=i;i=i+-12|0;f[d>>2]=0;n=j+-8|0;f[n>>2]=0;f[j+-4>>2]=0;f[d>>2]=f[i>>2];d=b+-8|0;f[n>>2]=f[d>>2];n=b+-4|0;f[j+-4>>2]=f[n>>2];f[n>>2]=0;f[d>>2]=0;f[i>>2]=0;j=h+-12|0;h=j}while((i|0)!=(k|0));o=h;p=f[a>>2]|0;q=f[e>>2]|0}f[a>>2]=o;f[e>>2]=m;f[c>>2]=g;g=p;if((q|0)!=(g|0)){c=q;do{q=c;c=c+-12|0;m=f[c>>2]|0;if(m|0){e=q+-8|0;q=f[e>>2]|0;if((q|0)!=(m|0))f[e>>2]=q+(~((q+-4-m|0)>>>2)<<2);br(m)}}while((c|0)!=(g|0))}if(!p)return;br(p);return}function wf(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;d=f[a+12>>2]|0;e=a+68|0;g=f[e>>2]|0;h=f[g+80>>2]|0;b[c+84>>0]=0;i=c+68|0;j=c+72|0;k=f[j>>2]|0;l=f[i>>2]|0;m=k-l>>2;n=l;l=k;if(h>>>0<=m>>>0)if(h>>>0<m>>>0?(k=n+(h<<2)|0,(k|0)!=(l|0)):0){f[j>>2]=l+(~((l+-4-k|0)>>>2)<<2);o=g;p=h}else{o=g;p=h}else{kh(i,h-m|0,3220);m=f[e>>2]|0;o=m;p=f[m+80>>2]|0}m=(f[o+100>>2]|0)-(f[o+96>>2]|0)|0;e=(m|0)/12|0;if(!m){q=1;return q|0}m=a+72|0;a=c+68|0;c=f[o+96>>2]|0;o=f[d+28>>2]|0;d=0;while(1){h=d*3|0;i=f[o+(h<<2)>>2]|0;if((i|0)==-1){q=0;r=11;break}g=f[(f[m>>2]|0)+12>>2]|0;k=f[g+(i<<2)>>2]|0;if(k>>>0>=p>>>0){q=0;r=11;break}i=f[a>>2]|0;f[i+(f[c+(d*12|0)>>2]<<2)>>2]=k;k=f[o+(h+1<<2)>>2]|0;if((k|0)==-1){q=0;r=11;break}l=f[g+(k<<2)>>2]|0;if(l>>>0>=p>>>0){q=0;r=11;break}f[i+(f[c+(d*12|0)+4>>2]<<2)>>2]=l;l=f[o+(h+2<<2)>>2]|0;if((l|0)==-1){q=0;r=11;break}h=f[g+(l<<2)>>2]|0;if(h>>>0>=p>>>0){q=0;r=11;break}f[i+(f[c+(d*12|0)+8>>2]<<2)>>2]=h;d=d+1|0;if(d>>>0>=e>>>0){q=1;r=11;break}}if((r|0)==11)return q|0;return 0}function xf(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;d=u;u=u+32|0;e=d;g=a+40|0;h=(f[c>>2]|0)+(f[g>>2]|0)|0;i=a+24|0;j=f[a+32>>2]|0;k=j+-4194304|0;do if(k>>>0>=64){if(k>>>0<16384){l=a+28|0;m=(f[i>>2]|0)+(f[l>>2]|0)|0;n=j+-4177920|0;b[m>>0]=n;b[m+1>>0]=n>>>8;o=(f[l>>2]|0)+2|0;break}if(k>>>0<4194304){l=a+28|0;n=(f[i>>2]|0)+(f[l>>2]|0)|0;m=j+4194304|0;b[n>>0]=m;b[n+1>>0]=m>>>8;b[n+2>>0]=m>>>16;o=(f[l>>2]|0)+3|0;break}if(k>>>0<1073741824){l=a+28|0;m=(f[i>>2]|0)+(f[l>>2]|0)|0;n=j+-1077936128|0;b[m>>0]=n;b[m+1>>0]=n>>>8;b[m+2>>0]=n>>>16;b[m+3>>0]=n>>>24;o=(f[l>>2]|0)+4|0;break}else{o=f[a+28>>2]|0;break}}else{l=a+28|0;b[(f[i>>2]|0)+(f[l>>2]|0)>>0]=k;o=(f[l>>2]|0)+1|0}while(0);k=((o|0)<0)<<31>>31;Cn(e);eh(o,k,e)|0;i=e+4|0;a=(f[i>>2]|0)-(f[e>>2]|0)|0;Xl(h+a|0,h|0,o|0)|0;Rg(h|0,f[e>>2]|0,a|0)|0;h=g;g=f[h>>2]|0;j=f[h+4>>2]|0;h=Tn(a|0,0,o|0,k|0)|0;k=Tn(h|0,I|0,g|0,j|0)|0;vl(c,k,I);k=e+12|0;c=f[k>>2]|0;f[k>>2]=0;if(c|0)br(c);c=f[e>>2]|0;if(!c){u=d;return}if((f[i>>2]|0)!=(c|0))f[i>>2]=c;br(c);u=d;return}function yf(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;d=u;u=u+32|0;e=d;g=a+40|0;h=(f[c>>2]|0)+(f[g>>2]|0)|0;i=a+24|0;j=f[a+32>>2]|0;k=j+-2097152|0;do if(k>>>0>=64){if(k>>>0<16384){l=a+28|0;m=(f[i>>2]|0)+(f[l>>2]|0)|0;n=j+-2080768|0;b[m>>0]=n;b[m+1>>0]=n>>>8;o=(f[l>>2]|0)+2|0;break}if(k>>>0<4194304){l=a+28|0;n=(f[i>>2]|0)+(f[l>>2]|0)|0;m=j+6291456|0;b[n>>0]=m;b[n+1>>0]=m>>>8;b[n+2>>0]=m>>>16;o=(f[l>>2]|0)+3|0;break}if(k>>>0<1073741824){l=a+28|0;m=(f[i>>2]|0)+(f[l>>2]|0)|0;n=j+-1075838976|0;b[m>>0]=n;b[m+1>>0]=n>>>8;b[m+2>>0]=n>>>16;b[m+3>>0]=n>>>24;o=(f[l>>2]|0)+4|0;break}else{o=f[a+28>>2]|0;break}}else{l=a+28|0;b[(f[i>>2]|0)+(f[l>>2]|0)>>0]=k;o=(f[l>>2]|0)+1|0}while(0);k=((o|0)<0)<<31>>31;Cn(e);eh(o,k,e)|0;i=e+4|0;a=(f[i>>2]|0)-(f[e>>2]|0)|0;Xl(h+a|0,h|0,o|0)|0;Rg(h|0,f[e>>2]|0,a|0)|0;h=g;g=f[h>>2]|0;j=f[h+4>>2]|0;h=Tn(a|0,0,o|0,k|0)|0;k=Tn(h|0,I|0,g|0,j|0)|0;vl(c,k,I);k=e+12|0;c=f[k>>2]|0;f[k>>2]=0;if(c|0)br(c);c=f[e>>2]|0;if(!c){u=d;return}if((f[i>>2]|0)!=(c|0))f[i>>2]=c;br(c);u=d;return}function zf(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;d=u;u=u+32|0;e=d;g=a+40|0;h=(f[c>>2]|0)+(f[g>>2]|0)|0;i=a+24|0;j=f[a+32>>2]|0;k=j+-1048576|0;do if(k>>>0>=64){if(k>>>0<16384){l=a+28|0;m=(f[i>>2]|0)+(f[l>>2]|0)|0;n=j+-1032192|0;b[m>>0]=n;b[m+1>>0]=n>>>8;o=(f[l>>2]|0)+2|0;break}if(k>>>0<4194304){l=a+28|0;n=(f[i>>2]|0)+(f[l>>2]|0)|0;m=j+7340032|0;b[n>>0]=m;b[n+1>>0]=m>>>8;b[n+2>>0]=m>>>16;o=(f[l>>2]|0)+3|0;break}if(k>>>0<1073741824){l=a+28|0;m=(f[i>>2]|0)+(f[l>>2]|0)|0;n=j+-1074790400|0;b[m>>0]=n;b[m+1>>0]=n>>>8;b[m+2>>0]=n>>>16;b[m+3>>0]=n>>>24;o=(f[l>>2]|0)+4|0;break}else{o=f[a+28>>2]|0;break}}else{l=a+28|0;b[(f[i>>2]|0)+(f[l>>2]|0)>>0]=k;o=(f[l>>2]|0)+1|0}while(0);k=((o|0)<0)<<31>>31;Cn(e);eh(o,k,e)|0;i=e+4|0;a=(f[i>>2]|0)-(f[e>>2]|0)|0;Xl(h+a|0,h|0,o|0)|0;Rg(h|0,f[e>>2]|0,a|0)|0;h=g;g=f[h>>2]|0;j=f[h+4>>2]|0;h=Tn(a|0,0,o|0,k|0)|0;k=Tn(h|0,I|0,g|0,j|0)|0;vl(c,k,I);k=e+12|0;c=f[k>>2]|0;f[k>>2]=0;if(c|0)br(c);c=f[e>>2]|0;if(!c){u=d;return}if((f[i>>2]|0)!=(c|0))f[i>>2]=c;br(c);u=d;return}function Af(a,c,d,e,g,h,i){a=a|0;c=c|0;d=d|0;e=e|0;g=g|0;h=h|0;i=i|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0;a=u;u=u+96|0;j=a;if(!c){k=-1;u=a;return k|0}Lm(j);yj(j,d,0,g&255,i,0,g<<1,0,0,0);i=uh(c,j,1,e)|0;d=f[(f[c+8>>2]|0)+(i<<2)>>2]|0;if(e|0){l=d+84|0;m=d+68|0;n=d+40|0;o=d+64|0;d=0;do{if(!(b[l>>0]|0))p=f[(f[m>>2]|0)+(d<<2)>>2]|0;else p=d;q=h+((X(d,g)|0)<<1)|0;r=n;s=f[r>>2]|0;t=on(s|0,f[r+4>>2]|0,p|0,0)|0;Rg((f[f[o>>2]>>2]|0)+t|0,q|0,s|0)|0;d=d+1|0}while((d|0)!=(e|0))}d=c+80|0;c=f[d>>2]|0;if(c)if((c|0)==(e|0))v=10;else w=-1;else{f[d>>2]=e;v=10}if((v|0)==10)w=i;i=j+88|0;v=f[i>>2]|0;f[i>>2]=0;if(v|0){i=f[v+8>>2]|0;if(i|0){e=v+12|0;if((f[e>>2]|0)!=(i|0))f[e>>2]=i;br(i)}br(v)}v=f[j+68>>2]|0;if(v|0){i=j+72|0;e=f[i>>2]|0;if((e|0)!=(v|0))f[i>>2]=e+(~((e+-4-v|0)>>>2)<<2);br(v)}v=j+64|0;j=f[v>>2]|0;f[v>>2]=0;if(j|0){v=f[j>>2]|0;if(v|0){e=j+4|0;if((f[e>>2]|0)!=(v|0))f[e>>2]=v;br(v)}br(j)}k=w;u=a;return k|0}function Bf(a,c,d,e,g,h,i){a=a|0;c=c|0;d=d|0;e=e|0;g=g|0;h=h|0;i=i|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0;a=u;u=u+96|0;j=a;if(!c){k=-1;u=a;return k|0}Lm(j);yj(j,d,0,g&255,i,0,g<<2,0,0,0);i=uh(c,j,1,e)|0;d=f[(f[c+8>>2]|0)+(i<<2)>>2]|0;if(e|0){l=d+84|0;m=d+68|0;n=d+40|0;o=d+64|0;d=0;do{if(!(b[l>>0]|0))p=f[(f[m>>2]|0)+(d<<2)>>2]|0;else p=d;q=h+((X(d,g)|0)<<2)|0;r=n;s=f[r>>2]|0;t=on(s|0,f[r+4>>2]|0,p|0,0)|0;Rg((f[f[o>>2]>>2]|0)+t|0,q|0,s|0)|0;d=d+1|0}while((d|0)!=(e|0))}d=c+80|0;c=f[d>>2]|0;if(c)if((c|0)==(e|0))v=10;else w=-1;else{f[d>>2]=e;v=10}if((v|0)==10)w=i;i=j+88|0;v=f[i>>2]|0;f[i>>2]=0;if(v|0){i=f[v+8>>2]|0;if(i|0){e=v+12|0;if((f[e>>2]|0)!=(i|0))f[e>>2]=i;br(i)}br(v)}v=f[j+68>>2]|0;if(v|0){i=j+72|0;e=f[i>>2]|0;if((e|0)!=(v|0))f[i>>2]=e+(~((e+-4-v|0)>>>2)<<2);br(v)}v=j+64|0;j=f[v>>2]|0;f[v>>2]=0;if(j|0){v=f[j>>2]|0;if(v|0){e=j+4|0;if((f[e>>2]|0)!=(v|0))f[e>>2]=v;br(v)}br(j)}k=w;u=a;return k|0}function Cf(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;d=u;u=u+32|0;e=d;g=a+40|0;h=(f[c>>2]|0)+(f[g>>2]|0)|0;i=a+24|0;j=f[a+32>>2]|0;k=j+-262144|0;do if(k>>>0>=64){if(k>>>0<16384){l=a+28|0;m=(f[i>>2]|0)+(f[l>>2]|0)|0;n=j+-245760|0;b[m>>0]=n;b[m+1>>0]=n>>>8;o=(f[l>>2]|0)+2|0;break}if(k>>>0<4194304){l=a+28|0;n=(f[i>>2]|0)+(f[l>>2]|0)|0;m=j+8126464|0;b[n>>0]=m;b[n+1>>0]=m>>>8;b[n+2>>0]=m>>>16;o=(f[l>>2]|0)+3|0;break}if(k>>>0<1073741824){l=a+28|0;m=(f[i>>2]|0)+(f[l>>2]|0)|0;n=j+-1074003968|0;b[m>>0]=n;b[m+1>>0]=n>>>8;b[m+2>>0]=n>>>16;b[m+3>>0]=n>>>24;o=(f[l>>2]|0)+4|0;break}else{o=f[a+28>>2]|0;break}}else{l=a+28|0;b[(f[i>>2]|0)+(f[l>>2]|0)>>0]=k;o=(f[l>>2]|0)+1|0}while(0);k=((o|0)<0)<<31>>31;Cn(e);eh(o,k,e)|0;i=e+4|0;a=(f[i>>2]|0)-(f[e>>2]|0)|0;Xl(h+a|0,h|0,o|0)|0;Rg(h|0,f[e>>2]|0,a|0)|0;h=g;g=f[h>>2]|0;j=f[h+4>>2]|0;h=Tn(a|0,0,o|0,k|0)|0;k=Tn(h|0,I|0,g|0,j|0)|0;vl(c,k,I);k=e+12|0;c=f[k>>2]|0;f[k>>2]=0;if(c|0)br(c);c=f[e>>2]|0;if(!c){u=d;return}if((f[i>>2]|0)!=(c|0))f[i>>2]=c;br(c);u=d;return}function Df(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;d=u;u=u+32|0;e=d;g=a+40|0;h=(f[c>>2]|0)+(f[g>>2]|0)|0;i=a+24|0;j=f[a+32>>2]|0;k=j+-131072|0;do if(k>>>0>=64){if(k>>>0<16384){l=a+28|0;m=(f[i>>2]|0)+(f[l>>2]|0)|0;n=j+-114688|0;b[m>>0]=n;b[m+1>>0]=n>>>8;o=(f[l>>2]|0)+2|0;break}if(k>>>0<4194304){l=a+28|0;n=(f[i>>2]|0)+(f[l>>2]|0)|0;m=j+8257536|0;b[n>>0]=m;b[n+1>>0]=m>>>8;b[n+2>>0]=m>>>16;o=(f[l>>2]|0)+3|0;break}if(k>>>0<1073741824){l=a+28|0;m=(f[i>>2]|0)+(f[l>>2]|0)|0;n=j+-1073872896|0;b[m>>0]=n;b[m+1>>0]=n>>>8;b[m+2>>0]=n>>>16;b[m+3>>0]=n>>>24;o=(f[l>>2]|0)+4|0;break}else{o=f[a+28>>2]|0;break}}else{l=a+28|0;b[(f[i>>2]|0)+(f[l>>2]|0)>>0]=k;o=(f[l>>2]|0)+1|0}while(0);k=((o|0)<0)<<31>>31;Cn(e);eh(o,k,e)|0;i=e+4|0;a=(f[i>>2]|0)-(f[e>>2]|0)|0;Xl(h+a|0,h|0,o|0)|0;Rg(h|0,f[e>>2]|0,a|0)|0;h=g;g=f[h>>2]|0;j=f[h+4>>2]|0;h=Tn(a|0,0,o|0,k|0)|0;k=Tn(h|0,I|0,g|0,j|0)|0;vl(c,k,I);k=e+12|0;c=f[k>>2]|0;f[k>>2]=0;if(c|0)br(c);c=f[e>>2]|0;if(!c){u=d;return}if((f[i>>2]|0)!=(c|0))f[i>>2]=c;br(c);u=d;return}function Ef(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;d=u;u=u+32|0;e=d;g=a+40|0;h=(f[c>>2]|0)+(f[g>>2]|0)|0;i=a+24|0;j=f[a+32>>2]|0;k=j+-32768|0;do if(k>>>0>=64){if(k>>>0<16384){l=a+28|0;m=(f[i>>2]|0)+(f[l>>2]|0)|0;n=j+-16384|0;b[m>>0]=n;b[m+1>>0]=n>>>8;o=(f[l>>2]|0)+2|0;break}if(k>>>0<4194304){l=a+28|0;n=(f[i>>2]|0)+(f[l>>2]|0)|0;m=j+8355840|0;b[n>>0]=m;b[n+1>>0]=m>>>8;b[n+2>>0]=m>>>16;o=(f[l>>2]|0)+3|0;break}if(k>>>0<1073741824){l=a+28|0;m=(f[i>>2]|0)+(f[l>>2]|0)|0;n=j+-1073774592|0;b[m>>0]=n;b[m+1>>0]=n>>>8;b[m+2>>0]=n>>>16;b[m+3>>0]=n>>>24;o=(f[l>>2]|0)+4|0;break}else{o=f[a+28>>2]|0;break}}else{l=a+28|0;b[(f[i>>2]|0)+(f[l>>2]|0)>>0]=k;o=(f[l>>2]|0)+1|0}while(0);k=((o|0)<0)<<31>>31;Cn(e);eh(o,k,e)|0;i=e+4|0;a=(f[i>>2]|0)-(f[e>>2]|0)|0;Xl(h+a|0,h|0,o|0)|0;Rg(h|0,f[e>>2]|0,a|0)|0;h=g;g=f[h>>2]|0;j=f[h+4>>2]|0;h=Tn(a|0,0,o|0,k|0)|0;k=Tn(h|0,I|0,g|0,j|0)|0;vl(c,k,I);k=e+12|0;c=f[k>>2]|0;f[k>>2]=0;if(c|0)br(c);c=f[e>>2]|0;if(!c){u=d;return}if((f[i>>2]|0)!=(c|0))f[i>>2]=c;br(c);u=d;return}function Ff(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;c=f[b>>2]|0;d=f[b+4>>2]|0;e=f[b+8>>2]|0;g=f[b+12>>2]|0;b=(((c^318)+239^d)+239^e)+239^g;h=f[a+4>>2]|0;if(!h){i=0;return i|0}j=h+-1|0;k=(j&h|0)==0;if(!k)if(b>>>0<h>>>0)l=b;else l=(b>>>0)%(h>>>0)|0;else l=b&j;m=f[(f[a>>2]|0)+(l<<2)>>2]|0;if(!m){i=0;return i|0}a=f[m>>2]|0;if(!a){i=0;return i|0}if(k){k=a;while(1){m=f[k+4>>2]|0;n=(m|0)==(b|0);if(!(n|(m&j|0)==(l|0))){i=0;o=25;break}if((((n?(f[k+8>>2]|0)==(c|0):0)?(f[k+12>>2]|0)==(d|0):0)?(f[k+16>>2]|0)==(e|0):0)?(f[k+20>>2]|0)==(g|0):0){i=k;o=25;break}k=f[k>>2]|0;if(!k){i=0;o=25;break}}if((o|0)==25)return i|0}else p=a;while(1){a=f[p+4>>2]|0;if((a|0)==(b|0)){if((((f[p+8>>2]|0)==(c|0)?(f[p+12>>2]|0)==(d|0):0)?(f[p+16>>2]|0)==(e|0):0)?(f[p+20>>2]|0)==(g|0):0){i=p;o=25;break}}else{if(a>>>0<h>>>0)q=a;else q=(a>>>0)%(h>>>0)|0;if((q|0)!=(l|0)){i=0;o=25;break}}p=f[p>>2]|0;if(!p){i=0;o=25;break}}if((o|0)==25)return i|0;return 0}function Gf(a,c,d,e,g,h,i){a=a|0;c=c|0;d=d|0;e=e|0;g=g|0;h=h|0;i=i|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0;a=u;u=u+96|0;j=a;if(!c){k=-1;u=a;return k|0}Lm(j);yj(j,d,0,g&255,i,0,g,0,0,0);i=uh(c,j,1,e)|0;d=f[(f[c+8>>2]|0)+(i<<2)>>2]|0;if(e|0){l=d+84|0;m=d+68|0;n=d+40|0;o=d+64|0;d=0;do{if(!(b[l>>0]|0))p=f[(f[m>>2]|0)+(d<<2)>>2]|0;else p=d;q=h+(X(d,g)|0)|0;r=n;s=f[r>>2]|0;t=on(s|0,f[r+4>>2]|0,p|0,0)|0;Rg((f[f[o>>2]>>2]|0)+t|0,q|0,s|0)|0;d=d+1|0}while((d|0)!=(e|0))}d=c+80|0;c=f[d>>2]|0;if(c)if((c|0)==(e|0))v=10;else w=-1;else{f[d>>2]=e;v=10}if((v|0)==10)w=i;i=j+88|0;v=f[i>>2]|0;f[i>>2]=0;if(v|0){i=f[v+8>>2]|0;if(i|0){e=v+12|0;if((f[e>>2]|0)!=(i|0))f[e>>2]=i;br(i)}br(v)}v=f[j+68>>2]|0;if(v|0){i=j+72|0;e=f[i>>2]|0;if((e|0)!=(v|0))f[i>>2]=e+(~((e+-4-v|0)>>>2)<<2);br(v)}v=j+64|0;j=f[v>>2]|0;f[v>>2]=0;if(j|0){v=f[j>>2]|0;if(v|0){e=j+4|0;if((f[e>>2]|0)!=(v|0))f[e>>2]=v;br(v)}br(j)}k=w;u=a;return k|0}function Hf(a,b,c,d,e,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0;h=u;u=u+32|0;i=h;j=h+16|0;k=f[(f[(f[b+4>>2]|0)+8>>2]|0)+(d<<2)>>2]|0;do if((c+-1|0)>>>0<6&(Qa[f[(f[b>>2]|0)+8>>2]&127](b)|0)==1){l=Qa[f[(f[b>>2]|0)+52>>2]&127](b)|0;m=Ra[f[(f[b>>2]|0)+60>>2]&127](b,d)|0;if((l|0)==0|(m|0)==0){f[a>>2]=0;u=h;return}n=Ra[f[(f[b>>2]|0)+56>>2]&127](b,d)|0;if(!n){f[i>>2]=f[b+56>>2];f[i+4>>2]=l;f[i+12>>2]=m;f[i+8>>2]=m+12;Od(a,j,c,k,e,i,g);if(!(f[a>>2]|0)){f[a>>2]=0;break}u=h;return}else{f[i>>2]=f[b+56>>2];f[i+4>>2]=n;f[i+12>>2]=m;f[i+8>>2]=m+12;Nd(a,j,c,k,e,i,g);if(!(f[a>>2]|0)){f[a>>2]=0;break}u=h;return}}while(0);f[a>>2]=0;u=h;return}function If(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0;e=f[d>>2]|0;g=f[d+4>>2]|0;if((e|0)==(g|0)){h=0;i=a+12|0;j=a+8|0}else{d=f[c>>2]|0;c=a+8|0;k=a+12|0;a=0;l=e;while(1){e=f[l>>2]|0;m=f[d+(e<<2)>>2]|0;if(m>>>0<a>>>0)n=a;else{o=f[c>>2]|0;p=(f[k>>2]|0)-o|0;q=o;if((p|0)>0){o=p>>>2;p=0;do{r=f[q+(p<<2)>>2]|0;s=f[r+68>>2]|0;if(!(b[r+84>>0]|0))t=f[s+(e<<2)>>2]|0;else t=e;f[s+(m<<2)>>2]=t;p=p+1|0}while((p|0)<(o|0))}n=m+1|0}l=l+4|0;if((l|0)==(g|0)){h=n;i=k;j=c;break}else a=n}}n=f[i>>2]|0;a=f[j>>2]|0;if((n-a|0)>0){u=0;v=a;w=n}else return;while(1){n=f[v+(u<<2)>>2]|0;b[n+84>>0]=0;a=n+68|0;c=n+72|0;n=f[c>>2]|0;k=f[a>>2]|0;g=n-k>>2;l=k;k=n;if(h>>>0<=g>>>0)if(h>>>0<g>>>0?(n=l+(h<<2)|0,(n|0)!=(k|0)):0){f[c>>2]=k+(~((k+-4-n|0)>>>2)<<2);x=v;y=w}else{x=v;y=w}else{kh(a,h-g|0,5908);x=f[j>>2]|0;y=f[i>>2]|0}u=u+1|0;if((u|0)>=(y-x>>2|0))break;else{v=x;w=y}}return}function Jf(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;d=b;e=c-d>>2;g=a+8|0;h=f[g>>2]|0;i=f[a>>2]|0;j=i;if(e>>>0<=h-i>>2>>>0){k=a+4|0;l=(f[k>>2]|0)-i>>2;m=e>>>0>l>>>0;n=b+(l<<2)|0;l=m?n:c;o=l;p=o-d|0;q=p>>2;if(q|0)Xl(i|0,b|0,p|0)|0;p=j+(q<<2)|0;if(!m){m=f[k>>2]|0;if((m|0)==(p|0))return;f[k>>2]=m+(~((m+-4-p|0)>>>2)<<2);return}if((l|0)==(c|0))return;l=f[k>>2]|0;p=((c+-4-o|0)>>>2)+1|0;o=n;n=l;while(1){f[n>>2]=f[o>>2];o=o+4|0;if((o|0)==(c|0))break;else n=n+4|0}f[k>>2]=l+(p<<2);return}p=i;if(!i)r=h;else{h=a+4|0;l=f[h>>2]|0;if((l|0)!=(j|0))f[h>>2]=l+(~((l+-4-i|0)>>>2)<<2);br(p);f[g>>2]=0;f[h>>2]=0;f[a>>2]=0;r=0}if(e>>>0>1073741823)mq(a);h=r>>1;p=r>>2>>>0<536870911?(h>>>0<e>>>0?e:h):1073741823;if(p>>>0>1073741823)mq(a);h=dn(p<<2)|0;e=a+4|0;f[e>>2]=h;f[a>>2]=h;f[g>>2]=h+(p<<2);if((b|0)==(c|0))return;p=((c+-4-d|0)>>>2)+1|0;d=b;b=h;while(1){f[b>>2]=f[d>>2];d=d+4|0;if((d|0)==(c|0))break;else b=b+4|0}f[e>>2]=h+(p<<2);return}function Kf(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;c=u;u=u+16|0;d=c;e=a+76|0;g=f[e>>2]|0;h=a+80|0;i=f[h>>2]|0;if((i|0)!=(g|0))f[h>>2]=i+(~((i+-4-g|0)>>>2)<<2);f[e>>2]=0;f[h>>2]=0;f[a+84>>2]=0;if(g|0)br(g);g=a+64|0;h=f[g>>2]|0;e=a+68|0;if((f[e>>2]|0)!=(h|0))f[e>>2]=h;f[g>>2]=0;f[e>>2]=0;f[a+72>>2]=0;if(h|0)br(h);h=b+4|0;e=f[h>>2]|0;g=f[b>>2]|0;i=((e-g|0)/12|0)*3|0;j=a+4|0;k=f[j>>2]|0;l=f[a>>2]|0;m=k-l>>2;n=l;l=k;k=g;if(i>>>0<=m>>>0)if(i>>>0<m>>>0?(o=n+(i<<2)|0,(o|0)!=(l|0)):0){f[j>>2]=l+(~((l+-4-o|0)>>>2)<<2);p=e;q=g;r=k}else{p=e;q=g;r=k}else{oi(a,i-m|0);m=f[b>>2]|0;p=f[h>>2]|0;q=m;r=m}if((p|0)!=(q|0)){q=f[a>>2]|0;m=(p-r|0)/12|0;p=0;do{h=p*3|0;f[q+(h<<2)>>2]=f[r+(p*12|0)>>2];f[q+(h+1<<2)>>2]=f[r+(p*12|0)+4>>2];f[q+(h+2<<2)>>2]=f[r+(p*12|0)+8>>2];p=p+1|0}while(p>>>0<m>>>0)}f[d>>2]=-1;if(!(oc(a,d)|0)){s=0;u=c;return s|0}Gc(a)|0;fb(a,f[d>>2]|0)|0;s=1;u=c;return s|0}function Lf(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;d=u;u=u+32|0;e=d;g=a+40|0;h=(f[c>>2]|0)+(f[g>>2]|0)|0;i=a+24|0;j=f[a+32>>2]|0;k=j+-16384|0;do if(k>>>0>=64){if(k>>>0<16384){l=a+28|0;m=(f[i>>2]|0)+(f[l>>2]|0)|0;b[m>>0]=j;b[m+1>>0]=j>>>8;n=(f[l>>2]|0)+2|0;break}if(k>>>0<4194304){l=a+28|0;m=(f[i>>2]|0)+(f[l>>2]|0)|0;o=j+8372224|0;b[m>>0]=o;b[m+1>>0]=o>>>8;b[m+2>>0]=o>>>16;n=(f[l>>2]|0)+3|0;break}if(k>>>0<1073741824){l=a+28|0;o=(f[i>>2]|0)+(f[l>>2]|0)|0;m=j+-1073758208|0;b[o>>0]=m;b[o+1>>0]=m>>>8;b[o+2>>0]=m>>>16;b[o+3>>0]=m>>>24;n=(f[l>>2]|0)+4|0;break}else{n=f[a+28>>2]|0;break}}else{l=a+28|0;b[(f[i>>2]|0)+(f[l>>2]|0)>>0]=k;n=(f[l>>2]|0)+1|0}while(0);k=((n|0)<0)<<31>>31;Cn(e);eh(n,k,e)|0;i=e+4|0;a=(f[i>>2]|0)-(f[e>>2]|0)|0;Xl(h+a|0,h|0,n|0)|0;Rg(h|0,f[e>>2]|0,a|0)|0;h=g;g=f[h>>2]|0;j=f[h+4>>2]|0;h=Tn(a|0,0,n|0,k|0)|0;k=Tn(h|0,I|0,g|0,j|0)|0;vl(c,k,I);k=e+12|0;c=f[k>>2]|0;f[k>>2]=0;if(c|0)br(c);c=f[e>>2]|0;if(!c){u=d;return}if((f[i>>2]|0)!=(c|0))f[i>>2]=c;br(c);u=d;return}function Mf(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;d=b;e=c-d>>2;g=a+8|0;h=f[g>>2]|0;i=f[a>>2]|0;j=i;if(e>>>0<=h-i>>2>>>0){k=a+4|0;l=(f[k>>2]|0)-i>>2;m=e>>>0>l>>>0;n=b+(l<<2)|0;l=m?n:c;o=l;p=o-d|0;q=p>>2;if(q|0)Xl(i|0,b|0,p|0)|0;p=j+(q<<2)|0;if(!m){m=f[k>>2]|0;if((m|0)==(p|0))return;f[k>>2]=m+(~((m+-4-p|0)>>>2)<<2);return}if((l|0)==(c|0))return;l=f[k>>2]|0;p=c+-4-o|0;o=n;n=l;while(1){f[n>>2]=f[o>>2];o=o+4|0;if((o|0)==(c|0))break;else n=n+4|0}f[k>>2]=l+((p>>>2)+1<<2);return}p=i;if(!i)r=h;else{h=a+4|0;l=f[h>>2]|0;if((l|0)!=(j|0))f[h>>2]=l+(~((l+-4-i|0)>>>2)<<2);br(p);f[g>>2]=0;f[h>>2]=0;f[a>>2]=0;r=0}if(e>>>0>1073741823)mq(a);h=r>>1;p=r>>2>>>0<536870911?(h>>>0<e>>>0?e:h):1073741823;if(p>>>0>1073741823)mq(a);h=dn(p<<2)|0;e=a+4|0;f[e>>2]=h;f[a>>2]=h;f[g>>2]=h+(p<<2);if((b|0)==(c|0))return;p=c+-4-d|0;d=b;b=h;while(1){f[b>>2]=f[d>>2];d=d+4|0;if((d|0)==(c|0))break;else b=b+4|0}f[e>>2]=h+((p>>>2)+1<<2);return}function Nf(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0,j=0,k=0;g=u;u=u+80|0;h=g;i=g+64|0;Al(h);j=f[(f[a+8>>2]|0)+56>>2]|0;k=X(Ll(5)|0,d)|0;yj(h,j,0,d&255,5,0,k,((k|0)<0)<<31>>31,0,0);k=dn(96)|0;nl(k,h);pj(k,c)|0;f[i>>2]=k;Wi(a,i);k=f[i>>2]|0;f[i>>2]=0;if(k|0){i=k+88|0;c=f[i>>2]|0;f[i>>2]=0;if(c|0){i=f[c+8>>2]|0;if(i|0){h=c+12|0;if((f[h>>2]|0)!=(i|0))f[h>>2]=i;br(i)}br(c)}c=f[k+68>>2]|0;if(c|0){i=k+72|0;h=f[i>>2]|0;if((h|0)!=(c|0))f[i>>2]=h+(~((h+-4-c|0)>>>2)<<2);br(c)}c=k+64|0;h=f[c>>2]|0;f[c>>2]=0;if(h|0){c=f[h>>2]|0;if(c|0){i=h+4|0;if((f[i>>2]|0)!=(c|0))f[i>>2]=c;br(c)}br(h)}br(k)}if(!e){u=g;return}k=f[a+32>>2]|0;b[k+84>>0]=0;a=k+68|0;h=k+72|0;k=f[h>>2]|0;c=f[a>>2]|0;i=k-c>>2;d=k;if(i>>>0<e>>>0){kh(a,e-i|0,1516);u=g;return}if(i>>>0<=e>>>0){u=g;return}i=c+(e<<2)|0;if((i|0)==(d|0)){u=g;return}f[h>>2]=d+(~((d+-4-i|0)>>>2)<<2);u=g;return}function Of(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0;c=u;u=u+16|0;d=c+4|0;e=c;g=a+4|0;h=f[g>>2]|0;i=a+8|0;j=f[i>>2]|0;if((j|0)==(h|0))k=h;else{l=j+(~((j+-4-h|0)>>>2)<<2)|0;f[i>>2]=l;k=l}l=a+16|0;h=f[l>>2]|0;j=a+20|0;m=f[j>>2]|0;n=h;if((m|0)!=(h|0))f[j>>2]=m+(~((m+-4-n|0)>>>2)<<2);m=f[b>>2]|0;h=f[b+4>>2]|0;if((m|0)==(h|0)){u=c;return}b=a+12|0;a=m;m=k;k=n;while(1){n=f[a>>2]|0;f[d>>2]=n;if((m|0)==(f[b>>2]|0)){Ci(g,d);o=f[l>>2]|0}else{f[m>>2]=n;f[i>>2]=m+4;o=k}n=f[d>>2]|0;p=f[j>>2]|0;q=p-o>>2;r=o;if((n|0)<(q|0)){s=r;t=n;v=o}else{w=n+1|0;f[e>>2]=-1;x=p;if(w>>>0<=q>>>0)if(w>>>0<q>>>0?(p=r+(w<<2)|0,(p|0)!=(x|0)):0){f[j>>2]=x+(~((x+-4-p|0)>>>2)<<2);y=n;z=r;A=o}else{y=n;z=r;A=o}else{kh(l,w-q|0,e);q=f[l>>2]|0;y=f[d>>2]|0;z=q;A=q}s=z;t=y;v=A}m=f[i>>2]|0;f[s+(t<<2)>>2]=(m-(f[g>>2]|0)>>2)+-1;a=a+4|0;if((a|0)==(h|0))break;else k=v}u=c;return}function Pf(a,b){a=a|0;b=b|0;var c=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;c=d[b>>1]|0;e=d[b+2>>1]|0;g=d[b+4>>1]|0;b=(((c^318)&65535)+239^e&65535)+239^g&65535;h=f[a+4>>2]|0;if(!h){i=0;return i|0}j=h+-1|0;k=(j&h|0)==0;if(!k)if(b>>>0<h>>>0)l=b;else l=(b>>>0)%(h>>>0)|0;else l=b&j;m=f[(f[a>>2]|0)+(l<<2)>>2]|0;if(!m){i=0;return i|0}a=f[m>>2]|0;if(!a){i=0;return i|0}if(k){k=a;while(1){m=f[k+4>>2]|0;n=(m|0)==(b|0);if(!(n|(m&j|0)==(l|0))){i=0;o=23;break}if(((n?(n=k+8|0,(d[n>>1]|0)==c<<16>>16):0)?(d[n+2>>1]|0)==e<<16>>16:0)?(d[k+12>>1]|0)==g<<16>>16:0){i=k;o=23;break}k=f[k>>2]|0;if(!k){i=0;o=23;break}}if((o|0)==23)return i|0}else p=a;while(1){a=f[p+4>>2]|0;if((a|0)==(b|0)){k=p+8|0;if(((d[k>>1]|0)==c<<16>>16?(d[k+2>>1]|0)==e<<16>>16:0)?(d[p+12>>1]|0)==g<<16>>16:0){i=p;o=23;break}}else{if(a>>>0<h>>>0)q=a;else q=(a>>>0)%(h>>>0)|0;if((q|0)!=(l|0)){i=0;o=23;break}}p=f[p>>2]|0;if(!p){i=0;o=23;break}}if((o|0)==23)return i|0;return 0}function Qf(a){a=a|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;c=u;u=u+32|0;d=c;e=a+16|0;g=e;h=f[g>>2]|0;i=f[g+4>>2]|0;if(!((i|0)>0|(i|0)==0&h>>>0>0)){u=c;return}g=Tn(f[(f[a+12>>2]|0)+4>>2]|0,0,7,0)|0;j=Wn(g|0,I|0,3)|0;g=I;if(!(b[a+24>>0]|0)){k=a+4|0;l=k;m=k;n=h;o=i}else{k=f[a>>2]|0;p=a+4|0;q=k+((f[p>>2]|0)-k)|0;k=Tn(h|0,i|0,8,0)|0;i=q+(0-k)|0;f[d>>2]=0;f[d+4>>2]=0;f[d+8>>2]=0;f[d+12>>2]=0;f[d+16>>2]=0;f[d+20>>2]=0;b[d+24>>0]=0;eh(j,g,d)|0;k=d+4|0;q=(f[k>>2]|0)-(f[d>>2]|0)|0;Xl(i+q|0,i+8|0,j|0)|0;Rg(i|0,f[d>>2]|0,q|0)|0;i=e;h=Tn(f[i>>2]|0,f[i+4>>2]|0,8-q|0,0)|0;q=e;f[q>>2]=h;f[q+4>>2]=I;q=d+12|0;h=f[q>>2]|0;f[q>>2]=0;if(h|0)br(h);h=f[d>>2]|0;if(h|0){if((f[k>>2]|0)!=(h|0))f[k>>2]=h;br(h)}h=e;l=p;m=p;n=f[h>>2]|0;o=f[h+4>>2]|0}h=f[l>>2]|0;l=f[a>>2]|0;p=h-l|0;k=Vn(j|0,g|0,n|0,o|0)|0;o=Tn(k|0,I|0,p|0,0)|0;k=l;l=h;if(p>>>0>=o>>>0){if(p>>>0>o>>>0?(h=k+o|0,(h|0)!=(l|0)):0)f[m>>2]=h}else ri(a,o-p|0);p=e;f[p>>2]=0;f[p+4>>2]=0;u=c;return}function Rf(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;f[c>>2]=1;d=a+4|0;e=c+8|0;g=c+12|0;c=f[e>>2]|0;i=(f[g>>2]|0)-c|0;if(i>>>0<4294967292){Bk(e,i+4|0,0);j=f[e>>2]|0}else j=c;c=j+i|0;i=h[d>>0]|h[d+1>>0]<<8|h[d+2>>0]<<16|h[d+3>>0]<<24;b[c>>0]=i;b[c+1>>0]=i>>8;b[c+2>>0]=i>>16;b[c+3>>0]=i>>24;i=a+8|0;c=a+12|0;d=f[i>>2]|0;if((f[c>>2]|0)!=(d|0)){j=0;k=d;do{d=k+(j<<2)|0;l=f[e>>2]|0;m=(f[g>>2]|0)-l|0;if(m>>>0<4294967292){Bk(e,m+4|0,0);n=f[e>>2]|0}else n=l;l=n+m|0;m=h[d>>0]|h[d+1>>0]<<8|h[d+2>>0]<<16|h[d+3>>0]<<24;b[l>>0]=m;b[l+1>>0]=m>>8;b[l+2>>0]=m>>16;b[l+3>>0]=m>>24;j=j+1|0;k=f[i>>2]|0}while(j>>>0<(f[c>>2]|0)-k>>2>>>0)}k=a+20|0;a=f[e>>2]|0;c=(f[g>>2]|0)-a|0;if(c>>>0<4294967292){Bk(e,c+4|0,0);o=f[e>>2]|0;p=o+c|0;q=h[k>>0]|h[k+1>>0]<<8|h[k+2>>0]<<16|h[k+3>>0]<<24;b[p>>0]=q;b[p+1>>0]=q>>8;b[p+2>>0]=q>>16;b[p+3>>0]=q>>24;return}else{o=a;p=o+c|0;q=h[k>>0]|h[k+1>>0]<<8|h[k+2>>0]<<16|h[k+3>>0]<<24;b[p>>0]=q;b[p+1>>0]=q>>8;b[p+2>>0]=q>>16;b[p+3>>0]=q>>24;return}}function Sf(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;d=a+8|0;e=f[d>>2]|0;g=f[a>>2]|0;h=g;do if(e-g>>2>>>0>=b>>>0){i=a+4|0;j=f[i>>2]|0;k=j-g>>2;l=k>>>0<b>>>0;m=l?k:b;n=j;if(m|0){j=m;m=h;while(1){f[m>>2]=f[c>>2];j=j+-1|0;if(!j)break;else m=m+4|0}}if(!l){m=h+(b<<2)|0;if((m|0)==(n|0))return;else{o=i;p=n+(~((n+-4-m|0)>>>2)<<2)|0;break}}else{m=b-k|0;j=m;q=n;while(1){f[q>>2]=f[c>>2];j=j+-1|0;if(!j)break;else q=q+4|0}o=i;p=n+(m<<2)|0;break}}else{q=g;if(!g)r=e;else{j=a+4|0;k=f[j>>2]|0;if((k|0)!=(h|0))f[j>>2]=k+(~((k+-4-g|0)>>>2)<<2);br(q);f[d>>2]=0;f[j>>2]=0;f[a>>2]=0;r=0}if(b>>>0>1073741823)mq(a);j=r>>1;q=r>>2>>>0<536870911?(j>>>0<b>>>0?b:j):1073741823;if(q>>>0>1073741823)mq(a);j=dn(q<<2)|0;k=a+4|0;f[k>>2]=j;f[a>>2]=j;f[d>>2]=j+(q<<2);q=b;l=j;while(1){f[l>>2]=f[c>>2];q=q+-1|0;if(!q)break;else l=l+4|0}o=k;p=j+(b<<2)|0}while(0);f[o>>2]=p;return}function Tf(a,b,c,d,e,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0;h=Qg(a,b,c,d,g)|0;i=f[e>>2]|0;j=f[d>>2]|0;k=f[g>>2]|0;g=f[k>>2]|0;l=(f[k+4>>2]|0)-g>>3;if(l>>>0<=i>>>0)mq(k);m=g;if(l>>>0<=j>>>0)mq(k);if((f[m+(i<<3)>>2]|0)>>>0>=(f[m+(j<<3)>>2]|0)>>>0){n=h;return n|0}f[d>>2]=i;f[e>>2]=j;j=f[d>>2]|0;e=f[c>>2]|0;if(l>>>0<=j>>>0)mq(k);if(l>>>0<=e>>>0)mq(k);if((f[m+(j<<3)>>2]|0)>>>0>=(f[m+(e<<3)>>2]|0)>>>0){n=h+1|0;return n|0}f[c>>2]=j;f[d>>2]=e;e=f[c>>2]|0;d=f[b>>2]|0;if(l>>>0<=e>>>0)mq(k);if(l>>>0<=d>>>0)mq(k);if((f[m+(e<<3)>>2]|0)>>>0>=(f[m+(d<<3)>>2]|0)>>>0){n=h+2|0;return n|0}f[b>>2]=e;f[c>>2]=d;d=f[b>>2]|0;c=f[a>>2]|0;if(l>>>0<=d>>>0)mq(k);if(l>>>0<=c>>>0)mq(k);if((f[m+(d<<3)>>2]|0)>>>0>=(f[m+(c<<3)>>2]|0)>>>0){n=h+3|0;return n|0}f[a>>2]=d;f[b>>2]=c;n=h+4|0;return n|0}function Uf(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;d=b[c>>0]|0;e=b[c+1>>0]|0;g=b[c+2>>0]|0;c=((d&255^318)+239^e&255)+239^g&255;h=f[a+4>>2]|0;if(!h){i=0;return i|0}j=h+-1|0;k=(j&h|0)==0;if(!k)if(c>>>0<h>>>0)l=c;else l=(c>>>0)%(h>>>0)|0;else l=c&j;m=f[(f[a>>2]|0)+(l<<2)>>2]|0;if(!m){i=0;return i|0}a=f[m>>2]|0;if(!a){i=0;return i|0}if(k){k=a;while(1){m=f[k+4>>2]|0;n=(m|0)==(c|0);if(!(n|(m&j|0)==(l|0))){i=0;o=23;break}if(((n?(n=k+8|0,(b[n>>0]|0)==d<<24>>24):0)?(b[n+1>>0]|0)==e<<24>>24:0)?(b[n+2>>0]|0)==g<<24>>24:0){i=k;o=23;break}k=f[k>>2]|0;if(!k){i=0;o=23;break}}if((o|0)==23)return i|0}else p=a;while(1){a=f[p+4>>2]|0;if((a|0)==(c|0)){k=p+8|0;if(((b[k>>0]|0)==d<<24>>24?(b[k+1>>0]|0)==e<<24>>24:0)?(b[k+2>>0]|0)==g<<24>>24:0){i=p;o=23;break}}else{if(a>>>0<h>>>0)q=a;else q=(a>>>0)%(h>>>0)|0;if((q|0)!=(l|0)){i=0;o=23;break}}p=f[p>>2]|0;if(!p){i=0;o=23;break}}if((o|0)==23)return i|0;return 0}function Vf(a){a=a|0;var b=0,c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;b=u;u=u+16|0;c=b;d=a+36|0;e=a+4|0;g=a+8|0;h=(f[g>>2]|0)-(f[e>>2]|0)>>2;i=a+40|0;j=f[i>>2]|0;k=f[d>>2]|0;l=j-k>>2;m=k;k=j;if(h>>>0<=l>>>0){if(h>>>0<l>>>0?(j=m+(h<<2)|0,(j|0)!=(k|0)):0){m=k;do{k=m+-4|0;f[i>>2]=k;n=f[k>>2]|0;f[k>>2]=0;if(n|0)Va[f[(f[n>>2]|0)+4>>2]&127](n);m=f[i>>2]|0}while((m|0)!=(j|0))}}else ng(d,h-l|0);if((f[g>>2]|0)==(f[e>>2]|0)){o=1;u=b;return o|0}l=a+52|0;h=a+48|0;j=0;while(1){Xa[f[(f[a>>2]|0)+56>>2]&15](c,a,j);m=(f[d>>2]|0)+(j<<2)|0;i=f[c>>2]|0;f[c>>2]=0;n=f[m>>2]|0;f[m>>2]=i;if(n|0)Va[f[(f[n>>2]|0)+4>>2]&127](n);n=f[c>>2]|0;f[c>>2]=0;if(n|0)Va[f[(f[n>>2]|0)+4>>2]&127](n);n=f[(f[d>>2]|0)+(j<<2)>>2]|0;if(!n){o=0;p=19;break}if(j>>>0<(f[l>>2]|0)>>>0?f[(f[h>>2]|0)+(j>>>5<<2)>>2]&1<<(j&31)|0:0)Pp(n);j=j+1|0;if(j>>>0>=(f[g>>2]|0)-(f[e>>2]|0)>>2>>>0){o=1;p=19;break}}if((p|0)==19){u=b;return o|0}return 0}function Wf(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;d=u;u=u+16|0;e=d+4|0;g=d;Nh(f[c+12>>2]|0,b)|0;h=f[c+8>>2]|0;a:do if(h|0){i=b+16|0;j=b+4|0;k=h;while(1){l=k;if(!(nf(0,b,l+8|0)|0)){m=0;break}n=l+20|0;o=(f[l+24>>2]|0)-(f[n>>2]|0)|0;Nh(o,b)|0;l=f[n>>2]|0;n=i;p=f[n+4>>2]|0;if(!((p|0)>0|(p|0)==0&(f[n>>2]|0)>>>0>0)){f[g>>2]=f[j>>2];f[e>>2]=f[g>>2];ye(b,e,l,l+o|0)|0}k=f[k>>2]|0;if(!k)break a}u=d;return m|0}while(0);Nh(f[c+32>>2]|0,b)|0;e=f[c+28>>2]|0;if(!e){m=1;u=d;return m|0}else q=e;while(1){e=q;if(!(nf(0,b,e+8|0)|0)){m=0;r=10;break}Wf(a,b,f[e+20>>2]|0)|0;q=f[q>>2]|0;if(!q){m=1;r=10;break}}if((r|0)==10){u=d;return m|0}return 0}function Xf(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;c=u;u=u+16|0;d=c+8|0;e=c+4|0;g=c;h=a+8|0;i=a+12|0;j=f[h>>2]|0;if((f[i>>2]|0)==(j|0)){k=dn(76)|0;pn(k,b);l=k;f[g>>2]=l;k=f[i>>2]|0;if(k>>>0<(f[a+16>>2]|0)>>>0){f[g>>2]=0;f[k>>2]=l;f[i>>2]=k+4;m=g}else{yg(h,g);m=g}g=f[m>>2]|0;f[m>>2]=0;if(!g){u=c;return 1}Va[f[(f[g>>2]|0)+4>>2]&127](g);u=c;return 1}g=f[j>>2]|0;f[d>>2]=b;j=g+4|0;m=g+8|0;h=f[m>>2]|0;if((h|0)==(f[g+12>>2]|0))Ci(j,d);else{f[h>>2]=b;f[m>>2]=h+4}h=f[d>>2]|0;b=g+16|0;k=g+20|0;g=f[k>>2]|0;i=f[b>>2]|0;l=g-i>>2;a=i;if((h|0)<(l|0)){n=a;o=h}else{i=h+1|0;f[e>>2]=-1;p=g;if(i>>>0<=l>>>0)if(i>>>0<l>>>0?(g=a+(i<<2)|0,(g|0)!=(p|0)):0){f[k>>2]=p+(~((p+-4-g|0)>>>2)<<2);q=h;r=a}else{q=h;r=a}else{kh(b,i-l|0,e);q=f[d>>2]|0;r=f[b>>2]|0}n=r;o=q}f[n+(o<<2)>>2]=((f[m>>2]|0)-(f[j>>2]|0)>>2)+-1;u=c;return 1}function Yf(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;d=c;e=b;g=d-e|0;h=g>>2;i=a+8|0;j=f[i>>2]|0;k=f[a>>2]|0;l=k;if(h>>>0>j-k>>2>>>0){m=k;if(!k)n=j;else{j=a+4|0;o=f[j>>2]|0;if((o|0)!=(l|0))f[j>>2]=o+(~((o+-4-k|0)>>>2)<<2);br(m);f[i>>2]=0;f[j>>2]=0;f[a>>2]=0;n=0}if(h>>>0>1073741823)mq(a);j=n>>1;m=n>>2>>>0<536870911?(j>>>0<h>>>0?h:j):1073741823;if(m>>>0>1073741823)mq(a);j=dn(m<<2)|0;n=a+4|0;f[n>>2]=j;f[a>>2]=j;f[i>>2]=j+(m<<2);if((g|0)<=0)return;Rg(j|0,b|0,g|0)|0;f[n>>2]=j+(g>>>2<<2);return}g=a+4|0;a=f[g>>2]|0;j=a-k>>2;k=h>>>0>j>>>0;h=k?b+(j<<2)|0:c;c=a;j=a;if((h|0)==(b|0))p=l;else{a=h+-4-e|0;e=b;b=l;while(1){f[b>>2]=f[e>>2];e=e+4|0;if((e|0)==(h|0))break;else b=b+4|0}p=l+((a>>>2)+1<<2)|0}if(k){k=d-h|0;if((k|0)<=0)return;Rg(j|0,h|0,k|0)|0;f[g>>2]=(f[g>>2]|0)+(k>>>2<<2);return}else{if((p|0)==(c|0))return;f[g>>2]=c+(~((c+-4-p|0)>>>2)<<2);return}}function Zf(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0;g=u;u=u+96|0;h=g+40|0;i=g;Gm(h,d);we(i,c,d);th(h,i);sj(i+24|0,f[i+28>>2]|0);Dj(i+12|0,f[i+16>>2]|0);sj(i,f[i+4>>2]|0);Si(a,h,e);if(!(f[a>>2]|0)){e=a+4|0;if((b[e+11>>0]|0)<0)br(f[e>>2]|0);f[c+40>>2]=f[h+40>>2];f[c+44>>2]=f[h+44>>2];f[a>>2]=0;f[a+4>>2]=0;f[a+8>>2]=0;f[a+12>>2]=0}f[h>>2]=2968;sj(h+28|0,f[h+32>>2]|0);Dj(h+16|0,f[h+20>>2]|0);sj(h+4|0,f[h+8>>2]|0);u=g;return}function _f(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;c=f[b>>2]|0;d=f[b+4>>2]|0;e=f[b+8>>2]|0;b=((c^318)+239^d)+239^e;g=f[a+4>>2]|0;if(!g){h=0;return h|0}i=g+-1|0;j=(i&g|0)==0;if(!j)if(b>>>0<g>>>0)k=b;else k=(b>>>0)%(g>>>0)|0;else k=b&i;l=f[(f[a>>2]|0)+(k<<2)>>2]|0;if(!l){h=0;return h|0}a=f[l>>2]|0;if(!a){h=0;return h|0}if(j){j=a;while(1){l=f[j+4>>2]|0;m=(l|0)==(b|0);if(!(m|(l&i|0)==(k|0))){h=0;n=23;break}if(((m?(f[j+8>>2]|0)==(c|0):0)?(f[j+12>>2]|0)==(d|0):0)?(f[j+16>>2]|0)==(e|0):0){h=j;n=23;break}j=f[j>>2]|0;if(!j){h=0;n=23;break}}if((n|0)==23)return h|0}else o=a;while(1){a=f[o+4>>2]|0;if((a|0)==(b|0)){if(((f[o+8>>2]|0)==(c|0)?(f[o+12>>2]|0)==(d|0):0)?(f[o+16>>2]|0)==(e|0):0){h=o;n=23;break}}else{if(a>>>0<g>>>0)p=a;else p=(a>>>0)%(g>>>0)|0;if((p|0)!=(k|0)){h=0;n=23;break}}o=f[o>>2]|0;if(!o){h=0;n=23;break}}if((n|0)==23)return h|0;return 0}function $f(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;e=u;u=u+16|0;g=e;if(!(ih(a,c,d)|0)){h=0;u=e;return h|0}if((b[(f[a+8>>2]|0)+24>>0]|0)!=3){h=0;u=e;return h|0}i=f[c+48>>2]|0;c=dn(32)|0;f[g>>2]=c;f[g+8>>2]=-2147483616;f[g+4>>2]=17;j=c;k=12932;l=j+17|0;do{b[j>>0]=b[k>>0]|0;j=j+1|0;k=k+1|0}while((j|0)<(l|0));b[c+17>>0]=0;c=i+16|0;k=f[c>>2]|0;if(k){j=c;l=k;a:while(1){k=l;while(1){if((f[k+16>>2]|0)>=(d|0))break;m=f[k+4>>2]|0;if(!m){n=j;break a}else k=m}l=f[k>>2]|0;if(!l){n=k;break}else j=k}if(((n|0)!=(c|0)?(f[n+16>>2]|0)<=(d|0):0)?(d=n+20|0,(sh(d,g)|0)!=0):0)o=yk(d,g,-1)|0;else p=12}else p=12;if((p|0)==12)o=yk(i,g,-1)|0;if((b[g+11>>0]|0)<0)br(f[g>>2]|0);if((o|0)<1){h=0;u=e;return h|0}tp(a+40|0,o);h=1;u=e;return h|0}function ag(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;e=c;g=d-e|0;h=a+8|0;i=f[h>>2]|0;j=f[a>>2]|0;k=j;if(g>>>0>(i-j|0)>>>0){if(!j)l=i;else{i=a+4|0;if((f[i>>2]|0)!=(k|0))f[i>>2]=k;br(k);f[h>>2]=0;f[i>>2]=0;f[a>>2]=0;l=0}if((g|0)<0)mq(a);i=l<<1;m=l>>>0<1073741823?(i>>>0<g>>>0?g:i):2147483647;if((m|0)<0)mq(a);i=dn(m)|0;l=a+4|0;f[l>>2]=i;f[a>>2]=i;f[h>>2]=i+m;if((c|0)==(d|0))return;else{n=c;o=i}do{b[o>>0]=b[n>>0]|0;n=n+1|0;o=(f[l>>2]|0)+1|0;f[l>>2]=o}while((n|0)!=(d|0));return}n=a+4|0;a=(f[n>>2]|0)-j|0;j=g>>>0>a>>>0;g=c+a|0;a=j?g:d;if((a|0)==(c|0))p=k;else{o=c;c=k;while(1){b[c>>0]=b[o>>0]|0;o=o+1|0;if((o|0)==(a|0))break;else c=c+1|0}p=k+(a-e)|0}if(!j){if((f[n>>2]|0)==(p|0))return;f[n>>2]=p;return}if((a|0)==(d|0))return;a=g;g=f[n>>2]|0;do{b[g>>0]=b[a>>0]|0;a=a+1|0;g=(f[n>>2]|0)+1|0;f[n>>2]=g}while((a|0)!=(d|0));return}function bg(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;d=c>>>1&1431655765|c<<1&-1431655766;c=d>>>2&858993459|d<<2&-858993460;d=c>>>4&252645135|c<<4&-252645136;c=d>>>8&16711935|d<<8&-16711936;d=32-b|0;e=(c>>>16|c<<16)>>>d;c=e-(e>>>1&1431655765)|0;g=(c>>>2&858993459)+(c&858993459)|0;c=(X((g>>>4)+g&252645135,16843009)|0)>>>24;g=b-c|0;h=f[a>>2]|0;i=h;j=Tn(f[i>>2]|0,f[i+4>>2]|0,g|0,((g|0)<0)<<31>>31|0)|0;g=h;f[g>>2]=j;f[g+4>>2]=I;g=h+8|0;h=g;j=Tn(f[h>>2]|0,f[h+4>>2]|0,c|0,0)|0;c=g;f[c>>2]=j;f[c+4>>2]=I;c=a+28|0;j=f[c>>2]|0;g=32-j|0;h=a+24|0;do if((g|0)>=(b|0)){i=-1>>>d<<j;k=f[h>>2]&~i|i&e<<j;f[h>>2]=k;i=j+b|0;f[c>>2]=i;if((i|0)!=32)return;i=a+16|0;l=f[i>>2]|0;if((l|0)==(f[a+20>>2]|0)){Ci(a+12|0,h);m=0;n=0;break}else{f[l>>2]=k;f[i>>2]=l+4;m=0;n=0;break}}else{l=-1>>>j<<j;i=f[h>>2]&~l|l&e<<j;f[h>>2]=i;l=a+16|0;k=f[l>>2]|0;if((k|0)==(f[a+20>>2]|0))Ci(a+12|0,h);else{f[k>>2]=i;f[l>>2]=k+4}k=b-g|0;m=k;n=-1>>>(32-k|0)&e>>>g}while(0);f[h>>2]=n;f[c>>2]=m;return}function cg(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0;e=c&255;g=(d|0)!=0;a:do if(g&(a&3|0)!=0){h=c&255;i=a;j=d;while(1){if((b[i>>0]|0)==h<<24>>24){k=i;l=j;m=6;break a}n=i+1|0;o=j+-1|0;p=(o|0)!=0;if(p&(n&3|0)!=0){i=n;j=o}else{q=n;r=o;s=p;m=5;break}}}else{q=a;r=d;s=g;m=5}while(0);if((m|0)==5)if(s){k=q;l=r;m=6}else{t=q;u=0}b:do if((m|0)==6){q=c&255;if((b[k>>0]|0)==q<<24>>24){t=k;u=l}else{r=X(e,16843009)|0;c:do if(l>>>0>3){s=k;g=l;while(1){d=f[s>>2]^r;if((d&-2139062144^-2139062144)&d+-16843009|0)break;d=s+4|0;a=g+-4|0;if(a>>>0>3){s=d;g=a}else{v=d;w=a;m=11;break c}}x=s;y=g}else{v=k;w=l;m=11}while(0);if((m|0)==11)if(!w){t=v;u=0;break}else{x=v;y=w}while(1){if((b[x>>0]|0)==q<<24>>24){t=x;u=y;break b}r=x+1|0;y=y+-1|0;if(!y){t=r;u=0;break}else x=r}}}while(0);return (u|0?t:0)|0}function dg(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;c=a+4|0;d=f[c>>2]|0;e=f[a>>2]|0;g=e;do if((d|0)==(e|0)){h=a+8|0;i=f[h>>2]|0;j=a+12|0;k=f[j>>2]|0;l=k;if(i>>>0<k>>>0){k=i;m=((l-k>>2)+1|0)/2|0;n=i+(m<<2)|0;o=k-d|0;k=o>>2;p=n+(0-k<<2)|0;if(!k){q=n;r=i}else{Xl(p|0,d|0,o|0)|0;q=p;r=f[h>>2]|0}f[c>>2]=q;f[h>>2]=r+(m<<2);s=q;break}m=l-g>>1;l=(m|0)==0?1:m;if(l>>>0>1073741823){m=ra(8)|0;Wo(m,14941);f[m>>2]=6944;va(m|0,1080,114)}m=dn(l<<2)|0;p=m;o=m+((l+3|0)>>>2<<2)|0;n=o;k=m+(l<<2)|0;if((d|0)==(i|0)){t=n;u=d}else{l=o;m=n;v=d;do{f[l>>2]=f[v>>2];l=m+4|0;m=l;v=v+4|0}while((v|0)!=(i|0));t=m;u=f[a>>2]|0}f[a>>2]=p;f[c>>2]=n;f[h>>2]=t;f[j>>2]=k;if(!u)s=o;else{br(u);s=f[c>>2]|0}}else s=d;while(0);f[s+-4>>2]=f[b>>2];f[c>>2]=(f[c>>2]|0)+-4;return}function eg(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;d=u;u=u+16|0;e=d+4|0;g=d;h=d+8|0;i=a+4|0;if((f[i>>2]|0)==-1){j=0;u=d;return j|0}k=f[a+8>>2]|0;l=c+16|0;m=l;n=f[m>>2]|0;o=f[m+4>>2]|0;if(!((o|0)>0|(o|0)==0&n>>>0>0)){m=(f[a+12>>2]|0)-k|0;p=c+4|0;f[g>>2]=f[p>>2];f[e>>2]=f[g>>2];ye(c,e,k,k+m|0)|0;m=l;k=f[m>>2]|0;q=f[m+4>>2]|0;m=a+20|0;if((q|0)>0|(q|0)==0&k>>>0>0){r=q;s=k;t=g}else{f[g>>2]=f[p>>2];f[e>>2]=f[g>>2];ye(c,e,m,m+4|0)|0;m=l;r=f[m+4>>2]|0;s=f[m>>2]|0;t=g}}else{r=o;s=n;t=g}b[h>>0]=f[i>>2];if(!((r|0)>0|(r|0)==0&s>>>0>0)){f[g>>2]=f[c+4>>2];f[e>>2]=f[g>>2];ye(c,e,h,h+1|0)|0}j=1;u=d;return j|0}function fg(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0;e=u;u=u+16|0;g=e+4|0;h=e;i=a+8|0;a=f[i>>2]|0;j=f[a+40>>2]|0;k=_q((j|0)>-1?j:-1)|0;l=c+4|0;m=f[l>>2]|0;n=f[c>>2]|0;if((m|0)==(n|0)){$q(k);u=e;return 1}o=d+16|0;p=d+4|0;q=k+j|0;j=0;r=n;n=a;s=a;a=m;while(1){m=f[r+(j<<2)>>2]|0;if(!(b[n+84>>0]|0))t=f[(f[n+68>>2]|0)+(m<<2)>>2]|0;else t=m;m=s+48|0;v=f[m>>2]|0;w=f[m+4>>2]|0;m=s+40|0;x=f[m>>2]|0;y=on(x|0,f[m+4>>2]|0,t|0,0)|0;m=Tn(y|0,I|0,v|0,w|0)|0;Rg(k|0,(f[f[s>>2]>>2]|0)+m|0,x|0)|0;x=o;m=f[x+4>>2]|0;if((m|0)>0|(m|0)==0&(f[x>>2]|0)>>>0>0){z=r;A=a}else{f[h>>2]=f[p>>2];f[g>>2]=f[h>>2];ye(d,g,k,q)|0;z=f[c>>2]|0;A=f[l>>2]|0}x=j+1|0;if(x>>>0>=A-z>>2>>>0)break;m=f[i>>2]|0;j=x;r=z;n=m;s=m;a=A}$q(k);u=e;return 1}function gg(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0;d=(f[b>>2]|0)*3|0;if((d|0)==-1){e=0;g=-1;f[c>>2]=g;return e|0}b=f[a+12>>2]|0;h=f[b+12>>2]|0;if((f[h+(d<<2)>>2]|0)==-1){e=0;g=d;f[c>>2]=g;return e|0}i=f[b>>2]|0;b=f[a+152>>2]|0;if((f[b+(f[i+(d<<2)>>2]<<2)>>2]|0)==-1){a=d+1|0;j=((a>>>0)%3|0|0)==0?d+-2|0:a;if((j|0)==-1){e=0;g=-1;f[c>>2]=g;return e|0}if((f[h+(j<<2)>>2]|0)==-1){e=0;g=j;f[c>>2]=g;return e|0}if((f[b+(f[i+(j<<2)>>2]<<2)>>2]|0)==-1){a=j+1|0;k=((a>>>0)%3|0|0)==0?j+-2|0:a;if((k|0)==-1){e=0;g=-1;f[c>>2]=g;return e|0}if((f[h+(k<<2)>>2]|0)==-1){e=0;g=k;f[c>>2]=g;return e|0}if((f[b+(f[i+(k<<2)>>2]<<2)>>2]|0)==-1){i=k+1|0;e=1;g=((i>>>0)%3|0|0)==0?k+-2|0:i;f[c>>2]=g;return e|0}else l=k}else l=j}else l=d;while(1){d=(((l>>>0)%3|0|0)==0?2:-1)+l|0;if((d|0)==-1)break;j=f[h+(d<<2)>>2]|0;if((j|0)==-1)break;d=j+(((j>>>0)%3|0|0)==0?2:-1)|0;if((d|0)==-1)break;else l=d}e=0;g=(((l>>>0)%3|0|0)==0?2:-1)+l|0;f[c>>2]=g;return e|0}function hg(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;e=a+4|0;g=f[e>>2]|0;if(!g){f[c>>2]=e;h=e;return h|0}e=b[d+11>>0]|0;i=e<<24>>24<0;j=i?f[d+4>>2]|0:e&255;e=i?f[d>>2]|0:d;d=a+4|0;a=g;while(1){g=a+16|0;i=b[g+11>>0]|0;k=i<<24>>24<0;l=k?f[a+20>>2]|0:i&255;i=l>>>0<j>>>0;m=i?l:j;if((m|0)!=0?(n=Pk(e,k?f[g>>2]|0:g,m)|0,(n|0)!=0):0)if((n|0)<0)o=8;else o=10;else if(j>>>0<l>>>0)o=8;else o=10;if((o|0)==8){o=0;n=f[a>>2]|0;if(!n){o=9;break}else{p=a;q=n}}else if((o|0)==10){o=0;n=j>>>0<l>>>0?j:l;if((n|0)!=0?(l=Pk(k?f[g>>2]|0:g,e,n)|0,(l|0)!=0):0){if((l|0)>=0){o=16;break}}else o=12;if((o|0)==12?(o=0,!i):0){o=16;break}r=a+4|0;i=f[r>>2]|0;if(!i){o=15;break}else{p=r;q=i}}d=p;a=q}if((o|0)==9){f[c>>2]=a;h=a;return h|0}else if((o|0)==15){f[c>>2]=a;h=r;return h|0}else if((o|0)==16){f[c>>2]=a;h=d;return h|0}return 0}function ig(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0;d=u;u=u+32|0;e=d+24|0;g=d+16|0;h=d+8|0;i=d;j=a+4|0;k=f[j>>2]|0;l=f[b>>2]|0;m=f[b+4>>2]|0;b=f[c>>2]|0;n=f[c+4>>2]|0;c=b-l<<3;f[j>>2]=k-m+n+c;j=(f[a>>2]|0)+(k>>>5<<2)|0;a=k&31;k=j;if((m|0)!=(a|0)){f[e>>2]=l;f[e+4>>2]=m;f[g>>2]=b;f[g+4>>2]=n;f[h>>2]=k;f[h+4>>2]=a;ke(i,e,g,h);u=d;return}h=n-m+c|0;c=l;if((h|0)>0){if(!m){o=h;p=j;q=0;r=l;s=c}else{l=32-m|0;n=(h|0)<(l|0)?h:l;g=-1>>>(l-n|0)&-1<<m;f[j>>2]=f[j>>2]&~g|f[c>>2]&g;g=n+m|0;l=c+4|0;o=h-n|0;p=j+(g>>>5<<2)|0;q=g&31;r=l;s=l}l=(o|0)/32|0;Xl(p|0,r|0,l<<2|0)|0;r=o-(l<<5)|0;o=p+(l<<2)|0;p=o;if((r|0)>0){g=-1>>>(32-r|0);f[o>>2]=f[o>>2]&~g|f[s+(l<<2)>>2]&g;t=r;v=p}else{t=q;v=p}}else{t=m;v=k}f[i>>2]=v;f[i+4>>2]=t;u=d;return}function jg(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;g=u;u=u+16|0;h=g;i=c+4|0;f[h>>2]=0;f[h+4>>2]=0;f[h+8>>2]=0;j=dn(16)|0;f[h>>2]=j;f[h+8>>2]=-2147483632;f[h+4>>2]=15;k=j;l=12916;m=k+15|0;do{b[k>>0]=b[l>>0]|0;k=k+1|0;l=l+1|0}while((k|0)<(m|0));b[j+15>>0]=0;j=yk(i,h,-1)|0;if((b[h+11>>0]|0)<0)br(f[h>>2]|0);switch(j|0){case -1:{if((Yh(i)|0)==10)n=6;else n=5;break}case 1:{n=5;break}default:n=6}if((n|0)==5){j=dn(68)|0;Xo(j);o=j}else if((n|0)==6){n=dn(64)|0;Gp(n);o=n}vo(o,d);Ad(a,o,i,e);if(f[a>>2]|0){p=f[o>>2]|0;q=p+4|0;r=f[q>>2]|0;Va[r&127](o);u=g;return}e=a+4|0;if((b[e+11>>0]|0)<0)br(f[e>>2]|0);f[c+40>>2]=f[o+52>>2];f[c+44>>2]=f[o+60>>2];f[a>>2]=0;f[a+4>>2]=0;f[a+8>>2]=0;f[a+12>>2]=0;p=f[o>>2]|0;q=p+4|0;r=f[q>>2]|0;Va[r&127](o);u=g;return}function kg(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;c=a+8|0;d=f[c>>2]|0;e=a+12|0;g=f[e>>2]|0;h=g;do if((d|0)==(g|0)){i=a+4|0;j=f[i>>2]|0;k=f[a>>2]|0;l=k;if(j>>>0>k>>>0){m=j;n=((m-l>>2)+1|0)/-2|0;o=j+(n<<2)|0;p=d-m|0;m=p>>2;if(!m)q=j;else{Xl(o|0,j|0,p|0)|0;q=f[i>>2]|0}p=o+(m<<2)|0;f[c>>2]=p;f[i>>2]=q+(n<<2);r=p;break}p=h-l>>1;l=(p|0)==0?1:p;if(l>>>0>1073741823){p=ra(8)|0;Wo(p,14941);f[p>>2]=6944;va(p|0,1080,114)}p=dn(l<<2)|0;n=p;m=p+(l>>>2<<2)|0;o=m;s=p+(l<<2)|0;if((j|0)==(d|0)){t=o;u=k}else{k=m;m=o;l=j;do{f[k>>2]=f[l>>2];k=m+4|0;m=k;l=l+4|0}while((l|0)!=(d|0));t=m;u=f[a>>2]|0}f[a>>2]=n;f[i>>2]=o;f[c>>2]=t;f[e>>2]=s;if(!u)r=t;else{br(u);r=f[c>>2]|0}}else r=d;while(0);f[r>>2]=f[b>>2];f[c>>2]=(f[c>>2]|0)+4;return}function lg(a){a=a|0;var b=0,c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0;b=u;u=u+16|0;c=b+4|0;d=b;e=a+8|0;g=a+12|0;h=f[g>>2]|0;$j(f[a+4>>2]|0,(f[h+56>>2]|0)-(f[h+52>>2]|0)>>2);h=a+76|0;a=f[h>>2]|0;if(!a){i=f[(f[g>>2]|0)+64>>2]|0;g=(f[i+4>>2]|0)-(f[i>>2]|0)>>2;i=(g>>>0)/3|0;if(g>>>0<=2){j=1;u=b;return j|0}g=0;while(1){f[d>>2]=g*3;f[c>>2]=f[d>>2];g=g+1|0;if(!(Tb(e,c)|0)){j=0;k=10;break}if((g|0)>=(i|0)){j=1;k=10;break}}if((k|0)==10){u=b;return j|0}}else{i=f[a>>2]|0;if((f[a+4>>2]|0)==(i|0)){j=1;u=b;return j|0}a=0;g=i;while(1){f[d>>2]=f[g+(a<<2)>>2];f[c>>2]=f[d>>2];a=a+1|0;if(!(Tb(e,c)|0)){j=0;k=10;break}i=f[h>>2]|0;g=f[i>>2]|0;if(a>>>0>=(f[i+4>>2]|0)-g>>2>>>0){j=1;k=10;break}}if((k|0)==10){u=b;return j|0}}return 0}function mg(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;c=u;u=u+16|0;d=c+8|0;e=c+4|0;g=c;h=a+12|0;i=a+4|0;j=f[i>>2]|0;if((j|0)==(f[a+8>>2]|0)){Ci(a,h);k=f[i>>2]|0}else{f[j>>2]=f[h>>2];l=j+4|0;f[i>>2]=l;k=l}l=f[a>>2]|0;f[g>>2]=k-l;k=b+16|0;j=k;m=f[j+4>>2]|0;if(!((m|0)>0|(m|0)==0&(f[j>>2]|0)>>>0>0)){f[e>>2]=f[b+4>>2];f[d>>2]=f[e>>2];ye(b,d,g,g+4|0)|0;j=f[a>>2]|0;m=f[g>>2]|0;g=k;k=f[g+4>>2]|0;if((k|0)>0|(k|0)==0&(f[g>>2]|0)>>>0>0){n=j;o=e}else{f[e>>2]=f[b+4>>2];f[d>>2]=f[e>>2];ye(b,d,j,j+m|0)|0;n=f[a>>2]|0;o=e}}else{n=l;o=e}e=f[i>>2]|0;if((e|0)==(n|0)){f[h>>2]=0;p=a+16|0;f[p>>2]=0;u=c;return}f[i>>2]=e+(~((e+-4-n|0)>>>2)<<2);f[h>>2]=0;p=a+16|0;f[p>>2]=0;u=c;return}function ng(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;c=a+8|0;d=f[c>>2]|0;e=a+4|0;g=f[e>>2]|0;h=g;if(d-g>>2>>>0>=b>>>0){hj(g|0,0,b<<2|0)|0;f[e>>2]=g+(b<<2);return}i=f[a>>2]|0;j=g-i>>2;g=j+b|0;k=i;if(g>>>0>1073741823)mq(a);l=d-i|0;d=l>>1;m=l>>2>>>0<536870911?(d>>>0<g>>>0?g:d):1073741823;do if(m)if(m>>>0>1073741823){d=ra(8)|0;Wo(d,14941);f[d>>2]=6944;va(d|0,1080,114)}else{n=dn(m<<2)|0;break}else n=0;while(0);d=n+(j<<2)|0;hj(d|0,0,b<<2|0)|0;b=d;j=n+(m<<2)|0;m=n+(g<<2)|0;if((h|0)==(k|0)){o=b;p=i;q=h}else{i=h;h=b;b=d;do{i=i+-4|0;d=f[i>>2]|0;f[i>>2]=0;f[b+-4>>2]=d;b=h+-4|0;h=b}while((i|0)!=(k|0));o=h;p=f[a>>2]|0;q=f[e>>2]|0}f[a>>2]=o;f[e>>2]=m;f[c>>2]=j;j=p;if((q|0)!=(j|0)){c=q;do{c=c+-4|0;q=f[c>>2]|0;f[c>>2]=0;if(q|0)Va[f[(f[q>>2]|0)+4>>2]&127](q)}while((c|0)!=(j|0))}if(!p)return;br(p);return}function og(a){a=a|0;lk(a);lk(a+32|0);lk(a+64|0);lk(a+96|0);lk(a+128|0);lk(a+160|0);lk(a+192|0);lk(a+224|0);lk(a+256|0);lk(a+288|0);lk(a+320|0);lk(a+352|0);lk(a+384|0);lk(a+416|0);lk(a+448|0);lk(a+480|0);lk(a+512|0);lk(a+544|0);lk(a+576|0);lk(a+608|0);lk(a+640|0);lk(a+672|0);lk(a+704|0);lk(a+736|0);lk(a+768|0);lk(a+800|0);lk(a+832|0);lk(a+864|0);lk(a+896|0);lk(a+928|0);lk(a+960|0);lk(a+992|0);lk(a+1024|0);return}function pg(a,c,d,e,g,h){a=a|0;c=c|0;d=d|0;e=e|0;g=g|0;h=$(h);var i=0,j=0,k=0,l=0,m=0,n=0;i=u;u=u+16|0;j=i;k=i+4|0;f[j>>2]=c;c=a+4|0;a=dn(32)|0;f[k>>2]=a;f[k+8>>2]=-2147483616;f[k+4>>2]=17;l=a;m=12932;n=l+17|0;do{b[l>>0]=b[m>>0]|0;l=l+1|0;m=m+1|0}while((l|0)<(n|0));b[a+17>>0]=0;Nj(wd(c,j)|0,k,d);if((b[k+11>>0]|0)<0)br(f[k>>2]|0);d=dn(32)|0;f[k>>2]=d;f[k+8>>2]=-2147483616;f[k+4>>2]=19;l=d;m=13005;n=l+19|0;do{b[l>>0]=b[m>>0]|0;l=l+1|0;m=m+1|0}while((l|0)<(n|0));b[d+19>>0]=0;ci(wd(c,j)|0,k,g,e);if((b[k+11>>0]|0)<0)br(f[k>>2]|0);e=dn(32)|0;f[k>>2]=e;f[k+8>>2]=-2147483616;f[k+4>>2]=18;l=e;m=13025;n=l+18|0;do{b[l>>0]=b[m>>0]|0;l=l+1|0;m=m+1|0}while((l|0)<(n|0));b[e+18>>0]=0;Lj(wd(c,j)|0,k,h);if((b[k+11>>0]|0)>=0){u=i;return}br(f[k>>2]|0);u=i;return}function qg(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;d=c;e=b;g=d-e|0;h=g>>2;i=a+8|0;j=f[i>>2]|0;k=f[a>>2]|0;l=k;if(h>>>0<=j-k>>2>>>0){m=a+4|0;n=(f[m>>2]|0)-k>>2;o=h>>>0>n>>>0;p=o?b+(n<<2)|0:c;c=p;n=c-e|0;e=n>>2;if(e|0)Xl(k|0,b|0,n|0)|0;n=l+(e<<2)|0;if(o){o=d-c|0;if((o|0)<=0)return;Rg(f[m>>2]|0,p|0,o|0)|0;f[m>>2]=(f[m>>2]|0)+(o>>>2<<2);return}else{o=f[m>>2]|0;if((o|0)==(n|0))return;f[m>>2]=o+(~((o+-4-n|0)>>>2)<<2);return}}n=k;if(!k)q=j;else{j=a+4|0;o=f[j>>2]|0;if((o|0)!=(l|0))f[j>>2]=o+(~((o+-4-k|0)>>>2)<<2);br(n);f[i>>2]=0;f[j>>2]=0;f[a>>2]=0;q=0}if(h>>>0>1073741823)mq(a);j=q>>1;n=q>>2>>>0<536870911?(j>>>0<h>>>0?h:j):1073741823;if(n>>>0>1073741823)mq(a);j=dn(n<<2)|0;h=a+4|0;f[h>>2]=j;f[a>>2]=j;f[i>>2]=j+(n<<2);if((g|0)<=0)return;Rg(j|0,b|0,g|0)|0;f[h>>2]=j+(g>>>2<<2);return}function rg(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0.0,p=0,q=0.0,r=0.0,s=0.0,t=0,v=0.0;e=u;u=u+16|0;g=e;h=c+1|0;f[g>>2]=0;i=g+4|0;f[i>>2]=0;f[g+8>>2]=0;do if(h)if(h>>>0>1073741823)mq(g);else{j=dn(h<<2)|0;f[g>>2]=j;k=j+(h<<2)|0;f[g+8>>2]=k;hj(j|0,0,(c<<2)+4|0)|0;f[i>>2]=k;l=j;m=k;n=j;break}else{l=0;m=0;n=0}while(0);if((b|0)>0){g=0;do{j=l+(f[a+(g<<2)>>2]<<2)|0;f[j>>2]=(f[j>>2]|0)+1;g=g+1|0}while((g|0)!=(b|0))}o=+(b|0);if((c|0)<0){p=0;q=0.0}else{c=0;r=0.0;b=0;while(1){g=f[l+(b<<2)>>2]|0;s=+(g|0);if((g|0)>0){t=c+1|0;v=r+ +Fg(s/o)*s}else{t=c;v=r}b=b+1|0;if((b|0)==(h|0)){p=t;q=v;break}else{c=t;r=v}}}if(d|0)f[d>>2]=p;v=-q;p=~~v>>>0;d=+K(v)>=1.0?(v>0.0?~~+Y(+J(v/4294967296.0),4294967295.0)>>>0:~~+W((v-+(~~v>>>0))/4294967296.0)>>>0):0;if(!l){I=d;u=e;return p|0}if((m|0)!=(l|0))f[i>>2]=m+(~((m+-4-l|0)>>>2)<<2);br(n);I=d;u=e;return p|0}function sg(a){a=a|0;var b=0,c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0;b=u;u=u+16|0;c=b+4|0;d=b;e=a+8|0;g=a+12|0;h=f[g>>2]|0;$j(f[a+4>>2]|0,(f[h+28>>2]|0)-(f[h+24>>2]|0)>>2);h=a+76|0;a=f[h>>2]|0;if(!a){i=f[g>>2]|0;g=(f[i+4>>2]|0)-(f[i>>2]|0)>>2;i=(g>>>0)/3|0;if(g>>>0<=2){j=1;u=b;return j|0}g=0;while(1){f[d>>2]=g*3;f[c>>2]=f[d>>2];g=g+1|0;if(!(Wb(e,c)|0)){j=0;k=10;break}if((g|0)>=(i|0)){j=1;k=10;break}}if((k|0)==10){u=b;return j|0}}else{i=f[a>>2]|0;if((f[a+4>>2]|0)==(i|0)){j=1;u=b;return j|0}a=0;g=i;while(1){f[d>>2]=f[g+(a<<2)>>2];f[c>>2]=f[d>>2];a=a+1|0;if(!(Wb(e,c)|0)){j=0;k=10;break}i=f[h>>2]|0;g=f[i>>2]|0;if(a>>>0>=(f[i+4>>2]|0)-g>>2>>>0){j=1;k=10;break}}if((k|0)==10){u=b;return j|0}}return 0}function tg(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;e=u;u=u+16|0;g=e+4|0;h=e;i=dn(32)|0;f[a>>2]=i;f[a+4>>2]=c+4;c=a+8|0;b[c>>0]=0;f[i+16>>2]=f[d>>2];a=i+20|0;f[i+24>>2]=0;f[i+28>>2]=0;j=i+24|0;f[a>>2]=j;i=f[d+4>>2]|0;k=d+8|0;if((i|0)==(k|0)){b[c>>0]=1;u=e;return}d=j;j=i;while(1){i=j+16|0;f[h>>2]=d;f[g>>2]=f[h>>2];Wg(a,g,i,i)|0;i=f[j+4>>2]|0;if(!i){l=j+8|0;m=f[l>>2]|0;if((f[m>>2]|0)==(j|0))n=m;else{m=l;do{l=f[m>>2]|0;m=l+8|0;o=f[m>>2]|0}while((f[o>>2]|0)!=(l|0));n=o}}else{m=i;while(1){o=f[m>>2]|0;if(!o)break;else m=o}n=m}if((n|0)==(k|0))break;else j=n}b[c>>0]=1;u=e;return}function ug(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0;d=u;u=u+16|0;e=d;f[e>>2]=b;g=a+8|0;if(((f[a+12>>2]|0)-(f[g>>2]|0)>>2|0)<=(b|0))jh(g,b+1|0);h=f[(f[c>>2]|0)+56>>2]|0;do if((h|0)<5){i=a+20+(h*12|0)+4|0;j=f[i>>2]|0;if((j|0)==(f[a+20+(h*12|0)+8>>2]|0)){Ci(a+20+(h*12|0)|0,e);break}else{f[j>>2]=b;f[i>>2]=j+4;break}}while(0);b=f[c>>2]|0;h=f[e>>2]|0;f[b+60>>2]=h;e=(f[g>>2]|0)+(h<<2)|0;f[c>>2]=0;c=f[e>>2]|0;f[e>>2]=b;if(!c){u=d;return}b=c+88|0;e=f[b>>2]|0;f[b>>2]=0;if(e|0){b=f[e+8>>2]|0;if(b|0){h=e+12|0;if((f[h>>2]|0)!=(b|0))f[h>>2]=b;br(b)}br(e)}e=f[c+68>>2]|0;if(e|0){b=c+72|0;h=f[b>>2]|0;if((h|0)!=(e|0))f[b>>2]=h+(~((h+-4-e|0)>>>2)<<2);br(e)}e=c+64|0;h=f[e>>2]|0;f[e>>2]=0;if(h|0){e=f[h>>2]|0;if(e|0){b=h+4|0;if((f[b>>2]|0)!=(e|0))f[b>>2]=e;br(e)}br(h)}br(c);u=d;return}function vg(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0;d=u;u=u+48|0;e=d+16|0;g=d;h=d+32|0;i=a+28|0;j=f[i>>2]|0;f[h>>2]=j;k=a+20|0;l=(f[k>>2]|0)-j|0;f[h+4>>2]=l;f[h+8>>2]=b;f[h+12>>2]=c;b=l+c|0;l=a+60|0;f[g>>2]=f[l>>2];f[g+4>>2]=h;f[g+8>>2]=2;j=ro(Aa(146,g|0)|0)|0;a:do if((b|0)!=(j|0)){g=2;m=b;n=h;o=j;while(1){if((o|0)<0)break;m=m-o|0;p=f[n+4>>2]|0;q=o>>>0>p>>>0;r=q?n+8|0:n;s=g+(q<<31>>31)|0;t=o-(q?p:0)|0;f[r>>2]=(f[r>>2]|0)+t;p=r+4|0;f[p>>2]=(f[p>>2]|0)-t;f[e>>2]=f[l>>2];f[e+4>>2]=r;f[e+8>>2]=s;o=ro(Aa(146,e|0)|0)|0;if((m|0)==(o|0)){v=3;break a}else{g=s;n=r}}f[a+16>>2]=0;f[i>>2]=0;f[k>>2]=0;f[a>>2]=f[a>>2]|32;if((g|0)==2)w=0;else w=c-(f[n+4>>2]|0)|0}else v=3;while(0);if((v|0)==3){v=f[a+44>>2]|0;f[a+16>>2]=v+(f[a+48>>2]|0);a=v;f[i>>2]=a;f[k>>2]=a;w=c}u=d;return w|0}function wg(a){a=a|0;var b=0,c=0,d=0,e=0,g=0,h=0,i=0;f[a>>2]=5880;b=f[a+68>>2]|0;if(b|0){c=a+72|0;d=f[c>>2]|0;if((d|0)!=(b|0))f[c>>2]=d+(~((d+-4-b|0)>>>2)<<2);br(b)}b=f[a+56>>2]|0;if(b|0){d=a+60|0;c=f[d>>2]|0;if((c|0)!=(b|0))f[d>>2]=c+(~((c+-4-b|0)>>>2)<<2);br(b)}b=f[a+44>>2]|0;if(b|0){c=a+48|0;d=f[c>>2]|0;if((d|0)!=(b|0))f[c>>2]=d+(~((d+-4-b|0)>>>2)<<2);br(b)}b=f[a+32>>2]|0;if(b|0){d=a+36|0;c=f[d>>2]|0;if((c|0)!=(b|0))f[d>>2]=c+(~((c+-4-b|0)>>>2)<<2);br(b)}b=f[a+20>>2]|0;if(b|0){c=a+24|0;d=f[c>>2]|0;if((d|0)!=(b|0))f[c>>2]=d+(~((d+-4-b|0)>>>2)<<2);br(b)}Sh(a+8|0);b=a+4|0;a=f[b>>2]|0;f[b>>2]=0;if(!a)return;b=a+40|0;d=f[b>>2]|0;if(d|0){c=a+44|0;e=f[c>>2]|0;if((e|0)==(d|0))g=d;else{h=e;do{e=h+-4|0;f[c>>2]=e;i=f[e>>2]|0;f[e>>2]=0;if(i|0){Qi(i);br(i)}h=f[c>>2]|0}while((h|0)!=(d|0));g=f[b>>2]|0}br(g)}Qi(a);br(a);return}function xg(a){a=a|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0;c=a+12|0;d=f[a>>2]|0;e=a+8|0;g=f[e>>2]|0;h=(g|0)==-1;if(!(b[c>>0]|0)){do if(((!h?(i=(((g>>>0)%3|0|0)==0?2:-1)+g|0,(i|0)!=-1):0)?(f[(f[d>>2]|0)+(i>>>5<<2)>>2]&1<<(i&31)|0)==0:0)?(j=f[(f[(f[d+64>>2]|0)+12>>2]|0)+(i<<2)>>2]|0,(j|0)!=-1):0)if(!((j>>>0)%3|0)){k=j+2|0;break}else{k=j+-1|0;break}else k=-1;while(0);f[e>>2]=k;return}k=g+1|0;if(((!h?(h=((k>>>0)%3|0|0)==0?g+-2|0:k,(h|0)!=-1):0)?(f[(f[d>>2]|0)+(h>>>5<<2)>>2]&1<<(h&31)|0)==0:0)?(k=f[(f[(f[d+64>>2]|0)+12>>2]|0)+(h<<2)>>2]|0,h=k+1|0,(k|0)!=-1):0){g=((h>>>0)%3|0|0)==0?k+-2|0:h;f[e>>2]=g;if((g|0)!=-1){if((g|0)!=(f[a+4>>2]|0))return;f[e>>2]=-1;return}}else f[e>>2]=-1;g=f[a+4>>2]|0;do if((((g|0)!=-1?(a=(((g>>>0)%3|0|0)==0?2:-1)+g|0,(a|0)!=-1):0)?(f[(f[d>>2]|0)+(a>>>5<<2)>>2]&1<<(a&31)|0)==0:0)?(h=f[(f[(f[d+64>>2]|0)+12>>2]|0)+(a<<2)>>2]|0,(h|0)!=-1):0)if(!((h>>>0)%3|0)){l=h+2|0;break}else{l=h+-1|0;break}else l=-1;while(0);f[e>>2]=l;b[c>>0]=0;return}function yg(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;c=a+4|0;d=f[a>>2]|0;e=(f[c>>2]|0)-d>>2;g=e+1|0;if(g>>>0>1073741823)mq(a);h=a+8|0;i=(f[h>>2]|0)-d|0;d=i>>1;j=i>>2>>>0<536870911?(d>>>0<g>>>0?g:d):1073741823;do if(j)if(j>>>0>1073741823){d=ra(8)|0;Wo(d,14941);f[d>>2]=6944;va(d|0,1080,114)}else{k=dn(j<<2)|0;break}else k=0;while(0);d=k+(e<<2)|0;e=d;g=k+(j<<2)|0;j=f[b>>2]|0;f[b>>2]=0;f[d>>2]=j;j=d+4|0;b=f[a>>2]|0;k=f[c>>2]|0;if((k|0)==(b|0)){l=e;m=b;n=b}else{i=k;k=e;e=d;do{i=i+-4|0;d=f[i>>2]|0;f[i>>2]=0;f[e+-4>>2]=d;e=k+-4|0;k=e}while((i|0)!=(b|0));l=k;m=f[a>>2]|0;n=f[c>>2]|0}f[a>>2]=l;f[c>>2]=j;f[h>>2]=g;g=m;if((n|0)!=(g|0)){h=n;do{h=h+-4|0;n=f[h>>2]|0;f[h>>2]=0;if(n|0)Va[f[(f[n>>2]|0)+4>>2]&127](n)}while((h|0)!=(g|0))}if(!m)return;br(m);return}function zg(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;d=a+4|0;a=f[d>>2]|0;do if(a|0){e=b[c+11>>0]|0;g=e<<24>>24<0;h=g?f[c+4>>2]|0:e&255;e=g?f[c>>2]|0:c;g=d;i=a;a:while(1){j=i;while(1){k=j+16|0;l=b[k+11>>0]|0;m=l<<24>>24<0;n=m?f[j+20>>2]|0:l&255;l=h>>>0<n>>>0?h:n;if((l|0)!=0?(o=Pk(m?f[k>>2]|0:k,e,l)|0,(o|0)!=0):0){if((o|0)>=0)break}else p=6;if((p|0)==6?(p=0,n>>>0>=h>>>0):0)break;n=f[j+4>>2]|0;if(!n){q=g;break a}else j=n}i=f[j>>2]|0;if(!i){q=j;break}else g=j}if((q|0)!=(d|0)){g=q+16|0;i=b[g+11>>0]|0;n=i<<24>>24<0;o=n?f[q+20>>2]|0:i&255;i=o>>>0<h>>>0?o:h;if(i|0?(l=Pk(e,n?f[g>>2]|0:g,i)|0,l|0):0){if((l|0)<0)break;else r=q;return r|0}if(h>>>0>=o>>>0){r=q;return r|0}}}while(0);r=d;return r|0}function Ag(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0;d=a+8|0;e=f[d>>2]|0;g=a+4|0;h=f[g>>2]|0;if(((e-h|0)/12|0)>>>0>=b>>>0){i=b;j=h;do{f[j>>2]=f[c>>2];f[j+4>>2]=f[c+4>>2];f[j+8>>2]=f[c+8>>2];j=(f[g>>2]|0)+12|0;f[g>>2]=j;i=i+-1|0}while((i|0)!=0);return}i=f[a>>2]|0;j=(h-i|0)/12|0;h=j+b|0;if(h>>>0>357913941)mq(a);k=(e-i|0)/12|0;i=k<<1;e=k>>>0<178956970?(i>>>0<h>>>0?h:i):357913941;do if(e)if(e>>>0>357913941){i=ra(8)|0;Wo(i,14941);f[i>>2]=6944;va(i|0,1080,114)}else{l=dn(e*12|0)|0;break}else l=0;while(0);i=l+(j*12|0)|0;j=l+(e*12|0)|0;e=b;b=i;l=i;do{f[b>>2]=f[c>>2];f[b+4>>2]=f[c+4>>2];f[b+8>>2]=f[c+8>>2];b=l+12|0;l=b;e=e+-1|0}while((e|0)!=0);e=f[a>>2]|0;b=(f[g>>2]|0)-e|0;c=i+(((b|0)/-12|0)*12|0)|0;if((b|0)>0)Rg(c|0,e|0,b|0)|0;f[a>>2]=c;f[g>>2]=l;f[d>>2]=j;if(!e)return;br(e);return}function Bg(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;c=a+4|0;d=f[a>>2]|0;e=(f[c>>2]|0)-d>>2;g=e+1|0;if(g>>>0>1073741823)mq(a);h=a+8|0;i=(f[h>>2]|0)-d|0;d=i>>1;j=i>>2>>>0<536870911?(d>>>0<g>>>0?g:d):1073741823;do if(j)if(j>>>0>1073741823){d=ra(8)|0;Wo(d,14941);f[d>>2]=6944;va(d|0,1080,114)}else{k=dn(j<<2)|0;break}else k=0;while(0);d=k+(e<<2)|0;e=d;g=k+(j<<2)|0;j=f[b>>2]|0;f[b>>2]=0;f[d>>2]=j;j=d+4|0;b=f[a>>2]|0;k=f[c>>2]|0;if((k|0)==(b|0)){l=e;m=b;n=b}else{i=k;k=e;e=d;do{i=i+-4|0;d=f[i>>2]|0;f[i>>2]=0;f[e+-4>>2]=d;e=k+-4|0;k=e}while((i|0)!=(b|0));l=k;m=f[a>>2]|0;n=f[c>>2]|0}f[a>>2]=l;f[c>>2]=j;f[h>>2]=g;g=m;if((n|0)!=(g|0)){h=n;do{h=h+-4|0;n=f[h>>2]|0;f[h>>2]=0;if(n|0){Qi(n);br(n)}}while((h|0)!=(g|0))}if(!m)return;br(m);return}function Cg(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;e=f[b>>2]|0;g=f[a>>2]|0;h=f[d>>2]|0;d=f[h>>2]|0;i=(f[h+4>>2]|0)-d>>3;if(i>>>0<=e>>>0)mq(h);j=d;if(i>>>0<=g>>>0)mq(h);d=f[j+(e<<3)>>2]|0;k=f[c>>2]|0;if(i>>>0<=k>>>0)mq(h);l=j+(g<<3)|0;m=(f[j+(k<<3)>>2]|0)>>>0<d>>>0;if(d>>>0<(f[l>>2]|0)>>>0){if(m){f[a>>2]=k;f[c>>2]=g;n=1;return n|0}f[a>>2]=e;f[b>>2]=g;d=f[c>>2]|0;if(i>>>0<=d>>>0)mq(h);if((f[j+(d<<3)>>2]|0)>>>0>=(f[l>>2]|0)>>>0){n=1;return n|0}f[b>>2]=d;f[c>>2]=g;n=2;return n|0}if(!m){n=0;return n|0}f[b>>2]=k;f[c>>2]=e;e=f[b>>2]|0;c=f[a>>2]|0;if(i>>>0<=e>>>0)mq(h);if(i>>>0<=c>>>0)mq(h);if((f[j+(e<<3)>>2]|0)>>>0>=(f[j+(c<<3)>>2]|0)>>>0){n=1;return n|0}f[a>>2]=e;f[b>>2]=c;n=2;return n|0}function Dg(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,g=0,h=0;e=u;u=u+96|0;g=e+40|0;h=e;Am(g,c);we(h,b,c);th(g,h);sj(h+24|0,f[h+28>>2]|0);Dj(h+12|0,f[h+16>>2]|0);sj(h,f[h+4>>2]|0);Si(a,g,d);f[g>>2]=2968;sj(g+28|0,f[g+32>>2]|0);Dj(g+16|0,f[g+20>>2]|0);sj(g+4|0,f[g+8>>2]|0);u=e;return}function Eg(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;a=u;u=u+16|0;e=a;if(!b){g=0;u=a;return g|0}h=b+96|0;i=b+100|0;f[e>>2]=0;f[e+4>>2]=0;f[e+8>>2]=0;b=f[i>>2]|0;j=f[h>>2]|0;k=(b-j|0)/12|0;l=j;j=b;if(k>>>0>=c>>>0){if(k>>>0>c>>>0?(b=l+(c*12|0)|0,(b|0)!=(j|0)):0)f[i>>2]=j+(~(((j+-12-b|0)>>>0)/12|0)*12|0);if(!c){g=1;u=a;return g|0}}else Ag(h,c-k|0,e);k=0;b=f[h>>2]|0;while(1){j=k*3|0;l=f[d+(j<<2)>>2]|0;m=f[d+(j+1<<2)>>2]|0;n=f[d+(j+2<<2)>>2]|0;j=((f[i>>2]|0)-b|0)/12|0;o=k;k=k+1|0;if(o>>>0<j>>>0){p=b;q=b}else{f[e>>2]=0;f[e+4>>2]=0;f[e+8>>2]=0;Ag(h,k-j|0,e);j=f[h>>2]|0;p=j;q=j}f[p+(o*12|0)>>2]=l;f[p+(o*12|0)+4>>2]=m;f[p+(o*12|0)+8>>2]=n;if((k|0)==(c|0)){g=1;break}else b=q}u=a;return g|0}function Fg(a){a=+a;var b=0,c=0,d=0,e=0.0,g=0,h=0,i=0,j=0,k=0,l=0,m=0.0,n=0.0,o=0.0,q=0.0,r=0.0,t=0.0;p[s>>3]=a;b=f[s>>2]|0;c=f[s+4>>2]|0;d=(c|0)<0;do if(d|c>>>0<1048576){if((b|0)==0&(c&2147483647|0)==0){e=-1.0/(a*a);break}if(d){e=(a-a)/0.0;break}else{p[s>>3]=a*18014398509481984.0;g=f[s+4>>2]|0;h=-1077;i=g;j=f[s>>2]|0;k=g;l=9;break}}else if(c>>>0<=2146435071)if((b|0)==0&0==0&(c|0)==1072693248)e=0.0;else{h=-1023;i=c;j=b;k=c;l=9}else e=a;while(0);if((l|0)==9){l=i+614242|0;f[s>>2]=j;f[s+4>>2]=(l&1048575)+1072079006;a=+p[s>>3]+-1.0;m=a*a*.5;n=a/(a+2.0);o=n*n;q=o*o;p[s>>3]=a-m;j=f[s+4>>2]|0;f[s>>2]=0;f[s+4>>2]=j;r=+p[s>>3];t=a-r-m+n*(m+(q*(q*(q*.15313837699209373+.22222198432149784)+.3999999999940942)+o*(q*(q*(q*.14798198605116586+.1818357216161805)+.2857142874366239)+.6666666666666735)));q=r*1.4426950407214463;o=+(h+(l>>>20)|0);m=q+o;e=m+(q+(o-m)+(t*1.4426950407214463+(t+r)*1.6751713164886512e-10))}return +e}function Gg(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;d=u;u=u+16|0;e=d;g=dn(32)|0;f[e>>2]=g;f[e+8>>2]=-2147483616;f[e+4>>2]=17;h=g;i=12804;j=h+17|0;do{b[h>>0]=b[i>>0]|0;h=h+1|0;i=i+1|0}while((h|0)<(j|0));b[g+17>>0]=0;g=c+16|0;i=f[g>>2]|0;if(i){h=g;j=i;a:while(1){i=j;while(1){if((f[i+16>>2]|0)>=(a|0))break;k=f[i+4>>2]|0;if(!k){l=h;break a}else i=k}j=f[i>>2]|0;if(!j){l=i;break}else h=i}if(((l|0)!=(g|0)?(f[l+16>>2]|0)<=(a|0):0)?(a=l+20|0,(sh(a,e)|0)!=0):0)m=a;else n=10}else n=10;if((n|0)==10)m=c;c=yk(m,e,-1)|0;if((b[e+11>>0]|0)>=0){o=(c|0)==-1;p=c>>>0>6;q=p?-2:c;r=o?-1:q;u=d;return r|0}br(f[e>>2]|0);o=(c|0)==-1;p=c>>>0>6;q=p?-2:c;r=o?-1:q;u=d;return r|0}function Hg(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0;d=u;u=u+16|0;e=d;g=f[c>>2]|0;f[c>>2]=0;f[e>>2]=g;ug(a,b,e);g=f[e>>2]|0;f[e>>2]=0;if(g|0){e=g+88|0;c=f[e>>2]|0;f[e>>2]=0;if(c|0){e=f[c+8>>2]|0;if(e|0){h=c+12|0;if((f[h>>2]|0)!=(e|0))f[h>>2]=e;br(e)}br(c)}c=f[g+68>>2]|0;if(c|0){e=g+72|0;h=f[e>>2]|0;if((h|0)!=(c|0))f[e>>2]=h+(~((h+-4-c|0)>>>2)<<2);br(c)}c=g+64|0;h=f[c>>2]|0;f[c>>2]=0;if(h|0){c=f[h>>2]|0;if(c|0){e=h+4|0;if((f[e>>2]|0)!=(c|0))f[e>>2]=c;br(c)}br(h)}br(g)}g=a+84|0;h=a+88|0;a=f[h>>2]|0;c=f[g>>2]|0;e=a-c>>2;if((e|0)>(b|0)){u=d;return}i=b+1|0;b=a;if(i>>>0>e>>>0){nh(g,i-e|0);u=d;return}if(i>>>0>=e>>>0){u=d;return}e=c+(i<<2)|0;if((e|0)==(b|0)){u=d;return}f[h>>2]=b+(~((b+-4-e|0)>>>2)<<2);u=d;return}function Ig(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0;d=u;u=u+16|0;e=d;g=a+4|0;f[g>>2]=c;f[a+8>>2]=f[c+56>>2];h=f[a+184>>2]|0;i=a+188|0;j=f[i>>2]|0;if((j|0)!=(h|0))f[i>>2]=j+(~((j+-4-h|0)>>>2)<<2);h=f[c+48>>2]|0;c=dn(32)|0;f[e>>2]=c;f[e+8>>2]=-2147483616;f[e+4>>2]=19;j=c;i=14285;k=j+19|0;do{b[j>>0]=b[i>>0]|0;j=j+1|0;i=i+1|0}while((j|0)<(k|0));b[c+19>>0]=0;c=(sh(h,e)|0)==0;if((b[e+11>>0]|0)<0)br(f[e>>2]|0);h=f[(f[g>>2]|0)+48>>2]|0;if(c){c=(Yh(h)|0)>5&1;b[a+352>>0]=c;u=d;return 1}c=dn(32)|0;f[e>>2]=c;f[e+8>>2]=-2147483616;f[e+4>>2]=19;j=c;i=14285;k=j+19|0;do{b[j>>0]=b[i>>0]|0;j=j+1|0;i=i+1|0}while((j|0)<(k|0));b[c+19>>0]=0;c=(Oj(h,e,0)|0)&1;b[a+352>>0]=c;if((b[e+11>>0]|0)<0)br(f[e>>2]|0);u=d;return 1}function Jg(a){a=a|0;var c=0,d=0,e=0,g=0,i=0,j=0,k=0,l=0,m=0;c=a+108|0;d=(f[a+112>>2]|0)-(f[c>>2]|0)|0;e=(d|0)/12|0;g=a+4|0;Nh(e,f[(f[g>>2]|0)+44>>2]|0)|0;if(!d)return 1;d=0;a=0;while(1){i=f[c>>2]|0;j=i+(d*12|0)+4|0;Nh((f[j>>2]|0)-a|0,f[(f[g>>2]|0)+44>>2]|0)|0;Nh((f[j>>2]|0)-(f[i+(d*12|0)>>2]|0)|0,f[(f[g>>2]|0)+44>>2]|0)|0;d=d+1|0;if(d>>>0>=e>>>0)break;else a=f[j>>2]|0}li(f[(f[g>>2]|0)+44>>2]|0,e,0,0)|0;a=0;do{d=f[(f[g>>2]|0)+44>>2]|0;j=d+16|0;i=f[j+4>>2]|0;if((i|0)>0|(i|0)==0&(f[j>>2]|0)>>>0>0){j=f[d+12>>2]|0;d=j+4|0;i=f[d>>2]|0;k=b[(f[c>>2]|0)+(a*12|0)+8>>0]&1;l=i>>>3;m=i&7;i=(f[j>>2]|0)+l|0;b[i>>0]=(1<<m^255)&(h[i>>0]|0);i=(f[j>>2]|0)+l|0;b[i>>0]=k<<m|(h[i>>0]|0);f[d>>2]=(f[d>>2]|0)+1}a=a+1|0}while(a>>>0<e>>>0);Qf(f[(f[g>>2]|0)+44>>2]|0);return 1}function Kg(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0;d=u;u=u+16|0;e=d;g=a+4|0;f[g>>2]=c;f[a+8>>2]=f[c+56>>2];h=f[a+184>>2]|0;i=a+188|0;j=f[i>>2]|0;if((j|0)!=(h|0))f[i>>2]=j+(~((j+-4-h|0)>>>2)<<2);h=f[c+48>>2]|0;c=dn(32)|0;f[e>>2]=c;f[e+8>>2]=-2147483616;f[e+4>>2]=19;j=c;i=14285;k=j+19|0;do{b[j>>0]=b[i>>0]|0;j=j+1|0;i=i+1|0}while((j|0)<(k|0));b[c+19>>0]=0;c=(sh(h,e)|0)==0;if((b[e+11>>0]|0)<0)br(f[e>>2]|0);h=f[(f[g>>2]|0)+48>>2]|0;if(c){c=(Yh(h)|0)>5&1;b[a+288>>0]=c;u=d;return 1}c=dn(32)|0;f[e>>2]=c;f[e+8>>2]=-2147483616;f[e+4>>2]=19;j=c;i=14285;k=j+19|0;do{b[j>>0]=b[i>>0]|0;j=j+1|0;i=i+1|0}while((j|0)<(k|0));b[c+19>>0]=0;c=(Oj(h,e,0)|0)&1;b[a+288>>0]=c;if((b[e+11>>0]|0)<0)br(f[e>>2]|0);u=d;return 1}function Lg(a,b,c,d,e,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;g=u;u=u+32|0;h=g+16|0;i=g+8|0;j=g;k=d-e|0;d=a+8|0;if((k|0)>0){a=0-e|0;l=i+4|0;m=j+4|0;n=h+4|0;o=k;do{k=b+(o<<2)|0;p=k+(a<<2)|0;q=c+(o<<2)|0;r=f[k+4>>2]|0;s=f[p>>2]|0;t=f[p+4>>2]|0;f[i>>2]=f[k>>2];f[l>>2]=r;f[j>>2]=s;f[m>>2]=t;Dd(h,d,i,j);f[q>>2]=f[h>>2];f[q+4>>2]=f[n>>2];o=o-e|0}while((o|0)>0)}o=e>>>0>1073741823?-1:e<<2;e=_q(o)|0;hj(e|0,0,o|0)|0;o=f[b+4>>2]|0;n=f[e>>2]|0;m=f[e+4>>2]|0;f[i>>2]=f[b>>2];f[i+4>>2]=o;f[j>>2]=n;f[j+4>>2]=m;Dd(h,d,i,j);f[c>>2]=f[h>>2];f[c+4>>2]=f[h+4>>2];$q(e);u=g;return 1}function Mg(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;c=u;u=u+32|0;d=c+12|0;e=c;g=f[b+100>>2]|0;h=f[b+96>>2]|0;b=g-h|0;i=(b|0)/12|0;f[d>>2]=0;j=d+4|0;f[j>>2]=0;f[d+8>>2]=0;k=h;do if(b)if(i>>>0>357913941)mq(d);else{l=dn(b)|0;f[d>>2]=l;f[d+8>>2]=l+(i*12|0);hj(l|0,0,b|0)|0;f[j>>2]=l+b;m=l;break}else m=0;while(0);f[e>>2]=0;f[e+4>>2]=0;f[e+8>>2]=0;if((g|0)!=(h|0)){h=e+4|0;g=e+8|0;b=0;do{l=k+(b*12|0)|0;f[e>>2]=f[l>>2];f[e+4>>2]=f[l+4>>2];f[e+8>>2]=f[l+8>>2];f[m+(b*12|0)>>2]=f[e>>2];f[m+(b*12|0)+4>>2]=f[h>>2];f[m+(b*12|0)+8>>2]=f[g>>2];b=b+1|0}while(b>>>0<i>>>0)}Cj(a,d);a=f[d>>2]|0;if(!a){u=c;return}d=f[j>>2]|0;if((d|0)!=(a|0))f[j>>2]=d+(~(((d+-12-a|0)>>>0)/12|0)*12|0);br(a);u=c;return}function Ng(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;if(c>>>0>4294967279)mq(a);d=a+11|0;e=b[d>>0]|0;g=e<<24>>24<0;if(g){h=f[a+4>>2]|0;i=(f[a+8>>2]&2147483647)+-1|0}else{h=e&255;i=10}j=h>>>0>c>>>0?h:c;c=j>>>0<11;k=c?10:(j+16&-16)+-1|0;do if((k|0)!=(i|0)){do if(c){j=f[a>>2]|0;if(g){l=0;m=j;n=a;o=13}else{Lo(a,j,(e&255)+1|0)|0;br(j);o=16}}else{j=k+1|0;p=dn(j)|0;if(g){l=1;m=f[a>>2]|0;n=p;o=13;break}else{Lo(p,a,(e&255)+1|0)|0;q=p;r=j;s=a+4|0;o=15;break}}while(0);if((o|0)==13){j=a+4|0;Lo(n,m,(f[j>>2]|0)+1|0)|0;br(m);if(l){q=n;r=k+1|0;s=j;o=15}else o=16}if((o|0)==15){f[a+8>>2]=r|-2147483648;f[s>>2]=h;f[a>>2]=q;break}else if((o|0)==16){b[d>>0]=h;break}}while(0);return}function Og(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;c=f[b>>2]|0;if((c|0)==-1){d=-1;return d|0}b=f[(f[a+24>>2]|0)+(c<<2)>>2]|0;if((b|0)==-1){d=0;return d|0}c=a+12|0;a=0;e=0;g=b;a:while(1){b:do if(e){h=a+1|0;i=(((g>>>0)%3|0|0)==0?2:-1)+g|0;if((i|0)==-1){d=h;j=15;break a}k=f[(f[c>>2]|0)+(i<<2)>>2]|0;if((k|0)==-1){d=h;j=15;break a}if(!((k>>>0)%3|0)){l=k+2|0;m=h;break}else{l=k+-1|0;m=h;break}}else{h=a;k=g;while(1){i=h+1|0;n=k+1|0;o=((n>>>0)%3|0|0)==0?k+-2|0:n;if((o|0)==-1){l=b;m=i;break b}n=f[(f[c>>2]|0)+(o<<2)>>2]|0;o=n+1|0;if((n|0)==-1){l=b;m=i;break b}k=((o>>>0)%3|0|0)==0?n+-2|0:o;if((k|0)==-1){l=b;m=i;break b}if((k|0)==(b|0)){d=i;j=15;break a}else h=i}}while(0);if((l|0)==-1){d=m;j=15;break}else{a=m;e=1;g=l}}if((j|0)==15)return d|0;return 0}function Pg(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;d=a+8|0;Cg(a,a+4|0,d,c)|0;e=a+12|0;if((e|0)==(b|0))return;g=f[c>>2]|0;c=f[g>>2]|0;h=(f[g+4>>2]|0)-c>>3;i=c;c=e;e=d;a:while(1){d=f[c>>2]|0;j=f[e>>2]|0;if(h>>>0<=d>>>0){k=5;break}if(h>>>0<=j>>>0){k=7;break}l=i+(d<<3)|0;if((f[l>>2]|0)>>>0<(f[i+(j<<3)>>2]|0)>>>0){m=e;n=c;o=j;while(1){f[n>>2]=o;if((m|0)==(a|0)){p=a;break}j=m+-4|0;o=f[j>>2]|0;if(h>>>0<=o>>>0){k=11;break a}if((f[l>>2]|0)>>>0>=(f[i+(o<<3)>>2]|0)>>>0){p=m;break}else{q=m;m=j;n=q}}f[p>>2]=d}n=c+4|0;if((n|0)==(b|0)){k=3;break}else{m=c;c=n;e=m}}if((k|0)==3)return;else if((k|0)==5)mq(g);else if((k|0)==7)mq(g);else if((k|0)==11)mq(g)}function Qg(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0;g=Cg(a,b,c,e)|0;h=f[d>>2]|0;i=f[c>>2]|0;j=f[e>>2]|0;e=f[j>>2]|0;k=(f[j+4>>2]|0)-e>>3;if(k>>>0<=h>>>0)mq(j);l=e;if(k>>>0<=i>>>0)mq(j);if((f[l+(h<<3)>>2]|0)>>>0>=(f[l+(i<<3)>>2]|0)>>>0){m=g;return m|0}f[c>>2]=h;f[d>>2]=i;i=f[c>>2]|0;d=f[b>>2]|0;if(k>>>0<=i>>>0)mq(j);if(k>>>0<=d>>>0)mq(j);if((f[l+(i<<3)>>2]|0)>>>0>=(f[l+(d<<3)>>2]|0)>>>0){m=g+1|0;return m|0}f[b>>2]=i;f[c>>2]=d;d=f[b>>2]|0;c=f[a>>2]|0;if(k>>>0<=d>>>0)mq(j);if(k>>>0<=c>>>0)mq(j);if((f[l+(d<<3)>>2]|0)>>>0>=(f[l+(c<<3)>>2]|0)>>>0){m=g+2|0;return m|0}f[a>>2]=d;f[b>>2]=c;m=g+3|0;return m|0}function Rg(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0;if((d|0)>=8192)return Da(a|0,c|0,d|0)|0;e=a|0;g=a+d|0;if((a&3)==(c&3)){while(a&3){if(!d)return e|0;b[a>>0]=b[c>>0]|0;a=a+1|0;c=c+1|0;d=d-1|0}h=g&-4|0;d=h-64|0;while((a|0)<=(d|0)){f[a>>2]=f[c>>2];f[a+4>>2]=f[c+4>>2];f[a+8>>2]=f[c+8>>2];f[a+12>>2]=f[c+12>>2];f[a+16>>2]=f[c+16>>2];f[a+20>>2]=f[c+20>>2];f[a+24>>2]=f[c+24>>2];f[a+28>>2]=f[c+28>>2];f[a+32>>2]=f[c+32>>2];f[a+36>>2]=f[c+36>>2];f[a+40>>2]=f[c+40>>2];f[a+44>>2]=f[c+44>>2];f[a+48>>2]=f[c+48>>2];f[a+52>>2]=f[c+52>>2];f[a+56>>2]=f[c+56>>2];f[a+60>>2]=f[c+60>>2];a=a+64|0;c=c+64|0}while((a|0)<(h|0)){f[a>>2]=f[c>>2];a=a+4|0;c=c+4|0}}else{h=g-4|0;while((a|0)<(h|0)){b[a>>0]=b[c>>0]|0;b[a+1>>0]=b[c+1>>0]|0;b[a+2>>0]=b[c+2>>0]|0;b[a+3>>0]=b[c+3>>0]|0;a=a+4|0;c=c+4|0}}while((a|0)<(g|0)){b[a>>0]=b[c>>0]|0;a=a+1|0;c=c+1|0}return e|0}function Sg(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0;c=u;u=u+16|0;d=c+4|0;e=c;f[a>>2]=1216;g=a+4|0;f[g>>2]=0;f[g+4>>2]=0;f[g+8>>2]=0;f[g+12>>2]=0;f[g+16>>2]=0;f[g+20>>2]=0;f[g+24>>2]=0;f[g+28>>2]=0;f[d>>2]=b;b=a+4|0;g=a+8|0;Ci(b,d);h=f[d>>2]|0;i=a+20|0;j=f[i>>2]|0;k=a+16|0;a=f[k>>2]|0;l=j-a>>2;m=a;if((h|0)<(l|0)){n=m;o=h;p=f[g>>2]|0;q=f[b>>2]|0;r=p-q|0;s=r>>2;t=s+-1|0;v=n+(o<<2)|0;f[v>>2]=t;u=c;return}a=h+1|0;f[e>>2]=-1;w=j;if(a>>>0<=l>>>0)if(a>>>0<l>>>0?(j=m+(a<<2)|0,(j|0)!=(w|0)):0){f[i>>2]=w+(~((w+-4-j|0)>>>2)<<2);x=h;y=m}else{x=h;y=m}else{kh(k,a-l|0,e);x=f[d>>2]|0;y=f[k>>2]|0}n=y;o=x;p=f[g>>2]|0;q=f[b>>2]|0;r=p-q|0;s=r>>2;t=s+-1|0;v=n+(o<<2)|0;f[v>>2]=t;u=c;return}function Tg(a){a=a|0;var b=0,c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0;b=a+4|0;c=f[b>>2]|0;d=(f[c+12>>2]|0)-(f[c+8>>2]|0)|0;c=d>>2;a:do if((d|0)>0){e=0;while(1){if(!(Ra[f[(f[a>>2]|0)+36>>2]&127](a,e)|0)){g=0;break}e=e+1|0;h=f[b>>2]|0;i=(f[h+12>>2]|0)-(f[h+8>>2]|0)>>2;if((e|0)>=(i|0)){j=i;break a}}return g|0}else j=c;while(0);c=a+20|0;b=a+24|0;d=f[b>>2]|0;e=f[c>>2]|0;i=d-e>>2;h=e;e=d;if(j>>>0<=i>>>0){if(j>>>0<i>>>0?(d=h+(j<<2)|0,(d|0)!=(e|0)):0)f[b>>2]=e+(~((e+-4-d|0)>>>2)<<2)}else oi(c,j-i|0);i=f[a+12>>2]|0;j=f[a+8>>2]|0;a=j;if((i|0)==(j|0)){g=1;return g|0}d=i-j>>2;j=0;do{i=f[a+(j<<2)>>2]|0;e=f[i+8>>2]|0;b=f[i+4>>2]|0;i=b;if((e|0)!=(b|0)?(h=f[c>>2]|0,k=e-b>>2,f[h+(f[i>>2]<<2)>>2]=j,k>>>0>1):0){b=1;do{f[h+(f[i+(b<<2)>>2]<<2)>>2]=j;b=b+1|0}while(b>>>0<k>>>0)}j=j+1|0}while(j>>>0<d>>>0);g=1;return g|0}function Ug(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;d=f[c+88>>2]|0;if(!d){e=0;return e|0}if((f[d>>2]|0)!=1){e=0;return e|0}g=d+8|0;d=f[g>>2]|0;f[a+4>>2]=h[d>>0]|h[d+1>>0]<<8|h[d+2>>0]<<16|h[d+3>>0]<<24;i=a+8|0;j=c+24|0;c=b[j>>0]|0;k=c<<24>>24;l=a+12|0;m=f[l>>2]|0;n=f[i>>2]|0;o=m-n>>2;p=n;n=m;if(o>>>0>=k>>>0)if(o>>>0>k>>>0?(m=p+(k<<2)|0,(m|0)!=(n|0)):0){f[l>>2]=n+(~((n+-4-m|0)>>>2)<<2);q=c;r=d}else{q=c;r=d}else{oi(i,k-o|0);q=b[j>>0]|0;r=f[g>>2]|0}g=r+4|0;j=h[g>>0]|h[g+1>>0]<<8|h[g+2>>0]<<16|h[g+3>>0]<<24;if(q<<24>>24>0){g=f[i>>2]|0;i=q<<24>>24;q=j;o=4;k=0;while(1){f[g+(k<<2)>>2]=q;o=o+4|0;k=k+1|0;d=r+o|0;c=h[d>>0]|h[d+1>>0]<<8|h[d+2>>0]<<16|h[d+3>>0]<<24;if((k|0)>=(i|0)){s=c;break}else q=c}}else s=j;f[a+20>>2]=s;e=1;return e|0}function Vg(a,c,d,e,g){a=a|0;c=c|0;d=d|0;e=e|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;do if(!(qp(a,f[c+8>>2]|0,g)|0)){if(!(qp(a,f[c>>2]|0,g)|0)){h=f[a+8>>2]|0;Za[f[(f[h>>2]|0)+24>>2]&3](h,c,d,e,g);break}if((f[c+16>>2]|0)!=(d|0)?(h=c+20|0,(f[h>>2]|0)!=(d|0)):0){f[c+32>>2]=e;i=c+44|0;if((f[i>>2]|0)==4)break;j=c+52|0;b[j>>0]=0;k=c+53|0;b[k>>0]=0;l=f[a+8>>2]|0;_a[f[(f[l>>2]|0)+20>>2]&3](l,c,d,d,1,g);if(b[k>>0]|0)if(!(b[j>>0]|0)){m=3;n=11}else o=3;else{m=4;n=11}if((n|0)==11){f[h>>2]=d;h=c+40|0;f[h>>2]=(f[h>>2]|0)+1;if((f[c+36>>2]|0)==1?(f[c+24>>2]|0)==2:0){b[c+54>>0]=1;o=m}else o=m}f[i>>2]=o;break}if((e|0)==1)f[c+32>>2]=1}else Om(0,c,d,e);while(0);return}function Wg(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0;e=u;u=u+16|0;g=e+12|0;h=e+8|0;i=e;f[i>>2]=f[b>>2];f[g>>2]=f[i>>2];i=zd(a,g,h,e+4|0,c)|0;c=f[i>>2]|0;if(c|0){j=c;u=e;return j|0}c=dn(40)|0;dj(c+16|0,d);dj(c+28|0,d+12|0);d=f[h>>2]|0;f[c>>2]=0;f[c+4>>2]=0;f[c+8>>2]=d;f[i>>2]=c;d=f[f[a>>2]>>2]|0;if(!d)k=c;else{f[a>>2]=d;k=f[i>>2]|0}Ae(f[a+4>>2]|0,k);k=a+8|0;f[k>>2]=(f[k>>2]|0)+1;j=c;u=e;return j|0}function Xg(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;e=u;u=u+16|0;g=e;h=a+4|0;f[h>>2]=0;if(!c){u=e;return}i=a+8|0;j=f[i>>2]|0;k=j<<5;if(k>>>0<c>>>0){f[g>>2]=0;l=g+4|0;f[l>>2]=0;m=g+8|0;f[m>>2]=0;if((c|0)<0)mq(a);n=j<<6;j=c+31&-32;hi(g,k>>>0<1073741823?(n>>>0<j>>>0?j:n):2147483647);n=f[a>>2]|0;f[a>>2]=f[g>>2];f[g>>2]=n;g=f[h>>2]|0;f[h>>2]=c;f[l>>2]=g;g=f[i>>2]|0;f[i>>2]=f[m>>2];f[m>>2]=g;if(n|0)br(n);o=a}else{f[h>>2]=c;o=a}a=f[o>>2]|0;o=a;h=a;a=c>>>5;n=a<<2;if(!(b[d>>0]|0)){hj(h|0,0,n|0)|0;d=c&31;g=o+(a<<2)|0;if(!d){u=e;return}f[g>>2]=f[g>>2]&~(-1>>>(32-d|0));u=e;return}else{hj(h|0,-1,n|0)|0;n=c&31;c=o+(a<<2)|0;if(!n){u=e;return}f[c>>2]=f[c>>2]|-1>>>(32-n|0);u=e;return}}function Yg(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;c=u;u=u+16|0;d=c+8|0;e=c+4|0;g=c;f[g>>2]=f[a+12>>2];h=b+16|0;i=h;j=f[i>>2]|0;k=f[i+4>>2]|0;if((k|0)>0|(k|0)==0&j>>>0>0){l=k;m=j}else{f[e>>2]=f[b+4>>2];f[d>>2]=f[e>>2];ye(b,d,g,g+4|0)|0;j=h;l=f[j+4>>2]|0;m=f[j>>2]|0}f[g>>2]=f[a+20>>2];if((l|0)>0|(l|0)==0&m>>>0>0){n=a+88|0;fd(n,b);u=c;return 1}f[e>>2]=f[b+4>>2];f[d>>2]=f[e>>2];ye(b,d,g,g+4|0)|0;n=a+88|0;fd(n,b);u=c;return 1}function Zg(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;c=u;u=u+16|0;d=c+8|0;e=c+4|0;g=c;f[g>>2]=f[a+12>>2];h=b+16|0;i=h;j=f[i>>2]|0;k=f[i+4>>2]|0;if((k|0)>0|(k|0)==0&j>>>0>0){l=k;m=j}else{f[e>>2]=f[b+4>>2];f[d>>2]=f[e>>2];ye(b,d,g,g+4|0)|0;j=h;l=f[j+4>>2]|0;m=f[j>>2]|0}f[g>>2]=f[a+16>>2];if((l|0)>0|(l|0)==0&m>>>0>0){n=a+108|0;fd(n,b);u=c;return 1}f[e>>2]=f[b+4>>2];f[d>>2]=f[e>>2];ye(b,d,g,g+4|0)|0;n=a+108|0;fd(n,b);u=c;return 1}function _g(a){a=a|0;var c=0,d=0,e=0,g=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;c=a+32|0;d=f[a+64>>2]|0;e=(Qa[f[(f[d>>2]|0)+40>>2]&127](d)|0)+56|0;d=f[e>>2]|0;li(c,(((f[d+100>>2]|0)-(f[d+96>>2]|0)|0)/12|0)*3|0,0,1)|0;d=a+68|0;e=f[d>>2]|0;g=(f[a+72>>2]|0)-e|0;if((g|0)<=0){Qf(c);return}i=a+48|0;j=a+44|0;a=(g>>>2)+-1|0;g=e;while(1){e=f[g+(a<<2)>>2]|0;k=f[3124+(e<<2)>>2]|0;l=i;m=f[l+4>>2]|0;if((m|0)>0|(m|0)==0&(f[l>>2]|0)>>>0>0?(l=f[j>>2]|0,171>>>e&1|0):0){m=l+4|0;n=0;o=f[m>>2]|0;do{p=o>>>3;q=o&7;r=(f[l>>2]|0)+p|0;b[r>>0]=(1<<q^255)&(h[r>>0]|0);r=(f[l>>2]|0)+p|0;b[r>>0]=(e>>>n&1)<<q|(h[r>>0]|0);o=(f[m>>2]|0)+1|0;f[m>>2]=o;n=n+1|0}while((n|0)!=(k|0))}k=a+-1|0;if((k|0)<=-1)break;a=k;g=f[d>>2]|0}Qf(c);return}function $g(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0;g=u;u=u+48|0;h=g;i=g+32|0;if(!c){j=0;u=g;return j|0}Cn(h);do if((Tl(c,0)|0)!=-1){if(d){if(!(Qa[f[(f[c>>2]|0)+16>>2]&127](c)|0)){k=0;break}Va[f[(f[c>>2]|0)+20>>2]&127](c)}Dg(i,a,c,h);l=(f[i>>2]|0)==0;m=i+4|0;if((b[m+11>>0]|0)<0)br(f[m>>2]|0);if(l){l=f[h>>2]|0;m=h+4|0;ag(e,l,l+((f[m>>2]|0)-l)|0);k=(f[m>>2]|0)-(f[h>>2]|0)|0}else k=0}else k=0;while(0);e=h+12|0;i=f[e>>2]|0;f[e>>2]=0;if(i|0)br(i);i=f[h>>2]|0;if(i|0){e=h+4|0;if((f[e>>2]|0)!=(i|0))f[e>>2]=i;br(i)}j=k;u=g;return j|0}function ah(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;c=u;u=u+16|0;d=c;e=f[(f[a>>2]|0)+8>>2]|0;g=a+8|0;h=a+12|0;i=(f[h>>2]|0)-(f[g>>2]|0)>>2;j=f[b>>2]|0;f[b>>2]=0;f[d>>2]=j;Xa[e&15](a,i,d);i=f[d>>2]|0;f[d>>2]=0;if(!i){k=f[h>>2]|0;l=f[g>>2]|0;m=k-l|0;n=m>>2;o=n+-1|0;u=c;return o|0}d=i+88|0;a=f[d>>2]|0;f[d>>2]=0;if(a|0){d=f[a+8>>2]|0;if(d|0){e=a+12|0;if((f[e>>2]|0)!=(d|0))f[e>>2]=d;br(d)}br(a)}a=f[i+68>>2]|0;if(a|0){d=i+72|0;e=f[d>>2]|0;if((e|0)!=(a|0))f[d>>2]=e+(~((e+-4-a|0)>>>2)<<2);br(a)}a=i+64|0;e=f[a>>2]|0;f[a>>2]=0;if(e|0){a=f[e>>2]|0;if(a|0){d=e+4|0;if((f[d>>2]|0)!=(a|0))f[d>>2]=a;br(a)}br(e)}br(i);k=f[h>>2]|0;l=f[g>>2]|0;m=k-l|0;n=m>>2;o=n+-1|0;u=c;return o|0}function bh(a){a=a|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;if(b[a+352>>0]|0)return 1;c=a+8|0;d=f[c>>2]|0;e=(f[d+12>>2]|0)-(f[d+8>>2]|0)|0;d=e>>2;g=a+172|0;si(g,d+-1|0);if(!((d|0)!=1&(e|0)>0))return 1;e=a+12|0;a=0;h=0;while(1){i=f[(f[(f[c>>2]|0)+8>>2]|0)+(a<<2)>>2]|0;if(!(f[i+56>>2]|0))j=h;else{k=f[g>>2]|0;f[k+(h*136|0)>>2]=a;l=f[k+(h*136|0)+104>>2]|0;m=k+(h*136|0)+108|0;n=f[m>>2]|0;if((n|0)!=(l|0))f[m>>2]=n+(~((n+-4-l|0)>>>2)<<2);l=f[e>>2]|0;$j(k+(h*136|0)+104|0,(f[l+4>>2]|0)-(f[l>>2]|0)>>2);l=f[g>>2]|0;f[l+(h*136|0)+128>>2]=0;zc(l+(h*136|0)+4|0,f[c>>2]|0,f[e>>2]|0,i)|0;j=h+1|0}a=a+1|0;if((a|0)>=(d|0))break;else h=j}return 1}function ch(a){a=a|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;if(b[a+288>>0]|0)return 1;c=a+8|0;d=f[c>>2]|0;e=(f[d+12>>2]|0)-(f[d+8>>2]|0)|0;d=e>>2;g=a+172|0;si(g,d+-1|0);if(!((d|0)!=1&(e|0)>0))return 1;e=a+12|0;a=0;h=0;while(1){i=f[(f[(f[c>>2]|0)+8>>2]|0)+(a<<2)>>2]|0;if(!(f[i+56>>2]|0))j=h;else{k=f[g>>2]|0;f[k+(h*136|0)>>2]=a;l=f[k+(h*136|0)+104>>2]|0;m=k+(h*136|0)+108|0;n=f[m>>2]|0;if((n|0)!=(l|0))f[m>>2]=n+(~((n+-4-l|0)>>>2)<<2);l=f[e>>2]|0;$j(k+(h*136|0)+104|0,(f[l+4>>2]|0)-(f[l>>2]|0)>>2);l=f[g>>2]|0;f[l+(h*136|0)+128>>2]=0;zc(l+(h*136|0)+4|0,f[c>>2]|0,f[e>>2]|0,i)|0;j=h+1|0}a=a+1|0;if((a|0)>=(d|0))break;else h=j}return 1}function dh(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0;c=a+8|0;d=f[c>>2]|0;e=a+4|0;g=f[e>>2]|0;if(d-g>>3>>>0>=b>>>0){h=b;i=g;do{j=i;f[j>>2]=0;f[j+4>>2]=0;i=(f[e>>2]|0)+8|0;f[e>>2]=i;h=h+-1|0}while((h|0)!=0);return}h=f[a>>2]|0;i=g-h>>3;g=i+b|0;if(g>>>0>536870911)mq(a);j=d-h|0;h=j>>2;d=j>>3>>>0<268435455?(h>>>0<g>>>0?g:h):536870911;do if(d)if(d>>>0>536870911){h=ra(8)|0;Wo(h,14941);f[h>>2]=6944;va(h|0,1080,114)}else{k=dn(d<<3)|0;break}else k=0;while(0);h=k+(i<<3)|0;i=k+(d<<3)|0;d=b;b=h;k=h;do{g=b;f[g>>2]=0;f[g+4>>2]=0;b=k+8|0;k=b;d=d+-1|0}while((d|0)!=0);d=f[a>>2]|0;b=(f[e>>2]|0)-d|0;g=h+(0-(b>>3)<<3)|0;if((b|0)>0)Rg(g|0,d|0,b|0)|0;f[a>>2]=g;f[e>>2]=k;f[c>>2]=i;if(!d)return;br(d);return}function eh(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;e=u;u=u+16|0;g=e+4|0;h=e;i=e+8|0;j=a&255;b[i>>0]=j&127;do if(c>>>0>0|(c|0)==0&a>>>0>127){b[i>>0]=j|-128;k=d+16|0;l=f[k+4>>2]|0;if((l|0)>0|(l|0)==0&(f[k>>2]|0)>>>0>0){m=0;break}else{f[h>>2]=f[d+4>>2];f[g>>2]=f[h>>2];ye(d,g,i,i+1|0)|0;k=Wn(a|0,c|0,7)|0;m=eh(k,I,d)|0;break}}else{k=d+16|0;l=f[k+4>>2]|0;if((l|0)>0|(l|0)==0&(f[k>>2]|0)>>>0>0){m=0;break}f[h>>2]=f[d+4>>2];f[g>>2]=f[h>>2];ye(d,g,i,i+1|0)|0;n=1;u=e;return n|0}while(0);n=m;u=e;return n|0}function fh(a,b){a=a|0;b=b|0;var c=0;c=a+8|0;ef(c,b)|0;if((c|0)==(b|0)){f[a+92>>2]=f[b+84>>2];return}else{Yf(a+56|0,f[b+48>>2]|0,f[b+52>>2]|0);Yf(a+68|0,f[b+60>>2]|0,f[b+64>>2]|0);Yf(a+80|0,f[b+72>>2]|0,f[b+76>>2]|0);f[a+92>>2]=f[b+84>>2];qg(a+96|0,f[b+88>>2]|0,f[b+92>>2]|0);return}}function gh(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0;g=f[(f[(f[d+4>>2]|0)+8>>2]|0)+(c<<2)>>2]|0;if((b|0)==-1)h=Ki(c,d)|0;else h=b;if((h|0)==-2)i=0;else{do if((Qa[f[(f[d>>2]|0)+8>>2]&127](d)|0)==1){Hf(a,d,h,c,e,514);if(!(f[a>>2]|0)){f[a>>2]=0;break}else return}while(0);c=dn(44)|0;f[c>>2]=1528;f[c+4>>2]=g;g=c+8|0;f[g>>2]=f[e>>2];f[g+4>>2]=f[e+4>>2];f[g+8>>2]=f[e+8>>2];f[g+12>>2]=f[e+12>>2];f[g+16>>2]=f[e+16>>2];f[g+20>>2]=f[e+20>>2];_j(c+32|0,e+24|0);f[c>>2]=1584;i=c}f[a>>2]=i;return}function hh(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;e=u;u=u+224|0;g=e+120|0;h=e+80|0;i=e;j=e+136|0;k=h;l=k+40|0;do{f[k>>2]=0;k=k+4|0}while((k|0)<(l|0));f[g>>2]=f[d>>2];if((qb(0,c,g,i,h)|0)<0)m=-1;else{if((f[a+76>>2]|0)>-1)n=gr(a)|0;else n=0;d=f[a>>2]|0;k=d&32;if((b[a+74>>0]|0)<1)f[a>>2]=d&-33;d=a+48|0;if(!(f[d>>2]|0)){l=a+44|0;o=f[l>>2]|0;f[l>>2]=j;p=a+28|0;f[p>>2]=j;q=a+20|0;f[q>>2]=j;f[d>>2]=80;r=a+16|0;f[r>>2]=j+80;j=qb(a,c,g,i,h)|0;if(!o)s=j;else{Sa[f[a+36>>2]&31](a,0,0)|0;t=(f[q>>2]|0)==0?-1:j;f[l>>2]=o;f[d>>2]=0;f[r>>2]=0;f[p>>2]=0;f[q>>2]=0;s=t}}else s=qb(a,c,g,i,h)|0;h=f[a>>2]|0;f[a>>2]=h|k;if(n|0)fr(a);m=(h&32|0)==0?s:-1}u=e;return m|0}function ih(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0;d=u;u=u+16|0;e=d;if(!(fn(a,b,c)|0)){g=0;u=d;return g|0}if((Qa[f[(f[a>>2]|0)+32>>2]&127](a)|0)<<24>>24==1?((f[(f[a+8>>2]|0)+28>>2]|0)+-1|0)>>>0>=6:0){g=0;u=d;return g|0}h=Gg(c,f[b+48>>2]|0)|0;Xa[f[(f[a>>2]|0)+48>>2]&15](e,a,h);h=a+36|0;b=f[e>>2]|0;f[e>>2]=0;c=f[h>>2]|0;f[h>>2]=b;if(!c){f[e>>2]=0;i=b}else{Va[f[(f[c>>2]|0)+4>>2]&127](c);c=f[e>>2]|0;f[e>>2]=0;if(c|0)Va[f[(f[c>>2]|0)+4>>2]&127](c);i=f[h>>2]|0}if(!i){g=1;u=d;return g|0}if(Ra[f[(f[a>>2]|0)+36>>2]&127](a,i)|0){g=1;u=d;return g|0}i=f[h>>2]|0;f[h>>2]=0;if(!i){g=1;u=d;return g|0}Va[f[(f[i>>2]|0)+4>>2]&127](i);g=1;u=d;return g|0}function jh(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0;c=a+4|0;d=f[c>>2]|0;e=f[a>>2]|0;g=d-e>>2;h=d;if(g>>>0<b>>>0){hf(a,b-g|0);return}if(g>>>0<=b>>>0)return;g=e+(b<<2)|0;if((g|0)==(h|0))return;else i=h;do{h=i+-4|0;f[c>>2]=h;b=f[h>>2]|0;f[h>>2]=0;if(b|0){h=b+88|0;e=f[h>>2]|0;f[h>>2]=0;if(e|0){h=f[e+8>>2]|0;if(h|0){a=e+12|0;if((f[a>>2]|0)!=(h|0))f[a>>2]=h;br(h)}br(e)}e=f[b+68>>2]|0;if(e|0){h=b+72|0;a=f[h>>2]|0;if((a|0)!=(e|0))f[h>>2]=a+(~((a+-4-e|0)>>>2)<<2);br(e)}e=b+64|0;a=f[e>>2]|0;f[e>>2]=0;if(a|0){e=f[a>>2]|0;if(e|0){h=a+4|0;if((f[h>>2]|0)!=(e|0))f[h>>2]=e;br(e)}br(a)}br(b)}i=f[c>>2]|0}while((i|0)!=(g|0));return}function kh(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;d=a+8|0;e=f[d>>2]|0;g=a+4|0;h=f[g>>2]|0;i=h;if(e-h>>2>>>0>=b>>>0){j=b;k=i;while(1){f[k>>2]=f[c>>2];j=j+-1|0;if(!j)break;else k=k+4|0}f[g>>2]=i+(b<<2);return}i=f[a>>2]|0;k=h-i|0;h=k>>2;j=h+b|0;if(j>>>0>1073741823)mq(a);l=e-i|0;e=l>>1;m=l>>2>>>0<536870911?(e>>>0<j>>>0?j:e):1073741823;do if(m)if(m>>>0>1073741823){e=ra(8)|0;Wo(e,14941);f[e>>2]=6944;va(e|0,1080,114)}else{e=dn(m<<2)|0;n=e;o=e;break}else{n=0;o=0}while(0);e=n+(h<<2)|0;h=n+(m<<2)|0;m=b;j=e;while(1){f[j>>2]=f[c>>2];m=m+-1|0;if(!m)break;else j=j+4|0}if((k|0)>0)Rg(o|0,i|0,k|0)|0;f[a>>2]=n;f[g>>2]=e+(b<<2);f[d>>2]=h;if(!i)return;br(i);return}function lh(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;e=(f[a>>2]|0)+1794895138|0;g=rp(f[a+8>>2]|0,e)|0;h=rp(f[a+12>>2]|0,e)|0;i=rp(f[a+16>>2]|0,e)|0;a:do if((g>>>0<c>>>2>>>0?(j=c-(g<<2)|0,h>>>0<j>>>0&i>>>0<j>>>0):0)?((i|h)&3|0)==0:0){j=h>>>2;k=i>>>2;l=0;m=g;while(1){n=m>>>1;o=l+n|0;p=o<<1;q=p+j|0;r=rp(f[a+(q<<2)>>2]|0,e)|0;s=rp(f[a+(q+1<<2)>>2]|0,e)|0;if(!(s>>>0<c>>>0&r>>>0<(c-s|0)>>>0)){t=0;break a}if(b[a+(s+r)>>0]|0){t=0;break a}r=bl(d,a+s|0)|0;if(!r)break;s=(r|0)<0;if((m|0)==1){t=0;break a}else{l=s?l:o;m=s?n:m-n|0}}m=p+k|0;l=rp(f[a+(m<<2)>>2]|0,e)|0;j=rp(f[a+(m+1<<2)>>2]|0,e)|0;if(j>>>0<c>>>0&l>>>0<(c-j|0)>>>0)t=(b[a+(j+l)>>0]|0)==0?a+j|0:0;else t=0}else t=0;while(0);return t|0}function mh(a,c,e,g){a=a|0;c=c|0;e=e|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;h=u;u=u+64|0;i=h;j=f[a>>2]|0;k=a+(f[j+-8>>2]|0)|0;l=f[j+-4>>2]|0;f[i>>2]=e;f[i+4>>2]=a;f[i+8>>2]=c;f[i+12>>2]=g;g=i+16|0;c=i+20|0;a=i+24|0;j=i+28|0;m=i+32|0;n=i+40|0;o=g;p=o+36|0;do{f[o>>2]=0;o=o+4|0}while((o|0)<(p|0));d[g+36>>1]=0;b[g+38>>0]=0;a:do if(qp(l,e,0)|0){f[i+48>>2]=1;_a[f[(f[l>>2]|0)+20>>2]&3](l,i,k,k,1,0);q=(f[a>>2]|0)==1?k:0}else{Za[f[(f[l>>2]|0)+24>>2]&3](l,i,k,1,0);switch(f[i+36>>2]|0){case 0:{q=(f[n>>2]|0)==1&(f[j>>2]|0)==1&(f[m>>2]|0)==1?f[c>>2]|0:0;break a;break}case 1:break;default:{q=0;break a}}if((f[a>>2]|0)!=1?!((f[n>>2]|0)==0&(f[j>>2]|0)==1&(f[m>>2]|0)==1):0){q=0;break}q=f[g>>2]|0}while(0);u=h;return q|0}function nh(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;c=a+8|0;d=f[c>>2]|0;e=a+4|0;g=f[e>>2]|0;h=g;if(d-g>>2>>>0>=b>>>0){i=b;j=h;while(1){f[j>>2]=1;i=i+-1|0;if(!i)break;else j=j+4|0}f[e>>2]=h+(b<<2);return}h=f[a>>2]|0;j=g-h|0;g=j>>2;i=g+b|0;if(i>>>0>1073741823)mq(a);k=d-h|0;d=k>>1;l=k>>2>>>0<536870911?(d>>>0<i>>>0?i:d):1073741823;do if(l)if(l>>>0>1073741823){d=ra(8)|0;Wo(d,14941);f[d>>2]=6944;va(d|0,1080,114)}else{d=dn(l<<2)|0;m=d;n=d;break}else{m=0;n=0}while(0);d=m+(g<<2)|0;g=m+(l<<2)|0;l=b;i=d;while(1){f[i>>2]=1;l=l+-1|0;if(!l)break;else i=i+4|0}if((j|0)>0)Rg(n|0,h|0,j|0)|0;f[a>>2]=m;f[e>>2]=d+(b<<2);f[c>>2]=g;if(!h)return;br(h);return}function oh(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0;d=u;u=u+16|0;e=d;if(!c){g=0;u=d;return g|0}h=a+84|0;i=f[h>>2]|0;j=a+88|0;k=f[j>>2]|0;if((k|0)!=(i|0))f[j>>2]=k+(~((k+-4-i|0)>>>2)<<2);f[h>>2]=0;f[j>>2]=0;f[a+92>>2]=0;if(i|0)br(i);i=a+72|0;j=f[i>>2]|0;h=a+76|0;if((f[h>>2]|0)!=(j|0))f[h>>2]=j;f[i>>2]=0;f[h>>2]=0;f[a+80>>2]=0;if(j|0)br(j);j=c+4|0;h=(f[j>>2]|0)-(f[c>>2]|0)>>2;b[e>>0]=0;Xg(a,h,e);h=c+24|0;i=c+28|0;k=(f[i>>2]|0)-(f[h>>2]|0)>>2;b[e>>0]=0;Xg(a+12|0,k,e);Sf(a+28|0,(f[j>>2]|0)-(f[c>>2]|0)>>2,5868);$j(a+52|0,(f[i>>2]|0)-(f[h>>2]|0)>>2);$j(a+40|0,(f[i>>2]|0)-(f[h>>2]|0)>>2);f[a+64>>2]=c;b[a+24>>0]=1;g=1;u=d;return g|0}function ph(a){a=a|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0;c=a+12|0;d=f[a>>2]|0;e=a+8|0;g=f[e>>2]|0;h=(g|0)==-1;if(!(b[c>>0]|0)){do if((!h?(i=(((g>>>0)%3|0|0)==0?2:-1)+g|0,(i|0)!=-1):0)?(j=f[(f[d+12>>2]|0)+(i<<2)>>2]|0,(j|0)!=-1):0)if(!((j>>>0)%3|0)){k=j+2|0;break}else{k=j+-1|0;break}else k=-1;while(0);f[e>>2]=k;return}k=g+1|0;if((!h?(h=((k>>>0)%3|0|0)==0?g+-2|0:k,(h|0)!=-1):0)?(k=f[(f[d+12>>2]|0)+(h<<2)>>2]|0,h=k+1|0,(k|0)!=-1):0){g=((h>>>0)%3|0|0)==0?k+-2|0:h;f[e>>2]=g;if((g|0)!=-1){if((g|0)!=(f[a+4>>2]|0))return;f[e>>2]=-1;return}}else f[e>>2]=-1;g=f[a+4>>2]|0;do if(((g|0)!=-1?(a=(((g>>>0)%3|0|0)==0?2:-1)+g|0,(a|0)!=-1):0)?(h=f[(f[d+12>>2]|0)+(a<<2)>>2]|0,(h|0)!=-1):0)if(!((h>>>0)%3|0)){l=h+2|0;break}else{l=h+-1|0;break}else l=-1;while(0);f[e>>2]=l;b[c>>0]=0;return}function qh(a,b){a=a|0;b=b|0;var c=0,d=Oa,e=0,g=0;if((b|0)!=1)if(!(b+-1&b))c=b;else c=cb(b)|0;else c=2;b=f[a+4>>2]|0;if(c>>>0>b>>>0){Id(a,c);return}if(c>>>0>=b>>>0)return;d=$((f[a+12>>2]|0)>>>0);e=~~$(W($(d/$(n[a+20>>2]))))>>>0;if(b>>>0>2&(b+-1&b|0)==0)g=1<<32-(_(e+-1|0)|0);else g=cb(e)|0;e=c>>>0<g>>>0?g:c;if(e>>>0>=b>>>0)return;Id(a,e);return}function rh(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;e=u;u=u+48|0;g=e;h=e+32|0;i=a+4|0;j=f[i>>2]|0;if(!j){k=0;u=e;return k|0}do if(c)if(Qa[f[(f[j>>2]|0)+16>>2]&127](j)|0){l=f[i>>2]|0;Va[f[(f[l>>2]|0)+20>>2]&127](l);break}else{k=0;u=e;return k|0}while(0);Cn(g);Si(h,f[a>>2]|0,g);a=(f[h>>2]|0)==0;i=h+4|0;if((b[i+11>>0]|0)<0)br(f[i>>2]|0);if(a){a=f[g>>2]|0;i=g+4|0;ag(d,a,a+((f[i>>2]|0)-a)|0);m=(f[i>>2]|0)-(f[g>>2]|0)|0}else m=0;i=g+12|0;a=f[i>>2]|0;f[i>>2]=0;if(a|0)br(a);a=f[g>>2]|0;if(a|0){i=g+4|0;if((f[i>>2]|0)!=(a|0))f[i>>2]=a;br(a)}k=m;u=e;return k|0}function sh(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;d=f[a+4>>2]|0;if(!d){e=0;return e|0}a=b[c+11>>0]|0;g=a<<24>>24<0;h=g?f[c+4>>2]|0:a&255;a=g?f[c>>2]|0:c;c=d;while(1){d=c+16|0;g=b[d+11>>0]|0;i=g<<24>>24<0;j=i?f[c+20>>2]|0:g&255;g=j>>>0<h>>>0;k=g?j:h;if((k|0)!=0?(l=Pk(a,i?f[d>>2]|0:d,k)|0,(l|0)!=0):0)if((l|0)<0)m=7;else m=8;else if(h>>>0<j>>>0)m=7;else m=8;if((m|0)==7){m=0;n=c}else if((m|0)==8){m=0;l=h>>>0<j>>>0?h:j;if((l|0)!=0?(j=Pk(i?f[d>>2]|0:d,a,l)|0,(j|0)!=0):0){if((j|0)>=0){e=1;m=14;break}}else m=10;if((m|0)==10?(m=0,!g):0){e=1;m=14;break}n=c+4|0}c=f[n>>2]|0;if(!c){e=0;m=14;break}}if((m|0)==14)return e|0;return 0}function th(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0;c=u;u=u+16|0;d=c+12|0;e=c+8|0;g=c+4|0;h=c;i=a+4|0;j=(i|0)==(b|0);if(!j){f[g>>2]=f[b>>2];f[h>>2]=b+4;f[e>>2]=f[g>>2];f[d>>2]=f[h>>2];Hc(i,e,d)}if(!j){f[g>>2]=f[b+12>>2];f[h>>2]=b+16;f[e>>2]=f[g>>2];f[d>>2]=f[h>>2];Ac(a+16|0,e,d)}if(j){u=c;return}f[g>>2]=f[b+24>>2];f[h>>2]=b+28;f[e>>2]=f[g>>2];f[d>>2]=f[h>>2];Hc(a+28|0,e,d);u=c;return}function uh(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0;e=u;u=u+16|0;g=e+4|0;h=e;di(g,a,b,c,d);d=f[g>>2]|0;if(!d){i=-1;f[g>>2]=0;u=e;return i|0}f[g>>2]=0;f[h>>2]=d;d=ah(a,h)|0;a=f[h>>2]|0;f[h>>2]=0;if(!a){i=d;f[g>>2]=0;u=e;return i|0}h=a+88|0;c=f[h>>2]|0;f[h>>2]=0;if(c|0){h=f[c+8>>2]|0;if(h|0){b=c+12|0;if((f[b>>2]|0)!=(h|0))f[b>>2]=h;br(h)}br(c)}c=f[a+68>>2]|0;if(c|0){h=a+72|0;b=f[h>>2]|0;if((b|0)!=(c|0))f[h>>2]=b+(~((b+-4-c|0)>>>2)<<2);br(c)}c=a+64|0;b=f[c>>2]|0;f[c>>2]=0;if(b|0){c=f[b>>2]|0;if(c|0){h=b+4|0;if((f[h>>2]|0)!=(c|0))f[h>>2]=c;br(c)}br(b)}br(a);i=d;f[g>>2]=0;u=e;return i|0}function vh(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;e=u;u=u+16|0;g=e+4|0;h=e;i=f[a+8>>2]|0;j=i+24|0;k=b[j>>0]|0;l=c+4|0;Nf(a,(f[l>>2]|0)-(f[c>>2]|0)>>2,k,d);d=f[a+32>>2]|0;a=(f[f[d>>2]>>2]|0)+(f[d+48>>2]|0)|0;d=f[c>>2]|0;c=f[l>>2]|0;if((d|0)==(c|0)){m=1;u=e;return m|0}l=i+84|0;n=i+68|0;o=0;p=d;while(1){d=f[p>>2]|0;if(!(b[l>>0]|0))q=f[(f[n>>2]|0)+(d<<2)>>2]|0;else q=d;f[h>>2]=q;d=b[j>>0]|0;f[g>>2]=f[h>>2];if(!(Pb(i,g,d,a+(o<<2)|0)|0)){m=0;r=7;break}p=p+4|0;if((p|0)==(c|0)){m=1;r=7;break}else o=o+k|0}if((r|0)==7){u=e;return m|0}return 0}function wh(a){a=a|0;var b=0,c=0,d=0,e=0,g=0,h=0,i=0;f[a>>2]=1392;b=a+72|0;c=f[b>>2]|0;f[b>>2]=0;if(c|0)Va[f[(f[c>>2]|0)+4>>2]&127](c);c=f[a+60>>2]|0;if(c|0){b=a+64|0;d=f[b>>2]|0;if((d|0)!=(c|0))f[b>>2]=d+(~((d+-4-c|0)>>>2)<<2);br(c)}c=f[a+48>>2]|0;if(c|0)br(c);c=a+36|0;d=f[c>>2]|0;if(d|0){b=a+40|0;e=f[b>>2]|0;if((e|0)==(d|0))g=d;else{h=e;do{e=h+-4|0;f[b>>2]=e;i=f[e>>2]|0;f[e>>2]=0;if(i|0)Va[f[(f[i>>2]|0)+4>>2]&127](i);h=f[b>>2]|0}while((h|0)!=(d|0));g=f[c>>2]|0}br(g)}f[a>>2]=1216;g=f[a+16>>2]|0;if(g|0){c=a+20|0;d=f[c>>2]|0;if((d|0)!=(g|0))f[c>>2]=d+(~((d+-4-g|0)>>>2)<<2);br(g)}g=f[a+4>>2]|0;if(!g)return;d=a+8|0;a=f[d>>2]|0;if((a|0)!=(g|0))f[d>>2]=a+(~((a+-4-g|0)>>>2)<<2);br(g);return}function xh(a){a=a|0;tj(a+992|0);tj(a+960|0);tj(a+928|0);tj(a+896|0);tj(a+864|0);tj(a+832|0);tj(a+800|0);tj(a+768|0);tj(a+736|0);tj(a+704|0);tj(a+672|0);tj(a+640|0);tj(a+608|0);tj(a+576|0);tj(a+544|0);tj(a+512|0);tj(a+480|0);tj(a+448|0);tj(a+416|0);tj(a+384|0);tj(a+352|0);tj(a+320|0);tj(a+288|0);tj(a+256|0);tj(a+224|0);tj(a+192|0);tj(a+160|0);tj(a+128|0);tj(a+96|0);tj(a+64|0);tj(a+32|0);tj(a);return}function yh(a){a=a|0;rn(a);rn(a+32|0);rn(a+64|0);rn(a+96|0);rn(a+128|0);rn(a+160|0);rn(a+192|0);rn(a+224|0);rn(a+256|0);rn(a+288|0);rn(a+320|0);rn(a+352|0);rn(a+384|0);rn(a+416|0);rn(a+448|0);rn(a+480|0);rn(a+512|0);rn(a+544|0);rn(a+576|0);rn(a+608|0);rn(a+640|0);rn(a+672|0);rn(a+704|0);rn(a+736|0);rn(a+768|0);rn(a+800|0);rn(a+832|0);rn(a+864|0);rn(a+896|0);rn(a+928|0);rn(a+960|0);rn(a+992|0);return}function zh(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0;a=u;u=u+16|0;e=a;if((c|0)<0|((b|0)==0|(d|0)==0)){g=0;u=a;return g|0}h=f[b+8>>2]|0;if(((f[b+12>>2]|0)-h>>2|0)<=(c|0)){g=0;u=a;return g|0}i=b+4|0;if(!(f[i>>2]|0)){j=dn(52)|0;f[j>>2]=0;f[j+4>>2]=0;f[j+8>>2]=0;f[j+12>>2]=0;n[j+16>>2]=$(1.0);k=j+20|0;f[k>>2]=0;f[k+4>>2]=0;f[k+8>>2]=0;f[k+12>>2]=0;n[j+36>>2]=$(1.0);f[j+40>>2]=0;f[j+44>>2]=0;f[j+48>>2]=0;f[b+4>>2]=j}j=f[(f[h+(c<<2)>>2]|0)+60>>2]|0;c=dn(44)|0;Ub(c,d);f[c+40>>2]=j;j=f[i>>2]|0;f[e>>2]=c;gk(j,e)|0;j=f[e>>2]|0;f[e>>2]=0;if(!j){g=1;u=a;return g|0}Qi(j);br(j);g=1;u=a;return g|0}function Ah(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;f[a>>2]=d;e=a+24|0;g=a+28|0;h=f[g>>2]|0;i=f[e>>2]|0;j=h-i>>2;k=i;i=h;if(j>>>0>=d>>>0){if(j>>>0>d>>>0?(h=k+(d<<2)|0,(h|0)!=(i|0)):0)f[g>>2]=i+(~((i+-4-h|0)>>>2)<<2)}else oi(e,d-j|0);if(!c)return;j=f[b>>2]|0;if((c|0)>1){d=j;e=j;h=1;while(1){i=f[b+(h<<2)>>2]|0;g=(i|0)<(e|0);k=g?i:e;l=g?d:(i|0)>(d|0)?i:d;h=h+1|0;if((h|0)==(c|0)){m=l;n=k;break}else{d=l;e=k}}}else{m=j;n=j}f[a+4>>2]=n;f[a+8>>2]=m;j=Vn(m|0,((m|0)<0)<<31>>31|0,n|0,((n|0)<0)<<31>>31|0)|0;n=I;if(!(n>>>0<0|(n|0)==0&j>>>0<2147483647))return;n=j+1|0;f[a+12>>2]=n;j=(n|0)/2|0;m=a+16|0;f[m>>2]=j;f[a+20>>2]=0-j;if(n&1|0)return;f[m>>2]=j+-1;return}function Bh(a,c,d,e,g,h,i){a=a|0;c=c|0;d=d|0;e=e|0;g=g|0;h=h|0;i=i|0;var j=0,k=0;c=u;u=u+64|0;j=c;k=i?6:5;Al(j);i=f[h+56>>2]|0;h=X(Ll(k)|0,e)|0;yj(j,i,0,e&255,k,0,h,((h|0)<0)<<31>>31,0,0);h=dn(96)|0;nl(h,j);f[a>>2]=h;pj(h,d)|0;d=h+84|0;if(!g){b[d>>0]=1;a=f[h+68>>2]|0;j=h+72|0;k=f[j>>2]|0;if((k|0)==(a|0)){u=c;return}f[j>>2]=k+(~((k+-4-a|0)>>>2)<<2);u=c;return}b[d>>0]=0;d=h+68|0;a=h+72|0;h=f[a>>2]|0;k=f[d>>2]|0;j=h-k>>2;e=h;if(j>>>0<g>>>0){kh(d,g-j|0,1200);u=c;return}if(j>>>0<=g>>>0){u=c;return}j=k+(g<<2)|0;if((j|0)==(e|0)){u=c;return}f[a>>2]=e+(~((e+-4-j|0)>>>2)<<2);u=c;return}function Ch(a,b){a=a|0;b=b|0;var c=0,d=Oa,e=0,g=0;if((b|0)!=1)if(!(b+-1&b))c=b;else c=cb(b)|0;else c=2;b=f[a+4>>2]|0;if(c>>>0>b>>>0){jd(a,c);return}if(c>>>0>=b>>>0)return;d=$((f[a+12>>2]|0)>>>0);e=~~$(W($(d/$(n[a+16>>2]))))>>>0;if(b>>>0>2&(b+-1&b|0)==0)g=1<<32-(_(e+-1|0)|0);else g=cb(e)|0;e=c>>>0<g>>>0?g:c;if(e>>>0>=b>>>0)return;jd(a,e);return}function Dh(a,b){a=a|0;b=b|0;var c=0,d=Oa,e=0,g=0;if((b|0)!=1)if(!(b+-1&b))c=b;else c=cb(b)|0;else c=2;b=f[a+4>>2]|0;if(c>>>0>b>>>0){nd(a,c);return}if(c>>>0>=b>>>0)return;d=$((f[a+12>>2]|0)>>>0);e=~~$(W($(d/$(n[a+16>>2]))))>>>0;if(b>>>0>2&(b+-1&b|0)==0)g=1<<32-(_(e+-1|0)|0);else g=cb(e)|0;e=c>>>0<g>>>0?g:c;if(e>>>0>=b>>>0)return;nd(a,e);return}function Eh(a,b){a=a|0;b=b|0;var c=0,d=Oa,e=0,g=0;if((b|0)!=1)if(!(b+-1&b))c=b;else c=cb(b)|0;else c=2;b=f[a+4>>2]|0;if(c>>>0>b>>>0){ud(a,c);return}if(c>>>0>=b>>>0)return;d=$((f[a+12>>2]|0)>>>0);e=~~$(W($(d/$(n[a+16>>2]))))>>>0;if(b>>>0>2&(b+-1&b|0)==0)g=1<<32-(_(e+-1|0)|0);else g=cb(e)|0;e=c>>>0<g>>>0?g:c;if(e>>>0>=b>>>0)return;ud(a,e);return}function Fh(a,b){a=a|0;b=b|0;var c=0,d=Oa,e=0,g=0;if((b|0)!=1)if(!(b+-1&b))c=b;else c=cb(b)|0;else c=2;b=f[a+4>>2]|0;if(c>>>0>b>>>0){Ed(a,c);return}if(c>>>0>=b>>>0)return;d=$((f[a+12>>2]|0)>>>0);e=~~$(W($(d/$(n[a+16>>2]))))>>>0;if(b>>>0>2&(b+-1&b|0)==0)g=1<<32-(_(e+-1|0)|0);else g=cb(e)|0;e=c>>>0<g>>>0?g:c;if(e>>>0>=b>>>0)return;Ed(a,e);return}function Gh(a,b){a=a|0;b=b|0;var c=0,d=Oa,e=0,g=0;if((b|0)!=1)if(!(b+-1&b))c=b;else c=cb(b)|0;else c=2;b=f[a+4>>2]|0;if(c>>>0>b>>>0){ld(a,c);return}if(c>>>0>=b>>>0)return;d=$((f[a+12>>2]|0)>>>0);e=~~$(W($(d/$(n[a+16>>2]))))>>>0;if(b>>>0>2&(b+-1&b|0)==0)g=1<<32-(_(e+-1|0)|0);else g=cb(e)|0;e=c>>>0<g>>>0?g:c;if(e>>>0>=b>>>0)return;ld(a,e);return}function Hh(a,b){a=a|0;b=b|0;var c=0,d=Oa,e=0,g=0;if((b|0)!=1)if(!(b+-1&b))c=b;else c=cb(b)|0;else c=2;b=f[a+4>>2]|0;if(c>>>0>b>>>0){qd(a,c);return}if(c>>>0>=b>>>0)return;d=$((f[a+12>>2]|0)>>>0);e=~~$(W($(d/$(n[a+16>>2]))))>>>0;if(b>>>0>2&(b+-1&b|0)==0)g=1<<32-(_(e+-1|0)|0);else g=cb(e)|0;e=c>>>0<g>>>0?g:c;if(e>>>0>=b>>>0)return;qd(a,e);return}function Ih(a,b){a=a|0;b=b|0;var c=0,d=Oa,e=0,g=0;if((b|0)!=1)if(!(b+-1&b))c=b;else c=cb(b)|0;else c=2;b=f[a+4>>2]|0;if(c>>>0>b>>>0){yd(a,c);return}if(c>>>0>=b>>>0)return;d=$((f[a+12>>2]|0)>>>0);e=~~$(W($(d/$(n[a+16>>2]))))>>>0;if(b>>>0>2&(b+-1&b|0)==0)g=1<<32-(_(e+-1|0)|0);else g=cb(e)|0;e=c>>>0<g>>>0?g:c;if(e>>>0>=b>>>0)return;yd(a,e);return}function Jh(a,b){a=a|0;b=b|0;var c=0,d=Oa,e=0,g=0;if((b|0)!=1)if(!(b+-1&b))c=b;else c=cb(b)|0;else c=2;b=f[a+4>>2]|0;if(c>>>0>b>>>0){kd(a,c);return}if(c>>>0>=b>>>0)return;d=$((f[a+12>>2]|0)>>>0);e=~~$(W($(d/$(n[a+16>>2]))))>>>0;if(b>>>0>2&(b+-1&b|0)==0)g=1<<32-(_(e+-1|0)|0);else g=cb(e)|0;e=c>>>0<g>>>0?g:c;if(e>>>0>=b>>>0)return;kd(a,e);return}function Kh(a,b){a=a|0;b=b|0;var c=0,d=Oa,e=0,g=0;if((b|0)!=1)if(!(b+-1&b))c=b;else c=cb(b)|0;else c=2;b=f[a+4>>2]|0;if(c>>>0>b>>>0){od(a,c);return}if(c>>>0>=b>>>0)return;d=$((f[a+12>>2]|0)>>>0);e=~~$(W($(d/$(n[a+16>>2]))))>>>0;if(b>>>0>2&(b+-1&b|0)==0)g=1<<32-(_(e+-1|0)|0);else g=cb(e)|0;e=c>>>0<g>>>0?g:c;if(e>>>0>=b>>>0)return;od(a,e);return}function Lh(a,b){a=a|0;b=b|0;var c=0,d=Oa,e=0,g=0;if((b|0)!=1)if(!(b+-1&b))c=b;else c=cb(b)|0;else c=2;b=f[a+4>>2]|0;if(c>>>0>b>>>0){vd(a,c);return}if(c>>>0>=b>>>0)return;d=$((f[a+12>>2]|0)>>>0);e=~~$(W($(d/$(n[a+16>>2]))))>>>0;if(b>>>0>2&(b+-1&b|0)==0)g=1<<32-(_(e+-1|0)|0);else g=cb(e)|0;e=c>>>0<g>>>0?g:c;if(e>>>0>=b>>>0)return;vd(a,e);return}function Mh(a,b){a=a|0;b=b|0;var c=0,d=Oa,e=0,g=0;if((b|0)!=1)if(!(b+-1&b))c=b;else c=cb(b)|0;else c=2;b=f[a+4>>2]|0;if(c>>>0>b>>>0){Fd(a,c);return}if(c>>>0>=b>>>0)return;d=$((f[a+12>>2]|0)>>>0);e=~~$(W($(d/$(n[a+16>>2]))))>>>0;if(b>>>0>2&(b+-1&b|0)==0)g=1<<32-(_(e+-1|0)|0);else g=cb(e)|0;e=c>>>0<g>>>0?g:c;if(e>>>0>=b>>>0)return;Fd(a,e);return}function Nh(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0;d=u;u=u+16|0;e=d+4|0;g=d;h=d+8|0;b[h>>0]=a&127;do if(a>>>0>127){b[h>>0]=a|128;i=c+16|0;j=f[i+4>>2]|0;if((j|0)>0|(j|0)==0&(f[i>>2]|0)>>>0>0){k=0;break}else{f[g>>2]=f[c+4>>2];f[e>>2]=f[g>>2];ye(c,e,h,h+1|0)|0;k=Nh(a>>>7,c)|0;break}}else{i=c+16|0;j=f[i+4>>2]|0;if((j|0)>0|(j|0)==0&(f[i>>2]|0)>>>0>0){k=0;break}f[g>>2]=f[c+4>>2];f[e>>2]=f[g>>2];ye(c,e,h,h+1|0)|0;l=1;u=d;return l|0}while(0);l=k;u=d;return l|0}function Oh(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;d=u;u=u+16|0;e=d;Be(e,a+40|0,f[a+8>>2]|0,b,c);Wi(a,e);a=f[e>>2]|0;f[e>>2]=0;if(!a){u=d;return 1}e=a+88|0;c=f[e>>2]|0;f[e>>2]=0;if(c|0){e=f[c+8>>2]|0;if(e|0){b=c+12|0;if((f[b>>2]|0)!=(e|0))f[b>>2]=e;br(e)}br(c)}c=f[a+68>>2]|0;if(c|0){e=a+72|0;b=f[e>>2]|0;if((b|0)!=(c|0))f[e>>2]=b+(~((b+-4-c|0)>>>2)<<2);br(c)}c=a+64|0;b=f[c>>2]|0;f[c>>2]=0;if(b|0){c=f[b>>2]|0;if(c|0){e=b+4|0;if((f[e>>2]|0)!=(c|0))f[e>>2]=c;br(c)}br(b)}br(a);u=d;return 1}function Ph(a,b){a=a|0;b=b|0;var c=0,d=Oa,e=0,g=0;if((b|0)!=1)if(!(b+-1&b))c=b;else c=cb(b)|0;else c=2;b=f[a+4>>2]|0;if(c>>>0>b>>>0){rd(a,c);return}if(c>>>0>=b>>>0)return;d=$((f[a+12>>2]|0)>>>0);e=~~$(W($(d/$(n[a+16>>2]))))>>>0;if(b>>>0>2&(b+-1&b|0)==0)g=1<<32-(_(e+-1|0)|0);else g=cb(e)|0;e=c>>>0<g>>>0?g:c;if(e>>>0>=b>>>0)return;rd(a,e);return}function Qh(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0;e=u;u=u+48|0;g=e;h=e+32|0;if(!c){i=0;u=e;return i|0}Cn(g);if((Tl(c,0)|0)!=-1?Qa[f[(f[c>>2]|0)+16>>2]&127](c)|0:0){Va[f[(f[c>>2]|0)+20>>2]&127](c);Zf(h,a,c,g);c=(f[h>>2]|0)==0;a=h+4|0;if((b[a+11>>0]|0)<0)br(f[a>>2]|0);if(c){c=f[g>>2]|0;a=g+4|0;ag(d,c,c+((f[a>>2]|0)-c)|0);j=(f[a>>2]|0)-(f[g>>2]|0)|0}else j=0}else j=0;a=g+12|0;c=f[a>>2]|0;f[a>>2]=0;if(c|0)br(c);c=f[g>>2]|0;if(c|0){a=g+4|0;if((f[a>>2]|0)!=(c|0))f[a>>2]=c;br(c)}i=j;u=e;return i|0}function Rh(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;d=u;u=u+16|0;e=d;se(e,a+40|0,f[a+8>>2]|0,b,c);Wi(a,e);a=f[e>>2]|0;f[e>>2]=0;if(!a){u=d;return 1}e=a+88|0;c=f[e>>2]|0;f[e>>2]=0;if(c|0){e=f[c+8>>2]|0;if(e|0){b=c+12|0;if((f[b>>2]|0)!=(e|0))f[b>>2]=e;br(e)}br(c)}c=f[a+68>>2]|0;if(c|0){e=a+72|0;b=f[e>>2]|0;if((b|0)!=(c|0))f[e>>2]=b+(~((b+-4-c|0)>>>2)<<2);br(c)}c=a+64|0;b=f[c>>2]|0;f[c>>2]=0;if(b|0){c=f[b>>2]|0;if(c|0){e=b+4|0;if((f[e>>2]|0)!=(c|0))f[e>>2]=c;br(c)}br(b)}br(a);u=d;return 1}function Sh(a){a=a|0;var b=0,c=0,d=0,e=0,g=0,h=0,i=0,j=0;b=f[a>>2]|0;if(!b)return;c=a+4|0;d=f[c>>2]|0;if((d|0)==(b|0))e=b;else{g=d;do{d=g+-4|0;f[c>>2]=d;h=f[d>>2]|0;f[d>>2]=0;if(h|0){d=h+88|0;i=f[d>>2]|0;f[d>>2]=0;if(i|0){d=f[i+8>>2]|0;if(d|0){j=i+12|0;if((f[j>>2]|0)!=(d|0))f[j>>2]=d;br(d)}br(i)}i=f[h+68>>2]|0;if(i|0){d=h+72|0;j=f[d>>2]|0;if((j|0)!=(i|0))f[d>>2]=j+(~((j+-4-i|0)>>>2)<<2);br(i)}i=h+64|0;j=f[i>>2]|0;f[i>>2]=0;if(j|0){i=f[j>>2]|0;if(i|0){d=j+4|0;if((f[d>>2]|0)!=(i|0))f[d>>2]=i;br(i)}br(j)}br(h)}g=f[c>>2]|0}while((g|0)!=(b|0));e=f[a>>2]|0}br(e);return}function Th(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;e=(d|0)<0;do if(!b){if(e){g=0;return g|0}h=a+4|0;i=f[h>>2]|0;j=f[a>>2]|0;k=i-j|0;if(k>>>0<c>>>0){ri(a,c-k|0);break}if(k>>>0>c>>>0?(k=j+c|0,(k|0)!=(i|0)):0)f[h>>2]=k}else{if(e){g=0;return g|0}k=a+4|0;h=f[k>>2]|0;i=f[a>>2]|0;j=h-i|0;do if(0<(d|0)|0==(d|0)&j>>>0<c>>>0){if(j>>>0<c>>>0){ri(a,c-j|0);break}if(j>>>0>c>>>0?(l=i+c|0,(l|0)!=(h|0)):0){f[k>>2]=l;m=15}else m=15}else m=15;while(0);if((m|0)==15?(c|0)==0:0)break;Xl(f[a>>2]|0,b|0,c|0)|0}while(0);c=a+24|0;a=c;b=Tn(f[a>>2]|0,f[a+4>>2]|0,1,0)|0;a=c;f[a>>2]=b;f[a+4>>2]=I;g=1;return g|0}function Uh(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;d=u;u=u+16|0;e=d+4|0;g=d;h=d+8|0;if(!(ve(a,c)|0)){i=0;u=d;return i|0}j=a+36|0;k=a+40|0;a=f[j>>2]|0;if((f[k>>2]|0)==(a|0)){i=1;u=d;return i|0}l=c+16|0;m=c+4|0;n=h+1|0;o=0;p=a;do{a=f[p+(o<<2)>>2]|0;q=Qa[f[(f[a>>2]|0)+32>>2]&127](a)|0;b[h>>0]=q;q=l;a=f[q+4>>2]|0;if(!((a|0)>0|(a|0)==0&(f[q>>2]|0)>>>0>0)){f[g>>2]=f[m>>2];f[e>>2]=f[g>>2];ye(c,e,h,n)|0}o=o+1|0;p=f[j>>2]|0}while(o>>>0<(f[k>>2]|0)-p>>2>>>0);i=1;u=d;return i|0}function Vh(a){a=a|0;var c=0,d=0,e=0,g=0,h=0,i=0;c=u;u=u+16|0;d=c;wp(a);f[a+16>>2]=0;f[a+20>>2]=0;f[a+12>>2]=a+16;e=a+24|0;wp(e);f[d>>2]=0;f[d+4>>2]=0;f[d+8>>2]=0;a=dn(32)|0;f[d>>2]=a;f[d+8>>2]=-2147483616;f[d+4>>2]=20;g=a;h=13101;i=g+20|0;do{b[g>>0]=b[h>>0]|0;g=g+1|0;h=h+1|0}while((g|0)<(i|0));b[a+20>>0]=0;Mj(e,d,1);if((b[d+11>>0]|0)<0)br(f[d>>2]|0);f[d>>2]=0;f[d+4>>2]=0;f[d+8>>2]=0;a=dn(32)|0;f[d>>2]=a;f[d+8>>2]=-2147483616;f[d+4>>2]=22;g=a;h=13122;i=g+22|0;do{b[g>>0]=b[h>>0]|0;g=g+1|0;h=h+1|0}while((g|0)<(i|0));b[a+22>>0]=0;Mj(e,d,1);if((b[d+11>>0]|0)>=0){u=c;return}br(f[d>>2]|0);u=c;return}function Wh(a){a=a|0;var b=0,c=0,d=0,e=0,g=0,h=0,i=0;b=f[a+4>>2]|0;c=a+8|0;d=f[c>>2]|0;if((d|0)!=(b|0)){e=d;do{d=e+-4|0;f[c>>2]=d;g=f[d>>2]|0;f[d>>2]=0;if(g|0){d=g+88|0;h=f[d>>2]|0;f[d>>2]=0;if(h|0){d=f[h+8>>2]|0;if(d|0){i=h+12|0;if((f[i>>2]|0)!=(d|0))f[i>>2]=d;br(d)}br(h)}h=f[g+68>>2]|0;if(h|0){d=g+72|0;i=f[d>>2]|0;if((i|0)!=(h|0))f[d>>2]=i+(~((i+-4-h|0)>>>2)<<2);br(h)}h=g+64|0;i=f[h>>2]|0;f[h>>2]=0;if(i|0){h=f[i>>2]|0;if(h|0){d=i+4|0;if((f[d>>2]|0)!=(h|0))f[d>>2]=h;br(h)}br(i)}br(g)}e=f[c>>2]|0}while((e|0)!=(b|0))}b=f[a>>2]|0;if(!b)return;br(b);return}function Xh(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;c=u;u=u+16|0;d=c+8|0;e=c+4|0;g=c;f[g>>2]=f[a+12>>2];h=b+16|0;i=h;j=f[i>>2]|0;k=f[i+4>>2]|0;if((k|0)>0|(k|0)==0&j>>>0>0){l=k;m=j}else{f[e>>2]=f[b+4>>2];f[d>>2]=f[e>>2];ye(b,d,g,g+4|0)|0;j=h;l=f[j+4>>2]|0;m=f[j>>2]|0}f[g>>2]=f[a+20>>2];if((l|0)>0|(l|0)==0&m>>>0>0){u=c;return 1}f[e>>2]=f[b+4>>2];f[d>>2]=f[e>>2];ye(b,d,g,g+4|0)|0;u=c;return 1}function Yh(a){a=a|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;c=u;u=u+16|0;d=c;e=dn(16)|0;f[d>>2]=e;f[d+8>>2]=-2147483632;f[d+4>>2]=14;g=e;h=12975;i=g+14|0;do{b[g>>0]=b[h>>0]|0;g=g+1|0;h=h+1|0}while((g|0)<(i|0));b[e+14>>0]=0;e=yk(a,d,-1)|0;if((b[d+11>>0]|0)<0)br(f[d>>2]|0);j=dn(16)|0;f[d>>2]=j;f[d+8>>2]=-2147483632;f[d+4>>2]=14;g=j;h=12990;i=g+14|0;do{b[g>>0]=b[h>>0]|0;g=g+1|0;h=h+1|0}while((g|0)<(i|0));b[j+14>>0]=0;j=yk(a,d,-1)|0;if((b[d+11>>0]|0)>=0){k=(e|0)<(j|0);l=k?j:e;m=(l|0)==-1;n=m?5:l;u=c;return n|0}br(f[d>>2]|0);k=(e|0)<(j|0);l=k?j:e;m=(l|0)==-1;n=m?5:l;u=c;return n|0}function Zh(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;c=u;u=u+16|0;d=c+8|0;e=c+4|0;g=c;f[g>>2]=f[a+12>>2];h=b+16|0;i=h;j=f[i>>2]|0;k=f[i+4>>2]|0;if((k|0)>0|(k|0)==0&j>>>0>0){l=k;m=j}else{f[e>>2]=f[b+4>>2];f[d>>2]=f[e>>2];ye(b,d,g,g+4|0)|0;j=h;l=f[j+4>>2]|0;m=f[j>>2]|0}f[g>>2]=f[a+16>>2];if((l|0)>0|(l|0)==0&m>>>0>0){u=c;return 1}f[e>>2]=f[b+4>>2];f[d>>2]=f[e>>2];ye(b,d,g,g+4|0)|0;u=c;return 1}function _h(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;g=dn(32)|0;f[a>>2]=g;f[a+4>>2]=c+8;c=a+8|0;b[c>>0]=0;h=g+8|0;f[h>>2]=f[e>>2];f[h+4>>2]=f[e+4>>2];f[h+8>>2]=f[e+8>>2];f[e>>2]=0;f[e+4>>2]=0;f[e+8>>2]=0;h=g+20|0;i=e+12|0;f[h>>2]=0;f[g+24>>2]=0;f[g+28>>2]=0;g=e+16|0;e=f[g>>2]|0;j=f[i>>2]|0;k=e-j|0;if(!k){l=j;m=e;n=0}else{ri(h,k);l=f[i>>2]|0;m=f[g>>2]|0;n=f[h>>2]|0}Rg(n|0,l|0,m-l|0)|0;b[c>>0]=1;c=f[a>>2]|0;f[c+4>>2]=d;f[c>>2]=0;return}function $h(a){a=a|0;var b=0,c=0,d=0,e=0,g=0,h=0,i=0,j=0;b=a+32|0;fd(a,b);c=a+80|0;d=f[c>>2]|0;if((d|0?(e=a+84|0,(f[e>>2]|0)>0):0)?(fd(d,b),(f[e>>2]|0)>1):0){d=1;do{fd((f[c>>2]|0)+(d<<5)|0,b);d=d+1|0}while((d|0)<(f[e>>2]|0))}e=a+136|0;d=a+140|0;a=f[e>>2]|0;if((f[d>>2]|0)==(a|0))return;c=0;g=a;while(1){a=g;Nh((f[a+(c*12|0)+4>>2]|0)-(f[a+(c*12|0)>>2]|0)>>2,b)|0;a=f[e>>2]|0;h=f[a+(c*12|0)>>2]|0;i=(f[a+(c*12|0)+4>>2]|0)-h>>2;if(!i)j=a;else{Dc(h,i,1,0,b)|0;j=f[e>>2]|0}c=c+1|0;if(c>>>0>=(((f[d>>2]|0)-j|0)/12|0)>>>0)break;else g=j}return}function ai(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;e=d+16|0;g=f[e>>2]|0;if(!g)if(!(pl(d)|0)){h=f[e>>2]|0;i=5}else j=0;else{h=g;i=5}a:do if((i|0)==5){g=d+20|0;e=f[g>>2]|0;k=e;if((h-e|0)>>>0<c>>>0){j=Sa[f[d+36>>2]&31](d,a,c)|0;break}b:do if((b[d+75>>0]|0)>-1){e=c;while(1){if(!e){l=0;m=a;n=c;o=k;break b}p=e+-1|0;if((b[a+p>>0]|0)==10)break;else e=p}p=Sa[f[d+36>>2]&31](d,a,e)|0;if(p>>>0<e>>>0){j=p;break a}l=e;m=a+e|0;n=c-e|0;o=f[g>>2]|0}else{l=0;m=a;n=c;o=k}while(0);Rg(o|0,m|0,n|0)|0;f[g>>2]=(f[g>>2]|0)+n;j=l+n|0}while(0);return j|0}function bi(a){a=a|0;var c=0,d=0,e=0,g=0,h=0,i=0;c=a+12|0;d=f[c>>2]|0;f[c>>2]=0;if(d|0){c=f[d+28>>2]|0;if(c|0){e=c;do{c=e;e=f[e>>2]|0;bi(c+8|0);br(c)}while((e|0)!=0)}e=d+20|0;c=f[e>>2]|0;f[e>>2]=0;if(c|0)br(c);c=f[d+8>>2]|0;if(c|0){e=c;do{c=e;e=f[e>>2]|0;g=c+8|0;h=f[c+20>>2]|0;if(h|0){i=c+24|0;if((f[i>>2]|0)!=(h|0))f[i>>2]=h;br(h)}if((b[g+11>>0]|0)<0)br(f[g>>2]|0);br(c)}while((e|0)!=0)}e=f[d>>2]|0;f[d>>2]=0;if(e|0)br(e);br(d)}if((b[a+11>>0]|0)>=0)return;br(f[a>>2]|0);return}function ci(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,o=0;g=u;u=u+32|0;h=g+12|0;i=g;f[h>>2]=0;f[h+4>>2]=0;f[h+8>>2]=0;if((e|0)>0){j=i+11|0;k=i+4|0;l=0;do{if((l|0)>0)vn(h,12890)|0;cl(i,$(n[d+(l<<2)>>2]));m=b[j>>0]|0;o=m<<24>>24<0;$i(h,o?f[i>>2]|0:i,o?f[k>>2]|0:m&255)|0;if((b[j>>0]|0)<0)br(f[i>>2]|0);l=l+1|0}while((l|0)<(e|0))}Ql(mi(a,c)|0,h)|0;if((b[h+11>>0]|0)>=0){u=g;return}br(f[h>>2]|0);u=g;return}function di(a,c,d,e,g){a=a|0;c=c|0;d=d|0;e=e|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;if((f[d+56>>2]|0)==-1){h=0;f[a>>2]=h;return}i=dn(96)|0;nl(i,d);d=i;do if(!e){j=f[c+80>>2]|0;b[i+84>>0]=0;k=i+68|0;l=i+72|0;m=f[l>>2]|0;n=f[k>>2]|0;o=m-n>>2;p=m;if(j>>>0>o>>>0){kh(k,j-o|0,5908);break}if(j>>>0<o>>>0?(o=n+(j<<2)|0,(o|0)!=(p|0)):0)f[l>>2]=p+(~((p+-4-o|0)>>>2)<<2)}else{b[i+84>>0]=1;o=f[i+68>>2]|0;p=i+72|0;l=f[p>>2]|0;if((l|0)!=(o|0))f[p>>2]=l+(~((l+-4-o|0)>>>2)<<2);f[i+80>>2]=f[c+80>>2]}while(0);if(!g){h=d;f[a>>2]=h;return}pj(i,g)|0;h=d;f[a>>2]=h;return}function ei(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;c=a+4|0;d=f[a>>2]|0;e=(f[c>>2]|0)-d|0;g=e>>3;h=g+1|0;if(h>>>0>536870911)mq(a);i=a+8|0;j=(f[i>>2]|0)-d|0;k=j>>2;l=j>>3>>>0<268435455?(k>>>0<h>>>0?h:k):536870911;do if(l)if(l>>>0>536870911){k=ra(8)|0;Wo(k,14941);f[k>>2]=6944;va(k|0,1080,114)}else{k=dn(l<<3)|0;m=k;n=k;break}else{m=0;n=0}while(0);k=m+(g<<3)|0;g=b;b=f[g+4>>2]|0;h=k;f[h>>2]=f[g>>2];f[h+4>>2]=b;if((e|0)>0)Rg(n|0,d|0,e|0)|0;f[a>>2]=m;f[c>>2]=k+8;f[i>>2]=m+(l<<3);if(!d)return;br(d);return}function fi(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;c=u;u=u+16|0;d=c;if((Qa[f[(f[b>>2]|0)+20>>2]&127](b)|0)<=0){e=1;u=c;return e|0}g=a+4|0;h=a+20|0;i=a+24|0;j=a+16|0;a=0;while(1){k=f[(f[g>>2]|0)+4>>2]|0;l=Tl(k,Ra[f[(f[b>>2]|0)+24>>2]&127](b,a)|0)|0;f[d>>2]=l;if((l|0)==-1)break;k=f[h>>2]|0;if((k|0)==(f[i>>2]|0))Ci(j,d);else{f[k>>2]=l;f[h>>2]=k+4}al(f[g>>2]|0,f[d>>2]|0)|0;a=a+1|0;if((a|0)>=(Qa[f[(f[b>>2]|0)+20>>2]&127](b)|0)){e=1;m=9;break}}if((m|0)==9){u=c;return e|0}e=0;u=c;return e|0}function gi(a){a=a|0;var b=0,c=0,d=0,e=0,g=0,h=0;f[a>>2]=1276;Sh(a+60|0);b=f[a+48>>2]|0;if(b|0){c=a+52|0;d=f[c>>2]|0;if((d|0)!=(b|0))f[c>>2]=d+(~((d+-4-b|0)>>>2)<<2);br(b)}b=a+36|0;d=f[b>>2]|0;if(d|0){c=a+40|0;e=f[c>>2]|0;if((e|0)==(d|0))g=d;else{h=e;do{e=h+-24|0;f[c>>2]=e;Va[f[f[e>>2]>>2]&127](e);h=f[c>>2]|0}while((h|0)!=(d|0));g=f[b>>2]|0}br(g)}f[a>>2]=1216;g=f[a+16>>2]|0;if(g|0){b=a+20|0;d=f[b>>2]|0;if((d|0)!=(g|0))f[b>>2]=d+(~((d+-4-g|0)>>>2)<<2);br(g)}g=f[a+4>>2]|0;if(!g)return;d=a+8|0;a=f[d>>2]|0;if((a|0)!=(g|0))f[d>>2]=a+(~((a+-4-g|0)>>>2)<<2);br(g);return}function hi(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0;c=u;u=u+32|0;d=c+16|0;e=c+8|0;g=c;h=a+8|0;if(f[h>>2]<<5>>>0>=b>>>0){u=c;return}f[d>>2]=0;i=d+4|0;f[i>>2]=0;j=d+8|0;f[j>>2]=0;if((b|0)<0)mq(d);k=((b+-1|0)>>>5)+1|0;b=dn(k<<2)|0;f[d>>2]=b;f[i>>2]=0;f[j>>2]=k;k=f[a>>2]|0;f[e>>2]=k;f[e+4>>2]=0;b=a+4|0;l=f[b>>2]|0;f[g>>2]=k+(l>>>5<<2);f[g+4>>2]=l&31;ig(d,e,g);g=f[a>>2]|0;f[a>>2]=f[d>>2];f[d>>2]=g;d=f[b>>2]|0;f[b>>2]=f[i>>2];f[i>>2]=d;d=f[h>>2]|0;f[h>>2]=f[j>>2];f[j>>2]=d;if(g|0)br(g);u=c;return}function ii(a){a=a|0;var b=0,c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0;b=a+136|0;c=f[b>>2]|0;if(c|0){d=a+140|0;e=f[d>>2]|0;if((e|0)==(c|0))g=c;else{h=e;while(1){e=h+-12|0;f[d>>2]=e;i=f[e>>2]|0;if(!i)j=e;else{e=h+-8|0;k=f[e>>2]|0;if((k|0)!=(i|0))f[e>>2]=k+(~((k+-4-i|0)>>>2)<<2);br(i);j=f[d>>2]|0}if((j|0)==(c|0))break;else h=j}g=f[b>>2]|0}br(g)}g=f[a+104>>2]|0;if(g|0){b=a+108|0;j=f[b>>2]|0;if((j|0)!=(g|0))f[b>>2]=j+(~((j+-4-g|0)>>>2)<<2);br(g)}g=f[a+92>>2]|0;if(!g){jj(a);return}j=a+96|0;b=f[j>>2]|0;if((b|0)!=(g|0))f[j>>2]=b+(~((b+-4-g|0)>>>2)<<2);br(g);jj(a);return}function ji(a){a=a|0;var c=0,d=0,e=0,g=0;f[a>>2]=3340;c=a+72|0;d=a+136|0;e=a+4|0;g=e+64|0;do{f[e>>2]=0;e=e+4|0}while((e|0)<(g|0));e=c;g=e+64|0;do{f[e>>2]=0;e=e+4|0}while((e|0)<(g|0));n[d>>2]=$(1.0);d=a+140|0;f[d>>2]=0;f[d+4>>2]=0;f[d+8>>2]=0;f[d+12>>2]=0;f[d+16>>2]=0;f[d+20>>2]=0;f[a+164>>2]=-1;d=a+168|0;f[d>>2]=0;f[d+4>>2]=0;f[d+8>>2]=0;f[d+12>>2]=0;f[d+16>>2]=0;f[d+20>>2]=0;f[d+24>>2]=0;rn(a+200|0);Cn(a+232|0);d=a+316|0;e=a+264|0;g=e+52|0;do{f[e>>2]=0;e=e+4|0}while((e|0)<(g|0));f[d>>2]=-1;f[a+320>>2]=-1;f[a+324>>2]=0;f[a+328>>2]=2;f[a+332>>2]=7;f[a+336>>2]=0;f[a+340>>2]=0;f[a+344>>2]=0;b[a+352>>0]=0;return}function ki(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;c=a+4|0;d=f[a>>2]|0;e=(f[c>>2]|0)-d|0;g=(e|0)/12|0;h=g+1|0;if(h>>>0>357913941)mq(a);i=a+8|0;j=((f[i>>2]|0)-d|0)/12|0;k=j<<1;l=j>>>0<178956970?(k>>>0<h>>>0?h:k):357913941;do if(l)if(l>>>0>357913941){k=ra(8)|0;Wo(k,14941);f[k>>2]=6944;va(k|0,1080,114)}else{m=dn(l*12|0)|0;break}else m=0;while(0);k=m+(g*12|0)|0;f[k>>2]=f[b>>2];f[k+4>>2]=f[b+4>>2];f[k+8>>2]=f[b+8>>2];b=k+(((e|0)/-12|0)*12|0)|0;if((e|0)>0)Rg(b|0,d|0,e|0)|0;f[a>>2]=b;f[c>>2]=k+12;f[i>>2]=m+(l*12|0);if(!d)return;br(d);return}function li(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;g=a+16|0;h=g;i=f[h+4>>2]|0;if((d|0)<0|(d|0)==0&c>>>0<1|((i|0)>0|(i|0)==0&(f[h>>2]|0)>>>0>0)){j=0;return j|0}b[a+24>>0]=e&1;h=Tn(c|0,d|0,7,0)|0;d=zk(h|0,I|0,8,0)|0;h=I;c=g;f[c>>2]=d;f[c+4>>2]=h;c=a+4|0;g=f[c>>2]|0;i=f[a>>2]|0;k=g-i|0;l=Tn(k|0,0,8,0)|0;m=e?l:k;l=Tn(m|0,(e?I:0)|0,d|0,h|0)|0;h=i;i=g;if(k>>>0>=l>>>0)if(k>>>0>l>>>0?(g=h+l|0,(g|0)!=(i|0)):0){f[c>>2]=g;n=h}else n=h;else{ri(a,l-k|0);n=f[a>>2]|0}k=dn(8)|0;f[k>>2]=n+m;f[k+4>>2]=0;m=a+12|0;a=f[m>>2]|0;f[m>>2]=k;if(!a){j=1;return j|0}br(a);j=1;return j|0}function mi(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0;c=u;u=u+16|0;d=c;e=hg(a,d,b)|0;g=f[e>>2]|0;if(g|0){h=g;i=h+28|0;u=c;return i|0}g=dn(40)|0;dj(g+16|0,b);b=g+28|0;f[b>>2]=0;f[b+4>>2]=0;f[b+8>>2]=0;b=f[d>>2]|0;f[g>>2]=0;f[g+4>>2]=0;f[g+8>>2]=b;f[e>>2]=g;b=f[f[a>>2]>>2]|0;if(!b)j=g;else{f[a>>2]=b;j=f[e>>2]|0}Ae(f[a+4>>2]|0,j);j=a+8|0;f[j>>2]=(f[j>>2]|0)+1;h=g;i=h+28|0;u=c;return i|0}function ni(a,c,d,e,g,h,i,j){a=a|0;c=c|0;d=d|0;e=e|0;g=g|0;h=h|0;i=i|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0;k=u;u=u+16|0;l=k;if((-18-c|0)>>>0<d>>>0)mq(a);if((b[a+11>>0]|0)<0)m=f[a>>2]|0;else m=a;if(c>>>0<2147483623){n=d+c|0;d=c<<1;o=n>>>0<d>>>0?d:n;p=o>>>0<11?11:o+16&-16}else p=-17;o=dn(p)|0;if(g|0)Lo(o,m,g)|0;if(i|0)Lo(o+g|0,j,i)|0;j=e-h|0;e=j-g|0;if(e|0)Lo(o+g+i|0,m+g+h|0,e)|0;if((c|0)!=10)br(m);f[a>>2]=o;f[a+8>>2]=p|-2147483648;p=j+i|0;f[a+4>>2]=p;b[l>>0]=0;Hp(o+p|0,l);u=k;return}function oi(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;c=a+8|0;d=f[c>>2]|0;e=a+4|0;g=f[e>>2]|0;if(d-g>>2>>>0>=b>>>0){hj(g|0,0,b<<2|0)|0;f[e>>2]=g+(b<<2);return}h=f[a>>2]|0;i=g-h|0;g=i>>2;j=g+b|0;if(j>>>0>1073741823)mq(a);k=d-h|0;d=k>>1;l=k>>2>>>0<536870911?(d>>>0<j>>>0?j:d):1073741823;do if(l)if(l>>>0>1073741823){d=ra(8)|0;Wo(d,14941);f[d>>2]=6944;va(d|0,1080,114)}else{d=dn(l<<2)|0;m=d;n=d;break}else{m=0;n=0}while(0);d=m+(g<<2)|0;hj(d|0,0,b<<2|0)|0;if((i|0)>0)Rg(n|0,h|0,i|0)|0;f[a>>2]=m;f[e>>2]=d+(b<<2);f[c>>2]=m+(l<<2);if(!h)return;br(h);return}function pi(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;g=dn(32)|0;f[a>>2]=g;f[a+4>>2]=c+8;c=a+8|0;b[c>>0]=0;dj(g+8|0,e);h=g+20|0;i=e+12|0;f[h>>2]=0;f[g+24>>2]=0;f[g+28>>2]=0;g=e+16|0;e=f[g>>2]|0;j=f[i>>2]|0;k=e-j|0;if(!k){l=j;m=e;n=0}else{ri(h,k);l=f[i>>2]|0;m=f[g>>2]|0;n=f[h>>2]|0}Rg(n|0,l|0,m-l|0)|0;b[c>>0]=1;c=f[a>>2]|0;f[c+4>>2]=d;f[c>>2]=0;return}function qi(a,c,d){a=a|0;c=c|0;d=$(d);var e=0,g=0,h=0,i=0,j=0,k=0.0,l=0,m=0,n=0,o=0;e=u;u=u+16|0;g=e;h=c+11|0;i=b[h>>0]|0;if(i<<24>>24<0)j=f[c+4>>2]|0;else j=i&255;k=+d;l=j;j=i;while(1){if(j<<24>>24<0)m=f[c>>2]|0;else m=c;p[g>>3]=k;n=wn(m,l+1|0,17468,g)|0;if((n|0)>-1)if(n>>>0>l>>>0)o=n;else break;else o=l<<1|1;wj(c,o,0);l=o;j=b[h>>0]|0}wj(c,n,0);f[a>>2]=f[c>>2];f[a+4>>2]=f[c+4>>2];f[a+8>>2]=f[c+8>>2];a=0;while(1){if((a|0)==3)break;f[c+(a<<2)>>2]=0;a=a+1|0}u=e;return}function ri(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0;d=a+8|0;e=f[d>>2]|0;g=a+4|0;h=f[g>>2]|0;if((e-h|0)>>>0>=c>>>0){i=c;j=h;do{b[j>>0]=0;j=(f[g>>2]|0)+1|0;f[g>>2]=j;i=i+-1|0}while((i|0)!=0);return}i=f[a>>2]|0;j=h-i|0;h=j+c|0;if((h|0)<0)mq(a);k=e-i|0;i=k<<1;e=k>>>0<1073741823?(i>>>0<h>>>0?h:i):2147483647;if(!e)l=0;else l=dn(e)|0;i=l+j|0;j=l+e|0;e=c;c=i;l=i;do{b[l>>0]=0;l=c+1|0;c=l;e=e+-1|0}while((e|0)!=0);e=f[a>>2]|0;l=(f[g>>2]|0)-e|0;h=i+(0-l)|0;if((l|0)>0)Rg(h|0,e|0,l|0)|0;f[a>>2]=h;f[g>>2]=c;f[d>>2]=j;if(!e)return;br(e);return}function si(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0;c=a+4|0;d=f[c>>2]|0;e=f[a>>2]|0;g=(d-e|0)/136|0;h=d;if(g>>>0<b>>>0){te(a,b-g|0);return}if(g>>>0<=b>>>0)return;g=e+(b*136|0)|0;if((g|0)==(h|0))return;else i=h;do{f[c>>2]=i+-136;h=f[i+-20>>2]|0;if(h|0){b=i+-16|0;e=f[b>>2]|0;if((e|0)!=(h|0))f[b>>2]=e+(~((e+-4-h|0)>>>2)<<2);br(h)}h=f[i+-32>>2]|0;if(h|0){e=i+-28|0;b=f[e>>2]|0;if((b|0)!=(h|0))f[e>>2]=b+(~((b+-4-h|0)>>>2)<<2);br(h)}yi(i+-132|0);i=f[c>>2]|0}while((i|0)!=(g|0));return}function ti(a,b){a=a|0;b=b|0;var c=0,d=Oa,e=0,g=0;if((b|0)!=1)if(!(b+-1&b))c=b;else c=cb(b)|0;else c=2;b=f[a+4>>2]|0;if(c>>>0>b>>>0){Hd(a,c);return}if(c>>>0>=b>>>0)return;d=$((f[a+12>>2]|0)>>>0);e=~~$(W($(d/$(n[a+16>>2]))))>>>0;if(b>>>0>2&(b+-1&b|0)==0)g=1<<32-(_(e+-1|0)|0);else g=cb(e)|0;e=c>>>0<g>>>0?g:c;if(e>>>0>=b>>>0)return;Hd(a,e);return}function ui(a){a=a|0;var b=0,c=0,d=0;b=f[a+76>>2]|0;if(b|0){c=a+80|0;d=f[c>>2]|0;if((d|0)!=(b|0))f[c>>2]=d+(~((d+-4-b|0)>>>2)<<2);br(b)}b=f[a+64>>2]|0;if(b|0){d=a+68|0;if((f[d>>2]|0)!=(b|0))f[d>>2]=b;br(b)}b=f[a+48>>2]|0;if(b|0){d=a+52|0;c=f[d>>2]|0;if((c|0)!=(b|0))f[d>>2]=c+(~((c+-4-b|0)>>>2)<<2);br(b)}b=f[a+24>>2]|0;if(b|0){c=a+28|0;d=f[c>>2]|0;if((d|0)!=(b|0))f[c>>2]=d+(~((d+-4-b|0)>>>2)<<2);br(b)}b=f[a+12>>2]|0;if(b|0){d=a+16|0;c=f[d>>2]|0;if((c|0)!=(b|0))f[d>>2]=c+(~((c+-4-b|0)>>>2)<<2);br(b)}b=f[a>>2]|0;if(!b)return;c=a+4|0;a=f[c>>2]|0;if((a|0)!=(b|0))f[c>>2]=a+(~((a+-4-b|0)>>>2)<<2);br(b);return}function vi(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;e=u;u=u+16|0;g=e;h=c+11|0;i=b[h>>0]|0;if(i<<24>>24<0)j=f[c+4>>2]|0;else j=i&255;k=j;j=i;while(1){if(j<<24>>24<0)l=f[c>>2]|0;else l=c;f[g>>2]=d;m=wn(l,k+1|0,17465,g)|0;if((m|0)>-1)if(m>>>0>k>>>0)n=m;else break;else n=k<<1|1;wj(c,n,0);k=n;j=b[h>>0]|0}wj(c,m,0);f[a>>2]=f[c>>2];f[a+4>>2]=f[c+4>>2];f[a+8>>2]=f[c+8>>2];a=0;while(1){if((a|0)==3)break;f[c+(a<<2)>>2]=0;a=a+1|0}u=e;return}function wi(a){a=a|0;var b=0,c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;b=a+8|0;c=f[b>>2]|0;if((c|0)<0){d=0;return d|0}e=a+4|0;a=f[e>>2]|0;g=a+4|0;h=f[g>>2]|0;i=f[a>>2]|0;j=h-i>>2;k=i;i=h;if(c>>>0<=j>>>0)if(c>>>0<j>>>0?(h=k+(c<<2)|0,(h|0)!=(i|0)):0){f[g>>2]=i+(~((i+-4-h|0)>>>2)<<2);l=c}else l=c;else{oi(a,c-j|0);l=f[b>>2]|0}if((l|0)<=0){d=1;return d|0}b=f[e>>2]|0;e=f[b>>2]|0;j=(f[b+4>>2]|0)-e>>2;c=e;e=0;while(1){if(j>>>0<=e>>>0){m=10;break}f[c+(e<<2)>>2]=e;e=e+1|0;if((e|0)>=(l|0)){d=1;m=12;break}}if((m|0)==10)mq(b);else if((m|0)==12)return d|0;return 0}function xi(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0;d=u;u=u+16|0;e=d;g=dn(32)|0;f[e>>2]=g;f[e+8>>2]=-2147483616;f[e+4>>2]=30;h=g;i=14791;j=h+30|0;do{b[h>>0]=b[i>>0]|0;h=h+1|0;i=i+1|0}while((h|0)<(j|0));b[g+30>>0]=0;g=a+4|0;Mj(g,e,c);if((b[e+11>>0]|0)<0)br(f[e>>2]|0);a=dn(32)|0;f[e>>2]=a;f[e+8>>2]=-2147483616;f[e+4>>2]=29;h=a;i=14510;j=h+29|0;do{b[h>>0]=b[i>>0]|0;h=h+1|0;i=i+1|0}while((h|0)<(j|0));b[a+29>>0]=0;Mj(g,e,c);if((b[e+11>>0]|0)>=0){u=d;return}br(f[e>>2]|0);u=d;return}function yi(a){a=a|0;var b=0,c=0,d=0;b=f[a+84>>2]|0;if(b|0){c=a+88|0;d=f[c>>2]|0;if((d|0)!=(b|0))f[c>>2]=d+(~((d+-4-b|0)>>>2)<<2);br(b)}b=f[a+72>>2]|0;if(b|0){d=a+76|0;if((f[d>>2]|0)!=(b|0))f[d>>2]=b;br(b)}b=f[a+52>>2]|0;if(b|0){d=a+56|0;c=f[d>>2]|0;if((c|0)!=(b|0))f[d>>2]=c+(~((c+-4-b|0)>>>2)<<2);br(b)}b=f[a+40>>2]|0;if(b|0){c=a+44|0;d=f[c>>2]|0;if((d|0)!=(b|0))f[c>>2]=d+(~((d+-4-b|0)>>>2)<<2);br(b)}b=f[a+28>>2]|0;if(b|0){d=a+32|0;c=f[d>>2]|0;if((c|0)!=(b|0))f[d>>2]=c+(~((c+-4-b|0)>>>2)<<2);br(b)}b=f[a+12>>2]|0;if(b|0)br(b);b=f[a>>2]|0;if(!b)return;br(b);return}function zi(a){a=a|0;var b=0,c=0,d=0,e=0;f[a>>2]=1336;b=a+32|0;c=f[b>>2]|0;f[b>>2]=0;if(c|0){b=c+88|0;d=f[b>>2]|0;f[b>>2]=0;if(d|0){b=f[d+8>>2]|0;if(b|0){e=d+12|0;if((f[e>>2]|0)!=(b|0))f[e>>2]=b;br(b)}br(d)}d=f[c+68>>2]|0;if(d|0){b=c+72|0;e=f[b>>2]|0;if((e|0)!=(d|0))f[b>>2]=e+(~((e+-4-d|0)>>>2)<<2);br(d)}d=c+64|0;e=f[d>>2]|0;f[d>>2]=0;if(e|0){d=f[e>>2]|0;if(d|0){b=e+4|0;if((f[b>>2]|0)!=(d|0))f[b>>2]=d;br(d)}br(e)}br(c)}c=f[a+16>>2]|0;if(!c)return;e=a+20|0;a=f[e>>2]|0;if((a|0)!=(c|0))f[e>>2]=a+(~((a+-4-c|0)>>>2)<<2);br(c);return}function Ai(){var a=0,b=0,c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0;a=u;u=u+48|0;b=a+32|0;c=a+24|0;d=a+16|0;e=a;g=a+36|0;a=mn()|0;if(a|0?(h=f[a>>2]|0,h|0):0){a=h+48|0;i=f[a>>2]|0;j=f[a+4>>2]|0;if(!((i&-256|0)==1126902528&(j|0)==1129074247)){f[c>>2]=17607;Dn(17557,c)}if((i|0)==1126902529&(j|0)==1129074247)k=f[h+44>>2]|0;else k=h+80|0;f[g>>2]=k;k=f[h>>2]|0;h=f[k+4>>2]|0;if(Sa[f[(f[250]|0)+16>>2]&31](1e3,k,g)|0){k=f[g>>2]|0;g=Qa[f[(f[k>>2]|0)+8>>2]&127](k)|0;f[e>>2]=17607;f[e+4>>2]=h;f[e+8>>2]=g;Dn(17471,e)}else{f[d>>2]=17607;f[d+4>>2]=h;Dn(17516,d)}}Dn(17595,b)}function Bi(a,c,d){a=a|0;c=c|0;d=d|0;var e=0;do if(a){if(c>>>0<128){b[a>>0]=c;e=1;break}d=(Yq()|0)+188|0;if(!(f[f[d>>2]>>2]|0))if((c&-128|0)==57216){b[a>>0]=c;e=1;break}else{d=ir()|0;f[d>>2]=84;e=-1;break}if(c>>>0<2048){b[a>>0]=c>>>6|192;b[a+1>>0]=c&63|128;e=2;break}if(c>>>0<55296|(c&-8192|0)==57344){b[a>>0]=c>>>12|224;b[a+1>>0]=c>>>6&63|128;b[a+2>>0]=c&63|128;e=3;break}if((c+-65536|0)>>>0<1048576){b[a>>0]=c>>>18|240;b[a+1>>0]=c>>>12&63|128;b[a+2>>0]=c>>>6&63|128;b[a+3>>0]=c&63|128;e=4;break}else{d=ir()|0;f[d>>2]=84;e=-1;break}}else e=1;while(0);return e|0}function Ci(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;c=a+4|0;d=f[a>>2]|0;e=(f[c>>2]|0)-d|0;g=e>>2;h=g+1|0;if(h>>>0>1073741823)mq(a);i=a+8|0;j=(f[i>>2]|0)-d|0;k=j>>1;l=j>>2>>>0<536870911?(k>>>0<h>>>0?h:k):1073741823;do if(l)if(l>>>0>1073741823){k=ra(8)|0;Wo(k,14941);f[k>>2]=6944;va(k|0,1080,114)}else{k=dn(l<<2)|0;m=k;n=k;break}else{m=0;n=0}while(0);k=m+(g<<2)|0;f[k>>2]=f[b>>2];if((e|0)>0)Rg(n|0,d|0,e|0)|0;f[a>>2]=m;f[c>>2]=k+4;f[i>>2]=m+(l<<2);if(!d)return;br(d);return}function Di(a){a=a|0;var c=0,d=0,e=0,g=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;c=a+104|0;d=f[c>>2]|0;if((d|0)!=0?(f[a+108>>2]|0)>=(d|0):0)e=4;else{d=Qm(a)|0;if((d|0)>=0){g=f[c>>2]|0;c=a+8|0;if(g){i=f[c>>2]|0;j=f[a+4>>2]|0;k=g-(f[a+108>>2]|0)|0;g=i;if((i-j|0)<(k|0)){l=g;m=g}else{l=j+(k+-1)|0;m=g}}else{g=f[c>>2]|0;l=g;m=g}f[a+100>>2]=l;l=a+4|0;if(!m)n=f[l>>2]|0;else{g=f[l>>2]|0;l=a+108|0;f[l>>2]=m+1-g+(f[l>>2]|0);n=g}g=n+-1|0;if((d|0)==(h[g>>0]|0|0))o=d;else{b[g>>0]=d;o=d}}else e=4}if((e|0)==4){f[a+100>>2]=0;o=-1}return o|0}function Ei(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;f[a>>2]=1528;f[a+4>>2]=b;b=a+8|0;f[b>>2]=f[c>>2];f[b+4>>2]=f[c+4>>2];f[b+8>>2]=f[c+8>>2];f[b+12>>2]=f[c+12>>2];f[b+16>>2]=f[c+16>>2];f[b+20>>2]=f[c+20>>2];_j(a+32|0,c+24|0);f[a>>2]=2144;c=a+44|0;f[c>>2]=f[d>>2];f[c+4>>2]=f[d+4>>2];f[c+8>>2]=f[d+8>>2];f[c+12>>2]=f[d+12>>2];f[a>>2]=2200;d=a+112|0;c=a+60|0;b=c+52|0;do{f[c>>2]=0;c=c+4|0}while((c|0)<(b|0));Sm(d);f[a+152>>2]=0;f[a+156>>2]=0;f[a+160>>2]=0;return}function Fi(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0;e=u;u=u+16|0;g=e;h=dn(16)|0;f[g>>2]=h;f[g+8>>2]=-2147483632;f[g+4>>2]=14;i=h;j=12975;k=i+14|0;do{b[i>>0]=b[j>>0]|0;i=i+1|0;j=j+1|0}while((i|0)<(k|0));b[h+14>>0]=0;Nj(a,g,c);if((b[g+11>>0]|0)<0)br(f[g>>2]|0);c=dn(16)|0;f[g>>2]=c;f[g+8>>2]=-2147483632;f[g+4>>2]=14;i=c;j=12990;k=i+14|0;do{b[i>>0]=b[j>>0]|0;i=i+1|0;j=j+1|0}while((i|0)<(k|0));b[c+14>>0]=0;Nj(a,g,d);if((b[g+11>>0]|0)>=0){u=e;return}br(f[g>>2]|0);u=e;return}function Gi(a){a=a|0;var b=0,c=0,d=0;f[a>>2]=3320;b=f[a+88>>2]|0;if(b|0){c=a+92|0;d=f[c>>2]|0;if((d|0)!=(b|0))f[c>>2]=d+(~((d+-4-b|0)>>>2)<<2);br(b)}b=f[a+72>>2]|0;if(b|0){d=a+76|0;c=f[d>>2]|0;if((c|0)!=(b|0))f[d>>2]=c+(~((c+-4-b|0)>>>2)<<2);br(b)}b=f[a+60>>2]|0;if(b|0){c=a+64|0;d=f[c>>2]|0;if((d|0)!=(b|0))f[c>>2]=d+(~((d+-4-b|0)>>>2)<<2);br(b)}b=f[a+48>>2]|0;if(b|0){d=a+52|0;c=f[d>>2]|0;if((c|0)!=(b|0))f[d>>2]=c+(~((c+-4-b|0)>>>2)<<2);br(b)}f[a>>2]=3276;b=f[a+36>>2]|0;if(b|0)br(b);b=f[a+24>>2]|0;if(!b)return;br(b);return}function Hi(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;f[a>>2]=1528;f[a+4>>2]=b;b=a+8|0;f[b>>2]=f[c>>2];f[b+4>>2]=f[c+4>>2];f[b+8>>2]=f[c+8>>2];f[b+12>>2]=f[c+12>>2];f[b+16>>2]=f[c+16>>2];f[b+20>>2]=f[c+20>>2];_j(a+32|0,c+24|0);f[a>>2]=1836;c=a+44|0;f[c>>2]=f[d>>2];f[c+4>>2]=f[d+4>>2];f[c+8>>2]=f[d+8>>2];f[c+12>>2]=f[d+12>>2];f[a>>2]=1892;d=a+112|0;c=a+60|0;b=c+52|0;do{f[c>>2]=0;c=c+4|0}while((c|0)<(b|0));Sm(d);f[a+152>>2]=0;f[a+156>>2]=0;f[a+160>>2]=0;return}function Ii(a){a=a|0;var b=0,c=0,d=0;f[a>>2]=2200;b=f[a+152>>2]|0;if(b|0){c=a+156|0;d=f[c>>2]|0;if((d|0)!=(b|0))f[c>>2]=d+(~((d+-4-b|0)>>>2)<<2);br(b)}b=f[a+112>>2]|0;if(b|0){d=a+116|0;c=f[d>>2]|0;if((c|0)!=(b|0))f[d>>2]=c+(~((c+-4-b|0)>>>2)<<2);br(b)}b=f[a+96>>2]|0;if(b|0)br(b);b=f[a+84>>2]|0;if(b|0)br(b);b=f[a+72>>2]|0;if(b|0)br(b);b=f[a+60>>2]|0;if(b|0)br(b);f[a>>2]=1528;b=f[a+32>>2]|0;if(!b)return;c=a+36|0;a=f[c>>2]|0;if((a|0)!=(b|0))f[c>>2]=a+(~((a+-4-b|0)>>>2)<<2);br(b);return}function Ji(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0;d=u;u=u+16|0;e=d;g=f[(f[c+4>>2]|0)+4>>2]|0;if(!g){f[a>>2]=0;f[a+4>>2]=0;f[a+8>>2]=0;f[a+12>>2]=0;u=d;return}if(!(rj(d+12|0,f[c+44>>2]|0,g)|0)){g=dn(32)|0;f[e>>2]=g;f[e+8>>2]=-2147483616;f[e+4>>2]=26;c=g;h=14822;i=c+26|0;do{b[c>>0]=b[h>>0]|0;c=c+1|0;h=h+1|0}while((c|0)<(i|0));b[g+26>>0]=0;f[a>>2]=-1;dj(a+4|0,e);if((b[e+11>>0]|0)<0)br(f[e>>2]|0)}else{f[a>>2]=0;f[a+4>>2]=0;f[a+8>>2]=0;f[a+12>>2]=0}u=d;return}function Ki(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0;c=b+48|0;if((Yh(f[c>>2]|0)|0)>9){d=0;return d|0}if((Qa[f[(f[b>>2]|0)+8>>2]&127](b)|0)!=1){d=0;return d|0}e=b+4|0;b=(f[(f[(f[e>>2]|0)+8>>2]|0)+(a<<2)>>2]|0)+56|0;a=f[b>>2]|0;do if((a|0)==3)if((Yh(f[c>>2]|0)|0)<4){d=5;return d|0}else{g=f[b>>2]|0;break}else g=a;while(0);a=Yh(f[c>>2]|0)|0;if((g|0)==1){d=(a|0)<4?6:0;return d|0}if((a|0)>7){d=0;return d|0}if((Yh(f[c>>2]|0)|0)>1){d=1;return d|0}else return ((f[(f[e>>2]|0)+80>>2]|0)>>>0<40?1:4)|0;return 0}function Li(a){a=a|0;var b=0,c=0,d=0;f[a>>2]=1892;b=f[a+152>>2]|0;if(b|0){c=a+156|0;d=f[c>>2]|0;if((d|0)!=(b|0))f[c>>2]=d+(~((d+-4-b|0)>>>2)<<2);br(b)}b=f[a+112>>2]|0;if(b|0){d=a+116|0;c=f[d>>2]|0;if((c|0)!=(b|0))f[d>>2]=c+(~((c+-4-b|0)>>>2)<<2);br(b)}b=f[a+96>>2]|0;if(b|0)br(b);b=f[a+84>>2]|0;if(b|0)br(b);b=f[a+72>>2]|0;if(b|0)br(b);b=f[a+60>>2]|0;if(b|0)br(b);f[a>>2]=1528;b=f[a+32>>2]|0;if(!b)return;c=a+36|0;a=f[c>>2]|0;if((a|0)!=(b|0))f[c>>2]=a+(~((a+-4-b|0)>>>2)<<2);br(b);return}function Mi(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;g=u;u=u+128|0;h=g+124|0;i=g;j=i;k=6284;l=j+124|0;do{f[j>>2]=f[k>>2];j=j+4|0;k=k+4|0}while((j|0)<(l|0));if((c+-1|0)>>>0>2147483646)if(!c){m=h;n=1;o=4}else{h=ir()|0;f[h>>2]=75;p=-1}else{m=a;n=c;o=4}if((o|0)==4){o=-2-m|0;c=n>>>0>o>>>0?o:n;f[i+48>>2]=c;n=i+20|0;f[n>>2]=m;f[i+44>>2]=m;o=m+c|0;m=i+16|0;f[m>>2]=o;f[i+28>>2]=o;o=hh(i,d,e)|0;if(!c)p=o;else{c=f[n>>2]|0;b[c+(((c|0)==(f[m>>2]|0))<<31>>31)>>0]=0;p=o}}u=g;return p|0}function Ni(a){a=a|0;var c=0,d=0,e=0,g=0;f[a>>2]=3080;c=a+72|0;d=a+136|0;e=a+4|0;g=e+64|0;do{f[e>>2]=0;e=e+4|0}while((e|0)<(g|0));e=c;g=e+64|0;do{f[e>>2]=0;e=e+4|0}while((e|0)<(g|0));n[d>>2]=$(1.0);d=a+140|0;f[d>>2]=0;f[d+4>>2]=0;f[d+8>>2]=0;f[d+12>>2]=0;f[d+16>>2]=0;f[d+20>>2]=0;f[a+164>>2]=-1;d=a+168|0;f[d>>2]=0;f[d+4>>2]=0;f[d+8>>2]=0;f[d+12>>2]=0;f[d+16>>2]=0;f[d+20>>2]=0;f[d+24>>2]=0;rn(a+200|0);Cn(a+232|0);d=a+264|0;f[d>>2]=0;f[d+4>>2]=0;f[d+8>>2]=0;f[d+12>>2]=0;f[d+16>>2]=0;f[d+20>>2]=0;b[d+24>>0]=0;return}function Oi(a,c,d,e){a=a|0;c=c|0;d=d|0;e=+e;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;a=u;u=u+16|0;g=a;if(!c){h=0;u=a;return h|0}f[g>>2]=0;f[g+4>>2]=0;f[g+8>>2]=0;i=vj(d)|0;if(i>>>0>4294967279)mq(g);if(i>>>0<11){b[g+11>>0]=i;if(!i)j=g;else{k=g;l=7}}else{m=i+16&-16;n=dn(m)|0;f[g>>2]=n;f[g+8>>2]=m|-2147483648;f[g+4>>2]=i;k=n;l=7}if((l|0)==7){Rg(k|0,d|0,i|0)|0;j=k}b[j+i>>0]=0;Ol(c,g,e);if((b[g+11>>0]|0)<0)br(f[g>>2]|0);h=1;u=a;return h|0}function Pi(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;a=u;u=u+16|0;g=a;if(!c){h=0;u=a;return h|0}f[g>>2]=0;f[g+4>>2]=0;f[g+8>>2]=0;i=vj(d)|0;if(i>>>0>4294967279)mq(g);if(i>>>0<11){b[g+11>>0]=i;if(!i)j=g;else{k=g;l=7}}else{m=i+16&-16;n=dn(m)|0;f[g>>2]=n;f[g+8>>2]=m|-2147483648;f[g+4>>2]=i;k=n;l=7}if((l|0)==7){Rg(k|0,d|0,i|0)|0;j=k}b[j+i>>0]=0;Pl(c,g,e);if((b[g+11>>0]|0)<0)br(f[g>>2]|0);h=1;u=a;return h|0}function Qi(a){a=a|0;var c=0,d=0,e=0,g=0,h=0;c=f[a+28>>2]|0;if(c|0){d=c;do{c=d;d=f[d>>2]|0;e=c+8|0;g=c+20|0;h=f[g>>2]|0;f[g>>2]=0;if(h|0){Qi(h);br(h)}if((b[e+11>>0]|0)<0)br(f[e>>2]|0);br(c)}while((d|0)!=0)}d=a+20|0;c=f[d>>2]|0;f[d>>2]=0;if(c|0)br(c);c=f[a+8>>2]|0;if(c|0){d=c;do{c=d;d=f[d>>2]|0;e=c+8|0;h=f[c+20>>2]|0;if(h|0){g=c+24|0;if((f[g>>2]|0)!=(h|0))f[g>>2]=h;br(h)}if((b[e+11>>0]|0)<0)br(f[e>>2]|0);br(c)}while((d|0)!=0)}d=f[a>>2]|0;f[a>>2]=0;if(!d)return;br(d);return}function Ri(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0;d=u;u=u+16|0;e=d;Wa[f[(f[c>>2]|0)+64>>2]&15](a,c);if(f[a>>2]|0){u=d;return}g=a+4|0;if((b[g+11>>0]|0)<0)br(f[g>>2]|0);g=f[c+48>>2]|0;h=dn(32)|0;f[e>>2]=h;f[e+8>>2]=-2147483616;f[e+4>>2]=29;i=h;j=14510;k=i+29|0;do{b[i>>0]=b[j>>0]|0;i=i+1|0;j=j+1|0}while((i|0)<(k|0));b[h+29>>0]=0;h=Oj(g,e,0)|0;if((b[e+11>>0]|0)<0)br(f[e>>2]|0);if(h)Va[f[(f[c>>2]|0)+68>>2]&127](c);f[a>>2]=0;f[a+4>>2]=0;f[a+8>>2]=0;f[a+12>>2]=0;u=d;return}function Si(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0;e=u;u=u+16|0;g=e;h=f[c+48>>2]|0;if(!h){i=dn(32)|0;f[g>>2]=i;f[g+8>>2]=-2147483616;f[g+4>>2]=23;j=i;k=14670;l=j+23|0;do{b[j>>0]=b[k>>0]|0;j=j+1|0;k=k+1|0}while((j|0)<(l|0));b[i+23>>0]=0;f[a>>2]=-1;dj(a+4|0,g);if((b[g+11>>0]|0)<0)br(f[g>>2]|0);u=e;return}g=f[c+52>>2]|0;if(!g){Ic(a,c,h,d);u=e;return}else{jg(a,c,g,d);u=e;return}}function Ti(a){a=a|0;var b=0,c=0,d=0,e=0,g=0,h=0;lk(a);b=a+84|0;c=f[b>>2]|0;if((c|0)<=0)return;d=c<<5;e=_q(c>>>0>134217727|d>>>0>4294967291?-1:d+4|0)|0;f[e>>2]=c;d=e+4|0;e=d+(c<<5)|0;c=d;do{rn(c);c=c+32|0}while((c|0)!=(e|0));e=a+80|0;a=f[e>>2]|0;f[e>>2]=d;if(a|0){d=a+-4|0;c=f[d>>2]|0;if(c|0){g=a+(c<<5)|0;do{g=g+-32|0;tj(g)}while((g|0)!=(a|0))}$q(d)}if((f[b>>2]|0)>0)h=0;else return;do{lk((f[e>>2]|0)+(h<<5)|0);h=h+1|0}while((h|0)<(f[b>>2]|0));return}function Ui(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0;if(!b){d=0;return d|0}if(f[b+4>>2]|0){d=0;return d|0}a=dn(52)|0;Ub(a,c);f[a+40>>2]=0;f[a+44>>2]=0;f[a+48>>2]=0;c=b+4|0;b=f[c>>2]|0;f[c>>2]=a;if(!b){d=1;return d|0}a=b+40|0;c=f[a>>2]|0;if(c|0){e=b+44|0;g=f[e>>2]|0;if((g|0)==(c|0))h=c;else{i=g;do{g=i+-4|0;f[e>>2]=g;j=f[g>>2]|0;f[g>>2]=0;if(j|0){Qi(j);br(j)}i=f[e>>2]|0}while((i|0)!=(c|0));h=f[a>>2]|0}br(h)}Qi(b);br(b);d=1;return d|0}function Vi(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0;c=f[a>>2]|0;if(b){b=c+8|0;d=b;e=Tn(f[d>>2]|0,f[d+4>>2]|0,1,0)|0;d=b;f[d>>2]=e;f[d+4>>2]=I;d=a+28|0;e=f[d>>2]|0;b=a+24|0;f[b>>2]=f[b>>2]|1<<e;g=d;h=e}else{e=c;d=Tn(f[e>>2]|0,f[e+4>>2]|0,1,0)|0;e=c;f[e>>2]=d;f[e+4>>2]=I;e=a+28|0;g=e;h=f[e>>2]|0}e=h+1|0;f[g>>2]=e;if((e|0)!=32)return;e=a+24|0;h=a+16|0;d=f[h>>2]|0;if((d|0)==(f[a+20>>2]|0))Ci(a+12|0,e);else{f[d>>2]=f[e>>2];f[h>>2]=d+4}f[g>>2]=0;f[e>>2]=0;return}function Wi(a,b){a=a|0;b=b|0;var c=0,d=0;c=a+32|0;a=f[b>>2]|0;f[b>>2]=0;b=f[c>>2]|0;f[c>>2]=a;if(!b)return;a=b+88|0;c=f[a>>2]|0;f[a>>2]=0;if(c|0){a=f[c+8>>2]|0;if(a|0){d=c+12|0;if((f[d>>2]|0)!=(a|0))f[d>>2]=a;br(a)}br(c)}c=f[b+68>>2]|0;if(c|0){a=b+72|0;d=f[a>>2]|0;if((d|0)!=(c|0))f[a>>2]=d+(~((d+-4-c|0)>>>2)<<2);br(c)}c=b+64|0;d=f[c>>2]|0;f[c>>2]=0;if(d|0){c=f[d>>2]|0;if(c|0){a=d+4|0;if((f[a>>2]|0)!=(c|0))f[a>>2]=c;br(c)}br(d)}br(b);return}function Xi(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;e=u;u=u+16|0;g=e;if(c|0){h=a+11|0;i=b[h>>0]|0;if(i<<24>>24<0){j=f[a+4>>2]|0;k=(f[a+8>>2]&2147483647)+-1|0}else{j=i&255;k=10}if((k-j|0)>>>0<c>>>0){lj(a,k,c-k+j|0,j,j,0,0);l=b[h>>0]|0}else l=i;if(l<<24>>24<0)m=f[a>>2]|0;else m=a;On(m+j|0,c,d)|0;d=j+c|0;if((b[h>>0]|0)<0)f[a+4>>2]=d;else b[h>>0]=d;b[g>>0]=0;Hp(m+d|0,g)}u=e;return a|0}function Yi(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0;d=u;u=u+48|0;e=d+4|0;g=d;h=f[b+12>>2]|0;i=f[b+4>>2]|0;b=e;j=b+36|0;do{f[b>>2]=0;b=b+4|0}while((b|0)<(j|0));gh(g,c,h,i,e);i=f[e+24>>2]|0;if(!i){k=f[g>>2]|0;f[a>>2]=k;u=d;return}h=e+28|0;e=f[h>>2]|0;if((e|0)!=(i|0))f[h>>2]=e+(~((e+-4-i|0)>>>2)<<2);br(i);k=f[g>>2]|0;f[a>>2]=k;u=d;return}function Zi(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;e=u;u=u+16|0;g=e;h=a+11|0;i=b[h>>0]|0;j=i<<24>>24<0;if(j)k=(f[a+8>>2]&2147483647)+-1|0;else k=10;do if(k>>>0>=d>>>0){if(j)l=f[a>>2]|0;else l=a;Jo(l,c,d)|0;b[g>>0]=0;Hp(l+d|0,g);if((b[h>>0]|0)<0){f[a+4>>2]=d;break}else{b[h>>0]=d;break}}else{if(j)m=f[a+4>>2]|0;else m=i&255;ni(a,k,d-k|0,m,0,m,d,c)}while(0);u=e;return a|0}function _i(a){a=a|0;var b=0,c=0,d=0,e=0,g=0,h=0,i=0;b=f[a>>2]|0;if(!b)return;c=a+4|0;d=f[c>>2]|0;if((d|0)==(b|0))e=b;else{g=d;do{f[c>>2]=g+-136;d=f[g+-20>>2]|0;if(d|0){h=g+-16|0;i=f[h>>2]|0;if((i|0)!=(d|0))f[h>>2]=i+(~((i+-4-d|0)>>>2)<<2);br(d)}d=f[g+-32>>2]|0;if(d|0){i=g+-28|0;h=f[i>>2]|0;if((h|0)!=(d|0))f[i>>2]=h+(~((h+-4-d|0)>>>2)<<2);br(d)}yi(g+-132|0);g=f[c>>2]|0}while((g|0)!=(b|0));e=f[a>>2]|0}br(e);return}function $i(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;e=u;u=u+16|0;g=e;h=a+11|0;i=b[h>>0]|0;j=i<<24>>24<0;if(j){k=f[a+4>>2]|0;l=(f[a+8>>2]&2147483647)+-1|0}else{k=i&255;l=10}if((l-k|0)>>>0>=d>>>0){if(d|0){if(j)m=f[a>>2]|0;else m=a;Lo(m+k|0,c,d)|0;j=k+d|0;if((b[h>>0]|0)<0)f[a+4>>2]=j;else b[h>>0]=j;b[g>>0]=0;Hp(m+j|0,g)}}else ni(a,l,d-l+k|0,k,k,0,d,c);u=e;return a|0}function aj(a){a=a|0;var b=0,c=0,d=0,e=0,g=0,h=0;f[a>>2]=3608;b=f[a+32>>2]|0;if(b|0){c=a+36|0;d=f[c>>2]|0;if((d|0)!=(b|0))f[c>>2]=d+(~((d+-4-b|0)>>>2)<<2);br(b)}b=f[a+20>>2]|0;if(b|0){d=a+24|0;c=f[d>>2]|0;if((c|0)!=(b|0))f[d>>2]=c+(~((c+-4-b|0)>>>2)<<2);br(b)}b=a+8|0;c=f[b>>2]|0;if(!c)return;d=a+12|0;a=f[d>>2]|0;if((a|0)==(c|0))e=c;else{g=a;do{a=g+-4|0;f[d>>2]=a;h=f[a>>2]|0;f[a>>2]=0;if(h|0)Va[f[(f[h>>2]|0)+4>>2]&127](h);g=f[d>>2]|0}while((g|0)!=(c|0));e=f[b>>2]|0}br(e);return}function bj(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0;c=a+4|0;if((Qa[f[(f[b>>2]|0)+20>>2]&127](b)|0)<=0){d=1;return d|0}a=0;while(1){e=f[(f[c>>2]|0)+4>>2]|0;g=Tl(e,Ra[f[(f[b>>2]|0)+24>>2]&127](b,a)|0)|0;if((g|0)==-1){d=0;h=6;break}e=f[(f[b>>2]|0)+28>>2]|0;i=$k(f[c>>2]|0,g)|0;a=a+1|0;if(!(Ra[e&127](b,i)|0)){d=0;h=6;break}if((a|0)>=(Qa[f[(f[b>>2]|0)+20>>2]&127](b)|0)){d=1;h=6;break}}if((h|0)==6)return d|0;return 0}function cj(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0;if(!(lo(a,b,c)|0)){d=0;return d|0}if(!(Qa[f[(f[a>>2]|0)+52>>2]&127](a)|0)){d=0;return d|0}c=a+4|0;e=a+8|0;g=f[c>>2]|0;if((f[e>>2]|0)==(g|0)){d=1;return d|0}h=a+36|0;a=0;i=g;while(1){g=f[(f[h>>2]|0)+(a<<2)>>2]|0;if(!(Sa[f[(f[g>>2]|0)+8>>2]&31](g,b,f[i+(a<<2)>>2]|0)|0)){d=0;j=7;break}a=a+1|0;i=f[c>>2]|0;if(a>>>0>=(f[e>>2]|0)-i>>2>>>0){d=1;j=7;break}}if((j|0)==7)return d|0;return 0}function dj(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0;d=u;u=u+16|0;e=d;f[a>>2]=0;f[a+4>>2]=0;f[a+8>>2]=0;if((b[c+11>>0]|0)<0){g=f[c>>2]|0;h=f[c+4>>2]|0;if(h>>>0>4294967279)mq(a);if(h>>>0<11){b[a+11>>0]=h;i=a}else{j=h+16&-16;k=dn(j)|0;f[a>>2]=k;f[a+8>>2]=j|-2147483648;f[a+4>>2]=h;i=k}Lo(i,g,h)|0;b[e>>0]=0;Hp(i+h|0,e)}else{f[a>>2]=f[c>>2];f[a+4>>2]=f[c+4>>2];f[a+8>>2]=f[c+8>>2]}u=d;return}function ej(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0;c=u;u=u+16|0;d=c+8|0;e=c+4|0;g=c;f[g>>2]=f[(f[b+4>>2]|0)+80>>2];h=f[b+44>>2]|0;b=h+16|0;i=f[b+4>>2]|0;if((i|0)>0|(i|0)==0&(f[b>>2]|0)>>>0>0){f[a>>2]=0;f[a+4>>2]=0;f[a+8>>2]=0;f[a+12>>2]=0;u=c;return}f[e>>2]=f[h+4>>2];f[d>>2]=f[e>>2];ye(h,d,g,g+4|0)|0;f[a>>2]=0;f[a+4>>2]=0;f[a+8>>2]=0;f[a+12>>2]=0;u=c;return}function fj(a,c,d,e,g){a=a|0;c=c|0;d=d|0;e=e|0;g=g|0;var h=0,i=0;b[c+53>>0]=1;do if((f[c+4>>2]|0)==(e|0)){b[c+52>>0]=1;a=c+16|0;h=f[a>>2]|0;if(!h){f[a>>2]=d;f[c+24>>2]=g;f[c+36>>2]=1;if(!((g|0)==1?(f[c+48>>2]|0)==1:0))break;b[c+54>>0]=1;break}if((h|0)!=(d|0)){h=c+36|0;f[h>>2]=(f[h>>2]|0)+1;b[c+54>>0]=1;break}h=c+24|0;a=f[h>>2]|0;if((a|0)==2){f[h>>2]=g;i=g}else i=a;if((i|0)==1?(f[c+48>>2]|0)==1:0)b[c+54>>0]=1}while(0);return}function gj(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0;c=a+36|0;d=a+40|0;e=f[c>>2]|0;if((f[d>>2]|0)!=(e|0)){g=0;h=e;do{eg(h+(g*24|0)|0,b)|0;g=g+1|0;h=f[c>>2]|0}while(g>>>0<(((f[d>>2]|0)-h|0)/24|0)>>>0)}h=a+48|0;d=a+52|0;a=f[h>>2]|0;if((f[d>>2]|0)==(a|0))return 1;else{i=0;j=a}do{a=f[j+(i<<2)>>2]|0;Nh(a<<1^a>>31,b)|0;i=i+1|0;j=f[h>>2]|0}while(i>>>0<(f[d>>2]|0)-j>>2>>>0);return 1}function hj(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0;e=a+d|0;c=c&255;if((d|0)>=67){while(a&3){b[a>>0]=c;a=a+1|0}g=e&-4|0;h=g-64|0;i=c|c<<8|c<<16|c<<24;while((a|0)<=(h|0)){f[a>>2]=i;f[a+4>>2]=i;f[a+8>>2]=i;f[a+12>>2]=i;f[a+16>>2]=i;f[a+20>>2]=i;f[a+24>>2]=i;f[a+28>>2]=i;f[a+32>>2]=i;f[a+36>>2]=i;f[a+40>>2]=i;f[a+44>>2]=i;f[a+48>>2]=i;f[a+52>>2]=i;f[a+56>>2]=i;f[a+60>>2]=i;a=a+64|0}while((a|0)<(g|0)){f[a>>2]=i;a=a+4|0}}while((a|0)<(e|0)){b[a>>0]=c;a=a+1|0}return e-d|0}function ij(a,c,d,e,g){a=a|0;c=c|0;d=d|0;e=e|0;g=g|0;var h=0;do if(!(qp(a,f[c+8>>2]|0,g)|0)){if(qp(a,f[c>>2]|0,g)|0){if((f[c+16>>2]|0)!=(d|0)?(h=c+20|0,(f[h>>2]|0)!=(d|0)):0){f[c+32>>2]=e;f[h>>2]=d;h=c+40|0;f[h>>2]=(f[h>>2]|0)+1;if((f[c+36>>2]|0)==1?(f[c+24>>2]|0)==2:0)b[c+54>>0]=1;f[c+44>>2]=4;break}if((e|0)==1)f[c+32>>2]=1}}else Om(0,c,d,e);while(0);return}function jj(a){a=a|0;var b=0,c=0,d=0,e=0;b=a+80|0;c=f[b>>2]|0;f[b>>2]=0;if(c|0){b=c+-4|0;d=f[b>>2]|0;if(d|0){e=c+(d<<5)|0;do{e=e+-32|0;tj(e)}while((e|0)!=(c|0))}$q(b)}b=f[a+68>>2]|0;if(b|0){c=a+72|0;e=f[c>>2]|0;if((e|0)!=(b|0))f[c>>2]=e+(~((e+-4-b|0)>>>2)<<2);br(b)}b=a+44|0;e=f[b>>2]|0;f[b>>2]=0;if(e|0)br(e);e=f[a+32>>2]|0;if(!e){tj(a);return}b=a+36|0;if((f[b>>2]|0)!=(e|0))f[b>>2]=e;br(e);tj(a);return}function kj(a){a=a|0;var b=0,c=0,d=0;f[a>>2]=2684;b=f[a+136>>2]|0;if(b|0){c=a+140|0;d=f[c>>2]|0;if((d|0)!=(b|0))f[c>>2]=d+(~((d+-4-b|0)>>>2)<<2);br(b)}b=f[a+96>>2]|0;if(b|0){d=a+100|0;c=f[d>>2]|0;if((c|0)!=(b|0))f[d>>2]=c+(~((c+-4-b|0)>>>2)<<2);br(b)}b=f[a+76>>2]|0;if(b|0)br(b);b=f[a+64>>2]|0;if(b|0)br(b);b=f[a+52>>2]|0;if(b|0)br(b);b=f[a+40>>2]|0;if(!b)return;br(b);return}function lj(a,c,d,e,g,h,i){a=a|0;c=c|0;d=d|0;e=e|0;g=g|0;h=h|0;i=i|0;var j=0,k=0,l=0,m=0;if((-17-c|0)>>>0<d>>>0)mq(a);if((b[a+11>>0]|0)<0)j=f[a>>2]|0;else j=a;if(c>>>0<2147483623){k=d+c|0;d=c<<1;l=k>>>0<d>>>0?d:k;m=l>>>0<11?11:l+16&-16}else m=-17;l=dn(m)|0;if(g|0)Lo(l,j,g)|0;k=e-h-g|0;if(k|0)Lo(l+g+i|0,j+g+h|0,k)|0;if((c|0)!=10)br(j);f[a>>2]=l;f[a+8>>2]=m|-2147483648;return}function mj(a){a=a|0;var b=0,c=0,d=0;f[a>>2]=2432;b=f[a+136>>2]|0;if(b|0){c=a+140|0;d=f[c>>2]|0;if((d|0)!=(b|0))f[c>>2]=d+(~((d+-4-b|0)>>>2)<<2);br(b)}b=f[a+96>>2]|0;if(b|0){d=a+100|0;c=f[d>>2]|0;if((c|0)!=(b|0))f[d>>2]=c+(~((c+-4-b|0)>>>2)<<2);br(b)}b=f[a+76>>2]|0;if(b|0)br(b);b=f[a+64>>2]|0;if(b|0)br(b);b=f[a+52>>2]|0;if(b|0)br(b);b=f[a+40>>2]|0;if(!b)return;br(b);return}function nj(a,b){a=a|0;b=b|0;if(!b)return;else{nj(a,f[b>>2]|0);nj(a,f[b+4>>2]|0);sj(b+20|0,f[b+24>>2]|0);br(b);return}}function oj(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;If(a,b,c);c=f[a+100>>2]|0;d=f[a+96>>2]|0;a=d;if((c|0)==(d|0))return;e=f[b>>2]|0;b=(c-d|0)/12|0;d=0;do{c=a+(d*12|0)|0;f[c>>2]=f[e+(f[c>>2]<<2)>>2];c=a+(d*12|0)+4|0;f[c>>2]=f[e+(f[c>>2]<<2)>>2];c=a+(d*12|0)+8|0;f[c>>2]=f[e+(f[c>>2]<<2)>>2];d=d+1|0}while(d>>>0<b>>>0);return}function pj(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0;d=a+64|0;if((f[d>>2]|0)==0?(e=dn(32)|0,tn(e),g=f[d>>2]|0,f[d>>2]=e,g|0):0){e=f[g>>2]|0;if(e|0){h=g+4|0;if((f[h>>2]|0)!=(e|0))f[h>>2]=e;br(e)}br(g)}g=Ll(f[a+28>>2]|0)|0;e=X(g,b[a+24>>0]|0)|0;g=((e|0)<0)<<31>>31;h=f[d>>2]|0;i=on(e|0,g|0,c|0,0)|0;if(!(Th(h,0,i,I)|0)){j=0;return j|0}Ak(a,f[d>>2]|0,e,g,0,0);f[a+80>>2]=c;j=1;return j|0}function qj(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0;d=u;u=u+64|0;e=d;if(!(qp(a,b,0)|0))if((b|0)!=0?(g=mh(b,1024,1008,0)|0,(g|0)!=0):0){b=e+4|0;h=b+52|0;do{f[b>>2]=0;b=b+4|0}while((b|0)<(h|0));f[e>>2]=g;f[e+8>>2]=a;f[e+12>>2]=-1;f[e+48>>2]=1;Ya[f[(f[g>>2]|0)+28>>2]&7](g,e,f[c>>2]|0,1);if((f[e+24>>2]|0)==1){f[c>>2]=f[e+16>>2];i=1}else i=0;j=i}else j=0;else j=1;u=d;return j|0}function rj(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0;if(!c){d=0;return d|0}e=c+40|0;g=c+44|0;Nh((f[g>>2]|0)-(f[e>>2]|0)>>2,b)|0;h=f[e>>2]|0;e=f[g>>2]|0;if((h|0)!=(e|0)){g=h;do{h=f[g>>2]|0;if(h|0){Nh(f[h+40>>2]|0,b)|0;Wf(a,b,h)|0}g=g+4|0}while((g|0)!=(e|0))}Wf(a,b,c)|0;d=1;return d|0}function sj(a,c){a=a|0;c=c|0;var d=0;if(!c)return;sj(a,f[c>>2]|0);sj(a,f[c+4>>2]|0);a=c+16|0;d=c+28|0;if((b[d+11>>0]|0)<0)br(f[d>>2]|0);if((b[a+11>>0]|0)<0)br(f[a>>2]|0);br(c);return}function tj(a){a=a|0;var b=0,c=0,d=0,e=0,g=0,h=0;b=u;u=u+16|0;c=b;d=c;f[d>>2]=0;f[d+4>>2]=0;cf(a,2,c);c=f[a+12>>2]|0;d=a+16|0;e=f[d>>2]|0;if((e|0)==(c|0))g=c;else{h=e+(~((e+-4-c|0)>>>2)<<2)|0;f[d>>2]=h;g=h}f[a+24>>2]=0;f[a+28>>2]=0;if(c|0){if((g|0)!=(c|0))f[d>>2]=g+(~((g+-4-c|0)>>>2)<<2);br(c)}c=f[a>>2]|0;if(!c){u=b;return}g=a+4|0;a=f[g>>2]|0;if((a|0)!=(c|0))f[g>>2]=a+(~((a+-8-c|0)>>>3)<<3);br(c);u=b;return}\nfunction $a(a){a=a|0;var b=0,c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0;b=u;u=u+16|0;c=b;do if(a>>>0<245){d=a>>>0<11?16:a+11&-8;e=d>>>3;g=f[4512]|0;h=g>>>e;if(h&3|0){i=(h&1^1)+e|0;j=18088+(i<<1<<2)|0;k=j+8|0;l=f[k>>2]|0;m=l+8|0;n=f[m>>2]|0;if((n|0)==(j|0))f[4512]=g&~(1<<i);else{f[n+12>>2]=j;f[k>>2]=n}n=i<<3;f[l+4>>2]=n|3;i=l+n+4|0;f[i>>2]=f[i>>2]|1;o=m;u=b;return o|0}m=f[4514]|0;if(d>>>0>m>>>0){if(h|0){i=2<<e;n=h<<e&(i|0-i);i=(n&0-n)+-1|0;n=i>>>12&16;e=i>>>n;i=e>>>5&8;h=e>>>i;e=h>>>2&4;l=h>>>e;h=l>>>1&2;k=l>>>h;l=k>>>1&1;j=(i|n|e|h|l)+(k>>>l)|0;l=18088+(j<<1<<2)|0;k=l+8|0;h=f[k>>2]|0;e=h+8|0;n=f[e>>2]|0;if((n|0)==(l|0)){i=g&~(1<<j);f[4512]=i;p=i}else{f[n+12>>2]=l;f[k>>2]=n;p=g}n=j<<3;j=n-d|0;f[h+4>>2]=d|3;k=h+d|0;f[k+4>>2]=j|1;f[h+n>>2]=j;if(m|0){n=f[4517]|0;h=m>>>3;l=18088+(h<<1<<2)|0;i=1<<h;if(!(p&i)){f[4512]=p|i;q=l;r=l+8|0}else{i=l+8|0;q=f[i>>2]|0;r=i}f[r>>2]=n;f[q+12>>2]=n;f[n+8>>2]=q;f[n+12>>2]=l}f[4514]=j;f[4517]=k;o=e;u=b;return o|0}e=f[4513]|0;if(e){k=(e&0-e)+-1|0;j=k>>>12&16;l=k>>>j;k=l>>>5&8;n=l>>>k;l=n>>>2&4;i=n>>>l;n=i>>>1&2;h=i>>>n;i=h>>>1&1;s=f[18352+((k|j|l|n|i)+(h>>>i)<<2)>>2]|0;i=(f[s+4>>2]&-8)-d|0;h=f[s+16+(((f[s+16>>2]|0)==0&1)<<2)>>2]|0;if(!h){t=s;v=i}else{n=s;s=i;i=h;while(1){h=(f[i+4>>2]&-8)-d|0;l=h>>>0<s>>>0;j=l?h:s;h=l?i:n;i=f[i+16+(((f[i+16>>2]|0)==0&1)<<2)>>2]|0;if(!i){t=h;v=j;break}else{n=h;s=j}}}s=t+d|0;if(s>>>0>t>>>0){n=f[t+24>>2]|0;i=f[t+12>>2]|0;do if((i|0)==(t|0)){j=t+20|0;h=f[j>>2]|0;if(!h){l=t+16|0;k=f[l>>2]|0;if(!k){w=0;break}else{x=k;y=l}}else{x=h;y=j}while(1){j=x+20|0;h=f[j>>2]|0;if(h|0){x=h;y=j;continue}j=x+16|0;h=f[j>>2]|0;if(!h)break;else{x=h;y=j}}f[y>>2]=0;w=x}else{j=f[t+8>>2]|0;f[j+12>>2]=i;f[i+8>>2]=j;w=i}while(0);do if(n|0){i=f[t+28>>2]|0;j=18352+(i<<2)|0;if((t|0)==(f[j>>2]|0)){f[j>>2]=w;if(!w){f[4513]=e&~(1<<i);break}}else{f[n+16+(((f[n+16>>2]|0)!=(t|0)&1)<<2)>>2]=w;if(!w)break}f[w+24>>2]=n;i=f[t+16>>2]|0;if(i|0){f[w+16>>2]=i;f[i+24>>2]=w}i=f[t+20>>2]|0;if(i|0){f[w+20>>2]=i;f[i+24>>2]=w}}while(0);if(v>>>0<16){n=v+d|0;f[t+4>>2]=n|3;e=t+n+4|0;f[e>>2]=f[e>>2]|1}else{f[t+4>>2]=d|3;f[s+4>>2]=v|1;f[s+v>>2]=v;if(m|0){e=f[4517]|0;n=m>>>3;i=18088+(n<<1<<2)|0;j=1<<n;if(!(g&j)){f[4512]=g|j;z=i;A=i+8|0}else{j=i+8|0;z=f[j>>2]|0;A=j}f[A>>2]=e;f[z+12>>2]=e;f[e+8>>2]=z;f[e+12>>2]=i}f[4514]=v;f[4517]=s}o=t+8|0;u=b;return o|0}else B=d}else B=d}else B=d}else if(a>>>0<=4294967231){i=a+11|0;e=i&-8;j=f[4513]|0;if(j){n=0-e|0;h=i>>>8;if(h)if(e>>>0>16777215)C=31;else{i=(h+1048320|0)>>>16&8;l=h<<i;h=(l+520192|0)>>>16&4;k=l<<h;l=(k+245760|0)>>>16&2;D=14-(h|i|l)+(k<<l>>>15)|0;C=e>>>(D+7|0)&1|D<<1}else C=0;D=f[18352+(C<<2)>>2]|0;a:do if(!D){E=0;F=0;G=n;H=57}else{l=0;k=n;i=D;h=e<<((C|0)==31?0:25-(C>>>1)|0);I=0;while(1){J=(f[i+4>>2]&-8)-e|0;if(J>>>0<k>>>0)if(!J){K=0;L=i;M=i;H=61;break a}else{N=i;O=J}else{N=l;O=k}J=f[i+20>>2]|0;i=f[i+16+(h>>>31<<2)>>2]|0;P=(J|0)==0|(J|0)==(i|0)?I:J;J=(i|0)==0;if(J){E=P;F=N;G=O;H=57;break}else{l=N;k=O;h=h<<((J^1)&1);I=P}}}while(0);if((H|0)==57){if((E|0)==0&(F|0)==0){D=2<<C;n=j&(D|0-D);if(!n){B=e;break}D=(n&0-n)+-1|0;n=D>>>12&16;d=D>>>n;D=d>>>5&8;s=d>>>D;d=s>>>2&4;g=s>>>d;s=g>>>1&2;m=g>>>s;g=m>>>1&1;Q=0;R=f[18352+((D|n|d|s|g)+(m>>>g)<<2)>>2]|0}else{Q=F;R=E}if(!R){S=Q;T=G}else{K=G;L=R;M=Q;H=61}}if((H|0)==61)while(1){H=0;g=(f[L+4>>2]&-8)-e|0;m=g>>>0<K>>>0;s=m?g:K;g=m?L:M;L=f[L+16+(((f[L+16>>2]|0)==0&1)<<2)>>2]|0;if(!L){S=g;T=s;break}else{K=s;M=g;H=61}}if((S|0)!=0?T>>>0<((f[4514]|0)-e|0)>>>0:0){g=S+e|0;if(g>>>0<=S>>>0){o=0;u=b;return o|0}s=f[S+24>>2]|0;m=f[S+12>>2]|0;do if((m|0)==(S|0)){d=S+20|0;n=f[d>>2]|0;if(!n){D=S+16|0;I=f[D>>2]|0;if(!I){U=0;break}else{V=I;W=D}}else{V=n;W=d}while(1){d=V+20|0;n=f[d>>2]|0;if(n|0){V=n;W=d;continue}d=V+16|0;n=f[d>>2]|0;if(!n)break;else{V=n;W=d}}f[W>>2]=0;U=V}else{d=f[S+8>>2]|0;f[d+12>>2]=m;f[m+8>>2]=d;U=m}while(0);do if(s){m=f[S+28>>2]|0;d=18352+(m<<2)|0;if((S|0)==(f[d>>2]|0)){f[d>>2]=U;if(!U){d=j&~(1<<m);f[4513]=d;X=d;break}}else{f[s+16+(((f[s+16>>2]|0)!=(S|0)&1)<<2)>>2]=U;if(!U){X=j;break}}f[U+24>>2]=s;d=f[S+16>>2]|0;if(d|0){f[U+16>>2]=d;f[d+24>>2]=U}d=f[S+20>>2]|0;if(d){f[U+20>>2]=d;f[d+24>>2]=U;X=j}else X=j}else X=j;while(0);do if(T>>>0>=16){f[S+4>>2]=e|3;f[g+4>>2]=T|1;f[g+T>>2]=T;j=T>>>3;if(T>>>0<256){s=18088+(j<<1<<2)|0;d=f[4512]|0;m=1<<j;if(!(d&m)){f[4512]=d|m;Y=s;Z=s+8|0}else{m=s+8|0;Y=f[m>>2]|0;Z=m}f[Z>>2]=g;f[Y+12>>2]=g;f[g+8>>2]=Y;f[g+12>>2]=s;break}s=T>>>8;if(s)if(T>>>0>16777215)_=31;else{m=(s+1048320|0)>>>16&8;d=s<<m;s=(d+520192|0)>>>16&4;j=d<<s;d=(j+245760|0)>>>16&2;n=14-(s|m|d)+(j<<d>>>15)|0;_=T>>>(n+7|0)&1|n<<1}else _=0;n=18352+(_<<2)|0;f[g+28>>2]=_;d=g+16|0;f[d+4>>2]=0;f[d>>2]=0;d=1<<_;if(!(X&d)){f[4513]=X|d;f[n>>2]=g;f[g+24>>2]=n;f[g+12>>2]=g;f[g+8>>2]=g;break}d=T<<((_|0)==31?0:25-(_>>>1)|0);j=f[n>>2]|0;while(1){if((f[j+4>>2]&-8|0)==(T|0)){H=97;break}$=j+16+(d>>>31<<2)|0;n=f[$>>2]|0;if(!n){H=96;break}else{d=d<<1;j=n}}if((H|0)==96){f[$>>2]=g;f[g+24>>2]=j;f[g+12>>2]=g;f[g+8>>2]=g;break}else if((H|0)==97){d=j+8|0;n=f[d>>2]|0;f[n+12>>2]=g;f[d>>2]=g;f[g+8>>2]=n;f[g+12>>2]=j;f[g+24>>2]=0;break}}else{n=T+e|0;f[S+4>>2]=n|3;d=S+n+4|0;f[d>>2]=f[d>>2]|1}while(0);o=S+8|0;u=b;return o|0}else B=e}else B=e}else B=-1;while(0);S=f[4514]|0;if(S>>>0>=B>>>0){T=S-B|0;$=f[4517]|0;if(T>>>0>15){_=$+B|0;f[4517]=_;f[4514]=T;f[_+4>>2]=T|1;f[$+S>>2]=T;f[$+4>>2]=B|3}else{f[4514]=0;f[4517]=0;f[$+4>>2]=S|3;T=$+S+4|0;f[T>>2]=f[T>>2]|1}o=$+8|0;u=b;return o|0}$=f[4515]|0;if($>>>0>B>>>0){T=$-B|0;f[4515]=T;S=f[4518]|0;_=S+B|0;f[4518]=_;f[_+4>>2]=T|1;f[S+4>>2]=B|3;o=S+8|0;u=b;return o|0}if(!(f[4630]|0)){f[4632]=4096;f[4631]=4096;f[4633]=-1;f[4634]=-1;f[4635]=0;f[4623]=0;f[4630]=c&-16^1431655768;aa=4096}else aa=f[4632]|0;c=B+48|0;S=B+47|0;T=aa+S|0;_=0-aa|0;aa=T&_;if(aa>>>0<=B>>>0){o=0;u=b;return o|0}X=f[4622]|0;if(X|0?(Y=f[4620]|0,Z=Y+aa|0,Z>>>0<=Y>>>0|Z>>>0>X>>>0):0){o=0;u=b;return o|0}b:do if(!(f[4623]&4)){X=f[4518]|0;c:do if(X){Z=18496;while(1){Y=f[Z>>2]|0;if(Y>>>0<=X>>>0?(ba=Z+4|0,(Y+(f[ba>>2]|0)|0)>>>0>X>>>0):0)break;Y=f[Z+8>>2]|0;if(!Y){H=118;break c}else Z=Y}j=T-$&_;if(j>>>0<2147483647){Y=Fl(j|0)|0;if((Y|0)==((f[Z>>2]|0)+(f[ba>>2]|0)|0))if((Y|0)==(-1|0))ca=j;else{da=j;ea=Y;H=135;break b}else{fa=Y;ga=j;H=126}}else ca=0}else H=118;while(0);do if((H|0)==118){X=Fl(0)|0;if((X|0)!=(-1|0)?(e=X,j=f[4631]|0,Y=j+-1|0,U=((Y&e|0)==0?0:(Y+e&0-j)-e|0)+aa|0,e=f[4620]|0,j=U+e|0,U>>>0>B>>>0&U>>>0<2147483647):0){Y=f[4622]|0;if(Y|0?j>>>0<=e>>>0|j>>>0>Y>>>0:0){ca=0;break}Y=Fl(U|0)|0;if((Y|0)==(X|0)){da=U;ea=X;H=135;break b}else{fa=Y;ga=U;H=126}}else ca=0}while(0);do if((H|0)==126){U=0-ga|0;if(!(c>>>0>ga>>>0&(ga>>>0<2147483647&(fa|0)!=(-1|0))))if((fa|0)==(-1|0)){ca=0;break}else{da=ga;ea=fa;H=135;break b}Y=f[4632]|0;X=S-ga+Y&0-Y;if(X>>>0>=2147483647){da=ga;ea=fa;H=135;break b}if((Fl(X|0)|0)==(-1|0)){Fl(U|0)|0;ca=0;break}else{da=X+ga|0;ea=fa;H=135;break b}}while(0);f[4623]=f[4623]|4;ha=ca;H=133}else{ha=0;H=133}while(0);if(((H|0)==133?aa>>>0<2147483647:0)?(ca=Fl(aa|0)|0,aa=Fl(0)|0,fa=aa-ca|0,ga=fa>>>0>(B+40|0)>>>0,!((ca|0)==(-1|0)|ga^1|ca>>>0<aa>>>0&((ca|0)!=(-1|0)&(aa|0)!=(-1|0))^1)):0){da=ga?fa:ha;ea=ca;H=135}if((H|0)==135){ca=(f[4620]|0)+da|0;f[4620]=ca;if(ca>>>0>(f[4621]|0)>>>0)f[4621]=ca;ca=f[4518]|0;do if(ca){ha=18496;while(1){ia=f[ha>>2]|0;ja=ha+4|0;ka=f[ja>>2]|0;if((ea|0)==(ia+ka|0)){H=143;break}fa=f[ha+8>>2]|0;if(!fa)break;else ha=fa}if(((H|0)==143?(f[ha+12>>2]&8|0)==0:0)?ea>>>0>ca>>>0&ia>>>0<=ca>>>0:0){f[ja>>2]=ka+da;fa=(f[4515]|0)+da|0;ga=ca+8|0;aa=(ga&7|0)==0?0:0-ga&7;ga=ca+aa|0;S=fa-aa|0;f[4518]=ga;f[4515]=S;f[ga+4>>2]=S|1;f[ca+fa+4>>2]=40;f[4519]=f[4634];break}if(ea>>>0<(f[4516]|0)>>>0)f[4516]=ea;fa=ea+da|0;S=18496;while(1){if((f[S>>2]|0)==(fa|0)){H=151;break}ga=f[S+8>>2]|0;if(!ga){la=18496;break}else S=ga}if((H|0)==151)if(!(f[S+12>>2]&8)){f[S>>2]=ea;ha=S+4|0;f[ha>>2]=(f[ha>>2]|0)+da;ha=ea+8|0;ga=ea+((ha&7|0)==0?0:0-ha&7)|0;ha=fa+8|0;aa=fa+((ha&7|0)==0?0:0-ha&7)|0;ha=ga+B|0;c=aa-ga-B|0;f[ga+4>>2]=B|3;do if((ca|0)!=(aa|0)){if((f[4517]|0)==(aa|0)){ba=(f[4514]|0)+c|0;f[4514]=ba;f[4517]=ha;f[ha+4>>2]=ba|1;f[ha+ba>>2]=ba;break}ba=f[aa+4>>2]|0;if((ba&3|0)==1){_=ba&-8;$=ba>>>3;d:do if(ba>>>0<256){T=f[aa+8>>2]|0;X=f[aa+12>>2]|0;if((X|0)==(T|0)){f[4512]=f[4512]&~(1<<$);break}else{f[T+12>>2]=X;f[X+8>>2]=T;break}}else{T=f[aa+24>>2]|0;X=f[aa+12>>2]|0;do if((X|0)==(aa|0)){U=aa+16|0;Y=U+4|0;j=f[Y>>2]|0;if(!j){e=f[U>>2]|0;if(!e){ma=0;break}else{na=e;oa=U}}else{na=j;oa=Y}while(1){Y=na+20|0;j=f[Y>>2]|0;if(j|0){na=j;oa=Y;continue}Y=na+16|0;j=f[Y>>2]|0;if(!j)break;else{na=j;oa=Y}}f[oa>>2]=0;ma=na}else{Y=f[aa+8>>2]|0;f[Y+12>>2]=X;f[X+8>>2]=Y;ma=X}while(0);if(!T)break;X=f[aa+28>>2]|0;Y=18352+(X<<2)|0;do if((f[Y>>2]|0)!=(aa|0)){f[T+16+(((f[T+16>>2]|0)!=(aa|0)&1)<<2)>>2]=ma;if(!ma)break d}else{f[Y>>2]=ma;if(ma|0)break;f[4513]=f[4513]&~(1<<X);break d}while(0);f[ma+24>>2]=T;X=aa+16|0;Y=f[X>>2]|0;if(Y|0){f[ma+16>>2]=Y;f[Y+24>>2]=ma}Y=f[X+4>>2]|0;if(!Y)break;f[ma+20>>2]=Y;f[Y+24>>2]=ma}while(0);pa=aa+_|0;qa=_+c|0}else{pa=aa;qa=c}$=pa+4|0;f[$>>2]=f[$>>2]&-2;f[ha+4>>2]=qa|1;f[ha+qa>>2]=qa;$=qa>>>3;if(qa>>>0<256){ba=18088+($<<1<<2)|0;Z=f[4512]|0;Y=1<<$;if(!(Z&Y)){f[4512]=Z|Y;ra=ba;sa=ba+8|0}else{Y=ba+8|0;ra=f[Y>>2]|0;sa=Y}f[sa>>2]=ha;f[ra+12>>2]=ha;f[ha+8>>2]=ra;f[ha+12>>2]=ba;break}ba=qa>>>8;do if(!ba)ta=0;else{if(qa>>>0>16777215){ta=31;break}Y=(ba+1048320|0)>>>16&8;Z=ba<<Y;$=(Z+520192|0)>>>16&4;X=Z<<$;Z=(X+245760|0)>>>16&2;j=14-($|Y|Z)+(X<<Z>>>15)|0;ta=qa>>>(j+7|0)&1|j<<1}while(0);ba=18352+(ta<<2)|0;f[ha+28>>2]=ta;_=ha+16|0;f[_+4>>2]=0;f[_>>2]=0;_=f[4513]|0;j=1<<ta;if(!(_&j)){f[4513]=_|j;f[ba>>2]=ha;f[ha+24>>2]=ba;f[ha+12>>2]=ha;f[ha+8>>2]=ha;break}j=qa<<((ta|0)==31?0:25-(ta>>>1)|0);_=f[ba>>2]|0;while(1){if((f[_+4>>2]&-8|0)==(qa|0)){H=192;break}ua=_+16+(j>>>31<<2)|0;ba=f[ua>>2]|0;if(!ba){H=191;break}else{j=j<<1;_=ba}}if((H|0)==191){f[ua>>2]=ha;f[ha+24>>2]=_;f[ha+12>>2]=ha;f[ha+8>>2]=ha;break}else if((H|0)==192){j=_+8|0;ba=f[j>>2]|0;f[ba+12>>2]=ha;f[j>>2]=ha;f[ha+8>>2]=ba;f[ha+12>>2]=_;f[ha+24>>2]=0;break}}else{ba=(f[4515]|0)+c|0;f[4515]=ba;f[4518]=ha;f[ha+4>>2]=ba|1}while(0);o=ga+8|0;u=b;return o|0}else la=18496;while(1){ha=f[la>>2]|0;if(ha>>>0<=ca>>>0?(va=ha+(f[la+4>>2]|0)|0,va>>>0>ca>>>0):0)break;la=f[la+8>>2]|0}ga=va+-47|0;ha=ga+8|0;c=ga+((ha&7|0)==0?0:0-ha&7)|0;ha=ca+16|0;ga=c>>>0<ha>>>0?ca:c;c=ga+8|0;aa=da+-40|0;fa=ea+8|0;S=(fa&7|0)==0?0:0-fa&7;fa=ea+S|0;ba=aa-S|0;f[4518]=fa;f[4515]=ba;f[fa+4>>2]=ba|1;f[ea+aa+4>>2]=40;f[4519]=f[4634];aa=ga+4|0;f[aa>>2]=27;f[c>>2]=f[4624];f[c+4>>2]=f[4625];f[c+8>>2]=f[4626];f[c+12>>2]=f[4627];f[4624]=ea;f[4625]=da;f[4627]=0;f[4626]=c;c=ga+24|0;do{ba=c;c=c+4|0;f[c>>2]=7}while((ba+8|0)>>>0<va>>>0);if((ga|0)!=(ca|0)){c=ga-ca|0;f[aa>>2]=f[aa>>2]&-2;f[ca+4>>2]=c|1;f[ga>>2]=c;ba=c>>>3;if(c>>>0<256){fa=18088+(ba<<1<<2)|0;S=f[4512]|0;j=1<<ba;if(!(S&j)){f[4512]=S|j;wa=fa;xa=fa+8|0}else{j=fa+8|0;wa=f[j>>2]|0;xa=j}f[xa>>2]=ca;f[wa+12>>2]=ca;f[ca+8>>2]=wa;f[ca+12>>2]=fa;break}fa=c>>>8;if(fa)if(c>>>0>16777215)ya=31;else{j=(fa+1048320|0)>>>16&8;S=fa<<j;fa=(S+520192|0)>>>16&4;ba=S<<fa;S=(ba+245760|0)>>>16&2;Z=14-(fa|j|S)+(ba<<S>>>15)|0;ya=c>>>(Z+7|0)&1|Z<<1}else ya=0;Z=18352+(ya<<2)|0;f[ca+28>>2]=ya;f[ca+20>>2]=0;f[ha>>2]=0;S=f[4513]|0;ba=1<<ya;if(!(S&ba)){f[4513]=S|ba;f[Z>>2]=ca;f[ca+24>>2]=Z;f[ca+12>>2]=ca;f[ca+8>>2]=ca;break}ba=c<<((ya|0)==31?0:25-(ya>>>1)|0);S=f[Z>>2]|0;while(1){if((f[S+4>>2]&-8|0)==(c|0)){H=213;break}za=S+16+(ba>>>31<<2)|0;Z=f[za>>2]|0;if(!Z){H=212;break}else{ba=ba<<1;S=Z}}if((H|0)==212){f[za>>2]=ca;f[ca+24>>2]=S;f[ca+12>>2]=ca;f[ca+8>>2]=ca;break}else if((H|0)==213){ba=S+8|0;c=f[ba>>2]|0;f[c+12>>2]=ca;f[ba>>2]=ca;f[ca+8>>2]=c;f[ca+12>>2]=S;f[ca+24>>2]=0;break}}}else{c=f[4516]|0;if((c|0)==0|ea>>>0<c>>>0)f[4516]=ea;f[4624]=ea;f[4625]=da;f[4627]=0;f[4521]=f[4630];f[4520]=-1;f[4525]=18088;f[4524]=18088;f[4527]=18096;f[4526]=18096;f[4529]=18104;f[4528]=18104;f[4531]=18112;f[4530]=18112;f[4533]=18120;f[4532]=18120;f[4535]=18128;f[4534]=18128;f[4537]=18136;f[4536]=18136;f[4539]=18144;f[4538]=18144;f[4541]=18152;f[4540]=18152;f[4543]=18160;f[4542]=18160;f[4545]=18168;f[4544]=18168;f[4547]=18176;f[4546]=18176;f[4549]=18184;f[4548]=18184;f[4551]=18192;f[4550]=18192;f[4553]=18200;f[4552]=18200;f[4555]=18208;f[4554]=18208;f[4557]=18216;f[4556]=18216;f[4559]=18224;f[4558]=18224;f[4561]=18232;f[4560]=18232;f[4563]=18240;f[4562]=18240;f[4565]=18248;f[4564]=18248;f[4567]=18256;f[4566]=18256;f[4569]=18264;f[4568]=18264;f[4571]=18272;f[4570]=18272;f[4573]=18280;f[4572]=18280;f[4575]=18288;f[4574]=18288;f[4577]=18296;f[4576]=18296;f[4579]=18304;f[4578]=18304;f[4581]=18312;f[4580]=18312;f[4583]=18320;f[4582]=18320;f[4585]=18328;f[4584]=18328;f[4587]=18336;f[4586]=18336;c=da+-40|0;ba=ea+8|0;ha=(ba&7|0)==0?0:0-ba&7;ba=ea+ha|0;ga=c-ha|0;f[4518]=ba;f[4515]=ga;f[ba+4>>2]=ga|1;f[ea+c+4>>2]=40;f[4519]=f[4634]}while(0);ea=f[4515]|0;if(ea>>>0>B>>>0){da=ea-B|0;f[4515]=da;ea=f[4518]|0;ca=ea+B|0;f[4518]=ca;f[ca+4>>2]=da|1;f[ea+4>>2]=B|3;o=ea+8|0;u=b;return o|0}}ea=ir()|0;f[ea>>2]=12;o=0;u=b;return o|0}function ab(a,c,d,e,g,i){a=a|0;c=c|0;d=d|0;e=e|0;g=g|0;i=i|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ja=0,Ka=0,La=0,Ma=0,Na=0,Oa=0,Pa=0,Qa=0,Ra=0,Sa=0,Ta=0,Ua=0,Va=0.0,Wa=0,Xa=0,Ya=0,Za=0,_a=0,$a=0,ab=0,bb=0,cb=0,db=0,eb=0,fb=0,gb=0,hb=0,ib=0,jb=0,kb=0,lb=0,mb=0,nb=0,ob=0,pb=0,qb=0,rb=0,sb=0,tb=0,ub=0,vb=0,wb=0,xb=0,yb=0,zb=0,Ab=0,Bb=0,Cb=0,Db=0,Eb=0,Fb=0,Gb=0,Hb=0,Ib=0,Jb=0,Kb=0;i=u;u=u+240|0;j=i+104|0;k=i+224|0;l=i+176|0;m=i+160|0;n=i+228|0;o=i+72|0;p=i+40|0;q=i+132|0;r=i;s=i+172|0;t=i+156|0;v=i+152|0;w=i+148|0;x=i+144|0;y=i+128|0;z=a+8|0;Ah(z,c,e,g);e=f[a+48>>2]|0;A=f[a+52>>2]|0;B=l;C=B+48|0;do{f[B>>2]=0;B=B+4|0}while((B|0)<(C|0));if(!g){D=0;E=0}else{oi(l,g);D=f[l+12>>2]|0;E=f[l+16>>2]|0}B=l+16|0;C=E-D>>2;F=D;D=E;if(C>>>0>=g>>>0){if(C>>>0>g>>>0?(E=F+(g<<2)|0,(E|0)!=(D|0)):0)f[B>>2]=D+(~((D+-4-E|0)>>>2)<<2)}else oi(l+12|0,g-C|0);C=l+24|0;E=l+28|0;D=f[E>>2]|0;B=f[C>>2]|0;F=D-B>>2;G=B;B=D;if(F>>>0>=g>>>0){if(F>>>0>g>>>0?(D=G+(g<<2)|0,(D|0)!=(B|0)):0)f[E>>2]=B+(~((B+-4-D|0)>>>2)<<2)}else oi(C,g-F|0);F=l+36|0;C=l+40|0;D=f[C>>2]|0;B=f[F>>2]|0;E=D-B>>2;G=B;B=D;if(E>>>0>=g>>>0){if(E>>>0>g>>>0?(D=G+(g<<2)|0,(D|0)!=(B|0)):0)f[C>>2]=B+(~((B+-4-D|0)>>>2)<<2)}else oi(F,g-E|0);f[m>>2]=0;E=m+4|0;f[E>>2]=0;f[m+8>>2]=0;F=(g|0)==0;do if(!F)if(g>>>0>1073741823)mq(m);else{D=g<<2;B=dn(D)|0;f[m>>2]=B;C=B+(g<<2)|0;f[m+8>>2]=C;hj(B|0,0,D|0)|0;f[E>>2]=C;break}while(0);C=a+152|0;D=a+156|0;B=f[D>>2]|0;G=f[C>>2]|0;H=B-G>>2;L=G;G=B;if(H>>>0>=g>>>0){if(H>>>0>g>>>0?(B=L+(g<<2)|0,(B|0)!=(G|0)):0)f[D>>2]=G+(~((G+-4-B|0)>>>2)<<2)}else oi(C,g-H|0);f[o>>2]=0;f[o+4>>2]=0;f[o+8>>2]=0;f[o+12>>2]=0;f[o+16>>2]=0;f[o+20>>2]=0;f[o+24>>2]=0;f[o+28>>2]=0;f[p>>2]=0;f[p+4>>2]=0;f[p+8>>2]=0;f[p+12>>2]=0;f[p+16>>2]=0;f[p+20>>2]=0;f[p+24>>2]=0;f[p+28>>2]=0;f[q>>2]=0;H=q+4|0;f[H>>2]=0;f[q+8>>2]=0;if(F){M=0;N=0;O=0;P=0}else{F=g<<2;B=dn(F)|0;f[q>>2]=B;G=B+(g<<2)|0;f[q+8>>2]=G;hj(B|0,0,F|0)|0;f[H>>2]=G;M=B;N=G;O=G;P=B}B=a+56|0;G=f[B>>2]|0;F=f[G+4>>2]|0;D=f[G>>2]|0;L=F-D|0;a:do if((L|0)>4){Q=L>>>2;R=e+64|0;S=e+28|0;T=(g|0)>0;U=r+4|0;V=r+8|0;Z=r+12|0;_=a+152|0;$=a+112|0;aa=r+16|0;ba=r+28|0;ca=a+16|0;da=a+32|0;ea=a+12|0;fa=a+28|0;ga=a+20|0;ha=a+24|0;ia=r+28|0;ja=r+16|0;ka=r+20|0;la=r+32|0;ma=n+1|0;na=g<<2;oa=(g|0)==1;pa=Q+-1|0;if(F-D>>2>>>0>pa>>>0){qa=Q;ra=pa;sa=D;ta=M;ua=P;va=O;wa=M;xa=N;ya=M;za=N}else{Aa=G;mq(Aa)}b:while(1){pa=f[sa+(ra<<2)>>2]|0;Q=(((pa>>>0)%3|0|0)==0?2:-1)+pa|0;Ba=Q>>>5;Ca=1<<(Q&31);Da=(pa|0)==-1|(Q|0)==-1;Ea=1;Fa=0;Ga=pa;c:while(1){Ha=Ea^1;Ia=Fa;Ja=Ga;while(1){if((Ja|0)==-1){Ka=Ia;break c}La=f[l+(Ia*12|0)>>2]|0;if(((f[(f[e>>2]|0)+(Ja>>>5<<2)>>2]&1<<(Ja&31)|0)==0?(Ma=f[(f[(f[R>>2]|0)+12>>2]|0)+(Ja<<2)>>2]|0,(Ma|0)!=-1):0)?(Na=f[S>>2]|0,Oa=f[A>>2]|0,Pa=f[Oa+(f[Na+(Ma<<2)>>2]<<2)>>2]|0,Qa=Ma+1|0,Ra=f[Oa+(f[Na+((((Qa>>>0)%3|0|0)==0?Ma+-2|0:Qa)<<2)>>2]<<2)>>2]|0,Qa=f[Oa+(f[Na+((((Ma>>>0)%3|0|0)==0?2:-1)+Ma<<2)>>2]<<2)>>2]|0,(Pa|0)<(ra|0)&(Ra|0)<(ra|0)&(Qa|0)<(ra|0)):0){Ma=X(Pa,g)|0;Pa=X(Ra,g)|0;Ra=X(Qa,g)|0;if(T){Qa=0;do{f[La+(Qa<<2)>>2]=(f[c+(Qa+Ra<<2)>>2]|0)+(f[c+(Qa+Pa<<2)>>2]|0)-(f[c+(Qa+Ma<<2)>>2]|0);Qa=Qa+1|0}while((Qa|0)!=(g|0))}Qa=Ia+1|0;if((Qa|0)==4){Ka=4;break c}else Sa=Qa}else Sa=Ia;do if(Ea){Qa=Ja+1|0;Ma=((Qa>>>0)%3|0|0)==0?Ja+-2|0:Qa;if(((Ma|0)!=-1?(f[(f[e>>2]|0)+(Ma>>>5<<2)>>2]&1<<(Ma&31)|0)==0:0)?(Qa=f[(f[(f[R>>2]|0)+12>>2]|0)+(Ma<<2)>>2]|0,Ma=Qa+1|0,(Qa|0)!=-1):0)Ta=((Ma>>>0)%3|0|0)==0?Qa+-2|0:Ma;else Ta=-1}else{Ma=(((Ja>>>0)%3|0|0)==0?2:-1)+Ja|0;if(((Ma|0)!=-1?(f[(f[e>>2]|0)+(Ma>>>5<<2)>>2]&1<<(Ma&31)|0)==0:0)?(Qa=f[(f[(f[R>>2]|0)+12>>2]|0)+(Ma<<2)>>2]|0,(Qa|0)!=-1):0)if(!((Qa>>>0)%3|0)){Ta=Qa+2|0;break}else{Ta=Qa+-1|0;break}else Ta=-1}while(0);if((Ta|0)==(pa|0)){Ka=Sa;break c}if((Ta|0)!=-1|Ha){Ia=Sa;Ja=Ta}else break}if(Da){Ea=0;Fa=Sa;Ga=-1;continue}if(f[(f[e>>2]|0)+(Ba<<2)>>2]&Ca|0){Ea=0;Fa=Sa;Ga=-1;continue}Ja=f[(f[(f[R>>2]|0)+12>>2]|0)+(Q<<2)>>2]|0;if((Ja|0)==-1){Ea=0;Fa=Sa;Ga=-1;continue}if(!((Ja>>>0)%3|0)){Ea=0;Fa=Sa;Ga=Ja+2|0;continue}else{Ea=0;Fa=Sa;Ga=Ja+-1|0;continue}}Ga=X(ra,g)|0;f[r>>2]=0;f[U>>2]=0;b[V>>0]=0;f[Z>>2]=0;f[Z+4>>2]=0;f[Z+8>>2]=0;f[Z+12>>2]=0;f[Z+16>>2]=0;f[Z+20>>2]=0;f[Z+24>>2]=0;Fa=c+((X(qa+-2|0,g)|0)<<2)|0;Ea=c+(Ga<<2)|0;Q=f[_>>2]|0;if(T){Ca=0;Ba=0;while(1){Da=(f[Fa+(Ca<<2)>>2]|0)-(f[Ea+(Ca<<2)>>2]|0)|0;pa=((Da|0)>-1?Da:0-Da|0)+Ba|0;f[ta+(Ca<<2)>>2]=Da;f[Q+(Ca<<2)>>2]=Da<<1^Da>>31;Ca=Ca+1|0;if((Ca|0)==(g|0)){Ua=pa;break}else Ba=pa}}else Ua=0;ho(j,$,Q,g);Ba=Tk(j)|0;Ca=I;pa=om(j)|0;Da=Tn(pa|0,I|0,Ba|0,Ca|0)|0;Ca=I;Ba=(Ka|0)>0;if(Ba){pa=Ka+-1|0;Ja=p+(pa<<3)|0;Ia=Ja;Ha=Tn(f[Ia>>2]|0,f[Ia+4>>2]|0,Ka|0,((Ka|0)<0)<<31>>31|0)|0;Ia=I;Qa=Ja;f[Qa>>2]=Ha;f[Qa+4>>2]=Ia;Va=+W(+(+jm(Ha,f[o+(pa<<3)>>2]|0)*(+(Ha>>>0)+4294967296.0*+(Ia|0))));Ia=Tn(Da|0,Ca|0,~~Va>>>0|0,(+K(Va)>=1.0?(Va>0.0?~~+Y(+J(Va/4294967296.0),4294967295.0)>>>0:~~+W((Va-+(~~Va>>>0))/4294967296.0)>>>0):0)|0)|0;Wa=Ia}else Wa=Da;Da=r;f[Da>>2]=Wa;f[Da+4>>2]=Ua;b[V>>0]=0;f[Z>>2]=0;Mf(aa,Fa,Fa+(g<<2)|0);f[s>>2]=ua;f[t>>2]=va;f[k>>2]=f[s>>2];f[j>>2]=f[t>>2];tf(ba,k,j);if((Ka|0)<1){Xa=za;Ya=ya;Za=xa;_a=wa;$a=va;ab=ua;bb=ua}else{Da=n+Ka|0;Ia=f[q>>2]|0;Ca=Ka+-1|0;Ha=o+(Ca<<3)|0;pa=p+(Ca<<3)|0;Ca=Ia;Qa=f[H>>2]|0;Ja=Da+-1|0;Ma=(Ja|0)==(n|0);Pa=Da+-2|0;Ra=ma>>>0<Pa>>>0;La=~Ka;Na=Ka+2+((La|0)>-2?La:-2)|0;La=Qa;Oa=Ja>>>0>n>>>0;cb=0;db=1;while(1){cb=cb+1|0;hj(n|0,1,Na|0)|0;hj(n|0,0,cb|0)|0;d:while(1){if(T){hj(f[m>>2]|0,0,na|0)|0;eb=f[m>>2]|0;fb=0;gb=0;while(1){if(!(b[n+fb>>0]|0)){hb=f[l+(fb*12|0)>>2]|0;ib=0;do{jb=eb+(ib<<2)|0;f[jb>>2]=(f[jb>>2]|0)+(f[hb+(ib<<2)>>2]|0);ib=ib+1|0}while((ib|0)!=(g|0));kb=(1<<fb|gb&255)&255}else kb=gb;fb=fb+1|0;if((fb|0)==(Ka|0)){lb=kb;break}else gb=kb}}else{gb=0;fb=0;while(1){if(!(b[n+gb>>0]|0))mb=(1<<gb|fb&255)&255;else mb=fb;gb=gb+1|0;if((gb|0)==(Ka|0)){lb=mb;break}else fb=mb}}fb=f[m>>2]|0;do if(T){f[fb>>2]=(f[fb>>2]|0)/(db|0)|0;if(!oa){gb=1;do{eb=fb+(gb<<2)|0;f[eb>>2]=(f[eb>>2]|0)/(db|0)|0;gb=gb+1|0}while((gb|0)!=(g|0));gb=f[_>>2]|0;if(T)nb=gb;else{ob=0;pb=gb;break}}else nb=f[_>>2]|0;gb=0;eb=0;while(1){ib=(f[fb+(gb<<2)>>2]|0)-(f[Ea+(gb<<2)>>2]|0)|0;hb=((ib|0)>-1?ib:0-ib|0)+eb|0;f[Ia+(gb<<2)>>2]=ib;f[nb+(gb<<2)>>2]=ib<<1^ib>>31;gb=gb+1|0;if((gb|0)==(g|0)){ob=hb;pb=nb;break}else eb=hb}}else{ob=0;pb=f[_>>2]|0}while(0);ho(j,$,pb,g);fb=Tk(j)|0;eb=I;gb=om(j)|0;hb=Tn(gb|0,I|0,fb|0,eb|0)|0;eb=I;if(Ba){fb=Ha;gb=Tn(f[fb>>2]|0,f[fb+4>>2]|0,db|0,0)|0;fb=pa;ib=f[fb>>2]|0;jb=f[fb+4>>2]|0;Va=+W(+(+jm(ib,gb)*(+(ib>>>0)+4294967296.0*+(jb|0))));jb=Tn(hb|0,eb|0,~~Va>>>0|0,(+K(Va)>=1.0?(Va>0.0?~~+Y(+J(Va/4294967296.0),4294967295.0)>>>0:~~+W((Va-+(~~Va>>>0))/4294967296.0)>>>0):0)|0)|0;qb=jb}else qb=hb;hb=f[r>>2]|0;if(!((qb|0)>=(hb|0)?!((qb|0)<=(hb|0)?(ob|0)<(f[U>>2]|0):0):0)){hb=r;f[hb>>2]=qb;f[hb+4>>2]=ob;b[V>>0]=lb;f[Z>>2]=db;f[v>>2]=f[m>>2];f[w>>2]=f[E>>2];f[k>>2]=f[v>>2];f[j>>2]=f[w>>2];tf(aa,k,j);f[x>>2]=Ca;f[y>>2]=Qa;f[k>>2]=f[x>>2];f[j>>2]=f[y>>2];tf(ba,k,j)}if(Ma)break;rb=b[Ja>>0]|0;hb=-1;jb=rb;while(1){eb=hb+-1|0;sb=Da+eb|0;ib=jb;jb=b[sb>>0]|0;if((jb&255)<(ib&255))break;if((sb|0)==(n|0)){tb=86;break d}else hb=eb}eb=Da+hb|0;if((jb&255)<(rb&255)){ub=Ja;vb=rb}else{ib=Da;gb=Ja;while(1){fb=gb+-1|0;if((jb&255)<(h[ib+-2>>0]|0)){ub=fb;vb=1;break}else{wb=gb;gb=fb;ib=wb}}}b[sb>>0]=vb;b[ub>>0]=jb;if((hb|0)<-1){xb=eb;yb=Ja}else continue;while(1){ib=b[xb>>0]|0;b[xb>>0]=b[yb>>0]|0;b[yb>>0]=ib;ib=xb+1|0;gb=yb+-1|0;if(ib>>>0<gb>>>0){xb=ib;yb=gb}else continue d}}if(((tb|0)==86?(tb=0,Oa):0)?(eb=b[n>>0]|0,b[n>>0]=rb,b[Ja>>0]=eb,Ra):0){eb=Pa;hb=ma;do{jb=b[hb>>0]|0;b[hb>>0]=b[eb>>0]|0;b[eb>>0]=jb;hb=hb+1|0;eb=eb+-1|0}while(hb>>>0<eb>>>0)}if((db|0)>=(Ka|0)){Xa=La;Ya=Ia;Za=La;_a=Ia;$a=Qa;ab=Ca;bb=Ia;break}else db=db+1|0}}if(Ba){db=f[Z>>2]|0;Ia=o+(Ka+-1<<3)|0;Ca=Ia;Qa=Tn(f[Ca>>2]|0,f[Ca+4>>2]|0,db|0,((db|0)<0)<<31>>31|0)|0;db=Ia;f[db>>2]=Qa;f[db+4>>2]=I}if(T){db=f[ba>>2]|0;Qa=f[C>>2]|0;Ia=0;do{Ca=f[db+(Ia<<2)>>2]|0;f[Qa+(Ia<<2)>>2]=Ca<<1^Ca>>31;Ia=Ia+1|0}while((Ia|0)!=(g|0));zb=Qa}else zb=f[C>>2]|0;go(j,$,zb,g);if(Ba){Qa=Ka+-1|0;Ab=a+60+(Qa*12|0)|0;Ia=a+60+(Qa*12|0)+4|0;db=a+60+(Qa*12|0)+8|0;Qa=0;do{Ca=f[Ia>>2]|0;La=f[db>>2]|0;Pa=(Ca|0)==(La<<5|0);if(!(1<<Qa&h[V>>0])){if(Pa){if((Ca+1|0)<0){tb=114;break b}Ra=La<<6;Ja=Ca+32&-32;hi(Ab,Ca>>>0<1073741823?(Ra>>>0<Ja>>>0?Ja:Ra):2147483647);Bb=f[Ia>>2]|0}else Bb=Ca;f[Ia>>2]=Bb+1;Ra=(f[Ab>>2]|0)+(Bb>>>5<<2)|0;f[Ra>>2]=f[Ra>>2]|1<<(Bb&31)}else{if(Pa){if((Ca+1|0)<0){tb=119;break b}Pa=La<<6;La=Ca+32&-32;hi(Ab,Ca>>>0<1073741823?(Pa>>>0<La>>>0?La:Pa):2147483647);Cb=f[Ia>>2]|0}else Cb=Ca;f[Ia>>2]=Cb+1;Ca=(f[Ab>>2]|0)+(Cb>>>5<<2)|0;f[Ca>>2]=f[Ca>>2]&~(1<<(Cb&31))}Qa=Qa+1|0}while((Qa|0)<(Ka|0))}Qa=d+(Ga<<2)|0;Ia=f[z>>2]|0;if((Ia|0)>0){db=0;Ba=f[aa>>2]|0;Ca=Ia;while(1){if((Ca|0)>0){Ia=0;do{Pa=f[Ba+(Ia<<2)>>2]|0;La=f[ca>>2]|0;if((Pa|0)>(La|0)){Ra=f[da>>2]|0;f[Ra+(Ia<<2)>>2]=La;Db=Ra}else{Ra=f[ea>>2]|0;La=f[da>>2]|0;f[La+(Ia<<2)>>2]=(Pa|0)<(Ra|0)?Ra:Pa;Db=La}Ia=Ia+1|0}while((Ia|0)<(f[z>>2]|0));Eb=Db}else Eb=f[da>>2]|0;Ia=(f[Ea+(db<<2)>>2]|0)-(f[Eb+(db<<2)>>2]|0)|0;La=Qa+(db<<2)|0;f[La>>2]=Ia;do if((Ia|0)<(f[fa>>2]|0)){Fb=(f[ga>>2]|0)+Ia|0;tb=109}else{if((Ia|0)<=(f[ha>>2]|0))break;Fb=Ia-(f[ga>>2]|0)|0;tb=109}while(0);if((tb|0)==109){tb=0;f[La>>2]=Fb}db=db+1|0;Ca=f[z>>2]|0;if((db|0)>=(Ca|0))break;else Ba=Eb}}Ba=f[ia>>2]|0;if(Ba|0){Ca=f[la>>2]|0;if((Ca|0)!=(Ba|0))f[la>>2]=Ca+(~((Ca+-4-Ba|0)>>>2)<<2);br(Ba)}Ba=f[ja>>2]|0;if(Ba|0){Ca=f[ka>>2]|0;if((Ca|0)!=(Ba|0))f[ka>>2]=Ca+(~((Ca+-4-Ba|0)>>>2)<<2);br(Ba)}if((qa|0)<=2){Gb=_a;Hb=Za;break a}Ba=f[B>>2]|0;sa=f[Ba>>2]|0;Ca=ra+-1|0;if((f[Ba+4>>2]|0)-sa>>2>>>0<=Ca>>>0){Aa=Ba;tb=18;break}else{Ba=ra;ra=Ca;ta=bb;ua=ab;va=$a;wa=_a;xa=Za;ya=Ya;za=Xa;qa=Ba}}if((tb|0)==18)mq(Aa);else if((tb|0)==114)mq(Ab);else if((tb|0)==119)mq(Ab)}else{Gb=M;Hb=N}while(0);N=f[l>>2]|0;if((g|0)>0?(f[N>>2]=0,(g|0)!=1):0){M=1;do{f[N+(M<<2)>>2]=0;M=M+1|0}while((M|0)!=(g|0))}g=f[z>>2]|0;if((g|0)>0){M=a+16|0;Ab=a+32|0;Aa=a+12|0;qa=a+28|0;Xa=a+20|0;za=a+24|0;a=0;Ya=N;N=g;while(1){if((N|0)>0){g=0;do{ya=f[Ya+(g<<2)>>2]|0;Za=f[M>>2]|0;if((ya|0)>(Za|0)){xa=f[Ab>>2]|0;f[xa+(g<<2)>>2]=Za;Ib=xa}else{xa=f[Aa>>2]|0;Za=f[Ab>>2]|0;f[Za+(g<<2)>>2]=(ya|0)<(xa|0)?xa:ya;Ib=Za}g=g+1|0}while((g|0)<(f[z>>2]|0));Jb=Ib}else Jb=f[Ab>>2]|0;g=(f[c+(a<<2)>>2]|0)-(f[Jb+(a<<2)>>2]|0)|0;Za=d+(a<<2)|0;f[Za>>2]=g;if((g|0)>=(f[qa>>2]|0)){if((g|0)>(f[za>>2]|0)){Kb=g-(f[Xa>>2]|0)|0;tb=145}}else{Kb=(f[Xa>>2]|0)+g|0;tb=145}if((tb|0)==145){tb=0;f[Za>>2]=Kb}a=a+1|0;N=f[z>>2]|0;if((a|0)>=(N|0))break;else Ya=Jb}}if(Gb|0){if((Hb|0)!=(Gb|0))f[H>>2]=Hb+(~((Hb+-4-Gb|0)>>>2)<<2);br(Gb)}Gb=f[m>>2]|0;if(Gb|0){m=f[E>>2]|0;if((m|0)!=(Gb|0))f[E>>2]=m+(~((m+-4-Gb|0)>>>2)<<2);br(Gb)}Gb=f[l+36>>2]|0;if(Gb|0){m=l+40|0;E=f[m>>2]|0;if((E|0)!=(Gb|0))f[m>>2]=E+(~((E+-4-Gb|0)>>>2)<<2);br(Gb)}Gb=f[l+24>>2]|0;if(Gb|0){E=l+28|0;m=f[E>>2]|0;if((m|0)!=(Gb|0))f[E>>2]=m+(~((m+-4-Gb|0)>>>2)<<2);br(Gb)}Gb=f[l+12>>2]|0;if(Gb|0){m=l+16|0;E=f[m>>2]|0;if((E|0)!=(Gb|0))f[m>>2]=E+(~((E+-4-Gb|0)>>>2)<<2);br(Gb)}Gb=f[l>>2]|0;if(!Gb){u=i;return 1}E=l+4|0;l=f[E>>2]|0;if((l|0)!=(Gb|0))f[E>>2]=l+(~((l+-4-Gb|0)>>>2)<<2);br(Gb);u=i;return 1}function bb(a,c,d,e,g,i){a=a|0;c=c|0;d=d|0;e=e|0;g=g|0;i=i|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ja=0,Ka=0,La=0,Ma=0,Na=0,Oa=0,Pa=0,Qa=0,Ra=0,Sa=0,Ta=0,Ua=0,Va=0.0,Wa=0,Xa=0,Ya=0,Za=0,_a=0,$a=0,ab=0,bb=0,cb=0,db=0,eb=0,fb=0,gb=0,hb=0,ib=0,jb=0,kb=0,lb=0,mb=0,nb=0,ob=0,pb=0,qb=0,rb=0,sb=0,tb=0,ub=0,vb=0,wb=0,xb=0,yb=0,zb=0,Ab=0,Bb=0,Cb=0,Db=0,Eb=0,Fb=0,Gb=0,Hb=0,Ib=0,Jb=0,Kb=0,Lb=0,Mb=0;i=u;u=u+240|0;j=i+104|0;k=i+224|0;l=i+176|0;m=i+160|0;n=i+228|0;o=i+72|0;p=i+40|0;q=i+132|0;r=i;s=i+172|0;t=i+156|0;v=i+152|0;w=i+148|0;x=i+144|0;y=i+128|0;z=a+8|0;Ah(z,c,e,g);e=f[a+48>>2]|0;A=f[a+52>>2]|0;B=l;C=B+48|0;do{f[B>>2]=0;B=B+4|0}while((B|0)<(C|0));if(!g){D=0;E=0}else{oi(l,g);D=f[l+12>>2]|0;E=f[l+16>>2]|0}B=l+16|0;C=E-D>>2;F=D;D=E;if(C>>>0>=g>>>0){if(C>>>0>g>>>0?(E=F+(g<<2)|0,(E|0)!=(D|0)):0)f[B>>2]=D+(~((D+-4-E|0)>>>2)<<2)}else oi(l+12|0,g-C|0);C=l+24|0;E=l+28|0;D=f[E>>2]|0;B=f[C>>2]|0;F=D-B>>2;G=B;B=D;if(F>>>0>=g>>>0){if(F>>>0>g>>>0?(D=G+(g<<2)|0,(D|0)!=(B|0)):0)f[E>>2]=B+(~((B+-4-D|0)>>>2)<<2)}else oi(C,g-F|0);F=l+36|0;C=l+40|0;D=f[C>>2]|0;B=f[F>>2]|0;E=D-B>>2;G=B;B=D;if(E>>>0>=g>>>0){if(E>>>0>g>>>0?(D=G+(g<<2)|0,(D|0)!=(B|0)):0)f[C>>2]=B+(~((B+-4-D|0)>>>2)<<2)}else oi(F,g-E|0);f[m>>2]=0;E=m+4|0;f[E>>2]=0;f[m+8>>2]=0;F=(g|0)==0;do if(!F)if(g>>>0>1073741823)mq(m);else{D=g<<2;B=dn(D)|0;f[m>>2]=B;C=B+(g<<2)|0;f[m+8>>2]=C;hj(B|0,0,D|0)|0;f[E>>2]=C;break}while(0);C=a+152|0;D=a+156|0;B=f[D>>2]|0;G=f[C>>2]|0;H=B-G>>2;L=G;G=B;if(H>>>0>=g>>>0){if(H>>>0>g>>>0?(B=L+(g<<2)|0,(B|0)!=(G|0)):0)f[D>>2]=G+(~((G+-4-B|0)>>>2)<<2)}else oi(C,g-H|0);f[o>>2]=0;f[o+4>>2]=0;f[o+8>>2]=0;f[o+12>>2]=0;f[o+16>>2]=0;f[o+20>>2]=0;f[o+24>>2]=0;f[o+28>>2]=0;f[p>>2]=0;f[p+4>>2]=0;f[p+8>>2]=0;f[p+12>>2]=0;f[p+16>>2]=0;f[p+20>>2]=0;f[p+24>>2]=0;f[p+28>>2]=0;f[q>>2]=0;H=q+4|0;f[H>>2]=0;f[q+8>>2]=0;if(F){M=0;N=0;O=0;P=0}else{F=g<<2;B=dn(F)|0;f[q>>2]=B;G=B+(g<<2)|0;f[q+8>>2]=G;hj(B|0,0,F|0)|0;f[H>>2]=G;M=B;N=G;O=G;P=B}B=a+56|0;G=f[B>>2]|0;F=f[G+4>>2]|0;D=f[G>>2]|0;L=F-D|0;a:do if((L|0)>4){Q=L>>>2;R=e+12|0;S=(g|0)>0;T=r+4|0;U=r+8|0;V=r+12|0;Z=a+152|0;_=a+112|0;$=r+16|0;aa=r+28|0;ba=a+16|0;ca=a+32|0;da=a+12|0;ea=a+28|0;fa=a+20|0;ga=a+24|0;ha=r+28|0;ia=r+16|0;ja=r+20|0;ka=r+32|0;la=n+1|0;ma=g<<2;na=(g|0)==1;oa=Q+-1|0;if(F-D>>2>>>0>oa>>>0){pa=Q;qa=oa;ra=D;sa=M;ta=P;ua=O;va=M;wa=N;xa=M;ya=N}else{za=G;mq(za)}b:while(1){oa=f[ra+(qa<<2)>>2]|0;Q=(((oa>>>0)%3|0|0)==0?2:-1)+oa|0;Aa=(oa|0)==-1|(Q|0)==-1;Ba=1;Ca=0;Da=oa;c:while(1){Ea=Ba^1;Fa=Ca;Ga=Da;while(1){if((Ga|0)==-1){Ha=Fa;break c}Ia=f[l+(Fa*12|0)>>2]|0;Ja=f[R>>2]|0;Ka=f[Ja+(Ga<<2)>>2]|0;if((Ka|0)!=-1){La=f[e>>2]|0;Ma=f[A>>2]|0;Na=f[Ma+(f[La+(Ka<<2)>>2]<<2)>>2]|0;Oa=Ka+1|0;Pa=((Oa>>>0)%3|0|0)==0?Ka+-2|0:Oa;if((Pa|0)==-1)Qa=-1;else Qa=f[La+(Pa<<2)>>2]|0;Pa=f[Ma+(Qa<<2)>>2]|0;Oa=(((Ka>>>0)%3|0|0)==0?2:-1)+Ka|0;if((Oa|0)==-1)Ra=-1;else Ra=f[La+(Oa<<2)>>2]|0;Oa=f[Ma+(Ra<<2)>>2]|0;if((Na|0)<(qa|0)&(Pa|0)<(qa|0)&(Oa|0)<(qa|0)){Ma=X(Na,g)|0;Na=X(Pa,g)|0;Pa=X(Oa,g)|0;if(S){Oa=0;do{f[Ia+(Oa<<2)>>2]=(f[c+(Oa+Pa<<2)>>2]|0)+(f[c+(Oa+Na<<2)>>2]|0)-(f[c+(Oa+Ma<<2)>>2]|0);Oa=Oa+1|0}while((Oa|0)!=(g|0))}Oa=Fa+1|0;if((Oa|0)==4){Ha=4;break c}else Sa=Oa}else Sa=Fa}else Sa=Fa;do if(Ba){Oa=Ga+1|0;Ma=((Oa>>>0)%3|0|0)==0?Ga+-2|0:Oa;if((Ma|0)!=-1?(Oa=f[Ja+(Ma<<2)>>2]|0,Ma=Oa+1|0,(Oa|0)!=-1):0)Ta=((Ma>>>0)%3|0|0)==0?Oa+-2|0:Ma;else Ta=-1}else{Ma=(((Ga>>>0)%3|0|0)==0?2:-1)+Ga|0;if((Ma|0)!=-1?(Oa=f[Ja+(Ma<<2)>>2]|0,(Oa|0)!=-1):0)if(!((Oa>>>0)%3|0)){Ta=Oa+2|0;break}else{Ta=Oa+-1|0;break}else Ta=-1}while(0);if((Ta|0)==(oa|0)){Ha=Sa;break c}if((Ta|0)!=-1|Ea){Fa=Sa;Ga=Ta}else break}if(Aa){Ba=0;Ca=Sa;Da=-1;continue}Ga=f[Ja+(Q<<2)>>2]|0;if((Ga|0)==-1){Ba=0;Ca=Sa;Da=-1;continue}if(!((Ga>>>0)%3|0)){Ba=0;Ca=Sa;Da=Ga+2|0;continue}else{Ba=0;Ca=Sa;Da=Ga+-1|0;continue}}Da=X(qa,g)|0;f[r>>2]=0;f[T>>2]=0;b[U>>0]=0;f[V>>2]=0;f[V+4>>2]=0;f[V+8>>2]=0;f[V+12>>2]=0;f[V+16>>2]=0;f[V+20>>2]=0;f[V+24>>2]=0;Ca=c+((X(pa+-2|0,g)|0)<<2)|0;Ba=c+(Da<<2)|0;Q=f[Z>>2]|0;if(S){Aa=0;oa=0;while(1){Ga=(f[Ca+(Aa<<2)>>2]|0)-(f[Ba+(Aa<<2)>>2]|0)|0;Fa=((Ga|0)>-1?Ga:0-Ga|0)+oa|0;f[sa+(Aa<<2)>>2]=Ga;f[Q+(Aa<<2)>>2]=Ga<<1^Ga>>31;Aa=Aa+1|0;if((Aa|0)==(g|0)){Ua=Fa;break}else oa=Fa}}else Ua=0;ho(j,_,Q,g);oa=Tk(j)|0;Aa=I;Fa=om(j)|0;Ga=Tn(Fa|0,I|0,oa|0,Aa|0)|0;Aa=I;oa=(Ha|0)>0;if(oa){Fa=Ha+-1|0;Ea=p+(Fa<<3)|0;Oa=Ea;Ma=Tn(f[Oa>>2]|0,f[Oa+4>>2]|0,Ha|0,((Ha|0)<0)<<31>>31|0)|0;Oa=I;Na=Ea;f[Na>>2]=Ma;f[Na+4>>2]=Oa;Va=+W(+(+jm(Ma,f[o+(Fa<<3)>>2]|0)*(+(Ma>>>0)+4294967296.0*+(Oa|0))));Oa=Tn(Ga|0,Aa|0,~~Va>>>0|0,(+K(Va)>=1.0?(Va>0.0?~~+Y(+J(Va/4294967296.0),4294967295.0)>>>0:~~+W((Va-+(~~Va>>>0))/4294967296.0)>>>0):0)|0)|0;Wa=Oa}else Wa=Ga;Ga=r;f[Ga>>2]=Wa;f[Ga+4>>2]=Ua;b[U>>0]=0;f[V>>2]=0;Mf($,Ca,Ca+(g<<2)|0);f[s>>2]=ta;f[t>>2]=ua;f[k>>2]=f[s>>2];f[j>>2]=f[t>>2];tf(aa,k,j);if((Ha|0)<1){Xa=ya;Ya=xa;Za=wa;_a=va;$a=ua;ab=ta;bb=ta}else{Ga=n+Ha|0;Oa=f[q>>2]|0;Aa=Ha+-1|0;Ma=o+(Aa<<3)|0;Fa=p+(Aa<<3)|0;Aa=Oa;Na=f[H>>2]|0;Ea=Ga+-1|0;Pa=(Ea|0)==(n|0);Ia=Ga+-2|0;La=la>>>0<Ia>>>0;Ka=~Ha;cb=Ha+2+((Ka|0)>-2?Ka:-2)|0;Ka=Na;db=Ea>>>0>n>>>0;eb=0;fb=1;while(1){eb=eb+1|0;hj(n|0,1,cb|0)|0;hj(n|0,0,eb|0)|0;d:while(1){if(S){hj(f[m>>2]|0,0,ma|0)|0;gb=f[m>>2]|0;hb=0;ib=0;while(1){if(!(b[n+hb>>0]|0)){jb=f[l+(hb*12|0)>>2]|0;kb=0;do{lb=gb+(kb<<2)|0;f[lb>>2]=(f[lb>>2]|0)+(f[jb+(kb<<2)>>2]|0);kb=kb+1|0}while((kb|0)!=(g|0));mb=(1<<hb|ib&255)&255}else mb=ib;hb=hb+1|0;if((hb|0)==(Ha|0)){nb=mb;break}else ib=mb}}else{ib=0;hb=0;while(1){if(!(b[n+ib>>0]|0))ob=(1<<ib|hb&255)&255;else ob=hb;ib=ib+1|0;if((ib|0)==(Ha|0)){nb=ob;break}else hb=ob}}hb=f[m>>2]|0;do if(S){f[hb>>2]=(f[hb>>2]|0)/(fb|0)|0;if(!na){ib=1;do{gb=hb+(ib<<2)|0;f[gb>>2]=(f[gb>>2]|0)/(fb|0)|0;ib=ib+1|0}while((ib|0)!=(g|0));ib=f[Z>>2]|0;if(S)pb=ib;else{qb=0;rb=ib;break}}else pb=f[Z>>2]|0;ib=0;gb=0;while(1){kb=(f[hb+(ib<<2)>>2]|0)-(f[Ba+(ib<<2)>>2]|0)|0;jb=((kb|0)>-1?kb:0-kb|0)+gb|0;f[Oa+(ib<<2)>>2]=kb;f[pb+(ib<<2)>>2]=kb<<1^kb>>31;ib=ib+1|0;if((ib|0)==(g|0)){qb=jb;rb=pb;break}else gb=jb}}else{qb=0;rb=f[Z>>2]|0}while(0);ho(j,_,rb,g);hb=Tk(j)|0;gb=I;ib=om(j)|0;jb=Tn(ib|0,I|0,hb|0,gb|0)|0;gb=I;if(oa){hb=Ma;ib=Tn(f[hb>>2]|0,f[hb+4>>2]|0,fb|0,0)|0;hb=Fa;kb=f[hb>>2]|0;lb=f[hb+4>>2]|0;Va=+W(+(+jm(kb,ib)*(+(kb>>>0)+4294967296.0*+(lb|0))));lb=Tn(jb|0,gb|0,~~Va>>>0|0,(+K(Va)>=1.0?(Va>0.0?~~+Y(+J(Va/4294967296.0),4294967295.0)>>>0:~~+W((Va-+(~~Va>>>0))/4294967296.0)>>>0):0)|0)|0;sb=lb}else sb=jb;jb=f[r>>2]|0;if(!((sb|0)>=(jb|0)?!((sb|0)<=(jb|0)?(qb|0)<(f[T>>2]|0):0):0)){jb=r;f[jb>>2]=sb;f[jb+4>>2]=qb;b[U>>0]=nb;f[V>>2]=fb;f[v>>2]=f[m>>2];f[w>>2]=f[E>>2];f[k>>2]=f[v>>2];f[j>>2]=f[w>>2];tf($,k,j);f[x>>2]=Aa;f[y>>2]=Na;f[k>>2]=f[x>>2];f[j>>2]=f[y>>2];tf(aa,k,j)}if(Pa)break;tb=b[Ea>>0]|0;jb=-1;lb=tb;while(1){gb=jb+-1|0;ub=Ga+gb|0;kb=lb;lb=b[ub>>0]|0;if((lb&255)<(kb&255))break;if((ub|0)==(n|0)){vb=86;break d}else jb=gb}gb=Ga+jb|0;if((lb&255)<(tb&255)){wb=Ea;xb=tb}else{kb=Ga;ib=Ea;while(1){hb=ib+-1|0;if((lb&255)<(h[kb+-2>>0]|0)){wb=hb;xb=1;break}else{yb=ib;ib=hb;kb=yb}}}b[ub>>0]=xb;b[wb>>0]=lb;if((jb|0)<-1){zb=gb;Ab=Ea}else continue;while(1){kb=b[zb>>0]|0;b[zb>>0]=b[Ab>>0]|0;b[Ab>>0]=kb;kb=zb+1|0;ib=Ab+-1|0;if(kb>>>0<ib>>>0){zb=kb;Ab=ib}else continue d}}if(((vb|0)==86?(vb=0,db):0)?(gb=b[n>>0]|0,b[n>>0]=tb,b[Ea>>0]=gb,La):0){gb=Ia;jb=la;do{lb=b[jb>>0]|0;b[jb>>0]=b[gb>>0]|0;b[gb>>0]=lb;jb=jb+1|0;gb=gb+-1|0}while(jb>>>0<gb>>>0)}if((fb|0)>=(Ha|0)){Xa=Ka;Ya=Oa;Za=Ka;_a=Oa;$a=Na;ab=Aa;bb=Oa;break}else fb=fb+1|0}}if(oa){fb=f[V>>2]|0;Oa=o+(Ha+-1<<3)|0;Aa=Oa;Na=Tn(f[Aa>>2]|0,f[Aa+4>>2]|0,fb|0,((fb|0)<0)<<31>>31|0)|0;fb=Oa;f[fb>>2]=Na;f[fb+4>>2]=I}if(S){fb=f[aa>>2]|0;Na=f[C>>2]|0;Oa=0;do{Aa=f[fb+(Oa<<2)>>2]|0;f[Na+(Oa<<2)>>2]=Aa<<1^Aa>>31;Oa=Oa+1|0}while((Oa|0)!=(g|0));Bb=Na}else Bb=f[C>>2]|0;go(j,_,Bb,g);if(oa){Na=Ha+-1|0;Cb=a+60+(Na*12|0)|0;Oa=a+60+(Na*12|0)+4|0;fb=a+60+(Na*12|0)+8|0;Na=0;do{Aa=f[Oa>>2]|0;Ka=f[fb>>2]|0;Ia=(Aa|0)==(Ka<<5|0);if(!(1<<Na&h[U>>0])){if(Ia){if((Aa+1|0)<0){vb=114;break b}La=Ka<<6;Ea=Aa+32&-32;hi(Cb,Aa>>>0<1073741823?(La>>>0<Ea>>>0?Ea:La):2147483647);Db=f[Oa>>2]|0}else Db=Aa;f[Oa>>2]=Db+1;La=(f[Cb>>2]|0)+(Db>>>5<<2)|0;f[La>>2]=f[La>>2]|1<<(Db&31)}else{if(Ia){if((Aa+1|0)<0){vb=119;break b}Ia=Ka<<6;Ka=Aa+32&-32;hi(Cb,Aa>>>0<1073741823?(Ia>>>0<Ka>>>0?Ka:Ia):2147483647);Eb=f[Oa>>2]|0}else Eb=Aa;f[Oa>>2]=Eb+1;Aa=(f[Cb>>2]|0)+(Eb>>>5<<2)|0;f[Aa>>2]=f[Aa>>2]&~(1<<(Eb&31))}Na=Na+1|0}while((Na|0)<(Ha|0))}Na=d+(Da<<2)|0;Oa=f[z>>2]|0;if((Oa|0)>0){fb=0;oa=f[$>>2]|0;Aa=Oa;while(1){if((Aa|0)>0){Oa=0;do{Ia=f[oa+(Oa<<2)>>2]|0;Ka=f[ba>>2]|0;if((Ia|0)>(Ka|0)){La=f[ca>>2]|0;f[La+(Oa<<2)>>2]=Ka;Fb=La}else{La=f[da>>2]|0;Ka=f[ca>>2]|0;f[Ka+(Oa<<2)>>2]=(Ia|0)<(La|0)?La:Ia;Fb=Ka}Oa=Oa+1|0}while((Oa|0)<(f[z>>2]|0));Gb=Fb}else Gb=f[ca>>2]|0;Oa=(f[Ba+(fb<<2)>>2]|0)-(f[Gb+(fb<<2)>>2]|0)|0;Ka=Na+(fb<<2)|0;f[Ka>>2]=Oa;do if((Oa|0)<(f[ea>>2]|0)){Hb=(f[fa>>2]|0)+Oa|0;vb=109}else{if((Oa|0)<=(f[ga>>2]|0))break;Hb=Oa-(f[fa>>2]|0)|0;vb=109}while(0);if((vb|0)==109){vb=0;f[Ka>>2]=Hb}fb=fb+1|0;Aa=f[z>>2]|0;if((fb|0)>=(Aa|0))break;else oa=Gb}}oa=f[ha>>2]|0;if(oa|0){Aa=f[ka>>2]|0;if((Aa|0)!=(oa|0))f[ka>>2]=Aa+(~((Aa+-4-oa|0)>>>2)<<2);br(oa)}oa=f[ia>>2]|0;if(oa|0){Aa=f[ja>>2]|0;if((Aa|0)!=(oa|0))f[ja>>2]=Aa+(~((Aa+-4-oa|0)>>>2)<<2);br(oa)}if((pa|0)<=2){Ib=_a;Jb=Za;break a}oa=f[B>>2]|0;ra=f[oa>>2]|0;Aa=qa+-1|0;if((f[oa+4>>2]|0)-ra>>2>>>0<=Aa>>>0){za=oa;vb=18;break}else{oa=qa;qa=Aa;sa=bb;ta=ab;ua=$a;va=_a;wa=Za;xa=Ya;ya=Xa;pa=oa}}if((vb|0)==18)mq(za);else if((vb|0)==114)mq(Cb);else if((vb|0)==119)mq(Cb)}else{Ib=M;Jb=N}while(0);N=f[l>>2]|0;if((g|0)>0?(f[N>>2]=0,(g|0)!=1):0){M=1;do{f[N+(M<<2)>>2]=0;M=M+1|0}while((M|0)!=(g|0))}g=f[z>>2]|0;if((g|0)>0){M=a+16|0;Cb=a+32|0;za=a+12|0;pa=a+28|0;Xa=a+20|0;ya=a+24|0;a=0;Ya=N;N=g;while(1){if((N|0)>0){g=0;do{xa=f[Ya+(g<<2)>>2]|0;Za=f[M>>2]|0;if((xa|0)>(Za|0)){wa=f[Cb>>2]|0;f[wa+(g<<2)>>2]=Za;Kb=wa}else{wa=f[za>>2]|0;Za=f[Cb>>2]|0;f[Za+(g<<2)>>2]=(xa|0)<(wa|0)?wa:xa;Kb=Za}g=g+1|0}while((g|0)<(f[z>>2]|0));Lb=Kb}else Lb=f[Cb>>2]|0;g=(f[c+(a<<2)>>2]|0)-(f[Lb+(a<<2)>>2]|0)|0;Za=d+(a<<2)|0;f[Za>>2]=g;if((g|0)>=(f[pa>>2]|0)){if((g|0)>(f[ya>>2]|0)){Mb=g-(f[Xa>>2]|0)|0;vb=145}}else{Mb=(f[Xa>>2]|0)+g|0;vb=145}if((vb|0)==145){vb=0;f[Za>>2]=Mb}a=a+1|0;N=f[z>>2]|0;if((a|0)>=(N|0))break;else Ya=Lb}}if(Ib|0){if((Jb|0)!=(Ib|0))f[H>>2]=Jb+(~((Jb+-4-Ib|0)>>>2)<<2);br(Ib)}Ib=f[m>>2]|0;if(Ib|0){m=f[E>>2]|0;if((m|0)!=(Ib|0))f[E>>2]=m+(~((m+-4-Ib|0)>>>2)<<2);br(Ib)}Ib=f[l+36>>2]|0;if(Ib|0){m=l+40|0;E=f[m>>2]|0;if((E|0)!=(Ib|0))f[m>>2]=E+(~((E+-4-Ib|0)>>>2)<<2);br(Ib)}Ib=f[l+24>>2]|0;if(Ib|0){E=l+28|0;m=f[E>>2]|0;if((m|0)!=(Ib|0))f[E>>2]=m+(~((m+-4-Ib|0)>>>2)<<2);br(Ib)}Ib=f[l+12>>2]|0;if(Ib|0){m=l+16|0;E=f[m>>2]|0;if((E|0)!=(Ib|0))f[m>>2]=E+(~((E+-4-Ib|0)>>>2)<<2);br(Ib)}Ib=f[l>>2]|0;if(!Ib){u=i;return 1}E=l+4|0;l=f[E>>2]|0;if((l|0)!=(Ib|0))f[E>>2]=l+(~((l+-4-Ib|0)>>>2)<<2);br(Ib);u=i;return 1}function cb(a){a=a|0;var b=0,c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0;b=u;u=u+16|0;c=b;d=b+8|0;e=b+4|0;f[d>>2]=a;do if(a>>>0>=212){g=(a>>>0)/210|0;h=g*210|0;f[e>>2]=a-h;i=0;j=g;g=(zl(6640,6832,e,c)|0)-6640>>2;k=h;a:while(1){l=(f[6640+(g<<2)>>2]|0)+k|0;h=5;while(1){if(h>>>0>=47){m=211;n=i;o=8;break}p=f[6448+(h<<2)>>2]|0;q=(l>>>0)/(p>>>0)|0;if(q>>>0<p>>>0){o=106;break a}if((l|0)==(X(q,p)|0)){r=i;break}else h=h+1|0}b:do if((o|0)==8){c:while(1){o=0;h=(l>>>0)/(m>>>0)|0;do if(h>>>0>=m>>>0)if((l|0)!=(X(h,m)|0)){p=m+10|0;q=(l>>>0)/(p>>>0)|0;if(q>>>0>=p>>>0)if((l|0)!=(X(q,p)|0)){q=m+12|0;s=(l>>>0)/(q>>>0)|0;if(s>>>0>=q>>>0)if((l|0)!=(X(s,q)|0)){s=m+16|0;t=(l>>>0)/(s>>>0)|0;if(t>>>0>=s>>>0)if((l|0)!=(X(t,s)|0)){t=m+18|0;v=(l>>>0)/(t>>>0)|0;if(v>>>0>=t>>>0)if((l|0)!=(X(v,t)|0)){v=m+22|0;w=(l>>>0)/(v>>>0)|0;if(w>>>0>=v>>>0)if((l|0)!=(X(w,v)|0)){w=m+28|0;x=(l>>>0)/(w>>>0)|0;if(x>>>0>=w>>>0)if((l|0)==(X(x,w)|0)){y=w;z=9;A=n}else{x=m+30|0;B=(l>>>0)/(x>>>0)|0;if(B>>>0<x>>>0){y=x;z=1;A=l;break}if((l|0)==(X(B,x)|0)){y=x;z=9;A=n;break}x=m+36|0;B=(l>>>0)/(x>>>0)|0;if(B>>>0<x>>>0){y=x;z=1;A=l;break}if((l|0)==(X(B,x)|0)){y=x;z=9;A=n;break}x=m+40|0;B=(l>>>0)/(x>>>0)|0;if(B>>>0<x>>>0){y=x;z=1;A=l;break}if((l|0)==(X(B,x)|0)){y=x;z=9;A=n;break}x=m+42|0;B=(l>>>0)/(x>>>0)|0;if(B>>>0<x>>>0){y=x;z=1;A=l;break}if((l|0)==(X(B,x)|0)){y=x;z=9;A=n;break}x=m+46|0;B=(l>>>0)/(x>>>0)|0;if(B>>>0<x>>>0){y=x;z=1;A=l;break}if((l|0)==(X(B,x)|0)){y=x;z=9;A=n;break}x=m+52|0;B=(l>>>0)/(x>>>0)|0;if(B>>>0<x>>>0){y=x;z=1;A=l;break}if((l|0)==(X(B,x)|0)){y=x;z=9;A=n;break}x=m+58|0;B=(l>>>0)/(x>>>0)|0;if(B>>>0<x>>>0){y=x;z=1;A=l;break}if((l|0)==(X(B,x)|0)){y=x;z=9;A=n;break}x=m+60|0;B=(l>>>0)/(x>>>0)|0;if(B>>>0<x>>>0){y=x;z=1;A=l;break}if((l|0)==(X(B,x)|0)){y=x;z=9;A=n;break}x=m+66|0;B=(l>>>0)/(x>>>0)|0;if(B>>>0<x>>>0){y=x;z=1;A=l;break}if((l|0)==(X(B,x)|0)){y=x;z=9;A=n;break}x=m+70|0;B=(l>>>0)/(x>>>0)|0;if(B>>>0<x>>>0){y=x;z=1;A=l;break}if((l|0)==(X(B,x)|0)){y=x;z=9;A=n;break}x=m+72|0;B=(l>>>0)/(x>>>0)|0;if(B>>>0<x>>>0){y=x;z=1;A=l;break}if((l|0)==(X(B,x)|0)){y=x;z=9;A=n;break}x=m+78|0;B=(l>>>0)/(x>>>0)|0;if(B>>>0<x>>>0){y=x;z=1;A=l;break}if((l|0)==(X(B,x)|0)){y=x;z=9;A=n;break}x=m+82|0;B=(l>>>0)/(x>>>0)|0;if(B>>>0<x>>>0){y=x;z=1;A=l;break}if((l|0)==(X(B,x)|0)){y=x;z=9;A=n;break}x=m+88|0;B=(l>>>0)/(x>>>0)|0;if(B>>>0<x>>>0){y=x;z=1;A=l;break}if((l|0)==(X(B,x)|0)){y=x;z=9;A=n;break}x=m+96|0;B=(l>>>0)/(x>>>0)|0;if(B>>>0<x>>>0){y=x;z=1;A=l;break}if((l|0)==(X(B,x)|0)){y=x;z=9;A=n;break}x=m+100|0;B=(l>>>0)/(x>>>0)|0;if(B>>>0<x>>>0){y=x;z=1;A=l;break}if((l|0)==(X(B,x)|0)){y=x;z=9;A=n;break}x=m+102|0;B=(l>>>0)/(x>>>0)|0;if(B>>>0<x>>>0){y=x;z=1;A=l;break}if((l|0)==(X(B,x)|0)){y=x;z=9;A=n;break}x=m+106|0;B=(l>>>0)/(x>>>0)|0;if(B>>>0<x>>>0){y=x;z=1;A=l;break}if((l|0)==(X(B,x)|0)){y=x;z=9;A=n;break}x=m+108|0;B=(l>>>0)/(x>>>0)|0;if(B>>>0<x>>>0){y=x;z=1;A=l;break}if((l|0)==(X(B,x)|0)){y=x;z=9;A=n;break}x=m+112|0;B=(l>>>0)/(x>>>0)|0;if(B>>>0<x>>>0){y=x;z=1;A=l;break}if((l|0)==(X(B,x)|0)){y=x;z=9;A=n;break}x=m+120|0;B=(l>>>0)/(x>>>0)|0;if(B>>>0<x>>>0){y=x;z=1;A=l;break}if((l|0)==(X(B,x)|0)){y=x;z=9;A=n;break}x=m+126|0;B=(l>>>0)/(x>>>0)|0;if(B>>>0<x>>>0){y=x;z=1;A=l;break}if((l|0)==(X(B,x)|0)){y=x;z=9;A=n;break}x=m+130|0;B=(l>>>0)/(x>>>0)|0;if(B>>>0<x>>>0){y=x;z=1;A=l;break}if((l|0)==(X(B,x)|0)){y=x;z=9;A=n;break}x=m+136|0;B=(l>>>0)/(x>>>0)|0;if(B>>>0<x>>>0){y=x;z=1;A=l;break}if((l|0)==(X(B,x)|0)){y=x;z=9;A=n;break}x=m+138|0;B=(l>>>0)/(x>>>0)|0;if(B>>>0<x>>>0){y=x;z=1;A=l;break}if((l|0)==(X(B,x)|0)){y=x;z=9;A=n;break}x=m+142|0;B=(l>>>0)/(x>>>0)|0;if(B>>>0<x>>>0){y=x;z=1;A=l;break}if((l|0)==(X(B,x)|0)){y=x;z=9;A=n;break}x=m+148|0;B=(l>>>0)/(x>>>0)|0;if(B>>>0<x>>>0){y=x;z=1;A=l;break}if((l|0)==(X(B,x)|0)){y=x;z=9;A=n;break}x=m+150|0;B=(l>>>0)/(x>>>0)|0;if(B>>>0<x>>>0){y=x;z=1;A=l;break}if((l|0)==(X(B,x)|0)){y=x;z=9;A=n;break}x=m+156|0;B=(l>>>0)/(x>>>0)|0;if(B>>>0<x>>>0){y=x;z=1;A=l;break}if((l|0)==(X(B,x)|0)){y=x;z=9;A=n;break}x=m+162|0;B=(l>>>0)/(x>>>0)|0;if(B>>>0<x>>>0){y=x;z=1;A=l;break}if((l|0)==(X(B,x)|0)){y=x;z=9;A=n;break}x=m+166|0;B=(l>>>0)/(x>>>0)|0;if(B>>>0<x>>>0){y=x;z=1;A=l;break}if((l|0)==(X(B,x)|0)){y=x;z=9;A=n;break}x=m+168|0;B=(l>>>0)/(x>>>0)|0;if(B>>>0<x>>>0){y=x;z=1;A=l;break}if((l|0)==(X(B,x)|0)){y=x;z=9;A=n;break}x=m+172|0;B=(l>>>0)/(x>>>0)|0;if(B>>>0<x>>>0){y=x;z=1;A=l;break}if((l|0)==(X(B,x)|0)){y=x;z=9;A=n;break}x=m+178|0;B=(l>>>0)/(x>>>0)|0;if(B>>>0<x>>>0){y=x;z=1;A=l;break}if((l|0)==(X(B,x)|0)){y=x;z=9;A=n;break}x=m+180|0;B=(l>>>0)/(x>>>0)|0;if(B>>>0<x>>>0){y=x;z=1;A=l;break}if((l|0)==(X(B,x)|0)){y=x;z=9;A=n;break}x=m+186|0;B=(l>>>0)/(x>>>0)|0;if(B>>>0<x>>>0){y=x;z=1;A=l;break}if((l|0)==(X(B,x)|0)){y=x;z=9;A=n;break}x=m+190|0;B=(l>>>0)/(x>>>0)|0;if(B>>>0<x>>>0){y=x;z=1;A=l;break}if((l|0)==(X(B,x)|0)){y=x;z=9;A=n;break}x=m+192|0;B=(l>>>0)/(x>>>0)|0;if(B>>>0<x>>>0){y=x;z=1;A=l;break}if((l|0)==(X(B,x)|0)){y=x;z=9;A=n;break}x=m+196|0;B=(l>>>0)/(x>>>0)|0;if(B>>>0<x>>>0){y=x;z=1;A=l;break}if((l|0)==(X(B,x)|0)){y=x;z=9;A=n;break}x=m+198|0;B=(l>>>0)/(x>>>0)|0;if(B>>>0<x>>>0){y=x;z=1;A=l;break}if((l|0)==(X(B,x)|0)){y=x;z=9;A=n;break}x=m+208|0;B=(l>>>0)/(x>>>0)|0;C=B>>>0<x>>>0;D=(l|0)==(X(B,x)|0);y=C|D?x:m+210|0;z=C?1:D?9:0;A=C?l:n}else{y=w;z=1;A=l}}else{y=v;z=9;A=n}else{y=v;z=1;A=l}}else{y=t;z=9;A=n}else{y=t;z=1;A=l}}else{y=s;z=9;A=n}else{y=s;z=1;A=l}}else{y=q;z=9;A=n}else{y=q;z=1;A=l}}else{y=p;z=9;A=n}else{y=p;z=1;A=l}}else{y=m;z=9;A=n}else{y=m;z=1;A=l}while(0);switch(z&15){case 9:{r=A;break b;break}case 0:{m=y;n=A;o=8;break}default:break c}}if(!z)r=A;else{o=107;break a}}while(0);h=g+1|0;p=(h|0)==48;q=j+(p&1)|0;i=r;j=q;g=p?0:h;k=q*210|0}if((o|0)==106){f[d>>2]=l;E=l;break}else if((o|0)==107){f[d>>2]=l;E=A;break}}else{k=zl(6448,6640,d,c)|0;E=f[k>>2]|0}while(0);u=b;return E|0}function db(a,c,d,e,g,i){a=a|0;c=c|0;d=d|0;e=e|0;g=g|0;i=i|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ja=0,Ka=0,La=0,Ma=0,Na=0,Oa=0,Pa=0,Qa=0,Ra=0,Sa=0,Ta=0.0,Ua=0,Va=0,Wa=0,Xa=0,Ya=0,Za=0,_a=0,$a=0,ab=0,bb=0,cb=0,db=0,eb=0,fb=0,gb=0,hb=0,ib=0,jb=0,kb=0,lb=0,mb=0,nb=0,ob=0,pb=0,qb=0,rb=0,sb=0,tb=0,ub=0,vb=0,wb=0,xb=0,yb=0,zb=0,Ab=0,Bb=0,Cb=0;i=u;u=u+256|0;e=i+104|0;j=i+240|0;k=i+224|0;l=i+160|0;m=i+140|0;n=i+248|0;o=i+72|0;p=i+40|0;q=i+128|0;r=i;s=i+232|0;t=i+220|0;v=i+216|0;w=i+212|0;x=i+208|0;y=i+152|0;z=f[a+28>>2]|0;A=f[a+32>>2]|0;B=l;C=B+48|0;do{f[B>>2]=0;B=B+4|0}while((B|0)<(C|0));if(!g){D=0;E=0}else{oi(l,g);D=f[l+12>>2]|0;E=f[l+16>>2]|0}B=l+16|0;C=E-D>>2;F=D;D=E;if(C>>>0>=g>>>0){if(C>>>0>g>>>0?(E=F+(g<<2)|0,(E|0)!=(D|0)):0)f[B>>2]=D+(~((D+-4-E|0)>>>2)<<2)}else oi(l+12|0,g-C|0);C=l+24|0;E=l+28|0;D=f[E>>2]|0;B=f[C>>2]|0;F=D-B>>2;G=B;B=D;if(F>>>0>=g>>>0){if(F>>>0>g>>>0?(D=G+(g<<2)|0,(D|0)!=(B|0)):0)f[E>>2]=B+(~((B+-4-D|0)>>>2)<<2)}else oi(C,g-F|0);F=l+36|0;C=l+40|0;D=f[C>>2]|0;B=f[F>>2]|0;E=D-B>>2;G=B;B=D;if(E>>>0>=g>>>0){if(E>>>0>g>>>0?(D=G+(g<<2)|0,(D|0)!=(B|0)):0)f[C>>2]=B+(~((B+-4-D|0)>>>2)<<2)}else oi(F,g-E|0);f[m>>2]=0;E=m+4|0;f[E>>2]=0;f[m+8>>2]=0;F=(g|0)==0;do if(!F)if(g>>>0>1073741823)mq(m);else{D=g<<2;B=dn(D)|0;f[m>>2]=B;C=B+(g<<2)|0;f[m+8>>2]=C;hj(B|0,0,D|0)|0;f[E>>2]=C;break}while(0);C=a+136|0;D=a+140|0;B=f[D>>2]|0;G=f[C>>2]|0;H=B-G>>2;L=G;G=B;if(H>>>0>=g>>>0){if(H>>>0>g>>>0?(B=L+(g<<2)|0,(B|0)!=(G|0)):0)f[D>>2]=G+(~((G+-4-B|0)>>>2)<<2)}else oi(C,g-H|0);f[o>>2]=0;f[o+4>>2]=0;f[o+8>>2]=0;f[o+12>>2]=0;f[o+16>>2]=0;f[o+20>>2]=0;f[o+24>>2]=0;f[o+28>>2]=0;f[p>>2]=0;f[p+4>>2]=0;f[p+8>>2]=0;f[p+12>>2]=0;f[p+16>>2]=0;f[p+20>>2]=0;f[p+24>>2]=0;f[p+28>>2]=0;f[q>>2]=0;H=q+4|0;f[H>>2]=0;f[q+8>>2]=0;if(F){M=0;N=0;O=0;P=0}else{F=g<<2;B=dn(F)|0;f[q>>2]=B;G=B+(g<<2)|0;f[q+8>>2]=G;hj(B|0,0,F|0)|0;f[H>>2]=G;M=B;N=G;O=G;P=B}B=a+36|0;G=f[B>>2]|0;F=f[G+4>>2]|0;D=f[G>>2]|0;L=F-D|0;a:do if((L|0)>4){Q=L>>>2;R=z+64|0;S=z+28|0;T=(g|0)>0;U=r+4|0;V=r+8|0;Z=r+12|0;_=a+136|0;$=a+96|0;aa=r+16|0;ba=r+28|0;ca=a+8|0;da=j+4|0;ea=k+4|0;fa=e+4|0;ga=r+28|0;ha=r+16|0;ia=r+20|0;ja=r+32|0;ka=n+1|0;la=g<<2;ma=(g|0)==1;na=Q+-1|0;if(F-D>>2>>>0>na>>>0){oa=Q;pa=na;qa=D;ra=M;sa=P;ta=O;ua=M;va=N;wa=M;xa=N}else{ya=G;mq(ya)}b:while(1){na=f[qa+(pa<<2)>>2]|0;Q=(((na>>>0)%3|0|0)==0?2:-1)+na|0;za=Q>>>5;Aa=1<<(Q&31);Ba=(na|0)==-1|(Q|0)==-1;Ca=1;Da=0;Ea=na;c:while(1){Fa=Ca^1;Ga=Da;Ha=Ea;while(1){if((Ha|0)==-1){Ia=Ga;break c}Ja=f[l+(Ga*12|0)>>2]|0;if(((f[(f[z>>2]|0)+(Ha>>>5<<2)>>2]&1<<(Ha&31)|0)==0?(Ka=f[(f[(f[R>>2]|0)+12>>2]|0)+(Ha<<2)>>2]|0,(Ka|0)!=-1):0)?(La=f[S>>2]|0,Ma=f[A>>2]|0,Na=f[Ma+(f[La+(Ka<<2)>>2]<<2)>>2]|0,Oa=Ka+1|0,Pa=f[Ma+(f[La+((((Oa>>>0)%3|0|0)==0?Ka+-2|0:Oa)<<2)>>2]<<2)>>2]|0,Oa=f[Ma+(f[La+((((Ka>>>0)%3|0|0)==0?2:-1)+Ka<<2)>>2]<<2)>>2]|0,(Na|0)<(pa|0)&(Pa|0)<(pa|0)&(Oa|0)<(pa|0)):0){Ka=X(Na,g)|0;Na=X(Pa,g)|0;Pa=X(Oa,g)|0;if(T){Oa=0;do{f[Ja+(Oa<<2)>>2]=(f[c+(Oa+Pa<<2)>>2]|0)+(f[c+(Oa+Na<<2)>>2]|0)-(f[c+(Oa+Ka<<2)>>2]|0);Oa=Oa+1|0}while((Oa|0)!=(g|0))}Oa=Ga+1|0;if((Oa|0)==4){Ia=4;break c}else Qa=Oa}else Qa=Ga;do if(Ca){Oa=Ha+1|0;Ka=((Oa>>>0)%3|0|0)==0?Ha+-2|0:Oa;if(((Ka|0)!=-1?(f[(f[z>>2]|0)+(Ka>>>5<<2)>>2]&1<<(Ka&31)|0)==0:0)?(Oa=f[(f[(f[R>>2]|0)+12>>2]|0)+(Ka<<2)>>2]|0,Ka=Oa+1|0,(Oa|0)!=-1):0)Ra=((Ka>>>0)%3|0|0)==0?Oa+-2|0:Ka;else Ra=-1}else{Ka=(((Ha>>>0)%3|0|0)==0?2:-1)+Ha|0;if(((Ka|0)!=-1?(f[(f[z>>2]|0)+(Ka>>>5<<2)>>2]&1<<(Ka&31)|0)==0:0)?(Oa=f[(f[(f[R>>2]|0)+12>>2]|0)+(Ka<<2)>>2]|0,(Oa|0)!=-1):0)if(!((Oa>>>0)%3|0)){Ra=Oa+2|0;break}else{Ra=Oa+-1|0;break}else Ra=-1}while(0);if((Ra|0)==(na|0)){Ia=Qa;break c}if((Ra|0)!=-1|Fa){Ga=Qa;Ha=Ra}else break}if(Ba){Ca=0;Da=Qa;Ea=-1;continue}if(f[(f[z>>2]|0)+(za<<2)>>2]&Aa|0){Ca=0;Da=Qa;Ea=-1;continue}Ha=f[(f[(f[R>>2]|0)+12>>2]|0)+(Q<<2)>>2]|0;if((Ha|0)==-1){Ca=0;Da=Qa;Ea=-1;continue}if(!((Ha>>>0)%3|0)){Ca=0;Da=Qa;Ea=Ha+2|0;continue}else{Ca=0;Da=Qa;Ea=Ha+-1|0;continue}}Ea=X(pa,g)|0;f[r>>2]=0;f[U>>2]=0;b[V>>0]=0;f[Z>>2]=0;f[Z+4>>2]=0;f[Z+8>>2]=0;f[Z+12>>2]=0;f[Z+16>>2]=0;f[Z+20>>2]=0;f[Z+24>>2]=0;Da=c+((X(oa+-2|0,g)|0)<<2)|0;Ca=c+(Ea<<2)|0;Q=f[_>>2]|0;if(T){Aa=0;za=0;while(1){Ba=(f[Da+(Aa<<2)>>2]|0)-(f[Ca+(Aa<<2)>>2]|0)|0;na=((Ba|0)>-1?Ba:0-Ba|0)+za|0;f[ra+(Aa<<2)>>2]=Ba;f[Q+(Aa<<2)>>2]=Ba<<1^Ba>>31;Aa=Aa+1|0;if((Aa|0)==(g|0)){Sa=na;break}else za=na}}else Sa=0;ho(e,$,Q,g);za=Tk(e)|0;Aa=I;na=om(e)|0;Ba=Tn(na|0,I|0,za|0,Aa|0)|0;Aa=I;za=(Ia|0)>0;if(za){na=Ia+-1|0;Ha=p+(na<<3)|0;Ga=Ha;Fa=Tn(f[Ga>>2]|0,f[Ga+4>>2]|0,Ia|0,((Ia|0)<0)<<31>>31|0)|0;Ga=I;Oa=Ha;f[Oa>>2]=Fa;f[Oa+4>>2]=Ga;Ta=+W(+(+jm(Fa,f[o+(na<<3)>>2]|0)*(+(Fa>>>0)+4294967296.0*+(Ga|0))));Ga=Tn(Ba|0,Aa|0,~~Ta>>>0|0,(+K(Ta)>=1.0?(Ta>0.0?~~+Y(+J(Ta/4294967296.0),4294967295.0)>>>0:~~+W((Ta-+(~~Ta>>>0))/4294967296.0)>>>0):0)|0)|0;Ua=Ga}else Ua=Ba;Ba=r;f[Ba>>2]=Ua;f[Ba+4>>2]=Sa;b[V>>0]=0;f[Z>>2]=0;Mf(aa,Da,Da+(g<<2)|0);f[s>>2]=sa;f[t>>2]=ta;f[j>>2]=f[s>>2];f[e>>2]=f[t>>2];tf(ba,j,e);if((Ia|0)<1){Va=xa;Wa=wa;Xa=va;Ya=ua;Za=ta;_a=sa;$a=sa}else{Ba=n+Ia|0;Ga=f[q>>2]|0;Aa=Ia+-1|0;Fa=o+(Aa<<3)|0;na=p+(Aa<<3)|0;Aa=Ga;Oa=f[H>>2]|0;Ha=Ba+-1|0;Ka=(Ha|0)==(n|0);Na=Ba+-2|0;Pa=ka>>>0<Na>>>0;Ja=~Ia;La=Ia+2+((Ja|0)>-2?Ja:-2)|0;Ja=Oa;Ma=Ha>>>0>n>>>0;ab=0;bb=1;while(1){ab=ab+1|0;hj(n|0,1,La|0)|0;hj(n|0,0,ab|0)|0;d:while(1){if(T){hj(f[m>>2]|0,0,la|0)|0;cb=f[m>>2]|0;db=0;eb=0;while(1){if(!(b[n+db>>0]|0)){fb=f[l+(db*12|0)>>2]|0;gb=0;do{hb=cb+(gb<<2)|0;f[hb>>2]=(f[hb>>2]|0)+(f[fb+(gb<<2)>>2]|0);gb=gb+1|0}while((gb|0)!=(g|0));ib=(1<<db|eb&255)&255}else ib=eb;db=db+1|0;if((db|0)==(Ia|0)){jb=ib;break}else eb=ib}}else{eb=0;db=0;while(1){if(!(b[n+eb>>0]|0))kb=(1<<eb|db&255)&255;else kb=db;eb=eb+1|0;if((eb|0)==(Ia|0)){jb=kb;break}else db=kb}}db=f[m>>2]|0;do if(T){f[db>>2]=(f[db>>2]|0)/(bb|0)|0;if(!ma){eb=1;do{cb=db+(eb<<2)|0;f[cb>>2]=(f[cb>>2]|0)/(bb|0)|0;eb=eb+1|0}while((eb|0)!=(g|0));eb=f[_>>2]|0;if(T)lb=eb;else{mb=0;nb=eb;break}}else lb=f[_>>2]|0;eb=0;cb=0;while(1){gb=(f[db+(eb<<2)>>2]|0)-(f[Ca+(eb<<2)>>2]|0)|0;fb=((gb|0)>-1?gb:0-gb|0)+cb|0;f[Ga+(eb<<2)>>2]=gb;f[lb+(eb<<2)>>2]=gb<<1^gb>>31;eb=eb+1|0;if((eb|0)==(g|0)){mb=fb;nb=lb;break}else cb=fb}}else{mb=0;nb=f[_>>2]|0}while(0);ho(e,$,nb,g);db=Tk(e)|0;cb=I;eb=om(e)|0;fb=Tn(eb|0,I|0,db|0,cb|0)|0;cb=I;if(za){db=Fa;eb=Tn(f[db>>2]|0,f[db+4>>2]|0,bb|0,0)|0;db=na;gb=f[db>>2]|0;hb=f[db+4>>2]|0;Ta=+W(+(+jm(gb,eb)*(+(gb>>>0)+4294967296.0*+(hb|0))));hb=Tn(fb|0,cb|0,~~Ta>>>0|0,(+K(Ta)>=1.0?(Ta>0.0?~~+Y(+J(Ta/4294967296.0),4294967295.0)>>>0:~~+W((Ta-+(~~Ta>>>0))/4294967296.0)>>>0):0)|0)|0;ob=hb}else ob=fb;fb=f[r>>2]|0;if(!((ob|0)>=(fb|0)?!((ob|0)<=(fb|0)?(mb|0)<(f[U>>2]|0):0):0)){fb=r;f[fb>>2]=ob;f[fb+4>>2]=mb;b[V>>0]=jb;f[Z>>2]=bb;f[v>>2]=f[m>>2];f[w>>2]=f[E>>2];f[j>>2]=f[v>>2];f[e>>2]=f[w>>2];tf(aa,j,e);f[x>>2]=Aa;f[y>>2]=Oa;f[j>>2]=f[x>>2];f[e>>2]=f[y>>2];tf(ba,j,e)}if(Ka)break;pb=b[Ha>>0]|0;fb=-1;hb=pb;while(1){cb=fb+-1|0;qb=Ba+cb|0;gb=hb;hb=b[qb>>0]|0;if((hb&255)<(gb&255))break;if((qb|0)==(n|0)){rb=86;break d}else fb=cb}cb=Ba+fb|0;if((hb&255)<(pb&255)){sb=Ha;tb=pb}else{gb=Ba;eb=Ha;while(1){db=eb+-1|0;if((hb&255)<(h[gb+-2>>0]|0)){sb=db;tb=1;break}else{ub=eb;eb=db;gb=ub}}}b[qb>>0]=tb;b[sb>>0]=hb;if((fb|0)<-1){vb=cb;wb=Ha}else continue;while(1){gb=b[vb>>0]|0;b[vb>>0]=b[wb>>0]|0;b[wb>>0]=gb;gb=vb+1|0;eb=wb+-1|0;if(gb>>>0<eb>>>0){vb=gb;wb=eb}else continue d}}if(((rb|0)==86?(rb=0,Ma):0)?(cb=b[n>>0]|0,b[n>>0]=pb,b[Ha>>0]=cb,Pa):0){cb=Na;fb=ka;do{hb=b[fb>>0]|0;b[fb>>0]=b[cb>>0]|0;b[cb>>0]=hb;fb=fb+1|0;cb=cb+-1|0}while(fb>>>0<cb>>>0)}if((bb|0)>=(Ia|0)){Va=Ja;Wa=Ga;Xa=Ja;Ya=Ga;Za=Oa;_a=Aa;$a=Ga;break}else bb=bb+1|0}}if(za){bb=f[Z>>2]|0;Ga=o+(Ia+-1<<3)|0;Aa=Ga;Oa=Tn(f[Aa>>2]|0,f[Aa+4>>2]|0,bb|0,((bb|0)<0)<<31>>31|0)|0;bb=Ga;f[bb>>2]=Oa;f[bb+4>>2]=I}if(T){bb=f[ba>>2]|0;Oa=f[C>>2]|0;Ga=0;do{Aa=f[bb+(Ga<<2)>>2]|0;f[Oa+(Ga<<2)>>2]=Aa<<1^Aa>>31;Ga=Ga+1|0}while((Ga|0)!=(g|0));xb=Oa}else xb=f[C>>2]|0;go(e,$,xb,g);if(za){Oa=Ia+-1|0;yb=a+40+(Oa*12|0)|0;Ga=a+40+(Oa*12|0)+4|0;bb=a+40+(Oa*12|0)+8|0;Oa=0;do{Aa=f[Ga>>2]|0;Ja=f[bb>>2]|0;Na=(Aa|0)==(Ja<<5|0);if(!(1<<Oa&h[V>>0])){if(Na){if((Aa+1|0)<0){rb=101;break b}Pa=Ja<<6;Ha=Aa+32&-32;hi(yb,Aa>>>0<1073741823?(Pa>>>0<Ha>>>0?Ha:Pa):2147483647);zb=f[Ga>>2]|0}else zb=Aa;f[Ga>>2]=zb+1;Pa=(f[yb>>2]|0)+(zb>>>5<<2)|0;f[Pa>>2]=f[Pa>>2]|1<<(zb&31)}else{if(Na){if((Aa+1|0)<0){rb=106;break b}Na=Ja<<6;Ja=Aa+32&-32;hi(yb,Aa>>>0<1073741823?(Na>>>0<Ja>>>0?Ja:Na):2147483647);Ab=f[Ga>>2]|0}else Ab=Aa;f[Ga>>2]=Ab+1;Aa=(f[yb>>2]|0)+(Ab>>>5<<2)|0;f[Aa>>2]=f[Aa>>2]&~(1<<(Ab&31))}Oa=Oa+1|0}while((Oa|0)<(Ia|0))}Oa=f[aa>>2]|0;Ga=d+(Ea<<2)|0;bb=f[Ca+4>>2]|0;za=f[Oa>>2]|0;Aa=f[Oa+4>>2]|0;f[j>>2]=f[Ca>>2];f[da>>2]=bb;f[k>>2]=za;f[ea>>2]=Aa;Dd(e,ca,j,k);f[Ga>>2]=f[e>>2];f[Ga+4>>2]=f[fa>>2];Ga=f[ga>>2]|0;if(Ga|0){Aa=f[ja>>2]|0;if((Aa|0)!=(Ga|0))f[ja>>2]=Aa+(~((Aa+-4-Ga|0)>>>2)<<2);br(Ga)}Ga=f[ha>>2]|0;if(Ga|0){Aa=f[ia>>2]|0;if((Aa|0)!=(Ga|0))f[ia>>2]=Aa+(~((Aa+-4-Ga|0)>>>2)<<2);br(Ga)}if((oa|0)<=2){Bb=Ya;Cb=Xa;break a}Ga=f[B>>2]|0;qa=f[Ga>>2]|0;Aa=pa+-1|0;if((f[Ga+4>>2]|0)-qa>>2>>>0<=Aa>>>0){ya=Ga;rb=18;break}else{Ga=pa;pa=Aa;ra=$a;sa=_a;ta=Za;ua=Ya;va=Xa;wa=Wa;xa=Va;oa=Ga}}if((rb|0)==18)mq(ya);else if((rb|0)==101)mq(yb);else if((rb|0)==106)mq(yb)}else{Bb=M;Cb=N}while(0);if((g|0)>0)hj(f[l>>2]|0,0,g<<2|0)|0;g=f[l>>2]|0;N=f[c+4>>2]|0;M=f[g>>2]|0;yb=f[g+4>>2]|0;f[j>>2]=f[c>>2];f[j+4>>2]=N;f[k>>2]=M;f[k+4>>2]=yb;Dd(e,a+8|0,j,k);f[d>>2]=f[e>>2];f[d+4>>2]=f[e+4>>2];if(Bb|0){if((Cb|0)!=(Bb|0))f[H>>2]=Cb+(~((Cb+-4-Bb|0)>>>2)<<2);br(Bb)}Bb=f[m>>2]|0;if(Bb|0){m=f[E>>2]|0;if((m|0)!=(Bb|0))f[E>>2]=m+(~((m+-4-Bb|0)>>>2)<<2);br(Bb)}Bb=f[l+36>>2]|0;if(Bb|0){m=l+40|0;E=f[m>>2]|0;if((E|0)!=(Bb|0))f[m>>2]=E+(~((E+-4-Bb|0)>>>2)<<2);br(Bb)}Bb=f[l+24>>2]|0;if(Bb|0){E=l+28|0;m=f[E>>2]|0;if((m|0)!=(Bb|0))f[E>>2]=m+(~((m+-4-Bb|0)>>>2)<<2);br(Bb)}Bb=f[l+12>>2]|0;if(Bb|0){m=l+16|0;E=f[m>>2]|0;if((E|0)!=(Bb|0))f[m>>2]=E+(~((E+-4-Bb|0)>>>2)<<2);br(Bb)}Bb=f[l>>2]|0;if(!Bb){u=i;return 1}E=l+4|0;l=f[E>>2]|0;if((l|0)!=(Bb|0))f[E>>2]=l+(~((l+-4-Bb|0)>>>2)<<2);br(Bb);u=i;return 1}function eb(a,c,d,e,g,i){a=a|0;c=c|0;d=d|0;e=e|0;g=g|0;i=i|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ja=0,Ka=0,La=0,Ma=0,Na=0,Oa=0,Pa=0,Qa=0,Ra=0,Sa=0,Ta=0.0,Ua=0,Va=0,Wa=0,Xa=0,Ya=0,Za=0,_a=0,$a=0,ab=0,bb=0,cb=0,db=0,eb=0,fb=0,gb=0,hb=0,ib=0,jb=0,kb=0,lb=0,mb=0,nb=0,ob=0,pb=0,qb=0,rb=0,sb=0,tb=0,ub=0,vb=0,wb=0,xb=0,yb=0,zb=0,Ab=0,Bb=0,Cb=0,Db=0,Eb=0;i=u;u=u+256|0;e=i+104|0;j=i+240|0;k=i+224|0;l=i+160|0;m=i+140|0;n=i+248|0;o=i+72|0;p=i+40|0;q=i+128|0;r=i;s=i+232|0;t=i+220|0;v=i+216|0;w=i+212|0;x=i+208|0;y=i+152|0;z=f[a+28>>2]|0;A=f[a+32>>2]|0;B=l;C=B+48|0;do{f[B>>2]=0;B=B+4|0}while((B|0)<(C|0));if(!g){D=0;E=0}else{oi(l,g);D=f[l+12>>2]|0;E=f[l+16>>2]|0}B=l+16|0;C=E-D>>2;F=D;D=E;if(C>>>0>=g>>>0){if(C>>>0>g>>>0?(E=F+(g<<2)|0,(E|0)!=(D|0)):0)f[B>>2]=D+(~((D+-4-E|0)>>>2)<<2)}else oi(l+12|0,g-C|0);C=l+24|0;E=l+28|0;D=f[E>>2]|0;B=f[C>>2]|0;F=D-B>>2;G=B;B=D;if(F>>>0>=g>>>0){if(F>>>0>g>>>0?(D=G+(g<<2)|0,(D|0)!=(B|0)):0)f[E>>2]=B+(~((B+-4-D|0)>>>2)<<2)}else oi(C,g-F|0);F=l+36|0;C=l+40|0;D=f[C>>2]|0;B=f[F>>2]|0;E=D-B>>2;G=B;B=D;if(E>>>0>=g>>>0){if(E>>>0>g>>>0?(D=G+(g<<2)|0,(D|0)!=(B|0)):0)f[C>>2]=B+(~((B+-4-D|0)>>>2)<<2)}else oi(F,g-E|0);f[m>>2]=0;E=m+4|0;f[E>>2]=0;f[m+8>>2]=0;F=(g|0)==0;do if(!F)if(g>>>0>1073741823)mq(m);else{D=g<<2;B=dn(D)|0;f[m>>2]=B;C=B+(g<<2)|0;f[m+8>>2]=C;hj(B|0,0,D|0)|0;f[E>>2]=C;break}while(0);C=a+136|0;D=a+140|0;B=f[D>>2]|0;G=f[C>>2]|0;H=B-G>>2;L=G;G=B;if(H>>>0>=g>>>0){if(H>>>0>g>>>0?(B=L+(g<<2)|0,(B|0)!=(G|0)):0)f[D>>2]=G+(~((G+-4-B|0)>>>2)<<2)}else oi(C,g-H|0);f[o>>2]=0;f[o+4>>2]=0;f[o+8>>2]=0;f[o+12>>2]=0;f[o+16>>2]=0;f[o+20>>2]=0;f[o+24>>2]=0;f[o+28>>2]=0;f[p>>2]=0;f[p+4>>2]=0;f[p+8>>2]=0;f[p+12>>2]=0;f[p+16>>2]=0;f[p+20>>2]=0;f[p+24>>2]=0;f[p+28>>2]=0;f[q>>2]=0;H=q+4|0;f[H>>2]=0;f[q+8>>2]=0;if(F){M=0;N=0;O=0;P=0}else{F=g<<2;B=dn(F)|0;f[q>>2]=B;G=B+(g<<2)|0;f[q+8>>2]=G;hj(B|0,0,F|0)|0;f[H>>2]=G;M=B;N=G;O=G;P=B}B=a+36|0;G=f[B>>2]|0;F=f[G+4>>2]|0;D=f[G>>2]|0;L=F-D|0;a:do if((L|0)>4){Q=L>>>2;R=z+12|0;S=(g|0)>0;T=r+4|0;U=r+8|0;V=r+12|0;Z=a+136|0;_=a+96|0;$=r+16|0;aa=r+28|0;ba=a+8|0;ca=j+4|0;da=k+4|0;ea=e+4|0;fa=r+28|0;ga=r+16|0;ha=r+20|0;ia=r+32|0;ja=n+1|0;ka=g<<2;la=(g|0)==1;ma=Q+-1|0;if(F-D>>2>>>0>ma>>>0){na=Q;oa=ma;pa=M;qa=P;ra=O;sa=M;ta=N;ua=M;va=N;wa=D}else{xa=G;mq(xa)}b:while(1){ma=f[wa+(oa<<2)>>2]|0;Q=(((ma>>>0)%3|0|0)==0?2:-1)+ma|0;ya=(ma|0)==-1|(Q|0)==-1;za=1;Aa=0;Ba=ma;c:while(1){Ca=za^1;Da=Aa;Ea=Ba;while(1){if((Ea|0)==-1){Fa=Da;break c}Ga=f[l+(Da*12|0)>>2]|0;Ha=f[R>>2]|0;Ia=f[Ha+(Ea<<2)>>2]|0;if((Ia|0)!=-1){Ja=f[z>>2]|0;Ka=f[A>>2]|0;La=f[Ka+(f[Ja+(Ia<<2)>>2]<<2)>>2]|0;Ma=Ia+1|0;Na=((Ma>>>0)%3|0|0)==0?Ia+-2|0:Ma;if((Na|0)==-1)Oa=-1;else Oa=f[Ja+(Na<<2)>>2]|0;Na=f[Ka+(Oa<<2)>>2]|0;Ma=(((Ia>>>0)%3|0|0)==0?2:-1)+Ia|0;if((Ma|0)==-1)Pa=-1;else Pa=f[Ja+(Ma<<2)>>2]|0;Ma=f[Ka+(Pa<<2)>>2]|0;if((La|0)<(oa|0)&(Na|0)<(oa|0)&(Ma|0)<(oa|0)){Ka=X(La,g)|0;La=X(Na,g)|0;Na=X(Ma,g)|0;if(S){Ma=0;do{f[Ga+(Ma<<2)>>2]=(f[c+(Ma+Na<<2)>>2]|0)+(f[c+(Ma+La<<2)>>2]|0)-(f[c+(Ma+Ka<<2)>>2]|0);Ma=Ma+1|0}while((Ma|0)!=(g|0))}Ma=Da+1|0;if((Ma|0)==4){Fa=4;break c}else Qa=Ma}else Qa=Da}else Qa=Da;do if(za){Ma=Ea+1|0;Ka=((Ma>>>0)%3|0|0)==0?Ea+-2|0:Ma;if((Ka|0)!=-1?(Ma=f[Ha+(Ka<<2)>>2]|0,Ka=Ma+1|0,(Ma|0)!=-1):0)Ra=((Ka>>>0)%3|0|0)==0?Ma+-2|0:Ka;else Ra=-1}else{Ka=(((Ea>>>0)%3|0|0)==0?2:-1)+Ea|0;if((Ka|0)!=-1?(Ma=f[Ha+(Ka<<2)>>2]|0,(Ma|0)!=-1):0)if(!((Ma>>>0)%3|0)){Ra=Ma+2|0;break}else{Ra=Ma+-1|0;break}else Ra=-1}while(0);if((Ra|0)==(ma|0)){Fa=Qa;break c}if((Ra|0)!=-1|Ca){Da=Qa;Ea=Ra}else break}if(ya){za=0;Aa=Qa;Ba=-1;continue}Ea=f[Ha+(Q<<2)>>2]|0;if((Ea|0)==-1){za=0;Aa=Qa;Ba=-1;continue}if(!((Ea>>>0)%3|0)){za=0;Aa=Qa;Ba=Ea+2|0;continue}else{za=0;Aa=Qa;Ba=Ea+-1|0;continue}}Ba=X(oa,g)|0;f[r>>2]=0;f[T>>2]=0;b[U>>0]=0;f[V>>2]=0;f[V+4>>2]=0;f[V+8>>2]=0;f[V+12>>2]=0;f[V+16>>2]=0;f[V+20>>2]=0;f[V+24>>2]=0;Aa=c+((X(na+-2|0,g)|0)<<2)|0;za=c+(Ba<<2)|0;Q=f[Z>>2]|0;if(S){ya=0;ma=0;while(1){Ea=(f[Aa+(ya<<2)>>2]|0)-(f[za+(ya<<2)>>2]|0)|0;Da=((Ea|0)>-1?Ea:0-Ea|0)+ma|0;f[pa+(ya<<2)>>2]=Ea;f[Q+(ya<<2)>>2]=Ea<<1^Ea>>31;ya=ya+1|0;if((ya|0)==(g|0)){Sa=Da;break}else ma=Da}}else Sa=0;ho(e,_,Q,g);ma=Tk(e)|0;ya=I;Da=om(e)|0;Ea=Tn(Da|0,I|0,ma|0,ya|0)|0;ya=I;ma=(Fa|0)>0;if(ma){Da=Fa+-1|0;Ca=p+(Da<<3)|0;Ma=Ca;Ka=Tn(f[Ma>>2]|0,f[Ma+4>>2]|0,Fa|0,((Fa|0)<0)<<31>>31|0)|0;Ma=I;La=Ca;f[La>>2]=Ka;f[La+4>>2]=Ma;Ta=+W(+(+jm(Ka,f[o+(Da<<3)>>2]|0)*(+(Ka>>>0)+4294967296.0*+(Ma|0))));Ma=Tn(Ea|0,ya|0,~~Ta>>>0|0,(+K(Ta)>=1.0?(Ta>0.0?~~+Y(+J(Ta/4294967296.0),4294967295.0)>>>0:~~+W((Ta-+(~~Ta>>>0))/4294967296.0)>>>0):0)|0)|0;Ua=Ma}else Ua=Ea;Ea=r;f[Ea>>2]=Ua;f[Ea+4>>2]=Sa;b[U>>0]=0;f[V>>2]=0;Mf($,Aa,Aa+(g<<2)|0);f[s>>2]=qa;f[t>>2]=ra;f[j>>2]=f[s>>2];f[e>>2]=f[t>>2];tf(aa,j,e);if((Fa|0)<1){Va=va;Wa=ua;Xa=ta;Ya=sa;Za=ra;_a=qa;$a=qa}else{Ea=n+Fa|0;Ma=f[q>>2]|0;ya=Fa+-1|0;Ka=o+(ya<<3)|0;Da=p+(ya<<3)|0;ya=Ma;La=f[H>>2]|0;Ca=Ea+-1|0;Na=(Ca|0)==(n|0);Ga=Ea+-2|0;Ja=ja>>>0<Ga>>>0;Ia=~Fa;ab=Fa+2+((Ia|0)>-2?Ia:-2)|0;Ia=La;bb=Ca>>>0>n>>>0;cb=0;db=1;while(1){cb=cb+1|0;hj(n|0,1,ab|0)|0;hj(n|0,0,cb|0)|0;d:while(1){if(S){hj(f[m>>2]|0,0,ka|0)|0;eb=f[m>>2]|0;fb=0;gb=0;while(1){if(!(b[n+fb>>0]|0)){hb=f[l+(fb*12|0)>>2]|0;ib=0;do{jb=eb+(ib<<2)|0;f[jb>>2]=(f[jb>>2]|0)+(f[hb+(ib<<2)>>2]|0);ib=ib+1|0}while((ib|0)!=(g|0));kb=(1<<fb|gb&255)&255}else kb=gb;fb=fb+1|0;if((fb|0)==(Fa|0)){lb=kb;break}else gb=kb}}else{gb=0;fb=0;while(1){if(!(b[n+gb>>0]|0))mb=(1<<gb|fb&255)&255;else mb=fb;gb=gb+1|0;if((gb|0)==(Fa|0)){lb=mb;break}else fb=mb}}fb=f[m>>2]|0;do if(S){f[fb>>2]=(f[fb>>2]|0)/(db|0)|0;if(!la){gb=1;do{eb=fb+(gb<<2)|0;f[eb>>2]=(f[eb>>2]|0)/(db|0)|0;gb=gb+1|0}while((gb|0)!=(g|0));gb=f[Z>>2]|0;if(S)nb=gb;else{ob=0;pb=gb;break}}else nb=f[Z>>2]|0;gb=0;eb=0;while(1){ib=(f[fb+(gb<<2)>>2]|0)-(f[za+(gb<<2)>>2]|0)|0;hb=((ib|0)>-1?ib:0-ib|0)+eb|0;f[Ma+(gb<<2)>>2]=ib;f[nb+(gb<<2)>>2]=ib<<1^ib>>31;gb=gb+1|0;if((gb|0)==(g|0)){ob=hb;pb=nb;break}else eb=hb}}else{ob=0;pb=f[Z>>2]|0}while(0);ho(e,_,pb,g);fb=Tk(e)|0;eb=I;gb=om(e)|0;hb=Tn(gb|0,I|0,fb|0,eb|0)|0;eb=I;if(ma){fb=Ka;gb=Tn(f[fb>>2]|0,f[fb+4>>2]|0,db|0,0)|0;fb=Da;ib=f[fb>>2]|0;jb=f[fb+4>>2]|0;Ta=+W(+(+jm(ib,gb)*(+(ib>>>0)+4294967296.0*+(jb|0))));jb=Tn(hb|0,eb|0,~~Ta>>>0|0,(+K(Ta)>=1.0?(Ta>0.0?~~+Y(+J(Ta/4294967296.0),4294967295.0)>>>0:~~+W((Ta-+(~~Ta>>>0))/4294967296.0)>>>0):0)|0)|0;qb=jb}else qb=hb;hb=f[r>>2]|0;if(!((qb|0)>=(hb|0)?!((qb|0)<=(hb|0)?(ob|0)<(f[T>>2]|0):0):0)){hb=r;f[hb>>2]=qb;f[hb+4>>2]=ob;b[U>>0]=lb;f[V>>2]=db;f[v>>2]=f[m>>2];f[w>>2]=f[E>>2];f[j>>2]=f[v>>2];f[e>>2]=f[w>>2];tf($,j,e);f[x>>2]=ya;f[y>>2]=La;f[j>>2]=f[x>>2];f[e>>2]=f[y>>2];tf(aa,j,e)}if(Na)break;rb=b[Ca>>0]|0;hb=-1;jb=rb;while(1){eb=hb+-1|0;sb=Ea+eb|0;ib=jb;jb=b[sb>>0]|0;if((jb&255)<(ib&255))break;if((sb|0)==(n|0)){tb=86;break d}else hb=eb}eb=Ea+hb|0;if((jb&255)<(rb&255)){ub=Ca;vb=rb}else{ib=Ea;gb=Ca;while(1){fb=gb+-1|0;if((jb&255)<(h[ib+-2>>0]|0)){ub=fb;vb=1;break}else{wb=gb;gb=fb;ib=wb}}}b[sb>>0]=vb;b[ub>>0]=jb;if((hb|0)<-1){xb=eb;yb=Ca}else continue;while(1){ib=b[xb>>0]|0;b[xb>>0]=b[yb>>0]|0;b[yb>>0]=ib;ib=xb+1|0;gb=yb+-1|0;if(ib>>>0<gb>>>0){xb=ib;yb=gb}else continue d}}if(((tb|0)==86?(tb=0,bb):0)?(eb=b[n>>0]|0,b[n>>0]=rb,b[Ca>>0]=eb,Ja):0){eb=Ga;hb=ja;do{jb=b[hb>>0]|0;b[hb>>0]=b[eb>>0]|0;b[eb>>0]=jb;hb=hb+1|0;eb=eb+-1|0}while(hb>>>0<eb>>>0)}if((db|0)>=(Fa|0)){Va=Ia;Wa=Ma;Xa=Ia;Ya=Ma;Za=La;_a=ya;$a=Ma;break}else db=db+1|0}}if(ma){db=f[V>>2]|0;Ma=o+(Fa+-1<<3)|0;ya=Ma;La=Tn(f[ya>>2]|0,f[ya+4>>2]|0,db|0,((db|0)<0)<<31>>31|0)|0;db=Ma;f[db>>2]=La;f[db+4>>2]=I}if(S){db=f[aa>>2]|0;La=f[C>>2]|0;Ma=0;do{ya=f[db+(Ma<<2)>>2]|0;f[La+(Ma<<2)>>2]=ya<<1^ya>>31;Ma=Ma+1|0}while((Ma|0)!=(g|0));zb=La}else zb=f[C>>2]|0;go(e,_,zb,g);if(ma){La=Fa+-1|0;Ab=a+40+(La*12|0)|0;Ma=a+40+(La*12|0)+4|0;db=a+40+(La*12|0)+8|0;La=0;do{ya=f[Ma>>2]|0;Ia=f[db>>2]|0;Ga=(ya|0)==(Ia<<5|0);if(!(1<<La&h[U>>0])){if(Ga){if((ya+1|0)<0){tb=101;break b}Ja=Ia<<6;Ca=ya+32&-32;hi(Ab,ya>>>0<1073741823?(Ja>>>0<Ca>>>0?Ca:Ja):2147483647);Bb=f[Ma>>2]|0}else Bb=ya;f[Ma>>2]=Bb+1;Ja=(f[Ab>>2]|0)+(Bb>>>5<<2)|0;f[Ja>>2]=f[Ja>>2]|1<<(Bb&31)}else{if(Ga){if((ya+1|0)<0){tb=106;break b}Ga=Ia<<6;Ia=ya+32&-32;hi(Ab,ya>>>0<1073741823?(Ga>>>0<Ia>>>0?Ia:Ga):2147483647);Cb=f[Ma>>2]|0}else Cb=ya;f[Ma>>2]=Cb+1;ya=(f[Ab>>2]|0)+(Cb>>>5<<2)|0;f[ya>>2]=f[ya>>2]&~(1<<(Cb&31))}La=La+1|0}while((La|0)<(Fa|0))}La=f[$>>2]|0;Ma=d+(Ba<<2)|0;db=f[za+4>>2]|0;ma=f[La>>2]|0;ya=f[La+4>>2]|0;f[j>>2]=f[za>>2];f[ca>>2]=db;f[k>>2]=ma;f[da>>2]=ya;Dd(e,ba,j,k);f[Ma>>2]=f[e>>2];f[Ma+4>>2]=f[ea>>2];Ma=f[fa>>2]|0;if(Ma|0){ya=f[ia>>2]|0;if((ya|0)!=(Ma|0))f[ia>>2]=ya+(~((ya+-4-Ma|0)>>>2)<<2);br(Ma)}Ma=f[ga>>2]|0;if(Ma|0){ya=f[ha>>2]|0;if((ya|0)!=(Ma|0))f[ha>>2]=ya+(~((ya+-4-Ma|0)>>>2)<<2);br(Ma)}if((na|0)<=2){Db=Ya;Eb=Xa;break a}Ma=f[B>>2]|0;wa=f[Ma>>2]|0;ya=oa+-1|0;if((f[Ma+4>>2]|0)-wa>>2>>>0<=ya>>>0){xa=Ma;tb=18;break}else{Ma=oa;oa=ya;pa=$a;qa=_a;ra=Za;sa=Ya;ta=Xa;ua=Wa;va=Va;na=Ma}}if((tb|0)==18)mq(xa);else if((tb|0)==101)mq(Ab);else if((tb|0)==106)mq(Ab)}else{Db=M;Eb=N}while(0);if((g|0)>0)hj(f[l>>2]|0,0,g<<2|0)|0;g=f[l>>2]|0;N=f[c+4>>2]|0;M=f[g>>2]|0;Ab=f[g+4>>2]|0;f[j>>2]=f[c>>2];f[j+4>>2]=N;f[k>>2]=M;f[k+4>>2]=Ab;Dd(e,a+8|0,j,k);f[d>>2]=f[e>>2];f[d+4>>2]=f[e+4>>2];if(Db|0){if((Eb|0)!=(Db|0))f[H>>2]=Eb+(~((Eb+-4-Db|0)>>>2)<<2);br(Db)}Db=f[m>>2]|0;if(Db|0){m=f[E>>2]|0;if((m|0)!=(Db|0))f[E>>2]=m+(~((m+-4-Db|0)>>>2)<<2);br(Db)}Db=f[l+36>>2]|0;if(Db|0){m=l+40|0;E=f[m>>2]|0;if((E|0)!=(Db|0))f[m>>2]=E+(~((E+-4-Db|0)>>>2)<<2);br(Db)}Db=f[l+24>>2]|0;if(Db|0){E=l+28|0;m=f[E>>2]|0;if((m|0)!=(Db|0))f[E>>2]=m+(~((m+-4-Db|0)>>>2)<<2);br(Db)}Db=f[l+12>>2]|0;if(Db|0){m=l+16|0;E=f[m>>2]|0;if((E|0)!=(Db|0))f[m>>2]=E+(~((E+-4-Db|0)>>>2)<<2);br(Db)}Db=f[l>>2]|0;if(!Db){u=i;return 1}E=l+4|0;l=f[E>>2]|0;if((l|0)!=(Db|0))f[E>>2]=l+(~((l+-4-Db|0)>>>2)<<2);br(Db);u=i;return 1}function fb(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ja=0,Ka=0,La=0,Ma=0,Na=0,Oa=0,Pa=0,Qa=0,Ra=0,Sa=0,Ta=0,Ua=0,Va=0,Wa=0,Xa=0,Ya=0,Za=0,_a=0,$a=0,ab=0,bb=0,cb=0,db=0,eb=0,fb=0,gb=0,hb=0,ib=0,jb=0,kb=0,lb=0,mb=0,nb=0,ob=0,pb=0,qb=0,rb=0,sb=0,tb=0,ub=0,vb=0,wb=0,xb=0,yb=0,zb=0,Ab=0,Bb=0,Cb=0,Db=0,Eb=0,Fb=0,Gb=0,Hb=0,Ib=0,Jb=0,Kb=0,Lb=0,Mb=0,Nb=0,Ob=0,Pb=0,Qb=0,Rb=0,Sb=0,Tb=0,Ub=0,Vb=0,Wb=0,Xb=0,Yb=0,Zb=0,_b=0;c=u;u=u+32|0;d=c+16|0;e=c+4|0;g=c;f[a+36>>2]=b;h=a+24|0;i=a+28|0;j=f[i>>2]|0;k=f[h>>2]|0;l=j-k>>2;m=k;k=j;if(l>>>0>=b>>>0){if(l>>>0>b>>>0?(j=m+(b<<2)|0,(j|0)!=(k|0)):0)f[i>>2]=k+(~((k+-4-j|0)>>>2)<<2)}else kh(h,b-l|0,5828);f[d>>2]=0;l=d+4|0;f[l>>2]=0;j=d+8|0;f[j>>2]=0;if(b){if((b|0)<0)mq(d);k=((b+-1|0)>>>5)+1|0;m=dn(k<<2)|0;f[d>>2]=m;f[j>>2]=k;f[l>>2]=b;k=b>>>5;hj(m|0,0,k<<2|0)|0;n=b&31;o=m+(k<<2)|0;k=m;if(!n){p=b;q=k;r=m}else{f[o>>2]=f[o>>2]&~(-1>>>(32-n|0));p=b;q=k;r=m}}else{p=0;q=0;r=0}m=a+4|0;k=f[a>>2]|0;n=(f[m>>2]|0)-k|0;o=n>>2;f[e>>2]=0;s=e+4|0;f[s>>2]=0;t=e+8|0;f[t>>2]=0;do if(o){if((n|0)<0)mq(e);v=((o+-1|0)>>>5)+1|0;w=dn(v<<2)|0;f[e>>2]=w;f[t>>2]=v;f[s>>2]=o;v=o>>>5;hj(w|0,0,v<<2|0)|0;x=o&31;y=w+(v<<2)|0;if(x|0)f[y>>2]=f[y>>2]&~(-1>>>(32-x|0));if(o>>>0>2){x=a+12|0;y=a+32|0;v=a+52|0;w=a+56|0;z=a+48|0;A=b;B=k;C=0;D=q;E=r;a:while(1){F=B;G=C*3|0;if((G|0)!=-1){H=f[F+(G<<2)>>2]|0;I=G+1|0;J=((I>>>0)%3|0|0)==0?G+-2|0:I;if((J|0)==-1)K=-1;else K=f[F+(J<<2)>>2]|0;J=(((G>>>0)%3|0|0)==0?2:-1)+G|0;if((J|0)==-1)L=-1;else L=f[F+(J<<2)>>2]|0;if((H|0)!=(K|0)?!((H|0)==(L|0)|(K|0)==(L|0)):0){H=0;J=A;F=E;I=D;while(1){M=H+G|0;if(!(f[(f[e>>2]|0)+(M>>>5<<2)>>2]&1<<(M&31))){N=f[(f[a>>2]|0)+(M<<2)>>2]|0;f[g>>2]=N;if(!(f[F+(N>>>5<<2)>>2]&1<<(N&31))){O=0;P=J;Q=N}else{N=f[i>>2]|0;if((N|0)==(f[y>>2]|0))Ci(h,5828);else{f[N>>2]=-1;f[i>>2]=N+4}N=f[v>>2]|0;if((N|0)==(f[w>>2]|0))Ci(z,g);else{f[N>>2]=f[g>>2];f[v>>2]=N+4}N=f[l>>2]|0;R=f[j>>2]|0;if((N|0)==(R<<5|0)){if((N+1|0)<0){S=50;break a}T=R<<6;R=N+32&-32;hi(d,N>>>0<1073741823?(T>>>0<R>>>0?R:T):2147483647);U=f[l>>2]|0}else U=N;f[l>>2]=U+1;N=(f[d>>2]|0)+(U>>>5<<2)|0;f[N>>2]=f[N>>2]&~(1<<(U&31));f[g>>2]=J;O=1;P=J+1|0;Q=J}N=f[d>>2]|0;T=N+(Q>>>5<<2)|0;f[T>>2]=f[T>>2]|1<<(Q&31);T=N;b:do if(O){R=M;while(1){if((R|0)==-1){S=64;break b}V=(f[e>>2]|0)+(R>>>5<<2)|0;f[V>>2]=f[V>>2]|1<<(R&31);V=f[g>>2]|0;f[(f[h>>2]|0)+(V<<2)>>2]=R;f[(f[a>>2]|0)+(R<<2)>>2]=V;V=R+1|0;W=((V>>>0)%3|0|0)==0?R+-2|0:V;do if((W|0)==-1)X=-1;else{V=f[(f[x>>2]|0)+(W<<2)>>2]|0;Y=V+1|0;if((V|0)==-1){X=-1;break}X=((Y>>>0)%3|0|0)==0?V+-2|0:Y}while(0);if((X|0)==(M|0))break;else R=X}}else{R=M;while(1){if((R|0)==-1){S=64;break b}W=(f[e>>2]|0)+(R>>>5<<2)|0;f[W>>2]=f[W>>2]|1<<(R&31);f[(f[h>>2]|0)+(f[g>>2]<<2)>>2]=R;W=R+1|0;Y=((W>>>0)%3|0|0)==0?R+-2|0:W;do if((Y|0)==-1)Z=-1;else{W=f[(f[x>>2]|0)+(Y<<2)>>2]|0;V=W+1|0;if((W|0)==-1){Z=-1;break}Z=((V>>>0)%3|0|0)==0?W+-2|0:V}while(0);if((Z|0)==(M|0))break;else R=Z}}while(0);c:do if((S|0)==64){S=0;if((M|0)==-1)break;R=(((M>>>0)%3|0|0)==0?2:-1)+M|0;if((R|0)==-1)break;Y=f[(f[x>>2]|0)+(R<<2)>>2]|0;if((Y|0)==-1)break;R=Y+(((Y>>>0)%3|0|0)==0?2:-1)|0;if((R|0)==-1)break;if(!O){Y=R;while(1){V=(f[e>>2]|0)+(Y>>>5<<2)|0;f[V>>2]=f[V>>2]|1<<(Y&31);V=(((Y>>>0)%3|0|0)==0?2:-1)+Y|0;if((V|0)==-1)break c;W=f[(f[x>>2]|0)+(V<<2)>>2]|0;if((W|0)==-1)break c;Y=W+(((W>>>0)%3|0|0)==0?2:-1)|0;if((Y|0)==-1)break c}}Y=f[a>>2]|0;W=R;do{V=(f[e>>2]|0)+(W>>>5<<2)|0;f[V>>2]=f[V>>2]|1<<(W&31);f[Y+(W<<2)>>2]=f[g>>2];V=(((W>>>0)%3|0|0)==0?2:-1)+W|0;if((V|0)==-1)break c;_=f[(f[x>>2]|0)+(V<<2)>>2]|0;if((_|0)==-1)break c;W=_+(((_>>>0)%3|0|0)==0?2:-1)|0}while((W|0)!=-1)}while(0);$=P;aa=T;ba=N}else{$=J;aa=I;ba=F}if((H|0)<2){H=H+1|0;J=$;F=ba;I=aa}else{ca=$;da=aa;ea=ba;break}}}else{ca=A;da=D;ea=E}}else{ca=A;da=D;ea=E}C=C+1|0;B=f[a>>2]|0;if(C>>>0>=(((f[m>>2]|0)-B>>2>>>0)/3|0)>>>0){S=18;break}else{A=ca;D=da;E=ea}}if((S|0)==18){fa=da;ga=f[l>>2]|0;break}else if((S|0)==50)mq(d)}else{fa=q;ga=p}}else{fa=q;ga=p}while(0);p=a+44|0;f[p>>2]=0;a=fa;fa=ga>>>5;q=a+(fa<<2)|0;S=ga&31;ga=(fa|0)!=0;d:do if(fa|S|0)if(!S){l=a;da=0;ea=ga;while(1){e:do if(ea){if(!(f[l>>2]&1)){ca=da+1|0;f[p>>2]=ca;ha=ca}else ha=da;if(!(f[l>>2]&2)){ca=ha+1|0;f[p>>2]=ca;ia=ca}else ia=ha;if(!(f[l>>2]&4)){ca=ia+1|0;f[p>>2]=ca;ja=ca}else ja=ia;if(!(f[l>>2]&8)){ca=ja+1|0;f[p>>2]=ca;ka=ca}else ka=ja;if(!(f[l>>2]&16)){ca=ka+1|0;f[p>>2]=ca;la=ca}else la=ka;if(!(f[l>>2]&32)){ca=la+1|0;f[p>>2]=ca;ma=ca}else ma=la;if(!(f[l>>2]&64)){ca=ma+1|0;f[p>>2]=ca;na=ca}else na=ma;if(!(f[l>>2]&128)){ca=na+1|0;f[p>>2]=ca;oa=ca}else oa=na;if(!(f[l>>2]&256)){ca=oa+1|0;f[p>>2]=ca;pa=ca}else pa=oa;if(!(f[l>>2]&512)){ca=pa+1|0;f[p>>2]=ca;qa=ca}else qa=pa;if(!(f[l>>2]&1024)){ca=qa+1|0;f[p>>2]=ca;ra=ca}else ra=qa;if(!(f[l>>2]&2048)){ca=ra+1|0;f[p>>2]=ca;sa=ca}else sa=ra;if(!(f[l>>2]&4096)){ca=sa+1|0;f[p>>2]=ca;ta=ca}else ta=sa;if(!(f[l>>2]&8192)){ca=ta+1|0;f[p>>2]=ca;ua=ca}else ua=ta;if(!(f[l>>2]&16384)){ca=ua+1|0;f[p>>2]=ca;va=ca}else va=ua;if(!(f[l>>2]&32768)){ca=va+1|0;f[p>>2]=ca;wa=ca}else wa=va;if(!(f[l>>2]&65536)){ca=wa+1|0;f[p>>2]=ca;xa=ca}else xa=wa;if(!(f[l>>2]&131072)){ca=xa+1|0;f[p>>2]=ca;ya=ca}else ya=xa;if(!(f[l>>2]&262144)){ca=ya+1|0;f[p>>2]=ca;za=ca}else za=ya;if(!(f[l>>2]&524288)){ca=za+1|0;f[p>>2]=ca;Aa=ca}else Aa=za;if(!(f[l>>2]&1048576)){ca=Aa+1|0;f[p>>2]=ca;Ba=ca}else Ba=Aa;if(!(f[l>>2]&2097152)){ca=Ba+1|0;f[p>>2]=ca;Ca=ca}else Ca=Ba;if(!(f[l>>2]&4194304)){ca=Ca+1|0;f[p>>2]=ca;Da=ca}else Da=Ca;if(!(f[l>>2]&8388608)){ca=Da+1|0;f[p>>2]=ca;Ea=ca}else Ea=Da;if(!(f[l>>2]&16777216)){ca=Ea+1|0;f[p>>2]=ca;Fa=ca}else Fa=Ea;if(!(f[l>>2]&33554432)){ca=Fa+1|0;f[p>>2]=ca;Ga=ca}else Ga=Fa;if(!(f[l>>2]&67108864)){ca=Ga+1|0;f[p>>2]=ca;Ha=ca}else Ha=Ga;if(!(f[l>>2]&134217728)){ca=Ha+1|0;f[p>>2]=ca;Ia=ca}else Ia=Ha;if(!(f[l>>2]&268435456)){ca=Ia+1|0;f[p>>2]=ca;Ja=ca}else Ja=Ia;if(!(f[l>>2]&536870912)){ca=Ja+1|0;f[p>>2]=ca;Ka=ca}else Ka=Ja;if(!(f[l>>2]&1073741824)){ca=Ka+1|0;f[p>>2]=ca;La=ca}else La=Ka;if((f[l>>2]|0)<=-1){Ma=La;break}ca=La+1|0;f[p>>2]=ca;Ma=ca}else{ca=0;m=da;while(1){if(!(f[l>>2]&1<<ca)){ba=m+1|0;f[p>>2]=ba;Na=ba}else Na=m;if((ca|0)==31){Ma=Na;break e}ca=ca+1|0;if(!ca)break d;else m=Na}}while(0);l=l+4|0;if((q|0)==(l|0))break;else{da=Ma;ea=1}}}else{if(ga){ea=0;da=a;l=0;while(1){if(!(f[da>>2]&1)){m=l+1|0;f[p>>2]=m;Oa=m;Pa=m}else{Oa=l;Pa=ea}if(!(f[da>>2]&2)){m=Oa+1|0;f[p>>2]=m;Qa=m;Ra=m}else{Qa=Oa;Ra=Pa}if(!(f[da>>2]&4)){m=Qa+1|0;f[p>>2]=m;Sa=m;Ta=m}else{Sa=Qa;Ta=Ra}if(!(f[da>>2]&8)){m=Sa+1|0;f[p>>2]=m;Ua=m;Va=m}else{Ua=Sa;Va=Ta}if(!(f[da>>2]&16)){m=Ua+1|0;f[p>>2]=m;Wa=m;Xa=m}else{Wa=Ua;Xa=Va}if(!(f[da>>2]&32)){m=Wa+1|0;f[p>>2]=m;Ya=m;Za=m}else{Ya=Wa;Za=Xa}if(!(f[da>>2]&64)){m=Ya+1|0;f[p>>2]=m;_a=m;$a=m}else{_a=Ya;$a=Za}if(!(f[da>>2]&128)){m=_a+1|0;f[p>>2]=m;ab=m;bb=m}else{ab=_a;bb=$a}if(!(f[da>>2]&256)){m=ab+1|0;f[p>>2]=m;cb=m;db=m}else{cb=ab;db=bb}if(!(f[da>>2]&512)){m=cb+1|0;f[p>>2]=m;eb=m;fb=m}else{eb=cb;fb=db}if(!(f[da>>2]&1024)){m=eb+1|0;f[p>>2]=m;gb=m;hb=m}else{gb=eb;hb=fb}if(!(f[da>>2]&2048)){m=gb+1|0;f[p>>2]=m;ib=m;jb=m}else{ib=gb;jb=hb}if(!(f[da>>2]&4096)){m=ib+1|0;f[p>>2]=m;kb=m;lb=m}else{kb=ib;lb=jb}if(!(f[da>>2]&8192)){m=kb+1|0;f[p>>2]=m;mb=m;nb=m}else{mb=kb;nb=lb}if(!(f[da>>2]&16384)){m=mb+1|0;f[p>>2]=m;ob=m;pb=m}else{ob=mb;pb=nb}if(!(f[da>>2]&32768)){m=ob+1|0;f[p>>2]=m;qb=m;rb=m}else{qb=ob;rb=pb}if(!(f[da>>2]&65536)){m=qb+1|0;f[p>>2]=m;sb=m;tb=m}else{sb=qb;tb=rb}if(!(f[da>>2]&131072)){m=sb+1|0;f[p>>2]=m;ub=m;vb=m}else{ub=sb;vb=tb}if(!(f[da>>2]&262144)){m=ub+1|0;f[p>>2]=m;wb=m;xb=m}else{wb=ub;xb=vb}if(!(f[da>>2]&524288)){m=wb+1|0;f[p>>2]=m;yb=m;zb=m}else{yb=wb;zb=xb}if(!(f[da>>2]&1048576)){m=yb+1|0;f[p>>2]=m;Ab=m;Bb=m}else{Ab=yb;Bb=zb}if(!(f[da>>2]&2097152)){m=Ab+1|0;f[p>>2]=m;Cb=m;Db=m}else{Cb=Ab;Db=Bb}if(!(f[da>>2]&4194304)){m=Cb+1|0;f[p>>2]=m;Eb=m;Fb=m}else{Eb=Cb;Fb=Db}if(!(f[da>>2]&8388608)){m=Eb+1|0;f[p>>2]=m;Gb=m;Hb=m}else{Gb=Eb;Hb=Fb}if(!(f[da>>2]&16777216)){m=Gb+1|0;f[p>>2]=m;Ib=m;Jb=m}else{Ib=Gb;Jb=Hb}if(!(f[da>>2]&33554432)){m=Ib+1|0;f[p>>2]=m;Kb=m;Lb=m}else{Kb=Ib;Lb=Jb}if(!(f[da>>2]&67108864)){m=Kb+1|0;f[p>>2]=m;Mb=m;Nb=m}else{Mb=Kb;Nb=Lb}if(!(f[da>>2]&134217728)){m=Mb+1|0;f[p>>2]=m;Ob=m;Pb=m}else{Ob=Mb;Pb=Nb}if(!(f[da>>2]&268435456)){m=Ob+1|0;f[p>>2]=m;Qb=m;Rb=m}else{Qb=Ob;Rb=Pb}if(!(f[da>>2]&536870912)){m=Qb+1|0;f[p>>2]=m;Sb=m;Tb=m}else{Sb=Qb;Tb=Rb}if(!(f[da>>2]&1073741824)){m=Sb+1|0;f[p>>2]=m;Ub=m;Vb=m}else{Ub=Sb;Vb=Tb}if((f[da>>2]|0)>-1){m=Ub+1|0;f[p>>2]=m;Wb=m;Xb=m}else{Wb=Ub;Xb=Vb}m=da+4|0;if((q|0)==(m|0)){Yb=m;Zb=Xb;break}else{ea=Xb;da=m;l=Wb}}}else{Yb=a;Zb=0}l=0;da=Zb;while(1){if(!(f[Yb>>2]&1<<l)){ea=da+1|0;f[p>>2]=ea;_b=ea}else _b=da;l=l+1|0;if((l|0)==(S|0))break;else da=_b}}while(0);_b=f[e>>2]|0;if(_b|0)br(_b);_b=f[d>>2]|0;if(!_b){u=c;return 1}br(_b);u=c;return 1}function gb(a){a=a|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ja=0,Ka=Oa,La=0,Ma=0,Na=0,Pa=0,Qa=Oa,Ra=0,Sa=0,Ta=0,Ua=0,Va=0;c=u;u=u+80|0;d=c+60|0;e=c+48|0;g=c+24|0;h=c+12|0;i=c;j=a+28|0;k=f[j>>2]|0;l=f[k+4>>2]|0;m=f[l+80>>2]|0;o=a+4|0;p=a+8|0;q=f[p>>2]|0;r=f[o>>2]|0;s=(q|0)==(r|0);t=r;if(s){f[a+72>>2]=0;v=1;u=c;return v|0}w=f[l+8>>2]|0;x=q-r>>2;r=0;q=0;do{r=r+(b[(f[w+(f[t+(q<<2)>>2]<<2)>>2]|0)+24>>0]|0)|0;q=q+1|0}while(q>>>0<x>>>0);f[a+72>>2]=r;if(s){v=1;u=c;return v|0}s=g+4|0;r=g+8|0;x=d+8|0;q=d+4|0;w=d+11|0;y=g+12|0;z=d+8|0;A=d+4|0;B=d+11|0;C=h+4|0;D=h+8|0;E=i+8|0;F=i+4|0;G=d+11|0;H=d+4|0;I=i+11|0;J=d+8|0;K=d+4|0;L=d+11|0;M=d+11|0;N=d+4|0;O=h+8|0;P=a+40|0;Q=a+44|0;R=a+36|0;S=a+64|0;T=a+68|0;U=a+60|0;V=g+8|0;W=g+20|0;X=e+8|0;Y=e+4|0;Z=e+11|0;_=g+4|0;aa=g+8|0;ba=h+4|0;ca=h+8|0;da=h+8|0;ea=a+52|0;fa=a+56|0;ga=a+48|0;a=g+8|0;ha=0;ia=t;t=l;l=k;a:while(1){k=f[ia+(ha<<2)>>2]|0;ja=f[(f[t+8>>2]|0)+(k<<2)>>2]|0;switch(f[ja+28>>2]|0){case 9:{f[g>>2]=1180;f[s>>2]=-1;f[r>>2]=0;f[r+4>>2]=0;f[r+8>>2]=0;f[r+12>>2]=0;ka=f[l+48>>2]|0;f[d>>2]=0;f[d+4>>2]=0;f[d+8>>2]=0;la=dn(32)|0;f[d>>2]=la;f[x>>2]=-2147483616;f[q>>2]=17;ma=la;na=12932;oa=ma+17|0;do{b[ma>>0]=b[na>>0]|0;ma=ma+1|0;na=na+1|0}while((ma|0)<(oa|0));b[la+17>>0]=0;pa=ka+16|0;qa=f[pa>>2]|0;if(qa){ra=pa;sa=qa;b:while(1){qa=sa;while(1){if((f[qa+16>>2]|0)>=(k|0))break;ta=f[qa+4>>2]|0;if(!ta){ua=ra;break b}else qa=ta}sa=f[qa>>2]|0;if(!sa){ua=qa;break}else ra=qa}if(((ua|0)!=(pa|0)?(k|0)>=(f[ua+16>>2]|0):0)?(ra=ua+20|0,(sh(ra,d)|0)!=0):0)va=yk(ra,d,-1)|0;else wa=17}else wa=17;if((wa|0)==17){wa=0;va=yk(ka,d,-1)|0}if((b[w>>0]|0)<0)br(f[d>>2]|0);if((va|0)<1)xa=1;else{ra=f[(f[j>>2]|0)+48>>2]|0;f[d>>2]=0;f[d+4>>2]=0;f[d+8>>2]=0;sa=dn(32)|0;f[d>>2]=sa;f[z>>2]=-2147483616;f[A>>2]=19;ma=sa;na=13005;oa=ma+19|0;do{b[ma>>0]=b[na>>0]|0;ma=ma+1|0;na=na+1|0}while((ma|0)<(oa|0));b[sa+19>>0]=0;ka=ra+16|0;pa=f[ka>>2]|0;if(pa){la=ka;ta=pa;c:while(1){pa=ta;while(1){if((f[pa+16>>2]|0)>=(k|0))break;ya=f[pa+4>>2]|0;if(!ya){za=la;break c}else pa=ya}ta=f[pa>>2]|0;if(!ta){za=pa;break}else la=pa}if((za|0)!=(ka|0)?(k|0)>=(f[za+16>>2]|0):0)Aa=za+20|0;else wa=29}else wa=29;if((wa|0)==29){wa=0;Aa=ra}if(!(sh(Aa,d)|0))Ba=0;else{la=f[(f[j>>2]|0)+48>>2]|0;f[e>>2]=0;f[e+4>>2]=0;f[e+8>>2]=0;ta=dn(32)|0;f[e>>2]=ta;f[X>>2]=-2147483616;f[Y>>2]=18;ma=ta;na=13025;oa=ma+18|0;do{b[ma>>0]=b[na>>0]|0;ma=ma+1|0;na=na+1|0}while((ma|0)<(oa|0));b[ta+18>>0]=0;ra=la+16|0;ka=f[ra>>2]|0;if(ka){sa=ra;qa=ka;d:while(1){ka=qa;while(1){if((f[ka+16>>2]|0)>=(k|0))break;ya=f[ka+4>>2]|0;if(!ya){Ca=sa;break d}else ka=ya}qa=f[ka>>2]|0;if(!qa){Ca=ka;break}else sa=ka}if((Ca|0)!=(ra|0)?(k|0)>=(f[Ca+16>>2]|0):0)Da=Ca+20|0;else wa=39}else wa=39;if((wa|0)==39){wa=0;Da=la}sa=(sh(Da,e)|0)!=0;if((b[Z>>0]|0)<0)br(f[e>>2]|0);Ba=sa}if((b[B>>0]|0)<0)br(f[d>>2]|0);if(Ba){sa=ja+24|0;qa=b[sa>>0]|0;ta=qa<<24>>24;f[h>>2]=0;f[C>>2]=0;f[D>>2]=0;if(!(qa<<24>>24))Ea=0;else{if(qa<<24>>24<0){wa=48;break a}qa=ta<<2;pa=dn(qa)|0;f[h>>2]=pa;ya=pa+(ta<<2)|0;f[O>>2]=ya;hj(pa|0,0,qa|0)|0;f[C>>2]=ya;Ea=pa}pa=f[(f[j>>2]|0)+48>>2]|0;f[i>>2]=0;f[i+4>>2]=0;f[i+8>>2]=0;ya=dn(32)|0;f[i>>2]=ya;f[E>>2]=-2147483616;f[F>>2]=19;ma=ya;na=13005;oa=ma+19|0;do{b[ma>>0]=b[na>>0]|0;ma=ma+1|0;na=na+1|0}while((ma|0)<(oa|0));b[ya+19>>0]=0;la=b[sa>>0]|0;ra=la<<24>>24;qa=pa+16|0;ta=f[qa>>2]|0;if(ta){Fa=qa;Ga=ta;e:while(1){ta=Ga;while(1){if((f[ta+16>>2]|0)>=(k|0))break;Ha=f[ta+4>>2]|0;if(!Ha){Ia=Fa;break e}else ta=Ha}Ga=f[ta>>2]|0;if(!Ga){Ia=ta;break}else Fa=ta}if(((Ia|0)!=(qa|0)?(k|0)>=(f[Ia+16>>2]|0):0)?(Fa=Ia+20|0,(sh(Fa,i)|0)!=0):0){Ga=zg(Fa,i)|0;if((Ga|0)!=(Ia+24|0)){dj(d,Ga+28|0);Ga=b[M>>0]|0;Fa=Ga<<24>>24<0;if(!((Fa?f[N>>2]|0:Ga&255)|0))Ja=Ga;else{if(la<<24>>24>0){ya=Fa?f[d>>2]|0:d;Fa=0;do{Ka=$(pq(ya,e));ka=ya;ya=f[e>>2]|0;if((ka|0)==(ya|0))break;n[Ea+(Fa<<2)>>2]=Ka;Fa=Fa+1|0}while((Fa|0)<(ra|0));La=b[M>>0]|0}else La=Ga;Ja=La}if(Ja<<24>>24<0)br(f[d>>2]|0)}}else wa=69}else wa=69;if((wa|0)==69?(wa=0,Fa=zg(pa,i)|0,(Fa|0)!=(pa+4|0)):0){dj(d,Fa+28|0);Fa=b[G>>0]|0;ya=Fa<<24>>24<0;if(!((ya?f[H>>2]|0:Fa&255)|0))Ma=Fa;else{if(la<<24>>24>0){qa=ya?f[d>>2]|0:d;ya=0;do{Ka=$(pq(qa,e));ka=qa;qa=f[e>>2]|0;if((ka|0)==(qa|0))break;n[Ea+(ya<<2)>>2]=Ka;ya=ya+1|0}while((ya|0)<(ra|0));Na=b[G>>0]|0}else Na=Fa;Ma=Na}if(Ma<<24>>24<0)br(f[d>>2]|0)}if((b[I>>0]|0)<0)br(f[i>>2]|0);ra=f[(f[j>>2]|0)+48>>2]|0;f[d>>2]=0;f[d+4>>2]=0;f[d+8>>2]=0;ya=dn(32)|0;f[d>>2]=ya;f[J>>2]=-2147483616;f[K>>2]=18;ma=ya;na=13025;oa=ma+18|0;do{b[ma>>0]=b[na>>0]|0;ma=ma+1|0;na=na+1|0}while((ma|0)<(oa|0));b[ya+18>>0]=0;na=ra+16|0;ma=f[na>>2]|0;do if(ma){oa=na;Fa=ma;f:while(1){qa=Fa;while(1){if((f[qa+16>>2]|0)>=(k|0))break;la=f[qa+4>>2]|0;if(!la){Pa=oa;break f}else qa=la}Fa=f[qa>>2]|0;if(!Fa){Pa=qa;break}else oa=qa}if((Pa|0)!=(na|0)?(k|0)>=(f[Pa+16>>2]|0):0){oa=Pa+20|0;if(!(sh(oa,d)|0)){wa=91;break}Qa=$(kk(oa,d,$(1.0)))}else wa=91}else wa=91;while(0);if((wa|0)==91){wa=0;Qa=$(kk(ra,d,$(1.0)))}if((b[L>>0]|0)<0)br(f[d>>2]|0);wl(g,va,f[h>>2]|0,b[sa>>0]|0,Qa);k=f[h>>2]|0;if(k|0){na=f[C>>2]|0;if((na|0)!=(k|0))f[C>>2]=na+(~((na+-4-k|0)>>>2)<<2);br(k)}}else Kd(g,ja,va)|0;k=f[P>>2]|0;if((k|0)==(f[Q>>2]|0))of(R,g);else{f[k>>2]=1180;f[k+4>>2]=f[s>>2];Ra=k+8|0;f[Ra>>2]=0;na=k+12|0;f[na>>2]=0;f[k+16>>2]=0;ma=(f[y>>2]|0)-(f[V>>2]|0)|0;ya=ma>>2;if(ya|0){if(ya>>>0>1073741823){wa=103;break a}oa=dn(ma)|0;f[na>>2]=oa;f[Ra>>2]=oa;f[k+16>>2]=oa+(ya<<2);ya=f[V>>2]|0;ma=(f[y>>2]|0)-ya|0;if((ma|0)>0){Rg(oa|0,ya|0,ma|0)|0;f[na>>2]=oa+(ma>>>2<<2)}}f[k+20>>2]=f[W>>2];f[P>>2]=(f[P>>2]|0)+24}Re(d,g,ja,m);k=f[S>>2]|0;if(k>>>0<(f[T>>2]|0)>>>0){ma=f[d>>2]|0;f[d>>2]=0;f[k>>2]=ma;f[S>>2]=k+4}else Me(U,d);k=f[d>>2]|0;f[d>>2]=0;if(k|0){ma=k+88|0;oa=f[ma>>2]|0;f[ma>>2]=0;if(oa|0){ma=f[oa+8>>2]|0;if(ma|0){na=oa+12|0;if((f[na>>2]|0)!=(ma|0))f[na>>2]=ma;br(ma)}br(oa)}oa=f[k+68>>2]|0;if(oa|0){ma=k+72|0;na=f[ma>>2]|0;if((na|0)!=(oa|0))f[ma>>2]=na+(~((na+-4-oa|0)>>>2)<<2);br(oa)}oa=k+64|0;na=f[oa>>2]|0;f[oa>>2]=0;if(na|0){oa=f[na>>2]|0;if(oa|0){ma=na+4|0;if((f[ma>>2]|0)!=(oa|0))f[ma>>2]=oa;br(oa)}br(na)}br(k)}xa=0}f[g>>2]=1180;k=f[r>>2]|0;if(k|0){na=f[y>>2]|0;if((na|0)!=(k|0))f[y>>2]=na+(~((na+-4-k|0)>>>2)<<2);br(k)}if(xa|0){v=0;wa=169;break a}break}case 1:case 3:case 5:{k=ja+24|0;na=b[k>>0]|0;oa=na<<24>>24;f[g>>2]=0;f[_>>2]=0;f[aa>>2]=0;if(!(na<<24>>24))Sa=0;else{if(na<<24>>24<0){wa=137;break a}na=dn(oa<<2)|0;f[_>>2]=na;f[g>>2]=na;ma=na+(oa<<2)|0;f[a>>2]=ma;ya=oa;oa=na;while(1){f[oa>>2]=2147483647;ya=ya+-1|0;if(!ya)break;else oa=oa+4|0}f[_>>2]=ma;Sa=b[k>>0]|0}oa=Sa<<24>>24;f[h>>2]=0;f[ba>>2]=0;f[ca>>2]=0;if(!(Sa<<24>>24))Ta=0;else{if(Sa<<24>>24<0){wa=144;break a}ya=oa<<2;sa=dn(ya)|0;f[h>>2]=sa;ra=sa+(oa<<2)|0;f[da>>2]=ra;hj(sa|0,0,ya|0)|0;f[ba>>2]=ra;Ta=sa}sa=ja+80|0;ra=b[k>>0]|0;g:do if(!(f[sa>>2]|0))Ua=ra;else{ya=0;oa=ra;na=Ta;while(1){f[e>>2]=ya;f[d>>2]=f[e>>2];Pb(ja,d,oa,na)|0;Fa=b[k>>0]|0;if(Fa<<24>>24>0){ta=f[g>>2]|0;la=f[h>>2]|0;pa=Fa<<24>>24;Ga=0;do{ka=ta+(Ga<<2)|0;Ha=f[la+(Ga<<2)>>2]|0;if((f[ka>>2]|0)>(Ha|0))f[ka>>2]=Ha;Ga=Ga+1|0}while((Ga|0)<(pa|0))}pa=ya+1|0;if(pa>>>0>=(f[sa>>2]|0)>>>0){Ua=Fa;break g}ya=pa;oa=Fa;na=f[h>>2]|0}}while(0);if(Ua<<24>>24>0){sa=0;ja=Ua;while(1){ra=(f[g>>2]|0)+(sa<<2)|0;ma=f[ea>>2]|0;if((ma|0)==(f[fa>>2]|0)){Ci(ga,ra);Va=b[k>>0]|0}else{f[ma>>2]=f[ra>>2];f[ea>>2]=ma+4;Va=ja}sa=sa+1|0;if((sa|0)>=(Va<<24>>24|0))break;else ja=Va}}ja=f[h>>2]|0;if(ja|0){sa=f[ba>>2]|0;if((sa|0)!=(ja|0))f[ba>>2]=sa+(~((sa+-4-ja|0)>>>2)<<2);br(ja)}ja=f[g>>2]|0;if(ja|0){sa=f[_>>2]|0;if((sa|0)!=(ja|0))f[_>>2]=sa+(~((sa+-4-ja|0)>>>2)<<2);br(ja)}break}default:{}}ja=ha+1|0;sa=f[o>>2]|0;if(ja>>>0>=(f[p>>2]|0)-sa>>2>>>0){v=1;wa=169;break}k=f[j>>2]|0;ha=ja;ia=sa;t=f[k+4>>2]|0;l=k}if((wa|0)==48)mq(h);else if((wa|0)==103)mq(Ra);else if((wa|0)==137)mq(g);else if((wa|0)==144)mq(h);else if((wa|0)==169){u=c;return v|0}return 0}function hb(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,Y=0,Z=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ja=0,Ka=0,La=0,Ma=0,Na=0,Oa=0,Pa=0,Qa=0,Ra=0;d=u;u=u+32|0;e=d;g=a+8|0;h=f[g>>2]|0;f[e>>2]=0;i=e+4|0;f[i>>2]=0;f[e+8>>2]=0;do if(h)if(h>>>0>1073741823)mq(e);else{j=h<<2;k=dn(j)|0;f[e>>2]=k;l=k+(h<<2)|0;f[e+8>>2]=l;hj(k|0,0,j|0)|0;f[i>>2]=l;m=l;n=k;break}else{m=0;n=0}while(0);k=a+128|0;l=f[k>>2]|0;j=f[l>>2]|0;o=l+4|0;if(!j){p=l+8|0;q=n;r=m;s=h}else{h=f[o>>2]|0;if((h|0)!=(j|0))f[o>>2]=h+(~((h+-4-j|0)>>>2)<<2);br(j);j=l+8|0;f[j>>2]=0;f[o>>2]=0;f[l>>2]=0;p=j;q=f[e>>2]|0;r=f[i>>2]|0;s=f[g>>2]|0}f[l>>2]=q;f[o>>2]=r;f[p>>2]=f[e+8>>2];f[e>>2]=0;p=e+4|0;f[p>>2]=0;f[e+8>>2]=0;do if(s)if(s>>>0>1073741823)mq(e);else{r=s<<2;o=dn(r)|0;f[e>>2]=o;q=o+(s<<2)|0;f[e+8>>2]=q;hj(o|0,0,r|0)|0;f[p>>2]=q;t=q;v=o;break}else{t=0;v=0}while(0);s=a+140|0;o=f[s>>2]|0;q=f[o>>2]|0;r=o+4|0;if(!q){w=o+8|0;x=v;y=t}else{t=f[r>>2]|0;if((t|0)!=(q|0))f[r>>2]=t+(~((t+-4-q|0)>>>2)<<2);br(q);q=o+8|0;f[q>>2]=0;f[r>>2]=0;f[o>>2]=0;w=q;x=f[e>>2]|0;y=f[p>>2]|0}f[o>>2]=x;f[r>>2]=y;f[w>>2]=f[e+8>>2];w=f[b>>2]|0;y=b+4|0;r=f[y>>2]|0;x=f[y+4>>2]|0;y=f[c>>2]|0;o=c+4|0;p=f[o>>2]|0;q=f[o+4>>2]|0;f[e>>2]=0;f[e+4>>2]=0;f[e+8>>2]=0;f[e+12>>2]=0;f[e+16>>2]=0;f[e+20>>2]=0;o=e+8|0;t=e+4|0;v=e+16|0;l=e+20|0;i=r;Jc(e);j=f[t>>2]|0;h=(f[l>>2]|0)+(f[v>>2]|0)|0;if((f[o>>2]|0)==(j|0))z=0;else z=(f[j+(((h>>>0)/113|0)<<2)>>2]|0)+(((h>>>0)%113|0)*36|0)|0;f[z>>2]=w;h=z+4|0;f[h>>2]=r;f[h+4>>2]=x;f[z+12>>2]=y;h=z+16|0;f[h>>2]=p;f[h+4>>2]=q;f[z+24>>2]=0;f[z+28>>2]=y-w;f[z+32>>2]=0;z=(f[l>>2]|0)+1|0;f[l>>2]=z;if(z|0){w=a+116|0;y=a+48|0;h=a+44|0;j=a+36|0;m=a+40|0;n=a+32|0;A=b+8|0;B=c+8|0;C=a+28|0;D=a+24|0;E=a+16|0;F=a+20|0;G=a+12|0;H=a+88|0;I=a+84|0;J=a+76|0;K=a+80|0;L=a+72|0;M=i+4|0;N=i+24|0;O=i+24|0;P=p+24|0;Q=z;while(1){z=f[v>>2]|0;R=Q+-1|0;S=R+z|0;T=f[t>>2]|0;U=f[T+(((S>>>0)/113|0)<<2)>>2]|0;V=(S>>>0)%113|0;S=f[U+(V*36|0)>>2]|0;W=f[U+(V*36|0)+12>>2]|0;Y=f[U+(V*36|0)+24>>2]|0;Z=f[U+(V*36|0)+32>>2]|0;f[l>>2]=R;R=f[o>>2]|0;V=R-T>>2;if((1-Q-z+((V|0)==0?0:(V*113|0)+-1|0)|0)>>>0>225){br(f[R+-4>>2]|0);f[o>>2]=(f[o>>2]|0)+-4}f[b>>2]=S;f[c>>2]=W;R=f[k>>2]|0;V=((f[g>>2]|0)+-1|0)==(Y|0)?0:Y+1|0;Y=(f[s>>2]|0)+(Z*12|0)|0;z=W-S|0;T=(f[a>>2]|0)-(f[(f[Y>>2]|0)+(V<<2)>>2]|0)|0;a:do if(T){if(z>>>0<3){U=f[w>>2]|0;f[U>>2]=V;$=f[g>>2]|0;if($>>>0>1){aa=1;ba=$;ca=V;while(1){ca=(ca|0)==(ba+-1|0)?0:ca+1|0;f[U+(aa<<2)>>2]=ca;aa=aa+1|0;da=f[g>>2]|0;if(aa>>>0>=da>>>0){ea=da;break}else ba=da}}else ea=$;if(!z){fa=99;break}else{ga=0;ha=ea}while(1){ba=(f[N>>2]|0)+((X(f[M>>2]|0,S+ga|0)|0)<<2)|0;if(!ha)ia=0;else{aa=0;do{ca=f[(f[w>>2]|0)+(aa<<2)>>2]|0;U=(f[a>>2]|0)-(f[(f[Y>>2]|0)+(ca<<2)>>2]|0)|0;do if(U|0){da=f[y>>2]|0;ja=32-da|0;ka=32-U|0;la=f[ba+(ca<<2)>>2]<<ka;if((U|0)>(ja|0)){ma=la>>>ka;ka=U-ja|0;f[y>>2]=ka;ja=f[h>>2]|ma>>>ka;f[h>>2]=ja;ka=f[j>>2]|0;if((ka|0)==(f[m>>2]|0))Ci(n,h);else{f[ka>>2]=ja;f[j>>2]=ka+4}f[h>>2]=ma<<32-(f[y>>2]|0);break}ma=f[h>>2]|la>>>da;f[h>>2]=ma;la=da+U|0;f[y>>2]=la;if((la|0)!=32)break;la=f[j>>2]|0;if((la|0)==(f[m>>2]|0))Ci(n,h);else{f[la>>2]=ma;f[j>>2]=la+4}f[h>>2]=0;f[y>>2]=0}while(0);aa=aa+1|0;U=f[g>>2]|0}while(aa>>>0<U>>>0);ia=U}ga=ga+1|0;if(ga>>>0>=z>>>0){fa=99;break a}else ha=ia}}$=Z+1|0;qg(R+($*12|0)|0,f[R+(Z*12|0)>>2]|0,f[R+(Z*12|0)+4>>2]|0);aa=(f[(f[k>>2]|0)+($*12|0)>>2]|0)+(V<<2)|0;ba=(f[aa>>2]|0)+(1<<T+-1)|0;f[aa>>2]=ba;aa=f[A>>2]|0;U=f[B>>2]|0;b:do if((W|0)==(S|0))na=S;else{ca=f[O>>2]|0;if(!aa){if((f[ca+(V<<2)>>2]|0)>>>0<ba>>>0){na=W;break}else{oa=W;pa=S}while(1){la=oa;do{la=la+-1|0;if((pa|0)==(la|0)){na=pa;break b}ma=(f[P>>2]|0)+((X(la,U)|0)<<2)+(V<<2)|0}while((f[ma>>2]|0)>>>0>=ba>>>0);pa=pa+1|0;if((pa|0)==(la|0)){na=la;break b}else oa=la}}else{qa=W;ra=S}while(1){ma=ra;while(1){sa=ca+((X(ma,aa)|0)<<2)|0;if((f[sa+(V<<2)>>2]|0)>>>0>=ba>>>0){ta=qa;break}da=ma+1|0;if((da|0)==(qa|0)){na=qa;break b}else ma=da}while(1){ta=ta+-1|0;if((ma|0)==(ta|0)){na=ma;break b}ua=(f[P>>2]|0)+((X(ta,U)|0)<<2)|0;if((f[ua+(V<<2)>>2]|0)>>>0<ba>>>0){va=0;break}}do{la=sa+(va<<2)|0;da=ua+(va<<2)|0;ka=f[la>>2]|0;f[la>>2]=f[da>>2];f[da>>2]=ka;va=va+1|0}while((va|0)!=(aa|0));ra=ma+1|0;if((ra|0)==(ta|0)){na=ta;break}else qa=ta}}while(0);ba=(_(z|0)|0)^31;U=na-S|0;ca=W-na|0;ka=U>>>0<ca>>>0;if((U|0)!=(ca|0)){da=f[H>>2]|0;if(ka)f[I>>2]=f[I>>2]|1<<31-da;la=da+1|0;f[H>>2]=la;if((la|0)==32){la=f[J>>2]|0;if((la|0)==(f[K>>2]|0))Ci(L,I);else{f[la>>2]=f[I>>2];f[J>>2]=la+4}f[H>>2]=0;f[I>>2]=0}}la=z>>>1;do if(ka){da=f[C>>2]|0;ja=32-da|0;wa=32-ba|0;xa=la-U<<wa;if((ba|0)>(ja|0)){ya=xa>>>wa;wa=ba-ja|0;f[C>>2]=wa;ja=f[D>>2]|ya>>>wa;f[D>>2]=ja;wa=f[E>>2]|0;if((wa|0)==(f[F>>2]|0))Ci(G,D);else{f[wa>>2]=ja;f[E>>2]=wa+4}f[D>>2]=ya<<32-(f[C>>2]|0);break}ya=f[D>>2]|xa>>>da;f[D>>2]=ya;xa=da+ba|0;f[C>>2]=xa;if((xa|0)==32){xa=f[E>>2]|0;if((xa|0)==(f[F>>2]|0))Ci(G,D);else{f[xa>>2]=ya;f[E>>2]=xa+4}f[D>>2]=0;f[C>>2]=0}}else{xa=f[C>>2]|0;ya=32-xa|0;da=32-ba|0;wa=la-ca<<da;if((ba|0)>(ya|0)){ja=wa>>>da;da=ba-ya|0;f[C>>2]=da;ya=f[D>>2]|ja>>>da;f[D>>2]=ya;da=f[E>>2]|0;if((da|0)==(f[F>>2]|0))Ci(G,D);else{f[da>>2]=ya;f[E>>2]=da+4}f[D>>2]=ja<<32-(f[C>>2]|0);break}ja=f[D>>2]|wa>>>xa;f[D>>2]=ja;wa=xa+ba|0;f[C>>2]=wa;if((wa|0)==32){wa=f[E>>2]|0;if((wa|0)==(f[F>>2]|0))Ci(G,D);else{f[wa>>2]=ja;f[E>>2]=wa+4}f[D>>2]=0;f[C>>2]=0}}while(0);ba=f[s>>2]|0;la=f[ba+(Z*12|0)>>2]|0;ka=la+(V<<2)|0;f[ka>>2]=(f[ka>>2]|0)+1;qg(ba+($*12|0)|0,la,f[ba+(Z*12|0)+4>>2]|0);if((na|0)!=(S|0)){ba=f[o>>2]|0;la=f[t>>2]|0;ka=ba-la>>2;wa=f[v>>2]|0;ja=f[l>>2]|0;if((((ka|0)==0?0:(ka*113|0)+-1|0)|0)==(ja+wa|0)){Jc(e);za=f[v>>2]|0;Aa=f[l>>2]|0;Ba=f[o>>2]|0;Ca=f[t>>2]|0}else{za=wa;Aa=ja;Ba=ba;Ca=la}la=Aa+za|0;if((Ba|0)==(Ca|0))Da=0;else Da=(f[Ca+(((la>>>0)/113|0)<<2)>>2]|0)+(((la>>>0)%113|0)*36|0)|0;f[Da>>2]=S;la=Da+4|0;f[la>>2]=r;f[la+4>>2]=x;f[Da+12>>2]=na;f[Da+16>>2]=i;f[Da+20>>2]=aa;f[Da+24>>2]=V;f[Da+28>>2]=U;f[Da+32>>2]=Z;f[l>>2]=(f[l>>2]|0)+1}if((W|0)!=(na|0)){la=f[o>>2]|0;ba=f[t>>2]|0;ja=la-ba>>2;wa=f[v>>2]|0;ka=f[l>>2]|0;if((((ja|0)==0?0:(ja*113|0)+-1|0)|0)==(ka+wa|0)){Jc(e);Ea=f[v>>2]|0;Fa=f[l>>2]|0;Ga=f[o>>2]|0;Ha=f[t>>2]|0}else{Ea=wa;Fa=ka;Ga=la;Ha=ba}ba=Fa+Ea|0;if((Ga|0)==(Ha|0))Ia=0;else Ia=(f[Ha+(((ba>>>0)/113|0)<<2)>>2]|0)+(((ba>>>0)%113|0)*36|0)|0;f[Ia>>2]=na;f[Ia+4>>2]=i;f[Ia+8>>2]=aa;f[Ia+12>>2]=W;ba=Ia+16|0;f[ba>>2]=p;f[ba+4>>2]=q;f[Ia+24>>2]=V;f[Ia+28>>2]=ca;f[Ia+32>>2]=$;ba=(f[l>>2]|0)+1|0;f[l>>2]=ba;Ja=ba}else fa=99}else fa=99;while(0);if((fa|0)==99){fa=0;Ja=f[l>>2]|0}if(!Ja)break;else Q=Ja}}Ja=f[t>>2]|0;Q=f[v>>2]|0;Ia=Ja+(((Q>>>0)/113|0)<<2)|0;q=f[o>>2]|0;p=q;i=Ja;if((q|0)==(Ja|0)){Ka=0;La=0}else{na=(f[Ia>>2]|0)+(((Q>>>0)%113|0)*36|0)|0;Ka=na;La=na}na=Ia;Ia=La;c:while(1){La=Ia;do{Q=La;if((Ka|0)==(Q|0))break c;La=Q+36|0}while((La-(f[na>>2]|0)|0)!=4068);La=na+4|0;na=La;Ia=f[La>>2]|0}f[l>>2]=0;l=p-i>>2;if(l>>>0>2){i=Ja;do{br(f[i>>2]|0);i=(f[t>>2]|0)+4|0;f[t>>2]=i;Ma=f[o>>2]|0;Na=Ma-i>>2}while(Na>>>0>2);Oa=Na;Pa=i;Qa=Ma}else{Oa=l;Pa=Ja;Qa=q}switch(Oa|0){case 1:{Ra=56;fa=113;break}case 2:{Ra=113;fa=113;break}default:{}}if((fa|0)==113)f[v>>2]=Ra;if((Pa|0)!=(Qa|0)){Ra=Pa;do{br(f[Ra>>2]|0);Ra=Ra+4|0}while((Ra|0)!=(Qa|0));Qa=f[t>>2]|0;t=f[o>>2]|0;if((t|0)!=(Qa|0))f[o>>2]=t+(~((t+-4-Qa|0)>>>2)<<2)}Qa=f[e>>2]|0;if(!Qa){u=d;return}br(Qa);u=d;return}function ib(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0;d=u;u=u+80|0;e=d+56|0;g=d+52|0;h=d+48|0;i=d+68|0;j=d;k=d+44|0;l=d+40|0;m=d+36|0;n=d+32|0;o=d+28|0;p=d+24|0;q=d+20|0;r=d+16|0;s=d+12|0;if(!(b[c+288>>0]|0)){Ne(e,f[c+8>>2]|0);t=c+12|0;v=f[e>>2]|0;f[e>>2]=0;w=f[t>>2]|0;f[t>>2]=v;if(w){ui(w);br(w);w=f[e>>2]|0;f[e>>2]=0;if(w|0){ui(w);br(w)}}else f[e>>2]=0}else{Mg(e,f[c+8>>2]|0);w=c+12|0;v=f[e>>2]|0;f[e>>2]=0;t=f[w>>2]|0;f[w>>2]=v;if(t){ui(t);br(t);t=f[e>>2]|0;f[e>>2]=0;if(t|0){ui(t);br(t)}}else f[e>>2]=0}t=c+12|0;v=f[t>>2]|0;if(v|0?(((f[v+4>>2]|0)-(f[v>>2]|0)>>2>>>0)/3|0|0)!=(f[v+40>>2]|0):0){w=c+200|0;f[c+264>>2]=c;x=c+4|0;Nh(((f[v+28>>2]|0)-(f[v+24>>2]|0)>>2)-(f[v+44>>2]|0)|0,f[(f[x>>2]|0)+44>>2]|0)|0;v=f[t>>2]|0;Nh((((f[v+4>>2]|0)-(f[v>>2]|0)>>2>>>0)/3|0)-(f[v+40>>2]|0)|0,f[(f[x>>2]|0)+44>>2]|0)|0;v=c+28|0;y=c+8|0;z=f[y>>2]|0;A=((f[z+100>>2]|0)-(f[z+96>>2]|0)|0)/12|0;b[e>>0]=0;Xg(v,A,e);A=f[t>>2]|0;z=(f[A+28>>2]|0)-(f[A+24>>2]|0)>>2;f[e>>2]=-1;Sf(c+52|0,z,e);z=c+40|0;A=f[z>>2]|0;B=c+44|0;C=f[B>>2]|0;if((C|0)!=(A|0))f[B>>2]=C+(~((C+-4-A|0)>>>2)<<2);A=f[t>>2]|0;C=(f[A+4>>2]|0)-(f[A>>2]|0)>>2;$j(z,C-((C>>>0)%3|0)|0);C=c+84|0;z=f[t>>2]|0;A=(f[z+28>>2]|0)-(f[z+24>>2]|0)>>2;b[e>>0]=0;Xg(C,A,e);A=c+96|0;z=f[A>>2]|0;B=c+100|0;D=f[B>>2]|0;if((D|0)!=(z|0))f[B>>2]=D+(~((D+-4-z|0)>>>2)<<2);f[c+164>>2]=-1;z=c+168|0;f[z>>2]=0;D=f[c+108>>2]|0;E=c+112|0;F=f[E>>2]|0;if((F|0)!=(D|0))f[E>>2]=F+(~(((F+-12-D|0)>>>0)/12|0)*12|0);D=c+132|0;if(f[D>>2]|0){F=c+128|0;E=f[F>>2]|0;if(E|0){G=E;do{E=G;G=f[G>>2]|0;br(E)}while((G|0)!=0)}f[F>>2]=0;F=f[c+124>>2]|0;if(F|0){G=c+120|0;E=0;do{f[(f[G>>2]|0)+(E<<2)>>2]=0;E=E+1|0}while((E|0)!=(F|0))}f[D>>2]=0}f[c+144>>2]=0;D=f[t>>2]|0;F=(f[D+28>>2]|0)-(f[D+24>>2]|0)>>2;f[e>>2]=-1;Sf(c+152|0,F,e);F=c+72|0;D=f[F>>2]|0;E=c+76|0;G=f[E>>2]|0;if((G|0)!=(D|0))f[E>>2]=G+(~((G+-4-D|0)>>>2)<<2);D=f[t>>2]|0;$j(F,((f[D+4>>2]|0)-(f[D>>2]|0)>>2>>>0)/3|0);f[c+64>>2]=0;if(!(oe(c)|0)){D=dn(32)|0;f[e>>2]=D;f[e+8>>2]=-2147483616;f[e+4>>2]=29;H=D;I=13227;J=H+29|0;do{b[H>>0]=b[I>>0]|0;H=H+1|0;I=I+1|0}while((H|0)<(J|0));b[D+29>>0]=0;f[a>>2]=-1;dj(a+4|0,e);if((b[e+11>>0]|0)<0)br(f[e>>2]|0);u=d;return}if(!(ch(c)|0)){D=dn(48)|0;f[e>>2]=D;f[e+8>>2]=-2147483600;f[e+4>>2]=36;H=D;I=13257;J=H+36|0;do{b[H>>0]=b[I>>0]|0;H=H+1|0;I=I+1|0}while((H|0)<(J|0));b[D+36>>0]=0;f[a>>2]=-1;dj(a+4|0,e);if((b[e+11>>0]|0)<0)br(f[e>>2]|0);u=d;return}D=c+172|0;G=c+176|0;K=(((f[G>>2]|0)-(f[D>>2]|0)|0)/136|0)&255;b[i>>0]=K;L=f[(f[x>>2]|0)+44>>2]|0;M=L+16|0;N=f[M+4>>2]|0;if((N|0)>0|(N|0)==0&(f[M>>2]|0)>>>0>0)O=K;else{f[g>>2]=f[L+4>>2];f[e>>2]=f[g>>2];ye(L,e,i,i+1|0)|0;O=b[i>>0]|0}i=c+284|0;f[i>>2]=O&255;O=f[t>>2]|0;L=(f[O+4>>2]|0)-(f[O>>2]|0)|0;O=L>>2;Ti(w);f[j>>2]=0;K=j+4|0;f[K>>2]=0;f[j+8>>2]=0;a:do if((L|0)>0){M=c+104|0;N=j+8|0;P=0;b:while(1){Q=(P>>>0)/3|0;R=Q>>>5;S=1<<(Q&31);if((f[(f[v>>2]|0)+(R<<2)>>2]&S|0)==0?(T=f[t>>2]|0,f[k>>2]=Q,f[e>>2]=f[k>>2],!(Rj(T,e)|0)):0){f[g>>2]=0;f[l>>2]=Q;f[e>>2]=f[l>>2];Q=gg(c,e,g)|0;Vi(w,Q);T=f[g>>2]|0;U=(T|0)==-1;do if(Q){do if(U){V=-1;W=-1;X=-1}else{Y=f[f[t>>2]>>2]|0;Z=f[Y+(T<<2)>>2]|0;_=T+1|0;$=((_>>>0)%3|0|0)==0?T+-2|0:_;if(($|0)==-1)aa=-1;else aa=f[Y+($<<2)>>2]|0;$=(((T>>>0)%3|0|0)==0?2:-1)+T|0;if(($|0)==-1){V=-1;W=aa;X=Z;break}V=f[Y+($<<2)>>2]|0;W=aa;X=Z}while(0);Z=f[C>>2]|0;$=Z+(X>>>5<<2)|0;f[$>>2]=f[$>>2]|1<<(X&31);$=Z+(W>>>5<<2)|0;f[$>>2]=f[$>>2]|1<<(W&31);$=Z+(V>>>5<<2)|0;f[$>>2]=f[$>>2]|1<<(V&31);f[e>>2]=1;$=f[B>>2]|0;if($>>>0<(f[M>>2]|0)>>>0){f[$>>2]=1;f[B>>2]=$+4}else Ci(A,e);$=(f[v>>2]|0)+(R<<2)|0;f[$>>2]=f[$>>2]|S;$=T+1|0;if(U)ba=-1;else ba=(($>>>0)%3|0|0)==0?T+-2|0:$;f[e>>2]=ba;Z=f[K>>2]|0;if(Z>>>0<(f[N>>2]|0)>>>0){f[Z>>2]=ba;f[K>>2]=Z+4}else Ci(j,e);if(U)break;Z=(($>>>0)%3|0|0)==0?T+-2|0:$;if((Z|0)==-1)break;$=f[(f[(f[t>>2]|0)+12>>2]|0)+(Z<<2)>>2]|0;Z=($|0)==-1;Y=Z?-1:($>>>0)/3|0;if(Z)break;if(f[(f[v>>2]|0)+(Y>>>5<<2)>>2]&1<<(Y&31)|0)break;f[m>>2]=$;f[e>>2]=f[m>>2];if(!(hc(c,e)|0)){ca=65;break b}}else{$=T+1|0;if(U)da=-1;else da=(($>>>0)%3|0|0)==0?T+-2|0:$;f[n>>2]=da;f[e>>2]=f[n>>2];Ce(c,e,1)|0;f[o>>2]=f[g>>2];f[e>>2]=f[o>>2];if(!(hc(c,e)|0)){ca=71;break b}}while(0)}P=P+1|0;if((P|0)>=(O|0)){ca=77;break a}}if((ca|0)==65){f[e>>2]=0;f[e+4>>2]=0;f[e+8>>2]=0;P=dn(48)|0;f[e>>2]=P;f[e+8>>2]=-2147483600;f[e+4>>2]=32;H=P;I=13294;J=H+32|0;do{b[H>>0]=b[I>>0]|0;H=H+1|0;I=I+1|0}while((H|0)<(J|0));b[P+32>>0]=0;f[a>>2]=-1;dj(a+4|0,e);if((b[e+11>>0]|0)<0)br(f[e>>2]|0)}else if((ca|0)==71){f[e>>2]=0;f[e+4>>2]=0;f[e+8>>2]=0;N=dn(48)|0;f[e>>2]=N;f[e+8>>2]=-2147483600;f[e+4>>2]=32;H=N;I=13294;J=H+32|0;do{b[H>>0]=b[I>>0]|0;H=H+1|0;I=I+1|0}while((H|0)<(J|0));b[N+32>>0]=0;f[a>>2]=-1;dj(a+4|0,e);if((b[e+11>>0]|0)<0)br(f[e>>2]|0)}}else ca=77;while(0);do if((ca|0)==77){O=f[F>>2]|0;o=f[E>>2]|0;n=o;if((O|0)!=(o|0)?(da=o+-4|0,O>>>0<da>>>0):0){o=O;O=da;do{da=f[o>>2]|0;f[o>>2]=f[O>>2];f[O>>2]=da;o=o+4|0;O=O+-4|0}while(o>>>0<O>>>0)}f[p>>2]=n;f[q>>2]=f[j>>2];f[r>>2]=f[K>>2];f[h>>2]=f[p>>2];f[g>>2]=f[q>>2];f[e>>2]=f[r>>2];Md(F,h,g,e)|0;if((f[G>>2]|0)!=(f[D>>2]|0)?(O=f[y>>2]|0,o=((f[O+100>>2]|0)-(f[O+96>>2]|0)|0)/12|0,b[e>>0]=0,Xg(v,o,e),o=f[F>>2]|0,O=f[E>>2]|0,(o|0)!=(O|0)):0){N=o;do{f[s>>2]=f[N>>2];f[e>>2]=f[s>>2];ue(c,e)|0;N=N+4|0}while((N|0)!=(O|0))}_g(w);O=c+232|0;fd(w,O);N=c+280|0;n=f[N>>2]|0;if((n|0?(f[i>>2]|0)>0:0)?(fd(n,O),(f[i>>2]|0)>1):0){n=1;do{fd((f[N>>2]|0)+(n<<5)|0,O);n=n+1|0}while((n|0)<(f[i>>2]|0))}Nh((f[c+272>>2]|0)-(f[c+268>>2]|0)>>2,f[(f[x>>2]|0)+44>>2]|0)|0;Nh(f[z>>2]|0,f[(f[x>>2]|0)+44>>2]|0)|0;if(Jg(c)|0){n=f[(f[x>>2]|0)+44>>2]|0;N=f[O>>2]|0;o=n+16|0;da=f[o+4>>2]|0;if(!((da|0)>0|(da|0)==0&(f[o>>2]|0)>>>0>0)){o=(f[c+236>>2]|0)-N|0;f[g>>2]=f[n+4>>2];f[e>>2]=f[g>>2];ye(n,e,N,N+o|0)|0}f[a>>2]=0;f[a+4>>2]=0;f[a+8>>2]=0;f[a+12>>2]=0;break}else{f[e>>2]=0;f[e+4>>2]=0;f[e+8>>2]=0;o=dn(32)|0;f[e>>2]=o;f[e+8>>2]=-2147483616;f[e+4>>2]=28;H=o;I=13327;J=H+28|0;do{b[H>>0]=b[I>>0]|0;H=H+1|0;I=I+1|0}while((H|0)<(J|0));b[o+28>>0]=0;f[a>>2]=-1;dj(a+4|0,e);if((b[e+11>>0]|0)<0)br(f[e>>2]|0);break}}while(0);g=f[j>>2]|0;if(g|0){j=f[K>>2]|0;if((j|0)!=(g|0))f[K>>2]=j+(~((j+-4-g|0)>>>2)<<2);br(g)}u=d;return}g=dn(32)|0;f[e>>2]=g;f[e+8>>2]=-2147483616;f[e+4>>2]=29;H=g;I=13197;J=H+29|0;do{b[H>>0]=b[I>>0]|0;H=H+1|0;I=I+1|0}while((H|0)<(J|0));b[g+29>>0]=0;f[a>>2]=-1;dj(a+4|0,e);if((b[e+11>>0]|0)<0)br(f[e>>2]|0);u=d;return}function jb(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,Y=0,Z=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ja=0,Ka=0,La=0,Ma=0,Na=0;d=u;u=u+48|0;e=d+36|0;g=d+24|0;h=d;i=a+8|0;j=f[i>>2]|0;f[e>>2]=0;k=e+4|0;f[k>>2]=0;f[e+8>>2]=0;do if(j)if(j>>>0>1073741823)mq(e);else{l=j<<2;m=dn(l)|0;f[e>>2]=m;n=m+(j<<2)|0;f[e+8>>2]=n;hj(m|0,0,l|0)|0;f[k>>2]=n;o=n;p=m;break}else{o=0;p=0}while(0);m=a+1164|0;n=f[m>>2]|0;l=f[n>>2]|0;q=n+4|0;if(!l){r=n+8|0;s=p;t=o;v=j}else{j=f[q>>2]|0;if((j|0)!=(l|0))f[q>>2]=j+(~((j+-4-l|0)>>>2)<<2);br(l);l=n+8|0;f[l>>2]=0;f[q>>2]=0;f[n>>2]=0;r=l;s=f[e>>2]|0;t=f[k>>2]|0;v=f[i>>2]|0}f[n>>2]=s;f[q>>2]=t;f[r>>2]=f[e+8>>2];f[e>>2]=0;r=e+4|0;f[r>>2]=0;f[e+8>>2]=0;do if(v)if(v>>>0>1073741823)mq(e);else{t=v<<2;q=dn(t)|0;f[e>>2]=q;s=q+(v<<2)|0;f[e+8>>2]=s;hj(q|0,0,t|0)|0;f[r>>2]=s;w=s;x=q;break}else{w=0;x=0}while(0);v=a+1176|0;q=f[v>>2]|0;s=f[q>>2]|0;t=q+4|0;if(!s){y=q+8|0;z=x;A=w}else{w=f[t>>2]|0;if((w|0)!=(s|0))f[t>>2]=w+(~((w+-4-s|0)>>>2)<<2);br(s);s=q+8|0;f[s>>2]=0;f[t>>2]=0;f[q>>2]=0;y=s;z=f[e>>2]|0;A=f[r>>2]|0}f[q>>2]=z;f[t>>2]=A;f[y>>2]=f[e+8>>2];y=f[b>>2]|0;A=b+4|0;t=f[A>>2]|0;z=f[A+4>>2]|0;A=f[c>>2]|0;q=c+4|0;r=f[q>>2]|0;s=f[q+4>>2]|0;f[h>>2]=0;f[h+4>>2]=0;f[h+8>>2]=0;f[h+12>>2]=0;f[h+16>>2]=0;f[h+20>>2]=0;q=h+8|0;w=h+4|0;x=h+16|0;n=h+20|0;k=t;Jc(h);l=f[w>>2]|0;j=(f[n>>2]|0)+(f[x>>2]|0)|0;if((f[q>>2]|0)==(l|0))B=0;else B=(f[l+(((j>>>0)/113|0)<<2)>>2]|0)+(((j>>>0)%113|0)*36|0)|0;f[B>>2]=y;j=B+4|0;f[j>>2]=t;f[j+4>>2]=z;f[B+12>>2]=A;j=B+16|0;f[j>>2]=r;f[j+4>>2]=s;f[B+24>>2]=0;f[B+28>>2]=A-y;f[B+32>>2]=0;B=(f[n>>2]|0)+1|0;f[n>>2]=B;if(B|0){y=a+1152|0;A=a+1084|0;j=a+1080|0;l=a+1072|0;o=a+1076|0;p=a+1068|0;C=b+8|0;D=c+8|0;E=a+1124|0;F=a+1120|0;G=a+1112|0;H=a+1116|0;I=a+1108|0;J=k+4|0;K=k+24|0;L=k+24|0;M=r+24|0;N=B;while(1){B=f[x>>2]|0;O=N+-1|0;P=O+B|0;Q=f[w>>2]|0;R=f[Q+(((P>>>0)/113|0)<<2)>>2]|0;S=(P>>>0)%113|0;P=f[R+(S*36|0)>>2]|0;T=f[R+(S*36|0)+12>>2]|0;U=f[R+(S*36|0)+24>>2]|0;V=f[R+(S*36|0)+32>>2]|0;f[n>>2]=O;O=f[q>>2]|0;S=O-Q>>2;if((1-N-B+((S|0)==0?0:(S*113|0)+-1|0)|0)>>>0>225){br(f[O+-4>>2]|0);f[q>>2]=(f[q>>2]|0)+-4}f[b>>2]=P;f[c>>2]=T;O=f[m>>2]|0;S=O+(V*12|0)|0;B=(f[v>>2]|0)+(V*12|0)|0;f[g>>2]=f[b>>2];f[g+4>>2]=f[b+4>>2];f[g+8>>2]=f[b+8>>2];f[e>>2]=f[c>>2];f[e+4>>2]=f[c+4>>2];f[e+8>>2]=f[c+8>>2];Q=Gd(a,g,e,S,B,U)|0;U=T-P|0;R=(f[a>>2]|0)-(f[(f[B>>2]|0)+(Q<<2)>>2]|0)|0;a:do if(R){if(U>>>0<3){W=f[y>>2]|0;f[W>>2]=Q;Y=f[i>>2]|0;if(Y>>>0>1){Z=1;$=Y;aa=Q;while(1){aa=(aa|0)==($+-1|0)?0:aa+1|0;f[W+(Z<<2)>>2]=aa;Z=Z+1|0;ba=f[i>>2]|0;if(Z>>>0>=ba>>>0){ca=ba;break}else $=ba}}else ca=Y;if(!U){da=87;break}else{ea=0;fa=ca}while(1){$=(f[K>>2]|0)+((X(f[J>>2]|0,P+ea|0)|0)<<2)|0;if(!fa)ga=0;else{Z=0;do{aa=f[(f[y>>2]|0)+(Z<<2)>>2]|0;W=(f[a>>2]|0)-(f[(f[B>>2]|0)+(aa<<2)>>2]|0)|0;do if(W|0){ba=f[A>>2]|0;ha=32-ba|0;ia=32-W|0;ja=f[$+(aa<<2)>>2]<<ia;if((W|0)>(ha|0)){ka=ja>>>ia;ia=W-ha|0;f[A>>2]=ia;ha=f[j>>2]|ka>>>ia;f[j>>2]=ha;ia=f[l>>2]|0;if((ia|0)==(f[o>>2]|0))Ci(p,j);else{f[ia>>2]=ha;f[l>>2]=ia+4}f[j>>2]=ka<<32-(f[A>>2]|0);break}ka=f[j>>2]|ja>>>ba;f[j>>2]=ka;ja=ba+W|0;f[A>>2]=ja;if((ja|0)!=32)break;ja=f[l>>2]|0;if((ja|0)==(f[o>>2]|0))Ci(p,j);else{f[ja>>2]=ka;f[l>>2]=ja+4}f[j>>2]=0;f[A>>2]=0}while(0);Z=Z+1|0;W=f[i>>2]|0}while(Z>>>0<W>>>0);ga=W}ea=ea+1|0;if(ea>>>0>=U>>>0){da=87;break a}else fa=ga}}Y=V+1|0;Z=f[m>>2]|0;$=Z+(Y*12|0)|0;if(($|0)==(S|0))la=Z;else{qg($,f[S>>2]|0,f[O+(V*12|0)+4>>2]|0);la=f[m>>2]|0}$=(f[la+(Y*12|0)>>2]|0)+(Q<<2)|0;Z=(f[$>>2]|0)+(1<<R+-1)|0;f[$>>2]=Z;$=f[C>>2]|0;W=f[D>>2]|0;b:do if((T|0)==(P|0))ma=P;else{aa=f[L>>2]|0;if(!$){if((f[aa+(Q<<2)>>2]|0)>>>0<Z>>>0){ma=T;break}else{na=T;oa=P}while(1){ja=na;do{ja=ja+-1|0;if((oa|0)==(ja|0)){ma=oa;break b}ka=(f[M>>2]|0)+((X(ja,W)|0)<<2)+(Q<<2)|0}while((f[ka>>2]|0)>>>0>=Z>>>0);oa=oa+1|0;if((oa|0)==(ja|0)){ma=ja;break b}else na=ja}}else{pa=T;qa=P}while(1){ka=qa;while(1){ra=aa+((X(ka,$)|0)<<2)|0;if((f[ra+(Q<<2)>>2]|0)>>>0>=Z>>>0){sa=pa;break}ba=ka+1|0;if((ba|0)==(pa|0)){ma=pa;break b}else ka=ba}while(1){sa=sa+-1|0;if((ka|0)==(sa|0)){ma=ka;break b}ta=(f[M>>2]|0)+((X(sa,W)|0)<<2)|0;if((f[ta+(Q<<2)>>2]|0)>>>0<Z>>>0){ua=0;break}}do{ja=ra+(ua<<2)|0;ba=ta+(ua<<2)|0;ia=f[ja>>2]|0;f[ja>>2]=f[ba>>2];f[ba>>2]=ia;ua=ua+1|0}while((ua|0)!=($|0));qa=ka+1|0;if((qa|0)==(sa|0)){ma=sa;break}else pa=sa}}while(0);Z=(_(U|0)|0)^31;W=ma-P|0;aa=T-ma|0;ia=W>>>0<aa>>>0;if((W|0)!=(aa|0)){ba=f[E>>2]|0;if(ia)f[F>>2]=f[F>>2]|1<<31-ba;ja=ba+1|0;f[E>>2]=ja;if((ja|0)==32){ja=f[G>>2]|0;if((ja|0)==(f[H>>2]|0))Ci(I,F);else{f[ja>>2]=f[F>>2];f[G>>2]=ja+4}f[E>>2]=0;f[F>>2]=0}}ja=U>>>1;if(ia){ia=ja-W|0;if(Z|0){ba=0;ha=1<<Z+-1;while(1){Vi(a+12+(ba<<5)|0,(ha&ia|0)!=0);ba=ba+1|0;if((ba|0)==(Z|0))break;else ha=ha>>>1}}}else{ha=ja-aa|0;if(Z|0){ba=0;ia=1<<Z+-1;while(1){Vi(a+12+(ba<<5)|0,(ia&ha|0)!=0);ba=ba+1|0;if((ba|0)==(Z|0))break;else ia=ia>>>1}}}ia=f[v>>2]|0;Z=f[ia+(V*12|0)>>2]|0;ba=Z+(Q<<2)|0;f[ba>>2]=(f[ba>>2]|0)+1;qg(ia+(Y*12|0)|0,Z,f[ia+(V*12|0)+4>>2]|0);if((ma|0)!=(P|0)){ia=f[q>>2]|0;Z=f[w>>2]|0;ba=ia-Z>>2;ha=f[x>>2]|0;ja=f[n>>2]|0;if((((ba|0)==0?0:(ba*113|0)+-1|0)|0)==(ja+ha|0)){Jc(h);va=f[x>>2]|0;wa=f[n>>2]|0;xa=f[q>>2]|0;ya=f[w>>2]|0}else{va=ha;wa=ja;xa=ia;ya=Z}Z=wa+va|0;if((xa|0)==(ya|0))za=0;else za=(f[ya+(((Z>>>0)/113|0)<<2)>>2]|0)+(((Z>>>0)%113|0)*36|0)|0;f[za>>2]=P;Z=za+4|0;f[Z>>2]=t;f[Z+4>>2]=z;f[za+12>>2]=ma;f[za+16>>2]=k;f[za+20>>2]=$;f[za+24>>2]=Q;f[za+28>>2]=W;f[za+32>>2]=V;f[n>>2]=(f[n>>2]|0)+1}if((T|0)!=(ma|0)){Z=f[q>>2]|0;ia=f[w>>2]|0;ja=Z-ia>>2;ha=f[x>>2]|0;ba=f[n>>2]|0;if((((ja|0)==0?0:(ja*113|0)+-1|0)|0)==(ba+ha|0)){Jc(h);Aa=f[x>>2]|0;Ba=f[n>>2]|0;Ca=f[q>>2]|0;Da=f[w>>2]|0}else{Aa=ha;Ba=ba;Ca=Z;Da=ia}ia=Ba+Aa|0;if((Ca|0)==(Da|0))Ea=0;else Ea=(f[Da+(((ia>>>0)/113|0)<<2)>>2]|0)+(((ia>>>0)%113|0)*36|0)|0;f[Ea>>2]=ma;f[Ea+4>>2]=k;f[Ea+8>>2]=$;f[Ea+12>>2]=T;ia=Ea+16|0;f[ia>>2]=r;f[ia+4>>2]=s;f[Ea+24>>2]=Q;f[Ea+28>>2]=aa;f[Ea+32>>2]=Y;ia=(f[n>>2]|0)+1|0;f[n>>2]=ia;Fa=ia}else da=87}else da=87;while(0);if((da|0)==87){da=0;Fa=f[n>>2]|0}if(!Fa)break;else N=Fa}}Fa=f[w>>2]|0;N=f[x>>2]|0;Ea=Fa+(((N>>>0)/113|0)<<2)|0;s=f[q>>2]|0;r=s;k=Fa;if((s|0)==(Fa|0)){Ga=0;Ha=0}else{ma=(f[Ea>>2]|0)+(((N>>>0)%113|0)*36|0)|0;Ga=ma;Ha=ma}ma=Ea;Ea=Ha;c:while(1){Ha=Ea;do{N=Ha;if((Ga|0)==(N|0))break c;Ha=N+36|0}while((Ha-(f[ma>>2]|0)|0)!=4068);Ha=ma+4|0;ma=Ha;Ea=f[Ha>>2]|0}f[n>>2]=0;n=r-k>>2;if(n>>>0>2){k=Fa;do{br(f[k>>2]|0);k=(f[w>>2]|0)+4|0;f[w>>2]=k;Ia=f[q>>2]|0;Ja=Ia-k>>2}while(Ja>>>0>2);Ka=Ja;La=k;Ma=Ia}else{Ka=n;La=Fa;Ma=s}switch(Ka|0){case 1:{Na=56;da=101;break}case 2:{Na=113;da=101;break}default:{}}if((da|0)==101)f[x>>2]=Na;if((La|0)!=(Ma|0)){Na=La;do{br(f[Na>>2]|0);Na=Na+4|0}while((Na|0)!=(Ma|0));Ma=f[w>>2]|0;w=f[q>>2]|0;if((w|0)!=(Ma|0))f[q>>2]=w+(~((w+-4-Ma|0)>>>2)<<2)}Ma=f[h>>2]|0;if(!Ma){u=d;return}br(Ma);u=d;return}function kb(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,Y=0,Z=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ja=0,Ka=0,La=0;d=u;u=u+1424|0;e=d+1408|0;g=d+1396|0;h=d+1420|0;i=d+1200|0;j=d+12|0;k=d;l=d+1384|0;m=d+1372|0;n=d+1360|0;o=d+1348|0;p=d+1336|0;q=d+1324|0;r=d+1312|0;s=d+1300|0;t=d+1288|0;v=d+1276|0;w=d+1264|0;x=d+1252|0;y=d+1240|0;z=d+1228|0;A=a+28|0;B=10-(Yh(f[(f[A>>2]|0)+48>>2]|0)|0)|0;C=(B|0)<6?B:6;b[h>>0]=C;if((C&255|0)==6?(f[a+72>>2]|0)>15:0)b[h>>0]=5;C=c+16|0;B=f[C+4>>2]|0;if(!((B|0)>0|(B|0)==0&(f[C>>2]|0)>>>0>0)){f[g>>2]=f[c+4>>2];f[e>>2]=f[g>>2];ye(c,e,h,h+1|0)|0}C=f[A>>2]|0;B=f[(f[C+4>>2]|0)+80>>2]|0;D=a+72|0;E=f[D>>2]|0;f[i>>2]=B;F=i+4|0;f[F>>2]=E;f[i+8>>2]=E<<2;G=i+12|0;H=X(E,B)|0;f[G>>2]=0;J=i+16|0;f[J>>2]=0;f[i+20>>2]=0;do if(H)if(H>>>0>1073741823)mq(G);else{K=H<<2;L=dn(K)|0;f[G>>2]=L;M=L+(H<<2)|0;f[i+20>>2]=M;hj(L|0,0,K|0)|0;f[J>>2]=M;N=L;break}else N=0;while(0);H=i+24|0;f[H>>2]=N;G=a+4|0;L=a+8|0;M=f[G>>2]|0;a:do if((f[L>>2]|0)!=(M|0)){K=j+4|0;O=j+8|0;P=j+8|0;Q=(B|0)==0;R=j+4|0;S=j+8|0;T=k+4|0;U=k+8|0;V=k+8|0;W=a+48|0;Y=j+8|0;Z=a+60|0;$=0;aa=0;ba=0;ca=0;da=M;ea=C;b:while(1){fa=f[(f[(f[ea+4>>2]|0)+8>>2]|0)+(f[da+(ca<<2)>>2]<<2)>>2]|0;switch(f[fa+28>>2]|0){case 1:case 3:case 5:case 2:case 4:case 6:{ga=fa;ha=aa;break}case 9:{ga=f[(f[Z>>2]|0)+(aa<<2)>>2]|0;ha=aa+1|0;break}default:{ia=0;break a}}if(!ga){ia=0;break a}c:do switch(f[ga+28>>2]|0){case 6:{if(Q){ja=ba;ka=ga+24|0;break c}fa=ga+84|0;la=ga+68|0;ma=ga+48|0;na=ga+40|0;oa=ga+24|0;pa=0;do{if(!(b[fa>>0]|0))qa=f[(f[la>>2]|0)+(pa<<2)>>2]|0;else qa=pa;ra=ma;sa=f[ra>>2]|0;ta=f[ra+4>>2]|0;ra=na;ua=on(f[ra>>2]|0,f[ra+4>>2]|0,qa|0,0)|0;ra=Tn(ua|0,I|0,sa|0,ta|0)|0;Rg((f[H>>2]|0)+((X(f[F>>2]|0,pa)|0)<<2)+($<<2)|0,(f[f[ga>>2]>>2]|0)+ra|0,b[oa>>0]<<2|0)|0;pa=pa+1|0}while((pa|0)!=(B|0));ja=ba;ka=oa;break}case 1:case 3:case 5:{oa=ga+24|0;pa=b[oa>>0]|0;na=pa<<24>>24;f[j>>2]=0;f[R>>2]=0;f[S>>2]=0;if(!(pa<<24>>24))va=0;else{if(pa<<24>>24<0){wa=24;break b}pa=na<<2;ma=dn(pa)|0;f[j>>2]=ma;la=ma+(na<<2)|0;f[Y>>2]=la;hj(ma|0,0,pa|0)|0;f[R>>2]=la;va=b[oa>>0]|0}la=va<<24>>24;f[k>>2]=0;f[T>>2]=0;f[U>>2]=0;if(!(va<<24>>24)){xa=0;ya=0}else{if(va<<24>>24<0){wa=30;break b}pa=la<<2;ma=dn(pa)|0;f[k>>2]=ma;na=ma+(la<<2)|0;f[V>>2]=na;hj(ma|0,0,pa|0)|0;f[T>>2]=na;xa=ma;ya=ma}if(Q){za=ya;Aa=xa}else{ma=ga+84|0;na=ga+68|0;pa=0;do{if(!(b[ma>>0]|0))Ba=f[(f[na>>2]|0)+(pa<<2)>>2]|0;else Ba=pa;la=f[j>>2]|0;f[g>>2]=Ba;fa=b[oa>>0]|0;f[e>>2]=f[g>>2];Pb(ga,e,fa,la)|0;la=b[oa>>0]|0;fa=la<<24>>24;if(la<<24>>24>0){la=f[j>>2]|0;ra=f[W>>2]|0;ta=f[k>>2]|0;sa=0;do{f[ta+(sa<<2)>>2]=(f[la+(sa<<2)>>2]|0)-(f[ra+(sa+ba<<2)>>2]|0);sa=sa+1|0}while((sa|0)<(fa|0));Ca=ta}else Ca=f[k>>2]|0;Rg((f[H>>2]|0)+((X(f[F>>2]|0,pa)|0)<<2)+($<<2)|0,Ca|0,fa<<2|0)|0;pa=pa+1|0}while(pa>>>0<B>>>0);pa=f[k>>2]|0;za=pa;Aa=pa}pa=ba+(b[oa>>0]|0)|0;if(za|0){na=f[T>>2]|0;if((na|0)!=(za|0))f[T>>2]=na+(~((na+-4-za|0)>>>2)<<2);br(Aa)}na=f[j>>2]|0;if(na|0){ma=f[R>>2]|0;if((ma|0)!=(na|0))f[R>>2]=ma+(~((ma+-4-na|0)>>>2)<<2);br(na)}ja=pa;ka=oa;break}default:{pa=ga+24|0;na=b[pa>>0]|0;ma=na<<24>>24;f[j>>2]=0;f[K>>2]=0;f[O>>2]=0;if(!(na<<24>>24)){Da=0;Ea=0}else{if(na<<24>>24<0){wa=53;break b}na=ma<<2;ta=dn(na)|0;f[j>>2]=ta;sa=ta+(ma<<2)|0;f[P>>2]=sa;hj(ta|0,0,na|0)|0;f[K>>2]=sa;Da=ta;Ea=ta}if(Q){Fa=Ea;Ga=Da}else{ta=ga+84|0;sa=ga+68|0;na=0;do{if(!(b[ta>>0]|0))Ha=f[(f[sa>>2]|0)+(na<<2)>>2]|0;else Ha=na;ma=f[j>>2]|0;f[g>>2]=Ha;ra=b[pa>>0]|0;f[e>>2]=f[g>>2];Ob(ga,e,ra,ma)|0;Rg((f[H>>2]|0)+((X(f[F>>2]|0,na)|0)<<2)+($<<2)|0,f[j>>2]|0,b[pa>>0]<<2|0)|0;na=na+1|0}while(na>>>0<B>>>0);na=f[j>>2]|0;Fa=na;Ga=na}if(Fa|0){na=f[K>>2]|0;if((na|0)!=(Fa|0))f[K>>2]=na+(~((na+-4-Fa|0)>>>2)<<2);br(Ga)}ja=ba;ka=pa}}while(0);na=ca+1|0;sa=f[G>>2]|0;if(na>>>0>=(f[L>>2]|0)-sa>>2>>>0){wa=66;break}$=$+(b[ka>>0]|0)|0;aa=ha;ba=ja;ca=na;da=sa;ea=f[A>>2]|0}if((wa|0)==24)mq(j);else if((wa|0)==30)mq(k);else if((wa|0)==53)mq(j);else if((wa|0)==66){Ia=f[D>>2]|0;Ja=f[H>>2]|0;wa=67;break}}else{Ia=E;Ja=N;wa=67}while(0);d:do if((wa|0)==67){N=X(Ia,B)|0;if((N|0)>0){E=0;H=0;while(1){D=f[Ja+(E<<2)>>2]|0;if(!D)Ka=H;else{A=(_(D|0)|0)^31;Ka=(A|0)<(H|0)?H:A+1|0}E=E+1|0;if((E|0)>=(N|0)){La=Ka;break}else H=Ka}}else La=0;switch(b[h>>0]|0){case 6:{Ge(j,Ia);f[l>>2]=0;f[l+4>>2]=i;H=f[F>>2]|0;f[l+8>>2]=H;f[m>>2]=f[i>>2];f[m+4>>2]=i;f[m+8>>2]=H;f[k>>2]=La;f[g>>2]=f[l>>2];f[g+4>>2]=f[l+4>>2];f[g+8>>2]=f[l+8>>2];f[e>>2]=f[m>>2];f[e+4>>2]=f[m+4>>2];f[e+8>>2]=f[m+8>>2];H=ff(j,g,e,k,c)|0;Ee(j);if(!H){ia=0;break d}break}case 5:{Ge(j,Ia);f[n>>2]=0;f[n+4>>2]=i;H=f[F>>2]|0;f[n+8>>2]=H;f[o>>2]=f[i>>2];f[o+4>>2]=i;f[o+8>>2]=H;f[k>>2]=La;f[g>>2]=f[n>>2];f[g+4>>2]=f[n+4>>2];f[g+8>>2]=f[n+8>>2];f[e>>2]=f[o>>2];f[e+4>>2]=f[o+4>>2];f[e+8>>2]=f[o+8>>2];H=gf(j,g,e,k,c)|0;Ee(j);if(!H){ia=0;break d}break}case 4:{Ge(j,Ia);f[p>>2]=0;f[p+4>>2]=i;H=f[F>>2]|0;f[p+8>>2]=H;f[q>>2]=f[i>>2];f[q+4>>2]=i;f[q+8>>2]=H;f[k>>2]=La;f[g>>2]=f[p>>2];f[g+4>>2]=f[p+4>>2];f[g+8>>2]=f[p+8>>2];f[e>>2]=f[q>>2];f[e+4>>2]=f[q+4>>2];f[e+8>>2]=f[q+8>>2];H=gf(j,g,e,k,c)|0;Ee(j);if(!H){ia=0;break d}break}case 3:{Oe(j,Ia);f[r>>2]=0;f[r+4>>2]=i;H=f[F>>2]|0;f[r+8>>2]=H;f[s>>2]=f[i>>2];f[s+4>>2]=i;f[s+8>>2]=H;f[k>>2]=La;f[g>>2]=f[r>>2];f[g+4>>2]=f[r+4>>2];f[g+8>>2]=f[r+8>>2];f[e>>2]=f[s>>2];f[e+4>>2]=f[s+4>>2];f[e+8>>2]=f[s+8>>2];H=mf(j,g,e,k,c)|0;Ue(j);if(!H){ia=0;break d}break}case 2:{Oe(j,Ia);f[t>>2]=0;f[t+4>>2]=i;H=f[F>>2]|0;f[t+8>>2]=H;f[v>>2]=f[i>>2];f[v+4>>2]=i;f[v+8>>2]=H;f[k>>2]=La;f[g>>2]=f[t>>2];f[g+4>>2]=f[t+4>>2];f[g+8>>2]=f[t+8>>2];f[e>>2]=f[v>>2];f[e+4>>2]=f[v+4>>2];f[e+8>>2]=f[v+8>>2];H=mf(j,g,e,k,c)|0;Ue(j);if(!H){ia=0;break d}break}case 1:{Pe(j,Ia);f[w>>2]=0;f[w+4>>2]=i;H=f[F>>2]|0;f[w+8>>2]=H;f[x>>2]=f[i>>2];f[x+4>>2]=i;f[x+8>>2]=H;f[k>>2]=La;f[g>>2]=f[w>>2];f[g+4>>2]=f[w+4>>2];f[g+8>>2]=f[w+8>>2];f[e>>2]=f[x>>2];f[e+4>>2]=f[x+4>>2];f[e+8>>2]=f[x+8>>2];H=lf(j,g,e,k,c)|0;Te(j);if(!H){ia=0;break d}break}case 0:{Pe(j,Ia);f[y>>2]=0;f[y+4>>2]=i;H=f[F>>2]|0;f[y+8>>2]=H;f[z>>2]=f[i>>2];f[z+4>>2]=i;f[z+8>>2]=H;f[k>>2]=La;f[g>>2]=f[y>>2];f[g+4>>2]=f[y+4>>2];f[g+8>>2]=f[y+8>>2];f[e>>2]=f[z>>2];f[e+4>>2]=f[z+4>>2];f[e+8>>2]=f[z+8>>2];H=lf(j,g,e,k,c)|0;Te(j);if(!H){ia=0;break d}break}default:{ia=0;break d}}ia=1}while(0);j=f[i+12>>2]|0;if(!j){u=d;return ia|0}i=f[J>>2]|0;if((i|0)!=(j|0))f[J>>2]=i+(~((i+-4-j|0)>>>2)<<2);br(j);u=d;return ia|0}function lb(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0;d=u;u=u+80|0;e=d+56|0;g=d+52|0;h=d+48|0;i=d+68|0;j=d;k=d+44|0;l=d+40|0;m=d+36|0;n=d+32|0;o=d+28|0;p=d+24|0;q=d+20|0;r=d+16|0;s=d+12|0;if(!(b[c+352>>0]|0)){Ne(e,f[c+8>>2]|0);t=c+12|0;v=f[e>>2]|0;f[e>>2]=0;w=f[t>>2]|0;f[t>>2]=v;if(w){ui(w);br(w);w=f[e>>2]|0;f[e>>2]=0;if(w|0){ui(w);br(w)}}else f[e>>2]=0}else{Mg(e,f[c+8>>2]|0);w=c+12|0;v=f[e>>2]|0;f[e>>2]=0;t=f[w>>2]|0;f[w>>2]=v;if(t){ui(t);br(t);t=f[e>>2]|0;f[e>>2]=0;if(t|0){ui(t);br(t)}}else f[e>>2]=0}t=c+12|0;v=f[t>>2]|0;if(v|0?(((f[v+4>>2]|0)-(f[v>>2]|0)>>2>>>0)/3|0|0)!=(f[v+40>>2]|0):0){v=c+200|0;Td(v,c)|0;w=f[t>>2]|0;x=c+4|0;Nh(((f[w+28>>2]|0)-(f[w+24>>2]|0)>>2)-(f[w+44>>2]|0)|0,f[(f[x>>2]|0)+44>>2]|0)|0;w=f[t>>2]|0;Nh((((f[w+4>>2]|0)-(f[w>>2]|0)>>2>>>0)/3|0)-(f[w+40>>2]|0)|0,f[(f[x>>2]|0)+44>>2]|0)|0;w=c+28|0;y=c+8|0;z=f[y>>2]|0;A=((f[z+100>>2]|0)-(f[z+96>>2]|0)|0)/12|0;b[e>>0]=0;Xg(w,A,e);A=f[t>>2]|0;z=(f[A+28>>2]|0)-(f[A+24>>2]|0)>>2;f[e>>2]=-1;Sf(c+52|0,z,e);z=c+40|0;A=f[z>>2]|0;B=c+44|0;C=f[B>>2]|0;if((C|0)!=(A|0))f[B>>2]=C+(~((C+-4-A|0)>>>2)<<2);A=f[t>>2]|0;C=(f[A+4>>2]|0)-(f[A>>2]|0)>>2;$j(z,C-((C>>>0)%3|0)|0);C=c+84|0;z=f[t>>2]|0;A=(f[z+28>>2]|0)-(f[z+24>>2]|0)>>2;b[e>>0]=0;Xg(C,A,e);A=c+96|0;z=f[A>>2]|0;B=c+100|0;D=f[B>>2]|0;if((D|0)!=(z|0))f[B>>2]=D+(~((D+-4-z|0)>>>2)<<2);f[c+164>>2]=-1;z=c+168|0;f[z>>2]=0;D=f[c+108>>2]|0;E=c+112|0;F=f[E>>2]|0;if((F|0)!=(D|0))f[E>>2]=F+(~(((F+-12-D|0)>>>0)/12|0)*12|0);D=c+132|0;if(f[D>>2]|0){F=c+128|0;E=f[F>>2]|0;if(E|0){G=E;do{E=G;G=f[G>>2]|0;br(E)}while((G|0)!=0)}f[F>>2]=0;F=f[c+124>>2]|0;if(F|0){G=c+120|0;E=0;do{f[(f[G>>2]|0)+(E<<2)>>2]=0;E=E+1|0}while((E|0)!=(F|0))}f[D>>2]=0}f[c+144>>2]=0;D=f[t>>2]|0;F=(f[D+28>>2]|0)-(f[D+24>>2]|0)>>2;f[e>>2]=-1;Sf(c+152|0,F,e);F=c+72|0;D=f[F>>2]|0;E=c+76|0;G=f[E>>2]|0;if((G|0)!=(D|0))f[E>>2]=G+(~((G+-4-D|0)>>>2)<<2);D=f[t>>2]|0;$j(F,((f[D+4>>2]|0)-(f[D>>2]|0)>>2>>>0)/3|0);f[c+64>>2]=0;if(!(oe(c)|0)){D=dn(32)|0;f[e>>2]=D;f[e+8>>2]=-2147483616;f[e+4>>2]=29;H=D;I=13227;J=H+29|0;do{b[H>>0]=b[I>>0]|0;H=H+1|0;I=I+1|0}while((H|0)<(J|0));b[D+29>>0]=0;f[a>>2]=-1;dj(a+4|0,e);if((b[e+11>>0]|0)<0)br(f[e>>2]|0);u=d;return}if(!(bh(c)|0)){D=dn(48)|0;f[e>>2]=D;f[e+8>>2]=-2147483600;f[e+4>>2]=36;H=D;I=13257;J=H+36|0;do{b[H>>0]=b[I>>0]|0;H=H+1|0;I=I+1|0}while((H|0)<(J|0));b[D+36>>0]=0;f[a>>2]=-1;dj(a+4|0,e);if((b[e+11>>0]|0)<0)br(f[e>>2]|0);u=d;return}D=c+172|0;G=c+176|0;K=(((f[G>>2]|0)-(f[D>>2]|0)|0)/136|0)&255;b[i>>0]=K;L=f[(f[x>>2]|0)+44>>2]|0;M=L+16|0;N=f[M+4>>2]|0;if((N|0)>0|(N|0)==0&(f[M>>2]|0)>>>0>0)O=K;else{f[g>>2]=f[L+4>>2];f[e>>2]=f[g>>2];ye(L,e,i,i+1|0)|0;O=b[i>>0]|0}f[c+284>>2]=O&255;O=f[t>>2]|0;i=(f[O+4>>2]|0)-(f[O>>2]|0)|0;O=i>>2;Ti(v);f[j>>2]=0;L=j+4|0;f[L>>2]=0;f[j+8>>2]=0;a:do if((i|0)>0){K=c+104|0;M=j+8|0;N=0;b:while(1){P=(N>>>0)/3|0;Q=P>>>5;R=1<<(P&31);if((f[(f[w>>2]|0)+(Q<<2)>>2]&R|0)==0?(S=f[t>>2]|0,f[k>>2]=P,f[e>>2]=f[k>>2],!(Rj(S,e)|0)):0){f[g>>2]=0;f[l>>2]=P;f[e>>2]=f[l>>2];P=gg(c,e,g)|0;Vi(v,P);S=f[g>>2]|0;T=(S|0)==-1;do if(P){do if(T){U=-1;V=-1;W=-1}else{X=f[f[t>>2]>>2]|0;Y=f[X+(S<<2)>>2]|0;Z=S+1|0;_=((Z>>>0)%3|0|0)==0?S+-2|0:Z;if((_|0)==-1)$=-1;else $=f[X+(_<<2)>>2]|0;_=(((S>>>0)%3|0|0)==0?2:-1)+S|0;if((_|0)==-1){U=-1;V=$;W=Y;break}U=f[X+(_<<2)>>2]|0;V=$;W=Y}while(0);Y=f[C>>2]|0;_=Y+(W>>>5<<2)|0;f[_>>2]=f[_>>2]|1<<(W&31);_=Y+(V>>>5<<2)|0;f[_>>2]=f[_>>2]|1<<(V&31);_=Y+(U>>>5<<2)|0;f[_>>2]=f[_>>2]|1<<(U&31);f[e>>2]=1;_=f[B>>2]|0;if(_>>>0<(f[K>>2]|0)>>>0){f[_>>2]=1;f[B>>2]=_+4}else Ci(A,e);_=(f[w>>2]|0)+(Q<<2)|0;f[_>>2]=f[_>>2]|R;_=S+1|0;if(T)aa=-1;else aa=((_>>>0)%3|0|0)==0?S+-2|0:_;f[e>>2]=aa;Y=f[L>>2]|0;if(Y>>>0<(f[M>>2]|0)>>>0){f[Y>>2]=aa;f[L>>2]=Y+4}else Ci(j,e);if(T)break;Y=((_>>>0)%3|0|0)==0?S+-2|0:_;if((Y|0)==-1)break;_=f[(f[(f[t>>2]|0)+12>>2]|0)+(Y<<2)>>2]|0;Y=(_|0)==-1;X=Y?-1:(_>>>0)/3|0;if(Y)break;if(f[(f[w>>2]|0)+(X>>>5<<2)>>2]&1<<(X&31)|0)break;f[m>>2]=_;f[e>>2]=f[m>>2];if(!(Zb(c,e)|0)){ba=65;break b}}else{_=S+1|0;if(T)ca=-1;else ca=((_>>>0)%3|0|0)==0?S+-2|0:_;f[n>>2]=ca;f[e>>2]=f[n>>2];Ce(c,e,1)|0;f[o>>2]=f[g>>2];f[e>>2]=f[o>>2];if(!(Zb(c,e)|0)){ba=71;break b}}while(0)}N=N+1|0;if((N|0)>=(O|0)){ba=77;break a}}if((ba|0)==65){f[e>>2]=0;f[e+4>>2]=0;f[e+8>>2]=0;N=dn(48)|0;f[e>>2]=N;f[e+8>>2]=-2147483600;f[e+4>>2]=32;H=N;I=13294;J=H+32|0;do{b[H>>0]=b[I>>0]|0;H=H+1|0;I=I+1|0}while((H|0)<(J|0));b[N+32>>0]=0;f[a>>2]=-1;dj(a+4|0,e);if((b[e+11>>0]|0)<0)br(f[e>>2]|0)}else if((ba|0)==71){f[e>>2]=0;f[e+4>>2]=0;f[e+8>>2]=0;M=dn(48)|0;f[e>>2]=M;f[e+8>>2]=-2147483600;f[e+4>>2]=32;H=M;I=13294;J=H+32|0;do{b[H>>0]=b[I>>0]|0;H=H+1|0;I=I+1|0}while((H|0)<(J|0));b[M+32>>0]=0;f[a>>2]=-1;dj(a+4|0,e);if((b[e+11>>0]|0)<0)br(f[e>>2]|0)}}else ba=77;while(0);do if((ba|0)==77){O=f[F>>2]|0;o=f[E>>2]|0;n=o;if((O|0)!=(o|0)?(ca=o+-4|0,O>>>0<ca>>>0):0){o=O;O=ca;do{ca=f[o>>2]|0;f[o>>2]=f[O>>2];f[O>>2]=ca;o=o+4|0;O=O+-4|0}while(o>>>0<O>>>0)}f[p>>2]=n;f[q>>2]=f[j>>2];f[r>>2]=f[L>>2];f[h>>2]=f[p>>2];f[g>>2]=f[q>>2];f[e>>2]=f[r>>2];Md(F,h,g,e)|0;if((f[G>>2]|0)!=(f[D>>2]|0)?(O=f[y>>2]|0,o=((f[O+100>>2]|0)-(f[O+96>>2]|0)|0)/12|0,b[e>>0]=0,Xg(w,o,e),o=f[F>>2]|0,O=f[E>>2]|0,(o|0)!=(O|0)):0){M=o;do{f[s>>2]=f[M>>2];f[e>>2]=f[s>>2];ue(c,e)|0;M=M+4|0}while((M|0)!=(O|0))}$h(v);Nh(f[c+324>>2]|0,f[(f[x>>2]|0)+44>>2]|0)|0;Nh(f[z>>2]|0,f[(f[x>>2]|0)+44>>2]|0)|0;if(Jg(c)|0){O=f[(f[x>>2]|0)+44>>2]|0;M=f[c+232>>2]|0;n=O+16|0;o=f[n+4>>2]|0;if(!((o|0)>0|(o|0)==0&(f[n>>2]|0)>>>0>0)){n=(f[c+236>>2]|0)-M|0;f[g>>2]=f[O+4>>2];f[e>>2]=f[g>>2];ye(O,e,M,M+n|0)|0}f[a>>2]=0;f[a+4>>2]=0;f[a+8>>2]=0;f[a+12>>2]=0;break}else{f[e>>2]=0;f[e+4>>2]=0;f[e+8>>2]=0;n=dn(32)|0;f[e>>2]=n;f[e+8>>2]=-2147483616;f[e+4>>2]=28;H=n;I=13327;J=H+28|0;do{b[H>>0]=b[I>>0]|0;H=H+1|0;I=I+1|0}while((H|0)<(J|0));b[n+28>>0]=0;f[a>>2]=-1;dj(a+4|0,e);if((b[e+11>>0]|0)<0)br(f[e>>2]|0);break}}while(0);g=f[j>>2]|0;if(g|0){j=f[L>>2]|0;if((j|0)!=(g|0))f[L>>2]=j+(~((j+-4-g|0)>>>2)<<2);br(g)}u=d;return}g=dn(32)|0;f[e>>2]=g;f[e+8>>2]=-2147483616;f[e+4>>2]=29;H=g;I=13197;J=H+29|0;do{b[H>>0]=b[I>>0]|0;H=H+1|0;I=I+1|0}while((H|0)<(J|0));b[g+29>>0]=0;f[a>>2]=-1;dj(a+4|0,e);if((b[e+11>>0]|0)<0)br(f[e>>2]|0);u=d;return}function mb(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,Y=0,Z=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ja=0;d=u;u=u+32|0;e=d;g=a+8|0;h=f[g>>2]|0;f[e>>2]=0;i=e+4|0;f[i>>2]=0;f[e+8>>2]=0;do if(h)if(h>>>0>1073741823)mq(e);else{j=h<<2;k=dn(j)|0;f[e>>2]=k;l=k+(h<<2)|0;f[e+8>>2]=l;hj(k|0,0,j|0)|0;f[i>>2]=l;m=l;n=k;break}else{m=0;n=0}while(0);k=a+1164|0;l=f[k>>2]|0;j=f[l>>2]|0;o=l+4|0;if(!j){p=l+8|0;q=n;r=m;s=h}else{h=f[o>>2]|0;if((h|0)!=(j|0))f[o>>2]=h+(~((h+-4-j|0)>>>2)<<2);br(j);j=l+8|0;f[j>>2]=0;f[o>>2]=0;f[l>>2]=0;p=j;q=f[e>>2]|0;r=f[i>>2]|0;s=f[g>>2]|0}f[l>>2]=q;f[o>>2]=r;f[p>>2]=f[e+8>>2];f[e>>2]=0;p=e+4|0;f[p>>2]=0;f[e+8>>2]=0;do if(s)if(s>>>0>1073741823)mq(e);else{r=s<<2;o=dn(r)|0;f[e>>2]=o;q=o+(s<<2)|0;f[e+8>>2]=q;hj(o|0,0,r|0)|0;f[p>>2]=q;t=q;v=o;break}else{t=0;v=0}while(0);s=a+1176|0;o=f[s>>2]|0;q=f[o>>2]|0;r=o+4|0;if(!q){w=o+8|0;x=v;y=t}else{t=f[r>>2]|0;if((t|0)!=(q|0))f[r>>2]=t+(~((t+-4-q|0)>>>2)<<2);br(q);q=o+8|0;f[q>>2]=0;f[r>>2]=0;f[o>>2]=0;w=q;x=f[e>>2]|0;y=f[p>>2]|0}f[o>>2]=x;f[r>>2]=y;f[w>>2]=f[e+8>>2];w=f[b>>2]|0;y=b+4|0;r=f[y>>2]|0;x=f[y+4>>2]|0;y=f[c>>2]|0;o=c+4|0;p=f[o>>2]|0;q=f[o+4>>2]|0;f[e>>2]=0;f[e+4>>2]=0;f[e+8>>2]=0;f[e+12>>2]=0;f[e+16>>2]=0;f[e+20>>2]=0;o=e+8|0;t=e+4|0;v=e+16|0;l=e+20|0;i=r;Jc(e);j=f[t>>2]|0;h=(f[l>>2]|0)+(f[v>>2]|0)|0;if((f[o>>2]|0)==(j|0))z=0;else z=(f[j+(((h>>>0)/113|0)<<2)>>2]|0)+(((h>>>0)%113|0)*36|0)|0;f[z>>2]=w;h=z+4|0;f[h>>2]=r;f[h+4>>2]=x;f[z+12>>2]=y;h=z+16|0;f[h>>2]=p;f[h+4>>2]=q;f[z+24>>2]=0;f[z+28>>2]=y-w;f[z+32>>2]=0;z=(f[l>>2]|0)+1|0;f[l>>2]=z;if(z|0){w=a+1152|0;y=a+1084|0;h=a+1080|0;j=a+1072|0;m=a+1076|0;n=a+1068|0;A=b+8|0;B=c+8|0;C=a+1124|0;D=a+1120|0;E=a+1112|0;F=a+1116|0;G=a+1108|0;H=i+4|0;I=i+24|0;J=i+24|0;K=p+24|0;L=z;while(1){z=f[v>>2]|0;M=L+-1|0;N=M+z|0;O=f[t>>2]|0;P=f[O+(((N>>>0)/113|0)<<2)>>2]|0;Q=(N>>>0)%113|0;N=f[P+(Q*36|0)>>2]|0;R=f[P+(Q*36|0)+12>>2]|0;S=f[P+(Q*36|0)+24>>2]|0;T=f[P+(Q*36|0)+32>>2]|0;f[l>>2]=M;M=f[o>>2]|0;Q=M-O>>2;if((1-L-z+((Q|0)==0?0:(Q*113|0)+-1|0)|0)>>>0>225){br(f[M+-4>>2]|0);f[o>>2]=(f[o>>2]|0)+-4}f[b>>2]=N;f[c>>2]=R;M=f[k>>2]|0;Q=((f[g>>2]|0)+-1|0)==(S|0)?0:S+1|0;S=(f[s>>2]|0)+(T*12|0)|0;z=R-N|0;O=(f[a>>2]|0)-(f[(f[S>>2]|0)+(Q<<2)>>2]|0)|0;a:do if(O){if(z>>>0<3){P=f[w>>2]|0;f[P>>2]=Q;U=f[g>>2]|0;if(U>>>0>1){V=1;W=U;Y=Q;while(1){Y=(Y|0)==(W+-1|0)?0:Y+1|0;f[P+(V<<2)>>2]=Y;V=V+1|0;Z=f[g>>2]|0;if(V>>>0>=Z>>>0){$=Z;break}else W=Z}}else $=U;if(!z){aa=85;break}else{ba=0;ca=$}while(1){W=(f[I>>2]|0)+((X(f[H>>2]|0,N+ba|0)|0)<<2)|0;if(!ca)da=0;else{V=0;do{Y=f[(f[w>>2]|0)+(V<<2)>>2]|0;P=(f[a>>2]|0)-(f[(f[S>>2]|0)+(Y<<2)>>2]|0)|0;do if(P|0){Z=f[y>>2]|0;ea=32-Z|0;fa=32-P|0;ga=f[W+(Y<<2)>>2]<<fa;if((P|0)>(ea|0)){ha=ga>>>fa;fa=P-ea|0;f[y>>2]=fa;ea=f[h>>2]|ha>>>fa;f[h>>2]=ea;fa=f[j>>2]|0;if((fa|0)==(f[m>>2]|0))Ci(n,h);else{f[fa>>2]=ea;f[j>>2]=fa+4}f[h>>2]=ha<<32-(f[y>>2]|0);break}ha=f[h>>2]|ga>>>Z;f[h>>2]=ha;ga=Z+P|0;f[y>>2]=ga;if((ga|0)!=32)break;ga=f[j>>2]|0;if((ga|0)==(f[m>>2]|0))Ci(n,h);else{f[ga>>2]=ha;f[j>>2]=ga+4}f[h>>2]=0;f[y>>2]=0}while(0);V=V+1|0;P=f[g>>2]|0}while(V>>>0<P>>>0);da=P}ba=ba+1|0;if(ba>>>0>=z>>>0){aa=85;break a}else ca=da}}U=T+1|0;qg(M+(U*12|0)|0,f[M+(T*12|0)>>2]|0,f[M+(T*12|0)+4>>2]|0);V=(f[(f[k>>2]|0)+(U*12|0)>>2]|0)+(Q<<2)|0;W=(f[V>>2]|0)+(1<<O+-1)|0;f[V>>2]=W;V=f[A>>2]|0;P=f[B>>2]|0;b:do if((R|0)==(N|0))ia=N;else{Y=f[J>>2]|0;if(!V){if((f[Y+(Q<<2)>>2]|0)>>>0<W>>>0){ia=R;break}else{ja=R;ka=N}while(1){ga=ja;do{ga=ga+-1|0;if((ka|0)==(ga|0)){ia=ka;break b}ha=(f[K>>2]|0)+((X(ga,P)|0)<<2)+(Q<<2)|0}while((f[ha>>2]|0)>>>0>=W>>>0);ka=ka+1|0;if((ka|0)==(ga|0)){ia=ga;break b}else ja=ga}}else{la=R;ma=N}while(1){ha=ma;while(1){na=Y+((X(ha,V)|0)<<2)|0;if((f[na+(Q<<2)>>2]|0)>>>0>=W>>>0){oa=la;break}Z=ha+1|0;if((Z|0)==(la|0)){ia=la;break b}else ha=Z}while(1){oa=oa+-1|0;if((ha|0)==(oa|0)){ia=ha;break b}pa=(f[K>>2]|0)+((X(oa,P)|0)<<2)|0;if((f[pa+(Q<<2)>>2]|0)>>>0<W>>>0){qa=0;break}}do{ga=na+(qa<<2)|0;Z=pa+(qa<<2)|0;fa=f[ga>>2]|0;f[ga>>2]=f[Z>>2];f[Z>>2]=fa;qa=qa+1|0}while((qa|0)!=(V|0));ma=ha+1|0;if((ma|0)==(oa|0)){ia=oa;break}else la=oa}}while(0);W=(_(z|0)|0)^31;P=ia-N|0;Y=R-ia|0;fa=P>>>0<Y>>>0;if((P|0)!=(Y|0)){Z=f[C>>2]|0;if(fa)f[D>>2]=f[D>>2]|1<<31-Z;ga=Z+1|0;f[C>>2]=ga;if((ga|0)==32){ga=f[E>>2]|0;if((ga|0)==(f[F>>2]|0))Ci(G,D);else{f[ga>>2]=f[D>>2];f[E>>2]=ga+4}f[C>>2]=0;f[D>>2]=0}}ga=z>>>1;if(fa){fa=ga-P|0;if(W|0){Z=0;ea=1<<W+-1;while(1){Vi(a+12+(Z<<5)|0,(ea&fa|0)!=0);Z=Z+1|0;if((Z|0)==(W|0))break;else ea=ea>>>1}}}else{ea=ga-Y|0;if(W|0){Z=0;fa=1<<W+-1;while(1){Vi(a+12+(Z<<5)|0,(fa&ea|0)!=0);Z=Z+1|0;if((Z|0)==(W|0))break;else fa=fa>>>1}}}fa=f[s>>2]|0;W=f[fa+(T*12|0)>>2]|0;Z=W+(Q<<2)|0;f[Z>>2]=(f[Z>>2]|0)+1;qg(fa+(U*12|0)|0,W,f[fa+(T*12|0)+4>>2]|0);if((ia|0)!=(N|0)){fa=f[o>>2]|0;W=f[t>>2]|0;Z=fa-W>>2;ea=f[v>>2]|0;ga=f[l>>2]|0;if((((Z|0)==0?0:(Z*113|0)+-1|0)|0)==(ga+ea|0)){Jc(e);ra=f[v>>2]|0;sa=f[l>>2]|0;ta=f[o>>2]|0;ua=f[t>>2]|0}else{ra=ea;sa=ga;ta=fa;ua=W}W=sa+ra|0;if((ta|0)==(ua|0))va=0;else va=(f[ua+(((W>>>0)/113|0)<<2)>>2]|0)+(((W>>>0)%113|0)*36|0)|0;f[va>>2]=N;W=va+4|0;f[W>>2]=r;f[W+4>>2]=x;f[va+12>>2]=ia;f[va+16>>2]=i;f[va+20>>2]=V;f[va+24>>2]=Q;f[va+28>>2]=P;f[va+32>>2]=T;f[l>>2]=(f[l>>2]|0)+1}if((R|0)!=(ia|0)){W=f[o>>2]|0;fa=f[t>>2]|0;ga=W-fa>>2;ea=f[v>>2]|0;Z=f[l>>2]|0;if((((ga|0)==0?0:(ga*113|0)+-1|0)|0)==(Z+ea|0)){Jc(e);wa=f[v>>2]|0;xa=f[l>>2]|0;ya=f[o>>2]|0;za=f[t>>2]|0}else{wa=ea;xa=Z;ya=W;za=fa}fa=xa+wa|0;if((ya|0)==(za|0))Aa=0;else Aa=(f[za+(((fa>>>0)/113|0)<<2)>>2]|0)+(((fa>>>0)%113|0)*36|0)|0;f[Aa>>2]=ia;f[Aa+4>>2]=i;f[Aa+8>>2]=V;f[Aa+12>>2]=R;fa=Aa+16|0;f[fa>>2]=p;f[fa+4>>2]=q;f[Aa+24>>2]=Q;f[Aa+28>>2]=Y;f[Aa+32>>2]=U;fa=(f[l>>2]|0)+1|0;f[l>>2]=fa;Ba=fa}else aa=85}else aa=85;while(0);if((aa|0)==85){aa=0;Ba=f[l>>2]|0}if(!Ba)break;else L=Ba}}Ba=f[t>>2]|0;L=f[v>>2]|0;Aa=Ba+(((L>>>0)/113|0)<<2)|0;q=f[o>>2]|0;p=q;i=Ba;if((q|0)==(Ba|0)){Ca=0;Da=0}else{ia=(f[Aa>>2]|0)+(((L>>>0)%113|0)*36|0)|0;Ca=ia;Da=ia}ia=Aa;Aa=Da;c:while(1){Da=Aa;do{L=Da;if((Ca|0)==(L|0))break c;Da=L+36|0}while((Da-(f[ia>>2]|0)|0)!=4068);Da=ia+4|0;ia=Da;Aa=f[Da>>2]|0}f[l>>2]=0;l=p-i>>2;if(l>>>0>2){i=Ba;do{br(f[i>>2]|0);i=(f[t>>2]|0)+4|0;f[t>>2]=i;Ea=f[o>>2]|0;Fa=Ea-i>>2}while(Fa>>>0>2);Ga=Fa;Ha=i;Ia=Ea}else{Ga=l;Ha=Ba;Ia=q}switch(Ga|0){case 1:{Ja=56;aa=99;break}case 2:{Ja=113;aa=99;break}default:{}}if((aa|0)==99)f[v>>2]=Ja;if((Ha|0)!=(Ia|0)){Ja=Ha;do{br(f[Ja>>2]|0);Ja=Ja+4|0}while((Ja|0)!=(Ia|0));Ia=f[t>>2]|0;t=f[o>>2]|0;if((t|0)!=(Ia|0))f[o>>2]=t+(~((t+-4-Ia|0)>>>2)<<2)}Ia=f[e>>2]|0;if(!Ia){u=d;return}br(Ia);u=d;return}function nb(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,Y=0,Z=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ja=0,Ka=0;d=u;u=u+32|0;e=d;g=a+8|0;h=f[g>>2]|0;f[e>>2]=0;i=e+4|0;f[i>>2]=0;f[e+8>>2]=0;do if(h)if(h>>>0>1073741823)mq(e);else{j=h<<2;k=dn(j)|0;f[e>>2]=k;l=k+(h<<2)|0;f[e+8>>2]=l;hj(k|0,0,j|0)|0;f[i>>2]=l;m=l;n=k;break}else{m=0;n=0}while(0);k=a+140|0;l=f[k>>2]|0;j=f[l>>2]|0;o=l+4|0;if(!j){p=l+8|0;q=n;r=m;s=h}else{h=f[o>>2]|0;if((h|0)!=(j|0))f[o>>2]=h+(~((h+-4-j|0)>>>2)<<2);br(j);j=l+8|0;f[j>>2]=0;f[o>>2]=0;f[l>>2]=0;p=j;q=f[e>>2]|0;r=f[i>>2]|0;s=f[g>>2]|0}f[l>>2]=q;f[o>>2]=r;f[p>>2]=f[e+8>>2];f[e>>2]=0;p=e+4|0;f[p>>2]=0;f[e+8>>2]=0;do if(s)if(s>>>0>1073741823)mq(e);else{r=s<<2;o=dn(r)|0;f[e>>2]=o;q=o+(s<<2)|0;f[e+8>>2]=q;hj(o|0,0,r|0)|0;f[p>>2]=q;t=q;v=o;break}else{t=0;v=0}while(0);s=a+152|0;o=f[s>>2]|0;q=f[o>>2]|0;r=o+4|0;if(!q){w=o+8|0;x=v;y=t}else{t=f[r>>2]|0;if((t|0)!=(q|0))f[r>>2]=t+(~((t+-4-q|0)>>>2)<<2);br(q);q=o+8|0;f[q>>2]=0;f[r>>2]=0;f[o>>2]=0;w=q;x=f[e>>2]|0;y=f[p>>2]|0}f[o>>2]=x;f[r>>2]=y;f[w>>2]=f[e+8>>2];w=f[b>>2]|0;y=b+4|0;r=f[y>>2]|0;x=f[y+4>>2]|0;y=f[c>>2]|0;o=c+4|0;p=f[o>>2]|0;q=f[o+4>>2]|0;f[e>>2]=0;f[e+4>>2]=0;f[e+8>>2]=0;f[e+12>>2]=0;f[e+16>>2]=0;f[e+20>>2]=0;o=e+8|0;t=e+4|0;v=e+16|0;l=e+20|0;i=r;Jc(e);j=f[t>>2]|0;h=(f[l>>2]|0)+(f[v>>2]|0)|0;if((f[o>>2]|0)==(j|0))z=0;else z=(f[j+(((h>>>0)/113|0)<<2)>>2]|0)+(((h>>>0)%113|0)*36|0)|0;f[z>>2]=w;h=z+4|0;f[h>>2]=r;f[h+4>>2]=x;f[z+12>>2]=y;h=z+16|0;f[h>>2]=p;f[h+4>>2]=q;f[z+24>>2]=0;f[z+28>>2]=y-w;f[z+32>>2]=0;z=(f[l>>2]|0)+1|0;f[l>>2]=z;if(z|0){w=a+128|0;y=a+60|0;h=a+56|0;j=a+48|0;m=a+52|0;n=a+44|0;A=b+8|0;B=c+8|0;C=a+12|0;D=a+100|0;E=a+96|0;F=a+88|0;G=a+92|0;H=a+84|0;I=i+4|0;J=i+24|0;K=i+24|0;L=p+24|0;M=z;while(1){z=f[v>>2]|0;N=M+-1|0;O=N+z|0;P=f[t>>2]|0;Q=f[P+(((O>>>0)/113|0)<<2)>>2]|0;R=(O>>>0)%113|0;O=f[Q+(R*36|0)>>2]|0;S=f[Q+(R*36|0)+12>>2]|0;T=f[Q+(R*36|0)+24>>2]|0;U=f[Q+(R*36|0)+32>>2]|0;f[l>>2]=N;N=f[o>>2]|0;R=N-P>>2;if((1-M-z+((R|0)==0?0:(R*113|0)+-1|0)|0)>>>0>225){br(f[N+-4>>2]|0);f[o>>2]=(f[o>>2]|0)+-4}f[b>>2]=O;f[c>>2]=S;N=f[k>>2]|0;R=((f[g>>2]|0)+-1|0)==(T|0)?0:T+1|0;T=(f[s>>2]|0)+(U*12|0)|0;z=S-O|0;P=(f[a>>2]|0)-(f[(f[T>>2]|0)+(R<<2)>>2]|0)|0;a:do if(P){if(z>>>0<3){Q=f[w>>2]|0;f[Q>>2]=R;V=f[g>>2]|0;if(V>>>0>1){W=1;Y=V;Z=R;while(1){Z=(Z|0)==(Y+-1|0)?0:Z+1|0;f[Q+(W<<2)>>2]=Z;W=W+1|0;$=f[g>>2]|0;if(W>>>0>=$>>>0){aa=$;break}else Y=$}}else aa=V;if(!z){ba=81;break}else{ca=0;da=aa}while(1){Y=(f[J>>2]|0)+((X(f[I>>2]|0,O+ca|0)|0)<<2)|0;if(!da)ea=0;else{W=0;do{Z=f[(f[w>>2]|0)+(W<<2)>>2]|0;Q=(f[a>>2]|0)-(f[(f[T>>2]|0)+(Z<<2)>>2]|0)|0;do if(Q|0){$=f[y>>2]|0;fa=32-$|0;ga=32-Q|0;ha=f[Y+(Z<<2)>>2]<<ga;if((Q|0)>(fa|0)){ia=ha>>>ga;ga=Q-fa|0;f[y>>2]=ga;fa=f[h>>2]|ia>>>ga;f[h>>2]=fa;ga=f[j>>2]|0;if((ga|0)==(f[m>>2]|0))Ci(n,h);else{f[ga>>2]=fa;f[j>>2]=ga+4}f[h>>2]=ia<<32-(f[y>>2]|0);break}ia=f[h>>2]|ha>>>$;f[h>>2]=ia;ha=$+Q|0;f[y>>2]=ha;if((ha|0)!=32)break;ha=f[j>>2]|0;if((ha|0)==(f[m>>2]|0))Ci(n,h);else{f[ha>>2]=ia;f[j>>2]=ha+4}f[h>>2]=0;f[y>>2]=0}while(0);W=W+1|0;Q=f[g>>2]|0}while(W>>>0<Q>>>0);ea=Q}ca=ca+1|0;if(ca>>>0>=z>>>0){ba=81;break a}else da=ea}}V=U+1|0;qg(N+(V*12|0)|0,f[N+(U*12|0)>>2]|0,f[N+(U*12|0)+4>>2]|0);W=(f[(f[k>>2]|0)+(V*12|0)>>2]|0)+(R<<2)|0;Y=(f[W>>2]|0)+(1<<P+-1)|0;f[W>>2]=Y;W=f[A>>2]|0;Q=f[B>>2]|0;b:do if((S|0)==(O|0))ja=O;else{Z=f[K>>2]|0;if(!W){if((f[Z+(R<<2)>>2]|0)>>>0<Y>>>0){ja=S;break}else{ka=S;la=O}while(1){ha=ka;do{ha=ha+-1|0;if((la|0)==(ha|0)){ja=la;break b}ia=(f[L>>2]|0)+((X(ha,Q)|0)<<2)+(R<<2)|0}while((f[ia>>2]|0)>>>0>=Y>>>0);la=la+1|0;if((la|0)==(ha|0)){ja=ha;break b}else ka=ha}}else{ma=S;na=O}while(1){ia=na;while(1){oa=Z+((X(ia,W)|0)<<2)|0;if((f[oa+(R<<2)>>2]|0)>>>0>=Y>>>0){pa=ma;break}$=ia+1|0;if(($|0)==(ma|0)){ja=ma;break b}else ia=$}while(1){pa=pa+-1|0;if((ia|0)==(pa|0)){ja=ia;break b}qa=(f[L>>2]|0)+((X(pa,Q)|0)<<2)|0;if((f[qa+(R<<2)>>2]|0)>>>0<Y>>>0){ra=0;break}}do{ha=oa+(ra<<2)|0;$=qa+(ra<<2)|0;ga=f[ha>>2]|0;f[ha>>2]=f[$>>2];f[$>>2]=ga;ra=ra+1|0}while((ra|0)!=(W|0));na=ia+1|0;if((na|0)==(pa|0)){ja=pa;break}else ma=pa}}while(0);Y=(_(z|0)|0)^31;Q=ja-O|0;Z=S-ja|0;ga=Q>>>0<Z>>>0;if((Q|0)!=(Z|0)){$=f[D>>2]|0;if(ga)f[E>>2]=f[E>>2]|1<<31-$;ha=$+1|0;f[D>>2]=ha;if((ha|0)==32){ha=f[F>>2]|0;if((ha|0)==(f[G>>2]|0))Ci(H,E);else{f[ha>>2]=f[E>>2];f[F>>2]=ha+4}f[D>>2]=0;f[E>>2]=0}}ha=z>>>1;if(ga)bg(C,Y,ha-Q|0);else bg(C,Y,ha-Z|0);ha=f[s>>2]|0;Y=f[ha+(U*12|0)>>2]|0;ga=Y+(R<<2)|0;f[ga>>2]=(f[ga>>2]|0)+1;qg(ha+(V*12|0)|0,Y,f[ha+(U*12|0)+4>>2]|0);if((ja|0)!=(O|0)){ha=f[o>>2]|0;Y=f[t>>2]|0;ga=ha-Y>>2;$=f[v>>2]|0;fa=f[l>>2]|0;if((((ga|0)==0?0:(ga*113|0)+-1|0)|0)==(fa+$|0)){Jc(e);sa=f[v>>2]|0;ta=f[l>>2]|0;ua=f[o>>2]|0;va=f[t>>2]|0}else{sa=$;ta=fa;ua=ha;va=Y}Y=ta+sa|0;if((ua|0)==(va|0))wa=0;else wa=(f[va+(((Y>>>0)/113|0)<<2)>>2]|0)+(((Y>>>0)%113|0)*36|0)|0;f[wa>>2]=O;Y=wa+4|0;f[Y>>2]=r;f[Y+4>>2]=x;f[wa+12>>2]=ja;f[wa+16>>2]=i;f[wa+20>>2]=W;f[wa+24>>2]=R;f[wa+28>>2]=Q;f[wa+32>>2]=U;f[l>>2]=(f[l>>2]|0)+1}if((S|0)!=(ja|0)){Q=f[o>>2]|0;Y=f[t>>2]|0;ha=Q-Y>>2;fa=f[v>>2]|0;$=f[l>>2]|0;if((((ha|0)==0?0:(ha*113|0)+-1|0)|0)==($+fa|0)){Jc(e);xa=f[v>>2]|0;ya=f[l>>2]|0;za=f[o>>2]|0;Aa=f[t>>2]|0}else{xa=fa;ya=$;za=Q;Aa=Y}Y=ya+xa|0;if((za|0)==(Aa|0))Ba=0;else Ba=(f[Aa+(((Y>>>0)/113|0)<<2)>>2]|0)+(((Y>>>0)%113|0)*36|0)|0;f[Ba>>2]=ja;f[Ba+4>>2]=i;f[Ba+8>>2]=W;f[Ba+12>>2]=S;Y=Ba+16|0;f[Y>>2]=p;f[Y+4>>2]=q;f[Ba+24>>2]=R;f[Ba+28>>2]=Z;f[Ba+32>>2]=V;Z=(f[l>>2]|0)+1|0;f[l>>2]=Z;Ca=Z}else ba=81}else ba=81;while(0);if((ba|0)==81){ba=0;Ca=f[l>>2]|0}if(!Ca)break;else M=Ca}}Ca=f[t>>2]|0;M=f[v>>2]|0;Ba=Ca+(((M>>>0)/113|0)<<2)|0;q=f[o>>2]|0;p=q;i=Ca;if((q|0)==(Ca|0)){Da=0;Ea=0}else{ja=(f[Ba>>2]|0)+(((M>>>0)%113|0)*36|0)|0;Da=ja;Ea=ja}ja=Ba;Ba=Ea;c:while(1){Ea=Ba;do{M=Ea;if((Da|0)==(M|0))break c;Ea=M+36|0}while((Ea-(f[ja>>2]|0)|0)!=4068);Ea=ja+4|0;ja=Ea;Ba=f[Ea>>2]|0}f[l>>2]=0;l=p-i>>2;if(l>>>0>2){i=Ca;do{br(f[i>>2]|0);i=(f[t>>2]|0)+4|0;f[t>>2]=i;Fa=f[o>>2]|0;Ga=Fa-i>>2}while(Ga>>>0>2);Ha=Ga;Ia=i;Ja=Fa}else{Ha=l;Ia=Ca;Ja=q}switch(Ha|0){case 1:{Ka=56;ba=95;break}case 2:{Ka=113;ba=95;break}default:{}}if((ba|0)==95)f[v>>2]=Ka;if((Ia|0)!=(Ja|0)){Ka=Ia;do{br(f[Ka>>2]|0);Ka=Ka+4|0}while((Ka|0)!=(Ja|0));Ja=f[t>>2]|0;t=f[o>>2]|0;if((t|0)!=(Ja|0))f[o>>2]=t+(~((t+-4-Ja|0)>>>2)<<2)}Ja=f[e>>2]|0;if(!Ja){u=d;return}br(Ja);u=d;return}function ob(a,b,c,d,e,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;g=g|0;var i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,J=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0.0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ja=0,Ka=0,La=0,Ma=0,Na=0,Oa=0,Pa=0,Qa=0,Ra=0,Sa=0,Ta=0,Ua=0,Va=0,Wa=0,Xa=0,Ya=0,Za=0,_a=0,$a=0,ab=0,bb=0.0,cb=0,db=0,eb=0,fb=0,gb=0,hb=0,ib=0,jb=0.0,kb=0.0,lb=0.0,mb=0.0,nb=0.0,ob=0.0,pb=0.0,qb=0.0,rb=0.0,sb=0.0,tb=0;i=u;u=u+512|0;j=i;k=d+c|0;l=0-k|0;m=a+4|0;n=a+100|0;o=b;b=0;a:while(1){switch(o|0){case 46:{p=6;break a;break}case 48:break;default:{q=0;r=o;s=b;t=0;v=0;break a}}w=f[m>>2]|0;if(w>>>0<(f[n>>2]|0)>>>0){f[m>>2]=w+1;o=h[w>>0]|0;b=1;continue}else{o=Di(a)|0;b=1;continue}}if((p|0)==6){o=f[m>>2]|0;if(o>>>0<(f[n>>2]|0)>>>0){f[m>>2]=o+1;x=h[o>>0]|0}else x=Di(a)|0;if((x|0)==48){o=0;w=0;while(1){y=Tn(o|0,w|0,-1,-1)|0;z=I;A=f[m>>2]|0;if(A>>>0<(f[n>>2]|0)>>>0){f[m>>2]=A+1;B=h[A>>0]|0}else B=Di(a)|0;if((B|0)==48){o=y;w=z}else{q=1;r=B;s=1;t=y;v=z;break}}}else{q=1;r=x;s=b;t=0;v=0}}f[j>>2]=0;b=r+-48|0;x=(r|0)==46;b:do if(x|b>>>0<10){B=j+496|0;w=0;o=0;z=0;y=q;A=s;C=r;D=x;E=b;F=t;G=v;H=0;J=0;c:while(1){do if(D)if(!y){L=w;M=o;N=1;O=z;P=A;Q=H;R=J;S=H;T=J}else break c;else{U=Tn(H|0,J|0,1,0)|0;V=I;W=(C|0)!=48;if((o|0)>=125){if(!W){L=w;M=o;N=y;O=z;P=A;Q=F;R=G;S=U;T=V;break}f[B>>2]=f[B>>2]|1;L=w;M=o;N=y;O=z;P=A;Q=F;R=G;S=U;T=V;break}Y=j+(o<<2)|0;if(!w)Z=E;else Z=C+-48+((f[Y>>2]|0)*10|0)|0;f[Y>>2]=Z;Y=w+1|0;_=(Y|0)==9;L=_?0:Y;M=o+(_&1)|0;N=y;O=W?U:z;P=1;Q=F;R=G;S=U;T=V}while(0);V=f[m>>2]|0;if(V>>>0<(f[n>>2]|0)>>>0){f[m>>2]=V+1;$=h[V>>0]|0}else $=Di(a)|0;E=$+-48|0;D=($|0)==46;if(!(D|E>>>0<10)){aa=L;ba=M;ca=O;da=N;ea=$;fa=P;ga=S;ha=Q;ia=T;ja=R;p=29;break b}else{w=L;o=M;z=O;y=N;A=P;C=$;F=Q;G=R;H=S;J=T}}ka=w;la=o;ma=z;na=H;oa=J;pa=F;qa=G;ra=(A|0)!=0;p=37}else{aa=0;ba=0;ca=0;da=q;ea=r;fa=s;ga=0;ha=t;ia=0;ja=v;p=29}while(0);do if((p|0)==29){v=(da|0)==0;t=v?ga:ha;s=v?ia:ja;v=(fa|0)!=0;if(!(v&(ea|32|0)==101))if((ea|0)>-1){ka=aa;la=ba;ma=ca;na=ga;oa=ia;pa=t;qa=s;ra=v;p=37;break}else{sa=aa;ta=ba;ua=ca;va=ga;wa=ia;xa=v;ya=t;za=s;p=39;break}v=De(a,g)|0;r=I;if((v|0)==0&(r|0)==-2147483648){if(!g){Rm(a,0);Aa=0.0;break}if(!(f[n>>2]|0)){Ba=0;Ca=0}else{f[m>>2]=(f[m>>2]|0)+-1;Ba=0;Ca=0}}else{Ba=v;Ca=r}r=Tn(Ba|0,Ca|0,t|0,s|0)|0;Da=aa;Ea=ba;Fa=ca;Ga=r;Ha=ga;Ia=I;Ja=ia;p=41}while(0);if((p|0)==37)if(f[n>>2]|0){f[m>>2]=(f[m>>2]|0)+-1;if(ra){Da=ka;Ea=la;Fa=ma;Ga=pa;Ha=na;Ia=qa;Ja=oa;p=41}else p=40}else{sa=ka;ta=la;ua=ma;va=na;wa=oa;xa=ra;ya=pa;za=qa;p=39}if((p|0)==39)if(xa){Da=sa;Ea=ta;Fa=ua;Ga=ya;Ha=va;Ia=za;Ja=wa;p=41}else p=40;do if((p|0)==40){wa=ir()|0;f[wa>>2]=22;Rm(a,0);Aa=0.0}else if((p|0)==41){wa=f[j>>2]|0;if(!wa){Aa=+(e|0)*0.0;break}if(((Ja|0)<0|(Ja|0)==0&Ha>>>0<10)&((Ga|0)==(Ha|0)&(Ia|0)==(Ja|0))?(c|0)>30|(wa>>>c|0)==0:0){Aa=+(e|0)*+(wa>>>0);break}wa=(d|0)/-2|0;za=((wa|0)<0)<<31>>31;if((Ia|0)>(za|0)|(Ia|0)==(za|0)&Ga>>>0>wa>>>0){wa=ir()|0;f[wa>>2]=34;Aa=+(e|0)*1797693134862315708145274.0e284*1797693134862315708145274.0e284;break}wa=d+-106|0;za=((wa|0)<0)<<31>>31;if((Ia|0)<(za|0)|(Ia|0)==(za|0)&Ga>>>0<wa>>>0){wa=ir()|0;f[wa>>2]=34;Aa=+(e|0)*2.2250738585072014e-308*2.2250738585072014e-308;break}if(!Da)Ka=Ea;else{if((Da|0)<9){wa=j+(Ea<<2)|0;za=Da;va=f[wa>>2]|0;while(1){va=va*10|0;if((za|0)>=8)break;else za=za+1|0}f[wa>>2]=va}Ka=Ea+1|0}if((Fa|0)<9?(Fa|0)<=(Ga|0)&(Ga|0)<18:0){if((Ga|0)==9){Aa=+(e|0)*+((f[j>>2]|0)>>>0);break}if((Ga|0)<9){Aa=+(e|0)*+((f[j>>2]|0)>>>0)/+(f[6408+(8-Ga<<2)>>2]|0);break}za=c+27+(X(Ga,-3)|0)|0;A=f[j>>2]|0;if((za|0)>30|(A>>>za|0)==0){Aa=+(e|0)*+(A>>>0)*+(f[6408+(Ga+-10<<2)>>2]|0);break}}A=(Ga|0)%9|0;if(!A){La=0;Ma=Ka;Na=0;Oa=Ga}else{za=(Ga|0)>-1?A:A+9|0;A=f[6408+(8-za<<2)>>2]|0;if(Ka){G=1e9/(A|0)|0;F=0;J=0;H=Ga;z=0;do{o=j+(z<<2)|0;w=f[o>>2]|0;ya=((w>>>0)/(A>>>0)|0)+F|0;f[o>>2]=ya;F=X(G,(w>>>0)%(A>>>0)|0)|0;w=(z|0)==(J|0)&(ya|0)==0;H=w?H+-9|0:H;J=w?J+1&127:J;z=z+1|0}while((z|0)!=(Ka|0));if(!F){Pa=J;Qa=Ka;Ra=H}else{f[j+(Ka<<2)>>2]=F;Pa=J;Qa=Ka+1|0;Ra=H}}else{Pa=0;Qa=0;Ra=Ga}La=0;Ma=Qa;Na=Pa;Oa=9-za+Ra|0}d:while(1){z=(Oa|0)<18;A=(Oa|0)==18;G=j+(Na<<2)|0;va=La;wa=Ma;while(1){if(!z){if(!A){Sa=va;Ta=Na;Ua=Oa;Va=wa;break d}if((f[G>>2]|0)>>>0>=9007199){Sa=va;Ta=Na;Ua=18;Va=wa;break d}}w=0;Wa=wa;ya=wa+127|0;while(1){o=ya&127;ua=j+(o<<2)|0;ta=Rn(f[ua>>2]|0,0,29)|0;sa=Tn(ta|0,I|0,w|0,0)|0;ta=I;if(ta>>>0>0|(ta|0)==0&sa>>>0>1e9){xa=up(sa|0,ta|0,1e9,0)|0;qa=an(sa|0,ta|0,1e9,0)|0;Xa=xa;Ya=qa}else{Xa=0;Ya=sa}f[ua>>2]=Ya;ua=(o|0)==(Na|0);Wa=(Ya|0)==0&(((o|0)!=(Wa+127&127|0)|ua)^1)?o:Wa;if(ua)break;else{w=Xa;ya=o+-1|0}}va=va+-29|0;if(Xa|0)break;else wa=Wa}wa=Na+127&127;G=Wa+127&127;A=j+((Wa+126&127)<<2)|0;if((wa|0)==(Wa|0)){f[A>>2]=f[A>>2]|f[j+(G<<2)>>2];Za=G}else Za=Wa;f[j+(wa<<2)>>2]=Xa;La=va;Ma=Za;Na=wa;Oa=Oa+9|0}e:while(1){za=Va+1&127;H=j+((Va+127&127)<<2)|0;J=Sa;F=Ta;wa=Ua;while(1){G=(wa|0)==18;A=(wa|0)>27?9:1;_a=J;$a=F;while(1){z=0;while(1){ya=z+$a&127;if((ya|0)==(Va|0)){ab=2;p=88;break}w=f[j+(ya<<2)>>2]|0;ya=f[6440+(z<<2)>>2]|0;if(w>>>0<ya>>>0){ab=2;p=88;break}if(w>>>0>ya>>>0)break;ya=z+1|0;if((z|0)<1)z=ya;else{ab=ya;p=88;break}}if((p|0)==88?(p=0,G&(ab|0)==2):0){bb=0.0;cb=0;db=Va;break e}eb=A+_a|0;if(($a|0)==(Va|0)){_a=eb;$a=Va}else break}G=(1<<A)+-1|0;z=1e9>>>A;fb=0;gb=$a;hb=wa;ya=$a;do{w=j+(ya<<2)|0;o=f[w>>2]|0;ua=(o>>>A)+fb|0;f[w>>2]=ua;fb=X(o&G,z)|0;o=(ya|0)==(gb|0)&(ua|0)==0;hb=o?hb+-9|0:hb;gb=o?gb+1&127:gb;ya=ya+1&127}while((ya|0)!=(Va|0));if(!fb){J=eb;F=gb;wa=hb;continue}if((za|0)!=(gb|0))break;f[H>>2]=f[H>>2]|1;J=eb;F=gb;wa=hb}f[j+(Va<<2)>>2]=fb;Sa=eb;Ta=gb;Ua=hb;Va=za}while(1){wa=cb+$a&127;F=db+1&127;if((wa|0)==(db|0)){f[j+(F+-1<<2)>>2]=0;ib=F}else ib=db;bb=bb*1.0e9+ +((f[j+(wa<<2)>>2]|0)>>>0);cb=cb+1|0;if((cb|0)==2)break;else db=ib}jb=+(e|0);kb=bb*jb;wa=_a+53|0;F=wa-d|0;J=(F|0)<(c|0);H=J?((F|0)>0?F:0):c;if((H|0)<53){lb=+Gq(+Wj(1.0,105-H|0),kb);mb=+Sq(kb,+Wj(1.0,53-H|0));nb=lb;ob=mb;pb=lb+(kb-mb)}else{nb=0.0;ob=0.0;pb=kb}va=$a+2&127;if((va|0)!=(ib|0)){ya=f[j+(va<<2)>>2]|0;do if(ya>>>0>=5e8){if((ya|0)!=5e8){qb=jb*.75+ob;break}if(($a+3&127|0)==(ib|0)){qb=jb*.5+ob;break}else{qb=jb*.75+ob;break}}else{if((ya|0)==0?($a+3&127|0)==(ib|0):0){qb=ob;break}qb=jb*.25+ob}while(0);if((53-H|0)>1?!(+Sq(qb,1.0)!=0.0):0)rb=qb+1.0;else rb=qb}else rb=ob;jb=pb+rb-nb;do if((wa&2147483647|0)>(-2-k|0)){ya=!(+K(+jb)>=9007199254740992.0);va=_a+((ya^1)&1)|0;kb=ya?jb:jb*.5;if((va+50|0)<=(l|0)?!(rb!=0.0&(J&((H|0)!=(F|0)|ya))):0){sb=kb;tb=va;break}ya=ir()|0;f[ya>>2]=34;sb=kb;tb=va}else{sb=jb;tb=_a}while(0);Aa=+Hq(sb,tb)}while(0);u=i;return +Aa}function pb(a,c,d,e,g,i){a=a|0;c=+c;d=d|0;e=e|0;g=g|0;i=i|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0.0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0.0,C=0,D=0.0,E=0,F=0,G=0,H=0.0,J=0,K=0,L=0,M=0,N=0,O=0.0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0.0,ga=0.0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0;j=u;u=u+560|0;k=j+8|0;l=j;m=j+524|0;n=m;o=j+512|0;f[l>>2]=0;p=o+12|0;xo(c)|0;if((I|0)<0){q=-c;r=1;s=15511}else{q=c;r=(g&2049|0)!=0&1;s=(g&2048|0)==0?((g&1|0)==0?15512:15517):15514}xo(q)|0;do if(0==0&(I&2146435072|0)==2146435072){t=(i&32|0)!=0;v=r+3|0;Hk(a,32,d,v,g&-65537);ep(a,s,r);ep(a,q!=q|0.0!=0.0?(t?17461:15538):t?15530:15534,3);Hk(a,32,d,v,g^8192);w=v}else{c=+Iq(q,l)*2.0;v=c!=0.0;if(v)f[l>>2]=(f[l>>2]|0)+-1;t=i|32;if((t|0)==97){x=i&32;y=(x|0)==0?s:s+9|0;z=r|2;A=12-e|0;do if(!(e>>>0>11|(A|0)==0)){B=8.0;C=A;do{C=C+-1|0;B=B*16.0}while((C|0)!=0);if((b[y>>0]|0)==45){D=-(B+(-c-B));break}else{D=c+B-B;break}}else D=c;while(0);A=f[l>>2]|0;C=(A|0)<0?0-A|0:A;E=Jj(C,((C|0)<0)<<31>>31,p)|0;if((E|0)==(p|0)){C=o+11|0;b[C>>0]=48;F=C}else F=E;b[F+-1>>0]=(A>>31&2)+43;A=F+-2|0;b[A>>0]=i+15;E=(e|0)<1;C=(g&8|0)==0;G=m;H=D;while(1){J=~~H;K=G+1|0;b[G>>0]=x|h[15542+J>>0];H=(H-+(J|0))*16.0;if((K-n|0)==1?!(C&(E&H==0.0)):0){b[K>>0]=46;L=G+2|0}else L=K;if(!(H!=0.0))break;else G=L}G=L;if((e|0)!=0?(-2-n+G|0)<(e|0):0){M=G-n|0;N=e+2|0}else{E=G-n|0;M=E;N=E}E=p-A|0;G=E+z+N|0;Hk(a,32,d,G,g);ep(a,y,z);Hk(a,48,d,G,g^65536);ep(a,m,M);Hk(a,48,N-M|0,0,0);ep(a,A,E);Hk(a,32,d,G,g^8192);w=G;break}G=(e|0)<0?6:e;if(v){E=(f[l>>2]|0)+-28|0;f[l>>2]=E;O=c*268435456.0;P=E}else{O=c;P=f[l>>2]|0}E=(P|0)<0?k:k+288|0;C=E;H=O;do{x=~~H>>>0;f[C>>2]=x;C=C+4|0;H=(H-+(x>>>0))*1.0e9}while(H!=0.0);if((P|0)>0){v=E;A=C;z=P;while(1){y=(z|0)<29?z:29;x=A+-4|0;if(x>>>0>=v>>>0){K=x;x=0;do{J=Rn(f[K>>2]|0,0,y|0)|0;Q=Tn(J|0,I|0,x|0,0)|0;J=I;R=an(Q|0,J|0,1e9,0)|0;f[K>>2]=R;x=up(Q|0,J|0,1e9,0)|0;K=K+-4|0}while(K>>>0>=v>>>0);if(x){K=v+-4|0;f[K>>2]=x;S=K}else S=v}else S=v;K=A;while(1){if(K>>>0<=S>>>0)break;J=K+-4|0;if(!(f[J>>2]|0))K=J;else break}x=(f[l>>2]|0)-y|0;f[l>>2]=x;if((x|0)>0){v=S;A=K;z=x}else{T=S;U=K;V=x;break}}}else{T=E;U=C;V=P}if((V|0)<0){z=((G+25|0)/9|0)+1|0;A=(t|0)==102;v=T;x=U;J=V;while(1){Q=0-J|0;R=(Q|0)<9?Q:9;if(v>>>0<x>>>0){Q=(1<<R)+-1|0;W=1e9>>>R;Y=0;Z=v;do{_=f[Z>>2]|0;f[Z>>2]=(_>>>R)+Y;Y=X(_&Q,W)|0;Z=Z+4|0}while(Z>>>0<x>>>0);Z=(f[v>>2]|0)==0?v+4|0:v;if(!Y){$=Z;aa=x}else{f[x>>2]=Y;$=Z;aa=x+4|0}}else{$=(f[v>>2]|0)==0?v+4|0:v;aa=x}Z=A?E:$;W=(aa-Z>>2|0)>(z|0)?Z+(z<<2)|0:aa;J=(f[l>>2]|0)+R|0;f[l>>2]=J;if((J|0)>=0){ba=$;ca=W;break}else{v=$;x=W}}}else{ba=T;ca=U}x=E;if(ba>>>0<ca>>>0){v=(x-ba>>2)*9|0;J=f[ba>>2]|0;if(J>>>0<10)da=v;else{z=v;v=10;while(1){v=v*10|0;A=z+1|0;if(J>>>0<v>>>0){da=A;break}else z=A}}}else da=0;z=(t|0)==103;v=(G|0)!=0;J=G-((t|0)!=102?da:0)+((v&z)<<31>>31)|0;if((J|0)<(((ca-x>>2)*9|0)+-9|0)){A=J+9216|0;J=E+4+(((A|0)/9|0)+-1024<<2)|0;C=(A|0)%9|0;if((C|0)<8){A=C;C=10;while(1){W=C*10|0;if((A|0)<7){A=A+1|0;C=W}else{ea=W;break}}}else ea=10;C=f[J>>2]|0;A=(C>>>0)%(ea>>>0)|0;t=(J+4|0)==(ca|0);if(!(t&(A|0)==0)){B=(((C>>>0)/(ea>>>0)|0)&1|0)==0?9007199254740992.0:9007199254740994.0;W=(ea|0)/2|0;H=A>>>0<W>>>0?.5:t&(A|0)==(W|0)?1.0:1.5;if(!r){fa=H;ga=B}else{W=(b[s>>0]|0)==45;fa=W?-H:H;ga=W?-B:B}W=C-A|0;f[J>>2]=W;if(ga+fa!=ga){A=W+ea|0;f[J>>2]=A;if(A>>>0>999999999){A=ba;W=J;while(1){C=W+-4|0;f[W>>2]=0;if(C>>>0<A>>>0){t=A+-4|0;f[t>>2]=0;ha=t}else ha=A;t=(f[C>>2]|0)+1|0;f[C>>2]=t;if(t>>>0>999999999){A=ha;W=C}else{ia=ha;ja=C;break}}}else{ia=ba;ja=J}W=(x-ia>>2)*9|0;A=f[ia>>2]|0;if(A>>>0<10){ka=ja;la=W;ma=ia}else{C=W;W=10;while(1){W=W*10|0;t=C+1|0;if(A>>>0<W>>>0){ka=ja;la=t;ma=ia;break}else C=t}}}else{ka=J;la=da;ma=ba}}else{ka=J;la=da;ma=ba}C=ka+4|0;na=la;oa=ca>>>0>C>>>0?C:ca;pa=ma}else{na=da;oa=ca;pa=ba}C=oa;while(1){if(C>>>0<=pa>>>0){qa=0;break}W=C+-4|0;if(!(f[W>>2]|0))C=W;else{qa=1;break}}J=0-na|0;do if(z){W=G+((v^1)&1)|0;if((W|0)>(na|0)&(na|0)>-5){ra=i+-1|0;sa=W+-1-na|0}else{ra=i+-2|0;sa=W+-1|0}W=g&8;if(!W){if(qa?(A=f[C+-4>>2]|0,(A|0)!=0):0)if(!((A>>>0)%10|0)){t=0;Z=10;while(1){Z=Z*10|0;Q=t+1|0;if((A>>>0)%(Z>>>0)|0|0){ta=Q;break}else t=Q}}else ta=0;else ta=9;t=((C-x>>2)*9|0)+-9|0;if((ra|32|0)==102){Z=t-ta|0;A=(Z|0)>0?Z:0;ua=ra;va=(sa|0)<(A|0)?sa:A;wa=0;break}else{A=t+na-ta|0;t=(A|0)>0?A:0;ua=ra;va=(sa|0)<(t|0)?sa:t;wa=0;break}}else{ua=ra;va=sa;wa=W}}else{ua=i;va=G;wa=g&8}while(0);G=va|wa;x=(G|0)!=0&1;v=(ua|32|0)==102;if(v){xa=0;ya=(na|0)>0?na:0}else{z=(na|0)<0?J:na;t=Jj(z,((z|0)<0)<<31>>31,p)|0;z=p;if((z-t|0)<2){A=t;while(1){Z=A+-1|0;b[Z>>0]=48;if((z-Z|0)<2)A=Z;else{za=Z;break}}}else za=t;b[za+-1>>0]=(na>>31&2)+43;A=za+-2|0;b[A>>0]=ua;xa=A;ya=z-A|0}A=r+1+va+x+ya|0;Hk(a,32,d,A,g);ep(a,s,r);Hk(a,48,d,A,g^65536);if(v){J=pa>>>0>E>>>0?E:pa;Z=m+9|0;R=Z;Y=m+8|0;Q=J;do{K=Jj(f[Q>>2]|0,0,Z)|0;if((Q|0)==(J|0))if((K|0)==(Z|0)){b[Y>>0]=48;Aa=Y}else Aa=K;else if(K>>>0>m>>>0){hj(m|0,48,K-n|0)|0;y=K;while(1){_=y+-1|0;if(_>>>0>m>>>0)y=_;else{Aa=_;break}}}else Aa=K;ep(a,Aa,R-Aa|0);Q=Q+4|0}while(Q>>>0<=E>>>0);if(G|0)ep(a,15558,1);if(Q>>>0<C>>>0&(va|0)>0){E=va;R=Q;while(1){Y=Jj(f[R>>2]|0,0,Z)|0;if(Y>>>0>m>>>0){hj(m|0,48,Y-n|0)|0;J=Y;while(1){v=J+-1|0;if(v>>>0>m>>>0)J=v;else{Ba=v;break}}}else Ba=Y;ep(a,Ba,(E|0)<9?E:9);R=R+4|0;J=E+-9|0;if(!(R>>>0<C>>>0&(E|0)>9)){Ca=J;break}else E=J}}else Ca=va;Hk(a,48,Ca+9|0,9,0)}else{E=qa?C:pa+4|0;if((va|0)>-1){R=m+9|0;Z=(wa|0)==0;Q=R;G=0-n|0;J=m+8|0;K=va;v=pa;while(1){x=Jj(f[v>>2]|0,0,R)|0;if((x|0)==(R|0)){b[J>>0]=48;Da=J}else Da=x;do if((v|0)==(pa|0)){x=Da+1|0;ep(a,Da,1);if(Z&(K|0)<1){Ea=x;break}ep(a,15558,1);Ea=x}else{if(Da>>>0<=m>>>0){Ea=Da;break}hj(m|0,48,Da+G|0)|0;x=Da;while(1){z=x+-1|0;if(z>>>0>m>>>0)x=z;else{Ea=z;break}}}while(0);Y=Q-Ea|0;ep(a,Ea,(K|0)>(Y|0)?Y:K);x=K-Y|0;v=v+4|0;if(!(v>>>0<E>>>0&(x|0)>-1)){Fa=x;break}else K=x}}else Fa=va;Hk(a,48,Fa+18|0,18,0);ep(a,xa,p-xa|0)}Hk(a,32,d,A,g^8192);w=A}while(0);u=j;return ((w|0)<(d|0)?d:w)|0}function qb(a,c,e,g,h){a=a|0;c=c|0;e=e|0;g=g|0;h=h|0;var i=0,j=0,k=0,l=0,m=0,n=0,o=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0;i=u;u=u+64|0;j=i+16|0;k=i;l=i+24|0;m=i+8|0;n=i+20|0;f[j>>2]=c;c=(a|0)!=0;o=l+40|0;q=o;r=l+39|0;l=m+4|0;s=0;t=0;v=0;a:while(1){do if((t|0)>-1)if((s|0)>(2147483647-t|0)){w=ir()|0;f[w>>2]=75;x=-1;break}else{x=s+t|0;break}else x=t;while(0);w=f[j>>2]|0;y=b[w>>0]|0;if(!(y<<24>>24)){z=88;break}else{A=y;B=w}b:while(1){switch(A<<24>>24){case 37:{C=B;D=B;z=9;break b;break}case 0:{E=B;break b;break}default:{}}y=B+1|0;f[j>>2]=y;A=b[y>>0]|0;B=y}c:do if((z|0)==9)while(1){z=0;if((b[D+1>>0]|0)!=37){E=C;break c}y=C+1|0;D=D+2|0;f[j>>2]=D;if((b[D>>0]|0)!=37){E=y;break}else{C=y;z=9}}while(0);y=E-w|0;if(c)ep(a,w,y);if(y|0){s=y;t=x;continue}y=(Pq(b[(f[j>>2]|0)+1>>0]|0)|0)==0;F=f[j>>2]|0;if(!y?(b[F+2>>0]|0)==36:0){G=(b[F+1>>0]|0)+-48|0;H=1;J=3}else{G=-1;H=v;J=1}y=F+J|0;f[j>>2]=y;F=b[y>>0]|0;K=(F<<24>>24)+-32|0;if(K>>>0>31|(1<<K&75913|0)==0){L=0;M=F;N=y}else{K=0;O=F;F=y;while(1){y=1<<(O<<24>>24)+-32|K;P=F+1|0;f[j>>2]=P;Q=b[P>>0]|0;R=(Q<<24>>24)+-32|0;if(R>>>0>31|(1<<R&75913|0)==0){L=y;M=Q;N=P;break}else{K=y;O=Q;F=P}}}if(M<<24>>24==42){if((Pq(b[N+1>>0]|0)|0)!=0?(F=f[j>>2]|0,(b[F+2>>0]|0)==36):0){O=F+1|0;f[h+((b[O>>0]|0)+-48<<2)>>2]=10;S=f[g+((b[O>>0]|0)+-48<<3)>>2]|0;T=1;U=F+3|0}else{if(H|0){V=-1;break}if(c){F=(f[e>>2]|0)+(4-1)&~(4-1);O=f[F>>2]|0;f[e>>2]=F+4;W=O}else W=0;S=W;T=0;U=(f[j>>2]|0)+1|0}f[j>>2]=U;O=(S|0)<0;X=O?0-S|0:S;Y=O?L|8192:L;Z=T;_=U}else{O=Cl(j)|0;if((O|0)<0){V=-1;break}X=O;Y=L;Z=H;_=f[j>>2]|0}do if((b[_>>0]|0)==46){if((b[_+1>>0]|0)!=42){f[j>>2]=_+1;O=Cl(j)|0;$=O;aa=f[j>>2]|0;break}if(Pq(b[_+2>>0]|0)|0?(O=f[j>>2]|0,(b[O+3>>0]|0)==36):0){F=O+2|0;f[h+((b[F>>0]|0)+-48<<2)>>2]=10;K=f[g+((b[F>>0]|0)+-48<<3)>>2]|0;F=O+4|0;f[j>>2]=F;$=K;aa=F;break}if(Z|0){V=-1;break a}if(c){F=(f[e>>2]|0)+(4-1)&~(4-1);K=f[F>>2]|0;f[e>>2]=F+4;ba=K}else ba=0;K=(f[j>>2]|0)+2|0;f[j>>2]=K;$=ba;aa=K}else{$=-1;aa=_}while(0);K=0;F=aa;while(1){if(((b[F>>0]|0)+-65|0)>>>0>57){V=-1;break a}O=F;F=F+1|0;f[j>>2]=F;ca=b[(b[O>>0]|0)+-65+(15030+(K*58|0))>>0]|0;da=ca&255;if((da+-1|0)>>>0>=8)break;else K=da}if(!(ca<<24>>24)){V=-1;break}O=(G|0)>-1;do if(ca<<24>>24==19)if(O){V=-1;break a}else z=50;else{if(O){f[h+(G<<2)>>2]=da;P=g+(G<<3)|0;Q=f[P+4>>2]|0;y=k;f[y>>2]=f[P>>2];f[y+4>>2]=Q;z=50;break}if(!c){V=0;break a}Ie(k,da,e);ea=f[j>>2]|0}while(0);if((z|0)==50){z=0;if(c)ea=F;else{s=0;t=x;v=Z;continue}}O=b[ea+-1>>0]|0;Q=(K|0)!=0&(O&15|0)==3?O&-33:O;O=Y&-65537;y=(Y&8192|0)==0?Y:O;d:do switch(Q|0){case 110:{switch((K&255)<<24>>24){case 0:{f[f[k>>2]>>2]=x;s=0;t=x;v=Z;continue a;break}case 1:{f[f[k>>2]>>2]=x;s=0;t=x;v=Z;continue a;break}case 2:{P=f[k>>2]|0;f[P>>2]=x;f[P+4>>2]=((x|0)<0)<<31>>31;s=0;t=x;v=Z;continue a;break}case 3:{d[f[k>>2]>>1]=x;s=0;t=x;v=Z;continue a;break}case 4:{b[f[k>>2]>>0]=x;s=0;t=x;v=Z;continue a;break}case 6:{f[f[k>>2]>>2]=x;s=0;t=x;v=Z;continue a;break}case 7:{P=f[k>>2]|0;f[P>>2]=x;f[P+4>>2]=((x|0)<0)<<31>>31;s=0;t=x;v=Z;continue a;break}default:{s=0;t=x;v=Z;continue a}}break}case 112:{fa=120;ga=$>>>0>8?$:8;ha=y|8;z=62;break}case 88:case 120:{fa=Q;ga=$;ha=y;z=62;break}case 111:{P=k;R=f[P>>2]|0;ia=f[P+4>>2]|0;P=Gl(R,ia,o)|0;ja=q-P|0;ka=P;la=0;ma=15494;na=(y&8|0)==0|($|0)>(ja|0)?$:ja+1|0;oa=y;pa=R;qa=ia;z=68;break}case 105:case 100:{ia=k;R=f[ia>>2]|0;ja=f[ia+4>>2]|0;if((ja|0)<0){ia=Vn(0,0,R|0,ja|0)|0;P=I;ra=k;f[ra>>2]=ia;f[ra+4>>2]=P;sa=1;ta=15494;ua=ia;va=P;z=67;break d}else{sa=(y&2049|0)!=0&1;ta=(y&2048|0)==0?((y&1|0)==0?15494:15496):15495;ua=R;va=ja;z=67;break d}break}case 117:{ja=k;sa=0;ta=15494;ua=f[ja>>2]|0;va=f[ja+4>>2]|0;z=67;break}case 99:{b[r>>0]=f[k>>2];wa=r;xa=0;ya=15494;za=o;Aa=1;Ba=O;break}case 109:{ja=ir()|0;Ca=kp(f[ja>>2]|0)|0;z=72;break}case 115:{ja=f[k>>2]|0;Ca=ja|0?ja:15504;z=72;break}case 67:{f[m>>2]=f[k>>2];f[l>>2]=0;f[k>>2]=m;Da=-1;Ea=m;z=76;break}case 83:{ja=f[k>>2]|0;if(!$){Hk(a,32,X,0,y);Fa=0;z=85}else{Da=$;Ea=ja;z=76}break}case 65:case 71:case 70:case 69:case 97:case 103:case 102:case 101:{s=pb(a,+p[k>>3],X,$,y,Q)|0;t=x;v=Z;continue a;break}default:{wa=w;xa=0;ya=15494;za=o;Aa=$;Ba=y}}while(0);e:do if((z|0)==62){z=0;w=k;Q=f[w>>2]|0;K=f[w+4>>2]|0;w=ol(Q,K,o,fa&32)|0;F=(ha&8|0)==0|(Q|0)==0&(K|0)==0;ka=w;la=F?0:2;ma=F?15494:15494+(fa>>4)|0;na=ga;oa=ha;pa=Q;qa=K;z=68}else if((z|0)==67){z=0;ka=Jj(ua,va,o)|0;la=sa;ma=ta;na=$;oa=y;pa=ua;qa=va;z=68}else if((z|0)==72){z=0;K=cg(Ca,0,$)|0;Q=(K|0)==0;wa=Ca;xa=0;ya=15494;za=Q?Ca+$|0:K;Aa=Q?$:K-Ca|0;Ba=O}else if((z|0)==76){z=0;K=Ea;Q=0;F=0;while(1){w=f[K>>2]|0;if(!w){Ga=Q;Ha=F;break}ja=Yo(n,w)|0;if((ja|0)<0|ja>>>0>(Da-Q|0)>>>0){Ga=Q;Ha=ja;break}w=ja+Q|0;if(Da>>>0>w>>>0){K=K+4|0;Q=w;F=ja}else{Ga=w;Ha=ja;break}}if((Ha|0)<0){V=-1;break a}Hk(a,32,X,Ga,y);if(!Ga){Fa=0;z=85}else{F=Ea;Q=0;while(1){K=f[F>>2]|0;if(!K){Fa=Ga;z=85;break e}ja=Yo(n,K)|0;Q=ja+Q|0;if((Q|0)>(Ga|0)){Fa=Ga;z=85;break e}ep(a,n,ja);if(Q>>>0>=Ga>>>0){Fa=Ga;z=85;break}else F=F+4|0}}}while(0);if((z|0)==68){z=0;O=(pa|0)!=0|(qa|0)!=0;F=(na|0)!=0|O;Q=q-ka+((O^1)&1)|0;wa=F?ka:o;xa=la;ya=ma;za=o;Aa=F?((na|0)>(Q|0)?na:Q):na;Ba=(na|0)>-1?oa&-65537:oa}else if((z|0)==85){z=0;Hk(a,32,X,Fa,y^8192);s=(X|0)>(Fa|0)?X:Fa;t=x;v=Z;continue}Q=za-wa|0;F=(Aa|0)<(Q|0)?Q:Aa;O=F+xa|0;ja=(X|0)<(O|0)?O:X;Hk(a,32,ja,O,Ba);ep(a,ya,xa);Hk(a,48,ja,O,Ba^65536);Hk(a,48,F,Q,0);ep(a,wa,Q);Hk(a,32,ja,O,Ba^8192);s=ja;t=x;v=Z}f:do if((z|0)==88)if(!a)if(v){Z=1;while(1){t=f[h+(Z<<2)>>2]|0;if(!t){Ia=Z;break}Ie(g+(Z<<3)|0,t,e);t=Z+1|0;if((Z|0)<9)Z=t;else{Ia=t;break}}if((Ia|0)<10){Z=Ia;while(1){if(f[h+(Z<<2)>>2]|0){V=-1;break f}if((Z|0)<9)Z=Z+1|0;else{V=1;break}}}else V=1}else V=0;else V=x;while(0);u=i;return V|0}function rb(a){a=a|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,X=0,Y=0,Z=0,_=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=Oa,ma=Oa,na=Oa,oa=0,pa=0,qa=0,ra=0,sa=0;c=u;u=u+64|0;d=c+28|0;e=c+16|0;g=c+4|0;h=c;i=a;j=a+80|0;k=f[j>>2]|0;f[d>>2]=0;f[d+4>>2]=0;f[d+8>>2]=0;f[d+12>>2]=0;f[d+16>>2]=i;l=d+20|0;n[l>>2]=$(1.0);f[d+24>>2]=i;qh(d,k);k=f[j>>2]|0;f[e>>2]=0;i=e+4|0;f[i>>2]=0;f[e+8>>2]=0;m=(k|0)==0;do if(!m)if(k>>>0>1073741823)mq(e);else{o=k<<2;p=dn(o)|0;f[e>>2]=p;q=p+(k<<2)|0;f[e+8>>2]=q;hj(p|0,0,o|0)|0;f[i>>2]=q;break}while(0);f[g>>2]=0;k=g+4|0;f[k>>2]=0;f[g+8>>2]=0;f[h>>2]=0;if(!m){m=d+16|0;q=d+4|0;o=d+12|0;p=d+8|0;r=g+8|0;s=d+24|0;t=0;v=0;while(1){w=f[m>>2]|0;x=f[w+8>>2]|0;y=(f[w+12>>2]|0)-x|0;w=(y|0)>0;z=x;if(w){x=y>>>2;A=0;B=0;while(1){C=f[z+(A<<2)>>2]|0;if(!(b[C+84>>0]|0))D=f[(f[C+68>>2]|0)+(v<<2)>>2]|0;else D=v;C=D+239^B;A=A+1|0;if((A|0)>=(x|0)){E=C;break}else B=C}}else E=0;B=f[q>>2]|0;x=(B|0)==0;a:do if(!x){A=B+-1|0;C=(A&B|0)==0;if(!C)if(E>>>0<B>>>0)F=E;else F=(E>>>0)%(B>>>0)|0;else F=A&E;G=f[(f[d>>2]|0)+(F<<2)>>2]|0;if((G|0)!=0?(H=f[G>>2]|0,(H|0)!=0):0){G=f[s>>2]|0;I=G+8|0;J=G+12|0;b:do if(C){G=H;while(1){K=f[G+4>>2]|0;L=(K|0)==(E|0);if(!(L|(K&A|0)==(F|0))){M=44;break a}c:do if(L){K=f[G+8>>2]|0;N=f[I>>2]|0;O=(f[J>>2]|0)-N|0;P=N;if((O|0)<=0){Q=G;break b}N=O>>>2;O=0;while(1){R=f[P+(O<<2)>>2]|0;if(!(b[R+84>>0]|0)){S=f[R+68>>2]|0;T=f[S+(v<<2)>>2]|0;U=f[S+(K<<2)>>2]|0}else{T=v;U=K}O=O+1|0;if((U|0)!=(T|0))break c;if((O|0)>=(N|0)){V=G;M=42;break b}}}while(0);G=f[G>>2]|0;if(!G){M=44;break a}}}else{G=H;while(1){L=f[G+4>>2]|0;d:do if((L|0)!=(E|0)){if(L>>>0<B>>>0)X=L;else X=(L>>>0)%(B>>>0)|0;if((X|0)!=(F|0)){M=44;break a}}else{N=f[G+8>>2]|0;O=f[I>>2]|0;K=(f[J>>2]|0)-O|0;P=O;if((K|0)<=0){Q=G;break b}O=K>>>2;K=0;while(1){S=f[P+(K<<2)>>2]|0;if(!(b[S+84>>0]|0)){R=f[S+68>>2]|0;Y=f[R+(v<<2)>>2]|0;Z=f[R+(N<<2)>>2]|0}else{Y=v;Z=N}K=K+1|0;if((Z|0)!=(Y|0))break d;if((K|0)>=(O|0)){V=G;M=42;break b}}}while(0);G=f[G>>2]|0;if(!G){M=44;break a}}}while(0);if((M|0)==42){M=0;if(!V){M=44;break}else Q=V}f[(f[e>>2]|0)+(v<<2)>>2]=f[Q+12>>2];_=t}else M=44}else M=44;while(0);do if((M|0)==44){M=0;if(w){J=y>>>2;I=0;H=0;while(1){A=f[z+(I<<2)>>2]|0;if(!(b[A+84>>0]|0))aa=f[(f[A+68>>2]|0)+(v<<2)>>2]|0;else aa=v;A=aa+239^H;I=I+1|0;if((I|0)>=(J|0)){ba=A;break}else H=A}}else ba=0;e:do if(!x){H=B+-1|0;J=(H&B|0)==0;if(!J)if(ba>>>0<B>>>0)ca=ba;else ca=(ba>>>0)%(B>>>0)|0;else ca=H&ba;I=f[(f[d>>2]|0)+(ca<<2)>>2]|0;if((I|0)!=0?(A=f[I>>2]|0,(A|0)!=0):0){I=f[s>>2]|0;C=I+8|0;G=I+12|0;if(J){J=A;while(1){I=f[J+4>>2]|0;if(!((I|0)==(ba|0)|(I&H|0)==(ca|0))){da=ca;M=76;break e}I=f[J+8>>2]|0;L=f[C>>2]|0;O=(f[G>>2]|0)-L|0;K=L;if((O|0)<=0){ea=v;break e}L=O>>>2;O=0;while(1){N=f[K+(O<<2)>>2]|0;if(!(b[N+84>>0]|0)){P=f[N+68>>2]|0;fa=f[P+(v<<2)>>2]|0;ga=f[P+(I<<2)>>2]|0}else{fa=v;ga=I}O=O+1|0;if((ga|0)!=(fa|0))break;if((O|0)>=(L|0)){ea=v;break e}}J=f[J>>2]|0;if(!J){da=ca;M=76;break e}}}else ha=A;while(1){J=f[ha+4>>2]|0;if((J|0)!=(ba|0)){if(J>>>0<B>>>0)ia=J;else ia=(J>>>0)%(B>>>0)|0;if((ia|0)!=(ca|0)){da=ca;M=76;break e}}J=f[ha+8>>2]|0;H=f[C>>2]|0;L=(f[G>>2]|0)-H|0;O=H;if((L|0)<=0){ea=v;break e}H=L>>>2;L=0;while(1){I=f[O+(L<<2)>>2]|0;if(!(b[I+84>>0]|0)){K=f[I+68>>2]|0;ja=f[K+(v<<2)>>2]|0;ka=f[K+(J<<2)>>2]|0}else{ja=v;ka=J}L=L+1|0;if((ka|0)!=(ja|0))break;if((L|0)>=(H|0)){ea=v;break e}}ha=f[ha>>2]|0;if(!ha){da=ca;M=76;break}}}else{da=ca;M=76}}else{da=0;M=76}while(0);if((M|0)==76){M=0;G=dn(16)|0;f[G+8>>2]=v;f[G+12>>2]=t;f[G+4>>2]=ba;f[G>>2]=0;la=$(((f[o>>2]|0)+1|0)>>>0);ma=$(B>>>0);na=$(n[l>>2]);do if(x|$(na*ma)<la){C=B<<1|(B>>>0<3|(B+-1&B|0)!=0)&1;A=~~$(W($(la/na)))>>>0;qh(d,C>>>0<A>>>0?A:C);C=f[q>>2]|0;A=C+-1|0;if(!(A&C)){oa=C;pa=A&ba;break}if(ba>>>0<C>>>0){oa=C;pa=ba}else{oa=C;pa=(ba>>>0)%(C>>>0)|0}}else{oa=B;pa=da}while(0);C=(f[d>>2]|0)+(pa<<2)|0;A=f[C>>2]|0;if(!A){f[G>>2]=f[p>>2];f[p>>2]=G;f[C>>2]=p;C=f[G>>2]|0;if(C|0){H=f[C+4>>2]|0;C=oa+-1|0;if(C&oa)if(H>>>0<oa>>>0)qa=H;else qa=(H>>>0)%(oa>>>0)|0;else qa=H&C;ra=(f[d>>2]|0)+(qa<<2)|0;M=89}}else{f[G>>2]=f[A>>2];ra=A;M=89}if((M|0)==89){M=0;f[ra>>2]=G}f[o>>2]=(f[o>>2]|0)+1;ea=f[h>>2]|0}A=t+1|0;f[(f[e>>2]|0)+(ea<<2)>>2]=t;C=f[k>>2]|0;if((C|0)==(f[r>>2]|0)){Ci(g,h);_=A;break}else{f[C>>2]=f[h>>2];f[k>>2]=C+4;_=A;break}}while(0);v=(f[h>>2]|0)+1|0;f[h>>2]=v;sa=f[j>>2]|0;if(v>>>0>=sa>>>0)break;else t=_}if((_|0)!=(sa|0)){Xa[f[(f[a>>2]|0)+24>>2]&15](a,e,g);f[j>>2]=_}}_=f[g>>2]|0;if(_|0){g=f[k>>2]|0;if((g|0)!=(_|0))f[k>>2]=g+(~((g+-4-_|0)>>>2)<<2);br(_)}_=f[e>>2]|0;if(_|0){e=f[i>>2]|0;if((e|0)!=(_|0))f[i>>2]=e+(~((e+-4-_|0)>>>2)<<2);br(_)}_=f[d+8>>2]|0;if(_|0){e=_;do{_=e;e=f[e>>2]|0;br(_)}while((e|0)!=0)}e=f[d>>2]|0;f[d>>2]=0;if(!e){u=c;return}br(e);u=c;return}function sb(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0;g=u;u=u+80|0;h=g+76|0;i=g+72|0;j=g+48|0;k=g+24|0;l=g;m=a+32|0;n=f[c>>2]|0;c=n+1|0;if((n|0)!=-1){o=((c>>>0)%3|0|0)==0?n+-2|0:c;c=(((n>>>0)%3|0|0)==0?2:-1)+n|0;if((o|0)==-1)p=-1;else p=f[(f[f[m>>2]>>2]|0)+(o<<2)>>2]|0;if((c|0)==-1){q=p;r=-1}else{q=p;r=f[(f[f[m>>2]>>2]|0)+(c<<2)>>2]|0}}else{q=-1;r=-1}c=f[a+36>>2]|0;m=f[c>>2]|0;p=(f[c+4>>2]|0)-m>>2;if(p>>>0<=q>>>0)mq(c);o=m;m=f[o+(q<<2)>>2]|0;if(p>>>0<=r>>>0)mq(c);c=f[o+(r<<2)>>2]|0;r=(m|0)<(e|0);do if(r&(c|0)<(e|0)){o=m<<1;p=f[d+(o<<2)>>2]|0;q=((p|0)<0)<<31>>31;n=f[d+((o|1)<<2)>>2]|0;o=((n|0)<0)<<31>>31;s=c<<1;t=f[d+(s<<2)>>2]|0;v=f[d+((s|1)<<2)>>2]|0;if(!((t|0)!=(p|0)|(v|0)!=(n|0))){f[a+8>>2]=p;f[a+12>>2]=n;u=g;return 1}s=a+4|0;w=f[(f[s>>2]|0)+(e<<2)>>2]|0;f[j>>2]=0;f[j+4>>2]=0;f[j+8>>2]=0;f[j+12>>2]=0;f[j+16>>2]=0;f[j+20>>2]=0;x=f[a>>2]|0;if(!(b[x+84>>0]|0))y=f[(f[x+68>>2]|0)+(w<<2)>>2]|0;else y=w;f[i>>2]=y;w=b[x+24>>0]|0;f[h>>2]=f[i>>2];ub(x,h,w,j)|0;w=f[(f[s>>2]|0)+(m<<2)>>2]|0;f[k>>2]=0;f[k+4>>2]=0;f[k+8>>2]=0;f[k+12>>2]=0;f[k+16>>2]=0;f[k+20>>2]=0;x=f[a>>2]|0;if(!(b[x+84>>0]|0))z=f[(f[x+68>>2]|0)+(w<<2)>>2]|0;else z=w;f[i>>2]=z;w=b[x+24>>0]|0;f[h>>2]=f[i>>2];ub(x,h,w,k)|0;w=f[(f[s>>2]|0)+(c<<2)>>2]|0;f[l>>2]=0;f[l+4>>2]=0;f[l+8>>2]=0;f[l+12>>2]=0;f[l+16>>2]=0;f[l+20>>2]=0;s=f[a>>2]|0;if(!(b[s+84>>0]|0))A=f[(f[s+68>>2]|0)+(w<<2)>>2]|0;else A=w;f[i>>2]=A;w=b[s+24>>0]|0;f[h>>2]=f[i>>2];ub(s,h,w,l)|0;w=l;s=k;x=f[s>>2]|0;B=f[s+4>>2]|0;s=Vn(f[w>>2]|0,f[w+4>>2]|0,x|0,B|0)|0;w=I;C=l+8|0;D=k+8|0;E=f[D>>2]|0;F=f[D+4>>2]|0;D=Vn(f[C>>2]|0,f[C+4>>2]|0,E|0,F|0)|0;C=I;G=l+16|0;H=k+16|0;J=f[H>>2]|0;K=f[H+4>>2]|0;H=Vn(f[G>>2]|0,f[G+4>>2]|0,J|0,K|0)|0;G=I;L=on(s|0,w|0,s|0,w|0)|0;M=I;N=on(D|0,C|0,D|0,C|0)|0;O=Tn(N|0,I|0,L|0,M|0)|0;M=I;L=on(H|0,G|0,H|0,G|0)|0;N=Tn(O|0,M|0,L|0,I|0)|0;L=I;if((N|0)==0&(L|0)==0)break;M=j;O=Vn(f[M>>2]|0,f[M+4>>2]|0,x|0,B|0)|0;B=I;x=j+8|0;M=Vn(f[x>>2]|0,f[x+4>>2]|0,E|0,F|0)|0;F=I;E=j+16|0;x=Vn(f[E>>2]|0,f[E+4>>2]|0,J|0,K|0)|0;K=I;J=on(O|0,B|0,s|0,w|0)|0;E=I;P=on(M|0,F|0,D|0,C|0)|0;Q=Tn(P|0,I|0,J|0,E|0)|0;E=I;J=on(x|0,K|0,H|0,G|0)|0;P=Tn(Q|0,E|0,J|0,I|0)|0;J=I;E=Vn(t|0,((t|0)<0)<<31>>31|0,p|0,q|0)|0;t=I;Q=Vn(v|0,((v|0)<0)<<31>>31|0,n|0,o|0)|0;v=I;R=on(N|0,L|0,p|0,q|0)|0;q=I;p=on(N|0,L|0,n|0,o|0)|0;o=I;n=on(P|0,J|0,E|0,t|0)|0;S=I;T=on(P|0,J|0,Q|0,v|0)|0;U=I;V=Tn(n|0,S|0,R|0,q|0)|0;q=I;R=Tn(T|0,U|0,p|0,o|0)|0;o=I;p=on(P|0,J|0,s|0,w|0)|0;w=I;s=on(P|0,J|0,D|0,C|0)|0;C=I;D=on(P|0,J|0,H|0,G|0)|0;G=I;H=zk(p|0,w|0,N|0,L|0)|0;w=I;p=zk(s|0,C|0,N|0,L|0)|0;C=I;s=zk(D|0,G|0,N|0,L|0)|0;G=I;D=Vn(O|0,B|0,H|0,w|0)|0;w=I;H=Vn(M|0,F|0,p|0,C|0)|0;C=I;p=Vn(x|0,K|0,s|0,G|0)|0;G=I;s=on(D|0,w|0,D|0,w|0)|0;w=I;D=on(H|0,C|0,H|0,C|0)|0;C=Tn(D|0,I|0,s|0,w|0)|0;w=I;s=on(p|0,G|0,p|0,G|0)|0;G=Tn(C|0,w|0,s|0,I|0)|0;s=I;w=Vn(0,0,E|0,t|0)|0;t=I;E=on(G|0,s|0,N|0,L|0)|0;s=I;switch(E|0){case 0:{if(!s){W=0;X=0}else{Y=1;Z=0;_=E;$=s;aa=23}break}case 1:{if(!s){ba=1;ca=0;aa=24}else{Y=1;Z=0;_=E;$=s;aa=23}break}default:{Y=1;Z=0;_=E;$=s;aa=23}}if((aa|0)==23)while(1){aa=0;G=Rn(Y|0,Z|0,1)|0;C=I;p=_;_=Wn(_|0,$|0,2)|0;if(!($>>>0>0|($|0)==0&p>>>0>7)){ba=G;ca=C;aa=24;break}else{Y=G;Z=C;$=I;aa=23}}if((aa|0)==24)while(1){aa=0;C=up(E|0,s|0,ba|0,ca|0)|0;G=Tn(C|0,I|0,ba|0,ca|0)|0;C=Wn(G|0,I|0,1)|0;G=I;p=on(C|0,G|0,C|0,G|0)|0;D=I;if(D>>>0>s>>>0|(D|0)==(s|0)&p>>>0>E>>>0){ba=C;ca=G;aa=24}else{W=C;X=G;break}}E=on(W|0,X|0,Q|0,v|0)|0;s=I;G=on(W|0,X|0,w|0,t|0)|0;C=I;p=Tn(E|0,s|0,V|0,q|0)|0;D=I;H=Tn(G|0,C|0,R|0,o|0)|0;K=I;x=zk(p|0,D|0,N|0,L|0)|0;D=I;p=zk(H|0,K|0,N|0,L|0)|0;K=I;H=Vn(V|0,q|0,E|0,s|0)|0;s=I;E=Vn(R|0,o|0,G|0,C|0)|0;C=I;G=zk(H|0,s|0,N|0,L|0)|0;s=I;H=zk(E|0,C|0,N|0,L|0)|0;C=I;E=e<<1;F=f[d+(E<<2)>>2]|0;M=((F|0)<0)<<31>>31;B=f[d+((E|1)<<2)>>2]|0;E=((B|0)<0)<<31>>31;O=Vn(F|0,M|0,x|0,D|0)|0;J=I;P=Vn(B|0,E|0,p|0,K|0)|0;U=I;T=on(O|0,J|0,O|0,J|0)|0;J=I;O=on(P|0,U|0,P|0,U|0)|0;U=Tn(O|0,I|0,T|0,J|0)|0;J=I;T=Vn(F|0,M|0,G|0,s|0)|0;M=I;F=Vn(B|0,E|0,H|0,C|0)|0;E=I;B=on(T|0,M|0,T|0,M|0)|0;M=I;T=on(F|0,E|0,F|0,E|0)|0;E=Tn(T|0,I|0,B|0,M|0)|0;M=I;B=a+16|0;T=a+20|0;F=f[T>>2]|0;O=f[a+24>>2]|0;P=(F|0)==(O<<5|0);if(J>>>0<M>>>0|(J|0)==(M|0)&U>>>0<E>>>0){do if(P)if((F+1|0)<0)mq(B);else{E=O<<6;U=F+32&-32;hi(B,F>>>0<1073741823?(E>>>0<U>>>0?U:E):2147483647);da=f[T>>2]|0;break}else da=F;while(0);f[T>>2]=da+1;L=(f[B>>2]|0)+(da>>>5<<2)|0;f[L>>2]=f[L>>2]|1<<(da&31);ea=x;fa=p;ga=K;ha=D}else{do if(P)if((F+1|0)<0)mq(B);else{L=O<<6;N=F+32&-32;hi(B,F>>>0<1073741823?(L>>>0<N>>>0?N:L):2147483647);ia=f[T>>2]|0;break}else ia=F;while(0);f[T>>2]=ia+1;F=(f[B>>2]|0)+(ia>>>5<<2)|0;f[F>>2]=f[F>>2]&~(1<<(ia&31));ea=G;fa=H;ga=C;ha=s}f[a+8>>2]=ea;f[a+12>>2]=fa;u=g;return 1}while(0);do if(r)ja=m<<1;else{if((e|0)>0){ja=(e<<1)+-2|0;break}fa=a+8|0;f[fa>>2]=0;f[fa+4>>2]=0;u=g;return 1}while(0);f[a+8>>2]=f[d+(ja<<2)>>2];f[a+12>>2]=f[d+(ja+1<<2)>>2];u=g;return 1}function tb(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0;g=u;u=u+80|0;h=g+76|0;i=g+72|0;j=g+48|0;k=g+24|0;l=g;m=a+32|0;n=f[c>>2]|0;c=n+1|0;do if((n|0)!=-1){o=((c>>>0)%3|0|0)==0?n+-2|0:c;if(!((n>>>0)%3|0)){p=n+2|0;q=o;break}else{p=n+-1|0;q=o;break}}else{p=-1;q=-1}while(0);n=f[(f[m>>2]|0)+28>>2]|0;m=f[n+(q<<2)>>2]|0;q=f[n+(p<<2)>>2]|0;p=f[a+36>>2]|0;n=f[p>>2]|0;c=(f[p+4>>2]|0)-n>>2;if(c>>>0<=m>>>0)mq(p);o=n;n=f[o+(m<<2)>>2]|0;if(c>>>0<=q>>>0)mq(p);p=f[o+(q<<2)>>2]|0;q=(n|0)<(e|0);do if(q&(p|0)<(e|0)){o=n<<1;c=f[d+(o<<2)>>2]|0;m=((c|0)<0)<<31>>31;r=f[d+((o|1)<<2)>>2]|0;o=((r|0)<0)<<31>>31;s=p<<1;t=f[d+(s<<2)>>2]|0;v=f[d+((s|1)<<2)>>2]|0;if(!((t|0)!=(c|0)|(v|0)!=(r|0))){f[a+8>>2]=c;f[a+12>>2]=r;u=g;return 1}s=a+4|0;w=f[(f[s>>2]|0)+(e<<2)>>2]|0;f[j>>2]=0;f[j+4>>2]=0;f[j+8>>2]=0;f[j+12>>2]=0;f[j+16>>2]=0;f[j+20>>2]=0;x=f[a>>2]|0;if(!(b[x+84>>0]|0))y=f[(f[x+68>>2]|0)+(w<<2)>>2]|0;else y=w;f[i>>2]=y;w=b[x+24>>0]|0;f[h>>2]=f[i>>2];ub(x,h,w,j)|0;w=f[(f[s>>2]|0)+(n<<2)>>2]|0;f[k>>2]=0;f[k+4>>2]=0;f[k+8>>2]=0;f[k+12>>2]=0;f[k+16>>2]=0;f[k+20>>2]=0;x=f[a>>2]|0;if(!(b[x+84>>0]|0))z=f[(f[x+68>>2]|0)+(w<<2)>>2]|0;else z=w;f[i>>2]=z;w=b[x+24>>0]|0;f[h>>2]=f[i>>2];ub(x,h,w,k)|0;w=f[(f[s>>2]|0)+(p<<2)>>2]|0;f[l>>2]=0;f[l+4>>2]=0;f[l+8>>2]=0;f[l+12>>2]=0;f[l+16>>2]=0;f[l+20>>2]=0;s=f[a>>2]|0;if(!(b[s+84>>0]|0))A=f[(f[s+68>>2]|0)+(w<<2)>>2]|0;else A=w;f[i>>2]=A;w=b[s+24>>0]|0;f[h>>2]=f[i>>2];ub(s,h,w,l)|0;w=l;s=k;x=f[s>>2]|0;B=f[s+4>>2]|0;s=Vn(f[w>>2]|0,f[w+4>>2]|0,x|0,B|0)|0;w=I;C=l+8|0;D=k+8|0;E=f[D>>2]|0;F=f[D+4>>2]|0;D=Vn(f[C>>2]|0,f[C+4>>2]|0,E|0,F|0)|0;C=I;G=l+16|0;H=k+16|0;J=f[H>>2]|0;K=f[H+4>>2]|0;H=Vn(f[G>>2]|0,f[G+4>>2]|0,J|0,K|0)|0;G=I;L=on(s|0,w|0,s|0,w|0)|0;M=I;N=on(D|0,C|0,D|0,C|0)|0;O=Tn(N|0,I|0,L|0,M|0)|0;M=I;L=on(H|0,G|0,H|0,G|0)|0;N=Tn(O|0,M|0,L|0,I|0)|0;L=I;if((N|0)==0&(L|0)==0)break;M=j;O=Vn(f[M>>2]|0,f[M+4>>2]|0,x|0,B|0)|0;B=I;x=j+8|0;M=Vn(f[x>>2]|0,f[x+4>>2]|0,E|0,F|0)|0;F=I;E=j+16|0;x=Vn(f[E>>2]|0,f[E+4>>2]|0,J|0,K|0)|0;K=I;J=on(O|0,B|0,s|0,w|0)|0;E=I;P=on(M|0,F|0,D|0,C|0)|0;Q=Tn(P|0,I|0,J|0,E|0)|0;E=I;J=on(x|0,K|0,H|0,G|0)|0;P=Tn(Q|0,E|0,J|0,I|0)|0;J=I;E=Vn(t|0,((t|0)<0)<<31>>31|0,c|0,m|0)|0;t=I;Q=Vn(v|0,((v|0)<0)<<31>>31|0,r|0,o|0)|0;v=I;R=on(N|0,L|0,c|0,m|0)|0;m=I;c=on(N|0,L|0,r|0,o|0)|0;o=I;r=on(P|0,J|0,E|0,t|0)|0;S=I;T=on(P|0,J|0,Q|0,v|0)|0;U=I;V=Tn(r|0,S|0,R|0,m|0)|0;m=I;R=Tn(T|0,U|0,c|0,o|0)|0;o=I;c=on(P|0,J|0,s|0,w|0)|0;w=I;s=on(P|0,J|0,D|0,C|0)|0;C=I;D=on(P|0,J|0,H|0,G|0)|0;G=I;H=zk(c|0,w|0,N|0,L|0)|0;w=I;c=zk(s|0,C|0,N|0,L|0)|0;C=I;s=zk(D|0,G|0,N|0,L|0)|0;G=I;D=Vn(O|0,B|0,H|0,w|0)|0;w=I;H=Vn(M|0,F|0,c|0,C|0)|0;C=I;c=Vn(x|0,K|0,s|0,G|0)|0;G=I;s=on(D|0,w|0,D|0,w|0)|0;w=I;D=on(H|0,C|0,H|0,C|0)|0;C=Tn(D|0,I|0,s|0,w|0)|0;w=I;s=on(c|0,G|0,c|0,G|0)|0;G=Tn(C|0,w|0,s|0,I|0)|0;s=I;w=Vn(0,0,E|0,t|0)|0;t=I;E=on(G|0,s|0,N|0,L|0)|0;s=I;switch(E|0){case 0:{if(!s){W=0;X=0}else{Y=1;Z=0;_=E;$=s;aa=22}break}case 1:{if(!s){ba=1;ca=0;aa=23}else{Y=1;Z=0;_=E;$=s;aa=22}break}default:{Y=1;Z=0;_=E;$=s;aa=22}}if((aa|0)==22)while(1){aa=0;G=Rn(Y|0,Z|0,1)|0;C=I;c=_;_=Wn(_|0,$|0,2)|0;if(!($>>>0>0|($|0)==0&c>>>0>7)){ba=G;ca=C;aa=23;break}else{Y=G;Z=C;$=I;aa=22}}if((aa|0)==23)while(1){aa=0;C=up(E|0,s|0,ba|0,ca|0)|0;G=Tn(C|0,I|0,ba|0,ca|0)|0;C=Wn(G|0,I|0,1)|0;G=I;c=on(C|0,G|0,C|0,G|0)|0;D=I;if(D>>>0>s>>>0|(D|0)==(s|0)&c>>>0>E>>>0){ba=C;ca=G;aa=23}else{W=C;X=G;break}}E=on(W|0,X|0,Q|0,v|0)|0;s=I;G=on(W|0,X|0,w|0,t|0)|0;C=I;c=Tn(E|0,s|0,V|0,m|0)|0;D=I;H=Tn(G|0,C|0,R|0,o|0)|0;K=I;x=zk(c|0,D|0,N|0,L|0)|0;D=I;c=zk(H|0,K|0,N|0,L|0)|0;K=I;H=Vn(V|0,m|0,E|0,s|0)|0;s=I;E=Vn(R|0,o|0,G|0,C|0)|0;C=I;G=zk(H|0,s|0,N|0,L|0)|0;s=I;H=zk(E|0,C|0,N|0,L|0)|0;C=I;E=e<<1;F=f[d+(E<<2)>>2]|0;M=((F|0)<0)<<31>>31;B=f[d+((E|1)<<2)>>2]|0;E=((B|0)<0)<<31>>31;O=Vn(F|0,M|0,x|0,D|0)|0;J=I;P=Vn(B|0,E|0,c|0,K|0)|0;U=I;T=on(O|0,J|0,O|0,J|0)|0;J=I;O=on(P|0,U|0,P|0,U|0)|0;U=Tn(O|0,I|0,T|0,J|0)|0;J=I;T=Vn(F|0,M|0,G|0,s|0)|0;M=I;F=Vn(B|0,E|0,H|0,C|0)|0;E=I;B=on(T|0,M|0,T|0,M|0)|0;M=I;T=on(F|0,E|0,F|0,E|0)|0;E=Tn(T|0,I|0,B|0,M|0)|0;M=I;B=a+16|0;T=a+20|0;F=f[T>>2]|0;O=f[a+24>>2]|0;P=(F|0)==(O<<5|0);if(J>>>0<M>>>0|(J|0)==(M|0)&U>>>0<E>>>0){do if(P)if((F+1|0)<0)mq(B);else{E=O<<6;U=F+32&-32;hi(B,F>>>0<1073741823?(E>>>0<U>>>0?U:E):2147483647);da=f[T>>2]|0;break}else da=F;while(0);f[T>>2]=da+1;L=(f[B>>2]|0)+(da>>>5<<2)|0;f[L>>2]=f[L>>2]|1<<(da&31);ea=x;fa=c;ga=K;ha=D}else{do if(P)if((F+1|0)<0)mq(B);else{L=O<<6;N=F+32&-32;hi(B,F>>>0<1073741823?(L>>>0<N>>>0?N:L):2147483647);ia=f[T>>2]|0;break}else ia=F;while(0);f[T>>2]=ia+1;F=(f[B>>2]|0)+(ia>>>5<<2)|0;f[F>>2]=f[F>>2]&~(1<<(ia&31));ea=G;fa=H;ga=C;ha=s}f[a+8>>2]=ea;f[a+12>>2]=fa;u=g;return 1}while(0);do if(q)ja=n<<1;else{if((e|0)>0){ja=(e<<1)+-2|0;break}fa=a+8|0;f[fa>>2]=0;f[fa+4>>2]=0;u=g;return 1}while(0);f[a+8>>2]=f[d+(ja<<2)>>2];f[a+12>>2]=f[d+(ja+1<<2)>>2];u=g;return 1}function ub(a,c,e,g){a=a|0;c=c|0;e=e|0;g=g|0;var i=0,k=0,l=0,m=0,o=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=Oa,D=0,E=0.0,F=0,G=0;if(!g){i=0;return i|0}do switch(f[a+28>>2]|0){case 1:{k=a+24|0;l=b[k>>0]|0;if((l<<24>>24>e<<24>>24?e:l)<<24>>24>0){m=f[f[a>>2]>>2]|0;o=a+40|0;q=on(f[o>>2]|0,f[o+4>>2]|0,f[c>>2]|0,0)|0;o=a+48|0;r=Tn(q|0,I|0,f[o>>2]|0,f[o+4>>2]|0)|0;o=m+r|0;r=0;while(1){m=b[o>>0]|0;q=g+(r<<3)|0;f[q>>2]=m;f[q+4>>2]=((m|0)<0)<<31>>31;r=r+1|0;m=b[k>>0]|0;if((r|0)>=((m<<24>>24>e<<24>>24?e:m)<<24>>24|0)){s=m;break}else o=o+1|0}}else s=l;o=s<<24>>24;if(s<<24>>24>=e<<24>>24){i=1;return i|0}hj(g+(o<<3)|0,0,(e<<24>>24)-o<<3|0)|0;i=1;return i|0}case 2:{o=a+24|0;r=b[o>>0]|0;if((r<<24>>24>e<<24>>24?e:r)<<24>>24>0){k=f[f[a>>2]>>2]|0;m=a+40|0;q=on(f[m>>2]|0,f[m+4>>2]|0,f[c>>2]|0,0)|0;m=a+48|0;t=Tn(q|0,I|0,f[m>>2]|0,f[m+4>>2]|0)|0;m=k+t|0;t=0;while(1){k=g+(t<<3)|0;f[k>>2]=h[m>>0];f[k+4>>2]=0;t=t+1|0;k=b[o>>0]|0;if((t|0)>=((k<<24>>24>e<<24>>24?e:k)<<24>>24|0)){u=k;break}else m=m+1|0}}else u=r;m=u<<24>>24;if(u<<24>>24>=e<<24>>24){i=1;return i|0}hj(g+(m<<3)|0,0,(e<<24>>24)-m<<3|0)|0;i=1;return i|0}case 3:{m=a+24|0;t=b[m>>0]|0;if((t<<24>>24>e<<24>>24?e:t)<<24>>24>0){o=f[f[a>>2]>>2]|0;l=a+40|0;k=on(f[l>>2]|0,f[l+4>>2]|0,f[c>>2]|0,0)|0;l=a+48|0;q=Tn(k|0,I|0,f[l>>2]|0,f[l+4>>2]|0)|0;l=o+q|0;q=0;while(1){o=d[l>>1]|0;k=g+(q<<3)|0;f[k>>2]=o;f[k+4>>2]=((o|0)<0)<<31>>31;q=q+1|0;o=b[m>>0]|0;if((q|0)>=((o<<24>>24>e<<24>>24?e:o)<<24>>24|0)){v=o;break}else l=l+2|0}}else v=t;l=v<<24>>24;if(v<<24>>24>=e<<24>>24){i=1;return i|0}hj(g+(l<<3)|0,0,(e<<24>>24)-l<<3|0)|0;i=1;return i|0}case 4:{l=a+24|0;q=b[l>>0]|0;if((q<<24>>24>e<<24>>24?e:q)<<24>>24>0){m=f[f[a>>2]>>2]|0;r=a+40|0;o=on(f[r>>2]|0,f[r+4>>2]|0,f[c>>2]|0,0)|0;r=a+48|0;k=Tn(o|0,I|0,f[r>>2]|0,f[r+4>>2]|0)|0;r=m+k|0;k=0;while(1){m=g+(k<<3)|0;f[m>>2]=j[r>>1];f[m+4>>2]=0;k=k+1|0;m=b[l>>0]|0;if((k|0)>=((m<<24>>24>e<<24>>24?e:m)<<24>>24|0)){w=m;break}else r=r+2|0}}else w=q;r=w<<24>>24;if(w<<24>>24>=e<<24>>24){i=1;return i|0}hj(g+(r<<3)|0,0,(e<<24>>24)-r<<3|0)|0;i=1;return i|0}case 5:{r=a+24|0;k=b[r>>0]|0;if((k<<24>>24>e<<24>>24?e:k)<<24>>24>0){l=f[f[a>>2]>>2]|0;t=a+40|0;m=on(f[t>>2]|0,f[t+4>>2]|0,f[c>>2]|0,0)|0;t=a+48|0;o=Tn(m|0,I|0,f[t>>2]|0,f[t+4>>2]|0)|0;t=l+o|0;o=0;while(1){l=f[t>>2]|0;m=g+(o<<3)|0;f[m>>2]=l;f[m+4>>2]=((l|0)<0)<<31>>31;o=o+1|0;l=b[r>>0]|0;if((o|0)>=((l<<24>>24>e<<24>>24?e:l)<<24>>24|0)){x=l;break}else t=t+4|0}}else x=k;t=x<<24>>24;if(x<<24>>24>=e<<24>>24){i=1;return i|0}hj(g+(t<<3)|0,0,(e<<24>>24)-t<<3|0)|0;i=1;return i|0}case 6:{t=a+24|0;o=b[t>>0]|0;if((o<<24>>24>e<<24>>24?e:o)<<24>>24>0){r=f[f[a>>2]>>2]|0;q=a+40|0;l=on(f[q>>2]|0,f[q+4>>2]|0,f[c>>2]|0,0)|0;q=a+48|0;m=Tn(l|0,I|0,f[q>>2]|0,f[q+4>>2]|0)|0;q=r+m|0;m=0;while(1){r=g+(m<<3)|0;f[r>>2]=f[q>>2];f[r+4>>2]=0;m=m+1|0;r=b[t>>0]|0;if((m|0)>=((r<<24>>24>e<<24>>24?e:r)<<24>>24|0)){y=r;break}else q=q+4|0}}else y=o;q=y<<24>>24;if(y<<24>>24>=e<<24>>24){i=1;return i|0}hj(g+(q<<3)|0,0,(e<<24>>24)-q<<3|0)|0;i=1;return i|0}case 7:{q=a+24|0;m=b[q>>0]|0;if((m<<24>>24>e<<24>>24?e:m)<<24>>24>0){t=f[f[a>>2]>>2]|0;k=a+40|0;r=on(f[k>>2]|0,f[k+4>>2]|0,f[c>>2]|0,0)|0;k=a+48|0;l=Tn(r|0,I|0,f[k>>2]|0,f[k+4>>2]|0)|0;k=t+l|0;l=0;while(1){t=k;r=f[t+4>>2]|0;z=g+(l<<3)|0;f[z>>2]=f[t>>2];f[z+4>>2]=r;l=l+1|0;r=b[q>>0]|0;if((l|0)>=((r<<24>>24>e<<24>>24?e:r)<<24>>24|0)){A=r;break}else k=k+8|0}}else A=m;k=A<<24>>24;if(A<<24>>24>=e<<24>>24){i=1;return i|0}hj(g+(k<<3)|0,0,(e<<24>>24)-k<<3|0)|0;i=1;return i|0}case 8:{k=a+24|0;l=b[k>>0]|0;if((l<<24>>24>e<<24>>24?e:l)<<24>>24>0){q=f[f[a>>2]>>2]|0;o=a+40|0;r=on(f[o>>2]|0,f[o+4>>2]|0,f[c>>2]|0,0)|0;o=a+48|0;z=Tn(r|0,I|0,f[o>>2]|0,f[o+4>>2]|0)|0;o=q+z|0;z=0;while(1){q=o;r=f[q+4>>2]|0;t=g+(z<<3)|0;f[t>>2]=f[q>>2];f[t+4>>2]=r;z=z+1|0;r=b[k>>0]|0;if((z|0)>=((r<<24>>24>e<<24>>24?e:r)<<24>>24|0)){B=r;break}else o=o+8|0}}else B=l;o=B<<24>>24;if(B<<24>>24>=e<<24>>24){i=1;return i|0}hj(g+(o<<3)|0,0,(e<<24>>24)-o<<3|0)|0;i=1;return i|0}case 9:{o=a+24|0;z=b[o>>0]|0;if((z<<24>>24>e<<24>>24?e:z)<<24>>24>0){k=f[f[a>>2]>>2]|0;m=a+40|0;r=on(f[m>>2]|0,f[m+4>>2]|0,f[c>>2]|0,0)|0;m=a+48|0;t=Tn(r|0,I|0,f[m>>2]|0,f[m+4>>2]|0)|0;m=k+t|0;t=0;while(1){C=$(n[m>>2]);k=+K(+C)>=1.0?(+C>0.0?~~+Y(+J(+C/4294967296.0),4294967295.0)>>>0:~~+W((+C-+(~~+C>>>0))/4294967296.0)>>>0):0;r=g+(t<<3)|0;f[r>>2]=~~+C>>>0;f[r+4>>2]=k;t=t+1|0;k=b[o>>0]|0;if((t|0)>=((k<<24>>24>e<<24>>24?e:k)<<24>>24|0)){D=k;break}else m=m+4|0}}else D=z;m=D<<24>>24;if(D<<24>>24>=e<<24>>24){i=1;return i|0}hj(g+(m<<3)|0,0,(e<<24>>24)-m<<3|0)|0;i=1;return i|0}case 10:{m=a+24|0;t=b[m>>0]|0;if((t<<24>>24>e<<24>>24?e:t)<<24>>24>0){o=f[f[a>>2]>>2]|0;l=a+40|0;k=on(f[l>>2]|0,f[l+4>>2]|0,f[c>>2]|0,0)|0;l=a+48|0;r=Tn(k|0,I|0,f[l>>2]|0,f[l+4>>2]|0)|0;l=o+r|0;r=0;while(1){E=+p[l>>3];o=+K(E)>=1.0?(E>0.0?~~+Y(+J(E/4294967296.0),4294967295.0)>>>0:~~+W((E-+(~~E>>>0))/4294967296.0)>>>0):0;k=g+(r<<3)|0;f[k>>2]=~~E>>>0;f[k+4>>2]=o;r=r+1|0;o=b[m>>0]|0;if((r|0)>=((o<<24>>24>e<<24>>24?e:o)<<24>>24|0)){F=o;break}else l=l+8|0}}else F=t;l=F<<24>>24;if(F<<24>>24>=e<<24>>24){i=1;return i|0}hj(g+(l<<3)|0,0,(e<<24>>24)-l<<3|0)|0;i=1;return i|0}case 11:{l=a+24|0;r=b[l>>0]|0;if((r<<24>>24>e<<24>>24?e:r)<<24>>24>0){m=f[f[a>>2]>>2]|0;z=a+40|0;o=on(f[z>>2]|0,f[z+4>>2]|0,f[c>>2]|0,0)|0;z=a+48|0;k=Tn(o|0,I|0,f[z>>2]|0,f[z+4>>2]|0)|0;z=m+k|0;k=0;while(1){m=g+(k<<3)|0;f[m>>2]=h[z>>0];f[m+4>>2]=0;k=k+1|0;m=b[l>>0]|0;if((k|0)>=((m<<24>>24>e<<24>>24?e:m)<<24>>24|0)){G=m;break}else z=z+1|0}}else G=r;z=G<<24>>24;if(G<<24>>24>=e<<24>>24){i=1;return i|0}hj(g+(z<<3)|0,0,(e<<24>>24)-z<<3|0)|0;i=1;return i|0}default:{i=0;return i|0}}while(0);return 0}function vb(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0;c=u;u=u+16|0;d=c+8|0;e=c;if((f[a+92>>2]|0)==(f[a+88>>2]|0)){u=c;return 1}g=a+52|0;h=f[g>>2]|0;if((h|0)==(f[a+56>>2]|0)){Ci(a+48|0,b);i=b}else{f[h>>2]=f[b>>2];f[g>>2]=h+4;i=b}b=a+84|0;f[b>>2]=0;h=a+4|0;g=f[h>>2]|0;j=f[i>>2]|0;k=j+1|0;if((j|0)!=-1){l=((k>>>0)%3|0|0)==0?j+-2|0:k;if((l|0)==-1)m=-1;else m=f[(f[g>>2]|0)+(l<<2)>>2]|0;l=(((j>>>0)%3|0|0)==0?2:-1)+j|0;if((l|0)==-1){n=m;o=-1}else{n=m;o=f[(f[g>>2]|0)+(l<<2)>>2]|0}}else{n=-1;o=-1}l=a+36|0;g=f[l>>2]|0;m=g+(n>>>5<<2)|0;j=1<<(n&31);k=f[m>>2]|0;if(!(k&j)){f[m>>2]=k|j;j=f[i>>2]|0;k=j+1|0;if((j|0)==-1)p=-1;else p=((k>>>0)%3|0|0)==0?j+-2|0:k;f[e>>2]=p;k=f[(f[(f[a+16>>2]|0)+96>>2]|0)+(((p>>>0)/3|0)*12|0)+(((p>>>0)%3|0)<<2)>>2]|0;p=f[a+20>>2]|0;f[d>>2]=k;j=f[p+4>>2]|0;p=j+4|0;m=f[p>>2]|0;if((m|0)==(f[j+8>>2]|0))Ci(j,d);else{f[m>>2]=k;f[p>>2]=m+4}m=a+12|0;p=f[m>>2]|0;k=p+4|0;j=f[k>>2]|0;if((j|0)==(f[p+8>>2]|0)){Ci(p,e);q=f[m>>2]|0}else{f[j>>2]=f[e>>2];f[k>>2]=j+4;q=p}p=q+24|0;f[(f[q+12>>2]|0)+(n<<2)>>2]=f[p>>2];f[p>>2]=(f[p>>2]|0)+1;r=f[l>>2]|0}else r=g;g=r+(o>>>5<<2)|0;r=1<<(o&31);p=f[g>>2]|0;if(!(p&r)){f[g>>2]=p|r;r=f[i>>2]|0;do if((r|0)!=-1)if(!((r>>>0)%3|0)){s=r+2|0;break}else{s=r+-1|0;break}else s=-1;while(0);f[e>>2]=s;r=f[(f[(f[a+16>>2]|0)+96>>2]|0)+(((s>>>0)/3|0)*12|0)+(((s>>>0)%3|0)<<2)>>2]|0;s=f[a+20>>2]|0;f[d>>2]=r;p=f[s+4>>2]|0;s=p+4|0;g=f[s>>2]|0;if((g|0)==(f[p+8>>2]|0))Ci(p,d);else{f[g>>2]=r;f[s>>2]=g+4}g=a+12|0;s=f[g>>2]|0;r=s+4|0;p=f[r>>2]|0;if((p|0)==(f[s+8>>2]|0)){Ci(s,e);t=f[g>>2]|0}else{f[p>>2]=f[e>>2];f[r>>2]=p+4;t=s}s=t+24|0;f[(f[t+12>>2]|0)+(o<<2)>>2]=f[s>>2];f[s>>2]=(f[s>>2]|0)+1}s=f[i>>2]|0;if((s|0)==-1)v=-1;else v=f[(f[f[h>>2]>>2]|0)+(s<<2)>>2]|0;s=(f[l>>2]|0)+(v>>>5<<2)|0;o=1<<(v&31);t=f[s>>2]|0;if(!(o&t)){f[s>>2]=t|o;o=f[i>>2]|0;f[e>>2]=o;t=f[(f[(f[a+16>>2]|0)+96>>2]|0)+(((o>>>0)/3|0)*12|0)+(((o>>>0)%3|0)<<2)>>2]|0;o=f[a+20>>2]|0;f[d>>2]=t;s=f[o+4>>2]|0;o=s+4|0;p=f[o>>2]|0;if((p|0)==(f[s+8>>2]|0))Ci(s,d);else{f[p>>2]=t;f[o>>2]=p+4}p=a+12|0;o=f[p>>2]|0;t=o+4|0;s=f[t>>2]|0;if((s|0)==(f[o+8>>2]|0)){Ci(o,e);w=f[p>>2]|0}else{f[s>>2]=f[e>>2];f[t>>2]=s+4;w=o}o=w+24|0;f[(f[w+12>>2]|0)+(v<<2)>>2]=f[o>>2];f[o>>2]=(f[o>>2]|0)+1}o=f[b>>2]|0;a:do if((o|0)<3){v=a+24|0;w=a+16|0;s=a+20|0;t=a+12|0;p=a+88|0;r=o;while(1){g=r;while(1){x=a+48+(g*12|0)+4|0;y=f[x>>2]|0;if((f[a+48+(g*12|0)>>2]|0)!=(y|0))break;if((g|0)<2)g=g+1|0;else break a}n=y+-4|0;q=f[n>>2]|0;f[x>>2]=n;f[b>>2]=g;f[i>>2]=q;if((q|0)==-1)break;n=(q>>>0)/3|0;j=f[v>>2]|0;do if(!(f[j+(n>>>5<<2)>>2]&1<<(n&31))){k=q;m=j;b:while(1){z=(k>>>0)/3|0;A=m+(z>>>5<<2)|0;f[A>>2]=1<<(z&31)|f[A>>2];A=f[i>>2]|0;if((A|0)==-1)B=-1;else B=f[(f[f[h>>2]>>2]|0)+(A<<2)>>2]|0;z=(f[l>>2]|0)+(B>>>5<<2)|0;C=1<<(B&31);D=f[z>>2]|0;if(!(C&D)){f[z>>2]=D|C;C=f[i>>2]|0;f[e>>2]=C;D=f[(f[(f[w>>2]|0)+96>>2]|0)+(((C>>>0)/3|0)*12|0)+(((C>>>0)%3|0)<<2)>>2]|0;C=f[s>>2]|0;f[d>>2]=D;z=f[C+4>>2]|0;C=z+4|0;E=f[C>>2]|0;if((E|0)==(f[z+8>>2]|0))Ci(z,d);else{f[E>>2]=D;f[C>>2]=E+4}E=f[t>>2]|0;C=E+4|0;D=f[C>>2]|0;if((D|0)==(f[E+8>>2]|0)){Ci(E,e);F=f[t>>2]|0}else{f[D>>2]=f[e>>2];f[C>>2]=D+4;F=E}E=F+24|0;f[(f[F+12>>2]|0)+(B<<2)>>2]=f[E>>2];f[E>>2]=(f[E>>2]|0)+1;G=f[i>>2]|0}else G=A;A=f[h>>2]|0;if((G|0)==-1){H=93;break}E=G+1|0;D=((E>>>0)%3|0|0)==0?G+-2|0:E;if((D|0)==-1)I=-1;else I=f[(f[A+12>>2]|0)+(D<<2)>>2]|0;D=(((G>>>0)%3|0|0)==0?2:-1)+G|0;if((D|0)==-1)J=-1;else J=f[(f[A+12>>2]|0)+(D<<2)>>2]|0;D=(I|0)==-1;E=D?-1:(I>>>0)/3|0;C=(J|0)==-1;z=C?-1:(J>>>0)/3|0;if(D)K=1;else K=(f[(f[v>>2]|0)+(E>>>5<<2)>>2]&1<<(E&31)|0)!=0;do if(C)if(K){H=93;break b}else H=82;else{if(f[(f[v>>2]|0)+(z>>>5<<2)>>2]&1<<(z&31)|0)if(K){H=93;break b}else{H=82;break}E=f[(f[A>>2]|0)+(J<<2)>>2]|0;if(!(1<<(E&31)&f[(f[l>>2]|0)+(E>>>5<<2)>>2])){L=(f[p>>2]|0)+(E<<2)|0;E=f[L>>2]|0;f[L>>2]=E+1;M=(E|0)>0?1:2}else M=0;if(K?(M|0)<=(f[b>>2]|0):0){N=J;break}f[d>>2]=J;E=a+48+(M*12|0)+4|0;L=f[E>>2]|0;if((L|0)==(f[a+48+(M*12|0)+8>>2]|0))Ci(a+48+(M*12|0)|0,d);else{f[L>>2]=J;f[E>>2]=L+4}if((f[b>>2]|0)>(M|0))f[b>>2]=M;if(K){H=93;break b}else H=82}while(0);if((H|0)==82){H=0;if(D)O=-1;else O=f[(f[f[h>>2]>>2]|0)+(I<<2)>>2]|0;if(!(1<<(O&31)&f[(f[l>>2]|0)+(O>>>5<<2)>>2])){A=(f[p>>2]|0)+(O<<2)|0;z=f[A>>2]|0;f[A>>2]=z+1;P=(z|0)>0?1:2}else P=0;if((P|0)>(f[b>>2]|0))break;else N=I}f[i>>2]=N;k=N;m=f[v>>2]|0}if((H|0)==93){H=0;Q=f[b>>2]|0;break}f[d>>2]=I;m=a+48+(P*12|0)+4|0;k=f[m>>2]|0;if((k|0)==(f[a+48+(P*12|0)+8>>2]|0))Ci(a+48+(P*12|0)|0,d);else{f[k>>2]=I;f[m>>2]=k+4}k=f[b>>2]|0;if((k|0)>(P|0)){f[b>>2]=P;R=P}else R=k;Q=R}else Q=g;while(0);if((Q|0)<3)r=Q;else break a}u=c;return 1}while(0);f[i>>2]=-1;u=c;return 1}function wb(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0;d=a;a=b;a:while(1){b=a;e=a+-4|0;g=d;while(1){h=g;b:while(1){i=h;j=b-i|0;k=j>>2;switch(k|0){case 2:{l=5;break a;break}case 3:{l=11;break a;break}case 4:{l=12;break a;break}case 5:{l=13;break a;break}case 1:case 0:{l=84;break a;break}default:{}}if((j|0)<124){l=15;break a}m=h+(((k|0)/2|0)<<2)|0;if((j|0)>3996){j=(k|0)/4|0;n=Tf(h,h+(j<<2)|0,m,m+(j<<2)|0,e,c)|0}else n=Cg(h,m,e,c)|0;o=f[h>>2]|0;j=f[m>>2]|0;p=f[c>>2]|0;k=f[p>>2]|0;q=(f[p+4>>2]|0)-k>>3;if(q>>>0<=o>>>0){l=20;break a}r=k;if(q>>>0<=j>>>0){l=22;break a}k=f[r+(o<<3)>>2]|0;s=f[r+(j<<3)>>2]|0;if(k>>>0<s>>>0){t=e;u=n;break}else v=e;while(1){v=v+-4|0;if((h|0)==(v|0))break;w=f[v>>2]|0;if(q>>>0<=w>>>0){l=51;break a}if((f[r+(w<<3)>>2]|0)>>>0<s>>>0){l=53;break b}}s=h+4|0;j=f[e>>2]|0;if(q>>>0<=j>>>0){l=26;break a}if(k>>>0<(f[r+(j<<3)>>2]|0)>>>0)x=s;else{if((s|0)==(e|0)){l=84;break a}else y=s;while(1){z=f[y>>2]|0;if(q>>>0<=z>>>0){l=32;break a}if(k>>>0<(f[r+(z<<3)>>2]|0)>>>0)break;s=y+4|0;if((s|0)==(e|0)){l=84;break a}else y=s}f[y>>2]=j;f[e>>2]=z;x=y+4|0}if((x|0)==(e|0)){l=84;break a}r=f[h>>2]|0;A=f[c>>2]|0;k=f[A>>2]|0;q=(f[A+4>>2]|0)-k>>3;if(q>>>0<=r>>>0){l=38;break a}s=k;k=e;B=x;C=r;while(1){r=s+(C<<3)|0;D=q>>>0>C>>>0;E=B;while(1){F=f[E>>2]|0;if(q>>>0<=F>>>0){l=40;break a}G=f[r>>2]|0;if(G>>>0<(f[s+(F<<3)>>2]|0)>>>0)break;if(D)E=E+4|0;else{l=38;break a}}if(q>>>0>C>>>0)H=k;else{l=46;break a}do{H=H+-4|0;I=f[H>>2]|0;if(q>>>0<=I>>>0){l=47;break a}}while(G>>>0<(f[s+(I<<3)>>2]|0)>>>0);if(E>>>0>=H>>>0){h=E;continue b}D=f[E>>2]|0;f[E>>2]=I;f[H>>2]=D;C=f[h>>2]|0;if(q>>>0<=C>>>0){l=38;break a}else{k=H;B=E+4|0}}}if((l|0)==53){l=0;f[h>>2]=w;f[v>>2]=o;t=v;u=n+1|0}B=h+4|0;c:do if(B>>>0<t>>>0){k=f[B>>2]|0;C=f[c>>2]|0;q=f[C>>2]|0;s=(f[C+4>>2]|0)-q>>3;if(s>>>0>k>>>0){J=t;K=B;L=u;M=m;N=s;O=q;P=C;Q=k}else{R=C;l=57;break a}while(1){C=f[c>>2]|0;k=C+4|0;q=f[M>>2]|0;s=K;j=O;D=N;S=P;r=Q;while(1){F=j;if(D>>>0<=q>>>0){l=59;break a}if((f[F+(r<<3)>>2]|0)>>>0>=(f[F+(q<<3)>>2]|0)>>>0)break;F=s+4|0;T=f[F>>2]|0;j=f[C>>2]|0;D=(f[k>>2]|0)-j>>3;if(D>>>0<=T>>>0){R=C;l=57;break a}else{s=F;S=C;r=T}}C=f[M>>2]|0;O=f[S>>2]|0;N=(f[S+4>>2]|0)-O>>3;D=O;j=D+(C<<3)|0;if(N>>>0>C>>>0)U=J;else{l=65;break a}do{U=U+-4|0;V=f[U>>2]|0;if(N>>>0<=V>>>0){l=66;break a}}while((f[D+(V<<3)>>2]|0)>>>0>=(f[j>>2]|0)>>>0);if(s>>>0>U>>>0){W=M;X=L;Y=s;break c}f[s>>2]=V;f[U>>2]=r;K=s+4|0;Q=f[K>>2]|0;if(N>>>0<=Q>>>0){R=S;l=57;break a}else{J=U;L=L+1|0;M=(M|0)==(s|0)?U:M;P=S}}}else{W=m;X=u;Y=B}while(0);if((Y|0)!=(W|0)){B=f[W>>2]|0;j=f[Y>>2]|0;Z=f[c>>2]|0;D=f[Z>>2]|0;C=(f[Z+4>>2]|0)-D>>3;if(C>>>0<=B>>>0){l=72;break a}k=D;if(C>>>0<=j>>>0){l=74;break a}if((f[k+(B<<3)>>2]|0)>>>0<(f[k+(j<<3)>>2]|0)>>>0){f[Y>>2]=B;f[W>>2]=j;_=X+1|0}else _=X}else _=X;if(!_){$=Qd(h,Y,c)|0;j=Y+4|0;if(Qd(j,a,c)|0){l=83;break}if($){g=j;continue}}j=Y;if((j-i|0)>=(b-j|0)){l=82;break}wb(h,Y,c);g=Y+4|0}if((l|0)==82){l=0;wb(Y+4|0,a,c);d=h;a=Y;continue}else if((l|0)==83){l=0;if($){l=84;break}else{d=h;a=Y;continue}}}switch(l|0){case 5:{l=f[e>>2]|0;Y=f[h>>2]|0;d=f[c>>2]|0;$=f[d>>2]|0;i=(f[d+4>>2]|0)-$>>3;if(i>>>0<=l>>>0)mq(d);_=$;if(i>>>0<=Y>>>0)mq(d);if((f[_+(l<<3)>>2]|0)>>>0>=(f[_+(Y<<3)>>2]|0)>>>0)return;f[h>>2]=l;f[e>>2]=Y;return}case 11:{Cg(h,h+4|0,e,c)|0;return}case 12:{Qg(h,h+4|0,h+8|0,e,c)|0;return}case 13:{Tf(h,h+4|0,h+8|0,h+12|0,e,c)|0;return}case 15:{Pg(h,a,c);return}case 20:{mq(p);break}case 22:{mq(p);break}case 26:{mq(p);break}case 32:{mq(p);break}case 38:{mq(A);break}case 40:{mq(A);break}case 46:{mq(A);break}case 47:{mq(A);break}case 51:{mq(p);break}case 57:{mq(R);break}case 59:{mq(S);break}case 65:{if(N>>>0>(f[J+-4>>2]|0)>>>0)mq(S);else mq(S);break}case 66:{mq(S);break}case 72:{mq(Z);break}case 74:{mq(Z);break}case 84:return}}function xb(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0;d=a;a=b;a:while(1){b=a;e=a+-4|0;g=d;while(1){h=g;b:while(1){i=h;j=b-i|0;k=j>>2;switch(k|0){case 2:{l=5;break a;break}case 3:{l=11;break a;break}case 4:{l=12;break a;break}case 5:{l=13;break a;break}case 1:case 0:{l=84;break a;break}default:{}}if((j|0)<124){l=15;break a}m=h+(((k|0)/2|0)<<2)|0;if((j|0)>3996){j=(k|0)/4|0;n=Tf(h,h+(j<<2)|0,m,m+(j<<2)|0,e,c)|0}else n=Cg(h,m,e,c)|0;o=f[h>>2]|0;j=f[m>>2]|0;p=f[c>>2]|0;k=f[p>>2]|0;q=(f[p+4>>2]|0)-k>>3;if(q>>>0<=o>>>0){l=20;break a}r=k;if(q>>>0<=j>>>0){l=22;break a}k=f[r+(o<<3)>>2]|0;s=f[r+(j<<3)>>2]|0;if(k>>>0<s>>>0){t=e;u=n;break}else v=e;while(1){v=v+-4|0;if((h|0)==(v|0))break;w=f[v>>2]|0;if(q>>>0<=w>>>0){l=51;break a}if((f[r+(w<<3)>>2]|0)>>>0<s>>>0){l=53;break b}}s=h+4|0;j=f[e>>2]|0;if(q>>>0<=j>>>0){l=26;break a}if(k>>>0<(f[r+(j<<3)>>2]|0)>>>0)x=s;else{if((s|0)==(e|0)){l=84;break a}else y=s;while(1){z=f[y>>2]|0;if(q>>>0<=z>>>0){l=32;break a}if(k>>>0<(f[r+(z<<3)>>2]|0)>>>0)break;s=y+4|0;if((s|0)==(e|0)){l=84;break a}else y=s}f[y>>2]=j;f[e>>2]=z;x=y+4|0}if((x|0)==(e|0)){l=84;break a}r=f[h>>2]|0;A=f[c>>2]|0;k=f[A>>2]|0;q=(f[A+4>>2]|0)-k>>3;if(q>>>0<=r>>>0){l=38;break a}s=k;k=e;B=x;C=r;while(1){r=s+(C<<3)|0;D=q>>>0>C>>>0;E=B;while(1){F=f[E>>2]|0;if(q>>>0<=F>>>0){l=40;break a}G=f[r>>2]|0;if(G>>>0<(f[s+(F<<3)>>2]|0)>>>0)break;if(D)E=E+4|0;else{l=38;break a}}if(q>>>0>C>>>0)H=k;else{l=46;break a}do{H=H+-4|0;I=f[H>>2]|0;if(q>>>0<=I>>>0){l=47;break a}}while(G>>>0<(f[s+(I<<3)>>2]|0)>>>0);if(E>>>0>=H>>>0){h=E;continue b}D=f[E>>2]|0;f[E>>2]=I;f[H>>2]=D;C=f[h>>2]|0;if(q>>>0<=C>>>0){l=38;break a}else{k=H;B=E+4|0}}}if((l|0)==53){l=0;f[h>>2]=w;f[v>>2]=o;t=v;u=n+1|0}B=h+4|0;c:do if(B>>>0<t>>>0){k=f[B>>2]|0;C=f[c>>2]|0;q=f[C>>2]|0;s=(f[C+4>>2]|0)-q>>3;if(s>>>0>k>>>0){J=t;K=B;L=u;M=m;N=s;O=q;P=C;Q=k}else{R=C;l=57;break a}while(1){C=f[c>>2]|0;k=C+4|0;q=f[M>>2]|0;s=K;j=O;D=N;S=P;r=Q;while(1){F=j;if(D>>>0<=q>>>0){l=59;break a}if((f[F+(r<<3)>>2]|0)>>>0>=(f[F+(q<<3)>>2]|0)>>>0)break;F=s+4|0;T=f[F>>2]|0;j=f[C>>2]|0;D=(f[k>>2]|0)-j>>3;if(D>>>0<=T>>>0){R=C;l=57;break a}else{s=F;S=C;r=T}}C=f[M>>2]|0;O=f[S>>2]|0;N=(f[S+4>>2]|0)-O>>3;D=O;j=D+(C<<3)|0;if(N>>>0>C>>>0)U=J;else{l=65;break a}do{U=U+-4|0;V=f[U>>2]|0;if(N>>>0<=V>>>0){l=66;break a}}while((f[D+(V<<3)>>2]|0)>>>0>=(f[j>>2]|0)>>>0);if(s>>>0>U>>>0){W=M;X=L;Y=s;break c}f[s>>2]=V;f[U>>2]=r;K=s+4|0;Q=f[K>>2]|0;if(N>>>0<=Q>>>0){R=S;l=57;break a}else{J=U;L=L+1|0;M=(M|0)==(s|0)?U:M;P=S}}}else{W=m;X=u;Y=B}while(0);if((Y|0)!=(W|0)){B=f[W>>2]|0;j=f[Y>>2]|0;Z=f[c>>2]|0;D=f[Z>>2]|0;C=(f[Z+4>>2]|0)-D>>3;if(C>>>0<=B>>>0){l=72;break a}k=D;if(C>>>0<=j>>>0){l=74;break a}if((f[k+(B<<3)>>2]|0)>>>0<(f[k+(j<<3)>>2]|0)>>>0){f[Y>>2]=B;f[W>>2]=j;_=X+1|0}else _=X}else _=X;if(!_){$=Qd(h,Y,c)|0;j=Y+4|0;if(Qd(j,a,c)|0){l=83;break}if($){g=j;continue}}j=Y;if((j-i|0)>=(b-j|0)){l=82;break}xb(h,Y,c);g=Y+4|0}if((l|0)==82){l=0;xb(Y+4|0,a,c);d=h;a=Y;continue}else if((l|0)==83){l=0;if($){l=84;break}else{d=h;a=Y;continue}}}switch(l|0){case 5:{l=f[e>>2]|0;Y=f[h>>2]|0;d=f[c>>2]|0;$=f[d>>2]|0;i=(f[d+4>>2]|0)-$>>3;if(i>>>0<=l>>>0)mq(d);_=$;if(i>>>0<=Y>>>0)mq(d);if((f[_+(l<<3)>>2]|0)>>>0>=(f[_+(Y<<3)>>2]|0)>>>0)return;f[h>>2]=l;f[e>>2]=Y;return}case 11:{Cg(h,h+4|0,e,c)|0;return}case 12:{Qg(h,h+4|0,h+8|0,e,c)|0;return}case 13:{Tf(h,h+4|0,h+8|0,h+12|0,e,c)|0;return}case 15:{Pg(h,a,c);return}case 20:{mq(p);break}case 22:{mq(p);break}case 26:{mq(p);break}case 32:{mq(p);break}case 38:{mq(A);break}case 40:{mq(A);break}case 46:{mq(A);break}case 47:{mq(A);break}case 51:{mq(p);break}case 57:{mq(R);break}case 59:{mq(S);break}case 65:{if(N>>>0>(f[J+-4>>2]|0)>>>0)mq(S);else mq(S);break}case 66:{mq(S);break}case 72:{mq(Z);break}case 74:{mq(Z);break}case 84:return}}function yb(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0;d=a;a=b;a:while(1){b=a;e=a+-4|0;g=d;while(1){h=g;b:while(1){i=h;j=b-i|0;k=j>>2;switch(k|0){case 2:{l=5;break a;break}case 3:{l=11;break a;break}case 4:{l=12;break a;break}case 5:{l=13;break a;break}case 1:case 0:{l=84;break a;break}default:{}}if((j|0)<124){l=15;break a}m=h+(((k|0)/2|0)<<2)|0;if((j|0)>3996){j=(k|0)/4|0;n=Tf(h,h+(j<<2)|0,m,m+(j<<2)|0,e,c)|0}else n=Cg(h,m,e,c)|0;o=f[h>>2]|0;j=f[m>>2]|0;p=f[c>>2]|0;k=f[p>>2]|0;q=(f[p+4>>2]|0)-k>>3;if(q>>>0<=o>>>0){l=20;break a}r=k;if(q>>>0<=j>>>0){l=22;break a}k=f[r+(o<<3)>>2]|0;s=f[r+(j<<3)>>2]|0;if(k>>>0<s>>>0){t=e;u=n;break}else v=e;while(1){v=v+-4|0;if((h|0)==(v|0))break;w=f[v>>2]|0;if(q>>>0<=w>>>0){l=51;break a}if((f[r+(w<<3)>>2]|0)>>>0<s>>>0){l=53;break b}}s=h+4|0;j=f[e>>2]|0;if(q>>>0<=j>>>0){l=26;break a}if(k>>>0<(f[r+(j<<3)>>2]|0)>>>0)x=s;else{if((s|0)==(e|0)){l=84;break a}else y=s;while(1){z=f[y>>2]|0;if(q>>>0<=z>>>0){l=32;break a}if(k>>>0<(f[r+(z<<3)>>2]|0)>>>0)break;s=y+4|0;if((s|0)==(e|0)){l=84;break a}else y=s}f[y>>2]=j;f[e>>2]=z;x=y+4|0}if((x|0)==(e|0)){l=84;break a}r=f[h>>2]|0;A=f[c>>2]|0;k=f[A>>2]|0;q=(f[A+4>>2]|0)-k>>3;if(q>>>0<=r>>>0){l=38;break a}s=k;k=e;B=x;C=r;while(1){r=s+(C<<3)|0;D=q>>>0>C>>>0;E=B;while(1){F=f[E>>2]|0;if(q>>>0<=F>>>0){l=40;break a}G=f[r>>2]|0;if(G>>>0<(f[s+(F<<3)>>2]|0)>>>0)break;if(D)E=E+4|0;else{l=38;break a}}if(q>>>0>C>>>0)H=k;else{l=46;break a}do{H=H+-4|0;I=f[H>>2]|0;if(q>>>0<=I>>>0){l=47;break a}}while(G>>>0<(f[s+(I<<3)>>2]|0)>>>0);if(E>>>0>=H>>>0){h=E;continue b}D=f[E>>2]|0;f[E>>2]=I;f[H>>2]=D;C=f[h>>2]|0;if(q>>>0<=C>>>0){l=38;break a}else{k=H;B=E+4|0}}}if((l|0)==53){l=0;f[h>>2]=w;f[v>>2]=o;t=v;u=n+1|0}B=h+4|0;c:do if(B>>>0<t>>>0){k=f[B>>2]|0;C=f[c>>2]|0;q=f[C>>2]|0;s=(f[C+4>>2]|0)-q>>3;if(s>>>0>k>>>0){J=t;K=B;L=u;M=m;N=s;O=q;P=C;Q=k}else{R=C;l=57;break a}while(1){C=f[c>>2]|0;k=C+4|0;q=f[M>>2]|0;s=K;j=O;D=N;S=P;r=Q;while(1){F=j;if(D>>>0<=q>>>0){l=59;break a}if((f[F+(r<<3)>>2]|0)>>>0>=(f[F+(q<<3)>>2]|0)>>>0)break;F=s+4|0;T=f[F>>2]|0;j=f[C>>2]|0;D=(f[k>>2]|0)-j>>3;if(D>>>0<=T>>>0){R=C;l=57;break a}else{s=F;S=C;r=T}}C=f[M>>2]|0;O=f[S>>2]|0;N=(f[S+4>>2]|0)-O>>3;D=O;j=D+(C<<3)|0;if(N>>>0>C>>>0)U=J;else{l=65;break a}do{U=U+-4|0;V=f[U>>2]|0;if(N>>>0<=V>>>0){l=66;break a}}while((f[D+(V<<3)>>2]|0)>>>0>=(f[j>>2]|0)>>>0);if(s>>>0>U>>>0){W=M;X=L;Y=s;break c}f[s>>2]=V;f[U>>2]=r;K=s+4|0;Q=f[K>>2]|0;if(N>>>0<=Q>>>0){R=S;l=57;break a}else{J=U;L=L+1|0;M=(M|0)==(s|0)?U:M;P=S}}}else{W=m;X=u;Y=B}while(0);if((Y|0)!=(W|0)){B=f[W>>2]|0;j=f[Y>>2]|0;Z=f[c>>2]|0;D=f[Z>>2]|0;C=(f[Z+4>>2]|0)-D>>3;if(C>>>0<=B>>>0){l=72;break a}k=D;if(C>>>0<=j>>>0){l=74;break a}if((f[k+(B<<3)>>2]|0)>>>0<(f[k+(j<<3)>>2]|0)>>>0){f[Y>>2]=B;f[W>>2]=j;_=X+1|0}else _=X}else _=X;if(!_){$=Qd(h,Y,c)|0;j=Y+4|0;if(Qd(j,a,c)|0){l=83;break}if($){g=j;continue}}j=Y;if((j-i|0)>=(b-j|0)){l=82;break}yb(h,Y,c);g=Y+4|0}if((l|0)==82){l=0;yb(Y+4|0,a,c);d=h;a=Y;continue}else if((l|0)==83){l=0;if($){l=84;break}else{d=h;a=Y;continue}}}switch(l|0){case 5:{l=f[e>>2]|0;Y=f[h>>2]|0;d=f[c>>2]|0;$=f[d>>2]|0;i=(f[d+4>>2]|0)-$>>3;if(i>>>0<=l>>>0)mq(d);_=$;if(i>>>0<=Y>>>0)mq(d);if((f[_+(l<<3)>>2]|0)>>>0>=(f[_+(Y<<3)>>2]|0)>>>0)return;f[h>>2]=l;f[e>>2]=Y;return}case 11:{Cg(h,h+4|0,e,c)|0;return}case 12:{Qg(h,h+4|0,h+8|0,e,c)|0;return}case 13:{Tf(h,h+4|0,h+8|0,h+12|0,e,c)|0;return}case 15:{Pg(h,a,c);return}case 20:{mq(p);break}case 22:{mq(p);break}case 26:{mq(p);break}case 32:{mq(p);break}case 38:{mq(A);break}case 40:{mq(A);break}case 46:{mq(A);break}case 47:{mq(A);break}case 51:{mq(p);break}case 57:{mq(R);break}case 59:{mq(S);break}case 65:{if(N>>>0>(f[J+-4>>2]|0)>>>0)mq(S);else mq(S);break}case 66:{mq(S);break}case 72:{mq(Z);break}case 74:{mq(Z);break}case 84:return}}function zb(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0;d=a;a=b;a:while(1){b=a;e=a+-4|0;g=d;while(1){h=g;b:while(1){i=h;j=b-i|0;k=j>>2;switch(k|0){case 2:{l=5;break a;break}case 3:{l=11;break a;break}case 4:{l=12;break a;break}case 5:{l=13;break a;break}case 1:case 0:{l=84;break a;break}default:{}}if((j|0)<124){l=15;break a}m=h+(((k|0)/2|0)<<2)|0;if((j|0)>3996){j=(k|0)/4|0;n=Tf(h,h+(j<<2)|0,m,m+(j<<2)|0,e,c)|0}else n=Cg(h,m,e,c)|0;o=f[h>>2]|0;j=f[m>>2]|0;p=f[c>>2]|0;k=f[p>>2]|0;q=(f[p+4>>2]|0)-k>>3;if(q>>>0<=o>>>0){l=20;break a}r=k;if(q>>>0<=j>>>0){l=22;break a}k=f[r+(o<<3)>>2]|0;s=f[r+(j<<3)>>2]|0;if(k>>>0<s>>>0){t=e;u=n;break}else v=e;while(1){v=v+-4|0;if((h|0)==(v|0))break;w=f[v>>2]|0;if(q>>>0<=w>>>0){l=51;break a}if((f[r+(w<<3)>>2]|0)>>>0<s>>>0){l=53;break b}}s=h+4|0;j=f[e>>2]|0;if(q>>>0<=j>>>0){l=26;break a}if(k>>>0<(f[r+(j<<3)>>2]|0)>>>0)x=s;else{if((s|0)==(e|0)){l=84;break a}else y=s;while(1){z=f[y>>2]|0;if(q>>>0<=z>>>0){l=32;break a}if(k>>>0<(f[r+(z<<3)>>2]|0)>>>0)break;s=y+4|0;if((s|0)==(e|0)){l=84;break a}else y=s}f[y>>2]=j;f[e>>2]=z;x=y+4|0}if((x|0)==(e|0)){l=84;break a}r=f[h>>2]|0;A=f[c>>2]|0;k=f[A>>2]|0;q=(f[A+4>>2]|0)-k>>3;if(q>>>0<=r>>>0){l=38;break a}s=k;k=e;B=x;C=r;while(1){r=s+(C<<3)|0;D=q>>>0>C>>>0;E=B;while(1){F=f[E>>2]|0;if(q>>>0<=F>>>0){l=40;break a}G=f[r>>2]|0;if(G>>>0<(f[s+(F<<3)>>2]|0)>>>0)break;if(D)E=E+4|0;else{l=38;break a}}if(q>>>0>C>>>0)H=k;else{l=46;break a}do{H=H+-4|0;I=f[H>>2]|0;if(q>>>0<=I>>>0){l=47;break a}}while(G>>>0<(f[s+(I<<3)>>2]|0)>>>0);if(E>>>0>=H>>>0){h=E;continue b}D=f[E>>2]|0;f[E>>2]=I;f[H>>2]=D;C=f[h>>2]|0;if(q>>>0<=C>>>0){l=38;break a}else{k=H;B=E+4|0}}}if((l|0)==53){l=0;f[h>>2]=w;f[v>>2]=o;t=v;u=n+1|0}B=h+4|0;c:do if(B>>>0<t>>>0){k=f[B>>2]|0;C=f[c>>2]|0;q=f[C>>2]|0;s=(f[C+4>>2]|0)-q>>3;if(s>>>0>k>>>0){J=t;K=B;L=u;M=m;N=s;O=q;P=C;Q=k}else{R=C;l=57;break a}while(1){C=f[c>>2]|0;k=C+4|0;q=f[M>>2]|0;s=K;j=O;D=N;S=P;r=Q;while(1){F=j;if(D>>>0<=q>>>0){l=59;break a}if((f[F+(r<<3)>>2]|0)>>>0>=(f[F+(q<<3)>>2]|0)>>>0)break;F=s+4|0;T=f[F>>2]|0;j=f[C>>2]|0;D=(f[k>>2]|0)-j>>3;if(D>>>0<=T>>>0){R=C;l=57;break a}else{s=F;S=C;r=T}}C=f[M>>2]|0;O=f[S>>2]|0;N=(f[S+4>>2]|0)-O>>3;D=O;j=D+(C<<3)|0;if(N>>>0>C>>>0)U=J;else{l=65;break a}do{U=U+-4|0;V=f[U>>2]|0;if(N>>>0<=V>>>0){l=66;break a}}while((f[D+(V<<3)>>2]|0)>>>0>=(f[j>>2]|0)>>>0);if(s>>>0>U>>>0){W=M;X=L;Y=s;break c}f[s>>2]=V;f[U>>2]=r;K=s+4|0;Q=f[K>>2]|0;if(N>>>0<=Q>>>0){R=S;l=57;break a}else{J=U;L=L+1|0;M=(M|0)==(s|0)?U:M;P=S}}}else{W=m;X=u;Y=B}while(0);if((Y|0)!=(W|0)){B=f[W>>2]|0;j=f[Y>>2]|0;Z=f[c>>2]|0;D=f[Z>>2]|0;C=(f[Z+4>>2]|0)-D>>3;if(C>>>0<=B>>>0){l=72;break a}k=D;if(C>>>0<=j>>>0){l=74;break a}if((f[k+(B<<3)>>2]|0)>>>0<(f[k+(j<<3)>>2]|0)>>>0){f[Y>>2]=B;f[W>>2]=j;_=X+1|0}else _=X}else _=X;if(!_){$=Qd(h,Y,c)|0;j=Y+4|0;if(Qd(j,a,c)|0){l=83;break}if($){g=j;continue}}j=Y;if((j-i|0)>=(b-j|0)){l=82;break}zb(h,Y,c);g=Y+4|0}if((l|0)==82){l=0;zb(Y+4|0,a,c);d=h;a=Y;continue}else if((l|0)==83){l=0;if($){l=84;break}else{d=h;a=Y;continue}}}switch(l|0){case 5:{l=f[e>>2]|0;Y=f[h>>2]|0;d=f[c>>2]|0;$=f[d>>2]|0;i=(f[d+4>>2]|0)-$>>3;if(i>>>0<=l>>>0)mq(d);_=$;if(i>>>0<=Y>>>0)mq(d);if((f[_+(l<<3)>>2]|0)>>>0>=(f[_+(Y<<3)>>2]|0)>>>0)return;f[h>>2]=l;f[e>>2]=Y;return}case 11:{Cg(h,h+4|0,e,c)|0;return}case 12:{Qg(h,h+4|0,h+8|0,e,c)|0;return}case 13:{Tf(h,h+4|0,h+8|0,h+12|0,e,c)|0;return}case 15:{Pg(h,a,c);return}case 20:{mq(p);break}case 22:{mq(p);break}case 26:{mq(p);break}case 32:{mq(p);break}case 38:{mq(A);break}case 40:{mq(A);break}case 46:{mq(A);break}case 47:{mq(A);break}case 51:{mq(p);break}case 57:{mq(R);break}case 59:{mq(S);break}case 65:{if(N>>>0>(f[J+-4>>2]|0)>>>0)mq(S);else mq(S);break}case 66:{mq(S);break}case 72:{mq(Z);break}case 74:{mq(Z);break}case 84:return}}function Ab(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0;d=a;a=b;a:while(1){b=a;e=a+-4|0;g=d;while(1){h=g;b:while(1){i=h;j=b-i|0;k=j>>2;switch(k|0){case 2:{l=5;break a;break}case 3:{l=11;break a;break}case 4:{l=12;break a;break}case 5:{l=13;break a;break}case 1:case 0:{l=84;break a;break}default:{}}if((j|0)<124){l=15;break a}m=h+(((k|0)/2|0)<<2)|0;if((j|0)>3996){j=(k|0)/4|0;n=Tf(h,h+(j<<2)|0,m,m+(j<<2)|0,e,c)|0}else n=Cg(h,m,e,c)|0;o=f[h>>2]|0;j=f[m>>2]|0;p=f[c>>2]|0;k=f[p>>2]|0;q=(f[p+4>>2]|0)-k>>3;if(q>>>0<=o>>>0){l=20;break a}r=k;if(q>>>0<=j>>>0){l=22;break a}k=f[r+(o<<3)>>2]|0;s=f[r+(j<<3)>>2]|0;if(k>>>0<s>>>0){t=e;u=n;break}else v=e;while(1){v=v+-4|0;if((h|0)==(v|0))break;w=f[v>>2]|0;if(q>>>0<=w>>>0){l=51;break a}if((f[r+(w<<3)>>2]|0)>>>0<s>>>0){l=53;break b}}s=h+4|0;j=f[e>>2]|0;if(q>>>0<=j>>>0){l=26;break a}if(k>>>0<(f[r+(j<<3)>>2]|0)>>>0)x=s;else{if((s|0)==(e|0)){l=84;break a}else y=s;while(1){z=f[y>>2]|0;if(q>>>0<=z>>>0){l=32;break a}if(k>>>0<(f[r+(z<<3)>>2]|0)>>>0)break;s=y+4|0;if((s|0)==(e|0)){l=84;break a}else y=s}f[y>>2]=j;f[e>>2]=z;x=y+4|0}if((x|0)==(e|0)){l=84;break a}r=f[h>>2]|0;A=f[c>>2]|0;k=f[A>>2]|0;q=(f[A+4>>2]|0)-k>>3;if(q>>>0<=r>>>0){l=38;break a}s=k;k=e;B=x;C=r;while(1){r=s+(C<<3)|0;D=q>>>0>C>>>0;E=B;while(1){F=f[E>>2]|0;if(q>>>0<=F>>>0){l=40;break a}G=f[r>>2]|0;if(G>>>0<(f[s+(F<<3)>>2]|0)>>>0)break;if(D)E=E+4|0;else{l=38;break a}}if(q>>>0>C>>>0)H=k;else{l=46;break a}do{H=H+-4|0;I=f[H>>2]|0;if(q>>>0<=I>>>0){l=47;break a}}while(G>>>0<(f[s+(I<<3)>>2]|0)>>>0);if(E>>>0>=H>>>0){h=E;continue b}D=f[E>>2]|0;f[E>>2]=I;f[H>>2]=D;C=f[h>>2]|0;if(q>>>0<=C>>>0){l=38;break a}else{k=H;B=E+4|0}}}if((l|0)==53){l=0;f[h>>2]=w;f[v>>2]=o;t=v;u=n+1|0}B=h+4|0;c:do if(B>>>0<t>>>0){k=f[B>>2]|0;C=f[c>>2]|0;q=f[C>>2]|0;s=(f[C+4>>2]|0)-q>>3;if(s>>>0>k>>>0){J=t;K=B;L=u;M=m;N=s;O=q;P=C;Q=k}else{R=C;l=57;break a}while(1){C=f[c>>2]|0;k=C+4|0;q=f[M>>2]|0;s=K;j=O;D=N;S=P;r=Q;while(1){F=j;if(D>>>0<=q>>>0){l=59;break a}if((f[F+(r<<3)>>2]|0)>>>0>=(f[F+(q<<3)>>2]|0)>>>0)break;F=s+4|0;T=f[F>>2]|0;j=f[C>>2]|0;D=(f[k>>2]|0)-j>>3;if(D>>>0<=T>>>0){R=C;l=57;break a}else{s=F;S=C;r=T}}C=f[M>>2]|0;O=f[S>>2]|0;N=(f[S+4>>2]|0)-O>>3;D=O;j=D+(C<<3)|0;if(N>>>0>C>>>0)U=J;else{l=65;break a}do{U=U+-4|0;V=f[U>>2]|0;if(N>>>0<=V>>>0){l=66;break a}}while((f[D+(V<<3)>>2]|0)>>>0>=(f[j>>2]|0)>>>0);if(s>>>0>U>>>0){W=M;X=L;Y=s;break c}f[s>>2]=V;f[U>>2]=r;K=s+4|0;Q=f[K>>2]|0;if(N>>>0<=Q>>>0){R=S;l=57;break a}else{J=U;L=L+1|0;M=(M|0)==(s|0)?U:M;P=S}}}else{W=m;X=u;Y=B}while(0);if((Y|0)!=(W|0)){B=f[W>>2]|0;j=f[Y>>2]|0;Z=f[c>>2]|0;D=f[Z>>2]|0;C=(f[Z+4>>2]|0)-D>>3;if(C>>>0<=B>>>0){l=72;break a}k=D;if(C>>>0<=j>>>0){l=74;break a}if((f[k+(B<<3)>>2]|0)>>>0<(f[k+(j<<3)>>2]|0)>>>0){f[Y>>2]=B;f[W>>2]=j;_=X+1|0}else _=X}else _=X;if(!_){$=Qd(h,Y,c)|0;j=Y+4|0;if(Qd(j,a,c)|0){l=83;break}if($){g=j;continue}}j=Y;if((j-i|0)>=(b-j|0)){l=82;break}Ab(h,Y,c);g=Y+4|0}if((l|0)==82){l=0;Ab(Y+4|0,a,c);d=h;a=Y;continue}else if((l|0)==83){l=0;if($){l=84;break}else{d=h;a=Y;continue}}}switch(l|0){case 5:{l=f[e>>2]|0;Y=f[h>>2]|0;d=f[c>>2]|0;$=f[d>>2]|0;i=(f[d+4>>2]|0)-$>>3;if(i>>>0<=l>>>0)mq(d);_=$;if(i>>>0<=Y>>>0)mq(d);if((f[_+(l<<3)>>2]|0)>>>0>=(f[_+(Y<<3)>>2]|0)>>>0)return;f[h>>2]=l;f[e>>2]=Y;return}case 11:{Cg(h,h+4|0,e,c)|0;return}case 12:{Qg(h,h+4|0,h+8|0,e,c)|0;return}case 13:{Tf(h,h+4|0,h+8|0,h+12|0,e,c)|0;return}case 15:{Pg(h,a,c);return}case 20:{mq(p);break}case 22:{mq(p);break}case 26:{mq(p);break}case 32:{mq(p);break}case 38:{mq(A);break}case 40:{mq(A);break}case 46:{mq(A);break}case 47:{mq(A);break}case 51:{mq(p);break}case 57:{mq(R);break}case 59:{mq(S);break}case 65:{if(N>>>0>(f[J+-4>>2]|0)>>>0)mq(S);else mq(S);break}case 66:{mq(S);break}case 72:{mq(Z);break}case 74:{mq(Z);break}case 84:return}}\nfunction Bb(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0;d=a;a=b;a:while(1){b=a;e=a+-4|0;g=d;while(1){h=g;b:while(1){i=h;j=b-i|0;k=j>>2;switch(k|0){case 2:{l=5;break a;break}case 3:{l=11;break a;break}case 4:{l=12;break a;break}case 5:{l=13;break a;break}case 1:case 0:{l=84;break a;break}default:{}}if((j|0)<124){l=15;break a}m=h+(((k|0)/2|0)<<2)|0;if((j|0)>3996){j=(k|0)/4|0;n=Tf(h,h+(j<<2)|0,m,m+(j<<2)|0,e,c)|0}else n=Cg(h,m,e,c)|0;o=f[h>>2]|0;j=f[m>>2]|0;p=f[c>>2]|0;k=f[p>>2]|0;q=(f[p+4>>2]|0)-k>>3;if(q>>>0<=o>>>0){l=20;break a}r=k;if(q>>>0<=j>>>0){l=22;break a}k=f[r+(o<<3)>>2]|0;s=f[r+(j<<3)>>2]|0;if(k>>>0<s>>>0){t=e;u=n;break}else v=e;while(1){v=v+-4|0;if((h|0)==(v|0))break;w=f[v>>2]|0;if(q>>>0<=w>>>0){l=51;break a}if((f[r+(w<<3)>>2]|0)>>>0<s>>>0){l=53;break b}}s=h+4|0;j=f[e>>2]|0;if(q>>>0<=j>>>0){l=26;break a}if(k>>>0<(f[r+(j<<3)>>2]|0)>>>0)x=s;else{if((s|0)==(e|0)){l=84;break a}else y=s;while(1){z=f[y>>2]|0;if(q>>>0<=z>>>0){l=32;break a}if(k>>>0<(f[r+(z<<3)>>2]|0)>>>0)break;s=y+4|0;if((s|0)==(e|0)){l=84;break a}else y=s}f[y>>2]=j;f[e>>2]=z;x=y+4|0}if((x|0)==(e|0)){l=84;break a}r=f[h>>2]|0;A=f[c>>2]|0;k=f[A>>2]|0;q=(f[A+4>>2]|0)-k>>3;if(q>>>0<=r>>>0){l=38;break a}s=k;k=e;B=x;C=r;while(1){r=s+(C<<3)|0;D=q>>>0>C>>>0;E=B;while(1){F=f[E>>2]|0;if(q>>>0<=F>>>0){l=40;break a}G=f[r>>2]|0;if(G>>>0<(f[s+(F<<3)>>2]|0)>>>0)break;if(D)E=E+4|0;else{l=38;break a}}if(q>>>0>C>>>0)H=k;else{l=46;break a}do{H=H+-4|0;I=f[H>>2]|0;if(q>>>0<=I>>>0){l=47;break a}}while(G>>>0<(f[s+(I<<3)>>2]|0)>>>0);if(E>>>0>=H>>>0){h=E;continue b}D=f[E>>2]|0;f[E>>2]=I;f[H>>2]=D;C=f[h>>2]|0;if(q>>>0<=C>>>0){l=38;break a}else{k=H;B=E+4|0}}}if((l|0)==53){l=0;f[h>>2]=w;f[v>>2]=o;t=v;u=n+1|0}B=h+4|0;c:do if(B>>>0<t>>>0){k=f[B>>2]|0;C=f[c>>2]|0;q=f[C>>2]|0;s=(f[C+4>>2]|0)-q>>3;if(s>>>0>k>>>0){J=t;K=B;L=u;M=m;N=s;O=q;P=C;Q=k}else{R=C;l=57;break a}while(1){C=f[c>>2]|0;k=C+4|0;q=f[M>>2]|0;s=K;j=O;D=N;S=P;r=Q;while(1){F=j;if(D>>>0<=q>>>0){l=59;break a}if((f[F+(r<<3)>>2]|0)>>>0>=(f[F+(q<<3)>>2]|0)>>>0)break;F=s+4|0;T=f[F>>2]|0;j=f[C>>2]|0;D=(f[k>>2]|0)-j>>3;if(D>>>0<=T>>>0){R=C;l=57;break a}else{s=F;S=C;r=T}}C=f[M>>2]|0;O=f[S>>2]|0;N=(f[S+4>>2]|0)-O>>3;D=O;j=D+(C<<3)|0;if(N>>>0>C>>>0)U=J;else{l=65;break a}do{U=U+-4|0;V=f[U>>2]|0;if(N>>>0<=V>>>0){l=66;break a}}while((f[D+(V<<3)>>2]|0)>>>0>=(f[j>>2]|0)>>>0);if(s>>>0>U>>>0){W=M;X=L;Y=s;break c}f[s>>2]=V;f[U>>2]=r;K=s+4|0;Q=f[K>>2]|0;if(N>>>0<=Q>>>0){R=S;l=57;break a}else{J=U;L=L+1|0;M=(M|0)==(s|0)?U:M;P=S}}}else{W=m;X=u;Y=B}while(0);if((Y|0)!=(W|0)){B=f[W>>2]|0;j=f[Y>>2]|0;Z=f[c>>2]|0;D=f[Z>>2]|0;C=(f[Z+4>>2]|0)-D>>3;if(C>>>0<=B>>>0){l=72;break a}k=D;if(C>>>0<=j>>>0){l=74;break a}if((f[k+(B<<3)>>2]|0)>>>0<(f[k+(j<<3)>>2]|0)>>>0){f[Y>>2]=B;f[W>>2]=j;_=X+1|0}else _=X}else _=X;if(!_){$=Qd(h,Y,c)|0;j=Y+4|0;if(Qd(j,a,c)|0){l=83;break}if($){g=j;continue}}j=Y;if((j-i|0)>=(b-j|0)){l=82;break}Bb(h,Y,c);g=Y+4|0}if((l|0)==82){l=0;Bb(Y+4|0,a,c);d=h;a=Y;continue}else if((l|0)==83){l=0;if($){l=84;break}else{d=h;a=Y;continue}}}switch(l|0){case 5:{l=f[e>>2]|0;Y=f[h>>2]|0;d=f[c>>2]|0;$=f[d>>2]|0;i=(f[d+4>>2]|0)-$>>3;if(i>>>0<=l>>>0)mq(d);_=$;if(i>>>0<=Y>>>0)mq(d);if((f[_+(l<<3)>>2]|0)>>>0>=(f[_+(Y<<3)>>2]|0)>>>0)return;f[h>>2]=l;f[e>>2]=Y;return}case 11:{Cg(h,h+4|0,e,c)|0;return}case 12:{Qg(h,h+4|0,h+8|0,e,c)|0;return}case 13:{Tf(h,h+4|0,h+8|0,h+12|0,e,c)|0;return}case 15:{Pg(h,a,c);return}case 20:{mq(p);break}case 22:{mq(p);break}case 26:{mq(p);break}case 32:{mq(p);break}case 38:{mq(A);break}case 40:{mq(A);break}case 46:{mq(A);break}case 47:{mq(A);break}case 51:{mq(p);break}case 57:{mq(R);break}case 59:{mq(S);break}case 65:{if(N>>>0>(f[J+-4>>2]|0)>>>0)mq(S);else mq(S);break}case 66:{mq(S);break}case 72:{mq(Z);break}case 74:{mq(Z);break}case 84:return}}function Cb(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0;d=a;a=b;a:while(1){b=a;e=a+-4|0;g=d;while(1){h=g;b:while(1){i=h;j=b-i|0;k=j>>2;switch(k|0){case 2:{l=5;break a;break}case 3:{l=11;break a;break}case 4:{l=12;break a;break}case 5:{l=13;break a;break}case 1:case 0:{l=84;break a;break}default:{}}if((j|0)<124){l=15;break a}m=h+(((k|0)/2|0)<<2)|0;if((j|0)>3996){j=(k|0)/4|0;n=Tf(h,h+(j<<2)|0,m,m+(j<<2)|0,e,c)|0}else n=Cg(h,m,e,c)|0;o=f[h>>2]|0;j=f[m>>2]|0;p=f[c>>2]|0;k=f[p>>2]|0;q=(f[p+4>>2]|0)-k>>3;if(q>>>0<=o>>>0){l=20;break a}r=k;if(q>>>0<=j>>>0){l=22;break a}k=f[r+(o<<3)>>2]|0;s=f[r+(j<<3)>>2]|0;if(k>>>0<s>>>0){t=e;u=n;break}else v=e;while(1){v=v+-4|0;if((h|0)==(v|0))break;w=f[v>>2]|0;if(q>>>0<=w>>>0){l=51;break a}if((f[r+(w<<3)>>2]|0)>>>0<s>>>0){l=53;break b}}s=h+4|0;j=f[e>>2]|0;if(q>>>0<=j>>>0){l=26;break a}if(k>>>0<(f[r+(j<<3)>>2]|0)>>>0)x=s;else{if((s|0)==(e|0)){l=84;break a}else y=s;while(1){z=f[y>>2]|0;if(q>>>0<=z>>>0){l=32;break a}if(k>>>0<(f[r+(z<<3)>>2]|0)>>>0)break;s=y+4|0;if((s|0)==(e|0)){l=84;break a}else y=s}f[y>>2]=j;f[e>>2]=z;x=y+4|0}if((x|0)==(e|0)){l=84;break a}r=f[h>>2]|0;A=f[c>>2]|0;k=f[A>>2]|0;q=(f[A+4>>2]|0)-k>>3;if(q>>>0<=r>>>0){l=38;break a}s=k;k=e;B=x;C=r;while(1){r=s+(C<<3)|0;D=q>>>0>C>>>0;E=B;while(1){F=f[E>>2]|0;if(q>>>0<=F>>>0){l=40;break a}G=f[r>>2]|0;if(G>>>0<(f[s+(F<<3)>>2]|0)>>>0)break;if(D)E=E+4|0;else{l=38;break a}}if(q>>>0>C>>>0)H=k;else{l=46;break a}do{H=H+-4|0;I=f[H>>2]|0;if(q>>>0<=I>>>0){l=47;break a}}while(G>>>0<(f[s+(I<<3)>>2]|0)>>>0);if(E>>>0>=H>>>0){h=E;continue b}D=f[E>>2]|0;f[E>>2]=I;f[H>>2]=D;C=f[h>>2]|0;if(q>>>0<=C>>>0){l=38;break a}else{k=H;B=E+4|0}}}if((l|0)==53){l=0;f[h>>2]=w;f[v>>2]=o;t=v;u=n+1|0}B=h+4|0;c:do if(B>>>0<t>>>0){k=f[B>>2]|0;C=f[c>>2]|0;q=f[C>>2]|0;s=(f[C+4>>2]|0)-q>>3;if(s>>>0>k>>>0){J=t;K=B;L=u;M=m;N=s;O=q;P=C;Q=k}else{R=C;l=57;break a}while(1){C=f[c>>2]|0;k=C+4|0;q=f[M>>2]|0;s=K;j=O;D=N;S=P;r=Q;while(1){F=j;if(D>>>0<=q>>>0){l=59;break a}if((f[F+(r<<3)>>2]|0)>>>0>=(f[F+(q<<3)>>2]|0)>>>0)break;F=s+4|0;T=f[F>>2]|0;j=f[C>>2]|0;D=(f[k>>2]|0)-j>>3;if(D>>>0<=T>>>0){R=C;l=57;break a}else{s=F;S=C;r=T}}C=f[M>>2]|0;O=f[S>>2]|0;N=(f[S+4>>2]|0)-O>>3;D=O;j=D+(C<<3)|0;if(N>>>0>C>>>0)U=J;else{l=65;break a}do{U=U+-4|0;V=f[U>>2]|0;if(N>>>0<=V>>>0){l=66;break a}}while((f[D+(V<<3)>>2]|0)>>>0>=(f[j>>2]|0)>>>0);if(s>>>0>U>>>0){W=M;X=L;Y=s;break c}f[s>>2]=V;f[U>>2]=r;K=s+4|0;Q=f[K>>2]|0;if(N>>>0<=Q>>>0){R=S;l=57;break a}else{J=U;L=L+1|0;M=(M|0)==(s|0)?U:M;P=S}}}else{W=m;X=u;Y=B}while(0);if((Y|0)!=(W|0)){B=f[W>>2]|0;j=f[Y>>2]|0;Z=f[c>>2]|0;D=f[Z>>2]|0;C=(f[Z+4>>2]|0)-D>>3;if(C>>>0<=B>>>0){l=72;break a}k=D;if(C>>>0<=j>>>0){l=74;break a}if((f[k+(B<<3)>>2]|0)>>>0<(f[k+(j<<3)>>2]|0)>>>0){f[Y>>2]=B;f[W>>2]=j;_=X+1|0}else _=X}else _=X;if(!_){$=Qd(h,Y,c)|0;j=Y+4|0;if(Qd(j,a,c)|0){l=83;break}if($){g=j;continue}}j=Y;if((j-i|0)>=(b-j|0)){l=82;break}Cb(h,Y,c);g=Y+4|0}if((l|0)==82){l=0;Cb(Y+4|0,a,c);d=h;a=Y;continue}else if((l|0)==83){l=0;if($){l=84;break}else{d=h;a=Y;continue}}}switch(l|0){case 5:{l=f[e>>2]|0;Y=f[h>>2]|0;d=f[c>>2]|0;$=f[d>>2]|0;i=(f[d+4>>2]|0)-$>>3;if(i>>>0<=l>>>0)mq(d);_=$;if(i>>>0<=Y>>>0)mq(d);if((f[_+(l<<3)>>2]|0)>>>0>=(f[_+(Y<<3)>>2]|0)>>>0)return;f[h>>2]=l;f[e>>2]=Y;return}case 11:{Cg(h,h+4|0,e,c)|0;return}case 12:{Qg(h,h+4|0,h+8|0,e,c)|0;return}case 13:{Tf(h,h+4|0,h+8|0,h+12|0,e,c)|0;return}case 15:{Pg(h,a,c);return}case 20:{mq(p);break}case 22:{mq(p);break}case 26:{mq(p);break}case 32:{mq(p);break}case 38:{mq(A);break}case 40:{mq(A);break}case 46:{mq(A);break}case 47:{mq(A);break}case 51:{mq(p);break}case 57:{mq(R);break}case 59:{mq(S);break}case 65:{if(N>>>0>(f[J+-4>>2]|0)>>>0)mq(S);else mq(S);break}case 66:{mq(S);break}case 72:{mq(Z);break}case 74:{mq(Z);break}case 84:return}}function Db(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0;d=a;a=b;a:while(1){b=a;e=a+-4|0;g=d;while(1){h=g;b:while(1){i=h;j=b-i|0;k=j>>2;switch(k|0){case 2:{l=5;break a;break}case 3:{l=11;break a;break}case 4:{l=12;break a;break}case 5:{l=13;break a;break}case 1:case 0:{l=84;break a;break}default:{}}if((j|0)<124){l=15;break a}m=h+(((k|0)/2|0)<<2)|0;if((j|0)>3996){j=(k|0)/4|0;n=Tf(h,h+(j<<2)|0,m,m+(j<<2)|0,e,c)|0}else n=Cg(h,m,e,c)|0;o=f[h>>2]|0;j=f[m>>2]|0;p=f[c>>2]|0;k=f[p>>2]|0;q=(f[p+4>>2]|0)-k>>3;if(q>>>0<=o>>>0){l=20;break a}r=k;if(q>>>0<=j>>>0){l=22;break a}k=f[r+(o<<3)>>2]|0;s=f[r+(j<<3)>>2]|0;if(k>>>0<s>>>0){t=e;u=n;break}else v=e;while(1){v=v+-4|0;if((h|0)==(v|0))break;w=f[v>>2]|0;if(q>>>0<=w>>>0){l=51;break a}if((f[r+(w<<3)>>2]|0)>>>0<s>>>0){l=53;break b}}s=h+4|0;j=f[e>>2]|0;if(q>>>0<=j>>>0){l=26;break a}if(k>>>0<(f[r+(j<<3)>>2]|0)>>>0)x=s;else{if((s|0)==(e|0)){l=84;break a}else y=s;while(1){z=f[y>>2]|0;if(q>>>0<=z>>>0){l=32;break a}if(k>>>0<(f[r+(z<<3)>>2]|0)>>>0)break;s=y+4|0;if((s|0)==(e|0)){l=84;break a}else y=s}f[y>>2]=j;f[e>>2]=z;x=y+4|0}if((x|0)==(e|0)){l=84;break a}r=f[h>>2]|0;A=f[c>>2]|0;k=f[A>>2]|0;q=(f[A+4>>2]|0)-k>>3;if(q>>>0<=r>>>0){l=38;break a}s=k;k=e;B=x;C=r;while(1){r=s+(C<<3)|0;D=q>>>0>C>>>0;E=B;while(1){F=f[E>>2]|0;if(q>>>0<=F>>>0){l=40;break a}G=f[r>>2]|0;if(G>>>0<(f[s+(F<<3)>>2]|0)>>>0)break;if(D)E=E+4|0;else{l=38;break a}}if(q>>>0>C>>>0)H=k;else{l=46;break a}do{H=H+-4|0;I=f[H>>2]|0;if(q>>>0<=I>>>0){l=47;break a}}while(G>>>0<(f[s+(I<<3)>>2]|0)>>>0);if(E>>>0>=H>>>0){h=E;continue b}D=f[E>>2]|0;f[E>>2]=I;f[H>>2]=D;C=f[h>>2]|0;if(q>>>0<=C>>>0){l=38;break a}else{k=H;B=E+4|0}}}if((l|0)==53){l=0;f[h>>2]=w;f[v>>2]=o;t=v;u=n+1|0}B=h+4|0;c:do if(B>>>0<t>>>0){k=f[B>>2]|0;C=f[c>>2]|0;q=f[C>>2]|0;s=(f[C+4>>2]|0)-q>>3;if(s>>>0>k>>>0){J=t;K=B;L=u;M=m;N=s;O=q;P=C;Q=k}else{R=C;l=57;break a}while(1){C=f[c>>2]|0;k=C+4|0;q=f[M>>2]|0;s=K;j=O;D=N;S=P;r=Q;while(1){F=j;if(D>>>0<=q>>>0){l=59;break a}if((f[F+(r<<3)>>2]|0)>>>0>=(f[F+(q<<3)>>2]|0)>>>0)break;F=s+4|0;T=f[F>>2]|0;j=f[C>>2]|0;D=(f[k>>2]|0)-j>>3;if(D>>>0<=T>>>0){R=C;l=57;break a}else{s=F;S=C;r=T}}C=f[M>>2]|0;O=f[S>>2]|0;N=(f[S+4>>2]|0)-O>>3;D=O;j=D+(C<<3)|0;if(N>>>0>C>>>0)U=J;else{l=65;break a}do{U=U+-4|0;V=f[U>>2]|0;if(N>>>0<=V>>>0){l=66;break a}}while((f[D+(V<<3)>>2]|0)>>>0>=(f[j>>2]|0)>>>0);if(s>>>0>U>>>0){W=M;X=L;Y=s;break c}f[s>>2]=V;f[U>>2]=r;K=s+4|0;Q=f[K>>2]|0;if(N>>>0<=Q>>>0){R=S;l=57;break a}else{J=U;L=L+1|0;M=(M|0)==(s|0)?U:M;P=S}}}else{W=m;X=u;Y=B}while(0);if((Y|0)!=(W|0)){B=f[W>>2]|0;j=f[Y>>2]|0;Z=f[c>>2]|0;D=f[Z>>2]|0;C=(f[Z+4>>2]|0)-D>>3;if(C>>>0<=B>>>0){l=72;break a}k=D;if(C>>>0<=j>>>0){l=74;break a}if((f[k+(B<<3)>>2]|0)>>>0<(f[k+(j<<3)>>2]|0)>>>0){f[Y>>2]=B;f[W>>2]=j;_=X+1|0}else _=X}else _=X;if(!_){$=Qd(h,Y,c)|0;j=Y+4|0;if(Qd(j,a,c)|0){l=83;break}if($){g=j;continue}}j=Y;if((j-i|0)>=(b-j|0)){l=82;break}Db(h,Y,c);g=Y+4|0}if((l|0)==82){l=0;Db(Y+4|0,a,c);d=h;a=Y;continue}else if((l|0)==83){l=0;if($){l=84;break}else{d=h;a=Y;continue}}}switch(l|0){case 5:{l=f[e>>2]|0;Y=f[h>>2]|0;d=f[c>>2]|0;$=f[d>>2]|0;i=(f[d+4>>2]|0)-$>>3;if(i>>>0<=l>>>0)mq(d);_=$;if(i>>>0<=Y>>>0)mq(d);if((f[_+(l<<3)>>2]|0)>>>0>=(f[_+(Y<<3)>>2]|0)>>>0)return;f[h>>2]=l;f[e>>2]=Y;return}case 11:{Cg(h,h+4|0,e,c)|0;return}case 12:{Qg(h,h+4|0,h+8|0,e,c)|0;return}case 13:{Tf(h,h+4|0,h+8|0,h+12|0,e,c)|0;return}case 15:{Pg(h,a,c);return}case 20:{mq(p);break}case 22:{mq(p);break}case 26:{mq(p);break}case 32:{mq(p);break}case 38:{mq(A);break}case 40:{mq(A);break}case 46:{mq(A);break}case 47:{mq(A);break}case 51:{mq(p);break}case 57:{mq(R);break}case 59:{mq(S);break}case 65:{if(N>>>0>(f[J+-4>>2]|0)>>>0)mq(S);else mq(S);break}case 66:{mq(S);break}case 72:{mq(Z);break}case 74:{mq(Z);break}case 84:return}}function Eb(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0;d=a;a=b;a:while(1){b=a;e=a+-4|0;g=d;while(1){h=g;b:while(1){i=h;j=b-i|0;k=j>>2;switch(k|0){case 2:{l=5;break a;break}case 3:{l=11;break a;break}case 4:{l=12;break a;break}case 5:{l=13;break a;break}case 1:case 0:{l=84;break a;break}default:{}}if((j|0)<124){l=15;break a}m=h+(((k|0)/2|0)<<2)|0;if((j|0)>3996){j=(k|0)/4|0;n=Tf(h,h+(j<<2)|0,m,m+(j<<2)|0,e,c)|0}else n=Cg(h,m,e,c)|0;o=f[h>>2]|0;j=f[m>>2]|0;p=f[c>>2]|0;k=f[p>>2]|0;q=(f[p+4>>2]|0)-k>>3;if(q>>>0<=o>>>0){l=20;break a}r=k;if(q>>>0<=j>>>0){l=22;break a}k=f[r+(o<<3)>>2]|0;s=f[r+(j<<3)>>2]|0;if(k>>>0<s>>>0){t=e;u=n;break}else v=e;while(1){v=v+-4|0;if((h|0)==(v|0))break;w=f[v>>2]|0;if(q>>>0<=w>>>0){l=51;break a}if((f[r+(w<<3)>>2]|0)>>>0<s>>>0){l=53;break b}}s=h+4|0;j=f[e>>2]|0;if(q>>>0<=j>>>0){l=26;break a}if(k>>>0<(f[r+(j<<3)>>2]|0)>>>0)x=s;else{if((s|0)==(e|0)){l=84;break a}else y=s;while(1){z=f[y>>2]|0;if(q>>>0<=z>>>0){l=32;break a}if(k>>>0<(f[r+(z<<3)>>2]|0)>>>0)break;s=y+4|0;if((s|0)==(e|0)){l=84;break a}else y=s}f[y>>2]=j;f[e>>2]=z;x=y+4|0}if((x|0)==(e|0)){l=84;break a}r=f[h>>2]|0;A=f[c>>2]|0;k=f[A>>2]|0;q=(f[A+4>>2]|0)-k>>3;if(q>>>0<=r>>>0){l=38;break a}s=k;k=e;B=x;C=r;while(1){r=s+(C<<3)|0;D=q>>>0>C>>>0;E=B;while(1){F=f[E>>2]|0;if(q>>>0<=F>>>0){l=40;break a}G=f[r>>2]|0;if(G>>>0<(f[s+(F<<3)>>2]|0)>>>0)break;if(D)E=E+4|0;else{l=38;break a}}if(q>>>0>C>>>0)H=k;else{l=46;break a}do{H=H+-4|0;I=f[H>>2]|0;if(q>>>0<=I>>>0){l=47;break a}}while(G>>>0<(f[s+(I<<3)>>2]|0)>>>0);if(E>>>0>=H>>>0){h=E;continue b}D=f[E>>2]|0;f[E>>2]=I;f[H>>2]=D;C=f[h>>2]|0;if(q>>>0<=C>>>0){l=38;break a}else{k=H;B=E+4|0}}}if((l|0)==53){l=0;f[h>>2]=w;f[v>>2]=o;t=v;u=n+1|0}B=h+4|0;c:do if(B>>>0<t>>>0){k=f[B>>2]|0;C=f[c>>2]|0;q=f[C>>2]|0;s=(f[C+4>>2]|0)-q>>3;if(s>>>0>k>>>0){J=t;K=B;L=u;M=m;N=s;O=q;P=C;Q=k}else{R=C;l=57;break a}while(1){C=f[c>>2]|0;k=C+4|0;q=f[M>>2]|0;s=K;j=O;D=N;S=P;r=Q;while(1){F=j;if(D>>>0<=q>>>0){l=59;break a}if((f[F+(r<<3)>>2]|0)>>>0>=(f[F+(q<<3)>>2]|0)>>>0)break;F=s+4|0;T=f[F>>2]|0;j=f[C>>2]|0;D=(f[k>>2]|0)-j>>3;if(D>>>0<=T>>>0){R=C;l=57;break a}else{s=F;S=C;r=T}}C=f[M>>2]|0;O=f[S>>2]|0;N=(f[S+4>>2]|0)-O>>3;D=O;j=D+(C<<3)|0;if(N>>>0>C>>>0)U=J;else{l=65;break a}do{U=U+-4|0;V=f[U>>2]|0;if(N>>>0<=V>>>0){l=66;break a}}while((f[D+(V<<3)>>2]|0)>>>0>=(f[j>>2]|0)>>>0);if(s>>>0>U>>>0){W=M;X=L;Y=s;break c}f[s>>2]=V;f[U>>2]=r;K=s+4|0;Q=f[K>>2]|0;if(N>>>0<=Q>>>0){R=S;l=57;break a}else{J=U;L=L+1|0;M=(M|0)==(s|0)?U:M;P=S}}}else{W=m;X=u;Y=B}while(0);if((Y|0)!=(W|0)){B=f[W>>2]|0;j=f[Y>>2]|0;Z=f[c>>2]|0;D=f[Z>>2]|0;C=(f[Z+4>>2]|0)-D>>3;if(C>>>0<=B>>>0){l=72;break a}k=D;if(C>>>0<=j>>>0){l=74;break a}if((f[k+(B<<3)>>2]|0)>>>0<(f[k+(j<<3)>>2]|0)>>>0){f[Y>>2]=B;f[W>>2]=j;_=X+1|0}else _=X}else _=X;if(!_){$=Qd(h,Y,c)|0;j=Y+4|0;if(Qd(j,a,c)|0){l=83;break}if($){g=j;continue}}j=Y;if((j-i|0)>=(b-j|0)){l=82;break}Eb(h,Y,c);g=Y+4|0}if((l|0)==82){l=0;Eb(Y+4|0,a,c);d=h;a=Y;continue}else if((l|0)==83){l=0;if($){l=84;break}else{d=h;a=Y;continue}}}switch(l|0){case 5:{l=f[e>>2]|0;Y=f[h>>2]|0;d=f[c>>2]|0;$=f[d>>2]|0;i=(f[d+4>>2]|0)-$>>3;if(i>>>0<=l>>>0)mq(d);_=$;if(i>>>0<=Y>>>0)mq(d);if((f[_+(l<<3)>>2]|0)>>>0>=(f[_+(Y<<3)>>2]|0)>>>0)return;f[h>>2]=l;f[e>>2]=Y;return}case 11:{Cg(h,h+4|0,e,c)|0;return}case 12:{Qg(h,h+4|0,h+8|0,e,c)|0;return}case 13:{Tf(h,h+4|0,h+8|0,h+12|0,e,c)|0;return}case 15:{Pg(h,a,c);return}case 20:{mq(p);break}case 22:{mq(p);break}case 26:{mq(p);break}case 32:{mq(p);break}case 38:{mq(A);break}case 40:{mq(A);break}case 46:{mq(A);break}case 47:{mq(A);break}case 51:{mq(p);break}case 57:{mq(R);break}case 59:{mq(S);break}case 65:{if(N>>>0>(f[J+-4>>2]|0)>>>0)mq(S);else mq(S);break}case 66:{mq(S);break}case 72:{mq(Z);break}case 74:{mq(Z);break}case 84:return}}function Fb(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0;d=a;a=b;a:while(1){b=a;e=a+-4|0;g=d;while(1){h=g;b:while(1){i=h;j=b-i|0;k=j>>2;switch(k|0){case 2:{l=5;break a;break}case 3:{l=11;break a;break}case 4:{l=12;break a;break}case 5:{l=13;break a;break}case 1:case 0:{l=84;break a;break}default:{}}if((j|0)<124){l=15;break a}m=h+(((k|0)/2|0)<<2)|0;if((j|0)>3996){j=(k|0)/4|0;n=Tf(h,h+(j<<2)|0,m,m+(j<<2)|0,e,c)|0}else n=Cg(h,m,e,c)|0;o=f[h>>2]|0;j=f[m>>2]|0;p=f[c>>2]|0;k=f[p>>2]|0;q=(f[p+4>>2]|0)-k>>3;if(q>>>0<=o>>>0){l=20;break a}r=k;if(q>>>0<=j>>>0){l=22;break a}k=f[r+(o<<3)>>2]|0;s=f[r+(j<<3)>>2]|0;if(k>>>0<s>>>0){t=e;u=n;break}else v=e;while(1){v=v+-4|0;if((h|0)==(v|0))break;w=f[v>>2]|0;if(q>>>0<=w>>>0){l=51;break a}if((f[r+(w<<3)>>2]|0)>>>0<s>>>0){l=53;break b}}s=h+4|0;j=f[e>>2]|0;if(q>>>0<=j>>>0){l=26;break a}if(k>>>0<(f[r+(j<<3)>>2]|0)>>>0)x=s;else{if((s|0)==(e|0)){l=84;break a}else y=s;while(1){z=f[y>>2]|0;if(q>>>0<=z>>>0){l=32;break a}if(k>>>0<(f[r+(z<<3)>>2]|0)>>>0)break;s=y+4|0;if((s|0)==(e|0)){l=84;break a}else y=s}f[y>>2]=j;f[e>>2]=z;x=y+4|0}if((x|0)==(e|0)){l=84;break a}r=f[h>>2]|0;A=f[c>>2]|0;k=f[A>>2]|0;q=(f[A+4>>2]|0)-k>>3;if(q>>>0<=r>>>0){l=38;break a}s=k;k=e;B=x;C=r;while(1){r=s+(C<<3)|0;D=q>>>0>C>>>0;E=B;while(1){F=f[E>>2]|0;if(q>>>0<=F>>>0){l=40;break a}G=f[r>>2]|0;if(G>>>0<(f[s+(F<<3)>>2]|0)>>>0)break;if(D)E=E+4|0;else{l=38;break a}}if(q>>>0>C>>>0)H=k;else{l=46;break a}do{H=H+-4|0;I=f[H>>2]|0;if(q>>>0<=I>>>0){l=47;break a}}while(G>>>0<(f[s+(I<<3)>>2]|0)>>>0);if(E>>>0>=H>>>0){h=E;continue b}D=f[E>>2]|0;f[E>>2]=I;f[H>>2]=D;C=f[h>>2]|0;if(q>>>0<=C>>>0){l=38;break a}else{k=H;B=E+4|0}}}if((l|0)==53){l=0;f[h>>2]=w;f[v>>2]=o;t=v;u=n+1|0}B=h+4|0;c:do if(B>>>0<t>>>0){k=f[B>>2]|0;C=f[c>>2]|0;q=f[C>>2]|0;s=(f[C+4>>2]|0)-q>>3;if(s>>>0>k>>>0){J=t;K=B;L=u;M=m;N=s;O=q;P=C;Q=k}else{R=C;l=57;break a}while(1){C=f[c>>2]|0;k=C+4|0;q=f[M>>2]|0;s=K;j=O;D=N;S=P;r=Q;while(1){F=j;if(D>>>0<=q>>>0){l=59;break a}if((f[F+(r<<3)>>2]|0)>>>0>=(f[F+(q<<3)>>2]|0)>>>0)break;F=s+4|0;T=f[F>>2]|0;j=f[C>>2]|0;D=(f[k>>2]|0)-j>>3;if(D>>>0<=T>>>0){R=C;l=57;break a}else{s=F;S=C;r=T}}C=f[M>>2]|0;O=f[S>>2]|0;N=(f[S+4>>2]|0)-O>>3;D=O;j=D+(C<<3)|0;if(N>>>0>C>>>0)U=J;else{l=65;break a}do{U=U+-4|0;V=f[U>>2]|0;if(N>>>0<=V>>>0){l=66;break a}}while((f[D+(V<<3)>>2]|0)>>>0>=(f[j>>2]|0)>>>0);if(s>>>0>U>>>0){W=M;X=L;Y=s;break c}f[s>>2]=V;f[U>>2]=r;K=s+4|0;Q=f[K>>2]|0;if(N>>>0<=Q>>>0){R=S;l=57;break a}else{J=U;L=L+1|0;M=(M|0)==(s|0)?U:M;P=S}}}else{W=m;X=u;Y=B}while(0);if((Y|0)!=(W|0)){B=f[W>>2]|0;j=f[Y>>2]|0;Z=f[c>>2]|0;D=f[Z>>2]|0;C=(f[Z+4>>2]|0)-D>>3;if(C>>>0<=B>>>0){l=72;break a}k=D;if(C>>>0<=j>>>0){l=74;break a}if((f[k+(B<<3)>>2]|0)>>>0<(f[k+(j<<3)>>2]|0)>>>0){f[Y>>2]=B;f[W>>2]=j;_=X+1|0}else _=X}else _=X;if(!_){$=Qd(h,Y,c)|0;j=Y+4|0;if(Qd(j,a,c)|0){l=83;break}if($){g=j;continue}}j=Y;if((j-i|0)>=(b-j|0)){l=82;break}Fb(h,Y,c);g=Y+4|0}if((l|0)==82){l=0;Fb(Y+4|0,a,c);d=h;a=Y;continue}else if((l|0)==83){l=0;if($){l=84;break}else{d=h;a=Y;continue}}}switch(l|0){case 5:{l=f[e>>2]|0;Y=f[h>>2]|0;d=f[c>>2]|0;$=f[d>>2]|0;i=(f[d+4>>2]|0)-$>>3;if(i>>>0<=l>>>0)mq(d);_=$;if(i>>>0<=Y>>>0)mq(d);if((f[_+(l<<3)>>2]|0)>>>0>=(f[_+(Y<<3)>>2]|0)>>>0)return;f[h>>2]=l;f[e>>2]=Y;return}case 11:{Cg(h,h+4|0,e,c)|0;return}case 12:{Qg(h,h+4|0,h+8|0,e,c)|0;return}case 13:{Tf(h,h+4|0,h+8|0,h+12|0,e,c)|0;return}case 15:{Pg(h,a,c);return}case 20:{mq(p);break}case 22:{mq(p);break}case 26:{mq(p);break}case 32:{mq(p);break}case 38:{mq(A);break}case 40:{mq(A);break}case 46:{mq(A);break}case 47:{mq(A);break}case 51:{mq(p);break}case 57:{mq(R);break}case 59:{mq(S);break}case 65:{if(N>>>0>(f[J+-4>>2]|0)>>>0)mq(S);else mq(S);break}case 66:{mq(S);break}case 72:{mq(Z);break}case 74:{mq(Z);break}case 84:return}}function Gb(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0;d=a;a=b;a:while(1){b=a;e=a+-4|0;g=d;while(1){h=g;b:while(1){i=h;j=b-i|0;k=j>>2;switch(k|0){case 2:{l=5;break a;break}case 3:{l=11;break a;break}case 4:{l=12;break a;break}case 5:{l=13;break a;break}case 1:case 0:{l=84;break a;break}default:{}}if((j|0)<124){l=15;break a}m=h+(((k|0)/2|0)<<2)|0;if((j|0)>3996){j=(k|0)/4|0;n=Tf(h,h+(j<<2)|0,m,m+(j<<2)|0,e,c)|0}else n=Cg(h,m,e,c)|0;o=f[h>>2]|0;j=f[m>>2]|0;p=f[c>>2]|0;k=f[p>>2]|0;q=(f[p+4>>2]|0)-k>>3;if(q>>>0<=o>>>0){l=20;break a}r=k;if(q>>>0<=j>>>0){l=22;break a}k=f[r+(o<<3)>>2]|0;s=f[r+(j<<3)>>2]|0;if(k>>>0<s>>>0){t=e;u=n;break}else v=e;while(1){v=v+-4|0;if((h|0)==(v|0))break;w=f[v>>2]|0;if(q>>>0<=w>>>0){l=51;break a}if((f[r+(w<<3)>>2]|0)>>>0<s>>>0){l=53;break b}}s=h+4|0;j=f[e>>2]|0;if(q>>>0<=j>>>0){l=26;break a}if(k>>>0<(f[r+(j<<3)>>2]|0)>>>0)x=s;else{if((s|0)==(e|0)){l=84;break a}else y=s;while(1){z=f[y>>2]|0;if(q>>>0<=z>>>0){l=32;break a}if(k>>>0<(f[r+(z<<3)>>2]|0)>>>0)break;s=y+4|0;if((s|0)==(e|0)){l=84;break a}else y=s}f[y>>2]=j;f[e>>2]=z;x=y+4|0}if((x|0)==(e|0)){l=84;break a}r=f[h>>2]|0;A=f[c>>2]|0;k=f[A>>2]|0;q=(f[A+4>>2]|0)-k>>3;if(q>>>0<=r>>>0){l=38;break a}s=k;k=e;B=x;C=r;while(1){r=s+(C<<3)|0;D=q>>>0>C>>>0;E=B;while(1){F=f[E>>2]|0;if(q>>>0<=F>>>0){l=40;break a}G=f[r>>2]|0;if(G>>>0<(f[s+(F<<3)>>2]|0)>>>0)break;if(D)E=E+4|0;else{l=38;break a}}if(q>>>0>C>>>0)H=k;else{l=46;break a}do{H=H+-4|0;I=f[H>>2]|0;if(q>>>0<=I>>>0){l=47;break a}}while(G>>>0<(f[s+(I<<3)>>2]|0)>>>0);if(E>>>0>=H>>>0){h=E;continue b}D=f[E>>2]|0;f[E>>2]=I;f[H>>2]=D;C=f[h>>2]|0;if(q>>>0<=C>>>0){l=38;break a}else{k=H;B=E+4|0}}}if((l|0)==53){l=0;f[h>>2]=w;f[v>>2]=o;t=v;u=n+1|0}B=h+4|0;c:do if(B>>>0<t>>>0){k=f[B>>2]|0;C=f[c>>2]|0;q=f[C>>2]|0;s=(f[C+4>>2]|0)-q>>3;if(s>>>0>k>>>0){J=t;K=B;L=u;M=m;N=s;O=q;P=C;Q=k}else{R=C;l=57;break a}while(1){C=f[c>>2]|0;k=C+4|0;q=f[M>>2]|0;s=K;j=O;D=N;S=P;r=Q;while(1){F=j;if(D>>>0<=q>>>0){l=59;break a}if((f[F+(r<<3)>>2]|0)>>>0>=(f[F+(q<<3)>>2]|0)>>>0)break;F=s+4|0;T=f[F>>2]|0;j=f[C>>2]|0;D=(f[k>>2]|0)-j>>3;if(D>>>0<=T>>>0){R=C;l=57;break a}else{s=F;S=C;r=T}}C=f[M>>2]|0;O=f[S>>2]|0;N=(f[S+4>>2]|0)-O>>3;D=O;j=D+(C<<3)|0;if(N>>>0>C>>>0)U=J;else{l=65;break a}do{U=U+-4|0;V=f[U>>2]|0;if(N>>>0<=V>>>0){l=66;break a}}while((f[D+(V<<3)>>2]|0)>>>0>=(f[j>>2]|0)>>>0);if(s>>>0>U>>>0){W=M;X=L;Y=s;break c}f[s>>2]=V;f[U>>2]=r;K=s+4|0;Q=f[K>>2]|0;if(N>>>0<=Q>>>0){R=S;l=57;break a}else{J=U;L=L+1|0;M=(M|0)==(s|0)?U:M;P=S}}}else{W=m;X=u;Y=B}while(0);if((Y|0)!=(W|0)){B=f[W>>2]|0;j=f[Y>>2]|0;Z=f[c>>2]|0;D=f[Z>>2]|0;C=(f[Z+4>>2]|0)-D>>3;if(C>>>0<=B>>>0){l=72;break a}k=D;if(C>>>0<=j>>>0){l=74;break a}if((f[k+(B<<3)>>2]|0)>>>0<(f[k+(j<<3)>>2]|0)>>>0){f[Y>>2]=B;f[W>>2]=j;_=X+1|0}else _=X}else _=X;if(!_){$=Qd(h,Y,c)|0;j=Y+4|0;if(Qd(j,a,c)|0){l=83;break}if($){g=j;continue}}j=Y;if((j-i|0)>=(b-j|0)){l=82;break}Gb(h,Y,c);g=Y+4|0}if((l|0)==82){l=0;Gb(Y+4|0,a,c);d=h;a=Y;continue}else if((l|0)==83){l=0;if($){l=84;break}else{d=h;a=Y;continue}}}switch(l|0){case 5:{l=f[e>>2]|0;Y=f[h>>2]|0;d=f[c>>2]|0;$=f[d>>2]|0;i=(f[d+4>>2]|0)-$>>3;if(i>>>0<=l>>>0)mq(d);_=$;if(i>>>0<=Y>>>0)mq(d);if((f[_+(l<<3)>>2]|0)>>>0>=(f[_+(Y<<3)>>2]|0)>>>0)return;f[h>>2]=l;f[e>>2]=Y;return}case 11:{Cg(h,h+4|0,e,c)|0;return}case 12:{Qg(h,h+4|0,h+8|0,e,c)|0;return}case 13:{Tf(h,h+4|0,h+8|0,h+12|0,e,c)|0;return}case 15:{Pg(h,a,c);return}case 20:{mq(p);break}case 22:{mq(p);break}case 26:{mq(p);break}case 32:{mq(p);break}case 38:{mq(A);break}case 40:{mq(A);break}case 46:{mq(A);break}case 47:{mq(A);break}case 51:{mq(p);break}case 57:{mq(R);break}case 59:{mq(S);break}case 65:{if(N>>>0>(f[J+-4>>2]|0)>>>0)mq(S);else mq(S);break}case 66:{mq(S);break}case 72:{mq(Z);break}case 74:{mq(Z);break}case 84:return}}function Hb(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0;d=a;a=b;a:while(1){b=a;e=a+-4|0;g=d;while(1){h=g;b:while(1){i=h;j=b-i|0;k=j>>2;switch(k|0){case 2:{l=5;break a;break}case 3:{l=11;break a;break}case 4:{l=12;break a;break}case 5:{l=13;break a;break}case 1:case 0:{l=84;break a;break}default:{}}if((j|0)<124){l=15;break a}m=h+(((k|0)/2|0)<<2)|0;if((j|0)>3996){j=(k|0)/4|0;n=Tf(h,h+(j<<2)|0,m,m+(j<<2)|0,e,c)|0}else n=Cg(h,m,e,c)|0;o=f[h>>2]|0;j=f[m>>2]|0;p=f[c>>2]|0;k=f[p>>2]|0;q=(f[p+4>>2]|0)-k>>3;if(q>>>0<=o>>>0){l=20;break a}r=k;if(q>>>0<=j>>>0){l=22;break a}k=f[r+(o<<3)>>2]|0;s=f[r+(j<<3)>>2]|0;if(k>>>0<s>>>0){t=e;u=n;break}else v=e;while(1){v=v+-4|0;if((h|0)==(v|0))break;w=f[v>>2]|0;if(q>>>0<=w>>>0){l=51;break a}if((f[r+(w<<3)>>2]|0)>>>0<s>>>0){l=53;break b}}s=h+4|0;j=f[e>>2]|0;if(q>>>0<=j>>>0){l=26;break a}if(k>>>0<(f[r+(j<<3)>>2]|0)>>>0)x=s;else{if((s|0)==(e|0)){l=84;break a}else y=s;while(1){z=f[y>>2]|0;if(q>>>0<=z>>>0){l=32;break a}if(k>>>0<(f[r+(z<<3)>>2]|0)>>>0)break;s=y+4|0;if((s|0)==(e|0)){l=84;break a}else y=s}f[y>>2]=j;f[e>>2]=z;x=y+4|0}if((x|0)==(e|0)){l=84;break a}r=f[h>>2]|0;A=f[c>>2]|0;k=f[A>>2]|0;q=(f[A+4>>2]|0)-k>>3;if(q>>>0<=r>>>0){l=38;break a}s=k;k=e;B=x;C=r;while(1){r=s+(C<<3)|0;D=q>>>0>C>>>0;E=B;while(1){F=f[E>>2]|0;if(q>>>0<=F>>>0){l=40;break a}G=f[r>>2]|0;if(G>>>0<(f[s+(F<<3)>>2]|0)>>>0)break;if(D)E=E+4|0;else{l=38;break a}}if(q>>>0>C>>>0)H=k;else{l=46;break a}do{H=H+-4|0;I=f[H>>2]|0;if(q>>>0<=I>>>0){l=47;break a}}while(G>>>0<(f[s+(I<<3)>>2]|0)>>>0);if(E>>>0>=H>>>0){h=E;continue b}D=f[E>>2]|0;f[E>>2]=I;f[H>>2]=D;C=f[h>>2]|0;if(q>>>0<=C>>>0){l=38;break a}else{k=H;B=E+4|0}}}if((l|0)==53){l=0;f[h>>2]=w;f[v>>2]=o;t=v;u=n+1|0}B=h+4|0;c:do if(B>>>0<t>>>0){k=f[B>>2]|0;C=f[c>>2]|0;q=f[C>>2]|0;s=(f[C+4>>2]|0)-q>>3;if(s>>>0>k>>>0){J=t;K=B;L=u;M=m;N=s;O=q;P=C;Q=k}else{R=C;l=57;break a}while(1){C=f[c>>2]|0;k=C+4|0;q=f[M>>2]|0;s=K;j=O;D=N;S=P;r=Q;while(1){F=j;if(D>>>0<=q>>>0){l=59;break a}if((f[F+(r<<3)>>2]|0)>>>0>=(f[F+(q<<3)>>2]|0)>>>0)break;F=s+4|0;T=f[F>>2]|0;j=f[C>>2]|0;D=(f[k>>2]|0)-j>>3;if(D>>>0<=T>>>0){R=C;l=57;break a}else{s=F;S=C;r=T}}C=f[M>>2]|0;O=f[S>>2]|0;N=(f[S+4>>2]|0)-O>>3;D=O;j=D+(C<<3)|0;if(N>>>0>C>>>0)U=J;else{l=65;break a}do{U=U+-4|0;V=f[U>>2]|0;if(N>>>0<=V>>>0){l=66;break a}}while((f[D+(V<<3)>>2]|0)>>>0>=(f[j>>2]|0)>>>0);if(s>>>0>U>>>0){W=M;X=L;Y=s;break c}f[s>>2]=V;f[U>>2]=r;K=s+4|0;Q=f[K>>2]|0;if(N>>>0<=Q>>>0){R=S;l=57;break a}else{J=U;L=L+1|0;M=(M|0)==(s|0)?U:M;P=S}}}else{W=m;X=u;Y=B}while(0);if((Y|0)!=(W|0)){B=f[W>>2]|0;j=f[Y>>2]|0;Z=f[c>>2]|0;D=f[Z>>2]|0;C=(f[Z+4>>2]|0)-D>>3;if(C>>>0<=B>>>0){l=72;break a}k=D;if(C>>>0<=j>>>0){l=74;break a}if((f[k+(B<<3)>>2]|0)>>>0<(f[k+(j<<3)>>2]|0)>>>0){f[Y>>2]=B;f[W>>2]=j;_=X+1|0}else _=X}else _=X;if(!_){$=Qd(h,Y,c)|0;j=Y+4|0;if(Qd(j,a,c)|0){l=83;break}if($){g=j;continue}}j=Y;if((j-i|0)>=(b-j|0)){l=82;break}Hb(h,Y,c);g=Y+4|0}if((l|0)==82){l=0;Hb(Y+4|0,a,c);d=h;a=Y;continue}else if((l|0)==83){l=0;if($){l=84;break}else{d=h;a=Y;continue}}}switch(l|0){case 5:{l=f[e>>2]|0;Y=f[h>>2]|0;d=f[c>>2]|0;$=f[d>>2]|0;i=(f[d+4>>2]|0)-$>>3;if(i>>>0<=l>>>0)mq(d);_=$;if(i>>>0<=Y>>>0)mq(d);if((f[_+(l<<3)>>2]|0)>>>0>=(f[_+(Y<<3)>>2]|0)>>>0)return;f[h>>2]=l;f[e>>2]=Y;return}case 11:{Cg(h,h+4|0,e,c)|0;return}case 12:{Qg(h,h+4|0,h+8|0,e,c)|0;return}case 13:{Tf(h,h+4|0,h+8|0,h+12|0,e,c)|0;return}case 15:{Pg(h,a,c);return}case 20:{mq(p);break}case 22:{mq(p);break}case 26:{mq(p);break}case 32:{mq(p);break}case 38:{mq(A);break}case 40:{mq(A);break}case 46:{mq(A);break}case 47:{mq(A);break}case 51:{mq(p);break}case 57:{mq(R);break}case 59:{mq(S);break}case 65:{if(N>>>0>(f[J+-4>>2]|0)>>>0)mq(S);else mq(S);break}case 66:{mq(S);break}case 72:{mq(Z);break}case 74:{mq(Z);break}case 84:return}}function Ib(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0;d=a;a=b;a:while(1){b=a;e=a+-4|0;g=d;while(1){h=g;b:while(1){i=h;j=b-i|0;k=j>>2;switch(k|0){case 2:{l=5;break a;break}case 3:{l=11;break a;break}case 4:{l=12;break a;break}case 5:{l=13;break a;break}case 1:case 0:{l=84;break a;break}default:{}}if((j|0)<124){l=15;break a}m=h+(((k|0)/2|0)<<2)|0;if((j|0)>3996){j=(k|0)/4|0;n=Tf(h,h+(j<<2)|0,m,m+(j<<2)|0,e,c)|0}else n=Cg(h,m,e,c)|0;o=f[h>>2]|0;j=f[m>>2]|0;p=f[c>>2]|0;k=f[p>>2]|0;q=(f[p+4>>2]|0)-k>>3;if(q>>>0<=o>>>0){l=20;break a}r=k;if(q>>>0<=j>>>0){l=22;break a}k=f[r+(o<<3)>>2]|0;s=f[r+(j<<3)>>2]|0;if(k>>>0<s>>>0){t=e;u=n;break}else v=e;while(1){v=v+-4|0;if((h|0)==(v|0))break;w=f[v>>2]|0;if(q>>>0<=w>>>0){l=51;break a}if((f[r+(w<<3)>>2]|0)>>>0<s>>>0){l=53;break b}}s=h+4|0;j=f[e>>2]|0;if(q>>>0<=j>>>0){l=26;break a}if(k>>>0<(f[r+(j<<3)>>2]|0)>>>0)x=s;else{if((s|0)==(e|0)){l=84;break a}else y=s;while(1){z=f[y>>2]|0;if(q>>>0<=z>>>0){l=32;break a}if(k>>>0<(f[r+(z<<3)>>2]|0)>>>0)break;s=y+4|0;if((s|0)==(e|0)){l=84;break a}else y=s}f[y>>2]=j;f[e>>2]=z;x=y+4|0}if((x|0)==(e|0)){l=84;break a}r=f[h>>2]|0;A=f[c>>2]|0;k=f[A>>2]|0;q=(f[A+4>>2]|0)-k>>3;if(q>>>0<=r>>>0){l=38;break a}s=k;k=e;B=x;C=r;while(1){r=s+(C<<3)|0;D=q>>>0>C>>>0;E=B;while(1){F=f[E>>2]|0;if(q>>>0<=F>>>0){l=40;break a}G=f[r>>2]|0;if(G>>>0<(f[s+(F<<3)>>2]|0)>>>0)break;if(D)E=E+4|0;else{l=38;break a}}if(q>>>0>C>>>0)H=k;else{l=46;break a}do{H=H+-4|0;I=f[H>>2]|0;if(q>>>0<=I>>>0){l=47;break a}}while(G>>>0<(f[s+(I<<3)>>2]|0)>>>0);if(E>>>0>=H>>>0){h=E;continue b}D=f[E>>2]|0;f[E>>2]=I;f[H>>2]=D;C=f[h>>2]|0;if(q>>>0<=C>>>0){l=38;break a}else{k=H;B=E+4|0}}}if((l|0)==53){l=0;f[h>>2]=w;f[v>>2]=o;t=v;u=n+1|0}B=h+4|0;c:do if(B>>>0<t>>>0){k=f[B>>2]|0;C=f[c>>2]|0;q=f[C>>2]|0;s=(f[C+4>>2]|0)-q>>3;if(s>>>0>k>>>0){J=t;K=B;L=u;M=m;N=s;O=q;P=C;Q=k}else{R=C;l=57;break a}while(1){C=f[c>>2]|0;k=C+4|0;q=f[M>>2]|0;s=K;j=O;D=N;S=P;r=Q;while(1){F=j;if(D>>>0<=q>>>0){l=59;break a}if((f[F+(r<<3)>>2]|0)>>>0>=(f[F+(q<<3)>>2]|0)>>>0)break;F=s+4|0;T=f[F>>2]|0;j=f[C>>2]|0;D=(f[k>>2]|0)-j>>3;if(D>>>0<=T>>>0){R=C;l=57;break a}else{s=F;S=C;r=T}}C=f[M>>2]|0;O=f[S>>2]|0;N=(f[S+4>>2]|0)-O>>3;D=O;j=D+(C<<3)|0;if(N>>>0>C>>>0)U=J;else{l=65;break a}do{U=U+-4|0;V=f[U>>2]|0;if(N>>>0<=V>>>0){l=66;break a}}while((f[D+(V<<3)>>2]|0)>>>0>=(f[j>>2]|0)>>>0);if(s>>>0>U>>>0){W=M;X=L;Y=s;break c}f[s>>2]=V;f[U>>2]=r;K=s+4|0;Q=f[K>>2]|0;if(N>>>0<=Q>>>0){R=S;l=57;break a}else{J=U;L=L+1|0;M=(M|0)==(s|0)?U:M;P=S}}}else{W=m;X=u;Y=B}while(0);if((Y|0)!=(W|0)){B=f[W>>2]|0;j=f[Y>>2]|0;Z=f[c>>2]|0;D=f[Z>>2]|0;C=(f[Z+4>>2]|0)-D>>3;if(C>>>0<=B>>>0){l=72;break a}k=D;if(C>>>0<=j>>>0){l=74;break a}if((f[k+(B<<3)>>2]|0)>>>0<(f[k+(j<<3)>>2]|0)>>>0){f[Y>>2]=B;f[W>>2]=j;_=X+1|0}else _=X}else _=X;if(!_){$=Qd(h,Y,c)|0;j=Y+4|0;if(Qd(j,a,c)|0){l=83;break}if($){g=j;continue}}j=Y;if((j-i|0)>=(b-j|0)){l=82;break}Ib(h,Y,c);g=Y+4|0}if((l|0)==82){l=0;Ib(Y+4|0,a,c);d=h;a=Y;continue}else if((l|0)==83){l=0;if($){l=84;break}else{d=h;a=Y;continue}}}switch(l|0){case 5:{l=f[e>>2]|0;Y=f[h>>2]|0;d=f[c>>2]|0;$=f[d>>2]|0;i=(f[d+4>>2]|0)-$>>3;if(i>>>0<=l>>>0)mq(d);_=$;if(i>>>0<=Y>>>0)mq(d);if((f[_+(l<<3)>>2]|0)>>>0>=(f[_+(Y<<3)>>2]|0)>>>0)return;f[h>>2]=l;f[e>>2]=Y;return}case 11:{Cg(h,h+4|0,e,c)|0;return}case 12:{Qg(h,h+4|0,h+8|0,e,c)|0;return}case 13:{Tf(h,h+4|0,h+8|0,h+12|0,e,c)|0;return}case 15:{Pg(h,a,c);return}case 20:{mq(p);break}case 22:{mq(p);break}case 26:{mq(p);break}case 32:{mq(p);break}case 38:{mq(A);break}case 40:{mq(A);break}case 46:{mq(A);break}case 47:{mq(A);break}case 51:{mq(p);break}case 57:{mq(R);break}case 59:{mq(S);break}case 65:{if(N>>>0>(f[J+-4>>2]|0)>>>0)mq(S);else mq(S);break}case 66:{mq(S);break}case 72:{mq(Z);break}case 74:{mq(Z);break}case 84:return}}function Jb(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0;d=a;a=b;a:while(1){b=a;e=a+-4|0;g=d;while(1){h=g;b:while(1){i=h;j=b-i|0;k=j>>2;switch(k|0){case 2:{l=5;break a;break}case 3:{l=11;break a;break}case 4:{l=12;break a;break}case 5:{l=13;break a;break}case 1:case 0:{l=84;break a;break}default:{}}if((j|0)<124){l=15;break a}m=h+(((k|0)/2|0)<<2)|0;if((j|0)>3996){j=(k|0)/4|0;n=Tf(h,h+(j<<2)|0,m,m+(j<<2)|0,e,c)|0}else n=Cg(h,m,e,c)|0;o=f[h>>2]|0;j=f[m>>2]|0;p=f[c>>2]|0;k=f[p>>2]|0;q=(f[p+4>>2]|0)-k>>3;if(q>>>0<=o>>>0){l=20;break a}r=k;if(q>>>0<=j>>>0){l=22;break a}k=f[r+(o<<3)>>2]|0;s=f[r+(j<<3)>>2]|0;if(k>>>0<s>>>0){t=e;u=n;break}else v=e;while(1){v=v+-4|0;if((h|0)==(v|0))break;w=f[v>>2]|0;if(q>>>0<=w>>>0){l=51;break a}if((f[r+(w<<3)>>2]|0)>>>0<s>>>0){l=53;break b}}s=h+4|0;j=f[e>>2]|0;if(q>>>0<=j>>>0){l=26;break a}if(k>>>0<(f[r+(j<<3)>>2]|0)>>>0)x=s;else{if((s|0)==(e|0)){l=84;break a}else y=s;while(1){z=f[y>>2]|0;if(q>>>0<=z>>>0){l=32;break a}if(k>>>0<(f[r+(z<<3)>>2]|0)>>>0)break;s=y+4|0;if((s|0)==(e|0)){l=84;break a}else y=s}f[y>>2]=j;f[e>>2]=z;x=y+4|0}if((x|0)==(e|0)){l=84;break a}r=f[h>>2]|0;A=f[c>>2]|0;k=f[A>>2]|0;q=(f[A+4>>2]|0)-k>>3;if(q>>>0<=r>>>0){l=38;break a}s=k;k=e;B=x;C=r;while(1){r=s+(C<<3)|0;D=q>>>0>C>>>0;E=B;while(1){F=f[E>>2]|0;if(q>>>0<=F>>>0){l=40;break a}G=f[r>>2]|0;if(G>>>0<(f[s+(F<<3)>>2]|0)>>>0)break;if(D)E=E+4|0;else{l=38;break a}}if(q>>>0>C>>>0)H=k;else{l=46;break a}do{H=H+-4|0;I=f[H>>2]|0;if(q>>>0<=I>>>0){l=47;break a}}while(G>>>0<(f[s+(I<<3)>>2]|0)>>>0);if(E>>>0>=H>>>0){h=E;continue b}D=f[E>>2]|0;f[E>>2]=I;f[H>>2]=D;C=f[h>>2]|0;if(q>>>0<=C>>>0){l=38;break a}else{k=H;B=E+4|0}}}if((l|0)==53){l=0;f[h>>2]=w;f[v>>2]=o;t=v;u=n+1|0}B=h+4|0;c:do if(B>>>0<t>>>0){k=f[B>>2]|0;C=f[c>>2]|0;q=f[C>>2]|0;s=(f[C+4>>2]|0)-q>>3;if(s>>>0>k>>>0){J=t;K=B;L=u;M=m;N=s;O=q;P=C;Q=k}else{R=C;l=57;break a}while(1){C=f[c>>2]|0;k=C+4|0;q=f[M>>2]|0;s=K;j=O;D=N;S=P;r=Q;while(1){F=j;if(D>>>0<=q>>>0){l=59;break a}if((f[F+(r<<3)>>2]|0)>>>0>=(f[F+(q<<3)>>2]|0)>>>0)break;F=s+4|0;T=f[F>>2]|0;j=f[C>>2]|0;D=(f[k>>2]|0)-j>>3;if(D>>>0<=T>>>0){R=C;l=57;break a}else{s=F;S=C;r=T}}C=f[M>>2]|0;O=f[S>>2]|0;N=(f[S+4>>2]|0)-O>>3;D=O;j=D+(C<<3)|0;if(N>>>0>C>>>0)U=J;else{l=65;break a}do{U=U+-4|0;V=f[U>>2]|0;if(N>>>0<=V>>>0){l=66;break a}}while((f[D+(V<<3)>>2]|0)>>>0>=(f[j>>2]|0)>>>0);if(s>>>0>U>>>0){W=M;X=L;Y=s;break c}f[s>>2]=V;f[U>>2]=r;K=s+4|0;Q=f[K>>2]|0;if(N>>>0<=Q>>>0){R=S;l=57;break a}else{J=U;L=L+1|0;M=(M|0)==(s|0)?U:M;P=S}}}else{W=m;X=u;Y=B}while(0);if((Y|0)!=(W|0)){B=f[W>>2]|0;j=f[Y>>2]|0;Z=f[c>>2]|0;D=f[Z>>2]|0;C=(f[Z+4>>2]|0)-D>>3;if(C>>>0<=B>>>0){l=72;break a}k=D;if(C>>>0<=j>>>0){l=74;break a}if((f[k+(B<<3)>>2]|0)>>>0<(f[k+(j<<3)>>2]|0)>>>0){f[Y>>2]=B;f[W>>2]=j;_=X+1|0}else _=X}else _=X;if(!_){$=Qd(h,Y,c)|0;j=Y+4|0;if(Qd(j,a,c)|0){l=83;break}if($){g=j;continue}}j=Y;if((j-i|0)>=(b-j|0)){l=82;break}Jb(h,Y,c);g=Y+4|0}if((l|0)==82){l=0;Jb(Y+4|0,a,c);d=h;a=Y;continue}else if((l|0)==83){l=0;if($){l=84;break}else{d=h;a=Y;continue}}}switch(l|0){case 5:{l=f[e>>2]|0;Y=f[h>>2]|0;d=f[c>>2]|0;$=f[d>>2]|0;i=(f[d+4>>2]|0)-$>>3;if(i>>>0<=l>>>0)mq(d);_=$;if(i>>>0<=Y>>>0)mq(d);if((f[_+(l<<3)>>2]|0)>>>0>=(f[_+(Y<<3)>>2]|0)>>>0)return;f[h>>2]=l;f[e>>2]=Y;return}case 11:{Cg(h,h+4|0,e,c)|0;return}case 12:{Qg(h,h+4|0,h+8|0,e,c)|0;return}case 13:{Tf(h,h+4|0,h+8|0,h+12|0,e,c)|0;return}case 15:{Pg(h,a,c);return}case 20:{mq(p);break}case 22:{mq(p);break}case 26:{mq(p);break}case 32:{mq(p);break}case 38:{mq(A);break}case 40:{mq(A);break}case 46:{mq(A);break}case 47:{mq(A);break}case 51:{mq(p);break}case 57:{mq(R);break}case 59:{mq(S);break}case 65:{if(N>>>0>(f[J+-4>>2]|0)>>>0)mq(S);else mq(S);break}case 66:{mq(S);break}case 72:{mq(Z);break}case 74:{mq(Z);break}case 84:return}}function Kb(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0;d=a;a=b;a:while(1){b=a;e=a+-4|0;g=d;while(1){h=g;b:while(1){i=h;j=b-i|0;k=j>>2;switch(k|0){case 2:{l=5;break a;break}case 3:{l=11;break a;break}case 4:{l=12;break a;break}case 5:{l=13;break a;break}case 1:case 0:{l=84;break a;break}default:{}}if((j|0)<124){l=15;break a}m=h+(((k|0)/2|0)<<2)|0;if((j|0)>3996){j=(k|0)/4|0;n=Tf(h,h+(j<<2)|0,m,m+(j<<2)|0,e,c)|0}else n=Cg(h,m,e,c)|0;o=f[h>>2]|0;j=f[m>>2]|0;p=f[c>>2]|0;k=f[p>>2]|0;q=(f[p+4>>2]|0)-k>>3;if(q>>>0<=o>>>0){l=20;break a}r=k;if(q>>>0<=j>>>0){l=22;break a}k=f[r+(o<<3)>>2]|0;s=f[r+(j<<3)>>2]|0;if(k>>>0<s>>>0){t=e;u=n;break}else v=e;while(1){v=v+-4|0;if((h|0)==(v|0))break;w=f[v>>2]|0;if(q>>>0<=w>>>0){l=51;break a}if((f[r+(w<<3)>>2]|0)>>>0<s>>>0){l=53;break b}}s=h+4|0;j=f[e>>2]|0;if(q>>>0<=j>>>0){l=26;break a}if(k>>>0<(f[r+(j<<3)>>2]|0)>>>0)x=s;else{if((s|0)==(e|0)){l=84;break a}else y=s;while(1){z=f[y>>2]|0;if(q>>>0<=z>>>0){l=32;break a}if(k>>>0<(f[r+(z<<3)>>2]|0)>>>0)break;s=y+4|0;if((s|0)==(e|0)){l=84;break a}else y=s}f[y>>2]=j;f[e>>2]=z;x=y+4|0}if((x|0)==(e|0)){l=84;break a}r=f[h>>2]|0;A=f[c>>2]|0;k=f[A>>2]|0;q=(f[A+4>>2]|0)-k>>3;if(q>>>0<=r>>>0){l=38;break a}s=k;k=e;B=x;C=r;while(1){r=s+(C<<3)|0;D=q>>>0>C>>>0;E=B;while(1){F=f[E>>2]|0;if(q>>>0<=F>>>0){l=40;break a}G=f[r>>2]|0;if(G>>>0<(f[s+(F<<3)>>2]|0)>>>0)break;if(D)E=E+4|0;else{l=38;break a}}if(q>>>0>C>>>0)H=k;else{l=46;break a}do{H=H+-4|0;I=f[H>>2]|0;if(q>>>0<=I>>>0){l=47;break a}}while(G>>>0<(f[s+(I<<3)>>2]|0)>>>0);if(E>>>0>=H>>>0){h=E;continue b}D=f[E>>2]|0;f[E>>2]=I;f[H>>2]=D;C=f[h>>2]|0;if(q>>>0<=C>>>0){l=38;break a}else{k=H;B=E+4|0}}}if((l|0)==53){l=0;f[h>>2]=w;f[v>>2]=o;t=v;u=n+1|0}B=h+4|0;c:do if(B>>>0<t>>>0){k=f[B>>2]|0;C=f[c>>2]|0;q=f[C>>2]|0;s=(f[C+4>>2]|0)-q>>3;if(s>>>0>k>>>0){J=t;K=B;L=u;M=m;N=s;O=q;P=C;Q=k}else{R=C;l=57;break a}while(1){C=f[c>>2]|0;k=C+4|0;q=f[M>>2]|0;s=K;j=O;D=N;S=P;r=Q;while(1){F=j;if(D>>>0<=q>>>0){l=59;break a}if((f[F+(r<<3)>>2]|0)>>>0>=(f[F+(q<<3)>>2]|0)>>>0)break;F=s+4|0;T=f[F>>2]|0;j=f[C>>2]|0;D=(f[k>>2]|0)-j>>3;if(D>>>0<=T>>>0){R=C;l=57;break a}else{s=F;S=C;r=T}}C=f[M>>2]|0;O=f[S>>2]|0;N=(f[S+4>>2]|0)-O>>3;D=O;j=D+(C<<3)|0;if(N>>>0>C>>>0)U=J;else{l=65;break a}do{U=U+-4|0;V=f[U>>2]|0;if(N>>>0<=V>>>0){l=66;break a}}while((f[D+(V<<3)>>2]|0)>>>0>=(f[j>>2]|0)>>>0);if(s>>>0>U>>>0){W=M;X=L;Y=s;break c}f[s>>2]=V;f[U>>2]=r;K=s+4|0;Q=f[K>>2]|0;if(N>>>0<=Q>>>0){R=S;l=57;break a}else{J=U;L=L+1|0;M=(M|0)==(s|0)?U:M;P=S}}}else{W=m;X=u;Y=B}while(0);if((Y|0)!=(W|0)){B=f[W>>2]|0;j=f[Y>>2]|0;Z=f[c>>2]|0;D=f[Z>>2]|0;C=(f[Z+4>>2]|0)-D>>3;if(C>>>0<=B>>>0){l=72;break a}k=D;if(C>>>0<=j>>>0){l=74;break a}if((f[k+(B<<3)>>2]|0)>>>0<(f[k+(j<<3)>>2]|0)>>>0){f[Y>>2]=B;f[W>>2]=j;_=X+1|0}else _=X}else _=X;if(!_){$=Qd(h,Y,c)|0;j=Y+4|0;if(Qd(j,a,c)|0){l=83;break}if($){g=j;continue}}j=Y;if((j-i|0)>=(b-j|0)){l=82;break}Kb(h,Y,c);g=Y+4|0}if((l|0)==82){l=0;Kb(Y+4|0,a,c);d=h;a=Y;continue}else if((l|0)==83){l=0;if($){l=84;break}else{d=h;a=Y;continue}}}switch(l|0){case 5:{l=f[e>>2]|0;Y=f[h>>2]|0;d=f[c>>2]|0;$=f[d>>2]|0;i=(f[d+4>>2]|0)-$>>3;if(i>>>0<=l>>>0)mq(d);_=$;if(i>>>0<=Y>>>0)mq(d);if((f[_+(l<<3)>>2]|0)>>>0>=(f[_+(Y<<3)>>2]|0)>>>0)return;f[h>>2]=l;f[e>>2]=Y;return}case 11:{Cg(h,h+4|0,e,c)|0;return}case 12:{Qg(h,h+4|0,h+8|0,e,c)|0;return}case 13:{Tf(h,h+4|0,h+8|0,h+12|0,e,c)|0;return}case 15:{Pg(h,a,c);return}case 20:{mq(p);break}case 22:{mq(p);break}case 26:{mq(p);break}case 32:{mq(p);break}case 38:{mq(A);break}case 40:{mq(A);break}case 46:{mq(A);break}case 47:{mq(A);break}case 51:{mq(p);break}case 57:{mq(R);break}case 59:{mq(S);break}case 65:{if(N>>>0>(f[J+-4>>2]|0)>>>0)mq(S);else mq(S);break}case 66:{mq(S);break}case 72:{mq(Z);break}case 74:{mq(Z);break}case 84:return}}function Lb(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0;d=a;a=b;a:while(1){b=a;e=a+-4|0;g=d;while(1){h=g;b:while(1){i=h;j=b-i|0;k=j>>2;switch(k|0){case 2:{l=5;break a;break}case 3:{l=11;break a;break}case 4:{l=12;break a;break}case 5:{l=13;break a;break}case 1:case 0:{l=84;break a;break}default:{}}if((j|0)<124){l=15;break a}m=h+(((k|0)/2|0)<<2)|0;if((j|0)>3996){j=(k|0)/4|0;n=Tf(h,h+(j<<2)|0,m,m+(j<<2)|0,e,c)|0}else n=Cg(h,m,e,c)|0;o=f[h>>2]|0;j=f[m>>2]|0;p=f[c>>2]|0;k=f[p>>2]|0;q=(f[p+4>>2]|0)-k>>3;if(q>>>0<=o>>>0){l=20;break a}r=k;if(q>>>0<=j>>>0){l=22;break a}k=f[r+(o<<3)>>2]|0;s=f[r+(j<<3)>>2]|0;if(k>>>0<s>>>0){t=e;u=n;break}else v=e;while(1){v=v+-4|0;if((h|0)==(v|0))break;w=f[v>>2]|0;if(q>>>0<=w>>>0){l=51;break a}if((f[r+(w<<3)>>2]|0)>>>0<s>>>0){l=53;break b}}s=h+4|0;j=f[e>>2]|0;if(q>>>0<=j>>>0){l=26;break a}if(k>>>0<(f[r+(j<<3)>>2]|0)>>>0)x=s;else{if((s|0)==(e|0)){l=84;break a}else y=s;while(1){z=f[y>>2]|0;if(q>>>0<=z>>>0){l=32;break a}if(k>>>0<(f[r+(z<<3)>>2]|0)>>>0)break;s=y+4|0;if((s|0)==(e|0)){l=84;break a}else y=s}f[y>>2]=j;f[e>>2]=z;x=y+4|0}if((x|0)==(e|0)){l=84;break a}r=f[h>>2]|0;A=f[c>>2]|0;k=f[A>>2]|0;q=(f[A+4>>2]|0)-k>>3;if(q>>>0<=r>>>0){l=38;break a}s=k;k=e;B=x;C=r;while(1){r=s+(C<<3)|0;D=q>>>0>C>>>0;E=B;while(1){F=f[E>>2]|0;if(q>>>0<=F>>>0){l=40;break a}G=f[r>>2]|0;if(G>>>0<(f[s+(F<<3)>>2]|0)>>>0)break;if(D)E=E+4|0;else{l=38;break a}}if(q>>>0>C>>>0)H=k;else{l=46;break a}do{H=H+-4|0;I=f[H>>2]|0;if(q>>>0<=I>>>0){l=47;break a}}while(G>>>0<(f[s+(I<<3)>>2]|0)>>>0);if(E>>>0>=H>>>0){h=E;continue b}D=f[E>>2]|0;f[E>>2]=I;f[H>>2]=D;C=f[h>>2]|0;if(q>>>0<=C>>>0){l=38;break a}else{k=H;B=E+4|0}}}if((l|0)==53){l=0;f[h>>2]=w;f[v>>2]=o;t=v;u=n+1|0}B=h+4|0;c:do if(B>>>0<t>>>0){k=f[B>>2]|0;C=f[c>>2]|0;q=f[C>>2]|0;s=(f[C+4>>2]|0)-q>>3;if(s>>>0>k>>>0){J=t;K=B;L=u;M=m;N=s;O=q;P=C;Q=k}else{R=C;l=57;break a}while(1){C=f[c>>2]|0;k=C+4|0;q=f[M>>2]|0;s=K;j=O;D=N;S=P;r=Q;while(1){F=j;if(D>>>0<=q>>>0){l=59;break a}if((f[F+(r<<3)>>2]|0)>>>0>=(f[F+(q<<3)>>2]|0)>>>0)break;F=s+4|0;T=f[F>>2]|0;j=f[C>>2]|0;D=(f[k>>2]|0)-j>>3;if(D>>>0<=T>>>0){R=C;l=57;break a}else{s=F;S=C;r=T}}C=f[M>>2]|0;O=f[S>>2]|0;N=(f[S+4>>2]|0)-O>>3;D=O;j=D+(C<<3)|0;if(N>>>0>C>>>0)U=J;else{l=65;break a}do{U=U+-4|0;V=f[U>>2]|0;if(N>>>0<=V>>>0){l=66;break a}}while((f[D+(V<<3)>>2]|0)>>>0>=(f[j>>2]|0)>>>0);if(s>>>0>U>>>0){W=M;X=L;Y=s;break c}f[s>>2]=V;f[U>>2]=r;K=s+4|0;Q=f[K>>2]|0;if(N>>>0<=Q>>>0){R=S;l=57;break a}else{J=U;L=L+1|0;M=(M|0)==(s|0)?U:M;P=S}}}else{W=m;X=u;Y=B}while(0);if((Y|0)!=(W|0)){B=f[W>>2]|0;j=f[Y>>2]|0;Z=f[c>>2]|0;D=f[Z>>2]|0;C=(f[Z+4>>2]|0)-D>>3;if(C>>>0<=B>>>0){l=72;break a}k=D;if(C>>>0<=j>>>0){l=74;break a}if((f[k+(B<<3)>>2]|0)>>>0<(f[k+(j<<3)>>2]|0)>>>0){f[Y>>2]=B;f[W>>2]=j;_=X+1|0}else _=X}else _=X;if(!_){$=Qd(h,Y,c)|0;j=Y+4|0;if(Qd(j,a,c)|0){l=83;break}if($){g=j;continue}}j=Y;if((j-i|0)>=(b-j|0)){l=82;break}Lb(h,Y,c);g=Y+4|0}if((l|0)==82){l=0;Lb(Y+4|0,a,c);d=h;a=Y;continue}else if((l|0)==83){l=0;if($){l=84;break}else{d=h;a=Y;continue}}}switch(l|0){case 5:{l=f[e>>2]|0;Y=f[h>>2]|0;d=f[c>>2]|0;$=f[d>>2]|0;i=(f[d+4>>2]|0)-$>>3;if(i>>>0<=l>>>0)mq(d);_=$;if(i>>>0<=Y>>>0)mq(d);if((f[_+(l<<3)>>2]|0)>>>0>=(f[_+(Y<<3)>>2]|0)>>>0)return;f[h>>2]=l;f[e>>2]=Y;return}case 11:{Cg(h,h+4|0,e,c)|0;return}case 12:{Qg(h,h+4|0,h+8|0,e,c)|0;return}case 13:{Tf(h,h+4|0,h+8|0,h+12|0,e,c)|0;return}case 15:{Pg(h,a,c);return}case 20:{mq(p);break}case 22:{mq(p);break}case 26:{mq(p);break}case 32:{mq(p);break}case 38:{mq(A);break}case 40:{mq(A);break}case 46:{mq(A);break}case 47:{mq(A);break}case 51:{mq(p);break}case 57:{mq(R);break}case 59:{mq(S);break}case 65:{if(N>>>0>(f[J+-4>>2]|0)>>>0)mq(S);else mq(S);break}case 66:{mq(S);break}case 72:{mq(Z);break}case 74:{mq(Z);break}case 84:return}}function Mb(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0;d=a;a=b;a:while(1){b=a;e=a+-4|0;g=d;while(1){h=g;b:while(1){i=h;j=b-i|0;k=j>>2;switch(k|0){case 2:{l=5;break a;break}case 3:{l=11;break a;break}case 4:{l=12;break a;break}case 5:{l=13;break a;break}case 1:case 0:{l=84;break a;break}default:{}}if((j|0)<124){l=15;break a}m=h+(((k|0)/2|0)<<2)|0;if((j|0)>3996){j=(k|0)/4|0;n=Tf(h,h+(j<<2)|0,m,m+(j<<2)|0,e,c)|0}else n=Cg(h,m,e,c)|0;o=f[h>>2]|0;j=f[m>>2]|0;p=f[c>>2]|0;k=f[p>>2]|0;q=(f[p+4>>2]|0)-k>>3;if(q>>>0<=o>>>0){l=20;break a}r=k;if(q>>>0<=j>>>0){l=22;break a}k=f[r+(o<<3)>>2]|0;s=f[r+(j<<3)>>2]|0;if(k>>>0<s>>>0){t=e;u=n;break}else v=e;while(1){v=v+-4|0;if((h|0)==(v|0))break;w=f[v>>2]|0;if(q>>>0<=w>>>0){l=51;break a}if((f[r+(w<<3)>>2]|0)>>>0<s>>>0){l=53;break b}}s=h+4|0;j=f[e>>2]|0;if(q>>>0<=j>>>0){l=26;break a}if(k>>>0<(f[r+(j<<3)>>2]|0)>>>0)x=s;else{if((s|0)==(e|0)){l=84;break a}else y=s;while(1){z=f[y>>2]|0;if(q>>>0<=z>>>0){l=32;break a}if(k>>>0<(f[r+(z<<3)>>2]|0)>>>0)break;s=y+4|0;if((s|0)==(e|0)){l=84;break a}else y=s}f[y>>2]=j;f[e>>2]=z;x=y+4|0}if((x|0)==(e|0)){l=84;break a}r=f[h>>2]|0;A=f[c>>2]|0;k=f[A>>2]|0;q=(f[A+4>>2]|0)-k>>3;if(q>>>0<=r>>>0){l=38;break a}s=k;k=e;B=x;C=r;while(1){r=s+(C<<3)|0;D=q>>>0>C>>>0;E=B;while(1){F=f[E>>2]|0;if(q>>>0<=F>>>0){l=40;break a}G=f[r>>2]|0;if(G>>>0<(f[s+(F<<3)>>2]|0)>>>0)break;if(D)E=E+4|0;else{l=38;break a}}if(q>>>0>C>>>0)H=k;else{l=46;break a}do{H=H+-4|0;I=f[H>>2]|0;if(q>>>0<=I>>>0){l=47;break a}}while(G>>>0<(f[s+(I<<3)>>2]|0)>>>0);if(E>>>0>=H>>>0){h=E;continue b}D=f[E>>2]|0;f[E>>2]=I;f[H>>2]=D;C=f[h>>2]|0;if(q>>>0<=C>>>0){l=38;break a}else{k=H;B=E+4|0}}}if((l|0)==53){l=0;f[h>>2]=w;f[v>>2]=o;t=v;u=n+1|0}B=h+4|0;c:do if(B>>>0<t>>>0){k=f[B>>2]|0;C=f[c>>2]|0;q=f[C>>2]|0;s=(f[C+4>>2]|0)-q>>3;if(s>>>0>k>>>0){J=t;K=B;L=u;M=m;N=s;O=q;P=C;Q=k}else{R=C;l=57;break a}while(1){C=f[c>>2]|0;k=C+4|0;q=f[M>>2]|0;s=K;j=O;D=N;S=P;r=Q;while(1){F=j;if(D>>>0<=q>>>0){l=59;break a}if((f[F+(r<<3)>>2]|0)>>>0>=(f[F+(q<<3)>>2]|0)>>>0)break;F=s+4|0;T=f[F>>2]|0;j=f[C>>2]|0;D=(f[k>>2]|0)-j>>3;if(D>>>0<=T>>>0){R=C;l=57;break a}else{s=F;S=C;r=T}}C=f[M>>2]|0;O=f[S>>2]|0;N=(f[S+4>>2]|0)-O>>3;D=O;j=D+(C<<3)|0;if(N>>>0>C>>>0)U=J;else{l=65;break a}do{U=U+-4|0;V=f[U>>2]|0;if(N>>>0<=V>>>0){l=66;break a}}while((f[D+(V<<3)>>2]|0)>>>0>=(f[j>>2]|0)>>>0);if(s>>>0>U>>>0){W=M;X=L;Y=s;break c}f[s>>2]=V;f[U>>2]=r;K=s+4|0;Q=f[K>>2]|0;if(N>>>0<=Q>>>0){R=S;l=57;break a}else{J=U;L=L+1|0;M=(M|0)==(s|0)?U:M;P=S}}}else{W=m;X=u;Y=B}while(0);if((Y|0)!=(W|0)){B=f[W>>2]|0;j=f[Y>>2]|0;Z=f[c>>2]|0;D=f[Z>>2]|0;C=(f[Z+4>>2]|0)-D>>3;if(C>>>0<=B>>>0){l=72;break a}k=D;if(C>>>0<=j>>>0){l=74;break a}if((f[k+(B<<3)>>2]|0)>>>0<(f[k+(j<<3)>>2]|0)>>>0){f[Y>>2]=B;f[W>>2]=j;_=X+1|0}else _=X}else _=X;if(!_){$=Qd(h,Y,c)|0;j=Y+4|0;if(Qd(j,a,c)|0){l=83;break}if($){g=j;continue}}j=Y;if((j-i|0)>=(b-j|0)){l=82;break}Mb(h,Y,c);g=Y+4|0}if((l|0)==82){l=0;Mb(Y+4|0,a,c);d=h;a=Y;continue}else if((l|0)==83){l=0;if($){l=84;break}else{d=h;a=Y;continue}}}switch(l|0){case 5:{l=f[e>>2]|0;Y=f[h>>2]|0;d=f[c>>2]|0;$=f[d>>2]|0;i=(f[d+4>>2]|0)-$>>3;if(i>>>0<=l>>>0)mq(d);_=$;if(i>>>0<=Y>>>0)mq(d);if((f[_+(l<<3)>>2]|0)>>>0>=(f[_+(Y<<3)>>2]|0)>>>0)return;f[h>>2]=l;f[e>>2]=Y;return}case 11:{Cg(h,h+4|0,e,c)|0;return}case 12:{Qg(h,h+4|0,h+8|0,e,c)|0;return}case 13:{Tf(h,h+4|0,h+8|0,h+12|0,e,c)|0;return}case 15:{Pg(h,a,c);return}case 20:{mq(p);break}case 22:{mq(p);break}case 26:{mq(p);break}case 32:{mq(p);break}case 38:{mq(A);break}case 40:{mq(A);break}case 46:{mq(A);break}case 47:{mq(A);break}case 51:{mq(p);break}case 57:{mq(R);break}case 59:{mq(S);break}case 65:{if(N>>>0>(f[J+-4>>2]|0)>>>0)mq(S);else mq(S);break}case 66:{mq(S);break}case 72:{mq(Z);break}case 74:{mq(Z);break}case 84:return}}function Nb(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0;d=a;a=b;a:while(1){b=a;e=a+-4|0;g=d;while(1){h=g;b:while(1){i=h;j=b-i|0;k=j>>2;switch(k|0){case 2:{l=5;break a;break}case 3:{l=11;break a;break}case 4:{l=12;break a;break}case 5:{l=13;break a;break}case 1:case 0:{l=84;break a;break}default:{}}if((j|0)<124){l=15;break a}m=h+(((k|0)/2|0)<<2)|0;if((j|0)>3996){j=(k|0)/4|0;n=Tf(h,h+(j<<2)|0,m,m+(j<<2)|0,e,c)|0}else n=Cg(h,m,e,c)|0;o=f[h>>2]|0;j=f[m>>2]|0;p=f[c>>2]|0;k=f[p>>2]|0;q=(f[p+4>>2]|0)-k>>3;if(q>>>0<=o>>>0){l=20;break a}r=k;if(q>>>0<=j>>>0){l=22;break a}k=f[r+(o<<3)>>2]|0;s=f[r+(j<<3)>>2]|0;if(k>>>0<s>>>0){t=e;u=n;break}else v=e;while(1){v=v+-4|0;if((h|0)==(v|0))break;w=f[v>>2]|0;if(q>>>0<=w>>>0){l=51;break a}if((f[r+(w<<3)>>2]|0)>>>0<s>>>0){l=53;break b}}s=h+4|0;j=f[e>>2]|0;if(q>>>0<=j>>>0){l=26;break a}if(k>>>0<(f[r+(j<<3)>>2]|0)>>>0)x=s;else{if((s|0)==(e|0)){l=84;break a}else y=s;while(1){z=f[y>>2]|0;if(q>>>0<=z>>>0){l=32;break a}if(k>>>0<(f[r+(z<<3)>>2]|0)>>>0)break;s=y+4|0;if((s|0)==(e|0)){l=84;break a}else y=s}f[y>>2]=j;f[e>>2]=z;x=y+4|0}if((x|0)==(e|0)){l=84;break a}r=f[h>>2]|0;A=f[c>>2]|0;k=f[A>>2]|0;q=(f[A+4>>2]|0)-k>>3;if(q>>>0<=r>>>0){l=38;break a}s=k;k=e;B=x;C=r;while(1){r=s+(C<<3)|0;D=q>>>0>C>>>0;E=B;while(1){F=f[E>>2]|0;if(q>>>0<=F>>>0){l=40;break a}G=f[r>>2]|0;if(G>>>0<(f[s+(F<<3)>>2]|0)>>>0)break;if(D)E=E+4|0;else{l=38;break a}}if(q>>>0>C>>>0)H=k;else{l=46;break a}do{H=H+-4|0;I=f[H>>2]|0;if(q>>>0<=I>>>0){l=47;break a}}while(G>>>0<(f[s+(I<<3)>>2]|0)>>>0);if(E>>>0>=H>>>0){h=E;continue b}D=f[E>>2]|0;f[E>>2]=I;f[H>>2]=D;C=f[h>>2]|0;if(q>>>0<=C>>>0){l=38;break a}else{k=H;B=E+4|0}}}if((l|0)==53){l=0;f[h>>2]=w;f[v>>2]=o;t=v;u=n+1|0}B=h+4|0;c:do if(B>>>0<t>>>0){k=f[B>>2]|0;C=f[c>>2]|0;q=f[C>>2]|0;s=(f[C+4>>2]|0)-q>>3;if(s>>>0>k>>>0){J=t;K=B;L=u;M=m;N=s;O=q;P=C;Q=k}else{R=C;l=57;break a}while(1){C=f[c>>2]|0;k=C+4|0;q=f[M>>2]|0;s=K;j=O;D=N;S=P;r=Q;while(1){F=j;if(D>>>0<=q>>>0){l=59;break a}if((f[F+(r<<3)>>2]|0)>>>0>=(f[F+(q<<3)>>2]|0)>>>0)break;F=s+4|0;T=f[F>>2]|0;j=f[C>>2]|0;D=(f[k>>2]|0)-j>>3;if(D>>>0<=T>>>0){R=C;l=57;break a}else{s=F;S=C;r=T}}C=f[M>>2]|0;O=f[S>>2]|0;N=(f[S+4>>2]|0)-O>>3;D=O;j=D+(C<<3)|0;if(N>>>0>C>>>0)U=J;else{l=65;break a}do{U=U+-4|0;V=f[U>>2]|0;if(N>>>0<=V>>>0){l=66;break a}}while((f[D+(V<<3)>>2]|0)>>>0>=(f[j>>2]|0)>>>0);if(s>>>0>U>>>0){W=M;X=L;Y=s;break c}f[s>>2]=V;f[U>>2]=r;K=s+4|0;Q=f[K>>2]|0;if(N>>>0<=Q>>>0){R=S;l=57;break a}else{J=U;L=L+1|0;M=(M|0)==(s|0)?U:M;P=S}}}else{W=m;X=u;Y=B}while(0);if((Y|0)!=(W|0)){B=f[W>>2]|0;j=f[Y>>2]|0;Z=f[c>>2]|0;D=f[Z>>2]|0;C=(f[Z+4>>2]|0)-D>>3;if(C>>>0<=B>>>0){l=72;break a}k=D;if(C>>>0<=j>>>0){l=74;break a}if((f[k+(B<<3)>>2]|0)>>>0<(f[k+(j<<3)>>2]|0)>>>0){f[Y>>2]=B;f[W>>2]=j;_=X+1|0}else _=X}else _=X;if(!_){$=Qd(h,Y,c)|0;j=Y+4|0;if(Qd(j,a,c)|0){l=83;break}if($){g=j;continue}}j=Y;if((j-i|0)>=(b-j|0)){l=82;break}Nb(h,Y,c);g=Y+4|0}if((l|0)==82){l=0;Nb(Y+4|0,a,c);d=h;a=Y;continue}else if((l|0)==83){l=0;if($){l=84;break}else{d=h;a=Y;continue}}}switch(l|0){case 5:{l=f[e>>2]|0;Y=f[h>>2]|0;d=f[c>>2]|0;$=f[d>>2]|0;i=(f[d+4>>2]|0)-$>>3;if(i>>>0<=l>>>0)mq(d);_=$;if(i>>>0<=Y>>>0)mq(d);if((f[_+(l<<3)>>2]|0)>>>0>=(f[_+(Y<<3)>>2]|0)>>>0)return;f[h>>2]=l;f[e>>2]=Y;return}case 11:{Cg(h,h+4|0,e,c)|0;return}case 12:{Qg(h,h+4|0,h+8|0,e,c)|0;return}case 13:{Tf(h,h+4|0,h+8|0,h+12|0,e,c)|0;return}case 15:{Pg(h,a,c);return}case 20:{mq(p);break}case 22:{mq(p);break}case 26:{mq(p);break}case 32:{mq(p);break}case 38:{mq(A);break}case 40:{mq(A);break}case 46:{mq(A);break}case 47:{mq(A);break}case 51:{mq(p);break}case 57:{mq(R);break}case 59:{mq(S);break}case 65:{if(N>>>0>(f[J+-4>>2]|0)>>>0)mq(S);else mq(S);break}case 66:{mq(S);break}case 72:{mq(Z);break}case 74:{mq(Z);break}case 84:return}}function Ob(a,c,e,g){a=a|0;c=c|0;e=e|0;g=g|0;var i=0,k=0,l=0,m=0,o=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0;if(!g){i=0;return i|0}do switch(f[a+28>>2]|0){case 1:{k=a+24|0;l=b[k>>0]|0;if((l<<24>>24>e<<24>>24?e:l)<<24>>24>0){m=f[f[a>>2]>>2]|0;o=a+40|0;q=on(f[o>>2]|0,f[o+4>>2]|0,f[c>>2]|0,0)|0;o=a+48|0;r=Tn(q|0,I|0,f[o>>2]|0,f[o+4>>2]|0)|0;o=m+r|0;r=0;while(1){f[g+(r<<2)>>2]=b[o>>0];r=r+1|0;m=b[k>>0]|0;if((r|0)>=((m<<24>>24>e<<24>>24?e:m)<<24>>24|0)){s=m;break}else o=o+1|0}}else s=l;o=s<<24>>24;if(s<<24>>24>=e<<24>>24){i=1;return i|0}hj(g+(o<<2)|0,0,(e<<24>>24)-o<<2|0)|0;i=1;return i|0}case 2:{o=a+24|0;r=b[o>>0]|0;if((r<<24>>24>e<<24>>24?e:r)<<24>>24>0){k=f[f[a>>2]>>2]|0;m=a+40|0;q=on(f[m>>2]|0,f[m+4>>2]|0,f[c>>2]|0,0)|0;m=a+48|0;t=Tn(q|0,I|0,f[m>>2]|0,f[m+4>>2]|0)|0;m=k+t|0;t=0;while(1){f[g+(t<<2)>>2]=h[m>>0];t=t+1|0;k=b[o>>0]|0;if((t|0)>=((k<<24>>24>e<<24>>24?e:k)<<24>>24|0)){u=k;break}else m=m+1|0}}else u=r;m=u<<24>>24;if(u<<24>>24>=e<<24>>24){i=1;return i|0}hj(g+(m<<2)|0,0,(e<<24>>24)-m<<2|0)|0;i=1;return i|0}case 3:{m=a+24|0;t=b[m>>0]|0;if((t<<24>>24>e<<24>>24?e:t)<<24>>24>0){o=f[f[a>>2]>>2]|0;l=a+40|0;k=on(f[l>>2]|0,f[l+4>>2]|0,f[c>>2]|0,0)|0;l=a+48|0;q=Tn(k|0,I|0,f[l>>2]|0,f[l+4>>2]|0)|0;l=o+q|0;q=0;while(1){f[g+(q<<2)>>2]=d[l>>1];q=q+1|0;o=b[m>>0]|0;if((q|0)>=((o<<24>>24>e<<24>>24?e:o)<<24>>24|0)){v=o;break}else l=l+2|0}}else v=t;l=v<<24>>24;if(v<<24>>24>=e<<24>>24){i=1;return i|0}hj(g+(l<<2)|0,0,(e<<24>>24)-l<<2|0)|0;i=1;return i|0}case 4:{l=a+24|0;q=b[l>>0]|0;if((q<<24>>24>e<<24>>24?e:q)<<24>>24>0){m=f[f[a>>2]>>2]|0;r=a+40|0;o=on(f[r>>2]|0,f[r+4>>2]|0,f[c>>2]|0,0)|0;r=a+48|0;k=Tn(o|0,I|0,f[r>>2]|0,f[r+4>>2]|0)|0;r=m+k|0;k=0;while(1){f[g+(k<<2)>>2]=j[r>>1];k=k+1|0;m=b[l>>0]|0;if((k|0)>=((m<<24>>24>e<<24>>24?e:m)<<24>>24|0)){w=m;break}else r=r+2|0}}else w=q;r=w<<24>>24;if(w<<24>>24>=e<<24>>24){i=1;return i|0}hj(g+(r<<2)|0,0,(e<<24>>24)-r<<2|0)|0;i=1;return i|0}case 5:{r=a+24|0;k=b[r>>0]|0;if((k<<24>>24>e<<24>>24?e:k)<<24>>24>0){l=f[f[a>>2]>>2]|0;t=a+40|0;m=on(f[t>>2]|0,f[t+4>>2]|0,f[c>>2]|0,0)|0;t=a+48|0;o=Tn(m|0,I|0,f[t>>2]|0,f[t+4>>2]|0)|0;t=l+o|0;o=0;while(1){f[g+(o<<2)>>2]=f[t>>2];o=o+1|0;l=b[r>>0]|0;if((o|0)>=((l<<24>>24>e<<24>>24?e:l)<<24>>24|0)){x=l;break}else t=t+4|0}}else x=k;t=x<<24>>24;if(x<<24>>24>=e<<24>>24){i=1;return i|0}hj(g+(t<<2)|0,0,(e<<24>>24)-t<<2|0)|0;i=1;return i|0}case 6:{t=a+24|0;o=b[t>>0]|0;if((o<<24>>24>e<<24>>24?e:o)<<24>>24>0){r=f[f[a>>2]>>2]|0;q=a+40|0;l=on(f[q>>2]|0,f[q+4>>2]|0,f[c>>2]|0,0)|0;q=a+48|0;m=Tn(l|0,I|0,f[q>>2]|0,f[q+4>>2]|0)|0;q=r+m|0;m=0;while(1){f[g+(m<<2)>>2]=f[q>>2];m=m+1|0;r=b[t>>0]|0;if((m|0)>=((r<<24>>24>e<<24>>24?e:r)<<24>>24|0)){y=r;break}else q=q+4|0}}else y=o;q=y<<24>>24;if(y<<24>>24>=e<<24>>24){i=1;return i|0}hj(g+(q<<2)|0,0,(e<<24>>24)-q<<2|0)|0;i=1;return i|0}case 7:{q=a+24|0;m=b[q>>0]|0;if((m<<24>>24>e<<24>>24?e:m)<<24>>24>0){t=f[f[a>>2]>>2]|0;k=a+40|0;r=on(f[k>>2]|0,f[k+4>>2]|0,f[c>>2]|0,0)|0;k=a+48|0;l=Tn(r|0,I|0,f[k>>2]|0,f[k+4>>2]|0)|0;k=t+l|0;l=0;while(1){f[g+(l<<2)>>2]=f[k>>2];l=l+1|0;t=b[q>>0]|0;if((l|0)>=((t<<24>>24>e<<24>>24?e:t)<<24>>24|0)){z=t;break}else k=k+8|0}}else z=m;k=z<<24>>24;if(z<<24>>24>=e<<24>>24){i=1;return i|0}hj(g+(k<<2)|0,0,(e<<24>>24)-k<<2|0)|0;i=1;return i|0}case 8:{k=a+24|0;l=b[k>>0]|0;if((l<<24>>24>e<<24>>24?e:l)<<24>>24>0){q=f[f[a>>2]>>2]|0;o=a+40|0;t=on(f[o>>2]|0,f[o+4>>2]|0,f[c>>2]|0,0)|0;o=a+48|0;r=Tn(t|0,I|0,f[o>>2]|0,f[o+4>>2]|0)|0;o=q+r|0;r=0;while(1){f[g+(r<<2)>>2]=f[o>>2];r=r+1|0;q=b[k>>0]|0;if((r|0)>=((q<<24>>24>e<<24>>24?e:q)<<24>>24|0)){A=q;break}else o=o+8|0}}else A=l;o=A<<24>>24;if(A<<24>>24>=e<<24>>24){i=1;return i|0}hj(g+(o<<2)|0,0,(e<<24>>24)-o<<2|0)|0;i=1;return i|0}case 9:{o=a+24|0;r=b[o>>0]|0;if((r<<24>>24>e<<24>>24?e:r)<<24>>24>0){k=f[f[a>>2]>>2]|0;m=a+40|0;q=on(f[m>>2]|0,f[m+4>>2]|0,f[c>>2]|0,0)|0;m=a+48|0;t=Tn(q|0,I|0,f[m>>2]|0,f[m+4>>2]|0)|0;m=k+t|0;t=0;while(1){k=~~$(n[m>>2])>>>0;f[g+(t<<2)>>2]=k;t=t+1|0;k=b[o>>0]|0;if((t|0)>=((k<<24>>24>e<<24>>24?e:k)<<24>>24|0)){B=k;break}else m=m+4|0}}else B=r;m=B<<24>>24;if(B<<24>>24>=e<<24>>24){i=1;return i|0}hj(g+(m<<2)|0,0,(e<<24>>24)-m<<2|0)|0;i=1;return i|0}case 10:{m=a+24|0;t=b[m>>0]|0;if((t<<24>>24>e<<24>>24?e:t)<<24>>24>0){o=f[f[a>>2]>>2]|0;l=a+40|0;k=on(f[l>>2]|0,f[l+4>>2]|0,f[c>>2]|0,0)|0;l=a+48|0;q=Tn(k|0,I|0,f[l>>2]|0,f[l+4>>2]|0)|0;l=o+q|0;q=0;while(1){f[g+(q<<2)>>2]=~~+p[l>>3]>>>0;q=q+1|0;o=b[m>>0]|0;if((q|0)>=((o<<24>>24>e<<24>>24?e:o)<<24>>24|0)){C=o;break}else l=l+8|0}}else C=t;l=C<<24>>24;if(C<<24>>24>=e<<24>>24){i=1;return i|0}hj(g+(l<<2)|0,0,(e<<24>>24)-l<<2|0)|0;i=1;return i|0}case 11:{l=a+24|0;q=b[l>>0]|0;if((q<<24>>24>e<<24>>24?e:q)<<24>>24>0){m=f[f[a>>2]>>2]|0;r=a+40|0;o=on(f[r>>2]|0,f[r+4>>2]|0,f[c>>2]|0,0)|0;r=a+48|0;k=Tn(o|0,I|0,f[r>>2]|0,f[r+4>>2]|0)|0;r=m+k|0;k=0;while(1){f[g+(k<<2)>>2]=h[r>>0];k=k+1|0;m=b[l>>0]|0;if((k|0)>=((m<<24>>24>e<<24>>24?e:m)<<24>>24|0)){D=m;break}else r=r+1|0}}else D=q;r=D<<24>>24;if(D<<24>>24>=e<<24>>24){i=1;return i|0}hj(g+(r<<2)|0,0,(e<<24>>24)-r<<2|0)|0;i=1;return i|0}default:{i=0;return i|0}}while(0);return 0}function Pb(a,c,e,g){a=a|0;c=c|0;e=e|0;g=g|0;var i=0,k=0,l=0,m=0,o=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0;if(!g){i=0;return i|0}do switch(f[a+28>>2]|0){case 1:{k=a+24|0;l=b[k>>0]|0;if((l<<24>>24>e<<24>>24?e:l)<<24>>24>0){m=f[f[a>>2]>>2]|0;o=a+40|0;q=on(f[o>>2]|0,f[o+4>>2]|0,f[c>>2]|0,0)|0;o=a+48|0;r=Tn(q|0,I|0,f[o>>2]|0,f[o+4>>2]|0)|0;o=m+r|0;r=0;while(1){f[g+(r<<2)>>2]=b[o>>0];r=r+1|0;m=b[k>>0]|0;if((r|0)>=((m<<24>>24>e<<24>>24?e:m)<<24>>24|0)){s=m;break}else o=o+1|0}}else s=l;o=s<<24>>24;if(s<<24>>24>=e<<24>>24){i=1;return i|0}hj(g+(o<<2)|0,0,(e<<24>>24)-o<<2|0)|0;i=1;return i|0}case 2:{o=a+24|0;r=b[o>>0]|0;if((r<<24>>24>e<<24>>24?e:r)<<24>>24>0){k=f[f[a>>2]>>2]|0;m=a+40|0;q=on(f[m>>2]|0,f[m+4>>2]|0,f[c>>2]|0,0)|0;m=a+48|0;t=Tn(q|0,I|0,f[m>>2]|0,f[m+4>>2]|0)|0;m=k+t|0;t=0;while(1){f[g+(t<<2)>>2]=h[m>>0];t=t+1|0;k=b[o>>0]|0;if((t|0)>=((k<<24>>24>e<<24>>24?e:k)<<24>>24|0)){u=k;break}else m=m+1|0}}else u=r;m=u<<24>>24;if(u<<24>>24>=e<<24>>24){i=1;return i|0}hj(g+(m<<2)|0,0,(e<<24>>24)-m<<2|0)|0;i=1;return i|0}case 3:{m=a+24|0;t=b[m>>0]|0;if((t<<24>>24>e<<24>>24?e:t)<<24>>24>0){o=f[f[a>>2]>>2]|0;l=a+40|0;k=on(f[l>>2]|0,f[l+4>>2]|0,f[c>>2]|0,0)|0;l=a+48|0;q=Tn(k|0,I|0,f[l>>2]|0,f[l+4>>2]|0)|0;l=o+q|0;q=0;while(1){f[g+(q<<2)>>2]=d[l>>1];q=q+1|0;o=b[m>>0]|0;if((q|0)>=((o<<24>>24>e<<24>>24?e:o)<<24>>24|0)){v=o;break}else l=l+2|0}}else v=t;l=v<<24>>24;if(v<<24>>24>=e<<24>>24){i=1;return i|0}hj(g+(l<<2)|0,0,(e<<24>>24)-l<<2|0)|0;i=1;return i|0}case 4:{l=a+24|0;q=b[l>>0]|0;if((q<<24>>24>e<<24>>24?e:q)<<24>>24>0){m=f[f[a>>2]>>2]|0;r=a+40|0;o=on(f[r>>2]|0,f[r+4>>2]|0,f[c>>2]|0,0)|0;r=a+48|0;k=Tn(o|0,I|0,f[r>>2]|0,f[r+4>>2]|0)|0;r=m+k|0;k=0;while(1){f[g+(k<<2)>>2]=j[r>>1];k=k+1|0;m=b[l>>0]|0;if((k|0)>=((m<<24>>24>e<<24>>24?e:m)<<24>>24|0)){w=m;break}else r=r+2|0}}else w=q;r=w<<24>>24;if(w<<24>>24>=e<<24>>24){i=1;return i|0}hj(g+(r<<2)|0,0,(e<<24>>24)-r<<2|0)|0;i=1;return i|0}case 5:{r=a+24|0;k=b[r>>0]|0;if((k<<24>>24>e<<24>>24?e:k)<<24>>24>0){l=f[f[a>>2]>>2]|0;t=a+40|0;m=on(f[t>>2]|0,f[t+4>>2]|0,f[c>>2]|0,0)|0;t=a+48|0;o=Tn(m|0,I|0,f[t>>2]|0,f[t+4>>2]|0)|0;t=l+o|0;o=0;while(1){f[g+(o<<2)>>2]=f[t>>2];o=o+1|0;l=b[r>>0]|0;if((o|0)>=((l<<24>>24>e<<24>>24?e:l)<<24>>24|0)){x=l;break}else t=t+4|0}}else x=k;t=x<<24>>24;if(x<<24>>24>=e<<24>>24){i=1;return i|0}hj(g+(t<<2)|0,0,(e<<24>>24)-t<<2|0)|0;i=1;return i|0}case 6:{t=a+24|0;o=b[t>>0]|0;if((o<<24>>24>e<<24>>24?e:o)<<24>>24>0){r=f[f[a>>2]>>2]|0;q=a+40|0;l=on(f[q>>2]|0,f[q+4>>2]|0,f[c>>2]|0,0)|0;q=a+48|0;m=Tn(l|0,I|0,f[q>>2]|0,f[q+4>>2]|0)|0;q=r+m|0;m=0;while(1){f[g+(m<<2)>>2]=f[q>>2];m=m+1|0;r=b[t>>0]|0;if((m|0)>=((r<<24>>24>e<<24>>24?e:r)<<24>>24|0)){y=r;break}else q=q+4|0}}else y=o;q=y<<24>>24;if(y<<24>>24>=e<<24>>24){i=1;return i|0}hj(g+(q<<2)|0,0,(e<<24>>24)-q<<2|0)|0;i=1;return i|0}case 7:{q=a+24|0;m=b[q>>0]|0;if((m<<24>>24>e<<24>>24?e:m)<<24>>24>0){t=f[f[a>>2]>>2]|0;k=a+40|0;r=on(f[k>>2]|0,f[k+4>>2]|0,f[c>>2]|0,0)|0;k=a+48|0;l=Tn(r|0,I|0,f[k>>2]|0,f[k+4>>2]|0)|0;k=t+l|0;l=0;while(1){f[g+(l<<2)>>2]=f[k>>2];l=l+1|0;t=b[q>>0]|0;if((l|0)>=((t<<24>>24>e<<24>>24?e:t)<<24>>24|0)){z=t;break}else k=k+8|0}}else z=m;k=z<<24>>24;if(z<<24>>24>=e<<24>>24){i=1;return i|0}hj(g+(k<<2)|0,0,(e<<24>>24)-k<<2|0)|0;i=1;return i|0}case 8:{k=a+24|0;l=b[k>>0]|0;if((l<<24>>24>e<<24>>24?e:l)<<24>>24>0){q=f[f[a>>2]>>2]|0;o=a+40|0;t=on(f[o>>2]|0,f[o+4>>2]|0,f[c>>2]|0,0)|0;o=a+48|0;r=Tn(t|0,I|0,f[o>>2]|0,f[o+4>>2]|0)|0;o=q+r|0;r=0;while(1){f[g+(r<<2)>>2]=f[o>>2];r=r+1|0;q=b[k>>0]|0;if((r|0)>=((q<<24>>24>e<<24>>24?e:q)<<24>>24|0)){A=q;break}else o=o+8|0}}else A=l;o=A<<24>>24;if(A<<24>>24>=e<<24>>24){i=1;return i|0}hj(g+(o<<2)|0,0,(e<<24>>24)-o<<2|0)|0;i=1;return i|0}case 9:{o=a+24|0;r=b[o>>0]|0;if((r<<24>>24>e<<24>>24?e:r)<<24>>24>0){k=f[f[a>>2]>>2]|0;m=a+40|0;q=on(f[m>>2]|0,f[m+4>>2]|0,f[c>>2]|0,0)|0;m=a+48|0;t=Tn(q|0,I|0,f[m>>2]|0,f[m+4>>2]|0)|0;m=k+t|0;t=0;while(1){k=~~$(n[m>>2]);f[g+(t<<2)>>2]=k;t=t+1|0;k=b[o>>0]|0;if((t|0)>=((k<<24>>24>e<<24>>24?e:k)<<24>>24|0)){B=k;break}else m=m+4|0}}else B=r;m=B<<24>>24;if(B<<24>>24>=e<<24>>24){i=1;return i|0}hj(g+(m<<2)|0,0,(e<<24>>24)-m<<2|0)|0;i=1;return i|0}case 10:{m=a+24|0;t=b[m>>0]|0;if((t<<24>>24>e<<24>>24?e:t)<<24>>24>0){o=f[f[a>>2]>>2]|0;l=a+40|0;k=on(f[l>>2]|0,f[l+4>>2]|0,f[c>>2]|0,0)|0;l=a+48|0;q=Tn(k|0,I|0,f[l>>2]|0,f[l+4>>2]|0)|0;l=o+q|0;q=0;while(1){f[g+(q<<2)>>2]=~~+p[l>>3];q=q+1|0;o=b[m>>0]|0;if((q|0)>=((o<<24>>24>e<<24>>24?e:o)<<24>>24|0)){C=o;break}else l=l+8|0}}else C=t;l=C<<24>>24;if(C<<24>>24>=e<<24>>24){i=1;return i|0}hj(g+(l<<2)|0,0,(e<<24>>24)-l<<2|0)|0;i=1;return i|0}case 11:{l=a+24|0;q=b[l>>0]|0;if((q<<24>>24>e<<24>>24?e:q)<<24>>24>0){m=f[f[a>>2]>>2]|0;r=a+40|0;o=on(f[r>>2]|0,f[r+4>>2]|0,f[c>>2]|0,0)|0;r=a+48|0;k=Tn(o|0,I|0,f[r>>2]|0,f[r+4>>2]|0)|0;r=m+k|0;k=0;while(1){f[g+(k<<2)>>2]=h[r>>0];k=k+1|0;m=b[l>>0]|0;if((k|0)>=((m<<24>>24>e<<24>>24?e:m)<<24>>24|0)){D=m;break}else r=r+1|0}}else D=q;r=D<<24>>24;if(D<<24>>24>=e<<24>>24){i=1;return i|0}hj(g+(r<<2)|0,0,(e<<24>>24)-r<<2|0)|0;i=1;return i|0}default:{i=0;return i|0}}while(0);return 0}function Qb(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=Oa,J=0,K=0,L=0,M=0,N=Oa;e=u;u=u+48|0;g=e+36|0;h=e+24|0;i=e+12|0;j=e;if(!(ih(a,c,d)|0)){k=0;u=e;return k|0}l=f[(f[(f[c+4>>2]|0)+8>>2]|0)+(d<<2)>>2]|0;if((f[l+28>>2]|0)!=9){k=0;u=e;return k|0}m=c+48|0;c=f[m>>2]|0;o=dn(32)|0;f[g>>2]=o;f[g+8>>2]=-2147483616;f[g+4>>2]=17;p=o;q=12932;r=p+17|0;do{b[p>>0]=b[q>>0]|0;p=p+1|0;q=q+1|0}while((p|0)<(r|0));b[o+17>>0]=0;o=c+16|0;s=f[o>>2]|0;if(s){t=o;v=s;a:while(1){s=v;while(1){if((f[s+16>>2]|0)>=(d|0))break;w=f[s+4>>2]|0;if(!w){x=t;break a}else s=w}v=f[s>>2]|0;if(!v){x=s;break}else t=s}if(((x|0)!=(o|0)?(f[x+16>>2]|0)<=(d|0):0)?(o=x+20|0,(sh(o,g)|0)!=0):0)y=yk(o,g,-1)|0;else z=12}else z=12;if((z|0)==12)y=yk(c,g,-1)|0;if((b[g+11>>0]|0)<0)br(f[g>>2]|0);if((y|0)<1){k=0;u=e;return k|0}c=f[m>>2]|0;o=dn(32)|0;f[g>>2]=o;f[g+8>>2]=-2147483616;f[g+4>>2]=19;p=o;q=13005;r=p+19|0;do{b[p>>0]=b[q>>0]|0;p=p+1|0;q=q+1|0}while((p|0)<(r|0));b[o+19>>0]=0;o=c+16|0;x=f[o>>2]|0;if(x){t=o;v=x;b:while(1){x=v;while(1){if((f[x+16>>2]|0)>=(d|0))break;w=f[x+4>>2]|0;if(!w){A=t;break b}else x=w}v=f[x>>2]|0;if(!v){A=x;break}else t=x}if((A|0)!=(o|0)?(f[A+16>>2]|0)<=(d|0):0)B=A+20|0;else z=24}else z=24;if((z|0)==24)B=c;if(!(sh(B,g)|0))C=0;else{B=f[m>>2]|0;f[h>>2]=0;f[h+4>>2]=0;f[h+8>>2]=0;c=dn(32)|0;f[h>>2]=c;f[h+8>>2]=-2147483616;f[h+4>>2]=18;p=c;q=13025;r=p+18|0;do{b[p>>0]=b[q>>0]|0;p=p+1|0;q=q+1|0}while((p|0)<(r|0));b[c+18>>0]=0;c=B+16|0;A=f[c>>2]|0;if(A){o=c;t=A;c:while(1){A=t;while(1){if((f[A+16>>2]|0)>=(d|0))break;v=f[A+4>>2]|0;if(!v){D=o;break c}else A=v}t=f[A>>2]|0;if(!t){D=A;break}else o=A}if((D|0)!=(c|0)?(f[D+16>>2]|0)<=(d|0):0)E=D+20|0;else z=34}else z=34;if((z|0)==34)E=B;B=(sh(E,h)|0)!=0;if((b[h+11>>0]|0)<0)br(f[h>>2]|0);C=B}if((b[g+11>>0]|0)<0)br(f[g>>2]|0);if(!C){Kd(a+40|0,l,y)|0;k=1;u=e;return k|0}C=l+24|0;l=b[C>>0]|0;B=l<<24>>24;f[i>>2]=0;E=i+4|0;f[E>>2]=0;f[i+8>>2]=0;do if(l<<24>>24)if(l<<24>>24<0)mq(i);else{D=B<<2;c=dn(D)|0;f[i>>2]=c;o=c+(B<<2)|0;f[i+8>>2]=o;hj(c|0,0,D|0)|0;f[E>>2]=o;F=c;break}else F=0;while(0);B=f[m>>2]|0;f[j>>2]=0;f[j+4>>2]=0;f[j+8>>2]=0;l=dn(32)|0;f[j>>2]=l;f[j+8>>2]=-2147483616;f[j+4>>2]=19;p=l;q=13005;r=p+19|0;do{b[p>>0]=b[q>>0]|0;p=p+1|0;q=q+1|0}while((p|0)<(r|0));b[l+19>>0]=0;l=b[C>>0]|0;c=l<<24>>24;o=B+16|0;D=f[o>>2]|0;if(D){t=o;x=D;d:while(1){D=x;while(1){if((f[D+16>>2]|0)>=(d|0))break;v=f[D+4>>2]|0;if(!v){G=t;break d}else D=v}x=f[D>>2]|0;if(!x){G=D;break}else t=D}if(((G|0)!=(o|0)?(f[G+16>>2]|0)<=(d|0):0)?(o=G+20|0,(sh(o,j)|0)!=0):0){t=zg(o,j)|0;if((t|0)!=(G+24|0)){dj(g,t+28|0);t=g+11|0;G=b[t>>0]|0;o=G<<24>>24<0;if(!((o?f[g+4>>2]|0:G&255)|0))H=G;else{if(l<<24>>24>0){x=o?f[g>>2]|0:g;o=0;do{I=$(pq(x,h));A=x;x=f[h>>2]|0;if((A|0)==(x|0))break;n[F+(o<<2)>>2]=I;o=o+1|0}while((o|0)<(c|0));J=b[t>>0]|0}else J=G;H=J}if(H<<24>>24<0)br(f[g>>2]|0)}}else z=64}else z=64;if((z|0)==64?(H=zg(B,j)|0,(H|0)!=(B+4|0)):0){dj(g,H+28|0);H=g+11|0;B=b[H>>0]|0;J=B<<24>>24<0;if(!((J?f[g+4>>2]|0:B&255)|0))K=B;else{if(l<<24>>24>0){l=J?f[g>>2]|0:g;J=0;do{I=$(pq(l,h));G=l;l=f[h>>2]|0;if((G|0)==(l|0))break;n[F+(J<<2)>>2]=I;J=J+1|0}while((J|0)<(c|0));L=b[H>>0]|0}else L=B;K=L}if(K<<24>>24<0)br(f[g>>2]|0)}if((b[j+11>>0]|0)<0)br(f[j>>2]|0);j=f[m>>2]|0;f[g>>2]=0;f[g+4>>2]=0;f[g+8>>2]=0;m=dn(32)|0;f[g>>2]=m;f[g+8>>2]=-2147483616;f[g+4>>2]=18;p=m;q=13025;r=p+18|0;do{b[p>>0]=b[q>>0]|0;p=p+1|0;q=q+1|0}while((p|0)<(r|0));b[m+18>>0]=0;m=j+16|0;q=f[m>>2]|0;if(q){p=m;r=q;e:while(1){q=r;while(1){if((f[q+16>>2]|0)>=(d|0))break;K=f[q+4>>2]|0;if(!K){M=p;break e}else q=K}r=f[q>>2]|0;if(!r){M=q;break}else p=q}if(((M|0)!=(m|0)?(f[M+16>>2]|0)<=(d|0):0)?(d=M+20|0,(sh(d,g)|0)!=0):0)N=$(kk(d,g,$(1.0)));else z=86}else z=86;if((z|0)==86)N=$(kk(j,g,$(1.0)));if((b[g+11>>0]|0)<0)br(f[g>>2]|0);wl(a+40|0,y,f[i>>2]|0,b[C>>0]|0,N);C=f[i>>2]|0;if(C|0){i=f[E>>2]|0;if((i|0)!=(C|0))f[E>>2]=i+(~((i+-4-C|0)>>>2)<<2);br(C)}k=1;u=e;return k|0}function Rb(a,b,c,d,e,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0;e=u;u=u+64|0;d=e+48|0;h=e+36|0;i=e+24|0;j=e+16|0;k=e+8|0;l=e;m=e+32|0;n=a+60|0;f[a+68>>2]=g;g=a+108|0;lk(g);o=a+56|0;p=f[o>>2]|0;q=(f[p+4>>2]|0)-(f[p>>2]|0)|0;r=q>>2;f[h>>2]=0;f[h+4>>2]=0;f[h+8>>2]=0;s=i;f[s>>2]=0;f[s+4>>2]=0;s=j;f[s>>2]=0;f[s+4>>2]=0;s=k;f[s>>2]=0;f[s+4>>2]=0;s=l;f[s>>2]=0;f[s+4>>2]=0;if((q|0)<=0){u=e;return 1}q=h+4|0;s=h+8|0;t=a+104|0;v=i+4|0;w=a+100|0;x=j+4|0;y=a+8|0;z=a+16|0;A=a+32|0;B=a+12|0;C=a+28|0;D=a+20|0;E=a+24|0;F=a+96|0;a=k+4|0;G=l+4|0;H=f[p>>2]|0;if((f[p+4>>2]|0)==(H|0)){J=p;mq(J)}else{K=0;L=H}while(1){f[m>>2]=f[L+(K<<2)>>2];f[d>>2]=f[m>>2];fc(n,d,h);H=f[h>>2]|0;p=(H|0)>-1?H:0-H|0;M=f[q>>2]|0;N=(M|0)>-1?M:0-M|0;O=Tn(N|0,((N|0)<0)<<31>>31|0,p|0,((p|0)<0)<<31>>31|0)|0;p=f[s>>2]|0;N=(p|0)>-1;P=N?p:0-p|0;p=Tn(O|0,I|0,P|0,((P|0)<0)<<31>>31|0)|0;P=I;if((p|0)==0&(P|0)==0){O=f[t>>2]|0;Q=O;R=h;S=M;T=O}else{O=f[t>>2]|0;U=((O|0)<0)<<31>>31;V=on(O|0,U|0,H|0,((H|0)<0)<<31>>31|0)|0;H=zk(V|0,I|0,p|0,P|0)|0;f[h>>2]=H;V=on(O|0,U|0,M|0,((M|0)<0)<<31>>31|0)|0;M=zk(V|0,I|0,p|0,P|0)|0;f[q>>2]=M;P=O-((H|0)>-1?H:0-H|0)-((M|0)>-1?M:0-M|0)|0;Q=N?P:0-P|0;R=s;S=M;T=O}f[R>>2]=Q;O=f[h>>2]|0;do if((O|0)<=-1){if((S|0)<0){M=f[s>>2]|0;W=(M|0)>-1?M:0-M|0;X=M}else{M=f[s>>2]|0;W=(f[w>>2]|0)-((M|0)>-1?M:0-M|0)|0;X=M}if((X|0)<0){Y=(S|0)>-1?S:0-S|0;Z=W;_=X;break}else{Y=(f[w>>2]|0)-((S|0)>-1?S:0-S|0)|0;Z=W;_=X;break}}else{M=f[s>>2]|0;Y=M+T|0;Z=T+S|0;_=M}while(0);M=(Z|0)==0;P=(Y|0)==0;N=f[w>>2]|0;do if(Y|Z){H=(N|0)==(Y|0);if(!(M&H)){p=(N|0)==(Z|0);if(!(P&p)){if(M&(T|0)<(Y|0)){$=0;aa=(T<<1)-Y|0;break}if(p&(T|0)>(Y|0)){$=Z;aa=(T<<1)-Y|0;break}if(H&(T|0)>(Z|0)){$=(T<<1)-Z|0;aa=Y;break}if(P){$=(T|0)<(Z|0)?(T<<1)-Z|0:Z;aa=0}else{$=Z;aa=Y}}else{$=Z;aa=Z}}else{$=Y;aa=Y}}else{$=N;aa=N}while(0);f[i>>2]=$;f[v>>2]=aa;P=0-S|0;M=0-_|0;f[h>>2]=0-O;f[q>>2]=P;f[s>>2]=M;if((O|0)<1){ba=T-_|0;ca=T-S|0}else{H=(_|0)<1?M:_;M=(S|0)<1?P:S;ba=(_|0)>0?M:N-M|0;ca=(S|0)>0?H:N-H|0}H=(ca|0)==0;M=(ba|0)==0;do if(((ba|ca|0)!=0?(P=(N|0)==(ba|0),!(H&P)):0)?(p=(N|0)==(ca|0),!(M&p)):0){if(H&(T|0)<(ba|0)){da=0;ea=(T<<1)-ba|0;break}if(p&(T|0)>(ba|0)){da=N;ea=(T<<1)-ba|0;break}if(P&(T|0)>(ca|0)){da=(T<<1)-ca|0;ea=N;break}if(M){da=(T|0)<(ca|0)?(T<<1)-ca|0:ca;ea=0}else{da=ca;ea=ba}}else{da=N;ea=N}while(0);f[j>>2]=da;f[x>>2]=ea;N=K<<1;M=b+(N<<2)|0;H=f[y>>2]|0;if((H|0)>0){O=0;P=i;p=H;while(1){if((p|0)>0){H=0;do{V=f[P+(H<<2)>>2]|0;U=f[z>>2]|0;if((V|0)>(U|0)){fa=f[A>>2]|0;f[fa+(H<<2)>>2]=U;ga=fa}else{fa=f[B>>2]|0;U=f[A>>2]|0;f[U+(H<<2)>>2]=(V|0)<(fa|0)?fa:V;ga=U}H=H+1|0;U=f[y>>2]|0}while((H|0)<(U|0));ha=ga;ia=U}else{ha=f[A>>2]|0;ia=p}H=(f[M+(O<<2)>>2]|0)-(f[ha+(O<<2)>>2]|0)|0;U=k+(O<<2)|0;f[U>>2]=H;ja=f[C>>2]|0;if((H|0)>=(ja|0)){if((H|0)>(f[E>>2]|0)){ka=H-(f[D>>2]|0)|0;la=52}}else{ka=(f[D>>2]|0)+H|0;la=52}if((la|0)==52){la=0;f[U>>2]=ka}O=O+1|0;if((O|0)>=(ia|0))break;else{P=ha;p=ia}}if((ia|0)>0){p=0;P=j;O=ia;U=ja;while(1){if((O|0)>0){H=0;do{V=f[P+(H<<2)>>2]|0;fa=f[z>>2]|0;if((V|0)>(fa|0))f[ha+(H<<2)>>2]=fa;else{fa=f[B>>2]|0;f[ha+(H<<2)>>2]=(V|0)<(fa|0)?fa:V}H=H+1|0;ma=f[y>>2]|0}while((H|0)<(ma|0));na=f[C>>2]|0;oa=ma}else{na=U;oa=O}H=(f[M+(p<<2)>>2]|0)-(f[ha+(p<<2)>>2]|0)|0;V=l+(p<<2)|0;f[V>>2]=H;if((H|0)>=(na|0)){if((H|0)>(f[E>>2]|0)){pa=H-(f[D>>2]|0)|0;la=65}}else{pa=(f[D>>2]|0)+H|0;la=65}if((la|0)==65){la=0;f[V>>2]=pa}p=p+1|0;if((p|0)>=(oa|0))break;else{P=ha;O=oa;U=na}}}}U=f[k>>2]|0;O=f[t>>2]|0;if((O|0)>=(U|0))if((U|0)<(0-O|0))qa=(f[F>>2]|0)+U|0;else qa=U;else qa=U-(f[F>>2]|0)|0;f[k>>2]=qa;U=f[a>>2]|0;if((O|0)>=(U|0))if((U|0)<(0-O|0))ra=(f[F>>2]|0)+U|0;else ra=U;else ra=U-(f[F>>2]|0)|0;f[a>>2]=ra;U=f[l>>2]|0;if((O|0)>=(U|0))if((U|0)<(0-O|0))sa=(f[F>>2]|0)+U|0;else sa=U;else sa=U-(f[F>>2]|0)|0;f[l>>2]=sa;U=f[G>>2]|0;if((O|0)>=(U|0))if((U|0)<(0-O|0))ta=(f[F>>2]|0)+U|0;else ta=U;else ta=U-(f[F>>2]|0)|0;f[G>>2]=ta;if((((ra|0)>-1?ra:0-ra|0)+((qa|0)>-1?qa:0-qa|0)|0)<(((sa|0)>-1?sa:0-sa|0)+((ta|0)>-1?ta:0-ta|0)|0)){Vi(g,0);ua=k}else{Vi(g,1);ua=l}U=f[ua>>2]|0;if((U|0)<0)va=(f[F>>2]|0)+U|0;else va=U;U=c+(N<<2)|0;f[U>>2]=va;O=f[ua+4>>2]|0;if((O|0)<0)wa=(f[F>>2]|0)+O|0;else wa=O;f[U+4>>2]=wa;K=K+1|0;if((K|0)>=(r|0)){la=3;break}U=f[o>>2]|0;L=f[U>>2]|0;if((f[U+4>>2]|0)-L>>2>>>0<=K>>>0){J=U;la=4;break}}if((la|0)==3){u=e;return 1}else if((la|0)==4)mq(J);return 0}function Sb(a,b,c,d,e,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0;e=u;u=u+64|0;d=e+48|0;h=e+36|0;i=e+24|0;j=e+16|0;k=e+8|0;l=e;m=e+32|0;n=a+60|0;f[a+68>>2]=g;g=a+108|0;lk(g);o=a+56|0;p=f[o>>2]|0;q=(f[p+4>>2]|0)-(f[p>>2]|0)|0;r=q>>2;f[h>>2]=0;f[h+4>>2]=0;f[h+8>>2]=0;s=i;f[s>>2]=0;f[s+4>>2]=0;s=j;f[s>>2]=0;f[s+4>>2]=0;s=k;f[s>>2]=0;f[s+4>>2]=0;s=l;f[s>>2]=0;f[s+4>>2]=0;if((q|0)<=0){u=e;return 1}q=h+4|0;s=h+8|0;t=a+104|0;v=i+4|0;w=a+100|0;x=j+4|0;y=a+8|0;z=a+16|0;A=a+32|0;B=a+12|0;C=a+28|0;D=a+20|0;E=a+24|0;F=a+96|0;a=k+4|0;G=l+4|0;H=f[p>>2]|0;if((f[p+4>>2]|0)==(H|0)){J=p;mq(J)}else{K=0;L=H}while(1){f[m>>2]=f[L+(K<<2)>>2];f[d>>2]=f[m>>2];$b(n,d,h);H=f[h>>2]|0;p=(H|0)>-1?H:0-H|0;M=f[q>>2]|0;N=(M|0)>-1?M:0-M|0;O=Tn(N|0,((N|0)<0)<<31>>31|0,p|0,((p|0)<0)<<31>>31|0)|0;p=f[s>>2]|0;N=(p|0)>-1;P=N?p:0-p|0;p=Tn(O|0,I|0,P|0,((P|0)<0)<<31>>31|0)|0;P=I;if((p|0)==0&(P|0)==0){O=f[t>>2]|0;Q=O;R=h;S=M;T=O}else{O=f[t>>2]|0;U=((O|0)<0)<<31>>31;V=on(O|0,U|0,H|0,((H|0)<0)<<31>>31|0)|0;H=zk(V|0,I|0,p|0,P|0)|0;f[h>>2]=H;V=on(O|0,U|0,M|0,((M|0)<0)<<31>>31|0)|0;M=zk(V|0,I|0,p|0,P|0)|0;f[q>>2]=M;P=O-((H|0)>-1?H:0-H|0)-((M|0)>-1?M:0-M|0)|0;Q=N?P:0-P|0;R=s;S=M;T=O}f[R>>2]=Q;O=f[h>>2]|0;do if((O|0)<=-1){if((S|0)<0){M=f[s>>2]|0;W=(M|0)>-1?M:0-M|0;X=M}else{M=f[s>>2]|0;W=(f[w>>2]|0)-((M|0)>-1?M:0-M|0)|0;X=M}if((X|0)<0){Y=(S|0)>-1?S:0-S|0;Z=W;_=X;break}else{Y=(f[w>>2]|0)-((S|0)>-1?S:0-S|0)|0;Z=W;_=X;break}}else{M=f[s>>2]|0;Y=M+T|0;Z=T+S|0;_=M}while(0);M=(Z|0)==0;P=(Y|0)==0;N=f[w>>2]|0;do if(Y|Z){H=(N|0)==(Y|0);if(!(M&H)){p=(N|0)==(Z|0);if(!(P&p)){if(M&(T|0)<(Y|0)){$=0;aa=(T<<1)-Y|0;break}if(p&(T|0)>(Y|0)){$=Z;aa=(T<<1)-Y|0;break}if(H&(T|0)>(Z|0)){$=(T<<1)-Z|0;aa=Y;break}if(P){$=(T|0)<(Z|0)?(T<<1)-Z|0:Z;aa=0}else{$=Z;aa=Y}}else{$=Z;aa=Z}}else{$=Y;aa=Y}}else{$=N;aa=N}while(0);f[i>>2]=$;f[v>>2]=aa;P=0-S|0;M=0-_|0;f[h>>2]=0-O;f[q>>2]=P;f[s>>2]=M;if((O|0)<1){ba=T-_|0;ca=T-S|0}else{H=(_|0)<1?M:_;M=(S|0)<1?P:S;ba=(_|0)>0?M:N-M|0;ca=(S|0)>0?H:N-H|0}H=(ca|0)==0;M=(ba|0)==0;do if(((ba|ca|0)!=0?(P=(N|0)==(ba|0),!(H&P)):0)?(p=(N|0)==(ca|0),!(M&p)):0){if(H&(T|0)<(ba|0)){da=0;ea=(T<<1)-ba|0;break}if(p&(T|0)>(ba|0)){da=N;ea=(T<<1)-ba|0;break}if(P&(T|0)>(ca|0)){da=(T<<1)-ca|0;ea=N;break}if(M){da=(T|0)<(ca|0)?(T<<1)-ca|0:ca;ea=0}else{da=ca;ea=ba}}else{da=N;ea=N}while(0);f[j>>2]=da;f[x>>2]=ea;N=K<<1;M=b+(N<<2)|0;H=f[y>>2]|0;if((H|0)>0){O=0;P=i;p=H;while(1){if((p|0)>0){H=0;do{V=f[P+(H<<2)>>2]|0;U=f[z>>2]|0;if((V|0)>(U|0)){fa=f[A>>2]|0;f[fa+(H<<2)>>2]=U;ga=fa}else{fa=f[B>>2]|0;U=f[A>>2]|0;f[U+(H<<2)>>2]=(V|0)<(fa|0)?fa:V;ga=U}H=H+1|0;U=f[y>>2]|0}while((H|0)<(U|0));ha=ga;ia=U}else{ha=f[A>>2]|0;ia=p}H=(f[M+(O<<2)>>2]|0)-(f[ha+(O<<2)>>2]|0)|0;U=k+(O<<2)|0;f[U>>2]=H;ja=f[C>>2]|0;if((H|0)>=(ja|0)){if((H|0)>(f[E>>2]|0)){ka=H-(f[D>>2]|0)|0;la=52}}else{ka=(f[D>>2]|0)+H|0;la=52}if((la|0)==52){la=0;f[U>>2]=ka}O=O+1|0;if((O|0)>=(ia|0))break;else{P=ha;p=ia}}if((ia|0)>0){p=0;P=j;O=ia;U=ja;while(1){if((O|0)>0){H=0;do{V=f[P+(H<<2)>>2]|0;fa=f[z>>2]|0;if((V|0)>(fa|0))f[ha+(H<<2)>>2]=fa;else{fa=f[B>>2]|0;f[ha+(H<<2)>>2]=(V|0)<(fa|0)?fa:V}H=H+1|0;ma=f[y>>2]|0}while((H|0)<(ma|0));na=f[C>>2]|0;oa=ma}else{na=U;oa=O}H=(f[M+(p<<2)>>2]|0)-(f[ha+(p<<2)>>2]|0)|0;V=l+(p<<2)|0;f[V>>2]=H;if((H|0)>=(na|0)){if((H|0)>(f[E>>2]|0)){pa=H-(f[D>>2]|0)|0;la=65}}else{pa=(f[D>>2]|0)+H|0;la=65}if((la|0)==65){la=0;f[V>>2]=pa}p=p+1|0;if((p|0)>=(oa|0))break;else{P=ha;O=oa;U=na}}}}U=f[k>>2]|0;O=f[t>>2]|0;if((O|0)>=(U|0))if((U|0)<(0-O|0))qa=(f[F>>2]|0)+U|0;else qa=U;else qa=U-(f[F>>2]|0)|0;f[k>>2]=qa;U=f[a>>2]|0;if((O|0)>=(U|0))if((U|0)<(0-O|0))ra=(f[F>>2]|0)+U|0;else ra=U;else ra=U-(f[F>>2]|0)|0;f[a>>2]=ra;U=f[l>>2]|0;if((O|0)>=(U|0))if((U|0)<(0-O|0))sa=(f[F>>2]|0)+U|0;else sa=U;else sa=U-(f[F>>2]|0)|0;f[l>>2]=sa;U=f[G>>2]|0;if((O|0)>=(U|0))if((U|0)<(0-O|0))ta=(f[F>>2]|0)+U|0;else ta=U;else ta=U-(f[F>>2]|0)|0;f[G>>2]=ta;if((((ra|0)>-1?ra:0-ra|0)+((qa|0)>-1?qa:0-qa|0)|0)<(((sa|0)>-1?sa:0-sa|0)+((ta|0)>-1?ta:0-ta|0)|0)){Vi(g,0);ua=k}else{Vi(g,1);ua=l}U=f[ua>>2]|0;if((U|0)<0)va=(f[F>>2]|0)+U|0;else va=U;U=c+(N<<2)|0;f[U>>2]=va;O=f[ua+4>>2]|0;if((O|0)<0)wa=(f[F>>2]|0)+O|0;else wa=O;f[U+4>>2]=wa;K=K+1|0;if((K|0)>=(r|0)){la=3;break}U=f[o>>2]|0;L=f[U>>2]|0;if((f[U+4>>2]|0)-L>>2>>>0<=K>>>0){J=U;la=4;break}}if((la|0)==3){u=e;return 1}else if((la|0)==4)mq(J);return 0}function Tb(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0;c=u;u=u+16|0;d=c+8|0;e=c;g=f[b>>2]|0;if((g|0)==-1){h=1;u=c;return h|0}i=(g>>>0)/3|0;j=a+24|0;if(f[(f[j>>2]|0)+(i>>>5<<2)>>2]&1<<(i&31)|0){h=1;u=c;return h|0}i=a+48|0;k=f[i>>2]|0;l=a+52|0;m=f[l>>2]|0;if((m|0)==(k|0))n=k;else{o=m+(~((m+-4-k|0)>>>2)<<2)|0;f[l>>2]=o;n=o}o=a+56|0;if((n|0)==(f[o>>2]|0))Ci(i,b);else{f[n>>2]=g;f[l>>2]=n+4}n=a+4|0;g=f[n>>2]|0;k=f[b>>2]|0;m=k+1|0;do if((k|0)!=-1){p=f[g+28>>2]|0;q=f[p+((((m>>>0)%3|0|0)==0?k+-2|0:m)<<2)>>2]|0;if(!((k>>>0)%3|0)){r=q;s=k+2|0;t=p;break}else{r=q;s=k+-1|0;t=p;break}}else{p=f[g+28>>2]|0;r=f[p+-4>>2]|0;s=-1;t=p}while(0);g=f[t+(s<<2)>>2]|0;if((r|0)==-1|(g|0)==-1){h=0;u=c;return h|0}s=a+36|0;t=f[s>>2]|0;k=t+(r>>>5<<2)|0;m=1<<(r&31);p=f[k>>2]|0;if(!(p&m)){f[k>>2]=p|m;m=f[b>>2]|0;p=m+1|0;if((m|0)==-1)v=-1;else v=((p>>>0)%3|0|0)==0?m+-2|0:p;f[e>>2]=v;p=f[(f[(f[a+16>>2]|0)+96>>2]|0)+(((v>>>0)/3|0)*12|0)+(((v>>>0)%3|0)<<2)>>2]|0;v=f[a+20>>2]|0;f[d>>2]=p;m=f[v+4>>2]|0;v=m+4|0;k=f[v>>2]|0;if((k|0)==(f[m+8>>2]|0))Ci(m,d);else{f[k>>2]=p;f[v>>2]=k+4}k=a+12|0;v=f[k>>2]|0;p=v+4|0;m=f[p>>2]|0;if((m|0)==(f[v+8>>2]|0)){Ci(v,e);w=f[k>>2]|0}else{f[m>>2]=f[e>>2];f[p>>2]=m+4;w=v}v=w+24|0;f[(f[w+12>>2]|0)+(r<<2)>>2]=f[v>>2];f[v>>2]=(f[v>>2]|0)+1;x=f[s>>2]|0}else x=t;t=x+(g>>>5<<2)|0;x=1<<(g&31);v=f[t>>2]|0;if(!(v&x)){f[t>>2]=v|x;x=f[b>>2]|0;do if((x|0)!=-1)if(!((x>>>0)%3|0)){y=x+2|0;break}else{y=x+-1|0;break}else y=-1;while(0);f[e>>2]=y;x=f[(f[(f[a+16>>2]|0)+96>>2]|0)+(((y>>>0)/3|0)*12|0)+(((y>>>0)%3|0)<<2)>>2]|0;y=f[a+20>>2]|0;f[d>>2]=x;v=f[y+4>>2]|0;y=v+4|0;t=f[y>>2]|0;if((t|0)==(f[v+8>>2]|0))Ci(v,d);else{f[t>>2]=x;f[y>>2]=t+4}t=a+12|0;y=f[t>>2]|0;x=y+4|0;v=f[x>>2]|0;if((v|0)==(f[y+8>>2]|0)){Ci(y,e);z=f[t>>2]|0}else{f[v>>2]=f[e>>2];f[x>>2]=v+4;z=y}y=z+24|0;f[(f[z+12>>2]|0)+(g<<2)>>2]=f[y>>2];f[y>>2]=(f[y>>2]|0)+1}y=f[i>>2]|0;g=f[l>>2]|0;if((y|0)==(g|0)){h=1;u=c;return h|0}z=a+16|0;v=a+20|0;x=a+12|0;a=g;g=y;a:while(1){y=f[a+-4>>2]|0;f[b>>2]=y;t=(y>>>0)/3|0;if((y|0)!=-1?(y=(f[j>>2]|0)+(t>>>5<<2)|0,r=1<<(t&31),t=f[y>>2]|0,(t&r|0)==0):0){f[y>>2]=t|r;r=f[n>>2]|0;t=f[b>>2]|0;y=f[(f[r+28>>2]|0)+(t<<2)>>2]|0;if((y|0)==-1){h=0;A=79;break}else{B=y;C=r;D=t}b:while(1){t=(f[s>>2]|0)+(B>>>5<<2)|0;r=1<<(B&31);y=f[t>>2]|0;do if(!(y&r)){w=f[(f[C+40>>2]|0)+(B<<2)>>2]|0;if((w|0)==-1)E=1;else{m=f[(f[f[C+64>>2]>>2]|0)+(w<<2)>>2]|0;E=(1<<(m&31)&f[(f[C+12>>2]|0)+(m>>>5<<2)>>2]|0)!=0}f[t>>2]=y|r;m=f[b>>2]|0;f[e>>2]=m;w=f[(f[(f[z>>2]|0)+96>>2]|0)+(((m>>>0)/3|0)*12|0)+(((m>>>0)%3|0)<<2)>>2]|0;m=f[v>>2]|0;f[d>>2]=w;p=f[m+4>>2]|0;m=p+4|0;k=f[m>>2]|0;if((k|0)==(f[p+8>>2]|0))Ci(p,d);else{f[k>>2]=w;f[m>>2]=k+4}k=f[x>>2]|0;m=k+4|0;w=f[m>>2]|0;if((w|0)==(f[k+8>>2]|0)){Ci(k,e);F=f[x>>2]|0}else{f[w>>2]=f[e>>2];f[m>>2]=w+4;F=k}k=F+24|0;f[(f[F+12>>2]|0)+(B<<2)>>2]=f[k>>2];f[k>>2]=(f[k>>2]|0)+1;k=f[n>>2]|0;w=f[b>>2]|0;if(E){G=w;H=k;A=59;break}m=w+1|0;do if((w|0)==-1)I=-1;else{p=((m>>>0)%3|0|0)==0?w+-2|0:m;if((p|0)==-1){I=-1;break}if(f[(f[k>>2]|0)+(p>>>5<<2)>>2]&1<<(p&31)|0){I=-1;break}I=f[(f[(f[k+64>>2]|0)+12>>2]|0)+(p<<2)>>2]|0}while(0);f[b>>2]=I;J=(I>>>0)/3|0;K=k}else{G=D;H=C;A=59}while(0);if((A|0)==59){A=0;r=G+1|0;if((G|0)==-1){A=60;break}y=((r>>>0)%3|0|0)==0?G+-2|0:r;do if((y|0)==-1)L=-1;else{if(f[(f[H>>2]|0)+(y>>>5<<2)>>2]&1<<(y&31)|0){L=-1;break}L=f[(f[(f[H+64>>2]|0)+12>>2]|0)+(y<<2)>>2]|0}while(0);f[d>>2]=L;y=(((G>>>0)%3|0|0)==0?2:-1)+G|0;do if((y|0)==-1)M=-1;else{if(f[(f[H>>2]|0)+(y>>>5<<2)>>2]&1<<(y&31)|0){M=-1;break}M=f[(f[(f[H+64>>2]|0)+12>>2]|0)+(y<<2)>>2]|0}while(0);y=(L|0)==-1;r=(L>>>0)/3|0;t=y?-1:r;m=(M|0)==-1;w=(M>>>0)/3|0;p=m?-1:w;do if(!y){q=f[j>>2]|0;if(f[q+(t>>>5<<2)>>2]&1<<(t&31)|0){A=69;break}if(m){N=L;O=r;break}if(!(f[q+(p>>>5<<2)>>2]&1<<(p&31))){A=74;break b}else{N=L;O=r}}else A=69;while(0);if((A|0)==69){A=0;if(m){A=71;break}if(!(f[(f[j>>2]|0)+(p>>>5<<2)>>2]&1<<(p&31))){N=M;O=w}else{A=71;break}}f[b>>2]=N;J=O;K=H}r=(f[j>>2]|0)+(J>>>5<<2)|0;f[r>>2]=f[r>>2]|1<<(J&31);D=f[b>>2]|0;B=f[(f[K+28>>2]|0)+(D<<2)>>2]|0;if((B|0)==-1){h=0;A=79;break a}else C=K}do if((A|0)==60){A=0;f[d>>2]=-1;A=71}else if((A|0)==74){A=0;r=f[l>>2]|0;f[r+-4>>2]=M;if((r|0)==(f[o>>2]|0)){Ci(i,d);P=f[l>>2]|0;break}else{f[r>>2]=f[d>>2];t=r+4|0;f[l>>2]=t;P=t;break}}while(0);if((A|0)==71){A=0;t=(f[l>>2]|0)+-4|0;f[l>>2]=t;P=t}Q=f[i>>2]|0;R=P}else{t=a+-4|0;f[l>>2]=t;Q=g;R=t}if((Q|0)==(R|0)){h=1;A=79;break}else{a=R;g=Q}}if((A|0)==79){u=c;return h|0}return 0}function Ub(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,i=0,j=0,k=0,l=0,m=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=Oa,V=Oa,Y=Oa,Z=0,_=0,aa=0,ba=0;d=u;u=u+16|0;e=d;g=a+16|0;f[a>>2]=0;f[a+4>>2]=0;f[a+8>>2]=0;f[a+12>>2]=0;n[g>>2]=$(1.0);i=a+20|0;f[i>>2]=0;f[i+4>>2]=0;f[i+8>>2]=0;f[i+12>>2]=0;n[a+36>>2]=$(1.0);j=f[c+8>>2]|0;a:do if(j|0){k=a+4|0;l=a+12|0;m=a+8|0;o=j;p=j;while(1){q=o+8|0;r=b[q+11>>0]|0;s=r<<24>>24<0;t=s?f[q>>2]|0:q;v=s?f[o+12>>2]|0:r&255;if(v>>>0>3){r=t;s=v;w=v;while(1){x=X(h[r>>0]|h[r+1>>0]<<8|h[r+2>>0]<<16|h[r+3>>0]<<24,1540483477)|0;s=(X(x>>>24^x,1540483477)|0)^(X(s,1540483477)|0);w=w+-4|0;if(w>>>0<=3)break;else r=r+4|0}r=v+-4|0;w=r&-4;y=r-w|0;z=t+(w+4)|0;A=s}else{y=v;z=t;A=v}switch(y|0){case 3:{B=h[z+2>>0]<<16^A;C=8;break}case 2:{B=A;C=8;break}case 1:{D=A;C=9;break}default:E=A}if((C|0)==8){C=0;D=h[z+1>>0]<<8^B;C=9}if((C|0)==9){C=0;E=X(D^h[z>>0],1540483477)|0}w=X(E>>>13^E,1540483477)|0;r=w>>>15^w;w=f[k>>2]|0;x=(w|0)==0;b:do if(!x){F=w+-1|0;G=(F&w|0)==0;if(!G)if(r>>>0<w>>>0)H=r;else H=(r>>>0)%(w>>>0)|0;else H=r&F;I=f[(f[a>>2]|0)+(H<<2)>>2]|0;if((I|0)!=0?(J=f[I>>2]|0,(J|0)!=0):0){I=(v|0)==0;if(G){if(I){G=J;while(1){K=f[G+4>>2]|0;if(!((K|0)==(r|0)|(K&F|0)==(H|0))){L=H;C=50;break b}K=b[G+8+11>>0]|0;if(!((K<<24>>24<0?f[G+12>>2]|0:K&255)|0))break b;G=f[G>>2]|0;if(!G){L=H;C=50;break b}}}else M=J;while(1){G=f[M+4>>2]|0;if(!((G|0)==(r|0)|(G&F|0)==(H|0))){L=H;C=50;break b}G=M+8|0;K=b[G+11>>0]|0;N=K<<24>>24<0;O=K&255;do if(((N?f[M+12>>2]|0:O)|0)==(v|0)){K=f[G>>2]|0;if(N)if(!(Pk(K,t,v)|0))break b;else break;if((b[t>>0]|0)==(K&255)<<24>>24){K=G;P=O;Q=t;do{P=P+-1|0;K=K+1|0;if(!P)break b;Q=Q+1|0}while((b[K>>0]|0)==(b[Q>>0]|0))}}while(0);M=f[M>>2]|0;if(!M){L=H;C=50;break b}}}if(I){F=J;while(1){O=f[F+4>>2]|0;if((O|0)!=(r|0)){if(O>>>0<w>>>0)R=O;else R=(O>>>0)%(w>>>0)|0;if((R|0)!=(H|0)){L=H;C=50;break b}}O=b[F+8+11>>0]|0;if(!((O<<24>>24<0?f[F+12>>2]|0:O&255)|0))break b;F=f[F>>2]|0;if(!F){L=H;C=50;break b}}}else S=J;while(1){F=f[S+4>>2]|0;if((F|0)!=(r|0)){if(F>>>0<w>>>0)T=F;else T=(F>>>0)%(w>>>0)|0;if((T|0)!=(H|0)){L=H;C=50;break b}}F=S+8|0;I=b[F+11>>0]|0;O=I<<24>>24<0;G=I&255;do if(((O?f[S+12>>2]|0:G)|0)==(v|0)){I=f[F>>2]|0;if(O)if(!(Pk(I,t,v)|0))break b;else break;if((b[t>>0]|0)==(I&255)<<24>>24){I=F;N=G;Q=t;do{N=N+-1|0;I=I+1|0;if(!N)break b;Q=Q+1|0}while((b[I>>0]|0)==(b[Q>>0]|0))}}while(0);S=f[S>>2]|0;if(!S){L=H;C=50;break}}}else{L=H;C=50}}else{L=0;C=50}while(0);if((C|0)==50){C=0;pi(e,a,r,q);U=$(((f[l>>2]|0)+1|0)>>>0);V=$(w>>>0);Y=$(n[g>>2]);do if(x|$(Y*V)<U){t=w<<1|(w>>>0<3|(w+-1&w|0)!=0)&1;v=~~$(W($(U/Y)))>>>0;Ph(a,t>>>0<v>>>0?v:t);t=f[k>>2]|0;v=t+-1|0;if(!(v&t)){Z=t;_=v&r;break}if(r>>>0<t>>>0){Z=t;_=r}else{Z=t;_=(r>>>0)%(t>>>0)|0}}else{Z=w;_=L}while(0);w=f[(f[a>>2]|0)+(_<<2)>>2]|0;if(!w){f[f[e>>2]>>2]=f[m>>2];f[m>>2]=f[e>>2];f[(f[a>>2]|0)+(_<<2)>>2]=m;r=f[e>>2]|0;x=f[r>>2]|0;if(x|0){q=f[x+4>>2]|0;x=Z+-1|0;if(x&Z)if(q>>>0<Z>>>0)aa=q;else aa=(q>>>0)%(Z>>>0)|0;else aa=q&x;f[(f[a>>2]|0)+(aa<<2)>>2]=r}}else{f[f[e>>2]>>2]=f[w>>2];f[w>>2]=f[e>>2]}f[l>>2]=(f[l>>2]|0)+1}w=f[p>>2]|0;if(!w)break a;else{o=w;p=w}}}while(0);e=f[c+28>>2]|0;if(!e){u=d;return}else ba=e;do{e=ba;c=dn(40)|0;Ub(c,f[e+20>>2]|0);aa=xc(i,e+8|0)|0;e=f[aa>>2]|0;f[aa>>2]=c;if(e|0){c=f[e+28>>2]|0;if(c|0){aa=c;do{c=aa;aa=f[aa>>2]|0;bi(c+8|0);br(c)}while((aa|0)!=0)}aa=e+20|0;c=f[aa>>2]|0;f[aa>>2]=0;if(c|0)br(c);c=f[e+8>>2]|0;if(c|0){aa=c;do{c=aa;aa=f[aa>>2]|0;a=c+8|0;Z=f[c+20>>2]|0;if(Z|0){_=c+24|0;if((f[_>>2]|0)!=(Z|0))f[_>>2]=Z;br(Z)}if((b[a+11>>0]|0)<0)br(f[a>>2]|0);br(c)}while((aa|0)!=0)}aa=f[e>>2]|0;f[e>>2]=0;if(aa|0)br(aa);br(e)}ba=f[ba>>2]|0}while((ba|0)!=0);u=d;return}function Vb(a,c,e){a=a|0;c=c|0;e=e|0;var g=0,i=0,j=0,k=0,l=0,m=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,X=0,Y=0,Z=0,_=0,aa=0,ba=0,ca=0,da=0,ea=Oa,fa=Oa,ga=Oa,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0;g=u;u=u+48|0;i=g+16|0;j=g+12|0;k=g;l=i+16|0;f[i>>2]=0;f[i+4>>2]=0;f[i+8>>2]=0;f[i+12>>2]=0;n[l>>2]=$(1.0);m=a+80|0;o=f[m>>2]|0;f[k>>2]=0;p=k+4|0;f[p>>2]=0;f[k+8>>2]=0;if(o){if(o>>>0>1073741823)mq(k);q=o<<2;r=dn(q)|0;f[k>>2]=r;s=r+(o<<2)|0;f[k+8>>2]=s;hj(r|0,0,q|0)|0;f[p>>2]=s;s=c+48|0;q=c+40|0;o=i+4|0;t=i+12|0;v=i+8|0;w=a+40|0;x=a+64|0;y=f[e>>2]|0;e=r;z=0;A=0;B=r;C=r;D=0;E=r;while(1){r=s;F=f[r>>2]|0;G=f[r+4>>2]|0;r=q;H=on(f[r>>2]|0,f[r+4>>2]|0,y+z|0,0)|0;r=Tn(H|0,I|0,F|0,G|0)|0;G=(f[f[c>>2]>>2]|0)+r|0;r=h[G>>0]|h[G+1>>0]<<8|h[G+2>>0]<<16|h[G+3>>0]<<24;f[j>>2]=r;G=r&65535;F=r>>>16;H=F&65535;J=(r&65535^318)+239^F;F=(D|0)==0;a:do if(!F){K=D+-1|0;L=(K&D|0)==0;if(!L)if(J>>>0<D>>>0)M=J;else M=(J>>>0)%(D>>>0)|0;else M=J&K;N=f[(f[i>>2]|0)+(M<<2)>>2]|0;do if(N|0?(O=f[N>>2]|0,O|0):0){b:do if(L){P=O;while(1){Q=f[P+4>>2]|0;R=(Q|0)==(J|0);if(!(R|(Q&K|0)==(M|0))){S=27;break b}if((R?(R=P+8|0,(d[R>>1]|0)==G<<16>>16):0)?(d[R+2>>1]|0)==H<<16>>16:0){T=P;S=26;break b}P=f[P>>2]|0;if(!P){S=27;break}}}else{P=O;while(1){R=f[P+4>>2]|0;if((R|0)==(J|0)){Q=P+8|0;if((d[Q>>1]|0)==G<<16>>16?(d[Q+2>>1]|0)==H<<16>>16:0){T=P;S=26;break b}}else{if(R>>>0<D>>>0)U=R;else U=(R>>>0)%(D>>>0)|0;if((U|0)!=(M|0)){S=27;break b}}P=f[P>>2]|0;if(!P){S=27;break}}}while(0);if((S|0)==26){S=0;f[E+(z<<2)>>2]=f[T+12>>2];V=e;X=A;Y=C;Z=B;_=E;break a}else if((S|0)==27){S=0;if(F){aa=0;S=46;break a}else break}}while(0);K=D+-1|0;L=(K&D|0)==0;if(!L)if(J>>>0<D>>>0)ba=J;else ba=(J>>>0)%(D>>>0)|0;else ba=K&J;N=f[(f[i>>2]|0)+(ba<<2)>>2]|0;if((N|0)!=0?(O=f[N>>2]|0,(O|0)!=0):0){if(L){L=O;while(1){N=f[L+4>>2]|0;if(!((N|0)==(J|0)|(N&K|0)==(ba|0))){aa=ba;S=46;break a}N=L+8|0;if((d[N>>1]|0)==G<<16>>16?(d[N+2>>1]|0)==H<<16>>16:0){S=61;break a}L=f[L>>2]|0;if(!L){aa=ba;S=46;break a}}}else ca=O;while(1){L=f[ca+4>>2]|0;if((L|0)!=(J|0)){if(L>>>0<D>>>0)da=L;else da=(L>>>0)%(D>>>0)|0;if((da|0)!=(ba|0)){aa=ba;S=46;break a}}L=ca+8|0;if((d[L>>1]|0)==G<<16>>16?(d[L+2>>1]|0)==H<<16>>16:0){S=61;break a}ca=f[ca>>2]|0;if(!ca){aa=ba;S=46;break}}}else{aa=ba;S=46}}else{aa=0;S=46}while(0);if((S|0)==46){S=0;H=dn(16)|0;G=H+8|0;d[G>>1]=r;d[G+2>>1]=r>>>16;f[H+12>>2]=A;f[H+4>>2]=J;f[H>>2]=0;ea=$(((f[t>>2]|0)+1|0)>>>0);fa=$(D>>>0);ga=$(n[l>>2]);do if(F|$(ga*fa)<ea){G=D<<1|(D>>>0<3|(D+-1&D|0)!=0)&1;O=~~$(W($(ea/ga)))>>>0;Eh(i,G>>>0<O>>>0?O:G);G=f[o>>2]|0;O=G+-1|0;if(!(O&G)){ha=G;ia=O&J;break}if(J>>>0<G>>>0){ha=G;ia=J}else{ha=G;ia=(J>>>0)%(G>>>0)|0}}else{ha=D;ia=aa}while(0);J=(f[i>>2]|0)+(ia<<2)|0;F=f[J>>2]|0;if(!F){f[H>>2]=f[v>>2];f[v>>2]=H;f[J>>2]=v;J=f[H>>2]|0;if(J|0){r=f[J+4>>2]|0;J=ha+-1|0;if(J&ha)if(r>>>0<ha>>>0)ja=r;else ja=(r>>>0)%(ha>>>0)|0;else ja=r&J;ka=(f[i>>2]|0)+(ja<<2)|0;S=59}}else{f[H>>2]=f[F>>2];ka=F;S=59}if((S|0)==59){S=0;f[ka>>2]=H}f[t>>2]=(f[t>>2]|0)+1;S=61}if((S|0)==61){S=0;F=w;J=f[F>>2]|0;r=on(J|0,f[F+4>>2]|0,A|0,0)|0;Rg((f[f[x>>2]>>2]|0)+r|0,j|0,J|0)|0;J=f[k>>2]|0;f[J+(z<<2)>>2]=A;V=J;X=A+1|0;Y=J;Z=J;_=J}J=z+1|0;la=f[m>>2]|0;if(J>>>0>=la>>>0)break;e=V;z=J;A=X;B=Z;C=Y;D=f[o>>2]|0;E=_}if((X|0)==(la|0))ma=Z;else{Z=a+84|0;if(!(b[Z>>0]|0)){_=f[a+72>>2]|0;E=f[a+68>>2]|0;o=E;if((_|0)==(E|0))na=V;else{D=_-E>>2;E=0;do{_=o+(E<<2)|0;f[_>>2]=f[Y+(f[_>>2]<<2)>>2];E=E+1|0}while(E>>>0<D>>>0);na=V}}else{b[Z>>0]=0;Z=a+68|0;V=a+72|0;D=f[V>>2]|0;E=f[Z>>2]|0;Y=D-E>>2;o=E;E=D;if(la>>>0<=Y>>>0)if(la>>>0<Y>>>0?(D=o+(la<<2)|0,(D|0)!=(E|0)):0){f[V>>2]=E+(~((E+-4-D|0)>>>2)<<2);oa=la}else oa=la;else{kh(Z,la-Y|0,1204);oa=f[m>>2]|0}Y=f[k>>2]|0;if(!oa)na=Y;else{k=f[a+68>>2]|0;a=0;do{f[k+(a<<2)>>2]=f[Y+(a<<2)>>2];a=a+1|0}while(a>>>0<oa>>>0);na=Y}}f[m>>2]=X;ma=na}if(!ma)pa=X;else{na=f[p>>2]|0;if((na|0)!=(ma|0))f[p>>2]=na+(~((na+-4-ma|0)>>>2)<<2);br(ma);pa=X}}else pa=0;X=f[i+8>>2]|0;if(X|0){ma=X;do{X=ma;ma=f[ma>>2]|0;br(X)}while((ma|0)!=0)}ma=f[i>>2]|0;f[i>>2]=0;if(!ma){u=g;return pa|0}br(ma);u=g;return pa|0}function Wb(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0;c=u;u=u+16|0;d=c+8|0;e=c;g=f[b>>2]|0;if((g|0)==-1){h=1;u=c;return h|0}i=(g>>>0)/3|0;j=a+24|0;if(f[(f[j>>2]|0)+(i>>>5<<2)>>2]&1<<(i&31)|0){h=1;u=c;return h|0}i=a+48|0;k=f[i>>2]|0;l=a+52|0;m=f[l>>2]|0;if((m|0)==(k|0))n=k;else{o=m+(~((m+-4-k|0)>>>2)<<2)|0;f[l>>2]=o;n=o}o=a+56|0;if((n|0)==(f[o>>2]|0))Ci(i,b);else{f[n>>2]=g;f[l>>2]=n+4}n=a+4|0;g=f[n>>2]|0;k=f[b>>2]|0;m=k+1|0;if((k|0)==-1){h=0;u=c;return h|0}p=((m>>>0)%3|0|0)==0?k+-2|0:m;if((p|0)==-1)q=-1;else q=f[(f[g>>2]|0)+(p<<2)>>2]|0;p=(((k>>>0)%3|0|0)==0?2:-1)+k|0;if((p|0)==-1){h=0;u=c;return h|0}k=f[(f[g>>2]|0)+(p<<2)>>2]|0;if((q|0)==-1|(k|0)==-1){h=0;u=c;return h|0}p=a+36|0;g=f[p>>2]|0;m=g+(q>>>5<<2)|0;r=1<<(q&31);s=f[m>>2]|0;if(!(s&r)){f[m>>2]=s|r;r=f[b>>2]|0;s=r+1|0;if((r|0)==-1)t=-1;else t=((s>>>0)%3|0|0)==0?r+-2|0:s;f[e>>2]=t;s=f[(f[(f[a+16>>2]|0)+96>>2]|0)+(((t>>>0)/3|0)*12|0)+(((t>>>0)%3|0)<<2)>>2]|0;t=f[a+20>>2]|0;f[d>>2]=s;r=f[t+4>>2]|0;t=r+4|0;m=f[t>>2]|0;if((m|0)==(f[r+8>>2]|0))Ci(r,d);else{f[m>>2]=s;f[t>>2]=m+4}m=a+12|0;t=f[m>>2]|0;s=t+4|0;r=f[s>>2]|0;if((r|0)==(f[t+8>>2]|0)){Ci(t,e);v=f[m>>2]|0}else{f[r>>2]=f[e>>2];f[s>>2]=r+4;v=t}t=v+24|0;f[(f[v+12>>2]|0)+(q<<2)>>2]=f[t>>2];f[t>>2]=(f[t>>2]|0)+1;w=f[p>>2]|0}else w=g;g=w+(k>>>5<<2)|0;w=1<<(k&31);t=f[g>>2]|0;if(!(t&w)){f[g>>2]=t|w;w=f[b>>2]|0;do if((w|0)!=-1)if(!((w>>>0)%3|0)){x=w+2|0;break}else{x=w+-1|0;break}else x=-1;while(0);f[e>>2]=x;w=f[(f[(f[a+16>>2]|0)+96>>2]|0)+(((x>>>0)/3|0)*12|0)+(((x>>>0)%3|0)<<2)>>2]|0;x=f[a+20>>2]|0;f[d>>2]=w;t=f[x+4>>2]|0;x=t+4|0;g=f[x>>2]|0;if((g|0)==(f[t+8>>2]|0))Ci(t,d);else{f[g>>2]=w;f[x>>2]=g+4}g=a+12|0;x=f[g>>2]|0;w=x+4|0;t=f[w>>2]|0;if((t|0)==(f[x+8>>2]|0)){Ci(x,e);y=f[g>>2]|0}else{f[t>>2]=f[e>>2];f[w>>2]=t+4;y=x}x=y+24|0;f[(f[y+12>>2]|0)+(k<<2)>>2]=f[x>>2];f[x>>2]=(f[x>>2]|0)+1}x=f[i>>2]|0;k=f[l>>2]|0;if((x|0)==(k|0)){h=1;u=c;return h|0}y=a+16|0;t=a+20|0;w=a+12|0;a=k;k=x;a:while(1){x=f[a+-4>>2]|0;f[b>>2]=x;g=(x>>>0)/3|0;if((x|0)!=-1?(x=(f[j>>2]|0)+(g>>>5<<2)|0,q=1<<(g&31),g=f[x>>2]|0,(g&q|0)==0):0){f[x>>2]=g|q;q=f[b>>2]|0;if((q|0)==-1){h=0;z=80;break}g=f[n>>2]|0;x=q;b:while(1){q=f[(f[g>>2]|0)+(x<<2)>>2]|0;if((q|0)==-1){h=0;z=80;break a}v=(f[p>>2]|0)+(q>>>5<<2)|0;r=1<<(q&31);s=f[v>>2]|0;do if(!(s&r)){m=f[(f[g+24>>2]|0)+(q<<2)>>2]|0;A=m+1|0;do if((m|0)==-1)B=1;else{C=((A>>>0)%3|0|0)==0?m+-2|0:A;if((C|0)==-1){B=1;break}D=f[(f[g+12>>2]|0)+(C<<2)>>2]|0;C=D+1|0;if((D|0)==-1){B=1;break}B=((((C>>>0)%3|0|0)==0?D+-2|0:C)|0)==-1}while(0);f[v>>2]=s|r;A=f[b>>2]|0;f[e>>2]=A;m=f[(f[(f[y>>2]|0)+96>>2]|0)+(((A>>>0)/3|0)*12|0)+(((A>>>0)%3|0)<<2)>>2]|0;A=f[t>>2]|0;f[d>>2]=m;C=f[A+4>>2]|0;A=C+4|0;D=f[A>>2]|0;if((D|0)==(f[C+8>>2]|0))Ci(C,d);else{f[D>>2]=m;f[A>>2]=D+4}D=f[w>>2]|0;A=D+4|0;m=f[A>>2]|0;if((m|0)==(f[D+8>>2]|0)){Ci(D,e);E=f[w>>2]|0}else{f[m>>2]=f[e>>2];f[A>>2]=m+4;E=D}D=E+24|0;f[(f[E+12>>2]|0)+(q<<2)>>2]=f[D>>2];f[D>>2]=(f[D>>2]|0)+1;D=f[n>>2]|0;m=f[b>>2]|0;if(B)if((m|0)==-1){z=63;break b}else{F=m;G=D;z=64;break}do if((m|0)==-1)H=-1;else{A=m+1|0;C=((A>>>0)%3|0|0)==0?m+-2|0:A;if((C|0)==-1){H=-1;break}H=f[(f[D+12>>2]|0)+(C<<2)>>2]|0}while(0);f[b>>2]=H;I=(H>>>0)/3|0;J=D}else{F=x;G=g;z=64}while(0);if((z|0)==64){z=0;q=F+1|0;r=((q>>>0)%3|0|0)==0?F+-2|0:q;if((r|0)==-1)K=-1;else K=f[(f[G+12>>2]|0)+(r<<2)>>2]|0;f[d>>2]=K;r=(((F>>>0)%3|0|0)==0?2:-1)+F|0;if((r|0)==-1)L=-1;else L=f[(f[G+12>>2]|0)+(r<<2)>>2]|0;r=(K|0)==-1;q=(K>>>0)/3|0;s=r?-1:q;v=(L|0)==-1;m=(L>>>0)/3|0;C=v?-1:m;do if(!r){A=f[j>>2]|0;if(f[A+(s>>>5<<2)>>2]&1<<(s&31)|0){z=70;break}if(v){M=K;N=q;break}if(!(f[A+(C>>>5<<2)>>2]&1<<(C&31))){z=75;break b}else{M=K;N=q}}else z=70;while(0);if((z|0)==70){z=0;if(v){z=72;break}if(!(f[(f[j>>2]|0)+(C>>>5<<2)>>2]&1<<(C&31))){M=L;N=m}else{z=72;break}}f[b>>2]=M;I=N;J=G}q=(f[j>>2]|0)+(I>>>5<<2)|0;f[q>>2]=f[q>>2]|1<<(I&31);x=f[b>>2]|0;if((x|0)==-1){h=0;z=80;break a}else g=J}do if((z|0)==63){z=0;f[d>>2]=-1;z=72}else if((z|0)==75){z=0;g=f[l>>2]|0;f[g+-4>>2]=L;if((g|0)==(f[o>>2]|0)){Ci(i,d);O=f[l>>2]|0;break}else{f[g>>2]=f[d>>2];x=g+4|0;f[l>>2]=x;O=x;break}}while(0);if((z|0)==72){z=0;x=(f[l>>2]|0)+-4|0;f[l>>2]=x;O=x}P=f[i>>2]|0;Q=O}else{x=a+-4|0;f[l>>2]=x;P=k;Q=x}if((P|0)==(Q|0)){h=1;z=80;break}else{a=Q;k=P}}if((z|0)==80){u=c;return h|0}return 0}function Xb(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,i=0,j=0,k=0,l=0,m=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,X=0,Y=0,Z=0,_=0,aa=0,ba=0,ca=Oa,da=Oa,ea=Oa,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0;e=u;u=u+48|0;g=e+20|0;i=e;j=e+8|0;k=g+16|0;f[g>>2]=0;f[g+4>>2]=0;f[g+8>>2]=0;f[g+12>>2]=0;n[k>>2]=$(1.0);l=a+80|0;m=f[l>>2]|0;f[j>>2]=0;o=j+4|0;f[o>>2]=0;f[j+8>>2]=0;if(m){if(m>>>0>1073741823)mq(j);p=m<<2;q=dn(p)|0;f[j>>2]=q;r=q+(m<<2)|0;f[j+8>>2]=r;hj(q|0,0,p|0)|0;f[o>>2]=r;r=c+48|0;p=c+40|0;m=g+4|0;s=g+12|0;t=g+8|0;v=a+40|0;w=a+64|0;x=f[d>>2]|0;d=q;y=0;z=0;A=q;B=q;C=q;q=0;while(1){D=r;E=f[D>>2]|0;F=f[D+4>>2]|0;D=p;G=on(f[D>>2]|0,f[D+4>>2]|0,x+y|0,0)|0;D=Tn(G|0,I|0,E|0,F|0)|0;F=(f[f[c>>2]>>2]|0)+D|0;D=F;E=h[D>>0]|h[D+1>>0]<<8|h[D+2>>0]<<16|h[D+3>>0]<<24;D=F+4|0;F=h[D>>0]|h[D+1>>0]<<8|h[D+2>>0]<<16|h[D+3>>0]<<24;D=i;f[D>>2]=E;f[D+4>>2]=F;D=(E^318)+239^F;G=(q|0)==0;a:do if(!G){H=q+-1|0;J=(H&q|0)==0;if(!J)if(D>>>0<q>>>0)K=D;else K=(D>>>0)%(q>>>0)|0;else K=D&H;L=f[(f[g>>2]|0)+(K<<2)>>2]|0;do if(L|0?(M=f[L>>2]|0,M|0):0){b:do if(J){N=M;while(1){O=f[N+4>>2]|0;P=(O|0)==(D|0);if(!(P|(O&H|0)==(K|0))){Q=27;break b}if((P?(f[N+8>>2]|0)==(E|0):0)?(f[N+12>>2]|0)==(F|0):0){R=N;Q=26;break b}N=f[N>>2]|0;if(!N){Q=27;break}}}else{N=M;while(1){P=f[N+4>>2]|0;if((P|0)==(D|0)){if((f[N+8>>2]|0)==(E|0)?(f[N+12>>2]|0)==(F|0):0){R=N;Q=26;break b}}else{if(P>>>0<q>>>0)S=P;else S=(P>>>0)%(q>>>0)|0;if((S|0)!=(K|0)){Q=27;break b}}N=f[N>>2]|0;if(!N){Q=27;break}}}while(0);if((Q|0)==26){Q=0;f[A+(y<<2)>>2]=f[R+16>>2];T=d;U=z;V=C;X=B;Y=A;break a}else if((Q|0)==27){Q=0;if(G){Z=0;Q=46;break a}else break}}while(0);H=q+-1|0;J=(H&q|0)==0;if(!J)if(D>>>0<q>>>0)_=D;else _=(D>>>0)%(q>>>0)|0;else _=H&D;L=f[(f[g>>2]|0)+(_<<2)>>2]|0;if((L|0)!=0?(M=f[L>>2]|0,(M|0)!=0):0){if(J){J=M;while(1){L=f[J+4>>2]|0;if(!((L|0)==(D|0)|(L&H|0)==(_|0))){Z=_;Q=46;break a}if((f[J+8>>2]|0)==(E|0)?(f[J+12>>2]|0)==(F|0):0){Q=61;break a}J=f[J>>2]|0;if(!J){Z=_;Q=46;break a}}}else aa=M;while(1){J=f[aa+4>>2]|0;if((J|0)!=(D|0)){if(J>>>0<q>>>0)ba=J;else ba=(J>>>0)%(q>>>0)|0;if((ba|0)!=(_|0)){Z=_;Q=46;break a}}if((f[aa+8>>2]|0)==(E|0)?(f[aa+12>>2]|0)==(F|0):0){Q=61;break a}aa=f[aa>>2]|0;if(!aa){Z=_;Q=46;break}}}else{Z=_;Q=46}}else{Z=0;Q=46}while(0);if((Q|0)==46){Q=0;M=dn(20)|0;J=M+8|0;f[J>>2]=E;f[J+4>>2]=F;f[M+16>>2]=z;f[M+4>>2]=D;f[M>>2]=0;ca=$(((f[s>>2]|0)+1|0)>>>0);da=$(q>>>0);ea=$(n[k>>2]);do if(G|$(ea*da)<ca){J=q<<1|(q>>>0<3|(q+-1&q|0)!=0)&1;H=~~$(W($(ca/ea)))>>>0;Ih(g,J>>>0<H>>>0?H:J);J=f[m>>2]|0;H=J+-1|0;if(!(H&J)){fa=J;ga=H&D;break}if(D>>>0<J>>>0){fa=J;ga=D}else{fa=J;ga=(D>>>0)%(J>>>0)|0}}else{fa=q;ga=Z}while(0);D=(f[g>>2]|0)+(ga<<2)|0;G=f[D>>2]|0;if(!G){f[M>>2]=f[t>>2];f[t>>2]=M;f[D>>2]=t;D=f[M>>2]|0;if(D|0){F=f[D+4>>2]|0;D=fa+-1|0;if(D&fa)if(F>>>0<fa>>>0)ha=F;else ha=(F>>>0)%(fa>>>0)|0;else ha=F&D;ia=(f[g>>2]|0)+(ha<<2)|0;Q=59}}else{f[M>>2]=f[G>>2];ia=G;Q=59}if((Q|0)==59){Q=0;f[ia>>2]=M}f[s>>2]=(f[s>>2]|0)+1;Q=61}if((Q|0)==61){Q=0;G=v;D=f[G>>2]|0;F=on(D|0,f[G+4>>2]|0,z|0,0)|0;Rg((f[f[w>>2]>>2]|0)+F|0,i|0,D|0)|0;D=f[j>>2]|0;f[D+(y<<2)>>2]=z;T=D;U=z+1|0;V=D;X=D;Y=D}D=y+1|0;ja=f[l>>2]|0;if(D>>>0>=ja>>>0)break;d=T;y=D;z=U;A=Y;B=X;C=V;q=f[m>>2]|0}if((U|0)==(ja|0))ka=X;else{X=a+84|0;if(!(b[X>>0]|0)){m=f[a+72>>2]|0;q=f[a+68>>2]|0;C=q;if((m|0)==(q|0))la=T;else{B=m-q>>2;q=0;do{m=C+(q<<2)|0;f[m>>2]=f[V+(f[m>>2]<<2)>>2];q=q+1|0}while(q>>>0<B>>>0);la=T}}else{b[X>>0]=0;X=a+68|0;T=a+72|0;B=f[T>>2]|0;q=f[X>>2]|0;V=B-q>>2;C=q;q=B;if(ja>>>0<=V>>>0)if(ja>>>0<V>>>0?(B=C+(ja<<2)|0,(B|0)!=(q|0)):0){f[T>>2]=q+(~((q+-4-B|0)>>>2)<<2);ma=ja}else ma=ja;else{kh(X,ja-V|0,1204);ma=f[l>>2]|0}V=f[j>>2]|0;if(!ma)la=V;else{j=f[a+68>>2]|0;a=0;do{f[j+(a<<2)>>2]=f[V+(a<<2)>>2];a=a+1|0}while(a>>>0<ma>>>0);la=V}}f[l>>2]=U;ka=la}if(!ka)na=U;else{la=f[o>>2]|0;if((la|0)!=(ka|0))f[o>>2]=la+(~((la+-4-ka|0)>>>2)<<2);br(ka);na=U}}else na=0;U=f[g+8>>2]|0;if(U|0){ka=U;do{U=ka;ka=f[ka>>2]|0;br(U)}while((ka|0)!=0)}ka=f[g>>2]|0;f[g>>2]=0;if(!ka){u=e;return na|0}br(ka);u=e;return na|0}function Yb(a,c,e){a=a|0;c=c|0;e=e|0;var g=0,i=0,j=0,k=0,l=0,m=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,X=0,Y=0,Z=0,_=0,aa=0,ba=0,ca=0,da=0,ea=Oa,fa=Oa,ga=Oa,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0;g=u;u=u+48|0;i=g+12|0;j=g+32|0;k=g;l=i+16|0;f[i>>2]=0;f[i+4>>2]=0;f[i+8>>2]=0;f[i+12>>2]=0;n[l>>2]=$(1.0);m=a+80|0;o=f[m>>2]|0;f[k>>2]=0;p=k+4|0;f[p>>2]=0;f[k+8>>2]=0;if(o){if(o>>>0>1073741823)mq(k);q=o<<2;r=dn(q)|0;f[k>>2]=r;s=r+(o<<2)|0;f[k+8>>2]=s;hj(r|0,0,q|0)|0;f[p>>2]=s;s=c+48|0;q=c+40|0;o=i+4|0;t=i+12|0;v=i+8|0;w=a+40|0;x=a+64|0;y=f[e>>2]|0;e=r;z=0;A=0;B=r;C=r;D=0;E=r;while(1){r=s;F=f[r>>2]|0;G=f[r+4>>2]|0;r=q;H=on(f[r>>2]|0,f[r+4>>2]|0,y+z|0,0)|0;r=Tn(H|0,I|0,F|0,G|0)|0;G=(f[f[c>>2]>>2]|0)+r|0;r=h[G>>0]|h[G+1>>0]<<8;d[j>>1]=r;G=r&255;F=(r&65535)>>>8;H=F&255;J=((r&255^318)+239<<16>>16^F)&65535;F=(D|0)==0;a:do if(!F){K=D+-1|0;L=(K&D|0)==0;if(!L)if(D>>>0>J>>>0)M=J;else M=(J>>>0)%(D>>>0)|0;else M=K&J;N=f[(f[i>>2]|0)+(M<<2)>>2]|0;do if(N|0?(O=f[N>>2]|0,O|0):0){b:do if(L){P=O;while(1){Q=f[P+4>>2]|0;R=(Q|0)==(J|0);if(!(R|(Q&K|0)==(M|0))){S=27;break b}if((R?(R=P+8|0,(b[R>>0]|0)==G<<24>>24):0)?(b[R+1>>0]|0)==H<<24>>24:0){T=P;S=26;break b}P=f[P>>2]|0;if(!P){S=27;break}}}else{P=O;while(1){R=f[P+4>>2]|0;if((R|0)==(J|0)){Q=P+8|0;if((b[Q>>0]|0)==G<<24>>24?(b[Q+1>>0]|0)==H<<24>>24:0){T=P;S=26;break b}}else{if(R>>>0<D>>>0)U=R;else U=(R>>>0)%(D>>>0)|0;if((U|0)!=(M|0)){S=27;break b}}P=f[P>>2]|0;if(!P){S=27;break}}}while(0);if((S|0)==26){S=0;f[E+(z<<2)>>2]=f[T+12>>2];V=e;X=A;Y=C;Z=B;_=E;break a}else if((S|0)==27){S=0;if(F){aa=0;S=46;break a}else break}}while(0);K=D+-1|0;L=(K&D|0)==0;if(!L)if(D>>>0>J>>>0)ba=J;else ba=(J>>>0)%(D>>>0)|0;else ba=K&J;N=f[(f[i>>2]|0)+(ba<<2)>>2]|0;if((N|0)!=0?(O=f[N>>2]|0,(O|0)!=0):0){if(L){L=O;while(1){N=f[L+4>>2]|0;if(!((N|0)==(J|0)|(N&K|0)==(ba|0))){aa=ba;S=46;break a}N=L+8|0;if((b[N>>0]|0)==G<<24>>24?(b[N+1>>0]|0)==H<<24>>24:0){S=61;break a}L=f[L>>2]|0;if(!L){aa=ba;S=46;break a}}}else ca=O;while(1){L=f[ca+4>>2]|0;if((L|0)!=(J|0)){if(L>>>0<D>>>0)da=L;else da=(L>>>0)%(D>>>0)|0;if((da|0)!=(ba|0)){aa=ba;S=46;break a}}L=ca+8|0;if((b[L>>0]|0)==G<<24>>24?(b[L+1>>0]|0)==H<<24>>24:0){S=61;break a}ca=f[ca>>2]|0;if(!ca){aa=ba;S=46;break}}}else{aa=ba;S=46}}else{aa=0;S=46}while(0);if((S|0)==46){S=0;H=dn(16)|0;G=H+8|0;b[G>>0]=r;b[G+1>>0]=r>>8;f[H+12>>2]=A;f[H+4>>2]=J;f[H>>2]=0;ea=$(((f[t>>2]|0)+1|0)>>>0);fa=$(D>>>0);ga=$(n[l>>2]);do if(F|$(ga*fa)<ea){G=D<<1|(D>>>0<3|(D+-1&D|0)!=0)&1;O=~~$(W($(ea/ga)))>>>0;Lh(i,G>>>0<O>>>0?O:G);G=f[o>>2]|0;O=G+-1|0;if(!(O&G)){ha=G;ia=O&J;break}if(G>>>0>J>>>0){ha=G;ia=J}else{ha=G;ia=(J>>>0)%(G>>>0)|0}}else{ha=D;ia=aa}while(0);J=(f[i>>2]|0)+(ia<<2)|0;F=f[J>>2]|0;if(!F){f[H>>2]=f[v>>2];f[v>>2]=H;f[J>>2]=v;J=f[H>>2]|0;if(J|0){r=f[J+4>>2]|0;J=ha+-1|0;if(J&ha)if(r>>>0<ha>>>0)ja=r;else ja=(r>>>0)%(ha>>>0)|0;else ja=r&J;ka=(f[i>>2]|0)+(ja<<2)|0;S=59}}else{f[H>>2]=f[F>>2];ka=F;S=59}if((S|0)==59){S=0;f[ka>>2]=H}f[t>>2]=(f[t>>2]|0)+1;S=61}if((S|0)==61){S=0;F=w;J=f[F>>2]|0;r=on(J|0,f[F+4>>2]|0,A|0,0)|0;Rg((f[f[x>>2]>>2]|0)+r|0,j|0,J|0)|0;J=f[k>>2]|0;f[J+(z<<2)>>2]=A;V=J;X=A+1|0;Y=J;Z=J;_=J}J=z+1|0;la=f[m>>2]|0;if(J>>>0>=la>>>0)break;e=V;z=J;A=X;B=Z;C=Y;D=f[o>>2]|0;E=_}if((X|0)==(la|0))ma=Z;else{Z=a+84|0;if(!(b[Z>>0]|0)){_=f[a+72>>2]|0;E=f[a+68>>2]|0;o=E;if((_|0)==(E|0))na=V;else{D=_-E>>2;E=0;do{_=o+(E<<2)|0;f[_>>2]=f[Y+(f[_>>2]<<2)>>2];E=E+1|0}while(E>>>0<D>>>0);na=V}}else{b[Z>>0]=0;Z=a+68|0;V=a+72|0;D=f[V>>2]|0;E=f[Z>>2]|0;Y=D-E>>2;o=E;E=D;if(la>>>0<=Y>>>0)if(la>>>0<Y>>>0?(D=o+(la<<2)|0,(D|0)!=(E|0)):0){f[V>>2]=E+(~((E+-4-D|0)>>>2)<<2);oa=la}else oa=la;else{kh(Z,la-Y|0,1204);oa=f[m>>2]|0}Y=f[k>>2]|0;if(!oa)na=Y;else{k=f[a+68>>2]|0;a=0;do{f[k+(a<<2)>>2]=f[Y+(a<<2)>>2];a=a+1|0}while(a>>>0<oa>>>0);na=Y}}f[m>>2]=X;ma=na}if(!ma)pa=X;else{na=f[p>>2]|0;if((na|0)!=(ma|0))f[p>>2]=na+(~((na+-4-ma|0)>>>2)<<2);br(ma);pa=X}}else pa=0;X=f[i+8>>2]|0;if(X|0){ma=X;do{X=ma;ma=f[ma>>2]|0;br(X)}while((ma|0)!=0)}ma=f[i>>2]|0;f[i>>2]=0;if(!ma){u=g;return pa|0}br(ma);u=g;return pa|0}function Zb(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0;c=u;u=u+16|0;d=c+8|0;e=c;g=c+4|0;h=a+16|0;i=f[h>>2]|0;j=a+20|0;k=f[j>>2]|0;if((k|0)==(i|0))l=i;else{m=k+(~((k+-4-i|0)>>>2)<<2)|0;f[j>>2]=m;l=m}m=a+24|0;if((l|0)==(f[m>>2]|0)){Ci(h,b);n=f[h>>2]|0;o=f[j>>2]|0}else{f[l>>2]=f[b>>2];k=l+4|0;f[j>>2]=k;n=i;o=k}k=f[a+8>>2]|0;i=(f[k+100>>2]|0)-(f[k+96>>2]|0)|0;k=(i|0)/12|0;if((n|0)==(o|0)){u=c;return 1}n=a+28|0;l=(i|0)>0;i=a+164|0;p=a+12|0;q=a+76|0;r=a+80|0;s=a+72|0;t=a+200|0;v=a+320|0;w=a+152|0;x=a+84|0;y=a+324|0;z=a+292|0;A=a+304|0;B=a+316|0;C=a+328|0;D=a+336|0;E=a+332|0;F=a+168|0;G=a+140|0;H=a+120|0;I=o;do{o=f[I+-4>>2]|0;f[b>>2]=o;a:do if((o|0)!=-1?(J=(o>>>0)/3|0,K=f[n>>2]|0,(f[K+(J>>>5<<2)>>2]&1<<(J&31)|0)==0):0){if(l){J=0;L=K;b:while(1){K=J+1|0;f[i>>2]=(f[i>>2]|0)+1;M=f[b>>2]|0;N=(M|0)==-1?-1:(M>>>0)/3|0;M=L+(N>>>5<<2)|0;f[M>>2]=1<<(N&31)|f[M>>2];M=f[q>>2]|0;if((M|0)==(f[r>>2]|0))Ci(s,b);else{f[M>>2]=f[b>>2];f[q>>2]=M+4}f[v>>2]=f[b>>2];M=f[b>>2]|0;if((M|0)==-1)O=-1;else O=f[(f[f[p>>2]>>2]|0)+(M<<2)>>2]|0;P=(f[(f[w>>2]|0)+(O<<2)>>2]|0)!=-1;Q=(f[x>>2]|0)+(O>>>5<<2)|0;R=1<<(O&31);S=f[Q>>2]|0;do if(!(S&R)){f[Q>>2]=S|R;if(P){T=f[b>>2]|0;U=38;break}f[y>>2]=(f[y>>2]|0)+1;V=f[v>>2]|0;W=V+1|0;do if((V|0)!=-1){X=((W>>>0)%3|0|0)==0?V+-2|0:W;if(!((V>>>0)%3|0)){Y=V+2|0;Z=X;break}else{Y=V+-1|0;Z=X;break}}else{Y=-1;Z=-1}while(0);V=f[z>>2]|0;W=f[A>>2]|0;X=W+(f[V+(Z<<2)>>2]<<2)|0;_=f[X>>2]|0;f[X>>2]=_+-1;X=W+(f[V+(Y<<2)>>2]<<2)|0;f[X>>2]=(f[X>>2]|0)+-1;X=f[B>>2]|0;if((X|0)!=-1){V=f[C>>2]|0;if((_|0)<(V|0))$=V;else{W=f[E>>2]|0;$=(_|0)>(W|0)?W:_}_=$-V|0;V=f[D>>2]|0;W=f[3384+(X<<2)>>2]|0;f[d>>2]=W;X=V+(_*12|0)+4|0;aa=f[X>>2]|0;if(aa>>>0<(f[V+(_*12|0)+8>>2]|0)>>>0){f[aa>>2]=W;f[X>>2]=aa+4}else Ci(V+(_*12|0)|0,d)}f[B>>2]=0;_=f[b>>2]|0;V=_+1|0;if((_|0)!=-1?(aa=((V>>>0)%3|0|0)==0?_+-2|0:V,(aa|0)!=-1):0)ba=f[(f[(f[p>>2]|0)+12>>2]|0)+(aa<<2)>>2]|0;else ba=-1;f[b>>2]=ba}else{T=M;U=38}while(0);if((U|0)==38){U=0;M=T+1|0;if((T|0)==-1){U=43;break}R=((M>>>0)%3|0|0)==0?T+-2|0:M;if((R|0)==-1)ca=-1;else ca=f[(f[(f[p>>2]|0)+12>>2]|0)+(R<<2)>>2]|0;f[e>>2]=ca;R=(((T>>>0)%3|0|0)==0?2:-1)+T|0;if((R|0)==-1)da=-1;else da=f[(f[(f[p>>2]|0)+12>>2]|0)+(R<<2)>>2]|0;R=(ca|0)==-1;S=R?-1:(ca>>>0)/3|0;ea=(da|0)==-1;fa=ea?-1:(da>>>0)/3|0;Q=((M>>>0)%3|0|0)==0?T+-2|0:M;if(((Q|0)!=-1?(M=f[(f[p>>2]|0)+12>>2]|0,aa=f[M+(Q<<2)>>2]|0,(aa|0)!=-1):0)?(Q=(aa>>>0)/3|0,aa=f[n>>2]|0,(f[aa+(Q>>>5<<2)>>2]&1<<(Q&31)|0)==0):0){Q=(((T>>>0)%3|0|0)==0?2:-1)+T|0;do if((Q|0)!=-1){V=f[M+(Q<<2)>>2]|0;if((V|0)==-1)break;_=(V>>>0)/3|0;if(!(f[aa+(_>>>5<<2)>>2]&1<<(_&31))){U=62;break b}}while(0);if(!ea)jf(a,f[i>>2]|0,N,0,fa);hd(t,3);ga=f[e>>2]|0}else{if(!R){jf(a,f[i>>2]|0,N,1,S);aa=f[b>>2]|0;if((aa|0)==-1){U=52;break}else ha=aa}else ha=T;aa=(((ha>>>0)%3|0|0)==0?2:-1)+ha|0;if((aa|0)==-1){U=52;break}Q=f[(f[(f[p>>2]|0)+12>>2]|0)+(aa<<2)>>2]|0;if((Q|0)==-1){U=52;break}aa=(Q>>>0)/3|0;if(f[(f[n>>2]|0)+(aa>>>5<<2)>>2]&1<<(aa&31)|0){U=52;break}hd(t,5);ga=da}f[b>>2]=ga}if((K|0)>=(k|0))break a;J=K;L=f[n>>2]|0}do if((U|0)==43){U=0;f[e>>2]=-1;U=54}else if((U|0)==52){U=0;if(ea)U=54;else{jf(a,f[i>>2]|0,N,0,fa);U=54}}else if((U|0)==62){U=0;hd(t,1);f[F>>2]=(f[F>>2]|0)+1;if(P?(L=f[(f[w>>2]|0)+(O<<2)>>2]|0,(1<<(L&31)&f[(f[G>>2]|0)+(L>>>5<<2)>>2]|0)==0):0){f[g>>2]=f[b>>2];f[d>>2]=f[g>>2];Ce(a,d,0)|0}L=f[i>>2]|0;f[d>>2]=N;J=Sd(H,d)|0;f[J>>2]=L;L=f[j>>2]|0;f[L+-4>>2]=da;if((L|0)==(f[m>>2]|0)){Ci(h,e);break}else{f[L>>2]=f[e>>2];f[j>>2]=L+4;break}}while(0);if((U|0)==54){U=0;hd(t,7);f[j>>2]=(f[j>>2]|0)+-4}}}else U=11;while(0);if((U|0)==11){U=0;f[j>>2]=I+-4}I=f[j>>2]|0}while((f[h>>2]|0)!=(I|0));u=c;return 1}function _b(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,i=0,j=0,k=0,l=0,m=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=Oa,K=Oa,L=Oa,M=0,N=0,O=0,P=0;e=u;u=u+64|0;g=e+40|0;i=e+16|0;j=e;k=xd(a,c)|0;if(k|0){f[i>>2]=k;f[g>>2]=f[i>>2];Xe(a,g)|0}f[j>>2]=0;k=j+4|0;f[k>>2]=0;f[j+8>>2]=0;ri(j,8);l=d;d=l;m=h[d>>0]|h[d+1>>0]<<8|h[d+2>>0]<<16|h[d+3>>0]<<24;d=l+4|0;l=h[d>>0]|h[d+1>>0]<<8|h[d+2>>0]<<16|h[d+3>>0]<<24;d=f[j>>2]|0;o=d;b[o>>0]=m;b[o+1>>0]=m>>8;b[o+2>>0]=m>>16;b[o+3>>0]=m>>24;m=d+4|0;b[m>>0]=l;b[m+1>>0]=l>>8;b[m+2>>0]=l>>16;b[m+3>>0]=l>>24;dj(i,c);c=i+12|0;f[c>>2]=0;l=i+16|0;f[l>>2]=0;f[i+20>>2]=0;m=f[k>>2]|0;d=f[j>>2]|0;o=m-d|0;if(!o){p=d;q=m;r=0}else{ri(c,o);p=f[j>>2]|0;q=f[k>>2]|0;r=f[c>>2]|0}Rg(r|0,p|0,q-p|0)|0;p=i+11|0;q=b[p>>0]|0;r=q<<24>>24<0;c=r?f[i>>2]|0:i;o=r?f[i+4>>2]|0:q&255;if(o>>>0>3){q=c;r=o;m=o;while(1){d=X(h[q>>0]|h[q+1>>0]<<8|h[q+2>>0]<<16|h[q+3>>0]<<24,1540483477)|0;r=(X(d>>>24^d,1540483477)|0)^(X(r,1540483477)|0);m=m+-4|0;if(m>>>0<=3)break;else q=q+4|0}q=o+-4|0;m=q&-4;s=q-m|0;t=c+(m+4)|0;v=r}else{s=o;t=c;v=o}switch(s|0){case 3:{w=h[t+2>>0]<<16^v;x=10;break}case 2:{w=v;x=10;break}case 1:{y=v;x=11;break}default:z=v}if((x|0)==10){y=h[t+1>>0]<<8^w;x=11}if((x|0)==11)z=X(y^h[t>>0],1540483477)|0;t=X(z>>>13^z,1540483477)|0;z=t>>>15^t;t=a+4|0;y=f[t>>2]|0;w=(y|0)==0;a:do if(!w){v=y+-1|0;s=(v&y|0)==0;if(!s)if(z>>>0<y>>>0)A=z;else A=(z>>>0)%(y>>>0)|0;else A=z&v;r=f[(f[a>>2]|0)+(A<<2)>>2]|0;if((r|0)!=0?(m=f[r>>2]|0,(m|0)!=0):0){r=(o|0)==0;if(s){if(r){s=m;while(1){q=f[s+4>>2]|0;if(!((q|0)==(z|0)|(q&v|0)==(A|0))){B=A;x=52;break a}q=b[s+8+11>>0]|0;if(!((q<<24>>24<0?f[s+12>>2]|0:q&255)|0))break a;s=f[s>>2]|0;if(!s){B=A;x=52;break a}}}else C=m;while(1){s=f[C+4>>2]|0;if(!((s|0)==(z|0)|(s&v|0)==(A|0))){B=A;x=52;break a}s=C+8|0;q=b[s+11>>0]|0;d=q<<24>>24<0;D=q&255;do if(((d?f[C+12>>2]|0:D)|0)==(o|0)){q=f[s>>2]|0;if(d)if(!(Pk(q,c,o)|0))break a;else break;if((b[c>>0]|0)==(q&255)<<24>>24){q=s;E=D;F=c;do{E=E+-1|0;q=q+1|0;if(!E)break a;F=F+1|0}while((b[q>>0]|0)==(b[F>>0]|0))}}while(0);C=f[C>>2]|0;if(!C){B=A;x=52;break a}}}if(r){v=m;while(1){D=f[v+4>>2]|0;if((D|0)!=(z|0)){if(D>>>0<y>>>0)G=D;else G=(D>>>0)%(y>>>0)|0;if((G|0)!=(A|0)){B=A;x=52;break a}}D=b[v+8+11>>0]|0;if(!((D<<24>>24<0?f[v+12>>2]|0:D&255)|0))break a;v=f[v>>2]|0;if(!v){B=A;x=52;break a}}}else H=m;while(1){v=f[H+4>>2]|0;if((v|0)!=(z|0)){if(v>>>0<y>>>0)I=v;else I=(v>>>0)%(y>>>0)|0;if((I|0)!=(A|0)){B=A;x=52;break a}}v=H+8|0;r=b[v+11>>0]|0;D=r<<24>>24<0;s=r&255;do if(((D?f[H+12>>2]|0:s)|0)==(o|0)){r=f[v>>2]|0;if(D)if(!(Pk(r,c,o)|0))break a;else break;if((b[c>>0]|0)==(r&255)<<24>>24){r=v;d=s;F=c;do{d=d+-1|0;r=r+1|0;if(!d)break a;F=F+1|0}while((b[r>>0]|0)==(b[F>>0]|0))}}while(0);H=f[H>>2]|0;if(!H){B=A;x=52;break}}}else{B=A;x=52}}else{B=0;x=52}while(0);if((x|0)==52){_h(g,a,z,i);x=a+12|0;J=$(((f[x>>2]|0)+1|0)>>>0);K=$(y>>>0);L=$(n[a+16>>2]);do if(w|$(L*K)<J){A=y<<1|(y>>>0<3|(y+-1&y|0)!=0)&1;H=~~$(W($(J/L)))>>>0;Ph(a,A>>>0<H>>>0?H:A);A=f[t>>2]|0;H=A+-1|0;if(!(H&A)){M=A;N=H&z;break}if(z>>>0<A>>>0){M=A;N=z}else{M=A;N=(z>>>0)%(A>>>0)|0}}else{M=y;N=B}while(0);B=f[(f[a>>2]|0)+(N<<2)>>2]|0;if(!B){y=a+8|0;f[f[g>>2]>>2]=f[y>>2];f[y>>2]=f[g>>2];f[(f[a>>2]|0)+(N<<2)>>2]=y;y=f[g>>2]|0;N=f[y>>2]|0;if(!N)O=g;else{z=f[N+4>>2]|0;N=M+-1|0;if(N&M)if(z>>>0<M>>>0)P=z;else P=(z>>>0)%(M>>>0)|0;else P=z&N;f[(f[a>>2]|0)+(P<<2)>>2]=y;O=g}}else{f[f[g>>2]>>2]=f[B>>2];f[B>>2]=f[g>>2];O=g}f[x>>2]=(f[x>>2]|0)+1;f[O>>2]=0}O=f[i+12>>2]|0;if(O|0){if((f[l>>2]|0)!=(O|0))f[l>>2]=O;br(O)}if((b[p>>0]|0)<0)br(f[i>>2]|0);i=f[j>>2]|0;if(!i){u=e;return}if((f[k>>2]|0)!=(i|0))f[k>>2]=i;br(i);u=e;return}function $b(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0;e=u;u=u+96|0;g=e+92|0;h=e+88|0;i=e+72|0;j=e+48|0;k=e+24|0;l=e;m=a+16|0;n=f[m>>2]|0;o=f[c>>2]|0;f[i>>2]=n;f[i+4>>2]=o;c=i+8|0;f[c>>2]=o;b[i+12>>0]=1;p=(o|0)==-1;if(p)q=-1;else q=f[(f[n>>2]|0)+(o<<2)>>2]|0;n=a+20|0;r=f[n>>2]|0;s=f[r>>2]|0;if((f[r+4>>2]|0)-s>>2>>>0<=q>>>0)mq(r);r=a+8|0;t=f[(f[r>>2]|0)+(f[s+(q<<2)>>2]<<2)>>2]|0;q=a+4|0;s=f[q>>2]|0;if(!(b[s+84>>0]|0))v=f[(f[s+68>>2]|0)+(t<<2)>>2]|0;else v=t;f[j>>2]=0;f[j+4>>2]=0;f[j+8>>2]=0;f[j+12>>2]=0;f[j+16>>2]=0;f[j+20>>2]=0;f[h>>2]=v;v=b[s+24>>0]|0;f[g>>2]=f[h>>2];ub(s,g,v,j)|0;v=a+28|0;a=(f[v>>2]|0)==0;a:do if(!p){s=k+8|0;t=j+8|0;w=k+16|0;x=j+16|0;y=l+8|0;z=l+16|0;A=o;B=o;C=0;D=0;E=0;F=0;G=0;H=0;J=a;K=o;while(1){do if(J){L=K+1|0;if((K|0)==-1){M=A;N=-1;O=-1;P=-1;break}Q=((L>>>0)%3|0|0)==0?K+-2|0:L;if((A|0)!=-1)if(!((A>>>0)%3|0)){R=A;S=A+2|0;T=Q;U=A;V=19;break}else{R=A;S=A+-1|0;T=Q;U=A;V=19;break}else{R=-1;S=-1;T=Q;U=-1;V=19}}else{Q=B+1|0;L=((Q>>>0)%3|0|0)==0?B+-2|0:Q;if(!((B>>>0)%3|0)){R=A;S=B+2|0;T=L;U=K;V=19;break}else{R=A;S=B+-1|0;T=L;U=K;V=19;break}}while(0);if((V|0)==19){V=0;if((T|0)==-1){M=R;N=-1;O=S;P=U}else{M=R;N=f[(f[f[m>>2]>>2]|0)+(T<<2)>>2]|0;O=S;P=U}}W=f[n>>2]|0;L=f[W>>2]|0;if((f[W+4>>2]|0)-L>>2>>>0<=N>>>0){V=22;break}Q=f[(f[r>>2]|0)+(f[L+(N<<2)>>2]<<2)>>2]|0;L=f[q>>2]|0;if(!(b[L+84>>0]|0))X=f[(f[L+68>>2]|0)+(Q<<2)>>2]|0;else X=Q;f[k>>2]=0;f[k+4>>2]=0;f[k+8>>2]=0;f[k+12>>2]=0;f[k+16>>2]=0;f[k+20>>2]=0;f[h>>2]=X;Q=b[L+24>>0]|0;f[g>>2]=f[h>>2];ub(L,g,Q,k)|0;if((O|0)==-1)Y=-1;else Y=f[(f[f[m>>2]>>2]|0)+(O<<2)>>2]|0;Z=f[n>>2]|0;Q=f[Z>>2]|0;if((f[Z+4>>2]|0)-Q>>2>>>0<=Y>>>0){V=28;break}L=f[(f[r>>2]|0)+(f[Q+(Y<<2)>>2]<<2)>>2]|0;Q=f[q>>2]|0;if(!(b[Q+84>>0]|0))_=f[(f[Q+68>>2]|0)+(L<<2)>>2]|0;else _=L;f[l>>2]=0;f[l+4>>2]=0;f[l+8>>2]=0;f[l+12>>2]=0;f[l+16>>2]=0;f[l+20>>2]=0;f[h>>2]=_;L=b[Q+24>>0]|0;f[g>>2]=f[h>>2];ub(Q,g,L,l)|0;L=k;Q=j;$=f[Q>>2]|0;aa=f[Q+4>>2]|0;Q=Vn(f[L>>2]|0,f[L+4>>2]|0,$|0,aa|0)|0;L=I;ba=s;ca=t;da=f[ca>>2]|0;ea=f[ca+4>>2]|0;ca=Vn(f[ba>>2]|0,f[ba+4>>2]|0,da|0,ea|0)|0;ba=I;fa=w;ga=x;ha=f[ga>>2]|0;ia=f[ga+4>>2]|0;ga=Vn(f[fa>>2]|0,f[fa+4>>2]|0,ha|0,ia|0)|0;fa=I;ja=l;ka=Vn(f[ja>>2]|0,f[ja+4>>2]|0,$|0,aa|0)|0;aa=I;$=y;ja=Vn(f[$>>2]|0,f[$+4>>2]|0,da|0,ea|0)|0;ea=I;da=z;$=Vn(f[da>>2]|0,f[da+4>>2]|0,ha|0,ia|0)|0;ia=I;ha=on($|0,ia|0,ca|0,ba|0)|0;da=I;la=on(ja|0,ea|0,ga|0,fa|0)|0;ma=I;na=on(ka|0,aa|0,ga|0,fa|0)|0;fa=I;ga=on($|0,ia|0,Q|0,L|0)|0;ia=I;$=on(ja|0,ea|0,Q|0,L|0)|0;L=I;Q=on(ka|0,aa|0,ca|0,ba|0)|0;ba=I;ca=Vn(C|0,D|0,la|0,ma|0)|0;ma=Tn(ca|0,I|0,ha|0,da|0)|0;da=I;ha=Tn(na|0,fa|0,E|0,F|0)|0;fa=Vn(ha|0,I|0,ga|0,ia|0)|0;ia=I;ga=Vn(G|0,H|0,Q|0,ba|0)|0;ba=Tn(ga|0,I|0,$|0,L|0)|0;L=I;ph(i);B=f[c>>2]|0;$=(f[v>>2]|0)==0;if((B|0)==-1){oa=$;pa=da;qa=ma;ra=ia;sa=fa;ta=L;ua=ba;break a}else{A=M;C=ma;D=da;E=fa;F=ia;G=ba;H=L;J=$;K=P}}if((V|0)==22)mq(W);else if((V|0)==28)mq(Z)}else{oa=a;pa=0;qa=0;ra=0;sa=0;ta=0;ua=0}while(0);a=(pa|0)>-1|(pa|0)==-1&qa>>>0>4294967295;Z=Vn(0,0,qa|0,pa|0)|0;V=a?pa:I;W=(ra|0)>-1|(ra|0)==-1&sa>>>0>4294967295;P=Vn(0,0,sa|0,ra|0)|0;M=W?ra:I;v=(ta|0)>-1|(ta|0)==-1&ua>>>0>4294967295;c=Vn(0,0,ua|0,ta|0)|0;i=Tn((W?sa:P)|0,M|0,(v?ua:c)|0,(v?ta:I)|0)|0;v=Tn(i|0,I|0,(a?qa:Z)|0,V|0)|0;V=I;if(oa){if((v|0)<=536870912){va=qa;wa=sa;xa=ua;f[d>>2]=va;ya=d+4|0;f[ya>>2]=wa;za=d+8|0;f[za>>2]=xa;u=e;return}oa=Wn(v|0,V|0,29)|0;Z=oa&7;oa=zk(qa|0,pa|0,Z|0,0)|0;a=zk(sa|0,ra|0,Z|0,0)|0;i=zk(ua|0,ta|0,Z|0,0)|0;va=oa;wa=a;xa=i;f[d>>2]=va;ya=d+4|0;f[ya>>2]=wa;za=d+8|0;f[za>>2]=xa;u=e;return}else{if(!((V|0)>0|(V|0)==0&v>>>0>536870912)){va=qa;wa=sa;xa=ua;f[d>>2]=va;ya=d+4|0;f[ya>>2]=wa;za=d+8|0;f[za>>2]=xa;u=e;return}i=Wn(v|0,V|0,29)|0;V=I;v=zk(qa|0,pa|0,i|0,V|0)|0;pa=zk(sa|0,ra|0,i|0,V|0)|0;ra=zk(ua|0,ta|0,i|0,V|0)|0;va=v;wa=pa;xa=ra;f[d>>2]=va;ya=d+4|0;f[ya>>2]=wa;za=d+8|0;f[za>>2]=xa;u=e;return}}function ac(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,i=0,j=0,k=0,l=0,m=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=Oa,M=Oa,N=Oa,O=0,P=0,Q=0,R=0;e=u;u=u+64|0;g=e+40|0;i=e+16|0;j=e;k=xd(a,c)|0;if(k|0){f[i>>2]=k;f[g>>2]=f[i>>2];Xe(a,g)|0}f[j>>2]=0;k=j+4|0;f[k>>2]=0;f[j+8>>2]=0;l=d+11|0;m=b[l>>0]|0;o=d+4|0;p=f[o>>2]|0;q=m<<24>>24<0?p:m&255;if(!q){r=m;s=p;t=0}else{ri(j,q);r=b[l>>0]|0;s=f[o>>2]|0;t=f[j>>2]|0}o=r<<24>>24<0;Rg(t|0,(o?f[d>>2]|0:d)|0,(o?s:r&255)|0)|0;dj(i,c);c=i+12|0;f[c>>2]=0;r=i+16|0;f[r>>2]=0;f[i+20>>2]=0;s=f[k>>2]|0;o=f[j>>2]|0;d=s-o|0;if(!d){v=o;w=s;x=0}else{ri(c,d);v=f[j>>2]|0;w=f[k>>2]|0;x=f[c>>2]|0}Rg(x|0,v|0,w-v|0)|0;v=i+11|0;w=b[v>>0]|0;x=w<<24>>24<0;c=x?f[i>>2]|0:i;d=x?f[i+4>>2]|0:w&255;if(d>>>0>3){w=c;x=d;s=d;while(1){o=X(h[w>>0]|h[w+1>>0]<<8|h[w+2>>0]<<16|h[w+3>>0]<<24,1540483477)|0;x=(X(o>>>24^o,1540483477)|0)^(X(x,1540483477)|0);s=s+-4|0;if(s>>>0<=3)break;else w=w+4|0}w=d+-4|0;s=w&-4;y=w-s|0;z=c+(s+4)|0;A=x}else{y=d;z=c;A=d}switch(y|0){case 3:{B=h[z+2>>0]<<16^A;C=12;break}case 2:{B=A;C=12;break}case 1:{D=A;C=13;break}default:E=A}if((C|0)==12){D=h[z+1>>0]<<8^B;C=13}if((C|0)==13)E=X(D^h[z>>0],1540483477)|0;z=X(E>>>13^E,1540483477)|0;E=z>>>15^z;z=a+4|0;D=f[z>>2]|0;B=(D|0)==0;a:do if(!B){A=D+-1|0;y=(A&D|0)==0;if(!y)if(E>>>0<D>>>0)F=E;else F=(E>>>0)%(D>>>0)|0;else F=E&A;x=f[(f[a>>2]|0)+(F<<2)>>2]|0;if((x|0)!=0?(s=f[x>>2]|0,(s|0)!=0):0){x=(d|0)==0;if(y){if(x){y=s;while(1){w=f[y+4>>2]|0;if(!((w|0)==(E|0)|(w&A|0)==(F|0))){G=F;C=54;break a}w=b[y+8+11>>0]|0;if(!((w<<24>>24<0?f[y+12>>2]|0:w&255)|0))break a;y=f[y>>2]|0;if(!y){G=F;C=54;break a}}}else H=s;while(1){y=f[H+4>>2]|0;if(!((y|0)==(E|0)|(y&A|0)==(F|0))){G=F;C=54;break a}y=H+8|0;w=b[y+11>>0]|0;o=w<<24>>24<0;t=w&255;do if(((o?f[H+12>>2]|0:t)|0)==(d|0)){w=f[y>>2]|0;if(o)if(!(Pk(w,c,d)|0))break a;else break;if((b[c>>0]|0)==(w&255)<<24>>24){w=y;l=t;q=c;do{l=l+-1|0;w=w+1|0;if(!l)break a;q=q+1|0}while((b[w>>0]|0)==(b[q>>0]|0))}}while(0);H=f[H>>2]|0;if(!H){G=F;C=54;break a}}}if(x){A=s;while(1){t=f[A+4>>2]|0;if((t|0)!=(E|0)){if(t>>>0<D>>>0)I=t;else I=(t>>>0)%(D>>>0)|0;if((I|0)!=(F|0)){G=F;C=54;break a}}t=b[A+8+11>>0]|0;if(!((t<<24>>24<0?f[A+12>>2]|0:t&255)|0))break a;A=f[A>>2]|0;if(!A){G=F;C=54;break a}}}else J=s;while(1){A=f[J+4>>2]|0;if((A|0)!=(E|0)){if(A>>>0<D>>>0)K=A;else K=(A>>>0)%(D>>>0)|0;if((K|0)!=(F|0)){G=F;C=54;break a}}A=J+8|0;x=b[A+11>>0]|0;t=x<<24>>24<0;y=x&255;do if(((t?f[J+12>>2]|0:y)|0)==(d|0)){x=f[A>>2]|0;if(t)if(!(Pk(x,c,d)|0))break a;else break;if((b[c>>0]|0)==(x&255)<<24>>24){x=A;o=y;q=c;do{o=o+-1|0;x=x+1|0;if(!o)break a;q=q+1|0}while((b[x>>0]|0)==(b[q>>0]|0))}}while(0);J=f[J>>2]|0;if(!J){G=F;C=54;break}}}else{G=F;C=54}}else{G=0;C=54}while(0);if((C|0)==54){_h(g,a,E,i);C=a+12|0;L=$(((f[C>>2]|0)+1|0)>>>0);M=$(D>>>0);N=$(n[a+16>>2]);do if(B|$(N*M)<L){F=D<<1|(D>>>0<3|(D+-1&D|0)!=0)&1;J=~~$(W($(L/N)))>>>0;Ph(a,F>>>0<J>>>0?J:F);F=f[z>>2]|0;J=F+-1|0;if(!(J&F)){O=F;P=J&E;break}if(E>>>0<F>>>0){O=F;P=E}else{O=F;P=(E>>>0)%(F>>>0)|0}}else{O=D;P=G}while(0);G=f[(f[a>>2]|0)+(P<<2)>>2]|0;if(!G){D=a+8|0;f[f[g>>2]>>2]=f[D>>2];f[D>>2]=f[g>>2];f[(f[a>>2]|0)+(P<<2)>>2]=D;D=f[g>>2]|0;P=f[D>>2]|0;if(!P)Q=g;else{E=f[P+4>>2]|0;P=O+-1|0;if(P&O)if(E>>>0<O>>>0)R=E;else R=(E>>>0)%(O>>>0)|0;else R=E&P;f[(f[a>>2]|0)+(R<<2)>>2]=D;Q=g}}else{f[f[g>>2]>>2]=f[G>>2];f[G>>2]=f[g>>2];Q=g}f[C>>2]=(f[C>>2]|0)+1;f[Q>>2]=0}Q=f[i+12>>2]|0;if(Q|0){if((f[r>>2]|0)!=(Q|0))f[r>>2]=Q;br(Q)}if((b[v>>0]|0)<0)br(f[i>>2]|0);i=f[j>>2]|0;if(!i){u=e;return}if((f[k>>2]|0)!=(i|0))f[k>>2]=i;br(i);u=e;return}function bc(a,c,e){a=a|0;c=c|0;e=e|0;var g=0,i=0,j=0,k=0,l=0,m=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,X=0,Y=0,Z=0,_=0,aa=0,ba=0,ca=0,da=0,ea=Oa,fa=Oa,ga=Oa,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0;g=u;u=u+48|0;i=g+12|0;j=g+32|0;k=g;l=i+16|0;f[i>>2]=0;f[i+4>>2]=0;f[i+8>>2]=0;f[i+12>>2]=0;n[l>>2]=$(1.0);m=a+80|0;o=f[m>>2]|0;f[k>>2]=0;p=k+4|0;f[p>>2]=0;f[k+8>>2]=0;if(o){if(o>>>0>1073741823)mq(k);q=o<<2;r=dn(q)|0;f[k>>2]=r;s=r+(o<<2)|0;f[k+8>>2]=s;hj(r|0,0,q|0)|0;f[p>>2]=s;s=c+48|0;q=c+40|0;o=i+4|0;t=i+12|0;v=i+8|0;w=a+40|0;x=a+64|0;y=f[e>>2]|0;e=0;z=r;A=0;B=0;C=r;D=r;E=r;while(1){r=s;F=f[r>>2]|0;G=f[r+4>>2]|0;r=q;H=on(f[r>>2]|0,f[r+4>>2]|0,y+A|0,0)|0;r=Tn(H|0,I|0,F|0,G|0)|0;G=(f[f[c>>2]>>2]|0)+r|0;r=h[G>>0]|h[G+1>>0]<<8;d[j>>1]=r;G=(r^318)&65535;a:do if(e){F=e+-1|0;H=(F&e|0)==0;if(!H)if(e>>>0>G>>>0)J=G;else J=(G>>>0)%(e>>>0)|0;else J=F&G;K=f[i>>2]|0;L=f[K+(J<<2)>>2]|0;b:do if(L|0?(M=f[L>>2]|0,M|0):0){c:do if(H){N=M;while(1){O=f[N+4>>2]|0;P=(O|0)==(G|0);if(!(P|(O&F|0)==(J|0)))break b;if(P?(d[N+8>>1]|0)==r<<16>>16:0){Q=N;break c}N=f[N>>2]|0;if(!N)break b}}else{N=M;while(1){P=f[N+4>>2]|0;if((P|0)==(G|0)){if((d[N+8>>1]|0)==r<<16>>16){Q=N;break c}}else{if(P>>>0<e>>>0)R=P;else R=(P>>>0)%(e>>>0)|0;if((R|0)!=(J|0))break b}N=f[N>>2]|0;if(!N)break b}}while(0);f[E+(A<<2)>>2]=f[Q+12>>2];S=z;T=B;U=D;V=C;X=E;break a}while(0);if(!H)if(e>>>0>G>>>0)Y=G;else Y=(G>>>0)%(e>>>0)|0;else Y=F&G;L=f[K+(Y<<2)>>2]|0;if(!L){Z=Y;_=e;aa=0;ba=40}else{if(H){M=L;while(1){M=f[M>>2]|0;if(!M){Z=Y;_=e;aa=0;ba=40;break a}N=f[M+4>>2]|0;if(!((N|0)==(G|0)|(N&F|0)==(Y|0))){Z=Y;_=e;aa=0;ba=40;break a}if((d[M+8>>1]|0)==r<<16>>16){ba=55;break a}}}else ca=L;while(1){ca=f[ca>>2]|0;if(!ca){Z=Y;_=e;aa=0;ba=40;break a}M=f[ca+4>>2]|0;if((M|0)!=(G|0)){if(M>>>0<e>>>0)da=M;else da=(M>>>0)%(e>>>0)|0;if((da|0)!=(Y|0)){Z=Y;_=e;aa=0;ba=40;break a}}if((d[ca+8>>1]|0)==r<<16>>16){ba=55;break}}}}else{Z=0;_=0;aa=1;ba=40}while(0);if((ba|0)==40){ba=0;L=dn(16)|0;d[L+8>>1]=r;f[L+12>>2]=B;f[L+4>>2]=G;f[L>>2]=0;ea=$(((f[t>>2]|0)+1|0)>>>0);fa=$(_>>>0);ga=$(n[l>>2]);do if(aa|$(ga*fa)<ea){M=_<<1|(_>>>0<3|(_+-1&_|0)!=0)&1;F=~~$(W($(ea/ga)))>>>0;Fh(i,M>>>0<F>>>0?F:M);M=f[o>>2]|0;F=M+-1|0;if(!(F&M)){ha=M;ia=F&G;break}if(M>>>0>G>>>0){ha=M;ia=G}else{ha=M;ia=(G>>>0)%(M>>>0)|0}}else{ha=_;ia=Z}while(0);G=(f[i>>2]|0)+(ia<<2)|0;r=f[G>>2]|0;if(!r){f[L>>2]=f[v>>2];f[v>>2]=L;f[G>>2]=v;G=f[L>>2]|0;if(G|0){M=f[G+4>>2]|0;G=ha+-1|0;if(G&ha)if(M>>>0<ha>>>0)ja=M;else ja=(M>>>0)%(ha>>>0)|0;else ja=M&G;ka=(f[i>>2]|0)+(ja<<2)|0;ba=53}}else{f[L>>2]=f[r>>2];ka=r;ba=53}if((ba|0)==53){ba=0;f[ka>>2]=L}f[t>>2]=(f[t>>2]|0)+1;ba=55}if((ba|0)==55){ba=0;r=w;G=f[r>>2]|0;M=on(G|0,f[r+4>>2]|0,B|0,0)|0;Rg((f[f[x>>2]>>2]|0)+M|0,j|0,G|0)|0;G=f[k>>2]|0;f[G+(A<<2)>>2]=B;S=G;T=B+1|0;U=G;V=G;X=G}G=A+1|0;la=f[m>>2]|0;if(G>>>0>=la>>>0)break;e=f[o>>2]|0;z=S;A=G;B=T;C=V;D=U;E=X}if((T|0)==(la|0))ma=V;else{V=a+84|0;if(!(b[V>>0]|0)){X=f[a+72>>2]|0;E=f[a+68>>2]|0;D=E;if((X|0)==(E|0))na=S;else{C=X-E>>2;E=0;do{X=D+(E<<2)|0;f[X>>2]=f[U+(f[X>>2]<<2)>>2];E=E+1|0}while(E>>>0<C>>>0);na=S}}else{b[V>>0]=0;V=a+68|0;S=a+72|0;C=f[S>>2]|0;E=f[V>>2]|0;U=C-E>>2;D=E;E=C;if(la>>>0<=U>>>0)if(la>>>0<U>>>0?(C=D+(la<<2)|0,(C|0)!=(E|0)):0){f[S>>2]=E+(~((E+-4-C|0)>>>2)<<2);oa=la}else oa=la;else{kh(V,la-U|0,1204);oa=f[m>>2]|0}U=f[k>>2]|0;if(!oa)na=U;else{k=f[a+68>>2]|0;a=0;do{f[k+(a<<2)>>2]=f[U+(a<<2)>>2];a=a+1|0}while(a>>>0<oa>>>0);na=U}}f[m>>2]=T;ma=na}if(!ma)pa=T;else{na=f[p>>2]|0;if((na|0)!=(ma|0))f[p>>2]=na+(~((na+-4-ma|0)>>>2)<<2);br(ma);pa=T}}else pa=0;T=f[i+8>>2]|0;if(T|0){ma=T;do{T=ma;ma=f[ma>>2]|0;br(T)}while((ma|0)!=0)}ma=f[i>>2]|0;f[i>>2]=0;if(!ma){u=g;return pa|0}br(ma);u=g;return pa|0}function cc(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,i=0,j=0,k=0,l=0,m=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=Oa,K=Oa,L=Oa,M=0,N=0,O=0,P=0;e=u;u=u+64|0;g=e+40|0;i=e+16|0;j=e;k=xd(a,c)|0;if(k|0){f[i>>2]=k;f[g>>2]=f[i>>2];Xe(a,g)|0}f[j>>2]=0;k=j+4|0;f[k>>2]=0;f[j+8>>2]=0;ri(j,4);l=f[j>>2]|0;m=h[d>>0]|h[d+1>>0]<<8|h[d+2>>0]<<16|h[d+3>>0]<<24;b[l>>0]=m;b[l+1>>0]=m>>8;b[l+2>>0]=m>>16;b[l+3>>0]=m>>24;dj(i,c);c=i+12|0;f[c>>2]=0;m=i+16|0;f[m>>2]=0;f[i+20>>2]=0;l=f[k>>2]|0;d=f[j>>2]|0;o=l-d|0;if(!o){p=d;q=l;r=0}else{ri(c,o);p=f[j>>2]|0;q=f[k>>2]|0;r=f[c>>2]|0}Rg(r|0,p|0,q-p|0)|0;p=i+11|0;q=b[p>>0]|0;r=q<<24>>24<0;c=r?f[i>>2]|0:i;o=r?f[i+4>>2]|0:q&255;if(o>>>0>3){q=c;r=o;l=o;while(1){d=X(h[q>>0]|h[q+1>>0]<<8|h[q+2>>0]<<16|h[q+3>>0]<<24,1540483477)|0;r=(X(d>>>24^d,1540483477)|0)^(X(r,1540483477)|0);l=l+-4|0;if(l>>>0<=3)break;else q=q+4|0}q=o+-4|0;l=q&-4;s=q-l|0;t=c+(l+4)|0;v=r}else{s=o;t=c;v=o}switch(s|0){case 3:{w=h[t+2>>0]<<16^v;x=10;break}case 2:{w=v;x=10;break}case 1:{y=v;x=11;break}default:z=v}if((x|0)==10){y=h[t+1>>0]<<8^w;x=11}if((x|0)==11)z=X(y^h[t>>0],1540483477)|0;t=X(z>>>13^z,1540483477)|0;z=t>>>15^t;t=a+4|0;y=f[t>>2]|0;w=(y|0)==0;a:do if(!w){v=y+-1|0;s=(v&y|0)==0;if(!s)if(z>>>0<y>>>0)A=z;else A=(z>>>0)%(y>>>0)|0;else A=z&v;r=f[(f[a>>2]|0)+(A<<2)>>2]|0;if((r|0)!=0?(l=f[r>>2]|0,(l|0)!=0):0){r=(o|0)==0;if(s){if(r){s=l;while(1){q=f[s+4>>2]|0;if(!((q|0)==(z|0)|(q&v|0)==(A|0))){B=A;x=52;break a}q=b[s+8+11>>0]|0;if(!((q<<24>>24<0?f[s+12>>2]|0:q&255)|0))break a;s=f[s>>2]|0;if(!s){B=A;x=52;break a}}}else C=l;while(1){s=f[C+4>>2]|0;if(!((s|0)==(z|0)|(s&v|0)==(A|0))){B=A;x=52;break a}s=C+8|0;q=b[s+11>>0]|0;d=q<<24>>24<0;D=q&255;do if(((d?f[C+12>>2]|0:D)|0)==(o|0)){q=f[s>>2]|0;if(d)if(!(Pk(q,c,o)|0))break a;else break;if((b[c>>0]|0)==(q&255)<<24>>24){q=s;E=D;F=c;do{E=E+-1|0;q=q+1|0;if(!E)break a;F=F+1|0}while((b[q>>0]|0)==(b[F>>0]|0))}}while(0);C=f[C>>2]|0;if(!C){B=A;x=52;break a}}}if(r){v=l;while(1){D=f[v+4>>2]|0;if((D|0)!=(z|0)){if(D>>>0<y>>>0)G=D;else G=(D>>>0)%(y>>>0)|0;if((G|0)!=(A|0)){B=A;x=52;break a}}D=b[v+8+11>>0]|0;if(!((D<<24>>24<0?f[v+12>>2]|0:D&255)|0))break a;v=f[v>>2]|0;if(!v){B=A;x=52;break a}}}else H=l;while(1){v=f[H+4>>2]|0;if((v|0)!=(z|0)){if(v>>>0<y>>>0)I=v;else I=(v>>>0)%(y>>>0)|0;if((I|0)!=(A|0)){B=A;x=52;break a}}v=H+8|0;r=b[v+11>>0]|0;D=r<<24>>24<0;s=r&255;do if(((D?f[H+12>>2]|0:s)|0)==(o|0)){r=f[v>>2]|0;if(D)if(!(Pk(r,c,o)|0))break a;else break;if((b[c>>0]|0)==(r&255)<<24>>24){r=v;d=s;F=c;do{d=d+-1|0;r=r+1|0;if(!d)break a;F=F+1|0}while((b[r>>0]|0)==(b[F>>0]|0))}}while(0);H=f[H>>2]|0;if(!H){B=A;x=52;break}}}else{B=A;x=52}}else{B=0;x=52}while(0);if((x|0)==52){_h(g,a,z,i);x=a+12|0;J=$(((f[x>>2]|0)+1|0)>>>0);K=$(y>>>0);L=$(n[a+16>>2]);do if(w|$(L*K)<J){A=y<<1|(y>>>0<3|(y+-1&y|0)!=0)&1;H=~~$(W($(J/L)))>>>0;Ph(a,A>>>0<H>>>0?H:A);A=f[t>>2]|0;H=A+-1|0;if(!(H&A)){M=A;N=H&z;break}if(z>>>0<A>>>0){M=A;N=z}else{M=A;N=(z>>>0)%(A>>>0)|0}}else{M=y;N=B}while(0);B=f[(f[a>>2]|0)+(N<<2)>>2]|0;if(!B){y=a+8|0;f[f[g>>2]>>2]=f[y>>2];f[y>>2]=f[g>>2];f[(f[a>>2]|0)+(N<<2)>>2]=y;y=f[g>>2]|0;N=f[y>>2]|0;if(!N)O=g;else{z=f[N+4>>2]|0;N=M+-1|0;if(N&M)if(z>>>0<M>>>0)P=z;else P=(z>>>0)%(M>>>0)|0;else P=z&N;f[(f[a>>2]|0)+(P<<2)>>2]=y;O=g}}else{f[f[g>>2]>>2]=f[B>>2];f[B>>2]=f[g>>2];O=g}f[x>>2]=(f[x>>2]|0)+1;f[O>>2]=0}O=f[i+12>>2]|0;if(O|0){if((f[m>>2]|0)!=(O|0))f[m>>2]=O;br(O)}if((b[p>>0]|0)<0)br(f[i>>2]|0);i=f[j>>2]|0;if(!i){u=e;return}if((f[k>>2]|0)!=(i|0))f[k>>2]=i;br(i);u=e;return}function dc(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,X=0,Y=0,Z=0,_=0,aa=0,ba=0,ca=Oa,da=Oa,ea=Oa,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0;e=u;u=u+48|0;g=e+12|0;h=e+32|0;i=e;j=g+16|0;f[g>>2]=0;f[g+4>>2]=0;f[g+8>>2]=0;f[g+12>>2]=0;n[j>>2]=$(1.0);k=a+80|0;l=f[k>>2]|0;f[i>>2]=0;m=i+4|0;f[m>>2]=0;f[i+8>>2]=0;if(l){if(l>>>0>1073741823)mq(i);o=l<<2;p=dn(o)|0;f[i>>2]=p;q=p+(l<<2)|0;f[i+8>>2]=q;hj(p|0,0,o|0)|0;f[m>>2]=q;q=c+48|0;o=c+40|0;l=g+4|0;r=g+12|0;s=g+8|0;t=a+40|0;v=a+64|0;w=f[d>>2]|0;d=0;x=p;y=0;z=0;A=p;B=p;C=p;while(1){p=q;D=f[p>>2]|0;E=f[p+4>>2]|0;p=o;F=on(f[p>>2]|0,f[p+4>>2]|0,w+y|0,0)|0;p=Tn(F|0,I|0,D|0,E|0)|0;E=b[(f[f[c>>2]>>2]|0)+p>>0]|0;b[h>>0]=E;p=E&255^318;a:do if(d){D=d+-1|0;F=(D&d|0)==0;if(!F)if(p>>>0<d>>>0)G=p;else G=(p>>>0)%(d>>>0)|0;else G=D&p;H=f[g>>2]|0;J=f[H+(G<<2)>>2]|0;b:do if(J|0?(K=f[J>>2]|0,K|0):0){c:do if(F){L=K;while(1){M=f[L+4>>2]|0;N=(M|0)==(p|0);if(!(N|(M&D|0)==(G|0)))break b;if(N?(b[L+8>>0]|0)==E<<24>>24:0){O=L;break c}L=f[L>>2]|0;if(!L)break b}}else{L=K;while(1){N=f[L+4>>2]|0;if((N|0)==(p|0)){if((b[L+8>>0]|0)==E<<24>>24){O=L;break c}}else{if(N>>>0<d>>>0)P=N;else P=(N>>>0)%(d>>>0)|0;if((P|0)!=(G|0))break b}L=f[L>>2]|0;if(!L)break b}}while(0);f[C+(y<<2)>>2]=f[O+12>>2];Q=x;R=z;S=B;T=A;U=C;break a}while(0);if(!F)if(p>>>0<d>>>0)V=p;else V=(p>>>0)%(d>>>0)|0;else V=D&p;J=f[H+(V<<2)>>2]|0;if(!J){X=V;Y=d;Z=0;_=40}else{if(F){K=J;while(1){K=f[K>>2]|0;if(!K){X=V;Y=d;Z=0;_=40;break a}L=f[K+4>>2]|0;if(!((L|0)==(p|0)|(L&D|0)==(V|0))){X=V;Y=d;Z=0;_=40;break a}if((b[K+8>>0]|0)==E<<24>>24){_=55;break a}}}else aa=J;while(1){aa=f[aa>>2]|0;if(!aa){X=V;Y=d;Z=0;_=40;break a}K=f[aa+4>>2]|0;if((K|0)!=(p|0)){if(K>>>0<d>>>0)ba=K;else ba=(K>>>0)%(d>>>0)|0;if((ba|0)!=(V|0)){X=V;Y=d;Z=0;_=40;break a}}if((b[aa+8>>0]|0)==E<<24>>24){_=55;break}}}}else{X=0;Y=0;Z=1;_=40}while(0);if((_|0)==40){_=0;J=dn(16)|0;b[J+8>>0]=E;f[J+12>>2]=z;f[J+4>>2]=p;f[J>>2]=0;ca=$(((f[r>>2]|0)+1|0)>>>0);da=$(Y>>>0);ea=$(n[j>>2]);do if(Z|$(ea*da)<ca){K=Y<<1|(Y>>>0<3|(Y+-1&Y|0)!=0)&1;D=~~$(W($(ca/ea)))>>>0;Mh(g,K>>>0<D>>>0?D:K);K=f[l>>2]|0;D=K+-1|0;if(!(D&K)){fa=K;ga=D&p;break}if(p>>>0<K>>>0){fa=K;ga=p}else{fa=K;ga=(p>>>0)%(K>>>0)|0}}else{fa=Y;ga=X}while(0);p=(f[g>>2]|0)+(ga<<2)|0;E=f[p>>2]|0;if(!E){f[J>>2]=f[s>>2];f[s>>2]=J;f[p>>2]=s;p=f[J>>2]|0;if(p|0){K=f[p+4>>2]|0;p=fa+-1|0;if(p&fa)if(K>>>0<fa>>>0)ha=K;else ha=(K>>>0)%(fa>>>0)|0;else ha=K&p;ia=(f[g>>2]|0)+(ha<<2)|0;_=53}}else{f[J>>2]=f[E>>2];ia=E;_=53}if((_|0)==53){_=0;f[ia>>2]=J}f[r>>2]=(f[r>>2]|0)+1;_=55}if((_|0)==55){_=0;E=t;p=f[E>>2]|0;K=on(p|0,f[E+4>>2]|0,z|0,0)|0;Rg((f[f[v>>2]>>2]|0)+K|0,h|0,p|0)|0;p=f[i>>2]|0;f[p+(y<<2)>>2]=z;Q=p;R=z+1|0;S=p;T=p;U=p}p=y+1|0;ja=f[k>>2]|0;if(p>>>0>=ja>>>0)break;d=f[l>>2]|0;x=Q;y=p;z=R;A=T;B=S;C=U}if((R|0)==(ja|0))ka=T;else{T=a+84|0;if(!(b[T>>0]|0)){U=f[a+72>>2]|0;C=f[a+68>>2]|0;B=C;if((U|0)==(C|0))la=Q;else{A=U-C>>2;C=0;do{U=B+(C<<2)|0;f[U>>2]=f[S+(f[U>>2]<<2)>>2];C=C+1|0}while(C>>>0<A>>>0);la=Q}}else{b[T>>0]=0;T=a+68|0;Q=a+72|0;A=f[Q>>2]|0;C=f[T>>2]|0;S=A-C>>2;B=C;C=A;if(ja>>>0<=S>>>0)if(ja>>>0<S>>>0?(A=B+(ja<<2)|0,(A|0)!=(C|0)):0){f[Q>>2]=C+(~((C+-4-A|0)>>>2)<<2);ma=ja}else ma=ja;else{kh(T,ja-S|0,1204);ma=f[k>>2]|0}S=f[i>>2]|0;if(!ma)la=S;else{i=f[a+68>>2]|0;a=0;do{f[i+(a<<2)>>2]=f[S+(a<<2)>>2];a=a+1|0}while(a>>>0<ma>>>0);la=S}}f[k>>2]=R;ka=la}if(!ka)na=R;else{la=f[m>>2]|0;if((la|0)!=(ka|0))f[m>>2]=la+(~((la+-4-ka|0)>>>2)<<2);br(ka);na=R}}else na=0;R=f[g+8>>2]|0;if(R|0){ka=R;do{R=ka;ka=f[ka>>2]|0;br(R)}while((ka|0)!=0)}ka=f[g>>2]|0;f[g>>2]=0;if(!ka){u=e;return na|0}br(ka);u=e;return na|0}function ec(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,i=0,j=0,k=0,l=0,m=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,X=0,Y=0,Z=0,_=0,aa=0,ba=0,ca=0,da=Oa,ea=Oa,fa=Oa,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0;e=u;u=u+48|0;g=e+16|0;i=e+12|0;j=e;k=g+16|0;f[g>>2]=0;f[g+4>>2]=0;f[g+8>>2]=0;f[g+12>>2]=0;n[k>>2]=$(1.0);l=a+80|0;m=f[l>>2]|0;f[j>>2]=0;o=j+4|0;f[o>>2]=0;f[j+8>>2]=0;if(m){if(m>>>0>1073741823)mq(j);p=m<<2;q=dn(p)|0;f[j>>2]=q;r=q+(m<<2)|0;f[j+8>>2]=r;hj(q|0,0,p|0)|0;f[o>>2]=r;r=c+48|0;p=c+40|0;m=g+4|0;s=g+12|0;t=g+8|0;v=a+40|0;w=a+64|0;x=f[d>>2]|0;d=0;y=q;z=0;A=0;B=q;C=q;D=q;while(1){q=r;E=f[q>>2]|0;F=f[q+4>>2]|0;q=p;G=on(f[q>>2]|0,f[q+4>>2]|0,x+z|0,0)|0;q=Tn(G|0,I|0,E|0,F|0)|0;F=(f[f[c>>2]>>2]|0)+q|0;q=h[F>>0]|h[F+1>>0]<<8|h[F+2>>0]<<16|h[F+3>>0]<<24;f[i>>2]=q;F=q^318;a:do if(d){E=d+-1|0;G=(E&d|0)==0;if(!G)if(F>>>0<d>>>0)H=F;else H=(F>>>0)%(d>>>0)|0;else H=E&F;J=f[g>>2]|0;K=f[J+(H<<2)>>2]|0;b:do if(K|0?(L=f[K>>2]|0,L|0):0){c:do if(G){M=L;while(1){N=f[M+4>>2]|0;O=(N|0)==(F|0);if(!(O|(N&E|0)==(H|0)))break b;if(O?(f[M+8>>2]|0)==(q|0):0){P=M;break c}M=f[M>>2]|0;if(!M)break b}}else{M=L;while(1){O=f[M+4>>2]|0;if((O|0)==(F|0)){if((f[M+8>>2]|0)==(q|0)){P=M;break c}}else{if(O>>>0<d>>>0)Q=O;else Q=(O>>>0)%(d>>>0)|0;if((Q|0)!=(H|0))break b}M=f[M>>2]|0;if(!M)break b}}while(0);f[D+(z<<2)>>2]=f[P+12>>2];R=y;S=A;T=C;U=B;V=D;break a}while(0);if(!G)if(F>>>0<d>>>0)X=F;else X=(F>>>0)%(d>>>0)|0;else X=E&F;K=f[J+(X<<2)>>2]|0;if(!K){Y=X;Z=d;_=0;aa=40}else{if(G){L=K;while(1){L=f[L>>2]|0;if(!L){Y=X;Z=d;_=0;aa=40;break a}M=f[L+4>>2]|0;if(!((M|0)==(F|0)|(M&E|0)==(X|0))){Y=X;Z=d;_=0;aa=40;break a}if((f[L+8>>2]|0)==(q|0)){aa=55;break a}}}else ba=K;while(1){ba=f[ba>>2]|0;if(!ba){Y=X;Z=d;_=0;aa=40;break a}L=f[ba+4>>2]|0;if((L|0)!=(F|0)){if(L>>>0<d>>>0)ca=L;else ca=(L>>>0)%(d>>>0)|0;if((ca|0)!=(X|0)){Y=X;Z=d;_=0;aa=40;break a}}if((f[ba+8>>2]|0)==(q|0)){aa=55;break}}}}else{Y=0;Z=0;_=1;aa=40}while(0);if((aa|0)==40){aa=0;K=dn(16)|0;f[K+8>>2]=q;f[K+12>>2]=A;f[K+4>>2]=F;f[K>>2]=0;da=$(((f[s>>2]|0)+1|0)>>>0);ea=$(Z>>>0);fa=$(n[k>>2]);do if(_|$(fa*ea)<da){L=Z<<1|(Z>>>0<3|(Z+-1&Z|0)!=0)&1;E=~~$(W($(da/fa)))>>>0;ti(g,L>>>0<E>>>0?E:L);L=f[m>>2]|0;E=L+-1|0;if(!(E&L)){ga=L;ha=E&F;break}if(F>>>0<L>>>0){ga=L;ha=F}else{ga=L;ha=(F>>>0)%(L>>>0)|0}}else{ga=Z;ha=Y}while(0);F=(f[g>>2]|0)+(ha<<2)|0;q=f[F>>2]|0;if(!q){f[K>>2]=f[t>>2];f[t>>2]=K;f[F>>2]=t;F=f[K>>2]|0;if(F|0){L=f[F+4>>2]|0;F=ga+-1|0;if(F&ga)if(L>>>0<ga>>>0)ia=L;else ia=(L>>>0)%(ga>>>0)|0;else ia=L&F;ja=(f[g>>2]|0)+(ia<<2)|0;aa=53}}else{f[K>>2]=f[q>>2];ja=q;aa=53}if((aa|0)==53){aa=0;f[ja>>2]=K}f[s>>2]=(f[s>>2]|0)+1;aa=55}if((aa|0)==55){aa=0;q=v;F=f[q>>2]|0;L=on(F|0,f[q+4>>2]|0,A|0,0)|0;Rg((f[f[w>>2]>>2]|0)+L|0,i|0,F|0)|0;F=f[j>>2]|0;f[F+(z<<2)>>2]=A;R=F;S=A+1|0;T=F;U=F;V=F}F=z+1|0;ka=f[l>>2]|0;if(F>>>0>=ka>>>0)break;d=f[m>>2]|0;y=R;z=F;A=S;B=U;C=T;D=V}if((S|0)==(ka|0))la=U;else{U=a+84|0;if(!(b[U>>0]|0)){V=f[a+72>>2]|0;D=f[a+68>>2]|0;C=D;if((V|0)==(D|0))ma=R;else{B=V-D>>2;D=0;do{V=C+(D<<2)|0;f[V>>2]=f[T+(f[V>>2]<<2)>>2];D=D+1|0}while(D>>>0<B>>>0);ma=R}}else{b[U>>0]=0;U=a+68|0;R=a+72|0;B=f[R>>2]|0;D=f[U>>2]|0;T=B-D>>2;C=D;D=B;if(ka>>>0<=T>>>0)if(ka>>>0<T>>>0?(B=C+(ka<<2)|0,(B|0)!=(D|0)):0){f[R>>2]=D+(~((D+-4-B|0)>>>2)<<2);na=ka}else na=ka;else{kh(U,ka-T|0,1204);na=f[l>>2]|0}T=f[j>>2]|0;if(!na)ma=T;else{j=f[a+68>>2]|0;a=0;do{f[j+(a<<2)>>2]=f[T+(a<<2)>>2];a=a+1|0}while(a>>>0<na>>>0);ma=T}}f[l>>2]=S;la=ma}if(!la)oa=S;else{ma=f[o>>2]|0;if((ma|0)!=(la|0))f[o>>2]=ma+(~((ma+-4-la|0)>>>2)<<2);br(la);oa=S}}else oa=0;S=f[g+8>>2]|0;if(S|0){la=S;do{S=la;la=f[la>>2]|0;br(S)}while((la|0)!=0)}la=f[g>>2]|0;f[g>>2]=0;if(!la){u=e;return oa|0}br(la);u=e;return oa|0}function fc(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0;e=u;u=u+96|0;g=e+92|0;h=e+88|0;i=e+72|0;j=e+48|0;k=e+24|0;l=e;m=a+16|0;n=f[m>>2]|0;o=f[c>>2]|0;f[i>>2]=n;f[i+4>>2]=o;c=i+8|0;f[c>>2]=o;b[i+12>>0]=1;p=f[(f[n+28>>2]|0)+(o<<2)>>2]|0;n=a+20|0;q=f[n>>2]|0;r=f[q>>2]|0;if((f[q+4>>2]|0)-r>>2>>>0<=p>>>0)mq(q);q=a+8|0;s=f[(f[q>>2]|0)+(f[r+(p<<2)>>2]<<2)>>2]|0;p=a+4|0;r=f[p>>2]|0;if(!(b[r+84>>0]|0))t=f[(f[r+68>>2]|0)+(s<<2)>>2]|0;else t=s;f[j>>2]=0;f[j+4>>2]=0;f[j+8>>2]=0;f[j+12>>2]=0;f[j+16>>2]=0;f[j+20>>2]=0;f[h>>2]=t;t=b[r+24>>0]|0;f[g>>2]=f[h>>2];ub(r,g,t,j)|0;t=a+28|0;a=(f[t>>2]|0)==0;a:do if((o|0)!=-1){r=k+8|0;s=j+8|0;v=k+16|0;w=j+16|0;x=l+8|0;y=l+16|0;z=o;A=o;B=0;C=0;D=0;E=0;F=0;G=0;H=a;J=o;while(1){do if(H){K=J+1|0;if((J|0)!=-1){L=((K>>>0)%3|0|0)==0?J+-2|0:K;if((z|0)!=-1)if(!((z>>>0)%3|0)){M=z;N=z+2|0;O=L;P=z;break}else{M=z;N=z+-1|0;O=L;P=z;break}else{M=-1;N=-1;O=L;P=-1}}else{M=z;N=-1;O=-1;P=-1}}else{L=A+1|0;K=((L>>>0)%3|0|0)==0?A+-2|0:L;if(!((A>>>0)%3|0)){M=z;N=A+2|0;O=K;P=J;break}else{M=z;N=A+-1|0;O=K;P=J;break}}while(0);K=f[(f[(f[m>>2]|0)+28>>2]|0)+(O<<2)>>2]|0;Q=f[n>>2]|0;L=f[Q>>2]|0;if((f[Q+4>>2]|0)-L>>2>>>0<=K>>>0){R=17;break}S=f[(f[q>>2]|0)+(f[L+(K<<2)>>2]<<2)>>2]|0;K=f[p>>2]|0;if(!(b[K+84>>0]|0))T=f[(f[K+68>>2]|0)+(S<<2)>>2]|0;else T=S;f[k>>2]=0;f[k+4>>2]=0;f[k+8>>2]=0;f[k+12>>2]=0;f[k+16>>2]=0;f[k+20>>2]=0;f[h>>2]=T;S=b[K+24>>0]|0;f[g>>2]=f[h>>2];ub(K,g,S,k)|0;S=f[(f[(f[m>>2]|0)+28>>2]|0)+(N<<2)>>2]|0;U=f[n>>2]|0;K=f[U>>2]|0;if((f[U+4>>2]|0)-K>>2>>>0<=S>>>0){R=21;break}L=f[(f[q>>2]|0)+(f[K+(S<<2)>>2]<<2)>>2]|0;S=f[p>>2]|0;if(!(b[S+84>>0]|0))V=f[(f[S+68>>2]|0)+(L<<2)>>2]|0;else V=L;f[l>>2]=0;f[l+4>>2]=0;f[l+8>>2]=0;f[l+12>>2]=0;f[l+16>>2]=0;f[l+20>>2]=0;f[h>>2]=V;L=b[S+24>>0]|0;f[g>>2]=f[h>>2];ub(S,g,L,l)|0;L=k;S=j;K=f[S>>2]|0;W=f[S+4>>2]|0;S=Vn(f[L>>2]|0,f[L+4>>2]|0,K|0,W|0)|0;L=I;X=r;Y=s;Z=f[Y>>2]|0;_=f[Y+4>>2]|0;Y=Vn(f[X>>2]|0,f[X+4>>2]|0,Z|0,_|0)|0;X=I;$=v;aa=w;ba=f[aa>>2]|0;ca=f[aa+4>>2]|0;aa=Vn(f[$>>2]|0,f[$+4>>2]|0,ba|0,ca|0)|0;$=I;da=l;ea=Vn(f[da>>2]|0,f[da+4>>2]|0,K|0,W|0)|0;W=I;K=x;da=Vn(f[K>>2]|0,f[K+4>>2]|0,Z|0,_|0)|0;_=I;Z=y;K=Vn(f[Z>>2]|0,f[Z+4>>2]|0,ba|0,ca|0)|0;ca=I;ba=on(K|0,ca|0,Y|0,X|0)|0;Z=I;fa=on(da|0,_|0,aa|0,$|0)|0;ga=I;ha=on(ea|0,W|0,aa|0,$|0)|0;$=I;aa=on(K|0,ca|0,S|0,L|0)|0;ca=I;K=on(da|0,_|0,S|0,L|0)|0;L=I;S=on(ea|0,W|0,Y|0,X|0)|0;X=I;Y=Vn(B|0,C|0,fa|0,ga|0)|0;ga=Tn(Y|0,I|0,ba|0,Z|0)|0;Z=I;ba=Tn(ha|0,$|0,D|0,E|0)|0;$=Vn(ba|0,I|0,aa|0,ca|0)|0;ca=I;aa=Vn(F|0,G|0,S|0,X|0)|0;X=Tn(aa|0,I|0,K|0,L|0)|0;L=I;xg(i);A=f[c>>2]|0;K=(f[t>>2]|0)==0;if((A|0)==-1){ia=K;ja=Z;ka=ga;la=ca;ma=$;na=L;oa=X;break a}else{z=M;B=ga;C=Z;D=$;E=ca;F=X;G=L;H=K;J=P}}if((R|0)==17)mq(Q);else if((R|0)==21)mq(U)}else{ia=a;ja=0;ka=0;la=0;ma=0;na=0;oa=0}while(0);a=(ja|0)>-1|(ja|0)==-1&ka>>>0>4294967295;U=Vn(0,0,ka|0,ja|0)|0;R=a?ja:I;Q=(la|0)>-1|(la|0)==-1&ma>>>0>4294967295;P=Vn(0,0,ma|0,la|0)|0;M=Q?la:I;t=(na|0)>-1|(na|0)==-1&oa>>>0>4294967295;c=Vn(0,0,oa|0,na|0)|0;i=Tn((Q?ma:P)|0,M|0,(t?oa:c)|0,(t?na:I)|0)|0;t=Tn(i|0,I|0,(a?ka:U)|0,R|0)|0;R=I;if(ia){if((t|0)<=536870912){pa=ka;qa=ma;ra=oa;f[d>>2]=pa;sa=d+4|0;f[sa>>2]=qa;ta=d+8|0;f[ta>>2]=ra;u=e;return}ia=Wn(t|0,R|0,29)|0;U=ia&7;ia=zk(ka|0,ja|0,U|0,0)|0;a=zk(ma|0,la|0,U|0,0)|0;i=zk(oa|0,na|0,U|0,0)|0;pa=ia;qa=a;ra=i;f[d>>2]=pa;sa=d+4|0;f[sa>>2]=qa;ta=d+8|0;f[ta>>2]=ra;u=e;return}else{if(!((R|0)>0|(R|0)==0&t>>>0>536870912)){pa=ka;qa=ma;ra=oa;f[d>>2]=pa;sa=d+4|0;f[sa>>2]=qa;ta=d+8|0;f[ta>>2]=ra;u=e;return}i=Wn(t|0,R|0,29)|0;R=I;t=zk(ka|0,ja|0,i|0,R|0)|0;ja=zk(ma|0,la|0,i|0,R|0)|0;la=zk(oa|0,na|0,i|0,R|0)|0;pa=t;qa=ja;ra=la;f[d>>2]=pa;sa=d+4|0;f[sa>>2]=qa;ta=d+8|0;f[ta>>2]=ra;u=e;return}}function gc(a,c,e){a=a|0;c=c|0;e=e|0;var g=0,i=0,j=0,k=0,l=0,m=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=Oa,V=Oa,X=Oa,Y=0,Z=0,_=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0;g=u;u=u+48|0;i=g+28|0;j=g+8|0;k=g;l=g+16|0;m=i+16|0;f[i>>2]=0;f[i+4>>2]=0;f[i+8>>2]=0;f[i+12>>2]=0;n[m>>2]=$(1.0);o=a+80|0;p=f[o>>2]|0;f[l>>2]=0;q=l+4|0;f[q>>2]=0;f[l+8>>2]=0;if(p){if(p>>>0>1073741823)mq(l);r=p<<2;s=dn(r)|0;f[l>>2]=s;t=s+(p<<2)|0;f[l+8>>2]=t;hj(s|0,0,r|0)|0;f[q>>2]=t;t=f[e>>2]|0;e=c+48|0;r=c+40|0;s=i+4|0;p=i+12|0;v=i+8|0;w=a+40|0;x=a+64|0;y=0;z=0;while(1){A=e;B=f[A>>2]|0;C=f[A+4>>2]|0;A=r;D=on(f[A>>2]|0,f[A+4>>2]|0,t+y|0,0)|0;A=Tn(D|0,I|0,B|0,C|0)|0;C=(f[f[c>>2]>>2]|0)+A|0;A=C;B=h[A>>0]|h[A+1>>0]<<8|h[A+2>>0]<<16|h[A+3>>0]<<24;A=C+4|0;C=h[A>>0]|h[A+1>>0]<<8|h[A+2>>0]<<16|h[A+3>>0]<<24;A=j;f[A>>2]=B;f[A+4>>2]=C;A=k;f[A>>2]=B;f[A+4>>2]=C;C=kf(i,k)|0;if(!C){A=k;B=f[A>>2]|0;D=f[A+4>>2]|0;A=B&65535;E=Wn(B|0,D|0,16)|0;F=E&65535;G=D&65535;H=Wn(B|0,D|0,48)|0;J=H&65535;K=((((A^318)&65535)+239^E&65535)+239^D&65535)+239^H&65535;H=f[s>>2]|0;E=(H|0)==0;a:do if(!E){L=H+-1|0;M=(L&H|0)==0;if(!M)if(K>>>0<H>>>0)N=K;else N=(K>>>0)%(H>>>0)|0;else N=K&L;O=f[(f[i>>2]|0)+(N<<2)>>2]|0;if((O|0)!=0?(P=f[O>>2]|0,(P|0)!=0):0){if(M){M=P;while(1){O=f[M+4>>2]|0;if(!((O|0)==(K|0)|(O&L|0)==(N|0))){Q=N;R=31;break a}O=M+8|0;if((((d[O>>1]|0)==A<<16>>16?(d[O+2>>1]|0)==F<<16>>16:0)?(d[M+12>>1]|0)==G<<16>>16:0)?(d[O+6>>1]|0)==J<<16>>16:0)break a;M=f[M>>2]|0;if(!M){Q=N;R=31;break a}}}else S=P;while(1){M=f[S+4>>2]|0;if((M|0)!=(K|0)){if(M>>>0<H>>>0)T=M;else T=(M>>>0)%(H>>>0)|0;if((T|0)!=(N|0)){Q=N;R=31;break a}}M=S+8|0;if((((d[M>>1]|0)==A<<16>>16?(d[M+2>>1]|0)==F<<16>>16:0)?(d[S+12>>1]|0)==G<<16>>16:0)?(d[M+6>>1]|0)==J<<16>>16:0)break a;S=f[S>>2]|0;if(!S){Q=N;R=31;break}}}else{Q=N;R=31}}else{Q=0;R=31}while(0);if((R|0)==31){R=0;J=dn(20)|0;G=J+8|0;F=G;d[F>>1]=B;d[F+2>>1]=B>>>16;F=G+4|0;d[F>>1]=D;d[F+2>>1]=D>>>16;f[J+16>>2]=z;f[J+4>>2]=K;f[J>>2]=0;U=$(((f[p>>2]|0)+1|0)>>>0);V=$(H>>>0);X=$(n[m>>2]);do if(E|$(X*V)<U){F=H<<1|(H>>>0<3|(H+-1&H|0)!=0)&1;G=~~$(W($(U/X)))>>>0;Ch(i,F>>>0<G>>>0?G:F);F=f[s>>2]|0;G=F+-1|0;if(!(G&F)){Y=F;Z=G&K;break}if(K>>>0<F>>>0){Y=F;Z=K}else{Y=F;Z=(K>>>0)%(F>>>0)|0}}else{Y=H;Z=Q}while(0);H=(f[i>>2]|0)+(Z<<2)|0;K=f[H>>2]|0;if(!K){f[J>>2]=f[v>>2];f[v>>2]=J;f[H>>2]=v;H=f[J>>2]|0;if(H|0){E=f[H+4>>2]|0;H=Y+-1|0;if(H&Y)if(E>>>0<Y>>>0)_=E;else _=(E>>>0)%(Y>>>0)|0;else _=E&H;aa=(f[i>>2]|0)+(_<<2)|0;R=44}}else{f[J>>2]=f[K>>2];aa=K;R=44}if((R|0)==44){R=0;f[aa>>2]=J}f[p>>2]=(f[p>>2]|0)+1}K=w;H=f[K>>2]|0;E=on(H|0,f[K+4>>2]|0,z|0,0)|0;Rg((f[f[x>>2]>>2]|0)+E|0,j|0,H|0)|0;H=f[l>>2]|0;f[H+(y<<2)>>2]=z;ba=z+1|0;ca=H}else{H=f[l>>2]|0;f[H+(y<<2)>>2]=f[C+16>>2];ba=z;ca=H}y=y+1|0;da=f[o>>2]|0;if(y>>>0>=da>>>0)break;else z=ba}if((ba|0)==(da|0))ea=ca;else{z=a+84|0;if(!(b[z>>0]|0)){y=f[a+72>>2]|0;j=f[a+68>>2]|0;x=j;if((y|0)==(j|0))fa=ca;else{w=y-j>>2;j=0;do{y=x+(j<<2)|0;f[y>>2]=f[ca+(f[y>>2]<<2)>>2];j=j+1|0}while(j>>>0<w>>>0);fa=ca}}else{b[z>>0]=0;z=a+68|0;ca=a+72|0;w=f[ca>>2]|0;j=f[z>>2]|0;x=w-j>>2;y=j;j=w;if(da>>>0<=x>>>0)if(da>>>0<x>>>0?(w=y+(da<<2)|0,(w|0)!=(j|0)):0){f[ca>>2]=j+(~((j+-4-w|0)>>>2)<<2);ga=da}else ga=da;else{kh(z,da-x|0,1204);ga=f[o>>2]|0}x=f[l>>2]|0;if(!ga)fa=x;else{l=f[a+68>>2]|0;a=0;do{f[l+(a<<2)>>2]=f[x+(a<<2)>>2];a=a+1|0}while(a>>>0<ga>>>0);fa=x}}f[o>>2]=ba;ea=fa}if(!ea)ha=ba;else{fa=f[q>>2]|0;if((fa|0)!=(ea|0))f[q>>2]=fa+(~((fa+-4-ea|0)>>>2)<<2);br(ea);ha=ba}}else ha=0;ba=f[i+8>>2]|0;if(ba|0){ea=ba;do{ba=ea;ea=f[ea>>2]|0;br(ba)}while((ea|0)!=0)}ea=f[i>>2]|0;f[i>>2]=0;if(!ea){u=g;return ha|0}br(ea);u=g;return ha|0}function hc(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0;c=u;u=u+16|0;d=c+8|0;e=c;g=c+4|0;h=a+16|0;i=f[h>>2]|0;j=a+20|0;k=f[j>>2]|0;if((k|0)==(i|0))l=i;else{m=k+(~((k+-4-i|0)>>>2)<<2)|0;f[j>>2]=m;l=m}m=a+24|0;if((l|0)==(f[m>>2]|0)){Ci(h,b);n=f[h>>2]|0;o=f[j>>2]|0}else{f[l>>2]=f[b>>2];k=l+4|0;f[j>>2]=k;n=i;o=k}k=f[a+8>>2]|0;i=(f[k+100>>2]|0)-(f[k+96>>2]|0)|0;k=(i|0)/12|0;if((n|0)==(o|0)){u=c;return 1}n=a+28|0;l=(i|0)>0;i=a+164|0;p=a+12|0;q=a+76|0;r=a+80|0;s=a+72|0;t=a+152|0;v=a+84|0;w=a+272|0;x=a+276|0;y=a+268|0;z=a+168|0;A=a+140|0;B=a+120|0;C=o;do{o=f[C+-4>>2]|0;f[b>>2]=o;a:do if((o|0)!=-1?(D=(o>>>0)/3|0,E=f[n>>2]|0,(f[E+(D>>>5<<2)>>2]&1<<(D&31)|0)==0):0){if(l){D=0;F=E;b:while(1){E=D+1|0;f[i>>2]=(f[i>>2]|0)+1;G=f[b>>2]|0;H=(G|0)==-1?-1:(G>>>0)/3|0;G=F+(H>>>5<<2)|0;f[G>>2]=1<<(H&31)|f[G>>2];G=f[q>>2]|0;if((G|0)==(f[r>>2]|0))Ci(s,b);else{f[G>>2]=f[b>>2];f[q>>2]=G+4}G=f[b>>2]|0;if((G|0)==-1)I=-1;else I=f[(f[f[p>>2]>>2]|0)+(G<<2)>>2]|0;J=(f[(f[t>>2]|0)+(I<<2)>>2]|0)!=-1;K=(f[v>>2]|0)+(I>>>5<<2)|0;L=1<<(I&31);M=f[K>>2]|0;do if(!(M&L)){f[K>>2]=M|L;if(J){N=f[b>>2]|0;O=30;break}f[d>>2]=0;P=f[w>>2]|0;if((P|0)==(f[x>>2]|0))Ci(y,d);else{f[P>>2]=0;f[w>>2]=P+4}P=f[b>>2]|0;Q=P+1|0;if((P|0)!=-1?(R=((Q>>>0)%3|0|0)==0?P+-2|0:Q,(R|0)!=-1):0)S=f[(f[(f[p>>2]|0)+12>>2]|0)+(R<<2)>>2]|0;else S=-1;f[b>>2]=S}else{N=G;O=30}while(0);if((O|0)==30){O=0;G=N+1|0;if((N|0)==-1){O=35;break}L=((G>>>0)%3|0|0)==0?N+-2|0:G;if((L|0)==-1)T=-1;else T=f[(f[(f[p>>2]|0)+12>>2]|0)+(L<<2)>>2]|0;f[e>>2]=T;L=(((N>>>0)%3|0|0)==0?2:-1)+N|0;if((L|0)==-1)U=-1;else U=f[(f[(f[p>>2]|0)+12>>2]|0)+(L<<2)>>2]|0;L=(T|0)==-1;M=L?-1:(T>>>0)/3|0;V=(U|0)==-1;W=V?-1:(U>>>0)/3|0;K=((G>>>0)%3|0|0)==0?N+-2|0:G;if(((K|0)!=-1?(G=f[(f[p>>2]|0)+12>>2]|0,R=f[G+(K<<2)>>2]|0,(R|0)!=-1):0)?(K=(R>>>0)/3|0,R=f[n>>2]|0,(f[R+(K>>>5<<2)>>2]&1<<(K&31)|0)==0):0){K=(((N>>>0)%3|0|0)==0?2:-1)+N|0;do if((K|0)!=-1){Q=f[G+(K<<2)>>2]|0;if((Q|0)==-1)break;P=(Q>>>0)/3|0;if(!(f[R+(P>>>5<<2)>>2]&1<<(P&31))){O=63;break b}}while(0);if(!V)jf(a,f[i>>2]|0,H,0,W);f[d>>2]=3;R=f[w>>2]|0;if((R|0)==(f[x>>2]|0))Ci(y,d);else{f[R>>2]=3;f[w>>2]=R+4}X=f[e>>2]|0}else{if(!L){jf(a,f[i>>2]|0,H,1,M);R=f[b>>2]|0;if((R|0)==-1){O=44;break}else Y=R}else Y=N;R=(((Y>>>0)%3|0|0)==0?2:-1)+Y|0;if((R|0)==-1){O=44;break}K=f[(f[(f[p>>2]|0)+12>>2]|0)+(R<<2)>>2]|0;if((K|0)==-1){O=44;break}R=(K>>>0)/3|0;if(f[(f[n>>2]|0)+(R>>>5<<2)>>2]&1<<(R&31)|0){O=44;break}f[d>>2]=5;R=f[w>>2]|0;if((R|0)==(f[x>>2]|0))Ci(y,d);else{f[R>>2]=5;f[w>>2]=R+4}X=U}f[b>>2]=X}if((E|0)>=(k|0))break a;D=E;F=f[n>>2]|0}do if((O|0)==35){O=0;f[e>>2]=-1;O=46}else if((O|0)==44){O=0;if(V)O=46;else{jf(a,f[i>>2]|0,H,0,W);O=46}}else if((O|0)==63){O=0;f[d>>2]=1;F=f[w>>2]|0;if((F|0)==(f[x>>2]|0))Ci(y,d);else{f[F>>2]=1;f[w>>2]=F+4}f[z>>2]=(f[z>>2]|0)+1;if(J?(F=f[(f[t>>2]|0)+(I<<2)>>2]|0,(1<<(F&31)&f[(f[A>>2]|0)+(F>>>5<<2)>>2]|0)==0):0){f[g>>2]=f[b>>2];f[d>>2]=f[g>>2];Ce(a,d,0)|0}F=f[i>>2]|0;f[d>>2]=H;D=Sd(B,d)|0;f[D>>2]=F;F=f[j>>2]|0;f[F+-4>>2]=U;if((F|0)==(f[m>>2]|0)){Ci(h,e);break}else{f[F>>2]=f[e>>2];f[j>>2]=F+4;break}}while(0);if((O|0)==46){O=0;f[d>>2]=7;F=f[w>>2]|0;if((F|0)==(f[x>>2]|0))Ci(y,d);else{f[F>>2]=7;f[w>>2]=F+4}f[j>>2]=(f[j>>2]|0)+-4}}}else O=11;while(0);if((O|0)==11){O=0;f[j>>2]=C+-4}C=f[j>>2]|0}while((f[h>>2]|0)!=(C|0));u=c;return 1}function ic(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,i=0,j=0,k=0,l=0,m=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=Oa,V=Oa,X=Oa,Y=0,Z=0,_=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0;e=u;u=u+48|0;g=e+20|0;i=e+16|0;j=e+12|0;k=e;l=g+16|0;f[g>>2]=0;f[g+4>>2]=0;f[g+8>>2]=0;f[g+12>>2]=0;n[l>>2]=$(1.0);m=a+80|0;o=f[m>>2]|0;f[k>>2]=0;p=k+4|0;f[p>>2]=0;f[k+8>>2]=0;if(o){if(o>>>0>1073741823)mq(k);q=o<<2;r=dn(q)|0;f[k>>2]=r;s=r+(o<<2)|0;f[k+8>>2]=s;hj(r|0,0,q|0)|0;f[p>>2]=s;s=f[d>>2]|0;d=c+48|0;q=c+40|0;r=g+4|0;o=g+12|0;t=g+8|0;v=a+40|0;w=a+64|0;x=0;y=0;while(1){z=d;A=f[z>>2]|0;B=f[z+4>>2]|0;z=q;C=on(f[z>>2]|0,f[z+4>>2]|0,s+x|0,0)|0;z=Tn(C|0,I|0,A|0,B|0)|0;B=(f[f[c>>2]>>2]|0)+z|0;z=h[B>>0]|h[B+1>>0]<<8|h[B+2>>0]<<16|h[B+3>>0]<<24;f[i>>2]=z;f[j>>2]=z;z=pf(g,j)|0;if(!z){B=f[j>>2]|0;A=B&255;C=B>>>8;D=C&255;E=B>>>16;F=E&255;G=B>>>24;H=G&255;J=C&255;C=E&255;E=(((B&255^318)+239^J)+239^C)+239^G;G=f[r>>2]|0;K=(G|0)==0;a:do if(!K){L=G+-1|0;M=(L&G|0)==0;if(!M)if(E>>>0<G>>>0)N=E;else N=(E>>>0)%(G>>>0)|0;else N=E&L;O=f[(f[g>>2]|0)+(N<<2)>>2]|0;if((O|0)!=0?(P=f[O>>2]|0,(P|0)!=0):0){if(M){M=P;while(1){O=f[M+4>>2]|0;if(!((O|0)==(E|0)|(O&L|0)==(N|0))){Q=N;R=31;break a}O=M+8|0;if((((b[O>>0]|0)==A<<24>>24?(b[O+1>>0]|0)==D<<24>>24:0)?(b[O+2>>0]|0)==F<<24>>24:0)?(b[O+3>>0]|0)==H<<24>>24:0)break a;M=f[M>>2]|0;if(!M){Q=N;R=31;break a}}}else S=P;while(1){M=f[S+4>>2]|0;if((M|0)!=(E|0)){if(M>>>0<G>>>0)T=M;else T=(M>>>0)%(G>>>0)|0;if((T|0)!=(N|0)){Q=N;R=31;break a}}M=S+8|0;if((((b[M>>0]|0)==A<<24>>24?(b[M+1>>0]|0)==D<<24>>24:0)?(b[M+2>>0]|0)==F<<24>>24:0)?(b[M+3>>0]|0)==H<<24>>24:0)break a;S=f[S>>2]|0;if(!S){Q=N;R=31;break}}}else{Q=N;R=31}}else{Q=0;R=31}while(0);if((R|0)==31){R=0;H=dn(16)|0;F=H+8|0;D=B&-16776961|C<<16|J<<8;b[F>>0]=D;b[F+1>>0]=D>>8;b[F+2>>0]=D>>16;b[F+3>>0]=D>>24;f[H+12>>2]=y;f[H+4>>2]=E;f[H>>2]=0;U=$(((f[o>>2]|0)+1|0)>>>0);V=$(G>>>0);X=$(n[l>>2]);do if(K|$(X*V)<U){D=G<<1|(G>>>0<3|(G+-1&G|0)!=0)&1;F=~~$(W($(U/X)))>>>0;Jh(g,D>>>0<F>>>0?F:D);D=f[r>>2]|0;F=D+-1|0;if(!(F&D)){Y=D;Z=F&E;break}if(E>>>0<D>>>0){Y=D;Z=E}else{Y=D;Z=(E>>>0)%(D>>>0)|0}}else{Y=G;Z=Q}while(0);G=(f[g>>2]|0)+(Z<<2)|0;E=f[G>>2]|0;if(!E){f[H>>2]=f[t>>2];f[t>>2]=H;f[G>>2]=t;G=f[H>>2]|0;if(G|0){K=f[G+4>>2]|0;G=Y+-1|0;if(G&Y)if(K>>>0<Y>>>0)_=K;else _=(K>>>0)%(Y>>>0)|0;else _=K&G;aa=(f[g>>2]|0)+(_<<2)|0;R=44}}else{f[H>>2]=f[E>>2];aa=E;R=44}if((R|0)==44){R=0;f[aa>>2]=H}f[o>>2]=(f[o>>2]|0)+1}E=v;G=f[E>>2]|0;K=on(G|0,f[E+4>>2]|0,y|0,0)|0;Rg((f[f[w>>2]>>2]|0)+K|0,i|0,G|0)|0;G=f[k>>2]|0;f[G+(x<<2)>>2]=y;ba=y+1|0;ca=G}else{G=f[k>>2]|0;f[G+(x<<2)>>2]=f[z+12>>2];ba=y;ca=G}x=x+1|0;da=f[m>>2]|0;if(x>>>0>=da>>>0)break;else y=ba}if((ba|0)==(da|0))ea=ca;else{y=a+84|0;if(!(b[y>>0]|0)){x=f[a+72>>2]|0;i=f[a+68>>2]|0;w=i;if((x|0)==(i|0))fa=ca;else{v=x-i>>2;i=0;do{x=w+(i<<2)|0;f[x>>2]=f[ca+(f[x>>2]<<2)>>2];i=i+1|0}while(i>>>0<v>>>0);fa=ca}}else{b[y>>0]=0;y=a+68|0;ca=a+72|0;v=f[ca>>2]|0;i=f[y>>2]|0;w=v-i>>2;x=i;i=v;if(da>>>0<=w>>>0)if(da>>>0<w>>>0?(v=x+(da<<2)|0,(v|0)!=(i|0)):0){f[ca>>2]=i+(~((i+-4-v|0)>>>2)<<2);ga=da}else ga=da;else{kh(y,da-w|0,1204);ga=f[m>>2]|0}w=f[k>>2]|0;if(!ga)fa=w;else{k=f[a+68>>2]|0;a=0;do{f[k+(a<<2)>>2]=f[w+(a<<2)>>2];a=a+1|0}while(a>>>0<ga>>>0);fa=w}}f[m>>2]=ba;ea=fa}if(!ea)ha=ba;else{fa=f[p>>2]|0;if((fa|0)!=(ea|0))f[p>>2]=fa+(~((fa+-4-ea|0)>>>2)<<2);br(ea);ha=ba}}else ha=0;ba=f[g+8>>2]|0;if(ba|0){ea=ba;do{ba=ea;ea=f[ea>>2]|0;br(ba)}while((ea|0)!=0)}ea=f[g>>2]|0;f[g>>2]=0;if(!ea){u=e;return ha|0}br(ea);u=e;return ha|0}function jc(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=Oa,V=Oa,X=Oa,Y=0,Z=0,_=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0;e=u;u=u+80|0;g=e+48|0;h=e+32|0;i=e+16|0;j=e;k=g+16|0;f[g>>2]=0;f[g+4>>2]=0;f[g+8>>2]=0;f[g+12>>2]=0;n[k>>2]=$(1.0);l=a+80|0;m=f[l>>2]|0;f[j>>2]=0;o=j+4|0;f[o>>2]=0;f[j+8>>2]=0;if(m){if(m>>>0>1073741823)mq(j);p=m<<2;q=dn(p)|0;f[j>>2]=q;r=q+(m<<2)|0;f[j+8>>2]=r;hj(q|0,0,p|0)|0;f[o>>2]=r;r=f[d>>2]|0;d=c+48|0;p=c+40|0;q=i+4|0;m=i+8|0;s=i+12|0;t=g+4|0;v=g+12|0;w=g+8|0;x=a+40|0;y=a+64|0;z=0;A=0;while(1){B=d;C=f[B>>2]|0;D=f[B+4>>2]|0;B=p;E=on(f[B>>2]|0,f[B+4>>2]|0,r+A|0,0)|0;B=Tn(E|0,I|0,C|0,D|0)|0;D=(f[f[c>>2]>>2]|0)+B|0;B=h;C=D;E=B+16|0;do{b[B>>0]=b[C>>0]|0;B=B+1|0;C=C+1|0}while((B|0)<(E|0));Xl(i|0,D|0,16)|0;C=Ff(g,i)|0;if(!C){B=f[i>>2]|0;E=f[q>>2]|0;F=f[m>>2]|0;G=f[s>>2]|0;H=(((B^318)+239^E)+239^F)+239^G;J=f[t>>2]|0;K=(J|0)==0;a:do if(!K){L=J+-1|0;M=(L&J|0)==0;if(!M)if(H>>>0<J>>>0)N=H;else N=(H>>>0)%(J>>>0)|0;else N=H&L;O=f[(f[g>>2]|0)+(N<<2)>>2]|0;if((O|0)!=0?(P=f[O>>2]|0,(P|0)!=0):0){if(M){M=P;while(1){O=f[M+4>>2]|0;if(!((O|0)==(H|0)|(O&L|0)==(N|0))){Q=N;R=31;break a}if((((f[M+8>>2]|0)==(B|0)?(f[M+12>>2]|0)==(E|0):0)?(f[M+16>>2]|0)==(F|0):0)?(f[M+20>>2]|0)==(G|0):0)break a;M=f[M>>2]|0;if(!M){Q=N;R=31;break a}}}else S=P;while(1){M=f[S+4>>2]|0;if((M|0)!=(H|0)){if(M>>>0<J>>>0)T=M;else T=(M>>>0)%(J>>>0)|0;if((T|0)!=(N|0)){Q=N;R=31;break a}}if((((f[S+8>>2]|0)==(B|0)?(f[S+12>>2]|0)==(E|0):0)?(f[S+16>>2]|0)==(F|0):0)?(f[S+20>>2]|0)==(G|0):0)break a;S=f[S>>2]|0;if(!S){Q=N;R=31;break}}}else{Q=N;R=31}}else{Q=0;R=31}while(0);if((R|0)==31){R=0;D=dn(28)|0;f[D+8>>2]=B;f[D+12>>2]=E;f[D+16>>2]=F;f[D+20>>2]=G;f[D+24>>2]=z;f[D+4>>2]=H;f[D>>2]=0;U=$(((f[v>>2]|0)+1|0)>>>0);V=$(J>>>0);X=$(n[k>>2]);do if(K|$(X*V)<U){P=J<<1|(J>>>0<3|(J+-1&J|0)!=0)&1;M=~~$(W($(U/X)))>>>0;Gh(g,P>>>0<M>>>0?M:P);P=f[t>>2]|0;M=P+-1|0;if(!(M&P)){Y=P;Z=M&H;break}if(H>>>0<P>>>0){Y=P;Z=H}else{Y=P;Z=(H>>>0)%(P>>>0)|0}}else{Y=J;Z=Q}while(0);J=(f[g>>2]|0)+(Z<<2)|0;H=f[J>>2]|0;if(!H){f[D>>2]=f[w>>2];f[w>>2]=D;f[J>>2]=w;J=f[D>>2]|0;if(J|0){K=f[J+4>>2]|0;J=Y+-1|0;if(J&Y)if(K>>>0<Y>>>0)_=K;else _=(K>>>0)%(Y>>>0)|0;else _=K&J;aa=(f[g>>2]|0)+(_<<2)|0;R=44}}else{f[D>>2]=f[H>>2];aa=H;R=44}if((R|0)==44){R=0;f[aa>>2]=D}f[v>>2]=(f[v>>2]|0)+1}H=x;J=f[H>>2]|0;K=on(J|0,f[H+4>>2]|0,z|0,0)|0;Rg((f[f[y>>2]>>2]|0)+K|0,h|0,J|0)|0;J=f[j>>2]|0;f[J+(A<<2)>>2]=z;ba=z+1|0;ca=J}else{J=f[j>>2]|0;f[J+(A<<2)>>2]=f[C+24>>2];ba=z;ca=J}A=A+1|0;da=f[l>>2]|0;if(A>>>0>=da>>>0)break;else z=ba}if((ba|0)==(da|0))ea=ca;else{z=a+84|0;if(!(b[z>>0]|0)){A=f[a+72>>2]|0;h=f[a+68>>2]|0;y=h;if((A|0)==(h|0))fa=ca;else{x=A-h>>2;h=0;do{A=y+(h<<2)|0;f[A>>2]=f[ca+(f[A>>2]<<2)>>2];h=h+1|0}while(h>>>0<x>>>0);fa=ca}}else{b[z>>0]=0;z=a+68|0;ca=a+72|0;x=f[ca>>2]|0;h=f[z>>2]|0;y=x-h>>2;A=h;h=x;if(da>>>0<=y>>>0)if(da>>>0<y>>>0?(x=A+(da<<2)|0,(x|0)!=(h|0)):0){f[ca>>2]=h+(~((h+-4-x|0)>>>2)<<2);ga=da}else ga=da;else{kh(z,da-y|0,1204);ga=f[l>>2]|0}y=f[j>>2]|0;if(!ga)fa=y;else{j=f[a+68>>2]|0;a=0;do{f[j+(a<<2)>>2]=f[y+(a<<2)>>2];a=a+1|0}while(a>>>0<ga>>>0);fa=y}}f[l>>2]=ba;ea=fa}if(!ea)ha=ba;else{fa=f[o>>2]|0;if((fa|0)!=(ea|0))f[o>>2]=fa+(~((fa+-4-ea|0)>>>2)<<2);br(ea);ha=ba}}else ha=0;ba=f[g+8>>2]|0;if(ba|0){ea=ba;do{ba=ea;ea=f[ea>>2]|0;br(ba)}while((ea|0)!=0)}ea=f[g>>2]|0;f[g>>2]=0;if(!ea){u=e;return ha|0}br(ea);u=e;return ha|0}function kc(a,c,e){a=a|0;c=c|0;e=e|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=Oa,T=Oa,U=Oa,V=0,X=0,Y=0,Z=0,_=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0;g=u;u=u+48|0;h=g+12|0;i=g+38|0;j=g+32|0;k=g;l=h+16|0;f[h>>2]=0;f[h+4>>2]=0;f[h+8>>2]=0;f[h+12>>2]=0;n[l>>2]=$(1.0);m=a+80|0;o=f[m>>2]|0;f[k>>2]=0;p=k+4|0;f[p>>2]=0;f[k+8>>2]=0;if(o){if(o>>>0>1073741823)mq(k);q=o<<2;r=dn(q)|0;f[k>>2]=r;s=r+(o<<2)|0;f[k+8>>2]=s;hj(r|0,0,q|0)|0;f[p>>2]=s;s=f[e>>2]|0;e=c+48|0;q=c+40|0;r=j+2|0;o=j+4|0;t=h+4|0;v=h+12|0;w=h+8|0;x=a+40|0;y=a+64|0;z=0;A=0;while(1){B=e;C=f[B>>2]|0;D=f[B+4>>2]|0;B=q;E=on(f[B>>2]|0,f[B+4>>2]|0,s+A|0,0)|0;B=Tn(E|0,I|0,C|0,D|0)|0;D=(f[f[c>>2]>>2]|0)+B|0;b[i>>0]=b[D>>0]|0;b[i+1>>0]=b[D+1>>0]|0;b[i+2>>0]=b[D+2>>0]|0;b[i+3>>0]=b[D+3>>0]|0;b[i+4>>0]=b[D+4>>0]|0;b[i+5>>0]=b[D+5>>0]|0;Xl(j|0,D|0,6)|0;D=Pf(h,j)|0;if(!D){B=d[j>>1]|0;C=d[r>>1]|0;E=d[o>>1]|0;F=(((B^318)&65535)+239^C&65535)+239^E&65535;G=f[t>>2]|0;H=(G|0)==0;a:do if(!H){J=G+-1|0;K=(J&G|0)==0;if(!K)if(F>>>0<G>>>0)L=F;else L=(F>>>0)%(G>>>0)|0;else L=F&J;M=f[(f[h>>2]|0)+(L<<2)>>2]|0;if((M|0)!=0?(N=f[M>>2]|0,(N|0)!=0):0){if(K){K=N;while(1){M=f[K+4>>2]|0;if(!((M|0)==(F|0)|(M&J|0)==(L|0))){O=L;P=29;break a}M=K+8|0;if(((d[M>>1]|0)==B<<16>>16?(d[M+2>>1]|0)==C<<16>>16:0)?(d[K+12>>1]|0)==E<<16>>16:0)break a;K=f[K>>2]|0;if(!K){O=L;P=29;break a}}}else Q=N;while(1){K=f[Q+4>>2]|0;if((K|0)!=(F|0)){if(K>>>0<G>>>0)R=K;else R=(K>>>0)%(G>>>0)|0;if((R|0)!=(L|0)){O=L;P=29;break a}}K=Q+8|0;if(((d[K>>1]|0)==B<<16>>16?(d[K+2>>1]|0)==C<<16>>16:0)?(d[Q+12>>1]|0)==E<<16>>16:0)break a;Q=f[Q>>2]|0;if(!Q){O=L;P=29;break}}}else{O=L;P=29}}else{O=0;P=29}while(0);if((P|0)==29){P=0;N=dn(20)|0;d[N+8>>1]=B;d[N+10>>1]=C;d[N+12>>1]=E;f[N+16>>2]=z;f[N+4>>2]=F;f[N>>2]=0;S=$(((f[v>>2]|0)+1|0)>>>0);T=$(G>>>0);U=$(n[l>>2]);do if(H|$(U*T)<S){K=G<<1|(G>>>0<3|(G+-1&G|0)!=0)&1;J=~~$(W($(S/U)))>>>0;Dh(h,K>>>0<J>>>0?J:K);K=f[t>>2]|0;J=K+-1|0;if(!(J&K)){V=K;X=J&F;break}if(F>>>0<K>>>0){V=K;X=F}else{V=K;X=(F>>>0)%(K>>>0)|0}}else{V=G;X=O}while(0);G=(f[h>>2]|0)+(X<<2)|0;F=f[G>>2]|0;if(!F){f[N>>2]=f[w>>2];f[w>>2]=N;f[G>>2]=w;G=f[N>>2]|0;if(G|0){H=f[G+4>>2]|0;G=V+-1|0;if(G&V)if(H>>>0<V>>>0)Y=H;else Y=(H>>>0)%(V>>>0)|0;else Y=H&G;Z=(f[h>>2]|0)+(Y<<2)|0;P=42}}else{f[N>>2]=f[F>>2];Z=F;P=42}if((P|0)==42){P=0;f[Z>>2]=N}f[v>>2]=(f[v>>2]|0)+1}F=x;G=f[F>>2]|0;H=on(G|0,f[F+4>>2]|0,z|0,0)|0;Rg((f[f[y>>2]>>2]|0)+H|0,i|0,G|0)|0;G=f[k>>2]|0;f[G+(A<<2)>>2]=z;_=z+1|0;aa=G}else{G=f[k>>2]|0;f[G+(A<<2)>>2]=f[D+16>>2];_=z;aa=G}A=A+1|0;ba=f[m>>2]|0;if(A>>>0>=ba>>>0)break;else z=_}if((_|0)==(ba|0))ca=aa;else{z=a+84|0;if(!(b[z>>0]|0)){A=f[a+72>>2]|0;i=f[a+68>>2]|0;y=i;if((A|0)==(i|0))da=aa;else{x=A-i>>2;i=0;do{A=y+(i<<2)|0;f[A>>2]=f[aa+(f[A>>2]<<2)>>2];i=i+1|0}while(i>>>0<x>>>0);da=aa}}else{b[z>>0]=0;z=a+68|0;aa=a+72|0;x=f[aa>>2]|0;i=f[z>>2]|0;y=x-i>>2;A=i;i=x;if(ba>>>0<=y>>>0)if(ba>>>0<y>>>0?(x=A+(ba<<2)|0,(x|0)!=(i|0)):0){f[aa>>2]=i+(~((i+-4-x|0)>>>2)<<2);ea=ba}else ea=ba;else{kh(z,ba-y|0,1204);ea=f[m>>2]|0}y=f[k>>2]|0;if(!ea)da=y;else{k=f[a+68>>2]|0;a=0;do{f[k+(a<<2)>>2]=f[y+(a<<2)>>2];a=a+1|0}while(a>>>0<ea>>>0);da=y}}f[m>>2]=_;ca=da}if(!ca)fa=_;else{da=f[p>>2]|0;if((da|0)!=(ca|0))f[p>>2]=da+(~((da+-4-ca|0)>>>2)<<2);br(ca);fa=_}}else fa=0;_=f[h+8>>2]|0;if(_|0){ca=_;do{_=ca;ca=f[ca>>2]|0;br(_)}while((ca|0)!=0)}ca=f[h>>2]|0;f[h>>2]=0;if(!ca){u=g;return fa|0}br(ca);u=g;return fa|0}function lc(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0;d=u;u=u+80|0;e=d+72|0;g=d+64|0;h=d;i=d+68|0;j=d+60|0;k=a+352|0;if(b[k>>0]|0?(l=Qa[f[(f[a>>2]|0)+40>>2]&127](a)|0,((f[l+12>>2]|0)-(f[l+8>>2]|0)|0)>0):0){l=(Qa[f[(f[a>>2]|0)+40>>2]&127](a)|0)+8|0;m=f[f[l>>2]>>2]|0;f[e>>2]=c;l=m+4|0;n=m+8|0;o=f[n>>2]|0;if((o|0)==(f[m+12>>2]|0))Ci(l,e);else{f[o>>2]=c;f[n>>2]=o+4}o=f[e>>2]|0;p=m+16|0;q=m+20|0;m=f[q>>2]|0;r=f[p>>2]|0;s=m-r>>2;t=r;if((o|0)<(s|0)){v=t;w=o}else{r=o+1|0;f[g>>2]=-1;x=m;if(r>>>0<=s>>>0)if(r>>>0<s>>>0?(m=t+(r<<2)|0,(m|0)!=(x|0)):0){f[q>>2]=x+(~((x+-4-m|0)>>>2)<<2);y=o;z=t}else{y=o;z=t}else{kh(p,r-s|0,g);y=f[e>>2]|0;z=f[p>>2]|0}v=z;w=y}f[v+(w<<2)>>2]=((f[n>>2]|0)-(f[l>>2]|0)>>2)+-1;A=1;u=d;return A|0}l=(Qa[f[(f[a>>2]|0)+40>>2]&127](a)|0)+56|0;n=f[(f[(f[l>>2]|0)+84>>2]|0)+(c<<2)>>2]|0;l=(Qa[f[(f[a>>2]|0)+40>>2]&127](a)|0)+4|0;w=f[(f[(f[l>>2]|0)+8>>2]|0)+(c<<2)>>2]|0;f[g>>2]=-1;l=a+172|0;v=f[a+176>>2]|0;y=f[l>>2]|0;z=y;a:do if((v|0)==(y|0))B=-1;else{p=(v-y|0)/136|0;s=0;while(1){if((f[z+(s*136|0)>>2]|0)==(c|0))break;r=s+1|0;if(r>>>0<p>>>0)s=r;else{B=-1;break a}}f[g>>2]=s;B=s}while(0);b:do if(!(b[k>>0]|0)){y=(f[w+56>>2]|0)==0;do if(!((n|0)==0|y)){if((n|0)==1?b[z+(B*136|0)+28>>0]|0:0)break;v=z+(B*136|0)+104|0;p=z+(B*136|0)+4|0;r=(f[z+(B*136|0)+60>>2]|0)-(f[z+(B*136|0)+56>>2]|0)>>2;f[e>>2]=-1;Sf(z+(B*136|0)+116|0,r,e);r=dn(80)|0;t=f[a+8>>2]|0;f[r+4>>2]=0;f[r>>2]=3164;o=r+8|0;m=r+12|0;x=m+44|0;do{f[m>>2]=0;m=m+4|0}while((m|0)<(x|0));f[o>>2]=3188;q=r+56|0;f[q>>2]=0;f[r+60>>2]=0;f[r+64>>2]=0;f[r+68>>2]=t;f[r+72>>2]=v;C=r+76|0;f[C>>2]=0;D=h+4|0;m=D+4|0;x=m+40|0;do{f[m>>2]=0;m=m+4|0}while((m|0)<(x|0));f[h>>2]=3188;m=h+48|0;f[m>>2]=0;x=h+52|0;f[x>>2]=0;f[h+56>>2]=0;f[D>>2]=p;E=f[z+(B*136|0)+68>>2]|0;F=((f[E+4>>2]|0)-(f[E>>2]|0)>>2>>>0)/3|0;b[e>>0]=0;Xg(h+24|0,F,e);F=f[D>>2]|0;E=(f[F+56>>2]|0)-(f[F+52>>2]|0)>>2;b[e>>0]=0;Xg(h+36|0,E,e);f[h+8>>2]=p;f[h+12>>2]=v;f[h+16>>2]=t;f[h+20>>2]=r;f[C>>2]=a+72;ef(o,h)|0;Yf(q,f[m>>2]|0,f[x>>2]|0);E=r;f[h>>2]=3188;F=f[m>>2]|0;if(F|0){m=f[x>>2]|0;if((m|0)!=(F|0))f[x>>2]=m+(~((m+-4-F|0)>>>2)<<2);br(F)}f[h>>2]=3208;F=f[h+36>>2]|0;if(F|0)br(F);F=f[h+24>>2]|0;if(F|0)br(F);G=0;H=E;I=42;break b}while(0);if(!y){s=f[a+12>>2]|0;E=(f[s+28>>2]|0)-(f[s+24>>2]|0)>>2;f[e>>2]=-1;Sf(z+(B*136|0)+116|0,E,e);b[(f[l>>2]|0)+((f[g>>2]|0)*136|0)+100>>0]=0;J=z+(B*136|0)+104|0;I=26}else I=24}else I=24;while(0);if((I|0)==24){J=a+40|0;I=26}if((I|0)==26){B=(Qa[f[(f[a>>2]|0)+40>>2]&127](a)|0)+48|0;do if((Yh(f[B>>2]|0)|0)==0?(f[w+56>>2]|0)==0:0){if(b[k>>0]|0?(z=f[a+8>>2]|0,((f[z+12>>2]|0)-(f[z+8>>2]|0)|0)>=5):0){I=31;break}uf(e,a,J);K=1;L=f[e>>2]|0}else I=31;while(0);if((I|0)==31){Le(e,a,J);K=0;L=f[e>>2]|0}if(!L)M=0;else{G=K;H=L;I=42}}if((I|0)==42){I=f[g>>2]|0;if((I|0)==-1)N=a+68|0;else N=(f[l>>2]|0)+(I*136|0)+132|0;f[N>>2]=G;G=dn(76)|0;f[i>>2]=H;ml(G,i,c);c=G;G=f[i>>2]|0;f[i>>2]=0;if(G|0)Va[f[(f[G>>2]|0)+4>>2]&127](G);G=a+188|0;i=f[G>>2]|0;if((i|0)==(f[a+192>>2]|0))Ci(a+184|0,g);else{f[i>>2]=f[g>>2];f[G>>2]=i+4}i=Qa[f[(f[a>>2]|0)+40>>2]&127](a)|0;f[j>>2]=c;a=i+12|0;G=f[a>>2]|0;if(G>>>0<(f[i+16>>2]|0)>>>0){f[j>>2]=0;f[G>>2]=c;f[a>>2]=G+4;O=j}else{yg(i+8|0,j);O=j}j=f[O>>2]|0;f[O>>2]=0;if(!j)M=1;else{Va[f[(f[j>>2]|0)+4>>2]&127](j);M=1}}A=M;u=d;return A|0}function mc(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0;d=u;u=u+80|0;e=d+72|0;g=d+64|0;h=d;i=d+68|0;j=d+60|0;k=a+288|0;if(b[k>>0]|0?(l=Qa[f[(f[a>>2]|0)+40>>2]&127](a)|0,((f[l+12>>2]|0)-(f[l+8>>2]|0)|0)>0):0){l=(Qa[f[(f[a>>2]|0)+40>>2]&127](a)|0)+8|0;m=f[f[l>>2]>>2]|0;f[e>>2]=c;l=m+4|0;n=m+8|0;o=f[n>>2]|0;if((o|0)==(f[m+12>>2]|0))Ci(l,e);else{f[o>>2]=c;f[n>>2]=o+4}o=f[e>>2]|0;p=m+16|0;q=m+20|0;m=f[q>>2]|0;r=f[p>>2]|0;s=m-r>>2;t=r;if((o|0)<(s|0)){v=t;w=o}else{r=o+1|0;f[g>>2]=-1;x=m;if(r>>>0<=s>>>0)if(r>>>0<s>>>0?(m=t+(r<<2)|0,(m|0)!=(x|0)):0){f[q>>2]=x+(~((x+-4-m|0)>>>2)<<2);y=o;z=t}else{y=o;z=t}else{kh(p,r-s|0,g);y=f[e>>2]|0;z=f[p>>2]|0}v=z;w=y}f[v+(w<<2)>>2]=((f[n>>2]|0)-(f[l>>2]|0)>>2)+-1;A=1;u=d;return A|0}l=(Qa[f[(f[a>>2]|0)+40>>2]&127](a)|0)+56|0;n=f[(f[(f[l>>2]|0)+84>>2]|0)+(c<<2)>>2]|0;l=(Qa[f[(f[a>>2]|0)+40>>2]&127](a)|0)+4|0;w=f[(f[(f[l>>2]|0)+8>>2]|0)+(c<<2)>>2]|0;f[g>>2]=-1;l=a+172|0;v=f[a+176>>2]|0;y=f[l>>2]|0;z=y;a:do if((v|0)==(y|0))B=-1;else{p=(v-y|0)/136|0;s=0;while(1){if((f[z+(s*136|0)>>2]|0)==(c|0))break;r=s+1|0;if(r>>>0<p>>>0)s=r;else{B=-1;break a}}f[g>>2]=s;B=s}while(0);b:do if(!(b[k>>0]|0)){y=(f[w+56>>2]|0)==0;do if(!((n|0)==0|y)){if((n|0)==1?b[z+(B*136|0)+28>>0]|0:0)break;v=z+(B*136|0)+104|0;p=z+(B*136|0)+4|0;r=(f[z+(B*136|0)+60>>2]|0)-(f[z+(B*136|0)+56>>2]|0)>>2;f[e>>2]=-1;Sf(z+(B*136|0)+116|0,r,e);r=dn(80)|0;t=f[a+8>>2]|0;f[r+4>>2]=0;f[r>>2]=3164;o=r+8|0;m=r+12|0;x=m+44|0;do{f[m>>2]=0;m=m+4|0}while((m|0)<(x|0));f[o>>2]=3188;q=r+56|0;f[q>>2]=0;f[r+60>>2]=0;f[r+64>>2]=0;f[r+68>>2]=t;f[r+72>>2]=v;C=r+76|0;f[C>>2]=0;D=h+4|0;m=D+4|0;x=m+40|0;do{f[m>>2]=0;m=m+4|0}while((m|0)<(x|0));f[h>>2]=3188;m=h+48|0;f[m>>2]=0;x=h+52|0;f[x>>2]=0;f[h+56>>2]=0;f[D>>2]=p;E=f[z+(B*136|0)+68>>2]|0;F=((f[E+4>>2]|0)-(f[E>>2]|0)>>2>>>0)/3|0;b[e>>0]=0;Xg(h+24|0,F,e);F=f[D>>2]|0;E=(f[F+56>>2]|0)-(f[F+52>>2]|0)>>2;b[e>>0]=0;Xg(h+36|0,E,e);f[h+8>>2]=p;f[h+12>>2]=v;f[h+16>>2]=t;f[h+20>>2]=r;f[C>>2]=a+72;ef(o,h)|0;Yf(q,f[m>>2]|0,f[x>>2]|0);E=r;f[h>>2]=3188;F=f[m>>2]|0;if(F|0){m=f[x>>2]|0;if((m|0)!=(F|0))f[x>>2]=m+(~((m+-4-F|0)>>>2)<<2);br(F)}f[h>>2]=3208;F=f[h+36>>2]|0;if(F|0)br(F);F=f[h+24>>2]|0;if(F|0)br(F);G=0;H=E;I=42;break b}while(0);if(!y){s=f[a+12>>2]|0;E=(f[s+28>>2]|0)-(f[s+24>>2]|0)>>2;f[e>>2]=-1;Sf(z+(B*136|0)+116|0,E,e);b[(f[l>>2]|0)+((f[g>>2]|0)*136|0)+100>>0]=0;J=z+(B*136|0)+104|0;I=26}else I=24}else I=24;while(0);if((I|0)==24){J=a+40|0;I=26}if((I|0)==26){B=(Qa[f[(f[a>>2]|0)+40>>2]&127](a)|0)+48|0;do if((Yh(f[B>>2]|0)|0)==0?(f[w+56>>2]|0)==0:0){if(b[k>>0]|0?(z=f[a+8>>2]|0,((f[z+12>>2]|0)-(f[z+8>>2]|0)|0)>=5):0){I=31;break}uf(e,a,J);K=1;L=f[e>>2]|0}else I=31;while(0);if((I|0)==31){Le(e,a,J);K=0;L=f[e>>2]|0}if(!L)M=0;else{G=K;H=L;I=42}}if((I|0)==42){I=f[g>>2]|0;if((I|0)==-1)N=a+68|0;else N=(f[l>>2]|0)+(I*136|0)+132|0;f[N>>2]=G;G=dn(76)|0;f[i>>2]=H;ml(G,i,c);c=G;G=f[i>>2]|0;f[i>>2]=0;if(G|0)Va[f[(f[G>>2]|0)+4>>2]&127](G);G=a+188|0;i=f[G>>2]|0;if((i|0)==(f[a+192>>2]|0))Ci(a+184|0,g);else{f[i>>2]=f[g>>2];f[G>>2]=i+4}i=Qa[f[(f[a>>2]|0)+40>>2]&127](a)|0;f[j>>2]=c;a=i+12|0;G=f[a>>2]|0;if(G>>>0<(f[i+16>>2]|0)>>>0){f[j>>2]=0;f[G>>2]=c;f[a>>2]=G+4;O=j}else{yg(i+8|0,j);O=j}j=f[O>>2]|0;f[O>>2]=0;if(!j)M=1;else{Va[f[(f[j>>2]|0)+4>>2]&127](j);M=1}}A=M;u=d;return A|0}function nc(a,b,c,d,e,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0;e=u;u=u+64|0;d=e+48|0;h=e+40|0;i=e+32|0;j=e+16|0;k=e+8|0;l=e;m=e+28|0;n=a+8|0;o=f[n>>2]|0;if((o+-2|0)>>>0<=28){f[a+72>>2]=o;p=1<<o;f[a+76>>2]=p+-1;o=p+-2|0;f[a+80>>2]=o;f[a+84>>2]=(o|0)/2|0}o=a+40|0;f[a+48>>2]=g;g=a+88|0;lk(g);p=a+36|0;q=f[p>>2]|0;r=(f[q+4>>2]|0)-(f[q>>2]|0)|0;s=r>>2;f[j>>2]=0;f[j+4>>2]=0;f[j+8>>2]=0;t=k;f[t>>2]=0;f[t+4>>2]=0;t=l;f[t>>2]=0;f[t+4>>2]=0;if((r|0)<=0){u=e;return 1}r=j+4|0;t=j+8|0;v=a+84|0;w=a+80|0;x=h+4|0;y=i+4|0;z=d+4|0;A=k+4|0;B=h+4|0;C=i+4|0;D=d+4|0;E=l+4|0;F=a+76|0;a=k+4|0;G=l+4|0;H=f[q>>2]|0;if((f[q+4>>2]|0)==(H|0)){J=q;mq(J)}else{K=0;L=H}while(1){f[m>>2]=f[L+(K<<2)>>2];f[d>>2]=f[m>>2];fc(o,d,j);H=f[j>>2]|0;q=(H|0)>-1?H:0-H|0;M=f[r>>2]|0;N=(M|0)>-1?M:0-M|0;O=Tn(N|0,((N|0)<0)<<31>>31|0,q|0,((q|0)<0)<<31>>31|0)|0;q=f[t>>2]|0;N=(q|0)>-1;P=N?q:0-q|0;q=Tn(O|0,I|0,P|0,((P|0)<0)<<31>>31|0)|0;P=I;if((q|0)==0&(P|0)==0){O=f[v>>2]|0;Q=O;R=j;S=M;T=O}else{O=f[v>>2]|0;U=((O|0)<0)<<31>>31;V=on(O|0,U|0,H|0,((H|0)<0)<<31>>31|0)|0;H=zk(V|0,I|0,q|0,P|0)|0;f[j>>2]=H;V=on(O|0,U|0,M|0,((M|0)<0)<<31>>31|0)|0;M=zk(V|0,I|0,q|0,P|0)|0;f[r>>2]=M;P=O-((H|0)>-1?H:0-H|0)-((M|0)>-1?M:0-M|0)|0;Q=N?P:0-P|0;R=t;S=M;T=O}f[R>>2]=Q;O=f[j>>2]|0;do if((O|0)<=-1){if((S|0)<0){M=f[t>>2]|0;W=(M|0)>-1?M:0-M|0;X=M}else{M=f[t>>2]|0;W=(f[w>>2]|0)-((M|0)>-1?M:0-M|0)|0;X=M}if((X|0)<0){Y=(S|0)>-1?S:0-S|0;Z=W;_=X;break}else{Y=(f[w>>2]|0)-((S|0)>-1?S:0-S|0)|0;Z=W;_=X;break}}else{M=f[t>>2]|0;Y=M+T|0;Z=T+S|0;_=M}while(0);M=(Z|0)==0;P=(Y|0)==0;N=f[w>>2]|0;do if(Y|Z){H=(N|0)==(Y|0);if(!(M&H)){q=(N|0)==(Z|0);if(!(P&q)){if(M&(T|0)<(Y|0)){$=0;aa=(T<<1)-Y|0;break}if(q&(T|0)>(Y|0)){$=Z;aa=(T<<1)-Y|0;break}if(H&(T|0)>(Z|0)){$=(T<<1)-Z|0;aa=Y;break}if(P){$=(T|0)<(Z|0)?(T<<1)-Z|0:Z;aa=0}else{$=Z;aa=Y}}else{$=Z;aa=Z}}else{$=Y;aa=Y}}else{$=N;aa=N}while(0);P=0-S|0;M=0-_|0;f[j>>2]=0-O;f[r>>2]=P;f[t>>2]=M;if((O|0)<1){ba=T-_|0;ca=T-S|0}else{H=(_|0)<1?M:_;M=(S|0)<1?P:S;ba=(_|0)>0?M:N-M|0;ca=(S|0)>0?H:N-H|0}H=(ca|0)==0;M=(ba|0)==0;do if(((ba|ca|0)!=0?(P=(N|0)==(ba|0),!(H&P)):0)?(q=(N|0)==(ca|0),!(M&q)):0){if(H&(T|0)<(ba|0)){da=0;ea=(T<<1)-ba|0;break}if(q&(T|0)>(ba|0)){da=N;ea=(T<<1)-ba|0;break}if(P&(T|0)>(ca|0)){da=(T<<1)-ca|0;ea=N;break}if(M){da=(T|0)<(ca|0)?(T<<1)-ca|0:ca;ea=0}else{da=ca;ea=ba}}else{da=N;ea=N}while(0);N=K<<1;M=b+(N<<2)|0;H=M+4|0;O=f[H>>2]|0;f[h>>2]=f[M>>2];f[x>>2]=O;f[i>>2]=$;f[y>>2]=aa;Dd(d,n,h,i);O=f[d>>2]|0;f[k>>2]=O;P=f[z>>2]|0;f[A>>2]=P;q=f[H>>2]|0;f[h>>2]=f[M>>2];f[B>>2]=q;f[i>>2]=da;f[C>>2]=ea;Dd(d,n,h,i);q=f[d>>2]|0;f[l>>2]=q;M=f[D>>2]|0;f[E>>2]=M;H=f[v>>2]|0;if((H|0)>=(O|0))if((O|0)<(0-H|0))fa=(f[F>>2]|0)+O|0;else fa=O;else fa=O-(f[F>>2]|0)|0;f[k>>2]=fa;if((H|0)>=(P|0))if((P|0)<(0-H|0))ga=(f[F>>2]|0)+P|0;else ga=P;else ga=P-(f[F>>2]|0)|0;f[a>>2]=ga;if((H|0)>=(q|0))if((q|0)<(0-H|0))ha=(f[F>>2]|0)+q|0;else ha=q;else ha=q-(f[F>>2]|0)|0;f[l>>2]=ha;if((H|0)>=(M|0))if((M|0)<(0-H|0))ia=(f[F>>2]|0)+M|0;else ia=M;else ia=M-(f[F>>2]|0)|0;f[G>>2]=ia;if((((ga|0)>-1?ga:0-ga|0)+((fa|0)>-1?fa:0-fa|0)|0)<(((ha|0)>-1?ha:0-ha|0)+((ia|0)>-1?ia:0-ia|0)|0)){Vi(g,0);ja=k}else{Vi(g,1);ja=l}M=f[ja>>2]|0;if((M|0)<0)ka=(f[F>>2]|0)+M|0;else ka=M;M=c+(N<<2)|0;f[M>>2]=ka;N=f[ja+4>>2]|0;if((N|0)<0)la=(f[F>>2]|0)+N|0;else la=N;f[M+4>>2]=la;K=K+1|0;if((K|0)>=(s|0)){ma=5;break}M=f[p>>2]|0;L=f[M>>2]|0;if((f[M+4>>2]|0)-L>>2>>>0<=K>>>0){J=M;ma=6;break}}if((ma|0)==5){u=e;return 1}else if((ma|0)==6)mq(J);return 0}function oc(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0;c=u;u=u+48|0;d=c+24|0;e=c+12|0;g=c;if(!b){h=0;u=c;return h|0}i=a+12|0;j=a+4|0;k=f[j>>2]|0;l=f[a>>2]|0;m=k-l>>2;n=a+16|0;o=f[n>>2]|0;p=f[i>>2]|0;q=o-p>>2;r=p;p=o;if(m>>>0<=q>>>0)if(m>>>0<q>>>0?(o=r+(m<<2)|0,(o|0)!=(p|0)):0){f[n>>2]=p+(~((p+-4-o|0)>>>2)<<2);s=l;t=k}else{s=l;t=k}else{kh(i,m-q|0,5828);s=f[a>>2]|0;t=f[j>>2]|0}f[d>>2]=0;q=d+4|0;f[q>>2]=0;f[d+8>>2]=0;$j(d,t-s>>2);s=f[j>>2]|0;t=f[a>>2]|0;if((s|0)==(t|0)){v=s;w=s}else{m=f[d>>2]|0;k=m;l=k;o=0;p=s;s=k;k=t;t=m;while(1){m=f[k+(o<<2)>>2]|0;n=f[q>>2]|0;if(m>>>0<n-t>>2>>>0){x=l;y=s;z=k;A=p}else{r=m+1|0;f[e>>2]=0;B=n-t>>2;C=t;D=n;if(r>>>0<=B>>>0)if(r>>>0<B>>>0?(n=C+(r<<2)|0,(n|0)!=(D|0)):0){f[q>>2]=D+(~((D+-4-n|0)>>>2)<<2);E=l;F=p;G=k}else{E=l;F=p;G=k}else{kh(d,r-B|0,e);E=f[d>>2]|0;F=f[j>>2]|0;G=f[a>>2]|0}x=E;y=E;z=G;A=F}B=y+(m<<2)|0;f[B>>2]=(f[B>>2]|0)+1;o=o+1|0;if(o>>>0>=A-z>>2>>>0){v=z;w=A;break}else{l=x;p=A;s=y;k=z;t=y}}}y=w-v|0;v=y>>2;f[e>>2]=0;w=e+4|0;f[w>>2]=0;f[e+8>>2]=0;if(!v){H=0;I=0}else{if(v>>>0>536870911)mq(e);t=dn(y<<1)|0;f[w>>2]=t;f[e>>2]=t;y=t+(v<<3)|0;f[e+8>>2]=y;z=v;v=t;k=t;while(1){s=v;f[s>>2]=-1;f[s+4>>2]=-1;s=k+8|0;A=z+-1|0;if(!A)break;else{z=A;v=s;k=s}}f[w>>2]=y;H=t;I=t}t=f[q>>2]|0;y=f[d>>2]|0;k=t-y|0;v=k>>2;f[g>>2]=0;z=g+4|0;f[z>>2]=0;f[g+8>>2]=0;s=y;do if(v)if(v>>>0>1073741823)mq(g);else{A=dn(k)|0;f[g>>2]=A;p=A+(v<<2)|0;f[g+8>>2]=p;hj(A|0,0,k|0)|0;f[z>>2]=p;J=A;K=p;L=A;break}else{J=0;K=0;L=0}while(0);if((t|0)!=(y|0)){y=0;t=0;while(1){f[J+(t<<2)>>2]=y;k=t+1|0;if(k>>>0<v>>>0){y=(f[s+(t<<2)>>2]|0)+y|0;t=k}else break}}t=f[j>>2]|0;j=f[a>>2]|0;y=j;if((t|0)!=(j|0)){k=a+40|0;a=t-j>>2;j=H;t=H;g=H;A=H;p=H;x=H;l=0;o=J;while(1){F=f[y+(l<<2)>>2]|0;G=l+1|0;E=((G>>>0)%3|0|0)==0?l+-2|0:G;if((E|0)==-1)M=-1;else M=f[y+(E<<2)>>2]|0;E=((l>>>0)%3|0|0)==0;G=(E?2:-1)+l|0;if((G|0)==-1)N=-1;else N=f[y+(G<<2)>>2]|0;if(E?(M|0)==(N|0)|((F|0)==(M|0)|(F|0)==(N|0)):0){f[k>>2]=(f[k>>2]|0)+1;O=j;P=t;Q=g;R=A;S=p;T=x;U=l+2|0;V=o}else W=51;a:do if((W|0)==51){W=0;E=f[s+(N<<2)>>2]|0;b:do if((E|0)>0){G=0;B=f[o+(N<<2)>>2]|0;while(1){m=f[p+(B<<3)>>2]|0;if((m|0)==-1){X=j;Y=t;Z=A;_=p;break b}if((m|0)==(M|0)){m=f[p+(B<<3)+4>>2]|0;if((m|0)==-1)$=-1;else $=f[y+(m<<2)>>2]|0;if((F|0)!=($|0))break}m=G+1|0;if((m|0)<(E|0)){G=m;B=B+1|0}else{X=j;Y=t;Z=A;_=p;break b}}m=f[A+(B<<3)+4>>2]|0;r=G;n=B;D=t;while(1){r=r+1|0;if((r|0)>=(E|0))break;C=n+1|0;f[D+(n<<3)>>2]=f[D+(C<<3)>>2];f[D+(n<<3)+4>>2]=f[D+(C<<3)+4>>2];if((f[j+(n<<3)>>2]|0)==-1)break;else{n=C;D=j}}f[g+(n<<3)>>2]=-1;if((m|0)==-1){X=g;Y=g;Z=g;_=g}else{D=f[i>>2]|0;f[D+(l<<2)>>2]=m;f[D+(m<<2)>>2]=l;O=g;P=g;Q=g;R=g;S=g;T=x;U=l;V=o;break a}}else{X=j;Y=t;Z=A;_=p}while(0);E=f[s+(M<<2)>>2]|0;if((E|0)>0){D=0;r=f[J+(M<<2)>>2]|0;while(1){aa=x+(r<<3)|0;if((f[aa>>2]|0)==-1)break;D=D+1|0;if((D|0)>=(E|0)){O=x;P=x;Q=x;R=x;S=x;T=x;U=l;V=J;break a}else r=r+1|0}f[aa>>2]=N;f[H+(r<<3)+4>>2]=l;O=H;P=H;Q=H;R=H;S=H;T=H;U=l;V=J}else{O=X;P=Y;Q=g;R=Z;S=_;T=x;U=l;V=o}}while(0);l=U+1|0;if(l>>>0>=a>>>0)break;else{j=O;t=P;g=Q;A=R;p=S;x=T;o=V}}}f[b>>2]=v;if(!J){ba=H;ca=I}else{if((K|0)!=(J|0))f[z>>2]=K+(~((K+-4-J|0)>>>2)<<2);br(L);L=f[e>>2]|0;ba=L;ca=L}if(ba|0){L=f[w>>2]|0;if((L|0)!=(ba|0))f[w>>2]=L+(~((L+-8-ba|0)>>>3)<<3);br(ca)}ca=f[d>>2]|0;if(ca|0){d=f[q>>2]|0;if((d|0)!=(ca|0))f[q>>2]=d+(~((d+-4-ca|0)>>>2)<<2);br(ca)}h=1;u=c;return h|0}function pc(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=Oa,S=Oa,T=Oa,U=0,V=0,X=0,Y=0,Z=0,_=0,aa=0,ba=0,ca=0,da=0,ea=0;e=u;u=u+48|0;g=e+12|0;h=e+35|0;i=e+32|0;j=e;k=g+16|0;f[g>>2]=0;f[g+4>>2]=0;f[g+8>>2]=0;f[g+12>>2]=0;n[k>>2]=$(1.0);l=a+80|0;m=f[l>>2]|0;f[j>>2]=0;o=j+4|0;f[o>>2]=0;f[j+8>>2]=0;if(m){if(m>>>0>1073741823)mq(j);p=m<<2;q=dn(p)|0;f[j>>2]=q;r=q+(m<<2)|0;f[j+8>>2]=r;hj(q|0,0,p|0)|0;f[o>>2]=r;r=f[d>>2]|0;d=c+48|0;p=c+40|0;q=i+1|0;m=i+2|0;s=g+4|0;t=g+12|0;v=g+8|0;w=a+40|0;x=a+64|0;y=0;z=0;while(1){A=d;B=f[A>>2]|0;C=f[A+4>>2]|0;A=p;D=on(f[A>>2]|0,f[A+4>>2]|0,r+y|0,0)|0;A=Tn(D|0,I|0,B|0,C|0)|0;C=(f[f[c>>2]>>2]|0)+A|0;b[h>>0]=b[C>>0]|0;b[h+1>>0]=b[C+1>>0]|0;b[h+2>>0]=b[C+2>>0]|0;Xl(i|0,C|0,3)|0;C=Uf(g,i)|0;if(!C){A=b[i>>0]|0;B=b[q>>0]|0;D=b[m>>0]|0;E=((A&255^318)+239^B&255)+239^D&255;F=f[s>>2]|0;G=(F|0)==0;a:do if(!G){H=F+-1|0;J=(H&F|0)==0;if(!J)if(E>>>0<F>>>0)K=E;else K=(E>>>0)%(F>>>0)|0;else K=E&H;L=f[(f[g>>2]|0)+(K<<2)>>2]|0;if((L|0)!=0?(M=f[L>>2]|0,(M|0)!=0):0){if(J){J=M;while(1){L=f[J+4>>2]|0;if(!((L|0)==(E|0)|(L&H|0)==(K|0))){N=K;O=29;break a}L=J+8|0;if(((b[L>>0]|0)==A<<24>>24?(b[L+1>>0]|0)==B<<24>>24:0)?(b[L+2>>0]|0)==D<<24>>24:0)break a;J=f[J>>2]|0;if(!J){N=K;O=29;break a}}}else P=M;while(1){J=f[P+4>>2]|0;if((J|0)!=(E|0)){if(J>>>0<F>>>0)Q=J;else Q=(J>>>0)%(F>>>0)|0;if((Q|0)!=(K|0)){N=K;O=29;break a}}J=P+8|0;if(((b[J>>0]|0)==A<<24>>24?(b[J+1>>0]|0)==B<<24>>24:0)?(b[J+2>>0]|0)==D<<24>>24:0)break a;P=f[P>>2]|0;if(!P){N=K;O=29;break}}}else{N=K;O=29}}else{N=0;O=29}while(0);if((O|0)==29){O=0;M=dn(16)|0;b[M+8>>0]=A;b[M+9>>0]=B;b[M+10>>0]=D;f[M+12>>2]=z;f[M+4>>2]=E;f[M>>2]=0;R=$(((f[t>>2]|0)+1|0)>>>0);S=$(F>>>0);T=$(n[k>>2]);do if(G|$(T*S)<R){J=F<<1|(F>>>0<3|(F+-1&F|0)!=0)&1;H=~~$(W($(R/T)))>>>0;Kh(g,J>>>0<H>>>0?H:J);J=f[s>>2]|0;H=J+-1|0;if(!(H&J)){U=J;V=H&E;break}if(E>>>0<J>>>0){U=J;V=E}else{U=J;V=(E>>>0)%(J>>>0)|0}}else{U=F;V=N}while(0);F=(f[g>>2]|0)+(V<<2)|0;E=f[F>>2]|0;if(!E){f[M>>2]=f[v>>2];f[v>>2]=M;f[F>>2]=v;F=f[M>>2]|0;if(F|0){G=f[F+4>>2]|0;F=U+-1|0;if(F&U)if(G>>>0<U>>>0)X=G;else X=(G>>>0)%(U>>>0)|0;else X=G&F;Y=(f[g>>2]|0)+(X<<2)|0;O=42}}else{f[M>>2]=f[E>>2];Y=E;O=42}if((O|0)==42){O=0;f[Y>>2]=M}f[t>>2]=(f[t>>2]|0)+1}E=w;F=f[E>>2]|0;G=on(F|0,f[E+4>>2]|0,z|0,0)|0;Rg((f[f[x>>2]>>2]|0)+G|0,h|0,F|0)|0;F=f[j>>2]|0;f[F+(y<<2)>>2]=z;Z=z+1|0;_=F}else{F=f[j>>2]|0;f[F+(y<<2)>>2]=f[C+12>>2];Z=z;_=F}y=y+1|0;aa=f[l>>2]|0;if(y>>>0>=aa>>>0)break;else z=Z}if((Z|0)==(aa|0))ba=_;else{z=a+84|0;if(!(b[z>>0]|0)){y=f[a+72>>2]|0;h=f[a+68>>2]|0;x=h;if((y|0)==(h|0))ca=_;else{w=y-h>>2;h=0;do{y=x+(h<<2)|0;f[y>>2]=f[_+(f[y>>2]<<2)>>2];h=h+1|0}while(h>>>0<w>>>0);ca=_}}else{b[z>>0]=0;z=a+68|0;_=a+72|0;w=f[_>>2]|0;h=f[z>>2]|0;x=w-h>>2;y=h;h=w;if(aa>>>0<=x>>>0)if(aa>>>0<x>>>0?(w=y+(aa<<2)|0,(w|0)!=(h|0)):0){f[_>>2]=h+(~((h+-4-w|0)>>>2)<<2);da=aa}else da=aa;else{kh(z,aa-x|0,1204);da=f[l>>2]|0}x=f[j>>2]|0;if(!da)ca=x;else{j=f[a+68>>2]|0;a=0;do{f[j+(a<<2)>>2]=f[x+(a<<2)>>2];a=a+1|0}while(a>>>0<da>>>0);ca=x}}f[l>>2]=Z;ba=ca}if(!ba)ea=Z;else{ca=f[o>>2]|0;if((ca|0)!=(ba|0))f[o>>2]=ca+(~((ca+-4-ba|0)>>>2)<<2);br(ba);ea=Z}}else ea=0;Z=f[g+8>>2]|0;if(Z|0){ba=Z;do{Z=ba;ba=f[ba>>2]|0;br(Z)}while((ba|0)!=0)}ba=f[g>>2]|0;f[g>>2]=0;if(!ba){u=e;return ea|0}br(ba);u=e;return ea|0}function qc(a,b,c,d,e,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0;e=u;u=u+64|0;d=e+48|0;h=e+40|0;i=e+32|0;j=e+16|0;k=e+8|0;l=e;m=e+28|0;n=a+8|0;o=f[n>>2]|0;if((o+-2|0)>>>0<=28){f[a+72>>2]=o;p=1<<o;f[a+76>>2]=p+-1;o=p+-2|0;f[a+80>>2]=o;f[a+84>>2]=(o|0)/2|0}o=a+40|0;f[a+48>>2]=g;g=a+88|0;lk(g);p=a+36|0;q=f[p>>2]|0;r=(f[q+4>>2]|0)-(f[q>>2]|0)|0;s=r>>2;f[j>>2]=0;f[j+4>>2]=0;f[j+8>>2]=0;t=k;f[t>>2]=0;f[t+4>>2]=0;t=l;f[t>>2]=0;f[t+4>>2]=0;if((r|0)<=0){u=e;return 1}r=j+4|0;t=j+8|0;v=a+84|0;w=a+80|0;x=h+4|0;y=i+4|0;z=d+4|0;A=k+4|0;B=h+4|0;C=i+4|0;D=d+4|0;E=l+4|0;F=a+76|0;a=k+4|0;G=l+4|0;H=f[q>>2]|0;if((f[q+4>>2]|0)==(H|0)){J=q;mq(J)}else{K=0;L=H}while(1){f[m>>2]=f[L+(K<<2)>>2];f[d>>2]=f[m>>2];$b(o,d,j);H=f[j>>2]|0;q=(H|0)>-1?H:0-H|0;M=f[r>>2]|0;N=(M|0)>-1?M:0-M|0;O=Tn(N|0,((N|0)<0)<<31>>31|0,q|0,((q|0)<0)<<31>>31|0)|0;q=f[t>>2]|0;N=(q|0)>-1;P=N?q:0-q|0;q=Tn(O|0,I|0,P|0,((P|0)<0)<<31>>31|0)|0;P=I;if((q|0)==0&(P|0)==0){O=f[v>>2]|0;Q=O;R=j;S=M;T=O}else{O=f[v>>2]|0;U=((O|0)<0)<<31>>31;V=on(O|0,U|0,H|0,((H|0)<0)<<31>>31|0)|0;H=zk(V|0,I|0,q|0,P|0)|0;f[j>>2]=H;V=on(O|0,U|0,M|0,((M|0)<0)<<31>>31|0)|0;M=zk(V|0,I|0,q|0,P|0)|0;f[r>>2]=M;P=O-((H|0)>-1?H:0-H|0)-((M|0)>-1?M:0-M|0)|0;Q=N?P:0-P|0;R=t;S=M;T=O}f[R>>2]=Q;O=f[j>>2]|0;do if((O|0)<=-1){if((S|0)<0){M=f[t>>2]|0;W=(M|0)>-1?M:0-M|0;X=M}else{M=f[t>>2]|0;W=(f[w>>2]|0)-((M|0)>-1?M:0-M|0)|0;X=M}if((X|0)<0){Y=(S|0)>-1?S:0-S|0;Z=W;_=X;break}else{Y=(f[w>>2]|0)-((S|0)>-1?S:0-S|0)|0;Z=W;_=X;break}}else{M=f[t>>2]|0;Y=M+T|0;Z=T+S|0;_=M}while(0);M=(Z|0)==0;P=(Y|0)==0;N=f[w>>2]|0;do if(Y|Z){H=(N|0)==(Y|0);if(!(M&H)){q=(N|0)==(Z|0);if(!(P&q)){if(M&(T|0)<(Y|0)){$=0;aa=(T<<1)-Y|0;break}if(q&(T|0)>(Y|0)){$=Z;aa=(T<<1)-Y|0;break}if(H&(T|0)>(Z|0)){$=(T<<1)-Z|0;aa=Y;break}if(P){$=(T|0)<(Z|0)?(T<<1)-Z|0:Z;aa=0}else{$=Z;aa=Y}}else{$=Z;aa=Z}}else{$=Y;aa=Y}}else{$=N;aa=N}while(0);P=0-S|0;M=0-_|0;f[j>>2]=0-O;f[r>>2]=P;f[t>>2]=M;if((O|0)<1){ba=T-_|0;ca=T-S|0}else{H=(_|0)<1?M:_;M=(S|0)<1?P:S;ba=(_|0)>0?M:N-M|0;ca=(S|0)>0?H:N-H|0}H=(ca|0)==0;M=(ba|0)==0;do if(((ba|ca|0)!=0?(P=(N|0)==(ba|0),!(H&P)):0)?(q=(N|0)==(ca|0),!(M&q)):0){if(H&(T|0)<(ba|0)){da=0;ea=(T<<1)-ba|0;break}if(q&(T|0)>(ba|0)){da=N;ea=(T<<1)-ba|0;break}if(P&(T|0)>(ca|0)){da=(T<<1)-ca|0;ea=N;break}if(M){da=(T|0)<(ca|0)?(T<<1)-ca|0:ca;ea=0}else{da=ca;ea=ba}}else{da=N;ea=N}while(0);N=K<<1;M=b+(N<<2)|0;H=M+4|0;O=f[H>>2]|0;f[h>>2]=f[M>>2];f[x>>2]=O;f[i>>2]=$;f[y>>2]=aa;Dd(d,n,h,i);O=f[d>>2]|0;f[k>>2]=O;P=f[z>>2]|0;f[A>>2]=P;q=f[H>>2]|0;f[h>>2]=f[M>>2];f[B>>2]=q;f[i>>2]=da;f[C>>2]=ea;Dd(d,n,h,i);q=f[d>>2]|0;f[l>>2]=q;M=f[D>>2]|0;f[E>>2]=M;H=f[v>>2]|0;if((H|0)>=(O|0))if((O|0)<(0-H|0))fa=(f[F>>2]|0)+O|0;else fa=O;else fa=O-(f[F>>2]|0)|0;f[k>>2]=fa;if((H|0)>=(P|0))if((P|0)<(0-H|0))ga=(f[F>>2]|0)+P|0;else ga=P;else ga=P-(f[F>>2]|0)|0;f[a>>2]=ga;if((H|0)>=(q|0))if((q|0)<(0-H|0))ha=(f[F>>2]|0)+q|0;else ha=q;else ha=q-(f[F>>2]|0)|0;f[l>>2]=ha;if((H|0)>=(M|0))if((M|0)<(0-H|0))ia=(f[F>>2]|0)+M|0;else ia=M;else ia=M-(f[F>>2]|0)|0;f[G>>2]=ia;if((((ga|0)>-1?ga:0-ga|0)+((fa|0)>-1?fa:0-fa|0)|0)<(((ha|0)>-1?ha:0-ha|0)+((ia|0)>-1?ia:0-ia|0)|0)){Vi(g,0);ja=k}else{Vi(g,1);ja=l}M=f[ja>>2]|0;if((M|0)<0)ka=(f[F>>2]|0)+M|0;else ka=M;M=c+(N<<2)|0;f[M>>2]=ka;N=f[ja+4>>2]|0;if((N|0)<0)la=(f[F>>2]|0)+N|0;else la=N;f[M+4>>2]=la;K=K+1|0;if((K|0)>=(s|0)){ma=5;break}M=f[p>>2]|0;L=f[M>>2]|0;if((f[M+4>>2]|0)-L>>2>>>0<=K>>>0){J=M;ma=6;break}}if((ma|0)==5){u=e;return 1}else if((ma|0)==6)mq(J);return 0}function rc(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=Oa,T=Oa,U=Oa,V=0,X=0,Y=0,Z=0,_=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0;e=u;u=u+64|0;g=e+36|0;h=e+24|0;i=e+12|0;j=e;k=g+16|0;f[g>>2]=0;f[g+4>>2]=0;f[g+8>>2]=0;f[g+12>>2]=0;n[k>>2]=$(1.0);l=a+80|0;m=f[l>>2]|0;f[j>>2]=0;o=j+4|0;f[o>>2]=0;f[j+8>>2]=0;if(m){if(m>>>0>1073741823)mq(j);p=m<<2;q=dn(p)|0;f[j>>2]=q;r=q+(m<<2)|0;f[j+8>>2]=r;hj(q|0,0,p|0)|0;f[o>>2]=r;r=f[d>>2]|0;d=c+48|0;p=c+40|0;q=i+4|0;m=i+8|0;s=g+4|0;t=g+12|0;v=g+8|0;w=a+40|0;x=a+64|0;y=0;z=0;while(1){A=d;B=f[A>>2]|0;C=f[A+4>>2]|0;A=p;D=on(f[A>>2]|0,f[A+4>>2]|0,r+z|0,0)|0;A=Tn(D|0,I|0,B|0,C|0)|0;C=(f[f[c>>2]>>2]|0)+A|0;A=h;B=C;D=A+12|0;do{b[A>>0]=b[B>>0]|0;A=A+1|0;B=B+1|0}while((A|0)<(D|0));Xl(i|0,C|0,12)|0;B=_f(g,i)|0;if(!B){A=f[i>>2]|0;D=f[q>>2]|0;E=f[m>>2]|0;F=((A^318)+239^D)+239^E;G=f[s>>2]|0;H=(G|0)==0;a:do if(!H){J=G+-1|0;K=(J&G|0)==0;if(!K)if(F>>>0<G>>>0)L=F;else L=(F>>>0)%(G>>>0)|0;else L=F&J;M=f[(f[g>>2]|0)+(L<<2)>>2]|0;if((M|0)!=0?(N=f[M>>2]|0,(N|0)!=0):0){if(K){K=N;while(1){M=f[K+4>>2]|0;if(!((M|0)==(F|0)|(M&J|0)==(L|0))){O=L;P=29;break a}if(((f[K+8>>2]|0)==(A|0)?(f[K+12>>2]|0)==(D|0):0)?(f[K+16>>2]|0)==(E|0):0)break a;K=f[K>>2]|0;if(!K){O=L;P=29;break a}}}else Q=N;while(1){K=f[Q+4>>2]|0;if((K|0)!=(F|0)){if(K>>>0<G>>>0)R=K;else R=(K>>>0)%(G>>>0)|0;if((R|0)!=(L|0)){O=L;P=29;break a}}if(((f[Q+8>>2]|0)==(A|0)?(f[Q+12>>2]|0)==(D|0):0)?(f[Q+16>>2]|0)==(E|0):0)break a;Q=f[Q>>2]|0;if(!Q){O=L;P=29;break}}}else{O=L;P=29}}else{O=0;P=29}while(0);if((P|0)==29){P=0;C=dn(24)|0;f[C+8>>2]=A;f[C+12>>2]=D;f[C+16>>2]=E;f[C+20>>2]=y;f[C+4>>2]=F;f[C>>2]=0;S=$(((f[t>>2]|0)+1|0)>>>0);T=$(G>>>0);U=$(n[k>>2]);do if(H|$(U*T)<S){N=G<<1|(G>>>0<3|(G+-1&G|0)!=0)&1;K=~~$(W($(S/U)))>>>0;Hh(g,N>>>0<K>>>0?K:N);N=f[s>>2]|0;K=N+-1|0;if(!(K&N)){V=N;X=K&F;break}if(F>>>0<N>>>0){V=N;X=F}else{V=N;X=(F>>>0)%(N>>>0)|0}}else{V=G;X=O}while(0);G=(f[g>>2]|0)+(X<<2)|0;F=f[G>>2]|0;if(!F){f[C>>2]=f[v>>2];f[v>>2]=C;f[G>>2]=v;G=f[C>>2]|0;if(G|0){H=f[G+4>>2]|0;G=V+-1|0;if(G&V)if(H>>>0<V>>>0)Y=H;else Y=(H>>>0)%(V>>>0)|0;else Y=H&G;Z=(f[g>>2]|0)+(Y<<2)|0;P=42}}else{f[C>>2]=f[F>>2];Z=F;P=42}if((P|0)==42){P=0;f[Z>>2]=C}f[t>>2]=(f[t>>2]|0)+1}F=w;G=f[F>>2]|0;H=on(G|0,f[F+4>>2]|0,y|0,0)|0;Rg((f[f[x>>2]>>2]|0)+H|0,h|0,G|0)|0;G=f[j>>2]|0;f[G+(z<<2)>>2]=y;_=y+1|0;aa=G}else{G=f[j>>2]|0;f[G+(z<<2)>>2]=f[B+20>>2];_=y;aa=G}z=z+1|0;ba=f[l>>2]|0;if(z>>>0>=ba>>>0)break;else y=_}if((_|0)==(ba|0))ca=aa;else{y=a+84|0;if(!(b[y>>0]|0)){z=f[a+72>>2]|0;h=f[a+68>>2]|0;x=h;if((z|0)==(h|0))da=aa;else{w=z-h>>2;h=0;do{z=x+(h<<2)|0;f[z>>2]=f[aa+(f[z>>2]<<2)>>2];h=h+1|0}while(h>>>0<w>>>0);da=aa}}else{b[y>>0]=0;y=a+68|0;aa=a+72|0;w=f[aa>>2]|0;h=f[y>>2]|0;x=w-h>>2;z=h;h=w;if(ba>>>0<=x>>>0)if(ba>>>0<x>>>0?(w=z+(ba<<2)|0,(w|0)!=(h|0)):0){f[aa>>2]=h+(~((h+-4-w|0)>>>2)<<2);ea=ba}else ea=ba;else{kh(y,ba-x|0,1204);ea=f[l>>2]|0}x=f[j>>2]|0;if(!ea)da=x;else{j=f[a+68>>2]|0;a=0;do{f[j+(a<<2)>>2]=f[x+(a<<2)>>2];a=a+1|0}while(a>>>0<ea>>>0);da=x}}f[l>>2]=_;ca=da}if(!ca)fa=_;else{da=f[o>>2]|0;if((da|0)!=(ca|0))f[o>>2]=da+(~((da+-4-ca|0)>>>2)<<2);br(ca);fa=_}}else fa=0;_=f[g+8>>2]|0;if(_|0){ca=_;do{_=ca;ca=f[ca>>2]|0;br(_)}while((ca|0)!=0)}ca=f[g>>2]|0;f[g>>2]=0;if(!ca){u=e;return fa|0}br(ca);u=e;return fa|0}function sc(a,c){a=a|0;c=c|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0;e=u;u=u+32|0;g=e+4|0;h=e;i=e+16|0;j=c+56|0;k=f[j>>2]|0;l=(f[k+100>>2]|0)-(f[k+96>>2]|0)|0;k=(l|0)/12|0;m=c+44|0;Nh(k,f[m>>2]|0)|0;Nh(f[(f[j>>2]|0)+80>>2]|0,f[m>>2]|0)|0;n=f[c+48>>2]|0;o=dn(32)|0;f[g>>2]=o;f[g+8>>2]=-2147483616;f[g+4>>2]=21;p=o;q=14562;r=p+21|0;do{b[p>>0]=b[q>>0]|0;p=p+1|0;q=q+1|0}while((p|0)<(r|0));b[o+21>>0]=0;o=Oj(n,g,0)|0;if((b[g+11>>0]|0)<0)br(f[g>>2]|0);n=f[m>>2]|0;if(o){b[i>>0]=0;o=n+16|0;q=f[o+4>>2]|0;if(!((q|0)>0|(q|0)==0&(f[o>>2]|0)>>>0>0)){f[h>>2]=f[n+4>>2];f[g>>2]=f[h>>2];ye(n,g,i,i+1|0)|0}Ye(c)|0;f[a>>2]=0;f[a+4>>2]=0;f[a+8>>2]=0;f[a+12>>2]=0;u=e;return}b[i>>0]=1;c=n+16|0;o=f[c+4>>2]|0;if(!((o|0)>0|(o|0)==0&(f[c>>2]|0)>>>0>0)){f[h>>2]=f[n+4>>2];f[g>>2]=f[h>>2];ye(n,g,i,i+1|0)|0}n=f[j>>2]|0;c=f[n+80>>2]|0;if(c>>>0<256){if(!l){f[a>>2]=0;f[a+4>>2]=0;f[a+8>>2]=0;f[a+12>>2]=0;u=e;return}o=i+1|0;q=i+1|0;p=i+1|0;r=0;s=n;while(1){t=f[s+96>>2]|0;v=f[m>>2]|0;b[i>>0]=f[t+(r*12|0)>>2];w=v+16|0;x=f[w>>2]|0;y=f[w+4>>2]|0;if((y|0)>0|(y|0)==0&x>>>0>0){z=x;A=v;B=y}else{f[h>>2]=f[v+4>>2];f[g>>2]=f[h>>2];ye(v,g,i,p)|0;v=f[m>>2]|0;y=v+16|0;z=f[y>>2]|0;A=v;B=f[y+4>>2]|0}b[i>>0]=f[t+(r*12|0)+4>>2];if((B|0)>0|(B|0)==0&z>>>0>0){C=B;D=z;E=A}else{f[h>>2]=f[A+4>>2];f[g>>2]=f[h>>2];ye(A,g,i,q)|0;y=f[m>>2]|0;v=y+16|0;C=f[v+4>>2]|0;D=f[v>>2]|0;E=y}b[i>>0]=f[t+(r*12|0)+8>>2];if(!((C|0)>0|(C|0)==0&D>>>0>0)){f[h>>2]=f[E+4>>2];f[g>>2]=f[h>>2];ye(E,g,i,o)|0}t=r+1|0;if(t>>>0>=k>>>0)break;r=t;s=f[j>>2]|0}f[a>>2]=0;f[a+4>>2]=0;f[a+8>>2]=0;f[a+12>>2]=0;u=e;return}if(c>>>0<65536){if(!l){f[a>>2]=0;f[a+4>>2]=0;f[a+8>>2]=0;f[a+12>>2]=0;u=e;return}s=i+2|0;r=i+2|0;o=i+2|0;E=0;D=n;while(1){C=f[D+96>>2]|0;q=f[m>>2]|0;d[i>>1]=f[C+(E*12|0)>>2];A=q+16|0;z=f[A>>2]|0;B=f[A+4>>2]|0;if((B|0)>0|(B|0)==0&z>>>0>0){F=B;G=z;H=q}else{f[h>>2]=f[q+4>>2];f[g>>2]=f[h>>2];ye(q,g,i,o)|0;q=f[m>>2]|0;z=q+16|0;F=f[z+4>>2]|0;G=f[z>>2]|0;H=q}d[i>>1]=f[C+(E*12|0)+4>>2];if((F|0)>0|(F|0)==0&G>>>0>0){I=F;J=G;K=H}else{f[h>>2]=f[H+4>>2];f[g>>2]=f[h>>2];ye(H,g,i,r)|0;q=f[m>>2]|0;z=q+16|0;I=f[z+4>>2]|0;J=f[z>>2]|0;K=q}d[i>>1]=f[C+(E*12|0)+8>>2];if(!((I|0)>0|(I|0)==0&J>>>0>0)){f[h>>2]=f[K+4>>2];f[g>>2]=f[h>>2];ye(K,g,i,s)|0}C=E+1|0;if(C>>>0>=k>>>0)break;E=C;D=f[j>>2]|0}f[a>>2]=0;f[a+4>>2]=0;f[a+8>>2]=0;f[a+12>>2]=0;u=e;return}D=(l|0)!=0;if(c>>>0<2097152){if(D){L=0;M=n}else{f[a>>2]=0;f[a+4>>2]=0;f[a+8>>2]=0;f[a+12>>2]=0;u=e;return}while(1){c=f[M+96>>2]|0;Nh(f[c+(L*12|0)>>2]|0,f[m>>2]|0)|0;Nh(f[c+(L*12|0)+4>>2]|0,f[m>>2]|0)|0;Nh(f[c+(L*12|0)+8>>2]|0,f[m>>2]|0)|0;c=L+1|0;if(c>>>0>=k>>>0)break;L=c;M=f[j>>2]|0}f[a>>2]=0;f[a+4>>2]=0;f[a+8>>2]=0;f[a+12>>2]=0;u=e;return}if(!D){f[a>>2]=0;f[a+4>>2]=0;f[a+8>>2]=0;f[a+12>>2]=0;u=e;return}D=0;M=n;while(1){n=(f[M+96>>2]|0)+(D*12|0)|0;L=f[m>>2]|0;c=L+16|0;l=f[c+4>>2]|0;if(!((l|0)>0|(l|0)==0&(f[c>>2]|0)>>>0>0)){f[h>>2]=f[L+4>>2];f[g>>2]=f[h>>2];ye(L,g,n,n+12|0)|0}n=D+1|0;if(n>>>0>=k>>>0)break;D=n;M=f[j>>2]|0}f[a>>2]=0;f[a+4>>2]=0;f[a+8>>2]=0;f[a+12>>2]=0;u=e;return}function tc(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0;e=u;u=u+32|0;g=e+16|0;h=e+12|0;i=e+8|0;j=e+4|0;k=e;switch(f[c+28>>2]|0){case 9:{l=f[d>>2]|0;switch(b[c+24>>0]|0){case 1:{f[h>>2]=l;f[g>>2]=f[h>>2];m=ec(a,c,g)|0;break}case 2:{f[i>>2]=l;f[g>>2]=f[i>>2];m=Xb(a,c,g)|0;break}case 3:{f[j>>2]=l;f[g>>2]=f[j>>2];m=rc(a,c,g)|0;break}case 4:{f[k>>2]=l;f[g>>2]=f[k>>2];m=jc(a,c,g)|0;break}default:m=0}n=m;break}case 1:{m=f[d>>2]|0;switch(b[c+24>>0]|0){case 1:{f[h>>2]=m;f[g>>2]=f[h>>2];o=dc(a,c,g)|0;break}case 2:{f[i>>2]=m;f[g>>2]=f[i>>2];o=Yb(a,c,g)|0;break}case 3:{f[j>>2]=m;f[g>>2]=f[j>>2];o=pc(a,c,g)|0;break}case 4:{f[k>>2]=m;f[g>>2]=f[k>>2];o=ic(a,c,g)|0;break}default:o=0}n=o;break}case 11:case 2:{o=f[d>>2]|0;switch(b[c+24>>0]|0){case 1:{f[h>>2]=o;f[g>>2]=f[h>>2];p=dc(a,c,g)|0;break}case 2:{f[i>>2]=o;f[g>>2]=f[i>>2];p=Yb(a,c,g)|0;break}case 3:{f[j>>2]=o;f[g>>2]=f[j>>2];p=pc(a,c,g)|0;break}case 4:{f[k>>2]=o;f[g>>2]=f[k>>2];p=ic(a,c,g)|0;break}default:p=0}n=p;break}case 4:{p=f[d>>2]|0;switch(b[c+24>>0]|0){case 1:{f[h>>2]=p;f[g>>2]=f[h>>2];q=bc(a,c,g)|0;break}case 2:{f[i>>2]=p;f[g>>2]=f[i>>2];q=Vb(a,c,g)|0;break}case 3:{f[j>>2]=p;f[g>>2]=f[j>>2];q=kc(a,c,g)|0;break}case 4:{f[k>>2]=p;f[g>>2]=f[k>>2];q=gc(a,c,g)|0;break}default:q=0}n=q;break}case 3:{q=f[d>>2]|0;switch(b[c+24>>0]|0){case 1:{f[h>>2]=q;f[g>>2]=f[h>>2];r=bc(a,c,g)|0;break}case 2:{f[i>>2]=q;f[g>>2]=f[i>>2];r=Vb(a,c,g)|0;break}case 3:{f[j>>2]=q;f[g>>2]=f[j>>2];r=kc(a,c,g)|0;break}case 4:{f[k>>2]=q;f[g>>2]=f[k>>2];r=gc(a,c,g)|0;break}default:r=0}n=r;break}case 6:{r=f[d>>2]|0;switch(b[c+24>>0]|0){case 1:{f[h>>2]=r;f[g>>2]=f[h>>2];s=ec(a,c,g)|0;break}case 2:{f[i>>2]=r;f[g>>2]=f[i>>2];s=Xb(a,c,g)|0;break}case 3:{f[j>>2]=r;f[g>>2]=f[j>>2];s=rc(a,c,g)|0;break}case 4:{f[k>>2]=r;f[g>>2]=f[k>>2];s=jc(a,c,g)|0;break}default:s=0}n=s;break}case 5:{s=f[d>>2]|0;switch(b[c+24>>0]|0){case 1:{f[h>>2]=s;f[g>>2]=f[h>>2];t=ec(a,c,g)|0;break}case 2:{f[i>>2]=s;f[g>>2]=f[i>>2];t=Xb(a,c,g)|0;break}case 3:{f[j>>2]=s;f[g>>2]=f[j>>2];t=rc(a,c,g)|0;break}case 4:{f[k>>2]=s;f[g>>2]=f[k>>2];t=jc(a,c,g)|0;break}default:t=0}n=t;break}default:{v=-1;u=e;return v|0}}v=(n|0)==0?-1:n;u=e;return v|0}function uc(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0;e=u;u=u+32|0;g=e+16|0;h=e+12|0;i=e+29|0;j=e;k=e+28|0;if(!(f[(f[a+8>>2]|0)+80>>2]|0)){l=1;u=e;return l|0}b[i>>0]=-2;m=a+36|0;n=f[m>>2]|0;if(n)if(Ra[f[(f[a>>2]|0)+40>>2]&127](a,n)|0){n=f[m>>2]|0;o=(Qa[f[(f[n>>2]|0)+8>>2]&127](n)|0)&255;b[i>>0]=o;p=5}else q=0;else p=5;if((p|0)==5){o=d+16|0;n=o;r=f[n+4>>2]|0;if(!((r|0)>0|(r|0)==0&(f[n>>2]|0)>>>0>0)){f[h>>2]=f[d+4>>2];f[g>>2]=f[h>>2];ye(d,g,i,i+1|0)|0}i=f[m>>2]|0;if(i|0?(n=(Qa[f[(f[i>>2]|0)+36>>2]&127](i)|0)&255,b[j>>0]=n,n=o,i=f[n+4>>2]|0,!((i|0)>0|(i|0)==0&(f[n>>2]|0)>>>0>0)):0){f[h>>2]=f[d+4>>2];f[g>>2]=f[h>>2];ye(d,g,j,j+1|0)|0}n=f[a+32>>2]|0;i=b[n+24>>0]|0;r=X(f[n+80>>2]|0,i)|0;s=(f[f[n>>2]>>2]|0)+(f[n+48>>2]|0)|0;f[j>>2]=0;n=j+4|0;f[n>>2]=0;f[j+8>>2]=0;t=(r|0)==0;do if(!t)if(r>>>0>1073741823)mq(j);else{v=r<<2;w=dn(v)|0;f[j>>2]=w;x=w+(r<<2)|0;f[j+8>>2]=x;hj(w|0,0,v|0)|0;f[n>>2]=x;y=w;break}else y=0;while(0);w=f[m>>2]|0;do if(w){Ta[f[(f[w>>2]|0)+44>>2]&31](w,s,y,r,i,f[c>>2]|0)|0;x=f[m>>2]|0;if(!x){z=s;A=f[j>>2]|0;p=20;break}if(!(Qa[f[(f[x>>2]|0)+32>>2]&127](x)|0)){x=f[j>>2]|0;z=f[m>>2]|0?x:s;A=x;p=20}}else{z=s;A=y;p=20}while(0);if((p|0)==20)km(z,r,A);A=a+4|0;a=f[A>>2]|0;do if(a){z=f[a+48>>2]|0;f[g>>2]=0;f[g+4>>2]=0;f[g+8>>2]=0;y=dn(48)|0;f[g>>2]=y;f[g+8>>2]=-2147483600;f[g+4>>2]=34;s=y;w=9835;x=s+34|0;do{b[s>>0]=b[w>>0]|0;s=s+1|0;w=w+1|0}while((s|0)<(x|0));b[y+34>>0]=0;w=Oj(z,g,1)|0;if((b[g+11>>0]|0)<0)br(f[g>>2]|0);if(!w){if(!t){w=f[j>>2]|0;s=0;x=0;do{x=f[w+(s<<2)>>2]|x;s=s+1|0}while((s|0)!=(r|0));if(x)B=((_(x|0)|0)>>>3^3)+1|0;else B=1}else B=1;b[k>>0]=0;s=o;w=f[s>>2]|0;z=f[s+4>>2]|0;if((z|0)>0|(z|0)==0&w>>>0>0){C=z;D=w}else{f[h>>2]=f[d+4>>2];f[g>>2]=f[h>>2];ye(d,g,k,k+1|0)|0;w=o;C=f[w+4>>2]|0;D=f[w>>2]|0}b[k>>0]=B;if(!((C|0)>0|(C|0)==0&D>>>0>0)){f[h>>2]=f[d+4>>2];f[g>>2]=f[h>>2];ye(d,g,k,k+1|0)|0}if((B|0)==(Ll(5)|0)){w=f[j>>2]|0;z=o;s=f[z+4>>2]|0;if(!((s|0)>0|(s|0)==0&(f[z>>2]|0)>>>0>0)){f[h>>2]=f[d+4>>2];f[g>>2]=f[h>>2];ye(d,g,w,w+(r<<2)|0)|0}p=48;break}if(t)p=48;else{w=d+4|0;z=0;do{s=(f[j>>2]|0)+(z<<2)|0;y=o;v=f[y+4>>2]|0;if(!((v|0)>0|(v|0)==0&(f[y>>2]|0)>>>0>0)){f[h>>2]=f[w>>2];f[g>>2]=f[h>>2];ye(d,g,s,s+B|0)|0}z=z+1|0}while(z>>>0<r>>>0);p=48}}else p=27}else p=27;while(0);if((p|0)==27){b[k>>0]=1;r=o;o=f[r+4>>2]|0;if(!((o|0)>0|(o|0)==0&(f[r>>2]|0)>>>0>0)){f[h>>2]=f[d+4>>2];f[g>>2]=f[h>>2];ye(d,g,k,k+1|0)|0}wp(g);k=f[A>>2]|0;if(k|0)Pj(g,10-(Yh(f[k+48>>2]|0)|0)|0)|0;k=Dc(f[j>>2]|0,X((f[c+4>>2]|0)-(f[c>>2]|0)>>2,i)|0,i,g,d)|0;sj(g,f[g+4>>2]|0);if(k)p=48;else E=0}if((p|0)==48){p=f[m>>2]|0;if(!p)E=1;else{Ra[f[(f[p>>2]|0)+40>>2]&127](p,d)|0;E=1}}d=f[j>>2]|0;if(d|0){j=f[n>>2]|0;if((j|0)!=(d|0))f[n>>2]=j+(~((j+-4-d|0)>>>2)<<2);br(d)}q=E}l=q;u=e;return l|0}function vc(a){a=a|0;var b=0,c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0;b=u;u=u+48|0;c=b+24|0;d=b+12|0;e=b;g=a+32|0;h=a+8|0;i=a+12|0;j=f[i>>2]|0;k=f[h>>2]|0;l=j-k>>2;m=a+36|0;n=f[m>>2]|0;o=f[g>>2]|0;p=n-o>>2;q=o;o=n;n=k;if(l>>>0<=p>>>0)if(l>>>0<p>>>0?(r=q+(l<<2)|0,(r|0)!=(o|0)):0){f[m>>2]=o+(~((o+-4-r|0)>>>2)<<2);s=n;t=k;v=j}else{s=n;t=k;v=j}else{oi(g,l-p|0);p=f[h>>2]|0;s=p;t=p;v=f[i>>2]|0}p=v-t|0;l=p>>2;f[c>>2]=0;j=c+4|0;f[j>>2]=0;k=c+8|0;f[k>>2]=0;if(l|0){if((p|0)<0)mq(c);p=((l+-1|0)>>>5)+1|0;n=dn(p<<2)|0;f[c>>2]=n;f[k>>2]=p;f[j>>2]=l;j=l>>>5;hj(n|0,0,j<<2|0)|0;p=l&31;l=n+(j<<2)|0;if(p|0)f[l>>2]=f[l>>2]&~(-1>>>(32-p|0))}p=a+20|0;l=0;j=s;s=t;t=v;while(1){if(l>>>0<t-s>>2>>>0){w=0;x=0;y=l;z=s;A=j}else{B=25;break}while(1){v=x>>>5;n=1<<(x&31);do if(!(f[(f[c>>2]|0)+(v<<2)>>2]&n)){k=f[A+(x<<2)>>2]|0;if((f[k+8>>2]|0)!=(f[k+4>>2]|0)){r=0;o=1;m=A;q=k;while(1){k=f[(f[q+4>>2]|0)+(r<<2)>>2]|0;C=0;D=m;while(1){E=f[D+(x<<2)>>2]|0;if((C|0)>=(Ra[f[(f[E>>2]|0)+24>>2]&127](E,k)|0)){F=o;break}E=f[(f[h>>2]|0)+(x<<2)>>2]|0;G=Sa[f[(f[E>>2]|0)+28>>2]&31](E,k,C)|0;if((G|0)!=(x|0)?(E=f[(f[p>>2]|0)+(G<<2)>>2]|0,(1<<(E&31)&f[(f[c>>2]|0)+(E>>>5<<2)>>2]|0)==0):0){F=0;break}C=C+1|0;D=f[h>>2]|0}r=r+1|0;m=f[h>>2]|0;q=f[m+(x<<2)>>2]|0;if(r>>>0>=(f[q+8>>2]|0)-(f[q+4>>2]|0)>>2>>>0)break;else o=F}o=m;if(F)H=o;else{I=w;J=y;K=o;break}}else H=z;f[(f[g>>2]|0)+(y<<2)>>2]=x;o=(f[c>>2]|0)+(v<<2)|0;f[o>>2]=f[o>>2]|n;I=1;J=y+1|0;K=H}else{I=w;J=y;K=z}while(0);x=x+1|0;L=f[i>>2]|0;M=L-K>>2;A=K;if(x>>>0>=M>>>0)break;else{w=I;y=J;z=K}}if(J>>>0<M>>>0&(I^1)){N=0;break}else{l=J;j=A;s=K;t=L}}if((B|0)==25){f[d>>2]=0;B=d+4|0;f[B>>2]=0;f[d+8>>2]=0;L=f[a+4>>2]|0;a=(f[L+12>>2]|0)-(f[L+8>>2]|0)|0;L=a>>2;f[e>>2]=0;K=e+4|0;f[K>>2]=0;A=e+8|0;f[A>>2]=0;if(L|0){if((a|0)<0)mq(e);a=((L+-1|0)>>>5)+1|0;J=dn(a<<2)|0;f[e>>2]=J;f[A>>2]=a;f[K>>2]=L;K=L>>>5;hj(J|0,0,K<<2|0)|0;a=L&31;L=J+(K<<2)|0;if(a|0)f[L>>2]=f[L>>2]&~(-1>>>(32-a|0))}a:do if((t|0)==(s|0))O=1;else{a=0;L=j;K=s;J=t;while(1){A=f[(f[g>>2]|0)+(a<<2)>>2]|0;l=f[L+(A<<2)>>2]|0;I=(f[l+8>>2]|0)-(f[l+4>>2]|0)|0;l=I>>2;if((I|0)<8){P=K;Q=J}else{I=f[B>>2]|0;M=f[d>>2]|0;z=I-M>>2;y=M;M=I;if(l>>>0<=z>>>0)if(l>>>0<z>>>0?(I=y+(l<<2)|0,(I|0)!=(M|0)):0){f[B>>2]=M+(~((M+-4-I|0)>>>2)<<2);R=0}else R=0;else{oi(d,l-z|0);R=0}while(1){if((R|0)<(l|0)){S=0;T=0;U=R}else break;while(1){z=f[(f[h>>2]|0)+(A<<2)>>2]|0;I=f[(f[z+4>>2]|0)+(S<<2)>>2]|0;M=S>>>5;y=1<<(S&31);if(!(f[(f[e>>2]|0)+(M<<2)>>2]&y)){w=0;x=1;H=z;while(1){if((w|0)>=(Ra[f[(f[H>>2]|0)+24>>2]&127](H,I)|0)){V=x;break}z=f[(f[h>>2]|0)+(A<<2)>>2]|0;F=Sa[f[(f[z>>2]|0)+28>>2]&31](z,I,w)|0;z=(f[(f[e>>2]|0)+(F>>>5<<2)>>2]&1<<(F&31)|0)!=0;F=x&z;if(!z){V=F;break}w=w+1|0;x=F;H=f[(f[h>>2]|0)+(A<<2)>>2]|0}if(V){f[(f[d>>2]|0)+(U<<2)>>2]=S;H=(f[e>>2]|0)+(M<<2)|0;f[H>>2]=f[H>>2]|y;W=1;X=U+1|0}else{W=T;X=U}}else{W=T;X=U}S=S+1|0;if((S|0)>=(l|0))break;else{T=W;U=X}}if(W|(X|0)>=(l|0))R=X;else{O=0;break a}}Of(f[(f[h>>2]|0)+(A<<2)>>2]|0,d);P=f[h>>2]|0;Q=f[i>>2]|0}a=a+1|0;if(a>>>0>=Q-P>>2>>>0){O=1;break}else{L=P;K=P;J=Q}}}while(0);Q=f[e>>2]|0;if(Q|0)br(Q);Q=f[d>>2]|0;if(Q|0){d=f[B>>2]|0;if((d|0)!=(Q|0))f[B>>2]=d+(~((d+-4-Q|0)>>>2)<<2);br(Q)}N=O}O=f[c>>2]|0;if(!O){u=b;return N|0}br(O);u=b;return N|0}\nfunction uj(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0;e=u;u=u+16|0;g=e;h=a+4|0;f[h>>2]=c;i=f[c+64>>2]|0;c=((f[i+4>>2]|0)-(f[i>>2]|0)>>2>>>0)/3|0;b[g>>0]=0;Xg(a+24|0,c,g);c=f[h>>2]|0;h=(f[c+56>>2]|0)-(f[c+52>>2]|0)>>2;b[g>>0]=0;Xg(a+36|0,h,g);g=a+8|0;f[g>>2]=f[d>>2];f[g+4>>2]=f[d+4>>2];f[g+8>>2]=f[d+8>>2];f[g+12>>2]=f[d+12>>2];u=e;return}function vj(a){a=a|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0;c=a;a:do if(!(c&3)){d=a;e=4}else{g=a;h=c;while(1){if(!(b[g>>0]|0)){i=h;break a}j=g+1|0;h=j;if(!(h&3)){d=j;e=4;break}else g=j}}while(0);if((e|0)==4){e=d;while(1){k=f[e>>2]|0;if(!((k&-2139062144^-2139062144)&k+-16843009))e=e+4|0;else break}if(!((k&255)<<24>>24))l=e;else{k=e;while(1){e=k+1|0;if(!(b[e>>0]|0)){l=e;break}else k=e}}i=l}return i-c|0}function wj(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0;e=u;u=u+16|0;g=e;h=a+11|0;i=b[h>>0]|0;j=i<<24>>24<0;if(j)k=f[a+4>>2]|0;else k=i&255;do if(k>>>0>=c>>>0)if(j){i=(f[a>>2]|0)+c|0;b[g>>0]=0;Hp(i,g);f[a+4>>2]=c;break}else{b[g>>0]=0;Hp(a+c|0,g);b[h>>0]=c;break}else Xi(a,c-k|0,d)|0;while(0);u=e;return}function xj(a){a=a|0;var b=0,c=0,d=0;if(!a)return;b=a+88|0;c=f[b>>2]|0;f[b>>2]=0;if(c|0){b=f[c+8>>2]|0;if(b|0){d=c+12|0;if((f[d>>2]|0)!=(b|0))f[d>>2]=b;br(b)}br(c)}c=f[a+68>>2]|0;if(c|0){b=a+72|0;d=f[b>>2]|0;if((d|0)!=(c|0))f[b>>2]=d+(~((d+-4-c|0)>>>2)<<2);br(c)}c=a+64|0;d=f[c>>2]|0;f[c>>2]=0;if(d|0){c=f[d>>2]|0;if(c|0){b=d+4|0;if((f[b>>2]|0)!=(c|0))f[b>>2]=c;br(c)}br(d)}br(a);return}function yj(a,c,d,e,g,h,i,j,k,l){a=a|0;c=c|0;d=d|0;e=e|0;g=g|0;h=h|0;i=i|0;j=j|0;k=k|0;l=l|0;var m=0,n=0,o=0;f[a>>2]=d;if(d|0){m=d+16|0;n=f[m+4>>2]|0;o=a+8|0;f[o>>2]=f[m>>2];f[o+4>>2]=n;n=d+24|0;d=f[n+4>>2]|0;o=a+16|0;f[o>>2]=f[n>>2];f[o+4>>2]=d}b[a+24>>0]=e;f[a+28>>2]=g;b[a+32>>0]=h&1;h=a+40|0;f[h>>2]=i;f[h+4>>2]=j;j=a+48|0;f[j>>2]=k;f[j+4>>2]=l;f[a+56>>2]=c;return}function zj(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0;if((f[c+76>>2]|0)>=0?(gr(c)|0)!=0:0){d=a&255;e=a&255;if((e|0)!=(b[c+75>>0]|0)?(g=c+20|0,h=f[g>>2]|0,h>>>0<(f[c+16>>2]|0)>>>0):0){f[g>>2]=h+1;b[h>>0]=d;i=e}else i=Bj(c,a)|0;fr(c);j=i}else k=3;do if((k|0)==3){i=a&255;e=a&255;if((e|0)!=(b[c+75>>0]|0)?(d=c+20|0,h=f[d>>2]|0,h>>>0<(f[c+16>>2]|0)>>>0):0){f[d>>2]=h+1;b[h>>0]=i;j=e;break}j=Bj(c,a)|0}while(0);return j|0}function Aj(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0;d=u;u=u+16|0;e=d+4|0;g=d;h=d+8|0;i=f[a+4>>2]|0;if((i|0)==-1){j=0;u=d;return j|0}b[h>>0]=i;i=c+16|0;a=f[i+4>>2]|0;if(!((a|0)>0|(a|0)==0&(f[i>>2]|0)>>>0>0)){f[g>>2]=f[c+4>>2];f[e>>2]=f[g>>2];ye(c,e,h,h+1|0)|0}j=1;u=d;return j|0}function Bj(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,i=0,j=0,k=0,l=0,m=0,n=0;d=u;u=u+16|0;e=d;g=c&255;b[e>>0]=g;i=a+16|0;j=f[i>>2]|0;if(!j)if(!(pl(a)|0)){k=f[i>>2]|0;l=4}else m=-1;else{k=j;l=4}do if((l|0)==4){j=a+20|0;i=f[j>>2]|0;if(i>>>0<k>>>0?(n=c&255,(n|0)!=(b[a+75>>0]|0)):0){f[j>>2]=i+1;b[i>>0]=g;m=n;break}if((Sa[f[a+36>>2]&31](a,e,1)|0)==1)m=h[e>>0]|0;else m=-1}while(0);u=d;return m|0}function Cj(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0;c=dn(88)|0;d=c+60|0;e=c;g=e+60|0;do{f[e>>2]=0;e=e+4|0}while((e|0)<(g|0));f[d>>2]=c;d=c+64|0;f[d>>2]=0;f[d+4>>2]=0;f[d+8>>2]=0;f[d+12>>2]=0;f[d+16>>2]=0;f[d+20>>2]=0;d=Kf(c,b)|0;f[a>>2]=d?c:0;a=d?0:c;if(d)return;ui(a);br(a);return}function Dj(a,b){a=a|0;b=b|0;if(!b)return;else{Dj(a,f[b>>2]|0);Dj(a,f[b+4>>2]|0);sj(b+20|0,f[b+24>>2]|0);br(b);return}}function Ej(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0;e=u;u=u+16|0;g=e;h=a+4|0;f[h>>2]=c;i=((f[c+4>>2]|0)-(f[c>>2]|0)>>2>>>0)/3|0;b[g>>0]=0;Xg(a+24|0,i,g);i=f[h>>2]|0;h=(f[i+28>>2]|0)-(f[i+24>>2]|0)>>2;b[g>>0]=0;Xg(a+36|0,h,g);g=a+8|0;f[g>>2]=f[d>>2];f[g+4>>2]=f[d+4>>2];f[g+8>>2]=f[d+8>>2];f[g+12>>2]=f[d+12>>2];u=e;return}function Fj(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0;e=u;u=u+16|0;g=e;h=e+4|0;f[g>>2]=c;c=a+4|0;a=dn(32)|0;f[h>>2]=a;f[h+8>>2]=-2147483616;f[h+4>>2]=17;i=a;j=12932;k=i+17|0;do{b[i>>0]=b[j>>0]|0;i=i+1|0;j=j+1|0}while((i|0)<(k|0));b[a+17>>0]=0;Nj(wd(c,g)|0,h,d);if((b[h+11>>0]|0)>=0){u=e;return}br(f[h>>2]|0);u=e;return}function Gj(a,b){a=a|0;b=b|0;var c=0,d=0,e=0;c=f[a+16>>2]|0;if(((f[a+20>>2]|0)-c>>2|0)<=(b|0)){d=0;return d|0}e=f[c+(b<<2)>>2]|0;if((e|0)<0){d=0;return d|0}b=a+48|0;if((f[a+52>>2]|0)>>>0<=e>>>0)pe(b,e+1|0,0);c=(f[b>>2]|0)+(e>>>5<<2)|0;f[c>>2]=f[c>>2]|1<<(e&31);c=f[a+36>>2]|0;if((f[a+40>>2]|0)-c>>2>>>0<=e>>>0){d=1;return d|0}Pp(f[c+(e<<2)>>2]|0);d=1;return d|0}function Hj(a){a=a|0;if(!a)return;f[a>>2]=1136;sj(a+28|0,f[a+32>>2]|0);nj(a+16|0,f[a+20>>2]|0);sj(a+4|0,f[a+8>>2]|0);br(a);return}function Ij(a){a=a|0;f[a>>2]=1136;sj(a+28|0,f[a+32>>2]|0);nj(a+16|0,f[a+20>>2]|0);sj(a+4|0,f[a+8>>2]|0);return}function Jj(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;if(c>>>0>0|(c|0)==0&a>>>0>4294967295){e=d;f=a;g=c;while(1){c=an(f|0,g|0,10,0)|0;e=e+-1|0;b[e>>0]=c&255|48;c=f;f=up(f|0,g|0,10,0)|0;if(!(g>>>0>9|(g|0)==9&c>>>0>4294967295))break;else g=I}h=f;i=e}else{h=a;i=d}if(!h)j=i;else{d=h;h=i;while(1){i=h+-1|0;b[i>>0]=(d>>>0)%10|0|48;if(d>>>0<10){j=i;break}else{d=(d>>>0)/10|0;h=i}}}return j|0}function Kj(a){a=a|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0;c=a;while(1){d=c+1|0;if(!(tq(b[c>>0]|0)|0))break;else c=d}a=b[c>>0]|0;switch(a<<24>>24|0){case 45:{e=1;f=5;break}case 43:{e=0;f=5;break}default:{g=0;h=c;i=a}}if((f|0)==5){g=e;h=d;i=b[d>>0]|0}if(!(Pq(i<<24>>24)|0))j=0;else{i=0;d=h;while(1){h=(i*10|0)+48-(b[d>>0]|0)|0;d=d+1|0;if(!(Pq(b[d>>0]|0)|0)){j=h;break}else i=h}}return (g|0?j:0-j|0)|0}function Lj(a,c,d){a=a|0;c=c|0;d=$(d);var e=0,g=0,h=0;e=u;u=u+16|0;g=e;cl(g,d);h=mi(a,c)|0;c=h+11|0;if((b[c>>0]|0)<0){b[f[h>>2]>>0]=0;f[h+4>>2]=0}else{b[h>>0]=0;b[c>>0]=0}Ng(h,0);f[h>>2]=f[g>>2];f[h+4>>2]=f[g+4>>2];f[h+8>>2]=f[g+8>>2];u=e;return}function Mj(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0;e=u;u=u+16|0;g=e;fl(g,d&1);d=mi(a,c)|0;c=d+11|0;if((b[c>>0]|0)<0){b[f[d>>2]>>0]=0;f[d+4>>2]=0}else{b[d>>0]=0;b[c>>0]=0}Ng(d,0);f[d>>2]=f[g>>2];f[d+4>>2]=f[g+4>>2];f[d+8>>2]=f[g+8>>2];u=e;return}function Nj(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0;e=u;u=u+16|0;g=e;fl(g,d);d=mi(a,c)|0;c=d+11|0;if((b[c>>0]|0)<0){b[f[d>>2]>>0]=0;f[d+4>>2]=0}else{b[d>>0]=0;b[c>>0]=0}Ng(d,0);f[d>>2]=f[g>>2];f[d+4>>2]=f[g+4>>2];f[d+8>>2]=f[g+8>>2];u=e;return}function Oj(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0;e=zg(a,c)|0;if((e|0)==(a+4|0)){g=-1;h=(g|0)==-1;i=(g|0)!=0;j=h?d:i;return j|0}a=e+28|0;if((b[a+11>>0]|0)<0)k=f[a>>2]|0;else k=a;g=Kj(k)|0;h=(g|0)==-1;i=(g|0)!=0;j=h?d:i;return j|0}function Pj(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0;d=u;u=u+16|0;e=d;if(c>>>0>10){g=0;u=d;return g|0}h=dn(48)|0;f[e>>2]=h;f[e+8>>2]=-2147483600;f[e+4>>2]=33;i=h;j=13067;k=i+33|0;do{b[i>>0]=b[j>>0]|0;i=i+1|0;j=j+1|0}while((i|0)<(k|0));b[h+33>>0]=0;Nj(a,e,c);if((b[e+11>>0]|0)<0)br(f[e>>2]|0);g=1;u=d;return g|0}function Qj(a){a=a|0;f[a>>2]=1136;sj(a+28|0,f[a+32>>2]|0);nj(a+16|0,f[a+20>>2]|0);sj(a+4|0,f[a+8>>2]|0);br(a);return}function Rj(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0;c=f[b>>2]|0;if((c|0)==-1)return 1;b=c*3|0;if((b|0)==-1)return 1;c=f[a>>2]|0;a=f[c+(b<<2)>>2]|0;d=b+1|0;e=((d>>>0)%3|0|0)==0?b+-2|0:d;if((e|0)==-1)g=-1;else g=f[c+(e<<2)>>2]|0;e=(((b>>>0)%3|0|0)==0?2:-1)+b|0;if((e|0)==-1)h=-1;else h=f[c+(e<<2)>>2]|0;if((a|0)==(g|0))return 1;else return (a|0)==(h|0)|(g|0)==(h|0)|0;return 0}function Sj(a){a=a|0;f[a>>2]=2968;sj(a+28|0,f[a+32>>2]|0);Dj(a+16|0,f[a+20>>2]|0);sj(a+4|0,f[a+8>>2]|0);return}function Tj(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,i=0,j=0,k=0;d=0;while(1){if((h[15560+d>>0]|0)==(a|0)){e=2;break}g=d+1|0;if((g|0)==87){i=15648;j=87;e=5;break}else d=g}if((e|0)==2)if(!d)k=15648;else{i=15648;j=d;e=5}if((e|0)==5)while(1){e=0;d=i;do{a=d;d=d+1|0}while((b[a>>0]|0)!=0);j=j+-1|0;if(!j){k=d;break}else{i=d;e=5}}return yq(k,f[c+20>>2]|0)|0}function Uj(a,b){a=+a;b=b|0;var c=0,d=0,e=0,g=0.0,h=0.0,i=0,j=0.0;p[s>>3]=a;c=f[s>>2]|0;d=f[s+4>>2]|0;e=Wn(c|0,d|0,52)|0;switch(e&2047){case 0:{if(a!=0.0){g=+Uj(a*18446744073709551616.0,b);h=g;i=(f[b>>2]|0)+-64|0}else{h=a;i=0}f[b>>2]=i;j=h;break}case 2047:{j=a;break}default:{f[b>>2]=(e&2047)+-1022;f[s>>2]=c;f[s+4>>2]=d&-2146435073|1071644672;j=+p[s>>3]}}return +j}function Vj(a){a=a|0;f[a>>2]=2968;sj(a+28|0,f[a+32>>2]|0);Dj(a+16|0,f[a+20>>2]|0);sj(a+4|0,f[a+8>>2]|0);br(a);return}function Wj(a,b){a=+a;b=b|0;var c=0.0,d=0,e=0,g=0.0,h=0;if((b|0)<=1023)if((b|0)<-1022){c=a*2.2250738585072014e-308;d=(b|0)<-2044;e=b+2044|0;g=d?c*2.2250738585072014e-308:c;h=d?((e|0)>-1022?e:-1022):b+1022|0}else{g=a;h=b}else{c=a*8988465674311579538646525.0e283;e=(b|0)>2046;d=b+-2046|0;g=e?c*8988465674311579538646525.0e283:c;h=e?((d|0)<1023?d:1023):b+-1023|0}b=Rn(h+1023|0,0,52)|0;h=I;f[s>>2]=b;f[s+4>>2]=h;return +(g*+p[s>>3])}function Xj(a){a=a|0;var b=0,c=0,d=0,e=0,g=0,h=0;if(!(f[a+80>>2]|0)){b=0;return b|0}c=a+8|0;d=a+12|0;a=f[c>>2]|0;if(((f[d>>2]|0)-a|0)>0){e=0;g=a}else{b=1;return b|0}while(1){a=f[g+(e<<2)>>2]|0;e=e+1|0;if(!(yl(a,a)|0)){b=0;h=5;break}g=f[c>>2]|0;if((e|0)>=((f[d>>2]|0)-g>>2|0)){b=1;h=5;break}}if((h|0)==5)return b|0;return 0}function Yj(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0;c=a+36|0;d=a+40|0;e=f[c>>2]|0;if((f[d>>2]|0)==(e|0)){g=1;return g|0}h=a+60|0;a=0;i=e;while(1){e=f[i+(a<<2)>>2]|0;a=a+1|0;if(!(Sa[f[(f[e>>2]|0)+20>>2]&31](e,h,b)|0)){g=0;j=5;break}i=f[c>>2]|0;if(a>>>0>=(f[d>>2]|0)-i>>2>>>0){g=1;j=5;break}}if((j|0)==5)return g|0;return 0}function Zj(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0;c=a+36|0;d=a+40|0;a=f[c>>2]|0;if((f[d>>2]|0)==(a|0)){e=1;return e|0}else{g=0;h=a}while(1){a=f[h+(g<<2)>>2]|0;g=g+1|0;if(!(Ra[f[(f[a>>2]|0)+24>>2]&127](a,b)|0)){e=0;i=4;break}h=f[c>>2]|0;if(g>>>0>=(f[d>>2]|0)-h>>2>>>0){e=1;i=4;break}}if((i|0)==4)return e|0;return 0}function _j(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0;f[a>>2]=0;c=a+4|0;f[c>>2]=0;f[a+8>>2]=0;d=b+4|0;e=(f[d>>2]|0)-(f[b>>2]|0)|0;g=e>>2;if(!g)return;if(g>>>0>1073741823)mq(a);h=dn(e)|0;f[c>>2]=h;f[a>>2]=h;f[a+8>>2]=h+(g<<2);g=f[b>>2]|0;b=(f[d>>2]|0)-g|0;if((b|0)<=0)return;Rg(h|0,g|0,b|0)|0;f[c>>2]=h+(b>>>2<<2);return}function $j(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0;c=a+8|0;d=f[a>>2]|0;if((f[c>>2]|0)-d>>2>>>0>=b>>>0)return;e=a+4|0;if(b>>>0>1073741823){g=ra(8)|0;Wo(g,14941);f[g>>2]=6944;va(g|0,1080,114)}g=(f[e>>2]|0)-d|0;h=dn(b<<2)|0;if((g|0)>0)Rg(h|0,d|0,g|0)|0;f[a>>2]=h;f[e>>2]=h+(g>>2<<2);f[c>>2]=h+(b<<2);if(!d)return;br(d);return}function ak(a){a=a|0;var b=0,c=0,d=0,e=0,g=0,h=0,i=0;b=a+36|0;c=a+40|0;d=f[b>>2]|0;if((f[c>>2]|0)==(d|0)){e=1;return e|0}g=a+60|0;a=0;h=d;while(1){d=f[h+(a<<2)>>2]|0;a=a+1|0;if(!(Ra[f[(f[d>>2]|0)+16>>2]&127](d,g)|0)){e=0;i=5;break}h=f[b>>2]|0;if(a>>>0>=(f[c>>2]|0)-h>>2>>>0){e=1;i=5;break}}if((i|0)==5)return e|0;return 0}function bk(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0;d=u;u=u+16|0;e=d;g=dn(16)|0;f[e>>2]=g;f[e+8>>2]=-2147483632;f[e+4>>2]=15;h=g;i=12916;j=h+15|0;do{b[h>>0]=b[i>>0]|0;h=h+1|0;i=i+1|0}while((h|0)<(j|0));b[g+15>>0]=0;Nj(a+4|0,e,c);if((b[e+11>>0]|0)>=0){u=d;return}br(f[e>>2]|0);u=d;return}function ck(a,b){a=a|0;b=b|0;var c=0,d=0;f[a>>2]=0;f[a+4>>2]=b;if(b|0?(c=mh(b,992,976,0)|0,c|0):0){d=dn(56)|0;Gm(d,c);c=f[a>>2]|0;f[a>>2]=d;if(!c)return;Va[f[(f[c>>2]|0)+4>>2]&127](c);return}c=dn(56)|0;Am(c,b);b=f[a>>2]|0;f[a>>2]=c;if(!b)return;Va[f[(f[b>>2]|0)+4>>2]&127](b);return}function dk(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0;d=f[a+176>>2]|0;e=f[a+172>>2]|0;a=e;if((d|0)==(e|0))return 0;g=(d-e|0)/136|0;e=0;while(1){if((f[a+(e*136|0)>>2]|0)==(c|0)){h=4;break}d=e+1|0;if(d>>>0<g>>>0)e=d;else{h=6;break}}if((h|0)==4)return ((b[a+(e*136|0)+100>>0]|0)==0?0:a+(e*136|0)+4|0)|0;else if((h|0)==6)return 0;return 0}function ek(a,b){a=a|0;b=b|0;var c=0,d=0;c=f[a+72>>2]|0;if(!c){d=0;return d|0}f[c+4>>2]=a+60;if(!(Qa[f[(f[c>>2]|0)+12>>2]&127](c)|0)){d=0;return d|0}if(!(Qa[f[(f[a>>2]|0)+40>>2]&127](a)|0)){d=0;return d|0}if(!(Ra[f[(f[a>>2]|0)+44>>2]&127](a,b)|0)){d=0;return d|0}d=Ra[f[(f[a>>2]|0)+48>>2]&127](a,b)|0;return d|0}function fk(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;f[a>>2]=0;d=a+4|0;f[d>>2]=0;f[a+8>>2]=0;if(!b)return;if(b>>>0>357913941)mq(a);e=dn(b*12|0)|0;f[d>>2]=e;f[a>>2]=e;f[a+8>>2]=e+(b*12|0);a=b;b=e;do{_j(b,c);b=(f[d>>2]|0)+12|0;f[d>>2]=b;a=a+-1|0}while((a|0)!=0);return}function gk(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0;c=f[b>>2]|0;if(!c){d=0;return d|0}e=a+44|0;g=f[e>>2]|0;if(g>>>0<(f[a+48>>2]|0)>>>0){f[b>>2]=0;f[g>>2]=c;f[e>>2]=(f[e>>2]|0)+4;d=1;return d|0}else{Bg(a+40|0,b);d=1;return d|0}return 0}function hk(a){a=a|0;var b=0,c=0,d=0;f[a>>2]=2880;f[a+40>>2]=1180;b=f[a+48>>2]|0;if(b|0){c=a+52|0;d=f[c>>2]|0;if((d|0)!=(b|0))f[c>>2]=d+(~((d+-4-b|0)>>>2)<<2);br(b)}f[a>>2]=1460;b=a+36|0;d=f[b>>2]|0;f[b>>2]=0;if(!d){zi(a);br(a);return}Va[f[(f[d>>2]|0)+4>>2]&127](d);zi(a);br(a);return}function ik(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,i=0;f[c>>2]=2;d=a+4|0;a=c+8|0;e=f[a>>2]|0;g=(f[c+12>>2]|0)-e|0;if(g>>>0<4294967292){Bk(a,g+4|0,0);i=f[a>>2]|0}else i=e;e=i+g|0;g=h[d>>0]|h[d+1>>0]<<8|h[d+2>>0]<<16|h[d+3>>0]<<24;b[e>>0]=g;b[e+1>>0]=g>>8;b[e+2>>0]=g>>16;b[e+3>>0]=g>>24;return}function jk(a){a=a|0;var b=0,c=0,d=0,e=0;f[a>>2]=3164;b=a+8|0;f[b>>2]=3188;c=f[a+56>>2]|0;if(c|0){d=a+60|0;e=f[d>>2]|0;if((e|0)!=(c|0))f[d>>2]=e+(~((e+-4-c|0)>>>2)<<2);br(c)}f[b>>2]=3208;b=f[a+44>>2]|0;if(b|0)br(b);b=f[a+32>>2]|0;if(!b){br(a);return}br(b);br(a);return}function kk(a,c,d){a=a|0;c=c|0;d=$(d);var e=0,g=Oa,h=0;e=zg(a,c)|0;if((e|0)==(a+4|0)){g=d;return $(g)}a=e+28|0;if((b[a+11>>0]|0)<0)h=f[a>>2]|0;else h=a;g=$(+Xq(h));return $(g)}function lk(a){a=a|0;var b=0,c=0,d=0,e=0,g=0,h=0;b=u;u=u+16|0;c=b;d=c;f[d>>2]=0;f[d+4>>2]=0;cf(a,2,c);c=f[a+12>>2]|0;d=a+16|0;e=f[d>>2]|0;if((e|0)==(c|0)){g=a+24|0;f[g>>2]=0;h=a+28|0;f[h>>2]=0;u=b;return}f[d>>2]=e+(~((e+-4-c|0)>>>2)<<2);g=a+24|0;f[g>>2]=0;h=a+28|0;f[h>>2]=0;u=b;return}function mk(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0;c=f[a+176>>2]|0;d=f[a+172>>2]|0;e=d;a:do if((c|0)!=(d|0)){g=(c-d|0)/136|0;h=0;while(1){if((f[e+(h*136|0)>>2]|0)==(b|0))break;i=h+1|0;if(i>>>0<g>>>0)h=i;else break a}j=e+(h*136|0)+104|0;return j|0}while(0);j=a+40|0;return j|0}function nk(a){a=a|0;var b=0,c=0,d=0,e=0;f[a>>2]=3232;b=a+8|0;f[b>>2]=3256;c=f[a+56>>2]|0;if(c|0){d=a+60|0;e=f[d>>2]|0;if((e|0)!=(c|0))f[d>>2]=e+(~((e+-4-c|0)>>>2)<<2);br(c)}f[b>>2]=3276;b=f[a+44>>2]|0;if(b|0)br(b);b=f[a+32>>2]|0;if(!b){br(a);return}br(b);br(a);return}function ok(a){a=a|0;var b=0,c=0,d=0;f[a>>2]=2880;f[a+40>>2]=1180;b=f[a+48>>2]|0;if(b|0){c=a+52|0;d=f[c>>2]|0;if((d|0)!=(b|0))f[c>>2]=d+(~((d+-4-b|0)>>>2)<<2);br(b)}f[a>>2]=1460;b=a+36|0;d=f[b>>2]|0;f[b>>2]=0;if(!d){zi(a);return}Va[f[(f[d>>2]|0)+4>>2]&127](d);zi(a);return}function pk(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0;Ec(a,b);if((b|0)<=-1)return;c=a+88|0;d=f[c>>2]|0;e=f[a+84>>2]|0;if((d-e>>2|0)<=(b|0))return;a=e+(b<<2)|0;b=a+4|0;e=d-b|0;g=e>>2;if(!g)h=d;else{Xl(a|0,b|0,e|0)|0;h=f[c>>2]|0}e=a+(g<<2)|0;if((h|0)==(e|0))return;f[c>>2]=h+(~((h+-4-e|0)>>>2)<<2);return}function qk(a){a=a|0;var b=0,c=0,d=0,e=0,g=0,h=0;b=f[a+32>>2]|0;c=f[a+36>>2]|0;if((b|0)==(c|0)){d=1;return d|0}e=a+8|0;g=a+44|0;a=b;while(1){b=f[(f[e>>2]|0)+(f[a>>2]<<2)>>2]|0;a=a+4|0;if(!(Ra[f[(f[b>>2]|0)+20>>2]&127](b,f[g>>2]|0)|0)){d=0;h=5;break}if((a|0)==(c|0)){d=1;h=5;break}}if((h|0)==5)return d|0;return 0}function rk(a){a=a|0;var b=0,c=0,d=0,e=0;f[a>>2]=3164;b=a+8|0;f[b>>2]=3188;c=f[a+56>>2]|0;if(c|0){d=a+60|0;e=f[d>>2]|0;if((e|0)!=(c|0))f[d>>2]=e+(~((e+-4-c|0)>>>2)<<2);br(c)}f[b>>2]=3208;b=f[a+44>>2]|0;if(b|0)br(b);b=f[a+32>>2]|0;if(!b)return;br(b);return}function sk(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0.0;d=u;u=u+128|0;e=d;g=e;h=g+124|0;do{f[g>>2]=0;g=g+4|0}while((g|0)<(h|0));g=e+4|0;f[g>>2]=a;h=e+8|0;f[h>>2]=-1;f[e+44>>2]=a;f[e+76>>2]=-1;Rm(e,0);i=+Lc(e,c,1);c=(f[g>>2]|0)-(f[h>>2]|0)+(f[e+108>>2]|0)|0;if(b|0)f[b>>2]=c|0?a+c|0:a;u=d;return +i}function tk(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var g=0,h=0;a=c+16|0;g=f[a>>2]|0;do if(g){if((g|0)!=(d|0)){h=c+36|0;f[h>>2]=(f[h>>2]|0)+1;f[c+24>>2]=2;b[c+54>>0]=1;break}h=c+24|0;if((f[h>>2]|0)==2)f[h>>2]=e}else{f[a>>2]=d;f[c+24>>2]=e;f[c+36>>2]=1}while(0);return}function uk(a){a=a|0;var c=0,d=0,e=0;c=a+74|0;d=b[c>>0]|0;b[c>>0]=d+255|d;d=a+20|0;c=a+28|0;if((f[d>>2]|0)>>>0>(f[c>>2]|0)>>>0)Sa[f[a+36>>2]&31](a,0,0)|0;f[a+16>>2]=0;f[c>>2]=0;f[d>>2]=0;d=f[a>>2]|0;if(!(d&4)){c=(f[a+44>>2]|0)+(f[a+48>>2]|0)|0;f[a+8>>2]=c;f[a+4>>2]=c;e=d<<27>>31}else{f[a>>2]=d|32;e=-1}return e|0}function vk(a,c){a=a|0;c=c|0;var d=0,e=0,g=0;d=zg(a,c)|0;if((d|0)==(a+4|0)){e=0;return e|0}a=d+28|0;if((b[a+11>>0]|0)<0)g=f[a>>2]|0;else g=a;e=((Kj(g)|0)+1|0)>>>0>1;return e|0}function wk(a){a=a|0;var b=0,c=0,d=0;f[a>>2]=5840;b=f[a+96>>2]|0;if(b|0){c=a+100|0;d=f[c>>2]|0;if((d|0)!=(b|0))f[c>>2]=d+(~(((d+-12-b|0)>>>0)/12|0)*12|0);br(b)}b=f[a+84>>2]|0;if(!b){wg(a);br(a);return}d=a+88|0;c=f[d>>2]|0;if((c|0)!=(b|0))f[d>>2]=c+(~((c+-4-b|0)>>>2)<<2);br(b);wg(a);br(a);return}function xk(a){a=a|0;var b=0,c=0,d=0,e=0;f[a>>2]=3232;b=a+8|0;f[b>>2]=3256;c=f[a+56>>2]|0;if(c|0){d=a+60|0;e=f[d>>2]|0;if((e|0)!=(c|0))f[d>>2]=e+(~((e+-4-c|0)>>>2)<<2);br(c)}f[b>>2]=3276;b=f[a+44>>2]|0;if(b|0)br(b);b=f[a+32>>2]|0;if(!b)return;br(b);return}function yk(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0;e=zg(a,c)|0;if((e|0)==(a+4|0)){g=d;return g|0}d=e+28|0;if((b[d+11>>0]|0)<0)h=f[d>>2]|0;else h=d;g=Kj(h)|0;return g|0}function zk(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0;e=b>>31|((b|0)<0?-1:0)<<1;f=((b|0)<0?-1:0)>>31|((b|0)<0?-1:0)<<1;g=d>>31|((d|0)<0?-1:0)<<1;h=((d|0)<0?-1:0)>>31|((d|0)<0?-1:0)<<1;i=Vn(e^a|0,f^b|0,e|0,f|0)|0;b=I;a=g^e;e=h^f;return Vn((Bd(i,b,Vn(g^c|0,h^d|0,g|0,h|0)|0,I,0)|0)^a|0,I^e|0,a|0,e|0)|0}function Ak(a,b,c,d,e,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;g=g|0;var h=0,i=0,j=0;f[a>>2]=b;h=b+16|0;i=f[h+4>>2]|0;j=a+8|0;f[j>>2]=f[h>>2];f[j+4>>2]=i;i=b+24|0;b=f[i+4>>2]|0;j=a+16|0;f[j>>2]=f[i>>2];f[j+4>>2]=b;b=a+40|0;f[b>>2]=c;f[b+4>>2]=d;d=a+48|0;f[d>>2]=e;f[d+4>>2]=g;return}function Bk(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0;c=a+4|0;d=f[c>>2]|0;e=f[a>>2]|0;g=d-e|0;h=e;e=d;if(g>>>0>=b>>>0){if(g>>>0>b>>>0?(d=h+b|0,(d|0)!=(e|0)):0)f[c>>2]=d}else ri(a,b-g|0);g=a+24|0;a=g;b=Tn(f[a>>2]|0,f[a+4>>2]|0,1,0)|0;a=g;f[a>>2]=b;f[a+4>>2]=I;return}function Ck(a,c){a=a|0;c=c|0;var d=0,e=0,g=0;d=zg(a,c)|0;if((d|0)==(a+4|0)){e=-1;return e|0}a=d+28|0;if((b[a+11>>0]|0)<0)g=f[a>>2]|0;else g=a;e=Kj(g)|0;return e|0}function Dk(a){a=a|0;var b=0,c=0,d=0;f[a>>2]=5840;b=f[a+96>>2]|0;if(b|0){c=a+100|0;d=f[c>>2]|0;if((d|0)!=(b|0))f[c>>2]=d+(~(((d+-12-b|0)>>>0)/12|0)*12|0);br(b)}b=f[a+84>>2]|0;if(!b){wg(a);return}d=a+88|0;c=f[d>>2]|0;if((c|0)!=(b|0))f[d>>2]=c+(~((c+-4-b|0)>>>2)<<2);br(b);wg(a);return}function Ek(a){a=a|0;var c=0,d=0,e=0;f[a>>2]=0;f[a+4>>2]=0;f[a+8>>2]=0;f[a+12>>2]=0;f[a+16>>2]=0;f[a+20>>2]=0;b[a+24>>0]=1;c=a+68|0;d=a+28|0;e=d+40|0;do{f[d>>2]=0;d=d+4|0}while((d|0)<(e|0));f[c>>2]=a;c=a+72|0;f[c>>2]=0;f[c+4>>2]=0;f[c+8>>2]=0;f[c+12>>2]=0;f[c+16>>2]=0;f[c+20>>2]=0;return}function Fk(a){a=a|0;var b=0,c=0,d=0;f[a>>2]=3188;b=f[a+48>>2]|0;if(b|0){c=a+52|0;d=f[c>>2]|0;if((d|0)!=(b|0))f[c>>2]=d+(~((d+-4-b|0)>>>2)<<2);br(b)}f[a>>2]=3208;b=f[a+36>>2]|0;if(b|0)br(b);b=f[a+24>>2]|0;if(!b){br(a);return}br(b);br(a);return}function Gk(a){a=a|0;var b=0,c=0,d=0;f[a>>2]=2004;b=f[a+76>>2]|0;if(b|0)br(b);f[a>>2]=1528;b=f[a+32>>2]|0;if(!b){br(a);return}c=a+36|0;d=f[c>>2]|0;if((d|0)!=(b|0))f[c>>2]=d+(~((d+-4-b|0)>>>2)<<2);br(b);br(a);return}function Hk(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0,g=0,h=0;f=u;u=u+256|0;g=f;if((c|0)>(d|0)&(e&73728|0)==0){e=c-d|0;hj(g|0,b<<24>>24|0,(e>>>0<256?e:256)|0)|0;if(e>>>0>255){b=c-d|0;d=e;do{ep(a,g,256);d=d+-256|0}while(d>>>0>255);h=b&255}else h=e;ep(a,g,h)}u=f;return}function Ik(a){a=a|0;var b=0,c=0,d=0;f[a>>2]=3256;b=f[a+48>>2]|0;if(b|0){c=a+52|0;d=f[c>>2]|0;if((d|0)!=(b|0))f[c>>2]=d+(~((d+-4-b|0)>>>2)<<2);br(b)}f[a>>2]=3276;b=f[a+36>>2]|0;if(b|0)br(b);b=f[a+24>>2]|0;if(!b){br(a);return}br(b);br(a);return}function Jk(a){a=a|0;var b=0,c=0,d=0;f[a>>2]=1696;b=f[a+76>>2]|0;if(b|0)br(b);f[a>>2]=1528;b=f[a+32>>2]|0;if(!b){br(a);return}c=a+36|0;d=f[c>>2]|0;if((d|0)!=(b|0))f[c>>2]=d+(~((d+-4-b|0)>>>2)<<2);br(b);br(a);return}function Kk(a,b,c,d,e,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;g=g|0;var h=0;if(qp(a,f[b+8>>2]|0,g)|0)fj(0,b,c,d,e);else{h=f[a+8>>2]|0;_a[f[(f[h>>2]|0)+20>>2]&3](h,b,c,d,e,g)}return}function Lk(a){a=a|0;var b=0,c=0,d=0;f[a>>2]=3188;b=f[a+48>>2]|0;if(b|0){c=a+52|0;d=f[c>>2]|0;if((d|0)!=(b|0))f[c>>2]=d+(~((d+-4-b|0)>>>2)<<2);br(b)}f[a>>2]=3208;b=f[a+36>>2]|0;if(b|0)br(b);b=f[a+24>>2]|0;if(!b)return;br(b);return}function Mk(a){a=a|0;var b=0,c=0,d=0;f[a>>2]=2060;tj(a+108|0);f[a>>2]=1528;b=f[a+32>>2]|0;if(!b){br(a);return}c=a+36|0;d=f[c>>2]|0;if((d|0)!=(b|0))f[c>>2]=d+(~((d+-4-b|0)>>>2)<<2);br(b);br(a);return}function Nk(a){a=a|0;var b=0,c=0,d=0;f[a>>2]=3256;b=f[a+48>>2]|0;if(b|0){c=a+52|0;d=f[c>>2]|0;if((d|0)!=(b|0))f[c>>2]=d+(~((d+-4-b|0)>>>2)<<2);br(b)}f[a>>2]=3276;b=f[a+36>>2]|0;if(b|0)br(b);b=f[a+24>>2]|0;if(!b)return;br(b);return}function Ok(a){a=a|0;var b=0,c=0,d=0;f[a>>2]=1752;tj(a+108|0);f[a>>2]=1528;b=f[a+32>>2]|0;if(!b){br(a);return}c=a+36|0;d=f[c>>2]|0;if((d|0)!=(b|0))f[c>>2]=d+(~((d+-4-b|0)>>>2)<<2);br(b);br(a);return}function Pk(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;a:do if(!d)e=0;else{f=a;g=d;h=c;while(1){i=b[f>>0]|0;j=b[h>>0]|0;if(i<<24>>24!=j<<24>>24)break;g=g+-1|0;if(!g){e=0;break a}else{f=f+1|0;h=h+1|0}}e=(i&255)-(j&255)|0}while(0);return e|0}function Qk(a){a=a|0;if(!(f[a+44>>2]|0))return 0;if(!(f[a+48>>2]|0))return 0;if(!(f[a+24>>2]|0))return 0;if(!(f[a+28>>2]|0))return 0;if(!(f[a+32>>2]|0))return 0;else return (f[a+36>>2]|0)!=0|0;return 0}function Rk(a){a=a|0;var b=0,c=0;f[a>>2]=2004;b=f[a+76>>2]|0;if(b|0)br(b);f[a>>2]=1528;b=f[a+32>>2]|0;if(!b)return;c=a+36|0;a=f[c>>2]|0;if((a|0)!=(b|0))f[c>>2]=a+(~((a+-4-b|0)>>>2)<<2);br(b);return}function Sk(a){a=a|0;var c=0,d=0;f[a>>2]=0;f[a+4>>2]=0;f[a+8>>2]=0;c=0;while(1){if((c|0)==3)break;f[a+(c<<2)>>2]=0;c=c+1|0}if((b[a+11>>0]|0)<0)d=(f[a+8>>2]&2147483647)+-1|0;else d=10;wj(a,d,0);return}function Tk(a){a=a|0;var b=0,c=0,d=0,e=0.0,g=0.0;b=f[a+8>>2]|0;if((b|0)<2){c=0;d=0;I=c;return d|0}e=+(b|0);g=+Fg(e)*e;e=+W(+(g-+p[a>>3]));c=+K(e)>=1.0?(e>0.0?~~+Y(+J(e/4294967296.0),4294967295.0)>>>0:~~+W((e-+(~~e>>>0))/4294967296.0)>>>0):0;d=~~e>>>0;I=c;return d|0}function Uk(a){a=a|0;var b=0,c=0;f[a>>2]=1696;b=f[a+76>>2]|0;if(b|0)br(b);f[a>>2]=1528;b=f[a+32>>2]|0;if(!b)return;c=a+36|0;a=f[c>>2]|0;if((a|0)!=(b|0))f[c>>2]=a+(~((a+-4-b|0)>>>2)<<2);br(b);return}function Vk(a,b){a=a|0;b=b|0;var c=0,d=0,e=0;c=f[a+16>>2]|0;if(((f[a+20>>2]|0)-c>>2|0)<=(b|0)){d=0;return d|0}e=f[c+(b<<2)>>2]|0;if((e|0)<0){d=0;return d|0}b=f[(f[a+36>>2]|0)+(e<<2)>>2]|0;e=f[b+32>>2]|0;if(e|0){d=e;return d|0}d=f[b+8>>2]|0;return d|0}function Wk(a){a=a|0;var b=0,c=0,d=0;f[a>>2]=1216;b=f[a+16>>2]|0;if(b|0){c=a+20|0;d=f[c>>2]|0;if((d|0)!=(b|0))f[c>>2]=d+(~((d+-4-b|0)>>>2)<<2);br(b)}b=f[a+4>>2]|0;if(!b)return;d=a+8|0;a=f[d>>2]|0;if((a|0)!=(b|0))f[d>>2]=a+(~((a+-4-b|0)>>>2)<<2);br(b);return}function Xk(a){a=a|0;var b=0,c=0;f[a>>2]=2060;tj(a+108|0);f[a>>2]=1528;b=f[a+32>>2]|0;if(!b)return;c=a+36|0;a=f[c>>2]|0;if((a|0)!=(b|0))f[c>>2]=a+(~((a+-4-b|0)>>>2)<<2);br(b);return}function Yk(a){a=a|0;if(!(f[a+64>>2]|0))return 0;if(!(f[a+68>>2]|0))return 0;if(!(f[a+44>>2]|0))return 0;if(!(f[a+48>>2]|0))return 0;if(!(f[a+52>>2]|0))return 0;else return (f[a+56>>2]|0)!=0|0;return 0}function Zk(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0;if(qp(a,f[b+8>>2]|0,0)|0)tk(0,b,c,d);else{e=f[a+8>>2]|0;Ya[f[(f[e>>2]|0)+28>>2]&7](e,b,c,d)}return}function _k(a){a=a|0;var b=0,c=0;f[a>>2]=1752;tj(a+108|0);f[a>>2]=1528;b=f[a+32>>2]|0;if(!b)return;c=a+36|0;a=f[c>>2]|0;if((a|0)!=(b|0))f[c>>2]=a+(~((a+-4-b|0)>>>2)<<2);br(b);return}function $k(a,b){a=a|0;b=b|0;var c=0,d=0;if((b|0)<0){c=0;return c|0}d=f[a+4>>2]|0;if(((f[d+12>>2]|0)-(f[d+8>>2]|0)>>2|0)<=(b|0)){c=0;return c|0}d=f[(f[a+8>>2]|0)+(f[(f[a+20>>2]|0)+(b<<2)>>2]<<2)>>2]|0;c=Ra[f[(f[d>>2]|0)+36>>2]&127](d,b)|0;return c|0}function al(a,b){a=a|0;b=b|0;var c=0,d=0;if((b|0)<0){c=0;return c|0}d=f[a+4>>2]|0;if(((f[d+12>>2]|0)-(f[d+8>>2]|0)>>2|0)<=(b|0)){c=0;return c|0}d=f[(f[a+8>>2]|0)+(f[(f[a+20>>2]|0)+(b<<2)>>2]<<2)>>2]|0;c=Ra[f[(f[d>>2]|0)+32>>2]&127](d,b)|0;return c|0}function bl(a,c){a=a|0;c=c|0;var d=0,e=0,f=0,g=0;d=b[a>>0]|0;e=b[c>>0]|0;if(d<<24>>24==0?1:d<<24>>24!=e<<24>>24){f=e;g=d}else{d=c;c=a;do{c=c+1|0;d=d+1|0;a=b[c>>0]|0;e=b[d>>0]|0}while(!(a<<24>>24==0?1:a<<24>>24!=e<<24>>24));f=e;g=a}return (g&255)-(f&255)|0}function cl(a,b){a=a|0;b=$(b);var c=0,d=0;c=u;u=u+16|0;d=c;Sk(d);qi(a,d,b);Go(d);u=c;return}function dl(a){a=a|0;var b=0,c=0,d=0,e=0,g=0;b=f[a>>2]|0;c=a+4|0;d=f[c>>2]|0;if((d|0)==(b|0))e=b;else{g=d+(~((d+-4-b|0)>>>2)<<2)|0;f[c>>2]=g;e=g}f[a+12>>2]=0;f[a+16>>2]=0;if(!b)return;if((e|0)!=(b|0))f[c>>2]=e+(~((e+-4-b|0)>>>2)<<2);br(b);return}function el(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0;d=f[a+16>>2]|0;if(((f[a+20>>2]|0)-d>>2|0)<=(b|0)){e=-1;return e|0}g=f[d+(b<<2)>>2]|0;if((g|0)<0){e=-1;return e|0}e=f[(f[(f[(f[a+36>>2]|0)+(g<<2)>>2]|0)+16>>2]|0)+(c<<2)>>2]|0;return e|0}function fl(a,b){a=a|0;b=b|0;var c=0,d=0;c=u;u=u+16|0;d=c;Sk(d);vi(a,d,b);Go(d);u=c;return}function gl(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0;d=u;u=u+32|0;e=d;g=d+20|0;f[e>>2]=f[a+60>>2];f[e+4>>2]=0;f[e+8>>2]=b;f[e+12>>2]=g;f[e+16>>2]=c;if((ro(za(140,e|0)|0)|0)<0){f[g>>2]=-1;h=-1}else h=f[g>>2]|0;u=d;return h|0}function hl(a,b){a=a|0;b=b|0;var c=0,d=0;if((b|0)==-1|(b|0)>4){c=0;return c|0}d=f[a+20+(b*12|0)>>2]|0;if(((f[a+20+(b*12|0)+4>>2]|0)-d|0)<=0){c=0;return c|0}b=f[d>>2]|0;if((b|0)==-1){c=0;return c|0}c=f[(f[a+8>>2]|0)+(b<<2)>>2]|0;return c|0}function il(a){a=a|0;if(!(f[a+40>>2]|0))return 0;if(!(f[a+24>>2]|0))return 0;if(!(f[a+28>>2]|0))return 0;if(!(f[a+32>>2]|0))return 0;else return (f[a+36>>2]|0)!=0|0;return 0}function jl(a,b){a=a|0;b=b|0;var c=0,d=0,e=0;c=f[a+16>>2]|0;if(((f[a+20>>2]|0)-c>>2|0)<=(b|0)){d=0;return d|0}e=f[c+(b<<2)>>2]|0;if((e|0)<0){d=0;return d|0}b=f[(f[a+36>>2]|0)+(e<<2)>>2]|0;d=(f[b+20>>2]|0)-(f[b+16>>2]|0)>>2;return d|0}function kl(a){a=a|0;var b=0;if(!(f[a+24>>2]|0)){b=0;return b|0}if(!(f[a+28>>2]|0)){b=0;return b|0}if(!(f[a+32>>2]|0)){b=0;return b|0}b=(f[a+36>>2]|0)!=0;return b|0}function ll(a){a=a|0;if(!(f[a+60>>2]|0))return 0;if(!(f[a+44>>2]|0))return 0;if(!(f[a+48>>2]|0))return 0;if(!(f[a+52>>2]|0))return 0;else return (f[a+56>>2]|0)!=0|0;return 0}function ml(a,b,c){a=a|0;b=b|0;c=c|0;var d=0;Sg(a,c);f[a>>2]=1392;c=a+72|0;d=a+36|0;a=d+36|0;do{f[d>>2]=0;d=d+4|0}while((d|0)<(a|0));d=f[b>>2]|0;f[b>>2]=0;f[c>>2]=d;return}function nl(a,c){a=a|0;c=c|0;var d=0,e=0;d=a;e=c;c=d+64|0;do{f[d>>2]=f[e>>2];d=d+4|0;e=e+4|0}while((d|0)<(c|0));e=a+64|0;f[a+88>>2]=0;f[e>>2]=0;f[e+4>>2]=0;f[e+8>>2]=0;f[e+12>>2]=0;f[e+16>>2]=0;b[e+20>>0]=0;return}function ol(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var f=0,g=0;if((a|0)==0&(c|0)==0)f=d;else{g=d;d=c;c=a;while(1){a=g+-1|0;b[a>>0]=h[15542+(c&15)>>0]|0|e;c=Wn(c|0,d|0,4)|0;d=I;if((c|0)==0&(d|0)==0){f=a;break}else g=a}}return f|0}function pl(a){a=a|0;var c=0,d=0,e=0;c=a+74|0;d=b[c>>0]|0;b[c>>0]=d+255|d;d=f[a>>2]|0;if(!(d&8)){f[a+8>>2]=0;f[a+4>>2]=0;c=f[a+44>>2]|0;f[a+28>>2]=c;f[a+20>>2]=c;f[a+16>>2]=c+(f[a+48>>2]|0);e=0}else{f[a>>2]=d|32;e=-1}return e|0}function ql(a,b){a=a|0;b=b|0;var c=0,d=0;c=f[b+88>>2]|0;if(!c){d=0;return d|0}if((f[c>>2]|0)!=2){d=0;return d|0}b=f[c+8>>2]|0;f[a+4>>2]=h[b>>0]|h[b+1>>0]<<8|h[b+2>>0]<<16|h[b+3>>0]<<24;d=1;return d|0}function rl(a){a=a|0;var b=0;if(!(f[a+44>>2]|0)){b=0;return b|0}if(!(f[a+48>>2]|0)){b=0;return b|0}if(!(f[a+52>>2]|0)){b=0;return b|0}b=(f[a+56>>2]|0)!=0;return b|0}function sl(a){a=a|0;kj(a);br(a);return}function tl(a,c){a=a|0;c=c|0;var d=0;if(f[c+56>>2]|0){d=0;return d|0}if((b[c+24>>0]|0)!=3){d=0;return d|0}f[a+40>>2]=c;d=1;return d|0}function ul(a,c){a=a|0;c=c|0;var d=0;if(f[c+56>>2]|0){d=0;return d|0}if((b[c+24>>0]|0)!=3){d=0;return d|0}f[a+44>>2]=c;d=1;return d|0}function vl(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0;c=a+4|0;d=f[c>>2]|0;e=f[a>>2]|0;g=d-e|0;if(g>>>0<b>>>0){ri(a,b-g|0);return}if(g>>>0<=b>>>0)return;g=e+b|0;if((g|0)==(d|0))return;f[c>>2]=g;return}function wl(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=$(e);f[a+4>>2]=b;Jf(a+8|0,c,c+(d<<2)|0);n[a+20>>2]=e;return}function xl(a,b){a=a|0;b=b|0;var c=0;if(!(Qa[f[(f[a>>2]|0)+40>>2]&127](a)|0)){c=0;return c|0}if(!(Ra[f[(f[a>>2]|0)+44>>2]&127](a,b)|0)){c=0;return c|0}c=Ra[f[(f[a>>2]|0)+48>>2]&127](a,b)|0;return c|0}function yl(a,b){a=a|0;b=b|0;var c=0,d=0,e=0;c=u;u=u+16|0;d=c+4|0;e=c;f[e>>2]=0;f[d>>2]=f[e>>2];e=tc(a,b,d)|0;u=c;return e|0}function zl(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,g=0;d=f[c>>2]|0;c=a;e=b-a>>2;while(1){if(!e)break;a=(e|0)/2|0;b=c+(a<<2)|0;g=(f[b>>2]|0)>>>0<d>>>0;c=g?b+4|0:c;e=g?e+-1-a|0:a}return c|0}function Al(a){a=a|0;var c=0;f[a>>2]=0;c=a+8|0;f[c>>2]=0;f[c+4>>2]=0;f[c+8>>2]=0;f[c+12>>2]=0;b[a+24>>0]=1;f[a+28>>2]=9;c=a+40|0;f[c>>2]=0;f[c+4>>2]=0;f[c+8>>2]=0;f[c+12>>2]=0;f[a+56>>2]=-1;f[a+60>>2]=0;return}function Bl(a){a=a|0;mj(a);br(a);return}function Cl(a){a=a|0;var c=0,d=0,e=0,g=0,h=0;if(!(Pq(b[f[a>>2]>>0]|0)|0))c=0;else{d=0;while(1){e=f[a>>2]|0;g=(d*10|0)+-48+(b[e>>0]|0)|0;h=e+1|0;f[a>>2]=h;if(!(Pq(b[h>>0]|0)|0)){c=g;break}else d=g}}return c|0}function Dl(a,c){a=a|0;c=c|0;var d=0;if(f[c+56>>2]|0){d=0;return d|0}if((b[c+24>>0]|0)!=3){d=0;return d|0}f[a+60>>2]=c;d=1;return d|0}function El(a,c){a=a|0;c=c|0;var d=0;if(f[c+56>>2]|0){d=0;return d|0}if((b[c+24>>0]|0)!=3){d=0;return d|0}f[a+64>>2]=c;d=1;return d|0}function Fl(a){a=a|0;var b=0,c=0;b=f[r>>2]|0;c=b+a|0;if((a|0)>0&(c|0)<(b|0)|(c|0)<0){ea()|0;ya(12);return -1}f[r>>2]=c;if((c|0)>(da()|0)?(ca()|0)==0:0){f[r>>2]=b;ya(12);return -1}return b|0}function Gl(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,f=0;if((a|0)==0&(c|0)==0)e=d;else{f=d;d=c;c=a;while(1){a=f+-1|0;b[a>>0]=c&7|48;c=Wn(c|0,d|0,3)|0;d=I;if((c|0)==0&(d|0)==0){e=a;break}else f=a}}return e|0}function Hl(a){a=a|0;var b=0,c=0,d=0;f[a>>2]=1528;b=f[a+32>>2]|0;if(!b){br(a);return}c=a+36|0;d=f[c>>2]|0;if((d|0)!=(b|0))f[c>>2]=d+(~((d+-4-b|0)>>>2)<<2);br(b);br(a);return}function Il(a,b,c,d,e,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;g=g|0;if(qp(a,f[b+8>>2]|0,g)|0)fj(0,b,c,d,e);return}function Jl(a){a=a|0;var b=0,c=0;b=f[a+64>>2]|0;if(!b)return;c=Qa[f[(f[b>>2]|0)+32>>2]&127](b)|0;if(!c)return;f[a+60>>2]=(((f[c+4>>2]|0)-(f[c>>2]|0)>>2>>>0)/3|0)-(f[c+40>>2]|0);return}function Kl(a){a=a|0;Ii(a);br(a);return}function Ll(a){a=a|0;var b=0;switch(a|0){case 11:case 2:case 1:{b=1;break}case 4:case 3:{b=2;break}case 6:case 5:{b=4;break}case 8:case 7:{b=8;break}case 9:{b=4;break}case 10:{b=8;break}default:b=-1}return b|0}function Ml(){var a=0,b=0;a=dn(40)|0;f[a>>2]=0;f[a+4>>2]=0;f[a+8>>2]=0;f[a+12>>2]=0;n[a+16>>2]=$(1.0);b=a+20|0;f[b>>2]=0;f[b+4>>2]=0;f[b+8>>2]=0;f[b+12>>2]=0;n[a+36>>2]=$(1.0);return a|0}function Nl(a,b){a=+a;b=+b;var c=0,d=0,e=0;p[s>>3]=a;c=f[s>>2]|0;d=f[s+4>>2]|0;p[s>>3]=b;e=f[s+4>>2]&-2147483648|d&2147483647;f[s>>2]=c;f[s+4>>2]=e;return +(+p[s>>3])}function Ol(a,b,c){a=a|0;b=b|0;c=+c;var d=0,e=0;d=u;u=u+16|0;e=d;p[e>>3]=c;_b(a,b,e);u=d;return}function Pl(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;d=u;u=u+16|0;e=d;f[e>>2]=c;cc(a,b,e);u=d;return}function Ql(a,c){a=a|0;c=c|0;var d=0,e=0;if((a|0)!=(c|0)){d=b[c+11>>0]|0;e=d<<24>>24<0;Zi(a,e?f[c>>2]|0:c,e?f[c+4>>2]|0:d&255)|0}return a|0}function Rl(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0;c=a&65535;d=b&65535;e=X(d,c)|0;f=a>>>16;a=(e>>>16)+(X(d,f)|0)|0;d=b>>>16;b=X(d,c)|0;return (I=(a>>>16)+(X(d,f)|0)+(((a&65535)+b|0)>>>16)|0,a+b<<16|e&65535|0)|0}function Sl(a,b){a=a|0;b=b|0;var c=0,d=0,e=0;c=vj(b)|0;d=dn(c+13|0)|0;f[d>>2]=c;f[d+4>>2]=c;f[d+8>>2]=0;e=Sp(d)|0;Rg(e|0,b|0,c+1|0)|0;f[a>>2]=e;return}function Tl(a,b){a=a|0;b=b|0;var c=0,d=0;if((b|0)==-1|(b|0)>4){c=-1;return c|0}d=f[a+20+(b*12|0)>>2]|0;if(((f[a+20+(b*12|0)+4>>2]|0)-d|0)<=0){c=-1;return c|0}c=f[d>>2]|0;return c|0}function Ul(a){a=a|0;Li(a);br(a);return}function Vl(a){a=a|0;var b=0,c=0;f[a>>2]=1528;b=f[a+32>>2]|0;if(!b)return;c=a+36|0;a=f[c>>2]|0;if((a|0)!=(b|0))f[c>>2]=a+(~((a+-4-b|0)>>>2)<<2);br(b);return}function Wl(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;if(qp(a,f[b+8>>2]|0,0)|0)tk(0,b,c,d);return}function Xl(a,c,d){a=a|0;c=c|0;d=d|0;var e=0;if((c|0)<(a|0)&(a|0)<(c+d|0)){e=a;c=c+d|0;a=a+d|0;while((d|0)>0){a=a-1|0;c=c-1|0;d=d-1|0;b[a>>0]=b[c>>0]|0}a=e}else Rg(a,c,d)|0;return a|0}function Yl(a){a=a|0;var b=0,c=0,d=0;f[a>>2]=1180;b=f[a+8>>2]|0;if(!b){br(a);return}c=a+12|0;d=f[c>>2]|0;if((d|0)!=(b|0))f[c>>2]=d+(~((d+-4-b|0)>>>2)<<2);br(b);br(a);return}function Zl(a){a=a|0;var b=0;f[a>>2]=2740;b=f[a+56>>2]|0;if(!b){br(a);return}br(b);br(a);return}function _l(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0;d=u;u=u+16|0;e=d;f[e>>2]=f[c>>2];g=Sa[f[(f[a>>2]|0)+16>>2]&31](a,b,e)|0;if(g)f[c>>2]=f[e>>2];u=d;return g&1|0}function $l(a,b){a=a|0;b=b|0;var c=0;if(b>>>0>=2){c=0;return c|0}f[a+28>>2]=b;c=1;return c|0}function am(a){a=a|0;var b=0,c=0;f[a>>2]=3e3;b=a+64|0;c=f[b>>2]|0;f[b>>2]=0;if(!c){aj(a);return}Va[f[(f[c>>2]|0)+4>>2]&127](c);aj(a);return}function bm(){var a=0,b=0;a=mn()|0;if((a|0?(b=f[a>>2]|0,b|0):0)?(a=b+48|0,(f[a>>2]&-256|0)==1126902528?(f[a+4>>2]|0)==1129074247:0):0)Qo(f[b+12>>2]|0);Qo(bq()|0)}function cm(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;return Bf(a,b,c,d,e,f,6)|0}function dm(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;return Af(a,b,c,d,e,f,4)|0}function em(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;return Gf(a,b,c,d,e,f,2)|0}function fm(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;return Af(a,b,c,d,e,f,3)|0}function gm(a){a=a|0;var b=0;f[a>>2]=2488;b=f[a+56>>2]|0;if(!b){br(a);return}br(b);br(a);return}function hm(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;return Gf(a,b,c,d,e,f,1)|0}function im(a){a=a|0;var c=0;c=b[w+(a&255)>>0]|0;if((c|0)<8)return c|0;c=b[w+(a>>8&255)>>0]|0;if((c|0)<8)return c+8|0;c=b[w+(a>>16&255)>>0]|0;if((c|0)<8)return c+16|0;return (b[w+(a>>>24)>>0]|0)+24|0}function jm(a,b){a=a|0;b=b|0;var c=0.0,d=0.0,e=0.0,f=0.0;if(!a){c=0.0;return +c}if((b|0)==0|(a|0)==(b|0)){c=0.0;return +c}d=+(b>>>0)/+(a>>>0);e=1.0-d;f=d*+Fg(d);c=-(f+e*+Fg(e));return +c}function km(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;if((b|0)>0)d=0;else return;do{e=f[a+(d<<2)>>2]|0;f[c+(d<<2)>>2]=e<<1^e>>31;d=d+1|0}while((d|0)!=(b|0));return}function lm(a){a=a|0;var b=0,c=0;if(Eq(a)|0?(b=Zp(f[a>>2]|0)|0,a=b+8|0,c=f[a>>2]|0,f[a>>2]=c+-1,(c+-1|0)<0):0)br(b);return}function mm(a){a=a|0;var b=0;Ao(a);f[a>>2]=2880;f[a+40>>2]=1180;f[a+44>>2]=-1;b=a+48|0;f[b>>2]=0;f[b+4>>2]=0;f[b+8>>2]=0;f[b+12>>2]=0;return}function nm(a,c){a=a|0;c=c|0;var d=0;b[c+84>>0]=1;a=f[c+68>>2]|0;d=c+72|0;c=f[d>>2]|0;if((c|0)==(a|0))return 1;f[d>>2]=c+(~((c+-4-a|0)>>>2)<<2);return 1}function om(a){a=a|0;var b=0,c=0;b=f[a+16>>2]|0;c=(((f[a+12>>2]|0)+1-b|0)/64|0)+b<<3;a=b<<3;b=Tn(c|0,((c|0)<0)<<31>>31|0,a|0,((a|0)<0)<<31>>31|0)|0;return b|0}function pm(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;return Bf(a,b,c,d,e,f,5)|0}function qm(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;return Bf(a,b,c,d,e,f,9)|0}function rm(a){a=a|0;var b=0;f[a>>2]=3208;b=f[a+36>>2]|0;if(b|0)br(b);b=f[a+24>>2]|0;if(!b){br(a);return}br(b);br(a);return}function sm(a){a=a|0;var b=0;f[a>>2]=2740;b=f[a+56>>2]|0;if(!b)return;br(b);return}function tm(a){a=a|0;var b=0,c=0;f[a>>2]=1460;b=a+36|0;c=f[b>>2]|0;f[b>>2]=0;if(c|0)Va[f[(f[c>>2]|0)+4>>2]&127](c);zi(a);br(a);return}function um(a){a=a|0;var b=0,c=0;f[a>>2]=1180;b=f[a+8>>2]|0;if(!b)return;c=a+12|0;a=f[c>>2]|0;if((a|0)!=(b|0))f[c>>2]=a+(~((a+-4-b|0)>>>2)<<2);br(b);return}function vm(a){a=a|0;var b=0;f[a>>2]=3276;b=f[a+36>>2]|0;if(b|0)br(b);b=f[a+24>>2]|0;if(!b){br(a);return}br(b);br(a);return}function wm(a){a=a|0;var c=0;f[a>>2]=1336;f[a+4>>2]=0;f[a+8>>2]=0;f[a+12>>2]=-1;c=a+16|0;f[a+32>>2]=0;f[c>>2]=0;f[c+4>>2]=0;f[c+8>>2]=0;b[c+12>>0]=0;return}function xm(a){a=a|0;f[a>>2]=3296;Gi(a+8|0);br(a);return}function ym(a){a=a|0;var b=0;f[a>>2]=2488;b=f[a+56>>2]|0;if(!b)return;br(b);return}function zm(a){a=a|0;var b=0,c=0;f[a>>2]=1460;b=a+36|0;c=f[b>>2]|0;f[b>>2]=0;if(c|0)Va[f[(f[c>>2]|0)+4>>2]&127](c);zi(a);return}function Am(a,b){a=a|0;b=b|0;f[a>>2]=2968;Vh(a+4|0);f[a+40>>2]=0;f[a+44>>2]=0;f[a>>2]=2984;f[a+48>>2]=b;f[a+52>>2]=0;return}function Bm(a){a=a|0;var b=0,c=0;f[a>>2]=3e3;b=a+64|0;c=f[b>>2]|0;f[b>>2]=0;if(c|0)Va[f[(f[c>>2]|0)+4>>2]&127](c);aj(a);br(a);return}function Cm(a){a=a|0;var b=0,c=0,d=0;b=f[a>>2]|0;c=a+4|0;d=f[c>>2]|0;if((d|0)!=(b|0))f[c>>2]=d+(~((d+-4-b|0)>>>2)<<2);f[a+12>>2]=0;f[a+16>>2]=0;return}function Dm(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0;d=a+20|0;e=f[d>>2]|0;g=(f[a+16>>2]|0)-e|0;a=g>>>0>c>>>0?c:g;Rg(e|0,b|0,a|0)|0;f[d>>2]=(f[d>>2]|0)+a;return c|0}function Em(a){a=a|0;var b=0;f[a>>2]=3208;b=f[a+36>>2]|0;if(b|0)br(b);b=f[a+24>>2]|0;if(!b)return;br(b);return}function Fm(a){a=a|0;f[a>>2]=3296;Gi(a+8|0);return}function Gm(a,b){a=a|0;b=b|0;f[a>>2]=2968;Vh(a+4|0);f[a+40>>2]=0;f[a+44>>2]=0;f[a>>2]=2984;f[a+48>>2]=b;f[a+52>>2]=b;return}function Hm(a){a=a|0;var b=0,c=0;b=f[a>>2]|0;if(!b)return;c=a+4|0;a=f[c>>2]|0;if((a|0)!=(b|0))f[c>>2]=a+(~((a+-8-b|0)>>>3)<<3);br(b);return}function Im(a){a=a|0;var b=0,c=0;b=f[a>>2]|0;if(!b)return;c=a+4|0;a=f[c>>2]|0;if((a|0)!=(b|0))f[c>>2]=a+(~((a+-4-b|0)>>>2)<<2);br(b);return}function Jm(a,b){a=a|0;b=b|0;var c=0;c=f[b>>2]|0;return (1<<(c&31)&f[(f[a+28>>2]|0)+(c>>>5<<2)>>2]|0)!=0|0}function Km(a,b,c){a=a|0;b=b|0;c=c|0;return Sa[f[(f[a>>2]|0)+44>>2]&31](a,b,c)|0}function Lm(a){a=a|0;var c=0;Al(a);c=a+64|0;f[a+88>>2]=0;f[c>>2]=0;f[c+4>>2]=0;f[c+8>>2]=0;f[c+12>>2]=0;f[c+16>>2]=0;b[c+20>>0]=0;return}function Mm(a){a=a|0;f[a>>2]=2796;tj(a+88|0);br(a);return}function Nm(a){a=a|0;var b=0;f[a>>2]=3276;b=f[a+36>>2]|0;if(b|0)br(b);b=f[a+24>>2]|0;if(!b)return;br(b);return}function Om(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;if((f[b+4>>2]|0)==(c|0)?(c=b+28|0,(f[c>>2]|0)!=1):0)f[c>>2]=d;return}function Pm(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=$(f);pg(a,b,c,d,e,f);return}function Qm(a){a=a|0;var b=0,c=0,d=0;b=u;u=u+16|0;c=b;if((uk(a)|0)==0?(Sa[f[a+32>>2]&31](a,c,1)|0)==1:0)d=h[c>>0]|0;else d=-1;u=b;return d|0}function Rm(a,b){a=a|0;b=b|0;var c=0,d=0,e=0;f[a+104>>2]=b;c=f[a+8>>2]|0;d=f[a+4>>2]|0;e=c-d|0;f[a+108>>2]=e;f[a+100>>2]=(b|0)!=0&(e|0)>(b|0)?d+b|0:c;return}function Sm(a){a=a|0;var b=0;f[a>>2]=0;f[a+4>>2]=0;f[a+8>>2]=0;b=a+16|0;f[b>>2]=0;f[b+4>>2]=0;f[b+8>>2]=0;f[b+12>>2]=0;f[b+16>>2]=0;return}function Tm(a,b,c,d,e,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;g=$(g);pg(f[a>>2]|0,b,c,d,e,g);return}function Um(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=$(f);Pm(a,b,c,d,e,f);return}function Vm(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;return cm(a,b,c,d,e,f)|0}function Wm(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;return dm(a,b,c,d,e,f)|0}function Xm(a){a=a|0;var b=0,c=0;if(!a)return;b=f[a>>2]|0;if(b|0){c=a+4|0;if((f[c>>2]|0)!=(b|0))f[c>>2]=b;br(b)}br(a);return}function Ym(a){a=a|0;f[a>>2]=2544;tj(a+88|0);br(a);return}function Zm(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;return em(a,b,c,d,e,f)|0}function _m(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;return fm(a,b,c,d,e,f)|0}function $m(a){a=a|0;f[a>>2]=2796;tj(a+88|0);return}function an(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,g=0;e=u;u=u+16|0;g=e|0;Bd(a,b,c,d,g)|0;u=e;return (I=f[g+4>>2]|0,f[g>>2]|0)|0}function bn(a){a=a|0;var b=0;$n(a);f[a>>2]=5840;b=a+84|0;f[b>>2]=0;f[b+4>>2]=0;f[b+8>>2]=0;f[b+12>>2]=0;f[b+16>>2]=0;f[b+20>>2]=0;return}function cn(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;return hm(a,b,c,d,e,f)|0}function dn(a){a=a|0;var b=0,c=0;b=(a|0)==0?1:a;while(1){a=$a(b)|0;if(a|0){c=a;break}a=$p()|0;if(!a){c=0;break}Ua[a&3]()}return c|0}function en(a,b,c){a=a|0;b=b|0;c=c|0;ac(a,b,c);return}function fn(a,b,c){a=a|0;b=b|0;c=c|0;f[a+4>>2]=b;f[a+8>>2]=f[(f[(f[b+4>>2]|0)+8>>2]|0)+(c<<2)>>2];f[a+12>>2]=c;return 1}function gn(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;return pm(a,b,c,d,e,f)|0}function hn(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;return qm(a,b,c,d,e,f)|0}function jn(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=$(f);Tm(a,b,c,d,e,f);return}function kn(a){a=a|0;f[a>>2]=2544;tj(a+88|0);return}function ln(a){a=a|0;var b=0,c=0,d=0;b=u;u=u+16|0;c=b;d=dr(f[a+60>>2]|0)|0;f[c>>2]=d;d=ro(Ba(6,c|0)|0)|0;u=b;return d|0}function mn(){var a=0,b=0;a=u;u=u+16|0;if(!(Ka(18612,3)|0)){b=Ia(f[4654]|0)|0;u=a;return b|0}else Dn(17746,a);return 0}function nn(a){a=a|0;var b=0;if(!a)return;b=f[a>>2]|0;f[a>>2]=0;if(b|0)Va[f[(f[b>>2]|0)+4>>2]&127](b);br(a);return}function on(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0;e=a;a=c;c=Rl(e,a)|0;f=I;return (I=(X(b,a)|0)+(X(d,e)|0)+f|f&0,c|0|0)|0}function pn(a,b){a=a|0;b=b|0;Sg(a,b);f[a>>2]=1276;b=a+36|0;a=b+40|0;do{f[b>>2]=0;b=b+4|0}while((b|0)<(a|0));return}function qn(a){a=a|0;Gi(a);br(a);return}function rn(a){a=a|0;f[a>>2]=0;f[a+4>>2]=0;f[a+8>>2]=0;f[a+12>>2]=0;f[a+16>>2]=0;f[a+20>>2]=0;f[a+24>>2]=0;f[a+28>>2]=0;return}function sn(a){a=a|0;var b=0;b=u;u=u+16|0;wc(a);if(!(La(f[4654]|0,0)|0)){u=b;return}else Dn(17845,b)}function tn(a){a=a|0;var b=0;f[a>>2]=0;f[a+4>>2]=0;f[a+8>>2]=0;b=a+16|0;f[b>>2]=0;f[b+4>>2]=0;f[b+8>>2]=0;f[b+12>>2]=0;return}function un(a,b){a=a|0;b=b|0;return eg(a+40|0,b)|0}function vn(a,b){a=a|0;b=b|0;return $i(a,b,Aq(b)|0)|0}function wn(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,g=0;e=u;u=u+16|0;g=e;f[g>>2]=d;d=Mi(a,b,c,g)|0;u=e;return d|0}function xn(a,b){a=a|0;b=b|0;return Aj(a+40|0,b)|0}function yn(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return zh(a,b,c,d)|0}function zn(a){a=a|0;var b=0;f[a>>2]=3608;f[a+52>>2]=0;b=a+4|0;a=b+44|0;do{f[b>>2]=0;b=b+4|0}while((b|0)<(a|0));return}function An(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return $g(a,b,c,d)|0}function Bn(a,b){a=a|0;b=b|0;var c=0;c=f[a+64>>2]|0;return Ra[f[(f[c>>2]|0)+24>>2]&127](c,b)|0}function Cn(a){a=a|0;f[a>>2]=0;f[a+4>>2]=0;f[a+8>>2]=0;f[a+12>>2]=0;f[a+16>>2]=0;f[a+20>>2]=0;b[a+24>>0]=0;return}function Dn(a,b){a=a|0;b=b|0;var c=0,d=0;c=u;u=u+16|0;d=c;f[d>>2]=b;b=f[1478]|0;hh(b,a,d)|0;zj(10,b)|0;Ca()}function En(a,b,c,d,e,f,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;return Ta[a&31](b|0,c|0,d|0,e|0,f|0,g|0)|0}function Fn(a){a=a|0;var b=0;b=f[a+56>>2]|0;f[a+60>>2]=((f[b+100>>2]|0)-(f[b+96>>2]|0)|0)/12|0;return}function Gn(a,b){a=a|0;b=b|0;var c=0;c=f[a+64>>2]|0;return Ra[f[(f[c>>2]|0)+16>>2]&127](c,b)|0}function Hn(a,b){a=a|0;b=b|0;var c=0;c=f[a+64>>2]|0;return Ra[f[(f[c>>2]|0)+20>>2]&127](c,b)|0}function In(a,b){a=a|0;b=b|0;var c=0;c=f[a+64>>2]|0;return Ra[f[(f[c>>2]|0)+12>>2]&127](c,b)|0}function Jn(){var a=0;a=u;u=u+16|0;if(!(Ja(18616,117)|0)){u=a;return}else Dn(17795,a)}function Kn(a){a=a|0;f[a>>2]=1136;Vh(a+4|0);f[a+40>>2]=0;f[a+44>>2]=0;f[a>>2]=2944;return}function Ln(a){a=a|0;Se(a);br(a);return}function Mn(a,b,c,d,e,f,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;_a[a&3](b|0,c|0,d|0,e|0,f|0,g|0)}function Nn(a,b){a=a|0;b=b|0;var c=0;c=f[b+64>>2]|0;Wa[f[(f[c>>2]|0)+28>>2]&15](a,c);return}function On(a,b,c){a=a|0;b=b|0;c=c|0;if(b|0)hj(a|0,(zq(c)|0)&255|0,b|0)|0;return a|0}function Pn(a){a=a|0;return 4}function Qn(a,b,c){a=a|0;b=b|0;c=c|0;return Ui(0,b,c)|0}function Rn(a,b,c){a=a|0;b=b|0;c=c|0;if((c|0)<32){I=b<<c|(a&(1<<c)-1<<32-c)>>>32-c;return a<<c}I=a<<c-32;return 0}function Sn(){}function Tn(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0;e=a+c>>>0;return (I=b+d+(e>>>0<a>>>0|0)>>>0,e|0)|0}function Un(a,b){a=a|0;b=b|0;var c=0;if(!b)c=0;else c=lh(f[b>>2]|0,f[b+4>>2]|0,a)|0;return (c|0?c:a)|0}function Vn(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0;e=b-d>>>0;e=b-d-(c>>>0>a>>>0|0)>>>0;return (I=e,a-c>>>0|0)|0}function Wn(a,b,c){a=a|0;b=b|0;c=c|0;if((c|0)<32){I=b>>>c;return a>>>c|(b&(1<<c)-1)<<32-c}I=0;return b>>>c-32|0}function Xn(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return qe(a,b,c,d)|0}function Yn(a){a=a|0;Ve(a);br(a);return}function Zn(a,b,c,d){a=a|0;b=b|0;c=c|0;d=+d;return Oi(a,b,c,d)|0}function _n(a){a=a|0;return 5}function $n(a){a=a|0;var b=0;f[a>>2]=5880;b=a+4|0;a=b+80|0;do{f[b>>2]=0;b=b+4|0}while((b|0)<(a|0));return}function ao(a){a=a|0;return 6}function bo(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return Pi(a,b,c,d)|0}function co(a,b,c){a=a|0;b=b|0;c=c|0;Fj(a,b,c);return}function eo(a,b){a=a|0;b=b|0;xi(f[a>>2]|0,b);return}function fo(a,b,c){a=a|0;b=b|0;c=c|0;co(a,b,c);return}function go(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;He(a,b,c,d,1);return}function ho(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;He(a,b,c,d,0);return}function io(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return Eg(a,b,c,d)|0}function jo(a,b,c){a=a|0;b=b|0;c=c|0;return Qh(a,b,c)|0}function ko(a){a=a|0;var b=0;b=f[a+64>>2]|0;return Qa[f[(f[b>>2]|0)+32>>2]&127](b)|0}function lo(a,b,c){a=a|0;b=b|0;c=c|0;f[a+28>>2]=b;f[a+32>>2]=c;return 1}function mo(a,b){a=a|0;b=b|0;f[a>>2]=0;f[a+4>>2]=0;f[a+8>>2]=0;f[a+12>>2]=0;return}function no(a,b,c){a=a|0;b=b|0;c=c|0;Fj(f[a>>2]|0,b,c);return}function oo(a,b,c){a=a|0;b=b|0;c=c|0;return Ui(a,b,c)|0}function po(a,b,c){a=a|0;b=b|0;c=c|0;return Qn(a,b,c)|0}function qo(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;Za[a&3](b|0,c|0,d|0,e|0,f|0)}function ro(a){a=a|0;var b=0,c=0;if(a>>>0>4294963200){b=ir()|0;f[b>>2]=0-a;c=-1}else c=a;return c|0}function so(a,b,c){a=a|0;b=b|0;c=c|0;return rh(a,b,c)|0}function to(a){a=a|0;f[a>>2]=0;f[a+4>>2]=0;f[a+8>>2]=0;f[a+12>>2]=0;f[a+16>>2]=0;return}function uo(a,b){a=a|0;b=b|0;f[a+8>>2]=b;f[a+12>>2]=-1;return 1}function vo(a,b){a=a|0;b=b|0;f[a+56>>2]=b;tp(a,b);return}function wo(a,b,c){a=a|0;b=b|0;c=c|0;no(a,b,c);return}function xo(a){a=+a;var b=0;p[s>>3]=a;b=f[s>>2]|0;I=f[s+4>>2]|0;return b|0}function yo(a,b,c){a=a|0;b=$(b);c=c|0;var d=Oa;d=$($(c|0)/b);n[a>>2]=d;return}function zo(a,b){a=a|0;b=b|0;xi(a,b);return}function Ao(a){a=a|0;wm(a);f[a>>2]=1460;f[a+36>>2]=0;return}function Bo(a){a=a|0;zn(a);f[a>>2]=3424;f[a+56>>2]=0;f[a+60>>2]=0;return}function Co(a){a=a|0;var b=0;if(!a)b=0;else b=(mh(a,1024,1112,0)|0)!=0&1;return b|0}function Do(a,b,c){a=a|0;b=b|0;c=c|0;Eo(f[a>>2]|0,b,c);return}function Eo(a,b,c){a=a|0;b=b|0;c=c|0;Fi(a+4|0,b,c);return}function Fo(a){a=a|0;var b=0;b=dn(8)|0;ck(b,a);return b|0}function Go(a){a=a|0;if((b[a+11>>0]|0)<0)br(f[a>>2]|0);return}function Ho(a){a=a|0;if(!a)return;Va[f[(f[a>>2]|0)+4>>2]&127](a);return}function Io(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;Ya[a&7](b|0,c|0,d|0,e|0)}function Jo(a,b,c){a=a|0;b=b|0;c=c|0;if(c|0)Xl(a|0,b|0,c|0)|0;return a|0}function Ko(a,b,c){a=a|0;b=b|0;c=c|0;Do(a,b,c);return}function Lo(a,b,c){a=a|0;b=b|0;c=c|0;if(c|0)Rg(a|0,b|0,c|0)|0;return a|0}function Mo(a){a=a|0;f[a+52>>2]=f[(f[a+4>>2]|0)+80>>2];return}function No(a,b){a=a|0;b=b|0;eo(a,b);return}function Oo(a){a=a|0;f[a+52>>2]=f[(f[a+56>>2]|0)+80>>2];return}function Po(a,b){a=a|0;b=b|0;return -1}function Qo(a){a=a|0;var b=0;b=u;u=u+16|0;Ua[a&3]();Dn(17898,b)}function Ro(a){a=a|0;wh(a);br(a);return}function So(a,b,c){a=a|0;b=b|0;c=c|0;$o(a,b,c);return}function To(a,b){a=a|0;b=b|0;bk(f[a>>2]|0,b);return}function Uo(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return Sa[a&31](b|0,c|0,d|0)|0}function Vo(a,b){a=a|0;b=b|0;return (Jp(a,b)|0)<<24>>24|0}function Wo(a,b){a=a|0;b=b|0;f[a>>2]=6924;Sl(a+4|0,b);return}function Xo(a){a=a|0;Bo(a);f[a>>2]=3e3;f[a+64>>2]=0;return}function Yo(a,b){a=a|0;b=b|0;var c=0;if(!a)c=0;else c=Bi(a,b,0)|0;return c|0}function Zo(a,b){a=a|0;b=b|0;zo(a,b);return}function _o(a){a=a|0;return f[a+12>>2]|0}function $o(a,b,c){a=a|0;b=b|0;c=c|0;Eo(a,b,c);return}function ap(){var a=0;a=dn(64)|0;Al(a);return a|0}function bp(a,b){a=a|0;b=b|0;To(a,b);return}function cp(a){a=a|0;if(!a)return;Qi(a);br(a);return}function dp(a){a=a|0;return f[a+4>>2]|0}function ep(a,b,c){a=a|0;b=b|0;c=c|0;if(!(f[a>>2]&32))ai(b,c,a)|0;return}function fp(a){a=a|0;return Mp(a)|0}function gp(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;Xa[a&15](b|0,c|0,d|0)}function hp(){var a=0;a=dn(96)|0;Lm(a);return a|0}function ip(a){a=a|0;return Np(a)|0}function jp(a){a=a|0;var b=0;b=u;u=u+a|0;u=u+15&-16;return b|0}function kp(a){a=a|0;var b=0;b=(Yq()|0)+188|0;return Tj(a,f[b>>2]|0)|0}function lp(a){a=a|0;return ((f[a+100>>2]|0)-(f[a+96>>2]|0)|0)/12|0|0}function mp(a,b){a=a|0;b=b|0;vp(a,b);return}function np(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;aa(3);return 0}function op(){var a=0;a=dn(12)|0;Bp(a);return a|0}function pp(a){a=a|0;zi(a);br(a);return}function qp(a,b,c){a=a|0;b=b|0;c=c|0;return (a|0)==(b|0)|0}function rp(a,b){a=a|0;b=b|0;var c=0;c=Fp(a|0)|0;return ((b|0)==0?a:c)|0}function sp(a){a=a|0;return (f[a+12>>2]|0)-(f[a+8>>2]|0)>>2|0}function tp(a,b){a=a|0;b=b|0;f[a+4>>2]=b;return}function up(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return Bd(a,b,c,d,0)|0}function vp(a,b){a=a|0;b=b|0;bk(a,b);return}function wp(a){a=a|0;f[a+4>>2]=0;f[a+8>>2]=0;f[a>>2]=a+4;return}function xp(a){a=a|0;return nq(a)|0}function yp(){var a=0;a=dn(84)|0;$n(a);return a|0}function zp(a){a=a|0;gi(a);br(a);return}function Ap(a){a=a|0;return oq(a)|0}function Bp(a){a=a|0;f[a>>2]=0;f[a+4>>2]=0;f[a+8>>2]=0;return}function Cp(a){a=a|0;f[a>>2]=6924;lm(a+4|0);return}function Dp(a,b,c){a=a|0;b=b|0;c=c|0;return Ra[a&127](b|0,c|0)|0}function Ep(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;aa(10)}function Fp(a){a=a|0;return (a&255)<<24|(a>>8&255)<<16|(a>>16&255)<<8|a>>>24|0}function Gp(a){a=a|0;Bo(a);f[a>>2]=3504;return}function Hp(a,c){a=a|0;c=c|0;b[a>>0]=b[c>>0]|0;return}function Ip(a,b,c){a=a|0;b=b|0;c=c|0;return -1}function Jp(a,c){a=a|0;c=c|0;return b[(f[a>>2]|0)+c>>0]|0}function Kp(a){a=a|0;return (f[a+4>>2]|0)-(f[a>>2]|0)|0}function Lp(a){a=a|0;aj(a);br(a);return}function Mp(a){a=a|0;return f[(f[a>>2]|0)+40>>2]|0}function Np(a){a=a|0;return f[(f[a>>2]|0)+44>>2]|0}function Op(a){a=a|0;if(!a)return;br(a);return}function Pp(a){a=a|0;b[a+28>>0]=1;return}function Qp(a,b){a=a|0;b=b|0;if(!x){x=a;y=b}}function Rp(a,b){a=a|0;b=b|0;return 1}function Sp(a){a=a|0;return a+12|0}function Tp(a,b,c){a=a|0;b=b|0;c=c|0;Wa[a&15](b|0,c|0)}function Up(a,b){a=a|0;b=b|0;f[a+80>>2]=b;return}function Vp(){var a=0;a=dn(48)|0;Fq(a);return a|0}function Wp(a){a=a|0;return vq(a+4|0)|0}function Xp(){var a=0;a=dn(108)|0;bn(a);return a|0}function Yp(a){a=a|0;return (b[a+32>>0]|0)!=0|0}function Zp(a){a=a|0;return a+-12|0}function _p(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;aa(9)}function $p(){var a=0;a=f[4655]|0;f[4655]=a+0;return a|0}function aq(a){a=a|0;return f[a+56>>2]|0}function bq(){var a=0;a=f[1708]|0;f[1708]=a+0;return a|0}function cq(a){a=a|0;wg(a);br(a);return}function dq(a){a=a|0;fr(a);br(a);return}function eq(a){a=a|0;return b[a+24>>0]|0}function fq(a,b){a=a|0;b=b|0;return 0}function gq(a){a=a|0;return f[a+48>>2]|0}function hq(a,b){a=a|0;b=b|0;return Qa[a&127](b|0)|0}function iq(a){a=a|0;return f[a+60>>2]|0}function jq(a){a=a|0;return f[a+28>>2]|0}function kq(a){a=a|0;sa(a|0)|0;bm()}function lq(a){a=a|0;Cp(a);br(a);return}function mq(a){a=a|0;Ca()}function nq(a){a=a|0;return f[a+40>>2]|0}function oq(a){a=a|0;return f[a+44>>2]|0}function pq(a,b){a=a|0;b=b|0;return $(+sk(a,b,0))}function qq(a){a=a|0;return 3}function rq(a,b){a=a|0;b=b|0;u=a;v=b}function sq(a){a=a|0;n[a>>2]=$(1.0);return}function tq(a){a=a|0;return ((a|0)==32|(a+-9|0)>>>0<5)&1|0}function uq(a){a=a|0;return f[a+80>>2]|0}function vq(a){a=a|0;return f[a>>2]|0}function wq(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;aa(8)}function xq(a,b){a=a|0;b=b|0;Va[a&127](b|0)}function yq(a,b){a=a|0;b=b|0;return Un(a,b)|0}function zq(a){a=a|0;return a&255|0}function Aq(a){a=a|0;return vj(a)|0}function Bq(a,b){a=a|0;b=b|0;return +(+sk(a,b,1))}function Cq(a,b,c){a=a|0;b=b|0;c=c|0;aa(2);return 0}function Dq(a){a=a|0;return 2}function Eq(a){a=a|0;return 1}function Fq(a){a=a|0;Kn(a);return}function Gq(a,b){a=+a;b=+b;return +(+Nl(a,b))}function Hq(a,b){a=+a;b=b|0;return +(+Wj(a,b))}function Iq(a,b){a=+a;b=b|0;return +(+Uj(a,b))}function Jq(){return 3}function Kq(a,b,c){a=a|0;b=b|0;c=c|0;aa(7)}function Lq(){return 0}function Mq(){return -1}function Nq(){return dn(1)|0}function Oq(){return 4}function Pq(a){a=a|0;return (a+-48|0)>>>0<10|0}function Qq(){return 1}function Rq(){return 2}function Sq(a,b){a=+a;b=+b;return +(+pd(a,b))}function Tq(a,b){a=a|0;b=b|0;aa(1);return 0}function Uq(a){a=a|0;Ha()}function Vq(a){a=a|0;Ua[a&3]()}function Wq(){ua()}function Xq(a){a=a|0;return +(+Bq(a,0))}function Yq(){return lr()|0}function Zq(a,b){a=a|0;b=b|0;aa(6)}function _q(a){a=a|0;return dn(a)|0}function $q(a){a=a|0;br(a);return}function ar(a){a=a|0;u=a}function br(a){a=a|0;wc(a);return}function cr(a){a=a|0;I=a}function dr(a){a=a|0;return a|0}function er(a){a=a|0;aa(0);return 0}function fr(a){a=a|0;return}function gr(a){a=a|0;return 0}function hr(){return I|0}function ir(){return 18544}function jr(){return u|0}function kr(a){a=a|0;aa(5)}function lr(){return 6040}function mr(){aa(4)}\n\n// EMSCRIPTEN_END_FUNCS\nvar Qa=[er,Dq,Eq,Eq,Dq,gb,gr,gr,gr,ak,Vf,Eq,dp,gr,gr,Eq,gr,Eq,Eq,rl,_n,ll,Eq,ao,Yk,Eq,jq,Pn,rl,Eq,rl,_n,ll,Eq,ao,Yk,Eq,jq,Pn,rl,Eq,qq,gr,dp,Eq,gr,Eq,qq,Eq,kl,Pn,kl,_n,il,Eq,ao,Qk,Eq,jq,Eq,kl,Pn,kl,_n,il,Eq,ao,Qk,Eq,jq,Eq,Dq,Eq,Eq,Cd,Eq,Je,Tg,qk,ko,_o,dp,lg,sg,$e,_o,dp,Eq,gr,gr,wi,gr,Eq,gr,Xj,ln,Wp,er,er,er,er,er,er,er,er,er,er,er,er,er,er,er,er,er,er,er,er,er,er,er,er,er,er,er,er,er,er,er];var Ra=[Tq,ql,Ug,ve,xl,fq,fq,fq,Rp,kb,gj,uo,Rp,Rp,fi,bj,Uh,ek,jl,Gj,Vk,Yj,Zj,Fe,Po,fq,Zh,fq,Dl,_e,fq,El,Zg,$l,td,fq,Dl,_e,fq,El,Zg,$l,td,xn,Po,fq,Xh,sd,fq,tl,We,fq,ul,Yg,$l,sd,fq,tl,We,fq,ul,Yg,$l,un,Hn,Bn,In,Gn,Kg,dk,mk,mc,le,Jm,wf,af,Ze,Ig,dk,mk,lc,le,Jm,Rp,fq,fq,bf,nm,Xf,bf,Tq,Tq,Tq,Tq,Tq,Tq,Tq,Tq,Tq,Tq,Tq,Tq,Tq,Tq,Tq,Tq,Tq,Tq,Tq,Tq,Tq,Tq,Tq,Tq,Tq,Tq,Tq,Tq,Tq,Tq,Tq,Tq,Tq,Tq,Tq,Tq,Tq,Tq];var Sa=[Cq,lo,Ip,fn,Km,fg,cj,el,ih,uc,vh,$f,Rh,Qb,Oh,vg,gl,Dm,qj,Cq,Cq,Cq,Cq,Cq,Cq,Cq,Cq,Cq,Cq,Cq,Cq,Cq];var Ta=[np,Ld,Bc,ne,Sb,bb,Cc,me,Rb,ab,Lg,ed,eb,sf,qc,id,db,qf,nc,np,np,np,np,np,np,np,np,np,np,np,np,np];var Ua=[mr,Wq,Ai,Jn];var Va=[kr,Ij,Qj,fr,$q,um,Yl,Wk,Uq,gi,zp,zi,pp,wh,Ro,zm,tm,Vl,Uq,Hl,Hl,Uk,Jk,_k,Ok,fr,$q,Uq,Li,Ul,Hl,Rk,Gk,Xk,Mk,fr,$q,Uq,Ii,Kl,zm,tm,fr,$q,$q,mj,Bl,ym,gm,kn,Ym,fr,$q,$q,kj,sl,sm,Zl,$m,Mm,fr,$q,ok,hk,Qj,Sj,Vj,Vj,am,Bm,Mc,Jl,Ve,Yn,rk,jk,Lk,Fk,Em,rm,xk,nk,Nk,Ik,Nm,vm,Fm,xm,Gi,qn,Se,Ln,aj,Uq,Lp,Oo,Fn,fr,$q,Uq,Lp,Mo,Lp,Mo,Dk,wk,rb,wg,cq,fr,dq,fr,fr,dq,Cp,lq,lq,sn,kr,kr,kr,kr,kr,kr,kr,kr,kr,kr];var Wa=[Zq,ik,Rf,Ri,Nn,ib,lb,sc,mo,ej,ej,pk,Ec,Zq,Zq,Zq];var Xa=[Kq,ze,Yi,$b,fc,Fc,$b,fc,uj,Ej,Hg,oj,ug,If,Kq,Kq];var Ya=[wq,Dg,Zf,Wl,Zk,wq,wq,wq];var Za=[_p,ij,Vg,_p];var _a=[Ep,Il,Kk,Ep];return{___cxa_can_catch:_l,___cxa_is_pointer_type:Co,___divdi3:zk,___muldi3:on,___udivdi3:up,___uremdi3:an,_bitshift64Lshr:Wn,_bitshift64Shl:Rn,_emscripten_bind_DracoInt8Array_DracoInt8Array_0:op,_emscripten_bind_DracoInt8Array_GetValue_1:Vo,_emscripten_bind_DracoInt8Array___destroy___0:Xm,_emscripten_bind_DracoInt8Array_size_0:Kp,_emscripten_bind_Encoder_EncodeMeshToDracoBuffer_2:jo,_emscripten_bind_Encoder_EncodePointCloudToDracoBuffer_3:An,_emscripten_bind_Encoder_Encoder_0:Vp,_emscripten_bind_Encoder_GetNumberOfEncodedFaces_0:Ap,_emscripten_bind_Encoder_GetNumberOfEncodedPoints_0:xp,_emscripten_bind_Encoder_SetAttributeExplicitQuantization_5:Um,_emscripten_bind_Encoder_SetAttributeQuantization_2:fo,_emscripten_bind_Encoder_SetEncodingMethod_1:mp,_emscripten_bind_Encoder_SetSpeedOptions_2:So,_emscripten_bind_Encoder_SetTrackEncodedProperties_1:Zo,_emscripten_bind_Encoder___destroy___0:Hj,_emscripten_bind_ExpertEncoder_EncodeToDracoBuffer_2:so,_emscripten_bind_ExpertEncoder_ExpertEncoder_1:Fo,_emscripten_bind_ExpertEncoder_GetNumberOfEncodedFaces_0:ip,_emscripten_bind_ExpertEncoder_GetNumberOfEncodedPoints_0:fp,_emscripten_bind_ExpertEncoder_SetAttributeExplicitQuantization_5:jn,_emscripten_bind_ExpertEncoder_SetAttributeQuantization_2:wo,_emscripten_bind_ExpertEncoder_SetEncodingMethod_1:bp,_emscripten_bind_ExpertEncoder_SetSpeedOptions_2:Ko,_emscripten_bind_ExpertEncoder_SetTrackEncodedProperties_1:No,_emscripten_bind_ExpertEncoder___destroy___0:nn,_emscripten_bind_GeometryAttribute_GeometryAttribute_0:ap,_emscripten_bind_GeometryAttribute___destroy___0:Op,_emscripten_bind_MeshBuilder_AddFacesToMesh_3:io,_emscripten_bind_MeshBuilder_AddFloatAttributeToMesh_5:hn,_emscripten_bind_MeshBuilder_AddFloatAttribute_5:hn,_emscripten_bind_MeshBuilder_AddInt16Attribute_5:_m,_emscripten_bind_MeshBuilder_AddInt32AttributeToMesh_5:gn,_emscripten_bind_MeshBuilder_AddInt32Attribute_5:gn,_emscripten_bind_MeshBuilder_AddInt8Attribute_5:cn,_emscripten_bind_MeshBuilder_AddMetadataToMesh_2:po,_emscripten_bind_MeshBuilder_AddMetadata_2:oo,_emscripten_bind_MeshBuilder_AddUInt16Attribute_5:Wm,_emscripten_bind_MeshBuilder_AddUInt32Attribute_5:Vm,_emscripten_bind_MeshBuilder_AddUInt8Attribute_5:Zm,_emscripten_bind_MeshBuilder_MeshBuilder_0:Nq,_emscripten_bind_MeshBuilder_SetMetadataForAttribute_3:yn,_emscripten_bind_MeshBuilder___destroy___0:Op,_emscripten_bind_Mesh_Mesh_0:Xp,_emscripten_bind_Mesh___destroy___0:Ho,_emscripten_bind_Mesh_num_attributes_0:sp,_emscripten_bind_Mesh_num_faces_0:lp,_emscripten_bind_Mesh_num_points_0:uq,_emscripten_bind_Mesh_set_num_points_1:Up,_emscripten_bind_MetadataBuilder_AddDoubleEntry_3:Zn,_emscripten_bind_MetadataBuilder_AddIntEntry_3:bo,_emscripten_bind_MetadataBuilder_AddStringEntry_3:Xn,_emscripten_bind_MetadataBuilder_MetadataBuilder_0:Nq,_emscripten_bind_MetadataBuilder___destroy___0:Op,_emscripten_bind_Metadata_Metadata_0:Ml,_emscripten_bind_Metadata___destroy___0:cp,_emscripten_bind_PointAttribute_PointAttribute_0:hp,_emscripten_bind_PointAttribute___destroy___0:xj,_emscripten_bind_PointAttribute_attribute_type_0:aq,_emscripten_bind_PointAttribute_byte_offset_0:gq,_emscripten_bind_PointAttribute_byte_stride_0:nq,_emscripten_bind_PointAttribute_data_type_0:jq,_emscripten_bind_PointAttribute_normalized_0:Yp,_emscripten_bind_PointAttribute_num_components_0:eq,_emscripten_bind_PointAttribute_size_0:uq,_emscripten_bind_PointAttribute_unique_id_0:iq,_emscripten_bind_PointCloudBuilder_AddFloatAttribute_5:hn,_emscripten_bind_PointCloudBuilder_AddInt16Attribute_5:_m,_emscripten_bind_PointCloudBuilder_AddInt32Attribute_5:gn,_emscripten_bind_PointCloudBuilder_AddInt8Attribute_5:cn,_emscripten_bind_PointCloudBuilder_AddMetadata_2:oo,_emscripten_bind_PointCloudBuilder_AddUInt16Attribute_5:Wm,_emscripten_bind_PointCloudBuilder_AddUInt32Attribute_5:Vm,_emscripten_bind_PointCloudBuilder_AddUInt8Attribute_5:Zm,_emscripten_bind_PointCloudBuilder_PointCloudBuilder_0:Nq,_emscripten_bind_PointCloudBuilder_SetMetadataForAttribute_3:yn,_emscripten_bind_PointCloudBuilder___destroy___0:Op,_emscripten_bind_PointCloud_PointCloud_0:yp,_emscripten_bind_PointCloud___destroy___0:Ho,_emscripten_bind_PointCloud_num_attributes_0:sp,_emscripten_bind_PointCloud_num_points_0:uq,_emscripten_bind_VoidPtr___destroy___0:Op,_emscripten_enum_draco_EncodedGeometryType_INVALID_GEOMETRY_TYPE:Mq,_emscripten_enum_draco_EncodedGeometryType_POINT_CLOUD:Lq,_emscripten_enum_draco_EncodedGeometryType_TRIANGULAR_MESH:Qq,_emscripten_enum_draco_GeometryAttribute_Type_COLOR:Rq,_emscripten_enum_draco_GeometryAttribute_Type_GENERIC:Oq,_emscripten_enum_draco_GeometryAttribute_Type_INVALID:Mq,_emscripten_enum_draco_GeometryAttribute_Type_NORMAL:Qq,_emscripten_enum_draco_GeometryAttribute_Type_POSITION:Lq,_emscripten_enum_draco_GeometryAttribute_Type_TEX_COORD:Jq,_emscripten_enum_draco_MeshEncoderMethod_MESH_EDGEBREAKER_ENCODING:Qq,_emscripten_enum_draco_MeshEncoderMethod_MESH_SEQUENTIAL_ENCODING:Lq,_emscripten_replace_memory:Pa,_free:wc,_i64Add:Tn,_i64Subtract:Vn,_llvm_bswap_i32:Fp,_malloc:$a,_memcpy:Rg,_memmove:Xl,_memset:hj,_sbrk:Fl,dynCall_ii:hq,dynCall_iii:Dp,dynCall_iiii:Uo,dynCall_iiiiiii:En,dynCall_v:Vq,dynCall_vi:xq,dynCall_vii:Tp,dynCall_viii:gp,dynCall_viiii:Io,dynCall_viiiii:qo,dynCall_viiiiii:Mn,establishStackSpace:rq,getTempRet0:hr,runPostSets:Sn,setTempRet0:cr,setThrew:Qp,stackAlloc:jp,stackRestore:ar,stackSave:jr}})\n\n\n// EMSCRIPTEN_END_ASM\n(Module.asmGlobalArg,Module.asmLibraryArg,buffer);var ___cxa_can_catch=Module[\"___cxa_can_catch\"]=asm[\"___cxa_can_catch\"];var ___cxa_is_pointer_type=Module[\"___cxa_is_pointer_type\"]=asm[\"___cxa_is_pointer_type\"];var ___divdi3=Module[\"___divdi3\"]=asm[\"___divdi3\"];var ___muldi3=Module[\"___muldi3\"]=asm[\"___muldi3\"];var ___udivdi3=Module[\"___udivdi3\"]=asm[\"___udivdi3\"];var ___uremdi3=Module[\"___uremdi3\"]=asm[\"___uremdi3\"];var _bitshift64Lshr=Module[\"_bitshift64Lshr\"]=asm[\"_bitshift64Lshr\"];var _bitshift64Shl=Module[\"_bitshift64Shl\"]=asm[\"_bitshift64Shl\"];var _emscripten_bind_DracoInt8Array_DracoInt8Array_0=Module[\"_emscripten_bind_DracoInt8Array_DracoInt8Array_0\"]=asm[\"_emscripten_bind_DracoInt8Array_DracoInt8Array_0\"];var _emscripten_bind_DracoInt8Array_GetValue_1=Module[\"_emscripten_bind_DracoInt8Array_GetValue_1\"]=asm[\"_emscripten_bind_DracoInt8Array_GetValue_1\"];var _emscripten_bind_DracoInt8Array___destroy___0=Module[\"_emscripten_bind_DracoInt8Array___destroy___0\"]=asm[\"_emscripten_bind_DracoInt8Array___destroy___0\"];var _emscripten_bind_DracoInt8Array_size_0=Module[\"_emscripten_bind_DracoInt8Array_size_0\"]=asm[\"_emscripten_bind_DracoInt8Array_size_0\"];var _emscripten_bind_Encoder_EncodeMeshToDracoBuffer_2=Module[\"_emscripten_bind_Encoder_EncodeMeshToDracoBuffer_2\"]=asm[\"_emscripten_bind_Encoder_EncodeMeshToDracoBuffer_2\"];var _emscripten_bind_Encoder_EncodePointCloudToDracoBuffer_3=Module[\"_emscripten_bind_Encoder_EncodePointCloudToDracoBuffer_3\"]=asm[\"_emscripten_bind_Encoder_EncodePointCloudToDracoBuffer_3\"];var _emscripten_bind_Encoder_Encoder_0=Module[\"_emscripten_bind_Encoder_Encoder_0\"]=asm[\"_emscripten_bind_Encoder_Encoder_0\"];var _emscripten_bind_Encoder_GetNumberOfEncodedFaces_0=Module[\"_emscripten_bind_Encoder_GetNumberOfEncodedFaces_0\"]=asm[\"_emscripten_bind_Encoder_GetNumberOfEncodedFaces_0\"];var _emscripten_bind_Encoder_GetNumberOfEncodedPoints_0=Module[\"_emscripten_bind_Encoder_GetNumberOfEncodedPoints_0\"]=asm[\"_emscripten_bind_Encoder_GetNumberOfEncodedPoints_0\"];var _emscripten_bind_Encoder_SetAttributeExplicitQuantization_5=Module[\"_emscripten_bind_Encoder_SetAttributeExplicitQuantization_5\"]=asm[\"_emscripten_bind_Encoder_SetAttributeExplicitQuantization_5\"];var _emscripten_bind_Encoder_SetAttributeQuantization_2=Module[\"_emscripten_bind_Encoder_SetAttributeQuantization_2\"]=asm[\"_emscripten_bind_Encoder_SetAttributeQuantization_2\"];var _emscripten_bind_Encoder_SetEncodingMethod_1=Module[\"_emscripten_bind_Encoder_SetEncodingMethod_1\"]=asm[\"_emscripten_bind_Encoder_SetEncodingMethod_1\"];var _emscripten_bind_Encoder_SetSpeedOptions_2=Module[\"_emscripten_bind_Encoder_SetSpeedOptions_2\"]=asm[\"_emscripten_bind_Encoder_SetSpeedOptions_2\"];var _emscripten_bind_Encoder_SetTrackEncodedProperties_1=Module[\"_emscripten_bind_Encoder_SetTrackEncodedProperties_1\"]=asm[\"_emscripten_bind_Encoder_SetTrackEncodedProperties_1\"];var _emscripten_bind_Encoder___destroy___0=Module[\"_emscripten_bind_Encoder___destroy___0\"]=asm[\"_emscripten_bind_Encoder___destroy___0\"];var _emscripten_bind_ExpertEncoder_EncodeToDracoBuffer_2=Module[\"_emscripten_bind_ExpertEncoder_EncodeToDracoBuffer_2\"]=asm[\"_emscripten_bind_ExpertEncoder_EncodeToDracoBuffer_2\"];var _emscripten_bind_ExpertEncoder_ExpertEncoder_1=Module[\"_emscripten_bind_ExpertEncoder_ExpertEncoder_1\"]=asm[\"_emscripten_bind_ExpertEncoder_ExpertEncoder_1\"];var _emscripten_bind_ExpertEncoder_GetNumberOfEncodedFaces_0=Module[\"_emscripten_bind_ExpertEncoder_GetNumberOfEncodedFaces_0\"]=asm[\"_emscripten_bind_ExpertEncoder_GetNumberOfEncodedFaces_0\"];var _emscripten_bind_ExpertEncoder_GetNumberOfEncodedPoints_0=Module[\"_emscripten_bind_ExpertEncoder_GetNumberOfEncodedPoints_0\"]=asm[\"_emscripten_bind_ExpertEncoder_GetNumberOfEncodedPoints_0\"];var _emscripten_bind_ExpertEncoder_SetAttributeExplicitQuantization_5=Module[\"_emscripten_bind_ExpertEncoder_SetAttributeExplicitQuantization_5\"]=asm[\"_emscripten_bind_ExpertEncoder_SetAttributeExplicitQuantization_5\"];var _emscripten_bind_ExpertEncoder_SetAttributeQuantization_2=Module[\"_emscripten_bind_ExpertEncoder_SetAttributeQuantization_2\"]=asm[\"_emscripten_bind_ExpertEncoder_SetAttributeQuantization_2\"];var _emscripten_bind_ExpertEncoder_SetEncodingMethod_1=Module[\"_emscripten_bind_ExpertEncoder_SetEncodingMethod_1\"]=asm[\"_emscripten_bind_ExpertEncoder_SetEncodingMethod_1\"];var _emscripten_bind_ExpertEncoder_SetSpeedOptions_2=Module[\"_emscripten_bind_ExpertEncoder_SetSpeedOptions_2\"]=asm[\"_emscripten_bind_ExpertEncoder_SetSpeedOptions_2\"];var _emscripten_bind_ExpertEncoder_SetTrackEncodedProperties_1=Module[\"_emscripten_bind_ExpertEncoder_SetTrackEncodedProperties_1\"]=asm[\"_emscripten_bind_ExpertEncoder_SetTrackEncodedProperties_1\"];var _emscripten_bind_ExpertEncoder___destroy___0=Module[\"_emscripten_bind_ExpertEncoder___destroy___0\"]=asm[\"_emscripten_bind_ExpertEncoder___destroy___0\"];var _emscripten_bind_GeometryAttribute_GeometryAttribute_0=Module[\"_emscripten_bind_GeometryAttribute_GeometryAttribute_0\"]=asm[\"_emscripten_bind_GeometryAttribute_GeometryAttribute_0\"];var _emscripten_bind_GeometryAttribute___destroy___0=Module[\"_emscripten_bind_GeometryAttribute___destroy___0\"]=asm[\"_emscripten_bind_GeometryAttribute___destroy___0\"];var _emscripten_bind_MeshBuilder_AddFacesToMesh_3=Module[\"_emscripten_bind_MeshBuilder_AddFacesToMesh_3\"]=asm[\"_emscripten_bind_MeshBuilder_AddFacesToMesh_3\"];var _emscripten_bind_MeshBuilder_AddFloatAttributeToMesh_5=Module[\"_emscripten_bind_MeshBuilder_AddFloatAttributeToMesh_5\"]=asm[\"_emscripten_bind_MeshBuilder_AddFloatAttributeToMesh_5\"];var _emscripten_bind_MeshBuilder_AddFloatAttribute_5=Module[\"_emscripten_bind_MeshBuilder_AddFloatAttribute_5\"]=asm[\"_emscripten_bind_MeshBuilder_AddFloatAttribute_5\"];var _emscripten_bind_MeshBuilder_AddInt16Attribute_5=Module[\"_emscripten_bind_MeshBuilder_AddInt16Attribute_5\"]=asm[\"_emscripten_bind_MeshBuilder_AddInt16Attribute_5\"];var _emscripten_bind_MeshBuilder_AddInt32AttributeToMesh_5=Module[\"_emscripten_bind_MeshBuilder_AddInt32AttributeToMesh_5\"]=asm[\"_emscripten_bind_MeshBuilder_AddInt32AttributeToMesh_5\"];var _emscripten_bind_MeshBuilder_AddInt32Attribute_5=Module[\"_emscripten_bind_MeshBuilder_AddInt32Attribute_5\"]=asm[\"_emscripten_bind_MeshBuilder_AddInt32Attribute_5\"];var _emscripten_bind_MeshBuilder_AddInt8Attribute_5=Module[\"_emscripten_bind_MeshBuilder_AddInt8Attribute_5\"]=asm[\"_emscripten_bind_MeshBuilder_AddInt8Attribute_5\"];var _emscripten_bind_MeshBuilder_AddMetadataToMesh_2=Module[\"_emscripten_bind_MeshBuilder_AddMetadataToMesh_2\"]=asm[\"_emscripten_bind_MeshBuilder_AddMetadataToMesh_2\"];var _emscripten_bind_MeshBuilder_AddMetadata_2=Module[\"_emscripten_bind_MeshBuilder_AddMetadata_2\"]=asm[\"_emscripten_bind_MeshBuilder_AddMetadata_2\"];var _emscripten_bind_MeshBuilder_AddUInt16Attribute_5=Module[\"_emscripten_bind_MeshBuilder_AddUInt16Attribute_5\"]=asm[\"_emscripten_bind_MeshBuilder_AddUInt16Attribute_5\"];var _emscripten_bind_MeshBuilder_AddUInt32Attribute_5=Module[\"_emscripten_bind_MeshBuilder_AddUInt32Attribute_5\"]=asm[\"_emscripten_bind_MeshBuilder_AddUInt32Attribute_5\"];var _emscripten_bind_MeshBuilder_AddUInt8Attribute_5=Module[\"_emscripten_bind_MeshBuilder_AddUInt8Attribute_5\"]=asm[\"_emscripten_bind_MeshBuilder_AddUInt8Attribute_5\"];var _emscripten_bind_MeshBuilder_MeshBuilder_0=Module[\"_emscripten_bind_MeshBuilder_MeshBuilder_0\"]=asm[\"_emscripten_bind_MeshBuilder_MeshBuilder_0\"];var _emscripten_bind_MeshBuilder_SetMetadataForAttribute_3=Module[\"_emscripten_bind_MeshBuilder_SetMetadataForAttribute_3\"]=asm[\"_emscripten_bind_MeshBuilder_SetMetadataForAttribute_3\"];var _emscripten_bind_MeshBuilder___destroy___0=Module[\"_emscripten_bind_MeshBuilder___destroy___0\"]=asm[\"_emscripten_bind_MeshBuilder___destroy___0\"];var _emscripten_bind_Mesh_Mesh_0=Module[\"_emscripten_bind_Mesh_Mesh_0\"]=asm[\"_emscripten_bind_Mesh_Mesh_0\"];var _emscripten_bind_Mesh___destroy___0=Module[\"_emscripten_bind_Mesh___destroy___0\"]=asm[\"_emscripten_bind_Mesh___destroy___0\"];var _emscripten_bind_Mesh_num_attributes_0=Module[\"_emscripten_bind_Mesh_num_attributes_0\"]=asm[\"_emscripten_bind_Mesh_num_attributes_0\"];var _emscripten_bind_Mesh_num_faces_0=Module[\"_emscripten_bind_Mesh_num_faces_0\"]=asm[\"_emscripten_bind_Mesh_num_faces_0\"];var _emscripten_bind_Mesh_num_points_0=Module[\"_emscripten_bind_Mesh_num_points_0\"]=asm[\"_emscripten_bind_Mesh_num_points_0\"];var _emscripten_bind_Mesh_set_num_points_1=Module[\"_emscripten_bind_Mesh_set_num_points_1\"]=asm[\"_emscripten_bind_Mesh_set_num_points_1\"];var _emscripten_bind_MetadataBuilder_AddDoubleEntry_3=Module[\"_emscripten_bind_MetadataBuilder_AddDoubleEntry_3\"]=asm[\"_emscripten_bind_MetadataBuilder_AddDoubleEntry_3\"];var _emscripten_bind_MetadataBuilder_AddIntEntry_3=Module[\"_emscripten_bind_MetadataBuilder_AddIntEntry_3\"]=asm[\"_emscripten_bind_MetadataBuilder_AddIntEntry_3\"];var _emscripten_bind_MetadataBuilder_AddStringEntry_3=Module[\"_emscripten_bind_MetadataBuilder_AddStringEntry_3\"]=asm[\"_emscripten_bind_MetadataBuilder_AddStringEntry_3\"];var _emscripten_bind_MetadataBuilder_MetadataBuilder_0=Module[\"_emscripten_bind_MetadataBuilder_MetadataBuilder_0\"]=asm[\"_emscripten_bind_MetadataBuilder_MetadataBuilder_0\"];var _emscripten_bind_MetadataBuilder___destroy___0=Module[\"_emscripten_bind_MetadataBuilder___destroy___0\"]=asm[\"_emscripten_bind_MetadataBuilder___destroy___0\"];var _emscripten_bind_Metadata_Metadata_0=Module[\"_emscripten_bind_Metadata_Metadata_0\"]=asm[\"_emscripten_bind_Metadata_Metadata_0\"];var _emscripten_bind_Metadata___destroy___0=Module[\"_emscripten_bind_Metadata___destroy___0\"]=asm[\"_emscripten_bind_Metadata___destroy___0\"];var _emscripten_bind_PointAttribute_PointAttribute_0=Module[\"_emscripten_bind_PointAttribute_PointAttribute_0\"]=asm[\"_emscripten_bind_PointAttribute_PointAttribute_0\"];var _emscripten_bind_PointAttribute___destroy___0=Module[\"_emscripten_bind_PointAttribute___destroy___0\"]=asm[\"_emscripten_bind_PointAttribute___destroy___0\"];var _emscripten_bind_PointAttribute_attribute_type_0=Module[\"_emscripten_bind_PointAttribute_attribute_type_0\"]=asm[\"_emscripten_bind_PointAttribute_attribute_type_0\"];var _emscripten_bind_PointAttribute_byte_offset_0=Module[\"_emscripten_bind_PointAttribute_byte_offset_0\"]=asm[\"_emscripten_bind_PointAttribute_byte_offset_0\"];var _emscripten_bind_PointAttribute_byte_stride_0=Module[\"_emscripten_bind_PointAttribute_byte_stride_0\"]=asm[\"_emscripten_bind_PointAttribute_byte_stride_0\"];var _emscripten_bind_PointAttribute_data_type_0=Module[\"_emscripten_bind_PointAttribute_data_type_0\"]=asm[\"_emscripten_bind_PointAttribute_data_type_0\"];var _emscripten_bind_PointAttribute_normalized_0=Module[\"_emscripten_bind_PointAttribute_normalized_0\"]=asm[\"_emscripten_bind_PointAttribute_normalized_0\"];var _emscripten_bind_PointAttribute_num_components_0=Module[\"_emscripten_bind_PointAttribute_num_components_0\"]=asm[\"_emscripten_bind_PointAttribute_num_components_0\"];var _emscripten_bind_PointAttribute_size_0=Module[\"_emscripten_bind_PointAttribute_size_0\"]=asm[\"_emscripten_bind_PointAttribute_size_0\"];var _emscripten_bind_PointAttribute_unique_id_0=Module[\"_emscripten_bind_PointAttribute_unique_id_0\"]=asm[\"_emscripten_bind_PointAttribute_unique_id_0\"];var _emscripten_bind_PointCloudBuilder_AddFloatAttribute_5=Module[\"_emscripten_bind_PointCloudBuilder_AddFloatAttribute_5\"]=asm[\"_emscripten_bind_PointCloudBuilder_AddFloatAttribute_5\"];var _emscripten_bind_PointCloudBuilder_AddInt16Attribute_5=Module[\"_emscripten_bind_PointCloudBuilder_AddInt16Attribute_5\"]=asm[\"_emscripten_bind_PointCloudBuilder_AddInt16Attribute_5\"];var _emscripten_bind_PointCloudBuilder_AddInt32Attribute_5=Module[\"_emscripten_bind_PointCloudBuilder_AddInt32Attribute_5\"]=asm[\"_emscripten_bind_PointCloudBuilder_AddInt32Attribute_5\"];var _emscripten_bind_PointCloudBuilder_AddInt8Attribute_5=Module[\"_emscripten_bind_PointCloudBuilder_AddInt8Attribute_5\"]=asm[\"_emscripten_bind_PointCloudBuilder_AddInt8Attribute_5\"];var _emscripten_bind_PointCloudBuilder_AddMetadata_2=Module[\"_emscripten_bind_PointCloudBuilder_AddMetadata_2\"]=asm[\"_emscripten_bind_PointCloudBuilder_AddMetadata_2\"];var _emscripten_bind_PointCloudBuilder_AddUInt16Attribute_5=Module[\"_emscripten_bind_PointCloudBuilder_AddUInt16Attribute_5\"]=asm[\"_emscripten_bind_PointCloudBuilder_AddUInt16Attribute_5\"];var _emscripten_bind_PointCloudBuilder_AddUInt32Attribute_5=Module[\"_emscripten_bind_PointCloudBuilder_AddUInt32Attribute_5\"]=asm[\"_emscripten_bind_PointCloudBuilder_AddUInt32Attribute_5\"];var _emscripten_bind_PointCloudBuilder_AddUInt8Attribute_5=Module[\"_emscripten_bind_PointCloudBuilder_AddUInt8Attribute_5\"]=asm[\"_emscripten_bind_PointCloudBuilder_AddUInt8Attribute_5\"];var _emscripten_bind_PointCloudBuilder_PointCloudBuilder_0=Module[\"_emscripten_bind_PointCloudBuilder_PointCloudBuilder_0\"]=asm[\"_emscripten_bind_PointCloudBuilder_PointCloudBuilder_0\"];var _emscripten_bind_PointCloudBuilder_SetMetadataForAttribute_3=Module[\"_emscripten_bind_PointCloudBuilder_SetMetadataForAttribute_3\"]=asm[\"_emscripten_bind_PointCloudBuilder_SetMetadataForAttribute_3\"];var _emscripten_bind_PointCloudBuilder___destroy___0=Module[\"_emscripten_bind_PointCloudBuilder___destroy___0\"]=asm[\"_emscripten_bind_PointCloudBuilder___destroy___0\"];var _emscripten_bind_PointCloud_PointCloud_0=Module[\"_emscripten_bind_PointCloud_PointCloud_0\"]=asm[\"_emscripten_bind_PointCloud_PointCloud_0\"];var _emscripten_bind_PointCloud___destroy___0=Module[\"_emscripten_bind_PointCloud___destroy___0\"]=asm[\"_emscripten_bind_PointCloud___destroy___0\"];var _emscripten_bind_PointCloud_num_attributes_0=Module[\"_emscripten_bind_PointCloud_num_attributes_0\"]=asm[\"_emscripten_bind_PointCloud_num_attributes_0\"];var _emscripten_bind_PointCloud_num_points_0=Module[\"_emscripten_bind_PointCloud_num_points_0\"]=asm[\"_emscripten_bind_PointCloud_num_points_0\"];var _emscripten_bind_VoidPtr___destroy___0=Module[\"_emscripten_bind_VoidPtr___destroy___0\"]=asm[\"_emscripten_bind_VoidPtr___destroy___0\"];var _emscripten_enum_draco_EncodedGeometryType_INVALID_GEOMETRY_TYPE=Module[\"_emscripten_enum_draco_EncodedGeometryType_INVALID_GEOMETRY_TYPE\"]=asm[\"_emscripten_enum_draco_EncodedGeometryType_INVALID_GEOMETRY_TYPE\"];var _emscripten_enum_draco_EncodedGeometryType_POINT_CLOUD=Module[\"_emscripten_enum_draco_EncodedGeometryType_POINT_CLOUD\"]=asm[\"_emscripten_enum_draco_EncodedGeometryType_POINT_CLOUD\"];var _emscripten_enum_draco_EncodedGeometryType_TRIANGULAR_MESH=Module[\"_emscripten_enum_draco_EncodedGeometryType_TRIANGULAR_MESH\"]=asm[\"_emscripten_enum_draco_EncodedGeometryType_TRIANGULAR_MESH\"];var _emscripten_enum_draco_GeometryAttribute_Type_COLOR=Module[\"_emscripten_enum_draco_GeometryAttribute_Type_COLOR\"]=asm[\"_emscripten_enum_draco_GeometryAttribute_Type_COLOR\"];var _emscripten_enum_draco_GeometryAttribute_Type_GENERIC=Module[\"_emscripten_enum_draco_GeometryAttribute_Type_GENERIC\"]=asm[\"_emscripten_enum_draco_GeometryAttribute_Type_GENERIC\"];var _emscripten_enum_draco_GeometryAttribute_Type_INVALID=Module[\"_emscripten_enum_draco_GeometryAttribute_Type_INVALID\"]=asm[\"_emscripten_enum_draco_GeometryAttribute_Type_INVALID\"];var _emscripten_enum_draco_GeometryAttribute_Type_NORMAL=Module[\"_emscripten_enum_draco_GeometryAttribute_Type_NORMAL\"]=asm[\"_emscripten_enum_draco_GeometryAttribute_Type_NORMAL\"];var _emscripten_enum_draco_GeometryAttribute_Type_POSITION=Module[\"_emscripten_enum_draco_GeometryAttribute_Type_POSITION\"]=asm[\"_emscripten_enum_draco_GeometryAttribute_Type_POSITION\"];var _emscripten_enum_draco_GeometryAttribute_Type_TEX_COORD=Module[\"_emscripten_enum_draco_GeometryAttribute_Type_TEX_COORD\"]=asm[\"_emscripten_enum_draco_GeometryAttribute_Type_TEX_COORD\"];var _emscripten_enum_draco_MeshEncoderMethod_MESH_EDGEBREAKER_ENCODING=Module[\"_emscripten_enum_draco_MeshEncoderMethod_MESH_EDGEBREAKER_ENCODING\"]=asm[\"_emscripten_enum_draco_MeshEncoderMethod_MESH_EDGEBREAKER_ENCODING\"];var _emscripten_enum_draco_MeshEncoderMethod_MESH_SEQUENTIAL_ENCODING=Module[\"_emscripten_enum_draco_MeshEncoderMethod_MESH_SEQUENTIAL_ENCODING\"]=asm[\"_emscripten_enum_draco_MeshEncoderMethod_MESH_SEQUENTIAL_ENCODING\"];var _emscripten_replace_memory=Module[\"_emscripten_replace_memory\"]=asm[\"_emscripten_replace_memory\"];var _free=Module[\"_free\"]=asm[\"_free\"];var _i64Add=Module[\"_i64Add\"]=asm[\"_i64Add\"];var _i64Subtract=Module[\"_i64Subtract\"]=asm[\"_i64Subtract\"];var _llvm_bswap_i32=Module[\"_llvm_bswap_i32\"]=asm[\"_llvm_bswap_i32\"];var _malloc=Module[\"_malloc\"]=asm[\"_malloc\"];var _memcpy=Module[\"_memcpy\"]=asm[\"_memcpy\"];var _memmove=Module[\"_memmove\"]=asm[\"_memmove\"];var _memset=Module[\"_memset\"]=asm[\"_memset\"];var _sbrk=Module[\"_sbrk\"]=asm[\"_sbrk\"];var establishStackSpace=Module[\"establishStackSpace\"]=asm[\"establishStackSpace\"];var getTempRet0=Module[\"getTempRet0\"]=asm[\"getTempRet0\"];var runPostSets=Module[\"runPostSets\"]=asm[\"runPostSets\"];var setTempRet0=Module[\"setTempRet0\"]=asm[\"setTempRet0\"];var setThrew=Module[\"setThrew\"]=asm[\"setThrew\"];var stackAlloc=Module[\"stackAlloc\"]=asm[\"stackAlloc\"];var stackRestore=Module[\"stackRestore\"]=asm[\"stackRestore\"];var stackSave=Module[\"stackSave\"]=asm[\"stackSave\"];var dynCall_ii=Module[\"dynCall_ii\"]=asm[\"dynCall_ii\"];var dynCall_iii=Module[\"dynCall_iii\"]=asm[\"dynCall_iii\"];var dynCall_iiii=Module[\"dynCall_iiii\"]=asm[\"dynCall_iiii\"];var dynCall_iiiiiii=Module[\"dynCall_iiiiiii\"]=asm[\"dynCall_iiiiiii\"];var dynCall_v=Module[\"dynCall_v\"]=asm[\"dynCall_v\"];var dynCall_vi=Module[\"dynCall_vi\"]=asm[\"dynCall_vi\"];var dynCall_vii=Module[\"dynCall_vii\"]=asm[\"dynCall_vii\"];var dynCall_viii=Module[\"dynCall_viii\"]=asm[\"dynCall_viii\"];var dynCall_viiii=Module[\"dynCall_viiii\"]=asm[\"dynCall_viiii\"];var dynCall_viiiii=Module[\"dynCall_viiiii\"]=asm[\"dynCall_viiiii\"];var dynCall_viiiiii=Module[\"dynCall_viiiiii\"]=asm[\"dynCall_viiiiii\"];Module[\"asm\"]=asm;if(memoryInitializer){if(!isDataURI(memoryInitializer)){if(typeof Module[\"locateFile\"]===\"function\"){memoryInitializer=Module[\"locateFile\"](memoryInitializer)}else if(Module[\"memoryInitializerPrefixURL\"]){memoryInitializer=Module[\"memoryInitializerPrefixURL\"]+memoryInitializer}}if(ENVIRONMENT_IS_NODE||ENVIRONMENT_IS_SHELL){var data=Module[\"readBinary\"](memoryInitializer);HEAPU8.set(data,GLOBAL_BASE)}else{addRunDependency(\"memory initializer\");var applyMemoryInitializer=(function(data){if(data.byteLength)data=new Uint8Array(data);HEAPU8.set(data,GLOBAL_BASE);if(Module[\"memoryInitializerRequest\"])delete Module[\"memoryInitializerRequest\"].response;removeRunDependency(\"memory initializer\")});function doBrowserLoad(){Module[\"readAsync\"](memoryInitializer,applyMemoryInitializer,(function(){throw\"could not load memory initializer \"+memoryInitializer}))}var memoryInitializerBytes=tryParseAsDataURI(memoryInitializer);if(memoryInitializerBytes){applyMemoryInitializer(memoryInitializerBytes.buffer)}else if(Module[\"memoryInitializerRequest\"]){function useRequest(){var request=Module[\"memoryInitializerRequest\"];var response=request.response;if(request.status!==200&&request.status!==0){var data=tryParseAsDataURI(Module[\"memoryInitializerRequestURL\"]);if(data){response=data.buffer}else{console.warn(\"a problem seems to have happened with Module.memoryInitializerRequest, status: \"+request.status+\", retrying \"+memoryInitializer);doBrowserLoad();return}}applyMemoryInitializer(response)}if(Module[\"memoryInitializerRequest\"].response){setTimeout(useRequest,0)}else{Module[\"memoryInitializerRequest\"].addEventListener(\"load\",useRequest)}}else{doBrowserLoad()}}}Module[\"then\"]=(function(func){if(Module[\"calledRun\"]){func(Module)}else{var old=Module[\"onRuntimeInitialized\"];Module[\"onRuntimeInitialized\"]=(function(){if(old)old();func(Module)})}return Module});function ExitStatus(status){this.name=\"ExitStatus\";this.message=\"Program terminated with exit(\"+status+\")\";this.status=status}ExitStatus.prototype=new Error;ExitStatus.prototype.constructor=ExitStatus;var initialStackTop;dependenciesFulfilled=function runCaller(){if(!Module[\"calledRun\"])run();if(!Module[\"calledRun\"])dependenciesFulfilled=runCaller};function run(args){args=args||Module[\"arguments\"];if(runDependencies>0){return}preRun();if(runDependencies>0)return;if(Module[\"calledRun\"])return;function doRun(){if(Module[\"calledRun\"])return;Module[\"calledRun\"]=true;if(ABORT)return;ensureInitRuntime();preMain();if(Module[\"onRuntimeInitialized\"])Module[\"onRuntimeInitialized\"]();postRun()}if(Module[\"setStatus\"]){Module[\"setStatus\"](\"Running...\");setTimeout((function(){setTimeout((function(){Module[\"setStatus\"](\"\")}),1);doRun()}),1)}else{doRun()}}Module[\"run\"]=run;function exit(status,implicit){if(implicit&&Module[\"noExitRuntime\"]&&status===0){return}if(Module[\"noExitRuntime\"]){}else{ABORT=true;EXITSTATUS=status;STACKTOP=initialStackTop;exitRuntime();if(Module[\"onExit\"])Module[\"onExit\"](status)}if(ENVIRONMENT_IS_NODE){process[\"exit\"](status)}Module[\"quit\"](status,new ExitStatus(status))}Module[\"exit\"]=exit;function abort(what){if(Module[\"onAbort\"]){Module[\"onAbort\"](what)}if(what!==undefined){Module.print(what);Module.printErr(what);what=JSON.stringify(what)}else{what=\"\"}ABORT=true;EXITSTATUS=1;throw\"abort(\"+what+\"). Build with -s ASSERTIONS=1 for more info.\"}Module[\"abort\"]=abort;if(Module[\"preInit\"]){if(typeof Module[\"preInit\"]==\"function\")Module[\"preInit\"]=[Module[\"preInit\"]];while(Module[\"preInit\"].length>0){Module[\"preInit\"].pop()()}}Module[\"noExitRuntime\"]=true;run();function WrapperObject(){}WrapperObject.prototype=Object.create(WrapperObject.prototype);WrapperObject.prototype.constructor=WrapperObject;WrapperObject.prototype.__class__=WrapperObject;WrapperObject.__cache__={};Module[\"WrapperObject\"]=WrapperObject;function getCache(__class__){return(__class__||WrapperObject).__cache__}Module[\"getCache\"]=getCache;function wrapPointer(ptr,__class__){var cache=getCache(__class__);var ret=cache[ptr];if(ret)return ret;ret=Object.create((__class__||WrapperObject).prototype);ret.ptr=ptr;return cache[ptr]=ret}Module[\"wrapPointer\"]=wrapPointer;function castObject(obj,__class__){return wrapPointer(obj.ptr,__class__)}Module[\"castObject\"]=castObject;Module[\"NULL\"]=wrapPointer(0);function destroy(obj){if(!obj[\"__destroy__\"])throw\"Error: Cannot destroy object. (Did you create it yourself?)\";obj[\"__destroy__\"]();delete getCache(obj.__class__)[obj.ptr]}Module[\"destroy\"]=destroy;function compare(obj1,obj2){return obj1.ptr===obj2.ptr}Module[\"compare\"]=compare;function getPointer(obj){return obj.ptr}Module[\"getPointer\"]=getPointer;function getClass(obj){return obj.__class__}Module[\"getClass\"]=getClass;var ensureCache={buffer:0,size:0,pos:0,temps:[],needed:0,prepare:(function(){if(ensureCache.needed){for(var i=0;i<ensureCache.temps.length;i++){Module[\"_free\"](ensureCache.temps[i])}ensureCache.temps.length=0;Module[\"_free\"](ensureCache.buffer);ensureCache.buffer=0;ensureCache.size+=ensureCache.needed;ensureCache.needed=0}if(!ensureCache.buffer){ensureCache.size+=128;ensureCache.buffer=Module[\"_malloc\"](ensureCache.size);assert(ensureCache.buffer)}ensureCache.pos=0}),alloc:(function(array,view){assert(ensureCache.buffer);var bytes=view.BYTES_PER_ELEMENT;var len=array.length*bytes;len=len+7&-8;var ret;if(ensureCache.pos+len>=ensureCache.size){assert(len>0);ensureCache.needed+=len;ret=Module[\"_malloc\"](len);ensureCache.temps.push(ret)}else{ret=ensureCache.buffer+ensureCache.pos;ensureCache.pos+=len}return ret}),copy:(function(array,view,offset){var offsetShifted=offset;var bytes=view.BYTES_PER_ELEMENT;switch(bytes){case 2:offsetShifted>>=1;break;case 4:offsetShifted>>=2;break;case 8:offsetShifted>>=3;break}for(var i=0;i<array.length;i++){view[offsetShifted+i]=array[i]}})};function ensureString(value){if(typeof value===\"string\"){var intArray=intArrayFromString(value);var offset=ensureCache.alloc(intArray,HEAP8);ensureCache.copy(intArray,HEAP8,offset);return offset}return value}function ensureInt8(value){if(typeof value===\"object\"){var offset=ensureCache.alloc(value,HEAP8);ensureCache.copy(value,HEAP8,offset);return offset}return value}function ensureInt16(value){if(typeof value===\"object\"){var offset=ensureCache.alloc(value,HEAP16);ensureCache.copy(value,HEAP16,offset);return offset}return value}function ensureInt32(value){if(typeof value===\"object\"){var offset=ensureCache.alloc(value,HEAP32);ensureCache.copy(value,HEAP32,offset);return offset}return value}function ensureFloat32(value){if(typeof value===\"object\"){var offset=ensureCache.alloc(value,HEAPF32);ensureCache.copy(value,HEAPF32,offset);return offset}return value}function PointCloud(){this.ptr=_emscripten_bind_PointCloud_PointCloud_0();getCache(PointCloud)[this.ptr]=this}PointCloud.prototype=Object.create(WrapperObject.prototype);PointCloud.prototype.constructor=PointCloud;PointCloud.prototype.__class__=PointCloud;PointCloud.__cache__={};Module[\"PointCloud\"]=PointCloud;PointCloud.prototype[\"num_attributes\"]=PointCloud.prototype.num_attributes=(function(){var self=this.ptr;return _emscripten_bind_PointCloud_num_attributes_0(self)});PointCloud.prototype[\"num_points\"]=PointCloud.prototype.num_points=(function(){var self=this.ptr;return _emscripten_bind_PointCloud_num_points_0(self)});PointCloud.prototype[\"__destroy__\"]=PointCloud.prototype.__destroy__=(function(){var self=this.ptr;_emscripten_bind_PointCloud___destroy___0(self)});function ExpertEncoder(arg0){if(arg0&&typeof arg0===\"object\")arg0=arg0.ptr;this.ptr=_emscripten_bind_ExpertEncoder_ExpertEncoder_1(arg0);getCache(ExpertEncoder)[this.ptr]=this}ExpertEncoder.prototype=Object.create(WrapperObject.prototype);ExpertEncoder.prototype.constructor=ExpertEncoder;ExpertEncoder.prototype.__class__=ExpertEncoder;ExpertEncoder.__cache__={};Module[\"ExpertEncoder\"]=ExpertEncoder;ExpertEncoder.prototype[\"SetEncodingMethod\"]=ExpertEncoder.prototype.SetEncodingMethod=(function(arg0){var self=this.ptr;if(arg0&&typeof arg0===\"object\")arg0=arg0.ptr;_emscripten_bind_ExpertEncoder_SetEncodingMethod_1(self,arg0)});ExpertEncoder.prototype[\"SetAttributeQuantization\"]=ExpertEncoder.prototype.SetAttributeQuantization=(function(arg0,arg1){var self=this.ptr;if(arg0&&typeof arg0===\"object\")arg0=arg0.ptr;if(arg1&&typeof arg1===\"object\")arg1=arg1.ptr;_emscripten_bind_ExpertEncoder_SetAttributeQuantization_2(self,arg0,arg1)});ExpertEncoder.prototype[\"SetAttributeExplicitQuantization\"]=ExpertEncoder.prototype.SetAttributeExplicitQuantization=(function(arg0,arg1,arg2,arg3,arg4){var self=this.ptr;ensureCache.prepare();if(arg0&&typeof arg0===\"object\")arg0=arg0.ptr;if(arg1&&typeof arg1===\"object\")arg1=arg1.ptr;if(arg2&&typeof arg2===\"object\")arg2=arg2.ptr;if(typeof arg3==\"object\"){arg3=ensureFloat32(arg3)}if(arg4&&typeof arg4===\"object\")arg4=arg4.ptr;_emscripten_bind_ExpertEncoder_SetAttributeExplicitQuantization_5(self,arg0,arg1,arg2,arg3,arg4)});ExpertEncoder.prototype[\"SetSpeedOptions\"]=ExpertEncoder.prototype.SetSpeedOptions=(function(arg0,arg1){var self=this.ptr;if(arg0&&typeof arg0===\"object\")arg0=arg0.ptr;if(arg1&&typeof arg1===\"object\")arg1=arg1.ptr;_emscripten_bind_ExpertEncoder_SetSpeedOptions_2(self,arg0,arg1)});ExpertEncoder.prototype[\"SetTrackEncodedProperties\"]=ExpertEncoder.prototype.SetTrackEncodedProperties=(function(arg0){var self=this.ptr;if(arg0&&typeof arg0===\"object\")arg0=arg0.ptr;_emscripten_bind_ExpertEncoder_SetTrackEncodedProperties_1(self,arg0)});ExpertEncoder.prototype[\"EncodeToDracoBuffer\"]=ExpertEncoder.prototype.EncodeToDracoBuffer=(function(arg0,arg1){var self=this.ptr;if(arg0&&typeof arg0===\"object\")arg0=arg0.ptr;if(arg1&&typeof arg1===\"object\")arg1=arg1.ptr;return _emscripten_bind_ExpertEncoder_EncodeToDracoBuffer_2(self,arg0,arg1)});ExpertEncoder.prototype[\"GetNumberOfEncodedPoints\"]=ExpertEncoder.prototype.GetNumberOfEncodedPoints=(function(){var self=this.ptr;return _emscripten_bind_ExpertEncoder_GetNumberOfEncodedPoints_0(self)});ExpertEncoder.prototype[\"GetNumberOfEncodedFaces\"]=ExpertEncoder.prototype.GetNumberOfEncodedFaces=(function(){var self=this.ptr;return _emscripten_bind_ExpertEncoder_GetNumberOfEncodedFaces_0(self)});ExpertEncoder.prototype[\"__destroy__\"]=ExpertEncoder.prototype.__destroy__=(function(){var self=this.ptr;_emscripten_bind_ExpertEncoder___destroy___0(self)});function PointAttribute(){this.ptr=_emscripten_bind_PointAttribute_PointAttribute_0();getCache(PointAttribute)[this.ptr]=this}PointAttribute.prototype=Object.create(WrapperObject.prototype);PointAttribute.prototype.constructor=PointAttribute;PointAttribute.prototype.__class__=PointAttribute;PointAttribute.__cache__={};Module[\"PointAttribute\"]=PointAttribute;PointAttribute.prototype[\"size\"]=PointAttribute.prototype.size=(function(){var self=this.ptr;return _emscripten_bind_PointAttribute_size_0(self)});PointAttribute.prototype[\"attribute_type\"]=PointAttribute.prototype.attribute_type=(function(){var self=this.ptr;return _emscripten_bind_PointAttribute_attribute_type_0(self)});PointAttribute.prototype[\"data_type\"]=PointAttribute.prototype.data_type=(function(){var self=this.ptr;return _emscripten_bind_PointAttribute_data_type_0(self)});PointAttribute.prototype[\"num_components\"]=PointAttribute.prototype.num_components=(function(){var self=this.ptr;return _emscripten_bind_PointAttribute_num_components_0(self)});PointAttribute.prototype[\"normalized\"]=PointAttribute.prototype.normalized=(function(){var self=this.ptr;return!!_emscripten_bind_PointAttribute_normalized_0(self)});PointAttribute.prototype[\"byte_stride\"]=PointAttribute.prototype.byte_stride=(function(){var self=this.ptr;return _emscripten_bind_PointAttribute_byte_stride_0(self)});PointAttribute.prototype[\"byte_offset\"]=PointAttribute.prototype.byte_offset=(function(){var self=this.ptr;return _emscripten_bind_PointAttribute_byte_offset_0(self)});PointAttribute.prototype[\"unique_id\"]=PointAttribute.prototype.unique_id=(function(){var self=this.ptr;return _emscripten_bind_PointAttribute_unique_id_0(self)});PointAttribute.prototype[\"__destroy__\"]=PointAttribute.prototype.__destroy__=(function(){var self=this.ptr;_emscripten_bind_PointAttribute___destroy___0(self)});function Encoder(){this.ptr=_emscripten_bind_Encoder_Encoder_0();getCache(Encoder)[this.ptr]=this}Encoder.prototype=Object.create(WrapperObject.prototype);Encoder.prototype.constructor=Encoder;Encoder.prototype.__class__=Encoder;Encoder.__cache__={};Module[\"Encoder\"]=Encoder;Encoder.prototype[\"SetEncodingMethod\"]=Encoder.prototype.SetEncodingMethod=(function(arg0){var self=this.ptr;if(arg0&&typeof arg0===\"object\")arg0=arg0.ptr;_emscripten_bind_Encoder_SetEncodingMethod_1(self,arg0)});Encoder.prototype[\"SetAttributeQuantization\"]=Encoder.prototype.SetAttributeQuantization=(function(arg0,arg1){var self=this.ptr;if(arg0&&typeof arg0===\"object\")arg0=arg0.ptr;if(arg1&&typeof arg1===\"object\")arg1=arg1.ptr;_emscripten_bind_Encoder_SetAttributeQuantization_2(self,arg0,arg1)});Encoder.prototype[\"SetAttributeExplicitQuantization\"]=Encoder.prototype.SetAttributeExplicitQuantization=(function(arg0,arg1,arg2,arg3,arg4){var self=this.ptr;ensureCache.prepare();if(arg0&&typeof arg0===\"object\")arg0=arg0.ptr;if(arg1&&typeof arg1===\"object\")arg1=arg1.ptr;if(arg2&&typeof arg2===\"object\")arg2=arg2.ptr;if(typeof arg3==\"object\"){arg3=ensureFloat32(arg3)}if(arg4&&typeof arg4===\"object\")arg4=arg4.ptr;_emscripten_bind_Encoder_SetAttributeExplicitQuantization_5(self,arg0,arg1,arg2,arg3,arg4)});Encoder.prototype[\"SetSpeedOptions\"]=Encoder.prototype.SetSpeedOptions=(function(arg0,arg1){var self=this.ptr;if(arg0&&typeof arg0===\"object\")arg0=arg0.ptr;if(arg1&&typeof arg1===\"object\")arg1=arg1.ptr;_emscripten_bind_Encoder_SetSpeedOptions_2(self,arg0,arg1)});Encoder.prototype[\"SetTrackEncodedProperties\"]=Encoder.prototype.SetTrackEncodedProperties=(function(arg0){var self=this.ptr;if(arg0&&typeof arg0===\"object\")arg0=arg0.ptr;_emscripten_bind_Encoder_SetTrackEncodedProperties_1(self,arg0)});Encoder.prototype[\"EncodeMeshToDracoBuffer\"]=Encoder.prototype.EncodeMeshToDracoBuffer=(function(arg0,arg1){var self=this.ptr;if(arg0&&typeof arg0===\"object\")arg0=arg0.ptr;if(arg1&&typeof arg1===\"object\")arg1=arg1.ptr;return _emscripten_bind_Encoder_EncodeMeshToDracoBuffer_2(self,arg0,arg1)});Encoder.prototype[\"EncodePointCloudToDracoBuffer\"]=Encoder.prototype.EncodePointCloudToDracoBuffer=(function(arg0,arg1,arg2){var self=this.ptr;if(arg0&&typeof arg0===\"object\")arg0=arg0.ptr;if(arg1&&typeof arg1===\"object\")arg1=arg1.ptr;if(arg2&&typeof arg2===\"object\")arg2=arg2.ptr;return _emscripten_bind_Encoder_EncodePointCloudToDracoBuffer_3(self,arg0,arg1,arg2)});Encoder.prototype[\"GetNumberOfEncodedPoints\"]=Encoder.prototype.GetNumberOfEncodedPoints=(function(){var self=this.ptr;return _emscripten_bind_Encoder_GetNumberOfEncodedPoints_0(self)});Encoder.prototype[\"GetNumberOfEncodedFaces\"]=Encoder.prototype.GetNumberOfEncodedFaces=(function(){var self=this.ptr;return _emscripten_bind_Encoder_GetNumberOfEncodedFaces_0(self)});Encoder.prototype[\"__destroy__\"]=Encoder.prototype.__destroy__=(function(){var self=this.ptr;_emscripten_bind_Encoder___destroy___0(self)});function MeshBuilder(){this.ptr=_emscripten_bind_MeshBuilder_MeshBuilder_0();getCache(MeshBuilder)[this.ptr]=this}MeshBuilder.prototype=Object.create(WrapperObject.prototype);MeshBuilder.prototype.constructor=MeshBuilder;MeshBuilder.prototype.__class__=MeshBuilder;MeshBuilder.__cache__={};Module[\"MeshBuilder\"]=MeshBuilder;MeshBuilder.prototype[\"AddFacesToMesh\"]=MeshBuilder.prototype.AddFacesToMesh=(function(arg0,arg1,arg2){var self=this.ptr;ensureCache.prepare();if(arg0&&typeof arg0===\"object\")arg0=arg0.ptr;if(arg1&&typeof arg1===\"object\")arg1=arg1.ptr;if(typeof arg2==\"object\"){arg2=ensureInt32(arg2)}return!!_emscripten_bind_MeshBuilder_AddFacesToMesh_3(self,arg0,arg1,arg2)});MeshBuilder.prototype[\"AddFloatAttributeToMesh\"]=MeshBuilder.prototype.AddFloatAttributeToMesh=(function(arg0,arg1,arg2,arg3,arg4){var self=this.ptr;ensureCache.prepare();if(arg0&&typeof arg0===\"object\")arg0=arg0.ptr;if(arg1&&typeof arg1===\"object\")arg1=arg1.ptr;if(arg2&&typeof arg2===\"object\")arg2=arg2.ptr;if(arg3&&typeof arg3===\"object\")arg3=arg3.ptr;if(typeof arg4==\"object\"){arg4=ensureFloat32(arg4)}return _emscripten_bind_MeshBuilder_AddFloatAttributeToMesh_5(self,arg0,arg1,arg2,arg3,arg4)});MeshBuilder.prototype[\"AddInt32AttributeToMesh\"]=MeshBuilder.prototype.AddInt32AttributeToMesh=(function(arg0,arg1,arg2,arg3,arg4){var self=this.ptr;ensureCache.prepare();if(arg0&&typeof arg0===\"object\")arg0=arg0.ptr;if(arg1&&typeof arg1===\"object\")arg1=arg1.ptr;if(arg2&&typeof arg2===\"object\")arg2=arg2.ptr;if(arg3&&typeof arg3===\"object\")arg3=arg3.ptr;if(typeof arg4==\"object\"){arg4=ensureInt32(arg4)}return _emscripten_bind_MeshBuilder_AddInt32AttributeToMesh_5(self,arg0,arg1,arg2,arg3,arg4)});MeshBuilder.prototype[\"AddMetadataToMesh\"]=MeshBuilder.prototype.AddMetadataToMesh=(function(arg0,arg1){var self=this.ptr;if(arg0&&typeof arg0===\"object\")arg0=arg0.ptr;if(arg1&&typeof arg1===\"object\")arg1=arg1.ptr;return!!_emscripten_bind_MeshBuilder_AddMetadataToMesh_2(self,arg0,arg1)});MeshBuilder.prototype[\"AddFloatAttribute\"]=MeshBuilder.prototype.AddFloatAttribute=(function(arg0,arg1,arg2,arg3,arg4){var self=this.ptr;ensureCache.prepare();if(arg0&&typeof arg0===\"object\")arg0=arg0.ptr;if(arg1&&typeof arg1===\"object\")arg1=arg1.ptr;if(arg2&&typeof arg2===\"object\")arg2=arg2.ptr;if(arg3&&typeof arg3===\"object\")arg3=arg3.ptr;if(typeof arg4==\"object\"){arg4=ensureFloat32(arg4)}return _emscripten_bind_MeshBuilder_AddFloatAttribute_5(self,arg0,arg1,arg2,arg3,arg4)});MeshBuilder.prototype[\"AddInt8Attribute\"]=MeshBuilder.prototype.AddInt8Attribute=(function(arg0,arg1,arg2,arg3,arg4){var self=this.ptr;ensureCache.prepare();if(arg0&&typeof arg0===\"object\")arg0=arg0.ptr;if(arg1&&typeof arg1===\"object\")arg1=arg1.ptr;if(arg2&&typeof arg2===\"object\")arg2=arg2.ptr;if(arg3&&typeof arg3===\"object\")arg3=arg3.ptr;if(typeof arg4==\"object\"){arg4=ensureInt8(arg4)}return _emscripten_bind_MeshBuilder_AddInt8Attribute_5(self,arg0,arg1,arg2,arg3,arg4)});MeshBuilder.prototype[\"AddUInt8Attribute\"]=MeshBuilder.prototype.AddUInt8Attribute=(function(arg0,arg1,arg2,arg3,arg4){var self=this.ptr;ensureCache.prepare();if(arg0&&typeof arg0===\"object\")arg0=arg0.ptr;if(arg1&&typeof arg1===\"object\")arg1=arg1.ptr;if(arg2&&typeof arg2===\"object\")arg2=arg2.ptr;if(arg3&&typeof arg3===\"object\")arg3=arg3.ptr;if(typeof arg4==\"object\"){arg4=ensureInt8(arg4)}return _emscripten_bind_MeshBuilder_AddUInt8Attribute_5(self,arg0,arg1,arg2,arg3,arg4)});MeshBuilder.prototype[\"AddInt16Attribute\"]=MeshBuilder.prototype.AddInt16Attribute=(function(arg0,arg1,arg2,arg3,arg4){var self=this.ptr;ensureCache.prepare();if(arg0&&typeof arg0===\"object\")arg0=arg0.ptr;if(arg1&&typeof arg1===\"object\")arg1=arg1.ptr;if(arg2&&typeof arg2===\"object\")arg2=arg2.ptr;if(arg3&&typeof arg3===\"object\")arg3=arg3.ptr;if(typeof arg4==\"object\"){arg4=ensureInt16(arg4)}return _emscripten_bind_MeshBuilder_AddInt16Attribute_5(self,arg0,arg1,arg2,arg3,arg4)});MeshBuilder.prototype[\"AddUInt16Attribute\"]=MeshBuilder.prototype.AddUInt16Attribute=(function(arg0,arg1,arg2,arg3,arg4){var self=this.ptr;ensureCache.prepare();if(arg0&&typeof arg0===\"object\")arg0=arg0.ptr;if(arg1&&typeof arg1===\"object\")arg1=arg1.ptr;if(arg2&&typeof arg2===\"object\")arg2=arg2.ptr;if(arg3&&typeof arg3===\"object\")arg3=arg3.ptr;if(typeof arg4==\"object\"){arg4=ensureInt16(arg4)}return _emscripten_bind_MeshBuilder_AddUInt16Attribute_5(self,arg0,arg1,arg2,arg3,arg4)});MeshBuilder.prototype[\"AddInt32Attribute\"]=MeshBuilder.prototype.AddInt32Attribute=(function(arg0,arg1,arg2,arg3,arg4){var self=this.ptr;ensureCache.prepare();if(arg0&&typeof arg0===\"object\")arg0=arg0.ptr;if(arg1&&typeof arg1===\"object\")arg1=arg1.ptr;if(arg2&&typeof arg2===\"object\")arg2=arg2.ptr;if(arg3&&typeof arg3===\"object\")arg3=arg3.ptr;if(typeof arg4==\"object\"){arg4=ensureInt32(arg4)}return _emscripten_bind_MeshBuilder_AddInt32Attribute_5(self,arg0,arg1,arg2,arg3,arg4)});MeshBuilder.prototype[\"AddUInt32Attribute\"]=MeshBuilder.prototype.AddUInt32Attribute=(function(arg0,arg1,arg2,arg3,arg4){var self=this.ptr;ensureCache.prepare();if(arg0&&typeof arg0===\"object\")arg0=arg0.ptr;if(arg1&&typeof arg1===\"object\")arg1=arg1.ptr;if(arg2&&typeof arg2===\"object\")arg2=arg2.ptr;if(arg3&&typeof arg3===\"object\")arg3=arg3.ptr;if(typeof arg4==\"object\"){arg4=ensureInt32(arg4)}return _emscripten_bind_MeshBuilder_AddUInt32Attribute_5(self,arg0,arg1,arg2,arg3,arg4)});MeshBuilder.prototype[\"AddMetadata\"]=MeshBuilder.prototype.AddMetadata=(function(arg0,arg1){var self=this.ptr;if(arg0&&typeof arg0===\"object\")arg0=arg0.ptr;if(arg1&&typeof arg1===\"object\")arg1=arg1.ptr;return!!_emscripten_bind_MeshBuilder_AddMetadata_2(self,arg0,arg1)});MeshBuilder.prototype[\"SetMetadataForAttribute\"]=MeshBuilder.prototype.SetMetadataForAttribute=(function(arg0,arg1,arg2){var self=this.ptr;if(arg0&&typeof arg0===\"object\")arg0=arg0.ptr;if(arg1&&typeof arg1===\"object\")arg1=arg1.ptr;if(arg2&&typeof arg2===\"object\")arg2=arg2.ptr;return!!_emscripten_bind_MeshBuilder_SetMetadataForAttribute_3(self,arg0,arg1,arg2)});MeshBuilder.prototype[\"__destroy__\"]=MeshBuilder.prototype.__destroy__=(function(){var self=this.ptr;_emscripten_bind_MeshBuilder___destroy___0(self)});function DracoInt8Array(){this.ptr=_emscripten_bind_DracoInt8Array_DracoInt8Array_0();getCache(DracoInt8Array)[this.ptr]=this}DracoInt8Array.prototype=Object.create(WrapperObject.prototype);DracoInt8Array.prototype.constructor=DracoInt8Array;DracoInt8Array.prototype.__class__=DracoInt8Array;DracoInt8Array.__cache__={};Module[\"DracoInt8Array\"]=DracoInt8Array;DracoInt8Array.prototype[\"GetValue\"]=DracoInt8Array.prototype.GetValue=(function(arg0){var self=this.ptr;if(arg0&&typeof arg0===\"object\")arg0=arg0.ptr;return _emscripten_bind_DracoInt8Array_GetValue_1(self,arg0)});DracoInt8Array.prototype[\"size\"]=DracoInt8Array.prototype.size=(function(){var self=this.ptr;return _emscripten_bind_DracoInt8Array_size_0(self)});DracoInt8Array.prototype[\"__destroy__\"]=DracoInt8Array.prototype.__destroy__=(function(){var self=this.ptr;_emscripten_bind_DracoInt8Array___destroy___0(self)});function MetadataBuilder(){this.ptr=_emscripten_bind_MetadataBuilder_MetadataBuilder_0();getCache(MetadataBuilder)[this.ptr]=this}MetadataBuilder.prototype=Object.create(WrapperObject.prototype);MetadataBuilder.prototype.constructor=MetadataBuilder;MetadataBuilder.prototype.__class__=MetadataBuilder;MetadataBuilder.__cache__={};Module[\"MetadataBuilder\"]=MetadataBuilder;MetadataBuilder.prototype[\"AddStringEntry\"]=MetadataBuilder.prototype.AddStringEntry=(function(arg0,arg1,arg2){var self=this.ptr;ensureCache.prepare();if(arg0&&typeof arg0===\"object\")arg0=arg0.ptr;if(arg1&&typeof arg1===\"object\")arg1=arg1.ptr;else arg1=ensureString(arg1);if(arg2&&typeof arg2===\"object\")arg2=arg2.ptr;else arg2=ensureString(arg2);return!!_emscripten_bind_MetadataBuilder_AddStringEntry_3(self,arg0,arg1,arg2)});MetadataBuilder.prototype[\"AddIntEntry\"]=MetadataBuilder.prototype.AddIntEntry=(function(arg0,arg1,arg2){var self=this.ptr;ensureCache.prepare();if(arg0&&typeof arg0===\"object\")arg0=arg0.ptr;if(arg1&&typeof arg1===\"object\")arg1=arg1.ptr;else arg1=ensureString(arg1);if(arg2&&typeof arg2===\"object\")arg2=arg2.ptr;return!!_emscripten_bind_MetadataBuilder_AddIntEntry_3(self,arg0,arg1,arg2)});MetadataBuilder.prototype[\"AddDoubleEntry\"]=MetadataBuilder.prototype.AddDoubleEntry=(function(arg0,arg1,arg2){var self=this.ptr;ensureCache.prepare();if(arg0&&typeof arg0===\"object\")arg0=arg0.ptr;if(arg1&&typeof arg1===\"object\")arg1=arg1.ptr;else arg1=ensureString(arg1);if(arg2&&typeof arg2===\"object\")arg2=arg2.ptr;return!!_emscripten_bind_MetadataBuilder_AddDoubleEntry_3(self,arg0,arg1,arg2)});MetadataBuilder.prototype[\"__destroy__\"]=MetadataBuilder.prototype.__destroy__=(function(){var self=this.ptr;_emscripten_bind_MetadataBuilder___destroy___0(self)});function GeometryAttribute(){this.ptr=_emscripten_bind_GeometryAttribute_GeometryAttribute_0();getCache(GeometryAttribute)[this.ptr]=this}GeometryAttribute.prototype=Object.create(WrapperObject.prototype);GeometryAttribute.prototype.constructor=GeometryAttribute;GeometryAttribute.prototype.__class__=GeometryAttribute;GeometryAttribute.__cache__={};Module[\"GeometryAttribute\"]=GeometryAttribute;GeometryAttribute.prototype[\"__destroy__\"]=GeometryAttribute.prototype.__destroy__=(function(){var self=this.ptr;_emscripten_bind_GeometryAttribute___destroy___0(self)});function Mesh(){this.ptr=_emscripten_bind_Mesh_Mesh_0();getCache(Mesh)[this.ptr]=this}Mesh.prototype=Object.create(WrapperObject.prototype);Mesh.prototype.constructor=Mesh;Mesh.prototype.__class__=Mesh;Mesh.__cache__={};Module[\"Mesh\"]=Mesh;Mesh.prototype[\"num_faces\"]=Mesh.prototype.num_faces=(function(){var self=this.ptr;return _emscripten_bind_Mesh_num_faces_0(self)});Mesh.prototype[\"num_attributes\"]=Mesh.prototype.num_attributes=(function(){var self=this.ptr;return _emscripten_bind_Mesh_num_attributes_0(self)});Mesh.prototype[\"num_points\"]=Mesh.prototype.num_points=(function(){var self=this.ptr;return _emscripten_bind_Mesh_num_points_0(self)});Mesh.prototype[\"set_num_points\"]=Mesh.prototype.set_num_points=(function(arg0){var self=this.ptr;if(arg0&&typeof arg0===\"object\")arg0=arg0.ptr;_emscripten_bind_Mesh_set_num_points_1(self,arg0)});Mesh.prototype[\"__destroy__\"]=Mesh.prototype.__destroy__=(function(){var self=this.ptr;_emscripten_bind_Mesh___destroy___0(self)});function PointCloudBuilder(){this.ptr=_emscripten_bind_PointCloudBuilder_PointCloudBuilder_0();getCache(PointCloudBuilder)[this.ptr]=this}PointCloudBuilder.prototype=Object.create(WrapperObject.prototype);PointCloudBuilder.prototype.constructor=PointCloudBuilder;PointCloudBuilder.prototype.__class__=PointCloudBuilder;PointCloudBuilder.__cache__={};Module[\"PointCloudBuilder\"]=PointCloudBuilder;PointCloudBuilder.prototype[\"AddFloatAttribute\"]=PointCloudBuilder.prototype.AddFloatAttribute=(function(arg0,arg1,arg2,arg3,arg4){var self=this.ptr;ensureCache.prepare();if(arg0&&typeof arg0===\"object\")arg0=arg0.ptr;if(arg1&&typeof arg1===\"object\")arg1=arg1.ptr;if(arg2&&typeof arg2===\"object\")arg2=arg2.ptr;if(arg3&&typeof arg3===\"object\")arg3=arg3.ptr;if(typeof arg4==\"object\"){arg4=ensureFloat32(arg4)}return _emscripten_bind_PointCloudBuilder_AddFloatAttribute_5(self,arg0,arg1,arg2,arg3,arg4)});PointCloudBuilder.prototype[\"AddInt8Attribute\"]=PointCloudBuilder.prototype.AddInt8Attribute=(function(arg0,arg1,arg2,arg3,arg4){var self=this.ptr;ensureCache.prepare();if(arg0&&typeof arg0===\"object\")arg0=arg0.ptr;if(arg1&&typeof arg1===\"object\")arg1=arg1.ptr;if(arg2&&typeof arg2===\"object\")arg2=arg2.ptr;if(arg3&&typeof arg3===\"object\")arg3=arg3.ptr;if(typeof arg4==\"object\"){arg4=ensureInt8(arg4)}return _emscripten_bind_PointCloudBuilder_AddInt8Attribute_5(self,arg0,arg1,arg2,arg3,arg4)});PointCloudBuilder.prototype[\"AddUInt8Attribute\"]=PointCloudBuilder.prototype.AddUInt8Attribute=(function(arg0,arg1,arg2,arg3,arg4){var self=this.ptr;ensureCache.prepare();if(arg0&&typeof arg0===\"object\")arg0=arg0.ptr;if(arg1&&typeof arg1===\"object\")arg1=arg1.ptr;if(arg2&&typeof arg2===\"object\")arg2=arg2.ptr;if(arg3&&typeof arg3===\"object\")arg3=arg3.ptr;if(typeof arg4==\"object\"){arg4=ensureInt8(arg4)}return _emscripten_bind_PointCloudBuilder_AddUInt8Attribute_5(self,arg0,arg1,arg2,arg3,arg4)});PointCloudBuilder.prototype[\"AddInt16Attribute\"]=PointCloudBuilder.prototype.AddInt16Attribute=(function(arg0,arg1,arg2,arg3,arg4){var self=this.ptr;ensureCache.prepare();if(arg0&&typeof arg0===\"object\")arg0=arg0.ptr;if(arg1&&typeof arg1===\"object\")arg1=arg1.ptr;if(arg2&&typeof arg2===\"object\")arg2=arg2.ptr;if(arg3&&typeof arg3===\"object\")arg3=arg3.ptr;if(typeof arg4==\"object\"){arg4=ensureInt16(arg4)}return _emscripten_bind_PointCloudBuilder_AddInt16Attribute_5(self,arg0,arg1,arg2,arg3,arg4)});PointCloudBuilder.prototype[\"AddUInt16Attribute\"]=PointCloudBuilder.prototype.AddUInt16Attribute=(function(arg0,arg1,arg2,arg3,arg4){var self=this.ptr;ensureCache.prepare();if(arg0&&typeof arg0===\"object\")arg0=arg0.ptr;if(arg1&&typeof arg1===\"object\")arg1=arg1.ptr;if(arg2&&typeof arg2===\"object\")arg2=arg2.ptr;if(arg3&&typeof arg3===\"object\")arg3=arg3.ptr;if(typeof arg4==\"object\"){arg4=ensureInt16(arg4)}return _emscripten_bind_PointCloudBuilder_AddUInt16Attribute_5(self,arg0,arg1,arg2,arg3,arg4)});PointCloudBuilder.prototype[\"AddInt32Attribute\"]=PointCloudBuilder.prototype.AddInt32Attribute=(function(arg0,arg1,arg2,arg3,arg4){var self=this.ptr;ensureCache.prepare();if(arg0&&typeof arg0===\"object\")arg0=arg0.ptr;if(arg1&&typeof arg1===\"object\")arg1=arg1.ptr;if(arg2&&typeof arg2===\"object\")arg2=arg2.ptr;if(arg3&&typeof arg3===\"object\")arg3=arg3.ptr;if(typeof arg4==\"object\"){arg4=ensureInt32(arg4)}return _emscripten_bind_PointCloudBuilder_AddInt32Attribute_5(self,arg0,arg1,arg2,arg3,arg4)});PointCloudBuilder.prototype[\"AddUInt32Attribute\"]=PointCloudBuilder.prototype.AddUInt32Attribute=(function(arg0,arg1,arg2,arg3,arg4){var self=this.ptr;ensureCache.prepare();if(arg0&&typeof arg0===\"object\")arg0=arg0.ptr;if(arg1&&typeof arg1===\"object\")arg1=arg1.ptr;if(arg2&&typeof arg2===\"object\")arg2=arg2.ptr;if(arg3&&typeof arg3===\"object\")arg3=arg3.ptr;if(typeof arg4==\"object\"){arg4=ensureInt32(arg4)}return _emscripten_bind_PointCloudBuilder_AddUInt32Attribute_5(self,arg0,arg1,arg2,arg3,arg4)});PointCloudBuilder.prototype[\"AddMetadata\"]=PointCloudBuilder.prototype.AddMetadata=(function(arg0,arg1){var self=this.ptr;if(arg0&&typeof arg0===\"object\")arg0=arg0.ptr;if(arg1&&typeof arg1===\"object\")arg1=arg1.ptr;return!!_emscripten_bind_PointCloudBuilder_AddMetadata_2(self,arg0,arg1)});PointCloudBuilder.prototype[\"SetMetadataForAttribute\"]=PointCloudBuilder.prototype.SetMetadataForAttribute=(function(arg0,arg1,arg2){var self=this.ptr;if(arg0&&typeof arg0===\"object\")arg0=arg0.ptr;if(arg1&&typeof arg1===\"object\")arg1=arg1.ptr;if(arg2&&typeof arg2===\"object\")arg2=arg2.ptr;return!!_emscripten_bind_PointCloudBuilder_SetMetadataForAttribute_3(self,arg0,arg1,arg2)});PointCloudBuilder.prototype[\"__destroy__\"]=PointCloudBuilder.prototype.__destroy__=(function(){var self=this.ptr;_emscripten_bind_PointCloudBuilder___destroy___0(self)});function VoidPtr(){throw\"cannot construct a VoidPtr, no constructor in IDL\"}VoidPtr.prototype=Object.create(WrapperObject.prototype);VoidPtr.prototype.constructor=VoidPtr;VoidPtr.prototype.__class__=VoidPtr;VoidPtr.__cache__={};Module[\"VoidPtr\"]=VoidPtr;VoidPtr.prototype[\"__destroy__\"]=VoidPtr.prototype.__destroy__=(function(){var self=this.ptr;_emscripten_bind_VoidPtr___destroy___0(self)});function Metadata(){this.ptr=_emscripten_bind_Metadata_Metadata_0();getCache(Metadata)[this.ptr]=this}Metadata.prototype=Object.create(WrapperObject.prototype);Metadata.prototype.constructor=Metadata;Metadata.prototype.__class__=Metadata;Metadata.__cache__={};Module[\"Metadata\"]=Metadata;Metadata.prototype[\"__destroy__\"]=Metadata.prototype.__destroy__=(function(){var self=this.ptr;_emscripten_bind_Metadata___destroy___0(self)});((function(){function setupEnums(){Module[\"MESH_SEQUENTIAL_ENCODING\"]=_emscripten_enum_draco_MeshEncoderMethod_MESH_SEQUENTIAL_ENCODING();Module[\"MESH_EDGEBREAKER_ENCODING\"]=_emscripten_enum_draco_MeshEncoderMethod_MESH_EDGEBREAKER_ENCODING();Module[\"INVALID_GEOMETRY_TYPE\"]=_emscripten_enum_draco_EncodedGeometryType_INVALID_GEOMETRY_TYPE();Module[\"POINT_CLOUD\"]=_emscripten_enum_draco_EncodedGeometryType_POINT_CLOUD();Module[\"TRIANGULAR_MESH\"]=_emscripten_enum_draco_EncodedGeometryType_TRIANGULAR_MESH();Module[\"INVALID\"]=_emscripten_enum_draco_GeometryAttribute_Type_INVALID();Module[\"POSITION\"]=_emscripten_enum_draco_GeometryAttribute_Type_POSITION();Module[\"NORMAL\"]=_emscripten_enum_draco_GeometryAttribute_Type_NORMAL();Module[\"COLOR\"]=_emscripten_enum_draco_GeometryAttribute_Type_COLOR();Module[\"TEX_COORD\"]=_emscripten_enum_draco_GeometryAttribute_Type_TEX_COORD();Module[\"GENERIC\"]=_emscripten_enum_draco_GeometryAttribute_Type_GENERIC()}if(Module[\"calledRun\"])setupEnums();else addOnPreMain(setupEnums)}))();if(typeof Module[\"onModuleParsed\"]===\"function\"){Module[\"onModuleParsed\"]()}\n\n\n\n\n\n\n  return DracoEncoderModule;\n};\nif (typeof exports === 'object' && typeof module === 'object')\n  module.exports = DracoEncoderModule;\nelse if (typeof define === 'function' && define['amd'])\n  define([], function() { return DracoEncoderModule; });\nelse if (typeof exports === 'object')\n  exports[\"DracoEncoderModule\"] = DracoEncoderModule;\n"
  },
  {
    "path": "examples/libs/draco/draco_wasm_wrapper.js",
    "content": "var $jscomp=$jscomp||{};$jscomp.scope={};$jscomp.arrayIteratorImpl=function(k){var n=0;return function(){return n<k.length?{done:!1,value:k[n++]}:{done:!0}}};$jscomp.arrayIterator=function(k){return{next:$jscomp.arrayIteratorImpl(k)}};$jscomp.makeIterator=function(k){var n=\"undefined\"!=typeof Symbol&&Symbol.iterator&&k[Symbol.iterator];return n?n.call(k):$jscomp.arrayIterator(k)};$jscomp.ASSUME_ES5=!1;$jscomp.ASSUME_NO_NATIVE_MAP=!1;$jscomp.ASSUME_NO_NATIVE_SET=!1;$jscomp.SIMPLE_FROUND_POLYFILL=!1;\n$jscomp.ISOLATE_POLYFILLS=!1;$jscomp.FORCE_POLYFILL_PROMISE=!1;$jscomp.FORCE_POLYFILL_PROMISE_WHEN_NO_UNHANDLED_REJECTION=!1;$jscomp.getGlobal=function(k){k=[\"object\"==typeof globalThis&&globalThis,k,\"object\"==typeof window&&window,\"object\"==typeof self&&self,\"object\"==typeof global&&global];for(var n=0;n<k.length;++n){var l=k[n];if(l&&l.Math==Math)return l}throw Error(\"Cannot find global object\");};$jscomp.global=$jscomp.getGlobal(this);\n$jscomp.defineProperty=$jscomp.ASSUME_ES5||\"function\"==typeof Object.defineProperties?Object.defineProperty:function(k,n,l){if(k==Array.prototype||k==Object.prototype)return k;k[n]=l.value;return k};$jscomp.IS_SYMBOL_NATIVE=\"function\"===typeof Symbol&&\"symbol\"===typeof Symbol(\"x\");$jscomp.TRUST_ES6_POLYFILLS=!$jscomp.ISOLATE_POLYFILLS||$jscomp.IS_SYMBOL_NATIVE;$jscomp.polyfills={};$jscomp.propertyToPolyfillSymbol={};$jscomp.POLYFILL_PREFIX=\"$jscp$\";\nvar $jscomp$lookupPolyfilledValue=function(k,n){var l=$jscomp.propertyToPolyfillSymbol[n];if(null==l)return k[n];l=k[l];return void 0!==l?l:k[n]};$jscomp.polyfill=function(k,n,l,p){n&&($jscomp.ISOLATE_POLYFILLS?$jscomp.polyfillIsolated(k,n,l,p):$jscomp.polyfillUnisolated(k,n,l,p))};\n$jscomp.polyfillUnisolated=function(k,n,l,p){l=$jscomp.global;k=k.split(\".\");for(p=0;p<k.length-1;p++){var h=k[p];if(!(h in l))return;l=l[h]}k=k[k.length-1];p=l[k];n=n(p);n!=p&&null!=n&&$jscomp.defineProperty(l,k,{configurable:!0,writable:!0,value:n})};\n$jscomp.polyfillIsolated=function(k,n,l,p){var h=k.split(\".\");k=1===h.length;p=h[0];p=!k&&p in $jscomp.polyfills?$jscomp.polyfills:$jscomp.global;for(var A=0;A<h.length-1;A++){var f=h[A];if(!(f in p))return;p=p[f]}h=h[h.length-1];l=$jscomp.IS_SYMBOL_NATIVE&&\"es6\"===l?p[h]:null;n=n(l);null!=n&&(k?$jscomp.defineProperty($jscomp.polyfills,h,{configurable:!0,writable:!0,value:n}):n!==l&&(void 0===$jscomp.propertyToPolyfillSymbol[h]&&(l=1E9*Math.random()>>>0,$jscomp.propertyToPolyfillSymbol[h]=$jscomp.IS_SYMBOL_NATIVE?\n$jscomp.global.Symbol(h):$jscomp.POLYFILL_PREFIX+l+\"$\"+h),$jscomp.defineProperty(p,$jscomp.propertyToPolyfillSymbol[h],{configurable:!0,writable:!0,value:n})))};\n$jscomp.polyfill(\"Promise\",function(k){function n(){this.batch_=null}function l(f){return f instanceof h?f:new h(function(q,v){q(f)})}if(k&&(!($jscomp.FORCE_POLYFILL_PROMISE||$jscomp.FORCE_POLYFILL_PROMISE_WHEN_NO_UNHANDLED_REJECTION&&\"undefined\"===typeof $jscomp.global.PromiseRejectionEvent)||!$jscomp.global.Promise||-1===$jscomp.global.Promise.toString().indexOf(\"[native code]\")))return k;n.prototype.asyncExecute=function(f){if(null==this.batch_){this.batch_=[];var q=this;this.asyncExecuteFunction(function(){q.executeBatch_()})}this.batch_.push(f)};\nvar p=$jscomp.global.setTimeout;n.prototype.asyncExecuteFunction=function(f){p(f,0)};n.prototype.executeBatch_=function(){for(;this.batch_&&this.batch_.length;){var f=this.batch_;this.batch_=[];for(var q=0;q<f.length;++q){var v=f[q];f[q]=null;try{v()}catch(z){this.asyncThrow_(z)}}}this.batch_=null};n.prototype.asyncThrow_=function(f){this.asyncExecuteFunction(function(){throw f;})};var h=function(f){this.state_=0;this.result_=void 0;this.onSettledCallbacks_=[];this.isRejectionHandled_=!1;var q=this.createResolveAndReject_();\ntry{f(q.resolve,q.reject)}catch(v){q.reject(v)}};h.prototype.createResolveAndReject_=function(){function f(z){return function(O){v||(v=!0,z.call(q,O))}}var q=this,v=!1;return{resolve:f(this.resolveTo_),reject:f(this.reject_)}};h.prototype.resolveTo_=function(f){if(f===this)this.reject_(new TypeError(\"A Promise cannot resolve to itself\"));else if(f instanceof h)this.settleSameAsPromise_(f);else{a:switch(typeof f){case \"object\":var q=null!=f;break a;case \"function\":q=!0;break a;default:q=!1}q?this.resolveToNonPromiseObj_(f):\nthis.fulfill_(f)}};h.prototype.resolveToNonPromiseObj_=function(f){var q=void 0;try{q=f.then}catch(v){this.reject_(v);return}\"function\"==typeof q?this.settleSameAsThenable_(q,f):this.fulfill_(f)};h.prototype.reject_=function(f){this.settle_(2,f)};h.prototype.fulfill_=function(f){this.settle_(1,f)};h.prototype.settle_=function(f,q){if(0!=this.state_)throw Error(\"Cannot settle(\"+f+\", \"+q+\"): Promise already settled in state\"+this.state_);this.state_=f;this.result_=q;2===this.state_&&this.scheduleUnhandledRejectionCheck_();\nthis.executeOnSettledCallbacks_()};h.prototype.scheduleUnhandledRejectionCheck_=function(){var f=this;p(function(){if(f.notifyUnhandledRejection_()){var q=$jscomp.global.console;\"undefined\"!==typeof q&&q.error(f.result_)}},1)};h.prototype.notifyUnhandledRejection_=function(){if(this.isRejectionHandled_)return!1;var f=$jscomp.global.CustomEvent,q=$jscomp.global.Event,v=$jscomp.global.dispatchEvent;if(\"undefined\"===typeof v)return!0;\"function\"===typeof f?f=new f(\"unhandledrejection\",{cancelable:!0}):\n\"function\"===typeof q?f=new q(\"unhandledrejection\",{cancelable:!0}):(f=$jscomp.global.document.createEvent(\"CustomEvent\"),f.initCustomEvent(\"unhandledrejection\",!1,!0,f));f.promise=this;f.reason=this.result_;return v(f)};h.prototype.executeOnSettledCallbacks_=function(){if(null!=this.onSettledCallbacks_){for(var f=0;f<this.onSettledCallbacks_.length;++f)A.asyncExecute(this.onSettledCallbacks_[f]);this.onSettledCallbacks_=null}};var A=new n;h.prototype.settleSameAsPromise_=function(f){var q=this.createResolveAndReject_();\nf.callWhenSettled_(q.resolve,q.reject)};h.prototype.settleSameAsThenable_=function(f,q){var v=this.createResolveAndReject_();try{f.call(q,v.resolve,v.reject)}catch(z){v.reject(z)}};h.prototype.then=function(f,q){function v(t,x){return\"function\"==typeof t?function(D){try{z(t(D))}catch(R){O(R)}}:x}var z,O,ba=new h(function(t,x){z=t;O=x});this.callWhenSettled_(v(f,z),v(q,O));return ba};h.prototype.catch=function(f){return this.then(void 0,f)};h.prototype.callWhenSettled_=function(f,q){function v(){switch(z.state_){case 1:f(z.result_);\nbreak;case 2:q(z.result_);break;default:throw Error(\"Unexpected state: \"+z.state_);}}var z=this;null==this.onSettledCallbacks_?A.asyncExecute(v):this.onSettledCallbacks_.push(v);this.isRejectionHandled_=!0};h.resolve=l;h.reject=function(f){return new h(function(q,v){v(f)})};h.race=function(f){return new h(function(q,v){for(var z=$jscomp.makeIterator(f),O=z.next();!O.done;O=z.next())l(O.value).callWhenSettled_(q,v)})};h.all=function(f){var q=$jscomp.makeIterator(f),v=q.next();return v.done?l([]):new h(function(z,\nO){function ba(D){return function(R){t[D]=R;x--;0==x&&z(t)}}var t=[],x=0;do t.push(void 0),x++,l(v.value).callWhenSettled_(ba(t.length-1),O),v=q.next();while(!v.done)})};return h},\"es6\",\"es3\");$jscomp.owns=function(k,n){return Object.prototype.hasOwnProperty.call(k,n)};$jscomp.assign=$jscomp.TRUST_ES6_POLYFILLS&&\"function\"==typeof Object.assign?Object.assign:function(k,n){for(var l=1;l<arguments.length;l++){var p=arguments[l];if(p)for(var h in p)$jscomp.owns(p,h)&&(k[h]=p[h])}return k};\n$jscomp.polyfill(\"Object.assign\",function(k){return k||$jscomp.assign},\"es6\",\"es3\");$jscomp.checkStringArgs=function(k,n,l){if(null==k)throw new TypeError(\"The 'this' value for String.prototype.\"+l+\" must not be null or undefined\");if(n instanceof RegExp)throw new TypeError(\"First argument to String.prototype.\"+l+\" must not be a regular expression\");return k+\"\"};\n$jscomp.polyfill(\"String.prototype.startsWith\",function(k){return k?k:function(n,l){var p=$jscomp.checkStringArgs(this,n,\"startsWith\");n+=\"\";var h=p.length,A=n.length;l=Math.max(0,Math.min(l|0,p.length));for(var f=0;f<A&&l<h;)if(p[l++]!=n[f++])return!1;return f>=A}},\"es6\",\"es3\");\n$jscomp.polyfill(\"Array.prototype.copyWithin\",function(k){function n(l){l=Number(l);return Infinity===l||-Infinity===l?l:l|0}return k?k:function(l,p,h){var A=this.length;l=n(l);p=n(p);h=void 0===h?A:n(h);l=0>l?Math.max(A+l,0):Math.min(l,A);p=0>p?Math.max(A+p,0):Math.min(p,A);h=0>h?Math.max(A+h,0):Math.min(h,A);if(l<p)for(;p<h;)p in this?this[l++]=this[p++]:(delete this[l++],p++);else for(h=Math.min(h,A+p-l),l+=h-p;h>p;)--h in this?this[--l]=this[h]:delete this[--l];return this}},\"es6\",\"es3\");\n$jscomp.typedArrayCopyWithin=function(k){return k?k:Array.prototype.copyWithin};$jscomp.polyfill(\"Int8Array.prototype.copyWithin\",$jscomp.typedArrayCopyWithin,\"es6\",\"es5\");$jscomp.polyfill(\"Uint8Array.prototype.copyWithin\",$jscomp.typedArrayCopyWithin,\"es6\",\"es5\");$jscomp.polyfill(\"Uint8ClampedArray.prototype.copyWithin\",$jscomp.typedArrayCopyWithin,\"es6\",\"es5\");$jscomp.polyfill(\"Int16Array.prototype.copyWithin\",$jscomp.typedArrayCopyWithin,\"es6\",\"es5\");\n$jscomp.polyfill(\"Uint16Array.prototype.copyWithin\",$jscomp.typedArrayCopyWithin,\"es6\",\"es5\");$jscomp.polyfill(\"Int32Array.prototype.copyWithin\",$jscomp.typedArrayCopyWithin,\"es6\",\"es5\");$jscomp.polyfill(\"Uint32Array.prototype.copyWithin\",$jscomp.typedArrayCopyWithin,\"es6\",\"es5\");$jscomp.polyfill(\"Float32Array.prototype.copyWithin\",$jscomp.typedArrayCopyWithin,\"es6\",\"es5\");$jscomp.polyfill(\"Float64Array.prototype.copyWithin\",$jscomp.typedArrayCopyWithin,\"es6\",\"es5\");\nvar DracoDecoderModule=function(){var k=\"undefined\"!==typeof document&&document.currentScript?document.currentScript.src:void 0;\"undefined\"!==typeof __filename&&(k=k||__filename);return function(n){function l(e){return a.locateFile?a.locateFile(e,U):U+e}function p(e,b,c){var d=b+c;for(c=b;e[c]&&!(c>=d);)++c;if(16<c-b&&e.buffer&&va)return va.decode(e.subarray(b,c));for(d=\"\";b<c;){var g=e[b++];if(g&128){var u=e[b++]&63;if(192==(g&224))d+=String.fromCharCode((g&31)<<6|u);else{var X=e[b++]&63;g=224==\n(g&240)?(g&15)<<12|u<<6|X:(g&7)<<18|u<<12|X<<6|e[b++]&63;65536>g?d+=String.fromCharCode(g):(g-=65536,d+=String.fromCharCode(55296|g>>10,56320|g&1023))}}else d+=String.fromCharCode(g)}return d}function h(e,b){return e?p(ea,e,b):\"\"}function A(){var e=ja.buffer;a.HEAP8=Y=new Int8Array(e);a.HEAP16=new Int16Array(e);a.HEAP32=ca=new Int32Array(e);a.HEAPU8=ea=new Uint8Array(e);a.HEAPU16=new Uint16Array(e);a.HEAPU32=V=new Uint32Array(e);a.HEAPF32=new Float32Array(e);a.HEAPF64=new Float64Array(e)}function f(e){if(a.onAbort)a.onAbort(e);\ne=\"Aborted(\"+e+\")\";da(e);wa=!0;e=new WebAssembly.RuntimeError(e+\". Build with -sASSERTIONS for more info.\");ka(e);throw e;}function q(e){try{if(e==P&&fa)return new Uint8Array(fa);if(ma)return ma(e);throw\"both async and sync fetching of the wasm failed\";}catch(b){f(b)}}function v(){if(!fa&&(xa||ha)){if(\"function\"==typeof fetch&&!P.startsWith(\"file://\"))return fetch(P,{credentials:\"same-origin\"}).then(function(e){if(!e.ok)throw\"failed to load wasm binary file at '\"+P+\"'\";return e.arrayBuffer()}).catch(function(){return q(P)});\nif(na)return new Promise(function(e,b){na(P,function(c){e(new Uint8Array(c))},b)})}return Promise.resolve().then(function(){return q(P)})}function z(e){for(;0<e.length;)e.shift()(a)}function O(e){this.excPtr=e;this.ptr=e-24;this.set_type=function(b){V[this.ptr+4>>2]=b};this.get_type=function(){return V[this.ptr+4>>2]};this.set_destructor=function(b){V[this.ptr+8>>2]=b};this.get_destructor=function(){return V[this.ptr+8>>2]};this.set_refcount=function(b){ca[this.ptr>>2]=b};this.set_caught=function(b){Y[this.ptr+\n12>>0]=b?1:0};this.get_caught=function(){return 0!=Y[this.ptr+12>>0]};this.set_rethrown=function(b){Y[this.ptr+13>>0]=b?1:0};this.get_rethrown=function(){return 0!=Y[this.ptr+13>>0]};this.init=function(b,c){this.set_adjusted_ptr(0);this.set_type(b);this.set_destructor(c);this.set_refcount(0);this.set_caught(!1);this.set_rethrown(!1)};this.add_ref=function(){ca[this.ptr>>2]+=1};this.release_ref=function(){var b=ca[this.ptr>>2];ca[this.ptr>>2]=b-1;return 1===b};this.set_adjusted_ptr=function(b){V[this.ptr+\n16>>2]=b};this.get_adjusted_ptr=function(){return V[this.ptr+16>>2]};this.get_exception_ptr=function(){if(ya(this.get_type()))return V[this.excPtr>>2];var b=this.get_adjusted_ptr();return 0!==b?b:this.excPtr}}function ba(){function e(){if(!la&&(la=!0,a.calledRun=!0,!wa)){za=!0;z(oa);Aa(a);if(a.onRuntimeInitialized)a.onRuntimeInitialized();if(a.postRun)for(\"function\"==typeof a.postRun&&(a.postRun=[a.postRun]);a.postRun.length;)Ba.unshift(a.postRun.shift());z(Ba)}}if(!(0<aa)){if(a.preRun)for(\"function\"==\ntypeof a.preRun&&(a.preRun=[a.preRun]);a.preRun.length;)Ca.unshift(a.preRun.shift());z(Ca);0<aa||(a.setStatus?(a.setStatus(\"Running...\"),setTimeout(function(){setTimeout(function(){a.setStatus(\"\")},1);e()},1)):e())}}function t(){}function x(e){return(e||t).__cache__}function D(e,b){var c=x(b),d=c[e];if(d)return d;d=Object.create((b||t).prototype);d.ptr=e;return c[e]=d}function R(e){if(\"string\"===typeof e){for(var b=0,c=0;c<e.length;++c){var d=e.charCodeAt(c);127>=d?b++:2047>=d?b+=2:55296<=d&&57343>=\nd?(b+=4,++c):b+=3}b=Array(b+1);c=0;d=b.length;if(0<d){d=c+d-1;for(var g=0;g<e.length;++g){var u=e.charCodeAt(g);if(55296<=u&&57343>=u){var X=e.charCodeAt(++g);u=65536+((u&1023)<<10)|X&1023}if(127>=u){if(c>=d)break;b[c++]=u}else{if(2047>=u){if(c+1>=d)break;b[c++]=192|u>>6}else{if(65535>=u){if(c+2>=d)break;b[c++]=224|u>>12}else{if(c+3>=d)break;b[c++]=240|u>>18;b[c++]=128|u>>12&63}b[c++]=128|u>>6&63}b[c++]=128|u&63}}b[c]=0}e=r.alloc(b,Y);r.copy(b,Y,e);return e}return e}function pa(e){if(\"object\"===typeof e){var b=\nr.alloc(e,Y);r.copy(e,Y,b);return b}return e}function Z(){throw\"cannot construct a VoidPtr, no constructor in IDL\";}function S(){this.ptr=Da();x(S)[this.ptr]=this}function Q(){this.ptr=Ea();x(Q)[this.ptr]=this}function W(){this.ptr=Fa();x(W)[this.ptr]=this}function w(){this.ptr=Ga();x(w)[this.ptr]=this}function C(){this.ptr=Ha();x(C)[this.ptr]=this}function F(){this.ptr=Ia();x(F)[this.ptr]=this}function G(){this.ptr=Ja();x(G)[this.ptr]=this}function E(){this.ptr=Ka();x(E)[this.ptr]=this}function T(){this.ptr=\nLa();x(T)[this.ptr]=this}function B(){throw\"cannot construct a Status, no constructor in IDL\";}function H(){this.ptr=Ma();x(H)[this.ptr]=this}function I(){this.ptr=Na();x(I)[this.ptr]=this}function J(){this.ptr=Oa();x(J)[this.ptr]=this}function K(){this.ptr=Pa();x(K)[this.ptr]=this}function L(){this.ptr=Qa();x(L)[this.ptr]=this}function M(){this.ptr=Ra();x(M)[this.ptr]=this}function N(){this.ptr=Sa();x(N)[this.ptr]=this}function y(){this.ptr=Ta();x(y)[this.ptr]=this}function m(){this.ptr=Ua();x(m)[this.ptr]=\nthis}n=void 0===n?{}:n;var a=\"undefined\"!=typeof n?n:{},Aa,ka;a.ready=new Promise(function(e,b){Aa=e;ka=b});var Va=!1,Wa=!1;a.onRuntimeInitialized=function(){Va=!0;if(Wa&&\"function\"===typeof a.onModuleLoaded)a.onModuleLoaded(a)};a.onModuleParsed=function(){Wa=!0;if(Va&&\"function\"===typeof a.onModuleLoaded)a.onModuleLoaded(a)};a.isVersionSupported=function(e){if(\"string\"!==typeof e)return!1;e=e.split(\".\");return 2>e.length||3<e.length?!1:1==e[0]&&0<=e[1]&&5>=e[1]?!0:0!=e[0]||10<e[1]?!1:!0};var Xa=\nObject.assign({},a),xa=\"object\"==typeof window,ha=\"function\"==typeof importScripts,Ya=\"object\"==typeof process&&\"object\"==typeof process.versions&&\"string\"==typeof process.versions.node,U=\"\";if(Ya){var Za=require(\"fs\"),qa=require(\"path\");U=ha?qa.dirname(U)+\"/\":__dirname+\"/\";var $a=function(e,b){e=e.startsWith(\"file://\")?new URL(e):qa.normalize(e);return Za.readFileSync(e,b?void 0:\"utf8\")};var ma=function(e){e=$a(e,!0);e.buffer||(e=new Uint8Array(e));return e};var na=function(e,b,c){e=e.startsWith(\"file://\")?\nnew URL(e):qa.normalize(e);Za.readFile(e,function(d,g){d?c(d):b(g.buffer)})};1<process.argv.length&&process.argv[1].replace(/\\\\/g,\"/\");process.argv.slice(2);a.inspect=function(){return\"[Emscripten Module object]\"}}else if(xa||ha)ha?U=self.location.href:\"undefined\"!=typeof document&&document.currentScript&&(U=document.currentScript.src),k&&(U=k),U=0!==U.indexOf(\"blob:\")?U.substr(0,U.replace(/[?#].*/,\"\").lastIndexOf(\"/\")+1):\"\",$a=function(e){var b=new XMLHttpRequest;b.open(\"GET\",e,!1);b.send(null);\nreturn b.responseText},ha&&(ma=function(e){var b=new XMLHttpRequest;b.open(\"GET\",e,!1);b.responseType=\"arraybuffer\";b.send(null);return new Uint8Array(b.response)}),na=function(e,b,c){var d=new XMLHttpRequest;d.open(\"GET\",e,!0);d.responseType=\"arraybuffer\";d.onload=function(){200==d.status||0==d.status&&d.response?b(d.response):c()};d.onerror=c;d.send(null)};var ud=a.print||console.log.bind(console),da=a.printErr||console.warn.bind(console);Object.assign(a,Xa);Xa=null;var fa;a.wasmBinary&&(fa=a.wasmBinary);\n\"object\"!=typeof WebAssembly&&f(\"no native wasm support detected\");var ja,wa=!1,va=\"undefined\"!=typeof TextDecoder?new TextDecoder(\"utf8\"):void 0,Y,ea,ca,V,Ca=[],oa=[],Ba=[],za=!1,aa=0,ra=null,ia=null;var P=\"draco_decoder.wasm\";P.startsWith(\"data:application/octet-stream;base64,\")||(P=l(P));var vd=0,wd=[null,[],[]],xd={b:function(e,b,c){(new O(e)).init(b,c);vd++;throw e;},a:function(){f(\"\")},g:function(e,b,c){ea.copyWithin(e,b,b+c)},e:function(e){var b=ea.length;e>>>=0;if(2147483648<e)return!1;for(var c=\n1;4>=c;c*=2){var d=b*(1+.2/c);d=Math.min(d,e+100663296);var g=Math;d=Math.max(e,d);g=g.min.call(g,2147483648,d+(65536-d%65536)%65536);a:{d=ja.buffer;try{ja.grow(g-d.byteLength+65535>>>16);A();var u=1;break a}catch(X){}u=void 0}if(u)return!0}return!1},f:function(e){return 52},d:function(e,b,c,d,g){return 70},c:function(e,b,c,d){for(var g=0,u=0;u<c;u++){var X=V[b>>2],ab=V[b+4>>2];b+=8;for(var sa=0;sa<ab;sa++){var ta=ea[X+sa],ua=wd[e];0===ta||10===ta?((1===e?ud:da)(p(ua,0)),ua.length=0):ua.push(ta)}g+=\nab}V[d>>2]=g;return 0}};(function(){function e(g,u){a.asm=g.exports;ja=a.asm.h;A();oa.unshift(a.asm.i);aa--;a.monitorRunDependencies&&a.monitorRunDependencies(aa);0==aa&&(null!==ra&&(clearInterval(ra),ra=null),ia&&(g=ia,ia=null,g()))}function b(g){e(g.instance)}function c(g){return v().then(function(u){return WebAssembly.instantiate(u,d)}).then(function(u){return u}).then(g,function(u){da(\"failed to asynchronously prepare wasm: \"+u);f(u)})}var d={a:xd};aa++;a.monitorRunDependencies&&a.monitorRunDependencies(aa);\nif(a.instantiateWasm)try{return a.instantiateWasm(d,e)}catch(g){da(\"Module.instantiateWasm callback failed with error: \"+g),ka(g)}(function(){return fa||\"function\"!=typeof WebAssembly.instantiateStreaming||P.startsWith(\"data:application/octet-stream;base64,\")||P.startsWith(\"file://\")||Ya||\"function\"!=typeof fetch?c(b):fetch(P,{credentials:\"same-origin\"}).then(function(g){return WebAssembly.instantiateStreaming(g,d).then(b,function(u){da(\"wasm streaming compile failed: \"+u);da(\"falling back to ArrayBuffer instantiation\");\nreturn c(b)})})})().catch(ka);return{}})();var bb=a._emscripten_bind_VoidPtr___destroy___0=function(){return(bb=a._emscripten_bind_VoidPtr___destroy___0=a.asm.k).apply(null,arguments)},Da=a._emscripten_bind_DecoderBuffer_DecoderBuffer_0=function(){return(Da=a._emscripten_bind_DecoderBuffer_DecoderBuffer_0=a.asm.l).apply(null,arguments)},cb=a._emscripten_bind_DecoderBuffer_Init_2=function(){return(cb=a._emscripten_bind_DecoderBuffer_Init_2=a.asm.m).apply(null,arguments)},db=a._emscripten_bind_DecoderBuffer___destroy___0=\nfunction(){return(db=a._emscripten_bind_DecoderBuffer___destroy___0=a.asm.n).apply(null,arguments)},Ea=a._emscripten_bind_AttributeTransformData_AttributeTransformData_0=function(){return(Ea=a._emscripten_bind_AttributeTransformData_AttributeTransformData_0=a.asm.o).apply(null,arguments)},eb=a._emscripten_bind_AttributeTransformData_transform_type_0=function(){return(eb=a._emscripten_bind_AttributeTransformData_transform_type_0=a.asm.p).apply(null,arguments)},fb=a._emscripten_bind_AttributeTransformData___destroy___0=\nfunction(){return(fb=a._emscripten_bind_AttributeTransformData___destroy___0=a.asm.q).apply(null,arguments)},Fa=a._emscripten_bind_GeometryAttribute_GeometryAttribute_0=function(){return(Fa=a._emscripten_bind_GeometryAttribute_GeometryAttribute_0=a.asm.r).apply(null,arguments)},gb=a._emscripten_bind_GeometryAttribute___destroy___0=function(){return(gb=a._emscripten_bind_GeometryAttribute___destroy___0=a.asm.s).apply(null,arguments)},Ga=a._emscripten_bind_PointAttribute_PointAttribute_0=function(){return(Ga=\na._emscripten_bind_PointAttribute_PointAttribute_0=a.asm.t).apply(null,arguments)},hb=a._emscripten_bind_PointAttribute_size_0=function(){return(hb=a._emscripten_bind_PointAttribute_size_0=a.asm.u).apply(null,arguments)},ib=a._emscripten_bind_PointAttribute_GetAttributeTransformData_0=function(){return(ib=a._emscripten_bind_PointAttribute_GetAttributeTransformData_0=a.asm.v).apply(null,arguments)},jb=a._emscripten_bind_PointAttribute_attribute_type_0=function(){return(jb=a._emscripten_bind_PointAttribute_attribute_type_0=\na.asm.w).apply(null,arguments)},kb=a._emscripten_bind_PointAttribute_data_type_0=function(){return(kb=a._emscripten_bind_PointAttribute_data_type_0=a.asm.x).apply(null,arguments)},lb=a._emscripten_bind_PointAttribute_num_components_0=function(){return(lb=a._emscripten_bind_PointAttribute_num_components_0=a.asm.y).apply(null,arguments)},mb=a._emscripten_bind_PointAttribute_normalized_0=function(){return(mb=a._emscripten_bind_PointAttribute_normalized_0=a.asm.z).apply(null,arguments)},nb=a._emscripten_bind_PointAttribute_byte_stride_0=\nfunction(){return(nb=a._emscripten_bind_PointAttribute_byte_stride_0=a.asm.A).apply(null,arguments)},ob=a._emscripten_bind_PointAttribute_byte_offset_0=function(){return(ob=a._emscripten_bind_PointAttribute_byte_offset_0=a.asm.B).apply(null,arguments)},pb=a._emscripten_bind_PointAttribute_unique_id_0=function(){return(pb=a._emscripten_bind_PointAttribute_unique_id_0=a.asm.C).apply(null,arguments)},qb=a._emscripten_bind_PointAttribute___destroy___0=function(){return(qb=a._emscripten_bind_PointAttribute___destroy___0=\na.asm.D).apply(null,arguments)},Ha=a._emscripten_bind_AttributeQuantizationTransform_AttributeQuantizationTransform_0=function(){return(Ha=a._emscripten_bind_AttributeQuantizationTransform_AttributeQuantizationTransform_0=a.asm.E).apply(null,arguments)},rb=a._emscripten_bind_AttributeQuantizationTransform_InitFromAttribute_1=function(){return(rb=a._emscripten_bind_AttributeQuantizationTransform_InitFromAttribute_1=a.asm.F).apply(null,arguments)},sb=a._emscripten_bind_AttributeQuantizationTransform_quantization_bits_0=\nfunction(){return(sb=a._emscripten_bind_AttributeQuantizationTransform_quantization_bits_0=a.asm.G).apply(null,arguments)},tb=a._emscripten_bind_AttributeQuantizationTransform_min_value_1=function(){return(tb=a._emscripten_bind_AttributeQuantizationTransform_min_value_1=a.asm.H).apply(null,arguments)},ub=a._emscripten_bind_AttributeQuantizationTransform_range_0=function(){return(ub=a._emscripten_bind_AttributeQuantizationTransform_range_0=a.asm.I).apply(null,arguments)},vb=a._emscripten_bind_AttributeQuantizationTransform___destroy___0=\nfunction(){return(vb=a._emscripten_bind_AttributeQuantizationTransform___destroy___0=a.asm.J).apply(null,arguments)},Ia=a._emscripten_bind_AttributeOctahedronTransform_AttributeOctahedronTransform_0=function(){return(Ia=a._emscripten_bind_AttributeOctahedronTransform_AttributeOctahedronTransform_0=a.asm.K).apply(null,arguments)},wb=a._emscripten_bind_AttributeOctahedronTransform_InitFromAttribute_1=function(){return(wb=a._emscripten_bind_AttributeOctahedronTransform_InitFromAttribute_1=a.asm.L).apply(null,\narguments)},xb=a._emscripten_bind_AttributeOctahedronTransform_quantization_bits_0=function(){return(xb=a._emscripten_bind_AttributeOctahedronTransform_quantization_bits_0=a.asm.M).apply(null,arguments)},yb=a._emscripten_bind_AttributeOctahedronTransform___destroy___0=function(){return(yb=a._emscripten_bind_AttributeOctahedronTransform___destroy___0=a.asm.N).apply(null,arguments)},Ja=a._emscripten_bind_PointCloud_PointCloud_0=function(){return(Ja=a._emscripten_bind_PointCloud_PointCloud_0=a.asm.O).apply(null,\narguments)},zb=a._emscripten_bind_PointCloud_num_attributes_0=function(){return(zb=a._emscripten_bind_PointCloud_num_attributes_0=a.asm.P).apply(null,arguments)},Ab=a._emscripten_bind_PointCloud_num_points_0=function(){return(Ab=a._emscripten_bind_PointCloud_num_points_0=a.asm.Q).apply(null,arguments)},Bb=a._emscripten_bind_PointCloud___destroy___0=function(){return(Bb=a._emscripten_bind_PointCloud___destroy___0=a.asm.R).apply(null,arguments)},Ka=a._emscripten_bind_Mesh_Mesh_0=function(){return(Ka=\na._emscripten_bind_Mesh_Mesh_0=a.asm.S).apply(null,arguments)},Cb=a._emscripten_bind_Mesh_num_faces_0=function(){return(Cb=a._emscripten_bind_Mesh_num_faces_0=a.asm.T).apply(null,arguments)},Db=a._emscripten_bind_Mesh_num_attributes_0=function(){return(Db=a._emscripten_bind_Mesh_num_attributes_0=a.asm.U).apply(null,arguments)},Eb=a._emscripten_bind_Mesh_num_points_0=function(){return(Eb=a._emscripten_bind_Mesh_num_points_0=a.asm.V).apply(null,arguments)},Fb=a._emscripten_bind_Mesh___destroy___0=function(){return(Fb=\na._emscripten_bind_Mesh___destroy___0=a.asm.W).apply(null,arguments)},La=a._emscripten_bind_Metadata_Metadata_0=function(){return(La=a._emscripten_bind_Metadata_Metadata_0=a.asm.X).apply(null,arguments)},Gb=a._emscripten_bind_Metadata___destroy___0=function(){return(Gb=a._emscripten_bind_Metadata___destroy___0=a.asm.Y).apply(null,arguments)},Hb=a._emscripten_bind_Status_code_0=function(){return(Hb=a._emscripten_bind_Status_code_0=a.asm.Z).apply(null,arguments)},Ib=a._emscripten_bind_Status_ok_0=function(){return(Ib=\na._emscripten_bind_Status_ok_0=a.asm._).apply(null,arguments)},Jb=a._emscripten_bind_Status_error_msg_0=function(){return(Jb=a._emscripten_bind_Status_error_msg_0=a.asm.$).apply(null,arguments)},Kb=a._emscripten_bind_Status___destroy___0=function(){return(Kb=a._emscripten_bind_Status___destroy___0=a.asm.aa).apply(null,arguments)},Ma=a._emscripten_bind_DracoFloat32Array_DracoFloat32Array_0=function(){return(Ma=a._emscripten_bind_DracoFloat32Array_DracoFloat32Array_0=a.asm.ba).apply(null,arguments)},\nLb=a._emscripten_bind_DracoFloat32Array_GetValue_1=function(){return(Lb=a._emscripten_bind_DracoFloat32Array_GetValue_1=a.asm.ca).apply(null,arguments)},Mb=a._emscripten_bind_DracoFloat32Array_size_0=function(){return(Mb=a._emscripten_bind_DracoFloat32Array_size_0=a.asm.da).apply(null,arguments)},Nb=a._emscripten_bind_DracoFloat32Array___destroy___0=function(){return(Nb=a._emscripten_bind_DracoFloat32Array___destroy___0=a.asm.ea).apply(null,arguments)},Na=a._emscripten_bind_DracoInt8Array_DracoInt8Array_0=\nfunction(){return(Na=a._emscripten_bind_DracoInt8Array_DracoInt8Array_0=a.asm.fa).apply(null,arguments)},Ob=a._emscripten_bind_DracoInt8Array_GetValue_1=function(){return(Ob=a._emscripten_bind_DracoInt8Array_GetValue_1=a.asm.ga).apply(null,arguments)},Pb=a._emscripten_bind_DracoInt8Array_size_0=function(){return(Pb=a._emscripten_bind_DracoInt8Array_size_0=a.asm.ha).apply(null,arguments)},Qb=a._emscripten_bind_DracoInt8Array___destroy___0=function(){return(Qb=a._emscripten_bind_DracoInt8Array___destroy___0=\na.asm.ia).apply(null,arguments)},Oa=a._emscripten_bind_DracoUInt8Array_DracoUInt8Array_0=function(){return(Oa=a._emscripten_bind_DracoUInt8Array_DracoUInt8Array_0=a.asm.ja).apply(null,arguments)},Rb=a._emscripten_bind_DracoUInt8Array_GetValue_1=function(){return(Rb=a._emscripten_bind_DracoUInt8Array_GetValue_1=a.asm.ka).apply(null,arguments)},Sb=a._emscripten_bind_DracoUInt8Array_size_0=function(){return(Sb=a._emscripten_bind_DracoUInt8Array_size_0=a.asm.la).apply(null,arguments)},Tb=a._emscripten_bind_DracoUInt8Array___destroy___0=\nfunction(){return(Tb=a._emscripten_bind_DracoUInt8Array___destroy___0=a.asm.ma).apply(null,arguments)},Pa=a._emscripten_bind_DracoInt16Array_DracoInt16Array_0=function(){return(Pa=a._emscripten_bind_DracoInt16Array_DracoInt16Array_0=a.asm.na).apply(null,arguments)},Ub=a._emscripten_bind_DracoInt16Array_GetValue_1=function(){return(Ub=a._emscripten_bind_DracoInt16Array_GetValue_1=a.asm.oa).apply(null,arguments)},Vb=a._emscripten_bind_DracoInt16Array_size_0=function(){return(Vb=a._emscripten_bind_DracoInt16Array_size_0=\na.asm.pa).apply(null,arguments)},Wb=a._emscripten_bind_DracoInt16Array___destroy___0=function(){return(Wb=a._emscripten_bind_DracoInt16Array___destroy___0=a.asm.qa).apply(null,arguments)},Qa=a._emscripten_bind_DracoUInt16Array_DracoUInt16Array_0=function(){return(Qa=a._emscripten_bind_DracoUInt16Array_DracoUInt16Array_0=a.asm.ra).apply(null,arguments)},Xb=a._emscripten_bind_DracoUInt16Array_GetValue_1=function(){return(Xb=a._emscripten_bind_DracoUInt16Array_GetValue_1=a.asm.sa).apply(null,arguments)},\nYb=a._emscripten_bind_DracoUInt16Array_size_0=function(){return(Yb=a._emscripten_bind_DracoUInt16Array_size_0=a.asm.ta).apply(null,arguments)},Zb=a._emscripten_bind_DracoUInt16Array___destroy___0=function(){return(Zb=a._emscripten_bind_DracoUInt16Array___destroy___0=a.asm.ua).apply(null,arguments)},Ra=a._emscripten_bind_DracoInt32Array_DracoInt32Array_0=function(){return(Ra=a._emscripten_bind_DracoInt32Array_DracoInt32Array_0=a.asm.va).apply(null,arguments)},$b=a._emscripten_bind_DracoInt32Array_GetValue_1=\nfunction(){return($b=a._emscripten_bind_DracoInt32Array_GetValue_1=a.asm.wa).apply(null,arguments)},ac=a._emscripten_bind_DracoInt32Array_size_0=function(){return(ac=a._emscripten_bind_DracoInt32Array_size_0=a.asm.xa).apply(null,arguments)},bc=a._emscripten_bind_DracoInt32Array___destroy___0=function(){return(bc=a._emscripten_bind_DracoInt32Array___destroy___0=a.asm.ya).apply(null,arguments)},Sa=a._emscripten_bind_DracoUInt32Array_DracoUInt32Array_0=function(){return(Sa=a._emscripten_bind_DracoUInt32Array_DracoUInt32Array_0=\na.asm.za).apply(null,arguments)},cc=a._emscripten_bind_DracoUInt32Array_GetValue_1=function(){return(cc=a._emscripten_bind_DracoUInt32Array_GetValue_1=a.asm.Aa).apply(null,arguments)},dc=a._emscripten_bind_DracoUInt32Array_size_0=function(){return(dc=a._emscripten_bind_DracoUInt32Array_size_0=a.asm.Ba).apply(null,arguments)},ec=a._emscripten_bind_DracoUInt32Array___destroy___0=function(){return(ec=a._emscripten_bind_DracoUInt32Array___destroy___0=a.asm.Ca).apply(null,arguments)},Ta=a._emscripten_bind_MetadataQuerier_MetadataQuerier_0=\nfunction(){return(Ta=a._emscripten_bind_MetadataQuerier_MetadataQuerier_0=a.asm.Da).apply(null,arguments)},fc=a._emscripten_bind_MetadataQuerier_HasEntry_2=function(){return(fc=a._emscripten_bind_MetadataQuerier_HasEntry_2=a.asm.Ea).apply(null,arguments)},gc=a._emscripten_bind_MetadataQuerier_GetIntEntry_2=function(){return(gc=a._emscripten_bind_MetadataQuerier_GetIntEntry_2=a.asm.Fa).apply(null,arguments)},hc=a._emscripten_bind_MetadataQuerier_GetIntEntryArray_3=function(){return(hc=a._emscripten_bind_MetadataQuerier_GetIntEntryArray_3=\na.asm.Ga).apply(null,arguments)},ic=a._emscripten_bind_MetadataQuerier_GetDoubleEntry_2=function(){return(ic=a._emscripten_bind_MetadataQuerier_GetDoubleEntry_2=a.asm.Ha).apply(null,arguments)},jc=a._emscripten_bind_MetadataQuerier_GetStringEntry_2=function(){return(jc=a._emscripten_bind_MetadataQuerier_GetStringEntry_2=a.asm.Ia).apply(null,arguments)},kc=a._emscripten_bind_MetadataQuerier_NumEntries_1=function(){return(kc=a._emscripten_bind_MetadataQuerier_NumEntries_1=a.asm.Ja).apply(null,arguments)},\nlc=a._emscripten_bind_MetadataQuerier_GetEntryName_2=function(){return(lc=a._emscripten_bind_MetadataQuerier_GetEntryName_2=a.asm.Ka).apply(null,arguments)},mc=a._emscripten_bind_MetadataQuerier___destroy___0=function(){return(mc=a._emscripten_bind_MetadataQuerier___destroy___0=a.asm.La).apply(null,arguments)},Ua=a._emscripten_bind_Decoder_Decoder_0=function(){return(Ua=a._emscripten_bind_Decoder_Decoder_0=a.asm.Ma).apply(null,arguments)},nc=a._emscripten_bind_Decoder_DecodeArrayToPointCloud_3=function(){return(nc=\na._emscripten_bind_Decoder_DecodeArrayToPointCloud_3=a.asm.Na).apply(null,arguments)},oc=a._emscripten_bind_Decoder_DecodeArrayToMesh_3=function(){return(oc=a._emscripten_bind_Decoder_DecodeArrayToMesh_3=a.asm.Oa).apply(null,arguments)},pc=a._emscripten_bind_Decoder_GetAttributeId_2=function(){return(pc=a._emscripten_bind_Decoder_GetAttributeId_2=a.asm.Pa).apply(null,arguments)},qc=a._emscripten_bind_Decoder_GetAttributeIdByName_2=function(){return(qc=a._emscripten_bind_Decoder_GetAttributeIdByName_2=\na.asm.Qa).apply(null,arguments)},rc=a._emscripten_bind_Decoder_GetAttributeIdByMetadataEntry_3=function(){return(rc=a._emscripten_bind_Decoder_GetAttributeIdByMetadataEntry_3=a.asm.Ra).apply(null,arguments)},sc=a._emscripten_bind_Decoder_GetAttribute_2=function(){return(sc=a._emscripten_bind_Decoder_GetAttribute_2=a.asm.Sa).apply(null,arguments)},tc=a._emscripten_bind_Decoder_GetAttributeByUniqueId_2=function(){return(tc=a._emscripten_bind_Decoder_GetAttributeByUniqueId_2=a.asm.Ta).apply(null,arguments)},\nuc=a._emscripten_bind_Decoder_GetMetadata_1=function(){return(uc=a._emscripten_bind_Decoder_GetMetadata_1=a.asm.Ua).apply(null,arguments)},vc=a._emscripten_bind_Decoder_GetAttributeMetadata_2=function(){return(vc=a._emscripten_bind_Decoder_GetAttributeMetadata_2=a.asm.Va).apply(null,arguments)},wc=a._emscripten_bind_Decoder_GetFaceFromMesh_3=function(){return(wc=a._emscripten_bind_Decoder_GetFaceFromMesh_3=a.asm.Wa).apply(null,arguments)},xc=a._emscripten_bind_Decoder_GetTriangleStripsFromMesh_2=\nfunction(){return(xc=a._emscripten_bind_Decoder_GetTriangleStripsFromMesh_2=a.asm.Xa).apply(null,arguments)},yc=a._emscripten_bind_Decoder_GetTrianglesUInt16Array_3=function(){return(yc=a._emscripten_bind_Decoder_GetTrianglesUInt16Array_3=a.asm.Ya).apply(null,arguments)},zc=a._emscripten_bind_Decoder_GetTrianglesUInt32Array_3=function(){return(zc=a._emscripten_bind_Decoder_GetTrianglesUInt32Array_3=a.asm.Za).apply(null,arguments)},Ac=a._emscripten_bind_Decoder_GetAttributeFloat_3=function(){return(Ac=\na._emscripten_bind_Decoder_GetAttributeFloat_3=a.asm._a).apply(null,arguments)},Bc=a._emscripten_bind_Decoder_GetAttributeFloatForAllPoints_3=function(){return(Bc=a._emscripten_bind_Decoder_GetAttributeFloatForAllPoints_3=a.asm.$a).apply(null,arguments)},Cc=a._emscripten_bind_Decoder_GetAttributeIntForAllPoints_3=function(){return(Cc=a._emscripten_bind_Decoder_GetAttributeIntForAllPoints_3=a.asm.ab).apply(null,arguments)},Dc=a._emscripten_bind_Decoder_GetAttributeInt8ForAllPoints_3=function(){return(Dc=\na._emscripten_bind_Decoder_GetAttributeInt8ForAllPoints_3=a.asm.bb).apply(null,arguments)},Ec=a._emscripten_bind_Decoder_GetAttributeUInt8ForAllPoints_3=function(){return(Ec=a._emscripten_bind_Decoder_GetAttributeUInt8ForAllPoints_3=a.asm.cb).apply(null,arguments)},Fc=a._emscripten_bind_Decoder_GetAttributeInt16ForAllPoints_3=function(){return(Fc=a._emscripten_bind_Decoder_GetAttributeInt16ForAllPoints_3=a.asm.db).apply(null,arguments)},Gc=a._emscripten_bind_Decoder_GetAttributeUInt16ForAllPoints_3=\nfunction(){return(Gc=a._emscripten_bind_Decoder_GetAttributeUInt16ForAllPoints_3=a.asm.eb).apply(null,arguments)},Hc=a._emscripten_bind_Decoder_GetAttributeInt32ForAllPoints_3=function(){return(Hc=a._emscripten_bind_Decoder_GetAttributeInt32ForAllPoints_3=a.asm.fb).apply(null,arguments)},Ic=a._emscripten_bind_Decoder_GetAttributeUInt32ForAllPoints_3=function(){return(Ic=a._emscripten_bind_Decoder_GetAttributeUInt32ForAllPoints_3=a.asm.gb).apply(null,arguments)},Jc=a._emscripten_bind_Decoder_GetAttributeDataArrayForAllPoints_5=\nfunction(){return(Jc=a._emscripten_bind_Decoder_GetAttributeDataArrayForAllPoints_5=a.asm.hb).apply(null,arguments)},Kc=a._emscripten_bind_Decoder_SkipAttributeTransform_1=function(){return(Kc=a._emscripten_bind_Decoder_SkipAttributeTransform_1=a.asm.ib).apply(null,arguments)},Lc=a._emscripten_bind_Decoder_GetEncodedGeometryType_Deprecated_1=function(){return(Lc=a._emscripten_bind_Decoder_GetEncodedGeometryType_Deprecated_1=a.asm.jb).apply(null,arguments)},Mc=a._emscripten_bind_Decoder_DecodeBufferToPointCloud_2=\nfunction(){return(Mc=a._emscripten_bind_Decoder_DecodeBufferToPointCloud_2=a.asm.kb).apply(null,arguments)},Nc=a._emscripten_bind_Decoder_DecodeBufferToMesh_2=function(){return(Nc=a._emscripten_bind_Decoder_DecodeBufferToMesh_2=a.asm.lb).apply(null,arguments)},Oc=a._emscripten_bind_Decoder___destroy___0=function(){return(Oc=a._emscripten_bind_Decoder___destroy___0=a.asm.mb).apply(null,arguments)},Pc=a._emscripten_enum_draco_AttributeTransformType_ATTRIBUTE_INVALID_TRANSFORM=function(){return(Pc=a._emscripten_enum_draco_AttributeTransformType_ATTRIBUTE_INVALID_TRANSFORM=\na.asm.nb).apply(null,arguments)},Qc=a._emscripten_enum_draco_AttributeTransformType_ATTRIBUTE_NO_TRANSFORM=function(){return(Qc=a._emscripten_enum_draco_AttributeTransformType_ATTRIBUTE_NO_TRANSFORM=a.asm.ob).apply(null,arguments)},Rc=a._emscripten_enum_draco_AttributeTransformType_ATTRIBUTE_QUANTIZATION_TRANSFORM=function(){return(Rc=a._emscripten_enum_draco_AttributeTransformType_ATTRIBUTE_QUANTIZATION_TRANSFORM=a.asm.pb).apply(null,arguments)},Sc=a._emscripten_enum_draco_AttributeTransformType_ATTRIBUTE_OCTAHEDRON_TRANSFORM=\nfunction(){return(Sc=a._emscripten_enum_draco_AttributeTransformType_ATTRIBUTE_OCTAHEDRON_TRANSFORM=a.asm.qb).apply(null,arguments)},Tc=a._emscripten_enum_draco_GeometryAttribute_Type_INVALID=function(){return(Tc=a._emscripten_enum_draco_GeometryAttribute_Type_INVALID=a.asm.rb).apply(null,arguments)},Uc=a._emscripten_enum_draco_GeometryAttribute_Type_POSITION=function(){return(Uc=a._emscripten_enum_draco_GeometryAttribute_Type_POSITION=a.asm.sb).apply(null,arguments)},Vc=a._emscripten_enum_draco_GeometryAttribute_Type_NORMAL=\nfunction(){return(Vc=a._emscripten_enum_draco_GeometryAttribute_Type_NORMAL=a.asm.tb).apply(null,arguments)},Wc=a._emscripten_enum_draco_GeometryAttribute_Type_COLOR=function(){return(Wc=a._emscripten_enum_draco_GeometryAttribute_Type_COLOR=a.asm.ub).apply(null,arguments)},Xc=a._emscripten_enum_draco_GeometryAttribute_Type_TEX_COORD=function(){return(Xc=a._emscripten_enum_draco_GeometryAttribute_Type_TEX_COORD=a.asm.vb).apply(null,arguments)},Yc=a._emscripten_enum_draco_GeometryAttribute_Type_GENERIC=\nfunction(){return(Yc=a._emscripten_enum_draco_GeometryAttribute_Type_GENERIC=a.asm.wb).apply(null,arguments)},Zc=a._emscripten_enum_draco_EncodedGeometryType_INVALID_GEOMETRY_TYPE=function(){return(Zc=a._emscripten_enum_draco_EncodedGeometryType_INVALID_GEOMETRY_TYPE=a.asm.xb).apply(null,arguments)},$c=a._emscripten_enum_draco_EncodedGeometryType_POINT_CLOUD=function(){return($c=a._emscripten_enum_draco_EncodedGeometryType_POINT_CLOUD=a.asm.yb).apply(null,arguments)},ad=a._emscripten_enum_draco_EncodedGeometryType_TRIANGULAR_MESH=\nfunction(){return(ad=a._emscripten_enum_draco_EncodedGeometryType_TRIANGULAR_MESH=a.asm.zb).apply(null,arguments)},bd=a._emscripten_enum_draco_DataType_DT_INVALID=function(){return(bd=a._emscripten_enum_draco_DataType_DT_INVALID=a.asm.Ab).apply(null,arguments)},cd=a._emscripten_enum_draco_DataType_DT_INT8=function(){return(cd=a._emscripten_enum_draco_DataType_DT_INT8=a.asm.Bb).apply(null,arguments)},dd=a._emscripten_enum_draco_DataType_DT_UINT8=function(){return(dd=a._emscripten_enum_draco_DataType_DT_UINT8=\na.asm.Cb).apply(null,arguments)},ed=a._emscripten_enum_draco_DataType_DT_INT16=function(){return(ed=a._emscripten_enum_draco_DataType_DT_INT16=a.asm.Db).apply(null,arguments)},fd=a._emscripten_enum_draco_DataType_DT_UINT16=function(){return(fd=a._emscripten_enum_draco_DataType_DT_UINT16=a.asm.Eb).apply(null,arguments)},gd=a._emscripten_enum_draco_DataType_DT_INT32=function(){return(gd=a._emscripten_enum_draco_DataType_DT_INT32=a.asm.Fb).apply(null,arguments)},hd=a._emscripten_enum_draco_DataType_DT_UINT32=\nfunction(){return(hd=a._emscripten_enum_draco_DataType_DT_UINT32=a.asm.Gb).apply(null,arguments)},id=a._emscripten_enum_draco_DataType_DT_INT64=function(){return(id=a._emscripten_enum_draco_DataType_DT_INT64=a.asm.Hb).apply(null,arguments)},jd=a._emscripten_enum_draco_DataType_DT_UINT64=function(){return(jd=a._emscripten_enum_draco_DataType_DT_UINT64=a.asm.Ib).apply(null,arguments)},kd=a._emscripten_enum_draco_DataType_DT_FLOAT32=function(){return(kd=a._emscripten_enum_draco_DataType_DT_FLOAT32=a.asm.Jb).apply(null,\narguments)},ld=a._emscripten_enum_draco_DataType_DT_FLOAT64=function(){return(ld=a._emscripten_enum_draco_DataType_DT_FLOAT64=a.asm.Kb).apply(null,arguments)},md=a._emscripten_enum_draco_DataType_DT_BOOL=function(){return(md=a._emscripten_enum_draco_DataType_DT_BOOL=a.asm.Lb).apply(null,arguments)},nd=a._emscripten_enum_draco_DataType_DT_TYPES_COUNT=function(){return(nd=a._emscripten_enum_draco_DataType_DT_TYPES_COUNT=a.asm.Mb).apply(null,arguments)},od=a._emscripten_enum_draco_StatusCode_OK=function(){return(od=\na._emscripten_enum_draco_StatusCode_OK=a.asm.Nb).apply(null,arguments)},pd=a._emscripten_enum_draco_StatusCode_DRACO_ERROR=function(){return(pd=a._emscripten_enum_draco_StatusCode_DRACO_ERROR=a.asm.Ob).apply(null,arguments)},qd=a._emscripten_enum_draco_StatusCode_IO_ERROR=function(){return(qd=a._emscripten_enum_draco_StatusCode_IO_ERROR=a.asm.Pb).apply(null,arguments)},rd=a._emscripten_enum_draco_StatusCode_INVALID_PARAMETER=function(){return(rd=a._emscripten_enum_draco_StatusCode_INVALID_PARAMETER=\na.asm.Qb).apply(null,arguments)},sd=a._emscripten_enum_draco_StatusCode_UNSUPPORTED_VERSION=function(){return(sd=a._emscripten_enum_draco_StatusCode_UNSUPPORTED_VERSION=a.asm.Rb).apply(null,arguments)},td=a._emscripten_enum_draco_StatusCode_UNKNOWN_VERSION=function(){return(td=a._emscripten_enum_draco_StatusCode_UNKNOWN_VERSION=a.asm.Sb).apply(null,arguments)};a._malloc=function(){return(a._malloc=a.asm.Tb).apply(null,arguments)};a._free=function(){return(a._free=a.asm.Ub).apply(null,arguments)};\nvar ya=function(){return(ya=a.asm.Vb).apply(null,arguments)};a.___start_em_js=15856;a.___stop_em_js=15954;var la;ia=function b(){la||ba();la||(ia=b)};if(a.preInit)for(\"function\"==typeof a.preInit&&(a.preInit=[a.preInit]);0<a.preInit.length;)a.preInit.pop()();ba();t.prototype=Object.create(t.prototype);t.prototype.constructor=t;t.prototype.__class__=t;t.__cache__={};a.WrapperObject=t;a.getCache=x;a.wrapPointer=D;a.castObject=function(b,c){return D(b.ptr,c)};a.NULL=D(0);a.destroy=function(b){if(!b.__destroy__)throw\"Error: Cannot destroy object. (Did you create it yourself?)\";\nb.__destroy__();delete x(b.__class__)[b.ptr]};a.compare=function(b,c){return b.ptr===c.ptr};a.getPointer=function(b){return b.ptr};a.getClass=function(b){return b.__class__};var r={buffer:0,size:0,pos:0,temps:[],needed:0,prepare:function(){if(r.needed){for(var b=0;b<r.temps.length;b++)a._free(r.temps[b]);r.temps.length=0;a._free(r.buffer);r.buffer=0;r.size+=r.needed;r.needed=0}r.buffer||(r.size+=128,r.buffer=a._malloc(r.size),r.buffer||f(void 0));r.pos=0},alloc:function(b,c){r.buffer||f(void 0);b=\nb.length*c.BYTES_PER_ELEMENT;b=b+7&-8;r.pos+b>=r.size?(0<b||f(void 0),r.needed+=b,c=a._malloc(b),r.temps.push(c)):(c=r.buffer+r.pos,r.pos+=b);return c},copy:function(b,c,d){d>>>=0;switch(c.BYTES_PER_ELEMENT){case 2:d>>>=1;break;case 4:d>>>=2;break;case 8:d>>>=3}for(var g=0;g<b.length;g++)c[d+g]=b[g]}};Z.prototype=Object.create(t.prototype);Z.prototype.constructor=Z;Z.prototype.__class__=Z;Z.__cache__={};a.VoidPtr=Z;Z.prototype.__destroy__=Z.prototype.__destroy__=function(){bb(this.ptr)};S.prototype=\nObject.create(t.prototype);S.prototype.constructor=S;S.prototype.__class__=S;S.__cache__={};a.DecoderBuffer=S;S.prototype.Init=S.prototype.Init=function(b,c){var d=this.ptr;r.prepare();\"object\"==typeof b&&(b=pa(b));c&&\"object\"===typeof c&&(c=c.ptr);cb(d,b,c)};S.prototype.__destroy__=S.prototype.__destroy__=function(){db(this.ptr)};Q.prototype=Object.create(t.prototype);Q.prototype.constructor=Q;Q.prototype.__class__=Q;Q.__cache__={};a.AttributeTransformData=Q;Q.prototype.transform_type=Q.prototype.transform_type=\nfunction(){return eb(this.ptr)};Q.prototype.__destroy__=Q.prototype.__destroy__=function(){fb(this.ptr)};W.prototype=Object.create(t.prototype);W.prototype.constructor=W;W.prototype.__class__=W;W.__cache__={};a.GeometryAttribute=W;W.prototype.__destroy__=W.prototype.__destroy__=function(){gb(this.ptr)};w.prototype=Object.create(t.prototype);w.prototype.constructor=w;w.prototype.__class__=w;w.__cache__={};a.PointAttribute=w;w.prototype.size=w.prototype.size=function(){return hb(this.ptr)};w.prototype.GetAttributeTransformData=\nw.prototype.GetAttributeTransformData=function(){return D(ib(this.ptr),Q)};w.prototype.attribute_type=w.prototype.attribute_type=function(){return jb(this.ptr)};w.prototype.data_type=w.prototype.data_type=function(){return kb(this.ptr)};w.prototype.num_components=w.prototype.num_components=function(){return lb(this.ptr)};w.prototype.normalized=w.prototype.normalized=function(){return!!mb(this.ptr)};w.prototype.byte_stride=w.prototype.byte_stride=function(){return nb(this.ptr)};w.prototype.byte_offset=\nw.prototype.byte_offset=function(){return ob(this.ptr)};w.prototype.unique_id=w.prototype.unique_id=function(){return pb(this.ptr)};w.prototype.__destroy__=w.prototype.__destroy__=function(){qb(this.ptr)};C.prototype=Object.create(t.prototype);C.prototype.constructor=C;C.prototype.__class__=C;C.__cache__={};a.AttributeQuantizationTransform=C;C.prototype.InitFromAttribute=C.prototype.InitFromAttribute=function(b){var c=this.ptr;b&&\"object\"===typeof b&&(b=b.ptr);return!!rb(c,b)};C.prototype.quantization_bits=\nC.prototype.quantization_bits=function(){return sb(this.ptr)};C.prototype.min_value=C.prototype.min_value=function(b){var c=this.ptr;b&&\"object\"===typeof b&&(b=b.ptr);return tb(c,b)};C.prototype.range=C.prototype.range=function(){return ub(this.ptr)};C.prototype.__destroy__=C.prototype.__destroy__=function(){vb(this.ptr)};F.prototype=Object.create(t.prototype);F.prototype.constructor=F;F.prototype.__class__=F;F.__cache__={};a.AttributeOctahedronTransform=F;F.prototype.InitFromAttribute=F.prototype.InitFromAttribute=\nfunction(b){var c=this.ptr;b&&\"object\"===typeof b&&(b=b.ptr);return!!wb(c,b)};F.prototype.quantization_bits=F.prototype.quantization_bits=function(){return xb(this.ptr)};F.prototype.__destroy__=F.prototype.__destroy__=function(){yb(this.ptr)};G.prototype=Object.create(t.prototype);G.prototype.constructor=G;G.prototype.__class__=G;G.__cache__={};a.PointCloud=G;G.prototype.num_attributes=G.prototype.num_attributes=function(){return zb(this.ptr)};G.prototype.num_points=G.prototype.num_points=function(){return Ab(this.ptr)};\nG.prototype.__destroy__=G.prototype.__destroy__=function(){Bb(this.ptr)};E.prototype=Object.create(t.prototype);E.prototype.constructor=E;E.prototype.__class__=E;E.__cache__={};a.Mesh=E;E.prototype.num_faces=E.prototype.num_faces=function(){return Cb(this.ptr)};E.prototype.num_attributes=E.prototype.num_attributes=function(){return Db(this.ptr)};E.prototype.num_points=E.prototype.num_points=function(){return Eb(this.ptr)};E.prototype.__destroy__=E.prototype.__destroy__=function(){Fb(this.ptr)};T.prototype=\nObject.create(t.prototype);T.prototype.constructor=T;T.prototype.__class__=T;T.__cache__={};a.Metadata=T;T.prototype.__destroy__=T.prototype.__destroy__=function(){Gb(this.ptr)};B.prototype=Object.create(t.prototype);B.prototype.constructor=B;B.prototype.__class__=B;B.__cache__={};a.Status=B;B.prototype.code=B.prototype.code=function(){return Hb(this.ptr)};B.prototype.ok=B.prototype.ok=function(){return!!Ib(this.ptr)};B.prototype.error_msg=B.prototype.error_msg=function(){return h(Jb(this.ptr))};\nB.prototype.__destroy__=B.prototype.__destroy__=function(){Kb(this.ptr)};H.prototype=Object.create(t.prototype);H.prototype.constructor=H;H.prototype.__class__=H;H.__cache__={};a.DracoFloat32Array=H;H.prototype.GetValue=H.prototype.GetValue=function(b){var c=this.ptr;b&&\"object\"===typeof b&&(b=b.ptr);return Lb(c,b)};H.prototype.size=H.prototype.size=function(){return Mb(this.ptr)};H.prototype.__destroy__=H.prototype.__destroy__=function(){Nb(this.ptr)};I.prototype=Object.create(t.prototype);I.prototype.constructor=\nI;I.prototype.__class__=I;I.__cache__={};a.DracoInt8Array=I;I.prototype.GetValue=I.prototype.GetValue=function(b){var c=this.ptr;b&&\"object\"===typeof b&&(b=b.ptr);return Ob(c,b)};I.prototype.size=I.prototype.size=function(){return Pb(this.ptr)};I.prototype.__destroy__=I.prototype.__destroy__=function(){Qb(this.ptr)};J.prototype=Object.create(t.prototype);J.prototype.constructor=J;J.prototype.__class__=J;J.__cache__={};a.DracoUInt8Array=J;J.prototype.GetValue=J.prototype.GetValue=function(b){var c=\nthis.ptr;b&&\"object\"===typeof b&&(b=b.ptr);return Rb(c,b)};J.prototype.size=J.prototype.size=function(){return Sb(this.ptr)};J.prototype.__destroy__=J.prototype.__destroy__=function(){Tb(this.ptr)};K.prototype=Object.create(t.prototype);K.prototype.constructor=K;K.prototype.__class__=K;K.__cache__={};a.DracoInt16Array=K;K.prototype.GetValue=K.prototype.GetValue=function(b){var c=this.ptr;b&&\"object\"===typeof b&&(b=b.ptr);return Ub(c,b)};K.prototype.size=K.prototype.size=function(){return Vb(this.ptr)};\nK.prototype.__destroy__=K.prototype.__destroy__=function(){Wb(this.ptr)};L.prototype=Object.create(t.prototype);L.prototype.constructor=L;L.prototype.__class__=L;L.__cache__={};a.DracoUInt16Array=L;L.prototype.GetValue=L.prototype.GetValue=function(b){var c=this.ptr;b&&\"object\"===typeof b&&(b=b.ptr);return Xb(c,b)};L.prototype.size=L.prototype.size=function(){return Yb(this.ptr)};L.prototype.__destroy__=L.prototype.__destroy__=function(){Zb(this.ptr)};M.prototype=Object.create(t.prototype);M.prototype.constructor=\nM;M.prototype.__class__=M;M.__cache__={};a.DracoInt32Array=M;M.prototype.GetValue=M.prototype.GetValue=function(b){var c=this.ptr;b&&\"object\"===typeof b&&(b=b.ptr);return $b(c,b)};M.prototype.size=M.prototype.size=function(){return ac(this.ptr)};M.prototype.__destroy__=M.prototype.__destroy__=function(){bc(this.ptr)};N.prototype=Object.create(t.prototype);N.prototype.constructor=N;N.prototype.__class__=N;N.__cache__={};a.DracoUInt32Array=N;N.prototype.GetValue=N.prototype.GetValue=function(b){var c=\nthis.ptr;b&&\"object\"===typeof b&&(b=b.ptr);return cc(c,b)};N.prototype.size=N.prototype.size=function(){return dc(this.ptr)};N.prototype.__destroy__=N.prototype.__destroy__=function(){ec(this.ptr)};y.prototype=Object.create(t.prototype);y.prototype.constructor=y;y.prototype.__class__=y;y.__cache__={};a.MetadataQuerier=y;y.prototype.HasEntry=y.prototype.HasEntry=function(b,c){var d=this.ptr;r.prepare();b&&\"object\"===typeof b&&(b=b.ptr);c=c&&\"object\"===typeof c?c.ptr:R(c);return!!fc(d,b,c)};y.prototype.GetIntEntry=\ny.prototype.GetIntEntry=function(b,c){var d=this.ptr;r.prepare();b&&\"object\"===typeof b&&(b=b.ptr);c=c&&\"object\"===typeof c?c.ptr:R(c);return gc(d,b,c)};y.prototype.GetIntEntryArray=y.prototype.GetIntEntryArray=function(b,c,d){var g=this.ptr;r.prepare();b&&\"object\"===typeof b&&(b=b.ptr);c=c&&\"object\"===typeof c?c.ptr:R(c);d&&\"object\"===typeof d&&(d=d.ptr);hc(g,b,c,d)};y.prototype.GetDoubleEntry=y.prototype.GetDoubleEntry=function(b,c){var d=this.ptr;r.prepare();b&&\"object\"===typeof b&&(b=b.ptr);c=\nc&&\"object\"===typeof c?c.ptr:R(c);return ic(d,b,c)};y.prototype.GetStringEntry=y.prototype.GetStringEntry=function(b,c){var d=this.ptr;r.prepare();b&&\"object\"===typeof b&&(b=b.ptr);c=c&&\"object\"===typeof c?c.ptr:R(c);return h(jc(d,b,c))};y.prototype.NumEntries=y.prototype.NumEntries=function(b){var c=this.ptr;b&&\"object\"===typeof b&&(b=b.ptr);return kc(c,b)};y.prototype.GetEntryName=y.prototype.GetEntryName=function(b,c){var d=this.ptr;b&&\"object\"===typeof b&&(b=b.ptr);c&&\"object\"===typeof c&&(c=\nc.ptr);return h(lc(d,b,c))};y.prototype.__destroy__=y.prototype.__destroy__=function(){mc(this.ptr)};m.prototype=Object.create(t.prototype);m.prototype.constructor=m;m.prototype.__class__=m;m.__cache__={};a.Decoder=m;m.prototype.DecodeArrayToPointCloud=m.prototype.DecodeArrayToPointCloud=function(b,c,d){var g=this.ptr;r.prepare();\"object\"==typeof b&&(b=pa(b));c&&\"object\"===typeof c&&(c=c.ptr);d&&\"object\"===typeof d&&(d=d.ptr);return D(nc(g,b,c,d),B)};m.prototype.DecodeArrayToMesh=m.prototype.DecodeArrayToMesh=\nfunction(b,c,d){var g=this.ptr;r.prepare();\"object\"==typeof b&&(b=pa(b));c&&\"object\"===typeof c&&(c=c.ptr);d&&\"object\"===typeof d&&(d=d.ptr);return D(oc(g,b,c,d),B)};m.prototype.GetAttributeId=m.prototype.GetAttributeId=function(b,c){var d=this.ptr;b&&\"object\"===typeof b&&(b=b.ptr);c&&\"object\"===typeof c&&(c=c.ptr);return pc(d,b,c)};m.prototype.GetAttributeIdByName=m.prototype.GetAttributeIdByName=function(b,c){var d=this.ptr;r.prepare();b&&\"object\"===typeof b&&(b=b.ptr);c=c&&\"object\"===typeof c?\nc.ptr:R(c);return qc(d,b,c)};m.prototype.GetAttributeIdByMetadataEntry=m.prototype.GetAttributeIdByMetadataEntry=function(b,c,d){var g=this.ptr;r.prepare();b&&\"object\"===typeof b&&(b=b.ptr);c=c&&\"object\"===typeof c?c.ptr:R(c);d=d&&\"object\"===typeof d?d.ptr:R(d);return rc(g,b,c,d)};m.prototype.GetAttribute=m.prototype.GetAttribute=function(b,c){var d=this.ptr;b&&\"object\"===typeof b&&(b=b.ptr);c&&\"object\"===typeof c&&(c=c.ptr);return D(sc(d,b,c),w)};m.prototype.GetAttributeByUniqueId=m.prototype.GetAttributeByUniqueId=\nfunction(b,c){var d=this.ptr;b&&\"object\"===typeof b&&(b=b.ptr);c&&\"object\"===typeof c&&(c=c.ptr);return D(tc(d,b,c),w)};m.prototype.GetMetadata=m.prototype.GetMetadata=function(b){var c=this.ptr;b&&\"object\"===typeof b&&(b=b.ptr);return D(uc(c,b),T)};m.prototype.GetAttributeMetadata=m.prototype.GetAttributeMetadata=function(b,c){var d=this.ptr;b&&\"object\"===typeof b&&(b=b.ptr);c&&\"object\"===typeof c&&(c=c.ptr);return D(vc(d,b,c),T)};m.prototype.GetFaceFromMesh=m.prototype.GetFaceFromMesh=function(b,\nc,d){var g=this.ptr;b&&\"object\"===typeof b&&(b=b.ptr);c&&\"object\"===typeof c&&(c=c.ptr);d&&\"object\"===typeof d&&(d=d.ptr);return!!wc(g,b,c,d)};m.prototype.GetTriangleStripsFromMesh=m.prototype.GetTriangleStripsFromMesh=function(b,c){var d=this.ptr;b&&\"object\"===typeof b&&(b=b.ptr);c&&\"object\"===typeof c&&(c=c.ptr);return xc(d,b,c)};m.prototype.GetTrianglesUInt16Array=m.prototype.GetTrianglesUInt16Array=function(b,c,d){var g=this.ptr;b&&\"object\"===typeof b&&(b=b.ptr);c&&\"object\"===typeof c&&(c=c.ptr);\nd&&\"object\"===typeof d&&(d=d.ptr);return!!yc(g,b,c,d)};m.prototype.GetTrianglesUInt32Array=m.prototype.GetTrianglesUInt32Array=function(b,c,d){var g=this.ptr;b&&\"object\"===typeof b&&(b=b.ptr);c&&\"object\"===typeof c&&(c=c.ptr);d&&\"object\"===typeof d&&(d=d.ptr);return!!zc(g,b,c,d)};m.prototype.GetAttributeFloat=m.prototype.GetAttributeFloat=function(b,c,d){var g=this.ptr;b&&\"object\"===typeof b&&(b=b.ptr);c&&\"object\"===typeof c&&(c=c.ptr);d&&\"object\"===typeof d&&(d=d.ptr);return!!Ac(g,b,c,d)};m.prototype.GetAttributeFloatForAllPoints=\nm.prototype.GetAttributeFloatForAllPoints=function(b,c,d){var g=this.ptr;b&&\"object\"===typeof b&&(b=b.ptr);c&&\"object\"===typeof c&&(c=c.ptr);d&&\"object\"===typeof d&&(d=d.ptr);return!!Bc(g,b,c,d)};m.prototype.GetAttributeIntForAllPoints=m.prototype.GetAttributeIntForAllPoints=function(b,c,d){var g=this.ptr;b&&\"object\"===typeof b&&(b=b.ptr);c&&\"object\"===typeof c&&(c=c.ptr);d&&\"object\"===typeof d&&(d=d.ptr);return!!Cc(g,b,c,d)};m.prototype.GetAttributeInt8ForAllPoints=m.prototype.GetAttributeInt8ForAllPoints=\nfunction(b,c,d){var g=this.ptr;b&&\"object\"===typeof b&&(b=b.ptr);c&&\"object\"===typeof c&&(c=c.ptr);d&&\"object\"===typeof d&&(d=d.ptr);return!!Dc(g,b,c,d)};m.prototype.GetAttributeUInt8ForAllPoints=m.prototype.GetAttributeUInt8ForAllPoints=function(b,c,d){var g=this.ptr;b&&\"object\"===typeof b&&(b=b.ptr);c&&\"object\"===typeof c&&(c=c.ptr);d&&\"object\"===typeof d&&(d=d.ptr);return!!Ec(g,b,c,d)};m.prototype.GetAttributeInt16ForAllPoints=m.prototype.GetAttributeInt16ForAllPoints=function(b,c,d){var g=this.ptr;\nb&&\"object\"===typeof b&&(b=b.ptr);c&&\"object\"===typeof c&&(c=c.ptr);d&&\"object\"===typeof d&&(d=d.ptr);return!!Fc(g,b,c,d)};m.prototype.GetAttributeUInt16ForAllPoints=m.prototype.GetAttributeUInt16ForAllPoints=function(b,c,d){var g=this.ptr;b&&\"object\"===typeof b&&(b=b.ptr);c&&\"object\"===typeof c&&(c=c.ptr);d&&\"object\"===typeof d&&(d=d.ptr);return!!Gc(g,b,c,d)};m.prototype.GetAttributeInt32ForAllPoints=m.prototype.GetAttributeInt32ForAllPoints=function(b,c,d){var g=this.ptr;b&&\"object\"===typeof b&&\n(b=b.ptr);c&&\"object\"===typeof c&&(c=c.ptr);d&&\"object\"===typeof d&&(d=d.ptr);return!!Hc(g,b,c,d)};m.prototype.GetAttributeUInt32ForAllPoints=m.prototype.GetAttributeUInt32ForAllPoints=function(b,c,d){var g=this.ptr;b&&\"object\"===typeof b&&(b=b.ptr);c&&\"object\"===typeof c&&(c=c.ptr);d&&\"object\"===typeof d&&(d=d.ptr);return!!Ic(g,b,c,d)};m.prototype.GetAttributeDataArrayForAllPoints=m.prototype.GetAttributeDataArrayForAllPoints=function(b,c,d,g,u){var X=this.ptr;b&&\"object\"===typeof b&&(b=b.ptr);c&&\n\"object\"===typeof c&&(c=c.ptr);d&&\"object\"===typeof d&&(d=d.ptr);g&&\"object\"===typeof g&&(g=g.ptr);u&&\"object\"===typeof u&&(u=u.ptr);return!!Jc(X,b,c,d,g,u)};m.prototype.SkipAttributeTransform=m.prototype.SkipAttributeTransform=function(b){var c=this.ptr;b&&\"object\"===typeof b&&(b=b.ptr);Kc(c,b)};m.prototype.GetEncodedGeometryType_Deprecated=m.prototype.GetEncodedGeometryType_Deprecated=function(b){var c=this.ptr;b&&\"object\"===typeof b&&(b=b.ptr);return Lc(c,b)};m.prototype.DecodeBufferToPointCloud=\nm.prototype.DecodeBufferToPointCloud=function(b,c){var d=this.ptr;b&&\"object\"===typeof b&&(b=b.ptr);c&&\"object\"===typeof c&&(c=c.ptr);return D(Mc(d,b,c),B)};m.prototype.DecodeBufferToMesh=m.prototype.DecodeBufferToMesh=function(b,c){var d=this.ptr;b&&\"object\"===typeof b&&(b=b.ptr);c&&\"object\"===typeof c&&(c=c.ptr);return D(Nc(d,b,c),B)};m.prototype.__destroy__=m.prototype.__destroy__=function(){Oc(this.ptr)};(function(){function b(){a.ATTRIBUTE_INVALID_TRANSFORM=Pc();a.ATTRIBUTE_NO_TRANSFORM=Qc();\na.ATTRIBUTE_QUANTIZATION_TRANSFORM=Rc();a.ATTRIBUTE_OCTAHEDRON_TRANSFORM=Sc();a.INVALID=Tc();a.POSITION=Uc();a.NORMAL=Vc();a.COLOR=Wc();a.TEX_COORD=Xc();a.GENERIC=Yc();a.INVALID_GEOMETRY_TYPE=Zc();a.POINT_CLOUD=$c();a.TRIANGULAR_MESH=ad();a.DT_INVALID=bd();a.DT_INT8=cd();a.DT_UINT8=dd();a.DT_INT16=ed();a.DT_UINT16=fd();a.DT_INT32=gd();a.DT_UINT32=hd();a.DT_INT64=id();a.DT_UINT64=jd();a.DT_FLOAT32=kd();a.DT_FLOAT64=ld();a.DT_BOOL=md();a.DT_TYPES_COUNT=nd();a.OK=od();a.DRACO_ERROR=pd();a.IO_ERROR=qd();\na.INVALID_PARAMETER=rd();a.UNSUPPORTED_VERSION=sd();a.UNKNOWN_VERSION=td()}za?b():oa.unshift(b)})();if(\"function\"===typeof a.onModuleParsed)a.onModuleParsed();a.Decoder.prototype.GetEncodedGeometryType=function(b){if(b.__class__&&b.__class__===a.DecoderBuffer)return a.Decoder.prototype.GetEncodedGeometryType_Deprecated(b);if(8>b.byteLength)return a.INVALID_GEOMETRY_TYPE;switch(b[7]){case 0:return a.POINT_CLOUD;case 1:return a.TRIANGULAR_MESH;default:return a.INVALID_GEOMETRY_TYPE}};return n.ready}}();\n\"object\"===typeof exports&&\"object\"===typeof module?module.exports=DracoDecoderModule:\"function\"===typeof define&&define.amd?define([],function(){return DracoDecoderModule}):\"object\"===typeof exports&&(exports.DracoDecoderModule=DracoDecoderModule);\n"
  },
  {
    "path": "examples/libs/draco/gltf/draco_decoder.js",
    "content": "\nvar DracoDecoderModule = (() => {\n  var _scriptDir = typeof document !== 'undefined' && document.currentScript ? document.currentScript.src : undefined;\n  if (typeof __filename !== 'undefined') _scriptDir = _scriptDir || __filename;\n  return (\nfunction(DracoDecoderModule = {})  {\n\nvar Module=typeof DracoDecoderModule!=\"undefined\"?DracoDecoderModule:{};var readyPromiseResolve,readyPromiseReject;Module[\"ready\"]=new Promise(function(resolve,reject){readyPromiseResolve=resolve;readyPromiseReject=reject});var isRuntimeInitialized=false;var isModuleParsed=false;Module[\"onRuntimeInitialized\"]=function(){isRuntimeInitialized=true;if(isModuleParsed){if(typeof Module[\"onModuleLoaded\"]===\"function\"){Module[\"onModuleLoaded\"](Module)}}};Module[\"onModuleParsed\"]=function(){isModuleParsed=true;if(isRuntimeInitialized){if(typeof Module[\"onModuleLoaded\"]===\"function\"){Module[\"onModuleLoaded\"](Module)}}};function isVersionSupported(versionString){if(typeof versionString!==\"string\")return false;const version=versionString.split(\".\");if(version.length<2||version.length>3)return false;if(version[0]==1&&version[1]>=0&&version[1]<=5)return true;if(version[0]!=0||version[1]>10)return false;return true}Module[\"isVersionSupported\"]=isVersionSupported;var moduleOverrides=Object.assign({},Module);var arguments_=[];var thisProgram=\"./this.program\";var quit_=(status,toThrow)=>{throw toThrow};var ENVIRONMENT_IS_WEB=typeof window==\"object\";var ENVIRONMENT_IS_WORKER=typeof importScripts==\"function\";var ENVIRONMENT_IS_NODE=typeof process==\"object\"&&typeof process.versions==\"object\"&&typeof process.versions.node==\"string\";var scriptDirectory=\"\";function locateFile(path){if(Module[\"locateFile\"]){return Module[\"locateFile\"](path,scriptDirectory)}return scriptDirectory+path}var read_,readAsync,readBinary,setWindowTitle;function logExceptionOnExit(e){if(e instanceof ExitStatus)return;let toLog=e;err(\"exiting due to exception: \"+toLog)}if(ENVIRONMENT_IS_NODE){var fs=require(\"fs\");var nodePath=require(\"path\");if(ENVIRONMENT_IS_WORKER){scriptDirectory=nodePath.dirname(scriptDirectory)+\"/\"}else{scriptDirectory=__dirname+\"/\"}read_=(filename,binary)=>{var ret=tryParseAsDataURI(filename);if(ret){return binary?ret:ret.toString()}filename=isFileURI(filename)?new URL(filename):nodePath.normalize(filename);return fs.readFileSync(filename,binary?undefined:\"utf8\")};readBinary=filename=>{var ret=read_(filename,true);if(!ret.buffer){ret=new Uint8Array(ret)}return ret};readAsync=(filename,onload,onerror)=>{var ret=tryParseAsDataURI(filename);if(ret){onload(ret)}filename=isFileURI(filename)?new URL(filename):nodePath.normalize(filename);fs.readFile(filename,function(err,data){if(err)onerror(err);else onload(data.buffer)})};if(process[\"argv\"].length>1){thisProgram=process[\"argv\"][1].replace(/\\\\/g,\"/\")}arguments_=process[\"argv\"].slice(2);quit_=(status,toThrow)=>{if(keepRuntimeAlive()){process[\"exitCode\"]=status;throw toThrow}logExceptionOnExit(toThrow);process[\"exit\"](status)};Module[\"inspect\"]=function(){return\"[Emscripten Module object]\"}}else if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){if(ENVIRONMENT_IS_WORKER){scriptDirectory=self.location.href}else if(typeof document!=\"undefined\"&&document.currentScript){scriptDirectory=document.currentScript.src}if(_scriptDir){scriptDirectory=_scriptDir}if(scriptDirectory.indexOf(\"blob:\")!==0){scriptDirectory=scriptDirectory.substr(0,scriptDirectory.replace(/[?#].*/,\"\").lastIndexOf(\"/\")+1)}else{scriptDirectory=\"\"}{read_=url=>{try{var xhr=new XMLHttpRequest;xhr.open(\"GET\",url,false);xhr.send(null);return xhr.responseText}catch(err){var data=tryParseAsDataURI(url);if(data){return intArrayToString(data)}throw err}};if(ENVIRONMENT_IS_WORKER){readBinary=url=>{try{var xhr=new XMLHttpRequest;xhr.open(\"GET\",url,false);xhr.responseType=\"arraybuffer\";xhr.send(null);return new Uint8Array(xhr.response)}catch(err){var data=tryParseAsDataURI(url);if(data){return data}throw err}}}readAsync=(url,onload,onerror)=>{var xhr=new XMLHttpRequest;xhr.open(\"GET\",url,true);xhr.responseType=\"arraybuffer\";xhr.onload=()=>{if(xhr.status==200||xhr.status==0&&xhr.response){onload(xhr.response);return}var data=tryParseAsDataURI(url);if(data){onload(data.buffer);return}onerror()};xhr.onerror=onerror;xhr.send(null)}}setWindowTitle=title=>document.title=title}else{}var out=Module[\"print\"]||console.log.bind(console);var err=Module[\"printErr\"]||console.warn.bind(console);Object.assign(Module,moduleOverrides);moduleOverrides=null;if(Module[\"arguments\"])arguments_=Module[\"arguments\"];if(Module[\"thisProgram\"])thisProgram=Module[\"thisProgram\"];if(Module[\"quit\"])quit_=Module[\"quit\"];var wasmBinary;if(Module[\"wasmBinary\"])wasmBinary=Module[\"wasmBinary\"];var noExitRuntime=Module[\"noExitRuntime\"]||true;var WebAssembly={Memory:function(opts){this.buffer=new ArrayBuffer(opts[\"initial\"]*65536)},Module:function(binary){},Instance:function(module,info){this.exports=(\n// EMSCRIPTEN_START_ASM\nfunction instantiate(ia){function c(d){d.set=function(a,b){this[a]=b};d.get=function(a){return this[a]};return d}var e;var f=new Uint8Array(123);for(var a=25;a>=0;--a){f[48+a]=52+a;f[65+a]=a;f[97+a]=26+a}f[43]=62;f[47]=63;function l(m,n,o){var g,h,a=0,i=n,j=o.length,k=n+(j*3>>2)-(o[j-2]==\"=\")-(o[j-1]==\"=\");for(;a<j;a+=4){g=f[o.charCodeAt(a+1)];h=f[o.charCodeAt(a+2)];m[i++]=f[o.charCodeAt(a)]<<2|g>>4;if(i<k)m[i++]=g<<4|h>>2;if(i<k)m[i++]=h<<6|f[o.charCodeAt(a+3)]}}function p(q){l(e,1028,\"YAQAAAIAAAADAAAABAAAAAUAAAAGAAAABwAAAAgAAAAJAAAACgAAAAsAAAAMAAAADQAAAE41ZHJhY28yOEF0dHJpYnV0ZU9jdGFoZWRyb25UcmFuc2Zvcm1FAADYKwAAOAQAAOAGAABfX25leHRfcHJpbWUgb3ZlcmZsb3cAdmVjdG9yAHN0ZDo6ZXhjZXB0aW9uAHNraXBfYXR0cmlidXRlX3RyYW5zZm9ybQBiYWRfYXJyYXlfbmV3X2xlbmd0aABiYXNpY19zdHJpbmcAc3RkOjpiYWRfYWxsb2MARFJBQ08AVXNpbmcgaW5jb21wYXRpYmxlIGRlY29kZXIgZm9yIHRoZSBpbnB1dCBnZW9tZXRyeS4ARmFpbGVkIHRvIGRlY29kZSBwb2ludCBhdHRyaWJ1dGVzLgBGYWlsZWQgdG8gaW5pdGlhbGl6ZSB0aGUgZGVjb2Rlci4AVW5zdXBwb3J0ZWQgbWlub3IgdmVyc2lvbi4AVW5zdXBwb3J0ZWQgbWFqb3IgdmVyc2lvbi4ASW5wdXQgaXMgbm90IGEgbWVzaC4AVW5zdXBwb3J0ZWQgZ2VvbWV0cnkgdHlwZS4ATm90IGEgRHJhY28gZmlsZS4AVW5zdXBwb3J0ZWQgZW5jb2RpbmcgbWV0aG9kLgBGYWlsZWQgdG8gZGVjb2RlIG1ldGFkYXRhLgBGYWlsZWQgdG8gZGVjb2RlIGdlb21ldHJ5IGRhdGEuAFB1cmUgdmlydHVhbCBmdW5jdGlvbiBjYWxsZWQhAAAAAAAAALQGAAAPAAAAEAAAABEAAAASAAAAEwAAABQAAAAVAAAAFgAAABcAAAALAAAAGAAAABkAAABONWRyYWNvMzBBdHRyaWJ1dGVRdWFudGl6YXRpb25UcmFuc2Zvcm1FAAAAANgrAACIBgAA4AYAAE41ZHJhY28xOEF0dHJpYnV0ZVRyYW5zZm9ybUUAAAAAsCsAAMAGAAAAAAAAbAcAABoAAAAbAAAAHAAAAB0AAAAeAAAAHwAAACAAAAAhAAAAIgAAACMAAAAkAAAAJQAAAE41ZHJhY28xN0F0dHJpYnV0ZXNEZWNvZGVyRQBONWRyYWNvMjZBdHRyaWJ1dGVzRGVjb2RlckludGVyZmFjZUUAAAAAsCsAADwHAADYKwAAIAcAAGQHAAAAAAAAzAcAACYAAAAnAAAAKAAAACkAAAAqAAAAKwAAACwAAAAtAAAALgAAAE41ZHJhY28yNlNlcXVlbnRpYWxBdHRyaWJ1dGVEZWNvZGVyRQAAAACwKwAApAcAAP////8AAAAARAgAAC8AAAAwAAAAHAAAADEAAAAyAAAAHwAAACAAAAAhAAAAMwAAADQAAAA1AAAANgAAADcAAABONWRyYWNvMzdTZXF1ZW50aWFsQXR0cmlidXRlRGVjb2RlcnNDb250cm9sbGVyRQDYKwAAFAgAAGwHAAAAAAAAuAgAADgAAAA5AAAAOgAAACkAAAAqAAAAKwAAADsAAAAtAAAAPAAAAD0AAAA+AAAAPwAAAEAAAABONWRyYWNvMzNTZXF1ZW50aWFsSW50ZWdlckF0dHJpYnV0ZURlY29kZXJFANgrAACMCAAAzAcAAAAAAABECwAAQQAAAEIAAABDAAAARAAAAEUAAABGAAAARwAAAEgAAABJAAAASgAAAEsAAABMAAAATjVkcmFjbzQwTWVzaFByZWRpY3Rpb25TY2hlbWVQYXJhbGxlbG9ncmFtRGVjb2RlcklpTlNfMzdQcmVkaWN0aW9uU2NoZW1lV3JhcERlY29kaW5nVHJhbnNmb3JtSWlpRUVOU18yNE1lc2hQcmVkaWN0aW9uU2NoZW1lRGF0YUlOU18yNE1lc2hBdHRyaWJ1dGVDb3JuZXJUYWJsZUVFRUVFAE41ZHJhY28yN01lc2hQcmVkaWN0aW9uU2NoZW1lRGVjb2RlcklpTlNfMzdQcmVkaWN0aW9uU2NoZW1lV3JhcERlY29kaW5nVHJhbnNmb3JtSWlpRUVOU18yNE1lc2hQcmVkaWN0aW9uU2NoZW1lRGF0YUlOU18yNE1lc2hBdHRyaWJ1dGVDb3JuZXJUYWJsZUVFRUVFAE41ZHJhY28yM1ByZWRpY3Rpb25TY2hlbWVEZWNvZGVySWlOU18zN1ByZWRpY3Rpb25TY2hlbWVXcmFwRGVjb2RpbmdUcmFuc2Zvcm1JaWlFRUVFAE41ZHJhY28zN1ByZWRpY3Rpb25TY2hlbWVUeXBlZERlY29kZXJJbnRlcmZhY2VJaWlFRQBONWRyYWNvMzJQcmVkaWN0aW9uU2NoZW1lRGVjb2RlckludGVyZmFjZUUATjVkcmFjbzI1UHJlZGljdGlvblNjaGVtZUludGVyZmFjZUUAsCsAAOgKAADYKwAAvQoAAAwLAADYKwAAiQoAABQLAADYKwAANQoAACALAADYKwAAnwkAACwLAADYKwAA/AgAADgLAAAAAAAAOAsAAEEAAABNAAAAIwAAAEQAAAAjAAAARgAAAEcAAABIAAAASQAAAEoAAABLAAAAIwAAAAAAAAAsCwAAQQAAAE4AAAAjAAAARAAAACMAAABGAAAARwAAAEgAAABJAAAASgAAAEsAAAAjAAAAAAAAAKwMAABPAAAAUAAAAFEAAABEAAAAUgAAAEYAAABHAAAASAAAAEkAAABKAAAAUwAAAFQAAABONWRyYWNvNTZNZXNoUHJlZGljdGlvblNjaGVtZUNvbnN0cmFpbmVkTXVsdGlQYXJhbGxlbG9ncmFtRGVjb2RlcklpTlNfMzdQcmVkaWN0aW9uU2NoZW1lV3JhcERlY29kaW5nVHJhbnNmb3JtSWlpRUVOU18yNE1lc2hQcmVkaWN0aW9uU2NoZW1lRGF0YUlOU18yNE1lc2hBdHRyaWJ1dGVDb3JuZXJUYWJsZUVFRUVFAADYKwAA+AsAADgLAAAAAAAAmA0AAFUAAABWAAAAVwAAAEQAAABYAAAAWQAAAFoAAABbAAAASQAAAEoAAABcAAAAXQAAAE41ZHJhY280NE1lc2hQcmVkaWN0aW9uU2NoZW1lVGV4Q29vcmRzUG9ydGFibGVEZWNvZGVySWlOU18zN1ByZWRpY3Rpb25TY2hlbWVXcmFwRGVjb2RpbmdUcmFuc2Zvcm1JaWlFRU5TXzI0TWVzaFByZWRpY3Rpb25TY2hlbWVEYXRhSU5TXzI0TWVzaEF0dHJpYnV0ZUNvcm5lclRhYmxlRUVFRUUAANgrAADwDAAAOAsAAAAAAACEDgAAXgAAAF8AAABgAAAARAAAAGEAAABiAAAAYwAAAGQAAABJAAAASgAAAGUAAABmAAAATjVkcmFjbzQyTWVzaFByZWRpY3Rpb25TY2hlbWVHZW9tZXRyaWNOb3JtYWxEZWNvZGVySWlOU18zN1ByZWRpY3Rpb25TY2hlbWVXcmFwRGVjb2RpbmdUcmFuc2Zvcm1JaWlFRU5TXzI0TWVzaFByZWRpY3Rpb25TY2hlbWVEYXRhSU5TXzI0TWVzaEF0dHJpYnV0ZUNvcm5lclRhYmxlRUVFRUUAAAAA2CsAANwNAAA4CwAAAAAAAAwQAABnAAAAaAAAAGkAAABqAAAAawAAAE41ZHJhY280OE1lc2hQcmVkaWN0aW9uU2NoZW1lR2VvbWV0cmljTm9ybWFsUHJlZGljdG9yQXJlYUlpTlNfMzdQcmVkaWN0aW9uU2NoZW1lV3JhcERlY29kaW5nVHJhbnNmb3JtSWlpRUVOU18yNE1lc2hQcmVkaWN0aW9uU2NoZW1lRGF0YUlOU18yNE1lc2hBdHRyaWJ1dGVDb3JuZXJUYWJsZUVFRUVFAE41ZHJhY280OE1lc2hQcmVkaWN0aW9uU2NoZW1lR2VvbWV0cmljTm9ybWFsUHJlZGljdG9yQmFzZUlpTlNfMzdQcmVkaWN0aW9uU2NoZW1lV3JhcERlY29kaW5nVHJhbnNmb3JtSWlpRUVOU18yNE1lc2hQcmVkaWN0aW9uU2NoZW1lRGF0YUlOU18yNE1lc2hBdHRyaWJ1dGVDb3JuZXJUYWJsZUVFRUVFAAAAsCsAAFcPAADYKwAArA4AAAQQAAAAAAAABBAAAGcAAABsAAAAIwAAAGoAAAAjAAAAAAAAAJgRAABBAAAAbQAAAG4AAABEAAAAbwAAAEYAAABHAAAASAAAAEkAAABKAAAASwAAAHAAAABONWRyYWNvNDBNZXNoUHJlZGljdGlvblNjaGVtZVBhcmFsbGVsb2dyYW1EZWNvZGVySWlOU18zN1ByZWRpY3Rpb25TY2hlbWVXcmFwRGVjb2RpbmdUcmFuc2Zvcm1JaWlFRU5TXzI0TWVzaFByZWRpY3Rpb25TY2hlbWVEYXRhSU5TXzExQ29ybmVyVGFibGVFRUVFRQBONWRyYWNvMjdNZXNoUHJlZGljdGlvblNjaGVtZURlY29kZXJJaU5TXzM3UHJlZGljdGlvblNjaGVtZVdyYXBEZWNvZGluZ1RyYW5zZm9ybUlpaUVFTlNfMjRNZXNoUHJlZGljdGlvblNjaGVtZURhdGFJTlNfMTFDb3JuZXJUYWJsZUVFRUVFAADYKwAAAhEAACwLAADYKwAAbBAAAIwRAAAAAAAAjBEAAEEAAABxAAAAIwAAAEQAAAAjAAAARgAAAEcAAABIAAAASQAAAEoAAABLAAAAIwAAAAAAAAC8EgAAcgAAAHMAAAB0AAAARAAAAHUAAABGAAAARwAAAEgAAABJAAAASgAAAHYAAAB3AAAATjVkcmFjbzU2TWVzaFByZWRpY3Rpb25TY2hlbWVDb25zdHJhaW5lZE11bHRpUGFyYWxsZWxvZ3JhbURlY29kZXJJaU5TXzM3UHJlZGljdGlvblNjaGVtZVdyYXBEZWNvZGluZ1RyYW5zZm9ybUlpaUVFTlNfMjRNZXNoUHJlZGljdGlvblNjaGVtZURhdGFJTlNfMTFDb3JuZXJUYWJsZUVFRUVFAAAA2CsAABQSAACMEQAAAAAAAJwTAAB4AAAAeQAAAHoAAABEAAAAewAAAHwAAAB9AAAAfgAAAEkAAABKAAAAfwAAAIAAAABONWRyYWNvNDRNZXNoUHJlZGljdGlvblNjaGVtZVRleENvb3Jkc1BvcnRhYmxlRGVjb2RlcklpTlNfMzdQcmVkaWN0aW9uU2NoZW1lV3JhcERlY29kaW5nVHJhbnNmb3JtSWlpRUVOU18yNE1lc2hQcmVkaWN0aW9uU2NoZW1lRGF0YUlOU18xMUNvcm5lclRhYmxlRUVFRUUAAADYKwAAABMAAIwRAAAAAAAAeBQAAIEAAACCAAAAgwAAAEQAAACEAAAAhQAAAIYAAACHAAAASQAAAEoAAACIAAAAiQAAAE41ZHJhY280Mk1lc2hQcmVkaWN0aW9uU2NoZW1lR2VvbWV0cmljTm9ybWFsRGVjb2RlcklpTlNfMzdQcmVkaWN0aW9uU2NoZW1lV3JhcERlY29kaW5nVHJhbnNmb3JtSWlpRUVOU18yNE1lc2hQcmVkaWN0aW9uU2NoZW1lRGF0YUlOU18xMUNvcm5lclRhYmxlRUVFRUUA2CsAAOATAACMEQAAAAAAAOQVAACKAAAAiwAAAIwAAACNAAAAjgAAAE41ZHJhY280OE1lc2hQcmVkaWN0aW9uU2NoZW1lR2VvbWV0cmljTm9ybWFsUHJlZGljdG9yQXJlYUlpTlNfMzdQcmVkaWN0aW9uU2NoZW1lV3JhcERlY29kaW5nVHJhbnNmb3JtSWlpRUVOU18yNE1lc2hQcmVkaWN0aW9uU2NoZW1lRGF0YUlOU18xMUNvcm5lclRhYmxlRUVFRUUATjVkcmFjbzQ4TWVzaFByZWRpY3Rpb25TY2hlbWVHZW9tZXRyaWNOb3JtYWxQcmVkaWN0b3JCYXNlSWlOU18zN1ByZWRpY3Rpb25TY2hlbWVXcmFwRGVjb2RpbmdUcmFuc2Zvcm1JaWlFRU5TXzI0TWVzaFByZWRpY3Rpb25TY2hlbWVEYXRhSU5TXzExQ29ybmVyVGFibGVFRUVFRQCwKwAAPhUAANgrAACgFAAA3BUAAAAAAADcFQAAigAAAI8AAAAjAAAAjQAAACMAAAAAAAAAoBYAAEEAAACQAAAAkQAAAEQAAACSAAAARgAAAEcAAABIAAAASQAAAEoAAABLAAAAkwAAAE41ZHJhY28yOFByZWRpY3Rpb25TY2hlbWVEZWx0YURlY29kZXJJaU5TXzM3UHJlZGljdGlvblNjaGVtZVdyYXBEZWNvZGluZ1RyYW5zZm9ybUlpaUVFRUUAAAAA2CsAAEQWAAAsCwAAAAAAABQXAACUAAAAlQAAAJYAAAApAAAAKgAAAJcAAAA7AAAALQAAADwAAACYAAAAmQAAAJoAAACbAAAATjVkcmFjbzMyU2VxdWVudGlhbE5vcm1hbEF0dHJpYnV0ZURlY29kZXJFAADYKwAA6BYAALgIAAAAAAAASBkAAJwAAACdAAAAngAAAJ8AAACgAAAAoQAAAKIAAACjAAAApAAAAKUAAACmAAAApwAAAE41ZHJhY280Mk1lc2hQcmVkaWN0aW9uU2NoZW1lR2VvbWV0cmljTm9ybWFsRGVjb2RlcklpTlNfNjJQcmVkaWN0aW9uU2NoZW1lTm9ybWFsT2N0YWhlZHJvbkNhbm9uaWNhbGl6ZWREZWNvZGluZ1RyYW5zZm9ybUlpRUVOU18yNE1lc2hQcmVkaWN0aW9uU2NoZW1lRGF0YUlOU18yNE1lc2hBdHRyaWJ1dGVDb3JuZXJUYWJsZUVFRUVFAE41ZHJhY28yN01lc2hQcmVkaWN0aW9uU2NoZW1lRGVjb2RlcklpTlNfNjJQcmVkaWN0aW9uU2NoZW1lTm9ybWFsT2N0YWhlZHJvbkNhbm9uaWNhbGl6ZWREZWNvZGluZ1RyYW5zZm9ybUlpRUVOU18yNE1lc2hQcmVkaWN0aW9uU2NoZW1lRGF0YUlOU18yNE1lc2hBdHRyaWJ1dGVDb3JuZXJUYWJsZUVFRUVFAE41ZHJhY28yM1ByZWRpY3Rpb25TY2hlbWVEZWNvZGVySWlOU182MlByZWRpY3Rpb25TY2hlbWVOb3JtYWxPY3RhaGVkcm9uQ2Fub25pY2FsaXplZERlY29kaW5nVHJhbnNmb3JtSWlFRUVFAADYKwAAwxgAACALAADYKwAAFRgAADAZAADYKwAAWBcAADwZAAAAAAAAABsAAKgAAACpAAAAqgAAAKsAAACsAAAATjVkcmFjbzQ4TWVzaFByZWRpY3Rpb25TY2hlbWVHZW9tZXRyaWNOb3JtYWxQcmVkaWN0b3JBcmVhSWlOU182MlByZWRpY3Rpb25TY2hlbWVOb3JtYWxPY3RhaGVkcm9uQ2Fub25pY2FsaXplZERlY29kaW5nVHJhbnNmb3JtSWlFRU5TXzI0TWVzaFByZWRpY3Rpb25TY2hlbWVEYXRhSU5TXzI0TWVzaEF0dHJpYnV0ZUNvcm5lclRhYmxlRUVFRUUATjVkcmFjbzQ4TWVzaFByZWRpY3Rpb25TY2hlbWVHZW9tZXRyaWNOb3JtYWxQcmVkaWN0b3JCYXNlSWlOU182MlByZWRpY3Rpb25TY2hlbWVOb3JtYWxPY3RhaGVkcm9uQ2Fub25pY2FsaXplZERlY29kaW5nVHJhbnNmb3JtSWlFRU5TXzI0TWVzaFByZWRpY3Rpb25TY2hlbWVEYXRhSU5TXzI0TWVzaEF0dHJpYnV0ZUNvcm5lclRhYmxlRUVFRUUAAACwKwAAMxoAANgrAABwGQAA+BoAAAAAAACkHAAArQAAAK4AAACvAAAAnwAAALAAAACxAAAAsgAAALMAAACkAAAApQAAALQAAAC1AAAATjVkcmFjbzQyTWVzaFByZWRpY3Rpb25TY2hlbWVHZW9tZXRyaWNOb3JtYWxEZWNvZGVySWlOU182MlByZWRpY3Rpb25TY2hlbWVOb3JtYWxPY3RhaGVkcm9uQ2Fub25pY2FsaXplZERlY29kaW5nVHJhbnNmb3JtSWlFRU5TXzI0TWVzaFByZWRpY3Rpb25TY2hlbWVEYXRhSU5TXzExQ29ybmVyVGFibGVFRUVFRQBONWRyYWNvMjdNZXNoUHJlZGljdGlvblNjaGVtZURlY29kZXJJaU5TXzYyUHJlZGljdGlvblNjaGVtZU5vcm1hbE9jdGFoZWRyb25DYW5vbmljYWxpemVkRGVjb2RpbmdUcmFuc2Zvcm1JaUVFTlNfMjRNZXNoUHJlZGljdGlvblNjaGVtZURhdGFJTlNfMTFDb3JuZXJUYWJsZUVFRUVFAAAAANgrAAD0GwAAMBkAANgrAABEGwAAmBwAAAAAAABAHgAAtgAAALcAAAC4AAAAuQAAALoAAABONWRyYWNvNDhNZXNoUHJlZGljdGlvblNjaGVtZUdlb21ldHJpY05vcm1hbFByZWRpY3RvckFyZWFJaU5TXzYyUHJlZGljdGlvblNjaGVtZU5vcm1hbE9jdGFoZWRyb25DYW5vbmljYWxpemVkRGVjb2RpbmdUcmFuc2Zvcm1JaUVFTlNfMjRNZXNoUHJlZGljdGlvblNjaGVtZURhdGFJTlNfMTFDb3JuZXJUYWJsZUVFRUVFAE41ZHJhY280OE1lc2hQcmVkaWN0aW9uU2NoZW1lR2VvbWV0cmljTm9ybWFsUHJlZGljdG9yQmFzZUlpTlNfNjJQcmVkaWN0aW9uU2NoZW1lTm9ybWFsT2N0YWhlZHJvbkNhbm9uaWNhbGl6ZWREZWNvZGluZ1RyYW5zZm9ybUlpRUVOU18yNE1lc2hQcmVkaWN0aW9uU2NoZW1lRGF0YUlOU18xMUNvcm5lclRhYmxlRUVFRUUAsCsAAIIdAADYKwAAzBwAADgeAAAAAAAA+B4AALsAAAC8AAAAvQAAAJ8AAAC+AAAAvwAAAMAAAADBAAAApAAAAKUAAADCAAAAwwAAAE41ZHJhY28yOFByZWRpY3Rpb25TY2hlbWVEZWx0YURlY29kZXJJaU5TXzYyUHJlZGljdGlvblNjaGVtZU5vcm1hbE9jdGFoZWRyb25DYW5vbmljYWxpemVkRGVjb2RpbmdUcmFuc2Zvcm1JaUVFRUUAAAAA2CsAAIQeAAAwGQAAAAAAAHwfAADEAAAAxQAAAMYAAAApAAAAKgAAAMcAAAA7AAAALQAAADwAAADIAAAAPgAAAD8AAADJAAAAygAAAMsAAABONWRyYWNvMzhTZXF1ZW50aWFsUXVhbnRpemF0aW9uQXR0cmlidXRlRGVjb2RlckUAAAAA2CsAAEgfAAC4CAAAAAAAANwfAADMAAAAzQAAAM4AAADPAAAAIwAAANAAAADRAAAA0gAAANMAAADUAAAA1QAAANYAAAAjAAAATjVkcmFjbzExTWVzaERlY29kZXJFAAAA2CsAAMQfAACcJwAAAAAAAEggAADXAAAA2AAAAM4AAADZAAAA2gAAANAAAADRAAAA0gAAANsAAADcAAAA3QAAAN4AAADfAAAATjVkcmFjbzIyTWVzaEVkZ2VicmVha2VyRGVjb2RlckUAAAAA2CsAACQgAADcHwAAAAAAADwhAADgAAAA4QAAAOIAAADjAAAA5AAAAOUAAADmAAAA5wAAAOgAAADpAAAA/////wAAAACcIQAA6gAAAOsAAADsAAAA7QAAAO4AAADvAAAA8AAAAPEAAADyAAAA8wAAAE41ZHJhY28yNk1lc2hFZGdlYnJlYWtlckRlY29kZXJJbXBsSU5TXzMxTWVzaEVkZ2VicmVha2VyVHJhdmVyc2FsRGVjb2RlckVFRQBONWRyYWNvMzVNZXNoRWRnZWJyZWFrZXJEZWNvZGVySW1wbEludGVyZmFjZUUAAACwKwAABCEAANgrAAC4IAAANCEAAE41ZHJhY28yNk1lc2hFZGdlYnJlYWtlckRlY29kZXJJbXBsSU5TXzM4TWVzaEVkZ2VicmVha2VyVHJhdmVyc2FsVmFsZW5jZURlY29kZXJFRUUAANgrAABIIQAANCEAAAAAAACYIgAA9AAAAPUAAAD2AAAATjVkcmFjbzE5RGVwdGhGaXJzdFRyYXZlcnNlcklOU18yNE1lc2hBdHRyaWJ1dGVDb3JuZXJUYWJsZUVOU18zNk1lc2hBdHRyaWJ1dGVJbmRpY2VzRW5jb2RpbmdPYnNlcnZlcklTMV9FRUVFAE41ZHJhY28xM1RyYXZlcnNlckJhc2VJTlNfMjRNZXNoQXR0cmlidXRlQ29ybmVyVGFibGVFTlNfMzZNZXNoQXR0cmlidXRlSW5kaWNlc0VuY29kaW5nT2JzZXJ2ZXJJUzFfRUVFRQCwKwAAKSIAANgrAAC8IQAAkCIAAAAAAACQIgAA9wAAAPgAAAD2\");l(e,8900,\"AQAAAAMAAAAFAAAABwAAAAAAAACYIwAA+QAAAPoAAAD7AAAA/AAAAE41ZHJhY28yMk1lc2hUcmF2ZXJzYWxTZXF1ZW5jZXJJTlNfMjhNYXhQcmVkaWN0aW9uRGVncmVlVHJhdmVyc2VySU5TXzExQ29ybmVyVGFibGVFTlNfMzZNZXNoQXR0cmlidXRlSW5kaWNlc0VuY29kaW5nT2JzZXJ2ZXJJUzJfRUVFRUVFAE41ZHJhY28xNVBvaW50c1NlcXVlbmNlckUAAAAAsCsAAHMjAADYKwAA7CIAAJAjAAD/////AAAAAIgkAAD9AAAA/gAAAP8AAABONWRyYWNvMjhNYXhQcmVkaWN0aW9uRGVncmVlVHJhdmVyc2VySU5TXzExQ29ybmVyVGFibGVFTlNfMzZNZXNoQXR0cmlidXRlSW5kaWNlc0VuY29kaW5nT2JzZXJ2ZXJJUzFfRUVFRQBONWRyYWNvMTNUcmF2ZXJzZXJCYXNlSU5TXzExQ29ybmVyVGFibGVFTlNfMzZNZXNoQXR0cmlidXRlSW5kaWNlc0VuY29kaW5nT2JzZXJ2ZXJJUzFfRUVFRQAAsCsAACUkAADYKwAAvCMAAIAkAAAAAAAAgCQAAAABAAABAQAA/wAAAAAAAABAJQAAAgEAAAMBAAAEAQAABQEAAE41ZHJhY28yMk1lc2hUcmF2ZXJzYWxTZXF1ZW5jZXJJTlNfMTlEZXB0aEZpcnN0VHJhdmVyc2VySU5TXzExQ29ybmVyVGFibGVFTlNfMzZNZXNoQXR0cmlidXRlSW5kaWNlc0VuY29kaW5nT2JzZXJ2ZXJJUzJfRUVFRUVFAAAA2CsAAMAkAACQIwAAAAAAAMAlAAAGAQAABwEAAP8AAABONWRyYWNvMTlEZXB0aEZpcnN0VHJhdmVyc2VySU5TXzExQ29ybmVyVGFibGVFTlNfMzZNZXNoQXR0cmlidXRlSW5kaWNlc0VuY29kaW5nT2JzZXJ2ZXJJUzFfRUVFRQDYKwAAYCUAAIAkAAAAAAAAcCYAAAgBAAAJAQAACgEAAAsBAABONWRyYWNvMjJNZXNoVHJhdmVyc2FsU2VxdWVuY2VySU5TXzE5RGVwdGhGaXJzdFRyYXZlcnNlcklOU18yNE1lc2hBdHRyaWJ1dGVDb3JuZXJUYWJsZUVOU18zNk1lc2hBdHRyaWJ1dGVJbmRpY2VzRW5jb2RpbmdPYnNlcnZlcklTMl9FRUVFRUUAANgrAADkJQAAkCM=\");l(e,9860,\"3CYAAMwAAAAMAQAAzgAAAM8AAAANAQAA0AAAANEAAADSAAAA0wAAANQAAADVAAAA1gAAAA4BAABONWRyYWNvMjFNZXNoU2VxdWVudGlhbERlY29kZXJFANgrAAC8JgAA3B8AAAAAAAAcJwAADwEAABABAAARAQAAEgEAAE41ZHJhY28xNUxpbmVhclNlcXVlbmNlckUAAADYKwAAACcAAJAjAAAAAAAAnCcAAMwAAAATAQAAFAEAAM8AAAAjAAAAFQEAANEAAADSAAAA0w==\");l(e,10080,\"RmFpbGVkIHRvIHBhcnNlIERyYWNvIGhlYWRlci4ATjVkcmFjbzE3UG9pbnRDbG91ZERlY29kZXJFAAAAsCsAAH4nAAABAAAAAQAAAAIAAAACAAAABAAAAAQAAAAIAAAACAAAAAQAAAAIAAAAAQ==\");l(e,10211,\"wAAAAMAAAADAAAAAwP//////////AAAAACAoAAAWAQAAFwEAABgBAAAZAQAATjVkcmFjbzRNZXNoRQAAANgrAAAQKAAAZCgAAP////8AAAAAAAAAAGQoAAAaAQAAGwEAABwBAAAdAQAATjVkcmFjbzEwUG9pbnRDbG91ZEUAAAAAsCsAAEwo\");l(e,10356,\"AgAAAAMAAAAFAAAABwAAAAsAAAANAAAAEQAAABMAAAAXAAAAHQAAAB8AAAAlAAAAKQAAACsAAAAvAAAANQAAADsAAAA9AAAAQwAAAEcAAABJAAAATwAAAFMAAABZAAAAYQAAAGUAAABnAAAAawAAAG0AAABxAAAAfwAAAIMAAACJAAAAiwAAAJUAAACXAAAAnQAAAKMAAACnAAAArQAAALMAAAC1AAAAvwAAAMEAAADFAAAAxwAAANMAAAABAAAACwAAAA0AAAARAAAAEwAAABcAAAAdAAAAHwAAACUAAAApAAAAKwAAAC8AAAA1AAAAOwAAAD0AAABDAAAARwAAAEkAAABPAAAAUwAAAFkAAABhAAAAZQAAAGcAAABrAAAAbQAAAHEAAAB5AAAAfwAAAIMAAACJAAAAiwAAAI8AAACVAAAAlwAAAJ0AAACjAAAApwAAAKkAAACtAAAAswAAALUAAAC7AAAAvwAAAMEAAADFAAAAxwAAANEAAAAAAAAACgAAAGQAAADoAwAAECcAAKCGAQBAQg8AgJaYAADh9QUAypo7AAAAAAAAAAAwMDAxMDIwMzA0MDUwNjA3MDgwOTEwMTExMjEzMTQxNTE2MTcxODE5MjAyMTIyMjMyNDI1MjYyNzI4MjkzMDMxMzIzMzM0MzUzNjM3MzgzOTQwNDE0MjQzNDQ0NTQ2NDc0ODQ5NTA1MTUyNTM1NDU1NTY1NzU4NTk2MDYxNjI2MzY0NjU2NjY3Njg2OTcwNzE3MjczNzQ3NTc2Nzc3ODc5ODA4MTgyODM4NDg1ODY4Nzg4ODk5MDkxOTI5Mzk0OTU5Njk3OTg5OU4xMF9fY3h4YWJpdjExNl9fc2hpbV90eXBlX2luZm9FAAAAANgrAADoKgAAbC0AAE4xMF9fY3h4YWJpdjExN19fY2xhc3NfdHlwZV9pbmZvRQAAANgrAAAYKwAADCsAAE4xMF9fY3h4YWJpdjExN19fcGJhc2VfdHlwZV9pbmZvRQAAANgrAABIKwAADCsAAE4xMF9fY3h4YWJpdjExOV9fcG9pbnRlcl90eXBlX2luZm9FANgrAAB4KwAAbCsAAAAAAAA8KwAAHgEAAB8BAAAgAQAAIQEAACIBAAAjAQAAJAEAACUBAAAAAAAAICwAAB4BAAAmAQAAIAEAACEBAAAiAQAAJwEAACgBAAApAQAATjEwX19jeHhhYml2MTIwX19zaV9jbGFzc190eXBlX2luZm9FAAAAANgrAAD4KwAAPCsAAAAAAACQLAAADgAAACoBAAArAQAAAAAAALgsAAAOAAAALAEAAC0BAAAAAAAAeCwAAA4AAAAuAQAALwEAAFN0OWV4Y2VwdGlvbgAAAACwKwAAaCwAAFN0OWJhZF9hbGxvYwAAAADYKwAAgCwAAHgsAABTdDIwYmFkX2FycmF5X25ld19sZW5ndGgAAAAA2CsAAJwsAACQLAAAAAAAAOgsAAABAAAAMAEAADEBAABTdDExbG9naWNfZXJyb3IA2CsAANgsAAB4LAAAAAAAABwtAAABAAAAMgEAADEBAABTdDEybGVuZ3RoX2Vycm9yAAAAANgrAAAILQAA6CwAAAAAAABQLQAAAQAAADMBAAAxAQAAU3QxMm91dF9vZl9yYW5nZQAAAADYKwAAPC0AAOgsAABTdDl0eXBlX2luZm8AAAAAsCsAAFwt\");l(e,11636,\"8C8B\")}var r=new ArrayBuffer(16);var s=new Int32Array(r);var t=new Float32Array(r);var u=new Float64Array(r);function v(){throw new Error(\"abort\")}function w(x){t[2]=x}function y(z){return s[z]}function ha(q){var A=q.a;var B=A.a;var C=B.buffer;B.grow=fa;var D=new Int8Array(C);var E=new Int16Array(C);var F=new Int32Array(C);var G=new Uint8Array(C);var H=new Uint16Array(C);var I=new Uint32Array(C);var J=new Float32Array(C);var K=new Float64Array(C);var L=Math.imul;var M=Math.fround;var N=Math.abs;var O=Math.clz32;var P=Math.min;var Q=Math.max;var R=Math.floor;var S=Math.ceil;var T=Math.trunc;var U=Math.sqrt;var V=A.b;var W=A.c;var X=A.d;var Y=A.e;var Z=77808;var _=0;\n// EMSCRIPTEN_START_FUNCS\nfunction mc(a,b,c,d){var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0;if(!a){return 1}e=F[c+20>>2];o=F[c+12>>2];g=F[c+16>>2];a:{if((e|0)>=(o|0)&g>>>0>=I[c+8>>2]|(e|0)>(o|0)){break a}o=G[g+F[c>>2]|0];g=g+1|0;e=g?e:e+1|0;F[c+16>>2]=g;F[c+20>>2]=e;b:{switch(o|0){case 0:e=a;f=b;g=d;a=0;d=0;j=Z+-64|0;Z=j;F[j+56>>2]=0;F[j+48>>2]=0;F[j+52>>2]=0;F[j+40>>2]=0;F[j+44>>2]=0;F[j+32>>2]=0;F[j+36>>2]=0;F[j+24>>2]=0;F[j+28>>2]=0;F[j+16>>2]=0;F[j+20>>2]=0;F[j+8>>2]=0;F[j+12>>2]=0;c:{if(!Nd(j+8|0,c)){break c}if(!Md(j+8|0,c)|(F[j+20>>2]?0:e)){break c}hc(c,0,0);if(e){s=f<<2;t=F[j+36>>2];u=F[j+48>>2];x=F[j+24>>2];l=F[j+56>>2];i=F[j+52>>2];while(1){d:{if(l>>>0>16383){break d}while(1){if((i|0)<=0){break d}i=i-1|0;F[j+52>>2]=i;l=G[i+u|0]|l<<8;F[j+56>>2]=l;if(l>>>0<16384){continue}break}}a=l&4095;r=F[(a<<2)+x>>2];b=(r<<3)+t|0;l=(L(F[b>>2],l>>>12|0)+a|0)-F[b+4>>2]|0;F[j+56>>2]=l;if((f|0)>0){a=0;if(!G[c+36|0]|r>>>0>32){break c}o=d+f|0;e:{if(!r){ma(g+(d<<2)|0,0,s);break e}y=r&-2;z=r&1;b=F[c+32>>2];h=F[c+28>>2];q=F[c+24>>2];while(1){k=0;a=b;m=0;n=0;if((r|0)!=1){while(1){p=q+(a>>>3|0)|0;f:{if(p>>>0>=h>>>0){p=0;break f}p=G[p|0];b=a+1|0;F[c+32>>2]=b;p=p>>>(a&7)&1;a=b}p=p<<k|m;m=0;v=q+(a>>>3|0)|0;if(v>>>0<h>>>0){m=G[v|0];b=a+1|0;F[c+32>>2]=b;m=m>>>(a&7)&1;a=b}v=k|1;k=k+2|0;m=p|m<<v;n=n+2|0;if((y|0)!=(n|0)){continue}break}}n=g+(d<<2)|0;if(z){p=q+(a>>>3|0)|0;if(p>>>0<h>>>0){p=G[p|0];b=a+1|0;F[c+32>>2]=b;a=p>>>(a&7)&1}else{a=0}m=a<<k|m}F[n>>2]=m;d=d+1|0;if((o|0)!=(d|0)){continue}break}}d=o}w=f+w|0;if(e>>>0>w>>>0){continue}break}}D[c+36|0]=0;f=F[c+20>>2];a=0;m=F[c+32>>2]+7|0;a=m>>>0<7?1:a;m=a<<29|m>>>3;b=m+F[c+16>>2]|0;a=(a>>>3|0)+f|0;F[c+16>>2]=b;F[c+20>>2]=b>>>0<m>>>0?a+1|0:a;a=1}b=F[j+36>>2];if(b){F[j+40>>2]=b;ja(b)}b=F[j+24>>2];if(b){F[j+28>>2]=b;ja(b)}b=F[j+8>>2];if(b){F[j+12>>2]=b;ja(b)}Z=j- -64|0;return a;case 1:break b;default:break a}}b=0;e=F[c+20>>2];o=F[c+12>>2];g=F[c+16>>2];g:{if((e|0)>=(o|0)&g>>>0>=I[c+8>>2]|(e|0)>(o|0)){break g}o=G[g+F[c>>2]|0];g=g+1|0;e=g?e:e+1|0;F[c+16>>2]=g;F[c+20>>2]=e;h:{switch(o-1|0){case 8:o=a;r=d;e=Z+-64|0;Z=e;F[e+56>>2]=0;F[e+48>>2]=0;F[e+52>>2]=0;F[e+40>>2]=0;F[e+44>>2]=0;F[e+32>>2]=0;F[e+36>>2]=0;F[e+24>>2]=0;F[e+28>>2]=0;F[e+16>>2]=0;F[e+20>>2]=0;F[e+8>>2]=0;F[e+12>>2]=0;h=e+8|0;i:{j:{if(!H[c+38>>1]){break j}if(!Ta(1,h+12|0,c)){break j}b=F[c+8>>2];d=F[c+16>>2];f=b-d|0;i=F[h+12>>2];b=F[c+12>>2]-(F[c+20>>2]+(b>>>0<d>>>0)|0)|0;if(f>>>0<i>>>6>>>0&(b|0)<=0|(b|0)<0){break j}b=F[h>>2];a=F[h+4>>2]-b>>2;k:{if(a>>>0<i>>>0){qa(h,i-a|0);i=F[h+12>>2];break k}if(a>>>0<=i>>>0){break k}F[h+4>>2]=b+(i<<2)}g=1;if(!i){break i}f=F[c+16>>2];d=F[c+20>>2];s=F[h>>2];j=F[c+8>>2];n=F[c+12>>2];b=0;while(1){g=0;if((d|0)>=(n|0)&f>>>0>=j>>>0|(d|0)>(n|0)){break i}g=F[c>>2];p=G[g+f|0];a=d;f=f+1|0;a=f?a:a+1|0;F[c+16>>2]=f;d=a;F[c+20>>2]=a;a=p>>>2|0;l=0;l:{m:{n:{o:{t=p&3;switch(t|0){case 0:break m;case 3:break o;default:break n}}a=a+b|0;g=0;if(a>>>0>=i>>>0){break i}ma(s+(b<<2)|0,0,(p&252)+4|0);b=a;break l}while(1){if((f|0)==(j|0)&(d|0)==(n|0)){break j}i=G[f+g|0];f=f+1|0;d=f?d:d+1|0;F[c+16>>2]=f;F[c+20>>2]=d;a=i<<(l<<3|6)|a;l=l+1|0;if((t|0)!=(l|0)){continue}break}}F[s+(b<<2)>>2]=a}b=b+1|0;i=F[h+12>>2];if(b>>>0<i>>>0){continue}break}a=h+16|0;n=F[h>>2];d=F[h+16>>2];b=F[h+20>>2]-d|0;p:{if(b>>>0<=32767){qa(a,8192-(b>>>2|0)|0);break p}if((b|0)==32768){break p}F[h+20>>2]=d+32768}d=h+28|0;b=F[d>>2];f=F[h+32>>2]-b>>3;q:{if(f>>>0<i>>>0){_a(d,i-f|0);b=F[d>>2];break q}if(f>>>0>i>>>0){F[h+32>>2]=(i<<3)+b}if(!i){break j}}j=F[a>>2];f=0;d=0;while(1){g=n+(f<<2)|0;l=F[g>>2];h=(f<<3)+b|0;a=d;F[h+4>>2]=a;F[h>>2]=l;g=F[g>>2];d=g+a|0;if(d>>>0>8192){break j}r:{if(a>>>0>=d>>>0){break r}l=0;h=g&7;if(h){while(1){F[j+(a<<2)>>2]=f;a=a+1|0;l=l+1|0;if((h|0)!=(l|0)){continue}break}}if(g-1>>>0<=6){break r}while(1){g=j+(a<<2)|0;F[g>>2]=f;F[g+28>>2]=f;F[g+24>>2]=f;F[g+20>>2]=f;F[g+16>>2]=f;F[g+12>>2]=f;F[g+8>>2]=f;F[g+4>>2]=f;a=a+8|0;if((d|0)!=(a|0)){continue}break}}f=f+1|0;if((i|0)!=(f|0)){continue}break}k=(d|0)==8192}g=k}s:{if(!g|(F[e+20>>2]?0:o)){break s}d=0;k=Z-16|0;Z=k;t:{if(!Sa(1,k+8|0,c)){break t}a=F[c+8>>2];f=F[c+16>>2];g=a-f|0;j=F[k+12>>2];i=F[c+20>>2];a=F[c+12>>2]-(i+(a>>>0<f>>>0)|0)|0;b=F[k+8>>2];if((j|0)==(a|0)&g>>>0<b>>>0|a>>>0<j>>>0){break t}a=i+j|0;g=b+f|0;a=g>>>0<f>>>0?a+1|0:a;F[c+16>>2]=g;F[c+20>>2]=a;if((b|0)<=0){break t}a=f+F[c>>2]|0;F[e+48>>2]=a;c=b-1|0;f=c+a|0;g=G[f|0];u:{if(g>>>0<=63){F[e+52>>2]=c;a=G[f|0]&63;break u}v:{switch((g>>>6|0)-1|0){case 0:if(b>>>0<2){break t}b=b-2|0;F[e+52>>2]=b;a=a+b|0;a=G[a+1|0]<<8&16128|G[a|0];break u;case 1:if(b>>>0<3){break t}b=b-3|0;F[e+52>>2]=b;a=a+b|0;a=G[a+1|0]<<8|G[a+2|0]<<16&4128768|G[a|0];break u;default:break v}}b=b-4|0;F[e+52>>2]=b;a=a+b|0;a=(G[a|0]|G[a+1|0]<<8|(G[a+2|0]<<16|G[a+3|0]<<24))&1073741823}F[e+56>>2]=a+32768;d=a>>>0<8355840}Z=k+16|0;if(!d){break s}if(!o){m=1;break s}b=F[e+52>>2];a=F[e+56>>2];c=F[e+36>>2];d=F[e+48>>2];f=F[e+24>>2];while(1){w:{if(a>>>0>32767){break w}while(1){if((b|0)<=0){break w}b=b-1|0;F[e+52>>2]=b;a=G[b+d|0]|a<<8;F[e+56>>2]=a;if(a>>>0<32768){continue}break}}m=a&8191;k=F[f+(m<<2)>>2];g=c+(k<<3)|0;a=(L(F[g>>2],a>>>13|0)+m|0)-F[g+4>>2]|0;F[e+56>>2]=a;F[r+(q<<2)>>2]=k;m=1;q=q+1|0;if((o|0)!=(q|0)){continue}break}}a=F[e+36>>2];if(a){F[e+40>>2]=a;ja(a)}a=F[e+24>>2];if(a){F[e+28>>2]=a;ja(a)}a=F[e+8>>2];if(a){F[e+12>>2]=a;ja(a)}Z=e- -64|0;b=m;break g;case 9:o=a;r=d;g=Z+-64|0;Z=g;F[g+56>>2]=0;F[g+48>>2]=0;F[g+52>>2]=0;F[g+40>>2]=0;F[g+44>>2]=0;F[g+32>>2]=0;F[g+36>>2]=0;F[g+24>>2]=0;F[g+28>>2]=0;F[g+16>>2]=0;F[g+20>>2]=0;F[g+8>>2]=0;F[g+12>>2]=0;h=g+8|0;x:{y:{if(!H[c+38>>1]){break y}if(!Ta(1,h+12|0,c)){break y}b=F[c+8>>2];d=F[c+16>>2];f=b-d|0;i=F[h+12>>2];b=F[c+12>>2]-(F[c+20>>2]+(b>>>0<d>>>0)|0)|0;if(f>>>0<i>>>6>>>0&(b|0)<=0|(b|0)<0){break y}b=F[h>>2];a=F[h+4>>2]-b>>2;z:{if(a>>>0<i>>>0){qa(h,i-a|0);i=F[h+12>>2];break z}if(a>>>0<=i>>>0){break z}F[h+4>>2]=b+(i<<2)}e=1;if(!i){break x}f=F[c+16>>2];d=F[c+20>>2];s=F[h>>2];j=F[c+8>>2];n=F[c+12>>2];b=0;while(1){e=0;if((d|0)>=(n|0)&f>>>0>=j>>>0|(d|0)>(n|0)){break x}t=F[c>>2];p=G[t+f|0];e=d;f=f+1|0;e=f?e:e+1|0;F[c+16>>2]=f;d=e;F[c+20>>2]=e;a=p>>>2|0;l=0;A:{B:{C:{D:{e=p&3;switch(e|0){case 0:break B;case 3:break D;default:break C}}a=a+b|0;e=0;if(a>>>0>=i>>>0){break x}ma(s+(b<<2)|0,0,(p&252)+4|0);b=a;break A}while(1){if((f|0)==(j|0)&(d|0)==(n|0)){break y}i=G[f+t|0];f=f+1|0;d=f?d:d+1|0;F[c+16>>2]=f;F[c+20>>2]=d;a=i<<(l<<3|6)|a;l=l+1|0;if((e|0)!=(l|0)){continue}break}}F[s+(b<<2)>>2]=a}b=b+1|0;i=F[h+12>>2];if(b>>>0<i>>>0){continue}break}a=h+16|0;n=F[h>>2];d=F[h+16>>2];b=F[h+20>>2]-d|0;E:{if(b>>>0<=131071){qa(a,32768-(b>>>2|0)|0);break E}if((b|0)==131072){break E}F[h+20>>2]=d+131072}d=h+28|0;b=F[d>>2];f=F[h+32>>2]-b>>3;F:{if(f>>>0<i>>>0){_a(d,i-f|0);b=F[d>>2];break F}if(f>>>0>i>>>0){F[h+32>>2]=(i<<3)+b}if(!i){break y}}j=F[a>>2];f=0;d=0;while(1){e=n+(f<<2)|0;l=F[e>>2];h=(f<<3)+b|0;a=d;F[h+4>>2]=a;F[h>>2]=l;e=F[e>>2];d=e+a|0;if(d>>>0>32768){break y}G:{if(a>>>0>=d>>>0){break G}l=0;h=e&7;if(h){while(1){F[j+(a<<2)>>2]=f;a=a+1|0;l=l+1|0;if((h|0)!=(l|0)){continue}break}}if(e-1>>>0<=6){break G}while(1){e=j+(a<<2)|0;F[e>>2]=f;F[e+28>>2]=f;F[e+24>>2]=f;F[e+20>>2]=f;F[e+16>>2]=f;F[e+12>>2]=f;F[e+8>>2]=f;F[e+4>>2]=f;a=a+8|0;if((d|0)!=(a|0)){continue}break}}f=f+1|0;if((i|0)!=(f|0)){continue}break}k=(d|0)==32768}e=k}H:{if(!e|(F[g+20>>2]?0:o)){break H}d=0;f=Z-16|0;Z=f;I:{if(!Sa(1,f+8|0,c)){break I}e=F[c+8>>2];b=F[c+16>>2];k=e-b|0;j=F[f+12>>2];i=F[c+20>>2];e=F[c+12>>2]-(i+(b>>>0>e>>>0)|0)|0;a=F[f+8>>2];if((j|0)==(e|0)&k>>>0<a>>>0|e>>>0<j>>>0){break I}e=i+j|0;k=a+b|0;e=k>>>0<b>>>0?e+1|0:e;F[c+16>>2]=k;F[c+20>>2]=e;if((a|0)<=0){break I}b=b+F[c>>2]|0;F[g+48>>2]=b;c=a-1|0;e=c+b|0;k=G[e|0];J:{if(k>>>0<=63){F[g+52>>2]=c;a=G[e|0]&63;break J}K:{switch((k>>>6|0)-1|0){case 0:if(a>>>0<2){break I}a=a-2|0;F[g+52>>2]=a;a=a+b|0;a=G[a+1|0]<<8&16128|G[a|0];break J;case 1:if(a>>>0<3){break I}a=a-3|0;F[g+52>>2]=a;a=a+b|0;a=G[a+1|0]<<8|G[a+2|0]<<16&4128768|G[a|0];break J;default:break K}}a=a-4|0;F[g+52>>2]=a;a=a+b|0;a=(G[a|0]|G[a+1|0]<<8|(G[a+2|0]<<16|G[a+3|0]<<24))&1073741823}F[g+56>>2]=a+131072;d=a>>>0<33423360}Z=f+16|0;if(!d){break H}if(!o){m=1;break H}b=F[g+52>>2];a=F[g+56>>2];c=F[g+36>>2];d=F[g+48>>2];f=F[g+24>>2];while(1){L:{if(a>>>0>131071){break L}while(1){if((b|0)<=0){break L}b=b-1|0;F[g+52>>2]=b;a=G[b+d|0]|a<<8;F[g+56>>2]=a;if(a>>>0<131072){continue}break}}m=a&32767;e=F[f+(m<<2)>>2];k=c+(e<<3)|0;a=(L(F[k>>2],a>>>15|0)+m|0)-F[k+4>>2]|0;F[g+56>>2]=a;F[r+(q<<2)>>2]=e;m=1;q=q+1|0;if((o|0)!=(q|0)){continue}break}}a=F[g+36>>2];if(a){F[g+40>>2]=a;ja(a)}a=F[g+24>>2];if(a){F[g+28>>2]=a;ja(a)}a=F[g+8>>2];if(a){F[g+12>>2]=a;ja(a)}Z=g- -64|0;b=m;break g;case 10:o=a;r=d;g=Z+-64|0;Z=g;F[g+56>>2]=0;F[g+48>>2]=0;F[g+52>>2]=0;F[g+40>>2]=0;F[g+44>>2]=0;F[g+32>>2]=0;F[g+36>>2]=0;F[g+24>>2]=0;F[g+28>>2]=0;F[g+16>>2]=0;F[g+20>>2]=0;F[g+8>>2]=0;F[g+12>>2]=0;h=g+8|0;M:{N:{if(!H[c+38>>1]){break N}if(!Ta(1,h+12|0,c)){break N}b=F[c+8>>2];d=F[c+16>>2];f=b-d|0;i=F[h+12>>2];b=F[c+12>>2]-(F[c+20>>2]+(b>>>0<d>>>0)|0)|0;if(f>>>0<i>>>6>>>0&(b|0)<=0|(b|0)<0){break N}b=F[h>>2];a=F[h+4>>2]-b>>2;O:{if(a>>>0<i>>>0){qa(h,i-a|0);i=F[h+12>>2];break O}if(a>>>0<=i>>>0){break O}F[h+4>>2]=b+(i<<2)}e=1;if(!i){break M}f=F[c+16>>2];d=F[c+20>>2];s=F[h>>2];j=F[c+8>>2];n=F[c+12>>2];b=0;while(1){e=0;if((d|0)>=(n|0)&f>>>0>=j>>>0|(d|0)>(n|0)){break M}t=F[c>>2];p=G[t+f|0];a=d;f=f+1|0;a=f?a:a+1|0;F[c+16>>2]=f;d=a;F[c+20>>2]=a;a=p>>>2|0;l=0;P:{Q:{R:{S:{u=p&3;switch(u|0){case 0:break Q;case 3:break S;default:break R}}a=a+b|0;e=0;if(a>>>0>=i>>>0){break M}ma(s+(b<<2)|0,0,(p&252)+4|0);b=a;break P}while(1){if((f|0)==(j|0)&(d|0)==(n|0)){break N}i=G[f+t|0];e=d;f=f+1|0;e=f?e:e+1|0;F[c+16>>2]=f;d=e;F[c+20>>2]=e;a=i<<(l<<3|6)|a;l=l+1|0;if((u|0)!=(l|0)){continue}break}}F[s+(b<<2)>>2]=a}b=b+1|0;i=F[h+12>>2];if(b>>>0<i>>>0){continue}break}a=h+16|0;n=F[h>>2];d=F[h+16>>2];b=F[h+20>>2]-d|0;T:{if(b>>>0<=262143){qa(a,65536-(b>>>2|0)|0);break T}if((b|0)==262144){break T}F[h+20>>2]=d+262144}d=h+28|0;b=F[d>>2];f=F[h+32>>2]-b>>3;U:{if(f>>>0<i>>>0){_a(d,i-f|0);b=F[d>>2];break U}if(f>>>0>i>>>0){F[h+32>>2]=(i<<3)+b}if(!i){break N}}j=F[a>>2];f=0;d=0;while(1){e=n+(f<<2)|0;l=F[e>>2];h=(f<<3)+b|0;a=d;F[h+4>>2]=a;F[h>>2]=l;e=F[e>>2];d=e+a|0;if(d>>>0>65536){break N}V:{if(a>>>0>=d>>>0){break V}l=0;h=e&7;if(h){while(1){F[j+(a<<2)>>2]=f;a=a+1|0;l=l+1|0;if((h|0)!=(l|0)){continue}break}}if(e-1>>>0<=6){break V}while(1){e=j+(a<<2)|0;F[e>>2]=f;F[e+28>>2]=f;F[e+24>>2]=f;F[e+20>>2]=f;F[e+16>>2]=f;F[e+12>>2]=f;F[e+8>>2]=f;F[e+4>>2]=f;a=a+8|0;if((d|0)!=(a|0)){continue}break}}f=f+1|0;if((i|0)!=(f|0)){continue}break}k=(d|0)==65536}e=k}W:{if(!e|(F[g+20>>2]?0:o)){break W}d=0;e=Z-16|0;Z=e;X:{if(!Sa(1,e+8|0,c)){break X}a=F[c+8>>2];f=F[c+16>>2];k=a-f|0;j=F[e+12>>2];i=F[c+20>>2];a=F[c+12>>2]-(i+(a>>>0<f>>>0)|0)|0;b=F[e+8>>2];if((j|0)==(a|0)&k>>>0<b>>>0|a>>>0<j>>>0){break X}a=i+j|0;k=b+f|0;a=k>>>0<f>>>0?a+1|0:a;F[c+16>>2]=k;F[c+20>>2]=a;if((b|0)<=0){break X}a=f+F[c>>2]|0;F[g+48>>2]=a;c=b-1|0;f=c+a|0;k=G[f|0];Y:{if(k>>>0<=63){F[g+52>>2]=c;a=G[f|0]&63;break Y}Z:{switch((k>>>6|0)-1|0){case 0:if(b>>>0<2){break X}b=b-2|0;F[g+52>>2]=b;a=a+b|0;a=G[a+1|0]<<8&16128|G[a|0];break Y;case 1:if(b>>>0<3){break X}b=b-3|0;F[g+52>>2]=b;a=a+b|0;a=G[a+1|0]<<8|G[a+2|0]<<16&4128768|G[a|0];break Y;default:break Z}}b=b-4|0;F[g+52>>2]=b;a=a+b|0;a=(G[a|0]|G[a+1|0]<<8|(G[a+2|0]<<16|G[a+3|0]<<24))&1073741823}F[g+56>>2]=a+262144;d=a>>>0<66846720}Z=e+16|0;if(!d){break W}if(!o){m=1;break W}b=F[g+52>>2];a=F[g+56>>2];c=F[g+36>>2];d=F[g+48>>2];f=F[g+24>>2];while(1){_:{if(a>>>0>262143){break _}while(1){if((b|0)<=0){break _}b=b-1|0;F[g+52>>2]=b;a=G[b+d|0]|a<<8;F[g+56>>2]=a;if(a>>>0<262144){continue}break}}m=a&65535;e=F[f+(m<<2)>>2];k=c+(e<<3)|0;a=(L(F[k>>2],a>>>16|0)+m|0)-F[k+4>>2]|0;F[g+56>>2]=a;F[r+(q<<2)>>2]=e;m=1;q=q+1|0;if((o|0)!=(q|0)){continue}break}}a=F[g+36>>2];if(a){F[g+40>>2]=a;ja(a)}a=F[g+24>>2];if(a){F[g+28>>2]=a;ja(a)}a=F[g+8>>2];if(a){F[g+12>>2]=a;ja(a)}Z=g- -64|0;b=m;break g;case 11:o=a;r=d;g=Z+-64|0;Z=g;F[g+56>>2]=0;F[g+48>>2]=0;F[g+52>>2]=0;F[g+40>>2]=0;F[g+44>>2]=0;F[g+32>>2]=0;F[g+36>>2]=0;F[g+24>>2]=0;F[g+28>>2]=0;F[g+16>>2]=0;F[g+20>>2]=0;F[g+8>>2]=0;F[g+12>>2]=0;h=g+8|0;$:{aa:{if(!H[c+38>>1]){break aa}if(!Ta(1,h+12|0,c)){break aa}b=F[c+8>>2];d=F[c+16>>2];f=b-d|0;i=F[h+12>>2];b=F[c+12>>2]-(F[c+20>>2]+(b>>>0<d>>>0)|0)|0;if(f>>>0<i>>>6>>>0&(b|0)<=0|(b|0)<0){break aa}b=F[h>>2];a=F[h+4>>2]-b>>2;ba:{if(a>>>0<i>>>0){qa(h,i-a|0);i=F[h+12>>2];break ba}if(a>>>0<=i>>>0){break ba}F[h+4>>2]=b+(i<<2)}e=1;if(!i){break $}f=F[c+16>>2];d=F[c+20>>2];s=F[h>>2];j=F[c+8>>2];n=F[c+12>>2];b=0;while(1){e=0;if((d|0)>=(n|0)&f>>>0>=j>>>0|(d|0)>(n|0)){break $}t=F[c>>2];p=G[t+f|0];e=d;f=f+1|0;e=f?e:e+1|0;F[c+16>>2]=f;d=e;F[c+20>>2]=e;a=p>>>2|0;l=0;ca:{da:{ea:{fa:{e=p&3;switch(e|0){case 0:break da;case 3:break fa;default:break ea}}a=a+b|0;e=0;if(a>>>0>=i>>>0){break $}ma(s+(b<<2)|0,0,(p&252)+4|0);b=a;break ca}while(1){if((f|0)==(j|0)&(d|0)==(n|0)){break aa}i=G[f+t|0];f=f+1|0;d=f?d:d+1|0;F[c+16>>2]=f;F[c+20>>2]=d;a=i<<(l<<3|6)|a;l=l+1|0;if((e|0)!=(l|0)){continue}break}}F[s+(b<<2)>>2]=a}b=b+1|0;i=F[h+12>>2];if(b>>>0<i>>>0){continue}break}a=h+16|0;n=F[h>>2];d=F[h+16>>2];b=F[h+20>>2]-d|0;ga:{if(b>>>0<=1048575){qa(a,262144-(b>>>2|0)|0);break ga}if((b|0)==1048576){break ga}F[h+20>>2]=d- -1048576}d=h+28|0;b=F[d>>2];f=F[h+32>>2]-b>>3;ha:{if(f>>>0<i>>>0){_a(d,i-f|0);b=F[d>>2];break ha}if(f>>>0>i>>>0){F[h+32>>2]=(i<<3)+b}if(!i){break aa}}j=F[a>>2];f=0;d=0;while(1){e=n+(f<<2)|0;l=F[e>>2];h=(f<<3)+b|0;a=d;F[h+4>>2]=a;F[h>>2]=l;e=F[e>>2];d=e+a|0;if(d>>>0>262144){break aa}ia:{if(a>>>0>=d>>>0){break ia}l=0;h=e&7;if(h){while(1){F[j+(a<<2)>>2]=f;a=a+1|0;l=l+1|0;if((h|0)!=(l|0)){continue}break}}if(e-1>>>0<=6){break ia}while(1){e=j+(a<<2)|0;F[e>>2]=f;F[e+28>>2]=f;F[e+24>>2]=f;F[e+20>>2]=f;F[e+16>>2]=f;F[e+12>>2]=f;F[e+8>>2]=f;F[e+4>>2]=f;a=a+8|0;if((d|0)!=(a|0)){continue}break}}f=f+1|0;if((i|0)!=(f|0)){continue}break}k=(d|0)==262144}e=k}ja:{if(!e|(F[g+20>>2]?0:o)){break ja}d=0;f=Z-16|0;Z=f;ka:{if(!Sa(1,f+8|0,c)){break ka}e=F[c+8>>2];b=F[c+16>>2];k=e-b|0;j=F[f+12>>2];i=F[c+20>>2];e=F[c+12>>2]-(i+(b>>>0>e>>>0)|0)|0;a=F[f+8>>2];if((j|0)==(e|0)&k>>>0<a>>>0|e>>>0<j>>>0){break ka}e=i+j|0;k=a+b|0;e=k>>>0<b>>>0?e+1|0:e;F[c+16>>2]=k;F[c+20>>2]=e;if((a|0)<=0){break ka}b=b+F[c>>2]|0;F[g+48>>2]=b;c=a-1|0;e=c+b|0;k=G[e|0];la:{if(k>>>0<=63){F[g+52>>2]=c;a=G[e|0]&63;break la}ma:{switch((k>>>6|0)-1|0){case 0:if(a>>>0<2){break ka}a=a-2|0;F[g+52>>2]=a;a=a+b|0;a=G[a+1|0]<<8&16128|G[a|0];break la;case 1:if(a>>>0<3){break ka}a=a-3|0;F[g+52>>2]=a;a=a+b|0;a=G[a+1|0]<<8|G[a+2|0]<<16&4128768|G[a|0];break la;default:break ma}}a=a-4|0;F[g+52>>2]=a;a=a+b|0;a=(G[a|0]|G[a+1|0]<<8|(G[a+2|0]<<16|G[a+3|0]<<24))&1073741823}F[g+56>>2]=a- -1048576;d=a>>>0<267386880}Z=f+16|0;if(!d){break ja}if(!o){m=1;break ja}b=F[g+52>>2];a=F[g+56>>2];c=F[g+36>>2];d=F[g+48>>2];f=F[g+24>>2];while(1){na:{if(a>>>0>1048575){break na}while(1){if((b|0)<=0){break na}b=b-1|0;F[g+52>>2]=b;a=G[b+d|0]|a<<8;F[g+56>>2]=a;if(a>>>0<1048576){continue}break}}m=a&262143;e=F[f+(m<<2)>>2];k=c+(e<<3)|0;a=(L(F[k>>2],a>>>18|0)+m|0)-F[k+4>>2]|0;F[g+56>>2]=a;F[r+(q<<2)>>2]=e;m=1;q=q+1|0;if((o|0)!=(q|0)){continue}break}}a=F[g+36>>2];if(a){F[g+40>>2]=a;ja(a)}a=F[g+24>>2];if(a){F[g+28>>2]=a;ja(a)}a=F[g+8>>2];if(a){F[g+12>>2]=a;ja(a)}Z=g- -64|0;b=m;break g;case 12:o=a;r=d;e=Z+-64|0;Z=e;F[e+56>>2]=0;F[e+48>>2]=0;F[e+52>>2]=0;F[e+40>>2]=0;F[e+44>>2]=0;F[e+32>>2]=0;F[e+36>>2]=0;F[e+24>>2]=0;F[e+28>>2]=0;F[e+16>>2]=0;F[e+20>>2]=0;F[e+8>>2]=0;F[e+12>>2]=0;h=e+8|0;oa:{pa:{if(!H[c+38>>1]){break pa}if(!Ta(1,h+12|0,c)){break pa}b=F[c+8>>2];d=F[c+16>>2];f=b-d|0;i=F[h+12>>2];b=F[c+12>>2]-(F[c+20>>2]+(b>>>0<d>>>0)|0)|0;if(f>>>0<i>>>6>>>0&(b|0)<=0|(b|0)<0){break pa}b=F[h>>2];a=F[h+4>>2]-b>>2;qa:{if(a>>>0<i>>>0){qa(h,i-a|0);i=F[h+12>>2];break qa}if(a>>>0<=i>>>0){break qa}F[h+4>>2]=b+(i<<2)}g=1;if(!i){break oa}f=F[c+16>>2];d=F[c+20>>2];s=F[h>>2];j=F[c+8>>2];n=F[c+12>>2];b=0;while(1){g=0;if((d|0)>=(n|0)&f>>>0>=j>>>0|(d|0)>(n|0)){break oa}g=F[c>>2];p=G[g+f|0];a=d;f=f+1|0;a=f?a:a+1|0;F[c+16>>2]=f;d=a;F[c+20>>2]=a;a=p>>>2|0;l=0;ra:{sa:{ta:{ua:{t=p&3;switch(t|0){case 0:break sa;case 3:break ua;default:break ta}}a=a+b|0;g=0;if(a>>>0>=i>>>0){break oa}ma(s+(b<<2)|0,0,(p&252)+4|0);b=a;break ra}while(1){if((f|0)==(j|0)&(d|0)==(n|0)){break pa}i=G[f+g|0];f=f+1|0;d=f?d:d+1|0;F[c+16>>2]=f;F[c+20>>2]=d;a=i<<(l<<3|6)|a;l=l+1|0;if((t|0)!=(l|0)){continue}break}}F[s+(b<<2)>>2]=a}b=b+1|0;i=F[h+12>>2];if(b>>>0<i>>>0){continue}break}a=h+16|0;n=F[h>>2];d=F[h+16>>2];b=F[h+20>>2]-d|0;va:{if(b>>>0<=2097151){qa(a,524288-(b>>>2|0)|0);break va}if((b|0)==2097152){break va}F[h+20>>2]=d+2097152}d=h+28|0;b=F[d>>2];f=F[h+32>>2]-b>>3;wa:{if(f>>>0<i>>>0){_a(d,i-f|0);b=F[d>>2];break wa}if(f>>>0>i>>>0){F[h+32>>2]=(i<<3)+b}if(!i){break pa}}j=F[a>>2];f=0;d=0;while(1){g=n+(f<<2)|0;l=F[g>>2];h=(f<<3)+b|0;a=d;F[h+4>>2]=a;F[h>>2]=l;g=F[g>>2];d=g+a|0;if(d>>>0>524288){break pa}xa:{if(a>>>0>=d>>>0){break xa}l=0;h=g&7;if(h){while(1){F[j+(a<<2)>>2]=f;a=a+1|0;l=l+1|0;if((h|0)!=(l|0)){continue}break}}if(g-1>>>0<=6){break xa}while(1){g=j+(a<<2)|0;F[g>>2]=f;F[g+28>>2]=f;F[g+24>>2]=f;F[g+20>>2]=f;F[g+16>>2]=f;F[g+12>>2]=f;F[g+8>>2]=f;F[g+4>>2]=f;a=a+8|0;if((d|0)!=(a|0)){continue}break}}f=f+1|0;if((i|0)!=(f|0)){continue}break}k=(d|0)==524288}g=k}ya:{if(!g|(F[e+20>>2]?0:o)){break ya}d=0;k=Z-16|0;Z=k;za:{if(!Sa(1,k+8|0,c)){break za}a=F[c+8>>2];f=F[c+16>>2];g=a-f|0;j=F[k+12>>2];i=F[c+20>>2];a=F[c+12>>2]-(i+(a>>>0<f>>>0)|0)|0;b=F[k+8>>2];if((j|0)==(a|0)&g>>>0<b>>>0|a>>>0<j>>>0){break za}a=i+j|0;g=b+f|0;a=g>>>0<f>>>0?a+1|0:a;F[c+16>>2]=g;F[c+20>>2]=a;if((b|0)<=0){break za}a=f+F[c>>2]|0;F[e+48>>2]=a;c=b-1|0;f=c+a|0;g=G[f|0];Aa:{if(g>>>0<=63){F[e+52>>2]=c;a=G[f|0]&63;break Aa}Ba:{switch((g>>>6|0)-1|0){case 0:if(b>>>0<2){break za}b=b-2|0;F[e+52>>2]=b;a=a+b|0;a=G[a+1|0]<<8&16128|G[a|0];break Aa;case 1:if(b>>>0<3){break za}b=b-3|0;F[e+52>>2]=b;a=a+b|0;a=G[a+1|0]<<8|G[a+2|0]<<16&4128768|G[a|0];break Aa;default:break Ba}}b=b-4|0;F[e+52>>2]=b;a=a+b|0;a=(G[a|0]|G[a+1|0]<<8|(G[a+2|0]<<16|G[a+3|0]<<24))&1073741823}F[e+56>>2]=a+2097152;d=a>>>0<534773760}Z=k+16|0;if(!d){break ya}if(!o){m=1;break ya}b=F[e+52>>2];a=F[e+56>>2];c=F[e+36>>2];d=F[e+48>>2];f=F[e+24>>2];while(1){Ca:{if(a>>>0>2097151){break Ca}while(1){if((b|0)<=0){break Ca}b=b-1|0;F[e+52>>2]=b;a=G[b+d|0]|a<<8;F[e+56>>2]=a;if(a>>>0<2097152){continue}break}}m=a&524287;k=F[f+(m<<2)>>2];g=c+(k<<3)|0;a=(L(F[g>>2],a>>>19|0)+m|0)-F[g+4>>2]|0;F[e+56>>2]=a;F[r+(q<<2)>>2]=k;m=1;q=q+1|0;if((o|0)!=(q|0)){continue}break}}a=F[e+36>>2];if(a){F[e+40>>2]=a;ja(a)}a=F[e+24>>2];if(a){F[e+28>>2]=a;ja(a)}a=F[e+8>>2];if(a){F[e+12>>2]=a;ja(a)}Z=e- -64|0;b=m;break g;case 17:b=Ld(a,c,d);break g;case 0:case 1:case 2:case 3:case 4:case 5:case 6:case 7:b=Z+-64|0;Z=b;F[b+56>>2]=0;F[b+48>>2]=0;F[b+52>>2]=0;F[b+40>>2]=0;F[b+44>>2]=0;F[b+32>>2]=0;F[b+36>>2]=0;F[b+24>>2]=0;F[b+28>>2]=0;F[b+16>>2]=0;F[b+20>>2]=0;F[b+8>>2]=0;F[b+12>>2]=0;Da:{if(!Nd(b+8|0,c)|(F[b+20>>2]?0:a)){break Da}if(!Md(b+8|0,c)){break Da}if(!a){f=1;break Da}m=F[b+52>>2];c=F[b+56>>2];e=F[b+36>>2];g=F[b+48>>2];o=F[b+24>>2];while(1){Ea:{if(c>>>0>16383){break Ea}while(1){if((m|0)<=0){break Ea}m=m-1|0;F[b+52>>2]=m;c=G[g+m|0]|c<<8;F[b+56>>2]=c;if(c>>>0<16384){continue}break}}f=c&4095;j=F[o+(f<<2)>>2];r=e+(j<<3)|0;c=(L(F[r>>2],c>>>12|0)+f|0)-F[r+4>>2]|0;F[b+56>>2]=c;F[(k<<2)+d>>2]=j;f=1;k=k+1|0;if((k|0)!=(a|0)){continue}break}}a=F[b+36>>2];if(a){F[b+40>>2]=a;ja(a)}a=F[b+24>>2];if(a){F[b+28>>2]=a;ja(a)}a=F[b+8>>2];if(a){F[b+12>>2]=a;ja(a)}Z=b- -64|0;b=f;break g;case 13:case 14:case 15:case 16:break h;default:break g}}b=Ld(a,c,d)}f=b}return f}function ih(a){a=a|0;var b=0,c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,J=0,K=0,M=0,N=0,O=0,P=0;u=Z+-64|0;Z=u;F[a+132>>2]=0;if(F[a+148>>2]){b=F[a+144>>2];if(b){while(1){f=F[b>>2];ja(b);b=f;if(b){continue}break}}b=0;F[a+144>>2]=0;f=F[a+140>>2];a:{if(!f){break a}if(f>>>0>=4){c=f&-4;while(1){e=b<<2;F[e+F[a+136>>2]>>2]=0;F[F[a+136>>2]+(e|4)>>2]=0;F[F[a+136>>2]+(e|8)>>2]=0;F[F[a+136>>2]+(e|12)>>2]=0;b=b+4|0;d=d+4|0;if((c|0)!=(d|0)){continue}break}}f=f&3;if(!f){break a}d=0;while(1){F[F[a+136>>2]+(b<<2)>>2]=0;b=b+1|0;d=d+1|0;if((f|0)!=(d|0)){continue}break}}F[a+148>>2]=0}b:{c:{if(!Da(1,u+60|0,F[F[a+4>>2]+32>>2])){break c}F[a+156>>2]=F[u+60>>2];if(!Da(1,u+56|0,F[F[a+4>>2]+32>>2])){break c}e=F[u+56>>2];if(e>>>0>1431655765|I[a+156>>2]>L(e,3)>>>0){break c}b=F[F[a+4>>2]+32>>2];c=F[b+8>>2];k=F[b+12>>2];d=F[b+20>>2];f=F[b+16>>2];if((k|0)<=(d|0)&f>>>0>=c>>>0|(d|0)>(k|0)){break c}k=G[f+F[b>>2]|0];f=f+1|0;d=f?d:d+1|0;F[b+16>>2]=f;F[b+20>>2]=d;if(!Da(1,u+52|0,b)){break c}q=F[u+52>>2];if(q>>>0>e>>>0|e>>>0>q+((q>>>0)/3|0)>>>0){break c}if(!Da(1,u+48|0,F[F[a+4>>2]+32>>2])){break c}d=F[u+48>>2];if(d>>>0>q>>>0){break c}F[a+28>>2]=F[a+24>>2];f=Zb(ka(88));b=F[a+8>>2];F[a+8>>2]=f;if(b){Za(b);if(!F[a+8>>2]){break c}}F[a+164>>2]=F[a+160>>2];Ib(a+160|0,e);F[a+176>>2]=F[a+172>>2];Ib(a+172|0,e);F[a- -64>>2]=0;F[a+92>>2]=-1;F[a+84>>2]=-1;F[a+88>>2]=-1;F[a+40>>2]=F[a+36>>2];F[a+52>>2]=F[a+48>>2];F[a+76>>2]=F[a+72>>2];A=a+216|0;Dd(A);Cd(A,k);if(!_c(F[a+8>>2],e,d+F[a+156>>2]|0)){break c}b=F[a+156>>2];D[u+8|0]=1;Ea(a+120|0,b+d|0,u+8|0);if((Bd(a,F[F[a+4>>2]+32>>2])|0)==-1){break c}c=a+232|0;b=c;F[b+144>>2]=a;f=F[($[F[F[a>>2]+32>>2]](a)|0)+32>>2];f=F[f>>2]+F[f+16>>2]|0;e=F[($[F[F[a>>2]+32>>2]](a)|0)+32>>2];e=F[e+8>>2]-F[e+16>>2]|0;O=b,P=H[F[($[F[F[a>>2]+32>>2]](a)|0)+32>>2]+38>>1],E[O+38>>1]=P;F[b>>2]=f;F[b+16>>2]=0;F[b+20>>2]=0;F[b+8>>2]=e;F[b+12>>2]=0;O=b,P=$[F[F[a>>2]+36>>2]](a)|0,F[O+148>>2]=P;F[a+372>>2]=k;F[a+384>>2]=d+F[a+156>>2];K=Ja(u+8|0);k=K;f=0;j=Z-16|0;Z=j;d:{if(!Aa(b+80|0,b)){break d}if(!yd(c)){break d}b=F[c+4>>2];F[k>>2]=F[c>>2];F[k+4>>2]=b;b=F[c+36>>2];F[k+32>>2]=F[c+32>>2];F[k+36>>2]=b;b=F[c+28>>2];F[k+24>>2]=F[c+24>>2];F[k+28>>2]=b;b=F[c+20>>2];F[k+16>>2]=F[c+16>>2];F[k+20>>2]=b;b=F[c+12>>2];F[k+8>>2]=F[c+8>>2];F[k+12>>2]=b;F[c+176>>2]=2;F[c+180>>2]=7;b=F[c+152>>2];if((b|0)<0){break d}F[j+12>>2]=0;f=2;h=F[c+156>>2];e=F[c+160>>2]-h>>2;e:{if(e>>>0<b>>>0){Fa(c+156|0,b-e|0,j+12|0);f=F[c+176>>2];d=F[c+180>>2];break e}d=7;if(b>>>0>=e>>>0){break e}F[c+160>>2]=h+(b<<2)}e=c+184|0;d=(d-f|0)+1|0;b=F[c+188>>2];f=F[c+184>>2];s=(b-f|0)/12|0;f:{if(d>>>0>s>>>0){h=0;b=d-s|0;o=F[e+8>>2];f=F[e+4>>2];g:{if(b>>>0<=(o-f|0)/12>>>0){if(b){b=L(b,12)-12|0;b=(b-((b>>>0)%12|0)|0)+12|0;f=ma(f,0,b)+b|0}F[e+4>>2]=f;break g}h:{i:{j:{s=F[e>>2];g=(f-s|0)/12|0;d=g+b|0;if(d>>>0<357913942){o=(o-s|0)/12|0;i=o<<1;o=o>>>0>=178956970?357913941:d>>>0<i>>>0?i:d;if(o){if(o>>>0>=357913942){break j}h=ka(L(o,12))}d=L(g,12)+h|0;b=L(b,12)-12|0;g=(b-((b>>>0)%12|0)|0)+12|0;b=ma(d,0,g);g=b+g|0;h=L(o,12)+h|0;if((f|0)==(s|0)){break i}while(1){d=d-12|0;f=f-12|0;F[d>>2]=F[f>>2];F[d+4>>2]=F[f+4>>2];F[d+8>>2]=F[f+8>>2];F[f+8>>2]=0;F[f>>2]=0;F[f+4>>2]=0;if((f|0)!=(s|0)){continue}break}F[e+8>>2]=h;b=F[e+4>>2];F[e+4>>2]=g;f=F[e>>2];F[e>>2]=d;if((b|0)==(f|0)){break h}while(1){d=b-12|0;h=F[d>>2];if(h){F[b-8>>2]=h;ja(h)}b=d;if((f|0)!=(b|0)){continue}break}break h}break b}oa();v()}F[e+8>>2]=h;F[e+4>>2]=g;F[e>>2]=b}if(f){ja(f)}}d=F[c+188>>2];break f}if(d>>>0>=s>>>0){d=b;break f}d=f+L(d,12)|0;if((d|0)!=(b|0)){while(1){f=b-12|0;h=F[f>>2];if(h){F[b-8>>2]=h;ja(h)}b=f;if((d|0)!=(b|0)){continue}break}}F[c+188>>2]=d}s=c+196|0;f=F[c+184>>2];b=(d-f|0)/12|0;o=F[c+196>>2];h=F[c+200>>2]-o>>2;k:{if(b>>>0>h>>>0){qa(s,b-h|0);f=F[c+184>>2];d=F[c+188>>2];break k}if(b>>>0>=h>>>0){break k}F[c+200>>2]=o+(b<<2)}if((d|0)==(f|0)){f=1;break d}b=0;while(1){l:{if(!Da(1,j+8|0,k)){break l}f=F[j+8>>2];d=F[c+148>>2];if(f>>>0>(F[d+4>>2]-F[d>>2]>>2>>>0)/3>>>0){break l}if(f){g=L(b,12);h=g+F[e>>2]|0;d=F[h>>2];o=F[h+4>>2]-d>>2;m:{if(o>>>0<f>>>0){qa(h,f-o|0);d=F[g+F[e>>2]>>2];break m}if(f>>>0>=o>>>0){break m}F[h+4>>2]=(f<<2)+d}mc(f,1,k,d);F[F[s>>2]+(b<<2)>>2]=f}f=1;b=b+1|0;if(b>>>0<(F[c+188>>2]-F[c+184>>2]|0)/12>>>0){continue}break d}break}f=0}Z=j+16|0;n:{if(!f){break n}e=0;c=0;d=0;b=0;k=0;f=0;s=0;o=0;l=Z-96|0;Z=l;F[l+72>>2]=0;F[l+64>>2]=0;F[l+68>>2]=0;F[l+48>>2]=0;F[l+52>>2]=0;F[l+40>>2]=0;F[l+44>>2]=0;F[l+56>>2]=1065353216;F[l+32>>2]=0;F[l+24>>2]=0;F[l+28>>2]=0;j=a;C=F[a+124>>2];o:{p:{q:{r:{s:{if((q|0)<=0){break s}J=j+232|0;M=F[j+216>>2]!=F[j+220>>2];B=1;t:{while(1){h=s;s=h+1|0;u:{v:{w:{g=F[j+404>>2];if((g|0)==-1){F[j+400>>2]=7;break w}a=-1;i=F[j+428>>2]+(g<<2)|0;m=F[i>>2];g=m-1|0;F[i>>2]=g;if((m|0)<=0){break r}g=F[F[F[j+416>>2]+L(F[j+404>>2],12)>>2]+(g<<2)>>2];if(g>>>0>4){break r}i=F[(g<<2)+8896>>2];F[j+400>>2]=i;if(!g){if((b|0)==(c|0)){break r}i=-1;m=F[j+8>>2];B=F[m+24>>2];t=c-4|0;e=F[t>>2];g=-1;x:{if((e|0)==-1){break x}p=e+1|0;p=(p>>>0)%3|0?p:e-2|0;g=-1;if((p|0)==-1){break x}g=F[F[m>>2]+(p<<2)>>2]}n=F[B+(g<<2)>>2];if((n|0)!=-1){i=n+1|0;i=(i>>>0)%3|0?i:n-2|0}if((e|0)!=-1&F[F[m+12>>2]+(e<<2)>>2]!=-1|(e|0)==(i|0)){break r}n=F[m+12>>2];if((i|0)!=-1&F[n+(i<<2)>>2]!=-1){break r}p=L(h,3);h=p+1|0;F[n+(e<<2)>>2]=h;x=h<<2;F[x+n>>2]=e;r=p+2|0;F[n+(i<<2)>>2]=r;w=r<<2;F[w+n>>2]=i;n=-1;h=-1;y:{if((e|0)==-1){break y}z:{if((e>>>0)%3|0){e=e-1|0;break z}e=e+2|0;h=-1;if((e|0)==-1){break y}}h=F[F[m>>2]+(e<<2)>>2]}e=h;A:{if((i|0)==-1){break A}h=i+1|0;h=(h>>>0)%3|0?h:i-2|0;if((h|0)==-1){break A}n=F[F[m>>2]+(h<<2)>>2]}if((e|0)==(g|0)|(g|0)==(n|0)){break r}a=F[m>>2];F[a+(p<<2)>>2]=g;F[a+x>>2]=n;F[a+w>>2]=e;if((e|0)!=-1){F[B+(e<<2)>>2]=r}a=F[j+120>>2]+(g>>>3&536870908)|0;e=F[a>>2];O=a,P=oi(g)&e,F[O>>2]=P;F[t>>2]=p;e=b;kc(J,p);break u}B:{switch(i-1|0){case 2:case 4:if((b|0)==(c|0)){break r}r=c-4|0;e=F[r>>2];i=F[j+8>>2];m=F[i+12>>2];if((e|0)!=-1&F[m+(e<<2)>>2]!=-1){break r}c=L(h,3);n=(g|0)==3;g=c+(n?2:1)|0;t=g<<2;F[t+m>>2]=e;F[m+(e<<2)>>2]=g;Ma(i+24|0,8324);p=F[j+8>>2];m=F[p+24>>2];if(F[p+28>>2]-m>>2>(C|0)){break r}a=F[p>>2];w=a+t|0;p=F[i+28>>2];i=F[i+24>>2];t=(p-i>>2)-1|0;F[w>>2]=t;if((i|0)!=(p|0)){F[m+(t<<2)>>2]=g}g=n?c:c+2|0;w=a+(c+n<<2)|0;C:{if((e|0)==-1){F[a+(g<<2)>>2]=-1;i=-1;break C}D:{E:{F:{if((e>>>0)%3|0){i=e-1|0;break F}i=e+2|0;if((i|0)==-1){break E}}i=F[a+(i<<2)>>2];F[a+(g<<2)>>2]=i;if((i|0)==-1){break D}F[m+(i<<2)>>2]=g;break D}F[a+(g<<2)>>2]=-1}i=e+1|0;e=(i>>>0)%3|0?i:e-2|0;i=-1;if((e|0)==-1){break C}i=F[a+(e<<2)>>2]}F[w>>2]=i;F[r>>2]=c;e=b;break v;case 6:break w;case 0:break B;default:break r}}if((e|0)==(c|0)){break r}f=c-4|0;m=F[f>>2];F[l+68>>2]=f;n=F[l+44>>2];G:{if(!n){break G}g=F[l+40>>2];p=ni(n)>>>0>1;a=h&n+2147483647;H:{if(!p){break H}a=h;if(a>>>0<n>>>0){break H}a=(h>>>0)%(n>>>0)|0}i=a;a=F[g+(i<<2)>>2];if(!a){break G}a=F[a>>2];if(!a){break G}I:{if(!p){g=n-1|0;while(1){n=F[a+4>>2];J:{if((n|0)!=(h|0)){if((i|0)==(g&n)){break J}break G}if((h|0)==F[a+8>>2]){break I}}a=F[a>>2];if(a){continue}break}break G}while(1){g=F[a+4>>2];K:{if((g|0)!=(h|0)){if(g>>>0>=n>>>0){g=(g>>>0)%(n>>>0)|0}if((g|0)==(i|0)){break K}break G}if((h|0)==F[a+8>>2]){break I}}a=F[a>>2];if(a){continue}break}break G}if((f|0)!=(k|0)){F[f>>2]=F[a+12>>2];F[l+68>>2]=c;f=c;break G}b=k-e|0;c=b>>2;d=c+1|0;if(d>>>0>=1073741824){break b}f=b>>>1|0;d=b>>>0>=2147483644?1073741823:d>>>0<f>>>0?f:d;if(d){if(d>>>0>=1073741824){break p}f=ka(d<<2)}else{f=0}b=f+(c<<2)|0;F[b>>2]=F[a+12>>2];d=f+(d<<2)|0;f=b+4|0;if((e|0)!=(k|0)){while(1){b=b-4|0;k=k-4|0;F[b>>2]=F[k>>2];if((e|0)!=(k|0)){continue}break}}F[l+72>>2]=d;F[l+68>>2]=f;F[l+64>>2]=b;if(e){ja(e)}e=b;k=d}if((e|0)==(f|0)){break t}x=f-4|0;a=F[x>>2];if((a|0)==(m|0)){break t}i=(a|0)==-1;g=F[j+8>>2];if(!i&F[F[g+12>>2]+(a<<2)>>2]!=-1){break t}n=F[g+12>>2];if((m|0)!=-1&F[n+(m<<2)>>2]!=-1){break t}p=L(h,3);t=p+2|0;F[n+(a<<2)>>2]=t;c=t<<2;F[c+n>>2]=a;h=p+1|0;F[n+(m<<2)>>2]=h;w=h<<2;F[w+n>>2]=m;L:{M:{N:{if(!i){if((a>>>0)%3|0){h=a-1|0;break N}h=a+2|0;if((h|0)!=-1){break N}i=F[g>>2];h=-1;break M}h=-1;i=F[g>>2];F[i+(p<<2)>>2]=-1;r=-1;break L}i=F[g>>2];h=F[i+(h<<2)>>2]}F[(p<<2)+i>>2]=h;r=a+1|0;a=(r>>>0)%3|0?r:a-2|0;r=-1;if((a|0)==-1){break L}r=F[(a<<2)+i>>2]}F[i+w>>2]=r;O:{if((m|0)==-1){F[c+i>>2]=-1;r=-1;c=-1;break O}P:{Q:{R:{if((m>>>0)%3|0){a=m-1|0;break R}a=m+2|0;if((a|0)==-1){break Q}}a=F[(a<<2)+i>>2];F[c+i>>2]=a;if((a|0)==-1){break P}F[F[g+24>>2]+(a<<2)>>2]=t;break P}F[c+i>>2]=-1}r=-1;a=m+1|0;a=(a>>>0)%3|0?a:m-2|0;c=-1;if((a|0)==-1){break O}r=F[(a<<2)+i>>2];c=a}a=F[j+388>>2];t=h<<2;m=a+t|0;w=a;a=r<<2;F[m>>2]=F[m>>2]+F[w+a>>2];w=a;a=F[g+24>>2];m=w+a|0;if((h|0)!=-1){F[a+t>>2]=F[m>>2]}a=c;while(1){if((a|0)!=-1){F[(a<<2)+i>>2]=h;t=a+1|0;a=(t>>>0)%3|0?t:a-2|0;g=-1;S:{if((a|0)==-1){break S}a=F[n+(a<<2)>>2];g=-1;if((a|0)==-1){break S}g=a+1|0;g=(g>>>0)%3|0?g:a-2|0}a=g;if((c|0)!=(a|0)){continue}break t}break}F[m>>2]=-1;T:{U:{if(M){break U}if((y|0)!=(z|0)){F[z>>2]=r;z=z+4|0;F[l+28>>2]=z;break U}a=y-o|0;g=a>>2;c=g+1|0;if(c>>>0>=1073741824){break T}h=a>>>1|0;h=a>>>0>=2147483644?1073741823:c>>>0<h>>>0?h:c;if(h){if(h>>>0>=1073741824){break p}c=ka(h<<2)}else{c=0}a=c+(g<<2)|0;F[a>>2]=r;z=a+4|0;if((o|0)!=(y|0)){while(1){a=a-4|0;y=y-4|0;F[a>>2]=F[y>>2];if((o|0)!=(y|0)){continue}break}}y=c+(h<<2)|0;F[l+32>>2]=y;F[l+28>>2]=z;F[l+24>>2]=a;if(o){ja(o)}o=a}F[x>>2]=p;c=f;kc(J,p);break u}break b}g=F[j+8>>2];Ma(g+24|0,8324);a=-1;k=F[j+8>>2];f=L(h,3);i=F[g+28>>2];m=F[g+24>>2];n=i-m|0;g=n>>2;p=g-1|0;F[F[k>>2]+(f<<2)>>2]=p;Ma(k+24|0,8324);r=f+1|0;F[F[k>>2]+(r<<2)>>2]=(F[k+28>>2]-F[k+24>>2]>>2)-1;k=F[j+8>>2];Ma(k+24|0,8324);t=f+2|0;F[F[k>>2]+(t<<2)>>2]=(F[k+28>>2]-F[k+24>>2]>>2)-1;x=F[j+8>>2];k=F[x+24>>2];if(F[x+28>>2]-k>>2>(C|0)){break r}V:{W:{if((i|0)!=(m|0)){F[k+(p<<2)>>2]=f;a=0;if((n|0)==-4){break W}}F[k+(g<<2)>>2]=r;a=g+1|0;if((a|0)==-1){break V}}F[k+(a<<2)>>2]=t}if((d|0)!=(c|0)){F[c>>2]=f;f=c+4|0;F[l+68>>2]=f;k=d;break v}a=d-b|0;k=a>>2;e=k+1|0;if(e>>>0>=1073741824){break b}c=a>>>1|0;a=a>>>0>=2147483644?1073741823:e>>>0<c>>>0?c:e;if(a){if(a>>>0>=1073741824){break p}c=ka(a<<2)}else{c=0}e=c+(k<<2)|0;F[e>>2]=f;k=c+(a<<2)|0;f=e+4|0;if((b|0)!=(d|0)){while(1){e=e-4|0;d=d-4|0;F[e>>2]=F[d>>2];if((b|0)!=(d|0)){continue}break}}F[l+72>>2]=k;F[l+68>>2]=f;F[l+64>>2]=e;if(b){ja(b)}d=k;b=e}kc(J,F[f-4>>2]);a=F[j+40>>2];X:{if((a|0)==F[j+36>>2]){break X}c=a-12|0;g=F[c+4>>2];h=q+(h^-1)|0;if(g>>>0>h>>>0){break t}if((g|0)!=(h|0)){break X}i=G[a-4|0];g=F[c>>2];F[j+40>>2]=c;if((g|0)<0){break t}m=f-4|0;a=F[m>>2];F[l+20>>2]=q+(g^-1);c=l+20|0;F[l+88>>2]=c;Fb(l,l+40|0,c,l+88|0);g=F[l>>2];Y:{if(i&1){c=-1;if((a|0)==-1){break Y}c=a+1|0;c=(c>>>0)%3|0?c:a-2|0;break Y}c=-1;if((a|0)==-1){break Y}c=a-1|0;if((a>>>0)%3|0){break Y}c=a+2|0}F[g+12>>2]=c;a=F[j+40>>2];if((a|0)==F[j+36>>2]){break X}while(1){c=a-12|0;g=F[c+4>>2];if(g>>>0>h>>>0){break t}if((g|0)!=(h|0)){break X}i=G[a-4|0];g=F[c>>2];F[j+40>>2]=c;if((g|0)<0){break t}a=F[m>>2];F[l+20>>2]=q+(g^-1);c=l+20|0;F[l+88>>2]=c;Fb(l,l+40|0,c,l+88|0);g=F[l>>2];Z:{if(i&1){c=-1;if((a|0)==-1){break Z}c=a+1|0;c=(c>>>0)%3|0?c:a-2|0;break Z}c=-1;if((a|0)==-1){break Z}c=a-1|0;if((a>>>0)%3|0){break Z}c=a+2|0}F[g+12>>2]=c;a=F[j+40>>2];if((a|0)!=F[j+36>>2]){continue}break}}c=f}B=(q|0)>(s|0);if((q|0)!=(s|0)){continue}break}s=q;break s}a=-1;if(B){break r}}a=-1;c=F[j+8>>2];if(F[c+28>>2]-F[c+24>>2]>>2>(C|0)){break r}if((b|0)!=(f|0)){m=j+72|0;k=j+60|0;n=j+312|0;while(1){f=f-4|0;q=F[f>>2];F[l+68>>2]=f;_:{if(wa(n)){g=F[j+8>>2];o=F[g>>2];if(((F[g+4>>2]-o>>2>>>0)/3|0)<=(s|0)){a=-1;break r}b=-1;i=F[g+24>>2];a=-1;$:{if((q|0)==-1){break $}e=q+1|0;e=(e>>>0)%3|0?e:q-2|0;a=-1;if((e|0)==-1){break $}a=F[o+(e<<2)>>2]}e=a;a=F[i+(e<<2)>>2];aa:{if((a|0)==-1){h=1;c=-1;break aa}h=1;c=-1;d=a+1|0;a=(d>>>0)%3|0?d:a-2|0;if((a|0)==-1){break aa}h=0;b=a+1|0;b=(b>>>0)%3|0?b:a-2|0;if((b|0)!=-1){c=F[o+(b<<2)>>2]}b=a}a=-1;d=-1;i=F[i+(c<<2)>>2];if((i|0)!=-1){d=i+1|0;d=(d>>>0)%3|0?d:i-2|0}if((b|0)==(q|0)|(d|0)==(q|0)|((q|0)!=-1&F[F[g+12>>2]+(q<<2)>>2]!=-1|(b|0)==(d|0))){break r}if(!h&F[F[g+12>>2]+(b<<2)>>2]!=-1){break r}h=-1;g=F[g+12>>2];i=-1;ba:{if((d|0)==-1){break ba}if(F[g+(d<<2)>>2]!=-1){break r}a=d+1|0;a=(a>>>0)%3|0?a:d-2|0;i=-1;if((a|0)==-1){break ba}i=F[o+(a<<2)>>2]}a=L(s,3);F[l>>2]=a;F[g+(a<<2)>>2]=q;F[g+(q<<2)>>2]=a;a=F[l>>2]+1|0;F[g+(a<<2)>>2]=b;F[g+(b<<2)>>2]=a;a=F[l>>2]+2|0;F[g+(a<<2)>>2]=d;F[g+(d<<2)>>2]=a;a=F[l>>2];F[o+(a<<2)>>2]=c;b=a+1|0;d=o+(b<<2)|0;F[d>>2]=i;q=a+2|0;o=o+(q<<2)|0;F[o>>2]=e;a=F[j+120>>2];e=b?c:-1;c=a+(e>>>3&536870908)|0;g=F[c>>2];O=c,P=oi(e)&g,F[O>>2]=P;h=(b|0)!=-1?F[d>>2]:h;b=a+(h>>>3&536870908)|0;d=F[b>>2];O=b,P=oi(h)&d,F[O>>2]=P;d=-1;d=(q|0)!=-1?F[o>>2]:d;a=a+(d>>>3&536870908)|0;b=F[a>>2];O=a,P=oi(d)&b,F[O>>2]=P;D[l+88|0]=1;wd(k,l+88|0);Ma(m,l);s=s+1|0;b=F[l+64>>2];break _}d=F[j+64>>2];a=F[j+68>>2];if((d|0)==a<<5){if((d+1|0)<0){break b}if(d>>>0<=1073741822){a=a<<6;d=(d&-32)+32|0;a=a>>>0>d>>>0?a:d}else{a=2147483647}$a(k,a);d=F[j+64>>2]}F[j+64>>2]=d+1;a=F[j+60>>2]+(d>>>3&536870908)|0;e=F[a>>2];O=a,P=oi(d)&e,F[O>>2]=P;d=F[j+76>>2];if((d|0)!=F[j+80>>2]){F[d>>2]=q;F[j+76>>2]=d+4;break _}c=F[m>>2];a=d-c|0;o=a>>2;e=o+1|0;if(e>>>0>=1073741824){break b}h=a>>>1|0;h=a>>>0>=2147483644?1073741823:e>>>0<h>>>0?h:e;if(h){if(h>>>0>=1073741824){break p}a=ka(h<<2)}else{a=0}e=a+(o<<2)|0;F[e>>2]=q;q=e+4|0;if((d|0)!=(c|0)){while(1){e=e-4|0;d=d-4|0;F[e>>2]=F[d>>2];if((d|0)!=(c|0)){continue}break}}F[j+80>>2]=a+(h<<2);F[j+76>>2]=q;F[j+72>>2]=e;if(!c){break _}ja(c)}if((b|0)!=(f|0)){continue}break}c=F[j+8>>2]}a=-1;if(((F[c+4>>2]-F[c>>2]>>2>>>0)/3|0)!=(s|0)){break r}a=F[c+28>>2]-F[c+24>>2]>>2;f=F[l+24>>2];h=F[l+28>>2];if((f|0)==(h|0)){break q}while(1){b=F[f>>2];k=F[c+24>>2];d=a-1|0;e=k+(d<<2)|0;if(F[e>>2]==-1){while(1){d=a-2|0;a=a-1|0;e=k+(d<<2)|0;if(F[e>>2]==-1){continue}break}}if(b>>>0<=d>>>0){F[l>>2]=c;e=F[e>>2];D[l+12|0]=1;F[l+8>>2]=e;F[l+4>>2]=e;if((e|0)!=-1){while(1){e=F[F[j+8>>2]>>2]+(e<<2)|0;if(F[e>>2]!=(d|0)){a=-1;break r}F[e>>2]=b;nc(l);e=F[l+8>>2];if((e|0)!=-1){continue}break}c=F[j+8>>2]}k=F[c+24>>2];e=k+(d<<2)|0;if((b|0)!=-1){F[k+(b<<2)>>2]=F[e>>2]}F[e>>2]=-1;e=1<<b;k=F[j+120>>2];b=k+(b>>>3&536870908)|0;k=k+(d>>>3&536870908)|0;d=1<<d;if(F[k>>2]&d){e=e|F[b>>2]}else{e=F[b>>2]&(e^-1)}F[b>>2]=e;F[k>>2]=F[k>>2]&(d^-1);a=a-1|0}f=f+4|0;if((h|0)!=(f|0)){continue}break}}f=F[l+24>>2]}if(f){ja(f)}b=F[l+48>>2];if(b){while(1){d=F[b>>2];ja(b);b=d;if(b){continue}break}}b=F[l+40>>2];F[l+40>>2]=0;if(b){ja(b)}b=F[l+64>>2];if(b){F[l+68>>2]=b;ja(b)}Z=l+96|0;break o}oa();v()}f=a;if((a|0)==-1){break n}a=K;b=F[a+16>>2];d=b+F[a>>2]|0;b=F[a+8>>2]-b|0;a=F[F[j+4>>2]+32>>2];E[a+38>>1]=H[a+38>>1];F[a>>2]=d;F[a+16>>2]=0;F[a+20>>2]=0;F[a+8>>2]=b;F[a+12>>2]=0;ca:{if(F[j+216>>2]==F[j+220>>2]){break ca}a=F[j+8>>2];if(F[a+4>>2]==F[a>>2]){break ca}b=0;while(1){if(Ad(j,b)){b=b+3|0;a=F[j+8>>2];if(b>>>0<F[a+4>>2]-F[a>>2]>>2>>>0){continue}break ca}break}break n}if(G[j+308|0]){D[j+308|0]=0;d=F[j+292>>2];a=0;e=F[j+304>>2]+7|0;a=e>>>0<7?1:a;e=a<<29|e>>>3;b=e+F[j+288>>2]|0;a=(a>>>3|0)+d|0;F[j+288>>2]=b;F[j+292>>2]=b>>>0<e>>>0?a+1|0:a}b=F[j+216>>2];if((b|0)!=F[j+220>>2]){a=0;while(1){e=L(a,144);Zc((e+b|0)+4|0,F[j+8>>2]);d=F[A>>2];c=d+e|0;b=F[c+132>>2];c=F[c+136>>2];if((b|0)!=(c|0)){while(1){Xc((e+F[A>>2]|0)+4|0,F[b>>2]);b=b+4|0;if((c|0)!=(b|0)){continue}break}d=F[A>>2]}if(!Yc((d+e|0)+4|0)){break n}a=a+1|0;b=F[j+216>>2];if(a>>>0<(F[j+220>>2]-b|0)/144>>>0){continue}break}}a=F[j+8>>2];Hb(j+184|0,F[a+28>>2]-F[a+24>>2]>>2);d=F[j+216>>2];if((d|0)!=F[j+220>>2]){b=0;while(1){a=L(b,144)+d|0;d=F[a+60>>2]-F[a+56>>2]>>2;c=a+104|0;a=F[j+8>>2];a=F[a+28>>2]-F[a+24>>2]>>2;Hb(c,(a|0)<(d|0)?d:a);b=b+1|0;d=F[j+216>>2];if(b>>>0<(F[j+220>>2]-d|0)/144>>>0){continue}break}}N=zd(j,f)}}Z=u- -64|0;return N|0}na();v()}function lh(a){a=a|0;var b=0,c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,J=0,K=0,M=0,N=0;t=Z+-64|0;Z=t;F[a+132>>2]=0;if(F[a+148>>2]){c=F[a+144>>2];if(c){while(1){b=F[c>>2];ja(c);c=b;if(b){continue}break}}c=0;F[a+144>>2]=0;b=F[a+140>>2];a:{if(!b){break a}if(b>>>0>=4){h=b&-4;while(1){e=c<<2;F[e+F[a+136>>2]>>2]=0;F[F[a+136>>2]+(e|4)>>2]=0;F[F[a+136>>2]+(e|8)>>2]=0;F[F[a+136>>2]+(e|12)>>2]=0;c=c+4|0;g=g+4|0;if((h|0)!=(g|0)){continue}break}}b=b&3;if(!b){break a}g=0;while(1){F[F[a+136>>2]+(c<<2)>>2]=0;c=c+1|0;g=g+1|0;if((b|0)!=(g|0)){continue}break}}F[a+148>>2]=0}b:{if(!Da(1,t+60|0,F[F[a+4>>2]+32>>2])){break b}F[a+156>>2]=F[t+60>>2];if(!Da(1,t+56|0,F[F[a+4>>2]+32>>2])){break b}e=F[t+56>>2];if(e>>>0>1431655765|I[a+156>>2]>L(e,3)>>>0){break b}c=F[F[a+4>>2]+32>>2];h=F[c+8>>2];m=F[c+12>>2];b=F[c+20>>2];g=F[c+16>>2];if((m|0)<=(b|0)&g>>>0>=h>>>0|(b|0)>(m|0)){break b}h=G[g+F[c>>2]|0];g=g+1|0;b=g?b:b+1|0;F[c+16>>2]=g;F[c+20>>2]=b;if(!Da(1,t+52|0,c)){break b}n=F[t+52>>2];if(n>>>0>e>>>0|e>>>0>n+((n>>>0)/3|0)>>>0){break b}if(!Da(1,t+48|0,F[F[a+4>>2]+32>>2])){break b}c=F[t+48>>2];if(c>>>0>n>>>0){break b}F[a+28>>2]=F[a+24>>2];g=Zb(ka(88));b=F[a+8>>2];F[a+8>>2]=g;if(b){Za(b);if(!F[a+8>>2]){break b}}F[a+164>>2]=F[a+160>>2];Ib(a+160|0,e);F[a+176>>2]=F[a+172>>2];Ib(a+172|0,e);F[a- -64>>2]=0;F[a+92>>2]=-1;F[a+84>>2]=-1;F[a+88>>2]=-1;F[a+40>>2]=F[a+36>>2];F[a+52>>2]=F[a+48>>2];F[a+76>>2]=F[a+72>>2];y=a+216|0;Dd(y);Cd(y,h);if(!_c(F[a+8>>2],e,c+F[a+156>>2]|0)){break b}b=F[a+156>>2];D[t+8|0]=1;Ea(a+120|0,b+c|0,t+8|0);if((Bd(a,F[F[a+4>>2]+32>>2])|0)==-1){break b}c=a+232|0;F[c+144>>2]=a;b=F[($[F[F[a>>2]+32>>2]](a)|0)+32>>2];b=F[b>>2]+F[b+16>>2]|0;g=F[($[F[F[a>>2]+32>>2]](a)|0)+32>>2];g=F[g+8>>2]-F[g+16>>2]|0;M=c,N=H[F[($[F[F[a>>2]+32>>2]](a)|0)+32>>2]+38>>1],E[M+38>>1]=N;F[c>>2]=b;F[c+16>>2]=0;F[c+20>>2]=0;F[c+8>>2]=g;F[c+12>>2]=0;F[a+372>>2]=h;C=Ja(t+8|0);h=C;m=0;d=Z-16|0;Z=d;b=F[c+4>>2];F[c+40>>2]=F[c>>2];F[c+44>>2]=b;b=F[c+36>>2];F[c+72>>2]=F[c+32>>2];F[c+76>>2]=b;g=F[c+28>>2];b=c- -64|0;F[b>>2]=F[c+24>>2];F[b+4>>2]=g;b=F[c+20>>2];F[c+56>>2]=F[c+16>>2];F[c+60>>2]=b;b=F[c+12>>2];F[c+48>>2]=F[c+8>>2];F[c+52>>2]=b;c:{d:{if(hc(c+40|0,1,d+8|0)){b=F[c+44>>2];F[c>>2]=F[c+40>>2];F[c+4>>2]=b;b=F[c+76>>2];F[c+32>>2]=F[c+72>>2];F[c+36>>2]=b;b=F[c+68>>2];F[c+24>>2]=F[c+64>>2];F[c+28>>2]=b;g=F[c+60>>2];f=g;b=F[c+56>>2];F[c+16>>2]=b;F[c+20>>2]=g;e=F[c+52>>2];g=F[c+48>>2];F[c+8>>2]=g;F[c+12>>2]=e;k=F[d+12>>2];i=e-((b>>>0>g>>>0)+f|0)|0;e=g-b|0;g=F[d+8>>2];if((k|0)==(i|0)&e>>>0>=g>>>0|i>>>0>k>>>0){break d}}break c}e=f+k|0;b=b+g|0;e=b>>>0<g>>>0?e+1|0:e;F[c+16>>2]=b;F[c+20>>2]=e;if(!Aa(c+80|0,c)){break c}if(!yd(c)){break c}b=F[c+4>>2];F[h>>2]=F[c>>2];F[h+4>>2]=b;b=F[c+36>>2];F[h+32>>2]=F[c+32>>2];F[h+36>>2]=b;b=F[c+28>>2];F[h+24>>2]=F[c+24>>2];F[h+28>>2]=b;b=F[c+20>>2];F[h+16>>2]=F[c+16>>2];F[h+20>>2]=b;b=F[c+12>>2];F[h+8>>2]=F[c+8>>2];F[h+12>>2]=b;m=1}Z=d+16|0;e:{if(!m){break e}b=0;c=0;g=0;m=0;j=Z-96|0;Z=j;F[j+72>>2]=0;F[j+64>>2]=0;F[j+68>>2]=0;F[j+48>>2]=0;F[j+52>>2]=0;F[j+40>>2]=0;F[j+44>>2]=0;F[j+56>>2]=1065353216;F[j+32>>2]=0;F[j+24>>2]=0;F[j+28>>2]=0;h=a;B=F[a+124>>2];f:{g:{h:{i:{j:{k:{l:{m:{if((n|0)<=0){break m}J=F[h+216>>2]!=F[h+220>>2];z=1;while(1){e=m;m=e+1|0;n:{o:{p:{q:{r:{s:{t:{u:{v:{w:{x:{y:{z:{A:{B:{if(!G[h+308|0]){break B}k=F[h+296>>2];d=F[h+304>>2];a=k+(d>>>3|0)|0;l=F[h+300>>2];if(a>>>0>=l>>>0){break B}f=G[a|0];a=d+1|0;F[h+304>>2]=a;p=f>>>(d&7)&1;if(!p){break B}i=0;f=a>>>3|0;r=k+f|0;C:{if(r>>>0>=l>>>0){d=a;a=0;break C}r=G[r|0];d=d+2|0;F[h+304>>2]=d;f=d>>>3|0;a=r>>>(a&7)&1}f=f+k|0;if(f>>>0<l>>>0){f=G[f|0];F[h+304>>2]=d+1;i=f>>>(d&7)<<1&2}f=-1;i=p|(a|i)<<1;switch(i-1|0){case 6:break y;case 0:break z;case 2:case 4:break A;default:break l}}if((c|0)==(g|0)){f=-1;break l}d=-1;i=F[h+8>>2];z=F[i+24>>2];r=c-4|0;b=F[r>>2];a=-1;D:{if((b|0)==-1){break D}k=b+1|0;k=(k>>>0)%3|0?k:b-2|0;a=-1;if((k|0)==-1){break D}a=F[F[i>>2]+(k<<2)>>2]}f=F[z+(a<<2)>>2];if((f|0)!=-1){d=f+1|0;d=(d>>>0)%3|0?d:f-2|0}if((b|0)==(d|0)){f=-1;break l}if((b|0)!=-1){f=-1;if(F[F[i+12>>2]+(b<<2)>>2]!=-1){break l}}k=F[i+12>>2];if((d|0)!=-1){f=-1;if(F[k+(d<<2)>>2]!=-1){break l}}l=L(e,3);e=l+1|0;F[k+(b<<2)>>2]=e;s=e<<2;F[s+k>>2]=b;p=l+2|0;F[k+(d<<2)>>2]=p;u=p<<2;F[u+k>>2]=d;k=-1;e=-1;E:{if((b|0)==-1){break E}F:{if((b>>>0)%3|0){b=b-1|0;break F}b=b+2|0;e=-1;if((b|0)==-1){break E}}e=F[F[i>>2]+(b<<2)>>2]}b=e;G:{if((d|0)==-1){break G}e=d+1|0;e=(e>>>0)%3|0?e:d-2|0;if((e|0)==-1){break G}k=F[F[i>>2]+(e<<2)>>2]}f=-1;if((a|0)==(b|0)|(a|0)==(k|0)){break l}e=F[i>>2];F[e+(l<<2)>>2]=a;F[e+s>>2]=k;F[e+u>>2]=b;if((b|0)!=-1){F[z+(b<<2)>>2]=p}b=F[h+120>>2]+(a>>>3&536870908)|0;e=F[b>>2];M=b,N=oi(a)&e,F[M>>2]=N;F[r>>2]=l;b=g;break n}if((c|0)==(g|0)){break l}r=c-4|0;b=F[r>>2];a=F[h+8>>2];d=F[a+12>>2];if((b|0)!=-1&F[d+(b<<2)>>2]!=-1){break l}l=(i|0)==5;i=L(e,3);p=(l?2:1)+i|0;s=p<<2;F[s+d>>2]=b;F[d+(b<<2)>>2]=p;Ma(a+24|0,8324);d=F[h+8>>2];k=F[d+24>>2];if(F[d+28>>2]-k>>2>(B|0)){break l}d=F[d>>2];u=d+s|0;f=F[a+28>>2];a=F[a+24>>2];s=(f-a>>2)-1|0;F[u>>2]=s;if((a|0)!=(f|0)){F[k+(s<<2)>>2]=p}f=l?i:i+2|0;l=d+(i+l<<2)|0;H:{if((b|0)==-1){F[d+(f<<2)>>2]=-1;a=-1;break H}I:{J:{K:{if((b>>>0)%3|0){a=b-1|0;break K}a=b+2|0;if((a|0)==-1){break J}}a=F[d+(a<<2)>>2];F[d+(f<<2)>>2]=a;if((a|0)==-1){break I}F[k+(a<<2)>>2]=f;break I}F[d+(f<<2)>>2]=-1}f=b+1|0;b=(f>>>0)%3|0?f:b-2|0;a=-1;if((b|0)==-1){break H}a=F[d+(b<<2)>>2]}F[l>>2]=a;F[r>>2]=i;b=g;break t}if((b|0)==(c|0)){break l}a=c-4|0;k=F[a>>2];F[j+68>>2]=a;l=F[j+44>>2];L:{if(!l){c=a;break L}f=F[j+40>>2];p=ni(l)>>>0>1;d=e&l+2147483647;M:{if(!p){break M}d=e;if(d>>>0<l>>>0){break M}d=(e>>>0)%(l>>>0)|0}i=d;d=F[f+(i<<2)>>2];if(!d){c=a;break L}d=F[d>>2];if(!d){c=a;break L}N:{if(!p){f=l-1|0;while(1){l=F[d+4>>2];O:{if((l|0)!=(e|0)){if((i|0)==(f&l)){break O}c=a;break L}if((e|0)==F[d+8>>2]){break N}}d=F[d>>2];if(d){continue}break}c=a;break L}while(1){f=F[d+4>>2];P:{if((f|0)!=(e|0)){if(f>>>0>=l>>>0){f=(f>>>0)%(l>>>0)|0}if((f|0)==(i|0)){break P}c=a;break L}if((e|0)==F[d+8>>2]){break N}}d=F[d>>2];if(d){continue}break}c=a;break L}if((a|0)!=(q|0)){F[a>>2]=F[d+12>>2];F[j+68>>2]=c;break L}a=q-b|0;g=a>>2;c=g+1|0;if(c>>>0>=1073741824){break x}f=a>>>1|0;f=a>>>0>=2147483644?1073741823:c>>>0<f>>>0?f:c;if(f){if(f>>>0>=1073741824){break j}a=ka(f<<2)}else{a=0}g=a+(g<<2)|0;F[g>>2]=F[d+12>>2];c=g+4|0;if((b|0)!=(q|0)){while(1){g=g-4|0;q=q-4|0;F[g>>2]=F[q>>2];if((b|0)!=(q|0)){continue}break}}q=a+(f<<2)|0;F[j+72>>2]=q;F[j+68>>2]=c;F[j+64>>2]=g;if(b){ja(b)}}if((c|0)==(g|0)){break p}s=c-4|0;b=F[s>>2];if((b|0)==(k|0)){break p}a=(b|0)==-1;f=F[h+8>>2];if(!a&F[F[f+12>>2]+(b<<2)>>2]!=-1){break p}l=F[f+12>>2];if((k|0)!=-1&F[l+(k<<2)>>2]!=-1){break p}p=L(e,3);r=p+2|0;F[l+(b<<2)>>2]=r;e=r<<2;F[e+l>>2]=b;d=p+1|0;F[l+(k<<2)>>2]=d;u=d<<2;F[u+l>>2]=k;if(a){break w}if((b>>>0)%3|0){d=b-1|0;break s}d=b+2|0;if((d|0)!=-1){break s}a=F[f>>2];d=-1;break r}i=F[h+8>>2];Ma(i+24|0,8324);d=F[h+8>>2];a=L(e,3);k=F[i+28>>2];l=F[i+24>>2];p=k-l|0;i=p>>2;r=i-1|0;F[F[d>>2]+(a<<2)>>2]=r;Ma(d+24|0,8324);s=a+1|0;F[F[d>>2]+(s<<2)>>2]=(F[d+28>>2]-F[d+24>>2]>>2)-1;d=F[h+8>>2];Ma(d+24|0,8324);u=a+2|0;F[F[d>>2]+(u<<2)>>2]=(F[d+28>>2]-F[d+24>>2]>>2)-1;A=F[h+8>>2];d=F[A+24>>2];if(F[A+28>>2]-d>>2>(B|0)){break l}Q:{R:{if((k|0)!=(l|0)){F[d+(r<<2)>>2]=a;f=0;if((p|0)==-4){break R}}F[d+(i<<2)>>2]=s;f=i+1|0;if((f|0)==-1){break Q}}F[d+(f<<2)>>2]=u}if((c|0)!=(q|0)){F[c>>2]=a;c=c+4|0;F[j+68>>2]=c;break t}g=c-b|0;i=g>>2;d=i+1|0;if(d>>>0>=1073741824){break v}f=g>>>1|0;d=g>>>0>=2147483644?1073741823:d>>>0<f>>>0?f:d;if(d){if(d>>>0>=1073741824){break j}f=ka(d<<2)}else{f=0}g=f+(i<<2)|0;F[g>>2]=a;q=f+(d<<2)|0;a=g+4|0;if((b|0)!=(c|0)){while(1){g=g-4|0;c=c-4|0;F[g>>2]=F[c>>2];if((b|0)!=(c|0)){continue}break}}F[j+72>>2]=q;F[j+68>>2]=a;F[j+64>>2]=g;if(!b){break u}ja(b);break u}na();v()}d=-1;a=F[f>>2];F[a+(p<<2)>>2]=-1;i=-1;break q}na();v()}c=a;b=g}a=F[h+40>>2];if((a|0)==F[h+36>>2]){break n}d=a-12|0;i=F[d+4>>2];f=n+(e^-1)|0;if(i>>>0>f>>>0){break p}if((f|0)!=(i|0)){break n}i=G[a-4|0];e=F[d>>2];F[h+40>>2]=d;if((e|0)<0){break p}k=c-4|0;a=F[k>>2];F[j+20>>2]=n+(e^-1);e=j+20|0;F[j+88>>2]=e;Fb(j,j+40|0,e,j+88|0);d=F[j>>2];S:{if(i&1){e=-1;if((a|0)==-1){break S}e=a+1|0;e=(e>>>0)%3|0?e:a-2|0;break S}e=-1;if((a|0)==-1){break S}e=a-1|0;if((a>>>0)%3|0){break S}e=a+2|0}F[d+12>>2]=e;d=F[h+40>>2];if((d|0)==F[h+36>>2]){break n}while(1){a=d-12|0;e=F[a+4>>2];if(e>>>0>f>>>0){break p}if((f|0)!=(e|0)){break n}d=G[d-4|0];e=F[a>>2];F[h+40>>2]=a;if((e|0)<0){break p}a=F[k>>2];F[j+20>>2]=n+(e^-1);e=j+20|0;F[j+88>>2]=e;Fb(j,j+40|0,e,j+88|0);i=F[j>>2];T:{if(d&1){e=-1;if((a|0)==-1){break T}e=a+1|0;e=(e>>>0)%3|0?e:a-2|0;break T}e=-1;if((a|0)==-1){break T}e=a-1|0;if((a>>>0)%3|0){break T}e=a+2|0}F[i+12>>2]=e;d=F[h+40>>2];if((d|0)!=F[h+36>>2]){continue}break}break n}a=F[f>>2];d=F[a+(d<<2)>>2]}F[(p<<2)+a>>2]=d;A=b+1|0;b=(A>>>0)%3|0?A:b-2|0;i=-1;if((b|0)==-1){break q}i=F[(b<<2)+a>>2]}F[a+u>>2]=i;U:{if((k|0)==-1){F[a+e>>2]=-1;i=-1;e=-1;break U}V:{W:{X:{if((k>>>0)%3|0){b=k-1|0;break X}b=k+2|0;if((b|0)==-1){break W}}b=F[(b<<2)+a>>2];F[a+e>>2]=b;if((b|0)==-1){break V}F[F[f+24>>2]+(b<<2)>>2]=r;break V}F[a+e>>2]=-1}i=-1;b=k+1|0;b=(b>>>0)%3|0?b:k-2|0;e=-1;if((b|0)==-1){break U}i=F[(b<<2)+a>>2];e=b}b=F[f+24>>2];k=b+(i<<2)|0;if((d|0)!=-1){F[b+(d<<2)>>2]=F[k>>2]}b=e;while(1){if((b|0)==-1){break o}F[(b<<2)+a>>2]=d;r=b+1|0;b=(r>>>0)%3|0?r:b-2|0;f=-1;Y:{if((b|0)==-1){break Y}b=F[l+(b<<2)>>2];f=-1;if((b|0)==-1){break Y}f=b+1|0;f=(f>>>0)%3|0?f:b-2|0}b=f;if((e|0)!=(b|0)){continue}break}}f=-1;if(!z){break m}break l}F[k>>2]=-1;Z:{if(J){break Z}if((w|0)!=(x|0)){F[x>>2]=i;x=x+4|0;F[j+28>>2]=x;break Z}a=w-o|0;d=a>>2;b=d+1|0;if(b>>>0>=1073741824){break i}e=a>>>1|0;e=a>>>0>=2147483644?1073741823:b>>>0<e>>>0?e:b;if(e){if(e>>>0>=1073741824){break j}a=ka(e<<2)}else{a=0}b=a+(d<<2)|0;F[b>>2]=i;x=b+4|0;if((o|0)!=(w|0)){while(1){b=b-4|0;w=w-4|0;F[b>>2]=F[w>>2];if((o|0)!=(w|0)){continue}break}}w=a+(e<<2)|0;F[j+32>>2]=w;F[j+28>>2]=x;F[j+24>>2]=b;if(o){ja(o)}o=b}F[s>>2]=p;b=g}z=(m|0)<(n|0);if((m|0)!=(n|0)){continue}break}m=n}f=-1;a=F[h+8>>2];if(F[a+28>>2]-F[a+24>>2]>>2>(B|0)){break l}if((c|0)!=(g|0)){l=h+72|0;e=h+60|0;w=h+312|0;while(1){c=c-4|0;i=F[c>>2];F[j+68>>2]=c;_:{if(wa(w)){q=F[h+8>>2];k=F[q>>2];if(((F[q+4>>2]-k>>2>>>0)/3|0)<=(m|0)){f=-1;break l}a=-1;f=-1;b=-1;x=F[q+24>>2];g=-1;$:{if((i|0)==-1){break $}n=i+1|0;n=(n>>>0)%3|0?n:i-2|0;g=-1;if((n|0)==-1){break $}g=F[k+(n<<2)>>2]}n=g;o=F[x+(n<<2)>>2];aa:{if((o|0)==-1){d=1;g=-1;break aa}d=1;p=o+1|0;o=(p>>>0)%3|0?p:o-2|0;g=-1;if((o|0)==-1){break aa}d=0;a=o;g=a+1|0;g=(g>>>0)%3|0?g:a-2|0;if((g|0)!=-1){g=F[k+(g<<2)>>2]}else{g=-1}}o=F[(g<<2)+x>>2];if((o|0)!=-1){b=o+1|0;b=(b>>>0)%3|0?b:o-2|0}if((a|0)==(i|0)|(b|0)==(i|0)|((i|0)!=-1&F[F[q+12>>2]+(i<<2)>>2]!=-1|(a|0)==(b|0))){break l}if(!d&F[F[q+12>>2]+(a<<2)>>2]!=-1){break l}d=-1;o=F[q+12>>2];q=-1;ba:{if((b|0)==-1){break ba}if(F[o+(b<<2)>>2]!=-1){break l}f=b+1|0;f=(f>>>0)%3|0?f:b-2|0;q=-1;if((f|0)==-1){break ba}q=F[k+(f<<2)>>2]}f=L(m,3);F[j>>2]=f;F[o+(f<<2)>>2]=i;F[o+(i<<2)>>2]=f;f=F[j>>2]+1|0;F[o+(f<<2)>>2]=a;F[o+(a<<2)>>2]=f;a=F[j>>2]+2|0;F[o+(a<<2)>>2]=b;F[o+(b<<2)>>2]=a;a=F[j>>2];F[k+(a<<2)>>2]=g;b=a+1|0;f=k+(b<<2)|0;F[f>>2]=q;o=a+2|0;i=k+(o<<2)|0;F[i>>2]=n;a=F[h+120>>2];g=b?g:-1;n=a+(g>>>3&536870908)|0;k=F[n>>2];M=n,N=oi(g)&k,F[M>>2]=N;d=(b|0)!=-1?F[f>>2]:d;b=a+(d>>>3&536870908)|0;g=F[b>>2];M=b,N=oi(d)&g,F[M>>2]=N;b=-1;b=(o|0)!=-1?F[i>>2]:b;a=a+(b>>>3&536870908)|0;g=F[a>>2];M=a,N=oi(b)&g,F[M>>2]=N;D[j+88|0]=1;wd(e,j+88|0);Ma(l,j);m=m+1|0;g=F[j+64>>2];break _}b=F[h+64>>2];a=F[h+68>>2];if((b|0)==a<<5){if((b+1|0)<0){break h}if(b>>>0<=1073741822){a=a<<6;b=(b&-32)+32|0;a=a>>>0>b>>>0?a:b}else{a=2147483647}$a(e,a);b=F[h+64>>2]}F[h+64>>2]=b+1;a=F[h+60>>2]+(b>>>3&536870908)|0;d=F[a>>2];M=a,N=oi(b)&d,F[M>>2]=N;b=F[h+76>>2];if((b|0)!=F[h+80>>2]){F[b>>2]=i;F[h+76>>2]=b+4;break _}f=F[l>>2];a=b-f|0;o=a>>2;d=o+1|0;if(d>>>0>=1073741824){break g}n=a>>>1|0;n=a>>>0>=2147483644?1073741823:d>>>0<n>>>0?n:d;if(n){if(n>>>0>=1073741824){break j}a=ka(n<<2)}else{a=0}d=a+(o<<2)|0;F[d>>2]=i;o=d+4|0;if((b|0)!=(f|0)){while(1){d=d-4|0;b=b-4|0;F[d>>2]=F[b>>2];if((b|0)!=(f|0)){continue}break}}F[h+80>>2]=a+(n<<2);F[h+76>>2]=o;F[h+72>>2]=d;if(!f){break _}ja(f)}if((c|0)!=(g|0)){continue}break}a=F[h+8>>2]}f=-1;if(((F[a+4>>2]-F[a>>2]>>2>>>0)/3|0)!=(m|0)){break l}f=F[a+28>>2]-F[a+24>>2]>>2;c=F[j+24>>2];n=F[j+28>>2];if((c|0)==(n|0)){break k}while(1){g=F[c>>2];e=F[a+24>>2];b=f-1|0;d=e+(b<<2)|0;if(F[d>>2]==-1){while(1){b=f-2|0;f=f-1|0;d=e+(b<<2)|0;if(F[d>>2]==-1){continue}break}}if(b>>>0>=g>>>0){F[j>>2]=a;d=F[d>>2];D[j+12|0]=1;F[j+8>>2]=d;F[j+4>>2]=d;if((d|0)!=-1){while(1){a=F[F[h+8>>2]>>2]+(d<<2)|0;if(F[a>>2]!=(b|0)){f=-1;break l}F[a>>2]=g;nc(j);d=F[j+8>>2];if((d|0)!=-1){continue}break}a=F[h+8>>2]}m=F[a+24>>2];e=m+(b<<2)|0;if((g|0)!=-1){F[m+(g<<2)>>2]=F[e>>2]}F[e>>2]=-1;e=1<<g;m=F[h+120>>2];g=m+(g>>>3&536870908)|0;d=1<<b;m=m+(b>>>3&536870908)|0;if(d&F[m>>2]){b=e|F[g>>2]}else{b=F[g>>2]&(e^-1)}F[g>>2]=b;F[m>>2]=F[m>>2]&(d^-1);f=f-1|0}c=c+4|0;if((n|0)!=(c|0)){continue}break}}c=F[j+24>>2]}if(c){ja(c)}a=F[j+48>>2];if(a){while(1){c=F[a>>2];ja(a);a=c;if(a){continue}break}}a=F[j+40>>2];F[j+40>>2]=0;if(a){ja(a)}a=F[j+64>>2];if(a){F[j+68>>2]=a;ja(a)}Z=j+96|0;a=f;break f}oa();v()}na();v()}na();v()}na();v()}b=a;if((a|0)==-1){break e}a=C;c=F[a+16>>2];g=c+F[a>>2]|0;c=F[a+8>>2]-c|0;a=F[F[h+4>>2]+32>>2];E[a+38>>1]=H[a+38>>1];F[a>>2]=g;F[a+16>>2]=0;F[a+20>>2]=0;F[a+8>>2]=c;F[a+12>>2]=0;ca:{if(F[h+216>>2]==F[h+220>>2]){break ca}a=F[h+8>>2];if(F[a+4>>2]==F[a>>2]){break ca}c=0;while(1){if(Ad(h,c)){c=c+3|0;a=F[h+8>>2];if(c>>>0<F[a+4>>2]-F[a>>2]>>2>>>0){continue}break ca}break}break e}if(G[h+308|0]){D[h+308|0]=0;g=F[h+292>>2];a=0;e=F[h+304>>2]+7|0;a=e>>>0<7?1:a;c=a>>>3|0;m=a<<29|e>>>3;a=m+F[h+288>>2]|0;e=c+g|0;F[h+288>>2]=a;F[h+292>>2]=a>>>0<m>>>0?e+1|0:e}c=F[h+216>>2];if((c|0)!=F[h+220>>2]){a=0;while(1){e=L(a,144);Zc((e+c|0)+4|0,F[h+8>>2]);g=F[y>>2];m=g+e|0;c=F[m+132>>2];m=F[m+136>>2];if((c|0)!=(m|0)){while(1){Xc((e+F[y>>2]|0)+4|0,F[c>>2]);c=c+4|0;if((m|0)!=(c|0)){continue}break}g=F[y>>2]}if(!Yc((g+e|0)+4|0)){break e}a=a+1|0;c=F[h+216>>2];if(a>>>0<(F[h+220>>2]-c|0)/144>>>0){continue}break}}a=F[h+8>>2];Hb(h+184|0,F[a+28>>2]-F[a+24>>2]>>2);g=F[h+216>>2];if((g|0)!=F[h+220>>2]){c=0;while(1){a=L(c,144)+g|0;g=F[a+60>>2]-F[a+56>>2]>>2;e=a+104|0;a=F[h+8>>2];a=F[a+28>>2]-F[a+24>>2]>>2;Hb(e,(a|0)<(g|0)?g:a);c=c+1|0;g=F[h+216>>2];if(c>>>0<(F[h+220>>2]-g|0)/144>>>0){continue}break}}K=zd(h,b)}}Z=t- -64|0;return K|0}function Cf(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,E=0,H=0,I=0,J=0,K=0,M=0,N=0,O=0;B=c;c=0;m=Z-96|0;Z=m;l=m+16|0;ma(l,0,76);F[m+92>>2]=-1;F[m+8>>2]=0;F[m>>2]=0;F[m+4>>2]=0;r=Z-16|0;Z=r;F[l+68>>2]=0;F[l+72>>2]=0;F[l>>2]=b;s=Z-16|0;Z=s;u=b;a=F[b+20>>2];a:{if((F[b+24>>2]-a|0)<=0){break a}a=F[a>>2];if((a|0)==-1){break a}c=F[F[u+8>>2]+(a<<2)>>2]}b:{c:{d:{if(!c){a=0;break d}a=F[u+100>>2];e=F[u+96>>2];F[s+8>>2]=0;F[s>>2]=0;F[s+4>>2]=0;f=a-e|0;b=(f|0)/12|0;e:{if((a|0)==(e|0)){break e}if(b>>>0>=357913942){break c}d=ka(f);F[s>>2]=d;F[s+8>>2]=d+L(b,12);a=0;n=d;f=f-12|0;d=(f-((f>>>0)%12|0)|0)+12|0;f=ma(n,0,d);F[s+4>>2]=d+f;if(G[c+84|0]){c=b>>>0<=1?1:b;h=c&1;if(b>>>0>=2){g=c&-2;c=0;while(1){d=L(a,12);b=d+e|0;i=F[b+4>>2];j=F[b>>2];d=d+f|0;F[d+8>>2]=F[b+8>>2];F[d>>2]=j;F[d+4>>2]=i;d=L(a|1,12);b=d+e|0;i=F[b+4>>2];j=F[b>>2];d=d+f|0;F[d+8>>2]=F[b+8>>2];F[d>>2]=j;F[d+4>>2]=i;a=a+2|0;c=c+2|0;if((g|0)!=(c|0)){continue}break}}if(!h){break e}b=L(a,12);a=b+e|0;c=F[a+4>>2];e=F[a>>2];b=b+f|0;F[b+8>>2]=F[a+8>>2];F[b>>2]=e;F[b+4>>2]=c;break e}h=b>>>0<=1?1:b;a=F[c+68>>2];c=0;while(1){d=L(c,12);b=d+e|0;g=F[a+(F[b>>2]<<2)>>2];i=F[a+(F[b+4>>2]<<2)>>2];d=d+f|0;F[d+8>>2]=F[a+(F[b+8>>2]<<2)>>2];F[d+4>>2]=i;F[d>>2]=g;c=c+1|0;if((h|0)!=(c|0)){continue}break}}d=0;H=Z-16|0;Z=H;h=ka(88);Zb(h);C=Z-16|0;Z=C;F[h+80>>2]=0;F[h+84>>2]=0;a=F[h+76>>2];F[h+76>>2]=0;if(a){ja(a)}F[h+68>>2]=0;F[h+72>>2]=0;b=h- -64|0;a=F[b>>2];F[b>>2]=0;if(a){ja(a)}g=F[s+4>>2];b=F[s>>2];c=(g-b|0)/12|0;a=L(c,3);f=F[h>>2];e=F[h+4>>2]-f>>2;f:{if(a>>>0>e>>>0){nd(h,a-e|0);g=F[s+4>>2];b=F[s>>2];c=(g-b|0)/12|0;break f}if(a>>>0>=e>>>0){break f}F[h+4>>2]=f+(a<<2)}g:{if((b|0)==(g|0)){break g}e=c>>>0<=1?1:c;g=e&1;a=F[h>>2];if(c>>>0>=2){i=e&-2;c=0;while(1){e=L(d,12);j=e+a|0;f=b+e|0;F[j>>2]=F[f>>2];F[a+(e|4)>>2]=F[f+4>>2];F[j+8>>2]=F[f+8>>2];f=L(d|1,12);e=f+a|0;f=b+f|0;F[e>>2]=F[f>>2];F[e+4>>2]=F[f+4>>2];F[e+8>>2]=F[f+8>>2];d=d+2|0;c=c+2|0;if((i|0)!=(c|0)){continue}break}}if(!g){break g}c=L(d,12);a=c+a|0;b=b+c|0;F[a>>2]=F[b>>2];F[a+4>>2]=F[b+4>>2];F[a+8>>2]=F[b+8>>2]}F[C+12>>2]=-1;a=0;e=0;g=0;f=Z-32|0;Z=f;h:{i:{w=C+12|0;j:{if(!w){break j}c=F[h+4>>2];j=F[h>>2];d=c-j|0;i=d>>2;n=F[h+12>>2];b=F[h+16>>2]-n>>2;k:{if(i>>>0>b>>>0){ab(h+12|0,i-b|0,10228);c=F[h+4>>2];j=F[h>>2];d=c-j|0;i=d>>2;break k}if(b>>>0<=i>>>0){break k}F[h+16>>2]=n+(i<<2)}F[f+24>>2]=0;F[f+16>>2]=0;F[f+20>>2]=0;b=(c|0)==(j|0);if(!b){if((d|0)<0){break i}e=ka(d);F[f+20>>2]=e;F[f+16>>2]=e;F[f+24>>2]=(i<<2)+e}l:{m:{n:{o:{p:{if(d){while(1){i=F[(a<<2)+j>>2];b=F[f+20>>2]-e>>2;q:{if(i>>>0<b>>>0){break q}F[f>>2]=0;d=i+1|0;if(d>>>0>b>>>0){Fa(f+16|0,d-b|0,f);j=F[h>>2];c=F[h+4>>2];e=F[f+16>>2];break q}if(b>>>0<=d>>>0){break q}F[f+20>>2]=(d<<2)+e}b=(i<<2)+e|0;F[b>>2]=F[b>>2]+1;a=a+1|0;d=c-j|0;i=d>>2;if(a>>>0<i>>>0){continue}break}break p}d=0;if(!b){break o}break n}if((c|0)==(j|0)){d=0;break n}if(d>>>0>=2147483645){break m}}d=ka(d<<1);ma(d,255,i<<3)}F[f+8>>2]=0;F[f>>2]=0;F[f+4>>2]=0;b=F[f+20>>2];a=b-e|0;t=a>>2;r:{s:{if((b|0)==(e|0)){break s}if((a|0)<0){break r}q=ka(a);F[f>>2]=q;F[f+8>>2]=(t<<2)+q;b=ma(q,0,a);F[f+4>>2]=b+a;c=t>>>0<=1?1:t;n=c&3;a=0;if(c-1>>>0>=3){o=c&-4;while(1){c=g<<2;F[c+b>>2]=a;x=c|4;a=F[c+e>>2]+a|0;F[x+b>>2]=a;y=c|8;a=a+F[e+x>>2]|0;F[y+b>>2]=a;c=c|12;a=a+F[e+y>>2]|0;F[c+b>>2]=a;a=a+F[c+e>>2]|0;g=g+4|0;p=p+4|0;if((o|0)!=(p|0)){continue}break}}if(!n){break s}while(1){c=g<<2;F[c+b>>2]=a;g=g+1|0;a=F[c+e>>2]+a|0;k=k+1|0;if((n|0)!=(k|0)){continue}break}}if(!i){break l}x=F[h+40>>2];y=F[h+12>>2];n=0;while(1){I=n<<2;a=I+j|0;k=-1;c=n+1|0;b=(c>>>0)%3|0?c:n-2|0;if((b|0)!=-1){k=F[(b<<2)+j>>2]}b=F[a>>2];t:{u:{if(!((n>>>0)%3|0)){p=-1;a=n+2|0;if((a|0)!=-1){p=F[(a<<2)+j>>2]}if(!((b|0)==(k|0)|(b|0)==(p|0))&(k|0)!=(p|0)){break u}x=x+1|0;F[h+40>>2]=x;c=n+3|0;break t}p=F[a-4>>2]}a=p<<2;A=F[a+e>>2];v:{w:{if((A|0)<=0){break w}a=F[a+q>>2];g=0;while(1){o=(a<<3)+d|0;z=F[o>>2];if((z|0)==-1){break w}x:{if((k|0)!=(z|0)){break x}o=F[o+4>>2];if((o|0)!=-1){z=F[(o<<2)+j>>2]}else{z=-1}if((z|0)==(b|0)){break x}while(1){y:{b=a;g=g+1|0;if((A|0)<=(g|0)){break y}a=b+1|0;J=(a<<3)+d|0;z=F[J>>2];K=(b<<3)+d|0;F[K+4>>2]=F[J+4>>2];F[K>>2]=z;if((z|0)!=-1){continue}}break}F[(b<<3)+d>>2]=-1;if((o|0)==-1){break w}F[y+I>>2]=o;F[y+(o<<2)>>2]=n;break v}a=a+1|0;g=g+1|0;if((A|0)!=(g|0)){continue}break}}a=k<<2;k=F[a+e>>2];if((k|0)<=0){break v}a=F[a+q>>2];g=0;while(1){b=(a<<3)+d|0;if(F[b>>2]==-1){F[b>>2]=p;F[b+4>>2]=n;break v}a=a+1|0;g=g+1|0;if((k|0)!=(g|0)){continue}break}}}n=c;if(n>>>0<i>>>0){continue}break}break l}break i}na();v()}F[w>>2]=t;if(q){ja(q)}if(d){ja(d)}a=F[f+16>>2];if(!a){break j}F[f+20>>2]=a;ja(a)}Z=f+32|0;x=(w|0)!=0;if(x){k=Z-32|0;Z=k;a=F[h>>2];g=F[h+4>>2];F[k+24>>2]=0;F[k+16>>2]=0;F[k+20>>2]=0;if((a|0)==(g|0)){c=g}else{a=g-a|0;if((a|0)<0){break i}a=a>>2;b=(a-1>>>5|0)+1|0;c=ka(b<<2);F[k+24>>2]=b;F[k+20>>2]=0;F[k+16>>2]=c;Yb(k+16|0,a);g=F[h>>2];c=F[h+4>>2]}F[k+8>>2]=0;F[k>>2]=0;while(1){z:{o=0;i=0;if((c|0)==(g|0)){break z}while(1){b=F[k+16>>2];A:{if(F[b+(i>>>3&536870908)>>2]>>>i&1){break A}c=F[k>>2];F[k+4>>2]=c;e=F[h+12>>2];a=i;while(1){B:{f=a+1|0;d=a;a=(f>>>0)%3|0?f:a-2|0;if((a|0)==-1){break B}a=F[e+(a<<2)>>2];if((a|0)==-1){break B}f=a+1|0;a=(f>>>0)%3|0?f:a-2|0;if((i|0)==(a|0)|(a|0)==-1){break B}if(!(F[b+(a>>>3&536870908)>>2]>>>a&1)){continue}}break}j=d;C:{D:{E:{while(1){a=F[k+16>>2]+(j>>>3&536870908)|0;F[a>>2]=F[a>>2]|1<<j;a=j+1|0;f=(a>>>0)%3|0?a:j-2|0;g=F[h>>2];y=(j>>>0)%3|0;b=(y?-1:2)+j|0;n=F[k>>2];A=(n|0)==(c|0);F:{if(A){break F}w=F[(f<<2)+g>>2];q=F[h+12>>2];a=n;if((b|0)!=-1){e=q+(b<<2)|0;while(1){G:{if((w|0)!=F[a>>2]){break G}p=F[a+4>>2];t=F[e>>2];if((p|0)==(t|0)){break G}e=b;c=-1;a=-1;if((p|0)==-1){break C}break D}a=a+8|0;if((c|0)!=(a|0)){continue}break}break F}while(1){if((w|0)==F[a>>2]){t=-1;e=-1;p=F[a+4>>2];if((p|0)!=-1){break D}}a=a+8|0;if((c|0)!=(a|0)){continue}break}}b=F[(b<<2)+g>>2];H:{if(F[k+8>>2]!=(c|0)){F[c>>2]=b;F[c+4>>2]=f;c=c+8|0;F[k+4>>2]=c;break H}a=c-n|0;p=a>>3;e=p+1|0;if(e>>>0>=536870912){break i}g=a>>>2|0;g=a>>>0>=2147483640?536870911:e>>>0<g>>>0?g:e;if(g){if(g>>>0>=536870912){break E}e=ka(g<<3)}else{e=0}a=e+(p<<3)|0;F[a>>2]=b;F[a+4>>2]=f;b=a+8|0;if(!A){while(1){c=c-8|0;f=F[c+4>>2];a=a-8|0;F[a>>2]=F[c>>2];F[a+4>>2]=f;if((c|0)!=(n|0)){continue}break}c=F[k>>2]}F[k+8>>2]=e+(g<<3);F[k+4>>2]=b;F[k>>2]=a;if(c){ja(c)}c=b}I:{J:{if(y){a=j-1|0;break J}a=j+2|0;if((a|0)==-1){break I}}a=F[F[h+12>>2]+(a<<2)>>2];if((a|0)==-1){break I}j=a+((a>>>0)%3|0?-1:2)|0;if((d|0)==(j|0)){break I}if((j|0)!=-1){continue}}break}g=F[h>>2];break A}oa();v()}c=F[q+(p<<2)>>2];b=e;a=p}if((t|0)!=-1){F[q+(t<<2)>>2]=-1}if((c|0)!=-1){F[q+(c<<2)>>2]=-1}F[q+(b<<2)>>2]=-1;F[q+(a<<2)>>2]=-1;o=1}i=i+1|0;c=F[h+4>>2];if(i>>>0<c-g>>2>>>0){continue}break}if(o){continue}}break}a=F[k>>2];if(a){ja(a)}a=F[k+16>>2];if(a){ja(a)}Z=k+32|0;n=0;g=Z-32|0;Z=g;e=F[C+12>>2];F[h+36>>2]=e;p=h+24|0;b=F[h+24>>2];a=F[h+28>>2]-b>>2;K:{L:{if(a>>>0<e>>>0){ab(p,e-a|0,10228);F[g+24>>2]=0;F[g+16>>2]=0;F[g+20>>2]=0;break L}if(a>>>0>e>>>0){F[h+28>>2]=b+(e<<2)}F[g+24>>2]=0;F[g+16>>2]=0;F[g+20>>2]=0;if(!e){break K}}if((e|0)<0){break i}a=(e-1>>>5|0)+1|0;b=ka(a<<2);F[g+24>>2]=a;F[g+20>>2]=0;F[g+16>>2]=b;Yb(g+16|0,e)}a=F[h>>2];b=F[h+4>>2];F[g+8>>2]=0;F[g>>2]=0;F[g+4>>2]=0;M:{if((a|0)==(b|0)){a=b}else{a=b-a|0;if((a|0)<0){break i}a=a>>2;b=(a-1>>>5|0)+1|0;c=ka(b<<2);F[g+8>>2]=b;F[g+4>>2]=0;F[g>>2]=c;Yb(g,a);b=F[h>>2];a=F[h+4>>2]}if(a-b>>>0<12){break M}N:{while(1){q=L(n,3);d=(q<<2)+b|0;f=F[d>>2];c=-1;i=q+1|0;if((i|0)!=-1){c=F[(i<<2)+b>>2]}O:{if((c|0)==(f|0)){break O}i=f;f=F[d+8>>2];if((i|0)==(f|0)|(c|0)==(f|0)){break O}k=0;i=F[g>>2];while(1){f=k+q|0;if(!(F[(f>>>3&536870908)+i>>2]>>>f&1)){a=F[(f<<2)+b>>2];c=1<<a;d=F[g+16>>2];b=a>>>5|0;i=F[d+(b<<2)>>2];t=c&i;if(t){c=F[h+28>>2];P:{if((c|0)!=F[h+32>>2]){F[c>>2]=-1;F[h+28>>2]=c+4;break P}i=F[p>>2];b=c-i|0;o=b>>2;d=o+1|0;if(d>>>0>=1073741824){break i}j=b>>>1|0;j=b>>>0>=2147483644?1073741823:d>>>0<j>>>0?j:d;if(j){if(j>>>0>=1073741824){break N}b=ka(j<<2)}else{b=0}d=b+(o<<2)|0;F[d>>2]=-1;o=d+4|0;if((c|0)!=(i|0)){while(1){d=d-4|0;c=c-4|0;F[d>>2]=F[c>>2];if((c|0)!=(i|0)){continue}break}}F[h+32>>2]=b+(j<<2);F[h+28>>2]=o;F[h+24>>2]=d;if(!i){break P}ja(i)}c=F[h+52>>2];Q:{if((c|0)!=F[h+56>>2]){F[c>>2]=a;F[h+52>>2]=c+4;break Q}i=F[h+48>>2];b=c-i|0;o=b>>2;d=o+1|0;if(d>>>0>=1073741824){break i}j=b>>>1|0;j=b>>>0>=2147483644?1073741823:d>>>0<j>>>0?j:d;if(j){if(j>>>0>=1073741824){break N}b=ka(j<<2)}else{b=0}d=b+(o<<2)|0;F[d>>2]=a;a=d+4|0;if((c|0)!=(i|0)){while(1){d=d-4|0;c=c-4|0;F[d>>2]=F[c>>2];if((c|0)!=(i|0)){continue}break}}F[h+56>>2]=b+(j<<2);F[h+52>>2]=a;F[h+48>>2]=d;if(!i){break Q}ja(i)}c=F[g+20>>2];a=F[g+24>>2];if((c|0)==a<<5){if((c+1|0)<0){break i}b=g+16|0;if(c>>>0<=1073741822){a=a<<6;c=(c&-32)+32|0;a=a>>>0>c>>>0?a:c}else{a=2147483647}$a(b,a);c=F[g+20>>2]}F[g+20>>2]=c+1;d=F[g+16>>2];a=d+(c>>>3&536870908)|0;b=F[a>>2];N=a,O=oi(c)&b,F[N>>2]=O;c=1<<e;b=e>>>5|0;i=F[(b<<2)+d>>2];a=e;e=a+1|0}F[(b<<2)+d>>2]=c|i;o=F[h+24>>2]+(a<<2)|0;j=F[h+12>>2];b=F[h>>2];i=F[g>>2];c=f;R:{S:{T:{while(1){if((c|0)==-1){break T}d=(c>>>3&536870908)+i|0;F[d>>2]=F[d>>2]|1<<c;F[o>>2]=c;if(t){F[(c<<2)+b>>2]=a}w=c+1|0;c=(w>>>0)%3|0?w:c-2|0;d=-1;U:{if((c|0)==-1){break U}c=F[j+(c<<2)>>2];d=-1;if((c|0)==-1){break U}d=c+1|0;d=(d>>>0)%3|0?d:c-2|0}c=d;if((f|0)!=(c|0)){continue}break}if((f|0)!=-1){break R}c=1;break S}if((f>>>0)%3|0){c=f-1|0;break S}c=f+2|0;if((c|0)==-1){break R}}c=F[j+(c<<2)>>2];if((c|0)==-1){break R}V:{if((c>>>0)%3|0){c=c-1|0;break V}c=c+2|0;if((c|0)==-1){break R}}f=F[h+12>>2];b=F[h>>2];while(1){d=(c>>>3&536870908)+i|0;F[d>>2]=F[d>>2]|1<<c;if(t){F[(c<<2)+b>>2]=a}W:{if((c>>>0)%3|0){c=c-1|0;break W}c=c+2|0;if((c|0)==-1){break R}}c=F[f+(c<<2)>>2];if((c|0)==-1){break R}c=c+((c>>>0)%3|0?-1:2)|0;if((c|0)!=-1){continue}break}}}k=k+1|0;if((k|0)!=3){continue}break}b=F[h>>2];a=F[h+4>>2]}n=n+1|0;if(n>>>0<(a-b>>2>>>0)/3>>>0){continue}break}break M}oa();v()}c=0;F[h+44>>2]=0;a=F[g+16>>2];b=F[g+20>>2];if(b){e=b&31;b=(b>>>3&536870908)+a|0;d=a;i=0;while(1){if(!(F[d>>2]>>>c&1)){i=i+1|0;F[h+44>>2]=i}f=(c|0)==31;c=f?0:c+1|0;d=(f<<2)+d|0;if((b|0)!=(d|0)|(c|0)!=(e|0)){continue}break}}b=F[g>>2];if(b){ja(b);a=F[g+16>>2]}if(a){ja(a)}Z=g+32|0}Z=C+16|0;if(!x){F[H+8>>2]=0;Za(h);h=0}Z=H+16|0;a=h;break h}na();v()}b=F[s>>2];if(!b){break d}F[s+4>>2]=b;ja(b)}Z=s+16|0;break b}na();v()}c=F[l+4>>2];b=a;F[l+4>>2]=a;if(c){Za(c);b=F[l+4>>2]}X:{if(!b){break X}a=F[u+100>>2];c=F[u+96>>2];D[r+12|0]=0;Ea(l+56|0,(a-c|0)/12|0,r+12|0);a=F[u+100>>2];c=F[u+96>>2];if((a|0)==(c|0)){break X}while(1){if(!(F[F[l+56>>2]+(E>>>3&536870908)>>2]>>>E&1)){a=L(E,3);Vb(l,0,a);c=F[l+8>>2];e=F[l+12>>2];Vb(l,1,a+1|0);f=F[l+20>>2];d=F[l+24>>2];Vb(l,2,a+2|0);n=(c|0)==(e|0)?-1:0;a=d-f>>2;c=e-c>>2;e=a>>>0>c>>>0;c=F[l+36>>2]-F[l+32>>2]>>2>>>0>(e?a:c)>>>0?2:e?1:n;Y:{if(F[l+68>>2]<=0){break Y}F[r+12>>2]=F[l+76>>2];F[r+8>>2]=m;Qa(r+8|0,r+12|0);a=F[((c<<2)+l|0)+44>>2];if((a|0)<0){a=-1}else{e=(a>>>0)/3|0;a=F[(F[F[l>>2]+96>>2]+L(e,12)|0)+(a-L(e,3)<<2)>>2]}F[r+12>>2]=a;F[r+8>>2]=m;Qa(r+8|0,r+12|0);e=F[l+72>>2];F[l+72>>2]=e+2;if(!(e&1)){break Y}F[r+12>>2]=a;F[r+8>>2]=m;Qa(r+8|0,r+12|0);F[l+72>>2]=F[l+72>>2]+1}d=0;e=Z-16|0;Z=e;F[l+68>>2]=F[l+68>>2]+1;a=L(c,12)+l|0;a=F[a+12>>2]-F[a+8>>2]|0;if((a|0)>0){a=a>>>2|0;h=a>>>0<=1?1:a;c=F[((c<<2)+l|0)+44>>2];while(1){a=c;f=(a>>>0)/3|0;c=(a|0)==-1;g=c?-1:f;i=F[l+56>>2]+(g>>>3&536870908)|0;F[i>>2]=F[i>>2]|1<<g;F[l+72>>2]=F[l+72>>2]+1;Z:{_:{$:{aa:{ba:{if(!d){ca:{if((a|0)>=0){F[e+12>>2]=F[(F[F[l>>2]+96>>2]+L(f,12)|0)+((a>>>0)%3<<2)>>2];F[e+8>>2]=m;Qa(e+8|0,e+12|0);break ca}F[e+12>>2]=-1;F[e+8>>2]=m;Qa(e+8|0,e+12|0);if(c){break ba}}c=-1;f=a+1|0;f=(f>>>0)%3|0?f:a-2|0;if((f|0)>=0){g=(f>>>0)/3|0;f=F[(F[F[l>>2]+96>>2]+L(g,12)|0)+(f-L(g,3)<<2)>>2]}else{f=-1}F[e+12>>2]=f;F[e+8>>2]=m;Qa(e+8|0,e+12|0);f=((a>>>0)%3|0?-1:2)+a|0;if((f|0)<0){break aa}c=(f>>>0)/3|0;c=F[(F[F[l>>2]+96>>2]+L(c,12)|0)+(f-L(c,3)<<2)>>2];break aa}c=(a|0)<0?-1:F[(F[F[l>>2]+96>>2]+L(f,12)|0)+((a>>>0)%3<<2)>>2];F[l+76>>2]=c;F[e+12>>2]=c;F[e+8>>2]=m;Qa(e+8|0,e+12|0);if(d&1){c=-1;if((a|0)==-1){break Z}if((L(f,3)|0)!=(a|0)){a=a-1|0;break _}a=a+2|0;break $}c=-1;if((a|0)==-1){break Z}c=a+1|0;a=(c>>>0)%3|0?c:a-2|0;break $}c=-1;F[e+12>>2]=-1;F[e+8>>2]=m;Qa(e+8|0,e+12|0)}F[l+76>>2]=c;F[e+12>>2]=c;F[e+8>>2]=m;Qa(e+8|0,e+12|0)}c=-1;if((a|0)==-1){break Z}}c=F[F[F[l+4>>2]+12>>2]+(a<<2)>>2]}d=d+1|0;if((h|0)!=(d|0)){continue}break}}Z=e+16|0;c=F[u+96>>2];a=F[u+100>>2]}E=E+1|0;if(E>>>0<(a-c|0)/12>>>0){continue}break}}Z=r+16|0;da:{if(b){a=F[B>>2];if(a){F[B+4>>2]=a;ja(a)}F[B>>2]=F[m>>2];F[B+4>>2]=F[m+4>>2];F[B+8>>2]=F[m+8>>2];M=F[m+84>>2];break da}a=F[m>>2];if(!a){break da}F[m+4>>2]=a;ja(a)}a=F[m+72>>2];if(a){ja(a)}a=F[m+48>>2];if(a){F[m+52>>2]=a;ja(a)}a=F[m+36>>2];if(a){F[m+40>>2]=a;ja(a)}a=F[m+24>>2];if(a){F[m+28>>2]=a;ja(a)}a=F[m+20>>2];F[m+20>>2]=0;if(a){Za(a)}Z=m+96|0;return M|0}function sf(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;i=b;a=0;b=0;a:{b:{switch(d-1|0){case 0:j=F[i+80>>2];h=G[c+24|0];c:{if((L(j,h)|0)!=(e|0)){break c}d=F[c+28>>2]!=1;b=G[c+84|0];if(!(d|!b)){la(f,F[F[c>>2]>>2]+F[c+48>>2]|0,e);b=1;break c}if(h){a=ka(h);ma(a,0,h)}d:{if(!j){b=1;break d}if(!d){if(h){d=0;e=0;while(1){i=d+f|0;k=F[F[c>>2]>>2];m=F[c+48>>2];g=F[c+40>>2];b=ki(g,F[c+44>>2],G[c+84|0]?e:F[F[c+68>>2]+(e<<2)>>2],0);n=b;b=b+m|0;la(i,la(a,b+k|0,g),h);d=d+h|0;b=1;e=e+1|0;if((j|0)!=(e|0)){continue}break}break d}if(b){b=1;h=F[c>>2];e=F[c+48>>2];f=F[c+40>>2];i=F[c+44>>2];if((j|0)!=1){g=j&-2;c=0;d=0;while(1){k=F[h>>2];m=ki(f,i,c,0)+e|0;k=la(a,k+m|0,f);m=F[h>>2];n=ki(f,i,c|1,0)+e|0;la(k,m+n|0,f);c=c+2|0;d=d+2|0;if((g|0)!=(d|0)){continue}break}g=c}if(!(j&1)){break d}c=F[h>>2];d=ki(g,0,f,i)+e|0;la(a,c+d|0,f);break d}b=1;h=F[c>>2];e=F[c+48>>2];g=F[c+68>>2];f=F[c+40>>2];i=F[c+44>>2];c=0;if((j|0)!=1){k=j&-2;d=0;while(1){m=F[h>>2];n=c<<2;l=ki(f,i,F[n+g>>2],0)+e|0;m=la(a,m+l|0,f);l=F[h>>2];n=ki(f,i,F[g+(n|4)>>2],0)+e|0;la(m,l+n|0,f);c=c+2|0;d=d+2|0;if((k|0)!=(d|0)){continue}break}}if(!(j&1)){break d}d=F[h>>2];c=ki(f,i,F[g+(c<<2)>>2],0)+e|0;la(a,c+d|0,f);break d}b=0;if(!h){d=0;while(1){if(!Cb(c,G[c+84|0]?d:F[F[c+68>>2]+(d<<2)>>2],D[c+24|0],a)){break d}d=d+1|0;b=j>>>0<=d>>>0;if((d|0)!=(j|0)){continue}break}break d}d=0;e=0;while(1){if(!Cb(c,G[c+84|0]?e:F[F[c+68>>2]+(e<<2)>>2],D[c+24|0],a)){break d}la(d+f|0,a,h);d=d+h|0;e=e+1|0;b=j>>>0<=e>>>0;if((e|0)!=(j|0)){continue}break}}if(!a){break c}ja(a)}break a;case 2:n=G[c+24|0];l=n<<1;j=F[i+80>>2];e:{if((L(l,j)|0)!=(e|0)){break e}i=F[c+28>>2]!=3;d=G[c+84|0];if(!(i|!d)){la(f,F[F[c>>2]>>2]+F[c+48>>2]|0,e);a=1;break e}f:{if(!n){e=0;break f}e=ka(l);ma(e,0,l)}g:{if(!j){a=1;break g}if(!i){o=F[c+68>>2];k=F[c>>2];b=F[c+48>>2];i=F[c+40>>2];m=F[c+44>>2];if(n){if(!d){c=0;d=0;while(1){a=1;g=F[k>>2];p=ki(i,m,F[o+(d<<2)>>2],0)+b|0;la((c<<1)+f|0,la(e,g+p|0,i),l);c=c+n|0;d=d+1|0;if((j|0)!=(d|0)){continue}break}break g}c=0;while(1){a=1;o=F[k>>2];p=ki(g,h,i,m)+b|0;la((c<<1)+f|0,la(e,o+p|0,i),l);c=c+n|0;d=h;g=g+1|0;d=g?d:d+1|0;h=d;if((j|0)!=(g|0)|d){continue}break}break g}if(!d){a=1;c=0;if((j|0)!=1){f=j&-2;d=0;while(1){h=F[k>>2];g=c<<2;n=ki(i,m,F[g+o>>2],0)+b|0;h=la(e,h+n|0,i);n=F[k>>2];g=ki(i,m,F[o+(g|4)>>2],0)+b|0;la(h,g+n|0,i);c=c+2|0;d=d+2|0;if((f|0)!=(d|0)){continue}break}}if(!(j&1)){break g}d=F[k>>2];b=ki(i,m,F[o+(c<<2)>>2],0)+b|0;la(e,b+d|0,i);break g}n=j&1;a=1;if((j|0)!=1){j=j&-2;f=0;c=0;while(1){d=F[k>>2];l=ki(g,h,i,m)+b|0;d=la(e,d+l|0,i);l=F[k>>2];o=ki(i,m,g|1,h)+b|0;la(d,l+o|0,i);g=g+2|0;h=g>>>0<2?h+1|0:h;f=f+2|0;d=f>>>0<2?c+1|0:c;c=d;if((f|0)!=(j|0)|c){continue}break}}if(!n){break g}c=F[k>>2];b=ki(g,h,i,m)+b|0;la(e,b+c|0,i);break g}if(!n){d=0;while(1){if(!Ab(c,G[c+84|0]?d:F[F[c+68>>2]+(d<<2)>>2],D[c+24|0],e)){break g}d=d+1|0;a=j>>>0<=d>>>0;if((d|0)!=(j|0)){continue}break}break g}d=0;while(1){if(!Ab(c,G[c+84|0]?d:F[F[c+68>>2]+(d<<2)>>2],D[c+24|0],e)){break g}la((b<<1)+f|0,e,l);b=b+n|0;d=d+1|0;a=j>>>0<=d>>>0;if((d|0)!=(j|0)){continue}break}}if(!e){break e}ja(e)}b=a;break a;case 4:l=G[c+24|0];o=l<<2;j=F[i+80>>2];h:{if((L(o,j)|0)!=(e|0)){break h}i=F[c+28>>2]!=5;d=G[c+84|0];if(!(i|!d)){la(f,F[F[c>>2]>>2]+F[c+48>>2]|0,e);b=1;break h}i:{if(!l){e=0;break i}e=ka(o);ma(e,0,o)}b=1;j:{if(!j){break j}if(!i){a=F[c+68>>2];m=F[c>>2];i=F[c+48>>2];k=F[c+40>>2];n=F[c+44>>2];if(l){if(!d){c=0;d=0;while(1){g=F[m>>2];p=ki(k,n,F[a+(d<<2)>>2],0)+i|0;la((c<<2)+f|0,la(e,g+p|0,k),o);c=c+l|0;d=d+1|0;if((j|0)!=(d|0)){continue}break}break j}c=0;while(1){d=F[m>>2];p=ki(g,h,k,n)+i|0;la((c<<2)+f|0,la(e,d+p|0,k),o);c=c+l|0;g=g+1|0;a=g?h:h+1|0;h=a;if((j|0)!=(g|0)|h){continue}break}break j}if(!d){c=0;if((j|0)!=1){f=j&-2;d=0;while(1){h=F[m>>2];g=c<<2;l=ki(k,n,F[g+a>>2],0)+i|0;h=la(e,h+l|0,k);l=F[m>>2];g=ki(k,n,F[a+(g|4)>>2],0)+i|0;la(h,g+l|0,k);c=c+2|0;d=d+2|0;if((f|0)!=(d|0)){continue}break}}if(!(j&1)){break j}d=F[m>>2];a=ki(k,n,F[a+(c<<2)>>2],0)+i|0;la(e,a+d|0,k);break j}l=j&1;if((j|0)!=1){j=j&-2;f=0;c=0;while(1){a=F[m>>2];d=ki(g,h,k,n)+i|0;a=la(e,a+d|0,k);d=F[m>>2];o=ki(k,n,g|1,h)+i|0;la(a,d+o|0,k);d=h;g=g+2|0;h=g>>>0<2?d+1|0:d;f=f+2|0;a=f>>>0<2?c+1|0:c;c=a;if((f|0)!=(j|0)|c){continue}break}}if(!l){break j}a=F[m>>2];c=ki(g,h,k,n)+i|0;la(e,a+c|0,k);break j}b=0;if(!l){d=0;while(1){if(!yb(c,G[c+84|0]?d:F[F[c+68>>2]+(d<<2)>>2],D[c+24|0],e)){break j}d=d+1|0;b=j>>>0<=d>>>0;if((d|0)!=(j|0)){continue}break}break j}d=0;while(1){if(!yb(c,G[c+84|0]?d:F[F[c+68>>2]+(d<<2)>>2],D[c+24|0],e)){break j}la((a<<2)+f|0,e,o);a=a+l|0;d=d+1|0;b=j>>>0<=d>>>0;if((d|0)!=(j|0)){continue}break}}if(!e){break h}ja(e)}break a;case 1:j=F[i+80>>2];h=G[c+24|0];k:{if((L(j,h)|0)!=(e|0)){break k}d=F[c+28>>2]!=2;b=G[c+84|0];if(!(d|!b)){la(f,F[F[c>>2]>>2]+F[c+48>>2]|0,e);b=1;break k}if(h){a=ka(h);ma(a,0,h)}l:{if(!j){b=1;break l}if(!d){if(h){d=0;e=0;while(1){i=d+f|0;k=F[F[c>>2]>>2];m=F[c+48>>2];g=F[c+40>>2];b=ki(g,F[c+44>>2],G[c+84|0]?e:F[F[c+68>>2]+(e<<2)>>2],0);n=b;b=b+m|0;la(i,la(a,b+k|0,g),h);d=d+h|0;b=1;e=e+1|0;if((j|0)!=(e|0)){continue}break}break l}if(b){b=1;h=F[c>>2];e=F[c+48>>2];f=F[c+40>>2];i=F[c+44>>2];if((j|0)!=1){g=j&-2;c=0;d=0;while(1){k=F[h>>2];m=ki(f,i,c,0)+e|0;k=la(a,k+m|0,f);m=F[h>>2];n=ki(f,i,c|1,0)+e|0;la(k,m+n|0,f);c=c+2|0;d=d+2|0;if((g|0)!=(d|0)){continue}break}g=c}if(!(j&1)){break l}c=F[h>>2];d=ki(g,0,f,i)+e|0;la(a,c+d|0,f);break l}b=1;h=F[c>>2];e=F[c+48>>2];g=F[c+68>>2];f=F[c+40>>2];i=F[c+44>>2];c=0;if((j|0)!=1){k=j&-2;d=0;while(1){m=F[h>>2];n=c<<2;l=ki(f,i,F[n+g>>2],0)+e|0;m=la(a,m+l|0,f);l=F[h>>2];n=ki(f,i,F[g+(n|4)>>2],0)+e|0;la(m,l+n|0,f);c=c+2|0;d=d+2|0;if((k|0)!=(d|0)){continue}break}}if(!(j&1)){break l}d=F[h>>2];c=ki(f,i,F[g+(c<<2)>>2],0)+e|0;la(a,c+d|0,f);break l}b=0;if(!h){d=0;while(1){if(!Bb(c,G[c+84|0]?d:F[F[c+68>>2]+(d<<2)>>2],D[c+24|0],a)){break l}d=d+1|0;b=j>>>0<=d>>>0;if((d|0)!=(j|0)){continue}break}break l}d=0;e=0;while(1){if(!Bb(c,G[c+84|0]?e:F[F[c+68>>2]+(e<<2)>>2],D[c+24|0],a)){break l}la(d+f|0,a,h);d=d+h|0;e=e+1|0;b=j>>>0<=e>>>0;if((e|0)!=(j|0)){continue}break}}if(!a){break k}ja(a)}break a;case 3:n=G[c+24|0];l=n<<1;j=F[i+80>>2];m:{if((L(l,j)|0)!=(e|0)){break m}i=F[c+28>>2]!=4;d=G[c+84|0];if(!(i|!d)){la(f,F[F[c>>2]>>2]+F[c+48>>2]|0,e);a=1;break m}n:{if(!n){e=0;break n}e=ka(l);ma(e,0,l)}o:{if(!j){a=1;break o}if(!i){o=F[c+68>>2];k=F[c>>2];b=F[c+48>>2];i=F[c+40>>2];m=F[c+44>>2];if(n){if(!d){c=0;d=0;while(1){a=1;g=F[k>>2];p=ki(i,m,F[o+(d<<2)>>2],0)+b|0;la((c<<1)+f|0,la(e,g+p|0,i),l);c=c+n|0;d=d+1|0;if((j|0)!=(d|0)){continue}break}break o}c=0;while(1){a=1;o=F[k>>2];p=ki(g,h,i,m)+b|0;la((c<<1)+f|0,la(e,o+p|0,i),l);c=c+n|0;d=h;g=g+1|0;d=g?d:d+1|0;h=d;if((j|0)!=(g|0)|d){continue}break}break o}if(!d){a=1;c=0;if((j|0)!=1){f=j&-2;d=0;while(1){h=F[k>>2];g=c<<2;n=ki(i,m,F[g+o>>2],0)+b|0;h=la(e,h+n|0,i);n=F[k>>2];g=ki(i,m,F[o+(g|4)>>2],0)+b|0;la(h,g+n|0,i);c=c+2|0;d=d+2|0;if((f|0)!=(d|0)){continue}break}}if(!(j&1)){break o}d=F[k>>2];b=ki(i,m,F[o+(c<<2)>>2],0)+b|0;la(e,b+d|0,i);break o}n=j&1;a=1;if((j|0)!=1){j=j&-2;f=0;c=0;while(1){d=F[k>>2];l=ki(g,h,i,m)+b|0;d=la(e,d+l|0,i);l=F[k>>2];o=ki(i,m,g|1,h)+b|0;la(d,l+o|0,i);g=g+2|0;h=g>>>0<2?h+1|0:h;f=f+2|0;d=f>>>0<2?c+1|0:c;c=d;if((f|0)!=(j|0)|c){continue}break}}if(!n){break o}c=F[k>>2];b=ki(g,h,i,m)+b|0;la(e,b+c|0,i);break o}if(!n){d=0;while(1){if(!zb(c,G[c+84|0]?d:F[F[c+68>>2]+(d<<2)>>2],D[c+24|0],e)){break o}d=d+1|0;a=j>>>0<=d>>>0;if((d|0)!=(j|0)){continue}break}break o}d=0;while(1){if(!zb(c,G[c+84|0]?d:F[F[c+68>>2]+(d<<2)>>2],D[c+24|0],e)){break o}la((b<<1)+f|0,e,l);b=b+n|0;d=d+1|0;a=j>>>0<=d>>>0;if((d|0)!=(j|0)){continue}break}}if(!e){break m}ja(e)}b=a;break a;case 5:l=G[c+24|0];o=l<<2;j=F[i+80>>2];p:{if((L(o,j)|0)!=(e|0)){break p}i=F[c+28>>2]!=6;d=G[c+84|0];if(!(i|!d)){la(f,F[F[c>>2]>>2]+F[c+48>>2]|0,e);b=1;break p}q:{if(!l){e=0;break q}e=ka(o);ma(e,0,o)}b=1;r:{if(!j){break r}if(!i){a=F[c+68>>2];m=F[c>>2];i=F[c+48>>2];k=F[c+40>>2];n=F[c+44>>2];if(l){if(!d){c=0;d=0;while(1){g=F[m>>2];p=ki(k,n,F[a+(d<<2)>>2],0)+i|0;la((c<<2)+f|0,la(e,g+p|0,k),o);c=c+l|0;d=d+1|0;if((j|0)!=(d|0)){continue}break}break r}c=0;while(1){d=F[m>>2];p=ki(g,h,k,n)+i|0;la((c<<2)+f|0,la(e,d+p|0,k),o);c=c+l|0;g=g+1|0;a=g?h:h+1|0;h=a;if((j|0)!=(g|0)|h){continue}break}break r}if(!d){c=0;if((j|0)!=1){f=j&-2;d=0;while(1){h=F[m>>2];g=c<<2;l=ki(k,n,F[g+a>>2],0)+i|0;h=la(e,h+l|0,k);l=F[m>>2];g=ki(k,n,F[a+(g|4)>>2],0)+i|0;la(h,g+l|0,k);c=c+2|0;d=d+2|0;if((f|0)!=(d|0)){continue}break}}if(!(j&1)){break r}d=F[m>>2];a=ki(k,n,F[a+(c<<2)>>2],0)+i|0;la(e,a+d|0,k);break r}l=j&1;if((j|0)!=1){j=j&-2;f=0;c=0;while(1){a=F[m>>2];d=ki(g,h,k,n)+i|0;a=la(e,a+d|0,k);d=F[m>>2];o=ki(k,n,g|1,h)+i|0;la(a,d+o|0,k);d=h;g=g+2|0;h=g>>>0<2?d+1|0:d;f=f+2|0;a=f>>>0<2?c+1|0:c;c=a;if((f|0)!=(j|0)|c){continue}break}}if(!l){break r}a=F[m>>2];c=ki(g,h,k,n)+i|0;la(e,a+c|0,k);break r}b=0;if(!l){d=0;while(1){if(!xb(c,G[c+84|0]?d:F[F[c+68>>2]+(d<<2)>>2],D[c+24|0],e)){break r}d=d+1|0;b=j>>>0<=d>>>0;if((d|0)!=(j|0)){continue}break}break r}d=0;while(1){if(!xb(c,G[c+84|0]?d:F[F[c+68>>2]+(d<<2)>>2],D[c+24|0],e)){break r}la((a<<2)+f|0,e,o);a=a+l|0;d=d+1|0;b=j>>>0<=d>>>0;if((d|0)!=(j|0)){continue}break}}if(!e){break p}ja(e)}break a;case 8:p=G[c+24|0];q=p<<2;k=F[i+80>>2];s:{if((L(q,k)|0)!=(e|0)){break s}i=F[c+28>>2];t:{if(!p){break t}a=ka(q);d=a;m=q-4|0;l=(m>>>2|0)+1&7;if(l){e=0;while(1){F[d>>2]=-1073741824;d=d+4|0;e=e+1|0;if((l|0)!=(e|0)){continue}break}}if(m>>>0<28){break t}e=(p<<2)+a|0;while(1){F[d+24>>2]=-1073741824;F[d+28>>2]=-1073741824;F[d+16>>2]=-1073741824;F[d+20>>2]=-1073741824;F[d+8>>2]=-1073741824;F[d+12>>2]=-1073741824;F[d>>2]=-1073741824;F[d+4>>2]=-1073741824;d=d+32|0;if((e|0)!=(d|0)){continue}break}}u:{if(!k){b=1;break u}if((i|0)==9){r=F[c+68>>2];l=F[c>>2];i=F[c+48>>2];s=G[c+84|0];m=F[c+44>>2];c=F[c+40>>2];o=c;if(p){e=0;d=0;while(1){h=(e<<2)+f|0;g=F[l>>2];b=ki(c,m,s?d:F[r+(d<<2)>>2],0)+i|0;la(h,la(a,b+g|0,o),q);e=e+p|0;b=1;d=d+1|0;if((k|0)!=(d|0)){continue}break}break u}if(!s){b=1;d=0;if((k|0)!=1){f=k&-2;e=0;while(1){h=F[l>>2];g=d<<2;j=ki(c,m,F[g+r>>2],0)+i|0;h=la(a,h+j|0,o);j=F[l>>2];g=ki(c,m,F[r+(g|4)>>2],0)+i|0;la(h,j+g|0,o);d=d+2|0;e=e+2|0;if((f|0)!=(e|0)){continue}break}}if(!(k&1)){break u}e=F[l>>2];c=ki(c,m,F[r+(d<<2)>>2],0)+i|0;la(a,c+e|0,o);break u}f=k&1;b=1;if((k|0)!=1){k=k&-2;while(1){d=F[l>>2];e=ki(g,h,c,m)+i|0;d=la(a,d+e|0,o);e=F[l>>2];p=ki(c,m,g|1,h)+i|0;la(d,e+p|0,o);g=g+2|0;h=g>>>0<2?h+1|0:h;d=j;e=n+2|0;d=e>>>0<2?d+1|0:d;n=e;j=d;if((e|0)!=(k|0)|d){continue}break}}if(!f){break u}d=F[l>>2];c=ki(g,h,c,m)+i|0;la(a,c+d|0,o);break u}if(!p){d=0;while(1){if(!lb(c,G[c+84|0]?d:F[F[c+68>>2]+(d<<2)>>2],D[c+24|0],a)){break u}d=d+1|0;b=k>>>0<=d>>>0;if((d|0)!=(k|0)){continue}break}break u}e=0;d=0;while(1){if(!lb(c,G[c+84|0]?d:F[F[c+68>>2]+(d<<2)>>2],D[c+24|0],a)){break u}la((e<<2)+f|0,a,q);e=e+p|0;d=d+1|0;b=k>>>0<=d>>>0;if((d|0)!=(k|0)){continue}break}}if(!a){break s}ja(a)}a=b;break;default:break b}}b=a}return b|0}function Pd(a,b,c,d){var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;h=Z-80|0;Z=h;e=F[c+36>>2];F[h+72>>2]=F[c+32>>2];F[h+76>>2]=e;f=F[c+28>>2];e=h- -64|0;F[e>>2]=F[c+24>>2];F[e+4>>2]=f;e=F[c+20>>2];F[h+56>>2]=F[c+16>>2];F[h+60>>2]=e;e=F[c+12>>2];F[h+48>>2]=F[c+8>>2];F[h+52>>2]=e;e=F[c+4>>2];F[h+40>>2]=F[c>>2];F[h+44>>2]=e;jc(a,h+40|0,h+24|0);a:{if(F[a>>2]){break a}if(D[a+15|0]<0){ja(F[a+4>>2])}if(G[h+31|0]!=1){b=ka(32);D[b+20|0]=0;c=G[1446]|G[1447]<<8|(G[1448]<<16|G[1449]<<24);D[b+16|0]=c;D[b+17|0]=c>>>8;D[b+18|0]=c>>>16;D[b+19|0]=c>>>24;c=G[1442]|G[1443]<<8|(G[1444]<<16|G[1445]<<24);d=G[1438]|G[1439]<<8|(G[1440]<<16|G[1441]<<24);D[b+8|0]=d;D[b+9|0]=d>>>8;D[b+10|0]=d>>>16;D[b+11|0]=d>>>24;D[b+12|0]=c;D[b+13|0]=c>>>8;D[b+14|0]=c>>>16;D[b+15|0]=c>>>24;c=G[1434]|G[1435]<<8|(G[1436]<<16|G[1437]<<24);d=G[1430]|G[1431]<<8|(G[1432]<<16|G[1433]<<24);D[b|0]=d;D[b+1|0]=d>>>8;D[b+2|0]=d>>>16;D[b+3|0]=d>>>24;D[b+4|0]=c;D[b+5|0]=c>>>8;D[b+6|0]=c>>>16;D[b+7|0]=c>>>24;F[a>>2]=-1;ra(a+4|0,b,20);ja(b);break a}j=Z-16|0;Z=j;b:{c:{switch(G[h+32|0]){case 0:e=Kd(ka(48));F[e>>2]=9864;F[h+8>>2]=0;F[h+12>>2]=0;F[h>>2]=0;F[h+4>>2]=0;F[h+16>>2]=e;break b;case 1:e=Kd(ka(52));F[e+48>>2]=0;F[e>>2]=8176;F[h+8>>2]=0;F[h+12>>2]=0;F[h>>2]=0;F[h+4>>2]=0;F[h+16>>2]=e;break b;default:break c}}f=ka(32);D[f+28|0]=0;e=G[1520]|G[1521]<<8|(G[1522]<<16|G[1523]<<24);D[f+24|0]=e;D[f+25|0]=e>>>8;D[f+26|0]=e>>>16;D[f+27|0]=e>>>24;e=G[1516]|G[1517]<<8|(G[1518]<<16|G[1519]<<24);g=G[1512]|G[1513]<<8|(G[1514]<<16|G[1515]<<24);D[f+16|0]=g;D[f+17|0]=g>>>8;D[f+18|0]=g>>>16;D[f+19|0]=g>>>24;D[f+20|0]=e;D[f+21|0]=e>>>8;D[f+22|0]=e>>>16;D[f+23|0]=e>>>24;e=G[1508]|G[1509]<<8|(G[1510]<<16|G[1511]<<24);g=G[1504]|G[1505]<<8|(G[1506]<<16|G[1507]<<24);D[f+8|0]=g;D[f+9|0]=g>>>8;D[f+10|0]=g>>>16;D[f+11|0]=g>>>24;D[f+12|0]=e;D[f+13|0]=e>>>8;D[f+14|0]=e>>>16;D[f+15|0]=e>>>24;e=G[1500]|G[1501]<<8|(G[1502]<<16|G[1503]<<24);g=G[1496]|G[1497]<<8|(G[1498]<<16|G[1499]<<24);D[f|0]=g;D[f+1|0]=g>>>8;D[f+2|0]=g>>>16;D[f+3|0]=g>>>24;D[f+4|0]=e;D[f+5|0]=e>>>8;D[f+6|0]=e>>>16;D[f+7|0]=e>>>24;F[j>>2]=-1;e=j|4;ra(e,f,28);k=D[j+15|0];F[h>>2]=F[j>>2];g=h+4|0;d:{if((k|0)>=0){k=F[e+4>>2];F[g>>2]=F[e>>2];F[g+4>>2]=k;F[g+8>>2]=F[e+8>>2];F[h+16>>2]=0;break d}ra(g,F[j+4>>2],F[j+8>>2]);e=D[j+15|0];F[h+16>>2]=0;if((e|0)>=0){break d}ja(F[j+4>>2])}ja(f)}Z=j+16|0;e=F[h>>2];e:{if(e){F[a>>2]=e;a=a+4|0;if(D[h+15|0]>=0){b=h|4;c=F[b+4>>2];F[a>>2]=F[b>>2];F[a+4>>2]=c;F[a+8>>2]=F[b+8>>2];break e}ra(a,F[h+4>>2],F[h+8>>2]);break e}e=F[h+16>>2];F[h+16>>2]=0;F[e+44>>2]=d;f=Z-32|0;Z=f;F[e+32>>2]=c;F[e+40>>2]=b;F[e+4>>2]=d;jc(a,c,f+16|0);f:{if(F[a>>2]){break f}if(D[a+15|0]<0){ja(F[a+4>>2])}b=G[f+23|0];if(($[F[F[e>>2]+8>>2]](e)|0)!=(b|0)){b=ka(64);D[b+50|0]=0;c=G[1304]|G[1305]<<8;D[b+48|0]=c;D[b+49|0]=c>>>8;c=G[1300]|G[1301]<<8|(G[1302]<<16|G[1303]<<24);d=G[1296]|G[1297]<<8|(G[1298]<<16|G[1299]<<24);D[b+40|0]=d;D[b+41|0]=d>>>8;D[b+42|0]=d>>>16;D[b+43|0]=d>>>24;D[b+44|0]=c;D[b+45|0]=c>>>8;D[b+46|0]=c>>>16;D[b+47|0]=c>>>24;c=G[1292]|G[1293]<<8|(G[1294]<<16|G[1295]<<24);d=G[1288]|G[1289]<<8|(G[1290]<<16|G[1291]<<24);D[b+32|0]=d;D[b+33|0]=d>>>8;D[b+34|0]=d>>>16;D[b+35|0]=d>>>24;D[b+36|0]=c;D[b+37|0]=c>>>8;D[b+38|0]=c>>>16;D[b+39|0]=c>>>24;c=G[1284]|G[1285]<<8|(G[1286]<<16|G[1287]<<24);d=G[1280]|G[1281]<<8|(G[1282]<<16|G[1283]<<24);D[b+24|0]=d;D[b+25|0]=d>>>8;D[b+26|0]=d>>>16;D[b+27|0]=d>>>24;D[b+28|0]=c;D[b+29|0]=c>>>8;D[b+30|0]=c>>>16;D[b+31|0]=c>>>24;c=G[1276]|G[1277]<<8|(G[1278]<<16|G[1279]<<24);d=G[1272]|G[1273]<<8|(G[1274]<<16|G[1275]<<24);D[b+16|0]=d;D[b+17|0]=d>>>8;D[b+18|0]=d>>>16;D[b+19|0]=d>>>24;D[b+20|0]=c;D[b+21|0]=c>>>8;D[b+22|0]=c>>>16;D[b+23|0]=c>>>24;c=G[1268]|G[1269]<<8|(G[1270]<<16|G[1271]<<24);d=G[1264]|G[1265]<<8|(G[1266]<<16|G[1267]<<24);D[b+8|0]=d;D[b+9|0]=d>>>8;D[b+10|0]=d>>>16;D[b+11|0]=d>>>24;D[b+12|0]=c;D[b+13|0]=c>>>8;D[b+14|0]=c>>>16;D[b+15|0]=c>>>24;c=G[1260]|G[1261]<<8|(G[1262]<<16|G[1263]<<24);d=G[1256]|G[1257]<<8|(G[1258]<<16|G[1259]<<24);D[b|0]=d;D[b+1|0]=d>>>8;D[b+2|0]=d>>>16;D[b+3|0]=d>>>24;D[b+4|0]=c;D[b+5|0]=c>>>8;D[b+6|0]=c>>>16;D[b+7|0]=c>>>24;F[a>>2]=-1;ra(a+4|0,b,50);ja(b);break f}c=G[f+21|0];D[e+36|0]=c;d=G[f+22|0];D[e+37|0]=d;if((c|0)!=2){b=ka(32);D[b+26|0]=0;c=G[1427]|G[1428]<<8;D[b+24|0]=c;D[b+25|0]=c>>>8;c=G[1423]|G[1424]<<8|(G[1425]<<16|G[1426]<<24);d=G[1419]|G[1420]<<8|(G[1421]<<16|G[1422]<<24);D[b+16|0]=d;D[b+17|0]=d>>>8;D[b+18|0]=d>>>16;D[b+19|0]=d>>>24;D[b+20|0]=c;D[b+21|0]=c>>>8;D[b+22|0]=c>>>16;D[b+23|0]=c>>>24;c=G[1415]|G[1416]<<8|(G[1417]<<16|G[1418]<<24);d=G[1411]|G[1412]<<8|(G[1413]<<16|G[1414]<<24);D[b+8|0]=d;D[b+9|0]=d>>>8;D[b+10|0]=d>>>16;D[b+11|0]=d>>>24;D[b+12|0]=c;D[b+13|0]=c>>>8;D[b+14|0]=c>>>16;D[b+15|0]=c>>>24;c=G[1407]|G[1408]<<8|(G[1409]<<16|G[1410]<<24);d=G[1403]|G[1404]<<8|(G[1405]<<16|G[1406]<<24);D[b|0]=d;D[b+1|0]=d>>>8;D[b+2|0]=d>>>16;D[b+3|0]=d>>>24;D[b+4|0]=c;D[b+5|0]=c>>>8;D[b+6|0]=c>>>16;D[b+7|0]=c>>>24;F[a>>2]=-5;ra(a+4|0,b,26);ja(b);break f}b=b?2:3;if((b|0)!=(d|0)){b=ka(32);D[b+26|0]=0;c=G[1400]|G[1401]<<8;D[b+24|0]=c;D[b+25|0]=c>>>8;c=G[1396]|G[1397]<<8|(G[1398]<<16|G[1399]<<24);d=G[1392]|G[1393]<<8|(G[1394]<<16|G[1395]<<24);D[b+16|0]=d;D[b+17|0]=d>>>8;D[b+18|0]=d>>>16;D[b+19|0]=d>>>24;D[b+20|0]=c;D[b+21|0]=c>>>8;D[b+22|0]=c>>>16;D[b+23|0]=c>>>24;c=G[1388]|G[1389]<<8|(G[1390]<<16|G[1391]<<24);d=G[1384]|G[1385]<<8|(G[1386]<<16|G[1387]<<24);D[b+8|0]=d;D[b+9|0]=d>>>8;D[b+10|0]=d>>>16;D[b+11|0]=d>>>24;D[b+12|0]=c;D[b+13|0]=c>>>8;D[b+14|0]=c>>>16;D[b+15|0]=c>>>24;c=G[1380]|G[1381]<<8|(G[1382]<<16|G[1383]<<24);d=G[1376]|G[1377]<<8|(G[1378]<<16|G[1379]<<24);D[b|0]=d;D[b+1|0]=d>>>8;D[b+2|0]=d>>>16;D[b+3|0]=d>>>24;D[b+4|0]=c;D[b+5|0]=c>>>8;D[b+6|0]=c>>>16;D[b+7|0]=c>>>24;F[a>>2]=-5;ra(a+4|0,b,26);ja(b);break f}E[F[e+32>>2]+38>>1]=b|512;g:{if(E[f+26>>1]>=0){break g}j=Z-16|0;Z=j;d=ka(36);b=d;F[b+4>>2]=0;F[b+8>>2]=0;F[b+24>>2]=0;F[b+28>>2]=0;b=b+16|0;F[b>>2]=0;F[b+4>>2]=0;F[d>>2]=d+4;F[d+32>>2]=0;F[d+12>>2]=b;F[j>>2]=0;c=F[e+32>>2];k=Z-16|0;Z=k;b=0;h:{if(!d){break h}F[j>>2]=c;F[k+12>>2]=0;b=0;if(!fb(1,k+12|0,c)){break h}n=F[k+12>>2];if(n){while(1){i:{if(fb(1,k+8|0,F[j>>2])){b=ka(28);F[b+4>>2]=0;F[b+8>>2]=0;c=b+16|0;F[c>>2]=0;F[c+4>>2]=0;F[b>>2]=b+4;F[b+12>>2]=c;F[b+24>>2]=F[k+8>>2];if(Vc(j,b)){break i}Ca(b+12|0,F[b+16>>2]);Ba(b,F[b+4>>2]);ja(b)}b=0;break h}g=Z-16|0;Z=g;F[g+8>>2]=b;j:{if(!b){break j}c=F[d+28>>2];k:{if(c>>>0<I[d+32>>2]){F[g+8>>2]=0;F[c>>2]=b;F[d+28>>2]=c+4;break k}c=0;l:{m:{n:{i=F[d+24>>2];m=F[d+28>>2]-i>>2;b=m+1|0;if(b>>>0<1073741824){i=F[d+32>>2]-i|0;l=i>>>1|0;i=i>>>0>=2147483644?1073741823:b>>>0<l>>>0?l:b;if(i){if(i>>>0>=1073741824){break n}c=ka(i<<2)}l=F[g+8>>2];F[g+8>>2]=0;b=(m<<2)+c|0;F[b>>2]=l;i=(i<<2)+c|0;m=b+4|0;c=F[d+28>>2];l=F[d+24>>2];if((c|0)==(l|0)){break m}while(1){c=c-4|0;p=F[c>>2];F[c>>2]=0;b=b-4|0;F[b>>2]=p;if((c|0)!=(l|0)){continue}break}F[d+32>>2]=i;i=F[d+28>>2];F[d+28>>2]=m;c=F[d+24>>2];F[d+24>>2]=b;if((c|0)==(i|0)){break l}while(1){i=i-4|0;b=F[i>>2];F[i>>2]=0;if(b){Ca(b+12|0,F[b+16>>2]);Ba(b,F[b+4>>2]);ja(b)}if((c|0)!=(i|0)){continue}break}break l}na();v()}oa();v()}F[d+32>>2]=i;F[d+28>>2]=m;F[d+24>>2]=b}if(c){ja(c)}}b=F[g+8>>2];F[g+8>>2]=0;if(!b){break j}Ca(b+12|0,F[b+16>>2]);Ba(b,F[b+4>>2]);ja(b)}Z=g+16|0;o=o+1|0;if((n|0)!=(o|0)){continue}break}}b=Vc(j,d)}Z=k+16|0;o:{if(b){c=F[e+4>>2];b=F[c+4>>2];F[c+4>>2]=d;if(b){ic(b)}F[a>>2]=0;F[a+4>>2]=0;F[a+8>>2]=0;F[a+12>>2]=0;break o}b=ka(32);D[b+26|0]=0;c=G[1549]|G[1550]<<8;D[b+24|0]=c;D[b+25|0]=c>>>8;c=G[1545]|G[1546]<<8|(G[1547]<<16|G[1548]<<24);g=G[1541]|G[1542]<<8|(G[1543]<<16|G[1544]<<24);D[b+16|0]=g;D[b+17|0]=g>>>8;D[b+18|0]=g>>>16;D[b+19|0]=g>>>24;D[b+20|0]=c;D[b+21|0]=c>>>8;D[b+22|0]=c>>>16;D[b+23|0]=c>>>24;c=G[1537]|G[1538]<<8|(G[1539]<<16|G[1540]<<24);g=G[1533]|G[1534]<<8|(G[1535]<<16|G[1536]<<24);D[b+8|0]=g;D[b+9|0]=g>>>8;D[b+10|0]=g>>>16;D[b+11|0]=g>>>24;D[b+12|0]=c;D[b+13|0]=c>>>8;D[b+14|0]=c>>>16;D[b+15|0]=c>>>24;c=G[1529]|G[1530]<<8|(G[1531]<<16|G[1532]<<24);g=G[1525]|G[1526]<<8|(G[1527]<<16|G[1528]<<24);D[b|0]=g;D[b+1|0]=g>>>8;D[b+2|0]=g>>>16;D[b+3|0]=g>>>24;D[b+4|0]=c;D[b+5|0]=c>>>8;D[b+6|0]=c>>>16;D[b+7|0]=c>>>24;F[a>>2]=-1;ra(a+4|0,b,26);ja(b);F[j+8>>2]=0;ic(d)}Z=j+16|0;if(F[a>>2]){break f}if(D[a+15|0]>=0){break g}ja(F[a+4>>2])}if(!($[F[F[e>>2]+12>>2]](e)|0)){b=ka(48);D[b+33|0]=0;D[b+32|0]=G[1374];c=G[1370]|G[1371]<<8|(G[1372]<<16|G[1373]<<24);d=G[1366]|G[1367]<<8|(G[1368]<<16|G[1369]<<24);D[b+24|0]=d;D[b+25|0]=d>>>8;D[b+26|0]=d>>>16;D[b+27|0]=d>>>24;D[b+28|0]=c;D[b+29|0]=c>>>8;D[b+30|0]=c>>>16;D[b+31|0]=c>>>24;c=G[1362]|G[1363]<<8|(G[1364]<<16|G[1365]<<24);d=G[1358]|G[1359]<<8|(G[1360]<<16|G[1361]<<24);D[b+16|0]=d;D[b+17|0]=d>>>8;D[b+18|0]=d>>>16;D[b+19|0]=d>>>24;D[b+20|0]=c;D[b+21|0]=c>>>8;D[b+22|0]=c>>>16;D[b+23|0]=c>>>24;c=G[1354]|G[1355]<<8|(G[1356]<<16|G[1357]<<24);d=G[1350]|G[1351]<<8|(G[1352]<<16|G[1353]<<24);D[b+8|0]=d;D[b+9|0]=d>>>8;D[b+10|0]=d>>>16;D[b+11|0]=d>>>24;D[b+12|0]=c;D[b+13|0]=c>>>8;D[b+14|0]=c>>>16;D[b+15|0]=c>>>24;c=G[1346]|G[1347]<<8|(G[1348]<<16|G[1349]<<24);d=G[1342]|G[1343]<<8|(G[1344]<<16|G[1345]<<24);D[b|0]=d;D[b+1|0]=d>>>8;D[b+2|0]=d>>>16;D[b+3|0]=d>>>24;D[b+4|0]=c;D[b+5|0]=c>>>8;D[b+6|0]=c>>>16;D[b+7|0]=c>>>24;F[a>>2]=-1;ra(a+4|0,b,33);ja(b);break f}if(!($[F[F[e>>2]+20>>2]](e)|0)){b=Eb(f,1552);F[a>>2]=-1;c=a+4|0;if(D[b+11|0]>=0){d=F[b+4>>2];F[c>>2]=F[b>>2];F[c+4>>2]=d;F[c+8>>2]=F[b+8>>2];break f}ra(c,F[b>>2],F[b+4>>2]);if(D[b+11|0]>=0){break f}ja(F[b>>2]);break f}if(!($[F[F[e>>2]+24>>2]](e)|0)){b=Eb(f,1307);F[a>>2]=-1;c=a+4|0;if(D[b+11|0]>=0){d=F[b+4>>2];F[c>>2]=F[b>>2];F[c+4>>2]=d;F[c+8>>2]=F[b+8>>2];break f}ra(c,F[b>>2],F[b+4>>2]);if(D[b+11|0]>=0){break f}ja(F[b>>2]);break f}F[a>>2]=0;F[a+4>>2]=0;F[a+8>>2]=0;F[a+12>>2]=0}Z=f+32|0;if(!F[a>>2]){if(D[a+15|0]<0){ja(F[a+4>>2])}F[a>>2]=0;F[a+4>>2]=0;F[a+8>>2]=0;F[a+12>>2]=0}$[F[F[e>>2]+4>>2]](e)}a=F[h+16>>2];F[h+16>>2]=0;if(a){$[F[F[a>>2]+4>>2]](a)}if(D[h+15|0]>=0){break a}ja(F[h+4>>2])}Z=h+80|0}function Ub(a){a=a|0;var b=0,c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;l=Z-16|0;Z=l;a:{b:{c:{d:{e:{f:{g:{h:{i:{if(a>>>0<=244){g=F[2941];h=a>>>0<11?16:a+11&-8;c=h>>>3|0;b=g>>>c|0;if(b&3){c=c+((b^-1)&1)|0;a=c<<3;b=a+11804|0;d=F[a+11812>>2];a=F[d+8>>2];j:{if((b|0)==(a|0)){m=11764,n=oi(c)&g,F[m>>2]=n;break j}F[a+12>>2]=b;F[b+8>>2]=a}a=d+8|0;b=c<<3;F[d+4>>2]=b|3;b=b+d|0;F[b+4>>2]=F[b+4>>2]|1;break a}k=F[2943];if(k>>>0>=h>>>0){break i}if(b){a=2<<c;a=(0-a|a)&b<<c;d=ji(0-a&a);a=d<<3;b=a+11804|0;e=F[a+11812>>2];a=F[e+8>>2];k:{if((b|0)==(a|0)){g=oi(d)&g;F[2941]=g;break k}F[a+12>>2]=b;F[b+8>>2]=a}F[e+4>>2]=h|3;c=e+h|0;a=d<<3;d=a-h|0;F[c+4>>2]=d|1;F[a+e>>2]=d;if(k){b=(k&-8)+11804|0;f=F[2946];a=1<<(k>>>3);l:{if(!(a&g)){F[2941]=a|g;a=b;break l}a=F[b+8>>2]}F[b+8>>2]=f;F[a+12>>2]=f;F[f+12>>2]=b;F[f+8>>2]=a}a=e+8|0;F[2946]=c;F[2943]=d;break a}j=F[2942];if(!j){break i}c=F[(ji(0-j&j)<<2)+12068>>2];f=(F[c+4>>2]&-8)-h|0;b=c;while(1){m:{a=F[b+16>>2];if(!a){a=F[b+20>>2];if(!a){break m}}b=(F[a+4>>2]&-8)-h|0;d=b>>>0<f>>>0;f=d?b:f;c=d?a:c;b=a;continue}break}i=F[c+24>>2];d=F[c+12>>2];if((d|0)!=(c|0)){a=F[c+8>>2];F[a+12>>2]=d;F[d+8>>2]=a;break b}b=c+20|0;a=F[b>>2];if(!a){a=F[c+16>>2];if(!a){break h}b=c+16|0}while(1){e=b;d=a;b=a+20|0;a=F[b>>2];if(a){continue}b=d+16|0;a=F[d+16>>2];if(a){continue}break}F[e>>2]=0;break b}h=-1;if(a>>>0>4294967231){break i}a=a+11|0;h=a&-8;j=F[2942];if(!j){break i}f=0-h|0;g=0;n:{if(h>>>0<256){break n}g=31;if(h>>>0>16777215){break n}a=O(a>>>8|0);g=((h>>>38-a&1)-(a<<1)|0)+62|0}b=F[(g<<2)+12068>>2];o:{p:{q:{if(!b){a=0;break q}a=0;c=h<<((g|0)!=31?25-(g>>>1|0)|0:0);while(1){r:{e=(F[b+4>>2]&-8)-h|0;if(e>>>0>=f>>>0){break r}d=b;f=e;if(e){break r}f=0;a=b;break p}e=F[b+20>>2];b=F[((c>>>29&4)+b|0)+16>>2];a=e?(e|0)==(b|0)?a:e:a;c=c<<1;if(b){continue}break}}if(!(a|d)){d=0;a=2<<g;a=(0-a|a)&j;if(!a){break i}a=F[(ji(a&0-a)<<2)+12068>>2]}if(!a){break o}}while(1){b=(F[a+4>>2]&-8)-h|0;c=b>>>0<f>>>0;f=c?b:f;d=c?a:d;b=F[a+16>>2];if(b){a=b}else{a=F[a+20>>2]}if(a){continue}break}}if(!d|F[2943]-h>>>0<=f>>>0){break i}g=F[d+24>>2];c=F[d+12>>2];if((d|0)!=(c|0)){a=F[d+8>>2];F[a+12>>2]=c;F[c+8>>2]=a;break c}b=d+20|0;a=F[b>>2];if(!a){a=F[d+16>>2];if(!a){break g}b=d+16|0}while(1){e=b;c=a;b=a+20|0;a=F[b>>2];if(a){continue}b=c+16|0;a=F[c+16>>2];if(a){continue}break}F[e>>2]=0;break c}a=F[2943];if(a>>>0>=h>>>0){d=F[2946];b=a-h|0;s:{if(b>>>0>=16){c=d+h|0;F[c+4>>2]=b|1;F[a+d>>2]=b;F[d+4>>2]=h|3;break s}F[d+4>>2]=a|3;a=a+d|0;F[a+4>>2]=F[a+4>>2]|1;c=0;b=0}F[2943]=b;F[2946]=c;a=d+8|0;break a}i=F[2944];if(i>>>0>h>>>0){b=i-h|0;F[2944]=b;c=F[2947];a=c+h|0;F[2947]=a;F[a+4>>2]=b|1;F[c+4>>2]=h|3;a=c+8|0;break a}a=0;j=h+47|0;if(F[3059]){c=F[3061]}else{F[3062]=-1;F[3063]=-1;F[3060]=4096;F[3061]=4096;F[3059]=l+12&-16^1431655768;F[3064]=0;F[3052]=0;c=4096}e=j+c|0;f=0-c|0;b=e&f;if(b>>>0<=h>>>0){break a}d=F[3051];if(d){c=F[3049];g=c+b|0;if(d>>>0<g>>>0|c>>>0>=g>>>0){break a}}t:{if(!(G[12208]&4)){u:{v:{w:{x:{d=F[2947];if(d){a=12212;while(1){c=F[a>>2];if(c>>>0<=d>>>0&d>>>0<c+F[a+4>>2]>>>0){break x}a=F[a+8>>2];if(a){continue}break}}c=eb(0);if((c|0)==-1){break u}g=b;d=F[3060];a=d-1|0;if(a&c){g=(b-c|0)+(a+c&0-d)|0}if(g>>>0<=h>>>0){break u}d=F[3051];if(d){a=F[3049];f=a+g|0;if(d>>>0<f>>>0|a>>>0>=f>>>0){break u}}a=eb(g);if((c|0)!=(a|0)){break w}break t}g=f&e-i;c=eb(g);if((c|0)==(F[a>>2]+F[a+4>>2]|0)){break v}a=c}if((a|0)==-1){break u}if(h+48>>>0<=g>>>0){c=a;break t}c=F[3061];c=c+(j-g|0)&0-c;if((eb(c)|0)==-1){break u}g=c+g|0;c=a;break t}if((c|0)!=-1){break t}}F[3052]=F[3052]|4}c=eb(b);a=eb(0);if((c|0)==-1|(a|0)==-1|a>>>0<=c>>>0){break d}g=a-c|0;if(g>>>0<=h+40>>>0){break d}}a=F[3049]+g|0;F[3049]=a;if(a>>>0>I[3050]){F[3050]=a}y:{e=F[2947];if(e){a=12212;while(1){d=F[a>>2];b=F[a+4>>2];if((d+b|0)==(c|0)){break y}a=F[a+8>>2];if(a){continue}break}break f}a=F[2945];if(!(a>>>0<=c>>>0?a:0)){F[2945]=c}a=0;F[3054]=g;F[3053]=c;F[2949]=-1;F[2950]=F[3059];F[3056]=0;while(1){d=a<<3;b=d+11804|0;F[d+11812>>2]=b;F[d+11816>>2]=b;a=a+1|0;if((a|0)!=32){continue}break}d=g-40|0;a=c+8&7?-8-c&7:0;b=d-a|0;F[2944]=b;a=a+c|0;F[2947]=a;F[a+4>>2]=b|1;F[(c+d|0)+4>>2]=40;F[2948]=F[3063];break e}if(G[a+12|0]&8|d>>>0>e>>>0|c>>>0<=e>>>0){break f}F[a+4>>2]=b+g;a=e+8&7?-8-e&7:0;c=a+e|0;F[2947]=c;b=F[2944]+g|0;a=b-a|0;F[2944]=a;F[c+4>>2]=a|1;F[(b+e|0)+4>>2]=40;F[2948]=F[3063];break e}d=0;break b}c=0;break c}if(I[2945]>c>>>0){F[2945]=c}b=c+g|0;a=12212;z:{A:{B:{C:{D:{E:{while(1){if((b|0)!=F[a>>2]){a=F[a+8>>2];if(a){continue}break E}break}if(!(G[a+12|0]&8)){break D}}a=12212;while(1){b=F[a>>2];if(b>>>0<=e>>>0){f=b+F[a+4>>2]|0;if(f>>>0>e>>>0){break C}}a=F[a+8>>2];continue}}F[a>>2]=c;F[a+4>>2]=F[a+4>>2]+g;j=(c+8&7?-8-c&7:0)+c|0;F[j+4>>2]=h|3;g=b+(b+8&7?-8-b&7:0)|0;i=h+j|0;a=g-i|0;if((e|0)==(g|0)){F[2947]=i;a=F[2944]+a|0;F[2944]=a;F[i+4>>2]=a|1;break A}if(F[2946]==(g|0)){F[2946]=i;a=F[2943]+a|0;F[2943]=a;F[i+4>>2]=a|1;F[a+i>>2]=a;break A}f=F[g+4>>2];if((f&3)==1){e=f&-8;F:{if(f>>>0<=255){d=F[g+8>>2];b=f>>>3|0;c=F[g+12>>2];if((c|0)==(d|0)){m=11764,n=F[2941]&oi(b),F[m>>2]=n;break F}F[d+12>>2]=c;F[c+8>>2]=d;break F}h=F[g+24>>2];c=F[g+12>>2];G:{if((g|0)!=(c|0)){b=F[g+8>>2];F[b+12>>2]=c;F[c+8>>2]=b;break G}H:{f=g+20|0;b=F[f>>2];if(b){break H}f=g+16|0;b=F[f>>2];if(b){break H}c=0;break G}while(1){d=f;c=b;f=c+20|0;b=F[f>>2];if(b){continue}f=c+16|0;b=F[c+16>>2];if(b){continue}break}F[d>>2]=0}if(!h){break F}d=F[g+28>>2];b=(d<<2)+12068|0;I:{if(F[b>>2]==(g|0)){F[b>>2]=c;if(c){break I}m=11768,n=F[2942]&oi(d),F[m>>2]=n;break F}F[h+(F[h+16>>2]==(g|0)?16:20)>>2]=c;if(!c){break F}}F[c+24>>2]=h;b=F[g+16>>2];if(b){F[c+16>>2]=b;F[b+24>>2]=c}b=F[g+20>>2];if(!b){break F}F[c+20>>2]=b;F[b+24>>2]=c}g=e+g|0;f=F[g+4>>2];a=a+e|0}F[g+4>>2]=f&-2;F[i+4>>2]=a|1;F[a+i>>2]=a;if(a>>>0<=255){b=(a&-8)+11804|0;c=F[2941];a=1<<(a>>>3);J:{if(!(c&a)){F[2941]=a|c;a=b;break J}a=F[b+8>>2]}F[b+8>>2]=i;F[a+12>>2]=i;F[i+12>>2]=b;F[i+8>>2]=a;break A}f=31;if(a>>>0<=16777215){b=O(a>>>8|0);f=((a>>>38-b&1)-(b<<1)|0)+62|0}F[i+28>>2]=f;F[i+16>>2]=0;F[i+20>>2]=0;b=(f<<2)+12068|0;d=F[2942];c=1<<f;K:{if(!(d&c)){F[2942]=c|d;F[b>>2]=i;break K}f=a<<((f|0)!=31?25-(f>>>1|0)|0:0);c=F[b>>2];while(1){b=c;if((F[c+4>>2]&-8)==(a|0)){break B}c=f>>>29|0;f=f<<1;d=(c&4)+b|0;c=F[d+16>>2];if(c){continue}break}F[d+16>>2]=i}F[i+24>>2]=b;F[i+12>>2]=i;F[i+8>>2]=i;break A}d=g-40|0;a=c+8&7?-8-c&7:0;b=d-a|0;F[2944]=b;a=a+c|0;F[2947]=a;F[a+4>>2]=b|1;F[(c+d|0)+4>>2]=40;F[2948]=F[3063];a=(f+(f-39&7?39-f&7:0)|0)-47|0;d=a>>>0<e+16>>>0?e:a;F[d+4>>2]=27;a=F[3056];F[d+16>>2]=F[3055];F[d+20>>2]=a;a=F[3054];F[d+8>>2]=F[3053];F[d+12>>2]=a;F[3055]=d+8;F[3054]=g;F[3053]=c;F[3056]=0;a=d+24|0;while(1){F[a+4>>2]=7;b=a+8|0;a=a+4|0;if(b>>>0<f>>>0){continue}break}if((d|0)==(e|0)){break e}F[d+4>>2]=F[d+4>>2]&-2;f=d-e|0;F[e+4>>2]=f|1;F[d>>2]=f;if(f>>>0<=255){b=(f&-8)+11804|0;c=F[2941];a=1<<(f>>>3);L:{if(!(c&a)){F[2941]=a|c;a=b;break L}a=F[b+8>>2]}F[b+8>>2]=e;F[a+12>>2]=e;F[e+12>>2]=b;F[e+8>>2]=a;break e}a=31;if(f>>>0<=16777215){a=O(f>>>8|0);a=((f>>>38-a&1)-(a<<1)|0)+62|0}F[e+28>>2]=a;F[e+16>>2]=0;F[e+20>>2]=0;b=(a<<2)+12068|0;d=F[2942];c=1<<a;M:{if(!(d&c)){F[2942]=c|d;F[b>>2]=e;break M}a=f<<((a|0)!=31?25-(a>>>1|0)|0:0);d=F[b>>2];while(1){b=d;if((f|0)==(F[b+4>>2]&-8)){break z}c=a>>>29|0;a=a<<1;c=(c&4)+b|0;d=F[c+16>>2];if(d){continue}break}F[c+16>>2]=e}F[e+24>>2]=b;F[e+12>>2]=e;F[e+8>>2]=e;break e}a=F[b+8>>2];F[a+12>>2]=i;F[b+8>>2]=i;F[i+24>>2]=0;F[i+12>>2]=b;F[i+8>>2]=a}a=j+8|0;break a}a=F[b+8>>2];F[a+12>>2]=e;F[b+8>>2]=e;F[e+24>>2]=0;F[e+12>>2]=b;F[e+8>>2]=a}a=F[2944];if(a>>>0<=h>>>0){break d}b=a-h|0;F[2944]=b;c=F[2947];a=c+h|0;F[2947]=a;F[a+4>>2]=b|1;F[c+4>>2]=h|3;a=c+8|0;break a}F[2940]=48;a=0;break a}N:{if(!g){break N}b=F[d+28>>2];a=(b<<2)+12068|0;O:{if(F[a>>2]==(d|0)){F[a>>2]=c;if(c){break O}j=oi(b)&j;F[2942]=j;break N}F[g+(F[g+16>>2]==(d|0)?16:20)>>2]=c;if(!c){break N}}F[c+24>>2]=g;a=F[d+16>>2];if(a){F[c+16>>2]=a;F[a+24>>2]=c}a=F[d+20>>2];if(!a){break N}F[c+20>>2]=a;F[a+24>>2]=c}P:{if(f>>>0<=15){a=f+h|0;F[d+4>>2]=a|3;a=a+d|0;F[a+4>>2]=F[a+4>>2]|1;break P}F[d+4>>2]=h|3;e=d+h|0;F[e+4>>2]=f|1;F[e+f>>2]=f;if(f>>>0<=255){b=(f&-8)+11804|0;c=F[2941];a=1<<(f>>>3);Q:{if(!(c&a)){F[2941]=a|c;a=b;break Q}a=F[b+8>>2]}F[b+8>>2]=e;F[a+12>>2]=e;F[e+12>>2]=b;F[e+8>>2]=a;break P}a=31;if(f>>>0<=16777215){a=O(f>>>8|0);a=((f>>>38-a&1)-(a<<1)|0)+62|0}F[e+28>>2]=a;F[e+16>>2]=0;F[e+20>>2]=0;b=(a<<2)+12068|0;R:{c=1<<a;S:{if(!(c&j)){F[2942]=c|j;F[b>>2]=e;break S}a=f<<((a|0)!=31?25-(a>>>1|0)|0:0);h=F[b>>2];while(1){b=h;if((F[b+4>>2]&-8)==(f|0)){break R}c=a>>>29|0;a=a<<1;c=(c&4)+b|0;h=F[c+16>>2];if(h){continue}break}F[c+16>>2]=e}F[e+24>>2]=b;F[e+12>>2]=e;F[e+8>>2]=e;break P}a=F[b+8>>2];F[a+12>>2]=e;F[b+8>>2]=e;F[e+24>>2]=0;F[e+12>>2]=b;F[e+8>>2]=a}a=d+8|0;break a}T:{if(!i){break T}b=F[c+28>>2];a=(b<<2)+12068|0;U:{if(F[a>>2]==(c|0)){F[a>>2]=d;if(d){break U}m=11768,n=oi(b)&j,F[m>>2]=n;break T}F[i+(F[i+16>>2]==(c|0)?16:20)>>2]=d;if(!d){break T}}F[d+24>>2]=i;a=F[c+16>>2];if(a){F[d+16>>2]=a;F[a+24>>2]=d}a=F[c+20>>2];if(!a){break T}F[d+20>>2]=a;F[a+24>>2]=d}V:{if(f>>>0<=15){a=f+h|0;F[c+4>>2]=a|3;a=a+c|0;F[a+4>>2]=F[a+4>>2]|1;break V}F[c+4>>2]=h|3;d=c+h|0;F[d+4>>2]=f|1;F[d+f>>2]=f;if(k){b=(k&-8)+11804|0;e=F[2946];a=1<<(k>>>3);W:{if(!(a&g)){F[2941]=a|g;a=b;break W}a=F[b+8>>2]}F[b+8>>2]=e;F[a+12>>2]=e;F[e+12>>2]=b;F[e+8>>2]=a}F[2946]=d;F[2943]=f}a=c+8|0}Z=l+16|0;return a|0}function Vc(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0;m=Z-32|0;Z=m;o=ka(12);F[o+8>>2]=0;F[o+4>>2]=b;F[o>>2]=0;s=o+12|0;b=s;a:{b:{c:{while(1){b=b-12|0;w=F[b+8>>2];j=F[b+4>>2];t=F[b>>2];if(t){if((w|0)>1e3){break a}F[m+24>>2]=0;F[m+16>>2]=0;F[m+20>>2]=0;d=1;c=F[a>>2];e=F[c+8>>2];h=F[c+12>>2];g=F[c+20>>2];f=F[c+16>>2];d:{if((h|0)<=(g|0)&f>>>0>=e>>>0|(g|0)>(h|0)){break d}e=G[f+F[c>>2]|0];h=c;c=g;f=f+1|0;c=f?c:c+1|0;F[h+16>>2]=f;F[h+20>>2]=c;Sb(m+16|0,e);if(e){c=F[a>>2];n=Tb(m+16|0);p=F[c+8>>2];g=F[c+12>>2];h=F[c+20>>2];f=F[c+16>>2];k=f+e|0;h=k>>>0<e>>>0?h+1|0:h;if((g|0)<=(h|0)&k>>>0>p>>>0|(g|0)<(h|0)){break d}la(n,f+F[c>>2]|0,e);d=F[c+20>>2];f=e;e=e+F[c+16>>2]|0;d=f>>>0>e>>>0?d+1|0:d;F[c+16>>2]=e;F[c+20>>2]=d}j=ka(24);c=j;F[c+4>>2]=0;F[c+8>>2]=0;c=c+16|0;F[c>>2]=0;F[c+4>>2]=0;F[j>>2]=j+4;F[j+12>>2]=c;e=Z-32|0;Z=e;h=t+12|0;c=m+16|0;u=Ya(h,c);i=t+16|0;e:{if((u|0)==(i|0)){F[e+16>>2]=c;f:{g:{d=F[h+4>>2];h:{if(!d){f=h+4|0;c=f;break h}f=G[c+11|0];g=f<<24>>24<0;n=g?F[c>>2]:c;g=g?F[c+4>>2]:f;while(1){c=d;d=G[c+27|0];f=d<<24>>24<0;d=f?F[c+20>>2]:d;p=d>>>0<g>>>0;i:{j:{k:{l:{k=p?d:g;m:{if(k){f=f?F[c+16>>2]:c+16|0;q=sa(n,f,k);if(!q){if(d>>>0>g>>>0){break m}break l}if((q|0)>=0){break l}break m}if(d>>>0<=g>>>0){break k}}f=c;d=F[c>>2];if(d){continue}break h}d=sa(f,n,k);if(d){break j}}if(p){break i}break g}if((d|0)>=0){break g}}d=F[c+4>>2];if(d){continue}break}f=c+4|0}d=ka(32);n=d+16|0;g=F[e+16>>2];n:{if(D[g+11|0]>=0){p=F[g+4>>2];F[n>>2]=F[g>>2];F[n+4>>2]=p;F[n+8>>2]=F[g+8>>2];break n}ra(n,F[g>>2],F[g+4>>2])}F[d+8>>2]=c;F[d>>2]=0;F[d+4>>2]=0;F[d+28>>2]=0;F[f>>2]=d;c=d;g=F[F[h>>2]>>2];if(g){F[h>>2]=g;c=F[f>>2]}nb(F[h+4>>2],c);F[h+8>>2]=F[h+8>>2]+1;c=1;break f}d=c;c=0}D[e+28|0]=c;F[e+24>>2]=d;d=F[e+24>>2];c=F[d+28>>2];F[d+28>>2]=j;if(!c){break e}Ca(c+12|0,F[c+16>>2]);Ba(c,F[c+4>>2]);ja(c);break e}if(!j){break e}Ca(j+12|0,F[j+16>>2]);Ba(j,F[j+4>>2]);ja(j)}Z=e+32|0;d=(i|0)!=(u|0)}if(D[m+27|0]<0){ja(F[m+16>>2])}if(d){break a}}if(!j){break a}F[m+16>>2]=0;if(!fb(1,m+16|0,F[a>>2])){break a}q=0;x=F[m+16>>2];if(x){while(1){d=0;i=Z-32|0;Z=i;F[i+24>>2]=0;F[i+16>>2]=0;F[i+20>>2]=0;c=F[a>>2];f=F[c+8>>2];o:{p:{h=F[c+12>>2];g=F[c+20>>2];e=F[c+16>>2];q:{if((h|0)<=(g|0)&e>>>0>=f>>>0|(g|0)>(h|0)){break q}f=G[e+F[c>>2]|0];h=c;c=g;e=e+1|0;c=e?c:c+1|0;F[h+16>>2]=e;F[h+20>>2]=c;Sb(i+16|0,f);if(f){e=F[a>>2];n=Tb(i+16|0);p=F[e+8>>2];g=F[e+12>>2];c=F[e+20>>2];h=F[e+16>>2];k=h+f|0;c=k>>>0<f>>>0?c+1|0:c;if(k>>>0>p>>>0&(c|0)>=(g|0)|(c|0)>(g|0)){break q}la(n,h+F[e>>2]|0,f);c=F[e+20>>2];g=f;f=f+F[e+16>>2]|0;c=g>>>0>f>>>0?c+1|0:c;F[e+16>>2]=f;F[e+20>>2]=c}F[i+12>>2]=0;if(!fb(1,i+12|0,F[a>>2])){break q}f=F[i+12>>2];if(!f){break q}e=F[a>>2];c=F[e+8>>2];h=F[e+16>>2];g=c-h|0;c=F[e+12>>2]-(F[e+20>>2]+(c>>>0<h>>>0)|0)|0;if((c|0)<=0&f>>>0>g>>>0|(c|0)<0){break q}F[i+8>>2]=0;F[i>>2]=0;F[i+4>>2]=0;if((f|0)<0){break p}d=ka(f);F[i>>2]=d;c=d+f|0;F[i+8>>2]=c;l=ma(d,0,f);F[i+4>>2]=c;h=F[e+12>>2];y=h;p=F[e+8>>2];c=F[e+20>>2];k=F[e+16>>2];g=f+k|0;c=g>>>0<f>>>0?c+1|0:c;u=g;n=c;r:{if((c|0)<=(h|0)&g>>>0<=p>>>0|(c|0)<(h|0)){la(l,F[e>>2]+k|0,f);d=F[e+20>>2];c=f+F[e+16>>2]|0;d=c>>>0<f>>>0?d+1|0:d;F[e+16>>2]=c;F[e+20>>2]=d;h=Z-48|0;Z=h;e=Ya(j,i+16|0);if((e|0)!=(j+4|0)){c=F[e+4>>2];s:{if(!c){c=e;while(1){d=F[c+8>>2];f=F[d>>2]!=(c|0);c=d;if(f){continue}break}break s}while(1){d=c;c=F[c>>2];if(c){continue}break}}if((e|0)==F[j>>2]){F[j>>2]=d}F[j+8>>2]=F[j+8>>2]-1;f=F[j+4>>2];t:{u:{g=e;d=e;e=F[d>>2];if(e){c=F[g+4>>2];if(!c){break u}while(1){d=c;c=F[c>>2];if(c){continue}break}}e=F[d+4>>2];if(e){break u}e=0;k=1;break t}F[e+8>>2]=F[d+8>>2];k=0}l=F[d+8>>2];c=F[l>>2];v:{if((d|0)==(c|0)){F[l>>2]=e;if((d|0)==(f|0)){c=0;f=e;break v}c=F[l+4>>2];break v}F[l+4>>2]=e}r=!G[d+12|0];if((d|0)!=(g|0)){l=F[g+8>>2];F[d+8>>2]=l;F[l+(((g|0)!=F[F[g+8>>2]>>2])<<2)>>2]=d;l=F[g>>2];F[d>>2]=l;F[l+8>>2]=d;l=F[g+4>>2];F[d+4>>2]=l;if(l){F[l+8>>2]=d}D[d+12|0]=G[g+12|0];f=(f|0)==(g|0)?d:f}w:{if(r|!f){break w}if(k){while(1){e=G[c+12|0];x:{d=F[c+8>>2];if(F[d>>2]!=(c|0)){if(!e){D[c+12|0]=1;D[d+12|0]=0;e=F[d+4>>2];k=F[e>>2];F[d+4>>2]=k;if(k){F[k+8>>2]=d}F[e+8>>2]=F[d+8>>2];k=F[d+8>>2];F[(((d|0)!=F[k>>2])<<2)+k>>2]=e;F[e>>2]=d;F[d+8>>2]=e;d=c;c=F[c>>2];f=(c|0)==(f|0)?d:f;c=F[c+4>>2]}y:{z:{d=F[c>>2];A:{if(!(G[d+12|0]?0:d)){e=F[c+4>>2];if(G[e+12|0]?0:e){break A}D[c+12|0]=0;c=F[c+8>>2];B:{if((f|0)==(c|0)){c=f;break B}if(G[c+12|0]){break x}}D[c+12|0]=1;break w}e=F[c+4>>2];if(!e){break z}}if(G[e+12|0]){break z}d=c;break y}D[d+12|0]=1;D[c+12|0]=0;e=F[d+4>>2];F[c>>2]=e;if(e){F[e+8>>2]=c}F[d+8>>2]=F[c+8>>2];e=F[c+8>>2];F[((F[e>>2]!=(c|0))<<2)+e>>2]=d;F[d+4>>2]=c;F[c+8>>2]=d;e=c}c=F[d+8>>2];D[d+12|0]=G[c+12|0];D[c+12|0]=1;D[e+12|0]=1;d=F[c+4>>2];e=F[d>>2];F[c+4>>2]=e;if(e){F[e+8>>2]=c}F[d+8>>2]=F[c+8>>2];e=F[c+8>>2];F[(((c|0)!=F[e>>2])<<2)+e>>2]=d;F[d>>2]=c;F[c+8>>2]=d;break w}if(!e){D[c+12|0]=1;D[d+12|0]=0;e=F[c+4>>2];F[d>>2]=e;if(e){F[e+8>>2]=d}F[c+8>>2]=F[d+8>>2];e=F[d+8>>2];F[(((d|0)!=F[e>>2])<<2)+e>>2]=c;F[c+4>>2]=d;F[d+8>>2]=c;f=(d|0)==(f|0)?c:f;c=F[d>>2]}e=F[c>>2];C:{if(!(!e|G[e+12|0])){d=c;break C}d=F[c+4>>2];if(!(G[d+12|0]?0:d)){D[c+12|0]=0;c=F[c+8>>2];if((c|0)!=(f|0)?G[c+12|0]:0){break x}D[c+12|0]=1;break w}if(e){if(!G[e+12|0]){d=c;break C}d=F[c+4>>2]}D[d+12|0]=1;D[c+12|0]=0;e=F[d>>2];F[c+4>>2]=e;if(e){F[e+8>>2]=c}F[d+8>>2]=F[c+8>>2];e=F[c+8>>2];F[((F[e>>2]!=(c|0))<<2)+e>>2]=d;F[d>>2]=c;F[c+8>>2]=d;e=c}c=F[d+8>>2];D[d+12|0]=G[c+12|0];D[c+12|0]=1;D[e+12|0]=1;d=F[c>>2];e=F[d+4>>2];F[c>>2]=e;if(e){F[e+8>>2]=c}F[d+8>>2]=F[c+8>>2];e=F[c+8>>2];F[(((c|0)!=F[e>>2])<<2)+e>>2]=d;F[d+4>>2]=c;F[c+8>>2]=d;break w}d=c;c=F[c+8>>2];c=F[(((d|0)==F[c>>2])<<2)+c>>2];continue}}D[e+12|0]=1}c=F[g+28>>2];if(c){F[g+32>>2]=c;ja(c)}if(D[g+27|0]<0){ja(F[g+16>>2])}ja(g)}F[h+8>>2]=0;F[h>>2]=0;F[h+4>>2]=0;c=F[i+4>>2];d=F[i>>2];f=c-d|0;e=0;D:{E:{if((c|0)!=(d|0)){if((f|0)<0){break E}e=ka(f);c=ma(e,0,f);g=c+f|0;F[h+8>>2]=g;F[h+4>>2]=g;F[h>>2]=c;c=d}la(e,c,f);F:{if(D[i+27|0]>=0){F[h+24>>2]=F[i+24>>2];c=F[i+20>>2];F[h+16>>2]=F[i+16>>2];F[h+20>>2]=c;break F}ra(h+16|0,F[i+16>>2],F[i+20>>2])}Tc(h+28|0,h);f=h+16|0;c=f;G:{H:{d=F[j+4>>2];I:{if(!d){e=j+4|0;c=e;break I}e=G[c+11|0];g=e<<24>>24<0;k=g?F[c>>2]:c;g=g?F[c+4>>2]:e;while(1){c=d;d=G[c+27|0];e=d<<24>>24<0;d=e?F[c+20>>2]:d;l=d>>>0<g>>>0;J:{K:{L:{M:{r=l?d:g;N:{if(r){e=e?F[c+16>>2]:c+16|0;z=sa(k,e,r);if(!z){if(d>>>0>g>>>0){break N}break M}if((z|0)>=0){break M}break N}if(d>>>0<=g>>>0){break L}}e=c;d=F[c>>2];if(d){continue}break I}d=sa(e,k,r);if(d){break K}}if(l){break J}break H}if((d|0)>=0){break H}}d=F[c+4>>2];if(d){continue}break}e=c+4|0}d=ka(40);F[d+24>>2]=F[f+8>>2];g=F[f+4>>2];F[d+16>>2]=F[f>>2];F[d+20>>2]=g;F[f>>2]=0;F[f+4>>2]=0;F[f+8>>2]=0;Tc(d+28|0,f+12|0);F[d+8>>2]=c;F[d>>2]=0;F[d+4>>2]=0;F[e>>2]=d;c=d;f=F[F[j>>2]>>2];if(f){F[j>>2]=f;c=F[e>>2]}nb(F[j+4>>2],c);F[j+8>>2]=F[j+8>>2]+1;c=1;break G}d=c;c=0}D[h+44|0]=c;F[h+40>>2]=d;c=F[h+28>>2];if(c){F[h+32>>2]=c;ja(c)}if(D[h+27|0]<0){ja(F[h+16>>2])}c=F[h>>2];if(c){F[h+4>>2]=c;ja(c)}Z=h+48|0;break D}na();v()}d=F[i>>2];if(!d){break r}}F[i+4>>2]=d;ja(d)}d=(n|0)<=(y|0)&p>>>0>=u>>>0|(n|0)<(y|0)}if(D[i+27|0]<0){ja(F[i+16>>2])}Z=i+32|0;break o}na();v()}if(!d){break a}q=q+1|0;if((x|0)!=(q|0)){continue}break}}F[m+12>>2]=0;if(!fb(1,m+12|0,F[a>>2])){break a}c=F[a>>2];e=F[c+8>>2];f=F[c+16>>2];h=e-f|0;d=F[m+12>>2];c=F[c+12>>2]-(F[c+20>>2]+(e>>>0<f>>>0)|0)|0;if(h>>>0<d>>>0&(c|0)<=0|(c|0)<0){break a}if(d){q=0;h=((t|0)!=0)+w|0;while(1){O:{if(b>>>0<s>>>0){F[b+8>>2]=h;F[b+4>>2]=0;F[b>>2]=j;b=b+12|0;d=F[m+12>>2];break O}c=b-o|0;g=(c|0)/12|0;b=g+1|0;if(b>>>0>=357913942){break c}e=(s-o|0)/12|0;f=e<<1;e=e>>>0>=178956970?357913941:b>>>0<f>>>0?f:b;if(e){if(e>>>0>=357913942){break b}f=ka(L(e,12))}else{f=0}b=f+L(g,12)|0;F[b+8>>2]=h;F[b+4>>2]=0;F[b>>2]=j;c=pa(b+L((c|0)/-12|0,12)|0,o,c);s=f+L(e,12)|0;b=b+12|0;if(o){ja(o)}o=c}q=q+1|0;if(q>>>0<d>>>0){continue}break}}if((b|0)!=(o|0)){continue}break}A=1;break a}na();v()}oa();v()}if(o){ja(o)}Z=m+32|0;return A}function me(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;h=Z-48|0;Z=h;a:{if((c|0)!=1){break a}i=F[a+4>>2];c=F[a+12>>2];F[h+40>>2]=0;F[h+32>>2]=0;F[h+36>>2]=0;F[h+24>>2]=0;F[h+28>>2]=0;F[h+16>>2]=0;F[h+20>>2]=0;F[h+8>>2]=0;F[h+12>>2]=0;d=h+8|0;b:{if((b|0)==-2){break b}k=F[F[F[i+4>>2]+8>>2]+(c<<2)>>2];if(($[F[F[i>>2]+8>>2]](i)|0)==1){j=Z-32|0;Z=j;l=F[F[F[i+4>>2]+8>>2]+(c<<2)>>2];c:{d:{e:{if(($[F[F[i>>2]+8>>2]](i)|0)!=1|b-1>>>0>5){break e}g=$[F[F[i>>2]+36>>2]](i)|0;f=$[F[F[i>>2]+44>>2]](i,c)|0;if(!g|!f){break e}c=$[F[F[i>>2]+40>>2]](i,c)|0;if(c){a=F[i+44>>2];F[j+12>>2]=c;F[j+8>>2]=a;F[j+20>>2]=f;F[j+16>>2]=f+12;f=j+8|0;a=0;f:{g:{switch(b-1|0){case 0:b=ka(60);F[b+4>>2]=l;F[b>>2]=2960;a=F[d+4>>2];F[b+8>>2]=F[d>>2];F[b+12>>2]=a;a=F[d+12>>2];F[b+16>>2]=F[d+8>>2];F[b+20>>2]=a;a=F[d+20>>2];F[b+24>>2]=F[d+16>>2];F[b+28>>2]=a;F[b+40>>2]=0;F[b+32>>2]=0;F[b+36>>2]=0;a=F[d+24>>2];g=F[d+28>>2];if((a|0)!=(g|0)){c=g-a|0;if((c|0)<0){break d}e=ka(c);F[b+32>>2]=e;F[b+40>>2]=(c&-4)+e;while(1){F[e>>2]=F[a>>2];e=e+4|0;a=a+4|0;if((g|0)!=(a|0)){continue}break}F[b+36>>2]=e}a=F[f+4>>2];F[b+44>>2]=F[f>>2];F[b+48>>2]=a;a=F[f+12>>2];F[b+52>>2]=F[f+8>>2];F[b+56>>2]=a;F[b>>2]=2252;a=b;break f;case 3:b=ka(112);F[b+4>>2]=l;F[b>>2]=2960;a=F[d+4>>2];F[b+8>>2]=F[d>>2];F[b+12>>2]=a;a=F[d+12>>2];F[b+16>>2]=F[d+8>>2];F[b+20>>2]=a;a=F[d+20>>2];F[b+24>>2]=F[d+16>>2];F[b+28>>2]=a;F[b+40>>2]=0;F[b+32>>2]=0;F[b+36>>2]=0;a=F[d+24>>2];g=F[d+28>>2];if((a|0)!=(g|0)){c=g-a|0;if((c|0)<0){break d}e=ka(c);F[b+32>>2]=e;F[b+40>>2]=(c&-4)+e;while(1){F[e>>2]=F[a>>2];e=e+4|0;a=a+4|0;if((g|0)!=(a|0)){continue}break}F[b+36>>2]=e}a=F[f+4>>2];F[b+44>>2]=F[f>>2];F[b+48>>2]=a;a=F[f+12>>2];F[b+52>>2]=F[f+8>>2];F[b+56>>2]=a;F[b+60>>2]=0;F[b+64>>2]=0;F[b>>2]=3016;F[b+68>>2]=0;F[b+72>>2]=0;F[b+76>>2]=0;F[b+80>>2]=0;F[b+84>>2]=0;F[b+88>>2]=0;F[b+92>>2]=0;F[b+96>>2]=0;F[b+100>>2]=0;F[b+104>>2]=0;F[b+108>>2]=0;a=b;break f;case 4:b=ka(104);F[b+4>>2]=l;F[b>>2]=2960;a=F[d+4>>2];F[b+8>>2]=F[d>>2];F[b+12>>2]=a;a=F[d+12>>2];F[b+16>>2]=F[d+8>>2];F[b+20>>2]=a;a=F[d+20>>2];F[b+24>>2]=F[d+16>>2];F[b+28>>2]=a;F[b+40>>2]=0;F[b+32>>2]=0;F[b+36>>2]=0;a=F[d+24>>2];g=F[d+28>>2];if((a|0)!=(g|0)){c=g-a|0;if((c|0)<0){break d}e=ka(c);F[b+32>>2]=e;F[b+40>>2]=(c&-4)+e;while(1){F[e>>2]=F[a>>2];e=e+4|0;a=a+4|0;if((g|0)!=(a|0)){continue}break}F[b+36>>2]=e}a=F[f+4>>2];F[b+44>>2]=F[f>>2];F[b+48>>2]=a;a=F[f+12>>2];F[b+52>>2]=F[f+8>>2];F[b+56>>2]=a;F[b+84>>2]=0;F[b+76>>2]=0;F[b+80>>2]=0;F[b+60>>2]=0;F[b+64>>2]=0;F[b>>2]=3264;a=F[f+4>>2];F[b+88>>2]=F[f>>2];F[b+92>>2]=a;a=F[f+12>>2];F[b+96>>2]=F[f+8>>2];F[b+100>>2]=a;a=b;break f;case 5:break g;default:break f}}a=ka(128);F[a+4>>2]=l;F[a>>2]=2960;b=F[d+4>>2];F[a+8>>2]=F[d>>2];F[a+12>>2]=b;b=F[d+12>>2];F[a+16>>2]=F[d+8>>2];F[a+20>>2]=b;b=F[d+20>>2];F[a+24>>2]=F[d+16>>2];F[a+28>>2]=b;F[a+40>>2]=0;F[a+32>>2]=0;F[a+36>>2]=0;h:{i:{c=F[d+28>>2];b=F[d+24>>2];if((c|0)!=(b|0)){c=c-b|0;if((c|0)<0){break i}b=ka(c);F[a+36>>2]=b;F[a+32>>2]=b;F[a+40>>2]=(c&-4)+b;e=F[d+24>>2];c=F[d+28>>2];if((e|0)!=(c|0)){while(1){F[b>>2]=F[e>>2];b=b+4|0;e=e+4|0;if((c|0)!=(e|0)){continue}break}}F[a+36>>2]=b}F[a>>2]=2904;b=F[f+4>>2];F[a+44>>2]=F[f>>2];F[a+48>>2]=b;b=F[f+12>>2];F[a+52>>2]=F[f+8>>2];F[a+56>>2]=b;b=a- -64|0;F[b>>2]=0;F[b+4>>2]=0;F[a+60>>2]=4128;F[a>>2]=3500;b=F[f+4>>2];F[a+72>>2]=F[f>>2];F[a+76>>2]=b;b=F[f+12>>2];F[a+80>>2]=F[f+8>>2];F[a+84>>2]=b;F[a+104>>2]=1065353216;F[a+108>>2]=-1;F[a+96>>2]=-1;F[a+100>>2]=-1;F[a+88>>2]=1;F[a+92>>2]=-1;F[a+60>>2]=3736;F[a+112>>2]=0;F[a+116>>2]=0;D[a+117|0]=0;D[a+118|0]=0;D[a+119|0]=0;D[a+120|0]=0;D[a+121|0]=0;D[a+122|0]=0;D[a+123|0]=0;D[a+124|0]=0;break h}na();v()}break f}e=a;break e}a=F[i+44>>2];F[j+12>>2]=g;F[j+8>>2]=a;F[j+20>>2]=f;F[j+16>>2]=f+12;f=j+8|0;a=0;j:{k:{switch(b-1|0){case 0:b=ka(60);F[b+4>>2]=l;F[b>>2]=2960;a=F[d+4>>2];F[b+8>>2]=F[d>>2];F[b+12>>2]=a;a=F[d+12>>2];F[b+16>>2]=F[d+8>>2];F[b+20>>2]=a;a=F[d+20>>2];F[b+24>>2]=F[d+16>>2];F[b+28>>2]=a;F[b+40>>2]=0;F[b+32>>2]=0;F[b+36>>2]=0;a=F[d+24>>2];g=F[d+28>>2];if((a|0)!=(g|0)){c=g-a|0;if((c|0)<0){break d}e=ka(c);F[b+32>>2]=e;F[b+40>>2]=(c&-4)+e;while(1){F[e>>2]=F[a>>2];e=e+4|0;a=a+4|0;if((g|0)!=(a|0)){continue}break}F[b+36>>2]=e}a=F[f+4>>2];F[b+44>>2]=F[f>>2];F[b+48>>2]=a;a=F[f+12>>2];F[b+52>>2]=F[f+8>>2];F[b+56>>2]=a;F[b>>2]=4156;a=b;break j;case 3:b=ka(112);F[b+4>>2]=l;F[b>>2]=2960;a=F[d+4>>2];F[b+8>>2]=F[d>>2];F[b+12>>2]=a;a=F[d+12>>2];F[b+16>>2]=F[d+8>>2];F[b+20>>2]=a;a=F[d+20>>2];F[b+24>>2]=F[d+16>>2];F[b+28>>2]=a;F[b+40>>2]=0;F[b+32>>2]=0;F[b+36>>2]=0;a=F[d+24>>2];g=F[d+28>>2];if((a|0)!=(g|0)){c=g-a|0;if((c|0)<0){break d}e=ka(c);F[b+32>>2]=e;F[b+40>>2]=(c&-4)+e;while(1){F[e>>2]=F[a>>2];e=e+4|0;a=a+4|0;if((g|0)!=(a|0)){continue}break}F[b+36>>2]=e}a=F[f+4>>2];F[b+44>>2]=F[f>>2];F[b+48>>2]=a;a=F[f+12>>2];F[b+52>>2]=F[f+8>>2];F[b+56>>2]=a;F[b+60>>2]=0;F[b+64>>2]=0;F[b>>2]=4580;F[b+68>>2]=0;F[b+72>>2]=0;F[b+76>>2]=0;F[b+80>>2]=0;F[b+84>>2]=0;F[b+88>>2]=0;F[b+92>>2]=0;F[b+96>>2]=0;F[b+100>>2]=0;F[b+104>>2]=0;F[b+108>>2]=0;a=b;break j;case 4:b=ka(104);F[b+4>>2]=l;F[b>>2]=2960;a=F[d+4>>2];F[b+8>>2]=F[d>>2];F[b+12>>2]=a;a=F[d+12>>2];F[b+16>>2]=F[d+8>>2];F[b+20>>2]=a;a=F[d+20>>2];F[b+24>>2]=F[d+16>>2];F[b+28>>2]=a;F[b+40>>2]=0;F[b+32>>2]=0;F[b+36>>2]=0;a=F[d+24>>2];g=F[d+28>>2];if((a|0)!=(g|0)){c=g-a|0;if((c|0)<0){break d}e=ka(c);F[b+32>>2]=e;F[b+40>>2]=(c&-4)+e;while(1){F[e>>2]=F[a>>2];e=e+4|0;a=a+4|0;if((g|0)!=(a|0)){continue}break}F[b+36>>2]=e}a=F[f+4>>2];F[b+44>>2]=F[f>>2];F[b+48>>2]=a;a=F[f+12>>2];F[b+52>>2]=F[f+8>>2];F[b+56>>2]=a;F[b+84>>2]=0;F[b+76>>2]=0;F[b+80>>2]=0;F[b+60>>2]=0;F[b+64>>2]=0;F[b>>2]=4816;a=F[f+4>>2];F[b+88>>2]=F[f>>2];F[b+92>>2]=a;a=F[f+12>>2];F[b+96>>2]=F[f+8>>2];F[b+100>>2]=a;a=b;break j;case 5:break k;default:break j}}a=ka(128);F[a+4>>2]=l;F[a>>2]=2960;b=F[d+4>>2];F[a+8>>2]=F[d>>2];F[a+12>>2]=b;b=F[d+12>>2];F[a+16>>2]=F[d+8>>2];F[a+20>>2]=b;b=F[d+20>>2];F[a+24>>2]=F[d+16>>2];F[a+28>>2]=b;F[a+40>>2]=0;F[a+32>>2]=0;F[a+36>>2]=0;l:{m:{c=F[d+28>>2];b=F[d+24>>2];if((c|0)!=(b|0)){c=c-b|0;if((c|0)<0){break m}b=ka(c);F[a+36>>2]=b;F[a+32>>2]=b;F[a+40>>2]=(c&-4)+b;e=F[d+24>>2];c=F[d+28>>2];if((e|0)!=(c|0)){while(1){F[b>>2]=F[e>>2];b=b+4|0;e=e+4|0;if((c|0)!=(e|0)){continue}break}}F[a+36>>2]=b}F[a>>2]=4524;b=F[f+4>>2];F[a+44>>2]=F[f>>2];F[a+48>>2]=b;b=F[f+12>>2];F[a+52>>2]=F[f+8>>2];F[a+56>>2]=b;b=a- -64|0;F[b>>2]=0;F[b+4>>2]=0;F[a+60>>2]=5624;F[a>>2]=5040;b=F[f+4>>2];F[a+72>>2]=F[f>>2];F[a+76>>2]=b;b=F[f+12>>2];F[a+80>>2]=F[f+8>>2];F[a+84>>2]=b;F[a+104>>2]=1065353216;F[a+108>>2]=-1;F[a+96>>2]=-1;F[a+100>>2]=-1;F[a+88>>2]=1;F[a+92>>2]=-1;F[a+60>>2]=5260;F[a+112>>2]=0;F[a+116>>2]=0;D[a+117|0]=0;D[a+118|0]=0;D[a+119|0]=0;D[a+120|0]=0;D[a+121|0]=0;D[a+122|0]=0;D[a+123|0]=0;D[a+124|0]=0;break l}na();v()}break j}e=a}Z=j+32|0;break c}na();v()}if(e){break b}}e=ka(44);F[e+4>>2]=k;F[e>>2]=2960;a=F[d+4>>2];F[e+8>>2]=F[d>>2];F[e+12>>2]=a;a=F[d+12>>2];F[e+16>>2]=F[d+8>>2];F[e+20>>2]=a;a=F[d+20>>2];F[e+24>>2]=F[d+16>>2];F[e+28>>2]=a;F[e+40>>2]=0;F[e+32>>2]=0;F[e+36>>2]=0;n:{c=F[d+24>>2];b=F[d+28>>2];if((c|0)!=(b|0)){a=b-c|0;if((a|0)<0){break n}k=ka(a);F[e+32>>2]=k;F[e+40>>2]=(a&-4)+k;while(1){F[k>>2]=F[c>>2];k=k+4|0;c=c+4|0;if((b|0)!=(c|0)){continue}break}F[e+36>>2]=k}F[e>>2]=5652;break b}na();v()}k=e;a=F[h+32>>2];if(!a){break a}F[h+36>>2]=a;ja(a)}Z=h+48|0;return k|0}function rf(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0;m=Z-16|0;Z=m;F[m+12>>2]=b;b=ka(32);F[m>>2]=b;F[m+4>>2]=24;F[m+8>>2]=-2147483616;c=G[1196]|G[1197]<<8|(G[1198]<<16|G[1199]<<24);d=G[1192]|G[1193]<<8|(G[1194]<<16|G[1195]<<24);D[b+16|0]=d;D[b+17|0]=d>>>8;D[b+18|0]=d>>>16;D[b+19|0]=d>>>24;D[b+20|0]=c;D[b+21|0]=c>>>8;D[b+22|0]=c>>>16;D[b+23|0]=c>>>24;c=G[1188]|G[1189]<<8|(G[1190]<<16|G[1191]<<24);d=G[1184]|G[1185]<<8|(G[1186]<<16|G[1187]<<24);D[b+8|0]=d;D[b+9|0]=d>>>8;D[b+10|0]=d>>>16;D[b+11|0]=d>>>24;D[b+12|0]=c;D[b+13|0]=c>>>8;D[b+14|0]=c>>>16;D[b+15|0]=c>>>24;c=G[1180]|G[1181]<<8|(G[1182]<<16|G[1183]<<24);d=G[1176]|G[1177]<<8|(G[1178]<<16|G[1179]<<24);D[b|0]=d;D[b+1|0]=d>>>8;D[b+2|0]=d>>>16;D[b+3|0]=d>>>24;D[b+4|0]=c;D[b+5|0]=c>>>8;D[b+6|0]=c>>>16;D[b+7|0]=c>>>24;D[b+24|0]=0;l=Z-48|0;Z=l;f=F[m+12>>2];d=a;a=a+16|0;b=F[a>>2];a:{b:{if(!b){break b}c=a;while(1){e=(f|0)>F[b+16>>2];c=e?c:b;b=F[(e?b+4|0:b)>>2];if(b){continue}break}if((a|0)==(c|0)){break b}if((f|0)>=F[c+16>>2]){break a}}F[l+28>>2]=0;F[l+32>>2]=0;y=l+24|0;F[l+24>>2]=y|4;a=l+16|0;F[a>>2]=0;F[a+4>>2]=0;F[l+8>>2]=f;F[l+12>>2]=a;t=l+8|0;a=t;x=Z-16|0;Z=x;u=d+12|0;c=F[u+4>>2];c:{d:{if(!c){o=u+4|0;d=o;break d}a=F[a>>2];while(1){d=c;b=F[c+16>>2];if((b|0)>(a|0)){o=d;c=F[d>>2];if(c){continue}break d}if((a|0)<=(b|0)){g=d;a=0;break c}c=F[d+4>>2];if(c){continue}break}o=d+4|0}g=ka(32);b=F[t>>2];q=g+24|0;a=q;F[a>>2]=0;F[a+4>>2]=0;F[g+16>>2]=b;r=g+20|0;F[r>>2]=a;c=F[t+4>>2];z=t+8|0;if((c|0)!=(z|0)){while(1){p=Z-16|0;Z=p;a=p+8|0;k=c+16|0;e:{f:{g:{h:{i:{j:{k:{f=q;e=r+4|0;l:{if((f|0)==(e|0)){break l}b=G[f+27|0];h=b<<24>>24<0;i=G[k+11|0];n=i<<24>>24;j=(n|0)<0;i=j?F[k+4>>2]:i;b=h?F[f+20>>2]:b;s=i>>>0>b>>>0;w=s?b:i;if(w){j=j?F[k>>2]:k;h=h?F[f+16>>2]:f+16|0;A=sa(j,h,w);if(!A){if(b>>>0>i>>>0){break l}break k}if((A|0)>=0){break k}break l}if(b>>>0<=i>>>0){break j}}h=F[f>>2];m:{a=f;n:{if((a|0)==F[r>>2]){break n}o:{if(!h){b=f;while(1){a=F[b+8>>2];i=F[a>>2]==(b|0);b=a;if(i){continue}break}break o}b=h;while(1){a=b;b=F[b+4>>2];if(b){continue}break}}i=G[k+11|0];s=i<<24>>24;b=(s|0)<0;j=G[a+27|0];n=j<<24>>24<0;p:{i=b?F[k+4>>2]:i;j=n?F[a+20>>2]:j;w=i>>>0<j>>>0?i:j;if(w){b=sa(n?F[a+16>>2]:a+16|0,b?F[k>>2]:k,w);if(b){break p}}if(i>>>0>j>>>0){break n}break m}if((b|0)>=0){break m}}if(!h){F[p+12>>2]=f;a=f;break e}F[p+12>>2]=a;a=a+4|0;break e}b=F[e>>2];if(!b){F[p+12>>2]=e;a=e;break e}h=(s|0)<0?F[k>>2]:k;f=e;while(1){a=b;b=G[b+27|0];e=b<<24>>24<0;b=e?F[a+20>>2]:b;k=b>>>0<i>>>0;q:{r:{s:{t:{n=k?b:i;u:{if(n){e=e?F[a+16>>2]:a+16|0;j=sa(h,e,n);if(!j){if(b>>>0>i>>>0){break u}break t}if((j|0)>=0){break t}break u}if(b>>>0<=i>>>0){break s}}f=a;b=F[a>>2];if(b){continue}break g}b=sa(e,h,n);if(b){break r}}if(k){break q}break g}if((b|0)>=0){break g}}f=a+4|0;b=F[a+4>>2];if(b){continue}break}break g}b=sa(h,j,w);if(b){break i}}if(s){break h}break f}if((b|0)>=0){break f}}h=F[f+4>>2];v:{if(!h){b=f;while(1){a=F[b+8>>2];j=F[a>>2]!=(b|0);b=a;if(j){continue}break}break v}b=h;while(1){a=b;b=F[b>>2];if(b){continue}break}}w:{x:{if((a|0)==(e|0)){break x}j=G[a+27|0];b=j<<24>>24<0;y:{j=b?F[a+20>>2]:j;s=i>>>0>j>>>0?j:i;if(s){b=sa((n|0)<0?F[k>>2]:k,b?F[a+16>>2]:a+16|0,s);if(b){break y}}if(i>>>0<j>>>0){break x}break w}if((b|0)>=0){break w}}if(!h){F[p+12>>2]=f;a=f+4|0;break e}F[p+12>>2]=a;break e}b=F[e>>2];if(!b){F[p+12>>2]=e;a=e;break e}h=(n|0)<0?F[k>>2]:k;f=e;while(1){a=b;b=G[b+27|0];e=b<<24>>24<0;b=e?F[a+20>>2]:b;k=b>>>0<i>>>0;z:{A:{B:{C:{n=k?b:i;D:{if(n){e=e?F[a+16>>2]:a+16|0;j=sa(h,e,n);if(!j){if(b>>>0>i>>>0){break D}break C}if((j|0)>=0){break C}break D}if(b>>>0<=i>>>0){break B}}f=a;b=F[a>>2];if(b){continue}break g}b=sa(e,h,n);if(b){break A}}if(k){break z}break g}if((b|0)>=0){break g}}f=a+4|0;b=F[a+4>>2];if(b){continue}break}}F[p+12>>2]=a;a=f;break e}F[p+12>>2]=f;F[a>>2]=f}f=a;a=F[a>>2];if(a){b=0}else{a=ka(40);b=a+16|0;E:{if(D[c+27|0]>=0){e=F[c+20>>2];F[b>>2]=F[c+16>>2];F[b+4>>2]=e;F[b+8>>2]=F[c+24>>2];break E}ra(b,F[c+16>>2],F[c+20>>2])}b=a+28|0;F:{if(D[c+39|0]>=0){e=F[c+32>>2];F[b>>2]=F[c+28>>2];F[b+4>>2]=e;F[b+8>>2]=F[c+36>>2];break F}ra(b,F[c+28>>2],F[c+32>>2])}F[a+8>>2]=F[p+12>>2];F[a>>2]=0;F[a+4>>2]=0;F[f>>2]=a;b=a;e=F[F[r>>2]>>2];if(e){F[r>>2]=e;b=F[f>>2]}nb(F[r+4>>2],b);F[r+8>>2]=F[r+8>>2]+1;b=1}D[x+12|0]=b;F[x+8>>2]=a;Z=p+16|0;b=F[c+4>>2];G:{if(b){while(1){c=b;b=F[b>>2];if(b){continue}break G}}while(1){a=c;c=F[c+8>>2];if((a|0)!=F[c>>2]){continue}break}}if((c|0)!=(z|0)){continue}break}}F[g+8>>2]=d;F[g>>2]=0;F[g+4>>2]=0;F[o>>2]=g;c=g;a=F[F[u>>2]>>2];if(a){F[u>>2]=a;c=F[o>>2]}nb(F[u+4>>2],c);F[u+8>>2]=F[u+8>>2]+1;a=1}D[l+44|0]=a;F[l+40>>2]=g;Z=x+16|0;c=F[l+40>>2];ib(t|4,F[l+16>>2]);ib(y,F[l+28>>2])}f=Z-48|0;Z=f;d=f+8|0;g=Z-32|0;Z=g;o=g+32|0;b=o;a=g+21|0;H:{if((b|0)==(a|0)){break H}}e=b-a|0;I:{if((e|0)<=9){h=61;if((e|0)<(I[2684]<=1|0)){break I}}D[a|0]=49;b=a+1|0;h=0}F[g+12>>2]=h;F[g+8>>2]=b;h=Z-16|0;Z=h;e=Z-16|0;Z=e;J:{q=F[g+8>>2];g=q-a|0;if(g>>>0<=2147483631){K:{if(g>>>0<11){D[d+11|0]=g|G[d+11|0]&128;D[d+11|0]=G[d+11|0]&127;b=d;break K}t=e+8|0;if(g>>>0>=11){k=g+16&-16;b=k-1|0;b=(b|0)==11?k:b}else{b=10}sb(t,b+1|0);b=F[e+8>>2];F[d>>2]=b;F[d+8>>2]=F[d+8>>2]&-2147483648|F[e+12>>2]&2147483647;F[d+8>>2]=F[d+8>>2]|-2147483648;F[d+4>>2]=g}while(1){if((a|0)!=(q|0)){D[b|0]=G[a|0];b=b+1|0;a=a+1|0;continue}break}D[e+7|0]=0;D[b|0]=G[e+7|0];Z=e+16|0;break J}za();v()}Z=h+16|0;Z=o;F[f+32>>2]=m;L:{M:{a=c+20|0;d=F[a+4>>2];N:{if(!d){g=a+4|0;c=g;break N}b=G[m+11|0];c=b<<24>>24<0;e=c?F[m>>2]:m;b=c?F[m+4>>2]:b;while(1){c=d;d=G[c+27|0];g=d<<24>>24<0;d=g?F[c+20>>2]:d;o=d>>>0<b>>>0;O:{P:{Q:{R:{h=o?d:b;S:{if(h){g=g?F[c+16>>2]:c+16|0;q=sa(e,g,h);if(!q){if(b>>>0<d>>>0){break S}break R}if((q|0)>=0){break R}break S}if(b>>>0>=d>>>0){break Q}}g=c;d=F[c>>2];if(d){continue}break N}d=sa(g,e,h);if(d){break P}}if(o){break O}break M}if((d|0)>=0){break M}}d=F[c+4>>2];if(d){continue}break}g=c+4|0}d=ka(40);e=d+16|0;b=F[f+32>>2];T:{if(D[b+11|0]>=0){o=F[b+4>>2];F[e>>2]=F[b>>2];F[e+4>>2]=o;F[e+8>>2]=F[b+8>>2];break T}ra(e,F[b>>2],F[b+4>>2])}F[d+8>>2]=c;F[d>>2]=0;F[d+4>>2]=0;F[d+36>>2]=0;F[d+28>>2]=0;F[d+32>>2]=0;F[g>>2]=d;c=d;b=F[F[a>>2]>>2];if(b){F[a>>2]=b;c=F[g>>2]}nb(F[a+4>>2],c);F[a+8>>2]=F[a+8>>2]+1;a=1;break L}d=c;a=0}D[f+44|0]=a;F[f+40>>2]=d;a=F[f+40>>2];if(D[a+39|0]<0){ja(F[a+28>>2])}b=F[f+12>>2];F[a+28>>2]=F[f+8>>2];F[a+32>>2]=b;F[a+36>>2]=F[f+16>>2];Z=f+48|0;Z=l+48|0;if(D[m+11|0]<0){ja(F[m>>2])}Z=m+16|0}function zd(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0;h=Z-32|0;Z=h;g=F[F[a+4>>2]+44>>2];c=F[a+8>>2];d=F[c>>2];c=F[c+4>>2];F[h+24>>2]=0;F[h+16>>2]=0;F[h+20>>2]=0;d=(c-d>>2>>>0)/3|0;c=F[g+96>>2];f=(F[g+100>>2]-c|0)/12|0;a:{if(d>>>0>f>>>0){e=d-f|0;i=F[g+104>>2];c=F[g+100>>2];if(e>>>0<=(i-c|0)/12>>>0){b:{if(!e){break b}d=c;f=L(e,12)-12|0;i=((f>>>0)/12|0)+1&3;if(i){while(1){l=F[h+20>>2];F[d>>2]=F[h+16>>2];F[d+4>>2]=l;F[d+8>>2]=F[h+24>>2];d=d+12|0;j=j+1|0;if((i|0)!=(j|0)){continue}break}}c=L(e,12)+c|0;if(f>>>0<36){break b}while(1){f=F[h+20>>2];F[d>>2]=F[h+16>>2];F[d+4>>2]=f;F[d+8>>2]=F[h+24>>2];F[d+20>>2]=F[h+24>>2];f=F[h+20>>2];F[d+12>>2]=F[h+16>>2];F[d+16>>2]=f;F[d+32>>2]=F[h+24>>2];f=F[h+20>>2];F[d+24>>2]=F[h+16>>2];F[d+28>>2]=f;f=F[h+20>>2];F[d+36>>2]=F[h+16>>2];F[d+40>>2]=f;F[d+44>>2]=F[h+24>>2];d=d+48|0;if((d|0)!=(c|0)){continue}break}}F[g+100>>2]=c;break a}c:{f=F[g+96>>2];n=(c-f|0)/12|0;d=n+e|0;if(d>>>0<357913942){f=(i-f|0)/12|0;i=f<<1;i=f>>>0>=178956970?357913941:d>>>0<i>>>0?i:d;if(i){if(i>>>0>=357913942){break c}l=ka(L(i,12))}f=L(n,12)+l|0;d=f;e=L(e,12);n=e-12|0;q=((n>>>0)/12|0)+1&3;if(q){while(1){r=F[h+20>>2];F[d>>2]=F[h+16>>2];F[d+4>>2]=r;F[d+8>>2]=F[h+24>>2];d=d+12|0;j=j+1|0;if((q|0)!=(j|0)){continue}break}}e=e+f|0;if(n>>>0>=36){while(1){j=F[h+20>>2];F[d>>2]=F[h+16>>2];F[d+4>>2]=j;F[d+8>>2]=F[h+24>>2];F[d+20>>2]=F[h+24>>2];j=F[h+20>>2];F[d+12>>2]=F[h+16>>2];F[d+16>>2]=j;F[d+32>>2]=F[h+24>>2];j=F[h+20>>2];F[d+24>>2]=F[h+16>>2];F[d+28>>2]=j;j=F[h+20>>2];F[d+36>>2]=F[h+16>>2];F[d+40>>2]=j;F[d+44>>2]=F[h+24>>2];d=d+48|0;if((e|0)!=(d|0)){continue}break}}j=F[g+96>>2];if((j|0)!=(c|0)){while(1){c=c-12|0;n=F[c+4>>2];f=f-12|0;d=f;F[d>>2]=F[c>>2];F[d+4>>2]=n;F[d+8>>2]=F[c+8>>2];if((c|0)!=(j|0)){continue}break}c=F[g+96>>2]}F[g+104>>2]=L(i,12)+l;F[g+100>>2]=e;F[g+96>>2]=f;if(c){ja(c)}break a}na();v()}oa();v()}if(d>>>0>=f>>>0){break a}F[g+100>>2]=c+L(d,12)}d:{if(F[a+216>>2]==F[a+220>>2]){j=F[a+4>>2];c=F[j+44>>2];d=F[c+100>>2];f=F[c+96>>2];if((d|0)!=(f|0)){c=(d-f|0)/12|0;o=c>>>0<=1?1:c;c=0;while(1){d=F[a+8>>2];i=f+L(c,12)|0;g=L(c,3);e:{f:{if((g|0)==-1){e=F[(F[d>>2]+(g<<2)|0)+4>>2];k=-1;g=1;break f}e=-1;k=F[F[d>>2]+(g<<2)>>2];l=g+1|0;if((l|0)==-1){g=0;break f}e=F[F[d>>2]+(l<<2)>>2];g=g+2|0;m=-1;if((g|0)==-1){break e}}m=F[F[d>>2]+(g<<2)>>2]}F[i+8>>2]=m;F[i+4>>2]=e;F[i>>2]=k;c=c+1|0;if((o|0)!=(c|0)){continue}break}}F[F[j+4>>2]+80>>2]=b;c=1;break d}d=0;F[h+24>>2]=0;F[h+16>>2]=0;F[h+20>>2]=0;l=F[a+8>>2];c=F[l>>2];g=F[l+4>>2];F[h+8>>2]=0;F[h>>2]=0;F[h+4>>2]=0;b=0;g:{h:{i:{j:{k:{l:{if((c|0)!=(g|0)){c=g-c|0;if((c|0)<0){break l}b=ka(c);F[h>>2]=b;F[h+8>>2]=(c&-4)+b;u=h,w=ma(b,0,c)+c|0,F[u+4>>2]=w}c=F[l+24>>2];if((F[l+28>>2]-c|0)<4){break h}f=0;while(1){g=F[(p<<2)+c>>2];m:{if((g|0)==-1){break m}n:{if(F[F[a+120>>2]+(p>>>3&536870908)>>2]>>>p&1){break n}n=F[a+216>>2];c=F[a+220>>2];if((n|0)==(c|0)){break n}e=g+2|0;i=(g>>>0)%3|0;q=i?g-1|0:e;c=(c-n|0)/144|0;r=c>>>0<=1?1:c;j=0;t=(i|0)!=0|(e|0)!=-1;while(1){s=g<<2;i=L(j,144)+n|0;c=F[s+F[F[i+68>>2]>>2]>>2];o:{if(!(F[F[i+16>>2]+(c>>>3&536870908)>>2]>>>c&1)){break o}c=-1;p:{if(!t){break p}e=F[F[l+12>>2]+(q<<2)>>2];c=-1;if((e|0)==-1){break p}c=e-1|0;if((e>>>0)%3|0){break p}c=e+2|0}if((g|0)==(c|0)){break o}e=s;s=F[i+32>>2];i=F[e+s>>2];while(1){e=0;if((c|0)==-1){break g}if((i|0)!=F[s+(c<<2)>>2]){g=c;break n}q:{r:{if((c>>>0)%3|0){e=c-1|0;break r}e=c+2|0;m=-1;if((e|0)==-1){break q}}c=F[F[l+12>>2]+(e<<2)>>2];m=-1;if((c|0)==-1){break q}m=c-1|0;if((c>>>0)%3|0){break q}m=c+2|0}c=m;if((g|0)!=(c|0)){continue}break}}j=j+1|0;if((r|0)!=(j|0)){continue}break}}i=k-f|0;e=i>>2;F[(g<<2)+b>>2]=e;s:{if(k>>>0<o>>>0){F[k>>2]=g;k=k+4|0;F[h+20>>2]=k;break s}c=e+1|0;if(c>>>0>=1073741824){break k}d=o-f|0;k=d>>>1|0;c=d>>>0>=2147483644?1073741823:c>>>0<k>>>0?k:c;if(c){if(c>>>0>=1073741824){break j}d=ka(c<<2)}else{d=0}e=d+(e<<2)|0;F[e>>2]=g;m=c<<2;c=pa(d,f,i);o=m+c|0;F[h+24>>2]=o;k=e+4|0;F[h+20>>2]=k;F[h+16>>2]=c;if(f){ja(f);l=F[a+8>>2]}f=c}if((g|0)==-1){break m}t:{if((g>>>0)%3|0){c=g-1|0;break t}c=g+2|0;if((c|0)==-1){break m}}c=F[F[l+12>>2]+(c<<2)>>2];if((c|0)==-1){break m}c=c+((c>>>0)%3|0?-1:2)|0;if((c|0)==-1){break m}e=g;if((c|0)==(g|0)){break m}while(1){i=c;u:{v:{c=F[a+220>>2];j=F[a+216>>2];if((c|0)==(j|0)){break v}c=(c-j|0)/144|0;n=c>>>0<=1?1:c;c=0;while(1){q=F[(j+L(c,144)|0)+32>>2];r=i<<2;if(F[q+r>>2]==F[q+(e<<2)>>2]){c=c+1|0;if((n|0)!=(c|0)){continue}break v}break}j=k-d|0;e=j>>2;F[b+r>>2]=e;if(k>>>0<o>>>0){F[k>>2]=i;k=k+4|0;F[h+20>>2]=k;f=d;break u}c=e+1|0;if(c>>>0>=1073741824){break i}f=o-d|0;k=f>>>1|0;c=f>>>0>=2147483644?1073741823:c>>>0<k>>>0?k:c;if(c){if(c>>>0>=1073741824){break j}f=ka(c<<2)}else{f=0}e=f+(e<<2)|0;F[e>>2]=i;m=c<<2;c=pa(f,d,j);o=m+c|0;F[h+24>>2]=o;k=e+4|0;F[h+20>>2]=k;F[h+16>>2]=c;if(!d){d=c;break u}ja(d);l=F[a+8>>2];d=c;break u}F[(i<<2)+b>>2]=F[(e<<2)+b>>2]}if((i|0)==-1){break m}w:{if((i>>>0)%3|0){c=i-1|0;break w}c=i+2|0;if((c|0)==-1){break m}}c=F[F[l+12>>2]+(c<<2)>>2];if((c|0)==-1){break m}c=c+((c>>>0)%3|0?-1:2)|0;if((c|0)==-1){break m}e=i;if((c|0)!=(g|0)){continue}break}}p=p+1|0;c=F[l+24>>2];if((p|0)<F[l+28>>2]-c>>2){continue}break}break h}na();v()}na();v()}oa();v()}na();v()}i=F[a+4>>2];a=F[i+44>>2];c=F[a+100>>2];a=F[a+96>>2];x:{if((c|0)==(a|0)){break x}g=(c-a|0)/12|0;f=g>>>0<=1?1:g;l=f&1;c=0;if(g>>>0>=2){j=f&-2;g=0;while(1){e=L(c,12);f=e+b|0;o=F[f>>2];p=F[f+4>>2];e=a+e|0;F[e+8>>2]=F[f+8>>2];F[e>>2]=o;F[e+4>>2]=p;e=L(c|1,12);f=e+b|0;o=F[f>>2];p=F[f+4>>2];e=a+e|0;F[e+8>>2]=F[f+8>>2];F[e>>2]=o;F[e+4>>2]=p;c=c+2|0;g=g+2|0;if((j|0)!=(g|0)){continue}break}}if(!l){break x}g=L(c,12);c=g+b|0;f=F[c>>2];e=F[c+4>>2];a=a+g|0;F[a+8>>2]=F[c+8>>2];F[a>>2]=f;F[a+4>>2]=e}F[F[i+4>>2]+80>>2]=k-d>>2;e=1}c=e;if(b){ja(b)}if(!d){break d}F[h+20>>2]=d;ja(d)}Z=h+32|0;return c}function de(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,G=0,H=0,I=0,J=0,K=0,M=0,N=0,O=0,P=0;g=Z+-64|0;Z=g;F[a+8>>2]=e;y=a+32|0;f=F[y>>2];d=F[a+36>>2]-f>>2;a:{b:{if(d>>>0<e>>>0){qa(y,e-d|0);F[g+56>>2]=0;F[g+60>>2]=0;F[g+48>>2]=0;F[g+52>>2]=0;F[g+40>>2]=0;F[g+44>>2]=0;F[g+32>>2]=0;F[g+36>>2]=0;F[g+24>>2]=0;F[g+28>>2]=0;F[g+16>>2]=0;F[g+20>>2]=0;F[g>>2]=0;break b}if(d>>>0>e>>>0){F[a+36>>2]=f+(e<<2)}F[g+56>>2]=0;F[g+60>>2]=0;F[g+48>>2]=0;F[g+52>>2]=0;F[g+40>>2]=0;F[g+44>>2]=0;F[g+32>>2]=0;F[g+36>>2]=0;F[g+24>>2]=0;F[g+28>>2]=0;F[g+16>>2]=0;F[g+20>>2]=0;F[g>>2]=0;d=0;if(!e){break a}}Fa(g+16|0,e,g);h=F[g+28>>2];d=F[g+32>>2]}F[g>>2]=0;d=d-h>>2;c:{if(d>>>0>=e>>>0){if(d>>>0<=e>>>0){break c}F[g+32>>2]=(e<<2)+h;break c}Fa(g+16|12,e-d|0,g)}F[g>>2]=0;f=F[g+40>>2];d=F[g+44>>2]-f>>2;d:{if(d>>>0>=e>>>0){if(d>>>0<=e>>>0){break d}F[g+44>>2]=f+(e<<2);break d}Fa(g+40|0,e-d|0,g)}F[g>>2]=0;f=F[g+52>>2];d=F[g+56>>2]-f>>2;e:{if(d>>>0>=e>>>0){if(d>>>0<=e>>>0){break e}F[g+56>>2]=f+(e<<2);break e}Fa(g+52|0,e-d|0,g)}f:{if(F[a+8>>2]<=0){break f}i=F[g+16>>2];j=F[a+32>>2];h=0;while(1){d=h<<2;f=F[d+i>>2];m=F[a+16>>2];g:{if((f|0)>(m|0)){F[d+j>>2]=m;break g}d=d+j|0;m=F[a+12>>2];if((m|0)>(f|0)){F[d>>2]=m;break g}F[d>>2]=f}h=h+1|0;d=F[a+8>>2];if((h|0)<(d|0)){continue}break}if((d|0)<=0){break f}d=0;while(1){i=d<<2;f=i+c|0;i=F[b+i>>2]+F[j+i>>2]|0;F[f>>2]=i;h:{if((i|0)>F[a+16>>2]){i=i-F[a+20>>2]|0}else{if((i|0)>=F[a+12>>2]){break h}i=i+F[a+20>>2]|0}F[f>>2]=i}d=d+1|0;if((d|0)<F[a+8>>2]){continue}break}}H=F[a+52>>2];t=F[a+48>>2];z=ka(16);d=z;F[d>>2]=0;F[d+4>>2]=0;F[d+8>>2]=0;F[d+12>>2]=0;F[g+8>>2]=0;F[g>>2]=0;F[g+4>>2]=0;i:{if(e){if(e>>>0>=1073741824){break i}d=e<<2;r=ka(d);F[g>>2]=r;F[g+8>>2]=d+r;ma(r,0,d)}A=1;d=F[a+56>>2];B=F[d>>2];d=F[d+4>>2]-B|0;j:{if((d|0)<8){break j}w=d>>2;I=(w|0)<=2?2:w;J=w>>>0<=1?1:w;C=e&-2;D=e&1;K=e&-4;E=e&3;G=e-1|0;M=e<<2;N=e>>>0<4;A=0;m=1;while(1){k:{l:{m:{n:{if((m|0)!=(J|0)){o:{p:{f=F[(m<<2)+B>>2];if((f|0)==-1){break p}k=1;d=f+2|0;j=(f>>>0)%3|0;x=j?f-1|0:d;s=1<<x;n=F[t>>2];O=n+(x>>>3&536870908)|0;i=0;P=(j|0)!=0|(d|0)!=-1;d=f;q:{while(1){r:{if(F[n+(d>>>3&536870908)>>2]>>>d&1){break r}j=F[F[F[t+64>>2]+12>>2]+(d<<2)>>2];if((j|0)==-1){break r}l=F[H>>2];h=F[t+28>>2];p=F[l+(F[h+(j<<2)>>2]<<2)>>2];if((p|0)>=(m|0)){break r}q=j+1|0;q=F[l+(F[h+(((q>>>0)%3|0?q:j-2|0)<<2)>>2]<<2)>>2];if((q|0)>=(m|0)){break r}h=F[l+(F[h+(j+((j>>>0)%3|0?-1:2)<<2)>>2]<<2)>>2];if((h|0)>=(m|0)){break r}s:{if(!e){break s}j=F[(g+16|0)+L(i,12)>>2];l=L(e,h);q=L(e,q);p=L(e,p);h=0;o=0;if(G){while(1){F[j+(h<<2)>>2]=(F[(h+l<<2)+c>>2]+F[(h+q<<2)+c>>2]|0)-F[(h+p<<2)+c>>2];u=h|1;F[j+(u<<2)>>2]=(F[(l+u<<2)+c>>2]+F[(q+u<<2)+c>>2]|0)-F[(p+u<<2)+c>>2];h=h+2|0;o=o+2|0;if((C|0)!=(o|0)){continue}break}}if(!D){break s}F[j+(h<<2)>>2]=(F[(h+l<<2)+c>>2]+F[(h+q<<2)+c>>2]|0)-F[(h+p<<2)+c>>2]}j=4;i=i+1|0;if((i|0)==4){break q}}t:{if(k&1){h=d-2|0;j=d+1|0;d=-1;j=(j>>>0)%3|0?j:h;if((j|0)==-1|F[n+(j>>>3&536870908)>>2]>>>j&1){break t}j=F[F[F[t+64>>2]+12>>2]+(j<<2)>>2];if((j|0)==-1){break t}d=j+1|0;d=(d>>>0)%3|0?d:j-2|0;break t}u:{if((d>>>0)%3|0){h=d-1|0;break u}h=d+2|0;d=-1;if((h|0)==-1){break t}}d=-1;if(F[n+(h>>>3&536870908)>>2]>>>h&1){break t}j=F[F[F[t+64>>2]+12>>2]+(h<<2)>>2];if((j|0)==-1){break t}if((j>>>0)%3|0){d=j-1|0;break t}d=j+2|0}v:{if((d|0)==(f|0)){break v}if((d|0)==-1&k){if(!P|s&F[O>>2]){break v}d=F[F[F[t+64>>2]+12>>2]+(x<<2)>>2];if((d|0)==-1){break v}k=0;d=(d>>>0)%3|0?d-1|0:d+2|0}if((d|0)!=-1){continue}}break}j=i;if((j|0)<=0){break p}}if(e){ma(r,0,M)}d=j-1|0;q=(d<<2)+z|0;d=L(d,12)+a|0;u=d;x=F[d- -64>>2];k=0;d=F[g>>2];f=0;while(1){i=F[q>>2];F[q>>2]=i+1;if(i>>>0>=x>>>0){break j}w:{if(F[F[u+60>>2]+(i>>>3&536870908)>>2]>>>i&1){break w}f=f+1|0;if(!e){break w}n=F[(g+16|0)+L(k,12)>>2];i=0;h=0;p=0;if(!N){while(1){l=h<<2;o=l+d|0;F[o>>2]=F[l+n>>2]+F[o>>2];o=l|4;s=o+d|0;F[s>>2]=F[n+o>>2]+F[s>>2];o=l|8;s=o+d|0;F[s>>2]=F[n+o>>2]+F[s>>2];l=l|12;o=l+d|0;F[o>>2]=F[l+n>>2]+F[o>>2];h=h+4|0;p=p+4|0;if((K|0)!=(p|0)){continue}break}}if(!E){break w}while(1){l=h<<2;p=l+d|0;F[p>>2]=F[l+n>>2]+F[p>>2];h=h+1|0;i=i+1|0;if((E|0)!=(i|0)){continue}break}}k=k+1|0;if((k|0)!=(j|0)){continue}break}i=L(e,m);if(!f){break o}if(!e){break l}h=0;d=0;if(G){break n}break m}i=L(e,m)}if(F[a+8>>2]<=0){break k}k=(L(m-1|0,e)<<2)+c|0;j=F[y>>2];h=0;while(1){d=h<<2;f=F[d+k>>2];n=F[a+16>>2];x:{if((f|0)>(n|0)){F[d+j>>2]=n;break x}d=d+j|0;n=F[a+12>>2];if((n|0)>(f|0)){F[d>>2]=n;break x}F[d>>2]=f}h=h+1|0;f=F[a+8>>2];if((h|0)<(f|0)){continue}break}d=0;if((f|0)<=0){break k}f=i<<2;h=f+c|0;k=b+f|0;while(1){i=d<<2;f=i+h|0;i=F[i+k>>2]+F[j+i>>2]|0;F[f>>2]=i;y:{if((i|0)>F[a+16>>2]){i=i-F[a+20>>2]|0}else{if((i|0)>=F[a+12>>2]){break y}i=i+F[a+20>>2]|0}F[f>>2]=i}d=d+1|0;if((d|0)<F[a+8>>2]){continue}break}break k}ta();v()}while(1){j=h<<2;k=j+r|0;F[k>>2]=F[k>>2]/(f|0);j=(j|4)+r|0;F[j>>2]=F[j>>2]/(f|0);h=h+2|0;d=d+2|0;if((C|0)!=(d|0)){continue}break}}if(!D){break l}d=(h<<2)+r|0;F[d>>2]=F[d>>2]/(f|0)}if(F[a+8>>2]<=0){break k}j=F[y>>2];h=0;while(1){d=h<<2;f=F[d+r>>2];k=F[a+16>>2];z:{if((f|0)>(k|0)){F[d+j>>2]=k;break z}d=d+j|0;k=F[a+12>>2];if((k|0)>(f|0)){F[d>>2]=k;break z}F[d>>2]=f}h=h+1|0;f=F[a+8>>2];if((h|0)<(f|0)){continue}break}d=0;if((f|0)<=0){break k}f=i<<2;h=f+c|0;k=b+f|0;while(1){i=d<<2;f=i+h|0;i=F[i+k>>2]+F[j+i>>2]|0;F[f>>2]=i;A:{if((i|0)>F[a+16>>2]){i=i-F[a+20>>2]|0}else{if((i|0)>=F[a+12>>2]){break A}i=i+F[a+20>>2]|0}F[f>>2]=i}d=d+1|0;if((d|0)<F[a+8>>2]){continue}break}}m=m+1|0;A=(w|0)<=(m|0);if((m|0)!=(I|0)){continue}break}}a=F[g>>2];if(a){ja(a)}ja(z);a=F[g+52>>2];if(a){F[g+56>>2]=a;ja(a)}a=F[g+40>>2];if(a){F[g+44>>2]=a;ja(a)}a=F[g+28>>2];if(a){F[g+32>>2]=a;ja(a)}a=F[g+16>>2];if(a){F[g+20>>2]=a;ja(a)}Z=g- -64|0;return A|0}na();v()}function $h(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,G=0,H=0,I=0,J=0,K=0,M=0,N=0;h=Z+-64|0;Z=h;F[a+8>>2]=e;x=a+32|0;f=F[x>>2];d=F[a+36>>2]-f>>2;a:{b:{if(d>>>0<e>>>0){qa(x,e-d|0);F[h+56>>2]=0;F[h+60>>2]=0;F[h+48>>2]=0;F[h+52>>2]=0;F[h+40>>2]=0;F[h+44>>2]=0;F[h+32>>2]=0;F[h+36>>2]=0;F[h+24>>2]=0;F[h+28>>2]=0;F[h+16>>2]=0;F[h+20>>2]=0;F[h>>2]=0;break b}if(d>>>0>e>>>0){F[a+36>>2]=f+(e<<2)}F[h+56>>2]=0;F[h+60>>2]=0;F[h+48>>2]=0;F[h+52>>2]=0;F[h+40>>2]=0;F[h+44>>2]=0;F[h+32>>2]=0;F[h+36>>2]=0;F[h+24>>2]=0;F[h+28>>2]=0;F[h+16>>2]=0;F[h+20>>2]=0;F[h>>2]=0;d=0;if(!e){break a}}Fa(h+16|0,e,h);i=F[h+28>>2];d=F[h+32>>2]}F[h>>2]=0;d=d-i>>2;c:{if(d>>>0>=e>>>0){if(d>>>0<=e>>>0){break c}F[h+32>>2]=(e<<2)+i;break c}Fa(h+16|12,e-d|0,h)}F[h>>2]=0;f=F[h+40>>2];d=F[h+44>>2]-f>>2;d:{if(d>>>0>=e>>>0){if(d>>>0<=e>>>0){break d}F[h+44>>2]=f+(e<<2);break d}Fa(h+40|0,e-d|0,h)}F[h>>2]=0;f=F[h+52>>2];d=F[h+56>>2]-f>>2;e:{if(d>>>0>=e>>>0){if(d>>>0<=e>>>0){break e}F[h+56>>2]=f+(e<<2);break e}Fa(h+52|0,e-d|0,h)}f:{if(F[a+8>>2]<=0){break f}g=F[h+16>>2];j=F[a+32>>2];i=0;while(1){d=i<<2;f=F[d+g>>2];m=F[a+16>>2];g:{if((f|0)>(m|0)){F[d+j>>2]=m;break g}d=d+j|0;m=F[a+12>>2];if((m|0)>(f|0)){F[d>>2]=m;break g}F[d>>2]=f}i=i+1|0;d=F[a+8>>2];if((i|0)<(d|0)){continue}break}if((d|0)<=0){break f}d=0;while(1){g=d<<2;f=g+c|0;g=F[b+g>>2]+F[g+j>>2]|0;F[f>>2]=g;h:{if((g|0)>F[a+16>>2]){g=g-F[a+20>>2]|0}else{if((g|0)>=F[a+12>>2]){break h}g=g+F[a+20>>2]|0}F[f>>2]=g}d=d+1|0;if((d|0)<F[a+8>>2]){continue}break}}H=F[a+52>>2];A=F[a+48>>2];y=ka(16);d=y;F[d>>2]=0;F[d+4>>2]=0;F[d+8>>2]=0;F[d+12>>2]=0;F[h+8>>2]=0;F[h>>2]=0;F[h+4>>2]=0;i:{if(e){if(e>>>0>=1073741824){break i}d=e<<2;t=ka(d);F[h>>2]=t;F[h+8>>2]=d+t;ma(t,0,d)}z=1;d=F[a+56>>2];B=F[d>>2];d=F[d+4>>2]-B|0;j:{if((d|0)<8){break j}w=d>>2;I=(w|0)<=2?2:w;J=w>>>0<=1?1:w;C=e&-2;D=e&1;K=e&-4;E=e&3;G=e-1|0;M=e<<2;N=e>>>0<4;z=0;m=1;while(1){k:{l:{m:{n:{if((m|0)!=(J|0)){o:{p:{f=F[(m<<2)+B>>2];if((f|0)==-1){break p}n=F[A+12>>2];d=f+2|0;g=(f>>>0)%3|0;q=n+((g?f-1|0:d)<<2)|0;j=0;u=(g|0)!=0|(d|0)!=-1;k=1;d=f;q:{while(1){g=F[n+(d<<2)>>2];r:{if((g|0)==-1){break r}l=-1;p=F[H>>2];r=F[A>>2];i=p+(F[r+(g<<2)>>2]<<2)|0;o=g+1|0;o=(o>>>0)%3|0?o:g-2|0;if((o|0)!=-1){l=F[r+(o<<2)>>2]}o=F[i>>2];s:{t:{if((g>>>0)%3|0){i=g-1|0;break t}i=g+2|0;s=-1;if((i|0)==-1){break s}}s=F[r+(i<<2)>>2]}if((m|0)<=(o|0)){break r}i=F[p+(l<<2)>>2];if((i|0)>=(m|0)){break r}l=F[p+(s<<2)>>2];if((l|0)>=(m|0)){break r}g=F[(h+16|0)+L(j,12)>>2];u:{if(!e){break u}l=L(e,l);r=L(e,i);p=L(e,o);i=0;s=0;if(G){while(1){F[g+(i<<2)>>2]=(F[(i+l<<2)+c>>2]+F[(i+r<<2)+c>>2]|0)-F[(i+p<<2)+c>>2];o=i|1;F[g+(o<<2)>>2]=(F[(l+o<<2)+c>>2]+F[(o+r<<2)+c>>2]|0)-F[(o+p<<2)+c>>2];i=i+2|0;s=s+2|0;if((C|0)!=(s|0)){continue}break}}if(!D){break u}F[g+(i<<2)>>2]=(F[(i+l<<2)+c>>2]+F[(i+r<<2)+c>>2]|0)-F[(i+p<<2)+c>>2]}g=4;j=j+1|0;if((j|0)==4){break q}}v:{if(k&1){i=d+1|0;d=(i>>>0)%3|0?i:d-2|0;g=-1;if((d|0)==-1){break v}d=F[n+(d<<2)>>2];g=-1;if((d|0)==-1){break v}g=d+1|0;g=(g>>>0)%3|0?g:d-2|0;break v}w:{if((d>>>0)%3|0){i=d-1|0;break w}i=d+2|0;g=-1;if((i|0)==-1){break v}}d=F[n+(i<<2)>>2];g=-1;if((d|0)==-1){break v}g=d-1|0;if((d>>>0)%3|0){break v}g=d+2|0}d=g;x:{if((f|0)==(d|0)){break x}if((d|0)==-1&k){if(!u){break x}d=F[q>>2];if((d|0)==-1){break x}k=0;d=(d>>>0)%3|0?d-1|0:d+2|0}if((d|0)!=-1){continue}}break}g=j;if((g|0)<=0){break p}}if(e){ma(t,0,M)}d=g-1|0;r=(d<<2)+y|0;d=L(d,12)+a|0;o=d;s=F[d- -64>>2];k=0;d=F[h>>2];f=0;while(1){j=F[r>>2];F[r>>2]=j+1;if(j>>>0>=s>>>0){break j}y:{if(F[F[o+60>>2]+(j>>>3&536870908)>>2]>>>j&1){break y}f=f+1|0;if(!e){break y}j=F[(h+16|0)+L(k,12)>>2];l=0;i=0;p=0;if(!N){while(1){n=i<<2;q=n+d|0;F[q>>2]=F[j+n>>2]+F[q>>2];q=n|4;u=q+d|0;F[u>>2]=F[j+q>>2]+F[u>>2];q=n|8;u=q+d|0;F[u>>2]=F[j+q>>2]+F[u>>2];n=n|12;q=n+d|0;F[q>>2]=F[j+n>>2]+F[q>>2];i=i+4|0;p=p+4|0;if((K|0)!=(p|0)){continue}break}}if(!E){break y}while(1){n=i<<2;p=n+d|0;F[p>>2]=F[j+n>>2]+F[p>>2];i=i+1|0;l=l+1|0;if((E|0)!=(l|0)){continue}break}}k=k+1|0;if((k|0)!=(g|0)){continue}break}g=L(e,m);if(!f){break o}if(!e){break l}i=0;d=0;if(G){break n}break m}g=L(e,m)}if(F[a+8>>2]<=0){break k}k=(L(m-1|0,e)<<2)+c|0;j=F[x>>2];i=0;while(1){d=i<<2;f=F[d+k>>2];l=F[a+16>>2];z:{if((f|0)>(l|0)){F[d+j>>2]=l;break z}d=d+j|0;l=F[a+12>>2];if((l|0)>(f|0)){F[d>>2]=l;break z}F[d>>2]=f}i=i+1|0;f=F[a+8>>2];if((i|0)<(f|0)){continue}break}d=0;if((f|0)<=0){break k}f=g<<2;i=f+c|0;k=b+f|0;while(1){g=d<<2;f=g+i|0;g=F[g+k>>2]+F[g+j>>2]|0;F[f>>2]=g;A:{if((g|0)>F[a+16>>2]){g=g-F[a+20>>2]|0}else{if((g|0)>=F[a+12>>2]){break A}g=g+F[a+20>>2]|0}F[f>>2]=g}d=d+1|0;if((d|0)<F[a+8>>2]){continue}break}break k}ta();v()}while(1){j=i<<2;k=j+t|0;F[k>>2]=F[k>>2]/(f|0);j=(j|4)+t|0;F[j>>2]=F[j>>2]/(f|0);i=i+2|0;d=d+2|0;if((C|0)!=(d|0)){continue}break}}if(!D){break l}d=(i<<2)+t|0;F[d>>2]=F[d>>2]/(f|0)}if(F[a+8>>2]<=0){break k}j=F[x>>2];i=0;while(1){d=i<<2;f=F[d+t>>2];k=F[a+16>>2];B:{if((f|0)>(k|0)){F[d+j>>2]=k;break B}d=d+j|0;k=F[a+12>>2];if((k|0)>(f|0)){F[d>>2]=k;break B}F[d>>2]=f}i=i+1|0;f=F[a+8>>2];if((i|0)<(f|0)){continue}break}d=0;if((f|0)<=0){break k}f=g<<2;i=f+c|0;k=b+f|0;while(1){g=d<<2;f=g+i|0;g=F[g+k>>2]+F[g+j>>2]|0;F[f>>2]=g;C:{if((g|0)>F[a+16>>2]){g=g-F[a+20>>2]|0}else{if((g|0)>=F[a+12>>2]){break C}g=g+F[a+20>>2]|0}F[f>>2]=g}d=d+1|0;if((d|0)<F[a+8>>2]){continue}break}}m=m+1|0;z=(w|0)<=(m|0);if((m|0)!=(I|0)){continue}break}}a=F[h>>2];if(a){ja(a)}ja(y);a=F[h+52>>2];if(a){F[h+56>>2]=a;ja(a)}a=F[h+40>>2];if(a){F[h+44>>2]=a;ja(a)}a=F[h+28>>2];if(a){F[h+32>>2]=a;ja(a)}a=F[h+16>>2];if(a){F[h+20>>2]=a;ja(a)}Z=h- -64|0;return z|0}na();v()}function Yh(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,E=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,$=0,aa=0;a:{b:{if((e|0)!=2){break b}F[a+8>>2]=2;F[a- -64>>2]=f;M=a+32|0;e=F[M>>2];d=F[a+36>>2]-e|0;c:{if(d>>>0<=7){qa(M,2-(d>>>2|0)|0);break c}if((d|0)==8){break c}F[a+36>>2]=e+8}i=1;d=F[a+56>>2];d=F[d+4>>2]-F[d>>2]|0;if((d|0)<=0){break b}o=a+60|0;d=d>>>2|0;X=d>>>0<=1?1:d;Y=a+68|0;d=0;while(1){f=F[a+56>>2];e=F[f>>2];if(F[f+4>>2]-e>>2>>>0<=d>>>0){break a}k=Z-80|0;Z=k;f=-1;d:{e:{e=F[e+(d<<2)>>2];if((e|0)==-1){break e}i=F[o+32>>2];g=e+1|0;g=(g>>>0)%3|0?g:e-2|0;if((g|0)!=-1){f=F[F[i>>2]+(g<<2)>>2]}p=-1;e=e+((e>>>0)%3|0?-1:2)|0;if((e|0)!=-1){p=F[F[i>>2]+(e<<2)>>2]}i=F[o+36>>2];e=F[i>>2];i=F[i+4>>2]-e>>2;if(i>>>0<=f>>>0|i>>>0<=p>>>0){break e}f:{g:{h:{i:{j:{k:{j=F[e+(p<<2)>>2];f=F[e+(f<<2)>>2];if((j|0)>=(d|0)|(f|0)>=(d|0)){break k}i=(j<<3)+c|0;w=F[i+4>>2];g=(f<<3)+c|0;e=F[g+4>>2];l=F[i>>2];i=F[g>>2];if(!((l|0)!=(i|0)|(e|0)!=(w|0))){F[o+8>>2]=i;F[o+12>>2]=e;break j}p=F[F[o+4>>2]+(d<<2)>>2];F[k+72>>2]=0;F[k+76>>2]=0;g=k- -64|0;F[g>>2]=0;F[g+4>>2]=0;F[k+56>>2]=0;F[k+60>>2]=0;g=F[o>>2];if(!G[g+84|0]){p=F[F[g+68>>2]+(p<<2)>>2]}Ga(g,p,D[g+24|0],k+56|0);p=F[F[o+4>>2]+(f<<2)>>2];F[k+48>>2]=0;F[k+52>>2]=0;F[k+40>>2]=0;F[k+44>>2]=0;F[k+32>>2]=0;F[k+36>>2]=0;g=F[o>>2];if(!G[g+84|0]){p=F[F[g+68>>2]+(p<<2)>>2]}Ga(g,p,D[g+24|0],k+32|0);p=F[F[o+4>>2]+(j<<2)>>2];F[k+24>>2]=0;F[k+28>>2]=0;F[k+16>>2]=0;F[k+20>>2]=0;F[k+8>>2]=0;F[k+12>>2]=0;g=F[o>>2];if(!G[g+84|0]){p=F[F[g+68>>2]+(p<<2)>>2]}Ga(g,p,D[g+24|0],k+8|0);g=F[k+16>>2];n=F[k+40>>2];x=g-n|0;N=F[k+44>>2];g=F[k+20>>2]-(N+(g>>>0<n>>>0)|0)|0;H=g;j=ki(x,g,x,g);q=_;g=F[k+8>>2];z=F[k+32>>2];A=g-z|0;O=F[k+36>>2];g=F[k+12>>2]-(O+(g>>>0<z>>>0)|0)|0;I=g;h=j;j=ki(A,g,A,g);g=h+j|0;h=_+q|0;h=g>>>0<j>>>0?h+1|0:h;j=F[k+24>>2];B=F[k+48>>2];C=j-B|0;P=F[k+52>>2];j=F[k+28>>2]-(P+(j>>>0<B>>>0)|0)|0;J=j;m=g;g=ki(C,j,C,j);r=m+g|0;h=_+h|0;s=g>>>0>r>>>0?h+1|0:h;if(!(s|r)){break k}p=0;E=mi(-1,2147483647,r,s);f=i>>31;R=f;h=f>>31;Q=i;g=h;q=i^g;i=q-g|0;f=(f^g)-((g>>>0>q>>>0)+g|0)|0;g=f;f=e>>31;S=f;K=e;e=f>>31;q=K^e;m=q-e|0;h=f>>31;e=(h^f)-((e>>>0>q>>>0)+h|0)|0;f=(g|0)==(e|0)&i>>>0>m>>>0|e>>>0<g>>>0;i=f?i:m;j=_;e=f?g:e;if((j|0)==(e|0)&i>>>0>E>>>0|e>>>0>j>>>0){break f}i=F[k+64>>2];T=F[k+68>>2];e=ki(i-n|0,T-((i>>>0<n>>>0)+N|0)|0,x,H);f=_;g=F[k+56>>2];U=F[k+60>>2];j=ki(g-z|0,U-((g>>>0<z>>>0)+O|0)|0,A,I);e=j+e|0;h=_+f|0;h=e>>>0<j>>>0?h+1|0:h;f=e;m=F[k+72>>2];V=F[k+76>>2];e=ki(m-B|0,V-((m>>>0<B>>>0)+P|0)|0,C,J);j=f+e|0;f=_+h|0;q=e>>>0>j>>>0?f+1|0:f;e=l;E=e-Q|0;e=(e>>31)-((e>>>0<Q>>>0)+R|0)|0;W=e;l=e>>31;y=l^E;f=y-l|0;h=e>>31;e=(h^e)-((l>>>0>y>>>0)+h|0)|0;h=e;y=w-K|0;e=(w>>31)-((w>>>0<K>>>0)+S|0)|0;w=e;l=f;t=e>>31;u=t^y;L=u-t|0;f=e>>31;e=(f^e)-((t>>>0>u>>>0)+f|0)|0;f=(h|0)==(e|0)&l>>>0>L>>>0|e>>>0<h>>>0;f=mi(-1,2147483647,f?l:L,f?h:e)>>>0<j>>>0;e=_;if(f&(e|0)<=(q|0)|(e|0)<(q|0)){break f}e=I>>31;f=e;l=e^A;e=l-e|0;f=(f^I)-((f>>>0>l>>>0)+f|0)|0;h=H>>31;t=h^x;u=t-h|0;l=(h^H)-((h>>>0>t>>>0)+h|0)|0;h=(f|0)==(l|0)&e>>>0>u>>>0|f>>>0>l>>>0;e=h?e:u;f=h?f:l;h=J>>31;L=e;t=h^C;u=t-h|0;l=(h^J)-((h>>>0>t>>>0)+h|0)|0;e=(f|0)==(l|0)&e>>>0>u>>>0|f>>>0>l>>>0;f=mi(-1,2147483647,e?L:u,e?f:l)>>>0<j>>>0;e=_;if(f&(e|0)<=(q|0)|(e|0)<(q|0)){break f}l=1;e=0;f=n;n=li(ki(j,q,x,H),_,r,s);f=f+n|0;h=_+N|0;h=f>>>0<n>>>0?h+1|0:h;n=i-f|0;f=T-((f>>>0>i>>>0)+h|0)|0;n=ki(n,f,n,f);x=_;f=g;h=li(ki(j,q,A,I),_,r,s);i=h+z|0;g=_+O|0;g=h>>>0>i>>>0?g+1|0:g;h=f-i|0;f=U-((f>>>0<i>>>0)+g|0)|0;g=ki(h,f,h,f);i=g+n|0;f=_+x|0;f=g>>>0>i>>>0?f+1|0:f;n=i;g=li(ki(j,q,C,J),_,r,s);i=g+B|0;h=_+P|0;h=g>>>0>i>>>0?h+1|0:h;g=m-i|0;i=V-((i>>>0>m>>>0)+h|0)|0;m=ki(g,i,g,i);i=m+n|0;g=_+f|0;f=ki(i,i>>>0<m>>>0?g+1|0:g,r,s);i=_;m=i;if(!i&f>>>0<=1){break i}h=f;while(1){g=e<<1|l>>>31;l=l<<1;e=g;n=!i&h>>>0>7|(i|0)!=0;h=(i&3)<<30|h>>>2;i=i>>>2|0;if(n){continue}break}break h}if((d|0)>(f|0)){e=f<<1}else{if((d|0)<=0){F[o+8>>2]=0;F[o+12>>2]=0;break j}e=(d<<1)-2|0}e=(e<<2)+c|0;F[o+8>>2]=F[e>>2];F[o+12>>2]=F[e+4>>2]}p=1;break f}e=m;l=f;if(f-1|0){break g}}while(1){i=mi(f,m,l,e);h=e+_|0;e=i+l|0;h=e>>>0<l>>>0?h+1|0:h;l=(h&1)<<31|e>>>1;e=h>>>1|0;i=ki(l,e,l,e);g=_;if((m|0)==(g|0)&f>>>0<i>>>0|g>>>0>m>>>0){continue}break}}f=F[o+20>>2];if(!f){break f}g=f-1|0;h=F[F[o+16>>2]+(g>>>3&536870908)>>2];F[o+20>>2]=g;p=1;f=ki(j,q,y,w);i=_;n=ki(r,s,K,S);m=n+f|0;f=_+i|0;f=m>>>0<n>>>0?f+1|0:f;i=ki(l,e,E,W);g=h>>>g&1;h=g?0-i|0:i;m=h+m|0;n=f;f=_;i=n+(g?0-(f+((i|0)!=0)|0)|0:f)|0;$=o,aa=li(m,h>>>0>m>>>0?i+1|0:i,r,s),F[$+12>>2]=aa;f=ki(j,q,E,W);i=_;j=ki(r,s,Q,R);f=j+f|0;h=_+i|0;e=ki(l,e,y,w);i=0-e|0;l=_;h=(f>>>0<j>>>0?h+1|0:h)+(g?l:0-(((e|0)!=0)+l|0)|0)|0;i=g?e:i;f=i+f|0;$=o,aa=li(f,f>>>0<i>>>0?h+1|0:h,r,s),F[$+8>>2]=aa}Z=k+80|0;e=p;break d}ta();v()}i=e;if(!e){return 0}l:{if(F[a+8>>2]<=0){break l}l=F[M>>2];e=0;while(1){f=e<<2;g=F[f+Y>>2];j=F[a+16>>2];m:{if((g|0)>(j|0)){F[f+l>>2]=j;break m}f=f+l|0;j=F[a+12>>2];if((j|0)>(g|0)){F[f>>2]=j;break m}F[f>>2]=g}e=e+1|0;g=F[a+8>>2];if((e|0)<(g|0)){continue}break}f=0;if((g|0)<=0){break l}e=d<<3;j=e+c|0;q=b+e|0;while(1){g=f<<2;e=g+j|0;g=F[g+q>>2]+F[g+l>>2]|0;F[e>>2]=g;n:{if((g|0)>F[a+16>>2]){g=g-F[a+20>>2]|0}else{if((g|0)>=F[a+12>>2]){break n}g=g+F[a+20>>2]|0}F[e>>2]=g}f=f+1|0;if((f|0)<F[a+8>>2]){continue}break}}d=d+1|0;if((X|0)!=(d|0)){continue}break}}return i|0}ta();v()}function hi(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,E=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,$=0,aa=0;a:{b:{if((e|0)!=2){break b}F[a+8>>2]=2;F[a- -64>>2]=f;M=a+32|0;e=F[M>>2];d=F[a+36>>2]-e|0;c:{if(d>>>0<=7){qa(M,2-(d>>>2|0)|0);break c}if((d|0)==8){break c}F[a+36>>2]=e+8}p=1;d=F[a+56>>2];d=F[d+4>>2]-F[d>>2]|0;if((d|0)<=0){break b}o=a+60|0;d=d>>>2|0;X=d>>>0<=1?1:d;Y=a+68|0;d=0;while(1){e=F[a+56>>2];h=F[e>>2];if(F[e+4>>2]-h>>2>>>0<=d>>>0){break a}k=Z-80|0;Z=k;f=-1;h=F[h+(d<<2)>>2];e=-1;d:{if((h|0)==-1){break d}e=h+1|0;f=(e>>>0)%3|0?e:h-2|0;e=h-1|0;if((h>>>0)%3|0){break d}e=h+2|0}g=F[o+36>>2];h=F[g>>2];e:{f:{g:{h:{i:{g=F[g+4>>2]-h>>2;i=f<<2;f=F[F[o+32>>2]+28>>2];j=F[i+f>>2];if(g>>>0<=j>>>0){break i}e=F[f+(e<<2)>>2];if(e>>>0>=g>>>0){break i}j:{k:{l=F[h+(e<<2)>>2];f=F[h+(j<<2)>>2];if((l|0)>=(d|0)|(f|0)>=(d|0)){break k}h=(l<<3)+c|0;w=F[h+4>>2];g=(f<<3)+c|0;e=F[g+4>>2];j=F[h>>2];h=F[g>>2];if(!((j|0)!=(h|0)|(e|0)!=(w|0))){F[o+8>>2]=h;F[o+12>>2]=e;break j}p=F[F[o+4>>2]+(d<<2)>>2];F[k+72>>2]=0;F[k+76>>2]=0;g=k- -64|0;F[g>>2]=0;F[g+4>>2]=0;F[k+56>>2]=0;F[k+60>>2]=0;g=F[o>>2];if(!G[g+84|0]){p=F[F[g+68>>2]+(p<<2)>>2]}Ga(g,p,D[g+24|0],k+56|0);p=F[F[o+4>>2]+(f<<2)>>2];F[k+48>>2]=0;F[k+52>>2]=0;F[k+40>>2]=0;F[k+44>>2]=0;F[k+32>>2]=0;F[k+36>>2]=0;g=F[o>>2];if(!G[g+84|0]){p=F[F[g+68>>2]+(p<<2)>>2]}Ga(g,p,D[g+24|0],k+32|0);p=F[F[o+4>>2]+(l<<2)>>2];F[k+24>>2]=0;F[k+28>>2]=0;F[k+16>>2]=0;F[k+20>>2]=0;F[k+8>>2]=0;F[k+12>>2]=0;g=F[o>>2];if(!G[g+84|0]){p=F[F[g+68>>2]+(p<<2)>>2]}Ga(g,p,D[g+24|0],k+8|0);g=F[k+16>>2];n=F[k+40>>2];x=g-n|0;N=F[k+44>>2];g=F[k+20>>2]-(N+(g>>>0<n>>>0)|0)|0;H=g;l=ki(x,g,x,g);q=_;g=F[k+8>>2];z=F[k+32>>2];A=g-z|0;O=F[k+36>>2];g=F[k+12>>2]-(O+(g>>>0<z>>>0)|0)|0;I=g;i=l;l=ki(A,g,A,g);g=i+l|0;i=_+q|0;i=g>>>0<l>>>0?i+1|0:i;l=F[k+24>>2];B=F[k+48>>2];C=l-B|0;P=F[k+52>>2];l=F[k+28>>2]-(P+(l>>>0<B>>>0)|0)|0;J=l;m=g;g=ki(C,l,C,l);r=m+g|0;i=_+i|0;s=g>>>0>r>>>0?i+1|0:i;if(!(s|r)){break k}p=0;E=mi(-1,2147483647,r,s);f=h>>31;R=f;i=f>>31;Q=h;g=i;q=h^g;h=q-g|0;f=(f^g)-((g>>>0>q>>>0)+g|0)|0;g=f;f=e>>31;S=f;K=e;e=f>>31;q=K^e;m=q-e|0;i=f>>31;e=(i^f)-((e>>>0>q>>>0)+i|0)|0;f=(g|0)==(e|0)&h>>>0>m>>>0|e>>>0<g>>>0;h=f?h:m;l=_;e=f?g:e;if((l|0)==(e|0)&h>>>0>E>>>0|e>>>0>l>>>0){break e}h=F[k+64>>2];T=F[k+68>>2];e=ki(h-n|0,T-((h>>>0<n>>>0)+N|0)|0,x,H);f=_;g=F[k+56>>2];U=F[k+60>>2];l=ki(g-z|0,U-((g>>>0<z>>>0)+O|0)|0,A,I);e=l+e|0;i=_+f|0;i=e>>>0<l>>>0?i+1|0:i;f=e;m=F[k+72>>2];V=F[k+76>>2];e=ki(m-B|0,V-((m>>>0<B>>>0)+P|0)|0,C,J);l=f+e|0;f=_+i|0;q=e>>>0>l>>>0?f+1|0:f;e=j;E=e-Q|0;e=(e>>31)-((e>>>0<Q>>>0)+R|0)|0;W=e;j=e>>31;y=j^E;f=y-j|0;i=e>>31;e=(i^e)-((j>>>0>y>>>0)+i|0)|0;i=e;y=w-K|0;e=(w>>31)-((w>>>0<K>>>0)+S|0)|0;w=e;j=f;t=e>>31;u=t^y;L=u-t|0;f=e>>31;e=(f^e)-((t>>>0>u>>>0)+f|0)|0;f=(i|0)==(e|0)&j>>>0>L>>>0|e>>>0<i>>>0;f=mi(-1,2147483647,f?j:L,f?i:e)>>>0<l>>>0;e=_;if(f&(e|0)<=(q|0)|(e|0)<(q|0)){break e}e=I>>31;f=e;j=e^A;e=j-e|0;f=(f^I)-((f>>>0>j>>>0)+f|0)|0;i=H>>31;t=i^x;u=t-i|0;j=(i^H)-((i>>>0>t>>>0)+i|0)|0;i=(f|0)==(j|0)&e>>>0>u>>>0|f>>>0>j>>>0;e=i?e:u;f=i?f:j;i=J>>31;L=e;t=i^C;u=t-i|0;j=(i^J)-((i>>>0>t>>>0)+i|0)|0;e=(f|0)==(j|0)&e>>>0>u>>>0|f>>>0>j>>>0;f=mi(-1,2147483647,e?L:u,e?f:j)>>>0<l>>>0;e=_;if(f&(e|0)<=(q|0)|(e|0)<(q|0)){break e}j=1;e=0;f=n;n=li(ki(l,q,x,H),_,r,s);f=f+n|0;i=_+N|0;i=f>>>0<n>>>0?i+1|0:i;n=h-f|0;f=T-((f>>>0>h>>>0)+i|0)|0;n=ki(n,f,n,f);x=_;f=g;i=li(ki(l,q,A,I),_,r,s);h=i+z|0;g=_+O|0;g=h>>>0<i>>>0?g+1|0:g;i=f-h|0;f=U-((f>>>0<h>>>0)+g|0)|0;g=ki(i,f,i,f);h=g+n|0;f=_+x|0;f=h>>>0<g>>>0?f+1|0:f;n=h;g=li(ki(l,q,C,J),_,r,s);h=g+B|0;i=_+P|0;i=h>>>0<g>>>0?i+1|0:i;g=m-h|0;h=V-((h>>>0>m>>>0)+i|0)|0;m=ki(g,h,g,h);h=m+n|0;g=_+f|0;f=ki(h,h>>>0<m>>>0?g+1|0:g,r,s);h=_;m=h;if(!h&f>>>0<=1){break h}i=f;while(1){g=e<<1|j>>>31;j=j<<1;e=g;n=!h&i>>>0>7|(h|0)!=0;i=(h&3)<<30|i>>>2;h=h>>>2|0;if(n){continue}break}break g}if((d|0)>(f|0)){e=f<<1}else{if((d|0)<=0){F[o+8>>2]=0;F[o+12>>2]=0;break j}e=(d<<1)-2|0}e=(e<<2)+c|0;F[o+8>>2]=F[e>>2];F[o+12>>2]=F[e+4>>2]}p=1;break e}ta();v()}e=m;j=f;if(f-1|0){break f}}while(1){h=mi(f,m,j,e);i=e+_|0;e=h+j|0;i=e>>>0<j>>>0?i+1|0:i;j=(i&1)<<31|e>>>1;e=i>>>1|0;h=ki(j,e,j,e);g=_;if((m|0)==(g|0)&f>>>0<h>>>0|g>>>0>m>>>0){continue}break}}f=F[o+20>>2];if(!f){break e}g=f-1|0;i=F[F[o+16>>2]+(g>>>3&536870908)>>2];F[o+20>>2]=g;p=1;f=ki(l,q,y,w);h=_;n=ki(r,s,K,S);m=n+f|0;f=_+h|0;f=m>>>0<n>>>0?f+1|0:f;h=ki(j,e,E,W);g=i>>>g&1;i=g?0-h|0:h;m=i+m|0;n=f;f=_;h=n+(g?0-(f+((h|0)!=0)|0)|0:f)|0;$=o,aa=li(m,i>>>0>m>>>0?h+1|0:h,r,s),F[$+12>>2]=aa;f=ki(l,q,E,W);h=_;l=ki(r,s,Q,R);f=l+f|0;i=_+h|0;e=ki(j,e,y,w);h=0-e|0;j=_;i=(f>>>0<l>>>0?i+1|0:i)+(g?j:0-(((e|0)!=0)+j|0)|0)|0;h=g?e:h;f=h+f|0;$=o,aa=li(f,f>>>0<h>>>0?i+1|0:i,r,s),F[$+8>>2]=aa}Z=k+80|0;if(!p){return 0}l:{if(F[a+8>>2]<=0){break l}g=F[M>>2];e=0;while(1){f=e<<2;h=F[f+Y>>2];j=F[a+16>>2];m:{if((h|0)>(j|0)){F[f+g>>2]=j;break m}f=f+g|0;j=F[a+12>>2];if((j|0)>(h|0)){F[f>>2]=j;break m}F[f>>2]=h}e=e+1|0;h=F[a+8>>2];if((e|0)<(h|0)){continue}break}f=0;if((h|0)<=0){break l}e=d<<3;j=e+c|0;l=b+e|0;while(1){h=f<<2;e=h+j|0;h=F[h+l>>2]+F[h+g>>2]|0;F[e>>2]=h;n:{if((h|0)>F[a+16>>2]){i=h-F[a+20>>2]|0}else{if((h|0)>=F[a+12>>2]){break n}i=h+F[a+20>>2]|0}F[e>>2]=i}f=f+1|0;if((f|0)<F[a+8>>2]){continue}break}}d=d+1|0;if((X|0)!=(d|0)){continue}break}}return p|0}ta();v()}function Gd(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;n=Z-96|0;Z=n;m=F[a+4>>2];d=F[m+32>>2];j=F[d+8>>2];i=F[d+12>>2];e=i;c=F[d+20>>2];f=F[d+16>>2];a:{if((e|0)<=(c|0)&f>>>0>=j>>>0|(c|0)>(e|0)){break a}o=F[d>>2];h=G[o+f|0];g=f+1|0;e=g?c:c+1|0;F[d+16>>2]=g;F[d+20>>2]=e;if((e|0)>=(i|0)&g>>>0>=j>>>0|(e|0)>(i|0)){break a}p=G[g+o|0];g=f+2|0;e=g>>>0<2?c+1|0:c;F[d+16>>2]=g;F[d+20>>2]=e;l=h<<24>>24;b:{if((l|0)>=0){k=F[a+216>>2];if(h>>>0>=(F[a+220>>2]-k|0)/144>>>0){break a}k=k+L(h,144)|0;if(F[k>>2]<0){break b}break a}if(F[a+212>>2]>=0){break a}k=a+212|0}F[k>>2]=b;c:{d:{e:{f:{g:{h:{k=H[m+36>>1];i:{if(((k<<8|k>>>8)&65535)>>>0>=258){if((e|0)>=(i|0)&g>>>0>=j>>>0|(e|0)>(i|0)){break a}e=G[g+o|0];f=f+3|0;c=f>>>0<3?c+1|0:c;F[d+16>>2]=f;F[d+20>>2]=c;if(e>>>0>1){break a}d=e>>>0<2?e:0;if(!p){break i}if(!d){break h}break a}if(p){break g}d=0}if((l|0)<0){e=a+184|0}else{c=F[a+216>>2]+L(h,144)|0;D[c+100|0]=0;e=c+104|0}if((d|0)!=1){break e}c=Z-112|0;Z=c;g=F[F[a+4>>2]+44>>2];d=ka(120);F[d>>2]=8924;F[d+4>>2]=0;F[d+116>>2]=0;F[d+112>>2]=e;F[d+108>>2]=g;F[d+12>>2]=0;F[d+16>>2]=0;F[d+20>>2]=0;F[d+24>>2]=0;F[d+28>>2]=0;F[d+32>>2]=0;F[d+36>>2]=0;F[d+40>>2]=0;F[d+44>>2]=0;F[d+48>>2]=0;F[d+52>>2]=0;F[d+56>>2]=0;F[d+60>>2]=0;F[d+8>>2]=9136;f=d- -64|0;F[f>>2]=0;F[f+4>>2]=0;F[d+72>>2]=0;F[d+76>>2]=0;F[d+80>>2]=0;F[d+84>>2]=0;F[d+88>>2]=0;F[d+104>>2]=0;F[d+96>>2]=0;F[d+100>>2]=0;f=F[a+8>>2];F[c+48>>2]=0;F[c+52>>2]=0;F[c+40>>2]=0;F[c+44>>2]=0;j=c+32|0;F[j>>2]=0;F[j+4>>2]=0;F[c+24>>2]=0;F[c+28>>2]=0;h=c- -64|0;F[h>>2]=0;F[h+4>>2]=0;F[c+72>>2]=0;F[c+76>>2]=0;F[c+80>>2]=0;F[c+84>>2]=0;F[c+88>>2]=0;F[c+104>>2]=0;F[c+16>>2]=0;F[c+20>>2]=0;F[c+56>>2]=0;F[c+60>>2]=0;F[c+8>>2]=9136;F[c+96>>2]=0;F[c+100>>2]=0;F[c+12>>2]=f;h=F[f>>2];i=F[f+4>>2];D[c+111|0]=0;k=j;j=c+111|0;Ea(k,(i-h>>2>>>0)/3|0,j);h=F[c+12>>2];i=F[h+28>>2];h=F[h+24>>2];D[c+111|0]=0;Ea(c+44|0,i-h>>2,j);F[c+28>>2]=d;F[c+24>>2]=g;F[c+20>>2]=e;F[c+16>>2]=f;f=d+8|0;e=c+8|0;lc(f,e);j:{if((e|0)==(f|0)){F[d+92>>2]=F[e+84>>2];break j}gb(d+56|0,F[e+48>>2],F[e+52>>2]);gb(d+68|0,F[e+60>>2],F[e- -64>>2]);gb(d+80|0,F[e+72>>2],F[e+76>>2]);F[d+92>>2]=F[e+84>>2];k:{h=F[e+92>>2];j=F[e+88>>2];i=h-j|0;e=i>>2;f=F[d+104>>2];g=F[d+96>>2];if(e>>>0<=f-g>>2>>>0){i=F[d+100>>2]-g|0;f=i+j|0;m=i>>2;i=e>>>0>m>>>0?f:h;l=i-j|0;if((i|0)!=(j|0)){pa(g,j,l)}if(e>>>0>m>>>0){e=F[d+100>>2];if((h|0)!=(i|0)){while(1){F[e>>2]=F[f>>2];e=e+4|0;f=f+4|0;if((h|0)!=(f|0)){continue}break}}F[d+100>>2]=e;break k}F[d+100>>2]=g+l;break k}if(g){F[d+100>>2]=g;ja(g);F[d+104>>2]=0;F[d+96>>2]=0;F[d+100>>2]=0;f=0}l:{if((i|0)<0){break l}g=f>>>1|0;e=f>>>0>=2147483644?1073741823:e>>>0<g>>>0?g:e;if(e>>>0>=1073741824){break l}f=e<<2;e=ka(f);F[d+96>>2]=e;F[d+104>>2]=e+f;if((h|0)!=(j|0)){f=e;e=(i-4&-4)+4|0;e=la(f,j,e)+e|0}F[d+100>>2]=e;break k}na();v()}}F[c+8>>2]=9136;e=F[c+96>>2];if(e){F[c+100>>2]=e;ja(e)}e=F[c+80>>2];if(e){F[c+84>>2]=e;ja(e)}e=F[c+68>>2];if(e){F[c+72>>2]=e;ja(e)}e=F[c+56>>2];if(e){F[c+60>>2]=e;ja(e)}F[c+8>>2]=9372;e=F[c+44>>2];if(e){ja(e)}e=F[c+32>>2];if(e){ja(e)}Z=c+112|0;break d}if((l|0)>=0){break f}break a}if((l|0)<0){break a}}e=F[a+216>>2];c=F[m+44>>2];d=ka(80);F[d>>2]=9684;F[d+4>>2]=0;F[d+76>>2]=0;F[d+68>>2]=c;F[d+8>>2]=8624;F[d+12>>2]=0;F[d+16>>2]=0;F[d+20>>2]=0;F[d+24>>2]=0;F[d+28>>2]=0;F[d+32>>2]=0;F[d+36>>2]=0;F[d+40>>2]=0;F[d+44>>2]=0;F[d+48>>2]=0;F[d+52>>2]=0;e=e+L(h,144)|0;f=e+104|0;F[d+72>>2]=f;F[d- -64>>2]=0;F[d+56>>2]=0;F[d+60>>2]=0;F[n+24>>2]=c;c=n;F[c+68>>2]=0;F[c+72>>2]=0;F[c+60>>2]=0;F[c+64>>2]=0;F[c+52>>2]=0;F[c+56>>2]=0;F[c+44>>2]=0;F[c+48>>2]=0;F[c+84>>2]=0;F[c+88>>2]=0;F[c+76>>2]=0;F[c+80>>2]=0;F[c+28>>2]=d;g=F[c+28>>2];F[c+8>>2]=F[c+24>>2];F[c+12>>2]=g;F[c+20>>2]=f;f=e+4|0;F[c+16>>2]=f;F[c+36>>2]=0;F[c+40>>2]=0;F[c+32>>2]=8624;e=F[c+20>>2];F[c>>2]=F[c+16>>2];F[c+4>>2]=e;e=c+32|0;Fd(e,f,c);c=d+8|0;lc(c,e);if((c|0)!=(e|0)){gb(d+56|0,F[e+48>>2],F[e+52>>2])}Ed(e);break c}c=Z+-64|0;Z=c;g=F[F[a+4>>2]+44>>2];d=ka(80);F[d>>2]=9392;F[d+4>>2]=0;F[d+76>>2]=0;F[d+72>>2]=e;F[d+68>>2]=g;F[d+8>>2]=9556;F[d+12>>2]=0;F[d+16>>2]=0;F[d+20>>2]=0;F[d+24>>2]=0;F[d+28>>2]=0;F[d+32>>2]=0;F[d+36>>2]=0;F[d+40>>2]=0;F[d+44>>2]=0;F[d+48>>2]=0;F[d+52>>2]=0;F[d- -64>>2]=0;j=d+56|0;f=j;F[f>>2]=0;F[f+4>>2]=0;f=F[a+8>>2];F[c+40>>2]=0;F[c+44>>2]=0;F[c+32>>2]=0;F[c+36>>2]=0;h=c+24|0;F[h>>2]=0;F[h+4>>2]=0;F[c+16>>2]=0;F[c+20>>2]=0;F[c+56>>2]=0;F[c+8>>2]=0;F[c+12>>2]=0;F[c+48>>2]=0;F[c+52>>2]=0;F[c>>2]=9556;F[c+4>>2]=f;i=F[f>>2];l=F[f+4>>2];D[c+63|0]=0;k=h;h=c+63|0;Ea(k,(l-i>>2>>>0)/3|0,h);i=F[c+4>>2];l=F[i+28>>2];i=F[i+24>>2];D[c+63|0]=0;Ea(c+36|0,l-i>>2,h);F[c+20>>2]=d;F[c+16>>2]=g;F[c+12>>2]=e;F[c+8>>2]=f;lc(d+8|0,c);gb(j,F[c+48>>2],F[c+52>>2]);F[c>>2]=9556;e=F[c+48>>2];if(e){F[c+52>>2]=e;ja(e)}F[c>>2]=9372;e=F[c+36>>2];if(e){ja(e)}e=F[c+24>>2];if(e){ja(e)}Z=c- -64|0}if(!d){break a}}d=yc(ka(64),d);c=F[a+4>>2];a=d;d=b;m:{n:{if((d|0)>=0){g=c+8|0;b=F[c+12>>2];j=F[c+8>>2];e=b-j>>2;o:{if((e|0)>(d|0)){break o}f=d+1|0;if(d>>>0>=e>>>0){Pb(g,f-e|0);break o}if(e>>>0<=f>>>0){break o}f=j+(f<<2)|0;if((f|0)!=(b|0)){while(1){b=b-4|0;e=F[b>>2];F[b>>2]=0;if(e){$[F[F[e>>2]+4>>2]](e)}if((b|0)!=(f|0)){continue}break}}F[c+12>>2]=f}c=F[g>>2]+(d<<2)|0;b=F[c>>2];F[c>>2]=a;if(b){break n}break m}b=a;if(!a){break m}}$[F[F[b>>2]+4>>2]](b)}q=(d^-1)>>>31|0}Z=n+96|0;return q|0}function Ab(a,b,c,d){var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=M(0),n=M(0),o=0;a:{b:{if(!d){break b}c:{switch(F[a+28>>2]-1|0){case 0:e=G[a+24|0];f=c&255;if(e>>>0<f>>>0?e:f){e=F[a>>2];h=F[e>>2];k=F[a+48>>2];b=ki(F[a+40>>2],F[a+44>>2],b,0);i=b;b=b+k|0;b=b+h|0;h=F[e+4>>2];while(1){if(b>>>0>=h>>>0){break b}E[(g<<1)+d>>1]=D[b|0];b=b+1|0;g=g+1|0;e=G[a+24|0];if(g>>>0<(e>>>0<f>>>0?e:f)>>>0){continue}break}}j=1;if(e>>>0>=f>>>0){break b}break a;case 1:e=G[a+24|0];f=c&255;if(e>>>0<f>>>0?e:f){e=F[a>>2];h=F[e>>2];k=F[a+48>>2];b=ki(F[a+40>>2],F[a+44>>2],b,0);i=b;b=b+k|0;b=b+h|0;h=F[e+4>>2];while(1){if(b>>>0>=h>>>0){break b}E[(g<<1)+d>>1]=G[b|0];b=b+1|0;g=g+1|0;e=G[a+24|0];if(g>>>0<(e>>>0<f>>>0?e:f)>>>0){continue}break}}j=1;if(e>>>0>=f>>>0){break b}break a;case 2:e=G[a+24|0];f=c&255;if(e>>>0<f>>>0?e:f){e=F[a>>2];h=F[e>>2];k=F[a+48>>2];b=ki(F[a+40>>2],F[a+44>>2],b,0);i=b;b=b+k|0;b=b+h|0;h=F[e+4>>2];while(1){if(b>>>0>=h>>>0){break b}E[(g<<1)+d>>1]=H[b>>1];b=b+2|0;g=g+1|0;e=G[a+24|0];if(g>>>0<(e>>>0<f>>>0?e:f)>>>0){continue}break}}j=1;if(e>>>0>=f>>>0){break b}break a;case 3:e=G[a+24|0];f=c&255;if(e>>>0<f>>>0?e:f){e=F[a>>2];h=F[e>>2];k=F[a+48>>2];b=ki(F[a+40>>2],F[a+44>>2],b,0);i=b;b=b+k|0;b=b+h|0;h=F[e+4>>2];while(1){if(b>>>0>=h>>>0){return 0}e=E[b>>1];if((e|0)<0){break b}E[(g<<1)+d>>1]=e;b=b+2|0;g=g+1|0;e=G[a+24|0];if(g>>>0<(e>>>0<f>>>0?e:f)>>>0){continue}break}}j=1;if(e>>>0>=f>>>0){break b}break a;case 4:e=G[a+24|0];f=c&255;if(e>>>0<f>>>0?e:f){e=F[a>>2];h=F[e>>2];k=F[a+48>>2];b=ki(F[a+40>>2],F[a+44>>2],b,0);i=b;b=b+k|0;b=b+h|0;h=F[e+4>>2];while(1){if(b>>>0>=h>>>0){break b}e=F[b>>2];if(e+32768>>>0>65535){break b}E[(g<<1)+d>>1]=e;b=b+4|0;g=g+1|0;e=G[a+24|0];if(g>>>0<(e>>>0<f>>>0?e:f)>>>0){continue}break}}j=1;if(e>>>0>=f>>>0){break b}break a;case 5:e=G[a+24|0];f=c&255;if(e>>>0<f>>>0?e:f){e=F[a>>2];h=F[e>>2];k=F[a+48>>2];b=ki(F[a+40>>2],F[a+44>>2],b,0);i=b;b=b+k|0;b=b+h|0;h=F[e+4>>2];while(1){if(b>>>0>=h>>>0){break b}e=F[b>>2];if(e>>>0>32767){break b}E[(g<<1)+d>>1]=e;b=b+4|0;g=g+1|0;e=G[a+24|0];if(g>>>0<(e>>>0<f>>>0?e:f)>>>0){continue}break}}j=1;if(e>>>0>=f>>>0){break b}break a;case 6:e=G[a+24|0];f=c&255;if(e>>>0<f>>>0?e:f){e=F[a>>2];h=F[e>>2];k=F[a+48>>2];b=ki(F[a+40>>2],F[a+44>>2],b,0);i=b;b=b+k|0;b=b+h|0;k=F[e+4>>2];while(1){if(b>>>0>=k>>>0){break b}h=F[b+4>>2];e=F[b>>2];i=e+32768|0;h=i>>>0<32768?h+1|0:h;if(!h&i>>>0>65535|h){break b}E[(g<<1)+d>>1]=e;b=b+8|0;g=g+1|0;e=G[a+24|0];if(g>>>0<(e>>>0<f>>>0?e:f)>>>0){continue}break}}j=1;if(e>>>0>=f>>>0){break b}break a;case 7:e=G[a+24|0];f=c&255;if(e>>>0<f>>>0?e:f){e=F[a>>2];h=F[e>>2];k=F[a+48>>2];b=ki(F[a+40>>2],F[a+44>>2],b,0);i=b;b=b+k|0;b=b+h|0;h=F[e+4>>2];while(1){if(b>>>0>=h>>>0){break b}k=F[b+4>>2];e=F[b>>2];if(!k&e>>>0>32767|k){break b}E[(g<<1)+d>>1]=e;b=b+8|0;g=g+1|0;e=G[a+24|0];if(g>>>0<(e>>>0<f>>>0?e:f)>>>0){continue}break}}j=1;if(e>>>0>=f>>>0){break b}break a;case 8:d:{e:{e=G[a+24|0];c=c&255;if(!(c>>>0>e>>>0?e:c)){break e}e=F[a>>2];j=F[e>>2];g=j;f=F[a+48>>2];b=ki(F[a+40>>2],F[a+44>>2],b,0);i=b;b=b+f|0;g=b+g|0;f=F[e+4>>2];e=f-j|0;if(!G[a+32|0]){j=0;if((b|0)>=(e|0)){break d}b=0;while(1){m=J[g>>2];if(m>=M(32767)|m<M(-32768)|m!=m){break d}n=M(N(m));if(n==M(Infinity)){break d}e=(b<<1)+d|0;if(n<M(2147483648)){i=~~m}else{i=-2147483648}E[e>>1]=i;b=b+1|0;e=G[a+24|0];if(b>>>0>=(c>>>0>e>>>0?e:c)>>>0){break e}g=g+4|0;if(f>>>0>g>>>0){continue}break}break d}j=0;if((b|0)>=(e|0)){break d}b=0;while(1){m=J[g>>2];if(m>=M(32767)|m<M(-32768)|(M(N(m))==M(Infinity)|m!=m)){break d}if(m<M(0)|m>M(1)){break d}e=(b<<1)+d|0;l=R(+m*32767+.5);f:{if(N(l)<2147483648){i=~~l;break f}i=-2147483648}E[e>>1]=i;b=b+1|0;e=G[a+24|0];if(b>>>0>=(c>>>0>e>>>0?e:c)>>>0){break e}g=g+4|0;if(f>>>0>g>>>0){continue}break}break d}j=1;if(c>>>0<=e>>>0){break d}ma((e<<1)+d|0,0,c-e<<1)}return j;case 9:g:{h:{e=G[a+24|0];c=c&255;if(!(c>>>0>e>>>0?e:c)){break h}e=F[a>>2];j=F[e>>2];g=j;f=F[a+48>>2];b=ki(F[a+40>>2],F[a+44>>2],b,0);i=b;b=b+f|0;g=b+g|0;f=F[e+4>>2];e=f-j|0;if(!G[a+32|0]){j=0;if((b|0)>=(e|0)){break g}b=0;while(1){l=K[g>>3];if(l>=32767|l<-32768|l!=l){break g}o=N(l);if(o==Infinity){break g}e=(b<<1)+d|0;if(o<2147483648){i=~~l}else{i=-2147483648}E[e>>1]=i;b=b+1|0;e=G[a+24|0];if(b>>>0>=(c>>>0>e>>>0?e:c)>>>0){break h}g=g+8|0;if(f>>>0>g>>>0){continue}break}break g}j=0;if((b|0)>=(e|0)){break g}b=0;while(1){l=K[g>>3];if(l>=32767|l<-32768|(N(l)==Infinity|l!=l)){break g}if(l<0|l>1){break g}e=(b<<1)+d|0;l=R(l*32767+.5);i:{if(N(l)<2147483648){i=~~l;break i}i=-2147483648}E[e>>1]=i;b=b+1|0;e=G[a+24|0];if(b>>>0>=(c>>>0>e>>>0?e:c)>>>0){break h}g=g+8|0;if(f>>>0>g>>>0){continue}break}break g}j=1;if(c>>>0<=e>>>0){break g}ma((e<<1)+d|0,0,c-e<<1)}return j;case 10:break c;default:break b}}e=G[a+24|0];f=c&255;if(e>>>0<f>>>0?e:f){e=F[a>>2];h=F[e>>2];k=F[a+48>>2];b=ki(F[a+40>>2],F[a+44>>2],b,0);i=b;b=b+k|0;b=b+h|0;h=F[e+4>>2];while(1){if(b>>>0>=h>>>0){break b}E[(g<<1)+d>>1]=G[b|0];b=b+1|0;g=g+1|0;e=G[a+24|0];if(g>>>0<(e>>>0<f>>>0?e:f)>>>0){continue}break}}j=1;if(e>>>0>=f>>>0){break b}ma((e<<1)+d|0,0,(c&255)-e<<1)}return j}ma((e<<1)+d|0,0,(c&255)-e<<1);return 1}function yb(a,b,c,d){var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=M(0),n=M(0),o=0;a:{b:{if(!d){break b}c:{switch(F[a+28>>2]-1|0){case 0:e=G[a+24|0];f=c&255;if(e>>>0<f>>>0?e:f){e=F[a>>2];h=F[e>>2];k=F[a+48>>2];b=ki(F[a+40>>2],F[a+44>>2],b,0);i=b;b=b+k|0;b=b+h|0;h=F[e+4>>2];while(1){if(b>>>0>=h>>>0){break b}F[(g<<2)+d>>2]=D[b|0];b=b+1|0;g=g+1|0;e=G[a+24|0];if(g>>>0<(e>>>0<f>>>0?e:f)>>>0){continue}break}}j=1;if(e>>>0>=f>>>0){break b}break a;case 1:e=G[a+24|0];f=c&255;if(e>>>0<f>>>0?e:f){e=F[a>>2];h=F[e>>2];k=F[a+48>>2];b=ki(F[a+40>>2],F[a+44>>2],b,0);i=b;b=b+k|0;b=b+h|0;h=F[e+4>>2];while(1){if(b>>>0>=h>>>0){break b}F[(g<<2)+d>>2]=G[b|0];b=b+1|0;g=g+1|0;e=G[a+24|0];if(g>>>0<(e>>>0<f>>>0?e:f)>>>0){continue}break}}j=1;if(e>>>0>=f>>>0){break b}break a;case 2:e=G[a+24|0];f=c&255;if(e>>>0<f>>>0?e:f){e=F[a>>2];h=F[e>>2];k=F[a+48>>2];b=ki(F[a+40>>2],F[a+44>>2],b,0);i=b;b=b+k|0;b=b+h|0;h=F[e+4>>2];while(1){if(b>>>0>=h>>>0){break b}F[(g<<2)+d>>2]=E[b>>1];b=b+2|0;g=g+1|0;e=G[a+24|0];if(g>>>0<(e>>>0<f>>>0?e:f)>>>0){continue}break}}j=1;if(e>>>0>=f>>>0){break b}break a;case 3:e=G[a+24|0];f=c&255;if(e>>>0<f>>>0?e:f){e=F[a>>2];h=F[e>>2];k=F[a+48>>2];b=ki(F[a+40>>2],F[a+44>>2],b,0);i=b;b=b+k|0;b=b+h|0;h=F[e+4>>2];while(1){if(b>>>0>=h>>>0){break b}F[(g<<2)+d>>2]=H[b>>1];b=b+2|0;g=g+1|0;e=G[a+24|0];if(g>>>0<(e>>>0<f>>>0?e:f)>>>0){continue}break}}j=1;if(e>>>0>=f>>>0){break b}break a;case 4:e=G[a+24|0];f=c&255;if(e>>>0<f>>>0?e:f){e=F[a>>2];h=F[e>>2];k=F[a+48>>2];b=ki(F[a+40>>2],F[a+44>>2],b,0);i=b;b=b+k|0;b=b+h|0;h=F[e+4>>2];while(1){if(b>>>0>=h>>>0){break b}F[(g<<2)+d>>2]=F[b>>2];b=b+4|0;g=g+1|0;e=G[a+24|0];if(g>>>0<(e>>>0<f>>>0?e:f)>>>0){continue}break}}j=1;if(e>>>0>=f>>>0){break b}break a;case 5:e=G[a+24|0];f=c&255;if(e>>>0<f>>>0?e:f){e=F[a>>2];h=F[e>>2];k=F[a+48>>2];b=ki(F[a+40>>2],F[a+44>>2],b,0);i=b;b=b+k|0;b=b+h|0;h=F[e+4>>2];while(1){if(b>>>0>=h>>>0){return 0}e=F[b>>2];if((e|0)<0){break b}F[(g<<2)+d>>2]=e;b=b+4|0;g=g+1|0;e=G[a+24|0];if(g>>>0<(e>>>0<f>>>0?e:f)>>>0){continue}break}}j=1;if(e>>>0>=f>>>0){break b}break a;case 6:e=G[a+24|0];f=c&255;if(e>>>0<f>>>0?e:f){e=F[a>>2];h=F[e>>2];k=F[a+48>>2];b=ki(F[a+40>>2],F[a+44>>2],b,0);i=b;b=b+k|0;b=b+h|0;k=F[e+4>>2];while(1){if(b>>>0>=k>>>0){break b}h=F[b+4>>2];e=F[b>>2];if(e- -2147483648>>>0<2147483648?h+1|0:h){break b}F[(g<<2)+d>>2]=e;b=b+8|0;g=g+1|0;e=G[a+24|0];if(g>>>0<(e>>>0<f>>>0?e:f)>>>0){continue}break}}j=1;if(e>>>0>=f>>>0){break b}break a;case 7:e=G[a+24|0];f=c&255;if(e>>>0<f>>>0?e:f){e=F[a>>2];h=F[e>>2];k=F[a+48>>2];b=ki(F[a+40>>2],F[a+44>>2],b,0);i=b;b=b+k|0;b=b+h|0;h=F[e+4>>2];while(1){if(b>>>0>=h>>>0){break b}k=F[b+4>>2];e=F[b>>2];if(!k&e>>>0>2147483647|k){break b}F[(g<<2)+d>>2]=e;b=b+8|0;g=g+1|0;e=G[a+24|0];if(g>>>0<(e>>>0<f>>>0?e:f)>>>0){continue}break}}j=1;if(e>>>0>=f>>>0){break b}break a;case 8:d:{e:{e=G[a+24|0];c=c&255;if(!(c>>>0>e>>>0?e:c)){break e}e=F[a>>2];j=F[e>>2];g=j;f=F[a+48>>2];b=ki(F[a+40>>2],F[a+44>>2],b,0);i=b;b=b+f|0;g=b+g|0;f=F[e+4>>2];e=f-j|0;if(!G[a+32|0]){j=0;if((b|0)>=(e|0)){break d}b=0;while(1){m=J[g>>2];if(m>=M(2147483648)|m<M(-2147483648)|m!=m){break d}n=M(N(m));if(n==M(Infinity)){break d}e=(b<<2)+d|0;if(n<M(2147483648)){i=~~m}else{i=-2147483648}F[e>>2]=i;b=b+1|0;e=G[a+24|0];if(b>>>0>=(c>>>0>e>>>0?e:c)>>>0){break e}g=g+4|0;if(f>>>0>g>>>0){continue}break}break d}j=0;if((b|0)>=(e|0)){break d}b=0;while(1){m=J[g>>2];if(m>=M(2147483648)|m<M(-2147483648)|(M(N(m))==M(Infinity)|m!=m)){break d}if(m<M(0)|m>M(1)){break d}e=(b<<2)+d|0;l=R(+m*2147483647+.5);f:{if(N(l)<2147483648){i=~~l;break f}i=-2147483648}F[e>>2]=i;b=b+1|0;e=G[a+24|0];if(b>>>0>=(c>>>0>e>>>0?e:c)>>>0){break e}g=g+4|0;if(f>>>0>g>>>0){continue}break}break d}j=1;if(c>>>0<=e>>>0){break d}ma((e<<2)+d|0,0,c-e<<2)}return j;case 9:g:{h:{e=G[a+24|0];c=c&255;if(!(c>>>0>e>>>0?e:c)){break h}e=F[a>>2];j=F[e>>2];g=j;f=F[a+48>>2];b=ki(F[a+40>>2],F[a+44>>2],b,0);i=b;b=b+f|0;g=b+g|0;f=F[e+4>>2];e=f-j|0;if(!G[a+32|0]){j=0;if((b|0)>=(e|0)){break g}b=0;while(1){l=K[g>>3];if(l>=2147483647|l<-2147483648|l!=l){break g}o=N(l);if(o==Infinity){break g}e=(b<<2)+d|0;if(o<2147483648){i=~~l}else{i=-2147483648}F[e>>2]=i;b=b+1|0;e=G[a+24|0];if(b>>>0>=(c>>>0>e>>>0?e:c)>>>0){break h}g=g+8|0;if(f>>>0>g>>>0){continue}break}break g}j=0;if((b|0)>=(e|0)){break g}b=0;while(1){l=K[g>>3];if(l>=2147483647|l<-2147483648|(N(l)==Infinity|l!=l)){break g}if(l<0|l>1){break g}e=(b<<2)+d|0;l=R(l*2147483647+.5);i:{if(N(l)<2147483648){i=~~l;break i}i=-2147483648}F[e>>2]=i;b=b+1|0;e=G[a+24|0];if(b>>>0>=(c>>>0>e>>>0?e:c)>>>0){break h}g=g+8|0;if(f>>>0>g>>>0){continue}break}break g}j=1;if(c>>>0<=e>>>0){break g}ma((e<<2)+d|0,0,c-e<<2)}return j;case 10:break c;default:break b}}e=G[a+24|0];f=c&255;if(e>>>0<f>>>0?e:f){e=F[a>>2];h=F[e>>2];k=F[a+48>>2];b=ki(F[a+40>>2],F[a+44>>2],b,0);i=b;b=b+k|0;b=b+h|0;h=F[e+4>>2];while(1){if(b>>>0>=h>>>0){break b}F[(g<<2)+d>>2]=G[b|0];b=b+1|0;g=g+1|0;e=G[a+24|0];if(g>>>0<(e>>>0<f>>>0?e:f)>>>0){continue}break}}j=1;if(e>>>0>=f>>>0){break b}ma((e<<2)+d|0,0,(c&255)-e<<2)}return j}ma((e<<2)+d|0,0,(c&255)-e<<2);return 1}function zb(a,b,c,d){var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=M(0);a:{b:{if(!d){break b}c:{switch(F[a+28>>2]-1|0){case 0:e=G[a+24|0];f=c&255;if(e>>>0<f>>>0?e:f){e=F[a>>2];h=F[e>>2];k=F[a+48>>2];b=ki(F[a+40>>2],F[a+44>>2],b,0);i=b;b=b+k|0;b=b+h|0;h=F[e+4>>2];while(1){if(b>>>0>=h>>>0){return 0}e=D[b|0];if((e|0)<0){break b}E[(g<<1)+d>>1]=e&255;b=b+1|0;g=g+1|0;e=G[a+24|0];if(g>>>0<(e>>>0<f>>>0?e:f)>>>0){continue}break}}l=1;if(e>>>0>=f>>>0){break b}break a;case 1:e=G[a+24|0];f=c&255;if(e>>>0<f>>>0?e:f){e=F[a>>2];h=F[e>>2];k=F[a+48>>2];b=ki(F[a+40>>2],F[a+44>>2],b,0);i=b;b=b+k|0;b=b+h|0;h=F[e+4>>2];while(1){if(b>>>0>=h>>>0){break b}E[(g<<1)+d>>1]=G[b|0];b=b+1|0;g=g+1|0;e=G[a+24|0];if(g>>>0<(e>>>0<f>>>0?e:f)>>>0){continue}break}}l=1;if(e>>>0>=f>>>0){break b}break a;case 2:e=G[a+24|0];f=c&255;if(e>>>0<f>>>0?e:f){e=F[a>>2];h=F[e>>2];k=F[a+48>>2];b=ki(F[a+40>>2],F[a+44>>2],b,0);i=b;b=b+k|0;b=b+h|0;h=F[e+4>>2];while(1){if(b>>>0>=h>>>0){return 0}e=E[b>>1];if((e|0)<0){break b}E[(g<<1)+d>>1]=e;b=b+2|0;g=g+1|0;e=G[a+24|0];if(g>>>0<(e>>>0<f>>>0?e:f)>>>0){continue}break}}l=1;if(e>>>0>=f>>>0){break b}break a;case 3:e=G[a+24|0];f=c&255;if(e>>>0<f>>>0?e:f){e=F[a>>2];h=F[e>>2];k=F[a+48>>2];b=ki(F[a+40>>2],F[a+44>>2],b,0);i=b;b=b+k|0;b=b+h|0;h=F[e+4>>2];while(1){if(b>>>0>=h>>>0){break b}E[(g<<1)+d>>1]=H[b>>1];b=b+2|0;g=g+1|0;e=G[a+24|0];if(g>>>0<(e>>>0<f>>>0?e:f)>>>0){continue}break}}l=1;if(e>>>0>=f>>>0){break b}break a;case 4:e=G[a+24|0];f=c&255;if(e>>>0<f>>>0?e:f){e=F[a>>2];h=F[e>>2];k=F[a+48>>2];b=ki(F[a+40>>2],F[a+44>>2],b,0);i=b;b=b+k|0;b=b+h|0;h=F[e+4>>2];while(1){if(b>>>0>=h>>>0){break b}e=F[b>>2];if(e>>>0>65535){break b}E[(g<<1)+d>>1]=e;b=b+4|0;g=g+1|0;e=G[a+24|0];if(g>>>0<(e>>>0<f>>>0?e:f)>>>0){continue}break}}l=1;if(e>>>0>=f>>>0){break b}break a;case 5:e=G[a+24|0];f=c&255;if(e>>>0<f>>>0?e:f){e=F[a>>2];h=F[e>>2];k=F[a+48>>2];b=ki(F[a+40>>2],F[a+44>>2],b,0);i=b;b=b+k|0;b=b+h|0;h=F[e+4>>2];while(1){if(b>>>0>=h>>>0){break b}e=F[b>>2];if(e>>>0>65535){break b}E[(g<<1)+d>>1]=e;b=b+4|0;g=g+1|0;e=G[a+24|0];if(g>>>0<(e>>>0<f>>>0?e:f)>>>0){continue}break}}l=1;if(e>>>0>=f>>>0){break b}break a;case 6:e=G[a+24|0];f=c&255;if(e>>>0<f>>>0?e:f){e=F[a>>2];h=F[e>>2];k=F[a+48>>2];b=ki(F[a+40>>2],F[a+44>>2],b,0);i=b;b=b+k|0;b=b+h|0;h=F[e+4>>2];while(1){if(b>>>0>=h>>>0){break b}k=F[b+4>>2];e=F[b>>2];if(!k&e>>>0>65535|k){break b}E[(g<<1)+d>>1]=e;b=b+8|0;g=g+1|0;e=G[a+24|0];if(g>>>0<(e>>>0<f>>>0?e:f)>>>0){continue}break}}l=1;if(e>>>0>=f>>>0){break b}break a;case 7:e=G[a+24|0];f=c&255;if(e>>>0<f>>>0?e:f){e=F[a>>2];h=F[e>>2];k=F[a+48>>2];b=ki(F[a+40>>2],F[a+44>>2],b,0);i=b;b=b+k|0;b=b+h|0;h=F[e+4>>2];while(1){if(b>>>0>=h>>>0){break b}k=F[b+4>>2];e=F[b>>2];if(!k&e>>>0>65535|k){break b}E[(g<<1)+d>>1]=e;b=b+8|0;g=g+1|0;e=G[a+24|0];if(g>>>0<(e>>>0<f>>>0?e:f)>>>0){continue}break}}l=1;if(e>>>0>=f>>>0){break b}break a;case 8:d:{e:{e=G[a+24|0];c=c&255;if(!(c>>>0>e>>>0?e:c)){break e}e=F[a>>2];l=F[e>>2];g=l;f=F[a+48>>2];b=ki(F[a+40>>2],F[a+44>>2],b,0);i=b;b=b+f|0;g=b+g|0;f=F[e+4>>2];e=f-l|0;if(!G[a+32|0]){l=0;if((b|0)>=(e|0)){break d}b=0;while(1){m=J[g>>2];if(m>=M(65535)|m<M(0)|(M(N(m))==M(Infinity)|m!=m)){break d}e=(b<<1)+d|0;if(m<M(4294967296)&m>=M(0)){i=~~m>>>0}else{i=0}E[e>>1]=i;b=b+1|0;e=G[a+24|0];if(b>>>0>=(c>>>0>e>>>0?e:c)>>>0){break e}g=g+4|0;if(f>>>0>g>>>0){continue}break}break d}l=0;if((b|0)>=(e|0)){break d}b=0;while(1){m=J[g>>2];if(m>=M(65535)|m<M(0)|(M(N(m))==M(Infinity)|m!=m)){break d}if(m>M(1)){break d}e=(b<<1)+d|0;j=R(+m*65535+.5);f:{if(j<4294967296&j>=0){i=~~j>>>0;break f}i=0}E[e>>1]=i;b=b+1|0;e=G[a+24|0];if(b>>>0>=(c>>>0>e>>>0?e:c)>>>0){break e}g=g+4|0;if(f>>>0>g>>>0){continue}break}break d}l=1;if(c>>>0<=e>>>0){break d}ma((e<<1)+d|0,0,c-e<<1)}return l;case 9:g:{h:{e=G[a+24|0];c=c&255;if(!(c>>>0>e>>>0?e:c)){break h}e=F[a>>2];l=F[e>>2];g=l;f=F[a+48>>2];b=ki(F[a+40>>2],F[a+44>>2],b,0);i=b;b=b+f|0;g=b+g|0;f=F[e+4>>2];e=f-l|0;if(!G[a+32|0]){l=0;if((b|0)>=(e|0)){break g}b=0;while(1){j=K[g>>3];if(j>=65535|j<0|(N(j)==Infinity|j!=j)){break g}e=(b<<1)+d|0;if(j<4294967296&j>=0){i=~~j>>>0}else{i=0}E[e>>1]=i;b=b+1|0;e=G[a+24|0];if(b>>>0>=(c>>>0>e>>>0?e:c)>>>0){break h}g=g+8|0;if(f>>>0>g>>>0){continue}break}break g}l=0;if((b|0)>=(e|0)){break g}b=0;while(1){j=K[g>>3];if(j>=65535|j<0|(N(j)==Infinity|j!=j)){break g}if(j>1){break g}e=(b<<1)+d|0;j=R(j*65535+.5);i:{if(j<4294967296&j>=0){i=~~j>>>0;break i}i=0}E[e>>1]=i;b=b+1|0;e=G[a+24|0];if(b>>>0>=(c>>>0>e>>>0?e:c)>>>0){break h}g=g+8|0;if(f>>>0>g>>>0){continue}break}break g}l=1;if(c>>>0<=e>>>0){break g}ma((e<<1)+d|0,0,c-e<<1)}return l;case 10:break c;default:break b}}e=G[a+24|0];f=c&255;if(e>>>0<f>>>0?e:f){e=F[a>>2];h=F[e>>2];k=F[a+48>>2];b=ki(F[a+40>>2],F[a+44>>2],b,0);i=b;b=b+k|0;b=b+h|0;h=F[e+4>>2];while(1){if(b>>>0>=h>>>0){break b}E[(g<<1)+d>>1]=G[b|0];b=b+1|0;g=g+1|0;e=G[a+24|0];if(g>>>0<(e>>>0<f>>>0?e:f)>>>0){continue}break}}l=1;if(e>>>0>=f>>>0){break b}ma((e<<1)+d|0,0,(c&255)-e<<1)}return l}ma((e<<1)+d|0,0,(c&255)-e<<1);return 1}function Ga(a,b,c,d){var e=0,f=0,g=0,h=0,i=0,j=0,k=M(0),l=0,m=0,n=M(0),o=0;a:{if(!d){break a}b:{c:{switch(F[a+28>>2]-1|0){case 0:e=G[a+24|0];f=c&255;if(e>>>0<f>>>0?e:f){e=F[a>>2];h=F[e>>2];i=F[a+48>>2];b=ki(F[a+40>>2],F[a+44>>2],b,0);j=b;b=b+i|0;b=b+h|0;h=F[e+4>>2];while(1){if(b>>>0>=h>>>0){break a}e=(g<<3)+d|0;i=D[b|0];F[e>>2]=i;F[e+4>>2]=i>>31;b=b+1|0;g=g+1|0;e=G[a+24|0];if(g>>>0<(e>>>0<f>>>0?e:f)>>>0){continue}break}}if(e>>>0>=f>>>0){break a}d=(e<<3)+d|0;a=(c&255)-e|0;break b;case 1:e=G[a+24|0];f=c&255;if(e>>>0<f>>>0?e:f){e=F[a>>2];h=F[e>>2];i=F[a+48>>2];b=ki(F[a+40>>2],F[a+44>>2],b,0);j=b;b=b+i|0;b=b+h|0;h=F[e+4>>2];while(1){if(b>>>0>=h>>>0){break a}e=(g<<3)+d|0;F[e>>2]=G[b|0];F[e+4>>2]=0;b=b+1|0;g=g+1|0;e=G[a+24|0];if(g>>>0<(e>>>0<f>>>0?e:f)>>>0){continue}break}}if(e>>>0>=f>>>0){break a}d=(e<<3)+d|0;a=(c&255)-e|0;break b;case 2:e=G[a+24|0];f=c&255;if(e>>>0<f>>>0?e:f){e=F[a>>2];h=F[e>>2];i=F[a+48>>2];b=ki(F[a+40>>2],F[a+44>>2],b,0);j=b;b=b+i|0;b=b+h|0;h=F[e+4>>2];while(1){if(b>>>0>=h>>>0){break a}e=(g<<3)+d|0;i=E[b>>1];F[e>>2]=i;F[e+4>>2]=i>>31;b=b+2|0;g=g+1|0;e=G[a+24|0];if(g>>>0<(e>>>0<f>>>0?e:f)>>>0){continue}break}}if(e>>>0>=f>>>0){break a}d=(e<<3)+d|0;a=(c&255)-e|0;break b;case 3:e=G[a+24|0];f=c&255;if(e>>>0<f>>>0?e:f){e=F[a>>2];h=F[e>>2];i=F[a+48>>2];b=ki(F[a+40>>2],F[a+44>>2],b,0);j=b;b=b+i|0;b=b+h|0;h=F[e+4>>2];while(1){if(b>>>0>=h>>>0){break a}e=(g<<3)+d|0;F[e>>2]=H[b>>1];F[e+4>>2]=0;b=b+2|0;g=g+1|0;e=G[a+24|0];if(g>>>0<(e>>>0<f>>>0?e:f)>>>0){continue}break}}if(e>>>0>=f>>>0){break a}d=(e<<3)+d|0;a=(c&255)-e|0;break b;case 4:e=G[a+24|0];f=c&255;if(e>>>0<f>>>0?e:f){e=F[a>>2];h=F[e>>2];i=F[a+48>>2];b=ki(F[a+40>>2],F[a+44>>2],b,0);j=b;b=b+i|0;b=b+h|0;h=F[e+4>>2];while(1){if(b>>>0>=h>>>0){break a}e=(g<<3)+d|0;i=F[b>>2];F[e>>2]=i;F[e+4>>2]=i>>31;b=b+4|0;g=g+1|0;e=G[a+24|0];if(g>>>0<(e>>>0<f>>>0?e:f)>>>0){continue}break}}if(e>>>0>=f>>>0){break a}d=(e<<3)+d|0;a=(c&255)-e|0;break b;case 5:e=G[a+24|0];f=c&255;if(e>>>0<f>>>0?e:f){e=F[a>>2];h=F[e>>2];i=F[a+48>>2];b=ki(F[a+40>>2],F[a+44>>2],b,0);j=b;b=b+i|0;b=b+h|0;h=F[e+4>>2];while(1){if(b>>>0>=h>>>0){break a}e=(g<<3)+d|0;F[e>>2]=F[b>>2];F[e+4>>2]=0;b=b+4|0;g=g+1|0;e=G[a+24|0];if(g>>>0<(e>>>0<f>>>0?e:f)>>>0){continue}break}}if(e>>>0>=f>>>0){break a}d=(e<<3)+d|0;a=(c&255)-e|0;break b;case 6:e=G[a+24|0];f=c&255;if(e>>>0<f>>>0?e:f){e=F[a>>2];h=F[e>>2];i=F[a+48>>2];b=ki(F[a+40>>2],F[a+44>>2],b,0);j=b;b=b+i|0;b=b+h|0;h=F[e+4>>2];while(1){if(b>>>0>=h>>>0){break a}i=F[b+4>>2];e=(g<<3)+d|0;F[e>>2]=F[b>>2];F[e+4>>2]=i;b=b+8|0;g=g+1|0;e=G[a+24|0];if(g>>>0<(e>>>0<f>>>0?e:f)>>>0){continue}break}}if(e>>>0>=f>>>0){break a}d=(e<<3)+d|0;a=(c&255)-e|0;break b;case 7:e=G[a+24|0];f=c&255;if(e>>>0<f>>>0?e:f){e=F[a>>2];h=F[e>>2];i=F[a+48>>2];b=ki(F[a+40>>2],F[a+44>>2],b,0);j=b;b=b+i|0;b=b+h|0;h=F[e+4>>2];while(1){if(b>>>0>=h>>>0){break a}e=F[b>>2];i=F[b+4>>2];if((i|0)<0){break a}j=(g<<3)+d|0;F[j>>2]=e;F[j+4>>2]=i;b=b+8|0;g=g+1|0;e=G[a+24|0];if(g>>>0<(e>>>0<f>>>0?e:f)>>>0){continue}break}}if(e>>>0>=f>>>0){break a}d=(e<<3)+d|0;a=(c&255)-e|0;break b;case 8:d:{e=G[a+24|0];f=c&255;if(!(e>>>0<f>>>0?e:f)){break d}if(G[a+32|0]){break a}e=F[a+48>>2];b=ki(F[a+40>>2],F[a+44>>2],b,0);j=b;b=b+e|0;e=F[a>>2];i=F[e+4>>2];e=F[e>>2];if((b|0)>=(i-e|0)){break a}g=b+e|0;h=c&255;b=0;while(1){k=J[g>>2];if(k>=M(0x8000000000000000)|k<M(-0x8000000000000000)|k!=k){break a}n=M(N(k));if(n==M(Infinity)){break a}e=(b<<3)+d|0;e:{if(n<M(0x8000000000000000)){j=M(N(k))>=M(1)?~~(k>M(0)?M(P(M(R(M(k*M(2.3283064365386963e-10)))),M(4294967296))):M(S(M(M(k-M(~~k>>>0>>>0))*M(2.3283064365386963e-10)))))>>>0:0;m=~~k>>>0;break e}j=-2147483648;m=0}F[e>>2]=m;F[e+4>>2]=j;b=b+1|0;e=G[a+24|0];if(b>>>0>=(e>>>0<h>>>0?e:h)>>>0){break d}g=g+4|0;if(i>>>0>g>>>0){continue}break}break a}if(e>>>0>=f>>>0){break a}d=(e<<3)+d|0;a=(c&255)-e|0;break b;case 9:f:{e=G[a+24|0];f=c&255;if(!(e>>>0<f>>>0?e:f)){break f}if(G[a+32|0]){break a}e=F[a+48>>2];b=ki(F[a+40>>2],F[a+44>>2],b,0);j=b;b=b+e|0;e=F[a>>2];i=F[e+4>>2];e=F[e>>2];if((b|0)>=(i-e|0)){break a}g=b+e|0;h=c&255;b=0;while(1){l=K[g>>3];if(l>=0x8000000000000000|l<-0x8000000000000000|l!=l){break a}o=N(l);if(o==Infinity){break a}e=(b<<3)+d|0;g:{if(o<0x8000000000000000){j=N(l)>=1?~~(l>0?P(R(l*2.3283064365386963e-10),4294967295):S((l-+(~~l>>>0>>>0))*2.3283064365386963e-10))>>>0:0;m=~~l>>>0;break g}j=-2147483648;m=0}F[e>>2]=m;F[e+4>>2]=j;b=b+1|0;e=G[a+24|0];if(b>>>0>=(e>>>0<h>>>0?e:h)>>>0){break f}g=g+8|0;if(i>>>0>g>>>0){continue}break}break a}if(e>>>0>=f>>>0){break a}d=(e<<3)+d|0;a=(c&255)-e|0;break b;case 10:break c;default:break a}}e=G[a+24|0];f=c&255;if(e>>>0<f>>>0?e:f){e=F[a>>2];h=F[e>>2];i=F[a+48>>2];b=ki(F[a+40>>2],F[a+44>>2],b,0);j=b;b=b+i|0;b=b+h|0;h=F[e+4>>2];while(1){if(b>>>0>=h>>>0){break a}e=(g<<3)+d|0;F[e>>2]=G[b|0];F[e+4>>2]=0;b=b+1|0;g=g+1|0;e=G[a+24|0];if(g>>>0<(e>>>0<f>>>0?e:f)>>>0){continue}break}}if(e>>>0>=f>>>0){break a}d=(e<<3)+d|0;a=(c&255)-e|0}ma(d,0,a<<3)}}function le(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;j=a;a:{b:{c:{d:{e:{f:{g:{h:{a=F[a+8>>2];switch(F[a+28>>2]-1|0){case 4:break c;case 5:break d;case 2:break e;case 3:break f;case 0:break g;case 1:break h;default:break a}}f=G[a+24|0];c=ka(f);a=F[j+16>>2];if(F[a+80>>2]){g=F[F[a>>2]>>2]+F[a+48>>2]|0}else{g=0}if(!b){break b}if(f){o=f&252;l=f&3;h=f>>>0<4;while(1){a=0;e=0;if(!h){while(1){k=g+(d<<2)|0;D[a+c|0]=F[k>>2];D[(a|1)+c|0]=F[k+4>>2];D[(a|2)+c|0]=F[k+8>>2];D[(a|3)+c|0]=F[k+12>>2];a=a+4|0;d=d+4|0;e=e+4|0;if((o|0)!=(e|0)){continue}break}}e=0;if(l){while(1){D[a+c|0]=F[g+(d<<2)>>2];a=a+1|0;d=d+1|0;e=e+1|0;if((l|0)!=(e|0)){continue}break}}la(F[F[F[j+8>>2]+64>>2]>>2]+m|0,c,f);m=f+m|0;n=n+1|0;if((n|0)!=(b|0)){continue}break}break b}a=0;if((b|0)!=1){g=b&-2;while(1){la(F[F[F[j+8>>2]+64>>2]>>2]+a|0,c,f);a=a+f|0;la(a+F[F[F[j+8>>2]+64>>2]>>2]|0,c,f);a=a+f|0;d=d+2|0;if((g|0)!=(d|0)){continue}break}}if(!(b&1)){break b}la(F[F[F[j+8>>2]+64>>2]>>2]+a|0,c,f);break b}f=G[a+24|0];c=ka(f);a=F[j+16>>2];if(F[a+80>>2]){g=F[F[a>>2]>>2]+F[a+48>>2]|0}else{g=0}if(!b){break b}if(f){o=f&252;l=f&3;h=f>>>0<4;while(1){a=0;e=0;if(!h){while(1){k=g+(d<<2)|0;D[a+c|0]=F[k>>2];D[(a|1)+c|0]=F[k+4>>2];D[(a|2)+c|0]=F[k+8>>2];D[(a|3)+c|0]=F[k+12>>2];a=a+4|0;d=d+4|0;e=e+4|0;if((o|0)!=(e|0)){continue}break}}e=0;if(l){while(1){D[a+c|0]=F[g+(d<<2)>>2];a=a+1|0;d=d+1|0;e=e+1|0;if((l|0)!=(e|0)){continue}break}}la(F[F[F[j+8>>2]+64>>2]>>2]+m|0,c,f);m=f+m|0;n=n+1|0;if((n|0)!=(b|0)){continue}break}break b}a=0;if((b|0)!=1){g=b&-2;while(1){la(F[F[F[j+8>>2]+64>>2]>>2]+a|0,c,f);a=a+f|0;la(a+F[F[F[j+8>>2]+64>>2]>>2]|0,c,f);a=a+f|0;d=d+2|0;if((g|0)!=(d|0)){continue}break}}if(!(b&1)){break b}la(F[F[F[j+8>>2]+64>>2]>>2]+a|0,c,f);break b}h=G[a+24|0];i=h<<1;c=ka(i);a=F[j+16>>2];if(F[a+80>>2]){g=F[F[a>>2]>>2]+F[a+48>>2]|0}else{g=0}if(!b){break b}if(h){o=h&252;l=h&3;h=h>>>0<4;while(1){a=0;e=0;if(!h){while(1){f=a<<1;k=g+(d<<2)|0;E[f+c>>1]=F[k>>2];E[(f|2)+c>>1]=F[k+4>>2];E[(f|4)+c>>1]=F[k+8>>2];E[(f|6)+c>>1]=F[k+12>>2];a=a+4|0;d=d+4|0;e=e+4|0;if((o|0)!=(e|0)){continue}break}}e=0;if(l){while(1){E[(a<<1)+c>>1]=F[g+(d<<2)>>2];a=a+1|0;d=d+1|0;e=e+1|0;if((l|0)!=(e|0)){continue}break}}la(F[F[F[j+8>>2]+64>>2]>>2]+n|0,c,i);n=i+n|0;m=m+1|0;if((m|0)!=(b|0)){continue}break}break b}a=0;if((b|0)!=1){g=b&-2;while(1){la(F[F[F[j+8>>2]+64>>2]>>2]+a|0,c,i);a=a+i|0;la(a+F[F[F[j+8>>2]+64>>2]>>2]|0,c,i);a=a+i|0;d=d+2|0;if((g|0)!=(d|0)){continue}break}}if(!(b&1)){break b}la(F[F[F[j+8>>2]+64>>2]>>2]+a|0,c,i);break b}h=G[a+24|0];i=h<<1;c=ka(i);a=F[j+16>>2];if(F[a+80>>2]){g=F[F[a>>2]>>2]+F[a+48>>2]|0}else{g=0}if(!b){break b}if(h){o=h&252;l=h&3;h=h>>>0<4;while(1){a=0;e=0;if(!h){while(1){f=a<<1;k=g+(d<<2)|0;E[f+c>>1]=F[k>>2];E[(f|2)+c>>1]=F[k+4>>2];E[(f|4)+c>>1]=F[k+8>>2];E[(f|6)+c>>1]=F[k+12>>2];a=a+4|0;d=d+4|0;e=e+4|0;if((o|0)!=(e|0)){continue}break}}e=0;if(l){while(1){E[(a<<1)+c>>1]=F[g+(d<<2)>>2];a=a+1|0;d=d+1|0;e=e+1|0;if((l|0)!=(e|0)){continue}break}}la(F[F[F[j+8>>2]+64>>2]>>2]+n|0,c,i);n=i+n|0;m=m+1|0;if((m|0)!=(b|0)){continue}break}break b}a=0;if((b|0)!=1){g=b&-2;while(1){la(F[F[F[j+8>>2]+64>>2]>>2]+a|0,c,i);a=a+i|0;la(a+F[F[F[j+8>>2]+64>>2]>>2]|0,c,i);a=a+i|0;d=d+2|0;if((g|0)!=(d|0)){continue}break}}if(!(b&1)){break b}la(F[F[F[j+8>>2]+64>>2]>>2]+a|0,c,i);break b}h=G[a+24|0];i=h<<2;c=ka(i);a=F[j+16>>2];if(F[a+80>>2]){g=F[F[a>>2]>>2]+F[a+48>>2]|0}else{g=0}if(!b){break b}if(h){o=h&252;l=h&3;h=h>>>0<4;while(1){a=0;e=0;if(!h){while(1){f=a<<2;k=g+(d<<2)|0;F[f+c>>2]=F[k>>2];F[(f|4)+c>>2]=F[k+4>>2];F[(f|8)+c>>2]=F[k+8>>2];F[(f|12)+c>>2]=F[k+12>>2];a=a+4|0;d=d+4|0;e=e+4|0;if((o|0)!=(e|0)){continue}break}}e=0;if(l){while(1){F[(a<<2)+c>>2]=F[g+(d<<2)>>2];a=a+1|0;d=d+1|0;e=e+1|0;if((l|0)!=(e|0)){continue}break}}la(F[F[F[j+8>>2]+64>>2]>>2]+n|0,c,i);n=i+n|0;m=m+1|0;if((m|0)!=(b|0)){continue}break}break b}a=0;if((b|0)!=1){g=b&-2;while(1){la(F[F[F[j+8>>2]+64>>2]>>2]+a|0,c,i);a=a+i|0;la(a+F[F[F[j+8>>2]+64>>2]>>2]|0,c,i);a=a+i|0;d=d+2|0;if((g|0)!=(d|0)){continue}break}}if(!(b&1)){break b}la(F[F[F[j+8>>2]+64>>2]>>2]+a|0,c,i);break b}h=G[a+24|0];i=h<<2;c=ka(i);a=F[j+16>>2];if(F[a+80>>2]){g=F[F[a>>2]>>2]+F[a+48>>2]|0}else{g=0}if(!b){break b}if(h){o=h&252;l=h&3;h=h>>>0<4;while(1){a=0;e=0;if(!h){while(1){f=a<<2;k=g+(d<<2)|0;F[f+c>>2]=F[k>>2];F[(f|4)+c>>2]=F[k+4>>2];F[(f|8)+c>>2]=F[k+8>>2];F[(f|12)+c>>2]=F[k+12>>2];a=a+4|0;d=d+4|0;e=e+4|0;if((o|0)!=(e|0)){continue}break}}e=0;if(l){while(1){F[(a<<2)+c>>2]=F[g+(d<<2)>>2];a=a+1|0;d=d+1|0;e=e+1|0;if((l|0)!=(e|0)){continue}break}}la(F[F[F[j+8>>2]+64>>2]>>2]+n|0,c,i);n=i+n|0;m=m+1|0;if((m|0)!=(b|0)){continue}break}break b}a=0;if((b|0)!=1){g=b&-2;while(1){la(F[F[F[j+8>>2]+64>>2]>>2]+a|0,c,i);a=a+i|0;la(a+F[F[F[j+8>>2]+64>>2]>>2]|0,c,i);a=a+i|0;d=d+2|0;if((g|0)!=(d|0)){continue}break}}if(!(b&1)){break b}la(F[F[F[j+8>>2]+64>>2]>>2]+a|0,c,i)}ja(c);c=1}return c|0}function xb(a,b,c,d){var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=M(0);a:{b:{if(!d){break b}c:{switch(F[a+28>>2]-1|0){case 0:e=G[a+24|0];f=c&255;if(e>>>0<f>>>0?e:f){e=F[a>>2];h=F[e>>2];l=F[a+48>>2];b=ki(F[a+40>>2],F[a+44>>2],b,0);i=b;b=b+l|0;b=b+h|0;h=F[e+4>>2];while(1){if(b>>>0>=h>>>0){break b}F[(g<<2)+d>>2]=D[b|0];b=b+1|0;g=g+1|0;e=G[a+24|0];if(g>>>0<(e>>>0<f>>>0?e:f)>>>0){continue}break}}k=1;if(e>>>0>=f>>>0){break b}break a;case 1:e=G[a+24|0];f=c&255;if(e>>>0<f>>>0?e:f){e=F[a>>2];h=F[e>>2];l=F[a+48>>2];b=ki(F[a+40>>2],F[a+44>>2],b,0);i=b;b=b+l|0;b=b+h|0;h=F[e+4>>2];while(1){if(b>>>0>=h>>>0){break b}F[(g<<2)+d>>2]=G[b|0];b=b+1|0;g=g+1|0;e=G[a+24|0];if(g>>>0<(e>>>0<f>>>0?e:f)>>>0){continue}break}}k=1;if(e>>>0>=f>>>0){break b}break a;case 2:e=G[a+24|0];f=c&255;if(e>>>0<f>>>0?e:f){e=F[a>>2];h=F[e>>2];l=F[a+48>>2];b=ki(F[a+40>>2],F[a+44>>2],b,0);i=b;b=b+l|0;b=b+h|0;h=F[e+4>>2];while(1){if(b>>>0>=h>>>0){break b}F[(g<<2)+d>>2]=E[b>>1];b=b+2|0;g=g+1|0;e=G[a+24|0];if(g>>>0<(e>>>0<f>>>0?e:f)>>>0){continue}break}}k=1;if(e>>>0>=f>>>0){break b}break a;case 3:e=G[a+24|0];f=c&255;if(e>>>0<f>>>0?e:f){e=F[a>>2];h=F[e>>2];l=F[a+48>>2];b=ki(F[a+40>>2],F[a+44>>2],b,0);i=b;b=b+l|0;b=b+h|0;h=F[e+4>>2];while(1){if(b>>>0>=h>>>0){break b}F[(g<<2)+d>>2]=H[b>>1];b=b+2|0;g=g+1|0;e=G[a+24|0];if(g>>>0<(e>>>0<f>>>0?e:f)>>>0){continue}break}}k=1;if(e>>>0>=f>>>0){break b}break a;case 4:e=G[a+24|0];f=c&255;if(e>>>0<f>>>0?e:f){e=F[a>>2];h=F[e>>2];l=F[a+48>>2];b=ki(F[a+40>>2],F[a+44>>2],b,0);i=b;b=b+l|0;b=b+h|0;h=F[e+4>>2];while(1){if(b>>>0>=h>>>0){break b}F[(g<<2)+d>>2]=F[b>>2];b=b+4|0;g=g+1|0;e=G[a+24|0];if(g>>>0<(e>>>0<f>>>0?e:f)>>>0){continue}break}}k=1;if(e>>>0>=f>>>0){break b}break a;case 5:e=G[a+24|0];f=c&255;if(e>>>0<f>>>0?e:f){e=F[a>>2];h=F[e>>2];l=F[a+48>>2];b=ki(F[a+40>>2],F[a+44>>2],b,0);i=b;b=b+l|0;b=b+h|0;h=F[e+4>>2];while(1){if(b>>>0>=h>>>0){break b}F[(g<<2)+d>>2]=F[b>>2];b=b+4|0;g=g+1|0;e=G[a+24|0];if(g>>>0<(e>>>0<f>>>0?e:f)>>>0){continue}break}}k=1;if(e>>>0>=f>>>0){break b}break a;case 6:e=G[a+24|0];f=c&255;if(e>>>0<f>>>0?e:f){e=F[a>>2];h=F[e>>2];l=F[a+48>>2];b=ki(F[a+40>>2],F[a+44>>2],b,0);i=b;b=b+l|0;b=b+h|0;h=F[e+4>>2];while(1){if(b>>>0>=h>>>0){break b}e=F[b>>2];if(F[b+4>>2]){break b}F[(g<<2)+d>>2]=e;b=b+8|0;g=g+1|0;e=G[a+24|0];if(g>>>0<(e>>>0<f>>>0?e:f)>>>0){continue}break}}k=1;if(e>>>0>=f>>>0){break b}break a;case 7:e=G[a+24|0];f=c&255;if(e>>>0<f>>>0?e:f){e=F[a>>2];h=F[e>>2];l=F[a+48>>2];b=ki(F[a+40>>2],F[a+44>>2],b,0);i=b;b=b+l|0;b=b+h|0;h=F[e+4>>2];while(1){if(b>>>0>=h>>>0){break b}e=F[b>>2];if(F[b+4>>2]){break b}F[(g<<2)+d>>2]=e;b=b+8|0;g=g+1|0;e=G[a+24|0];if(g>>>0<(e>>>0<f>>>0?e:f)>>>0){continue}break}}k=1;if(e>>>0>=f>>>0){break b}break a;case 8:d:{e:{e=G[a+24|0];c=c&255;if(!(c>>>0>e>>>0?e:c)){break e}e=F[a>>2];k=F[e>>2];g=k;f=F[a+48>>2];b=ki(F[a+40>>2],F[a+44>>2],b,0);i=b;b=b+f|0;g=b+g|0;f=F[e+4>>2];e=f-k|0;if(!G[a+32|0]){k=0;if((b|0)>=(e|0)){break d}b=0;while(1){m=J[g>>2];if(m>=M(4294967296)|m<M(0)|(M(N(m))==M(Infinity)|m!=m)){break d}e=(b<<2)+d|0;if(m<M(4294967296)&m>=M(0)){i=~~m>>>0}else{i=0}F[e>>2]=i;b=b+1|0;e=G[a+24|0];if(b>>>0>=(c>>>0>e>>>0?e:c)>>>0){break e}g=g+4|0;if(f>>>0>g>>>0){continue}break}break d}k=0;if((b|0)>=(e|0)){break d}b=0;while(1){m=J[g>>2];if(m>=M(4294967296)|m<M(0)|(M(N(m))==M(Infinity)|m!=m)){break d}if(m>M(1)){break d}e=(b<<2)+d|0;j=R(+m*4294967295+.5);f:{if(j<4294967296&j>=0){i=~~j>>>0;break f}i=0}F[e>>2]=i;b=b+1|0;e=G[a+24|0];if(b>>>0>=(c>>>0>e>>>0?e:c)>>>0){break e}g=g+4|0;if(f>>>0>g>>>0){continue}break}break d}k=1;if(c>>>0<=e>>>0){break d}ma((e<<2)+d|0,0,c-e<<2)}return k;case 9:g:{h:{e=G[a+24|0];c=c&255;if(!(c>>>0>e>>>0?e:c)){break h}e=F[a>>2];k=F[e>>2];g=k;f=F[a+48>>2];b=ki(F[a+40>>2],F[a+44>>2],b,0);i=b;b=b+f|0;g=b+g|0;f=F[e+4>>2];e=f-k|0;if(!G[a+32|0]){k=0;if((b|0)>=(e|0)){break g}b=0;while(1){j=K[g>>3];if(j>=4294967295|j<0|(N(j)==Infinity|j!=j)){break g}e=(b<<2)+d|0;if(j<4294967296&j>=0){i=~~j>>>0}else{i=0}F[e>>2]=i;b=b+1|0;e=G[a+24|0];if(b>>>0>=(c>>>0>e>>>0?e:c)>>>0){break h}g=g+8|0;if(f>>>0>g>>>0){continue}break}break g}k=0;if((b|0)>=(e|0)){break g}b=0;while(1){j=K[g>>3];if(j>=4294967295|j<0|(N(j)==Infinity|j!=j)){break g}if(j>1){break g}e=(b<<2)+d|0;j=R(j*4294967295+.5);i:{if(j<4294967296&j>=0){i=~~j>>>0;break i}i=0}F[e>>2]=i;b=b+1|0;e=G[a+24|0];if(b>>>0>=(c>>>0>e>>>0?e:c)>>>0){break h}g=g+8|0;if(f>>>0>g>>>0){continue}break}break g}k=1;if(c>>>0<=e>>>0){break g}ma((e<<2)+d|0,0,c-e<<2)}return k;case 10:break c;default:break b}}e=G[a+24|0];f=c&255;if(e>>>0<f>>>0?e:f){e=F[a>>2];h=F[e>>2];l=F[a+48>>2];b=ki(F[a+40>>2],F[a+44>>2],b,0);i=b;b=b+l|0;b=b+h|0;h=F[e+4>>2];while(1){if(b>>>0>=h>>>0){break b}F[(g<<2)+d>>2]=G[b|0];b=b+1|0;g=g+1|0;e=G[a+24|0];if(g>>>0<(e>>>0<f>>>0?e:f)>>>0){continue}break}}k=1;if(e>>>0>=f>>>0){break b}ma((e<<2)+d|0,0,(c&255)-e<<2)}return k}ma((e<<2)+d|0,0,(c&255)-e<<2);return 1}function rd(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;a:{b:{c:{d:{e:{if(F[a+92>>2]==F[a+88>>2]){break e}c=F[a+52>>2];f:{if((c|0)!=F[a+56>>2]){F[c>>2]=b;F[a+52>>2]=c+4;break f}h=F[a+48>>2];g=c-h|0;d=g>>2;f=d+1|0;if(f>>>0>=1073741824){break a}e=g>>>1|0;g=g>>>0>=2147483644?1073741823:f>>>0<e>>>0?e:f;if(g){if(g>>>0>=1073741824){break d}e=ka(g<<2)}else{e=0}f=e+(d<<2)|0;F[f>>2]=b;d=f+4|0;if((c|0)!=(h|0)){while(1){f=f-4|0;c=c-4|0;F[f>>2]=F[c>>2];if((c|0)!=(h|0)){continue}break}}F[a+56>>2]=e+(g<<2);F[a+52>>2]=d;F[a+48>>2]=f;if(!h){break f}ja(h)}F[a+84>>2]=0;c=-1;e=-1;g:{if((b|0)==-1){break g}d=F[a+4>>2];e=b+1|0;e=(e>>>0)%3|0?e:b-2|0;if((e|0)!=-1){c=F[F[d>>2]+(e<<2)>>2]}h:{if((b>>>0)%3|0){l=b-1|0;break h}l=b+2|0;e=-1;if((l|0)==-1){break g}}e=F[F[d>>2]+(l<<2)>>2]}i=e>>>3&536870908;d=F[a+36>>2];h=d+(c>>>3&536870908)|0;g=F[h>>2];f=1<<c;if(!(g&f)){F[h>>2]=f|g;f=a+8|0;if((b|0)!=-1){d=b+1|0;d=(d>>>0)%3|0?d:b-2|0}else{d=-1}Ka(f,c,d);d=F[a+36>>2]}f=d+i|0;d=F[f>>2];c=1<<e;if(!(d&c)){F[f>>2]=c|d;d=a+8|0;c=-1;i:{if((b|0)==-1){break i}c=b-1|0;if((b>>>0)%3|0){break i}c=b+2|0}Ka(d,e,c)}c=-1;c=(b|0)!=-1?F[F[F[a+4>>2]>>2]+(b<<2)>>2]:c;f=F[a+36>>2]+(c>>>3&536870908)|0;d=F[f>>2];e=1<<c;if(!(d&e)){F[f>>2]=d|e;Ka(a+8|0,c,b)}d=F[a+84>>2];if((d|0)>2){break e}while(1){e=L(d,12)+a|0;b=F[e+52>>2];if((b|0)==F[e+48>>2]){d=d+1|0;if((d|0)!=3){continue}break e}b=b-4|0;c=F[b>>2];F[e+52>>2]=b;F[a+84>>2]=d;if((c|0)==-1){break e}f=F[a+24>>2];b=(c>>>0)/3|0;j:{if(F[f+(b>>>3&268435452)>>2]>>>b&1){break j}k:{while(1){k=(c>>>0)/3|0;b=(k>>>3&268435452)+f|0;F[b>>2]=F[b>>2]|1<<k;d=-1;l:{m:{n:{o:{p:{q:{r:{s:{d=(c|0)!=-1?F[F[F[a+4>>2]>>2]+(c<<2)>>2]:d;f=F[a+36>>2]+(d>>>3&536870908)|0;e=F[f>>2];b=1<<d;if(!(e&b)){F[f>>2]=b|e;i=F[(F[F[a+16>>2]+96>>2]+L(k,12)|0)+((c>>>0)%3<<2)>>2];l=F[F[a+20>>2]+4>>2];f=F[l+4>>2];t:{if((f|0)!=F[l+8>>2]){F[f>>2]=i;F[l+4>>2]=f+4;break t}j=F[l>>2];h=f-j|0;g=h>>2;e=g+1|0;if(e>>>0>=1073741824){break s}b=h>>>1|0;h=h>>>0>=2147483644?1073741823:b>>>0>e>>>0?b:e;if(h){if(h>>>0>=1073741824){break d}e=ka(h<<2)}else{e=0}b=e+(g<<2)|0;F[b>>2]=i;g=b+4|0;if((f|0)!=(j|0)){while(1){b=b-4|0;f=f-4|0;F[b>>2]=F[f>>2];if((f|0)!=(j|0)){continue}break}}F[l+8>>2]=e+(h<<2);F[l+4>>2]=g;F[l>>2]=b;if(!j){break t}ja(j)}j=F[a+12>>2];f=F[j+4>>2];u:{if((f|0)!=F[j+8>>2]){F[f>>2]=c;F[j+4>>2]=f+4;break u}i=F[j>>2];h=f-i|0;g=h>>2;e=g+1|0;if(e>>>0>=1073741824){break r}b=h>>>1|0;h=h>>>0>=2147483644?1073741823:b>>>0>e>>>0?b:e;if(h){if(h>>>0>=1073741824){break d}e=ka(h<<2)}else{e=0}b=e+(g<<2)|0;F[b>>2]=c;g=b+4|0;if((f|0)!=(i|0)){while(1){b=b-4|0;f=f-4|0;F[b>>2]=F[f>>2];if((f|0)!=(i|0)){continue}break}}F[j+8>>2]=e+(h<<2);F[j+4>>2]=g;F[j>>2]=b;if(!i){break u}ja(i)}b=F[a+12>>2];F[F[b+12>>2]+(d<<2)>>2]=F[b+24>>2];F[b+24>>2]=F[b+24>>2]+1}if((c|0)==-1){break k}g=F[a+4>>2];f=-1;b=c+1|0;b=(b>>>0)%3|0?b:c-2|0;if((b|0)!=-1){f=F[F[g+12>>2]+(b<<2)>>2]}v:{w:{if((L(k,3)|0)!=(c|0)){d=c-1|0;break w}d=c+2|0;c=-1;if((d|0)==-1){break v}}c=F[F[g+12>>2]+(d<<2)>>2]}d=(c|0)==-1;e=(c>>>0)/3|0;if((f|0)!=-1){b=(f>>>0)/3|0;b=F[F[a+24>>2]+(b>>>3&268435452)>>2]&1<<b;if(d){break q}l=(b|0)!=0;break p}l=1;if(!d){break p}break k}na();v()}na();v()}if(!b){break o}break k}b=d?-1:e;x:{if(F[F[a+24>>2]+(b>>>3&536870908)>>2]>>>b&1){break x}k=0;b=F[F[g>>2]+(c<<2)>>2];if(!(F[F[a+36>>2]+(b>>>3&536870908)>>2]>>>b&1)){b=F[a+88>>2]+(b<<2)|0;e=F[b>>2];F[b>>2]=e+1;k=(e|0)<=0?2:1}if(F[a+84>>2]>=(k|0)&l){break m}j=L(k,12)+a|0;b=F[j+52>>2];y:{if((b|0)!=F[j+56>>2]){F[b>>2]=c;F[j+52>>2]=b+4;break y}i=F[j+48>>2];h=b-i|0;d=h>>2;g=d+1|0;if(g>>>0>=1073741824){break c}e=h>>>1|0;g=h>>>0>=2147483644?1073741823:e>>>0>g>>>0?e:g;if(g){if(g>>>0>=1073741824){break d}e=ka(g<<2)}else{e=0}d=e+(d<<2)|0;F[d>>2]=c;c=d+4|0;if((b|0)!=(i|0)){while(1){d=d-4|0;b=b-4|0;F[d>>2]=F[b>>2];if((b|0)!=(i|0)){continue}break}}F[j+48>>2]=d;F[j+52>>2]=c;F[j+56>>2]=e+(g<<2);if(!i){break y}ja(i)}if(F[a+84>>2]<=(k|0)){break x}F[a+84>>2]=k}if(l){break k}c=-1;if((f|0)==-1){break n}}c=F[F[F[a+4>>2]>>2]+(f<<2)>>2]}b=0;if(!(F[F[a+36>>2]+(c>>>3&536870908)>>2]>>>c&1)){b=F[a+88>>2]+(c<<2)|0;c=F[b>>2];F[b>>2]=c+1;b=(c|0)<=0?2:1}if(F[a+84>>2]<(b|0)){break l}c=f}f=F[a+24>>2];continue}break}k=L(b,12)+a|0;c=F[k+52>>2];z:{if((c|0)!=F[k+56>>2]){F[c>>2]=f;F[k+52>>2]=c+4;break z}i=F[k+48>>2];h=c-i|0;d=h>>2;g=d+1|0;if(g>>>0>=1073741824){break b}e=h>>>1|0;g=h>>>0>=2147483644?1073741823:e>>>0>g>>>0?e:g;if(g){if(g>>>0>=1073741824){break d}e=ka(g<<2)}else{e=0}d=e+(d<<2)|0;F[d>>2]=f;f=d+4|0;if((c|0)!=(i|0)){while(1){d=d-4|0;c=c-4|0;F[d>>2]=F[c>>2];if((c|0)!=(i|0)){continue}break}}F[k+48>>2]=d;F[k+52>>2]=f;F[k+56>>2]=e+(g<<2);if(!i){break z}ja(i)}d=F[a+84>>2];if((d|0)<=(b|0)){break j}F[a+84>>2]=b;d=b;break j}d=F[a+84>>2]}if((d|0)<3){continue}break}}return 1}oa();v()}na();v()}na();v()}na();v()}function Mc(a){var b=0,c=0,d=0,e=0,f=0,g=0;e=Z-16|0;Z=e;F[e+12>>2]=a;a:{if(a>>>0<=211){d=F[Lc(10352,10544,e+12|0)>>2];break a}if(a>>>0>=4294967292){V();v()}f=(a>>>0)/210|0;d=L(f,210);F[e+8>>2]=a-d;g=Lc(10544,10736,e+8|0)-10544>>2;while(1){d=F[(g<<2)+10544>>2]+d|0;a=5;while(1){b:{if((a|0)==47){a=211;while(1){b=(d>>>0)/(a>>>0)|0;if(b>>>0<a>>>0){break a}if((L(a,b)|0)==(d|0)){break b}b=a+10|0;c=(d>>>0)/(b>>>0)|0;if(b>>>0>c>>>0){break a}if((L(b,c)|0)==(d|0)){break b}b=a+12|0;c=(d>>>0)/(b>>>0)|0;if(b>>>0>c>>>0){break a}if((L(b,c)|0)==(d|0)){break b}b=a+16|0;c=(d>>>0)/(b>>>0)|0;if(b>>>0>c>>>0){break a}if((L(b,c)|0)==(d|0)){break b}b=a+18|0;c=(d>>>0)/(b>>>0)|0;if(b>>>0>c>>>0){break a}if((L(b,c)|0)==(d|0)){break b}b=a+22|0;c=(d>>>0)/(b>>>0)|0;if(b>>>0>c>>>0){break a}if((L(b,c)|0)==(d|0)){break b}b=a+28|0;c=(d>>>0)/(b>>>0)|0;if(b>>>0>c>>>0){break a}if((L(b,c)|0)==(d|0)){break b}b=a+30|0;c=(d>>>0)/(b>>>0)|0;if(b>>>0>c>>>0){break a}if((L(b,c)|0)==(d|0)){break b}b=a+36|0;c=(d>>>0)/(b>>>0)|0;if(b>>>0>c>>>0){break a}if((L(b,c)|0)==(d|0)){break b}b=a+40|0;c=(d>>>0)/(b>>>0)|0;if(b>>>0>c>>>0){break a}if((L(b,c)|0)==(d|0)){break b}b=a+42|0;c=(d>>>0)/(b>>>0)|0;if(b>>>0>c>>>0){break a}if((L(b,c)|0)==(d|0)){break b}b=a+46|0;c=(d>>>0)/(b>>>0)|0;if(b>>>0>c>>>0){break a}if((L(b,c)|0)==(d|0)){break b}b=a+52|0;c=(d>>>0)/(b>>>0)|0;if(b>>>0>c>>>0){break a}if((L(b,c)|0)==(d|0)){break b}b=a+58|0;c=(d>>>0)/(b>>>0)|0;if(b>>>0>c>>>0){break a}if((L(b,c)|0)==(d|0)){break b}b=a+60|0;c=(d>>>0)/(b>>>0)|0;if(b>>>0>c>>>0){break a}if((L(b,c)|0)==(d|0)){break b}b=a+66|0;c=(d>>>0)/(b>>>0)|0;if(b>>>0>c>>>0){break a}if((L(b,c)|0)==(d|0)){break b}b=a+70|0;c=(d>>>0)/(b>>>0)|0;if(b>>>0>c>>>0){break a}if((L(b,c)|0)==(d|0)){break b}b=a+72|0;c=(d>>>0)/(b>>>0)|0;if(b>>>0>c>>>0){break a}if((L(b,c)|0)==(d|0)){break b}b=a+78|0;c=(d>>>0)/(b>>>0)|0;if(b>>>0>c>>>0){break a}if((L(b,c)|0)==(d|0)){break b}b=a+82|0;c=(d>>>0)/(b>>>0)|0;if(b>>>0>c>>>0){break a}if((L(b,c)|0)==(d|0)){break b}b=a+88|0;c=(d>>>0)/(b>>>0)|0;if(b>>>0>c>>>0){break a}if((L(b,c)|0)==(d|0)){break b}b=a+96|0;c=(d>>>0)/(b>>>0)|0;if(b>>>0>c>>>0){break a}if((L(b,c)|0)==(d|0)){break b}b=a+100|0;c=(d>>>0)/(b>>>0)|0;if(b>>>0>c>>>0){break a}if((L(b,c)|0)==(d|0)){break b}b=a+102|0;c=(d>>>0)/(b>>>0)|0;if(b>>>0>c>>>0){break a}if((L(b,c)|0)==(d|0)){break b}b=a+106|0;c=(d>>>0)/(b>>>0)|0;if(b>>>0>c>>>0){break a}if((L(b,c)|0)==(d|0)){break b}b=a+108|0;c=(d>>>0)/(b>>>0)|0;if(b>>>0>c>>>0){break a}if((L(b,c)|0)==(d|0)){break b}b=a+112|0;c=(d>>>0)/(b>>>0)|0;if(b>>>0>c>>>0){break a}if((L(b,c)|0)==(d|0)){break b}b=a+120|0;c=(d>>>0)/(b>>>0)|0;if(b>>>0>c>>>0){break a}if((L(b,c)|0)==(d|0)){break b}b=a+126|0;c=(d>>>0)/(b>>>0)|0;if(b>>>0>c>>>0){break a}if((L(b,c)|0)==(d|0)){break b}b=a+130|0;c=(d>>>0)/(b>>>0)|0;if(b>>>0>c>>>0){break a}if((L(b,c)|0)==(d|0)){break b}b=a+136|0;c=(d>>>0)/(b>>>0)|0;if(b>>>0>c>>>0){break a}if((L(b,c)|0)==(d|0)){break b}b=a+138|0;c=(d>>>0)/(b>>>0)|0;if(b>>>0>c>>>0){break a}if((L(b,c)|0)==(d|0)){break b}b=a+142|0;c=(d>>>0)/(b>>>0)|0;if(b>>>0>c>>>0){break a}if((L(b,c)|0)==(d|0)){break b}b=a+148|0;c=(d>>>0)/(b>>>0)|0;if(b>>>0>c>>>0){break a}if((L(b,c)|0)==(d|0)){break b}b=a+150|0;c=(d>>>0)/(b>>>0)|0;if(b>>>0>c>>>0){break a}if((L(b,c)|0)==(d|0)){break b}b=a+156|0;c=(d>>>0)/(b>>>0)|0;if(b>>>0>c>>>0){break a}if((L(b,c)|0)==(d|0)){break b}b=a+162|0;c=(d>>>0)/(b>>>0)|0;if(b>>>0>c>>>0){break a}if((L(b,c)|0)==(d|0)){break b}b=a+166|0;c=(d>>>0)/(b>>>0)|0;if(b>>>0>c>>>0){break a}if((L(b,c)|0)==(d|0)){break b}b=a+168|0;c=(d>>>0)/(b>>>0)|0;if(b>>>0>c>>>0){break a}if((L(b,c)|0)==(d|0)){break b}b=a+172|0;c=(d>>>0)/(b>>>0)|0;if(b>>>0>c>>>0){break a}if((L(b,c)|0)==(d|0)){break b}b=a+178|0;c=(d>>>0)/(b>>>0)|0;if(b>>>0>c>>>0){break a}if((L(b,c)|0)==(d|0)){break b}b=a+180|0;c=(d>>>0)/(b>>>0)|0;if(b>>>0>c>>>0){break a}if((L(b,c)|0)==(d|0)){break b}b=a+186|0;c=(d>>>0)/(b>>>0)|0;if(b>>>0>c>>>0){break a}if((L(b,c)|0)==(d|0)){break b}b=a+190|0;c=(d>>>0)/(b>>>0)|0;if(b>>>0>c>>>0){break a}if((L(b,c)|0)==(d|0)){break b}b=a+192|0;c=(d>>>0)/(b>>>0)|0;if(b>>>0>c>>>0){break a}if((L(b,c)|0)==(d|0)){break b}b=a+196|0;c=(d>>>0)/(b>>>0)|0;if(b>>>0>c>>>0){break a}if((L(b,c)|0)==(d|0)){break b}b=a+198|0;c=(d>>>0)/(b>>>0)|0;if(b>>>0>c>>>0){break a}if((L(b,c)|0)==(d|0)){break b}b=a+208|0;c=(d>>>0)/(b>>>0)|0;if(b>>>0>c>>>0){break a}a=a+210|0;if((L(b,c)|0)!=(d|0)){continue}break}break b}b=F[(a<<2)+10352>>2];c=(d>>>0)/(b>>>0)|0;if(b>>>0>c>>>0){break a}a=a+1|0;if((L(b,c)|0)!=(d|0)){continue}}break}d=g+1|0;a=(d|0)==48;g=a?0:d;f=a+f|0;d=L(f,210);continue}}Z=e+16|0;return d}function lb(a,b,c,d){var e=0,f=0,g=0,h=0,i=0,j=M(0),k=0,l=0;a:{if(!d){break a}b:{c:{switch(F[a+28>>2]-1|0){case 0:e=G[a+24|0];f=c&255;if(e>>>0<f>>>0?e:f){e=F[a>>2];g=F[e>>2];i=F[a+48>>2];b=ki(F[a+40>>2],F[a+44>>2],b,0);k=b;b=b+i|0;b=b+g|0;g=F[e+4>>2];i=G[a+32|0];while(1){if(b>>>0>=g>>>0){break a}j=M(D[b|0]);J[(h<<2)+d>>2]=i?M(j/M(127)):j;b=b+1|0;h=h+1|0;e=G[a+24|0];if(h>>>0<(e>>>0<f>>>0?e:f)>>>0){continue}break}}l=1;if(e>>>0>=f>>>0){break a}d=(e<<2)+d|0;a=(c&255)-e|0;break b;case 1:e=G[a+24|0];f=c&255;if(e>>>0<f>>>0?e:f){e=F[a>>2];g=F[e>>2];i=F[a+48>>2];b=ki(F[a+40>>2],F[a+44>>2],b,0);k=b;b=b+i|0;b=b+g|0;g=F[e+4>>2];i=G[a+32|0];while(1){if(b>>>0>=g>>>0){break a}j=M(G[b|0]);J[(h<<2)+d>>2]=i?M(j/M(255)):j;b=b+1|0;h=h+1|0;e=G[a+24|0];if(h>>>0<(e>>>0<f>>>0?e:f)>>>0){continue}break}}l=1;if(e>>>0>=f>>>0){break a}d=(e<<2)+d|0;a=(c&255)-e|0;break b;case 2:e=G[a+24|0];f=c&255;if(e>>>0<f>>>0?e:f){e=F[a>>2];g=F[e>>2];i=F[a+48>>2];b=ki(F[a+40>>2],F[a+44>>2],b,0);k=b;b=b+i|0;b=b+g|0;g=F[e+4>>2];i=G[a+32|0];while(1){if(b>>>0>=g>>>0){break a}j=M(E[b>>1]);J[(h<<2)+d>>2]=i?M(j/M(32767)):j;b=b+2|0;h=h+1|0;e=G[a+24|0];if(h>>>0<(e>>>0<f>>>0?e:f)>>>0){continue}break}}l=1;if(e>>>0>=f>>>0){break a}d=(e<<2)+d|0;a=(c&255)-e|0;break b;case 3:e=G[a+24|0];f=c&255;if(e>>>0<f>>>0?e:f){e=F[a>>2];g=F[e>>2];i=F[a+48>>2];b=ki(F[a+40>>2],F[a+44>>2],b,0);k=b;b=b+i|0;b=b+g|0;g=F[e+4>>2];i=G[a+32|0];while(1){if(b>>>0>=g>>>0){break a}j=M(H[b>>1]);J[(h<<2)+d>>2]=i?M(j/M(65535)):j;b=b+2|0;h=h+1|0;e=G[a+24|0];if(h>>>0<(e>>>0<f>>>0?e:f)>>>0){continue}break}}l=1;if(e>>>0>=f>>>0){break a}d=(e<<2)+d|0;a=(c&255)-e|0;break b;case 4:e=G[a+24|0];f=c&255;if(e>>>0<f>>>0?e:f){e=F[a>>2];g=F[e>>2];i=F[a+48>>2];b=ki(F[a+40>>2],F[a+44>>2],b,0);k=b;b=b+i|0;b=b+g|0;g=F[e+4>>2];i=G[a+32|0];while(1){if(b>>>0>=g>>>0){break a}j=M(F[b>>2]);J[(h<<2)+d>>2]=i?M(j*M(4.656612873077393e-10)):j;b=b+4|0;h=h+1|0;e=G[a+24|0];if(h>>>0<(e>>>0<f>>>0?e:f)>>>0){continue}break}}l=1;if(e>>>0>=f>>>0){break a}d=(e<<2)+d|0;a=(c&255)-e|0;break b;case 5:e=G[a+24|0];f=c&255;if(e>>>0<f>>>0?e:f){e=F[a>>2];g=F[e>>2];i=F[a+48>>2];b=ki(F[a+40>>2],F[a+44>>2],b,0);k=b;b=b+i|0;b=b+g|0;g=F[e+4>>2];i=G[a+32|0];while(1){if(b>>>0>=g>>>0){break a}j=M(I[b>>2]);J[(h<<2)+d>>2]=i?M(j*M(2.3283064365386963e-10)):j;b=b+4|0;h=h+1|0;e=G[a+24|0];if(h>>>0<(e>>>0<f>>>0?e:f)>>>0){continue}break}}l=1;if(e>>>0>=f>>>0){break a}d=(e<<2)+d|0;a=(c&255)-e|0;break b;case 6:e=G[a+24|0];f=c&255;if(e>>>0<f>>>0?e:f){e=F[a>>2];g=F[e>>2];i=F[a+48>>2];b=ki(F[a+40>>2],F[a+44>>2],b,0);k=b;b=b+i|0;b=b+g|0;g=F[e+4>>2];i=G[a+32|0];while(1){if(b>>>0>=g>>>0){break a}j=M(+I[b>>2]+ +F[b+4>>2]*4294967296);J[(h<<2)+d>>2]=i?M(j*M(10842021724855044e-35)):j;b=b+8|0;h=h+1|0;e=G[a+24|0];if(h>>>0<(e>>>0<f>>>0?e:f)>>>0){continue}break}}l=1;if(e>>>0>=f>>>0){break a}d=(e<<2)+d|0;a=(c&255)-e|0;break b;case 7:e=G[a+24|0];f=c&255;if(e>>>0<f>>>0?e:f){e=F[a>>2];g=F[e>>2];i=F[a+48>>2];b=ki(F[a+40>>2],F[a+44>>2],b,0);k=b;b=b+i|0;b=b+g|0;g=F[e+4>>2];i=G[a+32|0];while(1){if(b>>>0>=g>>>0){break a}j=M(+I[b>>2]+ +I[b+4>>2]*4294967296);J[(h<<2)+d>>2]=i?M(j*M(5.421010862427522e-20)):j;b=b+8|0;h=h+1|0;e=G[a+24|0];if(h>>>0<(e>>>0<f>>>0?e:f)>>>0){continue}break}}l=1;if(e>>>0>=f>>>0){break a}d=(e<<2)+d|0;a=(c&255)-e|0;break b;case 8:e=G[a+24|0];f=c&255;if(e>>>0<f>>>0?e:f){e=F[a>>2];g=F[e>>2];i=F[a+48>>2];b=ki(F[a+40>>2],F[a+44>>2],b,0);k=b;b=b+i|0;b=b+g|0;g=F[e+4>>2];while(1){if(b>>>0>=g>>>0){break a}J[(h<<2)+d>>2]=J[b>>2];b=b+4|0;h=h+1|0;e=G[a+24|0];if(h>>>0<(e>>>0<f>>>0?e:f)>>>0){continue}break}}l=1;if(e>>>0>=f>>>0){break a}d=(e<<2)+d|0;a=(c&255)-e|0;break b;case 9:e=G[a+24|0];f=c&255;if(e>>>0<f>>>0?e:f){e=F[a>>2];g=F[e>>2];i=F[a+48>>2];b=ki(F[a+40>>2],F[a+44>>2],b,0);k=b;b=b+i|0;b=b+g|0;g=F[e+4>>2];while(1){if(b>>>0>=g>>>0){break a}J[(h<<2)+d>>2]=K[b>>3];b=b+8|0;h=h+1|0;e=G[a+24|0];if(h>>>0<(e>>>0<f>>>0?e:f)>>>0){continue}break}}l=1;if(e>>>0>=f>>>0){break a}d=(e<<2)+d|0;a=(c&255)-e|0;break b;case 10:break c;default:break a}}e=G[a+24|0];f=c&255;if(e>>>0<f>>>0?e:f){e=F[a>>2];g=F[e>>2];i=F[a+48>>2];b=ki(F[a+40>>2],F[a+44>>2],b,0);k=b;b=b+i|0;b=b+g|0;g=F[e+4>>2];while(1){if(b>>>0>=g>>>0){break a}J[(h<<2)+d>>2]=G[b|0]?M(1):M(0);b=b+1|0;h=h+1|0;e=G[a+24|0];if(h>>>0<(e>>>0<f>>>0?e:f)>>>0){continue}break}}l=1;if(e>>>0>=f>>>0){break a}d=(e<<2)+d|0;a=(c&255)-e|0}ma(d,0,a<<2)}return l}function Cb(a,b,c,d){var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=M(0),m=M(0);a:{b:{if(!d){break b}c:{switch(F[a+28>>2]-1|0){case 0:e=G[a+24|0];f=c&255;if(e>>>0<f>>>0?e:f){e=F[F[a>>2]>>2];i=F[a+48>>2];b=ki(F[a+40>>2],F[a+44>>2],b,0);h=b;b=b+i|0;b=b+e|0;while(1){if(I[F[a>>2]+4>>2]<=b>>>0){break b}D[d+g|0]=G[b|0];b=b+1|0;g=g+1|0;e=G[a+24|0];if(g>>>0<(e>>>0<f>>>0?e:f)>>>0){continue}break}}k=1;if(e>>>0>=f>>>0){break b}break a;case 1:e=G[a+24|0];f=c&255;if(e>>>0<f>>>0?e:f){e=F[F[a>>2]>>2];i=F[a+48>>2];b=ki(F[a+40>>2],F[a+44>>2],b,0);h=b;b=b+i|0;b=b+e|0;while(1){if(I[F[a>>2]+4>>2]<=b>>>0){return 0}e=D[b|0];if((e|0)<0){break b}D[d+g|0]=e;b=b+1|0;g=g+1|0;e=G[a+24|0];if(g>>>0<(e>>>0<f>>>0?e:f)>>>0){continue}break}}k=1;if(e>>>0>=f>>>0){break b}break a;case 2:e=G[a+24|0];f=c&255;if(e>>>0<f>>>0?e:f){e=F[F[a>>2]>>2];i=F[a+48>>2];b=ki(F[a+40>>2],F[a+44>>2],b,0);h=b;b=b+i|0;b=b+e|0;while(1){if(I[F[a>>2]+4>>2]<=b>>>0){break b}e=H[b>>1];if((e+128&65535)>>>0>255){break b}D[d+g|0]=e;b=b+2|0;g=g+1|0;e=G[a+24|0];if(g>>>0<(e>>>0<f>>>0?e:f)>>>0){continue}break}}k=1;if(e>>>0>=f>>>0){break b}break a;case 3:e=G[a+24|0];f=c&255;if(e>>>0<f>>>0?e:f){e=F[F[a>>2]>>2];i=F[a+48>>2];b=ki(F[a+40>>2],F[a+44>>2],b,0);h=b;b=b+i|0;b=b+e|0;while(1){if(I[F[a>>2]+4>>2]<=b>>>0){break b}e=H[b>>1];if(e>>>0>127){break b}D[d+g|0]=e;b=b+2|0;g=g+1|0;e=G[a+24|0];if(g>>>0<(e>>>0<f>>>0?e:f)>>>0){continue}break}}k=1;if(e>>>0>=f>>>0){break b}break a;case 4:e=G[a+24|0];f=c&255;if(e>>>0<f>>>0?e:f){e=F[F[a>>2]>>2];i=F[a+48>>2];b=ki(F[a+40>>2],F[a+44>>2],b,0);h=b;b=b+i|0;b=b+e|0;while(1){if(I[F[a>>2]+4>>2]<=b>>>0){break b}e=F[b>>2];if(e+128>>>0>255){break b}D[d+g|0]=e;b=b+4|0;g=g+1|0;e=G[a+24|0];if(g>>>0<(e>>>0<f>>>0?e:f)>>>0){continue}break}}k=1;if(e>>>0>=f>>>0){break b}break a;case 5:e=G[a+24|0];f=c&255;if(e>>>0<f>>>0?e:f){e=F[F[a>>2]>>2];i=F[a+48>>2];b=ki(F[a+40>>2],F[a+44>>2],b,0);h=b;b=b+i|0;b=b+e|0;while(1){if(I[F[a>>2]+4>>2]<=b>>>0){break b}e=F[b>>2];if(e>>>0>127){break b}D[d+g|0]=e;b=b+4|0;g=g+1|0;e=G[a+24|0];if(g>>>0<(e>>>0<f>>>0?e:f)>>>0){continue}break}}k=1;if(e>>>0>=f>>>0){break b}break a;case 6:e=G[a+24|0];f=c&255;if(e>>>0<f>>>0?e:f){e=F[F[a>>2]>>2];i=F[a+48>>2];b=ki(F[a+40>>2],F[a+44>>2],b,0);h=b;b=b+i|0;b=b+e|0;while(1){if(I[F[a>>2]+4>>2]<=b>>>0){break b}i=F[b+4>>2];e=F[b>>2];h=e+128|0;i=h>>>0<128?i+1|0:i;if(!i&h>>>0>255|i){break b}D[d+g|0]=e;b=b+8|0;g=g+1|0;e=G[a+24|0];if(g>>>0<(e>>>0<f>>>0?e:f)>>>0){continue}break}}k=1;if(e>>>0>=f>>>0){break b}break a;case 7:e=G[a+24|0];f=c&255;if(e>>>0<f>>>0?e:f){e=F[F[a>>2]>>2];i=F[a+48>>2];b=ki(F[a+40>>2],F[a+44>>2],b,0);h=b;b=b+i|0;b=b+e|0;while(1){if(I[F[a>>2]+4>>2]<=b>>>0){break b}i=F[b+4>>2];e=F[b>>2];if(!i&e>>>0>127|i){break b}D[d+g|0]=e;b=b+8|0;g=g+1|0;e=G[a+24|0];if(g>>>0<(e>>>0<f>>>0?e:f)>>>0){continue}break}}k=1;if(e>>>0>=f>>>0){break b}break a;case 8:e=G[a+24|0];c=c&255;d:{if(c>>>0>e>>>0?e:c){e=F[F[a>>2]>>2];f=F[a+48>>2];b=ki(F[a+40>>2],F[a+44>>2],b,0);h=b;b=b+f|0;b=b+e|0;while(1){if(I[F[a>>2]+4>>2]<=b>>>0){break d}l=J[b>>2];if(l>=M(127)|l<M(-128)|l!=l){break d}m=M(N(l));if(m==M(Infinity)){break d}e=d+g|0;e:{f:{if(G[a+32|0]){if(l<M(0)|l>M(1)){break d}j=R(+l*127+.5);if(!(N(j)<2147483648)){break f}h=~~j;break e}if(!(m<M(2147483648))){break f}h=~~l;break e}h=-2147483648}D[e|0]=h;b=b+4|0;g=g+1|0;e=G[a+24|0];if(g>>>0<(c>>>0>e>>>0?e:c)>>>0){continue}break}}k=1;if(c>>>0<=e>>>0){break d}ma(d+e|0,0,c-e|0)}return k;case 9:e=G[a+24|0];f=c&255;if(e>>>0<f>>>0?e:f){e=F[F[a>>2]>>2];i=F[a+48>>2];b=ki(F[a+40>>2],F[a+44>>2],b,0);h=b;b=b+i|0;b=b+e|0;while(1){if(I[F[a>>2]+4>>2]<=b>>>0){break b}j=K[b>>3];if(j>=127|j<-128|(N(j)==Infinity|j!=j)){break b}e=d+g|0;if(G[a+32|0]){if(j<0|j>1){break b}j=R(j*127+.5)}g:{if(N(j)<2147483648){h=~~j;break g}h=-2147483648}D[e|0]=h;b=b+8|0;g=g+1|0;e=G[a+24|0];if(g>>>0<(e>>>0<f>>>0?e:f)>>>0){continue}break}}k=1;if(e>>>0>=f>>>0){break b}break a;case 10:break c;default:break b}}e=G[a+24|0];f=c&255;if(e>>>0<f>>>0?e:f){e=F[F[a>>2]>>2];i=F[a+48>>2];b=ki(F[a+40>>2],F[a+44>>2],b,0);h=b;b=b+i|0;b=b+e|0;while(1){if(I[F[a>>2]+4>>2]<=b>>>0){break b}D[d+g|0]=G[b|0];b=b+1|0;g=g+1|0;e=G[a+24|0];if(g>>>0<(e>>>0<f>>>0?e:f)>>>0){continue}break}}k=1;if(e>>>0>=f>>>0){break b}ma(d+e|0,0,(c&255)-e|0)}return k}ma(d+e|0,0,(c&255)-e|0);return 1}function Bb(a,b,c,d){var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=M(0);a:{b:{if(!d){break b}c:{switch(F[a+28>>2]-1|0){case 0:e=G[a+24|0];f=c&255;if(e>>>0<f>>>0?e:f){e=F[F[a>>2]>>2];i=F[a+48>>2];b=ki(F[a+40>>2],F[a+44>>2],b,0);h=b;b=b+i|0;b=b+e|0;while(1){if(I[F[a>>2]+4>>2]<=b>>>0){return 0}e=D[b|0];if((e|0)<0){break b}D[d+g|0]=e;b=b+1|0;g=g+1|0;e=G[a+24|0];if(g>>>0<(e>>>0<f>>>0?e:f)>>>0){continue}break}}k=1;if(e>>>0>=f>>>0){break b}break a;case 1:e=G[a+24|0];f=c&255;if(e>>>0<f>>>0?e:f){e=F[F[a>>2]>>2];i=F[a+48>>2];b=ki(F[a+40>>2],F[a+44>>2],b,0);h=b;b=b+i|0;b=b+e|0;while(1){if(I[F[a>>2]+4>>2]<=b>>>0){break b}D[d+g|0]=G[b|0];b=b+1|0;g=g+1|0;e=G[a+24|0];if(g>>>0<(e>>>0<f>>>0?e:f)>>>0){continue}break}}k=1;if(e>>>0>=f>>>0){break b}break a;case 2:e=G[a+24|0];f=c&255;if(e>>>0<f>>>0?e:f){e=F[F[a>>2]>>2];i=F[a+48>>2];b=ki(F[a+40>>2],F[a+44>>2],b,0);h=b;b=b+i|0;b=b+e|0;while(1){if(I[F[a>>2]+4>>2]<=b>>>0){break b}e=H[b>>1];if(e>>>0>255){break b}D[d+g|0]=e;b=b+2|0;g=g+1|0;e=G[a+24|0];if(g>>>0<(e>>>0<f>>>0?e:f)>>>0){continue}break}}k=1;if(e>>>0>=f>>>0){break b}break a;case 3:e=G[a+24|0];f=c&255;if(e>>>0<f>>>0?e:f){e=F[F[a>>2]>>2];i=F[a+48>>2];b=ki(F[a+40>>2],F[a+44>>2],b,0);h=b;b=b+i|0;b=b+e|0;while(1){if(I[F[a>>2]+4>>2]<=b>>>0){break b}e=H[b>>1];if(e>>>0>255){break b}D[d+g|0]=e;b=b+2|0;g=g+1|0;e=G[a+24|0];if(g>>>0<(e>>>0<f>>>0?e:f)>>>0){continue}break}}k=1;if(e>>>0>=f>>>0){break b}break a;case 4:e=G[a+24|0];f=c&255;if(e>>>0<f>>>0?e:f){e=F[F[a>>2]>>2];i=F[a+48>>2];b=ki(F[a+40>>2],F[a+44>>2],b,0);h=b;b=b+i|0;b=b+e|0;while(1){if(I[F[a>>2]+4>>2]<=b>>>0){break b}e=F[b>>2];if(e>>>0>255){break b}D[d+g|0]=e;b=b+4|0;g=g+1|0;e=G[a+24|0];if(g>>>0<(e>>>0<f>>>0?e:f)>>>0){continue}break}}k=1;if(e>>>0>=f>>>0){break b}break a;case 5:e=G[a+24|0];f=c&255;if(e>>>0<f>>>0?e:f){e=F[F[a>>2]>>2];i=F[a+48>>2];b=ki(F[a+40>>2],F[a+44>>2],b,0);h=b;b=b+i|0;b=b+e|0;while(1){if(I[F[a>>2]+4>>2]<=b>>>0){break b}e=F[b>>2];if(e>>>0>255){break b}D[d+g|0]=e;b=b+4|0;g=g+1|0;e=G[a+24|0];if(g>>>0<(e>>>0<f>>>0?e:f)>>>0){continue}break}}k=1;if(e>>>0>=f>>>0){break b}break a;case 6:e=G[a+24|0];f=c&255;if(e>>>0<f>>>0?e:f){e=F[F[a>>2]>>2];i=F[a+48>>2];b=ki(F[a+40>>2],F[a+44>>2],b,0);h=b;b=b+i|0;b=b+e|0;while(1){if(I[F[a>>2]+4>>2]<=b>>>0){break b}i=F[b+4>>2];e=F[b>>2];if(!i&e>>>0>255|i){break b}D[d+g|0]=e;b=b+8|0;g=g+1|0;e=G[a+24|0];if(g>>>0<(e>>>0<f>>>0?e:f)>>>0){continue}break}}k=1;if(e>>>0>=f>>>0){break b}break a;case 7:e=G[a+24|0];f=c&255;if(e>>>0<f>>>0?e:f){e=F[F[a>>2]>>2];i=F[a+48>>2];b=ki(F[a+40>>2],F[a+44>>2],b,0);h=b;b=b+i|0;b=b+e|0;while(1){if(I[F[a>>2]+4>>2]<=b>>>0){break b}i=F[b+4>>2];e=F[b>>2];if(!i&e>>>0>255|i){break b}D[d+g|0]=e;b=b+8|0;g=g+1|0;e=G[a+24|0];if(g>>>0<(e>>>0<f>>>0?e:f)>>>0){continue}break}}k=1;if(e>>>0>=f>>>0){break b}break a;case 8:e=G[a+24|0];c=c&255;d:{if(c>>>0>e>>>0?e:c){e=F[F[a>>2]>>2];f=F[a+48>>2];b=ki(F[a+40>>2],F[a+44>>2],b,0);h=b;b=b+f|0;b=b+e|0;while(1){if(I[F[a>>2]+4>>2]<=b>>>0){break d}l=J[b>>2];if(l>=M(255)|l<M(0)|(M(N(l))==M(Infinity)|l!=l)){break d}e=d+g|0;e:{f:{if(G[a+32|0]){if(l>M(1)){break d}j=R(+l*255+.5);if(!(j<4294967296&j>=0)){break f}h=~~j>>>0;break e}if(!(l<M(4294967296)&l>=M(0))){break f}h=~~l>>>0;break e}h=0}D[e|0]=h;b=b+4|0;g=g+1|0;e=G[a+24|0];if(g>>>0<(c>>>0>e>>>0?e:c)>>>0){continue}break}}k=1;if(c>>>0<=e>>>0){break d}ma(d+e|0,0,c-e|0)}return k;case 9:e=G[a+24|0];f=c&255;if(e>>>0<f>>>0?e:f){e=F[F[a>>2]>>2];i=F[a+48>>2];b=ki(F[a+40>>2],F[a+44>>2],b,0);h=b;b=b+i|0;b=b+e|0;while(1){if(I[F[a>>2]+4>>2]<=b>>>0){break b}j=K[b>>3];if(j>=255|j<0|(N(j)==Infinity|j!=j)){break b}e=d+g|0;if(G[a+32|0]){if(j>1){break b}j=R(j*255+.5)}g:{if(j<4294967296&j>=0){h=~~j>>>0;break g}h=0}D[e|0]=h;b=b+8|0;g=g+1|0;e=G[a+24|0];if(g>>>0<(e>>>0<f>>>0?e:f)>>>0){continue}break}}k=1;if(e>>>0>=f>>>0){break b}break a;case 10:break c;default:break b}}e=G[a+24|0];f=c&255;if(e>>>0<f>>>0?e:f){e=F[F[a>>2]>>2];i=F[a+48>>2];b=ki(F[a+40>>2],F[a+44>>2],b,0);h=b;b=b+i|0;b=b+e|0;while(1){if(I[F[a>>2]+4>>2]<=b>>>0){break b}D[d+g|0]=G[b|0];b=b+1|0;g=g+1|0;e=G[a+24|0];if(g>>>0<(e>>>0<f>>>0?e:f)>>>0){continue}break}}k=1;if(e>>>0>=f>>>0){break b}ma(d+e|0,0,(c&255)-e|0)}return k}ma(d+e|0,0,(c&255)-e|0);return 1}function jc(a,b,c){var d=0,e=0,f=0,g=0,h=0,i=0;e=Z-48|0;Z=e;f=H[5053]|H[5054]<<16;d=H[5051]|H[5052]<<16;E[e+38>>1]=d;E[e+40>>1]=d>>>16;E[e+42>>1]=f;E[e+44>>1]=f>>>16;d=F[2525];F[e+32>>2]=F[2524];F[e+36>>2]=d;d=F[2523];F[e+24>>2]=F[2522];F[e+28>>2]=d;d=F[2521];F[e+16>>2]=F[2520];F[e+20>>2]=d;g=F[b+8>>2];i=F[b+12>>2];h=F[b+20>>2];d=F[b+16>>2];f=d+5|0;h=f>>>0<5?h+1|0:h;a:{b:{if(g>>>0<f>>>0&(h|0)>=(i|0)|(h|0)>(i|0)){d=ya(e+16|0);if(d>>>0>=2147483632){break a}c:{d:{if(d>>>0>=11){b=(d|15)+1|0;c=ka(b);F[e+8>>2]=b|-2147483648;F[e>>2]=c;F[e+4>>2]=d;b=c+d|0;break d}D[e+11|0]=d;b=d+e|0;c=e;if(!d){break c}}la(c,e+16|0,d)}D[b|0]=0;F[a>>2]=-2;b=a+4|0;if(D[e+11|0]>=0){a=F[e+4>>2];F[b>>2]=F[e>>2];F[b+4>>2]=a;F[b+8>>2]=F[e+8>>2];break b}ra(b,F[e>>2],F[e+4>>2]);if(D[e+11|0]>=0){break b}ja(F[e>>2]);break b}f=d+F[b>>2]|0;d=G[f|0]|G[f+1|0]<<8|(G[f+2|0]<<16|G[f+3|0]<<24);D[c|0]=d;D[c+1|0]=d>>>8;D[c+2|0]=d>>>16;D[c+3|0]=d>>>24;D[c+4|0]=G[f+4|0];d=F[b+20>>2];f=F[b+16>>2]+5|0;d=f>>>0<5?d+1|0:d;F[b+16>>2]=f;F[b+20>>2]=d;if(sa(c,1250,5)){d=ka(32);D[d+17|0]=0;D[d+16|0]=G[1494];c=G[1490]|G[1491]<<8|(G[1492]<<16|G[1493]<<24);b=G[1486]|G[1487]<<8|(G[1488]<<16|G[1489]<<24);D[d+8|0]=b;D[d+9|0]=b>>>8;D[d+10|0]=b>>>16;D[d+11|0]=b>>>24;D[d+12|0]=c;D[d+13|0]=c>>>8;D[d+14|0]=c>>>16;D[d+15|0]=c>>>24;c=G[1482]|G[1483]<<8|(G[1484]<<16|G[1485]<<24);b=G[1478]|G[1479]<<8|(G[1480]<<16|G[1481]<<24);D[d|0]=b;D[d+1|0]=b>>>8;D[d+2|0]=b>>>16;D[d+3|0]=b>>>24;D[d+4|0]=c;D[d+5|0]=c>>>8;D[d+6|0]=c>>>16;D[d+7|0]=c>>>24;F[a>>2]=-1;ra(a+4|0,d,17);ja(d);break b}g=F[b+12>>2];if((g|0)<=(d|0)&I[b+8>>2]<=f>>>0|(d|0)>(g|0)){d=ya(e+16|0);if(d>>>0>=2147483632){break a}e:{f:{if(d>>>0>=11){b=(d|15)+1|0;c=ka(b);F[e+8>>2]=b|-2147483648;F[e>>2]=c;F[e+4>>2]=d;b=c+d|0;break f}D[e+11|0]=d;b=d+e|0;c=e;if(!d){break e}}la(c,e+16|0,d)}D[b|0]=0;F[a>>2]=-2;b=a+4|0;if(D[e+11|0]>=0){a=F[e+4>>2];F[b>>2]=F[e>>2];F[b+4>>2]=a;F[b+8>>2]=F[e+8>>2];break b}ra(b,F[e>>2],F[e+4>>2]);if(D[e+11|0]>=0){break b}ja(F[e>>2]);break b}D[c+5|0]=G[f+F[b>>2]|0];g=F[b+20>>2];d=F[b+16>>2]+1|0;g=d?g:g+1|0;F[b+16>>2]=d;F[b+20>>2]=g;f=F[b+12>>2];if((f|0)<=(g|0)&I[b+8>>2]<=d>>>0|(g|0)>(f|0)){d=ya(e+16|0);if(d>>>0>=2147483632){break a}g:{h:{if(d>>>0>=11){b=(d|15)+1|0;c=ka(b);F[e+8>>2]=b|-2147483648;F[e>>2]=c;F[e+4>>2]=d;b=c+d|0;break h}D[e+11|0]=d;b=d+e|0;c=e;if(!d){break g}}la(c,e+16|0,d)}D[b|0]=0;F[a>>2]=-2;b=a+4|0;if(D[e+11|0]>=0){a=F[e+4>>2];F[b>>2]=F[e>>2];F[b+4>>2]=a;F[b+8>>2]=F[e+8>>2];break b}ra(b,F[e>>2],F[e+4>>2]);if(D[e+11|0]>=0){break b}ja(F[e>>2]);break b}D[c+6|0]=G[d+F[b>>2]|0];h=F[b+20>>2];d=F[b+16>>2]+1|0;h=d?h:h+1|0;F[b+16>>2]=d;F[b+20>>2]=h;f=F[b+12>>2];if((f|0)<=(h|0)&I[b+8>>2]<=d>>>0|(f|0)<(h|0)){d=ya(e+16|0);if(d>>>0>=2147483632){break a}i:{j:{if(d>>>0>=11){b=(d|15)+1|0;c=ka(b);F[e+8>>2]=b|-2147483648;F[e>>2]=c;F[e+4>>2]=d;b=c+d|0;break j}D[e+11|0]=d;b=d+e|0;c=e;if(!d){break i}}la(c,e+16|0,d)}D[b|0]=0;F[a>>2]=-2;b=a+4|0;if(D[e+11|0]>=0){a=F[e+4>>2];F[b>>2]=F[e>>2];F[b+4>>2]=a;F[b+8>>2]=F[e+8>>2];break b}ra(b,F[e>>2],F[e+4>>2]);if(D[e+11|0]>=0){break b}ja(F[e>>2]);break b}D[c+7|0]=G[d+F[b>>2]|0];g=F[b+20>>2];d=F[b+16>>2]+1|0;g=d?g:g+1|0;F[b+16>>2]=d;F[b+20>>2]=g;f=F[b+12>>2];if((f|0)<=(g|0)&I[b+8>>2]<=d>>>0|(g|0)>(f|0)){c=Eb(e,e+16|0);F[a>>2]=-2;b=a+4|0;if(D[c+11|0]>=0){a=F[c+4>>2];F[b>>2]=F[c>>2];F[b+4>>2]=a;F[b+8>>2]=F[c+8>>2];break b}ra(b,F[c>>2],F[c+4>>2]);if(D[c+11|0]>=0){break b}ja(F[c>>2]);break b}D[c+8|0]=G[d+F[b>>2]|0];d=F[b+20>>2];g=F[b+16>>2];f=g+1|0;i=f?d:d+1|0;F[b+16>>2]=f;F[b+20>>2]=i;i=F[b+8>>2];h=F[b+12>>2];g=g+3|0;d=g>>>0<3?d+1|0:d;if(g>>>0>i>>>0&(d|0)>=(h|0)|(d|0)>(h|0)){c=Eb(e,e+16|0);F[a>>2]=-2;b=a+4|0;if(D[c+11|0]>=0){a=F[c+4>>2];F[b>>2]=F[c>>2];F[b+4>>2]=a;F[b+8>>2]=F[c+8>>2];break b}ra(b,F[c>>2],F[c+4>>2]);if(D[c+11|0]>=0){break b}ja(F[c>>2]);break b}d=c;c=F[b>>2]+f|0;E[d+10>>1]=G[c|0]|G[c+1|0]<<8;g=F[b+20>>2];c=F[b+16>>2]+2|0;g=c>>>0<2?g+1|0:g;F[b+16>>2]=c;F[b+20>>2]=g;F[a+8>>2]=0;F[a+12>>2]=0;F[a>>2]=0;F[a+4>>2]=0}Z=e+48|0;return}za();v()}function Mb(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0;e=Z-96|0;Z=e;f=F[a+16>>2];D[e+92|0]=1;F[e+88>>2]=b;F[e+84>>2]=b;F[e+80>>2]=f;j=F[a+20>>2];d=F[j>>2];a:{b:{f=F[F[f+28>>2]+(b<<2)>>2];if(f>>>0<F[j+4>>2]-d>>2>>>0){d=F[F[a+8>>2]+(F[d+(f<<2)>>2]<<2)>>2];f=F[a+4>>2];if(!G[f+84|0]){d=F[F[f+68>>2]+(d<<2)>>2]}F[e+72>>2]=0;F[e+76>>2]=0;j=e- -64|0;F[j>>2]=0;F[j+4>>2]=0;F[e+56>>2]=0;F[e+60>>2]=0;Ga(f,d,D[f+24|0],e+56|0);if((b|0)!=-1){f=b+1|0;j=(f>>>0)%3|0?f:b-2|0;m=((b>>>0)%3|0?-1:2)+b|0;while(1){d=j;f=m;c:{if(!F[a+28>>2]){break c}f=b+1|0;d=(f>>>0)%3|0?f:b-2|0;f=b-1|0;if((b>>>0)%3|0){break c}f=b+2|0}n=F[a+20>>2];b=F[n>>2];d=F[F[F[a+16>>2]+28>>2]+(d<<2)>>2];if(d>>>0>=F[n+4>>2]-b>>2>>>0){break b}d=F[F[a+8>>2]+(F[b+(d<<2)>>2]<<2)>>2];b=F[a+4>>2];if(!G[b+84|0]){d=F[F[b+68>>2]+(d<<2)>>2]}F[e+48>>2]=0;F[e+52>>2]=0;F[e+40>>2]=0;F[e+44>>2]=0;F[e+32>>2]=0;F[e+36>>2]=0;Ga(b,d,D[b+24|0],e+32|0);d=F[a+20>>2];b=F[d>>2];f=F[F[F[a+16>>2]+28>>2]+(f<<2)>>2];if(f>>>0>=F[d+4>>2]-b>>2>>>0){break a}d=F[F[a+8>>2]+(F[b+(f<<2)>>2]<<2)>>2];b=F[a+4>>2];if(!G[b+84|0]){d=F[F[b+68>>2]+(d<<2)>>2]}F[e+24>>2]=0;F[e+28>>2]=0;F[e+16>>2]=0;F[e+20>>2]=0;F[e+8>>2]=0;F[e+12>>2]=0;Ga(b,d,D[b+24|0],e+8|0);g=F[e+8>>2];b=F[e+56>>2];d=g-b|0;p=F[e+60>>2];t=F[e+12>>2]-(p+(b>>>0>g>>>0)|0)|0;h=F[e+40>>2];f=F[e+64>>2];n=h-f|0;u=F[e+68>>2];y=F[e+44>>2]-(u+(f>>>0>h>>>0)|0)|0;g=ki(d,t,n,y);w=o-g|0;x=i-(_+(g>>>0>o>>>0)|0)|0;i=w;h=F[e+16>>2];g=h-f|0;u=F[e+20>>2]-((f>>>0>h>>>0)+u|0)|0;k=F[e+32>>2];h=k-b|0;w=F[e+36>>2]-((b>>>0>k>>>0)+p|0)|0;b=ki(g,u,h,w);o=i+b|0;i=_+x|0;i=b>>>0>o>>>0?i+1|0:i;b=l;l=d;p=t;k=F[e+48>>2];f=F[e+72>>2];d=k-f|0;t=F[e+76>>2];x=F[e+52>>2]-(t+(f>>>0>k>>>0)|0)|0;l=ki(l,p,d,x);k=b+l|0;b=_+q|0;b=k>>>0<l>>>0?b+1|0:b;l=F[e+24>>2];p=l-f|0;f=F[e+28>>2]-((f>>>0>l>>>0)+t|0)|0;q=ki(p,f,h,w);l=k-q|0;q=b-(_+(k>>>0<q>>>0)|0)|0;b=ki(g,u,d,x);d=r-b|0;b=s-(_+(b>>>0>r>>>0)|0)|0;s=ki(p,f,n,y);r=s+d|0;b=_+b|0;s=r>>>0<s>>>0?b+1|0:b;b=F[e+88>>2];f=F[e+80>>2];d:{if(G[e+92|0]){e:{f:{g:{h:{if((b|0)==-1){break h}d=b+1|0;b=(d>>>0)%3|0?d:b-2|0;if((b|0)==-1|F[F[f>>2]+(b>>>3&536870908)>>2]>>>b&1){break h}b=F[F[F[f+64>>2]+12>>2]+(b<<2)>>2];if((b|0)!=-1){break g}}F[e+88>>2]=-1;break f}d=b+1|0;b=(d>>>0)%3|0?d:b-2|0;F[e+88>>2]=b;if((b|0)!=-1){break e}}b=F[e+84>>2];d=-1;i:{if((b|0)==-1){break i}j:{if((b>>>0)%3|0){b=b-1|0;break j}b=b+2|0;d=-1;if((b|0)==-1){break i}}d=-1;if(F[F[f>>2]+(b>>>3&536870908)>>2]>>>b&1){break i}b=F[F[F[f+64>>2]+12>>2]+(b<<2)>>2];d=-1;if((b|0)==-1){break i}d=b-1|0;if((b>>>0)%3|0){break i}d=b+2|0}D[e+92|0]=0;F[e+88>>2]=d;break d}if((b|0)!=F[e+84>>2]){break d}F[e+88>>2]=-1;break d}d=-1;k:{if((b|0)==-1){break k}l:{if((b>>>0)%3|0){b=b-1|0;break l}b=b+2|0;d=-1;if((b|0)==-1){break k}}d=-1;if(F[F[f>>2]+(b>>>3&536870908)>>2]>>>b&1){break k}b=F[F[F[f+64>>2]+12>>2]+(b<<2)>>2];d=-1;if((b|0)==-1){break k}d=b-1|0;if((b>>>0)%3|0){break k}d=b+2|0}F[e+88>>2]=d}b=F[e+88>>2];if((b|0)!=-1){continue}break}}b=s>>31;f=b^r;d=f-b|0;b=(b^s)-((b>>>0>f>>>0)+b|0)|0;m=-1;f=2147483647;g=q>>31;h=g^l;j=h-g|0;n=(g^q)-((h>>>0<g>>>0)+g|0)|0;h=n;k=j^-1;g=h^2147483647;n=i;m:{n:{if(!F[a+28>>2]){if((b|0)==(g|0)&d>>>0>k>>>0|b>>>0>g>>>0){break m}b=b+h|0;a=d+j|0;b=a>>>0<j>>>0?b+1|0:b;f=a;g=i;a=g>>31;d=a;m=d^o;a=m-d|0;i=a;d=(d^g)-((d>>>0>m>>>0)+d|0)|0;a=a+f|0;d=d^2147483647;i=(d|0)==(b|0)&(i^-1)>>>0<f>>>0|b>>>0>d>>>0;a=i?-1:a;if(!(i&0)&(a|0)<=536870912|(a|0)<536870912){break m}b=0;a=a>>>29|0;break n}o:{if((b|0)==(g|0)&d>>>0>k>>>0|b>>>0>g>>>0){break o}b=b+h|0;a=d+j|0;b=a>>>0<j>>>0?b+1|0:b;k=i;d=i>>31;h=d^o;i=h-d|0;j=(d^k)-((d>>>0>h>>>0)+d|0)|0;g=j^2147483647;d=a;a=i;if((g|0)==(b|0)&d>>>0>(a^-1)>>>0|b>>>0>g>>>0){break o}b=b+j|0;m=a+d|0;b=m>>>0<a>>>0?b+1|0:b;f=b;if(!b&m>>>0<536870913){break m}}b=f>>>29|0;a=(f&536870911)<<3|m>>>29}o=li(o,n,a,b);l=li(l,q,a,b);r=li(r,s,a,b)}F[c+8>>2]=o;F[c+4>>2]=l;F[c>>2]=r;Z=e+96|0;return}ta();v()}ta();v()}ta();v()}function te(a){a=a|0;var b=0,c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;g=Z-16|0;Z=g;f=1;m=$[F[F[a>>2]+24>>2]](a)|0;a:{if((m|0)<=0){break a}r=a+48|0;f=0;while(1){b:{c:{if(!F[($[F[F[a>>2]+28>>2]](a)|0)+40>>2]){break c}o=l<<2;d=F[o+F[a+36>>2]>>2];c=F[d+8>>2];e=bb(d);if(!e){break c}h=F[($[F[F[a>>2]+28>>2]](a)|0)+40>>2];F[g+12>>2]=F[c+56>>2];d=ka(32);F[g>>2]=d;F[g+4>>2]=24;F[g+8>>2]=-2147483616;c=G[1196]|G[1197]<<8|(G[1198]<<16|G[1199]<<24);b=G[1192]|G[1193]<<8|(G[1194]<<16|G[1195]<<24);D[d+16|0]=b;D[d+17|0]=b>>>8;D[d+18|0]=b>>>16;D[d+19|0]=b>>>24;D[d+20|0]=c;D[d+21|0]=c>>>8;D[d+22|0]=c>>>16;D[d+23|0]=c>>>24;c=G[1188]|G[1189]<<8|(G[1190]<<16|G[1191]<<24);b=G[1184]|G[1185]<<8|(G[1186]<<16|G[1187]<<24);D[d+8|0]=b;D[d+9|0]=b>>>8;D[d+10|0]=b>>>16;D[d+11|0]=b>>>24;D[d+12|0]=c;D[d+13|0]=c>>>8;D[d+14|0]=c>>>16;D[d+15|0]=c>>>24;c=G[1180]|G[1181]<<8|(G[1182]<<16|G[1183]<<24);b=G[1176]|G[1177]<<8|(G[1178]<<16|G[1179]<<24);D[d|0]=b;D[d+1|0]=b>>>8;D[d+2|0]=b>>>16;D[d+3|0]=b>>>24;D[d+4|0]=c;D[d+5|0]=c>>>8;D[d+6|0]=c>>>16;D[d+7|0]=c>>>24;D[d+24|0]=0;c=h+16|0;b=F[c>>2];d:{e:{if(!b){break e}i=F[g+12>>2];d=c;while(1){k=(i|0)>F[b+16>>2];d=k?d:b;b=F[(k?b+4|0:b)>>2];if(b){continue}break}if((c|0)==(d|0)|(i|0)<F[d+16>>2]){break e}b=F[d+24>>2];if(!b){break e}i=d+20|0;d=G[g+11|0];c=d<<24>>24<0;k=c?F[g>>2]:g;d=c?F[g+4>>2]:d;while(1){c=G[b+27|0];j=c<<24>>24<0;c=j?F[b+20>>2]:c;p=c>>>0<d>>>0;f:{g:{h:{i:{j:{k:{n=p?c:d;if(n){j=j?F[b+16>>2]:b+16|0;q=sa(k,j,n);if(q){break k}if(c>>>0<=d>>>0){break j}break f}if(c>>>0<=d>>>0){break i}break f}if((q|0)<0){break f}}c=sa(j,k,n);if(c){break h}}if(p){break g}d=gc(i,g);break d}if((c|0)<0){break g}d=gc(i,g);break d}b=b+4|0}b=F[b>>2];if(b){continue}break}}d=gc(h,g)}if(D[g+11|0]<0){ja(F[g>>2])}if(!d){break c}d=0;c=F[F[o+F[a+36>>2]>>2]+8>>2];if(!F[c+64>>2]){b=ka(32);F[b+16>>2]=0;F[b+20>>2]=0;F[b+8>>2]=0;F[b>>2]=0;F[b+4>>2]=0;F[b+24>>2]=0;F[b+28>>2]=0;f=F[c+64>>2];F[c+64>>2]=b;if(f){b=F[f>>2];if(b){F[f+4>>2]=b;ja(b)}ja(f);b=F[c+64>>2]}F[c>>2]=b;f=F[b+20>>2];F[c+8>>2]=F[b+16>>2];F[c+12>>2]=f;f=F[b+24>>2];b=F[b+28>>2];F[c+48>>2]=0;F[c+52>>2]=0;F[c+40>>2]=0;F[c+44>>2]=0;F[c+16>>2]=f;F[c+20>>2]=b}l:{D[c+24|0]=G[e+24|0];F[c+28>>2]=F[e+28>>2];D[c+32|0]=G[e+32|0];b=F[e+44>>2];F[c+40>>2]=F[e+40>>2];F[c+44>>2]=b;b=F[e+52>>2];F[c+48>>2]=F[e+48>>2];F[c+52>>2]=b;F[c+56>>2]=F[e+56>>2];b=F[e+12>>2];F[c+8>>2]=F[e+8>>2];F[c+12>>2]=b;b=F[e+20>>2];F[c+16>>2]=F[e+16>>2];F[c+20>>2]=b;F[c+60>>2]=F[e+60>>2];f=F[e>>2];m:{if(!f){F[c>>2]=0;b=1;break m}h=F[c>>2];b=0;if(!h){break m}b=F[f>>2];f=F[f+4>>2]-b|0;md(h,b,f,0);b=1}if(!b){break l}D[c+84|0]=G[e+84|0];F[c+80>>2]=F[e+80>>2];if((c|0)!=(e|0)){gb(c+68|0,F[e+68>>2],F[e+72>>2])}n:{h=F[e+88>>2];o:{if(h){f=ka(40);e=F[h>>2];F[f+16>>2]=0;F[f+8>>2]=0;F[f+12>>2]=0;F[f>>2]=e;e=F[h+12>>2];b=F[h+8>>2];if((e|0)!=(b|0)){b=e-b|0;if((b|0)<0){break n}e=ka(b);F[f+12>>2]=e;F[f+8>>2]=e;F[f+16>>2]=b+e;b=F[h+8>>2];i=F[h+12>>2];p:{if((b|0)==(i|0)){break p}k=i+(b^-1)|0;j=i-b&7;if(j){while(1){D[e|0]=G[b|0];e=e+1|0;b=b+1|0;d=d+1|0;if((j|0)!=(d|0)){continue}break}}if(k>>>0<7){break p}while(1){D[e|0]=G[b|0];D[e+1|0]=G[b+1|0];D[e+2|0]=G[b+2|0];D[e+3|0]=G[b+3|0];D[e+4|0]=G[b+4|0];D[e+5|0]=G[b+5|0];D[e+6|0]=G[b+6|0];D[e+7|0]=G[b+7|0];e=e+8|0;b=b+8|0;if((i|0)!=(b|0)){continue}break}}F[f+12>>2]=e}d=F[h+36>>2];F[f+32>>2]=F[h+32>>2];F[f+36>>2]=d;d=F[h+28>>2];F[f+24>>2]=F[h+24>>2];F[f+28>>2]=d;e=F[c+88>>2];F[c+88>>2]=f;if(e){break o}break l}e=F[c+88>>2];F[c+88>>2]=0;if(!e){break l}}d=F[e+8>>2];if(d){F[e+12>>2]=d;ja(d)}ja(e);break l}na();v()}break b}d=F[F[a+36>>2]+(l<<2)>>2];if(!($[F[F[d>>2]+24>>2]](d,r)|0)){break a}}l=l+1|0;f=(m|0)<=(l|0);if((l|0)!=(m|0)){continue}break}}Z=g+16|0;return f|0}function Jg(a){a=a|0;var b=0,c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;f=Z-32|0;Z=f;a:{if(!hb(1,f+28|0,F[a+32>>2])){break a}if(!hb(1,f+24|0,F[a+32>>2])){break a}l=F[f+28>>2];if(l>>>0>1431655765){break a}d=F[a+32>>2];c=d;i=F[c+8>>2];b=F[c+16>>2];h=F[c+12>>2];c=F[c+20>>2];g=li(i-b|0,h-(c+(b>>>0>i>>>0)|0)|0,3,0);if(!_&g>>>0<l>>>0){break a}n=F[f+24>>2];g=ki(l,0,3,0);if(!_&g>>>0<n>>>0|((c|0)>=(h|0)&b>>>0>=i>>>0|(c|0)>(h|0))){break a}i=G[b+F[d>>2]|0];b=b+1|0;c=b?c:c+1|0;F[d+16>>2]=b;F[d+20>>2]=c;b:{c:{if(!i){d=0;c=Z-32|0;Z=c;F[c+24>>2]=0;F[c+16>>2]=0;F[c+20>>2]=0;d:{e:{b=L(l,3);if(b){if(b>>>0>=1073741824){break e}i=L(l,12);d=ka(i);ma(d,0,i)}b=mc(b,1,F[a+32>>2],d);f:{g:{if(!(!l|!b)){i=0;while(1){h:{g=e;b=(i<<2)+d|0;h=F[b>>2];e=h>>>1|0;h=g+(h&1?0-e|0:e)|0;if((h|0)<0){break h}F[c>>2]=h;e=F[b+4>>2];g=e>>>1|0;h=h+(e&1?0-g|0:g)|0;if((h|0)<0){break h}F[c+4>>2]=h;b=F[b+8>>2];e=b>>>1|0;e=h+(b&1?0-e|0:e)|0;if((e|0)<0){break h}F[c+8>>2]=e;mb(F[a+44>>2]+96|0,c);i=i+3|0;b=1;j=j+1|0;if((j|0)!=(l|0)){continue}break g}break}b=0;break g}if(!d){break f}}ja(d)}Z=c+32|0;break d}na();v()}if(b){break c}break a}if(n>>>0<=255){if(!l){break c}while(1){i:{F[f+16>>2]=0;F[f+8>>2]=0;F[f+12>>2]=0;d=F[a+32>>2];b=d;i=F[b+16>>2];e=F[b+8>>2];c=F[b+20>>2];g=F[b+12>>2];b=g;if(e>>>0<=i>>>0&(c|0)>=(b|0)|(b|0)<(c|0)){break i}j=F[d>>2];m=G[j+i|0];b=c;h=i+1|0;b=h?b:b+1|0;F[d+16>>2]=h;F[d+20>>2]=b;F[f+8>>2]=m;m=e>>>0<i>>>0&(c|0)>=(g|0)|(c|0)>(g|0);e=m?i:e;g=m?c:g;if((e|0)==(h|0)&(g|0)==(b|0)){break i}m=G[h+j|0];b=c;h=i+2|0;b=h>>>0<2?b+1|0:b;F[d+16>>2]=h;F[d+20>>2]=b;F[f+12>>2]=m;if((e|0)==(h|0)&(b|0)==(g|0)){break i}h=G[h+j|0];b=c;c=i+3|0;b=c>>>0<3?b+1|0:b;F[d+16>>2]=c;F[d+20>>2]=b;F[f+16>>2]=h;mb(F[a+44>>2]+96|0,f+8|0);k=k+1|0;if((l|0)!=(k|0)){continue}break c}break}k=0;break a}if(n>>>0<=65535){if(!l){break c}while(1){j:{F[f+16>>2]=0;F[f+8>>2]=0;F[f+12>>2]=0;j=F[a+32>>2];b=j;c=F[b+8>>2];d=F[b+12>>2];h=F[b+16>>2];b=F[b+20>>2];i=b;e=h+2|0;b=e>>>0<2?b+1|0:b;if(c>>>0<e>>>0&(b|0)>=(d|0)|(b|0)>(d|0)){break j}m=F[j>>2];g=m+h|0;g=G[g|0]|G[g+1|0]<<8;F[j+16>>2]=e;F[j+20>>2]=b;F[f+8>>2]=g;b=i;g=h+4|0;b=g>>>0<4?b+1|0:b;if(c>>>0<g>>>0&(b|0)>=(d|0)|(b|0)>(d|0)){break j}e=e+m|0;e=G[e|0]|G[e+1|0]<<8;F[j+16>>2]=g;F[j+20>>2]=b;F[f+12>>2]=e;e=c;b=i;c=h+6|0;b=c>>>0<6?b+1|0:b;if(c>>>0>e>>>0&(b|0)>=(d|0)|(b|0)>(d|0)){break j}d=g+m|0;d=G[d|0]|G[d+1|0]<<8;F[j+16>>2]=c;F[j+20>>2]=b;F[f+16>>2]=d;mb(F[a+44>>2]+96|0,f+8|0);k=k+1|0;if((l|0)!=(k|0)){continue}break c}break}k=0;break a}k:{if(n>>>0>2097151){break k}b=H[a+36>>1];if(((b<<8|b>>>8)&65535)>>>0<514){break k}if(!l){break c}while(1){l:{F[f+16>>2]=0;F[f+8>>2]=0;F[f+12>>2]=0;if(!hb(1,f+4|0,F[a+32>>2])){break l}F[f+8>>2]=F[f+4>>2];if(!hb(1,f+4|0,F[a+32>>2])){break l}F[f+12>>2]=F[f+4>>2];if(!hb(1,f+4|0,F[a+32>>2])){break l}F[f+16>>2]=F[f+4>>2];mb(F[a+44>>2]+96|0,f+8|0);k=k+1|0;if((l|0)!=(k|0)){continue}break c}break}k=0;break a}if(!l){break c}while(1){F[f+16>>2]=0;F[f+8>>2]=0;F[f+12>>2]=0;j=F[a+32>>2];b=j;c=F[b+8>>2];d=F[b+12>>2];h=F[b+16>>2];b=F[b+20>>2];i=b;e=h+4|0;b=e>>>0<4?b+1|0:b;if(c>>>0<e>>>0&(b|0)>=(d|0)|(b|0)>(d|0)){break b}m=F[j>>2];g=m+h|0;g=G[g|0]|G[g+1|0]<<8|(G[g+2|0]<<16|G[g+3|0]<<24);F[j+16>>2]=e;F[j+20>>2]=b;F[f+8>>2]=g;b=i;g=h+8|0;b=g>>>0<8?b+1|0:b;if(c>>>0<g>>>0&(b|0)>=(d|0)|(b|0)>(d|0)){break b}e=e+m|0;e=G[e|0]|G[e+1|0]<<8|(G[e+2|0]<<16|G[e+3|0]<<24);F[j+16>>2]=g;F[j+20>>2]=b;F[f+12>>2]=e;e=c;b=i;c=h+12|0;b=c>>>0<12?b+1|0:b;if(c>>>0>e>>>0&(b|0)>=(d|0)|(b|0)>(d|0)){break b}d=g+m|0;d=G[d|0]|G[d+1|0]<<8|(G[d+2|0]<<16|G[d+3|0]<<24);F[j+16>>2]=c;F[j+20>>2]=b;F[f+16>>2]=d;mb(F[a+44>>2]+96|0,f+8|0);k=k+1|0;if((l|0)!=(k|0)){continue}break}}F[F[a+4>>2]+80>>2]=n;k=1;break a}k=0}Z=f+32|0;return k|0}function Ld(a,b,c){var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;g=Z+-64|0;Z=g;F[g+56>>2]=0;F[g+48>>2]=0;F[g+52>>2]=0;F[g+40>>2]=0;F[g+44>>2]=0;F[g+32>>2]=0;F[g+36>>2]=0;F[g+24>>2]=0;F[g+28>>2]=0;F[g+16>>2]=0;F[g+20>>2]=0;F[g+8>>2]=0;F[g+12>>2]=0;h=g+8|0;a:{b:{if(!H[b+38>>1]){break b}if(!Ta(1,h+12|0,b)){break b}e=F[b+8>>2];f=F[b+16>>2];j=e-f|0;k=F[h+12>>2];e=F[b+12>>2]-(F[b+20>>2]+(e>>>0<f>>>0)|0)|0;if(j>>>0<k>>>6>>>0&(e|0)<=0|(e|0)<0){break b}e=F[h>>2];d=F[h+4>>2]-e>>2;c:{if(d>>>0<k>>>0){qa(h,k-d|0);k=F[h+12>>2];break c}if(d>>>0<=k>>>0){break c}F[h+4>>2]=e+(k<<2)}i=1;if(!k){break a}e=F[b+16>>2];d=F[b+20>>2];r=F[h>>2];l=F[b+8>>2];o=F[b+12>>2];j=0;while(1){i=0;if((d|0)>=(o|0)&e>>>0>=l>>>0|(d|0)>(o|0)){break a}i=F[b>>2];p=G[i+e|0];e=e+1|0;d=e?d:d+1|0;F[b+16>>2]=e;F[b+20>>2]=d;f=p>>>2|0;m=0;d:{e:{f:{g:{s=p&3;switch(s|0){case 3:break g;case 0:break e;default:break f}}f=f+j|0;i=0;if(f>>>0>=k>>>0){break a}ma(r+(j<<2)|0,0,(p&252)+4|0);j=f;break d}while(1){if((e|0)==(l|0)&(d|0)==(o|0)){break b}k=G[e+i|0];e=e+1|0;d=e?d:d+1|0;F[b+16>>2]=e;F[b+20>>2]=d;f=k<<(m<<3|6)|f;m=m+1|0;if((s|0)!=(m|0)){continue}break}}F[r+(j<<2)>>2]=f}j=j+1|0;k=F[h+12>>2];if(j>>>0<k>>>0){continue}break}d=h+16|0;o=F[h>>2];f=F[h+16>>2];e=F[h+20>>2]-f|0;h:{if(e>>>0<=4194303){qa(d,1048576-(e>>>2|0)|0);break h}if((e|0)==4194304){break h}F[h+20>>2]=f+4194304}e=h+28|0;j=F[e>>2];f=F[h+32>>2]-j>>3;i:{if(f>>>0<k>>>0){_a(e,k-f|0);j=F[e>>2];break i}if(f>>>0>k>>>0){F[h+32>>2]=(k<<3)+j}if(!k){break b}}l=F[d>>2];d=0;i=0;while(1){e=o+(d<<2)|0;h=F[e>>2];m=(d<<3)+j|0;f=i;F[m+4>>2]=f;F[m>>2]=h;e=F[e>>2];i=e+f|0;if(i>>>0>1048576){break b}j:{if(f>>>0>=i>>>0){break j}m=0;h=e&7;if(h){while(1){F[l+(f<<2)>>2]=d;f=f+1|0;m=m+1|0;if((h|0)!=(m|0)){continue}break}}if(e-1>>>0<=6){break j}while(1){e=l+(f<<2)|0;F[e>>2]=d;F[e+28>>2]=d;F[e+24>>2]=d;F[e+20>>2]=d;F[e+16>>2]=d;F[e+12>>2]=d;F[e+8>>2]=d;F[e+4>>2]=d;f=f+8|0;if((i|0)!=(f|0)){continue}break}}d=d+1|0;if((k|0)!=(d|0)){continue}break}n=(i|0)==1048576}i=n}k:{if(!i|(F[g+20>>2]?0:a)){break k}i=0;j=Z-16|0;Z=j;l:{if(!Sa(1,j+8|0,b)){break l}d=F[b+8>>2];f=F[b+16>>2];l=d-f|0;n=F[j+12>>2];h=F[b+20>>2];d=F[b+12>>2]-(h+(d>>>0<f>>>0)|0)|0;e=F[j+8>>2];if((n|0)==(d|0)&e>>>0>l>>>0|d>>>0<n>>>0){break l}d=h+n|0;l=e+f|0;d=l>>>0<f>>>0?d+1|0:d;F[b+16>>2]=l;F[b+20>>2]=d;if((e|0)<=0){break l}b=f+F[b>>2]|0;F[g+48>>2]=b;d=e-1|0;f=d+b|0;l=G[f|0];m:{if(l>>>0<=63){F[g+52>>2]=d;b=G[f|0]&63;break m}n:{switch((l>>>6|0)-1|0){case 0:if(e>>>0<2){break l}d=e-2|0;F[g+52>>2]=d;b=b+d|0;b=G[b+1|0]<<8&16128|G[b|0];break m;case 1:if(e>>>0<3){break l}d=e-3|0;F[g+52>>2]=d;b=b+d|0;b=G[b+1|0]<<8|G[b+2|0]<<16&4128768|G[b|0];break m;default:break n}}d=e-4|0;F[g+52>>2]=d;b=b+d|0;b=(G[b|0]|G[b+1|0]<<8|(G[b+2|0]<<16|G[b+3|0]<<24))&1073741823}F[g+56>>2]=b+4194304;i=b>>>0<1069547520}Z=j+16|0;if(!i){break k}if(!a){t=1;break k}b=F[g+52>>2];f=F[g+56>>2];d=F[g+36>>2];e=F[g+48>>2];j=F[g+24>>2];while(1){o:{if(f>>>0>4194303){break o}while(1){if((b|0)<=0){break o}b=b-1|0;F[g+52>>2]=b;f=G[b+e|0]|f<<8;F[g+56>>2]=f;if(f>>>0<4194304){continue}break}}i=f&1048575;l=F[j+(i<<2)>>2];n=d+(l<<3)|0;f=(L(F[n>>2],f>>>20|0)+i|0)-F[n+4>>2]|0;F[g+56>>2]=f;F[(q<<2)+c>>2]=l;t=1;q=q+1|0;if((q|0)!=(a|0)){continue}break}}a=F[g+36>>2];if(a){F[g+40>>2]=a;ja(a)}a=F[g+24>>2];if(a){F[g+28>>2]=a;ja(a)}a=F[g+8>>2];if(a){F[g+12>>2]=a;ja(a)}Z=g- -64|0;return t}function kh(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=M(0),f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=M(0),p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0;if(F[c>>2]==F[c+4>>2]){m=F[d+80>>2];u=Z-16|0;Z=u;g=F[a+4>>2];k=G[b+24|0];h=F[d+48>>2];n=F[F[d>>2]>>2];c=u+8|0;F[c>>2]=1065353216;d=c;J[c>>2]=M(-1<<g^-1)/J[a+20>>2];c=ka(k<<2);a:{if(!m|!k){break a}p=h+n|0;o=J[d>>2];n=F[a+8>>2];v=F[b>>2];d=F[b+48>>2];g=F[b+40>>2];w=F[b+44>>2];if(!G[b+84|0]){f=F[b+68>>2];s=k&254;t=k&1;a=0;while(1){b=F[v>>2];l=ki(g,w,F[f+(i<<2)>>2],0)+d|0;h=la(c,b+l|0,g);b=0;q=0;if((k|0)!=1){while(1){l=p+(a<<2)|0;j=b<<2;e=M(R(M(M(o*M(J[j+h>>2]-J[n+j>>2]))+M(.5))));b:{if(M(N(e))<M(2147483648)){r=~~e;break b}r=-2147483648}F[l>>2]=r;j=j|4;e=M(R(M(M(o*M(J[j+h>>2]-J[n+j>>2]))+M(.5))));c:{if(M(N(e))<M(2147483648)){j=~~e;break c}j=-2147483648}F[l+4>>2]=j;b=b+2|0;a=a+2|0;q=q+2|0;if((s|0)!=(q|0)){continue}break}}if(t){l=p+(a<<2)|0;b=b<<2;e=M(R(M(M(o*M(J[b+h>>2]-J[b+n>>2]))+M(.5))));d:{if(M(N(e))<M(2147483648)){b=~~e;break d}b=-2147483648}F[l>>2]=b;a=a+1|0}i=i+1|0;if((m|0)!=(i|0)){continue}break}break a}s=k&254;t=k&1;a=0;while(1){b=F[v>>2];h=ki(g,w,i,l)+d|0;j=la(c,b+h|0,g);b=0;q=0;if((k|0)!=1){while(1){h=p+(a<<2)|0;f=b<<2;e=M(R(M(M(o*M(J[f+j>>2]-J[f+n>>2]))+M(.5))));e:{if(M(N(e))<M(2147483648)){r=~~e;break e}r=-2147483648}F[h>>2]=r;f=f|4;e=M(R(M(M(o*M(J[f+j>>2]-J[f+n>>2]))+M(.5))));f:{if(M(N(e))<M(2147483648)){f=~~e;break f}f=-2147483648}F[h+4>>2]=f;b=b+2|0;a=a+2|0;q=q+2|0;if((s|0)!=(q|0)){continue}break}}if(t){h=p+(a<<2)|0;b=b<<2;e=M(R(M(M(o*M(J[b+j>>2]-J[b+n>>2]))+M(.5))));g:{if(M(N(e))<M(2147483648)){b=~~e;break g}b=-2147483648}F[h>>2]=b;a=a+1|0}b=l;i=i+1|0;b=i?b:b+1|0;l=b;if((i|0)!=(m|0)|b){continue}break}}ja(c);Z=u+16|0;return 1}j=Z-16|0;Z=j;m=F[a+4>>2];i=G[b+24|0];g=F[d+48>>2];h=F[F[d>>2]>>2];d=j+8|0;F[d>>2]=1065353216;l=d;J[d>>2]=M(-1<<m^-1)/J[a+20>>2];d=ka(i<<2);m=F[c+4>>2];q=F[c>>2];h:{if(!i|(m|0)==(q|0)){break h}n=h+g|0;c=m-q>>2;u=c>>>0<=1?1:c;o=J[l>>2];h=F[a+8>>2];v=F[b>>2];l=F[b+48>>2];m=F[b+40>>2];w=F[b+44>>2];if(G[b+84|0]){s=i&254;t=i&1;a=0;c=0;while(1){b=F[v>>2];g=ki(m,w,F[q+(c<<2)>>2],0)+l|0;p=la(d,b+g|0,m);b=0;k=0;if((i|0)!=1){while(1){g=n+(a<<2)|0;f=b<<2;e=M(R(M(M(o*M(J[f+p>>2]-J[h+f>>2]))+M(.5))));i:{if(M(N(e))<M(2147483648)){r=~~e;break i}r=-2147483648}F[g>>2]=r;f=f|4;e=M(R(M(M(o*M(J[f+p>>2]-J[h+f>>2]))+M(.5))));j:{if(M(N(e))<M(2147483648)){f=~~e;break j}f=-2147483648}F[g+4>>2]=f;b=b+2|0;a=a+2|0;k=k+2|0;if((s|0)!=(k|0)){continue}break}}if(t){g=n+(a<<2)|0;b=b<<2;e=M(R(M(M(o*M(J[b+p>>2]-J[b+h>>2]))+M(.5))));k:{if(M(N(e))<M(2147483648)){b=~~e;break k}b=-2147483648}F[g>>2]=b;a=a+1|0}c=c+1|0;if((u|0)!=(c|0)){continue}break}break h}s=F[b+68>>2];t=i&254;x=i&1;a=0;c=0;while(1){b=F[v>>2];g=ki(m,w,F[s+(F[q+(c<<2)>>2]<<2)>>2],0)+l|0;p=la(d,b+g|0,m);b=0;k=0;if((i|0)!=1){while(1){g=n+(a<<2)|0;f=b<<2;e=M(R(M(M(o*M(J[f+p>>2]-J[h+f>>2]))+M(.5))));l:{if(M(N(e))<M(2147483648)){r=~~e;break l}r=-2147483648}F[g>>2]=r;f=f|4;e=M(R(M(M(o*M(J[f+p>>2]-J[h+f>>2]))+M(.5))));m:{if(M(N(e))<M(2147483648)){f=~~e;break m}f=-2147483648}F[g+4>>2]=f;b=b+2|0;a=a+2|0;k=k+2|0;if((t|0)!=(k|0)){continue}break}}if(x){g=n+(a<<2)|0;b=b<<2;e=M(R(M(M(o*M(J[b+p>>2]-J[b+h>>2]))+M(.5))));n:{if(M(N(e))<M(2147483648)){b=~~e;break n}b=-2147483648}F[g>>2]=b;a=a+1|0}c=c+1|0;if((u|0)!=(c|0)){continue}break}}ja(d);Z=j+16|0;return 1}\nfunction Cd(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0;c=F[a+4>>2];e=F[a>>2];f=(c-e|0)/144|0;if(f>>>0<b>>>0){e=a;b=b-f|0;h=F[a+8>>2];c=F[a+4>>2];a:{if(b>>>0<=(h-c|0)/144>>>0){b:{if(!b){break b}a=c;f=b&7;if(f){while(1){va(a);a=a+144|0;d=d+1|0;if((f|0)!=(d|0)){continue}break}}c=L(b,144)+c|0;if((b-1&268435455)>>>0<7){break b}while(1){va(a);va(a+144|0);va(a+288|0);va(a+432|0);va(a+576|0);va(a+720|0);va(a+864|0);va(a+1008|0);a=a+1152|0;if((c|0)!=(a|0)){continue}break}}F[e+4>>2]=c;break a}c:{d:{e:{a=c;c=F[e>>2];i=(a-c|0)/144|0;a=i+b|0;if(a>>>0<29826162){c=(h-c|0)/144|0;f=c<<1;f=c>>>0>=14913080?29826161:a>>>0<f>>>0?f:a;if(f){if(f>>>0>=29826162){break e}g=ka(L(f,144))}c=L(i,144)+g|0;a=c;h=b&7;if(h){while(1){va(a);a=a+144|0;d=d+1|0;if((h|0)!=(d|0)){continue}break}}h=L(b,144)+c|0;if((b-1&268435455)>>>0>=7){while(1){va(a);va(a+144|0);va(a+288|0);va(a+432|0);va(a+576|0);va(a+720|0);va(a+864|0);va(a+1008|0);a=a+1152|0;if((h|0)!=(a|0)){continue}break}}b=L(f,144)+g|0;d=F[e+4>>2];f=F[e>>2];if((d|0)==(f|0)){break d}while(1){c=c-144|0;d=d-144|0;a=d;F[c>>2]=F[a>>2];F[c+4>>2]=F[a+4>>2];F[c+8>>2]=F[a+8>>2];F[c+12>>2]=F[a+12>>2];F[a+12>>2]=0;F[a+4>>2]=0;F[a+8>>2]=0;F[c+16>>2]=F[a+16>>2];F[c+20>>2]=F[a+20>>2];F[c+24>>2]=F[a+24>>2];F[a+24>>2]=0;F[a+16>>2]=0;F[a+20>>2]=0;g=G[a+28|0];F[c+40>>2]=0;F[c+32>>2]=0;F[c+36>>2]=0;D[c+28|0]=g;F[c+32>>2]=F[a+32>>2];F[c+36>>2]=F[a+36>>2];F[c+40>>2]=F[a+40>>2];F[a+40>>2]=0;F[a+32>>2]=0;F[a+36>>2]=0;F[c+52>>2]=0;F[c+44>>2]=0;F[c+48>>2]=0;F[c+44>>2]=F[a+44>>2];F[c+48>>2]=F[a+48>>2];F[c+52>>2]=F[a+52>>2];F[a+52>>2]=0;F[a+44>>2]=0;F[a+48>>2]=0;g=c- -64|0;F[g>>2]=0;F[c+56>>2]=0;F[c+60>>2]=0;F[c+56>>2]=F[a+56>>2];F[c+60>>2]=F[a+60>>2];i=g;g=a- -64|0;F[i>>2]=F[g>>2];F[g>>2]=0;F[a+56>>2]=0;F[a+60>>2]=0;F[c+68>>2]=F[a+68>>2];g=F[a+72>>2];F[c+84>>2]=0;F[c+76>>2]=0;F[c+80>>2]=0;F[c+72>>2]=g;F[c+76>>2]=F[a+76>>2];F[c+80>>2]=F[a+80>>2];F[c+84>>2]=F[a+84>>2];F[a+84>>2]=0;F[a+76>>2]=0;F[a+80>>2]=0;F[c+96>>2]=0;F[c+88>>2]=0;F[c+92>>2]=0;F[c+88>>2]=F[a+88>>2];F[c+92>>2]=F[a+92>>2];F[c+96>>2]=F[a+96>>2];F[a+96>>2]=0;F[a+88>>2]=0;F[a+92>>2]=0;g=G[a+100|0];F[c+112>>2]=0;F[c+104>>2]=0;F[c+108>>2]=0;D[c+100|0]=g;F[c+104>>2]=F[a+104>>2];F[c+108>>2]=F[a+108>>2];F[c+112>>2]=F[a+112>>2];F[a+112>>2]=0;F[a+104>>2]=0;F[a+108>>2]=0;F[c+124>>2]=0;F[c+116>>2]=0;F[c+120>>2]=0;F[c+116>>2]=F[a+116>>2];F[c+120>>2]=F[a+120>>2];F[c+124>>2]=F[a+124>>2];F[a+124>>2]=0;F[a+116>>2]=0;F[a+120>>2]=0;g=F[a+128>>2];F[c+140>>2]=0;F[c+132>>2]=0;F[c+136>>2]=0;F[c+128>>2]=g;F[c+132>>2]=F[a+132>>2];F[c+136>>2]=F[a+136>>2];F[c+140>>2]=F[a+140>>2];F[a+140>>2]=0;F[a+132>>2]=0;F[a+136>>2]=0;if((a|0)!=(f|0)){continue}break}F[e+8>>2]=b;a=F[e+4>>2];F[e+4>>2]=h;d=F[e>>2];F[e>>2]=c;if((a|0)==(d|0)){break c}while(1){b=a-144|0;c=F[b+132>>2];if(c){F[a-8>>2]=c;ja(c)}c=F[a-28>>2];if(c){F[a-24>>2]=c;ja(c)}c=F[a-40>>2];if(c){F[a-36>>2]=c;ja(c)}Gb(a-140|0);a=b;if((d|0)!=(a|0)){continue}break}break c}na();v()}oa();v()}F[e+8>>2]=b;F[e+4>>2]=h;F[e>>2]=c}if(d){ja(d)}}return}if(b>>>0<f>>>0){e=e+L(b,144)|0;if((e|0)!=(c|0)){while(1){b=c-144|0;d=F[b+132>>2];if(d){F[c-8>>2]=d;ja(d)}d=F[c-28>>2];if(d){F[c-24>>2]=d;ja(d)}d=F[c-40>>2];if(d){F[c-36>>2]=d;ja(d)}Gb(c-140|0);c=b;if((e|0)!=(c|0)){continue}break}}F[a+4>>2]=e}}function Yc(a){var b=0,c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;F[a+56>>2]=F[a+52>>2];F[a+44>>2]=F[a+40>>2];b=F[a+64>>2];c=F[b+24>>2];if((c|0)==F[b+28>>2]){return 1}a:{b:{c:{while(1){g=i;i=F[(k<<2)+c>>2];d:{if((i|0)==-1){i=g;break d}b=F[a+56>>2];e:{if((b|0)!=F[a+60>>2]){F[b>>2]=g;F[a+56>>2]=b+4;break e}d=F[a+52>>2];e=b-d|0;h=e>>2;c=h+1|0;if(c>>>0>=1073741824){break c}f=e>>>1|0;f=e>>>0>=2147483644?1073741823:c>>>0<f>>>0?f:c;if(f){if(f>>>0>=1073741824){break b}e=ka(f<<2)}else{e=0}c=e+(h<<2)|0;F[c>>2]=g;h=c+4|0;if((b|0)!=(d|0)){while(1){c=c-4|0;b=b-4|0;F[c>>2]=F[b>>2];if((b|0)!=(d|0)){continue}break}}F[a+60>>2]=e+(f<<2);F[a+56>>2]=h;F[a+52>>2]=c;if(!d){break e}ja(d)}f:{g:{if(!(F[F[a+12>>2]+(k>>>3&536870908)>>2]>>>k&1)){break g}e=i+1|0;e=(e>>>0)%3|0?e:i-2|0;if((e|0)==-1|F[F[a>>2]+(e>>>3&536870908)>>2]>>>e&1){break g}e=F[F[F[a+64>>2]+12>>2]+(e<<2)>>2];if((e|0)==-1){break g}b=e+1|0;b=(b>>>0)%3|0?b:e-2|0;if((b|0)==-1){break g}c=F[a+64>>2];f=F[a>>2];while(1){e=b;b=-1;d=e+1|0;d=(d>>>0)%3|0?d:e-2|0;h:{if((d|0)==-1|F[f+(d>>>3&536870908)>>2]>>>d&1){break h}d=F[F[c+12>>2]+(d<<2)>>2];if((d|0)==-1){break h}b=d+1|0;b=(b>>>0)%3|0?b:d-2|0}if((b|0)!=(i|0)){if((b|0)==-1){break f}continue}break}return 0}e=i}F[F[a+28>>2]+(e<<2)>>2]=g;b=F[a+44>>2];i:{if((b|0)!=F[a+48>>2]){F[b>>2]=e;F[a+44>>2]=b+4;break i}d=F[a+40>>2];i=b-d|0;h=i>>2;c=h+1|0;if(c>>>0>=1073741824){break a}f=i>>>1|0;f=i>>>0>=2147483644?1073741823:c>>>0<f>>>0?f:c;if(f){if(f>>>0>=1073741824){break b}i=ka(f<<2)}else{i=0}c=i+(h<<2)|0;F[c>>2]=e;h=c+4|0;if((b|0)!=(d|0)){while(1){c=c-4|0;b=b-4|0;F[c>>2]=F[b>>2];if((b|0)!=(d|0)){continue}break}}F[a+48>>2]=i+(f<<2);F[a+44>>2]=h;F[a+40>>2]=c;if(!d){break i}ja(d)}i=g+1|0;b=F[a+64>>2];if((e|0)==-1){break d}j:{if((e>>>0)%3|0){c=e-1|0;break j}c=e+2|0;if((c|0)==-1){break d}}d=F[F[b+12>>2]+(c<<2)>>2];if((d|0)==-1){break d}f=d+((d>>>0)%3|0?-1:2)|0;if((f|0)==-1|(e|0)==(f|0)){break d}while(1){b=f+1|0;b=(b>>>0)%3|0?b:f-2|0;if(F[F[a>>2]+(b>>>3&536870908)>>2]>>>b&1){b=F[a+56>>2];k:{if((b|0)!=F[a+60>>2]){F[b>>2]=i;F[a+56>>2]=b+4;break k}d=F[a+52>>2];g=b-d|0;j=g>>2;c=j+1|0;if(c>>>0>=1073741824){break c}h=g>>>1|0;h=g>>>0>=2147483644?1073741823:c>>>0<h>>>0?h:c;if(h){if(h>>>0>=1073741824){break b}g=ka(h<<2)}else{g=0}c=g+(j<<2)|0;F[c>>2]=i;j=c+4|0;if((b|0)!=(d|0)){while(1){c=c-4|0;b=b-4|0;F[c>>2]=F[b>>2];if((b|0)!=(d|0)){continue}break}}F[a+60>>2]=g+(h<<2);F[a+56>>2]=j;F[a+52>>2]=c;if(!d){break k}ja(d)}d=i+1|0;b=F[a+44>>2];l:{if((b|0)!=F[a+48>>2]){F[b>>2]=f;F[a+44>>2]=b+4;break l}h=F[a+40>>2];g=b-h|0;l=g>>2;c=l+1|0;if(c>>>0>=1073741824){break a}j=g>>>1|0;j=g>>>0>=2147483644?1073741823:c>>>0<j>>>0?j:c;if(j){if(j>>>0>=1073741824){break b}g=ka(j<<2)}else{g=0}c=g+(l<<2)|0;F[c>>2]=f;l=c+4|0;if((b|0)!=(h|0)){while(1){c=c-4|0;b=b-4|0;F[c>>2]=F[b>>2];if((b|0)!=(h|0)){continue}break}}F[a+48>>2]=g+(j<<2);F[a+44>>2]=l;F[a+40>>2]=c;if(!h){break l}ja(h)}g=i;i=d}F[F[a+28>>2]+(f<<2)>>2]=g;b=F[a+64>>2];m:{if((f>>>0)%3|0){c=f-1|0;break m}c=f+2|0;if((c|0)==-1){break d}}d=F[F[b+12>>2]+(c<<2)>>2];if((d|0)==-1){break d}f=d+((d>>>0)%3|0?-1:2)|0;if((f|0)==-1){break d}if((e|0)!=(f|0)){continue}break}}k=k+1|0;c=F[b+24>>2];if(k>>>0<F[b+28>>2]-c>>2>>>0){continue}break}return 1}na();v()}oa();v()}na();v()}function Kb(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0;f=Z-96|0;Z=f;e=F[a+16>>2];D[f+92|0]=1;F[f+88>>2]=b;F[f+84>>2]=b;F[f+80>>2]=e;a:{if((b|0)==-1){break a}j=F[a+20>>2];d=F[j>>2];e=F[F[e>>2]+(b<<2)>>2];if(e>>>0>=F[j+4>>2]-d>>2>>>0){break a}e=F[F[a+8>>2]+(F[d+(e<<2)>>2]<<2)>>2];d=F[a+4>>2];if(!G[d+84|0]){e=F[F[d+68>>2]+(e<<2)>>2]}F[f+72>>2]=0;F[f+76>>2]=0;j=f- -64|0;F[j>>2]=0;F[j+4>>2]=0;F[f+56>>2]=0;F[f+60>>2]=0;Ga(d,e,D[d+24|0],f+56|0);e=b+1|0;j=(e>>>0)%3|0?e:b-2|0;n=((b>>>0)%3|0?-1:2)+b|0;b:{c:{while(1){d=j;e=n;d:{if(!F[a+28>>2]){break d}e=b+1|0;d=(e>>>0)%3|0?e:b-2|0;e=b-1|0;if((b>>>0)%3|0){break d}e=b+2|0}if((d|0)==-1){break b}m=F[a+20>>2];b=F[m>>2];d=F[F[F[a+16>>2]>>2]+(d<<2)>>2];if(d>>>0>=F[m+4>>2]-b>>2>>>0){break b}d=F[F[a+8>>2]+(F[(d<<2)+b>>2]<<2)>>2];b=F[a+4>>2];if(!G[b+84|0]){d=F[F[b+68>>2]+(d<<2)>>2]}F[f+48>>2]=0;F[f+52>>2]=0;F[f+40>>2]=0;F[f+44>>2]=0;F[f+32>>2]=0;F[f+36>>2]=0;Ga(b,d,D[b+24|0],f+32|0);if((e|0)==-1){break c}d=F[a+20>>2];b=F[d>>2];e=F[F[F[a+16>>2]>>2]+(e<<2)>>2];if(e>>>0>=F[d+4>>2]-b>>2>>>0){break c}d=F[F[a+8>>2]+(F[b+(e<<2)>>2]<<2)>>2];b=F[a+4>>2];if(!G[b+84|0]){d=F[F[b+68>>2]+(d<<2)>>2]}F[f+24>>2]=0;F[f+28>>2]=0;F[f+16>>2]=0;F[f+20>>2]=0;F[f+8>>2]=0;F[f+12>>2]=0;Ga(b,d,D[b+24|0],f+8|0);g=F[f+8>>2];b=F[f+56>>2];d=g-b|0;p=F[f+60>>2];t=F[f+12>>2]-(p+(b>>>0>g>>>0)|0)|0;i=F[f+40>>2];e=F[f+64>>2];m=i-e|0;u=F[f+68>>2];y=F[f+44>>2]-(u+(e>>>0>i>>>0)|0)|0;g=ki(d,t,m,y);w=o-g|0;x=h-(_+(g>>>0>o>>>0)|0)|0;h=w;i=F[f+16>>2];g=i-e|0;u=F[f+20>>2]-((e>>>0>i>>>0)+u|0)|0;k=F[f+32>>2];i=k-b|0;w=F[f+36>>2]-((b>>>0>k>>>0)+p|0)|0;b=ki(g,u,i,w);o=h+b|0;h=_+x|0;h=b>>>0>o>>>0?h+1|0:h;b=l;l=d;p=t;k=F[f+48>>2];e=F[f+72>>2];d=k-e|0;t=F[f+76>>2];x=F[f+52>>2]-(t+(e>>>0>k>>>0)|0)|0;l=ki(l,p,d,x);k=b+l|0;b=_+q|0;b=k>>>0<l>>>0?b+1|0:b;l=F[f+24>>2];p=l-e|0;e=F[f+28>>2]-((e>>>0>l>>>0)+t|0)|0;q=ki(p,e,i,w);l=k-q|0;q=b-(_+(k>>>0<q>>>0)|0)|0;b=ki(g,u,d,x);d=r-b|0;b=s-(_+(b>>>0>r>>>0)|0)|0;s=ki(p,e,m,y);r=s+d|0;b=_+b|0;s=r>>>0<s>>>0?b+1|0:b;nc(f+80|0);b=F[f+88>>2];if((b|0)!=-1){continue}break}b=s>>31;e=b^r;d=e-b|0;b=(b^s)-((b>>>0>e>>>0)+b|0)|0;n=-1;e=2147483647;m=q>>31;g=m;i=g^l;j=i-g|0;m=(g^q)-((i>>>0<g>>>0)+g|0)|0;i=m;k=j^-1;g=i^2147483647;m=h;e:{f:{if(!F[a+28>>2]){if((b|0)==(g|0)&d>>>0>k>>>0|b>>>0>g>>>0){break e}b=b+i|0;a=d+j|0;b=a>>>0<j>>>0?b+1|0:b;e=a;g=h;a=g>>31;d=a;n=d^o;a=n-d|0;h=a;d=(d^g)-((d>>>0>n>>>0)+d|0)|0;a=a+e|0;d=d^2147483647;h=(d|0)==(b|0)&(h^-1)>>>0<e>>>0|b>>>0>d>>>0;a=h?-1:a;if(!(h&0)&(a|0)<=536870912|(a|0)<536870912){break e}b=0;a=a>>>29|0;break f}g:{if((b|0)==(g|0)&d>>>0>k>>>0|b>>>0>g>>>0){break g}b=b+i|0;a=d+j|0;b=a>>>0<j>>>0?b+1|0:b;k=h;h=h>>31;g=h;i=g^o;h=i-g|0;j=(g^k)-((g>>>0>i>>>0)+g|0)|0;g=j^2147483647;d=a;a=h;if((g|0)==(b|0)&d>>>0>(a^-1)>>>0|b>>>0>g>>>0){break g}b=b+j|0;n=a+d|0;b=n>>>0<a>>>0?b+1|0:b;e=b;if(!b&n>>>0<536870913){break e}}b=e>>>29|0;a=(e&536870911)<<3|n>>>29}o=li(o,m,a,b);l=li(l,q,a,b);r=li(r,s,a,b)}F[c+8>>2]=o;F[c+4>>2]=l;F[c>>2]=r;Z=f+96|0;return}ta();v()}ta();v()}ta();v()}function Nc(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0;a:{if((b|0)<0){break a}c=F[a+12>>2];d=F[a+8>>2];if(c-d>>2>>>0<=b>>>0){break a}d=d+(b<<2)|0;e=F[d>>2];i=F[e+60>>2];f=F[e+56>>2];e=d+4|0;if((e|0)!=(c|0)){while(1){h=F[e>>2];F[e>>2]=0;g=F[d>>2];F[d>>2]=h;if(g){xa(g)}d=d+4|0;e=e+4|0;if((e|0)!=(c|0)){continue}break}c=F[a+12>>2]}if((c|0)!=(d|0)){while(1){c=c-4|0;e=F[c>>2];F[c>>2]=0;if(e){xa(e)}if((c|0)!=(d|0)){continue}break}}F[a+12>>2]=d;g=F[a+4>>2];b:{if(!g|(i|0)<0){break b}c=F[g+24>>2];d=F[g+28>>2];if((c|0)==(d|0)){break b}while(1){if((i|0)==F[F[c>>2]+24>>2]){d=c+4|0;i=F[g+28>>2];if((d|0)!=(i|0)){while(1){h=F[d>>2];F[d>>2]=0;e=F[c>>2];F[c>>2]=h;if(e){Ca(e+12|0,F[e+16>>2]);Ba(e,F[e+4>>2]);ja(e)}c=c+4|0;d=d+4|0;if((i|0)!=(d|0)){continue}break}d=F[g+28>>2]}if((c|0)!=(d|0)){while(1){d=d-4|0;e=F[d>>2];F[d>>2]=0;if(e){Ca(e+12|0,F[e+16>>2]);Ba(e,F[e+4>>2]);ja(e)}if((c|0)!=(d|0)){continue}break}}F[g+28>>2]=c;break b}c=c+4|0;if((d|0)!=(c|0)){continue}break}}c:{if((f|0)>4){break c}d:{e=L(f,12)+a|0;c=F[e+20>>2];d=F[e+24>>2];if((c|0)==(d|0)){break d}while(1){if(F[c>>2]==(b|0)){break d}c=c+4|0;if((d|0)!=(c|0)){continue}break}break c}if((c|0)==(d|0)){break c}f=c;c=c+4|0;pa(f,c,d-c|0);F[e+24>>2]=d-4}c=F[a+24>>2];d=F[a+20>>2];e:{if((c|0)==(d|0)){break e}e=c-d|0;c=e>>2;g=c>>>0<=1?1:c;i=g&1;c=0;if(e>>>0>=8){g=g&-2;e=0;while(1){f=c<<2;h=f+d|0;j=F[h>>2];if((j|0)>(b|0)){F[h>>2]=j-1}f=d+(f|4)|0;h=F[f>>2];if((h|0)>(b|0)){F[f>>2]=h-1}c=c+2|0;e=e+2|0;if((g|0)!=(e|0)){continue}break}}if(!i){break e}c=d+(c<<2)|0;d=F[c>>2];if((d|0)<=(b|0)){break e}F[c>>2]=d-1}c=F[a+36>>2];d=F[a+32>>2];f:{if((c|0)==(d|0)){break f}e=c-d|0;c=e>>2;g=c>>>0<=1?1:c;i=g&1;c=0;if(e>>>0>=8){g=g&-2;e=0;while(1){f=c<<2;h=f+d|0;j=F[h>>2];if((j|0)>(b|0)){F[h>>2]=j-1}f=d+(f|4)|0;h=F[f>>2];if((h|0)>(b|0)){F[f>>2]=h-1}c=c+2|0;e=e+2|0;if((g|0)!=(e|0)){continue}break}}if(!i){break f}c=d+(c<<2)|0;d=F[c>>2];if((d|0)<=(b|0)){break f}F[c>>2]=d-1}c=F[a+48>>2];d=F[a+44>>2];g:{if((c|0)==(d|0)){break g}e=c-d|0;c=e>>2;g=c>>>0<=1?1:c;i=g&1;c=0;if(e>>>0>=8){g=g&-2;e=0;while(1){f=c<<2;h=f+d|0;j=F[h>>2];if((j|0)>(b|0)){F[h>>2]=j-1}f=d+(f|4)|0;h=F[f>>2];if((h|0)>(b|0)){F[f>>2]=h-1}c=c+2|0;e=e+2|0;if((g|0)!=(e|0)){continue}break}}if(!i){break g}c=d+(c<<2)|0;d=F[c>>2];if((d|0)<=(b|0)){break g}F[c>>2]=d-1}c=F[a+60>>2];d=F[a+56>>2];h:{if((c|0)==(d|0)){break h}e=c-d|0;c=e>>2;g=c>>>0<=1?1:c;i=g&1;c=0;if(e>>>0>=8){g=g&-2;e=0;while(1){f=c<<2;h=f+d|0;j=F[h>>2];if((j|0)>(b|0)){F[h>>2]=j-1}f=d+(f|4)|0;h=F[f>>2];if((h|0)>(b|0)){F[f>>2]=h-1}c=c+2|0;e=e+2|0;if((g|0)!=(e|0)){continue}break}}if(!i){break h}c=d+(c<<2)|0;d=F[c>>2];if((d|0)<=(b|0)){break h}F[c>>2]=d-1}c=F[a+72>>2];a=F[a+68>>2];if((c|0)==(a|0)){break a}d=c-a|0;c=d>>2;e=c>>>0<=1?1:c;g=e&1;c=0;if(d>>>0>=8){d=e&-2;e=0;while(1){i=c<<2;f=i+a|0;h=F[f>>2];if((h|0)>(b|0)){F[f>>2]=h-1}i=a+(i|4)|0;f=F[i>>2];if((f|0)>(b|0)){F[i>>2]=f-1}c=c+2|0;e=e+2|0;if((d|0)!=(e|0)){continue}break}}if(!g){break a}f=b;a=a+(c<<2)|0;b=F[a>>2];if((f|0)>=(b|0)){break a}F[a>>2]=b-1}}function ja(a){a=a|0;var b=0,c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0;a:{if(!a){break a}d=a-8|0;b=F[a-4>>2];a=b&-8;f=d+a|0;b:{if(b&1){break b}if(!(b&3)){break a}b=F[d>>2];d=d-b|0;if(d>>>0<I[2945]){break a}a=a+b|0;if(F[2946]!=(d|0)){if(b>>>0<=255){e=F[d+8>>2];b=b>>>3|0;c=F[d+12>>2];if((c|0)==(e|0)){i=11764,j=F[2941]&oi(b),F[i>>2]=j;break b}F[e+12>>2]=c;F[c+8>>2]=e;break b}h=F[d+24>>2];b=F[d+12>>2];c:{if((d|0)!=(b|0)){c=F[d+8>>2];F[c+12>>2]=b;F[b+8>>2]=c;break c}d:{e=d+20|0;c=F[e>>2];if(c){break d}e=d+16|0;c=F[e>>2];if(c){break d}b=0;break c}while(1){g=e;b=c;e=b+20|0;c=F[e>>2];if(c){continue}e=b+16|0;c=F[b+16>>2];if(c){continue}break}F[g>>2]=0}if(!h){break b}e=F[d+28>>2];c=(e<<2)+12068|0;e:{if(F[c>>2]==(d|0)){F[c>>2]=b;if(b){break e}i=11768,j=F[2942]&oi(e),F[i>>2]=j;break b}F[h+(F[h+16>>2]==(d|0)?16:20)>>2]=b;if(!b){break b}}F[b+24>>2]=h;c=F[d+16>>2];if(c){F[b+16>>2]=c;F[c+24>>2]=b}c=F[d+20>>2];if(!c){break b}F[b+20>>2]=c;F[c+24>>2]=b;break b}b=F[f+4>>2];if((b&3)!=3){break b}F[2943]=a;F[f+4>>2]=b&-2;F[d+4>>2]=a|1;F[a+d>>2]=a;return}if(d>>>0>=f>>>0){break a}b=F[f+4>>2];if(!(b&1)){break a}f:{if(!(b&2)){if(F[2947]==(f|0)){F[2947]=d;a=F[2944]+a|0;F[2944]=a;F[d+4>>2]=a|1;if(F[2946]!=(d|0)){break a}F[2943]=0;F[2946]=0;return}if(F[2946]==(f|0)){F[2946]=d;a=F[2943]+a|0;F[2943]=a;F[d+4>>2]=a|1;F[a+d>>2]=a;return}a=(b&-8)+a|0;g:{if(b>>>0<=255){e=F[f+8>>2];b=b>>>3|0;c=F[f+12>>2];if((c|0)==(e|0)){i=11764,j=F[2941]&oi(b),F[i>>2]=j;break g}F[e+12>>2]=c;F[c+8>>2]=e;break g}h=F[f+24>>2];b=F[f+12>>2];h:{if((f|0)!=(b|0)){c=F[f+8>>2];F[c+12>>2]=b;F[b+8>>2]=c;break h}i:{e=f+20|0;c=F[e>>2];if(c){break i}e=f+16|0;c=F[e>>2];if(c){break i}b=0;break h}while(1){g=e;b=c;e=b+20|0;c=F[e>>2];if(c){continue}e=b+16|0;c=F[b+16>>2];if(c){continue}break}F[g>>2]=0}if(!h){break g}e=F[f+28>>2];c=(e<<2)+12068|0;j:{if(F[c>>2]==(f|0)){F[c>>2]=b;if(b){break j}i=11768,j=F[2942]&oi(e),F[i>>2]=j;break g}F[h+(F[h+16>>2]==(f|0)?16:20)>>2]=b;if(!b){break g}}F[b+24>>2]=h;c=F[f+16>>2];if(c){F[b+16>>2]=c;F[c+24>>2]=b}c=F[f+20>>2];if(!c){break g}F[b+20>>2]=c;F[c+24>>2]=b}F[d+4>>2]=a|1;F[a+d>>2]=a;if(F[2946]!=(d|0)){break f}F[2943]=a;return}F[f+4>>2]=b&-2;F[d+4>>2]=a|1;F[a+d>>2]=a}if(a>>>0<=255){b=(a&-8)+11804|0;c=F[2941];a=1<<(a>>>3);k:{if(!(c&a)){F[2941]=a|c;a=b;break k}a=F[b+8>>2]}F[b+8>>2]=d;F[a+12>>2]=d;F[d+12>>2]=b;F[d+8>>2]=a;return}e=31;if(a>>>0<=16777215){b=O(a>>>8|0);e=((a>>>38-b&1)-(b<<1)|0)+62|0}F[d+28>>2]=e;F[d+16>>2]=0;F[d+20>>2]=0;g=(e<<2)+12068|0;l:{m:{c=F[2942];b=1<<e;n:{if(!(c&b)){F[2942]=b|c;F[g>>2]=d;F[d+24>>2]=g;break n}e=a<<((e|0)!=31?25-(e>>>1|0)|0:0);b=F[g>>2];while(1){c=b;if((F[b+4>>2]&-8)==(a|0)){break m}b=e>>>29|0;e=e<<1;g=c+(b&4)|0;b=F[g+16>>2];if(b){continue}break}F[g+16>>2]=d;F[d+24>>2]=c}F[d+12>>2]=d;F[d+8>>2]=d;break l}a=F[c+8>>2];F[a+12>>2]=d;F[c+8>>2]=d;F[d+24>>2]=0;F[d+12>>2]=c;F[d+8>>2]=a}a=F[2949]-1|0;F[2949]=a?a:-1}}function di(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0;F[a+8>>2]=e;n=a+32|0;h=F[n>>2];f=F[a+36>>2]-h>>2;a:{if(f>>>0<e>>>0){qa(n,e-f|0);d=F[a+8>>2];break a}d=e;if(d>>>0>=f>>>0){break a}F[a+36>>2]=h+(e<<2);d=e}s=F[a+52>>2];p=F[a+48>>2];f=0;h=e>>>0>1073741823?-1:e<<2;m=ma(ka(h),0,h);b:{if((d|0)<=0){break b}g=F[a+32>>2];while(1){d=f<<2;h=F[d+m>>2];j=F[a+16>>2];c:{if((h|0)>(j|0)){F[d+g>>2]=j;break c}d=d+g|0;j=F[a+12>>2];if((j|0)>(h|0)){F[d>>2]=j;break c}F[d>>2]=h}d=F[a+8>>2];f=f+1|0;if((d|0)>(f|0)){continue}break}if((d|0)<=0){break b}f=0;while(1){h=f<<2;d=h+c|0;h=F[b+h>>2]+F[g+h>>2]|0;F[d>>2]=h;d:{if((h|0)>F[a+16>>2]){i=h-F[a+20>>2]|0}else{if((h|0)>=F[a+12>>2]){break d}i=h+F[a+20>>2]|0}F[d>>2]=i}d=F[a+8>>2];f=f+1|0;if((d|0)>(f|0)){continue}break}}f=F[a+56>>2];q=F[f>>2];f=F[f+4>>2]-q|0;if((f|0)>=5){o=f>>>2|0;t=o>>>0<=2?2:o;u=e&-2;w=e&1;h=1;while(1){e:{f:{if((h|0)!=(o|0)){r=L(e,h);f=F[(h<<2)+q>>2];if((f|0)==-1){break f}f=F[F[p+12>>2]+(f<<2)>>2];if((f|0)==-1){break f}j=F[s>>2];g=F[p>>2];k=F[j+(F[g+(f<<2)>>2]<<2)>>2];i=f+1|0;i=(i>>>0)%3|0?i:f-2|0;if((i|0)!=-1){i=F[g+(i<<2)>>2]}else{i=-1}g:{h:{if((f>>>0)%3|0){f=f-1|0;break h}f=f+2|0;l=-1;if((f|0)==-1){break g}}l=F[g+(f<<2)>>2]}if((h|0)<=(k|0)){break f}f=F[(i<<2)+j>>2];if((f|0)>=(h|0)){break f}g=F[j+(l<<2)>>2];if((g|0)>=(h|0)){break f}i:{if((e|0)<=0){break i}g=L(e,g);j=L(e,f);k=L(e,k);f=0;l=0;if((e|0)!=1){while(1){F[(f<<2)+m>>2]=(F[(f+g<<2)+c>>2]+F[(f+j<<2)+c>>2]|0)-F[(f+k<<2)+c>>2];i=f|1;F[(i<<2)+m>>2]=(F[(g+i<<2)+c>>2]+F[(j+i<<2)+c>>2]|0)-F[(i+k<<2)+c>>2];f=f+2|0;l=l+2|0;if((u|0)!=(l|0)){continue}break}}if(!w){break i}F[(f<<2)+m>>2]=(F[(f+g<<2)+c>>2]+F[(f+j<<2)+c>>2]|0)-F[(f+k<<2)+c>>2]}if((d|0)<=0){break e}j=F[n>>2];f=0;while(1){d=f<<2;g=F[d+m>>2];k=F[a+16>>2];j:{if((g|0)>(k|0)){F[d+j>>2]=k;break j}d=d+j|0;k=F[a+12>>2];if((k|0)>(g|0)){F[d>>2]=k;break j}F[d>>2]=g}d=F[a+8>>2];f=f+1|0;if((d|0)>(f|0)){continue}break}f=0;if((d|0)<=0){break e}d=r<<2;k=d+c|0;i=b+d|0;while(1){g=f<<2;d=g+k|0;g=F[g+i>>2]+F[g+j>>2]|0;F[d>>2]=g;k:{if((g|0)>F[a+16>>2]){l=g-F[a+20>>2]|0}else{if((g|0)>=F[a+12>>2]){break k}l=g+F[a+20>>2]|0}F[d>>2]=l}d=F[a+8>>2];f=f+1|0;if((d|0)>(f|0)){continue}break}break e}ta();v()}if((d|0)<=0){break e}k=(L(h-1|0,e)<<2)+c|0;j=F[n>>2];f=0;while(1){d=f<<2;g=F[d+k>>2];i=F[a+16>>2];l:{if((g|0)>(i|0)){F[d+j>>2]=i;break l}d=d+j|0;i=F[a+12>>2];if((i|0)>(g|0)){F[d>>2]=i;break l}F[d>>2]=g}d=F[a+8>>2];f=f+1|0;if((d|0)>(f|0)){continue}break}f=0;if((d|0)<=0){break e}d=r<<2;k=d+c|0;i=b+d|0;while(1){g=f<<2;d=g+k|0;g=F[g+i>>2]+F[g+j>>2]|0;F[d>>2]=g;m:{if((g|0)>F[a+16>>2]){l=g-F[a+20>>2]|0}else{if((g|0)>=F[a+12>>2]){break m}l=g+F[a+20>>2]|0}F[d>>2]=l}d=F[a+8>>2];f=f+1|0;if((d|0)>(f|0)){continue}break}}h=h+1|0;if((t|0)!=(h|0)){continue}break}}ja(m);return 1}function od(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;if((b|0)==-1){return 1}g=(b>>>0)/3|0;if(!(F[F[a+24>>2]+(g>>>3&268435452)>>2]>>>g&1)){e=F[a+48>>2];F[a+52>>2]=e;a:{if((e|0)!=F[a+56>>2]){F[e>>2]=b;F[a+52>>2]=e+4;break a}d=ka(4);F[d>>2]=b;c=d+4|0;F[a+56>>2]=c;F[a+52>>2]=c;F[a+48>>2]=d;if(!e){break a}ja(e)}c=b+1|0;i=(c>>>0)%3|0?c:b-2|0;c=F[F[a+4>>2]+28>>2];k=F[(i<<2)+c>>2];if((k|0)==-1){return 0}e=(b-L(g,3)|0?-1:2)+b|0;j=F[c+(e<<2)>>2];if((j|0)==-1){return 0}b=F[a+36>>2];g=b+(k>>>3&536870908)|0;d=F[g>>2];c=1<<k;if(!(d&c)){F[g>>2]=c|d;Ka(a+8|0,k,i);b=F[a+36>>2]}d=(j>>>3&536870908)+b|0;c=F[d>>2];b=1<<j;if(!(c&b)){F[d>>2]=b|c;Ka(a+8|0,j,e)}f=F[a+52>>2];if((f|0)==F[a+48>>2]){return 1}k=a+8|0;while(1){b:{c:{f=f-4|0;b=F[f>>2];if((b|0)==-1){break c}c=(b>>>0)/3|0;g=F[a+24>>2]+(c>>>3&268435452)|0;d=F[g>>2];c=1<<c;if(d&c){break c}F[g>>2]=c|d;h=F[a+4>>2];c=F[F[h+28>>2]+(b<<2)>>2];if((c|0)==-1){return 0}while(1){d=b;d:{e:{j=F[a+36>>2]+(c>>>3&536870908)|0;i=F[j>>2];e=1<<c;if(i&e){break e}f:{g=F[F[h+40>>2]+(c<<2)>>2];g:{if((g|0)==-1){break g}b=g+1|0;b=(b>>>0)%3|0?b:g-2|0;if((b|0)==-1|F[F[h>>2]+(b>>>3&536870908)>>2]>>>b&1){break g}g=F[F[F[h+64>>2]+12>>2]+(b<<2)>>2];if((g|0)!=-1){break f}}F[j>>2]=e|i;Ka(k,c,d);h=F[a+4>>2];break e}F[j>>2]=e|i;Ka(k,c,d);h=F[a+4>>2];b=g+1|0;if((((b>>>0)%3|0?b:g-2|0)|0)==-1){break e}b=-1;h:{if((d|0)==-1){break h}c=d+1|0;c=(c>>>0)%3|0?c:d-2|0;if((c|0)==-1|F[F[h>>2]+(c>>>3&536870908)>>2]>>>c&1){break h}b=F[F[F[h+64>>2]+12>>2]+(c<<2)>>2]}c=(b>>>0)/3|0;d=1<<c;f=F[a+24>>2];e=c>>>5|0;j=F[f+(e<<2)>>2];break d}i:{j:{if((d|0)==-1){break j}c=-1;b=d+1|0;b=(b>>>0)%3|0?b:d-2|0;if(!((b|0)==-1|F[F[h>>2]+(b>>>3&536870908)>>2]>>>b&1)){c=F[F[F[h+64>>2]+12>>2]+(b<<2)>>2]}k:{l:{if((d>>>0)%3|0){f=d-1|0;break l}f=d+2|0;b=-1;if((f|0)==-1){break k}}b=-1;if(F[F[h>>2]+(f>>>3&536870908)>>2]>>>f&1){break k}b=F[F[F[h+64>>2]+12>>2]+(f<<2)>>2]}g=(b|0)==-1;i=g?-1:(b>>>0)/3|0;if((c|0)!=-1){f=F[a+24>>2];d=(c>>>0)/3|0;e=d>>>5|0;j=F[f+(e<<2)>>2];d=1<<d;if(!(j&d)){break i}}if(g){break j}d=1<<i;f=F[a+24>>2];e=i>>>5|0;j=F[f+(e<<2)>>2];if(!(d&j)){break d}}f=F[a+52>>2]-4|0;F[a+52>>2]=f;break b}if(g){b=c;break d}if(F[(i>>>3&536870908)+f>>2]>>>i&1){b=c;break d}h=F[a+52>>2];F[h-4>>2]=b;if(F[a+56>>2]!=(h|0)){F[h>>2]=c;f=h+4|0;break c}m:{i=F[a+48>>2];e=h-i|0;g=e>>2;d=g+1|0;if(d>>>0<1073741824){b=e>>>1|0;e=e>>>0>=2147483644?1073741823:b>>>0>d>>>0?b:d;if(e){if(e>>>0>=1073741824){break m}d=ka(e<<2)}else{d=0}b=d+(g<<2)|0;F[b>>2]=c;f=b+4|0;if((h|0)!=(i|0)){while(1){b=b-4|0;h=h-4|0;F[b>>2]=F[h>>2];if((h|0)!=(i|0)){continue}break}}F[a+56>>2]=d+(e<<2);F[a+52>>2]=f;F[a+48>>2]=b;if(!i){break b}ja(i);f=F[a+52>>2];break b}na();v()}oa();v()}F[(e<<2)+f>>2]=d|j;c=F[F[h+28>>2]+(b<<2)>>2];if((c|0)!=-1){continue}break}return 0}F[a+52>>2]=f}if(F[a+48>>2]!=(f|0)){continue}break}}return 1}function he(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0;F[a+8>>2]=e;m=a+32|0;h=F[m>>2];f=F[a+36>>2]-h>>2;a:{if(f>>>0<e>>>0){qa(m,e-f|0);d=F[a+8>>2];break a}d=e;if(d>>>0>=f>>>0){break a}F[a+36>>2]=h+(e<<2);d=e}s=F[a+52>>2];n=F[a+48>>2];f=0;h=e>>>0>1073741823?-1:e<<2;l=ma(ka(h),0,h);b:{if((d|0)<=0){break b}g=F[a+32>>2];while(1){d=f<<2;h=F[d+l>>2];i=F[a+16>>2];c:{if((h|0)>(i|0)){F[d+g>>2]=i;break c}d=d+g|0;i=F[a+12>>2];if((i|0)>(h|0)){F[d>>2]=i;break c}F[d>>2]=h}d=F[a+8>>2];f=f+1|0;if((d|0)>(f|0)){continue}break}if((d|0)<=0){break b}f=0;while(1){h=f<<2;d=h+c|0;h=F[b+h>>2]+F[g+h>>2]|0;F[d>>2]=h;d:{if((h|0)>F[a+16>>2]){h=h-F[a+20>>2]|0}else{if((h|0)>=F[a+12>>2]){break d}h=h+F[a+20>>2]|0}F[d>>2]=h}d=F[a+8>>2];f=f+1|0;if((d|0)>(f|0)){continue}break}}f=F[a+56>>2];q=F[f>>2];f=F[f+4>>2]-q|0;if((f|0)>=5){o=f>>>2|0;t=o>>>0<=2?2:o;u=e&-2;w=e&1;h=1;while(1){e:{f:{if((h|0)!=(o|0)){r=L(e,h);f=F[(h<<2)+q>>2];if((f|0)==-1|F[F[n>>2]+(f>>>3&536870908)>>2]>>>f&1){break f}f=F[F[F[n+64>>2]+12>>2]+(f<<2)>>2];if((f|0)==-1){break f}i=F[s>>2];g=F[n+28>>2];k=F[i+(F[g+(f<<2)>>2]<<2)>>2];if((k|0)>=(h|0)){break f}j=f+1|0;j=F[i+(F[g+(((j>>>0)%3|0?j:f-2|0)<<2)>>2]<<2)>>2];if((j|0)>=(h|0)){break f}f=F[i+(F[g+(f+((f>>>0)%3|0?-1:2)<<2)>>2]<<2)>>2];if((f|0)>=(h|0)){break f}g:{if((e|0)<=0){break g}g=L(e,f);i=L(e,j);k=L(e,k);f=0;p=0;if((e|0)!=1){while(1){F[(f<<2)+l>>2]=(F[(f+g<<2)+c>>2]+F[(f+i<<2)+c>>2]|0)-F[(f+k<<2)+c>>2];j=f|1;F[(j<<2)+l>>2]=(F[(g+j<<2)+c>>2]+F[(i+j<<2)+c>>2]|0)-F[(k+j<<2)+c>>2];f=f+2|0;p=p+2|0;if((u|0)!=(p|0)){continue}break}}if(!w){break g}F[(f<<2)+l>>2]=(F[(f+g<<2)+c>>2]+F[(f+i<<2)+c>>2]|0)-F[(f+k<<2)+c>>2]}if((d|0)<=0){break e}i=F[m>>2];f=0;while(1){d=f<<2;g=F[d+l>>2];k=F[a+16>>2];h:{if((g|0)>(k|0)){F[d+i>>2]=k;break h}d=d+i|0;k=F[a+12>>2];if((k|0)>(g|0)){F[d>>2]=k;break h}F[d>>2]=g}d=F[a+8>>2];f=f+1|0;if((d|0)>(f|0)){continue}break}f=0;if((d|0)<=0){break e}d=r<<2;k=d+c|0;j=b+d|0;while(1){g=f<<2;d=g+k|0;g=F[g+j>>2]+F[g+i>>2]|0;F[d>>2]=g;i:{if((g|0)>F[a+16>>2]){g=g-F[a+20>>2]|0}else{if((g|0)>=F[a+12>>2]){break i}g=g+F[a+20>>2]|0}F[d>>2]=g}d=F[a+8>>2];f=f+1|0;if((d|0)>(f|0)){continue}break}break e}ta();v()}if((d|0)<=0){break e}k=(L(h-1|0,e)<<2)+c|0;i=F[m>>2];f=0;while(1){d=f<<2;g=F[d+k>>2];j=F[a+16>>2];j:{if((g|0)>(j|0)){F[d+i>>2]=j;break j}d=d+i|0;j=F[a+12>>2];if((j|0)>(g|0)){F[d>>2]=j;break j}F[d>>2]=g}d=F[a+8>>2];f=f+1|0;if((d|0)>(f|0)){continue}break}f=0;if((d|0)<=0){break e}d=r<<2;k=d+c|0;j=b+d|0;while(1){g=f<<2;d=g+k|0;g=F[g+j>>2]+F[g+i>>2]|0;F[d>>2]=g;k:{if((g|0)>F[a+16>>2]){g=g-F[a+20>>2]|0}else{if((g|0)>=F[a+12>>2]){break k}g=g+F[a+20>>2]|0}F[d>>2]=g}d=F[a+8>>2];f=f+1|0;if((d|0)>(f|0)){continue}break}}h=h+1|0;if((t|0)!=(h|0)){continue}break}}ja(l);return 1}function Fb(a,b,c,d){var e=0,f=0,g=0,h=0,i=0,j=M(0),k=0,l=0,m=M(0);i=F[c>>2];a:{b:{f=F[b+4>>2];if(!f){break b}g=ni(f);c:{if(g>>>0>=2){e=i;if(f>>>0<=e>>>0){e=(i>>>0)%(f>>>0)|0}c=F[F[b>>2]+(e<<2)>>2];if(!c){break b}if(g>>>0<=1){break c}while(1){c=F[c>>2];if(!c){break b}g=F[c+4>>2];if((g|0)!=(i|0)){if(f>>>0<=g>>>0){g=(g>>>0)%(f>>>0)|0}if((e|0)!=(g|0)){break b}}if(F[c+8>>2]!=(i|0)){continue}break}b=0;break a}e=f-1&i;c=F[F[b>>2]+(e<<2)>>2];if(!c){break b}}h=f-1|0;while(1){c=F[c>>2];if(!c){break b}g=F[c+4>>2];if((g|0)!=(i|0)&(g&h)!=(e|0)){break b}if(F[c+8>>2]!=(i|0)){continue}break}b=0;break a}c=ka(16);d=F[F[d>>2]>>2];F[c+12>>2]=0;F[c+8>>2]=d;F[c+4>>2]=i;F[c>>2]=0;m=M(F[b+12>>2]+1>>>0);j=J[b+16>>2];d:{if(m>M(j*M(f>>>0))?0:f){break d}e=2;d=(f-1&f)!=0|f>>>0<3|f<<1;j=M(S(M(m/j)));e:{if(j<M(4294967296)&j>=M(0)){g=~~j>>>0;break e}g=0}d=d>>>0>g>>>0?d:g;f:{if((d|0)==1){break f}if(!(d&d-1)){e=d;break f}e=Mc(d);f=F[b+4>>2]}g:{if(e>>>0<=f>>>0){if(e>>>0>=f>>>0){break g}g=f>>>0<3;j=M(S(M(M(I[b+12>>2])/J[b+16>>2])));h:{if(j<M(4294967296)&j>=M(0)){d=~~j>>>0;break h}d=0}i:{j:{if(g){break j}if(ni(f)>>>0>1){break j}d=d>>>0<2?d:1<<32-O(d-1|0);break i}d=Mc(d)}e=d>>>0<e>>>0?e:d;if(f>>>0<=e>>>0){break g}}f=0;g=0;h=e;k:{l:{m:{n:{if(e){if(h>>>0>=1073741824){break n}d=ka(h<<2);e=F[b>>2];F[b>>2]=d;if(e){ja(e)}F[b+4>>2]=h;d=0;if(h>>>0>=4){e=h&-4;while(1){k=d<<2;F[k+F[b>>2]>>2]=0;F[F[b>>2]+(k|4)>>2]=0;F[F[b>>2]+(k|8)>>2]=0;F[F[b>>2]+(k|12)>>2]=0;d=d+4|0;g=g+4|0;if((e|0)!=(g|0)){continue}break}}e=h&3;if(e){while(1){F[F[b>>2]+(d<<2)>>2]=0;d=d+1|0;f=f+1|0;if((e|0)!=(f|0)){continue}break}}e=F[b+8>>2];if(!e){break k}d=b+8|0;f=F[e+4>>2];g=ni(h);if(g>>>0<2){break m}f=f>>>0>=h>>>0?(f>>>0)%(h>>>0)|0:f;F[F[b>>2]+(f<<2)>>2]=d;d=F[e>>2];if(!d){break k}if(g>>>0<=1){break l}while(1){g=F[d+4>>2];if(h>>>0<=g>>>0){g=(g>>>0)%(h>>>0)|0}o:{if((f|0)==(g|0)){e=d;break o}l=g<<2;k=l+F[b>>2]|0;if(!F[k>>2]){F[k>>2]=e;e=d;f=g;break o}F[e>>2]=F[d>>2];F[d>>2]=F[F[l+F[b>>2]>>2]>>2];F[F[l+F[b>>2]>>2]>>2]=d}d=F[e>>2];if(d){continue}break}break k}d=F[b>>2];F[b>>2]=0;if(d){ja(d)}F[b+4>>2]=0;break k}oa();v()}f=h-1&f;F[F[b>>2]+(f<<2)>>2]=d;d=F[e>>2];if(!d){break k}}k=h-1|0;while(1){g=k&F[d+4>>2];p:{if((g|0)==(f|0)){e=d;break p}l=g<<2;h=l+F[b>>2]|0;if(F[h>>2]){F[e>>2]=F[d>>2];F[d>>2]=F[F[l+F[b>>2]>>2]>>2];F[F[l+F[b>>2]>>2]>>2]=d;break p}F[h>>2]=e;e=d;f=g}d=F[e>>2];if(d){continue}break}}}f=F[b+4>>2];d=f-1|0;if(!(d&f)){e=d&i;break d}if(f>>>0>i>>>0){e=i;break d}e=(i>>>0)%(f>>>0)|0}e=F[b>>2]+(e<<2)|0;d=F[e>>2];q:{r:{if(!d){d=b+8|0;F[c>>2]=F[d>>2];F[b+8>>2]=c;F[e>>2]=d;d=F[c>>2];if(!d){break q}d=F[d+4>>2];e=f-1|0;s:{if(!(e&f)){d=d&e;break s}if(d>>>0<f>>>0){break s}d=(d>>>0)%(f>>>0)|0}d=F[b>>2]+(d<<2)|0;break r}F[c>>2]=F[d>>2]}F[d>>2]=c}F[b+12>>2]=F[b+12>>2]+1;b=1}D[a+4|0]=b;F[a>>2]=c}function Vb(a,b,c){var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;j=L(b,12)+a|0;F[j+12>>2]=F[j+8>>2];m=(c|0)==-1?-1:(c>>>0)/3|0;d=1;k=c;a:{b:{c:{while(1){d:{l=d;if(!d){if((k|0)==-1){break d}if((Wc(a,((k>>>0)%3|0?-1:2)+k|0)|0)==-1){break a}c=k+1|0;d=(c>>>0)%3|0?c:k-2|0;if((d|0)==-1){break a}c=d+1|0;c=(c>>>0)%3|0?c:d-2|0;if((c|0)==-1){break a}d=F[F[F[a+4>>2]+12>>2]+(c<<2)>>2];if((d|0)==-1){break a}c=d+1|0;c=(c>>>0)%3|0?c:d-2|0;if((c|0)==-1){break a}m=(c>>>0)/3|0}e:{d=F[a+56>>2]+(m>>>3&536870908)|0;h=F[d>>2];e=1<<m;if(h&e){break e}f=0;while(1){F[d>>2]=e|h;d=F[j+12>>2];f:{if((d|0)!=F[j+16>>2]){F[d>>2]=m;F[j+12>>2]=d+4;break f}n=F[j+8>>2];h=d-n|0;e=h>>2;i=e+1|0;if(i>>>0>=1073741824){break c}g=h>>>1|0;i=h>>>0>=2147483644?1073741823:i>>>0<g>>>0?g:i;if(i){if(i>>>0>=1073741824){break b}g=ka(i<<2)}else{g=0}h=g+(e<<2)|0;F[h>>2]=m;e=h+4|0;if((d|0)!=(n|0)){while(1){h=h-4|0;d=d-4|0;F[h>>2]=F[d>>2];if((d|0)!=(n|0)){continue}break}}F[j+8>>2]=h;F[j+12>>2]=e;F[j+16>>2]=g+(i<<2);if(!n){break f}ja(n)}g=f+1|0;g:{h:{i:{if(!f){break i}if(g&1){if((c|0)==-1){c=-1;break g}d=c+1|0;c=(d>>>0)%3|0?d:c-2|0;break i}k=l?k:c;if((c|0)==-1){c=-1;break g}if((c>>>0)%3|0){d=c-1|0;break h}c=c+2|0}d=c;c=-1;if((d|0)==-1){break g}}c=F[F[F[a+4>>2]+12>>2]+(d<<2)>>2];h=-1;f=-1;e=d+1|0;e=(e>>>0)%3|0?e:d-2|0;if((e|0)>=0){f=(e>>>0)/3|0;f=F[(F[F[a>>2]+96>>2]+L(f,12)|0)+(e-L(f,3)<<2)>>2]}j:{if((c|0)==-1){break j}i=((c>>>0)%3|0?-1:2)+c|0;if((i|0)<0){break j}e=(i>>>0)/3|0;h=F[(F[F[a>>2]+96>>2]+L(e,12)|0)+(i-L(e,3)<<2)>>2]}if((f|0)!=(h|0)){c=-1;break g}k:{l:{f=((d>>>0)%3|0?-1:2)+d|0;if((f|0)>=0){d=(f>>>0)/3|0;if((c|0)!=-1){break l}c=-1;break g}d=-1;if((c|0)!=-1){break k}c=-1;break g}d=F[(F[F[a>>2]+96>>2]+L(d,12)|0)+(f-L(d,3)<<2)>>2]}f=c+1|0;e=(f>>>0)%3|0?f:c-2|0;if((e|0)>=0){f=(e>>>0)/3|0;f=F[(F[F[a>>2]+96>>2]+L(f,12)|0)+(e-L(f,3)<<2)>>2]}else{f=-1}if((f|0)!=(d|0)){c=-1;break g}f=g;m=(c>>>0)/3|0;d=F[a+56>>2]+(m>>>3&268435452)|0;h=F[d>>2];e=1<<m;if(!(h&e)){continue}}break}if(l|!(g&1)){break e}l=F[j+12>>2]-4|0;g=F[l>>2];d=F[a+56>>2]+(g>>>3&536870908)|0;c=F[d>>2];o=d,p=oi(g)&c,F[o>>2]=p;F[j+12>>2]=l;break a}d=0;if(l){continue}break a}break}k=-1;Wc(a,-1);break a}na();v()}oa();v()}F[((b<<2)+a|0)+44>>2]=k;b=F[j+12>>2];i=F[j+8>>2];m:{if((b|0)==(i|0)){break m}c=b-i|0;b=c>>2;b=b>>>0<=1?1:b;k=b&1;e=F[a+56>>2];d=0;if(c>>>0>=8){f=b&-2;c=0;while(1){l=d<<2;g=F[l+i>>2];b=e+(g>>>3&536870908)|0;a=F[b>>2];o=b,p=oi(g)&a,F[o>>2]=p;g=F[i+(l|4)>>2];b=e+(g>>>3&536870908)|0;a=F[b>>2];o=b,p=oi(g)&a,F[o>>2]=p;d=d+2|0;c=c+2|0;if((f|0)!=(c|0)){continue}break}}if(!k){break m}c=F[i+(d<<2)>>2];b=e+(c>>>3&536870908)|0;a=F[b>>2];o=b,p=oi(c)&a,F[o>>2]=p}}function pd(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0;if((b|0)==-1){return 1}g=(b>>>0)/3|0;if(!(F[F[a+24>>2]+(g>>>3&268435452)>>2]>>>g&1)){f=F[a+48>>2];F[a+52>>2]=f;a:{if((f|0)!=F[a+56>>2]){F[f>>2]=b;F[a+52>>2]=f+4;break a}d=ka(4);F[d>>2]=b;c=d+4|0;F[a+56>>2]=c;F[a+52>>2]=c;F[a+48>>2]=d;if(!f){break a}ja(f)}e=-1;d=F[a+4>>2];c=b+1|0;i=(c>>>0)%3|0?c:b-2|0;if((i|0)!=-1){e=F[F[d>>2]+(i<<2)>>2]}b:{h=b-L(g,3)|0;if(h){c=b-1|0;break b}c=b+2|0;if((c|0)!=-1){break b}return 0}if((e|0)==-1){return 0}j=F[F[d>>2]+(c<<2)>>2];if((j|0)==-1){return 0}c=F[a+36>>2];f=c+(e>>>3&536870908)|0;g=F[f>>2];d=1<<e;if(!(g&d)){F[f>>2]=d|g;Ka(a+8|0,e,i);c=F[a+36>>2]}g=(j>>>3&536870908)+c|0;d=F[g>>2];c=1<<j;if(!(d&c)){F[g>>2]=c|d;Ka(a+8|0,j,(h?-1:2)+b|0)}c=F[a+52>>2];if((c|0)==F[a+48>>2]){return 1}j=a+8|0;while(1){c:{d:{c=c-4|0;b=F[c>>2];if((b|0)==-1){break d}d=(b>>>0)/3|0;f=F[a+24>>2]+(d>>>3&268435452)|0;g=F[f>>2];d=1<<d;if(g&d){break d}F[f>>2]=d|g;while(1){i=F[a+4>>2];e=F[F[i>>2]+(b<<2)>>2];if((e|0)==-1){return 0}e:{f:{h=F[a+36>>2]+(e>>>3&536870908)|0;f=F[h>>2];g=1<<e;if(f&g){break f}g:{d=F[F[i+24>>2]+(e<<2)>>2];h:{if((d|0)==-1){break h}c=d+1|0;c=(c>>>0)%3|0?c:d-2|0;if((c|0)==-1){break h}d=F[F[i+12>>2]+(c<<2)>>2];if((d|0)!=-1){break g}}F[h>>2]=f|g;Ka(j,e,b);break f}F[h>>2]=f|g;Ka(j,e,b);c=d+1|0;if((((c>>>0)%3|0?c:d-2|0)|0)==-1){break f}c=b-2|0;d=b+1|0;b=-1;c=(d>>>0)%3|0?d:c;if((c|0)!=-1){b=F[F[F[a+4>>2]+12>>2]+(c<<2)>>2]}c=(b>>>0)/3|0;d=1<<c;e=F[a+24>>2];f=c>>>5|0;i=F[e+(f<<2)>>2];break e}c=-1;g=F[a+4>>2];d=b+1|0;d=(d>>>0)%3|0?d:b-2|0;if((d|0)!=-1){c=F[F[g+12>>2]+(d<<2)>>2]}i:{j:{if((b>>>0)%3|0){e=b-1|0;break j}e=b+2|0;b=-1;if((e|0)==-1){break i}}b=F[F[g+12>>2]+(e<<2)>>2]}g=(b|0)==-1;h=g?-1:(b>>>0)/3|0;k:{if((c|0)!=-1){e=F[a+24>>2];d=(c>>>0)/3|0;f=d>>>5|0;i=F[e+(f<<2)>>2];d=1<<d;if(!(i&d)){break k}}if(!g){d=1<<h;e=F[a+24>>2];f=h>>>5|0;i=F[e+(f<<2)>>2];if(!(d&i)){break e}}c=F[a+52>>2]-4|0;F[a+52>>2]=c;break c}if(g){b=c;break e}if(F[(h>>>3&536870908)+e>>2]>>>h&1){b=c;break e}e=F[a+52>>2];F[e-4>>2]=b;if(F[a+56>>2]!=(e|0)){F[e>>2]=c;c=e+4|0;break d}l:{h=F[a+48>>2];f=e-h|0;g=f>>2;d=g+1|0;if(d>>>0<1073741824){b=f>>>1|0;f=f>>>0>=2147483644?1073741823:b>>>0>d>>>0?b:d;if(f){if(f>>>0>=1073741824){break l}d=ka(f<<2)}else{d=0}b=d+(g<<2)|0;F[b>>2]=c;c=b+4|0;if((e|0)!=(h|0)){while(1){b=b-4|0;e=e-4|0;F[b>>2]=F[e>>2];if((e|0)!=(h|0)){continue}break}}F[a+56>>2]=d+(f<<2);F[a+52>>2]=c;F[a+48>>2]=b;if(!h){break c}ja(h);c=F[a+52>>2];break c}na();v()}oa();v()}F[(f<<2)+e>>2]=d|i;if((b|0)!=-1){continue}break}return 0}F[a+52>>2]=c}if(F[a+48>>2]!=(c|0)){continue}break}}return 1}function ee(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;h=Z-32|0;Z=h;a:{b:{if(!Oa(1,h+28|0,b)){break b}d=F[h+28>>2];c=F[F[a+48>>2]+64>>2];if(d>>>0>F[c+4>>2]-F[c>>2]>>2>>>0){break b}c:{if(d){Na(a+60|0,d);c=h+8|0;F[c>>2]=0;F[c+4>>2]=0;D[c+5|0]=0;D[c+6|0]=0;D[c+7|0]=0;D[c+8|0]=0;D[c+9|0]=0;D[c+10|0]=0;D[c+11|0]=0;D[c+12|0]=0;if(!Aa(c,b)){break c}while(1){f=1<<e;j=wa(c);g=F[a+60>>2]+(e>>>3&536870908)|0;if(j){i=f|F[g>>2]}else{i=F[g>>2]&(f^-1)}F[g>>2]=i;e=e+1|0;if((d|0)!=(e|0)){continue}break}}if(!Oa(1,h+28|0,b)){break b}d=F[h+28>>2];c=F[F[a+48>>2]+64>>2];if(d>>>0>F[c+4>>2]-F[c>>2]>>2>>>0){break b}if(d){e=0;Na(a+72|0,d);c=h+8|0;F[c>>2]=0;F[c+4>>2]=0;D[c+5|0]=0;D[c+6|0]=0;D[c+7|0]=0;D[c+8|0]=0;D[c+9|0]=0;D[c+10|0]=0;D[c+11|0]=0;D[c+12|0]=0;if(!Aa(c,b)){break c}while(1){f=1<<e;j=wa(c);g=F[a+72>>2]+(e>>>3&536870908)|0;if(j){i=f|F[g>>2]}else{i=F[g>>2]&(f^-1)}F[g>>2]=i;e=e+1|0;if((d|0)!=(e|0)){continue}break}}if(!Oa(1,h+28|0,b)){break b}d=F[h+28>>2];c=F[F[a+48>>2]+64>>2];if(d>>>0>F[c+4>>2]-F[c>>2]>>2>>>0){break b}if(d){e=0;Na(a+84|0,d);c=h+8|0;F[c>>2]=0;F[c+4>>2]=0;D[c+5|0]=0;D[c+6|0]=0;D[c+7|0]=0;D[c+8|0]=0;D[c+9|0]=0;D[c+10|0]=0;D[c+11|0]=0;D[c+12|0]=0;if(!Aa(c,b)){break c}while(1){f=1<<e;j=wa(c);g=F[a+84>>2]+(e>>>3&536870908)|0;if(j){i=f|F[g>>2]}else{i=F[g>>2]&(f^-1)}F[g>>2]=i;e=e+1|0;if((d|0)!=(e|0)){continue}break}}if(!Oa(1,h+28|0,b)){break b}d=F[h+28>>2];c=F[F[a+48>>2]+64>>2];if(d>>>0>F[c+4>>2]-F[c>>2]>>2>>>0){break b}if(d){e=0;Na(a+96|0,d);c=h+8|0;F[c>>2]=0;F[c+4>>2]=0;D[c+5|0]=0;D[c+6|0]=0;D[c+7|0]=0;D[c+8|0]=0;D[c+9|0]=0;D[c+10|0]=0;D[c+11|0]=0;D[c+12|0]=0;if(!Aa(c,b)){break c}while(1){f=1<<e;j=wa(c);g=F[a+96>>2]+(e>>>3&536870908)|0;if(j){i=f|F[g>>2]}else{i=F[g>>2]&(f^-1)}F[g>>2]=i;e=e+1|0;if((d|0)!=(e|0)){continue}break}}e=0;c=F[b+8>>2];f=F[b+12>>2];d=c;c=F[b+20>>2];i=c;g=F[b+16>>2];j=g+4|0;c=j>>>0<4?c+1|0:c;if(d>>>0<j>>>0&(c|0)>=(f|0)|(c|0)>(f|0)){break a}m=F[b>>2];k=m+g|0;l=G[k|0]|G[k+1|0]<<8|(G[k+2|0]<<16|G[k+3|0]<<24);F[b+16>>2]=j;F[b+20>>2]=c;k=d;d=f;c=i;f=g+8|0;c=f>>>0<8?c+1|0:c;if(f>>>0>k>>>0&(c|0)>=(d|0)|(c|0)>(d|0)){break a}d=j+m|0;d=G[d|0]|G[d+1|0]<<8|(G[d+2|0]<<16|G[d+3|0]<<24);F[b+16>>2]=f;F[b+20>>2]=c;if((d|0)<(l|0)){break a}F[a+16>>2]=d;F[a+12>>2]=l;c=(d>>31)-((l>>31)+(d>>>0<l>>>0)|0)|0;b=d-l|0;if(!c&b>>>0>2147483646|c){break a}e=1;b=b+1|0;F[a+20>>2]=b;c=b>>>1|0;F[a+24>>2]=c;F[a+28>>2]=0-c;if(b&1){break a}F[a+24>>2]=c-1;break a}}e=0}Z=h+32|0;return e|0}function ai(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;h=Z-32|0;Z=h;a:{b:{if(!Oa(1,h+28|0,b)){break b}d=F[h+28>>2];c=F[a+48>>2];if(d>>>0>F[c+4>>2]-F[c>>2]>>2>>>0){break b}c:{if(d){Na(a+60|0,d);c=h+8|0;F[c>>2]=0;F[c+4>>2]=0;D[c+5|0]=0;D[c+6|0]=0;D[c+7|0]=0;D[c+8|0]=0;D[c+9|0]=0;D[c+10|0]=0;D[c+11|0]=0;D[c+12|0]=0;if(!Aa(c,b)){break c}while(1){f=1<<e;j=wa(c);g=F[a+60>>2]+(e>>>3&536870908)|0;if(j){i=f|F[g>>2]}else{i=F[g>>2]&(f^-1)}F[g>>2]=i;e=e+1|0;if((d|0)!=(e|0)){continue}break}}if(!Oa(1,h+28|0,b)){break b}d=F[h+28>>2];c=F[a+48>>2];if(d>>>0>F[c+4>>2]-F[c>>2]>>2>>>0){break b}if(d){e=0;Na(a+72|0,d);c=h+8|0;F[c>>2]=0;F[c+4>>2]=0;D[c+5|0]=0;D[c+6|0]=0;D[c+7|0]=0;D[c+8|0]=0;D[c+9|0]=0;D[c+10|0]=0;D[c+11|0]=0;D[c+12|0]=0;if(!Aa(c,b)){break c}while(1){f=1<<e;j=wa(c);g=F[a+72>>2]+(e>>>3&536870908)|0;if(j){i=f|F[g>>2]}else{i=F[g>>2]&(f^-1)}F[g>>2]=i;e=e+1|0;if((d|0)!=(e|0)){continue}break}}if(!Oa(1,h+28|0,b)){break b}d=F[h+28>>2];c=F[a+48>>2];if(d>>>0>F[c+4>>2]-F[c>>2]>>2>>>0){break b}if(d){e=0;Na(a+84|0,d);c=h+8|0;F[c>>2]=0;F[c+4>>2]=0;D[c+5|0]=0;D[c+6|0]=0;D[c+7|0]=0;D[c+8|0]=0;D[c+9|0]=0;D[c+10|0]=0;D[c+11|0]=0;D[c+12|0]=0;if(!Aa(c,b)){break c}while(1){f=1<<e;j=wa(c);g=F[a+84>>2]+(e>>>3&536870908)|0;if(j){i=f|F[g>>2]}else{i=F[g>>2]&(f^-1)}F[g>>2]=i;e=e+1|0;if((d|0)!=(e|0)){continue}break}}if(!Oa(1,h+28|0,b)){break b}d=F[h+28>>2];c=F[a+48>>2];if(d>>>0>F[c+4>>2]-F[c>>2]>>2>>>0){break b}if(d){e=0;Na(a+96|0,d);c=h+8|0;F[c>>2]=0;F[c+4>>2]=0;D[c+5|0]=0;D[c+6|0]=0;D[c+7|0]=0;D[c+8|0]=0;D[c+9|0]=0;D[c+10|0]=0;D[c+11|0]=0;D[c+12|0]=0;if(!Aa(c,b)){break c}while(1){f=1<<e;j=wa(c);g=F[a+96>>2]+(e>>>3&536870908)|0;if(j){i=f|F[g>>2]}else{i=F[g>>2]&(f^-1)}F[g>>2]=i;e=e+1|0;if((d|0)!=(e|0)){continue}break}}e=0;c=F[b+8>>2];f=F[b+12>>2];d=c;c=F[b+20>>2];i=c;g=F[b+16>>2];j=g+4|0;c=j>>>0<4?c+1|0:c;if(d>>>0<j>>>0&(c|0)>=(f|0)|(c|0)>(f|0)){break a}m=F[b>>2];k=m+g|0;l=G[k|0]|G[k+1|0]<<8|(G[k+2|0]<<16|G[k+3|0]<<24);F[b+16>>2]=j;F[b+20>>2]=c;k=d;d=f;c=i;f=g+8|0;c=f>>>0<8?c+1|0:c;if(f>>>0>k>>>0&(c|0)>=(d|0)|(c|0)>(d|0)){break a}d=j+m|0;d=G[d|0]|G[d+1|0]<<8|(G[d+2|0]<<16|G[d+3|0]<<24);F[b+16>>2]=f;F[b+20>>2]=c;if((d|0)<(l|0)){break a}F[a+16>>2]=d;F[a+12>>2]=l;c=(d>>31)-((l>>31)+(d>>>0<l>>>0)|0)|0;b=d-l|0;if(!c&b>>>0>2147483646|c){break a}e=1;b=b+1|0;F[a+20>>2]=b;c=b>>>1|0;F[a+24>>2]=c;F[a+28>>2]=0-c;if(b&1){break a}F[a+24>>2]=c-1;break a}}e=0}Z=h+32|0;return e|0}function uh(a){a=a|0;var b=0,c=0,d=0,e=0;c=F[a+32>>2];d=F[c+16>>2];e=F[c+12>>2];b=F[c+20>>2];if(I[c+8>>2]>d>>>0&(e|0)>=(b|0)|(b|0)<(e|0)){e=G[F[c>>2]+d|0];d=d+1|0;b=d?b:b+1|0;F[c+16>>2]=d;F[c+20>>2]=b;b=F[a+48>>2];F[a+48>>2]=0;if(b){$[F[F[b>>2]+4>>2]](b)}a:{b:{c:{d:{switch(e|0){case 0:b=ka(384);F[b>>2]=8284;ma(b+4|0,0,80);F[b+96>>2]=0;F[b+100>>2]=0;F[b+92>>2]=-1;F[b+84>>2]=-1;F[b+88>>2]=-1;F[b+104>>2]=0;F[b+108>>2]=0;F[b+112>>2]=0;F[b+116>>2]=0;F[b+120>>2]=0;F[b+124>>2]=0;F[b+128>>2]=0;F[b+132>>2]=0;F[b+136>>2]=0;F[b+140>>2]=0;F[b+144>>2]=0;F[b+148>>2]=0;F[b+156>>2]=0;F[b+160>>2]=0;F[b+152>>2]=1065353216;F[b+164>>2]=0;F[b+168>>2]=0;F[b+172>>2]=0;F[b+176>>2]=0;F[b+180>>2]=0;F[b+184>>2]=0;F[b+188>>2]=0;F[b+192>>2]=0;F[b+196>>2]=0;F[b+200>>2]=0;F[b+204>>2]=0;F[b+208>>2]=0;F[b+212>>2]=-1;F[b+216>>2]=0;F[b+220>>2]=0;F[b+224>>2]=0;Ja(b+232|0);Ja(b+272|0);c=b+312|0;F[c>>2]=0;F[c+4>>2]=0;D[c+5|0]=0;D[c+6|0]=0;D[c+7|0]=0;D[c+8|0]=0;D[c+9|0]=0;D[c+10|0]=0;D[c+11|0]=0;D[c+12|0]=0;Ja(b+328|0);F[b+376>>2]=0;F[b+368>>2]=0;F[b+372>>2]=0;break c;case 2:break d;default:break b}}b=ka(440);F[b>>2]=8336;ma(b+4|0,0,80);F[b+96>>2]=0;F[b+100>>2]=0;F[b+92>>2]=-1;F[b+84>>2]=-1;F[b+88>>2]=-1;F[b+104>>2]=0;F[b+108>>2]=0;F[b+112>>2]=0;F[b+116>>2]=0;F[b+120>>2]=0;F[b+124>>2]=0;F[b+128>>2]=0;F[b+132>>2]=0;F[b+136>>2]=0;F[b+140>>2]=0;F[b+144>>2]=0;F[b+148>>2]=0;F[b+156>>2]=0;F[b+160>>2]=0;F[b+152>>2]=1065353216;F[b+164>>2]=0;F[b+168>>2]=0;F[b+172>>2]=0;F[b+176>>2]=0;F[b+180>>2]=0;F[b+184>>2]=0;F[b+188>>2]=0;F[b+192>>2]=0;F[b+196>>2]=0;F[b+200>>2]=0;F[b+204>>2]=0;F[b+208>>2]=0;F[b+212>>2]=-1;F[b+216>>2]=0;F[b+220>>2]=0;F[b+224>>2]=0;Ja(b+232|0);Ja(b+272|0);c=b+312|0;F[c>>2]=0;F[c+4>>2]=0;D[c+5|0]=0;D[c+6|0]=0;D[c+7|0]=0;D[c+8|0]=0;D[c+9|0]=0;D[c+10|0]=0;D[c+11|0]=0;D[c+12|0]=0;Ja(b+328|0);F[b+392>>2]=0;F[b+396>>2]=0;F[b+384>>2]=0;F[b+388>>2]=0;F[b+376>>2]=0;F[b+380>>2]=0;F[b+368>>2]=0;F[b+372>>2]=0;F[b+416>>2]=0;F[b+420>>2]=0;F[b+408>>2]=2;F[b+412>>2]=7;F[b+400>>2]=-1;F[b+404>>2]=-1;F[b+424>>2]=0;F[b+428>>2]=0;F[b+432>>2]=0;F[b+436>>2]=0}c=F[a+48>>2];F[a+48>>2]=b;if(!c){break a}$[F[F[c>>2]+4>>2]](c)}b=F[a+48>>2];if(b){break a}return 0}a=$[F[F[b>>2]+8>>2]](b,a)|0}else{a=0}return a|0}function ei(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;g=Z-32|0;Z=g;F[a+68>>2]=f;d=F[a+56>>2];e=F[d>>2];d=F[d+4>>2];F[g+24>>2]=0;F[g+16>>2]=0;F[g+20>>2]=0;a:{d=d-e|0;if((d|0)>0){m=a+60|0;d=d>>>2|0;n=d>>>0<=1?1:d;o=a+112|0;while(1){e=F[a+56>>2];d=F[e>>2];if(F[e+4>>2]-d>>2>>>0<=j>>>0){break a}Mb(m,F[d+(j<<2)>>2],g+16|0);i=F[g+20>>2];d=i>>31;h=F[g+16>>2];e=h>>31;f=(d^i)-d+((e^h)-e)|0;k=F[g+24>>2];d=k>>31;e=(d^k)-d|0;d=0;l=e;e=e+f|0;d=l>>>0>e>>>0?1:d;b:{if(!(d|e)){F[g+16>>2]=F[a+108>>2];break b}f=F[a+108>>2];l=f>>31;h=li(ki(f,l,h,h>>31),_,e,d);F[g+16>>2]=h;d=li(ki(f,l,i,i>>31),_,e,d);F[g+20>>2]=d;e=d;d=d>>31;e=(e^d)-d|0;d=h>>31;d=e+((d^h)-d|0)|0;if((k|0)>=0){F[g+24>>2]=f-d;break b}F[g+24>>2]=d-f}d=wa(o);f=F[g+16>>2];c:{if(d){F[g+24>>2]=0-F[g+24>>2];e=0-F[g+20>>2]|0;F[g+20>>2]=e;f=0-f|0;F[g+16>>2]=f;break c}e=F[g+20>>2]}d:{if((f|0)>=0){f=F[a+108>>2];d=f+F[g+24>>2]|0;f=e+f|0;break d}e:{if((e|0)<0){d=F[g+24>>2];f=d>>31;f=(d^f)-f|0;break e}d=F[g+24>>2];f=d>>31;f=F[a+100>>2]+(f-(d^f)|0)|0}if((d|0)<0){d=e>>31;d=(d^e)-d|0;break d}d=e>>31;d=F[a+100>>2]+(d-(d^e)|0)|0}e=F[a+100>>2];f:{if(!(d|f)){d=e;f=d;break f}if(!((d|0)!=(e|0)|f)){f=d;break f}if(!((e|0)!=(f|0)|d)){d=f;break f}g:{if(f){break g}i=F[a+108>>2];if((i|0)>=(d|0)){break g}d=(i<<1)-d|0;f=0;break f}h:{if((e|0)!=(f|0)){break h}i=F[a+108>>2];if((i|0)<=(d|0)){break h}d=(i<<1)-d|0;break f}i:{if((d|0)!=(e|0)){break i}e=F[a+108>>2];if((e|0)<=(f|0)){break i}f=(e<<1)-f|0;break f}if(d){break f}d=0;e=F[a+108>>2];if((e|0)>=(f|0)){break f}f=(e<<1)-f|0}F[g+12>>2]=d;F[g+8>>2]=f;j:{if(F[a+8>>2]<=0){break j}i=F[a+32>>2];f=0;while(1){d=f<<2;e=F[d+(g+8|0)>>2];h=F[a+16>>2];k:{if((e|0)>(h|0)){F[d+i>>2]=h;break k}d=d+i|0;h=F[a+12>>2];if((h|0)>(e|0)){F[d>>2]=h;break k}F[d>>2]=e}f=f+1|0;e=F[a+8>>2];if((f|0)<(e|0)){continue}break}d=0;if((e|0)<=0){break j}e=j<<3;h=e+c|0;k=b+e|0;while(1){f=d<<2;e=f+h|0;f=F[f+k>>2]+F[f+i>>2]|0;F[e>>2]=f;l:{if((f|0)>F[a+16>>2]){f=f-F[a+20>>2]|0}else{if((f|0)>=F[a+12>>2]){break l}f=f+F[a+20>>2]|0}F[e>>2]=f}d=d+1|0;if((d|0)<F[a+8>>2]){continue}break}}j=j+1|0;if((n|0)!=(j|0)){continue}break}}Z=g+32|0;return 1}ta();v()}function Vh(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;g=Z-32|0;Z=g;F[a+68>>2]=f;d=F[a+56>>2];e=F[d>>2];d=F[d+4>>2];F[g+24>>2]=0;F[g+16>>2]=0;F[g+20>>2]=0;a:{d=d-e|0;if((d|0)>0){m=a+60|0;d=d>>>2|0;n=d>>>0<=1?1:d;o=a+112|0;while(1){e=F[a+56>>2];d=F[e>>2];if(F[e+4>>2]-d>>2>>>0<=j>>>0){break a}Kb(m,F[d+(j<<2)>>2],g+16|0);i=F[g+20>>2];d=i>>31;h=F[g+16>>2];e=h>>31;f=(d^i)-d+((e^h)-e)|0;k=F[g+24>>2];d=k>>31;e=(d^k)-d|0;d=0;l=e;e=e+f|0;d=l>>>0>e>>>0?1:d;b:{if(!(d|e)){F[g+16>>2]=F[a+108>>2];break b}f=F[a+108>>2];l=f>>31;h=li(ki(f,l,h,h>>31),_,e,d);F[g+16>>2]=h;d=li(ki(f,l,i,i>>31),_,e,d);F[g+20>>2]=d;e=d;d=d>>31;e=(e^d)-d|0;d=h>>31;d=e+((d^h)-d|0)|0;if((k|0)>=0){F[g+24>>2]=f-d;break b}F[g+24>>2]=d-f}d=wa(o);f=F[g+16>>2];c:{if(d){F[g+24>>2]=0-F[g+24>>2];e=0-F[g+20>>2]|0;F[g+20>>2]=e;f=0-f|0;F[g+16>>2]=f;break c}e=F[g+20>>2]}d:{if((f|0)>=0){f=F[a+108>>2];d=f+F[g+24>>2]|0;f=e+f|0;break d}e:{if((e|0)<0){d=F[g+24>>2];f=d>>31;f=(d^f)-f|0;break e}d=F[g+24>>2];f=d>>31;f=F[a+100>>2]+(f-(d^f)|0)|0}if((d|0)<0){d=e>>31;d=(d^e)-d|0;break d}d=e>>31;d=F[a+100>>2]+(d-(d^e)|0)|0}e=F[a+100>>2];f:{if(!(d|f)){d=e;f=d;break f}if(!((d|0)!=(e|0)|f)){f=d;break f}if(!((e|0)!=(f|0)|d)){d=f;break f}g:{if(f){break g}i=F[a+108>>2];if((i|0)>=(d|0)){break g}d=(i<<1)-d|0;f=0;break f}h:{if((e|0)!=(f|0)){break h}i=F[a+108>>2];if((i|0)<=(d|0)){break h}d=(i<<1)-d|0;break f}i:{if((d|0)!=(e|0)){break i}e=F[a+108>>2];if((e|0)<=(f|0)){break i}f=(e<<1)-f|0;break f}if(d){break f}d=0;e=F[a+108>>2];if((e|0)>=(f|0)){break f}f=(e<<1)-f|0}F[g+12>>2]=d;F[g+8>>2]=f;j:{if(F[a+8>>2]<=0){break j}i=F[a+32>>2];f=0;while(1){d=f<<2;e=F[d+(g+8|0)>>2];h=F[a+16>>2];k:{if((e|0)>(h|0)){F[d+i>>2]=h;break k}d=d+i|0;h=F[a+12>>2];if((h|0)>(e|0)){F[d>>2]=h;break k}F[d>>2]=e}f=f+1|0;e=F[a+8>>2];if((f|0)<(e|0)){continue}break}d=0;if((e|0)<=0){break j}e=j<<3;h=e+c|0;k=b+e|0;while(1){f=d<<2;e=f+h|0;f=F[f+k>>2]+F[f+i>>2]|0;F[e>>2]=f;l:{if((f|0)>F[a+16>>2]){f=f-F[a+20>>2]|0}else{if((f|0)>=F[a+12>>2]){break l}f=f+F[a+20>>2]|0}F[e>>2]=f}d=d+1|0;if((d|0)<F[a+8>>2]){continue}break}}j=j+1|0;if((n|0)!=(j|0)){continue}break}}Z=g+32|0;return 1}ta();v()}function $a(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;h=Z-32|0;Z=h;a:{b:{if(F[a+8>>2]<<5>>>0>=b>>>0){break b}if((b|0)<0){break a}b=(b-1>>>5|0)+1|0;c=ka(b<<2);F[h+24>>2]=b;F[h+20>>2]=0;F[h+16>>2]=c;b=F[a>>2];F[h+12>>2]=0;F[h+8>>2]=b;c=F[a+4>>2];F[h+4>>2]=c&31;F[h>>2]=b+(c>>>3&536870908);e=Z-32|0;Z=e;i=F[h+4>>2];g=F[h+12>>2];j=F[h>>2];d=F[h+8>>2];b=(i-g|0)+(j-d<<3)|0;f=F[h+20>>2];c=b+f|0;F[h+20>>2]=c;if(!((c-1^f-1)>>>0<32?f:0)){F[F[h+16>>2]+((c>>>0>=33?c-1>>>5|0:0)<<2)>>2]=0}c=F[h+16>>2]+(f>>>3&536870908)|0;f=f&31;c:{if((f|0)==(g|0)){if((b|0)<=0){break c}if(g){i=32-g|0;f=(b|0)<(i|0)?b:i;i=-1<<g&-1>>>i-f;F[c>>2]=F[c>>2]&(i^-1)|i&F[d>>2];d=d+4|0;c=(g+f>>>3&536870908)+c|0;b=b-f|0}g=(b|0)/32|0;if(b+31>>>0>=63){pa(c,d,g<<2)}b=b-(g<<5)|0;if((b|0)<=0){break c}f=c;c=g<<2;g=f+c|0;b=-1>>>32-b|0;F[g>>2]=F[g>>2]&(b^-1)|b&F[c+d>>2];break c}F[e+28>>2]=g;F[e+24>>2]=d;F[e+20>>2]=i;F[e+16>>2]=j;F[e+12>>2]=f;F[e+8>>2]=c;b=F[e+28>>2];c=F[e+24>>2];g=(F[e+20>>2]-b|0)+(F[e+16>>2]-c<<3)|0;d:{if((g|0)<=0){b=F[e+12>>2];d=F[e+8>>2];break d}e:{if(!b){b=F[e+12>>2];break e}d=F[e+12>>2];j=32-d|0;k=32-b|0;f=(g|0)<(k|0)?g:k;i=f>>>0>j>>>0?j:f;l=F[e+8>>2];m=F[l>>2]&(-1<<d&-1>>>j-i^-1);j=F[c>>2]&(-1<<b&-1>>>k-f);F[l>>2]=m|(b>>>0<d>>>0?j<<d-b:j>>>b-d|0);c=d+i|0;b=c&31;F[e+12>>2]=b;d=l+(c>>>3&536870908)|0;F[e+8>>2]=d;c=f-i|0;if((c|0)>0){F[d>>2]=F[d>>2]&(-1>>>32-c^-1)|j>>>i+F[e+28>>2];F[e+12>>2]=c;b=c}g=g-f|0;c=F[e+24>>2]+4|0;F[e+24>>2]=c}i=-1<<b;f=32-b|0;if((g|0)>=32){j=i^-1;while(1){d=F[e+8>>2];c=F[c>>2];F[d>>2]=j&F[d>>2]|c<<b;F[e+8>>2]=d+4;F[d+4>>2]=i&F[d+4>>2]|c>>>f;c=F[e+24>>2]+4|0;F[e+24>>2]=c;d=g>>>0>63;g=g-32|0;if(d){continue}break}}d=F[e+8>>2];if((g|0)<=0){break d}j=f;f=(g|0)>(f|0)?f:g;j=F[d>>2]&(i&-1>>>j-f^-1);i=F[c>>2]&-1>>>32-g;F[d>>2]=j|i<<b;b=b+f|0;c=b&31;F[e+12>>2]=c;d=(b>>>3&536870908)+d|0;F[e+8>>2]=d;b=g-f|0;if((b|0)<=0){b=c;break d}F[d>>2]=F[d>>2]&(-1>>>32-b^-1)|i>>>f;F[e+12>>2]=b}F[e+4>>2]=b;F[e>>2]=d}Z=e+32|0;b=F[a>>2];F[a>>2]=F[h+16>>2];F[h+16>>2]=b;c=F[a+4>>2];F[a+4>>2]=F[h+20>>2];F[h+20>>2]=c;c=F[a+8>>2];F[a+8>>2]=F[h+24>>2];F[h+24>>2]=c;if(!b){break b}ja(b)}Z=h+32|0;return}na();v()}function xc(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;n=$[F[F[a>>2]+44>>2]](a)|0;a:{if((n|0)<=0){break a}i=F[b+4>>2]-F[b>>2]>>2;e=Z+-64|0;Z=e;f=kb(e);d=L(F[2541],n);cc(f,F[F[a+8>>2]+56>>2],n&255,5,0,d,d>>31);f=bc(ka(96),f);D[f+84|0]=1;F[f+72>>2]=F[f+68>>2];ac(f,i);F[f+60>>2]=F[F[a+8>>2]+60>>2];d=F[a+16>>2];F[a+16>>2]=f;if(d){xa(d)}Z=e- -64|0;h=F[a+16>>2];if(!F[h+80>>2]){break a}j=F[F[h>>2]>>2];if(!j){break a}m=F[c+12>>2];e=m;d=F[c+20>>2];g=F[c+8>>2];k=F[c+16>>2];if((e|0)<=(d|0)&g>>>0<=k>>>0|(d|0)>(e|0)){break a}l=L(i,n);i=j+F[h+48>>2]|0;h=F[c>>2];j=G[h+k|0];e=k+1|0;f=e?d:d+1|0;F[c+16>>2]=e;F[c+20>>2]=f;b:{c:{if(j){if(mc(l,n,c,i)){break c}break a}if((f|0)>=(m|0)&e>>>0>=g>>>0|(f|0)>(m|0)){break a}g=G[e+h|0];f=k+2|0;d=f>>>0<2?d+1|0:d;F[c+16>>2]=f;F[c+20>>2]=d;d=F[F[a+16>>2]+64>>2];d=F[d+4>>2]-F[d>>2]|0;if((g|0)==F[2541]){e=l<<2;if(e>>>0>d>>>0){break a}g=F[c+8>>2];k=F[c+12>>2];j=F[c+20>>2];d=F[c+16>>2];f=e+d|0;j=f>>>0<e>>>0?j+1|0:j;if(f>>>0>g>>>0&(j|0)>=(k|0)|(j|0)>(k|0)){break a}la(i,d+F[c>>2]|0,e);f=F[c+20>>2];d=e+F[c+16>>2]|0;f=d>>>0<e>>>0?f+1|0:f;F[c+16>>2]=d;F[c+20>>2]=f;break c}if(d>>>0<L(g,l)>>>0){break a}d=F[c+8>>2];f=F[c+16>>2];e=d-f|0;m=d>>>0<f>>>0;d=F[c+20>>2];k=F[c+12>>2]-(m+d|0)|0;m=ki(g,0,l,0)>>>0>e>>>0;e=_;if(m&(e|0)>=(k|0)|(e|0)>(k|0)){break a}e=1;if(!l){break b}h=0;while(1){k=F[c+8>>2];j=F[c+12>>2];e=f+g|0;d=e>>>0<g>>>0?d+1|0:d;if(e>>>0>k>>>0&(d|0)>=(j|0)|(d|0)>(j|0)){return 0}la(i+(h<<2)|0,F[c>>2]+f|0,g);d=F[c+20>>2];f=g+F[c+16>>2]|0;d=f>>>0<g>>>0?d+1|0:d;F[c+16>>2]=f;F[c+20>>2]=d;h=h+1|0;if((l|0)!=(h|0)){continue}break}}e=1;if(!l){break b}d=F[a+20>>2];if(d){e=0;if($[F[F[d>>2]+32>>2]](d)|0){break b}}g=0;h=0;d:{if((l|0)<=0){break d}if((l|0)!=1){f=l&-2;while(1){e=g<<2;d=F[e+i>>2];F[e+i>>2]=0-(d&1)^d>>>1;d=e|4;e=F[d+i>>2];F[d+i>>2]=0-(e&1)^e>>>1;g=g+2|0;h=h+2|0;if((f|0)!=(h|0)){continue}break}}if(!(l&1)){break d}d=g<<2;f=F[d+i>>2];F[d+i>>2]=0-(f&1)^f>>>1}e=0}d=e;f=F[a+20>>2];e:{if(!f){break e}if(!($[F[F[f>>2]+40>>2]](f,c)|0)){break a}if(d){break e}a=F[a+20>>2];if(!($[F[F[a>>2]+44>>2]](a,i,i,l,n,F[b>>2])|0)){break a}}o=1}return o|0}function Lh(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;g=Z-48|0;Z=g;d=F[a+8>>2];if(d-2>>>0<=28){F[a+76>>2]=d;e=-1<<d;d=-2-e|0;F[a+84>>2]=d;F[a+80>>2]=e^-1;F[a+92>>2]=(d|0)/2;J[a+88>>2]=M(2)/M(d|0)}F[a+52>>2]=f;d=F[a+40>>2];e=F[d>>2];d=F[d+4>>2];F[g+16>>2]=0;F[g+8>>2]=0;F[g+12>>2]=0;a:{d=d-e|0;if((d|0)>0){m=a+8|0;n=a+44|0;d=d>>>2|0;o=d>>>0<=1?1:d;p=a+96|0;while(1){e=F[a+40>>2];d=F[e>>2];if(F[e+4>>2]-d>>2>>>0<=j>>>0){break a}Mb(n,F[d+(j<<2)>>2],g+8|0);h=F[g+12>>2];d=h>>31;i=F[g+8>>2];e=i>>31;f=(d^h)-d+((e^i)-e)|0;l=F[g+16>>2];d=l>>31;e=(d^l)-d|0;d=0;k=e;e=e+f|0;d=k>>>0>e>>>0?1:d;b:{if(!(d|e)){F[g+8>>2]=F[a+92>>2];break b}f=F[a+92>>2];k=f>>31;i=li(ki(f,k,i,i>>31),_,e,d);F[g+8>>2]=i;d=li(ki(f,k,h,h>>31),_,e,d);F[g+12>>2]=d;e=d>>31;e=(d^e)-e|0;d=i>>31;d=e+((d^i)-d|0)|0;if((l|0)>=0){F[g+16>>2]=f-d;break b}F[g+16>>2]=d-f}d=wa(p);f=F[g+8>>2];c:{if(d){F[g+16>>2]=0-F[g+16>>2];e=0-F[g+12>>2]|0;F[g+12>>2]=e;f=0-f|0;F[g+8>>2]=f;break c}e=F[g+12>>2]}d:{if((f|0)>=0){f=F[a+92>>2];d=f+F[g+16>>2]|0;f=e+f|0;break d}e:{if((e|0)<0){d=F[g+16>>2];f=d>>31;f=(d^f)-f|0;break e}d=F[g+16>>2];f=d>>31;f=F[a+84>>2]+(f-(d^f)|0)|0}if((d|0)<0){d=e>>31;d=(d^e)-d|0;break d}d=e>>31;d=F[a+84>>2]+(d-(d^e)|0)|0}e=F[a+84>>2];f:{if(!(d|f)){d=e;f=d;break f}if(!((d|0)!=(e|0)|f)){f=d;break f}if(!((e|0)!=(f|0)|d)){d=f;break f}g:{if(f){break g}h=F[a+92>>2];if((h|0)>=(d|0)){break g}d=(h<<1)-d|0;f=0;break f}h:{if((e|0)!=(f|0)){break h}h=F[a+92>>2];if((h|0)<=(d|0)){break h}d=(h<<1)-d|0;break f}i:{if((d|0)!=(e|0)){break i}e=F[a+92>>2];if((e|0)<=(f|0)){break i}f=(e<<1)-f|0;break f}if(d){break f}d=0;e=F[a+92>>2];if((e|0)>=(f|0)){break f}f=(e<<1)-f|0}e=j<<3;h=e+b|0;i=F[h>>2];h=F[h+4>>2];F[g+36>>2]=d;F[g+32>>2]=f;F[g+24>>2]=i;F[g+28>>2]=h;Jb(g+40|0,m,g+32|0,g+24|0);d=c+e|0;F[d>>2]=F[g+40>>2];F[d+4>>2]=F[g+44>>2];j=j+1|0;if((o|0)!=(j|0)){continue}break}}Z=g+48|0;return 1}ta();v()}function Hh(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;g=Z-48|0;Z=g;d=F[a+8>>2];if(d-2>>>0<=28){F[a+76>>2]=d;e=-1<<d;d=-2-e|0;F[a+84>>2]=d;F[a+80>>2]=e^-1;F[a+92>>2]=(d|0)/2;J[a+88>>2]=M(2)/M(d|0)}F[a+52>>2]=f;d=F[a+40>>2];e=F[d>>2];d=F[d+4>>2];F[g+16>>2]=0;F[g+8>>2]=0;F[g+12>>2]=0;a:{d=d-e|0;if((d|0)>0){m=a+8|0;n=a+44|0;d=d>>>2|0;o=d>>>0<=1?1:d;p=a+96|0;while(1){e=F[a+40>>2];d=F[e>>2];if(F[e+4>>2]-d>>2>>>0<=j>>>0){break a}Kb(n,F[d+(j<<2)>>2],g+8|0);h=F[g+12>>2];d=h>>31;i=F[g+8>>2];e=i>>31;f=(d^h)-d+((e^i)-e)|0;l=F[g+16>>2];d=l>>31;e=(d^l)-d|0;d=0;k=e;e=e+f|0;d=k>>>0>e>>>0?1:d;b:{if(!(d|e)){F[g+8>>2]=F[a+92>>2];break b}f=F[a+92>>2];k=f>>31;i=li(ki(f,k,i,i>>31),_,e,d);F[g+8>>2]=i;d=li(ki(f,k,h,h>>31),_,e,d);F[g+12>>2]=d;e=d>>31;e=(d^e)-e|0;d=i>>31;d=e+((d^i)-d|0)|0;if((l|0)>=0){F[g+16>>2]=f-d;break b}F[g+16>>2]=d-f}d=wa(p);f=F[g+8>>2];c:{if(d){F[g+16>>2]=0-F[g+16>>2];e=0-F[g+12>>2]|0;F[g+12>>2]=e;f=0-f|0;F[g+8>>2]=f;break c}e=F[g+12>>2]}d:{if((f|0)>=0){f=F[a+92>>2];d=f+F[g+16>>2]|0;f=e+f|0;break d}e:{if((e|0)<0){d=F[g+16>>2];f=d>>31;f=(d^f)-f|0;break e}d=F[g+16>>2];f=d>>31;f=F[a+84>>2]+(f-(d^f)|0)|0}if((d|0)<0){d=e>>31;d=(d^e)-d|0;break d}d=e>>31;d=F[a+84>>2]+(d-(d^e)|0)|0}e=F[a+84>>2];f:{if(!(d|f)){d=e;f=d;break f}if(!((d|0)!=(e|0)|f)){f=d;break f}if(!((e|0)!=(f|0)|d)){d=f;break f}g:{if(f){break g}h=F[a+92>>2];if((h|0)>=(d|0)){break g}d=(h<<1)-d|0;f=0;break f}h:{if((e|0)!=(f|0)){break h}h=F[a+92>>2];if((h|0)<=(d|0)){break h}d=(h<<1)-d|0;break f}i:{if((d|0)!=(e|0)){break i}e=F[a+92>>2];if((e|0)<=(f|0)){break i}f=(e<<1)-f|0;break f}if(d){break f}d=0;e=F[a+92>>2];if((e|0)>=(f|0)){break f}f=(e<<1)-f|0}e=j<<3;h=e+b|0;i=F[h>>2];h=F[h+4>>2];F[g+36>>2]=d;F[g+32>>2]=f;F[g+24>>2]=i;F[g+28>>2]=h;Jb(g+40|0,m,g+32|0,g+24|0);d=c+e|0;F[d>>2]=F[g+40>>2];F[d+4>>2]=F[g+44>>2];j=j+1|0;if((o|0)!=(j|0)){continue}break}}Z=g+48|0;return 1}ta();v()}function Nd(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;a:{if(!H[b+38>>1]){break a}if(!Ta(1,a+12|0,b)){break a}d=F[b+8>>2];e=F[b+16>>2];g=d-e|0;f=F[a+12>>2];d=F[b+12>>2]-(F[b+20>>2]+(d>>>0<e>>>0)|0)|0;if(g>>>0<f>>>6>>>0&(d|0)<=0|(d|0)<0){break a}d=F[a>>2];c=F[a+4>>2]-d>>2;b:{if(c>>>0<f>>>0){qa(a,f-c|0);f=F[a+12>>2];break b}if(c>>>0<=f>>>0){break b}F[a+4>>2]=d+(f<<2)}if(!f){return 1}d=F[b+16>>2];c=F[b+20>>2];l=F[a>>2];j=F[b+8>>2];i=F[b+12>>2];g=0;while(1){if((c|0)>=(i|0)&d>>>0>=j>>>0|(c|0)>(i|0)){return 0}m=F[b>>2];k=G[m+d|0];d=d+1|0;c=d?c:c+1|0;F[b+16>>2]=d;F[b+20>>2]=c;e=k>>>2|0;h=0;c:{d:{e:{f:{n=k&3;switch(n|0){case 3:break f;case 0:break d;default:break e}}e=e+g|0;if(e>>>0>=f>>>0){return 0}ma(l+(g<<2)|0,0,(k&252)+4|0);g=e;break c}while(1){if((d|0)==(j|0)&(c|0)==(i|0)){break a}f=G[d+m|0];d=d+1|0;c=d?c:c+1|0;F[b+16>>2]=d;F[b+20>>2]=c;e=f<<(h<<3|6)|e;h=h+1|0;if((n|0)!=(h|0)){continue}break}}F[l+(g<<2)>>2]=e}f=F[a+12>>2];g=g+1|0;if(f>>>0>g>>>0){continue}break}b=a+16|0;j=F[a>>2];d=F[a+16>>2];c=F[a+20>>2]-d|0;g:{if(c>>>0<=16383){qa(b,4096-(c>>>2|0)|0);break g}if((c|0)==16384){break g}F[a+20>>2]=d+16384}c=a+28|0;g=F[c>>2];d=F[a+32>>2]-g>>3;h:{if(d>>>0<f>>>0){_a(c,f-d|0);g=F[c>>2];break h}if(d>>>0>f>>>0){F[a+32>>2]=(f<<3)+g}if(!f){break a}}d=F[b>>2];b=0;a=0;while(1){c=j+(b<<2)|0;h=F[c>>2];e=a;i=(b<<3)+g|0;F[i+4>>2]=a;F[i>>2]=h;c=F[c>>2];a=c+a|0;if(a>>>0>4096){break a}i:{if(a>>>0<=e>>>0){break i}h=0;i=c&7;if(i){while(1){F[d+(e<<2)>>2]=b;e=e+1|0;h=h+1|0;if((i|0)!=(h|0)){continue}break}}if(c-1>>>0<=6){break i}while(1){c=d+(e<<2)|0;F[c>>2]=b;F[c+28>>2]=b;F[c+24>>2]=b;F[c+20>>2]=b;F[c+16>>2]=b;F[c+12>>2]=b;F[c+8>>2]=b;F[c+4>>2]=b;e=e+8|0;if((e|0)!=(a|0)){continue}break}}b=b+1|0;if((f|0)!=(b|0)){continue}break}o=(a|0)==4096}return o}function qf(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0;f=Z-32|0;Z=f;e=f+8|0;c=Z-80|0;Z=c;a=F[b+36>>2];F[c+72>>2]=F[b+32>>2];F[c+76>>2]=a;d=F[b+28>>2];a=c- -64|0;F[a>>2]=F[b+24>>2];F[a+4>>2]=d;a=F[b+20>>2];F[c+56>>2]=F[b+16>>2];F[c+60>>2]=a;a=F[b+12>>2];F[c+48>>2]=F[b+8>>2];F[c+52>>2]=a;a=F[b+4>>2];F[c+40>>2]=F[b>>2];F[c+44>>2]=a;jc(c+8|0,c+40|0,c+24|0);a=F[c+8>>2];a:{if(a){F[e>>2]=a;a=e+4|0;if(D[c+23|0]>=0){b=c+8|4;e=F[b+4>>2];F[a>>2]=F[b>>2];F[a+4>>2]=e;F[a+8>>2]=F[b+8>>2];break a}ra(a,F[c+12>>2],F[c+16>>2]);if(D[c+23|0]>=0){break a}ja(F[c+12>>2]);break a}if(D[c+23|0]<0){ja(F[c+12>>2])}a=G[c+31|0];if(a>>>0>=2){b=ka(32);D[b+26|0]=0;a=G[1475]|G[1476]<<8;D[b+24|0]=a;D[b+25|0]=a>>>8;a=G[1471]|G[1472]<<8|(G[1473]<<16|G[1474]<<24);d=G[1467]|G[1468]<<8|(G[1469]<<16|G[1470]<<24);D[b+16|0]=d;D[b+17|0]=d>>>8;D[b+18|0]=d>>>16;D[b+19|0]=d>>>24;D[b+20|0]=a;D[b+21|0]=a>>>8;D[b+22|0]=a>>>16;D[b+23|0]=a>>>24;a=G[1463]|G[1464]<<8|(G[1465]<<16|G[1466]<<24);d=G[1459]|G[1460]<<8|(G[1461]<<16|G[1462]<<24);D[b+8|0]=d;D[b+9|0]=d>>>8;D[b+10|0]=d>>>16;D[b+11|0]=d>>>24;D[b+12|0]=a;D[b+13|0]=a>>>8;D[b+14|0]=a>>>16;D[b+15|0]=a>>>24;a=G[1455]|G[1456]<<8|(G[1457]<<16|G[1458]<<24);d=G[1451]|G[1452]<<8|(G[1453]<<16|G[1454]<<24);D[b|0]=d;D[b+1|0]=d>>>8;D[b+2|0]=d>>>16;D[b+3|0]=d>>>24;D[b+4|0]=a;D[b+5|0]=a>>>8;D[b+6|0]=a>>>16;D[b+7|0]=a>>>24;F[c+8>>2]=-1;a=c+8|4;ra(a,b,26);d=D[c+23|0];F[e>>2]=F[c+8>>2];e=e+4|0;if((d|0)>=0){d=F[a+4>>2];F[e>>2]=F[a>>2];F[e+4>>2]=d;F[e+8>>2]=F[a+8>>2];ja(b);break a}ra(e,F[c+12>>2],F[c+16>>2]);if(D[c+23|0]<0){ja(F[c+12>>2])}ja(b);break a}F[e>>2]=0;F[e+4>>2]=0;F[e+16>>2]=a;F[e+8>>2]=0;F[e+12>>2]=0}Z=c+80|0;a=F[f+24>>2];if(D[f+23|0]<0){ja(F[f+12>>2])}Z=f+32|0;return a|0}function Ph(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0;e=Z-32|0;Z=e;a:{if((c|0)!=3){break a}c=F[a+4>>2];f=F[a+12>>2];F[e+24>>2]=-1;F[e+16>>2]=-1;F[e+20>>2]=1065353216;F[e+8>>2]=-1;F[e+12>>2]=-1;if((b|0)==-2){break a}i=F[F[F[c+4>>2]+8>>2]+(f<<2)>>2];if(($[F[F[c>>2]+8>>2]](c)|0)==1){h=F[F[F[c+4>>2]+8>>2]+(f<<2)>>2];b:{if(($[F[F[c>>2]+8>>2]](c)|0)!=1|b-1>>>0>5){break b}g=$[F[F[c>>2]+36>>2]](c)|0;a=$[F[F[c>>2]+44>>2]](c,f)|0;if(!g|!a){break b}f=$[F[F[c>>2]+40>>2]](c,f)|0;c:{if(f){if((b|0)!=6){break b}b=F[c+44>>2];d=ka(112);F[d+4>>2]=h;c=F[e+12>>2];F[d+8>>2]=F[e+8>>2];F[d+12>>2]=c;c=F[e+20>>2];F[d+16>>2]=F[e+16>>2];F[d+20>>2]=c;F[d+24>>2]=F[e+24>>2];F[d+40>>2]=a;c=a+12|0;F[d+36>>2]=c;F[d+32>>2]=f;F[d+28>>2]=b;F[d+68>>2]=a;F[d- -64>>2]=c;F[d+60>>2]=f;F[d+56>>2]=b;F[d+48>>2]=0;F[d+52>>2]=0;F[d>>2]=5928;F[d+88>>2]=1065353216;F[d+92>>2]=-1;F[d+80>>2]=-1;F[d+84>>2]=-1;F[d+72>>2]=1;F[d+76>>2]=-1;F[d+44>>2]=6492;a=d+96|0;break c}if((b|0)!=6){break b}b=F[c+44>>2];d=ka(112);F[d+4>>2]=h;c=F[e+12>>2];F[d+8>>2]=F[e+8>>2];F[d+12>>2]=c;c=F[e+20>>2];F[d+16>>2]=F[e+16>>2];F[d+20>>2]=c;F[d+24>>2]=F[e+24>>2];F[d+40>>2]=a;c=a+12|0;F[d+36>>2]=c;F[d+32>>2]=g;F[d+28>>2]=b;F[d+68>>2]=a;F[d- -64>>2]=c;F[d+60>>2]=g;F[d+56>>2]=b;F[d+48>>2]=0;F[d+52>>2]=0;F[d>>2]=6932;F[d+88>>2]=1065353216;F[d+92>>2]=-1;F[d+80>>2]=-1;F[d+84>>2]=-1;F[d+72>>2]=1;F[d+76>>2]=-1;F[d+44>>2]=7352;a=d+96|0}F[a>>2]=0;F[a+4>>2]=0;D[a+5|0]=0;D[a+6|0]=0;D[a+7|0]=0;D[a+8|0]=0;D[a+9|0]=0;D[a+10|0]=0;D[a+11|0]=0;D[a+12|0]=0}if(d){break a}}d=ka(28);F[d+4>>2]=i;a=F[e+12>>2];F[d+8>>2]=F[e+8>>2];F[d+12>>2]=a;a=F[e+20>>2];F[d+16>>2]=F[e+16>>2];F[d+20>>2]=a;F[d+24>>2]=F[e+24>>2];F[d>>2]=7764}Z=e+32|0;return d|0}function $c(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;f=Z-80|0;Z=f;a:{if(!Wb(1,f+76|0,b)){break a}k=F[f+76>>2];if(!k){break a}c=F[b+8>>2];e=F[b+16>>2];c=ki(c-e|0,F[b+12>>2]-(F[b+20>>2]+(c>>>0<e>>>0)|0)|0,5,0);e=_;if(c>>>0<k>>>0&(e|0)<=0|(e|0)<0){break a}c=F[a+4>>2];d=F[a+8>>2]-c>>2;b:{if(d>>>0<k>>>0){qa(a+4|0,k-d|0);break b}if(d>>>0<=k>>>0){break b}F[a+8>>2]=c+(k<<2)}p=a+16|0;l=F[a+32>>2];while(1){g=F[b+12>>2];c=g;d=F[b+20>>2];h=F[b+8>>2];e=F[b+16>>2];if((c|0)<=(d|0)&h>>>0<=e>>>0|(c|0)<(d|0)){d=0;break a}m=F[b>>2];q=G[m+e|0];c=d;i=e+1|0;c=i?c:c+1|0;F[b+16>>2]=i;F[b+20>>2]=c;if(h>>>0<=i>>>0&(c|0)>=(g|0)|(c|0)>(g|0)){d=0;break a}i=G[i+m|0];c=d;j=e+2|0;c=j>>>0<2?c+1|0:c;F[b+16>>2]=j;F[b+20>>2]=c;if(h>>>0<=j>>>0&(c|0)>=(g|0)|(c|0)>(g|0)){d=0;break a}j=G[j+m|0];c=d;n=e+3|0;c=n>>>0<3?c+1|0:c;F[b+16>>2]=n;F[b+20>>2]=c;if(h>>>0<=n>>>0&(c|0)>=(g|0)|(c|0)>(g|0)){d=0;break a}h=G[m+n|0];c=d;d=e+4|0;c=d>>>0<4?c+1|0:c;F[b+16>>2]=d;F[b+20>>2]=c;if(q>>>0>4){d=0;break a}if((i-12&255)>>>0<245){d=0;break a}if(!j){d=0;break a}c=kb(f+8|0);g=(h|0)!=0;d=i-1|0;if(d>>>0<=10){d=F[(d<<2)+10148>>2]}else{d=-1}d=L(d,j);cc(c,q,j,i,g,d,d>>31);if(Wb(1,f+4|0,b)){e=F[f+4>>2];F[f+68>>2]=e;d=bc(ka(96),c);$[F[F[l>>2]+8>>2]](l,F[l+12>>2]-F[l+8>>2]>>2,d);d=(F[l+12>>2]-F[l+8>>2]>>2)-1|0;h=d<<2;F[F[h+F[l+8>>2]>>2]+60>>2]=e;F[F[a+4>>2]+(o<<2)>>2]=d;c=F[a+16>>2];e=F[a+20>>2]-c>>2;c:{if((e|0)>(d|0)){break c}F[f>>2]=-1;d=d+1|0;if(d>>>0>e>>>0){Fa(p,d-e|0,f);c=F[p>>2];break c}if(d>>>0>=e>>>0){break c}F[a+20>>2]=(d<<2)+c}F[c+h>>2]=o;d=1;o=o+1|0;if((o|0)!=(k|0)){continue}break a}break}d=0}Z=f+80|0;return d|0}function Oc(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;k=Z-16|0;Z=k;F[k+8>>2]=c;h=F[a+12>>2];d=F[a+8>>2];g=h-d>>2;a:{if((g|0)>(b|0)){break a}e=b+1|0;if(e>>>0>g>>>0){l=e-g|0;f=F[a+16>>2];d=F[a+12>>2];if(l>>>0<=f-d>>2>>>0){if(l){e=d;d=l<<2;d=ma(e,0,d)+d|0}F[a+12>>2]=d;break a}b:{c:{d:{m=F[a+8>>2];g=d-m>>2;i=g+l|0;if(i>>>0<1073741824){e=f-m|0;f=e>>>1|0;e=e>>>0>=2147483644?1073741823:f>>>0>i>>>0?f:i;if(e){if(e>>>0>=1073741824){break d}j=ka(e<<2)}h=(g<<2)+j|0;f=l<<2;i=ma(h,0,f);g=f+i|0;e=(e<<2)+j|0;if((d|0)==(m|0)){break c}while(1){d=d-4|0;f=F[d>>2];F[d>>2]=0;h=h-4|0;F[h>>2]=f;if((d|0)!=(m|0)){continue}break}F[a+16>>2]=e;e=F[a+12>>2];F[a+12>>2]=g;d=F[a+8>>2];F[a+8>>2]=h;if((d|0)==(e|0)){break b}while(1){e=e-4|0;f=F[e>>2];F[e>>2]=0;if(f){xa(f)}if((d|0)!=(e|0)){continue}break}break b}na();v()}oa();v()}F[a+16>>2]=e;F[a+12>>2]=g;F[a+8>>2]=i}if(d){ja(d)}break a}if(e>>>0>=g>>>0){break a}d=d+(e<<2)|0;if((d|0)!=(h|0)){while(1){h=h-4|0;c=F[h>>2];F[h>>2]=0;if(c){xa(c)}if((d|0)!=(h|0)){continue}break}c=F[k+8>>2]}F[a+12>>2]=d}e:{f:{d=F[c+56>>2];g:{if((d|0)>4){break g}j=L(d,12)+a|0;d=F[j+24>>2];if((d|0)!=F[j+28>>2]){F[d>>2]=b;F[j+24>>2]=d+4;break g}i=F[j+20>>2];g=d-i|0;f=g>>2;e=f+1|0;if(e>>>0>=1073741824){break f}d=g>>>1|0;e=g>>>0>=2147483644?1073741823:d>>>0>e>>>0?d:e;if(e){if(e>>>0>=1073741824){break e}d=ka(e<<2)}else{d=0}f=d+(f<<2)|0;F[f>>2]=b;d=pa(d,i,g);F[j+20>>2]=d;F[j+24>>2]=f+4;F[j+28>>2]=d+(e<<2);if(!i){break g}ja(i)}F[c+60>>2]=b;a=F[a+8>>2];F[k+8>>2]=0;a=a+(b<<2)|0;b=F[a>>2];F[a>>2]=c;if(b){xa(b)}a=F[k+8>>2];F[k+8>>2]=0;if(a){xa(a)}Z=k+16|0;return}na();v()}oa();v()}function Pf(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;i=c;d=a;a:{if(F[a+12>>2]==(b|0)){break a}a=b;b=F[d+4>>2];e=F[d>>2];if((b|0)!=(e|0)){while(1){c=b-12|0;if(D[b-1|0]<0){ja(F[c>>2])}b=c;if((e|0)!=(b|0)){continue}break}}F[d+12>>2]=a;F[d+4>>2]=e;c=F[a>>2];j=a+4|0;if((c|0)==(j|0)){break a}while(1){a=F[d+4>>2];b:{if((a|0)!=F[d+8>>2]){c:{if(D[c+27|0]>=0){b=F[c+20>>2];F[a>>2]=F[c+16>>2];F[a+4>>2]=b;F[a+8>>2]=F[c+24>>2];break c}ra(a,F[c+16>>2],F[c+20>>2])}F[d+4>>2]=a+12;break b}g=0;d:{e:{f:{a=F[d+4>>2];e=F[d>>2];f=(a-e|0)/12|0;b=f+1|0;if(b>>>0<357913942){h=(F[d+8>>2]-e|0)/12|0;k=h<<1;b=h>>>0>=178956970?357913941:b>>>0<k>>>0?k:b;if(b){if(b>>>0>=357913942){break f}g=ka(L(b,12))}h=L(b,12);b=L(f,12)+g|0;g:{if(D[c+27|0]>=0){f=F[c+20>>2];F[b>>2]=F[c+16>>2];F[b+4>>2]=f;F[b+8>>2]=F[c+24>>2];break g}ra(b,F[c+16>>2],F[c+20>>2]);e=F[d>>2];a=F[d+4>>2]}g=g+h|0;f=b+12|0;if((a|0)==(e|0)){break e}while(1){a=a-12|0;h=F[a+4>>2];b=b-12|0;F[b>>2]=F[a>>2];F[b+4>>2]=h;F[b+8>>2]=F[a+8>>2];F[a>>2]=0;F[a+4>>2]=0;F[a+8>>2]=0;if((a|0)!=(e|0)){continue}break}F[d+8>>2]=g;a=F[d+4>>2];F[d+4>>2]=f;e=F[d>>2];F[d>>2]=b;if((a|0)==(e|0)){break d}while(1){b=a-12|0;if(D[a-1|0]<0){ja(F[b>>2])}a=b;if((e|0)!=(b|0)){continue}break}break d}na();v()}oa();v()}F[d+8>>2]=g;F[d+4>>2]=f;F[d>>2]=b}if(e){ja(e)}}b=F[c+4>>2];h:{if(b){while(1){a=b;b=F[b>>2];if(b){continue}break h}}while(1){a=F[c+8>>2];b=F[a>>2]!=(c|0);c=a;if(b){continue}break}}c=a;if((j|0)!=(a|0)){continue}break}}a=0;i:{if((i|0)<0){break i}b=F[d>>2];if((F[d+4>>2]-b|0)/12>>>0<=i>>>0){break i}a=b+L(i,12)|0;a=D[a+11|0]<0?F[a>>2]:a}return a|0}function Ad(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;i=Z-16|0;Z=i;F[i>>2]=b;f=-1;a:{if((b|0)==-1){F[i+4>>2]=-1;break a}f=b+1|0;F[i+4>>2]=(f>>>0)%3|0?f:b-2|0;if((b>>>0)%3|0){f=b-1|0;break a}f=b+2|0}F[i+8>>2]=f;n=(b>>>0)/3|0;b:{c:{d:{while(1){e:{f:{j=F[(l<<2)+i>>2];if((j|0)!=-1){f=F[F[F[a+8>>2]+12>>2]+(j<<2)>>2];if((f|0)!=-1){break f}}f=0;g=F[a+216>>2];if((g|0)==F[a+220>>2]){break e}while(1){g=L(f,144)+g|0;d=F[g+136>>2];c=F[g+140>>2];g:{if(d>>>0<c>>>0){F[d>>2]=j;F[g+136>>2]=d+4;break g}e=d;d=F[g+132>>2];k=e-d|0;e=k>>2;h=e+1|0;if(h>>>0>=1073741824){break d}m=e<<2;c=c-d|0;e=c>>>1|0;h=c>>>0>=2147483644?1073741823:h>>>0<e>>>0?e:h;if(h){if(h>>>0>=1073741824){break c}c=ka(h<<2)}else{c=0}e=m+c|0;F[e>>2]=j;c=pa(c,d,k);F[g+132>>2]=c;F[g+136>>2]=e+4;F[g+140>>2]=c+(h<<2);if(!d){break g}ja(d)}f=f+1|0;g=F[a+216>>2];if(f>>>0<(F[a+220>>2]-g|0)/144>>>0){continue}break}break e}if((b|0)==-1|(f>>>0)/3>>>0<n>>>0){break e}f=0;if(F[a+220>>2]==F[a+216>>2]){break e}while(1){h:{if(!wa(F[a+368>>2]+(f<<4)|0)){break h}g=F[a+216>>2]+L(f,144)|0;d=F[g+136>>2];c=F[g+140>>2];if(d>>>0<c>>>0){F[d>>2]=j;F[g+136>>2]=d+4;break h}e=d;d=F[g+132>>2];k=e-d|0;e=k>>2;h=e+1|0;if(h>>>0>=1073741824){break b}m=e<<2;c=c-d|0;e=c>>>1|0;h=c>>>0>=2147483644?1073741823:h>>>0<e>>>0?e:h;if(h){if(h>>>0>=1073741824){break c}c=ka(h<<2)}else{c=0}e=m+c|0;F[e>>2]=j;c=pa(c,d,k);F[g+132>>2]=c;F[g+136>>2]=e+4;F[g+140>>2]=c+(h<<2);if(!d){break h}ja(d)}f=f+1|0;if(f>>>0<(F[a+220>>2]-F[a+216>>2]|0)/144>>>0){continue}break}}l=l+1|0;if((l|0)!=3){continue}break}Z=i+16|0;return 1}na();v()}oa();v()}na();v()}function Bd(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;h=Z-16|0;Z=h;m=-1;a:{b:{c:{if(!Da(1,h+12|0,b)){break c}j=F[h+12>>2];if(j){c=F[a+8>>2];if((F[c+4>>2]-F[c>>2]>>2>>>0)/3>>>0<j>>>0){break c}while(1){if(!Da(1,h+8|0,b)){break c}c=F[h+8>>2];if(!Da(1,h+8|0,b)){break c}g=c+g|0;c=F[h+8>>2];if(g>>>0<c>>>0){break c}e=g-c|0;c=F[a+40>>2];d:{if((c|0)!=F[a+44>>2]){F[c+4>>2]=g;F[c>>2]=e;F[a+40>>2]=c+12;j=F[h+12>>2];break d}d=c;c=F[a+36>>2];l=d-c|0;d=(l|0)/12|0;f=d+1|0;if(f>>>0>=357913942){break b}i=d<<1;f=d>>>0>=178956970?357913941:f>>>0<i>>>0?i:f;if(f){if(f>>>0>=357913942){break a}i=ka(L(f,12))}else{i=0}d=i+L(d,12)|0;F[d+4>>2]=g;F[d>>2]=e;e=pa(d+L((l|0)/-12|0,12)|0,c,l);F[a+44>>2]=i+L(f,12);F[a+40>>2]=d+12;F[a+36>>2]=e;if(!c){break d}ja(c)}k=k+1|0;if(k>>>0<j>>>0){continue}break}g=0;hc(b,0,0);if(j){while(1){c=G[b+36|0];d=H[F[a+4>>2]+36>>1];e:{f:{if(((d<<8|d>>>8)&65535)>>>0<=513){if(!c){break e}e=0;d=F[b+32>>2];k=d>>>3|0;f=F[b+24>>2];c=k+f|0;i=F[b+28>>2];g:{if(c>>>0>=i>>>0){c=d;break g}e=G[c|0];c=d+1|0;F[b+32>>2]=c;k=c>>>3|0;e=e>>>(d&7)&1}if(i>>>0>f+k>>>0){break f}break e}if(!c){break e}e=0;c=F[b+32>>2];d=F[b+24>>2]+(c>>>3|0)|0;if(d>>>0>=I[b+28>>2]){break e}e=G[d|0]>>>(c&7)&1}F[b+32>>2]=c+1}c=F[a+36>>2]+L(g,12)|0;D[c+8|0]=G[c+8|0]&254|e&1;g=g+1|0;if((j|0)!=(g|0)){continue}break}}D[b+36|0]=0;d=F[b+20>>2];a=0;e=F[b+32>>2]+7|0;a=e>>>0<7?1:a;e=a<<29|e>>>3;c=e+F[b+16>>2]|0;a=(a>>>3|0)+d|0;F[b+16>>2]=c;F[b+20>>2]=c>>>0<e>>>0?a+1|0:a}m=F[b+16>>2]}Z=h+16|0;return m}na();v()}oa();v()}function xf(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;m=Z-16|0;Z=m;l=F[b+80>>2];e=G[c+24|0];a=L(l,e);a:{b:{c:{d:{b=F[c+28>>2];if(!(!G[c+84|0]|(b|0)!=1&(b|0)!=2)){b=F[c+48>>2];c=F[F[c>>2]>>2];F[m+8>>2]=0;F[m>>2]=0;F[m+4>>2]=0;if(a){if((a|0)<0){break d}f=ka(a);h=la(f,b+c|0,a)+a|0}a=F[d>>2];if(a){F[d+4>>2]=a;ja(a)}F[d+8>>2]=h;F[d+4>>2]=h;F[d>>2]=f;b=1;break a}if(e){f=ka(e);ma(f,0,e)}e:{i=F[d+4>>2];b=F[d>>2];g=i-b|0;f:{if(g>>>0<a>>>0){k=a-g|0;j=F[d+8>>2];if(k>>>0<=j-i>>>0){n=d,o=ma(i,0,k)+k|0,F[n+4>>2]=o;break f}if((a|0)<0){break e}i=j-b|0;j=i<<1;i=i>>>0>=1073741823?2147483647:a>>>0<j>>>0?j:a;j=ka(i);ma(j+g|0,0,k);g=pa(j,b,g);F[d+8>>2]=g+i;F[d+4>>2]=a+g;F[d>>2]=g;if(!b){break f}ja(b);break f}if(a>>>0>=g>>>0){break f}F[d+4>>2]=a+b}if(!l){b=1;break c}if(!e){b=0;a=0;while(1){if(!Cb(c,G[c+84|0]?a:F[F[c+68>>2]+(a<<2)>>2],D[c+24|0],f)){break c}a=a+1|0;b=l>>>0<=a>>>0;if((a|0)!=(l|0)){continue}break}break c}i=e&252;g=e&3;b=0;j=e>>>0<4;e=0;while(1){if(!Cb(c,G[c+84|0]?e:F[F[c+68>>2]+(e<<2)>>2],D[c+24|0],f)){break c}b=0;a=0;k=0;if(!j){while(1){D[F[d>>2]+h|0]=G[a+f|0];D[(F[d>>2]+h|0)+1|0]=G[(a|1)+f|0];D[(F[d>>2]+h|0)+2|0]=G[(a|2)+f|0];D[(F[d>>2]+h|0)+3|0]=G[(a|3)+f|0];a=a+4|0;h=h+4|0;k=k+4|0;if((i|0)!=(k|0)){continue}break}}if(g){while(1){D[F[d>>2]+h|0]=G[a+f|0];a=a+1|0;h=h+1|0;b=b+1|0;if((g|0)!=(b|0)){continue}break}}e=e+1|0;b=l>>>0<=e>>>0;if((e|0)!=(l|0)){continue}break}break b}na();v()}na();v()}if(!f){break a}}ja(f)}Z=m+16|0;return b&1}function wf(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;m=Z-16|0;Z=m;l=F[b+80>>2];e=G[c+24|0];a=L(l,e);a:{b:{c:{d:{b=F[c+28>>2];if(!(!G[c+84|0]|(b|0)!=1&(b|0)!=2)){b=F[c+48>>2];c=F[F[c>>2]>>2];F[m+8>>2]=0;F[m>>2]=0;F[m+4>>2]=0;if(a){if((a|0)<0){break d}f=ka(a);h=la(f,b+c|0,a)+a|0}a=F[d>>2];if(a){F[d+4>>2]=a;ja(a)}F[d+8>>2]=h;F[d+4>>2]=h;F[d>>2]=f;b=1;break a}if(e){f=ka(e);ma(f,0,e)}e:{i=F[d+4>>2];b=F[d>>2];g=i-b|0;f:{if(g>>>0<a>>>0){k=a-g|0;j=F[d+8>>2];if(k>>>0<=j-i>>>0){n=d,o=ma(i,0,k)+k|0,F[n+4>>2]=o;break f}if((a|0)<0){break e}i=j-b|0;j=i<<1;i=i>>>0>=1073741823?2147483647:a>>>0<j>>>0?j:a;j=ka(i);ma(j+g|0,0,k);g=pa(j,b,g);F[d+8>>2]=g+i;F[d+4>>2]=a+g;F[d>>2]=g;if(!b){break f}ja(b);break f}if(a>>>0>=g>>>0){break f}F[d+4>>2]=a+b}if(!l){b=1;break c}if(!e){b=0;a=0;while(1){if(!Bb(c,G[c+84|0]?a:F[F[c+68>>2]+(a<<2)>>2],D[c+24|0],f)){break c}a=a+1|0;b=l>>>0<=a>>>0;if((a|0)!=(l|0)){continue}break}break c}i=e&252;g=e&3;b=0;j=e>>>0<4;e=0;while(1){if(!Bb(c,G[c+84|0]?e:F[F[c+68>>2]+(e<<2)>>2],D[c+24|0],f)){break c}b=0;a=0;k=0;if(!j){while(1){D[F[d>>2]+h|0]=G[a+f|0];D[(F[d>>2]+h|0)+1|0]=G[(a|1)+f|0];D[(F[d>>2]+h|0)+2|0]=G[(a|2)+f|0];D[(F[d>>2]+h|0)+3|0]=G[(a|3)+f|0];a=a+4|0;h=h+4|0;k=k+4|0;if((i|0)!=(k|0)){continue}break}}if(g){while(1){D[F[d>>2]+h|0]=G[a+f|0];a=a+1|0;h=h+1|0;b=b+1|0;if((g|0)!=(b|0)){continue}break}}e=e+1|0;b=l>>>0<=e>>>0;if((e|0)!=(l|0)){continue}break}break b}na();v()}na();v()}if(!f){break a}}ja(f)}Z=m+16|0;return b&1}function Jb(a,b,c,d){var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;k=F[b+16>>2];h=F[c+4>>2]-k|0;e=F[c>>2]-k|0;F[c>>2]=e;f=h;F[c+4>>2]=f;l=F[b+16>>2];f=f>>31;g=(h^f)-f|0;f=e>>31;m=l>>>0>=g+((f^e)-f|0)>>>0;a:{if(m){f=h;break a}b:{c:{if((e|0)>=0){g=1;j=1;if((h|0)>=0){break b}i=1;g=-1;j=-1;if(e){break c}break b}i=-1;g=-1;j=-1;if((h|0)<=0){break b}}g=(h|0)<=0?-1:1;j=i}n=L(j,l);f=(e<<1)-n|0;i=(L(g,j)|0)>=0;e=L(g,l);f=((i?0-f|0:f)+e|0)/2|0;F[c+4>>2]=f;e=(h<<1)-e|0;e=((i?0-e|0:e)+n|0)/2|0;F[c>>2]=e}d:{e:{f:{g:{h:{i:{j:{if(e){if((e|0)<0){break j}if((f|0)>=0){break i}break f}if(f){break h}j=1;g=0;f=0;i=0;break d}j=1;if((f|0)>0){break g}i=(f|0)>0?3:0;g=f;f=e;break d}g=0-f|0;f=0-e|0;i=2;break e}if((f|0)<=0){break f}}f=0-f|0;g=e;i=3;break e}g=0-e|0;i=1}F[c>>2]=f;F[c+4>>2]=g;j=0}e=F[d>>2]+f|0;h=F[b+16>>2];k:{if((e|0)>(h|0)){e=e-F[b+4>>2]|0;break k}if((0-h|0)<=(e|0)){break k}e=F[b+4>>2]+e|0}c=F[d+4>>2]+g|0;l:{if((h|0)<(c|0)){c=c-F[b+4>>2]|0;break l}if((0-h|0)<=(c|0)){break l}c=F[b+4>>2]+c|0}m:{if(j){b=c;break m}b=c;n:{o:{p:{d=4-i|0;switch((d>>>0<4?d:0-i|0)-1|0){case 2:break n;case 1:break o;case 0:break p;default:break m}}b=0-e|0;e=c;break m}b=0-c|0;e=0-e|0;break m}b=e;e=0-c|0}q:{if(m){c=b;break q}r:{s:{if((e|0)>=0){c=1;f=1;if((b|0)>=0){break r}d=1;c=-1;f=-1;if(e){break s}break r}d=-1;c=-1;f=-1;if((b|0)<=0){break r}}c=(b|0)<=0?-1:1;f=d}d=e<<1;e=L(f,h);d=d-e|0;f=(L(c,f)|0)>=0;g=f?0-d|0:d;d=L(c,h);c=(g+d|0)/2|0;b=(b<<1)-d|0;e=(e+(f?0-b|0:b)|0)/2|0}b=a;F[b>>2]=e+k;F[b+4>>2]=c+k}function Uh(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;F[a+8>>2]=e;m=a+32|0;h=F[m>>2];g=F[a+36>>2]-h>>2;a:{if(g>>>0<e>>>0){qa(m,e-g|0);f=F[a+8>>2];break a}f=e;if(f>>>0>=g>>>0){break a}F[a+36>>2]=h+(e<<2);f=e}g=e>>>0>1073741823?-1:e<<2;n=ma(ka(g),0,g);b:{if((f|0)<=0){break b}h=F[a+32>>2];while(1){f=i<<2;g=F[f+n>>2];j=F[a+16>>2];c:{if((g|0)>(j|0)){F[f+h>>2]=j;break c}f=f+h|0;j=F[a+12>>2];if((j|0)>(g|0)){F[f>>2]=j;break c}F[f>>2]=g}f=F[a+8>>2];i=i+1|0;if((f|0)>(i|0)){continue}break}if((f|0)<=0){break b}i=0;while(1){g=i<<2;f=g+c|0;g=F[b+g>>2]+F[g+h>>2]|0;F[f>>2]=g;d:{if((g|0)>F[a+16>>2]){g=g-F[a+20>>2]|0}else{if((g|0)>=F[a+12>>2]){break d}g=g+F[a+20>>2]|0}F[f>>2]=g}f=F[a+8>>2];i=i+1|0;if((f|0)>(i|0)){continue}break}}if(!((d|0)<=(e|0)|(f|0)<=0)){p=0-e<<2;g=e;while(1){e:{if((f|0)<=0){break e}l=g<<2;o=l+c|0;q=o+p|0;j=F[m>>2];i=0;while(1){f=i<<2;h=F[f+q>>2];k=F[a+16>>2];f:{if((h|0)>(k|0)){F[f+j>>2]=k;break f}f=f+j|0;k=F[a+12>>2];if((k|0)>(h|0)){F[f>>2]=k;break f}F[f>>2]=h}f=F[a+8>>2];i=i+1|0;if((f|0)>(i|0)){continue}break}i=0;if((f|0)<=0){break e}l=b+l|0;while(1){h=i<<2;f=h+o|0;h=F[h+l>>2]+F[h+j>>2]|0;F[f>>2]=h;g:{if((h|0)>F[a+16>>2]){h=h-F[a+20>>2]|0}else{if((h|0)>=F[a+12>>2]){break g}h=h+F[a+20>>2]|0}F[f>>2]=h}f=F[a+8>>2];i=i+1|0;if((f|0)>(i|0)){continue}break}}g=e+g|0;if((g|0)<(d|0)){continue}break}}ja(n);return 1}function yf(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;j=F[b+80>>2];b=G[c+24|0];g=L(j,b);a:{if(!b){break a}h=b<<2;f=ka(h);a=f;k=b&7;if(k){while(1){F[a>>2]=-1073741824;a=a+4|0;e=e+1|0;if((k|0)!=(e|0)){continue}break}}if((b-1&1073741823)>>>0<7){break a}e=f+h|0;while(1){F[a+24>>2]=-1073741824;F[a+28>>2]=-1073741824;F[a+16>>2]=-1073741824;F[a+20>>2]=-1073741824;F[a+8>>2]=-1073741824;F[a+12>>2]=-1073741824;F[a>>2]=-1073741824;F[a+4>>2]=-1073741824;a=a+32|0;if((e|0)!=(a|0)){continue}break}}e=F[d>>2];a=F[d+4>>2]-e>>2;b:{if(a>>>0<g>>>0){qa(d,g-a|0);break b}if(a>>>0<=g>>>0){break b}F[d+4>>2]=e+(g<<2)}c:{d:{e:{if(!j){i=1;break e}if(!b){a=0;while(1){if(!lb(c,G[c+84|0]?a:F[F[c+68>>2]+(a<<2)>>2],D[c+24|0],f)){break e}a=a+1|0;i=j>>>0<=a>>>0;if((a|0)!=(j|0)){continue}break}break e}n=b&252;k=b&3;o=b>>>0<4;e=0;b=0;while(1){if(!lb(c,G[c+84|0]?b:F[F[c+68>>2]+(b<<2)>>2],D[c+24|0],f)){break e}m=F[d>>2];i=0;a=0;l=0;if(!o){while(1){g=(e<<2)+m|0;h=a<<2;J[g>>2]=J[h+f>>2];J[g+4>>2]=J[(h|4)+f>>2];J[g+8>>2]=J[(h|8)+f>>2];J[g+12>>2]=J[(h|12)+f>>2];a=a+4|0;e=e+4|0;l=l+4|0;if((n|0)!=(l|0)){continue}break}}if(k){while(1){J[(e<<2)+m>>2]=J[(a<<2)+f>>2];a=a+1|0;e=e+1|0;i=i+1|0;if((k|0)!=(i|0)){continue}break}}b=b+1|0;i=j>>>0<=b>>>0;if((b|0)!=(j|0)){continue}break}break d}if(!f){break c}}ja(f)}return i|0}function $d(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;k=Z-16|0;Z=k;c=F[b+20>>2];d=F[b+16>>2];e=d+4|0;c=e>>>0<4?c+1|0:c;g=F[b+12>>2];a:{if(I[b+8>>2]<e>>>0&(g|0)<=(c|0)|(c|0)>(g|0)){break a}d=d+F[b>>2]|0;h=G[d|0]|G[d+1|0]<<8|(G[d+2|0]<<16|G[d+3|0]<<24);F[b+16>>2]=e;F[b+20>>2]=c;if((h|0)<0){break a}Na(a+76|0,h);c=k;F[c>>2]=0;F[c+4>>2]=0;D[c+5|0]=0;D[c+6|0]=0;D[c+7|0]=0;D[c+8|0]=0;D[c+9|0]=0;D[c+10|0]=0;D[c+11|0]=0;D[c+12|0]=0;b:{if(!Aa(c,b)){break b}if(h){g=1;while(1){d=1<<i;e=wa(c);f=F[a+76>>2]+(i>>>3&536870908)|0;e=e^g;if(e&1){d=F[f>>2]&(d^-1)}else{d=d|F[f>>2]}g=e^1;F[f>>2]=d;i=i+1|0;if((h|0)!=(i|0)){continue}break}}i=0;c=F[b+8>>2];e=F[b+12>>2];f=e;e=F[b+20>>2];g=e;l=F[b+16>>2];d=l+4|0;e=d>>>0<4?e+1|0:e;h=d;if(d>>>0>c>>>0&(e|0)>=(f|0)|(e|0)>(f|0)){break b}m=F[b>>2];d=m+l|0;j=G[d|0]|G[d+1|0]<<8|(G[d+2|0]<<16|G[d+3|0]<<24);F[b+16>>2]=h;F[b+20>>2]=e;d=c;c=g;e=l+8|0;c=e>>>0<8?c+1|0:c;if(d>>>0<e>>>0&(c|0)>=(f|0)|(c|0)>(f|0)){break b}d=h+m|0;d=G[d|0]|G[d+1|0]<<8|(G[d+2|0]<<16|G[d+3|0]<<24);F[b+16>>2]=e;F[b+20>>2]=c;if((d|0)<(j|0)){break b}F[a+16>>2]=d;F[a+12>>2]=j;c=(d>>31)-((j>>31)+(d>>>0<j>>>0)|0)|0;b=d-j|0;if(!c&b>>>0>2147483646|c){break b}i=1;c=b+1|0;F[a+20>>2]=c;b=c>>>1|0;F[a+24>>2]=b;F[a+28>>2]=0-b;if(c&1){break b}F[a+24>>2]=b-1}}Z=k+16|0;return i|0}function tf(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;a=0;k=Z-16|0;Z=k;j=F[b+80>>2];e=G[c+24|0];b=L(j,e);a:{b:{c:{d:{f=F[c+28>>2];if(!(!G[c+84|0]|(f|0)!=5&(f|0)!=6)){e=F[c+48>>2];c=F[F[c>>2]>>2];F[k+8>>2]=0;F[k>>2]=0;F[k+4>>2]=0;if(b){if((b|0)<0){break d}b=b<<2;a=ka(b);g=la(a,c+e|0,b)+b|0}b=F[d>>2];if(b){F[d+4>>2]=b;ja(b)}F[d+8>>2]=g;F[d+4>>2]=g;F[d>>2]=a;h=1;break a}if(e){f=e<<2;a=ka(f);ma(a,0,f)}i=F[d>>2];f=F[d+4>>2]-i>>2;e:{if(f>>>0<b>>>0){qa(d,b-f|0);break e}if(b>>>0>=f>>>0){break e}F[d+4>>2]=i+(b<<2)}if(!j){h=1;break c}if(!e){b=0;while(1){if(!xb(c,G[c+84|0]?b:F[F[c+68>>2]+(b<<2)>>2],D[c+24|0],a)){break c}b=b+1|0;h=j>>>0<=b>>>0;if((b|0)!=(j|0)){continue}break}break c}o=e&252;m=e&3;p=e>>>0<4;e=0;while(1){if(!xb(c,G[c+84|0]?e:F[F[c+68>>2]+(e<<2)>>2],D[c+24|0],a)){break c}n=F[d>>2];l=0;b=0;h=0;if(!p){while(1){f=(g<<2)+n|0;i=b<<2;F[f>>2]=F[i+a>>2];F[f+4>>2]=F[(i|4)+a>>2];F[f+8>>2]=F[(i|8)+a>>2];F[f+12>>2]=F[(i|12)+a>>2];b=b+4|0;g=g+4|0;h=h+4|0;if((o|0)!=(h|0)){continue}break}}if(m){while(1){F[(g<<2)+n>>2]=F[(b<<2)+a>>2];b=b+1|0;g=g+1|0;l=l+1|0;if((l|0)!=(m|0)){continue}break}}e=e+1|0;h=j>>>0<=e>>>0;if((e|0)!=(j|0)){continue}break}break b}na();v()}if(!a){break a}}ja(a)}Z=k+16|0;return h|0}function cd(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;a=0;k=Z-16|0;Z=k;j=F[b+80>>2];e=G[c+24|0];b=L(j,e);a:{b:{c:{d:{f=F[c+28>>2];if(!(!G[c+84|0]|(f|0)!=5&(f|0)!=6)){e=F[c+48>>2];c=F[F[c>>2]>>2];F[k+8>>2]=0;F[k>>2]=0;F[k+4>>2]=0;if(b){if((b|0)<0){break d}b=b<<2;a=ka(b);g=la(a,c+e|0,b)+b|0}b=F[d>>2];if(b){F[d+4>>2]=b;ja(b)}F[d+8>>2]=g;F[d+4>>2]=g;F[d>>2]=a;h=1;break a}if(e){f=e<<2;a=ka(f);ma(a,0,f)}i=F[d>>2];f=F[d+4>>2]-i>>2;e:{if(f>>>0<b>>>0){qa(d,b-f|0);break e}if(b>>>0>=f>>>0){break e}F[d+4>>2]=i+(b<<2)}if(!j){h=1;break c}if(!e){b=0;while(1){if(!yb(c,G[c+84|0]?b:F[F[c+68>>2]+(b<<2)>>2],D[c+24|0],a)){break c}b=b+1|0;h=j>>>0<=b>>>0;if((b|0)!=(j|0)){continue}break}break c}o=e&252;m=e&3;p=e>>>0<4;e=0;while(1){if(!yb(c,G[c+84|0]?e:F[F[c+68>>2]+(e<<2)>>2],D[c+24|0],a)){break c}n=F[d>>2];l=0;b=0;h=0;if(!p){while(1){f=(g<<2)+n|0;i=b<<2;F[f>>2]=F[i+a>>2];F[f+4>>2]=F[(i|4)+a>>2];F[f+8>>2]=F[(i|8)+a>>2];F[f+12>>2]=F[(i|12)+a>>2];b=b+4|0;g=g+4|0;h=h+4|0;if((o|0)!=(h|0)){continue}break}}if(m){while(1){F[(g<<2)+n>>2]=F[(b<<2)+a>>2];b=b+1|0;g=g+1|0;l=l+1|0;if((l|0)!=(m|0)){continue}break}}e=e+1|0;h=j>>>0<=e>>>0;if((e|0)!=(j|0)){continue}break}break b}na();v()}if(!a){break a}}ja(a)}Z=k+16|0;return h|0}function vf(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;a=0;k=Z-16|0;Z=k;j=F[b+80>>2];e=G[c+24|0];b=L(j,e);a:{b:{c:{d:{f=F[c+28>>2];if(!(!G[c+84|0]|(f|0)!=3&(f|0)!=4)){e=F[c+48>>2];c=F[F[c>>2]>>2];F[k+8>>2]=0;F[k>>2]=0;F[k+4>>2]=0;if(b){if((b|0)<0){break d}b=b<<1;a=ka(b);g=la(a,c+e|0,b)+b|0}b=F[d>>2];if(b){F[d+4>>2]=b;ja(b)}F[d+8>>2]=g;F[d+4>>2]=g;F[d>>2]=a;h=1;break a}if(e){f=e<<1;a=ka(f);ma(a,0,f)}i=F[d>>2];f=F[d+4>>2]-i>>1;e:{if(f>>>0<b>>>0){kd(d,b-f|0);break e}if(b>>>0>=f>>>0){break e}F[d+4>>2]=i+(b<<1)}if(!j){h=1;break c}if(!e){b=0;while(1){if(!Ab(c,G[c+84|0]?b:F[F[c+68>>2]+(b<<2)>>2],D[c+24|0],a)){break c}b=b+1|0;h=j>>>0<=b>>>0;if((b|0)!=(j|0)){continue}break}break c}o=e&252;m=e&3;p=e>>>0<4;e=0;while(1){if(!Ab(c,G[c+84|0]?e:F[F[c+68>>2]+(e<<2)>>2],D[c+24|0],a)){break c}n=F[d>>2];l=0;b=0;h=0;if(!p){while(1){f=(g<<1)+n|0;i=b<<1;E[f>>1]=H[i+a>>1];E[f+2>>1]=H[(i|2)+a>>1];E[f+4>>1]=H[(i|4)+a>>1];E[f+6>>1]=H[(i|6)+a>>1];b=b+4|0;g=g+4|0;h=h+4|0;if((o|0)!=(h|0)){continue}break}}if(m){while(1){E[(g<<1)+n>>1]=H[(b<<1)+a>>1];b=b+1|0;g=g+1|0;l=l+1|0;if((l|0)!=(m|0)){continue}break}}e=e+1|0;h=j>>>0<=e>>>0;if((e|0)!=(j|0)){continue}break}break b}na();v()}if(!a){break a}}ja(a)}Z=k+16|0;return h|0}function uf(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;a=0;k=Z-16|0;Z=k;j=F[b+80>>2];e=G[c+24|0];b=L(j,e);a:{b:{c:{d:{f=F[c+28>>2];if(!(!G[c+84|0]|(f|0)!=3&(f|0)!=4)){e=F[c+48>>2];c=F[F[c>>2]>>2];F[k+8>>2]=0;F[k>>2]=0;F[k+4>>2]=0;if(b){if((b|0)<0){break d}b=b<<1;a=ka(b);g=la(a,c+e|0,b)+b|0}b=F[d>>2];if(b){F[d+4>>2]=b;ja(b)}F[d+8>>2]=g;F[d+4>>2]=g;F[d>>2]=a;h=1;break a}if(e){f=e<<1;a=ka(f);ma(a,0,f)}i=F[d>>2];f=F[d+4>>2]-i>>1;e:{if(f>>>0<b>>>0){kd(d,b-f|0);break e}if(b>>>0>=f>>>0){break e}F[d+4>>2]=i+(b<<1)}if(!j){h=1;break c}if(!e){b=0;while(1){if(!zb(c,G[c+84|0]?b:F[F[c+68>>2]+(b<<2)>>2],D[c+24|0],a)){break c}b=b+1|0;h=j>>>0<=b>>>0;if((b|0)!=(j|0)){continue}break}break c}o=e&252;m=e&3;p=e>>>0<4;e=0;while(1){if(!zb(c,G[c+84|0]?e:F[F[c+68>>2]+(e<<2)>>2],D[c+24|0],a)){break c}n=F[d>>2];l=0;b=0;h=0;if(!p){while(1){f=(g<<1)+n|0;i=b<<1;E[f>>1]=H[i+a>>1];E[f+2>>1]=H[(i|2)+a>>1];E[f+4>>1]=H[(i|4)+a>>1];E[f+6>>1]=H[(i|6)+a>>1];b=b+4|0;g=g+4|0;h=h+4|0;if((o|0)!=(h|0)){continue}break}}if(m){while(1){E[(g<<1)+n>>1]=H[(b<<1)+a>>1];b=b+1|0;g=g+1|0;l=l+1|0;if((l|0)!=(m|0)){continue}break}}e=e+1|0;h=j>>>0<=e>>>0;if((e|0)!=(j|0)){continue}break}break b}na();v()}if(!a){break a}}ja(a)}Z=k+16|0;return h|0}function kc(a,b){var c=0,d=0,e=0,f=0,g=0;f=-1;d=-1;a:{if((b|0)==-1){break a}d=b+1|0;f=(d>>>0)%3|0?d:b-2|0;d=b-1|0;if((b>>>0)%3|0){break a}d=b+2|0}b:{c:{d:{switch(F[a+168>>2]){case 0:case 1:e=F[a+148>>2];c=1;b=F[a+156>>2];g=b+(((f|0)==-1?-1:F[F[e>>2]+(f<<2)>>2])<<2)|0;F[g>>2]=F[g>>2]+1;b=(((d|0)==-1?-1:F[F[e>>2]+(d<<2)>>2])<<2)+b|0;break c;case 5:e=F[a+148>>2];c=-1;c=((b|0)!=-1?F[F[e>>2]+(b<<2)>>2]:c)<<2;b=F[a+156>>2];c=c+b|0;F[c>>2]=F[c>>2]+1;c=(((f|0)==-1?-1:F[F[e>>2]+(f<<2)>>2])<<2)+b|0;F[c>>2]=F[c>>2]+1;c=2;b=(((d|0)==-1?-1:F[F[e>>2]+(d<<2)>>2])<<2)+b|0;break c;case 3:e=F[a+148>>2];c=-1;c=((b|0)!=-1?F[F[e>>2]+(b<<2)>>2]:c)<<2;b=F[a+156>>2];c=c+b|0;F[c>>2]=F[c>>2]+1;c=(((f|0)==-1?-1:F[F[e>>2]+(f<<2)>>2])<<2)+b|0;F[c>>2]=F[c>>2]+2;c=1;b=(((d|0)==-1?-1:F[F[e>>2]+(d<<2)>>2])<<2)+b|0;break c;case 7:break d;default:break b}}e=F[a+148>>2];c=-1;c=((b|0)!=-1?F[F[e>>2]+(b<<2)>>2]:c)<<2;b=F[a+156>>2];c=c+b|0;F[c>>2]=F[c>>2]+2;c=(((f|0)==-1?-1:F[F[e>>2]+(f<<2)>>2])<<2)+b|0;F[c>>2]=F[c>>2]+2;c=2;b=(((d|0)==-1?-1:F[F[e>>2]+(d<<2)>>2])<<2)+b|0}F[b>>2]=F[b>>2]+c}c=a;b=F[F[a+156>>2]+(((f|0)==-1?-1:F[F[F[a+148>>2]>>2]+(f<<2)>>2])<<2)>>2];d=F[a+180>>2];a=F[a+176>>2];F[c+172>>2]=(a|0)<=(b|0)?((b|0)<(d|0)?b:d)-a|0:0}function Dg(a){a=a|0;var b=0,c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;a:{b=F[a+32>>2];f=F[b+8>>2];h=F[b+12>>2];g=F[b+20>>2];c=F[b+16>>2];e=0;b:{if((h|0)<=(g|0)&c>>>0>=f>>>0|(g|0)>(h|0)){break b}f=G[F[b>>2]+c|0];e=b;b=g;c=c+1|0;b=c?b:b+1|0;F[e+16>>2]=c;F[e+20>>2]=b;c:{if(!f){break c}while(1){if($[F[F[a>>2]+16>>2]](a,d)|0){d=d+1|0;if((f|0)!=(d|0)){continue}break c}break}return 0}d=F[a+8>>2];b=F[a+12>>2];if((d|0)!=(b|0)){while(1){c=F[d>>2];if(!($[F[F[c>>2]+8>>2]](c,a,F[a+4>>2])|0)){break a}d=d+4|0;if((b|0)!=(d|0)){continue}break}}d:{if(!f){break d}d=0;while(1){b=F[F[a+8>>2]+(d<<2)>>2];if(!($[F[F[b>>2]+12>>2]](b,F[a+32>>2])|0)){break a}d=d+1|0;if((f|0)!=(d|0)){continue}break}if(!f){break d}i=a+20|0;b=0;while(1){d=0;j=b<<2;c=F[j+F[a+8>>2]>>2];k=$[F[F[c>>2]+24>>2]](c)|0;if((k|0)>0){while(1){c=F[F[a+8>>2]+j>>2];c=$[F[F[c>>2]+20>>2]](c,d)|0;e=F[a+20>>2];g=F[a+24>>2]-e>>2;e:{if(c>>>0<g>>>0){break e}h=c+1|0;if(h>>>0>g>>>0){qa(i,h-g|0);e=F[i>>2];break e}if(g>>>0<=h>>>0){break e}F[a+24>>2]=(h<<2)+e}F[(c<<2)+e>>2]=b;d=d+1|0;if((k|0)!=(d|0)){continue}break}}b=b+1|0;if((f|0)!=(b|0)){continue}break}}e=0;if(!($[F[F[a>>2]+28>>2]](a)|0)){break b}e=$[F[F[a>>2]+32>>2]](a)|0}return e|0}return 0}function Ye(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0;Oc(a,b,c);c=F[a+84>>2];d=F[a+88>>2]-c>>2;a:{if((d|0)>(b|0)){break a}b=b+1|0;if(b>>>0>d>>>0){b:{d=b-d|0;e=F[a+92>>2];c=F[a+88>>2];if(d>>>0<=e-c>>2>>>0){c:{if(!d){break c}b=c;e=d&7;if(e){while(1){F[b>>2]=1;b=b+4|0;f=f+1|0;if((e|0)!=(f|0)){continue}break}}c=(d<<2)+c|0;if((d-1&1073741823)>>>0<7){break c}while(1){F[b+24>>2]=1;F[b+28>>2]=1;F[b+16>>2]=1;F[b+20>>2]=1;F[b+8>>2]=1;F[b+12>>2]=1;F[b>>2]=1;F[b+4>>2]=1;b=b+32|0;if((c|0)!=(b|0)){continue}break}}F[a+88>>2]=c;break b}d:{b=c;c=F[a+84>>2];i=b-c|0;g=i>>2;b=g+d|0;if(b>>>0<1073741824){e=e-c|0;h=e>>>1|0;e=e>>>0>=2147483644?1073741823:b>>>0<h>>>0?h:b;if(e){if(e>>>0>=1073741824){break d}j=ka(e<<2)}g=(g<<2)+j|0;b=g;h=d&7;if(h){while(1){F[b>>2]=1;b=b+4|0;f=f+1|0;if((h|0)!=(f|0)){continue}break}}f=g+(d<<2)|0;if((d-1&1073741823)>>>0>=7){while(1){F[b+24>>2]=1;F[b+28>>2]=1;F[b+16>>2]=1;F[b+20>>2]=1;F[b+8>>2]=1;F[b+12>>2]=1;F[b>>2]=1;F[b+4>>2]=1;b=b+32|0;if((f|0)!=(b|0)){continue}break}}b=pa(j,c,i);F[a+88>>2]=f;F[a+84>>2]=b;F[a+92>>2]=b+(e<<2);if(c){ja(c)}break b}na();v()}oa();v()}return}if(b>>>0>=d>>>0){break a}F[a+88>>2]=c+(b<<2)}}function ab(a,b,c){var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;d=F[a+8>>2];e=F[a+4>>2];if(d-e>>2>>>0>=b>>>0){a:{if(!b){break a}d=e;g=b&7;if(g){while(1){F[d>>2]=F[c>>2];d=d+4|0;f=f+1|0;if((g|0)!=(f|0)){continue}break}}e=(b<<2)+e|0;if((b-1&1073741823)>>>0<7){break a}while(1){F[d>>2]=F[c>>2];F[d+4>>2]=F[c>>2];F[d+8>>2]=F[c>>2];F[d+12>>2]=F[c>>2];F[d+16>>2]=F[c>>2];F[d+20>>2]=F[c>>2];F[d+24>>2]=F[c>>2];F[d+28>>2]=F[c>>2];d=d+32|0;if((e|0)!=(d|0)){continue}break}}F[a+4>>2]=e;return}b:{i=F[a>>2];f=e-i>>2;h=f+b|0;if(h>>>0<1073741824){j=d-i|0;d=j>>>1|0;h=j>>>0>=2147483644?1073741823:d>>>0>h>>>0?d:h;if(h){if(h>>>0>=1073741824){break b}k=ka(h<<2)}f=(f<<2)+k|0;d=f;j=b&7;if(j){while(1){F[d>>2]=F[c>>2];d=d+4|0;g=g+1|0;if((j|0)!=(g|0)){continue}break}}g=(b<<2)+f|0;if((b-1&1073741823)>>>0>=7){while(1){F[d>>2]=F[c>>2];F[d+4>>2]=F[c>>2];F[d+8>>2]=F[c>>2];F[d+12>>2]=F[c>>2];F[d+16>>2]=F[c>>2];F[d+20>>2]=F[c>>2];F[d+24>>2]=F[c>>2];F[d+28>>2]=F[c>>2];d=d+32|0;if((g|0)!=(d|0)){continue}break}}if((e|0)!=(i|0)){while(1){f=f-4|0;e=e-4|0;F[f>>2]=F[e>>2];if((e|0)!=(i|0)){continue}break}}F[a+8>>2]=(h<<2)+k;F[a+4>>2]=g;F[a>>2]=f;if(i){ja(i)}return}na();v()}oa();v()}function Xb(a,b,c){var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;d=F[a+8>>2];e=F[a>>2];if(d-e>>2>>>0>=b>>>0){f=F[a+4>>2];h=f-e>>2;i=b>>>0>h>>>0?h:b;a:{if(!i){break a}d=e;g=i;j=g&7;if(j){while(1){F[d>>2]=F[c>>2];g=g-1|0;d=d+4|0;k=k+1|0;if((k|0)!=(j|0)){continue}break}}if(i>>>0<8){break a}while(1){F[d>>2]=F[c>>2];F[d+4>>2]=F[c>>2];F[d+8>>2]=F[c>>2];F[d+12>>2]=F[c>>2];F[d+16>>2]=F[c>>2];F[d+20>>2]=F[c>>2];F[d+24>>2]=F[c>>2];F[d+28>>2]=F[c>>2];d=d+32|0;g=g-8|0;if(g){continue}break}}if(b>>>0>h>>>0){b=(b-h<<2)+f|0;while(1){F[f>>2]=F[c>>2];f=f+4|0;if((b|0)!=(f|0)){continue}break}F[a+4>>2]=b;return}F[a+4>>2]=e+(b<<2);return}if(e){F[a+4>>2]=e;ja(e);F[a+8>>2]=0;F[a>>2]=0;F[a+4>>2]=0;d=0}b:{if(b>>>0>=1073741824){break b}e=d>>>1|0;d=d>>>0>=2147483644?1073741823:b>>>0<e>>>0?e:b;if(d>>>0>=1073741824){break b}d=d<<2;e=ka(d);F[a>>2]=e;F[a+8>>2]=d+e;c=F[c>>2];d=e;g=b&7;if(g){while(1){F[d>>2]=c;d=d+4|0;f=f+1|0;if((g|0)!=(f|0)){continue}break}}e=e+(b<<2)|0;if((b-1&1073741823)>>>0>=7){while(1){F[d+28>>2]=c;F[d+24>>2]=c;F[d+20>>2]=c;F[d+16>>2]=c;F[d+12>>2]=c;F[d+8>>2]=c;F[d+4>>2]=c;F[d>>2]=c;d=d+32|0;if((e|0)!=(d|0)){continue}break}}F[a+4>>2]=e;return}na();v()}function Ka(a,b,c){var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;f=(c>>>0)/3|0;j=F[(F[F[a+8>>2]+96>>2]+L(f,12)|0)+(c-L(f,3)<<2)>>2];a:{h=F[F[a+12>>2]+4>>2];e=F[h+4>>2];if((e|0)!=F[h+8>>2]){F[e>>2]=j;F[h+4>>2]=e+4;break a}b:{i=F[h>>2];f=e-i|0;g=f>>2;d=g+1|0;if(d>>>0<1073741824){k=g<<2;g=f>>>1|0;g=f>>>0>=2147483644?1073741823:d>>>0<g>>>0?g:d;if(g){if(g>>>0>=1073741824){break b}f=ka(g<<2)}else{f=0}d=k+f|0;F[d>>2]=j;j=d+4|0;if((e|0)!=(i|0)){while(1){d=d-4|0;e=e-4|0;F[d>>2]=F[e>>2];if((e|0)!=(i|0)){continue}break}}F[h+8>>2]=f+(g<<2);F[h+4>>2]=j;F[h>>2]=d;if(i){ja(i)}break a}na();v()}oa();v()}c:{d:{h=F[a+4>>2];e=F[h+4>>2];e:{if((e|0)!=F[h+8>>2]){F[e>>2]=c;F[h+4>>2]=e+4;break e}i=F[h>>2];f=e-i|0;j=f>>2;d=j+1|0;if(d>>>0>=1073741824){break d}g=f>>>1|0;g=f>>>0>=2147483644?1073741823:d>>>0<g>>>0?g:d;if(g){if(g>>>0>=1073741824){break c}f=ka(g<<2)}else{f=0}d=f+(j<<2)|0;F[d>>2]=c;c=d+4|0;if((e|0)!=(i|0)){while(1){d=d-4|0;e=e-4|0;F[d>>2]=F[e>>2];if((e|0)!=(i|0)){continue}break}}F[h+8>>2]=f+(g<<2);F[h+4>>2]=c;F[h>>2]=d;if(!i){break e}ja(i)}a=F[a+4>>2];F[F[a+12>>2]+(b<<2)>>2]=F[a+24>>2];F[a+24>>2]=F[a+24>>2]+1;return}na();v()}oa();v()}function pb(a,b,c,d){var e=0,f=0,g=0,h=0,i=0,j=0,k=0;h=d-c|0;if((h|0)<=0){return}a:{e=F[a+8>>2];i=F[a+4>>2];if((e-i|0)>=(h|0)){j=i-b|0;if((j|0)>=(h|0)){f=i;g=d;break a}f=i;g=c+j|0;if((g|0)!=(d|0)){e=g;while(1){D[f|0]=G[e|0];f=f+1|0;e=e+1|0;if((e|0)!=(d|0)){continue}break}}F[a+4>>2]=f;if((j|0)>0){break a}return}k=F[a>>2];g=(i-k|0)+h|0;if((g|0)>=0){j=b-k|0;f=e-k|0;e=f<<1;f=f>>>0>=1073741823?2147483647:e>>>0>g>>>0?e:g;if(f){e=ka(f)}else{e=0}g=j+e|0;if((c|0)!=(d|0)){g=la(g,c,h)+h|0}d=pa(e,k,j);c=i-b|0;b=pa(g,b,c);F[a+8>>2]=e+f;F[a+4>>2]=b+c;F[a>>2]=d;if(k){ja(k)}return}na();v()}e=f;d=e-h|0;if(i>>>0>d>>>0){while(1){D[e|0]=G[d|0];e=e+1|0;d=d+1|0;if(i>>>0>d>>>0){continue}break}}F[a+4>>2]=e;a=b+h|0;if((a|0)!=(f|0)){a=f-a|0;pa(f-a|0,b,a)}if((c|0)==(g|0)){return}f=(c^-1)+g|0;a=g-c&7;b:{if(!a){e=b;break b}d=0;e=b;while(1){D[e|0]=G[c|0];e=e+1|0;c=c+1|0;d=d+1|0;if((a|0)!=(d|0)){continue}break}}if(f>>>0<7){return}while(1){D[e|0]=G[c|0];D[e+1|0]=G[c+1|0];D[e+2|0]=G[c+2|0];D[e+3|0]=G[c+3|0];D[e+4|0]=G[c+4|0];D[e+5|0]=G[c+5|0];D[e+6|0]=G[c+6|0];D[e+7|0]=G[c+7|0];e=e+8|0;c=c+8|0;if((g|0)!=(c|0)){continue}break}}function la(a,b,c){var d=0,e=0,f=0;if(c>>>0>=512){Y(a|0,b|0,c|0);return a}e=a+c|0;a:{if(!((a^b)&3)){b:{if(!(a&3)){c=a;break b}if(!c){c=a;break b}c=a;while(1){D[c|0]=G[b|0];b=b+1|0;c=c+1|0;if(!(c&3)){break b}if(c>>>0<e>>>0){continue}break}}d=e&-4;c:{if(d>>>0<64){break c}f=d+-64|0;if(f>>>0<c>>>0){break c}while(1){F[c>>2]=F[b>>2];F[c+4>>2]=F[b+4>>2];F[c+8>>2]=F[b+8>>2];F[c+12>>2]=F[b+12>>2];F[c+16>>2]=F[b+16>>2];F[c+20>>2]=F[b+20>>2];F[c+24>>2]=F[b+24>>2];F[c+28>>2]=F[b+28>>2];F[c+32>>2]=F[b+32>>2];F[c+36>>2]=F[b+36>>2];F[c+40>>2]=F[b+40>>2];F[c+44>>2]=F[b+44>>2];F[c+48>>2]=F[b+48>>2];F[c+52>>2]=F[b+52>>2];F[c+56>>2]=F[b+56>>2];F[c+60>>2]=F[b+60>>2];b=b- -64|0;c=c- -64|0;if(f>>>0>=c>>>0){continue}break}}if(c>>>0>=d>>>0){break a}while(1){F[c>>2]=F[b>>2];b=b+4|0;c=c+4|0;if(d>>>0>c>>>0){continue}break}break a}if(e>>>0<4){c=a;break a}d=e-4|0;if(d>>>0<a>>>0){c=a;break a}c=a;while(1){D[c|0]=G[b|0];D[c+1|0]=G[b+1|0];D[c+2|0]=G[b+2|0];D[c+3|0]=G[b+3|0];b=b+4|0;c=c+4|0;if(d>>>0>=c>>>0){continue}break}}if(c>>>0<e>>>0){while(1){D[c|0]=G[b|0];b=b+1|0;c=c+1|0;if((e|0)!=(c|0)){continue}break}}return a}function sd(a){a=a|0;var b=0,c=0,d=0,e=0,f=0;F[a>>2]=8336;d=a+232|0;b=F[d+196>>2];if(b){F[d+200>>2]=b;ja(b)}c=F[d+184>>2];if(c){b=c;e=F[d+188>>2];if((b|0)!=(e|0)){while(1){b=e-12|0;f=F[b>>2];if(f){F[e-8>>2]=f;ja(f)}e=b;if((b|0)!=(c|0)){continue}break}b=F[d+184>>2]}F[d+188>>2]=c;ja(b)}b=F[d+156>>2];if(b){F[d+160>>2]=b;ja(b)}c=F[d+136>>2];F[d+136>>2]=0;if(c){e=c-4|0;b=F[e>>2];if(b){b=c+(b<<4)|0;while(1){b=b-16|0;if((c|0)!=(b|0)){continue}break}}ja(e)}td(a+216|0);b=F[a+196>>2];if(b){F[a+200>>2]=b;ja(b)}b=F[a+184>>2];if(b){F[a+188>>2]=b;ja(b)}b=F[a+172>>2];if(b){F[a+176>>2]=b;ja(b)}b=F[a+160>>2];if(b){F[a+164>>2]=b;ja(b)}b=F[a+144>>2];if(b){while(1){c=F[b>>2];ja(b);b=c;if(b){continue}break}}b=F[a+136>>2];F[a+136>>2]=0;if(b){ja(b)}b=F[a+120>>2];if(b){ja(b)}b=F[a+108>>2];if(b){ja(b)}b=F[a+96>>2];if(b){ja(b)}b=F[a+72>>2];if(b){F[a+76>>2]=b;ja(b)}b=F[a+60>>2];if(b){ja(b)}b=F[a+48>>2];if(b){F[a+52>>2]=b;ja(b)}b=F[a+36>>2];if(b){F[a+40>>2]=b;ja(b)}b=F[a+24>>2];if(b){F[a+28>>2]=b;ja(b)}b=F[a+12>>2];if(b){F[a+16>>2]=b;ja(b)}b=F[a+8>>2];F[a+8>>2]=0;if(b){Za(b)}return a|0}function Fa(a,b,c){var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;d=F[a+8>>2];e=F[a+4>>2];if(d-e>>2>>>0>=b>>>0){a:{if(!b){break a}d=e;f=b&7;if(f){while(1){F[d>>2]=F[c>>2];d=d+4|0;h=h+1|0;if((f|0)!=(h|0)){continue}break}}e=(b<<2)+e|0;if((b-1&1073741823)>>>0<7){break a}while(1){F[d>>2]=F[c>>2];F[d+4>>2]=F[c>>2];F[d+8>>2]=F[c>>2];F[d+12>>2]=F[c>>2];F[d+16>>2]=F[c>>2];F[d+20>>2]=F[c>>2];F[d+24>>2]=F[c>>2];F[d+28>>2]=F[c>>2];d=d+32|0;if((e|0)!=(d|0)){continue}break}}F[a+4>>2]=e;return}b:{i=F[a>>2];j=e-i|0;f=j>>2;g=f+b|0;if(g>>>0<1073741824){d=d-i|0;e=d>>>1|0;g=d>>>0>=2147483644?1073741823:e>>>0>g>>>0?e:g;if(g){if(g>>>0>=1073741824){break b}k=ka(g<<2)}f=(f<<2)+k|0;d=f;e=b&7;if(e){while(1){F[d>>2]=F[c>>2];d=d+4|0;h=h+1|0;if((e|0)!=(h|0)){continue}break}}e=f+(b<<2)|0;if((b-1&1073741823)>>>0>=7){while(1){F[d>>2]=F[c>>2];F[d+4>>2]=F[c>>2];F[d+8>>2]=F[c>>2];F[d+12>>2]=F[c>>2];F[d+16>>2]=F[c>>2];F[d+20>>2]=F[c>>2];F[d+24>>2]=F[c>>2];F[d+28>>2]=F[c>>2];d=d+32|0;if((e|0)!=(d|0)){continue}break}}b=pa(k,i,j);F[a+4>>2]=e;F[a>>2]=b;F[a+8>>2]=b+(g<<2);if(i){ja(i)}return}na();v()}oa();v()}function Sb(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0;if(G[a+11|0]>>>7|0){d=F[a+4>>2]}else{d=G[a+11|0]&127}if(d>>>0<b>>>0){h=Z-16|0;Z=h;b=b-d|0;if(b){g=G[a+11|0]>>>7|0?(F[a+8>>2]&2147483647)-1|0:10;if(G[a+11|0]>>>7|0){d=F[a+4>>2]}else{d=G[a+11|0]&127}i=d+b|0;if(g-d>>>0<b>>>0){a:{e=Z-16|0;Z=e;c=i-g|0;if(c>>>0<=2147483631-g>>>0){if(G[a+11|0]>>>7|0){f=F[a>>2]}else{f=a}if(g>>>0<1073741799){F[e+12>>2]=g<<1;F[e>>2]=c+g;c=Z-16|0;Z=c;Z=c+16|0;c=e+12|0;c=F[(I[e>>2]<I[c>>2]?c:e)>>2];if(c>>>0>=11){j=c+16&-16;c=j-1|0;c=(c|0)==11?j:c}else{c=10}c=c+1|0}else{c=2147483631}sb(e,c);c=F[e>>2];if(d){db(c,f,d)}if((g|0)!=10){ja(f)}F[a>>2]=c;F[a+8>>2]=F[a+8>>2]&-2147483648|F[e+4>>2]&2147483647;F[a+8>>2]=F[a+8>>2]|-2147483648;Z=e+16|0;break a}za();v()}}f=d;if(G[a+11|0]>>>7|0){d=F[a>>2]}else{d=a}f=f+d|0;e=Z-16|0;Z=e;D[e+15|0]=0;while(1){if(b){D[f|0]=G[e+15|0];b=b-1|0;f=f+1|0;continue}break}Z=e+16|0;Ic(a,i);D[h+15|0]=0;D[d+i|0]=G[h+15|0]}Z=h+16|0;return}if(G[a+11|0]>>>7|0){d=F[a>>2]}else{d=a}f=Z-16|0;Z=f;Ic(a,b);D[f+15|0]=0;D[b+d|0]=G[f+15|0];Z=f+16|0}function Zc(a,b){var c=0,d=0,e=0,f=0,g=0,h=0;g=Z-16|0;Z=g;a:{b:{if(b){F[a+88>>2]=0;F[a+92>>2]=0;d=F[a+84>>2];F[a+84>>2]=0;if(d){ja(d)}F[a+76>>2]=0;F[a+80>>2]=0;d=F[a+72>>2];F[a+72>>2]=0;if(d){ja(d)}d=F[b>>2];c=F[b+4>>2];D[g+15|0]=0;Ea(a,c-d>>2,g+15|0);d=F[b+28>>2];c=F[b+24>>2];D[g+14|0]=0;Ea(a+12|0,d-c>>2,g+14|0);Xb(a+28|0,F[b+4>>2]-F[b>>2]>>2,10284);c=F[b+28>>2]-F[b+24>>2]|0;f=c>>2;e=F[a+52>>2];c:{if(f>>>0<=F[a+60>>2]-e>>2>>>0){break c}if((c|0)<0){break b}d=F[a+56>>2];c=ka(c);f=c+(f<<2)|0;h=c+(d-e&-4)|0;c=h;if((d|0)!=(e|0)){while(1){c=c-4|0;d=d-4|0;F[c>>2]=F[d>>2];if((d|0)!=(e|0)){continue}break}}F[a+60>>2]=f;F[a+56>>2]=h;F[a+52>>2]=c;if(!e){break c}ja(e)}c=F[b+28>>2]-F[b+24>>2]|0;f=c>>2;e=F[a+40>>2];d:{if(f>>>0<=F[a+48>>2]-e>>2>>>0){break d}if((c|0)<0){break a}d=F[a+44>>2];c=ka(c);f=c+(f<<2)|0;h=c+(d-e&-4)|0;c=h;if((d|0)!=(e|0)){while(1){c=c-4|0;d=d-4|0;F[c>>2]=F[d>>2];if((d|0)!=(e|0)){continue}break}}F[a+48>>2]=f;F[a+44>>2]=h;F[a+40>>2]=c;if(!e){break d}ja(e)}D[a+24|0]=1;F[a+64>>2]=b}Z=g+16|0;return}na();v()}na();v()}function nb(a,b){var c=0,d=0,e=0;c=(a|0)==(b|0);D[b+12|0]=c;a:{if(c){break a}while(1){d=F[b+8>>2];if(G[d+12|0]){break a}b:{c=F[d+8>>2];e=F[c>>2];if((e|0)==(d|0)){e=F[c+4>>2];if(!(!e|G[e+12|0])){break b}c:{if(F[d>>2]==(b|0)){b=d;break c}b=F[d+4>>2];a=F[b>>2];F[d+4>>2]=a;if(a){F[a+8>>2]=d;c=F[d+8>>2]}F[b+8>>2]=c;a=F[d+8>>2];F[((F[a>>2]!=(d|0))<<2)+a>>2]=b;F[b>>2]=d;F[d+8>>2]=b;c=F[b+8>>2];d=F[c>>2]}D[b+12|0]=1;D[c+12|0]=0;a=F[d+4>>2];F[c>>2]=a;if(a){F[a+8>>2]=c}F[d+8>>2]=F[c+8>>2];a=F[c+8>>2];F[((F[a>>2]!=(c|0))<<2)+a>>2]=d;F[d+4>>2]=c;F[c+8>>2]=d;return}if(!(G[e+12|0]|!e)){break b}d:{if(F[d>>2]!=(b|0)){b=d;break d}a=F[b+4>>2];F[d>>2]=a;if(a){F[a+8>>2]=d;c=F[d+8>>2]}F[b+8>>2]=c;a=F[d+8>>2];F[((F[a>>2]!=(d|0))<<2)+a>>2]=b;F[b+4>>2]=d;F[d+8>>2]=b;c=F[b+8>>2]}D[b+12|0]=1;D[c+12|0]=0;a=F[c+4>>2];b=F[a>>2];F[c+4>>2]=b;if(b){F[b+8>>2]=c}F[a+8>>2]=F[c+8>>2];b=F[c+8>>2];F[((F[b>>2]!=(c|0))<<2)+b>>2]=a;F[a>>2]=c;F[c+8>>2]=a;break a}D[d+12|0]=1;D[c+12|0]=(a|0)==(c|0);D[e+12|0]=1;b=c;if((c|0)!=(a|0)){continue}break}}}function mi(a,b,c,d){var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;a:{b:{c:{d:{e:{f:{g:{h:{i:{j:{k:{if(b){if(!c){break k}if(!d){break j}e=O(d)-O(b)|0;if(e>>>0<=31){break i}break c}if((d|0)==1|d>>>0>1){break c}_=0;a=(a>>>0)/(c>>>0)|0;break a}if(!a){break h}if(!d|d-1&d){break g}a=b>>>ji(d)|0;_=0;break a}if(!(c-1&c)){break f}h=(O(c)+33|0)-O(b)|0;g=0-h|0;break d}h=e+1|0;g=63-e|0;break d}_=0;a=(b>>>0)/(d>>>0)|0;break a}e=O(d)-O(b)|0;if(e>>>0<31){break e}break c}if((c|0)==1){break b}d=ji(c);c=d&31;if((d&63)>>>0>=32){a=b>>>c|0}else{e=b>>>c|0;a=((1<<c)-1&b)<<32-c|a>>>c}_=e;break a}h=e+1|0;g=63-e|0}e=h&63;f=e&31;if(e>>>0>=32){e=0;i=b>>>f|0}else{e=b>>>f|0;i=((1<<f)-1&b)<<32-f|a>>>f}g=g&63;f=g&31;if(g>>>0>=32){b=a<<f;a=0}else{b=(1<<f)-1&a>>>32-f|b<<f;a=a<<f}if(h){f=d-1|0;g=c-1|0;m=(g|0)!=-1?f+1|0:f;while(1){j=e<<1|i>>>31;e=i<<1|b>>>31;f=m-(j+(e>>>0>g>>>0)|0)>>31;k=c&f;i=e-k|0;e=j-((d&f)+(e>>>0<k>>>0)|0)|0;b=b<<1|a>>>31;a=l|a<<1;l=f&1;h=h-1|0;if(h){continue}break}}_=b<<1|a>>>31;a=l|a<<1;break a}a=0;b=0}_=b}return a}function yh(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;c=F[b+88>>2];if(!(!c|F[c>>2]!=1)){e=F[c+8>>2];F[a+4>>2]=G[e|0]|G[e+1|0]<<8|(G[e+2|0]<<16|G[e+3|0]<<24);f=a+8|0;d=G[b+24|0];h=F[a+8>>2];g=F[a+12>>2]-h>>2;a:{if(d>>>0>g>>>0){qa(f,d-g|0);d=G[b+24|0];e=F[c+8>>2];break a}if(d>>>0>=g>>>0){break a}F[a+12>>2]=h+(d<<2)}b:{if(!d){b=4;break b}h=d&3;f=F[f>>2];c:{if(d-1>>>0<3){b=4;d=0;break c}k=d&252;d=0;b=4;while(1){g=d<<2;c=b+e|0;F[g+f>>2]=G[c|0]|G[c+1|0]<<8|(G[c+2|0]<<16|G[c+3|0]<<24);F[f+(g|4)>>2]=G[c+4|0]|G[c+5|0]<<8|(G[c+6|0]<<16|G[c+7|0]<<24);F[f+(g|8)>>2]=G[c+8|0]|G[c+9|0]<<8|(G[c+10|0]<<16|G[c+11|0]<<24);F[f+(g|12)>>2]=G[c+12|0]|G[c+13|0]<<8|(G[c+14|0]<<16|G[c+15|0]<<24);d=d+4|0;b=b+16|0;i=i+4|0;if((k|0)!=(i|0)){continue}break}}if(!h){break b}while(1){c=b+e|0;F[f+(d<<2)>>2]=G[c|0]|G[c+1|0]<<8|(G[c+2|0]<<16|G[c+3|0]<<24);d=d+1|0;b=b+4|0;j=j+1|0;if((h|0)!=(j|0)){continue}break}}d=a;a=b+e|0;F[d+20>>2]=G[a|0]|G[a+1|0]<<8|(G[a+2|0]<<16|G[a+3|0]<<24);d=1}return d|0}function Yg(a){a=a|0;var b=0,c=0,d=0,e=0,f=0,g=0,h=0;g=Z-16|0;Z=g;e=F[a+4>>2];d=F[e>>2];a:{b=F[a+12>>2];c=F[b+28>>2]-F[b+24>>2]|0;f=c>>2;b:{if(f>>>0<=F[e+8>>2]-d>>2>>>0){break b}if((c|0)<0){break a}b=F[e+4>>2];c=ka(c);f=c+(f<<2)|0;h=c+(b-d&-4)|0;c=h;if((b|0)!=(d|0)){while(1){c=c-4|0;b=b-4|0;F[c>>2]=F[b>>2];if((b|0)!=(d|0)){continue}break}}F[e+8>>2]=f;F[e+4>>2]=h;F[e>>2]=c;if(!d){break b}ja(d)}b=F[a+12>>2];c=F[b+28>>2];b=F[b+24>>2];F[g+12>>2]=0;b=c-b>>2;d=a+96|0;e=F[d>>2];c=F[a+100>>2]-e>>2;c:{if(b>>>0>c>>>0){Fa(d,b-c|0,g+12|0);break c}if(b>>>0>=c>>>0){break c}F[a+100>>2]=e+(b<<2)}e=a+8|0;b=F[a+116>>2];d:{if(b){d=F[b>>2];if((d|0)==F[b+4>>2]){c=1;break d}b=0;while(1){c=rd(e,F[(b<<2)+d>>2]);if(!c){break d}f=F[a+116>>2];d=F[f>>2];b=b+1|0;if(b>>>0<F[f+4>>2]-d>>2>>>0){continue}break}break d}c=1;a=F[a+12>>2];a=F[a+4>>2]-F[a>>2]|0;if(a>>>0<12){break d}a=(a>>2>>>0)/3|0;b=0;while(1){c=rd(e,L(b,3));if(!c){break d}b=b+1|0;if((a|0)!=(b|0)){continue}break}}Z=g+16|0;return c|0}na();v()}function md(a,b,c,d){var e=0,f=0,g=0,h=0,i=0,j=0;a:{b:{c:{if(!b){if((d|0)<0){break a}f=F[a+4>>2];b=F[a>>2];d=f-b|0;if(c>>>0>d>>>0){g=c-d|0;e=F[a+8>>2];if(g>>>0<=e-f>>>0){i=a,j=ma(f,0,g)+g|0,F[i+4>>2]=j;break c}if((c|0)<0){break b}f=e-b|0;e=f<<1;f=f>>>0>=1073741823?2147483647:c>>>0<e>>>0?e:c;e=ka(f);ma(e+d|0,0,g);d=pa(e,b,d);F[a+8>>2]=d+f;F[a+4>>2]=c+d;F[a>>2]=d;if(!b){break c}ja(b);break c}if(c>>>0>=d>>>0){break c}F[a+4>>2]=b+c;break c}if((d|0)<0){break a}e=F[a+4>>2];f=F[a>>2];g=e-f|0;d:{if((d|0)<=0&c>>>0<=g>>>0|(d|0)<0){break d}if(c>>>0>g>>>0){d=c-g|0;h=F[a+8>>2];if(d>>>0<=h-e>>>0){i=a,j=ma(e,0,d)+d|0,F[i+4>>2]=j;break d}if((c|0)<0){break b}e=h-f|0;h=e<<1;e=e>>>0>=1073741823?2147483647:c>>>0<h>>>0?h:c;h=ka(e);ma(h+g|0,0,d);d=pa(h,f,g);F[a+8>>2]=d+e;F[a+4>>2]=c+d;F[a>>2]=d;if(!f){break d}ja(f);break d}if(c>>>0>=g>>>0){break d}F[a+4>>2]=c+f}if(!c){break c}pa(F[a>>2],b,c)}b=F[a+28>>2];c=F[a+24>>2]+1|0;b=c?b:b+1|0;F[a+24>>2]=c;F[a+28>>2]=b;g=1;break a}na();v()}return g}function Lg(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;k=F[a+12>>2];c=F[a+68>>2];d=F[c+80>>2];D[b+84|0]=0;n=b+68|0;i=F[b+68>>2];e=F[b+72>>2]-i>>2;a:{if(e>>>0<d>>>0){ab(n,d-e|0,9124);c=F[a+68>>2];d=F[c+80>>2];break a}if(d>>>0>=e>>>0){break a}F[b+72>>2]=i+(d<<2)}b=F[c+100>>2];e=F[c+96>>2];i=(b-e|0)/12|0;m=1;b:{if((b|0)==(e|0)){break b}k=F[k+28>>2];f=F[k>>2];if((f|0)==-1){return 0}o=i>>>0<=1?1:i;c=e;b=0;m=0;while(1){g=F[c>>2];if(g>>>0>=d>>>0){break b}j=F[F[a+72>>2]+12>>2];h=F[j+(f<<2)>>2];if(h>>>0>=d>>>0){break b}f=F[n>>2];F[f+(g<<2)>>2]=h;g=k+(l<<2)|0;h=F[g+4>>2];if((h|0)==-1){break b}l=F[c+4>>2];if(l>>>0>=d>>>0){break b}h=F[(h<<2)+j>>2];if(h>>>0>=d>>>0){break b}F[f+(l<<2)>>2]=h;g=F[g+8>>2];if((g|0)==-1){break b}c=F[c+8>>2];if(c>>>0>=d>>>0){break b}j=F[(g<<2)+j>>2];if(j>>>0>=d>>>0){break b}F[f+(c<<2)>>2]=j;b=b+1|0;m=i>>>0<=b>>>0;if((b|0)==(o|0)){break b}c=e+L(b,12)|0;l=L(b,3);f=F[k+(l<<2)>>2];if((f|0)!=-1){continue}break}}return m|0}function ag(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;h=F[d+80>>2];e=Z-48|0;Z=e;a=F[a+4>>2];m=a-2|0;a:{if(m>>>0>28){break a}j=F[F[d>>2]>>2]+F[d+48>>2]|0;F[e+16>>2]=a;a=-1<<a;F[e+20>>2]=a^-1;a=-2-a|0;F[e+24>>2]=a;F[e+32>>2]=(a|0)/2;J[e+28>>2]=M(2)/M(a|0);f=F[c>>2];if((f|0)!=F[c+4>>2]){a=0;d=0;while(1){g=F[(d<<2)+f>>2];h=e+36|0;k=F[F[b>>2]>>2];l=F[b+48>>2];f=F[b+40>>2];i=F[b+44>>2];if(!G[b+84|0]){g=F[F[b+68>>2]+(g<<2)>>2]}g=ki(f,i,g,0);i=g;g=g+l|0;la(h,g+k|0,f);Kc(e+16|0,h,e+12|0,e+8|0);f=a<<2;F[f+j>>2]=F[e+12>>2];F[(f|4)+j>>2]=F[e+8>>2];a=a+2|0;d=d+1|0;f=F[c>>2];if(d>>>0<F[c+4>>2]-f>>2>>>0){continue}break}break a}if(!h){break a}d=0;a=0;while(1){k=e+36|0;l=F[F[b>>2]>>2];i=F[b+48>>2];c=F[b+40>>2];f=ki(c,F[b+44>>2],G[b+84|0]?a:F[F[b+68>>2]+(a<<2)>>2],0);g=f;f=f+i|0;la(k,f+l|0,c);Kc(e+16|0,k,e+12|0,e+8|0);c=d<<2;F[c+j>>2]=F[e+12>>2];F[(c|4)+j>>2]=F[e+8>>2];d=d+2|0;a=a+1|0;if((h|0)!=(a|0)){continue}break}}Z=e+48|0;return m>>>0<29|0}function Zg(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;c=F[a+12>>2];d=F[a+108>>2];e=F[d+80>>2];D[b+84|0]=0;m=b+68|0;h=F[b+68>>2];f=F[b+72>>2]-h>>2;a:{if(f>>>0<e>>>0){ab(m,e-f|0,9124);d=F[a+108>>2];e=F[d+80>>2];break a}if(e>>>0>=f>>>0){break a}F[b+72>>2]=h+(e<<2)}b=F[d+100>>2];f=F[d+96>>2];h=(b-f|0)/12|0;k=1;b:{if((b|0)==(f|0)){break b}n=h>>>0<=1?1:h;o=F[c>>2];c=0;d=f;b=0;k=0;while(1){c=(c<<2)+o|0;i=F[c>>2];if((i|0)==-1){break b}g=F[d>>2];if(g>>>0>=e>>>0){break b}l=F[F[a+112>>2]+12>>2];j=F[l+(i<<2)>>2];if(j>>>0>=e>>>0){break b}i=F[m>>2];F[i+(g<<2)>>2]=j;g=F[c+4>>2];if((g|0)==-1){break b}j=F[d+4>>2];if(j>>>0>=e>>>0){break b}g=F[(g<<2)+l>>2];if(g>>>0>=e>>>0){break b}F[i+(j<<2)>>2]=g;c=F[c+8>>2];if((c|0)==-1){break b}d=F[d+8>>2];if(d>>>0>=e>>>0){break b}c=F[(c<<2)+l>>2];if(c>>>0>=e>>>0){break b}F[i+(d<<2)>>2]=c;b=b+1|0;k=h>>>0<=b>>>0;if((b|0)==(n|0)){break b}c=L(b,3);d=f+L(b,12)|0;if((b|0)!=1431655765){continue}break}}return k|0}function xd(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=M(0),j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;k=Z-16|0;Z=k;if(F[c+28>>2]==9){d=F[a+4>>2];h=G[c+24|0];e=h<<2;f=ka(e);l=k+8|0;F[l>>2]=1065353216;i=J[a+20>>2];d=-1<<d^-1;if((d|0)>0){J[l>>2]=i/M(d|0)}o=(d|0)>0;a:{if(!o){break a}j=F[c+80>>2];if(!j){break a}if(h){p=F[F[b>>2]>>2]+F[b+48>>2]|0;t=h&254;u=h&1;b=0;while(1){m=F[a+8>>2];i=J[l>>2];d=0;n=0;if((h|0)!=1){while(1){g=d<<2;q=(b<<2)+p|0;J[g+f>>2]=M(i*M(F[q>>2]))+J[g+m>>2];g=g|4;J[g+f>>2]=M(i*M(F[q+4>>2]))+J[g+m>>2];d=d+2|0;b=b+2|0;n=n+2|0;if((t|0)!=(n|0)){continue}break}}if(u){d=d<<2;J[d+f>>2]=M(i*M(F[(b<<2)+p>>2]))+J[d+m>>2];b=b+1|0}la(F[F[c+64>>2]>>2]+r|0,f,e);r=e+r|0;s=s+1|0;if((s|0)!=(j|0)){continue}break}break a}b=0;if((j|0)!=1){a=j&-2;d=0;while(1){la(F[F[c+64>>2]>>2]+b|0,f,e);b=b+e|0;la(b+F[F[c+64>>2]>>2]|0,f,e);b=b+e|0;d=d+2|0;if((a|0)!=(d|0)){continue}break}}if(!(j&1)){break a}la(F[F[c+64>>2]>>2]+b|0,f,e)}ja(f)}Z=k+16|0;return o|0}function Rg(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;c=F[a+12>>2];d=F[a+68>>2];e=F[d+80>>2];D[b+84|0]=0;m=b+68|0;h=F[b+68>>2];f=F[b+72>>2]-h>>2;a:{if(f>>>0<e>>>0){ab(m,e-f|0,9124);d=F[a+68>>2];e=F[d+80>>2];break a}if(e>>>0>=f>>>0){break a}F[b+72>>2]=h+(e<<2)}b=F[d+100>>2];f=F[d+96>>2];h=(b-f|0)/12|0;k=1;b:{if((b|0)==(f|0)){break b}n=h>>>0<=1?1:h;o=F[c>>2];c=0;d=f;b=0;k=0;while(1){c=(c<<2)+o|0;i=F[c>>2];if((i|0)==-1){break b}g=F[d>>2];if(g>>>0>=e>>>0){break b}l=F[F[a+72>>2]+12>>2];j=F[l+(i<<2)>>2];if(j>>>0>=e>>>0){break b}i=F[m>>2];F[i+(g<<2)>>2]=j;g=F[c+4>>2];if((g|0)==-1){break b}j=F[d+4>>2];if(j>>>0>=e>>>0){break b}g=F[(g<<2)+l>>2];if(g>>>0>=e>>>0){break b}F[i+(j<<2)>>2]=g;c=F[c+8>>2];if((c|0)==-1){break b}d=F[d+8>>2];if(d>>>0>=e>>>0){break b}c=F[(c<<2)+l>>2];if(c>>>0>=e>>>0){break b}F[i+(d<<2)>>2]=c;b=b+1|0;k=h>>>0<=b>>>0;if((b|0)==(n|0)){break b}c=L(b,3);d=f+L(b,12)|0;if((b|0)!=1431655765){continue}break}}return k|0}function Na(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0;d=Z-16|0;Z=d;a:{f=F[a+4>>2];b:{if(f>>>0<b>>>0){e=b-f|0;c=F[a+8>>2];g=c<<5;c:{if(!(e>>>0>g>>>0|f>>>0>g-e>>>0)){F[a+4>>2]=b;h=f&31;b=F[a>>2]+(f>>>3&536870908)|0;break c}F[d+8>>2]=0;F[d>>2]=0;F[d+4>>2]=0;if((b|0)<0){break a}if(g>>>0<=1073741822){c=c<<6;b=b+31&-32;b=b>>>0<c>>>0?c:b}else{b=2147483647}$a(d,b);f=F[a+4>>2];F[d+4>>2]=f+e;i=F[a>>2];b=F[d>>2];d:{if((f|0)<=0){break d}c=f>>>5|0;if(f>>>0>=32){pa(b,i,c<<2)}g=c<<2;b=g+b|0;h=f&31;if(h){c=-1>>>32-h|0;F[b>>2]=F[b>>2]&(c^-1)|F[i+g>>2]&c}i=F[a>>2]}F[a>>2]=F[d>>2];F[d>>2]=i;c=F[a+4>>2];F[a+4>>2]=F[d+4>>2];F[d+4>>2]=c;c=F[a+8>>2];F[a+8>>2]=F[d+8>>2];F[d+8>>2]=c;if(!i){break c}ja(i)}if(!e){break b}if(h){c=32-h|0;a=c>>>0<e>>>0?c:e;F[b>>2]=F[b>>2]&(-1<<h&-1>>>c-a^-1);e=e-a|0;b=b+4|0}a=e>>>5|0;if(e>>>0>=32){ma(b,0,a<<2)}if((e&-32)==(e|0)){break b}a=(a<<2)+b|0;F[a>>2]=F[a>>2]&(-1>>>32-(e&31)^-1);break b}F[a+4>>2]=b}Z=d+16|0;return}na();v()}function Aa(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;i=Z-16|0;Z=i;f=F[b+20>>2];h=F[b+12>>2];c=F[b+16>>2];a:{if((f|0)>=(h|0)&c>>>0>=I[b+8>>2]|(f|0)>(h|0)){break a}D[a+12|0]=G[c+F[b>>2]|0];c=F[b+20>>2];f=F[b+16>>2]+1|0;c=f?c:c+1|0;F[b+16>>2]=f;F[b+20>>2]=c;if(!Qd(1,i+12|0,b)){break a}h=F[b+8>>2];f=F[b+16>>2];g=h-f|0;c=F[i+12>>2];d=f>>>0>h>>>0;h=F[b+20>>2];e=F[b+12>>2]-(d+h|0)|0;if(g>>>0<c>>>0&(e|0)<=0|(e|0)<0|(c|0)<=0){break a}g=f+F[b>>2]|0;F[a>>2]=g;b:{c:{e=c-1|0;j=e+g|0;d=G[j|0];d:{if(d>>>0<=63){F[a+4>>2]=e;d=G[j|0]&63;break d}e:{switch((d>>>6|0)-1|0){case 1:break c;case 0:break e;default:break a}}if(c>>>0<2){break a}e=c-2|0;F[a+4>>2]=e;g=g+e|0;d=G[g+1|0]<<8&16128|G[g|0]}F[a+8>>2]=d+4096;break b}if(c>>>0<3){break a}e=c-3|0;F[a+4>>2]=e;d=a;a=g+e|0;a=G[a+1|0]<<8|G[a+2|0]<<16&4128768|G[a|0];F[d+8>>2]=a+4096;if(a>>>0>1044479){break a}}a=h;d=c;c=c+f|0;a=d>>>0>c>>>0?a+1|0:a;F[b+16>>2]=c;F[b+20>>2]=a;k=1}Z=i+16|0;return k}function qd(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0;e=F[a+12>>2];i=F[a+8>>2];d=e-i>>2;b=G[b+24|0];a:{if(d>>>0<b>>>0){qa(a+8|0,b-d|0);i=F[a+8>>2];e=F[a+12>>2];break a}if(b>>>0>=d>>>0){break a}e=(b<<2)+i|0;F[a+12>>2]=e}b=0;f=F[c+8>>2];h=F[c+12>>2];j=F[c+20>>2];e=e-i|0;d=F[c+16>>2];g=e+d|0;j=e>>>0>g>>>0?j+1|0:j;b:{if(f>>>0<g>>>0&(h|0)<=(j|0)|(h|0)<(j|0)){break b}la(i,d+F[c>>2]|0,e);d=F[c+20>>2];g=e;e=e+F[c+16>>2]|0;d=g>>>0>e>>>0?d+1|0:d;F[c+16>>2]=e;F[c+20>>2]=d;f=F[c+8>>2];h=F[c+12>>2];g=e+4|0;d=g>>>0<4?d+1|0:d;if(f>>>0<g>>>0&(d|0)>=(h|0)|(d|0)>(h|0)){break b}d=e+F[c>>2]|0;F[a+20>>2]=G[d|0]|G[d+1|0]<<8|(G[d+2|0]<<16|G[d+3|0]<<24);d=F[c+20>>2];g=d;f=d;e=F[c+16>>2];d=e+4|0;f=d>>>0<4?f+1|0:f;F[c+16>>2]=d;F[c+20>>2]=f;h=F[c+12>>2];if((f|0)>=(h|0)&d>>>0>=I[c+8>>2]|(f|0)>(h|0)){break b}f=G[d+F[c>>2]|0];d=g;e=e+5|0;d=e>>>0<5?d+1|0:d;F[c+16>>2]=e;F[c+20>>2]=d;if(f-1>>>0>29){break b}F[a+4>>2]=f;b=1}return b|0}function Kc(a,b,c,d){var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;j=+J[b>>2];k=+J[b+4>>2];l=+J[b+8>>2];g=N(j)+N(k)+N(l);a:{if(!(g>1e-6)){j=1;k=0;e=0;break a}g=1/g;k=g*k;j=g*j;e=g*l<0}h=F[a+16>>2];l=+(h|0);g=R(j*l+.5);b:{if(N(g)<2147483648){m=~~g;break b}m=-2147483648}f=m>>31;i=(f^m)-f|0;g=R(k*l+.5);c:{if(N(g)<2147483648){f=~~g;break c}f=-2147483648}b=f>>31;b=h-(i+((f^b)-b|0)|0)|0;i=(b|0)>0?b:0;e=e?0-i|0:i;f=f+(b>>31&((f|0)>0?b:0-b|0))|0;d:{if((m|0)>=0){b=e+h|0;a=F[a+8>>2];e=h+f|0;break d}b=f>>31;b=(b^f)-b|0;a=F[a+8>>2];b=(e|0)<0?b:a-b|0;e=(f|0)<0?i:a-i|0}e:{if(!(b|e)){b=a;break e}if(!((a|0)!=(b|0)|e)){b=a;break e}if(!((a|0)!=(e|0)|b)){b=a;break e}if(!((b|0)<=(h|0)|e)){b=(h<<1)-b|0;a=0;break e}if(!((a|0)!=(e|0)|(b|0)>=(h|0))){b=(h<<1)-b|0;break e}if(!((a|0)!=(b|0)|(e|0)>=(h|0))){b=a;a=(h<<1)-e|0;break e}if(b){a=e;break e}b=0;if((e|0)<=(h|0)){a=e;break e}a=(h<<1)-e|0}F[c>>2]=a;F[d>>2]=b}function ye(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;a:{if(!$c(a,b)){break a}h=a+36|0;g=$[F[F[a>>2]+24>>2]](a)|0;e=F[a+40>>2];d=F[a+36>>2];c=e-d>>2;b:{if(g>>>0>c>>>0){Pb(h,g-c|0);break b}if(c>>>0<=g>>>0){break b}d=d+(g<<2)|0;if((d|0)!=(e|0)){while(1){e=e-4|0;c=F[e>>2];F[e>>2]=0;if(c){$[F[F[c>>2]+4>>2]](c)}if((d|0)!=(e|0)){continue}break}}F[a+40>>2]=d}c=1;if((g|0)<=0){break a}e=0;while(1){c:{c=F[b+20>>2];f=F[b+12>>2];d=F[b+16>>2];if((c|0)>=(f|0)&d>>>0>=I[b+8>>2]|(c|0)>(f|0)){break c}f=G[F[b>>2]+d|0];d=d+1|0;c=d?c:c+1|0;F[b+16>>2]=d;F[b+20>>2]=c;d=$[F[F[a>>2]+48>>2]](a,f)|0;f=e<<2;i=f+F[a+36>>2]|0;c=F[i>>2];F[i>>2]=d;if(c){$[F[F[c>>2]+4>>2]](c)}c=F[F[h>>2]+f>>2];if(!c){break c}if(!(k=c,l=$[F[F[a>>2]+28>>2]](a)|0,m=$[F[F[a>>2]+20>>2]](a,e)|0,j=F[F[c>>2]+8>>2],$[j](k|0,l|0,m|0)|0)){break c}c=1;e=e+1|0;if((g|0)!=(e|0)){continue}break a}break}c=0}return c|0}function Xc(a,b){var c=0,d=0,e=0,f=0,g=0,h=0;g=F[a>>2];c=g+(b>>>3&536870908)|0;F[c>>2]=F[c>>2]|1<<b;f=F[a+64>>2];e=(b|0)==-1;d=-1;a:{if(e){break a}c=b+1|0;c=(c>>>0)%3|0?c:b-2|0;d=-1;if((c|0)==-1){break a}d=F[F[f>>2]+(c<<2)>>2]}c=F[a+12>>2];h=(d>>>3&536870908)+c|0;F[h>>2]=F[h>>2]|1<<d;b:{c:{if(!e){d:{e:{if((b>>>0)%3|0){e=b-1|0;break e}e=b+2|0;d=-1;if((e|0)==-1){break d}}d=F[F[f>>2]+(e<<2)>>2]}e=(d>>>3&536870908)+c|0;F[e>>2]=F[e>>2]|1<<d;d=-1;b=F[F[f+12>>2]+(b<<2)>>2];if((b|0)==-1){break b}D[a+24|0]=0;a=(b>>>3&536870908)+g|0;F[a>>2]=F[a>>2]|1<<b;a=b+1|0;a=(a>>>0)%3|0?a:b-2|0;if((a|0)!=-1){d=F[F[f>>2]+(a<<2)>>2]}a=c+(d>>>3&536870908)|0;F[a>>2]=F[a>>2]|1<<d;f:{g:{if((b>>>0)%3|0){b=b-1|0;break g}b=b+2|0;a=-1;if((b|0)==-1){break f}}a=F[F[f>>2]+(b<<2)>>2]}b=1<<a;a=c+(a>>>3&536870908)|0;c=F[a>>2];break c}a=c+536870908|0;b=F[c+536870908>>2];c=-2147483648}F[a>>2]=b|c}}function zc(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=M(0),f=M(0),g=M(0),h=M(0),i=M(0),j=0,k=M(0),l=M(0),m=M(0),n=M(0),o=0;a:{if(F[c+28>>2]!=9|G[c+24|0]!=3){break a}a=F[a+4>>2];if(a-2>>>0>28){break a}o=1;j=F[c+80>>2];if(!j){break a}k=M(M(2)/M((1<<a)-2|0));c=F[F[c>>2]>>2]+F[c+48>>2]|0;a=F[F[b>>2]>>2]+F[b+48>>2]|0;b=0;while(1){g=M(0);l=M(0);m=M(0);e=M(M(M(F[a>>2])*k)+M(-1));f=M(M(M(F[a+4>>2])*k)+M(-1));i=M(M(M(1)-M(N(e)))-M(N(f)));h=M(Q(M(-i),M(0)));n=M(-h);f=M(f+(f<M(0)?h:n));e=M(e+(e<M(0)?h:n));h=M(M(f*f)+M(M(i*i)+M(e*e)));if(!(+h<1e-6)){g=M(M(1)/M(U(h)));m=M(f*g);l=M(e*g);g=M(i*g)}a=a+8|0;d=(w(m),y(2));D[c+8|0]=d;D[c+9|0]=d>>>8;D[c+10|0]=d>>>16;D[c+11|0]=d>>>24;d=(w(l),y(2));D[c+4|0]=d;D[c+5|0]=d>>>8;D[c+6|0]=d>>>16;D[c+7|0]=d>>>24;d=(w(g),y(2));D[c|0]=d;D[c+1|0]=d>>>8;D[c+2|0]=d>>>16;D[c+3|0]=d>>>24;c=c+12|0;b=b+1|0;if((j|0)!=(b|0)){continue}break}}return o|0}function Md(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0;g=Z-16|0;Z=g;a:{if(!Sa(1,g+8|0,b)){break a}d=F[b+8>>2];e=F[b+16>>2];f=d-e|0;h=F[g+12>>2];c=d>>>0<e>>>0;d=F[b+20>>2];i=F[b+12>>2]-(c+d|0)|0;c=F[g+8>>2];if((h|0)==(i|0)&c>>>0>f>>>0|h>>>0>i>>>0){break a}d=d+h|0;f=c+e|0;d=f>>>0<e>>>0?d+1|0:d;F[b+16>>2]=f;F[b+20>>2]=d;if((c|0)<=0){break a}b=F[b>>2]+e|0;F[a+40>>2]=b;e=c-1|0;d=b+e|0;f=G[d|0];b:{if(f>>>0<=63){F[a+44>>2]=e;b=G[d|0]&63;break b}c:{switch((f>>>6|0)-1|0){case 0:if(c>>>0<2){break a}c=c-2|0;F[a+44>>2]=c;b=b+c|0;b=G[b+1|0]<<8&16128|G[b|0];break b;case 1:if(c>>>0<3){break a}c=c-3|0;F[a+44>>2]=c;b=b+c|0;b=G[b+1|0]<<8|G[b+2|0]<<16&4128768|G[b|0];break b;default:break c}}c=c-4|0;F[a+44>>2]=c;b=b+c|0;b=(G[b|0]|G[b+1|0]<<8|(G[b+2|0]<<16|G[b+3|0]<<24))&1073741823}F[a+48>>2]=b+16384;j=b>>>0<4177920}Z=g+16|0;return j}function Tf(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0;a:{a=Z-32|0;Z=a;e=ya(c);if(e>>>0<2147483632){b:{c:{if(e>>>0>=11){g=(e|15)+1|0;f=ka(g);F[a+24>>2]=g|-2147483648;F[a+16>>2]=f;F[a+20>>2]=e;g=e+f|0;break c}D[a+27|0]=e;f=a+16|0;g=e+f|0;if(!e){break b}}la(f,c,e)}D[g|0]=0;F[a+8>>2]=0;F[a>>2]=0;F[a+4>>2]=0;d:{c=Ya(b,a+16|0);if((c|0)==(b+4|0)){break d}b=F[c+28>>2];e=F[c+32>>2];if((b|0)==(e|0)){break d}b=e-b|0;if(b&3){break d}e=b>>>2|0;f=F[a+4>>2];b=F[a>>2];g=f-b>>2;e:{if(e>>>0>g>>>0){qa(a,e-g|0);b=F[a>>2];f=F[a+4>>2];break e}if(e>>>0>=g>>>0){break e}f=(e<<2)+b|0;F[a+4>>2]=f}if((b|0)!=(f|0)){e=b;b=F[c+28>>2];la(e,b,F[c+32>>2]-b|0);break d}ta();v()}b=F[d>>2];if(b){F[d+4>>2]=b;ja(b)}F[d>>2]=F[a>>2];F[d+4>>2]=F[a+4>>2];F[d+8>>2]=F[a+8>>2];if(D[a+27|0]<0){ja(F[a+16>>2])}Z=a+32|0;break a}za();v()}}function ud(a){a=a|0;var b=0,c=0,d=0,e=0;F[a>>2]=8284;d=F[a+368>>2];F[a+368>>2]=0;if(d){e=d-4|0;b=F[e>>2];if(b){c=(b<<4)+d|0;while(1){c=c-16|0;if((d|0)!=(c|0)){continue}break}}ja(e)}td(a+216|0);b=F[a+196>>2];if(b){F[a+200>>2]=b;ja(b)}b=F[a+184>>2];if(b){F[a+188>>2]=b;ja(b)}b=F[a+172>>2];if(b){F[a+176>>2]=b;ja(b)}b=F[a+160>>2];if(b){F[a+164>>2]=b;ja(b)}c=F[a+144>>2];if(c){while(1){b=F[c>>2];ja(c);c=b;if(b){continue}break}}b=F[a+136>>2];F[a+136>>2]=0;if(b){ja(b)}b=F[a+120>>2];if(b){ja(b)}b=F[a+108>>2];if(b){ja(b)}b=F[a+96>>2];if(b){ja(b)}b=F[a+72>>2];if(b){F[a+76>>2]=b;ja(b)}b=F[a+60>>2];if(b){ja(b)}b=F[a+48>>2];if(b){F[a+52>>2]=b;ja(b)}b=F[a+36>>2];if(b){F[a+40>>2]=b;ja(b)}b=F[a+24>>2];if(b){F[a+28>>2]=b;ja(b)}b=F[a+12>>2];if(b){F[a+16>>2]=b;ja(b)}b=F[a+8>>2];F[a+8>>2]=0;if(b){Za(b)}return a|0}function Vf(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0;d=Z-16|0;Z=d;a:{e=ya(c);if(e>>>0<2147483632){b:{c:{if(e>>>0>=11){f=(e|15)+1|0;a=ka(f);F[d+8>>2]=f|-2147483648;F[d>>2]=a;F[d+4>>2]=e;f=a+e|0;break c}D[d+11|0]=e;f=d+e|0;a=d;if(!e){break b}}la(a,c,e)}D[f|0]=0;c=G[d+11|0];e=c<<24>>24;b=F[b+4>>2];a=0;d:{if(!b){break d}a=c;c=(e|0)<0;a=c?F[d+4>>2]:a;f=c?F[d>>2]:d;while(1){c=G[b+27|0];g=c<<24>>24<0;c=g?F[b+20>>2]:c;i=c>>>0<a>>>0;e:{f:{g:{h:{i:{j:{h=i?c:a;if(h){g=g?F[b+16>>2]:b+16|0;j=sa(f,g,h);if(j){break j}if(a>>>0>=c>>>0){break i}break e}if(a>>>0>=c>>>0){break h}break e}if((j|0)<0){break e}}c=sa(g,f,h);if(c){break g}}if(i){break f}a=1;break d}if((c|0)<0){break f}a=1;break d}b=b+4|0}b=F[b>>2];if(b){continue}break}a=0}if((e|0)<0){ja(F[d>>2])}Z=d+16|0;break a}za();v()}return a|0}function lc(a,b){var c=0,d=0;c=F[b+8>>2];F[a+4>>2]=F[b+4>>2];F[a+8>>2]=c;F[a+20>>2]=F[b+20>>2];c=F[b+16>>2];F[a+12>>2]=F[b+12>>2];F[a+16>>2]=c;a:{b:{if((a|0)!=(b|0)){c=F[b+28>>2];if(c){d=F[a+24>>2];if(F[a+32>>2]<<5>>>0<c>>>0){if(d){ja(d);F[a+32>>2]=0;F[a+24>>2]=0;F[a+28>>2]=0;c=F[b+28>>2]}if((c|0)<0){break b}c=(c-1>>>5|0)+1|0;d=ka(c<<2);F[a+32>>2]=c;F[a+28>>2]=0;F[a+24>>2]=d;c=F[b+28>>2]}pa(d,F[b+24>>2],(c-1>>>3&536870908)+4|0);c=F[b+28>>2]}else{c=0}F[a+28>>2]=c;c=F[b+40>>2];if(c){d=F[a+36>>2];if(F[a+44>>2]<<5>>>0<c>>>0){if(d){ja(d);F[a+44>>2]=0;F[a+36>>2]=0;F[a+40>>2]=0;c=F[b+40>>2]}if((c|0)<0){break a}c=(c-1>>>5|0)+1|0;d=ka(c<<2);F[a+44>>2]=c;F[a+40>>2]=0;F[a+36>>2]=d;c=F[b+40>>2]}pa(d,F[b+36>>2],(c-1>>>3&536870908)+4|0);b=F[b+40>>2]}else{b=0}F[a+40>>2]=b}return}na();v()}na();v()}function nc(a){var b=0,c=0,d=0;b=F[a+8>>2];d=F[a>>2];a:{if(G[a+12|0]){b:{c:{d:{e:{if((b|0)==-1){break e}c=b+1|0;b=(c>>>0)%3|0?c:b-2|0;if((b|0)==-1){break e}b=F[F[d+12>>2]+(b<<2)>>2];if((b|0)!=-1){break d}}F[a+8>>2]=-1;break c}c=b+1|0;b=(c>>>0)%3|0?c:b-2|0;F[a+8>>2]=b;if((b|0)!=-1){break b}}c=F[a+4>>2];b=-1;f:{if((c|0)==-1){break f}g:{if((c>>>0)%3|0){c=c-1|0;break g}c=c+2|0;b=-1;if((c|0)==-1){break f}}c=F[F[d+12>>2]+(c<<2)>>2];b=-1;if((c|0)==-1){break f}b=c-1|0;if((c>>>0)%3|0){break f}b=c+2|0}D[a+12|0]=0;F[a+8>>2]=b;return}if((b|0)!=F[a+4>>2]){break a}F[a+8>>2]=-1;return}c=-1;h:{if((b|0)==-1){break h}i:{if((b>>>0)%3|0){b=b-1|0;break i}b=b+2|0;c=-1;if((b|0)==-1){break h}}b=F[F[d+12>>2]+(b<<2)>>2];c=-1;if((b|0)==-1){break h}c=b-1|0;if((b>>>0)%3|0){break h}c=b+2|0}F[a+8>>2]=c}}function Od(a){var b=0,c=0,d=0;b=ka(32);D[b+26|0]=0;c=G[1475]|G[1476]<<8;D[b+24|0]=c;D[b+25|0]=c>>>8;c=G[1471]|G[1472]<<8|(G[1473]<<16|G[1474]<<24);d=G[1467]|G[1468]<<8|(G[1469]<<16|G[1470]<<24);D[b+16|0]=d;D[b+17|0]=d>>>8;D[b+18|0]=d>>>16;D[b+19|0]=d>>>24;D[b+20|0]=c;D[b+21|0]=c>>>8;D[b+22|0]=c>>>16;D[b+23|0]=c>>>24;c=G[1463]|G[1464]<<8|(G[1465]<<16|G[1466]<<24);d=G[1459]|G[1460]<<8|(G[1461]<<16|G[1462]<<24);D[b+8|0]=d;D[b+9|0]=d>>>8;D[b+10|0]=d>>>16;D[b+11|0]=d>>>24;D[b+12|0]=c;D[b+13|0]=c>>>8;D[b+14|0]=c>>>16;D[b+15|0]=c>>>24;c=G[1455]|G[1456]<<8|(G[1457]<<16|G[1458]<<24);d=G[1451]|G[1452]<<8|(G[1453]<<16|G[1454]<<24);D[b|0]=d;D[b+1|0]=d>>>8;D[b+2|0]=d>>>16;D[b+3|0]=d>>>24;D[b+4|0]=c;D[b+5|0]=c>>>8;D[b+6|0]=c>>>16;D[b+7|0]=c>>>24;F[a>>2]=-1;ra(a+4|0,b,26);ja(b)}function Kg(a){a=a|0;var b=0,c=0,d=0,e=0,f=0,g=0;e=F[a+4>>2];d=F[e>>2];a:{b=F[a+12>>2];c=F[b+56>>2]-F[b+52>>2]|0;f=c>>2;b:{if(f>>>0<=F[e+8>>2]-d>>2>>>0){break b}if((c|0)<0){break a}b=F[e+4>>2];c=ka(c);f=c+(f<<2)|0;g=c+(b-d&-4)|0;c=g;if((b|0)!=(d|0)){while(1){c=c-4|0;b=b-4|0;F[c>>2]=F[b>>2];if((b|0)!=(d|0)){continue}break}}F[e+8>>2]=f;F[e+4>>2]=g;F[e>>2]=c;if(!d){break b}ja(d)}e=a+8|0;b=F[a+76>>2];c:{if(b){d=F[b>>2];if((d|0)==F[b+4>>2]){return 1}b=0;while(1){c=od(e,F[(b<<2)+d>>2]);if(!c){break c}f=F[a+76>>2];d=F[f>>2];b=b+1|0;if(b>>>0<F[f+4>>2]-d>>2>>>0){continue}break}break c}c=1;a=F[F[a+12>>2]+64>>2];a=F[a+4>>2]-F[a>>2]|0;if(a>>>0<12){break c}a=(a>>2>>>0)/3|0;b=0;while(1){c=od(e,L(b,3));if(!c){break c}b=b+1|0;if((a|0)!=(b|0)){continue}break}}return c|0}na();v()}function Qg(a){a=a|0;var b=0,c=0,d=0,e=0,f=0,g=0;e=F[a+4>>2];d=F[e>>2];a:{b=F[a+12>>2];c=F[b+28>>2]-F[b+24>>2]|0;f=c>>2;b:{if(f>>>0<=F[e+8>>2]-d>>2>>>0){break b}if((c|0)<0){break a}b=F[e+4>>2];c=ka(c);f=c+(f<<2)|0;g=c+(b-d&-4)|0;c=g;if((b|0)!=(d|0)){while(1){c=c-4|0;b=b-4|0;F[c>>2]=F[b>>2];if((b|0)!=(d|0)){continue}break}}F[e+8>>2]=f;F[e+4>>2]=g;F[e>>2]=c;if(!d){break b}ja(d)}e=a+8|0;b=F[a+76>>2];c:{if(b){d=F[b>>2];if((d|0)==F[b+4>>2]){return 1}b=0;while(1){c=pd(e,F[(b<<2)+d>>2]);if(!c){break c}f=F[a+76>>2];d=F[f>>2];b=b+1|0;if(b>>>0<F[f+4>>2]-d>>2>>>0){continue}break}break c}c=1;a=F[a+12>>2];a=F[a+4>>2]-F[a>>2]|0;if(a>>>0<12){break c}a=(a>>2>>>0)/3|0;b=0;while(1){c=pd(e,L(b,3));if(!c){break c}b=b+1|0;if((a|0)!=(b|0)){continue}break}}return c|0}na();v()}function pa(a,b,c){var d=0,e=0;a:{if((a|0)==(b|0)){break a}e=a+c|0;if(b-e>>>0<=0-(c<<1)>>>0){return la(a,b,c)}d=(a^b)&3;b:{c:{if(a>>>0<b>>>0){if(d){d=a;break b}if(!(a&3)){d=a;break c}d=a;while(1){if(!c){break a}D[d|0]=G[b|0];b=b+1|0;c=c-1|0;d=d+1|0;if(d&3){continue}break}break c}d:{if(d){break d}if(e&3){while(1){if(!c){break a}c=c-1|0;d=c+a|0;D[d|0]=G[b+c|0];if(d&3){continue}break}}if(c>>>0<=3){break d}while(1){c=c-4|0;F[c+a>>2]=F[b+c>>2];if(c>>>0>3){continue}break}}if(!c){break a}while(1){c=c-1|0;D[c+a|0]=G[b+c|0];if(c){continue}break}break a}if(c>>>0<=3){break b}while(1){F[d>>2]=F[b>>2];b=b+4|0;d=d+4|0;c=c-4|0;if(c>>>0>3){continue}break}}if(!c){break a}while(1){D[d|0]=G[b|0];d=d+1|0;b=b+1|0;c=c-1|0;if(c){continue}break}}return a}function Pb(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0;d=F[a+8>>2];c=F[a+4>>2];if(d-c>>2>>>0>=b>>>0){if(b){b=b<<2;c=ma(c,0,b)+b|0}F[a+4>>2]=c;return}a:{b:{c:{g=F[a>>2];f=c-g>>2;e=f+b|0;if(e>>>0<1073741824){d=d-g|0;h=d>>>1|0;e=d>>>0>=2147483644?1073741823:e>>>0<h>>>0?h:e;if(e){if(e>>>0>=1073741824){break c}i=ka(e<<2)}d=(f<<2)+i|0;f=b<<2;b=ma(d,0,f);f=b+f|0;e=(e<<2)+i|0;if((c|0)==(g|0)){break b}while(1){c=c-4|0;b=F[c>>2];F[c>>2]=0;d=d-4|0;F[d>>2]=b;if((c|0)!=(g|0)){continue}break}F[a+8>>2]=e;b=F[a+4>>2];F[a+4>>2]=f;c=F[a>>2];F[a>>2]=d;if((b|0)==(c|0)){break a}while(1){b=b-4|0;a=F[b>>2];F[b>>2]=0;if(a){$[F[F[a>>2]+4>>2]](a)}if((b|0)!=(c|0)){continue}break}break a}na();v()}oa();v()}F[a+8>>2]=e;F[a+4>>2]=f;F[a>>2]=b}if(c){ja(c)}}function Yd(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;e=F[b+8>>2];d=F[b+12>>2];g=d;d=F[b+20>>2];k=d;h=F[b+16>>2];c=h+4|0;d=c>>>0<4?d+1|0:d;i=c;a:{if(c>>>0>e>>>0&(d|0)>=(g|0)|(d|0)>(g|0)){break a}j=F[b>>2];c=j+h|0;f=G[c|0]|G[c+1|0]<<8|(G[c+2|0]<<16|G[c+3|0]<<24);F[b+16>>2]=i;F[b+20>>2]=d;c=e;e=k;d=h+8|0;e=d>>>0<8?e+1|0:e;if(c>>>0<d>>>0&(e|0)>=(g|0)|(e|0)>(g|0)){break a}c=i+j|0;c=G[c|0]|G[c+1|0]<<8|(G[c+2|0]<<16|G[c+3|0]<<24);F[b+16>>2]=d;F[b+20>>2]=e;if((c|0)<(f|0)){break a}F[a+16>>2]=c;F[a+12>>2]=f;d=(c>>31)-((f>>31)+(c>>>0<f>>>0)|0)|0;e=c-f|0;if(!d&e>>>0>2147483646|d){break a}d=e+1|0;F[a+20>>2]=d;e=d>>>1|0;F[a+24>>2]=e;F[a+28>>2]=0-e;if(!(d&1)){F[a+24>>2]=e-1}l=Aa(a+112|0,b)}return l|0}function Wc(a,b){var c=0,d=0,e=0,f=0;d=-1;e=-1;f=-1;a:{b:{if((b|0)==-1){break b}e=F[F[F[a+4>>2]+12>>2]+(b<<2)>>2];c=b+1|0;c=(c>>>0)%3|0?c:b-2|0;if((c|0)>=0){f=(c>>>0)/3|0;f=F[(F[F[a>>2]+96>>2]+L(f,12)|0)+(c-L(f,3)<<2)>>2]}c:{if((e|0)==-1){break c}c=((e>>>0)%3|0?-1:2)+e|0;if((c|0)<0){break c}d=(c>>>0)/3|0;d=F[(F[F[a>>2]+96>>2]+L(d,12)|0)+(c-L(d,3)<<2)>>2]}c=-1;if((d|0)!=(f|0)){break a}f=-1;d:{b=((b>>>0)%3|0?-1:2)+b|0;if((b|0)>=0){d=(b>>>0)/3|0;d=F[(F[F[a>>2]+96>>2]+L(d,12)|0)+(b-L(d,3)<<2)>>2];if((e|0)==-1){break b}break d}d=-1;if((e|0)!=-1){break d}break b}b=e+1|0;b=(b>>>0)%3|0?b:e-2|0;if((b|0)<0){break b}c=F[F[a>>2]+96>>2];a=(b>>>0)/3|0;f=F[(c+L(a,12)|0)+(b-L(a,3)<<2)>>2]}c=(d|0)!=(f|0)?-1:e}return c}function Fc(a,b){var c=0,d=0,e=0;c=Z+-64|0;Z=c;d=F[a>>2];e=F[d-4>>2];d=F[d-8>>2];F[c+32>>2]=0;F[c+36>>2]=0;F[c+40>>2]=0;F[c+44>>2]=0;F[c+48>>2]=0;F[c+52>>2]=0;D[c+55|0]=0;D[c+56|0]=0;D[c+57|0]=0;D[c+58|0]=0;D[c+59|0]=0;D[c+60|0]=0;D[c+61|0]=0;D[c+62|0]=0;F[c+24>>2]=0;F[c+28>>2]=0;F[c+20>>2]=0;F[c+16>>2]=11020;F[c+12>>2]=a;F[c+8>>2]=b;a=a+d|0;d=0;a:{if(La(e,b,0)){F[c+56>>2]=1;$[F[F[e>>2]+20>>2]](e,c+8|0,a,a,1,0);d=F[c+32>>2]==1?a:0;break a}$[F[F[e>>2]+24>>2]](e,c+8|0,a,1,0);b:{switch(F[c+44>>2]){case 0:d=F[c+48>>2]==1?F[c+36>>2]==1?F[c+40>>2]==1?F[c+28>>2]:0:0:0;break a;case 1:break b;default:break a}}if(F[c+32>>2]!=1){if(F[c+48>>2]|F[c+36>>2]!=1|F[c+40>>2]!=1){break a}}d=F[c+24>>2]}Z=c- -64|0;return d}function ma(a,b,c){var d=0,e=0,f=0,g=0;a:{if(!c){break a}D[a|0]=b;d=a+c|0;D[d-1|0]=b;if(c>>>0<3){break a}D[a+2|0]=b;D[a+1|0]=b;D[d-3|0]=b;D[d-2|0]=b;if(c>>>0<7){break a}D[a+3|0]=b;D[d-4|0]=b;if(c>>>0<9){break a}d=0-a&3;e=d+a|0;b=L(b&255,16843009);F[e>>2]=b;d=c-d&-4;c=d+e|0;F[c-4>>2]=b;if(d>>>0<9){break a}F[e+8>>2]=b;F[e+4>>2]=b;F[c-8>>2]=b;F[c-12>>2]=b;if(d>>>0<25){break a}F[e+24>>2]=b;F[e+20>>2]=b;F[e+16>>2]=b;F[e+12>>2]=b;F[c-16>>2]=b;F[c-20>>2]=b;F[c-24>>2]=b;F[c-28>>2]=b;g=e&4|24;c=d-g|0;if(c>>>0<32){break a}d=ki(b,0,1,1);f=_;b=e+g|0;while(1){F[b+24>>2]=d;F[b+28>>2]=f;F[b+16>>2]=d;F[b+20>>2]=f;F[b+8>>2]=d;F[b+12>>2]=f;F[b>>2]=d;F[b+4>>2]=f;b=b+32|0;c=c-32|0;if(c>>>0>31){continue}break}}return a}function ie(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;d=F[b+8>>2];e=F[b+12>>2];g=e;e=F[b+20>>2];k=e;h=F[b+16>>2];c=h+4|0;e=c>>>0<4?e+1|0:e;i=c;a:{if(c>>>0>d>>>0&(e|0)>=(g|0)|(e|0)>(g|0)){break a}j=F[b>>2];c=j+h|0;f=G[c|0]|G[c+1|0]<<8|(G[c+2|0]<<16|G[c+3|0]<<24);F[b+16>>2]=i;F[b+20>>2]=e;c=d;d=k;e=h+8|0;d=e>>>0<8?d+1|0:d;if(c>>>0<e>>>0&(d|0)>=(g|0)|(d|0)>(g|0)){break a}c=i+j|0;c=G[c|0]|G[c+1|0]<<8|(G[c+2|0]<<16|G[c+3|0]<<24);F[b+16>>2]=e;F[b+20>>2]=d;if((c|0)<(f|0)){break a}F[a+16>>2]=c;F[a+12>>2]=f;d=(c>>31)-((f>>31)+(c>>>0<f>>>0)|0)|0;b=c-f|0;if(!d&b>>>0>2147483646|d){break a}l=1;d=b+1|0;F[a+20>>2]=d;b=d>>>1|0;F[a+24>>2]=b;F[a+28>>2]=0-b;if(d&1){break a}F[a+24>>2]=b-1}return l|0}function Uc(a,b,c){var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;d=Z-16|0;Z=d;f=F[a+24>>2];k=F[a+28>>2];a:{if((f|0)!=(k|0)){while(1){F[d+8>>2]=0;F[d>>2]=0;F[d+4>>2]=0;a=Sc(F[f>>2],b,d);g=G[d+11|0];h=g<<24>>24;i=3;b:{c:{d:{if(!a){break d}i=0;a=G[c+11|0];e=a<<24>>24;j=(h|0)<0?F[d+4>>2]:g;if((j|0)!=(((e|0)<0?F[c+4>>2]:a)|0)){break d}a=(e|0)<0?F[c>>2]:c;e=(h|0)<0;e:{if(!e){e=d;if(!h){break e}while(1){if(G[e|0]!=G[a|0]){break d}a=a+1|0;e=e+1|0;g=g-1|0;if(g){continue}break}break e}if(!j){break e}if(sa(e?F[d>>2]:d,a,j)){break c}}l=F[f>>2];i=1}if((h|0)>=0){break b}}ja(F[d>>2])}f:{switch(i|0){case 0:case 3:break f;default:break a}}f=f+4|0;if((k|0)!=(f|0)){continue}break}}l=0}Z=d+16|0;return l}function gb(a,b,c){var d=0,e=0,f=0,g=0,h=0,i=0;f=c-b|0;h=f>>2;d=F[a+8>>2];e=F[a>>2];if(h>>>0<=d-e>>2>>>0){d=F[a+4>>2];g=d-e|0;f=g+b|0;i=g>>2;g=i>>>0<h>>>0?f:c;if((g|0)!=(b|0)){while(1){F[e>>2]=F[b>>2];e=e+4|0;b=b+4|0;if((g|0)!=(b|0)){continue}break}}if(h>>>0>i>>>0){if((c|0)!=(g|0)){while(1){F[d>>2]=F[f>>2];d=d+4|0;f=f+4|0;if((f|0)!=(c|0)){continue}break}}F[a+4>>2]=d;return}F[a+4>>2]=e;return}if(e){F[a+4>>2]=e;ja(e);F[a+8>>2]=0;F[a>>2]=0;F[a+4>>2]=0;d=0}a:{if((f|0)<0){break a}e=d>>>1|0;d=d>>>0>=2147483644?1073741823:e>>>0>h>>>0?e:h;if(d>>>0>=1073741824){break a}e=d<<2;d=ka(e);F[a>>2]=d;F[a+8>>2]=d+e;if((b|0)!=(c|0)){c=b;b=(f-4&-4)+4|0;d=la(d,c,b)+b|0}F[a+4>>2]=d;return}na();v()}function Ea(a,b,c){var d=0,e=0,f=0;e=Z-16|0;Z=e;F[a+4>>2]=0;a:{b:{if(!b){break b}f=F[a+8>>2];d=f<<5;c:{if(d>>>0>=b>>>0){F[a+4>>2]=b;break c}F[e+8>>2]=0;F[e>>2]=0;F[e+4>>2]=0;if((b|0)<0){break a}if(d>>>0<=1073741822){f=f<<6;d=b+31&-32;d=d>>>0<f>>>0?f:d}else{d=2147483647}$a(e,d);f=F[a>>2];F[a>>2]=F[e>>2];F[e>>2]=f;d=F[a+4>>2];F[a+4>>2]=b;F[e+4>>2]=d;d=F[a+8>>2];F[a+8>>2]=F[e+8>>2];F[e+8>>2]=d;if(!f){break c}ja(f)}d=b>>>5|0;a=F[a>>2];if(G[c|0]){if(b>>>0>=32){ma(a,255,d<<2)}if((b&-32)==(b|0)){break b}a=a+(d<<2)|0;F[a>>2]=F[a>>2]|-1>>>32-(b&31);break b}if(b>>>0>=32){ma(a,0,d<<2)}if((b&-32)==(b|0)){break b}a=a+(d<<2)|0;F[a>>2]=F[a>>2]&(-1>>>32-(b&31)^-1)}Z=e+16|0;return}na();v()}function If(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0;e=Z-32|0;Z=e;a:{b:{f=ya(c);if(f>>>0<2147483632){c:{d:{if(f>>>0>=11){a=(f|15)+1|0;g=ka(a);F[e+24>>2]=a|-2147483648;F[e+16>>2]=g;F[e+20>>2]=f;a=f+g|0;break d}D[e+27|0]=f;g=e+16|0;a=f+g|0;if(!f){break c}}la(g,c,f)}D[a|0]=0;c=ya(d);if(c>>>0>=2147483632){break b}e:{f:{if(c>>>0>=11){f=(c|15)+1|0;a=ka(f);F[e+8>>2]=f|-2147483648;F[e>>2]=a;F[e+4>>2]=c;g=a+c|0;break f}D[e+11|0]=c;g=c+e|0;a=e;if(!c){break e}}la(a,d,c)}D[g|0]=0;c=F[b+4>>2];a=-1;g:{if(!c){break g}c=Uc(c,e+16|0,e);a=-1;if(!c){break g}a=Pc(b,F[c+24>>2])}if(D[e+11|0]<0){ja(F[e>>2])}if(D[e+27|0]<0){ja(F[e+16>>2])}Z=e+32|0;break a}za();v()}za();v()}return a|0}function se(a,b){a=a|0;b=b|0;a=0;a:{switch(b|0){case 0:a=ka(20);F[a+12>>2]=-1;F[a+16>>2]=0;F[a+4>>2]=0;F[a+8>>2]=0;F[a>>2]=1920;return a|0;case 1:a=ka(24);F[a+12>>2]=-1;F[a+16>>2]=0;F[a+4>>2]=0;F[a+8>>2]=0;F[a>>2]=1920;F[a+20>>2]=0;F[a>>2]=2136;return a|0;case 2:a=ka(48);F[a+12>>2]=-1;F[a+16>>2]=0;F[a+4>>2]=0;F[a+8>>2]=0;F[a>>2]=1920;F[a+20>>2]=0;F[a>>2]=2136;F[a+24>>2]=1624;F[a>>2]=7948;F[a+32>>2]=0;F[a+36>>2]=0;F[a+28>>2]=-1;F[a+40>>2]=0;F[a+44>>2]=0;return a|0;case 3:a=ka(32);F[a+12>>2]=-1;F[a+16>>2]=0;F[a+4>>2]=0;F[a+8>>2]=0;F[a>>2]=1920;F[a+20>>2]=0;F[a>>2]=2136;F[a+24>>2]=1032;F[a>>2]=5812;F[a+28>>2]=-1;break;default:break a}}return a|0}function Be(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;f=F[b>>2];b=F[b+4>>2];d=F[F[a+8>>2]+40>>2];j=d;m=ka((d|0)<0?-1:d);i=b-f|0;e=1;a:{if((i|0)<4){break a}b=0;g=F[c+16>>2];k=d;f=g+d|0;d=0+F[c+20>>2]|0;d=f>>>0<k>>>0?d+1|0:d;h=F[c+12>>2];e=0;if(I[c+8>>2]<f>>>0&(d|0)>=(h|0)|(d|0)>(h|0)){break a}e=i>>2;i=(e|0)<=1?1:e;while(1){b:{g=la(m,F[c>>2]+g|0,j);F[c+16>>2]=f;F[c+20>>2]=d;la(F[F[F[a+8>>2]+64>>2]>>2]+b|0,g,j);l=l+1|0;if((i|0)==(l|0)){break b}b=b+j|0;d=n+F[c+20>>2]|0;g=F[c+16>>2];f=k+g|0;d=f>>>0<k>>>0?d+1|0:d;h=F[c+12>>2];if((d|0)<=(h|0)&I[c+8>>2]>=f>>>0|(d|0)<(h|0)){continue}}break}e=(e|0)<=(l|0)}ja(m);return e|0}function mh(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0;F[b>>2]=1;f=b+8|0;c=F[b+8>>2];d=F[b+12>>2]-c|0;if(d>>>0<=4294967291){Db(f,d+4|0);c=F[f>>2]}c=c+d|0;d=F[a+4>>2];D[c|0]=d;D[c+1|0]=d>>>8;D[c+2|0]=d>>>16;D[c+3|0]=d>>>24;c=F[a+8>>2];if((c|0)!=F[a+12>>2]){d=0;while(1){g=(d<<2)+c|0;c=F[b+8>>2];e=F[b+12>>2]-c|0;if(e>>>0<=4294967291){Db(f,e+4|0);c=F[f>>2]}c=c+e|0;e=F[g>>2];D[c|0]=e;D[c+1|0]=e>>>8;D[c+2|0]=e>>>16;D[c+3|0]=e>>>24;d=d+1|0;c=F[a+8>>2];if(d>>>0<F[a+12>>2]-c>>2>>>0){continue}break}}c=F[b+12>>2];b=F[b+8>>2];c=c-b|0;if(c>>>0<=4294967291){Db(f,c+4|0);b=F[f>>2]}b=b+c|0;a=F[a+20>>2];D[b|0]=a;D[b+1|0]=a>>>8;D[b+2|0]=a>>>16;D[b+3|0]=a>>>24}function mb(a,b){var c=0,d=0,e=0,f=0,g=0,h=0;c=F[a+4>>2];if((c|0)!=F[a+8>>2]){e=F[b+4>>2];F[c>>2]=F[b>>2];F[c+4>>2]=e;F[c+8>>2]=F[b+8>>2];F[a+4>>2]=c+12;return}a:{g=F[a>>2];d=(c-g|0)/12|0;e=d+1|0;if(e>>>0<357913942){f=d<<1;f=d>>>0>=178956970?357913941:e>>>0<f>>>0?f:e;if(f){if(f>>>0>=357913942){break a}e=ka(L(f,12))}else{e=0}d=e+L(d,12)|0;h=F[b+4>>2];F[d>>2]=F[b>>2];F[d+4>>2]=h;F[d+8>>2]=F[b+8>>2];b=d+12|0;if((c|0)!=(g|0)){while(1){c=c-12|0;h=F[c+4>>2];d=d-12|0;F[d>>2]=F[c>>2];F[d+4>>2]=h;F[d+8>>2]=F[c+8>>2];if((c|0)!=(g|0)){continue}break}c=F[a>>2]}F[a+8>>2]=e+L(f,12);F[a+4>>2]=b;F[a>>2]=d;if(c){ja(c)}return}na();v()}oa();v()}function ne(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;h=F[c+12>>2];f=h;e=F[c+20>>2];i=F[c+8>>2];g=F[c+16>>2];a:{if((f|0)<=(e|0)&i>>>0<=g>>>0|(e|0)>(f|0)){break a}j=F[c>>2];k=D[j+g|0];d=e;f=g+1|0;d=f?d:d+1|0;F[c+16>>2]=f;F[c+20>>2]=d;b:{if((k|0)==-2){break b}if((d|0)>=(h|0)&f>>>0>=i>>>0|(d|0)>(h|0)){break a}d=D[f+j|0];g=g+2|0;e=g>>>0<2?e+1|0:e;F[c+16>>2]=g;F[c+20>>2]=e;if((d-4&255)>>>0<251){break a}e=$[F[F[a>>2]+40>>2]](a,k,d)|0;d=F[a+20>>2];F[a+20>>2]=e;if(!d){break b}$[F[F[d>>2]+4>>2]](d)}d=F[a+20>>2];if(d){if(!($[F[F[a>>2]+28>>2]](a,d)|0)){break a}}l=$[F[F[a>>2]+36>>2]](a,b,c)|0}return l|0}function Bf(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;a:{if(I[b+80>>2]>65535){break a}a=F[b+100>>2];b=F[b+96>>2];e=(a-b|0)/12|0;f=L(e,6);g=(f|0)==(c|0);if((a|0)==(b|0)|(c|0)!=(f|0)){break a}g=1;c=e>>>0<=1?1:e;i=c&1;a=0;if(e>>>0>=2){j=c&-2;c=0;while(1){f=L(a,6);h=f+d|0;e=b+L(a,12)|0;E[h>>1]=F[e>>2];E[(f|2)+d>>1]=F[e+4>>2];E[h+4>>1]=F[e+8>>2];f=a|1;e=L(f,6)+d|0;f=b+L(f,12)|0;E[e>>1]=F[f>>2];E[e+2>>1]=F[f+4>>2];E[e+4>>1]=F[f+8>>2];a=a+2|0;c=c+2|0;if((j|0)!=(c|0)){continue}break}}if(!i){break a}c=L(a,6)+d|0;a=b+L(a,12)|0;E[c>>1]=F[a>>2];E[c+2>>1]=F[a+4>>2];E[c+4>>1]=F[a+8>>2]}return g|0}function Gh(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;f=Z-32|0;Z=f;h=e>>>0>1073741823?-1:e<<2;h=ma(ka(h),0,h);g=F[b>>2];i=F[b+4>>2];k=F[h+4>>2];F[f+16>>2]=F[h>>2];F[f+20>>2]=k;F[f+8>>2]=g;F[f+12>>2]=i;i=a+8|0;Jb(f+24|0,i,f+16|0,f+8|0);F[c>>2]=F[f+24>>2];F[c+4>>2]=F[f+28>>2];if((d|0)>(e|0)){k=0-e<<2;a=e;while(1){g=a<<2;j=g+b|0;m=F[j>>2];j=F[j+4>>2];g=c+g|0;l=g+k|0;n=F[l+4>>2];F[f+16>>2]=F[l>>2];F[f+20>>2]=n;F[f+8>>2]=m;F[f+12>>2]=j;Jb(f+24|0,i,f+16|0,f+8|0);F[g>>2]=F[f+24>>2];F[g+4>>2]=F[f+28>>2];a=a+e|0;if((d|0)>(a|0)){continue}break}}ja(h);Z=f+32|0;return 1}function Sf(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0;a=Z-32|0;Z=a;F[a+24>>2]=0;F[a+28>>2]=0;a:{d=ya(c);if(d>>>0<2147483632){b:{c:{if(d>>>0>=11){e=(d|15)+1|0;f=ka(e);F[a+16>>2]=e|-2147483648;F[a+8>>2]=f;F[a+12>>2]=d;e=d+f|0;break c}D[a+19|0]=d;f=a+8|0;e=f+d|0;if(!d){break b}}la(f,c,d)}D[e|0]=0;c=b+4|0;b=Ya(b,a+8|0);d:{if((c|0)==(b|0)){break d}c=F[b+32>>2];b=F[b+28>>2];if((c-b|0)!=8){break d}c=G[b+4|0]|G[b+5|0]<<8|(G[b+6|0]<<16|G[b+7|0]<<24);F[a+24>>2]=G[b|0]|G[b+1|0]<<8|(G[b+2|0]<<16|G[b+3|0]<<24);F[a+28>>2]=c}g=K[a+24>>3];if(D[a+19|0]<0){ja(F[a+8>>2])}Z=a+32|0;break a}za();v()}return+g}function Gc(a,b,c,d,e,f,g){var h=0,i=0,j=0;h=Z-16|0;Z=h;if((b^-1)+2147483631>>>0>=c>>>0){if(G[a+11|0]>>>7|0){i=F[a>>2]}else{i=a}if(b>>>0<1073741799){F[h+12>>2]=b<<1;F[h>>2]=b+c;c=Z-16|0;Z=c;Z=c+16|0;c=h+12|0;c=F[(I[h>>2]<I[c>>2]?c:h)>>2];if(c>>>0>=11){j=c+16&-16;c=j-1|0;c=(c|0)==11?j:c}else{c=10}c=c+1|0}else{c=2147483631}sb(h,c);c=F[h>>2];if(f){db(c,g,f)}g=d-e|0;if((d|0)!=(e|0)){db(c+f|0,e+i|0,g)}if((b|0)!=10){ja(i)}F[a>>2]=c;F[a+8>>2]=F[a+8>>2]&-2147483648|F[h+4>>2]&2147483647;F[a+8>>2]=F[a+8>>2]|-2147483648;b=a;a=f+g|0;F[b+4>>2]=a;D[h+12|0]=0;D[a+c|0]=G[h+12|0];Z=h+16|0;return}za();v()}function _c(a,b,c){var d=0,e=0,f=0,g=0;a:{f=b>>>0<1431655766&(b|c)>=0;b:{if(!f){break b}b=L(b,3);Xb(a,b,10224);Xb(a+12|0,b,10228);d=F[a+24>>2];c:{if(F[a+32>>2]-d>>2>>>0>=c>>>0){break c}if(c>>>0>=1073741824){break a}b=F[a+28>>2];e=c<<2;c=ka(e);e=c+e|0;g=c+(b-d&-4)|0;c=g;if((b|0)!=(d|0)){while(1){c=c-4|0;b=b-4|0;F[c>>2]=F[b>>2];if((b|0)!=(d|0)){continue}break}}F[a+32>>2]=e;F[a+28>>2]=g;F[a+24>>2]=c;if(!d){break c}ja(d)}F[a+80>>2]=0;F[a+84>>2]=0;b=F[a+76>>2];F[a+76>>2]=0;if(b){ja(b)}F[a+68>>2]=0;F[a+72>>2]=0;b=a- -64|0;a=F[b>>2];F[b>>2]=0;if(!a){break b}ja(a)}return f}na();v()}function yd(a){var b=0,c=0,d=0,e=0,f=0;f=1;c=F[a+140>>2];a:{if((c|0)<=0){break a}b=c<<4;d=ka(c>>>0>268435455?-1:b|4);F[d>>2]=c;d=d+4|0;c=d+b|0;b=d;while(1){F[b>>2]=0;F[b+4>>2]=0;D[b+5|0]=0;D[b+6|0]=0;D[b+7|0]=0;D[b+8|0]=0;D[b+9|0]=0;D[b+10|0]=0;D[b+11|0]=0;D[b+12|0]=0;b=b+16|0;if((c|0)!=(b|0)){continue}break}e=F[a+136>>2];F[a+136>>2]=d;if(e){c=e-4|0;d=F[c>>2];if(d){b=(d<<4)+e|0;while(1){b=b-16|0;if((e|0)!=(b|0)){continue}break}}ja(c)}b=0;if(F[a+140>>2]<=0){break a}while(1){f=Aa(F[a+136>>2]+(b<<4)|0,a);if(!f){break a}b=b+1|0;if((b|0)<F[a+140>>2]){continue}break}}return f}\nfunction Sd(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0;d=F[b+8>>2];c=F[b+12>>2];g=c;c=F[b+20>>2];i=c;h=F[b+16>>2];f=h+4|0;c=f>>>0<4?c+1|0:c;a:{if(d>>>0<f>>>0&(c|0)>=(g|0)|(c|0)>(g|0)){break a}e=h+F[b>>2]|0;e=G[e|0]|G[e+1|0]<<8|(G[e+2|0]<<16|G[e+3|0]<<24);F[b+16>>2]=f;F[b+20>>2]=c;f=d;d=i;c=h+8|0;d=c>>>0<8?d+1|0:d;if(c>>>0>f>>>0&(d|0)>=(g|0)|(d|0)>(g|0)){break a}F[b+16>>2]=c;F[b+20>>2]=d;if(!(e&1)){break a}d=O(e)^31;if(d-1>>>0>28){break a}F[a+8>>2]=d+1;d=-2<<d;c=d^-2;F[a+16>>2]=c;F[a+12>>2]=d^-1;F[a+24>>2]=c>>1;J[a+20>>2]=M(2)/M(c|0);j=Aa(a+96|0,b)}return j|0}function bc(a,b){var c=0;c=F[b+4>>2];F[a>>2]=F[b>>2];F[a+4>>2]=c;c=F[b+60>>2];F[a+56>>2]=F[b+56>>2];F[a+60>>2]=c;c=F[b+52>>2];F[a+48>>2]=F[b+48>>2];F[a+52>>2]=c;c=F[b+44>>2];F[a+40>>2]=F[b+40>>2];F[a+44>>2]=c;c=F[b+36>>2];F[a+32>>2]=F[b+32>>2];F[a+36>>2]=c;c=F[b+28>>2];F[a+24>>2]=F[b+24>>2];F[a+28>>2]=c;c=F[b+20>>2];F[a+16>>2]=F[b+16>>2];F[a+20>>2]=c;c=F[b+12>>2];F[a+8>>2]=F[b+8>>2];F[a+12>>2]=c;F[a+88>>2]=0;F[a+64>>2]=0;F[a+68>>2]=0;F[a+72>>2]=0;F[a+76>>2]=0;D[a+77|0]=0;D[a+78|0]=0;D[a+79|0]=0;D[a+80|0]=0;D[a+81|0]=0;D[a+82|0]=0;D[a+83|0]=0;D[a+84|0]=0;return a}function ac(a,b){var c=0,d=0,e=0,f=0,g=0;a:{if(F[a+64>>2]){break a}c=ka(32);F[c+16>>2]=0;F[c+20>>2]=0;F[c+8>>2]=0;F[c>>2]=0;F[c+4>>2]=0;F[c+24>>2]=0;F[c+28>>2]=0;d=F[a+64>>2];F[a+64>>2]=c;if(!d){break a}c=F[d>>2];if(c){F[d+4>>2]=c;ja(c)}ja(d)}d=F[a+64>>2];c=F[a+28>>2]-1|0;if(c>>>0<=10){c=F[(c<<2)+10148>>2]}else{c=-1}c=L(c,G[a+24|0]);f=c>>31;g=md(d,0,ki(c,f,b,0),_);if(g){d=F[a+64>>2];F[a>>2]=d;e=F[d+20>>2];F[a+8>>2]=F[d+16>>2];F[a+12>>2]=e;e=F[d+24>>2];d=F[d+28>>2];F[a+48>>2]=0;F[a+52>>2]=0;F[a+40>>2]=c;F[a+44>>2]=f;F[a+16>>2]=e;F[a+20>>2]=d;F[a+80>>2]=b}return g}function Af(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0;a=F[b+100>>2];b=F[b+96>>2];h=a-b|0;a:{if((h|0)!=(c|0)|(a|0)==(b|0)){break a}g=(c|0)/12|0;e=g>>>0<=1?1:g;j=e&1;a=0;if(g>>>0>=2){k=e&-2;g=0;while(1){e=L(a,12);i=e+d|0;f=b+e|0;F[i>>2]=F[f>>2];F[(e|4)+d>>2]=F[f+4>>2];F[i+8>>2]=F[f+8>>2];f=L(a|1,12);e=f+d|0;f=b+f|0;F[e>>2]=F[f>>2];F[e+4>>2]=F[f+4>>2];F[e+8>>2]=F[f+8>>2];a=a+2|0;g=g+2|0;if((k|0)!=(g|0)){continue}break}}if(!j){break a}e=d;d=L(a,12);a=e+d|0;b=b+d|0;F[a>>2]=F[b>>2];F[a+4>>2]=F[b+4>>2];F[a+8>>2]=F[b+8>>2]}return(c|0)==(h|0)|0}function Kh(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0;c=F[b+8>>2];d=F[b+12>>2];g=d;d=F[b+20>>2];i=d;h=F[b+16>>2];f=h+4|0;d=f>>>0<4?d+1|0:d;a:{if(c>>>0<f>>>0&(d|0)>=(g|0)|(d|0)>(g|0)){break a}e=h+F[b>>2]|0;e=G[e|0]|G[e+1|0]<<8|(G[e+2|0]<<16|G[e+3|0]<<24);F[b+16>>2]=f;F[b+20>>2]=d;f=c;c=i;d=h+8|0;c=d>>>0<8?c+1|0:c;if(d>>>0>f>>>0&(c|0)>=(g|0)|(c|0)>(g|0)){break a}F[b+16>>2]=d;F[b+20>>2]=c;if(!(e&1)){break a}b=O(e)^31;if(b-1>>>0>28){break a}j=1;F[a+8>>2]=b+1;b=-2<<b;c=b^-2;F[a+16>>2]=c;F[a+12>>2]=b^-1;F[a+24>>2]=c>>1;J[a+20>>2]=M(2)/M(c|0)}return j|0}function Ya(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0;f=a+4|0;a=F[a+4>>2];a:{b:{if(!a){break b}d=G[b+11|0];c=d<<24>>24<0;g=c?F[b>>2]:b;d=c?F[b+4>>2]:d;b=f;while(1){e=G[a+27|0];c=e<<24>>24<0;e=c?F[a+20>>2]:e;h=e>>>0>d>>>0;i=h?d:e;c:{if(i){c=sa(c?F[a+16>>2]:a+16|0,g,i);if(c){break c}}c=d>>>0>e>>>0?-1:h}c=(c|0)<0;b=c?b:a;a=F[(c?a+4|0:a)>>2];if(a){continue}break}if((b|0)==(f|0)){break b}c=G[b+27|0];a=c<<24>>24<0;d:{c=a?F[b+20>>2]:c;e=c>>>0<d>>>0?c:d;if(e){a=sa(g,a?F[b+16>>2]:b+16|0,e);if(a){break d}}if(c>>>0>d>>>0){break b}break a}if((a|0)>=0){break a}}b=f}return b}function Oe(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;if(La(a,F[b+8>>2],e)){if(!(F[b+28>>2]==1|F[b+4>>2]!=(c|0))){F[b+28>>2]=d}return}a:{if(La(a,F[b>>2],e)){if(!(F[b+16>>2]!=(c|0)&F[b+20>>2]!=(c|0))){if((d|0)!=1){break a}F[b+32>>2]=1;return}F[b+32>>2]=d;b:{if(F[b+44>>2]==4){break b}E[b+52>>1]=0;a=F[a+8>>2];$[F[F[a>>2]+20>>2]](a,b,c,c,1,e);if(G[b+53|0]){F[b+44>>2]=3;if(!G[b+52|0]){break b}break a}F[b+44>>2]=4}F[b+20>>2]=c;F[b+40>>2]=F[b+40>>2]+1;if(F[b+36>>2]!=1|F[b+24>>2]!=2){break a}D[b+54|0]=1;return}a=F[a+8>>2];$[F[F[a>>2]+24>>2]](a,b,c,d,e)}}function Ig(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0;f=ka(64);c=ka(12);F[c+8>>2]=F[F[a+4>>2]+80>>2];F[c>>2]=9968;F[c+4>>2]=0;f=yc(f,c);a:{b:{if((b|0)<0){c=f;break b}h=a+8|0;c=F[a+12>>2];e=F[a+8>>2];g=c-e>>2;c:{if((g|0)>(b|0)){break c}d=b+1|0;if(b>>>0>=g>>>0){Pb(h,d-g|0);break c}if(d>>>0>=g>>>0){break c}e=e+(d<<2)|0;if((e|0)!=(c|0)){while(1){c=c-4|0;d=F[c>>2];F[c>>2]=0;if(d){$[F[F[d>>2]+4>>2]](d)}if((c|0)!=(e|0)){continue}break}}F[a+12>>2]=e}a=F[h>>2]+(b<<2)|0;c=F[a>>2];F[a>>2]=f;if(!c){break a}}$[F[F[c>>2]+4>>2]](c)}return(b^-1)>>>31|0}function we(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0;c=F[a+60>>2];a:{if(!c){break a}F[c+4>>2]=a+48;if(!($[F[F[c>>2]+12>>2]](c)|0)){break a}b:{c=$[F[F[a>>2]+24>>2]](a)|0;if((c|0)<=0){break b}while(1){c:{f=F[($[F[F[a>>2]+28>>2]](a)|0)+4>>2];g=$[F[F[a>>2]+20>>2]](a,d)|0;e=F[a+60>>2];if(!($[F[F[e>>2]+8>>2]](e,F[F[f+8>>2]+(g<<2)>>2])|0)){break c}d=d+1|0;if((c|0)!=(d|0)){continue}break b}break}return 0}d=0;if(!($[F[F[a>>2]+36>>2]](a,b)|0)){break a}if(!($[F[F[a>>2]+40>>2]](a,b)|0)){break a}d=$[F[F[a>>2]+44>>2]](a)|0}return d|0}function Id(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0;c=F[a+216>>2];if((c|0)!=F[a+220>>2]){while(1){a:{c=F[L(e,144)+c>>2];if((c|0)<0){break a}d=F[a+4>>2];f=F[d+8>>2];if((c|0)>=F[d+12>>2]-f>>2){break a}d=0;c=F[(c<<2)+f>>2];if(($[F[F[c>>2]+24>>2]](c)|0)<=0){break a}while(1){if(($[F[F[c>>2]+20>>2]](c,d)|0)!=(b|0)){d=d+1|0;if(($[F[F[c>>2]+24>>2]](c)|0)>(d|0)){continue}break a}break}a=F[a+216>>2]+L(e,144)|0;return(G[a+100|0]?a+4|0:0)|0}e=e+1|0;c=F[a+216>>2];if(e>>>0<(F[a+220>>2]-c|0)/144>>>0){continue}break}}return 0}function nd(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0;c=F[a+8>>2];d=F[a+4>>2];if(c-d>>2>>>0>=b>>>0){if(b){b=b<<2;d=ma(d,0,b)+b|0}F[a+4>>2]=d;return}a:{f=F[a>>2];g=d-f>>2;e=g+b|0;if(e>>>0<1073741824){c=c-f|0;h=c>>>1|0;e=c>>>0>=2147483644?1073741823:e>>>0<h>>>0?h:e;if(e){if(e>>>0>=1073741824){break a}i=ka(e<<2)}c=(g<<2)+i|0;b=b<<2;b=ma(c,0,b)+b|0;if((d|0)!=(f|0)){while(1){c=c-4|0;d=d-4|0;F[c>>2]=F[d>>2];if((d|0)!=(f|0)){continue}break}}F[a+8>>2]=(e<<2)+i;F[a+4>>2]=b;F[a>>2]=c;if(f){ja(f)}return}na();v()}oa();v()}function bb(a){var b=0,c=0,d=0,e=0,f=0;d=F[a+8>>2];a:{if(G[d+84|0]){break a}b=F[a+16>>2];if(!b|!G[b+84|0]){break a}c=F[d+72>>2];e=F[d+68>>2];D[b+84|0]=0;c=c-e>>2;f=F[b+68>>2];e=F[b+72>>2]-f>>2;b:{if(c>>>0>e>>>0){ab(b+68|0,c-e|0,2004);d=F[a+8>>2];break b}if(c>>>0>=e>>>0){break b}F[b+72>>2]=f+(c<<2)}if(G[d+84|0]){break a}c=F[d+68>>2];if((c|0)==F[d+72>>2]){break a}e=F[F[a+16>>2]+68>>2];b=0;while(1){f=b<<2;F[f+e>>2]=F[c+f>>2];b=b+1|0;c=F[d+68>>2];if(b>>>0<F[d+72>>2]-c>>2>>>0){continue}break}}return F[a+16>>2]}function Lf(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0;e=Z+-64|0;Z=e;f=Ja(e+8|0);F[f+16>>2]=0;F[f+20>>2]=0;F[f>>2]=b;F[f+8>>2]=c;F[f+12>>2]=0;b=e+48|0;Pd(b,a,f,d);F[a+24>>2]=F[e+48>>2];f=a+24|0;a:{if((f|0)==(b|0)){break a}b=a+28|0;c=e+48|4;g=G[e+63|0];d=g<<24>>24;if(D[a+39|0]>=0){if((d|0)>=0){a=F[c+4>>2];F[b>>2]=F[c>>2];F[b+4>>2]=a;F[b+8>>2]=F[c+8>>2];break a}qb(b,F[e+52>>2],F[e+56>>2]);break a}a=(d|0)<0;rb(b,a?F[e+52>>2]:c,a?F[e+56>>2]:g)}if(D[e+63|0]<0){ja(F[e+52>>2])}Z=e- -64|0;return f|0}function Jf(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0;a=Z-32|0;Z=a;a:{d=ya(c);if(d>>>0<2147483632){b:{c:{if(d>>>0>=11){e=(d|15)+1|0;f=ka(e);F[a+24>>2]=e|-2147483648;F[a+16>>2]=f;F[a+20>>2]=d;e=d+f|0;break c}D[a+27|0]=d;f=a+16|0;e=f+d|0;if(!d){break b}}la(f,c,d)}D[e|0]=0;D[a+4|0]=0;F[a>>2]=1701667182;D[a+11|0]=4;d=F[b+4>>2];c=-1;d:{if(!d){break d}d=Uc(d,a,a+16|0);c=-1;if(!d){break d}c=Pc(b,F[d+24>>2])}b=c;if(D[a+11|0]<0){ja(F[a>>2])}if(D[a+27|0]<0){ja(F[a+16>>2])}Z=a+32|0;break a}za();v()}return b|0}function Hd(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0;c=F[a+216>>2];if((c|0)!=F[a+220>>2]){while(1){a:{c=F[L(e,144)+c>>2];if((c|0)<0){break a}d=F[a+4>>2];f=F[d+8>>2];if((c|0)>=F[d+12>>2]-f>>2){break a}d=0;c=F[(c<<2)+f>>2];if(($[F[F[c>>2]+24>>2]](c)|0)<=0){break a}while(1){if(($[F[F[c>>2]+20>>2]](c,d)|0)!=(b|0)){d=d+1|0;if(($[F[F[c>>2]+24>>2]](c)|0)>(d|0)){continue}break a}break}return(F[a+216>>2]+L(e,144)|0)+104|0}e=e+1|0;c=F[a+216>>2];if(e>>>0<(F[a+220>>2]-c|0)/144>>>0){continue}break}}return a+184|0}function Uf(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0;d=Z-16|0;Z=d;F[d+12>>2]=0;a:{e=ya(c);if(e>>>0<2147483632){b:{c:{if(e>>>0>=11){f=(e|15)+1|0;a=ka(f);F[d+8>>2]=f|-2147483648;F[d>>2]=a;F[d+4>>2]=e;f=a+e|0;break c}D[d+11|0]=e;f=d+e|0;a=d;if(!e){break b}}la(a,c,e)}D[f|0]=0;a=Ya(b,d);d:{if((a|0)==(b+4|0)){break d}b=F[a+32>>2];a=F[a+28>>2];if((b-a|0)!=4){break d}F[d+12>>2]=G[a|0]|G[a+1|0]<<8|(G[a+2|0]<<16|G[a+3|0]<<24)}a=F[d+12>>2];if(D[d+11|0]<0){ja(F[d>>2])}Z=d+16|0;break a}za();v()}return a|0}function Mf(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0;d=Z+-64|0;Z=d;e=Ja(d+8|0);F[e+16>>2]=0;F[e+20>>2]=0;F[e>>2]=b;F[e+8>>2]=c;F[e+12>>2]=0;b=d+48|0;Od(b);F[a+24>>2]=F[d+48>>2];f=a+24|0;a:{if((b|0)==(f|0)){break a}b=a+28|0;c=d+48|4;g=G[d+63|0];e=g<<24>>24;if(D[a+39|0]>=0){if((e|0)>=0){a=F[c+4>>2];F[b>>2]=F[c>>2];F[b+4>>2]=a;F[b+8>>2]=F[c+8>>2];break a}qb(b,F[d+52>>2],F[d+56>>2]);break a}a=(e|0)<0;rb(b,a?F[d+52>>2]:c,a?F[d+56>>2]:g)}if(D[d+63|0]<0){ja(F[d+52>>2])}Z=d- -64|0;return f|0}function Ce(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0;e=1;a:{if(($[F[F[b>>2]+20>>2]](b)|0)<=0){break a}while(1){e=0;d=Qc(F[F[a+4>>2]+4>>2],$[F[F[b>>2]+24>>2]](b,f)|0);if((d|0)==-1){break a}g=F[a+4>>2];c=0;b:{if((d|0)<0){break b}h=F[g+4>>2];if((d|0)>=F[h+12>>2]-F[h+8>>2]>>2){break b}c=F[F[g+8>>2]+(F[F[g+20>>2]+(d<<2)>>2]<<2)>>2];c=$[F[F[c>>2]+32>>2]](c,d)|0}if(!c){break a}if(!($[F[F[b>>2]+28>>2]](b,c)|0)){break a}e=1;f=f+1|0;if(($[F[F[b>>2]+20>>2]](b)|0)>(f|0)){continue}break}}return e|0}function Db(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0;a:{c=F[a+4>>2];e=F[a>>2];d=c-e|0;b:{if(d>>>0<b>>>0){g=b-d|0;f=F[a+8>>2];if(g>>>0<=f-c>>>0){h=a,i=ma(c,0,g)+g|0,F[h+4>>2]=i;break b}if((b|0)<0){break a}c=f-e|0;f=c<<1;c=c>>>0>=1073741823?2147483647:b>>>0<f>>>0?f:b;f=ka(c);ma(f+d|0,0,g);d=pa(f,e,d);F[a+8>>2]=d+c;F[a+4>>2]=b+d;F[a>>2]=d;if(!e){break b}ja(e);break b}if(b>>>0>=d>>>0){break b}F[a+4>>2]=b+e}b=F[a+28>>2];c=b;d=b+1|0;b=F[a+24>>2]+1|0;e=b?c:d;F[a+24>>2]=b;F[a+28>>2]=e;return}na();v()}function Ma(a,b){var c=0,d=0,e=0,f=0,g=0,h=0;e=F[a+4>>2];if((e|0)!=F[a+8>>2]){F[e>>2]=F[b>>2];F[a+4>>2]=e+4;return}a:{g=F[a>>2];f=e-g|0;c=f>>2;d=c+1|0;if(d>>>0<1073741824){h=c<<2;c=f>>>1|0;c=f>>>0>=2147483644?1073741823:c>>>0>d>>>0?c:d;if(c){if(c>>>0>=1073741824){break a}f=ka(c<<2)}else{f=0}d=h+f|0;F[d>>2]=F[b>>2];b=d+4|0;if((e|0)!=(g|0)){while(1){d=d-4|0;e=e-4|0;F[d>>2]=F[e>>2];if((e|0)!=(g|0)){continue}break}}F[a+8>>2]=f+(c<<2);F[a+4>>2]=b;F[a>>2]=d;if(g){ja(g)}return}na();v()}oa();v()}function va(a){F[a>>2]=-1;F[a+4>>2]=0;F[a+8>>2]=0;F[a+32>>2]=0;F[a+36>>2]=0;D[a+28|0]=1;F[a+20>>2]=0;F[a+24>>2]=0;F[a+12>>2]=0;F[a+16>>2]=0;F[a+40>>2]=0;F[a+44>>2]=0;F[a+48>>2]=0;F[a+52>>2]=0;F[a+56>>2]=0;F[a+60>>2]=0;F[a+64>>2]=0;F[a+68>>2]=0;F[a+76>>2]=0;F[a+80>>2]=0;F[a+84>>2]=0;F[a+88>>2]=0;F[a+92>>2]=0;F[a+96>>2]=0;F[a+72>>2]=a+4;F[a+104>>2]=0;F[a+108>>2]=0;D[a+100|0]=1;F[a+112>>2]=0;F[a+116>>2]=0;F[a+120>>2]=0;F[a+124>>2]=0;F[a+128>>2]=0;F[a+132>>2]=0;F[a+136>>2]=0;F[a+140>>2]=0}function Hb(a,b){var c=0,d=0,e=0,f=0;d=F[a+12>>2];c=F[a+16>>2]-d>>2;a:{if(c>>>0<b>>>0){qa(a+12|0,b-c|0);break a}if(b>>>0>=c>>>0){break a}F[a+16>>2]=d+(b<<2)}b:{c=F[a>>2];c:{if(F[a+8>>2]-c>>2>>>0>=b>>>0){break c}if(b>>>0>=1073741824){break b}d=F[a+4>>2];e=b<<2;b=ka(e);e=b+e|0;f=b+(d-c&-4)|0;b=f;if((c|0)!=(d|0)){while(1){b=b-4|0;d=d-4|0;F[b>>2]=F[d>>2];if((c|0)!=(d|0)){continue}break}}F[a+8>>2]=e;F[a+4>>2]=f;F[a>>2]=b;if(!c){break c}ja(c)}return}na();v()}function tb(a){a=a|0;var b=0,c=0,d=0;F[a>>2]=10300;b=F[a+68>>2];if(b){F[a+72>>2]=b;ja(b)}b=F[a+56>>2];if(b){F[a+60>>2]=b;ja(b)}b=F[a+44>>2];if(b){F[a+48>>2]=b;ja(b)}b=F[a+32>>2];if(b){F[a+36>>2]=b;ja(b)}b=F[a+20>>2];if(b){F[a+24>>2]=b;ja(b)}b=F[a+8>>2];if(b){d=b;c=F[a+12>>2];if((b|0)!=(c|0)){while(1){c=c-4|0;d=F[c>>2];F[c>>2]=0;if(d){xa(d)}if((b|0)!=(c|0)){continue}break}d=F[a+8>>2]}F[a+12>>2]=b;ja(d)}b=F[a+4>>2];F[a+4>>2]=0;if(b){ic(b)}return a|0}function qa(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0;e=F[a+8>>2];c=F[a+4>>2];if(e-c>>2>>>0>=b>>>0){if(b){b=b<<2;c=ma(c,0,b)+b|0}F[a+4>>2]=c;return}a:{f=c;c=F[a>>2];g=f-c|0;h=g>>2;d=h+b|0;if(d>>>0<1073741824){e=e-c|0;f=e>>>1|0;d=e>>>0>=2147483644?1073741823:d>>>0<f>>>0?f:d;if(d){if(d>>>0>=1073741824){break a}i=ka(d<<2)}b=b<<2;e=ma((h<<2)+i|0,0,b);f=d<<2;d=pa(i,c,g);F[a+8>>2]=f+d;F[a+4>>2]=b+e;F[a>>2]=d;if(c){ja(c)}return}na();v()}oa();v()}function gc(a,b){var c=0,d=0,e=0,f=0;c=a+4|0;a=Ya(a,b);a:{if((c|0)==(a|0)){break a}b=a+28|0;b=D[a+39|0]<0?F[b>>2]:b;while(1){a=b;b=a+1|0;c=D[a|0];if((c|0)==32|c-9>>>0<5){continue}break}b:{c:{d:{c=D[a|0];switch(c-43|0){case 0:break c;case 2:break d;default:break b}}e=1}c=D[b|0];a=b}if(c-48>>>0<10){while(1){d=(L(d,10)-D[a|0]|0)+48|0;b=D[a+1|0];a=a+1|0;if(b-48>>>0<10){continue}break}}a=e?d:0-d|0;if((a|0)==-1){break a}f=(a|0)!=0}return f}function Qa(a,b){var c=0,d=0,e=0,f=0,g=0,h=0;a=F[a>>2];c=F[a+4>>2];e=F[a+8>>2];if(c>>>0<e>>>0){F[c>>2]=F[b>>2];F[a+4>>2]=c+4;return}a:{d=c;c=F[a>>2];g=d-c|0;d=g>>2;f=d+1|0;if(f>>>0<1073741824){h=d<<2;e=e-c|0;d=e>>>1|0;f=e>>>0>=2147483644?1073741823:f>>>0<d>>>0?d:f;if(f){if(f>>>0>=1073741824){break a}e=ka(f<<2)}else{e=0}d=h+e|0;F[d>>2]=F[b>>2];b=pa(e,c,g);F[a+8>>2]=b+(f<<2);F[a+4>>2]=d+4;F[a>>2]=b;if(c){ja(c)}return}na();v()}oa();v()}function db(a,b,c){var d=0,e=0,f=0,g=0,h=0;f=Z-16|0;Z=f;d=Z-32|0;Z=d;e=Z-16|0;Z=e;F[e+12>>2]=b;F[e+8>>2]=b+c;F[d+24>>2]=F[e+12>>2];F[d+28>>2]=F[e+8>>2];Z=e+16|0;c=Z-16|0;Z=c;h=F[d+28>>2];e=F[d+24>>2];g=h-e|0;if((e|0)!=(h|0)){pa(a,e,g)}F[c+12>>2]=e+g;F[c+8>>2]=a+g;F[d+16>>2]=F[c+12>>2];F[d+20>>2]=F[c+8>>2];Z=c+16|0;F[d+12>>2]=(F[d+16>>2]-b|0)+b;F[d+8>>2]=(F[d+20>>2]-a|0)+a;F[f+8>>2]=F[d+12>>2];F[f+12>>2]=F[d+8>>2];Z=d+32|0;Z=f+16|0}function _a(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0;e=F[a+8>>2];c=F[a+4>>2];if(e-c>>3>>>0>=b>>>0){if(b){b=b<<3;c=ma(c,0,b)+b|0}F[a+4>>2]=c;return}a:{f=c;c=F[a>>2];g=f-c|0;h=g>>3;d=h+b|0;if(d>>>0<536870912){e=e-c|0;f=e>>>2|0;d=e>>>0>=2147483640?536870911:d>>>0<f>>>0?f:d;if(d){if(d>>>0>=536870912){break a}i=ka(d<<3)}b=b<<3;e=ma((h<<3)+i|0,0,b);f=d<<3;d=pa(i,c,g);F[a+8>>2]=f+d;F[a+4>>2]=b+e;F[a>>2]=d;if(c){ja(c)}return}na();v()}oa();v()}function re(a){a=a|0;var b=0,c=0,d=0;F[a>>2]=2016;b=F[a+60>>2];F[a+60>>2]=0;if(b){$[F[F[b>>2]+4>>2]](b)}b=F[a+48>>2];if(b){F[a+52>>2]=b;ja(b)}d=F[a+36>>2];if(d){c=F[a+40>>2];b=d;if((c|0)!=(b|0)){while(1){c=c-4|0;b=F[c>>2];F[c>>2]=0;if(b){$[F[F[b>>2]+4>>2]](b)}if((c|0)!=(d|0)){continue}break}b=F[a+36>>2]}F[a+40>>2]=d;ja(b)}F[a>>2]=1776;b=F[a+16>>2];if(b){F[a+20>>2]=b;ja(b)}b=F[a+4>>2];if(b){F[a+8>>2]=b;ja(b)}return a|0}function qe(a){a=a|0;var b=0,c=0,d=0;F[a>>2]=2016;b=F[a+60>>2];F[a+60>>2]=0;if(b){$[F[F[b>>2]+4>>2]](b)}b=F[a+48>>2];if(b){F[a+52>>2]=b;ja(b)}d=F[a+36>>2];if(d){c=F[a+40>>2];b=d;if((c|0)!=(b|0)){while(1){c=c-4|0;b=F[c>>2];F[c>>2]=0;if(b){$[F[F[b>>2]+4>>2]](b)}if((c|0)!=(d|0)){continue}break}b=F[a+36>>2]}F[a+40>>2]=d;ja(b)}F[a>>2]=1776;b=F[a+16>>2];if(b){F[a+20>>2]=b;ja(b)}b=F[a+4>>2];if(b){F[a+8>>2]=b;ja(b)}ja(a)}function Eg(a){a=a|0;var b=0,c=0,d=0,e=0,f=0;a:{b=F[a+8>>2];b:{if((b|0)<0){break b}c=F[a+4>>2];e=F[c>>2];d=F[c+4>>2]-e>>2;c:{if(d>>>0<b>>>0){nd(c,b-d|0);f=F[a+8>>2];break c}f=b;if(b>>>0>=d>>>0){break c}F[c+4>>2]=e+(b<<2);f=b}d=f;if((d|0)<=0){break b}a=F[a+4>>2];c=F[a>>2];e=F[a+4>>2]-c>>2;a=0;while(1){if((a|0)==(e|0)){break a}F[c+(a<<2)>>2]=a;a=a+1|0;if((d|0)!=(a|0)){continue}break}}return(b^-1)>>>31|0}ta();v()}function fh(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0;d=Z-16|0;Z=d;e=F[a+4>>2];a:{if((e|0)==-1){break a}c=F[b+20>>2];if(!!F[b+16>>2]&(c|0)>=0|(c|0)>0){break a}pb(b,F[b+4>>2],F[a+8>>2],F[a+12>>2]);c=F[b+20>>2];if(!!F[b+16>>2]&(c|0)>=0|(c|0)>0){break a}pb(b,F[b+4>>2],a+20|0,a+24|0);c=F[b+20>>2];f=F[b+16>>2];D[d+15|0]=F[a+4>>2];if(!!f&(c|0)>=0|(c|0)>0){break a}pb(b,F[b+4>>2],d+15|0,d+16|0)}Z=d+16|0;return(e|0)!=-1|0}function kd(a,b){var c=0,d=0,e=0,f=0,g=0,h=0;e=F[a+8>>2];c=F[a+4>>2];if(e-c>>1>>>0>=b>>>0){if(b){b=b<<1;c=ma(c,0,b)+b|0}F[a+4>>2]=c;return}a:{f=c;c=F[a>>2];g=f-c|0;f=g>>1;d=f+b|0;if((d|0)>=0){e=e-c|0;d=e>>>0>=2147483646?2147483647:d>>>0<e>>>0?e:d;if(d){if((d|0)<0){break a}h=ka(d<<1)}b=b<<1;e=ma((f<<1)+h|0,0,b);f=d<<1;d=pa(h,c,g);F[a+8>>2]=f+d;F[a+4>>2]=b+e;F[a>>2]=d;if(c){ja(c)}return}na();v()}oa();v()}function of(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0;d=Z-16|0;Z=d;Pd(d,a,b,c);F[a+24>>2]=F[d>>2];e=a+24|0;a:{if((e|0)==(d|0)){break a}b=a+28|0;c=d|4;f=G[d+15|0];g=f<<24>>24;if(D[a+39|0]>=0){if((g|0)>=0){a=F[c+4>>2];F[b>>2]=F[c>>2];F[b+4>>2]=a;F[b+8>>2]=F[c+8>>2];break a}qb(b,F[d+4>>2],F[d+8>>2]);break a}a=(g|0)<0;rb(b,a?F[d+4>>2]:c,a?F[d+8>>2]:f)}if(D[d+15|0]<0){ja(F[d+4>>2])}Z=d+16|0;return e|0}function ra(a,b,c){var d=0,e=0,f=0,g=0;e=Z-16|0;Z=e;a:{b:{if(c>>>0<11){d=a;D[a+11|0]=G[a+11|0]&128|c;D[a+11|0]=G[a+11|0]&127;break b}if(c>>>0>2147483631){break a}g=e+8|0;if(c>>>0>=11){f=c+16&-16;d=f-1|0;d=(d|0)==11?f:d}else{d=10}sb(g,d+1|0);d=F[e+8>>2];F[a>>2]=d;F[a+8>>2]=F[a+8>>2]&-2147483648|F[e+12>>2]&2147483647;F[a+8>>2]=F[a+8>>2]|-2147483648;F[a+4>>2]=c}db(d,b,c+1|0);Z=e+16|0;return}za();v()}function pf(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0;b=Z-16|0;Z=b;Od(b);F[a+24>>2]=F[b>>2];e=a+24|0;a:{if((e|0)==(b|0)){break a}c=a+28|0;d=b|4;f=G[b+15|0];g=f<<24>>24;if(D[a+39|0]>=0){if((g|0)>=0){a=F[d+4>>2];F[c>>2]=F[d>>2];F[c+4>>2]=a;F[c+8>>2]=F[d+8>>2];break a}qb(c,F[b+4>>2],F[b+8>>2]);break a}a=(g|0)<0;rb(c,a?F[b+4>>2]:d,a?F[b+8>>2]:f)}if(D[b+15|0]<0){ja(F[b+4>>2])}Z=b+16|0;return e|0}function Rf(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0;d=Z-16|0;Z=d;a:{e=ya(c);if(e>>>0<2147483632){b:{c:{if(e>>>0>=11){g=(e|15)+1|0;f=ka(g);F[d+8>>2]=g|-2147483648;F[d>>2]=f;F[d+4>>2]=e;g=e+f|0;break c}D[d+11|0]=e;g=d+e|0;f=d;if(!e){break b}}la(f,c,e)}D[g|0]=0;f=a+16|0;c=Sc(b,d,f);b=F[a+16>>2];a=D[a+27|0];if(D[d+11|0]<0){ja(F[d>>2])}Z=d+16|0;a=c?(a|0)<0?b:f:0;break a}za();v()}return a|0}function Yb(a,b){var c=0,d=0,e=0;c=F[a+4>>2];d=c+b|0;F[a+4>>2]=d;if(!((d-1^c-1)>>>0<32?c:0)){F[F[a>>2]+((d>>>0>=33?d-1>>>5|0:0)<<2)>>2]=0}a:{if(!b){break a}a=F[a>>2]+(c>>>3&536870908)|0;c=c&31;if(c){d=32-c|0;e=b>>>0>d>>>0?d:b;F[a>>2]=F[a>>2]&(-1<<c&-1>>>d-e^-1);b=b-e|0;a=a+4|0}c=b>>>5|0;if(b>>>0>=32){ma(a,0,c<<2)}if((b&-32)==(b|0)){break a}a=(c<<2)+a|0;F[a>>2]=F[a>>2]&(-1>>>32-(b&31)^-1)}}function ld(a,b,c){var d=0,e=0,f=0,g=0;a:{if(a>>>0>10){break a}d=F[c+20>>2];f=F[c+12>>2];e=F[c+16>>2];if((d|0)>=(f|0)&e>>>0>=I[c+8>>2]|(d|0)>(f|0)){break a}f=D[e+F[c>>2]|0];e=e+1|0;d=e?d:d+1|0;F[c+16>>2]=e;F[c+20>>2]=d;d=f;b:{if((d|0)<0){if(!ld(a+1|0,b,c)){break a}a=F[b>>2];d=d&127|a<<7;a=F[b+4>>2]<<7|a>>>25;break b}d=d&255;a=0}F[b>>2]=d;F[b+4>>2]=a;g=1}return g}function Sa(a,b,c){var d=0,e=0,f=0,g=0;a:{if(a>>>0>10){break a}d=F[c+20>>2];f=F[c+12>>2];e=F[c+16>>2];if((d|0)>=(f|0)&e>>>0>=I[c+8>>2]|(d|0)>(f|0)){break a}f=D[e+F[c>>2]|0];e=e+1|0;d=e?d:d+1|0;F[c+16>>2]=e;F[c+20>>2]=d;d=f;b:{if((d|0)<0){if(!Sa(a+1|0,b,c)){break a}a=F[b>>2];d=d&127|a<<7;a=F[b+4>>2]<<7|a>>>25;break b}d=d&255;a=0}F[b>>2]=d;F[b+4>>2]=a;g=1}return g}function Ne(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;if(La(a,F[b+8>>2],e)){if(!(F[b+28>>2]==1|F[b+4>>2]!=(c|0))){F[b+28>>2]=d}return}a:{if(!La(a,F[b>>2],e)){break a}if(!(F[b+16>>2]!=(c|0)&F[b+20>>2]!=(c|0))){if((d|0)!=1){break a}F[b+32>>2]=1;return}F[b+20>>2]=c;F[b+32>>2]=d;F[b+40>>2]=F[b+40>>2]+1;if(!(F[b+36>>2]!=1|F[b+24>>2]!=2)){D[b+54|0]=1}F[b+44>>2]=4}}function jg(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0;e=Z+-64|0;Z=e;d=$[F[F[a>>2]+44>>2]](a,b)|0;a=$[F[F[a>>2]+40>>2]](a,b)|0;f=kb(e);g=F[b+56>>2];h=d&255;i=a;a=a-1|0;if(a>>>0<=10){a=F[(a<<2)+10148>>2]}else{a=-1}d=L(a,d);cc(f,g,h,i,0,d,d>>31);a=bc(ka(96),f);ac(a,c);D[a+84|0]=1;F[a+72>>2]=F[a+68>>2];F[a+60>>2]=F[b+60>>2];Z=e- -64|0;return a|0}function rh(a){a=a|0;var b=0,c=0,d=0;F[a>>2]=8176;b=F[a+48>>2];F[a+48>>2]=0;if(b){$[F[F[b>>2]+4>>2]](b)}F[a>>2]=10032;b=F[a+20>>2];if(b){F[a+24>>2]=b;ja(b)}d=F[a+8>>2];if(d){c=F[a+12>>2];b=d;if((c|0)!=(b|0)){while(1){c=c-4|0;b=F[c>>2];F[c>>2]=0;if(b){$[F[F[b>>2]+4>>2]](b)}if((c|0)!=(d|0)){continue}break}b=F[a+8>>2]}F[a+12>>2]=d;ja(b)}return a|0}function Dc(a,b,c,d){D[a+53|0]=1;a:{if(F[a+4>>2]!=(c|0)){break a}D[a+52|0]=1;c=F[a+16>>2];b:{if(!c){F[a+36>>2]=1;F[a+24>>2]=d;F[a+16>>2]=b;if((d|0)!=1){break a}if(F[a+48>>2]==1){break b}break a}if((b|0)==(c|0)){c=F[a+24>>2];if((c|0)==2){F[a+24>>2]=d;c=d}if(F[a+48>>2]!=1){break a}if((c|0)==1){break b}break a}F[a+36>>2]=F[a+36>>2]+1}D[a+54|0]=1}}function qh(a){a=a|0;var b=0,c=0,d=0;F[a>>2]=8176;b=F[a+48>>2];F[a+48>>2]=0;if(b){$[F[F[b>>2]+4>>2]](b)}F[a>>2]=10032;b=F[a+20>>2];if(b){F[a+24>>2]=b;ja(b)}d=F[a+8>>2];if(d){c=F[a+12>>2];b=d;if((c|0)!=(b|0)){while(1){c=c-4|0;b=F[c>>2];F[c>>2]=0;if(b){$[F[F[b>>2]+4>>2]](b)}if((c|0)!=(d|0)){continue}break}b=F[a+8>>2]}F[a+12>>2]=d;ja(b)}ja(a)}function Se(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;e=Z+-64|0;Z=e;d=1;a:{if(La(a,b,0)){break a}d=0;if(!b){break a}b=Fc(b,11068);d=0;if(!b){break a}d=e+8|0;ma(d|4,0,52);F[e+56>>2]=1;F[e+20>>2]=-1;F[e+16>>2]=a;F[e+8>>2]=b;$[F[F[b>>2]+28>>2]](b,d,F[c>>2],1);a=F[e+32>>2];if((a|0)==1){F[c>>2]=F[e+24>>2]}d=(a|0)==1}Z=e- -64|0;return d|0}function Fd(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;d=Z-16|0;Z=d;F[a+4>>2]=b;b=F[b+64>>2];e=F[b>>2];b=F[b+4>>2];D[d+15|0]=0;Ea(a+24|0,(b-e>>2>>>0)/3|0,d+15|0);b=F[a+4>>2];e=F[b+56>>2];b=F[b+52>>2];D[d+14|0]=0;Ea(a+36|0,e-b>>2,d+14|0);b=F[c+12>>2];F[a+16>>2]=F[c+8>>2];F[a+20>>2]=b;b=F[c+4>>2];F[a+8>>2]=F[c>>2];F[a+12>>2]=b;Z=d+16|0}function zf(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0;a=Z-16|0;Z=a;f=D[b+24|0];e=F[2555];F[a+8>>2]=F[2554];F[a+12>>2]=e;e=F[2553];F[a>>2]=F[2552];F[a+4>>2]=e;e=lb(b,c,f,a);if(e){b=0;if(f){c=(f&255)<<2;b=ka(c);g=la(b,a,c)+c|0}c=F[d>>2];if(c){F[d+4>>2]=c;ja(c)}F[d+8>>2]=g;F[d+4>>2]=g;F[d>>2]=b}Z=a+16|0;return e|0}function wd(a,b){var c=0,d=0;a:{c=F[a+4>>2];d=F[a+8>>2];if((c|0)==d<<5){if((c+1|0)<0){break a}if(c>>>0<=1073741822){d=d<<6;c=(c&-32)+32|0;c=c>>>0<d>>>0?d:c}else{c=2147483647}$a(a,c);c=F[a+4>>2]}F[a+4>>2]=c+1;d=1<<c;a=F[a>>2]+(c>>>3&536870908)|0;if(G[b|0]){F[a>>2]=d|F[a>>2];return}F[a>>2]=F[a>>2]&(d^-1);return}na();v()}function Zb(a){var b=0;F[a>>2]=0;F[a+4>>2]=0;F[a+56>>2]=0;F[a+48>>2]=0;F[a+52>>2]=0;F[a+40>>2]=0;F[a+44>>2]=0;F[a+32>>2]=0;F[a+36>>2]=0;F[a+24>>2]=0;F[a+28>>2]=0;F[a+16>>2]=0;F[a+20>>2]=0;F[a+8>>2]=0;F[a+12>>2]=0;b=a- -64|0;F[b>>2]=0;F[b+4>>2]=0;F[a+72>>2]=0;F[a+76>>2]=0;F[a+80>>2]=0;F[a+84>>2]=0;F[a+60>>2]=a;return a}function ve(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0;f=$[F[F[a>>2]+24>>2]](a)|0;c=1;a:{if((f|0)<=0){break a}d=F[F[a+36>>2]>>2];g=a+48|0;c=0;if(!($[F[F[d>>2]+16>>2]](d,g,b)|0)){break a}while(1){e=e+1|0;if((f|0)!=(e|0)){d=F[F[a+36>>2]+(e<<2)>>2];if($[F[F[d>>2]+16>>2]](d,g,b)|0){continue}}break}c=(e|0)>=(f|0)}return c|0}function ue(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0;f=$[F[F[a>>2]+24>>2]](a)|0;c=1;a:{if((f|0)<=0){break a}d=F[F[a+36>>2]>>2];g=a+48|0;c=0;if(!($[F[F[d>>2]+20>>2]](d,g,b)|0)){break a}while(1){e=e+1|0;if((f|0)!=(e|0)){d=F[F[a+36>>2]+(e<<2)>>2];if($[F[F[d>>2]+20>>2]](d,g,b)|0){continue}}break}c=(e|0)>=(f|0)}return c|0}function bh(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;d=Z-16|0;Z=d;F[a+4>>2]=b;e=F[b>>2];b=F[b+4>>2];D[d+15|0]=0;Ea(a+24|0,(b-e>>2>>>0)/3|0,d+15|0);b=F[a+4>>2];e=F[b+28>>2];b=F[b+24>>2];D[d+14|0]=0;Ea(a+36|0,e-b>>2,d+14|0);b=F[c+12>>2];F[a+16>>2]=F[c+8>>2];F[a+20>>2]=b;b=F[c+4>>2];F[a+8>>2]=F[c>>2];F[a+12>>2]=b;Z=d+16|0}function hb(a,b,c){var d=0,e=0,f=0,g=0;a:{if(a>>>0>5){break a}d=F[c+20>>2];e=F[c+12>>2];f=F[c+16>>2];if((d|0)>=(e|0)&f>>>0>=I[c+8>>2]|(d|0)>(e|0)){break a}e=G[F[c>>2]+f|0];f=f+1|0;d=f?d:d+1|0;F[c+16>>2]=f;F[c+20>>2]=d;d=e<<24>>24;if((d|0)<0){if(!hb(a+1|0,b,c)){break a}e=d&127|F[b>>2]<<7}F[b>>2]=e;g=1}return g}function fb(a,b,c){var d=0,e=0,f=0,g=0;a:{if(a>>>0>5){break a}d=F[c+20>>2];e=F[c+12>>2];f=F[c+16>>2];if((d|0)>=(e|0)&f>>>0>=I[c+8>>2]|(d|0)>(e|0)){break a}e=G[F[c>>2]+f|0];f=f+1|0;d=f?d:d+1|0;F[c+16>>2]=f;F[c+20>>2]=d;d=e<<24>>24;if((d|0)<0){if(!fb(a+1|0,b,c)){break a}e=d&127|F[b>>2]<<7}F[b>>2]=e;g=1}return g}function Wb(a,b,c){var d=0,e=0,f=0,g=0;a:{if(a>>>0>5){break a}d=F[c+20>>2];e=F[c+12>>2];f=F[c+16>>2];if((d|0)>=(e|0)&f>>>0>=I[c+8>>2]|(d|0)>(e|0)){break a}e=G[F[c>>2]+f|0];f=f+1|0;d=f?d:d+1|0;F[c+16>>2]=f;F[c+20>>2]=d;d=e<<24>>24;if((d|0)<0){if(!Wb(a+1|0,b,c)){break a}e=d&127|F[b>>2]<<7}F[b>>2]=e;g=1}return g}function Ta(a,b,c){var d=0,e=0,f=0,g=0;a:{if(a>>>0>5){break a}d=F[c+20>>2];e=F[c+12>>2];f=F[c+16>>2];if((d|0)>=(e|0)&f>>>0>=I[c+8>>2]|(d|0)>(e|0)){break a}e=G[F[c>>2]+f|0];f=f+1|0;d=f?d:d+1|0;F[c+16>>2]=f;F[c+20>>2]=d;d=e<<24>>24;if((d|0)<0){if(!Ta(a+1|0,b,c)){break a}e=d&127|F[b>>2]<<7}F[b>>2]=e;g=1}return g}function Qd(a,b,c){var d=0,e=0,f=0,g=0;a:{if(a>>>0>5){break a}d=F[c+20>>2];e=F[c+12>>2];f=F[c+16>>2];if((d|0)>=(e|0)&f>>>0>=I[c+8>>2]|(d|0)>(e|0)){break a}e=G[F[c>>2]+f|0];f=f+1|0;d=f?d:d+1|0;F[c+16>>2]=f;F[c+20>>2]=d;d=e<<24>>24;if((d|0)<0){if(!Qd(a+1|0,b,c)){break a}e=d&127|F[b>>2]<<7}F[b>>2]=e;g=1}return g}function Oa(a,b,c){var d=0,e=0,f=0,g=0;a:{if(a>>>0>5){break a}d=F[c+20>>2];e=F[c+12>>2];f=F[c+16>>2];if((d|0)>=(e|0)&f>>>0>=I[c+8>>2]|(d|0)>(e|0)){break a}e=G[F[c>>2]+f|0];f=f+1|0;d=f?d:d+1|0;F[c+16>>2]=f;F[c+20>>2]=d;d=e<<24>>24;if((d|0)<0){if(!Oa(a+1|0,b,c)){break a}e=d&127|F[b>>2]<<7}F[b>>2]=e;g=1}return g}function Da(a,b,c){var d=0,e=0,f=0,g=0;a:{if(a>>>0>5){break a}d=F[c+20>>2];e=F[c+12>>2];f=F[c+16>>2];if((d|0)>=(e|0)&f>>>0>=I[c+8>>2]|(d|0)>(e|0)){break a}e=G[F[c>>2]+f|0];f=f+1|0;d=f?d:d+1|0;F[c+16>>2]=f;F[c+20>>2]=d;d=e<<24>>24;if((d|0)<0){if(!Da(a+1|0,b,c)){break a}e=d&127|F[b>>2]<<7}F[b>>2]=e;g=1}return g}function sa(a,b,c){var d=0,e=0;a:{b:{if(c>>>0>=4){if((a|b)&3){break b}while(1){if(F[a>>2]!=F[b>>2]){break b}b=b+4|0;a=a+4|0;c=c-4|0;if(c>>>0>3){continue}break}}if(!c){break a}}while(1){d=G[a|0];e=G[b|0];if((d|0)==(e|0)){b=b+1|0;a=a+1|0;c=c-1|0;if(c){continue}break a}break}return d-e|0}return 0}function td(a){var b=0,c=0,d=0,e=0;d=F[a>>2];if(d){e=d;c=F[a+4>>2];if((d|0)!=(c|0)){while(1){e=c-144|0;b=F[e+132>>2];if(b){F[c-8>>2]=b;ja(b)}b=F[c-28>>2];if(b){F[c-24>>2]=b;ja(b)}b=F[c-40>>2];if(b){F[c-36>>2]=b;ja(b)}Gb(c-140|0);c=e;if((d|0)!=(c|0)){continue}break}e=F[a>>2]}F[a+4>>2]=d;ja(e)}}function Ef(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;d=F[b+4>>2];a:{if(!d){break a}b=F[F[F[b+8>>2]+(c<<2)>>2]+60>>2];if((b|0)<0){break a}a=F[d+24>>2];c=F[d+28>>2];if((a|0)==(c|0)){break a}b:{while(1){e=F[a>>2];if((b|0)==F[e+24>>2]){break b}a=a+4|0;if((c|0)!=(a|0)){continue}break}e=0}}return e|0}function ic(a){var b=0,c=0,d=0;if(a){d=F[a+24>>2];if(d){b=d;c=F[a+28>>2];if((b|0)!=(c|0)){while(1){c=c-4|0;b=F[c>>2];F[c>>2]=0;if(b){Ca(b+12|0,F[b+16>>2]);Ba(b,F[b+4>>2]);ja(b)}if((c|0)!=(d|0)){continue}break}b=F[a+24>>2]}F[a+28>>2]=d;ja(b)}Ca(a+12|0,F[a+16>>2]);Ba(a,F[a+4>>2]);ja(a)}}function $g(a){a=a|0;var b=0;F[a+8>>2]=9136;F[a>>2]=8924;b=F[a+96>>2];if(b){F[a+100>>2]=b;ja(b)}b=F[a+80>>2];if(b){F[a+84>>2]=b;ja(b)}b=F[a+68>>2];if(b){F[a+72>>2]=b;ja(b)}b=F[a+56>>2];if(b){F[a+60>>2]=b;ja(b)}F[a+8>>2]=9372;b=F[a+44>>2];if(b){ja(b)}b=F[a+32>>2];if(b){ja(b)}return a|0}function _g(a){a=a|0;var b=0;F[a+8>>2]=9136;F[a>>2]=8924;b=F[a+96>>2];if(b){F[a+100>>2]=b;ja(b)}b=F[a+80>>2];if(b){F[a+84>>2]=b;ja(b)}b=F[a+68>>2];if(b){F[a+72>>2]=b;ja(b)}b=F[a+56>>2];if(b){F[a+60>>2]=b;ja(b)}F[a+8>>2]=9372;b=F[a+44>>2];if(b){ja(b)}b=F[a+32>>2];if(b){ja(b)}ja(a)}function wh(a){a=a|0;var b=0,c=0,d=0;F[a>>2]=10032;b=F[a+20>>2];if(b){F[a+24>>2]=b;ja(b)}d=F[a+8>>2];if(d){c=F[a+12>>2];b=d;if((c|0)!=(b|0)){while(1){c=c-4|0;b=F[c>>2];F[c>>2]=0;if(b){$[F[F[b>>2]+4>>2]](b)}if((c|0)!=(d|0)){continue}break}b=F[a+8>>2]}F[a+12>>2]=d;ja(b)}return a|0}function uc(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0;h=F[c+8>>2];e=F[c+16>>2];g=F[c+12>>2];f=g;d=F[c+20>>2];if(h>>>0>e>>>0&(f|0)>=(d|0)|(d|0)<(f|0)){b=G[F[c>>2]+e|0];i=e+1|0;f=i?d:d+1|0;F[c+16>>2]=i;F[c+20>>2]=f;F[a+4>>2]=b}return e>>>0<h>>>0&(d|0)<=(g|0)|(d|0)<(g|0)}function La(a,b,c){var d=0;if(!c){return F[a+4>>2]==F[b+4>>2]}if((a|0)==(b|0)){return 1}d=F[a+4>>2];a=G[d|0];c=F[b+4>>2];b=G[c|0];a:{if(!a|(b|0)!=(a|0)){break a}while(1){b=G[c+1|0];a=G[d+1|0];if(!a){break a}c=c+1|0;d=d+1|0;if((a|0)==(b|0)){continue}break}}return(a|0)==(b|0)}function Gg(a){a=a|0;var b=0,c=0,d=0;F[a>>2]=10032;b=F[a+20>>2];if(b){F[a+24>>2]=b;ja(b)}d=F[a+8>>2];if(d){c=F[a+12>>2];b=d;if((c|0)!=(b|0)){while(1){c=c-4|0;b=F[c>>2];F[c>>2]=0;if(b){$[F[F[b>>2]+4>>2]](b)}if((c|0)!=(d|0)){continue}break}b=F[a+8>>2]}F[a+12>>2]=d;ja(b)}ja(a)}function Gf(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;d=F[b+12>>2];b=F[b+8>>2];a=0;a:{if((d|0)==(b|0)){break a}a=d-b>>2;d=a>>>0<=1?1:a;a=0;b:{while(1){e=F[b+(a<<2)>>2];if(F[e+60>>2]==(c|0)){break b}a=a+1|0;if((d|0)!=(a|0)){continue}break}a=0;break a}a=(a|0)!=-1?e:0}return a|0}function ah(a){a=a|0;var b=0;F[a>>2]=9136;b=F[a+88>>2];if(b){F[a+92>>2]=b;ja(b)}b=F[a+72>>2];if(b){F[a+76>>2]=b;ja(b)}b=F[a+60>>2];if(b){F[a- -64>>2]=b;ja(b)}b=F[a+48>>2];if(b){F[a+52>>2]=b;ja(b)}F[a>>2]=9372;b=F[a+36>>2];if(b){ja(b)}b=F[a+24>>2];if(b){ja(b)}return a|0}function Tc(a,b){var c=0,d=0,e=0;F[a+8>>2]=0;F[a>>2]=0;F[a+4>>2]=0;a:{c=F[b+4>>2];d=F[b>>2];b:{if((c|0)==(d|0)){a=c;break b}c=c-d|0;if((c|0)<0){break a}d=c;e=ka(c);c=ma(e,0,c);d=d+c|0;F[a+8>>2]=d;F[a+4>>2]=d;F[a>>2]=c;c=F[b>>2];a=F[b+4>>2]}la(e,c,a-c|0);return}na();v()}function Dd(a){var b=0,c=0,d=0,e=0;c=F[a+4>>2];d=F[a>>2];if((c|0)!=(d|0)){while(1){e=c-144|0;b=F[e+132>>2];if(b){F[c-8>>2]=b;ja(b)}b=F[c-28>>2];if(b){F[c-24>>2]=b;ja(b)}b=F[c-40>>2];if(b){F[c-36>>2]=b;ja(b)}Gb(c-140|0);c=e;if((d|0)!=(c|0)){continue}break}}F[a+4>>2]=d}function Xg(a){a=a|0;var b=0;F[a>>2]=9136;b=F[a+88>>2];if(b){F[a+92>>2]=b;ja(b)}b=F[a+72>>2];if(b){F[a+76>>2]=b;ja(b)}b=F[a+60>>2];if(b){F[a- -64>>2]=b;ja(b)}b=F[a+48>>2];if(b){F[a+52>>2]=b;ja(b)}F[a>>2]=9372;b=F[a+36>>2];if(b){ja(b)}b=F[a+24>>2];if(b){ja(b)}ja(a)}function Za(a){var b=0;if(a){b=F[a+76>>2];if(b){F[a+80>>2]=b;ja(b)}b=F[a- -64>>2];if(b){F[a+68>>2]=b;ja(b)}b=F[a+48>>2];if(b){F[a+52>>2]=b;ja(b)}b=F[a+24>>2];if(b){F[a+28>>2]=b;ja(b)}b=F[a+12>>2];if(b){F[a+16>>2]=b;ja(b)}b=F[a>>2];if(b){F[a+4>>2]=b;ja(b)}ja(a)}}function Gb(a){var b=0;b=F[a+84>>2];if(b){F[a+88>>2]=b;ja(b)}b=F[a+72>>2];if(b){F[a+76>>2]=b;ja(b)}b=F[a+52>>2];if(b){F[a+56>>2]=b;ja(b)}b=F[a+40>>2];if(b){F[a+44>>2]=b;ja(b)}b=F[a+28>>2];if(b){F[a+32>>2]=b;ja(b)}b=F[a+12>>2];if(b){ja(b)}a=F[a>>2];if(a){ja(a)}}function Lc(a,b,c){var d=0,e=0,f=0,g=0;f=Z-16|0;Z=f;d=Z-16|0;Z=d;b=b-a>>2;while(1){if(b){F[d+12>>2]=a;e=b>>>1|0;F[d+12>>2]=F[d+12>>2]+(e<<2);g=(e^-1)+b|0;b=e;e=I[F[d+12>>2]>>2]<I[c>>2];b=e?g:b;a=e?F[d+12>>2]+4|0:a;continue}break}Z=d+16|0;Z=f+16|0;return a}function id(a,b){var c=0,d=0;d=ka(40);F[d>>2]=-1;c=d+8|0;F[c+16>>2]=0;F[c+20>>2]=0;F[c+8>>2]=0;F[c>>2]=0;F[c+4>>2]=0;F[c+24>>2]=0;F[c+28>>2]=0;$[F[F[a>>2]+16>>2]](a,d);a=F[b+88>>2];F[b+88>>2]=d;if(a){b=F[a+8>>2];if(b){F[a+12>>2]=b;ja(b)}ja(a)}return 1}function ya(a){var b=0,c=0,d=0;b=a;a:{if(b&3){while(1){if(!G[b|0]){break a}b=b+1|0;if(b&3){continue}break}}while(1){c=b;b=b+4|0;d=F[c>>2];if(!((d^-1)&d-16843009&-2139062144)){continue}break}while(1){b=c;c=b+1|0;if(G[b|0]){continue}break}}return b-a|0}function wa(a){var b=0,c=0,d=0,e=0,f=0;d=G[a+12|0];c=F[a+8>>2];a:{if(c>>>0>4095){break a}b=F[a+4>>2];if((b|0)<=0){break a}b=b-1|0;F[a+4>>2]=b;c=G[b+F[a>>2]|0]|c<<8}d=0-d&255;b=L(d,c>>>8|0);e=c&255;f=e>>>0<d>>>0;F[a+8>>2]=f?b+e|0:c-(b+d|0)|0;return f}function yc(a,b){F[a+4>>2]=0;F[a+8>>2]=0;F[a>>2]=1776;F[a+12>>2]=0;F[a+16>>2]=0;F[a+20>>2]=0;F[a+24>>2]=0;F[a+28>>2]=0;F[a+32>>2]=0;F[a+36>>2]=0;F[a+40>>2]=0;F[a>>2]=2016;F[a+60>>2]=b;F[a+44>>2]=0;F[a+48>>2]=0;F[a+52>>2]=0;F[a+56>>2]=0;return a}function Eb(a,b){var c=0,d=0,e=0;c=ya(b);if(c>>>0<2147483632){a:{b:{if(c>>>0>=11){d=(c|15)+1|0;e=ka(d);F[a+8>>2]=d|-2147483648;F[a>>2]=e;F[a+4>>2]=c;d=c+e|0;break b}D[a+11|0]=c;d=a+c|0;e=a;if(!c){break a}}pa(e,b,c)}D[d|0]=0;return a}za();v()}function Of(a){a=a|0;var b=0,c=0,d=0;if(a){if(D[a+27|0]<0){ja(F[a+16>>2])}b=F[a>>2];if(b){c=b;d=F[a+4>>2];if((b|0)!=(d|0)){while(1){c=d-12|0;if(D[d-1|0]<0){ja(F[c>>2])}d=c;if((d|0)!=(b|0)){continue}break}c=F[a>>2]}F[a+4>>2]=b;ja(c)}ja(a)}}function xa(a){a=a|0;var b=0,c=0;if(a){b=F[a+88>>2];F[a+88>>2]=0;if(b){c=F[b+8>>2];if(c){F[b+12>>2]=c;ja(c)}ja(b)}b=F[a+68>>2];if(b){F[a+72>>2]=b;ja(b)}b=F[a+64>>2];F[a+64>>2]=0;if(b){c=F[b>>2];if(c){F[b+4>>2]=c;ja(c)}ja(b)}ja(a)}}function Ib(a,b){var c=0,d=0,e=0;a:{c=F[a>>2];b:{if(F[a+8>>2]-c>>2>>>0>=b>>>0){break b}if(b>>>0>=1073741824){break a}d=F[a+4>>2]-c|0;e=b<<2;b=pa(ka(e),c,d);F[a+8>>2]=b+e;F[a+4>>2]=b+d;F[a>>2]=b;if(!c){break b}ja(c)}return}na();v()}function Df(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;b=F[b+96>>2];a=ka(12);b=b+L(c,12)|0;c=F[b+4>>2];F[a>>2]=F[b>>2];F[a+4>>2]=c;F[a+8>>2]=F[b+8>>2];b=F[d>>2];if(b){F[d+4>>2]=b;ja(b)}F[d>>2]=a;a=a+12|0;F[d+8>>2]=a;F[d+4>>2]=a;return 1}function Ah(a){a=a|0;var b=0;F[a+24>>2]=1624;F[a>>2]=7948;b=F[a+32>>2];if(b){F[a+36>>2]=b;ja(b)}F[a>>2]=2136;b=F[a+20>>2];F[a+20>>2]=0;if(b){$[F[F[b>>2]+4>>2]](b)}F[a>>2]=1920;b=F[a+16>>2];F[a+16>>2]=0;if(b){xa(b)}return a|0}function li(a,b,c,d){var e=0,f=0,g=0,h=0;f=b^d;g=f>>31;e=b>>31;a=a^e;h=a-e|0;e=(b^e)-((a>>>0<e>>>0)+e|0)|0;a=d>>31;b=c^a;f=f>>31;a=mi(h,e,b-a|0,(a^d)-((a>>>0>b>>>0)+a|0)|0)^f;b=a-f|0;_=(g^_)-((a>>>0<f>>>0)+g|0)|0;return b}function zh(a){a=a|0;var b=0;F[a+24>>2]=1624;F[a>>2]=7948;b=F[a+32>>2];if(b){F[a+36>>2]=b;ja(b)}F[a>>2]=2136;b=F[a+20>>2];F[a+20>>2]=0;if(b){$[F[F[b>>2]+4>>2]](b)}F[a>>2]=1920;b=F[a+16>>2];F[a+16>>2]=0;if(b){xa(b)}ja(a)}function rb(a,b,c){var d=0,e=0,f=0;e=Z-16|0;Z=e;d=F[a+8>>2]&2147483647;a:{if(d>>>0>c>>>0){d=F[a>>2];F[a+4>>2]=c;db(d,b,c);D[e+15|0]=0;D[c+d|0]=G[e+15|0];break a}f=a;a=F[a+4>>2];Gc(f,d-1|0,(c-d|0)+1|0,a,a,c,b)}Z=e+16|0}function xe(a,b){a=a|0;b=b|0;var c=0,d=0;c=Z-16|0;Z=c;a=F[a+4>>2];a:{if((a|0)==-1){break a}D[c+15|0]=a;d=F[b+20>>2];if(!!F[b+16>>2]&(d|0)>=0|(d|0)>0){break a}pb(b,F[b+4>>2],c+15|0,c+16|0)}Z=c+16|0;return(a|0)!=-1|0}function ki(a,b,c,d){var e=0,f=0,g=0,h=0,i=0,j=0;e=c>>>16|0;f=a>>>16|0;j=L(e,f);g=c&65535;h=a&65535;i=L(g,h);f=(i>>>16|0)+L(f,g)|0;e=(f&65535)+L(e,h)|0;_=(L(b,c)+j|0)+L(a,d)+(f>>>16)+(e>>>16)|0;return i&65535|e<<16}function qb(a,b,c){var d=0,e=0;d=Z-16|0;Z=d;a:{if(c>>>0<=10){D[a+11|0]=G[a+11|0]&128|c;D[a+11|0]=G[a+11|0]&127;db(a,b,c);D[d+15|0]=0;D[a+c|0]=G[d+15|0];break a}e=a;a=G[a+11|0]&127;Gc(e,10,c-10|0,a,a,c,b)}Z=d+16|0}function Ec(a,b,c){var d=0;d=F[a+16>>2];if(!d){F[a+36>>2]=1;F[a+24>>2]=c;F[a+16>>2]=b;return}a:{if((b|0)==(d|0)){if(F[a+24>>2]!=2){break a}F[a+24>>2]=c;return}D[a+54|0]=1;F[a+24>>2]=2;F[a+36>>2]=F[a+36>>2]+1}}function vg(){var a=0;a=kb(ka(96));F[a+64>>2]=0;F[a+68>>2]=0;F[a+88>>2]=0;F[a+72>>2]=0;F[a+76>>2]=0;D[a+77|0]=0;D[a+78|0]=0;D[a+79|0]=0;D[a+80|0]=0;D[a+81|0]=0;D[a+82|0]=0;D[a+83|0]=0;D[a+84|0]=0;return a|0}function jh(a,b){a=a|0;b=b|0;var c=0,d=0;F[b>>2]=2;c=F[b+8>>2];d=F[b+12>>2]-c|0;if(d>>>0<=4294967291){Db(b+8|0,d+4|0);c=F[b+8>>2]}b=c+d|0;a=F[a+4>>2];D[b|0]=a;D[b+1|0]=a>>>8;D[b+2|0]=a>>>16;D[b+3|0]=a>>>24}function ge(a){a=a|0;var b=0;F[a>>2]=3016;b=F[a+96>>2];if(b){ja(b)}b=F[a+84>>2];if(b){ja(b)}b=F[a+72>>2];if(b){ja(b)}b=F[a+60>>2];if(b){ja(b)}F[a>>2]=2960;b=F[a+32>>2];if(b){F[a+36>>2]=b;ja(b)}return a|0}function ci(a){a=a|0;var b=0;F[a>>2]=4580;b=F[a+96>>2];if(b){ja(b)}b=F[a+84>>2];if(b){ja(b)}b=F[a+72>>2];if(b){ja(b)}b=F[a+60>>2];if(b){ja(b)}F[a>>2]=2960;b=F[a+32>>2];if(b){F[a+36>>2]=b;ja(b)}return a|0}function Cg(a){a=a|0;var b=0,c=0,d=0;b=F[a+8>>2];d=F[a+12>>2];if((b|0)==(d|0)){return 1}while(1){c=F[b>>2];c=$[F[F[c>>2]+16>>2]](c,F[a+32>>2])|0;if(c){b=b+4|0;if((d|0)!=(b|0)){continue}}break}return c|0}function Pc(a,b){var c=0,d=0;c=F[a+8>>2];a=F[a+12>>2];if((c|0)!=(a|0)){a=a-c>>2;d=a>>>0<=1?1:a;a=0;while(1){if(F[F[(a<<2)+c>>2]+60>>2]==(b|0)){return a}a=a+1|0;if((d|0)!=(a|0)){continue}break}}return-1}function fe(a){a=a|0;var b=0;F[a>>2]=3016;b=F[a+96>>2];if(b){ja(b)}b=F[a+84>>2];if(b){ja(b)}b=F[a+72>>2];if(b){ja(b)}b=F[a+60>>2];if(b){ja(b)}F[a>>2]=2960;b=F[a+32>>2];if(b){F[a+36>>2]=b;ja(b)}ja(a)}function bi(a){a=a|0;var b=0;F[a>>2]=4580;b=F[a+96>>2];if(b){ja(b)}b=F[a+84>>2];if(b){ja(b)}b=F[a+72>>2];if(b){ja(b)}b=F[a+60>>2];if(b){ja(b)}F[a>>2]=2960;b=F[a+32>>2];if(b){F[a+36>>2]=b;ja(b)}ja(a)}function Sc(a,b,c){var d=0,e=0;d=a+4|0;a=Ya(a,b);a:{if((d|0)==(a|0)){break a}b=F[a+32>>2];d=F[a+28>>2];if((b|0)==(d|0)){break a}Sb(c,b-d|0);c=Tb(c);b=F[a+28>>2];la(c,b,F[a+32>>2]-b|0);e=1}return e}function Kd(a){F[a+40>>2]=0;F[a+4>>2]=0;F[a+8>>2]=0;F[a>>2]=10032;F[a+12>>2]=0;F[a+16>>2]=0;F[a+20>>2]=0;F[a+24>>2]=0;F[a+28>>2]=0;F[a+32>>2]=0;E[a+36>>1]=0;F[a+44>>2]=0;F[a>>2]=8080;return a}function kb(a){F[a+8>>2]=0;F[a+12>>2]=0;F[a>>2]=0;F[a+40>>2]=0;F[a+44>>2]=0;F[a+28>>2]=9;D[a+24|0]=1;F[a+56>>2]=-1;F[a+60>>2]=0;F[a+16>>2]=0;F[a+20>>2]=0;F[a+48>>2]=0;F[a+52>>2]=0;return a}function pe(a,b){a=a|0;b=b|0;var c=0,d=0;d=F[a+16>>2];c=0;a:{if(F[a+20>>2]-d>>2<=(b|0)){break a}b=F[(b<<2)+d>>2];c=0;if((b|0)<0){break a}c=bb(F[F[a+36>>2]+(b<<2)>>2])}return c|0}function Nf(){var a=0,b=0;a=ka(40);F[a+4>>2]=0;F[a+8>>2]=0;F[a+24>>2]=0;F[a+28>>2]=0;b=a+16|0;F[b>>2]=0;F[b+4>>2]=0;F[a>>2]=a+4;F[a+12>>2]=b;F[a+32>>2]=0;F[a+36>>2]=0;return a|0}function Xe(a,b){a=a|0;b=b|0;var c=0,d=0;Nc(a,b);a:{if((b|0)<0){break a}d=F[a+88>>2];c=F[a+84>>2];if(d-c>>2<=(b|0)){break a}c=(b<<2)+c|0;b=c+4|0;pa(c,b,d-b|0);F[a+88>>2]=d-4}}function eb(a){var b=0,c=0;b=F[2909];c=a+7&-8;a=b+c|0;a:{if(a>>>0<=b>>>0?c:0){break a}if(a>>>0>aa()<<16>>>0){if(!(X(a|0)|0)){break a}}F[2909]=a;return b}F[2940]=48;return-1}function Th(a,b,c){a=a|0;b=b|0;c=c|0;var d=0;F[a+4>>2]=b;b=F[F[F[b+4>>2]+8>>2]+(c<<2)>>2];F[a+12>>2]=c;F[a+8>>2]=b;a=F[a+8>>2];if(G[a+24|0]==3){d=F[a+28>>2]==9}return d|0}function Tg(a){a=a|0;var b=0;F[a+8>>2]=9556;F[a>>2]=9392;b=F[a+56>>2];if(b){F[a+60>>2]=b;ja(b)}F[a+8>>2]=9372;b=F[a+44>>2];if(b){ja(b)}b=F[a+32>>2];if(b){ja(b)}return a|0}function Ng(a){a=a|0;var b=0;F[a+8>>2]=8624;F[a>>2]=9684;b=F[a+56>>2];if(b){F[a+60>>2]=b;ja(b)}F[a+8>>2]=8876;b=F[a+44>>2];if(b){ja(b)}b=F[a+32>>2];if(b){ja(b)}return a|0}function Ee(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;d=F[a+8>>2];a:{if(!G[d+24|0]){break a}if(!ac(d,F[b+4>>2]-F[b>>2]>>2)){break a}e=$[F[F[a>>2]+32>>2]](a,b,c)|0}return e|0}function Fh(a,b,c){a=a|0;b=b|0;c=c|0;var d=0;F[a+4>>2]=b;d=F[F[F[b+4>>2]+8>>2]+(c<<2)>>2];F[a+12>>2]=c;F[a+8>>2]=d;return F[F[F[F[b+4>>2]+8>>2]+(c<<2)>>2]+28>>2]==9|0}function Ca(a,b){if(b){Ca(a,F[b>>2]);Ca(a,F[b+4>>2]);a=F[b+28>>2];F[b+28>>2]=0;if(a){Ca(a+12|0,F[a+16>>2]);Ba(a,F[a+4>>2]);ja(a)}if(D[b+27|0]<0){ja(F[b+16>>2])}ja(b)}}function Sg(a){a=a|0;var b=0;F[a+8>>2]=9556;F[a>>2]=9392;b=F[a+56>>2];if(b){F[a+60>>2]=b;ja(b)}F[a+8>>2]=9372;b=F[a+44>>2];if(b){ja(b)}b=F[a+32>>2];if(b){ja(b)}ja(a)}function Mg(a){a=a|0;var b=0;F[a+8>>2]=8624;F[a>>2]=9684;b=F[a+56>>2];if(b){F[a+60>>2]=b;ja(b)}F[a+8>>2]=8876;b=F[a+44>>2];if(b){ja(b)}b=F[a+32>>2];if(b){ja(b)}ja(a)}function Hc(a,b){var c=0,d=0,e=0,f=0;F[a>>2]=11356;F[a>>2]=11468;c=ya(b);d=ka(c+13|0);F[d+8>>2]=0;F[d+4>>2]=c;F[d>>2]=c;e=a,f=la(d+12|0,b,c+1|0),F[e+4>>2]=f;return a}function hc(a,b,c){a:{if(b){b=0;if(!ld(1,c,a)){break a}}D[a+36|0]=1;F[a+32>>2]=0;b=F[a+16>>2];c=b+F[a>>2]|0;F[a+24>>2]=c;F[a+28>>2]=c+(F[a+8>>2]-b|0);b=1}return b}function Ue(a,b){a=a|0;b=b|0;var c=0;a:{if(!($[F[F[a>>2]+36>>2]](a,b)|0)){break a}if(!($[F[F[a>>2]+40>>2]](a,b)|0)){break a}c=$[F[F[a>>2]+44>>2]](a)|0}return c|0}function _d(a){a=a|0;var b=0;a:{if(!F[a- -64>>2]|!F[a+68>>2]|(!F[a+44>>2]|!F[a+48>>2])){break a}if(!F[a+52>>2]|!F[a+56>>2]){break a}b=F[a+92>>2]!=-1}return b|0}function ii(a,b){a=a|0;b=b|0;var c=0;b=F[b+88>>2];if(!(!b|F[b>>2]!=2)){c=a;a=F[b+8>>2];F[c+4>>2]=G[a|0]|G[a+1|0]<<8|(G[a+2|0]<<16|G[a+3|0]<<24);c=1}return c|0}function wc(a){a=a|0;var b=0;F[a>>2]=2136;b=F[a+20>>2];F[a+20>>2]=0;if(b){$[F[F[b>>2]+4>>2]](b)}F[a>>2]=1920;b=F[a+16>>2];F[a+16>>2]=0;if(b){xa(b)}return a|0}function Ud(a){a=a|0;var b=0;a:{if(!F[a+48>>2]|!F[a+52>>2]|(!F[a+28>>2]|!F[a+32>>2])){break a}if(!F[a+36>>2]|!F[a+40>>2]){break a}b=F[a+76>>2]!=-1}return b|0}function Ug(a){a=a|0;var b=0;F[a>>2]=9556;b=F[a+48>>2];if(b){F[a+52>>2]=b;ja(b)}F[a>>2]=9372;b=F[a+36>>2];if(b){ja(b)}b=F[a+24>>2];if(b){ja(b)}return a|0}function Ed(a){a=a|0;var b=0;F[a>>2]=8624;b=F[a+48>>2];if(b){F[a+52>>2]=b;ja(b)}F[a>>2]=8876;b=F[a+36>>2];if(b){ja(b)}b=F[a+24>>2];if(b){ja(b)}return a|0}function vc(a){a=a|0;var b=0;F[a>>2]=2136;b=F[a+20>>2];F[a+20>>2]=0;if(b){$[F[F[b>>2]+4>>2]](b)}F[a>>2]=1920;b=F[a+16>>2];F[a+16>>2]=0;if(b){xa(b)}ja(a)}function yg(){var a=0,b=0;b=ka(40);F[b>>2]=-1;a=b+8|0;F[a+16>>2]=0;F[a+20>>2]=0;F[a+8>>2]=0;F[a>>2]=0;F[a+4>>2]=0;F[a+24>>2]=0;F[a+28>>2]=0;return b|0}function eh(a){a=a|0;var b=0;F[a>>2]=8624;b=F[a+48>>2];if(b){F[a+52>>2]=b;ja(b)}F[a>>2]=8876;b=F[a+36>>2];if(b){ja(b)}b=F[a+24>>2];if(b){ja(b)}ja(a)}function Og(a){a=a|0;var b=0;F[a>>2]=9556;b=F[a+48>>2];if(b){F[a+52>>2]=b;ja(b)}F[a>>2]=9372;b=F[a+36>>2];if(b){ja(b)}b=F[a+24>>2];if(b){ja(b)}ja(a)}function Ja(a){F[a+8>>2]=0;F[a+12>>2]=0;F[a>>2]=0;F[a+16>>2]=0;F[a+20>>2]=0;F[a+32>>2]=0;F[a+24>>2]=0;F[a+28>>2]=0;E[a+38>>1]=0;D[a+36|0]=0;return a}function Me(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;if(La(a,F[b+8>>2],f)){Dc(b,c,d,e);return}a=F[a+8>>2];$[F[F[a>>2]+20>>2]](a,b,c,d,e,f)}function Eh(a,b,c){a=a|0;b=b|0;c=c|0;a:{if(G[F[a+4>>2]+36|0]>=2){b=0;if(!($[F[F[a>>2]+52>>2]](a)|0)){break a}}b=id(a+24|0,F[a+16>>2])}return b|0}function hg(){var a=0;a=Rc(ka(108));F[a+84>>2]=0;F[a+88>>2]=0;F[a>>2]=10240;F[a+92>>2]=0;F[a+96>>2]=0;F[a+100>>2]=0;F[a+104>>2]=0;return a|0}function Qc(a,b){var c=0;c=-1;a:{if((b|0)==-1|(b|0)>4){break a}b=L(b,12)+a|0;a=F[b+20>>2];if((F[b+24>>2]-a|0)<=0){break a}c=F[a>>2]}return c}function cc(a,b,c,d,e,f,g){F[a>>2]=0;F[a+56>>2]=b;F[a+48>>2]=0;F[a+52>>2]=0;F[a+40>>2]=f;F[a+44>>2]=g;D[a+32|0]=e;F[a+28>>2]=d;D[a+24|0]=c}function Sh(a,b,c){a=a|0;b=b|0;c=c|0;a:{if(G[F[a+4>>2]+36|0]>=2){b=0;if(!uc(a+24|0,bb(a),c)){break a}}b=id(a+24|0,F[a+16>>2])}return b|0}function _e(a){a=a|0;var b=0;F[a>>2]=10240;b=F[a+96>>2];if(b){F[a+100>>2]=b;ja(b)}b=F[a+84>>2];if(b){F[a+88>>2]=b;ja(b)}return tb(a)|0}function Tb(a){var b=0;if(G[a+11|0]>>>7|0){b=F[a+4>>2]}else{b=G[a+11|0]&127}if(!b){sc(1222);v()}if(G[a+11|0]>>>7|0){a=F[a>>2]}return a}function Ze(a){a=a|0;var b=0;F[a>>2]=10240;b=F[a+96>>2];if(b){F[a+100>>2]=b;ja(b)}b=F[a+84>>2];if(b){F[a+88>>2]=b;ja(b)}ja(tb(a))}function ce(a){a=a|0;var b=0;F[a>>2]=3264;b=F[a+76>>2];if(b){ja(b)}F[a>>2]=2960;b=F[a+32>>2];if(b){F[a+36>>2]=b;ja(b)}return a|0}function _h(a){a=a|0;var b=0;F[a>>2]=4816;b=F[a+76>>2];if(b){ja(b)}F[a>>2]=2960;b=F[a+32>>2];if(b){F[a+36>>2]=b;ja(b)}return a|0}function Ba(a,b){if(b){Ba(a,F[b>>2]);Ba(a,F[b+4>>2]);a=F[b+28>>2];if(a){F[b+32>>2]=a;ja(a)}if(D[b+27|0]<0){ja(F[b+16>>2])}ja(b)}}function Wf(){var a=0;a=ka(28);F[a>>2]=0;F[a+4>>2]=0;F[a+24>>2]=0;F[a+16>>2]=0;F[a+20>>2]=0;F[a+8>>2]=0;F[a+12>>2]=0;return a|0}function We(a){a=a|0;var b=0;F[a>>2]=1776;b=F[a+16>>2];if(b){F[a+20>>2]=b;ja(b)}b=F[a+4>>2];if(b){F[a+8>>2]=b;ja(b)}return a|0}function fg(){var a=0,b=0;a=ka(24);F[a+4>>2]=0;F[a+8>>2]=0;b=a+16|0;F[b>>2]=0;F[b+4>>2]=0;F[a>>2]=a+4;F[a+12>>2]=b;return a|0}function Pe(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;if(La(a,F[b+8>>2],0)){Ec(b,c,d);return}a=F[a+8>>2];$[F[F[a>>2]+28>>2]](a,b,c,d)}function be(a){a=a|0;var b=0;F[a>>2]=3264;b=F[a+76>>2];if(b){ja(b)}F[a>>2]=2960;b=F[a+32>>2];if(b){F[a+36>>2]=b;ja(b)}ja(a)}function Zh(a){a=a|0;var b=0;F[a>>2]=4816;b=F[a+76>>2];if(b){ja(b)}F[a>>2]=2960;b=F[a+32>>2];if(b){F[a+36>>2]=b;ja(b)}ja(a)}function ka(a){var b=0;a=a?a:1;a:{while(1){b=Ub(a);if(b){break a}b=F[3065];if(b){$[b|0]();continue}break}V();v()}return b}function ib(a,b){if(b){ib(a,F[b>>2]);ib(a,F[b+4>>2]);if(D[b+39|0]<0){ja(F[b+28>>2])}if(D[b+27|0]<0){ja(F[b+16>>2])}ja(b)}}function Cc(a){a=a|0;var b=0,c=0;F[a>>2]=11468;b=F[a+4>>2]-12|0;c=F[b+8>>2]-1|0;F[b+8>>2]=c;if((c|0)<0){ja(b)}return a|0}function ng(){var a=0;a=ka(24);F[a+8>>2]=0;F[a+12>>2]=0;F[a+4>>2]=-1;F[a>>2]=1624;F[a+16>>2]=0;F[a+20>>2]=0;return a|0}function Ac(a,b,c){a=a|0;b=b|0;c=c|0;F[a+4>>2]=b;b=F[F[F[b+4>>2]+8>>2]+(c<<2)>>2];F[a+12>>2]=c;F[a+8>>2]=b;return 1}function pc(a){a=a|0;var b=0;if(!(!F[a+60>>2]|!F[a+44>>2]|(!F[a+48>>2]|!F[a+52>>2]))){b=F[a+56>>2]!=0}return b|0}function Ic(a,b){if(G[a+11|0]>>>7|0){F[a+4>>2]=b;return}D[a+11|0]=G[a+11|0]&128|b;D[a+11|0]=G[a+11|0]&127}function gi(a){a=a|0;var b=0;F[a>>2]=3500;F[a>>2]=2960;b=F[a+32>>2];if(b){F[a+36>>2]=b;ja(b)}return a|0}function Xh(a){a=a|0;var b=0;F[a>>2]=5040;F[a>>2]=2960;b=F[a+32>>2];if(b){F[a+36>>2]=b;ja(b)}return a|0}function nf(a){a=a|0;if(a){if(D[a+39|0]<0){ja(F[a+28>>2])}$b(a+12|0,F[a+16>>2]);ib(a,F[a+4>>2]);ja(a)}}function dh(a){a=a|0;var b=0;F[a>>2]=8876;b=F[a+36>>2];if(b){ja(b)}b=F[a+24>>2];if(b){ja(b)}return a|0}function Wg(a){a=a|0;var b=0;F[a>>2]=9372;b=F[a+36>>2];if(b){ja(b)}b=F[a+24>>2];if(b){ja(b)}return a|0}function ob(a){a=a|0;var b=0;if(!(!F[a+52>>2]|(!F[a+44>>2]|!F[a+48>>2]))){b=F[a+56>>2]!=0}return b|0}function oc(a,b){a=a|0;b=b|0;var c=0;if(!(F[b+56>>2]|!b|G[b+24|0]!=3)){F[a+60>>2]=b;c=1}return c|0}function fi(a){a=a|0;var b=0;F[a>>2]=3500;F[a>>2]=2960;b=F[a+32>>2];if(b){F[a+36>>2]=b;ja(b)}ja(a)}function Wh(a){a=a|0;var b=0;F[a>>2]=5040;F[a>>2]=2960;b=F[a+32>>2];if(b){F[a+36>>2]=b;ja(b)}ja(a)}function zg(a,b,c){a=a|0;b=b|0;c=c|0;F[a+16>>2]=0;F[a+20>>2]=0;F[a>>2]=b;F[a+8>>2]=c;F[a+12>>2]=0}function ch(a){a=a|0;var b=0;F[a>>2]=8876;b=F[a+36>>2];if(b){ja(b)}b=F[a+24>>2];if(b){ja(b)}ja(a)}function Zd(a,b){a=a|0;b=b|0;var c=0;if(!(F[b+56>>2]|G[b+24|0]!=3)){F[a- -64>>2]=b;c=1}return c|0}function Vg(a){a=a|0;var b=0;F[a>>2]=9372;b=F[a+36>>2];if(b){ja(b)}b=F[a+24>>2];if(b){ja(b)}ja(a)}function Td(a,b){a=a|0;b=b|0;var c=0;if(!(F[b+56>>2]|G[b+24|0]!=3)){F[a+48>>2]=b;c=1}return c|0}function Le(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;if(La(a,F[b+8>>2],f)){Dc(b,c,d,e)}}function oa(){var a=0;a=Rb(4);F[a>>2]=11356;F[a>>2]=11316;F[a>>2]=11336;W(a|0,11448,14);v()}function je(a){a=a|0;var b=0;F[a>>2]=2960;b=F[a+32>>2];if(b){F[a+36>>2]=b;ja(b)}return a|0}function Ae(a){a=a|0;var b=0;F[a>>2]=1920;b=F[a+16>>2];F[a+16>>2]=0;if(b){xa(b)}return a|0}function Pg(a){a=a|0;var b=0;F[a>>2]=1624;b=F[a+8>>2];if(b){F[a+12>>2]=b;ja(b)}return a|0}function Ch(a){a=a|0;var b=0;b=bb(a);return qd(a+24|0,b?b:F[a+8>>2],F[F[a+4>>2]+32>>2])|0}function ze(a){a=a|0;var b=0;F[a>>2]=1920;b=F[a+16>>2];F[a+16>>2]=0;if(b){xa(b)}ja(a)}function Ob(a){a=a|0;var b=0;F[a>>2]=2960;b=F[a+32>>2];if(b){F[a+36>>2]=b;ja(b)}ja(a)}function Hg(a){a=a|0;var b=0;F[a>>2]=1624;b=F[a+8>>2];if(b){F[a+12>>2]=b;ja(b)}ja(a)}function oe(a,b){a=a|0;b=b|0;return $[F[F[a>>2]+48>>2]](a,F[b+4>>2]-F[b>>2]>>2)|0}function $b(a,b){if(b){$b(a,F[b>>2]);$b(a,F[b+4>>2]);ib(b+20|0,F[b+24>>2]);ja(b)}}function xg(a){a=a|0;var b=0;if(a){b=F[a+8>>2];if(b){F[a+12>>2]=b;ja(b)}ja(a)}}function xh(a){a=a|0;if(!F[a+44>>2]){return 0}return $[F[F[a>>2]+48>>2]](a)|0}function ni(a){var b=0;while(1){if(a){a=a-1&a;b=b+1|0;continue}break}return b}function Qe(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;if(La(a,F[b+8>>2],0)){Ec(b,c,d)}}function vh(a,b){a=a|0;b=b|0;a=F[a+48>>2];return $[F[F[a>>2]+20>>2]](a,b)|0}function oi(a){var b=0;b=a&31;a=0-a&31;return(-1>>>b&-2)<<b|(-1<<a&-2)>>>a}\nfunction oh(a,b){a=a|0;b=b|0;a=F[a+48>>2];return $[F[F[a>>2]+12>>2]](a,b)|0}function nh(a,b){a=a|0;b=b|0;a=F[a+48>>2];return $[F[F[a>>2]+16>>2]](a,b)|0}function Xa(){var a=0;a=ka(12);F[a>>2]=0;F[a+4>>2]=0;F[a+8>>2]=0;return a|0}function Wa(a){a=a|0;var b=0;if(a){b=F[a>>2];if(b){F[a+4>>2]=b;ja(b)}ja(a)}}function mf(a,b,c){a=a|0;b=b|0;c=c|0;F[a+32>>2]=c;F[a+28>>2]=b;return 1}function eg(a){a=a|0;if(a){Ca(a+12|0,F[a+16>>2]);Ba(a,F[a+4>>2]);ja(a)}}function Lb(a,b){a=a|0;b=b|0;if(b>>>0<=1){F[a+28>>2]=b}return b>>>0<2|0}function Fg(a,b){a=a|0;b=b|0;D[b+84|0]=1;F[b+72>>2]=F[b+68>>2];return 1}function kg(){var a=0;a=ka(8);F[a+4>>2]=-1;F[a>>2]=1032;return a|0}function Hf(a,b,c){a=a|0;b=b|0;c=c|0;return F[F[b+8>>2]+(c<<2)>>2]}function th(a){a=a|0;a=F[a+48>>2];return $[F[F[a>>2]+24>>2]](a)|0}function sh(a){a=a|0;a=F[a+48>>2];return $[F[F[a>>2]+28>>2]](a)|0}function ph(a){a=a|0;a=F[a+48>>2];return $[F[F[a>>2]+36>>2]](a)|0}function Rh(a,b){a=a|0;b=b|0;return zc(a+24|0,bb(a),F[a+8>>2])|0}function Bh(a,b){a=a|0;b=b|0;return xd(a+24|0,bb(a),F[a+8>>2])|0}function bg(a){a=a|0;if(a){if(D[a+15|0]<0){ja(F[a+4>>2])}ja(a)}}function Ke(a){a=a|0;if(!a){return 0}return(Fc(a,11164)|0)!=0|0}function Fe(a,b){a=a|0;b=b|0;F[a+12>>2]=-1;F[a+8>>2]=b;return 1}function hd(a,b){a=a|0;b=b|0;return $[F[F[a>>2]+12>>2]](a,b)|0}function Dh(a,b){a=a|0;b=b|0;return $[F[F[a>>2]+56>>2]](a,b)|0}function sc(a){a=Hc(Rb(8),a);F[a>>2]=11568;W(a|0,11600,1);v()}function mg(a,b){a=a|0;b=b|0;return M(J[F[a+8>>2]+(b<<2)>>2])}function Rd(a){a=Hc(Rb(8),a);F[a>>2]=11516;W(a|0,11548,1);v()}function $f(a,b){a=a|0;b=b|0;return M(J[F[a>>2]+(b<<2)>>2])}function gg(a){a=a|0;return(F[a+100>>2]-F[a+96>>2]|0)/12|0}function cg(a){a=a|0;return(D[a+15|0]<0?F[a+4>>2]:a+4|0)|0}function Re(a,b){a=a|0;b=b|0;return F[F[a+4>>2]+(b<<2)>>2]}function dd(a,b){a=a|0;b=b|0;return F[F[a>>2]+(b<<2)>>2]}function Yf(a,b){a=a|0;b=b|0;return E[F[a>>2]+(b<<1)>>1]}function Xf(a,b){a=a|0;b=b|0;return H[F[a>>2]+(b<<1)>>1]}function Vd(a,b,c){a=a|0;b=b|0;c=c|0;return xc(a,b,c)|0}function sb(a,b){var c=0;c=ka(b);F[a+4>>2]=b;F[a>>2]=c}function Kf(a,b,c){a=a|0;b=b|0;c=c|0;return Qc(b,c)|0}function Rc(a){F[a>>2]=10300;ma(a+4|0,0,80);return a}function ji(a){if(a){return 31-O(a-1^a)|0}return 32}function gd(a){a=a|0;return F[a+12>>2]-F[a+8>>2]>>2}function _f(a,b){a=a|0;b=b|0;return D[F[a>>2]+b|0]}function Zf(a,b){a=a|0;b=b|0;return G[F[a>>2]+b|0]}function Ie(a){a=a|0;return F[a+8>>2]-F[a+4>>2]>>2}function wb(a){a=a|0;if(a){$[F[F[a>>2]+4>>2]](a)}}function Jd(a,b){a=a|0;b=b|0;F[a+4>>2]=b;return 1}function ed(a){a=a|0;return F[a+4>>2]-F[a>>2]>>1}function dc(a){a=a|0;return F[a+4>>2]-F[a>>2]>>2}function fd(a){a=a|0;return F[a+4>>2]-F[a>>2]|0}function ke(a){a=a|0;return G[F[a+8>>2]+24|0]}function Qf(a,b){a=a|0;b=b|0;return F[b+8>>2]}function Ff(a,b){a=a|0;b=b|0;return F[b+4>>2]}function De(a,b,c){a=a|0;b=b|0;c=c|0;return 1}function Bg(a,b){a=a|0;b=b|0;return G[b+24|0]}function Oh(a){a=a|0;F[a>>2]=5928;return a|0}function Jh(a){a=a|0;F[a>>2]=6932;return a|0}function lg(a){a=a|0;return M(J[a+20>>2])}function Nh(a){a=a|0;F[a>>2]=5928;ja(a)}function Ih(a){a=a|0;F[a>>2]=6932;ja(a)}function ug(a){a=a|0;return F[a+88>>2]}function tg(a){a=a|0;return F[a+56>>2]}function qg(a){a=a|0;return F[a+40>>2]}function pg(a){a=a|0;return F[a+48>>2]}function og(a){a=a|0;return F[a+60>>2]}function ec(a){a=a|0;return F[a+80>>2]}function cb(a){a=a|0;return F[a+28>>2]}function vd(a){a=a|0;return F[a+8>>2]}function tc(a,b){a=a|0;b=b|0;return-1}function sg(a){a=a|0;return D[a+24|0]}function rg(a){a=a|0;return G[a+32|0]}function dg(a){a=a|0;return!F[a>>2]|0}function Wd(a,b){a=a|0;b=b|0;return 6}function Va(a){a=a|0;return F[a+4>>2]}function Rb(a){return Ub(a+80|0)+80|0}function Qh(a,b){a=a|0;b=b|0;return 2}function Ia(a,b){a=a|0;b=b|0;return 0}function Bc(a,b){a=a|0;b=b|0;return 1}function jd(a){a=a|0;return F[a>>2]}function wg(){return kb(ka(64))|0}function ig(){return Rc(ka(84))|0}function fc(a){a=a|0;if(a){ja(a)}}function Ag(){return Ja(ka(40))|0}function Qb(a){a=a|0;Cc(a);ja(a)}function Je(a){a=a|0;return 1161}function He(a){a=a|0;return 1235}function Ge(a){a=a|0;return 1201}function Pa(a){a=a|0;return a|0}function hh(a){a=a|0;ja(ud(a))}function gh(a){a=a|0;ja(sd(a))}function Ve(a){a=a|0;ja(tb(a))}function ua(a){a=a|0;return 1}function rc(a){a=a|0;return 4}function qc(a){a=a|0;return 5}function Xd(a){a=a|0;return 2}function Ua(a){a=a|0;return 0}function Nb(a){a=a|0;return 6}function Mh(a){a=a|0;return 3}function za(){Rd(1222);v()}function ta(){sc(1154);v()}function na(){Rd(1154);v()}function Ha(a){a=a|0;ja(a)}function Ra(a){a=a|0;v()}function ff(){return 10}function ef(){return 11}function df(){return 12}function vb(){return-1}function ub(){return 1}function lf(){return 5}function kf(){return 6}function jf(){return 7}function jb(){return 0}function hf(){return 8}function gf(){return 9}function cf(){return-2}function bf(){return-3}function bd(){return 3}function af(){return-4}function ad(){return 4}function _b(){return 2}function $e(){return-5}function Te(){V();v()}function Jc(a){a=a|0}function ae(){}\n// EMSCRIPTEN_END_FUNCS\ne=G;p(q);var $=c([null,Cc,Pa,Ha,Xd,ii,jh,ag,zc,xe,uc,jg,Wd,Qh,Pa,Pg,Hg,ua,yh,mh,kh,xd,fh,qd,Wd,Bg,We,Ra,mf,$c,Ue,Re,Ie,cb,Ia,Te,Bc,ua,Ae,ze,Ac,Fe,Ee,De,Bc,Ce,Be,re,qe,ye,we,pe,ve,ue,te,se,wc,vc,Ac,oe,ne,xc,me,ke,le,je,Ob,ua,Va,ob,Ua,tc,Ia,Ua,ua,ie,he,Ra,Ra,ge,fe,rc,ob,ee,de,ce,be,qc,pc,ua,Ia,oc,$d,hi,gi,fi,Nb,_d,ua,Ia,Zd,Yd,ei,Pa,Ha,Lb,cb,Mb,Ra,Ob,ua,ob,di,Ra,ci,bi,rc,ob,ai,$h,_h,Zh,qc,pc,ua,Ia,oc,$d,Yh,Xh,Wh,Nb,_d,ua,Ia,Zd,Yd,Vh,Pa,Ha,Lb,cb,Kb,Ra,Ob,Ua,ua,Uh,wc,vc,Th,Sh,Vd,Ph,Xd,Rh,Oh,Nh,Nb,Va,Ud,ua,Ia,Td,ua,Mh,Sd,Lh,Pa,Ha,Lb,cb,Mb,Jh,Ih,Nb,Ud,ua,Ia,Td,Sd,Hh,Pa,Ha,Lb,cb,Kb,Pa,Ha,Ua,ua,Ua,tc,Ia,Kh,Gh,Ah,zh,Fh,Eh,Vd,Dh,Ch,Bh,wh,Ra,ua,ua,xh,Dg,Cg,ua,Ua,Ia,Ia,rh,qh,uh,vh,sh,ph,oh,nh,th,ud,hh,Jd,Id,Hd,Gd,lh,ua,Va,vd,sd,gh,Jd,Id,Hd,Gd,ih,ua,Va,vd,Ed,eh,Fd,dh,ch,$g,_g,Zg,Yg,ah,Xg,bh,Wg,Vg,Tg,Sg,Rg,Qg,Ug,Og,Ng,Mg,Lg,Kg,Gg,Ig,Jg,Pa,Ha,Fg,Eg,Ra,Ua,ua,_e,Ze,Ye,Xe,tb,Ve,Oc,Nc,Pa,Ha,Jc,Jc,Se,Le,Ne,Qe,Ha,Me,Oe,Pe,Ha,He,Ha,Ge,Ha,Je,Qb,Va,Qb,Qb]);function aa(){return C.byteLength/65536|0}function fa(ga){ga=ga|0;var ba=aa()|0;var ca=ba+ga|0;if(ba<ca&&ca<65536){var da=new ArrayBuffer(L(ca,65536));var ea=new Int8Array(da);ea.set(D);D=new Int8Array(da);E=new Int16Array(da);F=new Int32Array(da);G=new Uint8Array(da);H=new Uint16Array(da);I=new Uint32Array(da);J=new Float32Array(da);K=new Float64Array(da);C=da;B.buffer=C;e=G}return ba}return{\"f\":ae,\"g\":$,\"h\":fc,\"i\":Ag,\"j\":zg,\"k\":fc,\"l\":yg,\"m\":jd,\"n\":xg,\"o\":wg,\"p\":fc,\"q\":vg,\"r\":ec,\"s\":ug,\"t\":tg,\"u\":cb,\"v\":sg,\"w\":rg,\"x\":qg,\"y\":pg,\"z\":og,\"A\":xa,\"B\":ng,\"C\":hd,\"D\":Va,\"E\":mg,\"F\":lg,\"G\":wb,\"H\":kg,\"I\":hd,\"J\":Va,\"K\":wb,\"L\":ig,\"M\":gd,\"N\":ec,\"O\":wb,\"P\":hg,\"Q\":gg,\"R\":gd,\"S\":ec,\"T\":wb,\"U\":fg,\"V\":eg,\"W\":jd,\"X\":dg,\"Y\":cg,\"Z\":bg,\"_\":Xa,\"$\":$f,\"aa\":dc,\"ba\":Wa,\"ca\":Xa,\"da\":_f,\"ea\":fd,\"fa\":Wa,\"ga\":Xa,\"ha\":Zf,\"ia\":fd,\"ja\":Wa,\"ka\":Xa,\"la\":Yf,\"ma\":ed,\"na\":Wa,\"oa\":Xa,\"pa\":Xf,\"qa\":ed,\"ra\":Wa,\"sa\":Xa,\"ta\":dd,\"ua\":dc,\"va\":Wa,\"wa\":Xa,\"xa\":dd,\"ya\":dc,\"za\":Wa,\"Aa\":Wf,\"Ba\":Vf,\"Ca\":Uf,\"Da\":Tf,\"Ea\":Sf,\"Fa\":Rf,\"Ga\":Qf,\"Ha\":Pf,\"Ia\":Of,\"Ja\":Nf,\"Ka\":Mf,\"La\":Lf,\"Ma\":Kf,\"Na\":Jf,\"Oa\":If,\"Pa\":Hf,\"Qa\":Gf,\"Ra\":Ff,\"Sa\":Ef,\"Ta\":Df,\"Ua\":Cf,\"Va\":Bf,\"Wa\":Af,\"Xa\":zf,\"Ya\":yf,\"Za\":cd,\"_a\":xf,\"$a\":wf,\"ab\":vf,\"bb\":uf,\"cb\":cd,\"db\":tf,\"eb\":sf,\"fb\":rf,\"gb\":qf,\"hb\":pf,\"ib\":of,\"jb\":nf,\"kb\":vb,\"lb\":jb,\"mb\":ub,\"nb\":_b,\"ob\":vb,\"pb\":jb,\"qb\":ub,\"rb\":_b,\"sb\":bd,\"tb\":ad,\"ub\":vb,\"vb\":jb,\"wb\":ub,\"xb\":jb,\"yb\":ub,\"zb\":_b,\"Ab\":bd,\"Bb\":ad,\"Cb\":lf,\"Db\":kf,\"Eb\":jf,\"Fb\":hf,\"Gb\":gf,\"Hb\":ff,\"Ib\":ef,\"Jb\":df,\"Kb\":jb,\"Lb\":vb,\"Mb\":cf,\"Nb\":bf,\"Ob\":af,\"Pb\":$e,\"Qb\":Ub,\"Rb\":ja,\"Sb\":Ke}}return ha(ia)}\n// EMSCRIPTEN_END_ASM\n\n\n)(info)},instantiate:function(binary,info){return{then:function(ok){var module=new WebAssembly.Module(binary);ok({\"instance\":new WebAssembly.Instance(module,info)})}}},RuntimeError:Error};wasmBinary=[];if(typeof WebAssembly!=\"object\"){abort(\"no native wasm support detected\")}var wasmMemory;var ABORT=false;var EXITSTATUS;function assert(condition,text){if(!condition){abort(text)}}var UTF8Decoder=typeof TextDecoder!=\"undefined\"?new TextDecoder(\"utf8\"):undefined;function UTF8ArrayToString(heapOrArray,idx,maxBytesToRead){var endIdx=idx+maxBytesToRead;var endPtr=idx;while(heapOrArray[endPtr]&&!(endPtr>=endIdx))++endPtr;if(endPtr-idx>16&&heapOrArray.buffer&&UTF8Decoder){return UTF8Decoder.decode(heapOrArray.subarray(idx,endPtr))}var str=\"\";while(idx<endPtr){var u0=heapOrArray[idx++];if(!(u0&128)){str+=String.fromCharCode(u0);continue}var u1=heapOrArray[idx++]&63;if((u0&224)==192){str+=String.fromCharCode((u0&31)<<6|u1);continue}var u2=heapOrArray[idx++]&63;if((u0&240)==224){u0=(u0&15)<<12|u1<<6|u2}else{u0=(u0&7)<<18|u1<<12|u2<<6|heapOrArray[idx++]&63}if(u0<65536){str+=String.fromCharCode(u0)}else{var ch=u0-65536;str+=String.fromCharCode(55296|ch>>10,56320|ch&1023)}}return str}function UTF8ToString(ptr,maxBytesToRead){return ptr?UTF8ArrayToString(HEAPU8,ptr,maxBytesToRead):\"\"}function stringToUTF8Array(str,heap,outIdx,maxBytesToWrite){if(!(maxBytesToWrite>0))return 0;var startIdx=outIdx;var endIdx=outIdx+maxBytesToWrite-1;for(var i=0;i<str.length;++i){var u=str.charCodeAt(i);if(u>=55296&&u<=57343){var u1=str.charCodeAt(++i);u=65536+((u&1023)<<10)|u1&1023}if(u<=127){if(outIdx>=endIdx)break;heap[outIdx++]=u}else if(u<=2047){if(outIdx+1>=endIdx)break;heap[outIdx++]=192|u>>6;heap[outIdx++]=128|u&63}else if(u<=65535){if(outIdx+2>=endIdx)break;heap[outIdx++]=224|u>>12;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}else{if(outIdx+3>=endIdx)break;heap[outIdx++]=240|u>>18;heap[outIdx++]=128|u>>12&63;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}}heap[outIdx]=0;return outIdx-startIdx}function lengthBytesUTF8(str){var len=0;for(var i=0;i<str.length;++i){var c=str.charCodeAt(i);if(c<=127){len++}else if(c<=2047){len+=2}else if(c>=55296&&c<=57343){len+=4;++i}else{len+=3}}return len}var HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64;function updateMemoryViews(){var b=wasmMemory.buffer;Module[\"HEAP8\"]=HEAP8=new Int8Array(b);Module[\"HEAP16\"]=HEAP16=new Int16Array(b);Module[\"HEAP32\"]=HEAP32=new Int32Array(b);Module[\"HEAPU8\"]=HEAPU8=new Uint8Array(b);Module[\"HEAPU16\"]=HEAPU16=new Uint16Array(b);Module[\"HEAPU32\"]=HEAPU32=new Uint32Array(b);Module[\"HEAPF32\"]=HEAPF32=new Float32Array(b);Module[\"HEAPF64\"]=HEAPF64=new Float64Array(b)}var INITIAL_MEMORY=Module[\"INITIAL_MEMORY\"]||16777216;assert(INITIAL_MEMORY>=65536,\"INITIAL_MEMORY should be larger than STACK_SIZE, was \"+INITIAL_MEMORY+\"! (STACK_SIZE=\"+65536+\")\");if(Module[\"wasmMemory\"]){wasmMemory=Module[\"wasmMemory\"]}else{wasmMemory=new WebAssembly.Memory({\"initial\":INITIAL_MEMORY/65536,\"maximum\":2147483648/65536})}updateMemoryViews();INITIAL_MEMORY=wasmMemory.buffer.byteLength;var wasmTable;var __ATPRERUN__=[];var __ATINIT__=[];var __ATPOSTRUN__=[];var runtimeInitialized=false;function keepRuntimeAlive(){return noExitRuntime}function preRun(){if(Module[\"preRun\"]){if(typeof Module[\"preRun\"]==\"function\")Module[\"preRun\"]=[Module[\"preRun\"]];while(Module[\"preRun\"].length){addOnPreRun(Module[\"preRun\"].shift())}}callRuntimeCallbacks(__ATPRERUN__)}function initRuntime(){runtimeInitialized=true;callRuntimeCallbacks(__ATINIT__)}function postRun(){if(Module[\"postRun\"]){if(typeof Module[\"postRun\"]==\"function\")Module[\"postRun\"]=[Module[\"postRun\"]];while(Module[\"postRun\"].length){addOnPostRun(Module[\"postRun\"].shift())}}callRuntimeCallbacks(__ATPOSTRUN__)}function addOnPreRun(cb){__ATPRERUN__.unshift(cb)}function addOnInit(cb){__ATINIT__.unshift(cb)}function addOnPostRun(cb){__ATPOSTRUN__.unshift(cb)}var runDependencies=0;var runDependencyWatcher=null;var dependenciesFulfilled=null;function addRunDependency(id){runDependencies++;if(Module[\"monitorRunDependencies\"]){Module[\"monitorRunDependencies\"](runDependencies)}}function removeRunDependency(id){runDependencies--;if(Module[\"monitorRunDependencies\"]){Module[\"monitorRunDependencies\"](runDependencies)}if(runDependencies==0){if(runDependencyWatcher!==null){clearInterval(runDependencyWatcher);runDependencyWatcher=null}if(dependenciesFulfilled){var callback=dependenciesFulfilled;dependenciesFulfilled=null;callback()}}}function abort(what){if(Module[\"onAbort\"]){Module[\"onAbort\"](what)}what=\"Aborted(\"+what+\")\";err(what);ABORT=true;EXITSTATUS=1;what+=\". Build with -sASSERTIONS for more info.\";var e=new WebAssembly.RuntimeError(what);readyPromiseReject(e);throw e}var dataURIPrefix=\"data:application/octet-stream;base64,\";function isDataURI(filename){return filename.startsWith(dataURIPrefix)}function isFileURI(filename){return filename.startsWith(\"file://\")}var wasmBinaryFile;wasmBinaryFile=\"draco_decoder_gltf.wasm\";if(!isDataURI(wasmBinaryFile)){wasmBinaryFile=locateFile(wasmBinaryFile)}function getBinary(file){try{if(file==wasmBinaryFile&&wasmBinary){return new Uint8Array(wasmBinary)}var binary=tryParseAsDataURI(file);if(binary){return binary}if(readBinary){return readBinary(file)}throw\"both async and sync fetching of the wasm failed\"}catch(err){abort(err)}}function getBinaryPromise(){if(!wasmBinary&&(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER)){if(typeof fetch==\"function\"&&!isFileURI(wasmBinaryFile)){return fetch(wasmBinaryFile,{credentials:\"same-origin\"}).then(function(response){if(!response[\"ok\"]){throw\"failed to load wasm binary file at '\"+wasmBinaryFile+\"'\"}return response[\"arrayBuffer\"]()}).catch(function(){return getBinary(wasmBinaryFile)})}else{if(readAsync){return new Promise(function(resolve,reject){readAsync(wasmBinaryFile,function(response){resolve(new Uint8Array(response))},reject)})}}}return Promise.resolve().then(function(){return getBinary(wasmBinaryFile)})}function createWasm(){var info={\"a\":wasmImports};function receiveInstance(instance,module){var exports=instance.exports;Module[\"asm\"]=exports;wasmTable=Module[\"asm\"][\"g\"];addOnInit(Module[\"asm\"][\"f\"]);removeRunDependency(\"wasm-instantiate\")}addRunDependency(\"wasm-instantiate\");function receiveInstantiationResult(result){receiveInstance(result[\"instance\"])}function instantiateArrayBuffer(receiver){return getBinaryPromise().then(function(binary){return WebAssembly.instantiate(binary,info)}).then(function(instance){return instance}).then(receiver,function(reason){err(\"failed to asynchronously prepare wasm: \"+reason);abort(reason)})}function instantiateAsync(){if(!wasmBinary&&typeof WebAssembly.instantiateStreaming==\"function\"&&!isDataURI(wasmBinaryFile)&&!isFileURI(wasmBinaryFile)&&!ENVIRONMENT_IS_NODE&&typeof fetch==\"function\"){return fetch(wasmBinaryFile,{credentials:\"same-origin\"}).then(function(response){var result=WebAssembly.instantiateStreaming(response,info);return result.then(receiveInstantiationResult,function(reason){err(\"wasm streaming compile failed: \"+reason);err(\"falling back to ArrayBuffer instantiation\");return instantiateArrayBuffer(receiveInstantiationResult)})})}else{return instantiateArrayBuffer(receiveInstantiationResult)}}if(Module[\"instantiateWasm\"]){try{var exports=Module[\"instantiateWasm\"](info,receiveInstance);return exports}catch(e){err(\"Module.instantiateWasm callback failed with error: \"+e);readyPromiseReject(e)}}instantiateAsync().catch(readyPromiseReject);return{}}function ExitStatus(status){this.name=\"ExitStatus\";this.message=\"Program terminated with exit(\"+status+\")\";this.status=status}function callRuntimeCallbacks(callbacks){while(callbacks.length>0){callbacks.shift()(Module)}}function intArrayToString(array){var ret=[];for(var i=0;i<array.length;i++){var chr=array[i];if(chr>255){chr&=255}ret.push(String.fromCharCode(chr))}return ret.join(\"\")}function ExceptionInfo(excPtr){this.excPtr=excPtr;this.ptr=excPtr-24;this.set_type=function(type){HEAPU32[this.ptr+4>>2]=type};this.get_type=function(){return HEAPU32[this.ptr+4>>2]};this.set_destructor=function(destructor){HEAPU32[this.ptr+8>>2]=destructor};this.get_destructor=function(){return HEAPU32[this.ptr+8>>2]};this.set_refcount=function(refcount){HEAP32[this.ptr>>2]=refcount};this.set_caught=function(caught){caught=caught?1:0;HEAP8[this.ptr+12>>0]=caught};this.get_caught=function(){return HEAP8[this.ptr+12>>0]!=0};this.set_rethrown=function(rethrown){rethrown=rethrown?1:0;HEAP8[this.ptr+13>>0]=rethrown};this.get_rethrown=function(){return HEAP8[this.ptr+13>>0]!=0};this.init=function(type,destructor){this.set_adjusted_ptr(0);this.set_type(type);this.set_destructor(destructor);this.set_refcount(0);this.set_caught(false);this.set_rethrown(false)};this.add_ref=function(){var value=HEAP32[this.ptr>>2];HEAP32[this.ptr>>2]=value+1};this.release_ref=function(){var prev=HEAP32[this.ptr>>2];HEAP32[this.ptr>>2]=prev-1;return prev===1};this.set_adjusted_ptr=function(adjustedPtr){HEAPU32[this.ptr+16>>2]=adjustedPtr};this.get_adjusted_ptr=function(){return HEAPU32[this.ptr+16>>2]};this.get_exception_ptr=function(){var isPointer=___cxa_is_pointer_type(this.get_type());if(isPointer){return HEAPU32[this.excPtr>>2]}var adjusted=this.get_adjusted_ptr();if(adjusted!==0)return adjusted;return this.excPtr}}var exceptionLast=0;var uncaughtExceptionCount=0;function ___cxa_throw(ptr,type,destructor){var info=new ExceptionInfo(ptr);info.init(type,destructor);exceptionLast=ptr;uncaughtExceptionCount++;throw ptr}function _abort(){abort(\"\")}function _emscripten_memcpy_big(dest,src,num){HEAPU8.copyWithin(dest,src,src+num)}function getHeapMax(){return 2147483648}function emscripten_realloc_buffer(size){var b=wasmMemory.buffer;try{wasmMemory.grow(size-b.byteLength+65535>>>16);updateMemoryViews();return 1}catch(e){}}function _emscripten_resize_heap(requestedSize){var oldSize=HEAPU8.length;requestedSize=requestedSize>>>0;var maxHeapSize=getHeapMax();if(requestedSize>maxHeapSize){return false}let alignUp=(x,multiple)=>x+(multiple-x%multiple)%multiple;for(var cutDown=1;cutDown<=4;cutDown*=2){var overGrownHeapSize=oldSize*(1+.2/cutDown);overGrownHeapSize=Math.min(overGrownHeapSize,requestedSize+100663296);var newSize=Math.min(maxHeapSize,alignUp(Math.max(requestedSize,overGrownHeapSize),65536));var replacement=emscripten_realloc_buffer(newSize);if(replacement){return true}}return false}function intArrayFromString(stringy,dontAddNull,length){var len=length>0?length:lengthBytesUTF8(stringy)+1;var u8array=new Array(len);var numBytesWritten=stringToUTF8Array(stringy,u8array,0,u8array.length);if(dontAddNull)u8array.length=numBytesWritten;return u8array}var decodeBase64=typeof atob==\"function\"?atob:function(input){var keyStr=\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\";var output=\"\";var chr1,chr2,chr3;var enc1,enc2,enc3,enc4;var i=0;input=input.replace(/[^A-Za-z0-9\\+\\/\\=]/g,\"\");do{enc1=keyStr.indexOf(input.charAt(i++));enc2=keyStr.indexOf(input.charAt(i++));enc3=keyStr.indexOf(input.charAt(i++));enc4=keyStr.indexOf(input.charAt(i++));chr1=enc1<<2|enc2>>4;chr2=(enc2&15)<<4|enc3>>2;chr3=(enc3&3)<<6|enc4;output=output+String.fromCharCode(chr1);if(enc3!==64){output=output+String.fromCharCode(chr2)}if(enc4!==64){output=output+String.fromCharCode(chr3)}}while(i<input.length);return output};function intArrayFromBase64(s){if(typeof ENVIRONMENT_IS_NODE==\"boolean\"&&ENVIRONMENT_IS_NODE){var buf=Buffer.from(s,\"base64\");return new Uint8Array(buf[\"buffer\"],buf[\"byteOffset\"],buf[\"byteLength\"])}try{var decoded=decodeBase64(s);var bytes=new Uint8Array(decoded.length);for(var i=0;i<decoded.length;++i){bytes[i]=decoded.charCodeAt(i)}return bytes}catch(_){throw new Error(\"Converting base64 string to bytes failed.\")}}function tryParseAsDataURI(filename){if(!isDataURI(filename)){return}return intArrayFromBase64(filename.slice(dataURIPrefix.length))}var wasmImports={\"c\":___cxa_throw,\"b\":_abort,\"e\":_emscripten_memcpy_big,\"d\":_emscripten_resize_heap,\"a\":wasmMemory};var asm=createWasm();var ___wasm_call_ctors=function(){return(___wasm_call_ctors=Module[\"asm\"][\"f\"]).apply(null,arguments)};var _emscripten_bind_VoidPtr___destroy___0=Module[\"_emscripten_bind_VoidPtr___destroy___0\"]=function(){return(_emscripten_bind_VoidPtr___destroy___0=Module[\"_emscripten_bind_VoidPtr___destroy___0\"]=Module[\"asm\"][\"h\"]).apply(null,arguments)};var _emscripten_bind_DecoderBuffer_DecoderBuffer_0=Module[\"_emscripten_bind_DecoderBuffer_DecoderBuffer_0\"]=function(){return(_emscripten_bind_DecoderBuffer_DecoderBuffer_0=Module[\"_emscripten_bind_DecoderBuffer_DecoderBuffer_0\"]=Module[\"asm\"][\"i\"]).apply(null,arguments)};var _emscripten_bind_DecoderBuffer_Init_2=Module[\"_emscripten_bind_DecoderBuffer_Init_2\"]=function(){return(_emscripten_bind_DecoderBuffer_Init_2=Module[\"_emscripten_bind_DecoderBuffer_Init_2\"]=Module[\"asm\"][\"j\"]).apply(null,arguments)};var _emscripten_bind_DecoderBuffer___destroy___0=Module[\"_emscripten_bind_DecoderBuffer___destroy___0\"]=function(){return(_emscripten_bind_DecoderBuffer___destroy___0=Module[\"_emscripten_bind_DecoderBuffer___destroy___0\"]=Module[\"asm\"][\"k\"]).apply(null,arguments)};var _emscripten_bind_AttributeTransformData_AttributeTransformData_0=Module[\"_emscripten_bind_AttributeTransformData_AttributeTransformData_0\"]=function(){return(_emscripten_bind_AttributeTransformData_AttributeTransformData_0=Module[\"_emscripten_bind_AttributeTransformData_AttributeTransformData_0\"]=Module[\"asm\"][\"l\"]).apply(null,arguments)};var _emscripten_bind_AttributeTransformData_transform_type_0=Module[\"_emscripten_bind_AttributeTransformData_transform_type_0\"]=function(){return(_emscripten_bind_AttributeTransformData_transform_type_0=Module[\"_emscripten_bind_AttributeTransformData_transform_type_0\"]=Module[\"asm\"][\"m\"]).apply(null,arguments)};var _emscripten_bind_AttributeTransformData___destroy___0=Module[\"_emscripten_bind_AttributeTransformData___destroy___0\"]=function(){return(_emscripten_bind_AttributeTransformData___destroy___0=Module[\"_emscripten_bind_AttributeTransformData___destroy___0\"]=Module[\"asm\"][\"n\"]).apply(null,arguments)};var _emscripten_bind_GeometryAttribute_GeometryAttribute_0=Module[\"_emscripten_bind_GeometryAttribute_GeometryAttribute_0\"]=function(){return(_emscripten_bind_GeometryAttribute_GeometryAttribute_0=Module[\"_emscripten_bind_GeometryAttribute_GeometryAttribute_0\"]=Module[\"asm\"][\"o\"]).apply(null,arguments)};var _emscripten_bind_GeometryAttribute___destroy___0=Module[\"_emscripten_bind_GeometryAttribute___destroy___0\"]=function(){return(_emscripten_bind_GeometryAttribute___destroy___0=Module[\"_emscripten_bind_GeometryAttribute___destroy___0\"]=Module[\"asm\"][\"p\"]).apply(null,arguments)};var _emscripten_bind_PointAttribute_PointAttribute_0=Module[\"_emscripten_bind_PointAttribute_PointAttribute_0\"]=function(){return(_emscripten_bind_PointAttribute_PointAttribute_0=Module[\"_emscripten_bind_PointAttribute_PointAttribute_0\"]=Module[\"asm\"][\"q\"]).apply(null,arguments)};var _emscripten_bind_PointAttribute_size_0=Module[\"_emscripten_bind_PointAttribute_size_0\"]=function(){return(_emscripten_bind_PointAttribute_size_0=Module[\"_emscripten_bind_PointAttribute_size_0\"]=Module[\"asm\"][\"r\"]).apply(null,arguments)};var _emscripten_bind_PointAttribute_GetAttributeTransformData_0=Module[\"_emscripten_bind_PointAttribute_GetAttributeTransformData_0\"]=function(){return(_emscripten_bind_PointAttribute_GetAttributeTransformData_0=Module[\"_emscripten_bind_PointAttribute_GetAttributeTransformData_0\"]=Module[\"asm\"][\"s\"]).apply(null,arguments)};var _emscripten_bind_PointAttribute_attribute_type_0=Module[\"_emscripten_bind_PointAttribute_attribute_type_0\"]=function(){return(_emscripten_bind_PointAttribute_attribute_type_0=Module[\"_emscripten_bind_PointAttribute_attribute_type_0\"]=Module[\"asm\"][\"t\"]).apply(null,arguments)};var _emscripten_bind_PointAttribute_data_type_0=Module[\"_emscripten_bind_PointAttribute_data_type_0\"]=function(){return(_emscripten_bind_PointAttribute_data_type_0=Module[\"_emscripten_bind_PointAttribute_data_type_0\"]=Module[\"asm\"][\"u\"]).apply(null,arguments)};var _emscripten_bind_PointAttribute_num_components_0=Module[\"_emscripten_bind_PointAttribute_num_components_0\"]=function(){return(_emscripten_bind_PointAttribute_num_components_0=Module[\"_emscripten_bind_PointAttribute_num_components_0\"]=Module[\"asm\"][\"v\"]).apply(null,arguments)};var _emscripten_bind_PointAttribute_normalized_0=Module[\"_emscripten_bind_PointAttribute_normalized_0\"]=function(){return(_emscripten_bind_PointAttribute_normalized_0=Module[\"_emscripten_bind_PointAttribute_normalized_0\"]=Module[\"asm\"][\"w\"]).apply(null,arguments)};var _emscripten_bind_PointAttribute_byte_stride_0=Module[\"_emscripten_bind_PointAttribute_byte_stride_0\"]=function(){return(_emscripten_bind_PointAttribute_byte_stride_0=Module[\"_emscripten_bind_PointAttribute_byte_stride_0\"]=Module[\"asm\"][\"x\"]).apply(null,arguments)};var _emscripten_bind_PointAttribute_byte_offset_0=Module[\"_emscripten_bind_PointAttribute_byte_offset_0\"]=function(){return(_emscripten_bind_PointAttribute_byte_offset_0=Module[\"_emscripten_bind_PointAttribute_byte_offset_0\"]=Module[\"asm\"][\"y\"]).apply(null,arguments)};var _emscripten_bind_PointAttribute_unique_id_0=Module[\"_emscripten_bind_PointAttribute_unique_id_0\"]=function(){return(_emscripten_bind_PointAttribute_unique_id_0=Module[\"_emscripten_bind_PointAttribute_unique_id_0\"]=Module[\"asm\"][\"z\"]).apply(null,arguments)};var _emscripten_bind_PointAttribute___destroy___0=Module[\"_emscripten_bind_PointAttribute___destroy___0\"]=function(){return(_emscripten_bind_PointAttribute___destroy___0=Module[\"_emscripten_bind_PointAttribute___destroy___0\"]=Module[\"asm\"][\"A\"]).apply(null,arguments)};var _emscripten_bind_AttributeQuantizationTransform_AttributeQuantizationTransform_0=Module[\"_emscripten_bind_AttributeQuantizationTransform_AttributeQuantizationTransform_0\"]=function(){return(_emscripten_bind_AttributeQuantizationTransform_AttributeQuantizationTransform_0=Module[\"_emscripten_bind_AttributeQuantizationTransform_AttributeQuantizationTransform_0\"]=Module[\"asm\"][\"B\"]).apply(null,arguments)};var _emscripten_bind_AttributeQuantizationTransform_InitFromAttribute_1=Module[\"_emscripten_bind_AttributeQuantizationTransform_InitFromAttribute_1\"]=function(){return(_emscripten_bind_AttributeQuantizationTransform_InitFromAttribute_1=Module[\"_emscripten_bind_AttributeQuantizationTransform_InitFromAttribute_1\"]=Module[\"asm\"][\"C\"]).apply(null,arguments)};var _emscripten_bind_AttributeQuantizationTransform_quantization_bits_0=Module[\"_emscripten_bind_AttributeQuantizationTransform_quantization_bits_0\"]=function(){return(_emscripten_bind_AttributeQuantizationTransform_quantization_bits_0=Module[\"_emscripten_bind_AttributeQuantizationTransform_quantization_bits_0\"]=Module[\"asm\"][\"D\"]).apply(null,arguments)};var _emscripten_bind_AttributeQuantizationTransform_min_value_1=Module[\"_emscripten_bind_AttributeQuantizationTransform_min_value_1\"]=function(){return(_emscripten_bind_AttributeQuantizationTransform_min_value_1=Module[\"_emscripten_bind_AttributeQuantizationTransform_min_value_1\"]=Module[\"asm\"][\"E\"]).apply(null,arguments)};var _emscripten_bind_AttributeQuantizationTransform_range_0=Module[\"_emscripten_bind_AttributeQuantizationTransform_range_0\"]=function(){return(_emscripten_bind_AttributeQuantizationTransform_range_0=Module[\"_emscripten_bind_AttributeQuantizationTransform_range_0\"]=Module[\"asm\"][\"F\"]).apply(null,arguments)};var _emscripten_bind_AttributeQuantizationTransform___destroy___0=Module[\"_emscripten_bind_AttributeQuantizationTransform___destroy___0\"]=function(){return(_emscripten_bind_AttributeQuantizationTransform___destroy___0=Module[\"_emscripten_bind_AttributeQuantizationTransform___destroy___0\"]=Module[\"asm\"][\"G\"]).apply(null,arguments)};var _emscripten_bind_AttributeOctahedronTransform_AttributeOctahedronTransform_0=Module[\"_emscripten_bind_AttributeOctahedronTransform_AttributeOctahedronTransform_0\"]=function(){return(_emscripten_bind_AttributeOctahedronTransform_AttributeOctahedronTransform_0=Module[\"_emscripten_bind_AttributeOctahedronTransform_AttributeOctahedronTransform_0\"]=Module[\"asm\"][\"H\"]).apply(null,arguments)};var _emscripten_bind_AttributeOctahedronTransform_InitFromAttribute_1=Module[\"_emscripten_bind_AttributeOctahedronTransform_InitFromAttribute_1\"]=function(){return(_emscripten_bind_AttributeOctahedronTransform_InitFromAttribute_1=Module[\"_emscripten_bind_AttributeOctahedronTransform_InitFromAttribute_1\"]=Module[\"asm\"][\"I\"]).apply(null,arguments)};var _emscripten_bind_AttributeOctahedronTransform_quantization_bits_0=Module[\"_emscripten_bind_AttributeOctahedronTransform_quantization_bits_0\"]=function(){return(_emscripten_bind_AttributeOctahedronTransform_quantization_bits_0=Module[\"_emscripten_bind_AttributeOctahedronTransform_quantization_bits_0\"]=Module[\"asm\"][\"J\"]).apply(null,arguments)};var _emscripten_bind_AttributeOctahedronTransform___destroy___0=Module[\"_emscripten_bind_AttributeOctahedronTransform___destroy___0\"]=function(){return(_emscripten_bind_AttributeOctahedronTransform___destroy___0=Module[\"_emscripten_bind_AttributeOctahedronTransform___destroy___0\"]=Module[\"asm\"][\"K\"]).apply(null,arguments)};var _emscripten_bind_PointCloud_PointCloud_0=Module[\"_emscripten_bind_PointCloud_PointCloud_0\"]=function(){return(_emscripten_bind_PointCloud_PointCloud_0=Module[\"_emscripten_bind_PointCloud_PointCloud_0\"]=Module[\"asm\"][\"L\"]).apply(null,arguments)};var _emscripten_bind_PointCloud_num_attributes_0=Module[\"_emscripten_bind_PointCloud_num_attributes_0\"]=function(){return(_emscripten_bind_PointCloud_num_attributes_0=Module[\"_emscripten_bind_PointCloud_num_attributes_0\"]=Module[\"asm\"][\"M\"]).apply(null,arguments)};var _emscripten_bind_PointCloud_num_points_0=Module[\"_emscripten_bind_PointCloud_num_points_0\"]=function(){return(_emscripten_bind_PointCloud_num_points_0=Module[\"_emscripten_bind_PointCloud_num_points_0\"]=Module[\"asm\"][\"N\"]).apply(null,arguments)};var _emscripten_bind_PointCloud___destroy___0=Module[\"_emscripten_bind_PointCloud___destroy___0\"]=function(){return(_emscripten_bind_PointCloud___destroy___0=Module[\"_emscripten_bind_PointCloud___destroy___0\"]=Module[\"asm\"][\"O\"]).apply(null,arguments)};var _emscripten_bind_Mesh_Mesh_0=Module[\"_emscripten_bind_Mesh_Mesh_0\"]=function(){return(_emscripten_bind_Mesh_Mesh_0=Module[\"_emscripten_bind_Mesh_Mesh_0\"]=Module[\"asm\"][\"P\"]).apply(null,arguments)};var _emscripten_bind_Mesh_num_faces_0=Module[\"_emscripten_bind_Mesh_num_faces_0\"]=function(){return(_emscripten_bind_Mesh_num_faces_0=Module[\"_emscripten_bind_Mesh_num_faces_0\"]=Module[\"asm\"][\"Q\"]).apply(null,arguments)};var _emscripten_bind_Mesh_num_attributes_0=Module[\"_emscripten_bind_Mesh_num_attributes_0\"]=function(){return(_emscripten_bind_Mesh_num_attributes_0=Module[\"_emscripten_bind_Mesh_num_attributes_0\"]=Module[\"asm\"][\"R\"]).apply(null,arguments)};var _emscripten_bind_Mesh_num_points_0=Module[\"_emscripten_bind_Mesh_num_points_0\"]=function(){return(_emscripten_bind_Mesh_num_points_0=Module[\"_emscripten_bind_Mesh_num_points_0\"]=Module[\"asm\"][\"S\"]).apply(null,arguments)};var _emscripten_bind_Mesh___destroy___0=Module[\"_emscripten_bind_Mesh___destroy___0\"]=function(){return(_emscripten_bind_Mesh___destroy___0=Module[\"_emscripten_bind_Mesh___destroy___0\"]=Module[\"asm\"][\"T\"]).apply(null,arguments)};var _emscripten_bind_Metadata_Metadata_0=Module[\"_emscripten_bind_Metadata_Metadata_0\"]=function(){return(_emscripten_bind_Metadata_Metadata_0=Module[\"_emscripten_bind_Metadata_Metadata_0\"]=Module[\"asm\"][\"U\"]).apply(null,arguments)};var _emscripten_bind_Metadata___destroy___0=Module[\"_emscripten_bind_Metadata___destroy___0\"]=function(){return(_emscripten_bind_Metadata___destroy___0=Module[\"_emscripten_bind_Metadata___destroy___0\"]=Module[\"asm\"][\"V\"]).apply(null,arguments)};var _emscripten_bind_Status_code_0=Module[\"_emscripten_bind_Status_code_0\"]=function(){return(_emscripten_bind_Status_code_0=Module[\"_emscripten_bind_Status_code_0\"]=Module[\"asm\"][\"W\"]).apply(null,arguments)};var _emscripten_bind_Status_ok_0=Module[\"_emscripten_bind_Status_ok_0\"]=function(){return(_emscripten_bind_Status_ok_0=Module[\"_emscripten_bind_Status_ok_0\"]=Module[\"asm\"][\"X\"]).apply(null,arguments)};var _emscripten_bind_Status_error_msg_0=Module[\"_emscripten_bind_Status_error_msg_0\"]=function(){return(_emscripten_bind_Status_error_msg_0=Module[\"_emscripten_bind_Status_error_msg_0\"]=Module[\"asm\"][\"Y\"]).apply(null,arguments)};var _emscripten_bind_Status___destroy___0=Module[\"_emscripten_bind_Status___destroy___0\"]=function(){return(_emscripten_bind_Status___destroy___0=Module[\"_emscripten_bind_Status___destroy___0\"]=Module[\"asm\"][\"Z\"]).apply(null,arguments)};var _emscripten_bind_DracoFloat32Array_DracoFloat32Array_0=Module[\"_emscripten_bind_DracoFloat32Array_DracoFloat32Array_0\"]=function(){return(_emscripten_bind_DracoFloat32Array_DracoFloat32Array_0=Module[\"_emscripten_bind_DracoFloat32Array_DracoFloat32Array_0\"]=Module[\"asm\"][\"_\"]).apply(null,arguments)};var _emscripten_bind_DracoFloat32Array_GetValue_1=Module[\"_emscripten_bind_DracoFloat32Array_GetValue_1\"]=function(){return(_emscripten_bind_DracoFloat32Array_GetValue_1=Module[\"_emscripten_bind_DracoFloat32Array_GetValue_1\"]=Module[\"asm\"][\"$\"]).apply(null,arguments)};var _emscripten_bind_DracoFloat32Array_size_0=Module[\"_emscripten_bind_DracoFloat32Array_size_0\"]=function(){return(_emscripten_bind_DracoFloat32Array_size_0=Module[\"_emscripten_bind_DracoFloat32Array_size_0\"]=Module[\"asm\"][\"aa\"]).apply(null,arguments)};var _emscripten_bind_DracoFloat32Array___destroy___0=Module[\"_emscripten_bind_DracoFloat32Array___destroy___0\"]=function(){return(_emscripten_bind_DracoFloat32Array___destroy___0=Module[\"_emscripten_bind_DracoFloat32Array___destroy___0\"]=Module[\"asm\"][\"ba\"]).apply(null,arguments)};var _emscripten_bind_DracoInt8Array_DracoInt8Array_0=Module[\"_emscripten_bind_DracoInt8Array_DracoInt8Array_0\"]=function(){return(_emscripten_bind_DracoInt8Array_DracoInt8Array_0=Module[\"_emscripten_bind_DracoInt8Array_DracoInt8Array_0\"]=Module[\"asm\"][\"ca\"]).apply(null,arguments)};var _emscripten_bind_DracoInt8Array_GetValue_1=Module[\"_emscripten_bind_DracoInt8Array_GetValue_1\"]=function(){return(_emscripten_bind_DracoInt8Array_GetValue_1=Module[\"_emscripten_bind_DracoInt8Array_GetValue_1\"]=Module[\"asm\"][\"da\"]).apply(null,arguments)};var _emscripten_bind_DracoInt8Array_size_0=Module[\"_emscripten_bind_DracoInt8Array_size_0\"]=function(){return(_emscripten_bind_DracoInt8Array_size_0=Module[\"_emscripten_bind_DracoInt8Array_size_0\"]=Module[\"asm\"][\"ea\"]).apply(null,arguments)};var _emscripten_bind_DracoInt8Array___destroy___0=Module[\"_emscripten_bind_DracoInt8Array___destroy___0\"]=function(){return(_emscripten_bind_DracoInt8Array___destroy___0=Module[\"_emscripten_bind_DracoInt8Array___destroy___0\"]=Module[\"asm\"][\"fa\"]).apply(null,arguments)};var _emscripten_bind_DracoUInt8Array_DracoUInt8Array_0=Module[\"_emscripten_bind_DracoUInt8Array_DracoUInt8Array_0\"]=function(){return(_emscripten_bind_DracoUInt8Array_DracoUInt8Array_0=Module[\"_emscripten_bind_DracoUInt8Array_DracoUInt8Array_0\"]=Module[\"asm\"][\"ga\"]).apply(null,arguments)};var _emscripten_bind_DracoUInt8Array_GetValue_1=Module[\"_emscripten_bind_DracoUInt8Array_GetValue_1\"]=function(){return(_emscripten_bind_DracoUInt8Array_GetValue_1=Module[\"_emscripten_bind_DracoUInt8Array_GetValue_1\"]=Module[\"asm\"][\"ha\"]).apply(null,arguments)};var _emscripten_bind_DracoUInt8Array_size_0=Module[\"_emscripten_bind_DracoUInt8Array_size_0\"]=function(){return(_emscripten_bind_DracoUInt8Array_size_0=Module[\"_emscripten_bind_DracoUInt8Array_size_0\"]=Module[\"asm\"][\"ia\"]).apply(null,arguments)};var _emscripten_bind_DracoUInt8Array___destroy___0=Module[\"_emscripten_bind_DracoUInt8Array___destroy___0\"]=function(){return(_emscripten_bind_DracoUInt8Array___destroy___0=Module[\"_emscripten_bind_DracoUInt8Array___destroy___0\"]=Module[\"asm\"][\"ja\"]).apply(null,arguments)};var _emscripten_bind_DracoInt16Array_DracoInt16Array_0=Module[\"_emscripten_bind_DracoInt16Array_DracoInt16Array_0\"]=function(){return(_emscripten_bind_DracoInt16Array_DracoInt16Array_0=Module[\"_emscripten_bind_DracoInt16Array_DracoInt16Array_0\"]=Module[\"asm\"][\"ka\"]).apply(null,arguments)};var _emscripten_bind_DracoInt16Array_GetValue_1=Module[\"_emscripten_bind_DracoInt16Array_GetValue_1\"]=function(){return(_emscripten_bind_DracoInt16Array_GetValue_1=Module[\"_emscripten_bind_DracoInt16Array_GetValue_1\"]=Module[\"asm\"][\"la\"]).apply(null,arguments)};var _emscripten_bind_DracoInt16Array_size_0=Module[\"_emscripten_bind_DracoInt16Array_size_0\"]=function(){return(_emscripten_bind_DracoInt16Array_size_0=Module[\"_emscripten_bind_DracoInt16Array_size_0\"]=Module[\"asm\"][\"ma\"]).apply(null,arguments)};var _emscripten_bind_DracoInt16Array___destroy___0=Module[\"_emscripten_bind_DracoInt16Array___destroy___0\"]=function(){return(_emscripten_bind_DracoInt16Array___destroy___0=Module[\"_emscripten_bind_DracoInt16Array___destroy___0\"]=Module[\"asm\"][\"na\"]).apply(null,arguments)};var _emscripten_bind_DracoUInt16Array_DracoUInt16Array_0=Module[\"_emscripten_bind_DracoUInt16Array_DracoUInt16Array_0\"]=function(){return(_emscripten_bind_DracoUInt16Array_DracoUInt16Array_0=Module[\"_emscripten_bind_DracoUInt16Array_DracoUInt16Array_0\"]=Module[\"asm\"][\"oa\"]).apply(null,arguments)};var _emscripten_bind_DracoUInt16Array_GetValue_1=Module[\"_emscripten_bind_DracoUInt16Array_GetValue_1\"]=function(){return(_emscripten_bind_DracoUInt16Array_GetValue_1=Module[\"_emscripten_bind_DracoUInt16Array_GetValue_1\"]=Module[\"asm\"][\"pa\"]).apply(null,arguments)};var _emscripten_bind_DracoUInt16Array_size_0=Module[\"_emscripten_bind_DracoUInt16Array_size_0\"]=function(){return(_emscripten_bind_DracoUInt16Array_size_0=Module[\"_emscripten_bind_DracoUInt16Array_size_0\"]=Module[\"asm\"][\"qa\"]).apply(null,arguments)};var _emscripten_bind_DracoUInt16Array___destroy___0=Module[\"_emscripten_bind_DracoUInt16Array___destroy___0\"]=function(){return(_emscripten_bind_DracoUInt16Array___destroy___0=Module[\"_emscripten_bind_DracoUInt16Array___destroy___0\"]=Module[\"asm\"][\"ra\"]).apply(null,arguments)};var _emscripten_bind_DracoInt32Array_DracoInt32Array_0=Module[\"_emscripten_bind_DracoInt32Array_DracoInt32Array_0\"]=function(){return(_emscripten_bind_DracoInt32Array_DracoInt32Array_0=Module[\"_emscripten_bind_DracoInt32Array_DracoInt32Array_0\"]=Module[\"asm\"][\"sa\"]).apply(null,arguments)};var _emscripten_bind_DracoInt32Array_GetValue_1=Module[\"_emscripten_bind_DracoInt32Array_GetValue_1\"]=function(){return(_emscripten_bind_DracoInt32Array_GetValue_1=Module[\"_emscripten_bind_DracoInt32Array_GetValue_1\"]=Module[\"asm\"][\"ta\"]).apply(null,arguments)};var _emscripten_bind_DracoInt32Array_size_0=Module[\"_emscripten_bind_DracoInt32Array_size_0\"]=function(){return(_emscripten_bind_DracoInt32Array_size_0=Module[\"_emscripten_bind_DracoInt32Array_size_0\"]=Module[\"asm\"][\"ua\"]).apply(null,arguments)};var _emscripten_bind_DracoInt32Array___destroy___0=Module[\"_emscripten_bind_DracoInt32Array___destroy___0\"]=function(){return(_emscripten_bind_DracoInt32Array___destroy___0=Module[\"_emscripten_bind_DracoInt32Array___destroy___0\"]=Module[\"asm\"][\"va\"]).apply(null,arguments)};var _emscripten_bind_DracoUInt32Array_DracoUInt32Array_0=Module[\"_emscripten_bind_DracoUInt32Array_DracoUInt32Array_0\"]=function(){return(_emscripten_bind_DracoUInt32Array_DracoUInt32Array_0=Module[\"_emscripten_bind_DracoUInt32Array_DracoUInt32Array_0\"]=Module[\"asm\"][\"wa\"]).apply(null,arguments)};var _emscripten_bind_DracoUInt32Array_GetValue_1=Module[\"_emscripten_bind_DracoUInt32Array_GetValue_1\"]=function(){return(_emscripten_bind_DracoUInt32Array_GetValue_1=Module[\"_emscripten_bind_DracoUInt32Array_GetValue_1\"]=Module[\"asm\"][\"xa\"]).apply(null,arguments)};var _emscripten_bind_DracoUInt32Array_size_0=Module[\"_emscripten_bind_DracoUInt32Array_size_0\"]=function(){return(_emscripten_bind_DracoUInt32Array_size_0=Module[\"_emscripten_bind_DracoUInt32Array_size_0\"]=Module[\"asm\"][\"ya\"]).apply(null,arguments)};var _emscripten_bind_DracoUInt32Array___destroy___0=Module[\"_emscripten_bind_DracoUInt32Array___destroy___0\"]=function(){return(_emscripten_bind_DracoUInt32Array___destroy___0=Module[\"_emscripten_bind_DracoUInt32Array___destroy___0\"]=Module[\"asm\"][\"za\"]).apply(null,arguments)};var _emscripten_bind_MetadataQuerier_MetadataQuerier_0=Module[\"_emscripten_bind_MetadataQuerier_MetadataQuerier_0\"]=function(){return(_emscripten_bind_MetadataQuerier_MetadataQuerier_0=Module[\"_emscripten_bind_MetadataQuerier_MetadataQuerier_0\"]=Module[\"asm\"][\"Aa\"]).apply(null,arguments)};var _emscripten_bind_MetadataQuerier_HasEntry_2=Module[\"_emscripten_bind_MetadataQuerier_HasEntry_2\"]=function(){return(_emscripten_bind_MetadataQuerier_HasEntry_2=Module[\"_emscripten_bind_MetadataQuerier_HasEntry_2\"]=Module[\"asm\"][\"Ba\"]).apply(null,arguments)};var _emscripten_bind_MetadataQuerier_GetIntEntry_2=Module[\"_emscripten_bind_MetadataQuerier_GetIntEntry_2\"]=function(){return(_emscripten_bind_MetadataQuerier_GetIntEntry_2=Module[\"_emscripten_bind_MetadataQuerier_GetIntEntry_2\"]=Module[\"asm\"][\"Ca\"]).apply(null,arguments)};var _emscripten_bind_MetadataQuerier_GetIntEntryArray_3=Module[\"_emscripten_bind_MetadataQuerier_GetIntEntryArray_3\"]=function(){return(_emscripten_bind_MetadataQuerier_GetIntEntryArray_3=Module[\"_emscripten_bind_MetadataQuerier_GetIntEntryArray_3\"]=Module[\"asm\"][\"Da\"]).apply(null,arguments)};var _emscripten_bind_MetadataQuerier_GetDoubleEntry_2=Module[\"_emscripten_bind_MetadataQuerier_GetDoubleEntry_2\"]=function(){return(_emscripten_bind_MetadataQuerier_GetDoubleEntry_2=Module[\"_emscripten_bind_MetadataQuerier_GetDoubleEntry_2\"]=Module[\"asm\"][\"Ea\"]).apply(null,arguments)};var _emscripten_bind_MetadataQuerier_GetStringEntry_2=Module[\"_emscripten_bind_MetadataQuerier_GetStringEntry_2\"]=function(){return(_emscripten_bind_MetadataQuerier_GetStringEntry_2=Module[\"_emscripten_bind_MetadataQuerier_GetStringEntry_2\"]=Module[\"asm\"][\"Fa\"]).apply(null,arguments)};var _emscripten_bind_MetadataQuerier_NumEntries_1=Module[\"_emscripten_bind_MetadataQuerier_NumEntries_1\"]=function(){return(_emscripten_bind_MetadataQuerier_NumEntries_1=Module[\"_emscripten_bind_MetadataQuerier_NumEntries_1\"]=Module[\"asm\"][\"Ga\"]).apply(null,arguments)};var _emscripten_bind_MetadataQuerier_GetEntryName_2=Module[\"_emscripten_bind_MetadataQuerier_GetEntryName_2\"]=function(){return(_emscripten_bind_MetadataQuerier_GetEntryName_2=Module[\"_emscripten_bind_MetadataQuerier_GetEntryName_2\"]=Module[\"asm\"][\"Ha\"]).apply(null,arguments)};var _emscripten_bind_MetadataQuerier___destroy___0=Module[\"_emscripten_bind_MetadataQuerier___destroy___0\"]=function(){return(_emscripten_bind_MetadataQuerier___destroy___0=Module[\"_emscripten_bind_MetadataQuerier___destroy___0\"]=Module[\"asm\"][\"Ia\"]).apply(null,arguments)};var _emscripten_bind_Decoder_Decoder_0=Module[\"_emscripten_bind_Decoder_Decoder_0\"]=function(){return(_emscripten_bind_Decoder_Decoder_0=Module[\"_emscripten_bind_Decoder_Decoder_0\"]=Module[\"asm\"][\"Ja\"]).apply(null,arguments)};var _emscripten_bind_Decoder_DecodeArrayToPointCloud_3=Module[\"_emscripten_bind_Decoder_DecodeArrayToPointCloud_3\"]=function(){return(_emscripten_bind_Decoder_DecodeArrayToPointCloud_3=Module[\"_emscripten_bind_Decoder_DecodeArrayToPointCloud_3\"]=Module[\"asm\"][\"Ka\"]).apply(null,arguments)};var _emscripten_bind_Decoder_DecodeArrayToMesh_3=Module[\"_emscripten_bind_Decoder_DecodeArrayToMesh_3\"]=function(){return(_emscripten_bind_Decoder_DecodeArrayToMesh_3=Module[\"_emscripten_bind_Decoder_DecodeArrayToMesh_3\"]=Module[\"asm\"][\"La\"]).apply(null,arguments)};var _emscripten_bind_Decoder_GetAttributeId_2=Module[\"_emscripten_bind_Decoder_GetAttributeId_2\"]=function(){return(_emscripten_bind_Decoder_GetAttributeId_2=Module[\"_emscripten_bind_Decoder_GetAttributeId_2\"]=Module[\"asm\"][\"Ma\"]).apply(null,arguments)};var _emscripten_bind_Decoder_GetAttributeIdByName_2=Module[\"_emscripten_bind_Decoder_GetAttributeIdByName_2\"]=function(){return(_emscripten_bind_Decoder_GetAttributeIdByName_2=Module[\"_emscripten_bind_Decoder_GetAttributeIdByName_2\"]=Module[\"asm\"][\"Na\"]).apply(null,arguments)};var _emscripten_bind_Decoder_GetAttributeIdByMetadataEntry_3=Module[\"_emscripten_bind_Decoder_GetAttributeIdByMetadataEntry_3\"]=function(){return(_emscripten_bind_Decoder_GetAttributeIdByMetadataEntry_3=Module[\"_emscripten_bind_Decoder_GetAttributeIdByMetadataEntry_3\"]=Module[\"asm\"][\"Oa\"]).apply(null,arguments)};var _emscripten_bind_Decoder_GetAttribute_2=Module[\"_emscripten_bind_Decoder_GetAttribute_2\"]=function(){return(_emscripten_bind_Decoder_GetAttribute_2=Module[\"_emscripten_bind_Decoder_GetAttribute_2\"]=Module[\"asm\"][\"Pa\"]).apply(null,arguments)};var _emscripten_bind_Decoder_GetAttributeByUniqueId_2=Module[\"_emscripten_bind_Decoder_GetAttributeByUniqueId_2\"]=function(){return(_emscripten_bind_Decoder_GetAttributeByUniqueId_2=Module[\"_emscripten_bind_Decoder_GetAttributeByUniqueId_2\"]=Module[\"asm\"][\"Qa\"]).apply(null,arguments)};var _emscripten_bind_Decoder_GetMetadata_1=Module[\"_emscripten_bind_Decoder_GetMetadata_1\"]=function(){return(_emscripten_bind_Decoder_GetMetadata_1=Module[\"_emscripten_bind_Decoder_GetMetadata_1\"]=Module[\"asm\"][\"Ra\"]).apply(null,arguments)};var _emscripten_bind_Decoder_GetAttributeMetadata_2=Module[\"_emscripten_bind_Decoder_GetAttributeMetadata_2\"]=function(){return(_emscripten_bind_Decoder_GetAttributeMetadata_2=Module[\"_emscripten_bind_Decoder_GetAttributeMetadata_2\"]=Module[\"asm\"][\"Sa\"]).apply(null,arguments)};var _emscripten_bind_Decoder_GetFaceFromMesh_3=Module[\"_emscripten_bind_Decoder_GetFaceFromMesh_3\"]=function(){return(_emscripten_bind_Decoder_GetFaceFromMesh_3=Module[\"_emscripten_bind_Decoder_GetFaceFromMesh_3\"]=Module[\"asm\"][\"Ta\"]).apply(null,arguments)};var _emscripten_bind_Decoder_GetTriangleStripsFromMesh_2=Module[\"_emscripten_bind_Decoder_GetTriangleStripsFromMesh_2\"]=function(){return(_emscripten_bind_Decoder_GetTriangleStripsFromMesh_2=Module[\"_emscripten_bind_Decoder_GetTriangleStripsFromMesh_2\"]=Module[\"asm\"][\"Ua\"]).apply(null,arguments)};var _emscripten_bind_Decoder_GetTrianglesUInt16Array_3=Module[\"_emscripten_bind_Decoder_GetTrianglesUInt16Array_3\"]=function(){return(_emscripten_bind_Decoder_GetTrianglesUInt16Array_3=Module[\"_emscripten_bind_Decoder_GetTrianglesUInt16Array_3\"]=Module[\"asm\"][\"Va\"]).apply(null,arguments)};var _emscripten_bind_Decoder_GetTrianglesUInt32Array_3=Module[\"_emscripten_bind_Decoder_GetTrianglesUInt32Array_3\"]=function(){return(_emscripten_bind_Decoder_GetTrianglesUInt32Array_3=Module[\"_emscripten_bind_Decoder_GetTrianglesUInt32Array_3\"]=Module[\"asm\"][\"Wa\"]).apply(null,arguments)};var _emscripten_bind_Decoder_GetAttributeFloat_3=Module[\"_emscripten_bind_Decoder_GetAttributeFloat_3\"]=function(){return(_emscripten_bind_Decoder_GetAttributeFloat_3=Module[\"_emscripten_bind_Decoder_GetAttributeFloat_3\"]=Module[\"asm\"][\"Xa\"]).apply(null,arguments)};var _emscripten_bind_Decoder_GetAttributeFloatForAllPoints_3=Module[\"_emscripten_bind_Decoder_GetAttributeFloatForAllPoints_3\"]=function(){return(_emscripten_bind_Decoder_GetAttributeFloatForAllPoints_3=Module[\"_emscripten_bind_Decoder_GetAttributeFloatForAllPoints_3\"]=Module[\"asm\"][\"Ya\"]).apply(null,arguments)};var _emscripten_bind_Decoder_GetAttributeIntForAllPoints_3=Module[\"_emscripten_bind_Decoder_GetAttributeIntForAllPoints_3\"]=function(){return(_emscripten_bind_Decoder_GetAttributeIntForAllPoints_3=Module[\"_emscripten_bind_Decoder_GetAttributeIntForAllPoints_3\"]=Module[\"asm\"][\"Za\"]).apply(null,arguments)};var _emscripten_bind_Decoder_GetAttributeInt8ForAllPoints_3=Module[\"_emscripten_bind_Decoder_GetAttributeInt8ForAllPoints_3\"]=function(){return(_emscripten_bind_Decoder_GetAttributeInt8ForAllPoints_3=Module[\"_emscripten_bind_Decoder_GetAttributeInt8ForAllPoints_3\"]=Module[\"asm\"][\"_a\"]).apply(null,arguments)};var _emscripten_bind_Decoder_GetAttributeUInt8ForAllPoints_3=Module[\"_emscripten_bind_Decoder_GetAttributeUInt8ForAllPoints_3\"]=function(){return(_emscripten_bind_Decoder_GetAttributeUInt8ForAllPoints_3=Module[\"_emscripten_bind_Decoder_GetAttributeUInt8ForAllPoints_3\"]=Module[\"asm\"][\"$a\"]).apply(null,arguments)};var _emscripten_bind_Decoder_GetAttributeInt16ForAllPoints_3=Module[\"_emscripten_bind_Decoder_GetAttributeInt16ForAllPoints_3\"]=function(){return(_emscripten_bind_Decoder_GetAttributeInt16ForAllPoints_3=Module[\"_emscripten_bind_Decoder_GetAttributeInt16ForAllPoints_3\"]=Module[\"asm\"][\"ab\"]).apply(null,arguments)};var _emscripten_bind_Decoder_GetAttributeUInt16ForAllPoints_3=Module[\"_emscripten_bind_Decoder_GetAttributeUInt16ForAllPoints_3\"]=function(){return(_emscripten_bind_Decoder_GetAttributeUInt16ForAllPoints_3=Module[\"_emscripten_bind_Decoder_GetAttributeUInt16ForAllPoints_3\"]=Module[\"asm\"][\"bb\"]).apply(null,arguments)};var _emscripten_bind_Decoder_GetAttributeInt32ForAllPoints_3=Module[\"_emscripten_bind_Decoder_GetAttributeInt32ForAllPoints_3\"]=function(){return(_emscripten_bind_Decoder_GetAttributeInt32ForAllPoints_3=Module[\"_emscripten_bind_Decoder_GetAttributeInt32ForAllPoints_3\"]=Module[\"asm\"][\"cb\"]).apply(null,arguments)};var _emscripten_bind_Decoder_GetAttributeUInt32ForAllPoints_3=Module[\"_emscripten_bind_Decoder_GetAttributeUInt32ForAllPoints_3\"]=function(){return(_emscripten_bind_Decoder_GetAttributeUInt32ForAllPoints_3=Module[\"_emscripten_bind_Decoder_GetAttributeUInt32ForAllPoints_3\"]=Module[\"asm\"][\"db\"]).apply(null,arguments)};var _emscripten_bind_Decoder_GetAttributeDataArrayForAllPoints_5=Module[\"_emscripten_bind_Decoder_GetAttributeDataArrayForAllPoints_5\"]=function(){return(_emscripten_bind_Decoder_GetAttributeDataArrayForAllPoints_5=Module[\"_emscripten_bind_Decoder_GetAttributeDataArrayForAllPoints_5\"]=Module[\"asm\"][\"eb\"]).apply(null,arguments)};var _emscripten_bind_Decoder_SkipAttributeTransform_1=Module[\"_emscripten_bind_Decoder_SkipAttributeTransform_1\"]=function(){return(_emscripten_bind_Decoder_SkipAttributeTransform_1=Module[\"_emscripten_bind_Decoder_SkipAttributeTransform_1\"]=Module[\"asm\"][\"fb\"]).apply(null,arguments)};var _emscripten_bind_Decoder_GetEncodedGeometryType_Deprecated_1=Module[\"_emscripten_bind_Decoder_GetEncodedGeometryType_Deprecated_1\"]=function(){return(_emscripten_bind_Decoder_GetEncodedGeometryType_Deprecated_1=Module[\"_emscripten_bind_Decoder_GetEncodedGeometryType_Deprecated_1\"]=Module[\"asm\"][\"gb\"]).apply(null,arguments)};var _emscripten_bind_Decoder_DecodeBufferToPointCloud_2=Module[\"_emscripten_bind_Decoder_DecodeBufferToPointCloud_2\"]=function(){return(_emscripten_bind_Decoder_DecodeBufferToPointCloud_2=Module[\"_emscripten_bind_Decoder_DecodeBufferToPointCloud_2\"]=Module[\"asm\"][\"hb\"]).apply(null,arguments)};var _emscripten_bind_Decoder_DecodeBufferToMesh_2=Module[\"_emscripten_bind_Decoder_DecodeBufferToMesh_2\"]=function(){return(_emscripten_bind_Decoder_DecodeBufferToMesh_2=Module[\"_emscripten_bind_Decoder_DecodeBufferToMesh_2\"]=Module[\"asm\"][\"ib\"]).apply(null,arguments)};var _emscripten_bind_Decoder___destroy___0=Module[\"_emscripten_bind_Decoder___destroy___0\"]=function(){return(_emscripten_bind_Decoder___destroy___0=Module[\"_emscripten_bind_Decoder___destroy___0\"]=Module[\"asm\"][\"jb\"]).apply(null,arguments)};var _emscripten_enum_draco_AttributeTransformType_ATTRIBUTE_INVALID_TRANSFORM=Module[\"_emscripten_enum_draco_AttributeTransformType_ATTRIBUTE_INVALID_TRANSFORM\"]=function(){return(_emscripten_enum_draco_AttributeTransformType_ATTRIBUTE_INVALID_TRANSFORM=Module[\"_emscripten_enum_draco_AttributeTransformType_ATTRIBUTE_INVALID_TRANSFORM\"]=Module[\"asm\"][\"kb\"]).apply(null,arguments)};var _emscripten_enum_draco_AttributeTransformType_ATTRIBUTE_NO_TRANSFORM=Module[\"_emscripten_enum_draco_AttributeTransformType_ATTRIBUTE_NO_TRANSFORM\"]=function(){return(_emscripten_enum_draco_AttributeTransformType_ATTRIBUTE_NO_TRANSFORM=Module[\"_emscripten_enum_draco_AttributeTransformType_ATTRIBUTE_NO_TRANSFORM\"]=Module[\"asm\"][\"lb\"]).apply(null,arguments)};var _emscripten_enum_draco_AttributeTransformType_ATTRIBUTE_QUANTIZATION_TRANSFORM=Module[\"_emscripten_enum_draco_AttributeTransformType_ATTRIBUTE_QUANTIZATION_TRANSFORM\"]=function(){return(_emscripten_enum_draco_AttributeTransformType_ATTRIBUTE_QUANTIZATION_TRANSFORM=Module[\"_emscripten_enum_draco_AttributeTransformType_ATTRIBUTE_QUANTIZATION_TRANSFORM\"]=Module[\"asm\"][\"mb\"]).apply(null,arguments)};var _emscripten_enum_draco_AttributeTransformType_ATTRIBUTE_OCTAHEDRON_TRANSFORM=Module[\"_emscripten_enum_draco_AttributeTransformType_ATTRIBUTE_OCTAHEDRON_TRANSFORM\"]=function(){return(_emscripten_enum_draco_AttributeTransformType_ATTRIBUTE_OCTAHEDRON_TRANSFORM=Module[\"_emscripten_enum_draco_AttributeTransformType_ATTRIBUTE_OCTAHEDRON_TRANSFORM\"]=Module[\"asm\"][\"nb\"]).apply(null,arguments)};var _emscripten_enum_draco_GeometryAttribute_Type_INVALID=Module[\"_emscripten_enum_draco_GeometryAttribute_Type_INVALID\"]=function(){return(_emscripten_enum_draco_GeometryAttribute_Type_INVALID=Module[\"_emscripten_enum_draco_GeometryAttribute_Type_INVALID\"]=Module[\"asm\"][\"ob\"]).apply(null,arguments)};var _emscripten_enum_draco_GeometryAttribute_Type_POSITION=Module[\"_emscripten_enum_draco_GeometryAttribute_Type_POSITION\"]=function(){return(_emscripten_enum_draco_GeometryAttribute_Type_POSITION=Module[\"_emscripten_enum_draco_GeometryAttribute_Type_POSITION\"]=Module[\"asm\"][\"pb\"]).apply(null,arguments)};var _emscripten_enum_draco_GeometryAttribute_Type_NORMAL=Module[\"_emscripten_enum_draco_GeometryAttribute_Type_NORMAL\"]=function(){return(_emscripten_enum_draco_GeometryAttribute_Type_NORMAL=Module[\"_emscripten_enum_draco_GeometryAttribute_Type_NORMAL\"]=Module[\"asm\"][\"qb\"]).apply(null,arguments)};var _emscripten_enum_draco_GeometryAttribute_Type_COLOR=Module[\"_emscripten_enum_draco_GeometryAttribute_Type_COLOR\"]=function(){return(_emscripten_enum_draco_GeometryAttribute_Type_COLOR=Module[\"_emscripten_enum_draco_GeometryAttribute_Type_COLOR\"]=Module[\"asm\"][\"rb\"]).apply(null,arguments)};var _emscripten_enum_draco_GeometryAttribute_Type_TEX_COORD=Module[\"_emscripten_enum_draco_GeometryAttribute_Type_TEX_COORD\"]=function(){return(_emscripten_enum_draco_GeometryAttribute_Type_TEX_COORD=Module[\"_emscripten_enum_draco_GeometryAttribute_Type_TEX_COORD\"]=Module[\"asm\"][\"sb\"]).apply(null,arguments)};var _emscripten_enum_draco_GeometryAttribute_Type_GENERIC=Module[\"_emscripten_enum_draco_GeometryAttribute_Type_GENERIC\"]=function(){return(_emscripten_enum_draco_GeometryAttribute_Type_GENERIC=Module[\"_emscripten_enum_draco_GeometryAttribute_Type_GENERIC\"]=Module[\"asm\"][\"tb\"]).apply(null,arguments)};var _emscripten_enum_draco_EncodedGeometryType_INVALID_GEOMETRY_TYPE=Module[\"_emscripten_enum_draco_EncodedGeometryType_INVALID_GEOMETRY_TYPE\"]=function(){return(_emscripten_enum_draco_EncodedGeometryType_INVALID_GEOMETRY_TYPE=Module[\"_emscripten_enum_draco_EncodedGeometryType_INVALID_GEOMETRY_TYPE\"]=Module[\"asm\"][\"ub\"]).apply(null,arguments)};var _emscripten_enum_draco_EncodedGeometryType_POINT_CLOUD=Module[\"_emscripten_enum_draco_EncodedGeometryType_POINT_CLOUD\"]=function(){return(_emscripten_enum_draco_EncodedGeometryType_POINT_CLOUD=Module[\"_emscripten_enum_draco_EncodedGeometryType_POINT_CLOUD\"]=Module[\"asm\"][\"vb\"]).apply(null,arguments)};var _emscripten_enum_draco_EncodedGeometryType_TRIANGULAR_MESH=Module[\"_emscripten_enum_draco_EncodedGeometryType_TRIANGULAR_MESH\"]=function(){return(_emscripten_enum_draco_EncodedGeometryType_TRIANGULAR_MESH=Module[\"_emscripten_enum_draco_EncodedGeometryType_TRIANGULAR_MESH\"]=Module[\"asm\"][\"wb\"]).apply(null,arguments)};var _emscripten_enum_draco_DataType_DT_INVALID=Module[\"_emscripten_enum_draco_DataType_DT_INVALID\"]=function(){return(_emscripten_enum_draco_DataType_DT_INVALID=Module[\"_emscripten_enum_draco_DataType_DT_INVALID\"]=Module[\"asm\"][\"xb\"]).apply(null,arguments)};var _emscripten_enum_draco_DataType_DT_INT8=Module[\"_emscripten_enum_draco_DataType_DT_INT8\"]=function(){return(_emscripten_enum_draco_DataType_DT_INT8=Module[\"_emscripten_enum_draco_DataType_DT_INT8\"]=Module[\"asm\"][\"yb\"]).apply(null,arguments)};var _emscripten_enum_draco_DataType_DT_UINT8=Module[\"_emscripten_enum_draco_DataType_DT_UINT8\"]=function(){return(_emscripten_enum_draco_DataType_DT_UINT8=Module[\"_emscripten_enum_draco_DataType_DT_UINT8\"]=Module[\"asm\"][\"zb\"]).apply(null,arguments)};var _emscripten_enum_draco_DataType_DT_INT16=Module[\"_emscripten_enum_draco_DataType_DT_INT16\"]=function(){return(_emscripten_enum_draco_DataType_DT_INT16=Module[\"_emscripten_enum_draco_DataType_DT_INT16\"]=Module[\"asm\"][\"Ab\"]).apply(null,arguments)};var _emscripten_enum_draco_DataType_DT_UINT16=Module[\"_emscripten_enum_draco_DataType_DT_UINT16\"]=function(){return(_emscripten_enum_draco_DataType_DT_UINT16=Module[\"_emscripten_enum_draco_DataType_DT_UINT16\"]=Module[\"asm\"][\"Bb\"]).apply(null,arguments)};var _emscripten_enum_draco_DataType_DT_INT32=Module[\"_emscripten_enum_draco_DataType_DT_INT32\"]=function(){return(_emscripten_enum_draco_DataType_DT_INT32=Module[\"_emscripten_enum_draco_DataType_DT_INT32\"]=Module[\"asm\"][\"Cb\"]).apply(null,arguments)};var _emscripten_enum_draco_DataType_DT_UINT32=Module[\"_emscripten_enum_draco_DataType_DT_UINT32\"]=function(){return(_emscripten_enum_draco_DataType_DT_UINT32=Module[\"_emscripten_enum_draco_DataType_DT_UINT32\"]=Module[\"asm\"][\"Db\"]).apply(null,arguments)};var _emscripten_enum_draco_DataType_DT_INT64=Module[\"_emscripten_enum_draco_DataType_DT_INT64\"]=function(){return(_emscripten_enum_draco_DataType_DT_INT64=Module[\"_emscripten_enum_draco_DataType_DT_INT64\"]=Module[\"asm\"][\"Eb\"]).apply(null,arguments)};var _emscripten_enum_draco_DataType_DT_UINT64=Module[\"_emscripten_enum_draco_DataType_DT_UINT64\"]=function(){return(_emscripten_enum_draco_DataType_DT_UINT64=Module[\"_emscripten_enum_draco_DataType_DT_UINT64\"]=Module[\"asm\"][\"Fb\"]).apply(null,arguments)};var _emscripten_enum_draco_DataType_DT_FLOAT32=Module[\"_emscripten_enum_draco_DataType_DT_FLOAT32\"]=function(){return(_emscripten_enum_draco_DataType_DT_FLOAT32=Module[\"_emscripten_enum_draco_DataType_DT_FLOAT32\"]=Module[\"asm\"][\"Gb\"]).apply(null,arguments)};var _emscripten_enum_draco_DataType_DT_FLOAT64=Module[\"_emscripten_enum_draco_DataType_DT_FLOAT64\"]=function(){return(_emscripten_enum_draco_DataType_DT_FLOAT64=Module[\"_emscripten_enum_draco_DataType_DT_FLOAT64\"]=Module[\"asm\"][\"Hb\"]).apply(null,arguments)};var _emscripten_enum_draco_DataType_DT_BOOL=Module[\"_emscripten_enum_draco_DataType_DT_BOOL\"]=function(){return(_emscripten_enum_draco_DataType_DT_BOOL=Module[\"_emscripten_enum_draco_DataType_DT_BOOL\"]=Module[\"asm\"][\"Ib\"]).apply(null,arguments)};var _emscripten_enum_draco_DataType_DT_TYPES_COUNT=Module[\"_emscripten_enum_draco_DataType_DT_TYPES_COUNT\"]=function(){return(_emscripten_enum_draco_DataType_DT_TYPES_COUNT=Module[\"_emscripten_enum_draco_DataType_DT_TYPES_COUNT\"]=Module[\"asm\"][\"Jb\"]).apply(null,arguments)};var _emscripten_enum_draco_StatusCode_OK=Module[\"_emscripten_enum_draco_StatusCode_OK\"]=function(){return(_emscripten_enum_draco_StatusCode_OK=Module[\"_emscripten_enum_draco_StatusCode_OK\"]=Module[\"asm\"][\"Kb\"]).apply(null,arguments)};var _emscripten_enum_draco_StatusCode_DRACO_ERROR=Module[\"_emscripten_enum_draco_StatusCode_DRACO_ERROR\"]=function(){return(_emscripten_enum_draco_StatusCode_DRACO_ERROR=Module[\"_emscripten_enum_draco_StatusCode_DRACO_ERROR\"]=Module[\"asm\"][\"Lb\"]).apply(null,arguments)};var _emscripten_enum_draco_StatusCode_IO_ERROR=Module[\"_emscripten_enum_draco_StatusCode_IO_ERROR\"]=function(){return(_emscripten_enum_draco_StatusCode_IO_ERROR=Module[\"_emscripten_enum_draco_StatusCode_IO_ERROR\"]=Module[\"asm\"][\"Mb\"]).apply(null,arguments)};var _emscripten_enum_draco_StatusCode_INVALID_PARAMETER=Module[\"_emscripten_enum_draco_StatusCode_INVALID_PARAMETER\"]=function(){return(_emscripten_enum_draco_StatusCode_INVALID_PARAMETER=Module[\"_emscripten_enum_draco_StatusCode_INVALID_PARAMETER\"]=Module[\"asm\"][\"Nb\"]).apply(null,arguments)};var _emscripten_enum_draco_StatusCode_UNSUPPORTED_VERSION=Module[\"_emscripten_enum_draco_StatusCode_UNSUPPORTED_VERSION\"]=function(){return(_emscripten_enum_draco_StatusCode_UNSUPPORTED_VERSION=Module[\"_emscripten_enum_draco_StatusCode_UNSUPPORTED_VERSION\"]=Module[\"asm\"][\"Ob\"]).apply(null,arguments)};var _emscripten_enum_draco_StatusCode_UNKNOWN_VERSION=Module[\"_emscripten_enum_draco_StatusCode_UNKNOWN_VERSION\"]=function(){return(_emscripten_enum_draco_StatusCode_UNKNOWN_VERSION=Module[\"_emscripten_enum_draco_StatusCode_UNKNOWN_VERSION\"]=Module[\"asm\"][\"Pb\"]).apply(null,arguments)};var ___errno_location=function(){return(___errno_location=Module[\"asm\"][\"__errno_location\"]).apply(null,arguments)};var _malloc=Module[\"_malloc\"]=function(){return(_malloc=Module[\"_malloc\"]=Module[\"asm\"][\"Qb\"]).apply(null,arguments)};var _free=Module[\"_free\"]=function(){return(_free=Module[\"_free\"]=Module[\"asm\"][\"Rb\"]).apply(null,arguments)};var ___cxa_is_pointer_type=function(){return(___cxa_is_pointer_type=Module[\"asm\"][\"Sb\"]).apply(null,arguments)};var ___start_em_js=Module[\"___start_em_js\"]=11660;var ___stop_em_js=Module[\"___stop_em_js\"]=11758;var calledRun;dependenciesFulfilled=function runCaller(){if(!calledRun)run();if(!calledRun)dependenciesFulfilled=runCaller};function run(){if(runDependencies>0){return}preRun();if(runDependencies>0){return}function doRun(){if(calledRun)return;calledRun=true;Module[\"calledRun\"]=true;if(ABORT)return;initRuntime();readyPromiseResolve(Module);if(Module[\"onRuntimeInitialized\"])Module[\"onRuntimeInitialized\"]();postRun()}if(Module[\"setStatus\"]){Module[\"setStatus\"](\"Running...\");setTimeout(function(){setTimeout(function(){Module[\"setStatus\"](\"\")},1);doRun()},1)}else{doRun()}}if(Module[\"preInit\"]){if(typeof Module[\"preInit\"]==\"function\")Module[\"preInit\"]=[Module[\"preInit\"]];while(Module[\"preInit\"].length>0){Module[\"preInit\"].pop()()}}run();function WrapperObject(){}WrapperObject.prototype=Object.create(WrapperObject.prototype);WrapperObject.prototype.constructor=WrapperObject;WrapperObject.prototype.__class__=WrapperObject;WrapperObject.__cache__={};Module[\"WrapperObject\"]=WrapperObject;function getCache(__class__){return(__class__||WrapperObject).__cache__}Module[\"getCache\"]=getCache;function wrapPointer(ptr,__class__){var cache=getCache(__class__);var ret=cache[ptr];if(ret)return ret;ret=Object.create((__class__||WrapperObject).prototype);ret.ptr=ptr;return cache[ptr]=ret}Module[\"wrapPointer\"]=wrapPointer;function castObject(obj,__class__){return wrapPointer(obj.ptr,__class__)}Module[\"castObject\"]=castObject;Module[\"NULL\"]=wrapPointer(0);function destroy(obj){if(!obj[\"__destroy__\"])throw\"Error: Cannot destroy object. (Did you create it yourself?)\";obj[\"__destroy__\"]();delete getCache(obj.__class__)[obj.ptr]}Module[\"destroy\"]=destroy;function compare(obj1,obj2){return obj1.ptr===obj2.ptr}Module[\"compare\"]=compare;function getPointer(obj){return obj.ptr}Module[\"getPointer\"]=getPointer;function getClass(obj){return obj.__class__}Module[\"getClass\"]=getClass;var ensureCache={buffer:0,size:0,pos:0,temps:[],needed:0,prepare:function(){if(ensureCache.needed){for(var i=0;i<ensureCache.temps.length;i++){Module[\"_free\"](ensureCache.temps[i])}ensureCache.temps.length=0;Module[\"_free\"](ensureCache.buffer);ensureCache.buffer=0;ensureCache.size+=ensureCache.needed;ensureCache.needed=0}if(!ensureCache.buffer){ensureCache.size+=128;ensureCache.buffer=Module[\"_malloc\"](ensureCache.size);assert(ensureCache.buffer)}ensureCache.pos=0},alloc:function(array,view){assert(ensureCache.buffer);var bytes=view.BYTES_PER_ELEMENT;var len=array.length*bytes;len=len+7&-8;var ret;if(ensureCache.pos+len>=ensureCache.size){assert(len>0);ensureCache.needed+=len;ret=Module[\"_malloc\"](len);ensureCache.temps.push(ret)}else{ret=ensureCache.buffer+ensureCache.pos;ensureCache.pos+=len}return ret},copy:function(array,view,offset){offset>>>=0;var bytes=view.BYTES_PER_ELEMENT;switch(bytes){case 2:offset>>>=1;break;case 4:offset>>>=2;break;case 8:offset>>>=3;break}for(var i=0;i<array.length;i++){view[offset+i]=array[i]}}};function ensureString(value){if(typeof value===\"string\"){var intArray=intArrayFromString(value);var offset=ensureCache.alloc(intArray,HEAP8);ensureCache.copy(intArray,HEAP8,offset);return offset}return value}function ensureInt8(value){if(typeof value===\"object\"){var offset=ensureCache.alloc(value,HEAP8);ensureCache.copy(value,HEAP8,offset);return offset}return value}function VoidPtr(){throw\"cannot construct a VoidPtr, no constructor in IDL\"}VoidPtr.prototype=Object.create(WrapperObject.prototype);VoidPtr.prototype.constructor=VoidPtr;VoidPtr.prototype.__class__=VoidPtr;VoidPtr.__cache__={};Module[\"VoidPtr\"]=VoidPtr;VoidPtr.prototype[\"__destroy__\"]=VoidPtr.prototype.__destroy__=function(){var self=this.ptr;_emscripten_bind_VoidPtr___destroy___0(self)};function DecoderBuffer(){this.ptr=_emscripten_bind_DecoderBuffer_DecoderBuffer_0();getCache(DecoderBuffer)[this.ptr]=this}DecoderBuffer.prototype=Object.create(WrapperObject.prototype);DecoderBuffer.prototype.constructor=DecoderBuffer;DecoderBuffer.prototype.__class__=DecoderBuffer;DecoderBuffer.__cache__={};Module[\"DecoderBuffer\"]=DecoderBuffer;DecoderBuffer.prototype[\"Init\"]=DecoderBuffer.prototype.Init=function(data,data_size){var self=this.ptr;ensureCache.prepare();if(typeof data==\"object\"){data=ensureInt8(data)}if(data_size&&typeof data_size===\"object\")data_size=data_size.ptr;_emscripten_bind_DecoderBuffer_Init_2(self,data,data_size)};DecoderBuffer.prototype[\"__destroy__\"]=DecoderBuffer.prototype.__destroy__=function(){var self=this.ptr;_emscripten_bind_DecoderBuffer___destroy___0(self)};function AttributeTransformData(){this.ptr=_emscripten_bind_AttributeTransformData_AttributeTransformData_0();getCache(AttributeTransformData)[this.ptr]=this}AttributeTransformData.prototype=Object.create(WrapperObject.prototype);AttributeTransformData.prototype.constructor=AttributeTransformData;AttributeTransformData.prototype.__class__=AttributeTransformData;AttributeTransformData.__cache__={};Module[\"AttributeTransformData\"]=AttributeTransformData;AttributeTransformData.prototype[\"transform_type\"]=AttributeTransformData.prototype.transform_type=function(){var self=this.ptr;return _emscripten_bind_AttributeTransformData_transform_type_0(self)};AttributeTransformData.prototype[\"__destroy__\"]=AttributeTransformData.prototype.__destroy__=function(){var self=this.ptr;_emscripten_bind_AttributeTransformData___destroy___0(self)};function GeometryAttribute(){this.ptr=_emscripten_bind_GeometryAttribute_GeometryAttribute_0();getCache(GeometryAttribute)[this.ptr]=this}GeometryAttribute.prototype=Object.create(WrapperObject.prototype);GeometryAttribute.prototype.constructor=GeometryAttribute;GeometryAttribute.prototype.__class__=GeometryAttribute;GeometryAttribute.__cache__={};Module[\"GeometryAttribute\"]=GeometryAttribute;GeometryAttribute.prototype[\"__destroy__\"]=GeometryAttribute.prototype.__destroy__=function(){var self=this.ptr;_emscripten_bind_GeometryAttribute___destroy___0(self)};function PointAttribute(){this.ptr=_emscripten_bind_PointAttribute_PointAttribute_0();getCache(PointAttribute)[this.ptr]=this}PointAttribute.prototype=Object.create(WrapperObject.prototype);PointAttribute.prototype.constructor=PointAttribute;PointAttribute.prototype.__class__=PointAttribute;PointAttribute.__cache__={};Module[\"PointAttribute\"]=PointAttribute;PointAttribute.prototype[\"size\"]=PointAttribute.prototype.size=function(){var self=this.ptr;return _emscripten_bind_PointAttribute_size_0(self)};PointAttribute.prototype[\"GetAttributeTransformData\"]=PointAttribute.prototype.GetAttributeTransformData=function(){var self=this.ptr;return wrapPointer(_emscripten_bind_PointAttribute_GetAttributeTransformData_0(self),AttributeTransformData)};PointAttribute.prototype[\"attribute_type\"]=PointAttribute.prototype.attribute_type=function(){var self=this.ptr;return _emscripten_bind_PointAttribute_attribute_type_0(self)};PointAttribute.prototype[\"data_type\"]=PointAttribute.prototype.data_type=function(){var self=this.ptr;return _emscripten_bind_PointAttribute_data_type_0(self)};PointAttribute.prototype[\"num_components\"]=PointAttribute.prototype.num_components=function(){var self=this.ptr;return _emscripten_bind_PointAttribute_num_components_0(self)};PointAttribute.prototype[\"normalized\"]=PointAttribute.prototype.normalized=function(){var self=this.ptr;return!!_emscripten_bind_PointAttribute_normalized_0(self)};PointAttribute.prototype[\"byte_stride\"]=PointAttribute.prototype.byte_stride=function(){var self=this.ptr;return _emscripten_bind_PointAttribute_byte_stride_0(self)};PointAttribute.prototype[\"byte_offset\"]=PointAttribute.prototype.byte_offset=function(){var self=this.ptr;return _emscripten_bind_PointAttribute_byte_offset_0(self)};PointAttribute.prototype[\"unique_id\"]=PointAttribute.prototype.unique_id=function(){var self=this.ptr;return _emscripten_bind_PointAttribute_unique_id_0(self)};PointAttribute.prototype[\"__destroy__\"]=PointAttribute.prototype.__destroy__=function(){var self=this.ptr;_emscripten_bind_PointAttribute___destroy___0(self)};function AttributeQuantizationTransform(){this.ptr=_emscripten_bind_AttributeQuantizationTransform_AttributeQuantizationTransform_0();getCache(AttributeQuantizationTransform)[this.ptr]=this}AttributeQuantizationTransform.prototype=Object.create(WrapperObject.prototype);AttributeQuantizationTransform.prototype.constructor=AttributeQuantizationTransform;AttributeQuantizationTransform.prototype.__class__=AttributeQuantizationTransform;AttributeQuantizationTransform.__cache__={};Module[\"AttributeQuantizationTransform\"]=AttributeQuantizationTransform;AttributeQuantizationTransform.prototype[\"InitFromAttribute\"]=AttributeQuantizationTransform.prototype.InitFromAttribute=function(att){var self=this.ptr;if(att&&typeof att===\"object\")att=att.ptr;return!!_emscripten_bind_AttributeQuantizationTransform_InitFromAttribute_1(self,att)};AttributeQuantizationTransform.prototype[\"quantization_bits\"]=AttributeQuantizationTransform.prototype.quantization_bits=function(){var self=this.ptr;return _emscripten_bind_AttributeQuantizationTransform_quantization_bits_0(self)};AttributeQuantizationTransform.prototype[\"min_value\"]=AttributeQuantizationTransform.prototype.min_value=function(axis){var self=this.ptr;if(axis&&typeof axis===\"object\")axis=axis.ptr;return _emscripten_bind_AttributeQuantizationTransform_min_value_1(self,axis)};AttributeQuantizationTransform.prototype[\"range\"]=AttributeQuantizationTransform.prototype.range=function(){var self=this.ptr;return _emscripten_bind_AttributeQuantizationTransform_range_0(self)};AttributeQuantizationTransform.prototype[\"__destroy__\"]=AttributeQuantizationTransform.prototype.__destroy__=function(){var self=this.ptr;_emscripten_bind_AttributeQuantizationTransform___destroy___0(self)};function AttributeOctahedronTransform(){this.ptr=_emscripten_bind_AttributeOctahedronTransform_AttributeOctahedronTransform_0();getCache(AttributeOctahedronTransform)[this.ptr]=this}AttributeOctahedronTransform.prototype=Object.create(WrapperObject.prototype);AttributeOctahedronTransform.prototype.constructor=AttributeOctahedronTransform;AttributeOctahedronTransform.prototype.__class__=AttributeOctahedronTransform;AttributeOctahedronTransform.__cache__={};Module[\"AttributeOctahedronTransform\"]=AttributeOctahedronTransform;AttributeOctahedronTransform.prototype[\"InitFromAttribute\"]=AttributeOctahedronTransform.prototype.InitFromAttribute=function(att){var self=this.ptr;if(att&&typeof att===\"object\")att=att.ptr;return!!_emscripten_bind_AttributeOctahedronTransform_InitFromAttribute_1(self,att)};AttributeOctahedronTransform.prototype[\"quantization_bits\"]=AttributeOctahedronTransform.prototype.quantization_bits=function(){var self=this.ptr;return _emscripten_bind_AttributeOctahedronTransform_quantization_bits_0(self)};AttributeOctahedronTransform.prototype[\"__destroy__\"]=AttributeOctahedronTransform.prototype.__destroy__=function(){var self=this.ptr;_emscripten_bind_AttributeOctahedronTransform___destroy___0(self)};function PointCloud(){this.ptr=_emscripten_bind_PointCloud_PointCloud_0();getCache(PointCloud)[this.ptr]=this}PointCloud.prototype=Object.create(WrapperObject.prototype);PointCloud.prototype.constructor=PointCloud;PointCloud.prototype.__class__=PointCloud;PointCloud.__cache__={};Module[\"PointCloud\"]=PointCloud;PointCloud.prototype[\"num_attributes\"]=PointCloud.prototype.num_attributes=function(){var self=this.ptr;return _emscripten_bind_PointCloud_num_attributes_0(self)};PointCloud.prototype[\"num_points\"]=PointCloud.prototype.num_points=function(){var self=this.ptr;return _emscripten_bind_PointCloud_num_points_0(self)};PointCloud.prototype[\"__destroy__\"]=PointCloud.prototype.__destroy__=function(){var self=this.ptr;_emscripten_bind_PointCloud___destroy___0(self)};function Mesh(){this.ptr=_emscripten_bind_Mesh_Mesh_0();getCache(Mesh)[this.ptr]=this}Mesh.prototype=Object.create(WrapperObject.prototype);Mesh.prototype.constructor=Mesh;Mesh.prototype.__class__=Mesh;Mesh.__cache__={};Module[\"Mesh\"]=Mesh;Mesh.prototype[\"num_faces\"]=Mesh.prototype.num_faces=function(){var self=this.ptr;return _emscripten_bind_Mesh_num_faces_0(self)};Mesh.prototype[\"num_attributes\"]=Mesh.prototype.num_attributes=function(){var self=this.ptr;return _emscripten_bind_Mesh_num_attributes_0(self)};Mesh.prototype[\"num_points\"]=Mesh.prototype.num_points=function(){var self=this.ptr;return _emscripten_bind_Mesh_num_points_0(self)};Mesh.prototype[\"__destroy__\"]=Mesh.prototype.__destroy__=function(){var self=this.ptr;_emscripten_bind_Mesh___destroy___0(self)};function Metadata(){this.ptr=_emscripten_bind_Metadata_Metadata_0();getCache(Metadata)[this.ptr]=this}Metadata.prototype=Object.create(WrapperObject.prototype);Metadata.prototype.constructor=Metadata;Metadata.prototype.__class__=Metadata;Metadata.__cache__={};Module[\"Metadata\"]=Metadata;Metadata.prototype[\"__destroy__\"]=Metadata.prototype.__destroy__=function(){var self=this.ptr;_emscripten_bind_Metadata___destroy___0(self)};function Status(){throw\"cannot construct a Status, no constructor in IDL\"}Status.prototype=Object.create(WrapperObject.prototype);Status.prototype.constructor=Status;Status.prototype.__class__=Status;Status.__cache__={};Module[\"Status\"]=Status;Status.prototype[\"code\"]=Status.prototype.code=function(){var self=this.ptr;return _emscripten_bind_Status_code_0(self)};Status.prototype[\"ok\"]=Status.prototype.ok=function(){var self=this.ptr;return!!_emscripten_bind_Status_ok_0(self)};Status.prototype[\"error_msg\"]=Status.prototype.error_msg=function(){var self=this.ptr;return UTF8ToString(_emscripten_bind_Status_error_msg_0(self))};Status.prototype[\"__destroy__\"]=Status.prototype.__destroy__=function(){var self=this.ptr;_emscripten_bind_Status___destroy___0(self)};function DracoFloat32Array(){this.ptr=_emscripten_bind_DracoFloat32Array_DracoFloat32Array_0();getCache(DracoFloat32Array)[this.ptr]=this}DracoFloat32Array.prototype=Object.create(WrapperObject.prototype);DracoFloat32Array.prototype.constructor=DracoFloat32Array;DracoFloat32Array.prototype.__class__=DracoFloat32Array;DracoFloat32Array.__cache__={};Module[\"DracoFloat32Array\"]=DracoFloat32Array;DracoFloat32Array.prototype[\"GetValue\"]=DracoFloat32Array.prototype.GetValue=function(index){var self=this.ptr;if(index&&typeof index===\"object\")index=index.ptr;return _emscripten_bind_DracoFloat32Array_GetValue_1(self,index)};DracoFloat32Array.prototype[\"size\"]=DracoFloat32Array.prototype.size=function(){var self=this.ptr;return _emscripten_bind_DracoFloat32Array_size_0(self)};DracoFloat32Array.prototype[\"__destroy__\"]=DracoFloat32Array.prototype.__destroy__=function(){var self=this.ptr;_emscripten_bind_DracoFloat32Array___destroy___0(self)};function DracoInt8Array(){this.ptr=_emscripten_bind_DracoInt8Array_DracoInt8Array_0();getCache(DracoInt8Array)[this.ptr]=this}DracoInt8Array.prototype=Object.create(WrapperObject.prototype);DracoInt8Array.prototype.constructor=DracoInt8Array;DracoInt8Array.prototype.__class__=DracoInt8Array;DracoInt8Array.__cache__={};Module[\"DracoInt8Array\"]=DracoInt8Array;DracoInt8Array.prototype[\"GetValue\"]=DracoInt8Array.prototype.GetValue=function(index){var self=this.ptr;if(index&&typeof index===\"object\")index=index.ptr;return _emscripten_bind_DracoInt8Array_GetValue_1(self,index)};DracoInt8Array.prototype[\"size\"]=DracoInt8Array.prototype.size=function(){var self=this.ptr;return _emscripten_bind_DracoInt8Array_size_0(self)};DracoInt8Array.prototype[\"__destroy__\"]=DracoInt8Array.prototype.__destroy__=function(){var self=this.ptr;_emscripten_bind_DracoInt8Array___destroy___0(self)};function DracoUInt8Array(){this.ptr=_emscripten_bind_DracoUInt8Array_DracoUInt8Array_0();getCache(DracoUInt8Array)[this.ptr]=this}DracoUInt8Array.prototype=Object.create(WrapperObject.prototype);DracoUInt8Array.prototype.constructor=DracoUInt8Array;DracoUInt8Array.prototype.__class__=DracoUInt8Array;DracoUInt8Array.__cache__={};Module[\"DracoUInt8Array\"]=DracoUInt8Array;DracoUInt8Array.prototype[\"GetValue\"]=DracoUInt8Array.prototype.GetValue=function(index){var self=this.ptr;if(index&&typeof index===\"object\")index=index.ptr;return _emscripten_bind_DracoUInt8Array_GetValue_1(self,index)};DracoUInt8Array.prototype[\"size\"]=DracoUInt8Array.prototype.size=function(){var self=this.ptr;return _emscripten_bind_DracoUInt8Array_size_0(self)};DracoUInt8Array.prototype[\"__destroy__\"]=DracoUInt8Array.prototype.__destroy__=function(){var self=this.ptr;_emscripten_bind_DracoUInt8Array___destroy___0(self)};function DracoInt16Array(){this.ptr=_emscripten_bind_DracoInt16Array_DracoInt16Array_0();getCache(DracoInt16Array)[this.ptr]=this}DracoInt16Array.prototype=Object.create(WrapperObject.prototype);DracoInt16Array.prototype.constructor=DracoInt16Array;DracoInt16Array.prototype.__class__=DracoInt16Array;DracoInt16Array.__cache__={};Module[\"DracoInt16Array\"]=DracoInt16Array;DracoInt16Array.prototype[\"GetValue\"]=DracoInt16Array.prototype.GetValue=function(index){var self=this.ptr;if(index&&typeof index===\"object\")index=index.ptr;return _emscripten_bind_DracoInt16Array_GetValue_1(self,index)};DracoInt16Array.prototype[\"size\"]=DracoInt16Array.prototype.size=function(){var self=this.ptr;return _emscripten_bind_DracoInt16Array_size_0(self)};DracoInt16Array.prototype[\"__destroy__\"]=DracoInt16Array.prototype.__destroy__=function(){var self=this.ptr;_emscripten_bind_DracoInt16Array___destroy___0(self)};function DracoUInt16Array(){this.ptr=_emscripten_bind_DracoUInt16Array_DracoUInt16Array_0();getCache(DracoUInt16Array)[this.ptr]=this}DracoUInt16Array.prototype=Object.create(WrapperObject.prototype);DracoUInt16Array.prototype.constructor=DracoUInt16Array;DracoUInt16Array.prototype.__class__=DracoUInt16Array;DracoUInt16Array.__cache__={};Module[\"DracoUInt16Array\"]=DracoUInt16Array;DracoUInt16Array.prototype[\"GetValue\"]=DracoUInt16Array.prototype.GetValue=function(index){var self=this.ptr;if(index&&typeof index===\"object\")index=index.ptr;return _emscripten_bind_DracoUInt16Array_GetValue_1(self,index)};DracoUInt16Array.prototype[\"size\"]=DracoUInt16Array.prototype.size=function(){var self=this.ptr;return _emscripten_bind_DracoUInt16Array_size_0(self)};DracoUInt16Array.prototype[\"__destroy__\"]=DracoUInt16Array.prototype.__destroy__=function(){var self=this.ptr;_emscripten_bind_DracoUInt16Array___destroy___0(self)};function DracoInt32Array(){this.ptr=_emscripten_bind_DracoInt32Array_DracoInt32Array_0();getCache(DracoInt32Array)[this.ptr]=this}DracoInt32Array.prototype=Object.create(WrapperObject.prototype);DracoInt32Array.prototype.constructor=DracoInt32Array;DracoInt32Array.prototype.__class__=DracoInt32Array;DracoInt32Array.__cache__={};Module[\"DracoInt32Array\"]=DracoInt32Array;DracoInt32Array.prototype[\"GetValue\"]=DracoInt32Array.prototype.GetValue=function(index){var self=this.ptr;if(index&&typeof index===\"object\")index=index.ptr;return _emscripten_bind_DracoInt32Array_GetValue_1(self,index)};DracoInt32Array.prototype[\"size\"]=DracoInt32Array.prototype.size=function(){var self=this.ptr;return _emscripten_bind_DracoInt32Array_size_0(self)};DracoInt32Array.prototype[\"__destroy__\"]=DracoInt32Array.prototype.__destroy__=function(){var self=this.ptr;_emscripten_bind_DracoInt32Array___destroy___0(self)};function DracoUInt32Array(){this.ptr=_emscripten_bind_DracoUInt32Array_DracoUInt32Array_0();getCache(DracoUInt32Array)[this.ptr]=this}DracoUInt32Array.prototype=Object.create(WrapperObject.prototype);DracoUInt32Array.prototype.constructor=DracoUInt32Array;DracoUInt32Array.prototype.__class__=DracoUInt32Array;DracoUInt32Array.__cache__={};Module[\"DracoUInt32Array\"]=DracoUInt32Array;DracoUInt32Array.prototype[\"GetValue\"]=DracoUInt32Array.prototype.GetValue=function(index){var self=this.ptr;if(index&&typeof index===\"object\")index=index.ptr;return _emscripten_bind_DracoUInt32Array_GetValue_1(self,index)};DracoUInt32Array.prototype[\"size\"]=DracoUInt32Array.prototype.size=function(){var self=this.ptr;return _emscripten_bind_DracoUInt32Array_size_0(self)};DracoUInt32Array.prototype[\"__destroy__\"]=DracoUInt32Array.prototype.__destroy__=function(){var self=this.ptr;_emscripten_bind_DracoUInt32Array___destroy___0(self)};function MetadataQuerier(){this.ptr=_emscripten_bind_MetadataQuerier_MetadataQuerier_0();getCache(MetadataQuerier)[this.ptr]=this}MetadataQuerier.prototype=Object.create(WrapperObject.prototype);MetadataQuerier.prototype.constructor=MetadataQuerier;MetadataQuerier.prototype.__class__=MetadataQuerier;MetadataQuerier.__cache__={};Module[\"MetadataQuerier\"]=MetadataQuerier;MetadataQuerier.prototype[\"HasEntry\"]=MetadataQuerier.prototype.HasEntry=function(metadata,entry_name){var self=this.ptr;ensureCache.prepare();if(metadata&&typeof metadata===\"object\")metadata=metadata.ptr;if(entry_name&&typeof entry_name===\"object\")entry_name=entry_name.ptr;else entry_name=ensureString(entry_name);return!!_emscripten_bind_MetadataQuerier_HasEntry_2(self,metadata,entry_name)};MetadataQuerier.prototype[\"GetIntEntry\"]=MetadataQuerier.prototype.GetIntEntry=function(metadata,entry_name){var self=this.ptr;ensureCache.prepare();if(metadata&&typeof metadata===\"object\")metadata=metadata.ptr;if(entry_name&&typeof entry_name===\"object\")entry_name=entry_name.ptr;else entry_name=ensureString(entry_name);return _emscripten_bind_MetadataQuerier_GetIntEntry_2(self,metadata,entry_name)};MetadataQuerier.prototype[\"GetIntEntryArray\"]=MetadataQuerier.prototype.GetIntEntryArray=function(metadata,entry_name,out_values){var self=this.ptr;ensureCache.prepare();if(metadata&&typeof metadata===\"object\")metadata=metadata.ptr;if(entry_name&&typeof entry_name===\"object\")entry_name=entry_name.ptr;else entry_name=ensureString(entry_name);if(out_values&&typeof out_values===\"object\")out_values=out_values.ptr;_emscripten_bind_MetadataQuerier_GetIntEntryArray_3(self,metadata,entry_name,out_values)};MetadataQuerier.prototype[\"GetDoubleEntry\"]=MetadataQuerier.prototype.GetDoubleEntry=function(metadata,entry_name){var self=this.ptr;ensureCache.prepare();if(metadata&&typeof metadata===\"object\")metadata=metadata.ptr;if(entry_name&&typeof entry_name===\"object\")entry_name=entry_name.ptr;else entry_name=ensureString(entry_name);return _emscripten_bind_MetadataQuerier_GetDoubleEntry_2(self,metadata,entry_name)};MetadataQuerier.prototype[\"GetStringEntry\"]=MetadataQuerier.prototype.GetStringEntry=function(metadata,entry_name){var self=this.ptr;ensureCache.prepare();if(metadata&&typeof metadata===\"object\")metadata=metadata.ptr;if(entry_name&&typeof entry_name===\"object\")entry_name=entry_name.ptr;else entry_name=ensureString(entry_name);return UTF8ToString(_emscripten_bind_MetadataQuerier_GetStringEntry_2(self,metadata,entry_name))};MetadataQuerier.prototype[\"NumEntries\"]=MetadataQuerier.prototype.NumEntries=function(metadata){var self=this.ptr;if(metadata&&typeof metadata===\"object\")metadata=metadata.ptr;return _emscripten_bind_MetadataQuerier_NumEntries_1(self,metadata)};MetadataQuerier.prototype[\"GetEntryName\"]=MetadataQuerier.prototype.GetEntryName=function(metadata,entry_id){var self=this.ptr;if(metadata&&typeof metadata===\"object\")metadata=metadata.ptr;if(entry_id&&typeof entry_id===\"object\")entry_id=entry_id.ptr;return UTF8ToString(_emscripten_bind_MetadataQuerier_GetEntryName_2(self,metadata,entry_id))};MetadataQuerier.prototype[\"__destroy__\"]=MetadataQuerier.prototype.__destroy__=function(){var self=this.ptr;_emscripten_bind_MetadataQuerier___destroy___0(self)};function Decoder(){this.ptr=_emscripten_bind_Decoder_Decoder_0();getCache(Decoder)[this.ptr]=this}Decoder.prototype=Object.create(WrapperObject.prototype);Decoder.prototype.constructor=Decoder;Decoder.prototype.__class__=Decoder;Decoder.__cache__={};Module[\"Decoder\"]=Decoder;Decoder.prototype[\"DecodeArrayToPointCloud\"]=Decoder.prototype.DecodeArrayToPointCloud=function(data,data_size,out_point_cloud){var self=this.ptr;ensureCache.prepare();if(typeof data==\"object\"){data=ensureInt8(data)}if(data_size&&typeof data_size===\"object\")data_size=data_size.ptr;if(out_point_cloud&&typeof out_point_cloud===\"object\")out_point_cloud=out_point_cloud.ptr;return wrapPointer(_emscripten_bind_Decoder_DecodeArrayToPointCloud_3(self,data,data_size,out_point_cloud),Status)};Decoder.prototype[\"DecodeArrayToMesh\"]=Decoder.prototype.DecodeArrayToMesh=function(data,data_size,out_mesh){var self=this.ptr;ensureCache.prepare();if(typeof data==\"object\"){data=ensureInt8(data)}if(data_size&&typeof data_size===\"object\")data_size=data_size.ptr;if(out_mesh&&typeof out_mesh===\"object\")out_mesh=out_mesh.ptr;return wrapPointer(_emscripten_bind_Decoder_DecodeArrayToMesh_3(self,data,data_size,out_mesh),Status)};Decoder.prototype[\"GetAttributeId\"]=Decoder.prototype.GetAttributeId=function(pc,type){var self=this.ptr;if(pc&&typeof pc===\"object\")pc=pc.ptr;if(type&&typeof type===\"object\")type=type.ptr;return _emscripten_bind_Decoder_GetAttributeId_2(self,pc,type)};Decoder.prototype[\"GetAttributeIdByName\"]=Decoder.prototype.GetAttributeIdByName=function(pc,name){var self=this.ptr;ensureCache.prepare();if(pc&&typeof pc===\"object\")pc=pc.ptr;if(name&&typeof name===\"object\")name=name.ptr;else name=ensureString(name);return _emscripten_bind_Decoder_GetAttributeIdByName_2(self,pc,name)};Decoder.prototype[\"GetAttributeIdByMetadataEntry\"]=Decoder.prototype.GetAttributeIdByMetadataEntry=function(pc,name,value){var self=this.ptr;ensureCache.prepare();if(pc&&typeof pc===\"object\")pc=pc.ptr;if(name&&typeof name===\"object\")name=name.ptr;else name=ensureString(name);if(value&&typeof value===\"object\")value=value.ptr;else value=ensureString(value);return _emscripten_bind_Decoder_GetAttributeIdByMetadataEntry_3(self,pc,name,value)};Decoder.prototype[\"GetAttribute\"]=Decoder.prototype.GetAttribute=function(pc,att_id){var self=this.ptr;if(pc&&typeof pc===\"object\")pc=pc.ptr;if(att_id&&typeof att_id===\"object\")att_id=att_id.ptr;return wrapPointer(_emscripten_bind_Decoder_GetAttribute_2(self,pc,att_id),PointAttribute)};Decoder.prototype[\"GetAttributeByUniqueId\"]=Decoder.prototype.GetAttributeByUniqueId=function(pc,unique_id){var self=this.ptr;if(pc&&typeof pc===\"object\")pc=pc.ptr;if(unique_id&&typeof unique_id===\"object\")unique_id=unique_id.ptr;return wrapPointer(_emscripten_bind_Decoder_GetAttributeByUniqueId_2(self,pc,unique_id),PointAttribute)};Decoder.prototype[\"GetMetadata\"]=Decoder.prototype.GetMetadata=function(pc){var self=this.ptr;if(pc&&typeof pc===\"object\")pc=pc.ptr;return wrapPointer(_emscripten_bind_Decoder_GetMetadata_1(self,pc),Metadata)};Decoder.prototype[\"GetAttributeMetadata\"]=Decoder.prototype.GetAttributeMetadata=function(pc,att_id){var self=this.ptr;if(pc&&typeof pc===\"object\")pc=pc.ptr;if(att_id&&typeof att_id===\"object\")att_id=att_id.ptr;return wrapPointer(_emscripten_bind_Decoder_GetAttributeMetadata_2(self,pc,att_id),Metadata)};Decoder.prototype[\"GetFaceFromMesh\"]=Decoder.prototype.GetFaceFromMesh=function(m,face_id,out_values){var self=this.ptr;if(m&&typeof m===\"object\")m=m.ptr;if(face_id&&typeof face_id===\"object\")face_id=face_id.ptr;if(out_values&&typeof out_values===\"object\")out_values=out_values.ptr;return!!_emscripten_bind_Decoder_GetFaceFromMesh_3(self,m,face_id,out_values)};Decoder.prototype[\"GetTriangleStripsFromMesh\"]=Decoder.prototype.GetTriangleStripsFromMesh=function(m,strip_values){var self=this.ptr;if(m&&typeof m===\"object\")m=m.ptr;if(strip_values&&typeof strip_values===\"object\")strip_values=strip_values.ptr;return _emscripten_bind_Decoder_GetTriangleStripsFromMesh_2(self,m,strip_values)};Decoder.prototype[\"GetTrianglesUInt16Array\"]=Decoder.prototype.GetTrianglesUInt16Array=function(m,out_size,out_values){var self=this.ptr;if(m&&typeof m===\"object\")m=m.ptr;if(out_size&&typeof out_size===\"object\")out_size=out_size.ptr;if(out_values&&typeof out_values===\"object\")out_values=out_values.ptr;return!!_emscripten_bind_Decoder_GetTrianglesUInt16Array_3(self,m,out_size,out_values)};Decoder.prototype[\"GetTrianglesUInt32Array\"]=Decoder.prototype.GetTrianglesUInt32Array=function(m,out_size,out_values){var self=this.ptr;if(m&&typeof m===\"object\")m=m.ptr;if(out_size&&typeof out_size===\"object\")out_size=out_size.ptr;if(out_values&&typeof out_values===\"object\")out_values=out_values.ptr;return!!_emscripten_bind_Decoder_GetTrianglesUInt32Array_3(self,m,out_size,out_values)};Decoder.prototype[\"GetAttributeFloat\"]=Decoder.prototype.GetAttributeFloat=function(pa,att_index,out_values){var self=this.ptr;if(pa&&typeof pa===\"object\")pa=pa.ptr;if(att_index&&typeof att_index===\"object\")att_index=att_index.ptr;if(out_values&&typeof out_values===\"object\")out_values=out_values.ptr;return!!_emscripten_bind_Decoder_GetAttributeFloat_3(self,pa,att_index,out_values)};Decoder.prototype[\"GetAttributeFloatForAllPoints\"]=Decoder.prototype.GetAttributeFloatForAllPoints=function(pc,pa,out_values){var self=this.ptr;if(pc&&typeof pc===\"object\")pc=pc.ptr;if(pa&&typeof pa===\"object\")pa=pa.ptr;if(out_values&&typeof out_values===\"object\")out_values=out_values.ptr;return!!_emscripten_bind_Decoder_GetAttributeFloatForAllPoints_3(self,pc,pa,out_values)};Decoder.prototype[\"GetAttributeIntForAllPoints\"]=Decoder.prototype.GetAttributeIntForAllPoints=function(pc,pa,out_values){var self=this.ptr;if(pc&&typeof pc===\"object\")pc=pc.ptr;if(pa&&typeof pa===\"object\")pa=pa.ptr;if(out_values&&typeof out_values===\"object\")out_values=out_values.ptr;return!!_emscripten_bind_Decoder_GetAttributeIntForAllPoints_3(self,pc,pa,out_values)};Decoder.prototype[\"GetAttributeInt8ForAllPoints\"]=Decoder.prototype.GetAttributeInt8ForAllPoints=function(pc,pa,out_values){var self=this.ptr;if(pc&&typeof pc===\"object\")pc=pc.ptr;if(pa&&typeof pa===\"object\")pa=pa.ptr;if(out_values&&typeof out_values===\"object\")out_values=out_values.ptr;return!!_emscripten_bind_Decoder_GetAttributeInt8ForAllPoints_3(self,pc,pa,out_values)};Decoder.prototype[\"GetAttributeUInt8ForAllPoints\"]=Decoder.prototype.GetAttributeUInt8ForAllPoints=function(pc,pa,out_values){var self=this.ptr;if(pc&&typeof pc===\"object\")pc=pc.ptr;if(pa&&typeof pa===\"object\")pa=pa.ptr;if(out_values&&typeof out_values===\"object\")out_values=out_values.ptr;return!!_emscripten_bind_Decoder_GetAttributeUInt8ForAllPoints_3(self,pc,pa,out_values)};Decoder.prototype[\"GetAttributeInt16ForAllPoints\"]=Decoder.prototype.GetAttributeInt16ForAllPoints=function(pc,pa,out_values){var self=this.ptr;if(pc&&typeof pc===\"object\")pc=pc.ptr;if(pa&&typeof pa===\"object\")pa=pa.ptr;if(out_values&&typeof out_values===\"object\")out_values=out_values.ptr;return!!_emscripten_bind_Decoder_GetAttributeInt16ForAllPoints_3(self,pc,pa,out_values)};Decoder.prototype[\"GetAttributeUInt16ForAllPoints\"]=Decoder.prototype.GetAttributeUInt16ForAllPoints=function(pc,pa,out_values){var self=this.ptr;if(pc&&typeof pc===\"object\")pc=pc.ptr;if(pa&&typeof pa===\"object\")pa=pa.ptr;if(out_values&&typeof out_values===\"object\")out_values=out_values.ptr;return!!_emscripten_bind_Decoder_GetAttributeUInt16ForAllPoints_3(self,pc,pa,out_values)};Decoder.prototype[\"GetAttributeInt32ForAllPoints\"]=Decoder.prototype.GetAttributeInt32ForAllPoints=function(pc,pa,out_values){var self=this.ptr;if(pc&&typeof pc===\"object\")pc=pc.ptr;if(pa&&typeof pa===\"object\")pa=pa.ptr;if(out_values&&typeof out_values===\"object\")out_values=out_values.ptr;return!!_emscripten_bind_Decoder_GetAttributeInt32ForAllPoints_3(self,pc,pa,out_values)};Decoder.prototype[\"GetAttributeUInt32ForAllPoints\"]=Decoder.prototype.GetAttributeUInt32ForAllPoints=function(pc,pa,out_values){var self=this.ptr;if(pc&&typeof pc===\"object\")pc=pc.ptr;if(pa&&typeof pa===\"object\")pa=pa.ptr;if(out_values&&typeof out_values===\"object\")out_values=out_values.ptr;return!!_emscripten_bind_Decoder_GetAttributeUInt32ForAllPoints_3(self,pc,pa,out_values)};Decoder.prototype[\"GetAttributeDataArrayForAllPoints\"]=Decoder.prototype.GetAttributeDataArrayForAllPoints=function(pc,pa,data_type,out_size,out_values){var self=this.ptr;if(pc&&typeof pc===\"object\")pc=pc.ptr;if(pa&&typeof pa===\"object\")pa=pa.ptr;if(data_type&&typeof data_type===\"object\")data_type=data_type.ptr;if(out_size&&typeof out_size===\"object\")out_size=out_size.ptr;if(out_values&&typeof out_values===\"object\")out_values=out_values.ptr;return!!_emscripten_bind_Decoder_GetAttributeDataArrayForAllPoints_5(self,pc,pa,data_type,out_size,out_values)};Decoder.prototype[\"SkipAttributeTransform\"]=Decoder.prototype.SkipAttributeTransform=function(att_type){var self=this.ptr;if(att_type&&typeof att_type===\"object\")att_type=att_type.ptr;_emscripten_bind_Decoder_SkipAttributeTransform_1(self,att_type)};Decoder.prototype[\"GetEncodedGeometryType_Deprecated\"]=Decoder.prototype.GetEncodedGeometryType_Deprecated=function(in_buffer){var self=this.ptr;if(in_buffer&&typeof in_buffer===\"object\")in_buffer=in_buffer.ptr;return _emscripten_bind_Decoder_GetEncodedGeometryType_Deprecated_1(self,in_buffer)};Decoder.prototype[\"DecodeBufferToPointCloud\"]=Decoder.prototype.DecodeBufferToPointCloud=function(in_buffer,out_point_cloud){var self=this.ptr;if(in_buffer&&typeof in_buffer===\"object\")in_buffer=in_buffer.ptr;if(out_point_cloud&&typeof out_point_cloud===\"object\")out_point_cloud=out_point_cloud.ptr;return wrapPointer(_emscripten_bind_Decoder_DecodeBufferToPointCloud_2(self,in_buffer,out_point_cloud),Status)};Decoder.prototype[\"DecodeBufferToMesh\"]=Decoder.prototype.DecodeBufferToMesh=function(in_buffer,out_mesh){var self=this.ptr;if(in_buffer&&typeof in_buffer===\"object\")in_buffer=in_buffer.ptr;if(out_mesh&&typeof out_mesh===\"object\")out_mesh=out_mesh.ptr;return wrapPointer(_emscripten_bind_Decoder_DecodeBufferToMesh_2(self,in_buffer,out_mesh),Status)};Decoder.prototype[\"__destroy__\"]=Decoder.prototype.__destroy__=function(){var self=this.ptr;_emscripten_bind_Decoder___destroy___0(self)};(function(){function setupEnums(){Module[\"ATTRIBUTE_INVALID_TRANSFORM\"]=_emscripten_enum_draco_AttributeTransformType_ATTRIBUTE_INVALID_TRANSFORM();Module[\"ATTRIBUTE_NO_TRANSFORM\"]=_emscripten_enum_draco_AttributeTransformType_ATTRIBUTE_NO_TRANSFORM();Module[\"ATTRIBUTE_QUANTIZATION_TRANSFORM\"]=_emscripten_enum_draco_AttributeTransformType_ATTRIBUTE_QUANTIZATION_TRANSFORM();Module[\"ATTRIBUTE_OCTAHEDRON_TRANSFORM\"]=_emscripten_enum_draco_AttributeTransformType_ATTRIBUTE_OCTAHEDRON_TRANSFORM();Module[\"INVALID\"]=_emscripten_enum_draco_GeometryAttribute_Type_INVALID();Module[\"POSITION\"]=_emscripten_enum_draco_GeometryAttribute_Type_POSITION();Module[\"NORMAL\"]=_emscripten_enum_draco_GeometryAttribute_Type_NORMAL();Module[\"COLOR\"]=_emscripten_enum_draco_GeometryAttribute_Type_COLOR();Module[\"TEX_COORD\"]=_emscripten_enum_draco_GeometryAttribute_Type_TEX_COORD();Module[\"GENERIC\"]=_emscripten_enum_draco_GeometryAttribute_Type_GENERIC();Module[\"INVALID_GEOMETRY_TYPE\"]=_emscripten_enum_draco_EncodedGeometryType_INVALID_GEOMETRY_TYPE();Module[\"POINT_CLOUD\"]=_emscripten_enum_draco_EncodedGeometryType_POINT_CLOUD();Module[\"TRIANGULAR_MESH\"]=_emscripten_enum_draco_EncodedGeometryType_TRIANGULAR_MESH();Module[\"DT_INVALID\"]=_emscripten_enum_draco_DataType_DT_INVALID();Module[\"DT_INT8\"]=_emscripten_enum_draco_DataType_DT_INT8();Module[\"DT_UINT8\"]=_emscripten_enum_draco_DataType_DT_UINT8();Module[\"DT_INT16\"]=_emscripten_enum_draco_DataType_DT_INT16();Module[\"DT_UINT16\"]=_emscripten_enum_draco_DataType_DT_UINT16();Module[\"DT_INT32\"]=_emscripten_enum_draco_DataType_DT_INT32();Module[\"DT_UINT32\"]=_emscripten_enum_draco_DataType_DT_UINT32();Module[\"DT_INT64\"]=_emscripten_enum_draco_DataType_DT_INT64();Module[\"DT_UINT64\"]=_emscripten_enum_draco_DataType_DT_UINT64();Module[\"DT_FLOAT32\"]=_emscripten_enum_draco_DataType_DT_FLOAT32();Module[\"DT_FLOAT64\"]=_emscripten_enum_draco_DataType_DT_FLOAT64();Module[\"DT_BOOL\"]=_emscripten_enum_draco_DataType_DT_BOOL();Module[\"DT_TYPES_COUNT\"]=_emscripten_enum_draco_DataType_DT_TYPES_COUNT();Module[\"OK\"]=_emscripten_enum_draco_StatusCode_OK();Module[\"DRACO_ERROR\"]=_emscripten_enum_draco_StatusCode_DRACO_ERROR();Module[\"IO_ERROR\"]=_emscripten_enum_draco_StatusCode_IO_ERROR();Module[\"INVALID_PARAMETER\"]=_emscripten_enum_draco_StatusCode_INVALID_PARAMETER();Module[\"UNSUPPORTED_VERSION\"]=_emscripten_enum_draco_StatusCode_UNSUPPORTED_VERSION();Module[\"UNKNOWN_VERSION\"]=_emscripten_enum_draco_StatusCode_UNKNOWN_VERSION()}if(runtimeInitialized)setupEnums();else addOnInit(setupEnums)})();if(typeof Module[\"onModuleParsed\"]===\"function\"){Module[\"onModuleParsed\"]()}Module[\"Decoder\"].prototype.GetEncodedGeometryType=function(array){if(array.__class__&&array.__class__===Module.DecoderBuffer){return Module.Decoder.prototype.GetEncodedGeometryType_Deprecated(array)}if(array.byteLength<8)return Module.INVALID_GEOMETRY_TYPE;switch(array[7]){case 0:return Module.POINT_CLOUD;case 1:return Module.TRIANGULAR_MESH;default:return Module.INVALID_GEOMETRY_TYPE}};\n\n\n  return DracoDecoderModule.ready\n}\n);\n})();\nif (typeof exports === 'object' && typeof module === 'object')\n  module.exports = DracoDecoderModule;\nelse if (typeof define === 'function' && define['amd'])\n  define([], function() { return DracoDecoderModule; });\nelse if (typeof exports === 'object')\n  exports[\"DracoDecoderModule\"] = DracoDecoderModule;\n"
  },
  {
    "path": "examples/libs/draco/gltf/draco_encoder.js",
    "content": "var DracoEncoderModule = function(DracoEncoderModule) {\n  DracoEncoderModule = DracoEncoderModule || {};\n\nvar Module=typeof DracoEncoderModule!==\"undefined\"?DracoEncoderModule:{};var isRuntimeInitialized=false;var isModuleParsed=false;Module[\"onRuntimeInitialized\"]=(function(){isRuntimeInitialized=true;if(isModuleParsed){if(typeof Module[\"onModuleLoaded\"]===\"function\"){Module[\"onModuleLoaded\"](Module)}}});Module[\"onModuleParsed\"]=(function(){isModuleParsed=true;if(isRuntimeInitialized){if(typeof Module[\"onModuleLoaded\"]===\"function\"){Module[\"onModuleLoaded\"](Module)}}});function isVersionSupported(versionString){if(typeof versionString!==\"string\")return false;const version=versionString.split(\".\");if(version.length<2||version.length>3)return false;if(version[0]==1&&version[1]>=0&&version[1]<=3)return true;if(version[0]!=0||version[1]>10)return false;return true}Module[\"isVersionSupported\"]=isVersionSupported;var moduleOverrides={};var key;for(key in Module){if(Module.hasOwnProperty(key)){moduleOverrides[key]=Module[key]}}Module[\"arguments\"]=[];Module[\"thisProgram\"]=\"./this.program\";Module[\"quit\"]=(function(status,toThrow){throw toThrow});Module[\"preRun\"]=[];Module[\"postRun\"]=[];var ENVIRONMENT_IS_WEB=false;var ENVIRONMENT_IS_WORKER=false;var ENVIRONMENT_IS_NODE=false;var ENVIRONMENT_IS_SHELL=false;if(Module[\"ENVIRONMENT\"]){if(Module[\"ENVIRONMENT\"]===\"WEB\"){ENVIRONMENT_IS_WEB=true}else if(Module[\"ENVIRONMENT\"]===\"WORKER\"){ENVIRONMENT_IS_WORKER=true}else if(Module[\"ENVIRONMENT\"]===\"NODE\"){ENVIRONMENT_IS_NODE=true}else if(Module[\"ENVIRONMENT\"]===\"SHELL\"){ENVIRONMENT_IS_SHELL=true}else{throw new Error(\"Module['ENVIRONMENT'] value is not valid. must be one of: WEB|WORKER|NODE|SHELL.\")}}else{ENVIRONMENT_IS_WEB=typeof window===\"object\";ENVIRONMENT_IS_WORKER=typeof importScripts===\"function\";ENVIRONMENT_IS_NODE=typeof process===\"object\"&&typeof require===\"function\"&&!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_WORKER;ENVIRONMENT_IS_SHELL=!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_NODE&&!ENVIRONMENT_IS_WORKER}if(ENVIRONMENT_IS_NODE){var nodeFS;var nodePath;Module[\"read\"]=function shell_read(filename,binary){var ret;ret=tryParseAsDataURI(filename);if(!ret){if(!nodeFS)nodeFS=require(\"fs\");if(!nodePath)nodePath=require(\"path\");filename=nodePath[\"normalize\"](filename);ret=nodeFS[\"readFileSync\"](filename)}return binary?ret:ret.toString()};Module[\"readBinary\"]=function readBinary(filename){var ret=Module[\"read\"](filename,true);if(!ret.buffer){ret=new Uint8Array(ret)}assert(ret.buffer);return ret};if(process[\"argv\"].length>1){Module[\"thisProgram\"]=process[\"argv\"][1].replace(/\\\\/g,\"/\")}Module[\"arguments\"]=process[\"argv\"].slice(2);process[\"on\"](\"uncaughtException\",(function(ex){if(!(ex instanceof ExitStatus)){throw ex}}));process[\"on\"](\"unhandledRejection\",(function(reason,p){process[\"exit\"](1)}));Module[\"inspect\"]=(function(){return\"[Emscripten Module object]\"})}else if(ENVIRONMENT_IS_SHELL){if(typeof read!=\"undefined\"){Module[\"read\"]=function shell_read(f){var data=tryParseAsDataURI(f);if(data){return intArrayToString(data)}return read(f)}}Module[\"readBinary\"]=function readBinary(f){var data;data=tryParseAsDataURI(f);if(data){return data}if(typeof readbuffer===\"function\"){return new Uint8Array(readbuffer(f))}data=read(f,\"binary\");assert(typeof data===\"object\");return data};if(typeof scriptArgs!=\"undefined\"){Module[\"arguments\"]=scriptArgs}else if(typeof arguments!=\"undefined\"){Module[\"arguments\"]=arguments}if(typeof quit===\"function\"){Module[\"quit\"]=(function(status,toThrow){quit(status)})}}else if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){Module[\"read\"]=function shell_read(url){try{var xhr=new XMLHttpRequest;xhr.open(\"GET\",url,false);xhr.send(null);return xhr.responseText}catch(err){var data=tryParseAsDataURI(url);if(data){return intArrayToString(data)}throw err}};if(ENVIRONMENT_IS_WORKER){Module[\"readBinary\"]=function readBinary(url){try{var xhr=new XMLHttpRequest;xhr.open(\"GET\",url,false);xhr.responseType=\"arraybuffer\";xhr.send(null);return new Uint8Array(xhr.response)}catch(err){var data=tryParseAsDataURI(url);if(data){return data}throw err}}}Module[\"readAsync\"]=function readAsync(url,onload,onerror){var xhr=new XMLHttpRequest;xhr.open(\"GET\",url,true);xhr.responseType=\"arraybuffer\";xhr.onload=function xhr_onload(){if(xhr.status==200||xhr.status==0&&xhr.response){onload(xhr.response);return}var data=tryParseAsDataURI(url);if(data){onload(data.buffer);return}onerror()};xhr.onerror=onerror;xhr.send(null)};Module[\"setWindowTitle\"]=(function(title){document.title=title})}Module[\"print\"]=typeof console!==\"undefined\"?console.log.bind(console):typeof print!==\"undefined\"?print:null;Module[\"printErr\"]=typeof printErr!==\"undefined\"?printErr:typeof console!==\"undefined\"&&console.warn.bind(console)||Module[\"print\"];Module.print=Module[\"print\"];Module.printErr=Module[\"printErr\"];for(key in moduleOverrides){if(moduleOverrides.hasOwnProperty(key)){Module[key]=moduleOverrides[key]}}moduleOverrides=undefined;var STACK_ALIGN=16;function staticAlloc(size){assert(!staticSealed);var ret=STATICTOP;STATICTOP=STATICTOP+size+15&-16;return ret}function dynamicAlloc(size){assert(DYNAMICTOP_PTR);var ret=HEAP32[DYNAMICTOP_PTR>>2];var end=ret+size+15&-16;HEAP32[DYNAMICTOP_PTR>>2]=end;if(end>=TOTAL_MEMORY){var success=enlargeMemory();if(!success){HEAP32[DYNAMICTOP_PTR>>2]=ret;return 0}}return ret}function alignMemory(size,factor){if(!factor)factor=STACK_ALIGN;var ret=size=Math.ceil(size/factor)*factor;return ret}function getNativeTypeSize(type){switch(type){case\"i1\":case\"i8\":return 1;case\"i16\":return 2;case\"i32\":return 4;case\"i64\":return 8;case\"float\":return 4;case\"double\":return 8;default:{if(type[type.length-1]===\"*\"){return 4}else if(type[0]===\"i\"){var bits=parseInt(type.substr(1));assert(bits%8===0);return bits/8}else{return 0}}}}function warnOnce(text){if(!warnOnce.shown)warnOnce.shown={};if(!warnOnce.shown[text]){warnOnce.shown[text]=1;Module.printErr(text)}}var jsCallStartIndex=1;var functionPointers=new Array(0);var funcWrappers={};function dynCall(sig,ptr,args){if(args&&args.length){return Module[\"dynCall_\"+sig].apply(null,[ptr].concat(args))}else{return Module[\"dynCall_\"+sig].call(null,ptr)}}var GLOBAL_BASE=8;var ABORT=0;var EXITSTATUS=0;function assert(condition,text){if(!condition){abort(\"Assertion failed: \"+text)}}function getCFunc(ident){var func=Module[\"_\"+ident];assert(func,\"Cannot call unknown function \"+ident+\", make sure it is exported\");return func}var JSfuncs={\"stackSave\":(function(){stackSave()}),\"stackRestore\":(function(){stackRestore()}),\"arrayToC\":(function(arr){var ret=stackAlloc(arr.length);writeArrayToMemory(arr,ret);return ret}),\"stringToC\":(function(str){var ret=0;if(str!==null&&str!==undefined&&str!==0){var len=(str.length<<2)+1;ret=stackAlloc(len);stringToUTF8(str,ret,len)}return ret})};var toC={\"string\":JSfuncs[\"stringToC\"],\"array\":JSfuncs[\"arrayToC\"]};function ccall(ident,returnType,argTypes,args,opts){var func=getCFunc(ident);var cArgs=[];var stack=0;if(args){for(var i=0;i<args.length;i++){var converter=toC[argTypes[i]];if(converter){if(stack===0)stack=stackSave();cArgs[i]=converter(args[i])}else{cArgs[i]=args[i]}}}var ret=func.apply(null,cArgs);if(returnType===\"string\")ret=Pointer_stringify(ret);if(returnType===\"boolean\")ret=Boolean(ret);if(stack!==0){stackRestore(stack)}return ret}function setValue(ptr,value,type,noSafe){type=type||\"i8\";if(type.charAt(type.length-1)===\"*\")type=\"i32\";switch(type){case\"i1\":HEAP8[ptr>>0]=value;break;case\"i8\":HEAP8[ptr>>0]=value;break;case\"i16\":HEAP16[ptr>>1]=value;break;case\"i32\":HEAP32[ptr>>2]=value;break;case\"i64\":tempI64=[value>>>0,(tempDouble=value,+Math_abs(tempDouble)>=+1?tempDouble>+0?(Math_min(+Math_floor(tempDouble/+4294967296),+4294967295)|0)>>>0:~~+Math_ceil((tempDouble- +(~~tempDouble>>>0))/+4294967296)>>>0:0)],HEAP32[ptr>>2]=tempI64[0],HEAP32[ptr+4>>2]=tempI64[1];break;case\"float\":HEAPF32[ptr>>2]=value;break;case\"double\":HEAPF64[ptr>>3]=value;break;default:abort(\"invalid type for setValue: \"+type)}}var ALLOC_STATIC=2;var ALLOC_NONE=4;function allocate(slab,types,allocator,ptr){var zeroinit,size;if(typeof slab===\"number\"){zeroinit=true;size=slab}else{zeroinit=false;size=slab.length}var singleType=typeof types===\"string\"?types:null;var ret;if(allocator==ALLOC_NONE){ret=ptr}else{ret=[typeof _malloc===\"function\"?_malloc:staticAlloc,stackAlloc,staticAlloc,dynamicAlloc][allocator===undefined?ALLOC_STATIC:allocator](Math.max(size,singleType?1:types.length))}if(zeroinit){var stop;ptr=ret;assert((ret&3)==0);stop=ret+(size&~3);for(;ptr<stop;ptr+=4){HEAP32[ptr>>2]=0}stop=ret+size;while(ptr<stop){HEAP8[ptr++>>0]=0}return ret}if(singleType===\"i8\"){if(slab.subarray||slab.slice){HEAPU8.set(slab,ret)}else{HEAPU8.set(new Uint8Array(slab),ret)}return ret}var i=0,type,typeSize,previousType;while(i<size){var curr=slab[i];type=singleType||types[i];if(type===0){i++;continue}if(type==\"i64\")type=\"i32\";setValue(ret+i,curr,type);if(previousType!==type){typeSize=getNativeTypeSize(type);previousType=type}i+=typeSize}return ret}function Pointer_stringify(ptr,length){if(length===0||!ptr)return\"\";var hasUtf=0;var t;var i=0;while(1){t=HEAPU8[ptr+i>>0];hasUtf|=t;if(t==0&&!length)break;i++;if(length&&i==length)break}if(!length)length=i;var ret=\"\";if(hasUtf<128){var MAX_CHUNK=1024;var curr;while(length>0){curr=String.fromCharCode.apply(String,HEAPU8.subarray(ptr,ptr+Math.min(length,MAX_CHUNK)));ret=ret?ret+curr:curr;ptr+=MAX_CHUNK;length-=MAX_CHUNK}return ret}return UTF8ToString(ptr)}var UTF8Decoder=typeof TextDecoder!==\"undefined\"?new TextDecoder(\"utf8\"):undefined;function UTF8ArrayToString(u8Array,idx){var endPtr=idx;while(u8Array[endPtr])++endPtr;if(endPtr-idx>16&&u8Array.subarray&&UTF8Decoder){return UTF8Decoder.decode(u8Array.subarray(idx,endPtr))}else{var u0,u1,u2,u3,u4,u5;var str=\"\";while(1){u0=u8Array[idx++];if(!u0)return str;if(!(u0&128)){str+=String.fromCharCode(u0);continue}u1=u8Array[idx++]&63;if((u0&224)==192){str+=String.fromCharCode((u0&31)<<6|u1);continue}u2=u8Array[idx++]&63;if((u0&240)==224){u0=(u0&15)<<12|u1<<6|u2}else{u3=u8Array[idx++]&63;if((u0&248)==240){u0=(u0&7)<<18|u1<<12|u2<<6|u3}else{u4=u8Array[idx++]&63;if((u0&252)==248){u0=(u0&3)<<24|u1<<18|u2<<12|u3<<6|u4}else{u5=u8Array[idx++]&63;u0=(u0&1)<<30|u1<<24|u2<<18|u3<<12|u4<<6|u5}}}if(u0<65536){str+=String.fromCharCode(u0)}else{var ch=u0-65536;str+=String.fromCharCode(55296|ch>>10,56320|ch&1023)}}}}function UTF8ToString(ptr){return UTF8ArrayToString(HEAPU8,ptr)}function stringToUTF8Array(str,outU8Array,outIdx,maxBytesToWrite){if(!(maxBytesToWrite>0))return 0;var startIdx=outIdx;var endIdx=outIdx+maxBytesToWrite-1;for(var i=0;i<str.length;++i){var u=str.charCodeAt(i);if(u>=55296&&u<=57343)u=65536+((u&1023)<<10)|str.charCodeAt(++i)&1023;if(u<=127){if(outIdx>=endIdx)break;outU8Array[outIdx++]=u}else if(u<=2047){if(outIdx+1>=endIdx)break;outU8Array[outIdx++]=192|u>>6;outU8Array[outIdx++]=128|u&63}else if(u<=65535){if(outIdx+2>=endIdx)break;outU8Array[outIdx++]=224|u>>12;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}else if(u<=2097151){if(outIdx+3>=endIdx)break;outU8Array[outIdx++]=240|u>>18;outU8Array[outIdx++]=128|u>>12&63;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}else if(u<=67108863){if(outIdx+4>=endIdx)break;outU8Array[outIdx++]=248|u>>24;outU8Array[outIdx++]=128|u>>18&63;outU8Array[outIdx++]=128|u>>12&63;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}else{if(outIdx+5>=endIdx)break;outU8Array[outIdx++]=252|u>>30;outU8Array[outIdx++]=128|u>>24&63;outU8Array[outIdx++]=128|u>>18&63;outU8Array[outIdx++]=128|u>>12&63;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}}outU8Array[outIdx]=0;return outIdx-startIdx}function stringToUTF8(str,outPtr,maxBytesToWrite){return stringToUTF8Array(str,HEAPU8,outPtr,maxBytesToWrite)}function lengthBytesUTF8(str){var len=0;for(var i=0;i<str.length;++i){var u=str.charCodeAt(i);if(u>=55296&&u<=57343)u=65536+((u&1023)<<10)|str.charCodeAt(++i)&1023;if(u<=127){++len}else if(u<=2047){len+=2}else if(u<=65535){len+=3}else if(u<=2097151){len+=4}else if(u<=67108863){len+=5}else{len+=6}}return len}var UTF16Decoder=typeof TextDecoder!==\"undefined\"?new TextDecoder(\"utf-16le\"):undefined;function demangle(func){return func}function demangleAll(text){var regex=/__Z[\\w\\d_]+/g;return text.replace(regex,(function(x){var y=demangle(x);return x===y?x:x+\" [\"+y+\"]\"}))}function jsStackTrace(){var err=new Error;if(!err.stack){try{throw new Error(0)}catch(e){err=e}if(!err.stack){return\"(no stack trace available)\"}}return err.stack.toString()}var WASM_PAGE_SIZE=65536;var ASMJS_PAGE_SIZE=16777216;var MIN_TOTAL_MEMORY=16777216;function alignUp(x,multiple){if(x%multiple>0){x+=multiple-x%multiple}return x}var buffer,HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64;function updateGlobalBuffer(buf){Module[\"buffer\"]=buffer=buf}function updateGlobalBufferViews(){Module[\"HEAP8\"]=HEAP8=new Int8Array(buffer);Module[\"HEAP16\"]=HEAP16=new Int16Array(buffer);Module[\"HEAP32\"]=HEAP32=new Int32Array(buffer);Module[\"HEAPU8\"]=HEAPU8=new Uint8Array(buffer);Module[\"HEAPU16\"]=HEAPU16=new Uint16Array(buffer);Module[\"HEAPU32\"]=HEAPU32=new Uint32Array(buffer);Module[\"HEAPF32\"]=HEAPF32=new Float32Array(buffer);Module[\"HEAPF64\"]=HEAPF64=new Float64Array(buffer)}var STATIC_BASE,STATICTOP,staticSealed;var STACK_BASE,STACKTOP,STACK_MAX;var DYNAMIC_BASE,DYNAMICTOP_PTR;STATIC_BASE=STATICTOP=STACK_BASE=STACKTOP=STACK_MAX=DYNAMIC_BASE=DYNAMICTOP_PTR=0;staticSealed=false;function abortOnCannotGrowMemory(){abort(\"Cannot enlarge memory arrays. Either (1) compile with  -s TOTAL_MEMORY=X  with X higher than the current value \"+TOTAL_MEMORY+\", (2) compile with  -s ALLOW_MEMORY_GROWTH=1  which allows increasing the size at runtime but prevents some optimizations, (3) set Module.TOTAL_MEMORY to a higher value before the program runs, or (4) if you want malloc to return NULL (0) instead of this abort, compile with  -s ABORTING_MALLOC=0 \")}if(!Module[\"reallocBuffer\"])Module[\"reallocBuffer\"]=(function(size){var ret;try{if(ArrayBuffer.transfer){ret=ArrayBuffer.transfer(buffer,size)}else{var oldHEAP8=HEAP8;ret=new ArrayBuffer(size);var temp=new Int8Array(ret);temp.set(oldHEAP8)}}catch(e){return false}var success=_emscripten_replace_memory(ret);if(!success)return false;return ret});function enlargeMemory(){var PAGE_MULTIPLE=Module[\"usingWasm\"]?WASM_PAGE_SIZE:ASMJS_PAGE_SIZE;var LIMIT=2147483648-PAGE_MULTIPLE;if(HEAP32[DYNAMICTOP_PTR>>2]>LIMIT){return false}var OLD_TOTAL_MEMORY=TOTAL_MEMORY;TOTAL_MEMORY=Math.max(TOTAL_MEMORY,MIN_TOTAL_MEMORY);while(TOTAL_MEMORY<HEAP32[DYNAMICTOP_PTR>>2]){if(TOTAL_MEMORY<=536870912){TOTAL_MEMORY=alignUp(2*TOTAL_MEMORY,PAGE_MULTIPLE)}else{TOTAL_MEMORY=Math.min(alignUp((3*TOTAL_MEMORY+2147483648)/4,PAGE_MULTIPLE),LIMIT)}}var replacement=Module[\"reallocBuffer\"](TOTAL_MEMORY);if(!replacement||replacement.byteLength!=TOTAL_MEMORY){TOTAL_MEMORY=OLD_TOTAL_MEMORY;return false}updateGlobalBuffer(replacement);updateGlobalBufferViews();return true}var byteLength;try{byteLength=Function.prototype.call.bind(Object.getOwnPropertyDescriptor(ArrayBuffer.prototype,\"byteLength\").get);byteLength(new ArrayBuffer(4))}catch(e){byteLength=(function(buffer){return buffer.byteLength})}var TOTAL_STACK=Module[\"TOTAL_STACK\"]||5242880;var TOTAL_MEMORY=Module[\"TOTAL_MEMORY\"]||16777216;if(TOTAL_MEMORY<TOTAL_STACK)Module.printErr(\"TOTAL_MEMORY should be larger than TOTAL_STACK, was \"+TOTAL_MEMORY+\"! (TOTAL_STACK=\"+TOTAL_STACK+\")\");if(Module[\"buffer\"]){buffer=Module[\"buffer\"]}else{{buffer=new ArrayBuffer(TOTAL_MEMORY)}Module[\"buffer\"]=buffer}updateGlobalBufferViews();function getTotalMemory(){return TOTAL_MEMORY}HEAP32[0]=1668509029;HEAP16[1]=25459;if(HEAPU8[2]!==115||HEAPU8[3]!==99)throw\"Runtime error: expected the system to be little-endian!\";function callRuntimeCallbacks(callbacks){while(callbacks.length>0){var callback=callbacks.shift();if(typeof callback==\"function\"){callback();continue}var func=callback.func;if(typeof func===\"number\"){if(callback.arg===undefined){Module[\"dynCall_v\"](func)}else{Module[\"dynCall_vi\"](func,callback.arg)}}else{func(callback.arg===undefined?null:callback.arg)}}}var __ATPRERUN__=[];var __ATINIT__=[];var __ATMAIN__=[];var __ATEXIT__=[];var __ATPOSTRUN__=[];var runtimeInitialized=false;var runtimeExited=false;function preRun(){if(Module[\"preRun\"]){if(typeof Module[\"preRun\"]==\"function\")Module[\"preRun\"]=[Module[\"preRun\"]];while(Module[\"preRun\"].length){addOnPreRun(Module[\"preRun\"].shift())}}callRuntimeCallbacks(__ATPRERUN__)}function ensureInitRuntime(){if(runtimeInitialized)return;runtimeInitialized=true;callRuntimeCallbacks(__ATINIT__)}function preMain(){callRuntimeCallbacks(__ATMAIN__)}function exitRuntime(){callRuntimeCallbacks(__ATEXIT__);runtimeExited=true}function postRun(){if(Module[\"postRun\"]){if(typeof Module[\"postRun\"]==\"function\")Module[\"postRun\"]=[Module[\"postRun\"]];while(Module[\"postRun\"].length){addOnPostRun(Module[\"postRun\"].shift())}}callRuntimeCallbacks(__ATPOSTRUN__)}function addOnPreRun(cb){__ATPRERUN__.unshift(cb)}function addOnPreMain(cb){__ATMAIN__.unshift(cb)}function addOnPostRun(cb){__ATPOSTRUN__.unshift(cb)}function writeArrayToMemory(array,buffer){HEAP8.set(array,buffer)}function writeAsciiToMemory(str,buffer,dontAddNull){for(var i=0;i<str.length;++i){HEAP8[buffer++>>0]=str.charCodeAt(i)}if(!dontAddNull)HEAP8[buffer>>0]=0}var Math_abs=Math.abs;var Math_cos=Math.cos;var Math_sin=Math.sin;var Math_tan=Math.tan;var Math_acos=Math.acos;var Math_asin=Math.asin;var Math_atan=Math.atan;var Math_atan2=Math.atan2;var Math_exp=Math.exp;var Math_log=Math.log;var Math_sqrt=Math.sqrt;var Math_ceil=Math.ceil;var Math_floor=Math.floor;var Math_pow=Math.pow;var Math_imul=Math.imul;var Math_fround=Math.fround;var Math_round=Math.round;var Math_min=Math.min;var Math_max=Math.max;var Math_clz32=Math.clz32;var Math_trunc=Math.trunc;var runDependencies=0;var runDependencyWatcher=null;var dependenciesFulfilled=null;function addRunDependency(id){runDependencies++;if(Module[\"monitorRunDependencies\"]){Module[\"monitorRunDependencies\"](runDependencies)}}function removeRunDependency(id){runDependencies--;if(Module[\"monitorRunDependencies\"]){Module[\"monitorRunDependencies\"](runDependencies)}if(runDependencies==0){if(runDependencyWatcher!==null){clearInterval(runDependencyWatcher);runDependencyWatcher=null}if(dependenciesFulfilled){var callback=dependenciesFulfilled;dependenciesFulfilled=null;callback()}}}Module[\"preloadedImages\"]={};Module[\"preloadedAudios\"]={};var memoryInitializer=null;var dataURIPrefix=\"data:application/octet-stream;base64,\";function isDataURI(filename){return String.prototype.startsWith?filename.startsWith(dataURIPrefix):filename.indexOf(dataURIPrefix)===0}STATIC_BASE=GLOBAL_BASE;STATICTOP=STATIC_BASE+19728;__ATINIT__.push();memoryInitializer=\"data:application/octet-stream;base64,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bAAAABIAAAACAAAAAgAAAAIAAAAAAAAASAQAAG4AAABvAAAAfAAAAAAAAABYBAAAbgAAAHAAAAB8AAAATjVkcmFjbzI4QXR0cmlidXRlT2N0YWhlZHJvblRyYW5zZm9ybUUATjVkcmFjbzE4QXR0cmlidXRlVHJhbnNmb3JtRQBONWRyYWNvMzBBdHRyaWJ1dGVRdWFudGl6YXRpb25UcmFuc2Zvcm1FAE41ZHJhY28xN0F0dHJpYnV0ZXNFbmNvZGVyRQBONWRyYWNvMjNLZFRyZWVBdHRyaWJ1dGVzRW5jb2RlckUATjVkcmFjbzI2U2VxdWVudGlhbEF0dHJpYnV0ZUVuY29kZXJFAE41ZHJhY28zN1NlcXVlbnRpYWxBdHRyaWJ1dGVFbmNvZGVyc0NvbnRyb2xsZXJFAE41ZHJhY28yOFByZWRpY3Rpb25TY2hlbWVEZWx0YUVuY29kZXJJaU5TXzM3UHJlZGljdGlvblNjaGVtZVdyYXBFbmNvZGluZ1RyYW5zZm9ybUlpaUVFRUUATjVkcmFjbzIzUHJlZGljdGlvblNjaGVtZUVuY29kZXJJaU5TXzM3UHJlZGljdGlvblNjaGVtZVdyYXBFbmNvZGluZ1RyYW5zZm9ybUlpaUVFRUUATjVkcmFjbzM3UHJlZGljdGlvblNjaGVtZVR5cGVkRW5jb2RlckludGVyZmFjZUlpaUVFAE41ZHJhY28zMlByZWRpY3Rpb25TY2hlbWVFbmNvZGVySW50ZXJmYWNlRQBONWRyYWNvMjVQcmVkaWN0aW9uU2NoZW1lSW50ZXJmYWNlRQBONWRyYWNvNDhNZXNoUHJlZGljdGlvblNjaGVtZUdlb21ldHJpY05vcm1hbFByZWRpY3RvckFyZWFJaU5TXzM3UHJlZGljdGlvblNjaGVtZVdyYXBFbmNvZGluZ1RyYW5zZm9ybUlpaUVFTlNfMjRNZXNoUHJlZGljdGlvblNjaGVtZURhdGFJTlNfMTFDb3JuZXJUYWJsZUVFRUVFAE41ZHJhY280OE1lc2hQcmVkaWN0aW9uU2NoZW1lR2VvbWV0cmljTm9ybWFsUHJlZGljdG9yQmFzZUlpTlNfMzdQcmVkaWN0aW9uU2NoZW1lV3JhcEVuY29kaW5nVHJhbnNmb3JtSWlpRUVOU18yNE1lc2hQcmVkaWN0aW9uU2NoZW1lRGF0YUlOU18xMUNvcm5lclRhYmxlRUVFRUUATjVkcmFjbzQyTWVzaFByZWRpY3Rpb25TY2hlbWVHZW9tZXRyaWNOb3JtYWxFbmNvZGVySWlOU18zN1ByZWRpY3Rpb25TY2hlbWVXcmFwRW5jb2RpbmdUcmFuc2Zvcm1JaWlFRU5TXzI0TWVzaFByZWRpY3Rpb25TY2hlbWVEYXRhSU5TXzExQ29ybmVyVGFibGVFRUVFRQBONWRyYWNvMjdNZXNoUHJlZGljdGlvblNjaGVtZUVuY29kZXJJaU5TXzM3UHJlZGljdGlvblNjaGVtZVdyYXBFbmNvZGluZ1RyYW5zZm9ybUlpaUVFTlNfMjRNZXNoUHJlZGljdGlvblNjaGVtZURhdGFJTlNfMTFDb3JuZXJUYWJsZUVFRUVFAE41ZHJhY280NE1lc2hQcmVkaWN0aW9uU2NoZW1lVGV4Q29vcmRzUG9ydGFibGVFbmNvZGVySWlOU18zN1ByZWRpY3Rpb25TY2hlbWVXcmFwRW5jb2RpbmdUcmFuc2Zvcm1JaWlFRU5TXzI0TWVzaFByZWRpY3Rpb25TY2hlbWVEYXRhSU5TXzExQ29ybmVyVGFibGVFRUVFRQBONWRyYWNvMzZNZXNoUHJlZGljdGlvblNjaGVtZVRleENvb3Jkc0VuY29kZXJJaU5TXzM3UHJlZGljdGlvblNjaGVtZVdyYXBFbmNvZGluZ1RyYW5zZm9ybUlpaUVFTlNfMjRNZXNoUHJlZGljdGlvblNjaGVtZURhdGFJTlNfMTFDb3JuZXJUYWJsZUVFRUVFAE41ZHJhY281Nk1lc2hQcmVkaWN0aW9uU2NoZW1lQ29uc3RyYWluZWRNdWx0aVBhcmFsbGVsb2dyYW1FbmNvZGVySWlOU18zN1ByZWRpY3Rpb25TY2hlbWVXcmFwRW5jb2RpbmdUcmFuc2Zvcm1JaWlFRU5TXzI0TWVzaFByZWRpY3Rpb25TY2hlbWVEYXRhSU5TXzExQ29ybmVyVGFibGVFRUVFRQBONWRyYWNvNDVNZXNoUHJlZGljdGlvblNjaGVtZU11bHRpUGFyYWxsZWxvZ3JhbUVuY29kZXJJaU5TXzM3UHJlZGljdGlvblNjaGVtZVdyYXBFbmNvZGluZ1RyYW5zZm9ybUlpaUVFTlNfMjRNZXNoUHJlZGljdGlvblNjaGVtZURhdGFJTlNfMTFDb3JuZXJUYWJsZUVFRUVFAE41ZHJhY280ME1lc2hQcmVkaWN0aW9uU2NoZW1lUGFyYWxsZWxvZ3JhbUVuY29kZXJJaU5TXzM3UHJlZGljdGlvblNjaGVtZVdyYXBFbmNvZGluZ1RyYW5zZm9ybUlpaUVFTlNfMjRNZXNoUHJlZGljdGlvblNjaGVtZURhdGFJTlNfMTFDb3JuZXJUYWJsZUVFRUVFAE41ZHJhY280OE1lc2hQcmVkaWN0aW9uU2NoZW1lR2VvbWV0cmljTm9ybWFsUHJlZGljdG9yQXJlYUlpTlNfMzdQcmVkaWN0aW9uU2NoZW1lV3JhcEVuY29kaW5nVHJhbnNmb3JtSWlpRUVOU18yNE1lc2hQcmVkaWN0aW9uU2NoZW1lRGF0YUlOU18yNE1lc2hBdHRyaWJ1dGVDb3JuZXJUYWJsZUVFRUVFAE41ZHJhY280OE1lc2hQcmVkaWN0aW9uU2NoZW1lR2VvbWV0cmljTm9ybWFsUHJlZGljdG9yQmFzZUlpTlNfMzdQcmVkaWN0aW9uU2NoZW1lV3JhcEVuY29kaW5nVHJhbnNmb3JtSWlpRUVOU18yNE1lc2hQcmVkaWN0aW9uU2NoZW1lRGF0YUlOU18yNE1lc2hBdHRyaWJ1dGVDb3JuZXJUYWJsZUVFRUVFAE41ZHJhY280Mk1lc2hQcmVkaWN0aW9uU2NoZW1lR2VvbWV0cmljTm9ybWFsRW5jb2RlcklpTlNfMzdQcmVkaWN0aW9uU2NoZW1lV3JhcEVuY29kaW5nVHJhbnNmb3JtSWlpRUVOU18yNE1lc2hQcmVkaWN0aW9uU2NoZW1lRGF0YUlOU18yNE1lc2hBdHRyaWJ1dGVDb3JuZXJUYWJsZUVFRUVFAE41ZHJhY28yN01lc2hQcmVkaWN0aW9uU2NoZW1lRW5jb2RlcklpTlNfMzdQcmVkaWN0aW9uU2NoZW1lV3JhcEVuY29kaW5nVHJhbnNmb3JtSWlpRUVOU18yNE1lc2hQcmVkaWN0aW9uU2NoZW1lRGF0YUlOU18yNE1lc2hBdHRyaWJ1dGVDb3JuZXJUYWJsZUVFRUVFAE41ZHJhY280NE1lc2hQcmVkaWN0aW9uU2NoZW1lVGV4Q29vcmRzUG9ydGFibGVFbmNvZGVySWlOU18zN1ByZWRpY3Rpb25TY2hlbWVXcmFwRW5jb2RpbmdUcmFuc2Zvcm1JaWlFRU5TXzI0TWVzaFByZWRpY3Rpb25TY2hlbWVEYXRhSU5TXzI0TWVzaEF0dHJpYnV0ZUNvcm5lclRhYmxlRUVFRUUATjVkcmFjbzM2TWVzaFByZWRpY3Rpb25TY2hlbWVUZXhDb29yZHNFbmNvZGVySWlOU18zN1ByZWRpY3Rpb25TY2hlbWVXcmFwRW5jb2RpbmdUcmFuc2Zvcm1JaWlFRU5TXzI0TWVzaFByZWRpY3Rpb25TY2hlbWVEYXRhSU5TXzI0TWVzaEF0dHJpYnV0ZUNvcm5lclRhYmxlRUVFRUUATjVkcmFjbzU2TWVzaFByZWRpY3Rpb25TY2hlbWVDb25zdHJhaW5lZE11bHRpUGFyYWxsZWxvZ3JhbUVuY29kZXJJaU5TXzM3UHJlZGljdGlvblNjaGVtZVdyYXBFbmNvZGluZ1RyYW5zZm9ybUlpaUVFTlNfMjRNZXNoUHJlZGljdGlvblNjaGVtZURhdGFJTlNfMjRNZXNoQXR0cmlidXRlQ29ybmVyVGFibGVFRUVFRQBONWRyYWNvNDVNZXNoUHJlZGljdGlvblNjaGVtZU11bHRpUGFyYWxsZWxvZ3JhbUVuY29kZXJJaU5TXzM3UHJlZGljdGlvblNjaGVtZVdyYXBFbmNvZGluZ1RyYW5zZm9ybUlpaUVFTlNfMjRNZXNoUHJlZGljdGlvblNjaGVtZURhdGFJTlNfMjRNZXNoQXR0cmlidXRlQ29ybmVyVGFibGVFRUVFRQBONWRyYWNvNDBNZXNoUHJlZGljdGlvblNjaGVtZVBhcmFsbGVsb2dyYW1FbmNvZGVySWlOU18zN1ByZWRpY3Rpb25TY2hlbWVXcmFwRW5jb2RpbmdUcmFuc2Zvcm1JaWlFRU5TXzI0TWVzaFByZWRpY3Rpb25TY2hlbWVEYXRhSU5TXzI0TWVzaEF0dHJpYnV0ZUNvcm5lclRhYmxlRUVFRUUAdXNlX2J1aWx0X2luX2F0dHJpYnV0ZV9jb21wcmVzc2lvbgBONWRyYWNvMzNTZXF1ZW50aWFsSW50ZWdlckF0dHJpYnV0ZUVuY29kZXJFAE41ZHJhY28yOFByZWRpY3Rpb25TY2hlbWVEZWx0YUVuY29kZXJJaU5TXzYyUHJlZGljdGlvblNjaGVtZU5vcm1hbE9jdGFoZWRyb25DYW5vbmljYWxpemVkRW5jb2RpbmdUcmFuc2Zvcm1JaUVFRUUATjVkcmFjbzIzUHJlZGljdGlvblNjaGVtZUVuY29kZXJJaU5TXzYyUHJlZGljdGlvblNjaGVtZU5vcm1hbE9jdGFoZWRyb25DYW5vbmljYWxpemVkRW5jb2RpbmdUcmFuc2Zvcm1JaUVFRUUATjVkcmFjbzQ4TWVzaFByZWRpY3Rpb25TY2hlbWVHZW9tZXRyaWNOb3JtYWxQcmVkaWN0b3JBcmVhSWlOU182MlByZWRpY3Rpb25TY2hlbWVOb3JtYWxPY3RhaGVkcm9uQ2Fub25pY2FsaXplZEVuY29kaW5nVHJhbnNmb3JtSWlFRU5TXzI0TWVzaFByZWRpY3Rpb25TY2hlbWVEYXRhSU5TXzExQ29ybmVyVGFibGVFRUVFRQBONWRyYWNvNDhNZXNoUHJlZGljdGlvblNjaGVtZUdlb21ldHJpY05vcm1hbFByZWRpY3RvckJhc2VJaU5TXzYyUHJlZGljdGlvblNjaGVtZU5vcm1hbE9jdGFoZWRyb25DYW5vbmljYWxpemVkRW5jb2RpbmdUcmFuc2Zvcm1JaUVFTlNfMjRNZXNoUHJlZGljdGlvblNjaGVtZURhdGFJTlNfMTFDb3JuZXJUYWJsZUVFRUVFAE41ZHJhY280Mk1lc2hQcmVkaWN0aW9uU2NoZW1lR2VvbWV0cmljTm9ybWFsRW5jb2RlcklpTlNfNjJQcmVkaWN0aW9uU2NoZW1lTm9ybWFsT2N0YWhlZHJvbkNhbm9uaWNhbGl6ZWRFbmNvZGluZ1RyYW5zZm9ybUlpRUVOU18yNE1lc2hQcmVkaWN0aW9uU2NoZW1lRGF0YUlOU18xMUNvcm5lclRhYmxlRUVFRUUATjVkcmFjbzI3TWVzaFByZWRpY3Rpb25TY2hlbWVFbmNvZGVySWlOU182MlByZWRpY3Rpb25TY2hlbWVOb3JtYWxPY3RhaGVkcm9uQ2Fub25pY2FsaXplZEVuY29kaW5nVHJhbnNmb3JtSWlFRU5TXzI0TWVzaFByZWRpY3Rpb25TY2hlbWVEYXRhSU5TXzExQ29ybmVyVGFibGVFRUVFRQBONWRyYWNvNDRNZXNoUHJlZGljdGlvblNjaGVtZVRleENvb3Jkc1BvcnRhYmxlRW5jb2RlcklpTlNfNjJQcmVkaWN0aW9uU2NoZW1lTm9ybWFsT2N0YWhlZHJvbkNhbm9uaWNhbGl6ZWRFbmNvZGluZ1RyYW5zZm9ybUlpRUVOU18yNE1lc2hQcmVkaWN0aW9uU2NoZW1lRGF0YUlOU18xMUNvcm5lclRhYmxlRUVFRUUATjVkcmFjbzM2TWVzaFByZWRpY3Rpb25TY2hlbWVUZXhDb29yZHNFbmNvZGVySWlOU182MlByZWRpY3Rpb25TY2hlbWVOb3JtYWxPY3RhaGVkcm9uQ2Fub25pY2FsaXplZEVuY29kaW5nVHJhbnNmb3JtSWlFRU5TXzI0TWVzaFByZWRpY3Rpb25TY2hlbWVEYXRhSU5TXzExQ29ybmVyVGFibGVFRUVFRQBONWRyYWNvNTZNZXNoUHJlZGljdGlvblNjaGVtZUNvbnN0cmFpbmVkTXVsdGlQYXJhbGxlbG9ncmFtRW5jb2RlcklpTlNfNjJQcmVkaWN0aW9uU2NoZW1lTm9ybWFsT2N0YWhlZHJvbkNhbm9uaWNhbGl6ZWRFbmNvZGluZ1RyYW5zZm9ybUlpRUVOU18yNE1lc2hQcmVkaWN0aW9uU2NoZW1lRGF0YUlOU18xMUNvcm5lclRhYmxlRUVFRUUATjVkcmFjbzQ1TWVzaFByZWRpY3Rpb25TY2hlbWVNdWx0aVBhcmFsbGVsb2dyYW1FbmNvZGVySWlOU182MlByZWRpY3Rpb25TY2hlbWVOb3JtYWxPY3RhaGVkcm9uQ2Fub25pY2FsaXplZEVuY29kaW5nVHJhbnNmb3JtSWlFRU5TXzI0TWVzaFByZWRpY3Rpb25TY2hlbWVEYXRhSU5TXzExQ29ybmVyVGFibGVFRUVFRQBONWRyYWNvNDBNZXNoUHJlZGljdGlvblNjaGVtZVBhcmFsbGVsb2dyYW1FbmNvZGVySWlOU182MlByZWRpY3Rpb25TY2hlbWVOb3JtYWxPY3RhaGVkcm9uQ2Fub25pY2FsaXplZEVuY29kaW5nVHJhbnNmb3JtSWlFRU5TXzI0TWVzaFByZWRpY3Rpb25TY2hlbWVEYXRhSU5TXzExQ29ybmVyVGFibGVFRUVFRQBONWRyYWNvNDhNZXNoUHJlZGljdGlvblNjaGVtZUdlb21ldHJpY05vcm1hbFByZWRpY3RvckFyZWFJaU5TXzYyUHJlZGljdGlvblNjaGVtZU5vcm1hbE9jdGFoZWRyb25DYW5vbmljYWxpemVkRW5jb2RpbmdUcmFuc2Zvcm1JaUVFTlNfMjRNZXNoUHJlZGljdGlvblNjaGVtZURhdGFJTlNfMjRNZXNoQXR0cmlidXRlQ29ybmVyVGFibGVFRUVFRQBONWRyYWNvNDhNZXNoUHJlZGljdGlvblNjaGVtZUdlb21ldHJpY05vcm1hbFByZWRpY3RvckJhc2VJaU5TXzYyUHJlZGljdGlvblNjaGVtZU5vcm1hbE9jdGFoZWRyb25DYW5vbmljYWxpemVkRW5jb2RpbmdUcmFuc2Zvcm1JaUVFTlNfMjRNZXNoUHJlZGljdGlvblNjaGVtZURhdGFJTlNfMjRNZXNoQXR0cmlidXRlQ29ybmVyVGFibGVFRUVFRQBONWRyYWNvNDJNZXNoUHJlZGljdGlvblNjaGVtZUdlb21ldHJpY05vcm1hbEVuY29kZXJJaU5TXzYyUHJlZGljdGlvblNjaGVtZU5vcm1hbE9jdGFoZWRyb25DYW5vbmljYWxpemVkRW5jb2RpbmdUcmFuc2Zvcm1JaUVFTlNfMjRNZXNoUHJlZGljdGlvblNjaGVtZURhdGFJTlNfMjRNZXNoQXR0cmlidXRlQ29ybmVyVGFibGVFRUVFRQBONWRyYWNvMjdNZXNoUHJlZGljdGlvblNjaGVtZUVuY29kZXJJaU5TXzYyUHJlZGljdGlvblNjaGVtZU5vcm1hbE9jdGFoZWRyb25DYW5vbmljYWxpemVkRW5jb2RpbmdUcmFuc2Zvcm1JaUVFTlNfMjRNZXNoUHJlZGljdGlvblNjaGVtZURhdGFJTlNfMjRNZXNoQXR0cmlidXRlQ29ybmVyVGFibGVFRUVFRQBONWRyYWNvNDRNZXNoUHJlZGljdGlvblNjaGVtZVRleENvb3Jkc1BvcnRhYmxlRW5jb2RlcklpTlNfNjJQcmVkaWN0aW9uU2NoZW1lTm9ybWFsT2N0YWhlZHJvbkNhbm9uaWNhbGl6ZWRFbmNvZGluZ1RyYW5zZm9ybUlpRUVOU18yNE1lc2hQcmVkaWN0aW9uU2NoZW1lRGF0YUlOU18yNE1lc2hBdHRyaWJ1dGVDb3JuZXJUYWJsZUVFRUVFAE41ZHJhY28zNk1lc2hQcmVkaWN0aW9uU2NoZW1lVGV4Q29vcmRzRW5jb2RlcklpTlNfNjJQcmVkaWN0aW9uU2NoZW1lTm9ybWFsT2N0YWhlZHJvbkNhbm9uaWNhbGl6ZWRFbmNvZGluZ1RyYW5zZm9ybUlpRUVOU18yNE1lc2hQcmVkaWN0aW9uU2NoZW1lRGF0YUlOU18yNE1lc2hBdHRyaWJ1dGVDb3JuZXJUYWJsZUVFRUVFAE41ZHJhY281Nk1lc2hQcmVkaWN0aW9uU2NoZW1lQ29uc3RyYWluZWRNdWx0aVBhcmFsbGVsb2dyYW1FbmNvZGVySWlOU182MlByZWRpY3Rpb25TY2hlbWVOb3JtYWxPY3RhaGVkcm9uQ2Fub25pY2FsaXplZEVuY29kaW5nVHJhbnNmb3JtSWlFRU5TXzI0TWVzaFByZWRpY3Rpb25TY2hlbWVEYXRhSU5TXzI0TWVzaEF0dHJpYnV0ZUNvcm5lclRhYmxlRUVFRUUATjVkcmFjbzQ1TWVzaFByZWRpY3Rpb25TY2hlbWVNdWx0aVBhcmFsbGVsb2dyYW1FbmNvZGVySWlOU182MlByZWRpY3Rpb25TY2hlbWVOb3JtYWxPY3RhaGVkcm9uQ2Fub25pY2FsaXplZEVuY29kaW5nVHJhbnNmb3JtSWlFRU5TXzI0TWVzaFByZWRpY3Rpb25TY2hlbWVEYXRhSU5TXzI0TWVzaEF0dHJpYnV0ZUNvcm5lclRhYmxlRUVFRUUATjVkcmFjbzQwTWVzaFByZWRpY3Rpb25TY2hlbWVQYXJhbGxlbG9ncmFtRW5jb2RlcklpTlNfNjJQcmVkaWN0aW9uU2NoZW1lTm9ybWFsT2N0YWhlZHJvbkNhbm9uaWNhbGl6ZWRFbmNvZGluZ1RyYW5zZm9ybUlpRUVOU18yNE1lc2hQcmVkaWN0aW9uU2NoZW1lRGF0YUlOU18yNE1lc2hBdHRyaWJ1dGVDb3JuZXJUYWJsZUVFRUVFAE41ZHJhY28zMlNlcXVlbnRpYWxOb3JtYWxBdHRyaWJ1dGVFbmNvZGVyRQBONWRyYWNvMzhTZXF1ZW50aWFsUXVhbnRpemF0aW9uQXR0cmlidXRlRW5jb2RlckUAcHJlZGljdGlvbl9zY2hlbWUAZW5jb2Rpbmdfc3BlZWQAZGVjb2Rpbmdfc3BlZWQAcXVhbnRpemF0aW9uX29yaWdpbgBxdWFudGl6YXRpb25fcmFuZ2UAIABlbmNvZGluZ19tZXRob2QAcXVhbnRpemF0aW9uX2JpdHMASW52YWxpZCBlbmNvZGluZyBtZXRob2QuAHN0YW5kYXJkX2VkZ2VicmVha2VyAHByZWRpY3RpdmVfZWRnZWJyZWFrZXIAZWRnZWJyZWFrZXJfbWV0aG9kAE41ZHJhY28yMk1lc2hFZGdlQnJlYWtlckVuY29kZXJFAE41ZHJhY28yOUNvcm5lclRhYmxlVHJhdmVyc2FsUHJvY2Vzc29ySU5TXzI0TWVzaEF0dHJpYnV0ZUNvcm5lclRhYmxlRUVFAE41ZHJhY28yMk1lc2hUcmF2ZXJzYWxTZXF1ZW5jZXJJTlNfMjBFZGdlQnJlYWtlclRyYXZlcnNlcklOU18yOUNvcm5lclRhYmxlVHJhdmVyc2FsUHJvY2Vzc29ySU5TXzI0TWVzaEF0dHJpYnV0ZUNvcm5lclRhYmxlRUVFTlNfMzZNZXNoQXR0cmlidXRlSW5kaWNlc0VuY29kaW5nT2JzZXJ2ZXJJUzNfRUVOU18xOUVkZ2VCcmVha2VyT2JzZXJ2ZXJFRUVFRQBONWRyYWNvMTVQb2ludHNTZXF1ZW5jZXJFAE41ZHJhY28yOUNvcm5lclRhYmxlVHJhdmVyc2FsUHJvY2Vzc29ySU5TXzExQ29ybmVyVGFibGVFRUUATjVkcmFjbzIyTWVzaFRyYXZlcnNhbFNlcXVlbmNlcklOU18yMEVkZ2VCcmVha2VyVHJhdmVyc2VySU5TXzI5Q29ybmVyVGFibGVUcmF2ZXJzYWxQcm9jZXNzb3JJTlNfMTFDb3JuZXJUYWJsZUVFRU5TXzM2TWVzaEF0dHJpYnV0ZUluZGljZXNFbmNvZGluZ09ic2VydmVySVMzX0VFTlNfMTlFZGdlQnJlYWtlck9ic2VydmVyRUVFRUUATjVkcmFjbzIyTWVzaFRyYXZlcnNhbFNlcXVlbmNlcklOU18yNVByZWRpY3Rpb25EZWdyZWVUcmF2ZXJzZXJJTlNfMjlDb3JuZXJUYWJsZVRyYXZlcnNhbFByb2Nlc3NvcklOU18xMUNvcm5lclRhYmxlRUVFTlNfMzZNZXNoQXR0cmlidXRlSW5kaWNlc0VuY29kaW5nT2JzZXJ2ZXJJUzNfRUVFRUVFAHNwbGl0X21lc2hfb25fc2VhbXMATjVkcmFjbzI2TWVzaEVkZ2VCcmVha2VyRW5jb2RlckltcGxJTlNfMzFNZXNoRWRnZUJyZWFrZXJUcmF2ZXJzYWxFbmNvZGVyRUVFAE41ZHJhY28zNU1lc2hFZGdlQnJlYWtlckVuY29kZXJJbXBsSW50ZXJmYWNlRQBONWRyYWNvMjZNZXNoRWRnZUJyZWFrZXJFbmNvZGVySW1wbElOU18zOE1lc2hFZGdlQnJlYWtlclRyYXZlcnNhbFZhbGVuY2VFbmNvZGVyRUVFAE41ZHJhY28xMU1lc2hFbmNvZGVyRQBjb21wcmVzc19jb25uZWN0aXZpdHkATjVkcmFjbzE1TGluZWFyU2VxdWVuY2VyRQBONWRyYWNvMjFNZXNoU2VxdWVudGlhbEVuY29kZXJFAE41ZHJhY28xN1BvaW50Q2xvdWRFbmNvZGVyRQBJbnZhbGlkIGlucHV0IGdlb21ldHJ5LgBGYWlsZWQgdG8gaW5pdGlhbGl6ZSBlbmNvZGVyLgBGYWlsZWQgdG8gZW5jb2RlIGludGVybmFsIGRhdGEuAEZhaWxlZCB0byBlbmNvZGUgZ2VvbWV0cnkgZGF0YS4ARmFpbGVkIHRvIGVuY29kZSBwb2ludCBhdHRyaWJ1dGVzLgBGYWlsZWQgdG8gZW5jb2RlIG1ldGFkYXRhLgBEUkFDTwBONWRyYWNvMjNQb2ludENsb3VkS2RUcmVlRW5jb2RlckUATjVkcmFjbzI3UG9pbnRDbG91ZFNlcXVlbnRpYWxFbmNvZGVyRQBzeW1ib2xfZW5jb2RpbmdfbWV0aG9kAHN5bWJvbF9lbmNvZGluZ19jb21wcmVzc2lvbl9sZXZlbABONWRyYWNvNE1lc2hFAGFsbG9jYXRvcjxUPjo6YWxsb2NhdGUoc2l6ZV90IG4pICduJyBleGNlZWRzIG1heGltdW0gc3VwcG9ydGVkIHNpemUATjVkcmFjbzEwUG9pbnRDbG91ZEUAEQAKABEREQAAAAAFAAAAAAAACQAAAAALAAAAAAAAAAARAA8KERERAwoHAAETCQsLAAAJBgsAAAsABhEAAAAREREAAAAAAAAAAAAAAAAAAAAACwAAAAAAAAAAEQAKChEREQAKAAACAAkLAAAACQALAAALAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAAAAAAAAAwAAAAADAAAAAAJDAAAAAAADAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOAAAAAAAAAAAAAAANAAAABA0AAAAACQ4AAAAAAA4AAA4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAADwAAAAAPAAAAAAkQAAAAAAAQAAAQAAASAAAAEhISAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABIAAAASEhIAAAAAAAAJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALAAAAAAAAAAAAAAAKAAAAAAoAAAAACQsAAAAAAAsAAAsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAAAAAAAAAAADAAAAAAMAAAAAAkMAAAAAAAMAAAMAAAtKyAgIDBYMHgAKG51bGwpAC0wWCswWCAwWC0weCsweCAweABpbmYASU5GAE5BTgAwMTIzNDU2Nzg5QUJDREVGLgBUISIZDQECAxFLHAwQBAsdEh4naG5vcHFiIAUGDxMUFRoIFgcoJBcYCQoOGx8lI4OCfSYqKzw9Pj9DR0pNWFlaW1xdXl9gYWNkZWZnaWprbHJzdHl6e3wASWxsZWdhbCBieXRlIHNlcXVlbmNlAERvbWFpbiBlcnJvcgBSZXN1bHQgbm90IHJlcHJlc2VudGFibGUATm90IGEgdHR5AFBlcm1pc3Npb24gZGVuaWVkAE9wZXJhdGlvbiBub3QgcGVybWl0dGVkAE5vIHN1Y2ggZmlsZSBvciBkaXJlY3RvcnkATm8gc3VjaCBwcm9jZXNzAEZpbGUgZXhpc3RzAFZhbHVlIHRvbyBsYXJnZSBmb3IgZGF0YSB0eXBlAE5vIHNwYWNlIGxlZnQgb24gZGV2aWNlAE91dCBvZiBtZW1vcnkAUmVzb3VyY2UgYnVzeQBJbnRlcnJ1cHRlZCBzeXN0ZW0gY2FsbABSZXNvdXJjZSB0ZW1wb3JhcmlseSB1bmF2YWlsYWJsZQBJbnZhbGlkIHNlZWsAQ3Jvc3MtZGV2aWNlIGxpbmsAUmVhZC1vbmx5IGZpbGUgc3lzdGVtAERpcmVjdG9yeSBub3QgZW1wdHkAQ29ubmVjdGlvbiByZXNldCBieSBwZWVyAE9wZXJhdGlvbiB0aW1lZCBvdXQAQ29ubmVjdGlvbiByZWZ1c2VkAEhvc3QgaXMgZG93bgBIb3N0IGlzIHVucmVhY2hhYmxlAEFkZHJlc3MgaW4gdXNlAEJyb2tlbiBwaXBlAEkvTyBlcnJvcgBObyBzdWNoIGRldmljZSBvciBhZGRyZXNzAEJsb2NrIGRldmljZSByZXF1aXJlZABObyBzdWNoIGRldmljZQBOb3QgYSBkaXJlY3RvcnkASXMgYSBkaXJlY3RvcnkAVGV4dCBmaWxlIGJ1c3kARXhlYyBmb3JtYXQgZXJyb3IASW52YWxpZCBhcmd1bWVudABBcmd1bWVudCBsaXN0IHRvbyBsb25nAFN5bWJvbGljIGxpbmsgbG9vcABGaWxlbmFtZSB0b28gbG9uZwBUb28gbWFueSBvcGVuIGZpbGVzIGluIHN5c3RlbQBObyBmaWxlIGRlc2NyaXB0b3JzIGF2YWlsYWJsZQBCYWQgZmlsZSBkZXNjcmlwdG9yAE5vIGNoaWxkIHByb2Nlc3MAQmFkIGFkZHJlc3MARmlsZSB0b28gbGFyZ2UAVG9vIG1hbnkgbGlua3MATm8gbG9ja3MgYXZhaWxhYmxlAFJlc291cmNlIGRlYWRsb2NrIHdvdWxkIG9jY3VyAFN0YXRlIG5vdCByZWNvdmVyYWJsZQBQcmV2aW91cyBvd25lciBkaWVkAE9wZXJhdGlvbiBjYW5jZWxlZABGdW5jdGlvbiBub3QgaW1wbGVtZW50ZWQATm8gbWVzc2FnZSBvZiBkZXNpcmVkIHR5cGUASWRlbnRpZmllciByZW1vdmVkAERldmljZSBub3QgYSBzdHJlYW0ATm8gZGF0YSBhdmFpbGFibGUARGV2aWNlIHRpbWVvdXQAT3V0IG9mIHN0cmVhbXMgcmVzb3VyY2VzAExpbmsgaGFzIGJlZW4gc2V2ZXJlZABQcm90b2NvbCBlcnJvcgBCYWQgbWVzc2FnZQBGaWxlIGRlc2NyaXB0b3IgaW4gYmFkIHN0YXRlAE5vdCBhIHNvY2tldABEZXN0aW5hdGlvbiBhZGRyZXNzIHJlcXVpcmVkAE1lc3NhZ2UgdG9vIGxhcmdlAFByb3RvY29sIHdyb25nIHR5cGUgZm9yIHNvY2tldABQcm90b2NvbCBub3QgYXZhaWxhYmxlAFByb3RvY29sIG5vdCBzdXBwb3J0ZWQAU29ja2V0IHR5cGUgbm90IHN1cHBvcnRlZABOb3Qgc3VwcG9ydGVkAFByb3RvY29sIGZhbWlseSBub3Qgc3VwcG9ydGVkAEFkZHJlc3MgZmFtaWx5IG5vdCBzdXBwb3J0ZWQgYnkgcHJvdG9jb2wAQWRkcmVzcyBub3QgYXZhaWxhYmxlAE5ldHdvcmsgaXMgZG93bgBOZXR3b3JrIHVucmVhY2hhYmxlAENvbm5lY3Rpb24gcmVzZXQgYnkgbmV0d29yawBDb25uZWN0aW9uIGFib3J0ZWQATm8gYnVmZmVyIHNwYWNlIGF2YWlsYWJsZQBTb2NrZXQgaXMgY29ubmVjdGVkAFNvY2tldCBub3QgY29ubmVjdGVkAENhbm5vdCBzZW5kIGFmdGVyIHNvY2tldCBzaHV0ZG93bgBPcGVyYXRpb24gYWxyZWFkeSBpbiBwcm9ncmVzcwBPcGVyYXRpb24gaW4gcHJvZ3Jlc3MAU3RhbGUgZmlsZSBoYW5kbGUAUmVtb3RlIEkvTyBlcnJvcgBRdW90YSBleGNlZWRlZABObyBtZWRpdW0gZm91bmQAV3JvbmcgbWVkaXVtIHR5cGUATm8gZXJyb3IgaW5mb3JtYXRpb24AAGluZmluaXR5AG5hbgAlZAAlZgB0ZXJtaW5hdGluZyB3aXRoICVzIGV4Y2VwdGlvbiBvZiB0eXBlICVzOiAlcwB0ZXJtaW5hdGluZyB3aXRoICVzIGV4Y2VwdGlvbiBvZiB0eXBlICVzAHRlcm1pbmF0aW5nIHdpdGggJXMgZm9yZWlnbiBleGNlcHRpb24AdGVybWluYXRpbmcAdW5jYXVnaHQAU3Q5ZXhjZXB0aW9uAE4xMF9fY3h4YWJpdjExNl9fc2hpbV90eXBlX2luZm9FAFN0OXR5cGVfaW5mbwBOMTBfX2N4eGFiaXYxMjBfX3NpX2NsYXNzX3R5cGVfaW5mb0UATjEwX19jeHhhYml2MTE3X19jbGFzc190eXBlX2luZm9FAHB0aHJlYWRfb25jZSBmYWlsdXJlIGluIF9fY3hhX2dldF9nbG9iYWxzX2Zhc3QoKQBjYW5ub3QgY3JlYXRlIHB0aHJlYWQga2V5IGZvciBfX2N4YV9nZXRfZ2xvYmFscygpAGNhbm5vdCB6ZXJvIG91dCB0aHJlYWQgdmFsdWUgZm9yIF9fY3hhX2dldF9nbG9iYWxzKCkAdGVybWluYXRlX2hhbmRsZXIgdW5leHBlY3RlZGx5IHJldHVybmVkAFN0MTFsb2dpY19lcnJvcgBTdDEybGVuZ3RoX2Vycm9yAE4xMF9fY3h4YWJpdjExOV9fcG9pbnRlcl90eXBlX2luZm9FAE4xMF9fY3h4YWJpdjExN19fcGJhc2VfdHlwZV9pbmZvRQ==\";var tempDoublePtr=STATICTOP;STATICTOP+=16;function ___cxa_allocate_exception(size){return _malloc(size)}function __ZSt18uncaught_exceptionv(){return!!__ZSt18uncaught_exceptionv.uncaught_exception}var EXCEPTIONS={last:0,caught:[],infos:{},deAdjust:(function(adjusted){if(!adjusted||EXCEPTIONS.infos[adjusted])return adjusted;for(var ptr in EXCEPTIONS.infos){var info=EXCEPTIONS.infos[ptr];if(info.adjusted===adjusted){return ptr}}return adjusted}),addRef:(function(ptr){if(!ptr)return;var info=EXCEPTIONS.infos[ptr];info.refcount++}),decRef:(function(ptr){if(!ptr)return;var info=EXCEPTIONS.infos[ptr];assert(info.refcount>0);info.refcount--;if(info.refcount===0&&!info.rethrown){if(info.destructor){Module[\"dynCall_vi\"](info.destructor,ptr)}delete EXCEPTIONS.infos[ptr];___cxa_free_exception(ptr)}}),clearRef:(function(ptr){if(!ptr)return;var info=EXCEPTIONS.infos[ptr];info.refcount=0})};function ___cxa_begin_catch(ptr){var info=EXCEPTIONS.infos[ptr];if(info&&!info.caught){info.caught=true;__ZSt18uncaught_exceptionv.uncaught_exception--}if(info)info.rethrown=false;EXCEPTIONS.caught.push(ptr);EXCEPTIONS.addRef(EXCEPTIONS.deAdjust(ptr));return ptr}function ___cxa_pure_virtual(){ABORT=true;throw\"Pure virtual function called!\"}function ___resumeException(ptr){if(!EXCEPTIONS.last){EXCEPTIONS.last=ptr}throw ptr+\" - Exception catching is disabled, this exception cannot be caught. Compile with -s DISABLE_EXCEPTION_CATCHING=0 or DISABLE_EXCEPTION_CATCHING=2 to catch.\"}function ___cxa_find_matching_catch(){var thrown=EXCEPTIONS.last;if(!thrown){return(setTempRet0(0),0)|0}var info=EXCEPTIONS.infos[thrown];var throwntype=info.type;if(!throwntype){return(setTempRet0(0),thrown)|0}var typeArray=Array.prototype.slice.call(arguments);var pointer=Module[\"___cxa_is_pointer_type\"](throwntype);if(!___cxa_find_matching_catch.buffer)___cxa_find_matching_catch.buffer=_malloc(4);HEAP32[___cxa_find_matching_catch.buffer>>2]=thrown;thrown=___cxa_find_matching_catch.buffer;for(var i=0;i<typeArray.length;i++){if(typeArray[i]&&Module[\"___cxa_can_catch\"](typeArray[i],throwntype,thrown)){thrown=HEAP32[thrown>>2];info.adjusted=thrown;return(setTempRet0(typeArray[i]),thrown)|0}}thrown=HEAP32[thrown>>2];return(setTempRet0(throwntype),thrown)|0}function ___cxa_throw(ptr,type,destructor){EXCEPTIONS.infos[ptr]={ptr:ptr,adjusted:ptr,type:type,destructor:destructor,refcount:0,caught:false,rethrown:false};EXCEPTIONS.last=ptr;if(!(\"uncaught_exception\"in __ZSt18uncaught_exceptionv)){__ZSt18uncaught_exceptionv.uncaught_exception=1}else{__ZSt18uncaught_exceptionv.uncaught_exception++}throw ptr+\" - Exception catching is disabled, this exception cannot be caught. Compile with -s DISABLE_EXCEPTION_CATCHING=0 or DISABLE_EXCEPTION_CATCHING=2 to catch.\"}var cttz_i8=allocate([8,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,6,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,7,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,6,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0],\"i8\",ALLOC_STATIC);function ___gxx_personality_v0(){}var SYSCALLS={varargs:0,get:(function(varargs){SYSCALLS.varargs+=4;var ret=HEAP32[SYSCALLS.varargs-4>>2];return ret}),getStr:(function(){var ret=Pointer_stringify(SYSCALLS.get());return ret}),get64:(function(){var low=SYSCALLS.get(),high=SYSCALLS.get();if(low>=0)assert(high===0);else assert(high===-1);return low}),getZero:(function(){assert(SYSCALLS.get()===0)})};function ___syscall140(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(),offset_high=SYSCALLS.get(),offset_low=SYSCALLS.get(),result=SYSCALLS.get(),whence=SYSCALLS.get();var offset=offset_low;FS.llseek(stream,offset,whence);HEAP32[result>>2]=stream.position;if(stream.getdents&&offset===0&&whence===0)stream.getdents=null;return 0}catch(e){if(typeof FS===\"undefined\"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function flush_NO_FILESYSTEM(){var fflush=Module[\"_fflush\"];if(fflush)fflush(0);var printChar=___syscall146.printChar;if(!printChar)return;var buffers=___syscall146.buffers;if(buffers[1].length)printChar(1,10);if(buffers[2].length)printChar(2,10)}function ___syscall146(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.get(),iov=SYSCALLS.get(),iovcnt=SYSCALLS.get();var ret=0;if(!___syscall146.buffers){___syscall146.buffers=[null,[],[]];___syscall146.printChar=(function(stream,curr){var buffer=___syscall146.buffers[stream];assert(buffer);if(curr===0||curr===10){(stream===1?Module[\"print\"]:Module[\"printErr\"])(UTF8ArrayToString(buffer,0));buffer.length=0}else{buffer.push(curr)}})}for(var i=0;i<iovcnt;i++){var ptr=HEAP32[iov+i*8>>2];var len=HEAP32[iov+(i*8+4)>>2];for(var j=0;j<len;j++){___syscall146.printChar(stream,HEAPU8[ptr+j])}ret+=len}return ret}catch(e){if(typeof FS===\"undefined\"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall6(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD();FS.close(stream);return 0}catch(e){if(typeof FS===\"undefined\"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function _abort(){Module[\"abort\"]()}var _llvm_ceil_f64=Math_ceil;var _llvm_fabs_f64=Math_abs;var _llvm_floor_f64=Math_floor;function _llvm_trap(){abort(\"trap!\")}function _emscripten_memcpy_big(dest,src,num){HEAPU8.set(HEAPU8.subarray(src,src+num),dest);return dest}var PTHREAD_SPECIFIC={};function _pthread_getspecific(key){return PTHREAD_SPECIFIC[key]||0}var PTHREAD_SPECIFIC_NEXT_KEY=1;var ERRNO_CODES={EPERM:1,ENOENT:2,ESRCH:3,EINTR:4,EIO:5,ENXIO:6,E2BIG:7,ENOEXEC:8,EBADF:9,ECHILD:10,EAGAIN:11,EWOULDBLOCK:11,ENOMEM:12,EACCES:13,EFAULT:14,ENOTBLK:15,EBUSY:16,EEXIST:17,EXDEV:18,ENODEV:19,ENOTDIR:20,EISDIR:21,EINVAL:22,ENFILE:23,EMFILE:24,ENOTTY:25,ETXTBSY:26,EFBIG:27,ENOSPC:28,ESPIPE:29,EROFS:30,EMLINK:31,EPIPE:32,EDOM:33,ERANGE:34,ENOMSG:42,EIDRM:43,ECHRNG:44,EL2NSYNC:45,EL3HLT:46,EL3RST:47,ELNRNG:48,EUNATCH:49,ENOCSI:50,EL2HLT:51,EDEADLK:35,ENOLCK:37,EBADE:52,EBADR:53,EXFULL:54,ENOANO:55,EBADRQC:56,EBADSLT:57,EDEADLOCK:35,EBFONT:59,ENOSTR:60,ENODATA:61,ETIME:62,ENOSR:63,ENONET:64,ENOPKG:65,EREMOTE:66,ENOLINK:67,EADV:68,ESRMNT:69,ECOMM:70,EPROTO:71,EMULTIHOP:72,EDOTDOT:73,EBADMSG:74,ENOTUNIQ:76,EBADFD:77,EREMCHG:78,ELIBACC:79,ELIBBAD:80,ELIBSCN:81,ELIBMAX:82,ELIBEXEC:83,ENOSYS:38,ENOTEMPTY:39,ENAMETOOLONG:36,ELOOP:40,EOPNOTSUPP:95,EPFNOSUPPORT:96,ECONNRESET:104,ENOBUFS:105,EAFNOSUPPORT:97,EPROTOTYPE:91,ENOTSOCK:88,ENOPROTOOPT:92,ESHUTDOWN:108,ECONNREFUSED:111,EADDRINUSE:98,ECONNABORTED:103,ENETUNREACH:101,ENETDOWN:100,ETIMEDOUT:110,EHOSTDOWN:112,EHOSTUNREACH:113,EINPROGRESS:115,EALREADY:114,EDESTADDRREQ:89,EMSGSIZE:90,EPROTONOSUPPORT:93,ESOCKTNOSUPPORT:94,EADDRNOTAVAIL:99,ENETRESET:102,EISCONN:106,ENOTCONN:107,ETOOMANYREFS:109,EUSERS:87,EDQUOT:122,ESTALE:116,ENOTSUP:95,ENOMEDIUM:123,EILSEQ:84,EOVERFLOW:75,ECANCELED:125,ENOTRECOVERABLE:131,EOWNERDEAD:130,ESTRPIPE:86};function _pthread_key_create(key,destructor){if(key==0){return ERRNO_CODES.EINVAL}HEAP32[key>>2]=PTHREAD_SPECIFIC_NEXT_KEY;PTHREAD_SPECIFIC[PTHREAD_SPECIFIC_NEXT_KEY]=0;PTHREAD_SPECIFIC_NEXT_KEY++;return 0}function _pthread_once(ptr,func){if(!_pthread_once.seen)_pthread_once.seen={};if(ptr in _pthread_once.seen)return;Module[\"dynCall_v\"](func);_pthread_once.seen[ptr]=1}function _pthread_setspecific(key,value){if(!(key in PTHREAD_SPECIFIC)){return ERRNO_CODES.EINVAL}PTHREAD_SPECIFIC[key]=value;return 0}function ___setErrNo(value){if(Module[\"___errno_location\"])HEAP32[Module[\"___errno_location\"]()>>2]=value;return value}DYNAMICTOP_PTR=staticAlloc(4);STACK_BASE=STACKTOP=alignMemory(STATICTOP);STACK_MAX=STACK_BASE+TOTAL_STACK;DYNAMIC_BASE=alignMemory(STACK_MAX);HEAP32[DYNAMICTOP_PTR>>2]=DYNAMIC_BASE;staticSealed=true;var ASSERTIONS=false;function intArrayFromString(stringy,dontAddNull,length){var len=length>0?length:lengthBytesUTF8(stringy)+1;var u8array=new Array(len);var numBytesWritten=stringToUTF8Array(stringy,u8array,0,u8array.length);if(dontAddNull)u8array.length=numBytesWritten;return u8array}function intArrayToString(array){var ret=[];for(var i=0;i<array.length;i++){var chr=array[i];if(chr>255){if(ASSERTIONS){assert(false,\"Character code \"+chr+\" (\"+String.fromCharCode(chr)+\")  at offset \"+i+\" not in 0x00-0xFF.\")}chr&=255}ret.push(String.fromCharCode(chr))}return ret.join(\"\")}var decodeBase64=typeof atob===\"function\"?atob:(function(input){var keyStr=\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\";var output=\"\";var chr1,chr2,chr3;var enc1,enc2,enc3,enc4;var i=0;input=input.replace(/[^A-Za-z0-9\\+\\/\\=]/g,\"\");do{enc1=keyStr.indexOf(input.charAt(i++));enc2=keyStr.indexOf(input.charAt(i++));enc3=keyStr.indexOf(input.charAt(i++));enc4=keyStr.indexOf(input.charAt(i++));chr1=enc1<<2|enc2>>4;chr2=(enc2&15)<<4|enc3>>2;chr3=(enc3&3)<<6|enc4;output=output+String.fromCharCode(chr1);if(enc3!==64){output=output+String.fromCharCode(chr2)}if(enc4!==64){output=output+String.fromCharCode(chr3)}}while(i<input.length);return output});function intArrayFromBase64(s){if(typeof ENVIRONMENT_IS_NODE===\"boolean\"&&ENVIRONMENT_IS_NODE){var buf;try{buf=Buffer.from(s,\"base64\")}catch(_){buf=new Buffer(s,\"base64\")}return new Uint8Array(buf.buffer,buf.byteOffset,buf.byteLength)}try{var decoded=decodeBase64(s);var bytes=new Uint8Array(decoded.length);for(var i=0;i<decoded.length;++i){bytes[i]=decoded.charCodeAt(i)}return bytes}catch(_){throw new Error(\"Converting base64 string to bytes failed.\")}}function tryParseAsDataURI(filename){if(!isDataURI(filename)){return}return intArrayFromBase64(filename.slice(dataURIPrefix.length))}function invoke_ii(index,a1){try{return Module[\"dynCall_ii\"](index,a1)}catch(e){if(typeof e!==\"number\"&&e!==\"longjmp\")throw e;Module[\"setThrew\"](1,0)}}function invoke_iii(index,a1,a2){try{return Module[\"dynCall_iii\"](index,a1,a2)}catch(e){if(typeof e!==\"number\"&&e!==\"longjmp\")throw e;Module[\"setThrew\"](1,0)}}function invoke_iiii(index,a1,a2,a3){try{return Module[\"dynCall_iiii\"](index,a1,a2,a3)}catch(e){if(typeof e!==\"number\"&&e!==\"longjmp\")throw e;Module[\"setThrew\"](1,0)}}function invoke_iiiiiii(index,a1,a2,a3,a4,a5,a6){try{return Module[\"dynCall_iiiiiii\"](index,a1,a2,a3,a4,a5,a6)}catch(e){if(typeof e!==\"number\"&&e!==\"longjmp\")throw e;Module[\"setThrew\"](1,0)}}function invoke_v(index){try{Module[\"dynCall_v\"](index)}catch(e){if(typeof e!==\"number\"&&e!==\"longjmp\")throw e;Module[\"setThrew\"](1,0)}}function invoke_vi(index,a1){try{Module[\"dynCall_vi\"](index,a1)}catch(e){if(typeof e!==\"number\"&&e!==\"longjmp\")throw e;Module[\"setThrew\"](1,0)}}function invoke_vii(index,a1,a2){try{Module[\"dynCall_vii\"](index,a1,a2)}catch(e){if(typeof e!==\"number\"&&e!==\"longjmp\")throw e;Module[\"setThrew\"](1,0)}}function invoke_viii(index,a1,a2,a3){try{Module[\"dynCall_viii\"](index,a1,a2,a3)}catch(e){if(typeof e!==\"number\"&&e!==\"longjmp\")throw e;Module[\"setThrew\"](1,0)}}function invoke_viiii(index,a1,a2,a3,a4){try{Module[\"dynCall_viiii\"](index,a1,a2,a3,a4)}catch(e){if(typeof e!==\"number\"&&e!==\"longjmp\")throw e;Module[\"setThrew\"](1,0)}}function invoke_viiiii(index,a1,a2,a3,a4,a5){try{Module[\"dynCall_viiiii\"](index,a1,a2,a3,a4,a5)}catch(e){if(typeof e!==\"number\"&&e!==\"longjmp\")throw e;Module[\"setThrew\"](1,0)}}function invoke_viiiiii(index,a1,a2,a3,a4,a5,a6){try{Module[\"dynCall_viiiiii\"](index,a1,a2,a3,a4,a5,a6)}catch(e){if(typeof e!==\"number\"&&e!==\"longjmp\")throw e;Module[\"setThrew\"](1,0)}}Module.asmGlobalArg={\"Math\":Math,\"Int8Array\":Int8Array,\"Int16Array\":Int16Array,\"Int32Array\":Int32Array,\"Uint8Array\":Uint8Array,\"Uint16Array\":Uint16Array,\"Uint32Array\":Uint32Array,\"Float32Array\":Float32Array,\"Float64Array\":Float64Array,\"NaN\":NaN,\"Infinity\":Infinity,\"byteLength\":byteLength};Module.asmLibraryArg={\"abort\":abort,\"assert\":assert,\"enlargeMemory\":enlargeMemory,\"getTotalMemory\":getTotalMemory,\"abortOnCannotGrowMemory\":abortOnCannotGrowMemory,\"invoke_ii\":invoke_ii,\"invoke_iii\":invoke_iii,\"invoke_iiii\":invoke_iiii,\"invoke_iiiiiii\":invoke_iiiiiii,\"invoke_v\":invoke_v,\"invoke_vi\":invoke_vi,\"invoke_vii\":invoke_vii,\"invoke_viii\":invoke_viii,\"invoke_viiii\":invoke_viiii,\"invoke_viiiii\":invoke_viiiii,\"invoke_viiiiii\":invoke_viiiiii,\"__ZSt18uncaught_exceptionv\":__ZSt18uncaught_exceptionv,\"___cxa_allocate_exception\":___cxa_allocate_exception,\"___cxa_begin_catch\":___cxa_begin_catch,\"___cxa_find_matching_catch\":___cxa_find_matching_catch,\"___cxa_pure_virtual\":___cxa_pure_virtual,\"___cxa_throw\":___cxa_throw,\"___gxx_personality_v0\":___gxx_personality_v0,\"___resumeException\":___resumeException,\"___setErrNo\":___setErrNo,\"___syscall140\":___syscall140,\"___syscall146\":___syscall146,\"___syscall6\":___syscall6,\"_abort\":_abort,\"_emscripten_memcpy_big\":_emscripten_memcpy_big,\"_llvm_ceil_f64\":_llvm_ceil_f64,\"_llvm_fabs_f64\":_llvm_fabs_f64,\"_llvm_floor_f64\":_llvm_floor_f64,\"_llvm_trap\":_llvm_trap,\"_pthread_getspecific\":_pthread_getspecific,\"_pthread_key_create\":_pthread_key_create,\"_pthread_once\":_pthread_once,\"_pthread_setspecific\":_pthread_setspecific,\"flush_NO_FILESYSTEM\":flush_NO_FILESYSTEM,\"DYNAMICTOP_PTR\":DYNAMICTOP_PTR,\"tempDoublePtr\":tempDoublePtr,\"ABORT\":ABORT,\"STACKTOP\":STACKTOP,\"STACK_MAX\":STACK_MAX,\"cttz_i8\":cttz_i8};// EMSCRIPTEN_START_ASM\nvar asm=(/** @suppress {uselessCode} */ function(global,env,buffer) {\n\"almost asm\";var a=global.Int8Array;var b=new a(buffer);var c=global.Int16Array;var d=new c(buffer);var e=global.Int32Array;var f=new e(buffer);var g=global.Uint8Array;var h=new g(buffer);var i=global.Uint16Array;var j=new i(buffer);var k=global.Uint32Array;var l=new k(buffer);var m=global.Float32Array;var n=new m(buffer);var o=global.Float64Array;var p=new o(buffer);var q=global.byteLength;var r=env.DYNAMICTOP_PTR|0;var s=env.tempDoublePtr|0;var t=env.ABORT|0;var u=env.STACKTOP|0;var v=env.STACK_MAX|0;var w=env.cttz_i8|0;var x=0;var y=0;var z=0;var A=0;var B=global.NaN,C=global.Infinity;var D=0,E=0,F=0,G=0,H=0.0;var I=0;var J=global.Math.floor;var K=global.Math.abs;var L=global.Math.sqrt;var M=global.Math.pow;var N=global.Math.cos;var O=global.Math.sin;var P=global.Math.tan;var Q=global.Math.acos;var R=global.Math.asin;var S=global.Math.atan;var T=global.Math.atan2;var U=global.Math.exp;var V=global.Math.log;var W=global.Math.ceil;var X=global.Math.imul;var Y=global.Math.min;var Z=global.Math.max;var _=global.Math.clz32;var $=global.Math.fround;var aa=env.abort;var ba=env.assert;var ca=env.enlargeMemory;var da=env.getTotalMemory;var ea=env.abortOnCannotGrowMemory;var fa=env.invoke_ii;var ga=env.invoke_iii;var ha=env.invoke_iiii;var ia=env.invoke_iiiiiii;var ja=env.invoke_v;var ka=env.invoke_vi;var la=env.invoke_vii;var ma=env.invoke_viii;var na=env.invoke_viiii;var oa=env.invoke_viiiii;var pa=env.invoke_viiiiii;var qa=env.__ZSt18uncaught_exceptionv;var ra=env.___cxa_allocate_exception;var sa=env.___cxa_begin_catch;var ta=env.___cxa_find_matching_catch;var ua=env.___cxa_pure_virtual;var va=env.___cxa_throw;var wa=env.___gxx_personality_v0;var xa=env.___resumeException;var ya=env.___setErrNo;var za=env.___syscall140;var Aa=env.___syscall146;var Ba=env.___syscall6;var Ca=env._abort;var Da=env._emscripten_memcpy_big;var Ea=env._llvm_ceil_f64;var Fa=env._llvm_fabs_f64;var Ga=env._llvm_floor_f64;var Ha=env._llvm_trap;var Ia=env._pthread_getspecific;var Ja=env._pthread_key_create;var Ka=env._pthread_once;var La=env._pthread_setspecific;var Ma=env.flush_NO_FILESYSTEM;var Na=$(0);const Oa=$(0);function Pa(newBuffer){if(q(newBuffer)&16777215||q(newBuffer)<=16777215||q(newBuffer)>2147483648)return false;b=new a(newBuffer);d=new c(newBuffer);f=new e(newBuffer);h=new g(newBuffer);j=new i(newBuffer);l=new k(newBuffer);n=new m(newBuffer);p=new o(newBuffer);buffer=newBuffer;return true}\n// EMSCRIPTEN_START_FUNCS\nfunction be(a,b,c,d,e,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0;h=u;u=u+16|0;i=h+4|0;j=h;f[a+72>>2]=e;f[a+64>>2]=g;g=Lq(e>>>0>1073741823?-1:e<<2)|0;k=a+68|0;l=f[k>>2]|0;f[k>>2]=g;if(l|0)Mq(l);l=a+8|0;Mh(l,b,d,e);d=a+56|0;g=f[d>>2]|0;m=f[g+4>>2]|0;n=f[g>>2]|0;o=m-n|0;if((o|0)<=0){u=h;return 1}p=(o>>>2)+-1|0;o=a+16|0;q=a+32|0;r=a+12|0;s=a+28|0;t=a+20|0;v=a+24|0;if(m-n>>2>>>0>p>>>0){w=p;x=n}else{y=g;aq(y)}while(1){f[j>>2]=f[x+(w<<2)>>2];f[i>>2]=f[j>>2];Cc(a,i,b,w);g=X(w,e)|0;n=b+(g<<2)|0;p=c+(g<<2)|0;g=f[l>>2]|0;if((g|0)>0){m=0;z=f[k>>2]|0;A=g;while(1){if((A|0)>0){g=0;do{B=f[z+(g<<2)>>2]|0;C=f[o>>2]|0;if((B|0)>(C|0)){D=f[q>>2]|0;f[D+(g<<2)>>2]=C;E=D}else{D=f[r>>2]|0;C=f[q>>2]|0;f[C+(g<<2)>>2]=(B|0)<(D|0)?D:B;E=C}g=g+1|0}while((g|0)<(f[l>>2]|0));F=E}else F=f[q>>2]|0;g=(f[n+(m<<2)>>2]|0)-(f[F+(m<<2)>>2]|0)|0;C=p+(m<<2)|0;f[C>>2]=g;if((g|0)>=(f[s>>2]|0)){if((g|0)>(f[v>>2]|0)){G=g-(f[t>>2]|0)|0;H=21}}else{G=(f[t>>2]|0)+g|0;H=21}if((H|0)==21){H=0;f[C>>2]=G}m=m+1|0;A=f[l>>2]|0;if((m|0)>=(A|0))break;else z=F}}w=w+-1|0;if((w|0)<=-1){H=5;break}z=f[d>>2]|0;x=f[z>>2]|0;if((f[z+4>>2]|0)-x>>2>>>0<=w>>>0){y=z;H=6;break}}if((H|0)==5){u=h;return 1}else if((H|0)==6)aq(y);return 0}function ce(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0;g=u;u=u+64|0;h=g+48|0;i=g;j=d+1|0;f[h>>2]=0;k=h+4|0;f[k>>2]=0;f[h+8>>2]=0;do if(j)if(j>>>0>536870911)aq(h);else{l=ln(j<<3)|0;f[h>>2]=l;m=l+(j<<3)|0;f[h+8>>2]=m;sj(l|0,0,(d<<3)+8|0)|0;f[k>>2]=m;n=l;o=m;break}else{n=0;o=0}while(0);d=(c|0)>0;if(d){j=0;do{m=n+(f[a+(j<<2)>>2]<<3)|0;l=m;p=Vn(f[l>>2]|0,f[l+4>>2]|0,1,0)|0;l=m;f[l>>2]=p;f[l+4>>2]=I;j=j+1|0}while((j|0)!=(c|0))}j=i+40|0;l=j;f[l>>2]=0;f[l+4>>2]=0;f[i>>2]=0;f[i+4>>2]=0;f[i+8>>2]=0;f[i+12>>2]=0;f[i+16>>2]=0;f[i+20>>2]=0;Uc(i,n,o-n>>3,e)|0;n=i+16|0;o=Tn(f[n>>2]|0,f[n+4>>2]|0,1)|0;n=(f[e+4>>2]|0)-(f[e>>2]|0)|0;l=j;f[l>>2]=n;f[l+4>>2]=0;l=Vn(o|0,I|0,39,0)|0;o=Yn(l|0,I|0,3)|0;l=Vn(o|0,I|0,8,0)|0;o=Vn(l|0,I|0,n|0,0)|0;Cl(e,o,I);o=i+24|0;f[o>>2]=(f[e>>2]|0)+(f[j>>2]|0);j=i+28|0;f[j>>2]=0;n=i+32|0;f[n>>2]=4194304;if(d){d=c;c=4194304;do{l=d;d=d+-1|0;p=f[a+(d<<2)>>2]|0;m=f[i>>2]|0;q=f[m+(p<<3)>>2]|0;r=q<<10;if(c>>>0<r>>>0)s=c;else{t=c;while(1){v=f[o>>2]|0;w=f[j>>2]|0;f[j>>2]=w+1;b[v+w>>0]=t;w=(f[n>>2]|0)>>>8;f[n>>2]=w;if(w>>>0<r>>>0){s=w;break}else t=w}}c=(((s>>>0)/(q>>>0)|0)<<20)+((s>>>0)%(q>>>0)|0)+(f[m+(p<<3)+4>>2]|0)|0;f[n>>2]=c}while((l|0)>1)}Mf(i,e);e=f[i>>2]|0;if(e|0){c=i+4|0;i=f[c>>2]|0;if((i|0)!=(e|0))f[c>>2]=i+(~((i+-8-e|0)>>>3)<<3);Oq(e)}e=f[h>>2]|0;if(!e){u=g;return 1}h=f[k>>2]|0;if((h|0)!=(e|0))f[k>>2]=h+(~((h+-8-e|0)>>>3)<<3);Oq(e);u=g;return 1}function de(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0;g=u;u=u+64|0;h=g+48|0;i=g;j=d+1|0;f[h>>2]=0;k=h+4|0;f[k>>2]=0;f[h+8>>2]=0;do if(j)if(j>>>0>536870911)aq(h);else{l=ln(j<<3)|0;f[h>>2]=l;m=l+(j<<3)|0;f[h+8>>2]=m;sj(l|0,0,(d<<3)+8|0)|0;f[k>>2]=m;n=l;o=m;break}else{n=0;o=0}while(0);d=(c|0)>0;if(d){j=0;do{m=n+(f[a+(j<<2)>>2]<<3)|0;l=m;p=Vn(f[l>>2]|0,f[l+4>>2]|0,1,0)|0;l=m;f[l>>2]=p;f[l+4>>2]=I;j=j+1|0}while((j|0)!=(c|0))}j=i+40|0;l=j;f[l>>2]=0;f[l+4>>2]=0;f[i>>2]=0;f[i+4>>2]=0;f[i+8>>2]=0;f[i+12>>2]=0;f[i+16>>2]=0;f[i+20>>2]=0;Vc(i,n,o-n>>3,e)|0;n=i+16|0;o=Tn(f[n>>2]|0,f[n+4>>2]|0,1)|0;n=(f[e+4>>2]|0)-(f[e>>2]|0)|0;l=j;f[l>>2]=n;f[l+4>>2]=0;l=Vn(o|0,I|0,39,0)|0;o=Yn(l|0,I|0,3)|0;l=Vn(o|0,I|0,8,0)|0;o=Vn(l|0,I|0,n|0,0)|0;Cl(e,o,I);o=i+24|0;f[o>>2]=(f[e>>2]|0)+(f[j>>2]|0);j=i+28|0;f[j>>2]=0;n=i+32|0;f[n>>2]=4194304;if(d){d=c;c=4194304;do{l=d;d=d+-1|0;p=f[a+(d<<2)>>2]|0;m=f[i>>2]|0;q=f[m+(p<<3)>>2]|0;r=q<<10;if(c>>>0<r>>>0)s=c;else{t=c;while(1){v=f[o>>2]|0;w=f[j>>2]|0;f[j>>2]=w+1;b[v+w>>0]=t;w=(f[n>>2]|0)>>>8;f[n>>2]=w;if(w>>>0<r>>>0){s=w;break}else t=w}}c=(((s>>>0)/(q>>>0)|0)<<20)+((s>>>0)%(q>>>0)|0)+(f[m+(p<<3)+4>>2]|0)|0;f[n>>2]=c}while((l|0)>1)}Mf(i,e);e=f[i>>2]|0;if(e|0){c=i+4|0;i=f[c>>2]|0;if((i|0)!=(e|0))f[c>>2]=i+(~((i+-8-e|0)>>>3)<<3);Oq(e)}e=f[h>>2]|0;if(!e){u=g;return 1}h=f[k>>2]|0;if((h|0)!=(e|0))f[k>>2]=h+(~((h+-8-e|0)>>>3)<<3);Oq(e);u=g;return 1}function ee(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0;g=u;u=u+64|0;h=g+48|0;i=g;j=d+1|0;f[h>>2]=0;k=h+4|0;f[k>>2]=0;f[h+8>>2]=0;do if(j)if(j>>>0>536870911)aq(h);else{l=ln(j<<3)|0;f[h>>2]=l;m=l+(j<<3)|0;f[h+8>>2]=m;sj(l|0,0,(d<<3)+8|0)|0;f[k>>2]=m;n=l;o=m;break}else{n=0;o=0}while(0);d=(c|0)>0;if(d){j=0;do{m=n+(f[a+(j<<2)>>2]<<3)|0;l=m;p=Vn(f[l>>2]|0,f[l+4>>2]|0,1,0)|0;l=m;f[l>>2]=p;f[l+4>>2]=I;j=j+1|0}while((j|0)!=(c|0))}j=i+40|0;l=j;f[l>>2]=0;f[l+4>>2]=0;f[i>>2]=0;f[i+4>>2]=0;f[i+8>>2]=0;f[i+12>>2]=0;f[i+16>>2]=0;f[i+20>>2]=0;Wc(i,n,o-n>>3,e)|0;n=i+16|0;o=Tn(f[n>>2]|0,f[n+4>>2]|0,1)|0;n=(f[e+4>>2]|0)-(f[e>>2]|0)|0;l=j;f[l>>2]=n;f[l+4>>2]=0;l=Vn(o|0,I|0,39,0)|0;o=Yn(l|0,I|0,3)|0;l=Vn(o|0,I|0,8,0)|0;o=Vn(l|0,I|0,n|0,0)|0;Cl(e,o,I);o=i+24|0;f[o>>2]=(f[e>>2]|0)+(f[j>>2]|0);j=i+28|0;f[j>>2]=0;n=i+32|0;f[n>>2]=4194304;if(d){d=c;c=4194304;do{l=d;d=d+-1|0;p=f[a+(d<<2)>>2]|0;m=f[i>>2]|0;q=f[m+(p<<3)>>2]|0;r=q<<10;if(c>>>0<r>>>0)s=c;else{t=c;while(1){v=f[o>>2]|0;w=f[j>>2]|0;f[j>>2]=w+1;b[v+w>>0]=t;w=(f[n>>2]|0)>>>8;f[n>>2]=w;if(w>>>0<r>>>0){s=w;break}else t=w}}c=(((s>>>0)/(q>>>0)|0)<<20)+((s>>>0)%(q>>>0)|0)+(f[m+(p<<3)+4>>2]|0)|0;f[n>>2]=c}while((l|0)>1)}Mf(i,e);e=f[i>>2]|0;if(e|0){c=i+4|0;i=f[c>>2]|0;if((i|0)!=(e|0))f[c>>2]=i+(~((i+-8-e|0)>>>3)<<3);Oq(e)}e=f[h>>2]|0;if(!e){u=g;return 1}h=f[k>>2]|0;if((h|0)!=(e|0))f[k>>2]=h+(~((h+-8-e|0)>>>3)<<3);Oq(e);u=g;return 1}function fe(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0;g=u;u=u+64|0;h=g+48|0;i=g;j=d+1|0;f[h>>2]=0;k=h+4|0;f[k>>2]=0;f[h+8>>2]=0;do if(j)if(j>>>0>536870911)aq(h);else{l=ln(j<<3)|0;f[h>>2]=l;m=l+(j<<3)|0;f[h+8>>2]=m;sj(l|0,0,(d<<3)+8|0)|0;f[k>>2]=m;n=l;o=m;break}else{n=0;o=0}while(0);d=(c|0)>0;if(d){j=0;do{m=n+(f[a+(j<<2)>>2]<<3)|0;l=m;p=Vn(f[l>>2]|0,f[l+4>>2]|0,1,0)|0;l=m;f[l>>2]=p;f[l+4>>2]=I;j=j+1|0}while((j|0)!=(c|0))}j=i+40|0;l=j;f[l>>2]=0;f[l+4>>2]=0;f[i>>2]=0;f[i+4>>2]=0;f[i+8>>2]=0;f[i+12>>2]=0;f[i+16>>2]=0;f[i+20>>2]=0;Xc(i,n,o-n>>3,e)|0;n=i+16|0;o=Tn(f[n>>2]|0,f[n+4>>2]|0,1)|0;n=(f[e+4>>2]|0)-(f[e>>2]|0)|0;l=j;f[l>>2]=n;f[l+4>>2]=0;l=Vn(o|0,I|0,39,0)|0;o=Yn(l|0,I|0,3)|0;l=Vn(o|0,I|0,8,0)|0;o=Vn(l|0,I|0,n|0,0)|0;Cl(e,o,I);o=i+24|0;f[o>>2]=(f[e>>2]|0)+(f[j>>2]|0);j=i+28|0;f[j>>2]=0;n=i+32|0;f[n>>2]=4194304;if(d){d=c;c=4194304;do{l=d;d=d+-1|0;p=f[a+(d<<2)>>2]|0;m=f[i>>2]|0;q=f[m+(p<<3)>>2]|0;r=q<<10;if(c>>>0<r>>>0)s=c;else{t=c;while(1){v=f[o>>2]|0;w=f[j>>2]|0;f[j>>2]=w+1;b[v+w>>0]=t;w=(f[n>>2]|0)>>>8;f[n>>2]=w;if(w>>>0<r>>>0){s=w;break}else t=w}}c=(((s>>>0)/(q>>>0)|0)<<20)+((s>>>0)%(q>>>0)|0)+(f[m+(p<<3)+4>>2]|0)|0;f[n>>2]=c}while((l|0)>1)}Mf(i,e);e=f[i>>2]|0;if(e|0){c=i+4|0;i=f[c>>2]|0;if((i|0)!=(e|0))f[c>>2]=i+(~((i+-8-e|0)>>>3)<<3);Oq(e)}e=f[h>>2]|0;if(!e){u=g;return 1}h=f[k>>2]|0;if((h|0)!=(e|0))f[k>>2]=h+(~((h+-8-e|0)>>>3)<<3);Oq(e);u=g;return 1}function ge(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0;g=u;u=u+64|0;h=g+48|0;i=g;j=d+1|0;f[h>>2]=0;k=h+4|0;f[k>>2]=0;f[h+8>>2]=0;do if(j)if(j>>>0>536870911)aq(h);else{l=ln(j<<3)|0;f[h>>2]=l;m=l+(j<<3)|0;f[h+8>>2]=m;sj(l|0,0,(d<<3)+8|0)|0;f[k>>2]=m;n=l;o=m;break}else{n=0;o=0}while(0);d=(c|0)>0;if(d){j=0;do{m=n+(f[a+(j<<2)>>2]<<3)|0;l=m;p=Vn(f[l>>2]|0,f[l+4>>2]|0,1,0)|0;l=m;f[l>>2]=p;f[l+4>>2]=I;j=j+1|0}while((j|0)!=(c|0))}j=i+40|0;l=j;f[l>>2]=0;f[l+4>>2]=0;f[i>>2]=0;f[i+4>>2]=0;f[i+8>>2]=0;f[i+12>>2]=0;f[i+16>>2]=0;f[i+20>>2]=0;Yc(i,n,o-n>>3,e)|0;n=i+16|0;o=Tn(f[n>>2]|0,f[n+4>>2]|0,1)|0;n=(f[e+4>>2]|0)-(f[e>>2]|0)|0;l=j;f[l>>2]=n;f[l+4>>2]=0;l=Vn(o|0,I|0,39,0)|0;o=Yn(l|0,I|0,3)|0;l=Vn(o|0,I|0,8,0)|0;o=Vn(l|0,I|0,n|0,0)|0;Cl(e,o,I);o=i+24|0;f[o>>2]=(f[e>>2]|0)+(f[j>>2]|0);j=i+28|0;f[j>>2]=0;n=i+32|0;f[n>>2]=4194304;if(d){d=c;c=4194304;do{l=d;d=d+-1|0;p=f[a+(d<<2)>>2]|0;m=f[i>>2]|0;q=f[m+(p<<3)>>2]|0;r=q<<10;if(c>>>0<r>>>0)s=c;else{t=c;while(1){v=f[o>>2]|0;w=f[j>>2]|0;f[j>>2]=w+1;b[v+w>>0]=t;w=(f[n>>2]|0)>>>8;f[n>>2]=w;if(w>>>0<r>>>0){s=w;break}else t=w}}c=(((s>>>0)/(q>>>0)|0)<<20)+((s>>>0)%(q>>>0)|0)+(f[m+(p<<3)+4>>2]|0)|0;f[n>>2]=c}while((l|0)>1)}Mf(i,e);e=f[i>>2]|0;if(e|0){c=i+4|0;i=f[c>>2]|0;if((i|0)!=(e|0))f[c>>2]=i+(~((i+-8-e|0)>>>3)<<3);Oq(e)}e=f[h>>2]|0;if(!e){u=g;return 1}h=f[k>>2]|0;if((h|0)!=(e|0))f[k>>2]=h+(~((h+-8-e|0)>>>3)<<3);Oq(e);u=g;return 1}function he(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0;g=u;u=u+64|0;h=g+48|0;i=g;j=d+1|0;f[h>>2]=0;k=h+4|0;f[k>>2]=0;f[h+8>>2]=0;do if(j)if(j>>>0>536870911)aq(h);else{l=ln(j<<3)|0;f[h>>2]=l;m=l+(j<<3)|0;f[h+8>>2]=m;sj(l|0,0,(d<<3)+8|0)|0;f[k>>2]=m;n=l;o=m;break}else{n=0;o=0}while(0);d=(c|0)>0;if(d){j=0;do{m=n+(f[a+(j<<2)>>2]<<3)|0;l=m;p=Vn(f[l>>2]|0,f[l+4>>2]|0,1,0)|0;l=m;f[l>>2]=p;f[l+4>>2]=I;j=j+1|0}while((j|0)!=(c|0))}j=i+40|0;l=j;f[l>>2]=0;f[l+4>>2]=0;f[i>>2]=0;f[i+4>>2]=0;f[i+8>>2]=0;f[i+12>>2]=0;f[i+16>>2]=0;f[i+20>>2]=0;Zc(i,n,o-n>>3,e)|0;n=i+16|0;o=Tn(f[n>>2]|0,f[n+4>>2]|0,1)|0;n=(f[e+4>>2]|0)-(f[e>>2]|0)|0;l=j;f[l>>2]=n;f[l+4>>2]=0;l=Vn(o|0,I|0,39,0)|0;o=Yn(l|0,I|0,3)|0;l=Vn(o|0,I|0,8,0)|0;o=Vn(l|0,I|0,n|0,0)|0;Cl(e,o,I);o=i+24|0;f[o>>2]=(f[e>>2]|0)+(f[j>>2]|0);j=i+28|0;f[j>>2]=0;n=i+32|0;f[n>>2]=2097152;if(d){d=c;c=2097152;do{l=d;d=d+-1|0;p=f[a+(d<<2)>>2]|0;m=f[i>>2]|0;q=f[m+(p<<3)>>2]|0;r=q<<10;if(c>>>0<r>>>0)s=c;else{t=c;while(1){v=f[o>>2]|0;w=f[j>>2]|0;f[j>>2]=w+1;b[v+w>>0]=t;w=(f[n>>2]|0)>>>8;f[n>>2]=w;if(w>>>0<r>>>0){s=w;break}else t=w}}c=(((s>>>0)/(q>>>0)|0)<<19)+((s>>>0)%(q>>>0)|0)+(f[m+(p<<3)+4>>2]|0)|0;f[n>>2]=c}while((l|0)>1)}Nf(i,e);e=f[i>>2]|0;if(e|0){c=i+4|0;i=f[c>>2]|0;if((i|0)!=(e|0))f[c>>2]=i+(~((i+-8-e|0)>>>3)<<3);Oq(e)}e=f[h>>2]|0;if(!e){u=g;return 1}h=f[k>>2]|0;if((h|0)!=(e|0))f[k>>2]=h+(~((h+-8-e|0)>>>3)<<3);Oq(e);u=g;return 1}function ie(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0;g=u;u=u+64|0;h=g+48|0;i=g;j=d+1|0;f[h>>2]=0;k=h+4|0;f[k>>2]=0;f[h+8>>2]=0;do if(j)if(j>>>0>536870911)aq(h);else{l=ln(j<<3)|0;f[h>>2]=l;m=l+(j<<3)|0;f[h+8>>2]=m;sj(l|0,0,(d<<3)+8|0)|0;f[k>>2]=m;n=l;o=m;break}else{n=0;o=0}while(0);d=(c|0)>0;if(d){j=0;do{m=n+(f[a+(j<<2)>>2]<<3)|0;l=m;p=Vn(f[l>>2]|0,f[l+4>>2]|0,1,0)|0;l=m;f[l>>2]=p;f[l+4>>2]=I;j=j+1|0}while((j|0)!=(c|0))}j=i+40|0;l=j;f[l>>2]=0;f[l+4>>2]=0;f[i>>2]=0;f[i+4>>2]=0;f[i+8>>2]=0;f[i+12>>2]=0;f[i+16>>2]=0;f[i+20>>2]=0;_c(i,n,o-n>>3,e)|0;n=i+16|0;o=Tn(f[n>>2]|0,f[n+4>>2]|0,1)|0;n=(f[e+4>>2]|0)-(f[e>>2]|0)|0;l=j;f[l>>2]=n;f[l+4>>2]=0;l=Vn(o|0,I|0,39,0)|0;o=Yn(l|0,I|0,3)|0;l=Vn(o|0,I|0,8,0)|0;o=Vn(l|0,I|0,n|0,0)|0;Cl(e,o,I);o=i+24|0;f[o>>2]=(f[e>>2]|0)+(f[j>>2]|0);j=i+28|0;f[j>>2]=0;n=i+32|0;f[n>>2]=1048576;if(d){d=c;c=1048576;do{l=d;d=d+-1|0;p=f[a+(d<<2)>>2]|0;m=f[i>>2]|0;q=f[m+(p<<3)>>2]|0;r=q<<10;if(c>>>0<r>>>0)s=c;else{t=c;while(1){v=f[o>>2]|0;w=f[j>>2]|0;f[j>>2]=w+1;b[v+w>>0]=t;w=(f[n>>2]|0)>>>8;f[n>>2]=w;if(w>>>0<r>>>0){s=w;break}else t=w}}c=(((s>>>0)/(q>>>0)|0)<<18)+((s>>>0)%(q>>>0)|0)+(f[m+(p<<3)+4>>2]|0)|0;f[n>>2]=c}while((l|0)>1)}Of(i,e);e=f[i>>2]|0;if(e|0){c=i+4|0;i=f[c>>2]|0;if((i|0)!=(e|0))f[c>>2]=i+(~((i+-8-e|0)>>>3)<<3);Oq(e)}e=f[h>>2]|0;if(!e){u=g;return 1}h=f[k>>2]|0;if((h|0)!=(e|0))f[k>>2]=h+(~((h+-8-e|0)>>>3)<<3);Oq(e);u=g;return 1}function je(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,o=0,p=0,q=0,r=0,s=Oa,t=Oa,u=Oa,v=0,w=0,x=0,y=0,z=0;c=f[b>>2]|0;b=a+4|0;d=f[b>>2]|0;e=(d|0)==0;a:do if(!e){g=d+-1|0;h=(g&d|0)==0;if(!h)if(c>>>0<d>>>0)i=c;else i=(c>>>0)%(d>>>0)|0;else i=g&c;j=f[(f[a>>2]|0)+(i<<2)>>2]|0;if(!j)k=i;else{if(h){h=j;while(1){l=f[h>>2]|0;if(!l){k=i;break a}m=f[l+4>>2]|0;if(!((m|0)==(c|0)|(m&g|0)==(i|0))){k=i;break a}if((f[l+8>>2]|0)==(c|0)){o=l;break}else h=l}p=o+12|0;return p|0}else q=j;while(1){h=f[q>>2]|0;if(!h){k=i;break a}g=f[h+4>>2]|0;if((g|0)!=(c|0)){if(g>>>0<d>>>0)r=g;else r=(g>>>0)%(d>>>0)|0;if((r|0)!=(i|0)){k=i;break a}}if((f[h+8>>2]|0)==(c|0)){o=h;break}else q=h}p=o+12|0;return p|0}}else k=0;while(0);q=ln(16)|0;f[q+8>>2]=c;f[q+12>>2]=0;f[q+4>>2]=c;f[q>>2]=0;i=a+12|0;s=$(((f[i>>2]|0)+1|0)>>>0);t=$(d>>>0);u=$(n[a+16>>2]);do if(e|$(u*t)<s){r=d<<1|(d>>>0<3|(d+-1&d|0)!=0)&1;j=~~$(W($(s/u)))>>>0;Hi(a,r>>>0<j>>>0?j:r);r=f[b>>2]|0;j=r+-1|0;if(!(j&r)){v=r;w=j&c;break}if(c>>>0<r>>>0){v=r;w=c}else{v=r;w=(c>>>0)%(r>>>0)|0}}else{v=d;w=k}while(0);k=(f[a>>2]|0)+(w<<2)|0;w=f[k>>2]|0;if(!w){d=a+8|0;f[q>>2]=f[d>>2];f[d>>2]=q;f[k>>2]=d;d=f[q>>2]|0;if(d|0){k=f[d+4>>2]|0;d=v+-1|0;if(d&v)if(k>>>0<v>>>0)x=k;else x=(k>>>0)%(v>>>0)|0;else x=k&d;y=(f[a>>2]|0)+(x<<2)|0;z=30}}else{f[q>>2]=f[w>>2];y=w;z=30}if((z|0)==30)f[y>>2]=q;f[i>>2]=(f[i>>2]|0)+1;o=q;p=o+12|0;return p|0}function ke(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0;g=u;u=u+64|0;h=g+48|0;i=g;j=d+1|0;f[h>>2]=0;k=h+4|0;f[k>>2]=0;f[h+8>>2]=0;do if(j)if(j>>>0>536870911)aq(h);else{l=ln(j<<3)|0;f[h>>2]=l;m=l+(j<<3)|0;f[h+8>>2]=m;sj(l|0,0,(d<<3)+8|0)|0;f[k>>2]=m;n=l;o=m;break}else{n=0;o=0}while(0);d=(c|0)>0;if(d){j=0;do{m=n+(f[a+(j<<2)>>2]<<3)|0;l=m;p=Vn(f[l>>2]|0,f[l+4>>2]|0,1,0)|0;l=m;f[l>>2]=p;f[l+4>>2]=I;j=j+1|0}while((j|0)!=(c|0))}j=i+40|0;l=j;f[l>>2]=0;f[l+4>>2]=0;f[i>>2]=0;f[i+4>>2]=0;f[i+8>>2]=0;f[i+12>>2]=0;f[i+16>>2]=0;f[i+20>>2]=0;$c(i,n,o-n>>3,e)|0;n=i+16|0;o=Tn(f[n>>2]|0,f[n+4>>2]|0,1)|0;n=(f[e+4>>2]|0)-(f[e>>2]|0)|0;l=j;f[l>>2]=n;f[l+4>>2]=0;l=Vn(o|0,I|0,39,0)|0;o=Yn(l|0,I|0,3)|0;l=Vn(o|0,I|0,8,0)|0;o=Vn(l|0,I|0,n|0,0)|0;Cl(e,o,I);o=i+24|0;f[o>>2]=(f[e>>2]|0)+(f[j>>2]|0);j=i+28|0;f[j>>2]=0;n=i+32|0;f[n>>2]=262144;if(d){d=c;c=262144;do{l=d;d=d+-1|0;p=f[a+(d<<2)>>2]|0;m=f[i>>2]|0;q=f[m+(p<<3)>>2]|0;r=q<<10;if(c>>>0<r>>>0)s=c;else{t=c;while(1){v=f[o>>2]|0;w=f[j>>2]|0;f[j>>2]=w+1;b[v+w>>0]=t;w=(f[n>>2]|0)>>>8;f[n>>2]=w;if(w>>>0<r>>>0){s=w;break}else t=w}}c=(((s>>>0)/(q>>>0)|0)<<16)+((s>>>0)%(q>>>0)|0)+(f[m+(p<<3)+4>>2]|0)|0;f[n>>2]=c}while((l|0)>1)}Rf(i,e);e=f[i>>2]|0;if(e|0){c=i+4|0;i=f[c>>2]|0;if((i|0)!=(e|0))f[c>>2]=i+(~((i+-8-e|0)>>>3)<<3);Oq(e)}e=f[h>>2]|0;if(!e){u=g;return 1}h=f[k>>2]|0;if((h|0)!=(e|0))f[k>>2]=h+(~((h+-8-e|0)>>>3)<<3);Oq(e);u=g;return 1}function le(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0;g=u;u=u+64|0;h=g+48|0;i=g;j=d+1|0;f[h>>2]=0;k=h+4|0;f[k>>2]=0;f[h+8>>2]=0;do if(j)if(j>>>0>536870911)aq(h);else{l=ln(j<<3)|0;f[h>>2]=l;m=l+(j<<3)|0;f[h+8>>2]=m;sj(l|0,0,(d<<3)+8|0)|0;f[k>>2]=m;n=l;o=m;break}else{n=0;o=0}while(0);d=(c|0)>0;if(d){j=0;do{m=n+(f[a+(j<<2)>>2]<<3)|0;l=m;p=Vn(f[l>>2]|0,f[l+4>>2]|0,1,0)|0;l=m;f[l>>2]=p;f[l+4>>2]=I;j=j+1|0}while((j|0)!=(c|0))}j=i+40|0;l=j;f[l>>2]=0;f[l+4>>2]=0;f[i>>2]=0;f[i+4>>2]=0;f[i+8>>2]=0;f[i+12>>2]=0;f[i+16>>2]=0;f[i+20>>2]=0;ad(i,n,o-n>>3,e)|0;n=i+16|0;o=Tn(f[n>>2]|0,f[n+4>>2]|0,1)|0;n=(f[e+4>>2]|0)-(f[e>>2]|0)|0;l=j;f[l>>2]=n;f[l+4>>2]=0;l=Vn(o|0,I|0,39,0)|0;o=Yn(l|0,I|0,3)|0;l=Vn(o|0,I|0,8,0)|0;o=Vn(l|0,I|0,n|0,0)|0;Cl(e,o,I);o=i+24|0;f[o>>2]=(f[e>>2]|0)+(f[j>>2]|0);j=i+28|0;f[j>>2]=0;n=i+32|0;f[n>>2]=131072;if(d){d=c;c=131072;do{l=d;d=d+-1|0;p=f[a+(d<<2)>>2]|0;m=f[i>>2]|0;q=f[m+(p<<3)>>2]|0;r=q<<10;if(c>>>0<r>>>0)s=c;else{t=c;while(1){v=f[o>>2]|0;w=f[j>>2]|0;f[j>>2]=w+1;b[v+w>>0]=t;w=(f[n>>2]|0)>>>8;f[n>>2]=w;if(w>>>0<r>>>0){s=w;break}else t=w}}c=(((s>>>0)/(q>>>0)|0)<<15)+((s>>>0)%(q>>>0)|0)+(f[m+(p<<3)+4>>2]|0)|0;f[n>>2]=c}while((l|0)>1)}Sf(i,e);e=f[i>>2]|0;if(e|0){c=i+4|0;i=f[c>>2]|0;if((i|0)!=(e|0))f[c>>2]=i+(~((i+-8-e|0)>>>3)<<3);Oq(e)}e=f[h>>2]|0;if(!e){u=g;return 1}h=f[k>>2]|0;if((h|0)!=(e|0))f[k>>2]=h+(~((h+-8-e|0)>>>3)<<3);Oq(e);u=g;return 1}function me(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0;g=u;u=u+64|0;h=g+48|0;i=g;j=d+1|0;f[h>>2]=0;k=h+4|0;f[k>>2]=0;f[h+8>>2]=0;do if(j)if(j>>>0>536870911)aq(h);else{l=ln(j<<3)|0;f[h>>2]=l;m=l+(j<<3)|0;f[h+8>>2]=m;sj(l|0,0,(d<<3)+8|0)|0;f[k>>2]=m;n=l;o=m;break}else{n=0;o=0}while(0);d=(c|0)>0;if(d){j=0;do{m=n+(f[a+(j<<2)>>2]<<3)|0;l=m;p=Vn(f[l>>2]|0,f[l+4>>2]|0,1,0)|0;l=m;f[l>>2]=p;f[l+4>>2]=I;j=j+1|0}while((j|0)!=(c|0))}j=i+40|0;l=j;f[l>>2]=0;f[l+4>>2]=0;f[i>>2]=0;f[i+4>>2]=0;f[i+8>>2]=0;f[i+12>>2]=0;f[i+16>>2]=0;f[i+20>>2]=0;bd(i,n,o-n>>3,e)|0;n=i+16|0;o=Tn(f[n>>2]|0,f[n+4>>2]|0,1)|0;n=(f[e+4>>2]|0)-(f[e>>2]|0)|0;l=j;f[l>>2]=n;f[l+4>>2]=0;l=Vn(o|0,I|0,39,0)|0;o=Yn(l|0,I|0,3)|0;l=Vn(o|0,I|0,8,0)|0;o=Vn(l|0,I|0,n|0,0)|0;Cl(e,o,I);o=i+24|0;f[o>>2]=(f[e>>2]|0)+(f[j>>2]|0);j=i+28|0;f[j>>2]=0;n=i+32|0;f[n>>2]=32768;if(d){d=c;c=32768;do{l=d;d=d+-1|0;p=f[a+(d<<2)>>2]|0;m=f[i>>2]|0;q=f[m+(p<<3)>>2]|0;r=q<<10;if(c>>>0<r>>>0)s=c;else{t=c;while(1){v=f[o>>2]|0;w=f[j>>2]|0;f[j>>2]=w+1;b[v+w>>0]=t;w=(f[n>>2]|0)>>>8;f[n>>2]=w;if(w>>>0<r>>>0){s=w;break}else t=w}}c=(((s>>>0)/(q>>>0)|0)<<13)+((s>>>0)%(q>>>0)|0)+(f[m+(p<<3)+4>>2]|0)|0;f[n>>2]=c}while((l|0)>1)}Uf(i,e);e=f[i>>2]|0;if(e|0){c=i+4|0;i=f[c>>2]|0;if((i|0)!=(e|0))f[c>>2]=i+(~((i+-8-e|0)>>>3)<<3);Oq(e)}e=f[h>>2]|0;if(!e){u=g;return 1}h=f[k>>2]|0;if((h|0)!=(e|0))f[k>>2]=h+(~((h+-8-e|0)>>>3)<<3);Oq(e);u=g;return 1}function ne(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0;g=u;u=u+64|0;h=g+48|0;i=g;j=d+1|0;f[h>>2]=0;k=h+4|0;f[k>>2]=0;f[h+8>>2]=0;do if(j)if(j>>>0>536870911)aq(h);else{l=ln(j<<3)|0;f[h>>2]=l;m=l+(j<<3)|0;f[h+8>>2]=m;sj(l|0,0,(d<<3)+8|0)|0;f[k>>2]=m;n=l;o=m;break}else{n=0;o=0}while(0);d=(c|0)>0;if(d){j=0;do{m=n+(f[a+(j<<2)>>2]<<3)|0;l=m;p=Vn(f[l>>2]|0,f[l+4>>2]|0,1,0)|0;l=m;f[l>>2]=p;f[l+4>>2]=I;j=j+1|0}while((j|0)!=(c|0))}j=i+40|0;l=j;f[l>>2]=0;f[l+4>>2]=0;f[i>>2]=0;f[i+4>>2]=0;f[i+8>>2]=0;f[i+12>>2]=0;f[i+16>>2]=0;f[i+20>>2]=0;cd(i,n,o-n>>3,e)|0;n=i+16|0;o=Tn(f[n>>2]|0,f[n+4>>2]|0,1)|0;n=(f[e+4>>2]|0)-(f[e>>2]|0)|0;l=j;f[l>>2]=n;f[l+4>>2]=0;l=Vn(o|0,I|0,39,0)|0;o=Yn(l|0,I|0,3)|0;l=Vn(o|0,I|0,8,0)|0;o=Vn(l|0,I|0,n|0,0)|0;Cl(e,o,I);o=i+24|0;f[o>>2]=(f[e>>2]|0)+(f[j>>2]|0);j=i+28|0;f[j>>2]=0;n=i+32|0;f[n>>2]=16384;if(d){d=c;c=16384;do{l=d;d=d+-1|0;p=f[a+(d<<2)>>2]|0;m=f[i>>2]|0;q=f[m+(p<<3)>>2]|0;r=q<<10;if(c>>>0<r>>>0)s=c;else{t=c;while(1){v=f[o>>2]|0;w=f[j>>2]|0;f[j>>2]=w+1;b[v+w>>0]=t;w=(f[n>>2]|0)>>>8;f[n>>2]=w;if(w>>>0<r>>>0){s=w;break}else t=w}}c=(((s>>>0)/(q>>>0)|0)<<12)+((s>>>0)%(q>>>0)|0)+(f[m+(p<<3)+4>>2]|0)|0;f[n>>2]=c}while((l|0)>1)}_f(i,e);e=f[i>>2]|0;if(e|0){c=i+4|0;i=f[c>>2]|0;if((i|0)!=(e|0))f[c>>2]=i+(~((i+-8-e|0)>>>3)<<3);Oq(e)}e=f[h>>2]|0;if(!e){u=g;return 1}h=f[k>>2]|0;if((h|0)!=(e|0))f[k>>2]=h+(~((h+-8-e|0)>>>3)<<3);Oq(e);u=g;return 1}function oe(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0;g=u;u=u+64|0;h=g+48|0;i=g;j=d+1|0;f[h>>2]=0;k=h+4|0;f[k>>2]=0;f[h+8>>2]=0;do if(j)if(j>>>0>536870911)aq(h);else{l=ln(j<<3)|0;f[h>>2]=l;m=l+(j<<3)|0;f[h+8>>2]=m;sj(l|0,0,(d<<3)+8|0)|0;f[k>>2]=m;n=l;o=m;break}else{n=0;o=0}while(0);d=(c|0)>0;if(d){j=0;do{m=n+(f[a+(j<<2)>>2]<<3)|0;l=m;p=Vn(f[l>>2]|0,f[l+4>>2]|0,1,0)|0;l=m;f[l>>2]=p;f[l+4>>2]=I;j=j+1|0}while((j|0)!=(c|0))}j=i+40|0;l=j;f[l>>2]=0;f[l+4>>2]=0;f[i>>2]=0;f[i+4>>2]=0;f[i+8>>2]=0;f[i+12>>2]=0;f[i+16>>2]=0;f[i+20>>2]=0;dd(i,n,o-n>>3,e)|0;n=i+16|0;o=Tn(f[n>>2]|0,f[n+4>>2]|0,1)|0;n=(f[e+4>>2]|0)-(f[e>>2]|0)|0;l=j;f[l>>2]=n;f[l+4>>2]=0;l=Vn(o|0,I|0,39,0)|0;o=Yn(l|0,I|0,3)|0;l=Vn(o|0,I|0,8,0)|0;o=Vn(l|0,I|0,n|0,0)|0;Cl(e,o,I);o=i+24|0;f[o>>2]=(f[e>>2]|0)+(f[j>>2]|0);j=i+28|0;f[j>>2]=0;n=i+32|0;f[n>>2]=16384;if(d){d=c;c=16384;do{l=d;d=d+-1|0;p=f[a+(d<<2)>>2]|0;m=f[i>>2]|0;q=f[m+(p<<3)>>2]|0;r=q<<10;if(c>>>0<r>>>0)s=c;else{t=c;while(1){v=f[o>>2]|0;w=f[j>>2]|0;f[j>>2]=w+1;b[v+w>>0]=t;w=(f[n>>2]|0)>>>8;f[n>>2]=w;if(w>>>0<r>>>0){s=w;break}else t=w}}c=(((s>>>0)/(q>>>0)|0)<<12)+((s>>>0)%(q>>>0)|0)+(f[m+(p<<3)+4>>2]|0)|0;f[n>>2]=c}while((l|0)>1)}_f(i,e);e=f[i>>2]|0;if(e|0){c=i+4|0;i=f[c>>2]|0;if((i|0)!=(e|0))f[c>>2]=i+(~((i+-8-e|0)>>>3)<<3);Oq(e)}e=f[h>>2]|0;if(!e){u=g;return 1}h=f[k>>2]|0;if((h|0)!=(e|0))f[k>>2]=h+(~((h+-8-e|0)>>>3)<<3);Oq(e);u=g;return 1}function pe(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0;g=u;u=u+64|0;h=g+48|0;i=g;j=d+1|0;f[h>>2]=0;k=h+4|0;f[k>>2]=0;f[h+8>>2]=0;do if(j)if(j>>>0>536870911)aq(h);else{l=ln(j<<3)|0;f[h>>2]=l;m=l+(j<<3)|0;f[h+8>>2]=m;sj(l|0,0,(d<<3)+8|0)|0;f[k>>2]=m;n=l;o=m;break}else{n=0;o=0}while(0);d=(c|0)>0;if(d){j=0;do{m=n+(f[a+(j<<2)>>2]<<3)|0;l=m;p=Vn(f[l>>2]|0,f[l+4>>2]|0,1,0)|0;l=m;f[l>>2]=p;f[l+4>>2]=I;j=j+1|0}while((j|0)!=(c|0))}j=i+40|0;l=j;f[l>>2]=0;f[l+4>>2]=0;f[i>>2]=0;f[i+4>>2]=0;f[i+8>>2]=0;f[i+12>>2]=0;f[i+16>>2]=0;f[i+20>>2]=0;ed(i,n,o-n>>3,e)|0;n=i+16|0;o=Tn(f[n>>2]|0,f[n+4>>2]|0,1)|0;n=(f[e+4>>2]|0)-(f[e>>2]|0)|0;l=j;f[l>>2]=n;f[l+4>>2]=0;l=Vn(o|0,I|0,39,0)|0;o=Yn(l|0,I|0,3)|0;l=Vn(o|0,I|0,8,0)|0;o=Vn(l|0,I|0,n|0,0)|0;Cl(e,o,I);o=i+24|0;f[o>>2]=(f[e>>2]|0)+(f[j>>2]|0);j=i+28|0;f[j>>2]=0;n=i+32|0;f[n>>2]=16384;if(d){d=c;c=16384;do{l=d;d=d+-1|0;p=f[a+(d<<2)>>2]|0;m=f[i>>2]|0;q=f[m+(p<<3)>>2]|0;r=q<<10;if(c>>>0<r>>>0)s=c;else{t=c;while(1){v=f[o>>2]|0;w=f[j>>2]|0;f[j>>2]=w+1;b[v+w>>0]=t;w=(f[n>>2]|0)>>>8;f[n>>2]=w;if(w>>>0<r>>>0){s=w;break}else t=w}}c=(((s>>>0)/(q>>>0)|0)<<12)+((s>>>0)%(q>>>0)|0)+(f[m+(p<<3)+4>>2]|0)|0;f[n>>2]=c}while((l|0)>1)}_f(i,e);e=f[i>>2]|0;if(e|0){c=i+4|0;i=f[c>>2]|0;if((i|0)!=(e|0))f[c>>2]=i+(~((i+-8-e|0)>>>3)<<3);Oq(e)}e=f[h>>2]|0;if(!e){u=g;return 1}h=f[k>>2]|0;if((h|0)!=(e|0))f[k>>2]=h+(~((h+-8-e|0)>>>3)<<3);Oq(e);u=g;return 1}function qe(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0;g=u;u=u+64|0;h=g+48|0;i=g;j=d+1|0;f[h>>2]=0;k=h+4|0;f[k>>2]=0;f[h+8>>2]=0;do if(j)if(j>>>0>536870911)aq(h);else{l=ln(j<<3)|0;f[h>>2]=l;m=l+(j<<3)|0;f[h+8>>2]=m;sj(l|0,0,(d<<3)+8|0)|0;f[k>>2]=m;n=l;o=m;break}else{n=0;o=0}while(0);d=(c|0)>0;if(d){j=0;do{m=n+(f[a+(j<<2)>>2]<<3)|0;l=m;p=Vn(f[l>>2]|0,f[l+4>>2]|0,1,0)|0;l=m;f[l>>2]=p;f[l+4>>2]=I;j=j+1|0}while((j|0)!=(c|0))}j=i+40|0;l=j;f[l>>2]=0;f[l+4>>2]=0;f[i>>2]=0;f[i+4>>2]=0;f[i+8>>2]=0;f[i+12>>2]=0;f[i+16>>2]=0;f[i+20>>2]=0;fd(i,n,o-n>>3,e)|0;n=i+16|0;o=Tn(f[n>>2]|0,f[n+4>>2]|0,1)|0;n=(f[e+4>>2]|0)-(f[e>>2]|0)|0;l=j;f[l>>2]=n;f[l+4>>2]=0;l=Vn(o|0,I|0,39,0)|0;o=Yn(l|0,I|0,3)|0;l=Vn(o|0,I|0,8,0)|0;o=Vn(l|0,I|0,n|0,0)|0;Cl(e,o,I);o=i+24|0;f[o>>2]=(f[e>>2]|0)+(f[j>>2]|0);j=i+28|0;f[j>>2]=0;n=i+32|0;f[n>>2]=16384;if(d){d=c;c=16384;do{l=d;d=d+-1|0;p=f[a+(d<<2)>>2]|0;m=f[i>>2]|0;q=f[m+(p<<3)>>2]|0;r=q<<10;if(c>>>0<r>>>0)s=c;else{t=c;while(1){v=f[o>>2]|0;w=f[j>>2]|0;f[j>>2]=w+1;b[v+w>>0]=t;w=(f[n>>2]|0)>>>8;f[n>>2]=w;if(w>>>0<r>>>0){s=w;break}else t=w}}c=(((s>>>0)/(q>>>0)|0)<<12)+((s>>>0)%(q>>>0)|0)+(f[m+(p<<3)+4>>2]|0)|0;f[n>>2]=c}while((l|0)>1)}_f(i,e);e=f[i>>2]|0;if(e|0){c=i+4|0;i=f[c>>2]|0;if((i|0)!=(e|0))f[c>>2]=i+(~((i+-8-e|0)>>>3)<<3);Oq(e)}e=f[h>>2]|0;if(!e){u=g;return 1}h=f[k>>2]|0;if((h|0)!=(e|0))f[k>>2]=h+(~((h+-8-e|0)>>>3)<<3);Oq(e);u=g;return 1}function re(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0;g=u;u=u+64|0;h=g+48|0;i=g;j=d+1|0;f[h>>2]=0;k=h+4|0;f[k>>2]=0;f[h+8>>2]=0;do if(j)if(j>>>0>536870911)aq(h);else{l=ln(j<<3)|0;f[h>>2]=l;m=l+(j<<3)|0;f[h+8>>2]=m;sj(l|0,0,(d<<3)+8|0)|0;f[k>>2]=m;n=l;o=m;break}else{n=0;o=0}while(0);d=(c|0)>0;if(d){j=0;do{m=n+(f[a+(j<<2)>>2]<<3)|0;l=m;p=Vn(f[l>>2]|0,f[l+4>>2]|0,1,0)|0;l=m;f[l>>2]=p;f[l+4>>2]=I;j=j+1|0}while((j|0)!=(c|0))}j=i+40|0;l=j;f[l>>2]=0;f[l+4>>2]=0;f[i>>2]=0;f[i+4>>2]=0;f[i+8>>2]=0;f[i+12>>2]=0;f[i+16>>2]=0;f[i+20>>2]=0;gd(i,n,o-n>>3,e)|0;n=i+16|0;o=Tn(f[n>>2]|0,f[n+4>>2]|0,1)|0;n=(f[e+4>>2]|0)-(f[e>>2]|0)|0;l=j;f[l>>2]=n;f[l+4>>2]=0;l=Vn(o|0,I|0,39,0)|0;o=Yn(l|0,I|0,3)|0;l=Vn(o|0,I|0,8,0)|0;o=Vn(l|0,I|0,n|0,0)|0;Cl(e,o,I);o=i+24|0;f[o>>2]=(f[e>>2]|0)+(f[j>>2]|0);j=i+28|0;f[j>>2]=0;n=i+32|0;f[n>>2]=16384;if(d){d=c;c=16384;do{l=d;d=d+-1|0;p=f[a+(d<<2)>>2]|0;m=f[i>>2]|0;q=f[m+(p<<3)>>2]|0;r=q<<10;if(c>>>0<r>>>0)s=c;else{t=c;while(1){v=f[o>>2]|0;w=f[j>>2]|0;f[j>>2]=w+1;b[v+w>>0]=t;w=(f[n>>2]|0)>>>8;f[n>>2]=w;if(w>>>0<r>>>0){s=w;break}else t=w}}c=(((s>>>0)/(q>>>0)|0)<<12)+((s>>>0)%(q>>>0)|0)+(f[m+(p<<3)+4>>2]|0)|0;f[n>>2]=c}while((l|0)>1)}_f(i,e);e=f[i>>2]|0;if(e|0){c=i+4|0;i=f[c>>2]|0;if((i|0)!=(e|0))f[c>>2]=i+(~((i+-8-e|0)>>>3)<<3);Oq(e)}e=f[h>>2]|0;if(!e){u=g;return 1}h=f[k>>2]|0;if((h|0)!=(e|0))f[k>>2]=h+(~((h+-8-e|0)>>>3)<<3);Oq(e);u=g;return 1}function se(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0;g=u;u=u+64|0;h=g+48|0;i=g;j=d+1|0;f[h>>2]=0;k=h+4|0;f[k>>2]=0;f[h+8>>2]=0;do if(j)if(j>>>0>536870911)aq(h);else{l=ln(j<<3)|0;f[h>>2]=l;m=l+(j<<3)|0;f[h+8>>2]=m;sj(l|0,0,(d<<3)+8|0)|0;f[k>>2]=m;n=l;o=m;break}else{n=0;o=0}while(0);d=(c|0)>0;if(d){j=0;do{m=n+(f[a+(j<<2)>>2]<<3)|0;l=m;p=Vn(f[l>>2]|0,f[l+4>>2]|0,1,0)|0;l=m;f[l>>2]=p;f[l+4>>2]=I;j=j+1|0}while((j|0)!=(c|0))}j=i+40|0;l=j;f[l>>2]=0;f[l+4>>2]=0;f[i>>2]=0;f[i+4>>2]=0;f[i+8>>2]=0;f[i+12>>2]=0;f[i+16>>2]=0;f[i+20>>2]=0;hd(i,n,o-n>>3,e)|0;n=i+16|0;o=Tn(f[n>>2]|0,f[n+4>>2]|0,1)|0;n=(f[e+4>>2]|0)-(f[e>>2]|0)|0;l=j;f[l>>2]=n;f[l+4>>2]=0;l=Vn(o|0,I|0,39,0)|0;o=Yn(l|0,I|0,3)|0;l=Vn(o|0,I|0,8,0)|0;o=Vn(l|0,I|0,n|0,0)|0;Cl(e,o,I);o=i+24|0;f[o>>2]=(f[e>>2]|0)+(f[j>>2]|0);j=i+28|0;f[j>>2]=0;n=i+32|0;f[n>>2]=16384;if(d){d=c;c=16384;do{l=d;d=d+-1|0;p=f[a+(d<<2)>>2]|0;m=f[i>>2]|0;q=f[m+(p<<3)>>2]|0;r=q<<10;if(c>>>0<r>>>0)s=c;else{t=c;while(1){v=f[o>>2]|0;w=f[j>>2]|0;f[j>>2]=w+1;b[v+w>>0]=t;w=(f[n>>2]|0)>>>8;f[n>>2]=w;if(w>>>0<r>>>0){s=w;break}else t=w}}c=(((s>>>0)/(q>>>0)|0)<<12)+((s>>>0)%(q>>>0)|0)+(f[m+(p<<3)+4>>2]|0)|0;f[n>>2]=c}while((l|0)>1)}_f(i,e);e=f[i>>2]|0;if(e|0){c=i+4|0;i=f[c>>2]|0;if((i|0)!=(e|0))f[c>>2]=i+(~((i+-8-e|0)>>>3)<<3);Oq(e)}e=f[h>>2]|0;if(!e){u=g;return 1}h=f[k>>2]|0;if((h|0)!=(e|0))f[k>>2]=h+(~((h+-8-e|0)>>>3)<<3);Oq(e);u=g;return 1}function te(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0;g=u;u=u+64|0;h=g+48|0;i=g;j=d+1|0;f[h>>2]=0;k=h+4|0;f[k>>2]=0;f[h+8>>2]=0;do if(j)if(j>>>0>536870911)aq(h);else{l=ln(j<<3)|0;f[h>>2]=l;m=l+(j<<3)|0;f[h+8>>2]=m;sj(l|0,0,(d<<3)+8|0)|0;f[k>>2]=m;n=l;o=m;break}else{n=0;o=0}while(0);d=(c|0)>0;if(d){j=0;do{m=n+(f[a+(j<<2)>>2]<<3)|0;l=m;p=Vn(f[l>>2]|0,f[l+4>>2]|0,1,0)|0;l=m;f[l>>2]=p;f[l+4>>2]=I;j=j+1|0}while((j|0)!=(c|0))}j=i+40|0;l=j;f[l>>2]=0;f[l+4>>2]=0;f[i>>2]=0;f[i+4>>2]=0;f[i+8>>2]=0;f[i+12>>2]=0;f[i+16>>2]=0;f[i+20>>2]=0;id(i,n,o-n>>3,e)|0;n=i+16|0;o=Tn(f[n>>2]|0,f[n+4>>2]|0,1)|0;n=(f[e+4>>2]|0)-(f[e>>2]|0)|0;l=j;f[l>>2]=n;f[l+4>>2]=0;l=Vn(o|0,I|0,39,0)|0;o=Yn(l|0,I|0,3)|0;l=Vn(o|0,I|0,8,0)|0;o=Vn(l|0,I|0,n|0,0)|0;Cl(e,o,I);o=i+24|0;f[o>>2]=(f[e>>2]|0)+(f[j>>2]|0);j=i+28|0;f[j>>2]=0;n=i+32|0;f[n>>2]=16384;if(d){d=c;c=16384;do{l=d;d=d+-1|0;p=f[a+(d<<2)>>2]|0;m=f[i>>2]|0;q=f[m+(p<<3)>>2]|0;r=q<<10;if(c>>>0<r>>>0)s=c;else{t=c;while(1){v=f[o>>2]|0;w=f[j>>2]|0;f[j>>2]=w+1;b[v+w>>0]=t;w=(f[n>>2]|0)>>>8;f[n>>2]=w;if(w>>>0<r>>>0){s=w;break}else t=w}}c=(((s>>>0)/(q>>>0)|0)<<12)+((s>>>0)%(q>>>0)|0)+(f[m+(p<<3)+4>>2]|0)|0;f[n>>2]=c}while((l|0)>1)}_f(i,e);e=f[i>>2]|0;if(e|0){c=i+4|0;i=f[c>>2]|0;if((i|0)!=(e|0))f[c>>2]=i+(~((i+-8-e|0)>>>3)<<3);Oq(e)}e=f[h>>2]|0;if(!e){u=g;return 1}h=f[k>>2]|0;if((h|0)!=(e|0))f[k>>2]=h+(~((h+-8-e|0)>>>3)<<3);Oq(e);u=g;return 1}function ue(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0;g=u;u=u+64|0;h=g+48|0;i=g;j=d+1|0;f[h>>2]=0;k=h+4|0;f[k>>2]=0;f[h+8>>2]=0;do if(j)if(j>>>0>536870911)aq(h);else{l=ln(j<<3)|0;f[h>>2]=l;m=l+(j<<3)|0;f[h+8>>2]=m;sj(l|0,0,(d<<3)+8|0)|0;f[k>>2]=m;n=l;o=m;break}else{n=0;o=0}while(0);d=(c|0)>0;if(d){j=0;do{m=n+(f[a+(j<<2)>>2]<<3)|0;l=m;p=Vn(f[l>>2]|0,f[l+4>>2]|0,1,0)|0;l=m;f[l>>2]=p;f[l+4>>2]=I;j=j+1|0}while((j|0)!=(c|0))}j=i+40|0;l=j;f[l>>2]=0;f[l+4>>2]=0;f[i>>2]=0;f[i+4>>2]=0;f[i+8>>2]=0;f[i+12>>2]=0;f[i+16>>2]=0;f[i+20>>2]=0;jd(i,n,o-n>>3,e)|0;n=i+16|0;o=Tn(f[n>>2]|0,f[n+4>>2]|0,1)|0;n=(f[e+4>>2]|0)-(f[e>>2]|0)|0;l=j;f[l>>2]=n;f[l+4>>2]=0;l=Vn(o|0,I|0,39,0)|0;o=Yn(l|0,I|0,3)|0;l=Vn(o|0,I|0,8,0)|0;o=Vn(l|0,I|0,n|0,0)|0;Cl(e,o,I);o=i+24|0;f[o>>2]=(f[e>>2]|0)+(f[j>>2]|0);j=i+28|0;f[j>>2]=0;n=i+32|0;f[n>>2]=16384;if(d){d=c;c=16384;do{l=d;d=d+-1|0;p=f[a+(d<<2)>>2]|0;m=f[i>>2]|0;q=f[m+(p<<3)>>2]|0;r=q<<10;if(c>>>0<r>>>0)s=c;else{t=c;while(1){v=f[o>>2]|0;w=f[j>>2]|0;f[j>>2]=w+1;b[v+w>>0]=t;w=(f[n>>2]|0)>>>8;f[n>>2]=w;if(w>>>0<r>>>0){s=w;break}else t=w}}c=(((s>>>0)/(q>>>0)|0)<<12)+((s>>>0)%(q>>>0)|0)+(f[m+(p<<3)+4>>2]|0)|0;f[n>>2]=c}while((l|0)>1)}_f(i,e);e=f[i>>2]|0;if(e|0){c=i+4|0;i=f[c>>2]|0;if((i|0)!=(e|0))f[c>>2]=i+(~((i+-8-e|0)>>>3)<<3);Oq(e)}e=f[h>>2]|0;if(!e){u=g;return 1}h=f[k>>2]|0;if((h|0)!=(e|0))f[k>>2]=h+(~((h+-8-e|0)>>>3)<<3);Oq(e);u=g;return 1}function ve(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0;c=u;u=u+16|0;d=c+4|0;e=c;f[a+64>>2]=b;g=a+128|0;f[g>>2]=2;h=a+132|0;f[h>>2]=7;i=Qa[f[(f[b>>2]|0)+32>>2]&127](b)|0;b=a+88|0;f[b>>2]=i;j=a+104|0;k=(f[i+28>>2]|0)-(f[i+24>>2]|0)>>2;i=a+108|0;l=f[i>>2]|0;m=f[j>>2]|0;n=l-m>>2;o=m;p=l;if(k>>>0<=n>>>0)if(k>>>0<n>>>0?(q=o+(k<<2)|0,(q|0)!=(p|0)):0){o=p+(~((p+-4-q|0)>>>2)<<2)|0;f[i>>2]=o;r=o;s=m}else{r=l;s=m}else{Ci(j,k-n|0);r=f[i>>2]|0;s=f[j>>2]|0}if((r|0)!=(s|0)){s=0;do{r=f[b>>2]|0;f[e>>2]=s;f[d>>2]=f[e>>2];n=hh(r,d)|0;r=f[j>>2]|0;f[r+(s<<2)>>2]=n;s=s+1|0}while(s>>>0<(f[i>>2]|0)-r>>2>>>0)}i=a+92|0;s=f[b>>2]|0;j=f[s>>2]|0;d=(f[s+4>>2]|0)-j>>2;e=a+96|0;r=f[e>>2]|0;n=f[i>>2]|0;k=r-n>>2;m=n;n=r;if(d>>>0<=k>>>0)if(d>>>0<k>>>0?(r=m+(d<<2)|0,(r|0)!=(n|0)):0){f[e>>2]=n+(~((n+-4-r|0)>>>2)<<2);t=s;v=j}else{t=s;v=j}else{Ci(i,d-k|0);k=f[b>>2]|0;t=k;v=f[k>>2]|0}k=f[t+4>>2]|0;if((k|0)!=(v|0)){v=f[i>>2]|0;i=f[t>>2]|0;t=k-i>>2;k=0;do{f[v+(k<<2)>>2]=f[i+(k<<2)>>2];k=k+1|0}while(k>>>0<t>>>0)}t=(f[h>>2]|0)-(f[g>>2]|0)+1|0;g=a+136|0;h=a+140|0;a=f[h>>2]|0;k=f[g>>2]|0;i=(a-k|0)/12|0;v=a;if(t>>>0>i>>>0){Kf(g,t-i|0);u=c;return 1}if(t>>>0>=i>>>0){u=c;return 1}i=k+(t*12|0)|0;if((i|0)==(v|0)){u=c;return 1}else w=v;while(1){v=w+-12|0;f[h>>2]=v;t=f[v>>2]|0;if(!t)x=v;else{v=w+-8|0;k=f[v>>2]|0;if((k|0)!=(t|0))f[v>>2]=k+(~((k+-4-t|0)>>>2)<<2);Oq(t);x=f[h>>2]|0}if((x|0)==(i|0))break;else w=x}u=c;return 1}function we(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0;e=f[b>>2]|0;g=f[b+4>>2]|0;h=((f[c>>2]|0)-e<<3)+(f[c+4>>2]|0)-g|0;c=e;if((h|0)<=0){i=d+4|0;j=f[d>>2]|0;f[a>>2]=j;k=a+4|0;l=f[i>>2]|0;f[k>>2]=l;return}if(!g){e=d+4|0;m=h;n=e;o=f[e>>2]|0;p=c}else{e=32-g|0;q=(h|0)<(e|0)?h:e;r=-1>>>(e-q|0)&-1<<g&f[c>>2];e=d+4|0;s=f[e>>2]|0;t=32-s|0;u=t>>>0<q>>>0?t:q;v=f[d>>2]|0;w=f[v>>2]&~(-1>>>(t-u|0)&-1<<s);f[v>>2]=w;s=f[e>>2]|0;f[v>>2]=(s>>>0>g>>>0?r<<s-g:r>>>(g-s|0))|w;w=(f[e>>2]|0)+u|0;s=v+(w>>>5<<2)|0;f[d>>2]=s;v=w&31;f[e>>2]=v;w=q-u|0;if((w|0)>0){f[s>>2]=f[s>>2]&~(-1>>>(32-w|0))|r>>>(g+u|0);f[e>>2]=w;x=w}else x=v;v=c+4|0;f[b>>2]=v;m=h-q|0;n=e;o=x;p=v}v=32-o|0;x=-1<<o;if((m|0)>31){o=~x;e=f[d>>2]|0;q=~m;h=m+((q|0)>-64?q:-64)+32|0;q=(h>>>5)+1|0;c=m+-32-(h&-32)|0;h=m;w=p;u=f[e>>2]|0;g=e;while(1){r=f[w>>2]|0;s=u&o;f[g>>2]=s;f[g>>2]=s|r<<f[n>>2];g=g+4|0;u=f[g>>2]&x|r>>>v;f[g>>2]=u;if((h|0)<=63)break;else{h=h+-32|0;w=w+4|0}}w=p+(q<<2)|0;f[b>>2]=w;f[d>>2]=e+(q<<2);y=c;z=w}else{y=m;z=p}if((y|0)<=0){i=n;j=f[d>>2]|0;f[a>>2]=j;k=a+4|0;l=f[i>>2]|0;f[k>>2]=l;return}p=f[z>>2]&-1>>>(32-y|0);z=(v|0)<(y|0)?v:y;m=f[d>>2]|0;w=f[m>>2]&~(-1<<f[n>>2]&-1>>>(v-z|0));f[m>>2]=w;f[m>>2]=w|p<<f[n>>2];w=(f[n>>2]|0)+z|0;v=m+(w>>>5<<2)|0;f[d>>2]=v;f[n>>2]=w&31;w=y-z|0;if((w|0)<=0){i=n;j=f[d>>2]|0;f[a>>2]=j;k=a+4|0;l=f[i>>2]|0;f[k>>2]=l;return}f[v>>2]=f[v>>2]&~(-1>>>(32-w|0))|p>>>z;f[n>>2]=w;i=n;j=f[d>>2]|0;f[a>>2]=j;k=a+4|0;l=f[i>>2]|0;f[k>>2]=l;return}function xe(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0;e=f[b>>2]|0;g=b+4|0;h=f[g>>2]|0;i=((f[c>>2]|0)-e<<3)+(f[c+4>>2]|0)-h|0;c=e;if((i|0)<=0){j=d+4|0;k=f[d>>2]|0;f[a>>2]=k;l=a+4|0;m=f[j>>2]|0;f[l>>2]=m;return}if(!h){e=d+4|0;n=i;o=e;p=c;q=f[e>>2]|0}else{e=32-h|0;r=(i|0)<(e|0)?i:e;s=-1>>>(e-r|0)&-1<<h&f[c>>2];c=d+4|0;h=f[c>>2]|0;e=32-h|0;t=e>>>0<r>>>0?e:r;u=f[d>>2]|0;v=f[u>>2]&~(-1>>>(e-t|0)&-1<<h);f[u>>2]=v;h=f[c>>2]|0;e=f[g>>2]|0;f[u>>2]=(h>>>0>e>>>0?s<<h-e:s>>>(e-h|0))|v;v=(f[c>>2]|0)+t|0;h=u+(v>>>5<<2)|0;f[d>>2]=h;u=v&31;f[c>>2]=u;v=r-t|0;if((v|0)>0){e=f[h>>2]&~(-1>>>(32-v|0));f[h>>2]=e;f[h>>2]=e|s>>>((f[g>>2]|0)+t|0);f[c>>2]=v;w=v}else w=u;u=(f[b>>2]|0)+4|0;f[b>>2]=u;n=i-r|0;o=c;p=u;q=w}w=32-q|0;u=-1<<q;if((n|0)>31){q=~u;c=~n;r=n+((c|0)>-64?c:-64)+32&-32;c=n;i=p;while(1){v=f[i>>2]|0;t=f[d>>2]|0;g=f[t>>2]&q;f[t>>2]=g;f[t>>2]=g|v<<f[o>>2];g=t+4|0;f[d>>2]=g;f[g>>2]=f[g>>2]&u|v>>>w;i=(f[b>>2]|0)+4|0;f[b>>2]=i;if((c|0)<=63)break;else c=c+-32|0}x=n+-32-r|0;y=i}else{x=n;y=p}if((x|0)<=0){j=o;k=f[d>>2]|0;f[a>>2]=k;l=a+4|0;m=f[j>>2]|0;f[l>>2]=m;return}p=f[y>>2]&-1>>>(32-x|0);y=(w|0)<(x|0)?w:x;n=f[d>>2]|0;i=f[n>>2]&~(-1<<f[o>>2]&-1>>>(w-y|0));f[n>>2]=i;f[n>>2]=i|p<<f[o>>2];i=(f[o>>2]|0)+y|0;w=n+(i>>>5<<2)|0;f[d>>2]=w;f[o>>2]=i&31;i=x-y|0;if((i|0)<=0){j=o;k=f[d>>2]|0;f[a>>2]=k;l=a+4|0;m=f[j>>2]|0;f[l>>2]=m;return}f[w>>2]=f[w>>2]&~(-1>>>(32-i|0))|p>>>y;f[o>>2]=i;j=o;k=f[d>>2]|0;f[a>>2]=k;l=a+4|0;m=f[j>>2]|0;f[l>>2]=m;return}function ye(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;d=u;u=u+16|0;e=d+4|0;g=d;h=d+9|0;i=d+8|0;j=f[(f[a+184>>2]|0)+(c<<2)>>2]&255;b[h>>0]=j;c=a+4|0;k=f[(f[c>>2]|0)+44>>2]|0;l=k+16|0;m=f[l+4>>2]|0;if((m|0)>0|(m|0)==0&(f[l>>2]|0)>>>0>0)n=j;else{f[g>>2]=f[k+4>>2];f[e>>2]=f[g>>2];Me(k,e,h,h+1|0)|0;n=b[h>>0]|0}a:do if(n<<24>>24>-1){k=a+172|0;j=f[(f[k>>2]|0)+((n<<24>>24)*136|0)>>2]|0;l=(Qa[f[(f[a>>2]|0)+40>>2]&127](a)|0)+52|0;m=b[h>>0]|0;o=f[k>>2]|0;k=f[o+(m*136|0)+132>>2]|0;switch(f[(f[(f[l>>2]|0)+84>>2]|0)+(j<<2)>>2]|0){case 0:{p=k;q=7;break a;break}case 1:{if(b[o+(m*136|0)+28>>0]|0){p=k;q=7;break a}break}default:{}}m=f[(f[c>>2]|0)+44>>2]|0;b[i>>0]=1;o=m+16|0;j=f[o+4>>2]|0;if(!((j|0)>0|(j|0)==0&(f[o>>2]|0)>>>0>0)){f[g>>2]=f[m+4>>2];f[e>>2]=f[g>>2];Me(m,e,i,i+1|0)|0}r=k}else{p=f[a+68>>2]|0;q=7}while(0);if((q|0)==7){q=f[(f[c>>2]|0)+44>>2]|0;b[i>>0]=0;a=q+16|0;h=f[a+4>>2]|0;if(!((h|0)>0|(h|0)==0&(f[a>>2]|0)>>>0>0)){f[g>>2]=f[q+4>>2];f[e>>2]=f[g>>2];Me(q,e,i,i+1|0)|0}r=p}p=f[(f[c>>2]|0)+44>>2]|0;b[i>>0]=r;r=p+16|0;c=f[r+4>>2]|0;if((c|0)>0|(c|0)==0&(f[r>>2]|0)>>>0>0){u=d;return 1}f[g>>2]=f[p+4>>2];f[e>>2]=f[g>>2];Me(p,e,i,i+1|0)|0;u=d;return 1}function ze(a,b,c,d,e,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0;h=u;u=u+16|0;i=h+4|0;j=h;k=a+60|0;f[a+64>>2]=g;g=a+8|0;Mh(g,b,d,e);d=a+56|0;l=f[d>>2]|0;m=f[l+4>>2]|0;n=f[l>>2]|0;o=m-n|0;if((o|0)<=0){u=h;return 1}p=(o>>>2)+-1|0;o=a+68|0;q=a+16|0;r=a+32|0;s=a+12|0;t=a+28|0;v=a+20|0;w=a+24|0;if(m-n>>2>>>0>p>>>0){x=p;y=n}else{z=l;aq(z)}while(1){f[j>>2]=f[y+(x<<2)>>2];f[i>>2]=f[j>>2];ub(k,i,b,x);l=X(x,e)|0;n=b+(l<<2)|0;p=c+(l<<2)|0;l=f[g>>2]|0;if((l|0)>0){m=0;a=o;A=l;while(1){if((A|0)>0){l=0;do{B=f[a+(l<<2)>>2]|0;C=f[q>>2]|0;if((B|0)>(C|0)){D=f[r>>2]|0;f[D+(l<<2)>>2]=C;E=D}else{D=f[s>>2]|0;C=f[r>>2]|0;f[C+(l<<2)>>2]=(B|0)<(D|0)?D:B;E=C}l=l+1|0}while((l|0)<(f[g>>2]|0));F=E}else F=f[r>>2]|0;l=(f[n+(m<<2)>>2]|0)-(f[F+(m<<2)>>2]|0)|0;C=p+(m<<2)|0;f[C>>2]=l;if((l|0)>=(f[t>>2]|0)){if((l|0)>(f[w>>2]|0)){G=l-(f[v>>2]|0)|0;H=18}}else{G=(f[v>>2]|0)+l|0;H=18}if((H|0)==18){H=0;f[C>>2]=G}m=m+1|0;A=f[g>>2]|0;if((m|0)>=(A|0))break;else a=F}}x=x+-1|0;if((x|0)<=-1){H=3;break}a=f[d>>2]|0;y=f[a>>2]|0;if((f[a+4>>2]|0)-y>>2>>>0<=x>>>0){z=a;H=4;break}}if((H|0)==3){u=h;return 1}else if((H|0)==4)aq(z);return 0}function Ae(a,b,c,d,e,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0;h=u;u=u+16|0;i=h+4|0;j=h;k=a+60|0;f[a+64>>2]=g;g=a+8|0;Mh(g,b,d,e);d=a+56|0;l=f[d>>2]|0;m=f[l+4>>2]|0;n=f[l>>2]|0;o=m-n|0;if((o|0)<=0){u=h;return 1}p=(o>>>2)+-1|0;o=a+68|0;q=a+16|0;r=a+32|0;s=a+12|0;t=a+28|0;v=a+20|0;w=a+24|0;if(m-n>>2>>>0>p>>>0){x=p;y=n}else{z=l;aq(z)}while(1){f[j>>2]=f[y+(x<<2)>>2];f[i>>2]=f[j>>2];tb(k,i,b,x);l=X(x,e)|0;n=b+(l<<2)|0;p=c+(l<<2)|0;l=f[g>>2]|0;if((l|0)>0){m=0;a=o;A=l;while(1){if((A|0)>0){l=0;do{B=f[a+(l<<2)>>2]|0;C=f[q>>2]|0;if((B|0)>(C|0)){D=f[r>>2]|0;f[D+(l<<2)>>2]=C;E=D}else{D=f[s>>2]|0;C=f[r>>2]|0;f[C+(l<<2)>>2]=(B|0)<(D|0)?D:B;E=C}l=l+1|0}while((l|0)<(f[g>>2]|0));F=E}else F=f[r>>2]|0;l=(f[n+(m<<2)>>2]|0)-(f[F+(m<<2)>>2]|0)|0;C=p+(m<<2)|0;f[C>>2]=l;if((l|0)>=(f[t>>2]|0)){if((l|0)>(f[w>>2]|0)){G=l-(f[v>>2]|0)|0;H=18}}else{G=(f[v>>2]|0)+l|0;H=18}if((H|0)==18){H=0;f[C>>2]=G}m=m+1|0;A=f[g>>2]|0;if((m|0)>=(A|0))break;else a=F}}x=x+-1|0;if((x|0)<=-1){H=3;break}a=f[d>>2]|0;y=f[a>>2]|0;if((f[a+4>>2]|0)-y>>2>>>0<=x>>>0){z=a;H=4;break}}if((H|0)==3){u=h;return 1}else if((H|0)==4)aq(z);return 0}function Be(a){a=a|0;var b=0,c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0;b=u;u=u+16|0;c=b+4|0;d=b;e=a+12|0;g=f[e>>2]|0;h=(f[g+4>>2]|0)-(f[g>>2]|0)>>2;if(!h){u=b;return 1}i=a+152|0;j=a+140|0;k=a+144|0;l=a+148|0;a=0;m=g;while(1){f[d>>2]=(a>>>0)/3|0;f[c>>2]=f[d>>2];if(!(_j(m,c)|0)?(g=f[e>>2]|0,(f[(f[g+12>>2]|0)+(a<<2)>>2]|0)==-1):0){n=a+1|0;o=((n>>>0)%3|0|0)==0?a+-2|0:n;if((o|0)==-1)p=-1;else p=f[(f[g>>2]|0)+(o<<2)>>2]|0;o=f[i>>2]|0;if((f[o+(p<<2)>>2]|0)==-1){g=f[k>>2]|0;n=f[l>>2]|0;if((g|0)==(n<<5|0)){if((g+1|0)<0){q=11;break}r=n<<6;n=g+32&-32;vi(j,g>>>0<1073741823?(r>>>0<n>>>0?n:r):2147483647);s=f[k>>2]|0;t=f[i>>2]|0}else{s=g;t=o}f[k>>2]=s+1;o=(f[j>>2]|0)+(s>>>5<<2)|0;f[o>>2]=f[o>>2]&~(1<<(s&31));o=t+(p<<2)|0;if((f[o>>2]|0)==-1){r=a;n=o;while(1){f[n>>2]=g;o=r+1|0;a:do if((r|0)!=-1?(v=((o>>>0)%3|0|0)==0?r+-2|0:o,(v|0)!=-1):0){w=f[e>>2]|0;x=f[w+12>>2]|0;y=v;while(1){v=f[x+(y<<2)>>2]|0;if((v|0)==-1)break;z=v+1|0;A=((z>>>0)%3|0|0)==0?v+-2|0:z;if((A|0)==-1){B=-1;C=-1;break a}else y=A}x=y+1|0;A=((x>>>0)%3|0|0)==0?y+-2|0:x;if((A|0)==-1){B=y;C=-1}else{B=y;C=f[(f[w>>2]|0)+(A<<2)>>2]|0}}else{B=-1;C=-1}while(0);n=t+(C<<2)|0;if((f[n>>2]|0)!=-1)break;else r=B}}}}r=a+1|0;if(r>>>0>=h>>>0){q=3;break}a=r;m=f[e>>2]|0}if((q|0)==3){u=b;return 1}else if((q|0)==11)aq(j);return 0}function Ce(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0;d=u;u=u+32|0;e=d+8|0;g=d;h=a+4|0;i=f[h>>2]|0;if(i>>>0>=b>>>0){f[h>>2]=b;u=d;return}j=a+8|0;k=f[j>>2]|0;l=k<<5;m=b-i|0;if(l>>>0<m>>>0|i>>>0>(l-m|0)>>>0){f[e>>2]=0;n=e+4|0;f[n>>2]=0;o=e+8|0;f[o>>2]=0;if((b|0)<0)aq(a);p=k<<6;k=b+31&-32;vi(e,l>>>0<1073741823?(p>>>0<k>>>0?k:p):2147483647);p=f[h>>2]|0;f[n>>2]=p+m;k=f[a>>2]|0;l=k;q=f[e>>2]|0;r=(l+(p>>>5<<2)-k<<3)+(p&31)|0;if((r|0)>0){p=r>>>5;im(q|0,k|0,p<<2|0)|0;k=r&31;r=q+(p<<2)|0;s=r;if(!k){t=0;v=s}else{w=-1>>>(32-k|0);f[r>>2]=f[r>>2]&~w|f[l+(p<<2)>>2]&w;t=k;v=s}}else{t=0;v=q}f[g>>2]=v;f[g+4>>2]=t;t=g;g=f[t>>2]|0;v=f[t+4>>2]|0;t=f[a>>2]|0;f[a>>2]=f[e>>2];f[e>>2]=t;e=f[h>>2]|0;f[h>>2]=f[n>>2];f[n>>2]=e;e=f[j>>2]|0;f[j>>2]=f[o>>2];f[o>>2]=e;if(t|0)Oq(t);x=g;y=v}else{v=(f[a>>2]|0)+(i>>>5<<2)|0;f[h>>2]=b;x=v;y=i&31}if(!m){u=d;return}i=(y|0)==0;v=x;if(c){if(i){z=m;A=x;B=v}else{c=32-y|0;b=c>>>0>m>>>0?m:c;f[v>>2]=f[v>>2]|-1>>>(c-b|0)&-1<<y;c=v+4|0;z=m-b|0;A=c;B=c}c=z>>>5;sj(A|0,-1,c<<2|0)|0;A=z&31;z=B+(c<<2)|0;if(!A){u=d;return}f[z>>2]=f[z>>2]|-1>>>(32-A|0);u=d;return}else{if(i){C=m;D=x;E=v}else{x=32-y|0;i=x>>>0>m>>>0?m:x;f[v>>2]=f[v>>2]&~(-1>>>(x-i|0)&-1<<y);y=v+4|0;C=m-i|0;D=y;E=y}y=C>>>5;sj(D|0,0,y<<2|0)|0;D=C&31;C=E+(y<<2)|0;if(!D){u=d;return}f[C>>2]=f[C>>2]&~(-1>>>(32-D|0));u=d;return}}function De(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0;a=u;u=u+48|0;g=a+36|0;h=a+24|0;i=a+12|0;j=a;if(!c){k=0;u=a;return k|0}f[g>>2]=0;f[g+4>>2]=0;f[g+8>>2]=0;l=Gj(d)|0;if(l>>>0>4294967279)aq(g);if(l>>>0<11){b[g+11>>0]=l;if(!l)m=g;else{n=g;o=7}}else{p=l+16&-16;q=ln(p)|0;f[g>>2]=q;f[g+8>>2]=p|-2147483648;f[g+4>>2]=l;n=q;o=7}if((o|0)==7){kh(n|0,d|0,l|0)|0;m=n}b[m+l>>0]=0;f[h>>2]=0;f[h+4>>2]=0;f[h+8>>2]=0;l=Gj(e)|0;if(l>>>0>4294967279)aq(h);if(l>>>0<11){b[h+11>>0]=l;if(!l)r=h;else{s=h;o=13}}else{m=l+16&-16;n=ln(m)|0;f[h>>2]=n;f[h+8>>2]=m|-2147483648;f[h+4>>2]=l;s=n;o=13}if((o|0)==13){kh(s|0,e|0,l|0)|0;r=s}b[r+l>>0]=0;f[i>>2]=0;f[i+4>>2]=0;f[i+8>>2]=0;l=Gj(d)|0;if(l>>>0>4294967279)aq(i);if(l>>>0<11){b[i+11>>0]=l;if(!l)t=i;else{v=i;o=19}}else{r=l+16&-16;s=ln(r)|0;f[i>>2]=s;f[i+8>>2]=r|-2147483648;f[i+4>>2]=l;v=s;o=19}if((o|0)==19){kh(v|0,d|0,l|0)|0;t=v}b[t+l>>0]=0;f[j>>2]=0;f[j+4>>2]=0;f[j+8>>2]=0;l=Gj(e)|0;if(l>>>0>4294967279)aq(j);if(l>>>0<11){b[j+11>>0]=l;if(!l)w=j;else{x=j;o=25}}else{t=l+16&-16;v=ln(t)|0;f[j>>2]=v;f[j+8>>2]=t|-2147483648;f[j+4>>2]=l;x=v;o=25}if((o|0)==25){kh(x|0,e|0,l|0)|0;w=x}b[w+l>>0]=0;mn(c,i,j);if((b[j+11>>0]|0)<0)Oq(f[j>>2]|0);if((b[i+11>>0]|0)<0)Oq(f[i>>2]|0);if((b[h+11>>0]|0)<0)Oq(f[h>>2]|0);if((b[g+11>>0]|0)<0)Oq(f[g>>2]|0);k=1;u=a;return k|0}function Ee(a,c){a=a|0;c=c|0;var d=0,e=0,g=0;f[a>>2]=f[c>>2];d=c+4|0;f[a+4>>2]=f[d>>2];e=c+8|0;f[a+8>>2]=f[e>>2];g=c+12|0;f[a+12>>2]=f[g>>2];f[d>>2]=0;f[e>>2]=0;f[g>>2]=0;g=c+16|0;f[a+16>>2]=f[g>>2];e=c+20|0;f[a+20>>2]=f[e>>2];d=c+24|0;f[a+24>>2]=f[d>>2];f[g>>2]=0;f[e>>2]=0;f[d>>2]=0;b[a+28>>0]=b[c+28>>0]|0;d=a+32|0;e=c+32|0;f[d>>2]=0;g=a+36|0;f[g>>2]=0;f[a+40>>2]=0;f[d>>2]=f[e>>2];d=c+36|0;f[g>>2]=f[d>>2];g=c+40|0;f[a+40>>2]=f[g>>2];f[g>>2]=0;f[d>>2]=0;f[e>>2]=0;e=a+44|0;d=c+44|0;f[e>>2]=0;g=a+48|0;f[g>>2]=0;f[a+52>>2]=0;f[e>>2]=f[d>>2];e=c+48|0;f[g>>2]=f[e>>2];g=c+52|0;f[a+52>>2]=f[g>>2];f[g>>2]=0;f[e>>2]=0;f[d>>2]=0;d=a+56|0;e=c+56|0;f[d>>2]=0;g=a+60|0;f[g>>2]=0;f[a+64>>2]=0;f[d>>2]=f[e>>2];d=c+60|0;f[g>>2]=f[d>>2];g=c+64|0;f[a+64>>2]=f[g>>2];f[g>>2]=0;f[d>>2]=0;f[e>>2]=0;f[a+68>>2]=f[c+68>>2];f[a+72>>2]=f[c+72>>2];e=a+76|0;d=c+76|0;f[e>>2]=0;g=a+80|0;f[g>>2]=0;f[a+84>>2]=0;f[e>>2]=f[d>>2];e=c+80|0;f[g>>2]=f[e>>2];g=c+84|0;f[a+84>>2]=f[g>>2];f[g>>2]=0;f[e>>2]=0;f[d>>2]=0;d=a+88|0;e=c+88|0;f[d>>2]=0;g=a+92|0;f[g>>2]=0;f[a+96>>2]=0;f[d>>2]=f[e>>2];d=c+92|0;f[g>>2]=f[d>>2];g=c+96|0;f[a+96>>2]=f[g>>2];f[g>>2]=0;f[d>>2]=0;f[e>>2]=0;b[a+100>>0]=b[c+100>>0]|0;e=a+104|0;d=c+104|0;f[e>>2]=0;g=a+108|0;f[g>>2]=0;f[a+112>>2]=0;f[e>>2]=f[d>>2];e=c+108|0;f[g>>2]=f[e>>2];g=c+112|0;f[a+112>>2]=f[g>>2];f[g>>2]=0;f[e>>2]=0;f[d>>2]=0;d=a+116|0;e=c+116|0;f[d>>2]=0;g=a+120|0;f[g>>2]=0;f[a+124>>2]=0;f[d>>2]=f[e>>2];d=c+120|0;f[g>>2]=f[d>>2];g=c+124|0;f[a+124>>2]=f[g>>2];f[g>>2]=0;f[d>>2]=0;f[e>>2]=0;f[a+128>>2]=f[c+128>>2];f[a+132>>2]=f[c+132>>2];return}function Fe(a,c,d,e,g){a=a|0;c=c|0;d=d|0;e=e|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0;h=u;u=u+48|0;i=h+36|0;j=h+24|0;k=h+8|0;l=h+4|0;m=h;n=e+4|0;Rh(i,c,(f[n>>2]|0)-(f[e>>2]|0)>>2,2,g,d,1);g=f[i>>2]|0;o=(f[f[g>>2]>>2]|0)+(f[g+48>>2]|0)|0;f[k>>2]=-1;f[k+4>>2]=-1;f[k+8>>2]=-1;f[k+12>>2]=-1;p=f[c+4>>2]|0;if((p+-2|0)>>>0<=28){f[k>>2]=p;c=1<<p;f[k+4>>2]=c+-1;p=c+-2|0;f[k+8>>2]=p;f[k+12>>2]=(p|0)/2|0;p=f[e>>2]|0;if((f[n>>2]|0)==(p|0))q=g;else{c=d+84|0;r=d+68|0;s=d+48|0;t=d+40|0;v=0;w=0;x=p;while(1){p=f[x+(v<<2)>>2]|0;if(!(b[c>>0]|0))y=f[(f[r>>2]|0)+(p<<2)>>2]|0;else y=p;p=s;z=f[p>>2]|0;A=f[p+4>>2]|0;p=t;B=f[p>>2]|0;C=un(B|0,f[p+4>>2]|0,y|0,0)|0;p=Vn(C|0,I|0,z|0,A|0)|0;kh(j|0,(f[f[d>>2]>>2]|0)+p|0,B|0)|0;rf(k,j,l,m);f[o+(w<<2)>>2]=f[l>>2];f[o+((w|1)<<2)>>2]=f[m>>2];v=v+1|0;x=f[e>>2]|0;if(v>>>0>=(f[n>>2]|0)-x>>2>>>0)break;else w=w+2|0}q=f[i>>2]|0}f[a>>2]=q;f[i>>2]=0;u=h;return}f[a>>2]=0;f[i>>2]=0;if(!g){u=h;return}i=g+88|0;a=f[i>>2]|0;f[i>>2]=0;if(a|0){i=f[a+8>>2]|0;if(i|0){q=a+12|0;if((f[q>>2]|0)!=(i|0))f[q>>2]=i;Oq(i)}Oq(a)}a=f[g+68>>2]|0;if(a|0){i=g+72|0;q=f[i>>2]|0;if((q|0)!=(a|0))f[i>>2]=q+(~((q+-4-a|0)>>>2)<<2);Oq(a)}a=g+64|0;q=f[a>>2]|0;f[a>>2]=0;if(q|0){a=f[q>>2]|0;if(a|0){i=q+4|0;if((f[i>>2]|0)!=(a|0))f[i>>2]=a;Oq(a)}Oq(q)}Oq(g);u=h;return}function Ge(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;d=a+8|0;e=f[d>>2]|0;g=a+4|0;h=f[g>>2]|0;if(((e-h|0)/136|0)>>>0>=c>>>0){i=c;j=h;do{f[j>>2]=-1;Ok(j+4|0);b[j+100>>0]=1;k=j+104|0;f[k>>2]=0;f[k+4>>2]=0;f[k+8>>2]=0;f[k+12>>2]=0;f[k+16>>2]=0;f[k+20>>2]=0;f[k+24>>2]=0;j=(f[g>>2]|0)+136|0;f[g>>2]=j;i=i+-1|0}while((i|0)!=0);return}i=f[a>>2]|0;j=(h-i|0)/136|0;h=j+c|0;if(h>>>0>31580641)aq(a);k=(e-i|0)/136|0;i=k<<1;e=k>>>0<15790320?(i>>>0<h>>>0?h:i):31580641;do if(e)if(e>>>0>31580641){i=ra(8)|0;Oo(i,16035);f[i>>2]=7256;va(i|0,1112,110)}else{l=ln(e*136|0)|0;break}else l=0;while(0);i=l+(j*136|0)|0;j=i;h=l+(e*136|0)|0;e=c;c=j;l=i;do{f[l>>2]=-1;Ok(l+4|0);b[l+100>>0]=1;k=l+104|0;f[k>>2]=0;f[k+4>>2]=0;f[k+8>>2]=0;f[k+12>>2]=0;f[k+16>>2]=0;f[k+20>>2]=0;f[k+24>>2]=0;l=c+136|0;c=l;e=e+-1|0}while((e|0)!=0);e=f[a>>2]|0;l=f[g>>2]|0;if((l|0)==(e|0)){m=j;n=e;o=e}else{k=l;l=j;j=i;do{k=k+-136|0;Ee(j+-136|0,k);j=l+-136|0;l=j}while((k|0)!=(e|0));m=l;n=f[a>>2]|0;o=f[g>>2]|0}f[a>>2]=m;f[g>>2]=c;f[d>>2]=h;h=n;if((o|0)!=(h|0)){d=o;do{o=f[d+-20>>2]|0;if(o|0){c=d+-16|0;g=f[c>>2]|0;if((g|0)!=(o|0))f[c>>2]=g+(~((g+-4-o|0)>>>2)<<2);Oq(o)}o=f[d+-32>>2]|0;if(o|0){g=d+-28|0;c=f[g>>2]|0;if((c|0)!=(o|0))f[g>>2]=c+(~((c+-4-o|0)>>>2)<<2);Oq(o)}Mi(d+-132|0);d=d+-136|0}while((d|0)!=(h|0))}if(!n)return;Oq(n);return}function He(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;c=f[b>>2]|0;b=a+12|0;d=(c|0)==-1;e=c+1|0;do if(!d){g=((e>>>0)%3|0|0)==0?c+-2|0:e;if(!((c>>>0)%3|0)){h=g;i=c+2|0;break}else{h=g;i=c+-1|0;break}}else{h=-1;i=-1}while(0);e=d?-1:(c>>>0)/3|0;g=a+28|0;j=(f[g>>2]|0)+(e>>>5<<2)|0;f[j>>2]=1<<(e&31)|f[j>>2];j=a+172|0;e=a+176|0;k=a+280|0;if(((!d?(d=f[(f[(f[b>>2]|0)+12>>2]|0)+(c<<2)>>2]|0,(d|0)!=-1):0)?(a=(d>>>0)/3|0,(f[(f[g>>2]|0)+(a>>>5<<2)>>2]&1<<(a&31)|0)==0):0)?(a=f[j>>2]|0,(f[e>>2]|0)!=(a|0)):0){d=c>>>5;l=1<<(c&31);c=0;m=a;do{a=(f[k>>2]|0)+(c<<5)|0;if(!(l&f[(f[m+(c*136|0)+4>>2]|0)+(d<<2)>>2]))fj(a,0);else fj(a,1);c=c+1|0;m=f[j>>2]|0}while(c>>>0<(((f[e>>2]|0)-m|0)/136|0)>>>0)}if((((h|0)!=-1?(m=f[(f[(f[b>>2]|0)+12>>2]|0)+(h<<2)>>2]|0,(m|0)!=-1):0)?(c=(m>>>0)/3|0,(f[(f[g>>2]|0)+(c>>>5<<2)>>2]&1<<(c&31)|0)==0):0)?(c=f[j>>2]|0,(f[e>>2]|0)!=(c|0)):0){m=h>>>5;d=1<<(h&31);h=0;l=c;do{c=(f[k>>2]|0)+(h<<5)|0;if(!(d&f[(f[l+(h*136|0)+4>>2]|0)+(m<<2)>>2]))fj(c,0);else fj(c,1);h=h+1|0;l=f[j>>2]|0}while(h>>>0<(((f[e>>2]|0)-l|0)/136|0)>>>0)}if((i|0)==-1)return 1;l=f[(f[(f[b>>2]|0)+12>>2]|0)+(i<<2)>>2]|0;if((l|0)==-1)return 1;b=(l>>>0)/3|0;if(f[(f[g>>2]|0)+(b>>>5<<2)>>2]&1<<(b&31)|0)return 1;b=f[j>>2]|0;if((f[e>>2]|0)==(b|0))return 1;g=i>>>5;l=1<<(i&31);i=0;h=b;do{b=(f[k>>2]|0)+(i<<5)|0;if(!(l&f[(f[h+(i*136|0)+4>>2]|0)+(g<<2)>>2]))fj(b,0);else fj(b,1);i=i+1|0;h=f[j>>2]|0}while(i>>>0<(((f[e>>2]|0)-h|0)/136|0)>>>0);return 1}function Ie(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0;d=u;u=u+16|0;e=d+4|0;g=d;h=d+8|0;i=a+4|0;j=a+8|0;ci((f[j>>2]|0)-(f[i>>2]|0)>>2,c)|0;k=f[i>>2]|0;if((f[j>>2]|0)==(k|0)){u=d;return 1}l=a+32|0;a=c+16|0;m=c+4|0;n=h+1|0;o=h+1|0;p=h+1|0;q=h+1|0;r=0;s=k;do{k=f[(f[(f[l>>2]|0)+8>>2]|0)+(f[s+(r<<2)>>2]<<2)>>2]|0;b[h>>0]=f[k+56>>2];t=a;v=f[t>>2]|0;w=f[t+4>>2]|0;if((w|0)>0|(w|0)==0&v>>>0>0){x=w;y=v}else{f[g>>2]=f[m>>2];f[e>>2]=f[g>>2];Me(c,e,h,q)|0;v=a;x=f[v+4>>2]|0;y=f[v>>2]|0}b[h>>0]=f[k+28>>2];if((x|0)>0|(x|0)==0&y>>>0>0){z=x;A=y}else{f[g>>2]=f[m>>2];f[e>>2]=f[g>>2];Me(c,e,h,p)|0;v=a;z=f[v+4>>2]|0;A=f[v>>2]|0}b[h>>0]=b[k+24>>0]|0;if((z|0)>0|(z|0)==0&A>>>0>0){B=z;C=A}else{f[g>>2]=f[m>>2];f[e>>2]=f[g>>2];Me(c,e,h,o)|0;v=a;B=f[v+4>>2]|0;C=f[v>>2]|0}b[h>>0]=b[k+32>>0]|0;if(!((B|0)>0|(B|0)==0&C>>>0>0)){f[g>>2]=f[m>>2];f[e>>2]=f[g>>2];Me(c,e,h,n)|0}ci(f[k+60>>2]|0,c)|0;r=r+1|0;s=f[i>>2]|0}while(r>>>0<(f[j>>2]|0)-s>>2>>>0);u=d;return 1}function Je(a,c,d,e,g){a=a|0;c=c|0;d=d|0;e=e|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=Oa,D=Oa,E=Oa,F=Oa;h=u;u=u+16|0;i=h;j=e+4|0;k=b[d+24>>0]|0;l=k<<24>>24;Rh(a,c,(f[j>>2]|0)-(f[e>>2]|0)>>2,l,g,d,1);g=f[a>>2]|0;a=(f[f[g>>2]>>2]|0)+(f[g+48>>2]|0)|0;g=f[c+4>>2]|0;Ap(i);Ko(i,$(n[c+20>>2]),(1<<g)+-1|0);g=Lq(l>>>0>1073741823?-1:l<<2)|0;m=f[j>>2]|0;j=f[e>>2]|0;e=j;if((m|0)==(j|0)){Mq(g);u=h;return}o=d+68|0;p=d+48|0;q=d+40|0;r=c+8|0;c=i+4|0;s=(b[d+84>>0]|0)==0;t=m-j>>2;if(k<<24>>24>0){v=0;w=0}else{k=0;do{j=f[e+(k<<2)>>2]|0;if(s)x=f[(f[o>>2]|0)+(j<<2)>>2]|0;else x=j;j=p;m=f[j>>2]|0;y=f[j+4>>2]|0;j=q;z=f[j>>2]|0;A=un(z|0,f[j+4>>2]|0,x|0,0)|0;j=Vn(A|0,I|0,m|0,y|0)|0;kh(g|0,(f[f[d>>2]>>2]|0)+j|0,z|0)|0;k=k+1|0}while(k>>>0<t>>>0);Mq(g);u=h;return}while(1){k=f[e+(v<<2)>>2]|0;if(s)B=f[(f[o>>2]|0)+(k<<2)>>2]|0;else B=k;k=p;x=f[k>>2]|0;z=f[k+4>>2]|0;k=q;j=f[k>>2]|0;y=un(j|0,f[k+4>>2]|0,B|0,0)|0;k=Vn(y|0,I|0,x|0,z|0)|0;kh(g|0,(f[f[d>>2]>>2]|0)+k|0,j|0)|0;j=f[r>>2]|0;C=$(n[i>>2]);k=0;z=w;while(1){D=$(n[g+(k<<2)>>2]);E=$(D-$(n[j+(k<<2)>>2]));x=E<$(0.0);D=$(-E);F=$((x?D:E)/C);y=~~$(J($($(F*$(f[c>>2]|0))+$(.5))));f[a+(z<<2)>>2]=x?0-y|0:y;k=k+1|0;if((k|0)==(l|0))break;else z=z+1|0}v=v+1|0;if(v>>>0>=t>>>0)break;else w=w+l|0}Mq(g);u=h;return}function Ke(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0;d=u;u=u+32|0;e=d+16|0;g=d+12|0;h=d+8|0;i=d+4|0;j=d;lp(a);f[a+16>>2]=0;f[a+20>>2]=0;f[a+12>>2]=a+16;k=a+24|0;lp(k);if((a|0)!=(b|0)){f[h>>2]=f[b>>2];f[i>>2]=b+4;f[g>>2]=f[h>>2];f[e>>2]=f[i>>2];Oc(a,g,e)}l=b+24|0;if((k|0)!=(l|0)){f[h>>2]=f[l>>2];f[i>>2]=b+28;f[g>>2]=f[h>>2];f[e>>2]=f[i>>2];Oc(k,g,e)}f[j>>2]=0;k=c+8|0;l=c+12|0;c=f[l>>2]|0;m=f[k>>2]|0;if((c-m|0)<=0){u=d;return}n=b+16|0;b=m;m=c;c=0;while(1){o=f[(f[b+(c<<2)>>2]|0)+56>>2]|0;p=f[n>>2]|0;if(p){q=n;r=p;a:while(1){p=r;while(1){if((f[p+16>>2]|0)>=(o|0))break;s=f[p+4>>2]|0;if(!s){t=q;break a}else p=s}r=f[p>>2]|0;if(!r){t=p;break}else q=p}if((t|0)!=(n|0)?(o|0)>=(f[t+16>>2]|0):0){q=t+20|0;r=Hd(a,j)|0;if((r|0)!=(q|0)){f[h>>2]=f[q>>2];f[i>>2]=t+24;f[g>>2]=f[h>>2];f[e>>2]=f[i>>2];Oc(r,g,e)}v=f[j>>2]|0;w=f[k>>2]|0;x=f[l>>2]|0}else{v=c;w=b;x=m}}else{v=c;w=b;x=m}c=v+1|0;f[j>>2]=c;if((c|0)>=(x-w>>2|0))break;else{b=w;m=x}}u=d;return}function Le(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0;d=u;u=u+16|0;e=d+4|0;g=d;h=d+8|0;i=a+12|0;ci(f[i>>2]|0,c)|0;if(!(f[i>>2]|0)){j=1;u=d;return j|0}k=c+16|0;l=c+4|0;m=h+1|0;n=h+1|0;o=h+1|0;p=0;while(1){q=f[a>>2]|0;r=f[q+(p<<3)>>2]|0;if(r>>>0>63)if(r>>>0>16383)if(r>>>0>4194303){j=0;s=20;break}else{t=2;s=13}else{t=1;s=13}else if(!r){v=p+1|0;w=0;while(1){if(f[q+(v+w<<3)>>2]|0){x=w;break}y=w+1|0;if(y>>>0<63)w=y;else{x=y;break}}b[h>>0]=x<<2|3;w=k;v=f[w+4>>2]|0;if(!((v|0)>0|(v|0)==0&(f[w>>2]|0)>>>0>0)){f[g>>2]=f[l>>2];f[e>>2]=f[g>>2];Me(c,e,h,o)|0}z=x+p|0}else{t=0;s=13}if((s|0)==13){s=0;b[h>>0]=t|r<<2;w=k;v=f[w+4>>2]|0;if(!((v|0)>0|(v|0)==0&(f[w>>2]|0)>>>0>0)){f[g>>2]=f[l>>2];f[e>>2]=f[g>>2];Me(c,e,h,n)|0}if(!t)z=p;else{w=0;do{w=w+1|0;b[h>>0]=r>>>((w<<3)+-2|0);v=k;q=f[v+4>>2]|0;if(!((q|0)>0|(q|0)==0&(f[v>>2]|0)>>>0>0)){f[g>>2]=f[l>>2];f[e>>2]=f[g>>2];Me(c,e,h,m)|0}}while((w|0)<(t|0));z=p}}p=z+1|0;if(p>>>0>=(f[i>>2]|0)>>>0){j=1;s=20;break}}if((s|0)==20){u=d;return j|0}return 0}function Me(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0;g=f[a>>2]|0;h=g;i=(f[c>>2]|0)-h|0;c=g+i|0;j=e-d|0;if((j|0)<=0){k=c;return k|0}l=a+8|0;m=f[l>>2]|0;n=a+4|0;o=f[n>>2]|0;p=o;if((j|0)<=(m-p|0)){q=p-c|0;if((j|0)>(q|0)){r=d+q|0;if((r|0)==(e|0))s=o;else{t=r;u=o;while(1){b[u>>0]=b[t>>0]|0;t=t+1|0;v=(f[n>>2]|0)+1|0;f[n>>2]=v;if((t|0)==(e|0)){s=v;break}else u=v}}if((q|0)>0){w=r;x=s}else{k=c;return k|0}}else{w=e;x=o}s=x-(c+j)|0;r=c+s|0;if(r>>>0<o>>>0){q=r;r=x;do{b[r>>0]=b[q>>0]|0;q=q+1|0;r=(f[n>>2]|0)+1|0;f[n>>2]=r}while((q|0)!=(o|0))}if(s|0)im(x+(0-s)|0,c|0,s|0)|0;if((w|0)==(d|0)){k=c;return k|0}else{y=d;z=c}while(1){b[z>>0]=b[y>>0]|0;y=y+1|0;if((y|0)==(w|0)){k=c;break}else z=z+1|0}return k|0}z=p-h+j|0;if((z|0)<0)aq(a);j=m-h|0;h=j<<1;m=j>>>0<1073741823?(h>>>0<z>>>0?z:h):2147483647;h=c;if(!m)A=0;else A=ln(m)|0;z=A+i|0;i=z;j=A+m|0;if((d|0)==(e|0)){B=i;C=g}else{g=d;d=i;i=z;do{b[i>>0]=b[g>>0]|0;i=d+1|0;d=i;g=g+1|0}while((g|0)!=(e|0));B=d;C=f[a>>2]|0}d=h-C|0;e=z+(0-d)|0;if((d|0)>0)kh(e|0,C|0,d|0)|0;d=(f[n>>2]|0)-h|0;if((d|0)>0){h=B;kh(h|0,c|0,d|0)|0;D=h+d|0;E=f[a>>2]|0}else{D=B;E=C}f[a>>2]=e;f[n>>2]=D;f[l>>2]=j;if(!E){k=z;return k|0}Oq(E);k=z;return k|0}function Ne(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;e=u;u=u+16|0;g=e;h=f[(f[c+4>>2]|0)+(d<<2)>>2]|0;d=f[c+28>>2]|0;c=f[(f[(f[d+4>>2]|0)+8>>2]|0)+(h<<2)>>2]|0;switch(f[c+28>>2]|0){case 5:case 6:case 3:case 4:case 1:case 2:{i=ln(40)|0;zo(i);j=i;k=j;f[a>>2]=k;u=e;return}case 9:{l=3;break}default:{}}if((l|0)==3){i=f[d+48>>2]|0;d=ln(32)|0;f[g>>2]=d;f[g+8>>2]=-2147483616;f[g+4>>2]=17;m=d;n=14495;o=m+17|0;do{b[m>>0]=b[n>>0]|0;m=m+1|0;n=n+1|0}while((m|0)<(o|0));b[d+17>>0]=0;d=i+16|0;n=f[d>>2]|0;if(n){p=d;q=n;a:while(1){n=q;while(1){if((f[n+16>>2]|0)>=(h|0))break;r=f[n+4>>2]|0;if(!r){s=p;break a}else n=r}q=f[n>>2]|0;if(!q){s=n;break}else p=n}if(((s|0)!=(d|0)?(h|0)>=(f[s+16>>2]|0):0)?(h=s+20|0,(Jh(h,g)|0)!=0):0)t=Hk(h,g,-1)|0;else l=12}else l=12;if((l|0)==12)t=Hk(i,g,-1)|0;if((b[g+11>>0]|0)<0)Oq(f[g>>2]|0);if((t|0)>0)if((f[c+56>>2]|0)==1){c=ln(48)|0;m=c;o=m+48|0;do{f[m>>2]=0;m=m+4|0}while((m|0)<(o|0));zo(c);f[c>>2]=2496;f[c+40>>2]=1168;f[c+44>>2]=-1;j=c;k=j;f[a>>2]=k;u=e;return}else{c=ln(64)|0;ym(c);j=c;k=j;f[a>>2]=k;u=e;return}}c=ln(36)|0;Hm(c);j=c;k=j;f[a>>2]=k;u=e;return}function Oe(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;d=(c|0)==(a|0);b[c+12>>0]=d&1;if(d)return;else e=c;while(1){g=e+8|0;h=f[g>>2]|0;c=h+12|0;if(b[c>>0]|0){i=23;break}j=h+8|0;k=f[j>>2]|0;d=f[k>>2]|0;if((d|0)==(h|0)){l=f[k+4>>2]|0;if(!l){i=7;break}m=l+12|0;if(!(b[m>>0]|0))n=m;else{i=7;break}}else{if(!d){i=16;break}m=d+12|0;if(!(b[m>>0]|0))n=m;else{i=16;break}}b[c>>0]=1;c=(k|0)==(a|0);b[k+12>>0]=c&1;b[n>>0]=1;if(c){i=23;break}else e=k}if((i|0)==7){if((f[h>>2]|0)==(e|0)){o=h;p=k}else{n=h+4|0;a=f[n>>2]|0;c=f[a>>2]|0;f[n>>2]=c;if(!c)q=k;else{f[c+8>>2]=h;q=f[j>>2]|0}f[a+8>>2]=q;q=f[j>>2]|0;f[((f[q>>2]|0)==(h|0)?q:q+4|0)>>2]=a;f[a>>2]=h;f[j>>2]=a;o=a;p=f[a+8>>2]|0}b[o+12>>0]=1;b[p+12>>0]=0;o=f[p>>2]|0;a=o+4|0;q=f[a>>2]|0;f[p>>2]=q;if(q|0)f[q+8>>2]=p;q=p+8|0;f[o+8>>2]=f[q>>2];c=f[q>>2]|0;f[((f[c>>2]|0)==(p|0)?c:c+4|0)>>2]=o;f[a>>2]=p;f[q>>2]=o;return}else if((i|0)==16){if((f[h>>2]|0)==(e|0)){o=e+4|0;q=f[o>>2]|0;f[h>>2]=q;if(!q)r=k;else{f[q+8>>2]=h;r=f[j>>2]|0}f[g>>2]=r;r=f[j>>2]|0;f[((f[r>>2]|0)==(h|0)?r:r+4|0)>>2]=e;f[o>>2]=h;f[j>>2]=e;s=e;t=f[e+8>>2]|0}else{s=h;t=k}b[s+12>>0]=1;b[t+12>>0]=0;s=t+4|0;k=f[s>>2]|0;h=f[k>>2]|0;f[s>>2]=h;if(h|0)f[h+8>>2]=t;h=t+8|0;f[k+8>>2]=f[h>>2];s=f[h>>2]|0;f[((f[s>>2]|0)==(t|0)?s:s+4|0)>>2]=k;f[k>>2]=t;f[h>>2]=k;return}else if((i|0)==23)return}function Pe(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;d=f[b>>2]|0;b=a+12|0;e=(d|0)==-1;do if(e){g=1;h=-1;i=-1}else{j=d+(((d>>>0)%3|0|0)==0?2:-1)|0;if((j|0)!=-1){k=f[(f[b>>2]|0)+12>>2]|0;l=j;while(1){j=f[k+(l<<2)>>2]|0;if((j|0)==-1){m=0;n=l;break}o=j+1|0;l=((o>>>0)%3|0|0)==0?j+-2|0:o;if((l|0)==-1){m=1;n=-1;break}}if(e){g=m;h=-1;i=n;break}else{p=m;q=n}}else{p=1;q=-1}g=p;h=f[(f[f[b>>2]>>2]|0)+(d<<2)>>2]|0;i=q}while(0);if(c){c=(f[a+84>>2]|0)+(h>>>5<<2)|0;f[c>>2]=f[c>>2]|1<<(h&31);r=1}else r=0;c=f[(f[a+152>>2]|0)+(h<<2)>>2]|0;q=(f[a+140>>2]|0)+(c>>>5<<2)|0;f[q>>2]=f[q>>2]|1<<(c&31);if(!g){g=(((i>>>0)%3|0|0)==0?2:-1)+i|0;if((g|0)==-1){s=-1;t=i}else{s=f[(f[f[b>>2]>>2]|0)+(g<<2)>>2]|0;t=i}}else{s=-1;t=-1}if((s|0)==(h|0)){u=r;return u|0}i=f[a+84>>2]|0;a=r;r=s;s=t;while(1){t=i+(r>>>5<<2)|0;f[t>>2]=f[t>>2]|1<<(r&31);t=a+1|0;g=s+1|0;a:do if((s|0)!=-1?(c=((g>>>0)%3|0|0)==0?s+-2|0:g,(c|0)!=-1):0){q=f[b>>2]|0;d=f[q+12>>2]|0;p=c;while(1){c=f[d+(p<<2)>>2]|0;if((c|0)==-1)break;n=c+1|0;m=((n>>>0)%3|0|0)==0?c+-2|0:n;if((m|0)==-1){v=-1;w=-1;break a}else p=m}d=(((p>>>0)%3|0|0)==0?2:-1)+p|0;if((d|0)==-1){v=-1;w=p}else{v=f[(f[q>>2]|0)+(d<<2)>>2]|0;w=p}}else{v=-1;w=-1}while(0);if((v|0)==(h|0)){u=t;break}else{a=t;r=v;s=w}}return u|0}function Qe(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=Oa,C=Oa,D=Oa,E=Oa;g=u;u=u+16|0;h=g;i=b[d+24>>0]|0;j=i<<24>>24;Rh(a,c,e,j,0,d,1);k=f[a>>2]|0;a=(f[f[k>>2]>>2]|0)+(f[k+48>>2]|0)|0;k=f[c+4>>2]|0;Ap(h);Ko(h,$(n[c+20>>2]),(1<<k)+-1|0);k=Lq(j>>>0>1073741823?-1:j<<2)|0;if(!e){Mq(k);u=g;return}l=d+68|0;m=d+48|0;o=d+40|0;p=c+8|0;c=h+4|0;q=(b[d+84>>0]|0)==0;if(i<<24>>24>0){r=0;s=0}else{i=0;do{if(q)t=f[(f[l>>2]|0)+(i<<2)>>2]|0;else t=i;v=m;w=f[v>>2]|0;x=f[v+4>>2]|0;v=o;y=f[v>>2]|0;z=un(y|0,f[v+4>>2]|0,t|0,0)|0;v=Vn(z|0,I|0,w|0,x|0)|0;kh(k|0,(f[f[d>>2]>>2]|0)+v|0,y|0)|0;i=i+1|0}while((i|0)!=(e|0));Mq(k);u=g;return}while(1){if(q)A=f[(f[l>>2]|0)+(s<<2)>>2]|0;else A=s;i=m;t=f[i>>2]|0;y=f[i+4>>2]|0;i=o;v=f[i>>2]|0;x=un(v|0,f[i+4>>2]|0,A|0,0)|0;i=Vn(x|0,I|0,t|0,y|0)|0;kh(k|0,(f[f[d>>2]>>2]|0)+i|0,v|0)|0;v=f[p>>2]|0;B=$(n[h>>2]);i=0;y=r;while(1){C=$(n[k+(i<<2)>>2]);D=$(C-$(n[v+(i<<2)>>2]));t=D<$(0.0);C=$(-D);E=$((t?C:D)/B);x=~~$(J($($(E*$(f[c>>2]|0))+$(.5))));f[a+(y<<2)>>2]=t?0-x|0:x;i=i+1|0;if((i|0)==(j|0))break;else y=y+1|0}s=s+1|0;if((s|0)==(e|0))break;else r=r+j|0}Mq(k);u=g;return}function Re(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;c=a+4|0;d=f[c>>2]|0;e=a+100|0;if(d>>>0<(f[e>>2]|0)>>>0){f[c>>2]=d+1;g=h[d>>0]|0}else g=Si(a)|0;switch(g|0){case 43:case 45:{d=(g|0)==45&1;i=f[c>>2]|0;if(i>>>0<(f[e>>2]|0)>>>0){f[c>>2]=i+1;j=h[i>>0]|0}else j=Si(a)|0;if((b|0)!=0&(j+-48|0)>>>0>9?(f[e>>2]|0)!=0:0){f[c>>2]=(f[c>>2]|0)+-1;k=d;l=j}else{k=d;l=j}break}default:{k=0;l=g}}if((l+-48|0)>>>0>9)if(!(f[e>>2]|0)){m=-2147483648;n=0}else{f[c>>2]=(f[c>>2]|0)+-1;m=-2147483648;n=0}else{g=0;j=l;while(1){g=j+-48+(g*10|0)|0;l=f[c>>2]|0;if(l>>>0<(f[e>>2]|0)>>>0){f[c>>2]=l+1;o=h[l>>0]|0}else o=Si(a)|0;if(!((o+-48|0)>>>0<10&(g|0)<214748364))break;else j=o}j=((g|0)<0)<<31>>31;if((o+-48|0)>>>0<10){l=o;d=g;b=j;while(1){i=un(d|0,b|0,10,0)|0;p=I;q=Vn(l|0,((l|0)<0)<<31>>31|0,-48,-1)|0;r=Vn(q|0,I|0,i|0,p|0)|0;p=I;i=f[c>>2]|0;if(i>>>0<(f[e>>2]|0)>>>0){f[c>>2]=i+1;s=h[i>>0]|0}else s=Si(a)|0;if((s+-48|0)>>>0<10&((p|0)<21474836|(p|0)==21474836&r>>>0<2061584302)){l=s;d=r;b=p}else{t=s;u=r;v=p;break}}}else{t=o;u=g;v=j}if((t+-48|0)>>>0<10)do{t=f[c>>2]|0;if(t>>>0<(f[e>>2]|0)>>>0){f[c>>2]=t+1;w=h[t>>0]|0}else w=Si(a)|0}while((w+-48|0)>>>0<10);if(f[e>>2]|0)f[c>>2]=(f[c>>2]|0)+-1;c=(k|0)!=0;k=Xn(0,0,u|0,v|0)|0;m=c?I:v;n=c?k:u}I=m;return n|0}function Se(a){a=a|0;var b=0,c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;b=a+1176|0;c=f[b>>2]|0;if(c|0){d=a+1180|0;e=f[d>>2]|0;if((e|0)==(c|0))g=c;else{h=e;while(1){e=h+-12|0;f[d>>2]=e;i=f[e>>2]|0;if(!i)j=e;else{e=h+-8|0;k=f[e>>2]|0;if((k|0)!=(i|0))f[e>>2]=k+(~((k+-4-i|0)>>>2)<<2);Oq(i);j=f[d>>2]|0}if((j|0)==(c|0))break;else h=j}g=f[b>>2]|0}Oq(g)}g=a+1164|0;b=f[g>>2]|0;if(b|0){j=a+1168|0;h=f[j>>2]|0;if((h|0)==(b|0))l=b;else{c=h;while(1){h=c+-12|0;f[j>>2]=h;d=f[h>>2]|0;if(!d)m=h;else{h=c+-8|0;i=f[h>>2]|0;if((i|0)!=(d|0))f[h>>2]=i+(~((i+-4-d|0)>>>2)<<2);Oq(d);m=f[j>>2]|0}if((m|0)==(b|0))break;else c=m}l=f[g>>2]|0}Oq(l)}l=f[a+1152>>2]|0;if(l|0){g=a+1156|0;m=f[g>>2]|0;if((m|0)!=(l|0))f[g>>2]=m+(~((m+-4-l|0)>>>2)<<2);Oq(l)}l=f[a+1140>>2]|0;if(l|0){m=a+1144|0;g=f[m>>2]|0;if((g|0)!=(l|0))f[m>>2]=g+(~((g+-4-l|0)>>>2)<<2);Oq(l)}l=f[a+1128>>2]|0;if(!l){n=a+1108|0;jl(n);o=a+1088|0;jl(o);p=a+1068|0;jl(p);q=a+1036|0;Fj(q);r=a+12|0;Nh(r);return}g=a+1132|0;m=f[g>>2]|0;if((m|0)!=(l|0))f[g>>2]=m+(~((m+-4-l|0)>>>2)<<2);Oq(l);n=a+1108|0;jl(n);o=a+1088|0;jl(o);p=a+1068|0;jl(p);q=a+1036|0;Fj(q);r=a+12|0;Nh(r);return}function Te(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;d=u;u=u+16|0;e=d;g=a+4|0;h=f[g>>2]|0;i=f[(f[a>>2]|0)+52>>2]|0;if(!h){if(!(Sa[i&31](a,c,0)|0)){j=0;u=d;return j|0}}else if(!(Sa[i&31](a,c,f[(f[h+4>>2]|0)+80>>2]|0)|0)){j=0;u=d;return j|0}if(!(b[a+28>>0]|0)){j=1;u=d;return j|0}h=f[a+8>>2]|0;i=f[a+32>>2]|0;a=f[h+80>>2]|0;f[e>>2]=0;k=e+4|0;f[k>>2]=0;f[e+8>>2]=0;do if(a)if(a>>>0>1073741823)aq(e);else{l=a<<2;m=ln(l)|0;f[e>>2]=m;n=m+(a<<2)|0;f[e+8>>2]=n;sj(m|0,0,l|0)|0;f[k>>2]=n;o=m;p=n;q=m;break}else{o=0;p=0;q=0}while(0);e=f[c+4>>2]|0;a=f[c>>2]|0;c=a;a:do if((e|0)!=(a|0)){m=e-a>>2;if(b[h+84>>0]|0){n=0;while(1){f[o+(f[c+(n<<2)>>2]<<2)>>2]=n;n=n+1|0;if(n>>>0>=m>>>0)break a}}n=f[h+68>>2]|0;l=0;do{f[o+(f[n+(f[c+(l<<2)>>2]<<2)>>2]<<2)>>2]=l;l=l+1|0}while(l>>>0<m>>>0)}while(0);c=f[(f[(f[g>>2]|0)+4>>2]|0)+80>>2]|0;b:do if(c|0){g=f[i+68>>2]|0;if(b[h+84>>0]|0){a=0;while(1){f[g+(a<<2)>>2]=f[o+(a<<2)>>2];a=a+1|0;if(a>>>0>=c>>>0)break b}}a=f[h+68>>2]|0;e=0;do{f[g+(e<<2)>>2]=f[o+(f[a+(e<<2)>>2]<<2)>>2];e=e+1|0}while(e>>>0<c>>>0)}while(0);if(o|0){if((p|0)!=(o|0))f[k>>2]=p+(~((p+-4-o|0)>>>2)<<2);Oq(q)}j=1;u=d;return j|0}function Ue(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0;c=u;u=u+16|0;d=c;f[a>>2]=0;f[a+8>>2]=b;Oh(a+12|0);wn(a+1036|0);vo(a+1068|0);vo(a+1088|0);vo(a+1108|0);e=a+1128|0;f[e>>2]=0;g=a+1132|0;f[g>>2]=0;f[a+1136>>2]=0;h=(b|0)==0;do if(!h)if(b>>>0>1073741823)aq(e);else{i=b<<2;j=ln(i)|0;f[e>>2]=j;k=j+(b<<2)|0;f[a+1136>>2]=k;sj(j|0,0,i|0)|0;f[g>>2]=k;break}while(0);g=a+1140|0;f[g>>2]=0;e=a+1144|0;f[e>>2]=0;f[a+1148>>2]=0;if(!h){k=b<<2;i=ln(k)|0;f[g>>2]=i;g=i+(b<<2)|0;f[a+1148>>2]=g;sj(i|0,0,k|0)|0;f[e>>2]=g}g=a+1152|0;f[g>>2]=0;e=a+1156|0;f[e>>2]=0;f[a+1160>>2]=0;if(!h){k=b<<2;i=ln(k)|0;f[g>>2]=i;g=i+(b<<2)|0;f[a+1160>>2]=g;sj(i|0,0,k|0)|0;f[e>>2]=g}g=b<<5|1;f[d>>2]=0;e=d+4|0;f[e>>2]=0;f[d+8>>2]=0;if(!h){k=b<<2;i=ln(k)|0;f[d>>2]=i;j=i+(b<<2)|0;f[d+8>>2]=j;sj(i|0,0,k|0)|0;f[e>>2]=j}lk(a+1164|0,g,d);j=f[d>>2]|0;if(j|0){k=f[e>>2]|0;if((k|0)!=(j|0))f[e>>2]=k+(~((k+-4-j|0)>>>2)<<2);Oq(j)}f[d>>2]=0;j=d+4|0;f[j>>2]=0;f[d+8>>2]=0;if(!h){h=b<<2;k=ln(h)|0;f[d>>2]=k;e=k+(b<<2)|0;f[d+8>>2]=e;sj(k|0,0,h|0)|0;f[j>>2]=e}lk(a+1176|0,g,d);g=f[d>>2]|0;if(!g){u=c;return}d=f[j>>2]|0;if((d|0)!=(g|0))f[j>>2]=d+(~((d+-4-g|0)>>>2)<<2);Oq(g);u=c;return}function Ve(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0.0,D=0.0,E=0.0;g=u;u=u+16|0;h=g;i=b+16|0;f[a>>2]=f[i>>2];f[a+4>>2]=f[i+4>>2];f[a+8>>2]=f[i+8>>2];f[a+12>>2]=f[i+12>>2];f[a+16>>2]=f[i+16>>2];f[a+20>>2]=f[i+20>>2];j=a+8|0;f[j>>2]=(f[j>>2]|0)+d;j=(d|0)>0;if(j){k=b+4|0;l=a+16|0;m=a+12|0;n=f[b>>2]|0;o=n;q=0;r=o;s=n;n=o;while(1){o=f[c+(q<<2)>>2]|0;t=f[k>>2]|0;if(t-s>>2>>>0>o>>>0){v=r;w=n}else{x=o+1|0;f[h>>2]=0;y=t-s>>2;z=s;A=t;if(x>>>0<=y>>>0)if(x>>>0<y>>>0?(t=z+(x<<2)|0,(t|0)!=(A|0)):0){f[k>>2]=A+(~((A+-4-t|0)>>>2)<<2);B=r}else B=r;else{Ch(b,x-y|0,h);B=f[b>>2]|0}v=B;w=B}y=w+(o<<2)|0;x=f[y>>2]|0;s=w;if((x|0)<=1)if((x|0)==0?(f[l>>2]=(f[l>>2]|0)+1,o>>>0>(f[m>>2]|0)>>>0):0){f[m>>2]=o;C=0.0}else C=0.0;else{D=+(x|0);C=+Zg(D)*D}x=(f[y>>2]|0)+1|0;f[y>>2]=x;D=+(x|0);E=+Zg(D)*D-C;p[a>>3]=+p[a>>3]+E;q=q+1|0;if((q|0)==(d|0))break;else{r=v;n=w}}}if(e){f[i>>2]=f[a>>2];f[i+4>>2]=f[a+4>>2];f[i+8>>2]=f[a+8>>2];f[i+12>>2]=f[a+12>>2];f[i+16>>2]=f[a+16>>2];u=g;return}if(!j){u=g;return}j=f[b>>2]|0;b=0;do{a=j+(f[c+(b<<2)>>2]<<2)|0;f[a>>2]=(f[a>>2]|0)+-1;b=b+1|0}while((b|0)!=(d|0));u=g;return}function We(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0.0;a:do if(b>>>0<=20)do switch(b|0){case 9:{d=(f[c>>2]|0)+(4-1)&~(4-1);e=f[d>>2]|0;f[c>>2]=d+4;f[a>>2]=e;break a;break}case 10:{e=(f[c>>2]|0)+(4-1)&~(4-1);d=f[e>>2]|0;f[c>>2]=e+4;e=a;f[e>>2]=d;f[e+4>>2]=((d|0)<0)<<31>>31;break a;break}case 11:{d=(f[c>>2]|0)+(4-1)&~(4-1);e=f[d>>2]|0;f[c>>2]=d+4;d=a;f[d>>2]=e;f[d+4>>2]=0;break a;break}case 12:{d=(f[c>>2]|0)+(8-1)&~(8-1);e=d;g=f[e>>2]|0;h=f[e+4>>2]|0;f[c>>2]=d+8;d=a;f[d>>2]=g;f[d+4>>2]=h;break a;break}case 13:{h=(f[c>>2]|0)+(4-1)&~(4-1);d=f[h>>2]|0;f[c>>2]=h+4;h=(d&65535)<<16>>16;d=a;f[d>>2]=h;f[d+4>>2]=((h|0)<0)<<31>>31;break a;break}case 14:{h=(f[c>>2]|0)+(4-1)&~(4-1);d=f[h>>2]|0;f[c>>2]=h+4;h=a;f[h>>2]=d&65535;f[h+4>>2]=0;break a;break}case 15:{h=(f[c>>2]|0)+(4-1)&~(4-1);d=f[h>>2]|0;f[c>>2]=h+4;h=(d&255)<<24>>24;d=a;f[d>>2]=h;f[d+4>>2]=((h|0)<0)<<31>>31;break a;break}case 16:{h=(f[c>>2]|0)+(4-1)&~(4-1);d=f[h>>2]|0;f[c>>2]=h+4;h=a;f[h>>2]=d&255;f[h+4>>2]=0;break a;break}case 17:{h=(f[c>>2]|0)+(8-1)&~(8-1);i=+p[h>>3];f[c>>2]=h+8;p[a>>3]=i;break a;break}case 18:{h=(f[c>>2]|0)+(8-1)&~(8-1);i=+p[h>>3];f[c>>2]=h+8;p[a>>3]=i;break a;break}default:break a}while(0);while(0);return}function Xe(a){a=a|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;c=u;u=u+16|0;d=c+4|0;e=c;g=c+8|0;if(!(Qa[f[(f[a>>2]|0)+32>>2]&127](a)|0)){h=0;u=c;return h|0}i=a+44|0;j=f[i>>2]|0;k=a+8|0;l=a+12|0;m=f[l>>2]|0;n=f[k>>2]|0;b[g>>0]=(m-n|0)>>>2;o=j+16|0;p=f[o+4>>2]|0;if((p|0)>0|(p|0)==0&(f[o>>2]|0)>>>0>0){q=k;r=n;s=m}else{f[e>>2]=f[j+4>>2];f[d>>2]=f[e>>2];Me(j,d,g,g+1|0)|0;q=k;r=f[k>>2]|0;s=f[l>>2]|0}a:do if((r|0)!=(s|0)){l=a+4|0;k=r;while(1){g=f[k>>2]|0;k=k+4|0;if(!(Sa[f[(f[g>>2]|0)+8>>2]&31](g,a,f[l>>2]|0)|0)){h=0;break}if((k|0)==(s|0))break a}u=c;return h|0}while(0);if(!(xc(a)|0)){h=0;u=c;return h|0}s=a+32|0;r=f[s>>2]|0;k=a+36|0;l=f[k>>2]|0;b:do if((r|0)!=(l|0)){g=r;do{if(!(Ra[f[(f[a>>2]|0)+40>>2]&127](a,f[g>>2]|0)|0)){h=0;t=18;break}g=g+4|0}while((g|0)!=(l|0));if((t|0)==18){u=c;return h|0}g=f[s>>2]|0;d=f[k>>2]|0;if((g|0)!=(d|0)){j=g;while(1){g=f[(f[q>>2]|0)+(f[j>>2]<<2)>>2]|0;j=j+4|0;if(!(Ra[f[(f[g>>2]|0)+12>>2]&127](g,f[i>>2]|0)|0)){h=0;break}if((j|0)==(d|0))break b}u=c;return h|0}}while(0);h=Qa[f[(f[a>>2]|0)+44>>2]&127](a)|0;u=c;return h|0}function Ye(a,b){a=a|0;b=b|0;ld(a,b);ld(a+32|0,b);ld(a+64|0,b);ld(a+96|0,b);ld(a+128|0,b);ld(a+160|0,b);ld(a+192|0,b);ld(a+224|0,b);ld(a+256|0,b);ld(a+288|0,b);ld(a+320|0,b);ld(a+352|0,b);ld(a+384|0,b);ld(a+416|0,b);ld(a+448|0,b);ld(a+480|0,b);ld(a+512|0,b);ld(a+544|0,b);ld(a+576|0,b);ld(a+608|0,b);ld(a+640|0,b);ld(a+672|0,b);ld(a+704|0,b);ld(a+736|0,b);ld(a+768|0,b);ld(a+800|0,b);ld(a+832|0,b);ld(a+864|0,b);ld(a+896|0,b);ld(a+928|0,b);ld(a+960|0,b);ld(a+992|0,b);ld(a+1024|0,b);return}function Ze(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0;c=u;u=u+32|0;d=c;e=a+4|0;g=f[a>>2]|0;h=(f[e>>2]|0)-g>>2;i=h+1|0;if(i>>>0>1073741823)aq(a);j=a+8|0;k=(f[j>>2]|0)-g|0;g=k>>1;l=k>>2>>>0<536870911?(g>>>0<i>>>0?i:g):1073741823;f[d+12>>2]=0;f[d+16>>2]=a+8;do if(l)if(l>>>0>1073741823){g=ra(8)|0;Oo(g,16035);f[g>>2]=7256;va(g|0,1112,110)}else{m=ln(l<<2)|0;break}else m=0;while(0);f[d>>2]=m;g=m+(h<<2)|0;h=d+8|0;i=d+4|0;f[i>>2]=g;k=m+(l<<2)|0;l=d+12|0;f[l>>2]=k;m=f[b>>2]|0;f[b>>2]=0;f[g>>2]=m;m=g+4|0;f[h>>2]=m;b=f[a>>2]|0;n=f[e>>2]|0;if((n|0)==(b|0)){o=g;p=l;q=h;r=b;s=m;t=n;v=k;w=o;f[a>>2]=w;f[i>>2]=r;f[e>>2]=s;f[q>>2]=t;x=f[j>>2]|0;f[j>>2]=v;f[p>>2]=x;f[d>>2]=r;ki(d);u=c;return}else{y=n;z=g}do{y=y+-4|0;g=f[y>>2]|0;f[y>>2]=0;f[z+-4>>2]=g;z=(f[i>>2]|0)+-4|0;f[i>>2]=z}while((y|0)!=(b|0));o=z;p=l;q=h;r=f[a>>2]|0;s=f[h>>2]|0;t=f[e>>2]|0;v=f[l>>2]|0;w=o;f[a>>2]=w;f[i>>2]=r;f[e>>2]=s;f[q>>2]=t;x=f[j>>2]|0;f[j>>2]=v;f[p>>2]=x;f[d>>2]=r;ki(d);u=c;return}function _e(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;d=u;u=u+32|0;e=d+12|0;g=d;h=nl(c,0)|0;if(!h){f[a>>2]=0;u=d;return}i=f[c+100>>2]|0;j=f[c+96>>2]|0;c=i-j|0;k=(c|0)/12|0;f[e>>2]=0;l=e+4|0;f[l>>2]=0;f[e+8>>2]=0;m=j;do if(c)if(k>>>0>357913941)aq(e);else{n=ln(c)|0;f[e>>2]=n;f[e+8>>2]=n+(k*12|0);sj(n|0,0,c|0)|0;f[l>>2]=n+c;o=n;break}else o=0;while(0);f[g>>2]=0;f[g+4>>2]=0;f[g+8>>2]=0;a:do if((i|0)!=(j|0)){c=g+4|0;n=g+8|0;if(b[h+84>>0]|0){p=0;while(1){q=m+(p*12|0)|0;f[g>>2]=f[q>>2];f[g+4>>2]=f[q+4>>2];f[g+8>>2]=f[q+8>>2];f[o+(p*12|0)>>2]=f[g>>2];f[o+(p*12|0)+4>>2]=f[c>>2];f[o+(p*12|0)+8>>2]=f[n>>2];p=p+1|0;if(p>>>0>=k>>>0)break a}}p=f[h+68>>2]|0;q=0;do{r=f[p+(f[m+(q*12|0)>>2]<<2)>>2]|0;f[g>>2]=r;s=f[p+(f[m+(q*12|0)+4>>2]<<2)>>2]|0;f[c>>2]=s;t=f[p+(f[m+(q*12|0)+8>>2]<<2)>>2]|0;f[n>>2]=t;f[o+(q*12|0)>>2]=r;f[o+(q*12|0)+4>>2]=s;f[o+(q*12|0)+8>>2]=t;q=q+1|0}while(q>>>0<k>>>0)}while(0);Kj(a,e);a=f[e>>2]|0;if(a|0){e=f[l>>2]|0;if((e|0)!=(a|0))f[l>>2]=e+(~(((e+-12-a|0)>>>0)/12|0)*12|0);Oq(a)}u=d;return}function $e(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0;c=u;u=u+16|0;d=c;f[a>>2]=0;f[a+8>>2]=b;wn(a+12|0);vo(a+44|0);vo(a+64|0);vo(a+84|0);e=a+104|0;f[e>>2]=0;g=a+108|0;f[g>>2]=0;f[a+112>>2]=0;h=(b|0)==0;do if(!h)if(b>>>0>1073741823)aq(e);else{i=b<<2;j=ln(i)|0;f[e>>2]=j;k=j+(b<<2)|0;f[a+112>>2]=k;sj(j|0,0,i|0)|0;f[g>>2]=k;break}while(0);g=a+116|0;f[g>>2]=0;e=a+120|0;f[e>>2]=0;f[a+124>>2]=0;if(!h){k=b<<2;i=ln(k)|0;f[g>>2]=i;g=i+(b<<2)|0;f[a+124>>2]=g;sj(i|0,0,k|0)|0;f[e>>2]=g}g=a+128|0;f[g>>2]=0;e=a+132|0;f[e>>2]=0;f[a+136>>2]=0;if(!h){k=b<<2;i=ln(k)|0;f[g>>2]=i;g=i+(b<<2)|0;f[a+136>>2]=g;sj(i|0,0,k|0)|0;f[e>>2]=g}g=b<<5|1;f[d>>2]=0;e=d+4|0;f[e>>2]=0;f[d+8>>2]=0;if(!h){k=b<<2;i=ln(k)|0;f[d>>2]=i;j=i+(b<<2)|0;f[d+8>>2]=j;sj(i|0,0,k|0)|0;f[e>>2]=j}lk(a+140|0,g,d);j=f[d>>2]|0;if(j|0){k=f[e>>2]|0;if((k|0)!=(j|0))f[e>>2]=k+(~((k+-4-j|0)>>>2)<<2);Oq(j)}f[d>>2]=0;j=d+4|0;f[j>>2]=0;f[d+8>>2]=0;if(!h){h=b<<2;k=ln(h)|0;f[d>>2]=k;e=k+(b<<2)|0;f[d+8>>2]=e;sj(k|0,0,h|0)|0;f[j>>2]=e}lk(a+152|0,g,d);g=f[d>>2]|0;if(!g){u=c;return}d=f[j>>2]|0;if((d|0)!=(g|0))f[j>>2]=d+(~((d+-4-g|0)>>>2)<<2);Oq(g);u=c;return}function af(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0;c=u;u=u+16|0;d=c;f[a>>2]=0;f[a+8>>2]=b;vo(a+12|0);vo(a+32|0);vo(a+52|0);vo(a+72|0);e=a+92|0;f[e>>2]=0;g=a+96|0;f[g>>2]=0;f[a+100>>2]=0;h=(b|0)==0;do if(!h)if(b>>>0>1073741823)aq(e);else{i=b<<2;j=ln(i)|0;f[e>>2]=j;k=j+(b<<2)|0;f[a+100>>2]=k;sj(j|0,0,i|0)|0;f[g>>2]=k;break}while(0);g=a+104|0;f[g>>2]=0;e=a+108|0;f[e>>2]=0;f[a+112>>2]=0;if(!h){k=b<<2;i=ln(k)|0;f[g>>2]=i;g=i+(b<<2)|0;f[a+112>>2]=g;sj(i|0,0,k|0)|0;f[e>>2]=g}g=a+116|0;f[g>>2]=0;e=a+120|0;f[e>>2]=0;f[a+124>>2]=0;if(!h){k=b<<2;i=ln(k)|0;f[g>>2]=i;g=i+(b<<2)|0;f[a+124>>2]=g;sj(i|0,0,k|0)|0;f[e>>2]=g}g=b<<5|1;f[d>>2]=0;e=d+4|0;f[e>>2]=0;f[d+8>>2]=0;if(!h){k=b<<2;i=ln(k)|0;f[d>>2]=i;j=i+(b<<2)|0;f[d+8>>2]=j;sj(i|0,0,k|0)|0;f[e>>2]=j}lk(a+128|0,g,d);j=f[d>>2]|0;if(j|0){k=f[e>>2]|0;if((k|0)!=(j|0))f[e>>2]=k+(~((k+-4-j|0)>>>2)<<2);Oq(j)}f[d>>2]=0;j=d+4|0;f[j>>2]=0;f[d+8>>2]=0;if(!h){h=b<<2;k=ln(h)|0;f[d>>2]=k;e=k+(b<<2)|0;f[d+8>>2]=e;sj(k|0,0,h|0)|0;f[j>>2]=e}lk(a+140|0,g,d);g=f[d>>2]|0;if(!g){u=c;return}d=f[j>>2]|0;if((d|0)!=(g|0))f[j>>2]=d+(~((d+-4-g|0)>>>2)<<2);Oq(g);u=c;return}function bf(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0;d=ln(40)|0;e=d+16|0;pj(e,c);pj(d+28|0,c+12|0);c=a+4|0;g=f[c>>2]|0;do if(g){h=b[d+27>>0]|0;i=h<<24>>24<0;j=i?f[d+20>>2]|0:h&255;h=i?f[e>>2]|0:e;i=g;while(1){k=i+16|0;l=b[k+11>>0]|0;m=l<<24>>24<0;n=m?f[i+20>>2]|0:l&255;l=n>>>0<j>>>0?n:j;if((l|0)!=0?(o=Vk(h,m?f[k>>2]|0:k,l)|0,(o|0)!=0):0)if((o|0)<0)p=7;else p=9;else if(j>>>0<n>>>0)p=7;else p=9;if((p|0)==7){p=0;n=f[i>>2]|0;if(!n){p=8;break}else q=n}else if((p|0)==9){p=0;r=i+4|0;n=f[r>>2]|0;if(!n){p=11;break}else q=n}i=q}if((p|0)==8){s=i;t=i;break}else if((p|0)==11){s=i;t=r;break}}else{s=c;t=c}while(0);f[d>>2]=0;f[d+4>>2]=0;f[d+8>>2]=s;f[t>>2]=d;s=f[f[a>>2]>>2]|0;if(!s){u=d;v=a+4|0;w=f[v>>2]|0;Oe(w,u);x=a+8|0;y=f[x>>2]|0;z=y+1|0;f[x>>2]=z;return d|0}f[a>>2]=s;u=f[t>>2]|0;v=a+4|0;w=f[v>>2]|0;Oe(w,u);x=a+8|0;y=f[x>>2]|0;z=y+1|0;f[x>>2]=z;return d|0}function cf(a){a=a|0;var b=0,c=0,d=0;f[a>>2]=3680;wi(a+200|0);b=f[a+184>>2]|0;if(b|0){c=a+188|0;d=f[c>>2]|0;if((d|0)!=(b|0))f[c>>2]=d+(~((d+-4-b|0)>>>2)<<2);Oq(b)}kj(a+172|0);b=f[a+152>>2]|0;if(b|0){d=a+156|0;c=f[d>>2]|0;if((c|0)!=(b|0))f[d>>2]=c+(~((c+-4-b|0)>>>2)<<2);Oq(b)}b=f[a+140>>2]|0;if(b|0)Oq(b);b=f[a+128>>2]|0;if(b|0){c=b;do{b=c;c=f[c>>2]|0;Oq(b)}while((c|0)!=0)}c=a+120|0;b=f[c>>2]|0;f[c>>2]=0;if(b|0)Oq(b);b=f[a+108>>2]|0;if(b|0){c=a+112|0;d=f[c>>2]|0;if((d|0)!=(b|0))f[c>>2]=d+(~(((d+-12-b|0)>>>0)/12|0)*12|0);Oq(b)}b=f[a+96>>2]|0;if(b|0){d=a+100|0;c=f[d>>2]|0;if((c|0)!=(b|0))f[d>>2]=c+(~((c+-4-b|0)>>>2)<<2);Oq(b)}b=f[a+84>>2]|0;if(b|0)Oq(b);b=f[a+72>>2]|0;if(b|0){c=a+76|0;d=f[c>>2]|0;if((d|0)!=(b|0))f[c>>2]=d+(~((d+-4-b|0)>>>2)<<2);Oq(b)}b=f[a+52>>2]|0;if(b|0){d=a+56|0;c=f[d>>2]|0;if((c|0)!=(b|0))f[d>>2]=c+(~((c+-4-b|0)>>>2)<<2);Oq(b)}b=f[a+40>>2]|0;if(b|0){c=a+44|0;d=f[c>>2]|0;if((d|0)!=(b|0))f[c>>2]=d+(~((d+-4-b|0)>>>2)<<2);Oq(b)}b=f[a+28>>2]|0;if(b|0)Oq(b);b=f[a+16>>2]|0;if(b|0){d=a+20|0;c=f[d>>2]|0;if((c|0)!=(b|0))f[d>>2]=c+(~((c+-4-b|0)>>>2)<<2);Oq(b)}b=a+12|0;a=f[b>>2]|0;f[b>>2]=0;if(!a)return;Ii(a);Oq(a);return}function df(a){a=a|0;var b=0,c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;b=a+140|0;c=f[b>>2]|0;if(c|0){d=a+144|0;e=f[d>>2]|0;if((e|0)==(c|0))g=c;else{h=e;while(1){e=h+-12|0;f[d>>2]=e;i=f[e>>2]|0;if(!i)j=e;else{e=h+-8|0;k=f[e>>2]|0;if((k|0)!=(i|0))f[e>>2]=k+(~((k+-4-i|0)>>>2)<<2);Oq(i);j=f[d>>2]|0}if((j|0)==(c|0))break;else h=j}g=f[b>>2]|0}Oq(g)}g=a+128|0;b=f[g>>2]|0;if(b|0){j=a+132|0;h=f[j>>2]|0;if((h|0)==(b|0))l=b;else{c=h;while(1){h=c+-12|0;f[j>>2]=h;d=f[h>>2]|0;if(!d)m=h;else{h=c+-8|0;i=f[h>>2]|0;if((i|0)!=(d|0))f[h>>2]=i+(~((i+-4-d|0)>>>2)<<2);Oq(d);m=f[j>>2]|0}if((m|0)==(b|0))break;else c=m}l=f[g>>2]|0}Oq(l)}l=f[a+116>>2]|0;if(l|0){g=a+120|0;m=f[g>>2]|0;if((m|0)!=(l|0))f[g>>2]=m+(~((m+-4-l|0)>>>2)<<2);Oq(l)}l=f[a+104>>2]|0;if(l|0){m=a+108|0;g=f[m>>2]|0;if((g|0)!=(l|0))f[m>>2]=g+(~((g+-4-l|0)>>>2)<<2);Oq(l)}l=f[a+92>>2]|0;if(!l){n=a+72|0;jl(n);o=a+52|0;jl(o);p=a+32|0;jl(p);q=a+12|0;jl(q);return}g=a+96|0;m=f[g>>2]|0;if((m|0)!=(l|0))f[g>>2]=m+(~((m+-4-l|0)>>>2)<<2);Oq(l);n=a+72|0;jl(n);o=a+52|0;jl(o);p=a+32|0;jl(p);q=a+12|0;jl(q);return}function ef(a){a=a|0;var b=0,c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;b=a+152|0;c=f[b>>2]|0;if(c|0){d=a+156|0;e=f[d>>2]|0;if((e|0)==(c|0))g=c;else{h=e;while(1){e=h+-12|0;f[d>>2]=e;i=f[e>>2]|0;if(!i)j=e;else{e=h+-8|0;k=f[e>>2]|0;if((k|0)!=(i|0))f[e>>2]=k+(~((k+-4-i|0)>>>2)<<2);Oq(i);j=f[d>>2]|0}if((j|0)==(c|0))break;else h=j}g=f[b>>2]|0}Oq(g)}g=a+140|0;b=f[g>>2]|0;if(b|0){j=a+144|0;h=f[j>>2]|0;if((h|0)==(b|0))l=b;else{c=h;while(1){h=c+-12|0;f[j>>2]=h;d=f[h>>2]|0;if(!d)m=h;else{h=c+-8|0;i=f[h>>2]|0;if((i|0)!=(d|0))f[h>>2]=i+(~((i+-4-d|0)>>>2)<<2);Oq(d);m=f[j>>2]|0}if((m|0)==(b|0))break;else c=m}l=f[g>>2]|0}Oq(l)}l=f[a+128>>2]|0;if(l|0){g=a+132|0;m=f[g>>2]|0;if((m|0)!=(l|0))f[g>>2]=m+(~((m+-4-l|0)>>>2)<<2);Oq(l)}l=f[a+116>>2]|0;if(l|0){m=a+120|0;g=f[m>>2]|0;if((g|0)!=(l|0))f[m>>2]=g+(~((g+-4-l|0)>>>2)<<2);Oq(l)}l=f[a+104>>2]|0;if(!l){n=a+84|0;jl(n);o=a+64|0;jl(o);p=a+44|0;jl(p);q=a+12|0;Fj(q);return}g=a+108|0;m=f[g>>2]|0;if((m|0)!=(l|0))f[g>>2]=m+(~((m+-4-l|0)>>>2)<<2);Oq(l);n=a+84|0;jl(n);o=a+64|0;jl(o);p=a+44|0;jl(p);q=a+12|0;Fj(q);return}function ff(a){a=a|0;var b=0,c=0,d=0;f[a>>2]=3480;uj(a+200|0);b=f[a+184>>2]|0;if(b|0){c=a+188|0;d=f[c>>2]|0;if((d|0)!=(b|0))f[c>>2]=d+(~((d+-4-b|0)>>>2)<<2);Oq(b)}kj(a+172|0);b=f[a+152>>2]|0;if(b|0){d=a+156|0;c=f[d>>2]|0;if((c|0)!=(b|0))f[d>>2]=c+(~((c+-4-b|0)>>>2)<<2);Oq(b)}b=f[a+140>>2]|0;if(b|0)Oq(b);b=f[a+128>>2]|0;if(b|0){c=b;do{b=c;c=f[c>>2]|0;Oq(b)}while((c|0)!=0)}c=a+120|0;b=f[c>>2]|0;f[c>>2]=0;if(b|0)Oq(b);b=f[a+108>>2]|0;if(b|0){c=a+112|0;d=f[c>>2]|0;if((d|0)!=(b|0))f[c>>2]=d+(~(((d+-12-b|0)>>>0)/12|0)*12|0);Oq(b)}b=f[a+96>>2]|0;if(b|0){d=a+100|0;c=f[d>>2]|0;if((c|0)!=(b|0))f[d>>2]=c+(~((c+-4-b|0)>>>2)<<2);Oq(b)}b=f[a+84>>2]|0;if(b|0)Oq(b);b=f[a+72>>2]|0;if(b|0){c=a+76|0;d=f[c>>2]|0;if((d|0)!=(b|0))f[c>>2]=d+(~((d+-4-b|0)>>>2)<<2);Oq(b)}b=f[a+52>>2]|0;if(b|0){d=a+56|0;c=f[d>>2]|0;if((c|0)!=(b|0))f[d>>2]=c+(~((c+-4-b|0)>>>2)<<2);Oq(b)}b=f[a+40>>2]|0;if(b|0){c=a+44|0;d=f[c>>2]|0;if((d|0)!=(b|0))f[c>>2]=d+(~((d+-4-b|0)>>>2)<<2);Oq(b)}b=f[a+28>>2]|0;if(b|0)Oq(b);b=f[a+16>>2]|0;if(b|0){d=a+20|0;c=f[d>>2]|0;if((c|0)!=(b|0))f[d>>2]=c+(~((c+-4-b|0)>>>2)<<2);Oq(b)}b=a+12|0;a=f[b>>2]|0;f[b>>2]=0;if(!a)return;Ii(a);Oq(a);return}function gf(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;e=u;u=u+144|0;g=e+136|0;h=e+104|0;i=e;j=ln(124)|0;k=f[c+8>>2]|0;f[j+4>>2]=0;f[j>>2]=3656;f[j+12>>2]=3636;f[j+100>>2]=0;f[j+104>>2]=0;f[j+108>>2]=0;l=j+16|0;m=l+80|0;do{f[l>>2]=0;l=l+4|0}while((l|0)<(m|0));f[j+112>>2]=k;f[j+116>>2]=d;n=j+120|0;f[n>>2]=0;o=j;f[h>>2]=3636;p=h+4|0;q=p+4|0;f[q>>2]=0;f[q+4>>2]=0;f[q+8>>2]=0;f[q+12>>2]=0;f[q+16>>2]=0;f[q+20>>2]=0;q=f[c+12>>2]|0;f[i+4>>2]=3636;f[i+92>>2]=0;f[i+96>>2]=0;f[i+100>>2]=0;l=i+8|0;m=l+80|0;do{f[l>>2]=0;l=l+4|0}while((l|0)<(m|0));l=q;f[p>>2]=l;m=((f[l+4>>2]|0)-(f[q>>2]|0)>>2>>>0)/3|0;b[g>>0]=0;qh(h+8|0,m,g);Va[f[(f[h>>2]|0)+8>>2]&127](h);f[i>>2]=f[p>>2];fg(i+4|0,h)|0;f[i+36>>2]=q;f[i+40>>2]=d;f[i+44>>2]=k;f[i+48>>2]=j;f[n>>2]=c+72;Sg(j,i);f[a>>2]=o;Qi(i);f[h>>2]=3636;i=f[h+20>>2]|0;if(i|0)Oq(i);i=f[h+8>>2]|0;if(!i){u=e;return}Oq(i);u=e;return}function hf(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;c=u;u=u+48|0;d=c+44|0;e=c+40|0;g=c+36|0;h=c+32|0;i=c;f[h>>2]=f[a+60>>2];j=b+16|0;k=j;l=f[k+4>>2]|0;if(!((l|0)>0|(l|0)==0&(f[k>>2]|0)>>>0>0)){f[e>>2]=f[b+4>>2];f[d>>2]=f[e>>2];Me(b,d,h,h+4|0)|0}wn(i);tk(i);if((f[h>>2]|0)>0){k=a+56|0;l=1;m=0;do{n=l;l=(f[(f[k>>2]|0)+(m>>>5<<2)>>2]&1<<(m&31)|0)!=0;fj(i,n^l^1);m=m+1|0}while((m|0)<(f[h>>2]|0))}ld(i,b);f[g>>2]=f[a+12>>2];h=j;m=f[h>>2]|0;l=f[h+4>>2]|0;if((l|0)>0|(l|0)==0&m>>>0>0){o=l;p=m}else{f[e>>2]=f[b+4>>2];f[d>>2]=f[e>>2];Me(b,d,g,g+4|0)|0;m=j;o=f[m+4>>2]|0;p=f[m>>2]|0}f[g>>2]=f[a+20>>2];if((o|0)>0|(o|0)==0&p>>>0>0){Fj(i);u=c;return 1}f[e>>2]=f[b+4>>2];f[d>>2]=f[e>>2];Me(b,d,g,g+4|0)|0;Fj(i);u=c;return 1}function jf(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;g=u;u=u+16|0;h=g;if((f[c+56>>2]|0)==-1){i=-1;u=g;return i|0}j=ln(96)|0;tl(j,c);f[h>>2]=j;j=vh(a,h)|0;c=f[h>>2]|0;f[h>>2]=0;if(c|0){h=c+88|0;k=f[h>>2]|0;f[h>>2]=0;if(k|0){h=f[k+8>>2]|0;if(h|0){l=k+12|0;if((f[l>>2]|0)!=(h|0))f[l>>2]=h;Oq(h)}Oq(k)}k=f[c+68>>2]|0;if(k|0){h=c+72|0;l=f[h>>2]|0;if((l|0)!=(k|0))f[h>>2]=l+(~((l+-4-k|0)>>>2)<<2);Oq(k)}k=c+64|0;l=f[k>>2]|0;f[k>>2]=0;if(l|0){k=f[l>>2]|0;if(k|0){h=l+4|0;if((f[h>>2]|0)!=(k|0))f[h>>2]=k;Oq(k)}Oq(l)}Oq(c)}c=a+8|0;l=(f[c>>2]|0)+(j<<2)|0;k=f[l>>2]|0;do if(!d){h=f[a+80>>2]|0;b[k+84>>0]=0;m=k+68|0;n=k+72|0;o=f[n>>2]|0;p=f[m>>2]|0;q=o-p>>2;r=o;if(h>>>0>q>>>0){Ch(m,h-q|0,6220);break}if(h>>>0<q>>>0?(q=p+(h<<2)|0,(q|0)!=(r|0)):0)f[n>>2]=r+(~((r+-4-q|0)>>>2)<<2)}else{b[k+84>>0]=1;q=f[k+68>>2]|0;r=k+72|0;n=f[r>>2]|0;if((n|0)==(q|0))s=k;else{f[r>>2]=n+(~((n+-4-q|0)>>>2)<<2);s=f[l>>2]|0}f[s+80>>2]=f[a+80>>2]}while(0);if(!e){i=j;u=g;return i|0}Bj(f[(f[c>>2]|0)+(j<<2)>>2]|0,e)|0;i=j;u=g;return i|0}function kf(a,b,c,d,e,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0;d=u;u=u+32|0;h=d+24|0;i=d+16|0;j=d;k=d+8|0;f[a+52>>2]=e;f[a+44>>2]=g;g=Lq(e>>>0>1073741823?-1:e<<2)|0;l=a+48|0;m=f[l>>2]|0;f[l>>2]=g;if(m|0)Mq(m);m=a+36|0;g=f[m>>2]|0;n=f[g+4>>2]|0;o=f[g>>2]|0;p=n-o|0;if((p|0)<=0){u=d;return 1}q=(p>>>2)+-1|0;p=a+8|0;r=i+4|0;s=j+4|0;t=h+4|0;if(n-o>>2>>>0>q>>>0){v=q;w=o}else{x=g;aq(x)}while(1){f[k>>2]=f[w+(v<<2)>>2];f[h>>2]=f[k>>2];Bc(a,h,b,v);g=X(v,e)|0;o=b+(g<<2)|0;q=f[l>>2]|0;n=c+(g<<2)|0;g=f[o+4>>2]|0;y=f[q>>2]|0;z=f[q+4>>2]|0;f[i>>2]=f[o>>2];f[r>>2]=g;f[j>>2]=y;f[s>>2]=z;Od(h,p,i,j);f[n>>2]=f[h>>2];f[n+4>>2]=f[t>>2];v=v+-1|0;if((v|0)<=-1){A=5;break}n=f[m>>2]|0;w=f[n>>2]|0;if((f[n+4>>2]|0)-w>>2>>>0<=v>>>0){x=n;A=6;break}}if((A|0)==5){u=d;return 1}else if((A|0)==6)aq(x);return 0}function lf(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;d=f[c>>2]|0;c=f[d>>2]|0;e=f[a+4>>2]|0;g=f[d+4>>2]|0;h=e+-1|0;i=(h&e|0)==0;if(!i)if(g>>>0<e>>>0)j=g;else j=(g>>>0)%(e>>>0)|0;else j=h&g;g=(f[a>>2]|0)+(j<<2)|0;k=f[g>>2]|0;while(1){l=f[k>>2]|0;if((l|0)==(d|0))break;else k=l}if((k|0)!=(a+8|0)){l=f[k+4>>2]|0;if(!i)if(l>>>0<e>>>0)m=l;else m=(l>>>0)%(e>>>0)|0;else m=l&h;if((m|0)==(j|0)){n=c;o=21}else o=13}else o=13;do if((o|0)==13){if(c|0){m=f[c+4>>2]|0;if(!i)if(m>>>0<e>>>0)p=m;else p=(m>>>0)%(e>>>0)|0;else p=m&h;if((p|0)==(j|0)){q=c;r=c;o=22;break}}f[g>>2]=0;n=f[d>>2]|0;o=21}while(0);if((o|0)==21){g=n;if(!n)s=g;else{q=n;r=g;o=22}}if((o|0)==22){o=f[q+4>>2]|0;if(!i)if(o>>>0<e>>>0)t=o;else t=(o>>>0)%(e>>>0)|0;else t=o&h;if((t|0)==(j|0))s=r;else{f[(f[a>>2]|0)+(t<<2)>>2]=k;s=f[d>>2]|0}}f[k>>2]=s;f[d>>2]=0;s=a+12|0;f[s>>2]=(f[s>>2]|0)+-1;if(!d)return c|0;s=d+8|0;a=f[d+20>>2]|0;if(a|0){k=d+24|0;if((f[k>>2]|0)!=(a|0))f[k>>2]=a;Oq(a)}if((b[s+11>>0]|0)<0)Oq(f[s>>2]|0);Oq(d);return c|0}function mf(a){a=a|0;var b=0,c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0;b=u;u=u+16|0;c=b+4|0;d=b;f[c>>2]=0;e=c+4|0;f[e>>2]=0;f[c+8>>2]=0;g=a+52|0;h=f[g>>2]|0;i=(f[h+100>>2]|0)-(f[h+96>>2]|0)|0;j=(i|0)/12|0;if(!i){k=0;l=0}else{i=c+8|0;m=0;n=0;o=h;h=0;p=0;while(1){q=f[o+96>>2]|0;r=f[q+(n*12|0)>>2]|0;s=r-m|0;t=((s|0)>-1?s:0-s|0)<<1|s>>>31;f[d>>2]=t;if((h|0)==(p|0)){Ri(c,d);v=f[e>>2]|0;w=f[i>>2]|0}else{f[h>>2]=t;t=h+4|0;f[e>>2]=t;v=t;w=p}t=f[q+(n*12|0)+4>>2]|0;s=t-r|0;r=((s|0)>-1?s:0-s|0)<<1|s>>>31;f[d>>2]=r;if((v|0)==(w|0)){Ri(c,d);x=f[e>>2]|0;y=f[i>>2]|0}else{f[v>>2]=r;r=v+4|0;f[e>>2]=r;x=r;y=w}r=f[q+(n*12|0)+8>>2]|0;q=r-t|0;t=((q|0)>-1?q:0-q|0)<<1|q>>>31;f[d>>2]=t;if((x|0)==(y|0))Ri(c,d);else{f[x>>2]=t;f[e>>2]=x+4}t=n+1|0;if(t>>>0>=j>>>0)break;m=r;n=t;o=f[g>>2]|0;h=f[e>>2]|0;p=f[i>>2]|0}k=f[c>>2]|0;l=f[e>>2]|0}Mc(k,l-k>>2,1,0,f[a+44>>2]|0)|0;a=f[c>>2]|0;if(!a){u=b;return 1}c=f[e>>2]|0;if((c|0)!=(a|0))f[e>>2]=c+(~((c+-4-a|0)>>>2)<<2);Oq(a);u=b;return 1}function nf(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;c=u;u=u+48|0;d=c+44|0;e=c+40|0;g=c+36|0;h=c+32|0;i=c;f[h>>2]=f[a+80>>2];j=b+16|0;k=j;l=f[k+4>>2]|0;if(!((l|0)>0|(l|0)==0&(f[k>>2]|0)>>>0>0)){f[e>>2]=f[b+4>>2];f[d>>2]=f[e>>2];Me(b,d,h,h+4|0)|0}wn(i);tk(i);if((f[h>>2]|0)>0){k=a+76|0;l=1;m=0;do{n=l;l=(f[(f[k>>2]|0)+(m>>>5<<2)>>2]&1<<(m&31)|0)!=0;fj(i,n^l^1);m=m+1|0}while((m|0)<(f[h>>2]|0))}ld(i,b);f[g>>2]=f[a+12>>2];h=j;m=f[h>>2]|0;l=f[h+4>>2]|0;if((l|0)>0|(l|0)==0&m>>>0>0){o=l;p=m}else{f[e>>2]=f[b+4>>2];f[d>>2]=f[e>>2];Me(b,d,g,g+4|0)|0;m=j;o=f[m+4>>2]|0;p=f[m>>2]|0}f[g>>2]=f[a+16>>2];if((o|0)>0|(o|0)==0&p>>>0>0){Fj(i);u=c;return 1}f[e>>2]=f[b+4>>2];f[d>>2]=f[e>>2];Me(b,d,g,g+4|0)|0;Fj(i);u=c;return 1}function of(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;c=u;u=u+16|0;d=c+12|0;e=c+8|0;g=c+4|0;h=c;if(!b){i=ln(76)|0;j=ln(12)|0;k=f[(f[a+4>>2]|0)+80>>2]|0;f[j+4>>2]=0;f[j>>2]=3908;f[j+8>>2]=k;f[h>>2]=j;rl(i,h,0);j=i;f[g>>2]=j;i=a+12|0;k=f[i>>2]|0;if(k>>>0<(f[a+16>>2]|0)>>>0){f[g>>2]=0;f[k>>2]=j;f[i>>2]=k+4;l=g}else{Qg(a+8|0,g);l=g}g=f[l>>2]|0;f[l>>2]=0;if(g|0)Va[f[(f[g>>2]|0)+4>>2]&127](g);g=f[h>>2]|0;f[h>>2]=0;if(!g){u=c;return 1}Va[f[(f[g>>2]|0)+4>>2]&127](g);u=c;return 1}g=f[f[a+8>>2]>>2]|0;f[d>>2]=b;a=g+4|0;h=g+8|0;l=f[h>>2]|0;if((l|0)==(f[g+12>>2]|0))Ri(a,d);else{f[l>>2]=b;f[h>>2]=l+4}l=f[d>>2]|0;b=g+16|0;k=g+20|0;g=f[k>>2]|0;i=f[b>>2]|0;j=g-i>>2;m=i;if((l|0)<(j|0)){n=m;o=l}else{i=l+1|0;f[e>>2]=-1;p=g;if(i>>>0<=j>>>0)if(i>>>0<j>>>0?(g=m+(i<<2)|0,(g|0)!=(p|0)):0){f[k>>2]=p+(~((p+-4-g|0)>>>2)<<2);q=l;r=m}else{q=l;r=m}else{Ch(b,i-j|0,e);q=f[d>>2]|0;r=f[b>>2]|0}n=r;o=q}f[n+(o<<2)>>2]=((f[h>>2]|0)-(f[a>>2]|0)>>2)+-1;u=c;return 1}function pf(a,b,c,d,e,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0;d=u;u=u+32|0;h=d+24|0;i=d+16|0;j=d;k=d+8|0;f[a+52>>2]=e;f[a+44>>2]=g;g=Lq(e>>>0>1073741823?-1:e<<2)|0;l=a+48|0;m=f[l>>2]|0;f[l>>2]=g;if(m|0)Mq(m);m=a+36|0;g=f[m>>2]|0;n=f[g+4>>2]|0;o=f[g>>2]|0;p=n-o|0;if((p|0)<=0){u=d;return 1}q=(p>>>2)+-1|0;p=a+8|0;r=i+4|0;s=j+4|0;t=h+4|0;if(n-o>>2>>>0>q>>>0){v=q;w=o}else{x=g;aq(x)}while(1){f[k>>2]=f[w+(v<<2)>>2];f[h>>2]=f[k>>2];Ac(a,h,b,v);g=X(v,e)|0;o=b+(g<<2)|0;q=f[l>>2]|0;n=c+(g<<2)|0;g=f[o+4>>2]|0;y=f[q>>2]|0;z=f[q+4>>2]|0;f[i>>2]=f[o>>2];f[r>>2]=g;f[j>>2]=y;f[s>>2]=z;Od(h,p,i,j);f[n>>2]=f[h>>2];f[n+4>>2]=f[t>>2];v=v+-1|0;if((v|0)<=-1){A=5;break}n=f[m>>2]|0;w=f[n>>2]|0;if((f[n+4>>2]|0)-w>>2>>>0<=v>>>0){x=n;A=6;break}}if((A|0)==5){u=d;return 1}else if((A|0)==6)aq(x);return 0}function qf(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;d=a+8|0;e=f[d>>2]|0;g=f[a>>2]|0;h=g;do if(e-g>>3>>>0>=b>>>0){i=a+4|0;j=f[i>>2]|0;k=j-g>>3;l=k>>>0<b>>>0;m=l?k:b;n=j;if(m|0){j=m;m=h;while(1){o=c;p=f[o+4>>2]|0;q=m;f[q>>2]=f[o>>2];f[q+4>>2]=p;j=j+-1|0;if(!j)break;else m=m+8|0}}if(!l){m=h+(b<<3)|0;if((m|0)==(n|0))return;else{r=i;s=n+(~((n+-8-m|0)>>>3)<<3)|0;break}}else{m=b-k|0;j=m;p=n;while(1){q=c;o=f[q+4>>2]|0;t=p;f[t>>2]=f[q>>2];f[t+4>>2]=o;j=j+-1|0;if(!j)break;else p=p+8|0}r=i;s=n+(m<<3)|0;break}}else{p=g;if(!g)u=e;else{j=a+4|0;k=f[j>>2]|0;if((k|0)!=(h|0))f[j>>2]=k+(~((k+-8-g|0)>>>3)<<3);Oq(p);f[d>>2]=0;f[j>>2]=0;f[a>>2]=0;u=0}if(b>>>0>536870911)aq(a);j=u>>2;p=u>>3>>>0<268435455?(j>>>0<b>>>0?b:j):536870911;if(p>>>0>536870911)aq(a);j=ln(p<<3)|0;k=a+4|0;f[k>>2]=j;f[a>>2]=j;f[d>>2]=j+(p<<3);p=b;l=j;while(1){o=c;t=f[o+4>>2]|0;q=l;f[q>>2]=f[o>>2];f[q+4>>2]=t;p=p+-1|0;if(!p)break;else l=l+8|0}r=k;s=j+(b<<3)|0}while(0);f[r>>2]=s;return}function rf(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0.0,g=0.0,h=0.0,i=0.0,j=0.0,k=0,l=0,m=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;e=+$(n[b>>2]);g=+K(+e);h=+$(n[b+4>>2]);i=g+ +K(+h);g=+$(n[b+8>>2]);j=i+ +K(+g);b=j>1.0e-06;i=1.0/j;k=f[a+12>>2]|0;j=+(k|0);l=~~+J(+((b?i*e:1.0)*j+.5));m=~~+J(+((b?i*h:0.0)*j+.5));o=(l|0)>-1;p=k-(o?l:0-l|0)-((m|0)>-1?m:0-m|0)|0;l=(p|0)<0;q=(l?((m|0)>0?p:0-p|0):0)+m|0;m=l?0:p;p=(b?i*g:0.0)<0.0?0-m|0:m;do if(!o){if((q|0)<0)r=(p|0)>-1?p:0-p|0;else r=(f[a+8>>2]|0)-((p|0)>-1?p:0-p|0)|0;if((p|0)<0){s=(q|0)>-1?q:0-q|0;t=r;break}else{s=(f[a+8>>2]|0)-((q|0)>-1?q:0-q|0)|0;t=r;break}}else{s=k+p|0;t=k+q|0}while(0);q=(t|0)==0;p=(s|0)==0;r=f[a+8>>2]|0;if(!(s|t)){u=r;v=r;f[c>>2]=u;f[d>>2]=v;return}a=(r|0)==(s|0);if(q&a){u=s;v=s;f[c>>2]=u;f[d>>2]=v;return}o=(r|0)==(t|0);if(p&o){u=t;v=t;f[c>>2]=u;f[d>>2]=v;return}if(q&(k|0)<(s|0)){u=0;v=(k<<1)-s|0;f[c>>2]=u;f[d>>2]=v;return}if(o&(k|0)>(s|0)){u=t;v=(k<<1)-s|0;f[c>>2]=u;f[d>>2]=v;return}if(a&(k|0)>(t|0)){u=(k<<1)-t|0;v=s;f[c>>2]=u;f[d>>2]=v;return}if(!p){u=t;v=s;f[c>>2]=u;f[d>>2]=v;return}u=(k|0)<(t|0)?(k<<1)-t|0:t;v=0;f[c>>2]=u;f[d>>2]=v;return}function sf(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0;g=u;u=u+32|0;h=g+12|0;i=g;f[a>>2]=f[d>>2];d=a+4|0;f[d>>2]=(f[c>>2]|0)-(f[b>>2]|0);j=e+16|0;k=j;l=f[k+4>>2]|0;if(!((l|0)>0|(l|0)==0&(f[k>>2]|0)>>>0>0)?(k=e+4|0,f[i>>2]=f[k>>2],f[h>>2]=f[i>>2],Me(e,h,a,a+4|0)|0,l=j,j=f[l+4>>2]|0,!((j|0)>0|(j|0)==0&(f[l>>2]|0)>>>0>0)):0){f[i>>2]=f[k>>2];f[h>>2]=f[i>>2];Me(e,h,d,d+4|0)|0;m=i}else m=i;if(!(f[d>>2]|0)){u=g;return 1}d=a+12|0;Gg(d);m=a+1068|0;Mm(m);k=a+1088|0;Mm(k);l=a+1108|0;Mm(l);f[i>>2]=f[b>>2];f[i+4>>2]=f[b+4>>2];f[i+8>>2]=f[b+8>>2];f[h>>2]=f[c>>2];f[h+4>>2]=f[c+4>>2];f[h+8>>2]=f[c+8>>2];ib(a,i,h);Ye(d,e);Bg(m,e);Bg(k,e);Bg(l,e);u=g;return 1}function tf(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0;g=u;u=u+32|0;h=g+12|0;i=g;f[a>>2]=f[d>>2];d=a+4|0;f[d>>2]=(f[c>>2]|0)-(f[b>>2]|0);j=e+16|0;k=j;l=f[k+4>>2]|0;if(!((l|0)>0|(l|0)==0&(f[k>>2]|0)>>>0>0)?(k=e+4|0,f[i>>2]=f[k>>2],f[h>>2]=f[i>>2],Me(e,h,a,a+4|0)|0,l=j,j=f[l+4>>2]|0,!((j|0)>0|(j|0)==0&(f[l>>2]|0)>>>0>0)):0){f[i>>2]=f[k>>2];f[h>>2]=f[i>>2];Me(e,h,d,d+4|0)|0;m=i}else m=i;if(!(f[d>>2]|0)){u=g;return 1}d=a+12|0;Gg(d);m=a+1068|0;Mm(m);k=a+1088|0;Mm(k);l=a+1108|0;Mm(l);f[i>>2]=f[b>>2];f[i+4>>2]=f[b+4>>2];f[i+8>>2]=f[b+8>>2];f[h>>2]=f[c>>2];f[h+4>>2]=f[c+4>>2];f[h+8>>2]=f[c+8>>2];kb(a,i,h);Ye(d,e);Bg(m,e);Bg(k,e);Bg(l,e);u=g;return 1}function uf(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0;c=u;u=u+32|0;d=c;e=a+8|0;g=f[e>>2]|0;h=a+4|0;i=f[h>>2]|0;j=i;if(g-i>>2>>>0>=b>>>0){sj(i|0,0,b<<2|0)|0;f[h>>2]=i+(b<<2);u=c;return}k=f[a>>2]|0;l=i-k>>2;m=l+b|0;n=k;if(m>>>0>1073741823)aq(a);o=g-k|0;p=o>>1;q=o>>2>>>0<536870911?(p>>>0<m>>>0?m:p):1073741823;f[d+12>>2]=0;f[d+16>>2]=a+8;do if(q)if(q>>>0>1073741823){p=ra(8)|0;Oo(p,16035);f[p>>2]=7256;va(p|0,1112,110)}else{r=ln(q<<2)|0;break}else r=0;while(0);f[d>>2]=r;p=r+(l<<2)|0;l=d+8|0;m=d+4|0;f[m>>2]=p;o=r+(q<<2)|0;q=d+12|0;f[q>>2]=o;r=p+(b<<2)|0;sj(p|0,0,b<<2|0)|0;f[l>>2]=r;if((j|0)==(n|0)){s=p;t=q;v=l;w=k;x=r;y=i;z=o;A=g}else{g=j;j=p;do{g=g+-4|0;p=f[g>>2]|0;f[g>>2]=0;f[j+-4>>2]=p;j=(f[m>>2]|0)+-4|0;f[m>>2]=j}while((g|0)!=(n|0));s=j;t=q;v=l;w=f[a>>2]|0;x=f[l>>2]|0;y=f[h>>2]|0;z=f[q>>2]|0;A=f[e>>2]|0}f[a>>2]=s;f[m>>2]=w;f[h>>2]=x;f[v>>2]=y;f[e>>2]=z;f[t>>2]=A;f[d>>2]=w;ki(d);u=c;return}function vf(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;d=f[a+8>>2]|0;e=a+76|0;g=f[e>>2]|0;h=f[g+80>>2]|0;b[c+84>>0]=0;i=c+68|0;j=c+72|0;k=f[j>>2]|0;l=f[i>>2]|0;m=k-l>>2;n=l;l=k;if(h>>>0<=m>>>0)if(h>>>0<m>>>0?(k=n+(h<<2)|0,(k|0)!=(l|0)):0){f[j>>2]=l+(~((l+-4-k|0)>>>2)<<2);o=g;p=h}else{o=g;p=h}else{Ch(i,h-m|0,3600);m=f[e>>2]|0;o=m;p=f[m+80>>2]|0}m=(f[o+100>>2]|0)-(f[o+96>>2]|0)|0;e=(m|0)/12|0;if(!m){q=1;return q|0}m=a+80|0;a=c+68|0;c=f[o+96>>2]|0;o=0;while(1){h=o*3|0;if((h|0)==-1)r=-1;else r=f[(f[d>>2]|0)+(h<<2)>>2]|0;i=f[(f[m>>2]|0)+12>>2]|0;g=f[i+(r<<2)>>2]|0;if(g>>>0>=p>>>0){q=0;s=12;break}k=f[a>>2]|0;f[k+(f[c+(o*12|0)>>2]<<2)>>2]=g;g=h+1|0;if((g|0)==-1)t=-1;else t=f[(f[d>>2]|0)+(g<<2)>>2]|0;g=f[i+(t<<2)>>2]|0;if(g>>>0>=p>>>0){q=0;s=12;break}f[k+(f[c+(o*12|0)+4>>2]<<2)>>2]=g;g=h+2|0;if((g|0)==-1)u=-1;else u=f[(f[d>>2]|0)+(g<<2)>>2]|0;g=f[i+(u<<2)>>2]|0;if(g>>>0>=p>>>0){q=0;s=12;break}f[k+(f[c+(o*12|0)+8>>2]<<2)>>2]=g;o=o+1|0;if(o>>>0>=e>>>0){q=1;s=12;break}}if((s|0)==12)return q|0;return 0}function wf(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;d=f[a+8>>2]|0;e=a+112|0;g=f[e>>2]|0;h=f[g+80>>2]|0;b[c+84>>0]=0;i=c+68|0;j=c+72|0;k=f[j>>2]|0;l=f[i>>2]|0;m=k-l>>2;n=l;l=k;if(h>>>0<=m>>>0)if(h>>>0<m>>>0?(k=n+(h<<2)|0,(k|0)!=(l|0)):0){f[j>>2]=l+(~((l+-4-k|0)>>>2)<<2);o=g;p=h}else{o=g;p=h}else{Ch(i,h-m|0,3600);m=f[e>>2]|0;o=m;p=f[m+80>>2]|0}m=(f[o+100>>2]|0)-(f[o+96>>2]|0)|0;e=(m|0)/12|0;if(!m){q=1;return q|0}m=a+116|0;a=c+68|0;c=f[o+96>>2]|0;o=0;while(1){h=o*3|0;if((h|0)==-1)r=-1;else r=f[(f[d>>2]|0)+(h<<2)>>2]|0;i=f[(f[m>>2]|0)+12>>2]|0;g=f[i+(r<<2)>>2]|0;if(g>>>0>=p>>>0){q=0;s=12;break}k=f[a>>2]|0;f[k+(f[c+(o*12|0)>>2]<<2)>>2]=g;g=h+1|0;if((g|0)==-1)t=-1;else t=f[(f[d>>2]|0)+(g<<2)>>2]|0;g=f[i+(t<<2)>>2]|0;if(g>>>0>=p>>>0){q=0;s=12;break}f[k+(f[c+(o*12|0)+4>>2]<<2)>>2]=g;g=h+2|0;if((g|0)==-1)u=-1;else u=f[(f[d>>2]|0)+(g<<2)>>2]|0;g=f[i+(u<<2)>>2]|0;if(g>>>0>=p>>>0){q=0;s=12;break}f[k+(f[c+(o*12|0)+8>>2]<<2)>>2]=g;o=o+1|0;if(o>>>0>=e>>>0){q=1;s=12;break}}if((s|0)==12)return q|0;return 0}function xf(a,c,d,e,g){a=a|0;c=c|0;d=d|0;e=e|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;d=u;u=u+16|0;h=d;i=f[a+124>>2]|0;if(!i){u=d;return}j=i+-1|0;k=(j&i|0)==0;if(!k)if(i>>>0>g>>>0)l=g;else l=(g>>>0)%(i>>>0)|0;else l=j&g;m=f[(f[a+120>>2]|0)+(l<<2)>>2]|0;if(!m){u=d;return}n=f[m>>2]|0;if(!n){u=d;return}a:do if(k){m=n;while(1){o=f[m+4>>2]|0;p=(o|0)==(g|0);if(!(p|(o&j|0)==(l|0))){q=24;break}if(p?(f[m+8>>2]|0)==(g|0):0){r=m;break a}m=f[m>>2]|0;if(!m){q=24;break}}if((q|0)==24){u=d;return}}else{m=n;while(1){p=f[m+4>>2]|0;if((p|0)==(g|0)){if((f[m+8>>2]|0)==(g|0)){r=m;break a}}else{if(p>>>0<i>>>0)s=p;else s=(p>>>0)%(i>>>0)|0;if((s|0)!=(l|0)){q=24;break}}m=f[m>>2]|0;if(!m){q=24;break}}if((q|0)==24){u=d;return}}while(0);q=f[r+12>>2]|0;if((q|0)==-1){u=d;return}f[h>>2]=q;f[h+4>>2]=c;b[h+8>>0]=e&1;e=a+112|0;c=f[e>>2]|0;if((c|0)==(f[a+116>>2]|0))yi(a+108|0,h);else{f[c>>2]=f[h>>2];f[c+4>>2]=f[h+4>>2];f[c+8>>2]=f[h+8>>2];f[e>>2]=(f[e>>2]|0)+12}u=d;return}function yf(a,b){a=a|0;b=b|0;var c=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;c=d[b>>1]|0;e=d[b+2>>1]|0;g=d[b+4>>1]|0;h=d[b+6>>1]|0;b=((((c^318)&65535)+239^e&65535)+239^g&65535)+239^h&65535;i=f[a+4>>2]|0;if(!i){j=0;return j|0}k=i+-1|0;l=(k&i|0)==0;if(!l)if(b>>>0<i>>>0)m=b;else m=(b>>>0)%(i>>>0)|0;else m=b&k;n=f[(f[a>>2]|0)+(m<<2)>>2]|0;if(!n){j=0;return j|0}a=f[n>>2]|0;if(!a){j=0;return j|0}if(l){l=a;while(1){n=f[l+4>>2]|0;o=(n|0)==(b|0);if(!(o|(n&k|0)==(m|0))){j=0;p=25;break}if((((o?(o=l+8|0,(d[o>>1]|0)==c<<16>>16):0)?(d[o+2>>1]|0)==e<<16>>16:0)?(d[l+12>>1]|0)==g<<16>>16:0)?(d[o+6>>1]|0)==h<<16>>16:0){j=l;p=25;break}l=f[l>>2]|0;if(!l){j=0;p=25;break}}if((p|0)==25)return j|0}else q=a;while(1){a=f[q+4>>2]|0;if((a|0)==(b|0)){l=q+8|0;if((((d[l>>1]|0)==c<<16>>16?(d[l+2>>1]|0)==e<<16>>16:0)?(d[q+12>>1]|0)==g<<16>>16:0)?(d[l+6>>1]|0)==h<<16>>16:0){j=q;p=25;break}}else{if(a>>>0<i>>>0)r=a;else r=(a>>>0)%(i>>>0)|0;if((r|0)!=(m|0)){j=0;p=25;break}}q=f[q>>2]|0;if(!q){j=0;p=25;break}}if((p|0)==25)return j|0;return 0}function zf(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0;g=u;u=u+32|0;h=g+12|0;i=g;f[a>>2]=f[d>>2];d=a+4|0;f[d>>2]=(f[c>>2]|0)-(f[b>>2]|0);j=e+16|0;k=j;l=f[k+4>>2]|0;if(!((l|0)>0|(l|0)==0&(f[k>>2]|0)>>>0>0)?(k=e+4|0,f[i>>2]=f[k>>2],f[h>>2]=f[i>>2],Me(e,h,a,a+4|0)|0,l=j,j=f[l+4>>2]|0,!((j|0)>0|(j|0)==0&(f[l>>2]|0)>>>0>0)):0){f[i>>2]=f[k>>2];f[h>>2]=f[i>>2];Me(e,h,d,d+4|0)|0;m=i}else m=i;if(!(f[d>>2]|0)){u=g;return 1}d=a+12|0;Mm(d);m=a+32|0;Mm(m);k=a+52|0;Mm(k);l=a+72|0;Mm(l);f[i>>2]=f[b>>2];f[i+4>>2]=f[b+4>>2];f[i+8>>2]=f[b+8>>2];f[h>>2]=f[c>>2];f[h+4>>2]=f[c+4>>2];f[h+8>>2]=f[c+8>>2];hb(a,i,h);Bg(d,e);Bg(m,e);Bg(k,e);Bg(l,e);u=g;return 1}function Af(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0;g=u;u=u+32|0;h=g+12|0;i=g;f[a>>2]=f[d>>2];d=a+4|0;f[d>>2]=(f[c>>2]|0)-(f[b>>2]|0);j=e+16|0;k=j;l=f[k+4>>2]|0;if(!((l|0)>0|(l|0)==0&(f[k>>2]|0)>>>0>0)?(k=e+4|0,f[i>>2]=f[k>>2],f[h>>2]=f[i>>2],Me(e,h,a,a+4|0)|0,l=j,j=f[l+4>>2]|0,!((j|0)>0|(j|0)==0&(f[l>>2]|0)>>>0>0)):0){f[i>>2]=f[k>>2];f[h>>2]=f[i>>2];Me(e,h,d,d+4|0)|0;m=i}else m=i;if(!(f[d>>2]|0)){u=g;return 1}d=a+12|0;tk(d);m=a+44|0;Mm(m);k=a+64|0;Mm(k);l=a+84|0;Mm(l);f[i>>2]=f[b>>2];f[i+4>>2]=f[b+4>>2];f[i+8>>2]=f[b+8>>2];f[h>>2]=f[c>>2];f[h+4>>2]=f[c+4>>2];f[h+8>>2]=f[c+8>>2];lb(a,i,h);ld(d,e);Bg(m,e);Bg(k,e);Bg(l,e);u=g;return 1}function Bf(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0;a=u;u=u+16|0;e=a+4|0;g=a;h=a+8|0;i=d+11|0;j=b[i>>0]|0;k=j<<24>>24<0;if(k){l=f[d+4>>2]|0;if(l>>>0>255){m=0;u=a;return m|0}else n=l}else n=j&255;if(!n){b[h>>0]=0;n=c+16|0;l=f[n+4>>2]|0;if(!((l|0)>0|(l|0)==0&(f[n>>2]|0)>>>0>0)){f[g>>2]=f[c+4>>2];f[e>>2]=f[g>>2];Me(c,e,h,h+1|0)|0}m=1;u=a;return m|0}n=d+4|0;l=f[n>>2]|0;b[h>>0]=k?l:j&255;k=c+16|0;o=k;p=f[o>>2]|0;q=f[o+4>>2]|0;if((q|0)>0|(q|0)==0&p>>>0>0){r=j;s=q;t=p;v=l}else{f[g>>2]=f[c+4>>2];f[e>>2]=f[g>>2];Me(c,e,h,h+1|0)|0;h=k;r=b[i>>0]|0;s=f[h+4>>2]|0;t=f[h>>2]|0;v=f[n>>2]|0}n=r<<24>>24<0;h=n?f[d>>2]|0:d;if(!((s|0)>0|(s|0)==0&t>>>0>0)){f[g>>2]=f[c+4>>2];f[e>>2]=f[g>>2];Me(c,e,h,h+(n?v:r&255)|0)|0}m=1;u=a;return m|0}function Cf(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;c=a+4|0;d=f[a>>2]|0;e=((f[c>>2]|0)-d|0)/24|0;g=e+1|0;if(g>>>0>178956970)aq(a);h=a+8|0;i=((f[h>>2]|0)-d|0)/24|0;d=i<<1;j=i>>>0<89478485?(d>>>0<g>>>0?g:d):178956970;do if(j)if(j>>>0>178956970){d=ra(8)|0;Oo(d,16035);f[d>>2]=7256;va(d|0,1112,110)}else{k=ln(j*24|0)|0;break}else k=0;while(0);d=k+(e*24|0)|0;g=d;i=k+(j*24|0)|0;f[d>>2]=1196;f[k+(e*24|0)+4>>2]=f[b+4>>2];fk(k+(e*24|0)+8|0,b+8|0);f[k+(e*24|0)+20>>2]=f[b+20>>2];b=d+24|0;e=f[a>>2]|0;k=f[c>>2]|0;if((k|0)==(e|0)){l=g;m=e;n=e}else{j=k;k=g;g=d;do{f[g+-24>>2]=1196;f[g+-20>>2]=f[j+-20>>2];d=g+-16|0;o=j+-16|0;f[d>>2]=0;p=g+-12|0;f[p>>2]=0;f[g+-8>>2]=0;f[d>>2]=f[o>>2];d=j+-12|0;f[p>>2]=f[d>>2];p=j+-8|0;f[g+-8>>2]=f[p>>2];f[p>>2]=0;f[d>>2]=0;f[o>>2]=0;f[g+-4>>2]=f[j+-4>>2];j=j+-24|0;g=k+-24|0;k=g}while((j|0)!=(e|0));l=k;m=f[a>>2]|0;n=f[c>>2]|0}f[a>>2]=l;f[c>>2]=b;f[h>>2]=i;i=m;if((n|0)!=(i|0)){h=n;do{h=h+-24|0;Va[f[f[h>>2]>>2]&127](h)}while((h|0)!=(i|0))}if(!m)return;Oq(m);return}function Df(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;c=u;u=u+32|0;d=c+24|0;e=c+16|0;g=c+8|0;h=c;f[a>>2]=3588;f[a+4>>2]=f[b+4>>2];i=a+8|0;j=b+8|0;f[i>>2]=0;k=a+12|0;f[k>>2]=0;l=a+16|0;f[l>>2]=0;m=b+12|0;n=f[m>>2]|0;do if(n|0)if((n|0)<0)aq(i);else{o=((n+-1|0)>>>5)+1|0;p=ln(o<<2)|0;f[i>>2]=p;f[k>>2]=0;f[l>>2]=o;o=f[j>>2]|0;f[g>>2]=o;f[g+4>>2]=0;p=f[m>>2]|0;f[h>>2]=o+(p>>>5<<2);f[h+4>>2]=p&31;f[e>>2]=f[g>>2];f[e+4>>2]=f[g+4>>2];f[d>>2]=f[h>>2];f[d+4>>2]=f[h+4>>2];Tf(i,e,d);break}while(0);i=a+20|0;f[i>>2]=0;m=a+24|0;f[m>>2]=0;j=a+28|0;f[j>>2]=0;a=b+24|0;l=f[a>>2]|0;if(!l){u=c;return}if((l|0)<0)aq(i);k=((l+-1|0)>>>5)+1|0;l=ln(k<<2)|0;f[i>>2]=l;f[m>>2]=0;f[j>>2]=k;k=f[b+20>>2]|0;f[g>>2]=k;f[g+4>>2]=0;b=f[a>>2]|0;f[h>>2]=k+(b>>>5<<2);f[h+4>>2]=b&31;f[e>>2]=f[g>>2];f[e+4>>2]=f[g+4>>2];f[d>>2]=f[h>>2];f[d+4>>2]=f[h+4>>2];Tf(i,e,d);u=c;return}function Ef(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;d=b[c>>0]|0;e=b[c+1>>0]|0;g=b[c+2>>0]|0;h=b[c+3>>0]|0;c=(((d&255^318)+239^e&255)+239^g&255)+239^h&255;i=f[a+4>>2]|0;if(!i){j=0;return j|0}k=i+-1|0;l=(k&i|0)==0;if(!l)if(c>>>0<i>>>0)m=c;else m=(c>>>0)%(i>>>0)|0;else m=c&k;n=f[(f[a>>2]|0)+(m<<2)>>2]|0;if(!n){j=0;return j|0}a=f[n>>2]|0;if(!a){j=0;return j|0}if(l){l=a;while(1){n=f[l+4>>2]|0;o=(n|0)==(c|0);if(!(o|(n&k|0)==(m|0))){j=0;p=25;break}if((((o?(o=l+8|0,(b[o>>0]|0)==d<<24>>24):0)?(b[o+1>>0]|0)==e<<24>>24:0)?(b[o+2>>0]|0)==g<<24>>24:0)?(b[o+3>>0]|0)==h<<24>>24:0){j=l;p=25;break}l=f[l>>2]|0;if(!l){j=0;p=25;break}}if((p|0)==25)return j|0}else q=a;while(1){a=f[q+4>>2]|0;if((a|0)==(c|0)){l=q+8|0;if((((b[l>>0]|0)==d<<24>>24?(b[l+1>>0]|0)==e<<24>>24:0)?(b[l+2>>0]|0)==g<<24>>24:0)?(b[l+3>>0]|0)==h<<24>>24:0){j=q;p=25;break}}else{if(a>>>0<i>>>0)r=a;else r=(a>>>0)%(i>>>0)|0;if((r|0)!=(m|0)){j=0;p=25;break}}q=f[q>>2]|0;if(!q){j=0;p=25;break}}if((p|0)==25)return j|0;return 0}function Ff(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;c=u;u=u+32|0;d=c+24|0;e=c+16|0;g=c+8|0;h=c;f[a>>2]=3636;f[a+4>>2]=f[b+4>>2];i=a+8|0;j=b+8|0;f[i>>2]=0;k=a+12|0;f[k>>2]=0;l=a+16|0;f[l>>2]=0;m=b+12|0;n=f[m>>2]|0;do if(n|0)if((n|0)<0)aq(i);else{o=((n+-1|0)>>>5)+1|0;p=ln(o<<2)|0;f[i>>2]=p;f[k>>2]=0;f[l>>2]=o;o=f[j>>2]|0;f[g>>2]=o;f[g+4>>2]=0;p=f[m>>2]|0;f[h>>2]=o+(p>>>5<<2);f[h+4>>2]=p&31;f[e>>2]=f[g>>2];f[e+4>>2]=f[g+4>>2];f[d>>2]=f[h>>2];f[d+4>>2]=f[h+4>>2];Tf(i,e,d);break}while(0);i=a+20|0;f[i>>2]=0;m=a+24|0;f[m>>2]=0;j=a+28|0;f[j>>2]=0;a=b+24|0;l=f[a>>2]|0;if(!l){u=c;return}if((l|0)<0)aq(i);k=((l+-1|0)>>>5)+1|0;l=ln(k<<2)|0;f[i>>2]=l;f[m>>2]=0;f[j>>2]=k;k=f[b+20>>2]|0;f[g>>2]=k;f[g+4>>2]=0;b=f[a>>2]|0;f[h>>2]=k+(b>>>5<<2);f[h+4>>2]=b&31;f[e>>2]=f[g>>2];f[e+4>>2]=f[g+4>>2];f[d>>2]=f[h>>2];f[d+4>>2]=f[h+4>>2];Tf(i,e,d);u=c;return}function Gf(a,b,c,d,e,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0;d=u;u=u+32|0;h=d+24|0;i=d+16|0;j=d;k=d+8|0;l=a+40|0;f[a+44>>2]=g;g=a+36|0;m=f[g>>2]|0;n=f[m+4>>2]|0;o=f[m>>2]|0;p=n-o|0;if((p|0)<=0){u=d;return 1}q=(p>>>2)+-1|0;p=a+8|0;r=a+48|0;s=a+52|0;a=i+4|0;t=j+4|0;v=h+4|0;if(n-o>>2>>>0>q>>>0){w=q;x=o}else{y=m;aq(y)}while(1){f[k>>2]=f[x+(w<<2)>>2];f[h>>2]=f[k>>2];ub(l,h,b,w);m=X(w,e)|0;o=b+(m<<2)|0;q=c+(m<<2)|0;m=f[o+4>>2]|0;n=f[r>>2]|0;z=f[s>>2]|0;f[i>>2]=f[o>>2];f[a>>2]=m;f[j>>2]=n;f[t>>2]=z;Od(h,p,i,j);f[q>>2]=f[h>>2];f[q+4>>2]=f[v>>2];w=w+-1|0;if((w|0)<=-1){A=3;break}q=f[g>>2]|0;x=f[q>>2]|0;if((f[q+4>>2]|0)-x>>2>>>0<=w>>>0){y=q;A=4;break}}if((A|0)==3){u=d;return 1}else if((A|0)==4)aq(y);return 0}function Hf(a,b,c,d,e,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0;h=u;u=u+32|0;i=h;j=h+16|0;k=f[(f[(f[b+4>>2]|0)+8>>2]|0)+(d<<2)>>2]|0;do if((c+-1|0)>>>0<6&(Qa[f[(f[b>>2]|0)+8>>2]&127](b)|0)==1){l=Qa[f[(f[b>>2]|0)+48>>2]&127](b)|0;m=Ra[f[(f[b>>2]|0)+56>>2]&127](b,d)|0;if((l|0)==0|(m|0)==0){f[a>>2]=0;u=h;return}n=Ra[f[(f[b>>2]|0)+52>>2]&127](b,d)|0;if(!n){f[i>>2]=f[b+52>>2];f[i+4>>2]=l;f[i+12>>2]=m;f[i+8>>2]=m+12;Cd(a,j,c,k,e,i,g);if(!(f[a>>2]|0)){f[a>>2]=0;break}u=h;return}else{f[i>>2]=f[b+52>>2];f[i+4>>2]=n;f[i+12>>2]=m;f[i+8>>2]=m+12;Ad(a,j,c,k,e,i,g);if(!(f[a>>2]|0)){f[a>>2]=0;break}u=h;return}}while(0);f[a>>2]=0;u=h;return}function If(a,b,c,d,e,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0;d=u;u=u+32|0;h=d+24|0;i=d+16|0;j=d;k=d+8|0;l=a+40|0;f[a+44>>2]=g;g=a+36|0;m=f[g>>2]|0;n=f[m+4>>2]|0;o=f[m>>2]|0;p=n-o|0;if((p|0)<=0){u=d;return 1}q=(p>>>2)+-1|0;p=a+8|0;r=a+48|0;s=a+52|0;a=i+4|0;t=j+4|0;v=h+4|0;if(n-o>>2>>>0>q>>>0){w=q;x=o}else{y=m;aq(y)}while(1){f[k>>2]=f[x+(w<<2)>>2];f[h>>2]=f[k>>2];tb(l,h,b,w);m=X(w,e)|0;o=b+(m<<2)|0;q=c+(m<<2)|0;m=f[o+4>>2]|0;n=f[r>>2]|0;z=f[s>>2]|0;f[i>>2]=f[o>>2];f[a>>2]=m;f[j>>2]=n;f[t>>2]=z;Od(h,p,i,j);f[q>>2]=f[h>>2];f[q+4>>2]=f[v>>2];w=w+-1|0;if((w|0)<=-1){A=3;break}q=f[g>>2]|0;x=f[q>>2]|0;if((f[q+4>>2]|0)-x>>2>>>0<=w>>>0){y=q;A=4;break}}if((A|0)==3){u=d;return 1}else if((A|0)==4)aq(y);return 0}function Jf(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;d=f[b>>2]|0;b=f[c>>2]|0;e=b-d>>2;g=a+8|0;h=f[g>>2]|0;i=f[a>>2]|0;j=i;k=b;if(e>>>0<=h-i>>2>>>0){l=a+4|0;m=(f[l>>2]|0)-i>>2;n=e>>>0>m>>>0;o=n?d+(m<<2)|0:b;b=o-d|0;m=b>>2;if(m|0)im(i|0,d|0,b|0)|0;b=j+(m<<2)|0;if(!n){n=f[l>>2]|0;if((n|0)==(b|0))return;f[l>>2]=n+(~((n+-4-b|0)>>>2)<<2);return}b=f[c>>2]|0;c=o;if((b|0)==(c|0))return;n=f[l>>2]|0;m=b+-4-o|0;o=c;c=n;while(1){f[c>>2]=f[o>>2];o=o+4|0;if((o|0)==(b|0))break;else c=c+4|0}f[l>>2]=n+((m>>>2)+1<<2);return}m=i;if(!i)p=h;else{h=a+4|0;n=f[h>>2]|0;if((n|0)!=(j|0))f[h>>2]=n+(~((n+-4-i|0)>>>2)<<2);Oq(m);f[g>>2]=0;f[h>>2]=0;f[a>>2]=0;p=0}if(e>>>0>1073741823)aq(a);h=p>>1;m=p>>2>>>0<536870911?(h>>>0<e>>>0?e:h):1073741823;if(m>>>0>1073741823)aq(a);h=ln(m<<2)|0;e=a+4|0;f[e>>2]=h;f[a>>2]=h;f[g>>2]=h+(m<<2);m=d;if((k|0)==(m|0))return;g=k+-4-d|0;d=m;m=h;while(1){f[m>>2]=f[d>>2];d=d+4|0;if((d|0)==(k|0))break;else m=m+4|0}f[e>>2]=h+((g>>>2)+1<<2);return}function Kf(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;c=a+8|0;d=f[c>>2]|0;e=a+4|0;g=f[e>>2]|0;h=g;if(((d-g|0)/12|0)>>>0>=b>>>0){sj(g|0,0,b*12|0)|0;f[e>>2]=h+(b*12|0);return}i=f[a>>2]|0;j=(g-i|0)/12|0;g=j+b|0;k=i;if(g>>>0>357913941)aq(a);l=(d-i|0)/12|0;d=l<<1;m=l>>>0<178956970?(d>>>0<g>>>0?g:d):357913941;do if(m)if(m>>>0>357913941){d=ra(8)|0;Oo(d,16035);f[d>>2]=7256;va(d|0,1112,110)}else{n=ln(m*12|0)|0;break}else n=0;while(0);d=n+(j*12|0)|0;j=d;g=n+(m*12|0)|0;sj(d|0,0,b*12|0)|0;m=d+(b*12|0)|0;if((h|0)==(k|0)){o=j;p=i;q=h}else{i=h;h=j;j=d;do{d=j+-12|0;b=i;i=i+-12|0;f[d>>2]=0;n=j+-8|0;f[n>>2]=0;f[j+-4>>2]=0;f[d>>2]=f[i>>2];d=b+-8|0;f[n>>2]=f[d>>2];n=b+-4|0;f[j+-4>>2]=f[n>>2];f[n>>2]=0;f[d>>2]=0;f[i>>2]=0;j=h+-12|0;h=j}while((i|0)!=(k|0));o=h;p=f[a>>2]|0;q=f[e>>2]|0}f[a>>2]=o;f[e>>2]=m;f[c>>2]=g;g=p;if((q|0)!=(g|0)){c=q;do{q=c;c=c+-12|0;m=f[c>>2]|0;if(m|0){e=q+-8|0;q=f[e>>2]|0;if((q|0)!=(m|0))f[e>>2]=q+(~((q+-4-m|0)>>>2)<<2);Oq(m)}}while((c|0)!=(g|0))}if(!p)return;Oq(p);return}function Lf(a){a=a|0;var b=0,c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;b=u;u=u+16|0;c=b+4|0;d=b;e=a+8|0;g=f[e>>2]|0;gk(f[a+4>>2]|0,(f[g+28>>2]|0)-(f[g+24>>2]|0)>>2);g=a+100|0;h=f[e>>2]|0;i=(f[h+28>>2]|0)-(f[h+24>>2]|0)>>2;f[c>>2]=0;h=a+104|0;j=f[h>>2]|0;k=f[g>>2]|0;l=j-k>>2;m=k;k=j;if(i>>>0<=l>>>0){if(i>>>0<l>>>0?(j=m+(i<<2)|0,(j|0)!=(k|0)):0)f[h>>2]=k+(~((k+-4-j|0)>>>2)<<2)}else Ch(g,i-l|0,c);l=a+120|0;a=f[l>>2]|0;if(!a){i=f[e>>2]|0;g=(f[i+4>>2]|0)-(f[i>>2]|0)>>2;i=(g>>>0)/3|0;if(g>>>0<=2){u=b;return 1}g=0;do{f[d>>2]=g*3;f[c>>2]=f[d>>2];wb(e,c);g=g+1|0}while((g|0)<(i|0));u=b;return 1}else{i=f[a>>2]|0;if((f[a+4>>2]|0)==(i|0)){u=b;return 1}a=0;g=i;do{f[d>>2]=f[g+(a<<2)>>2];f[c>>2]=f[d>>2];wb(e,c);a=a+1|0;i=f[l>>2]|0;g=f[i>>2]|0}while(a>>>0<(f[i+4>>2]|0)-g>>2>>>0);u=b;return 1}return 0}function Mf(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;d=u;u=u+32|0;e=d;g=a+40|0;h=(f[c>>2]|0)+(f[g>>2]|0)|0;i=a+24|0;j=f[a+32>>2]|0;k=j+-4194304|0;do if(k>>>0>=64){if(k>>>0<16384){l=a+28|0;m=(f[i>>2]|0)+(f[l>>2]|0)|0;n=j+-4177920|0;b[m>>0]=n;b[m+1>>0]=n>>>8;o=(f[l>>2]|0)+2|0;break}if(k>>>0<4194304){l=a+28|0;n=(f[i>>2]|0)+(f[l>>2]|0)|0;m=j+4194304|0;b[n>>0]=m;b[n+1>>0]=m>>>8;b[n+2>>0]=m>>>16;o=(f[l>>2]|0)+3|0;break}if(k>>>0<1073741824){l=a+28|0;m=(f[i>>2]|0)+(f[l>>2]|0)|0;n=j+-1077936128|0;b[m>>0]=n;b[m+1>>0]=n>>>8;b[m+2>>0]=n>>>16;b[m+3>>0]=n>>>24;o=(f[l>>2]|0)+4|0;break}else{o=f[a+28>>2]|0;break}}else{l=a+28|0;b[(f[i>>2]|0)+(f[l>>2]|0)>>0]=k;o=(f[l>>2]|0)+1|0}while(0);k=((o|0)<0)<<31>>31;Gn(e);yh(o,k,e)|0;i=e+4|0;a=(f[i>>2]|0)-(f[e>>2]|0)|0;im(h+a|0,h|0,o|0)|0;kh(h|0,f[e>>2]|0,a|0)|0;h=g;g=f[h>>2]|0;j=f[h+4>>2]|0;h=Vn(a|0,0,o|0,k|0)|0;k=Vn(h|0,I|0,g|0,j|0)|0;Cl(c,k,I);k=e+12|0;c=f[k>>2]|0;f[k>>2]=0;if(c|0)Oq(c);c=f[e>>2]|0;if(!c){u=d;return}if((f[i>>2]|0)!=(c|0))f[i>>2]=c;Oq(c);u=d;return}function Nf(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;d=u;u=u+32|0;e=d;g=a+40|0;h=(f[c>>2]|0)+(f[g>>2]|0)|0;i=a+24|0;j=f[a+32>>2]|0;k=j+-2097152|0;do if(k>>>0>=64){if(k>>>0<16384){l=a+28|0;m=(f[i>>2]|0)+(f[l>>2]|0)|0;n=j+-2080768|0;b[m>>0]=n;b[m+1>>0]=n>>>8;o=(f[l>>2]|0)+2|0;break}if(k>>>0<4194304){l=a+28|0;n=(f[i>>2]|0)+(f[l>>2]|0)|0;m=j+6291456|0;b[n>>0]=m;b[n+1>>0]=m>>>8;b[n+2>>0]=m>>>16;o=(f[l>>2]|0)+3|0;break}if(k>>>0<1073741824){l=a+28|0;m=(f[i>>2]|0)+(f[l>>2]|0)|0;n=j+-1075838976|0;b[m>>0]=n;b[m+1>>0]=n>>>8;b[m+2>>0]=n>>>16;b[m+3>>0]=n>>>24;o=(f[l>>2]|0)+4|0;break}else{o=f[a+28>>2]|0;break}}else{l=a+28|0;b[(f[i>>2]|0)+(f[l>>2]|0)>>0]=k;o=(f[l>>2]|0)+1|0}while(0);k=((o|0)<0)<<31>>31;Gn(e);yh(o,k,e)|0;i=e+4|0;a=(f[i>>2]|0)-(f[e>>2]|0)|0;im(h+a|0,h|0,o|0)|0;kh(h|0,f[e>>2]|0,a|0)|0;h=g;g=f[h>>2]|0;j=f[h+4>>2]|0;h=Vn(a|0,0,o|0,k|0)|0;k=Vn(h|0,I|0,g|0,j|0)|0;Cl(c,k,I);k=e+12|0;c=f[k>>2]|0;f[k>>2]=0;if(c|0)Oq(c);c=f[e>>2]|0;if(!c){u=d;return}if((f[i>>2]|0)!=(c|0))f[i>>2]=c;Oq(c);u=d;return}function Of(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;d=u;u=u+32|0;e=d;g=a+40|0;h=(f[c>>2]|0)+(f[g>>2]|0)|0;i=a+24|0;j=f[a+32>>2]|0;k=j+-1048576|0;do if(k>>>0>=64){if(k>>>0<16384){l=a+28|0;m=(f[i>>2]|0)+(f[l>>2]|0)|0;n=j+-1032192|0;b[m>>0]=n;b[m+1>>0]=n>>>8;o=(f[l>>2]|0)+2|0;break}if(k>>>0<4194304){l=a+28|0;n=(f[i>>2]|0)+(f[l>>2]|0)|0;m=j+7340032|0;b[n>>0]=m;b[n+1>>0]=m>>>8;b[n+2>>0]=m>>>16;o=(f[l>>2]|0)+3|0;break}if(k>>>0<1073741824){l=a+28|0;m=(f[i>>2]|0)+(f[l>>2]|0)|0;n=j+-1074790400|0;b[m>>0]=n;b[m+1>>0]=n>>>8;b[m+2>>0]=n>>>16;b[m+3>>0]=n>>>24;o=(f[l>>2]|0)+4|0;break}else{o=f[a+28>>2]|0;break}}else{l=a+28|0;b[(f[i>>2]|0)+(f[l>>2]|0)>>0]=k;o=(f[l>>2]|0)+1|0}while(0);k=((o|0)<0)<<31>>31;Gn(e);yh(o,k,e)|0;i=e+4|0;a=(f[i>>2]|0)-(f[e>>2]|0)|0;im(h+a|0,h|0,o|0)|0;kh(h|0,f[e>>2]|0,a|0)|0;h=g;g=f[h>>2]|0;j=f[h+4>>2]|0;h=Vn(a|0,0,o|0,k|0)|0;k=Vn(h|0,I|0,g|0,j|0)|0;Cl(c,k,I);k=e+12|0;c=f[k>>2]|0;f[k>>2]=0;if(c|0)Oq(c);c=f[e>>2]|0;if(!c){u=d;return}if((f[i>>2]|0)!=(c|0))f[i>>2]=c;Oq(c);u=d;return}function Pf(a,c,d,e,g,h,i){a=a|0;c=c|0;d=d|0;e=e|0;g=g|0;h=h|0;i=i|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0;a=u;u=u+96|0;j=a;if(!c){k=-1;u=a;return k|0}Tm(j);Jj(j,d,0,g&255,i,0,g<<1,0,0,0);i=jf(c,j,1,e)|0;d=f[(f[c+8>>2]|0)+(i<<2)>>2]|0;if(e|0){l=d+84|0;m=d+68|0;n=d+40|0;o=d+64|0;d=0;do{if(!(b[l>>0]|0))p=f[(f[m>>2]|0)+(d<<2)>>2]|0;else p=d;q=h+((X(d,g)|0)<<1)|0;r=n;s=f[r>>2]|0;t=un(s|0,f[r+4>>2]|0,p|0,0)|0;kh((f[f[o>>2]>>2]|0)+t|0,q|0,s|0)|0;d=d+1|0}while((d|0)!=(e|0))}d=c+80|0;c=f[d>>2]|0;if(c)if((c|0)==(e|0))v=10;else w=-1;else{f[d>>2]=e;v=10}if((v|0)==10)w=i;i=j+88|0;v=f[i>>2]|0;f[i>>2]=0;if(v|0){i=f[v+8>>2]|0;if(i|0){e=v+12|0;if((f[e>>2]|0)!=(i|0))f[e>>2]=i;Oq(i)}Oq(v)}v=f[j+68>>2]|0;if(v|0){i=j+72|0;e=f[i>>2]|0;if((e|0)!=(v|0))f[i>>2]=e+(~((e+-4-v|0)>>>2)<<2);Oq(v)}v=j+64|0;j=f[v>>2]|0;f[v>>2]=0;if(j|0){v=f[j>>2]|0;if(v|0){e=j+4|0;if((f[e>>2]|0)!=(v|0))f[e>>2]=v;Oq(v)}Oq(j)}k=w;u=a;return k|0}function Qf(a,c,d,e,g,h,i){a=a|0;c=c|0;d=d|0;e=e|0;g=g|0;h=h|0;i=i|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0;a=u;u=u+96|0;j=a;if(!c){k=-1;u=a;return k|0}Tm(j);Jj(j,d,0,g&255,i,0,g<<2,0,0,0);i=jf(c,j,1,e)|0;d=f[(f[c+8>>2]|0)+(i<<2)>>2]|0;if(e|0){l=d+84|0;m=d+68|0;n=d+40|0;o=d+64|0;d=0;do{if(!(b[l>>0]|0))p=f[(f[m>>2]|0)+(d<<2)>>2]|0;else p=d;q=h+((X(d,g)|0)<<2)|0;r=n;s=f[r>>2]|0;t=un(s|0,f[r+4>>2]|0,p|0,0)|0;kh((f[f[o>>2]>>2]|0)+t|0,q|0,s|0)|0;d=d+1|0}while((d|0)!=(e|0))}d=c+80|0;c=f[d>>2]|0;if(c)if((c|0)==(e|0))v=10;else w=-1;else{f[d>>2]=e;v=10}if((v|0)==10)w=i;i=j+88|0;v=f[i>>2]|0;f[i>>2]=0;if(v|0){i=f[v+8>>2]|0;if(i|0){e=v+12|0;if((f[e>>2]|0)!=(i|0))f[e>>2]=i;Oq(i)}Oq(v)}v=f[j+68>>2]|0;if(v|0){i=j+72|0;e=f[i>>2]|0;if((e|0)!=(v|0))f[i>>2]=e+(~((e+-4-v|0)>>>2)<<2);Oq(v)}v=j+64|0;j=f[v>>2]|0;f[v>>2]=0;if(j|0){v=f[j>>2]|0;if(v|0){e=j+4|0;if((f[e>>2]|0)!=(v|0))f[e>>2]=v;Oq(v)}Oq(j)}k=w;u=a;return k|0}function Rf(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;d=u;u=u+32|0;e=d;g=a+40|0;h=(f[c>>2]|0)+(f[g>>2]|0)|0;i=a+24|0;j=f[a+32>>2]|0;k=j+-262144|0;do if(k>>>0>=64){if(k>>>0<16384){l=a+28|0;m=(f[i>>2]|0)+(f[l>>2]|0)|0;n=j+-245760|0;b[m>>0]=n;b[m+1>>0]=n>>>8;o=(f[l>>2]|0)+2|0;break}if(k>>>0<4194304){l=a+28|0;n=(f[i>>2]|0)+(f[l>>2]|0)|0;m=j+8126464|0;b[n>>0]=m;b[n+1>>0]=m>>>8;b[n+2>>0]=m>>>16;o=(f[l>>2]|0)+3|0;break}if(k>>>0<1073741824){l=a+28|0;m=(f[i>>2]|0)+(f[l>>2]|0)|0;n=j+-1074003968|0;b[m>>0]=n;b[m+1>>0]=n>>>8;b[m+2>>0]=n>>>16;b[m+3>>0]=n>>>24;o=(f[l>>2]|0)+4|0;break}else{o=f[a+28>>2]|0;break}}else{l=a+28|0;b[(f[i>>2]|0)+(f[l>>2]|0)>>0]=k;o=(f[l>>2]|0)+1|0}while(0);k=((o|0)<0)<<31>>31;Gn(e);yh(o,k,e)|0;i=e+4|0;a=(f[i>>2]|0)-(f[e>>2]|0)|0;im(h+a|0,h|0,o|0)|0;kh(h|0,f[e>>2]|0,a|0)|0;h=g;g=f[h>>2]|0;j=f[h+4>>2]|0;h=Vn(a|0,0,o|0,k|0)|0;k=Vn(h|0,I|0,g|0,j|0)|0;Cl(c,k,I);k=e+12|0;c=f[k>>2]|0;f[k>>2]=0;if(c|0)Oq(c);c=f[e>>2]|0;if(!c){u=d;return}if((f[i>>2]|0)!=(c|0))f[i>>2]=c;Oq(c);u=d;return}function Sf(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;d=u;u=u+32|0;e=d;g=a+40|0;h=(f[c>>2]|0)+(f[g>>2]|0)|0;i=a+24|0;j=f[a+32>>2]|0;k=j+-131072|0;do if(k>>>0>=64){if(k>>>0<16384){l=a+28|0;m=(f[i>>2]|0)+(f[l>>2]|0)|0;n=j+-114688|0;b[m>>0]=n;b[m+1>>0]=n>>>8;o=(f[l>>2]|0)+2|0;break}if(k>>>0<4194304){l=a+28|0;n=(f[i>>2]|0)+(f[l>>2]|0)|0;m=j+8257536|0;b[n>>0]=m;b[n+1>>0]=m>>>8;b[n+2>>0]=m>>>16;o=(f[l>>2]|0)+3|0;break}if(k>>>0<1073741824){l=a+28|0;m=(f[i>>2]|0)+(f[l>>2]|0)|0;n=j+-1073872896|0;b[m>>0]=n;b[m+1>>0]=n>>>8;b[m+2>>0]=n>>>16;b[m+3>>0]=n>>>24;o=(f[l>>2]|0)+4|0;break}else{o=f[a+28>>2]|0;break}}else{l=a+28|0;b[(f[i>>2]|0)+(f[l>>2]|0)>>0]=k;o=(f[l>>2]|0)+1|0}while(0);k=((o|0)<0)<<31>>31;Gn(e);yh(o,k,e)|0;i=e+4|0;a=(f[i>>2]|0)-(f[e>>2]|0)|0;im(h+a|0,h|0,o|0)|0;kh(h|0,f[e>>2]|0,a|0)|0;h=g;g=f[h>>2]|0;j=f[h+4>>2]|0;h=Vn(a|0,0,o|0,k|0)|0;k=Vn(h|0,I|0,g|0,j|0)|0;Cl(c,k,I);k=e+12|0;c=f[k>>2]|0;f[k>>2]=0;if(c|0)Oq(c);c=f[e>>2]|0;if(!c){u=d;return}if((f[i>>2]|0)!=(c|0))f[i>>2]=c;Oq(c);u=d;return}function Tf(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0;d=u;u=u+48|0;e=d+40|0;g=d+32|0;h=d+8|0;i=d;j=d+24|0;k=d+16|0;l=a+4|0;m=f[l>>2]|0;n=b;b=f[n>>2]|0;o=f[n+4>>2]|0;n=c;c=f[n>>2]|0;p=f[n+4>>2]|0;n=c-b<<3;f[l>>2]=m-o+p+n;l=(f[a>>2]|0)+(m>>>5<<2)|0;a=m&31;m=l;if((a|0)!=(o|0)){q=h;f[q>>2]=b;f[q+4>>2]=o;q=i;f[q>>2]=c;f[q+4>>2]=p;f[j>>2]=m;f[j+4>>2]=a;f[g>>2]=f[h>>2];f[g+4>>2]=f[h+4>>2];f[e>>2]=f[i>>2];f[e+4>>2]=f[i+4>>2];we(k,g,e,j);u=d;return}j=p-o+n|0;n=b;if((j|0)>0){if(!o){r=j;s=0;t=l;v=b;w=n}else{b=32-o|0;p=(j|0)<(b|0)?j:b;e=-1>>>(b-p|0)&-1<<o;f[l>>2]=f[l>>2]&~e|f[n>>2]&e;e=p+o|0;b=n+4|0;r=j-p|0;s=e&31;t=l+(e>>>5<<2)|0;v=b;w=b}b=(r|0)/32|0;im(t|0,v|0,b<<2|0)|0;v=r-(b<<5)|0;r=t+(b<<2)|0;t=r;if((v|0)>0){e=-1>>>(32-v|0);f[r>>2]=f[r>>2]&~e|f[w+(b<<2)>>2]&e;x=v;y=t}else{x=s;y=t}}else{x=o;y=m}f[k>>2]=y;f[k+4>>2]=x;u=d;return}function Uf(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;d=u;u=u+32|0;e=d;g=a+40|0;h=(f[c>>2]|0)+(f[g>>2]|0)|0;i=a+24|0;j=f[a+32>>2]|0;k=j+-32768|0;do if(k>>>0>=64){if(k>>>0<16384){l=a+28|0;m=(f[i>>2]|0)+(f[l>>2]|0)|0;n=j+-16384|0;b[m>>0]=n;b[m+1>>0]=n>>>8;o=(f[l>>2]|0)+2|0;break}if(k>>>0<4194304){l=a+28|0;n=(f[i>>2]|0)+(f[l>>2]|0)|0;m=j+8355840|0;b[n>>0]=m;b[n+1>>0]=m>>>8;b[n+2>>0]=m>>>16;o=(f[l>>2]|0)+3|0;break}if(k>>>0<1073741824){l=a+28|0;m=(f[i>>2]|0)+(f[l>>2]|0)|0;n=j+-1073774592|0;b[m>>0]=n;b[m+1>>0]=n>>>8;b[m+2>>0]=n>>>16;b[m+3>>0]=n>>>24;o=(f[l>>2]|0)+4|0;break}else{o=f[a+28>>2]|0;break}}else{l=a+28|0;b[(f[i>>2]|0)+(f[l>>2]|0)>>0]=k;o=(f[l>>2]|0)+1|0}while(0);k=((o|0)<0)<<31>>31;Gn(e);yh(o,k,e)|0;i=e+4|0;a=(f[i>>2]|0)-(f[e>>2]|0)|0;im(h+a|0,h|0,o|0)|0;kh(h|0,f[e>>2]|0,a|0)|0;h=g;g=f[h>>2]|0;j=f[h+4>>2]|0;h=Vn(a|0,0,o|0,k|0)|0;k=Vn(h|0,I|0,g|0,j|0)|0;Cl(c,k,I);k=e+12|0;c=f[k>>2]|0;f[k>>2]=0;if(c|0)Oq(c);c=f[e>>2]|0;if(!c){u=d;return}if((f[i>>2]|0)!=(c|0))f[i>>2]=c;Oq(c);u=d;return}function Vf(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;c=f[b>>2]|0;d=f[b+4>>2]|0;e=f[b+8>>2]|0;g=f[b+12>>2]|0;b=(((c^318)+239^d)+239^e)+239^g;h=f[a+4>>2]|0;if(!h){i=0;return i|0}j=h+-1|0;k=(j&h|0)==0;if(!k)if(b>>>0<h>>>0)l=b;else l=(b>>>0)%(h>>>0)|0;else l=b&j;m=f[(f[a>>2]|0)+(l<<2)>>2]|0;if(!m){i=0;return i|0}a=f[m>>2]|0;if(!a){i=0;return i|0}if(k){k=a;while(1){m=f[k+4>>2]|0;n=(m|0)==(b|0);if(!(n|(m&j|0)==(l|0))){i=0;o=25;break}if((((n?(f[k+8>>2]|0)==(c|0):0)?(f[k+12>>2]|0)==(d|0):0)?(f[k+16>>2]|0)==(e|0):0)?(f[k+20>>2]|0)==(g|0):0){i=k;o=25;break}k=f[k>>2]|0;if(!k){i=0;o=25;break}}if((o|0)==25)return i|0}else p=a;while(1){a=f[p+4>>2]|0;if((a|0)==(b|0)){if((((f[p+8>>2]|0)==(c|0)?(f[p+12>>2]|0)==(d|0):0)?(f[p+16>>2]|0)==(e|0):0)?(f[p+20>>2]|0)==(g|0):0){i=p;o=25;break}}else{if(a>>>0<h>>>0)q=a;else q=(a>>>0)%(h>>>0)|0;if((q|0)!=(l|0)){i=0;o=25;break}}p=f[p>>2]|0;if(!p){i=0;o=25;break}}if((o|0)==25)return i|0;return 0}function Wf(a,c,d,e,g,h,i){a=a|0;c=c|0;d=d|0;e=e|0;g=g|0;h=h|0;i=i|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0;a=u;u=u+96|0;j=a;if(!c){k=-1;u=a;return k|0}Tm(j);Jj(j,d,0,g&255,i,0,g,0,0,0);i=jf(c,j,1,e)|0;d=f[(f[c+8>>2]|0)+(i<<2)>>2]|0;if(e|0){l=d+84|0;m=d+68|0;n=d+40|0;o=d+64|0;d=0;do{if(!(b[l>>0]|0))p=f[(f[m>>2]|0)+(d<<2)>>2]|0;else p=d;q=h+(X(d,g)|0)|0;r=n;s=f[r>>2]|0;t=un(s|0,f[r+4>>2]|0,p|0,0)|0;kh((f[f[o>>2]>>2]|0)+t|0,q|0,s|0)|0;d=d+1|0}while((d|0)!=(e|0))}d=c+80|0;c=f[d>>2]|0;if(c)if((c|0)==(e|0))v=10;else w=-1;else{f[d>>2]=e;v=10}if((v|0)==10)w=i;i=j+88|0;v=f[i>>2]|0;f[i>>2]=0;if(v|0){i=f[v+8>>2]|0;if(i|0){e=v+12|0;if((f[e>>2]|0)!=(i|0))f[e>>2]=i;Oq(i)}Oq(v)}v=f[j+68>>2]|0;if(v|0){i=j+72|0;e=f[i>>2]|0;if((e|0)!=(v|0))f[i>>2]=e+(~((e+-4-v|0)>>>2)<<2);Oq(v)}v=j+64|0;j=f[v>>2]|0;f[v>>2]=0;if(j|0){v=f[j>>2]|0;if(v|0){e=j+4|0;if((f[e>>2]|0)!=(v|0))f[e>>2]=v;Oq(v)}Oq(j)}k=w;u=a;return k|0}function Xf(a,b,c,d,e,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0;h=u;u=u+32|0;i=h;j=h+16|0;k=f[(f[(f[b+4>>2]|0)+8>>2]|0)+(d<<2)>>2]|0;do if((c+-1|0)>>>0<6&(Qa[f[(f[b>>2]|0)+8>>2]&127](b)|0)==1){l=Qa[f[(f[b>>2]|0)+48>>2]&127](b)|0;m=Ra[f[(f[b>>2]|0)+56>>2]&127](b,d)|0;if((l|0)==0|(m|0)==0){f[a>>2]=0;u=h;return}n=Ra[f[(f[b>>2]|0)+52>>2]&127](b,d)|0;if(!n){f[i>>2]=f[b+52>>2];f[i+4>>2]=l;f[i+12>>2]=m;f[i+8>>2]=m+12;qd(a,j,c,k,e,i,g);if(!(f[a>>2]|0)){f[a>>2]=0;break}u=h;return}else{f[i>>2]=f[b+52>>2];f[i+4>>2]=n;f[i+12>>2]=m;f[i+8>>2]=m+12;pd(a,j,c,k,e,i,g);if(!(f[a>>2]|0)){f[a>>2]=0;break}u=h;return}}while(0);f[a>>2]=0;u=h;return}function Yf(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0;e=f[d>>2]|0;g=f[d+4>>2]|0;if((e|0)==(g|0)){h=0;i=a+12|0;j=a+8|0}else{d=f[c>>2]|0;c=a+8|0;k=a+12|0;a=0;l=e;while(1){e=f[l>>2]|0;m=f[d+(e<<2)>>2]|0;if(m>>>0<a>>>0)n=a;else{o=f[c>>2]|0;p=(f[k>>2]|0)-o|0;q=o;if((p|0)>0){o=p>>>2;p=0;do{r=f[q+(p<<2)>>2]|0;s=f[r+68>>2]|0;if(!(b[r+84>>0]|0))t=f[s+(e<<2)>>2]|0;else t=e;f[s+(m<<2)>>2]=t;p=p+1|0}while((p|0)<(o|0))}n=m+1|0}l=l+4|0;if((l|0)==(g|0)){h=n;i=k;j=c;break}else a=n}}n=f[i>>2]|0;a=f[j>>2]|0;if((n-a|0)>0){u=0;v=a;w=n}else return;while(1){n=f[v+(u<<2)>>2]|0;b[n+84>>0]=0;a=n+68|0;c=n+72|0;n=f[c>>2]|0;k=f[a>>2]|0;g=n-k>>2;l=k;k=n;if(h>>>0<=g>>>0)if(h>>>0<g>>>0?(n=l+(h<<2)|0,(n|0)!=(k|0)):0){f[c>>2]=k+(~((k+-4-n|0)>>>2)<<2);x=v;y=w}else{x=v;y=w}else{Ch(a,h-g|0,6220);x=f[j>>2]|0;y=f[i>>2]|0}u=u+1|0;if((u|0)>=(y-x>>2|0))break;else{v=x;w=y}}return}function Zf(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;d=b;e=c-d>>2;g=a+8|0;h=f[g>>2]|0;i=f[a>>2]|0;j=i;if(e>>>0<=h-i>>2>>>0){k=a+4|0;l=(f[k>>2]|0)-i>>2;m=e>>>0>l>>>0;n=b+(l<<2)|0;l=m?n:c;o=l;p=o-d|0;q=p>>2;if(q|0)im(i|0,b|0,p|0)|0;p=j+(q<<2)|0;if(!m){m=f[k>>2]|0;if((m|0)==(p|0))return;f[k>>2]=m+(~((m+-4-p|0)>>>2)<<2);return}if((l|0)==(c|0))return;l=f[k>>2]|0;p=((c+-4-o|0)>>>2)+1|0;o=n;n=l;while(1){f[n>>2]=f[o>>2];o=o+4|0;if((o|0)==(c|0))break;else n=n+4|0}f[k>>2]=l+(p<<2);return}p=i;if(!i)r=h;else{h=a+4|0;l=f[h>>2]|0;if((l|0)!=(j|0))f[h>>2]=l+(~((l+-4-i|0)>>>2)<<2);Oq(p);f[g>>2]=0;f[h>>2]=0;f[a>>2]=0;r=0}if(e>>>0>1073741823)aq(a);h=r>>1;p=r>>2>>>0<536870911?(h>>>0<e>>>0?e:h):1073741823;if(p>>>0>1073741823)aq(a);h=ln(p<<2)|0;e=a+4|0;f[e>>2]=h;f[a>>2]=h;f[g>>2]=h+(p<<2);if((b|0)==(c|0))return;p=((c+-4-d|0)>>>2)+1|0;d=b;b=h;while(1){f[b>>2]=f[d>>2];d=d+4|0;if((d|0)==(c|0))break;else b=b+4|0}f[e>>2]=h+(p<<2);return}function _f(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;d=u;u=u+32|0;e=d;g=a+40|0;h=(f[c>>2]|0)+(f[g>>2]|0)|0;i=a+24|0;j=f[a+32>>2]|0;k=j+-16384|0;do if(k>>>0>=64){if(k>>>0<16384){l=a+28|0;m=(f[i>>2]|0)+(f[l>>2]|0)|0;b[m>>0]=j;b[m+1>>0]=j>>>8;n=(f[l>>2]|0)+2|0;break}if(k>>>0<4194304){l=a+28|0;m=(f[i>>2]|0)+(f[l>>2]|0)|0;o=j+8372224|0;b[m>>0]=o;b[m+1>>0]=o>>>8;b[m+2>>0]=o>>>16;n=(f[l>>2]|0)+3|0;break}if(k>>>0<1073741824){l=a+28|0;o=(f[i>>2]|0)+(f[l>>2]|0)|0;m=j+-1073758208|0;b[o>>0]=m;b[o+1>>0]=m>>>8;b[o+2>>0]=m>>>16;b[o+3>>0]=m>>>24;n=(f[l>>2]|0)+4|0;break}else{n=f[a+28>>2]|0;break}}else{l=a+28|0;b[(f[i>>2]|0)+(f[l>>2]|0)>>0]=k;n=(f[l>>2]|0)+1|0}while(0);k=((n|0)<0)<<31>>31;Gn(e);yh(n,k,e)|0;i=e+4|0;a=(f[i>>2]|0)-(f[e>>2]|0)|0;im(h+a|0,h|0,n|0)|0;kh(h|0,f[e>>2]|0,a|0)|0;h=g;g=f[h>>2]|0;j=f[h+4>>2]|0;h=Vn(a|0,0,n|0,k|0)|0;k=Vn(h|0,I|0,g|0,j|0)|0;Cl(c,k,I);k=e+12|0;c=f[k>>2]|0;f[k>>2]=0;if(c|0)Oq(c);c=f[e>>2]|0;if(!c){u=d;return}if((f[i>>2]|0)!=(c|0))f[i>>2]=c;Oq(c);u=d;return}function $f(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;d=b;e=c-d>>2;g=a+8|0;h=f[g>>2]|0;i=f[a>>2]|0;j=i;if(e>>>0<=h-i>>2>>>0){k=a+4|0;l=(f[k>>2]|0)-i>>2;m=e>>>0>l>>>0;n=b+(l<<2)|0;l=m?n:c;o=l;p=o-d|0;q=p>>2;if(q|0)im(i|0,b|0,p|0)|0;p=j+(q<<2)|0;if(!m){m=f[k>>2]|0;if((m|0)==(p|0))return;f[k>>2]=m+(~((m+-4-p|0)>>>2)<<2);return}if((l|0)==(c|0))return;l=f[k>>2]|0;p=c+-4-o|0;o=n;n=l;while(1){f[n>>2]=f[o>>2];o=o+4|0;if((o|0)==(c|0))break;else n=n+4|0}f[k>>2]=l+((p>>>2)+1<<2);return}p=i;if(!i)r=h;else{h=a+4|0;l=f[h>>2]|0;if((l|0)!=(j|0))f[h>>2]=l+(~((l+-4-i|0)>>>2)<<2);Oq(p);f[g>>2]=0;f[h>>2]=0;f[a>>2]=0;r=0}if(e>>>0>1073741823)aq(a);h=r>>1;p=r>>2>>>0<536870911?(h>>>0<e>>>0?e:h):1073741823;if(p>>>0>1073741823)aq(a);h=ln(p<<2)|0;e=a+4|0;f[e>>2]=h;f[a>>2]=h;f[g>>2]=h+(p<<2);if((b|0)==(c|0))return;p=c+-4-d|0;d=b;b=h;while(1){f[b>>2]=f[d>>2];d=d+4|0;if((d|0)==(c|0))break;else b=b+4|0}f[e>>2]=h+((p>>>2)+1<<2);return}function ag(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0,j=0,k=0;g=u;u=u+80|0;h=g;i=g+64|0;Il(h);j=f[(f[a+8>>2]|0)+56>>2]|0;k=X(Vl(5)|0,d)|0;Jj(h,j,0,d&255,5,0,k,((k|0)<0)<<31>>31,0,0);k=ln(96)|0;tl(k,h);Bj(k,c)|0;f[i>>2]=k;gj(a,i);k=f[i>>2]|0;f[i>>2]=0;if(k|0){i=k+88|0;c=f[i>>2]|0;f[i>>2]=0;if(c|0){i=f[c+8>>2]|0;if(i|0){h=c+12|0;if((f[h>>2]|0)!=(i|0))f[h>>2]=i;Oq(i)}Oq(c)}c=f[k+68>>2]|0;if(c|0){i=k+72|0;h=f[i>>2]|0;if((h|0)!=(c|0))f[i>>2]=h+(~((h+-4-c|0)>>>2)<<2);Oq(c)}c=k+64|0;h=f[c>>2]|0;f[c>>2]=0;if(h|0){c=f[h>>2]|0;if(c|0){i=h+4|0;if((f[i>>2]|0)!=(c|0))f[i>>2]=c;Oq(c)}Oq(h)}Oq(k)}if(!e){u=g;return}k=f[a+32>>2]|0;b[k+84>>0]=0;a=k+68|0;h=k+72|0;k=f[h>>2]|0;c=f[a>>2]|0;i=k-c>>2;d=k;if(i>>>0<e>>>0){Ch(a,e-i|0,1532);u=g;return}if(i>>>0<=e>>>0){u=g;return}i=c+(e<<2)|0;if((i|0)==(d|0)){u=g;return}f[h>>2]=d+(~((d+-4-i|0)>>>2)<<2);u=g;return}function bg(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0;c=u;u=u+16|0;d=c+4|0;e=c;g=a+4|0;h=f[g>>2]|0;i=a+8|0;j=f[i>>2]|0;if((j|0)==(h|0))k=h;else{l=j+(~((j+-4-h|0)>>>2)<<2)|0;f[i>>2]=l;k=l}l=a+16|0;h=f[l>>2]|0;j=a+20|0;m=f[j>>2]|0;n=h;if((m|0)!=(h|0))f[j>>2]=m+(~((m+-4-n|0)>>>2)<<2);m=f[b>>2]|0;h=f[b+4>>2]|0;if((m|0)==(h|0)){u=c;return}b=a+12|0;a=m;m=k;k=n;while(1){n=f[a>>2]|0;f[d>>2]=n;if((m|0)==(f[b>>2]|0)){Ri(g,d);o=f[l>>2]|0}else{f[m>>2]=n;f[i>>2]=m+4;o=k}n=f[d>>2]|0;p=f[j>>2]|0;q=p-o>>2;r=o;if((n|0)<(q|0)){s=r;t=n;v=o}else{w=n+1|0;f[e>>2]=-1;x=p;if(w>>>0<=q>>>0)if(w>>>0<q>>>0?(p=r+(w<<2)|0,(p|0)!=(x|0)):0){f[j>>2]=x+(~((x+-4-p|0)>>>2)<<2);y=n;z=r;A=o}else{y=n;z=r;A=o}else{Ch(l,w-q|0,e);q=f[l>>2]|0;y=f[d>>2]|0;z=q;A=q}s=z;t=y;v=A}m=f[i>>2]|0;f[s+(t<<2)>>2]=(m-(f[g>>2]|0)>>2)+-1;a=a+4|0;if((a|0)==(h|0))break;else k=v}u=c;return}function cg(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;c=u;u=u+16|0;d=c;e=a+76|0;g=f[e>>2]|0;h=a+80|0;i=f[h>>2]|0;if((i|0)!=(g|0))f[h>>2]=i+(~((i+-4-g|0)>>>2)<<2);f[e>>2]=0;f[h>>2]=0;f[a+84>>2]=0;if(g|0)Oq(g);g=a+64|0;h=f[g>>2]|0;e=a+68|0;if((f[e>>2]|0)!=(h|0))f[e>>2]=h;f[g>>2]=0;f[e>>2]=0;f[a+72>>2]=0;if(h|0)Oq(h);h=b+4|0;e=f[h>>2]|0;g=f[b>>2]|0;i=((e-g|0)/12|0)*3|0;j=a+4|0;k=f[j>>2]|0;l=f[a>>2]|0;m=k-l>>2;n=l;l=k;k=g;if(i>>>0<=m>>>0)if(i>>>0<m>>>0?(o=n+(i<<2)|0,(o|0)!=(l|0)):0){f[j>>2]=l+(~((l+-4-o|0)>>>2)<<2);p=e;q=g;r=k}else{p=e;q=g;r=k}else{Ci(a,i-m|0);m=f[b>>2]|0;p=f[h>>2]|0;q=m;r=m}if((p|0)!=(q|0)){q=f[a>>2]|0;m=(p-r|0)/12|0;p=0;do{h=p*3|0;f[q+(h<<2)>>2]=f[r+(p*12|0)>>2];f[q+(h+1<<2)>>2]=f[r+(p*12|0)+4>>2];f[q+(h+2<<2)>>2]=f[r+(p*12|0)+8>>2];p=p+1|0}while(p>>>0<m>>>0)}f[d>>2]=-1;if(!(rc(a,d)|0)){s=0;u=c;return s|0}eb(a,f[d>>2]|0)|0;s=1;u=c;return s|0}function dg(a,b){a=a|0;b=b|0;var c=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;c=d[b>>1]|0;e=d[b+2>>1]|0;g=d[b+4>>1]|0;b=(((c^318)&65535)+239^e&65535)+239^g&65535;h=f[a+4>>2]|0;if(!h){i=0;return i|0}j=h+-1|0;k=(j&h|0)==0;if(!k)if(b>>>0<h>>>0)l=b;else l=(b>>>0)%(h>>>0)|0;else l=b&j;m=f[(f[a>>2]|0)+(l<<2)>>2]|0;if(!m){i=0;return i|0}a=f[m>>2]|0;if(!a){i=0;return i|0}if(k){k=a;while(1){m=f[k+4>>2]|0;n=(m|0)==(b|0);if(!(n|(m&j|0)==(l|0))){i=0;o=23;break}if(((n?(n=k+8|0,(d[n>>1]|0)==c<<16>>16):0)?(d[n+2>>1]|0)==e<<16>>16:0)?(d[k+12>>1]|0)==g<<16>>16:0){i=k;o=23;break}k=f[k>>2]|0;if(!k){i=0;o=23;break}}if((o|0)==23)return i|0}else p=a;while(1){a=f[p+4>>2]|0;if((a|0)==(b|0)){k=p+8|0;if(((d[k>>1]|0)==c<<16>>16?(d[k+2>>1]|0)==e<<16>>16:0)?(d[p+12>>1]|0)==g<<16>>16:0){i=p;o=23;break}}else{if(a>>>0<h>>>0)q=a;else q=(a>>>0)%(h>>>0)|0;if((q|0)!=(l|0)){i=0;o=23;break}}p=f[p>>2]|0;if(!p){i=0;o=23;break}}if((o|0)==23)return i|0;return 0}function eg(a){a=a|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;c=u;u=u+32|0;d=c;e=a+16|0;g=e;h=f[g>>2]|0;i=f[g+4>>2]|0;if(!((i|0)>0|(i|0)==0&h>>>0>0)){u=c;return}g=Vn(f[(f[a+12>>2]|0)+4>>2]|0,0,7,0)|0;j=Yn(g|0,I|0,3)|0;g=I;if(!(b[a+24>>0]|0)){k=a+4|0;l=k;m=k;n=h;o=i}else{k=f[a>>2]|0;p=a+4|0;q=k+((f[p>>2]|0)-k)|0;k=Vn(h|0,i|0,8,0)|0;i=q+(0-k)|0;f[d>>2]=0;f[d+4>>2]=0;f[d+8>>2]=0;f[d+12>>2]=0;f[d+16>>2]=0;f[d+20>>2]=0;b[d+24>>0]=0;yh(j,g,d)|0;k=d+4|0;q=(f[k>>2]|0)-(f[d>>2]|0)|0;im(i+q|0,i+8|0,j|0)|0;kh(i|0,f[d>>2]|0,q|0)|0;i=e;h=Vn(f[i>>2]|0,f[i+4>>2]|0,8-q|0,0)|0;q=e;f[q>>2]=h;f[q+4>>2]=I;q=d+12|0;h=f[q>>2]|0;f[q>>2]=0;if(h|0)Oq(h);h=f[d>>2]|0;if(h|0){if((f[k>>2]|0)!=(h|0))f[k>>2]=h;Oq(h)}h=e;l=p;m=p;n=f[h>>2]|0;o=f[h+4>>2]|0}h=f[l>>2]|0;l=f[a>>2]|0;p=h-l|0;k=Xn(j|0,g|0,n|0,o|0)|0;o=Vn(k|0,I|0,p|0,0)|0;k=l;l=h;if(p>>>0>=o>>>0){if(p>>>0>o>>>0?(h=k+o|0,(h|0)!=(l|0)):0)f[m>>2]=h}else Fi(a,o-p|0);p=e;f[p>>2]=0;f[p+4>>2]=0;u=c;return}function fg(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;f[a+4>>2]=f[b+4>>2];c=a+8|0;d=b+8|0;if((a|0)==(b|0))return a|0;e=b+12|0;g=f[e>>2]|0;if(!g)h=0;else{i=a+16|0;do if(g>>>0>f[i>>2]<<5>>>0){j=f[c>>2]|0;if(!j)k=g;else{Oq(j);f[c>>2]=0;f[i>>2]=0;f[a+12>>2]=0;k=f[e>>2]|0}if((k|0)<0)aq(c);else{j=((k+-1|0)>>>5)+1|0;l=ln(j<<2)|0;f[c>>2]=l;f[a+12>>2]=0;f[i>>2]=j;m=f[e>>2]|0;n=l;break}}else{m=g;n=f[c>>2]|0}while(0);im(n|0,f[d>>2]|0,((m+-1|0)>>>5<<2)+4|0)|0;h=f[e>>2]|0}f[a+12>>2]=h;h=a+20|0;e=b+20|0;m=b+24|0;b=f[m>>2]|0;if(!b)o=0;else{d=a+28|0;do if(b>>>0>f[d>>2]<<5>>>0){n=f[h>>2]|0;if(!n)p=b;else{Oq(n);f[h>>2]=0;f[d>>2]=0;f[a+24>>2]=0;p=f[m>>2]|0}if((p|0)<0)aq(h);else{n=((p+-1|0)>>>5)+1|0;c=ln(n<<2)|0;f[h>>2]=c;f[a+24>>2]=0;f[d>>2]=n;q=f[m>>2]|0;r=c;break}}else{q=b;r=f[h>>2]|0}while(0);im(r|0,f[e>>2]|0,((q+-1|0)>>>5<<2)+4|0)|0;o=f[m>>2]|0}f[a+24>>2]=o;return a|0}function gg(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;f[c>>2]=1;d=a+4|0;e=c+8|0;g=c+12|0;c=f[e>>2]|0;i=(f[g>>2]|0)-c|0;if(i>>>0<4294967292){Lk(e,i+4|0,0);j=f[e>>2]|0}else j=c;c=j+i|0;i=h[d>>0]|h[d+1>>0]<<8|h[d+2>>0]<<16|h[d+3>>0]<<24;b[c>>0]=i;b[c+1>>0]=i>>8;b[c+2>>0]=i>>16;b[c+3>>0]=i>>24;i=a+8|0;c=a+12|0;d=f[i>>2]|0;if((f[c>>2]|0)!=(d|0)){j=0;k=d;do{d=k+(j<<2)|0;l=f[e>>2]|0;m=(f[g>>2]|0)-l|0;if(m>>>0<4294967292){Lk(e,m+4|0,0);n=f[e>>2]|0}else n=l;l=n+m|0;m=h[d>>0]|h[d+1>>0]<<8|h[d+2>>0]<<16|h[d+3>>0]<<24;b[l>>0]=m;b[l+1>>0]=m>>8;b[l+2>>0]=m>>16;b[l+3>>0]=m>>24;j=j+1|0;k=f[i>>2]|0}while(j>>>0<(f[c>>2]|0)-k>>2>>>0)}k=a+20|0;a=f[e>>2]|0;c=(f[g>>2]|0)-a|0;if(c>>>0<4294967292){Lk(e,c+4|0,0);o=f[e>>2]|0;p=o+c|0;q=h[k>>0]|h[k+1>>0]<<8|h[k+2>>0]<<16|h[k+3>>0]<<24;b[p>>0]=q;b[p+1>>0]=q>>8;b[p+2>>0]=q>>16;b[p+3>>0]=q>>24;return}else{o=a;p=o+c|0;q=h[k>>0]|h[k+1>>0]<<8|h[k+2>>0]<<16|h[k+3>>0]<<24;b[p>>0]=q;b[p+1>>0]=q>>8;b[p+2>>0]=q>>16;b[p+3>>0]=q>>24;return}}function hg(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;d=a+8|0;e=f[d>>2]|0;g=f[a>>2]|0;h=g;do if(e-g>>2>>>0>=b>>>0){i=a+4|0;j=f[i>>2]|0;k=j-g>>2;l=k>>>0<b>>>0;m=l?k:b;n=j;if(m|0){j=m;m=h;while(1){f[m>>2]=f[c>>2];j=j+-1|0;if(!j)break;else m=m+4|0}}if(!l){m=h+(b<<2)|0;if((m|0)==(n|0))return;else{o=i;p=n+(~((n+-4-m|0)>>>2)<<2)|0;break}}else{m=b-k|0;j=m;q=n;while(1){f[q>>2]=f[c>>2];j=j+-1|0;if(!j)break;else q=q+4|0}o=i;p=n+(m<<2)|0;break}}else{q=g;if(!g)r=e;else{j=a+4|0;k=f[j>>2]|0;if((k|0)!=(h|0))f[j>>2]=k+(~((k+-4-g|0)>>>2)<<2);Oq(q);f[d>>2]=0;f[j>>2]=0;f[a>>2]=0;r=0}if(b>>>0>1073741823)aq(a);j=r>>1;q=r>>2>>>0<536870911?(j>>>0<b>>>0?b:j):1073741823;if(q>>>0>1073741823)aq(a);j=ln(q<<2)|0;k=a+4|0;f[k>>2]=j;f[a>>2]=j;f[d>>2]=j+(q<<2);q=b;l=j;while(1){f[l>>2]=f[c>>2];q=q+-1|0;if(!q)break;else l=l+4|0}o=k;p=j+(b<<2)|0}while(0);f[o>>2]=p;return}function ig(a,b,c,d,e,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0;h=jh(a,b,c,d,g)|0;i=f[e>>2]|0;j=f[d>>2]|0;k=f[g>>2]|0;g=f[k>>2]|0;l=(f[k+4>>2]|0)-g>>3;if(l>>>0<=i>>>0)aq(k);m=g;if(l>>>0<=j>>>0)aq(k);if((f[m+(i<<3)>>2]|0)>>>0>=(f[m+(j<<3)>>2]|0)>>>0){n=h;return n|0}f[d>>2]=i;f[e>>2]=j;j=f[d>>2]|0;e=f[c>>2]|0;if(l>>>0<=j>>>0)aq(k);if(l>>>0<=e>>>0)aq(k);if((f[m+(j<<3)>>2]|0)>>>0>=(f[m+(e<<3)>>2]|0)>>>0){n=h+1|0;return n|0}f[c>>2]=j;f[d>>2]=e;e=f[c>>2]|0;d=f[b>>2]|0;if(l>>>0<=e>>>0)aq(k);if(l>>>0<=d>>>0)aq(k);if((f[m+(e<<3)>>2]|0)>>>0>=(f[m+(d<<3)>>2]|0)>>>0){n=h+2|0;return n|0}f[b>>2]=e;f[c>>2]=d;d=f[b>>2]|0;c=f[a>>2]|0;if(l>>>0<=d>>>0)aq(k);if(l>>>0<=c>>>0)aq(k);if((f[m+(d<<3)>>2]|0)>>>0>=(f[m+(c<<3)>>2]|0)>>>0){n=h+3|0;return n|0}f[a>>2]=d;f[b>>2]=c;n=h+4|0;return n|0}function jg(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;d=b[c>>0]|0;e=b[c+1>>0]|0;g=b[c+2>>0]|0;c=((d&255^318)+239^e&255)+239^g&255;h=f[a+4>>2]|0;if(!h){i=0;return i|0}j=h+-1|0;k=(j&h|0)==0;if(!k)if(c>>>0<h>>>0)l=c;else l=(c>>>0)%(h>>>0)|0;else l=c&j;m=f[(f[a>>2]|0)+(l<<2)>>2]|0;if(!m){i=0;return i|0}a=f[m>>2]|0;if(!a){i=0;return i|0}if(k){k=a;while(1){m=f[k+4>>2]|0;n=(m|0)==(c|0);if(!(n|(m&j|0)==(l|0))){i=0;o=23;break}if(((n?(n=k+8|0,(b[n>>0]|0)==d<<24>>24):0)?(b[n+1>>0]|0)==e<<24>>24:0)?(b[n+2>>0]|0)==g<<24>>24:0){i=k;o=23;break}k=f[k>>2]|0;if(!k){i=0;o=23;break}}if((o|0)==23)return i|0}else p=a;while(1){a=f[p+4>>2]|0;if((a|0)==(c|0)){k=p+8|0;if(((b[k>>0]|0)==d<<24>>24?(b[k+1>>0]|0)==e<<24>>24:0)?(b[k+2>>0]|0)==g<<24>>24:0){i=p;o=23;break}}else{if(a>>>0<h>>>0)q=a;else q=(a>>>0)%(h>>>0)|0;if((q|0)!=(l|0)){i=0;o=23;break}}p=f[p>>2]|0;if(!p){i=0;o=23;break}}if((o|0)==23)return i|0;return 0}function kg(a){a=a|0;var b=0,c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;b=u;u=u+16|0;c=b;d=a+36|0;e=a+4|0;g=a+8|0;h=(f[g>>2]|0)-(f[e>>2]|0)>>2;i=a+40|0;j=f[i>>2]|0;k=f[d>>2]|0;l=j-k>>2;m=k;k=j;if(h>>>0<=l>>>0){if(h>>>0<l>>>0?(j=m+(h<<2)|0,(j|0)!=(k|0)):0){m=k;do{k=m+-4|0;f[i>>2]=k;n=f[k>>2]|0;f[k>>2]=0;if(n|0)Va[f[(f[n>>2]|0)+4>>2]&127](n);m=f[i>>2]|0}while((m|0)!=(j|0))}}else Eg(d,h-l|0);if((f[g>>2]|0)==(f[e>>2]|0)){o=1;u=b;return o|0}l=a+52|0;h=a+48|0;j=0;while(1){Xa[f[(f[a>>2]|0)+56>>2]&15](c,a,j);m=(f[d>>2]|0)+(j<<2)|0;i=f[c>>2]|0;f[c>>2]=0;n=f[m>>2]|0;f[m>>2]=i;if(n|0)Va[f[(f[n>>2]|0)+4>>2]&127](n);n=f[c>>2]|0;f[c>>2]=0;if(n|0)Va[f[(f[n>>2]|0)+4>>2]&127](n);n=f[(f[d>>2]|0)+(j<<2)>>2]|0;if(!n){o=0;p=19;break}if(j>>>0<(f[l>>2]|0)>>>0?f[(f[h>>2]|0)+(j>>>5<<2)>>2]&1<<(j&31)|0:0)Bp(n);j=j+1|0;if(j>>>0>=(f[g>>2]|0)-(f[e>>2]|0)>>2>>>0){o=1;p=19;break}}if((p|0)==19){u=b;return o|0}return 0}function lg(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;d=u;u=u+16|0;e=d+4|0;g=d;ci(f[c+12>>2]|0,b)|0;h=f[c+8>>2]|0;a:do if(h|0){i=b+16|0;j=b+4|0;k=h;while(1){l=k;if(!(Bf(0,b,l+8|0)|0)){m=0;break}n=l+20|0;o=(f[l+24>>2]|0)-(f[n>>2]|0)|0;ci(o,b)|0;l=f[n>>2]|0;n=i;p=f[n+4>>2]|0;if(!((p|0)>0|(p|0)==0&(f[n>>2]|0)>>>0>0)){f[g>>2]=f[j>>2];f[e>>2]=f[g>>2];Me(b,e,l,l+o|0)|0}k=f[k>>2]|0;if(!k)break a}u=d;return m|0}while(0);ci(f[c+32>>2]|0,b)|0;e=f[c+28>>2]|0;if(!e){m=1;u=d;return m|0}else q=e;while(1){e=q;if(!(Bf(0,b,e+8|0)|0)){m=0;r=10;break}lg(a,b,f[e+20>>2]|0)|0;q=f[q>>2]|0;if(!q){m=1;r=10;break}}if((r|0)==10){u=d;return m|0}return 0}function mg(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;c=u;u=u+16|0;d=c+8|0;e=c+4|0;g=c;h=a+8|0;i=a+12|0;j=f[h>>2]|0;if((f[i>>2]|0)==(j|0)){k=ln(76)|0;vn(k,b);l=k;f[g>>2]=l;k=f[i>>2]|0;if(k>>>0<(f[a+16>>2]|0)>>>0){f[g>>2]=0;f[k>>2]=l;f[i>>2]=k+4;m=g}else{Qg(h,g);m=g}g=f[m>>2]|0;f[m>>2]=0;if(!g){u=c;return 1}Va[f[(f[g>>2]|0)+4>>2]&127](g);u=c;return 1}g=f[j>>2]|0;f[d>>2]=b;j=g+4|0;m=g+8|0;h=f[m>>2]|0;if((h|0)==(f[g+12>>2]|0))Ri(j,d);else{f[h>>2]=b;f[m>>2]=h+4}h=f[d>>2]|0;b=g+16|0;k=g+20|0;g=f[k>>2]|0;i=f[b>>2]|0;l=g-i>>2;a=i;if((h|0)<(l|0)){n=a;o=h}else{i=h+1|0;f[e>>2]=-1;p=g;if(i>>>0<=l>>>0)if(i>>>0<l>>>0?(g=a+(i<<2)|0,(g|0)!=(p|0)):0){f[k>>2]=p+(~((p+-4-g|0)>>>2)<<2);q=h;r=a}else{q=h;r=a}else{Ch(b,i-l|0,e);q=f[d>>2]|0;r=f[b>>2]|0}n=r;o=q}f[n+(o<<2)>>2]=((f[m>>2]|0)-(f[j>>2]|0)>>2)+-1;u=c;return 1}function ng(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;d=c;e=b;g=d-e|0;h=g>>2;i=a+8|0;j=f[i>>2]|0;k=f[a>>2]|0;l=k;if(h>>>0>j-k>>2>>>0){m=k;if(!k)n=j;else{j=a+4|0;o=f[j>>2]|0;if((o|0)!=(l|0))f[j>>2]=o+(~((o+-4-k|0)>>>2)<<2);Oq(m);f[i>>2]=0;f[j>>2]=0;f[a>>2]=0;n=0}if(h>>>0>1073741823)aq(a);j=n>>1;m=n>>2>>>0<536870911?(j>>>0<h>>>0?h:j):1073741823;if(m>>>0>1073741823)aq(a);j=ln(m<<2)|0;n=a+4|0;f[n>>2]=j;f[a>>2]=j;f[i>>2]=j+(m<<2);if((g|0)<=0)return;kh(j|0,b|0,g|0)|0;f[n>>2]=j+(g>>>2<<2);return}g=a+4|0;a=f[g>>2]|0;j=a-k>>2;k=h>>>0>j>>>0;h=k?b+(j<<2)|0:c;c=a;j=a;if((h|0)==(b|0))p=l;else{a=h+-4-e|0;e=b;b=l;while(1){f[b>>2]=f[e>>2];e=e+4|0;if((e|0)==(h|0))break;else b=b+4|0}p=l+((a>>>2)+1<<2)|0}if(k){k=d-h|0;if((k|0)<=0)return;kh(j|0,h|0,k|0)|0;f[g>>2]=(f[g>>2]|0)+(k>>>2<<2);return}else{if((p|0)==(c|0))return;f[g>>2]=c+(~((c+-4-p|0)>>>2)<<2);return}}function og(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;d=f[a+8>>2]|0;e=a+76|0;g=f[e>>2]|0;h=f[g+80>>2]|0;b[c+84>>0]=0;i=c+68|0;j=c+72|0;k=f[j>>2]|0;l=f[i>>2]|0;m=k-l>>2;n=l;l=k;if(h>>>0<=m>>>0)if(h>>>0<m>>>0?(k=n+(h<<2)|0,(k|0)!=(l|0)):0){f[j>>2]=l+(~((l+-4-k|0)>>>2)<<2);o=g;p=h}else{o=g;p=h}else{Ch(i,h-m|0,3600);m=f[e>>2]|0;o=m;p=f[m+80>>2]|0}m=(f[o+100>>2]|0)-(f[o+96>>2]|0)|0;e=(m|0)/12|0;if(!m){q=1;return q|0}m=c+68|0;c=f[o+96>>2]|0;o=f[d+28>>2]|0;d=f[(f[a+80>>2]|0)+12>>2]|0;a=0;while(1){h=a*3|0;i=f[d+(f[o+(h<<2)>>2]<<2)>>2]|0;if(i>>>0>=p>>>0){q=0;r=10;break}g=f[m>>2]|0;f[g+(f[c+(a*12|0)>>2]<<2)>>2]=i;i=f[d+(f[o+(h+1<<2)>>2]<<2)>>2]|0;if(i>>>0>=p>>>0){q=0;r=10;break}f[g+(f[c+(a*12|0)+4>>2]<<2)>>2]=i;i=f[d+(f[o+(h+2<<2)>>2]<<2)>>2]|0;if(i>>>0>=p>>>0){q=0;r=10;break}f[g+(f[c+(a*12|0)+8>>2]<<2)>>2]=i;a=a+1|0;if(a>>>0>=e>>>0){q=1;r=10;break}}if((r|0)==10)return q|0;return 0}function pg(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;e=u;u=u+16|0;g=e;if(!(xh(a,c,d)|0)){h=0;u=e;return h|0}if((b[(f[a+8>>2]|0)+24>>0]|0)!=3){h=0;u=e;return h|0}i=f[c+48>>2]|0;c=ln(32)|0;f[g>>2]=c;f[g+8>>2]=-2147483616;f[g+4>>2]=17;j=c;k=14495;l=j+17|0;do{b[j>>0]=b[k>>0]|0;j=j+1|0;k=k+1|0}while((j|0)<(l|0));b[c+17>>0]=0;c=i+16|0;k=f[c>>2]|0;if(k){j=c;l=k;a:while(1){k=l;while(1){if((f[k+16>>2]|0)>=(d|0))break;m=f[k+4>>2]|0;if(!m){n=j;break a}else k=m}l=f[k>>2]|0;if(!l){n=k;break}else j=k}if(((n|0)!=(c|0)?(f[n+16>>2]|0)<=(d|0):0)?(d=n+20|0,(Jh(d,g)|0)!=0):0)o=Hk(d,g,-1)|0;else p=12}else p=12;if((p|0)==12)o=Hk(i,g,-1)|0;if((b[g+11>>0]|0)<0)Oq(f[g>>2]|0);if((o|0)<1){h=0;u=e;return h|0}ip(a+40|0,o);h=1;u=e;return h|0}function qg(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;c=f[b>>2]|0;d=f[b+4>>2]|0;e=f[b+8>>2]|0;b=((c^318)+239^d)+239^e;g=f[a+4>>2]|0;if(!g){h=0;return h|0}i=g+-1|0;j=(i&g|0)==0;if(!j)if(b>>>0<g>>>0)k=b;else k=(b>>>0)%(g>>>0)|0;else k=b&i;l=f[(f[a>>2]|0)+(k<<2)>>2]|0;if(!l){h=0;return h|0}a=f[l>>2]|0;if(!a){h=0;return h|0}if(j){j=a;while(1){l=f[j+4>>2]|0;m=(l|0)==(b|0);if(!(m|(l&i|0)==(k|0))){h=0;n=23;break}if(((m?(f[j+8>>2]|0)==(c|0):0)?(f[j+12>>2]|0)==(d|0):0)?(f[j+16>>2]|0)==(e|0):0){h=j;n=23;break}j=f[j>>2]|0;if(!j){h=0;n=23;break}}if((n|0)==23)return h|0}else o=a;while(1){a=f[o+4>>2]|0;if((a|0)==(b|0)){if(((f[o+8>>2]|0)==(c|0)?(f[o+12>>2]|0)==(d|0):0)?(f[o+16>>2]|0)==(e|0):0){h=o;n=23;break}}else{if(a>>>0<g>>>0)p=a;else p=(a>>>0)%(g>>>0)|0;if((p|0)!=(k|0)){h=0;n=23;break}}o=f[o>>2]|0;if(!o){h=0;n=23;break}}if((n|0)==23)return h|0;return 0}function rg(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;e=c;g=d-e|0;h=a+8|0;i=f[h>>2]|0;j=f[a>>2]|0;k=j;if(g>>>0>(i-j|0)>>>0){if(!j)l=i;else{i=a+4|0;if((f[i>>2]|0)!=(k|0))f[i>>2]=k;Oq(k);f[h>>2]=0;f[i>>2]=0;f[a>>2]=0;l=0}if((g|0)<0)aq(a);i=l<<1;m=l>>>0<1073741823?(i>>>0<g>>>0?g:i):2147483647;if((m|0)<0)aq(a);i=ln(m)|0;l=a+4|0;f[l>>2]=i;f[a>>2]=i;f[h>>2]=i+m;if((c|0)==(d|0))return;else{n=c;o=i}do{b[o>>0]=b[n>>0]|0;n=n+1|0;o=(f[l>>2]|0)+1|0;f[l>>2]=o}while((n|0)!=(d|0));return}n=a+4|0;a=(f[n>>2]|0)-j|0;j=g>>>0>a>>>0;g=c+a|0;a=j?g:d;if((a|0)==(c|0))p=k;else{o=c;c=k;while(1){b[c>>0]=b[o>>0]|0;o=o+1|0;if((o|0)==(a|0))break;else c=c+1|0}p=k+(a-e)|0}if(!j){if((f[n>>2]|0)==(p|0))return;f[n>>2]=p;return}if((a|0)==(d|0))return;a=g;g=f[n>>2]|0;do{b[g>>0]=b[a>>0]|0;a=a+1|0;g=(f[n>>2]|0)+1|0;f[n>>2]=g}while((a|0)!=(d|0));return}function sg(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;d=c>>>1&1431655765|c<<1&-1431655766;c=d>>>2&858993459|d<<2&-858993460;d=c>>>4&252645135|c<<4&-252645136;c=d>>>8&16711935|d<<8&-16711936;d=32-b|0;e=(c>>>16|c<<16)>>>d;c=e-(e>>>1&1431655765)|0;g=(c>>>2&858993459)+(c&858993459)|0;c=(X((g>>>4)+g&252645135,16843009)|0)>>>24;g=b-c|0;h=f[a>>2]|0;i=h;j=Vn(f[i>>2]|0,f[i+4>>2]|0,g|0,((g|0)<0)<<31>>31|0)|0;g=h;f[g>>2]=j;f[g+4>>2]=I;g=h+8|0;h=g;j=Vn(f[h>>2]|0,f[h+4>>2]|0,c|0,0)|0;c=g;f[c>>2]=j;f[c+4>>2]=I;c=a+28|0;j=f[c>>2]|0;g=32-j|0;h=a+24|0;do if((g|0)>=(b|0)){i=-1>>>d<<j;k=f[h>>2]&~i|i&e<<j;f[h>>2]=k;i=j+b|0;f[c>>2]=i;if((i|0)!=32)return;i=a+16|0;l=f[i>>2]|0;if((l|0)==(f[a+20>>2]|0)){Ri(a+12|0,h);m=0;n=0;break}else{f[l>>2]=k;f[i>>2]=l+4;m=0;n=0;break}}else{l=-1>>>j<<j;i=f[h>>2]&~l|l&e<<j;f[h>>2]=i;l=a+16|0;k=f[l>>2]|0;if((k|0)==(f[a+20>>2]|0))Ri(a+12|0,h);else{f[k>>2]=i;f[l>>2]=k+4}k=b-g|0;m=k;n=-1>>>(32-k|0)&e>>>g}while(0);f[h>>2]=n;f[c>>2]=m;return}function tg(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0;e=c&255;g=(d|0)!=0;a:do if(g&(a&3|0)!=0){h=c&255;i=a;j=d;while(1){if((b[i>>0]|0)==h<<24>>24){k=i;l=j;m=6;break a}n=i+1|0;o=j+-1|0;p=(o|0)!=0;if(p&(n&3|0)!=0){i=n;j=o}else{q=n;r=o;s=p;m=5;break}}}else{q=a;r=d;s=g;m=5}while(0);if((m|0)==5)if(s){k=q;l=r;m=6}else{t=q;u=0}b:do if((m|0)==6){q=c&255;if((b[k>>0]|0)==q<<24>>24){t=k;u=l}else{r=X(e,16843009)|0;c:do if(l>>>0>3){s=k;g=l;while(1){d=f[s>>2]^r;if((d&-2139062144^-2139062144)&d+-16843009|0)break;d=s+4|0;a=g+-4|0;if(a>>>0>3){s=d;g=a}else{v=d;w=a;m=11;break c}}x=s;y=g}else{v=k;w=l;m=11}while(0);if((m|0)==11)if(!w){t=v;u=0;break}else{x=v;y=w}while(1){if((b[x>>0]|0)==q<<24>>24){t=x;u=y;break b}r=x+1|0;y=y+-1|0;if(!y){t=r;u=0;break}else x=r}}}while(0);return (u|0?t:0)|0}function ug(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;c=a+4|0;d=f[c>>2]|0;e=f[a>>2]|0;g=e;do if((d|0)==(e|0)){h=a+8|0;i=f[h>>2]|0;j=a+12|0;k=f[j>>2]|0;l=k;if(i>>>0<k>>>0){k=i;m=((l-k>>2)+1|0)/2|0;n=i+(m<<2)|0;o=k-d|0;k=o>>2;p=n+(0-k<<2)|0;if(!k){q=n;r=i}else{im(p|0,d|0,o|0)|0;q=p;r=f[h>>2]|0}f[c>>2]=q;f[h>>2]=r+(m<<2);s=q;break}m=l-g>>1;l=(m|0)==0?1:m;if(l>>>0>1073741823){m=ra(8)|0;Oo(m,16035);f[m>>2]=7256;va(m|0,1112,110)}m=ln(l<<2)|0;p=m;o=m+((l+3|0)>>>2<<2)|0;n=o;k=m+(l<<2)|0;if((d|0)==(i|0)){t=n;u=d}else{l=o;m=n;v=d;do{f[l>>2]=f[v>>2];l=m+4|0;m=l;v=v+4|0}while((v|0)!=(i|0));t=m;u=f[a>>2]|0}f[a>>2]=p;f[c>>2]=n;f[h>>2]=t;f[j>>2]=k;if(!u)s=o;else{Oq(u);s=f[c>>2]|0}}else s=d;while(0);f[s+-4>>2]=f[b>>2];f[c>>2]=(f[c>>2]|0)+-4;return}function vg(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;d=u;u=u+16|0;e=d+4|0;g=d;h=d+8|0;i=a+4|0;if((f[i>>2]|0)==-1){j=0;u=d;return j|0}k=f[a+8>>2]|0;l=c+16|0;m=l;n=f[m>>2]|0;o=f[m+4>>2]|0;if(!((o|0)>0|(o|0)==0&n>>>0>0)){m=(f[a+12>>2]|0)-k|0;p=c+4|0;f[g>>2]=f[p>>2];f[e>>2]=f[g>>2];Me(c,e,k,k+m|0)|0;m=l;k=f[m>>2]|0;q=f[m+4>>2]|0;m=a+20|0;if((q|0)>0|(q|0)==0&k>>>0>0){r=q;s=k;t=g}else{f[g>>2]=f[p>>2];f[e>>2]=f[g>>2];Me(c,e,m,m+4|0)|0;m=l;r=f[m+4>>2]|0;s=f[m>>2]|0;t=g}}else{r=o;s=n;t=g}b[h>>0]=f[i>>2];if(!((r|0)>0|(r|0)==0&s>>>0>0)){f[g>>2]=f[c+4>>2];f[e>>2]=f[g>>2];Me(c,e,h,h+1|0)|0}j=1;u=d;return j|0}function wg(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0;e=u;u=u+16|0;g=e+4|0;h=e;i=a+8|0;a=f[i>>2]|0;j=f[a+40>>2]|0;k=Lq((j|0)>-1?j:-1)|0;l=c+4|0;m=f[l>>2]|0;n=f[c>>2]|0;if((m|0)==(n|0)){Mq(k);u=e;return 1}o=d+16|0;p=d+4|0;q=k+j|0;j=0;r=n;n=a;s=a;a=m;while(1){m=f[r+(j<<2)>>2]|0;if(!(b[n+84>>0]|0))t=f[(f[n+68>>2]|0)+(m<<2)>>2]|0;else t=m;m=s+48|0;v=f[m>>2]|0;w=f[m+4>>2]|0;m=s+40|0;x=f[m>>2]|0;y=un(x|0,f[m+4>>2]|0,t|0,0)|0;m=Vn(y|0,I|0,v|0,w|0)|0;kh(k|0,(f[f[s>>2]>>2]|0)+m|0,x|0)|0;x=o;m=f[x+4>>2]|0;if((m|0)>0|(m|0)==0&(f[x>>2]|0)>>>0>0){z=r;A=a}else{f[h>>2]=f[p>>2];f[g>>2]=f[h>>2];Me(d,g,k,q)|0;z=f[c>>2]|0;A=f[l>>2]|0}x=j+1|0;if(x>>>0>=A-z>>2>>>0)break;m=f[i>>2]|0;j=x;r=z;n=m;s=m;a=A}Mq(k);u=e;return 1}function xg(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0;d=(f[b>>2]|0)*3|0;if((d|0)==-1){e=0;g=-1;f[c>>2]=g;return e|0}b=f[a+12>>2]|0;h=f[b+12>>2]|0;if((f[h+(d<<2)>>2]|0)==-1){e=0;g=d;f[c>>2]=g;return e|0}i=f[b>>2]|0;b=f[a+152>>2]|0;if((f[b+(f[i+(d<<2)>>2]<<2)>>2]|0)==-1){a=d+1|0;j=((a>>>0)%3|0|0)==0?d+-2|0:a;if((j|0)==-1){e=0;g=-1;f[c>>2]=g;return e|0}if((f[h+(j<<2)>>2]|0)==-1){e=0;g=j;f[c>>2]=g;return e|0}if((f[b+(f[i+(j<<2)>>2]<<2)>>2]|0)==-1){a=j+1|0;k=((a>>>0)%3|0|0)==0?j+-2|0:a;if((k|0)==-1){e=0;g=-1;f[c>>2]=g;return e|0}if((f[h+(k<<2)>>2]|0)==-1){e=0;g=k;f[c>>2]=g;return e|0}if((f[b+(f[i+(k<<2)>>2]<<2)>>2]|0)==-1){i=k+1|0;e=1;g=((i>>>0)%3|0|0)==0?k+-2|0:i;f[c>>2]=g;return e|0}else l=k}else l=j}else l=d;while(1){d=(((l>>>0)%3|0|0)==0?2:-1)+l|0;if((d|0)==-1)break;j=f[h+(d<<2)>>2]|0;if((j|0)==-1)break;d=j+(((j>>>0)%3|0|0)==0?2:-1)|0;if((d|0)==-1)break;else l=d}e=0;g=(((l>>>0)%3|0|0)==0?2:-1)+l|0;f[c>>2]=g;return e|0}function yg(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;e=a+4|0;g=f[e>>2]|0;if(!g){f[c>>2]=e;h=e;return h|0}e=b[d+11>>0]|0;i=e<<24>>24<0;j=i?f[d+4>>2]|0:e&255;e=i?f[d>>2]|0:d;d=a+4|0;a=g;while(1){g=a+16|0;i=b[g+11>>0]|0;k=i<<24>>24<0;l=k?f[a+20>>2]|0:i&255;i=l>>>0<j>>>0;m=i?l:j;if((m|0)!=0?(n=Vk(e,k?f[g>>2]|0:g,m)|0,(n|0)!=0):0)if((n|0)<0)o=8;else o=10;else if(j>>>0<l>>>0)o=8;else o=10;if((o|0)==8){o=0;n=f[a>>2]|0;if(!n){o=9;break}else{p=a;q=n}}else if((o|0)==10){o=0;n=j>>>0<l>>>0?j:l;if((n|0)!=0?(l=Vk(k?f[g>>2]|0:g,e,n)|0,(l|0)!=0):0){if((l|0)>=0){o=16;break}}else o=12;if((o|0)==12?(o=0,!i):0){o=16;break}r=a+4|0;i=f[r>>2]|0;if(!i){o=15;break}else{p=r;q=i}}d=p;a=q}if((o|0)==9){f[c>>2]=a;h=a;return h|0}else if((o|0)==15){f[c>>2]=a;h=r;return h|0}else if((o|0)==16){f[c>>2]=a;h=d;return h|0}return 0}function zg(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0;d=u;u=u+32|0;e=d+24|0;g=d+16|0;h=d+8|0;i=d;j=a+4|0;k=f[j>>2]|0;l=f[b>>2]|0;m=f[b+4>>2]|0;b=f[c>>2]|0;n=f[c+4>>2]|0;c=b-l<<3;f[j>>2]=k-m+n+c;j=(f[a>>2]|0)+(k>>>5<<2)|0;a=k&31;k=j;if((m|0)!=(a|0)){f[e>>2]=l;f[e+4>>2]=m;f[g>>2]=b;f[g+4>>2]=n;f[h>>2]=k;f[h+4>>2]=a;xe(i,e,g,h);u=d;return}h=n-m+c|0;c=l;if((h|0)>0){if(!m){o=h;p=j;q=0;r=l;s=c}else{l=32-m|0;n=(h|0)<(l|0)?h:l;g=-1>>>(l-n|0)&-1<<m;f[j>>2]=f[j>>2]&~g|f[c>>2]&g;g=n+m|0;l=c+4|0;o=h-n|0;p=j+(g>>>5<<2)|0;q=g&31;r=l;s=l}l=(o|0)/32|0;im(p|0,r|0,l<<2|0)|0;r=o-(l<<5)|0;o=p+(l<<2)|0;p=o;if((r|0)>0){g=-1>>>(32-r|0);f[o>>2]=f[o>>2]&~g|f[s+(l<<2)>>2]&g;t=r;v=p}else{t=q;v=p}}else{t=m;v=k}f[i>>2]=v;f[i+4>>2]=t;u=d;return}function Ag(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;c=a+8|0;d=f[c>>2]|0;e=a+12|0;g=f[e>>2]|0;h=g;do if((d|0)==(g|0)){i=a+4|0;j=f[i>>2]|0;k=f[a>>2]|0;l=k;if(j>>>0>k>>>0){m=j;n=((m-l>>2)+1|0)/-2|0;o=j+(n<<2)|0;p=d-m|0;m=p>>2;if(!m)q=j;else{im(o|0,j|0,p|0)|0;q=f[i>>2]|0}p=o+(m<<2)|0;f[c>>2]=p;f[i>>2]=q+(n<<2);r=p;break}p=h-l>>1;l=(p|0)==0?1:p;if(l>>>0>1073741823){p=ra(8)|0;Oo(p,16035);f[p>>2]=7256;va(p|0,1112,110)}p=ln(l<<2)|0;n=p;m=p+(l>>>2<<2)|0;o=m;s=p+(l<<2)|0;if((j|0)==(d|0)){t=o;u=k}else{k=m;m=o;l=j;do{f[k>>2]=f[l>>2];k=m+4|0;m=k;l=l+4|0}while((l|0)!=(d|0));t=m;u=f[a>>2]|0}f[a>>2]=n;f[i>>2]=o;f[c>>2]=t;f[e>>2]=s;if(!u)r=t;else{Oq(u);r=f[c>>2]|0}}else r=d;while(0);f[r>>2]=f[b>>2];f[c>>2]=(f[c>>2]|0)+4;return}function Bg(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;c=u;u=u+16|0;d=c+8|0;e=c+4|0;g=c;h=a+12|0;i=a+4|0;j=f[i>>2]|0;if((j|0)==(f[a+8>>2]|0)){Ri(a,h);k=f[i>>2]|0}else{f[j>>2]=f[h>>2];l=j+4|0;f[i>>2]=l;k=l}l=f[a>>2]|0;f[g>>2]=k-l;k=b+16|0;j=k;m=f[j+4>>2]|0;if(!((m|0)>0|(m|0)==0&(f[j>>2]|0)>>>0>0)){f[e>>2]=f[b+4>>2];f[d>>2]=f[e>>2];Me(b,d,g,g+4|0)|0;j=f[a>>2]|0;m=f[g>>2]|0;g=k;k=f[g+4>>2]|0;if((k|0)>0|(k|0)==0&(f[g>>2]|0)>>>0>0){n=j;o=e}else{f[e>>2]=f[b+4>>2];f[d>>2]=f[e>>2];Me(b,d,j,j+m|0)|0;n=f[a>>2]|0;o=e}}else{n=l;o=e}e=f[i>>2]|0;if((e|0)==(n|0)){f[h>>2]=0;p=a+16|0;f[p>>2]=0;u=c;return}f[i>>2]=e+(~((e+-4-n|0)>>>2)<<2);f[h>>2]=0;p=a+16|0;f[p>>2]=0;u=c;return}function Cg(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;e=c;g=d-e|0;h=a+8|0;i=f[h>>2]|0;j=f[a>>2]|0;k=j;if(g>>>0>(i-j|0)>>>0){if(!j)l=i;else{i=a+4|0;if((f[i>>2]|0)!=(k|0))f[i>>2]=k;Oq(k);f[h>>2]=0;f[i>>2]=0;f[a>>2]=0;l=0}if((g|0)<0)aq(a);i=l<<1;m=l>>>0<1073741823?(i>>>0<g>>>0?g:i):2147483647;if((m|0)<0)aq(a);i=ln(m)|0;l=a+4|0;f[l>>2]=i;f[a>>2]=i;f[h>>2]=i+m;if((c|0)==(d|0))return;else{n=c;o=i}do{b[o>>0]=b[n>>0]|0;n=n+1|0;o=(f[l>>2]|0)+1|0;f[l>>2]=o}while((n|0)!=(d|0));return}else{n=a+4|0;a=(f[n>>2]|0)-j|0;j=g>>>0>a>>>0;g=c+a|0;a=j?g:d;o=a-e|0;if(o|0)im(k|0,c|0,o|0)|0;c=k+o|0;if(!j){if((f[n>>2]|0)==(c|0))return;f[n>>2]=c;return}if((a|0)==(d|0))return;a=g;g=f[n>>2]|0;do{b[g>>0]=b[a>>0]|0;a=a+1|0;g=(f[n>>2]|0)+1|0;f[n>>2]=g}while((a|0)!=(d|0));return}}function Dg(a){a=a|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;c=u;u=u+16|0;d=c;if(b[a+352>>0]|0){u=c;return 1}e=a+8|0;g=f[e>>2]|0;h=(f[g+12>>2]|0)-(f[g+8>>2]|0)|0;g=h>>2;i=a+172|0;Gi(i,g+-1|0);if(!((g|0)!=1&(h|0)>0)){u=c;return 1}h=a+12|0;a=0;j=0;while(1){k=f[(f[(f[e>>2]|0)+8>>2]|0)+(a<<2)>>2]|0;if(!(f[k+56>>2]|0))l=j;else{m=f[i>>2]|0;f[m+(j*136|0)>>2]=a;n=f[m+(j*136|0)+104>>2]|0;o=m+(j*136|0)+108|0;p=f[o>>2]|0;if((p|0)!=(n|0))f[o>>2]=p+(~((p+-4-n|0)>>>2)<<2);n=f[h>>2]|0;gk(m+(j*136|0)+104|0,(f[n+4>>2]|0)-(f[n>>2]|0)>>2);n=(f[i>>2]|0)+(j*136|0)+116|0;m=f[h>>2]|0;p=(f[m+4>>2]|0)-(f[m>>2]|0)>>2;f[d>>2]=-1;hg(n,p,d);p=f[i>>2]|0;f[p+(j*136|0)+128>>2]=0;Gc(p+(j*136|0)+4|0,f[e>>2]|0,f[h>>2]|0,k)|0;l=j+1|0}a=a+1|0;if((a|0)>=(g|0))break;else j=l}u=c;return 1}function Eg(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;c=a+8|0;d=f[c>>2]|0;e=a+4|0;g=f[e>>2]|0;h=g;if(d-g>>2>>>0>=b>>>0){sj(g|0,0,b<<2|0)|0;f[e>>2]=g+(b<<2);return}i=f[a>>2]|0;j=g-i>>2;g=j+b|0;k=i;if(g>>>0>1073741823)aq(a);l=d-i|0;d=l>>1;m=l>>2>>>0<536870911?(d>>>0<g>>>0?g:d):1073741823;do if(m)if(m>>>0>1073741823){d=ra(8)|0;Oo(d,16035);f[d>>2]=7256;va(d|0,1112,110)}else{n=ln(m<<2)|0;break}else n=0;while(0);d=n+(j<<2)|0;sj(d|0,0,b<<2|0)|0;b=d;j=n+(m<<2)|0;m=n+(g<<2)|0;if((h|0)==(k|0)){o=b;p=i;q=h}else{i=h;h=b;b=d;do{i=i+-4|0;d=f[i>>2]|0;f[i>>2]=0;f[b+-4>>2]=d;b=h+-4|0;h=b}while((i|0)!=(k|0));o=h;p=f[a>>2]|0;q=f[e>>2]|0}f[a>>2]=o;f[e>>2]=m;f[c>>2]=j;j=p;if((q|0)!=(j|0)){c=q;do{c=c+-4|0;q=f[c>>2]|0;f[c>>2]=0;if(q|0)Va[f[(f[q>>2]|0)+4>>2]&127](q)}while((c|0)!=(j|0))}if(!p)return;Oq(p);return}function Fg(a,c,d,e,g,h){a=a|0;c=c|0;d=d|0;e=e|0;g=g|0;h=$(h);var i=0,j=0,k=0,l=0,m=0,n=0;i=u;u=u+16|0;j=i;k=i+4|0;f[j>>2]=c;c=ln(32)|0;f[k>>2]=c;f[k+8>>2]=-2147483616;f[k+4>>2]=17;l=c;m=14495;n=l+17|0;do{b[l>>0]=b[m>>0]|0;l=l+1|0;m=m+1|0}while((l|0)<(n|0));b[c+17>>0]=0;Xj(Hd(a,j)|0,k,d);if((b[k+11>>0]|0)<0)Oq(f[k>>2]|0);d=ln(32)|0;f[k>>2]=d;f[k+8>>2]=-2147483616;f[k+4>>2]=19;l=d;m=14438;n=l+19|0;do{b[l>>0]=b[m>>0]|0;l=l+1|0;m=m+1|0}while((l|0)<(n|0));b[d+19>>0]=0;si(Hd(a,j)|0,k,g,e);if((b[k+11>>0]|0)<0)Oq(f[k>>2]|0);e=ln(32)|0;f[k>>2]=e;f[k+8>>2]=-2147483616;f[k+4>>2]=18;l=e;m=14458;n=l+18|0;do{b[l>>0]=b[m>>0]|0;l=l+1|0;m=m+1|0}while((l|0)<(n|0));b[e+18>>0]=0;Tj(Hd(a,j)|0,k,h);if((b[k+11>>0]|0)>=0){u=i;return}Oq(f[k>>2]|0);u=i;return}function Gg(a){a=a|0;tk(a);tk(a+32|0);tk(a+64|0);tk(a+96|0);tk(a+128|0);tk(a+160|0);tk(a+192|0);tk(a+224|0);tk(a+256|0);tk(a+288|0);tk(a+320|0);tk(a+352|0);tk(a+384|0);tk(a+416|0);tk(a+448|0);tk(a+480|0);tk(a+512|0);tk(a+544|0);tk(a+576|0);tk(a+608|0);tk(a+640|0);tk(a+672|0);tk(a+704|0);tk(a+736|0);tk(a+768|0);tk(a+800|0);tk(a+832|0);tk(a+864|0);tk(a+896|0);tk(a+928|0);tk(a+960|0);tk(a+992|0);tk(a+1024|0);return}function Hg(a){a=a|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;c=u;u=u+16|0;d=c;if(b[a+288>>0]|0){u=c;return 1}e=a+8|0;g=f[e>>2]|0;h=(f[g+12>>2]|0)-(f[g+8>>2]|0)|0;g=h>>2;i=a+172|0;Gi(i,g+-1|0);if(!((g|0)!=1&(h|0)>0)){u=c;return 1}h=a+12|0;a=0;j=0;while(1){k=f[(f[(f[e>>2]|0)+8>>2]|0)+(a<<2)>>2]|0;if(!(f[k+56>>2]|0))l=j;else{m=f[i>>2]|0;f[m+(j*136|0)>>2]=a;n=f[m+(j*136|0)+104>>2]|0;o=m+(j*136|0)+108|0;p=f[o>>2]|0;if((p|0)!=(n|0))f[o>>2]=p+(~((p+-4-n|0)>>>2)<<2);n=f[h>>2]|0;gk(m+(j*136|0)+104|0,(f[n+4>>2]|0)-(f[n>>2]|0)>>2);n=(f[i>>2]|0)+(j*136|0)+116|0;m=f[h>>2]|0;p=(f[m+4>>2]|0)-(f[m>>2]|0)>>2;f[d>>2]=-1;hg(n,p,d);p=f[i>>2]|0;f[p+(j*136|0)+128>>2]=0;Gc(p+(j*136|0)+4|0,f[e>>2]|0,f[h>>2]|0,k)|0;l=j+1|0}a=a+1|0;if((a|0)>=(g|0))break;else j=l}u=c;return 1}function Ig(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;d=c;e=b;g=d-e|0;h=g>>2;i=a+8|0;j=f[i>>2]|0;k=f[a>>2]|0;l=k;if(h>>>0<=j-k>>2>>>0){m=a+4|0;n=(f[m>>2]|0)-k>>2;o=h>>>0>n>>>0;p=o?b+(n<<2)|0:c;c=p;n=c-e|0;e=n>>2;if(e|0)im(k|0,b|0,n|0)|0;n=l+(e<<2)|0;if(o){o=d-c|0;if((o|0)<=0)return;kh(f[m>>2]|0,p|0,o|0)|0;f[m>>2]=(f[m>>2]|0)+(o>>>2<<2);return}else{o=f[m>>2]|0;if((o|0)==(n|0))return;f[m>>2]=o+(~((o+-4-n|0)>>>2)<<2);return}}n=k;if(!k)q=j;else{j=a+4|0;o=f[j>>2]|0;if((o|0)!=(l|0))f[j>>2]=o+(~((o+-4-k|0)>>>2)<<2);Oq(n);f[i>>2]=0;f[j>>2]=0;f[a>>2]=0;q=0}if(h>>>0>1073741823)aq(a);j=q>>1;n=q>>2>>>0<536870911?(j>>>0<h>>>0?h:j):1073741823;if(n>>>0>1073741823)aq(a);j=ln(n<<2)|0;h=a+4|0;f[h>>2]=j;f[a>>2]=j;f[i>>2]=j+(n<<2);if((g|0)<=0)return;kh(j|0,b|0,g|0)|0;f[h>>2]=j+(g>>>2<<2);return}function Jg(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0.0,p=0,q=0.0,r=0.0,s=0.0,t=0,v=0.0;e=u;u=u+16|0;g=e;h=c+1|0;f[g>>2]=0;i=g+4|0;f[i>>2]=0;f[g+8>>2]=0;do if(h)if(h>>>0>1073741823)aq(g);else{j=ln(h<<2)|0;f[g>>2]=j;k=j+(h<<2)|0;f[g+8>>2]=k;sj(j|0,0,(c<<2)+4|0)|0;f[i>>2]=k;l=j;m=k;n=j;break}else{l=0;m=0;n=0}while(0);if((b|0)>0){g=0;do{j=l+(f[a+(g<<2)>>2]<<2)|0;f[j>>2]=(f[j>>2]|0)+1;g=g+1|0}while((g|0)!=(b|0))}o=+(b|0);if((c|0)<0){p=0;q=0.0}else{c=0;r=0.0;b=0;while(1){g=f[l+(b<<2)>>2]|0;s=+(g|0);if((g|0)>0){t=c+1|0;v=r+ +Zg(s/o)*s}else{t=c;v=r}b=b+1|0;if((b|0)==(h|0)){p=t;q=v;break}else{c=t;r=v}}}if(d|0)f[d>>2]=p;v=-q;p=~~v>>>0;d=+K(v)>=1.0?(v>0.0?~~+Y(+J(v/4294967296.0),4294967295.0)>>>0:~~+W((v-+(~~v>>>0))/4294967296.0)>>>0):0;if(!l){I=d;u=e;return p|0}if((m|0)!=(l|0))f[i>>2]=m+(~((m+-4-l|0)>>>2)<<2);Oq(n);I=d;u=e;return p|0}function Kg(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;e=u;u=u+16|0;g=e+4|0;h=e;i=ln(32)|0;f[a>>2]=i;f[a+4>>2]=c+4;c=a+8|0;b[c>>0]=0;f[i+16>>2]=f[d>>2];a=i+20|0;f[i+24>>2]=0;f[i+28>>2]=0;j=i+24|0;f[a>>2]=j;i=f[d+4>>2]|0;k=d+8|0;if((i|0)==(k|0)){b[c>>0]=1;u=e;return}d=j;j=i;while(1){i=j+16|0;f[h>>2]=d;f[g>>2]=f[h>>2];ph(a,g,i,i)|0;i=f[j+4>>2]|0;if(!i){l=j+8|0;m=f[l>>2]|0;if((f[m>>2]|0)==(j|0))n=m;else{m=l;do{l=f[m>>2]|0;m=l+8|0;o=f[m>>2]|0}while((f[o>>2]|0)!=(l|0));n=o}}else{m=i;while(1){o=f[m>>2]|0;if(!o)break;else m=o}n=m}if((n|0)==(k|0))break;else j=n}b[c>>0]=1;u=e;return}function Lg(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0;d=u;u=u+16|0;e=d;f[e>>2]=b;g=a+8|0;if(((f[a+12>>2]|0)-(f[g>>2]|0)>>2|0)<=(b|0))Bh(g,b+1|0);h=f[(f[c>>2]|0)+56>>2]|0;do if((h|0)<5){i=a+20+(h*12|0)+4|0;j=f[i>>2]|0;if((j|0)==(f[a+20+(h*12|0)+8>>2]|0)){Ri(a+20+(h*12|0)|0,e);break}else{f[j>>2]=b;f[i>>2]=j+4;break}}while(0);b=f[c>>2]|0;h=f[e>>2]|0;f[b+60>>2]=h;e=(f[g>>2]|0)+(h<<2)|0;f[c>>2]=0;c=f[e>>2]|0;f[e>>2]=b;if(!c){u=d;return}b=c+88|0;e=f[b>>2]|0;f[b>>2]=0;if(e|0){b=f[e+8>>2]|0;if(b|0){h=e+12|0;if((f[h>>2]|0)!=(b|0))f[h>>2]=b;Oq(b)}Oq(e)}e=f[c+68>>2]|0;if(e|0){b=c+72|0;h=f[b>>2]|0;if((h|0)!=(e|0))f[b>>2]=h+(~((h+-4-e|0)>>>2)<<2);Oq(e)}e=c+64|0;h=f[e>>2]|0;f[e>>2]=0;if(h|0){e=f[h>>2]|0;if(e|0){b=h+4|0;if((f[b>>2]|0)!=(e|0))f[b>>2]=e;Oq(e)}Oq(h)}Oq(c);u=d;return}function Mg(a){a=a|0;var b=0,c=0,d=0,e=0,g=0,h=0,i=0;b=u;u=u+16|0;c=b+4|0;d=b;e=a+8|0;g=f[e>>2]|0;gk(f[a+4>>2]|0,(f[g+56>>2]|0)-(f[g+52>>2]|0)>>2);g=a+84|0;a=f[g>>2]|0;if(!a){h=f[(f[e>>2]|0)+64>>2]|0;i=(f[h+4>>2]|0)-(f[h>>2]|0)>>2;h=(i>>>0)/3|0;if(i>>>0<=2){u=b;return 1}i=0;do{f[d>>2]=i*3;f[c>>2]=f[d>>2];Zb(e,c);i=i+1|0}while((i|0)<(h|0));u=b;return 1}else{h=f[a>>2]|0;if((f[a+4>>2]|0)==(h|0)){u=b;return 1}a=0;i=h;do{f[d>>2]=f[i+(a<<2)>>2];f[c>>2]=f[d>>2];Zb(e,c);a=a+1|0;h=f[g>>2]|0;i=f[h>>2]|0}while(a>>>0<(f[h+4>>2]|0)-i>>2>>>0);u=b;return 1}return 0}function Ng(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0;d=u;u=u+48|0;e=d+16|0;g=d;h=d+32|0;i=a+28|0;j=f[i>>2]|0;f[h>>2]=j;k=a+20|0;l=(f[k>>2]|0)-j|0;f[h+4>>2]=l;f[h+8>>2]=b;f[h+12>>2]=c;b=l+c|0;l=a+60|0;f[g>>2]=f[l>>2];f[g+4>>2]=h;f[g+8>>2]=2;j=to(Aa(146,g|0)|0)|0;a:do if((b|0)!=(j|0)){g=2;m=b;n=h;o=j;while(1){if((o|0)<0)break;m=m-o|0;p=f[n+4>>2]|0;q=o>>>0>p>>>0;r=q?n+8|0:n;s=g+(q<<31>>31)|0;t=o-(q?p:0)|0;f[r>>2]=(f[r>>2]|0)+t;p=r+4|0;f[p>>2]=(f[p>>2]|0)-t;f[e>>2]=f[l>>2];f[e+4>>2]=r;f[e+8>>2]=s;o=to(Aa(146,e|0)|0)|0;if((m|0)==(o|0)){v=3;break a}else{g=s;n=r}}f[a+16>>2]=0;f[i>>2]=0;f[k>>2]=0;f[a>>2]=f[a>>2]|32;if((g|0)==2)w=0;else w=c-(f[n+4>>2]|0)|0}else v=3;while(0);if((v|0)==3){v=f[a+44>>2]|0;f[a+16>>2]=v+(f[a+48>>2]|0);a=v;f[i>>2]=a;f[k>>2]=a;w=c}u=d;return w|0}function Og(a){a=a|0;var b=0,c=0,d=0,e=0,g=0,h=0,i=0;f[a>>2]=6192;b=f[a+68>>2]|0;if(b|0){c=a+72|0;d=f[c>>2]|0;if((d|0)!=(b|0))f[c>>2]=d+(~((d+-4-b|0)>>>2)<<2);Oq(b)}b=f[a+56>>2]|0;if(b|0){d=a+60|0;c=f[d>>2]|0;if((c|0)!=(b|0))f[d>>2]=c+(~((c+-4-b|0)>>>2)<<2);Oq(b)}b=f[a+44>>2]|0;if(b|0){c=a+48|0;d=f[c>>2]|0;if((d|0)!=(b|0))f[c>>2]=d+(~((d+-4-b|0)>>>2)<<2);Oq(b)}b=f[a+32>>2]|0;if(b|0){d=a+36|0;c=f[d>>2]|0;if((c|0)!=(b|0))f[d>>2]=c+(~((c+-4-b|0)>>>2)<<2);Oq(b)}b=f[a+20>>2]|0;if(b|0){c=a+24|0;d=f[c>>2]|0;if((d|0)!=(b|0))f[c>>2]=d+(~((d+-4-b|0)>>>2)<<2);Oq(b)}hi(a+8|0);b=a+4|0;a=f[b>>2]|0;f[b>>2]=0;if(!a)return;b=a+40|0;d=f[b>>2]|0;if(d|0){c=a+44|0;e=f[c>>2]|0;if((e|0)==(d|0))g=d;else{h=e;do{e=h+-4|0;f[c>>2]=e;i=f[e>>2]|0;f[e>>2]=0;if(i|0){bj(i);Oq(i)}h=f[c>>2]|0}while((h|0)!=(d|0));g=f[b>>2]|0}Oq(g)}bj(a);Oq(a);return}function Pg(a){a=a|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0;c=a+12|0;d=f[a>>2]|0;e=a+8|0;g=f[e>>2]|0;h=(g|0)==-1;if(!(b[c>>0]|0)){do if(((!h?(i=(((g>>>0)%3|0|0)==0?2:-1)+g|0,(i|0)!=-1):0)?(f[(f[d>>2]|0)+(i>>>5<<2)>>2]&1<<(i&31)|0)==0:0)?(j=f[(f[(f[d+64>>2]|0)+12>>2]|0)+(i<<2)>>2]|0,(j|0)!=-1):0)if(!((j>>>0)%3|0)){k=j+2|0;break}else{k=j+-1|0;break}else k=-1;while(0);f[e>>2]=k;return}k=g+1|0;if(((!h?(h=((k>>>0)%3|0|0)==0?g+-2|0:k,(h|0)!=-1):0)?(f[(f[d>>2]|0)+(h>>>5<<2)>>2]&1<<(h&31)|0)==0:0)?(k=f[(f[(f[d+64>>2]|0)+12>>2]|0)+(h<<2)>>2]|0,h=k+1|0,(k|0)!=-1):0){g=((h>>>0)%3|0|0)==0?k+-2|0:h;f[e>>2]=g;if((g|0)!=-1){if((g|0)!=(f[a+4>>2]|0))return;f[e>>2]=-1;return}}else f[e>>2]=-1;g=f[a+4>>2]|0;do if((((g|0)!=-1?(a=(((g>>>0)%3|0|0)==0?2:-1)+g|0,(a|0)!=-1):0)?(f[(f[d>>2]|0)+(a>>>5<<2)>>2]&1<<(a&31)|0)==0:0)?(h=f[(f[(f[d+64>>2]|0)+12>>2]|0)+(a<<2)>>2]|0,(h|0)!=-1):0)if(!((h>>>0)%3|0)){l=h+2|0;break}else{l=h+-1|0;break}else l=-1;while(0);f[e>>2]=l;b[c>>0]=0;return}function Qg(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;c=a+4|0;d=f[a>>2]|0;e=(f[c>>2]|0)-d>>2;g=e+1|0;if(g>>>0>1073741823)aq(a);h=a+8|0;i=(f[h>>2]|0)-d|0;d=i>>1;j=i>>2>>>0<536870911?(d>>>0<g>>>0?g:d):1073741823;do if(j)if(j>>>0>1073741823){d=ra(8)|0;Oo(d,16035);f[d>>2]=7256;va(d|0,1112,110)}else{k=ln(j<<2)|0;break}else k=0;while(0);d=k+(e<<2)|0;e=d;g=k+(j<<2)|0;j=f[b>>2]|0;f[b>>2]=0;f[d>>2]=j;j=d+4|0;b=f[a>>2]|0;k=f[c>>2]|0;if((k|0)==(b|0)){l=e;m=b;n=b}else{i=k;k=e;e=d;do{i=i+-4|0;d=f[i>>2]|0;f[i>>2]=0;f[e+-4>>2]=d;e=k+-4|0;k=e}while((i|0)!=(b|0));l=k;m=f[a>>2]|0;n=f[c>>2]|0}f[a>>2]=l;f[c>>2]=j;f[h>>2]=g;g=m;if((n|0)!=(g|0)){h=n;do{h=h+-4|0;n=f[h>>2]|0;f[h>>2]=0;if(n|0)Va[f[(f[n>>2]|0)+4>>2]&127](n)}while((h|0)!=(g|0))}if(!m)return;Oq(m);return}function Rg(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;d=a+4|0;a=f[d>>2]|0;do if(a|0){e=b[c+11>>0]|0;g=e<<24>>24<0;h=g?f[c+4>>2]|0:e&255;e=g?f[c>>2]|0:c;g=d;i=a;a:while(1){j=i;while(1){k=j+16|0;l=b[k+11>>0]|0;m=l<<24>>24<0;n=m?f[j+20>>2]|0:l&255;l=h>>>0<n>>>0?h:n;if((l|0)!=0?(o=Vk(m?f[k>>2]|0:k,e,l)|0,(o|0)!=0):0){if((o|0)>=0)break}else p=6;if((p|0)==6?(p=0,n>>>0>=h>>>0):0)break;n=f[j+4>>2]|0;if(!n){q=g;break a}else j=n}i=f[j>>2]|0;if(!i){q=j;break}else g=j}if((q|0)!=(d|0)){g=q+16|0;i=b[g+11>>0]|0;n=i<<24>>24<0;o=n?f[q+20>>2]|0:i&255;i=o>>>0<h>>>0?o:h;if(i|0?(l=Vk(e,n?f[g>>2]|0:g,i)|0,l|0):0){if((l|0)<0)break;else r=q;return r|0}if(h>>>0>=o>>>0){r=q;return r|0}}}while(0);r=d;return r|0}function Sg(a,b){a=a|0;b=b|0;var c=0,d=0,e=0;c=a+8|0;f[c>>2]=f[b>>2];fg(a+12|0,b+4|0)|0;d=a+44|0;e=b+36|0;f[d>>2]=f[e>>2];f[d+4>>2]=f[e+4>>2];f[d+8>>2]=f[e+8>>2];f[d+12>>2]=f[e+12>>2];if((c|0)==(b|0)){f[a+96>>2]=f[b+88>>2];return}else{ng(a+60|0,f[b+52>>2]|0,f[b+56>>2]|0);ng(a+72|0,f[b+64>>2]|0,f[b+68>>2]|0);ng(a+84|0,f[b+76>>2]|0,f[b+80>>2]|0);f[a+96>>2]=f[b+88>>2];Ig(a+100|0,f[b+92>>2]|0,f[b+96>>2]|0);return}}function Tg(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0;d=a+8|0;e=f[d>>2]|0;g=a+4|0;h=f[g>>2]|0;if(((e-h|0)/12|0)>>>0>=b>>>0){i=b;j=h;do{f[j>>2]=f[c>>2];f[j+4>>2]=f[c+4>>2];f[j+8>>2]=f[c+8>>2];j=(f[g>>2]|0)+12|0;f[g>>2]=j;i=i+-1|0}while((i|0)!=0);return}i=f[a>>2]|0;j=(h-i|0)/12|0;h=j+b|0;if(h>>>0>357913941)aq(a);k=(e-i|0)/12|0;i=k<<1;e=k>>>0<178956970?(i>>>0<h>>>0?h:i):357913941;do if(e)if(e>>>0>357913941){i=ra(8)|0;Oo(i,16035);f[i>>2]=7256;va(i|0,1112,110)}else{l=ln(e*12|0)|0;break}else l=0;while(0);i=l+(j*12|0)|0;j=l+(e*12|0)|0;e=b;b=i;l=i;do{f[b>>2]=f[c>>2];f[b+4>>2]=f[c+4>>2];f[b+8>>2]=f[c+8>>2];b=l+12|0;l=b;e=e+-1|0}while((e|0)!=0);e=f[a>>2]|0;b=(f[g>>2]|0)-e|0;c=i+(((b|0)/-12|0)*12|0)|0;if((b|0)>0)kh(c|0,e|0,b|0)|0;f[a>>2]=c;f[g>>2]=l;f[d>>2]=j;if(!e)return;Oq(e);return}function Ug(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;c=a+4|0;d=f[a>>2]|0;e=(f[c>>2]|0)-d>>2;g=e+1|0;if(g>>>0>1073741823)aq(a);h=a+8|0;i=(f[h>>2]|0)-d|0;d=i>>1;j=i>>2>>>0<536870911?(d>>>0<g>>>0?g:d):1073741823;do if(j)if(j>>>0>1073741823){d=ra(8)|0;Oo(d,16035);f[d>>2]=7256;va(d|0,1112,110)}else{k=ln(j<<2)|0;break}else k=0;while(0);d=k+(e<<2)|0;e=d;g=k+(j<<2)|0;j=f[b>>2]|0;f[b>>2]=0;f[d>>2]=j;j=d+4|0;b=f[a>>2]|0;k=f[c>>2]|0;if((k|0)==(b|0)){l=e;m=b;n=b}else{i=k;k=e;e=d;do{i=i+-4|0;d=f[i>>2]|0;f[i>>2]=0;f[e+-4>>2]=d;e=k+-4|0;k=e}while((i|0)!=(b|0));l=k;m=f[a>>2]|0;n=f[c>>2]|0}f[a>>2]=l;f[c>>2]=j;f[h>>2]=g;g=m;if((n|0)!=(g|0)){h=n;do{h=h+-4|0;n=f[h>>2]|0;f[h>>2]=0;if(n|0){bj(n);Oq(n)}}while((h|0)!=(g|0))}if(!m)return;Oq(m);return}function Vg(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;e=f[b>>2]|0;g=f[a>>2]|0;h=f[d>>2]|0;d=f[h>>2]|0;i=(f[h+4>>2]|0)-d>>3;if(i>>>0<=e>>>0)aq(h);j=d;if(i>>>0<=g>>>0)aq(h);d=f[j+(e<<3)>>2]|0;k=f[c>>2]|0;if(i>>>0<=k>>>0)aq(h);l=j+(g<<3)|0;m=(f[j+(k<<3)>>2]|0)>>>0<d>>>0;if(d>>>0<(f[l>>2]|0)>>>0){if(m){f[a>>2]=k;f[c>>2]=g;n=1;return n|0}f[a>>2]=e;f[b>>2]=g;d=f[c>>2]|0;if(i>>>0<=d>>>0)aq(h);if((f[j+(d<<3)>>2]|0)>>>0>=(f[l>>2]|0)>>>0){n=1;return n|0}f[b>>2]=d;f[c>>2]=g;n=2;return n|0}if(!m){n=0;return n|0}f[b>>2]=k;f[c>>2]=e;e=f[b>>2]|0;c=f[a>>2]|0;if(i>>>0<=e>>>0)aq(h);if(i>>>0<=c>>>0)aq(h);if((f[j+(e<<3)>>2]|0)>>>0>=(f[j+(c<<3)>>2]|0)>>>0){n=1;return n|0}f[a>>2]=e;f[b>>2]=c;n=2;return n|0}function Wg(a){a=a|0;var b=0,c=0,d=0,e=0,g=0,h=0,i=0;b=u;u=u+16|0;c=b+4|0;d=b;e=a+8|0;g=f[e>>2]|0;gk(f[a+4>>2]|0,(f[g+28>>2]|0)-(f[g+24>>2]|0)>>2);g=a+84|0;a=f[g>>2]|0;if(!a){h=f[e>>2]|0;i=(f[h+4>>2]|0)-(f[h>>2]|0)>>2;h=(i>>>0)/3|0;if(i>>>0<=2){u=b;return 1}i=0;do{f[d>>2]=i*3;f[c>>2]=f[d>>2];dc(e,c);i=i+1|0}while((i|0)<(h|0));u=b;return 1}else{h=f[a>>2]|0;if((f[a+4>>2]|0)==(h|0)){u=b;return 1}a=0;i=h;do{f[d>>2]=f[i+(a<<2)>>2];f[c>>2]=f[d>>2];dc(e,c);a=a+1|0;h=f[g>>2]|0;i=f[h>>2]|0}while(a>>>0<(f[h+4>>2]|0)-i>>2>>>0);u=b;return 1}return 0}function Xg(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;a=u;u=u+16|0;e=a;if(!b){g=0;u=a;return g|0}h=b+96|0;i=b+100|0;f[e>>2]=0;f[e+4>>2]=0;f[e+8>>2]=0;b=f[i>>2]|0;j=f[h>>2]|0;k=(b-j|0)/12|0;l=j;j=b;if(k>>>0>=c>>>0){if(k>>>0>c>>>0?(b=l+(c*12|0)|0,(b|0)!=(j|0)):0)f[i>>2]=j+(~(((j+-12-b|0)>>>0)/12|0)*12|0);if(!c){g=1;u=a;return g|0}}else Tg(h,c-k|0,e);k=0;b=f[h>>2]|0;while(1){j=k*3|0;l=f[d+(j<<2)>>2]|0;m=f[d+(j+1<<2)>>2]|0;n=f[d+(j+2<<2)>>2]|0;j=((f[i>>2]|0)-b|0)/12|0;o=k;k=k+1|0;if(o>>>0<j>>>0){p=b;q=b}else{f[e>>2]=0;f[e+4>>2]=0;f[e+8>>2]=0;Tg(h,k-j|0,e);j=f[h>>2]|0;p=j;q=j}f[p+(o*12|0)>>2]=l;f[p+(o*12|0)+4>>2]=m;f[p+(o*12|0)+8>>2]=n;if((k|0)==(c|0)){g=1;break}else b=q}u=a;return g|0}function Yg(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,g=0,h=0;e=u;u=u+80|0;g=e+36|0;h=e;ao(g,c);Ke(h,b,c);Ph(g,h);Ej(h+24|0,f[h+28>>2]|0);Oj(h+12|0,f[h+16>>2]|0);Ej(h,f[h+4>>2]|0);cj(a,g,d);Ej(g+24|0,f[g+28>>2]|0);Oj(g+12|0,f[g+16>>2]|0);Ej(g,f[g+4>>2]|0);u=e;return}function Zg(a){a=+a;var b=0,c=0,d=0,e=0.0,g=0,h=0,i=0,j=0,k=0,l=0,m=0.0,n=0.0,o=0.0,q=0.0,r=0.0,t=0.0;p[s>>3]=a;b=f[s>>2]|0;c=f[s+4>>2]|0;d=(c|0)<0;do if(d|c>>>0<1048576){if((b|0)==0&(c&2147483647|0)==0){e=-1.0/(a*a);break}if(d){e=(a-a)/0.0;break}else{p[s>>3]=a*18014398509481984.0;g=f[s+4>>2]|0;h=-1077;i=g;j=f[s>>2]|0;k=g;l=9;break}}else if(c>>>0<=2146435071)if((b|0)==0&0==0&(c|0)==1072693248)e=0.0;else{h=-1023;i=c;j=b;k=c;l=9}else e=a;while(0);if((l|0)==9){l=i+614242|0;f[s>>2]=j;f[s+4>>2]=(l&1048575)+1072079006;a=+p[s>>3]+-1.0;m=a*a*.5;n=a/(a+2.0);o=n*n;q=o*o;p[s>>3]=a-m;j=f[s+4>>2]|0;f[s>>2]=0;f[s+4>>2]=j;r=+p[s>>3];t=a-r-m+n*(m+(q*(q*(q*.15313837699209373+.22222198432149784)+.3999999999940942)+o*(q*(q*(q*.14798198605116586+.1818357216161805)+.2857142874366239)+.6666666666666735)));q=r*1.4426950407214463;o=+(h+(l>>>20)|0);m=q+o;e=m+(q+(o-m)+(t*1.4426950407214463+(t+r)*1.6751713164886512e-10))}return +e}function _g(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;d=u;u=u+16|0;e=d;g=ln(32)|0;f[e>>2]=g;f[e+8>>2]=-2147483616;f[e+4>>2]=17;h=g;i=14390;j=h+17|0;do{b[h>>0]=b[i>>0]|0;h=h+1|0;i=i+1|0}while((h|0)<(j|0));b[g+17>>0]=0;g=c+16|0;i=f[g>>2]|0;if(i){h=g;j=i;a:while(1){i=j;while(1){if((f[i+16>>2]|0)>=(a|0))break;k=f[i+4>>2]|0;if(!k){l=h;break a}else i=k}j=f[i>>2]|0;if(!j){l=i;break}else h=i}if(((l|0)!=(g|0)?(f[l+16>>2]|0)<=(a|0):0)?(a=l+20|0,(Jh(a,e)|0)!=0):0)m=a;else n=10}else n=10;if((n|0)==10)m=c;c=Hk(m,e,-1)|0;if((b[e+11>>0]|0)>=0){o=(c|0)==-1;p=c>>>0>6;q=p?-2:c;r=o?-1:q;u=d;return r|0}Oq(f[e>>2]|0);o=(c|0)==-1;p=c>>>0>6;q=p?-2:c;r=o?-1:q;u=d;return r|0}function $g(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0;d=u;u=u+16|0;e=d;g=f[c>>2]|0;f[c>>2]=0;f[e>>2]=g;Lg(a,b,e);g=f[e>>2]|0;f[e>>2]=0;if(g|0){e=g+88|0;c=f[e>>2]|0;f[e>>2]=0;if(c|0){e=f[c+8>>2]|0;if(e|0){h=c+12|0;if((f[h>>2]|0)!=(e|0))f[h>>2]=e;Oq(e)}Oq(c)}c=f[g+68>>2]|0;if(c|0){e=g+72|0;h=f[e>>2]|0;if((h|0)!=(c|0))f[e>>2]=h+(~((h+-4-c|0)>>>2)<<2);Oq(c)}c=g+64|0;h=f[c>>2]|0;f[c>>2]=0;if(h|0){c=f[h>>2]|0;if(c|0){e=h+4|0;if((f[e>>2]|0)!=(c|0))f[e>>2]=c;Oq(c)}Oq(h)}Oq(g)}g=a+84|0;h=a+88|0;a=f[h>>2]|0;c=f[g>>2]|0;e=a-c>>2;if((e|0)>(b|0)){u=d;return}i=b+1|0;b=a;if(i>>>0>e>>>0){Fh(g,i-e|0);u=d;return}if(i>>>0>=e>>>0){u=d;return}e=c+(i<<2)|0;if((e|0)==(b|0)){u=d;return}f[h>>2]=b+(~((b+-4-e|0)>>>2)<<2);u=d;return}function ah(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0;d=u;u=u+16|0;e=d;g=a+4|0;f[g>>2]=c;f[a+8>>2]=f[c+52>>2];h=f[a+184>>2]|0;i=a+188|0;j=f[i>>2]|0;if((j|0)!=(h|0))f[i>>2]=j+(~((j+-4-h|0)>>>2)<<2);h=f[c+48>>2]|0;c=ln(32)|0;f[e>>2]=c;f[e+8>>2]=-2147483616;f[e+4>>2]=19;j=c;i=15351;k=j+19|0;do{b[j>>0]=b[i>>0]|0;j=j+1|0;i=i+1|0}while((j|0)<(k|0));b[c+19>>0]=0;c=(Jh(h,e)|0)==0;if((b[e+11>>0]|0)<0)Oq(f[e>>2]|0);h=f[(f[g>>2]|0)+48>>2]|0;if(c){c=(mi(h)|0)>5&1;b[a+352>>0]=c;u=d;return 1}c=ln(32)|0;f[e>>2]=c;f[e+8>>2]=-2147483616;f[e+4>>2]=19;j=c;i=15351;k=j+19|0;do{b[j>>0]=b[i>>0]|0;j=j+1|0;i=i+1|0}while((j|0)<(k|0));b[c+19>>0]=0;c=(Yj(h,e,0)|0)&1;b[a+352>>0]=c;if((b[e+11>>0]|0)<0)Oq(f[e>>2]|0);u=d;return 1}function bh(a){a=a|0;var c=0,d=0,e=0,g=0,i=0,j=0,k=0,l=0,m=0;c=a+108|0;d=(f[a+112>>2]|0)-(f[c>>2]|0)|0;e=(d|0)/12|0;g=a+4|0;ci(e,f[(f[g>>2]|0)+44>>2]|0)|0;if(!d)return 1;d=0;a=0;while(1){i=f[c>>2]|0;j=i+(d*12|0)+4|0;ci((f[j>>2]|0)-a|0,f[(f[g>>2]|0)+44>>2]|0)|0;ci((f[j>>2]|0)-(f[i+(d*12|0)>>2]|0)|0,f[(f[g>>2]|0)+44>>2]|0)|0;d=d+1|0;if(d>>>0>=e>>>0)break;else a=f[j>>2]|0}zi(f[(f[g>>2]|0)+44>>2]|0,e,0,0)|0;a=0;do{d=f[(f[g>>2]|0)+44>>2]|0;j=d+16|0;i=f[j+4>>2]|0;if((i|0)>0|(i|0)==0&(f[j>>2]|0)>>>0>0){j=f[d+12>>2]|0;d=j+4|0;i=f[d>>2]|0;k=b[(f[c>>2]|0)+(a*12|0)+8>>0]&1;l=i>>>3;m=i&7;i=(f[j>>2]|0)+l|0;b[i>>0]=(1<<m^255)&(h[i>>0]|0);i=(f[j>>2]|0)+l|0;b[i>>0]=k<<m|(h[i>>0]|0);f[d>>2]=(f[d>>2]|0)+1}a=a+1|0}while(a>>>0<e>>>0);eg(f[(f[g>>2]|0)+44>>2]|0);return 1}function ch(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,g=0,h=0;e=u;u=u+80|0;g=e+36|0;h=e;io(g,c);Ke(h,b,c);Ph(g,h);Ej(h+24|0,f[h+28>>2]|0);Oj(h+12|0,f[h+16>>2]|0);Ej(h,f[h+4>>2]|0);cj(a,g,d);Ej(g+24|0,f[g+28>>2]|0);Oj(g+12|0,f[g+16>>2]|0);Ej(g,f[g+4>>2]|0);u=e;return}function dh(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0;d=u;u=u+16|0;e=d;g=a+4|0;f[g>>2]=c;f[a+8>>2]=f[c+52>>2];h=f[a+184>>2]|0;i=a+188|0;j=f[i>>2]|0;if((j|0)!=(h|0))f[i>>2]=j+(~((j+-4-h|0)>>>2)<<2);h=f[c+48>>2]|0;c=ln(32)|0;f[e>>2]=c;f[e+8>>2]=-2147483616;f[e+4>>2]=19;j=c;i=15351;k=j+19|0;do{b[j>>0]=b[i>>0]|0;j=j+1|0;i=i+1|0}while((j|0)<(k|0));b[c+19>>0]=0;c=(Jh(h,e)|0)==0;if((b[e+11>>0]|0)<0)Oq(f[e>>2]|0);h=f[(f[g>>2]|0)+48>>2]|0;if(c){c=(mi(h)|0)>5&1;b[a+288>>0]=c;u=d;return 1}c=ln(32)|0;f[e>>2]=c;f[e+8>>2]=-2147483616;f[e+4>>2]=19;j=c;i=15351;k=j+19|0;do{b[j>>0]=b[i>>0]|0;j=j+1|0;i=i+1|0}while((j|0)<(k|0));b[c+19>>0]=0;c=(Yj(h,e,0)|0)&1;b[a+288>>0]=c;if((b[e+11>>0]|0)<0)Oq(f[e>>2]|0);u=d;return 1}function eh(a,b,c,d,e,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;g=u;u=u+32|0;h=g+16|0;i=g+8|0;j=g;k=d-e|0;d=a+8|0;if((k|0)>0){a=0-e|0;l=i+4|0;m=j+4|0;n=h+4|0;o=k;do{k=b+(o<<2)|0;p=k+(a<<2)|0;q=c+(o<<2)|0;r=f[k+4>>2]|0;s=f[p>>2]|0;t=f[p+4>>2]|0;f[i>>2]=f[k>>2];f[l>>2]=r;f[j>>2]=s;f[m>>2]=t;Od(h,d,i,j);f[q>>2]=f[h>>2];f[q+4>>2]=f[n>>2];o=o-e|0}while((o|0)>0)}o=e>>>0>1073741823?-1:e<<2;e=Lq(o)|0;sj(e|0,0,o|0)|0;o=f[b+4>>2]|0;n=f[e>>2]|0;m=f[e+4>>2]|0;f[i>>2]=f[b>>2];f[i+4>>2]=o;f[j>>2]=n;f[j+4>>2]=m;Od(h,d,i,j);f[c>>2]=f[h>>2];f[c+4>>2]=f[h+4>>2];Mq(e);u=g;return 1}function fh(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;c=u;u=u+32|0;d=c+12|0;e=c;g=f[b+100>>2]|0;h=f[b+96>>2]|0;b=g-h|0;i=(b|0)/12|0;f[d>>2]=0;j=d+4|0;f[j>>2]=0;f[d+8>>2]=0;k=h;do if(b)if(i>>>0>357913941)aq(d);else{l=ln(b)|0;f[d>>2]=l;f[d+8>>2]=l+(i*12|0);sj(l|0,0,b|0)|0;f[j>>2]=l+b;m=l;break}else m=0;while(0);f[e>>2]=0;f[e+4>>2]=0;f[e+8>>2]=0;if((g|0)!=(h|0)){h=e+4|0;g=e+8|0;b=0;do{l=k+(b*12|0)|0;f[e>>2]=f[l>>2];f[e+4>>2]=f[l+4>>2];f[e+8>>2]=f[l+8>>2];f[m+(b*12|0)>>2]=f[e>>2];f[m+(b*12|0)+4>>2]=f[h>>2];f[m+(b*12|0)+8>>2]=f[g>>2];b=b+1|0}while(b>>>0<i>>>0)}Kj(a,d);a=f[d>>2]|0;if(!a){u=c;return}d=f[j>>2]|0;if((d|0)!=(a|0))f[j>>2]=d+(~(((d+-12-a|0)>>>0)/12|0)*12|0);Oq(a);u=c;return}function gh(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;if(c>>>0>4294967279)aq(a);d=a+11|0;e=b[d>>0]|0;g=e<<24>>24<0;if(g){h=f[a+4>>2]|0;i=(f[a+8>>2]&2147483647)+-1|0}else{h=e&255;i=10}j=h>>>0>c>>>0?h:c;c=j>>>0<11;k=c?10:(j+16&-16)+-1|0;do if((k|0)!=(i|0)){do if(c){j=f[a>>2]|0;if(g){l=0;m=j;n=a;o=13}else{Fo(a,j,(e&255)+1|0)|0;Oq(j);o=16}}else{j=k+1|0;p=ln(j)|0;if(g){l=1;m=f[a>>2]|0;n=p;o=13;break}else{Fo(p,a,(e&255)+1|0)|0;q=p;r=j;s=a+4|0;o=15;break}}while(0);if((o|0)==13){j=a+4|0;Fo(n,m,(f[j>>2]|0)+1|0)|0;Oq(m);if(l){q=n;r=k+1|0;s=j;o=15}else o=16}if((o|0)==15){f[a+8>>2]=r|-2147483648;f[s>>2]=h;f[a>>2]=q;break}else if((o|0)==16){b[d>>0]=h;break}}while(0);return}function hh(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;c=f[b>>2]|0;if((c|0)==-1){d=-1;return d|0}b=f[(f[a+24>>2]|0)+(c<<2)>>2]|0;if((b|0)==-1){d=0;return d|0}c=a+12|0;a=0;e=0;g=b;a:while(1){b:do if(e){h=a+1|0;i=(((g>>>0)%3|0|0)==0?2:-1)+g|0;if((i|0)==-1){d=h;j=15;break a}k=f[(f[c>>2]|0)+(i<<2)>>2]|0;if((k|0)==-1){d=h;j=15;break a}if(!((k>>>0)%3|0)){l=k+2|0;m=h;break}else{l=k+-1|0;m=h;break}}else{h=a;k=g;while(1){i=h+1|0;n=k+1|0;o=((n>>>0)%3|0|0)==0?k+-2|0:n;if((o|0)==-1){l=b;m=i;break b}n=f[(f[c>>2]|0)+(o<<2)>>2]|0;o=n+1|0;if((n|0)==-1){l=b;m=i;break b}k=((o>>>0)%3|0|0)==0?n+-2|0:o;if((k|0)==-1){l=b;m=i;break b}if((k|0)==(b|0)){d=i;j=15;break a}else h=i}}while(0);if((l|0)==-1){d=m;j=15;break}else{a=m;e=1;g=l}}if((j|0)==15)return d|0;return 0}function ih(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;d=a+8|0;Vg(a,a+4|0,d,c)|0;e=a+12|0;if((e|0)==(b|0))return;g=f[c>>2]|0;c=f[g>>2]|0;h=(f[g+4>>2]|0)-c>>3;i=c;c=e;e=d;a:while(1){d=f[c>>2]|0;j=f[e>>2]|0;if(h>>>0<=d>>>0){k=5;break}if(h>>>0<=j>>>0){k=7;break}l=i+(d<<3)|0;if((f[l>>2]|0)>>>0<(f[i+(j<<3)>>2]|0)>>>0){m=e;n=c;o=j;while(1){f[n>>2]=o;if((m|0)==(a|0)){p=a;break}j=m+-4|0;o=f[j>>2]|0;if(h>>>0<=o>>>0){k=11;break a}if((f[l>>2]|0)>>>0>=(f[i+(o<<3)>>2]|0)>>>0){p=m;break}else{q=m;m=j;n=q}}f[p>>2]=d}n=c+4|0;if((n|0)==(b|0)){k=3;break}else{m=c;c=n;e=m}}if((k|0)==3)return;else if((k|0)==5)aq(g);else if((k|0)==7)aq(g);else if((k|0)==11)aq(g)}function jh(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0;g=Vg(a,b,c,e)|0;h=f[d>>2]|0;i=f[c>>2]|0;j=f[e>>2]|0;e=f[j>>2]|0;k=(f[j+4>>2]|0)-e>>3;if(k>>>0<=h>>>0)aq(j);l=e;if(k>>>0<=i>>>0)aq(j);if((f[l+(h<<3)>>2]|0)>>>0>=(f[l+(i<<3)>>2]|0)>>>0){m=g;return m|0}f[c>>2]=h;f[d>>2]=i;i=f[c>>2]|0;d=f[b>>2]|0;if(k>>>0<=i>>>0)aq(j);if(k>>>0<=d>>>0)aq(j);if((f[l+(i<<3)>>2]|0)>>>0>=(f[l+(d<<3)>>2]|0)>>>0){m=g+1|0;return m|0}f[b>>2]=i;f[c>>2]=d;d=f[b>>2]|0;c=f[a>>2]|0;if(k>>>0<=d>>>0)aq(j);if(k>>>0<=c>>>0)aq(j);if((f[l+(d<<3)>>2]|0)>>>0>=(f[l+(c<<3)>>2]|0)>>>0){m=g+2|0;return m|0}f[a>>2]=d;f[b>>2]=c;m=g+3|0;return m|0}function kh(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0;if((d|0)>=8192)return Da(a|0,c|0,d|0)|0;e=a|0;g=a+d|0;if((a&3)==(c&3)){while(a&3){if(!d)return e|0;b[a>>0]=b[c>>0]|0;a=a+1|0;c=c+1|0;d=d-1|0}h=g&-4|0;d=h-64|0;while((a|0)<=(d|0)){f[a>>2]=f[c>>2];f[a+4>>2]=f[c+4>>2];f[a+8>>2]=f[c+8>>2];f[a+12>>2]=f[c+12>>2];f[a+16>>2]=f[c+16>>2];f[a+20>>2]=f[c+20>>2];f[a+24>>2]=f[c+24>>2];f[a+28>>2]=f[c+28>>2];f[a+32>>2]=f[c+32>>2];f[a+36>>2]=f[c+36>>2];f[a+40>>2]=f[c+40>>2];f[a+44>>2]=f[c+44>>2];f[a+48>>2]=f[c+48>>2];f[a+52>>2]=f[c+52>>2];f[a+56>>2]=f[c+56>>2];f[a+60>>2]=f[c+60>>2];a=a+64|0;c=c+64|0}while((a|0)<(h|0)){f[a>>2]=f[c>>2];a=a+4|0;c=c+4|0}}else{h=g-4|0;while((a|0)<(h|0)){b[a>>0]=b[c>>0]|0;b[a+1>>0]=b[c+1>>0]|0;b[a+2>>0]=b[c+2>>0]|0;b[a+3>>0]=b[c+3>>0]|0;a=a+4|0;c=c+4|0}}while((a|0)<(g|0)){b[a>>0]=b[c>>0]|0;a=a+1|0;c=c+1|0}return e|0}function lh(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0;c=u;u=u+16|0;d=c+4|0;e=c;f[a>>2]=1232;g=a+4|0;f[g>>2]=0;f[g+4>>2]=0;f[g+8>>2]=0;f[g+12>>2]=0;f[g+16>>2]=0;f[g+20>>2]=0;f[g+24>>2]=0;f[g+28>>2]=0;f[d>>2]=b;b=a+4|0;g=a+8|0;Ri(b,d);h=f[d>>2]|0;i=a+20|0;j=f[i>>2]|0;k=a+16|0;a=f[k>>2]|0;l=j-a>>2;m=a;if((h|0)<(l|0)){n=m;o=h;p=f[g>>2]|0;q=f[b>>2]|0;r=p-q|0;s=r>>2;t=s+-1|0;v=n+(o<<2)|0;f[v>>2]=t;u=c;return}a=h+1|0;f[e>>2]=-1;w=j;if(a>>>0<=l>>>0)if(a>>>0<l>>>0?(j=m+(a<<2)|0,(j|0)!=(w|0)):0){f[i>>2]=w+(~((w+-4-j|0)>>>2)<<2);x=h;y=m}else{x=h;y=m}else{Ch(k,a-l|0,e);x=f[d>>2]|0;y=f[k>>2]|0}n=y;o=x;p=f[g>>2]|0;q=f[b>>2]|0;r=p-q|0;s=r>>2;t=s+-1|0;v=n+(o<<2)|0;f[v>>2]=t;u=c;return}function mh(a){a=a|0;var b=0,c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0;b=a+4|0;c=f[b>>2]|0;d=(f[c+12>>2]|0)-(f[c+8>>2]|0)|0;c=d>>2;a:do if((d|0)>0){e=0;while(1){if(!(Ra[f[(f[a>>2]|0)+36>>2]&127](a,e)|0)){g=0;break}e=e+1|0;h=f[b>>2]|0;i=(f[h+12>>2]|0)-(f[h+8>>2]|0)>>2;if((e|0)>=(i|0)){j=i;break a}}return g|0}else j=c;while(0);c=a+20|0;b=a+24|0;d=f[b>>2]|0;e=f[c>>2]|0;i=d-e>>2;h=e;e=d;if(j>>>0<=i>>>0){if(j>>>0<i>>>0?(d=h+(j<<2)|0,(d|0)!=(e|0)):0)f[b>>2]=e+(~((e+-4-d|0)>>>2)<<2)}else Ci(c,j-i|0);i=f[a+12>>2]|0;j=f[a+8>>2]|0;a=j;if((i|0)==(j|0)){g=1;return g|0}d=i-j>>2;j=0;do{i=f[a+(j<<2)>>2]|0;e=f[i+8>>2]|0;b=f[i+4>>2]|0;i=b;if((e|0)!=(b|0)?(h=f[c>>2]|0,k=e-b>>2,f[h+(f[i>>2]<<2)>>2]=j,k>>>0>1):0){b=1;do{f[h+(f[i+(b<<2)>>2]<<2)>>2]=j;b=b+1|0}while(b>>>0<k>>>0)}j=j+1|0}while(j>>>0<d>>>0);g=1;return g|0}function nh(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;d=f[c+88>>2]|0;if(!d){e=0;return e|0}if((f[d>>2]|0)!=1){e=0;return e|0}g=d+8|0;d=f[g>>2]|0;f[a+4>>2]=h[d>>0]|h[d+1>>0]<<8|h[d+2>>0]<<16|h[d+3>>0]<<24;i=a+8|0;j=c+24|0;c=b[j>>0]|0;k=c<<24>>24;l=a+12|0;m=f[l>>2]|0;n=f[i>>2]|0;o=m-n>>2;p=n;n=m;if(o>>>0>=k>>>0)if(o>>>0>k>>>0?(m=p+(k<<2)|0,(m|0)!=(n|0)):0){f[l>>2]=n+(~((n+-4-m|0)>>>2)<<2);q=c;r=d}else{q=c;r=d}else{Ci(i,k-o|0);q=b[j>>0]|0;r=f[g>>2]|0}g=r+4|0;j=h[g>>0]|h[g+1>>0]<<8|h[g+2>>0]<<16|h[g+3>>0]<<24;if(q<<24>>24>0){g=f[i>>2]|0;i=q<<24>>24;q=j;o=4;k=0;while(1){f[g+(k<<2)>>2]=q;o=o+4|0;k=k+1|0;d=r+o|0;c=h[d>>0]|h[d+1>>0]<<8|h[d+2>>0]<<16|h[d+3>>0]<<24;if((k|0)>=(i|0)){s=c;break}else q=c}}else s=j;f[a+20>>2]=s;e=1;return e|0}function oh(a,c,d,e,g){a=a|0;c=c|0;d=d|0;e=e|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;do if(!(fp(a,f[c+8>>2]|0,g)|0)){if(!(fp(a,f[c>>2]|0,g)|0)){h=f[a+8>>2]|0;Za[f[(f[h>>2]|0)+24>>2]&3](h,c,d,e,g);break}if((f[c+16>>2]|0)!=(d|0)?(h=c+20|0,(f[h>>2]|0)!=(d|0)):0){f[c+32>>2]=e;i=c+44|0;if((f[i>>2]|0)==4)break;j=c+52|0;b[j>>0]=0;k=c+53|0;b[k>>0]=0;l=f[a+8>>2]|0;_a[f[(f[l>>2]|0)+20>>2]&3](l,c,d,d,1,g);if(b[k>>0]|0)if(!(b[j>>0]|0)){m=3;n=11}else o=3;else{m=4;n=11}if((n|0)==11){f[h>>2]=d;h=c+40|0;f[h>>2]=(f[h>>2]|0)+1;if((f[c+36>>2]|0)==1?(f[c+24>>2]|0)==2:0){b[c+54>>0]=1;o=m}else o=m}f[i>>2]=o;break}if((e|0)==1)f[c+32>>2]=1}else Vm(0,c,d,e);while(0);return}function ph(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0;e=u;u=u+16|0;g=e+12|0;h=e+8|0;i=e;f[i>>2]=f[b>>2];f[g>>2]=f[i>>2];i=Kd(a,g,h,e+4|0,c)|0;c=f[i>>2]|0;if(c|0){j=c;u=e;return j|0}c=ln(40)|0;pj(c+16|0,d);pj(c+28|0,d+12|0);d=f[h>>2]|0;f[c>>2]=0;f[c+4>>2]=0;f[c+8>>2]=d;f[i>>2]=c;d=f[f[a>>2]>>2]|0;if(!d)k=c;else{f[a>>2]=d;k=f[i>>2]|0}Oe(f[a+4>>2]|0,k);k=a+8|0;f[k>>2]=(f[k>>2]|0)+1;j=c;u=e;return j|0}function qh(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;e=u;u=u+16|0;g=e;h=a+4|0;f[h>>2]=0;if(!c){u=e;return}i=a+8|0;j=f[i>>2]|0;k=j<<5;if(k>>>0<c>>>0){f[g>>2]=0;l=g+4|0;f[l>>2]=0;m=g+8|0;f[m>>2]=0;if((c|0)<0)aq(a);n=j<<6;j=c+31&-32;vi(g,k>>>0<1073741823?(n>>>0<j>>>0?j:n):2147483647);n=f[a>>2]|0;f[a>>2]=f[g>>2];f[g>>2]=n;g=f[h>>2]|0;f[h>>2]=c;f[l>>2]=g;g=f[i>>2]|0;f[i>>2]=f[m>>2];f[m>>2]=g;if(n|0)Oq(n);o=a}else{f[h>>2]=c;o=a}a=f[o>>2]|0;o=a;h=a;a=c>>>5;n=a<<2;if(!(b[d>>0]|0)){sj(h|0,0,n|0)|0;d=c&31;g=o+(a<<2)|0;if(!d){u=e;return}f[g>>2]=f[g>>2]&~(-1>>>(32-d|0));u=e;return}else{sj(h|0,-1,n|0)|0;n=c&31;c=o+(a<<2)|0;if(!n){u=e;return}f[c>>2]=f[c>>2]|-1>>>(32-n|0);u=e;return}}function rh(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;c=u;u=u+16|0;d=c+8|0;e=c+4|0;g=c;f[g>>2]=f[a+12>>2];h=b+16|0;i=h;j=f[i>>2]|0;k=f[i+4>>2]|0;if((k|0)>0|(k|0)==0&j>>>0>0){l=k;m=j}else{f[e>>2]=f[b+4>>2];f[d>>2]=f[e>>2];Me(b,d,g,g+4|0)|0;j=h;l=f[j+4>>2]|0;m=f[j>>2]|0}f[g>>2]=f[a+20>>2];if((l|0)>0|(l|0)==0&m>>>0>0){n=a+88|0;ld(n,b);u=c;return 1}f[e>>2]=f[b+4>>2];f[d>>2]=f[e>>2];Me(b,d,g,g+4|0)|0;n=a+88|0;ld(n,b);u=c;return 1}function sh(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;c=u;u=u+16|0;d=c+8|0;e=c+4|0;g=c;f[g>>2]=f[a+12>>2];h=b+16|0;i=h;j=f[i>>2]|0;k=f[i+4>>2]|0;if((k|0)>0|(k|0)==0&j>>>0>0){l=k;m=j}else{f[e>>2]=f[b+4>>2];f[d>>2]=f[e>>2];Me(b,d,g,g+4|0)|0;j=h;l=f[j+4>>2]|0;m=f[j>>2]|0}f[g>>2]=f[a+16>>2];if((l|0)>0|(l|0)==0&m>>>0>0){n=a+108|0;ld(n,b);u=c;return 1}f[e>>2]=f[b+4>>2];f[d>>2]=f[e>>2];Me(b,d,g,g+4|0)|0;n=a+108|0;ld(n,b);u=c;return 1}function th(a){a=a|0;var c=0,d=0,e=0,g=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;c=a+32|0;d=f[a+64>>2]|0;e=(Qa[f[(f[d>>2]|0)+40>>2]&127](d)|0)+52|0;d=f[e>>2]|0;zi(c,(((f[d+100>>2]|0)-(f[d+96>>2]|0)|0)/12|0)*3|0,0,1)|0;d=a+68|0;e=f[d>>2]|0;g=(f[a+72>>2]|0)-e|0;if((g|0)<=0){eg(c);return}i=a+48|0;j=a+44|0;a=(g>>>2)+-1|0;g=e;while(1){e=f[g+(a<<2)>>2]|0;k=f[3524+(e<<2)>>2]|0;l=i;m=f[l+4>>2]|0;if((m|0)>0|(m|0)==0&(f[l>>2]|0)>>>0>0?(l=f[j>>2]|0,171>>>e&1|0):0){m=l+4|0;n=0;o=f[m>>2]|0;do{p=o>>>3;q=o&7;r=(f[l>>2]|0)+p|0;b[r>>0]=(1<<q^255)&(h[r>>0]|0);r=(f[l>>2]|0)+p|0;b[r>>0]=(e>>>n&1)<<q|(h[r>>0]|0);o=(f[m>>2]|0)+1|0;f[m>>2]=o;n=n+1|0}while((n|0)!=(k|0))}k=a+-1|0;if((k|0)<=-1)break;a=k;g=f[d>>2]|0}eg(c);return}function uh(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0;g=u;u=u+48|0;h=g;i=g+32|0;if(!c){j=0;u=g;return j|0}Gn(h);do if((dm(c,0)|0)!=-1){if(d){if(!(Qa[f[(f[c>>2]|0)+16>>2]&127](c)|0)){k=0;break}Va[f[(f[c>>2]|0)+20>>2]&127](c)}Yg(i,a,c,h);l=(f[i>>2]|0)==0;m=i+4|0;if((b[m+11>>0]|0)<0)Oq(f[m>>2]|0);if(l){l=f[h>>2]|0;m=h+4|0;rg(e,l,l+((f[m>>2]|0)-l)|0);k=(f[m>>2]|0)-(f[h>>2]|0)|0}else k=0}else k=0;while(0);e=h+12|0;i=f[e>>2]|0;f[e>>2]=0;if(i|0)Oq(i);i=f[h>>2]|0;if(i|0){e=h+4|0;if((f[e>>2]|0)!=(i|0))f[e>>2]=i;Oq(i)}j=k;u=g;return j|0}function vh(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;c=u;u=u+16|0;d=c;e=f[(f[a>>2]|0)+8>>2]|0;g=a+8|0;h=a+12|0;i=(f[h>>2]|0)-(f[g>>2]|0)>>2;j=f[b>>2]|0;f[b>>2]=0;f[d>>2]=j;Xa[e&15](a,i,d);i=f[d>>2]|0;f[d>>2]=0;if(!i){k=f[h>>2]|0;l=f[g>>2]|0;m=k-l|0;n=m>>2;o=n+-1|0;u=c;return o|0}d=i+88|0;a=f[d>>2]|0;f[d>>2]=0;if(a|0){d=f[a+8>>2]|0;if(d|0){e=a+12|0;if((f[e>>2]|0)!=(d|0))f[e>>2]=d;Oq(d)}Oq(a)}a=f[i+68>>2]|0;if(a|0){d=i+72|0;e=f[d>>2]|0;if((e|0)!=(a|0))f[d>>2]=e+(~((e+-4-a|0)>>>2)<<2);Oq(a)}a=i+64|0;e=f[a>>2]|0;f[a>>2]=0;if(e|0){a=f[e>>2]|0;if(a|0){d=e+4|0;if((f[d>>2]|0)!=(a|0))f[d>>2]=a;Oq(a)}Oq(e)}Oq(i);k=f[h>>2]|0;l=f[g>>2]|0;m=k-l|0;n=m>>2;o=n+-1|0;u=c;return o|0}function wh(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0;c=a+8|0;d=f[c>>2]|0;e=a+4|0;g=f[e>>2]|0;if(d-g>>3>>>0>=b>>>0){h=b;i=g;do{j=i;f[j>>2]=0;f[j+4>>2]=0;i=(f[e>>2]|0)+8|0;f[e>>2]=i;h=h+-1|0}while((h|0)!=0);return}h=f[a>>2]|0;i=g-h>>3;g=i+b|0;if(g>>>0>536870911)aq(a);j=d-h|0;h=j>>2;d=j>>3>>>0<268435455?(h>>>0<g>>>0?g:h):536870911;do if(d)if(d>>>0>536870911){h=ra(8)|0;Oo(h,16035);f[h>>2]=7256;va(h|0,1112,110)}else{k=ln(d<<3)|0;break}else k=0;while(0);h=k+(i<<3)|0;i=k+(d<<3)|0;d=b;b=h;k=h;do{g=b;f[g>>2]=0;f[g+4>>2]=0;b=k+8|0;k=b;d=d+-1|0}while((d|0)!=0);d=f[a>>2]|0;b=(f[e>>2]|0)-d|0;g=h+(0-(b>>3)<<3)|0;if((b|0)>0)kh(g|0,d|0,b|0)|0;f[a>>2]=g;f[e>>2]=k;f[c>>2]=i;if(!d)return;Oq(d);return}function xh(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0;d=u;u=u+16|0;e=d;if(!(bn(a,b,c)|0)){g=0;u=d;return g|0}if((Qa[f[(f[a>>2]|0)+32>>2]&127](a)|0)<<24>>24==1?((f[(f[a+8>>2]|0)+28>>2]|0)+-1|0)>>>0>=6:0){g=0;u=d;return g|0}h=_g(c,f[b+48>>2]|0)|0;Xa[f[(f[a>>2]|0)+48>>2]&15](e,a,h);h=a+36|0;b=f[e>>2]|0;f[e>>2]=0;c=f[h>>2]|0;f[h>>2]=b;if(!c){f[e>>2]=0;i=b}else{Va[f[(f[c>>2]|0)+4>>2]&127](c);c=f[e>>2]|0;f[e>>2]=0;if(c|0)Va[f[(f[c>>2]|0)+4>>2]&127](c);i=f[h>>2]|0}if(!i){g=1;u=d;return g|0}if(Ra[f[(f[a>>2]|0)+36>>2]&127](a,i)|0){g=1;u=d;return g|0}i=f[h>>2]|0;f[h>>2]=0;if(!i){g=1;u=d;return g|0}Va[f[(f[i>>2]|0)+4>>2]&127](i);g=1;u=d;return g|0}function yh(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;e=u;u=u+16|0;g=e+4|0;h=e;i=e+8|0;j=a&255;b[i>>0]=j&127;do if(c>>>0>0|(c|0)==0&a>>>0>127){b[i>>0]=j|-128;k=d+16|0;l=f[k+4>>2]|0;if((l|0)>0|(l|0)==0&(f[k>>2]|0)>>>0>0){m=0;break}else{f[h>>2]=f[d+4>>2];f[g>>2]=f[h>>2];Me(d,g,i,i+1|0)|0;k=Yn(a|0,c|0,7)|0;m=yh(k,I,d)|0;break}}else{k=d+16|0;l=f[k+4>>2]|0;if((l|0)>0|(l|0)==0&(f[k>>2]|0)>>>0>0){m=0;break}f[h>>2]=f[d+4>>2];f[g>>2]=f[h>>2];Me(d,g,i,i+1|0)|0;n=1;u=e;return n|0}while(0);n=m;u=e;return n|0}function zh(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0;g=f[(f[(f[d+4>>2]|0)+8>>2]|0)+(c<<2)>>2]|0;if((b|0)==-1)h=Xi(c,d)|0;else h=b;if((h|0)==-2)i=0;else{do if((Qa[f[(f[d>>2]|0)+8>>2]&127](d)|0)==1){Xf(a,d,h,c,e,514);if(!(f[a>>2]|0)){f[a>>2]=0;break}else return}while(0);c=ln(44)|0;f[c>>2]=1544;f[c+4>>2]=g;g=c+8|0;f[g>>2]=f[e>>2];f[g+4>>2]=f[e+4>>2];f[g+8>>2]=f[e+8>>2];f[g+12>>2]=f[e+12>>2];f[g+16>>2]=f[e+16>>2];f[g+20>>2]=f[e+20>>2];fk(c+32|0,e+24|0);f[c>>2]=1600;i=c}f[a>>2]=i;return}function Ah(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;e=u;u=u+224|0;g=e+120|0;h=e+80|0;i=e;j=e+136|0;k=h;l=k+40|0;do{f[k>>2]=0;k=k+4|0}while((k|0)<(l|0));f[g>>2]=f[d>>2];if((qb(0,c,g,i,h)|0)<0)m=-1;else{if((f[a+76>>2]|0)>-1)n=Tq(a)|0;else n=0;d=f[a>>2]|0;k=d&32;if((b[a+74>>0]|0)<1)f[a>>2]=d&-33;d=a+48|0;if(!(f[d>>2]|0)){l=a+44|0;o=f[l>>2]|0;f[l>>2]=j;p=a+28|0;f[p>>2]=j;q=a+20|0;f[q>>2]=j;f[d>>2]=80;r=a+16|0;f[r>>2]=j+80;j=qb(a,c,g,i,h)|0;if(!o)s=j;else{Sa[f[a+36>>2]&31](a,0,0)|0;t=(f[q>>2]|0)==0?-1:j;f[l>>2]=o;f[d>>2]=0;f[r>>2]=0;f[p>>2]=0;f[q>>2]=0;s=t}}else s=qb(a,c,g,i,h)|0;h=f[a>>2]|0;f[a>>2]=h|k;if(n|0)Sq(a);m=(h&32|0)==0?s:-1}u=e;return m|0}function Bh(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0;c=a+4|0;d=f[c>>2]|0;e=f[a>>2]|0;g=d-e>>2;h=d;if(g>>>0<b>>>0){uf(a,b-g|0);return}if(g>>>0<=b>>>0)return;g=e+(b<<2)|0;if((g|0)==(h|0))return;else i=h;do{h=i+-4|0;f[c>>2]=h;b=f[h>>2]|0;f[h>>2]=0;if(b|0){h=b+88|0;e=f[h>>2]|0;f[h>>2]=0;if(e|0){h=f[e+8>>2]|0;if(h|0){a=e+12|0;if((f[a>>2]|0)!=(h|0))f[a>>2]=h;Oq(h)}Oq(e)}e=f[b+68>>2]|0;if(e|0){h=b+72|0;a=f[h>>2]|0;if((a|0)!=(e|0))f[h>>2]=a+(~((a+-4-e|0)>>>2)<<2);Oq(e)}e=b+64|0;a=f[e>>2]|0;f[e>>2]=0;if(a|0){e=f[a>>2]|0;if(e|0){h=a+4|0;if((f[h>>2]|0)!=(e|0))f[h>>2]=e;Oq(e)}Oq(a)}Oq(b)}i=f[c>>2]|0}while((i|0)!=(g|0));return}function Ch(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;d=a+8|0;e=f[d>>2]|0;g=a+4|0;h=f[g>>2]|0;i=h;if(e-h>>2>>>0>=b>>>0){j=b;k=i;while(1){f[k>>2]=f[c>>2];j=j+-1|0;if(!j)break;else k=k+4|0}f[g>>2]=i+(b<<2);return}i=f[a>>2]|0;k=h-i|0;h=k>>2;j=h+b|0;if(j>>>0>1073741823)aq(a);l=e-i|0;e=l>>1;m=l>>2>>>0<536870911?(e>>>0<j>>>0?j:e):1073741823;do if(m)if(m>>>0>1073741823){e=ra(8)|0;Oo(e,16035);f[e>>2]=7256;va(e|0,1112,110)}else{e=ln(m<<2)|0;n=e;o=e;break}else{n=0;o=0}while(0);e=n+(h<<2)|0;h=n+(m<<2)|0;m=b;j=e;while(1){f[j>>2]=f[c>>2];m=m+-1|0;if(!m)break;else j=j+4|0}if((k|0)>0)kh(o|0,i|0,k|0)|0;f[a>>2]=n;f[g>>2]=e+(b<<2);f[d>>2]=h;if(!i)return;Oq(i);return}function Dh(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;e=(f[a>>2]|0)+1794895138|0;g=gp(f[a+8>>2]|0,e)|0;h=gp(f[a+12>>2]|0,e)|0;i=gp(f[a+16>>2]|0,e)|0;a:do if((g>>>0<c>>>2>>>0?(j=c-(g<<2)|0,h>>>0<j>>>0&i>>>0<j>>>0):0)?((i|h)&3|0)==0:0){j=h>>>2;k=i>>>2;l=0;m=g;while(1){n=m>>>1;o=l+n|0;p=o<<1;q=p+j|0;r=gp(f[a+(q<<2)>>2]|0,e)|0;s=gp(f[a+(q+1<<2)>>2]|0,e)|0;if(!(s>>>0<c>>>0&r>>>0<(c-s|0)>>>0)){t=0;break a}if(b[a+(s+r)>>0]|0){t=0;break a}r=hl(d,a+s|0)|0;if(!r)break;s=(r|0)<0;if((m|0)==1){t=0;break a}else{l=s?l:o;m=s?n:m-n|0}}m=p+k|0;l=gp(f[a+(m<<2)>>2]|0,e)|0;j=gp(f[a+(m+1<<2)>>2]|0,e)|0;if(j>>>0<c>>>0&l>>>0<(c-j|0)>>>0)t=(b[a+(j+l)>>0]|0)==0?a+j|0:0;else t=0}else t=0;while(0);return t|0}function Eh(a,c,e,g){a=a|0;c=c|0;e=e|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;h=u;u=u+64|0;i=h;j=f[a>>2]|0;k=a+(f[j+-8>>2]|0)|0;l=f[j+-4>>2]|0;f[i>>2]=e;f[i+4>>2]=a;f[i+8>>2]=c;f[i+12>>2]=g;g=i+16|0;c=i+20|0;a=i+24|0;j=i+28|0;m=i+32|0;n=i+40|0;o=g;p=o+36|0;do{f[o>>2]=0;o=o+4|0}while((o|0)<(p|0));d[g+36>>1]=0;b[g+38>>0]=0;a:do if(fp(l,e,0)|0){f[i+48>>2]=1;_a[f[(f[l>>2]|0)+20>>2]&3](l,i,k,k,1,0);q=(f[a>>2]|0)==1?k:0}else{Za[f[(f[l>>2]|0)+24>>2]&3](l,i,k,1,0);switch(f[i+36>>2]|0){case 0:{q=(f[n>>2]|0)==1&(f[j>>2]|0)==1&(f[m>>2]|0)==1?f[c>>2]|0:0;break a;break}case 1:break;default:{q=0;break a}}if((f[a>>2]|0)!=1?!((f[n>>2]|0)==0&(f[j>>2]|0)==1&(f[m>>2]|0)==1):0){q=0;break}q=f[g>>2]|0}while(0);u=h;return q|0}function Fh(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;c=a+8|0;d=f[c>>2]|0;e=a+4|0;g=f[e>>2]|0;h=g;if(d-g>>2>>>0>=b>>>0){i=b;j=h;while(1){f[j>>2]=1;i=i+-1|0;if(!i)break;else j=j+4|0}f[e>>2]=h+(b<<2);return}h=f[a>>2]|0;j=g-h|0;g=j>>2;i=g+b|0;if(i>>>0>1073741823)aq(a);k=d-h|0;d=k>>1;l=k>>2>>>0<536870911?(d>>>0<i>>>0?i:d):1073741823;do if(l)if(l>>>0>1073741823){d=ra(8)|0;Oo(d,16035);f[d>>2]=7256;va(d|0,1112,110)}else{d=ln(l<<2)|0;m=d;n=d;break}else{m=0;n=0}while(0);d=m+(g<<2)|0;g=m+(l<<2)|0;l=b;i=d;while(1){f[i>>2]=1;l=l+-1|0;if(!l)break;else i=i+4|0}if((j|0)>0)kh(n|0,h|0,j|0)|0;f[a>>2]=m;f[e>>2]=d+(b<<2);f[c>>2]=g;if(!h)return;Oq(h);return}function Gh(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0;d=u;u=u+16|0;e=d;if(!c){g=0;u=d;return g|0}h=a+84|0;i=f[h>>2]|0;j=a+88|0;k=f[j>>2]|0;if((k|0)!=(i|0))f[j>>2]=k+(~((k+-4-i|0)>>>2)<<2);f[h>>2]=0;f[j>>2]=0;f[a+92>>2]=0;if(i|0)Oq(i);i=a+72|0;j=f[i>>2]|0;h=a+76|0;if((f[h>>2]|0)!=(j|0))f[h>>2]=j;f[i>>2]=0;f[h>>2]=0;f[a+80>>2]=0;if(j|0)Oq(j);j=c+4|0;h=(f[j>>2]|0)-(f[c>>2]|0)>>2;b[e>>0]=0;qh(a,h,e);h=c+24|0;i=c+28|0;k=(f[i>>2]|0)-(f[h>>2]|0)>>2;b[e>>0]=0;qh(a+12|0,k,e);hg(a+28|0,(f[j>>2]|0)-(f[c>>2]|0)>>2,6180);gk(a+52|0,(f[i>>2]|0)-(f[h>>2]|0)>>2);gk(a+40|0,(f[i>>2]|0)-(f[h>>2]|0)>>2);f[a+64>>2]=c;b[a+24>>0]=1;g=1;u=d;return g|0}function Hh(a){a=a|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0;c=a+12|0;d=f[a>>2]|0;e=a+8|0;g=f[e>>2]|0;h=(g|0)==-1;if(!(b[c>>0]|0)){do if((!h?(i=(((g>>>0)%3|0|0)==0?2:-1)+g|0,(i|0)!=-1):0)?(j=f[(f[d+12>>2]|0)+(i<<2)>>2]|0,(j|0)!=-1):0)if(!((j>>>0)%3|0)){k=j+2|0;break}else{k=j+-1|0;break}else k=-1;while(0);f[e>>2]=k;return}k=g+1|0;if((!h?(h=((k>>>0)%3|0|0)==0?g+-2|0:k,(h|0)!=-1):0)?(k=f[(f[d+12>>2]|0)+(h<<2)>>2]|0,h=k+1|0,(k|0)!=-1):0){g=((h>>>0)%3|0|0)==0?k+-2|0:h;f[e>>2]=g;if((g|0)!=-1){if((g|0)!=(f[a+4>>2]|0))return;f[e>>2]=-1;return}}else f[e>>2]=-1;g=f[a+4>>2]|0;do if(((g|0)!=-1?(a=(((g>>>0)%3|0|0)==0?2:-1)+g|0,(a|0)!=-1):0)?(h=f[(f[d+12>>2]|0)+(a<<2)>>2]|0,(h|0)!=-1):0)if(!((h>>>0)%3|0)){l=h+2|0;break}else{l=h+-1|0;break}else l=-1;while(0);f[e>>2]=l;b[c>>0]=0;return}function Ih(a,b){a=a|0;b=b|0;var c=0,d=Oa,e=0,g=0;if((b|0)!=1)if(!(b+-1&b))c=b;else c=cb(b)|0;else c=2;b=f[a+4>>2]|0;if(c>>>0>b>>>0){Td(a,c);return}if(c>>>0>=b>>>0)return;d=$((f[a+12>>2]|0)>>>0);e=~~$(W($(d/$(n[a+20>>2]))))>>>0;if(b>>>0>2&(b+-1&b|0)==0)g=1<<32-(_(e+-1|0)|0);else g=cb(e)|0;e=c>>>0<g>>>0?g:c;if(e>>>0>=b>>>0)return;Td(a,e);return}function Jh(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;d=f[a+4>>2]|0;if(!d){e=0;return e|0}a=b[c+11>>0]|0;g=a<<24>>24<0;h=g?f[c+4>>2]|0:a&255;a=g?f[c>>2]|0:c;c=d;while(1){d=c+16|0;g=b[d+11>>0]|0;i=g<<24>>24<0;j=i?f[c+20>>2]|0:g&255;g=j>>>0<h>>>0;k=g?j:h;if((k|0)!=0?(l=Vk(a,i?f[d>>2]|0:d,k)|0,(l|0)!=0):0)if((l|0)<0)m=7;else m=8;else if(h>>>0<j>>>0)m=7;else m=8;if((m|0)==7){m=0;n=c}else if((m|0)==8){m=0;l=h>>>0<j>>>0?h:j;if((l|0)!=0?(j=Vk(i?f[d>>2]|0:d,a,l)|0,(j|0)!=0):0){if((j|0)>=0){e=1;m=14;break}}else m=10;if((m|0)==10?(m=0,!g):0){e=1;m=14;break}n=c+4|0}c=f[n>>2]|0;if(!c){e=0;m=14;break}}if((m|0)==14)return e|0;return 0}function Kh(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;e=u;u=u+16|0;g=e+4|0;h=e;i=f[a+8>>2]|0;j=i+24|0;k=b[j>>0]|0;l=c+4|0;ag(a,(f[l>>2]|0)-(f[c>>2]|0)>>2,k,d);d=f[a+32>>2]|0;a=(f[f[d>>2]>>2]|0)+(f[d+48>>2]|0)|0;d=f[c>>2]|0;c=f[l>>2]|0;if((d|0)==(c|0)){m=1;u=e;return m|0}l=i+84|0;n=i+68|0;o=0;p=d;while(1){d=f[p>>2]|0;if(!(b[l>>0]|0))q=f[(f[n>>2]|0)+(d<<2)>>2]|0;else q=d;f[h>>2]=q;d=b[j>>0]|0;f[g>>2]=f[h>>2];if(!(Qb(i,g,d,a+(o<<2)|0)|0)){m=0;r=7;break}p=p+4|0;if((p|0)==(c|0)){m=1;r=7;break}else o=o+k|0}if((r|0)==7){u=e;return m|0}return 0}function Lh(a){a=a|0;var b=0,c=0,d=0,e=0,g=0,h=0,i=0;f[a>>2]=1408;b=a+72|0;c=f[b>>2]|0;f[b>>2]=0;if(c|0)Va[f[(f[c>>2]|0)+4>>2]&127](c);c=f[a+60>>2]|0;if(c|0){b=a+64|0;d=f[b>>2]|0;if((d|0)!=(c|0))f[b>>2]=d+(~((d+-4-c|0)>>>2)<<2);Oq(c)}c=f[a+48>>2]|0;if(c|0)Oq(c);c=a+36|0;d=f[c>>2]|0;if(d|0){b=a+40|0;e=f[b>>2]|0;if((e|0)==(d|0))g=d;else{h=e;do{e=h+-4|0;f[b>>2]=e;i=f[e>>2]|0;f[e>>2]=0;if(i|0)Va[f[(f[i>>2]|0)+4>>2]&127](i);h=f[b>>2]|0}while((h|0)!=(d|0));g=f[c>>2]|0}Oq(g)}f[a>>2]=1232;g=f[a+16>>2]|0;if(g|0){c=a+20|0;d=f[c>>2]|0;if((d|0)!=(g|0))f[c>>2]=d+(~((d+-4-g|0)>>>2)<<2);Oq(g)}g=f[a+4>>2]|0;if(!g)return;d=a+8|0;a=f[d>>2]|0;if((a|0)!=(g|0))f[d>>2]=a+(~((a+-4-g|0)>>>2)<<2);Oq(g);return}function Mh(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;f[a>>2]=d;e=a+24|0;g=a+28|0;h=f[g>>2]|0;i=f[e>>2]|0;j=h-i>>2;k=i;i=h;if(j>>>0>=d>>>0){if(j>>>0>d>>>0?(h=k+(d<<2)|0,(h|0)!=(i|0)):0)f[g>>2]=i+(~((i+-4-h|0)>>>2)<<2)}else Ci(e,d-j|0);if(!c)return;j=f[b>>2]|0;if((c|0)>1){d=j;e=j;h=1;while(1){i=f[b+(h<<2)>>2]|0;g=(i|0)<(e|0);k=g?i:e;l=g?d:(i|0)>(d|0)?i:d;h=h+1|0;if((h|0)==(c|0)){m=l;n=k;break}else{d=l;e=k}}}else{m=j;n=j}f[a+4>>2]=n;f[a+8>>2]=m;j=Xn(m|0,((m|0)<0)<<31>>31|0,n|0,((n|0)<0)<<31>>31|0)|0;n=I;if(!(n>>>0<0|(n|0)==0&j>>>0<2147483647))return;n=j+1|0;f[a+12>>2]=n;j=(n|0)/2|0;m=a+16|0;f[m>>2]=j;f[a+20>>2]=0-j;if(n&1|0)return;f[m>>2]=j+-1;return}function Nh(a){a=a|0;Fj(a+992|0);Fj(a+960|0);Fj(a+928|0);Fj(a+896|0);Fj(a+864|0);Fj(a+832|0);Fj(a+800|0);Fj(a+768|0);Fj(a+736|0);Fj(a+704|0);Fj(a+672|0);Fj(a+640|0);Fj(a+608|0);Fj(a+576|0);Fj(a+544|0);Fj(a+512|0);Fj(a+480|0);Fj(a+448|0);Fj(a+416|0);Fj(a+384|0);Fj(a+352|0);Fj(a+320|0);Fj(a+288|0);Fj(a+256|0);Fj(a+224|0);Fj(a+192|0);Fj(a+160|0);Fj(a+128|0);Fj(a+96|0);Fj(a+64|0);Fj(a+32|0);Fj(a);return}function Oh(a){a=a|0;wn(a);wn(a+32|0);wn(a+64|0);wn(a+96|0);wn(a+128|0);wn(a+160|0);wn(a+192|0);wn(a+224|0);wn(a+256|0);wn(a+288|0);wn(a+320|0);wn(a+352|0);wn(a+384|0);wn(a+416|0);wn(a+448|0);wn(a+480|0);wn(a+512|0);wn(a+544|0);wn(a+576|0);wn(a+608|0);wn(a+640|0);wn(a+672|0);wn(a+704|0);wn(a+736|0);wn(a+768|0);wn(a+800|0);wn(a+832|0);wn(a+864|0);wn(a+896|0);wn(a+928|0);wn(a+960|0);wn(a+992|0);return}function Ph(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0;c=u;u=u+16|0;d=c+12|0;e=c+8|0;g=c+4|0;h=c;i=(a|0)==(b|0);if(!i){f[g>>2]=f[b>>2];f[h>>2]=b+4;f[e>>2]=f[g>>2];f[d>>2]=f[h>>2];Oc(a,e,d)}if(!i){f[g>>2]=f[b+12>>2];f[h>>2]=b+16;f[e>>2]=f[g>>2];f[d>>2]=f[h>>2];Hc(a+12|0,e,d)}if(i){u=c;return}f[g>>2]=f[b+24>>2];f[h>>2]=b+28;f[e>>2]=f[g>>2];f[d>>2]=f[h>>2];Oc(a+24|0,e,d);u=c;return}function Qh(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0;a=u;u=u+16|0;e=a;if((c|0)<0|((b|0)==0|(d|0)==0)){g=0;u=a;return g|0}h=f[b+8>>2]|0;if(((f[b+12>>2]|0)-h>>2|0)<=(c|0)){g=0;u=a;return g|0}i=b+4|0;if(!(f[i>>2]|0)){j=ln(52)|0;f[j>>2]=0;f[j+4>>2]=0;f[j+8>>2]=0;f[j+12>>2]=0;n[j+16>>2]=$(1.0);k=j+20|0;f[k>>2]=0;f[k+4>>2]=0;f[k+8>>2]=0;f[k+12>>2]=0;n[j+36>>2]=$(1.0);f[j+40>>2]=0;f[j+44>>2]=0;f[j+48>>2]=0;f[b+4>>2]=j}j=f[(f[h+(c<<2)>>2]|0)+60>>2]|0;c=ln(44)|0;Ub(c,d);f[c+40>>2]=j;j=f[i>>2]|0;f[e>>2]=c;mk(j,e)|0;j=f[e>>2]|0;f[e>>2]=0;if(!j){g=1;u=a;return g|0}bj(j);Oq(j);g=1;u=a;return g|0}function Rh(a,c,d,e,g,h,i){a=a|0;c=c|0;d=d|0;e=e|0;g=g|0;h=h|0;i=i|0;var j=0,k=0;c=u;u=u+64|0;j=c;k=i?6:5;Il(j);i=f[h+56>>2]|0;h=X(Vl(k)|0,e)|0;Jj(j,i,0,e&255,k,0,h,((h|0)<0)<<31>>31,0,0);h=ln(96)|0;tl(h,j);f[a>>2]=h;Bj(h,d)|0;d=h+84|0;if(!g){b[d>>0]=1;a=f[h+68>>2]|0;j=h+72|0;k=f[j>>2]|0;if((k|0)==(a|0)){u=c;return}f[j>>2]=k+(~((k+-4-a|0)>>>2)<<2);u=c;return}b[d>>0]=0;d=h+68|0;a=h+72|0;h=f[a>>2]|0;k=f[d>>2]|0;j=h-k>>2;e=h;if(j>>>0<g>>>0){Ch(d,g-j|0,1216);u=c;return}if(j>>>0<=g>>>0){u=c;return}j=k+(g<<2)|0;if((j|0)==(e|0)){u=c;return}f[a>>2]=e+(~((e+-4-j|0)>>>2)<<2);u=c;return}function Sh(a,b){a=a|0;b=b|0;var c=0,d=Oa,e=0,g=0;if((b|0)!=1)if(!(b+-1&b))c=b;else c=cb(b)|0;else c=2;b=f[a+4>>2]|0;if(c>>>0>b>>>0){rd(a,c);return}if(c>>>0>=b>>>0)return;d=$((f[a+12>>2]|0)>>>0);e=~~$(W($(d/$(n[a+16>>2]))))>>>0;if(b>>>0>2&(b+-1&b|0)==0)g=1<<32-(_(e+-1|0)|0);else g=cb(e)|0;e=c>>>0<g>>>0?g:c;if(e>>>0>=b>>>0)return;rd(a,e);return}function Th(a,b){a=a|0;b=b|0;var c=0,d=Oa,e=0,g=0;if((b|0)!=1)if(!(b+-1&b))c=b;else c=cb(b)|0;else c=2;b=f[a+4>>2]|0;if(c>>>0>b>>>0){vd(a,c);return}if(c>>>0>=b>>>0)return;d=$((f[a+12>>2]|0)>>>0);e=~~$(W($(d/$(n[a+16>>2]))))>>>0;if(b>>>0>2&(b+-1&b|0)==0)g=1<<32-(_(e+-1|0)|0);else g=cb(e)|0;e=c>>>0<g>>>0?g:c;if(e>>>0>=b>>>0)return;vd(a,e);return}function Uh(a,b){a=a|0;b=b|0;var c=0,d=Oa,e=0,g=0;if((b|0)!=1)if(!(b+-1&b))c=b;else c=cb(b)|0;else c=2;b=f[a+4>>2]|0;if(c>>>0>b>>>0){Fd(a,c);return}if(c>>>0>=b>>>0)return;d=$((f[a+12>>2]|0)>>>0);e=~~$(W($(d/$(n[a+16>>2]))))>>>0;if(b>>>0>2&(b+-1&b|0)==0)g=1<<32-(_(e+-1|0)|0);else g=cb(e)|0;e=c>>>0<g>>>0?g:c;if(e>>>0>=b>>>0)return;Fd(a,e);return}function Vh(a,b){a=a|0;b=b|0;var c=0,d=Oa,e=0,g=0;if((b|0)!=1)if(!(b+-1&b))c=b;else c=cb(b)|0;else c=2;b=f[a+4>>2]|0;if(c>>>0>b>>>0){Pd(a,c);return}if(c>>>0>=b>>>0)return;d=$((f[a+12>>2]|0)>>>0);e=~~$(W($(d/$(n[a+16>>2]))))>>>0;if(b>>>0>2&(b+-1&b|0)==0)g=1<<32-(_(e+-1|0)|0);else g=cb(e)|0;e=c>>>0<g>>>0?g:c;if(e>>>0>=b>>>0)return;Pd(a,e);return}function Wh(a,b){a=a|0;b=b|0;var c=0,d=Oa,e=0,g=0;if((b|0)!=1)if(!(b+-1&b))c=b;else c=cb(b)|0;else c=2;b=f[a+4>>2]|0;if(c>>>0>b>>>0){ud(a,c);return}if(c>>>0>=b>>>0)return;d=$((f[a+12>>2]|0)>>>0);e=~~$(W($(d/$(n[a+16>>2]))))>>>0;if(b>>>0>2&(b+-1&b|0)==0)g=1<<32-(_(e+-1|0)|0);else g=cb(e)|0;e=c>>>0<g>>>0?g:c;if(e>>>0>=b>>>0)return;ud(a,e);return}function Xh(a,b){a=a|0;b=b|0;var c=0,d=Oa,e=0,g=0;if((b|0)!=1)if(!(b+-1&b))c=b;else c=cb(b)|0;else c=2;b=f[a+4>>2]|0;if(c>>>0>b>>>0){zd(a,c);return}if(c>>>0>=b>>>0)return;d=$((f[a+12>>2]|0)>>>0);e=~~$(W($(d/$(n[a+16>>2]))))>>>0;if(b>>>0>2&(b+-1&b|0)==0)g=1<<32-(_(e+-1|0)|0);else g=cb(e)|0;e=c>>>0<g>>>0?g:c;if(e>>>0>=b>>>0)return;zd(a,e);return}function Yh(a,b){a=a|0;b=b|0;var c=0,d=Oa,e=0,g=0;if((b|0)!=1)if(!(b+-1&b))c=b;else c=cb(b)|0;else c=2;b=f[a+4>>2]|0;if(c>>>0>b>>>0){Jd(a,c);return}if(c>>>0>=b>>>0)return;d=$((f[a+12>>2]|0)>>>0);e=~~$(W($(d/$(n[a+16>>2]))))>>>0;if(b>>>0>2&(b+-1&b|0)==0)g=1<<32-(_(e+-1|0)|0);else g=cb(e)|0;e=c>>>0<g>>>0?g:c;if(e>>>0>=b>>>0)return;Jd(a,e);return}function Zh(a,b){a=a|0;b=b|0;var c=0,d=Oa,e=0,g=0;if((b|0)!=1)if(!(b+-1&b))c=b;else c=cb(b)|0;else c=2;b=f[a+4>>2]|0;if(c>>>0>b>>>0){sd(a,c);return}if(c>>>0>=b>>>0)return;d=$((f[a+12>>2]|0)>>>0);e=~~$(W($(d/$(n[a+16>>2]))))>>>0;if(b>>>0>2&(b+-1&b|0)==0)g=1<<32-(_(e+-1|0)|0);else g=cb(e)|0;e=c>>>0<g>>>0?g:c;if(e>>>0>=b>>>0)return;sd(a,e);return}function _h(a,b){a=a|0;b=b|0;var c=0,d=Oa,e=0,g=0;if((b|0)!=1)if(!(b+-1&b))c=b;else c=cb(b)|0;else c=2;b=f[a+4>>2]|0;if(c>>>0>b>>>0){wd(a,c);return}if(c>>>0>=b>>>0)return;d=$((f[a+12>>2]|0)>>>0);e=~~$(W($(d/$(n[a+16>>2]))))>>>0;if(b>>>0>2&(b+-1&b|0)==0)g=1<<32-(_(e+-1|0)|0);else g=cb(e)|0;e=c>>>0<g>>>0?g:c;if(e>>>0>=b>>>0)return;wd(a,e);return}function $h(a,b){a=a|0;b=b|0;var c=0,d=Oa,e=0,g=0;if((b|0)!=1)if(!(b+-1&b))c=b;else c=cb(b)|0;else c=2;b=f[a+4>>2]|0;if(c>>>0>b>>>0){Gd(a,c);return}if(c>>>0>=b>>>0)return;d=$((f[a+12>>2]|0)>>>0);e=~~$(W($(d/$(n[a+16>>2]))))>>>0;if(b>>>0>2&(b+-1&b|0)==0)g=1<<32-(_(e+-1|0)|0);else g=cb(e)|0;e=c>>>0<g>>>0?g:c;if(e>>>0>=b>>>0)return;Gd(a,e);return}function ai(a,b){a=a|0;b=b|0;var c=0,d=Oa,e=0,g=0;if((b|0)!=1)if(!(b+-1&b))c=b;else c=cb(b)|0;else c=2;b=f[a+4>>2]|0;if(c>>>0>b>>>0){Qd(a,c);return}if(c>>>0>=b>>>0)return;d=$((f[a+12>>2]|0)>>>0);e=~~$(W($(d/$(n[a+16>>2]))))>>>0;if(b>>>0>2&(b+-1&b|0)==0)g=1<<32-(_(e+-1|0)|0);else g=cb(e)|0;e=c>>>0<g>>>0?g:c;if(e>>>0>=b>>>0)return;Qd(a,e);return}function bi(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;g=u;u=u+16|0;h=g;f[h>>2]=0;f[h+4>>2]=0;f[h+8>>2]=0;i=ln(16)|0;f[h>>2]=i;f[h+8>>2]=-2147483632;f[h+4>>2]=15;j=i;k=14479;l=j+15|0;do{b[j>>0]=b[k>>0]|0;j=j+1|0;k=k+1|0}while((j|0)<(l|0));b[i+15>>0]=0;i=Hk(c,h,-1)|0;if((b[h+11>>0]|0)<0)Oq(f[h>>2]|0);switch(i|0){case -1:{if((mi(c)|0)==10)m=6;else m=5;break}case 1:{m=5;break}default:m=6}if((m|0)==5){i=ln(60)|0;Lo(i);n=i}else if((m|0)==6){m=ln(56)|0;tp(m);n=m}xo(n,d);Md(a,n,c,e);Va[f[(f[n>>2]|0)+4>>2]&127](n);u=g;return}function ci(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0;d=u;u=u+16|0;e=d+4|0;g=d;h=d+8|0;b[h>>0]=a&127;do if(a>>>0>127){b[h>>0]=a|128;i=c+16|0;j=f[i+4>>2]|0;if((j|0)>0|(j|0)==0&(f[i>>2]|0)>>>0>0){k=0;break}else{f[g>>2]=f[c+4>>2];f[e>>2]=f[g>>2];Me(c,e,h,h+1|0)|0;k=ci(a>>>7,c)|0;break}}else{i=c+16|0;j=f[i+4>>2]|0;if((j|0)>0|(j|0)==0&(f[i>>2]|0)>>>0>0){k=0;break}f[g>>2]=f[c+4>>2];f[e>>2]=f[g>>2];Me(c,e,h,h+1|0)|0;l=1;u=d;return l|0}while(0);l=k;u=d;return l|0}\nfunction vc(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0;e=u;u=u+32|0;g=e+16|0;h=e+12|0;i=e+8|0;j=e+4|0;k=e;switch(f[c+28>>2]|0){case 9:{l=f[d>>2]|0;switch(b[c+24>>0]|0){case 1:{f[h>>2]=l;f[g>>2]=f[h>>2];m=hc(a,c,g)|0;break}case 2:{f[i>>2]=l;f[g>>2]=f[i>>2];m=Wb(a,c,g)|0;break}case 3:{f[j>>2]=l;f[g>>2]=f[j>>2];m=uc(a,c,g)|0;break}case 4:{f[k>>2]=l;f[g>>2]=f[k>>2];m=mc(a,c,g)|0;break}default:m=0}n=m;break}case 1:{m=f[d>>2]|0;switch(b[c+24>>0]|0){case 1:{f[h>>2]=m;f[g>>2]=f[h>>2];o=gc(a,c,g)|0;break}case 2:{f[i>>2]=m;f[g>>2]=f[i>>2];o=Xb(a,c,g)|0;break}case 3:{f[j>>2]=m;f[g>>2]=f[j>>2];o=sc(a,c,g)|0;break}case 4:{f[k>>2]=m;f[g>>2]=f[k>>2];o=lc(a,c,g)|0;break}default:o=0}n=o;break}case 11:case 2:{o=f[d>>2]|0;switch(b[c+24>>0]|0){case 1:{f[h>>2]=o;f[g>>2]=f[h>>2];p=gc(a,c,g)|0;break}case 2:{f[i>>2]=o;f[g>>2]=f[i>>2];p=Xb(a,c,g)|0;break}case 3:{f[j>>2]=o;f[g>>2]=f[j>>2];p=sc(a,c,g)|0;break}case 4:{f[k>>2]=o;f[g>>2]=f[k>>2];p=lc(a,c,g)|0;break}default:p=0}n=p;break}case 4:{p=f[d>>2]|0;switch(b[c+24>>0]|0){case 1:{f[h>>2]=p;f[g>>2]=f[h>>2];q=ec(a,c,g)|0;break}case 2:{f[i>>2]=p;f[g>>2]=f[i>>2];q=Vb(a,c,g)|0;break}case 3:{f[j>>2]=p;f[g>>2]=f[j>>2];q=nc(a,c,g)|0;break}case 4:{f[k>>2]=p;f[g>>2]=f[k>>2];q=jc(a,c,g)|0;break}default:q=0}n=q;break}case 3:{q=f[d>>2]|0;switch(b[c+24>>0]|0){case 1:{f[h>>2]=q;f[g>>2]=f[h>>2];r=ec(a,c,g)|0;break}case 2:{f[i>>2]=q;f[g>>2]=f[i>>2];r=Vb(a,c,g)|0;break}case 3:{f[j>>2]=q;f[g>>2]=f[j>>2];r=nc(a,c,g)|0;break}case 4:{f[k>>2]=q;f[g>>2]=f[k>>2];r=jc(a,c,g)|0;break}default:r=0}n=r;break}case 6:{r=f[d>>2]|0;switch(b[c+24>>0]|0){case 1:{f[h>>2]=r;f[g>>2]=f[h>>2];s=hc(a,c,g)|0;break}case 2:{f[i>>2]=r;f[g>>2]=f[i>>2];s=Wb(a,c,g)|0;break}case 3:{f[j>>2]=r;f[g>>2]=f[j>>2];s=uc(a,c,g)|0;break}case 4:{f[k>>2]=r;f[g>>2]=f[k>>2];s=mc(a,c,g)|0;break}default:s=0}n=s;break}case 5:{s=f[d>>2]|0;switch(b[c+24>>0]|0){case 1:{f[h>>2]=s;f[g>>2]=f[h>>2];t=hc(a,c,g)|0;break}case 2:{f[i>>2]=s;f[g>>2]=f[i>>2];t=Wb(a,c,g)|0;break}case 3:{f[j>>2]=s;f[g>>2]=f[j>>2];t=uc(a,c,g)|0;break}case 4:{f[k>>2]=s;f[g>>2]=f[k>>2];t=mc(a,c,g)|0;break}default:t=0}n=t;break}default:{v=-1;u=e;return v|0}}v=(n|0)==0?-1:n;u=e;return v|0}function wc(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0;e=u;u=u+32|0;g=e+16|0;h=e+12|0;i=e+29|0;j=e;k=e+28|0;if(!(f[(f[a+8>>2]|0)+80>>2]|0)){l=1;u=e;return l|0}b[i>>0]=-2;m=a+36|0;n=f[m>>2]|0;if(n)if(Ra[f[(f[a>>2]|0)+40>>2]&127](a,n)|0){n=f[m>>2]|0;o=(Qa[f[(f[n>>2]|0)+8>>2]&127](n)|0)&255;b[i>>0]=o;p=5}else q=0;else p=5;if((p|0)==5){o=d+16|0;n=o;r=f[n+4>>2]|0;if(!((r|0)>0|(r|0)==0&(f[n>>2]|0)>>>0>0)){f[h>>2]=f[d+4>>2];f[g>>2]=f[h>>2];Me(d,g,i,i+1|0)|0}i=f[m>>2]|0;if(i|0?(n=(Qa[f[(f[i>>2]|0)+36>>2]&127](i)|0)&255,b[j>>0]=n,n=o,i=f[n+4>>2]|0,!((i|0)>0|(i|0)==0&(f[n>>2]|0)>>>0>0)):0){f[h>>2]=f[d+4>>2];f[g>>2]=f[h>>2];Me(d,g,j,j+1|0)|0}n=f[a+32>>2]|0;i=b[n+24>>0]|0;r=X(f[n+80>>2]|0,i)|0;s=(f[f[n>>2]>>2]|0)+(f[n+48>>2]|0)|0;f[j>>2]=0;n=j+4|0;f[n>>2]=0;f[j+8>>2]=0;t=(r|0)==0;do if(!t)if(r>>>0>1073741823)aq(j);else{v=r<<2;w=ln(v)|0;f[j>>2]=w;x=w+(r<<2)|0;f[j+8>>2]=x;sj(w|0,0,v|0)|0;f[n>>2]=x;y=w;break}else y=0;while(0);w=f[m>>2]|0;do if(w){Ta[f[(f[w>>2]|0)+44>>2]&31](w,s,y,r,i,f[c>>2]|0)|0;x=f[m>>2]|0;if(!x){z=s;A=f[j>>2]|0;p=20;break}if(!(Qa[f[(f[x>>2]|0)+32>>2]&127](x)|0)){x=f[j>>2]|0;z=f[m>>2]|0?x:s;A=x;p=20}}else{z=s;A=y;p=20}while(0);if((p|0)==20)xm(z,r,A);A=a+4|0;a=f[A>>2]|0;do if(a){z=f[a+48>>2]|0;f[g>>2]=0;f[g+4>>2]=0;f[g+8>>2]=0;y=ln(48)|0;f[g>>2]=y;f[g+8>>2]=-2147483600;f[g+4>>2]=34;s=y;w=10697;x=s+34|0;do{b[s>>0]=b[w>>0]|0;s=s+1|0;w=w+1|0}while((s|0)<(x|0));b[y+34>>0]=0;w=Yj(z,g,1)|0;if((b[g+11>>0]|0)<0)Oq(f[g>>2]|0);if(!w){if(!t){w=f[j>>2]|0;s=0;x=0;do{x=f[w+(s<<2)>>2]|x;s=s+1|0}while((s|0)!=(r|0));if(x)B=((_(x|0)|0)>>>3^3)+1|0;else B=1}else B=1;b[k>>0]=0;s=o;w=f[s>>2]|0;z=f[s+4>>2]|0;if((z|0)>0|(z|0)==0&w>>>0>0){C=z;D=w}else{f[h>>2]=f[d+4>>2];f[g>>2]=f[h>>2];Me(d,g,k,k+1|0)|0;w=o;C=f[w+4>>2]|0;D=f[w>>2]|0}b[k>>0]=B;if(!((C|0)>0|(C|0)==0&D>>>0>0)){f[h>>2]=f[d+4>>2];f[g>>2]=f[h>>2];Me(d,g,k,k+1|0)|0}if((B|0)==(Vl(5)|0)){w=f[j>>2]|0;z=o;s=f[z+4>>2]|0;if(!((s|0)>0|(s|0)==0&(f[z>>2]|0)>>>0>0)){f[h>>2]=f[d+4>>2];f[g>>2]=f[h>>2];Me(d,g,w,w+(r<<2)|0)|0}p=48;break}if(t)p=48;else{w=d+4|0;z=0;do{s=(f[j>>2]|0)+(z<<2)|0;y=o;v=f[y+4>>2]|0;if(!((v|0)>0|(v|0)==0&(f[y>>2]|0)>>>0>0)){f[h>>2]=f[w>>2];f[g>>2]=f[h>>2];Me(d,g,s,s+B|0)|0}z=z+1|0}while(z>>>0<r>>>0);p=48}}else p=27}else p=27;while(0);if((p|0)==27){b[k>>0]=1;r=o;o=f[r+4>>2]|0;if(!((o|0)>0|(o|0)==0&(f[r>>2]|0)>>>0>0)){f[h>>2]=f[d+4>>2];f[g>>2]=f[h>>2];Me(d,g,k,k+1|0)|0}lp(g);k=f[A>>2]|0;if(k|0)Zj(g,10-(mi(f[k+48>>2]|0)|0)|0)|0;k=Mc(f[j>>2]|0,X((f[c+4>>2]|0)-(f[c>>2]|0)>>2,i)|0,i,g,d)|0;Ej(g,f[g+4>>2]|0);if(k)p=48;else E=0}if((p|0)==48){p=f[m>>2]|0;if(!p)E=1;else{Ra[f[(f[p>>2]|0)+40>>2]&127](p,d)|0;E=1}}d=f[j>>2]|0;if(d|0){j=f[n>>2]|0;if((j|0)!=(d|0))f[n>>2]=j+(~((j+-4-d|0)>>>2)<<2);Oq(d)}q=E}l=q;u=e;return l|0}function xc(a){a=a|0;var b=0,c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0;b=u;u=u+48|0;c=b+24|0;d=b+12|0;e=b;g=a+32|0;h=a+8|0;i=a+12|0;j=f[i>>2]|0;k=f[h>>2]|0;l=j-k>>2;m=a+36|0;n=f[m>>2]|0;o=f[g>>2]|0;p=n-o>>2;q=o;o=n;n=k;if(l>>>0<=p>>>0)if(l>>>0<p>>>0?(r=q+(l<<2)|0,(r|0)!=(o|0)):0){f[m>>2]=o+(~((o+-4-r|0)>>>2)<<2);s=n;t=k;v=j}else{s=n;t=k;v=j}else{Ci(g,l-p|0);p=f[h>>2]|0;s=p;t=p;v=f[i>>2]|0}p=v-t|0;l=p>>2;f[c>>2]=0;j=c+4|0;f[j>>2]=0;k=c+8|0;f[k>>2]=0;if(l|0){if((p|0)<0)aq(c);p=((l+-1|0)>>>5)+1|0;n=ln(p<<2)|0;f[c>>2]=n;f[k>>2]=p;f[j>>2]=l;j=l>>>5;sj(n|0,0,j<<2|0)|0;p=l&31;l=n+(j<<2)|0;if(p|0)f[l>>2]=f[l>>2]&~(-1>>>(32-p|0))}p=a+20|0;l=0;j=s;s=t;t=v;while(1){if(l>>>0<t-s>>2>>>0){w=0;x=0;y=l;z=s;A=j}else{B=25;break}while(1){v=x>>>5;n=1<<(x&31);do if(!(f[(f[c>>2]|0)+(v<<2)>>2]&n)){k=f[A+(x<<2)>>2]|0;if((f[k+8>>2]|0)!=(f[k+4>>2]|0)){r=0;o=1;m=A;q=k;while(1){k=f[(f[q+4>>2]|0)+(r<<2)>>2]|0;C=0;D=m;while(1){E=f[D+(x<<2)>>2]|0;if((C|0)>=(Ra[f[(f[E>>2]|0)+24>>2]&127](E,k)|0)){F=o;break}E=f[(f[h>>2]|0)+(x<<2)>>2]|0;G=Sa[f[(f[E>>2]|0)+28>>2]&31](E,k,C)|0;if((G|0)!=(x|0)?(E=f[(f[p>>2]|0)+(G<<2)>>2]|0,(1<<(E&31)&f[(f[c>>2]|0)+(E>>>5<<2)>>2]|0)==0):0){F=0;break}C=C+1|0;D=f[h>>2]|0}r=r+1|0;m=f[h>>2]|0;q=f[m+(x<<2)>>2]|0;if(r>>>0>=(f[q+8>>2]|0)-(f[q+4>>2]|0)>>2>>>0)break;else o=F}o=m;if(F)H=o;else{I=w;J=y;K=o;break}}else H=z;f[(f[g>>2]|0)+(y<<2)>>2]=x;o=(f[c>>2]|0)+(v<<2)|0;f[o>>2]=f[o>>2]|n;I=1;J=y+1|0;K=H}else{I=w;J=y;K=z}while(0);x=x+1|0;L=f[i>>2]|0;M=L-K>>2;A=K;if(x>>>0>=M>>>0)break;else{w=I;y=J;z=K}}if(J>>>0<M>>>0&(I^1)){N=0;break}else{l=J;j=A;s=K;t=L}}if((B|0)==25){f[d>>2]=0;B=d+4|0;f[B>>2]=0;f[d+8>>2]=0;L=f[a+4>>2]|0;a=(f[L+12>>2]|0)-(f[L+8>>2]|0)|0;L=a>>2;f[e>>2]=0;K=e+4|0;f[K>>2]=0;A=e+8|0;f[A>>2]=0;if(L|0){if((a|0)<0)aq(e);a=((L+-1|0)>>>5)+1|0;J=ln(a<<2)|0;f[e>>2]=J;f[A>>2]=a;f[K>>2]=L;K=L>>>5;sj(J|0,0,K<<2|0)|0;a=L&31;L=J+(K<<2)|0;if(a|0)f[L>>2]=f[L>>2]&~(-1>>>(32-a|0))}a:do if((t|0)==(s|0))O=1;else{a=0;L=j;K=s;J=t;while(1){A=f[(f[g>>2]|0)+(a<<2)>>2]|0;l=f[L+(A<<2)>>2]|0;I=(f[l+8>>2]|0)-(f[l+4>>2]|0)|0;l=I>>2;if((I|0)<8){P=K;Q=J}else{I=f[B>>2]|0;M=f[d>>2]|0;z=I-M>>2;y=M;M=I;if(l>>>0<=z>>>0)if(l>>>0<z>>>0?(I=y+(l<<2)|0,(I|0)!=(M|0)):0){f[B>>2]=M+(~((M+-4-I|0)>>>2)<<2);R=0}else R=0;else{Ci(d,l-z|0);R=0}while(1){if((R|0)<(l|0)){S=0;T=0;U=R}else break;while(1){z=f[(f[h>>2]|0)+(A<<2)>>2]|0;I=f[(f[z+4>>2]|0)+(S<<2)>>2]|0;M=S>>>5;y=1<<(S&31);if(!(f[(f[e>>2]|0)+(M<<2)>>2]&y)){w=0;x=1;H=z;while(1){if((w|0)>=(Ra[f[(f[H>>2]|0)+24>>2]&127](H,I)|0)){V=x;break}z=f[(f[h>>2]|0)+(A<<2)>>2]|0;F=Sa[f[(f[z>>2]|0)+28>>2]&31](z,I,w)|0;z=(f[(f[e>>2]|0)+(F>>>5<<2)>>2]&1<<(F&31)|0)!=0;F=x&z;if(!z){V=F;break}w=w+1|0;x=F;H=f[(f[h>>2]|0)+(A<<2)>>2]|0}if(V){f[(f[d>>2]|0)+(U<<2)>>2]=S;H=(f[e>>2]|0)+(M<<2)|0;f[H>>2]=f[H>>2]|y;W=1;X=U+1|0}else{W=T;X=U}}else{W=T;X=U}S=S+1|0;if((S|0)>=(l|0))break;else{T=W;U=X}}if(W|(X|0)>=(l|0))R=X;else{O=0;break a}}bg(f[(f[h>>2]|0)+(A<<2)>>2]|0,d);P=f[h>>2]|0;Q=f[i>>2]|0}a=a+1|0;if(a>>>0>=Q-P>>2>>>0){O=1;break}else{L=P;K=P;J=Q}}}while(0);Q=f[e>>2]|0;if(Q|0)Oq(Q);Q=f[d>>2]|0;if(Q|0){d=f[B>>2]|0;if((d|0)!=(Q|0))f[B>>2]=d+(~((d+-4-Q|0)>>>2)<<2);Oq(Q)}N=O}O=f[c>>2]|0;if(!O){u=b;return N|0}Oq(O);u=b;return N|0}function yc(a){a=a|0;var b=0,c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0;if(!a)return;b=a+-8|0;c=f[4788]|0;d=f[a+-4>>2]|0;a=d&-8;e=b+a|0;do if(!(d&1)){g=f[b>>2]|0;if(!(d&3))return;h=b+(0-g)|0;i=g+a|0;if(h>>>0<c>>>0)return;if((f[4789]|0)==(h|0)){j=e+4|0;k=f[j>>2]|0;if((k&3|0)!=3){l=h;m=i;n=h;break}f[4786]=i;f[j>>2]=k&-2;f[h+4>>2]=i|1;f[h+i>>2]=i;return}k=g>>>3;if(g>>>0<256){g=f[h+8>>2]|0;j=f[h+12>>2]|0;if((j|0)==(g|0)){f[4784]=f[4784]&~(1<<k);l=h;m=i;n=h;break}else{f[g+12>>2]=j;f[j+8>>2]=g;l=h;m=i;n=h;break}}g=f[h+24>>2]|0;j=f[h+12>>2]|0;do if((j|0)==(h|0)){k=h+16|0;o=k+4|0;p=f[o>>2]|0;if(!p){q=f[k>>2]|0;if(!q){r=0;break}else{s=q;t=k}}else{s=p;t=o}while(1){o=s+20|0;p=f[o>>2]|0;if(p|0){s=p;t=o;continue}o=s+16|0;p=f[o>>2]|0;if(!p)break;else{s=p;t=o}}f[t>>2]=0;r=s}else{o=f[h+8>>2]|0;f[o+12>>2]=j;f[j+8>>2]=o;r=j}while(0);if(g){j=f[h+28>>2]|0;o=19440+(j<<2)|0;if((f[o>>2]|0)==(h|0)){f[o>>2]=r;if(!r){f[4785]=f[4785]&~(1<<j);l=h;m=i;n=h;break}}else{f[g+16+(((f[g+16>>2]|0)!=(h|0)&1)<<2)>>2]=r;if(!r){l=h;m=i;n=h;break}}f[r+24>>2]=g;j=h+16|0;o=f[j>>2]|0;if(o|0){f[r+16>>2]=o;f[o+24>>2]=r}o=f[j+4>>2]|0;if(o){f[r+20>>2]=o;f[o+24>>2]=r;l=h;m=i;n=h}else{l=h;m=i;n=h}}else{l=h;m=i;n=h}}else{l=b;m=a;n=b}while(0);if(n>>>0>=e>>>0)return;b=e+4|0;a=f[b>>2]|0;if(!(a&1))return;if(!(a&2)){if((f[4790]|0)==(e|0)){r=(f[4787]|0)+m|0;f[4787]=r;f[4790]=l;f[l+4>>2]=r|1;if((l|0)!=(f[4789]|0))return;f[4789]=0;f[4786]=0;return}if((f[4789]|0)==(e|0)){r=(f[4786]|0)+m|0;f[4786]=r;f[4789]=n;f[l+4>>2]=r|1;f[n+r>>2]=r;return}r=(a&-8)+m|0;s=a>>>3;do if(a>>>0<256){t=f[e+8>>2]|0;c=f[e+12>>2]|0;if((c|0)==(t|0)){f[4784]=f[4784]&~(1<<s);break}else{f[t+12>>2]=c;f[c+8>>2]=t;break}}else{t=f[e+24>>2]|0;c=f[e+12>>2]|0;do if((c|0)==(e|0)){d=e+16|0;o=d+4|0;j=f[o>>2]|0;if(!j){p=f[d>>2]|0;if(!p){u=0;break}else{v=p;w=d}}else{v=j;w=o}while(1){o=v+20|0;j=f[o>>2]|0;if(j|0){v=j;w=o;continue}o=v+16|0;j=f[o>>2]|0;if(!j)break;else{v=j;w=o}}f[w>>2]=0;u=v}else{o=f[e+8>>2]|0;f[o+12>>2]=c;f[c+8>>2]=o;u=c}while(0);if(t|0){c=f[e+28>>2]|0;h=19440+(c<<2)|0;if((f[h>>2]|0)==(e|0)){f[h>>2]=u;if(!u){f[4785]=f[4785]&~(1<<c);break}}else{f[t+16+(((f[t+16>>2]|0)!=(e|0)&1)<<2)>>2]=u;if(!u)break}f[u+24>>2]=t;c=e+16|0;h=f[c>>2]|0;if(h|0){f[u+16>>2]=h;f[h+24>>2]=u}h=f[c+4>>2]|0;if(h|0){f[u+20>>2]=h;f[h+24>>2]=u}}}while(0);f[l+4>>2]=r|1;f[n+r>>2]=r;if((l|0)==(f[4789]|0)){f[4786]=r;return}else x=r}else{f[b>>2]=a&-2;f[l+4>>2]=m|1;f[n+m>>2]=m;x=m}m=x>>>3;if(x>>>0<256){n=19176+(m<<1<<2)|0;a=f[4784]|0;b=1<<m;if(!(a&b)){f[4784]=a|b;y=n;z=n+8|0}else{b=n+8|0;y=f[b>>2]|0;z=b}f[z>>2]=l;f[y+12>>2]=l;f[l+8>>2]=y;f[l+12>>2]=n;return}n=x>>>8;if(n)if(x>>>0>16777215)A=31;else{y=(n+1048320|0)>>>16&8;z=n<<y;n=(z+520192|0)>>>16&4;b=z<<n;z=(b+245760|0)>>>16&2;a=14-(n|y|z)+(b<<z>>>15)|0;A=x>>>(a+7|0)&1|a<<1}else A=0;a=19440+(A<<2)|0;f[l+28>>2]=A;f[l+20>>2]=0;f[l+16>>2]=0;z=f[4785]|0;b=1<<A;do if(z&b){y=x<<((A|0)==31?0:25-(A>>>1)|0);n=f[a>>2]|0;while(1){if((f[n+4>>2]&-8|0)==(x|0)){B=73;break}C=n+16+(y>>>31<<2)|0;m=f[C>>2]|0;if(!m){B=72;break}else{y=y<<1;n=m}}if((B|0)==72){f[C>>2]=l;f[l+24>>2]=n;f[l+12>>2]=l;f[l+8>>2]=l;break}else if((B|0)==73){y=n+8|0;t=f[y>>2]|0;f[t+12>>2]=l;f[y>>2]=l;f[l+8>>2]=t;f[l+12>>2]=n;f[l+24>>2]=0;break}}else{f[4785]=z|b;f[a>>2]=l;f[l+24>>2]=a;f[l+12>>2]=l;f[l+8>>2]=l}while(0);l=(f[4792]|0)+-1|0;f[4792]=l;if(!l)D=19592;else return;while(1){l=f[D>>2]|0;if(!l)break;else D=l+8|0}f[4792]=-1;return}function zc(a){a=a|0;var c=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0;c=u;u=u+32|0;e=c+4|0;g=c;h=c+16|0;i=a+52|0;j=f[i>>2]|0;k=(f[j+100>>2]|0)-(f[j+96>>2]|0)|0;j=(k|0)/12|0;l=a+44|0;ci(j,f[l>>2]|0)|0;ci(f[(f[i>>2]|0)+80>>2]|0,f[l>>2]|0)|0;m=f[a+48>>2]|0;n=ln(32)|0;f[e>>2]=n;f[e+8>>2]=-2147483616;f[e+4>>2]=21;o=n;p=15598;q=o+21|0;do{b[o>>0]=b[p>>0]|0;o=o+1|0;p=p+1|0}while((o|0)<(q|0));b[n+21>>0]=0;n=Yj(m,e,0)|0;if((b[e+11>>0]|0)<0)Oq(f[e>>2]|0);m=f[l>>2]|0;if(n){b[h>>0]=0;n=m+16|0;p=f[n+4>>2]|0;if(!((p|0)>0|(p|0)==0&(f[n>>2]|0)>>>0>0)){f[g>>2]=f[m+4>>2];f[e>>2]=f[g>>2];Me(m,e,h,h+1|0)|0}mf(a)|0;u=c;return 1}b[h>>0]=1;a=m+16|0;n=f[a+4>>2]|0;if(!((n|0)>0|(n|0)==0&(f[a>>2]|0)>>>0>0)){f[g>>2]=f[m+4>>2];f[e>>2]=f[g>>2];Me(m,e,h,h+1|0)|0}m=f[i>>2]|0;a=f[m+80>>2]|0;if(a>>>0<256){if(!k){u=c;return 1}n=h+1|0;p=h+1|0;o=h+1|0;q=0;r=m;while(1){s=f[r+96>>2]|0;t=f[l>>2]|0;b[h>>0]=f[s+(q*12|0)>>2];v=t+16|0;w=f[v>>2]|0;x=f[v+4>>2]|0;if((x|0)>0|(x|0)==0&w>>>0>0){y=w;z=t;A=x}else{f[g>>2]=f[t+4>>2];f[e>>2]=f[g>>2];Me(t,e,h,o)|0;t=f[l>>2]|0;x=t+16|0;y=f[x>>2]|0;z=t;A=f[x+4>>2]|0}b[h>>0]=f[s+(q*12|0)+4>>2];if((A|0)>0|(A|0)==0&y>>>0>0){B=A;C=y;D=z}else{f[g>>2]=f[z+4>>2];f[e>>2]=f[g>>2];Me(z,e,h,p)|0;x=f[l>>2]|0;t=x+16|0;B=f[t+4>>2]|0;C=f[t>>2]|0;D=x}b[h>>0]=f[s+(q*12|0)+8>>2];if(!((B|0)>0|(B|0)==0&C>>>0>0)){f[g>>2]=f[D+4>>2];f[e>>2]=f[g>>2];Me(D,e,h,n)|0}s=q+1|0;if(s>>>0>=j>>>0)break;q=s;r=f[i>>2]|0}u=c;return 1}if(a>>>0<65536){if(!k){u=c;return 1}r=h+2|0;q=h+2|0;n=h+2|0;D=0;C=m;while(1){B=f[C+96>>2]|0;p=f[l>>2]|0;d[h>>1]=f[B+(D*12|0)>>2];z=p+16|0;y=f[z>>2]|0;A=f[z+4>>2]|0;if((A|0)>0|(A|0)==0&y>>>0>0){E=A;F=y;G=p}else{f[g>>2]=f[p+4>>2];f[e>>2]=f[g>>2];Me(p,e,h,n)|0;p=f[l>>2]|0;y=p+16|0;E=f[y+4>>2]|0;F=f[y>>2]|0;G=p}d[h>>1]=f[B+(D*12|0)+4>>2];if((E|0)>0|(E|0)==0&F>>>0>0){H=E;I=F;J=G}else{f[g>>2]=f[G+4>>2];f[e>>2]=f[g>>2];Me(G,e,h,q)|0;p=f[l>>2]|0;y=p+16|0;H=f[y+4>>2]|0;I=f[y>>2]|0;J=p}d[h>>1]=f[B+(D*12|0)+8>>2];if(!((H|0)>0|(H|0)==0&I>>>0>0)){f[g>>2]=f[J+4>>2];f[e>>2]=f[g>>2];Me(J,e,h,r)|0}B=D+1|0;if(B>>>0>=j>>>0)break;D=B;C=f[i>>2]|0}u=c;return 1}C=(k|0)!=0;if(a>>>0<2097152){if(C){K=0;L=m}else{u=c;return 1}while(1){a=f[L+96>>2]|0;ci(f[a+(K*12|0)>>2]|0,f[l>>2]|0)|0;ci(f[a+(K*12|0)+4>>2]|0,f[l>>2]|0)|0;ci(f[a+(K*12|0)+8>>2]|0,f[l>>2]|0)|0;a=K+1|0;if(a>>>0>=j>>>0)break;K=a;L=f[i>>2]|0}u=c;return 1}if(!C){u=c;return 1}C=0;L=m;while(1){m=(f[L+96>>2]|0)+(C*12|0)|0;K=f[l>>2]|0;a=K+16|0;k=f[a+4>>2]|0;if(!((k|0)>0|(k|0)==0&(f[a>>2]|0)>>>0>0)){f[g>>2]=f[K+4>>2];f[e>>2]=f[g>>2];Me(K,e,m,m+12|0)|0}m=C+1|0;if(m>>>0>=j>>>0)break;C=m;L=f[i>>2]|0}u=c;return 1}function Ac(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,o=0,p=0,q=0,r=0,s=0,t=0,v=Oa,w=Oa,x=Oa,y=Oa,z=0,A=0,B=0,C=Oa,D=Oa,E=Oa,F=Oa,G=Oa,H=Oa,I=Oa,K=Oa,M=Oa,N=Oa,O=Oa,P=0,Q=Oa,R=Oa,S=0;g=u;u=u+48|0;h=g+40|0;i=g+36|0;j=g+24|0;k=g+12|0;l=g;m=a+28|0;o=f[c>>2]|0;c=o+1|0;if((o|0)!=-1){p=((c>>>0)%3|0|0)==0?o+-2|0:c;c=o+(((o>>>0)%3|0|0)==0?2:-1)|0;if((p|0)==-1)q=-1;else q=f[(f[f[m>>2]>>2]|0)+(p<<2)>>2]|0;if((c|0)==-1){r=-1;s=q}else{r=f[(f[f[m>>2]>>2]|0)+(c<<2)>>2]|0;s=q}}else{r=-1;s=-1}q=f[a+32>>2]|0;c=f[q>>2]|0;m=(f[q+4>>2]|0)-c>>2;if(m>>>0<=s>>>0)aq(q);p=c;c=f[p+(s<<2)>>2]|0;if(m>>>0<=r>>>0)aq(q);q=f[p+(r<<2)>>2]|0;r=(c|0)<(e|0);if(!(r&(q|0)<(e|0))){do if(r)t=c;else{if((e|0)>0){t=e+-1|0;break}p=a+52|0;if((f[p>>2]|0)<=0){u=g;return}m=f[a+48>>2]|0;s=0;do{f[m+(s<<2)>>2]=0;s=s+1|0}while((s|0)<(f[p>>2]|0));u=g;return}while(0);r=a+52|0;p=f[r>>2]|0;s=X(p,t)|0;if((p|0)<=0){u=g;return}p=f[a+48>>2]|0;t=0;do{f[p+(t<<2)>>2]=f[d+(t+s<<2)>>2];t=t+1|0}while((t|0)<(f[r>>2]|0));u=g;return}r=a+52|0;t=f[r>>2]|0;s=X(t,c)|0;v=$(f[d+(s<<2)>>2]|0);w=$(f[d+(s+1<<2)>>2]|0);s=X(t,q)|0;x=$(f[d+(s<<2)>>2]|0);y=$(f[d+(s+1<<2)>>2]|0);if(!(x!=v|y!=w)){s=f[a+48>>2]|0;f[s>>2]=~~x;f[s+4>>2]=~~y;u=g;return}s=a+44|0;t=f[(f[s>>2]|0)+(e<<2)>>2]|0;f[j>>2]=0;f[j+4>>2]=0;f[j+8>>2]=0;p=a+40|0;m=f[p>>2]|0;if(!(b[m+84>>0]|0))z=f[(f[m+68>>2]|0)+(t<<2)>>2]|0;else z=t;f[i>>2]=z;z=b[m+24>>0]|0;f[h>>2]=f[i>>2];mb(m,h,z,j)|0;z=f[(f[s>>2]|0)+(c<<2)>>2]|0;f[k>>2]=0;f[k+4>>2]=0;f[k+8>>2]=0;c=f[p>>2]|0;if(!(b[c+84>>0]|0))A=f[(f[c+68>>2]|0)+(z<<2)>>2]|0;else A=z;f[i>>2]=A;A=b[c+24>>0]|0;f[h>>2]=f[i>>2];mb(c,h,A,k)|0;A=f[(f[s>>2]|0)+(q<<2)>>2]|0;f[l>>2]=0;f[l+4>>2]=0;f[l+8>>2]=0;q=f[p>>2]|0;if(!(b[q+84>>0]|0))B=f[(f[q+68>>2]|0)+(A<<2)>>2]|0;else B=A;f[i>>2]=B;B=b[q+24>>0]|0;f[h>>2]=f[i>>2];mb(q,h,B,l)|0;C=$(n[l>>2]);D=$(n[k>>2]);E=$(C-D);C=$(n[l+4>>2]);F=$(n[k+4>>2]);G=$(C-F);C=$(n[l+8>>2]);H=$(n[k+8>>2]);I=$(C-H);C=$($(n[j>>2])-D);D=$($(n[j+4>>2])-F);F=$($(n[j+8>>2])-H);H=$($($($(E*E)+$(0.0))+$(G*G))+$(I*I));if(H>$(0.0)){K=$($($($($(E*C)+$(0.0))+$(G*D))+$(I*F))/H);M=$(C-$(E*K));E=$(D-$(G*K));G=$(F-$(I*K));N=K;O=$(L($($($(G*G)+$($(E*E)+$($(M*M)+$(0.0))))/H)))}else{N=$(0.0);O=$(0.0)}H=$(x-v);x=$(y-w);y=$($(H*N)+v);v=$(H*O);H=$($(x*N)+w);w=$(x*O);O=$(y-w);x=$(H+v);N=$(y+w);w=$(H-v);j=X(f[r>>2]|0,e)|0;v=$(f[d+(j<<2)>>2]|0);H=$(f[d+(j+1<<2)>>2]|0);y=$(v-O);M=$(H-x);E=$(v-N);v=$(H-w);j=$($($(y*y)+$(0.0))+$(M*M))<$($($(E*E)+$(0.0))+$(v*v));d=a+56|0;e=a+60|0;r=f[e>>2]|0;k=f[a+64>>2]|0;l=(r|0)==(k<<5|0);if(j){do if(l)if((r+1|0)<0)aq(d);else{j=k<<6;B=r+32&-32;vi(d,r>>>0<1073741823?(j>>>0<B>>>0?B:j):2147483647);P=f[e>>2]|0;break}else P=r;while(0);f[e>>2]=P+1;j=(f[d>>2]|0)+(P>>>5<<2)|0;f[j>>2]=f[j>>2]|1<<(P&31);Q=O;R=x}else{do if(l)if((r+1|0)<0)aq(d);else{P=k<<6;j=r+32&-32;vi(d,r>>>0<1073741823?(P>>>0<j>>>0?j:P):2147483647);S=f[e>>2]|0;break}else S=r;while(0);f[e>>2]=S+1;e=(f[d>>2]|0)+(S>>>5<<2)|0;f[e>>2]=f[e>>2]&~(1<<(S&31));Q=N;R=w}S=~~+J(+(+Q+.5));e=f[a+48>>2]|0;f[e>>2]=S;S=~~+J(+(+R+.5));f[e+4>>2]=S;u=g;return}function Bc(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,o=0,p=0,q=0,r=0,s=0,t=Oa,v=Oa,w=Oa,x=Oa,y=0,z=0,A=0,B=Oa,C=Oa,D=Oa,E=Oa,F=Oa,G=Oa,H=Oa,I=Oa,K=Oa,M=Oa,N=Oa,O=0,P=Oa,Q=Oa,R=0;g=u;u=u+48|0;h=g+40|0;i=g+36|0;j=g+24|0;k=g+12|0;l=g;m=a+28|0;o=f[c>>2]|0;c=o+1|0;do if((o|0)!=-1){p=((c>>>0)%3|0|0)==0?o+-2|0:c;if(!((o>>>0)%3|0)){q=o+2|0;r=p;break}else{q=o+-1|0;r=p;break}}else{q=-1;r=-1}while(0);o=f[(f[m>>2]|0)+28>>2]|0;m=f[o+(r<<2)>>2]|0;r=f[o+(q<<2)>>2]|0;q=f[a+32>>2]|0;o=f[q>>2]|0;c=(f[q+4>>2]|0)-o>>2;if(c>>>0<=m>>>0)aq(q);p=o;o=f[p+(m<<2)>>2]|0;if(c>>>0<=r>>>0)aq(q);q=f[p+(r<<2)>>2]|0;r=(o|0)<(e|0);if(!(r&(q|0)<(e|0))){do if(r)s=o;else{if((e|0)>0){s=e+-1|0;break}p=a+52|0;if((f[p>>2]|0)<=0){u=g;return}c=f[a+48>>2]|0;m=0;do{f[c+(m<<2)>>2]=0;m=m+1|0}while((m|0)<(f[p>>2]|0));u=g;return}while(0);r=a+52|0;p=f[r>>2]|0;m=X(p,s)|0;if((p|0)<=0){u=g;return}p=f[a+48>>2]|0;s=0;do{f[p+(s<<2)>>2]=f[d+(s+m<<2)>>2];s=s+1|0}while((s|0)<(f[r>>2]|0));u=g;return}r=a+52|0;s=f[r>>2]|0;m=X(s,o)|0;t=$(f[d+(m<<2)>>2]|0);v=$(f[d+(m+1<<2)>>2]|0);m=X(s,q)|0;w=$(f[d+(m<<2)>>2]|0);x=$(f[d+(m+1<<2)>>2]|0);if(!(w!=t|x!=v)){m=f[a+48>>2]|0;f[m>>2]=~~w;f[m+4>>2]=~~x;u=g;return}m=a+44|0;s=f[(f[m>>2]|0)+(e<<2)>>2]|0;f[j>>2]=0;f[j+4>>2]=0;f[j+8>>2]=0;p=a+40|0;c=f[p>>2]|0;if(!(b[c+84>>0]|0))y=f[(f[c+68>>2]|0)+(s<<2)>>2]|0;else y=s;f[i>>2]=y;y=b[c+24>>0]|0;f[h>>2]=f[i>>2];mb(c,h,y,j)|0;y=f[(f[m>>2]|0)+(o<<2)>>2]|0;f[k>>2]=0;f[k+4>>2]=0;f[k+8>>2]=0;o=f[p>>2]|0;if(!(b[o+84>>0]|0))z=f[(f[o+68>>2]|0)+(y<<2)>>2]|0;else z=y;f[i>>2]=z;z=b[o+24>>0]|0;f[h>>2]=f[i>>2];mb(o,h,z,k)|0;z=f[(f[m>>2]|0)+(q<<2)>>2]|0;f[l>>2]=0;f[l+4>>2]=0;f[l+8>>2]=0;q=f[p>>2]|0;if(!(b[q+84>>0]|0))A=f[(f[q+68>>2]|0)+(z<<2)>>2]|0;else A=z;f[i>>2]=A;A=b[q+24>>0]|0;f[h>>2]=f[i>>2];mb(q,h,A,l)|0;B=$(n[l>>2]);C=$(n[k>>2]);D=$(B-C);B=$(n[l+4>>2]);E=$(n[k+4>>2]);F=$(B-E);B=$(n[l+8>>2]);G=$(n[k+8>>2]);H=$(B-G);B=$($(n[j>>2])-C);C=$($(n[j+4>>2])-E);E=$($(n[j+8>>2])-G);G=$($($($(D*D)+$(0.0))+$(F*F))+$(H*H));if(G>$(0.0)){I=$($($($($(D*B)+$(0.0))+$(F*C))+$(H*E))/G);K=$(B-$(D*I));D=$(C-$(F*I));F=$(E-$(H*I));M=I;N=$(L($($($(F*F)+$($(D*D)+$($(K*K)+$(0.0))))/G)))}else{M=$(0.0);N=$(0.0)}G=$(w-t);w=$(x-v);x=$($(G*M)+t);t=$(G*N);G=$($(w*M)+v);v=$(w*N);N=$(x-v);w=$(G+t);M=$(x+v);v=$(G-t);j=X(f[r>>2]|0,e)|0;t=$(f[d+(j<<2)>>2]|0);G=$(f[d+(j+1<<2)>>2]|0);x=$(t-N);K=$(G-w);D=$(t-M);t=$(G-v);j=$($($(x*x)+$(0.0))+$(K*K))<$($($(D*D)+$(0.0))+$(t*t));d=a+56|0;e=a+60|0;r=f[e>>2]|0;k=f[a+64>>2]|0;l=(r|0)==(k<<5|0);if(j){do if(l)if((r+1|0)<0)aq(d);else{j=k<<6;A=r+32&-32;vi(d,r>>>0<1073741823?(j>>>0<A>>>0?A:j):2147483647);O=f[e>>2]|0;break}else O=r;while(0);f[e>>2]=O+1;j=(f[d>>2]|0)+(O>>>5<<2)|0;f[j>>2]=f[j>>2]|1<<(O&31);P=N;Q=w}else{do if(l)if((r+1|0)<0)aq(d);else{O=k<<6;j=r+32&-32;vi(d,r>>>0<1073741823?(O>>>0<j>>>0?j:O):2147483647);R=f[e>>2]|0;break}else R=r;while(0);f[e>>2]=R+1;e=(f[d>>2]|0)+(R>>>5<<2)|0;f[e>>2]=f[e>>2]&~(1<<(R&31));P=M;Q=v}R=~~+J(+(+P+.5));e=f[a+48>>2]|0;f[e>>2]=R;R=~~+J(+(+Q+.5));f[e+4>>2]=R;u=g;return}function Cc(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,o=0,p=0,q=0,r=0,s=0,t=0,v=Oa,w=Oa,x=Oa,y=Oa,z=0,A=0,B=0,C=Oa,D=Oa,E=Oa,F=Oa,G=Oa,H=Oa,I=Oa,K=Oa,M=Oa,N=Oa,O=Oa,P=0,Q=Oa,R=Oa,S=0;g=u;u=u+48|0;h=g+40|0;i=g+36|0;j=g+24|0;k=g+12|0;l=g;m=a+48|0;o=f[c>>2]|0;c=o+1|0;if((o|0)!=-1){p=((c>>>0)%3|0|0)==0?o+-2|0:c;c=o+(((o>>>0)%3|0|0)==0?2:-1)|0;if((p|0)==-1)q=-1;else q=f[(f[f[m>>2]>>2]|0)+(p<<2)>>2]|0;if((c|0)==-1){r=-1;s=q}else{r=f[(f[f[m>>2]>>2]|0)+(c<<2)>>2]|0;s=q}}else{r=-1;s=-1}q=f[a+52>>2]|0;c=f[q>>2]|0;m=(f[q+4>>2]|0)-c>>2;if(m>>>0<=s>>>0)aq(q);p=c;c=f[p+(s<<2)>>2]|0;if(m>>>0<=r>>>0)aq(q);q=f[p+(r<<2)>>2]|0;r=(c|0)<(e|0);if(!(r&(q|0)<(e|0))){do if(r)t=c;else{if((e|0)>0){t=e+-1|0;break}p=a+72|0;if((f[p>>2]|0)<=0){u=g;return}m=f[a+68>>2]|0;s=0;do{f[m+(s<<2)>>2]=0;s=s+1|0}while((s|0)<(f[p>>2]|0));u=g;return}while(0);r=a+72|0;p=f[r>>2]|0;s=X(p,t)|0;if((p|0)<=0){u=g;return}p=f[a+68>>2]|0;t=0;do{f[p+(t<<2)>>2]=f[d+(t+s<<2)>>2];t=t+1|0}while((t|0)<(f[r>>2]|0));u=g;return}r=a+72|0;t=f[r>>2]|0;s=X(t,c)|0;v=$(f[d+(s<<2)>>2]|0);w=$(f[d+(s+1<<2)>>2]|0);s=X(t,q)|0;x=$(f[d+(s<<2)>>2]|0);y=$(f[d+(s+1<<2)>>2]|0);if(!(x!=v|y!=w)){s=f[a+68>>2]|0;f[s>>2]=~~x;f[s+4>>2]=~~y;u=g;return}s=a+64|0;t=f[(f[s>>2]|0)+(e<<2)>>2]|0;f[j>>2]=0;f[j+4>>2]=0;f[j+8>>2]=0;p=a+60|0;m=f[p>>2]|0;if(!(b[m+84>>0]|0))z=f[(f[m+68>>2]|0)+(t<<2)>>2]|0;else z=t;f[i>>2]=z;z=b[m+24>>0]|0;f[h>>2]=f[i>>2];mb(m,h,z,j)|0;z=f[(f[s>>2]|0)+(c<<2)>>2]|0;f[k>>2]=0;f[k+4>>2]=0;f[k+8>>2]=0;c=f[p>>2]|0;if(!(b[c+84>>0]|0))A=f[(f[c+68>>2]|0)+(z<<2)>>2]|0;else A=z;f[i>>2]=A;A=b[c+24>>0]|0;f[h>>2]=f[i>>2];mb(c,h,A,k)|0;A=f[(f[s>>2]|0)+(q<<2)>>2]|0;f[l>>2]=0;f[l+4>>2]=0;f[l+8>>2]=0;q=f[p>>2]|0;if(!(b[q+84>>0]|0))B=f[(f[q+68>>2]|0)+(A<<2)>>2]|0;else B=A;f[i>>2]=B;B=b[q+24>>0]|0;f[h>>2]=f[i>>2];mb(q,h,B,l)|0;C=$(n[l>>2]);D=$(n[k>>2]);E=$(C-D);C=$(n[l+4>>2]);F=$(n[k+4>>2]);G=$(C-F);C=$(n[l+8>>2]);H=$(n[k+8>>2]);I=$(C-H);C=$($(n[j>>2])-D);D=$($(n[j+4>>2])-F);F=$($(n[j+8>>2])-H);H=$($($($(E*E)+$(0.0))+$(G*G))+$(I*I));if(H>$(0.0)){K=$($($($($(E*C)+$(0.0))+$(G*D))+$(I*F))/H);M=$(C-$(E*K));E=$(D-$(G*K));G=$(F-$(I*K));N=K;O=$(L($($($(G*G)+$($(E*E)+$($(M*M)+$(0.0))))/H)))}else{N=$(0.0);O=$(0.0)}H=$(x-v);x=$(y-w);y=$($(H*N)+v);v=$(H*O);H=$($(x*N)+w);w=$(x*O);O=$(y-w);x=$(H+v);N=$(y+w);w=$(H-v);j=X(f[r>>2]|0,e)|0;v=$(f[d+(j<<2)>>2]|0);H=$(f[d+(j+1<<2)>>2]|0);y=$(v-O);M=$(H-x);E=$(v-N);v=$(H-w);j=$($($(y*y)+$(0.0))+$(M*M))<$($($(E*E)+$(0.0))+$(v*v));d=a+76|0;e=a+80|0;r=f[e>>2]|0;k=f[a+84>>2]|0;l=(r|0)==(k<<5|0);if(j){do if(l)if((r+1|0)<0)aq(d);else{j=k<<6;B=r+32&-32;vi(d,r>>>0<1073741823?(j>>>0<B>>>0?B:j):2147483647);P=f[e>>2]|0;break}else P=r;while(0);f[e>>2]=P+1;j=(f[d>>2]|0)+(P>>>5<<2)|0;f[j>>2]=f[j>>2]|1<<(P&31);Q=O;R=x}else{do if(l)if((r+1|0)<0)aq(d);else{P=k<<6;j=r+32&-32;vi(d,r>>>0<1073741823?(P>>>0<j>>>0?j:P):2147483647);S=f[e>>2]|0;break}else S=r;while(0);f[e>>2]=S+1;e=(f[d>>2]|0)+(S>>>5<<2)|0;f[e>>2]=f[e>>2]&~(1<<(S&31));Q=N;R=w}S=~~+J(+(+Q+.5));e=f[a+68>>2]|0;f[e>>2]=S;S=~~+J(+(+R+.5));f[e+4>>2]=S;u=g;return}function Dc(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,o=0,p=0,q=0,r=0,s=0,t=Oa,v=Oa,w=Oa,x=Oa,y=0,z=0,A=0,B=Oa,C=Oa,D=Oa,E=Oa,F=Oa,G=Oa,H=Oa,I=Oa,K=Oa,M=Oa,N=Oa,O=0,P=Oa,Q=Oa,R=0;g=u;u=u+48|0;h=g+40|0;i=g+36|0;j=g+24|0;k=g+12|0;l=g;m=a+48|0;o=f[c>>2]|0;c=o+1|0;do if((o|0)!=-1){p=((c>>>0)%3|0|0)==0?o+-2|0:c;if(!((o>>>0)%3|0)){q=o+2|0;r=p;break}else{q=o+-1|0;r=p;break}}else{q=-1;r=-1}while(0);o=f[(f[m>>2]|0)+28>>2]|0;m=f[o+(r<<2)>>2]|0;r=f[o+(q<<2)>>2]|0;q=f[a+52>>2]|0;o=f[q>>2]|0;c=(f[q+4>>2]|0)-o>>2;if(c>>>0<=m>>>0)aq(q);p=o;o=f[p+(m<<2)>>2]|0;if(c>>>0<=r>>>0)aq(q);q=f[p+(r<<2)>>2]|0;r=(o|0)<(e|0);if(!(r&(q|0)<(e|0))){do if(r)s=o;else{if((e|0)>0){s=e+-1|0;break}p=a+72|0;if((f[p>>2]|0)<=0){u=g;return}c=f[a+68>>2]|0;m=0;do{f[c+(m<<2)>>2]=0;m=m+1|0}while((m|0)<(f[p>>2]|0));u=g;return}while(0);r=a+72|0;p=f[r>>2]|0;m=X(p,s)|0;if((p|0)<=0){u=g;return}p=f[a+68>>2]|0;s=0;do{f[p+(s<<2)>>2]=f[d+(s+m<<2)>>2];s=s+1|0}while((s|0)<(f[r>>2]|0));u=g;return}r=a+72|0;s=f[r>>2]|0;m=X(s,o)|0;t=$(f[d+(m<<2)>>2]|0);v=$(f[d+(m+1<<2)>>2]|0);m=X(s,q)|0;w=$(f[d+(m<<2)>>2]|0);x=$(f[d+(m+1<<2)>>2]|0);if(!(w!=t|x!=v)){m=f[a+68>>2]|0;f[m>>2]=~~w;f[m+4>>2]=~~x;u=g;return}m=a+64|0;s=f[(f[m>>2]|0)+(e<<2)>>2]|0;f[j>>2]=0;f[j+4>>2]=0;f[j+8>>2]=0;p=a+60|0;c=f[p>>2]|0;if(!(b[c+84>>0]|0))y=f[(f[c+68>>2]|0)+(s<<2)>>2]|0;else y=s;f[i>>2]=y;y=b[c+24>>0]|0;f[h>>2]=f[i>>2];mb(c,h,y,j)|0;y=f[(f[m>>2]|0)+(o<<2)>>2]|0;f[k>>2]=0;f[k+4>>2]=0;f[k+8>>2]=0;o=f[p>>2]|0;if(!(b[o+84>>0]|0))z=f[(f[o+68>>2]|0)+(y<<2)>>2]|0;else z=y;f[i>>2]=z;z=b[o+24>>0]|0;f[h>>2]=f[i>>2];mb(o,h,z,k)|0;z=f[(f[m>>2]|0)+(q<<2)>>2]|0;f[l>>2]=0;f[l+4>>2]=0;f[l+8>>2]=0;q=f[p>>2]|0;if(!(b[q+84>>0]|0))A=f[(f[q+68>>2]|0)+(z<<2)>>2]|0;else A=z;f[i>>2]=A;A=b[q+24>>0]|0;f[h>>2]=f[i>>2];mb(q,h,A,l)|0;B=$(n[l>>2]);C=$(n[k>>2]);D=$(B-C);B=$(n[l+4>>2]);E=$(n[k+4>>2]);F=$(B-E);B=$(n[l+8>>2]);G=$(n[k+8>>2]);H=$(B-G);B=$($(n[j>>2])-C);C=$($(n[j+4>>2])-E);E=$($(n[j+8>>2])-G);G=$($($($(D*D)+$(0.0))+$(F*F))+$(H*H));if(G>$(0.0)){I=$($($($($(D*B)+$(0.0))+$(F*C))+$(H*E))/G);K=$(B-$(D*I));D=$(C-$(F*I));F=$(E-$(H*I));M=I;N=$(L($($($(F*F)+$($(D*D)+$($(K*K)+$(0.0))))/G)))}else{M=$(0.0);N=$(0.0)}G=$(w-t);w=$(x-v);x=$($(G*M)+t);t=$(G*N);G=$($(w*M)+v);v=$(w*N);N=$(x-v);w=$(G+t);M=$(x+v);v=$(G-t);j=X(f[r>>2]|0,e)|0;t=$(f[d+(j<<2)>>2]|0);G=$(f[d+(j+1<<2)>>2]|0);x=$(t-N);K=$(G-w);D=$(t-M);t=$(G-v);j=$($($(x*x)+$(0.0))+$(K*K))<$($($(D*D)+$(0.0))+$(t*t));d=a+76|0;e=a+80|0;r=f[e>>2]|0;k=f[a+84>>2]|0;l=(r|0)==(k<<5|0);if(j){do if(l)if((r+1|0)<0)aq(d);else{j=k<<6;A=r+32&-32;vi(d,r>>>0<1073741823?(j>>>0<A>>>0?A:j):2147483647);O=f[e>>2]|0;break}else O=r;while(0);f[e>>2]=O+1;j=(f[d>>2]|0)+(O>>>5<<2)|0;f[j>>2]=f[j>>2]|1<<(O&31);P=N;Q=w}else{do if(l)if((r+1|0)<0)aq(d);else{O=k<<6;j=r+32&-32;vi(d,r>>>0<1073741823?(O>>>0<j>>>0?j:O):2147483647);R=f[e>>2]|0;break}else R=r;while(0);f[e>>2]=R+1;e=(f[d>>2]|0)+(R>>>5<<2)|0;f[e>>2]=f[e>>2]&~(1<<(R&31));P=M;Q=v}R=~~+J(+(+P+.5));e=f[a+68>>2]|0;f[e>>2]=R;R=~~+J(+(+Q+.5));f[e+4>>2]=R;u=g;return}function Ec(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,i=0,j=0,k=0,l=0,m=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=Oa,F=Oa,G=Oa,H=0,I=0,J=0,K=0;d=b[c+11>>0]|0;e=d<<24>>24<0;g=e?f[c>>2]|0:c;i=e?f[c+4>>2]|0:d&255;if(i>>>0>3){d=g;e=i;j=i;while(1){k=X(h[d>>0]|h[d+1>>0]<<8|h[d+2>>0]<<16|h[d+3>>0]<<24,1540483477)|0;e=(X(k>>>24^k,1540483477)|0)^(X(e,1540483477)|0);j=j+-4|0;if(j>>>0<=3)break;else d=d+4|0}d=i+-4|0;j=d&-4;l=d-j|0;m=g+(j+4)|0;o=e}else{l=i;m=g;o=i}switch(l|0){case 3:{p=h[m+2>>0]<<16^o;q=6;break}case 2:{p=o;q=6;break}case 1:{r=o;q=7;break}default:s=o}if((q|0)==6){r=h[m+1>>0]<<8^p;q=7}if((q|0)==7)s=X(r^h[m>>0],1540483477)|0;m=X(s>>>13^s,1540483477)|0;s=m>>>15^m;m=a+4|0;r=f[m>>2]|0;p=(r|0)==0;a:do if(!p){o=r+-1|0;l=(o&r|0)==0;if(!l)if(s>>>0<r>>>0)t=s;else t=(s>>>0)%(r>>>0)|0;else t=s&o;e=f[(f[a>>2]|0)+(t<<2)>>2]|0;if((e|0)!=0?(j=f[e>>2]|0,(j|0)!=0):0){e=(i|0)==0;if(l){if(e){l=j;while(1){d=f[l+4>>2]|0;if(!((d|0)==(s|0)|(d&o|0)==(t|0))){u=t;break a}d=b[l+8+11>>0]|0;if(!((d<<24>>24<0?f[l+12>>2]|0:d&255)|0)){v=l;break}l=f[l>>2]|0;if(!l){u=t;break a}}w=v+20|0;return w|0}else x=j;b:while(1){l=f[x+4>>2]|0;if(!((l|0)==(s|0)|(l&o|0)==(t|0))){u=t;break a}l=x+8|0;d=b[l+11>>0]|0;k=d<<24>>24<0;y=d&255;do if(((k?f[x+12>>2]|0:y)|0)==(i|0)){d=f[l>>2]|0;if(k)if(!(Vk(d,g,i)|0)){v=x;q=63;break b}else break;if((b[g>>0]|0)==(d&255)<<24>>24){d=l;z=y;A=g;do{z=z+-1|0;d=d+1|0;if(!z){v=x;q=63;break b}A=A+1|0}while((b[d>>0]|0)==(b[A>>0]|0))}}while(0);x=f[x>>2]|0;if(!x){u=t;break a}}if((q|0)==63){w=v+20|0;return w|0}}if(e){o=j;while(1){y=f[o+4>>2]|0;if((y|0)!=(s|0)){if(y>>>0<r>>>0)B=y;else B=(y>>>0)%(r>>>0)|0;if((B|0)!=(t|0)){u=t;break a}}y=b[o+8+11>>0]|0;if(!((y<<24>>24<0?f[o+12>>2]|0:y&255)|0)){v=o;break}o=f[o>>2]|0;if(!o){u=t;break a}}w=v+20|0;return w|0}else C=j;c:while(1){o=f[C+4>>2]|0;if((o|0)!=(s|0)){if(o>>>0<r>>>0)D=o;else D=(o>>>0)%(r>>>0)|0;if((D|0)!=(t|0)){u=t;break a}}o=C+8|0;e=b[o+11>>0]|0;y=e<<24>>24<0;l=e&255;do if(((y?f[C+12>>2]|0:l)|0)==(i|0)){e=f[o>>2]|0;if(y)if(!(Vk(e,g,i)|0)){v=C;q=63;break c}else break;if((b[g>>0]|0)==(e&255)<<24>>24){e=o;k=l;A=g;do{k=k+-1|0;e=e+1|0;if(!k){v=C;q=63;break c}A=A+1|0}while((b[e>>0]|0)==(b[A>>0]|0))}}while(0);C=f[C>>2]|0;if(!C){u=t;break a}}if((q|0)==63){w=v+20|0;return w|0}}else u=t}else u=0;while(0);t=ln(24)|0;pj(t+8|0,c);f[t+20>>2]=0;f[t+4>>2]=s;f[t>>2]=0;c=a+12|0;E=$(((f[c>>2]|0)+1|0)>>>0);F=$(r>>>0);G=$(n[a+16>>2]);do if(p|$(G*F)<E){C=r<<1|(r>>>0<3|(r+-1&r|0)!=0)&1;g=~~$(W($(E/G)))>>>0;ei(a,C>>>0<g>>>0?g:C);C=f[m>>2]|0;g=C+-1|0;if(!(g&C)){H=C;I=g&s;break}if(s>>>0<C>>>0){H=C;I=s}else{H=C;I=(s>>>0)%(C>>>0)|0}}else{H=r;I=u}while(0);u=(f[a>>2]|0)+(I<<2)|0;I=f[u>>2]|0;if(!I){r=a+8|0;f[t>>2]=f[r>>2];f[r>>2]=t;f[u>>2]=r;r=f[t>>2]|0;if(r|0){u=f[r+4>>2]|0;r=H+-1|0;if(r&H)if(u>>>0<H>>>0)J=u;else J=(u>>>0)%(H>>>0)|0;else J=u&r;K=(f[a>>2]|0)+(J<<2)|0;q=61}}else{f[t>>2]=f[I>>2];K=I;q=61}if((q|0)==61)f[K>>2]=t;f[c>>2]=(f[c>>2]|0)+1;v=t;w=v+20|0;return w|0}function Fc(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var g=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0.0,q=0.0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0.0,G=0.0,H=0,J=0,K=0,L=0,M=0,N=0,O=0.0,P=0,Q=0.0,R=0.0,S=0,T=0.0,U=0,V=0,W=0,X=0.0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0.0,da=0,ea=0.0;g=a+4|0;i=f[g>>2]|0;j=a+100|0;if(i>>>0<(f[j>>2]|0)>>>0){f[g>>2]=i+1;k=h[i>>0]|0;l=0}else{k=Si(a)|0;l=0}a:while(1){switch(k|0){case 46:{m=8;break a;break}case 48:break;default:{n=0;o=0;p=1.0;q=0.0;r=0;s=k;t=l;u=0;v=0;w=0;x=0;break a}}i=f[g>>2]|0;if(i>>>0<(f[j>>2]|0)>>>0){f[g>>2]=i+1;k=h[i>>0]|0;l=1;continue}else{k=Si(a)|0;l=1;continue}}if((m|0)==8){k=f[g>>2]|0;if(k>>>0<(f[j>>2]|0)>>>0){f[g>>2]=k+1;y=h[k>>0]|0}else y=Si(a)|0;if((y|0)==48){k=0;i=0;while(1){z=f[g>>2]|0;if(z>>>0<(f[j>>2]|0)>>>0){f[g>>2]=z+1;A=h[z>>0]|0}else A=Si(a)|0;z=Vn(k|0,i|0,-1,-1)|0;B=I;if((A|0)==48){k=z;i=B}else{n=1;o=0;p=1.0;q=0.0;r=0;s=A;t=1;u=0;v=0;w=z;x=B;break}}}else{n=1;o=0;p=1.0;q=0.0;r=0;s=y;t=l;u=0;v=0;w=0;x=0}}while(1){l=s+-48|0;y=s|32;if(l>>>0>=10){A=(s|0)==46;if(!(A|(y+-97|0)>>>0<6)){C=s;break}if(A)if(!n){D=1;E=o;F=p;G=q;H=r;J=t;K=v;L=u;M=v;N=u}else{C=46;break}else m=20}else m=20;if((m|0)==20){m=0;A=(s|0)>57?y+-87|0:l;do if(!((u|0)<0|(u|0)==0&v>>>0<8))if((u|0)<0|(u|0)==0&v>>>0<14){O=p*.0625;P=o;Q=O;R=q+O*+(A|0);S=r;break}else{l=(o|0)!=0|(A|0)==0;P=l?o:1;Q=p;R=l?q:q+p*.5;S=r;break}else{P=o;Q=p;R=q;S=A+(r<<4)|0}while(0);A=Vn(v|0,u|0,1,0)|0;D=n;E=P;F=Q;G=R;H=S;J=1;K=w;L=x;M=A;N=I}A=f[g>>2]|0;if(A>>>0<(f[j>>2]|0)>>>0){f[g>>2]=A+1;n=D;o=E;p=F;q=G;r=H;s=h[A>>0]|0;t=J;u=N;v=M;w=K;x=L;continue}else{n=D;o=E;p=F;q=G;r=H;s=Si(a)|0;t=J;u=N;v=M;w=K;x=L;continue}}do if(!t){L=(f[j>>2]|0)==0;if(!L)f[g>>2]=(f[g>>2]|0)+-1;if(e){if(!L)f[g>>2]=(f[g>>2]|0)+-1;if(!((n|0)==0|L))f[g>>2]=(f[g>>2]|0)+-1}else Ym(a,0);T=+(d|0)*0.0}else{L=(n|0)==0;K=L?v:w;M=L?u:x;if((u|0)<0|(u|0)==0&v>>>0<8){L=r;N=v;J=u;while(1){s=L<<4;H=N;N=Vn(N|0,J|0,1,0)|0;if(!((J|0)<0|(J|0)==0&H>>>0<7)){U=s;break}else{L=s;J=I}}}else U=r;if((C|32|0)==112){J=Re(a,e)|0;L=I;if((J|0)==0&(L|0)==-2147483648){if(!e){Ym(a,0);T=0.0;break}if(!(f[j>>2]|0)){V=0;W=0}else{f[g>>2]=(f[g>>2]|0)+-1;V=0;W=0}}else{V=J;W=L}}else if(!(f[j>>2]|0)){V=0;W=0}else{f[g>>2]=(f[g>>2]|0)+-1;V=0;W=0}L=Tn(K|0,M|0,2)|0;J=Vn(L|0,I|0,-32,-1)|0;L=Vn(J|0,I|0,V|0,W|0)|0;J=I;if(!U){T=+(d|0)*0.0;break}N=0-c|0;s=((N|0)<0)<<31>>31;if((J|0)>(s|0)|(J|0)==(s|0)&L>>>0>N>>>0){N=Vq()|0;f[N>>2]=34;T=+(d|0)*1797693134862315708145274.0e284*1797693134862315708145274.0e284;break}N=c+-106|0;s=((N|0)<0)<<31>>31;if((J|0)<(s|0)|(J|0)==(s|0)&L>>>0<N>>>0){N=Vq()|0;f[N>>2]=34;T=+(d|0)*2.2250738585072014e-308*2.2250738585072014e-308;break}if((U|0)>-1){G=q;N=U;s=L;H=J;while(1){E=!(G>=.5);o=N<<1|(E^1)&1;F=G+(E?G:G+-1.0);E=Vn(s|0,H|0,-1,-1)|0;D=I;if((o|0)>-1){G=F;N=o;s=E;H=D}else{X=F;Y=o;Z=E;_=D;break}}}else{X=q;Y=U;Z=L;_=J}H=((b|0)<0)<<31>>31;s=Xn(32,0,c|0,((c|0)<0)<<31>>31|0)|0;N=Vn(s|0,I|0,Z|0,_|0)|0;s=I;if((s|0)<(H|0)|(s|0)==(H|0)&N>>>0<b>>>0)if((N|0)>0){$=N;m=59}else{aa=0;ba=84;m=61}else{$=b;m=59}if((m|0)==59)if(($|0)<53){aa=$;ba=84-$|0;m=61}else{ca=0.0;da=$;ea=+(d|0)}if((m|0)==61){G=+(d|0);ca=+rq(+bk(1.0,ba),G);da=aa;ea=G}N=(Y&1|0)==0&(X!=0.0&(da|0)<32);G=(N?0.0:X)*ea+(ca+ea*+((Y+(N&1)|0)>>>0))-ca;if(!(G!=0.0)){N=Vq()|0;f[N>>2]=34}T=+sq(G,Z)}while(0);return +T}function Gc(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0;g=u;u=u+16|0;h=g+4|0;i=g;if(!(Gh(a,d)|0)){j=0;u=g;return j|0}d=a+84|0;k=f[d>>2]|0;l=a+88|0;m=f[l>>2]|0;if((m|0)!=(k|0))f[l>>2]=m+(~((m+-4-k|0)>>>2)<<2);f[d>>2]=0;f[l>>2]=0;f[a+92>>2]=0;if(k|0)Oq(k);k=a+72|0;l=f[k>>2]|0;d=a+76|0;if((f[d>>2]|0)!=(l|0))f[d>>2]=l;f[k>>2]=0;f[d>>2]=0;f[a+80>>2]=0;if(l|0)Oq(l);l=a+64|0;d=f[l>>2]|0;if((f[d+4>>2]|0)!=(f[d>>2]|0)){k=a+12|0;m=e+84|0;n=e+68|0;o=c+96|0;p=a+24|0;q=0;r=d;do{f[i>>2]=(q>>>0)/3|0;f[h>>2]=f[i>>2];d=_j(r,h)|0;r=f[l>>2]|0;do if(!d){s=f[(f[r+12>>2]|0)+(q<<2)>>2]|0;if((s|0)==-1){t=(f[a>>2]|0)+(q>>>5<<2)|0;f[t>>2]=f[t>>2]|1<<(q&31);t=q+1|0;v=((t>>>0)%3|0|0)==0?q+-2|0:t;if((v|0)==-1)w=-1;else w=f[(f[r>>2]|0)+(v<<2)>>2]|0;v=(f[k>>2]|0)+(w>>>5<<2)|0;f[v>>2]=f[v>>2]|1<<(w&31);v=(((q>>>0)%3|0|0)==0?2:-1)+q|0;if((v|0)==-1)x=-1;else x=f[(f[r>>2]|0)+(v<<2)>>2]|0;v=(f[k>>2]|0)+(x>>>5<<2)|0;f[v>>2]=f[v>>2]|1<<(x&31);break}if(s>>>0>=q>>>0){v=q+1|0;t=((v>>>0)%3|0|0)==0?q+-2|0:v;y=s+(((s>>>0)%3|0|0)==0?2:-1)|0;z=(t|0)==-1;if(!(b[m>>0]|0)){if(z)A=-1;else A=f[(f[o>>2]|0)+(((t|0)/3|0)*12|0)+(((t|0)%3|0)<<2)>>2]|0;B=(y|0)==-1;if(B)C=-1;else C=f[(f[o>>2]|0)+(((y|0)/3|0)*12|0)+(((y|0)%3|0)<<2)>>2]|0;D=f[n>>2]|0;if((f[D+(A<<2)>>2]|0)==(f[D+(C<<2)>>2]|0)){E=t+1|0;if(z)F=-1;else F=((E>>>0)%3|0|0)==0?t+-2|0:E;do if(!B)if(!((y>>>0)%3|0)){G=y+2|0;break}else{G=y+-1|0;break}else G=-1;while(0);if((F|0)==-1)H=-1;else H=f[(f[o>>2]|0)+(((F|0)/3|0)*12|0)+(((F|0)%3|0)<<2)>>2]|0;if((G|0)==-1)I=-1;else I=f[(f[o>>2]|0)+(((G|0)/3|0)*12|0)+(((G|0)%3|0)<<2)>>2]|0;if((f[D+(H<<2)>>2]|0)==(f[D+(I<<2)>>2]|0))break}}else{if(z)J=-1;else J=f[(f[o>>2]|0)+(((t|0)/3|0)*12|0)+(((t|0)%3|0)<<2)>>2]|0;B=(y|0)==-1;if(B)K=-1;else K=f[(f[o>>2]|0)+(((y|0)/3|0)*12|0)+(((y|0)%3|0)<<2)>>2]|0;if((J|0)==(K|0)){E=t+1|0;if(z)L=-1;else L=((E>>>0)%3|0|0)==0?t+-2|0:E;do if(!B)if(!((y>>>0)%3|0)){M=y+2|0;break}else{M=y+-1|0;break}else M=-1;while(0);if((L|0)==-1)N=-1;else N=f[(f[o>>2]|0)+(((L|0)/3|0)*12|0)+(((L|0)%3|0)<<2)>>2]|0;if((M|0)==-1)O=-1;else O=f[(f[o>>2]|0)+(((M|0)/3|0)*12|0)+(((M|0)%3|0)<<2)>>2]|0;if((N|0)==(O|0))break}}b[p>>0]=0;y=f[a>>2]|0;B=y+(q>>>5<<2)|0;f[B>>2]=f[B>>2]|1<<(q&31);B=y+(s>>>5<<2)|0;f[B>>2]=f[B>>2]|1<<(s&31);B=((v>>>0)%3|0|0)==0?q+-2|0:v;if((B|0)==-1)P=-1;else P=f[(f[r>>2]|0)+(B<<2)>>2]|0;B=(f[k>>2]|0)+(P>>>5<<2)|0;f[B>>2]=f[B>>2]|1<<(P&31);B=(((q>>>0)%3|0|0)==0?2:-1)+q|0;if((B|0)==-1)Q=-1;else Q=f[(f[r>>2]|0)+(B<<2)>>2]|0;B=(f[k>>2]|0)+(Q>>>5<<2)|0;f[B>>2]=f[B>>2]|1<<(Q&31);B=s+1|0;y=((B>>>0)%3|0|0)==0?s+-2|0:B;if((y|0)==-1)R=-1;else R=f[(f[r>>2]|0)+(y<<2)>>2]|0;y=(f[k>>2]|0)+(R>>>5<<2)|0;f[y>>2]=f[y>>2]|1<<(R&31);y=(((s>>>0)%3|0|0)==0?2:-1)+s|0;if((y|0)==-1)S=-1;else S=f[(f[r>>2]|0)+(y<<2)>>2]|0;y=(f[k>>2]|0)+(S>>>5<<2)|0;f[y>>2]=f[y>>2]|1<<(S&31)}}while(0);q=q+1|0}while(q>>>0<(f[r+4>>2]|0)-(f[r>>2]|0)>>2>>>0)}if((c|0)!=0&(e|0)!=0){Qc(a,c,e);j=1;u=g;return j|0}else{md(a,0,0);j=1;u=g;return j|0}return 0}function Hc(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0;d=u;u=u+32|0;e=d+12|0;g=d+8|0;h=d+4|0;i=d;j=a+8|0;a:do if(f[j>>2]|0?(k=f[a>>2]|0,l=a+4|0,f[a>>2]=l,f[(f[l>>2]|0)+8>>2]=0,f[l>>2]=0,f[j>>2]=0,m=f[k+4>>2]|0,n=(m|0)==0?k:m,n|0):0){m=a+4|0;k=n;n=f[b>>2]|0;while(1){if((n|0)==(f[c>>2]|0))break;o=k+16|0;f[o>>2]=f[n+16>>2];if((k|0)!=(n|0)){f[h>>2]=f[n+20>>2];f[i>>2]=n+24;f[g>>2]=f[h>>2];f[e>>2]=f[i>>2];Oc(k+20|0,g,e)}p=k+8|0;q=f[p>>2]|0;do if(q){r=f[q>>2]|0;if((r|0)==(k|0)){f[q>>2]=0;s=f[q+4>>2]|0;if(!s){t=q;break}else v=s;while(1){s=f[v>>2]|0;if(s|0){v=s;continue}s=f[v+4>>2]|0;if(!s)break;else v=s}t=v;break}else{f[q+4>>2]=0;if(!r){t=q;break}else w=r;while(1){s=f[w>>2]|0;if(s|0){w=s;continue}s=f[w+4>>2]|0;if(!s)break;else w=s}t=w;break}}else t=0;while(0);q=f[l>>2]|0;do if(q){r=f[o>>2]|0;s=q;while(1){if((r|0)<(f[s+16>>2]|0)){x=f[s>>2]|0;if(!x){y=22;break}else z=x}else{A=s+4|0;x=f[A>>2]|0;if(!x){y=25;break}else z=x}s=z}if((y|0)==22){y=0;B=s;C=s;break}else if((y|0)==25){y=0;B=s;C=A;break}}else{B=l;C=l}while(0);f[k>>2]=0;f[k+4>>2]=0;f[p>>2]=B;f[C>>2]=k;q=f[f[a>>2]>>2]|0;if(!q)D=k;else{f[a>>2]=q;D=f[C>>2]|0}Oe(f[m>>2]|0,D);f[j>>2]=(f[j>>2]|0)+1;q=f[n+4>>2]|0;if(!q){o=n+8|0;r=f[o>>2]|0;if((f[r>>2]|0)==(n|0))E=r;else{r=o;do{o=f[r>>2]|0;r=o+8|0;x=f[r>>2]|0}while((f[x>>2]|0)!=(o|0));E=x}}else{r=q;while(1){p=f[r>>2]|0;if(!p)break;else r=p}E=r}f[b>>2]=E;if(!t)break a;else{k=t;n=E}}n=f[k+8>>2]|0;if(!n)F=k;else{m=n;while(1){n=f[m+8>>2]|0;if(!n)break;else m=n}F=m}Oj(a,F)}while(0);F=f[b>>2]|0;E=f[c>>2]|0;if((F|0)==(E|0)){u=d;return}c=a+4|0;t=a+4|0;D=F;while(1){Kg(e,a,D+16|0);F=f[c>>2]|0;do if(F){C=f[e>>2]|0;B=f[C+16>>2]|0;A=F;while(1){if((B|0)<(f[A+16>>2]|0)){z=f[A>>2]|0;if(!z){y=43;break}else G=z}else{H=A+4|0;z=f[H>>2]|0;if(!z){y=46;break}else G=z}A=G}if((y|0)==43){y=0;I=A;J=A;K=C;break}else if((y|0)==46){y=0;I=A;J=H;K=C;break}}else{I=c;J=c;K=f[e>>2]|0}while(0);f[K>>2]=0;f[K+4>>2]=0;f[K+8>>2]=I;f[J>>2]=K;F=f[f[a>>2]>>2]|0;if(!F)L=K;else{f[a>>2]=F;L=f[J>>2]|0}Oe(f[t>>2]|0,L);f[j>>2]=(f[j>>2]|0)+1;F=f[D+4>>2]|0;if(!F){m=D+8|0;B=f[m>>2]|0;if((f[B>>2]|0)==(D|0))M=B;else{B=m;do{m=f[B>>2]|0;B=m+8|0;r=f[B>>2]|0}while((f[r>>2]|0)!=(m|0));M=r}}else{B=F;while(1){r=f[B>>2]|0;if(!r)break;else B=r}M=B}f[b>>2]=M;if((M|0)==(E|0))break;else D=M}u=d;return}function Ic(a,b,c,d,e,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0;g=u;u=u+32|0;d=g+16|0;h=g+8|0;i=g;j=f[a+28>>2]|0;k=f[a+32>>2]|0;l=e>>>0>1073741823?-1:e<<2;m=Lq(l)|0;sj(m|0,0,l|0)|0;n=Lq(l)|0;sj(n|0,0,l|0)|0;l=a+36|0;o=f[l>>2]|0;p=f[o+4>>2]|0;q=f[o>>2]|0;r=p-q|0;a:do if((r|0)>4){s=r>>2;t=(e|0)>0;v=a+8|0;w=h+4|0;x=i+4|0;y=d+4|0;z=m+4|0;A=h+4|0;B=i+4|0;C=d+4|0;D=j+12|0;E=e<<2;F=s+-1|0;if(p-q>>2>>>0>F>>>0){G=s;H=F;I=q}else{J=o;aq(J)}while(1){F=f[I+(H<<2)>>2]|0;if(t)sj(m|0,0,E|0)|0;if((F|0)!=-1){s=f[D>>2]|0;K=0;L=F;while(1){M=f[s+(L<<2)>>2]|0;if((M|0)!=-1){N=f[j>>2]|0;O=f[k>>2]|0;P=f[O+(f[N+(M<<2)>>2]<<2)>>2]|0;Q=M+1|0;R=((Q>>>0)%3|0|0)==0?M+-2|0:Q;if((R|0)==-1)S=-1;else S=f[N+(R<<2)>>2]|0;R=f[O+(S<<2)>>2]|0;Q=(((M>>>0)%3|0|0)==0?2:-1)+M|0;if((Q|0)==-1)T=-1;else T=f[N+(Q<<2)>>2]|0;Q=f[O+(T<<2)>>2]|0;if((P|0)<(H|0)&(R|0)<(H|0)&(Q|0)<(H|0)){O=X(P,e)|0;P=X(R,e)|0;R=X(Q,e)|0;if(t){Q=0;do{f[n+(Q<<2)>>2]=(f[b+(Q+R<<2)>>2]|0)+(f[b+(Q+P<<2)>>2]|0)-(f[b+(Q+O<<2)>>2]|0);Q=Q+1|0}while((Q|0)!=(e|0));if(t){Q=0;do{O=m+(Q<<2)|0;f[O>>2]=(f[O>>2]|0)+(f[n+(Q<<2)>>2]|0);Q=Q+1|0}while((Q|0)!=(e|0))}}U=K+1|0}else U=K}else U=K;Q=(((L>>>0)%3|0|0)==0?2:-1)+L|0;do if((Q|0)!=-1?(O=f[s+(Q<<2)>>2]|0,(O|0)!=-1):0)if(!((O>>>0)%3|0)){V=O+2|0;break}else{V=O+-1|0;break}else V=-1;while(0);L=(V|0)==(F|0)?-1:V;if((L|0)==-1)break;else K=U}K=X(H,e)|0;if(!U){W=K;Y=30}else{if(t){L=0;do{F=m+(L<<2)|0;f[F>>2]=(f[F>>2]|0)/(U|0)|0;L=L+1|0}while((L|0)!=(e|0))}L=b+(K<<2)|0;F=c+(K<<2)|0;s=f[L+4>>2]|0;Q=f[m>>2]|0;O=f[z>>2]|0;f[h>>2]=f[L>>2];f[A>>2]=s;f[i>>2]=Q;f[B>>2]=O;Od(d,v,h,i);f[F>>2]=f[d>>2];f[F+4>>2]=f[C>>2]}}else{W=X(H,e)|0;Y=30}if((Y|0)==30){Y=0;F=b+(W<<2)|0;O=b+((X(G+-2|0,e)|0)<<2)|0;Q=c+(W<<2)|0;s=f[F+4>>2]|0;L=f[O>>2]|0;P=f[O+4>>2]|0;f[h>>2]=f[F>>2];f[w>>2]=s;f[i>>2]=L;f[x>>2]=P;Od(d,v,h,i);f[Q>>2]=f[d>>2];f[Q+4>>2]=f[y>>2]}if((G|0)<=2)break a;Q=f[l>>2]|0;I=f[Q>>2]|0;P=H+-1|0;if((f[Q+4>>2]|0)-I>>2>>>0<=P>>>0){J=Q;break}else{Q=H;H=P;G=Q}}aq(J)}while(0);if((e|0)<=0){Z=a+8|0;_=b+4|0;$=f[b>>2]|0;aa=f[_>>2]|0;ba=m+4|0;ca=f[m>>2]|0;da=f[ba>>2]|0;f[h>>2]=$;ea=h+4|0;f[ea>>2]=aa;f[i>>2]=ca;fa=i+4|0;f[fa>>2]=da;Od(d,Z,h,i);ga=f[d>>2]|0;f[c>>2]=ga;ha=d+4|0;ia=f[ha>>2]|0;ja=c+4|0;f[ja>>2]=ia;Mq(n);Mq(m);u=g;return 1}sj(m|0,0,e<<2|0)|0;Z=a+8|0;_=b+4|0;$=f[b>>2]|0;aa=f[_>>2]|0;ba=m+4|0;ca=f[m>>2]|0;da=f[ba>>2]|0;f[h>>2]=$;ea=h+4|0;f[ea>>2]=aa;f[i>>2]=ca;fa=i+4|0;f[fa>>2]=da;Od(d,Z,h,i);ga=f[d>>2]|0;f[c>>2]=ga;ha=d+4|0;ia=f[ha>>2]|0;ja=c+4|0;f[ja>>2]=ia;Mq(n);Mq(m);u=g;return 1}function Jc(a,b,c,d,e,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0;g=a+8|0;Mh(g,b,d,e);d=e>>>0>1073741823?-1:e<<2;h=Lq(d)|0;sj(h|0,0,d|0)|0;d=f[a+48>>2]|0;i=f[a+56>>2]|0;j=f[i>>2]|0;k=(f[i+4>>2]|0)-j|0;l=k>>2;a:do if((k|0)>4){m=f[a+52>>2]|0;n=a+16|0;o=a+32|0;p=a+12|0;q=a+28|0;r=a+20|0;s=a+24|0;t=d+12|0;u=(e|0)>0;v=j;w=l;while(1){x=w;w=w+-1|0;if(l>>>0<=w>>>0)break;y=f[v+(w<<2)>>2]|0;z=X(w,e)|0;if((y|0)!=-1?(A=f[(f[t>>2]|0)+(y<<2)>>2]|0,(A|0)!=-1):0){y=f[d>>2]|0;B=f[m>>2]|0;C=f[B+(f[y+(A<<2)>>2]<<2)>>2]|0;D=A+1|0;E=((D>>>0)%3|0|0)==0?A+-2|0:D;if((E|0)==-1)F=-1;else F=f[y+(E<<2)>>2]|0;E=f[B+(F<<2)>>2]|0;D=(((A>>>0)%3|0|0)==0?2:-1)+A|0;if((D|0)==-1)G=-1;else G=f[y+(D<<2)>>2]|0;D=f[B+(G<<2)>>2]|0;if((C|0)<(w|0)&(E|0)<(w|0)&(D|0)<(w|0)){B=X(C,e)|0;C=X(E,e)|0;E=X(D,e)|0;if(u){D=0;do{f[h+(D<<2)>>2]=(f[b+(D+E<<2)>>2]|0)+(f[b+(D+C<<2)>>2]|0)-(f[b+(D+B<<2)>>2]|0);D=D+1|0}while((D|0)!=(e|0))}D=b+(z<<2)|0;B=c+(z<<2)|0;C=f[g>>2]|0;if((C|0)>0){E=0;y=h;A=C;while(1){if((A|0)>0){C=0;do{H=f[y+(C<<2)>>2]|0;I=f[n>>2]|0;if((H|0)>(I|0)){J=f[o>>2]|0;f[J+(C<<2)>>2]=I;K=J}else{J=f[p>>2]|0;I=f[o>>2]|0;f[I+(C<<2)>>2]=(H|0)<(J|0)?J:H;K=I}C=C+1|0}while((C|0)<(f[g>>2]|0));L=K}else L=f[o>>2]|0;C=(f[D+(E<<2)>>2]|0)-(f[L+(E<<2)>>2]|0)|0;I=B+(E<<2)|0;f[I>>2]=C;if((C|0)>=(f[q>>2]|0)){if((C|0)>(f[s>>2]|0)){M=C-(f[r>>2]|0)|0;N=42}}else{M=(f[r>>2]|0)+C|0;N=42}if((N|0)==42){N=0;f[I>>2]=M}E=E+1|0;A=f[g>>2]|0;if((E|0)>=(A|0))break;else y=L}}}else N=16}else N=16;if((N|0)==16?(N=0,y=b+(z<<2)|0,A=c+(z<<2)|0,E=f[g>>2]|0,(E|0)>0):0){B=0;D=b+((X(x+-2|0,e)|0)<<2)|0;I=E;while(1){if((I|0)>0){E=0;do{C=f[D+(E<<2)>>2]|0;H=f[n>>2]|0;if((C|0)>(H|0)){J=f[o>>2]|0;f[J+(E<<2)>>2]=H;O=J}else{J=f[p>>2]|0;H=f[o>>2]|0;f[H+(E<<2)>>2]=(C|0)<(J|0)?J:C;O=H}E=E+1|0}while((E|0)<(f[g>>2]|0));P=O}else P=f[o>>2]|0;E=(f[y+(B<<2)>>2]|0)-(f[P+(B<<2)>>2]|0)|0;H=A+(B<<2)|0;f[H>>2]=E;if((E|0)>=(f[q>>2]|0)){if((E|0)>(f[s>>2]|0)){Q=E-(f[r>>2]|0)|0;N=29}}else{Q=(f[r>>2]|0)+E|0;N=29}if((N|0)==29){N=0;f[H>>2]=Q}B=B+1|0;I=f[g>>2]|0;if((B|0)>=(I|0))break;else D=P}}if((x|0)<=2)break a}aq(i)}while(0);if((e|0)>0)sj(h|0,0,e<<2|0)|0;e=f[g>>2]|0;if((e|0)<=0){Mq(h);return 1}i=a+16|0;P=a+32|0;Q=a+12|0;O=a+28|0;L=a+20|0;M=a+24|0;a=0;K=h;G=e;while(1){if((G|0)>0){e=0;do{F=f[K+(e<<2)>>2]|0;d=f[i>>2]|0;if((F|0)>(d|0)){l=f[P>>2]|0;f[l+(e<<2)>>2]=d;R=l}else{l=f[Q>>2]|0;d=f[P>>2]|0;f[d+(e<<2)>>2]=(F|0)<(l|0)?l:F;R=d}e=e+1|0}while((e|0)<(f[g>>2]|0));S=R}else S=f[P>>2]|0;e=(f[b+(a<<2)>>2]|0)-(f[S+(a<<2)>>2]|0)|0;d=c+(a<<2)|0;f[d>>2]=e;if((e|0)>=(f[O>>2]|0)){if((e|0)>(f[M>>2]|0)){T=e-(f[L>>2]|0)|0;N=56}}else{T=(f[L>>2]|0)+e|0;N=56}if((N|0)==56){N=0;f[d>>2]=T}a=a+1|0;G=f[g>>2]|0;if((a|0)>=(G|0))break;else K=S}Mq(h);return 1}function Kc(a,b,c,d,e,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0;g=u;u=u+32|0;d=g+16|0;h=g+8|0;i=g;j=f[a+28>>2]|0;k=f[a+32>>2]|0;l=e>>>0>1073741823?-1:e<<2;m=Lq(l)|0;sj(m|0,0,l|0)|0;n=Lq(l)|0;sj(n|0,0,l|0)|0;l=a+36|0;o=f[l>>2]|0;p=f[o+4>>2]|0;q=f[o>>2]|0;r=p-q|0;a:do if((r|0)>4){s=r>>2;t=(e|0)>0;v=a+8|0;w=h+4|0;x=i+4|0;y=d+4|0;z=m+4|0;A=h+4|0;B=i+4|0;C=d+4|0;D=j+64|0;E=j+28|0;F=e<<2;G=s+-1|0;if(p-q>>2>>>0>G>>>0){H=s;I=G;J=q}else{K=o;aq(K)}while(1){G=f[J+(I<<2)>>2]|0;if(t)sj(m|0,0,F|0)|0;if((G|0)!=-1){s=f[j>>2]|0;L=0;M=G;while(1){if(((f[s+(M>>>5<<2)>>2]&1<<(M&31)|0)==0?(N=f[(f[(f[D>>2]|0)+12>>2]|0)+(M<<2)>>2]|0,(N|0)!=-1):0)?(O=f[E>>2]|0,P=f[k>>2]|0,Q=f[P+(f[O+(N<<2)>>2]<<2)>>2]|0,R=N+1|0,S=f[P+(f[O+((((R>>>0)%3|0|0)==0?N+-2|0:R)<<2)>>2]<<2)>>2]|0,R=f[P+(f[O+((((N>>>0)%3|0|0)==0?2:-1)+N<<2)>>2]<<2)>>2]|0,(Q|0)<(I|0)&(S|0)<(I|0)&(R|0)<(I|0)):0){N=X(Q,e)|0;Q=X(S,e)|0;S=X(R,e)|0;if(t){R=0;do{f[n+(R<<2)>>2]=(f[b+(R+S<<2)>>2]|0)+(f[b+(R+Q<<2)>>2]|0)-(f[b+(R+N<<2)>>2]|0);R=R+1|0}while((R|0)!=(e|0));if(t){R=0;do{N=m+(R<<2)|0;f[N>>2]=(f[N>>2]|0)+(f[n+(R<<2)>>2]|0);R=R+1|0}while((R|0)!=(e|0))}}T=L+1|0}else T=L;R=(((M>>>0)%3|0|0)==0?2:-1)+M|0;do if(((R|0)!=-1?(f[s+(R>>>5<<2)>>2]&1<<(R&31)|0)==0:0)?(N=f[(f[(f[D>>2]|0)+12>>2]|0)+(R<<2)>>2]|0,(N|0)!=-1):0)if(!((N>>>0)%3|0)){U=N+2|0;break}else{U=N+-1|0;break}else U=-1;while(0);M=(U|0)==(G|0)?-1:U;if((M|0)==-1)break;else L=T}L=X(I,e)|0;if(!T){V=L;W=28}else{if(t){M=0;do{G=m+(M<<2)|0;f[G>>2]=(f[G>>2]|0)/(T|0)|0;M=M+1|0}while((M|0)!=(e|0))}M=b+(L<<2)|0;G=c+(L<<2)|0;s=f[M+4>>2]|0;R=f[m>>2]|0;N=f[z>>2]|0;f[h>>2]=f[M>>2];f[A>>2]=s;f[i>>2]=R;f[B>>2]=N;Od(d,v,h,i);f[G>>2]=f[d>>2];f[G+4>>2]=f[C>>2]}}else{V=X(I,e)|0;W=28}if((W|0)==28){W=0;G=b+(V<<2)|0;N=b+((X(H+-2|0,e)|0)<<2)|0;R=c+(V<<2)|0;s=f[G+4>>2]|0;M=f[N>>2]|0;Q=f[N+4>>2]|0;f[h>>2]=f[G>>2];f[w>>2]=s;f[i>>2]=M;f[x>>2]=Q;Od(d,v,h,i);f[R>>2]=f[d>>2];f[R+4>>2]=f[y>>2]}if((H|0)<=2)break a;R=f[l>>2]|0;J=f[R>>2]|0;Q=I+-1|0;if((f[R+4>>2]|0)-J>>2>>>0<=Q>>>0){K=R;break}else{R=I;I=Q;H=R}}aq(K)}while(0);if((e|0)<=0){Y=a+8|0;Z=b+4|0;_=f[b>>2]|0;$=f[Z>>2]|0;aa=m+4|0;ba=f[m>>2]|0;ca=f[aa>>2]|0;f[h>>2]=_;da=h+4|0;f[da>>2]=$;f[i>>2]=ba;ea=i+4|0;f[ea>>2]=ca;Od(d,Y,h,i);fa=f[d>>2]|0;f[c>>2]=fa;ga=d+4|0;ha=f[ga>>2]|0;ia=c+4|0;f[ia>>2]=ha;Mq(n);Mq(m);u=g;return 1}sj(m|0,0,e<<2|0)|0;Y=a+8|0;Z=b+4|0;_=f[b>>2]|0;$=f[Z>>2]|0;aa=m+4|0;ba=f[m>>2]|0;ca=f[aa>>2]|0;f[h>>2]=_;da=h+4|0;f[da>>2]=$;f[i>>2]=ba;ea=i+4|0;f[ea>>2]=ca;Od(d,Y,h,i);fa=f[d>>2]|0;f[c>>2]=fa;ga=d+4|0;ha=f[ga>>2]|0;ia=c+4|0;f[ia>>2]=ha;Mq(n);Mq(m);u=g;return 1}function Lc(a,b,c,d,e,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0;g=a+8|0;Mh(g,b,d,e);d=e>>>0>1073741823?-1:e<<2;h=Lq(d)|0;sj(h|0,0,d|0)|0;d=f[a+48>>2]|0;i=f[a+56>>2]|0;j=f[i>>2]|0;k=(f[i+4>>2]|0)-j|0;l=k>>2;a:do if((k|0)>4){m=f[a+52>>2]|0;n=a+16|0;o=a+32|0;p=a+12|0;q=a+28|0;r=a+20|0;s=a+24|0;t=d+64|0;u=d+28|0;v=(e|0)>0;w=j;x=l;while(1){y=x;x=x+-1|0;if(l>>>0<=x>>>0)break;z=f[w+(x<<2)>>2]|0;A=X(x,e)|0;if((((z|0)!=-1?(f[(f[d>>2]|0)+(z>>>5<<2)>>2]&1<<(z&31)|0)==0:0)?(B=f[(f[(f[t>>2]|0)+12>>2]|0)+(z<<2)>>2]|0,(B|0)!=-1):0)?(z=f[u>>2]|0,C=f[m>>2]|0,D=f[C+(f[z+(B<<2)>>2]<<2)>>2]|0,E=B+1|0,F=f[C+(f[z+((((E>>>0)%3|0|0)==0?B+-2|0:E)<<2)>>2]<<2)>>2]|0,E=f[C+(f[z+((((B>>>0)%3|0|0)==0?2:-1)+B<<2)>>2]<<2)>>2]|0,(D|0)<(x|0)&(F|0)<(x|0)&(E|0)<(x|0)):0){B=X(D,e)|0;D=X(F,e)|0;F=X(E,e)|0;if(v){E=0;do{f[h+(E<<2)>>2]=(f[b+(E+F<<2)>>2]|0)+(f[b+(E+D<<2)>>2]|0)-(f[b+(E+B<<2)>>2]|0);E=E+1|0}while((E|0)!=(e|0))}E=b+(A<<2)|0;B=c+(A<<2)|0;D=f[g>>2]|0;if((D|0)>0){F=0;z=h;C=D;while(1){if((C|0)>0){D=0;do{G=f[z+(D<<2)>>2]|0;H=f[n>>2]|0;if((G|0)>(H|0)){I=f[o>>2]|0;f[I+(D<<2)>>2]=H;J=I}else{I=f[p>>2]|0;H=f[o>>2]|0;f[H+(D<<2)>>2]=(G|0)<(I|0)?I:G;J=H}D=D+1|0}while((D|0)<(f[g>>2]|0));K=J}else K=f[o>>2]|0;D=(f[E+(F<<2)>>2]|0)-(f[K+(F<<2)>>2]|0)|0;H=B+(F<<2)|0;f[H>>2]=D;if((D|0)>=(f[q>>2]|0)){if((D|0)>(f[s>>2]|0)){L=D-(f[r>>2]|0)|0;M=39}}else{L=(f[r>>2]|0)+D|0;M=39}if((M|0)==39){M=0;f[H>>2]=L}F=F+1|0;C=f[g>>2]|0;if((F|0)>=(C|0))break;else z=K}}}else M=13;if((M|0)==13?(M=0,z=b+(A<<2)|0,C=c+(A<<2)|0,F=f[g>>2]|0,(F|0)>0):0){B=0;E=b+((X(y+-2|0,e)|0)<<2)|0;H=F;while(1){if((H|0)>0){F=0;do{D=f[E+(F<<2)>>2]|0;G=f[n>>2]|0;if((D|0)>(G|0)){I=f[o>>2]|0;f[I+(F<<2)>>2]=G;N=I}else{I=f[p>>2]|0;G=f[o>>2]|0;f[G+(F<<2)>>2]=(D|0)<(I|0)?I:D;N=G}F=F+1|0}while((F|0)<(f[g>>2]|0));O=N}else O=f[o>>2]|0;F=(f[z+(B<<2)>>2]|0)-(f[O+(B<<2)>>2]|0)|0;G=C+(B<<2)|0;f[G>>2]=F;if((F|0)>=(f[q>>2]|0)){if((F|0)>(f[s>>2]|0)){P=F-(f[r>>2]|0)|0;M=26}}else{P=(f[r>>2]|0)+F|0;M=26}if((M|0)==26){M=0;f[G>>2]=P}B=B+1|0;H=f[g>>2]|0;if((B|0)>=(H|0))break;else E=O}}if((y|0)<=2)break a}aq(i)}while(0);if((e|0)>0)sj(h|0,0,e<<2|0)|0;e=f[g>>2]|0;if((e|0)<=0){Mq(h);return 1}i=a+16|0;O=a+32|0;P=a+12|0;N=a+28|0;K=a+20|0;L=a+24|0;a=0;J=h;d=e;while(1){if((d|0)>0){e=0;do{l=f[J+(e<<2)>>2]|0;j=f[i>>2]|0;if((l|0)>(j|0)){k=f[O>>2]|0;f[k+(e<<2)>>2]=j;Q=k}else{k=f[P>>2]|0;j=f[O>>2]|0;f[j+(e<<2)>>2]=(l|0)<(k|0)?k:l;Q=j}e=e+1|0}while((e|0)<(f[g>>2]|0));R=Q}else R=f[O>>2]|0;e=(f[b+(a<<2)>>2]|0)-(f[R+(a<<2)>>2]|0)|0;j=c+(a<<2)|0;f[j>>2]=e;if((e|0)>=(f[N>>2]|0)){if((e|0)>(f[L>>2]|0)){S=e-(f[K>>2]|0)|0;M=53}}else{S=(f[K>>2]|0)+e|0;M=53}if((M|0)==53){M=0;f[j>>2]=S}a=a+1|0;d=f[g>>2]|0;if((a|0)>=(d|0))break;else J=R}Mq(h);return 1}function Mc(a,c,d,e,g){a=a|0;c=c|0;d=d|0;e=e|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,J=0;h=u;u=u+48|0;i=h+28|0;j=h+24|0;k=h;l=h+12|0;m=h+40|0;if((c|0)<0){n=0;u=h;return n|0}if(!c){n=1;u=h;return n|0}o=(d|0)>1;p=o?d:1;f[k>>2]=0;d=k+4|0;f[d>>2]=0;f[k+8>>2]=0;gk(k,c);q=k+8|0;if(o){o=0;r=0;while(1){s=1;t=f[a+(r<<2)>>2]|0;do{v=f[a+(s+r<<2)>>2]|0;t=t>>>0<v>>>0?v:t;s=s+1|0}while((s|0)!=(p|0));s=(_(t|0)|0)^31;v=t>>>0>o>>>0?t:o;w=(t|0)==0?1:s+1|0;f[i>>2]=w;s=f[d>>2]|0;if(s>>>0<(f[q>>2]|0)>>>0){f[s>>2]=w;f[d>>2]=s+4}else Ri(k,i);r=r+p|0;if((r|0)>=(c|0)){x=v;break}else o=v}}else{o=0;r=0;while(1){v=f[a+(o<<2)>>2]|0;s=(_(v|0)|0)^31;w=v>>>0>r>>>0?v:r;y=(v|0)==0?1:s+1|0;f[i>>2]=y;s=f[d>>2]|0;if(s>>>0<(f[q>>2]|0)>>>0){f[s>>2]=y;f[d>>2]=s+4}else Ri(k,i);o=o+p|0;if((o|0)>=(c|0)){x=w;break}else r=w}}f[l>>2]=0;r=l+4|0;f[r>>2]=0;f[l+8>>2]=0;o=f[k>>2]|0;q=(f[d>>2]|0)-o|0;w=q>>2;if(w){if(w>>>0>1073741823)aq(l);s=ln(q)|0;f[r>>2]=s;f[l>>2]=s;f[l+8>>2]=s+(w<<2);w=s;if((q|0)>0){y=s+(q>>>2<<2)|0;kh(s|0,o|0,q|0)|0;f[r>>2]=y;q=y-w>>2;if((y|0)==(s|0)){z=q;A=s;B=0;C=0}else{y=0;o=0;v=0;while(1){D=Vn(o|0,v|0,f[s+(y<<2)>>2]|0,0)|0;E=I;y=y+1|0;if(y>>>0>=q>>>0){z=q;A=s;B=D;C=E;break}else{o=D;v=E}}}}else{F=w;G=18}}else{F=0;G=18}if((G|0)==18){z=0;A=F;B=0;C=0}F=Jg(A,z,32,i)|0;z=I;A=f[i>>2]<<3;w=Tn(A|0,((A|0)<0)<<31>>31|0,1)|0;A=I;v=un(B|0,C|0,p|0,0)|0;C=Vn(F|0,z|0,v|0,I|0)|0;v=Vn(C|0,I|0,w|0,A|0)|0;A=I;w=f[l>>2]|0;if(w|0){l=f[r>>2]|0;if((l|0)!=(w|0))f[r>>2]=l+(~((l+-4-w|0)>>>2)<<2);Oq(w)}w=Jg(a,c,x,i)|0;l=f[i>>2]|0;r=((x-l|0)/64|0)+l<<3;C=l<<3;z=Vn(w|0,I|0,C|0,((C|0)<0)<<31>>31|0)|0;C=Vn(z|0,I|0,r|0,((r|0)<0)<<31>>31|0)|0;r=I;z=(_((x>>>0>1?x:1)|0)|0)^30;if(e){f[i>>2]=0;f[i+4>>2]=0;f[i+8>>2]=0;w=ln(32)|0;f[i>>2]=w;f[i+8>>2]=-2147483616;f[i+4>>2]=22;F=w;B=15964;o=F+22|0;do{b[F>>0]=b[B>>0]|0;F=F+1|0;B=B+1|0}while((F|0)<(o|0));b[w+22>>0]=0;w=(Jh(e,i)|0)==0;if((b[i+11>>0]|0)<0)Oq(f[i>>2]|0);if(!w){f[i>>2]=0;f[i+4>>2]=0;f[i+8>>2]=0;w=ln(32)|0;f[i>>2]=w;f[i+8>>2]=-2147483616;f[i+4>>2]=22;F=w;B=15964;o=F+22|0;do{b[F>>0]=b[B>>0]|0;F=F+1|0;B=B+1|0}while((F|0)<(o|0));b[w+22>>0]=0;w=Mk(e,i)|0;if((b[i+11>>0]|0)<0)Oq(f[i>>2]|0);H=w}else G=32}else G=32;if((G|0)==32)H=z>>>0<18&((A|0)>(r|0)|(A|0)==(r|0)&v>>>0>=C>>>0)&1;b[m>>0]=H;C=g+16|0;v=f[C+4>>2]|0;if(!((v|0)>0|(v|0)==0&(f[C>>2]|0)>>>0>0)){f[j>>2]=f[g+4>>2];f[i>>2]=f[j>>2];Me(g,i,m,m+1|0)|0}switch(H|0){case 0:{J=td(a,c,p,k,g)|0;break}case 1:{J=Tc(a,c,x,l,e,g)|0;break}default:J=0}g=f[k>>2]|0;if(g|0){k=f[d>>2]|0;if((k|0)!=(g|0))f[d>>2]=k+(~((k+-4-g|0)>>>2)<<2);Oq(g)}n=J;u=h;return n|0}function Nc(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;if((b|0)<0)return;c=a+12|0;d=f[c>>2]|0;e=f[a+8>>2]|0;g=e;h=d;if(d-e>>2>>>0<=b>>>0)return;e=g+(b<<2)|0;d=f[(f[e>>2]|0)+56>>2]|0;i=f[(f[g+(b<<2)>>2]|0)+60>>2]|0;g=e+4|0;if((g|0)!=(h|0)){j=g;g=e;do{k=f[j>>2]|0;f[j>>2]=0;l=f[g>>2]|0;f[g>>2]=k;if(l|0){k=l+88|0;m=f[k>>2]|0;f[k>>2]=0;if(m|0){k=f[m+8>>2]|0;if(k|0){n=m+12|0;if((f[n>>2]|0)!=(k|0))f[n>>2]=k;Oq(k)}Oq(m)}m=f[l+68>>2]|0;if(m|0){k=l+72|0;n=f[k>>2]|0;if((n|0)!=(m|0))f[k>>2]=n+(~((n+-4-m|0)>>>2)<<2);Oq(m)}m=l+64|0;n=f[m>>2]|0;f[m>>2]=0;if(n|0){m=f[n>>2]|0;if(m|0){k=n+4|0;if((f[k>>2]|0)!=(m|0))f[k>>2]=m;Oq(m)}Oq(n)}Oq(l)}j=j+4|0;g=g+4|0}while((j|0)!=(h|0));j=f[c>>2]|0;if((j|0)!=(g|0)){o=g;p=j;q=24}}else{o=e;p=h;q=24}if((q|0)==24){q=p;do{p=q+-4|0;f[c>>2]=p;h=f[p>>2]|0;f[p>>2]=0;if(h|0){p=h+88|0;e=f[p>>2]|0;f[p>>2]=0;if(e|0){p=f[e+8>>2]|0;if(p|0){j=e+12|0;if((f[j>>2]|0)!=(p|0))f[j>>2]=p;Oq(p)}Oq(e)}e=f[h+68>>2]|0;if(e|0){p=h+72|0;j=f[p>>2]|0;if((j|0)!=(e|0))f[p>>2]=j+(~((j+-4-e|0)>>>2)<<2);Oq(e)}e=h+64|0;j=f[e>>2]|0;f[e>>2]=0;if(j|0){e=f[j>>2]|0;if(e|0){p=j+4|0;if((f[p>>2]|0)!=(e|0))f[p>>2]=e;Oq(e)}Oq(j)}Oq(h)}q=f[c>>2]|0}while((q|0)!=(o|0))}o=f[a+4>>2]|0;a:do if(o|0){q=o+44|0;c=f[q>>2]|0;h=f[o+40>>2]|0;while(1){if((h|0)==(c|0))break a;r=h+4|0;if((f[(f[h>>2]|0)+40>>2]|0)==(i|0))break;else h=r}if((r|0)!=(c|0)){j=r;e=h;do{p=f[j>>2]|0;f[j>>2]=0;g=f[e>>2]|0;f[e>>2]=p;if(g|0){bj(g);Oq(g)}j=j+4|0;e=e+4|0}while((j|0)!=(c|0));j=f[q>>2]|0;if((j|0)==(e|0))break;else{s=e;t=j}}else{s=h;t=c}j=t;do{g=j+-4|0;f[q>>2]=g;p=f[g>>2]|0;f[g>>2]=0;if(p|0){bj(p);Oq(p)}j=f[q>>2]|0}while((j|0)!=(s|0))}while(0);b:do if((d|0)<5){s=f[a+20+(d*12|0)>>2]|0;t=a+20+(d*12|0)+4|0;r=f[t>>2]|0;i=r;c:do if((s|0)==(r|0))u=s;else{o=s;while(1){if((f[o>>2]|0)==(b|0)){u=o;break c}o=o+4|0;if((o|0)==(r|0))break b}}while(0);if((u|0)!=(r|0)){s=u+4|0;o=i-s|0;j=o>>2;if(!j)v=r;else{im(u|0,s|0,o|0)|0;v=f[t>>2]|0}o=u+(j<<2)|0;if((v|0)!=(o|0))f[t>>2]=v+(~((v+-4-o|0)>>>2)<<2)}}while(0);v=f[a+24>>2]|0;u=f[a+20>>2]|0;d=u;if((v|0)!=(u|0)){o=v-u>>2;u=0;do{v=d+(u<<2)|0;j=f[v>>2]|0;if((j|0)>(b|0))f[v>>2]=j+-1;u=u+1|0}while(u>>>0<o>>>0)}o=f[a+36>>2]|0;u=f[a+32>>2]|0;d=u;if((o|0)!=(u|0)){j=o-u>>2;u=0;do{o=d+(u<<2)|0;v=f[o>>2]|0;if((v|0)>(b|0))f[o>>2]=v+-1;u=u+1|0}while(u>>>0<j>>>0)}j=f[a+48>>2]|0;u=f[a+44>>2]|0;d=u;if((j|0)!=(u|0)){v=j-u>>2;u=0;do{j=d+(u<<2)|0;o=f[j>>2]|0;if((o|0)>(b|0))f[j>>2]=o+-1;u=u+1|0}while(u>>>0<v>>>0)}v=f[a+60>>2]|0;u=f[a+56>>2]|0;d=u;if((v|0)!=(u|0)){o=v-u>>2;u=0;do{v=d+(u<<2)|0;j=f[v>>2]|0;if((j|0)>(b|0))f[v>>2]=j+-1;u=u+1|0}while(u>>>0<o>>>0)}o=f[a+72>>2]|0;u=f[a+68>>2]|0;a=u;if((o|0)==(u|0))return;d=o-u>>2;u=0;do{o=a+(u<<2)|0;j=f[o>>2]|0;if((j|0)>(b|0))f[o>>2]=j+-1;u=u+1|0}while(u>>>0<d>>>0);return}function Oc(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0;e=a+8|0;a:do if(f[e>>2]|0?(g=f[a>>2]|0,h=a+4|0,f[a>>2]=h,f[(f[h>>2]|0)+8>>2]=0,f[h>>2]=0,f[e>>2]=0,i=f[g+4>>2]|0,j=(i|0)==0?g:i,j|0):0){i=a+4|0;g=j;j=f[c>>2]|0;while(1){if((j|0)==(f[d>>2]|0))break;k=g+16|0;am(k,j+16|0)|0;am(g+28|0,j+28|0)|0;l=g+8|0;m=f[l>>2]|0;do if(m){n=f[m>>2]|0;if((n|0)==(g|0)){f[m>>2]=0;o=f[m+4>>2]|0;if(!o){p=m;break}else q=o;while(1){o=f[q>>2]|0;if(o|0){q=o;continue}o=f[q+4>>2]|0;if(!o)break;else q=o}p=q;break}else{f[m+4>>2]=0;if(!n){p=m;break}else r=n;while(1){o=f[r>>2]|0;if(o|0){r=o;continue}o=f[r+4>>2]|0;if(!o)break;else r=o}p=r;break}}else p=0;while(0);m=f[h>>2]|0;do if(m){n=b[k+11>>0]|0;o=n<<24>>24<0;s=o?f[g+20>>2]|0:n&255;n=o?f[k>>2]|0:k;o=m;while(1){t=o+16|0;u=b[t+11>>0]|0;v=u<<24>>24<0;w=v?f[o+20>>2]|0:u&255;u=w>>>0<s>>>0?w:s;if((u|0)!=0?(x=Vk(n,v?f[t>>2]|0:t,u)|0,(x|0)!=0):0)if((x|0)<0)y=22;else y=24;else if(s>>>0<w>>>0)y=22;else y=24;if((y|0)==22){y=0;w=f[o>>2]|0;if(!w){y=23;break}else z=w}else if((y|0)==24){y=0;A=o+4|0;w=f[A>>2]|0;if(!w){y=26;break}else z=w}o=z}if((y|0)==23){y=0;B=o;C=o;break}else if((y|0)==26){y=0;B=A;C=o;break}}else{B=h;C=h}while(0);f[g>>2]=0;f[g+4>>2]=0;f[l>>2]=C;f[B>>2]=g;m=f[f[a>>2]>>2]|0;if(!m)D=g;else{f[a>>2]=m;D=f[B>>2]|0}Oe(f[i>>2]|0,D);f[e>>2]=(f[e>>2]|0)+1;m=f[j+4>>2]|0;if(!m){k=j+8|0;s=f[k>>2]|0;if((f[s>>2]|0)==(j|0))E=s;else{s=k;do{k=f[s>>2]|0;s=k+8|0;n=f[s>>2]|0}while((f[n>>2]|0)!=(k|0));E=n}}else{s=m;while(1){l=f[s>>2]|0;if(!l)break;else s=l}E=s}f[c>>2]=E;if(!p)break a;else{g=p;j=E}}j=f[g+8>>2]|0;if(!j)F=g;else{i=j;while(1){j=f[i+8>>2]|0;if(!j)break;else i=j}F=i}Ej(a,F)}while(0);F=f[c>>2]|0;E=f[d>>2]|0;if((F|0)==(E|0))return;else G=F;while(1){bf(a,G+16|0)|0;F=f[G+4>>2]|0;if(!F){d=G+8|0;p=f[d>>2]|0;if((f[p>>2]|0)==(G|0))H=p;else{p=d;do{d=f[p>>2]|0;p=d+8|0;e=f[p>>2]|0}while((f[e>>2]|0)!=(d|0));H=e}}else{p=F;while(1){i=f[p>>2]|0;if(!i)break;else p=i}H=p}f[c>>2]=H;if((H|0)==(E|0))break;else G=H}return}function Pc(a){a=a|0;var b=0,c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0;b=u;u=u+32|0;c=b+4|0;d=b;e=a+16|0;g=f[e>>2]|0;if(g>>>0>112){f[e>>2]=g+-113;g=a+4|0;e=f[g>>2]|0;h=f[e>>2]|0;i=e+4|0;f[g>>2]=i;e=a+8|0;j=f[e>>2]|0;k=a+12|0;l=f[k>>2]|0;m=l;do if((j|0)==(l|0)){n=f[a>>2]|0;o=n;if(i>>>0>n>>>0){p=i;q=((p-o>>2)+1|0)/-2|0;r=i+(q<<2)|0;s=j-p|0;p=s>>2;if(!p)t=i;else{im(r|0,i|0,s|0)|0;t=f[g>>2]|0}s=r+(p<<2)|0;f[e>>2]=s;f[g>>2]=t+(q<<2);v=s;break}s=m-o>>1;o=(s|0)==0?1:s;if(o>>>0>1073741823){s=ra(8)|0;Oo(s,16035);f[s>>2]=7256;va(s|0,1112,110)}s=ln(o<<2)|0;q=s;p=s+(o>>>2<<2)|0;r=p;w=s+(o<<2)|0;if((i|0)==(j|0)){x=r;y=n}else{n=p;p=r;o=i;do{f[n>>2]=f[o>>2];n=p+4|0;p=n;o=o+4|0}while((o|0)!=(j|0));x=p;y=f[a>>2]|0}f[a>>2]=q;f[g>>2]=r;f[e>>2]=x;f[k>>2]=w;if(!y)v=x;else{Oq(y);v=f[e>>2]|0}}else v=j;while(0);f[v>>2]=h;f[e>>2]=(f[e>>2]|0)+4;u=b;return}e=a+8|0;h=f[e>>2]|0;v=a+4|0;j=h-(f[v>>2]|0)|0;y=a+12|0;x=f[y>>2]|0;k=x-(f[a>>2]|0)|0;if(j>>>0>=k>>>0){g=k>>1;k=(g|0)==0?1:g;f[c+12>>2]=0;f[c+16>>2]=a+12;if(k>>>0>1073741823){g=ra(8)|0;Oo(g,16035);f[g>>2]=7256;va(g|0,1112,110)}g=ln(k<<2)|0;f[c>>2]=g;i=g+(j>>2<<2)|0;j=c+8|0;f[j>>2]=i;m=c+4|0;f[m>>2]=i;i=c+12|0;f[i>>2]=g+(k<<2);k=ln(4068)|0;f[d>>2]=k;Ag(c,d);d=f[e>>2]|0;while(1){z=f[v>>2]|0;if((d|0)==(z|0))break;k=d+-4|0;ug(c,k);d=k}k=z;z=f[a>>2]|0;f[a>>2]=f[c>>2];f[c>>2]=z;f[v>>2]=f[m>>2];f[m>>2]=k;m=f[e>>2]|0;f[e>>2]=f[j>>2];f[j>>2]=m;g=f[y>>2]|0;f[y>>2]=f[i>>2];f[i>>2]=g;g=m;if((d|0)!=(g|0))f[j>>2]=g+(~((g+-4-k|0)>>>2)<<2);if(z|0)Oq(z);u=b;return}if((x|0)!=(h|0)){h=ln(4068)|0;f[c>>2]=h;Ag(a,c);u=b;return}h=ln(4068)|0;f[c>>2]=h;ug(a,c);c=f[v>>2]|0;h=f[c>>2]|0;x=c+4|0;f[v>>2]=x;c=f[e>>2]|0;z=f[y>>2]|0;k=z;do if((c|0)==(z|0)){g=f[a>>2]|0;j=g;if(x>>>0>g>>>0){d=x;m=((d-j>>2)+1|0)/-2|0;i=x+(m<<2)|0;t=c-d|0;d=t>>2;if(!d)A=x;else{im(i|0,x|0,t|0)|0;A=f[v>>2]|0}t=i+(d<<2)|0;f[e>>2]=t;f[v>>2]=A+(m<<2);B=t;break}t=k-j>>1;j=(t|0)==0?1:t;if(j>>>0>1073741823){t=ra(8)|0;Oo(t,16035);f[t>>2]=7256;va(t|0,1112,110)}t=ln(j<<2)|0;m=t;d=t+(j>>>2<<2)|0;i=d;l=t+(j<<2)|0;if((x|0)==(c|0)){C=i;D=g}else{g=d;d=i;j=x;do{f[g>>2]=f[j>>2];g=d+4|0;d=g;j=j+4|0}while((j|0)!=(c|0));C=d;D=f[a>>2]|0}f[a>>2]=m;f[v>>2]=i;f[e>>2]=C;f[y>>2]=l;if(!D)B=C;else{Oq(D);B=f[e>>2]|0}}else B=c;while(0);f[B>>2]=h;f[e>>2]=(f[e>>2]|0)+4;u=b;return}function Qc(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0;e=u;u=u+16|0;g=e+8|0;h=e+4|0;i=e;j=a+64|0;k=f[j>>2]|0;if((f[k+28>>2]|0)==(f[k+24>>2]|0)){u=e;return}l=c+96|0;c=a+52|0;m=d+84|0;n=d+68|0;d=a+56|0;o=a+60|0;p=a+12|0;q=a+28|0;r=a+40|0;s=a+44|0;t=a+48|0;v=0;w=0;x=k;while(1){k=f[(f[x+24>>2]|0)+(w<<2)>>2]|0;if((k|0)==-1){y=v;z=x}else{A=v+1|0;B=f[(f[l>>2]|0)+(((k|0)/3|0)*12|0)+(((k|0)%3|0)<<2)>>2]|0;if(!(b[m>>0]|0))C=f[(f[n>>2]|0)+(B<<2)>>2]|0;else C=B;f[g>>2]=C;B=f[d>>2]|0;if(B>>>0<(f[o>>2]|0)>>>0){f[B>>2]=C;f[d>>2]=B+4}else Ri(c,g);f[g>>2]=k;f[h>>2]=0;a:do if(!(f[(f[p>>2]|0)+(w>>>5<<2)>>2]&1<<(w&31)))D=k;else{B=k+1|0;E=((B>>>0)%3|0|0)==0?k+-2|0:B;if(((E|0)!=-1?(f[(f[a>>2]|0)+(E>>>5<<2)>>2]&1<<(E&31)|0)==0:0)?(B=f[(f[(f[j>>2]|0)+12>>2]|0)+(E<<2)>>2]|0,E=B+1|0,(B|0)!=-1):0){F=((E>>>0)%3|0|0)==0?B+-2|0:E;f[h>>2]=F;if((F|0)==-1){D=k;break}else G=F;while(1){f[g>>2]=G;F=G+1|0;E=((F>>>0)%3|0|0)==0?G+-2|0:F;if((E|0)==-1)break;if(f[(f[a>>2]|0)+(E>>>5<<2)>>2]&1<<(E&31)|0)break;F=f[(f[(f[j>>2]|0)+12>>2]|0)+(E<<2)>>2]|0;E=F+1|0;if((F|0)==-1)break;B=((E>>>0)%3|0|0)==0?F+-2|0:E;f[h>>2]=B;if((B|0)==-1){D=G;break a}else G=B}f[h>>2]=-1;D=G;break}f[h>>2]=-1;D=k}while(0);f[(f[q>>2]|0)+(D<<2)>>2]=v;k=f[s>>2]|0;if((k|0)==(f[t>>2]|0))Ri(r,g);else{f[k>>2]=f[g>>2];f[s>>2]=k+4}k=f[j>>2]|0;B=f[g>>2]|0;b:do if(((B|0)!=-1?(E=(((B>>>0)%3|0|0)==0?2:-1)+B|0,(E|0)!=-1):0)?(F=f[(f[k+12>>2]|0)+(E<<2)>>2]|0,(F|0)!=-1):0){E=F+(((F>>>0)%3|0|0)==0?2:-1)|0;f[h>>2]=E;if((E|0)!=-1&(E|0)!=(B|0)){F=A;H=v;I=E;while(1){E=I+1|0;J=((E>>>0)%3|0|0)==0?I+-2|0:E;do if(f[(f[a>>2]|0)+(J>>>5<<2)>>2]&1<<(J&31)){E=F+1|0;K=f[(f[l>>2]|0)+(((I|0)/3|0)*12|0)+(((I|0)%3|0)<<2)>>2]|0;if(!(b[m>>0]|0))L=f[(f[n>>2]|0)+(K<<2)>>2]|0;else L=K;f[i>>2]=L;K=f[d>>2]|0;if(K>>>0<(f[o>>2]|0)>>>0){f[K>>2]=L;f[d>>2]=K+4}else Ri(c,i);K=f[s>>2]|0;if((K|0)==(f[t>>2]|0)){Ri(r,h);M=E;N=F;break}else{f[K>>2]=f[h>>2];f[s>>2]=K+4;M=E;N=F;break}}else{M=F;N=H}while(0);f[(f[q>>2]|0)+(f[h>>2]<<2)>>2]=N;O=f[j>>2]|0;J=f[h>>2]|0;if((J|0)==-1)break;E=(((J>>>0)%3|0|0)==0?2:-1)+J|0;if((E|0)==-1)break;J=f[(f[O+12>>2]|0)+(E<<2)>>2]|0;if((J|0)==-1)break;I=J+(((J>>>0)%3|0|0)==0?2:-1)|0;f[h>>2]=I;if(!((I|0)!=-1?(I|0)!=(f[g>>2]|0):0)){P=M;Q=O;break b}else{F=M;H=N}}f[h>>2]=-1;P=M;Q=O}else{P=A;Q=k}}else R=28;while(0);if((R|0)==28){R=0;f[h>>2]=-1;P=A;Q=k}y=P;z=Q}w=w+1|0;if(w>>>0>=(f[z+28>>2]|0)-(f[z+24>>2]|0)>>2>>>0)break;else{v=y;x=z}}u=e;return}function Rc(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,i=0,j=0.0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,D=0,E=0,F=0;switch(c|0){case 0:{e=-149;g=24;i=4;break}case 1:{e=-1074;g=53;i=4;break}case 2:{e=-1074;g=53;i=4;break}default:j=0.0}a:do if((i|0)==4){c=a+4|0;k=a+100|0;do{l=f[c>>2]|0;if(l>>>0<(f[k>>2]|0)>>>0){f[c>>2]=l+1;m=h[l>>0]|0}else m=Si(a)|0}while((eq(m)|0)!=0);b:do switch(m|0){case 43:case 45:{l=1-(((m|0)==45&1)<<1)|0;n=f[c>>2]|0;if(n>>>0<(f[k>>2]|0)>>>0){f[c>>2]=n+1;o=h[n>>0]|0;p=l;break b}else{o=Si(a)|0;p=l;break b}break}default:{o=m;p=1}}while(0);l=0;n=o;while(1){if((n|32|0)!=(b[18546+l>>0]|0)){q=l;r=n;break}do if(l>>>0<7){s=f[c>>2]|0;if(s>>>0<(f[k>>2]|0)>>>0){f[c>>2]=s+1;t=h[s>>0]|0;break}else{t=Si(a)|0;break}}else t=n;while(0);s=l+1|0;if(s>>>0<8){l=s;n=t}else{q=s;r=t;break}}c:do switch(q|0){case 8:break;case 3:{i=23;break}default:{n=(d|0)!=0;if(n&q>>>0>3)if((q|0)==8)break c;else{i=23;break c}d:do if(!q){l=0;s=r;while(1){if((s|32|0)!=(b[18555+l>>0]|0)){u=l;v=s;break d}do if(l>>>0<2){w=f[c>>2]|0;if(w>>>0<(f[k>>2]|0)>>>0){f[c>>2]=w+1;x=h[w>>0]|0;break}else{x=Si(a)|0;break}}else x=s;while(0);w=l+1|0;if(w>>>0<3){l=w;s=x}else{u=w;v=x;break}}}else{u=q;v=r}while(0);switch(u|0){case 3:{s=f[c>>2]|0;if(s>>>0<(f[k>>2]|0)>>>0){f[c>>2]=s+1;y=h[s>>0]|0}else y=Si(a)|0;if((y|0)==40)z=1;else{if(!(f[k>>2]|0)){j=B;break a}f[c>>2]=(f[c>>2]|0)+-1;j=B;break a}while(1){s=f[c>>2]|0;if(s>>>0<(f[k>>2]|0)>>>0){f[c>>2]=s+1;A=h[s>>0]|0}else A=Si(a)|0;if(!((A+-48|0)>>>0<10|(A+-65|0)>>>0<26)?!((A|0)==95|(A+-97|0)>>>0<26):0)break;z=z+1|0}if((A|0)==41){j=B;break a}s=(f[k>>2]|0)==0;if(!s)f[c>>2]=(f[c>>2]|0)+-1;if(!n){l=Vq()|0;f[l>>2]=22;Ym(a,0);j=0.0;break a}if(!z){j=B;break a}else D=z;while(1){D=D+-1|0;if(!s)f[c>>2]=(f[c>>2]|0)+-1;if(!D){j=B;break a}}break}case 0:{if((v|0)==48){s=f[c>>2]|0;if(s>>>0<(f[k>>2]|0)>>>0){f[c>>2]=s+1;E=h[s>>0]|0}else E=Si(a)|0;if((E|32|0)==120){j=+Fc(a,g,e,p,d);break a}if(!(f[k>>2]|0))F=48;else{f[c>>2]=(f[c>>2]|0)+-1;F=48}}else F=v;j=+nb(a,F,g,e,p,d);break a;break}default:{if(f[k>>2]|0)f[c>>2]=(f[c>>2]|0)+-1;s=Vq()|0;f[s>>2]=22;Ym(a,0);j=0.0;break a}}}}while(0);if((i|0)==23){s=(f[k>>2]|0)==0;if(!s)f[c>>2]=(f[c>>2]|0)+-1;if((d|0)!=0&q>>>0>3){n=q;do{if(!s)f[c>>2]=(f[c>>2]|0)+-1;n=n+-1|0}while(n>>>0>3)}}j=+$($(p|0)*$(C))}while(0);return +j}function Sc(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0;g=u;u=u+16|0;h=g;f[h>>2]=0;f[h+4>>2]=0;f[h+8>>2]=0;i=ln(16)|0;f[h>>2]=i;f[h+8>>2]=-2147483632;f[h+4>>2]=15;j=i;k=14479;l=j+15|0;do{b[j>>0]=b[k>>0]|0;j=j+1|0;k=k+1|0}while((j|0)<(l|0));b[i+15>>0]=0;i=Hk(c,h,-1)|0;if((b[h+11>>0]|0)<0)Oq(f[h>>2]|0);switch(i|0){case 0:{m=ln(52)|0;j=m;l=j+52|0;do{f[j>>2]=0;j=j+4|0}while((j|0)<(l|0));Zn(m);n=4044;o=m;break}case -1:{if((mi(c)|0)==10){m=ln(52)|0;j=m;l=j+52|0;do{f[j>>2]=0;j=j+4|0}while((j|0)<(l|0));Zn(m);n=4044;o=m}else p=6;break}default:p=6}a:do if((p|0)==6){m=d+8|0;q=d+12|0;r=f[q>>2]|0;s=f[m>>2]|0;b:do if((r-s|0)>0){t=h+8|0;v=h+4|0;w=c+16|0;x=h+11|0;y=0;z=s;A=r;c:while(1){B=f[(f[z+(y<<2)>>2]|0)+28>>2]|0;switch(B|0){case 9:{p=12;break}case 6:case 5:case 4:case 2:{C=z;D=A;break}default:{if((B|2|0)!=3)break c;if((B|0)==9)p=12;else{C=z;D=A}}}if((p|0)==12){p=0;f[h>>2]=0;f[h+4>>2]=0;f[h+8>>2]=0;B=ln(32)|0;f[h>>2]=B;f[t>>2]=-2147483616;f[v>>2]=17;j=B;k=14495;l=j+17|0;do{b[j>>0]=b[k>>0]|0;j=j+1|0;k=k+1|0}while((j|0)<(l|0));b[B+17>>0]=0;E=f[w>>2]|0;if(E){F=w;G=E;d:while(1){E=G;while(1){if((f[E+16>>2]|0)>=0)break;H=f[E+4>>2]|0;if(!H){I=F;break d}else E=H}G=f[E>>2]|0;if(!G){I=E;break}else F=E}if(((I|0)!=(w|0)?(f[I+16>>2]|0)<=0:0)?(F=I+20|0,(Jh(F,h)|0)!=0):0)J=Hk(F,h,-1)|0;else p=21}else p=21;if((p|0)==21){p=0;J=Hk(c,h,-1)|0}if((b[x>>0]|0)<0)Oq(f[h>>2]|0);if((J|0)<1)break;C=f[m>>2]|0;D=f[q>>2]|0}y=y+1|0;if((y|0)>=(D-C>>2|0))break b;else{z=C;A=D}}if((i|0)!=1){A=ln(52)|0;j=A;l=j+52|0;do{f[j>>2]=0;j=j+4|0}while((j|0)<(l|0));Zn(A);n=4044;o=A;break a}f[h>>2]=0;f[h+4>>2]=0;f[h+8>>2]=0;z=ln(32)|0;f[h>>2]=z;f[h+8>>2]=-2147483616;f[h+4>>2]=24;j=z;k=14513;l=j+24|0;do{b[j>>0]=b[k>>0]|0;j=j+1|0;k=k+1|0}while((j|0)<(l|0));b[z+24>>0]=0;f[a>>2]=-1;pj(a+4|0,h);if((b[h+11>>0]|0)<0)Oq(f[h>>2]|0);u=g;return}while(0);q=ln(52)|0;j=q;l=j+52|0;do{f[j>>2]=0;j=j+4|0}while((j|0)<(l|0));Zn(q);n=3988;o=q}while(0);f[o>>2]=n;ip(o,d);Md(a,o,c,e);Va[f[(f[o>>2]|0)+4>>2]&127](o);u=g;return}function Tc(a,c,d,e,g,h){a=a|0;c=c|0;d=d|0;e=e|0;g=g|0;h=h|0;var i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;i=u;u=u+32|0;j=i+4|0;k=i;l=i+16|0;m=(_(e|0)|0)^31;if((e|0)>0)if(m>>>0>17){n=0;u=i;return n|0}else o=m+1|0;else o=1;do if(g){m=ln(48)|0;f[j>>2]=m;f[j+8>>2]=-2147483600;f[j+4>>2]=33;e=m;p=15987;q=e+33|0;do{b[e>>0]=b[p>>0]|0;e=e+1|0;p=p+1|0}while((e|0)<(q|0));b[m+33>>0]=0;r=(Jh(g,j)|0)==0;if((b[j+11>>0]|0)<0)Oq(f[j>>2]|0);if(!r){r=ln(48)|0;f[j>>2]=r;f[j+8>>2]=-2147483600;f[j+4>>2]=33;e=r;p=15987;q=e+33|0;do{b[e>>0]=b[p>>0]|0;e=e+1|0;p=p+1|0}while((e|0)<(q|0));b[r+33>>0]=0;p=Mk(g,j)|0;if((b[j+11>>0]|0)<0)Oq(f[j>>2]|0);if((p|0)<4){s=o+-2|0;break}if((p|0)<6){s=o+-1|0;break}if((p|0)>9){s=o+2|0;break}else{s=o+((p|0)>7&1)|0;break}}else s=o}else s=o;while(0);o=(s|0)>1?s:1;s=(o|0)<18?o:18;b[l>>0]=s;o=h+16|0;g=f[o+4>>2]|0;if(!((g|0)>0|(g|0)==0&(f[o>>2]|0)>>>0>0)){f[k>>2]=f[h+4>>2];f[j>>2]=f[k>>2];Me(h,j,l,l+1|0)|0}do switch(s&31){case 1:case 0:{n=ue(a,c,d,h)|0;u=i;return n|0}case 2:{n=te(a,c,d,h)|0;u=i;return n|0}case 3:{n=se(a,c,d,h)|0;u=i;return n|0}case 4:{n=re(a,c,d,h)|0;u=i;return n|0}case 5:{n=qe(a,c,d,h)|0;u=i;return n|0}case 6:{n=pe(a,c,d,h)|0;u=i;return n|0}case 7:{n=oe(a,c,d,h)|0;u=i;return n|0}case 8:{n=ne(a,c,d,h)|0;u=i;return n|0}case 9:{n=me(a,c,d,h)|0;u=i;return n|0}case 10:{n=le(a,c,d,h)|0;u=i;return n|0}case 11:{n=ke(a,c,d,h)|0;u=i;return n|0}case 12:{n=ie(a,c,d,h)|0;u=i;return n|0}case 13:{n=he(a,c,d,h)|0;u=i;return n|0}case 14:{n=ge(a,c,d,h)|0;u=i;return n|0}case 15:{n=fe(a,c,d,h)|0;u=i;return n|0}case 16:{n=ee(a,c,d,h)|0;u=i;return n|0}case 17:{n=de(a,c,d,h)|0;u=i;return n|0}case 18:{n=ce(a,c,d,h)|0;u=i;return n|0}default:{n=0;u=i;return n|0}}while(0);return 0}function Uc(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0.0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0.0,F=0.0,G=0.0;e=u;u=u+16|0;g=e;h=e+4|0;if((c|0)>0){i=0;j=0;k=0;l=0;while(1){m=b+(j<<3)|0;n=f[m>>2]|0;o=f[m+4>>2]|0;m=Vn(n|0,o|0,k|0,l|0)|0;p=I;q=(n|0)==0&(o|0)==0?i:j;j=j+1|0;if((j|0)==(c|0)){r=q;s=p;t=m;break}else{i=q;k=m;l=p}}}else{r=0;s=0;t=0}l=r+1|0;f[a+12>>2]=l;k=a+4|0;i=f[k>>2]|0;c=f[a>>2]|0;j=i-c>>3;p=c;c=i;if(l>>>0<=j>>>0){if(l>>>0<j>>>0?(i=p+(l<<3)|0,(i|0)!=(c|0)):0)f[k>>2]=c+(~((c+-8-i|0)>>>3)<<3)}else wh(a,l-j|0);v=+(t>>>0)+4294967296.0*+(s>>>0);s=(r|0)<0;if(!s){t=f[a>>2]|0;j=0;i=0;do{c=b+(i<<3)|0;k=f[c>>2]|0;p=f[c+4>>2]|0;c=~~((+(k>>>0)+4294967296.0*+(p>>>0))/v*1048576.0+.5)>>>0;m=((k|0)!=0|(p|0)!=0)&(c|0)==0?1:c;f[t+(i<<3)>>2]=m;j=m+j|0;i=i+1|0}while((i|0)!=(l|0));if((j|0)==1048576){if(s){w=0;u=e;return w|0}}else{x=j;y=12}}else{x=0;y=12}if((y|0)==12){f[h>>2]=0;j=h+4|0;f[j>>2]=0;f[h+8>>2]=0;do if(l)if(l>>>0>1073741823)aq(h);else{i=l<<2;t=ln(i)|0;f[h>>2]=t;m=t+(l<<2)|0;f[h+8>>2]=m;sj(t|0,0,i|0)|0;f[j>>2]=m;z=t;A=m;break}else{z=0;A=0}while(0);if(!s?(f[z>>2]=0,r|0):0){m=1;do{f[z+(m<<2)>>2]=m;m=m+1|0}while((m|0)!=(l|0))}f[g>>2]=a;xb(z,A,g);a:do if((x|0)<1048576){g=(f[a>>2]|0)+(f[(f[j>>2]|0)+-4>>2]<<3)|0;f[g>>2]=1048576-x+(f[g>>2]|0);B=0}else{g=f[h>>2]|0;if((r|0)<=0){A=(x|0)>1048576;while(1)if(!A){B=0;break a}}A=f[a>>2]|0;z=x+-1048576|0;m=x;while(1){v=1048576.0/+(m|0);t=r;i=z;c=m;while(1){p=A+(f[g+(t<<2)>>2]<<3)|0;k=f[p>>2]|0;if(k>>>0<2){y=28;break}q=k-~~+J(+(v*+(k>>>0)))|0;o=(q|0)==0?1:q;q=(o|0)<(k|0)?o:k+-1|0;o=(q|0)>(i|0)?i:q;f[p>>2]=k-o;k=c-o|0;p=i-o|0;if((k|0)==1048576){C=p;D=1048576;break}if((t|0)>1){t=t+-1|0;i=p;c=k}else{C=p;D=k;break}}if((y|0)==28){y=0;if((t|0)==(r|0)){B=1;break a}else{C=i;D=c}}if((C|0)>0){z=C;m=D}else{B=0;break}}}while(0);D=f[h>>2]|0;if(D|0){h=f[j>>2]|0;if((h|0)!=(D|0))f[j>>2]=h+(~((h+-4-D|0)>>>2)<<2);Oq(D)}if((B|0)!=0|s){w=0;u=e;return w|0}}B=f[a>>2]|0;D=0;h=0;do{f[B+(D<<3)+4>>2]=h;h=(f[B+(D<<3)>>2]|0)+h|0;D=D+1|0}while((D|0)!=(l|0));if((h|0)!=1048576){w=0;u=e;return w|0}if(s)E=0.0;else{s=f[a>>2]|0;h=0;v=0.0;while(1){D=f[s+(h<<3)>>2]|0;if(!D)F=v;else{B=b+(h<<3)|0;G=+((f[B>>2]|0)>>>0)+4294967296.0*+((f[B+4>>2]|0)>>>0);F=v+ +Zg(+(D>>>0)*9.5367431640625e-07)*G}h=h+1|0;if((h|0)==(l|0)){E=F;break}else v=F}}F=+W(+-E);l=+K(F)>=1.0?(F>0.0?~~+Y(+J(F/4294967296.0),4294967295.0)>>>0:~~+W((F-+(~~F>>>0))/4294967296.0)>>>0):0;h=a+16|0;f[h>>2]=~~F>>>0;f[h+4>>2]=l;w=Le(a,d)|0;u=e;return w|0}function Vc(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0.0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0.0,F=0.0,G=0.0;e=u;u=u+16|0;g=e;h=e+4|0;if((c|0)>0){i=0;j=0;k=0;l=0;while(1){m=b+(j<<3)|0;n=f[m>>2]|0;o=f[m+4>>2]|0;m=Vn(n|0,o|0,k|0,l|0)|0;p=I;q=(n|0)==0&(o|0)==0?i:j;j=j+1|0;if((j|0)==(c|0)){r=q;s=p;t=m;break}else{i=q;k=m;l=p}}}else{r=0;s=0;t=0}l=r+1|0;f[a+12>>2]=l;k=a+4|0;i=f[k>>2]|0;c=f[a>>2]|0;j=i-c>>3;p=c;c=i;if(l>>>0<=j>>>0){if(l>>>0<j>>>0?(i=p+(l<<3)|0,(i|0)!=(c|0)):0)f[k>>2]=c+(~((c+-8-i|0)>>>3)<<3)}else wh(a,l-j|0);v=+(t>>>0)+4294967296.0*+(s>>>0);s=(r|0)<0;if(!s){t=f[a>>2]|0;j=0;i=0;do{c=b+(i<<3)|0;k=f[c>>2]|0;p=f[c+4>>2]|0;c=~~((+(k>>>0)+4294967296.0*+(p>>>0))/v*1048576.0+.5)>>>0;m=((k|0)!=0|(p|0)!=0)&(c|0)==0?1:c;f[t+(i<<3)>>2]=m;j=m+j|0;i=i+1|0}while((i|0)!=(l|0));if((j|0)==1048576){if(s){w=0;u=e;return w|0}}else{x=j;y=12}}else{x=0;y=12}if((y|0)==12){f[h>>2]=0;j=h+4|0;f[j>>2]=0;f[h+8>>2]=0;do if(l)if(l>>>0>1073741823)aq(h);else{i=l<<2;t=ln(i)|0;f[h>>2]=t;m=t+(l<<2)|0;f[h+8>>2]=m;sj(t|0,0,i|0)|0;f[j>>2]=m;z=t;A=m;break}else{z=0;A=0}while(0);if(!s?(f[z>>2]=0,r|0):0){m=1;do{f[z+(m<<2)>>2]=m;m=m+1|0}while((m|0)!=(l|0))}f[g>>2]=a;yb(z,A,g);a:do if((x|0)<1048576){g=(f[a>>2]|0)+(f[(f[j>>2]|0)+-4>>2]<<3)|0;f[g>>2]=1048576-x+(f[g>>2]|0);B=0}else{g=f[h>>2]|0;if((r|0)<=0){A=(x|0)>1048576;while(1)if(!A){B=0;break a}}A=f[a>>2]|0;z=x+-1048576|0;m=x;while(1){v=1048576.0/+(m|0);t=r;i=z;c=m;while(1){p=A+(f[g+(t<<2)>>2]<<3)|0;k=f[p>>2]|0;if(k>>>0<2){y=28;break}q=k-~~+J(+(v*+(k>>>0)))|0;o=(q|0)==0?1:q;q=(o|0)<(k|0)?o:k+-1|0;o=(q|0)>(i|0)?i:q;f[p>>2]=k-o;k=c-o|0;p=i-o|0;if((k|0)==1048576){C=p;D=1048576;break}if((t|0)>1){t=t+-1|0;i=p;c=k}else{C=p;D=k;break}}if((y|0)==28){y=0;if((t|0)==(r|0)){B=1;break a}else{C=i;D=c}}if((C|0)>0){z=C;m=D}else{B=0;break}}}while(0);D=f[h>>2]|0;if(D|0){h=f[j>>2]|0;if((h|0)!=(D|0))f[j>>2]=h+(~((h+-4-D|0)>>>2)<<2);Oq(D)}if((B|0)!=0|s){w=0;u=e;return w|0}}B=f[a>>2]|0;D=0;h=0;do{f[B+(D<<3)+4>>2]=h;h=(f[B+(D<<3)>>2]|0)+h|0;D=D+1|0}while((D|0)!=(l|0));if((h|0)!=1048576){w=0;u=e;return w|0}if(s)E=0.0;else{s=f[a>>2]|0;h=0;v=0.0;while(1){D=f[s+(h<<3)>>2]|0;if(!D)F=v;else{B=b+(h<<3)|0;G=+((f[B>>2]|0)>>>0)+4294967296.0*+((f[B+4>>2]|0)>>>0);F=v+ +Zg(+(D>>>0)*9.5367431640625e-07)*G}h=h+1|0;if((h|0)==(l|0)){E=F;break}else v=F}}F=+W(+-E);l=+K(F)>=1.0?(F>0.0?~~+Y(+J(F/4294967296.0),4294967295.0)>>>0:~~+W((F-+(~~F>>>0))/4294967296.0)>>>0):0;h=a+16|0;f[h>>2]=~~F>>>0;f[h+4>>2]=l;w=Le(a,d)|0;u=e;return w|0}function Wc(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0.0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0.0,F=0.0,G=0.0;e=u;u=u+16|0;g=e;h=e+4|0;if((c|0)>0){i=0;j=0;k=0;l=0;while(1){m=b+(j<<3)|0;n=f[m>>2]|0;o=f[m+4>>2]|0;m=Vn(n|0,o|0,k|0,l|0)|0;p=I;q=(n|0)==0&(o|0)==0?i:j;j=j+1|0;if((j|0)==(c|0)){r=q;s=p;t=m;break}else{i=q;k=m;l=p}}}else{r=0;s=0;t=0}l=r+1|0;f[a+12>>2]=l;k=a+4|0;i=f[k>>2]|0;c=f[a>>2]|0;j=i-c>>3;p=c;c=i;if(l>>>0<=j>>>0){if(l>>>0<j>>>0?(i=p+(l<<3)|0,(i|0)!=(c|0)):0)f[k>>2]=c+(~((c+-8-i|0)>>>3)<<3)}else wh(a,l-j|0);v=+(t>>>0)+4294967296.0*+(s>>>0);s=(r|0)<0;if(!s){t=f[a>>2]|0;j=0;i=0;do{c=b+(i<<3)|0;k=f[c>>2]|0;p=f[c+4>>2]|0;c=~~((+(k>>>0)+4294967296.0*+(p>>>0))/v*1048576.0+.5)>>>0;m=((k|0)!=0|(p|0)!=0)&(c|0)==0?1:c;f[t+(i<<3)>>2]=m;j=m+j|0;i=i+1|0}while((i|0)!=(l|0));if((j|0)==1048576){if(s){w=0;u=e;return w|0}}else{x=j;y=12}}else{x=0;y=12}if((y|0)==12){f[h>>2]=0;j=h+4|0;f[j>>2]=0;f[h+8>>2]=0;do if(l)if(l>>>0>1073741823)aq(h);else{i=l<<2;t=ln(i)|0;f[h>>2]=t;m=t+(l<<2)|0;f[h+8>>2]=m;sj(t|0,0,i|0)|0;f[j>>2]=m;z=t;A=m;break}else{z=0;A=0}while(0);if(!s?(f[z>>2]=0,r|0):0){m=1;do{f[z+(m<<2)>>2]=m;m=m+1|0}while((m|0)!=(l|0))}f[g>>2]=a;zb(z,A,g);a:do if((x|0)<1048576){g=(f[a>>2]|0)+(f[(f[j>>2]|0)+-4>>2]<<3)|0;f[g>>2]=1048576-x+(f[g>>2]|0);B=0}else{g=f[h>>2]|0;if((r|0)<=0){A=(x|0)>1048576;while(1)if(!A){B=0;break a}}A=f[a>>2]|0;z=x+-1048576|0;m=x;while(1){v=1048576.0/+(m|0);t=r;i=z;c=m;while(1){p=A+(f[g+(t<<2)>>2]<<3)|0;k=f[p>>2]|0;if(k>>>0<2){y=28;break}q=k-~~+J(+(v*+(k>>>0)))|0;o=(q|0)==0?1:q;q=(o|0)<(k|0)?o:k+-1|0;o=(q|0)>(i|0)?i:q;f[p>>2]=k-o;k=c-o|0;p=i-o|0;if((k|0)==1048576){C=p;D=1048576;break}if((t|0)>1){t=t+-1|0;i=p;c=k}else{C=p;D=k;break}}if((y|0)==28){y=0;if((t|0)==(r|0)){B=1;break a}else{C=i;D=c}}if((C|0)>0){z=C;m=D}else{B=0;break}}}while(0);D=f[h>>2]|0;if(D|0){h=f[j>>2]|0;if((h|0)!=(D|0))f[j>>2]=h+(~((h+-4-D|0)>>>2)<<2);Oq(D)}if((B|0)!=0|s){w=0;u=e;return w|0}}B=f[a>>2]|0;D=0;h=0;do{f[B+(D<<3)+4>>2]=h;h=(f[B+(D<<3)>>2]|0)+h|0;D=D+1|0}while((D|0)!=(l|0));if((h|0)!=1048576){w=0;u=e;return w|0}if(s)E=0.0;else{s=f[a>>2]|0;h=0;v=0.0;while(1){D=f[s+(h<<3)>>2]|0;if(!D)F=v;else{B=b+(h<<3)|0;G=+((f[B>>2]|0)>>>0)+4294967296.0*+((f[B+4>>2]|0)>>>0);F=v+ +Zg(+(D>>>0)*9.5367431640625e-07)*G}h=h+1|0;if((h|0)==(l|0)){E=F;break}else v=F}}F=+W(+-E);l=+K(F)>=1.0?(F>0.0?~~+Y(+J(F/4294967296.0),4294967295.0)>>>0:~~+W((F-+(~~F>>>0))/4294967296.0)>>>0):0;h=a+16|0;f[h>>2]=~~F>>>0;f[h+4>>2]=l;w=Le(a,d)|0;u=e;return w|0}function Xc(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0.0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0.0,F=0.0,G=0.0;e=u;u=u+16|0;g=e;h=e+4|0;if((c|0)>0){i=0;j=0;k=0;l=0;while(1){m=b+(j<<3)|0;n=f[m>>2]|0;o=f[m+4>>2]|0;m=Vn(n|0,o|0,k|0,l|0)|0;p=I;q=(n|0)==0&(o|0)==0?i:j;j=j+1|0;if((j|0)==(c|0)){r=q;s=p;t=m;break}else{i=q;k=m;l=p}}}else{r=0;s=0;t=0}l=r+1|0;f[a+12>>2]=l;k=a+4|0;i=f[k>>2]|0;c=f[a>>2]|0;j=i-c>>3;p=c;c=i;if(l>>>0<=j>>>0){if(l>>>0<j>>>0?(i=p+(l<<3)|0,(i|0)!=(c|0)):0)f[k>>2]=c+(~((c+-8-i|0)>>>3)<<3)}else wh(a,l-j|0);v=+(t>>>0)+4294967296.0*+(s>>>0);s=(r|0)<0;if(!s){t=f[a>>2]|0;j=0;i=0;do{c=b+(i<<3)|0;k=f[c>>2]|0;p=f[c+4>>2]|0;c=~~((+(k>>>0)+4294967296.0*+(p>>>0))/v*1048576.0+.5)>>>0;m=((k|0)!=0|(p|0)!=0)&(c|0)==0?1:c;f[t+(i<<3)>>2]=m;j=m+j|0;i=i+1|0}while((i|0)!=(l|0));if((j|0)==1048576){if(s){w=0;u=e;return w|0}}else{x=j;y=12}}else{x=0;y=12}if((y|0)==12){f[h>>2]=0;j=h+4|0;f[j>>2]=0;f[h+8>>2]=0;do if(l)if(l>>>0>1073741823)aq(h);else{i=l<<2;t=ln(i)|0;f[h>>2]=t;m=t+(l<<2)|0;f[h+8>>2]=m;sj(t|0,0,i|0)|0;f[j>>2]=m;z=t;A=m;break}else{z=0;A=0}while(0);if(!s?(f[z>>2]=0,r|0):0){m=1;do{f[z+(m<<2)>>2]=m;m=m+1|0}while((m|0)!=(l|0))}f[g>>2]=a;Ab(z,A,g);a:do if((x|0)<1048576){g=(f[a>>2]|0)+(f[(f[j>>2]|0)+-4>>2]<<3)|0;f[g>>2]=1048576-x+(f[g>>2]|0);B=0}else{g=f[h>>2]|0;if((r|0)<=0){A=(x|0)>1048576;while(1)if(!A){B=0;break a}}A=f[a>>2]|0;z=x+-1048576|0;m=x;while(1){v=1048576.0/+(m|0);t=r;i=z;c=m;while(1){p=A+(f[g+(t<<2)>>2]<<3)|0;k=f[p>>2]|0;if(k>>>0<2){y=28;break}q=k-~~+J(+(v*+(k>>>0)))|0;o=(q|0)==0?1:q;q=(o|0)<(k|0)?o:k+-1|0;o=(q|0)>(i|0)?i:q;f[p>>2]=k-o;k=c-o|0;p=i-o|0;if((k|0)==1048576){C=p;D=1048576;break}if((t|0)>1){t=t+-1|0;i=p;c=k}else{C=p;D=k;break}}if((y|0)==28){y=0;if((t|0)==(r|0)){B=1;break a}else{C=i;D=c}}if((C|0)>0){z=C;m=D}else{B=0;break}}}while(0);D=f[h>>2]|0;if(D|0){h=f[j>>2]|0;if((h|0)!=(D|0))f[j>>2]=h+(~((h+-4-D|0)>>>2)<<2);Oq(D)}if((B|0)!=0|s){w=0;u=e;return w|0}}B=f[a>>2]|0;D=0;h=0;do{f[B+(D<<3)+4>>2]=h;h=(f[B+(D<<3)>>2]|0)+h|0;D=D+1|0}while((D|0)!=(l|0));if((h|0)!=1048576){w=0;u=e;return w|0}if(s)E=0.0;else{s=f[a>>2]|0;h=0;v=0.0;while(1){D=f[s+(h<<3)>>2]|0;if(!D)F=v;else{B=b+(h<<3)|0;G=+((f[B>>2]|0)>>>0)+4294967296.0*+((f[B+4>>2]|0)>>>0);F=v+ +Zg(+(D>>>0)*9.5367431640625e-07)*G}h=h+1|0;if((h|0)==(l|0)){E=F;break}else v=F}}F=+W(+-E);l=+K(F)>=1.0?(F>0.0?~~+Y(+J(F/4294967296.0),4294967295.0)>>>0:~~+W((F-+(~~F>>>0))/4294967296.0)>>>0):0;h=a+16|0;f[h>>2]=~~F>>>0;f[h+4>>2]=l;w=Le(a,d)|0;u=e;return w|0}function Yc(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0.0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0.0,F=0.0,G=0.0;e=u;u=u+16|0;g=e;h=e+4|0;if((c|0)>0){i=0;j=0;k=0;l=0;while(1){m=b+(j<<3)|0;n=f[m>>2]|0;o=f[m+4>>2]|0;m=Vn(n|0,o|0,k|0,l|0)|0;p=I;q=(n|0)==0&(o|0)==0?i:j;j=j+1|0;if((j|0)==(c|0)){r=q;s=p;t=m;break}else{i=q;k=m;l=p}}}else{r=0;s=0;t=0}l=r+1|0;f[a+12>>2]=l;k=a+4|0;i=f[k>>2]|0;c=f[a>>2]|0;j=i-c>>3;p=c;c=i;if(l>>>0<=j>>>0){if(l>>>0<j>>>0?(i=p+(l<<3)|0,(i|0)!=(c|0)):0)f[k>>2]=c+(~((c+-8-i|0)>>>3)<<3)}else wh(a,l-j|0);v=+(t>>>0)+4294967296.0*+(s>>>0);s=(r|0)<0;if(!s){t=f[a>>2]|0;j=0;i=0;do{c=b+(i<<3)|0;k=f[c>>2]|0;p=f[c+4>>2]|0;c=~~((+(k>>>0)+4294967296.0*+(p>>>0))/v*1048576.0+.5)>>>0;m=((k|0)!=0|(p|0)!=0)&(c|0)==0?1:c;f[t+(i<<3)>>2]=m;j=m+j|0;i=i+1|0}while((i|0)!=(l|0));if((j|0)==1048576){if(s){w=0;u=e;return w|0}}else{x=j;y=12}}else{x=0;y=12}if((y|0)==12){f[h>>2]=0;j=h+4|0;f[j>>2]=0;f[h+8>>2]=0;do if(l)if(l>>>0>1073741823)aq(h);else{i=l<<2;t=ln(i)|0;f[h>>2]=t;m=t+(l<<2)|0;f[h+8>>2]=m;sj(t|0,0,i|0)|0;f[j>>2]=m;z=t;A=m;break}else{z=0;A=0}while(0);if(!s?(f[z>>2]=0,r|0):0){m=1;do{f[z+(m<<2)>>2]=m;m=m+1|0}while((m|0)!=(l|0))}f[g>>2]=a;Fb(z,A,g);a:do if((x|0)<1048576){g=(f[a>>2]|0)+(f[(f[j>>2]|0)+-4>>2]<<3)|0;f[g>>2]=1048576-x+(f[g>>2]|0);B=0}else{g=f[h>>2]|0;if((r|0)<=0){A=(x|0)>1048576;while(1)if(!A){B=0;break a}}A=f[a>>2]|0;z=x+-1048576|0;m=x;while(1){v=1048576.0/+(m|0);t=r;i=z;c=m;while(1){p=A+(f[g+(t<<2)>>2]<<3)|0;k=f[p>>2]|0;if(k>>>0<2){y=28;break}q=k-~~+J(+(v*+(k>>>0)))|0;o=(q|0)==0?1:q;q=(o|0)<(k|0)?o:k+-1|0;o=(q|0)>(i|0)?i:q;f[p>>2]=k-o;k=c-o|0;p=i-o|0;if((k|0)==1048576){C=p;D=1048576;break}if((t|0)>1){t=t+-1|0;i=p;c=k}else{C=p;D=k;break}}if((y|0)==28){y=0;if((t|0)==(r|0)){B=1;break a}else{C=i;D=c}}if((C|0)>0){z=C;m=D}else{B=0;break}}}while(0);D=f[h>>2]|0;if(D|0){h=f[j>>2]|0;if((h|0)!=(D|0))f[j>>2]=h+(~((h+-4-D|0)>>>2)<<2);Oq(D)}if((B|0)!=0|s){w=0;u=e;return w|0}}B=f[a>>2]|0;D=0;h=0;do{f[B+(D<<3)+4>>2]=h;h=(f[B+(D<<3)>>2]|0)+h|0;D=D+1|0}while((D|0)!=(l|0));if((h|0)!=1048576){w=0;u=e;return w|0}if(s)E=0.0;else{s=f[a>>2]|0;h=0;v=0.0;while(1){D=f[s+(h<<3)>>2]|0;if(!D)F=v;else{B=b+(h<<3)|0;G=+((f[B>>2]|0)>>>0)+4294967296.0*+((f[B+4>>2]|0)>>>0);F=v+ +Zg(+(D>>>0)*9.5367431640625e-07)*G}h=h+1|0;if((h|0)==(l|0)){E=F;break}else v=F}}F=+W(+-E);l=+K(F)>=1.0?(F>0.0?~~+Y(+J(F/4294967296.0),4294967295.0)>>>0:~~+W((F-+(~~F>>>0))/4294967296.0)>>>0):0;h=a+16|0;f[h>>2]=~~F>>>0;f[h+4>>2]=l;w=Le(a,d)|0;u=e;return w|0}function Zc(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0.0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0.0,F=0.0,G=0.0;e=u;u=u+16|0;g=e;h=e+4|0;if((c|0)>0){i=0;j=0;k=0;l=0;while(1){m=b+(j<<3)|0;n=f[m>>2]|0;o=f[m+4>>2]|0;m=Vn(n|0,o|0,k|0,l|0)|0;p=I;q=(n|0)==0&(o|0)==0?i:j;j=j+1|0;if((j|0)==(c|0)){r=q;s=p;t=m;break}else{i=q;k=m;l=p}}}else{r=0;s=0;t=0}l=r+1|0;f[a+12>>2]=l;k=a+4|0;i=f[k>>2]|0;c=f[a>>2]|0;j=i-c>>3;p=c;c=i;if(l>>>0<=j>>>0){if(l>>>0<j>>>0?(i=p+(l<<3)|0,(i|0)!=(c|0)):0)f[k>>2]=c+(~((c+-8-i|0)>>>3)<<3)}else wh(a,l-j|0);v=+(t>>>0)+4294967296.0*+(s>>>0);s=(r|0)<0;if(!s){t=f[a>>2]|0;j=0;i=0;do{c=b+(i<<3)|0;k=f[c>>2]|0;p=f[c+4>>2]|0;c=~~((+(k>>>0)+4294967296.0*+(p>>>0))/v*524288.0+.5)>>>0;m=((k|0)!=0|(p|0)!=0)&(c|0)==0?1:c;f[t+(i<<3)>>2]=m;j=m+j|0;i=i+1|0}while((i|0)!=(l|0));if((j|0)==524288){if(s){w=0;u=e;return w|0}}else{x=j;y=12}}else{x=0;y=12}if((y|0)==12){f[h>>2]=0;j=h+4|0;f[j>>2]=0;f[h+8>>2]=0;do if(l)if(l>>>0>1073741823)aq(h);else{i=l<<2;t=ln(i)|0;f[h>>2]=t;m=t+(l<<2)|0;f[h+8>>2]=m;sj(t|0,0,i|0)|0;f[j>>2]=m;z=t;A=m;break}else{z=0;A=0}while(0);if(!s?(f[z>>2]=0,r|0):0){m=1;do{f[z+(m<<2)>>2]=m;m=m+1|0}while((m|0)!=(l|0))}f[g>>2]=a;Bb(z,A,g);a:do if((x|0)<524288){g=(f[a>>2]|0)+(f[(f[j>>2]|0)+-4>>2]<<3)|0;f[g>>2]=524288-x+(f[g>>2]|0);B=0}else{g=f[h>>2]|0;if((r|0)<=0){A=(x|0)>524288;while(1)if(!A){B=0;break a}}A=f[a>>2]|0;z=x+-524288|0;m=x;while(1){v=524288.0/+(m|0);t=r;i=z;c=m;while(1){p=A+(f[g+(t<<2)>>2]<<3)|0;k=f[p>>2]|0;if(k>>>0<2){y=28;break}q=k-~~+J(+(v*+(k>>>0)))|0;o=(q|0)==0?1:q;q=(o|0)<(k|0)?o:k+-1|0;o=(q|0)>(i|0)?i:q;f[p>>2]=k-o;k=c-o|0;p=i-o|0;if((k|0)==524288){C=p;D=524288;break}if((t|0)>1){t=t+-1|0;i=p;c=k}else{C=p;D=k;break}}if((y|0)==28){y=0;if((t|0)==(r|0)){B=1;break a}else{C=i;D=c}}if((C|0)>0){z=C;m=D}else{B=0;break}}}while(0);D=f[h>>2]|0;if(D|0){h=f[j>>2]|0;if((h|0)!=(D|0))f[j>>2]=h+(~((h+-4-D|0)>>>2)<<2);Oq(D)}if((B|0)!=0|s){w=0;u=e;return w|0}}B=f[a>>2]|0;D=0;h=0;do{f[B+(D<<3)+4>>2]=h;h=(f[B+(D<<3)>>2]|0)+h|0;D=D+1|0}while((D|0)!=(l|0));if((h|0)!=524288){w=0;u=e;return w|0}if(s)E=0.0;else{s=f[a>>2]|0;h=0;v=0.0;while(1){D=f[s+(h<<3)>>2]|0;if(!D)F=v;else{B=b+(h<<3)|0;G=+((f[B>>2]|0)>>>0)+4294967296.0*+((f[B+4>>2]|0)>>>0);F=v+ +Zg(+(D>>>0)*1.9073486328125e-06)*G}h=h+1|0;if((h|0)==(l|0)){E=F;break}else v=F}}F=+W(+-E);l=+K(F)>=1.0?(F>0.0?~~+Y(+J(F/4294967296.0),4294967295.0)>>>0:~~+W((F-+(~~F>>>0))/4294967296.0)>>>0):0;h=a+16|0;f[h>>2]=~~F>>>0;f[h+4>>2]=l;w=Le(a,d)|0;u=e;return w|0}function _c(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0.0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0.0,F=0.0,G=0.0;e=u;u=u+16|0;g=e;h=e+4|0;if((c|0)>0){i=0;j=0;k=0;l=0;while(1){m=b+(j<<3)|0;n=f[m>>2]|0;o=f[m+4>>2]|0;m=Vn(n|0,o|0,k|0,l|0)|0;p=I;q=(n|0)==0&(o|0)==0?i:j;j=j+1|0;if((j|0)==(c|0)){r=q;s=p;t=m;break}else{i=q;k=m;l=p}}}else{r=0;s=0;t=0}l=r+1|0;f[a+12>>2]=l;k=a+4|0;i=f[k>>2]|0;c=f[a>>2]|0;j=i-c>>3;p=c;c=i;if(l>>>0<=j>>>0){if(l>>>0<j>>>0?(i=p+(l<<3)|0,(i|0)!=(c|0)):0)f[k>>2]=c+(~((c+-8-i|0)>>>3)<<3)}else wh(a,l-j|0);v=+(t>>>0)+4294967296.0*+(s>>>0);s=(r|0)<0;if(!s){t=f[a>>2]|0;j=0;i=0;do{c=b+(i<<3)|0;k=f[c>>2]|0;p=f[c+4>>2]|0;c=~~((+(k>>>0)+4294967296.0*+(p>>>0))/v*262144.0+.5)>>>0;m=((k|0)!=0|(p|0)!=0)&(c|0)==0?1:c;f[t+(i<<3)>>2]=m;j=m+j|0;i=i+1|0}while((i|0)!=(l|0));if((j|0)==262144){if(s){w=0;u=e;return w|0}}else{x=j;y=12}}else{x=0;y=12}if((y|0)==12){f[h>>2]=0;j=h+4|0;f[j>>2]=0;f[h+8>>2]=0;do if(l)if(l>>>0>1073741823)aq(h);else{i=l<<2;t=ln(i)|0;f[h>>2]=t;m=t+(l<<2)|0;f[h+8>>2]=m;sj(t|0,0,i|0)|0;f[j>>2]=m;z=t;A=m;break}else{z=0;A=0}while(0);if(!s?(f[z>>2]=0,r|0):0){m=1;do{f[z+(m<<2)>>2]=m;m=m+1|0}while((m|0)!=(l|0))}f[g>>2]=a;Cb(z,A,g);a:do if((x|0)<262144){g=(f[a>>2]|0)+(f[(f[j>>2]|0)+-4>>2]<<3)|0;f[g>>2]=262144-x+(f[g>>2]|0);B=0}else{g=f[h>>2]|0;if((r|0)<=0){A=(x|0)>262144;while(1)if(!A){B=0;break a}}A=f[a>>2]|0;z=x+-262144|0;m=x;while(1){v=262144.0/+(m|0);t=r;i=z;c=m;while(1){p=A+(f[g+(t<<2)>>2]<<3)|0;k=f[p>>2]|0;if(k>>>0<2){y=28;break}q=k-~~+J(+(v*+(k>>>0)))|0;o=(q|0)==0?1:q;q=(o|0)<(k|0)?o:k+-1|0;o=(q|0)>(i|0)?i:q;f[p>>2]=k-o;k=c-o|0;p=i-o|0;if((k|0)==262144){C=p;D=262144;break}if((t|0)>1){t=t+-1|0;i=p;c=k}else{C=p;D=k;break}}if((y|0)==28){y=0;if((t|0)==(r|0)){B=1;break a}else{C=i;D=c}}if((C|0)>0){z=C;m=D}else{B=0;break}}}while(0);D=f[h>>2]|0;if(D|0){h=f[j>>2]|0;if((h|0)!=(D|0))f[j>>2]=h+(~((h+-4-D|0)>>>2)<<2);Oq(D)}if((B|0)!=0|s){w=0;u=e;return w|0}}B=f[a>>2]|0;D=0;h=0;do{f[B+(D<<3)+4>>2]=h;h=(f[B+(D<<3)>>2]|0)+h|0;D=D+1|0}while((D|0)!=(l|0));if((h|0)!=262144){w=0;u=e;return w|0}if(s)E=0.0;else{s=f[a>>2]|0;h=0;v=0.0;while(1){D=f[s+(h<<3)>>2]|0;if(!D)F=v;else{B=b+(h<<3)|0;G=+((f[B>>2]|0)>>>0)+4294967296.0*+((f[B+4>>2]|0)>>>0);F=v+ +Zg(+(D>>>0)*3.814697265625e-06)*G}h=h+1|0;if((h|0)==(l|0)){E=F;break}else v=F}}F=+W(+-E);l=+K(F)>=1.0?(F>0.0?~~+Y(+J(F/4294967296.0),4294967295.0)>>>0:~~+W((F-+(~~F>>>0))/4294967296.0)>>>0):0;h=a+16|0;f[h>>2]=~~F>>>0;f[h+4>>2]=l;w=Le(a,d)|0;u=e;return w|0}function $c(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0.0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0.0,F=0.0,G=0.0;e=u;u=u+16|0;g=e;h=e+4|0;if((c|0)>0){i=0;j=0;k=0;l=0;while(1){m=b+(j<<3)|0;n=f[m>>2]|0;o=f[m+4>>2]|0;m=Vn(n|0,o|0,k|0,l|0)|0;p=I;q=(n|0)==0&(o|0)==0?i:j;j=j+1|0;if((j|0)==(c|0)){r=q;s=p;t=m;break}else{i=q;k=m;l=p}}}else{r=0;s=0;t=0}l=r+1|0;f[a+12>>2]=l;k=a+4|0;i=f[k>>2]|0;c=f[a>>2]|0;j=i-c>>3;p=c;c=i;if(l>>>0<=j>>>0){if(l>>>0<j>>>0?(i=p+(l<<3)|0,(i|0)!=(c|0)):0)f[k>>2]=c+(~((c+-8-i|0)>>>3)<<3)}else wh(a,l-j|0);v=+(t>>>0)+4294967296.0*+(s>>>0);s=(r|0)<0;if(!s){t=f[a>>2]|0;j=0;i=0;do{c=b+(i<<3)|0;k=f[c>>2]|0;p=f[c+4>>2]|0;c=~~((+(k>>>0)+4294967296.0*+(p>>>0))/v*65536.0+.5)>>>0;m=((k|0)!=0|(p|0)!=0)&(c|0)==0?1:c;f[t+(i<<3)>>2]=m;j=m+j|0;i=i+1|0}while((i|0)!=(l|0));if((j|0)==65536){if(s){w=0;u=e;return w|0}}else{x=j;y=12}}else{x=0;y=12}if((y|0)==12){f[h>>2]=0;j=h+4|0;f[j>>2]=0;f[h+8>>2]=0;do if(l)if(l>>>0>1073741823)aq(h);else{i=l<<2;t=ln(i)|0;f[h>>2]=t;m=t+(l<<2)|0;f[h+8>>2]=m;sj(t|0,0,i|0)|0;f[j>>2]=m;z=t;A=m;break}else{z=0;A=0}while(0);if(!s?(f[z>>2]=0,r|0):0){m=1;do{f[z+(m<<2)>>2]=m;m=m+1|0}while((m|0)!=(l|0))}f[g>>2]=a;Db(z,A,g);a:do if((x|0)<65536){g=(f[a>>2]|0)+(f[(f[j>>2]|0)+-4>>2]<<3)|0;f[g>>2]=65536-x+(f[g>>2]|0);B=0}else{g=f[h>>2]|0;if((r|0)<=0){A=(x|0)>65536;while(1)if(!A){B=0;break a}}A=f[a>>2]|0;z=x+-65536|0;m=x;while(1){v=65536.0/+(m|0);t=r;i=z;c=m;while(1){p=A+(f[g+(t<<2)>>2]<<3)|0;k=f[p>>2]|0;if(k>>>0<2){y=28;break}q=k-~~+J(+(v*+(k>>>0)))|0;o=(q|0)==0?1:q;q=(o|0)<(k|0)?o:k+-1|0;o=(q|0)>(i|0)?i:q;f[p>>2]=k-o;k=c-o|0;p=i-o|0;if((k|0)==65536){C=p;D=65536;break}if((t|0)>1){t=t+-1|0;i=p;c=k}else{C=p;D=k;break}}if((y|0)==28){y=0;if((t|0)==(r|0)){B=1;break a}else{C=i;D=c}}if((C|0)>0){z=C;m=D}else{B=0;break}}}while(0);D=f[h>>2]|0;if(D|0){h=f[j>>2]|0;if((h|0)!=(D|0))f[j>>2]=h+(~((h+-4-D|0)>>>2)<<2);Oq(D)}if((B|0)!=0|s){w=0;u=e;return w|0}}B=f[a>>2]|0;D=0;h=0;do{f[B+(D<<3)+4>>2]=h;h=(f[B+(D<<3)>>2]|0)+h|0;D=D+1|0}while((D|0)!=(l|0));if((h|0)!=65536){w=0;u=e;return w|0}if(s)E=0.0;else{s=f[a>>2]|0;h=0;v=0.0;while(1){D=f[s+(h<<3)>>2]|0;if(!D)F=v;else{B=b+(h<<3)|0;G=+((f[B>>2]|0)>>>0)+4294967296.0*+((f[B+4>>2]|0)>>>0);F=v+ +Zg(+(D>>>0)*.0000152587890625)*G}h=h+1|0;if((h|0)==(l|0)){E=F;break}else v=F}}F=+W(+-E);l=+K(F)>=1.0?(F>0.0?~~+Y(+J(F/4294967296.0),4294967295.0)>>>0:~~+W((F-+(~~F>>>0))/4294967296.0)>>>0):0;h=a+16|0;f[h>>2]=~~F>>>0;f[h+4>>2]=l;w=Le(a,d)|0;u=e;return w|0}function ad(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0.0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0.0,F=0.0,G=0.0;e=u;u=u+16|0;g=e;h=e+4|0;if((c|0)>0){i=0;j=0;k=0;l=0;while(1){m=b+(j<<3)|0;n=f[m>>2]|0;o=f[m+4>>2]|0;m=Vn(n|0,o|0,k|0,l|0)|0;p=I;q=(n|0)==0&(o|0)==0?i:j;j=j+1|0;if((j|0)==(c|0)){r=q;s=p;t=m;break}else{i=q;k=m;l=p}}}else{r=0;s=0;t=0}l=r+1|0;f[a+12>>2]=l;k=a+4|0;i=f[k>>2]|0;c=f[a>>2]|0;j=i-c>>3;p=c;c=i;if(l>>>0<=j>>>0){if(l>>>0<j>>>0?(i=p+(l<<3)|0,(i|0)!=(c|0)):0)f[k>>2]=c+(~((c+-8-i|0)>>>3)<<3)}else wh(a,l-j|0);v=+(t>>>0)+4294967296.0*+(s>>>0);s=(r|0)<0;if(!s){t=f[a>>2]|0;j=0;i=0;do{c=b+(i<<3)|0;k=f[c>>2]|0;p=f[c+4>>2]|0;c=~~((+(k>>>0)+4294967296.0*+(p>>>0))/v*32768.0+.5)>>>0;m=((k|0)!=0|(p|0)!=0)&(c|0)==0?1:c;f[t+(i<<3)>>2]=m;j=m+j|0;i=i+1|0}while((i|0)!=(l|0));if((j|0)==32768){if(s){w=0;u=e;return w|0}}else{x=j;y=12}}else{x=0;y=12}if((y|0)==12){f[h>>2]=0;j=h+4|0;f[j>>2]=0;f[h+8>>2]=0;do if(l)if(l>>>0>1073741823)aq(h);else{i=l<<2;t=ln(i)|0;f[h>>2]=t;m=t+(l<<2)|0;f[h+8>>2]=m;sj(t|0,0,i|0)|0;f[j>>2]=m;z=t;A=m;break}else{z=0;A=0}while(0);if(!s?(f[z>>2]=0,r|0):0){m=1;do{f[z+(m<<2)>>2]=m;m=m+1|0}while((m|0)!=(l|0))}f[g>>2]=a;Eb(z,A,g);a:do if((x|0)<32768){g=(f[a>>2]|0)+(f[(f[j>>2]|0)+-4>>2]<<3)|0;f[g>>2]=32768-x+(f[g>>2]|0);B=0}else{g=f[h>>2]|0;if((r|0)<=0){A=(x|0)>32768;while(1)if(!A){B=0;break a}}A=f[a>>2]|0;z=x+-32768|0;m=x;while(1){v=32768.0/+(m|0);t=r;i=z;c=m;while(1){p=A+(f[g+(t<<2)>>2]<<3)|0;k=f[p>>2]|0;if(k>>>0<2){y=28;break}q=k-~~+J(+(v*+(k>>>0)))|0;o=(q|0)==0?1:q;q=(o|0)<(k|0)?o:k+-1|0;o=(q|0)>(i|0)?i:q;f[p>>2]=k-o;k=c-o|0;p=i-o|0;if((k|0)==32768){C=p;D=32768;break}if((t|0)>1){t=t+-1|0;i=p;c=k}else{C=p;D=k;break}}if((y|0)==28){y=0;if((t|0)==(r|0)){B=1;break a}else{C=i;D=c}}if((C|0)>0){z=C;m=D}else{B=0;break}}}while(0);D=f[h>>2]|0;if(D|0){h=f[j>>2]|0;if((h|0)!=(D|0))f[j>>2]=h+(~((h+-4-D|0)>>>2)<<2);Oq(D)}if((B|0)!=0|s){w=0;u=e;return w|0}}B=f[a>>2]|0;D=0;h=0;do{f[B+(D<<3)+4>>2]=h;h=(f[B+(D<<3)>>2]|0)+h|0;D=D+1|0}while((D|0)!=(l|0));if((h|0)!=32768){w=0;u=e;return w|0}if(s)E=0.0;else{s=f[a>>2]|0;h=0;v=0.0;while(1){D=f[s+(h<<3)>>2]|0;if(!D)F=v;else{B=b+(h<<3)|0;G=+((f[B>>2]|0)>>>0)+4294967296.0*+((f[B+4>>2]|0)>>>0);F=v+ +Zg(+(D>>>0)*.000030517578125)*G}h=h+1|0;if((h|0)==(l|0)){E=F;break}else v=F}}F=+W(+-E);l=+K(F)>=1.0?(F>0.0?~~+Y(+J(F/4294967296.0),4294967295.0)>>>0:~~+W((F-+(~~F>>>0))/4294967296.0)>>>0):0;h=a+16|0;f[h>>2]=~~F>>>0;f[h+4>>2]=l;w=Le(a,d)|0;u=e;return w|0}function bd(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0.0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0.0,F=0.0,G=0.0;e=u;u=u+16|0;g=e;h=e+4|0;if((c|0)>0){i=0;j=0;k=0;l=0;while(1){m=b+(j<<3)|0;n=f[m>>2]|0;o=f[m+4>>2]|0;m=Vn(n|0,o|0,k|0,l|0)|0;p=I;q=(n|0)==0&(o|0)==0?i:j;j=j+1|0;if((j|0)==(c|0)){r=q;s=p;t=m;break}else{i=q;k=m;l=p}}}else{r=0;s=0;t=0}l=r+1|0;f[a+12>>2]=l;k=a+4|0;i=f[k>>2]|0;c=f[a>>2]|0;j=i-c>>3;p=c;c=i;if(l>>>0<=j>>>0){if(l>>>0<j>>>0?(i=p+(l<<3)|0,(i|0)!=(c|0)):0)f[k>>2]=c+(~((c+-8-i|0)>>>3)<<3)}else wh(a,l-j|0);v=+(t>>>0)+4294967296.0*+(s>>>0);s=(r|0)<0;if(!s){t=f[a>>2]|0;j=0;i=0;do{c=b+(i<<3)|0;k=f[c>>2]|0;p=f[c+4>>2]|0;c=~~((+(k>>>0)+4294967296.0*+(p>>>0))/v*8192.0+.5)>>>0;m=((k|0)!=0|(p|0)!=0)&(c|0)==0?1:c;f[t+(i<<3)>>2]=m;j=m+j|0;i=i+1|0}while((i|0)!=(l|0));if((j|0)==8192){if(s){w=0;u=e;return w|0}}else{x=j;y=12}}else{x=0;y=12}if((y|0)==12){f[h>>2]=0;j=h+4|0;f[j>>2]=0;f[h+8>>2]=0;do if(l)if(l>>>0>1073741823)aq(h);else{i=l<<2;t=ln(i)|0;f[h>>2]=t;m=t+(l<<2)|0;f[h+8>>2]=m;sj(t|0,0,i|0)|0;f[j>>2]=m;z=t;A=m;break}else{z=0;A=0}while(0);if(!s?(f[z>>2]=0,r|0):0){m=1;do{f[z+(m<<2)>>2]=m;m=m+1|0}while((m|0)!=(l|0))}f[g>>2]=a;Gb(z,A,g);a:do if((x|0)<8192){g=(f[a>>2]|0)+(f[(f[j>>2]|0)+-4>>2]<<3)|0;f[g>>2]=8192-x+(f[g>>2]|0);B=0}else{g=f[h>>2]|0;if((r|0)<=0){A=(x|0)>8192;while(1)if(!A){B=0;break a}}A=f[a>>2]|0;z=x+-8192|0;m=x;while(1){v=8192.0/+(m|0);t=r;i=z;c=m;while(1){p=A+(f[g+(t<<2)>>2]<<3)|0;k=f[p>>2]|0;if(k>>>0<2){y=28;break}q=k-~~+J(+(v*+(k>>>0)))|0;o=(q|0)==0?1:q;q=(o|0)<(k|0)?o:k+-1|0;o=(q|0)>(i|0)?i:q;f[p>>2]=k-o;k=c-o|0;p=i-o|0;if((k|0)==8192){C=p;D=8192;break}if((t|0)>1){t=t+-1|0;i=p;c=k}else{C=p;D=k;break}}if((y|0)==28){y=0;if((t|0)==(r|0)){B=1;break a}else{C=i;D=c}}if((C|0)>0){z=C;m=D}else{B=0;break}}}while(0);D=f[h>>2]|0;if(D|0){h=f[j>>2]|0;if((h|0)!=(D|0))f[j>>2]=h+(~((h+-4-D|0)>>>2)<<2);Oq(D)}if((B|0)!=0|s){w=0;u=e;return w|0}}B=f[a>>2]|0;D=0;h=0;do{f[B+(D<<3)+4>>2]=h;h=(f[B+(D<<3)>>2]|0)+h|0;D=D+1|0}while((D|0)!=(l|0));if((h|0)!=8192){w=0;u=e;return w|0}if(s)E=0.0;else{s=f[a>>2]|0;h=0;v=0.0;while(1){D=f[s+(h<<3)>>2]|0;if(!D)F=v;else{B=b+(h<<3)|0;G=+((f[B>>2]|0)>>>0)+4294967296.0*+((f[B+4>>2]|0)>>>0);F=v+ +Zg(+(D>>>0)*.0001220703125)*G}h=h+1|0;if((h|0)==(l|0)){E=F;break}else v=F}}F=+W(+-E);l=+K(F)>=1.0?(F>0.0?~~+Y(+J(F/4294967296.0),4294967295.0)>>>0:~~+W((F-+(~~F>>>0))/4294967296.0)>>>0):0;h=a+16|0;f[h>>2]=~~F>>>0;f[h+4>>2]=l;w=Le(a,d)|0;u=e;return w|0}function cd(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0.0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0.0,F=0.0,G=0.0;e=u;u=u+16|0;g=e;h=e+4|0;if((c|0)>0){i=0;j=0;k=0;l=0;while(1){m=b+(j<<3)|0;n=f[m>>2]|0;o=f[m+4>>2]|0;m=Vn(n|0,o|0,k|0,l|0)|0;p=I;q=(n|0)==0&(o|0)==0?i:j;j=j+1|0;if((j|0)==(c|0)){r=q;s=p;t=m;break}else{i=q;k=m;l=p}}}else{r=0;s=0;t=0}l=r+1|0;f[a+12>>2]=l;k=a+4|0;i=f[k>>2]|0;c=f[a>>2]|0;j=i-c>>3;p=c;c=i;if(l>>>0<=j>>>0){if(l>>>0<j>>>0?(i=p+(l<<3)|0,(i|0)!=(c|0)):0)f[k>>2]=c+(~((c+-8-i|0)>>>3)<<3)}else wh(a,l-j|0);v=+(t>>>0)+4294967296.0*+(s>>>0);s=(r|0)<0;if(!s){t=f[a>>2]|0;j=0;i=0;do{c=b+(i<<3)|0;k=f[c>>2]|0;p=f[c+4>>2]|0;c=~~((+(k>>>0)+4294967296.0*+(p>>>0))/v*4096.0+.5)>>>0;m=((k|0)!=0|(p|0)!=0)&(c|0)==0?1:c;f[t+(i<<3)>>2]=m;j=m+j|0;i=i+1|0}while((i|0)!=(l|0));if((j|0)==4096){if(s){w=0;u=e;return w|0}}else{x=j;y=12}}else{x=0;y=12}if((y|0)==12){f[h>>2]=0;j=h+4|0;f[j>>2]=0;f[h+8>>2]=0;do if(l)if(l>>>0>1073741823)aq(h);else{i=l<<2;t=ln(i)|0;f[h>>2]=t;m=t+(l<<2)|0;f[h+8>>2]=m;sj(t|0,0,i|0)|0;f[j>>2]=m;z=t;A=m;break}else{z=0;A=0}while(0);if(!s?(f[z>>2]=0,r|0):0){m=1;do{f[z+(m<<2)>>2]=m;m=m+1|0}while((m|0)!=(l|0))}f[g>>2]=a;Hb(z,A,g);a:do if((x|0)<4096){g=(f[a>>2]|0)+(f[(f[j>>2]|0)+-4>>2]<<3)|0;f[g>>2]=4096-x+(f[g>>2]|0);B=0}else{g=f[h>>2]|0;if((r|0)<=0){A=(x|0)>4096;while(1)if(!A){B=0;break a}}A=f[a>>2]|0;z=x+-4096|0;m=x;while(1){v=4096.0/+(m|0);t=r;i=z;c=m;while(1){p=A+(f[g+(t<<2)>>2]<<3)|0;k=f[p>>2]|0;if(k>>>0<2){y=28;break}q=k-~~+J(+(v*+(k>>>0)))|0;o=(q|0)==0?1:q;q=(o|0)<(k|0)?o:k+-1|0;o=(q|0)>(i|0)?i:q;f[p>>2]=k-o;k=c-o|0;p=i-o|0;if((k|0)==4096){C=p;D=4096;break}if((t|0)>1){t=t+-1|0;i=p;c=k}else{C=p;D=k;break}}if((y|0)==28){y=0;if((t|0)==(r|0)){B=1;break a}else{C=i;D=c}}if((C|0)>0){z=C;m=D}else{B=0;break}}}while(0);D=f[h>>2]|0;if(D|0){h=f[j>>2]|0;if((h|0)!=(D|0))f[j>>2]=h+(~((h+-4-D|0)>>>2)<<2);Oq(D)}if((B|0)!=0|s){w=0;u=e;return w|0}}B=f[a>>2]|0;D=0;h=0;do{f[B+(D<<3)+4>>2]=h;h=(f[B+(D<<3)>>2]|0)+h|0;D=D+1|0}while((D|0)!=(l|0));if((h|0)!=4096){w=0;u=e;return w|0}if(s)E=0.0;else{s=f[a>>2]|0;h=0;v=0.0;while(1){D=f[s+(h<<3)>>2]|0;if(!D)F=v;else{B=b+(h<<3)|0;G=+((f[B>>2]|0)>>>0)+4294967296.0*+((f[B+4>>2]|0)>>>0);F=v+ +Zg(+(D>>>0)*.000244140625)*G}h=h+1|0;if((h|0)==(l|0)){E=F;break}else v=F}}F=+W(+-E);l=+K(F)>=1.0?(F>0.0?~~+Y(+J(F/4294967296.0),4294967295.0)>>>0:~~+W((F-+(~~F>>>0))/4294967296.0)>>>0):0;h=a+16|0;f[h>>2]=~~F>>>0;f[h+4>>2]=l;w=Le(a,d)|0;u=e;return w|0}function dd(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0.0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0.0,F=0.0,G=0.0;e=u;u=u+16|0;g=e;h=e+4|0;if((c|0)>0){i=0;j=0;k=0;l=0;while(1){m=b+(j<<3)|0;n=f[m>>2]|0;o=f[m+4>>2]|0;m=Vn(n|0,o|0,k|0,l|0)|0;p=I;q=(n|0)==0&(o|0)==0?i:j;j=j+1|0;if((j|0)==(c|0)){r=q;s=p;t=m;break}else{i=q;k=m;l=p}}}else{r=0;s=0;t=0}l=r+1|0;f[a+12>>2]=l;k=a+4|0;i=f[k>>2]|0;c=f[a>>2]|0;j=i-c>>3;p=c;c=i;if(l>>>0<=j>>>0){if(l>>>0<j>>>0?(i=p+(l<<3)|0,(i|0)!=(c|0)):0)f[k>>2]=c+(~((c+-8-i|0)>>>3)<<3)}else wh(a,l-j|0);v=+(t>>>0)+4294967296.0*+(s>>>0);s=(r|0)<0;if(!s){t=f[a>>2]|0;j=0;i=0;do{c=b+(i<<3)|0;k=f[c>>2]|0;p=f[c+4>>2]|0;c=~~((+(k>>>0)+4294967296.0*+(p>>>0))/v*4096.0+.5)>>>0;m=((k|0)!=0|(p|0)!=0)&(c|0)==0?1:c;f[t+(i<<3)>>2]=m;j=m+j|0;i=i+1|0}while((i|0)!=(l|0));if((j|0)==4096){if(s){w=0;u=e;return w|0}}else{x=j;y=12}}else{x=0;y=12}if((y|0)==12){f[h>>2]=0;j=h+4|0;f[j>>2]=0;f[h+8>>2]=0;do if(l)if(l>>>0>1073741823)aq(h);else{i=l<<2;t=ln(i)|0;f[h>>2]=t;m=t+(l<<2)|0;f[h+8>>2]=m;sj(t|0,0,i|0)|0;f[j>>2]=m;z=t;A=m;break}else{z=0;A=0}while(0);if(!s?(f[z>>2]=0,r|0):0){m=1;do{f[z+(m<<2)>>2]=m;m=m+1|0}while((m|0)!=(l|0))}f[g>>2]=a;Ib(z,A,g);a:do if((x|0)<4096){g=(f[a>>2]|0)+(f[(f[j>>2]|0)+-4>>2]<<3)|0;f[g>>2]=4096-x+(f[g>>2]|0);B=0}else{g=f[h>>2]|0;if((r|0)<=0){A=(x|0)>4096;while(1)if(!A){B=0;break a}}A=f[a>>2]|0;z=x+-4096|0;m=x;while(1){v=4096.0/+(m|0);t=r;i=z;c=m;while(1){p=A+(f[g+(t<<2)>>2]<<3)|0;k=f[p>>2]|0;if(k>>>0<2){y=28;break}q=k-~~+J(+(v*+(k>>>0)))|0;o=(q|0)==0?1:q;q=(o|0)<(k|0)?o:k+-1|0;o=(q|0)>(i|0)?i:q;f[p>>2]=k-o;k=c-o|0;p=i-o|0;if((k|0)==4096){C=p;D=4096;break}if((t|0)>1){t=t+-1|0;i=p;c=k}else{C=p;D=k;break}}if((y|0)==28){y=0;if((t|0)==(r|0)){B=1;break a}else{C=i;D=c}}if((C|0)>0){z=C;m=D}else{B=0;break}}}while(0);D=f[h>>2]|0;if(D|0){h=f[j>>2]|0;if((h|0)!=(D|0))f[j>>2]=h+(~((h+-4-D|0)>>>2)<<2);Oq(D)}if((B|0)!=0|s){w=0;u=e;return w|0}}B=f[a>>2]|0;D=0;h=0;do{f[B+(D<<3)+4>>2]=h;h=(f[B+(D<<3)>>2]|0)+h|0;D=D+1|0}while((D|0)!=(l|0));if((h|0)!=4096){w=0;u=e;return w|0}if(s)E=0.0;else{s=f[a>>2]|0;h=0;v=0.0;while(1){D=f[s+(h<<3)>>2]|0;if(!D)F=v;else{B=b+(h<<3)|0;G=+((f[B>>2]|0)>>>0)+4294967296.0*+((f[B+4>>2]|0)>>>0);F=v+ +Zg(+(D>>>0)*.000244140625)*G}h=h+1|0;if((h|0)==(l|0)){E=F;break}else v=F}}F=+W(+-E);l=+K(F)>=1.0?(F>0.0?~~+Y(+J(F/4294967296.0),4294967295.0)>>>0:~~+W((F-+(~~F>>>0))/4294967296.0)>>>0):0;h=a+16|0;f[h>>2]=~~F>>>0;f[h+4>>2]=l;w=Le(a,d)|0;u=e;return w|0}function ed(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0.0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0.0,F=0.0,G=0.0;e=u;u=u+16|0;g=e;h=e+4|0;if((c|0)>0){i=0;j=0;k=0;l=0;while(1){m=b+(j<<3)|0;n=f[m>>2]|0;o=f[m+4>>2]|0;m=Vn(n|0,o|0,k|0,l|0)|0;p=I;q=(n|0)==0&(o|0)==0?i:j;j=j+1|0;if((j|0)==(c|0)){r=q;s=p;t=m;break}else{i=q;k=m;l=p}}}else{r=0;s=0;t=0}l=r+1|0;f[a+12>>2]=l;k=a+4|0;i=f[k>>2]|0;c=f[a>>2]|0;j=i-c>>3;p=c;c=i;if(l>>>0<=j>>>0){if(l>>>0<j>>>0?(i=p+(l<<3)|0,(i|0)!=(c|0)):0)f[k>>2]=c+(~((c+-8-i|0)>>>3)<<3)}else wh(a,l-j|0);v=+(t>>>0)+4294967296.0*+(s>>>0);s=(r|0)<0;if(!s){t=f[a>>2]|0;j=0;i=0;do{c=b+(i<<3)|0;k=f[c>>2]|0;p=f[c+4>>2]|0;c=~~((+(k>>>0)+4294967296.0*+(p>>>0))/v*4096.0+.5)>>>0;m=((k|0)!=0|(p|0)!=0)&(c|0)==0?1:c;f[t+(i<<3)>>2]=m;j=m+j|0;i=i+1|0}while((i|0)!=(l|0));if((j|0)==4096){if(s){w=0;u=e;return w|0}}else{x=j;y=12}}else{x=0;y=12}if((y|0)==12){f[h>>2]=0;j=h+4|0;f[j>>2]=0;f[h+8>>2]=0;do if(l)if(l>>>0>1073741823)aq(h);else{i=l<<2;t=ln(i)|0;f[h>>2]=t;m=t+(l<<2)|0;f[h+8>>2]=m;sj(t|0,0,i|0)|0;f[j>>2]=m;z=t;A=m;break}else{z=0;A=0}while(0);if(!s?(f[z>>2]=0,r|0):0){m=1;do{f[z+(m<<2)>>2]=m;m=m+1|0}while((m|0)!=(l|0))}f[g>>2]=a;Jb(z,A,g);a:do if((x|0)<4096){g=(f[a>>2]|0)+(f[(f[j>>2]|0)+-4>>2]<<3)|0;f[g>>2]=4096-x+(f[g>>2]|0);B=0}else{g=f[h>>2]|0;if((r|0)<=0){A=(x|0)>4096;while(1)if(!A){B=0;break a}}A=f[a>>2]|0;z=x+-4096|0;m=x;while(1){v=4096.0/+(m|0);t=r;i=z;c=m;while(1){p=A+(f[g+(t<<2)>>2]<<3)|0;k=f[p>>2]|0;if(k>>>0<2){y=28;break}q=k-~~+J(+(v*+(k>>>0)))|0;o=(q|0)==0?1:q;q=(o|0)<(k|0)?o:k+-1|0;o=(q|0)>(i|0)?i:q;f[p>>2]=k-o;k=c-o|0;p=i-o|0;if((k|0)==4096){C=p;D=4096;break}if((t|0)>1){t=t+-1|0;i=p;c=k}else{C=p;D=k;break}}if((y|0)==28){y=0;if((t|0)==(r|0)){B=1;break a}else{C=i;D=c}}if((C|0)>0){z=C;m=D}else{B=0;break}}}while(0);D=f[h>>2]|0;if(D|0){h=f[j>>2]|0;if((h|0)!=(D|0))f[j>>2]=h+(~((h+-4-D|0)>>>2)<<2);Oq(D)}if((B|0)!=0|s){w=0;u=e;return w|0}}B=f[a>>2]|0;D=0;h=0;do{f[B+(D<<3)+4>>2]=h;h=(f[B+(D<<3)>>2]|0)+h|0;D=D+1|0}while((D|0)!=(l|0));if((h|0)!=4096){w=0;u=e;return w|0}if(s)E=0.0;else{s=f[a>>2]|0;h=0;v=0.0;while(1){D=f[s+(h<<3)>>2]|0;if(!D)F=v;else{B=b+(h<<3)|0;G=+((f[B>>2]|0)>>>0)+4294967296.0*+((f[B+4>>2]|0)>>>0);F=v+ +Zg(+(D>>>0)*.000244140625)*G}h=h+1|0;if((h|0)==(l|0)){E=F;break}else v=F}}F=+W(+-E);l=+K(F)>=1.0?(F>0.0?~~+Y(+J(F/4294967296.0),4294967295.0)>>>0:~~+W((F-+(~~F>>>0))/4294967296.0)>>>0):0;h=a+16|0;f[h>>2]=~~F>>>0;f[h+4>>2]=l;w=Le(a,d)|0;u=e;return w|0}function fd(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0.0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0.0,F=0.0,G=0.0;e=u;u=u+16|0;g=e;h=e+4|0;if((c|0)>0){i=0;j=0;k=0;l=0;while(1){m=b+(j<<3)|0;n=f[m>>2]|0;o=f[m+4>>2]|0;m=Vn(n|0,o|0,k|0,l|0)|0;p=I;q=(n|0)==0&(o|0)==0?i:j;j=j+1|0;if((j|0)==(c|0)){r=q;s=p;t=m;break}else{i=q;k=m;l=p}}}else{r=0;s=0;t=0}l=r+1|0;f[a+12>>2]=l;k=a+4|0;i=f[k>>2]|0;c=f[a>>2]|0;j=i-c>>3;p=c;c=i;if(l>>>0<=j>>>0){if(l>>>0<j>>>0?(i=p+(l<<3)|0,(i|0)!=(c|0)):0)f[k>>2]=c+(~((c+-8-i|0)>>>3)<<3)}else wh(a,l-j|0);v=+(t>>>0)+4294967296.0*+(s>>>0);s=(r|0)<0;if(!s){t=f[a>>2]|0;j=0;i=0;do{c=b+(i<<3)|0;k=f[c>>2]|0;p=f[c+4>>2]|0;c=~~((+(k>>>0)+4294967296.0*+(p>>>0))/v*4096.0+.5)>>>0;m=((k|0)!=0|(p|0)!=0)&(c|0)==0?1:c;f[t+(i<<3)>>2]=m;j=m+j|0;i=i+1|0}while((i|0)!=(l|0));if((j|0)==4096){if(s){w=0;u=e;return w|0}}else{x=j;y=12}}else{x=0;y=12}if((y|0)==12){f[h>>2]=0;j=h+4|0;f[j>>2]=0;f[h+8>>2]=0;do if(l)if(l>>>0>1073741823)aq(h);else{i=l<<2;t=ln(i)|0;f[h>>2]=t;m=t+(l<<2)|0;f[h+8>>2]=m;sj(t|0,0,i|0)|0;f[j>>2]=m;z=t;A=m;break}else{z=0;A=0}while(0);if(!s?(f[z>>2]=0,r|0):0){m=1;do{f[z+(m<<2)>>2]=m;m=m+1|0}while((m|0)!=(l|0))}f[g>>2]=a;Kb(z,A,g);a:do if((x|0)<4096){g=(f[a>>2]|0)+(f[(f[j>>2]|0)+-4>>2]<<3)|0;f[g>>2]=4096-x+(f[g>>2]|0);B=0}else{g=f[h>>2]|0;if((r|0)<=0){A=(x|0)>4096;while(1)if(!A){B=0;break a}}A=f[a>>2]|0;z=x+-4096|0;m=x;while(1){v=4096.0/+(m|0);t=r;i=z;c=m;while(1){p=A+(f[g+(t<<2)>>2]<<3)|0;k=f[p>>2]|0;if(k>>>0<2){y=28;break}q=k-~~+J(+(v*+(k>>>0)))|0;o=(q|0)==0?1:q;q=(o|0)<(k|0)?o:k+-1|0;o=(q|0)>(i|0)?i:q;f[p>>2]=k-o;k=c-o|0;p=i-o|0;if((k|0)==4096){C=p;D=4096;break}if((t|0)>1){t=t+-1|0;i=p;c=k}else{C=p;D=k;break}}if((y|0)==28){y=0;if((t|0)==(r|0)){B=1;break a}else{C=i;D=c}}if((C|0)>0){z=C;m=D}else{B=0;break}}}while(0);D=f[h>>2]|0;if(D|0){h=f[j>>2]|0;if((h|0)!=(D|0))f[j>>2]=h+(~((h+-4-D|0)>>>2)<<2);Oq(D)}if((B|0)!=0|s){w=0;u=e;return w|0}}B=f[a>>2]|0;D=0;h=0;do{f[B+(D<<3)+4>>2]=h;h=(f[B+(D<<3)>>2]|0)+h|0;D=D+1|0}while((D|0)!=(l|0));if((h|0)!=4096){w=0;u=e;return w|0}if(s)E=0.0;else{s=f[a>>2]|0;h=0;v=0.0;while(1){D=f[s+(h<<3)>>2]|0;if(!D)F=v;else{B=b+(h<<3)|0;G=+((f[B>>2]|0)>>>0)+4294967296.0*+((f[B+4>>2]|0)>>>0);F=v+ +Zg(+(D>>>0)*.000244140625)*G}h=h+1|0;if((h|0)==(l|0)){E=F;break}else v=F}}F=+W(+-E);l=+K(F)>=1.0?(F>0.0?~~+Y(+J(F/4294967296.0),4294967295.0)>>>0:~~+W((F-+(~~F>>>0))/4294967296.0)>>>0):0;h=a+16|0;f[h>>2]=~~F>>>0;f[h+4>>2]=l;w=Le(a,d)|0;u=e;return w|0}function gd(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0.0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0.0,F=0.0,G=0.0;e=u;u=u+16|0;g=e;h=e+4|0;if((c|0)>0){i=0;j=0;k=0;l=0;while(1){m=b+(j<<3)|0;n=f[m>>2]|0;o=f[m+4>>2]|0;m=Vn(n|0,o|0,k|0,l|0)|0;p=I;q=(n|0)==0&(o|0)==0?i:j;j=j+1|0;if((j|0)==(c|0)){r=q;s=p;t=m;break}else{i=q;k=m;l=p}}}else{r=0;s=0;t=0}l=r+1|0;f[a+12>>2]=l;k=a+4|0;i=f[k>>2]|0;c=f[a>>2]|0;j=i-c>>3;p=c;c=i;if(l>>>0<=j>>>0){if(l>>>0<j>>>0?(i=p+(l<<3)|0,(i|0)!=(c|0)):0)f[k>>2]=c+(~((c+-8-i|0)>>>3)<<3)}else wh(a,l-j|0);v=+(t>>>0)+4294967296.0*+(s>>>0);s=(r|0)<0;if(!s){t=f[a>>2]|0;j=0;i=0;do{c=b+(i<<3)|0;k=f[c>>2]|0;p=f[c+4>>2]|0;c=~~((+(k>>>0)+4294967296.0*+(p>>>0))/v*4096.0+.5)>>>0;m=((k|0)!=0|(p|0)!=0)&(c|0)==0?1:c;f[t+(i<<3)>>2]=m;j=m+j|0;i=i+1|0}while((i|0)!=(l|0));if((j|0)==4096){if(s){w=0;u=e;return w|0}}else{x=j;y=12}}else{x=0;y=12}if((y|0)==12){f[h>>2]=0;j=h+4|0;f[j>>2]=0;f[h+8>>2]=0;do if(l)if(l>>>0>1073741823)aq(h);else{i=l<<2;t=ln(i)|0;f[h>>2]=t;m=t+(l<<2)|0;f[h+8>>2]=m;sj(t|0,0,i|0)|0;f[j>>2]=m;z=t;A=m;break}else{z=0;A=0}while(0);if(!s?(f[z>>2]=0,r|0):0){m=1;do{f[z+(m<<2)>>2]=m;m=m+1|0}while((m|0)!=(l|0))}f[g>>2]=a;Lb(z,A,g);a:do if((x|0)<4096){g=(f[a>>2]|0)+(f[(f[j>>2]|0)+-4>>2]<<3)|0;f[g>>2]=4096-x+(f[g>>2]|0);B=0}else{g=f[h>>2]|0;if((r|0)<=0){A=(x|0)>4096;while(1)if(!A){B=0;break a}}A=f[a>>2]|0;z=x+-4096|0;m=x;while(1){v=4096.0/+(m|0);t=r;i=z;c=m;while(1){p=A+(f[g+(t<<2)>>2]<<3)|0;k=f[p>>2]|0;if(k>>>0<2){y=28;break}q=k-~~+J(+(v*+(k>>>0)))|0;o=(q|0)==0?1:q;q=(o|0)<(k|0)?o:k+-1|0;o=(q|0)>(i|0)?i:q;f[p>>2]=k-o;k=c-o|0;p=i-o|0;if((k|0)==4096){C=p;D=4096;break}if((t|0)>1){t=t+-1|0;i=p;c=k}else{C=p;D=k;break}}if((y|0)==28){y=0;if((t|0)==(r|0)){B=1;break a}else{C=i;D=c}}if((C|0)>0){z=C;m=D}else{B=0;break}}}while(0);D=f[h>>2]|0;if(D|0){h=f[j>>2]|0;if((h|0)!=(D|0))f[j>>2]=h+(~((h+-4-D|0)>>>2)<<2);Oq(D)}if((B|0)!=0|s){w=0;u=e;return w|0}}B=f[a>>2]|0;D=0;h=0;do{f[B+(D<<3)+4>>2]=h;h=(f[B+(D<<3)>>2]|0)+h|0;D=D+1|0}while((D|0)!=(l|0));if((h|0)!=4096){w=0;u=e;return w|0}if(s)E=0.0;else{s=f[a>>2]|0;h=0;v=0.0;while(1){D=f[s+(h<<3)>>2]|0;if(!D)F=v;else{B=b+(h<<3)|0;G=+((f[B>>2]|0)>>>0)+4294967296.0*+((f[B+4>>2]|0)>>>0);F=v+ +Zg(+(D>>>0)*.000244140625)*G}h=h+1|0;if((h|0)==(l|0)){E=F;break}else v=F}}F=+W(+-E);l=+K(F)>=1.0?(F>0.0?~~+Y(+J(F/4294967296.0),4294967295.0)>>>0:~~+W((F-+(~~F>>>0))/4294967296.0)>>>0):0;h=a+16|0;f[h>>2]=~~F>>>0;f[h+4>>2]=l;w=Le(a,d)|0;u=e;return w|0}function hd(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0.0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0.0,F=0.0,G=0.0;e=u;u=u+16|0;g=e;h=e+4|0;if((c|0)>0){i=0;j=0;k=0;l=0;while(1){m=b+(j<<3)|0;n=f[m>>2]|0;o=f[m+4>>2]|0;m=Vn(n|0,o|0,k|0,l|0)|0;p=I;q=(n|0)==0&(o|0)==0?i:j;j=j+1|0;if((j|0)==(c|0)){r=q;s=p;t=m;break}else{i=q;k=m;l=p}}}else{r=0;s=0;t=0}l=r+1|0;f[a+12>>2]=l;k=a+4|0;i=f[k>>2]|0;c=f[a>>2]|0;j=i-c>>3;p=c;c=i;if(l>>>0<=j>>>0){if(l>>>0<j>>>0?(i=p+(l<<3)|0,(i|0)!=(c|0)):0)f[k>>2]=c+(~((c+-8-i|0)>>>3)<<3)}else wh(a,l-j|0);v=+(t>>>0)+4294967296.0*+(s>>>0);s=(r|0)<0;if(!s){t=f[a>>2]|0;j=0;i=0;do{c=b+(i<<3)|0;k=f[c>>2]|0;p=f[c+4>>2]|0;c=~~((+(k>>>0)+4294967296.0*+(p>>>0))/v*4096.0+.5)>>>0;m=((k|0)!=0|(p|0)!=0)&(c|0)==0?1:c;f[t+(i<<3)>>2]=m;j=m+j|0;i=i+1|0}while((i|0)!=(l|0));if((j|0)==4096){if(s){w=0;u=e;return w|0}}else{x=j;y=12}}else{x=0;y=12}if((y|0)==12){f[h>>2]=0;j=h+4|0;f[j>>2]=0;f[h+8>>2]=0;do if(l)if(l>>>0>1073741823)aq(h);else{i=l<<2;t=ln(i)|0;f[h>>2]=t;m=t+(l<<2)|0;f[h+8>>2]=m;sj(t|0,0,i|0)|0;f[j>>2]=m;z=t;A=m;break}else{z=0;A=0}while(0);if(!s?(f[z>>2]=0,r|0):0){m=1;do{f[z+(m<<2)>>2]=m;m=m+1|0}while((m|0)!=(l|0))}f[g>>2]=a;Mb(z,A,g);a:do if((x|0)<4096){g=(f[a>>2]|0)+(f[(f[j>>2]|0)+-4>>2]<<3)|0;f[g>>2]=4096-x+(f[g>>2]|0);B=0}else{g=f[h>>2]|0;if((r|0)<=0){A=(x|0)>4096;while(1)if(!A){B=0;break a}}A=f[a>>2]|0;z=x+-4096|0;m=x;while(1){v=4096.0/+(m|0);t=r;i=z;c=m;while(1){p=A+(f[g+(t<<2)>>2]<<3)|0;k=f[p>>2]|0;if(k>>>0<2){y=28;break}q=k-~~+J(+(v*+(k>>>0)))|0;o=(q|0)==0?1:q;q=(o|0)<(k|0)?o:k+-1|0;o=(q|0)>(i|0)?i:q;f[p>>2]=k-o;k=c-o|0;p=i-o|0;if((k|0)==4096){C=p;D=4096;break}if((t|0)>1){t=t+-1|0;i=p;c=k}else{C=p;D=k;break}}if((y|0)==28){y=0;if((t|0)==(r|0)){B=1;break a}else{C=i;D=c}}if((C|0)>0){z=C;m=D}else{B=0;break}}}while(0);D=f[h>>2]|0;if(D|0){h=f[j>>2]|0;if((h|0)!=(D|0))f[j>>2]=h+(~((h+-4-D|0)>>>2)<<2);Oq(D)}if((B|0)!=0|s){w=0;u=e;return w|0}}B=f[a>>2]|0;D=0;h=0;do{f[B+(D<<3)+4>>2]=h;h=(f[B+(D<<3)>>2]|0)+h|0;D=D+1|0}while((D|0)!=(l|0));if((h|0)!=4096){w=0;u=e;return w|0}if(s)E=0.0;else{s=f[a>>2]|0;h=0;v=0.0;while(1){D=f[s+(h<<3)>>2]|0;if(!D)F=v;else{B=b+(h<<3)|0;G=+((f[B>>2]|0)>>>0)+4294967296.0*+((f[B+4>>2]|0)>>>0);F=v+ +Zg(+(D>>>0)*.000244140625)*G}h=h+1|0;if((h|0)==(l|0)){E=F;break}else v=F}}F=+W(+-E);l=+K(F)>=1.0?(F>0.0?~~+Y(+J(F/4294967296.0),4294967295.0)>>>0:~~+W((F-+(~~F>>>0))/4294967296.0)>>>0):0;h=a+16|0;f[h>>2]=~~F>>>0;f[h+4>>2]=l;w=Le(a,d)|0;u=e;return w|0}function id(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0.0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0.0,F=0.0,G=0.0;e=u;u=u+16|0;g=e;h=e+4|0;if((c|0)>0){i=0;j=0;k=0;l=0;while(1){m=b+(j<<3)|0;n=f[m>>2]|0;o=f[m+4>>2]|0;m=Vn(n|0,o|0,k|0,l|0)|0;p=I;q=(n|0)==0&(o|0)==0?i:j;j=j+1|0;if((j|0)==(c|0)){r=q;s=p;t=m;break}else{i=q;k=m;l=p}}}else{r=0;s=0;t=0}l=r+1|0;f[a+12>>2]=l;k=a+4|0;i=f[k>>2]|0;c=f[a>>2]|0;j=i-c>>3;p=c;c=i;if(l>>>0<=j>>>0){if(l>>>0<j>>>0?(i=p+(l<<3)|0,(i|0)!=(c|0)):0)f[k>>2]=c+(~((c+-8-i|0)>>>3)<<3)}else wh(a,l-j|0);v=+(t>>>0)+4294967296.0*+(s>>>0);s=(r|0)<0;if(!s){t=f[a>>2]|0;j=0;i=0;do{c=b+(i<<3)|0;k=f[c>>2]|0;p=f[c+4>>2]|0;c=~~((+(k>>>0)+4294967296.0*+(p>>>0))/v*4096.0+.5)>>>0;m=((k|0)!=0|(p|0)!=0)&(c|0)==0?1:c;f[t+(i<<3)>>2]=m;j=m+j|0;i=i+1|0}while((i|0)!=(l|0));if((j|0)==4096){if(s){w=0;u=e;return w|0}}else{x=j;y=12}}else{x=0;y=12}if((y|0)==12){f[h>>2]=0;j=h+4|0;f[j>>2]=0;f[h+8>>2]=0;do if(l)if(l>>>0>1073741823)aq(h);else{i=l<<2;t=ln(i)|0;f[h>>2]=t;m=t+(l<<2)|0;f[h+8>>2]=m;sj(t|0,0,i|0)|0;f[j>>2]=m;z=t;A=m;break}else{z=0;A=0}while(0);if(!s?(f[z>>2]=0,r|0):0){m=1;do{f[z+(m<<2)>>2]=m;m=m+1|0}while((m|0)!=(l|0))}f[g>>2]=a;Nb(z,A,g);a:do if((x|0)<4096){g=(f[a>>2]|0)+(f[(f[j>>2]|0)+-4>>2]<<3)|0;f[g>>2]=4096-x+(f[g>>2]|0);B=0}else{g=f[h>>2]|0;if((r|0)<=0){A=(x|0)>4096;while(1)if(!A){B=0;break a}}A=f[a>>2]|0;z=x+-4096|0;m=x;while(1){v=4096.0/+(m|0);t=r;i=z;c=m;while(1){p=A+(f[g+(t<<2)>>2]<<3)|0;k=f[p>>2]|0;if(k>>>0<2){y=28;break}q=k-~~+J(+(v*+(k>>>0)))|0;o=(q|0)==0?1:q;q=(o|0)<(k|0)?o:k+-1|0;o=(q|0)>(i|0)?i:q;f[p>>2]=k-o;k=c-o|0;p=i-o|0;if((k|0)==4096){C=p;D=4096;break}if((t|0)>1){t=t+-1|0;i=p;c=k}else{C=p;D=k;break}}if((y|0)==28){y=0;if((t|0)==(r|0)){B=1;break a}else{C=i;D=c}}if((C|0)>0){z=C;m=D}else{B=0;break}}}while(0);D=f[h>>2]|0;if(D|0){h=f[j>>2]|0;if((h|0)!=(D|0))f[j>>2]=h+(~((h+-4-D|0)>>>2)<<2);Oq(D)}if((B|0)!=0|s){w=0;u=e;return w|0}}B=f[a>>2]|0;D=0;h=0;do{f[B+(D<<3)+4>>2]=h;h=(f[B+(D<<3)>>2]|0)+h|0;D=D+1|0}while((D|0)!=(l|0));if((h|0)!=4096){w=0;u=e;return w|0}if(s)E=0.0;else{s=f[a>>2]|0;h=0;v=0.0;while(1){D=f[s+(h<<3)>>2]|0;if(!D)F=v;else{B=b+(h<<3)|0;G=+((f[B>>2]|0)>>>0)+4294967296.0*+((f[B+4>>2]|0)>>>0);F=v+ +Zg(+(D>>>0)*.000244140625)*G}h=h+1|0;if((h|0)==(l|0)){E=F;break}else v=F}}F=+W(+-E);l=+K(F)>=1.0?(F>0.0?~~+Y(+J(F/4294967296.0),4294967295.0)>>>0:~~+W((F-+(~~F>>>0))/4294967296.0)>>>0):0;h=a+16|0;f[h>>2]=~~F>>>0;f[h+4>>2]=l;w=Le(a,d)|0;u=e;return w|0}function jd(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0.0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0.0,F=0.0,G=0.0;e=u;u=u+16|0;g=e;h=e+4|0;if((c|0)>0){i=0;j=0;k=0;l=0;while(1){m=b+(j<<3)|0;n=f[m>>2]|0;o=f[m+4>>2]|0;m=Vn(n|0,o|0,k|0,l|0)|0;p=I;q=(n|0)==0&(o|0)==0?i:j;j=j+1|0;if((j|0)==(c|0)){r=q;s=p;t=m;break}else{i=q;k=m;l=p}}}else{r=0;s=0;t=0}l=r+1|0;f[a+12>>2]=l;k=a+4|0;i=f[k>>2]|0;c=f[a>>2]|0;j=i-c>>3;p=c;c=i;if(l>>>0<=j>>>0){if(l>>>0<j>>>0?(i=p+(l<<3)|0,(i|0)!=(c|0)):0)f[k>>2]=c+(~((c+-8-i|0)>>>3)<<3)}else wh(a,l-j|0);v=+(t>>>0)+4294967296.0*+(s>>>0);s=(r|0)<0;if(!s){t=f[a>>2]|0;j=0;i=0;do{c=b+(i<<3)|0;k=f[c>>2]|0;p=f[c+4>>2]|0;c=~~((+(k>>>0)+4294967296.0*+(p>>>0))/v*4096.0+.5)>>>0;m=((k|0)!=0|(p|0)!=0)&(c|0)==0?1:c;f[t+(i<<3)>>2]=m;j=m+j|0;i=i+1|0}while((i|0)!=(l|0));if((j|0)==4096){if(s){w=0;u=e;return w|0}}else{x=j;y=12}}else{x=0;y=12}if((y|0)==12){f[h>>2]=0;j=h+4|0;f[j>>2]=0;f[h+8>>2]=0;do if(l)if(l>>>0>1073741823)aq(h);else{i=l<<2;t=ln(i)|0;f[h>>2]=t;m=t+(l<<2)|0;f[h+8>>2]=m;sj(t|0,0,i|0)|0;f[j>>2]=m;z=t;A=m;break}else{z=0;A=0}while(0);if(!s?(f[z>>2]=0,r|0):0){m=1;do{f[z+(m<<2)>>2]=m;m=m+1|0}while((m|0)!=(l|0))}f[g>>2]=a;Ob(z,A,g);a:do if((x|0)<4096){g=(f[a>>2]|0)+(f[(f[j>>2]|0)+-4>>2]<<3)|0;f[g>>2]=4096-x+(f[g>>2]|0);B=0}else{g=f[h>>2]|0;if((r|0)<=0){A=(x|0)>4096;while(1)if(!A){B=0;break a}}A=f[a>>2]|0;z=x+-4096|0;m=x;while(1){v=4096.0/+(m|0);t=r;i=z;c=m;while(1){p=A+(f[g+(t<<2)>>2]<<3)|0;k=f[p>>2]|0;if(k>>>0<2){y=28;break}q=k-~~+J(+(v*+(k>>>0)))|0;o=(q|0)==0?1:q;q=(o|0)<(k|0)?o:k+-1|0;o=(q|0)>(i|0)?i:q;f[p>>2]=k-o;k=c-o|0;p=i-o|0;if((k|0)==4096){C=p;D=4096;break}if((t|0)>1){t=t+-1|0;i=p;c=k}else{C=p;D=k;break}}if((y|0)==28){y=0;if((t|0)==(r|0)){B=1;break a}else{C=i;D=c}}if((C|0)>0){z=C;m=D}else{B=0;break}}}while(0);D=f[h>>2]|0;if(D|0){h=f[j>>2]|0;if((h|0)!=(D|0))f[j>>2]=h+(~((h+-4-D|0)>>>2)<<2);Oq(D)}if((B|0)!=0|s){w=0;u=e;return w|0}}B=f[a>>2]|0;D=0;h=0;do{f[B+(D<<3)+4>>2]=h;h=(f[B+(D<<3)>>2]|0)+h|0;D=D+1|0}while((D|0)!=(l|0));if((h|0)!=4096){w=0;u=e;return w|0}if(s)E=0.0;else{s=f[a>>2]|0;h=0;v=0.0;while(1){D=f[s+(h<<3)>>2]|0;if(!D)F=v;else{B=b+(h<<3)|0;G=+((f[B>>2]|0)>>>0)+4294967296.0*+((f[B+4>>2]|0)>>>0);F=v+ +Zg(+(D>>>0)*.000244140625)*G}h=h+1|0;if((h|0)==(l|0)){E=F;break}else v=F}}F=+W(+-E);l=+K(F)>=1.0?(F>0.0?~~+Y(+J(F/4294967296.0),4294967295.0)>>>0:~~+W((F-+(~~F>>>0))/4294967296.0)>>>0):0;h=a+16|0;f[h>>2]=~~F>>>0;f[h+4>>2]=l;w=Le(a,d)|0;u=e;return w|0}function kd(a,b,c,d,e,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0;g=u;u=u+32|0;d=g+16|0;h=g+8|0;i=g;j=e>>>0>1073741823?-1:e<<2;k=Lq(j)|0;sj(k|0,0,j|0)|0;j=f[a+28>>2]|0;l=a+36|0;m=f[l>>2]|0;n=f[m+4>>2]|0;o=f[m>>2]|0;p=n-o|0;a:do if((p|0)>4){q=p>>2;r=f[a+32>>2]|0;s=a+8|0;t=h+4|0;v=i+4|0;w=d+4|0;x=j+12|0;y=(e|0)>0;z=k+4|0;A=h+4|0;B=i+4|0;C=d+4|0;D=q+-1|0;if(n-o>>2>>>0>D>>>0){E=q;F=D;G=o}else{H=m;aq(H)}while(1){D=f[G+(F<<2)>>2]|0;q=X(F,e)|0;if((D|0)!=-1?(I=f[(f[x>>2]|0)+(D<<2)>>2]|0,(I|0)!=-1):0){D=f[j>>2]|0;J=f[r>>2]|0;K=f[J+(f[D+(I<<2)>>2]<<2)>>2]|0;L=I+1|0;M=((L>>>0)%3|0|0)==0?I+-2|0:L;if((M|0)==-1)N=-1;else N=f[D+(M<<2)>>2]|0;M=f[J+(N<<2)>>2]|0;L=(((I>>>0)%3|0|0)==0?2:-1)+I|0;if((L|0)==-1)O=-1;else O=f[D+(L<<2)>>2]|0;L=f[J+(O<<2)>>2]|0;if((K|0)<(F|0)&(M|0)<(F|0)&(L|0)<(F|0)){J=X(K,e)|0;K=X(M,e)|0;M=X(L,e)|0;if(y){L=0;do{f[k+(L<<2)>>2]=(f[b+(L+M<<2)>>2]|0)+(f[b+(L+K<<2)>>2]|0)-(f[b+(L+J<<2)>>2]|0);L=L+1|0}while((L|0)!=(e|0))}L=b+(q<<2)|0;J=c+(q<<2)|0;K=f[L+4>>2]|0;M=f[k>>2]|0;D=f[z>>2]|0;f[h>>2]=f[L>>2];f[A>>2]=K;f[i>>2]=M;f[B>>2]=D;Od(d,s,h,i);f[J>>2]=f[d>>2];f[J+4>>2]=f[C>>2]}else P=15}else P=15;if((P|0)==15){P=0;J=b+(q<<2)|0;D=b+((X(E+-2|0,e)|0)<<2)|0;M=c+(q<<2)|0;K=f[J+4>>2]|0;L=f[D>>2]|0;I=f[D+4>>2]|0;f[h>>2]=f[J>>2];f[t>>2]=K;f[i>>2]=L;f[v>>2]=I;Od(d,s,h,i);f[M>>2]=f[d>>2];f[M+4>>2]=f[w>>2]}if((E|0)<=2)break a;M=f[l>>2]|0;G=f[M>>2]|0;I=F+-1|0;if((f[M+4>>2]|0)-G>>2>>>0<=I>>>0){H=M;break}else{M=F;F=I;E=M}}aq(H)}while(0);if((e|0)<=0){Q=a+8|0;R=b+4|0;S=f[b>>2]|0;T=f[R>>2]|0;U=k+4|0;V=f[k>>2]|0;W=f[U>>2]|0;f[h>>2]=S;Y=h+4|0;f[Y>>2]=T;f[i>>2]=V;Z=i+4|0;f[Z>>2]=W;Od(d,Q,h,i);_=f[d>>2]|0;f[c>>2]=_;$=d+4|0;aa=f[$>>2]|0;ba=c+4|0;f[ba>>2]=aa;Mq(k);u=g;return 1}sj(k|0,0,e<<2|0)|0;Q=a+8|0;R=b+4|0;S=f[b>>2]|0;T=f[R>>2]|0;U=k+4|0;V=f[k>>2]|0;W=f[U>>2]|0;f[h>>2]=S;Y=h+4|0;f[Y>>2]=T;f[i>>2]=V;Z=i+4|0;f[Z>>2]=W;Od(d,Q,h,i);_=f[d>>2]|0;f[c>>2]=_;$=d+4|0;aa=f[$>>2]|0;ba=c+4|0;f[ba>>2]=aa;Mq(k);u=g;return 1}function ld(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,J=0,K=0,L=0,M=0;d=u;u=u+32|0;e=d;g=d+20|0;h=d+24|0;i=d+8|0;j=f[a>>2]|0;k=j+8|0;l=j;j=f[l>>2]|0;m=f[l+4>>2]|0;l=Vn(j|0,m|0,f[k>>2]|0,f[k+4>>2]|0)|0;k=I;n=Vn(l|0,k|0,(l|0)==0&(k|0)==0&1|0,0)|0;k=~~((+(j>>>0)+4294967296.0*+(m>>>0))/(+(n>>>0)+4294967296.0*+(I>>>0))*256.0+.5)>>>0;n=k>>>0<255?k:255;k=n+((n|0)==0&1)&255;b[h>>0]=k;n=a+12|0;m=a+16|0;j=((f[m>>2]|0)-(f[n>>2]|0)<<1)+64|0;f[i>>2]=0;l=i+4|0;f[l>>2]=0;f[i+8>>2]=0;if(!j)o=0;else{if((j|0)<0)aq(i);p=ln(j)|0;f[l>>2]=p;f[i>>2]=p;f[i+8>>2]=p+j;q=j;j=p;do{b[j>>0]=0;j=(f[l>>2]|0)+1|0;f[l>>2]=j;q=q+-1|0}while((q|0)!=0);o=f[i>>2]|0}q=a+28|0;j=(f[q>>2]|0)+-1|0;a:do if((j|0)>-1){p=a+24|0;r=j;s=4096;t=0;v=k;while(1){w=(f[p>>2]&1<<r|0)!=0;x=(w?0-(v&255)&255:v)&255;if(s>>>0<x<<12>>>0){y=t;z=s}else{b[o+t>>0]=s;y=t+1|0;z=s>>>8}un(f[4092+(x<<3)>>2]|0,0,z|0,0)|0;A=z+(w?0:0-v&255)+(X((z+I|0)>>>(f[4092+(x<<3)+4>>2]|0),256-x|0)|0)|0;x=r+-1|0;if((x|0)<=-1){B=A;C=y;break a}r=x;s=A;t=y;v=b[h>>0]|0}}else{B=4096;C=0}while(0);y=f[m>>2]|0;if((f[n>>2]|0)==(y|0)){D=B;E=C}else{z=B;B=C;C=y;while(1){C=C+-4|0;y=f[C>>2]|0;k=31;j=z;v=B;while(1){t=b[h>>0]|0;s=(1<<k&y|0)!=0;r=(s?0-(t&255)&255:t)&255;if(j>>>0<r<<12>>>0){F=v;G=j}else{b[o+v>>0]=j;F=v+1|0;G=j>>>8}un(f[4092+(r<<3)>>2]|0,0,G|0,0)|0;j=G+(s?0:0-t&255)+(X((G+I|0)>>>(f[4092+(r<<3)+4>>2]|0),256-r|0)|0)|0;if((k|0)<=0)break;else{k=k+-1|0;v=F}}if((f[n>>2]|0)==(C|0)){D=j;E=F;break}else{z=j;B=F}}}F=D+-4096|0;do if(F>>>0>=64){if(F>>>0<16384){B=o+E|0;z=D+12288|0;b[B>>0]=z;H=2;J=z>>>8;K=B+1|0;L=25;break}if(F>>>0<4194304){B=o+E|0;z=D+8384512|0;b[B>>0]=z;b[B+1>>0]=z>>>8;H=3;J=z>>>16;K=B+2|0;L=25}else M=E}else{H=1;J=F;K=o+E|0;L=25}while(0);if((L|0)==25){b[K>>0]=J;M=H+E|0}E=c+16|0;H=E;J=f[H+4>>2]|0;if(!((J|0)>0|(J|0)==0&(f[H>>2]|0)>>>0>0)){f[g>>2]=f[c+4>>2];f[e>>2]=f[g>>2];Me(c,e,h,h+1|0)|0}ci(M,c)|0;h=f[i>>2]|0;H=E;E=f[H+4>>2]|0;if(!((E|0)>0|(E|0)==0&(f[H>>2]|0)>>>0>0)){f[g>>2]=f[c+4>>2];f[e>>2]=f[g>>2];Me(c,e,h,h+M|0)|0}M=e;f[M>>2]=0;f[M+4>>2]=0;qf(a,2,e);e=f[a+12>>2]|0;M=f[m>>2]|0;if((M|0)!=(e|0))f[m>>2]=M+(~((M+-4-e|0)>>>2)<<2);f[a+24>>2]=0;f[q>>2]=0;q=f[i>>2]|0;if(!q){u=d;return}if((f[l>>2]|0)!=(q|0))f[l>>2]=q;Oq(q);u=d;return}function md(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0;c=u;u=u+16|0;b=c+8|0;d=c+4|0;e=c;g=a+64|0;h=f[g>>2]|0;if((f[h+28>>2]|0)==(f[h+24>>2]|0)){u=c;return}i=a+52|0;j=a+56|0;k=a+60|0;l=a+12|0;m=a+28|0;n=a+40|0;o=a+44|0;p=a+48|0;q=0;r=0;s=h;while(1){h=f[(f[s+24>>2]|0)+(r<<2)>>2]|0;if((h|0)==-1){t=q;v=s}else{w=q+1|0;f[b>>2]=q;x=f[j>>2]|0;if((x|0)==(f[k>>2]|0))Ri(i,b);else{f[x>>2]=q;f[j>>2]=x+4}f[d>>2]=h;f[e>>2]=0;a:do if(!(f[(f[l>>2]|0)+(r>>>5<<2)>>2]&1<<(r&31)))y=h;else{x=h+1|0;z=((x>>>0)%3|0|0)==0?h+-2|0:x;if(((z|0)!=-1?(f[(f[a>>2]|0)+(z>>>5<<2)>>2]&1<<(z&31)|0)==0:0)?(x=f[(f[(f[g>>2]|0)+12>>2]|0)+(z<<2)>>2]|0,z=x+1|0,(x|0)!=-1):0){A=((z>>>0)%3|0|0)==0?x+-2|0:z;f[e>>2]=A;if((A|0)==-1){y=h;break}else B=A;while(1){f[d>>2]=B;A=B+1|0;z=((A>>>0)%3|0|0)==0?B+-2|0:A;if((z|0)==-1)break;if(f[(f[a>>2]|0)+(z>>>5<<2)>>2]&1<<(z&31)|0)break;A=f[(f[(f[g>>2]|0)+12>>2]|0)+(z<<2)>>2]|0;z=A+1|0;if((A|0)==-1)break;x=((z>>>0)%3|0|0)==0?A+-2|0:z;f[e>>2]=x;if((x|0)==-1){y=B;break a}else B=x}f[e>>2]=-1;y=B;break}f[e>>2]=-1;y=h}while(0);f[(f[m>>2]|0)+(y<<2)>>2]=f[b>>2];h=f[o>>2]|0;if((h|0)==(f[p>>2]|0))Ri(n,d);else{f[h>>2]=f[d>>2];f[o>>2]=h+4}h=f[g>>2]|0;x=f[d>>2]|0;b:do if(((x|0)!=-1?(z=(((x>>>0)%3|0|0)==0?2:-1)+x|0,(z|0)!=-1):0)?(A=f[(f[h+12>>2]|0)+(z<<2)>>2]|0,(A|0)!=-1):0){z=A+(((A>>>0)%3|0|0)==0?2:-1)|0;f[e>>2]=z;if((z|0)!=-1&(z|0)!=(x|0)){A=w;C=z;while(1){z=C+1|0;D=((z>>>0)%3|0|0)==0?C+-2|0:z;do if(f[(f[a>>2]|0)+(D>>>5<<2)>>2]&1<<(D&31)){z=A+1|0;f[b>>2]=A;E=f[j>>2]|0;if((E|0)==(f[k>>2]|0))Ri(i,b);else{f[E>>2]=A;f[j>>2]=E+4}E=f[o>>2]|0;if((E|0)==(f[p>>2]|0)){Ri(n,e);F=z;break}else{f[E>>2]=f[e>>2];f[o>>2]=E+4;F=z;break}}else F=A;while(0);f[(f[m>>2]|0)+(f[e>>2]<<2)>>2]=f[b>>2];G=f[g>>2]|0;D=f[e>>2]|0;if((D|0)==-1)break;z=(((D>>>0)%3|0|0)==0?2:-1)+D|0;if((z|0)==-1)break;D=f[(f[G+12>>2]|0)+(z<<2)>>2]|0;if((D|0)==-1)break;C=D+(((D>>>0)%3|0|0)==0?2:-1)|0;f[e>>2]=C;if(!((C|0)!=-1?(C|0)!=(f[d>>2]|0):0)){H=F;I=G;break b}else A=F}f[e>>2]=-1;H=F;I=G}else{H=w;I=h}}else J=26;while(0);if((J|0)==26){J=0;f[e>>2]=-1;H=w;I=h}t=H;v=I}r=r+1|0;if(r>>>0>=(f[v+28>>2]|0)-(f[v+24>>2]|0)>>2>>>0)break;else{q=t;s=v}}u=c;return}function nd(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0;c=u;u=u+16|0;d=c+8|0;e=c+4|0;g=c;h=a+124|0;f[h>>2]=(f[h>>2]|0)+1;h=a+88|0;i=a+120|0;j=f[i>>2]|0;k=j+1|0;do if((j|0)!=-1){l=((k>>>0)%3|0|0)==0?j+-2|0:k;if(!((j>>>0)%3|0)){m=j+2|0;n=l;break}else{m=j+-1|0;n=l;break}}else{m=-1;n=-1}while(0);k=a+104|0;l=a+92|0;o=f[l>>2]|0;p=o+(n<<2)|0;q=f[k>>2]|0;r=q+(f[p>>2]<<2)|0;s=f[r>>2]|0;switch(b|0){case 1:case 0:{f[r>>2]=s+-1;r=q+(f[o+(m<<2)>>2]<<2)|0;f[r>>2]=(f[r>>2]|0)+-1;if((b|0)==1){if((m|0)!=-1?(r=f[(f[(f[h>>2]|0)+12>>2]|0)+(m<<2)>>2]|0,(r|0)!=-1):0){t=a+64|0;v=1;w=r;while(1){r=f[t>>2]|0;x=f[(f[r>>2]|0)+36>>2]|0;f[e>>2]=(w>>>0)/3|0;f[d>>2]=f[e>>2];if(Ra[x&127](r,d)|0){y=v;break}r=w+1|0;x=((r>>>0)%3|0|0)==0?w+-2|0:r;if((x|0)==-1){z=12;break}w=f[(f[(f[h>>2]|0)+12>>2]|0)+(x<<2)>>2]|0;x=v+1|0;if((w|0)==-1){y=x;break}else v=x}if((z|0)==12)y=v+1|0;A=y;B=f[k>>2]|0;C=f[l>>2]|0}else{A=1;B=q;C=o}f[B+(f[C+(f[i>>2]<<2)>>2]<<2)>>2]=A;A=a+108|0;i=f[A>>2]|0;C=i-B>>2;B=i;if((n|0)!=-1?(i=f[(f[(f[h>>2]|0)+12>>2]|0)+(n<<2)>>2]|0,(i|0)!=-1):0){n=a+64|0;y=1;v=i;while(1){i=f[n>>2]|0;w=f[(f[i>>2]|0)+36>>2]|0;f[g>>2]=(v>>>0)/3|0;f[d>>2]=f[g>>2];if(Ra[w&127](i,d)|0){D=y;break}i=v+1|0;f[(f[l>>2]|0)+((((i>>>0)%3|0|0)==0?v+-2|0:i)<<2)>>2]=C;i=(((v>>>0)%3|0|0)==0?2:-1)+v|0;if((i|0)==-1){z=20;break}v=f[(f[(f[h>>2]|0)+12>>2]|0)+(i<<2)>>2]|0;i=y+1|0;if((v|0)==-1){D=i;break}else y=i}if((z|0)==20)D=y+1|0;E=D;F=f[A>>2]|0}else{E=1;F=B}f[d>>2]=E;if(F>>>0<(f[a+112>>2]|0)>>>0){f[F>>2]=E;f[A>>2]=F+4}else Ri(k,d)}break}case 5:{k=q+(f[o+(j<<2)>>2]<<2)|0;f[k>>2]=(f[k>>2]|0)+-1;k=q+(f[p>>2]<<2)|0;f[k>>2]=(f[k>>2]|0)+-1;k=q+(f[o+(m<<2)>>2]<<2)|0;f[k>>2]=(f[k>>2]|0)+-2;break}case 3:{k=q+(f[o+(j<<2)>>2]<<2)|0;f[k>>2]=(f[k>>2]|0)+-1;k=q+(f[p>>2]<<2)|0;f[k>>2]=(f[k>>2]|0)+-2;k=q+(f[o+(m<<2)>>2]<<2)|0;f[k>>2]=(f[k>>2]|0)+-1;break}case 7:{k=q+(f[o+(j<<2)>>2]<<2)|0;f[k>>2]=(f[k>>2]|0)+-2;k=q+(f[p>>2]<<2)|0;f[k>>2]=(f[k>>2]|0)+-2;k=q+(f[o+(m<<2)>>2]<<2)|0;f[k>>2]=(f[k>>2]|0)+-2;break}default:{}}k=a+116|0;m=f[k>>2]|0;if((m|0)==-1){f[k>>2]=b;u=c;return}o=f[a+128>>2]|0;if((s|0)<(o|0))G=o;else{q=f[a+132>>2]|0;G=(s|0)>(q|0)?q:s}s=G-o|0;o=f[a+136>>2]|0;a=f[3724+(m<<2)>>2]|0;f[d>>2]=a;m=o+(s*12|0)+4|0;G=f[m>>2]|0;if(G>>>0<(f[o+(s*12|0)+8>>2]|0)>>>0){f[G>>2]=a;f[m>>2]=G+4}else Ri(o+(s*12|0)|0,d);f[k>>2]=b;u=c;return}function od(a,b,c,d,e,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,Y=0,Z=0,_=0,$=0;g=u;u=u+32|0;d=g+16|0;h=g+8|0;i=g;j=e>>>0>1073741823?-1:e<<2;k=Lq(j)|0;sj(k|0,0,j|0)|0;j=f[a+28>>2]|0;l=a+36|0;m=f[l>>2]|0;n=f[m+4>>2]|0;o=f[m>>2]|0;p=n-o|0;a:do if((p|0)>4){q=p>>2;r=f[a+32>>2]|0;s=a+8|0;t=h+4|0;v=i+4|0;w=d+4|0;x=j+64|0;y=j+28|0;z=(e|0)>0;A=k+4|0;B=h+4|0;C=i+4|0;D=d+4|0;E=q+-1|0;if(n-o>>2>>>0>E>>>0){F=q;G=E;H=o}else{I=m;aq(I)}while(1){E=f[H+(G<<2)>>2]|0;q=X(G,e)|0;if((((E|0)!=-1?(f[(f[j>>2]|0)+(E>>>5<<2)>>2]&1<<(E&31)|0)==0:0)?(J=f[(f[(f[x>>2]|0)+12>>2]|0)+(E<<2)>>2]|0,(J|0)!=-1):0)?(E=f[y>>2]|0,K=f[r>>2]|0,L=f[K+(f[E+(J<<2)>>2]<<2)>>2]|0,M=J+1|0,N=f[K+(f[E+((((M>>>0)%3|0|0)==0?J+-2|0:M)<<2)>>2]<<2)>>2]|0,M=f[K+(f[E+((((J>>>0)%3|0|0)==0?2:-1)+J<<2)>>2]<<2)>>2]|0,(L|0)<(G|0)&(N|0)<(G|0)&(M|0)<(G|0)):0){J=X(L,e)|0;L=X(N,e)|0;N=X(M,e)|0;if(z){M=0;do{f[k+(M<<2)>>2]=(f[b+(M+N<<2)>>2]|0)+(f[b+(M+L<<2)>>2]|0)-(f[b+(M+J<<2)>>2]|0);M=M+1|0}while((M|0)!=(e|0))}M=b+(q<<2)|0;J=c+(q<<2)|0;L=f[M+4>>2]|0;N=f[k>>2]|0;E=f[A>>2]|0;f[h>>2]=f[M>>2];f[B>>2]=L;f[i>>2]=N;f[C>>2]=E;Od(d,s,h,i);f[J>>2]=f[d>>2];f[J+4>>2]=f[D>>2]}else{J=b+(q<<2)|0;E=b+((X(F+-2|0,e)|0)<<2)|0;N=c+(q<<2)|0;L=f[J+4>>2]|0;M=f[E>>2]|0;K=f[E+4>>2]|0;f[h>>2]=f[J>>2];f[t>>2]=L;f[i>>2]=M;f[v>>2]=K;Od(d,s,h,i);f[N>>2]=f[d>>2];f[N+4>>2]=f[w>>2]}if((F|0)<=2)break a;N=f[l>>2]|0;H=f[N>>2]|0;K=G+-1|0;if((f[N+4>>2]|0)-H>>2>>>0<=K>>>0){I=N;break}else{N=G;G=K;F=N}}aq(I)}while(0);if((e|0)<=0){O=a+8|0;P=b+4|0;Q=f[b>>2]|0;R=f[P>>2]|0;S=k+4|0;T=f[k>>2]|0;U=f[S>>2]|0;f[h>>2]=Q;V=h+4|0;f[V>>2]=R;f[i>>2]=T;W=i+4|0;f[W>>2]=U;Od(d,O,h,i);Y=f[d>>2]|0;f[c>>2]=Y;Z=d+4|0;_=f[Z>>2]|0;$=c+4|0;f[$>>2]=_;Mq(k);u=g;return 1}sj(k|0,0,e<<2|0)|0;O=a+8|0;P=b+4|0;Q=f[b>>2]|0;R=f[P>>2]|0;S=k+4|0;T=f[k>>2]|0;U=f[S>>2]|0;f[h>>2]=Q;V=h+4|0;f[V>>2]=R;f[i>>2]=T;W=i+4|0;f[W>>2]=U;Od(d,O,h,i);Y=f[d>>2]|0;f[c>>2]=Y;Z=d+4|0;_=f[Z>>2]|0;$=c+4|0;f[$>>2]=_;Mq(k);u=g;return 1}function pd(a,b,c,d,e,g,h){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;g=g|0;h=h|0;var i=0;switch(c|0){case 1:{c=ln(60)|0;f[c>>2]=1544;f[c+4>>2]=d;h=c+8|0;f[h>>2]=f[e>>2];f[h+4>>2]=f[e+4>>2];f[h+8>>2]=f[e+8>>2];f[h+12>>2]=f[e+12>>2];f[h+16>>2]=f[e+16>>2];f[h+20>>2]=f[e+20>>2];fk(c+32|0,e+24|0);h=c+44|0;f[h>>2]=f[g>>2];f[h+4>>2]=f[g+4>>2];f[h+8>>2]=f[g+8>>2];f[h+12>>2]=f[g+12>>2];f[c>>2]=2076;i=c;f[a>>2]=i;return}case 2:{c=ln(60)|0;f[c>>2]=1544;f[c+4>>2]=d;h=c+8|0;f[h>>2]=f[e>>2];f[h+4>>2]=f[e+4>>2];f[h+8>>2]=f[e+8>>2];f[h+12>>2]=f[e+12>>2];f[h+16>>2]=f[e+16>>2];f[h+20>>2]=f[e+20>>2];fk(c+32|0,e+24|0);h=c+44|0;f[h>>2]=f[g>>2];f[h+4>>2]=f[g+4>>2];f[h+8>>2]=f[g+8>>2];f[h+12>>2]=f[g+12>>2];f[c>>2]=2132;i=c;f[a>>2]=i;return}case 4:{c=ln(168)|0;Ti(c,d,e,g);i=c;f[a>>2]=i;return}case 3:{c=ln(88)|0;f[c>>2]=1544;f[c+4>>2]=d;h=c+8|0;f[h>>2]=f[e>>2];f[h+4>>2]=f[e+4>>2];f[h+8>>2]=f[e+8>>2];f[h+12>>2]=f[e+12>>2];f[h+16>>2]=f[e+16>>2];f[h+20>>2]=f[e+20>>2];fk(c+32|0,e+24|0);h=c+44|0;f[h>>2]=f[g>>2];f[h+4>>2]=f[g+4>>2];f[h+8>>2]=f[g+8>>2];f[h+12>>2]=f[g+12>>2];f[c>>2]=2188;h=c+60|0;f[h>>2]=0;f[h+4>>2]=0;f[h+8>>2]=0;f[h+12>>2]=0;f[h+16>>2]=0;f[h+20>>2]=0;f[h+24>>2]=0;i=c;f[a>>2]=i;return}case 5:{c=ln(104)|0;f[c>>2]=1544;f[c+4>>2]=d;h=c+8|0;f[h>>2]=f[e>>2];f[h+4>>2]=f[e+4>>2];f[h+8>>2]=f[e+8>>2];f[h+12>>2]=f[e+12>>2];f[h+16>>2]=f[e+16>>2];f[h+20>>2]=f[e+20>>2];fk(c+32|0,e+24|0);h=c+44|0;f[h>>2]=f[g>>2];f[h+4>>2]=f[g+4>>2];f[h+8>>2]=f[g+8>>2];f[h+12>>2]=f[g+12>>2];f[c>>2]=2244;f[c+60>>2]=0;f[c+64>>2]=0;f[c+76>>2]=0;f[c+80>>2]=0;f[c+84>>2]=0;h=c+88|0;f[h>>2]=f[g>>2];f[h+4>>2]=f[g+4>>2];f[h+8>>2]=f[g+8>>2];f[h+12>>2]=f[g+12>>2];i=c;f[a>>2]=i;return}case 6:{c=ln(140)|0;f[c>>2]=1544;f[c+4>>2]=d;d=c+8|0;f[d>>2]=f[e>>2];f[d+4>>2]=f[e+4>>2];f[d+8>>2]=f[e+8>>2];f[d+12>>2]=f[e+12>>2];f[d+16>>2]=f[e+16>>2];f[d+20>>2]=f[e+20>>2];fk(c+32|0,e+24|0);e=c+44|0;f[e>>2]=f[g>>2];f[e+4>>2]=f[g+4>>2];f[e+8>>2]=f[g+8>>2];f[e+12>>2]=f[g+12>>2];f[c>>2]=2300;f[c+64>>2]=0;f[c+68>>2]=0;e=c+72|0;f[e>>2]=f[g>>2];f[e+4>>2]=f[g+4>>2];f[e+8>>2]=f[g+8>>2];f[e+12>>2]=f[g+12>>2];f[c+60>>2]=2356;f[c+88>>2]=1;g=c+92|0;f[g>>2]=-1;f[g+4>>2]=-1;f[g+8>>2]=-1;f[g+12>>2]=-1;wn(c+108|0);i=c;f[a>>2]=i;return}default:{i=0;f[a>>2]=i;return}}}function qd(a,b,c,d,e,g,h){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;g=g|0;h=h|0;var i=0;switch(c|0){case 1:{c=ln(60)|0;f[c>>2]=1544;f[c+4>>2]=d;h=c+8|0;f[h>>2]=f[e>>2];f[h+4>>2]=f[e+4>>2];f[h+8>>2]=f[e+8>>2];f[h+12>>2]=f[e+12>>2];f[h+16>>2]=f[e+16>>2];f[h+20>>2]=f[e+20>>2];fk(c+32|0,e+24|0);h=c+44|0;f[h>>2]=f[g>>2];f[h+4>>2]=f[g+4>>2];f[h+8>>2]=f[g+8>>2];f[h+12>>2]=f[g+12>>2];f[c>>2]=1656;i=c;f[a>>2]=i;return}case 2:{c=ln(60)|0;f[c>>2]=1544;f[c+4>>2]=d;h=c+8|0;f[h>>2]=f[e>>2];f[h+4>>2]=f[e+4>>2];f[h+8>>2]=f[e+8>>2];f[h+12>>2]=f[e+12>>2];f[h+16>>2]=f[e+16>>2];f[h+20>>2]=f[e+20>>2];fk(c+32|0,e+24|0);h=c+44|0;f[h>>2]=f[g>>2];f[h+4>>2]=f[g+4>>2];f[h+8>>2]=f[g+8>>2];f[h+12>>2]=f[g+12>>2];f[c>>2]=1712;i=c;f[a>>2]=i;return}case 4:{c=ln(168)|0;Ui(c,d,e,g);i=c;f[a>>2]=i;return}case 3:{c=ln(88)|0;f[c>>2]=1544;f[c+4>>2]=d;h=c+8|0;f[h>>2]=f[e>>2];f[h+4>>2]=f[e+4>>2];f[h+8>>2]=f[e+8>>2];f[h+12>>2]=f[e+12>>2];f[h+16>>2]=f[e+16>>2];f[h+20>>2]=f[e+20>>2];fk(c+32|0,e+24|0);h=c+44|0;f[h>>2]=f[g>>2];f[h+4>>2]=f[g+4>>2];f[h+8>>2]=f[g+8>>2];f[h+12>>2]=f[g+12>>2];f[c>>2]=1768;h=c+60|0;f[h>>2]=0;f[h+4>>2]=0;f[h+8>>2]=0;f[h+12>>2]=0;f[h+16>>2]=0;f[h+20>>2]=0;f[h+24>>2]=0;i=c;f[a>>2]=i;return}case 5:{c=ln(104)|0;f[c>>2]=1544;f[c+4>>2]=d;h=c+8|0;f[h>>2]=f[e>>2];f[h+4>>2]=f[e+4>>2];f[h+8>>2]=f[e+8>>2];f[h+12>>2]=f[e+12>>2];f[h+16>>2]=f[e+16>>2];f[h+20>>2]=f[e+20>>2];fk(c+32|0,e+24|0);h=c+44|0;f[h>>2]=f[g>>2];f[h+4>>2]=f[g+4>>2];f[h+8>>2]=f[g+8>>2];f[h+12>>2]=f[g+12>>2];f[c>>2]=1824;f[c+60>>2]=0;f[c+64>>2]=0;f[c+76>>2]=0;f[c+80>>2]=0;f[c+84>>2]=0;h=c+88|0;f[h>>2]=f[g>>2];f[h+4>>2]=f[g+4>>2];f[h+8>>2]=f[g+8>>2];f[h+12>>2]=f[g+12>>2];i=c;f[a>>2]=i;return}case 6:{c=ln(140)|0;f[c>>2]=1544;f[c+4>>2]=d;d=c+8|0;f[d>>2]=f[e>>2];f[d+4>>2]=f[e+4>>2];f[d+8>>2]=f[e+8>>2];f[d+12>>2]=f[e+12>>2];f[d+16>>2]=f[e+16>>2];f[d+20>>2]=f[e+20>>2];fk(c+32|0,e+24|0);e=c+44|0;f[e>>2]=f[g>>2];f[e+4>>2]=f[g+4>>2];f[e+8>>2]=f[g+8>>2];f[e+12>>2]=f[g+12>>2];f[c>>2]=1880;f[c+64>>2]=0;f[c+68>>2]=0;e=c+72|0;f[e>>2]=f[g>>2];f[e+4>>2]=f[g+4>>2];f[e+8>>2]=f[g+8>>2];f[e+12>>2]=f[g+12>>2];f[c+60>>2]=1936;f[c+88>>2]=1;g=c+92|0;f[g>>2]=-1;f[g+4>>2]=-1;f[g+8>>2]=-1;f[g+12>>2]=-1;wn(c+108|0);i=c;f[a>>2]=i;return}default:{i=0;f[a>>2]=i;return}}}function rd(a,b){a=a|0;b=b|0;var c=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0;c=a+4|0;if(!b){e=f[a>>2]|0;f[a>>2]=0;if(e|0)Oq(e);f[c>>2]=0;return}if(b>>>0>1073741823){e=ra(8)|0;Oo(e,16035);f[e>>2]=7256;va(e|0,1112,110)}e=ln(b<<2)|0;g=f[a>>2]|0;f[a>>2]=e;if(g|0)Oq(g);f[c>>2]=b;c=0;do{f[(f[a>>2]|0)+(c<<2)>>2]=0;c=c+1|0}while((c|0)!=(b|0));c=a+8|0;g=f[c>>2]|0;if(!g)return;e=f[g+4>>2]|0;h=b+-1|0;i=(h&b|0)==0;if(!i)if(e>>>0<b>>>0)j=e;else j=(e>>>0)%(b>>>0)|0;else j=e&h;f[(f[a>>2]|0)+(j<<2)>>2]=c;c=f[g>>2]|0;if(!c)return;else{k=j;l=g;m=c;n=g}a:while(1){g=l;c=m;j=n;b:while(1){c:do if(i){e=c;while(1){o=f[e+4>>2]&h;if((o|0)==(k|0)){p=e;break c}q=(f[a>>2]|0)+(o<<2)|0;if(!(f[q>>2]|0)){r=e;s=o;t=q;break b}q=e+8|0;u=q+2|0;v=e+12|0;w=q+6|0;x=f[e>>2]|0;d:do if(!x)y=e;else{z=d[q>>1]|0;A=e;B=x;while(1){C=B+8|0;if(z<<16>>16!=(d[C>>1]|0)){y=A;break d}if((d[u>>1]|0)!=(d[C+2>>1]|0)){y=A;break d}if((d[v>>1]|0)!=(d[B+12>>1]|0)){y=A;break d}if((d[w>>1]|0)!=(d[C+6>>1]|0)){y=A;break d}C=f[B>>2]|0;if(!C){y=B;break}else{D=B;B=C;A=D}}}while(0);f[j>>2]=f[y>>2];f[y>>2]=f[f[(f[a>>2]|0)+(o<<2)>>2]>>2];f[f[(f[a>>2]|0)+(o<<2)>>2]>>2]=e;e=f[g>>2]|0;if(!e){E=43;break a}}}else{e=c;while(1){w=f[e+4>>2]|0;if(w>>>0<b>>>0)F=w;else F=(w>>>0)%(b>>>0)|0;if((F|0)==(k|0)){p=e;break c}w=(f[a>>2]|0)+(F<<2)|0;if(!(f[w>>2]|0)){r=e;s=F;t=w;break b}w=e+8|0;v=w+2|0;u=e+12|0;x=w+6|0;q=f[e>>2]|0;e:do if(!q)G=e;else{A=d[w>>1]|0;B=e;z=q;while(1){D=z+8|0;if(A<<16>>16!=(d[D>>1]|0)){G=B;break e}if((d[v>>1]|0)!=(d[D+2>>1]|0)){G=B;break e}if((d[u>>1]|0)!=(d[z+12>>1]|0)){G=B;break e}if((d[x>>1]|0)!=(d[D+6>>1]|0)){G=B;break e}D=f[z>>2]|0;if(!D){G=z;break}else{C=z;z=D;B=C}}}while(0);f[j>>2]=f[G>>2];f[G>>2]=f[f[(f[a>>2]|0)+(F<<2)>>2]>>2];f[f[(f[a>>2]|0)+(F<<2)>>2]>>2]=e;e=f[g>>2]|0;if(!e){E=43;break a}}}while(0);c=f[p>>2]|0;if(!c){E=43;break a}else{g=p;j=p}}f[t>>2]=j;m=f[r>>2]|0;if(!m){E=43;break}else{k=s;l=r;n=r}}if((E|0)==43)return}function sd(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0;d=a+4|0;if(!c){e=f[a>>2]|0;f[a>>2]=0;if(e|0)Oq(e);f[d>>2]=0;return}if(c>>>0>1073741823){e=ra(8)|0;Oo(e,16035);f[e>>2]=7256;va(e|0,1112,110)}e=ln(c<<2)|0;g=f[a>>2]|0;f[a>>2]=e;if(g|0)Oq(g);f[d>>2]=c;d=0;do{f[(f[a>>2]|0)+(d<<2)>>2]=0;d=d+1|0}while((d|0)!=(c|0));d=a+8|0;g=f[d>>2]|0;if(!g)return;e=f[g+4>>2]|0;h=c+-1|0;i=(h&c|0)==0;if(!i)if(e>>>0<c>>>0)j=e;else j=(e>>>0)%(c>>>0)|0;else j=e&h;f[(f[a>>2]|0)+(j<<2)>>2]=d;d=f[g>>2]|0;if(!d)return;else{k=j;l=g;m=d;n=g}a:while(1){g=l;d=m;j=n;b:while(1){c:do if(i){e=d;while(1){o=f[e+4>>2]&h;if((o|0)==(k|0)){p=e;break c}q=(f[a>>2]|0)+(o<<2)|0;if(!(f[q>>2]|0)){r=e;s=o;t=q;break b}q=e+8|0;u=q+1|0;v=q+2|0;w=q+3|0;x=f[e>>2]|0;d:do if(!x)y=e;else{z=b[q>>0]|0;A=e;B=x;while(1){C=B+8|0;if(z<<24>>24!=(b[C>>0]|0)){y=A;break d}if((b[u>>0]|0)!=(b[C+1>>0]|0)){y=A;break d}if((b[v>>0]|0)!=(b[C+2>>0]|0)){y=A;break d}if((b[w>>0]|0)!=(b[C+3>>0]|0)){y=A;break d}C=f[B>>2]|0;if(!C){y=B;break}else{D=B;B=C;A=D}}}while(0);f[j>>2]=f[y>>2];f[y>>2]=f[f[(f[a>>2]|0)+(o<<2)>>2]>>2];f[f[(f[a>>2]|0)+(o<<2)>>2]>>2]=e;e=f[g>>2]|0;if(!e){E=43;break a}}}else{e=d;while(1){w=f[e+4>>2]|0;if(w>>>0<c>>>0)F=w;else F=(w>>>0)%(c>>>0)|0;if((F|0)==(k|0)){p=e;break c}w=(f[a>>2]|0)+(F<<2)|0;if(!(f[w>>2]|0)){r=e;s=F;t=w;break b}w=e+8|0;v=w+1|0;u=w+2|0;x=w+3|0;q=f[e>>2]|0;e:do if(!q)G=e;else{A=b[w>>0]|0;B=e;z=q;while(1){D=z+8|0;if(A<<24>>24!=(b[D>>0]|0)){G=B;break e}if((b[v>>0]|0)!=(b[D+1>>0]|0)){G=B;break e}if((b[u>>0]|0)!=(b[D+2>>0]|0)){G=B;break e}if((b[x>>0]|0)!=(b[D+3>>0]|0)){G=B;break e}D=f[z>>2]|0;if(!D){G=z;break}else{C=z;z=D;B=C}}}while(0);f[j>>2]=f[G>>2];f[G>>2]=f[f[(f[a>>2]|0)+(F<<2)>>2]>>2];f[f[(f[a>>2]|0)+(F<<2)>>2]>>2]=e;e=f[g>>2]|0;if(!e){E=43;break a}}}while(0);d=f[p>>2]|0;if(!d){E=43;break a}else{g=p;j=p}}f[t>>2]=j;m=f[r>>2]|0;if(!m){E=43;break}else{k=s;l=r;n=r}}if((E|0)==43)return}function td(a,c,d,e,g){a=a|0;c=c|0;d=d|0;e=e|0;g=g|0;var i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,J=0,K=0,L=0,M=0,N=0;i=u;u=u+352|0;j=i+340|0;k=i+336|0;l=i+80|0;m=i+48|0;n=i;sj(l|0,0,256)|0;o=f[e+4>>2]|0;p=f[e>>2]|0;q=p;if((o|0)!=(p|0)){r=o-p>>2;p=0;do{o=l+(f[q+(p<<2)>>2]<<3)|0;s=o;t=Vn(f[s>>2]|0,f[s+4>>2]|0,1,0)|0;s=o;f[s>>2]=t;f[s+4>>2]=I;p=p+1|0}while(p>>>0<r>>>0)}Gn(m);r=Tn(c|0,((c|0)<0)<<31>>31|0,5)|0;p=I;q=n+40|0;s=q;f[s>>2]=0;f[s+4>>2]=0;f[n>>2]=0;f[n+4>>2]=0;f[n+8>>2]=0;f[n+12>>2]=0;f[n+16>>2]=0;f[n+20>>2]=0;fd(n,l,32,g)|0;l=n+16|0;s=Tn(f[l>>2]|0,f[l+4>>2]|0,1)|0;l=g+4|0;t=(f[l>>2]|0)-(f[g>>2]|0)|0;o=q;f[o>>2]=t;f[o+4>>2]=0;o=Vn(s|0,I|0,39,0)|0;s=Yn(o|0,I|0,3)|0;o=Vn(s|0,I|0,8,0)|0;s=Vn(o|0,I|0,t|0,0)|0;Cl(g,s,I);s=n+24|0;f[s>>2]=(f[g>>2]|0)+(f[q>>2]|0);q=n+28|0;f[q>>2]=0;t=n+32|0;f[t>>2]=16384;zi(m,r,p,0)|0;p=c-d|0;if((p|0)>-1){c=(d|0)>0;r=m+16|0;o=m+12|0;v=p;do{w=f[e>>2]|0;x=f[w+(((v|0)/(d|0)|0)<<2)>>2]|0;y=f[n>>2]|0;z=f[y+(x<<3)>>2]|0;A=f[t>>2]|0;B=z<<10;if(A>>>0<B>>>0){C=A;D=w}else{w=A;do{A=f[s>>2]|0;E=f[q>>2]|0;f[q>>2]=E+1;b[A+E>>0]=w;w=(f[t>>2]|0)>>>8;f[t>>2]=w}while(w>>>0>=B>>>0);C=w;D=f[e>>2]|0}f[t>>2]=(((C>>>0)/(z>>>0)|0)<<12)+((C>>>0)%(z>>>0)|0)+(f[y+(x<<3)+4>>2]|0);B=p-v|0;E=f[D+(((B|0)/(d|0)|0)<<2)>>2]|0;if(c&(E|0)>0){A=0;do{F=f[a+(A+B<<2)>>2]|0;G=r;H=f[G+4>>2]|0;if((H|0)>0|(H|0)==0&(f[G>>2]|0)>>>0>0){G=f[o>>2]|0;H=G+4|0;J=0;K=f[H>>2]|0;do{L=K>>>3;M=K&7;N=(f[G>>2]|0)+L|0;b[N>>0]=(1<<M^255)&(h[N>>0]|0);N=(f[G>>2]|0)+L|0;b[N>>0]=(F>>>J&1)<<M|(h[N>>0]|0);K=(f[H>>2]|0)+1|0;f[H>>2]=K;J=J+1|0}while((J|0)!=(E|0))}A=A+1|0}while((A|0)!=(d|0))}v=v-d|0}while((v|0)>-1)}_f(n,g);eg(m);v=f[m>>2]|0;d=m+4|0;o=g+16|0;r=f[o+4>>2]|0;if(!((r|0)>0|(r|0)==0&(f[o>>2]|0)>>>0>0)){o=(f[d>>2]|0)-v|0;f[k>>2]=f[l>>2];f[j>>2]=f[k>>2];Me(g,j,v,v+o|0)|0}o=f[n>>2]|0;if(o|0){v=n+4|0;n=f[v>>2]|0;if((n|0)!=(o|0))f[v>>2]=n+(~((n+-8-o|0)>>>3)<<3);Oq(o)}o=m+12|0;n=f[o>>2]|0;f[o>>2]=0;if(n|0)Oq(n);n=f[m>>2]|0;if(!n){u=i;return 1}if((f[d>>2]|0)!=(n|0))f[d>>2]=n;Oq(n);u=i;return 1}function ud(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0;c=a+4|0;if(!b){d=f[a>>2]|0;f[a>>2]=0;if(d|0)Oq(d);f[c>>2]=0;return}if(b>>>0>1073741823){d=ra(8)|0;Oo(d,16035);f[d>>2]=7256;va(d|0,1112,110)}d=ln(b<<2)|0;e=f[a>>2]|0;f[a>>2]=d;if(e|0)Oq(e);f[c>>2]=b;c=0;do{f[(f[a>>2]|0)+(c<<2)>>2]=0;c=c+1|0}while((c|0)!=(b|0));c=a+8|0;e=f[c>>2]|0;if(!e)return;d=f[e+4>>2]|0;g=b+-1|0;h=(g&b|0)==0;if(!h)if(d>>>0<b>>>0)i=d;else i=(d>>>0)%(b>>>0)|0;else i=d&g;f[(f[a>>2]|0)+(i<<2)>>2]=c;c=f[e>>2]|0;if(!c)return;else{j=i;k=e;l=c;m=e}a:while(1){e=k;c=l;i=m;b:while(1){c:do if(h){d=c;while(1){n=f[d+4>>2]&g;if((n|0)==(j|0)){o=d;break c}p=(f[a>>2]|0)+(n<<2)|0;if(!(f[p>>2]|0)){q=d;r=n;s=p;break b}p=d+12|0;t=d+16|0;u=d+20|0;v=f[d>>2]|0;d:do if(!v)w=d;else{x=f[d+8>>2]|0;y=d;z=v;while(1){if((x|0)!=(f[z+8>>2]|0)){w=y;break d}if((f[p>>2]|0)!=(f[z+12>>2]|0)){w=y;break d}if((f[t>>2]|0)!=(f[z+16>>2]|0)){w=y;break d}if((f[u>>2]|0)!=(f[z+20>>2]|0)){w=y;break d}A=f[z>>2]|0;if(!A){w=z;break}else{B=z;z=A;y=B}}}while(0);f[i>>2]=f[w>>2];f[w>>2]=f[f[(f[a>>2]|0)+(n<<2)>>2]>>2];f[f[(f[a>>2]|0)+(n<<2)>>2]>>2]=d;d=f[e>>2]|0;if(!d){C=43;break a}}}else{d=c;while(1){u=f[d+4>>2]|0;if(u>>>0<b>>>0)D=u;else D=(u>>>0)%(b>>>0)|0;if((D|0)==(j|0)){o=d;break c}u=(f[a>>2]|0)+(D<<2)|0;if(!(f[u>>2]|0)){q=d;r=D;s=u;break b}u=d+12|0;t=d+16|0;p=d+20|0;v=f[d>>2]|0;e:do if(!v)E=d;else{y=f[d+8>>2]|0;z=d;x=v;while(1){if((y|0)!=(f[x+8>>2]|0)){E=z;break e}if((f[u>>2]|0)!=(f[x+12>>2]|0)){E=z;break e}if((f[t>>2]|0)!=(f[x+16>>2]|0)){E=z;break e}if((f[p>>2]|0)!=(f[x+20>>2]|0)){E=z;break e}B=f[x>>2]|0;if(!B){E=x;break}else{A=x;x=B;z=A}}}while(0);f[i>>2]=f[E>>2];f[E>>2]=f[f[(f[a>>2]|0)+(D<<2)>>2]>>2];f[f[(f[a>>2]|0)+(D<<2)>>2]>>2]=d;d=f[e>>2]|0;if(!d){C=43;break a}}}while(0);c=f[o>>2]|0;if(!c){C=43;break a}else{e=o;i=o}}f[s>>2]=i;l=f[q>>2]|0;if(!l){C=43;break}else{j=r;k=q;m=q}}if((C|0)==43)return}function vd(a,b){a=a|0;b=b|0;var c=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0;c=a+4|0;if(!b){e=f[a>>2]|0;f[a>>2]=0;if(e|0)Oq(e);f[c>>2]=0;return}if(b>>>0>1073741823){e=ra(8)|0;Oo(e,16035);f[e>>2]=7256;va(e|0,1112,110)}e=ln(b<<2)|0;g=f[a>>2]|0;f[a>>2]=e;if(g|0)Oq(g);f[c>>2]=b;c=0;do{f[(f[a>>2]|0)+(c<<2)>>2]=0;c=c+1|0}while((c|0)!=(b|0));c=a+8|0;g=f[c>>2]|0;if(!g)return;e=f[g+4>>2]|0;h=b+-1|0;i=(h&b|0)==0;if(!i)if(e>>>0<b>>>0)j=e;else j=(e>>>0)%(b>>>0)|0;else j=e&h;f[(f[a>>2]|0)+(j<<2)>>2]=c;c=f[g>>2]|0;if(!c)return;else{k=j;l=g;m=c;n=g}a:while(1){g=l;c=m;j=n;b:while(1){c:do if(i){e=c;while(1){o=f[e+4>>2]&h;if((o|0)==(k|0)){p=e;break c}q=(f[a>>2]|0)+(o<<2)|0;if(!(f[q>>2]|0)){r=e;s=o;t=q;break b}q=e+8|0;u=e+12|0;v=f[e>>2]|0;d:do if(!v)w=e;else{x=d[q>>1]|0;y=q+2|0;z=e;A=v;while(1){B=A+8|0;if(x<<16>>16!=(d[B>>1]|0)){w=z;break d}if((d[y>>1]|0)!=(d[B+2>>1]|0)){w=z;break d}if((d[u>>1]|0)!=(d[A+12>>1]|0)){w=z;break d}B=f[A>>2]|0;if(!B){w=A;break}else{C=A;A=B;z=C}}}while(0);f[j>>2]=f[w>>2];f[w>>2]=f[f[(f[a>>2]|0)+(o<<2)>>2]>>2];f[f[(f[a>>2]|0)+(o<<2)>>2]>>2]=e;e=f[g>>2]|0;if(!e){D=41;break a}}}else{e=c;while(1){u=f[e+4>>2]|0;if(u>>>0<b>>>0)E=u;else E=(u>>>0)%(b>>>0)|0;if((E|0)==(k|0)){p=e;break c}u=(f[a>>2]|0)+(E<<2)|0;if(!(f[u>>2]|0)){r=e;s=E;t=u;break b}u=e+8|0;v=e+12|0;q=f[e>>2]|0;e:do if(!q)F=e;else{z=d[u>>1]|0;A=u+2|0;y=e;x=q;while(1){C=x+8|0;if(z<<16>>16!=(d[C>>1]|0)){F=y;break e}if((d[A>>1]|0)!=(d[C+2>>1]|0)){F=y;break e}if((d[v>>1]|0)!=(d[x+12>>1]|0)){F=y;break e}C=f[x>>2]|0;if(!C){F=x;break}else{B=x;x=C;y=B}}}while(0);f[j>>2]=f[F>>2];f[F>>2]=f[f[(f[a>>2]|0)+(E<<2)>>2]>>2];f[f[(f[a>>2]|0)+(E<<2)>>2]>>2]=e;e=f[g>>2]|0;if(!e){D=41;break a}}}while(0);c=f[p>>2]|0;if(!c){D=41;break a}else{g=p;j=p}}f[t>>2]=j;m=f[r>>2]|0;if(!m){D=41;break}else{k=s;l=r;n=r}}if((D|0)==41)return}function wd(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0;d=a+4|0;if(!c){e=f[a>>2]|0;f[a>>2]=0;if(e|0)Oq(e);f[d>>2]=0;return}if(c>>>0>1073741823){e=ra(8)|0;Oo(e,16035);f[e>>2]=7256;va(e|0,1112,110)}e=ln(c<<2)|0;g=f[a>>2]|0;f[a>>2]=e;if(g|0)Oq(g);f[d>>2]=c;d=0;do{f[(f[a>>2]|0)+(d<<2)>>2]=0;d=d+1|0}while((d|0)!=(c|0));d=a+8|0;g=f[d>>2]|0;if(!g)return;e=f[g+4>>2]|0;h=c+-1|0;i=(h&c|0)==0;if(!i)if(e>>>0<c>>>0)j=e;else j=(e>>>0)%(c>>>0)|0;else j=e&h;f[(f[a>>2]|0)+(j<<2)>>2]=d;d=f[g>>2]|0;if(!d)return;else{k=j;l=g;m=d;n=g}a:while(1){g=l;d=m;j=n;b:while(1){c:do if(i){e=d;while(1){o=f[e+4>>2]&h;if((o|0)==(k|0)){p=e;break c}q=(f[a>>2]|0)+(o<<2)|0;if(!(f[q>>2]|0)){r=e;s=o;t=q;break b}q=e+8|0;u=q+1|0;v=q+2|0;w=f[e>>2]|0;d:do if(!w)x=e;else{y=b[q>>0]|0;z=e;A=w;while(1){B=A+8|0;if(y<<24>>24!=(b[B>>0]|0)){x=z;break d}if((b[u>>0]|0)!=(b[B+1>>0]|0)){x=z;break d}if((b[v>>0]|0)!=(b[B+2>>0]|0)){x=z;break d}B=f[A>>2]|0;if(!B){x=A;break}else{C=A;A=B;z=C}}}while(0);f[j>>2]=f[x>>2];f[x>>2]=f[f[(f[a>>2]|0)+(o<<2)>>2]>>2];f[f[(f[a>>2]|0)+(o<<2)>>2]>>2]=e;e=f[g>>2]|0;if(!e){D=41;break a}}}else{e=d;while(1){v=f[e+4>>2]|0;if(v>>>0<c>>>0)E=v;else E=(v>>>0)%(c>>>0)|0;if((E|0)==(k|0)){p=e;break c}v=(f[a>>2]|0)+(E<<2)|0;if(!(f[v>>2]|0)){r=e;s=E;t=v;break b}v=e+8|0;u=v+1|0;w=v+2|0;q=f[e>>2]|0;e:do if(!q)F=e;else{z=b[v>>0]|0;A=e;y=q;while(1){C=y+8|0;if(z<<24>>24!=(b[C>>0]|0)){F=A;break e}if((b[u>>0]|0)!=(b[C+1>>0]|0)){F=A;break e}if((b[w>>0]|0)!=(b[C+2>>0]|0)){F=A;break e}C=f[y>>2]|0;if(!C){F=y;break}else{B=y;y=C;A=B}}}while(0);f[j>>2]=f[F>>2];f[F>>2]=f[f[(f[a>>2]|0)+(E<<2)>>2]>>2];f[f[(f[a>>2]|0)+(E<<2)>>2]>>2]=e;e=f[g>>2]|0;if(!e){D=41;break a}}}while(0);d=f[p>>2]|0;if(!d){D=41;break a}else{g=p;j=p}}f[t>>2]=j;m=f[r>>2]|0;if(!m){D=41;break}else{k=s;l=r;n=r}}if((D|0)==41)return}function xd(a,b){a=+a;b=+b;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,q=0,r=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0.0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0.0;p[s>>3]=a;c=f[s>>2]|0;d=f[s+4>>2]|0;p[s>>3]=b;e=f[s>>2]|0;g=f[s+4>>2]|0;h=Yn(c|0,d|0,52)|0;i=h&2047;h=Yn(e|0,g|0,52)|0;j=h&2047;h=d&-2147483648;k=Tn(e|0,g|0,1)|0;l=I;a:do if(!((k|0)==0&(l|0)==0)?(m=yo(b)|0,n=I&2147483647,!((i|0)==2047|(n>>>0>2146435072|(n|0)==2146435072&m>>>0>0))):0){m=Tn(c|0,d|0,1)|0;n=I;if(!(n>>>0>l>>>0|(n|0)==(l|0)&m>>>0>k>>>0))return +((m|0)==(k|0)&(n|0)==(l|0)?a*0.0:a);if(!i){n=Tn(c|0,d|0,12)|0;m=I;if((m|0)>-1|(m|0)==-1&n>>>0>4294967295){o=0;q=n;n=m;while(1){m=o+-1|0;q=Tn(q|0,n|0,1)|0;n=I;if(!((n|0)>-1|(n|0)==-1&q>>>0>4294967295)){r=m;break}else o=m}}else r=0;o=Tn(c|0,d|0,1-r|0)|0;t=r;u=o;v=I}else{t=i;u=c;v=d&1048575|1048576}if(!j){o=Tn(e|0,g|0,12)|0;q=I;if((q|0)>-1|(q|0)==-1&o>>>0>4294967295){n=0;m=o;o=q;while(1){q=n+-1|0;m=Tn(m|0,o|0,1)|0;o=I;if(!((o|0)>-1|(o|0)==-1&m>>>0>4294967295)){w=q;break}else n=q}}else w=0;n=Tn(e|0,g|0,1-w|0)|0;x=w;y=n;z=I}else{x=j;y=e;z=g&1048575|1048576}n=Xn(u|0,v|0,y|0,z|0)|0;m=I;o=(m|0)>-1|(m|0)==-1&n>>>0>4294967295;b:do if((t|0)>(x|0)){q=t;A=m;B=o;C=u;D=v;E=n;while(1){if(B)if((E|0)==0&(A|0)==0)break;else{F=E;G=A}else{F=C;G=D}H=Tn(F|0,G|0,1)|0;J=I;K=q+-1|0;L=Xn(H|0,J|0,y|0,z|0)|0;M=I;N=(M|0)>-1|(M|0)==-1&L>>>0>4294967295;if((K|0)>(x|0)){q=K;A=M;B=N;C=H;D=J;E=L}else{O=K;P=N;Q=L;R=M;S=H;T=J;break b}}U=a*0.0;break a}else{O=t;P=o;Q=n;R=m;S=u;T=v}while(0);if(P)if((Q|0)==0&(R|0)==0){U=a*0.0;break}else{V=R;W=Q}else{V=T;W=S}if(V>>>0<1048576|(V|0)==1048576&W>>>0<0){m=O;n=W;o=V;while(1){E=Tn(n|0,o|0,1)|0;D=I;C=m+-1|0;if(D>>>0<1048576|(D|0)==1048576&E>>>0<0){m=C;n=E;o=D}else{X=C;Y=E;Z=D;break}}}else{X=O;Y=W;Z=V}if((X|0)>0){o=Vn(Y|0,Z|0,0,-1048576)|0;n=I;m=Tn(X|0,0,52)|0;_=n|I;$=o|m}else{m=Yn(Y|0,Z|0,1-X|0)|0;_=I;$=m}f[s>>2]=$;f[s+4>>2]=_|h;U=+p[s>>3]}else aa=3;while(0);if((aa|0)==3){ba=a*b;U=ba/ba}return +U}function yd(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0;d=u;u=u+32|0;e=d+8|0;g=d;h=c+4|0;i=f[(f[h>>2]|0)+48>>2]|0;j=c+12|0;c=f[j>>2]|0;k=ln(32)|0;f[e>>2]=k;f[e+8>>2]=-2147483616;f[e+4>>2]=17;l=k;m=14495;n=l+17|0;do{b[l>>0]=b[m>>0]|0;l=l+1|0;m=m+1|0}while((l|0)<(n|0));b[k+17>>0]=0;k=i+16|0;m=f[k>>2]|0;if(m){l=k;n=m;a:while(1){m=n;while(1){if((f[m+16>>2]|0)>=(c|0))break;o=f[m+4>>2]|0;if(!o){p=l;break a}else m=o}n=f[m>>2]|0;if(!n){p=m;break}else l=m}if(((p|0)!=(k|0)?(c|0)>=(f[p+16>>2]|0):0)?(c=p+20|0,(Jh(c,e)|0)!=0):0)q=Hk(c,e,-1)|0;else r=10}else r=10;if((r|0)==10)q=Hk(i,e,-1)|0;if((b[e+11>>0]|0)<0)Oq(f[e>>2]|0);f[e>>2]=-1;f[e+4>>2]=-1;f[e+8>>2]=-1;f[e+12>>2]=-1;i=(_((1<<q)+-1|0)|0)^31;if((i+-1|0)>>>0<=28){f[e>>2]=i+1;q=2<<i;f[e+4>>2]=q+-1;i=q+-2|0;f[e+8>>2]=i;f[e+12>>2]=(i|0)/2|0}switch(Xi(f[j>>2]|0,f[h>>2]|0)|0){case 6:{i=f[j>>2]|0;q=f[h>>2]|0;c=f[(f[(f[q+4>>2]|0)+8>>2]|0)+(i<<2)>>2]|0;do if((Qa[f[(f[q>>2]|0)+8>>2]&127](q)|0)==1){Hf(g,q,6,i,e,514);p=f[g>>2]|0;if(!p){f[g>>2]=0;s=g;r=21;break}else{t=g;v=p;break}}else{s=g;r=21}while(0);if((r|0)==21){i=ln(24)|0;f[i+4>>2]=c;c=i+8|0;f[c>>2]=f[e>>2];f[c+4>>2]=f[e+4>>2];f[c+8>>2]=f[e+8>>2];f[c+12>>2]=f[e+12>>2];f[i>>2]=2560;c=i;f[g>>2]=c;t=s;v=c}f[a>>2]=v;f[t>>2]=0;u=d;return}case 0:{t=f[j>>2]|0;j=f[h>>2]|0;h=f[(f[(f[j+4>>2]|0)+8>>2]|0)+(t<<2)>>2]|0;do if((Qa[f[(f[j>>2]|0)+8>>2]&127](j)|0)==1){Hf(g,j,0,t,e,514);v=f[g>>2]|0;if(!v){f[g>>2]=0;w=g;r=28;break}else{x=g;y=v;break}}else{w=g;r=28}while(0);if((r|0)==28){r=ln(24)|0;f[r+4>>2]=h;h=r+8|0;f[h>>2]=f[e>>2];f[h+4>>2]=f[e+4>>2];f[h+8>>2]=f[e+8>>2];f[h+12>>2]=f[e+12>>2];f[r>>2]=2560;e=r;f[g>>2]=e;x=w;y=e}f[a>>2]=y;f[x>>2]=0;u=d;return}default:{f[a>>2]=0;u=d;return}}}function zd(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0;c=a+4|0;if(!b){d=f[a>>2]|0;f[a>>2]=0;if(d|0)Oq(d);f[c>>2]=0;return}if(b>>>0>1073741823){d=ra(8)|0;Oo(d,16035);f[d>>2]=7256;va(d|0,1112,110)}d=ln(b<<2)|0;e=f[a>>2]|0;f[a>>2]=d;if(e|0)Oq(e);f[c>>2]=b;c=0;do{f[(f[a>>2]|0)+(c<<2)>>2]=0;c=c+1|0}while((c|0)!=(b|0));c=a+8|0;e=f[c>>2]|0;if(!e)return;d=f[e+4>>2]|0;g=b+-1|0;h=(g&b|0)==0;if(!h)if(d>>>0<b>>>0)i=d;else i=(d>>>0)%(b>>>0)|0;else i=d&g;f[(f[a>>2]|0)+(i<<2)>>2]=c;c=f[e>>2]|0;if(!c)return;else{j=i;k=e;l=c;m=e}a:while(1){e=k;c=l;i=m;b:while(1){c:do if(h){d=c;while(1){n=f[d+4>>2]&g;if((n|0)==(j|0)){o=d;break c}p=(f[a>>2]|0)+(n<<2)|0;if(!(f[p>>2]|0)){q=d;r=n;s=p;break b}p=d+12|0;t=d+16|0;u=f[d>>2]|0;d:do if(!u)v=d;else{w=f[d+8>>2]|0;x=d;y=u;while(1){if((w|0)!=(f[y+8>>2]|0)){v=x;break d}if((f[p>>2]|0)!=(f[y+12>>2]|0)){v=x;break d}if((f[t>>2]|0)!=(f[y+16>>2]|0)){v=x;break d}z=f[y>>2]|0;if(!z){v=y;break}else{A=y;y=z;x=A}}}while(0);f[i>>2]=f[v>>2];f[v>>2]=f[f[(f[a>>2]|0)+(n<<2)>>2]>>2];f[f[(f[a>>2]|0)+(n<<2)>>2]>>2]=d;d=f[e>>2]|0;if(!d){B=41;break a}}}else{d=c;while(1){t=f[d+4>>2]|0;if(t>>>0<b>>>0)C=t;else C=(t>>>0)%(b>>>0)|0;if((C|0)==(j|0)){o=d;break c}t=(f[a>>2]|0)+(C<<2)|0;if(!(f[t>>2]|0)){q=d;r=C;s=t;break b}t=d+12|0;p=d+16|0;u=f[d>>2]|0;e:do if(!u)D=d;else{x=f[d+8>>2]|0;y=d;w=u;while(1){if((x|0)!=(f[w+8>>2]|0)){D=y;break e}if((f[t>>2]|0)!=(f[w+12>>2]|0)){D=y;break e}if((f[p>>2]|0)!=(f[w+16>>2]|0)){D=y;break e}A=f[w>>2]|0;if(!A){D=w;break}else{z=w;w=A;y=z}}}while(0);f[i>>2]=f[D>>2];f[D>>2]=f[f[(f[a>>2]|0)+(C<<2)>>2]>>2];f[f[(f[a>>2]|0)+(C<<2)>>2]>>2]=d;d=f[e>>2]|0;if(!d){B=41;break a}}}while(0);c=f[o>>2]|0;if(!c){B=41;break a}else{e=o;i=o}}f[s>>2]=i;l=f[q>>2]|0;if(!l){B=41;break}else{j=r;k=q;m=q}}if((B|0)==41)return}function Ad(a,b,c,d,e,g,h){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;g=g|0;h=h|0;var i=0,j=0;switch(c|0){case 1:{c=ln(40)|0;f[c+4>>2]=d;h=c+8|0;f[h>>2]=f[e>>2];f[h+4>>2]=f[e+4>>2];f[h+8>>2]=f[e+8>>2];f[h+12>>2]=f[e+12>>2];h=c+24|0;f[h>>2]=f[g>>2];f[h+4>>2]=f[g+4>>2];f[h+8>>2]=f[g+8>>2];f[h+12>>2]=f[g+12>>2];f[c>>2]=2980;i=c;f[a>>2]=i;return}case 2:{c=ln(40)|0;f[c+4>>2]=d;h=c+8|0;f[h>>2]=f[e>>2];f[h+4>>2]=f[e+4>>2];f[h+8>>2]=f[e+8>>2];f[h+12>>2]=f[e+12>>2];h=c+24|0;f[h>>2]=f[g>>2];f[h+4>>2]=f[g+4>>2];f[h+8>>2]=f[g+8>>2];f[h+12>>2]=f[g+12>>2];f[c>>2]=3036;i=c;f[a>>2]=i;return}case 4:{c=ln(152)|0;f[c+4>>2]=d;h=c+8|0;f[h>>2]=f[e>>2];f[h+4>>2]=f[e+4>>2];f[h+8>>2]=f[e+8>>2];f[h+12>>2]=f[e+12>>2];h=c+24|0;f[h>>2]=f[g>>2];f[h+4>>2]=f[g+4>>2];f[h+8>>2]=f[g+8>>2];f[h+12>>2]=f[g+12>>2];f[c>>2]=3092;h=c+96|0;b=c+40|0;j=b+52|0;do{f[b>>2]=0;b=b+4|0}while((b|0)<(j|0));Zm(h);f[c+136>>2]=0;f[c+140>>2]=0;f[c+144>>2]=0;i=c;f[a>>2]=i;return}case 3:{c=ln(68)|0;f[c+4>>2]=d;h=c+8|0;f[h>>2]=f[e>>2];f[h+4>>2]=f[e+4>>2];f[h+8>>2]=f[e+8>>2];f[h+12>>2]=f[e+12>>2];h=c+24|0;f[h>>2]=f[g>>2];f[h+4>>2]=f[g+4>>2];f[h+8>>2]=f[g+8>>2];f[h+12>>2]=f[g+12>>2];f[c>>2]=3148;h=c+40|0;f[h>>2]=0;f[h+4>>2]=0;f[h+8>>2]=0;f[h+12>>2]=0;f[h+16>>2]=0;f[h+20>>2]=0;f[h+24>>2]=0;i=c;f[a>>2]=i;return}case 5:{c=ln(84)|0;f[c+4>>2]=d;h=c+8|0;f[h>>2]=f[e>>2];f[h+4>>2]=f[e+4>>2];f[h+8>>2]=f[e+8>>2];f[h+12>>2]=f[e+12>>2];h=c+24|0;f[h>>2]=f[g>>2];f[h+4>>2]=f[g+4>>2];f[h+8>>2]=f[g+8>>2];f[h+12>>2]=f[g+12>>2];f[c>>2]=3204;f[c+40>>2]=0;f[c+44>>2]=0;f[c+56>>2]=0;f[c+60>>2]=0;f[c+64>>2]=0;h=c+68|0;f[h>>2]=f[g>>2];f[h+4>>2]=f[g+4>>2];f[h+8>>2]=f[g+8>>2];f[h+12>>2]=f[g+12>>2];i=c;f[a>>2]=i;return}case 6:{c=ln(120)|0;f[c+4>>2]=d;d=c+8|0;f[d>>2]=f[e>>2];f[d+4>>2]=f[e+4>>2];f[d+8>>2]=f[e+8>>2];f[d+12>>2]=f[e+12>>2];e=c+24|0;f[e>>2]=f[g>>2];f[e+4>>2]=f[g+4>>2];f[e+8>>2]=f[g+8>>2];f[e+12>>2]=f[g+12>>2];f[c>>2]=3260;f[c+44>>2]=0;f[c+48>>2]=0;e=c+52|0;f[e>>2]=f[g>>2];f[e+4>>2]=f[g+4>>2];f[e+8>>2]=f[g+8>>2];f[e+12>>2]=f[g+12>>2];f[c+40>>2]=3316;f[c+68>>2]=1;g=c+72|0;f[g>>2]=-1;f[g+4>>2]=-1;f[g+8>>2]=-1;f[g+12>>2]=-1;wn(c+88|0);i=c;f[a>>2]=i;return}default:{i=0;f[a>>2]=i;return}}}function Bd(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0;d=a+4|0;if(!c){e=f[a>>2]|0;f[a>>2]=0;if(e|0)Oq(e);f[d>>2]=0;return}if(c>>>0>1073741823){e=ra(8)|0;Oo(e,16035);f[e>>2]=7256;va(e|0,1112,110)}e=ln(c<<2)|0;g=f[a>>2]|0;f[a>>2]=e;if(g|0)Oq(g);f[d>>2]=c;d=0;do{f[(f[a>>2]|0)+(d<<2)>>2]=0;d=d+1|0}while((d|0)!=(c|0));d=a+8|0;g=f[d>>2]|0;if(!g)return;e=f[g+4>>2]|0;h=c+-1|0;i=(h&c|0)==0;if(!i)if(e>>>0<c>>>0)j=e;else j=(e>>>0)%(c>>>0)|0;else j=e&h;f[(f[a>>2]|0)+(j<<2)>>2]=d;d=f[g>>2]|0;if(!d)return;else{k=j;l=g;m=d;n=g}a:while(1){g=l;d=m;j=n;b:while(1){o=d;while(1){e=f[o+4>>2]|0;if(!i)if(e>>>0<c>>>0)p=e;else p=(e>>>0)%(c>>>0)|0;else p=e&h;if((p|0)==(k|0))break;q=(f[a>>2]|0)+(p<<2)|0;if(!(f[q>>2]|0))break b;e=f[o>>2]|0;c:do if(!e)r=o;else{s=o+8|0;t=b[s+11>>0]|0;u=t<<24>>24<0;v=t&255;t=u?f[o+12>>2]|0:v;w=(t|0)==0;if(u){u=o;x=e;while(1){y=x+8|0;z=b[y+11>>0]|0;A=z<<24>>24<0;if((t|0)!=((A?f[x+12>>2]|0:z&255)|0)){r=u;break c}if(!w?Vk(f[s>>2]|0,A?f[y>>2]|0:y,t)|0:0){r=u;break c}y=f[x>>2]|0;if(!y){r=x;break c}else{A=x;x=y;u=A}}}if(w){u=o;x=e;while(1){A=b[x+8+11>>0]|0;if((A<<24>>24<0?f[x+12>>2]|0:A&255)|0){r=u;break c}A=f[x>>2]|0;if(!A){r=x;break c}else{y=x;x=A;u=y}}}u=o;x=e;while(1){w=x+8|0;y=b[w+11>>0]|0;A=y<<24>>24<0;if((t|0)!=((A?f[x+12>>2]|0:y&255)|0)){r=u;break c}y=A?f[w>>2]|0:w;if((b[y>>0]|0)==(f[s>>2]&255)<<24>>24){B=s;C=v;D=y}else{r=u;break c}while(1){C=C+-1|0;B=B+1|0;if(!C)break;D=D+1|0;if((b[B>>0]|0)!=(b[D>>0]|0)){r=u;break c}}y=f[x>>2]|0;if(!y){r=x;break}else{w=x;x=y;u=w}}}while(0);f[j>>2]=f[r>>2];f[r>>2]=f[f[(f[a>>2]|0)+(p<<2)>>2]>>2];f[f[(f[a>>2]|0)+(p<<2)>>2]>>2]=o;e=f[g>>2]|0;if(!e){E=43;break a}else o=e}d=f[o>>2]|0;if(!d){E=43;break a}else{g=o;j=o}}f[q>>2]=j;m=f[o>>2]|0;if(!m){E=43;break}else{k=p;l=o;n=o}}if((E|0)==43)return}function Cd(a,b,c,d,e,g,h){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;g=g|0;h=h|0;var i=0,j=0;switch(c|0){case 1:{c=ln(40)|0;f[c+4>>2]=d;h=c+8|0;f[h>>2]=f[e>>2];f[h+4>>2]=f[e+4>>2];f[h+8>>2]=f[e+8>>2];f[h+12>>2]=f[e+12>>2];h=c+24|0;f[h>>2]=f[g>>2];f[h+4>>2]=f[g+4>>2];f[h+8>>2]=f[g+8>>2];f[h+12>>2]=f[g+12>>2];f[c>>2]=2616;i=c;f[a>>2]=i;return}case 2:{c=ln(40)|0;f[c+4>>2]=d;h=c+8|0;f[h>>2]=f[e>>2];f[h+4>>2]=f[e+4>>2];f[h+8>>2]=f[e+8>>2];f[h+12>>2]=f[e+12>>2];h=c+24|0;f[h>>2]=f[g>>2];f[h+4>>2]=f[g+4>>2];f[h+8>>2]=f[g+8>>2];f[h+12>>2]=f[g+12>>2];f[c>>2]=2672;i=c;f[a>>2]=i;return}case 4:{c=ln(152)|0;f[c+4>>2]=d;h=c+8|0;f[h>>2]=f[e>>2];f[h+4>>2]=f[e+4>>2];f[h+8>>2]=f[e+8>>2];f[h+12>>2]=f[e+12>>2];h=c+24|0;f[h>>2]=f[g>>2];f[h+4>>2]=f[g+4>>2];f[h+8>>2]=f[g+8>>2];f[h+12>>2]=f[g+12>>2];f[c>>2]=2728;h=c+96|0;b=c+40|0;j=b+52|0;do{f[b>>2]=0;b=b+4|0}while((b|0)<(j|0));Zm(h);f[c+136>>2]=0;f[c+140>>2]=0;f[c+144>>2]=0;i=c;f[a>>2]=i;return}case 3:{c=ln(68)|0;f[c+4>>2]=d;h=c+8|0;f[h>>2]=f[e>>2];f[h+4>>2]=f[e+4>>2];f[h+8>>2]=f[e+8>>2];f[h+12>>2]=f[e+12>>2];h=c+24|0;f[h>>2]=f[g>>2];f[h+4>>2]=f[g+4>>2];f[h+8>>2]=f[g+8>>2];f[h+12>>2]=f[g+12>>2];f[c>>2]=2784;h=c+40|0;f[h>>2]=0;f[h+4>>2]=0;f[h+8>>2]=0;f[h+12>>2]=0;f[h+16>>2]=0;f[h+20>>2]=0;f[h+24>>2]=0;i=c;f[a>>2]=i;return}case 5:{c=ln(84)|0;f[c+4>>2]=d;h=c+8|0;f[h>>2]=f[e>>2];f[h+4>>2]=f[e+4>>2];f[h+8>>2]=f[e+8>>2];f[h+12>>2]=f[e+12>>2];h=c+24|0;f[h>>2]=f[g>>2];f[h+4>>2]=f[g+4>>2];f[h+8>>2]=f[g+8>>2];f[h+12>>2]=f[g+12>>2];f[c>>2]=2840;f[c+40>>2]=0;f[c+44>>2]=0;f[c+56>>2]=0;f[c+60>>2]=0;f[c+64>>2]=0;h=c+68|0;f[h>>2]=f[g>>2];f[h+4>>2]=f[g+4>>2];f[h+8>>2]=f[g+8>>2];f[h+12>>2]=f[g+12>>2];i=c;f[a>>2]=i;return}case 6:{c=ln(120)|0;f[c+4>>2]=d;d=c+8|0;f[d>>2]=f[e>>2];f[d+4>>2]=f[e+4>>2];f[d+8>>2]=f[e+8>>2];f[d+12>>2]=f[e+12>>2];e=c+24|0;f[e>>2]=f[g>>2];f[e+4>>2]=f[g+4>>2];f[e+8>>2]=f[g+8>>2];f[e+12>>2]=f[g+12>>2];f[c>>2]=2896;f[c+44>>2]=0;f[c+48>>2]=0;e=c+52|0;f[e>>2]=f[g>>2];f[e+4>>2]=f[g+4>>2];f[e+8>>2]=f[g+8>>2];f[e+12>>2]=f[g+12>>2];f[c+40>>2]=2952;f[c+68>>2]=1;g=c+72|0;f[g>>2]=-1;f[g+4>>2]=-1;f[g+8>>2]=-1;f[g+12>>2]=-1;wn(c+88|0);i=c;f[a>>2]=i;return}default:{i=0;f[a>>2]=i;return}}}function Dd(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;c=u;u=u+48|0;d=c+8|0;e=c+4|0;g=c;h=a+44|0;ci(f[h>>2]|0,b)|0;if(f[h>>2]|0){wn(d);tk(d);i=(f[h>>2]|0)+-1|0;if((i|0)>-1){h=a+40|0;j=i;do{fj(d,(f[(f[h>>2]|0)+(j>>>5<<2)>>2]&1<<(j&31)|0)!=0);j=j+-1|0}while((j|0)>-1)}ld(d,b);Fj(d)}j=a+56|0;ci(f[j>>2]|0,b)|0;if(f[j>>2]|0){wn(d);tk(d);h=(f[j>>2]|0)+-2|0;if((h|0)>-1){j=a+52|0;i=h;do{fj(d,(f[(f[j>>2]|0)+(i>>>5<<2)>>2]&1<<(i&31)|0)!=0);h=i+1|0;fj(d,(f[(f[j>>2]|0)+(h>>>5<<2)>>2]&1<<(h&31)|0)!=0);i=i+-2|0}while((i|0)>-1)}ld(d,b);Fj(d)}i=a+68|0;ci(f[i>>2]|0,b)|0;if(f[i>>2]|0){wn(d);tk(d);j=(f[i>>2]|0)+-3|0;if((j|0)>-1){i=a+64|0;h=j;do{fj(d,(f[(f[i>>2]|0)+(h>>>5<<2)>>2]&1<<(h&31)|0)!=0);j=h+1|0;fj(d,(f[(f[i>>2]|0)+(j>>>5<<2)>>2]&1<<(j&31)|0)!=0);j=h+2|0;fj(d,(f[(f[i>>2]|0)+(j>>>5<<2)>>2]&1<<(j&31)|0)!=0);h=h+-3|0}while((h|0)>-1)}ld(d,b);Fj(d)}h=a+80|0;ci(f[h>>2]|0,b)|0;if(f[h>>2]|0){wn(d);tk(d);i=(f[h>>2]|0)+-4|0;if((i|0)>-1){h=a+76|0;j=i;do{fj(d,(f[(f[h>>2]|0)+(j>>>5<<2)>>2]&1<<(j&31)|0)!=0);i=j+1|0;fj(d,(f[(f[h>>2]|0)+(i>>>5<<2)>>2]&1<<(i&31)|0)!=0);i=j+2|0;fj(d,(f[(f[h>>2]|0)+(i>>>5<<2)>>2]&1<<(i&31)|0)!=0);i=j+3|0;fj(d,(f[(f[h>>2]|0)+(i>>>5<<2)>>2]&1<<(i&31)|0)!=0);j=j+-4|0}while((j|0)>-1)}ld(d,b);Fj(d)}f[g>>2]=f[a+12>>2];j=b+16|0;h=j;i=f[h>>2]|0;k=f[h+4>>2]|0;if((k|0)>0|(k|0)==0&i>>>0>0){l=k;m=i}else{f[e>>2]=f[b+4>>2];f[d>>2]=f[e>>2];Me(b,d,g,g+4|0)|0;i=j;l=f[i+4>>2]|0;m=f[i>>2]|0}f[g>>2]=f[a+20>>2];if((l|0)>0|(l|0)==0&m>>>0>0){u=c;return 1}f[e>>2]=f[b+4>>2];f[d>>2]=f[e>>2];Me(b,d,g,g+4|0)|0;u=c;return 1}function Ed(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;c=u;u=u+48|0;d=c+8|0;e=c+4|0;g=c;h=a+64|0;ci(f[h>>2]|0,b)|0;if(f[h>>2]|0){wn(d);tk(d);i=(f[h>>2]|0)+-1|0;if((i|0)>-1){h=a+60|0;j=i;do{fj(d,(f[(f[h>>2]|0)+(j>>>5<<2)>>2]&1<<(j&31)|0)!=0);j=j+-1|0}while((j|0)>-1)}ld(d,b);Fj(d)}j=a+76|0;ci(f[j>>2]|0,b)|0;if(f[j>>2]|0){wn(d);tk(d);h=(f[j>>2]|0)+-2|0;if((h|0)>-1){j=a+72|0;i=h;do{fj(d,(f[(f[j>>2]|0)+(i>>>5<<2)>>2]&1<<(i&31)|0)!=0);h=i+1|0;fj(d,(f[(f[j>>2]|0)+(h>>>5<<2)>>2]&1<<(h&31)|0)!=0);i=i+-2|0}while((i|0)>-1)}ld(d,b);Fj(d)}i=a+88|0;ci(f[i>>2]|0,b)|0;if(f[i>>2]|0){wn(d);tk(d);j=(f[i>>2]|0)+-3|0;if((j|0)>-1){i=a+84|0;h=j;do{fj(d,(f[(f[i>>2]|0)+(h>>>5<<2)>>2]&1<<(h&31)|0)!=0);j=h+1|0;fj(d,(f[(f[i>>2]|0)+(j>>>5<<2)>>2]&1<<(j&31)|0)!=0);j=h+2|0;fj(d,(f[(f[i>>2]|0)+(j>>>5<<2)>>2]&1<<(j&31)|0)!=0);h=h+-3|0}while((h|0)>-1)}ld(d,b);Fj(d)}h=a+100|0;ci(f[h>>2]|0,b)|0;if(f[h>>2]|0){wn(d);tk(d);i=(f[h>>2]|0)+-4|0;if((i|0)>-1){h=a+96|0;j=i;do{fj(d,(f[(f[h>>2]|0)+(j>>>5<<2)>>2]&1<<(j&31)|0)!=0);i=j+1|0;fj(d,(f[(f[h>>2]|0)+(i>>>5<<2)>>2]&1<<(i&31)|0)!=0);i=j+2|0;fj(d,(f[(f[h>>2]|0)+(i>>>5<<2)>>2]&1<<(i&31)|0)!=0);i=j+3|0;fj(d,(f[(f[h>>2]|0)+(i>>>5<<2)>>2]&1<<(i&31)|0)!=0);j=j+-4|0}while((j|0)>-1)}ld(d,b);Fj(d)}f[g>>2]=f[a+12>>2];j=b+16|0;h=j;i=f[h>>2]|0;k=f[h+4>>2]|0;if((k|0)>0|(k|0)==0&i>>>0>0){l=k;m=i}else{f[e>>2]=f[b+4>>2];f[d>>2]=f[e>>2];Me(b,d,g,g+4|0)|0;i=j;l=f[i+4>>2]|0;m=f[i>>2]|0}f[g>>2]=f[a+16>>2];if((l|0)>0|(l|0)==0&m>>>0>0){u=c;return 1}f[e>>2]=f[b+4>>2];f[d>>2]=f[e>>2];Me(b,d,g,g+4|0)|0;u=c;return 1}function Fd(a,b){a=a|0;b=b|0;var c=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0;c=a+4|0;if(!b){e=f[a>>2]|0;f[a>>2]=0;if(e|0)Oq(e);f[c>>2]=0;return}if(b>>>0>1073741823){e=ra(8)|0;Oo(e,16035);f[e>>2]=7256;va(e|0,1112,110)}e=ln(b<<2)|0;g=f[a>>2]|0;f[a>>2]=e;if(g|0)Oq(g);f[c>>2]=b;c=0;do{f[(f[a>>2]|0)+(c<<2)>>2]=0;c=c+1|0}while((c|0)!=(b|0));c=a+8|0;g=f[c>>2]|0;if(!g)return;e=f[g+4>>2]|0;h=b+-1|0;i=(h&b|0)==0;if(!i)if(e>>>0<b>>>0)j=e;else j=(e>>>0)%(b>>>0)|0;else j=e&h;f[(f[a>>2]|0)+(j<<2)>>2]=c;c=f[g>>2]|0;if(!c)return;else{k=j;l=g;m=c;n=g}a:while(1){g=l;c=m;j=n;b:while(1){c:do if(i){e=c;while(1){o=f[e+4>>2]&h;if((o|0)==(k|0)){p=e;break c}q=(f[a>>2]|0)+(o<<2)|0;if(!(f[q>>2]|0)){r=e;s=o;t=q;break b}q=e+8|0;u=f[e>>2]|0;d:do if(!u)v=e;else{w=d[q>>1]|0;x=q+2|0;y=e;z=u;while(1){A=z+8|0;if(w<<16>>16!=(d[A>>1]|0)){v=y;break d}if((d[x>>1]|0)!=(d[A+2>>1]|0)){v=y;break d}A=f[z>>2]|0;if(!A){v=z;break}else{B=z;z=A;y=B}}}while(0);f[j>>2]=f[v>>2];f[v>>2]=f[f[(f[a>>2]|0)+(o<<2)>>2]>>2];f[f[(f[a>>2]|0)+(o<<2)>>2]>>2]=e;e=f[g>>2]|0;if(!e){C=39;break a}}}else{e=c;while(1){u=f[e+4>>2]|0;if(u>>>0<b>>>0)D=u;else D=(u>>>0)%(b>>>0)|0;if((D|0)==(k|0)){p=e;break c}u=(f[a>>2]|0)+(D<<2)|0;if(!(f[u>>2]|0)){r=e;s=D;t=u;break b}u=e+8|0;q=f[e>>2]|0;e:do if(!q)E=e;else{y=d[u>>1]|0;z=u+2|0;x=e;w=q;while(1){B=w+8|0;if(y<<16>>16!=(d[B>>1]|0)){E=x;break e}if((d[z>>1]|0)!=(d[B+2>>1]|0)){E=x;break e}B=f[w>>2]|0;if(!B){E=w;break}else{A=w;w=B;x=A}}}while(0);f[j>>2]=f[E>>2];f[E>>2]=f[f[(f[a>>2]|0)+(D<<2)>>2]>>2];f[f[(f[a>>2]|0)+(D<<2)>>2]>>2]=e;e=f[g>>2]|0;if(!e){C=39;break a}}}while(0);c=f[p>>2]|0;if(!c){C=39;break a}else{g=p;j=p}}f[t>>2]=j;m=f[r>>2]|0;if(!m){C=39;break}else{k=s;l=r;n=r}}if((C|0)==39)return}function Gd(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0;d=a+4|0;if(!c){e=f[a>>2]|0;f[a>>2]=0;if(e|0)Oq(e);f[d>>2]=0;return}if(c>>>0>1073741823){e=ra(8)|0;Oo(e,16035);f[e>>2]=7256;va(e|0,1112,110)}e=ln(c<<2)|0;g=f[a>>2]|0;f[a>>2]=e;if(g|0)Oq(g);f[d>>2]=c;d=0;do{f[(f[a>>2]|0)+(d<<2)>>2]=0;d=d+1|0}while((d|0)!=(c|0));d=a+8|0;g=f[d>>2]|0;if(!g)return;e=f[g+4>>2]|0;h=c+-1|0;i=(h&c|0)==0;if(!i)if(e>>>0<c>>>0)j=e;else j=(e>>>0)%(c>>>0)|0;else j=e&h;f[(f[a>>2]|0)+(j<<2)>>2]=d;d=f[g>>2]|0;if(!d)return;else{k=j;l=g;m=d;n=g}a:while(1){g=l;d=m;j=n;b:while(1){c:do if(i){e=d;while(1){o=f[e+4>>2]&h;if((o|0)==(k|0)){p=e;break c}q=(f[a>>2]|0)+(o<<2)|0;if(!(f[q>>2]|0)){r=e;s=o;t=q;break b}q=e+8|0;u=f[e>>2]|0;d:do if(!u)v=e;else{w=b[q>>0]|0;x=q+1|0;y=e;z=u;while(1){A=z+8|0;if(w<<24>>24!=(b[A>>0]|0)){v=y;break d}if((b[x>>0]|0)!=(b[A+1>>0]|0)){v=y;break d}A=f[z>>2]|0;if(!A){v=z;break}else{B=z;z=A;y=B}}}while(0);f[j>>2]=f[v>>2];f[v>>2]=f[f[(f[a>>2]|0)+(o<<2)>>2]>>2];f[f[(f[a>>2]|0)+(o<<2)>>2]>>2]=e;e=f[g>>2]|0;if(!e){C=39;break a}}}else{e=d;while(1){u=f[e+4>>2]|0;if(u>>>0<c>>>0)D=u;else D=(u>>>0)%(c>>>0)|0;if((D|0)==(k|0)){p=e;break c}u=(f[a>>2]|0)+(D<<2)|0;if(!(f[u>>2]|0)){r=e;s=D;t=u;break b}u=e+8|0;q=f[e>>2]|0;e:do if(!q)E=e;else{y=b[u>>0]|0;z=u+1|0;x=e;w=q;while(1){B=w+8|0;if(y<<24>>24!=(b[B>>0]|0)){E=x;break e}if((b[z>>0]|0)!=(b[B+1>>0]|0)){E=x;break e}B=f[w>>2]|0;if(!B){E=w;break}else{A=w;w=B;x=A}}}while(0);f[j>>2]=f[E>>2];f[E>>2]=f[f[(f[a>>2]|0)+(D<<2)>>2]>>2];f[f[(f[a>>2]|0)+(D<<2)>>2]>>2]=e;e=f[g>>2]|0;if(!e){C=39;break a}}}while(0);d=f[p>>2]|0;if(!d){C=39;break a}else{g=p;j=p}}f[t>>2]=j;m=f[r>>2]|0;if(!m){C=39;break}else{k=s;l=r;n=r}}if((C|0)==39)return}function Hd(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0;c=u;u=u+48|0;d=c+32|0;e=c+28|0;g=c+16|0;h=c;i=a+16|0;j=f[i>>2]|0;if(j|0){k=f[b>>2]|0;l=i;m=j;a:while(1){j=m;while(1){if((f[j+16>>2]|0)>=(k|0))break;n=f[j+4>>2]|0;if(!n){o=l;break a}else j=n}m=f[j>>2]|0;if(!m){o=j;break}else l=j}if((o|0)!=(i|0)?(k|0)>=(f[o+16>>2]|0):0){p=o;q=p+20|0;u=c;return q|0}}lp(g);f[h>>2]=f[b>>2];b=h+4|0;f[h+8>>2]=0;o=h+12|0;f[o>>2]=0;k=h+8|0;f[b>>2]=k;l=f[g>>2]|0;m=g+4|0;if((l|0)!=(m|0)){n=k;r=l;while(1){l=r+16|0;f[e>>2]=n;f[d>>2]=f[e>>2];ph(b,d,l,l)|0;l=f[r+4>>2]|0;if(!l){s=r+8|0;t=f[s>>2]|0;if((f[t>>2]|0)==(r|0))v=t;else{t=s;do{s=f[t>>2]|0;t=s+8|0;w=f[t>>2]|0}while((f[w>>2]|0)!=(s|0));v=w}}else{t=l;while(1){j=f[t>>2]|0;if(!j)break;else t=j}v=t}if((v|0)==(m|0))break;else r=v}}v=a+12|0;r=f[i>>2]|0;do if(r){d=f[h>>2]|0;e=a+16|0;n=r;while(1){l=f[n+16>>2]|0;if((d|0)<(l|0)){j=f[n>>2]|0;if(!j){x=23;break}else{y=n;z=j}}else{if((l|0)>=(d|0)){x=27;break}A=n+4|0;l=f[A>>2]|0;if(!l){x=26;break}else{y=A;z=l}}e=y;n=z}if((x|0)==23){B=n;C=n;break}else if((x|0)==26){B=n;C=A;break}else if((x|0)==27){B=n;C=e;break}}else{B=i;C=i}while(0);i=f[C>>2]|0;if(!i){x=ln(32)|0;f[x+16>>2]=f[h>>2];A=x+20|0;f[A>>2]=f[b>>2];z=x+24|0;y=f[h+8>>2]|0;f[z>>2]=y;r=f[o>>2]|0;f[x+28>>2]=r;if(!r)f[A>>2]=z;else{f[y+8>>2]=z;f[b>>2]=k;f[k>>2]=0;f[o>>2]=0}f[x>>2]=0;f[x+4>>2]=0;f[x+8>>2]=B;f[C>>2]=x;B=f[f[v>>2]>>2]|0;if(!B)D=x;else{f[v>>2]=B;D=f[C>>2]|0}Oe(f[a+16>>2]|0,D);D=a+20|0;f[D>>2]=(f[D>>2]|0)+1;E=x}else E=i;Ej(h+4|0,f[k>>2]|0);Ej(g,f[m>>2]|0);p=E;q=p+20|0;u=c;return q|0}function Id(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;d=b[c+11>>0]|0;e=d<<24>>24<0;g=e?f[c>>2]|0:c;i=e?f[c+4>>2]|0:d&255;if(i>>>0>3){d=g;c=i;e=i;while(1){j=X(h[d>>0]|h[d+1>>0]<<8|h[d+2>>0]<<16|h[d+3>>0]<<24,1540483477)|0;c=(X(j>>>24^j,1540483477)|0)^(X(c,1540483477)|0);e=e+-4|0;if(e>>>0<=3)break;else d=d+4|0}d=i+-4|0;e=d&-4;k=d-e|0;l=g+(e+4)|0;m=c}else{k=i;l=g;m=i}switch(k|0){case 3:{n=h[l+2>>0]<<16^m;o=6;break}case 2:{n=m;o=6;break}case 1:{p=m;o=7;break}default:q=m}if((o|0)==6){p=h[l+1>>0]<<8^n;o=7}if((o|0)==7)q=X(p^h[l>>0],1540483477)|0;l=X(q>>>13^q,1540483477)|0;q=l>>>15^l;l=f[a+4>>2]|0;if(!l){r=0;return r|0}p=l+-1|0;n=(p&l|0)==0;if(!n)if(q>>>0<l>>>0)s=q;else s=(q>>>0)%(l>>>0)|0;else s=q&p;m=f[(f[a>>2]|0)+(s<<2)>>2]|0;if(!m){r=0;return r|0}a=f[m>>2]|0;if(!a){r=0;return r|0}m=(i|0)==0;if(n){n=a;a:while(1){k=f[n+4>>2]|0;c=(k|0)==(q|0);if(!(c|(k&p|0)==(s|0))){r=0;o=40;break}do if(c?(k=n+8|0,e=b[k+11>>0]|0,d=e<<24>>24<0,j=e&255,((d?f[n+12>>2]|0:j)|0)==(i|0)):0){e=f[k>>2]|0;t=d?e:k;if(d){if(m){r=n;o=40;break a}if(!(Vk(t,g,i)|0)){r=n;o=40;break a}else break}if(m){r=n;o=40;break a}if((b[g>>0]|0)==(e&255)<<24>>24){e=k;k=j;j=g;do{k=k+-1|0;e=e+1|0;if(!k){r=n;o=40;break a}j=j+1|0}while((b[e>>0]|0)==(b[j>>0]|0))}}while(0);n=f[n>>2]|0;if(!n){r=0;o=40;break}}if((o|0)==40)return r|0}else u=a;b:while(1){a=f[u+4>>2]|0;do if((a|0)==(q|0)){n=u+8|0;p=b[n+11>>0]|0;c=p<<24>>24<0;j=p&255;if(((c?f[u+12>>2]|0:j)|0)==(i|0)){p=f[n>>2]|0;e=c?p:n;if(c){if(m){r=u;o=40;break b}if(!(Vk(e,g,i)|0)){r=u;o=40;break b}else break}if(m){r=u;o=40;break b}if((b[g>>0]|0)==(p&255)<<24>>24){p=n;n=j;j=g;do{n=n+-1|0;p=p+1|0;if(!n){r=u;o=40;break b}j=j+1|0}while((b[p>>0]|0)==(b[j>>0]|0))}}}else{if(a>>>0<l>>>0)v=a;else v=(a>>>0)%(l>>>0)|0;if((v|0)!=(s|0)){r=0;o=40;break b}}while(0);u=f[u>>2]|0;if(!u){r=0;o=40;break}}if((o|0)==40)return r|0;return 0}function Jd(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0;c=a+4|0;if(!b){d=f[a>>2]|0;f[a>>2]=0;if(d|0)Oq(d);f[c>>2]=0;return}if(b>>>0>1073741823){d=ra(8)|0;Oo(d,16035);f[d>>2]=7256;va(d|0,1112,110)}d=ln(b<<2)|0;e=f[a>>2]|0;f[a>>2]=d;if(e|0)Oq(e);f[c>>2]=b;c=0;do{f[(f[a>>2]|0)+(c<<2)>>2]=0;c=c+1|0}while((c|0)!=(b|0));c=a+8|0;e=f[c>>2]|0;if(!e)return;d=f[e+4>>2]|0;g=b+-1|0;h=(g&b|0)==0;if(!h)if(d>>>0<b>>>0)i=d;else i=(d>>>0)%(b>>>0)|0;else i=d&g;f[(f[a>>2]|0)+(i<<2)>>2]=c;c=f[e>>2]|0;if(!c)return;else{j=i;k=e;l=c;m=e}a:while(1){e=k;c=l;i=m;b:while(1){c:do if(h){d=c;while(1){n=f[d+4>>2]&g;if((n|0)==(j|0)){o=d;break c}p=(f[a>>2]|0)+(n<<2)|0;if(!(f[p>>2]|0)){q=d;r=n;s=p;break b}p=d+12|0;t=f[d>>2]|0;d:do if(!t)u=d;else{v=f[d+8>>2]|0;w=d;x=t;while(1){if((v|0)!=(f[x+8>>2]|0)){u=w;break d}if((f[p>>2]|0)!=(f[x+12>>2]|0)){u=w;break d}y=f[x>>2]|0;if(!y){u=x;break}else{z=x;x=y;w=z}}}while(0);f[i>>2]=f[u>>2];f[u>>2]=f[f[(f[a>>2]|0)+(n<<2)>>2]>>2];f[f[(f[a>>2]|0)+(n<<2)>>2]>>2]=d;d=f[e>>2]|0;if(!d){A=39;break a}}}else{d=c;while(1){p=f[d+4>>2]|0;if(p>>>0<b>>>0)B=p;else B=(p>>>0)%(b>>>0)|0;if((B|0)==(j|0)){o=d;break c}p=(f[a>>2]|0)+(B<<2)|0;if(!(f[p>>2]|0)){q=d;r=B;s=p;break b}p=d+12|0;t=f[d>>2]|0;e:do if(!t)C=d;else{w=f[d+8>>2]|0;x=d;v=t;while(1){if((w|0)!=(f[v+8>>2]|0)){C=x;break e}if((f[p>>2]|0)!=(f[v+12>>2]|0)){C=x;break e}z=f[v>>2]|0;if(!z){C=v;break}else{y=v;v=z;x=y}}}while(0);f[i>>2]=f[C>>2];f[C>>2]=f[f[(f[a>>2]|0)+(B<<2)>>2]>>2];f[f[(f[a>>2]|0)+(B<<2)>>2]>>2]=d;d=f[e>>2]|0;if(!d){A=39;break a}}}while(0);c=f[o>>2]|0;if(!c){A=39;break a}else{e=o;i=o}}f[s>>2]=i;l=f[q>>2]|0;if(!l){A=39;break}else{j=r;k=q;m=q}}if((A|0)==39)return}function Kd(a,c,d,e,g){a=a|0;c=c|0;d=d|0;e=e|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;h=a+4|0;i=f[c>>2]|0;c=i;do if((i|0)!=(h|0)){j=i+16|0;k=b[j+11>>0]|0;l=k<<24>>24<0;m=l?f[i+20>>2]|0:k&255;k=b[g+11>>0]|0;n=k<<24>>24<0;o=n?f[g+4>>2]|0:k&255;k=m>>>0<o>>>0;p=k?m:o;if((p|0)!=0?(q=Vk(n?f[g>>2]|0:g,l?f[j>>2]|0:j,p)|0,(q|0)!=0):0){if((q|0)<0)break}else r=4;if((r|0)==4?o>>>0<m>>>0:0)break;q=o>>>0<m>>>0?o:m;if((q|0)!=0?(m=Vk(l?f[j>>2]|0:j,n?f[g>>2]|0:g,q)|0,(m|0)!=0):0){if((m|0)>=0)r=37}else r=21;if((r|0)==21?!k:0)r=37;if((r|0)==37){f[d>>2]=c;f[e>>2]=c;s=e;return s|0}k=f[i+4>>2]|0;m=(k|0)==0;if(m){q=i+8|0;j=f[q>>2]|0;if((f[j>>2]|0)==(i|0))t=j;else{j=q;do{q=f[j>>2]|0;j=q+8|0;l=f[j>>2]|0}while((f[l>>2]|0)!=(q|0));t=l}}else{j=k;while(1){l=f[j>>2]|0;if(!l)break;else j=l}t=j}do if((t|0)!=(h|0)){k=t+16|0;l=b[k+11>>0]|0;q=l<<24>>24<0;p=q?f[t+20>>2]|0:l&255;l=p>>>0<o>>>0?p:o;if((l|0)!=0?(u=Vk(n?f[g>>2]|0:g,q?f[k>>2]|0:k,l)|0,(u|0)!=0):0){if((u|0)<0)break}else r=31;if((r|0)==31?o>>>0<p>>>0:0)break;s=yg(a,d,g)|0;return s|0}while(0);if(m){f[d>>2]=c;s=i+4|0;return s|0}else{f[d>>2]=t;s=t;return s|0}}while(0);t=f[i>>2]|0;do if((f[a>>2]|0)==(i|0))v=c;else{if(!t){h=i;while(1){e=f[h+8>>2]|0;if((f[e>>2]|0)==(h|0))h=e;else{w=e;break}}}else{h=t;while(1){m=f[h+4>>2]|0;if(!m){w=h;break}else h=m}}h=w;m=w+16|0;e=b[g+11>>0]|0;o=e<<24>>24<0;n=o?f[g+4>>2]|0:e&255;e=b[m+11>>0]|0;j=e<<24>>24<0;p=j?f[w+20>>2]|0:e&255;e=n>>>0<p>>>0?n:p;if((e|0)!=0?(u=Vk(j?f[m>>2]|0:m,o?f[g>>2]|0:g,e)|0,(u|0)!=0):0){if((u|0)<0){v=h;break}}else r=13;if((r|0)==13?p>>>0<n>>>0:0){v=h;break}s=yg(a,d,g)|0;return s|0}while(0);if(!t){f[d>>2]=i;s=i;return s|0}else{f[d>>2]=v;s=v+4|0;return s|0}return 0}function Ld(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0;g=a;h=b;i=h;j=c;k=d;l=k;if(!i){m=(e|0)!=0;if(!l){if(m){f[e>>2]=(g>>>0)%(j>>>0);f[e+4>>2]=0}n=0;o=(g>>>0)/(j>>>0)>>>0;return (I=n,o)|0}else{if(!m){n=0;o=0;return (I=n,o)|0}f[e>>2]=a|0;f[e+4>>2]=b&0;n=0;o=0;return (I=n,o)|0}}m=(l|0)==0;do if(j){if(!m){p=(_(l|0)|0)-(_(i|0)|0)|0;if(p>>>0<=31){q=p+1|0;r=31-p|0;s=p-31>>31;t=q;u=g>>>(q>>>0)&s|i<<r;v=i>>>(q>>>0)&s;w=0;x=g<<r;break}if(!e){n=0;o=0;return (I=n,o)|0}f[e>>2]=a|0;f[e+4>>2]=h|b&0;n=0;o=0;return (I=n,o)|0}r=j-1|0;if(r&j|0){s=(_(j|0)|0)+33-(_(i|0)|0)|0;q=64-s|0;p=32-s|0;y=p>>31;z=s-32|0;A=z>>31;t=s;u=p-1>>31&i>>>(z>>>0)|(i<<p|g>>>(s>>>0))&A;v=A&i>>>(s>>>0);w=g<<q&y;x=(i<<q|g>>>(z>>>0))&y|g<<p&s-33>>31;break}if(e|0){f[e>>2]=r&g;f[e+4>>2]=0}if((j|0)==1){n=h|b&0;o=a|0|0;return (I=n,o)|0}else{r=vm(j|0)|0;n=i>>>(r>>>0)|0;o=i<<32-r|g>>>(r>>>0)|0;return (I=n,o)|0}}else{if(m){if(e|0){f[e>>2]=(i>>>0)%(j>>>0);f[e+4>>2]=0}n=0;o=(i>>>0)/(j>>>0)>>>0;return (I=n,o)|0}if(!g){if(e|0){f[e>>2]=0;f[e+4>>2]=(i>>>0)%(l>>>0)}n=0;o=(i>>>0)/(l>>>0)>>>0;return (I=n,o)|0}r=l-1|0;if(!(r&l)){if(e|0){f[e>>2]=a|0;f[e+4>>2]=r&i|b&0}n=0;o=i>>>((vm(l|0)|0)>>>0);return (I=n,o)|0}r=(_(l|0)|0)-(_(i|0)|0)|0;if(r>>>0<=30){s=r+1|0;p=31-r|0;t=s;u=i<<p|g>>>(s>>>0);v=i>>>(s>>>0);w=0;x=g<<p;break}if(!e){n=0;o=0;return (I=n,o)|0}f[e>>2]=a|0;f[e+4>>2]=h|b&0;n=0;o=0;return (I=n,o)|0}while(0);if(!t){B=x;C=w;D=v;E=u;F=0;G=0}else{b=c|0|0;c=k|d&0;d=Vn(b|0,c|0,-1,-1)|0;k=I;h=x;x=w;w=v;v=u;u=t;t=0;do{a=h;h=x>>>31|h<<1;x=t|x<<1;g=v<<1|a>>>31|0;a=v>>>31|w<<1|0;Xn(d|0,k|0,g|0,a|0)|0;i=I;l=i>>31|((i|0)<0?-1:0)<<1;t=l&1;v=Xn(g|0,a|0,l&b|0,(((i|0)<0?-1:0)>>31|((i|0)<0?-1:0)<<1)&c|0)|0;w=I;u=u-1|0}while((u|0)!=0);B=h;C=x;D=w;E=v;F=0;G=t}t=C;C=0;if(e|0){f[e>>2]=E;f[e+4>>2]=D}n=(t|0)>>>31|(B|C)<<1|(C<<1|t>>>31)&0|F;o=(t<<1|0>>>31)&-2|G;return (I=n,o)|0}function Md(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;g=u;u=u+16|0;h=g;f[c+48>>2]=d;f[c+44>>2]=e;e=f[c+8>>2]|0;d=c+12|0;i=f[d>>2]|0;if((i|0)!=(e|0)){j=i;do{i=j+-4|0;f[d>>2]=i;k=f[i>>2]|0;f[i>>2]=0;if(k|0)Va[f[(f[k>>2]|0)+4>>2]&127](k);j=f[d>>2]|0}while((j|0)!=(e|0))}e=f[c+20>>2]|0;j=c+24|0;d=f[j>>2]|0;if((d|0)!=(e|0))f[j>>2]=d+(~((d+-4-e|0)>>>2)<<2);e=f[c+32>>2]|0;d=c+36|0;j=f[d>>2]|0;if((j|0)!=(e|0))f[d>>2]=j+(~((j+-4-e|0)>>>2)<<2);if(!(f[c+4>>2]|0)){e=ln(32)|0;f[h>>2]=e;f[h+8>>2]=-2147483616;f[h+4>>2]=23;l=e;m=15706;n=l+23|0;do{b[l>>0]=b[m>>0]|0;l=l+1|0;m=m+1|0}while((l|0)<(n|0));b[e+23>>0]=0;f[a>>2]=-1;pj(a+4|0,h);if((b[h+11>>0]|0)<0)Oq(f[h>>2]|0);u=g;return}Ud(a,c);if(f[a>>2]|0){u=g;return}e=a+4|0;j=e+11|0;if((b[j>>0]|0)<0)Oq(f[e>>2]|0);Wi(a,c);if(f[a>>2]|0){u=g;return}if((b[j>>0]|0)<0)Oq(f[e>>2]|0);if(!(Qa[f[(f[c>>2]|0)+16>>2]&127](c)|0)){j=ln(32)|0;f[h>>2]=j;f[h+8>>2]=-2147483616;f[h+4>>2]=29;l=j;m=15730;n=l+29|0;do{b[l>>0]=b[m>>0]|0;l=l+1|0;m=m+1|0}while((l|0)<(n|0));b[j+29>>0]=0;f[a>>2]=-1;pj(e,h);if((b[h+11>>0]|0)<0)Oq(f[h>>2]|0);u=g;return}if(!(Qa[f[(f[c>>2]|0)+20>>2]&127](c)|0)){j=ln(32)|0;f[h>>2]=j;f[h+8>>2]=-2147483616;f[h+4>>2]=31;l=j;m=15760;n=l+31|0;do{b[l>>0]=b[m>>0]|0;l=l+1|0;m=m+1|0}while((l|0)<(n|0));b[j+31>>0]=0;f[a>>2]=-1;pj(e,h);if((b[h+11>>0]|0)<0)Oq(f[h>>2]|0);u=g;return}if(!(Qa[f[(f[c>>2]|0)+24>>2]&127](c)|0)){j=ln(32)|0;f[h>>2]=j;f[h+8>>2]=-2147483616;f[h+4>>2]=31;l=j;m=15792;n=l+31|0;do{b[l>>0]=b[m>>0]|0;l=l+1|0;m=m+1|0}while((l|0)<(n|0));b[j+31>>0]=0;f[a>>2]=-1;pj(e,h);if((b[h+11>>0]|0)<0)Oq(f[h>>2]|0);u=g;return}if(Qa[f[(f[c>>2]|0)+28>>2]&127](c)|0){f[a>>2]=0;f[a+4>>2]=0;f[a+8>>2]=0;f[a+12>>2]=0;u=g;return}c=ln(48)|0;f[h>>2]=c;f[h+8>>2]=-2147483600;f[h+4>>2]=34;l=c;m=15824;n=l+34|0;do{b[l>>0]=b[m>>0]|0;l=l+1|0;m=m+1|0}while((l|0)<(n|0));b[c+34>>0]=0;f[a>>2]=-1;pj(e,h);if((b[h+11>>0]|0)<0)Oq(f[h>>2]|0);u=g;return}function Nd(a){a=a|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;c=u;u=u+32|0;d=c+4|0;e=c;g=c+16|0;h=a+48|0;i=f[h>>2]|0;j=ln(32)|0;f[d>>2]=j;f[d+8>>2]=-2147483616;f[d+4>>2]=20;k=j;l=14538;m=k+20|0;do{b[k>>0]=b[l>>0]|0;k=k+1|0;l=l+1|0}while((k|0)<(m|0));b[j+20>>0]=0;j=Fk(i+24|0,d)|0;if((b[d+11>>0]|0)<0)Oq(f[d>>2]|0);i=f[h>>2]|0;n=ln(32)|0;f[d>>2]=n;f[d+8>>2]=-2147483616;f[d+4>>2]=22;k=n;l=14559;m=k+22|0;do{b[k>>0]=b[l>>0]|0;k=k+1|0;l=l+1|0}while((k|0)<(m|0));b[n+22>>0]=0;n=Fk(i+24|0,d)|0;if((b[d+11>>0]|0)<0)Oq(f[d>>2]|0);i=a+56|0;o=f[i>>2]|0;f[i>>2]=0;if(o|0)Va[f[(f[o>>2]|0)+4>>2]&127](o);o=f[a+52>>2]|0;p=(((f[o+100>>2]|0)-(f[o+96>>2]|0)|0)/12|0)>>>0<1e3;o=f[h>>2]|0;q=ln(32)|0;f[d>>2]=q;f[d+8>>2]=-2147483616;f[d+4>>2]=18;k=q;l=14582;m=k+18|0;do{b[k>>0]=b[l>>0]|0;k=k+1|0;l=l+1|0}while((k|0)<(m|0));b[q+18>>0]=0;q=Hk(o,d,-1)|0;if((b[d+11>>0]|0)<0)Oq(f[d>>2]|0);switch(q|0){case -1:{if(j?p|((mi(f[h>>2]|0)|0)>4|n^1):0)r=13;else r=17;break}case 0:{if(j)r=13;else r=21;break}case 2:{r=17;break}default:r=21}if((r|0)==13){j=f[a+44>>2]|0;b[g>>0]=0;n=j+16|0;h=f[n+4>>2]|0;if(!((h|0)>0|(h|0)==0&(f[n>>2]|0)>>>0>0)){f[e>>2]=f[j+4>>2];f[d>>2]=f[e>>2];Me(j,d,g,g+1|0)|0}j=ln(296)|0;_i(j);n=f[i>>2]|0;f[i>>2]=j;if(!n)s=j;else{Va[f[(f[n>>2]|0)+4>>2]&127](n);r=21}}else if((r|0)==17){n=f[a+44>>2]|0;b[g>>0]=2;j=n+16|0;h=f[j+4>>2]|0;if(!((h|0)>0|(h|0)==0&(f[j>>2]|0)>>>0>0)){f[e>>2]=f[n+4>>2];f[d>>2]=f[e>>2];Me(n,d,g,g+1|0)|0}g=ln(360)|0;xi(g);d=f[i>>2]|0;f[i>>2]=g;if(!d)s=g;else{Va[f[(f[d>>2]|0)+4>>2]&127](d);r=21}}if((r|0)==21){r=f[i>>2]|0;if(!r){t=0;u=c;return t|0}else s=r}t=Ra[f[(f[s>>2]|0)+8>>2]&127](s,a)|0;u=c;return t|0}function Od(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0;e=b+12|0;g=f[e>>2]|0;h=c+4|0;i=(f[h>>2]|0)-g|0;j=c;f[j>>2]=(f[c>>2]|0)-g;f[j+4>>2]=i;i=(f[d>>2]|0)-g|0;j=d+4|0;k=(f[j>>2]|0)-g|0;g=d;f[g>>2]=i;f[g+4>>2]=k;g=f[e>>2]|0;if((((k|0)>-1?k:0-k|0)+((i|0)>-1?i:0-i|0)|0)>(g|0)){l=f[c>>2]|0;m=f[h>>2]|0;if((l|0)>-1)if((m|0)<=-1)if((l|0)<1){n=-1;o=-1}else p=6;else{n=1;o=1}else if((m|0)<1){n=-1;o=-1}else p=6;if((p|0)==6){n=(l|0)>0?1:-1;o=(m|0)>0?1:-1}q=X(g,n)|0;r=X(g,o)|0;g=(l<<1)-q|0;f[c>>2]=g;l=(m<<1)-r|0;f[h>>2]=l;if((X(n,o)|0)>-1){o=0-l|0;f[c>>2]=o;s=0-g|0;t=o}else{f[c>>2]=l;s=g;t=l}f[c>>2]=(t+q|0)/2|0;f[h>>2]=(s+r|0)/2|0;r=f[d>>2]|0;s=f[j>>2]|0;if((r|0)>-1)if((s|0)<=-1)if((r|0)<1){u=-1;v=-1}else p=14;else{u=1;v=1}else if((s|0)<1){u=-1;v=-1}else p=14;if((p|0)==14){u=(r|0)>0?1:-1;v=(s|0)>0?1:-1}q=f[e>>2]|0;e=X(q,u)|0;t=X(q,v)|0;q=(r<<1)-e|0;f[d>>2]=q;r=(s<<1)-t|0;f[j>>2]=r;if((X(u,v)|0)>-1){v=0-r|0;f[d>>2]=v;w=0-q|0;x=v}else{f[d>>2]=r;w=q;x=r}r=(x+e|0)/2|0;f[d>>2]=r;e=(w+t|0)/2|0;f[j>>2]=e;y=r;z=e}else{y=i;z=k}if(!y)if(!z){A=y;B=z}else p=22;else if((y|0)<0&(z|0)<1){A=y;B=z}else p=22;if((p|0)==22){if(!y)C=(z|0)==0?0:(z|0)>0?3:1;else C=(y|0)>0?(z>>31)+2|0:(z|0)<1?0:3;z=f[c>>2]|0;y=f[h>>2]|0;switch(C|0){case 1:{C=c;f[C>>2]=y;f[C+4>>2]=0-z;D=f[j>>2]|0;E=0-(f[d>>2]|0)|0;break}case 2:{C=c;f[C>>2]=0-z;f[C+4>>2]=0-y;D=0-(f[d>>2]|0)|0;E=0-(f[j>>2]|0)|0;break}case 3:{C=c;f[C>>2]=0-y;f[C+4>>2]=z;D=0-(f[j>>2]|0)|0;E=f[d>>2]|0;break}default:{C=c;f[C>>2]=z;f[C+4>>2]=y;D=f[d>>2]|0;E=f[j>>2]|0}}j=d;f[j>>2]=D;f[j+4>>2]=E;A=D;B=E}E=(f[c>>2]|0)-A|0;f[a>>2]=E;A=(f[h>>2]|0)-B|0;B=a+4|0;f[B>>2]=A;if((E|0)<0)F=(f[b+4>>2]|0)+E|0;else F=E;f[a>>2]=F;if((A|0)>=0){G=A;f[B>>2]=G;return}G=(f[b+4>>2]|0)+A|0;f[B>>2]=G;return}function Pd(a,b){a=a|0;b=b|0;var c=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0;c=a+4|0;if(!b){e=f[a>>2]|0;f[a>>2]=0;if(e|0)Oq(e);f[c>>2]=0;return}if(b>>>0>1073741823){e=ra(8)|0;Oo(e,16035);f[e>>2]=7256;va(e|0,1112,110)}e=ln(b<<2)|0;g=f[a>>2]|0;f[a>>2]=e;if(g|0)Oq(g);f[c>>2]=b;c=0;do{f[(f[a>>2]|0)+(c<<2)>>2]=0;c=c+1|0}while((c|0)!=(b|0));c=a+8|0;g=f[c>>2]|0;if(!g)return;e=f[g+4>>2]|0;h=b+-1|0;i=(h&b|0)==0;if(!i)if(e>>>0<b>>>0)j=e;else j=(e>>>0)%(b>>>0)|0;else j=e&h;f[(f[a>>2]|0)+(j<<2)>>2]=c;c=f[g>>2]|0;if(!c)return;else{k=j;l=g;m=c;n=g}a:while(1){b:do if(i){g=l;c=m;j=n;while(1){e=c;while(1){o=f[e+4>>2]&h;if((o|0)==(k|0))break;p=(f[a>>2]|0)+(o<<2)|0;if(!(f[p>>2]|0)){q=e;r=j;s=o;t=p;break b}p=e+8|0;u=e;while(1){v=f[u>>2]|0;if(!v)break;if((d[p>>1]|0)==(d[v+8>>1]|0))u=v;else break}f[j>>2]=v;f[u>>2]=f[f[(f[a>>2]|0)+(o<<2)>>2]>>2];f[f[(f[a>>2]|0)+(o<<2)>>2]>>2]=e;p=f[g>>2]|0;if(!p){w=37;break a}else e=p}c=f[e>>2]|0;if(!c){w=37;break a}else{g=e;j=e}}}else{j=l;g=m;c=n;while(1){p=g;while(1){x=f[p+4>>2]|0;if(x>>>0<b>>>0)y=x;else y=(x>>>0)%(b>>>0)|0;if((y|0)==(k|0))break;x=(f[a>>2]|0)+(y<<2)|0;if(!(f[x>>2]|0)){q=p;r=c;s=y;t=x;break b}x=p+8|0;z=p;while(1){A=f[z>>2]|0;if(!A)break;if((d[x>>1]|0)==(d[A+8>>1]|0))z=A;else break}f[c>>2]=A;f[z>>2]=f[f[(f[a>>2]|0)+(y<<2)>>2]>>2];f[f[(f[a>>2]|0)+(y<<2)>>2]>>2]=p;x=f[j>>2]|0;if(!x){w=37;break a}else p=x}g=f[p>>2]|0;if(!g){w=37;break a}else{j=p;c=p}}}while(0);f[t>>2]=r;m=f[q>>2]|0;if(!m){w=37;break}else{k=s;l=q;n=q}}if((w|0)==37)return}function Qd(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0;d=a+4|0;if(!c){e=f[a>>2]|0;f[a>>2]=0;if(e|0)Oq(e);f[d>>2]=0;return}if(c>>>0>1073741823){e=ra(8)|0;Oo(e,16035);f[e>>2]=7256;va(e|0,1112,110)}e=ln(c<<2)|0;g=f[a>>2]|0;f[a>>2]=e;if(g|0)Oq(g);f[d>>2]=c;d=0;do{f[(f[a>>2]|0)+(d<<2)>>2]=0;d=d+1|0}while((d|0)!=(c|0));d=a+8|0;g=f[d>>2]|0;if(!g)return;e=f[g+4>>2]|0;h=c+-1|0;i=(h&c|0)==0;if(!i)if(e>>>0<c>>>0)j=e;else j=(e>>>0)%(c>>>0)|0;else j=e&h;f[(f[a>>2]|0)+(j<<2)>>2]=d;d=f[g>>2]|0;if(!d)return;else{k=j;l=g;m=d;n=g}a:while(1){b:do if(i){g=l;d=m;j=n;while(1){e=d;while(1){o=f[e+4>>2]&h;if((o|0)==(k|0))break;p=(f[a>>2]|0)+(o<<2)|0;if(!(f[p>>2]|0)){q=e;r=j;s=o;t=p;break b}p=e+8|0;u=e;while(1){v=f[u>>2]|0;if(!v)break;if((b[p>>0]|0)==(b[v+8>>0]|0))u=v;else break}f[j>>2]=v;f[u>>2]=f[f[(f[a>>2]|0)+(o<<2)>>2]>>2];f[f[(f[a>>2]|0)+(o<<2)>>2]>>2]=e;p=f[g>>2]|0;if(!p){w=37;break a}else e=p}d=f[e>>2]|0;if(!d){w=37;break a}else{g=e;j=e}}}else{j=l;g=m;d=n;while(1){p=g;while(1){x=f[p+4>>2]|0;if(x>>>0<c>>>0)y=x;else y=(x>>>0)%(c>>>0)|0;if((y|0)==(k|0))break;x=(f[a>>2]|0)+(y<<2)|0;if(!(f[x>>2]|0)){q=p;r=d;s=y;t=x;break b}x=p+8|0;z=p;while(1){A=f[z>>2]|0;if(!A)break;if((b[x>>0]|0)==(b[A+8>>0]|0))z=A;else break}f[d>>2]=A;f[z>>2]=f[f[(f[a>>2]|0)+(y<<2)>>2]>>2];f[f[(f[a>>2]|0)+(y<<2)>>2]>>2]=p;x=f[j>>2]|0;if(!x){w=37;break a}else p=x}g=f[p>>2]|0;if(!g){w=37;break a}else{j=p;d=p}}}while(0);f[t>>2]=r;m=f[q>>2]|0;if(!m){w=37;break}else{k=s;l=q;n=q}}if((w|0)==37)return}function Rd(a,b,c,d,e,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0;g=f[c>>2]|0;c=f[b>>2]|0;h=g-c|0;i=a+8|0;j=f[i>>2]|0;if(h>>>0<64){if(j>>>0<=1){k=0;return k|0}l=f[e>>2]|0;m=0;n=1;while(1){o=(f[l+(m<<2)>>2]|0)>>>0>(f[l+(n<<2)>>2]|0)>>>0?n:m;n=n+1|0;if(n>>>0>=j>>>0){k=o;break}else m=o}return k|0}if(j){j=f[a+1128>>2]|0;m=f[e>>2]|0;e=f[a+1140>>2]|0;n=f[d>>2]|0;d=b+4|0;l=b+8|0;if((g|0)==(c|0)){b=0;do{o=j+(b<<2)|0;f[o>>2]=0;p=(f[a>>2]|0)-(f[m+(b<<2)>>2]|0)|0;f[e+(b<<2)>>2]=p;if(p|0){p=f[o>>2]|0;q=h-p|0;f[o>>2]=q>>>0<p>>>0?p:q}b=b+1|0;q=f[i>>2]|0}while(b>>>0<q>>>0);r=q}else{b=0;do{q=j+(b<<2)|0;f[q>>2]=0;p=(f[a>>2]|0)-(f[m+(b<<2)>>2]|0)|0;f[e+(b<<2)>>2]=p;if(p|0){o=(f[n+(b<<2)>>2]|0)+(1<<p+-1)|0;p=f[l>>2]|0;s=f[(f[d>>2]|0)+24>>2]|0;t=c;u=f[q>>2]|0;do{v=s+((X(t,p)|0)<<2)+(b<<2)|0;u=u+((f[v>>2]|0)>>>0<o>>>0&1)|0;f[q>>2]=u;t=t+1|0}while((t|0)!=(g|0));t=h-u|0;f[q>>2]=t>>>0<u>>>0?u:t}b=b+1|0;t=f[i>>2]|0}while(b>>>0<t>>>0);r=t}if(r){b=f[a+1140>>2]|0;i=a+1128|0;h=0;g=0;c=0;while(1){if(!(f[b+(g<<2)>>2]|0)){w=h;x=c}else{d=f[(f[i>>2]|0)+(g<<2)>>2]|0;l=h>>>0<d>>>0;w=l?d:h;x=l?g:c}g=g+1|0;if(g>>>0>=r>>>0){y=x;break}else{h=w;c=x}}}else y=0}else y=0;x=a+1088|0;c=a+1104|0;w=f[c>>2]|0;h=32-w|0;if((h|0)<4){r=y&15;g=4-h|0;f[c>>2]=g;h=a+1100|0;i=f[h>>2]|r>>>g;f[h>>2]=i;g=a+1092|0;b=f[g>>2]|0;if((b|0)==(f[a+1096>>2]|0))Ri(x,h);else{f[b>>2]=i;f[g>>2]=b+4}f[h>>2]=r<<32-(f[c>>2]|0);k=y;return k|0}r=a+1100|0;h=f[r>>2]|y<<28>>>w;f[r>>2]=h;b=w+4|0;f[c>>2]=b;if((b|0)!=32){k=y;return k|0}b=a+1092|0;w=f[b>>2]|0;if((w|0)==(f[a+1096>>2]|0))Ri(x,r);else{f[w>>2]=h;f[b>>2]=w+4}f[r>>2]=0;f[c>>2]=0;k=y;return k|0}function Sd(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0;c=a+4|0;if(!b){d=f[a>>2]|0;f[a>>2]=0;if(d|0)Oq(d);f[c>>2]=0;return}if(b>>>0>1073741823){d=ra(8)|0;Oo(d,16035);f[d>>2]=7256;va(d|0,1112,110)}d=ln(b<<2)|0;e=f[a>>2]|0;f[a>>2]=d;if(e|0)Oq(e);f[c>>2]=b;c=0;do{f[(f[a>>2]|0)+(c<<2)>>2]=0;c=c+1|0}while((c|0)!=(b|0));c=a+8|0;e=f[c>>2]|0;if(!e)return;d=f[e+4>>2]|0;g=b+-1|0;h=(g&b|0)==0;if(!h)if(d>>>0<b>>>0)i=d;else i=(d>>>0)%(b>>>0)|0;else i=d&g;f[(f[a>>2]|0)+(i<<2)>>2]=c;c=f[e>>2]|0;if(!c)return;else{j=i;k=e;l=c;m=e}a:while(1){b:do if(h){e=k;c=l;i=m;while(1){d=c;while(1){n=f[d+4>>2]&g;if((n|0)==(j|0))break;o=(f[a>>2]|0)+(n<<2)|0;if(!(f[o>>2]|0)){p=d;q=i;r=n;s=o;break b}o=d+8|0;t=d;while(1){u=f[t>>2]|0;if(!u)break;if((f[o>>2]|0)==(f[u+8>>2]|0))t=u;else break}f[i>>2]=u;f[t>>2]=f[f[(f[a>>2]|0)+(n<<2)>>2]>>2];f[f[(f[a>>2]|0)+(n<<2)>>2]>>2]=d;o=f[e>>2]|0;if(!o){v=37;break a}else d=o}c=f[d>>2]|0;if(!c){v=37;break a}else{e=d;i=d}}}else{i=k;e=l;c=m;while(1){o=e;while(1){w=f[o+4>>2]|0;if(w>>>0<b>>>0)x=w;else x=(w>>>0)%(b>>>0)|0;if((x|0)==(j|0))break;w=(f[a>>2]|0)+(x<<2)|0;if(!(f[w>>2]|0)){p=o;q=c;r=x;s=w;break b}w=o+8|0;y=o;while(1){z=f[y>>2]|0;if(!z)break;if((f[w>>2]|0)==(f[z+8>>2]|0))y=z;else break}f[c>>2]=z;f[y>>2]=f[f[(f[a>>2]|0)+(x<<2)>>2]>>2];f[f[(f[a>>2]|0)+(x<<2)>>2]>>2]=o;w=f[i>>2]|0;if(!w){v=37;break a}else o=w}e=f[o>>2]|0;if(!e){v=37;break a}else{i=o;c=o}}}while(0);f[s>>2]=q;l=f[p>>2]|0;if(!l){v=37;break}else{j=r;k=p;m=p}}if((v|0)==37)return}function Td(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0;d=a+4|0;if(!c){e=f[a>>2]|0;f[a>>2]=0;if(e|0)Oq(e);f[d>>2]=0;return}if(c>>>0>1073741823){e=ra(8)|0;Oo(e,16035);f[e>>2]=7256;va(e|0,1112,110)}e=ln(c<<2)|0;g=f[a>>2]|0;f[a>>2]=e;if(g|0)Oq(g);f[d>>2]=c;d=0;do{f[(f[a>>2]|0)+(d<<2)>>2]=0;d=d+1|0}while((d|0)!=(c|0));d=a+8|0;g=f[d>>2]|0;if(!g)return;e=f[g+4>>2]|0;h=c+-1|0;i=(h&c|0)==0;if(!i)if(e>>>0<c>>>0)j=e;else j=(e>>>0)%(c>>>0)|0;else j=e&h;f[(f[a>>2]|0)+(j<<2)>>2]=d;d=f[g>>2]|0;if(!d)return;e=a+24|0;k=j;j=g;l=d;d=g;a:while(1){g=j;m=l;n=d;b:while(1){o=m;while(1){p=f[o+4>>2]|0;if(!i)if(p>>>0<c>>>0)q=p;else q=(p>>>0)%(c>>>0)|0;else q=p&h;if((q|0)==(k|0))break;r=(f[a>>2]|0)+(q<<2)|0;if(!(f[r>>2]|0))break b;p=f[o>>2]|0;c:do if(!p)s=o;else{t=f[o+8>>2]|0;u=f[e>>2]|0;v=f[u+8>>2]|0;w=(f[u+12>>2]|0)-v|0;u=v;v=w>>>2;if((w|0)>0){x=o;y=p}else{w=p;while(1){z=f[w>>2]|0;if(!z){s=w;break c}else w=z}}while(1){w=f[y+8>>2]|0;z=0;do{A=f[u+(z<<2)>>2]|0;if(!(b[A+84>>0]|0)){B=f[A+68>>2]|0;C=f[B+(w<<2)>>2]|0;D=f[B+(t<<2)>>2]|0}else{C=w;D=t}z=z+1|0;if((D|0)!=(C|0)){s=x;break c}}while((z|0)<(v|0));z=f[y>>2]|0;if(!z){s=y;break}else{w=y;y=z;x=w}}}while(0);f[n>>2]=f[s>>2];f[s>>2]=f[f[(f[a>>2]|0)+(q<<2)>>2]>>2];f[f[(f[a>>2]|0)+(q<<2)>>2]>>2]=o;p=f[g>>2]|0;if(!p){E=38;break a}else o=p}m=f[o>>2]|0;if(!m){E=38;break a}else{g=o;n=o}}f[r>>2]=n;l=f[o>>2]|0;if(!l){E=38;break}else{k=q;j=o;d=o}}if((E|0)==38)return}function Ud(a,c){a=a|0;c=c|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0;e=u;u=u+16|0;g=e+4|0;h=e;i=e+12|0;j=e+11|0;k=e+10|0;l=e+8|0;m=c+44|0;n=f[m>>2]|0;o=n+16|0;p=f[o+4>>2]|0;if(!((p|0)>0|(p|0)==0&(f[o>>2]|0)>>>0>0)){f[h>>2]=f[n+4>>2];f[g>>2]=f[h>>2];Me(n,g,15886,15891)|0}n=Qa[f[(f[c>>2]|0)+8>>2]&127](c)|0;b[i>>0]=n;b[j>>0]=2;b[k>>0]=(n&255|0)==0?3:2;n=f[m>>2]|0;o=n+16|0;p=f[o+4>>2]|0;if(!((p|0)>0|(p|0)==0&(f[o>>2]|0)>>>0>0)){f[h>>2]=f[n+4>>2];f[g>>2]=f[h>>2];Me(n,g,j,j+1|0)|0;j=f[m>>2]|0;o=j+16|0;p=f[o+4>>2]|0;if(!((p|0)>0|(p|0)==0&(f[o>>2]|0)>>>0>0)){f[h>>2]=f[j+4>>2];f[g>>2]=f[h>>2];Me(j,g,k,k+1|0)|0;k=f[m>>2]|0;o=k+16|0;p=f[o+4>>2]|0;if((p|0)>0|(p|0)==0&(f[o>>2]|0)>>>0>0){q=h;r=k}else{f[h>>2]=f[k+4>>2];f[g>>2]=f[h>>2];Me(k,g,i,i+1|0)|0;q=h;r=f[m>>2]|0}}else{s=h;t=j;v=6}}else{s=h;t=n;v=6}if((v|0)==6){q=h;r=t}t=Qa[f[(f[c>>2]|0)+12>>2]&127](c)|0;b[l>>0]=t;t=r+16|0;q=f[t+4>>2]|0;if(!((q|0)>0|(q|0)==0&(f[t>>2]|0)>>>0>0)){f[h>>2]=f[r+4>>2];f[g>>2]=f[h>>2];Me(r,g,l,l+1|0)|0}d[l>>1]=(f[(f[c+4>>2]|0)+4>>2]|0)==0?0:-32768;c=f[m>>2]|0;m=c+16|0;r=f[m+4>>2]|0;if((r|0)>0|(r|0)==0&(f[m>>2]|0)>>>0>0){f[a>>2]=0;f[a+4>>2]=0;f[a+8>>2]=0;f[a+12>>2]=0;u=e;return}f[h>>2]=f[c+4>>2];f[g>>2]=f[h>>2];Me(c,g,l,l+2|0)|0;f[a>>2]=0;f[a+4>>2]=0;f[a+8>>2]=0;f[a+12>>2]=0;u=e;return}function Vd(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0;e=u;u=u+176|0;g=e+136|0;h=e+104|0;i=e;j=e+72|0;k=ln(88)|0;l=f[c+8>>2]|0;f[k+4>>2]=0;f[k>>2]=3612;m=k+12|0;f[m>>2]=3636;n=k+64|0;f[n>>2]=0;f[k+68>>2]=0;f[k+72>>2]=0;o=k+16|0;p=o+44|0;do{f[o>>2]=0;o=o+4|0}while((o|0)<(p|0));f[k+76>>2]=l;f[k+80>>2]=d;q=k+84|0;f[q>>2]=0;r=k;f[h>>2]=3636;s=h+4|0;t=s+4|0;f[t>>2]=0;f[t+4>>2]=0;f[t+8>>2]=0;f[t+12>>2]=0;f[t+16>>2]=0;f[t+20>>2]=0;t=f[c+12>>2]|0;v=i+4|0;f[v>>2]=3636;w=i+56|0;f[w>>2]=0;x=i+60|0;f[x>>2]=0;f[i+64>>2]=0;o=i+8|0;p=o+44|0;do{f[o>>2]=0;o=o+4|0}while((o|0)<(p|0));o=t;f[s>>2]=o;s=((f[o+4>>2]|0)-(f[t>>2]|0)>>2>>>0)/3|0;b[g>>0]=0;qh(h+8|0,s,g);Va[f[(f[h>>2]|0)+8>>2]&127](h);Ff(j,h);Ff(g,j);f[i>>2]=f[g+4>>2];s=i+4|0;fg(s,g)|0;f[g>>2]=3636;o=f[g+20>>2]|0;if(o|0)Oq(o);o=f[g+8>>2]|0;if(o|0)Oq(o);f[i+36>>2]=t;f[i+40>>2]=d;f[i+44>>2]=l;f[i+48>>2]=k;f[j>>2]=3636;l=f[j+20>>2]|0;if(l|0)Oq(l);l=f[j+8>>2]|0;if(l|0)Oq(l);f[q>>2]=c+72;f[k+8>>2]=f[i>>2];fg(m,s)|0;s=k+44|0;k=i+36|0;f[s>>2]=f[k>>2];f[s+4>>2]=f[k+4>>2];f[s+8>>2]=f[k+8>>2];f[s+12>>2]=f[k+12>>2];b[s+16>>0]=b[k+16>>0]|0;ng(n,f[w>>2]|0,f[x>>2]|0);f[a>>2]=r;r=f[w>>2]|0;if(r|0){w=f[x>>2]|0;if((w|0)!=(r|0))f[x>>2]=w+(~((w+-4-r|0)>>>2)<<2);Oq(r)}f[v>>2]=3636;v=f[i+24>>2]|0;if(v|0)Oq(v);v=f[i+12>>2]|0;if(v|0)Oq(v);f[h>>2]=3636;v=f[h+20>>2]|0;if(v|0)Oq(v);v=f[h+8>>2]|0;if(!v){u=e;return}Oq(v);u=e;return}function Wd(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=Oa,x=0,y=Oa,z=Oa,A=Oa;e=u;u=u+16|0;g=e;h=a+4|0;if((f[h>>2]|0)!=-1){i=0;u=e;return i|0}f[h>>2]=d;d=b[c+24>>0]|0;h=d<<24>>24;j=a+20|0;n[j>>2]=$(0.0);f[g>>2]=0;k=g+4|0;f[k>>2]=0;f[g+8>>2]=0;do if(d<<24>>24)if(d<<24>>24<0)aq(g);else{l=h<<2;m=ln(l)|0;f[g>>2]=m;o=m+(h<<2)|0;f[g+8>>2]=o;sj(m|0,0,l|0)|0;l=m+(h<<2)|0;f[k>>2]=l;p=m;q=l;r=o;break}else{p=0;q=0;r=0}while(0);k=a+8|0;g=f[k>>2]|0;o=a+12|0;if(!g)s=a+16|0;else{l=f[o>>2]|0;if((l|0)!=(g|0))f[o>>2]=l+(~((l+-4-g|0)>>>2)<<2);Oq(g);g=a+16|0;f[g>>2]=0;f[o>>2]=0;f[k>>2]=0;s=g}f[k>>2]=p;f[o>>2]=q;f[s>>2]=r;r=h>>>0>1073741823?-1:h<<2;s=Lq(r)|0;q=Lq(r)|0;r=c+48|0;o=f[r>>2]|0;g=c+40|0;a=f[g>>2]|0;l=f[c>>2]|0;kh(q|0,(f[l>>2]|0)+o|0,a|0)|0;kh(p|0,(f[l>>2]|0)+o|0,a|0)|0;a=r;r=f[a>>2]|0;o=f[a+4>>2]|0;a=g;g=f[a>>2]|0;l=f[a+4>>2]|0;a=f[c>>2]|0;kh(s|0,(f[a>>2]|0)+r|0,g|0)|0;p=f[c+80>>2]|0;a:do if(p>>>0>1){if(d<<24>>24<=0){c=1;while(1){m=un(g|0,l|0,c|0,0)|0;t=Vn(m|0,I|0,r|0,o|0)|0;kh(q|0,(f[a>>2]|0)+t|0,g|0)|0;c=c+1|0;if(c>>>0>=p>>>0)break a}}c=f[k>>2]|0;t=1;do{m=un(g|0,l|0,t|0,0)|0;v=Vn(m|0,I|0,r|0,o|0)|0;kh(q|0,(f[a>>2]|0)+v|0,g|0)|0;v=0;do{m=c+(v<<2)|0;w=$(n[m>>2]);x=q+(v<<2)|0;y=$(n[x>>2]);if(w>y){n[m>>2]=y;z=$(n[x>>2])}else z=y;x=s+(v<<2)|0;if($(n[x>>2])<z)n[x>>2]=z;v=v+1|0}while((v|0)!=(h|0));t=t+1|0}while(t>>>0<p>>>0)}while(0);if(d<<24>>24>0){d=f[k>>2]|0;k=0;z=$(n[j>>2]);while(1){y=$(n[s+(k<<2)>>2]);w=$(y-$(n[d+(k<<2)>>2]));if(w>z){n[j>>2]=w;A=w}else A=z;k=k+1|0;if((k|0)==(h|0))break;else z=A}}Mq(q);Mq(s);i=1;u=e;return i|0}function Xd(a,b,c,d,e,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0;g=a+8|0;Mh(g,b,d,e);h=d-e|0;if((h|0)>0){d=0-e|0;i=a+16|0;j=a+32|0;k=a+12|0;l=a+28|0;m=a+20|0;n=a+24|0;o=h;h=f[g>>2]|0;while(1){p=b+(o<<2)|0;q=c+(o<<2)|0;if((h|0)>0){r=0;s=p+(d<<2)|0;t=h;while(1){if((t|0)>0){u=0;do{v=f[s+(u<<2)>>2]|0;w=f[i>>2]|0;if((v|0)>(w|0)){x=f[j>>2]|0;f[x+(u<<2)>>2]=w;y=x}else{x=f[k>>2]|0;w=f[j>>2]|0;f[w+(u<<2)>>2]=(v|0)<(x|0)?x:v;y=w}u=u+1|0}while((u|0)<(f[g>>2]|0));z=y}else z=f[j>>2]|0;u=(f[p+(r<<2)>>2]|0)-(f[z+(r<<2)>>2]|0)|0;w=q+(r<<2)|0;f[w>>2]=u;if((u|0)>=(f[l>>2]|0)){if((u|0)>(f[n>>2]|0)){A=u-(f[m>>2]|0)|0;B=31}}else{A=(f[m>>2]|0)+u|0;B=31}if((B|0)==31){B=0;f[w>>2]=A}r=r+1|0;w=f[g>>2]|0;if((r|0)>=(w|0)){C=w;break}else{s=z;t=w}}}else C=h;o=o-e|0;if((o|0)<=0){D=C;break}else h=C}}else D=f[g>>2]|0;C=e>>>0>1073741823?-1:e<<2;e=Lq(C)|0;sj(e|0,0,C|0)|0;if((D|0)<=0){Mq(e);return 1}C=a+16|0;h=a+32|0;o=a+12|0;z=a+28|0;A=a+20|0;m=a+24|0;a=0;n=e;l=D;while(1){if((l|0)>0){D=0;do{j=f[n+(D<<2)>>2]|0;y=f[C>>2]|0;if((j|0)>(y|0)){k=f[h>>2]|0;f[k+(D<<2)>>2]=y;E=k}else{k=f[o>>2]|0;y=f[h>>2]|0;f[y+(D<<2)>>2]=(j|0)<(k|0)?k:j;E=y}D=D+1|0}while((D|0)<(f[g>>2]|0));F=E}else F=f[h>>2]|0;D=(f[b+(a<<2)>>2]|0)-(f[F+(a<<2)>>2]|0)|0;y=c+(a<<2)|0;f[y>>2]=D;if((D|0)>=(f[z>>2]|0)){if((D|0)>(f[m>>2]|0)){G=D-(f[A>>2]|0)|0;B=16}}else{G=(f[A>>2]|0)+D|0;B=16}if((B|0)==16){B=0;f[y>>2]=G}a=a+1|0;l=f[g>>2]|0;if((a|0)>=(l|0))break;else n=F}Mq(e);return 1}function Yd(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0;e=f[a>>2]|0;g=e;h=(f[b>>2]|0)-g|0;b=e+(h>>2<<2)|0;i=f[c>>2]|0;c=f[d>>2]|0;d=c-i|0;j=d>>2;k=i;l=c;if((d|0)<=0){m=b;return m|0}d=a+8|0;n=f[d>>2]|0;o=a+4|0;p=f[o>>2]|0;q=p;if((j|0)<=(n-q>>2|0)){r=b;s=q-r|0;t=s>>2;if((j|0)>(t|0)){u=k+(t<<2)|0;t=u;if((u|0)==(l|0))v=p;else{w=l+-4-t|0;x=u;u=p;while(1){f[u>>2]=f[x>>2];x=x+4|0;if((x|0)==(l|0))break;else u=u+4|0}u=p+((w>>>2)+1<<2)|0;f[o>>2]=u;v=u}if((s|0)>0){y=t;z=v}else{m=b;return m|0}}else{y=c;z=p}c=z-(b+(j<<2))>>2;v=b+(c<<2)|0;if(v>>>0<p>>>0){t=(p+(0-c<<2)+~r|0)>>>2;r=v;s=z;while(1){f[s>>2]=f[r>>2];r=r+4|0;if(r>>>0>=p>>>0)break;else s=s+4|0}f[o>>2]=z+(t+1<<2)}if(c|0){c=v;v=z;do{c=c+-4|0;v=v+-4|0;f[v>>2]=f[c>>2]}while((c|0)!=(b|0))}c=y;if((k|0)==(c|0)){m=b;return m|0}else{A=b;B=k}while(1){f[A>>2]=f[B>>2];B=B+4|0;if((B|0)==(c|0)){m=b;break}else A=A+4|0}return m|0}A=(q-g>>2)+j|0;if(A>>>0>1073741823)aq(a);j=n-g|0;g=j>>1;n=j>>2>>>0<536870911?(g>>>0<A>>>0?A:g):1073741823;g=b;A=h>>2;do if(n)if(n>>>0>1073741823){j=ra(8)|0;Oo(j,16035);f[j>>2]=7256;va(j|0,1112,110)}else{j=ln(n<<2)|0;C=j;D=j;break}else{C=0;D=0}while(0);j=D+(A<<2)|0;A=D+(n<<2)|0;if((l|0)==(k|0))E=j;else{n=((l+-4-i|0)>>>2)+1|0;i=k;k=j;while(1){f[k>>2]=f[i>>2];i=i+4|0;if((i|0)==(l|0))break;else k=k+4|0}E=j+(n<<2)|0}if((h|0)>0)kh(C|0,e|0,h|0)|0;h=q-g|0;if((h|0)>0){kh(E|0,b|0,h|0)|0;F=E+(h>>>2<<2)|0}else F=E;f[a>>2]=D;f[o>>2]=F;f[d>>2]=A;if(!e){m=j;return m|0}Oq(e);m=j;return m|0}function Zd(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0;c=u;u=u+48|0;d=c+40|0;e=c+36|0;g=c+32|0;h=c;i=a+60|0;ci(f[i>>2]|0,b)|0;wn(h);tk(h);j=f[a+56>>2]|0;k=f[i>>2]|0;i=k>>>5;l=j+(i<<2)|0;m=k&31;k=(i|0)!=0;a:do if(i|m|0){if(!m){n=1;o=j;p=k;while(1){if(p){q=n;r=0;while(1){s=(f[o>>2]&1<<r|0)!=0;fj(h,q^s^1);if((r|0)==31){t=s;break}else{q=s;r=r+1|0}}}else{r=n;q=0;while(1){s=(f[o>>2]&1<<q|0)!=0;fj(h,r^s^1);if((q|0)==31){t=s;break}else{r=s;q=q+1|0}}}o=o+4|0;if((l|0)==(o|0))break a;else{n=t;p=1}}}if(k){p=1;n=j;while(1){o=p;q=0;while(1){r=o;o=(f[n>>2]&1<<q|0)!=0;fj(h,r^o^1);if((q|0)==31)break;else q=q+1|0}q=n+4|0;if((l|0)==(q|0)){v=o;w=q;break}else{p=o;n=q}}}else{v=1;w=j}n=v;p=0;do{q=n;n=(f[w>>2]&1<<p|0)!=0;fj(h,q^n^1);p=p+1|0}while((p|0)!=(m|0))}while(0);ld(h,b);f[g>>2]=f[a+12>>2];m=b+16|0;w=m;v=f[w>>2]|0;j=f[w+4>>2]|0;if((j|0)>0|(j|0)==0&v>>>0>0){x=j;y=v}else{f[e>>2]=f[b+4>>2];f[d>>2]=f[e>>2];Me(b,d,g,g+4|0)|0;v=m;x=f[v+4>>2]|0;y=f[v>>2]|0}f[g>>2]=f[a+20>>2];if((x|0)>0|(x|0)==0&y>>>0>0){Fj(h);u=c;return 1}f[e>>2]=f[b+4>>2];f[d>>2]=f[e>>2];Me(b,d,g,g+4|0)|0;Fj(h);u=c;return 1}function _d(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0;switch(b-a>>2|0){case 2:{d=b+-4|0;e=f[d>>2]|0;g=f[a>>2]|0;h=f[c>>2]|0;i=f[h>>2]|0;j=(f[h+4>>2]|0)-i>>3;if(j>>>0<=e>>>0)aq(h);k=i;if(j>>>0<=g>>>0)aq(h);if((f[k+(e<<3)>>2]|0)>>>0>=(f[k+(g<<3)>>2]|0)>>>0){l=1;return l|0}f[a>>2]=e;f[d>>2]=g;l=1;return l|0}case 3:{Vg(a,a+4|0,b+-4|0,c)|0;l=1;return l|0}case 4:{jh(a,a+4|0,a+8|0,b+-4|0,c)|0;l=1;return l|0}case 5:{ig(a,a+4|0,a+8|0,a+12|0,b+-4|0,c)|0;l=1;return l|0}case 1:case 0:{l=1;return l|0}default:{g=a+8|0;Vg(a,a+4|0,g,c)|0;d=a+12|0;a:do if((d|0)!=(b|0)){e=f[c>>2]|0;k=f[e>>2]|0;h=(f[e+4>>2]|0)-k>>3;j=k;k=d;i=0;m=g;b:while(1){n=f[k>>2]|0;o=f[m>>2]|0;if(h>>>0<=n>>>0){p=14;break}if(h>>>0<=o>>>0){p=16;break}q=j+(n<<3)|0;if((f[q>>2]|0)>>>0<(f[j+(o<<3)>>2]|0)>>>0){r=m;s=k;t=o;while(1){f[s>>2]=t;if((r|0)==(a|0)){u=a;break}o=r+-4|0;t=f[o>>2]|0;if(h>>>0<=t>>>0){p=20;break b}if((f[q>>2]|0)>>>0>=(f[j+(t<<3)>>2]|0)>>>0){u=r;break}else{v=r;r=o;s=v}}f[u>>2]=n;s=i+1|0;if((s|0)==8){w=0;x=(k+4|0)==(b|0);break a}else y=s}else y=i;s=k+4|0;if((s|0)==(b|0)){w=1;x=0;break a}else{r=k;k=s;i=y;m=r}}if((p|0)==14)aq(e);else if((p|0)==16)aq(e);else if((p|0)==20)aq(e)}else{w=1;x=0}while(0);l=x|w;return l|0}}return 0}function $d(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0;c=u;u=u+48|0;d=c+40|0;e=c+36|0;g=c+32|0;h=c;i=a+80|0;ci(f[i>>2]|0,b)|0;wn(h);tk(h);j=f[a+76>>2]|0;k=f[i>>2]|0;i=k>>>5;l=j+(i<<2)|0;m=k&31;k=(i|0)!=0;a:do if(i|m|0){if(!m){n=1;o=j;p=k;while(1){if(p){q=n;r=0;while(1){s=(f[o>>2]&1<<r|0)!=0;fj(h,q^s^1);if((r|0)==31){t=s;break}else{q=s;r=r+1|0}}}else{r=n;q=0;while(1){s=(f[o>>2]&1<<q|0)!=0;fj(h,r^s^1);if((q|0)==31){t=s;break}else{r=s;q=q+1|0}}}o=o+4|0;if((l|0)==(o|0))break a;else{n=t;p=1}}}if(k){p=1;n=j;while(1){o=p;q=0;while(1){r=o;o=(f[n>>2]&1<<q|0)!=0;fj(h,r^o^1);if((q|0)==31)break;else q=q+1|0}q=n+4|0;if((l|0)==(q|0)){v=o;w=q;break}else{p=o;n=q}}}else{v=1;w=j}n=v;p=0;do{q=n;n=(f[w>>2]&1<<p|0)!=0;fj(h,q^n^1);p=p+1|0}while((p|0)!=(m|0))}while(0);ld(h,b);f[g>>2]=f[a+12>>2];m=b+16|0;w=m;v=f[w>>2]|0;j=f[w+4>>2]|0;if((j|0)>0|(j|0)==0&v>>>0>0){x=j;y=v}else{f[e>>2]=f[b+4>>2];f[d>>2]=f[e>>2];Me(b,d,g,g+4|0)|0;v=m;x=f[v+4>>2]|0;y=f[v>>2]|0}f[g>>2]=f[a+16>>2];if((x|0)>0|(x|0)==0&y>>>0>0){Fj(h);u=c;return 1}f[e>>2]=f[b+4>>2];f[d>>2]=f[e>>2];Me(b,d,g,g+4|0)|0;Fj(h);u=c;return 1}function ae(a,b,c,d,e,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0;h=u;u=u+16|0;i=h+4|0;j=h;f[a+72>>2]=e;f[a+64>>2]=g;g=Lq(e>>>0>1073741823?-1:e<<2)|0;k=a+68|0;l=f[k>>2]|0;f[k>>2]=g;if(l|0)Mq(l);l=a+8|0;Mh(l,b,d,e);d=a+56|0;g=f[d>>2]|0;m=f[g+4>>2]|0;n=f[g>>2]|0;o=m-n|0;if((o|0)<=0){u=h;return 1}p=(o>>>2)+-1|0;o=a+16|0;q=a+32|0;r=a+12|0;s=a+28|0;t=a+20|0;v=a+24|0;if(m-n>>2>>>0>p>>>0){w=p;x=n}else{y=g;aq(y)}while(1){f[j>>2]=f[x+(w<<2)>>2];f[i>>2]=f[j>>2];Dc(a,i,b,w);g=X(w,e)|0;n=b+(g<<2)|0;p=c+(g<<2)|0;g=f[l>>2]|0;if((g|0)>0){m=0;z=f[k>>2]|0;A=g;while(1){if((A|0)>0){g=0;do{B=f[z+(g<<2)>>2]|0;C=f[o>>2]|0;if((B|0)>(C|0)){D=f[q>>2]|0;f[D+(g<<2)>>2]=C;E=D}else{D=f[r>>2]|0;C=f[q>>2]|0;f[C+(g<<2)>>2]=(B|0)<(D|0)?D:B;E=C}g=g+1|0}while((g|0)<(f[l>>2]|0));F=E}else F=f[q>>2]|0;g=(f[n+(m<<2)>>2]|0)-(f[F+(m<<2)>>2]|0)|0;C=p+(m<<2)|0;f[C>>2]=g;if((g|0)>=(f[s>>2]|0)){if((g|0)>(f[v>>2]|0)){G=g-(f[t>>2]|0)|0;H=21}}else{G=(f[t>>2]|0)+g|0;H=21}if((H|0)==21){H=0;f[C>>2]=G}m=m+1|0;A=f[l>>2]|0;if((m|0)>=(A|0))break;else z=F}}w=w+-1|0;if((w|0)<=-1){H=5;break}z=f[d>>2]|0;x=f[z>>2]|0;if((f[z+4>>2]|0)-x>>2>>>0<=w>>>0){y=z;H=6;break}}if((H|0)==5){u=h;return 1}else if((H|0)==6)aq(y);return 0}\nfunction $a(a){a=a|0;var b=0,c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0;b=u;u=u+16|0;c=b;do if(a>>>0<245){d=a>>>0<11?16:a+11&-8;e=d>>>3;g=f[4784]|0;h=g>>>e;if(h&3|0){i=(h&1^1)+e|0;j=19176+(i<<1<<2)|0;k=j+8|0;l=f[k>>2]|0;m=l+8|0;n=f[m>>2]|0;if((n|0)==(j|0))f[4784]=g&~(1<<i);else{f[n+12>>2]=j;f[k>>2]=n}n=i<<3;f[l+4>>2]=n|3;i=l+n+4|0;f[i>>2]=f[i>>2]|1;o=m;u=b;return o|0}m=f[4786]|0;if(d>>>0>m>>>0){if(h|0){i=2<<e;n=h<<e&(i|0-i);i=(n&0-n)+-1|0;n=i>>>12&16;e=i>>>n;i=e>>>5&8;h=e>>>i;e=h>>>2&4;l=h>>>e;h=l>>>1&2;k=l>>>h;l=k>>>1&1;j=(i|n|e|h|l)+(k>>>l)|0;l=19176+(j<<1<<2)|0;k=l+8|0;h=f[k>>2]|0;e=h+8|0;n=f[e>>2]|0;if((n|0)==(l|0)){i=g&~(1<<j);f[4784]=i;p=i}else{f[n+12>>2]=l;f[k>>2]=n;p=g}n=j<<3;j=n-d|0;f[h+4>>2]=d|3;k=h+d|0;f[k+4>>2]=j|1;f[h+n>>2]=j;if(m|0){n=f[4789]|0;h=m>>>3;l=19176+(h<<1<<2)|0;i=1<<h;if(!(p&i)){f[4784]=p|i;q=l;r=l+8|0}else{i=l+8|0;q=f[i>>2]|0;r=i}f[r>>2]=n;f[q+12>>2]=n;f[n+8>>2]=q;f[n+12>>2]=l}f[4786]=j;f[4789]=k;o=e;u=b;return o|0}e=f[4785]|0;if(e){k=(e&0-e)+-1|0;j=k>>>12&16;l=k>>>j;k=l>>>5&8;n=l>>>k;l=n>>>2&4;i=n>>>l;n=i>>>1&2;h=i>>>n;i=h>>>1&1;s=f[19440+((k|j|l|n|i)+(h>>>i)<<2)>>2]|0;i=(f[s+4>>2]&-8)-d|0;h=f[s+16+(((f[s+16>>2]|0)==0&1)<<2)>>2]|0;if(!h){t=s;v=i}else{n=s;s=i;i=h;while(1){h=(f[i+4>>2]&-8)-d|0;l=h>>>0<s>>>0;j=l?h:s;h=l?i:n;i=f[i+16+(((f[i+16>>2]|0)==0&1)<<2)>>2]|0;if(!i){t=h;v=j;break}else{n=h;s=j}}}s=t+d|0;if(s>>>0>t>>>0){n=f[t+24>>2]|0;i=f[t+12>>2]|0;do if((i|0)==(t|0)){j=t+20|0;h=f[j>>2]|0;if(!h){l=t+16|0;k=f[l>>2]|0;if(!k){w=0;break}else{x=k;y=l}}else{x=h;y=j}while(1){j=x+20|0;h=f[j>>2]|0;if(h|0){x=h;y=j;continue}j=x+16|0;h=f[j>>2]|0;if(!h)break;else{x=h;y=j}}f[y>>2]=0;w=x}else{j=f[t+8>>2]|0;f[j+12>>2]=i;f[i+8>>2]=j;w=i}while(0);do if(n|0){i=f[t+28>>2]|0;j=19440+(i<<2)|0;if((t|0)==(f[j>>2]|0)){f[j>>2]=w;if(!w){f[4785]=e&~(1<<i);break}}else{f[n+16+(((f[n+16>>2]|0)!=(t|0)&1)<<2)>>2]=w;if(!w)break}f[w+24>>2]=n;i=f[t+16>>2]|0;if(i|0){f[w+16>>2]=i;f[i+24>>2]=w}i=f[t+20>>2]|0;if(i|0){f[w+20>>2]=i;f[i+24>>2]=w}}while(0);if(v>>>0<16){n=v+d|0;f[t+4>>2]=n|3;e=t+n+4|0;f[e>>2]=f[e>>2]|1}else{f[t+4>>2]=d|3;f[s+4>>2]=v|1;f[s+v>>2]=v;if(m|0){e=f[4789]|0;n=m>>>3;i=19176+(n<<1<<2)|0;j=1<<n;if(!(g&j)){f[4784]=g|j;z=i;A=i+8|0}else{j=i+8|0;z=f[j>>2]|0;A=j}f[A>>2]=e;f[z+12>>2]=e;f[e+8>>2]=z;f[e+12>>2]=i}f[4786]=v;f[4789]=s}o=t+8|0;u=b;return o|0}else B=d}else B=d}else B=d}else if(a>>>0<=4294967231){i=a+11|0;e=i&-8;j=f[4785]|0;if(j){n=0-e|0;h=i>>>8;if(h)if(e>>>0>16777215)C=31;else{i=(h+1048320|0)>>>16&8;l=h<<i;h=(l+520192|0)>>>16&4;k=l<<h;l=(k+245760|0)>>>16&2;D=14-(h|i|l)+(k<<l>>>15)|0;C=e>>>(D+7|0)&1|D<<1}else C=0;D=f[19440+(C<<2)>>2]|0;a:do if(!D){E=0;F=0;G=n;H=57}else{l=0;k=n;i=D;h=e<<((C|0)==31?0:25-(C>>>1)|0);I=0;while(1){J=(f[i+4>>2]&-8)-e|0;if(J>>>0<k>>>0)if(!J){K=0;L=i;M=i;H=61;break a}else{N=i;O=J}else{N=l;O=k}J=f[i+20>>2]|0;i=f[i+16+(h>>>31<<2)>>2]|0;P=(J|0)==0|(J|0)==(i|0)?I:J;J=(i|0)==0;if(J){E=P;F=N;G=O;H=57;break}else{l=N;k=O;h=h<<((J^1)&1);I=P}}}while(0);if((H|0)==57){if((E|0)==0&(F|0)==0){D=2<<C;n=j&(D|0-D);if(!n){B=e;break}D=(n&0-n)+-1|0;n=D>>>12&16;d=D>>>n;D=d>>>5&8;s=d>>>D;d=s>>>2&4;g=s>>>d;s=g>>>1&2;m=g>>>s;g=m>>>1&1;Q=0;R=f[19440+((D|n|d|s|g)+(m>>>g)<<2)>>2]|0}else{Q=F;R=E}if(!R){S=Q;T=G}else{K=G;L=R;M=Q;H=61}}if((H|0)==61)while(1){H=0;g=(f[L+4>>2]&-8)-e|0;m=g>>>0<K>>>0;s=m?g:K;g=m?L:M;L=f[L+16+(((f[L+16>>2]|0)==0&1)<<2)>>2]|0;if(!L){S=g;T=s;break}else{K=s;M=g;H=61}}if((S|0)!=0?T>>>0<((f[4786]|0)-e|0)>>>0:0){g=S+e|0;if(g>>>0<=S>>>0){o=0;u=b;return o|0}s=f[S+24>>2]|0;m=f[S+12>>2]|0;do if((m|0)==(S|0)){d=S+20|0;n=f[d>>2]|0;if(!n){D=S+16|0;I=f[D>>2]|0;if(!I){U=0;break}else{V=I;W=D}}else{V=n;W=d}while(1){d=V+20|0;n=f[d>>2]|0;if(n|0){V=n;W=d;continue}d=V+16|0;n=f[d>>2]|0;if(!n)break;else{V=n;W=d}}f[W>>2]=0;U=V}else{d=f[S+8>>2]|0;f[d+12>>2]=m;f[m+8>>2]=d;U=m}while(0);do if(s){m=f[S+28>>2]|0;d=19440+(m<<2)|0;if((S|0)==(f[d>>2]|0)){f[d>>2]=U;if(!U){d=j&~(1<<m);f[4785]=d;X=d;break}}else{f[s+16+(((f[s+16>>2]|0)!=(S|0)&1)<<2)>>2]=U;if(!U){X=j;break}}f[U+24>>2]=s;d=f[S+16>>2]|0;if(d|0){f[U+16>>2]=d;f[d+24>>2]=U}d=f[S+20>>2]|0;if(d){f[U+20>>2]=d;f[d+24>>2]=U;X=j}else X=j}else X=j;while(0);do if(T>>>0>=16){f[S+4>>2]=e|3;f[g+4>>2]=T|1;f[g+T>>2]=T;j=T>>>3;if(T>>>0<256){s=19176+(j<<1<<2)|0;d=f[4784]|0;m=1<<j;if(!(d&m)){f[4784]=d|m;Y=s;Z=s+8|0}else{m=s+8|0;Y=f[m>>2]|0;Z=m}f[Z>>2]=g;f[Y+12>>2]=g;f[g+8>>2]=Y;f[g+12>>2]=s;break}s=T>>>8;if(s)if(T>>>0>16777215)_=31;else{m=(s+1048320|0)>>>16&8;d=s<<m;s=(d+520192|0)>>>16&4;j=d<<s;d=(j+245760|0)>>>16&2;n=14-(s|m|d)+(j<<d>>>15)|0;_=T>>>(n+7|0)&1|n<<1}else _=0;n=19440+(_<<2)|0;f[g+28>>2]=_;d=g+16|0;f[d+4>>2]=0;f[d>>2]=0;d=1<<_;if(!(X&d)){f[4785]=X|d;f[n>>2]=g;f[g+24>>2]=n;f[g+12>>2]=g;f[g+8>>2]=g;break}d=T<<((_|0)==31?0:25-(_>>>1)|0);j=f[n>>2]|0;while(1){if((f[j+4>>2]&-8|0)==(T|0)){H=97;break}$=j+16+(d>>>31<<2)|0;n=f[$>>2]|0;if(!n){H=96;break}else{d=d<<1;j=n}}if((H|0)==96){f[$>>2]=g;f[g+24>>2]=j;f[g+12>>2]=g;f[g+8>>2]=g;break}else if((H|0)==97){d=j+8|0;n=f[d>>2]|0;f[n+12>>2]=g;f[d>>2]=g;f[g+8>>2]=n;f[g+12>>2]=j;f[g+24>>2]=0;break}}else{n=T+e|0;f[S+4>>2]=n|3;d=S+n+4|0;f[d>>2]=f[d>>2]|1}while(0);o=S+8|0;u=b;return o|0}else B=e}else B=e}else B=-1;while(0);S=f[4786]|0;if(S>>>0>=B>>>0){T=S-B|0;$=f[4789]|0;if(T>>>0>15){_=$+B|0;f[4789]=_;f[4786]=T;f[_+4>>2]=T|1;f[$+S>>2]=T;f[$+4>>2]=B|3}else{f[4786]=0;f[4789]=0;f[$+4>>2]=S|3;T=$+S+4|0;f[T>>2]=f[T>>2]|1}o=$+8|0;u=b;return o|0}$=f[4787]|0;if($>>>0>B>>>0){T=$-B|0;f[4787]=T;S=f[4790]|0;_=S+B|0;f[4790]=_;f[_+4>>2]=T|1;f[S+4>>2]=B|3;o=S+8|0;u=b;return o|0}if(!(f[4902]|0)){f[4904]=4096;f[4903]=4096;f[4905]=-1;f[4906]=-1;f[4907]=0;f[4895]=0;f[4902]=c&-16^1431655768;aa=4096}else aa=f[4904]|0;c=B+48|0;S=B+47|0;T=aa+S|0;_=0-aa|0;aa=T&_;if(aa>>>0<=B>>>0){o=0;u=b;return o|0}X=f[4894]|0;if(X|0?(Y=f[4892]|0,Z=Y+aa|0,Z>>>0<=Y>>>0|Z>>>0>X>>>0):0){o=0;u=b;return o|0}b:do if(!(f[4895]&4)){X=f[4790]|0;c:do if(X){Z=19584;while(1){Y=f[Z>>2]|0;if(Y>>>0<=X>>>0?(ba=Z+4|0,(Y+(f[ba>>2]|0)|0)>>>0>X>>>0):0)break;Y=f[Z+8>>2]|0;if(!Y){H=118;break c}else Z=Y}j=T-$&_;if(j>>>0<2147483647){Y=Nl(j|0)|0;if((Y|0)==((f[Z>>2]|0)+(f[ba>>2]|0)|0))if((Y|0)==(-1|0))ca=j;else{da=j;ea=Y;H=135;break b}else{fa=Y;ga=j;H=126}}else ca=0}else H=118;while(0);do if((H|0)==118){X=Nl(0)|0;if((X|0)!=(-1|0)?(e=X,j=f[4903]|0,Y=j+-1|0,U=((Y&e|0)==0?0:(Y+e&0-j)-e|0)+aa|0,e=f[4892]|0,j=U+e|0,U>>>0>B>>>0&U>>>0<2147483647):0){Y=f[4894]|0;if(Y|0?j>>>0<=e>>>0|j>>>0>Y>>>0:0){ca=0;break}Y=Nl(U|0)|0;if((Y|0)==(X|0)){da=U;ea=X;H=135;break b}else{fa=Y;ga=U;H=126}}else ca=0}while(0);do if((H|0)==126){U=0-ga|0;if(!(c>>>0>ga>>>0&(ga>>>0<2147483647&(fa|0)!=(-1|0))))if((fa|0)==(-1|0)){ca=0;break}else{da=ga;ea=fa;H=135;break b}Y=f[4904]|0;X=S-ga+Y&0-Y;if(X>>>0>=2147483647){da=ga;ea=fa;H=135;break b}if((Nl(X|0)|0)==(-1|0)){Nl(U|0)|0;ca=0;break}else{da=X+ga|0;ea=fa;H=135;break b}}while(0);f[4895]=f[4895]|4;ha=ca;H=133}else{ha=0;H=133}while(0);if(((H|0)==133?aa>>>0<2147483647:0)?(ca=Nl(aa|0)|0,aa=Nl(0)|0,fa=aa-ca|0,ga=fa>>>0>(B+40|0)>>>0,!((ca|0)==(-1|0)|ga^1|ca>>>0<aa>>>0&((ca|0)!=(-1|0)&(aa|0)!=(-1|0))^1)):0){da=ga?fa:ha;ea=ca;H=135}if((H|0)==135){ca=(f[4892]|0)+da|0;f[4892]=ca;if(ca>>>0>(f[4893]|0)>>>0)f[4893]=ca;ca=f[4790]|0;do if(ca){ha=19584;while(1){ia=f[ha>>2]|0;ja=ha+4|0;ka=f[ja>>2]|0;if((ea|0)==(ia+ka|0)){H=143;break}fa=f[ha+8>>2]|0;if(!fa)break;else ha=fa}if(((H|0)==143?(f[ha+12>>2]&8|0)==0:0)?ea>>>0>ca>>>0&ia>>>0<=ca>>>0:0){f[ja>>2]=ka+da;fa=(f[4787]|0)+da|0;ga=ca+8|0;aa=(ga&7|0)==0?0:0-ga&7;ga=ca+aa|0;S=fa-aa|0;f[4790]=ga;f[4787]=S;f[ga+4>>2]=S|1;f[ca+fa+4>>2]=40;f[4791]=f[4906];break}if(ea>>>0<(f[4788]|0)>>>0)f[4788]=ea;fa=ea+da|0;S=19584;while(1){if((f[S>>2]|0)==(fa|0)){H=151;break}ga=f[S+8>>2]|0;if(!ga){la=19584;break}else S=ga}if((H|0)==151)if(!(f[S+12>>2]&8)){f[S>>2]=ea;ha=S+4|0;f[ha>>2]=(f[ha>>2]|0)+da;ha=ea+8|0;ga=ea+((ha&7|0)==0?0:0-ha&7)|0;ha=fa+8|0;aa=fa+((ha&7|0)==0?0:0-ha&7)|0;ha=ga+B|0;c=aa-ga-B|0;f[ga+4>>2]=B|3;do if((ca|0)!=(aa|0)){if((f[4789]|0)==(aa|0)){ba=(f[4786]|0)+c|0;f[4786]=ba;f[4789]=ha;f[ha+4>>2]=ba|1;f[ha+ba>>2]=ba;break}ba=f[aa+4>>2]|0;if((ba&3|0)==1){_=ba&-8;$=ba>>>3;d:do if(ba>>>0<256){T=f[aa+8>>2]|0;X=f[aa+12>>2]|0;if((X|0)==(T|0)){f[4784]=f[4784]&~(1<<$);break}else{f[T+12>>2]=X;f[X+8>>2]=T;break}}else{T=f[aa+24>>2]|0;X=f[aa+12>>2]|0;do if((X|0)==(aa|0)){U=aa+16|0;Y=U+4|0;j=f[Y>>2]|0;if(!j){e=f[U>>2]|0;if(!e){ma=0;break}else{na=e;oa=U}}else{na=j;oa=Y}while(1){Y=na+20|0;j=f[Y>>2]|0;if(j|0){na=j;oa=Y;continue}Y=na+16|0;j=f[Y>>2]|0;if(!j)break;else{na=j;oa=Y}}f[oa>>2]=0;ma=na}else{Y=f[aa+8>>2]|0;f[Y+12>>2]=X;f[X+8>>2]=Y;ma=X}while(0);if(!T)break;X=f[aa+28>>2]|0;Y=19440+(X<<2)|0;do if((f[Y>>2]|0)!=(aa|0)){f[T+16+(((f[T+16>>2]|0)!=(aa|0)&1)<<2)>>2]=ma;if(!ma)break d}else{f[Y>>2]=ma;if(ma|0)break;f[4785]=f[4785]&~(1<<X);break d}while(0);f[ma+24>>2]=T;X=aa+16|0;Y=f[X>>2]|0;if(Y|0){f[ma+16>>2]=Y;f[Y+24>>2]=ma}Y=f[X+4>>2]|0;if(!Y)break;f[ma+20>>2]=Y;f[Y+24>>2]=ma}while(0);pa=aa+_|0;qa=_+c|0}else{pa=aa;qa=c}$=pa+4|0;f[$>>2]=f[$>>2]&-2;f[ha+4>>2]=qa|1;f[ha+qa>>2]=qa;$=qa>>>3;if(qa>>>0<256){ba=19176+($<<1<<2)|0;Z=f[4784]|0;Y=1<<$;if(!(Z&Y)){f[4784]=Z|Y;ra=ba;sa=ba+8|0}else{Y=ba+8|0;ra=f[Y>>2]|0;sa=Y}f[sa>>2]=ha;f[ra+12>>2]=ha;f[ha+8>>2]=ra;f[ha+12>>2]=ba;break}ba=qa>>>8;do if(!ba)ta=0;else{if(qa>>>0>16777215){ta=31;break}Y=(ba+1048320|0)>>>16&8;Z=ba<<Y;$=(Z+520192|0)>>>16&4;X=Z<<$;Z=(X+245760|0)>>>16&2;j=14-($|Y|Z)+(X<<Z>>>15)|0;ta=qa>>>(j+7|0)&1|j<<1}while(0);ba=19440+(ta<<2)|0;f[ha+28>>2]=ta;_=ha+16|0;f[_+4>>2]=0;f[_>>2]=0;_=f[4785]|0;j=1<<ta;if(!(_&j)){f[4785]=_|j;f[ba>>2]=ha;f[ha+24>>2]=ba;f[ha+12>>2]=ha;f[ha+8>>2]=ha;break}j=qa<<((ta|0)==31?0:25-(ta>>>1)|0);_=f[ba>>2]|0;while(1){if((f[_+4>>2]&-8|0)==(qa|0)){H=192;break}ua=_+16+(j>>>31<<2)|0;ba=f[ua>>2]|0;if(!ba){H=191;break}else{j=j<<1;_=ba}}if((H|0)==191){f[ua>>2]=ha;f[ha+24>>2]=_;f[ha+12>>2]=ha;f[ha+8>>2]=ha;break}else if((H|0)==192){j=_+8|0;ba=f[j>>2]|0;f[ba+12>>2]=ha;f[j>>2]=ha;f[ha+8>>2]=ba;f[ha+12>>2]=_;f[ha+24>>2]=0;break}}else{ba=(f[4787]|0)+c|0;f[4787]=ba;f[4790]=ha;f[ha+4>>2]=ba|1}while(0);o=ga+8|0;u=b;return o|0}else la=19584;while(1){ha=f[la>>2]|0;if(ha>>>0<=ca>>>0?(va=ha+(f[la+4>>2]|0)|0,va>>>0>ca>>>0):0)break;la=f[la+8>>2]|0}ga=va+-47|0;ha=ga+8|0;c=ga+((ha&7|0)==0?0:0-ha&7)|0;ha=ca+16|0;ga=c>>>0<ha>>>0?ca:c;c=ga+8|0;aa=da+-40|0;fa=ea+8|0;S=(fa&7|0)==0?0:0-fa&7;fa=ea+S|0;ba=aa-S|0;f[4790]=fa;f[4787]=ba;f[fa+4>>2]=ba|1;f[ea+aa+4>>2]=40;f[4791]=f[4906];aa=ga+4|0;f[aa>>2]=27;f[c>>2]=f[4896];f[c+4>>2]=f[4897];f[c+8>>2]=f[4898];f[c+12>>2]=f[4899];f[4896]=ea;f[4897]=da;f[4899]=0;f[4898]=c;c=ga+24|0;do{ba=c;c=c+4|0;f[c>>2]=7}while((ba+8|0)>>>0<va>>>0);if((ga|0)!=(ca|0)){c=ga-ca|0;f[aa>>2]=f[aa>>2]&-2;f[ca+4>>2]=c|1;f[ga>>2]=c;ba=c>>>3;if(c>>>0<256){fa=19176+(ba<<1<<2)|0;S=f[4784]|0;j=1<<ba;if(!(S&j)){f[4784]=S|j;wa=fa;xa=fa+8|0}else{j=fa+8|0;wa=f[j>>2]|0;xa=j}f[xa>>2]=ca;f[wa+12>>2]=ca;f[ca+8>>2]=wa;f[ca+12>>2]=fa;break}fa=c>>>8;if(fa)if(c>>>0>16777215)ya=31;else{j=(fa+1048320|0)>>>16&8;S=fa<<j;fa=(S+520192|0)>>>16&4;ba=S<<fa;S=(ba+245760|0)>>>16&2;Z=14-(fa|j|S)+(ba<<S>>>15)|0;ya=c>>>(Z+7|0)&1|Z<<1}else ya=0;Z=19440+(ya<<2)|0;f[ca+28>>2]=ya;f[ca+20>>2]=0;f[ha>>2]=0;S=f[4785]|0;ba=1<<ya;if(!(S&ba)){f[4785]=S|ba;f[Z>>2]=ca;f[ca+24>>2]=Z;f[ca+12>>2]=ca;f[ca+8>>2]=ca;break}ba=c<<((ya|0)==31?0:25-(ya>>>1)|0);S=f[Z>>2]|0;while(1){if((f[S+4>>2]&-8|0)==(c|0)){H=213;break}za=S+16+(ba>>>31<<2)|0;Z=f[za>>2]|0;if(!Z){H=212;break}else{ba=ba<<1;S=Z}}if((H|0)==212){f[za>>2]=ca;f[ca+24>>2]=S;f[ca+12>>2]=ca;f[ca+8>>2]=ca;break}else if((H|0)==213){ba=S+8|0;c=f[ba>>2]|0;f[c+12>>2]=ca;f[ba>>2]=ca;f[ca+8>>2]=c;f[ca+12>>2]=S;f[ca+24>>2]=0;break}}}else{c=f[4788]|0;if((c|0)==0|ea>>>0<c>>>0)f[4788]=ea;f[4896]=ea;f[4897]=da;f[4899]=0;f[4793]=f[4902];f[4792]=-1;f[4797]=19176;f[4796]=19176;f[4799]=19184;f[4798]=19184;f[4801]=19192;f[4800]=19192;f[4803]=19200;f[4802]=19200;f[4805]=19208;f[4804]=19208;f[4807]=19216;f[4806]=19216;f[4809]=19224;f[4808]=19224;f[4811]=19232;f[4810]=19232;f[4813]=19240;f[4812]=19240;f[4815]=19248;f[4814]=19248;f[4817]=19256;f[4816]=19256;f[4819]=19264;f[4818]=19264;f[4821]=19272;f[4820]=19272;f[4823]=19280;f[4822]=19280;f[4825]=19288;f[4824]=19288;f[4827]=19296;f[4826]=19296;f[4829]=19304;f[4828]=19304;f[4831]=19312;f[4830]=19312;f[4833]=19320;f[4832]=19320;f[4835]=19328;f[4834]=19328;f[4837]=19336;f[4836]=19336;f[4839]=19344;f[4838]=19344;f[4841]=19352;f[4840]=19352;f[4843]=19360;f[4842]=19360;f[4845]=19368;f[4844]=19368;f[4847]=19376;f[4846]=19376;f[4849]=19384;f[4848]=19384;f[4851]=19392;f[4850]=19392;f[4853]=19400;f[4852]=19400;f[4855]=19408;f[4854]=19408;f[4857]=19416;f[4856]=19416;f[4859]=19424;f[4858]=19424;c=da+-40|0;ba=ea+8|0;ha=(ba&7|0)==0?0:0-ba&7;ba=ea+ha|0;ga=c-ha|0;f[4790]=ba;f[4787]=ga;f[ba+4>>2]=ga|1;f[ea+c+4>>2]=40;f[4791]=f[4906]}while(0);ea=f[4787]|0;if(ea>>>0>B>>>0){da=ea-B|0;f[4787]=da;ea=f[4790]|0;ca=ea+B|0;f[4790]=ca;f[ca+4>>2]=da|1;f[ea+4>>2]=B|3;o=ea+8|0;u=b;return o|0}}ea=Vq()|0;f[ea>>2]=12;o=0;u=b;return o|0}function ab(a,c,d,e,g,i){a=a|0;c=c|0;d=d|0;e=e|0;g=g|0;i=i|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ja=0,Ka=0,La=0,Ma=0,Na=0,Oa=0,Pa=0,Qa=0,Ra=0,Sa=0,Ta=0,Ua=0,Va=0.0,Wa=0.0,Xa=0.0,Ya=0,Za=0,_a=0,$a=0,ab=0,bb=0,cb=0,db=0,eb=0,fb=0,gb=0,hb=0,ib=0,jb=0,kb=0,lb=0,mb=0,nb=0,ob=0,pb=0,qb=0,rb=0,sb=0,tb=0,ub=0,vb=0,wb=0,xb=0,yb=0,zb=0,Ab=0,Bb=0,Cb=0,Db=0,Eb=0,Fb=0,Gb=0,Hb=0,Ib=0,Jb=0,Kb=0,Lb=0,Mb=0,Nb=0,Ob=0;i=u;u=u+240|0;j=i+104|0;k=i+224|0;l=i+176|0;m=i+160|0;n=i+228|0;o=i+72|0;p=i+40|0;q=i+132|0;r=i;s=i+172|0;t=i+156|0;v=i+152|0;w=i+148|0;x=i+144|0;y=i+128|0;z=a+8|0;Mh(z,c,e,g);e=f[a+48>>2]|0;A=f[a+52>>2]|0;B=l;C=B+48|0;do{f[B>>2]=0;B=B+4|0}while((B|0)<(C|0));if(!g){D=0;E=0}else{Ci(l,g);D=f[l+12>>2]|0;E=f[l+16>>2]|0}B=l+16|0;C=E-D>>2;F=D;D=E;if(C>>>0>=g>>>0){if(C>>>0>g>>>0?(E=F+(g<<2)|0,(E|0)!=(D|0)):0)f[B>>2]=D+(~((D+-4-E|0)>>>2)<<2)}else Ci(l+12|0,g-C|0);C=l+24|0;E=l+28|0;D=f[E>>2]|0;B=f[C>>2]|0;F=D-B>>2;G=B;B=D;if(F>>>0>=g>>>0){if(F>>>0>g>>>0?(D=G+(g<<2)|0,(D|0)!=(B|0)):0)f[E>>2]=B+(~((B+-4-D|0)>>>2)<<2)}else Ci(C,g-F|0);F=l+36|0;C=l+40|0;D=f[C>>2]|0;B=f[F>>2]|0;E=D-B>>2;G=B;B=D;if(E>>>0>=g>>>0){if(E>>>0>g>>>0?(D=G+(g<<2)|0,(D|0)!=(B|0)):0)f[C>>2]=B+(~((B+-4-D|0)>>>2)<<2)}else Ci(F,g-E|0);f[m>>2]=0;E=m+4|0;f[E>>2]=0;f[m+8>>2]=0;F=(g|0)==0;do if(!F)if(g>>>0>1073741823)aq(m);else{D=g<<2;B=ln(D)|0;f[m>>2]=B;C=B+(g<<2)|0;f[m+8>>2]=C;sj(B|0,0,D|0)|0;f[E>>2]=C;break}while(0);C=a+152|0;D=a+156|0;B=f[D>>2]|0;G=f[C>>2]|0;H=B-G>>2;L=G;G=B;if(H>>>0>=g>>>0){if(H>>>0>g>>>0?(B=L+(g<<2)|0,(B|0)!=(G|0)):0)f[D>>2]=G+(~((G+-4-B|0)>>>2)<<2)}else Ci(C,g-H|0);f[o>>2]=0;f[o+4>>2]=0;f[o+8>>2]=0;f[o+12>>2]=0;f[o+16>>2]=0;f[o+20>>2]=0;f[o+24>>2]=0;f[o+28>>2]=0;f[p>>2]=0;f[p+4>>2]=0;f[p+8>>2]=0;f[p+12>>2]=0;f[p+16>>2]=0;f[p+20>>2]=0;f[p+24>>2]=0;f[p+28>>2]=0;f[q>>2]=0;H=q+4|0;f[H>>2]=0;f[q+8>>2]=0;if(F){M=0;N=0;O=0;P=0}else{F=g<<2;B=ln(F)|0;f[q>>2]=B;G=B+(g<<2)|0;f[q+8>>2]=G;sj(B|0,0,F|0)|0;f[H>>2]=G;M=B;N=G;O=G;P=B}B=a+56|0;G=f[B>>2]|0;F=f[G+4>>2]|0;D=f[G>>2]|0;L=F-D|0;a:do if((L|0)>4){Q=L>>2;R=e+64|0;S=e+28|0;T=(g|0)>0;U=r+4|0;V=r+8|0;Z=r+12|0;_=a+152|0;$=a+112|0;aa=r+16|0;ba=r+28|0;ca=a+16|0;da=a+32|0;ea=a+12|0;fa=a+28|0;ga=a+20|0;ha=a+24|0;ia=r+28|0;ja=r+16|0;ka=r+20|0;la=r+32|0;ma=n+1|0;na=g<<2;oa=(g|0)==1;pa=Q+-1|0;if(F-D>>2>>>0>pa>>>0){qa=Q;ra=pa;sa=D;ta=P;ua=O;va=M;wa=M;xa=N;ya=M;za=N}else{Aa=G;aq(Aa)}b:while(1){pa=f[sa+(ra<<2)>>2]|0;Q=(((pa>>>0)%3|0|0)==0?2:-1)+pa|0;Ba=Q>>>5;Ca=1<<(Q&31);Da=(pa|0)==-1|(Q|0)==-1;Ea=1;Fa=0;Ga=pa;c:while(1){Ha=Ea^1;Ia=Fa;Ja=Ga;while(1){if((Ja|0)==-1){Ka=Ia;break c}La=f[l+(Ia*12|0)>>2]|0;if(((f[(f[e>>2]|0)+(Ja>>>5<<2)>>2]&1<<(Ja&31)|0)==0?(Ma=f[(f[(f[R>>2]|0)+12>>2]|0)+(Ja<<2)>>2]|0,(Ma|0)!=-1):0)?(Na=f[S>>2]|0,Oa=f[A>>2]|0,Pa=f[Oa+(f[Na+(Ma<<2)>>2]<<2)>>2]|0,Qa=Ma+1|0,Ra=f[Oa+(f[Na+((((Qa>>>0)%3|0|0)==0?Ma+-2|0:Qa)<<2)>>2]<<2)>>2]|0,Qa=f[Oa+(f[Na+((((Ma>>>0)%3|0|0)==0?2:-1)+Ma<<2)>>2]<<2)>>2]|0,(Pa|0)<(ra|0)&(Ra|0)<(ra|0)&(Qa|0)<(ra|0)):0){Ma=X(Pa,g)|0;Pa=X(Ra,g)|0;Ra=X(Qa,g)|0;if(T){Qa=0;do{f[La+(Qa<<2)>>2]=(f[c+(Qa+Ra<<2)>>2]|0)+(f[c+(Qa+Pa<<2)>>2]|0)-(f[c+(Qa+Ma<<2)>>2]|0);Qa=Qa+1|0}while((Qa|0)!=(g|0))}Qa=Ia+1|0;if((Qa|0)==4){Ka=4;break c}else Sa=Qa}else Sa=Ia;do if(Ea){Qa=Ja+1|0;Ma=((Qa>>>0)%3|0|0)==0?Ja+-2|0:Qa;if(((Ma|0)!=-1?(f[(f[e>>2]|0)+(Ma>>>5<<2)>>2]&1<<(Ma&31)|0)==0:0)?(Qa=f[(f[(f[R>>2]|0)+12>>2]|0)+(Ma<<2)>>2]|0,Ma=Qa+1|0,(Qa|0)!=-1):0)Ta=((Ma>>>0)%3|0|0)==0?Qa+-2|0:Ma;else Ta=-1}else{Ma=(((Ja>>>0)%3|0|0)==0?2:-1)+Ja|0;if(((Ma|0)!=-1?(f[(f[e>>2]|0)+(Ma>>>5<<2)>>2]&1<<(Ma&31)|0)==0:0)?(Qa=f[(f[(f[R>>2]|0)+12>>2]|0)+(Ma<<2)>>2]|0,(Qa|0)!=-1):0)if(!((Qa>>>0)%3|0)){Ta=Qa+2|0;break}else{Ta=Qa+-1|0;break}else Ta=-1}while(0);if((Ta|0)==(pa|0)){Ka=Sa;break c}if((Ta|0)!=-1|Ha){Ia=Sa;Ja=Ta}else break}if(Da){Ea=0;Fa=Sa;Ga=-1;continue}if(f[(f[e>>2]|0)+(Ba<<2)>>2]&Ca|0){Ea=0;Fa=Sa;Ga=-1;continue}Ja=f[(f[(f[R>>2]|0)+12>>2]|0)+(Q<<2)>>2]|0;if((Ja|0)==-1){Ea=0;Fa=Sa;Ga=-1;continue}if(!((Ja>>>0)%3|0)){Ea=0;Fa=Sa;Ga=Ja+2|0;continue}else{Ea=0;Fa=Sa;Ga=Ja+-1|0;continue}}Ga=X(ra,g)|0;f[r>>2]=0;f[U>>2]=0;b[V>>0]=0;f[Z>>2]=0;f[Z+4>>2]=0;f[Z+8>>2]=0;f[Z+12>>2]=0;f[Z+16>>2]=0;f[Z+20>>2]=0;f[Z+24>>2]=0;Fa=Ka+-1|0;Ea=p+(Fa<<3)|0;Q=Ea;Ca=Vn(f[Q>>2]|0,f[Q+4>>2]|0,Ka|0,((Ka|0)<0)<<31>>31|0)|0;Q=I;Ba=Ea;f[Ba>>2]=Ca;f[Ba+4>>2]=Q;Ba=c+((X(qa+-2|0,g)|0)<<2)|0;Ea=c+(Ga<<2)|0;Da=f[_>>2]|0;if(T){pa=0;Ja=0;while(1){Ia=(f[Ba+(pa<<2)>>2]|0)-(f[Ea+(pa<<2)>>2]|0)|0;Ha=((Ia|0)>-1?Ia:0-Ia|0)+Ja|0;f[va+(pa<<2)>>2]=Ia;f[Da+(pa<<2)>>2]=Ia<<1^Ia>>31;pa=pa+1|0;if((pa|0)==(g|0)){Ua=Ha;break}else Ja=Ha}}else Ua=0;mo(j,$,Da,g);Ja=Zk(j)|0;pa=I;Ha=Bm(j)|0;Ia=I;Qa=o+(Fa<<3)|0;Ma=Qa;Pa=f[Ma>>2]|0;Ra=f[Ma+4>>2]|0;Va=+wm(Ca,Pa);Ma=Vn(Ha|0,Ia|0,Ja|0,pa|0)|0;Wa=+(Ca>>>0)+4294967296.0*+(Q|0);Xa=+W(+(Va*Wa));pa=Vn(Ma|0,I|0,~~Xa>>>0|0,(+K(Xa)>=1.0?(Xa>0.0?~~+Y(+J(Xa/4294967296.0),4294967295.0)>>>0:~~+W((Xa-+(~~Xa>>>0))/4294967296.0)>>>0):0)|0)|0;Ma=r;f[Ma>>2]=pa;f[Ma+4>>2]=Ua;b[V>>0]=0;f[Z>>2]=0;$f(aa,Ba,Ba+(g<<2)|0);f[s>>2]=ta;f[t>>2]=ua;f[k>>2]=f[s>>2];f[j>>2]=f[t>>2];Jf(ba,k,j);if((Ka|0)<1){Ya=za;Za=ya;_a=xa;$a=wa;ab=ua;bb=ta;cb=ta}else{Ma=n+Ka|0;pa=f[q>>2]|0;Ja=pa;Ia=f[H>>2]|0;Ha=Ma+-1|0;La=(Ha|0)==(n|0);Na=Ma+-2|0;Oa=ma>>>0<Na>>>0;db=~Ka;eb=Ka+2+((db|0)>-2?db:-2)|0;db=Ia;fb=Ha>>>0>n>>>0;gb=0;hb=1;while(1){gb=gb+1|0;sj(n|0,1,eb|0)|0;sj(n|0,0,gb|0)|0;ib=Vn(Pa|0,Ra|0,hb|0,0)|0;d:while(1){if(T){sj(f[m>>2]|0,0,na|0)|0;jb=f[m>>2]|0;kb=0;lb=0;while(1){if(!(b[n+kb>>0]|0)){mb=f[l+(kb*12|0)>>2]|0;nb=0;do{ob=jb+(nb<<2)|0;f[ob>>2]=(f[ob>>2]|0)+(f[mb+(nb<<2)>>2]|0);nb=nb+1|0}while((nb|0)!=(g|0));pb=(1<<kb|lb&255)&255}else pb=lb;kb=kb+1|0;if((kb|0)==(Ka|0)){qb=pb;break}else lb=pb}}else{lb=0;kb=0;while(1){if(!(b[n+lb>>0]|0))rb=(1<<lb|kb&255)&255;else rb=kb;lb=lb+1|0;if((lb|0)==(Ka|0)){qb=rb;break}else kb=rb}}kb=f[m>>2]|0;do if(T){f[kb>>2]=(f[kb>>2]|0)/(hb|0)|0;if(!oa){lb=1;do{jb=kb+(lb<<2)|0;f[jb>>2]=(f[jb>>2]|0)/(hb|0)|0;lb=lb+1|0}while((lb|0)!=(g|0));lb=f[_>>2]|0;if(T)sb=lb;else{tb=0;ub=lb;break}}else sb=f[_>>2]|0;lb=0;jb=0;while(1){nb=(f[kb+(lb<<2)>>2]|0)-(f[Ea+(lb<<2)>>2]|0)|0;mb=((nb|0)>-1?nb:0-nb|0)+jb|0;f[pa+(lb<<2)>>2]=nb;f[sb+(lb<<2)>>2]=nb<<1^nb>>31;lb=lb+1|0;if((lb|0)==(g|0)){tb=mb;ub=sb;break}else jb=mb}}else{tb=0;ub=f[_>>2]|0}while(0);mo(j,$,ub,g);kb=Zk(j)|0;jb=I;lb=Bm(j)|0;mb=I;Xa=+wm(Ca,ib);nb=Vn(lb|0,mb|0,kb|0,jb|0)|0;Va=+W(+(Xa*Wa));jb=Vn(nb|0,I|0,~~Va>>>0|0,(+K(Va)>=1.0?(Va>0.0?~~+Y(+J(Va/4294967296.0),4294967295.0)>>>0:~~+W((Va-+(~~Va>>>0))/4294967296.0)>>>0):0)|0)|0;nb=f[r>>2]|0;if(!((nb|0)<=(jb|0)?!((nb|0)>=(jb|0)?(tb|0)<(f[U>>2]|0):0):0)){nb=r;f[nb>>2]=jb;f[nb+4>>2]=tb;b[V>>0]=qb;f[Z>>2]=hb;f[v>>2]=f[m>>2];f[w>>2]=f[E>>2];f[k>>2]=f[v>>2];f[j>>2]=f[w>>2];Jf(aa,k,j);f[x>>2]=Ja;f[y>>2]=Ia;f[k>>2]=f[x>>2];f[j>>2]=f[y>>2];Jf(ba,k,j)}if(La)break;vb=b[Ha>>0]|0;nb=-1;jb=vb;while(1){kb=nb+-1|0;wb=Ma+kb|0;mb=jb;jb=b[wb>>0]|0;if((jb&255)<(mb&255))break;if((wb|0)==(n|0)){xb=84;break d}else nb=kb}kb=Ma+nb|0;if((jb&255)<(vb&255)){yb=Ha;zb=vb}else{mb=Ma;lb=Ha;while(1){ob=lb+-1|0;if((jb&255)<(h[mb+-2>>0]|0)){yb=ob;zb=1;break}else{Ab=lb;lb=ob;mb=Ab}}}b[wb>>0]=zb;b[yb>>0]=jb;if((nb|0)<-1){Bb=kb;Cb=Ha}else continue;while(1){mb=b[Bb>>0]|0;b[Bb>>0]=b[Cb>>0]|0;b[Cb>>0]=mb;mb=Bb+1|0;lb=Cb+-1|0;if(mb>>>0<lb>>>0){Bb=mb;Cb=lb}else continue d}}if(((xb|0)==84?(xb=0,fb):0)?(ib=b[n>>0]|0,b[n>>0]=vb,b[Ha>>0]=ib,Oa):0){ib=Na;kb=ma;do{nb=b[kb>>0]|0;b[kb>>0]=b[ib>>0]|0;b[ib>>0]=nb;kb=kb+1|0;ib=ib+-1|0}while(kb>>>0<ib>>>0)}if((hb|0)>=(Ka|0)){Ya=db;Za=pa;_a=db;$a=pa;ab=Ia;bb=Ja;cb=pa;break}else hb=hb+1|0}}hb=f[Z>>2]|0;pa=Vn(Pa|0,Ra|0,hb|0,((hb|0)<0)<<31>>31|0)|0;hb=Qa;f[hb>>2]=pa;f[hb+4>>2]=I;if(T){hb=f[ba>>2]|0;pa=f[C>>2]|0;Ja=0;do{Ia=f[hb+(Ja<<2)>>2]|0;f[pa+(Ja<<2)>>2]=Ia<<1^Ia>>31;Ja=Ja+1|0}while((Ja|0)!=(g|0));Db=pa}else Db=f[C>>2]|0;lo(j,$,Db,g);if((Ka|0)>0){Eb=a+60+(Fa*12|0)|0;pa=a+60+(Fa*12|0)+4|0;Ja=a+60+(Fa*12|0)+8|0;hb=0;do{Qa=f[pa>>2]|0;Ra=f[Ja>>2]|0;Pa=(Qa|0)==(Ra<<5|0);if(!(1<<hb&h[V>>0])){if(Pa){if((Qa+1|0)<0){xb=108;break b}Ia=Ra<<6;db=Qa+32&-32;vi(Eb,Qa>>>0<1073741823?(Ia>>>0<db>>>0?db:Ia):2147483647);Fb=f[pa>>2]|0}else Fb=Qa;f[pa>>2]=Fb+1;Ia=(f[Eb>>2]|0)+(Fb>>>5<<2)|0;f[Ia>>2]=f[Ia>>2]|1<<(Fb&31)}else{if(Pa){if((Qa+1|0)<0){xb=113;break b}Pa=Ra<<6;Ra=Qa+32&-32;vi(Eb,Qa>>>0<1073741823?(Pa>>>0<Ra>>>0?Ra:Pa):2147483647);Gb=f[pa>>2]|0}else Gb=Qa;f[pa>>2]=Gb+1;Qa=(f[Eb>>2]|0)+(Gb>>>5<<2)|0;f[Qa>>2]=f[Qa>>2]&~(1<<(Gb&31))}hb=hb+1|0}while((hb|0)<(Ka|0))}hb=d+(Ga<<2)|0;pa=f[z>>2]|0;if((pa|0)>0){Ja=0;Fa=f[aa>>2]|0;Qa=pa;while(1){if((Qa|0)>0){pa=0;do{Pa=f[Fa+(pa<<2)>>2]|0;Ra=f[ca>>2]|0;if((Pa|0)>(Ra|0)){Ia=f[da>>2]|0;f[Ia+(pa<<2)>>2]=Ra;Hb=Ia}else{Ia=f[ea>>2]|0;Ra=f[da>>2]|0;f[Ra+(pa<<2)>>2]=(Pa|0)<(Ia|0)?Ia:Pa;Hb=Ra}pa=pa+1|0}while((pa|0)<(f[z>>2]|0));Ib=Hb}else Ib=f[da>>2]|0;pa=(f[Ea+(Ja<<2)>>2]|0)-(f[Ib+(Ja<<2)>>2]|0)|0;Ra=hb+(Ja<<2)|0;f[Ra>>2]=pa;do if((pa|0)<(f[fa>>2]|0)){Jb=(f[ga>>2]|0)+pa|0;xb=103}else{if((pa|0)<=(f[ha>>2]|0))break;Jb=pa-(f[ga>>2]|0)|0;xb=103}while(0);if((xb|0)==103){xb=0;f[Ra>>2]=Jb}Ja=Ja+1|0;Qa=f[z>>2]|0;if((Ja|0)>=(Qa|0))break;else Fa=Ib}}Fa=f[ia>>2]|0;if(Fa|0){Qa=f[la>>2]|0;if((Qa|0)!=(Fa|0))f[la>>2]=Qa+(~((Qa+-4-Fa|0)>>>2)<<2);Oq(Fa)}Fa=f[ja>>2]|0;if(Fa|0){Qa=f[ka>>2]|0;if((Qa|0)!=(Fa|0))f[ka>>2]=Qa+(~((Qa+-4-Fa|0)>>>2)<<2);Oq(Fa)}if((qa|0)<=2){Kb=$a;Lb=_a;break a}Fa=f[B>>2]|0;sa=f[Fa>>2]|0;Qa=ra+-1|0;if((f[Fa+4>>2]|0)-sa>>2>>>0<=Qa>>>0){Aa=Fa;xb=18;break}else{Fa=ra;ra=Qa;ta=bb;ua=ab;va=cb;wa=$a;xa=_a;ya=Za;za=Ya;qa=Fa}}if((xb|0)==18)aq(Aa);else if((xb|0)==108)aq(Eb);else if((xb|0)==113)aq(Eb)}else{Kb=M;Lb=N}while(0);N=f[l>>2]|0;if((g|0)>0?(f[N>>2]=0,(g|0)!=1):0){M=1;do{f[N+(M<<2)>>2]=0;M=M+1|0}while((M|0)!=(g|0))}g=f[z>>2]|0;if((g|0)>0){M=a+16|0;Eb=a+32|0;Aa=a+12|0;qa=a+28|0;Ya=a+20|0;za=a+24|0;a=0;Za=N;N=g;while(1){if((N|0)>0){g=0;do{ya=f[Za+(g<<2)>>2]|0;_a=f[M>>2]|0;if((ya|0)>(_a|0)){xa=f[Eb>>2]|0;f[xa+(g<<2)>>2]=_a;Mb=xa}else{xa=f[Aa>>2]|0;_a=f[Eb>>2]|0;f[_a+(g<<2)>>2]=(ya|0)<(xa|0)?xa:ya;Mb=_a}g=g+1|0}while((g|0)<(f[z>>2]|0));Nb=Mb}else Nb=f[Eb>>2]|0;g=(f[c+(a<<2)>>2]|0)-(f[Nb+(a<<2)>>2]|0)|0;_a=d+(a<<2)|0;f[_a>>2]=g;if((g|0)>=(f[qa>>2]|0)){if((g|0)>(f[za>>2]|0)){Ob=g-(f[Ya>>2]|0)|0;xb=139}}else{Ob=(f[Ya>>2]|0)+g|0;xb=139}if((xb|0)==139){xb=0;f[_a>>2]=Ob}a=a+1|0;N=f[z>>2]|0;if((a|0)>=(N|0))break;else Za=Nb}}if(Kb|0){if((Lb|0)!=(Kb|0))f[H>>2]=Lb+(~((Lb+-4-Kb|0)>>>2)<<2);Oq(Kb)}Kb=f[m>>2]|0;if(Kb|0){m=f[E>>2]|0;if((m|0)!=(Kb|0))f[E>>2]=m+(~((m+-4-Kb|0)>>>2)<<2);Oq(Kb)}Kb=f[l+36>>2]|0;if(Kb|0){m=l+40|0;E=f[m>>2]|0;if((E|0)!=(Kb|0))f[m>>2]=E+(~((E+-4-Kb|0)>>>2)<<2);Oq(Kb)}Kb=f[l+24>>2]|0;if(Kb|0){E=l+28|0;m=f[E>>2]|0;if((m|0)!=(Kb|0))f[E>>2]=m+(~((m+-4-Kb|0)>>>2)<<2);Oq(Kb)}Kb=f[l+12>>2]|0;if(Kb|0){m=l+16|0;E=f[m>>2]|0;if((E|0)!=(Kb|0))f[m>>2]=E+(~((E+-4-Kb|0)>>>2)<<2);Oq(Kb)}Kb=f[l>>2]|0;if(!Kb){u=i;return 1}E=l+4|0;l=f[E>>2]|0;if((l|0)!=(Kb|0))f[E>>2]=l+(~((l+-4-Kb|0)>>>2)<<2);Oq(Kb);u=i;return 1}function bb(a,c,d,e,g,i){a=a|0;c=c|0;d=d|0;e=e|0;g=g|0;i=i|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ja=0,Ka=0,La=0,Ma=0,Na=0,Oa=0,Pa=0,Qa=0,Ra=0,Sa=0,Ta=0,Ua=0,Va=0.0,Wa=0.0,Xa=0.0,Ya=0,Za=0,_a=0,$a=0,ab=0,bb=0,cb=0,db=0,eb=0,fb=0,gb=0,hb=0,ib=0,jb=0,kb=0,lb=0,mb=0,nb=0,ob=0,pb=0,qb=0,rb=0,sb=0,tb=0,ub=0,vb=0,wb=0,xb=0,yb=0,zb=0,Ab=0,Bb=0,Cb=0,Db=0,Eb=0,Fb=0,Gb=0,Hb=0,Ib=0,Jb=0,Kb=0,Lb=0,Mb=0,Nb=0,Ob=0,Pb=0,Qb=0;i=u;u=u+240|0;j=i+104|0;k=i+224|0;l=i+176|0;m=i+160|0;n=i+228|0;o=i+72|0;p=i+40|0;q=i+132|0;r=i;s=i+172|0;t=i+156|0;v=i+152|0;w=i+148|0;x=i+144|0;y=i+128|0;z=a+8|0;Mh(z,c,e,g);e=f[a+48>>2]|0;A=f[a+52>>2]|0;B=l;C=B+48|0;do{f[B>>2]=0;B=B+4|0}while((B|0)<(C|0));if(!g){D=0;E=0}else{Ci(l,g);D=f[l+12>>2]|0;E=f[l+16>>2]|0}B=l+16|0;C=E-D>>2;F=D;D=E;if(C>>>0>=g>>>0){if(C>>>0>g>>>0?(E=F+(g<<2)|0,(E|0)!=(D|0)):0)f[B>>2]=D+(~((D+-4-E|0)>>>2)<<2)}else Ci(l+12|0,g-C|0);C=l+24|0;E=l+28|0;D=f[E>>2]|0;B=f[C>>2]|0;F=D-B>>2;G=B;B=D;if(F>>>0>=g>>>0){if(F>>>0>g>>>0?(D=G+(g<<2)|0,(D|0)!=(B|0)):0)f[E>>2]=B+(~((B+-4-D|0)>>>2)<<2)}else Ci(C,g-F|0);F=l+36|0;C=l+40|0;D=f[C>>2]|0;B=f[F>>2]|0;E=D-B>>2;G=B;B=D;if(E>>>0>=g>>>0){if(E>>>0>g>>>0?(D=G+(g<<2)|0,(D|0)!=(B|0)):0)f[C>>2]=B+(~((B+-4-D|0)>>>2)<<2)}else Ci(F,g-E|0);f[m>>2]=0;E=m+4|0;f[E>>2]=0;f[m+8>>2]=0;F=(g|0)==0;do if(!F)if(g>>>0>1073741823)aq(m);else{D=g<<2;B=ln(D)|0;f[m>>2]=B;C=B+(g<<2)|0;f[m+8>>2]=C;sj(B|0,0,D|0)|0;f[E>>2]=C;break}while(0);C=a+152|0;D=a+156|0;B=f[D>>2]|0;G=f[C>>2]|0;H=B-G>>2;L=G;G=B;if(H>>>0>=g>>>0){if(H>>>0>g>>>0?(B=L+(g<<2)|0,(B|0)!=(G|0)):0)f[D>>2]=G+(~((G+-4-B|0)>>>2)<<2)}else Ci(C,g-H|0);f[o>>2]=0;f[o+4>>2]=0;f[o+8>>2]=0;f[o+12>>2]=0;f[o+16>>2]=0;f[o+20>>2]=0;f[o+24>>2]=0;f[o+28>>2]=0;f[p>>2]=0;f[p+4>>2]=0;f[p+8>>2]=0;f[p+12>>2]=0;f[p+16>>2]=0;f[p+20>>2]=0;f[p+24>>2]=0;f[p+28>>2]=0;f[q>>2]=0;H=q+4|0;f[H>>2]=0;f[q+8>>2]=0;if(F){M=0;N=0;O=0;P=0}else{F=g<<2;B=ln(F)|0;f[q>>2]=B;G=B+(g<<2)|0;f[q+8>>2]=G;sj(B|0,0,F|0)|0;f[H>>2]=G;M=B;N=G;O=G;P=B}B=a+56|0;G=f[B>>2]|0;F=f[G+4>>2]|0;D=f[G>>2]|0;L=F-D|0;a:do if((L|0)>4){Q=L>>2;R=e+12|0;S=(g|0)>0;T=r+4|0;U=r+8|0;V=r+12|0;Z=a+152|0;_=a+112|0;$=r+16|0;aa=r+28|0;ba=a+16|0;ca=a+32|0;da=a+12|0;ea=a+28|0;fa=a+20|0;ga=a+24|0;ha=r+28|0;ia=r+16|0;ja=r+20|0;ka=r+32|0;la=n+1|0;ma=g<<2;na=(g|0)==1;oa=Q+-1|0;if(F-D>>2>>>0>oa>>>0){pa=Q;qa=oa;ra=D;sa=P;ta=O;ua=M;va=M;wa=N;xa=M;ya=N}else{za=G;aq(za)}b:while(1){oa=f[ra+(qa<<2)>>2]|0;Q=(((oa>>>0)%3|0|0)==0?2:-1)+oa|0;Aa=(oa|0)==-1|(Q|0)==-1;Ba=1;Ca=0;Da=oa;c:while(1){Ea=Ba^1;Fa=Ca;Ga=Da;while(1){if((Ga|0)==-1){Ha=Fa;break c}Ia=f[l+(Fa*12|0)>>2]|0;Ja=f[R>>2]|0;Ka=f[Ja+(Ga<<2)>>2]|0;if((Ka|0)!=-1){La=f[e>>2]|0;Ma=f[A>>2]|0;Na=f[Ma+(f[La+(Ka<<2)>>2]<<2)>>2]|0;Oa=Ka+1|0;Pa=((Oa>>>0)%3|0|0)==0?Ka+-2|0:Oa;if((Pa|0)==-1)Qa=-1;else Qa=f[La+(Pa<<2)>>2]|0;Pa=f[Ma+(Qa<<2)>>2]|0;Oa=(((Ka>>>0)%3|0|0)==0?2:-1)+Ka|0;if((Oa|0)==-1)Ra=-1;else Ra=f[La+(Oa<<2)>>2]|0;Oa=f[Ma+(Ra<<2)>>2]|0;if((Na|0)<(qa|0)&(Pa|0)<(qa|0)&(Oa|0)<(qa|0)){Ma=X(Na,g)|0;Na=X(Pa,g)|0;Pa=X(Oa,g)|0;if(S){Oa=0;do{f[Ia+(Oa<<2)>>2]=(f[c+(Oa+Pa<<2)>>2]|0)+(f[c+(Oa+Na<<2)>>2]|0)-(f[c+(Oa+Ma<<2)>>2]|0);Oa=Oa+1|0}while((Oa|0)!=(g|0))}Oa=Fa+1|0;if((Oa|0)==4){Ha=4;break c}else Sa=Oa}else Sa=Fa}else Sa=Fa;do if(Ba){Oa=Ga+1|0;Ma=((Oa>>>0)%3|0|0)==0?Ga+-2|0:Oa;if((Ma|0)!=-1?(Oa=f[Ja+(Ma<<2)>>2]|0,Ma=Oa+1|0,(Oa|0)!=-1):0)Ta=((Ma>>>0)%3|0|0)==0?Oa+-2|0:Ma;else Ta=-1}else{Ma=(((Ga>>>0)%3|0|0)==0?2:-1)+Ga|0;if((Ma|0)!=-1?(Oa=f[Ja+(Ma<<2)>>2]|0,(Oa|0)!=-1):0)if(!((Oa>>>0)%3|0)){Ta=Oa+2|0;break}else{Ta=Oa+-1|0;break}else Ta=-1}while(0);if((Ta|0)==(oa|0)){Ha=Sa;break c}if((Ta|0)!=-1|Ea){Fa=Sa;Ga=Ta}else break}if(Aa){Ba=0;Ca=Sa;Da=-1;continue}Ga=f[Ja+(Q<<2)>>2]|0;if((Ga|0)==-1){Ba=0;Ca=Sa;Da=-1;continue}if(!((Ga>>>0)%3|0)){Ba=0;Ca=Sa;Da=Ga+2|0;continue}else{Ba=0;Ca=Sa;Da=Ga+-1|0;continue}}Da=X(qa,g)|0;f[r>>2]=0;f[T>>2]=0;b[U>>0]=0;f[V>>2]=0;f[V+4>>2]=0;f[V+8>>2]=0;f[V+12>>2]=0;f[V+16>>2]=0;f[V+20>>2]=0;f[V+24>>2]=0;Ca=Ha+-1|0;Ba=p+(Ca<<3)|0;Q=Ba;Aa=Vn(f[Q>>2]|0,f[Q+4>>2]|0,Ha|0,((Ha|0)<0)<<31>>31|0)|0;Q=I;oa=Ba;f[oa>>2]=Aa;f[oa+4>>2]=Q;oa=c+((X(pa+-2|0,g)|0)<<2)|0;Ba=c+(Da<<2)|0;Ga=f[Z>>2]|0;if(S){Fa=0;Ea=0;while(1){Oa=(f[oa+(Fa<<2)>>2]|0)-(f[Ba+(Fa<<2)>>2]|0)|0;Ma=((Oa|0)>-1?Oa:0-Oa|0)+Ea|0;f[ua+(Fa<<2)>>2]=Oa;f[Ga+(Fa<<2)>>2]=Oa<<1^Oa>>31;Fa=Fa+1|0;if((Fa|0)==(g|0)){Ua=Ma;break}else Ea=Ma}}else Ua=0;mo(j,_,Ga,g);Ea=Zk(j)|0;Fa=I;Ma=Bm(j)|0;Oa=I;Na=o+(Ca<<3)|0;Pa=Na;Ia=f[Pa>>2]|0;La=f[Pa+4>>2]|0;Va=+wm(Aa,Ia);Pa=Vn(Ma|0,Oa|0,Ea|0,Fa|0)|0;Wa=+(Aa>>>0)+4294967296.0*+(Q|0);Xa=+W(+(Va*Wa));Fa=Vn(Pa|0,I|0,~~Xa>>>0|0,(+K(Xa)>=1.0?(Xa>0.0?~~+Y(+J(Xa/4294967296.0),4294967295.0)>>>0:~~+W((Xa-+(~~Xa>>>0))/4294967296.0)>>>0):0)|0)|0;Pa=r;f[Pa>>2]=Fa;f[Pa+4>>2]=Ua;b[U>>0]=0;f[V>>2]=0;$f($,oa,oa+(g<<2)|0);f[s>>2]=sa;f[t>>2]=ta;f[k>>2]=f[s>>2];f[j>>2]=f[t>>2];Jf(aa,k,j);if((Ha|0)<1){Ya=ya;Za=xa;_a=wa;$a=va;ab=ta;bb=sa;cb=sa}else{Pa=n+Ha|0;Fa=f[q>>2]|0;Ea=Fa;Oa=f[H>>2]|0;Ma=Pa+-1|0;Ka=(Ma|0)==(n|0);db=Pa+-2|0;eb=la>>>0<db>>>0;fb=~Ha;gb=Ha+2+((fb|0)>-2?fb:-2)|0;fb=Oa;hb=Ma>>>0>n>>>0;ib=0;jb=1;while(1){ib=ib+1|0;sj(n|0,1,gb|0)|0;sj(n|0,0,ib|0)|0;kb=Vn(Ia|0,La|0,jb|0,0)|0;d:while(1){if(S){sj(f[m>>2]|0,0,ma|0)|0;lb=f[m>>2]|0;mb=0;nb=0;while(1){if(!(b[n+mb>>0]|0)){ob=f[l+(mb*12|0)>>2]|0;pb=0;do{qb=lb+(pb<<2)|0;f[qb>>2]=(f[qb>>2]|0)+(f[ob+(pb<<2)>>2]|0);pb=pb+1|0}while((pb|0)!=(g|0));rb=(1<<mb|nb&255)&255}else rb=nb;mb=mb+1|0;if((mb|0)==(Ha|0)){sb=rb;break}else nb=rb}}else{nb=0;mb=0;while(1){if(!(b[n+nb>>0]|0))tb=(1<<nb|mb&255)&255;else tb=mb;nb=nb+1|0;if((nb|0)==(Ha|0)){sb=tb;break}else mb=tb}}mb=f[m>>2]|0;do if(S){f[mb>>2]=(f[mb>>2]|0)/(jb|0)|0;if(!na){nb=1;do{lb=mb+(nb<<2)|0;f[lb>>2]=(f[lb>>2]|0)/(jb|0)|0;nb=nb+1|0}while((nb|0)!=(g|0));nb=f[Z>>2]|0;if(S)ub=nb;else{vb=0;wb=nb;break}}else ub=f[Z>>2]|0;nb=0;lb=0;while(1){pb=(f[mb+(nb<<2)>>2]|0)-(f[Ba+(nb<<2)>>2]|0)|0;ob=((pb|0)>-1?pb:0-pb|0)+lb|0;f[Fa+(nb<<2)>>2]=pb;f[ub+(nb<<2)>>2]=pb<<1^pb>>31;nb=nb+1|0;if((nb|0)==(g|0)){vb=ob;wb=ub;break}else lb=ob}}else{vb=0;wb=f[Z>>2]|0}while(0);mo(j,_,wb,g);mb=Zk(j)|0;lb=I;nb=Bm(j)|0;ob=I;Xa=+wm(Aa,kb);pb=Vn(nb|0,ob|0,mb|0,lb|0)|0;Va=+W(+(Xa*Wa));lb=Vn(pb|0,I|0,~~Va>>>0|0,(+K(Va)>=1.0?(Va>0.0?~~+Y(+J(Va/4294967296.0),4294967295.0)>>>0:~~+W((Va-+(~~Va>>>0))/4294967296.0)>>>0):0)|0)|0;pb=f[r>>2]|0;if(!((pb|0)<=(lb|0)?!((pb|0)>=(lb|0)?(vb|0)<(f[T>>2]|0):0):0)){pb=r;f[pb>>2]=lb;f[pb+4>>2]=vb;b[U>>0]=sb;f[V>>2]=jb;f[v>>2]=f[m>>2];f[w>>2]=f[E>>2];f[k>>2]=f[v>>2];f[j>>2]=f[w>>2];Jf($,k,j);f[x>>2]=Ea;f[y>>2]=Oa;f[k>>2]=f[x>>2];f[j>>2]=f[y>>2];Jf(aa,k,j)}if(Ka)break;xb=b[Ma>>0]|0;pb=-1;lb=xb;while(1){mb=pb+-1|0;yb=Pa+mb|0;ob=lb;lb=b[yb>>0]|0;if((lb&255)<(ob&255))break;if((yb|0)==(n|0)){zb=84;break d}else pb=mb}mb=Pa+pb|0;if((lb&255)<(xb&255)){Ab=Ma;Bb=xb}else{ob=Pa;nb=Ma;while(1){qb=nb+-1|0;if((lb&255)<(h[ob+-2>>0]|0)){Ab=qb;Bb=1;break}else{Cb=nb;nb=qb;ob=Cb}}}b[yb>>0]=Bb;b[Ab>>0]=lb;if((pb|0)<-1){Db=mb;Eb=Ma}else continue;while(1){ob=b[Db>>0]|0;b[Db>>0]=b[Eb>>0]|0;b[Eb>>0]=ob;ob=Db+1|0;nb=Eb+-1|0;if(ob>>>0<nb>>>0){Db=ob;Eb=nb}else continue d}}if(((zb|0)==84?(zb=0,hb):0)?(kb=b[n>>0]|0,b[n>>0]=xb,b[Ma>>0]=kb,eb):0){kb=db;mb=la;do{pb=b[mb>>0]|0;b[mb>>0]=b[kb>>0]|0;b[kb>>0]=pb;mb=mb+1|0;kb=kb+-1|0}while(mb>>>0<kb>>>0)}if((jb|0)>=(Ha|0)){Ya=fb;Za=Fa;_a=fb;$a=Fa;ab=Oa;bb=Ea;cb=Fa;break}else jb=jb+1|0}}jb=f[V>>2]|0;Fa=Vn(Ia|0,La|0,jb|0,((jb|0)<0)<<31>>31|0)|0;jb=Na;f[jb>>2]=Fa;f[jb+4>>2]=I;if(S){jb=f[aa>>2]|0;Fa=f[C>>2]|0;Ea=0;do{Oa=f[jb+(Ea<<2)>>2]|0;f[Fa+(Ea<<2)>>2]=Oa<<1^Oa>>31;Ea=Ea+1|0}while((Ea|0)!=(g|0));Fb=Fa}else Fb=f[C>>2]|0;lo(j,_,Fb,g);if((Ha|0)>0){Gb=a+60+(Ca*12|0)|0;Fa=a+60+(Ca*12|0)+4|0;Ea=a+60+(Ca*12|0)+8|0;jb=0;do{Na=f[Fa>>2]|0;La=f[Ea>>2]|0;Ia=(Na|0)==(La<<5|0);if(!(1<<jb&h[U>>0])){if(Ia){if((Na+1|0)<0){zb=108;break b}Oa=La<<6;fb=Na+32&-32;vi(Gb,Na>>>0<1073741823?(Oa>>>0<fb>>>0?fb:Oa):2147483647);Hb=f[Fa>>2]|0}else Hb=Na;f[Fa>>2]=Hb+1;Oa=(f[Gb>>2]|0)+(Hb>>>5<<2)|0;f[Oa>>2]=f[Oa>>2]|1<<(Hb&31)}else{if(Ia){if((Na+1|0)<0){zb=113;break b}Ia=La<<6;La=Na+32&-32;vi(Gb,Na>>>0<1073741823?(Ia>>>0<La>>>0?La:Ia):2147483647);Ib=f[Fa>>2]|0}else Ib=Na;f[Fa>>2]=Ib+1;Na=(f[Gb>>2]|0)+(Ib>>>5<<2)|0;f[Na>>2]=f[Na>>2]&~(1<<(Ib&31))}jb=jb+1|0}while((jb|0)<(Ha|0))}jb=d+(Da<<2)|0;Fa=f[z>>2]|0;if((Fa|0)>0){Ea=0;Ca=f[$>>2]|0;Na=Fa;while(1){if((Na|0)>0){Fa=0;do{Ia=f[Ca+(Fa<<2)>>2]|0;La=f[ba>>2]|0;if((Ia|0)>(La|0)){Oa=f[ca>>2]|0;f[Oa+(Fa<<2)>>2]=La;Jb=Oa}else{Oa=f[da>>2]|0;La=f[ca>>2]|0;f[La+(Fa<<2)>>2]=(Ia|0)<(Oa|0)?Oa:Ia;Jb=La}Fa=Fa+1|0}while((Fa|0)<(f[z>>2]|0));Kb=Jb}else Kb=f[ca>>2]|0;Fa=(f[Ba+(Ea<<2)>>2]|0)-(f[Kb+(Ea<<2)>>2]|0)|0;La=jb+(Ea<<2)|0;f[La>>2]=Fa;do if((Fa|0)<(f[ea>>2]|0)){Lb=(f[fa>>2]|0)+Fa|0;zb=103}else{if((Fa|0)<=(f[ga>>2]|0))break;Lb=Fa-(f[fa>>2]|0)|0;zb=103}while(0);if((zb|0)==103){zb=0;f[La>>2]=Lb}Ea=Ea+1|0;Na=f[z>>2]|0;if((Ea|0)>=(Na|0))break;else Ca=Kb}}Ca=f[ha>>2]|0;if(Ca|0){Na=f[ka>>2]|0;if((Na|0)!=(Ca|0))f[ka>>2]=Na+(~((Na+-4-Ca|0)>>>2)<<2);Oq(Ca)}Ca=f[ia>>2]|0;if(Ca|0){Na=f[ja>>2]|0;if((Na|0)!=(Ca|0))f[ja>>2]=Na+(~((Na+-4-Ca|0)>>>2)<<2);Oq(Ca)}if((pa|0)<=2){Mb=$a;Nb=_a;break a}Ca=f[B>>2]|0;ra=f[Ca>>2]|0;Na=qa+-1|0;if((f[Ca+4>>2]|0)-ra>>2>>>0<=Na>>>0){za=Ca;zb=18;break}else{Ca=qa;qa=Na;sa=bb;ta=ab;ua=cb;va=$a;wa=_a;xa=Za;ya=Ya;pa=Ca}}if((zb|0)==18)aq(za);else if((zb|0)==108)aq(Gb);else if((zb|0)==113)aq(Gb)}else{Mb=M;Nb=N}while(0);N=f[l>>2]|0;if((g|0)>0?(f[N>>2]=0,(g|0)!=1):0){M=1;do{f[N+(M<<2)>>2]=0;M=M+1|0}while((M|0)!=(g|0))}g=f[z>>2]|0;if((g|0)>0){M=a+16|0;Gb=a+32|0;za=a+12|0;pa=a+28|0;Ya=a+20|0;ya=a+24|0;a=0;Za=N;N=g;while(1){if((N|0)>0){g=0;do{xa=f[Za+(g<<2)>>2]|0;_a=f[M>>2]|0;if((xa|0)>(_a|0)){wa=f[Gb>>2]|0;f[wa+(g<<2)>>2]=_a;Ob=wa}else{wa=f[za>>2]|0;_a=f[Gb>>2]|0;f[_a+(g<<2)>>2]=(xa|0)<(wa|0)?wa:xa;Ob=_a}g=g+1|0}while((g|0)<(f[z>>2]|0));Pb=Ob}else Pb=f[Gb>>2]|0;g=(f[c+(a<<2)>>2]|0)-(f[Pb+(a<<2)>>2]|0)|0;_a=d+(a<<2)|0;f[_a>>2]=g;if((g|0)>=(f[pa>>2]|0)){if((g|0)>(f[ya>>2]|0)){Qb=g-(f[Ya>>2]|0)|0;zb=139}}else{Qb=(f[Ya>>2]|0)+g|0;zb=139}if((zb|0)==139){zb=0;f[_a>>2]=Qb}a=a+1|0;N=f[z>>2]|0;if((a|0)>=(N|0))break;else Za=Pb}}if(Mb|0){if((Nb|0)!=(Mb|0))f[H>>2]=Nb+(~((Nb+-4-Mb|0)>>>2)<<2);Oq(Mb)}Mb=f[m>>2]|0;if(Mb|0){m=f[E>>2]|0;if((m|0)!=(Mb|0))f[E>>2]=m+(~((m+-4-Mb|0)>>>2)<<2);Oq(Mb)}Mb=f[l+36>>2]|0;if(Mb|0){m=l+40|0;E=f[m>>2]|0;if((E|0)!=(Mb|0))f[m>>2]=E+(~((E+-4-Mb|0)>>>2)<<2);Oq(Mb)}Mb=f[l+24>>2]|0;if(Mb|0){E=l+28|0;m=f[E>>2]|0;if((m|0)!=(Mb|0))f[E>>2]=m+(~((m+-4-Mb|0)>>>2)<<2);Oq(Mb)}Mb=f[l+12>>2]|0;if(Mb|0){m=l+16|0;E=f[m>>2]|0;if((E|0)!=(Mb|0))f[m>>2]=E+(~((E+-4-Mb|0)>>>2)<<2);Oq(Mb)}Mb=f[l>>2]|0;if(!Mb){u=i;return 1}E=l+4|0;l=f[E>>2]|0;if((l|0)!=(Mb|0))f[E>>2]=l+(~((l+-4-Mb|0)>>>2)<<2);Oq(Mb);u=i;return 1}function cb(a){a=a|0;var b=0,c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0;b=u;u=u+16|0;c=b;d=b+8|0;e=b+4|0;f[d>>2]=a;do if(a>>>0>=212){g=(a>>>0)/210|0;h=g*210|0;f[e>>2]=a-h;i=0;j=g;g=(Hl(6952,7144,e,c)|0)-6952>>2;k=h;a:while(1){l=(f[6952+(g<<2)>>2]|0)+k|0;h=5;while(1){if(h>>>0>=47){m=211;n=i;o=8;break}p=f[6760+(h<<2)>>2]|0;q=(l>>>0)/(p>>>0)|0;if(q>>>0<p>>>0){o=106;break a}if((l|0)==(X(q,p)|0)){r=i;break}else h=h+1|0}b:do if((o|0)==8){c:while(1){o=0;h=(l>>>0)/(m>>>0)|0;do if(h>>>0>=m>>>0)if((l|0)!=(X(h,m)|0)){p=m+10|0;q=(l>>>0)/(p>>>0)|0;if(q>>>0>=p>>>0)if((l|0)!=(X(q,p)|0)){q=m+12|0;s=(l>>>0)/(q>>>0)|0;if(s>>>0>=q>>>0)if((l|0)!=(X(s,q)|0)){s=m+16|0;t=(l>>>0)/(s>>>0)|0;if(t>>>0>=s>>>0)if((l|0)!=(X(t,s)|0)){t=m+18|0;v=(l>>>0)/(t>>>0)|0;if(v>>>0>=t>>>0)if((l|0)!=(X(v,t)|0)){v=m+22|0;w=(l>>>0)/(v>>>0)|0;if(w>>>0>=v>>>0)if((l|0)!=(X(w,v)|0)){w=m+28|0;x=(l>>>0)/(w>>>0)|0;if(x>>>0>=w>>>0)if((l|0)==(X(x,w)|0)){y=w;z=9;A=n}else{x=m+30|0;B=(l>>>0)/(x>>>0)|0;if(B>>>0<x>>>0){y=x;z=1;A=l;break}if((l|0)==(X(B,x)|0)){y=x;z=9;A=n;break}x=m+36|0;B=(l>>>0)/(x>>>0)|0;if(B>>>0<x>>>0){y=x;z=1;A=l;break}if((l|0)==(X(B,x)|0)){y=x;z=9;A=n;break}x=m+40|0;B=(l>>>0)/(x>>>0)|0;if(B>>>0<x>>>0){y=x;z=1;A=l;break}if((l|0)==(X(B,x)|0)){y=x;z=9;A=n;break}x=m+42|0;B=(l>>>0)/(x>>>0)|0;if(B>>>0<x>>>0){y=x;z=1;A=l;break}if((l|0)==(X(B,x)|0)){y=x;z=9;A=n;break}x=m+46|0;B=(l>>>0)/(x>>>0)|0;if(B>>>0<x>>>0){y=x;z=1;A=l;break}if((l|0)==(X(B,x)|0)){y=x;z=9;A=n;break}x=m+52|0;B=(l>>>0)/(x>>>0)|0;if(B>>>0<x>>>0){y=x;z=1;A=l;break}if((l|0)==(X(B,x)|0)){y=x;z=9;A=n;break}x=m+58|0;B=(l>>>0)/(x>>>0)|0;if(B>>>0<x>>>0){y=x;z=1;A=l;break}if((l|0)==(X(B,x)|0)){y=x;z=9;A=n;break}x=m+60|0;B=(l>>>0)/(x>>>0)|0;if(B>>>0<x>>>0){y=x;z=1;A=l;break}if((l|0)==(X(B,x)|0)){y=x;z=9;A=n;break}x=m+66|0;B=(l>>>0)/(x>>>0)|0;if(B>>>0<x>>>0){y=x;z=1;A=l;break}if((l|0)==(X(B,x)|0)){y=x;z=9;A=n;break}x=m+70|0;B=(l>>>0)/(x>>>0)|0;if(B>>>0<x>>>0){y=x;z=1;A=l;break}if((l|0)==(X(B,x)|0)){y=x;z=9;A=n;break}x=m+72|0;B=(l>>>0)/(x>>>0)|0;if(B>>>0<x>>>0){y=x;z=1;A=l;break}if((l|0)==(X(B,x)|0)){y=x;z=9;A=n;break}x=m+78|0;B=(l>>>0)/(x>>>0)|0;if(B>>>0<x>>>0){y=x;z=1;A=l;break}if((l|0)==(X(B,x)|0)){y=x;z=9;A=n;break}x=m+82|0;B=(l>>>0)/(x>>>0)|0;if(B>>>0<x>>>0){y=x;z=1;A=l;break}if((l|0)==(X(B,x)|0)){y=x;z=9;A=n;break}x=m+88|0;B=(l>>>0)/(x>>>0)|0;if(B>>>0<x>>>0){y=x;z=1;A=l;break}if((l|0)==(X(B,x)|0)){y=x;z=9;A=n;break}x=m+96|0;B=(l>>>0)/(x>>>0)|0;if(B>>>0<x>>>0){y=x;z=1;A=l;break}if((l|0)==(X(B,x)|0)){y=x;z=9;A=n;break}x=m+100|0;B=(l>>>0)/(x>>>0)|0;if(B>>>0<x>>>0){y=x;z=1;A=l;break}if((l|0)==(X(B,x)|0)){y=x;z=9;A=n;break}x=m+102|0;B=(l>>>0)/(x>>>0)|0;if(B>>>0<x>>>0){y=x;z=1;A=l;break}if((l|0)==(X(B,x)|0)){y=x;z=9;A=n;break}x=m+106|0;B=(l>>>0)/(x>>>0)|0;if(B>>>0<x>>>0){y=x;z=1;A=l;break}if((l|0)==(X(B,x)|0)){y=x;z=9;A=n;break}x=m+108|0;B=(l>>>0)/(x>>>0)|0;if(B>>>0<x>>>0){y=x;z=1;A=l;break}if((l|0)==(X(B,x)|0)){y=x;z=9;A=n;break}x=m+112|0;B=(l>>>0)/(x>>>0)|0;if(B>>>0<x>>>0){y=x;z=1;A=l;break}if((l|0)==(X(B,x)|0)){y=x;z=9;A=n;break}x=m+120|0;B=(l>>>0)/(x>>>0)|0;if(B>>>0<x>>>0){y=x;z=1;A=l;break}if((l|0)==(X(B,x)|0)){y=x;z=9;A=n;break}x=m+126|0;B=(l>>>0)/(x>>>0)|0;if(B>>>0<x>>>0){y=x;z=1;A=l;break}if((l|0)==(X(B,x)|0)){y=x;z=9;A=n;break}x=m+130|0;B=(l>>>0)/(x>>>0)|0;if(B>>>0<x>>>0){y=x;z=1;A=l;break}if((l|0)==(X(B,x)|0)){y=x;z=9;A=n;break}x=m+136|0;B=(l>>>0)/(x>>>0)|0;if(B>>>0<x>>>0){y=x;z=1;A=l;break}if((l|0)==(X(B,x)|0)){y=x;z=9;A=n;break}x=m+138|0;B=(l>>>0)/(x>>>0)|0;if(B>>>0<x>>>0){y=x;z=1;A=l;break}if((l|0)==(X(B,x)|0)){y=x;z=9;A=n;break}x=m+142|0;B=(l>>>0)/(x>>>0)|0;if(B>>>0<x>>>0){y=x;z=1;A=l;break}if((l|0)==(X(B,x)|0)){y=x;z=9;A=n;break}x=m+148|0;B=(l>>>0)/(x>>>0)|0;if(B>>>0<x>>>0){y=x;z=1;A=l;break}if((l|0)==(X(B,x)|0)){y=x;z=9;A=n;break}x=m+150|0;B=(l>>>0)/(x>>>0)|0;if(B>>>0<x>>>0){y=x;z=1;A=l;break}if((l|0)==(X(B,x)|0)){y=x;z=9;A=n;break}x=m+156|0;B=(l>>>0)/(x>>>0)|0;if(B>>>0<x>>>0){y=x;z=1;A=l;break}if((l|0)==(X(B,x)|0)){y=x;z=9;A=n;break}x=m+162|0;B=(l>>>0)/(x>>>0)|0;if(B>>>0<x>>>0){y=x;z=1;A=l;break}if((l|0)==(X(B,x)|0)){y=x;z=9;A=n;break}x=m+166|0;B=(l>>>0)/(x>>>0)|0;if(B>>>0<x>>>0){y=x;z=1;A=l;break}if((l|0)==(X(B,x)|0)){y=x;z=9;A=n;break}x=m+168|0;B=(l>>>0)/(x>>>0)|0;if(B>>>0<x>>>0){y=x;z=1;A=l;break}if((l|0)==(X(B,x)|0)){y=x;z=9;A=n;break}x=m+172|0;B=(l>>>0)/(x>>>0)|0;if(B>>>0<x>>>0){y=x;z=1;A=l;break}if((l|0)==(X(B,x)|0)){y=x;z=9;A=n;break}x=m+178|0;B=(l>>>0)/(x>>>0)|0;if(B>>>0<x>>>0){y=x;z=1;A=l;break}if((l|0)==(X(B,x)|0)){y=x;z=9;A=n;break}x=m+180|0;B=(l>>>0)/(x>>>0)|0;if(B>>>0<x>>>0){y=x;z=1;A=l;break}if((l|0)==(X(B,x)|0)){y=x;z=9;A=n;break}x=m+186|0;B=(l>>>0)/(x>>>0)|0;if(B>>>0<x>>>0){y=x;z=1;A=l;break}if((l|0)==(X(B,x)|0)){y=x;z=9;A=n;break}x=m+190|0;B=(l>>>0)/(x>>>0)|0;if(B>>>0<x>>>0){y=x;z=1;A=l;break}if((l|0)==(X(B,x)|0)){y=x;z=9;A=n;break}x=m+192|0;B=(l>>>0)/(x>>>0)|0;if(B>>>0<x>>>0){y=x;z=1;A=l;break}if((l|0)==(X(B,x)|0)){y=x;z=9;A=n;break}x=m+196|0;B=(l>>>0)/(x>>>0)|0;if(B>>>0<x>>>0){y=x;z=1;A=l;break}if((l|0)==(X(B,x)|0)){y=x;z=9;A=n;break}x=m+198|0;B=(l>>>0)/(x>>>0)|0;if(B>>>0<x>>>0){y=x;z=1;A=l;break}if((l|0)==(X(B,x)|0)){y=x;z=9;A=n;break}x=m+208|0;B=(l>>>0)/(x>>>0)|0;C=B>>>0<x>>>0;D=(l|0)==(X(B,x)|0);y=C|D?x:m+210|0;z=C?1:D?9:0;A=C?l:n}else{y=w;z=1;A=l}}else{y=v;z=9;A=n}else{y=v;z=1;A=l}}else{y=t;z=9;A=n}else{y=t;z=1;A=l}}else{y=s;z=9;A=n}else{y=s;z=1;A=l}}else{y=q;z=9;A=n}else{y=q;z=1;A=l}}else{y=p;z=9;A=n}else{y=p;z=1;A=l}}else{y=m;z=9;A=n}else{y=m;z=1;A=l}while(0);switch(z&15){case 9:{r=A;break b;break}case 0:{m=y;n=A;o=8;break}default:break c}}if(!z)r=A;else{o=107;break a}}while(0);h=g+1|0;p=(h|0)==48;q=j+(p&1)|0;i=r;j=q;g=p?0:h;k=q*210|0}if((o|0)==106){f[d>>2]=l;E=l;break}else if((o|0)==107){f[d>>2]=l;E=A;break}}else{k=Hl(6760,6952,d,c)|0;E=f[k>>2]|0}while(0);u=b;return E|0}function db(a,c,d,e,g,i){a=a|0;c=c|0;d=d|0;e=e|0;g=g|0;i=i|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ja=0,Ka=0,La=0,Ma=0,Na=0,Oa=0,Pa=0,Qa=0,Ra=0,Sa=0,Ta=0.0,Ua=0.0,Va=0.0,Wa=0,Xa=0,Ya=0,Za=0,_a=0,$a=0,ab=0,bb=0,cb=0,db=0,eb=0,fb=0,gb=0,hb=0,ib=0,jb=0,kb=0,lb=0,mb=0,nb=0,ob=0,pb=0,qb=0,rb=0,sb=0,tb=0,ub=0,vb=0,wb=0,xb=0,yb=0,zb=0,Ab=0,Bb=0,Cb=0,Db=0,Eb=0,Fb=0,Gb=0;i=u;u=u+256|0;e=i+104|0;j=i+240|0;k=i+224|0;l=i+160|0;m=i+140|0;n=i+248|0;o=i+72|0;p=i+40|0;q=i+128|0;r=i;s=i+232|0;t=i+220|0;v=i+216|0;w=i+212|0;x=i+208|0;y=i+152|0;z=f[a+28>>2]|0;A=f[a+32>>2]|0;B=l;C=B+48|0;do{f[B>>2]=0;B=B+4|0}while((B|0)<(C|0));if(!g){D=0;E=0}else{Ci(l,g);D=f[l+12>>2]|0;E=f[l+16>>2]|0}B=l+16|0;C=E-D>>2;F=D;D=E;if(C>>>0>=g>>>0){if(C>>>0>g>>>0?(E=F+(g<<2)|0,(E|0)!=(D|0)):0)f[B>>2]=D+(~((D+-4-E|0)>>>2)<<2)}else Ci(l+12|0,g-C|0);C=l+24|0;E=l+28|0;D=f[E>>2]|0;B=f[C>>2]|0;F=D-B>>2;G=B;B=D;if(F>>>0>=g>>>0){if(F>>>0>g>>>0?(D=G+(g<<2)|0,(D|0)!=(B|0)):0)f[E>>2]=B+(~((B+-4-D|0)>>>2)<<2)}else Ci(C,g-F|0);F=l+36|0;C=l+40|0;D=f[C>>2]|0;B=f[F>>2]|0;E=D-B>>2;G=B;B=D;if(E>>>0>=g>>>0){if(E>>>0>g>>>0?(D=G+(g<<2)|0,(D|0)!=(B|0)):0)f[C>>2]=B+(~((B+-4-D|0)>>>2)<<2)}else Ci(F,g-E|0);f[m>>2]=0;E=m+4|0;f[E>>2]=0;f[m+8>>2]=0;F=(g|0)==0;do if(!F)if(g>>>0>1073741823)aq(m);else{D=g<<2;B=ln(D)|0;f[m>>2]=B;C=B+(g<<2)|0;f[m+8>>2]=C;sj(B|0,0,D|0)|0;f[E>>2]=C;break}while(0);C=a+136|0;D=a+140|0;B=f[D>>2]|0;G=f[C>>2]|0;H=B-G>>2;L=G;G=B;if(H>>>0>=g>>>0){if(H>>>0>g>>>0?(B=L+(g<<2)|0,(B|0)!=(G|0)):0)f[D>>2]=G+(~((G+-4-B|0)>>>2)<<2)}else Ci(C,g-H|0);f[o>>2]=0;f[o+4>>2]=0;f[o+8>>2]=0;f[o+12>>2]=0;f[o+16>>2]=0;f[o+20>>2]=0;f[o+24>>2]=0;f[o+28>>2]=0;f[p>>2]=0;f[p+4>>2]=0;f[p+8>>2]=0;f[p+12>>2]=0;f[p+16>>2]=0;f[p+20>>2]=0;f[p+24>>2]=0;f[p+28>>2]=0;f[q>>2]=0;H=q+4|0;f[H>>2]=0;f[q+8>>2]=0;if(F){M=0;N=0;O=0;P=0}else{F=g<<2;B=ln(F)|0;f[q>>2]=B;G=B+(g<<2)|0;f[q+8>>2]=G;sj(B|0,0,F|0)|0;f[H>>2]=G;M=B;N=G;O=G;P=B}B=a+36|0;G=f[B>>2]|0;F=f[G+4>>2]|0;D=f[G>>2]|0;L=F-D|0;a:do if((L|0)>4){Q=L>>2;R=z+64|0;S=z+28|0;T=(g|0)>0;U=r+4|0;V=r+8|0;Z=r+12|0;_=a+136|0;$=a+96|0;aa=r+16|0;ba=r+28|0;ca=a+8|0;da=j+4|0;ea=k+4|0;fa=e+4|0;ga=r+28|0;ha=r+16|0;ia=r+20|0;ja=r+32|0;ka=n+1|0;la=g<<2;ma=(g|0)==1;na=Q+-1|0;if(F-D>>2>>>0>na>>>0){oa=Q;pa=na;qa=D;ra=P;sa=O;ta=M;ua=M;va=N;wa=M;xa=N}else{ya=G;aq(ya)}b:while(1){na=f[qa+(pa<<2)>>2]|0;Q=(((na>>>0)%3|0|0)==0?2:-1)+na|0;za=Q>>>5;Aa=1<<(Q&31);Ba=(na|0)==-1|(Q|0)==-1;Ca=1;Da=0;Ea=na;c:while(1){Fa=Ca^1;Ga=Da;Ha=Ea;while(1){if((Ha|0)==-1){Ia=Ga;break c}Ja=f[l+(Ga*12|0)>>2]|0;if(((f[(f[z>>2]|0)+(Ha>>>5<<2)>>2]&1<<(Ha&31)|0)==0?(Ka=f[(f[(f[R>>2]|0)+12>>2]|0)+(Ha<<2)>>2]|0,(Ka|0)!=-1):0)?(La=f[S>>2]|0,Ma=f[A>>2]|0,Na=f[Ma+(f[La+(Ka<<2)>>2]<<2)>>2]|0,Oa=Ka+1|0,Pa=f[Ma+(f[La+((((Oa>>>0)%3|0|0)==0?Ka+-2|0:Oa)<<2)>>2]<<2)>>2]|0,Oa=f[Ma+(f[La+((((Ka>>>0)%3|0|0)==0?2:-1)+Ka<<2)>>2]<<2)>>2]|0,(Na|0)<(pa|0)&(Pa|0)<(pa|0)&(Oa|0)<(pa|0)):0){Ka=X(Na,g)|0;Na=X(Pa,g)|0;Pa=X(Oa,g)|0;if(T){Oa=0;do{f[Ja+(Oa<<2)>>2]=(f[c+(Oa+Pa<<2)>>2]|0)+(f[c+(Oa+Na<<2)>>2]|0)-(f[c+(Oa+Ka<<2)>>2]|0);Oa=Oa+1|0}while((Oa|0)!=(g|0))}Oa=Ga+1|0;if((Oa|0)==4){Ia=4;break c}else Qa=Oa}else Qa=Ga;do if(Ca){Oa=Ha+1|0;Ka=((Oa>>>0)%3|0|0)==0?Ha+-2|0:Oa;if(((Ka|0)!=-1?(f[(f[z>>2]|0)+(Ka>>>5<<2)>>2]&1<<(Ka&31)|0)==0:0)?(Oa=f[(f[(f[R>>2]|0)+12>>2]|0)+(Ka<<2)>>2]|0,Ka=Oa+1|0,(Oa|0)!=-1):0)Ra=((Ka>>>0)%3|0|0)==0?Oa+-2|0:Ka;else Ra=-1}else{Ka=(((Ha>>>0)%3|0|0)==0?2:-1)+Ha|0;if(((Ka|0)!=-1?(f[(f[z>>2]|0)+(Ka>>>5<<2)>>2]&1<<(Ka&31)|0)==0:0)?(Oa=f[(f[(f[R>>2]|0)+12>>2]|0)+(Ka<<2)>>2]|0,(Oa|0)!=-1):0)if(!((Oa>>>0)%3|0)){Ra=Oa+2|0;break}else{Ra=Oa+-1|0;break}else Ra=-1}while(0);if((Ra|0)==(na|0)){Ia=Qa;break c}if((Ra|0)!=-1|Fa){Ga=Qa;Ha=Ra}else break}if(Ba){Ca=0;Da=Qa;Ea=-1;continue}if(f[(f[z>>2]|0)+(za<<2)>>2]&Aa|0){Ca=0;Da=Qa;Ea=-1;continue}Ha=f[(f[(f[R>>2]|0)+12>>2]|0)+(Q<<2)>>2]|0;if((Ha|0)==-1){Ca=0;Da=Qa;Ea=-1;continue}if(!((Ha>>>0)%3|0)){Ca=0;Da=Qa;Ea=Ha+2|0;continue}else{Ca=0;Da=Qa;Ea=Ha+-1|0;continue}}Ea=X(pa,g)|0;f[r>>2]=0;f[U>>2]=0;b[V>>0]=0;f[Z>>2]=0;f[Z+4>>2]=0;f[Z+8>>2]=0;f[Z+12>>2]=0;f[Z+16>>2]=0;f[Z+20>>2]=0;f[Z+24>>2]=0;Da=Ia+-1|0;Ca=p+(Da<<3)|0;Q=Ca;Aa=Vn(f[Q>>2]|0,f[Q+4>>2]|0,Ia|0,((Ia|0)<0)<<31>>31|0)|0;Q=I;za=Ca;f[za>>2]=Aa;f[za+4>>2]=Q;za=c+((X(oa+-2|0,g)|0)<<2)|0;Ca=c+(Ea<<2)|0;Ba=f[_>>2]|0;if(T){na=0;Ha=0;while(1){Ga=(f[za+(na<<2)>>2]|0)-(f[Ca+(na<<2)>>2]|0)|0;Fa=((Ga|0)>-1?Ga:0-Ga|0)+Ha|0;f[ta+(na<<2)>>2]=Ga;f[Ba+(na<<2)>>2]=Ga<<1^Ga>>31;na=na+1|0;if((na|0)==(g|0)){Sa=Fa;break}else Ha=Fa}}else Sa=0;mo(e,$,Ba,g);Ha=Zk(e)|0;na=I;Fa=Bm(e)|0;Ga=I;Oa=o+(Da<<3)|0;Ka=Oa;Na=f[Ka>>2]|0;Pa=f[Ka+4>>2]|0;Ta=+wm(Aa,Na);Ka=Vn(Fa|0,Ga|0,Ha|0,na|0)|0;Ua=+(Aa>>>0)+4294967296.0*+(Q|0);Va=+W(+(Ta*Ua));na=Vn(Ka|0,I|0,~~Va>>>0|0,(+K(Va)>=1.0?(Va>0.0?~~+Y(+J(Va/4294967296.0),4294967295.0)>>>0:~~+W((Va-+(~~Va>>>0))/4294967296.0)>>>0):0)|0)|0;Ka=r;f[Ka>>2]=na;f[Ka+4>>2]=Sa;b[V>>0]=0;f[Z>>2]=0;$f(aa,za,za+(g<<2)|0);f[s>>2]=ra;f[t>>2]=sa;f[j>>2]=f[s>>2];f[e>>2]=f[t>>2];Jf(ba,j,e);if((Ia|0)<1){Wa=xa;Xa=wa;Ya=va;Za=ua;_a=sa;$a=ra;ab=ra}else{Ka=n+Ia|0;na=f[q>>2]|0;Ha=na;Ga=f[H>>2]|0;Fa=Ka+-1|0;Ja=(Fa|0)==(n|0);La=Ka+-2|0;Ma=ka>>>0<La>>>0;bb=~Ia;cb=Ia+2+((bb|0)>-2?bb:-2)|0;bb=Ga;db=Fa>>>0>n>>>0;eb=0;fb=1;while(1){eb=eb+1|0;sj(n|0,1,cb|0)|0;sj(n|0,0,eb|0)|0;gb=Vn(Na|0,Pa|0,fb|0,0)|0;d:while(1){if(T){sj(f[m>>2]|0,0,la|0)|0;hb=f[m>>2]|0;ib=0;jb=0;while(1){if(!(b[n+ib>>0]|0)){kb=f[l+(ib*12|0)>>2]|0;lb=0;do{mb=hb+(lb<<2)|0;f[mb>>2]=(f[mb>>2]|0)+(f[kb+(lb<<2)>>2]|0);lb=lb+1|0}while((lb|0)!=(g|0));nb=(1<<ib|jb&255)&255}else nb=jb;ib=ib+1|0;if((ib|0)==(Ia|0)){ob=nb;break}else jb=nb}}else{jb=0;ib=0;while(1){if(!(b[n+jb>>0]|0))pb=(1<<jb|ib&255)&255;else pb=ib;jb=jb+1|0;if((jb|0)==(Ia|0)){ob=pb;break}else ib=pb}}ib=f[m>>2]|0;do if(T){f[ib>>2]=(f[ib>>2]|0)/(fb|0)|0;if(!ma){jb=1;do{hb=ib+(jb<<2)|0;f[hb>>2]=(f[hb>>2]|0)/(fb|0)|0;jb=jb+1|0}while((jb|0)!=(g|0));jb=f[_>>2]|0;if(T)qb=jb;else{rb=0;sb=jb;break}}else qb=f[_>>2]|0;jb=0;hb=0;while(1){lb=(f[ib+(jb<<2)>>2]|0)-(f[Ca+(jb<<2)>>2]|0)|0;kb=((lb|0)>-1?lb:0-lb|0)+hb|0;f[na+(jb<<2)>>2]=lb;f[qb+(jb<<2)>>2]=lb<<1^lb>>31;jb=jb+1|0;if((jb|0)==(g|0)){rb=kb;sb=qb;break}else hb=kb}}else{rb=0;sb=f[_>>2]|0}while(0);mo(e,$,sb,g);ib=Zk(e)|0;hb=I;jb=Bm(e)|0;kb=I;Va=+wm(Aa,gb);lb=Vn(jb|0,kb|0,ib|0,hb|0)|0;Ta=+W(+(Va*Ua));hb=Vn(lb|0,I|0,~~Ta>>>0|0,(+K(Ta)>=1.0?(Ta>0.0?~~+Y(+J(Ta/4294967296.0),4294967295.0)>>>0:~~+W((Ta-+(~~Ta>>>0))/4294967296.0)>>>0):0)|0)|0;lb=f[r>>2]|0;if(!((lb|0)<=(hb|0)?!((lb|0)>=(hb|0)?(rb|0)<(f[U>>2]|0):0):0)){lb=r;f[lb>>2]=hb;f[lb+4>>2]=rb;b[V>>0]=ob;f[Z>>2]=fb;f[v>>2]=f[m>>2];f[w>>2]=f[E>>2];f[j>>2]=f[v>>2];f[e>>2]=f[w>>2];Jf(aa,j,e);f[x>>2]=Ha;f[y>>2]=Ga;f[j>>2]=f[x>>2];f[e>>2]=f[y>>2];Jf(ba,j,e)}if(Ja)break;tb=b[Fa>>0]|0;lb=-1;hb=tb;while(1){ib=lb+-1|0;ub=Ka+ib|0;kb=hb;hb=b[ub>>0]|0;if((hb&255)<(kb&255))break;if((ub|0)==(n|0)){vb=84;break d}else lb=ib}ib=Ka+lb|0;if((hb&255)<(tb&255)){wb=Fa;xb=tb}else{kb=Ka;jb=Fa;while(1){mb=jb+-1|0;if((hb&255)<(h[kb+-2>>0]|0)){wb=mb;xb=1;break}else{yb=jb;jb=mb;kb=yb}}}b[ub>>0]=xb;b[wb>>0]=hb;if((lb|0)<-1){zb=ib;Ab=Fa}else continue;while(1){kb=b[zb>>0]|0;b[zb>>0]=b[Ab>>0]|0;b[Ab>>0]=kb;kb=zb+1|0;jb=Ab+-1|0;if(kb>>>0<jb>>>0){zb=kb;Ab=jb}else continue d}}if(((vb|0)==84?(vb=0,db):0)?(gb=b[n>>0]|0,b[n>>0]=tb,b[Fa>>0]=gb,Ma):0){gb=La;ib=ka;do{lb=b[ib>>0]|0;b[ib>>0]=b[gb>>0]|0;b[gb>>0]=lb;ib=ib+1|0;gb=gb+-1|0}while(ib>>>0<gb>>>0)}if((fb|0)>=(Ia|0)){Wa=bb;Xa=na;Ya=bb;Za=na;_a=Ga;$a=Ha;ab=na;break}else fb=fb+1|0}}fb=f[Z>>2]|0;na=Vn(Na|0,Pa|0,fb|0,((fb|0)<0)<<31>>31|0)|0;fb=Oa;f[fb>>2]=na;f[fb+4>>2]=I;if(T){fb=f[ba>>2]|0;na=f[C>>2]|0;Ha=0;do{Ga=f[fb+(Ha<<2)>>2]|0;f[na+(Ha<<2)>>2]=Ga<<1^Ga>>31;Ha=Ha+1|0}while((Ha|0)!=(g|0));Bb=na}else Bb=f[C>>2]|0;lo(e,$,Bb,g);if((Ia|0)>0){Cb=a+40+(Da*12|0)|0;na=a+40+(Da*12|0)+4|0;Ha=a+40+(Da*12|0)+8|0;fb=0;do{Oa=f[na>>2]|0;Pa=f[Ha>>2]|0;Na=(Oa|0)==(Pa<<5|0);if(!(1<<fb&h[V>>0])){if(Na){if((Oa+1|0)<0){vb=95;break b}Ga=Pa<<6;bb=Oa+32&-32;vi(Cb,Oa>>>0<1073741823?(Ga>>>0<bb>>>0?bb:Ga):2147483647);Db=f[na>>2]|0}else Db=Oa;f[na>>2]=Db+1;Ga=(f[Cb>>2]|0)+(Db>>>5<<2)|0;f[Ga>>2]=f[Ga>>2]|1<<(Db&31)}else{if(Na){if((Oa+1|0)<0){vb=100;break b}Na=Pa<<6;Pa=Oa+32&-32;vi(Cb,Oa>>>0<1073741823?(Na>>>0<Pa>>>0?Pa:Na):2147483647);Eb=f[na>>2]|0}else Eb=Oa;f[na>>2]=Eb+1;Oa=(f[Cb>>2]|0)+(Eb>>>5<<2)|0;f[Oa>>2]=f[Oa>>2]&~(1<<(Eb&31))}fb=fb+1|0}while((fb|0)<(Ia|0))}fb=f[aa>>2]|0;na=d+(Ea<<2)|0;Ha=f[Ca+4>>2]|0;Da=f[fb>>2]|0;Oa=f[fb+4>>2]|0;f[j>>2]=f[Ca>>2];f[da>>2]=Ha;f[k>>2]=Da;f[ea>>2]=Oa;Od(e,ca,j,k);f[na>>2]=f[e>>2];f[na+4>>2]=f[fa>>2];na=f[ga>>2]|0;if(na|0){Oa=f[ja>>2]|0;if((Oa|0)!=(na|0))f[ja>>2]=Oa+(~((Oa+-4-na|0)>>>2)<<2);Oq(na)}na=f[ha>>2]|0;if(na|0){Oa=f[ia>>2]|0;if((Oa|0)!=(na|0))f[ia>>2]=Oa+(~((Oa+-4-na|0)>>>2)<<2);Oq(na)}if((oa|0)<=2){Fb=Za;Gb=Ya;break a}na=f[B>>2]|0;qa=f[na>>2]|0;Oa=pa+-1|0;if((f[na+4>>2]|0)-qa>>2>>>0<=Oa>>>0){ya=na;vb=18;break}else{na=pa;pa=Oa;ra=$a;sa=_a;ta=ab;ua=Za;va=Ya;wa=Xa;xa=Wa;oa=na}}if((vb|0)==18)aq(ya);else if((vb|0)==95)aq(Cb);else if((vb|0)==100)aq(Cb)}else{Fb=M;Gb=N}while(0);if((g|0)>0)sj(f[l>>2]|0,0,g<<2|0)|0;g=f[l>>2]|0;N=f[c+4>>2]|0;M=f[g>>2]|0;Cb=f[g+4>>2]|0;f[j>>2]=f[c>>2];f[j+4>>2]=N;f[k>>2]=M;f[k+4>>2]=Cb;Od(e,a+8|0,j,k);f[d>>2]=f[e>>2];f[d+4>>2]=f[e+4>>2];if(Fb|0){if((Gb|0)!=(Fb|0))f[H>>2]=Gb+(~((Gb+-4-Fb|0)>>>2)<<2);Oq(Fb)}Fb=f[m>>2]|0;if(Fb|0){m=f[E>>2]|0;if((m|0)!=(Fb|0))f[E>>2]=m+(~((m+-4-Fb|0)>>>2)<<2);Oq(Fb)}Fb=f[l+36>>2]|0;if(Fb|0){m=l+40|0;E=f[m>>2]|0;if((E|0)!=(Fb|0))f[m>>2]=E+(~((E+-4-Fb|0)>>>2)<<2);Oq(Fb)}Fb=f[l+24>>2]|0;if(Fb|0){E=l+28|0;m=f[E>>2]|0;if((m|0)!=(Fb|0))f[E>>2]=m+(~((m+-4-Fb|0)>>>2)<<2);Oq(Fb)}Fb=f[l+12>>2]|0;if(Fb|0){m=l+16|0;E=f[m>>2]|0;if((E|0)!=(Fb|0))f[m>>2]=E+(~((E+-4-Fb|0)>>>2)<<2);Oq(Fb)}Fb=f[l>>2]|0;if(!Fb){u=i;return 1}E=l+4|0;l=f[E>>2]|0;if((l|0)!=(Fb|0))f[E>>2]=l+(~((l+-4-Fb|0)>>>2)<<2);Oq(Fb);u=i;return 1}function eb(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ja=0,Ka=0,La=0,Ma=0,Na=0,Oa=0,Pa=0,Qa=0,Ra=0,Sa=0,Ta=0,Ua=0,Va=0,Wa=0,Xa=0,Ya=0,Za=0,_a=0,$a=0,ab=0,bb=0,cb=0,db=0,eb=0,fb=0,gb=0,hb=0,ib=0,jb=0,kb=0,lb=0,mb=0,nb=0,ob=0,pb=0,qb=0,rb=0,sb=0,tb=0,ub=0,vb=0,wb=0,xb=0,yb=0,zb=0,Ab=0,Bb=0,Cb=0,Db=0,Eb=0,Fb=0,Gb=0,Hb=0,Ib=0,Jb=0,Kb=0,Lb=0,Mb=0,Nb=0,Ob=0,Pb=0,Qb=0,Rb=0,Sb=0,Tb=0,Ub=0,Vb=0,Wb=0,Xb=0,Yb=0,Zb=0,_b=0;c=u;u=u+32|0;d=c+16|0;e=c+4|0;g=c;f[a+36>>2]=b;h=a+24|0;i=a+28|0;j=f[i>>2]|0;k=f[h>>2]|0;l=j-k>>2;m=k;k=j;if(l>>>0>=b>>>0){if(l>>>0>b>>>0?(j=m+(b<<2)|0,(j|0)!=(k|0)):0)f[i>>2]=k+(~((k+-4-j|0)>>>2)<<2)}else Ch(h,b-l|0,6140);f[d>>2]=0;l=d+4|0;f[l>>2]=0;j=d+8|0;f[j>>2]=0;if(b){if((b|0)<0)aq(d);k=((b+-1|0)>>>5)+1|0;m=ln(k<<2)|0;f[d>>2]=m;f[j>>2]=k;f[l>>2]=b;k=b>>>5;sj(m|0,0,k<<2|0)|0;n=b&31;o=m+(k<<2)|0;k=m;if(!n){p=b;q=k;r=m}else{f[o>>2]=f[o>>2]&~(-1>>>(32-n|0));p=b;q=k;r=m}}else{p=0;q=0;r=0}m=a+4|0;k=f[a>>2]|0;n=(f[m>>2]|0)-k|0;o=n>>2;f[e>>2]=0;s=e+4|0;f[s>>2]=0;t=e+8|0;f[t>>2]=0;do if(o){if((n|0)<0)aq(e);v=((o+-1|0)>>>5)+1|0;w=ln(v<<2)|0;f[e>>2]=w;f[t>>2]=v;f[s>>2]=o;v=o>>>5;sj(w|0,0,v<<2|0)|0;x=o&31;y=w+(v<<2)|0;if(x|0)f[y>>2]=f[y>>2]&~(-1>>>(32-x|0));if(o>>>0>2){x=a+12|0;y=a+32|0;v=a+52|0;w=a+56|0;z=a+48|0;A=b;B=k;C=0;D=q;E=r;a:while(1){F=B;G=C*3|0;if((G|0)!=-1){H=f[F+(G<<2)>>2]|0;I=G+1|0;J=((I>>>0)%3|0|0)==0?G+-2|0:I;if((J|0)==-1)K=-1;else K=f[F+(J<<2)>>2]|0;J=(((G>>>0)%3|0|0)==0?2:-1)+G|0;if((J|0)==-1)L=-1;else L=f[F+(J<<2)>>2]|0;if((H|0)!=(K|0)?!((H|0)==(L|0)|(K|0)==(L|0)):0){H=0;J=A;F=E;I=D;while(1){M=H+G|0;if(!(f[(f[e>>2]|0)+(M>>>5<<2)>>2]&1<<(M&31))){N=f[(f[a>>2]|0)+(M<<2)>>2]|0;f[g>>2]=N;if(!(f[F+(N>>>5<<2)>>2]&1<<(N&31))){O=0;P=J;Q=N}else{N=f[i>>2]|0;if((N|0)==(f[y>>2]|0))Ri(h,6140);else{f[N>>2]=-1;f[i>>2]=N+4}N=f[v>>2]|0;if((N|0)==(f[w>>2]|0))Ri(z,g);else{f[N>>2]=f[g>>2];f[v>>2]=N+4}N=f[l>>2]|0;R=f[j>>2]|0;if((N|0)==(R<<5|0)){if((N+1|0)<0){S=50;break a}T=R<<6;R=N+32&-32;vi(d,N>>>0<1073741823?(T>>>0<R>>>0?R:T):2147483647);U=f[l>>2]|0}else U=N;f[l>>2]=U+1;N=(f[d>>2]|0)+(U>>>5<<2)|0;f[N>>2]=f[N>>2]&~(1<<(U&31));f[g>>2]=J;O=1;P=J+1|0;Q=J}N=f[d>>2]|0;T=N+(Q>>>5<<2)|0;f[T>>2]=f[T>>2]|1<<(Q&31);T=N;b:do if(O){R=M;while(1){if((R|0)==-1){S=64;break b}V=(f[e>>2]|0)+(R>>>5<<2)|0;f[V>>2]=f[V>>2]|1<<(R&31);V=f[g>>2]|0;f[(f[h>>2]|0)+(V<<2)>>2]=R;f[(f[a>>2]|0)+(R<<2)>>2]=V;V=R+1|0;W=((V>>>0)%3|0|0)==0?R+-2|0:V;do if((W|0)==-1)X=-1;else{V=f[(f[x>>2]|0)+(W<<2)>>2]|0;Y=V+1|0;if((V|0)==-1){X=-1;break}X=((Y>>>0)%3|0|0)==0?V+-2|0:Y}while(0);if((X|0)==(M|0))break;else R=X}}else{R=M;while(1){if((R|0)==-1){S=64;break b}W=(f[e>>2]|0)+(R>>>5<<2)|0;f[W>>2]=f[W>>2]|1<<(R&31);f[(f[h>>2]|0)+(f[g>>2]<<2)>>2]=R;W=R+1|0;Y=((W>>>0)%3|0|0)==0?R+-2|0:W;do if((Y|0)==-1)Z=-1;else{W=f[(f[x>>2]|0)+(Y<<2)>>2]|0;V=W+1|0;if((W|0)==-1){Z=-1;break}Z=((V>>>0)%3|0|0)==0?W+-2|0:V}while(0);if((Z|0)==(M|0))break;else R=Z}}while(0);c:do if((S|0)==64){S=0;if((M|0)==-1)break;R=(((M>>>0)%3|0|0)==0?2:-1)+M|0;if((R|0)==-1)break;Y=f[(f[x>>2]|0)+(R<<2)>>2]|0;if((Y|0)==-1)break;R=Y+(((Y>>>0)%3|0|0)==0?2:-1)|0;if((R|0)==-1)break;if(!O){Y=R;while(1){V=(f[e>>2]|0)+(Y>>>5<<2)|0;f[V>>2]=f[V>>2]|1<<(Y&31);V=(((Y>>>0)%3|0|0)==0?2:-1)+Y|0;if((V|0)==-1)break c;W=f[(f[x>>2]|0)+(V<<2)>>2]|0;if((W|0)==-1)break c;Y=W+(((W>>>0)%3|0|0)==0?2:-1)|0;if((Y|0)==-1)break c}}Y=f[a>>2]|0;W=R;do{V=(f[e>>2]|0)+(W>>>5<<2)|0;f[V>>2]=f[V>>2]|1<<(W&31);f[Y+(W<<2)>>2]=f[g>>2];V=(((W>>>0)%3|0|0)==0?2:-1)+W|0;if((V|0)==-1)break c;_=f[(f[x>>2]|0)+(V<<2)>>2]|0;if((_|0)==-1)break c;W=_+(((_>>>0)%3|0|0)==0?2:-1)|0}while((W|0)!=-1)}while(0);$=P;aa=T;ba=N}else{$=J;aa=I;ba=F}if((H|0)<2){H=H+1|0;J=$;F=ba;I=aa}else{ca=$;da=aa;ea=ba;break}}}else{ca=A;da=D;ea=E}}else{ca=A;da=D;ea=E}C=C+1|0;B=f[a>>2]|0;if(C>>>0>=(((f[m>>2]|0)-B>>2>>>0)/3|0)>>>0){S=18;break}else{A=ca;D=da;E=ea}}if((S|0)==18){fa=da;ga=f[l>>2]|0;break}else if((S|0)==50)aq(d)}else{fa=q;ga=p}}else{fa=q;ga=p}while(0);p=a+44|0;f[p>>2]=0;a=fa;fa=ga>>>5;q=a+(fa<<2)|0;S=ga&31;ga=(fa|0)!=0;d:do if(fa|S|0)if(!S){l=a;da=0;ea=ga;while(1){e:do if(ea){if(!(f[l>>2]&1)){ca=da+1|0;f[p>>2]=ca;ha=ca}else ha=da;if(!(f[l>>2]&2)){ca=ha+1|0;f[p>>2]=ca;ia=ca}else ia=ha;if(!(f[l>>2]&4)){ca=ia+1|0;f[p>>2]=ca;ja=ca}else ja=ia;if(!(f[l>>2]&8)){ca=ja+1|0;f[p>>2]=ca;ka=ca}else ka=ja;if(!(f[l>>2]&16)){ca=ka+1|0;f[p>>2]=ca;la=ca}else la=ka;if(!(f[l>>2]&32)){ca=la+1|0;f[p>>2]=ca;ma=ca}else ma=la;if(!(f[l>>2]&64)){ca=ma+1|0;f[p>>2]=ca;na=ca}else na=ma;if(!(f[l>>2]&128)){ca=na+1|0;f[p>>2]=ca;oa=ca}else oa=na;if(!(f[l>>2]&256)){ca=oa+1|0;f[p>>2]=ca;pa=ca}else pa=oa;if(!(f[l>>2]&512)){ca=pa+1|0;f[p>>2]=ca;qa=ca}else qa=pa;if(!(f[l>>2]&1024)){ca=qa+1|0;f[p>>2]=ca;ra=ca}else ra=qa;if(!(f[l>>2]&2048)){ca=ra+1|0;f[p>>2]=ca;sa=ca}else sa=ra;if(!(f[l>>2]&4096)){ca=sa+1|0;f[p>>2]=ca;ta=ca}else ta=sa;if(!(f[l>>2]&8192)){ca=ta+1|0;f[p>>2]=ca;ua=ca}else ua=ta;if(!(f[l>>2]&16384)){ca=ua+1|0;f[p>>2]=ca;va=ca}else va=ua;if(!(f[l>>2]&32768)){ca=va+1|0;f[p>>2]=ca;wa=ca}else wa=va;if(!(f[l>>2]&65536)){ca=wa+1|0;f[p>>2]=ca;xa=ca}else xa=wa;if(!(f[l>>2]&131072)){ca=xa+1|0;f[p>>2]=ca;ya=ca}else ya=xa;if(!(f[l>>2]&262144)){ca=ya+1|0;f[p>>2]=ca;za=ca}else za=ya;if(!(f[l>>2]&524288)){ca=za+1|0;f[p>>2]=ca;Aa=ca}else Aa=za;if(!(f[l>>2]&1048576)){ca=Aa+1|0;f[p>>2]=ca;Ba=ca}else Ba=Aa;if(!(f[l>>2]&2097152)){ca=Ba+1|0;f[p>>2]=ca;Ca=ca}else Ca=Ba;if(!(f[l>>2]&4194304)){ca=Ca+1|0;f[p>>2]=ca;Da=ca}else Da=Ca;if(!(f[l>>2]&8388608)){ca=Da+1|0;f[p>>2]=ca;Ea=ca}else Ea=Da;if(!(f[l>>2]&16777216)){ca=Ea+1|0;f[p>>2]=ca;Fa=ca}else Fa=Ea;if(!(f[l>>2]&33554432)){ca=Fa+1|0;f[p>>2]=ca;Ga=ca}else Ga=Fa;if(!(f[l>>2]&67108864)){ca=Ga+1|0;f[p>>2]=ca;Ha=ca}else Ha=Ga;if(!(f[l>>2]&134217728)){ca=Ha+1|0;f[p>>2]=ca;Ia=ca}else Ia=Ha;if(!(f[l>>2]&268435456)){ca=Ia+1|0;f[p>>2]=ca;Ja=ca}else Ja=Ia;if(!(f[l>>2]&536870912)){ca=Ja+1|0;f[p>>2]=ca;Ka=ca}else Ka=Ja;if(!(f[l>>2]&1073741824)){ca=Ka+1|0;f[p>>2]=ca;La=ca}else La=Ka;if((f[l>>2]|0)<=-1){Ma=La;break}ca=La+1|0;f[p>>2]=ca;Ma=ca}else{ca=0;m=da;while(1){if(!(f[l>>2]&1<<ca)){ba=m+1|0;f[p>>2]=ba;Na=ba}else Na=m;if((ca|0)==31){Ma=Na;break e}ca=ca+1|0;if(!ca)break d;else m=Na}}while(0);l=l+4|0;if((q|0)==(l|0))break;else{da=Ma;ea=1}}}else{if(ga){ea=0;da=a;l=0;while(1){if(!(f[da>>2]&1)){m=l+1|0;f[p>>2]=m;Oa=m;Pa=m}else{Oa=l;Pa=ea}if(!(f[da>>2]&2)){m=Oa+1|0;f[p>>2]=m;Qa=m;Ra=m}else{Qa=Oa;Ra=Pa}if(!(f[da>>2]&4)){m=Qa+1|0;f[p>>2]=m;Sa=m;Ta=m}else{Sa=Qa;Ta=Ra}if(!(f[da>>2]&8)){m=Sa+1|0;f[p>>2]=m;Ua=m;Va=m}else{Ua=Sa;Va=Ta}if(!(f[da>>2]&16)){m=Ua+1|0;f[p>>2]=m;Wa=m;Xa=m}else{Wa=Ua;Xa=Va}if(!(f[da>>2]&32)){m=Wa+1|0;f[p>>2]=m;Ya=m;Za=m}else{Ya=Wa;Za=Xa}if(!(f[da>>2]&64)){m=Ya+1|0;f[p>>2]=m;_a=m;$a=m}else{_a=Ya;$a=Za}if(!(f[da>>2]&128)){m=_a+1|0;f[p>>2]=m;ab=m;bb=m}else{ab=_a;bb=$a}if(!(f[da>>2]&256)){m=ab+1|0;f[p>>2]=m;cb=m;db=m}else{cb=ab;db=bb}if(!(f[da>>2]&512)){m=cb+1|0;f[p>>2]=m;eb=m;fb=m}else{eb=cb;fb=db}if(!(f[da>>2]&1024)){m=eb+1|0;f[p>>2]=m;gb=m;hb=m}else{gb=eb;hb=fb}if(!(f[da>>2]&2048)){m=gb+1|0;f[p>>2]=m;ib=m;jb=m}else{ib=gb;jb=hb}if(!(f[da>>2]&4096)){m=ib+1|0;f[p>>2]=m;kb=m;lb=m}else{kb=ib;lb=jb}if(!(f[da>>2]&8192)){m=kb+1|0;f[p>>2]=m;mb=m;nb=m}else{mb=kb;nb=lb}if(!(f[da>>2]&16384)){m=mb+1|0;f[p>>2]=m;ob=m;pb=m}else{ob=mb;pb=nb}if(!(f[da>>2]&32768)){m=ob+1|0;f[p>>2]=m;qb=m;rb=m}else{qb=ob;rb=pb}if(!(f[da>>2]&65536)){m=qb+1|0;f[p>>2]=m;sb=m;tb=m}else{sb=qb;tb=rb}if(!(f[da>>2]&131072)){m=sb+1|0;f[p>>2]=m;ub=m;vb=m}else{ub=sb;vb=tb}if(!(f[da>>2]&262144)){m=ub+1|0;f[p>>2]=m;wb=m;xb=m}else{wb=ub;xb=vb}if(!(f[da>>2]&524288)){m=wb+1|0;f[p>>2]=m;yb=m;zb=m}else{yb=wb;zb=xb}if(!(f[da>>2]&1048576)){m=yb+1|0;f[p>>2]=m;Ab=m;Bb=m}else{Ab=yb;Bb=zb}if(!(f[da>>2]&2097152)){m=Ab+1|0;f[p>>2]=m;Cb=m;Db=m}else{Cb=Ab;Db=Bb}if(!(f[da>>2]&4194304)){m=Cb+1|0;f[p>>2]=m;Eb=m;Fb=m}else{Eb=Cb;Fb=Db}if(!(f[da>>2]&8388608)){m=Eb+1|0;f[p>>2]=m;Gb=m;Hb=m}else{Gb=Eb;Hb=Fb}if(!(f[da>>2]&16777216)){m=Gb+1|0;f[p>>2]=m;Ib=m;Jb=m}else{Ib=Gb;Jb=Hb}if(!(f[da>>2]&33554432)){m=Ib+1|0;f[p>>2]=m;Kb=m;Lb=m}else{Kb=Ib;Lb=Jb}if(!(f[da>>2]&67108864)){m=Kb+1|0;f[p>>2]=m;Mb=m;Nb=m}else{Mb=Kb;Nb=Lb}if(!(f[da>>2]&134217728)){m=Mb+1|0;f[p>>2]=m;Ob=m;Pb=m}else{Ob=Mb;Pb=Nb}if(!(f[da>>2]&268435456)){m=Ob+1|0;f[p>>2]=m;Qb=m;Rb=m}else{Qb=Ob;Rb=Pb}if(!(f[da>>2]&536870912)){m=Qb+1|0;f[p>>2]=m;Sb=m;Tb=m}else{Sb=Qb;Tb=Rb}if(!(f[da>>2]&1073741824)){m=Sb+1|0;f[p>>2]=m;Ub=m;Vb=m}else{Ub=Sb;Vb=Tb}if((f[da>>2]|0)>-1){m=Ub+1|0;f[p>>2]=m;Wb=m;Xb=m}else{Wb=Ub;Xb=Vb}m=da+4|0;if((q|0)==(m|0)){Yb=m;Zb=Xb;break}else{ea=Xb;da=m;l=Wb}}}else{Yb=a;Zb=0}l=0;da=Zb;while(1){if(!(f[Yb>>2]&1<<l)){ea=da+1|0;f[p>>2]=ea;_b=ea}else _b=da;l=l+1|0;if((l|0)==(S|0))break;else da=_b}}while(0);_b=f[e>>2]|0;if(_b|0)Oq(_b);_b=f[d>>2]|0;if(!_b){u=c;return 1}Oq(_b);u=c;return 1}function fb(a,c,d,e,g,i){a=a|0;c=c|0;d=d|0;e=e|0;g=g|0;i=i|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ja=0,Ka=0,La=0,Ma=0,Na=0,Oa=0,Pa=0,Qa=0,Ra=0,Sa=0,Ta=0.0,Ua=0.0,Va=0.0,Wa=0,Xa=0,Ya=0,Za=0,_a=0,$a=0,ab=0,bb=0,cb=0,db=0,eb=0,fb=0,gb=0,hb=0,ib=0,jb=0,kb=0,lb=0,mb=0,nb=0,ob=0,pb=0,qb=0,rb=0,sb=0,tb=0,ub=0,vb=0,wb=0,xb=0,yb=0,zb=0,Ab=0,Bb=0,Cb=0,Db=0,Eb=0,Fb=0,Gb=0,Hb=0,Ib=0;i=u;u=u+256|0;e=i+104|0;j=i+240|0;k=i+224|0;l=i+160|0;m=i+140|0;n=i+248|0;o=i+72|0;p=i+40|0;q=i+128|0;r=i;s=i+232|0;t=i+220|0;v=i+216|0;w=i+212|0;x=i+208|0;y=i+152|0;z=f[a+28>>2]|0;A=f[a+32>>2]|0;B=l;C=B+48|0;do{f[B>>2]=0;B=B+4|0}while((B|0)<(C|0));if(!g){D=0;E=0}else{Ci(l,g);D=f[l+12>>2]|0;E=f[l+16>>2]|0}B=l+16|0;C=E-D>>2;F=D;D=E;if(C>>>0>=g>>>0){if(C>>>0>g>>>0?(E=F+(g<<2)|0,(E|0)!=(D|0)):0)f[B>>2]=D+(~((D+-4-E|0)>>>2)<<2)}else Ci(l+12|0,g-C|0);C=l+24|0;E=l+28|0;D=f[E>>2]|0;B=f[C>>2]|0;F=D-B>>2;G=B;B=D;if(F>>>0>=g>>>0){if(F>>>0>g>>>0?(D=G+(g<<2)|0,(D|0)!=(B|0)):0)f[E>>2]=B+(~((B+-4-D|0)>>>2)<<2)}else Ci(C,g-F|0);F=l+36|0;C=l+40|0;D=f[C>>2]|0;B=f[F>>2]|0;E=D-B>>2;G=B;B=D;if(E>>>0>=g>>>0){if(E>>>0>g>>>0?(D=G+(g<<2)|0,(D|0)!=(B|0)):0)f[C>>2]=B+(~((B+-4-D|0)>>>2)<<2)}else Ci(F,g-E|0);f[m>>2]=0;E=m+4|0;f[E>>2]=0;f[m+8>>2]=0;F=(g|0)==0;do if(!F)if(g>>>0>1073741823)aq(m);else{D=g<<2;B=ln(D)|0;f[m>>2]=B;C=B+(g<<2)|0;f[m+8>>2]=C;sj(B|0,0,D|0)|0;f[E>>2]=C;break}while(0);C=a+136|0;D=a+140|0;B=f[D>>2]|0;G=f[C>>2]|0;H=B-G>>2;L=G;G=B;if(H>>>0>=g>>>0){if(H>>>0>g>>>0?(B=L+(g<<2)|0,(B|0)!=(G|0)):0)f[D>>2]=G+(~((G+-4-B|0)>>>2)<<2)}else Ci(C,g-H|0);f[o>>2]=0;f[o+4>>2]=0;f[o+8>>2]=0;f[o+12>>2]=0;f[o+16>>2]=0;f[o+20>>2]=0;f[o+24>>2]=0;f[o+28>>2]=0;f[p>>2]=0;f[p+4>>2]=0;f[p+8>>2]=0;f[p+12>>2]=0;f[p+16>>2]=0;f[p+20>>2]=0;f[p+24>>2]=0;f[p+28>>2]=0;f[q>>2]=0;H=q+4|0;f[H>>2]=0;f[q+8>>2]=0;if(F){M=0;N=0;O=0;P=0}else{F=g<<2;B=ln(F)|0;f[q>>2]=B;G=B+(g<<2)|0;f[q+8>>2]=G;sj(B|0,0,F|0)|0;f[H>>2]=G;M=B;N=G;O=G;P=B}B=a+36|0;G=f[B>>2]|0;F=f[G+4>>2]|0;D=f[G>>2]|0;L=F-D|0;a:do if((L|0)>4){Q=L>>2;R=z+12|0;S=(g|0)>0;T=r+4|0;U=r+8|0;V=r+12|0;Z=a+136|0;_=a+96|0;$=r+16|0;aa=r+28|0;ba=a+8|0;ca=j+4|0;da=k+4|0;ea=e+4|0;fa=r+28|0;ga=r+16|0;ha=r+20|0;ia=r+32|0;ja=n+1|0;ka=g<<2;la=(g|0)==1;ma=Q+-1|0;if(F-D>>2>>>0>ma>>>0){na=Q;oa=ma;pa=P;qa=O;ra=M;sa=M;ta=N;ua=M;va=N;wa=D}else{xa=G;aq(xa)}b:while(1){ma=f[wa+(oa<<2)>>2]|0;Q=(((ma>>>0)%3|0|0)==0?2:-1)+ma|0;ya=(ma|0)==-1|(Q|0)==-1;za=1;Aa=0;Ba=ma;c:while(1){Ca=za^1;Da=Aa;Ea=Ba;while(1){if((Ea|0)==-1){Fa=Da;break c}Ga=f[l+(Da*12|0)>>2]|0;Ha=f[R>>2]|0;Ia=f[Ha+(Ea<<2)>>2]|0;if((Ia|0)!=-1){Ja=f[z>>2]|0;Ka=f[A>>2]|0;La=f[Ka+(f[Ja+(Ia<<2)>>2]<<2)>>2]|0;Ma=Ia+1|0;Na=((Ma>>>0)%3|0|0)==0?Ia+-2|0:Ma;if((Na|0)==-1)Oa=-1;else Oa=f[Ja+(Na<<2)>>2]|0;Na=f[Ka+(Oa<<2)>>2]|0;Ma=(((Ia>>>0)%3|0|0)==0?2:-1)+Ia|0;if((Ma|0)==-1)Pa=-1;else Pa=f[Ja+(Ma<<2)>>2]|0;Ma=f[Ka+(Pa<<2)>>2]|0;if((La|0)<(oa|0)&(Na|0)<(oa|0)&(Ma|0)<(oa|0)){Ka=X(La,g)|0;La=X(Na,g)|0;Na=X(Ma,g)|0;if(S){Ma=0;do{f[Ga+(Ma<<2)>>2]=(f[c+(Ma+Na<<2)>>2]|0)+(f[c+(Ma+La<<2)>>2]|0)-(f[c+(Ma+Ka<<2)>>2]|0);Ma=Ma+1|0}while((Ma|0)!=(g|0))}Ma=Da+1|0;if((Ma|0)==4){Fa=4;break c}else Qa=Ma}else Qa=Da}else Qa=Da;do if(za){Ma=Ea+1|0;Ka=((Ma>>>0)%3|0|0)==0?Ea+-2|0:Ma;if((Ka|0)!=-1?(Ma=f[Ha+(Ka<<2)>>2]|0,Ka=Ma+1|0,(Ma|0)!=-1):0)Ra=((Ka>>>0)%3|0|0)==0?Ma+-2|0:Ka;else Ra=-1}else{Ka=(((Ea>>>0)%3|0|0)==0?2:-1)+Ea|0;if((Ka|0)!=-1?(Ma=f[Ha+(Ka<<2)>>2]|0,(Ma|0)!=-1):0)if(!((Ma>>>0)%3|0)){Ra=Ma+2|0;break}else{Ra=Ma+-1|0;break}else Ra=-1}while(0);if((Ra|0)==(ma|0)){Fa=Qa;break c}if((Ra|0)!=-1|Ca){Da=Qa;Ea=Ra}else break}if(ya){za=0;Aa=Qa;Ba=-1;continue}Ea=f[Ha+(Q<<2)>>2]|0;if((Ea|0)==-1){za=0;Aa=Qa;Ba=-1;continue}if(!((Ea>>>0)%3|0)){za=0;Aa=Qa;Ba=Ea+2|0;continue}else{za=0;Aa=Qa;Ba=Ea+-1|0;continue}}Ba=X(oa,g)|0;f[r>>2]=0;f[T>>2]=0;b[U>>0]=0;f[V>>2]=0;f[V+4>>2]=0;f[V+8>>2]=0;f[V+12>>2]=0;f[V+16>>2]=0;f[V+20>>2]=0;f[V+24>>2]=0;Aa=Fa+-1|0;za=p+(Aa<<3)|0;Q=za;ya=Vn(f[Q>>2]|0,f[Q+4>>2]|0,Fa|0,((Fa|0)<0)<<31>>31|0)|0;Q=I;ma=za;f[ma>>2]=ya;f[ma+4>>2]=Q;ma=c+((X(na+-2|0,g)|0)<<2)|0;za=c+(Ba<<2)|0;Ea=f[Z>>2]|0;if(S){Da=0;Ca=0;while(1){Ma=(f[ma+(Da<<2)>>2]|0)-(f[za+(Da<<2)>>2]|0)|0;Ka=((Ma|0)>-1?Ma:0-Ma|0)+Ca|0;f[ra+(Da<<2)>>2]=Ma;f[Ea+(Da<<2)>>2]=Ma<<1^Ma>>31;Da=Da+1|0;if((Da|0)==(g|0)){Sa=Ka;break}else Ca=Ka}}else Sa=0;mo(e,_,Ea,g);Ca=Zk(e)|0;Da=I;Ka=Bm(e)|0;Ma=I;La=o+(Aa<<3)|0;Na=La;Ga=f[Na>>2]|0;Ja=f[Na+4>>2]|0;Ta=+wm(ya,Ga);Na=Vn(Ka|0,Ma|0,Ca|0,Da|0)|0;Ua=+(ya>>>0)+4294967296.0*+(Q|0);Va=+W(+(Ta*Ua));Da=Vn(Na|0,I|0,~~Va>>>0|0,(+K(Va)>=1.0?(Va>0.0?~~+Y(+J(Va/4294967296.0),4294967295.0)>>>0:~~+W((Va-+(~~Va>>>0))/4294967296.0)>>>0):0)|0)|0;Na=r;f[Na>>2]=Da;f[Na+4>>2]=Sa;b[U>>0]=0;f[V>>2]=0;$f($,ma,ma+(g<<2)|0);f[s>>2]=pa;f[t>>2]=qa;f[j>>2]=f[s>>2];f[e>>2]=f[t>>2];Jf(aa,j,e);if((Fa|0)<1){Wa=va;Xa=ua;Ya=ta;Za=sa;_a=qa;$a=pa;ab=pa}else{Na=n+Fa|0;Da=f[q>>2]|0;Ca=Da;Ma=f[H>>2]|0;Ka=Na+-1|0;Ia=(Ka|0)==(n|0);bb=Na+-2|0;cb=ja>>>0<bb>>>0;db=~Fa;eb=Fa+2+((db|0)>-2?db:-2)|0;db=Ma;fb=Ka>>>0>n>>>0;gb=0;hb=1;while(1){gb=gb+1|0;sj(n|0,1,eb|0)|0;sj(n|0,0,gb|0)|0;ib=Vn(Ga|0,Ja|0,hb|0,0)|0;d:while(1){if(S){sj(f[m>>2]|0,0,ka|0)|0;jb=f[m>>2]|0;kb=0;lb=0;while(1){if(!(b[n+kb>>0]|0)){mb=f[l+(kb*12|0)>>2]|0;nb=0;do{ob=jb+(nb<<2)|0;f[ob>>2]=(f[ob>>2]|0)+(f[mb+(nb<<2)>>2]|0);nb=nb+1|0}while((nb|0)!=(g|0));pb=(1<<kb|lb&255)&255}else pb=lb;kb=kb+1|0;if((kb|0)==(Fa|0)){qb=pb;break}else lb=pb}}else{lb=0;kb=0;while(1){if(!(b[n+lb>>0]|0))rb=(1<<lb|kb&255)&255;else rb=kb;lb=lb+1|0;if((lb|0)==(Fa|0)){qb=rb;break}else kb=rb}}kb=f[m>>2]|0;do if(S){f[kb>>2]=(f[kb>>2]|0)/(hb|0)|0;if(!la){lb=1;do{jb=kb+(lb<<2)|0;f[jb>>2]=(f[jb>>2]|0)/(hb|0)|0;lb=lb+1|0}while((lb|0)!=(g|0));lb=f[Z>>2]|0;if(S)sb=lb;else{tb=0;ub=lb;break}}else sb=f[Z>>2]|0;lb=0;jb=0;while(1){nb=(f[kb+(lb<<2)>>2]|0)-(f[za+(lb<<2)>>2]|0)|0;mb=((nb|0)>-1?nb:0-nb|0)+jb|0;f[Da+(lb<<2)>>2]=nb;f[sb+(lb<<2)>>2]=nb<<1^nb>>31;lb=lb+1|0;if((lb|0)==(g|0)){tb=mb;ub=sb;break}else jb=mb}}else{tb=0;ub=f[Z>>2]|0}while(0);mo(e,_,ub,g);kb=Zk(e)|0;jb=I;lb=Bm(e)|0;mb=I;Va=+wm(ya,ib);nb=Vn(lb|0,mb|0,kb|0,jb|0)|0;Ta=+W(+(Va*Ua));jb=Vn(nb|0,I|0,~~Ta>>>0|0,(+K(Ta)>=1.0?(Ta>0.0?~~+Y(+J(Ta/4294967296.0),4294967295.0)>>>0:~~+W((Ta-+(~~Ta>>>0))/4294967296.0)>>>0):0)|0)|0;nb=f[r>>2]|0;if(!((nb|0)<=(jb|0)?!((nb|0)>=(jb|0)?(tb|0)<(f[T>>2]|0):0):0)){nb=r;f[nb>>2]=jb;f[nb+4>>2]=tb;b[U>>0]=qb;f[V>>2]=hb;f[v>>2]=f[m>>2];f[w>>2]=f[E>>2];f[j>>2]=f[v>>2];f[e>>2]=f[w>>2];Jf($,j,e);f[x>>2]=Ca;f[y>>2]=Ma;f[j>>2]=f[x>>2];f[e>>2]=f[y>>2];Jf(aa,j,e)}if(Ia)break;vb=b[Ka>>0]|0;nb=-1;jb=vb;while(1){kb=nb+-1|0;wb=Na+kb|0;mb=jb;jb=b[wb>>0]|0;if((jb&255)<(mb&255))break;if((wb|0)==(n|0)){xb=84;break d}else nb=kb}kb=Na+nb|0;if((jb&255)<(vb&255)){yb=Ka;zb=vb}else{mb=Na;lb=Ka;while(1){ob=lb+-1|0;if((jb&255)<(h[mb+-2>>0]|0)){yb=ob;zb=1;break}else{Ab=lb;lb=ob;mb=Ab}}}b[wb>>0]=zb;b[yb>>0]=jb;if((nb|0)<-1){Bb=kb;Cb=Ka}else continue;while(1){mb=b[Bb>>0]|0;b[Bb>>0]=b[Cb>>0]|0;b[Cb>>0]=mb;mb=Bb+1|0;lb=Cb+-1|0;if(mb>>>0<lb>>>0){Bb=mb;Cb=lb}else continue d}}if(((xb|0)==84?(xb=0,fb):0)?(ib=b[n>>0]|0,b[n>>0]=vb,b[Ka>>0]=ib,cb):0){ib=bb;kb=ja;do{nb=b[kb>>0]|0;b[kb>>0]=b[ib>>0]|0;b[ib>>0]=nb;kb=kb+1|0;ib=ib+-1|0}while(kb>>>0<ib>>>0)}if((hb|0)>=(Fa|0)){Wa=db;Xa=Da;Ya=db;Za=Da;_a=Ma;$a=Ca;ab=Da;break}else hb=hb+1|0}}hb=f[V>>2]|0;Da=Vn(Ga|0,Ja|0,hb|0,((hb|0)<0)<<31>>31|0)|0;hb=La;f[hb>>2]=Da;f[hb+4>>2]=I;if(S){hb=f[aa>>2]|0;Da=f[C>>2]|0;Ca=0;do{Ma=f[hb+(Ca<<2)>>2]|0;f[Da+(Ca<<2)>>2]=Ma<<1^Ma>>31;Ca=Ca+1|0}while((Ca|0)!=(g|0));Db=Da}else Db=f[C>>2]|0;lo(e,_,Db,g);if((Fa|0)>0){Eb=a+40+(Aa*12|0)|0;Da=a+40+(Aa*12|0)+4|0;Ca=a+40+(Aa*12|0)+8|0;hb=0;do{La=f[Da>>2]|0;Ja=f[Ca>>2]|0;Ga=(La|0)==(Ja<<5|0);if(!(1<<hb&h[U>>0])){if(Ga){if((La+1|0)<0){xb=95;break b}Ma=Ja<<6;db=La+32&-32;vi(Eb,La>>>0<1073741823?(Ma>>>0<db>>>0?db:Ma):2147483647);Fb=f[Da>>2]|0}else Fb=La;f[Da>>2]=Fb+1;Ma=(f[Eb>>2]|0)+(Fb>>>5<<2)|0;f[Ma>>2]=f[Ma>>2]|1<<(Fb&31)}else{if(Ga){if((La+1|0)<0){xb=100;break b}Ga=Ja<<6;Ja=La+32&-32;vi(Eb,La>>>0<1073741823?(Ga>>>0<Ja>>>0?Ja:Ga):2147483647);Gb=f[Da>>2]|0}else Gb=La;f[Da>>2]=Gb+1;La=(f[Eb>>2]|0)+(Gb>>>5<<2)|0;f[La>>2]=f[La>>2]&~(1<<(Gb&31))}hb=hb+1|0}while((hb|0)<(Fa|0))}hb=f[$>>2]|0;Da=d+(Ba<<2)|0;Ca=f[za+4>>2]|0;Aa=f[hb>>2]|0;La=f[hb+4>>2]|0;f[j>>2]=f[za>>2];f[ca>>2]=Ca;f[k>>2]=Aa;f[da>>2]=La;Od(e,ba,j,k);f[Da>>2]=f[e>>2];f[Da+4>>2]=f[ea>>2];Da=f[fa>>2]|0;if(Da|0){La=f[ia>>2]|0;if((La|0)!=(Da|0))f[ia>>2]=La+(~((La+-4-Da|0)>>>2)<<2);Oq(Da)}Da=f[ga>>2]|0;if(Da|0){La=f[ha>>2]|0;if((La|0)!=(Da|0))f[ha>>2]=La+(~((La+-4-Da|0)>>>2)<<2);Oq(Da)}if((na|0)<=2){Hb=Za;Ib=Ya;break a}Da=f[B>>2]|0;wa=f[Da>>2]|0;La=oa+-1|0;if((f[Da+4>>2]|0)-wa>>2>>>0<=La>>>0){xa=Da;xb=18;break}else{Da=oa;oa=La;pa=$a;qa=_a;ra=ab;sa=Za;ta=Ya;ua=Xa;va=Wa;na=Da}}if((xb|0)==18)aq(xa);else if((xb|0)==95)aq(Eb);else if((xb|0)==100)aq(Eb)}else{Hb=M;Ib=N}while(0);if((g|0)>0)sj(f[l>>2]|0,0,g<<2|0)|0;g=f[l>>2]|0;N=f[c+4>>2]|0;M=f[g>>2]|0;Eb=f[g+4>>2]|0;f[j>>2]=f[c>>2];f[j+4>>2]=N;f[k>>2]=M;f[k+4>>2]=Eb;Od(e,a+8|0,j,k);f[d>>2]=f[e>>2];f[d+4>>2]=f[e+4>>2];if(Hb|0){if((Ib|0)!=(Hb|0))f[H>>2]=Ib+(~((Ib+-4-Hb|0)>>>2)<<2);Oq(Hb)}Hb=f[m>>2]|0;if(Hb|0){m=f[E>>2]|0;if((m|0)!=(Hb|0))f[E>>2]=m+(~((m+-4-Hb|0)>>>2)<<2);Oq(Hb)}Hb=f[l+36>>2]|0;if(Hb|0){m=l+40|0;E=f[m>>2]|0;if((E|0)!=(Hb|0))f[m>>2]=E+(~((E+-4-Hb|0)>>>2)<<2);Oq(Hb)}Hb=f[l+24>>2]|0;if(Hb|0){E=l+28|0;m=f[E>>2]|0;if((m|0)!=(Hb|0))f[E>>2]=m+(~((m+-4-Hb|0)>>>2)<<2);Oq(Hb)}Hb=f[l+12>>2]|0;if(Hb|0){m=l+16|0;E=f[m>>2]|0;if((E|0)!=(Hb|0))f[m>>2]=E+(~((E+-4-Hb|0)>>>2)<<2);Oq(Hb)}Hb=f[l>>2]|0;if(!Hb){u=i;return 1}E=l+4|0;l=f[E>>2]|0;if((l|0)!=(Hb|0))f[E>>2]=l+(~((l+-4-Hb|0)>>>2)<<2);Oq(Hb);u=i;return 1}function gb(a){a=a|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ja=0,Ka=Oa,La=0,Ma=0,Na=0,Pa=0,Qa=Oa,Ra=0,Sa=0,Ta=0,Ua=0,Va=0;c=u;u=u+80|0;d=c+60|0;e=c+48|0;g=c+24|0;h=c+12|0;i=c;j=a+28|0;k=f[j>>2]|0;l=f[k+4>>2]|0;m=f[l+80>>2]|0;o=a+4|0;p=a+8|0;q=f[p>>2]|0;r=f[o>>2]|0;s=(q|0)==(r|0);t=r;if(s){f[a+72>>2]=0;v=1;u=c;return v|0}w=f[l+8>>2]|0;x=q-r>>2;r=0;q=0;do{r=r+(b[(f[w+(f[t+(q<<2)>>2]<<2)>>2]|0)+24>>0]|0)|0;q=q+1|0}while(q>>>0<x>>>0);f[a+72>>2]=r;if(s){v=1;u=c;return v|0}s=g+4|0;r=g+8|0;x=d+8|0;q=d+4|0;w=d+11|0;y=g+12|0;z=d+8|0;A=d+4|0;B=d+11|0;C=h+4|0;D=h+8|0;E=i+8|0;F=i+4|0;G=d+11|0;H=d+4|0;I=i+11|0;J=d+8|0;K=d+4|0;L=d+11|0;M=d+11|0;N=d+4|0;O=h+8|0;P=a+40|0;Q=a+44|0;R=a+36|0;S=a+64|0;T=a+68|0;U=a+60|0;V=g+8|0;W=g+20|0;X=e+8|0;Y=e+4|0;Z=e+11|0;_=g+4|0;aa=g+8|0;ba=h+4|0;ca=h+8|0;da=h+8|0;ea=a+52|0;fa=a+56|0;ga=a+48|0;a=g+8|0;ha=0;ia=t;t=l;l=k;a:while(1){k=f[ia+(ha<<2)>>2]|0;ja=f[(f[t+8>>2]|0)+(k<<2)>>2]|0;switch(f[ja+28>>2]|0){case 9:{f[g>>2]=1196;f[s>>2]=-1;f[r>>2]=0;f[r+4>>2]=0;f[r+8>>2]=0;f[r+12>>2]=0;ka=f[l+48>>2]|0;f[d>>2]=0;f[d+4>>2]=0;f[d+8>>2]=0;la=ln(32)|0;f[d>>2]=la;f[x>>2]=-2147483616;f[q>>2]=17;ma=la;na=14495;oa=ma+17|0;do{b[ma>>0]=b[na>>0]|0;ma=ma+1|0;na=na+1|0}while((ma|0)<(oa|0));b[la+17>>0]=0;pa=ka+16|0;qa=f[pa>>2]|0;if(qa){ra=pa;sa=qa;b:while(1){qa=sa;while(1){if((f[qa+16>>2]|0)>=(k|0))break;ta=f[qa+4>>2]|0;if(!ta){ua=ra;break b}else qa=ta}sa=f[qa>>2]|0;if(!sa){ua=qa;break}else ra=qa}if(((ua|0)!=(pa|0)?(k|0)>=(f[ua+16>>2]|0):0)?(ra=ua+20|0,(Jh(ra,d)|0)!=0):0)va=Hk(ra,d,-1)|0;else wa=17}else wa=17;if((wa|0)==17){wa=0;va=Hk(ka,d,-1)|0}if((b[w>>0]|0)<0)Oq(f[d>>2]|0);if((va|0)<1)xa=1;else{ra=f[(f[j>>2]|0)+48>>2]|0;f[d>>2]=0;f[d+4>>2]=0;f[d+8>>2]=0;sa=ln(32)|0;f[d>>2]=sa;f[z>>2]=-2147483616;f[A>>2]=19;ma=sa;na=14438;oa=ma+19|0;do{b[ma>>0]=b[na>>0]|0;ma=ma+1|0;na=na+1|0}while((ma|0)<(oa|0));b[sa+19>>0]=0;ka=ra+16|0;pa=f[ka>>2]|0;if(pa){la=ka;ta=pa;c:while(1){pa=ta;while(1){if((f[pa+16>>2]|0)>=(k|0))break;ya=f[pa+4>>2]|0;if(!ya){za=la;break c}else pa=ya}ta=f[pa>>2]|0;if(!ta){za=pa;break}else la=pa}if((za|0)!=(ka|0)?(k|0)>=(f[za+16>>2]|0):0)Aa=za+20|0;else wa=29}else wa=29;if((wa|0)==29){wa=0;Aa=ra}if(!(Jh(Aa,d)|0))Ba=0;else{la=f[(f[j>>2]|0)+48>>2]|0;f[e>>2]=0;f[e+4>>2]=0;f[e+8>>2]=0;ta=ln(32)|0;f[e>>2]=ta;f[X>>2]=-2147483616;f[Y>>2]=18;ma=ta;na=14458;oa=ma+18|0;do{b[ma>>0]=b[na>>0]|0;ma=ma+1|0;na=na+1|0}while((ma|0)<(oa|0));b[ta+18>>0]=0;ra=la+16|0;ka=f[ra>>2]|0;if(ka){sa=ra;qa=ka;d:while(1){ka=qa;while(1){if((f[ka+16>>2]|0)>=(k|0))break;ya=f[ka+4>>2]|0;if(!ya){Ca=sa;break d}else ka=ya}qa=f[ka>>2]|0;if(!qa){Ca=ka;break}else sa=ka}if((Ca|0)!=(ra|0)?(k|0)>=(f[Ca+16>>2]|0):0)Da=Ca+20|0;else wa=39}else wa=39;if((wa|0)==39){wa=0;Da=la}sa=(Jh(Da,e)|0)!=0;if((b[Z>>0]|0)<0)Oq(f[e>>2]|0);Ba=sa}if((b[B>>0]|0)<0)Oq(f[d>>2]|0);if(Ba){sa=ja+24|0;qa=b[sa>>0]|0;ta=qa<<24>>24;f[h>>2]=0;f[C>>2]=0;f[D>>2]=0;if(!(qa<<24>>24))Ea=0;else{if(qa<<24>>24<0){wa=48;break a}qa=ta<<2;pa=ln(qa)|0;f[h>>2]=pa;ya=pa+(ta<<2)|0;f[O>>2]=ya;sj(pa|0,0,qa|0)|0;f[C>>2]=ya;Ea=pa}pa=f[(f[j>>2]|0)+48>>2]|0;f[i>>2]=0;f[i+4>>2]=0;f[i+8>>2]=0;ya=ln(32)|0;f[i>>2]=ya;f[E>>2]=-2147483616;f[F>>2]=19;ma=ya;na=14438;oa=ma+19|0;do{b[ma>>0]=b[na>>0]|0;ma=ma+1|0;na=na+1|0}while((ma|0)<(oa|0));b[ya+19>>0]=0;la=b[sa>>0]|0;ra=la<<24>>24;qa=pa+16|0;ta=f[qa>>2]|0;if(ta){Fa=qa;Ga=ta;e:while(1){ta=Ga;while(1){if((f[ta+16>>2]|0)>=(k|0))break;Ha=f[ta+4>>2]|0;if(!Ha){Ia=Fa;break e}else ta=Ha}Ga=f[ta>>2]|0;if(!Ga){Ia=ta;break}else Fa=ta}if(((Ia|0)!=(qa|0)?(k|0)>=(f[Ia+16>>2]|0):0)?(Fa=Ia+20|0,(Jh(Fa,i)|0)!=0):0){Ga=Rg(Fa,i)|0;if((Ga|0)!=(Ia+24|0)){pj(d,Ga+28|0);Ga=b[M>>0]|0;Fa=Ga<<24>>24<0;if(!((Fa?f[N>>2]|0:Ga&255)|0))Ja=Ga;else{if(la<<24>>24>0){ya=Fa?f[d>>2]|0:d;Fa=0;do{Ka=$(bq(ya,e));ka=ya;ya=f[e>>2]|0;if((ka|0)==(ya|0))break;n[Ea+(Fa<<2)>>2]=Ka;Fa=Fa+1|0}while((Fa|0)<(ra|0));La=b[M>>0]|0}else La=Ga;Ja=La}if(Ja<<24>>24<0)Oq(f[d>>2]|0)}}else wa=69}else wa=69;if((wa|0)==69?(wa=0,Fa=Rg(pa,i)|0,(Fa|0)!=(pa+4|0)):0){pj(d,Fa+28|0);Fa=b[G>>0]|0;ya=Fa<<24>>24<0;if(!((ya?f[H>>2]|0:Fa&255)|0))Ma=Fa;else{if(la<<24>>24>0){qa=ya?f[d>>2]|0:d;ya=0;do{Ka=$(bq(qa,e));ka=qa;qa=f[e>>2]|0;if((ka|0)==(qa|0))break;n[Ea+(ya<<2)>>2]=Ka;ya=ya+1|0}while((ya|0)<(ra|0));Na=b[G>>0]|0}else Na=Fa;Ma=Na}if(Ma<<24>>24<0)Oq(f[d>>2]|0)}if((b[I>>0]|0)<0)Oq(f[i>>2]|0);ra=f[(f[j>>2]|0)+48>>2]|0;f[d>>2]=0;f[d+4>>2]=0;f[d+8>>2]=0;ya=ln(32)|0;f[d>>2]=ya;f[J>>2]=-2147483616;f[K>>2]=18;ma=ya;na=14458;oa=ma+18|0;do{b[ma>>0]=b[na>>0]|0;ma=ma+1|0;na=na+1|0}while((ma|0)<(oa|0));b[ya+18>>0]=0;na=ra+16|0;ma=f[na>>2]|0;do if(ma){oa=na;Fa=ma;f:while(1){qa=Fa;while(1){if((f[qa+16>>2]|0)>=(k|0))break;la=f[qa+4>>2]|0;if(!la){Pa=oa;break f}else qa=la}Fa=f[qa>>2]|0;if(!Fa){Pa=qa;break}else oa=qa}if((Pa|0)!=(na|0)?(k|0)>=(f[Pa+16>>2]|0):0){oa=Pa+20|0;if(!(Jh(oa,d)|0)){wa=91;break}Qa=$(sk(oa,d,$(1.0)))}else wa=91}else wa=91;while(0);if((wa|0)==91){wa=0;Qa=$(sk(ra,d,$(1.0)))}if((b[L>>0]|0)<0)Oq(f[d>>2]|0);Dl(g,va,f[h>>2]|0,b[sa>>0]|0,Qa);k=f[h>>2]|0;if(k|0){na=f[C>>2]|0;if((na|0)!=(k|0))f[C>>2]=na+(~((na+-4-k|0)>>>2)<<2);Oq(k)}}else Wd(g,ja,va)|0;k=f[P>>2]|0;if((k|0)==(f[Q>>2]|0))Cf(R,g);else{f[k>>2]=1196;f[k+4>>2]=f[s>>2];Ra=k+8|0;f[Ra>>2]=0;na=k+12|0;f[na>>2]=0;f[k+16>>2]=0;ma=(f[y>>2]|0)-(f[V>>2]|0)|0;ya=ma>>2;if(ya|0){if(ya>>>0>1073741823){wa=103;break a}oa=ln(ma)|0;f[na>>2]=oa;f[Ra>>2]=oa;f[k+16>>2]=oa+(ya<<2);ya=f[V>>2]|0;ma=(f[y>>2]|0)-ya|0;if((ma|0)>0){kh(oa|0,ya|0,ma|0)|0;f[na>>2]=oa+(ma>>>2<<2)}}f[k+20>>2]=f[W>>2];f[P>>2]=(f[P>>2]|0)+24}Qe(d,g,ja,m);k=f[S>>2]|0;if(k>>>0<(f[T>>2]|0)>>>0){ma=f[d>>2]|0;f[d>>2]=0;f[k>>2]=ma;f[S>>2]=k+4}else Ze(U,d);k=f[d>>2]|0;f[d>>2]=0;if(k|0){ma=k+88|0;oa=f[ma>>2]|0;f[ma>>2]=0;if(oa|0){ma=f[oa+8>>2]|0;if(ma|0){na=oa+12|0;if((f[na>>2]|0)!=(ma|0))f[na>>2]=ma;Oq(ma)}Oq(oa)}oa=f[k+68>>2]|0;if(oa|0){ma=k+72|0;na=f[ma>>2]|0;if((na|0)!=(oa|0))f[ma>>2]=na+(~((na+-4-oa|0)>>>2)<<2);Oq(oa)}oa=k+64|0;na=f[oa>>2]|0;f[oa>>2]=0;if(na|0){oa=f[na>>2]|0;if(oa|0){ma=na+4|0;if((f[ma>>2]|0)!=(oa|0))f[ma>>2]=oa;Oq(oa)}Oq(na)}Oq(k)}xa=0}f[g>>2]=1196;k=f[r>>2]|0;if(k|0){na=f[y>>2]|0;if((na|0)!=(k|0))f[y>>2]=na+(~((na+-4-k|0)>>>2)<<2);Oq(k)}if(xa|0){v=0;wa=169;break a}break}case 1:case 3:case 5:{k=ja+24|0;na=b[k>>0]|0;oa=na<<24>>24;f[g>>2]=0;f[_>>2]=0;f[aa>>2]=0;if(!(na<<24>>24))Sa=0;else{if(na<<24>>24<0){wa=137;break a}na=ln(oa<<2)|0;f[_>>2]=na;f[g>>2]=na;ma=na+(oa<<2)|0;f[a>>2]=ma;ya=oa;oa=na;while(1){f[oa>>2]=2147483647;ya=ya+-1|0;if(!ya)break;else oa=oa+4|0}f[_>>2]=ma;Sa=b[k>>0]|0}oa=Sa<<24>>24;f[h>>2]=0;f[ba>>2]=0;f[ca>>2]=0;if(!(Sa<<24>>24))Ta=0;else{if(Sa<<24>>24<0){wa=144;break a}ya=oa<<2;sa=ln(ya)|0;f[h>>2]=sa;ra=sa+(oa<<2)|0;f[da>>2]=ra;sj(sa|0,0,ya|0)|0;f[ba>>2]=ra;Ta=sa}sa=ja+80|0;ra=b[k>>0]|0;g:do if(!(f[sa>>2]|0))Ua=ra;else{ya=0;oa=ra;na=Ta;while(1){f[e>>2]=ya;f[d>>2]=f[e>>2];Qb(ja,d,oa,na)|0;Fa=b[k>>0]|0;if(Fa<<24>>24>0){ta=f[g>>2]|0;la=f[h>>2]|0;pa=Fa<<24>>24;Ga=0;do{ka=ta+(Ga<<2)|0;Ha=f[la+(Ga<<2)>>2]|0;if((f[ka>>2]|0)>(Ha|0))f[ka>>2]=Ha;Ga=Ga+1|0}while((Ga|0)<(pa|0))}pa=ya+1|0;if(pa>>>0>=(f[sa>>2]|0)>>>0){Ua=Fa;break g}ya=pa;oa=Fa;na=f[h>>2]|0}}while(0);if(Ua<<24>>24>0){sa=0;ja=Ua;while(1){ra=(f[g>>2]|0)+(sa<<2)|0;ma=f[ea>>2]|0;if((ma|0)==(f[fa>>2]|0)){Ri(ga,ra);Va=b[k>>0]|0}else{f[ma>>2]=f[ra>>2];f[ea>>2]=ma+4;Va=ja}sa=sa+1|0;if((sa|0)>=(Va<<24>>24|0))break;else ja=Va}}ja=f[h>>2]|0;if(ja|0){sa=f[ba>>2]|0;if((sa|0)!=(ja|0))f[ba>>2]=sa+(~((sa+-4-ja|0)>>>2)<<2);Oq(ja)}ja=f[g>>2]|0;if(ja|0){sa=f[_>>2]|0;if((sa|0)!=(ja|0))f[_>>2]=sa+(~((sa+-4-ja|0)>>>2)<<2);Oq(ja)}break}default:{}}ja=ha+1|0;sa=f[o>>2]|0;if(ja>>>0>=(f[p>>2]|0)-sa>>2>>>0){v=1;wa=169;break}k=f[j>>2]|0;ha=ja;ia=sa;t=f[k+4>>2]|0;l=k}if((wa|0)==48)aq(h);else if((wa|0)==103)aq(Ra);else if((wa|0)==137)aq(g);else if((wa|0)==144)aq(h);else if((wa|0)==169){u=c;return v|0}return 0}function hb(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,Y=0,Z=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ja=0,Ka=0,La=0,Ma=0,Na=0,Oa=0,Pa=0,Qa=0,Ra=0;d=u;u=u+32|0;e=d;g=a+8|0;h=f[g>>2]|0;f[e>>2]=0;i=e+4|0;f[i>>2]=0;f[e+8>>2]=0;do if(h)if(h>>>0>1073741823)aq(e);else{j=h<<2;k=ln(j)|0;f[e>>2]=k;l=k+(h<<2)|0;f[e+8>>2]=l;sj(k|0,0,j|0)|0;f[i>>2]=l;m=l;n=k;break}else{m=0;n=0}while(0);k=a+128|0;l=f[k>>2]|0;j=f[l>>2]|0;o=l+4|0;if(!j){p=l+8|0;q=n;r=m;s=h}else{h=f[o>>2]|0;if((h|0)!=(j|0))f[o>>2]=h+(~((h+-4-j|0)>>>2)<<2);Oq(j);j=l+8|0;f[j>>2]=0;f[o>>2]=0;f[l>>2]=0;p=j;q=f[e>>2]|0;r=f[i>>2]|0;s=f[g>>2]|0}f[l>>2]=q;f[o>>2]=r;f[p>>2]=f[e+8>>2];f[e>>2]=0;p=e+4|0;f[p>>2]=0;f[e+8>>2]=0;do if(s)if(s>>>0>1073741823)aq(e);else{r=s<<2;o=ln(r)|0;f[e>>2]=o;q=o+(s<<2)|0;f[e+8>>2]=q;sj(o|0,0,r|0)|0;f[p>>2]=q;t=q;v=o;break}else{t=0;v=0}while(0);s=a+140|0;o=f[s>>2]|0;q=f[o>>2]|0;r=o+4|0;if(!q){w=o+8|0;x=v;y=t}else{t=f[r>>2]|0;if((t|0)!=(q|0))f[r>>2]=t+(~((t+-4-q|0)>>>2)<<2);Oq(q);q=o+8|0;f[q>>2]=0;f[r>>2]=0;f[o>>2]=0;w=q;x=f[e>>2]|0;y=f[p>>2]|0}f[o>>2]=x;f[r>>2]=y;f[w>>2]=f[e+8>>2];w=f[b>>2]|0;y=b+4|0;r=f[y>>2]|0;x=f[y+4>>2]|0;y=f[c>>2]|0;o=c+4|0;p=f[o>>2]|0;q=f[o+4>>2]|0;f[e>>2]=0;f[e+4>>2]=0;f[e+8>>2]=0;f[e+12>>2]=0;f[e+16>>2]=0;f[e+20>>2]=0;o=e+8|0;t=e+4|0;v=e+16|0;l=e+20|0;i=r;Pc(e);j=f[t>>2]|0;h=(f[l>>2]|0)+(f[v>>2]|0)|0;if((f[o>>2]|0)==(j|0))z=0;else z=(f[j+(((h>>>0)/113|0)<<2)>>2]|0)+(((h>>>0)%113|0)*36|0)|0;f[z>>2]=w;h=z+4|0;f[h>>2]=r;f[h+4>>2]=x;f[z+12>>2]=y;h=z+16|0;f[h>>2]=p;f[h+4>>2]=q;f[z+24>>2]=0;f[z+28>>2]=y-w;f[z+32>>2]=0;z=(f[l>>2]|0)+1|0;f[l>>2]=z;if(z|0){w=a+116|0;y=a+48|0;h=a+44|0;j=a+36|0;m=a+40|0;n=a+32|0;A=b+8|0;B=c+8|0;C=a+28|0;D=a+24|0;E=a+16|0;F=a+20|0;G=a+12|0;H=a+88|0;I=a+84|0;J=a+76|0;K=a+80|0;L=a+72|0;M=i+4|0;N=i+24|0;O=i+24|0;P=p+24|0;Q=z;while(1){z=f[v>>2]|0;R=Q+-1|0;S=R+z|0;T=f[t>>2]|0;U=f[T+(((S>>>0)/113|0)<<2)>>2]|0;V=(S>>>0)%113|0;S=f[U+(V*36|0)>>2]|0;W=f[U+(V*36|0)+12>>2]|0;Y=f[U+(V*36|0)+24>>2]|0;Z=f[U+(V*36|0)+32>>2]|0;f[l>>2]=R;R=f[o>>2]|0;V=R-T>>2;if((1-Q-z+((V|0)==0?0:(V*113|0)+-1|0)|0)>>>0>225){Oq(f[R+-4>>2]|0);f[o>>2]=(f[o>>2]|0)+-4}f[b>>2]=S;f[c>>2]=W;R=f[k>>2]|0;V=((f[g>>2]|0)+-1|0)==(Y|0)?0:Y+1|0;Y=(f[s>>2]|0)+(Z*12|0)|0;z=W-S|0;T=(f[a>>2]|0)-(f[(f[Y>>2]|0)+(V<<2)>>2]|0)|0;a:do if(T){if(z>>>0<3){U=f[w>>2]|0;f[U>>2]=V;$=f[g>>2]|0;if($>>>0>1){aa=1;ba=$;ca=V;while(1){ca=(ca|0)==(ba+-1|0)?0:ca+1|0;f[U+(aa<<2)>>2]=ca;aa=aa+1|0;da=f[g>>2]|0;if(aa>>>0>=da>>>0){ea=da;break}else ba=da}}else ea=$;if(!z){fa=99;break}else{ga=0;ha=ea}while(1){ba=(f[N>>2]|0)+((X(f[M>>2]|0,S+ga|0)|0)<<2)|0;if(!ha)ia=0;else{aa=0;do{ca=f[(f[w>>2]|0)+(aa<<2)>>2]|0;U=(f[a>>2]|0)-(f[(f[Y>>2]|0)+(ca<<2)>>2]|0)|0;do if(U|0){da=f[y>>2]|0;ja=32-da|0;ka=32-U|0;la=f[ba+(ca<<2)>>2]<<ka;if((U|0)>(ja|0)){ma=la>>>ka;ka=U-ja|0;f[y>>2]=ka;ja=f[h>>2]|ma>>>ka;f[h>>2]=ja;ka=f[j>>2]|0;if((ka|0)==(f[m>>2]|0))Ri(n,h);else{f[ka>>2]=ja;f[j>>2]=ka+4}f[h>>2]=ma<<32-(f[y>>2]|0);break}ma=f[h>>2]|la>>>da;f[h>>2]=ma;la=da+U|0;f[y>>2]=la;if((la|0)!=32)break;la=f[j>>2]|0;if((la|0)==(f[m>>2]|0))Ri(n,h);else{f[la>>2]=ma;f[j>>2]=la+4}f[h>>2]=0;f[y>>2]=0}while(0);aa=aa+1|0;U=f[g>>2]|0}while(aa>>>0<U>>>0);ia=U}ga=ga+1|0;if(ga>>>0>=z>>>0){fa=99;break a}else ha=ia}}$=Z+1|0;Ig(R+($*12|0)|0,f[R+(Z*12|0)>>2]|0,f[R+(Z*12|0)+4>>2]|0);aa=(f[(f[k>>2]|0)+($*12|0)>>2]|0)+(V<<2)|0;ba=(f[aa>>2]|0)+(1<<T+-1)|0;f[aa>>2]=ba;aa=f[A>>2]|0;U=f[B>>2]|0;b:do if((W|0)==(S|0))na=S;else{ca=f[O>>2]|0;if(!aa){if((f[ca+(V<<2)>>2]|0)>>>0<ba>>>0){na=W;break}else{oa=W;pa=S}while(1){la=oa;do{la=la+-1|0;if((pa|0)==(la|0)){na=pa;break b}ma=(f[P>>2]|0)+((X(la,U)|0)<<2)+(V<<2)|0}while((f[ma>>2]|0)>>>0>=ba>>>0);pa=pa+1|0;if((pa|0)==(la|0)){na=la;break b}else oa=la}}else{qa=W;ra=S}while(1){ma=ra;while(1){sa=ca+((X(ma,aa)|0)<<2)|0;if((f[sa+(V<<2)>>2]|0)>>>0>=ba>>>0){ta=qa;break}da=ma+1|0;if((da|0)==(qa|0)){na=qa;break b}else ma=da}while(1){ta=ta+-1|0;if((ma|0)==(ta|0)){na=ma;break b}ua=(f[P>>2]|0)+((X(ta,U)|0)<<2)|0;if((f[ua+(V<<2)>>2]|0)>>>0<ba>>>0){va=0;break}}do{la=sa+(va<<2)|0;da=ua+(va<<2)|0;ka=f[la>>2]|0;f[la>>2]=f[da>>2];f[da>>2]=ka;va=va+1|0}while((va|0)!=(aa|0));ra=ma+1|0;if((ra|0)==(ta|0)){na=ta;break}else qa=ta}}while(0);ba=(_(z|0)|0)^31;U=na-S|0;ca=W-na|0;ka=U>>>0<ca>>>0;if((U|0)!=(ca|0)){da=f[H>>2]|0;if(ka)f[I>>2]=f[I>>2]|1<<31-da;la=da+1|0;f[H>>2]=la;if((la|0)==32){la=f[J>>2]|0;if((la|0)==(f[K>>2]|0))Ri(L,I);else{f[la>>2]=f[I>>2];f[J>>2]=la+4}f[H>>2]=0;f[I>>2]=0}}la=z>>>1;do if(ka){da=f[C>>2]|0;ja=32-da|0;wa=32-ba|0;xa=la-U<<wa;if((ba|0)>(ja|0)){ya=xa>>>wa;wa=ba-ja|0;f[C>>2]=wa;ja=f[D>>2]|ya>>>wa;f[D>>2]=ja;wa=f[E>>2]|0;if((wa|0)==(f[F>>2]|0))Ri(G,D);else{f[wa>>2]=ja;f[E>>2]=wa+4}f[D>>2]=ya<<32-(f[C>>2]|0);break}ya=f[D>>2]|xa>>>da;f[D>>2]=ya;xa=da+ba|0;f[C>>2]=xa;if((xa|0)==32){xa=f[E>>2]|0;if((xa|0)==(f[F>>2]|0))Ri(G,D);else{f[xa>>2]=ya;f[E>>2]=xa+4}f[D>>2]=0;f[C>>2]=0}}else{xa=f[C>>2]|0;ya=32-xa|0;da=32-ba|0;wa=la-ca<<da;if((ba|0)>(ya|0)){ja=wa>>>da;da=ba-ya|0;f[C>>2]=da;ya=f[D>>2]|ja>>>da;f[D>>2]=ya;da=f[E>>2]|0;if((da|0)==(f[F>>2]|0))Ri(G,D);else{f[da>>2]=ya;f[E>>2]=da+4}f[D>>2]=ja<<32-(f[C>>2]|0);break}ja=f[D>>2]|wa>>>xa;f[D>>2]=ja;wa=xa+ba|0;f[C>>2]=wa;if((wa|0)==32){wa=f[E>>2]|0;if((wa|0)==(f[F>>2]|0))Ri(G,D);else{f[wa>>2]=ja;f[E>>2]=wa+4}f[D>>2]=0;f[C>>2]=0}}while(0);ba=f[s>>2]|0;la=f[ba+(Z*12|0)>>2]|0;ka=la+(V<<2)|0;f[ka>>2]=(f[ka>>2]|0)+1;Ig(ba+($*12|0)|0,la,f[ba+(Z*12|0)+4>>2]|0);if((na|0)!=(S|0)){ba=f[o>>2]|0;la=f[t>>2]|0;ka=ba-la>>2;wa=f[v>>2]|0;ja=f[l>>2]|0;if((((ka|0)==0?0:(ka*113|0)+-1|0)|0)==(ja+wa|0)){Pc(e);za=f[v>>2]|0;Aa=f[l>>2]|0;Ba=f[o>>2]|0;Ca=f[t>>2]|0}else{za=wa;Aa=ja;Ba=ba;Ca=la}la=Aa+za|0;if((Ba|0)==(Ca|0))Da=0;else Da=(f[Ca+(((la>>>0)/113|0)<<2)>>2]|0)+(((la>>>0)%113|0)*36|0)|0;f[Da>>2]=S;la=Da+4|0;f[la>>2]=r;f[la+4>>2]=x;f[Da+12>>2]=na;f[Da+16>>2]=i;f[Da+20>>2]=aa;f[Da+24>>2]=V;f[Da+28>>2]=U;f[Da+32>>2]=Z;f[l>>2]=(f[l>>2]|0)+1}if((W|0)!=(na|0)){la=f[o>>2]|0;ba=f[t>>2]|0;ja=la-ba>>2;wa=f[v>>2]|0;ka=f[l>>2]|0;if((((ja|0)==0?0:(ja*113|0)+-1|0)|0)==(ka+wa|0)){Pc(e);Ea=f[v>>2]|0;Fa=f[l>>2]|0;Ga=f[o>>2]|0;Ha=f[t>>2]|0}else{Ea=wa;Fa=ka;Ga=la;Ha=ba}ba=Fa+Ea|0;if((Ga|0)==(Ha|0))Ia=0;else Ia=(f[Ha+(((ba>>>0)/113|0)<<2)>>2]|0)+(((ba>>>0)%113|0)*36|0)|0;f[Ia>>2]=na;f[Ia+4>>2]=i;f[Ia+8>>2]=aa;f[Ia+12>>2]=W;ba=Ia+16|0;f[ba>>2]=p;f[ba+4>>2]=q;f[Ia+24>>2]=V;f[Ia+28>>2]=ca;f[Ia+32>>2]=$;ba=(f[l>>2]|0)+1|0;f[l>>2]=ba;Ja=ba}else fa=99}else fa=99;while(0);if((fa|0)==99){fa=0;Ja=f[l>>2]|0}if(!Ja)break;else Q=Ja}}Ja=f[t>>2]|0;Q=f[v>>2]|0;Ia=Ja+(((Q>>>0)/113|0)<<2)|0;q=f[o>>2]|0;p=q;i=Ja;if((q|0)==(Ja|0)){Ka=0;La=0}else{na=(f[Ia>>2]|0)+(((Q>>>0)%113|0)*36|0)|0;Ka=na;La=na}na=Ia;Ia=La;c:while(1){La=Ia;do{Q=La;if((Ka|0)==(Q|0))break c;La=Q+36|0}while((La-(f[na>>2]|0)|0)!=4068);La=na+4|0;na=La;Ia=f[La>>2]|0}f[l>>2]=0;l=p-i>>2;if(l>>>0>2){i=Ja;do{Oq(f[i>>2]|0);i=(f[t>>2]|0)+4|0;f[t>>2]=i;Ma=f[o>>2]|0;Na=Ma-i>>2}while(Na>>>0>2);Oa=Na;Pa=i;Qa=Ma}else{Oa=l;Pa=Ja;Qa=q}switch(Oa|0){case 1:{Ra=56;fa=113;break}case 2:{Ra=113;fa=113;break}default:{}}if((fa|0)==113)f[v>>2]=Ra;if((Pa|0)!=(Qa|0)){Ra=Pa;do{Oq(f[Ra>>2]|0);Ra=Ra+4|0}while((Ra|0)!=(Qa|0));Qa=f[t>>2]|0;t=f[o>>2]|0;if((t|0)!=(Qa|0))f[o>>2]=t+(~((t+-4-Qa|0)>>>2)<<2)}Qa=f[e>>2]|0;if(!Qa){u=d;return}Oq(Qa);u=d;return}function ib(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,Y=0,Z=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ja=0,Ka=0,La=0,Ma=0,Na=0;d=u;u=u+48|0;e=d+36|0;g=d+24|0;h=d;i=a+8|0;j=f[i>>2]|0;f[e>>2]=0;k=e+4|0;f[k>>2]=0;f[e+8>>2]=0;do if(j)if(j>>>0>1073741823)aq(e);else{l=j<<2;m=ln(l)|0;f[e>>2]=m;n=m+(j<<2)|0;f[e+8>>2]=n;sj(m|0,0,l|0)|0;f[k>>2]=n;o=n;p=m;break}else{o=0;p=0}while(0);m=a+1164|0;n=f[m>>2]|0;l=f[n>>2]|0;q=n+4|0;if(!l){r=n+8|0;s=p;t=o;v=j}else{j=f[q>>2]|0;if((j|0)!=(l|0))f[q>>2]=j+(~((j+-4-l|0)>>>2)<<2);Oq(l);l=n+8|0;f[l>>2]=0;f[q>>2]=0;f[n>>2]=0;r=l;s=f[e>>2]|0;t=f[k>>2]|0;v=f[i>>2]|0}f[n>>2]=s;f[q>>2]=t;f[r>>2]=f[e+8>>2];f[e>>2]=0;r=e+4|0;f[r>>2]=0;f[e+8>>2]=0;do if(v)if(v>>>0>1073741823)aq(e);else{t=v<<2;q=ln(t)|0;f[e>>2]=q;s=q+(v<<2)|0;f[e+8>>2]=s;sj(q|0,0,t|0)|0;f[r>>2]=s;w=s;x=q;break}else{w=0;x=0}while(0);v=a+1176|0;q=f[v>>2]|0;s=f[q>>2]|0;t=q+4|0;if(!s){y=q+8|0;z=x;A=w}else{w=f[t>>2]|0;if((w|0)!=(s|0))f[t>>2]=w+(~((w+-4-s|0)>>>2)<<2);Oq(s);s=q+8|0;f[s>>2]=0;f[t>>2]=0;f[q>>2]=0;y=s;z=f[e>>2]|0;A=f[r>>2]|0}f[q>>2]=z;f[t>>2]=A;f[y>>2]=f[e+8>>2];y=f[b>>2]|0;A=b+4|0;t=f[A>>2]|0;z=f[A+4>>2]|0;A=f[c>>2]|0;q=c+4|0;r=f[q>>2]|0;s=f[q+4>>2]|0;f[h>>2]=0;f[h+4>>2]=0;f[h+8>>2]=0;f[h+12>>2]=0;f[h+16>>2]=0;f[h+20>>2]=0;q=h+8|0;w=h+4|0;x=h+16|0;n=h+20|0;k=t;Pc(h);l=f[w>>2]|0;j=(f[n>>2]|0)+(f[x>>2]|0)|0;if((f[q>>2]|0)==(l|0))B=0;else B=(f[l+(((j>>>0)/113|0)<<2)>>2]|0)+(((j>>>0)%113|0)*36|0)|0;f[B>>2]=y;j=B+4|0;f[j>>2]=t;f[j+4>>2]=z;f[B+12>>2]=A;j=B+16|0;f[j>>2]=r;f[j+4>>2]=s;f[B+24>>2]=0;f[B+28>>2]=A-y;f[B+32>>2]=0;B=(f[n>>2]|0)+1|0;f[n>>2]=B;if(B|0){y=a+1152|0;A=a+1084|0;j=a+1080|0;l=a+1072|0;o=a+1076|0;p=a+1068|0;C=b+8|0;D=c+8|0;E=a+1124|0;F=a+1120|0;G=a+1112|0;H=a+1116|0;I=a+1108|0;J=k+4|0;K=k+24|0;L=k+24|0;M=r+24|0;N=B;while(1){B=f[x>>2]|0;O=N+-1|0;P=O+B|0;Q=f[w>>2]|0;R=f[Q+(((P>>>0)/113|0)<<2)>>2]|0;S=(P>>>0)%113|0;P=f[R+(S*36|0)>>2]|0;T=f[R+(S*36|0)+12>>2]|0;U=f[R+(S*36|0)+24>>2]|0;V=f[R+(S*36|0)+32>>2]|0;f[n>>2]=O;O=f[q>>2]|0;S=O-Q>>2;if((1-N-B+((S|0)==0?0:(S*113|0)+-1|0)|0)>>>0>225){Oq(f[O+-4>>2]|0);f[q>>2]=(f[q>>2]|0)+-4}f[b>>2]=P;f[c>>2]=T;O=f[m>>2]|0;S=O+(V*12|0)|0;B=(f[v>>2]|0)+(V*12|0)|0;f[g>>2]=f[b>>2];f[g+4>>2]=f[b+4>>2];f[g+8>>2]=f[b+8>>2];f[e>>2]=f[c>>2];f[e+4>>2]=f[c+4>>2];f[e+8>>2]=f[c+8>>2];Q=Rd(a,g,e,S,B,U)|0;U=T-P|0;R=(f[a>>2]|0)-(f[(f[B>>2]|0)+(Q<<2)>>2]|0)|0;a:do if(R){if(U>>>0<3){W=f[y>>2]|0;f[W>>2]=Q;Y=f[i>>2]|0;if(Y>>>0>1){Z=1;$=Y;aa=Q;while(1){aa=(aa|0)==($+-1|0)?0:aa+1|0;f[W+(Z<<2)>>2]=aa;Z=Z+1|0;ba=f[i>>2]|0;if(Z>>>0>=ba>>>0){ca=ba;break}else $=ba}}else ca=Y;if(!U){da=87;break}else{ea=0;fa=ca}while(1){$=(f[K>>2]|0)+((X(f[J>>2]|0,P+ea|0)|0)<<2)|0;if(!fa)ga=0;else{Z=0;do{aa=f[(f[y>>2]|0)+(Z<<2)>>2]|0;W=(f[a>>2]|0)-(f[(f[B>>2]|0)+(aa<<2)>>2]|0)|0;do if(W|0){ba=f[A>>2]|0;ha=32-ba|0;ia=32-W|0;ja=f[$+(aa<<2)>>2]<<ia;if((W|0)>(ha|0)){ka=ja>>>ia;ia=W-ha|0;f[A>>2]=ia;ha=f[j>>2]|ka>>>ia;f[j>>2]=ha;ia=f[l>>2]|0;if((ia|0)==(f[o>>2]|0))Ri(p,j);else{f[ia>>2]=ha;f[l>>2]=ia+4}f[j>>2]=ka<<32-(f[A>>2]|0);break}ka=f[j>>2]|ja>>>ba;f[j>>2]=ka;ja=ba+W|0;f[A>>2]=ja;if((ja|0)!=32)break;ja=f[l>>2]|0;if((ja|0)==(f[o>>2]|0))Ri(p,j);else{f[ja>>2]=ka;f[l>>2]=ja+4}f[j>>2]=0;f[A>>2]=0}while(0);Z=Z+1|0;W=f[i>>2]|0}while(Z>>>0<W>>>0);ga=W}ea=ea+1|0;if(ea>>>0>=U>>>0){da=87;break a}else fa=ga}}Y=V+1|0;Z=f[m>>2]|0;$=Z+(Y*12|0)|0;if(($|0)==(S|0))la=Z;else{Ig($,f[S>>2]|0,f[O+(V*12|0)+4>>2]|0);la=f[m>>2]|0}$=(f[la+(Y*12|0)>>2]|0)+(Q<<2)|0;Z=(f[$>>2]|0)+(1<<R+-1)|0;f[$>>2]=Z;$=f[C>>2]|0;W=f[D>>2]|0;b:do if((T|0)==(P|0))ma=P;else{aa=f[L>>2]|0;if(!$){if((f[aa+(Q<<2)>>2]|0)>>>0<Z>>>0){ma=T;break}else{na=T;oa=P}while(1){ja=na;do{ja=ja+-1|0;if((oa|0)==(ja|0)){ma=oa;break b}ka=(f[M>>2]|0)+((X(ja,W)|0)<<2)+(Q<<2)|0}while((f[ka>>2]|0)>>>0>=Z>>>0);oa=oa+1|0;if((oa|0)==(ja|0)){ma=ja;break b}else na=ja}}else{pa=T;qa=P}while(1){ka=qa;while(1){ra=aa+((X(ka,$)|0)<<2)|0;if((f[ra+(Q<<2)>>2]|0)>>>0>=Z>>>0){sa=pa;break}ba=ka+1|0;if((ba|0)==(pa|0)){ma=pa;break b}else ka=ba}while(1){sa=sa+-1|0;if((ka|0)==(sa|0)){ma=ka;break b}ta=(f[M>>2]|0)+((X(sa,W)|0)<<2)|0;if((f[ta+(Q<<2)>>2]|0)>>>0<Z>>>0){ua=0;break}}do{ja=ra+(ua<<2)|0;ba=ta+(ua<<2)|0;ia=f[ja>>2]|0;f[ja>>2]=f[ba>>2];f[ba>>2]=ia;ua=ua+1|0}while((ua|0)!=($|0));qa=ka+1|0;if((qa|0)==(sa|0)){ma=sa;break}else pa=sa}}while(0);Z=(_(U|0)|0)^31;W=ma-P|0;aa=T-ma|0;ia=W>>>0<aa>>>0;if((W|0)!=(aa|0)){ba=f[E>>2]|0;if(ia)f[F>>2]=f[F>>2]|1<<31-ba;ja=ba+1|0;f[E>>2]=ja;if((ja|0)==32){ja=f[G>>2]|0;if((ja|0)==(f[H>>2]|0))Ri(I,F);else{f[ja>>2]=f[F>>2];f[G>>2]=ja+4}f[E>>2]=0;f[F>>2]=0}}ja=U>>>1;if(ia){ia=ja-W|0;if(Z|0){ba=0;ha=1<<Z+-1;while(1){fj(a+12+(ba<<5)|0,(ha&ia|0)!=0);ba=ba+1|0;if((ba|0)==(Z|0))break;else ha=ha>>>1}}}else{ha=ja-aa|0;if(Z|0){ba=0;ia=1<<Z+-1;while(1){fj(a+12+(ba<<5)|0,(ia&ha|0)!=0);ba=ba+1|0;if((ba|0)==(Z|0))break;else ia=ia>>>1}}}ia=f[v>>2]|0;Z=f[ia+(V*12|0)>>2]|0;ba=Z+(Q<<2)|0;f[ba>>2]=(f[ba>>2]|0)+1;Ig(ia+(Y*12|0)|0,Z,f[ia+(V*12|0)+4>>2]|0);if((ma|0)!=(P|0)){ia=f[q>>2]|0;Z=f[w>>2]|0;ba=ia-Z>>2;ha=f[x>>2]|0;ja=f[n>>2]|0;if((((ba|0)==0?0:(ba*113|0)+-1|0)|0)==(ja+ha|0)){Pc(h);va=f[x>>2]|0;wa=f[n>>2]|0;xa=f[q>>2]|0;ya=f[w>>2]|0}else{va=ha;wa=ja;xa=ia;ya=Z}Z=wa+va|0;if((xa|0)==(ya|0))za=0;else za=(f[ya+(((Z>>>0)/113|0)<<2)>>2]|0)+(((Z>>>0)%113|0)*36|0)|0;f[za>>2]=P;Z=za+4|0;f[Z>>2]=t;f[Z+4>>2]=z;f[za+12>>2]=ma;f[za+16>>2]=k;f[za+20>>2]=$;f[za+24>>2]=Q;f[za+28>>2]=W;f[za+32>>2]=V;f[n>>2]=(f[n>>2]|0)+1}if((T|0)!=(ma|0)){Z=f[q>>2]|0;ia=f[w>>2]|0;ja=Z-ia>>2;ha=f[x>>2]|0;ba=f[n>>2]|0;if((((ja|0)==0?0:(ja*113|0)+-1|0)|0)==(ba+ha|0)){Pc(h);Aa=f[x>>2]|0;Ba=f[n>>2]|0;Ca=f[q>>2]|0;Da=f[w>>2]|0}else{Aa=ha;Ba=ba;Ca=Z;Da=ia}ia=Ba+Aa|0;if((Ca|0)==(Da|0))Ea=0;else Ea=(f[Da+(((ia>>>0)/113|0)<<2)>>2]|0)+(((ia>>>0)%113|0)*36|0)|0;f[Ea>>2]=ma;f[Ea+4>>2]=k;f[Ea+8>>2]=$;f[Ea+12>>2]=T;ia=Ea+16|0;f[ia>>2]=r;f[ia+4>>2]=s;f[Ea+24>>2]=Q;f[Ea+28>>2]=aa;f[Ea+32>>2]=Y;ia=(f[n>>2]|0)+1|0;f[n>>2]=ia;Fa=ia}else da=87}else da=87;while(0);if((da|0)==87){da=0;Fa=f[n>>2]|0}if(!Fa)break;else N=Fa}}Fa=f[w>>2]|0;N=f[x>>2]|0;Ea=Fa+(((N>>>0)/113|0)<<2)|0;s=f[q>>2]|0;r=s;k=Fa;if((s|0)==(Fa|0)){Ga=0;Ha=0}else{ma=(f[Ea>>2]|0)+(((N>>>0)%113|0)*36|0)|0;Ga=ma;Ha=ma}ma=Ea;Ea=Ha;c:while(1){Ha=Ea;do{N=Ha;if((Ga|0)==(N|0))break c;Ha=N+36|0}while((Ha-(f[ma>>2]|0)|0)!=4068);Ha=ma+4|0;ma=Ha;Ea=f[Ha>>2]|0}f[n>>2]=0;n=r-k>>2;if(n>>>0>2){k=Fa;do{Oq(f[k>>2]|0);k=(f[w>>2]|0)+4|0;f[w>>2]=k;Ia=f[q>>2]|0;Ja=Ia-k>>2}while(Ja>>>0>2);Ka=Ja;La=k;Ma=Ia}else{Ka=n;La=Fa;Ma=s}switch(Ka|0){case 1:{Na=56;da=101;break}case 2:{Na=113;da=101;break}default:{}}if((da|0)==101)f[x>>2]=Na;if((La|0)!=(Ma|0)){Na=La;do{Oq(f[Na>>2]|0);Na=Na+4|0}while((Na|0)!=(Ma|0));Ma=f[w>>2]|0;w=f[q>>2]|0;if((w|0)!=(Ma|0))f[q>>2]=w+(~((w+-4-Ma|0)>>>2)<<2)}Ma=f[h>>2]|0;if(!Ma){u=d;return}Oq(Ma);u=d;return}function jb(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,Y=0,Z=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ja=0,Ka=0,La=0;d=u;u=u+1424|0;e=d+1408|0;g=d+1396|0;h=d+1420|0;i=d+1200|0;j=d+12|0;k=d;l=d+1384|0;m=d+1372|0;n=d+1360|0;o=d+1348|0;p=d+1336|0;q=d+1324|0;r=d+1312|0;s=d+1300|0;t=d+1288|0;v=d+1276|0;w=d+1264|0;x=d+1252|0;y=d+1240|0;z=d+1228|0;A=a+28|0;B=10-(mi(f[(f[A>>2]|0)+48>>2]|0)|0)|0;C=(B|0)<6?B:6;b[h>>0]=C;if((C&255|0)==6?(f[a+72>>2]|0)>15:0)b[h>>0]=5;C=c+16|0;B=f[C+4>>2]|0;if(!((B|0)>0|(B|0)==0&(f[C>>2]|0)>>>0>0)){f[g>>2]=f[c+4>>2];f[e>>2]=f[g>>2];Me(c,e,h,h+1|0)|0}C=f[A>>2]|0;B=f[(f[C+4>>2]|0)+80>>2]|0;D=a+72|0;E=f[D>>2]|0;f[i>>2]=B;F=i+4|0;f[F>>2]=E;f[i+8>>2]=E<<2;G=i+12|0;H=X(E,B)|0;f[G>>2]=0;J=i+16|0;f[J>>2]=0;f[i+20>>2]=0;do if(H)if(H>>>0>1073741823)aq(G);else{K=H<<2;L=ln(K)|0;f[G>>2]=L;M=L+(H<<2)|0;f[i+20>>2]=M;sj(L|0,0,K|0)|0;f[J>>2]=M;N=L;break}else N=0;while(0);H=i+24|0;f[H>>2]=N;G=a+4|0;L=a+8|0;M=f[G>>2]|0;a:do if((f[L>>2]|0)!=(M|0)){K=j+4|0;O=j+8|0;P=j+8|0;Q=(B|0)==0;R=j+4|0;S=j+8|0;T=k+4|0;U=k+8|0;V=k+8|0;W=a+48|0;Y=j+8|0;Z=a+60|0;$=0;aa=0;ba=0;ca=0;da=M;ea=C;b:while(1){fa=f[(f[(f[ea+4>>2]|0)+8>>2]|0)+(f[da+(ca<<2)>>2]<<2)>>2]|0;switch(f[fa+28>>2]|0){case 1:case 3:case 5:case 2:case 4:case 6:{ga=fa;ha=aa;break}case 9:{ga=f[(f[Z>>2]|0)+(aa<<2)>>2]|0;ha=aa+1|0;break}default:{ia=0;break a}}if(!ga){ia=0;break a}c:do switch(f[ga+28>>2]|0){case 6:{if(Q){ja=ba;ka=ga+24|0;break c}fa=ga+84|0;la=ga+68|0;ma=ga+48|0;na=ga+40|0;oa=ga+24|0;pa=0;do{if(!(b[fa>>0]|0))qa=f[(f[la>>2]|0)+(pa<<2)>>2]|0;else qa=pa;ra=ma;sa=f[ra>>2]|0;ta=f[ra+4>>2]|0;ra=na;ua=un(f[ra>>2]|0,f[ra+4>>2]|0,qa|0,0)|0;ra=Vn(ua|0,I|0,sa|0,ta|0)|0;kh((f[H>>2]|0)+((X(f[F>>2]|0,pa)|0)<<2)+($<<2)|0,(f[f[ga>>2]>>2]|0)+ra|0,b[oa>>0]<<2|0)|0;pa=pa+1|0}while((pa|0)!=(B|0));ja=ba;ka=oa;break}case 1:case 3:case 5:{oa=ga+24|0;pa=b[oa>>0]|0;na=pa<<24>>24;f[j>>2]=0;f[R>>2]=0;f[S>>2]=0;if(!(pa<<24>>24))va=0;else{if(pa<<24>>24<0){wa=24;break b}pa=na<<2;ma=ln(pa)|0;f[j>>2]=ma;la=ma+(na<<2)|0;f[Y>>2]=la;sj(ma|0,0,pa|0)|0;f[R>>2]=la;va=b[oa>>0]|0}la=va<<24>>24;f[k>>2]=0;f[T>>2]=0;f[U>>2]=0;if(!(va<<24>>24)){xa=0;ya=0}else{if(va<<24>>24<0){wa=30;break b}pa=la<<2;ma=ln(pa)|0;f[k>>2]=ma;na=ma+(la<<2)|0;f[V>>2]=na;sj(ma|0,0,pa|0)|0;f[T>>2]=na;xa=ma;ya=ma}if(Q){za=ya;Aa=xa}else{ma=ga+84|0;na=ga+68|0;pa=0;do{if(!(b[ma>>0]|0))Ba=f[(f[na>>2]|0)+(pa<<2)>>2]|0;else Ba=pa;la=f[j>>2]|0;f[g>>2]=Ba;fa=b[oa>>0]|0;f[e>>2]=f[g>>2];Qb(ga,e,fa,la)|0;la=b[oa>>0]|0;fa=la<<24>>24;if(la<<24>>24>0){la=f[j>>2]|0;ra=f[W>>2]|0;ta=f[k>>2]|0;sa=0;do{f[ta+(sa<<2)>>2]=(f[la+(sa<<2)>>2]|0)-(f[ra+(sa+ba<<2)>>2]|0);sa=sa+1|0}while((sa|0)<(fa|0));Ca=ta}else Ca=f[k>>2]|0;kh((f[H>>2]|0)+((X(f[F>>2]|0,pa)|0)<<2)+($<<2)|0,Ca|0,fa<<2|0)|0;pa=pa+1|0}while(pa>>>0<B>>>0);pa=f[k>>2]|0;za=pa;Aa=pa}pa=ba+(b[oa>>0]|0)|0;if(za|0){na=f[T>>2]|0;if((na|0)!=(za|0))f[T>>2]=na+(~((na+-4-za|0)>>>2)<<2);Oq(Aa)}na=f[j>>2]|0;if(na|0){ma=f[R>>2]|0;if((ma|0)!=(na|0))f[R>>2]=ma+(~((ma+-4-na|0)>>>2)<<2);Oq(na)}ja=pa;ka=oa;break}default:{pa=ga+24|0;na=b[pa>>0]|0;ma=na<<24>>24;f[j>>2]=0;f[K>>2]=0;f[O>>2]=0;if(!(na<<24>>24)){Da=0;Ea=0}else{if(na<<24>>24<0){wa=53;break b}na=ma<<2;ta=ln(na)|0;f[j>>2]=ta;sa=ta+(ma<<2)|0;f[P>>2]=sa;sj(ta|0,0,na|0)|0;f[K>>2]=sa;Da=ta;Ea=ta}if(Q){Fa=Ea;Ga=Da}else{ta=ga+84|0;sa=ga+68|0;na=0;do{if(!(b[ta>>0]|0))Ha=f[(f[sa>>2]|0)+(na<<2)>>2]|0;else Ha=na;ma=f[j>>2]|0;f[g>>2]=Ha;ra=b[pa>>0]|0;f[e>>2]=f[g>>2];Pb(ga,e,ra,ma)|0;kh((f[H>>2]|0)+((X(f[F>>2]|0,na)|0)<<2)+($<<2)|0,f[j>>2]|0,b[pa>>0]<<2|0)|0;na=na+1|0}while(na>>>0<B>>>0);na=f[j>>2]|0;Fa=na;Ga=na}if(Fa|0){na=f[K>>2]|0;if((na|0)!=(Fa|0))f[K>>2]=na+(~((na+-4-Fa|0)>>>2)<<2);Oq(Ga)}ja=ba;ka=pa}}while(0);na=ca+1|0;sa=f[G>>2]|0;if(na>>>0>=(f[L>>2]|0)-sa>>2>>>0){wa=66;break}$=$+(b[ka>>0]|0)|0;aa=ha;ba=ja;ca=na;da=sa;ea=f[A>>2]|0}if((wa|0)==24)aq(j);else if((wa|0)==30)aq(k);else if((wa|0)==53)aq(j);else if((wa|0)==66){Ia=f[D>>2]|0;Ja=f[H>>2]|0;wa=67;break}}else{Ia=E;Ja=N;wa=67}while(0);d:do if((wa|0)==67){N=X(Ia,B)|0;if((N|0)>0){E=0;H=0;while(1){D=f[Ja+(E<<2)>>2]|0;if(!D)Ka=H;else{A=(_(D|0)|0)^31;Ka=(A|0)<(H|0)?H:A+1|0}E=E+1|0;if((E|0)>=(N|0)){La=Ka;break}else H=Ka}}else La=0;switch(b[h>>0]|0){case 6:{Ue(j,Ia);f[l>>2]=0;f[l+4>>2]=i;H=f[F>>2]|0;f[l+8>>2]=H;f[m>>2]=f[i>>2];f[m+4>>2]=i;f[m+8>>2]=H;f[k>>2]=La;f[g>>2]=f[l>>2];f[g+4>>2]=f[l+4>>2];f[g+8>>2]=f[l+8>>2];f[e>>2]=f[m>>2];f[e+4>>2]=f[m+4>>2];f[e+8>>2]=f[m+8>>2];H=sf(j,g,e,k,c)|0;Se(j);if(!H){ia=0;break d}break}case 5:{Ue(j,Ia);f[n>>2]=0;f[n+4>>2]=i;H=f[F>>2]|0;f[n+8>>2]=H;f[o>>2]=f[i>>2];f[o+4>>2]=i;f[o+8>>2]=H;f[k>>2]=La;f[g>>2]=f[n>>2];f[g+4>>2]=f[n+4>>2];f[g+8>>2]=f[n+8>>2];f[e>>2]=f[o>>2];f[e+4>>2]=f[o+4>>2];f[e+8>>2]=f[o+8>>2];H=tf(j,g,e,k,c)|0;Se(j);if(!H){ia=0;break d}break}case 4:{Ue(j,Ia);f[p>>2]=0;f[p+4>>2]=i;H=f[F>>2]|0;f[p+8>>2]=H;f[q>>2]=f[i>>2];f[q+4>>2]=i;f[q+8>>2]=H;f[k>>2]=La;f[g>>2]=f[p>>2];f[g+4>>2]=f[p+4>>2];f[g+8>>2]=f[p+8>>2];f[e>>2]=f[q>>2];f[e+4>>2]=f[q+4>>2];f[e+8>>2]=f[q+8>>2];H=tf(j,g,e,k,c)|0;Se(j);if(!H){ia=0;break d}break}case 3:{$e(j,Ia);f[r>>2]=0;f[r+4>>2]=i;H=f[F>>2]|0;f[r+8>>2]=H;f[s>>2]=f[i>>2];f[s+4>>2]=i;f[s+8>>2]=H;f[k>>2]=La;f[g>>2]=f[r>>2];f[g+4>>2]=f[r+4>>2];f[g+8>>2]=f[r+8>>2];f[e>>2]=f[s>>2];f[e+4>>2]=f[s+4>>2];f[e+8>>2]=f[s+8>>2];H=Af(j,g,e,k,c)|0;ef(j);if(!H){ia=0;break d}break}case 2:{$e(j,Ia);f[t>>2]=0;f[t+4>>2]=i;H=f[F>>2]|0;f[t+8>>2]=H;f[v>>2]=f[i>>2];f[v+4>>2]=i;f[v+8>>2]=H;f[k>>2]=La;f[g>>2]=f[t>>2];f[g+4>>2]=f[t+4>>2];f[g+8>>2]=f[t+8>>2];f[e>>2]=f[v>>2];f[e+4>>2]=f[v+4>>2];f[e+8>>2]=f[v+8>>2];H=Af(j,g,e,k,c)|0;ef(j);if(!H){ia=0;break d}break}case 1:{af(j,Ia);f[w>>2]=0;f[w+4>>2]=i;H=f[F>>2]|0;f[w+8>>2]=H;f[x>>2]=f[i>>2];f[x+4>>2]=i;f[x+8>>2]=H;f[k>>2]=La;f[g>>2]=f[w>>2];f[g+4>>2]=f[w+4>>2];f[g+8>>2]=f[w+8>>2];f[e>>2]=f[x>>2];f[e+4>>2]=f[x+4>>2];f[e+8>>2]=f[x+8>>2];H=zf(j,g,e,k,c)|0;df(j);if(!H){ia=0;break d}break}case 0:{af(j,Ia);f[y>>2]=0;f[y+4>>2]=i;H=f[F>>2]|0;f[y+8>>2]=H;f[z>>2]=f[i>>2];f[z+4>>2]=i;f[z+8>>2]=H;f[k>>2]=La;f[g>>2]=f[y>>2];f[g+4>>2]=f[y+4>>2];f[g+8>>2]=f[y+8>>2];f[e>>2]=f[z>>2];f[e+4>>2]=f[z+4>>2];f[e+8>>2]=f[z+8>>2];H=zf(j,g,e,k,c)|0;df(j);if(!H){ia=0;break d}break}default:{ia=0;break d}}ia=1}while(0);j=f[i+12>>2]|0;if(!j){u=d;return ia|0}i=f[J>>2]|0;if((i|0)!=(j|0))f[J>>2]=i+(~((i+-4-j|0)>>>2)<<2);Oq(j);u=d;return ia|0}function kb(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,Y=0,Z=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ja=0;d=u;u=u+32|0;e=d;g=a+8|0;h=f[g>>2]|0;f[e>>2]=0;i=e+4|0;f[i>>2]=0;f[e+8>>2]=0;do if(h)if(h>>>0>1073741823)aq(e);else{j=h<<2;k=ln(j)|0;f[e>>2]=k;l=k+(h<<2)|0;f[e+8>>2]=l;sj(k|0,0,j|0)|0;f[i>>2]=l;m=l;n=k;break}else{m=0;n=0}while(0);k=a+1164|0;l=f[k>>2]|0;j=f[l>>2]|0;o=l+4|0;if(!j){p=l+8|0;q=n;r=m;s=h}else{h=f[o>>2]|0;if((h|0)!=(j|0))f[o>>2]=h+(~((h+-4-j|0)>>>2)<<2);Oq(j);j=l+8|0;f[j>>2]=0;f[o>>2]=0;f[l>>2]=0;p=j;q=f[e>>2]|0;r=f[i>>2]|0;s=f[g>>2]|0}f[l>>2]=q;f[o>>2]=r;f[p>>2]=f[e+8>>2];f[e>>2]=0;p=e+4|0;f[p>>2]=0;f[e+8>>2]=0;do if(s)if(s>>>0>1073741823)aq(e);else{r=s<<2;o=ln(r)|0;f[e>>2]=o;q=o+(s<<2)|0;f[e+8>>2]=q;sj(o|0,0,r|0)|0;f[p>>2]=q;t=q;v=o;break}else{t=0;v=0}while(0);s=a+1176|0;o=f[s>>2]|0;q=f[o>>2]|0;r=o+4|0;if(!q){w=o+8|0;x=v;y=t}else{t=f[r>>2]|0;if((t|0)!=(q|0))f[r>>2]=t+(~((t+-4-q|0)>>>2)<<2);Oq(q);q=o+8|0;f[q>>2]=0;f[r>>2]=0;f[o>>2]=0;w=q;x=f[e>>2]|0;y=f[p>>2]|0}f[o>>2]=x;f[r>>2]=y;f[w>>2]=f[e+8>>2];w=f[b>>2]|0;y=b+4|0;r=f[y>>2]|0;x=f[y+4>>2]|0;y=f[c>>2]|0;o=c+4|0;p=f[o>>2]|0;q=f[o+4>>2]|0;f[e>>2]=0;f[e+4>>2]=0;f[e+8>>2]=0;f[e+12>>2]=0;f[e+16>>2]=0;f[e+20>>2]=0;o=e+8|0;t=e+4|0;v=e+16|0;l=e+20|0;i=r;Pc(e);j=f[t>>2]|0;h=(f[l>>2]|0)+(f[v>>2]|0)|0;if((f[o>>2]|0)==(j|0))z=0;else z=(f[j+(((h>>>0)/113|0)<<2)>>2]|0)+(((h>>>0)%113|0)*36|0)|0;f[z>>2]=w;h=z+4|0;f[h>>2]=r;f[h+4>>2]=x;f[z+12>>2]=y;h=z+16|0;f[h>>2]=p;f[h+4>>2]=q;f[z+24>>2]=0;f[z+28>>2]=y-w;f[z+32>>2]=0;z=(f[l>>2]|0)+1|0;f[l>>2]=z;if(z|0){w=a+1152|0;y=a+1084|0;h=a+1080|0;j=a+1072|0;m=a+1076|0;n=a+1068|0;A=b+8|0;B=c+8|0;C=a+1124|0;D=a+1120|0;E=a+1112|0;F=a+1116|0;G=a+1108|0;H=i+4|0;I=i+24|0;J=i+24|0;K=p+24|0;L=z;while(1){z=f[v>>2]|0;M=L+-1|0;N=M+z|0;O=f[t>>2]|0;P=f[O+(((N>>>0)/113|0)<<2)>>2]|0;Q=(N>>>0)%113|0;N=f[P+(Q*36|0)>>2]|0;R=f[P+(Q*36|0)+12>>2]|0;S=f[P+(Q*36|0)+24>>2]|0;T=f[P+(Q*36|0)+32>>2]|0;f[l>>2]=M;M=f[o>>2]|0;Q=M-O>>2;if((1-L-z+((Q|0)==0?0:(Q*113|0)+-1|0)|0)>>>0>225){Oq(f[M+-4>>2]|0);f[o>>2]=(f[o>>2]|0)+-4}f[b>>2]=N;f[c>>2]=R;M=f[k>>2]|0;Q=((f[g>>2]|0)+-1|0)==(S|0)?0:S+1|0;S=(f[s>>2]|0)+(T*12|0)|0;z=R-N|0;O=(f[a>>2]|0)-(f[(f[S>>2]|0)+(Q<<2)>>2]|0)|0;a:do if(O){if(z>>>0<3){P=f[w>>2]|0;f[P>>2]=Q;U=f[g>>2]|0;if(U>>>0>1){V=1;W=U;Y=Q;while(1){Y=(Y|0)==(W+-1|0)?0:Y+1|0;f[P+(V<<2)>>2]=Y;V=V+1|0;Z=f[g>>2]|0;if(V>>>0>=Z>>>0){$=Z;break}else W=Z}}else $=U;if(!z){aa=85;break}else{ba=0;ca=$}while(1){W=(f[I>>2]|0)+((X(f[H>>2]|0,N+ba|0)|0)<<2)|0;if(!ca)da=0;else{V=0;do{Y=f[(f[w>>2]|0)+(V<<2)>>2]|0;P=(f[a>>2]|0)-(f[(f[S>>2]|0)+(Y<<2)>>2]|0)|0;do if(P|0){Z=f[y>>2]|0;ea=32-Z|0;fa=32-P|0;ga=f[W+(Y<<2)>>2]<<fa;if((P|0)>(ea|0)){ha=ga>>>fa;fa=P-ea|0;f[y>>2]=fa;ea=f[h>>2]|ha>>>fa;f[h>>2]=ea;fa=f[j>>2]|0;if((fa|0)==(f[m>>2]|0))Ri(n,h);else{f[fa>>2]=ea;f[j>>2]=fa+4}f[h>>2]=ha<<32-(f[y>>2]|0);break}ha=f[h>>2]|ga>>>Z;f[h>>2]=ha;ga=Z+P|0;f[y>>2]=ga;if((ga|0)!=32)break;ga=f[j>>2]|0;if((ga|0)==(f[m>>2]|0))Ri(n,h);else{f[ga>>2]=ha;f[j>>2]=ga+4}f[h>>2]=0;f[y>>2]=0}while(0);V=V+1|0;P=f[g>>2]|0}while(V>>>0<P>>>0);da=P}ba=ba+1|0;if(ba>>>0>=z>>>0){aa=85;break a}else ca=da}}U=T+1|0;Ig(M+(U*12|0)|0,f[M+(T*12|0)>>2]|0,f[M+(T*12|0)+4>>2]|0);V=(f[(f[k>>2]|0)+(U*12|0)>>2]|0)+(Q<<2)|0;W=(f[V>>2]|0)+(1<<O+-1)|0;f[V>>2]=W;V=f[A>>2]|0;P=f[B>>2]|0;b:do if((R|0)==(N|0))ia=N;else{Y=f[J>>2]|0;if(!V){if((f[Y+(Q<<2)>>2]|0)>>>0<W>>>0){ia=R;break}else{ja=R;ka=N}while(1){ga=ja;do{ga=ga+-1|0;if((ka|0)==(ga|0)){ia=ka;break b}ha=(f[K>>2]|0)+((X(ga,P)|0)<<2)+(Q<<2)|0}while((f[ha>>2]|0)>>>0>=W>>>0);ka=ka+1|0;if((ka|0)==(ga|0)){ia=ga;break b}else ja=ga}}else{la=R;ma=N}while(1){ha=ma;while(1){na=Y+((X(ha,V)|0)<<2)|0;if((f[na+(Q<<2)>>2]|0)>>>0>=W>>>0){oa=la;break}Z=ha+1|0;if((Z|0)==(la|0)){ia=la;break b}else ha=Z}while(1){oa=oa+-1|0;if((ha|0)==(oa|0)){ia=ha;break b}pa=(f[K>>2]|0)+((X(oa,P)|0)<<2)|0;if((f[pa+(Q<<2)>>2]|0)>>>0<W>>>0){qa=0;break}}do{ga=na+(qa<<2)|0;Z=pa+(qa<<2)|0;fa=f[ga>>2]|0;f[ga>>2]=f[Z>>2];f[Z>>2]=fa;qa=qa+1|0}while((qa|0)!=(V|0));ma=ha+1|0;if((ma|0)==(oa|0)){ia=oa;break}else la=oa}}while(0);W=(_(z|0)|0)^31;P=ia-N|0;Y=R-ia|0;fa=P>>>0<Y>>>0;if((P|0)!=(Y|0)){Z=f[C>>2]|0;if(fa)f[D>>2]=f[D>>2]|1<<31-Z;ga=Z+1|0;f[C>>2]=ga;if((ga|0)==32){ga=f[E>>2]|0;if((ga|0)==(f[F>>2]|0))Ri(G,D);else{f[ga>>2]=f[D>>2];f[E>>2]=ga+4}f[C>>2]=0;f[D>>2]=0}}ga=z>>>1;if(fa){fa=ga-P|0;if(W|0){Z=0;ea=1<<W+-1;while(1){fj(a+12+(Z<<5)|0,(ea&fa|0)!=0);Z=Z+1|0;if((Z|0)==(W|0))break;else ea=ea>>>1}}}else{ea=ga-Y|0;if(W|0){Z=0;fa=1<<W+-1;while(1){fj(a+12+(Z<<5)|0,(fa&ea|0)!=0);Z=Z+1|0;if((Z|0)==(W|0))break;else fa=fa>>>1}}}fa=f[s>>2]|0;W=f[fa+(T*12|0)>>2]|0;Z=W+(Q<<2)|0;f[Z>>2]=(f[Z>>2]|0)+1;Ig(fa+(U*12|0)|0,W,f[fa+(T*12|0)+4>>2]|0);if((ia|0)!=(N|0)){fa=f[o>>2]|0;W=f[t>>2]|0;Z=fa-W>>2;ea=f[v>>2]|0;ga=f[l>>2]|0;if((((Z|0)==0?0:(Z*113|0)+-1|0)|0)==(ga+ea|0)){Pc(e);ra=f[v>>2]|0;sa=f[l>>2]|0;ta=f[o>>2]|0;ua=f[t>>2]|0}else{ra=ea;sa=ga;ta=fa;ua=W}W=sa+ra|0;if((ta|0)==(ua|0))va=0;else va=(f[ua+(((W>>>0)/113|0)<<2)>>2]|0)+(((W>>>0)%113|0)*36|0)|0;f[va>>2]=N;W=va+4|0;f[W>>2]=r;f[W+4>>2]=x;f[va+12>>2]=ia;f[va+16>>2]=i;f[va+20>>2]=V;f[va+24>>2]=Q;f[va+28>>2]=P;f[va+32>>2]=T;f[l>>2]=(f[l>>2]|0)+1}if((R|0)!=(ia|0)){W=f[o>>2]|0;fa=f[t>>2]|0;ga=W-fa>>2;ea=f[v>>2]|0;Z=f[l>>2]|0;if((((ga|0)==0?0:(ga*113|0)+-1|0)|0)==(Z+ea|0)){Pc(e);wa=f[v>>2]|0;xa=f[l>>2]|0;ya=f[o>>2]|0;za=f[t>>2]|0}else{wa=ea;xa=Z;ya=W;za=fa}fa=xa+wa|0;if((ya|0)==(za|0))Aa=0;else Aa=(f[za+(((fa>>>0)/113|0)<<2)>>2]|0)+(((fa>>>0)%113|0)*36|0)|0;f[Aa>>2]=ia;f[Aa+4>>2]=i;f[Aa+8>>2]=V;f[Aa+12>>2]=R;fa=Aa+16|0;f[fa>>2]=p;f[fa+4>>2]=q;f[Aa+24>>2]=Q;f[Aa+28>>2]=Y;f[Aa+32>>2]=U;fa=(f[l>>2]|0)+1|0;f[l>>2]=fa;Ba=fa}else aa=85}else aa=85;while(0);if((aa|0)==85){aa=0;Ba=f[l>>2]|0}if(!Ba)break;else L=Ba}}Ba=f[t>>2]|0;L=f[v>>2]|0;Aa=Ba+(((L>>>0)/113|0)<<2)|0;q=f[o>>2]|0;p=q;i=Ba;if((q|0)==(Ba|0)){Ca=0;Da=0}else{ia=(f[Aa>>2]|0)+(((L>>>0)%113|0)*36|0)|0;Ca=ia;Da=ia}ia=Aa;Aa=Da;c:while(1){Da=Aa;do{L=Da;if((Ca|0)==(L|0))break c;Da=L+36|0}while((Da-(f[ia>>2]|0)|0)!=4068);Da=ia+4|0;ia=Da;Aa=f[Da>>2]|0}f[l>>2]=0;l=p-i>>2;if(l>>>0>2){i=Ba;do{Oq(f[i>>2]|0);i=(f[t>>2]|0)+4|0;f[t>>2]=i;Ea=f[o>>2]|0;Fa=Ea-i>>2}while(Fa>>>0>2);Ga=Fa;Ha=i;Ia=Ea}else{Ga=l;Ha=Ba;Ia=q}switch(Ga|0){case 1:{Ja=56;aa=99;break}case 2:{Ja=113;aa=99;break}default:{}}if((aa|0)==99)f[v>>2]=Ja;if((Ha|0)!=(Ia|0)){Ja=Ha;do{Oq(f[Ja>>2]|0);Ja=Ja+4|0}while((Ja|0)!=(Ia|0));Ia=f[t>>2]|0;t=f[o>>2]|0;if((t|0)!=(Ia|0))f[o>>2]=t+(~((t+-4-Ia|0)>>>2)<<2)}Ia=f[e>>2]|0;if(!Ia){u=d;return}Oq(Ia);u=d;return}function lb(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,Y=0,Z=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ja=0,Ka=0;d=u;u=u+32|0;e=d;g=a+8|0;h=f[g>>2]|0;f[e>>2]=0;i=e+4|0;f[i>>2]=0;f[e+8>>2]=0;do if(h)if(h>>>0>1073741823)aq(e);else{j=h<<2;k=ln(j)|0;f[e>>2]=k;l=k+(h<<2)|0;f[e+8>>2]=l;sj(k|0,0,j|0)|0;f[i>>2]=l;m=l;n=k;break}else{m=0;n=0}while(0);k=a+140|0;l=f[k>>2]|0;j=f[l>>2]|0;o=l+4|0;if(!j){p=l+8|0;q=n;r=m;s=h}else{h=f[o>>2]|0;if((h|0)!=(j|0))f[o>>2]=h+(~((h+-4-j|0)>>>2)<<2);Oq(j);j=l+8|0;f[j>>2]=0;f[o>>2]=0;f[l>>2]=0;p=j;q=f[e>>2]|0;r=f[i>>2]|0;s=f[g>>2]|0}f[l>>2]=q;f[o>>2]=r;f[p>>2]=f[e+8>>2];f[e>>2]=0;p=e+4|0;f[p>>2]=0;f[e+8>>2]=0;do if(s)if(s>>>0>1073741823)aq(e);else{r=s<<2;o=ln(r)|0;f[e>>2]=o;q=o+(s<<2)|0;f[e+8>>2]=q;sj(o|0,0,r|0)|0;f[p>>2]=q;t=q;v=o;break}else{t=0;v=0}while(0);s=a+152|0;o=f[s>>2]|0;q=f[o>>2]|0;r=o+4|0;if(!q){w=o+8|0;x=v;y=t}else{t=f[r>>2]|0;if((t|0)!=(q|0))f[r>>2]=t+(~((t+-4-q|0)>>>2)<<2);Oq(q);q=o+8|0;f[q>>2]=0;f[r>>2]=0;f[o>>2]=0;w=q;x=f[e>>2]|0;y=f[p>>2]|0}f[o>>2]=x;f[r>>2]=y;f[w>>2]=f[e+8>>2];w=f[b>>2]|0;y=b+4|0;r=f[y>>2]|0;x=f[y+4>>2]|0;y=f[c>>2]|0;o=c+4|0;p=f[o>>2]|0;q=f[o+4>>2]|0;f[e>>2]=0;f[e+4>>2]=0;f[e+8>>2]=0;f[e+12>>2]=0;f[e+16>>2]=0;f[e+20>>2]=0;o=e+8|0;t=e+4|0;v=e+16|0;l=e+20|0;i=r;Pc(e);j=f[t>>2]|0;h=(f[l>>2]|0)+(f[v>>2]|0)|0;if((f[o>>2]|0)==(j|0))z=0;else z=(f[j+(((h>>>0)/113|0)<<2)>>2]|0)+(((h>>>0)%113|0)*36|0)|0;f[z>>2]=w;h=z+4|0;f[h>>2]=r;f[h+4>>2]=x;f[z+12>>2]=y;h=z+16|0;f[h>>2]=p;f[h+4>>2]=q;f[z+24>>2]=0;f[z+28>>2]=y-w;f[z+32>>2]=0;z=(f[l>>2]|0)+1|0;f[l>>2]=z;if(z|0){w=a+128|0;y=a+60|0;h=a+56|0;j=a+48|0;m=a+52|0;n=a+44|0;A=b+8|0;B=c+8|0;C=a+12|0;D=a+100|0;E=a+96|0;F=a+88|0;G=a+92|0;H=a+84|0;I=i+4|0;J=i+24|0;K=i+24|0;L=p+24|0;M=z;while(1){z=f[v>>2]|0;N=M+-1|0;O=N+z|0;P=f[t>>2]|0;Q=f[P+(((O>>>0)/113|0)<<2)>>2]|0;R=(O>>>0)%113|0;O=f[Q+(R*36|0)>>2]|0;S=f[Q+(R*36|0)+12>>2]|0;T=f[Q+(R*36|0)+24>>2]|0;U=f[Q+(R*36|0)+32>>2]|0;f[l>>2]=N;N=f[o>>2]|0;R=N-P>>2;if((1-M-z+((R|0)==0?0:(R*113|0)+-1|0)|0)>>>0>225){Oq(f[N+-4>>2]|0);f[o>>2]=(f[o>>2]|0)+-4}f[b>>2]=O;f[c>>2]=S;N=f[k>>2]|0;R=((f[g>>2]|0)+-1|0)==(T|0)?0:T+1|0;T=(f[s>>2]|0)+(U*12|0)|0;z=S-O|0;P=(f[a>>2]|0)-(f[(f[T>>2]|0)+(R<<2)>>2]|0)|0;a:do if(P){if(z>>>0<3){Q=f[w>>2]|0;f[Q>>2]=R;V=f[g>>2]|0;if(V>>>0>1){W=1;Y=V;Z=R;while(1){Z=(Z|0)==(Y+-1|0)?0:Z+1|0;f[Q+(W<<2)>>2]=Z;W=W+1|0;$=f[g>>2]|0;if(W>>>0>=$>>>0){aa=$;break}else Y=$}}else aa=V;if(!z){ba=81;break}else{ca=0;da=aa}while(1){Y=(f[J>>2]|0)+((X(f[I>>2]|0,O+ca|0)|0)<<2)|0;if(!da)ea=0;else{W=0;do{Z=f[(f[w>>2]|0)+(W<<2)>>2]|0;Q=(f[a>>2]|0)-(f[(f[T>>2]|0)+(Z<<2)>>2]|0)|0;do if(Q|0){$=f[y>>2]|0;fa=32-$|0;ga=32-Q|0;ha=f[Y+(Z<<2)>>2]<<ga;if((Q|0)>(fa|0)){ia=ha>>>ga;ga=Q-fa|0;f[y>>2]=ga;fa=f[h>>2]|ia>>>ga;f[h>>2]=fa;ga=f[j>>2]|0;if((ga|0)==(f[m>>2]|0))Ri(n,h);else{f[ga>>2]=fa;f[j>>2]=ga+4}f[h>>2]=ia<<32-(f[y>>2]|0);break}ia=f[h>>2]|ha>>>$;f[h>>2]=ia;ha=$+Q|0;f[y>>2]=ha;if((ha|0)!=32)break;ha=f[j>>2]|0;if((ha|0)==(f[m>>2]|0))Ri(n,h);else{f[ha>>2]=ia;f[j>>2]=ha+4}f[h>>2]=0;f[y>>2]=0}while(0);W=W+1|0;Q=f[g>>2]|0}while(W>>>0<Q>>>0);ea=Q}ca=ca+1|0;if(ca>>>0>=z>>>0){ba=81;break a}else da=ea}}V=U+1|0;Ig(N+(V*12|0)|0,f[N+(U*12|0)>>2]|0,f[N+(U*12|0)+4>>2]|0);W=(f[(f[k>>2]|0)+(V*12|0)>>2]|0)+(R<<2)|0;Y=(f[W>>2]|0)+(1<<P+-1)|0;f[W>>2]=Y;W=f[A>>2]|0;Q=f[B>>2]|0;b:do if((S|0)==(O|0))ja=O;else{Z=f[K>>2]|0;if(!W){if((f[Z+(R<<2)>>2]|0)>>>0<Y>>>0){ja=S;break}else{ka=S;la=O}while(1){ha=ka;do{ha=ha+-1|0;if((la|0)==(ha|0)){ja=la;break b}ia=(f[L>>2]|0)+((X(ha,Q)|0)<<2)+(R<<2)|0}while((f[ia>>2]|0)>>>0>=Y>>>0);la=la+1|0;if((la|0)==(ha|0)){ja=ha;break b}else ka=ha}}else{ma=S;na=O}while(1){ia=na;while(1){oa=Z+((X(ia,W)|0)<<2)|0;if((f[oa+(R<<2)>>2]|0)>>>0>=Y>>>0){pa=ma;break}$=ia+1|0;if(($|0)==(ma|0)){ja=ma;break b}else ia=$}while(1){pa=pa+-1|0;if((ia|0)==(pa|0)){ja=ia;break b}qa=(f[L>>2]|0)+((X(pa,Q)|0)<<2)|0;if((f[qa+(R<<2)>>2]|0)>>>0<Y>>>0){ra=0;break}}do{ha=oa+(ra<<2)|0;$=qa+(ra<<2)|0;ga=f[ha>>2]|0;f[ha>>2]=f[$>>2];f[$>>2]=ga;ra=ra+1|0}while((ra|0)!=(W|0));na=ia+1|0;if((na|0)==(pa|0)){ja=pa;break}else ma=pa}}while(0);Y=(_(z|0)|0)^31;Q=ja-O|0;Z=S-ja|0;ga=Q>>>0<Z>>>0;if((Q|0)!=(Z|0)){$=f[D>>2]|0;if(ga)f[E>>2]=f[E>>2]|1<<31-$;ha=$+1|0;f[D>>2]=ha;if((ha|0)==32){ha=f[F>>2]|0;if((ha|0)==(f[G>>2]|0))Ri(H,E);else{f[ha>>2]=f[E>>2];f[F>>2]=ha+4}f[D>>2]=0;f[E>>2]=0}}ha=z>>>1;if(ga)sg(C,Y,ha-Q|0);else sg(C,Y,ha-Z|0);ha=f[s>>2]|0;Y=f[ha+(U*12|0)>>2]|0;ga=Y+(R<<2)|0;f[ga>>2]=(f[ga>>2]|0)+1;Ig(ha+(V*12|0)|0,Y,f[ha+(U*12|0)+4>>2]|0);if((ja|0)!=(O|0)){ha=f[o>>2]|0;Y=f[t>>2]|0;ga=ha-Y>>2;$=f[v>>2]|0;fa=f[l>>2]|0;if((((ga|0)==0?0:(ga*113|0)+-1|0)|0)==(fa+$|0)){Pc(e);sa=f[v>>2]|0;ta=f[l>>2]|0;ua=f[o>>2]|0;va=f[t>>2]|0}else{sa=$;ta=fa;ua=ha;va=Y}Y=ta+sa|0;if((ua|0)==(va|0))wa=0;else wa=(f[va+(((Y>>>0)/113|0)<<2)>>2]|0)+(((Y>>>0)%113|0)*36|0)|0;f[wa>>2]=O;Y=wa+4|0;f[Y>>2]=r;f[Y+4>>2]=x;f[wa+12>>2]=ja;f[wa+16>>2]=i;f[wa+20>>2]=W;f[wa+24>>2]=R;f[wa+28>>2]=Q;f[wa+32>>2]=U;f[l>>2]=(f[l>>2]|0)+1}if((S|0)!=(ja|0)){Q=f[o>>2]|0;Y=f[t>>2]|0;ha=Q-Y>>2;fa=f[v>>2]|0;$=f[l>>2]|0;if((((ha|0)==0?0:(ha*113|0)+-1|0)|0)==($+fa|0)){Pc(e);xa=f[v>>2]|0;ya=f[l>>2]|0;za=f[o>>2]|0;Aa=f[t>>2]|0}else{xa=fa;ya=$;za=Q;Aa=Y}Y=ya+xa|0;if((za|0)==(Aa|0))Ba=0;else Ba=(f[Aa+(((Y>>>0)/113|0)<<2)>>2]|0)+(((Y>>>0)%113|0)*36|0)|0;f[Ba>>2]=ja;f[Ba+4>>2]=i;f[Ba+8>>2]=W;f[Ba+12>>2]=S;Y=Ba+16|0;f[Y>>2]=p;f[Y+4>>2]=q;f[Ba+24>>2]=R;f[Ba+28>>2]=Z;f[Ba+32>>2]=V;Z=(f[l>>2]|0)+1|0;f[l>>2]=Z;Ca=Z}else ba=81}else ba=81;while(0);if((ba|0)==81){ba=0;Ca=f[l>>2]|0}if(!Ca)break;else M=Ca}}Ca=f[t>>2]|0;M=f[v>>2]|0;Ba=Ca+(((M>>>0)/113|0)<<2)|0;q=f[o>>2]|0;p=q;i=Ca;if((q|0)==(Ca|0)){Da=0;Ea=0}else{ja=(f[Ba>>2]|0)+(((M>>>0)%113|0)*36|0)|0;Da=ja;Ea=ja}ja=Ba;Ba=Ea;c:while(1){Ea=Ba;do{M=Ea;if((Da|0)==(M|0))break c;Ea=M+36|0}while((Ea-(f[ja>>2]|0)|0)!=4068);Ea=ja+4|0;ja=Ea;Ba=f[Ea>>2]|0}f[l>>2]=0;l=p-i>>2;if(l>>>0>2){i=Ca;do{Oq(f[i>>2]|0);i=(f[t>>2]|0)+4|0;f[t>>2]=i;Fa=f[o>>2]|0;Ga=Fa-i>>2}while(Ga>>>0>2);Ha=Ga;Ia=i;Ja=Fa}else{Ha=l;Ia=Ca;Ja=q}switch(Ha|0){case 1:{Ka=56;ba=95;break}case 2:{Ka=113;ba=95;break}default:{}}if((ba|0)==95)f[v>>2]=Ka;if((Ia|0)!=(Ja|0)){Ka=Ia;do{Oq(f[Ka>>2]|0);Ka=Ka+4|0}while((Ka|0)!=(Ja|0));Ja=f[t>>2]|0;t=f[o>>2]|0;if((t|0)!=(Ja|0))f[o>>2]=t+(~((t+-4-Ja|0)>>>2)<<2)}Ja=f[e>>2]|0;if(!Ja){u=d;return}Oq(Ja);u=d;return}function mb(a,c,e,g){a=a|0;c=c|0;e=e|0;g=g|0;var i=0,k=0,l=0,m=0,o=0,q=0,r=0,s=Oa,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0;if(!g){i=0;return i|0}do switch(f[a+28>>2]|0){case 1:{k=a+24|0;l=b[k>>0]|0;if((l<<24>>24>e<<24>>24?e:l)<<24>>24>0){m=f[f[a>>2]>>2]|0;o=a+40|0;q=un(f[o>>2]|0,f[o+4>>2]|0,f[c>>2]|0,0)|0;o=a+48|0;r=Vn(q|0,I|0,f[o>>2]|0,f[o+4>>2]|0)|0;o=m+r|0;if(!(b[a+32>>0]|0)){r=o;m=0;while(1){s=$(b[r>>0]|0);n[g+(m<<2)>>2]=s;m=m+1|0;q=b[k>>0]|0;if((m|0)>=((q<<24>>24>e<<24>>24?e:q)<<24>>24|0)){t=q;break}else r=r+1|0}}else{r=o;m=0;while(1){s=$($(b[r>>0]|0)/$(127.0));n[g+(m<<2)>>2]=s;m=m+1|0;q=b[k>>0]|0;if((m|0)>=((q<<24>>24>e<<24>>24?e:q)<<24>>24|0)){t=q;break}else r=r+1|0}}}else t=l;r=t<<24>>24;if(t<<24>>24>=e<<24>>24){i=1;return i|0}sj(g+(r<<2)|0,0,(e<<24>>24)-r<<2|0)|0;i=1;return i|0}case 2:{r=a+24|0;m=b[r>>0]|0;if((m<<24>>24>e<<24>>24?e:m)<<24>>24>0){k=f[f[a>>2]>>2]|0;o=a+40|0;q=un(f[o>>2]|0,f[o+4>>2]|0,f[c>>2]|0,0)|0;o=a+48|0;u=Vn(q|0,I|0,f[o>>2]|0,f[o+4>>2]|0)|0;o=k+u|0;if(!(b[a+32>>0]|0)){u=o;k=0;while(1){s=$(h[u>>0]|0);n[g+(k<<2)>>2]=s;k=k+1|0;q=b[r>>0]|0;if((k|0)>=((q<<24>>24>e<<24>>24?e:q)<<24>>24|0)){v=q;break}else u=u+1|0}}else{u=o;k=0;while(1){s=$($(h[u>>0]|0)/$(255.0));n[g+(k<<2)>>2]=s;k=k+1|0;l=b[r>>0]|0;if((k|0)>=((l<<24>>24>e<<24>>24?e:l)<<24>>24|0)){v=l;break}else u=u+1|0}}}else v=m;u=v<<24>>24;if(v<<24>>24>=e<<24>>24){i=1;return i|0}sj(g+(u<<2)|0,0,(e<<24>>24)-u<<2|0)|0;i=1;return i|0}case 3:{u=a+48|0;k=f[u>>2]|0;r=f[u+4>>2]|0;u=a+40|0;o=(Vn(un(f[u>>2]|0,f[u+4>>2]|0,f[c>>2]|0,0)|0,I|0,k|0,r|0)|0)+(f[f[a>>2]>>2]|0)|0;r=a+24|0;k=b[r>>0]|0;if((k<<24>>24>e<<24>>24?e:k)<<24>>24>0)if(!(b[a+32>>0]|0)){u=o;l=0;while(1){s=$(d[u>>1]|0);n[g+(l<<2)>>2]=s;l=l+1|0;q=b[r>>0]|0;if((l|0)>=((q<<24>>24>e<<24>>24?e:q)<<24>>24|0)){w=q;break}else u=u+2|0}}else{u=o;l=0;while(1){s=$($(d[u>>1]|0)/$(32767.0));n[g+(l<<2)>>2]=s;l=l+1|0;m=b[r>>0]|0;if((l|0)>=((m<<24>>24>e<<24>>24?e:m)<<24>>24|0)){w=m;break}else u=u+2|0}}else w=k;u=w<<24>>24;if(w<<24>>24>=e<<24>>24){i=1;return i|0}sj(g+(u<<2)|0,0,(e<<24>>24)-u<<2|0)|0;i=1;return i|0}case 4:{u=a+48|0;l=f[u>>2]|0;r=f[u+4>>2]|0;u=a+40|0;o=(Vn(un(f[u>>2]|0,f[u+4>>2]|0,f[c>>2]|0,0)|0,I|0,l|0,r|0)|0)+(f[f[a>>2]>>2]|0)|0;r=a+24|0;l=b[r>>0]|0;if((l<<24>>24>e<<24>>24?e:l)<<24>>24>0)if(!(b[a+32>>0]|0)){u=o;m=0;while(1){s=$(j[u>>1]|0);n[g+(m<<2)>>2]=s;m=m+1|0;q=b[r>>0]|0;if((m|0)>=((q<<24>>24>e<<24>>24?e:q)<<24>>24|0)){x=q;break}else u=u+2|0}}else{u=o;m=0;while(1){s=$($(j[u>>1]|0)/$(65535.0));n[g+(m<<2)>>2]=s;m=m+1|0;k=b[r>>0]|0;if((m|0)>=((k<<24>>24>e<<24>>24?e:k)<<24>>24|0)){x=k;break}else u=u+2|0}}else x=l;u=x<<24>>24;if(x<<24>>24>=e<<24>>24){i=1;return i|0}sj(g+(u<<2)|0,0,(e<<24>>24)-u<<2|0)|0;i=1;return i|0}case 5:{u=a+48|0;m=f[u>>2]|0;r=f[u+4>>2]|0;u=a+40|0;o=(Vn(un(f[u>>2]|0,f[u+4>>2]|0,f[c>>2]|0,0)|0,I|0,m|0,r|0)|0)+(f[f[a>>2]>>2]|0)|0;r=a+24|0;m=b[r>>0]|0;if((m<<24>>24>e<<24>>24?e:m)<<24>>24>0)if(!(b[a+32>>0]|0)){u=o;k=0;while(1){s=$(f[u>>2]|0);n[g+(k<<2)>>2]=s;k=k+1|0;q=b[r>>0]|0;if((k|0)>=((q<<24>>24>e<<24>>24?e:q)<<24>>24|0)){y=q;break}else u=u+4|0}}else{u=o;k=0;while(1){s=$($(f[u>>2]|0)*$(4.65661287e-10));n[g+(k<<2)>>2]=s;k=k+1|0;l=b[r>>0]|0;if((k|0)>=((l<<24>>24>e<<24>>24?e:l)<<24>>24|0)){y=l;break}else u=u+4|0}}else y=m;u=y<<24>>24;if(y<<24>>24>=e<<24>>24){i=1;return i|0}sj(g+(u<<2)|0,0,(e<<24>>24)-u<<2|0)|0;i=1;return i|0}case 6:{u=a+48|0;k=f[u>>2]|0;r=f[u+4>>2]|0;u=a+40|0;o=(Vn(un(f[u>>2]|0,f[u+4>>2]|0,f[c>>2]|0,0)|0,I|0,k|0,r|0)|0)+(f[f[a>>2]>>2]|0)|0;r=a+24|0;k=b[r>>0]|0;if((k<<24>>24>e<<24>>24?e:k)<<24>>24>0)if(!(b[a+32>>0]|0)){u=o;l=0;while(1){s=$((f[u>>2]|0)>>>0);n[g+(l<<2)>>2]=s;l=l+1|0;q=b[r>>0]|0;if((l|0)>=((q<<24>>24>e<<24>>24?e:q)<<24>>24|0)){z=q;break}else u=u+4|0}}else{u=o;l=0;while(1){s=$($((f[u>>2]|0)>>>0)*$(2.32830644e-10));n[g+(l<<2)>>2]=s;l=l+1|0;m=b[r>>0]|0;if((l|0)>=((m<<24>>24>e<<24>>24?e:m)<<24>>24|0)){z=m;break}else u=u+4|0}}else z=k;u=z<<24>>24;if(z<<24>>24>=e<<24>>24){i=1;return i|0}sj(g+(u<<2)|0,0,(e<<24>>24)-u<<2|0)|0;i=1;return i|0}case 7:{u=a+48|0;l=f[u>>2]|0;r=f[u+4>>2]|0;u=a+40|0;o=(Vn(un(f[u>>2]|0,f[u+4>>2]|0,f[c>>2]|0,0)|0,I|0,l|0,r|0)|0)+(f[f[a>>2]>>2]|0)|0;r=a+24|0;l=b[r>>0]|0;if((l<<24>>24>e<<24>>24?e:l)<<24>>24>0)if(!(b[a+32>>0]|0)){u=o;m=0;while(1){q=u;s=$(+((f[q>>2]|0)>>>0)+4294967296.0*+(f[q+4>>2]|0));n[g+(m<<2)>>2]=s;m=m+1|0;q=b[r>>0]|0;if((m|0)>=((q<<24>>24>e<<24>>24?e:q)<<24>>24|0)){A=q;break}else u=u+8|0}}else{u=o;m=0;while(1){k=u;s=$($(+((f[k>>2]|0)>>>0)+4294967296.0*+(f[k+4>>2]|0))*$(1.08420217e-19));n[g+(m<<2)>>2]=s;m=m+1|0;k=b[r>>0]|0;if((m|0)>=((k<<24>>24>e<<24>>24?e:k)<<24>>24|0)){A=k;break}else u=u+8|0}}else A=l;u=A<<24>>24;if(A<<24>>24>=e<<24>>24){i=1;return i|0}sj(g+(u<<2)|0,0,(e<<24>>24)-u<<2|0)|0;i=1;return i|0}case 8:{u=a+48|0;m=f[u>>2]|0;r=f[u+4>>2]|0;u=a+40|0;o=(Vn(un(f[u>>2]|0,f[u+4>>2]|0,f[c>>2]|0,0)|0,I|0,m|0,r|0)|0)+(f[f[a>>2]>>2]|0)|0;r=a+24|0;m=b[r>>0]|0;if((m<<24>>24>e<<24>>24?e:m)<<24>>24>0)if(!(b[a+32>>0]|0)){u=o;k=0;while(1){q=u;s=$(+((f[q>>2]|0)>>>0)+4294967296.0*+((f[q+4>>2]|0)>>>0));n[g+(k<<2)>>2]=s;k=k+1|0;q=b[r>>0]|0;if((k|0)>=((q<<24>>24>e<<24>>24?e:q)<<24>>24|0)){B=q;break}else u=u+8|0}}else{u=o;k=0;while(1){l=u;s=$($(+((f[l>>2]|0)>>>0)+4294967296.0*+((f[l+4>>2]|0)>>>0))*$(5.42101086e-20));n[g+(k<<2)>>2]=s;k=k+1|0;l=b[r>>0]|0;if((k|0)>=((l<<24>>24>e<<24>>24?e:l)<<24>>24|0)){B=l;break}else u=u+8|0}}else B=m;u=B<<24>>24;if(B<<24>>24>=e<<24>>24){i=1;return i|0}sj(g+(u<<2)|0,0,(e<<24>>24)-u<<2|0)|0;i=1;return i|0}case 9:{u=a+24|0;k=b[u>>0]|0;if((k<<24>>24>e<<24>>24?e:k)<<24>>24>0){r=f[f[a>>2]>>2]|0;o=a+40|0;l=un(f[o>>2]|0,f[o+4>>2]|0,f[c>>2]|0,0)|0;o=a+48|0;q=Vn(l|0,I|0,f[o>>2]|0,f[o+4>>2]|0)|0;o=r+q|0;q=0;while(1){f[g+(q<<2)>>2]=f[o>>2];q=q+1|0;r=b[u>>0]|0;if((q|0)>=((r<<24>>24>e<<24>>24?e:r)<<24>>24|0)){C=r;break}else o=o+4|0}}else C=k;o=C<<24>>24;if(C<<24>>24>=e<<24>>24){i=1;return i|0}sj(g+(o<<2)|0,0,(e<<24>>24)-o<<2|0)|0;i=1;return i|0}case 10:{o=a+24|0;q=b[o>>0]|0;if((q<<24>>24>e<<24>>24?e:q)<<24>>24>0){u=f[f[a>>2]>>2]|0;m=a+40|0;r=un(f[m>>2]|0,f[m+4>>2]|0,f[c>>2]|0,0)|0;m=a+48|0;l=Vn(r|0,I|0,f[m>>2]|0,f[m+4>>2]|0)|0;m=u+l|0;l=0;while(1){s=$(+p[m>>3]);n[g+(l<<2)>>2]=s;l=l+1|0;u=b[o>>0]|0;if((l|0)>=((u<<24>>24>e<<24>>24?e:u)<<24>>24|0)){D=u;break}else m=m+8|0}}else D=q;m=D<<24>>24;if(D<<24>>24>=e<<24>>24){i=1;return i|0}sj(g+(m<<2)|0,0,(e<<24>>24)-m<<2|0)|0;i=1;return i|0}case 11:{m=a+24|0;l=b[m>>0]|0;if((l<<24>>24>e<<24>>24?e:l)<<24>>24>0){o=f[f[a>>2]>>2]|0;k=a+40|0;u=un(f[k>>2]|0,f[k+4>>2]|0,f[c>>2]|0,0)|0;k=a+48|0;r=Vn(u|0,I|0,f[k>>2]|0,f[k+4>>2]|0)|0;k=o+r|0;r=0;while(1){s=$((b[k>>0]|0)!=0&1);n[g+(r<<2)>>2]=s;r=r+1|0;o=b[m>>0]|0;if((r|0)>=((o<<24>>24>e<<24>>24?e:o)<<24>>24|0)){E=o;break}else k=k+1|0}}else E=l;k=E<<24>>24;if(E<<24>>24>=e<<24>>24){i=1;return i|0}sj(g+(k<<2)|0,0,(e<<24>>24)-k<<2|0)|0;i=1;return i|0}default:{i=0;return i|0}}while(0);return 0}function nb(a,b,c,d,e,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;g=g|0;var i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,J=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0.0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ja=0,Ka=0,La=0,Ma=0,Na=0,Oa=0,Pa=0,Qa=0,Ra=0,Sa=0,Ta=0,Ua=0,Va=0,Wa=0,Xa=0,Ya=0,Za=0,_a=0,$a=0,ab=0,bb=0.0,cb=0,db=0,eb=0,fb=0,gb=0,hb=0,ib=0,jb=0.0,kb=0.0,lb=0.0,mb=0.0,nb=0.0,ob=0.0,pb=0.0,qb=0.0,rb=0.0,sb=0.0,tb=0;i=u;u=u+512|0;j=i;k=d+c|0;l=0-k|0;m=a+4|0;n=a+100|0;o=b;b=0;a:while(1){switch(o|0){case 46:{p=6;break a;break}case 48:break;default:{q=0;r=o;s=b;t=0;v=0;break a}}w=f[m>>2]|0;if(w>>>0<(f[n>>2]|0)>>>0){f[m>>2]=w+1;o=h[w>>0]|0;b=1;continue}else{o=Si(a)|0;b=1;continue}}if((p|0)==6){o=f[m>>2]|0;if(o>>>0<(f[n>>2]|0)>>>0){f[m>>2]=o+1;x=h[o>>0]|0}else x=Si(a)|0;if((x|0)==48){o=0;w=0;while(1){y=Vn(o|0,w|0,-1,-1)|0;z=I;A=f[m>>2]|0;if(A>>>0<(f[n>>2]|0)>>>0){f[m>>2]=A+1;B=h[A>>0]|0}else B=Si(a)|0;if((B|0)==48){o=y;w=z}else{q=1;r=B;s=1;t=y;v=z;break}}}else{q=1;r=x;s=b;t=0;v=0}}f[j>>2]=0;b=r+-48|0;x=(r|0)==46;b:do if(x|b>>>0<10){B=j+496|0;w=0;o=0;z=0;y=q;A=s;C=r;D=x;E=b;F=t;G=v;H=0;J=0;c:while(1){do if(D)if(!y){L=w;M=o;N=1;O=z;P=A;Q=H;R=J;S=H;T=J}else break c;else{U=Vn(H|0,J|0,1,0)|0;V=I;W=(C|0)!=48;if((o|0)>=125){if(!W){L=w;M=o;N=y;O=z;P=A;Q=F;R=G;S=U;T=V;break}f[B>>2]=f[B>>2]|1;L=w;M=o;N=y;O=z;P=A;Q=F;R=G;S=U;T=V;break}Y=j+(o<<2)|0;if(!w)Z=E;else Z=C+-48+((f[Y>>2]|0)*10|0)|0;f[Y>>2]=Z;Y=w+1|0;_=(Y|0)==9;L=_?0:Y;M=o+(_&1)|0;N=y;O=W?U:z;P=1;Q=F;R=G;S=U;T=V}while(0);V=f[m>>2]|0;if(V>>>0<(f[n>>2]|0)>>>0){f[m>>2]=V+1;$=h[V>>0]|0}else $=Si(a)|0;E=$+-48|0;D=($|0)==46;if(!(D|E>>>0<10)){aa=L;ba=M;ca=O;da=N;ea=$;fa=P;ga=S;ha=Q;ia=T;ja=R;p=29;break b}else{w=L;o=M;z=O;y=N;A=P;C=$;F=Q;G=R;H=S;J=T}}ka=w;la=o;ma=z;na=H;oa=J;pa=F;qa=G;ra=(A|0)!=0;p=37}else{aa=0;ba=0;ca=0;da=q;ea=r;fa=s;ga=0;ha=t;ia=0;ja=v;p=29}while(0);do if((p|0)==29){v=(da|0)==0;t=v?ga:ha;s=v?ia:ja;v=(fa|0)!=0;if(!(v&(ea|32|0)==101))if((ea|0)>-1){ka=aa;la=ba;ma=ca;na=ga;oa=ia;pa=t;qa=s;ra=v;p=37;break}else{sa=aa;ta=ba;ua=ca;va=ga;wa=ia;xa=v;ya=t;za=s;p=39;break}v=Re(a,g)|0;r=I;if((v|0)==0&(r|0)==-2147483648){if(!g){Ym(a,0);Aa=0.0;break}if(!(f[n>>2]|0)){Ba=0;Ca=0}else{f[m>>2]=(f[m>>2]|0)+-1;Ba=0;Ca=0}}else{Ba=v;Ca=r}r=Vn(Ba|0,Ca|0,t|0,s|0)|0;Da=aa;Ea=ba;Fa=ca;Ga=r;Ha=ga;Ia=I;Ja=ia;p=41}while(0);if((p|0)==37)if(f[n>>2]|0){f[m>>2]=(f[m>>2]|0)+-1;if(ra){Da=ka;Ea=la;Fa=ma;Ga=pa;Ha=na;Ia=qa;Ja=oa;p=41}else p=40}else{sa=ka;ta=la;ua=ma;va=na;wa=oa;xa=ra;ya=pa;za=qa;p=39}if((p|0)==39)if(xa){Da=sa;Ea=ta;Fa=ua;Ga=ya;Ha=va;Ia=za;Ja=wa;p=41}else p=40;do if((p|0)==40){wa=Vq()|0;f[wa>>2]=22;Ym(a,0);Aa=0.0}else if((p|0)==41){wa=f[j>>2]|0;if(!wa){Aa=+(e|0)*0.0;break}if(((Ja|0)<0|(Ja|0)==0&Ha>>>0<10)&((Ga|0)==(Ha|0)&(Ia|0)==(Ja|0))?(c|0)>30|(wa>>>c|0)==0:0){Aa=+(e|0)*+(wa>>>0);break}wa=(d|0)/-2|0;za=((wa|0)<0)<<31>>31;if((Ia|0)>(za|0)|(Ia|0)==(za|0)&Ga>>>0>wa>>>0){wa=Vq()|0;f[wa>>2]=34;Aa=+(e|0)*1797693134862315708145274.0e284*1797693134862315708145274.0e284;break}wa=d+-106|0;za=((wa|0)<0)<<31>>31;if((Ia|0)<(za|0)|(Ia|0)==(za|0)&Ga>>>0<wa>>>0){wa=Vq()|0;f[wa>>2]=34;Aa=+(e|0)*2.2250738585072014e-308*2.2250738585072014e-308;break}if(!Da)Ka=Ea;else{if((Da|0)<9){wa=j+(Ea<<2)|0;za=Da;va=f[wa>>2]|0;while(1){va=va*10|0;if((za|0)>=8)break;else za=za+1|0}f[wa>>2]=va}Ka=Ea+1|0}if((Fa|0)<9?(Fa|0)<=(Ga|0)&(Ga|0)<18:0){if((Ga|0)==9){Aa=+(e|0)*+((f[j>>2]|0)>>>0);break}if((Ga|0)<9){Aa=+(e|0)*+((f[j>>2]|0)>>>0)/+(f[6720+(8-Ga<<2)>>2]|0);break}za=c+27+(X(Ga,-3)|0)|0;A=f[j>>2]|0;if((za|0)>30|(A>>>za|0)==0){Aa=+(e|0)*+(A>>>0)*+(f[6720+(Ga+-10<<2)>>2]|0);break}}A=(Ga|0)%9|0;if(!A){La=0;Ma=Ka;Na=0;Oa=Ga}else{za=(Ga|0)>-1?A:A+9|0;A=f[6720+(8-za<<2)>>2]|0;if(Ka){G=1e9/(A|0)|0;F=0;J=0;H=Ga;z=0;do{o=j+(z<<2)|0;w=f[o>>2]|0;ya=((w>>>0)/(A>>>0)|0)+F|0;f[o>>2]=ya;F=X(G,(w>>>0)%(A>>>0)|0)|0;w=(z|0)==(J|0)&(ya|0)==0;H=w?H+-9|0:H;J=w?J+1&127:J;z=z+1|0}while((z|0)!=(Ka|0));if(!F){Pa=J;Qa=Ka;Ra=H}else{f[j+(Ka<<2)>>2]=F;Pa=J;Qa=Ka+1|0;Ra=H}}else{Pa=0;Qa=0;Ra=Ga}La=0;Ma=Qa;Na=Pa;Oa=9-za+Ra|0}d:while(1){z=(Oa|0)<18;A=(Oa|0)==18;G=j+(Na<<2)|0;va=La;wa=Ma;while(1){if(!z){if(!A){Sa=va;Ta=Na;Ua=Oa;Va=wa;break d}if((f[G>>2]|0)>>>0>=9007199){Sa=va;Ta=Na;Ua=18;Va=wa;break d}}w=0;Wa=wa;ya=wa+127|0;while(1){o=ya&127;ua=j+(o<<2)|0;ta=Tn(f[ua>>2]|0,0,29)|0;sa=Vn(ta|0,I|0,w|0,0)|0;ta=I;if(ta>>>0>0|(ta|0)==0&sa>>>0>1e9){xa=jp(sa|0,ta|0,1e9,0)|0;qa=hn(sa|0,ta|0,1e9,0)|0;Xa=xa;Ya=qa}else{Xa=0;Ya=sa}f[ua>>2]=Ya;ua=(o|0)==(Na|0);Wa=(Ya|0)==0&(((o|0)!=(Wa+127&127|0)|ua)^1)?o:Wa;if(ua)break;else{w=Xa;ya=o+-1|0}}va=va+-29|0;if(Xa|0)break;else wa=Wa}wa=Na+127&127;G=Wa+127&127;A=j+((Wa+126&127)<<2)|0;if((wa|0)==(Wa|0)){f[A>>2]=f[A>>2]|f[j+(G<<2)>>2];Za=G}else Za=Wa;f[j+(wa<<2)>>2]=Xa;La=va;Ma=Za;Na=wa;Oa=Oa+9|0}e:while(1){za=Va+1&127;H=j+((Va+127&127)<<2)|0;J=Sa;F=Ta;wa=Ua;while(1){G=(wa|0)==18;A=(wa|0)>27?9:1;_a=J;$a=F;while(1){z=0;while(1){ya=z+$a&127;if((ya|0)==(Va|0)){ab=2;p=88;break}w=f[j+(ya<<2)>>2]|0;ya=f[6752+(z<<2)>>2]|0;if(w>>>0<ya>>>0){ab=2;p=88;break}if(w>>>0>ya>>>0)break;ya=z+1|0;if((z|0)<1)z=ya;else{ab=ya;p=88;break}}if((p|0)==88?(p=0,G&(ab|0)==2):0){bb=0.0;cb=0;db=Va;break e}eb=A+_a|0;if(($a|0)==(Va|0)){_a=eb;$a=Va}else break}G=(1<<A)+-1|0;z=1e9>>>A;fb=0;gb=$a;hb=wa;ya=$a;do{w=j+(ya<<2)|0;o=f[w>>2]|0;ua=(o>>>A)+fb|0;f[w>>2]=ua;fb=X(o&G,z)|0;o=(ya|0)==(gb|0)&(ua|0)==0;hb=o?hb+-9|0:hb;gb=o?gb+1&127:gb;ya=ya+1&127}while((ya|0)!=(Va|0));if(!fb){J=eb;F=gb;wa=hb;continue}if((za|0)!=(gb|0))break;f[H>>2]=f[H>>2]|1;J=eb;F=gb;wa=hb}f[j+(Va<<2)>>2]=fb;Sa=eb;Ta=gb;Ua=hb;Va=za}while(1){wa=cb+$a&127;F=db+1&127;if((wa|0)==(db|0)){f[j+(F+-1<<2)>>2]=0;ib=F}else ib=db;bb=bb*1.0e9+ +((f[j+(wa<<2)>>2]|0)>>>0);cb=cb+1|0;if((cb|0)==2)break;else db=ib}jb=+(e|0);kb=bb*jb;wa=_a+53|0;F=wa-d|0;J=(F|0)<(c|0);H=J?((F|0)>0?F:0):c;if((H|0)<53){lb=+rq(+bk(1.0,105-H|0),kb);mb=+Dq(kb,+bk(1.0,53-H|0));nb=lb;ob=mb;pb=lb+(kb-mb)}else{nb=0.0;ob=0.0;pb=kb}va=$a+2&127;if((va|0)!=(ib|0)){ya=f[j+(va<<2)>>2]|0;do if(ya>>>0>=5e8){if((ya|0)!=5e8){qb=jb*.75+ob;break}if(($a+3&127|0)==(ib|0)){qb=jb*.5+ob;break}else{qb=jb*.75+ob;break}}else{if((ya|0)==0?($a+3&127|0)==(ib|0):0){qb=ob;break}qb=jb*.25+ob}while(0);if((53-H|0)>1?!(+Dq(qb,1.0)!=0.0):0)rb=qb+1.0;else rb=qb}else rb=ob;jb=pb+rb-nb;do if((wa&2147483647|0)>(-2-k|0)){ya=!(+K(+jb)>=9007199254740992.0);va=_a+((ya^1)&1)|0;kb=ya?jb:jb*.5;if((va+50|0)<=(l|0)?!(rb!=0.0&(J&((H|0)!=(F|0)|ya))):0){sb=kb;tb=va;break}ya=Vq()|0;f[ya>>2]=34;sb=kb;tb=va}else{sb=jb;tb=_a}while(0);Aa=+sq(sb,tb)}while(0);u=i;return +Aa}function ob(a,c,d,e,g,i){a=a|0;c=+c;d=d|0;e=e|0;g=g|0;i=i|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0.0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0.0,C=0,D=0.0,E=0,F=0,G=0,H=0.0,J=0,K=0,L=0,M=0,N=0,O=0.0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0.0,ga=0.0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0;j=u;u=u+560|0;k=j+8|0;l=j;m=j+524|0;n=m;o=j+512|0;f[l>>2]=0;p=o+12|0;yo(c)|0;if((I|0)<0){q=-c;r=1;s=16605}else{q=c;r=(g&2049|0)!=0&1;s=(g&2048|0)==0?((g&1|0)==0?16606:16611):16608}yo(q)|0;do if(0==0&(I&2146435072|0)==2146435072){t=(i&32|0)!=0;v=r+3|0;Qk(a,32,d,v,g&-65537);Xo(a,s,r);Xo(a,q!=q|0.0!=0.0?(t?18555:16632):t?16624:16628,3);Qk(a,32,d,v,g^8192);w=v}else{c=+tq(q,l)*2.0;v=c!=0.0;if(v)f[l>>2]=(f[l>>2]|0)+-1;t=i|32;if((t|0)==97){x=i&32;y=(x|0)==0?s:s+9|0;z=r|2;A=12-e|0;do if(!(e>>>0>11|(A|0)==0)){B=8.0;C=A;do{C=C+-1|0;B=B*16.0}while((C|0)!=0);if((b[y>>0]|0)==45){D=-(B+(-c-B));break}else{D=c+B-B;break}}else D=c;while(0);A=f[l>>2]|0;C=(A|0)<0?0-A|0:A;E=Rj(C,((C|0)<0)<<31>>31,p)|0;if((E|0)==(p|0)){C=o+11|0;b[C>>0]=48;F=C}else F=E;b[F+-1>>0]=(A>>31&2)+43;A=F+-2|0;b[A>>0]=i+15;E=(e|0)<1;C=(g&8|0)==0;G=m;H=D;while(1){J=~~H;K=G+1|0;b[G>>0]=x|h[16636+J>>0];H=(H-+(J|0))*16.0;if((K-n|0)==1?!(C&(E&H==0.0)):0){b[K>>0]=46;L=G+2|0}else L=K;if(!(H!=0.0))break;else G=L}G=L;if((e|0)!=0?(-2-n+G|0)<(e|0):0){M=G-n|0;N=e+2|0}else{E=G-n|0;M=E;N=E}E=p-A|0;G=E+z+N|0;Qk(a,32,d,G,g);Xo(a,y,z);Qk(a,48,d,G,g^65536);Xo(a,m,M);Qk(a,48,N-M|0,0,0);Xo(a,A,E);Qk(a,32,d,G,g^8192);w=G;break}G=(e|0)<0?6:e;if(v){E=(f[l>>2]|0)+-28|0;f[l>>2]=E;O=c*268435456.0;P=E}else{O=c;P=f[l>>2]|0}E=(P|0)<0?k:k+288|0;C=E;H=O;do{x=~~H>>>0;f[C>>2]=x;C=C+4|0;H=(H-+(x>>>0))*1.0e9}while(H!=0.0);if((P|0)>0){v=E;A=C;z=P;while(1){y=(z|0)<29?z:29;x=A+-4|0;if(x>>>0>=v>>>0){K=x;x=0;do{J=Tn(f[K>>2]|0,0,y|0)|0;Q=Vn(J|0,I|0,x|0,0)|0;J=I;R=hn(Q|0,J|0,1e9,0)|0;f[K>>2]=R;x=jp(Q|0,J|0,1e9,0)|0;K=K+-4|0}while(K>>>0>=v>>>0);if(x){K=v+-4|0;f[K>>2]=x;S=K}else S=v}else S=v;K=A;while(1){if(K>>>0<=S>>>0)break;J=K+-4|0;if(!(f[J>>2]|0))K=J;else break}x=(f[l>>2]|0)-y|0;f[l>>2]=x;if((x|0)>0){v=S;A=K;z=x}else{T=S;U=K;V=x;break}}}else{T=E;U=C;V=P}if((V|0)<0){z=((G+25|0)/9|0)+1|0;A=(t|0)==102;v=T;x=U;J=V;while(1){Q=0-J|0;R=(Q|0)<9?Q:9;if(v>>>0<x>>>0){Q=(1<<R)+-1|0;W=1e9>>>R;Y=0;Z=v;do{_=f[Z>>2]|0;f[Z>>2]=(_>>>R)+Y;Y=X(_&Q,W)|0;Z=Z+4|0}while(Z>>>0<x>>>0);Z=(f[v>>2]|0)==0?v+4|0:v;if(!Y){$=Z;aa=x}else{f[x>>2]=Y;$=Z;aa=x+4|0}}else{$=(f[v>>2]|0)==0?v+4|0:v;aa=x}Z=A?E:$;W=(aa-Z>>2|0)>(z|0)?Z+(z<<2)|0:aa;J=(f[l>>2]|0)+R|0;f[l>>2]=J;if((J|0)>=0){ba=$;ca=W;break}else{v=$;x=W}}}else{ba=T;ca=U}x=E;if(ba>>>0<ca>>>0){v=(x-ba>>2)*9|0;J=f[ba>>2]|0;if(J>>>0<10)da=v;else{z=v;v=10;while(1){v=v*10|0;A=z+1|0;if(J>>>0<v>>>0){da=A;break}else z=A}}}else da=0;z=(t|0)==103;v=(G|0)!=0;J=G-((t|0)!=102?da:0)+((v&z)<<31>>31)|0;if((J|0)<(((ca-x>>2)*9|0)+-9|0)){A=J+9216|0;J=E+4+(((A|0)/9|0)+-1024<<2)|0;C=(A|0)%9|0;if((C|0)<8){A=C;C=10;while(1){W=C*10|0;if((A|0)<7){A=A+1|0;C=W}else{ea=W;break}}}else ea=10;C=f[J>>2]|0;A=(C>>>0)%(ea>>>0)|0;t=(J+4|0)==(ca|0);if(!(t&(A|0)==0)){B=(((C>>>0)/(ea>>>0)|0)&1|0)==0?9007199254740992.0:9007199254740994.0;W=(ea|0)/2|0;H=A>>>0<W>>>0?.5:t&(A|0)==(W|0)?1.0:1.5;if(!r){fa=H;ga=B}else{W=(b[s>>0]|0)==45;fa=W?-H:H;ga=W?-B:B}W=C-A|0;f[J>>2]=W;if(ga+fa!=ga){A=W+ea|0;f[J>>2]=A;if(A>>>0>999999999){A=ba;W=J;while(1){C=W+-4|0;f[W>>2]=0;if(C>>>0<A>>>0){t=A+-4|0;f[t>>2]=0;ha=t}else ha=A;t=(f[C>>2]|0)+1|0;f[C>>2]=t;if(t>>>0>999999999){A=ha;W=C}else{ia=ha;ja=C;break}}}else{ia=ba;ja=J}W=(x-ia>>2)*9|0;A=f[ia>>2]|0;if(A>>>0<10){ka=ja;la=W;ma=ia}else{C=W;W=10;while(1){W=W*10|0;t=C+1|0;if(A>>>0<W>>>0){ka=ja;la=t;ma=ia;break}else C=t}}}else{ka=J;la=da;ma=ba}}else{ka=J;la=da;ma=ba}C=ka+4|0;na=la;oa=ca>>>0>C>>>0?C:ca;pa=ma}else{na=da;oa=ca;pa=ba}C=oa;while(1){if(C>>>0<=pa>>>0){qa=0;break}W=C+-4|0;if(!(f[W>>2]|0))C=W;else{qa=1;break}}J=0-na|0;do if(z){W=G+((v^1)&1)|0;if((W|0)>(na|0)&(na|0)>-5){ra=i+-1|0;sa=W+-1-na|0}else{ra=i+-2|0;sa=W+-1|0}W=g&8;if(!W){if(qa?(A=f[C+-4>>2]|0,(A|0)!=0):0)if(!((A>>>0)%10|0)){t=0;Z=10;while(1){Z=Z*10|0;Q=t+1|0;if((A>>>0)%(Z>>>0)|0|0){ta=Q;break}else t=Q}}else ta=0;else ta=9;t=((C-x>>2)*9|0)+-9|0;if((ra|32|0)==102){Z=t-ta|0;A=(Z|0)>0?Z:0;ua=ra;va=(sa|0)<(A|0)?sa:A;wa=0;break}else{A=t+na-ta|0;t=(A|0)>0?A:0;ua=ra;va=(sa|0)<(t|0)?sa:t;wa=0;break}}else{ua=ra;va=sa;wa=W}}else{ua=i;va=G;wa=g&8}while(0);G=va|wa;x=(G|0)!=0&1;v=(ua|32|0)==102;if(v){xa=0;ya=(na|0)>0?na:0}else{z=(na|0)<0?J:na;t=Rj(z,((z|0)<0)<<31>>31,p)|0;z=p;if((z-t|0)<2){A=t;while(1){Z=A+-1|0;b[Z>>0]=48;if((z-Z|0)<2)A=Z;else{za=Z;break}}}else za=t;b[za+-1>>0]=(na>>31&2)+43;A=za+-2|0;b[A>>0]=ua;xa=A;ya=z-A|0}A=r+1+va+x+ya|0;Qk(a,32,d,A,g);Xo(a,s,r);Qk(a,48,d,A,g^65536);if(v){J=pa>>>0>E>>>0?E:pa;Z=m+9|0;R=Z;Y=m+8|0;Q=J;do{K=Rj(f[Q>>2]|0,0,Z)|0;if((Q|0)==(J|0))if((K|0)==(Z|0)){b[Y>>0]=48;Aa=Y}else Aa=K;else if(K>>>0>m>>>0){sj(m|0,48,K-n|0)|0;y=K;while(1){_=y+-1|0;if(_>>>0>m>>>0)y=_;else{Aa=_;break}}}else Aa=K;Xo(a,Aa,R-Aa|0);Q=Q+4|0}while(Q>>>0<=E>>>0);if(G|0)Xo(a,16652,1);if(Q>>>0<C>>>0&(va|0)>0){E=va;R=Q;while(1){Y=Rj(f[R>>2]|0,0,Z)|0;if(Y>>>0>m>>>0){sj(m|0,48,Y-n|0)|0;J=Y;while(1){v=J+-1|0;if(v>>>0>m>>>0)J=v;else{Ba=v;break}}}else Ba=Y;Xo(a,Ba,(E|0)<9?E:9);R=R+4|0;J=E+-9|0;if(!(R>>>0<C>>>0&(E|0)>9)){Ca=J;break}else E=J}}else Ca=va;Qk(a,48,Ca+9|0,9,0)}else{E=qa?C:pa+4|0;if((va|0)>-1){R=m+9|0;Z=(wa|0)==0;Q=R;G=0-n|0;J=m+8|0;K=va;v=pa;while(1){x=Rj(f[v>>2]|0,0,R)|0;if((x|0)==(R|0)){b[J>>0]=48;Da=J}else Da=x;do if((v|0)==(pa|0)){x=Da+1|0;Xo(a,Da,1);if(Z&(K|0)<1){Ea=x;break}Xo(a,16652,1);Ea=x}else{if(Da>>>0<=m>>>0){Ea=Da;break}sj(m|0,48,Da+G|0)|0;x=Da;while(1){z=x+-1|0;if(z>>>0>m>>>0)x=z;else{Ea=z;break}}}while(0);Y=Q-Ea|0;Xo(a,Ea,(K|0)>(Y|0)?Y:K);x=K-Y|0;v=v+4|0;if(!(v>>>0<E>>>0&(x|0)>-1)){Fa=x;break}else K=x}}else Fa=va;Qk(a,48,Fa+18|0,18,0);Xo(a,xa,p-xa|0)}Qk(a,32,d,A,g^8192);w=A}while(0);u=j;return ((w|0)<(d|0)?d:w)|0}function pb(a){a=a|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0;c=u;u=u+64|0;d=c+56|0;e=c+52|0;g=c+48|0;h=c+60|0;i=c;j=c+44|0;k=c+40|0;l=c+36|0;m=c+32|0;n=c+28|0;o=c+24|0;p=c+20|0;q=c+16|0;r=c+12|0;if(!(b[a+288>>0]|0)){_e(d,f[a+8>>2]|0);s=a+12|0;t=f[d>>2]|0;f[d>>2]=0;v=f[s>>2]|0;f[s>>2]=t;if(v){Ii(v);Oq(v);v=f[d>>2]|0;f[d>>2]=0;if(v|0){Ii(v);Oq(v)}}else f[d>>2]=0}else{fh(d,f[a+8>>2]|0);v=a+12|0;t=f[d>>2]|0;f[d>>2]=0;s=f[v>>2]|0;f[v>>2]=t;if(s){Ii(s);Oq(s);s=f[d>>2]|0;f[d>>2]=0;if(s|0){Ii(s);Oq(s)}}else f[d>>2]=0}s=a+12|0;t=f[s>>2]|0;if(!t){w=0;u=c;return w|0}if((((f[t+4>>2]|0)-(f[t>>2]|0)>>2>>>0)/3|0|0)==(f[t+40>>2]|0)){w=0;u=c;return w|0}v=a+200|0;f[a+264>>2]=a;x=a+4|0;ci(((f[t+28>>2]|0)-(f[t+24>>2]|0)>>2)-(f[t+44>>2]|0)|0,f[(f[x>>2]|0)+44>>2]|0)|0;t=f[s>>2]|0;ci((((f[t+4>>2]|0)-(f[t>>2]|0)>>2>>>0)/3|0)-(f[t+40>>2]|0)|0,f[(f[x>>2]|0)+44>>2]|0)|0;t=a+28|0;y=a+8|0;z=f[y>>2]|0;A=((f[z+100>>2]|0)-(f[z+96>>2]|0)|0)/12|0;b[d>>0]=0;qh(t,A,d);A=f[s>>2]|0;z=(f[A+28>>2]|0)-(f[A+24>>2]|0)>>2;f[d>>2]=-1;hg(a+52|0,z,d);z=a+40|0;A=f[z>>2]|0;B=a+44|0;C=f[B>>2]|0;if((C|0)!=(A|0))f[B>>2]=C+(~((C+-4-A|0)>>>2)<<2);A=f[s>>2]|0;C=(f[A+4>>2]|0)-(f[A>>2]|0)>>2;gk(z,C-((C>>>0)%3|0)|0);C=a+84|0;z=f[s>>2]|0;A=(f[z+28>>2]|0)-(f[z+24>>2]|0)>>2;b[d>>0]=0;qh(C,A,d);A=a+96|0;z=f[A>>2]|0;B=a+100|0;D=f[B>>2]|0;if((D|0)!=(z|0))f[B>>2]=D+(~((D+-4-z|0)>>>2)<<2);f[a+164>>2]=-1;z=a+168|0;f[z>>2]=0;D=f[a+108>>2]|0;E=a+112|0;F=f[E>>2]|0;if((F|0)!=(D|0))f[E>>2]=F+(~(((F+-12-D|0)>>>0)/12|0)*12|0);D=a+132|0;if(f[D>>2]|0){F=a+128|0;E=f[F>>2]|0;if(E|0){G=E;do{E=G;G=f[G>>2]|0;Oq(E)}while((G|0)!=0)}f[F>>2]=0;F=f[a+124>>2]|0;if(F|0){G=a+120|0;E=0;do{f[(f[G>>2]|0)+(E<<2)>>2]=0;E=E+1|0}while((E|0)!=(F|0))}f[D>>2]=0}f[a+144>>2]=0;D=f[s>>2]|0;F=(f[D+28>>2]|0)-(f[D+24>>2]|0)>>2;f[d>>2]=-1;hg(a+152|0,F,d);F=a+72|0;D=f[F>>2]|0;E=a+76|0;G=f[E>>2]|0;if((G|0)!=(D|0))f[E>>2]=G+(~((G+-4-D|0)>>>2)<<2);D=f[s>>2]|0;gk(F,((f[D+4>>2]|0)-(f[D>>2]|0)>>2>>>0)/3|0);f[a+64>>2]=0;if(!(Be(a)|0)){w=0;u=c;return w|0}if(!(Hg(a)|0)){w=0;u=c;return w|0}D=a+172|0;G=a+176|0;H=(((f[G>>2]|0)-(f[D>>2]|0)|0)/136|0)&255;b[h>>0]=H;I=f[(f[x>>2]|0)+44>>2]|0;J=I+16|0;K=f[J+4>>2]|0;if((K|0)>0|(K|0)==0&(f[J>>2]|0)>>>0>0)L=H;else{f[e>>2]=f[I+4>>2];f[d>>2]=f[e>>2];Me(I,d,h,h+1|0)|0;L=b[h>>0]|0}h=a+284|0;f[h>>2]=L&255;L=f[s>>2]|0;I=(f[L+4>>2]|0)-(f[L>>2]|0)|0;L=I>>2;dj(v);f[i>>2]=0;H=i+4|0;f[H>>2]=0;f[i+8>>2]=0;a:do if((I|0)>0){J=a+104|0;K=i+8|0;M=0;b:while(1){N=(M>>>0)/3|0;O=N>>>5;P=1<<(N&31);if((f[(f[t>>2]|0)+(O<<2)>>2]&P|0)==0?(Q=f[s>>2]|0,f[j>>2]=N,f[d>>2]=f[j>>2],!(_j(Q,d)|0)):0){f[e>>2]=0;f[k>>2]=N;f[d>>2]=f[k>>2];N=xg(a,d,e)|0;fj(v,N);Q=f[e>>2]|0;R=(Q|0)==-1;do if(N){do if(R){S=-1;T=-1;U=-1}else{V=f[f[s>>2]>>2]|0;W=f[V+(Q<<2)>>2]|0;X=Q+1|0;Y=((X>>>0)%3|0|0)==0?Q+-2|0:X;if((Y|0)==-1)Z=-1;else Z=f[V+(Y<<2)>>2]|0;Y=(((Q>>>0)%3|0|0)==0?2:-1)+Q|0;if((Y|0)==-1){S=W;T=-1;U=Z;break}S=W;T=f[V+(Y<<2)>>2]|0;U=Z}while(0);Y=f[C>>2]|0;V=Y+(S>>>5<<2)|0;f[V>>2]=f[V>>2]|1<<(S&31);V=Y+(U>>>5<<2)|0;f[V>>2]=f[V>>2]|1<<(U&31);V=Y+(T>>>5<<2)|0;f[V>>2]=f[V>>2]|1<<(T&31);f[d>>2]=1;V=f[B>>2]|0;if(V>>>0<(f[J>>2]|0)>>>0){f[V>>2]=1;f[B>>2]=V+4}else Ri(A,d);V=(f[t>>2]|0)+(O<<2)|0;f[V>>2]=f[V>>2]|P;V=Q+1|0;if(R)_=-1;else _=((V>>>0)%3|0|0)==0?Q+-2|0:V;f[d>>2]=_;Y=f[H>>2]|0;if(Y>>>0<(f[K>>2]|0)>>>0){f[Y>>2]=_;f[H>>2]=Y+4}else Ri(i,d);if(R)break;Y=((V>>>0)%3|0|0)==0?Q+-2|0:V;if((Y|0)==-1)break;V=f[(f[(f[s>>2]|0)+12>>2]|0)+(Y<<2)>>2]|0;Y=(V|0)==-1;W=Y?-1:(V>>>0)/3|0;if(Y)break;if(f[(f[t>>2]|0)+(W>>>5<<2)>>2]&1<<(W&31)|0)break;f[l>>2]=V;f[d>>2]=f[l>>2];if(!(kc(a,d)|0))break b}else{V=Q+1|0;if(R)$=-1;else $=((V>>>0)%3|0|0)==0?Q+-2|0:V;f[m>>2]=$;f[d>>2]=f[m>>2];Pe(a,d,1)|0;f[n>>2]=f[e>>2];f[d>>2]=f[n>>2];if(!(kc(a,d)|0))break b}while(0)}M=M+1|0;if((M|0)>=(L|0)){aa=62;break a}}ba=0}else aa=62;while(0);if((aa|0)==62){aa=f[F>>2]|0;L=f[E>>2]|0;n=L;if((aa|0)!=(L|0)?(m=L+-4|0,aa>>>0<m>>>0):0){L=aa;aa=m;do{m=f[L>>2]|0;f[L>>2]=f[aa>>2];f[aa>>2]=m;L=L+4|0;aa=aa+-4|0}while(L>>>0<aa>>>0)}f[o>>2]=n;f[p>>2]=f[i>>2];f[q>>2]=f[H>>2];f[g>>2]=f[o>>2];f[e>>2]=f[p>>2];f[d>>2]=f[q>>2];Yd(F,g,e,d)|0;if((f[G>>2]|0)!=(f[D>>2]|0)?(D=f[y>>2]|0,y=((f[D+100>>2]|0)-(f[D+96>>2]|0)|0)/12|0,b[d>>0]=0,qh(t,y,d),y=f[F>>2]|0,F=f[E>>2]|0,(y|0)!=(F|0)):0){E=y;do{f[r>>2]=f[E>>2];f[d>>2]=f[r>>2];He(a,d)|0;E=E+4|0}while((E|0)!=(F|0))}th(v);F=a+232|0;ld(v,F);v=a+280|0;E=f[v>>2]|0;if((E|0?(f[h>>2]|0)>0:0)?(ld(E,F),(f[h>>2]|0)>1):0){E=1;do{ld((f[v>>2]|0)+(E<<5)|0,F);E=E+1|0}while((E|0)<(f[h>>2]|0))}ci((f[a+272>>2]|0)-(f[a+268>>2]|0)>>2,f[(f[x>>2]|0)+44>>2]|0)|0;ci(f[z>>2]|0,f[(f[x>>2]|0)+44>>2]|0)|0;if(bh(a)|0){z=f[(f[x>>2]|0)+44>>2]|0;x=f[F>>2]|0;F=z+16|0;h=f[F+4>>2]|0;if(!((h|0)>0|(h|0)==0&(f[F>>2]|0)>>>0>0)){F=(f[a+236>>2]|0)-x|0;f[e>>2]=f[z+4>>2];f[d>>2]=f[e>>2];Me(z,d,x,x+F|0)|0}ba=1}else ba=0}F=f[i>>2]|0;if(F|0){i=f[H>>2]|0;if((i|0)!=(F|0))f[H>>2]=i+(~((i+-4-F|0)>>>2)<<2);Oq(F)}w=ba;u=c;return w|0}function qb(a,c,e,g,h){a=a|0;c=c|0;e=e|0;g=g|0;h=h|0;var i=0,j=0,k=0,l=0,m=0,n=0,o=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0;i=u;u=u+64|0;j=i+16|0;k=i;l=i+24|0;m=i+8|0;n=i+20|0;f[j>>2]=c;c=(a|0)!=0;o=l+40|0;q=o;r=l+39|0;l=m+4|0;s=0;t=0;v=0;a:while(1){do if((t|0)>-1)if((s|0)>(2147483647-t|0)){w=Vq()|0;f[w>>2]=75;x=-1;break}else{x=s+t|0;break}else x=t;while(0);w=f[j>>2]|0;y=b[w>>0]|0;if(!(y<<24>>24)){z=88;break}else{A=y;B=w}b:while(1){switch(A<<24>>24){case 37:{C=B;D=B;z=9;break b;break}case 0:{E=B;break b;break}default:{}}y=B+1|0;f[j>>2]=y;A=b[y>>0]|0;B=y}c:do if((z|0)==9)while(1){z=0;if((b[D+1>>0]|0)!=37){E=C;break c}y=C+1|0;D=D+2|0;f[j>>2]=D;if((b[D>>0]|0)!=37){E=y;break}else{C=y;z=9}}while(0);y=E-w|0;if(c)Xo(a,w,y);if(y|0){s=y;t=x;continue}y=(Aq(b[(f[j>>2]|0)+1>>0]|0)|0)==0;F=f[j>>2]|0;if(!y?(b[F+2>>0]|0)==36:0){G=(b[F+1>>0]|0)+-48|0;H=1;J=3}else{G=-1;H=v;J=1}y=F+J|0;f[j>>2]=y;F=b[y>>0]|0;K=(F<<24>>24)+-32|0;if(K>>>0>31|(1<<K&75913|0)==0){L=0;M=F;N=y}else{K=0;O=F;F=y;while(1){y=1<<(O<<24>>24)+-32|K;P=F+1|0;f[j>>2]=P;Q=b[P>>0]|0;R=(Q<<24>>24)+-32|0;if(R>>>0>31|(1<<R&75913|0)==0){L=y;M=Q;N=P;break}else{K=y;O=Q;F=P}}}if(M<<24>>24==42){if((Aq(b[N+1>>0]|0)|0)!=0?(F=f[j>>2]|0,(b[F+2>>0]|0)==36):0){O=F+1|0;f[h+((b[O>>0]|0)+-48<<2)>>2]=10;S=f[g+((b[O>>0]|0)+-48<<3)>>2]|0;T=1;U=F+3|0}else{if(H|0){V=-1;break}if(c){F=(f[e>>2]|0)+(4-1)&~(4-1);O=f[F>>2]|0;f[e>>2]=F+4;W=O}else W=0;S=W;T=0;U=(f[j>>2]|0)+1|0}f[j>>2]=U;O=(S|0)<0;X=O?0-S|0:S;Y=O?L|8192:L;Z=T;_=U}else{O=Ll(j)|0;if((O|0)<0){V=-1;break}X=O;Y=L;Z=H;_=f[j>>2]|0}do if((b[_>>0]|0)==46){if((b[_+1>>0]|0)!=42){f[j>>2]=_+1;O=Ll(j)|0;$=O;aa=f[j>>2]|0;break}if(Aq(b[_+2>>0]|0)|0?(O=f[j>>2]|0,(b[O+3>>0]|0)==36):0){F=O+2|0;f[h+((b[F>>0]|0)+-48<<2)>>2]=10;K=f[g+((b[F>>0]|0)+-48<<3)>>2]|0;F=O+4|0;f[j>>2]=F;$=K;aa=F;break}if(Z|0){V=-1;break a}if(c){F=(f[e>>2]|0)+(4-1)&~(4-1);K=f[F>>2]|0;f[e>>2]=F+4;ba=K}else ba=0;K=(f[j>>2]|0)+2|0;f[j>>2]=K;$=ba;aa=K}else{$=-1;aa=_}while(0);K=0;F=aa;while(1){if(((b[F>>0]|0)+-65|0)>>>0>57){V=-1;break a}O=F;F=F+1|0;f[j>>2]=F;ca=b[(b[O>>0]|0)+-65+(16124+(K*58|0))>>0]|0;da=ca&255;if((da+-1|0)>>>0>=8)break;else K=da}if(!(ca<<24>>24)){V=-1;break}O=(G|0)>-1;do if(ca<<24>>24==19)if(O){V=-1;break a}else z=50;else{if(O){f[h+(G<<2)>>2]=da;P=g+(G<<3)|0;Q=f[P+4>>2]|0;y=k;f[y>>2]=f[P>>2];f[y+4>>2]=Q;z=50;break}if(!c){V=0;break a}We(k,da,e);ea=f[j>>2]|0}while(0);if((z|0)==50){z=0;if(c)ea=F;else{s=0;t=x;v=Z;continue}}O=b[ea+-1>>0]|0;Q=(K|0)!=0&(O&15|0)==3?O&-33:O;O=Y&-65537;y=(Y&8192|0)==0?Y:O;d:do switch(Q|0){case 110:{switch((K&255)<<24>>24){case 0:{f[f[k>>2]>>2]=x;s=0;t=x;v=Z;continue a;break}case 1:{f[f[k>>2]>>2]=x;s=0;t=x;v=Z;continue a;break}case 2:{P=f[k>>2]|0;f[P>>2]=x;f[P+4>>2]=((x|0)<0)<<31>>31;s=0;t=x;v=Z;continue a;break}case 3:{d[f[k>>2]>>1]=x;s=0;t=x;v=Z;continue a;break}case 4:{b[f[k>>2]>>0]=x;s=0;t=x;v=Z;continue a;break}case 6:{f[f[k>>2]>>2]=x;s=0;t=x;v=Z;continue a;break}case 7:{P=f[k>>2]|0;f[P>>2]=x;f[P+4>>2]=((x|0)<0)<<31>>31;s=0;t=x;v=Z;continue a;break}default:{s=0;t=x;v=Z;continue a}}break}case 112:{fa=120;ga=$>>>0>8?$:8;ha=y|8;z=62;break}case 88:case 120:{fa=Q;ga=$;ha=y;z=62;break}case 111:{P=k;R=f[P>>2]|0;ia=f[P+4>>2]|0;P=Ol(R,ia,o)|0;ja=q-P|0;ka=P;la=0;ma=16588;na=(y&8|0)==0|($|0)>(ja|0)?$:ja+1|0;oa=y;pa=R;qa=ia;z=68;break}case 105:case 100:{ia=k;R=f[ia>>2]|0;ja=f[ia+4>>2]|0;if((ja|0)<0){ia=Xn(0,0,R|0,ja|0)|0;P=I;ra=k;f[ra>>2]=ia;f[ra+4>>2]=P;sa=1;ta=16588;ua=ia;va=P;z=67;break d}else{sa=(y&2049|0)!=0&1;ta=(y&2048|0)==0?((y&1|0)==0?16588:16590):16589;ua=R;va=ja;z=67;break d}break}case 117:{ja=k;sa=0;ta=16588;ua=f[ja>>2]|0;va=f[ja+4>>2]|0;z=67;break}case 99:{b[r>>0]=f[k>>2];wa=r;xa=0;ya=16588;za=o;Aa=1;Ba=O;break}case 109:{ja=Vq()|0;Ca=$o(f[ja>>2]|0)|0;z=72;break}case 115:{ja=f[k>>2]|0;Ca=ja|0?ja:16598;z=72;break}case 67:{f[m>>2]=f[k>>2];f[l>>2]=0;f[k>>2]=m;Da=-1;Ea=m;z=76;break}case 83:{ja=f[k>>2]|0;if(!$){Qk(a,32,X,0,y);Fa=0;z=85}else{Da=$;Ea=ja;z=76}break}case 65:case 71:case 70:case 69:case 97:case 103:case 102:case 101:{s=ob(a,+p[k>>3],X,$,y,Q)|0;t=x;v=Z;continue a;break}default:{wa=w;xa=0;ya=16588;za=o;Aa=$;Ba=y}}while(0);e:do if((z|0)==62){z=0;w=k;Q=f[w>>2]|0;K=f[w+4>>2]|0;w=ul(Q,K,o,fa&32)|0;F=(ha&8|0)==0|(Q|0)==0&(K|0)==0;ka=w;la=F?0:2;ma=F?16588:16588+(fa>>4)|0;na=ga;oa=ha;pa=Q;qa=K;z=68}else if((z|0)==67){z=0;ka=Rj(ua,va,o)|0;la=sa;ma=ta;na=$;oa=y;pa=ua;qa=va;z=68}else if((z|0)==72){z=0;K=tg(Ca,0,$)|0;Q=(K|0)==0;wa=Ca;xa=0;ya=16588;za=Q?Ca+$|0:K;Aa=Q?$:K-Ca|0;Ba=O}else if((z|0)==76){z=0;K=Ea;Q=0;F=0;while(1){w=f[K>>2]|0;if(!w){Ga=Q;Ha=F;break}ja=Po(n,w)|0;if((ja|0)<0|ja>>>0>(Da-Q|0)>>>0){Ga=Q;Ha=ja;break}w=ja+Q|0;if(Da>>>0>w>>>0){K=K+4|0;Q=w;F=ja}else{Ga=w;Ha=ja;break}}if((Ha|0)<0){V=-1;break a}Qk(a,32,X,Ga,y);if(!Ga){Fa=0;z=85}else{F=Ea;Q=0;while(1){K=f[F>>2]|0;if(!K){Fa=Ga;z=85;break e}ja=Po(n,K)|0;Q=ja+Q|0;if((Q|0)>(Ga|0)){Fa=Ga;z=85;break e}Xo(a,n,ja);if(Q>>>0>=Ga>>>0){Fa=Ga;z=85;break}else F=F+4|0}}}while(0);if((z|0)==68){z=0;O=(pa|0)!=0|(qa|0)!=0;F=(na|0)!=0|O;Q=q-ka+((O^1)&1)|0;wa=F?ka:o;xa=la;ya=ma;za=o;Aa=F?((na|0)>(Q|0)?na:Q):na;Ba=(na|0)>-1?oa&-65537:oa}else if((z|0)==85){z=0;Qk(a,32,X,Fa,y^8192);s=(X|0)>(Fa|0)?X:Fa;t=x;v=Z;continue}Q=za-wa|0;F=(Aa|0)<(Q|0)?Q:Aa;O=F+xa|0;ja=(X|0)<(O|0)?O:X;Qk(a,32,ja,O,Ba);Xo(a,ya,xa);Qk(a,48,ja,O,Ba^65536);Qk(a,48,F,Q,0);Xo(a,wa,Q);Qk(a,32,ja,O,Ba^8192);s=ja;t=x;v=Z}f:do if((z|0)==88)if(!a)if(v){Z=1;while(1){t=f[h+(Z<<2)>>2]|0;if(!t){Ia=Z;break}We(g+(Z<<3)|0,t,e);t=Z+1|0;if((Z|0)<9)Z=t;else{Ia=t;break}}if((Ia|0)<10){Z=Ia;while(1){if(f[h+(Z<<2)>>2]|0){V=-1;break f}if((Z|0)<9)Z=Z+1|0;else{V=1;break}}}else V=1}else V=0;else V=x;while(0);u=i;return V|0}function rb(a){a=a|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0;c=u;u=u+64|0;d=c+56|0;e=c+52|0;g=c+48|0;h=c+60|0;i=c;j=c+44|0;k=c+40|0;l=c+36|0;m=c+32|0;n=c+28|0;o=c+24|0;p=c+20|0;q=c+16|0;r=c+12|0;if(!(b[a+352>>0]|0)){_e(d,f[a+8>>2]|0);s=a+12|0;t=f[d>>2]|0;f[d>>2]=0;v=f[s>>2]|0;f[s>>2]=t;if(v){Ii(v);Oq(v);v=f[d>>2]|0;f[d>>2]=0;if(v|0){Ii(v);Oq(v)}}else f[d>>2]=0}else{fh(d,f[a+8>>2]|0);v=a+12|0;t=f[d>>2]|0;f[d>>2]=0;s=f[v>>2]|0;f[v>>2]=t;if(s){Ii(s);Oq(s);s=f[d>>2]|0;f[d>>2]=0;if(s|0){Ii(s);Oq(s)}}else f[d>>2]=0}s=a+12|0;t=f[s>>2]|0;if(!t){w=0;u=c;return w|0}if((((f[t+4>>2]|0)-(f[t>>2]|0)>>2>>>0)/3|0|0)==(f[t+40>>2]|0)){w=0;u=c;return w|0}t=a+200|0;ve(t,a)|0;v=f[s>>2]|0;x=a+4|0;ci(((f[v+28>>2]|0)-(f[v+24>>2]|0)>>2)-(f[v+44>>2]|0)|0,f[(f[x>>2]|0)+44>>2]|0)|0;v=f[s>>2]|0;ci((((f[v+4>>2]|0)-(f[v>>2]|0)>>2>>>0)/3|0)-(f[v+40>>2]|0)|0,f[(f[x>>2]|0)+44>>2]|0)|0;v=a+28|0;y=a+8|0;z=f[y>>2]|0;A=((f[z+100>>2]|0)-(f[z+96>>2]|0)|0)/12|0;b[d>>0]=0;qh(v,A,d);A=f[s>>2]|0;z=(f[A+28>>2]|0)-(f[A+24>>2]|0)>>2;f[d>>2]=-1;hg(a+52|0,z,d);z=a+40|0;A=f[z>>2]|0;B=a+44|0;C=f[B>>2]|0;if((C|0)!=(A|0))f[B>>2]=C+(~((C+-4-A|0)>>>2)<<2);A=f[s>>2]|0;C=(f[A+4>>2]|0)-(f[A>>2]|0)>>2;gk(z,C-((C>>>0)%3|0)|0);C=a+84|0;z=f[s>>2]|0;A=(f[z+28>>2]|0)-(f[z+24>>2]|0)>>2;b[d>>0]=0;qh(C,A,d);A=a+96|0;z=f[A>>2]|0;B=a+100|0;D=f[B>>2]|0;if((D|0)!=(z|0))f[B>>2]=D+(~((D+-4-z|0)>>>2)<<2);f[a+164>>2]=-1;z=a+168|0;f[z>>2]=0;D=f[a+108>>2]|0;E=a+112|0;F=f[E>>2]|0;if((F|0)!=(D|0))f[E>>2]=F+(~(((F+-12-D|0)>>>0)/12|0)*12|0);D=a+132|0;if(f[D>>2]|0){F=a+128|0;E=f[F>>2]|0;if(E|0){G=E;do{E=G;G=f[G>>2]|0;Oq(E)}while((G|0)!=0)}f[F>>2]=0;F=f[a+124>>2]|0;if(F|0){G=a+120|0;E=0;do{f[(f[G>>2]|0)+(E<<2)>>2]=0;E=E+1|0}while((E|0)!=(F|0))}f[D>>2]=0}f[a+144>>2]=0;D=f[s>>2]|0;F=(f[D+28>>2]|0)-(f[D+24>>2]|0)>>2;f[d>>2]=-1;hg(a+152|0,F,d);F=a+72|0;D=f[F>>2]|0;E=a+76|0;G=f[E>>2]|0;if((G|0)!=(D|0))f[E>>2]=G+(~((G+-4-D|0)>>>2)<<2);D=f[s>>2]|0;gk(F,((f[D+4>>2]|0)-(f[D>>2]|0)>>2>>>0)/3|0);f[a+64>>2]=0;if(!(Be(a)|0)){w=0;u=c;return w|0}if(!(Dg(a)|0)){w=0;u=c;return w|0}D=a+172|0;G=a+176|0;H=(((f[G>>2]|0)-(f[D>>2]|0)|0)/136|0)&255;b[h>>0]=H;I=f[(f[x>>2]|0)+44>>2]|0;J=I+16|0;K=f[J+4>>2]|0;if((K|0)>0|(K|0)==0&(f[J>>2]|0)>>>0>0)L=H;else{f[e>>2]=f[I+4>>2];f[d>>2]=f[e>>2];Me(I,d,h,h+1|0)|0;L=b[h>>0]|0}f[a+284>>2]=L&255;L=f[s>>2]|0;h=(f[L+4>>2]|0)-(f[L>>2]|0)|0;L=h>>2;dj(t);f[i>>2]=0;I=i+4|0;f[I>>2]=0;f[i+8>>2]=0;a:do if((h|0)>0){H=a+104|0;J=i+8|0;K=0;b:while(1){M=(K>>>0)/3|0;N=M>>>5;O=1<<(M&31);if((f[(f[v>>2]|0)+(N<<2)>>2]&O|0)==0?(P=f[s>>2]|0,f[j>>2]=M,f[d>>2]=f[j>>2],!(_j(P,d)|0)):0){f[e>>2]=0;f[k>>2]=M;f[d>>2]=f[k>>2];M=xg(a,d,e)|0;fj(t,M);P=f[e>>2]|0;Q=(P|0)==-1;do if(M){do if(Q){R=-1;S=-1;T=-1}else{U=f[f[s>>2]>>2]|0;V=f[U+(P<<2)>>2]|0;W=P+1|0;X=((W>>>0)%3|0|0)==0?P+-2|0:W;if((X|0)==-1)Y=-1;else Y=f[U+(X<<2)>>2]|0;X=(((P>>>0)%3|0|0)==0?2:-1)+P|0;if((X|0)==-1){R=-1;S=Y;T=V;break}R=f[U+(X<<2)>>2]|0;S=Y;T=V}while(0);V=f[C>>2]|0;X=V+(T>>>5<<2)|0;f[X>>2]=f[X>>2]|1<<(T&31);X=V+(S>>>5<<2)|0;f[X>>2]=f[X>>2]|1<<(S&31);X=V+(R>>>5<<2)|0;f[X>>2]=f[X>>2]|1<<(R&31);f[d>>2]=1;X=f[B>>2]|0;if(X>>>0<(f[H>>2]|0)>>>0){f[X>>2]=1;f[B>>2]=X+4}else Ri(A,d);X=(f[v>>2]|0)+(N<<2)|0;f[X>>2]=f[X>>2]|O;X=P+1|0;if(Q)Z=-1;else Z=((X>>>0)%3|0|0)==0?P+-2|0:X;f[d>>2]=Z;V=f[I>>2]|0;if(V>>>0<(f[J>>2]|0)>>>0){f[V>>2]=Z;f[I>>2]=V+4}else Ri(i,d);if(Q)break;V=((X>>>0)%3|0|0)==0?P+-2|0:X;if((V|0)==-1)break;X=f[(f[(f[s>>2]|0)+12>>2]|0)+(V<<2)>>2]|0;V=(X|0)==-1;U=V?-1:(X>>>0)/3|0;if(V)break;if(f[(f[v>>2]|0)+(U>>>5<<2)>>2]&1<<(U&31)|0)break;f[l>>2]=X;f[d>>2]=f[l>>2];if(!(Yb(a,d)|0))break b}else{X=P+1|0;if(Q)_=-1;else _=((X>>>0)%3|0|0)==0?P+-2|0:X;f[m>>2]=_;f[d>>2]=f[m>>2];Pe(a,d,1)|0;f[n>>2]=f[e>>2];f[d>>2]=f[n>>2];if(!(Yb(a,d)|0))break b}while(0)}K=K+1|0;if((K|0)>=(L|0)){$=62;break a}}aa=0}else $=62;while(0);if(($|0)==62){$=f[F>>2]|0;L=f[E>>2]|0;n=L;if(($|0)!=(L|0)?(m=L+-4|0,$>>>0<m>>>0):0){L=$;$=m;do{m=f[L>>2]|0;f[L>>2]=f[$>>2];f[$>>2]=m;L=L+4|0;$=$+-4|0}while(L>>>0<$>>>0)}f[o>>2]=n;f[p>>2]=f[i>>2];f[q>>2]=f[I>>2];f[g>>2]=f[o>>2];f[e>>2]=f[p>>2];f[d>>2]=f[q>>2];Yd(F,g,e,d)|0;if((f[G>>2]|0)!=(f[D>>2]|0)?(D=f[y>>2]|0,y=((f[D+100>>2]|0)-(f[D+96>>2]|0)|0)/12|0,b[d>>0]=0,qh(v,y,d),y=f[F>>2]|0,F=f[E>>2]|0,(y|0)!=(F|0)):0){E=y;do{f[r>>2]=f[E>>2];f[d>>2]=f[r>>2];He(a,d)|0;E=E+4|0}while((E|0)!=(F|0))}pi(t);ci(f[a+324>>2]|0,f[(f[x>>2]|0)+44>>2]|0)|0;ci(f[z>>2]|0,f[(f[x>>2]|0)+44>>2]|0)|0;if(bh(a)|0){z=f[(f[x>>2]|0)+44>>2]|0;x=f[a+232>>2]|0;t=z+16|0;F=f[t+4>>2]|0;if(!((F|0)>0|(F|0)==0&(f[t>>2]|0)>>>0>0)){t=(f[a+236>>2]|0)-x|0;f[e>>2]=f[z+4>>2];f[d>>2]=f[e>>2];Me(z,d,x,x+t|0)|0}aa=1}else aa=0}t=f[i>>2]|0;if(t|0){i=f[I>>2]|0;if((i|0)!=(t|0))f[I>>2]=i+(~((i+-4-t|0)>>>2)<<2);Oq(t)}w=aa;u=c;return w|0}function sb(a){a=a|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,X=0,Y=0,Z=0,_=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=Oa,ma=Oa,na=Oa,oa=0,pa=0,qa=0,ra=0,sa=0;c=u;u=u+64|0;d=c+28|0;e=c+16|0;g=c+4|0;h=c;i=a;j=a+80|0;k=f[j>>2]|0;f[d>>2]=0;f[d+4>>2]=0;f[d+8>>2]=0;f[d+12>>2]=0;f[d+16>>2]=i;l=d+20|0;n[l>>2]=$(1.0);f[d+24>>2]=i;Ih(d,k);k=f[j>>2]|0;f[e>>2]=0;i=e+4|0;f[i>>2]=0;f[e+8>>2]=0;m=(k|0)==0;do if(!m)if(k>>>0>1073741823)aq(e);else{o=k<<2;p=ln(o)|0;f[e>>2]=p;q=p+(k<<2)|0;f[e+8>>2]=q;sj(p|0,0,o|0)|0;f[i>>2]=q;break}while(0);f[g>>2]=0;k=g+4|0;f[k>>2]=0;f[g+8>>2]=0;f[h>>2]=0;if(!m){m=d+16|0;q=d+4|0;o=d+12|0;p=d+8|0;r=g+8|0;s=d+24|0;t=0;v=0;while(1){w=f[m>>2]|0;x=f[w+8>>2]|0;y=(f[w+12>>2]|0)-x|0;w=(y|0)>0;z=x;if(w){x=y>>>2;A=0;B=0;while(1){C=f[z+(A<<2)>>2]|0;if(!(b[C+84>>0]|0))D=f[(f[C+68>>2]|0)+(v<<2)>>2]|0;else D=v;C=D+239^B;A=A+1|0;if((A|0)>=(x|0)){E=C;break}else B=C}}else E=0;B=f[q>>2]|0;x=(B|0)==0;a:do if(!x){A=B+-1|0;C=(A&B|0)==0;if(!C)if(E>>>0<B>>>0)F=E;else F=(E>>>0)%(B>>>0)|0;else F=A&E;G=f[(f[d>>2]|0)+(F<<2)>>2]|0;if((G|0)!=0?(H=f[G>>2]|0,(H|0)!=0):0){G=f[s>>2]|0;I=G+8|0;J=G+12|0;b:do if(C){G=H;while(1){K=f[G+4>>2]|0;L=(K|0)==(E|0);if(!(L|(K&A|0)==(F|0))){M=44;break a}c:do if(L){K=f[G+8>>2]|0;N=f[I>>2]|0;O=(f[J>>2]|0)-N|0;P=N;if((O|0)<=0){Q=G;break b}N=O>>>2;O=0;while(1){R=f[P+(O<<2)>>2]|0;if(!(b[R+84>>0]|0)){S=f[R+68>>2]|0;T=f[S+(v<<2)>>2]|0;U=f[S+(K<<2)>>2]|0}else{T=v;U=K}O=O+1|0;if((U|0)!=(T|0))break c;if((O|0)>=(N|0)){V=G;M=42;break b}}}while(0);G=f[G>>2]|0;if(!G){M=44;break a}}}else{G=H;while(1){L=f[G+4>>2]|0;d:do if((L|0)!=(E|0)){if(L>>>0<B>>>0)X=L;else X=(L>>>0)%(B>>>0)|0;if((X|0)!=(F|0)){M=44;break a}}else{N=f[G+8>>2]|0;O=f[I>>2]|0;K=(f[J>>2]|0)-O|0;P=O;if((K|0)<=0){Q=G;break b}O=K>>>2;K=0;while(1){S=f[P+(K<<2)>>2]|0;if(!(b[S+84>>0]|0)){R=f[S+68>>2]|0;Y=f[R+(v<<2)>>2]|0;Z=f[R+(N<<2)>>2]|0}else{Y=v;Z=N}K=K+1|0;if((Z|0)!=(Y|0))break d;if((K|0)>=(O|0)){V=G;M=42;break b}}}while(0);G=f[G>>2]|0;if(!G){M=44;break a}}}while(0);if((M|0)==42){M=0;if(!V){M=44;break}else Q=V}f[(f[e>>2]|0)+(v<<2)>>2]=f[Q+12>>2];_=t}else M=44}else M=44;while(0);do if((M|0)==44){M=0;if(w){J=y>>>2;I=0;H=0;while(1){A=f[z+(I<<2)>>2]|0;if(!(b[A+84>>0]|0))aa=f[(f[A+68>>2]|0)+(v<<2)>>2]|0;else aa=v;A=aa+239^H;I=I+1|0;if((I|0)>=(J|0)){ba=A;break}else H=A}}else ba=0;e:do if(!x){H=B+-1|0;J=(H&B|0)==0;if(!J)if(ba>>>0<B>>>0)ca=ba;else ca=(ba>>>0)%(B>>>0)|0;else ca=H&ba;I=f[(f[d>>2]|0)+(ca<<2)>>2]|0;if((I|0)!=0?(A=f[I>>2]|0,(A|0)!=0):0){I=f[s>>2]|0;C=I+8|0;G=I+12|0;if(J){J=A;while(1){I=f[J+4>>2]|0;if(!((I|0)==(ba|0)|(I&H|0)==(ca|0))){da=ca;M=76;break e}I=f[J+8>>2]|0;L=f[C>>2]|0;O=(f[G>>2]|0)-L|0;K=L;if((O|0)<=0){ea=v;break e}L=O>>>2;O=0;while(1){N=f[K+(O<<2)>>2]|0;if(!(b[N+84>>0]|0)){P=f[N+68>>2]|0;fa=f[P+(v<<2)>>2]|0;ga=f[P+(I<<2)>>2]|0}else{fa=v;ga=I}O=O+1|0;if((ga|0)!=(fa|0))break;if((O|0)>=(L|0)){ea=v;break e}}J=f[J>>2]|0;if(!J){da=ca;M=76;break e}}}else ha=A;while(1){J=f[ha+4>>2]|0;if((J|0)!=(ba|0)){if(J>>>0<B>>>0)ia=J;else ia=(J>>>0)%(B>>>0)|0;if((ia|0)!=(ca|0)){da=ca;M=76;break e}}J=f[ha+8>>2]|0;H=f[C>>2]|0;L=(f[G>>2]|0)-H|0;O=H;if((L|0)<=0){ea=v;break e}H=L>>>2;L=0;while(1){I=f[O+(L<<2)>>2]|0;if(!(b[I+84>>0]|0)){K=f[I+68>>2]|0;ja=f[K+(v<<2)>>2]|0;ka=f[K+(J<<2)>>2]|0}else{ja=v;ka=J}L=L+1|0;if((ka|0)!=(ja|0))break;if((L|0)>=(H|0)){ea=v;break e}}ha=f[ha>>2]|0;if(!ha){da=ca;M=76;break}}}else{da=ca;M=76}}else{da=0;M=76}while(0);if((M|0)==76){M=0;G=ln(16)|0;f[G+8>>2]=v;f[G+12>>2]=t;f[G+4>>2]=ba;f[G>>2]=0;la=$(((f[o>>2]|0)+1|0)>>>0);ma=$(B>>>0);na=$(n[l>>2]);do if(x|$(na*ma)<la){C=B<<1|(B>>>0<3|(B+-1&B|0)!=0)&1;A=~~$(W($(la/na)))>>>0;Ih(d,C>>>0<A>>>0?A:C);C=f[q>>2]|0;A=C+-1|0;if(!(A&C)){oa=C;pa=A&ba;break}if(ba>>>0<C>>>0){oa=C;pa=ba}else{oa=C;pa=(ba>>>0)%(C>>>0)|0}}else{oa=B;pa=da}while(0);C=(f[d>>2]|0)+(pa<<2)|0;A=f[C>>2]|0;if(!A){f[G>>2]=f[p>>2];f[p>>2]=G;f[C>>2]=p;C=f[G>>2]|0;if(C|0){H=f[C+4>>2]|0;C=oa+-1|0;if(C&oa)if(H>>>0<oa>>>0)qa=H;else qa=(H>>>0)%(oa>>>0)|0;else qa=H&C;ra=(f[d>>2]|0)+(qa<<2)|0;M=89}}else{f[G>>2]=f[A>>2];ra=A;M=89}if((M|0)==89){M=0;f[ra>>2]=G}f[o>>2]=(f[o>>2]|0)+1;ea=f[h>>2]|0}A=t+1|0;f[(f[e>>2]|0)+(ea<<2)>>2]=t;C=f[k>>2]|0;if((C|0)==(f[r>>2]|0)){Ri(g,h);_=A;break}else{f[C>>2]=f[h>>2];f[k>>2]=C+4;_=A;break}}while(0);v=(f[h>>2]|0)+1|0;f[h>>2]=v;sa=f[j>>2]|0;if(v>>>0>=sa>>>0)break;else t=_}if((_|0)!=(sa|0)){Xa[f[(f[a>>2]|0)+24>>2]&15](a,e,g);f[j>>2]=_}}_=f[g>>2]|0;if(_|0){g=f[k>>2]|0;if((g|0)!=(_|0))f[k>>2]=g+(~((g+-4-_|0)>>>2)<<2);Oq(_)}_=f[e>>2]|0;if(_|0){e=f[i>>2]|0;if((e|0)!=(_|0))f[i>>2]=e+(~((e+-4-_|0)>>>2)<<2);Oq(_)}_=f[d+8>>2]|0;if(_|0){e=_;do{_=e;e=f[e>>2]|0;Oq(_)}while((e|0)!=0)}e=f[d>>2]|0;f[d>>2]=0;if(!e){u=c;return}Oq(e);u=c;return}function tb(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0;g=u;u=u+80|0;h=g+76|0;i=g+72|0;j=g+48|0;k=g+24|0;l=g;m=a+32|0;n=f[c>>2]|0;c=n+1|0;if((n|0)!=-1){o=((c>>>0)%3|0|0)==0?n+-2|0:c;c=(((n>>>0)%3|0|0)==0?2:-1)+n|0;if((o|0)==-1)p=-1;else p=f[(f[f[m>>2]>>2]|0)+(o<<2)>>2]|0;if((c|0)==-1){q=p;r=-1}else{q=p;r=f[(f[f[m>>2]>>2]|0)+(c<<2)>>2]|0}}else{q=-1;r=-1}c=f[a+36>>2]|0;m=f[c>>2]|0;p=(f[c+4>>2]|0)-m>>2;if(p>>>0<=q>>>0)aq(c);o=m;m=f[o+(q<<2)>>2]|0;if(p>>>0<=r>>>0)aq(c);c=f[o+(r<<2)>>2]|0;r=(m|0)<(e|0);do if(r&(c|0)<(e|0)){o=m<<1;p=f[d+(o<<2)>>2]|0;q=((p|0)<0)<<31>>31;n=f[d+((o|1)<<2)>>2]|0;o=((n|0)<0)<<31>>31;s=c<<1;t=f[d+(s<<2)>>2]|0;v=f[d+((s|1)<<2)>>2]|0;if(!((t|0)!=(p|0)|(v|0)!=(n|0))){f[a+8>>2]=p;f[a+12>>2]=n;u=g;return}s=a+4|0;w=f[(f[s>>2]|0)+(e<<2)>>2]|0;f[j>>2]=0;f[j+4>>2]=0;f[j+8>>2]=0;f[j+12>>2]=0;f[j+16>>2]=0;f[j+20>>2]=0;x=f[a>>2]|0;if(!(b[x+84>>0]|0))y=f[(f[x+68>>2]|0)+(w<<2)>>2]|0;else y=w;f[i>>2]=y;w=b[x+24>>0]|0;f[h>>2]=f[i>>2];vb(x,h,w,j)|0;w=f[(f[s>>2]|0)+(m<<2)>>2]|0;f[k>>2]=0;f[k+4>>2]=0;f[k+8>>2]=0;f[k+12>>2]=0;f[k+16>>2]=0;f[k+20>>2]=0;x=f[a>>2]|0;if(!(b[x+84>>0]|0))z=f[(f[x+68>>2]|0)+(w<<2)>>2]|0;else z=w;f[i>>2]=z;w=b[x+24>>0]|0;f[h>>2]=f[i>>2];vb(x,h,w,k)|0;w=f[(f[s>>2]|0)+(c<<2)>>2]|0;f[l>>2]=0;f[l+4>>2]=0;f[l+8>>2]=0;f[l+12>>2]=0;f[l+16>>2]=0;f[l+20>>2]=0;s=f[a>>2]|0;if(!(b[s+84>>0]|0))A=f[(f[s+68>>2]|0)+(w<<2)>>2]|0;else A=w;f[i>>2]=A;w=b[s+24>>0]|0;f[h>>2]=f[i>>2];vb(s,h,w,l)|0;w=l;s=k;x=f[s>>2]|0;B=f[s+4>>2]|0;s=Xn(f[w>>2]|0,f[w+4>>2]|0,x|0,B|0)|0;w=I;C=l+8|0;D=k+8|0;E=f[D>>2]|0;F=f[D+4>>2]|0;D=Xn(f[C>>2]|0,f[C+4>>2]|0,E|0,F|0)|0;C=I;G=l+16|0;H=k+16|0;J=f[H>>2]|0;K=f[H+4>>2]|0;H=Xn(f[G>>2]|0,f[G+4>>2]|0,J|0,K|0)|0;G=I;L=un(s|0,w|0,s|0,w|0)|0;M=I;N=un(D|0,C|0,D|0,C|0)|0;O=Vn(N|0,I|0,L|0,M|0)|0;M=I;L=un(H|0,G|0,H|0,G|0)|0;N=Vn(O|0,M|0,L|0,I|0)|0;L=I;if((N|0)==0&(L|0)==0)break;M=j;O=Xn(f[M>>2]|0,f[M+4>>2]|0,x|0,B|0)|0;B=I;x=j+8|0;M=Xn(f[x>>2]|0,f[x+4>>2]|0,E|0,F|0)|0;F=I;E=j+16|0;x=Xn(f[E>>2]|0,f[E+4>>2]|0,J|0,K|0)|0;K=I;J=un(O|0,B|0,s|0,w|0)|0;E=I;P=un(M|0,F|0,D|0,C|0)|0;Q=Vn(P|0,I|0,J|0,E|0)|0;E=I;J=un(x|0,K|0,H|0,G|0)|0;P=Vn(Q|0,E|0,J|0,I|0)|0;J=I;E=Xn(t|0,((t|0)<0)<<31>>31|0,p|0,q|0)|0;t=I;Q=Xn(v|0,((v|0)<0)<<31>>31|0,n|0,o|0)|0;v=I;R=un(N|0,L|0,p|0,q|0)|0;q=I;p=un(N|0,L|0,n|0,o|0)|0;o=I;n=un(P|0,J|0,E|0,t|0)|0;S=I;T=un(P|0,J|0,Q|0,v|0)|0;U=I;V=Vn(n|0,S|0,R|0,q|0)|0;q=I;R=Vn(T|0,U|0,p|0,o|0)|0;o=I;p=un(P|0,J|0,s|0,w|0)|0;w=I;s=un(P|0,J|0,D|0,C|0)|0;C=I;D=un(P|0,J|0,H|0,G|0)|0;G=I;H=Ik(p|0,w|0,N|0,L|0)|0;w=I;p=Ik(s|0,C|0,N|0,L|0)|0;C=I;s=Ik(D|0,G|0,N|0,L|0)|0;G=I;D=Xn(O|0,B|0,H|0,w|0)|0;w=I;H=Xn(M|0,F|0,p|0,C|0)|0;C=I;p=Xn(x|0,K|0,s|0,G|0)|0;G=I;s=un(D|0,w|0,D|0,w|0)|0;w=I;D=un(H|0,C|0,H|0,C|0)|0;C=Vn(D|0,I|0,s|0,w|0)|0;w=I;s=un(p|0,G|0,p|0,G|0)|0;G=Vn(C|0,w|0,s|0,I|0)|0;s=I;w=Xn(0,0,E|0,t|0)|0;t=I;E=un(G|0,s|0,N|0,L|0)|0;s=I;switch(E|0){case 0:{if(!s){W=0;X=0}else{Y=1;Z=0;_=E;$=s;aa=23}break}case 1:{if(!s){ba=1;ca=0;aa=24}else{Y=1;Z=0;_=E;$=s;aa=23}break}default:{Y=1;Z=0;_=E;$=s;aa=23}}if((aa|0)==23)while(1){aa=0;G=Tn(Y|0,Z|0,1)|0;C=I;p=_;_=Yn(_|0,$|0,2)|0;if(!($>>>0>0|($|0)==0&p>>>0>7)){ba=G;ca=C;aa=24;break}else{Y=G;Z=C;$=I;aa=23}}if((aa|0)==24)while(1){aa=0;C=jp(E|0,s|0,ba|0,ca|0)|0;G=Vn(C|0,I|0,ba|0,ca|0)|0;C=Yn(G|0,I|0,1)|0;G=I;p=un(C|0,G|0,C|0,G|0)|0;D=I;if(D>>>0>s>>>0|(D|0)==(s|0)&p>>>0>E>>>0){ba=C;ca=G;aa=24}else{W=C;X=G;break}}E=un(W|0,X|0,Q|0,v|0)|0;s=I;G=un(W|0,X|0,w|0,t|0)|0;C=I;p=Vn(E|0,s|0,V|0,q|0)|0;D=I;H=Vn(G|0,C|0,R|0,o|0)|0;K=I;x=Ik(p|0,D|0,N|0,L|0)|0;D=I;p=Ik(H|0,K|0,N|0,L|0)|0;K=I;H=Xn(V|0,q|0,E|0,s|0)|0;s=I;E=Xn(R|0,o|0,G|0,C|0)|0;C=I;G=Ik(H|0,s|0,N|0,L|0)|0;s=I;H=Ik(E|0,C|0,N|0,L|0)|0;C=I;E=e<<1;F=f[d+(E<<2)>>2]|0;M=((F|0)<0)<<31>>31;B=f[d+((E|1)<<2)>>2]|0;E=((B|0)<0)<<31>>31;O=Xn(F|0,M|0,x|0,D|0)|0;J=I;P=Xn(B|0,E|0,p|0,K|0)|0;U=I;T=un(O|0,J|0,O|0,J|0)|0;J=I;O=un(P|0,U|0,P|0,U|0)|0;U=Vn(O|0,I|0,T|0,J|0)|0;J=I;T=Xn(F|0,M|0,G|0,s|0)|0;M=I;F=Xn(B|0,E|0,H|0,C|0)|0;E=I;B=un(T|0,M|0,T|0,M|0)|0;M=I;T=un(F|0,E|0,F|0,E|0)|0;E=Vn(T|0,I|0,B|0,M|0)|0;M=I;B=a+16|0;T=a+20|0;F=f[T>>2]|0;O=f[a+24>>2]|0;P=(F|0)==(O<<5|0);if(J>>>0<M>>>0|(J|0)==(M|0)&U>>>0<E>>>0){do if(P)if((F+1|0)<0)aq(B);else{E=O<<6;U=F+32&-32;vi(B,F>>>0<1073741823?(E>>>0<U>>>0?U:E):2147483647);da=f[T>>2]|0;break}else da=F;while(0);f[T>>2]=da+1;L=(f[B>>2]|0)+(da>>>5<<2)|0;f[L>>2]=f[L>>2]|1<<(da&31);ea=x;fa=p;ga=K;ha=D}else{do if(P)if((F+1|0)<0)aq(B);else{L=O<<6;N=F+32&-32;vi(B,F>>>0<1073741823?(L>>>0<N>>>0?N:L):2147483647);ia=f[T>>2]|0;break}else ia=F;while(0);f[T>>2]=ia+1;F=(f[B>>2]|0)+(ia>>>5<<2)|0;f[F>>2]=f[F>>2]&~(1<<(ia&31));ea=G;fa=H;ga=C;ha=s}f[a+8>>2]=ea;f[a+12>>2]=fa;u=g;return}while(0);do if(r)ja=m<<1;else{if((e|0)>0){ja=(e<<1)+-2|0;break}fa=a+8|0;f[fa>>2]=0;f[fa+4>>2]=0;u=g;return}while(0);f[a+8>>2]=f[d+(ja<<2)>>2];f[a+12>>2]=f[d+(ja+1<<2)>>2];u=g;return}function ub(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0;g=u;u=u+80|0;h=g+76|0;i=g+72|0;j=g+48|0;k=g+24|0;l=g;m=a+32|0;n=f[c>>2]|0;c=n+1|0;do if((n|0)!=-1){o=((c>>>0)%3|0|0)==0?n+-2|0:c;if(!((n>>>0)%3|0)){p=n+2|0;q=o;break}else{p=n+-1|0;q=o;break}}else{p=-1;q=-1}while(0);n=f[(f[m>>2]|0)+28>>2]|0;m=f[n+(q<<2)>>2]|0;q=f[n+(p<<2)>>2]|0;p=f[a+36>>2]|0;n=f[p>>2]|0;c=(f[p+4>>2]|0)-n>>2;if(c>>>0<=m>>>0)aq(p);o=n;n=f[o+(m<<2)>>2]|0;if(c>>>0<=q>>>0)aq(p);p=f[o+(q<<2)>>2]|0;q=(n|0)<(e|0);do if(q&(p|0)<(e|0)){o=n<<1;c=f[d+(o<<2)>>2]|0;m=((c|0)<0)<<31>>31;r=f[d+((o|1)<<2)>>2]|0;o=((r|0)<0)<<31>>31;s=p<<1;t=f[d+(s<<2)>>2]|0;v=f[d+((s|1)<<2)>>2]|0;if(!((t|0)!=(c|0)|(v|0)!=(r|0))){f[a+8>>2]=c;f[a+12>>2]=r;u=g;return}s=a+4|0;w=f[(f[s>>2]|0)+(e<<2)>>2]|0;f[j>>2]=0;f[j+4>>2]=0;f[j+8>>2]=0;f[j+12>>2]=0;f[j+16>>2]=0;f[j+20>>2]=0;x=f[a>>2]|0;if(!(b[x+84>>0]|0))y=f[(f[x+68>>2]|0)+(w<<2)>>2]|0;else y=w;f[i>>2]=y;w=b[x+24>>0]|0;f[h>>2]=f[i>>2];vb(x,h,w,j)|0;w=f[(f[s>>2]|0)+(n<<2)>>2]|0;f[k>>2]=0;f[k+4>>2]=0;f[k+8>>2]=0;f[k+12>>2]=0;f[k+16>>2]=0;f[k+20>>2]=0;x=f[a>>2]|0;if(!(b[x+84>>0]|0))z=f[(f[x+68>>2]|0)+(w<<2)>>2]|0;else z=w;f[i>>2]=z;w=b[x+24>>0]|0;f[h>>2]=f[i>>2];vb(x,h,w,k)|0;w=f[(f[s>>2]|0)+(p<<2)>>2]|0;f[l>>2]=0;f[l+4>>2]=0;f[l+8>>2]=0;f[l+12>>2]=0;f[l+16>>2]=0;f[l+20>>2]=0;s=f[a>>2]|0;if(!(b[s+84>>0]|0))A=f[(f[s+68>>2]|0)+(w<<2)>>2]|0;else A=w;f[i>>2]=A;w=b[s+24>>0]|0;f[h>>2]=f[i>>2];vb(s,h,w,l)|0;w=l;s=k;x=f[s>>2]|0;B=f[s+4>>2]|0;s=Xn(f[w>>2]|0,f[w+4>>2]|0,x|0,B|0)|0;w=I;C=l+8|0;D=k+8|0;E=f[D>>2]|0;F=f[D+4>>2]|0;D=Xn(f[C>>2]|0,f[C+4>>2]|0,E|0,F|0)|0;C=I;G=l+16|0;H=k+16|0;J=f[H>>2]|0;K=f[H+4>>2]|0;H=Xn(f[G>>2]|0,f[G+4>>2]|0,J|0,K|0)|0;G=I;L=un(s|0,w|0,s|0,w|0)|0;M=I;N=un(D|0,C|0,D|0,C|0)|0;O=Vn(N|0,I|0,L|0,M|0)|0;M=I;L=un(H|0,G|0,H|0,G|0)|0;N=Vn(O|0,M|0,L|0,I|0)|0;L=I;if((N|0)==0&(L|0)==0)break;M=j;O=Xn(f[M>>2]|0,f[M+4>>2]|0,x|0,B|0)|0;B=I;x=j+8|0;M=Xn(f[x>>2]|0,f[x+4>>2]|0,E|0,F|0)|0;F=I;E=j+16|0;x=Xn(f[E>>2]|0,f[E+4>>2]|0,J|0,K|0)|0;K=I;J=un(O|0,B|0,s|0,w|0)|0;E=I;P=un(M|0,F|0,D|0,C|0)|0;Q=Vn(P|0,I|0,J|0,E|0)|0;E=I;J=un(x|0,K|0,H|0,G|0)|0;P=Vn(Q|0,E|0,J|0,I|0)|0;J=I;E=Xn(t|0,((t|0)<0)<<31>>31|0,c|0,m|0)|0;t=I;Q=Xn(v|0,((v|0)<0)<<31>>31|0,r|0,o|0)|0;v=I;R=un(N|0,L|0,c|0,m|0)|0;m=I;c=un(N|0,L|0,r|0,o|0)|0;o=I;r=un(P|0,J|0,E|0,t|0)|0;S=I;T=un(P|0,J|0,Q|0,v|0)|0;U=I;V=Vn(r|0,S|0,R|0,m|0)|0;m=I;R=Vn(T|0,U|0,c|0,o|0)|0;o=I;c=un(P|0,J|0,s|0,w|0)|0;w=I;s=un(P|0,J|0,D|0,C|0)|0;C=I;D=un(P|0,J|0,H|0,G|0)|0;G=I;H=Ik(c|0,w|0,N|0,L|0)|0;w=I;c=Ik(s|0,C|0,N|0,L|0)|0;C=I;s=Ik(D|0,G|0,N|0,L|0)|0;G=I;D=Xn(O|0,B|0,H|0,w|0)|0;w=I;H=Xn(M|0,F|0,c|0,C|0)|0;C=I;c=Xn(x|0,K|0,s|0,G|0)|0;G=I;s=un(D|0,w|0,D|0,w|0)|0;w=I;D=un(H|0,C|0,H|0,C|0)|0;C=Vn(D|0,I|0,s|0,w|0)|0;w=I;s=un(c|0,G|0,c|0,G|0)|0;G=Vn(C|0,w|0,s|0,I|0)|0;s=I;w=Xn(0,0,E|0,t|0)|0;t=I;E=un(G|0,s|0,N|0,L|0)|0;s=I;switch(E|0){case 0:{if(!s){W=0;X=0}else{Y=1;Z=0;_=E;$=s;aa=22}break}case 1:{if(!s){ba=1;ca=0;aa=23}else{Y=1;Z=0;_=E;$=s;aa=22}break}default:{Y=1;Z=0;_=E;$=s;aa=22}}if((aa|0)==22)while(1){aa=0;G=Tn(Y|0,Z|0,1)|0;C=I;c=_;_=Yn(_|0,$|0,2)|0;if(!($>>>0>0|($|0)==0&c>>>0>7)){ba=G;ca=C;aa=23;break}else{Y=G;Z=C;$=I;aa=22}}if((aa|0)==23)while(1){aa=0;C=jp(E|0,s|0,ba|0,ca|0)|0;G=Vn(C|0,I|0,ba|0,ca|0)|0;C=Yn(G|0,I|0,1)|0;G=I;c=un(C|0,G|0,C|0,G|0)|0;D=I;if(D>>>0>s>>>0|(D|0)==(s|0)&c>>>0>E>>>0){ba=C;ca=G;aa=23}else{W=C;X=G;break}}E=un(W|0,X|0,Q|0,v|0)|0;s=I;G=un(W|0,X|0,w|0,t|0)|0;C=I;c=Vn(E|0,s|0,V|0,m|0)|0;D=I;H=Vn(G|0,C|0,R|0,o|0)|0;K=I;x=Ik(c|0,D|0,N|0,L|0)|0;D=I;c=Ik(H|0,K|0,N|0,L|0)|0;K=I;H=Xn(V|0,m|0,E|0,s|0)|0;s=I;E=Xn(R|0,o|0,G|0,C|0)|0;C=I;G=Ik(H|0,s|0,N|0,L|0)|0;s=I;H=Ik(E|0,C|0,N|0,L|0)|0;C=I;E=e<<1;F=f[d+(E<<2)>>2]|0;M=((F|0)<0)<<31>>31;B=f[d+((E|1)<<2)>>2]|0;E=((B|0)<0)<<31>>31;O=Xn(F|0,M|0,x|0,D|0)|0;J=I;P=Xn(B|0,E|0,c|0,K|0)|0;U=I;T=un(O|0,J|0,O|0,J|0)|0;J=I;O=un(P|0,U|0,P|0,U|0)|0;U=Vn(O|0,I|0,T|0,J|0)|0;J=I;T=Xn(F|0,M|0,G|0,s|0)|0;M=I;F=Xn(B|0,E|0,H|0,C|0)|0;E=I;B=un(T|0,M|0,T|0,M|0)|0;M=I;T=un(F|0,E|0,F|0,E|0)|0;E=Vn(T|0,I|0,B|0,M|0)|0;M=I;B=a+16|0;T=a+20|0;F=f[T>>2]|0;O=f[a+24>>2]|0;P=(F|0)==(O<<5|0);if(J>>>0<M>>>0|(J|0)==(M|0)&U>>>0<E>>>0){do if(P)if((F+1|0)<0)aq(B);else{E=O<<6;U=F+32&-32;vi(B,F>>>0<1073741823?(E>>>0<U>>>0?U:E):2147483647);da=f[T>>2]|0;break}else da=F;while(0);f[T>>2]=da+1;L=(f[B>>2]|0)+(da>>>5<<2)|0;f[L>>2]=f[L>>2]|1<<(da&31);ea=x;fa=c;ga=K;ha=D}else{do if(P)if((F+1|0)<0)aq(B);else{L=O<<6;N=F+32&-32;vi(B,F>>>0<1073741823?(L>>>0<N>>>0?N:L):2147483647);ia=f[T>>2]|0;break}else ia=F;while(0);f[T>>2]=ia+1;F=(f[B>>2]|0)+(ia>>>5<<2)|0;f[F>>2]=f[F>>2]&~(1<<(ia&31));ea=G;fa=H;ga=C;ha=s}f[a+8>>2]=ea;f[a+12>>2]=fa;u=g;return}while(0);do if(q)ja=n<<1;else{if((e|0)>0){ja=(e<<1)+-2|0;break}fa=a+8|0;f[fa>>2]=0;f[fa+4>>2]=0;u=g;return}while(0);f[a+8>>2]=f[d+(ja<<2)>>2];f[a+12>>2]=f[d+(ja+1<<2)>>2];u=g;return}function vb(a,c,e,g){a=a|0;c=c|0;e=e|0;g=g|0;var i=0,k=0,l=0,m=0,o=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=Oa,D=0,E=0.0,F=0,G=0;if(!g){i=0;return i|0}do switch(f[a+28>>2]|0){case 1:{k=a+24|0;l=b[k>>0]|0;if((l<<24>>24>e<<24>>24?e:l)<<24>>24>0){m=f[f[a>>2]>>2]|0;o=a+40|0;q=un(f[o>>2]|0,f[o+4>>2]|0,f[c>>2]|0,0)|0;o=a+48|0;r=Vn(q|0,I|0,f[o>>2]|0,f[o+4>>2]|0)|0;o=m+r|0;r=0;while(1){m=b[o>>0]|0;q=g+(r<<3)|0;f[q>>2]=m;f[q+4>>2]=((m|0)<0)<<31>>31;r=r+1|0;m=b[k>>0]|0;if((r|0)>=((m<<24>>24>e<<24>>24?e:m)<<24>>24|0)){s=m;break}else o=o+1|0}}else s=l;o=s<<24>>24;if(s<<24>>24>=e<<24>>24){i=1;return i|0}sj(g+(o<<3)|0,0,(e<<24>>24)-o<<3|0)|0;i=1;return i|0}case 2:{o=a+24|0;r=b[o>>0]|0;if((r<<24>>24>e<<24>>24?e:r)<<24>>24>0){k=f[f[a>>2]>>2]|0;m=a+40|0;q=un(f[m>>2]|0,f[m+4>>2]|0,f[c>>2]|0,0)|0;m=a+48|0;t=Vn(q|0,I|0,f[m>>2]|0,f[m+4>>2]|0)|0;m=k+t|0;t=0;while(1){k=g+(t<<3)|0;f[k>>2]=h[m>>0];f[k+4>>2]=0;t=t+1|0;k=b[o>>0]|0;if((t|0)>=((k<<24>>24>e<<24>>24?e:k)<<24>>24|0)){u=k;break}else m=m+1|0}}else u=r;m=u<<24>>24;if(u<<24>>24>=e<<24>>24){i=1;return i|0}sj(g+(m<<3)|0,0,(e<<24>>24)-m<<3|0)|0;i=1;return i|0}case 3:{m=a+24|0;t=b[m>>0]|0;if((t<<24>>24>e<<24>>24?e:t)<<24>>24>0){o=f[f[a>>2]>>2]|0;l=a+40|0;k=un(f[l>>2]|0,f[l+4>>2]|0,f[c>>2]|0,0)|0;l=a+48|0;q=Vn(k|0,I|0,f[l>>2]|0,f[l+4>>2]|0)|0;l=o+q|0;q=0;while(1){o=d[l>>1]|0;k=g+(q<<3)|0;f[k>>2]=o;f[k+4>>2]=((o|0)<0)<<31>>31;q=q+1|0;o=b[m>>0]|0;if((q|0)>=((o<<24>>24>e<<24>>24?e:o)<<24>>24|0)){v=o;break}else l=l+2|0}}else v=t;l=v<<24>>24;if(v<<24>>24>=e<<24>>24){i=1;return i|0}sj(g+(l<<3)|0,0,(e<<24>>24)-l<<3|0)|0;i=1;return i|0}case 4:{l=a+24|0;q=b[l>>0]|0;if((q<<24>>24>e<<24>>24?e:q)<<24>>24>0){m=f[f[a>>2]>>2]|0;r=a+40|0;o=un(f[r>>2]|0,f[r+4>>2]|0,f[c>>2]|0,0)|0;r=a+48|0;k=Vn(o|0,I|0,f[r>>2]|0,f[r+4>>2]|0)|0;r=m+k|0;k=0;while(1){m=g+(k<<3)|0;f[m>>2]=j[r>>1];f[m+4>>2]=0;k=k+1|0;m=b[l>>0]|0;if((k|0)>=((m<<24>>24>e<<24>>24?e:m)<<24>>24|0)){w=m;break}else r=r+2|0}}else w=q;r=w<<24>>24;if(w<<24>>24>=e<<24>>24){i=1;return i|0}sj(g+(r<<3)|0,0,(e<<24>>24)-r<<3|0)|0;i=1;return i|0}case 5:{r=a+24|0;k=b[r>>0]|0;if((k<<24>>24>e<<24>>24?e:k)<<24>>24>0){l=f[f[a>>2]>>2]|0;t=a+40|0;m=un(f[t>>2]|0,f[t+4>>2]|0,f[c>>2]|0,0)|0;t=a+48|0;o=Vn(m|0,I|0,f[t>>2]|0,f[t+4>>2]|0)|0;t=l+o|0;o=0;while(1){l=f[t>>2]|0;m=g+(o<<3)|0;f[m>>2]=l;f[m+4>>2]=((l|0)<0)<<31>>31;o=o+1|0;l=b[r>>0]|0;if((o|0)>=((l<<24>>24>e<<24>>24?e:l)<<24>>24|0)){x=l;break}else t=t+4|0}}else x=k;t=x<<24>>24;if(x<<24>>24>=e<<24>>24){i=1;return i|0}sj(g+(t<<3)|0,0,(e<<24>>24)-t<<3|0)|0;i=1;return i|0}case 6:{t=a+24|0;o=b[t>>0]|0;if((o<<24>>24>e<<24>>24?e:o)<<24>>24>0){r=f[f[a>>2]>>2]|0;q=a+40|0;l=un(f[q>>2]|0,f[q+4>>2]|0,f[c>>2]|0,0)|0;q=a+48|0;m=Vn(l|0,I|0,f[q>>2]|0,f[q+4>>2]|0)|0;q=r+m|0;m=0;while(1){r=g+(m<<3)|0;f[r>>2]=f[q>>2];f[r+4>>2]=0;m=m+1|0;r=b[t>>0]|0;if((m|0)>=((r<<24>>24>e<<24>>24?e:r)<<24>>24|0)){y=r;break}else q=q+4|0}}else y=o;q=y<<24>>24;if(y<<24>>24>=e<<24>>24){i=1;return i|0}sj(g+(q<<3)|0,0,(e<<24>>24)-q<<3|0)|0;i=1;return i|0}case 7:{q=a+24|0;m=b[q>>0]|0;if((m<<24>>24>e<<24>>24?e:m)<<24>>24>0){t=f[f[a>>2]>>2]|0;k=a+40|0;r=un(f[k>>2]|0,f[k+4>>2]|0,f[c>>2]|0,0)|0;k=a+48|0;l=Vn(r|0,I|0,f[k>>2]|0,f[k+4>>2]|0)|0;k=t+l|0;l=0;while(1){t=k;r=f[t+4>>2]|0;z=g+(l<<3)|0;f[z>>2]=f[t>>2];f[z+4>>2]=r;l=l+1|0;r=b[q>>0]|0;if((l|0)>=((r<<24>>24>e<<24>>24?e:r)<<24>>24|0)){A=r;break}else k=k+8|0}}else A=m;k=A<<24>>24;if(A<<24>>24>=e<<24>>24){i=1;return i|0}sj(g+(k<<3)|0,0,(e<<24>>24)-k<<3|0)|0;i=1;return i|0}case 8:{k=a+24|0;l=b[k>>0]|0;if((l<<24>>24>e<<24>>24?e:l)<<24>>24>0){q=f[f[a>>2]>>2]|0;o=a+40|0;r=un(f[o>>2]|0,f[o+4>>2]|0,f[c>>2]|0,0)|0;o=a+48|0;z=Vn(r|0,I|0,f[o>>2]|0,f[o+4>>2]|0)|0;o=q+z|0;z=0;while(1){q=o;r=f[q+4>>2]|0;t=g+(z<<3)|0;f[t>>2]=f[q>>2];f[t+4>>2]=r;z=z+1|0;r=b[k>>0]|0;if((z|0)>=((r<<24>>24>e<<24>>24?e:r)<<24>>24|0)){B=r;break}else o=o+8|0}}else B=l;o=B<<24>>24;if(B<<24>>24>=e<<24>>24){i=1;return i|0}sj(g+(o<<3)|0,0,(e<<24>>24)-o<<3|0)|0;i=1;return i|0}case 9:{o=a+24|0;z=b[o>>0]|0;if((z<<24>>24>e<<24>>24?e:z)<<24>>24>0){k=f[f[a>>2]>>2]|0;m=a+40|0;r=un(f[m>>2]|0,f[m+4>>2]|0,f[c>>2]|0,0)|0;m=a+48|0;t=Vn(r|0,I|0,f[m>>2]|0,f[m+4>>2]|0)|0;m=k+t|0;t=0;while(1){C=$(n[m>>2]);k=+K(+C)>=1.0?(+C>0.0?~~+Y(+J(+C/4294967296.0),4294967295.0)>>>0:~~+W((+C-+(~~+C>>>0))/4294967296.0)>>>0):0;r=g+(t<<3)|0;f[r>>2]=~~+C>>>0;f[r+4>>2]=k;t=t+1|0;k=b[o>>0]|0;if((t|0)>=((k<<24>>24>e<<24>>24?e:k)<<24>>24|0)){D=k;break}else m=m+4|0}}else D=z;m=D<<24>>24;if(D<<24>>24>=e<<24>>24){i=1;return i|0}sj(g+(m<<3)|0,0,(e<<24>>24)-m<<3|0)|0;i=1;return i|0}case 10:{m=a+24|0;t=b[m>>0]|0;if((t<<24>>24>e<<24>>24?e:t)<<24>>24>0){o=f[f[a>>2]>>2]|0;l=a+40|0;k=un(f[l>>2]|0,f[l+4>>2]|0,f[c>>2]|0,0)|0;l=a+48|0;r=Vn(k|0,I|0,f[l>>2]|0,f[l+4>>2]|0)|0;l=o+r|0;r=0;while(1){E=+p[l>>3];o=+K(E)>=1.0?(E>0.0?~~+Y(+J(E/4294967296.0),4294967295.0)>>>0:~~+W((E-+(~~E>>>0))/4294967296.0)>>>0):0;k=g+(r<<3)|0;f[k>>2]=~~E>>>0;f[k+4>>2]=o;r=r+1|0;o=b[m>>0]|0;if((r|0)>=((o<<24>>24>e<<24>>24?e:o)<<24>>24|0)){F=o;break}else l=l+8|0}}else F=t;l=F<<24>>24;if(F<<24>>24>=e<<24>>24){i=1;return i|0}sj(g+(l<<3)|0,0,(e<<24>>24)-l<<3|0)|0;i=1;return i|0}case 11:{l=a+24|0;r=b[l>>0]|0;if((r<<24>>24>e<<24>>24?e:r)<<24>>24>0){m=f[f[a>>2]>>2]|0;z=a+40|0;o=un(f[z>>2]|0,f[z+4>>2]|0,f[c>>2]|0,0)|0;z=a+48|0;k=Vn(o|0,I|0,f[z>>2]|0,f[z+4>>2]|0)|0;z=m+k|0;k=0;while(1){m=g+(k<<3)|0;f[m>>2]=h[z>>0];f[m+4>>2]=0;k=k+1|0;m=b[l>>0]|0;if((k|0)>=((m<<24>>24>e<<24>>24?e:m)<<24>>24|0)){G=m;break}else z=z+1|0}}else G=r;z=G<<24>>24;if(G<<24>>24>=e<<24>>24){i=1;return i|0}sj(g+(z<<3)|0,0,(e<<24>>24)-z<<3|0)|0;i=1;return i|0}default:{i=0;return i|0}}while(0);return 0}function wb(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0;c=u;u=u+16|0;d=c+8|0;e=c;if((f[a+96>>2]|0)==(f[a+92>>2]|0)){u=c;return}g=a+56|0;h=f[g>>2]|0;if((h|0)==(f[a+60>>2]|0)){Ri(a+52|0,b);i=b}else{f[h>>2]=f[b>>2];f[g>>2]=h+4;i=b}b=a+88|0;f[b>>2]=0;h=f[a>>2]|0;g=f[i>>2]|0;j=g+1|0;if((g|0)!=-1){k=((j>>>0)%3|0|0)==0?g+-2|0:j;if((k|0)==-1)l=-1;else l=f[(f[h>>2]|0)+(k<<2)>>2]|0;k=(((g>>>0)%3|0|0)==0?2:-1)+g|0;if((k|0)==-1){m=l;n=-1}else{m=l;n=f[(f[h>>2]|0)+(k<<2)>>2]|0}}else{m=-1;n=-1}k=a+24|0;h=f[k>>2]|0;l=h+(m>>>5<<2)|0;g=1<<(m&31);j=f[l>>2]|0;if(!(j&g)){f[l>>2]=j|g;g=f[i>>2]|0;j=g+1|0;if((g|0)==-1)o=-1;else o=((j>>>0)%3|0|0)==0?g+-2|0:j;f[e>>2]=o;j=f[(f[(f[a+44>>2]|0)+96>>2]|0)+(((o>>>0)/3|0)*12|0)+(((o>>>0)%3|0)<<2)>>2]|0;o=f[a+48>>2]|0;f[d>>2]=j;g=f[o+4>>2]|0;o=g+4|0;l=f[o>>2]|0;if((l|0)==(f[g+8>>2]|0))Ri(g,d);else{f[l>>2]=j;f[o>>2]=l+4}l=a+40|0;o=f[l>>2]|0;j=o+4|0;g=f[j>>2]|0;if((g|0)==(f[o+8>>2]|0)){Ri(o,e);p=f[l>>2]|0}else{f[g>>2]=f[e>>2];f[j>>2]=g+4;p=o}o=p+24|0;f[(f[p+12>>2]|0)+(m<<2)>>2]=f[o>>2];f[o>>2]=(f[o>>2]|0)+1;q=f[k>>2]|0}else q=h;h=q+(n>>>5<<2)|0;q=1<<(n&31);o=f[h>>2]|0;if(!(o&q)){f[h>>2]=o|q;q=f[i>>2]|0;do if((q|0)!=-1)if(!((q>>>0)%3|0)){r=q+2|0;break}else{r=q+-1|0;break}else r=-1;while(0);f[e>>2]=r;q=f[(f[(f[a+44>>2]|0)+96>>2]|0)+(((r>>>0)/3|0)*12|0)+(((r>>>0)%3|0)<<2)>>2]|0;r=f[a+48>>2]|0;f[d>>2]=q;o=f[r+4>>2]|0;r=o+4|0;h=f[r>>2]|0;if((h|0)==(f[o+8>>2]|0))Ri(o,d);else{f[h>>2]=q;f[r>>2]=h+4}h=a+40|0;r=f[h>>2]|0;q=r+4|0;o=f[q>>2]|0;if((o|0)==(f[r+8>>2]|0)){Ri(r,e);s=f[h>>2]|0}else{f[o>>2]=f[e>>2];f[q>>2]=o+4;s=r}r=s+24|0;f[(f[s+12>>2]|0)+(n<<2)>>2]=f[r>>2];f[r>>2]=(f[r>>2]|0)+1}r=f[i>>2]|0;if((r|0)==-1)t=-1;else t=f[(f[f[a>>2]>>2]|0)+(r<<2)>>2]|0;r=(f[k>>2]|0)+(t>>>5<<2)|0;n=1<<(t&31);s=f[r>>2]|0;if(!(n&s)){f[r>>2]=s|n;n=f[i>>2]|0;f[e>>2]=n;s=f[(f[(f[a+44>>2]|0)+96>>2]|0)+(((n>>>0)/3|0)*12|0)+(((n>>>0)%3|0)<<2)>>2]|0;n=f[a+48>>2]|0;f[d>>2]=s;r=f[n+4>>2]|0;n=r+4|0;o=f[n>>2]|0;if((o|0)==(f[r+8>>2]|0))Ri(r,d);else{f[o>>2]=s;f[n>>2]=o+4}o=a+40|0;n=f[o>>2]|0;s=n+4|0;r=f[s>>2]|0;if((r|0)==(f[n+8>>2]|0)){Ri(n,e);v=f[o>>2]|0}else{f[r>>2]=f[e>>2];f[s>>2]=r+4;v=n}n=v+24|0;f[(f[v+12>>2]|0)+(t<<2)>>2]=f[n>>2];f[n>>2]=(f[n>>2]|0)+1}n=f[b>>2]|0;a:do if((n|0)<3){t=a+12|0;v=a+44|0;r=a+48|0;s=a+40|0;o=a+92|0;q=n;while(1){h=q;while(1){w=a+52+(h*12|0)+4|0;x=f[w>>2]|0;if((f[a+52+(h*12|0)>>2]|0)!=(x|0))break;if((h|0)<2)h=h+1|0;else break a}m=x+-4|0;p=f[m>>2]|0;f[w>>2]=m;f[b>>2]=h;f[i>>2]=p;if((p|0)==-1)break;m=(p>>>0)/3|0;g=f[t>>2]|0;do if(!(f[g+(m>>>5<<2)>>2]&1<<(m&31))){j=p;l=g;b:while(1){y=(j>>>0)/3|0;z=l+(y>>>5<<2)|0;f[z>>2]=1<<(y&31)|f[z>>2];z=f[i>>2]|0;if((z|0)==-1)A=-1;else A=f[(f[f[a>>2]>>2]|0)+(z<<2)>>2]|0;y=(f[k>>2]|0)+(A>>>5<<2)|0;B=1<<(A&31);C=f[y>>2]|0;if(!(B&C)){f[y>>2]=C|B;B=f[i>>2]|0;f[e>>2]=B;C=f[(f[(f[v>>2]|0)+96>>2]|0)+(((B>>>0)/3|0)*12|0)+(((B>>>0)%3|0)<<2)>>2]|0;B=f[r>>2]|0;f[d>>2]=C;y=f[B+4>>2]|0;B=y+4|0;D=f[B>>2]|0;if((D|0)==(f[y+8>>2]|0))Ri(y,d);else{f[D>>2]=C;f[B>>2]=D+4}D=f[s>>2]|0;B=D+4|0;C=f[B>>2]|0;if((C|0)==(f[D+8>>2]|0)){Ri(D,e);E=f[s>>2]|0}else{f[C>>2]=f[e>>2];f[B>>2]=C+4;E=D}D=E+24|0;f[(f[E+12>>2]|0)+(A<<2)>>2]=f[D>>2];f[D>>2]=(f[D>>2]|0)+1;F=f[i>>2]|0}else F=z;z=f[a>>2]|0;if((F|0)==-1){G=93;break}D=F+1|0;C=((D>>>0)%3|0|0)==0?F+-2|0:D;if((C|0)==-1)H=-1;else H=f[(f[z+12>>2]|0)+(C<<2)>>2]|0;C=(((F>>>0)%3|0|0)==0?2:-1)+F|0;if((C|0)==-1)I=-1;else I=f[(f[z+12>>2]|0)+(C<<2)>>2]|0;C=(H|0)==-1;D=C?-1:(H>>>0)/3|0;B=(I|0)==-1;y=B?-1:(I>>>0)/3|0;if(C)J=1;else J=(f[(f[t>>2]|0)+(D>>>5<<2)>>2]&1<<(D&31)|0)!=0;do if(B)if(J){G=93;break b}else G=82;else{if(f[(f[t>>2]|0)+(y>>>5<<2)>>2]&1<<(y&31)|0)if(J){G=93;break b}else{G=82;break}D=f[(f[z>>2]|0)+(I<<2)>>2]|0;if(!(1<<(D&31)&f[(f[k>>2]|0)+(D>>>5<<2)>>2])){K=(f[o>>2]|0)+(D<<2)|0;D=f[K>>2]|0;f[K>>2]=D+1;L=(D|0)>0?1:2}else L=0;if(J?(L|0)<=(f[b>>2]|0):0){M=I;break}f[d>>2]=I;D=a+52+(L*12|0)+4|0;K=f[D>>2]|0;if((K|0)==(f[a+52+(L*12|0)+8>>2]|0))Ri(a+52+(L*12|0)|0,d);else{f[K>>2]=I;f[D>>2]=K+4}if((f[b>>2]|0)>(L|0))f[b>>2]=L;if(J){G=93;break b}else G=82}while(0);if((G|0)==82){G=0;if(C)N=-1;else N=f[(f[f[a>>2]>>2]|0)+(H<<2)>>2]|0;if(!(1<<(N&31)&f[(f[k>>2]|0)+(N>>>5<<2)>>2])){z=(f[o>>2]|0)+(N<<2)|0;y=f[z>>2]|0;f[z>>2]=y+1;O=(y|0)>0?1:2}else O=0;if((O|0)>(f[b>>2]|0))break;else M=H}f[i>>2]=M;j=M;l=f[t>>2]|0}if((G|0)==93){G=0;P=f[b>>2]|0;break}f[d>>2]=H;l=a+52+(O*12|0)+4|0;j=f[l>>2]|0;if((j|0)==(f[a+52+(O*12|0)+8>>2]|0))Ri(a+52+(O*12|0)|0,d);else{f[j>>2]=H;f[l>>2]=j+4}j=f[b>>2]|0;if((j|0)>(O|0)){f[b>>2]=O;Q=O}else Q=j;P=Q}else P=h;while(0);if((P|0)<3)q=P;else break a}u=c;return}while(0);f[i>>2]=-1;u=c;return}function xb(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0;d=a;a=b;a:while(1){b=a;e=a+-4|0;g=d;while(1){h=g;b:while(1){i=h;j=b-i|0;k=j>>2;switch(k|0){case 2:{l=5;break a;break}case 3:{l=11;break a;break}case 4:{l=12;break a;break}case 5:{l=13;break a;break}case 1:case 0:{l=84;break a;break}default:{}}if((j|0)<124){l=15;break a}m=h+(((k|0)/2|0)<<2)|0;if((j|0)>3996){j=(k|0)/4|0;n=ig(h,h+(j<<2)|0,m,m+(j<<2)|0,e,c)|0}else n=Vg(h,m,e,c)|0;o=f[h>>2]|0;j=f[m>>2]|0;p=f[c>>2]|0;k=f[p>>2]|0;q=(f[p+4>>2]|0)-k>>3;if(q>>>0<=o>>>0){l=20;break a}r=k;if(q>>>0<=j>>>0){l=22;break a}k=f[r+(o<<3)>>2]|0;s=f[r+(j<<3)>>2]|0;if(k>>>0<s>>>0){t=e;u=n;break}else v=e;while(1){v=v+-4|0;if((h|0)==(v|0))break;w=f[v>>2]|0;if(q>>>0<=w>>>0){l=51;break a}if((f[r+(w<<3)>>2]|0)>>>0<s>>>0){l=53;break b}}s=h+4|0;j=f[e>>2]|0;if(q>>>0<=j>>>0){l=26;break a}if(k>>>0<(f[r+(j<<3)>>2]|0)>>>0)x=s;else{if((s|0)==(e|0)){l=84;break a}else y=s;while(1){z=f[y>>2]|0;if(q>>>0<=z>>>0){l=32;break a}if(k>>>0<(f[r+(z<<3)>>2]|0)>>>0)break;s=y+4|0;if((s|0)==(e|0)){l=84;break a}else y=s}f[y>>2]=j;f[e>>2]=z;x=y+4|0}if((x|0)==(e|0)){l=84;break a}r=f[h>>2]|0;A=f[c>>2]|0;k=f[A>>2]|0;q=(f[A+4>>2]|0)-k>>3;if(q>>>0<=r>>>0){l=38;break a}s=k;k=e;B=x;C=r;while(1){r=s+(C<<3)|0;D=q>>>0>C>>>0;E=B;while(1){F=f[E>>2]|0;if(q>>>0<=F>>>0){l=40;break a}G=f[r>>2]|0;if(G>>>0<(f[s+(F<<3)>>2]|0)>>>0)break;if(D)E=E+4|0;else{l=38;break a}}if(q>>>0>C>>>0)H=k;else{l=46;break a}do{H=H+-4|0;I=f[H>>2]|0;if(q>>>0<=I>>>0){l=47;break a}}while(G>>>0<(f[s+(I<<3)>>2]|0)>>>0);if(E>>>0>=H>>>0){h=E;continue b}D=f[E>>2]|0;f[E>>2]=I;f[H>>2]=D;C=f[h>>2]|0;if(q>>>0<=C>>>0){l=38;break a}else{k=H;B=E+4|0}}}if((l|0)==53){l=0;f[h>>2]=w;f[v>>2]=o;t=v;u=n+1|0}B=h+4|0;c:do if(B>>>0<t>>>0){k=f[B>>2]|0;C=f[c>>2]|0;q=f[C>>2]|0;s=(f[C+4>>2]|0)-q>>3;if(s>>>0>k>>>0){J=t;K=B;L=u;M=m;N=s;O=q;P=C;Q=k}else{R=C;l=57;break a}while(1){C=f[c>>2]|0;k=C+4|0;q=f[M>>2]|0;s=K;j=O;D=N;S=P;r=Q;while(1){F=j;if(D>>>0<=q>>>0){l=59;break a}if((f[F+(r<<3)>>2]|0)>>>0>=(f[F+(q<<3)>>2]|0)>>>0)break;F=s+4|0;T=f[F>>2]|0;j=f[C>>2]|0;D=(f[k>>2]|0)-j>>3;if(D>>>0<=T>>>0){R=C;l=57;break a}else{s=F;S=C;r=T}}C=f[M>>2]|0;O=f[S>>2]|0;N=(f[S+4>>2]|0)-O>>3;D=O;j=D+(C<<3)|0;if(N>>>0>C>>>0)U=J;else{l=65;break a}do{U=U+-4|0;V=f[U>>2]|0;if(N>>>0<=V>>>0){l=66;break a}}while((f[D+(V<<3)>>2]|0)>>>0>=(f[j>>2]|0)>>>0);if(s>>>0>U>>>0){W=M;X=L;Y=s;break c}f[s>>2]=V;f[U>>2]=r;K=s+4|0;Q=f[K>>2]|0;if(N>>>0<=Q>>>0){R=S;l=57;break a}else{J=U;L=L+1|0;M=(M|0)==(s|0)?U:M;P=S}}}else{W=m;X=u;Y=B}while(0);if((Y|0)!=(W|0)){B=f[W>>2]|0;j=f[Y>>2]|0;Z=f[c>>2]|0;D=f[Z>>2]|0;C=(f[Z+4>>2]|0)-D>>3;if(C>>>0<=B>>>0){l=72;break a}k=D;if(C>>>0<=j>>>0){l=74;break a}if((f[k+(B<<3)>>2]|0)>>>0<(f[k+(j<<3)>>2]|0)>>>0){f[Y>>2]=B;f[W>>2]=j;_=X+1|0}else _=X}else _=X;if(!_){$=_d(h,Y,c)|0;j=Y+4|0;if(_d(j,a,c)|0){l=83;break}if($){g=j;continue}}j=Y;if((j-i|0)>=(b-j|0)){l=82;break}xb(h,Y,c);g=Y+4|0}if((l|0)==82){l=0;xb(Y+4|0,a,c);d=h;a=Y;continue}else if((l|0)==83){l=0;if($){l=84;break}else{d=h;a=Y;continue}}}switch(l|0){case 5:{l=f[e>>2]|0;Y=f[h>>2]|0;d=f[c>>2]|0;$=f[d>>2]|0;i=(f[d+4>>2]|0)-$>>3;if(i>>>0<=l>>>0)aq(d);_=$;if(i>>>0<=Y>>>0)aq(d);if((f[_+(l<<3)>>2]|0)>>>0>=(f[_+(Y<<3)>>2]|0)>>>0)return;f[h>>2]=l;f[e>>2]=Y;return}case 11:{Vg(h,h+4|0,e,c)|0;return}case 12:{jh(h,h+4|0,h+8|0,e,c)|0;return}case 13:{ig(h,h+4|0,h+8|0,h+12|0,e,c)|0;return}case 15:{ih(h,a,c);return}case 20:{aq(p);break}case 22:{aq(p);break}case 26:{aq(p);break}case 32:{aq(p);break}case 38:{aq(A);break}case 40:{aq(A);break}case 46:{aq(A);break}case 47:{aq(A);break}case 51:{aq(p);break}case 57:{aq(R);break}case 59:{aq(S);break}case 65:{if(N>>>0>(f[J+-4>>2]|0)>>>0)aq(S);else aq(S);break}case 66:{aq(S);break}case 72:{aq(Z);break}case 74:{aq(Z);break}case 84:return}}function yb(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0;d=a;a=b;a:while(1){b=a;e=a+-4|0;g=d;while(1){h=g;b:while(1){i=h;j=b-i|0;k=j>>2;switch(k|0){case 2:{l=5;break a;break}case 3:{l=11;break a;break}case 4:{l=12;break a;break}case 5:{l=13;break a;break}case 1:case 0:{l=84;break a;break}default:{}}if((j|0)<124){l=15;break a}m=h+(((k|0)/2|0)<<2)|0;if((j|0)>3996){j=(k|0)/4|0;n=ig(h,h+(j<<2)|0,m,m+(j<<2)|0,e,c)|0}else n=Vg(h,m,e,c)|0;o=f[h>>2]|0;j=f[m>>2]|0;p=f[c>>2]|0;k=f[p>>2]|0;q=(f[p+4>>2]|0)-k>>3;if(q>>>0<=o>>>0){l=20;break a}r=k;if(q>>>0<=j>>>0){l=22;break a}k=f[r+(o<<3)>>2]|0;s=f[r+(j<<3)>>2]|0;if(k>>>0<s>>>0){t=e;u=n;break}else v=e;while(1){v=v+-4|0;if((h|0)==(v|0))break;w=f[v>>2]|0;if(q>>>0<=w>>>0){l=51;break a}if((f[r+(w<<3)>>2]|0)>>>0<s>>>0){l=53;break b}}s=h+4|0;j=f[e>>2]|0;if(q>>>0<=j>>>0){l=26;break a}if(k>>>0<(f[r+(j<<3)>>2]|0)>>>0)x=s;else{if((s|0)==(e|0)){l=84;break a}else y=s;while(1){z=f[y>>2]|0;if(q>>>0<=z>>>0){l=32;break a}if(k>>>0<(f[r+(z<<3)>>2]|0)>>>0)break;s=y+4|0;if((s|0)==(e|0)){l=84;break a}else y=s}f[y>>2]=j;f[e>>2]=z;x=y+4|0}if((x|0)==(e|0)){l=84;break a}r=f[h>>2]|0;A=f[c>>2]|0;k=f[A>>2]|0;q=(f[A+4>>2]|0)-k>>3;if(q>>>0<=r>>>0){l=38;break a}s=k;k=e;B=x;C=r;while(1){r=s+(C<<3)|0;D=q>>>0>C>>>0;E=B;while(1){F=f[E>>2]|0;if(q>>>0<=F>>>0){l=40;break a}G=f[r>>2]|0;if(G>>>0<(f[s+(F<<3)>>2]|0)>>>0)break;if(D)E=E+4|0;else{l=38;break a}}if(q>>>0>C>>>0)H=k;else{l=46;break a}do{H=H+-4|0;I=f[H>>2]|0;if(q>>>0<=I>>>0){l=47;break a}}while(G>>>0<(f[s+(I<<3)>>2]|0)>>>0);if(E>>>0>=H>>>0){h=E;continue b}D=f[E>>2]|0;f[E>>2]=I;f[H>>2]=D;C=f[h>>2]|0;if(q>>>0<=C>>>0){l=38;break a}else{k=H;B=E+4|0}}}if((l|0)==53){l=0;f[h>>2]=w;f[v>>2]=o;t=v;u=n+1|0}B=h+4|0;c:do if(B>>>0<t>>>0){k=f[B>>2]|0;C=f[c>>2]|0;q=f[C>>2]|0;s=(f[C+4>>2]|0)-q>>3;if(s>>>0>k>>>0){J=t;K=B;L=u;M=m;N=s;O=q;P=C;Q=k}else{R=C;l=57;break a}while(1){C=f[c>>2]|0;k=C+4|0;q=f[M>>2]|0;s=K;j=O;D=N;S=P;r=Q;while(1){F=j;if(D>>>0<=q>>>0){l=59;break a}if((f[F+(r<<3)>>2]|0)>>>0>=(f[F+(q<<3)>>2]|0)>>>0)break;F=s+4|0;T=f[F>>2]|0;j=f[C>>2]|0;D=(f[k>>2]|0)-j>>3;if(D>>>0<=T>>>0){R=C;l=57;break a}else{s=F;S=C;r=T}}C=f[M>>2]|0;O=f[S>>2]|0;N=(f[S+4>>2]|0)-O>>3;D=O;j=D+(C<<3)|0;if(N>>>0>C>>>0)U=J;else{l=65;break a}do{U=U+-4|0;V=f[U>>2]|0;if(N>>>0<=V>>>0){l=66;break a}}while((f[D+(V<<3)>>2]|0)>>>0>=(f[j>>2]|0)>>>0);if(s>>>0>U>>>0){W=M;X=L;Y=s;break c}f[s>>2]=V;f[U>>2]=r;K=s+4|0;Q=f[K>>2]|0;if(N>>>0<=Q>>>0){R=S;l=57;break a}else{J=U;L=L+1|0;M=(M|0)==(s|0)?U:M;P=S}}}else{W=m;X=u;Y=B}while(0);if((Y|0)!=(W|0)){B=f[W>>2]|0;j=f[Y>>2]|0;Z=f[c>>2]|0;D=f[Z>>2]|0;C=(f[Z+4>>2]|0)-D>>3;if(C>>>0<=B>>>0){l=72;break a}k=D;if(C>>>0<=j>>>0){l=74;break a}if((f[k+(B<<3)>>2]|0)>>>0<(f[k+(j<<3)>>2]|0)>>>0){f[Y>>2]=B;f[W>>2]=j;_=X+1|0}else _=X}else _=X;if(!_){$=_d(h,Y,c)|0;j=Y+4|0;if(_d(j,a,c)|0){l=83;break}if($){g=j;continue}}j=Y;if((j-i|0)>=(b-j|0)){l=82;break}yb(h,Y,c);g=Y+4|0}if((l|0)==82){l=0;yb(Y+4|0,a,c);d=h;a=Y;continue}else if((l|0)==83){l=0;if($){l=84;break}else{d=h;a=Y;continue}}}switch(l|0){case 5:{l=f[e>>2]|0;Y=f[h>>2]|0;d=f[c>>2]|0;$=f[d>>2]|0;i=(f[d+4>>2]|0)-$>>3;if(i>>>0<=l>>>0)aq(d);_=$;if(i>>>0<=Y>>>0)aq(d);if((f[_+(l<<3)>>2]|0)>>>0>=(f[_+(Y<<3)>>2]|0)>>>0)return;f[h>>2]=l;f[e>>2]=Y;return}case 11:{Vg(h,h+4|0,e,c)|0;return}case 12:{jh(h,h+4|0,h+8|0,e,c)|0;return}case 13:{ig(h,h+4|0,h+8|0,h+12|0,e,c)|0;return}case 15:{ih(h,a,c);return}case 20:{aq(p);break}case 22:{aq(p);break}case 26:{aq(p);break}case 32:{aq(p);break}case 38:{aq(A);break}case 40:{aq(A);break}case 46:{aq(A);break}case 47:{aq(A);break}case 51:{aq(p);break}case 57:{aq(R);break}case 59:{aq(S);break}case 65:{if(N>>>0>(f[J+-4>>2]|0)>>>0)aq(S);else aq(S);break}case 66:{aq(S);break}case 72:{aq(Z);break}case 74:{aq(Z);break}case 84:return}}function zb(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0;d=a;a=b;a:while(1){b=a;e=a+-4|0;g=d;while(1){h=g;b:while(1){i=h;j=b-i|0;k=j>>2;switch(k|0){case 2:{l=5;break a;break}case 3:{l=11;break a;break}case 4:{l=12;break a;break}case 5:{l=13;break a;break}case 1:case 0:{l=84;break a;break}default:{}}if((j|0)<124){l=15;break a}m=h+(((k|0)/2|0)<<2)|0;if((j|0)>3996){j=(k|0)/4|0;n=ig(h,h+(j<<2)|0,m,m+(j<<2)|0,e,c)|0}else n=Vg(h,m,e,c)|0;o=f[h>>2]|0;j=f[m>>2]|0;p=f[c>>2]|0;k=f[p>>2]|0;q=(f[p+4>>2]|0)-k>>3;if(q>>>0<=o>>>0){l=20;break a}r=k;if(q>>>0<=j>>>0){l=22;break a}k=f[r+(o<<3)>>2]|0;s=f[r+(j<<3)>>2]|0;if(k>>>0<s>>>0){t=e;u=n;break}else v=e;while(1){v=v+-4|0;if((h|0)==(v|0))break;w=f[v>>2]|0;if(q>>>0<=w>>>0){l=51;break a}if((f[r+(w<<3)>>2]|0)>>>0<s>>>0){l=53;break b}}s=h+4|0;j=f[e>>2]|0;if(q>>>0<=j>>>0){l=26;break a}if(k>>>0<(f[r+(j<<3)>>2]|0)>>>0)x=s;else{if((s|0)==(e|0)){l=84;break a}else y=s;while(1){z=f[y>>2]|0;if(q>>>0<=z>>>0){l=32;break a}if(k>>>0<(f[r+(z<<3)>>2]|0)>>>0)break;s=y+4|0;if((s|0)==(e|0)){l=84;break a}else y=s}f[y>>2]=j;f[e>>2]=z;x=y+4|0}if((x|0)==(e|0)){l=84;break a}r=f[h>>2]|0;A=f[c>>2]|0;k=f[A>>2]|0;q=(f[A+4>>2]|0)-k>>3;if(q>>>0<=r>>>0){l=38;break a}s=k;k=e;B=x;C=r;while(1){r=s+(C<<3)|0;D=q>>>0>C>>>0;E=B;while(1){F=f[E>>2]|0;if(q>>>0<=F>>>0){l=40;break a}G=f[r>>2]|0;if(G>>>0<(f[s+(F<<3)>>2]|0)>>>0)break;if(D)E=E+4|0;else{l=38;break a}}if(q>>>0>C>>>0)H=k;else{l=46;break a}do{H=H+-4|0;I=f[H>>2]|0;if(q>>>0<=I>>>0){l=47;break a}}while(G>>>0<(f[s+(I<<3)>>2]|0)>>>0);if(E>>>0>=H>>>0){h=E;continue b}D=f[E>>2]|0;f[E>>2]=I;f[H>>2]=D;C=f[h>>2]|0;if(q>>>0<=C>>>0){l=38;break a}else{k=H;B=E+4|0}}}if((l|0)==53){l=0;f[h>>2]=w;f[v>>2]=o;t=v;u=n+1|0}B=h+4|0;c:do if(B>>>0<t>>>0){k=f[B>>2]|0;C=f[c>>2]|0;q=f[C>>2]|0;s=(f[C+4>>2]|0)-q>>3;if(s>>>0>k>>>0){J=t;K=B;L=u;M=m;N=s;O=q;P=C;Q=k}else{R=C;l=57;break a}while(1){C=f[c>>2]|0;k=C+4|0;q=f[M>>2]|0;s=K;j=O;D=N;S=P;r=Q;while(1){F=j;if(D>>>0<=q>>>0){l=59;break a}if((f[F+(r<<3)>>2]|0)>>>0>=(f[F+(q<<3)>>2]|0)>>>0)break;F=s+4|0;T=f[F>>2]|0;j=f[C>>2]|0;D=(f[k>>2]|0)-j>>3;if(D>>>0<=T>>>0){R=C;l=57;break a}else{s=F;S=C;r=T}}C=f[M>>2]|0;O=f[S>>2]|0;N=(f[S+4>>2]|0)-O>>3;D=O;j=D+(C<<3)|0;if(N>>>0>C>>>0)U=J;else{l=65;break a}do{U=U+-4|0;V=f[U>>2]|0;if(N>>>0<=V>>>0){l=66;break a}}while((f[D+(V<<3)>>2]|0)>>>0>=(f[j>>2]|0)>>>0);if(s>>>0>U>>>0){W=M;X=L;Y=s;break c}f[s>>2]=V;f[U>>2]=r;K=s+4|0;Q=f[K>>2]|0;if(N>>>0<=Q>>>0){R=S;l=57;break a}else{J=U;L=L+1|0;M=(M|0)==(s|0)?U:M;P=S}}}else{W=m;X=u;Y=B}while(0);if((Y|0)!=(W|0)){B=f[W>>2]|0;j=f[Y>>2]|0;Z=f[c>>2]|0;D=f[Z>>2]|0;C=(f[Z+4>>2]|0)-D>>3;if(C>>>0<=B>>>0){l=72;break a}k=D;if(C>>>0<=j>>>0){l=74;break a}if((f[k+(B<<3)>>2]|0)>>>0<(f[k+(j<<3)>>2]|0)>>>0){f[Y>>2]=B;f[W>>2]=j;_=X+1|0}else _=X}else _=X;if(!_){$=_d(h,Y,c)|0;j=Y+4|0;if(_d(j,a,c)|0){l=83;break}if($){g=j;continue}}j=Y;if((j-i|0)>=(b-j|0)){l=82;break}zb(h,Y,c);g=Y+4|0}if((l|0)==82){l=0;zb(Y+4|0,a,c);d=h;a=Y;continue}else if((l|0)==83){l=0;if($){l=84;break}else{d=h;a=Y;continue}}}switch(l|0){case 5:{l=f[e>>2]|0;Y=f[h>>2]|0;d=f[c>>2]|0;$=f[d>>2]|0;i=(f[d+4>>2]|0)-$>>3;if(i>>>0<=l>>>0)aq(d);_=$;if(i>>>0<=Y>>>0)aq(d);if((f[_+(l<<3)>>2]|0)>>>0>=(f[_+(Y<<3)>>2]|0)>>>0)return;f[h>>2]=l;f[e>>2]=Y;return}case 11:{Vg(h,h+4|0,e,c)|0;return}case 12:{jh(h,h+4|0,h+8|0,e,c)|0;return}case 13:{ig(h,h+4|0,h+8|0,h+12|0,e,c)|0;return}case 15:{ih(h,a,c);return}case 20:{aq(p);break}case 22:{aq(p);break}case 26:{aq(p);break}case 32:{aq(p);break}case 38:{aq(A);break}case 40:{aq(A);break}case 46:{aq(A);break}case 47:{aq(A);break}case 51:{aq(p);break}case 57:{aq(R);break}case 59:{aq(S);break}case 65:{if(N>>>0>(f[J+-4>>2]|0)>>>0)aq(S);else aq(S);break}case 66:{aq(S);break}case 72:{aq(Z);break}case 74:{aq(Z);break}case 84:return}}function Ab(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0;d=a;a=b;a:while(1){b=a;e=a+-4|0;g=d;while(1){h=g;b:while(1){i=h;j=b-i|0;k=j>>2;switch(k|0){case 2:{l=5;break a;break}case 3:{l=11;break a;break}case 4:{l=12;break a;break}case 5:{l=13;break a;break}case 1:case 0:{l=84;break a;break}default:{}}if((j|0)<124){l=15;break a}m=h+(((k|0)/2|0)<<2)|0;if((j|0)>3996){j=(k|0)/4|0;n=ig(h,h+(j<<2)|0,m,m+(j<<2)|0,e,c)|0}else n=Vg(h,m,e,c)|0;o=f[h>>2]|0;j=f[m>>2]|0;p=f[c>>2]|0;k=f[p>>2]|0;q=(f[p+4>>2]|0)-k>>3;if(q>>>0<=o>>>0){l=20;break a}r=k;if(q>>>0<=j>>>0){l=22;break a}k=f[r+(o<<3)>>2]|0;s=f[r+(j<<3)>>2]|0;if(k>>>0<s>>>0){t=e;u=n;break}else v=e;while(1){v=v+-4|0;if((h|0)==(v|0))break;w=f[v>>2]|0;if(q>>>0<=w>>>0){l=51;break a}if((f[r+(w<<3)>>2]|0)>>>0<s>>>0){l=53;break b}}s=h+4|0;j=f[e>>2]|0;if(q>>>0<=j>>>0){l=26;break a}if(k>>>0<(f[r+(j<<3)>>2]|0)>>>0)x=s;else{if((s|0)==(e|0)){l=84;break a}else y=s;while(1){z=f[y>>2]|0;if(q>>>0<=z>>>0){l=32;break a}if(k>>>0<(f[r+(z<<3)>>2]|0)>>>0)break;s=y+4|0;if((s|0)==(e|0)){l=84;break a}else y=s}f[y>>2]=j;f[e>>2]=z;x=y+4|0}if((x|0)==(e|0)){l=84;break a}r=f[h>>2]|0;A=f[c>>2]|0;k=f[A>>2]|0;q=(f[A+4>>2]|0)-k>>3;if(q>>>0<=r>>>0){l=38;break a}s=k;k=e;B=x;C=r;while(1){r=s+(C<<3)|0;D=q>>>0>C>>>0;E=B;while(1){F=f[E>>2]|0;if(q>>>0<=F>>>0){l=40;break a}G=f[r>>2]|0;if(G>>>0<(f[s+(F<<3)>>2]|0)>>>0)break;if(D)E=E+4|0;else{l=38;break a}}if(q>>>0>C>>>0)H=k;else{l=46;break a}do{H=H+-4|0;I=f[H>>2]|0;if(q>>>0<=I>>>0){l=47;break a}}while(G>>>0<(f[s+(I<<3)>>2]|0)>>>0);if(E>>>0>=H>>>0){h=E;continue b}D=f[E>>2]|0;f[E>>2]=I;f[H>>2]=D;C=f[h>>2]|0;if(q>>>0<=C>>>0){l=38;break a}else{k=H;B=E+4|0}}}if((l|0)==53){l=0;f[h>>2]=w;f[v>>2]=o;t=v;u=n+1|0}B=h+4|0;c:do if(B>>>0<t>>>0){k=f[B>>2]|0;C=f[c>>2]|0;q=f[C>>2]|0;s=(f[C+4>>2]|0)-q>>3;if(s>>>0>k>>>0){J=t;K=B;L=u;M=m;N=s;O=q;P=C;Q=k}else{R=C;l=57;break a}while(1){C=f[c>>2]|0;k=C+4|0;q=f[M>>2]|0;s=K;j=O;D=N;S=P;r=Q;while(1){F=j;if(D>>>0<=q>>>0){l=59;break a}if((f[F+(r<<3)>>2]|0)>>>0>=(f[F+(q<<3)>>2]|0)>>>0)break;F=s+4|0;T=f[F>>2]|0;j=f[C>>2]|0;D=(f[k>>2]|0)-j>>3;if(D>>>0<=T>>>0){R=C;l=57;break a}else{s=F;S=C;r=T}}C=f[M>>2]|0;O=f[S>>2]|0;N=(f[S+4>>2]|0)-O>>3;D=O;j=D+(C<<3)|0;if(N>>>0>C>>>0)U=J;else{l=65;break a}do{U=U+-4|0;V=f[U>>2]|0;if(N>>>0<=V>>>0){l=66;break a}}while((f[D+(V<<3)>>2]|0)>>>0>=(f[j>>2]|0)>>>0);if(s>>>0>U>>>0){W=M;X=L;Y=s;break c}f[s>>2]=V;f[U>>2]=r;K=s+4|0;Q=f[K>>2]|0;if(N>>>0<=Q>>>0){R=S;l=57;break a}else{J=U;L=L+1|0;M=(M|0)==(s|0)?U:M;P=S}}}else{W=m;X=u;Y=B}while(0);if((Y|0)!=(W|0)){B=f[W>>2]|0;j=f[Y>>2]|0;Z=f[c>>2]|0;D=f[Z>>2]|0;C=(f[Z+4>>2]|0)-D>>3;if(C>>>0<=B>>>0){l=72;break a}k=D;if(C>>>0<=j>>>0){l=74;break a}if((f[k+(B<<3)>>2]|0)>>>0<(f[k+(j<<3)>>2]|0)>>>0){f[Y>>2]=B;f[W>>2]=j;_=X+1|0}else _=X}else _=X;if(!_){$=_d(h,Y,c)|0;j=Y+4|0;if(_d(j,a,c)|0){l=83;break}if($){g=j;continue}}j=Y;if((j-i|0)>=(b-j|0)){l=82;break}Ab(h,Y,c);g=Y+4|0}if((l|0)==82){l=0;Ab(Y+4|0,a,c);d=h;a=Y;continue}else if((l|0)==83){l=0;if($){l=84;break}else{d=h;a=Y;continue}}}switch(l|0){case 5:{l=f[e>>2]|0;Y=f[h>>2]|0;d=f[c>>2]|0;$=f[d>>2]|0;i=(f[d+4>>2]|0)-$>>3;if(i>>>0<=l>>>0)aq(d);_=$;if(i>>>0<=Y>>>0)aq(d);if((f[_+(l<<3)>>2]|0)>>>0>=(f[_+(Y<<3)>>2]|0)>>>0)return;f[h>>2]=l;f[e>>2]=Y;return}case 11:{Vg(h,h+4|0,e,c)|0;return}case 12:{jh(h,h+4|0,h+8|0,e,c)|0;return}case 13:{ig(h,h+4|0,h+8|0,h+12|0,e,c)|0;return}case 15:{ih(h,a,c);return}case 20:{aq(p);break}case 22:{aq(p);break}case 26:{aq(p);break}case 32:{aq(p);break}case 38:{aq(A);break}case 40:{aq(A);break}case 46:{aq(A);break}case 47:{aq(A);break}case 51:{aq(p);break}case 57:{aq(R);break}case 59:{aq(S);break}case 65:{if(N>>>0>(f[J+-4>>2]|0)>>>0)aq(S);else aq(S);break}case 66:{aq(S);break}case 72:{aq(Z);break}case 74:{aq(Z);break}case 84:return}}\nfunction Bb(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0;d=a;a=b;a:while(1){b=a;e=a+-4|0;g=d;while(1){h=g;b:while(1){i=h;j=b-i|0;k=j>>2;switch(k|0){case 2:{l=5;break a;break}case 3:{l=11;break a;break}case 4:{l=12;break a;break}case 5:{l=13;break a;break}case 1:case 0:{l=84;break a;break}default:{}}if((j|0)<124){l=15;break a}m=h+(((k|0)/2|0)<<2)|0;if((j|0)>3996){j=(k|0)/4|0;n=ig(h,h+(j<<2)|0,m,m+(j<<2)|0,e,c)|0}else n=Vg(h,m,e,c)|0;o=f[h>>2]|0;j=f[m>>2]|0;p=f[c>>2]|0;k=f[p>>2]|0;q=(f[p+4>>2]|0)-k>>3;if(q>>>0<=o>>>0){l=20;break a}r=k;if(q>>>0<=j>>>0){l=22;break a}k=f[r+(o<<3)>>2]|0;s=f[r+(j<<3)>>2]|0;if(k>>>0<s>>>0){t=e;u=n;break}else v=e;while(1){v=v+-4|0;if((h|0)==(v|0))break;w=f[v>>2]|0;if(q>>>0<=w>>>0){l=51;break a}if((f[r+(w<<3)>>2]|0)>>>0<s>>>0){l=53;break b}}s=h+4|0;j=f[e>>2]|0;if(q>>>0<=j>>>0){l=26;break a}if(k>>>0<(f[r+(j<<3)>>2]|0)>>>0)x=s;else{if((s|0)==(e|0)){l=84;break a}else y=s;while(1){z=f[y>>2]|0;if(q>>>0<=z>>>0){l=32;break a}if(k>>>0<(f[r+(z<<3)>>2]|0)>>>0)break;s=y+4|0;if((s|0)==(e|0)){l=84;break a}else y=s}f[y>>2]=j;f[e>>2]=z;x=y+4|0}if((x|0)==(e|0)){l=84;break a}r=f[h>>2]|0;A=f[c>>2]|0;k=f[A>>2]|0;q=(f[A+4>>2]|0)-k>>3;if(q>>>0<=r>>>0){l=38;break a}s=k;k=e;B=x;C=r;while(1){r=s+(C<<3)|0;D=q>>>0>C>>>0;E=B;while(1){F=f[E>>2]|0;if(q>>>0<=F>>>0){l=40;break a}G=f[r>>2]|0;if(G>>>0<(f[s+(F<<3)>>2]|0)>>>0)break;if(D)E=E+4|0;else{l=38;break a}}if(q>>>0>C>>>0)H=k;else{l=46;break a}do{H=H+-4|0;I=f[H>>2]|0;if(q>>>0<=I>>>0){l=47;break a}}while(G>>>0<(f[s+(I<<3)>>2]|0)>>>0);if(E>>>0>=H>>>0){h=E;continue b}D=f[E>>2]|0;f[E>>2]=I;f[H>>2]=D;C=f[h>>2]|0;if(q>>>0<=C>>>0){l=38;break a}else{k=H;B=E+4|0}}}if((l|0)==53){l=0;f[h>>2]=w;f[v>>2]=o;t=v;u=n+1|0}B=h+4|0;c:do if(B>>>0<t>>>0){k=f[B>>2]|0;C=f[c>>2]|0;q=f[C>>2]|0;s=(f[C+4>>2]|0)-q>>3;if(s>>>0>k>>>0){J=t;K=B;L=u;M=m;N=s;O=q;P=C;Q=k}else{R=C;l=57;break a}while(1){C=f[c>>2]|0;k=C+4|0;q=f[M>>2]|0;s=K;j=O;D=N;S=P;r=Q;while(1){F=j;if(D>>>0<=q>>>0){l=59;break a}if((f[F+(r<<3)>>2]|0)>>>0>=(f[F+(q<<3)>>2]|0)>>>0)break;F=s+4|0;T=f[F>>2]|0;j=f[C>>2]|0;D=(f[k>>2]|0)-j>>3;if(D>>>0<=T>>>0){R=C;l=57;break a}else{s=F;S=C;r=T}}C=f[M>>2]|0;O=f[S>>2]|0;N=(f[S+4>>2]|0)-O>>3;D=O;j=D+(C<<3)|0;if(N>>>0>C>>>0)U=J;else{l=65;break a}do{U=U+-4|0;V=f[U>>2]|0;if(N>>>0<=V>>>0){l=66;break a}}while((f[D+(V<<3)>>2]|0)>>>0>=(f[j>>2]|0)>>>0);if(s>>>0>U>>>0){W=M;X=L;Y=s;break c}f[s>>2]=V;f[U>>2]=r;K=s+4|0;Q=f[K>>2]|0;if(N>>>0<=Q>>>0){R=S;l=57;break a}else{J=U;L=L+1|0;M=(M|0)==(s|0)?U:M;P=S}}}else{W=m;X=u;Y=B}while(0);if((Y|0)!=(W|0)){B=f[W>>2]|0;j=f[Y>>2]|0;Z=f[c>>2]|0;D=f[Z>>2]|0;C=(f[Z+4>>2]|0)-D>>3;if(C>>>0<=B>>>0){l=72;break a}k=D;if(C>>>0<=j>>>0){l=74;break a}if((f[k+(B<<3)>>2]|0)>>>0<(f[k+(j<<3)>>2]|0)>>>0){f[Y>>2]=B;f[W>>2]=j;_=X+1|0}else _=X}else _=X;if(!_){$=_d(h,Y,c)|0;j=Y+4|0;if(_d(j,a,c)|0){l=83;break}if($){g=j;continue}}j=Y;if((j-i|0)>=(b-j|0)){l=82;break}Bb(h,Y,c);g=Y+4|0}if((l|0)==82){l=0;Bb(Y+4|0,a,c);d=h;a=Y;continue}else if((l|0)==83){l=0;if($){l=84;break}else{d=h;a=Y;continue}}}switch(l|0){case 5:{l=f[e>>2]|0;Y=f[h>>2]|0;d=f[c>>2]|0;$=f[d>>2]|0;i=(f[d+4>>2]|0)-$>>3;if(i>>>0<=l>>>0)aq(d);_=$;if(i>>>0<=Y>>>0)aq(d);if((f[_+(l<<3)>>2]|0)>>>0>=(f[_+(Y<<3)>>2]|0)>>>0)return;f[h>>2]=l;f[e>>2]=Y;return}case 11:{Vg(h,h+4|0,e,c)|0;return}case 12:{jh(h,h+4|0,h+8|0,e,c)|0;return}case 13:{ig(h,h+4|0,h+8|0,h+12|0,e,c)|0;return}case 15:{ih(h,a,c);return}case 20:{aq(p);break}case 22:{aq(p);break}case 26:{aq(p);break}case 32:{aq(p);break}case 38:{aq(A);break}case 40:{aq(A);break}case 46:{aq(A);break}case 47:{aq(A);break}case 51:{aq(p);break}case 57:{aq(R);break}case 59:{aq(S);break}case 65:{if(N>>>0>(f[J+-4>>2]|0)>>>0)aq(S);else aq(S);break}case 66:{aq(S);break}case 72:{aq(Z);break}case 74:{aq(Z);break}case 84:return}}function Cb(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0;d=a;a=b;a:while(1){b=a;e=a+-4|0;g=d;while(1){h=g;b:while(1){i=h;j=b-i|0;k=j>>2;switch(k|0){case 2:{l=5;break a;break}case 3:{l=11;break a;break}case 4:{l=12;break a;break}case 5:{l=13;break a;break}case 1:case 0:{l=84;break a;break}default:{}}if((j|0)<124){l=15;break a}m=h+(((k|0)/2|0)<<2)|0;if((j|0)>3996){j=(k|0)/4|0;n=ig(h,h+(j<<2)|0,m,m+(j<<2)|0,e,c)|0}else n=Vg(h,m,e,c)|0;o=f[h>>2]|0;j=f[m>>2]|0;p=f[c>>2]|0;k=f[p>>2]|0;q=(f[p+4>>2]|0)-k>>3;if(q>>>0<=o>>>0){l=20;break a}r=k;if(q>>>0<=j>>>0){l=22;break a}k=f[r+(o<<3)>>2]|0;s=f[r+(j<<3)>>2]|0;if(k>>>0<s>>>0){t=e;u=n;break}else v=e;while(1){v=v+-4|0;if((h|0)==(v|0))break;w=f[v>>2]|0;if(q>>>0<=w>>>0){l=51;break a}if((f[r+(w<<3)>>2]|0)>>>0<s>>>0){l=53;break b}}s=h+4|0;j=f[e>>2]|0;if(q>>>0<=j>>>0){l=26;break a}if(k>>>0<(f[r+(j<<3)>>2]|0)>>>0)x=s;else{if((s|0)==(e|0)){l=84;break a}else y=s;while(1){z=f[y>>2]|0;if(q>>>0<=z>>>0){l=32;break a}if(k>>>0<(f[r+(z<<3)>>2]|0)>>>0)break;s=y+4|0;if((s|0)==(e|0)){l=84;break a}else y=s}f[y>>2]=j;f[e>>2]=z;x=y+4|0}if((x|0)==(e|0)){l=84;break a}r=f[h>>2]|0;A=f[c>>2]|0;k=f[A>>2]|0;q=(f[A+4>>2]|0)-k>>3;if(q>>>0<=r>>>0){l=38;break a}s=k;k=e;B=x;C=r;while(1){r=s+(C<<3)|0;D=q>>>0>C>>>0;E=B;while(1){F=f[E>>2]|0;if(q>>>0<=F>>>0){l=40;break a}G=f[r>>2]|0;if(G>>>0<(f[s+(F<<3)>>2]|0)>>>0)break;if(D)E=E+4|0;else{l=38;break a}}if(q>>>0>C>>>0)H=k;else{l=46;break a}do{H=H+-4|0;I=f[H>>2]|0;if(q>>>0<=I>>>0){l=47;break a}}while(G>>>0<(f[s+(I<<3)>>2]|0)>>>0);if(E>>>0>=H>>>0){h=E;continue b}D=f[E>>2]|0;f[E>>2]=I;f[H>>2]=D;C=f[h>>2]|0;if(q>>>0<=C>>>0){l=38;break a}else{k=H;B=E+4|0}}}if((l|0)==53){l=0;f[h>>2]=w;f[v>>2]=o;t=v;u=n+1|0}B=h+4|0;c:do if(B>>>0<t>>>0){k=f[B>>2]|0;C=f[c>>2]|0;q=f[C>>2]|0;s=(f[C+4>>2]|0)-q>>3;if(s>>>0>k>>>0){J=t;K=B;L=u;M=m;N=s;O=q;P=C;Q=k}else{R=C;l=57;break a}while(1){C=f[c>>2]|0;k=C+4|0;q=f[M>>2]|0;s=K;j=O;D=N;S=P;r=Q;while(1){F=j;if(D>>>0<=q>>>0){l=59;break a}if((f[F+(r<<3)>>2]|0)>>>0>=(f[F+(q<<3)>>2]|0)>>>0)break;F=s+4|0;T=f[F>>2]|0;j=f[C>>2]|0;D=(f[k>>2]|0)-j>>3;if(D>>>0<=T>>>0){R=C;l=57;break a}else{s=F;S=C;r=T}}C=f[M>>2]|0;O=f[S>>2]|0;N=(f[S+4>>2]|0)-O>>3;D=O;j=D+(C<<3)|0;if(N>>>0>C>>>0)U=J;else{l=65;break a}do{U=U+-4|0;V=f[U>>2]|0;if(N>>>0<=V>>>0){l=66;break a}}while((f[D+(V<<3)>>2]|0)>>>0>=(f[j>>2]|0)>>>0);if(s>>>0>U>>>0){W=M;X=L;Y=s;break c}f[s>>2]=V;f[U>>2]=r;K=s+4|0;Q=f[K>>2]|0;if(N>>>0<=Q>>>0){R=S;l=57;break a}else{J=U;L=L+1|0;M=(M|0)==(s|0)?U:M;P=S}}}else{W=m;X=u;Y=B}while(0);if((Y|0)!=(W|0)){B=f[W>>2]|0;j=f[Y>>2]|0;Z=f[c>>2]|0;D=f[Z>>2]|0;C=(f[Z+4>>2]|0)-D>>3;if(C>>>0<=B>>>0){l=72;break a}k=D;if(C>>>0<=j>>>0){l=74;break a}if((f[k+(B<<3)>>2]|0)>>>0<(f[k+(j<<3)>>2]|0)>>>0){f[Y>>2]=B;f[W>>2]=j;_=X+1|0}else _=X}else _=X;if(!_){$=_d(h,Y,c)|0;j=Y+4|0;if(_d(j,a,c)|0){l=83;break}if($){g=j;continue}}j=Y;if((j-i|0)>=(b-j|0)){l=82;break}Cb(h,Y,c);g=Y+4|0}if((l|0)==82){l=0;Cb(Y+4|0,a,c);d=h;a=Y;continue}else if((l|0)==83){l=0;if($){l=84;break}else{d=h;a=Y;continue}}}switch(l|0){case 5:{l=f[e>>2]|0;Y=f[h>>2]|0;d=f[c>>2]|0;$=f[d>>2]|0;i=(f[d+4>>2]|0)-$>>3;if(i>>>0<=l>>>0)aq(d);_=$;if(i>>>0<=Y>>>0)aq(d);if((f[_+(l<<3)>>2]|0)>>>0>=(f[_+(Y<<3)>>2]|0)>>>0)return;f[h>>2]=l;f[e>>2]=Y;return}case 11:{Vg(h,h+4|0,e,c)|0;return}case 12:{jh(h,h+4|0,h+8|0,e,c)|0;return}case 13:{ig(h,h+4|0,h+8|0,h+12|0,e,c)|0;return}case 15:{ih(h,a,c);return}case 20:{aq(p);break}case 22:{aq(p);break}case 26:{aq(p);break}case 32:{aq(p);break}case 38:{aq(A);break}case 40:{aq(A);break}case 46:{aq(A);break}case 47:{aq(A);break}case 51:{aq(p);break}case 57:{aq(R);break}case 59:{aq(S);break}case 65:{if(N>>>0>(f[J+-4>>2]|0)>>>0)aq(S);else aq(S);break}case 66:{aq(S);break}case 72:{aq(Z);break}case 74:{aq(Z);break}case 84:return}}function Db(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0;d=a;a=b;a:while(1){b=a;e=a+-4|0;g=d;while(1){h=g;b:while(1){i=h;j=b-i|0;k=j>>2;switch(k|0){case 2:{l=5;break a;break}case 3:{l=11;break a;break}case 4:{l=12;break a;break}case 5:{l=13;break a;break}case 1:case 0:{l=84;break a;break}default:{}}if((j|0)<124){l=15;break a}m=h+(((k|0)/2|0)<<2)|0;if((j|0)>3996){j=(k|0)/4|0;n=ig(h,h+(j<<2)|0,m,m+(j<<2)|0,e,c)|0}else n=Vg(h,m,e,c)|0;o=f[h>>2]|0;j=f[m>>2]|0;p=f[c>>2]|0;k=f[p>>2]|0;q=(f[p+4>>2]|0)-k>>3;if(q>>>0<=o>>>0){l=20;break a}r=k;if(q>>>0<=j>>>0){l=22;break a}k=f[r+(o<<3)>>2]|0;s=f[r+(j<<3)>>2]|0;if(k>>>0<s>>>0){t=e;u=n;break}else v=e;while(1){v=v+-4|0;if((h|0)==(v|0))break;w=f[v>>2]|0;if(q>>>0<=w>>>0){l=51;break a}if((f[r+(w<<3)>>2]|0)>>>0<s>>>0){l=53;break b}}s=h+4|0;j=f[e>>2]|0;if(q>>>0<=j>>>0){l=26;break a}if(k>>>0<(f[r+(j<<3)>>2]|0)>>>0)x=s;else{if((s|0)==(e|0)){l=84;break a}else y=s;while(1){z=f[y>>2]|0;if(q>>>0<=z>>>0){l=32;break a}if(k>>>0<(f[r+(z<<3)>>2]|0)>>>0)break;s=y+4|0;if((s|0)==(e|0)){l=84;break a}else y=s}f[y>>2]=j;f[e>>2]=z;x=y+4|0}if((x|0)==(e|0)){l=84;break a}r=f[h>>2]|0;A=f[c>>2]|0;k=f[A>>2]|0;q=(f[A+4>>2]|0)-k>>3;if(q>>>0<=r>>>0){l=38;break a}s=k;k=e;B=x;C=r;while(1){r=s+(C<<3)|0;D=q>>>0>C>>>0;E=B;while(1){F=f[E>>2]|0;if(q>>>0<=F>>>0){l=40;break a}G=f[r>>2]|0;if(G>>>0<(f[s+(F<<3)>>2]|0)>>>0)break;if(D)E=E+4|0;else{l=38;break a}}if(q>>>0>C>>>0)H=k;else{l=46;break a}do{H=H+-4|0;I=f[H>>2]|0;if(q>>>0<=I>>>0){l=47;break a}}while(G>>>0<(f[s+(I<<3)>>2]|0)>>>0);if(E>>>0>=H>>>0){h=E;continue b}D=f[E>>2]|0;f[E>>2]=I;f[H>>2]=D;C=f[h>>2]|0;if(q>>>0<=C>>>0){l=38;break a}else{k=H;B=E+4|0}}}if((l|0)==53){l=0;f[h>>2]=w;f[v>>2]=o;t=v;u=n+1|0}B=h+4|0;c:do if(B>>>0<t>>>0){k=f[B>>2]|0;C=f[c>>2]|0;q=f[C>>2]|0;s=(f[C+4>>2]|0)-q>>3;if(s>>>0>k>>>0){J=t;K=B;L=u;M=m;N=s;O=q;P=C;Q=k}else{R=C;l=57;break a}while(1){C=f[c>>2]|0;k=C+4|0;q=f[M>>2]|0;s=K;j=O;D=N;S=P;r=Q;while(1){F=j;if(D>>>0<=q>>>0){l=59;break a}if((f[F+(r<<3)>>2]|0)>>>0>=(f[F+(q<<3)>>2]|0)>>>0)break;F=s+4|0;T=f[F>>2]|0;j=f[C>>2]|0;D=(f[k>>2]|0)-j>>3;if(D>>>0<=T>>>0){R=C;l=57;break a}else{s=F;S=C;r=T}}C=f[M>>2]|0;O=f[S>>2]|0;N=(f[S+4>>2]|0)-O>>3;D=O;j=D+(C<<3)|0;if(N>>>0>C>>>0)U=J;else{l=65;break a}do{U=U+-4|0;V=f[U>>2]|0;if(N>>>0<=V>>>0){l=66;break a}}while((f[D+(V<<3)>>2]|0)>>>0>=(f[j>>2]|0)>>>0);if(s>>>0>U>>>0){W=M;X=L;Y=s;break c}f[s>>2]=V;f[U>>2]=r;K=s+4|0;Q=f[K>>2]|0;if(N>>>0<=Q>>>0){R=S;l=57;break a}else{J=U;L=L+1|0;M=(M|0)==(s|0)?U:M;P=S}}}else{W=m;X=u;Y=B}while(0);if((Y|0)!=(W|0)){B=f[W>>2]|0;j=f[Y>>2]|0;Z=f[c>>2]|0;D=f[Z>>2]|0;C=(f[Z+4>>2]|0)-D>>3;if(C>>>0<=B>>>0){l=72;break a}k=D;if(C>>>0<=j>>>0){l=74;break a}if((f[k+(B<<3)>>2]|0)>>>0<(f[k+(j<<3)>>2]|0)>>>0){f[Y>>2]=B;f[W>>2]=j;_=X+1|0}else _=X}else _=X;if(!_){$=_d(h,Y,c)|0;j=Y+4|0;if(_d(j,a,c)|0){l=83;break}if($){g=j;continue}}j=Y;if((j-i|0)>=(b-j|0)){l=82;break}Db(h,Y,c);g=Y+4|0}if((l|0)==82){l=0;Db(Y+4|0,a,c);d=h;a=Y;continue}else if((l|0)==83){l=0;if($){l=84;break}else{d=h;a=Y;continue}}}switch(l|0){case 5:{l=f[e>>2]|0;Y=f[h>>2]|0;d=f[c>>2]|0;$=f[d>>2]|0;i=(f[d+4>>2]|0)-$>>3;if(i>>>0<=l>>>0)aq(d);_=$;if(i>>>0<=Y>>>0)aq(d);if((f[_+(l<<3)>>2]|0)>>>0>=(f[_+(Y<<3)>>2]|0)>>>0)return;f[h>>2]=l;f[e>>2]=Y;return}case 11:{Vg(h,h+4|0,e,c)|0;return}case 12:{jh(h,h+4|0,h+8|0,e,c)|0;return}case 13:{ig(h,h+4|0,h+8|0,h+12|0,e,c)|0;return}case 15:{ih(h,a,c);return}case 20:{aq(p);break}case 22:{aq(p);break}case 26:{aq(p);break}case 32:{aq(p);break}case 38:{aq(A);break}case 40:{aq(A);break}case 46:{aq(A);break}case 47:{aq(A);break}case 51:{aq(p);break}case 57:{aq(R);break}case 59:{aq(S);break}case 65:{if(N>>>0>(f[J+-4>>2]|0)>>>0)aq(S);else aq(S);break}case 66:{aq(S);break}case 72:{aq(Z);break}case 74:{aq(Z);break}case 84:return}}function Eb(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0;d=a;a=b;a:while(1){b=a;e=a+-4|0;g=d;while(1){h=g;b:while(1){i=h;j=b-i|0;k=j>>2;switch(k|0){case 2:{l=5;break a;break}case 3:{l=11;break a;break}case 4:{l=12;break a;break}case 5:{l=13;break a;break}case 1:case 0:{l=84;break a;break}default:{}}if((j|0)<124){l=15;break a}m=h+(((k|0)/2|0)<<2)|0;if((j|0)>3996){j=(k|0)/4|0;n=ig(h,h+(j<<2)|0,m,m+(j<<2)|0,e,c)|0}else n=Vg(h,m,e,c)|0;o=f[h>>2]|0;j=f[m>>2]|0;p=f[c>>2]|0;k=f[p>>2]|0;q=(f[p+4>>2]|0)-k>>3;if(q>>>0<=o>>>0){l=20;break a}r=k;if(q>>>0<=j>>>0){l=22;break a}k=f[r+(o<<3)>>2]|0;s=f[r+(j<<3)>>2]|0;if(k>>>0<s>>>0){t=e;u=n;break}else v=e;while(1){v=v+-4|0;if((h|0)==(v|0))break;w=f[v>>2]|0;if(q>>>0<=w>>>0){l=51;break a}if((f[r+(w<<3)>>2]|0)>>>0<s>>>0){l=53;break b}}s=h+4|0;j=f[e>>2]|0;if(q>>>0<=j>>>0){l=26;break a}if(k>>>0<(f[r+(j<<3)>>2]|0)>>>0)x=s;else{if((s|0)==(e|0)){l=84;break a}else y=s;while(1){z=f[y>>2]|0;if(q>>>0<=z>>>0){l=32;break a}if(k>>>0<(f[r+(z<<3)>>2]|0)>>>0)break;s=y+4|0;if((s|0)==(e|0)){l=84;break a}else y=s}f[y>>2]=j;f[e>>2]=z;x=y+4|0}if((x|0)==(e|0)){l=84;break a}r=f[h>>2]|0;A=f[c>>2]|0;k=f[A>>2]|0;q=(f[A+4>>2]|0)-k>>3;if(q>>>0<=r>>>0){l=38;break a}s=k;k=e;B=x;C=r;while(1){r=s+(C<<3)|0;D=q>>>0>C>>>0;E=B;while(1){F=f[E>>2]|0;if(q>>>0<=F>>>0){l=40;break a}G=f[r>>2]|0;if(G>>>0<(f[s+(F<<3)>>2]|0)>>>0)break;if(D)E=E+4|0;else{l=38;break a}}if(q>>>0>C>>>0)H=k;else{l=46;break a}do{H=H+-4|0;I=f[H>>2]|0;if(q>>>0<=I>>>0){l=47;break a}}while(G>>>0<(f[s+(I<<3)>>2]|0)>>>0);if(E>>>0>=H>>>0){h=E;continue b}D=f[E>>2]|0;f[E>>2]=I;f[H>>2]=D;C=f[h>>2]|0;if(q>>>0<=C>>>0){l=38;break a}else{k=H;B=E+4|0}}}if((l|0)==53){l=0;f[h>>2]=w;f[v>>2]=o;t=v;u=n+1|0}B=h+4|0;c:do if(B>>>0<t>>>0){k=f[B>>2]|0;C=f[c>>2]|0;q=f[C>>2]|0;s=(f[C+4>>2]|0)-q>>3;if(s>>>0>k>>>0){J=t;K=B;L=u;M=m;N=s;O=q;P=C;Q=k}else{R=C;l=57;break a}while(1){C=f[c>>2]|0;k=C+4|0;q=f[M>>2]|0;s=K;j=O;D=N;S=P;r=Q;while(1){F=j;if(D>>>0<=q>>>0){l=59;break a}if((f[F+(r<<3)>>2]|0)>>>0>=(f[F+(q<<3)>>2]|0)>>>0)break;F=s+4|0;T=f[F>>2]|0;j=f[C>>2]|0;D=(f[k>>2]|0)-j>>3;if(D>>>0<=T>>>0){R=C;l=57;break a}else{s=F;S=C;r=T}}C=f[M>>2]|0;O=f[S>>2]|0;N=(f[S+4>>2]|0)-O>>3;D=O;j=D+(C<<3)|0;if(N>>>0>C>>>0)U=J;else{l=65;break a}do{U=U+-4|0;V=f[U>>2]|0;if(N>>>0<=V>>>0){l=66;break a}}while((f[D+(V<<3)>>2]|0)>>>0>=(f[j>>2]|0)>>>0);if(s>>>0>U>>>0){W=M;X=L;Y=s;break c}f[s>>2]=V;f[U>>2]=r;K=s+4|0;Q=f[K>>2]|0;if(N>>>0<=Q>>>0){R=S;l=57;break a}else{J=U;L=L+1|0;M=(M|0)==(s|0)?U:M;P=S}}}else{W=m;X=u;Y=B}while(0);if((Y|0)!=(W|0)){B=f[W>>2]|0;j=f[Y>>2]|0;Z=f[c>>2]|0;D=f[Z>>2]|0;C=(f[Z+4>>2]|0)-D>>3;if(C>>>0<=B>>>0){l=72;break a}k=D;if(C>>>0<=j>>>0){l=74;break a}if((f[k+(B<<3)>>2]|0)>>>0<(f[k+(j<<3)>>2]|0)>>>0){f[Y>>2]=B;f[W>>2]=j;_=X+1|0}else _=X}else _=X;if(!_){$=_d(h,Y,c)|0;j=Y+4|0;if(_d(j,a,c)|0){l=83;break}if($){g=j;continue}}j=Y;if((j-i|0)>=(b-j|0)){l=82;break}Eb(h,Y,c);g=Y+4|0}if((l|0)==82){l=0;Eb(Y+4|0,a,c);d=h;a=Y;continue}else if((l|0)==83){l=0;if($){l=84;break}else{d=h;a=Y;continue}}}switch(l|0){case 5:{l=f[e>>2]|0;Y=f[h>>2]|0;d=f[c>>2]|0;$=f[d>>2]|0;i=(f[d+4>>2]|0)-$>>3;if(i>>>0<=l>>>0)aq(d);_=$;if(i>>>0<=Y>>>0)aq(d);if((f[_+(l<<3)>>2]|0)>>>0>=(f[_+(Y<<3)>>2]|0)>>>0)return;f[h>>2]=l;f[e>>2]=Y;return}case 11:{Vg(h,h+4|0,e,c)|0;return}case 12:{jh(h,h+4|0,h+8|0,e,c)|0;return}case 13:{ig(h,h+4|0,h+8|0,h+12|0,e,c)|0;return}case 15:{ih(h,a,c);return}case 20:{aq(p);break}case 22:{aq(p);break}case 26:{aq(p);break}case 32:{aq(p);break}case 38:{aq(A);break}case 40:{aq(A);break}case 46:{aq(A);break}case 47:{aq(A);break}case 51:{aq(p);break}case 57:{aq(R);break}case 59:{aq(S);break}case 65:{if(N>>>0>(f[J+-4>>2]|0)>>>0)aq(S);else aq(S);break}case 66:{aq(S);break}case 72:{aq(Z);break}case 74:{aq(Z);break}case 84:return}}function Fb(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0;d=a;a=b;a:while(1){b=a;e=a+-4|0;g=d;while(1){h=g;b:while(1){i=h;j=b-i|0;k=j>>2;switch(k|0){case 2:{l=5;break a;break}case 3:{l=11;break a;break}case 4:{l=12;break a;break}case 5:{l=13;break a;break}case 1:case 0:{l=84;break a;break}default:{}}if((j|0)<124){l=15;break a}m=h+(((k|0)/2|0)<<2)|0;if((j|0)>3996){j=(k|0)/4|0;n=ig(h,h+(j<<2)|0,m,m+(j<<2)|0,e,c)|0}else n=Vg(h,m,e,c)|0;o=f[h>>2]|0;j=f[m>>2]|0;p=f[c>>2]|0;k=f[p>>2]|0;q=(f[p+4>>2]|0)-k>>3;if(q>>>0<=o>>>0){l=20;break a}r=k;if(q>>>0<=j>>>0){l=22;break a}k=f[r+(o<<3)>>2]|0;s=f[r+(j<<3)>>2]|0;if(k>>>0<s>>>0){t=e;u=n;break}else v=e;while(1){v=v+-4|0;if((h|0)==(v|0))break;w=f[v>>2]|0;if(q>>>0<=w>>>0){l=51;break a}if((f[r+(w<<3)>>2]|0)>>>0<s>>>0){l=53;break b}}s=h+4|0;j=f[e>>2]|0;if(q>>>0<=j>>>0){l=26;break a}if(k>>>0<(f[r+(j<<3)>>2]|0)>>>0)x=s;else{if((s|0)==(e|0)){l=84;break a}else y=s;while(1){z=f[y>>2]|0;if(q>>>0<=z>>>0){l=32;break a}if(k>>>0<(f[r+(z<<3)>>2]|0)>>>0)break;s=y+4|0;if((s|0)==(e|0)){l=84;break a}else y=s}f[y>>2]=j;f[e>>2]=z;x=y+4|0}if((x|0)==(e|0)){l=84;break a}r=f[h>>2]|0;A=f[c>>2]|0;k=f[A>>2]|0;q=(f[A+4>>2]|0)-k>>3;if(q>>>0<=r>>>0){l=38;break a}s=k;k=e;B=x;C=r;while(1){r=s+(C<<3)|0;D=q>>>0>C>>>0;E=B;while(1){F=f[E>>2]|0;if(q>>>0<=F>>>0){l=40;break a}G=f[r>>2]|0;if(G>>>0<(f[s+(F<<3)>>2]|0)>>>0)break;if(D)E=E+4|0;else{l=38;break a}}if(q>>>0>C>>>0)H=k;else{l=46;break a}do{H=H+-4|0;I=f[H>>2]|0;if(q>>>0<=I>>>0){l=47;break a}}while(G>>>0<(f[s+(I<<3)>>2]|0)>>>0);if(E>>>0>=H>>>0){h=E;continue b}D=f[E>>2]|0;f[E>>2]=I;f[H>>2]=D;C=f[h>>2]|0;if(q>>>0<=C>>>0){l=38;break a}else{k=H;B=E+4|0}}}if((l|0)==53){l=0;f[h>>2]=w;f[v>>2]=o;t=v;u=n+1|0}B=h+4|0;c:do if(B>>>0<t>>>0){k=f[B>>2]|0;C=f[c>>2]|0;q=f[C>>2]|0;s=(f[C+4>>2]|0)-q>>3;if(s>>>0>k>>>0){J=t;K=B;L=u;M=m;N=s;O=q;P=C;Q=k}else{R=C;l=57;break a}while(1){C=f[c>>2]|0;k=C+4|0;q=f[M>>2]|0;s=K;j=O;D=N;S=P;r=Q;while(1){F=j;if(D>>>0<=q>>>0){l=59;break a}if((f[F+(r<<3)>>2]|0)>>>0>=(f[F+(q<<3)>>2]|0)>>>0)break;F=s+4|0;T=f[F>>2]|0;j=f[C>>2]|0;D=(f[k>>2]|0)-j>>3;if(D>>>0<=T>>>0){R=C;l=57;break a}else{s=F;S=C;r=T}}C=f[M>>2]|0;O=f[S>>2]|0;N=(f[S+4>>2]|0)-O>>3;D=O;j=D+(C<<3)|0;if(N>>>0>C>>>0)U=J;else{l=65;break a}do{U=U+-4|0;V=f[U>>2]|0;if(N>>>0<=V>>>0){l=66;break a}}while((f[D+(V<<3)>>2]|0)>>>0>=(f[j>>2]|0)>>>0);if(s>>>0>U>>>0){W=M;X=L;Y=s;break c}f[s>>2]=V;f[U>>2]=r;K=s+4|0;Q=f[K>>2]|0;if(N>>>0<=Q>>>0){R=S;l=57;break a}else{J=U;L=L+1|0;M=(M|0)==(s|0)?U:M;P=S}}}else{W=m;X=u;Y=B}while(0);if((Y|0)!=(W|0)){B=f[W>>2]|0;j=f[Y>>2]|0;Z=f[c>>2]|0;D=f[Z>>2]|0;C=(f[Z+4>>2]|0)-D>>3;if(C>>>0<=B>>>0){l=72;break a}k=D;if(C>>>0<=j>>>0){l=74;break a}if((f[k+(B<<3)>>2]|0)>>>0<(f[k+(j<<3)>>2]|0)>>>0){f[Y>>2]=B;f[W>>2]=j;_=X+1|0}else _=X}else _=X;if(!_){$=_d(h,Y,c)|0;j=Y+4|0;if(_d(j,a,c)|0){l=83;break}if($){g=j;continue}}j=Y;if((j-i|0)>=(b-j|0)){l=82;break}Fb(h,Y,c);g=Y+4|0}if((l|0)==82){l=0;Fb(Y+4|0,a,c);d=h;a=Y;continue}else if((l|0)==83){l=0;if($){l=84;break}else{d=h;a=Y;continue}}}switch(l|0){case 5:{l=f[e>>2]|0;Y=f[h>>2]|0;d=f[c>>2]|0;$=f[d>>2]|0;i=(f[d+4>>2]|0)-$>>3;if(i>>>0<=l>>>0)aq(d);_=$;if(i>>>0<=Y>>>0)aq(d);if((f[_+(l<<3)>>2]|0)>>>0>=(f[_+(Y<<3)>>2]|0)>>>0)return;f[h>>2]=l;f[e>>2]=Y;return}case 11:{Vg(h,h+4|0,e,c)|0;return}case 12:{jh(h,h+4|0,h+8|0,e,c)|0;return}case 13:{ig(h,h+4|0,h+8|0,h+12|0,e,c)|0;return}case 15:{ih(h,a,c);return}case 20:{aq(p);break}case 22:{aq(p);break}case 26:{aq(p);break}case 32:{aq(p);break}case 38:{aq(A);break}case 40:{aq(A);break}case 46:{aq(A);break}case 47:{aq(A);break}case 51:{aq(p);break}case 57:{aq(R);break}case 59:{aq(S);break}case 65:{if(N>>>0>(f[J+-4>>2]|0)>>>0)aq(S);else aq(S);break}case 66:{aq(S);break}case 72:{aq(Z);break}case 74:{aq(Z);break}case 84:return}}function Gb(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0;d=a;a=b;a:while(1){b=a;e=a+-4|0;g=d;while(1){h=g;b:while(1){i=h;j=b-i|0;k=j>>2;switch(k|0){case 2:{l=5;break a;break}case 3:{l=11;break a;break}case 4:{l=12;break a;break}case 5:{l=13;break a;break}case 1:case 0:{l=84;break a;break}default:{}}if((j|0)<124){l=15;break a}m=h+(((k|0)/2|0)<<2)|0;if((j|0)>3996){j=(k|0)/4|0;n=ig(h,h+(j<<2)|0,m,m+(j<<2)|0,e,c)|0}else n=Vg(h,m,e,c)|0;o=f[h>>2]|0;j=f[m>>2]|0;p=f[c>>2]|0;k=f[p>>2]|0;q=(f[p+4>>2]|0)-k>>3;if(q>>>0<=o>>>0){l=20;break a}r=k;if(q>>>0<=j>>>0){l=22;break a}k=f[r+(o<<3)>>2]|0;s=f[r+(j<<3)>>2]|0;if(k>>>0<s>>>0){t=e;u=n;break}else v=e;while(1){v=v+-4|0;if((h|0)==(v|0))break;w=f[v>>2]|0;if(q>>>0<=w>>>0){l=51;break a}if((f[r+(w<<3)>>2]|0)>>>0<s>>>0){l=53;break b}}s=h+4|0;j=f[e>>2]|0;if(q>>>0<=j>>>0){l=26;break a}if(k>>>0<(f[r+(j<<3)>>2]|0)>>>0)x=s;else{if((s|0)==(e|0)){l=84;break a}else y=s;while(1){z=f[y>>2]|0;if(q>>>0<=z>>>0){l=32;break a}if(k>>>0<(f[r+(z<<3)>>2]|0)>>>0)break;s=y+4|0;if((s|0)==(e|0)){l=84;break a}else y=s}f[y>>2]=j;f[e>>2]=z;x=y+4|0}if((x|0)==(e|0)){l=84;break a}r=f[h>>2]|0;A=f[c>>2]|0;k=f[A>>2]|0;q=(f[A+4>>2]|0)-k>>3;if(q>>>0<=r>>>0){l=38;break a}s=k;k=e;B=x;C=r;while(1){r=s+(C<<3)|0;D=q>>>0>C>>>0;E=B;while(1){F=f[E>>2]|0;if(q>>>0<=F>>>0){l=40;break a}G=f[r>>2]|0;if(G>>>0<(f[s+(F<<3)>>2]|0)>>>0)break;if(D)E=E+4|0;else{l=38;break a}}if(q>>>0>C>>>0)H=k;else{l=46;break a}do{H=H+-4|0;I=f[H>>2]|0;if(q>>>0<=I>>>0){l=47;break a}}while(G>>>0<(f[s+(I<<3)>>2]|0)>>>0);if(E>>>0>=H>>>0){h=E;continue b}D=f[E>>2]|0;f[E>>2]=I;f[H>>2]=D;C=f[h>>2]|0;if(q>>>0<=C>>>0){l=38;break a}else{k=H;B=E+4|0}}}if((l|0)==53){l=0;f[h>>2]=w;f[v>>2]=o;t=v;u=n+1|0}B=h+4|0;c:do if(B>>>0<t>>>0){k=f[B>>2]|0;C=f[c>>2]|0;q=f[C>>2]|0;s=(f[C+4>>2]|0)-q>>3;if(s>>>0>k>>>0){J=t;K=B;L=u;M=m;N=s;O=q;P=C;Q=k}else{R=C;l=57;break a}while(1){C=f[c>>2]|0;k=C+4|0;q=f[M>>2]|0;s=K;j=O;D=N;S=P;r=Q;while(1){F=j;if(D>>>0<=q>>>0){l=59;break a}if((f[F+(r<<3)>>2]|0)>>>0>=(f[F+(q<<3)>>2]|0)>>>0)break;F=s+4|0;T=f[F>>2]|0;j=f[C>>2]|0;D=(f[k>>2]|0)-j>>3;if(D>>>0<=T>>>0){R=C;l=57;break a}else{s=F;S=C;r=T}}C=f[M>>2]|0;O=f[S>>2]|0;N=(f[S+4>>2]|0)-O>>3;D=O;j=D+(C<<3)|0;if(N>>>0>C>>>0)U=J;else{l=65;break a}do{U=U+-4|0;V=f[U>>2]|0;if(N>>>0<=V>>>0){l=66;break a}}while((f[D+(V<<3)>>2]|0)>>>0>=(f[j>>2]|0)>>>0);if(s>>>0>U>>>0){W=M;X=L;Y=s;break c}f[s>>2]=V;f[U>>2]=r;K=s+4|0;Q=f[K>>2]|0;if(N>>>0<=Q>>>0){R=S;l=57;break a}else{J=U;L=L+1|0;M=(M|0)==(s|0)?U:M;P=S}}}else{W=m;X=u;Y=B}while(0);if((Y|0)!=(W|0)){B=f[W>>2]|0;j=f[Y>>2]|0;Z=f[c>>2]|0;D=f[Z>>2]|0;C=(f[Z+4>>2]|0)-D>>3;if(C>>>0<=B>>>0){l=72;break a}k=D;if(C>>>0<=j>>>0){l=74;break a}if((f[k+(B<<3)>>2]|0)>>>0<(f[k+(j<<3)>>2]|0)>>>0){f[Y>>2]=B;f[W>>2]=j;_=X+1|0}else _=X}else _=X;if(!_){$=_d(h,Y,c)|0;j=Y+4|0;if(_d(j,a,c)|0){l=83;break}if($){g=j;continue}}j=Y;if((j-i|0)>=(b-j|0)){l=82;break}Gb(h,Y,c);g=Y+4|0}if((l|0)==82){l=0;Gb(Y+4|0,a,c);d=h;a=Y;continue}else if((l|0)==83){l=0;if($){l=84;break}else{d=h;a=Y;continue}}}switch(l|0){case 5:{l=f[e>>2]|0;Y=f[h>>2]|0;d=f[c>>2]|0;$=f[d>>2]|0;i=(f[d+4>>2]|0)-$>>3;if(i>>>0<=l>>>0)aq(d);_=$;if(i>>>0<=Y>>>0)aq(d);if((f[_+(l<<3)>>2]|0)>>>0>=(f[_+(Y<<3)>>2]|0)>>>0)return;f[h>>2]=l;f[e>>2]=Y;return}case 11:{Vg(h,h+4|0,e,c)|0;return}case 12:{jh(h,h+4|0,h+8|0,e,c)|0;return}case 13:{ig(h,h+4|0,h+8|0,h+12|0,e,c)|0;return}case 15:{ih(h,a,c);return}case 20:{aq(p);break}case 22:{aq(p);break}case 26:{aq(p);break}case 32:{aq(p);break}case 38:{aq(A);break}case 40:{aq(A);break}case 46:{aq(A);break}case 47:{aq(A);break}case 51:{aq(p);break}case 57:{aq(R);break}case 59:{aq(S);break}case 65:{if(N>>>0>(f[J+-4>>2]|0)>>>0)aq(S);else aq(S);break}case 66:{aq(S);break}case 72:{aq(Z);break}case 74:{aq(Z);break}case 84:return}}function Hb(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0;d=a;a=b;a:while(1){b=a;e=a+-4|0;g=d;while(1){h=g;b:while(1){i=h;j=b-i|0;k=j>>2;switch(k|0){case 2:{l=5;break a;break}case 3:{l=11;break a;break}case 4:{l=12;break a;break}case 5:{l=13;break a;break}case 1:case 0:{l=84;break a;break}default:{}}if((j|0)<124){l=15;break a}m=h+(((k|0)/2|0)<<2)|0;if((j|0)>3996){j=(k|0)/4|0;n=ig(h,h+(j<<2)|0,m,m+(j<<2)|0,e,c)|0}else n=Vg(h,m,e,c)|0;o=f[h>>2]|0;j=f[m>>2]|0;p=f[c>>2]|0;k=f[p>>2]|0;q=(f[p+4>>2]|0)-k>>3;if(q>>>0<=o>>>0){l=20;break a}r=k;if(q>>>0<=j>>>0){l=22;break a}k=f[r+(o<<3)>>2]|0;s=f[r+(j<<3)>>2]|0;if(k>>>0<s>>>0){t=e;u=n;break}else v=e;while(1){v=v+-4|0;if((h|0)==(v|0))break;w=f[v>>2]|0;if(q>>>0<=w>>>0){l=51;break a}if((f[r+(w<<3)>>2]|0)>>>0<s>>>0){l=53;break b}}s=h+4|0;j=f[e>>2]|0;if(q>>>0<=j>>>0){l=26;break a}if(k>>>0<(f[r+(j<<3)>>2]|0)>>>0)x=s;else{if((s|0)==(e|0)){l=84;break a}else y=s;while(1){z=f[y>>2]|0;if(q>>>0<=z>>>0){l=32;break a}if(k>>>0<(f[r+(z<<3)>>2]|0)>>>0)break;s=y+4|0;if((s|0)==(e|0)){l=84;break a}else y=s}f[y>>2]=j;f[e>>2]=z;x=y+4|0}if((x|0)==(e|0)){l=84;break a}r=f[h>>2]|0;A=f[c>>2]|0;k=f[A>>2]|0;q=(f[A+4>>2]|0)-k>>3;if(q>>>0<=r>>>0){l=38;break a}s=k;k=e;B=x;C=r;while(1){r=s+(C<<3)|0;D=q>>>0>C>>>0;E=B;while(1){F=f[E>>2]|0;if(q>>>0<=F>>>0){l=40;break a}G=f[r>>2]|0;if(G>>>0<(f[s+(F<<3)>>2]|0)>>>0)break;if(D)E=E+4|0;else{l=38;break a}}if(q>>>0>C>>>0)H=k;else{l=46;break a}do{H=H+-4|0;I=f[H>>2]|0;if(q>>>0<=I>>>0){l=47;break a}}while(G>>>0<(f[s+(I<<3)>>2]|0)>>>0);if(E>>>0>=H>>>0){h=E;continue b}D=f[E>>2]|0;f[E>>2]=I;f[H>>2]=D;C=f[h>>2]|0;if(q>>>0<=C>>>0){l=38;break a}else{k=H;B=E+4|0}}}if((l|0)==53){l=0;f[h>>2]=w;f[v>>2]=o;t=v;u=n+1|0}B=h+4|0;c:do if(B>>>0<t>>>0){k=f[B>>2]|0;C=f[c>>2]|0;q=f[C>>2]|0;s=(f[C+4>>2]|0)-q>>3;if(s>>>0>k>>>0){J=t;K=B;L=u;M=m;N=s;O=q;P=C;Q=k}else{R=C;l=57;break a}while(1){C=f[c>>2]|0;k=C+4|0;q=f[M>>2]|0;s=K;j=O;D=N;S=P;r=Q;while(1){F=j;if(D>>>0<=q>>>0){l=59;break a}if((f[F+(r<<3)>>2]|0)>>>0>=(f[F+(q<<3)>>2]|0)>>>0)break;F=s+4|0;T=f[F>>2]|0;j=f[C>>2]|0;D=(f[k>>2]|0)-j>>3;if(D>>>0<=T>>>0){R=C;l=57;break a}else{s=F;S=C;r=T}}C=f[M>>2]|0;O=f[S>>2]|0;N=(f[S+4>>2]|0)-O>>3;D=O;j=D+(C<<3)|0;if(N>>>0>C>>>0)U=J;else{l=65;break a}do{U=U+-4|0;V=f[U>>2]|0;if(N>>>0<=V>>>0){l=66;break a}}while((f[D+(V<<3)>>2]|0)>>>0>=(f[j>>2]|0)>>>0);if(s>>>0>U>>>0){W=M;X=L;Y=s;break c}f[s>>2]=V;f[U>>2]=r;K=s+4|0;Q=f[K>>2]|0;if(N>>>0<=Q>>>0){R=S;l=57;break a}else{J=U;L=L+1|0;M=(M|0)==(s|0)?U:M;P=S}}}else{W=m;X=u;Y=B}while(0);if((Y|0)!=(W|0)){B=f[W>>2]|0;j=f[Y>>2]|0;Z=f[c>>2]|0;D=f[Z>>2]|0;C=(f[Z+4>>2]|0)-D>>3;if(C>>>0<=B>>>0){l=72;break a}k=D;if(C>>>0<=j>>>0){l=74;break a}if((f[k+(B<<3)>>2]|0)>>>0<(f[k+(j<<3)>>2]|0)>>>0){f[Y>>2]=B;f[W>>2]=j;_=X+1|0}else _=X}else _=X;if(!_){$=_d(h,Y,c)|0;j=Y+4|0;if(_d(j,a,c)|0){l=83;break}if($){g=j;continue}}j=Y;if((j-i|0)>=(b-j|0)){l=82;break}Hb(h,Y,c);g=Y+4|0}if((l|0)==82){l=0;Hb(Y+4|0,a,c);d=h;a=Y;continue}else if((l|0)==83){l=0;if($){l=84;break}else{d=h;a=Y;continue}}}switch(l|0){case 5:{l=f[e>>2]|0;Y=f[h>>2]|0;d=f[c>>2]|0;$=f[d>>2]|0;i=(f[d+4>>2]|0)-$>>3;if(i>>>0<=l>>>0)aq(d);_=$;if(i>>>0<=Y>>>0)aq(d);if((f[_+(l<<3)>>2]|0)>>>0>=(f[_+(Y<<3)>>2]|0)>>>0)return;f[h>>2]=l;f[e>>2]=Y;return}case 11:{Vg(h,h+4|0,e,c)|0;return}case 12:{jh(h,h+4|0,h+8|0,e,c)|0;return}case 13:{ig(h,h+4|0,h+8|0,h+12|0,e,c)|0;return}case 15:{ih(h,a,c);return}case 20:{aq(p);break}case 22:{aq(p);break}case 26:{aq(p);break}case 32:{aq(p);break}case 38:{aq(A);break}case 40:{aq(A);break}case 46:{aq(A);break}case 47:{aq(A);break}case 51:{aq(p);break}case 57:{aq(R);break}case 59:{aq(S);break}case 65:{if(N>>>0>(f[J+-4>>2]|0)>>>0)aq(S);else aq(S);break}case 66:{aq(S);break}case 72:{aq(Z);break}case 74:{aq(Z);break}case 84:return}}function Ib(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0;d=a;a=b;a:while(1){b=a;e=a+-4|0;g=d;while(1){h=g;b:while(1){i=h;j=b-i|0;k=j>>2;switch(k|0){case 2:{l=5;break a;break}case 3:{l=11;break a;break}case 4:{l=12;break a;break}case 5:{l=13;break a;break}case 1:case 0:{l=84;break a;break}default:{}}if((j|0)<124){l=15;break a}m=h+(((k|0)/2|0)<<2)|0;if((j|0)>3996){j=(k|0)/4|0;n=ig(h,h+(j<<2)|0,m,m+(j<<2)|0,e,c)|0}else n=Vg(h,m,e,c)|0;o=f[h>>2]|0;j=f[m>>2]|0;p=f[c>>2]|0;k=f[p>>2]|0;q=(f[p+4>>2]|0)-k>>3;if(q>>>0<=o>>>0){l=20;break a}r=k;if(q>>>0<=j>>>0){l=22;break a}k=f[r+(o<<3)>>2]|0;s=f[r+(j<<3)>>2]|0;if(k>>>0<s>>>0){t=e;u=n;break}else v=e;while(1){v=v+-4|0;if((h|0)==(v|0))break;w=f[v>>2]|0;if(q>>>0<=w>>>0){l=51;break a}if((f[r+(w<<3)>>2]|0)>>>0<s>>>0){l=53;break b}}s=h+4|0;j=f[e>>2]|0;if(q>>>0<=j>>>0){l=26;break a}if(k>>>0<(f[r+(j<<3)>>2]|0)>>>0)x=s;else{if((s|0)==(e|0)){l=84;break a}else y=s;while(1){z=f[y>>2]|0;if(q>>>0<=z>>>0){l=32;break a}if(k>>>0<(f[r+(z<<3)>>2]|0)>>>0)break;s=y+4|0;if((s|0)==(e|0)){l=84;break a}else y=s}f[y>>2]=j;f[e>>2]=z;x=y+4|0}if((x|0)==(e|0)){l=84;break a}r=f[h>>2]|0;A=f[c>>2]|0;k=f[A>>2]|0;q=(f[A+4>>2]|0)-k>>3;if(q>>>0<=r>>>0){l=38;break a}s=k;k=e;B=x;C=r;while(1){r=s+(C<<3)|0;D=q>>>0>C>>>0;E=B;while(1){F=f[E>>2]|0;if(q>>>0<=F>>>0){l=40;break a}G=f[r>>2]|0;if(G>>>0<(f[s+(F<<3)>>2]|0)>>>0)break;if(D)E=E+4|0;else{l=38;break a}}if(q>>>0>C>>>0)H=k;else{l=46;break a}do{H=H+-4|0;I=f[H>>2]|0;if(q>>>0<=I>>>0){l=47;break a}}while(G>>>0<(f[s+(I<<3)>>2]|0)>>>0);if(E>>>0>=H>>>0){h=E;continue b}D=f[E>>2]|0;f[E>>2]=I;f[H>>2]=D;C=f[h>>2]|0;if(q>>>0<=C>>>0){l=38;break a}else{k=H;B=E+4|0}}}if((l|0)==53){l=0;f[h>>2]=w;f[v>>2]=o;t=v;u=n+1|0}B=h+4|0;c:do if(B>>>0<t>>>0){k=f[B>>2]|0;C=f[c>>2]|0;q=f[C>>2]|0;s=(f[C+4>>2]|0)-q>>3;if(s>>>0>k>>>0){J=t;K=B;L=u;M=m;N=s;O=q;P=C;Q=k}else{R=C;l=57;break a}while(1){C=f[c>>2]|0;k=C+4|0;q=f[M>>2]|0;s=K;j=O;D=N;S=P;r=Q;while(1){F=j;if(D>>>0<=q>>>0){l=59;break a}if((f[F+(r<<3)>>2]|0)>>>0>=(f[F+(q<<3)>>2]|0)>>>0)break;F=s+4|0;T=f[F>>2]|0;j=f[C>>2]|0;D=(f[k>>2]|0)-j>>3;if(D>>>0<=T>>>0){R=C;l=57;break a}else{s=F;S=C;r=T}}C=f[M>>2]|0;O=f[S>>2]|0;N=(f[S+4>>2]|0)-O>>3;D=O;j=D+(C<<3)|0;if(N>>>0>C>>>0)U=J;else{l=65;break a}do{U=U+-4|0;V=f[U>>2]|0;if(N>>>0<=V>>>0){l=66;break a}}while((f[D+(V<<3)>>2]|0)>>>0>=(f[j>>2]|0)>>>0);if(s>>>0>U>>>0){W=M;X=L;Y=s;break c}f[s>>2]=V;f[U>>2]=r;K=s+4|0;Q=f[K>>2]|0;if(N>>>0<=Q>>>0){R=S;l=57;break a}else{J=U;L=L+1|0;M=(M|0)==(s|0)?U:M;P=S}}}else{W=m;X=u;Y=B}while(0);if((Y|0)!=(W|0)){B=f[W>>2]|0;j=f[Y>>2]|0;Z=f[c>>2]|0;D=f[Z>>2]|0;C=(f[Z+4>>2]|0)-D>>3;if(C>>>0<=B>>>0){l=72;break a}k=D;if(C>>>0<=j>>>0){l=74;break a}if((f[k+(B<<3)>>2]|0)>>>0<(f[k+(j<<3)>>2]|0)>>>0){f[Y>>2]=B;f[W>>2]=j;_=X+1|0}else _=X}else _=X;if(!_){$=_d(h,Y,c)|0;j=Y+4|0;if(_d(j,a,c)|0){l=83;break}if($){g=j;continue}}j=Y;if((j-i|0)>=(b-j|0)){l=82;break}Ib(h,Y,c);g=Y+4|0}if((l|0)==82){l=0;Ib(Y+4|0,a,c);d=h;a=Y;continue}else if((l|0)==83){l=0;if($){l=84;break}else{d=h;a=Y;continue}}}switch(l|0){case 5:{l=f[e>>2]|0;Y=f[h>>2]|0;d=f[c>>2]|0;$=f[d>>2]|0;i=(f[d+4>>2]|0)-$>>3;if(i>>>0<=l>>>0)aq(d);_=$;if(i>>>0<=Y>>>0)aq(d);if((f[_+(l<<3)>>2]|0)>>>0>=(f[_+(Y<<3)>>2]|0)>>>0)return;f[h>>2]=l;f[e>>2]=Y;return}case 11:{Vg(h,h+4|0,e,c)|0;return}case 12:{jh(h,h+4|0,h+8|0,e,c)|0;return}case 13:{ig(h,h+4|0,h+8|0,h+12|0,e,c)|0;return}case 15:{ih(h,a,c);return}case 20:{aq(p);break}case 22:{aq(p);break}case 26:{aq(p);break}case 32:{aq(p);break}case 38:{aq(A);break}case 40:{aq(A);break}case 46:{aq(A);break}case 47:{aq(A);break}case 51:{aq(p);break}case 57:{aq(R);break}case 59:{aq(S);break}case 65:{if(N>>>0>(f[J+-4>>2]|0)>>>0)aq(S);else aq(S);break}case 66:{aq(S);break}case 72:{aq(Z);break}case 74:{aq(Z);break}case 84:return}}function Jb(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0;d=a;a=b;a:while(1){b=a;e=a+-4|0;g=d;while(1){h=g;b:while(1){i=h;j=b-i|0;k=j>>2;switch(k|0){case 2:{l=5;break a;break}case 3:{l=11;break a;break}case 4:{l=12;break a;break}case 5:{l=13;break a;break}case 1:case 0:{l=84;break a;break}default:{}}if((j|0)<124){l=15;break a}m=h+(((k|0)/2|0)<<2)|0;if((j|0)>3996){j=(k|0)/4|0;n=ig(h,h+(j<<2)|0,m,m+(j<<2)|0,e,c)|0}else n=Vg(h,m,e,c)|0;o=f[h>>2]|0;j=f[m>>2]|0;p=f[c>>2]|0;k=f[p>>2]|0;q=(f[p+4>>2]|0)-k>>3;if(q>>>0<=o>>>0){l=20;break a}r=k;if(q>>>0<=j>>>0){l=22;break a}k=f[r+(o<<3)>>2]|0;s=f[r+(j<<3)>>2]|0;if(k>>>0<s>>>0){t=e;u=n;break}else v=e;while(1){v=v+-4|0;if((h|0)==(v|0))break;w=f[v>>2]|0;if(q>>>0<=w>>>0){l=51;break a}if((f[r+(w<<3)>>2]|0)>>>0<s>>>0){l=53;break b}}s=h+4|0;j=f[e>>2]|0;if(q>>>0<=j>>>0){l=26;break a}if(k>>>0<(f[r+(j<<3)>>2]|0)>>>0)x=s;else{if((s|0)==(e|0)){l=84;break a}else y=s;while(1){z=f[y>>2]|0;if(q>>>0<=z>>>0){l=32;break a}if(k>>>0<(f[r+(z<<3)>>2]|0)>>>0)break;s=y+4|0;if((s|0)==(e|0)){l=84;break a}else y=s}f[y>>2]=j;f[e>>2]=z;x=y+4|0}if((x|0)==(e|0)){l=84;break a}r=f[h>>2]|0;A=f[c>>2]|0;k=f[A>>2]|0;q=(f[A+4>>2]|0)-k>>3;if(q>>>0<=r>>>0){l=38;break a}s=k;k=e;B=x;C=r;while(1){r=s+(C<<3)|0;D=q>>>0>C>>>0;E=B;while(1){F=f[E>>2]|0;if(q>>>0<=F>>>0){l=40;break a}G=f[r>>2]|0;if(G>>>0<(f[s+(F<<3)>>2]|0)>>>0)break;if(D)E=E+4|0;else{l=38;break a}}if(q>>>0>C>>>0)H=k;else{l=46;break a}do{H=H+-4|0;I=f[H>>2]|0;if(q>>>0<=I>>>0){l=47;break a}}while(G>>>0<(f[s+(I<<3)>>2]|0)>>>0);if(E>>>0>=H>>>0){h=E;continue b}D=f[E>>2]|0;f[E>>2]=I;f[H>>2]=D;C=f[h>>2]|0;if(q>>>0<=C>>>0){l=38;break a}else{k=H;B=E+4|0}}}if((l|0)==53){l=0;f[h>>2]=w;f[v>>2]=o;t=v;u=n+1|0}B=h+4|0;c:do if(B>>>0<t>>>0){k=f[B>>2]|0;C=f[c>>2]|0;q=f[C>>2]|0;s=(f[C+4>>2]|0)-q>>3;if(s>>>0>k>>>0){J=t;K=B;L=u;M=m;N=s;O=q;P=C;Q=k}else{R=C;l=57;break a}while(1){C=f[c>>2]|0;k=C+4|0;q=f[M>>2]|0;s=K;j=O;D=N;S=P;r=Q;while(1){F=j;if(D>>>0<=q>>>0){l=59;break a}if((f[F+(r<<3)>>2]|0)>>>0>=(f[F+(q<<3)>>2]|0)>>>0)break;F=s+4|0;T=f[F>>2]|0;j=f[C>>2]|0;D=(f[k>>2]|0)-j>>3;if(D>>>0<=T>>>0){R=C;l=57;break a}else{s=F;S=C;r=T}}C=f[M>>2]|0;O=f[S>>2]|0;N=(f[S+4>>2]|0)-O>>3;D=O;j=D+(C<<3)|0;if(N>>>0>C>>>0)U=J;else{l=65;break a}do{U=U+-4|0;V=f[U>>2]|0;if(N>>>0<=V>>>0){l=66;break a}}while((f[D+(V<<3)>>2]|0)>>>0>=(f[j>>2]|0)>>>0);if(s>>>0>U>>>0){W=M;X=L;Y=s;break c}f[s>>2]=V;f[U>>2]=r;K=s+4|0;Q=f[K>>2]|0;if(N>>>0<=Q>>>0){R=S;l=57;break a}else{J=U;L=L+1|0;M=(M|0)==(s|0)?U:M;P=S}}}else{W=m;X=u;Y=B}while(0);if((Y|0)!=(W|0)){B=f[W>>2]|0;j=f[Y>>2]|0;Z=f[c>>2]|0;D=f[Z>>2]|0;C=(f[Z+4>>2]|0)-D>>3;if(C>>>0<=B>>>0){l=72;break a}k=D;if(C>>>0<=j>>>0){l=74;break a}if((f[k+(B<<3)>>2]|0)>>>0<(f[k+(j<<3)>>2]|0)>>>0){f[Y>>2]=B;f[W>>2]=j;_=X+1|0}else _=X}else _=X;if(!_){$=_d(h,Y,c)|0;j=Y+4|0;if(_d(j,a,c)|0){l=83;break}if($){g=j;continue}}j=Y;if((j-i|0)>=(b-j|0)){l=82;break}Jb(h,Y,c);g=Y+4|0}if((l|0)==82){l=0;Jb(Y+4|0,a,c);d=h;a=Y;continue}else if((l|0)==83){l=0;if($){l=84;break}else{d=h;a=Y;continue}}}switch(l|0){case 5:{l=f[e>>2]|0;Y=f[h>>2]|0;d=f[c>>2]|0;$=f[d>>2]|0;i=(f[d+4>>2]|0)-$>>3;if(i>>>0<=l>>>0)aq(d);_=$;if(i>>>0<=Y>>>0)aq(d);if((f[_+(l<<3)>>2]|0)>>>0>=(f[_+(Y<<3)>>2]|0)>>>0)return;f[h>>2]=l;f[e>>2]=Y;return}case 11:{Vg(h,h+4|0,e,c)|0;return}case 12:{jh(h,h+4|0,h+8|0,e,c)|0;return}case 13:{ig(h,h+4|0,h+8|0,h+12|0,e,c)|0;return}case 15:{ih(h,a,c);return}case 20:{aq(p);break}case 22:{aq(p);break}case 26:{aq(p);break}case 32:{aq(p);break}case 38:{aq(A);break}case 40:{aq(A);break}case 46:{aq(A);break}case 47:{aq(A);break}case 51:{aq(p);break}case 57:{aq(R);break}case 59:{aq(S);break}case 65:{if(N>>>0>(f[J+-4>>2]|0)>>>0)aq(S);else aq(S);break}case 66:{aq(S);break}case 72:{aq(Z);break}case 74:{aq(Z);break}case 84:return}}function Kb(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0;d=a;a=b;a:while(1){b=a;e=a+-4|0;g=d;while(1){h=g;b:while(1){i=h;j=b-i|0;k=j>>2;switch(k|0){case 2:{l=5;break a;break}case 3:{l=11;break a;break}case 4:{l=12;break a;break}case 5:{l=13;break a;break}case 1:case 0:{l=84;break a;break}default:{}}if((j|0)<124){l=15;break a}m=h+(((k|0)/2|0)<<2)|0;if((j|0)>3996){j=(k|0)/4|0;n=ig(h,h+(j<<2)|0,m,m+(j<<2)|0,e,c)|0}else n=Vg(h,m,e,c)|0;o=f[h>>2]|0;j=f[m>>2]|0;p=f[c>>2]|0;k=f[p>>2]|0;q=(f[p+4>>2]|0)-k>>3;if(q>>>0<=o>>>0){l=20;break a}r=k;if(q>>>0<=j>>>0){l=22;break a}k=f[r+(o<<3)>>2]|0;s=f[r+(j<<3)>>2]|0;if(k>>>0<s>>>0){t=e;u=n;break}else v=e;while(1){v=v+-4|0;if((h|0)==(v|0))break;w=f[v>>2]|0;if(q>>>0<=w>>>0){l=51;break a}if((f[r+(w<<3)>>2]|0)>>>0<s>>>0){l=53;break b}}s=h+4|0;j=f[e>>2]|0;if(q>>>0<=j>>>0){l=26;break a}if(k>>>0<(f[r+(j<<3)>>2]|0)>>>0)x=s;else{if((s|0)==(e|0)){l=84;break a}else y=s;while(1){z=f[y>>2]|0;if(q>>>0<=z>>>0){l=32;break a}if(k>>>0<(f[r+(z<<3)>>2]|0)>>>0)break;s=y+4|0;if((s|0)==(e|0)){l=84;break a}else y=s}f[y>>2]=j;f[e>>2]=z;x=y+4|0}if((x|0)==(e|0)){l=84;break a}r=f[h>>2]|0;A=f[c>>2]|0;k=f[A>>2]|0;q=(f[A+4>>2]|0)-k>>3;if(q>>>0<=r>>>0){l=38;break a}s=k;k=e;B=x;C=r;while(1){r=s+(C<<3)|0;D=q>>>0>C>>>0;E=B;while(1){F=f[E>>2]|0;if(q>>>0<=F>>>0){l=40;break a}G=f[r>>2]|0;if(G>>>0<(f[s+(F<<3)>>2]|0)>>>0)break;if(D)E=E+4|0;else{l=38;break a}}if(q>>>0>C>>>0)H=k;else{l=46;break a}do{H=H+-4|0;I=f[H>>2]|0;if(q>>>0<=I>>>0){l=47;break a}}while(G>>>0<(f[s+(I<<3)>>2]|0)>>>0);if(E>>>0>=H>>>0){h=E;continue b}D=f[E>>2]|0;f[E>>2]=I;f[H>>2]=D;C=f[h>>2]|0;if(q>>>0<=C>>>0){l=38;break a}else{k=H;B=E+4|0}}}if((l|0)==53){l=0;f[h>>2]=w;f[v>>2]=o;t=v;u=n+1|0}B=h+4|0;c:do if(B>>>0<t>>>0){k=f[B>>2]|0;C=f[c>>2]|0;q=f[C>>2]|0;s=(f[C+4>>2]|0)-q>>3;if(s>>>0>k>>>0){J=t;K=B;L=u;M=m;N=s;O=q;P=C;Q=k}else{R=C;l=57;break a}while(1){C=f[c>>2]|0;k=C+4|0;q=f[M>>2]|0;s=K;j=O;D=N;S=P;r=Q;while(1){F=j;if(D>>>0<=q>>>0){l=59;break a}if((f[F+(r<<3)>>2]|0)>>>0>=(f[F+(q<<3)>>2]|0)>>>0)break;F=s+4|0;T=f[F>>2]|0;j=f[C>>2]|0;D=(f[k>>2]|0)-j>>3;if(D>>>0<=T>>>0){R=C;l=57;break a}else{s=F;S=C;r=T}}C=f[M>>2]|0;O=f[S>>2]|0;N=(f[S+4>>2]|0)-O>>3;D=O;j=D+(C<<3)|0;if(N>>>0>C>>>0)U=J;else{l=65;break a}do{U=U+-4|0;V=f[U>>2]|0;if(N>>>0<=V>>>0){l=66;break a}}while((f[D+(V<<3)>>2]|0)>>>0>=(f[j>>2]|0)>>>0);if(s>>>0>U>>>0){W=M;X=L;Y=s;break c}f[s>>2]=V;f[U>>2]=r;K=s+4|0;Q=f[K>>2]|0;if(N>>>0<=Q>>>0){R=S;l=57;break a}else{J=U;L=L+1|0;M=(M|0)==(s|0)?U:M;P=S}}}else{W=m;X=u;Y=B}while(0);if((Y|0)!=(W|0)){B=f[W>>2]|0;j=f[Y>>2]|0;Z=f[c>>2]|0;D=f[Z>>2]|0;C=(f[Z+4>>2]|0)-D>>3;if(C>>>0<=B>>>0){l=72;break a}k=D;if(C>>>0<=j>>>0){l=74;break a}if((f[k+(B<<3)>>2]|0)>>>0<(f[k+(j<<3)>>2]|0)>>>0){f[Y>>2]=B;f[W>>2]=j;_=X+1|0}else _=X}else _=X;if(!_){$=_d(h,Y,c)|0;j=Y+4|0;if(_d(j,a,c)|0){l=83;break}if($){g=j;continue}}j=Y;if((j-i|0)>=(b-j|0)){l=82;break}Kb(h,Y,c);g=Y+4|0}if((l|0)==82){l=0;Kb(Y+4|0,a,c);d=h;a=Y;continue}else if((l|0)==83){l=0;if($){l=84;break}else{d=h;a=Y;continue}}}switch(l|0){case 5:{l=f[e>>2]|0;Y=f[h>>2]|0;d=f[c>>2]|0;$=f[d>>2]|0;i=(f[d+4>>2]|0)-$>>3;if(i>>>0<=l>>>0)aq(d);_=$;if(i>>>0<=Y>>>0)aq(d);if((f[_+(l<<3)>>2]|0)>>>0>=(f[_+(Y<<3)>>2]|0)>>>0)return;f[h>>2]=l;f[e>>2]=Y;return}case 11:{Vg(h,h+4|0,e,c)|0;return}case 12:{jh(h,h+4|0,h+8|0,e,c)|0;return}case 13:{ig(h,h+4|0,h+8|0,h+12|0,e,c)|0;return}case 15:{ih(h,a,c);return}case 20:{aq(p);break}case 22:{aq(p);break}case 26:{aq(p);break}case 32:{aq(p);break}case 38:{aq(A);break}case 40:{aq(A);break}case 46:{aq(A);break}case 47:{aq(A);break}case 51:{aq(p);break}case 57:{aq(R);break}case 59:{aq(S);break}case 65:{if(N>>>0>(f[J+-4>>2]|0)>>>0)aq(S);else aq(S);break}case 66:{aq(S);break}case 72:{aq(Z);break}case 74:{aq(Z);break}case 84:return}}function Lb(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0;d=a;a=b;a:while(1){b=a;e=a+-4|0;g=d;while(1){h=g;b:while(1){i=h;j=b-i|0;k=j>>2;switch(k|0){case 2:{l=5;break a;break}case 3:{l=11;break a;break}case 4:{l=12;break a;break}case 5:{l=13;break a;break}case 1:case 0:{l=84;break a;break}default:{}}if((j|0)<124){l=15;break a}m=h+(((k|0)/2|0)<<2)|0;if((j|0)>3996){j=(k|0)/4|0;n=ig(h,h+(j<<2)|0,m,m+(j<<2)|0,e,c)|0}else n=Vg(h,m,e,c)|0;o=f[h>>2]|0;j=f[m>>2]|0;p=f[c>>2]|0;k=f[p>>2]|0;q=(f[p+4>>2]|0)-k>>3;if(q>>>0<=o>>>0){l=20;break a}r=k;if(q>>>0<=j>>>0){l=22;break a}k=f[r+(o<<3)>>2]|0;s=f[r+(j<<3)>>2]|0;if(k>>>0<s>>>0){t=e;u=n;break}else v=e;while(1){v=v+-4|0;if((h|0)==(v|0))break;w=f[v>>2]|0;if(q>>>0<=w>>>0){l=51;break a}if((f[r+(w<<3)>>2]|0)>>>0<s>>>0){l=53;break b}}s=h+4|0;j=f[e>>2]|0;if(q>>>0<=j>>>0){l=26;break a}if(k>>>0<(f[r+(j<<3)>>2]|0)>>>0)x=s;else{if((s|0)==(e|0)){l=84;break a}else y=s;while(1){z=f[y>>2]|0;if(q>>>0<=z>>>0){l=32;break a}if(k>>>0<(f[r+(z<<3)>>2]|0)>>>0)break;s=y+4|0;if((s|0)==(e|0)){l=84;break a}else y=s}f[y>>2]=j;f[e>>2]=z;x=y+4|0}if((x|0)==(e|0)){l=84;break a}r=f[h>>2]|0;A=f[c>>2]|0;k=f[A>>2]|0;q=(f[A+4>>2]|0)-k>>3;if(q>>>0<=r>>>0){l=38;break a}s=k;k=e;B=x;C=r;while(1){r=s+(C<<3)|0;D=q>>>0>C>>>0;E=B;while(1){F=f[E>>2]|0;if(q>>>0<=F>>>0){l=40;break a}G=f[r>>2]|0;if(G>>>0<(f[s+(F<<3)>>2]|0)>>>0)break;if(D)E=E+4|0;else{l=38;break a}}if(q>>>0>C>>>0)H=k;else{l=46;break a}do{H=H+-4|0;I=f[H>>2]|0;if(q>>>0<=I>>>0){l=47;break a}}while(G>>>0<(f[s+(I<<3)>>2]|0)>>>0);if(E>>>0>=H>>>0){h=E;continue b}D=f[E>>2]|0;f[E>>2]=I;f[H>>2]=D;C=f[h>>2]|0;if(q>>>0<=C>>>0){l=38;break a}else{k=H;B=E+4|0}}}if((l|0)==53){l=0;f[h>>2]=w;f[v>>2]=o;t=v;u=n+1|0}B=h+4|0;c:do if(B>>>0<t>>>0){k=f[B>>2]|0;C=f[c>>2]|0;q=f[C>>2]|0;s=(f[C+4>>2]|0)-q>>3;if(s>>>0>k>>>0){J=t;K=B;L=u;M=m;N=s;O=q;P=C;Q=k}else{R=C;l=57;break a}while(1){C=f[c>>2]|0;k=C+4|0;q=f[M>>2]|0;s=K;j=O;D=N;S=P;r=Q;while(1){F=j;if(D>>>0<=q>>>0){l=59;break a}if((f[F+(r<<3)>>2]|0)>>>0>=(f[F+(q<<3)>>2]|0)>>>0)break;F=s+4|0;T=f[F>>2]|0;j=f[C>>2]|0;D=(f[k>>2]|0)-j>>3;if(D>>>0<=T>>>0){R=C;l=57;break a}else{s=F;S=C;r=T}}C=f[M>>2]|0;O=f[S>>2]|0;N=(f[S+4>>2]|0)-O>>3;D=O;j=D+(C<<3)|0;if(N>>>0>C>>>0)U=J;else{l=65;break a}do{U=U+-4|0;V=f[U>>2]|0;if(N>>>0<=V>>>0){l=66;break a}}while((f[D+(V<<3)>>2]|0)>>>0>=(f[j>>2]|0)>>>0);if(s>>>0>U>>>0){W=M;X=L;Y=s;break c}f[s>>2]=V;f[U>>2]=r;K=s+4|0;Q=f[K>>2]|0;if(N>>>0<=Q>>>0){R=S;l=57;break a}else{J=U;L=L+1|0;M=(M|0)==(s|0)?U:M;P=S}}}else{W=m;X=u;Y=B}while(0);if((Y|0)!=(W|0)){B=f[W>>2]|0;j=f[Y>>2]|0;Z=f[c>>2]|0;D=f[Z>>2]|0;C=(f[Z+4>>2]|0)-D>>3;if(C>>>0<=B>>>0){l=72;break a}k=D;if(C>>>0<=j>>>0){l=74;break a}if((f[k+(B<<3)>>2]|0)>>>0<(f[k+(j<<3)>>2]|0)>>>0){f[Y>>2]=B;f[W>>2]=j;_=X+1|0}else _=X}else _=X;if(!_){$=_d(h,Y,c)|0;j=Y+4|0;if(_d(j,a,c)|0){l=83;break}if($){g=j;continue}}j=Y;if((j-i|0)>=(b-j|0)){l=82;break}Lb(h,Y,c);g=Y+4|0}if((l|0)==82){l=0;Lb(Y+4|0,a,c);d=h;a=Y;continue}else if((l|0)==83){l=0;if($){l=84;break}else{d=h;a=Y;continue}}}switch(l|0){case 5:{l=f[e>>2]|0;Y=f[h>>2]|0;d=f[c>>2]|0;$=f[d>>2]|0;i=(f[d+4>>2]|0)-$>>3;if(i>>>0<=l>>>0)aq(d);_=$;if(i>>>0<=Y>>>0)aq(d);if((f[_+(l<<3)>>2]|0)>>>0>=(f[_+(Y<<3)>>2]|0)>>>0)return;f[h>>2]=l;f[e>>2]=Y;return}case 11:{Vg(h,h+4|0,e,c)|0;return}case 12:{jh(h,h+4|0,h+8|0,e,c)|0;return}case 13:{ig(h,h+4|0,h+8|0,h+12|0,e,c)|0;return}case 15:{ih(h,a,c);return}case 20:{aq(p);break}case 22:{aq(p);break}case 26:{aq(p);break}case 32:{aq(p);break}case 38:{aq(A);break}case 40:{aq(A);break}case 46:{aq(A);break}case 47:{aq(A);break}case 51:{aq(p);break}case 57:{aq(R);break}case 59:{aq(S);break}case 65:{if(N>>>0>(f[J+-4>>2]|0)>>>0)aq(S);else aq(S);break}case 66:{aq(S);break}case 72:{aq(Z);break}case 74:{aq(Z);break}case 84:return}}function Mb(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0;d=a;a=b;a:while(1){b=a;e=a+-4|0;g=d;while(1){h=g;b:while(1){i=h;j=b-i|0;k=j>>2;switch(k|0){case 2:{l=5;break a;break}case 3:{l=11;break a;break}case 4:{l=12;break a;break}case 5:{l=13;break a;break}case 1:case 0:{l=84;break a;break}default:{}}if((j|0)<124){l=15;break a}m=h+(((k|0)/2|0)<<2)|0;if((j|0)>3996){j=(k|0)/4|0;n=ig(h,h+(j<<2)|0,m,m+(j<<2)|0,e,c)|0}else n=Vg(h,m,e,c)|0;o=f[h>>2]|0;j=f[m>>2]|0;p=f[c>>2]|0;k=f[p>>2]|0;q=(f[p+4>>2]|0)-k>>3;if(q>>>0<=o>>>0){l=20;break a}r=k;if(q>>>0<=j>>>0){l=22;break a}k=f[r+(o<<3)>>2]|0;s=f[r+(j<<3)>>2]|0;if(k>>>0<s>>>0){t=e;u=n;break}else v=e;while(1){v=v+-4|0;if((h|0)==(v|0))break;w=f[v>>2]|0;if(q>>>0<=w>>>0){l=51;break a}if((f[r+(w<<3)>>2]|0)>>>0<s>>>0){l=53;break b}}s=h+4|0;j=f[e>>2]|0;if(q>>>0<=j>>>0){l=26;break a}if(k>>>0<(f[r+(j<<3)>>2]|0)>>>0)x=s;else{if((s|0)==(e|0)){l=84;break a}else y=s;while(1){z=f[y>>2]|0;if(q>>>0<=z>>>0){l=32;break a}if(k>>>0<(f[r+(z<<3)>>2]|0)>>>0)break;s=y+4|0;if((s|0)==(e|0)){l=84;break a}else y=s}f[y>>2]=j;f[e>>2]=z;x=y+4|0}if((x|0)==(e|0)){l=84;break a}r=f[h>>2]|0;A=f[c>>2]|0;k=f[A>>2]|0;q=(f[A+4>>2]|0)-k>>3;if(q>>>0<=r>>>0){l=38;break a}s=k;k=e;B=x;C=r;while(1){r=s+(C<<3)|0;D=q>>>0>C>>>0;E=B;while(1){F=f[E>>2]|0;if(q>>>0<=F>>>0){l=40;break a}G=f[r>>2]|0;if(G>>>0<(f[s+(F<<3)>>2]|0)>>>0)break;if(D)E=E+4|0;else{l=38;break a}}if(q>>>0>C>>>0)H=k;else{l=46;break a}do{H=H+-4|0;I=f[H>>2]|0;if(q>>>0<=I>>>0){l=47;break a}}while(G>>>0<(f[s+(I<<3)>>2]|0)>>>0);if(E>>>0>=H>>>0){h=E;continue b}D=f[E>>2]|0;f[E>>2]=I;f[H>>2]=D;C=f[h>>2]|0;if(q>>>0<=C>>>0){l=38;break a}else{k=H;B=E+4|0}}}if((l|0)==53){l=0;f[h>>2]=w;f[v>>2]=o;t=v;u=n+1|0}B=h+4|0;c:do if(B>>>0<t>>>0){k=f[B>>2]|0;C=f[c>>2]|0;q=f[C>>2]|0;s=(f[C+4>>2]|0)-q>>3;if(s>>>0>k>>>0){J=t;K=B;L=u;M=m;N=s;O=q;P=C;Q=k}else{R=C;l=57;break a}while(1){C=f[c>>2]|0;k=C+4|0;q=f[M>>2]|0;s=K;j=O;D=N;S=P;r=Q;while(1){F=j;if(D>>>0<=q>>>0){l=59;break a}if((f[F+(r<<3)>>2]|0)>>>0>=(f[F+(q<<3)>>2]|0)>>>0)break;F=s+4|0;T=f[F>>2]|0;j=f[C>>2]|0;D=(f[k>>2]|0)-j>>3;if(D>>>0<=T>>>0){R=C;l=57;break a}else{s=F;S=C;r=T}}C=f[M>>2]|0;O=f[S>>2]|0;N=(f[S+4>>2]|0)-O>>3;D=O;j=D+(C<<3)|0;if(N>>>0>C>>>0)U=J;else{l=65;break a}do{U=U+-4|0;V=f[U>>2]|0;if(N>>>0<=V>>>0){l=66;break a}}while((f[D+(V<<3)>>2]|0)>>>0>=(f[j>>2]|0)>>>0);if(s>>>0>U>>>0){W=M;X=L;Y=s;break c}f[s>>2]=V;f[U>>2]=r;K=s+4|0;Q=f[K>>2]|0;if(N>>>0<=Q>>>0){R=S;l=57;break a}else{J=U;L=L+1|0;M=(M|0)==(s|0)?U:M;P=S}}}else{W=m;X=u;Y=B}while(0);if((Y|0)!=(W|0)){B=f[W>>2]|0;j=f[Y>>2]|0;Z=f[c>>2]|0;D=f[Z>>2]|0;C=(f[Z+4>>2]|0)-D>>3;if(C>>>0<=B>>>0){l=72;break a}k=D;if(C>>>0<=j>>>0){l=74;break a}if((f[k+(B<<3)>>2]|0)>>>0<(f[k+(j<<3)>>2]|0)>>>0){f[Y>>2]=B;f[W>>2]=j;_=X+1|0}else _=X}else _=X;if(!_){$=_d(h,Y,c)|0;j=Y+4|0;if(_d(j,a,c)|0){l=83;break}if($){g=j;continue}}j=Y;if((j-i|0)>=(b-j|0)){l=82;break}Mb(h,Y,c);g=Y+4|0}if((l|0)==82){l=0;Mb(Y+4|0,a,c);d=h;a=Y;continue}else if((l|0)==83){l=0;if($){l=84;break}else{d=h;a=Y;continue}}}switch(l|0){case 5:{l=f[e>>2]|0;Y=f[h>>2]|0;d=f[c>>2]|0;$=f[d>>2]|0;i=(f[d+4>>2]|0)-$>>3;if(i>>>0<=l>>>0)aq(d);_=$;if(i>>>0<=Y>>>0)aq(d);if((f[_+(l<<3)>>2]|0)>>>0>=(f[_+(Y<<3)>>2]|0)>>>0)return;f[h>>2]=l;f[e>>2]=Y;return}case 11:{Vg(h,h+4|0,e,c)|0;return}case 12:{jh(h,h+4|0,h+8|0,e,c)|0;return}case 13:{ig(h,h+4|0,h+8|0,h+12|0,e,c)|0;return}case 15:{ih(h,a,c);return}case 20:{aq(p);break}case 22:{aq(p);break}case 26:{aq(p);break}case 32:{aq(p);break}case 38:{aq(A);break}case 40:{aq(A);break}case 46:{aq(A);break}case 47:{aq(A);break}case 51:{aq(p);break}case 57:{aq(R);break}case 59:{aq(S);break}case 65:{if(N>>>0>(f[J+-4>>2]|0)>>>0)aq(S);else aq(S);break}case 66:{aq(S);break}case 72:{aq(Z);break}case 74:{aq(Z);break}case 84:return}}function Nb(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0;d=a;a=b;a:while(1){b=a;e=a+-4|0;g=d;while(1){h=g;b:while(1){i=h;j=b-i|0;k=j>>2;switch(k|0){case 2:{l=5;break a;break}case 3:{l=11;break a;break}case 4:{l=12;break a;break}case 5:{l=13;break a;break}case 1:case 0:{l=84;break a;break}default:{}}if((j|0)<124){l=15;break a}m=h+(((k|0)/2|0)<<2)|0;if((j|0)>3996){j=(k|0)/4|0;n=ig(h,h+(j<<2)|0,m,m+(j<<2)|0,e,c)|0}else n=Vg(h,m,e,c)|0;o=f[h>>2]|0;j=f[m>>2]|0;p=f[c>>2]|0;k=f[p>>2]|0;q=(f[p+4>>2]|0)-k>>3;if(q>>>0<=o>>>0){l=20;break a}r=k;if(q>>>0<=j>>>0){l=22;break a}k=f[r+(o<<3)>>2]|0;s=f[r+(j<<3)>>2]|0;if(k>>>0<s>>>0){t=e;u=n;break}else v=e;while(1){v=v+-4|0;if((h|0)==(v|0))break;w=f[v>>2]|0;if(q>>>0<=w>>>0){l=51;break a}if((f[r+(w<<3)>>2]|0)>>>0<s>>>0){l=53;break b}}s=h+4|0;j=f[e>>2]|0;if(q>>>0<=j>>>0){l=26;break a}if(k>>>0<(f[r+(j<<3)>>2]|0)>>>0)x=s;else{if((s|0)==(e|0)){l=84;break a}else y=s;while(1){z=f[y>>2]|0;if(q>>>0<=z>>>0){l=32;break a}if(k>>>0<(f[r+(z<<3)>>2]|0)>>>0)break;s=y+4|0;if((s|0)==(e|0)){l=84;break a}else y=s}f[y>>2]=j;f[e>>2]=z;x=y+4|0}if((x|0)==(e|0)){l=84;break a}r=f[h>>2]|0;A=f[c>>2]|0;k=f[A>>2]|0;q=(f[A+4>>2]|0)-k>>3;if(q>>>0<=r>>>0){l=38;break a}s=k;k=e;B=x;C=r;while(1){r=s+(C<<3)|0;D=q>>>0>C>>>0;E=B;while(1){F=f[E>>2]|0;if(q>>>0<=F>>>0){l=40;break a}G=f[r>>2]|0;if(G>>>0<(f[s+(F<<3)>>2]|0)>>>0)break;if(D)E=E+4|0;else{l=38;break a}}if(q>>>0>C>>>0)H=k;else{l=46;break a}do{H=H+-4|0;I=f[H>>2]|0;if(q>>>0<=I>>>0){l=47;break a}}while(G>>>0<(f[s+(I<<3)>>2]|0)>>>0);if(E>>>0>=H>>>0){h=E;continue b}D=f[E>>2]|0;f[E>>2]=I;f[H>>2]=D;C=f[h>>2]|0;if(q>>>0<=C>>>0){l=38;break a}else{k=H;B=E+4|0}}}if((l|0)==53){l=0;f[h>>2]=w;f[v>>2]=o;t=v;u=n+1|0}B=h+4|0;c:do if(B>>>0<t>>>0){k=f[B>>2]|0;C=f[c>>2]|0;q=f[C>>2]|0;s=(f[C+4>>2]|0)-q>>3;if(s>>>0>k>>>0){J=t;K=B;L=u;M=m;N=s;O=q;P=C;Q=k}else{R=C;l=57;break a}while(1){C=f[c>>2]|0;k=C+4|0;q=f[M>>2]|0;s=K;j=O;D=N;S=P;r=Q;while(1){F=j;if(D>>>0<=q>>>0){l=59;break a}if((f[F+(r<<3)>>2]|0)>>>0>=(f[F+(q<<3)>>2]|0)>>>0)break;F=s+4|0;T=f[F>>2]|0;j=f[C>>2]|0;D=(f[k>>2]|0)-j>>3;if(D>>>0<=T>>>0){R=C;l=57;break a}else{s=F;S=C;r=T}}C=f[M>>2]|0;O=f[S>>2]|0;N=(f[S+4>>2]|0)-O>>3;D=O;j=D+(C<<3)|0;if(N>>>0>C>>>0)U=J;else{l=65;break a}do{U=U+-4|0;V=f[U>>2]|0;if(N>>>0<=V>>>0){l=66;break a}}while((f[D+(V<<3)>>2]|0)>>>0>=(f[j>>2]|0)>>>0);if(s>>>0>U>>>0){W=M;X=L;Y=s;break c}f[s>>2]=V;f[U>>2]=r;K=s+4|0;Q=f[K>>2]|0;if(N>>>0<=Q>>>0){R=S;l=57;break a}else{J=U;L=L+1|0;M=(M|0)==(s|0)?U:M;P=S}}}else{W=m;X=u;Y=B}while(0);if((Y|0)!=(W|0)){B=f[W>>2]|0;j=f[Y>>2]|0;Z=f[c>>2]|0;D=f[Z>>2]|0;C=(f[Z+4>>2]|0)-D>>3;if(C>>>0<=B>>>0){l=72;break a}k=D;if(C>>>0<=j>>>0){l=74;break a}if((f[k+(B<<3)>>2]|0)>>>0<(f[k+(j<<3)>>2]|0)>>>0){f[Y>>2]=B;f[W>>2]=j;_=X+1|0}else _=X}else _=X;if(!_){$=_d(h,Y,c)|0;j=Y+4|0;if(_d(j,a,c)|0){l=83;break}if($){g=j;continue}}j=Y;if((j-i|0)>=(b-j|0)){l=82;break}Nb(h,Y,c);g=Y+4|0}if((l|0)==82){l=0;Nb(Y+4|0,a,c);d=h;a=Y;continue}else if((l|0)==83){l=0;if($){l=84;break}else{d=h;a=Y;continue}}}switch(l|0){case 5:{l=f[e>>2]|0;Y=f[h>>2]|0;d=f[c>>2]|0;$=f[d>>2]|0;i=(f[d+4>>2]|0)-$>>3;if(i>>>0<=l>>>0)aq(d);_=$;if(i>>>0<=Y>>>0)aq(d);if((f[_+(l<<3)>>2]|0)>>>0>=(f[_+(Y<<3)>>2]|0)>>>0)return;f[h>>2]=l;f[e>>2]=Y;return}case 11:{Vg(h,h+4|0,e,c)|0;return}case 12:{jh(h,h+4|0,h+8|0,e,c)|0;return}case 13:{ig(h,h+4|0,h+8|0,h+12|0,e,c)|0;return}case 15:{ih(h,a,c);return}case 20:{aq(p);break}case 22:{aq(p);break}case 26:{aq(p);break}case 32:{aq(p);break}case 38:{aq(A);break}case 40:{aq(A);break}case 46:{aq(A);break}case 47:{aq(A);break}case 51:{aq(p);break}case 57:{aq(R);break}case 59:{aq(S);break}case 65:{if(N>>>0>(f[J+-4>>2]|0)>>>0)aq(S);else aq(S);break}case 66:{aq(S);break}case 72:{aq(Z);break}case 74:{aq(Z);break}case 84:return}}function Ob(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0;d=a;a=b;a:while(1){b=a;e=a+-4|0;g=d;while(1){h=g;b:while(1){i=h;j=b-i|0;k=j>>2;switch(k|0){case 2:{l=5;break a;break}case 3:{l=11;break a;break}case 4:{l=12;break a;break}case 5:{l=13;break a;break}case 1:case 0:{l=84;break a;break}default:{}}if((j|0)<124){l=15;break a}m=h+(((k|0)/2|0)<<2)|0;if((j|0)>3996){j=(k|0)/4|0;n=ig(h,h+(j<<2)|0,m,m+(j<<2)|0,e,c)|0}else n=Vg(h,m,e,c)|0;o=f[h>>2]|0;j=f[m>>2]|0;p=f[c>>2]|0;k=f[p>>2]|0;q=(f[p+4>>2]|0)-k>>3;if(q>>>0<=o>>>0){l=20;break a}r=k;if(q>>>0<=j>>>0){l=22;break a}k=f[r+(o<<3)>>2]|0;s=f[r+(j<<3)>>2]|0;if(k>>>0<s>>>0){t=e;u=n;break}else v=e;while(1){v=v+-4|0;if((h|0)==(v|0))break;w=f[v>>2]|0;if(q>>>0<=w>>>0){l=51;break a}if((f[r+(w<<3)>>2]|0)>>>0<s>>>0){l=53;break b}}s=h+4|0;j=f[e>>2]|0;if(q>>>0<=j>>>0){l=26;break a}if(k>>>0<(f[r+(j<<3)>>2]|0)>>>0)x=s;else{if((s|0)==(e|0)){l=84;break a}else y=s;while(1){z=f[y>>2]|0;if(q>>>0<=z>>>0){l=32;break a}if(k>>>0<(f[r+(z<<3)>>2]|0)>>>0)break;s=y+4|0;if((s|0)==(e|0)){l=84;break a}else y=s}f[y>>2]=j;f[e>>2]=z;x=y+4|0}if((x|0)==(e|0)){l=84;break a}r=f[h>>2]|0;A=f[c>>2]|0;k=f[A>>2]|0;q=(f[A+4>>2]|0)-k>>3;if(q>>>0<=r>>>0){l=38;break a}s=k;k=e;B=x;C=r;while(1){r=s+(C<<3)|0;D=q>>>0>C>>>0;E=B;while(1){F=f[E>>2]|0;if(q>>>0<=F>>>0){l=40;break a}G=f[r>>2]|0;if(G>>>0<(f[s+(F<<3)>>2]|0)>>>0)break;if(D)E=E+4|0;else{l=38;break a}}if(q>>>0>C>>>0)H=k;else{l=46;break a}do{H=H+-4|0;I=f[H>>2]|0;if(q>>>0<=I>>>0){l=47;break a}}while(G>>>0<(f[s+(I<<3)>>2]|0)>>>0);if(E>>>0>=H>>>0){h=E;continue b}D=f[E>>2]|0;f[E>>2]=I;f[H>>2]=D;C=f[h>>2]|0;if(q>>>0<=C>>>0){l=38;break a}else{k=H;B=E+4|0}}}if((l|0)==53){l=0;f[h>>2]=w;f[v>>2]=o;t=v;u=n+1|0}B=h+4|0;c:do if(B>>>0<t>>>0){k=f[B>>2]|0;C=f[c>>2]|0;q=f[C>>2]|0;s=(f[C+4>>2]|0)-q>>3;if(s>>>0>k>>>0){J=t;K=B;L=u;M=m;N=s;O=q;P=C;Q=k}else{R=C;l=57;break a}while(1){C=f[c>>2]|0;k=C+4|0;q=f[M>>2]|0;s=K;j=O;D=N;S=P;r=Q;while(1){F=j;if(D>>>0<=q>>>0){l=59;break a}if((f[F+(r<<3)>>2]|0)>>>0>=(f[F+(q<<3)>>2]|0)>>>0)break;F=s+4|0;T=f[F>>2]|0;j=f[C>>2]|0;D=(f[k>>2]|0)-j>>3;if(D>>>0<=T>>>0){R=C;l=57;break a}else{s=F;S=C;r=T}}C=f[M>>2]|0;O=f[S>>2]|0;N=(f[S+4>>2]|0)-O>>3;D=O;j=D+(C<<3)|0;if(N>>>0>C>>>0)U=J;else{l=65;break a}do{U=U+-4|0;V=f[U>>2]|0;if(N>>>0<=V>>>0){l=66;break a}}while((f[D+(V<<3)>>2]|0)>>>0>=(f[j>>2]|0)>>>0);if(s>>>0>U>>>0){W=M;X=L;Y=s;break c}f[s>>2]=V;f[U>>2]=r;K=s+4|0;Q=f[K>>2]|0;if(N>>>0<=Q>>>0){R=S;l=57;break a}else{J=U;L=L+1|0;M=(M|0)==(s|0)?U:M;P=S}}}else{W=m;X=u;Y=B}while(0);if((Y|0)!=(W|0)){B=f[W>>2]|0;j=f[Y>>2]|0;Z=f[c>>2]|0;D=f[Z>>2]|0;C=(f[Z+4>>2]|0)-D>>3;if(C>>>0<=B>>>0){l=72;break a}k=D;if(C>>>0<=j>>>0){l=74;break a}if((f[k+(B<<3)>>2]|0)>>>0<(f[k+(j<<3)>>2]|0)>>>0){f[Y>>2]=B;f[W>>2]=j;_=X+1|0}else _=X}else _=X;if(!_){$=_d(h,Y,c)|0;j=Y+4|0;if(_d(j,a,c)|0){l=83;break}if($){g=j;continue}}j=Y;if((j-i|0)>=(b-j|0)){l=82;break}Ob(h,Y,c);g=Y+4|0}if((l|0)==82){l=0;Ob(Y+4|0,a,c);d=h;a=Y;continue}else if((l|0)==83){l=0;if($){l=84;break}else{d=h;a=Y;continue}}}switch(l|0){case 5:{l=f[e>>2]|0;Y=f[h>>2]|0;d=f[c>>2]|0;$=f[d>>2]|0;i=(f[d+4>>2]|0)-$>>3;if(i>>>0<=l>>>0)aq(d);_=$;if(i>>>0<=Y>>>0)aq(d);if((f[_+(l<<3)>>2]|0)>>>0>=(f[_+(Y<<3)>>2]|0)>>>0)return;f[h>>2]=l;f[e>>2]=Y;return}case 11:{Vg(h,h+4|0,e,c)|0;return}case 12:{jh(h,h+4|0,h+8|0,e,c)|0;return}case 13:{ig(h,h+4|0,h+8|0,h+12|0,e,c)|0;return}case 15:{ih(h,a,c);return}case 20:{aq(p);break}case 22:{aq(p);break}case 26:{aq(p);break}case 32:{aq(p);break}case 38:{aq(A);break}case 40:{aq(A);break}case 46:{aq(A);break}case 47:{aq(A);break}case 51:{aq(p);break}case 57:{aq(R);break}case 59:{aq(S);break}case 65:{if(N>>>0>(f[J+-4>>2]|0)>>>0)aq(S);else aq(S);break}case 66:{aq(S);break}case 72:{aq(Z);break}case 74:{aq(Z);break}case 84:return}}function Pb(a,c,e,g){a=a|0;c=c|0;e=e|0;g=g|0;var i=0,k=0,l=0,m=0,o=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0;if(!g){i=0;return i|0}do switch(f[a+28>>2]|0){case 1:{k=a+24|0;l=b[k>>0]|0;if((l<<24>>24>e<<24>>24?e:l)<<24>>24>0){m=f[f[a>>2]>>2]|0;o=a+40|0;q=un(f[o>>2]|0,f[o+4>>2]|0,f[c>>2]|0,0)|0;o=a+48|0;r=Vn(q|0,I|0,f[o>>2]|0,f[o+4>>2]|0)|0;o=m+r|0;r=0;while(1){f[g+(r<<2)>>2]=b[o>>0];r=r+1|0;m=b[k>>0]|0;if((r|0)>=((m<<24>>24>e<<24>>24?e:m)<<24>>24|0)){s=m;break}else o=o+1|0}}else s=l;o=s<<24>>24;if(s<<24>>24>=e<<24>>24){i=1;return i|0}sj(g+(o<<2)|0,0,(e<<24>>24)-o<<2|0)|0;i=1;return i|0}case 2:{o=a+24|0;r=b[o>>0]|0;if((r<<24>>24>e<<24>>24?e:r)<<24>>24>0){k=f[f[a>>2]>>2]|0;m=a+40|0;q=un(f[m>>2]|0,f[m+4>>2]|0,f[c>>2]|0,0)|0;m=a+48|0;t=Vn(q|0,I|0,f[m>>2]|0,f[m+4>>2]|0)|0;m=k+t|0;t=0;while(1){f[g+(t<<2)>>2]=h[m>>0];t=t+1|0;k=b[o>>0]|0;if((t|0)>=((k<<24>>24>e<<24>>24?e:k)<<24>>24|0)){u=k;break}else m=m+1|0}}else u=r;m=u<<24>>24;if(u<<24>>24>=e<<24>>24){i=1;return i|0}sj(g+(m<<2)|0,0,(e<<24>>24)-m<<2|0)|0;i=1;return i|0}case 3:{m=a+24|0;t=b[m>>0]|0;if((t<<24>>24>e<<24>>24?e:t)<<24>>24>0){o=f[f[a>>2]>>2]|0;l=a+40|0;k=un(f[l>>2]|0,f[l+4>>2]|0,f[c>>2]|0,0)|0;l=a+48|0;q=Vn(k|0,I|0,f[l>>2]|0,f[l+4>>2]|0)|0;l=o+q|0;q=0;while(1){f[g+(q<<2)>>2]=d[l>>1];q=q+1|0;o=b[m>>0]|0;if((q|0)>=((o<<24>>24>e<<24>>24?e:o)<<24>>24|0)){v=o;break}else l=l+2|0}}else v=t;l=v<<24>>24;if(v<<24>>24>=e<<24>>24){i=1;return i|0}sj(g+(l<<2)|0,0,(e<<24>>24)-l<<2|0)|0;i=1;return i|0}case 4:{l=a+24|0;q=b[l>>0]|0;if((q<<24>>24>e<<24>>24?e:q)<<24>>24>0){m=f[f[a>>2]>>2]|0;r=a+40|0;o=un(f[r>>2]|0,f[r+4>>2]|0,f[c>>2]|0,0)|0;r=a+48|0;k=Vn(o|0,I|0,f[r>>2]|0,f[r+4>>2]|0)|0;r=m+k|0;k=0;while(1){f[g+(k<<2)>>2]=j[r>>1];k=k+1|0;m=b[l>>0]|0;if((k|0)>=((m<<24>>24>e<<24>>24?e:m)<<24>>24|0)){w=m;break}else r=r+2|0}}else w=q;r=w<<24>>24;if(w<<24>>24>=e<<24>>24){i=1;return i|0}sj(g+(r<<2)|0,0,(e<<24>>24)-r<<2|0)|0;i=1;return i|0}case 5:{r=a+24|0;k=b[r>>0]|0;if((k<<24>>24>e<<24>>24?e:k)<<24>>24>0){l=f[f[a>>2]>>2]|0;t=a+40|0;m=un(f[t>>2]|0,f[t+4>>2]|0,f[c>>2]|0,0)|0;t=a+48|0;o=Vn(m|0,I|0,f[t>>2]|0,f[t+4>>2]|0)|0;t=l+o|0;o=0;while(1){f[g+(o<<2)>>2]=f[t>>2];o=o+1|0;l=b[r>>0]|0;if((o|0)>=((l<<24>>24>e<<24>>24?e:l)<<24>>24|0)){x=l;break}else t=t+4|0}}else x=k;t=x<<24>>24;if(x<<24>>24>=e<<24>>24){i=1;return i|0}sj(g+(t<<2)|0,0,(e<<24>>24)-t<<2|0)|0;i=1;return i|0}case 6:{t=a+24|0;o=b[t>>0]|0;if((o<<24>>24>e<<24>>24?e:o)<<24>>24>0){r=f[f[a>>2]>>2]|0;q=a+40|0;l=un(f[q>>2]|0,f[q+4>>2]|0,f[c>>2]|0,0)|0;q=a+48|0;m=Vn(l|0,I|0,f[q>>2]|0,f[q+4>>2]|0)|0;q=r+m|0;m=0;while(1){f[g+(m<<2)>>2]=f[q>>2];m=m+1|0;r=b[t>>0]|0;if((m|0)>=((r<<24>>24>e<<24>>24?e:r)<<24>>24|0)){y=r;break}else q=q+4|0}}else y=o;q=y<<24>>24;if(y<<24>>24>=e<<24>>24){i=1;return i|0}sj(g+(q<<2)|0,0,(e<<24>>24)-q<<2|0)|0;i=1;return i|0}case 7:{q=a+24|0;m=b[q>>0]|0;if((m<<24>>24>e<<24>>24?e:m)<<24>>24>0){t=f[f[a>>2]>>2]|0;k=a+40|0;r=un(f[k>>2]|0,f[k+4>>2]|0,f[c>>2]|0,0)|0;k=a+48|0;l=Vn(r|0,I|0,f[k>>2]|0,f[k+4>>2]|0)|0;k=t+l|0;l=0;while(1){f[g+(l<<2)>>2]=f[k>>2];l=l+1|0;t=b[q>>0]|0;if((l|0)>=((t<<24>>24>e<<24>>24?e:t)<<24>>24|0)){z=t;break}else k=k+8|0}}else z=m;k=z<<24>>24;if(z<<24>>24>=e<<24>>24){i=1;return i|0}sj(g+(k<<2)|0,0,(e<<24>>24)-k<<2|0)|0;i=1;return i|0}case 8:{k=a+24|0;l=b[k>>0]|0;if((l<<24>>24>e<<24>>24?e:l)<<24>>24>0){q=f[f[a>>2]>>2]|0;o=a+40|0;t=un(f[o>>2]|0,f[o+4>>2]|0,f[c>>2]|0,0)|0;o=a+48|0;r=Vn(t|0,I|0,f[o>>2]|0,f[o+4>>2]|0)|0;o=q+r|0;r=0;while(1){f[g+(r<<2)>>2]=f[o>>2];r=r+1|0;q=b[k>>0]|0;if((r|0)>=((q<<24>>24>e<<24>>24?e:q)<<24>>24|0)){A=q;break}else o=o+8|0}}else A=l;o=A<<24>>24;if(A<<24>>24>=e<<24>>24){i=1;return i|0}sj(g+(o<<2)|0,0,(e<<24>>24)-o<<2|0)|0;i=1;return i|0}case 9:{o=a+24|0;r=b[o>>0]|0;if((r<<24>>24>e<<24>>24?e:r)<<24>>24>0){k=f[f[a>>2]>>2]|0;m=a+40|0;q=un(f[m>>2]|0,f[m+4>>2]|0,f[c>>2]|0,0)|0;m=a+48|0;t=Vn(q|0,I|0,f[m>>2]|0,f[m+4>>2]|0)|0;m=k+t|0;t=0;while(1){k=~~$(n[m>>2])>>>0;f[g+(t<<2)>>2]=k;t=t+1|0;k=b[o>>0]|0;if((t|0)>=((k<<24>>24>e<<24>>24?e:k)<<24>>24|0)){B=k;break}else m=m+4|0}}else B=r;m=B<<24>>24;if(B<<24>>24>=e<<24>>24){i=1;return i|0}sj(g+(m<<2)|0,0,(e<<24>>24)-m<<2|0)|0;i=1;return i|0}case 10:{m=a+24|0;t=b[m>>0]|0;if((t<<24>>24>e<<24>>24?e:t)<<24>>24>0){o=f[f[a>>2]>>2]|0;l=a+40|0;k=un(f[l>>2]|0,f[l+4>>2]|0,f[c>>2]|0,0)|0;l=a+48|0;q=Vn(k|0,I|0,f[l>>2]|0,f[l+4>>2]|0)|0;l=o+q|0;q=0;while(1){f[g+(q<<2)>>2]=~~+p[l>>3]>>>0;q=q+1|0;o=b[m>>0]|0;if((q|0)>=((o<<24>>24>e<<24>>24?e:o)<<24>>24|0)){C=o;break}else l=l+8|0}}else C=t;l=C<<24>>24;if(C<<24>>24>=e<<24>>24){i=1;return i|0}sj(g+(l<<2)|0,0,(e<<24>>24)-l<<2|0)|0;i=1;return i|0}case 11:{l=a+24|0;q=b[l>>0]|0;if((q<<24>>24>e<<24>>24?e:q)<<24>>24>0){m=f[f[a>>2]>>2]|0;r=a+40|0;o=un(f[r>>2]|0,f[r+4>>2]|0,f[c>>2]|0,0)|0;r=a+48|0;k=Vn(o|0,I|0,f[r>>2]|0,f[r+4>>2]|0)|0;r=m+k|0;k=0;while(1){f[g+(k<<2)>>2]=h[r>>0];k=k+1|0;m=b[l>>0]|0;if((k|0)>=((m<<24>>24>e<<24>>24?e:m)<<24>>24|0)){D=m;break}else r=r+1|0}}else D=q;r=D<<24>>24;if(D<<24>>24>=e<<24>>24){i=1;return i|0}sj(g+(r<<2)|0,0,(e<<24>>24)-r<<2|0)|0;i=1;return i|0}default:{i=0;return i|0}}while(0);return 0}function Qb(a,c,e,g){a=a|0;c=c|0;e=e|0;g=g|0;var i=0,k=0,l=0,m=0,o=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0;if(!g){i=0;return i|0}do switch(f[a+28>>2]|0){case 1:{k=a+24|0;l=b[k>>0]|0;if((l<<24>>24>e<<24>>24?e:l)<<24>>24>0){m=f[f[a>>2]>>2]|0;o=a+40|0;q=un(f[o>>2]|0,f[o+4>>2]|0,f[c>>2]|0,0)|0;o=a+48|0;r=Vn(q|0,I|0,f[o>>2]|0,f[o+4>>2]|0)|0;o=m+r|0;r=0;while(1){f[g+(r<<2)>>2]=b[o>>0];r=r+1|0;m=b[k>>0]|0;if((r|0)>=((m<<24>>24>e<<24>>24?e:m)<<24>>24|0)){s=m;break}else o=o+1|0}}else s=l;o=s<<24>>24;if(s<<24>>24>=e<<24>>24){i=1;return i|0}sj(g+(o<<2)|0,0,(e<<24>>24)-o<<2|0)|0;i=1;return i|0}case 2:{o=a+24|0;r=b[o>>0]|0;if((r<<24>>24>e<<24>>24?e:r)<<24>>24>0){k=f[f[a>>2]>>2]|0;m=a+40|0;q=un(f[m>>2]|0,f[m+4>>2]|0,f[c>>2]|0,0)|0;m=a+48|0;t=Vn(q|0,I|0,f[m>>2]|0,f[m+4>>2]|0)|0;m=k+t|0;t=0;while(1){f[g+(t<<2)>>2]=h[m>>0];t=t+1|0;k=b[o>>0]|0;if((t|0)>=((k<<24>>24>e<<24>>24?e:k)<<24>>24|0)){u=k;break}else m=m+1|0}}else u=r;m=u<<24>>24;if(u<<24>>24>=e<<24>>24){i=1;return i|0}sj(g+(m<<2)|0,0,(e<<24>>24)-m<<2|0)|0;i=1;return i|0}case 3:{m=a+24|0;t=b[m>>0]|0;if((t<<24>>24>e<<24>>24?e:t)<<24>>24>0){o=f[f[a>>2]>>2]|0;l=a+40|0;k=un(f[l>>2]|0,f[l+4>>2]|0,f[c>>2]|0,0)|0;l=a+48|0;q=Vn(k|0,I|0,f[l>>2]|0,f[l+4>>2]|0)|0;l=o+q|0;q=0;while(1){f[g+(q<<2)>>2]=d[l>>1];q=q+1|0;o=b[m>>0]|0;if((q|0)>=((o<<24>>24>e<<24>>24?e:o)<<24>>24|0)){v=o;break}else l=l+2|0}}else v=t;l=v<<24>>24;if(v<<24>>24>=e<<24>>24){i=1;return i|0}sj(g+(l<<2)|0,0,(e<<24>>24)-l<<2|0)|0;i=1;return i|0}case 4:{l=a+24|0;q=b[l>>0]|0;if((q<<24>>24>e<<24>>24?e:q)<<24>>24>0){m=f[f[a>>2]>>2]|0;r=a+40|0;o=un(f[r>>2]|0,f[r+4>>2]|0,f[c>>2]|0,0)|0;r=a+48|0;k=Vn(o|0,I|0,f[r>>2]|0,f[r+4>>2]|0)|0;r=m+k|0;k=0;while(1){f[g+(k<<2)>>2]=j[r>>1];k=k+1|0;m=b[l>>0]|0;if((k|0)>=((m<<24>>24>e<<24>>24?e:m)<<24>>24|0)){w=m;break}else r=r+2|0}}else w=q;r=w<<24>>24;if(w<<24>>24>=e<<24>>24){i=1;return i|0}sj(g+(r<<2)|0,0,(e<<24>>24)-r<<2|0)|0;i=1;return i|0}case 5:{r=a+24|0;k=b[r>>0]|0;if((k<<24>>24>e<<24>>24?e:k)<<24>>24>0){l=f[f[a>>2]>>2]|0;t=a+40|0;m=un(f[t>>2]|0,f[t+4>>2]|0,f[c>>2]|0,0)|0;t=a+48|0;o=Vn(m|0,I|0,f[t>>2]|0,f[t+4>>2]|0)|0;t=l+o|0;o=0;while(1){f[g+(o<<2)>>2]=f[t>>2];o=o+1|0;l=b[r>>0]|0;if((o|0)>=((l<<24>>24>e<<24>>24?e:l)<<24>>24|0)){x=l;break}else t=t+4|0}}else x=k;t=x<<24>>24;if(x<<24>>24>=e<<24>>24){i=1;return i|0}sj(g+(t<<2)|0,0,(e<<24>>24)-t<<2|0)|0;i=1;return i|0}case 6:{t=a+24|0;o=b[t>>0]|0;if((o<<24>>24>e<<24>>24?e:o)<<24>>24>0){r=f[f[a>>2]>>2]|0;q=a+40|0;l=un(f[q>>2]|0,f[q+4>>2]|0,f[c>>2]|0,0)|0;q=a+48|0;m=Vn(l|0,I|0,f[q>>2]|0,f[q+4>>2]|0)|0;q=r+m|0;m=0;while(1){f[g+(m<<2)>>2]=f[q>>2];m=m+1|0;r=b[t>>0]|0;if((m|0)>=((r<<24>>24>e<<24>>24?e:r)<<24>>24|0)){y=r;break}else q=q+4|0}}else y=o;q=y<<24>>24;if(y<<24>>24>=e<<24>>24){i=1;return i|0}sj(g+(q<<2)|0,0,(e<<24>>24)-q<<2|0)|0;i=1;return i|0}case 7:{q=a+24|0;m=b[q>>0]|0;if((m<<24>>24>e<<24>>24?e:m)<<24>>24>0){t=f[f[a>>2]>>2]|0;k=a+40|0;r=un(f[k>>2]|0,f[k+4>>2]|0,f[c>>2]|0,0)|0;k=a+48|0;l=Vn(r|0,I|0,f[k>>2]|0,f[k+4>>2]|0)|0;k=t+l|0;l=0;while(1){f[g+(l<<2)>>2]=f[k>>2];l=l+1|0;t=b[q>>0]|0;if((l|0)>=((t<<24>>24>e<<24>>24?e:t)<<24>>24|0)){z=t;break}else k=k+8|0}}else z=m;k=z<<24>>24;if(z<<24>>24>=e<<24>>24){i=1;return i|0}sj(g+(k<<2)|0,0,(e<<24>>24)-k<<2|0)|0;i=1;return i|0}case 8:{k=a+24|0;l=b[k>>0]|0;if((l<<24>>24>e<<24>>24?e:l)<<24>>24>0){q=f[f[a>>2]>>2]|0;o=a+40|0;t=un(f[o>>2]|0,f[o+4>>2]|0,f[c>>2]|0,0)|0;o=a+48|0;r=Vn(t|0,I|0,f[o>>2]|0,f[o+4>>2]|0)|0;o=q+r|0;r=0;while(1){f[g+(r<<2)>>2]=f[o>>2];r=r+1|0;q=b[k>>0]|0;if((r|0)>=((q<<24>>24>e<<24>>24?e:q)<<24>>24|0)){A=q;break}else o=o+8|0}}else A=l;o=A<<24>>24;if(A<<24>>24>=e<<24>>24){i=1;return i|0}sj(g+(o<<2)|0,0,(e<<24>>24)-o<<2|0)|0;i=1;return i|0}case 9:{o=a+24|0;r=b[o>>0]|0;if((r<<24>>24>e<<24>>24?e:r)<<24>>24>0){k=f[f[a>>2]>>2]|0;m=a+40|0;q=un(f[m>>2]|0,f[m+4>>2]|0,f[c>>2]|0,0)|0;m=a+48|0;t=Vn(q|0,I|0,f[m>>2]|0,f[m+4>>2]|0)|0;m=k+t|0;t=0;while(1){k=~~$(n[m>>2]);f[g+(t<<2)>>2]=k;t=t+1|0;k=b[o>>0]|0;if((t|0)>=((k<<24>>24>e<<24>>24?e:k)<<24>>24|0)){B=k;break}else m=m+4|0}}else B=r;m=B<<24>>24;if(B<<24>>24>=e<<24>>24){i=1;return i|0}sj(g+(m<<2)|0,0,(e<<24>>24)-m<<2|0)|0;i=1;return i|0}case 10:{m=a+24|0;t=b[m>>0]|0;if((t<<24>>24>e<<24>>24?e:t)<<24>>24>0){o=f[f[a>>2]>>2]|0;l=a+40|0;k=un(f[l>>2]|0,f[l+4>>2]|0,f[c>>2]|0,0)|0;l=a+48|0;q=Vn(k|0,I|0,f[l>>2]|0,f[l+4>>2]|0)|0;l=o+q|0;q=0;while(1){f[g+(q<<2)>>2]=~~+p[l>>3];q=q+1|0;o=b[m>>0]|0;if((q|0)>=((o<<24>>24>e<<24>>24?e:o)<<24>>24|0)){C=o;break}else l=l+8|0}}else C=t;l=C<<24>>24;if(C<<24>>24>=e<<24>>24){i=1;return i|0}sj(g+(l<<2)|0,0,(e<<24>>24)-l<<2|0)|0;i=1;return i|0}case 11:{l=a+24|0;q=b[l>>0]|0;if((q<<24>>24>e<<24>>24?e:q)<<24>>24>0){m=f[f[a>>2]>>2]|0;r=a+40|0;o=un(f[r>>2]|0,f[r+4>>2]|0,f[c>>2]|0,0)|0;r=a+48|0;k=Vn(o|0,I|0,f[r>>2]|0,f[r+4>>2]|0)|0;r=m+k|0;k=0;while(1){f[g+(k<<2)>>2]=h[r>>0];k=k+1|0;m=b[l>>0]|0;if((k|0)>=((m<<24>>24>e<<24>>24?e:m)<<24>>24|0)){D=m;break}else r=r+1|0}}else D=q;r=D<<24>>24;if(D<<24>>24>=e<<24>>24){i=1;return i|0}sj(g+(r<<2)|0,0,(e<<24>>24)-r<<2|0)|0;i=1;return i|0}default:{i=0;return i|0}}while(0);return 0}function Rb(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=Oa,J=0,K=0,L=0,M=0,N=Oa;e=u;u=u+48|0;g=e+36|0;h=e+24|0;i=e+12|0;j=e;if(!(xh(a,c,d)|0)){k=0;u=e;return k|0}l=f[(f[(f[c+4>>2]|0)+8>>2]|0)+(d<<2)>>2]|0;if((f[l+28>>2]|0)!=9){k=0;u=e;return k|0}m=c+48|0;c=f[m>>2]|0;o=ln(32)|0;f[g>>2]=o;f[g+8>>2]=-2147483616;f[g+4>>2]=17;p=o;q=14495;r=p+17|0;do{b[p>>0]=b[q>>0]|0;p=p+1|0;q=q+1|0}while((p|0)<(r|0));b[o+17>>0]=0;o=c+16|0;s=f[o>>2]|0;if(s){t=o;v=s;a:while(1){s=v;while(1){if((f[s+16>>2]|0)>=(d|0))break;w=f[s+4>>2]|0;if(!w){x=t;break a}else s=w}v=f[s>>2]|0;if(!v){x=s;break}else t=s}if(((x|0)!=(o|0)?(f[x+16>>2]|0)<=(d|0):0)?(o=x+20|0,(Jh(o,g)|0)!=0):0)y=Hk(o,g,-1)|0;else z=12}else z=12;if((z|0)==12)y=Hk(c,g,-1)|0;if((b[g+11>>0]|0)<0)Oq(f[g>>2]|0);if((y|0)<1){k=0;u=e;return k|0}c=f[m>>2]|0;o=ln(32)|0;f[g>>2]=o;f[g+8>>2]=-2147483616;f[g+4>>2]=19;p=o;q=14438;r=p+19|0;do{b[p>>0]=b[q>>0]|0;p=p+1|0;q=q+1|0}while((p|0)<(r|0));b[o+19>>0]=0;o=c+16|0;x=f[o>>2]|0;if(x){t=o;v=x;b:while(1){x=v;while(1){if((f[x+16>>2]|0)>=(d|0))break;w=f[x+4>>2]|0;if(!w){A=t;break b}else x=w}v=f[x>>2]|0;if(!v){A=x;break}else t=x}if((A|0)!=(o|0)?(f[A+16>>2]|0)<=(d|0):0)B=A+20|0;else z=24}else z=24;if((z|0)==24)B=c;if(!(Jh(B,g)|0))C=0;else{B=f[m>>2]|0;f[h>>2]=0;f[h+4>>2]=0;f[h+8>>2]=0;c=ln(32)|0;f[h>>2]=c;f[h+8>>2]=-2147483616;f[h+4>>2]=18;p=c;q=14458;r=p+18|0;do{b[p>>0]=b[q>>0]|0;p=p+1|0;q=q+1|0}while((p|0)<(r|0));b[c+18>>0]=0;c=B+16|0;A=f[c>>2]|0;if(A){o=c;t=A;c:while(1){A=t;while(1){if((f[A+16>>2]|0)>=(d|0))break;v=f[A+4>>2]|0;if(!v){D=o;break c}else A=v}t=f[A>>2]|0;if(!t){D=A;break}else o=A}if((D|0)!=(c|0)?(f[D+16>>2]|0)<=(d|0):0)E=D+20|0;else z=34}else z=34;if((z|0)==34)E=B;B=(Jh(E,h)|0)!=0;if((b[h+11>>0]|0)<0)Oq(f[h>>2]|0);C=B}if((b[g+11>>0]|0)<0)Oq(f[g>>2]|0);if(!C){Wd(a+40|0,l,y)|0;k=1;u=e;return k|0}C=l+24|0;l=b[C>>0]|0;B=l<<24>>24;f[i>>2]=0;E=i+4|0;f[E>>2]=0;f[i+8>>2]=0;do if(l<<24>>24)if(l<<24>>24<0)aq(i);else{D=B<<2;c=ln(D)|0;f[i>>2]=c;o=c+(B<<2)|0;f[i+8>>2]=o;sj(c|0,0,D|0)|0;f[E>>2]=o;F=c;break}else F=0;while(0);B=f[m>>2]|0;f[j>>2]=0;f[j+4>>2]=0;f[j+8>>2]=0;l=ln(32)|0;f[j>>2]=l;f[j+8>>2]=-2147483616;f[j+4>>2]=19;p=l;q=14438;r=p+19|0;do{b[p>>0]=b[q>>0]|0;p=p+1|0;q=q+1|0}while((p|0)<(r|0));b[l+19>>0]=0;l=b[C>>0]|0;c=l<<24>>24;o=B+16|0;D=f[o>>2]|0;if(D){t=o;x=D;d:while(1){D=x;while(1){if((f[D+16>>2]|0)>=(d|0))break;v=f[D+4>>2]|0;if(!v){G=t;break d}else D=v}x=f[D>>2]|0;if(!x){G=D;break}else t=D}if(((G|0)!=(o|0)?(f[G+16>>2]|0)<=(d|0):0)?(o=G+20|0,(Jh(o,j)|0)!=0):0){t=Rg(o,j)|0;if((t|0)!=(G+24|0)){pj(g,t+28|0);t=g+11|0;G=b[t>>0]|0;o=G<<24>>24<0;if(!((o?f[g+4>>2]|0:G&255)|0))H=G;else{if(l<<24>>24>0){x=o?f[g>>2]|0:g;o=0;do{I=$(bq(x,h));A=x;x=f[h>>2]|0;if((A|0)==(x|0))break;n[F+(o<<2)>>2]=I;o=o+1|0}while((o|0)<(c|0));J=b[t>>0]|0}else J=G;H=J}if(H<<24>>24<0)Oq(f[g>>2]|0)}}else z=64}else z=64;if((z|0)==64?(H=Rg(B,j)|0,(H|0)!=(B+4|0)):0){pj(g,H+28|0);H=g+11|0;B=b[H>>0]|0;J=B<<24>>24<0;if(!((J?f[g+4>>2]|0:B&255)|0))K=B;else{if(l<<24>>24>0){l=J?f[g>>2]|0:g;J=0;do{I=$(bq(l,h));G=l;l=f[h>>2]|0;if((G|0)==(l|0))break;n[F+(J<<2)>>2]=I;J=J+1|0}while((J|0)<(c|0));L=b[H>>0]|0}else L=B;K=L}if(K<<24>>24<0)Oq(f[g>>2]|0)}if((b[j+11>>0]|0)<0)Oq(f[j>>2]|0);j=f[m>>2]|0;f[g>>2]=0;f[g+4>>2]=0;f[g+8>>2]=0;m=ln(32)|0;f[g>>2]=m;f[g+8>>2]=-2147483616;f[g+4>>2]=18;p=m;q=14458;r=p+18|0;do{b[p>>0]=b[q>>0]|0;p=p+1|0;q=q+1|0}while((p|0)<(r|0));b[m+18>>0]=0;m=j+16|0;q=f[m>>2]|0;if(q){p=m;r=q;e:while(1){q=r;while(1){if((f[q+16>>2]|0)>=(d|0))break;K=f[q+4>>2]|0;if(!K){M=p;break e}else q=K}r=f[q>>2]|0;if(!r){M=q;break}else p=q}if(((M|0)!=(m|0)?(f[M+16>>2]|0)<=(d|0):0)?(d=M+20|0,(Jh(d,g)|0)!=0):0)N=$(sk(d,g,$(1.0)));else z=86}else z=86;if((z|0)==86)N=$(sk(j,g,$(1.0)));if((b[g+11>>0]|0)<0)Oq(f[g>>2]|0);Dl(a+40|0,y,f[i>>2]|0,b[C>>0]|0,N);C=f[i>>2]|0;if(C|0){i=f[E>>2]|0;if((i|0)!=(C|0))f[E>>2]=i+(~((i+-4-C|0)>>>2)<<2);Oq(C)}k=1;u=e;return k|0}function Sb(a,b,c,d,e,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0;e=u;u=u+64|0;d=e+48|0;h=e+36|0;i=e+24|0;j=e+16|0;k=e+8|0;l=e;m=e+32|0;n=a+60|0;f[a+68>>2]=g;g=a+108|0;tk(g);o=a+56|0;p=f[o>>2]|0;q=(f[p+4>>2]|0)-(f[p>>2]|0)|0;r=q>>2;f[h>>2]=0;f[h+4>>2]=0;f[h+8>>2]=0;s=i;f[s>>2]=0;f[s+4>>2]=0;s=j;f[s>>2]=0;f[s+4>>2]=0;s=k;f[s>>2]=0;f[s+4>>2]=0;s=l;f[s>>2]=0;f[s+4>>2]=0;if((q|0)<=0){u=e;return 1}q=h+4|0;s=h+8|0;t=a+104|0;v=i+4|0;w=a+100|0;x=j+4|0;y=a+8|0;z=a+16|0;A=a+32|0;B=a+12|0;C=a+28|0;D=a+20|0;E=a+24|0;F=a+96|0;a=k+4|0;G=l+4|0;H=f[p>>2]|0;if((f[p+4>>2]|0)==(H|0)){J=p;aq(J)}else{K=0;L=H}while(1){f[m>>2]=f[L+(K<<2)>>2];f[d>>2]=f[m>>2];ic(n,d,h);H=f[h>>2]|0;p=(H|0)>-1?H:0-H|0;M=f[q>>2]|0;N=(M|0)>-1?M:0-M|0;O=Vn(N|0,((N|0)<0)<<31>>31|0,p|0,((p|0)<0)<<31>>31|0)|0;p=f[s>>2]|0;N=(p|0)>-1;P=N?p:0-p|0;p=Vn(O|0,I|0,P|0,((P|0)<0)<<31>>31|0)|0;P=I;if((p|0)==0&(P|0)==0){O=f[t>>2]|0;Q=O;R=h;S=M;T=O}else{O=f[t>>2]|0;U=((O|0)<0)<<31>>31;V=un(O|0,U|0,H|0,((H|0)<0)<<31>>31|0)|0;H=Ik(V|0,I|0,p|0,P|0)|0;f[h>>2]=H;V=un(O|0,U|0,M|0,((M|0)<0)<<31>>31|0)|0;M=Ik(V|0,I|0,p|0,P|0)|0;f[q>>2]=M;P=O-((H|0)>-1?H:0-H|0)-((M|0)>-1?M:0-M|0)|0;Q=N?P:0-P|0;R=s;S=M;T=O}f[R>>2]=Q;O=f[h>>2]|0;do if((O|0)<=-1){if((S|0)<0){M=f[s>>2]|0;W=(M|0)>-1?M:0-M|0;X=M}else{M=f[s>>2]|0;W=(f[w>>2]|0)-((M|0)>-1?M:0-M|0)|0;X=M}if((X|0)<0){Y=(S|0)>-1?S:0-S|0;Z=W;_=X;break}else{Y=(f[w>>2]|0)-((S|0)>-1?S:0-S|0)|0;Z=W;_=X;break}}else{M=f[s>>2]|0;Y=M+T|0;Z=T+S|0;_=M}while(0);M=(Z|0)==0;P=(Y|0)==0;N=f[w>>2]|0;do if(Y|Z){H=(N|0)==(Y|0);if(!(M&H)){p=(N|0)==(Z|0);if(!(P&p)){if(M&(T|0)<(Y|0)){$=0;aa=(T<<1)-Y|0;break}if(p&(T|0)>(Y|0)){$=Z;aa=(T<<1)-Y|0;break}if(H&(T|0)>(Z|0)){$=(T<<1)-Z|0;aa=Y;break}if(P){$=(T|0)<(Z|0)?(T<<1)-Z|0:Z;aa=0}else{$=Z;aa=Y}}else{$=Z;aa=Z}}else{$=Y;aa=Y}}else{$=N;aa=N}while(0);f[i>>2]=$;f[v>>2]=aa;P=0-S|0;M=0-_|0;f[h>>2]=0-O;f[q>>2]=P;f[s>>2]=M;if((O|0)<1){ba=T-_|0;ca=T-S|0}else{H=(_|0)<1?M:_;M=(S|0)<1?P:S;ba=(_|0)>0?M:N-M|0;ca=(S|0)>0?H:N-H|0}H=(ca|0)==0;M=(ba|0)==0;do if(((ba|ca|0)!=0?(P=(N|0)==(ba|0),!(H&P)):0)?(p=(N|0)==(ca|0),!(M&p)):0){if(H&(T|0)<(ba|0)){da=0;ea=(T<<1)-ba|0;break}if(p&(T|0)>(ba|0)){da=N;ea=(T<<1)-ba|0;break}if(P&(T|0)>(ca|0)){da=(T<<1)-ca|0;ea=N;break}if(M){da=(T|0)<(ca|0)?(T<<1)-ca|0:ca;ea=0}else{da=ca;ea=ba}}else{da=N;ea=N}while(0);f[j>>2]=da;f[x>>2]=ea;N=K<<1;M=b+(N<<2)|0;H=f[y>>2]|0;if((H|0)>0){O=0;P=i;p=H;while(1){if((p|0)>0){H=0;do{V=f[P+(H<<2)>>2]|0;U=f[z>>2]|0;if((V|0)>(U|0)){fa=f[A>>2]|0;f[fa+(H<<2)>>2]=U;ga=fa}else{fa=f[B>>2]|0;U=f[A>>2]|0;f[U+(H<<2)>>2]=(V|0)<(fa|0)?fa:V;ga=U}H=H+1|0;U=f[y>>2]|0}while((H|0)<(U|0));ha=ga;ia=U}else{ha=f[A>>2]|0;ia=p}H=(f[M+(O<<2)>>2]|0)-(f[ha+(O<<2)>>2]|0)|0;U=k+(O<<2)|0;f[U>>2]=H;ja=f[C>>2]|0;if((H|0)>=(ja|0)){if((H|0)>(f[E>>2]|0)){ka=H-(f[D>>2]|0)|0;la=52}}else{ka=(f[D>>2]|0)+H|0;la=52}if((la|0)==52){la=0;f[U>>2]=ka}O=O+1|0;if((O|0)>=(ia|0))break;else{P=ha;p=ia}}if((ia|0)>0){p=0;P=j;O=ia;U=ja;while(1){if((O|0)>0){H=0;do{V=f[P+(H<<2)>>2]|0;fa=f[z>>2]|0;if((V|0)>(fa|0))f[ha+(H<<2)>>2]=fa;else{fa=f[B>>2]|0;f[ha+(H<<2)>>2]=(V|0)<(fa|0)?fa:V}H=H+1|0;ma=f[y>>2]|0}while((H|0)<(ma|0));na=f[C>>2]|0;oa=ma}else{na=U;oa=O}H=(f[M+(p<<2)>>2]|0)-(f[ha+(p<<2)>>2]|0)|0;V=l+(p<<2)|0;f[V>>2]=H;if((H|0)>=(na|0)){if((H|0)>(f[E>>2]|0)){pa=H-(f[D>>2]|0)|0;la=65}}else{pa=(f[D>>2]|0)+H|0;la=65}if((la|0)==65){la=0;f[V>>2]=pa}p=p+1|0;if((p|0)>=(oa|0))break;else{P=ha;O=oa;U=na}}}}U=f[k>>2]|0;O=f[t>>2]|0;if((O|0)>=(U|0))if((U|0)<(0-O|0))qa=(f[F>>2]|0)+U|0;else qa=U;else qa=U-(f[F>>2]|0)|0;f[k>>2]=qa;U=f[a>>2]|0;if((O|0)>=(U|0))if((U|0)<(0-O|0))ra=(f[F>>2]|0)+U|0;else ra=U;else ra=U-(f[F>>2]|0)|0;f[a>>2]=ra;U=f[l>>2]|0;if((O|0)>=(U|0))if((U|0)<(0-O|0))sa=(f[F>>2]|0)+U|0;else sa=U;else sa=U-(f[F>>2]|0)|0;f[l>>2]=sa;U=f[G>>2]|0;if((O|0)>=(U|0))if((U|0)<(0-O|0))ta=(f[F>>2]|0)+U|0;else ta=U;else ta=U-(f[F>>2]|0)|0;f[G>>2]=ta;if((((ra|0)>-1?ra:0-ra|0)+((qa|0)>-1?qa:0-qa|0)|0)<(((sa|0)>-1?sa:0-sa|0)+((ta|0)>-1?ta:0-ta|0)|0)){fj(g,0);ua=k}else{fj(g,1);ua=l}U=f[ua>>2]|0;if((U|0)<0)va=(f[F>>2]|0)+U|0;else va=U;U=c+(N<<2)|0;f[U>>2]=va;O=f[ua+4>>2]|0;if((O|0)<0)wa=(f[F>>2]|0)+O|0;else wa=O;f[U+4>>2]=wa;K=K+1|0;if((K|0)>=(r|0)){la=3;break}U=f[o>>2]|0;L=f[U>>2]|0;if((f[U+4>>2]|0)-L>>2>>>0<=K>>>0){J=U;la=4;break}}if((la|0)==3){u=e;return 1}else if((la|0)==4)aq(J);return 0}function Tb(a,b,c,d,e,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0;e=u;u=u+64|0;d=e+48|0;h=e+36|0;i=e+24|0;j=e+16|0;k=e+8|0;l=e;m=e+32|0;n=a+60|0;f[a+68>>2]=g;g=a+108|0;tk(g);o=a+56|0;p=f[o>>2]|0;q=(f[p+4>>2]|0)-(f[p>>2]|0)|0;r=q>>2;f[h>>2]=0;f[h+4>>2]=0;f[h+8>>2]=0;s=i;f[s>>2]=0;f[s+4>>2]=0;s=j;f[s>>2]=0;f[s+4>>2]=0;s=k;f[s>>2]=0;f[s+4>>2]=0;s=l;f[s>>2]=0;f[s+4>>2]=0;if((q|0)<=0){u=e;return 1}q=h+4|0;s=h+8|0;t=a+104|0;v=i+4|0;w=a+100|0;x=j+4|0;y=a+8|0;z=a+16|0;A=a+32|0;B=a+12|0;C=a+28|0;D=a+20|0;E=a+24|0;F=a+96|0;a=k+4|0;G=l+4|0;H=f[p>>2]|0;if((f[p+4>>2]|0)==(H|0)){J=p;aq(J)}else{K=0;L=H}while(1){f[m>>2]=f[L+(K<<2)>>2];f[d>>2]=f[m>>2];$b(n,d,h);H=f[h>>2]|0;p=(H|0)>-1?H:0-H|0;M=f[q>>2]|0;N=(M|0)>-1?M:0-M|0;O=Vn(N|0,((N|0)<0)<<31>>31|0,p|0,((p|0)<0)<<31>>31|0)|0;p=f[s>>2]|0;N=(p|0)>-1;P=N?p:0-p|0;p=Vn(O|0,I|0,P|0,((P|0)<0)<<31>>31|0)|0;P=I;if((p|0)==0&(P|0)==0){O=f[t>>2]|0;Q=O;R=h;S=M;T=O}else{O=f[t>>2]|0;U=((O|0)<0)<<31>>31;V=un(O|0,U|0,H|0,((H|0)<0)<<31>>31|0)|0;H=Ik(V|0,I|0,p|0,P|0)|0;f[h>>2]=H;V=un(O|0,U|0,M|0,((M|0)<0)<<31>>31|0)|0;M=Ik(V|0,I|0,p|0,P|0)|0;f[q>>2]=M;P=O-((H|0)>-1?H:0-H|0)-((M|0)>-1?M:0-M|0)|0;Q=N?P:0-P|0;R=s;S=M;T=O}f[R>>2]=Q;O=f[h>>2]|0;do if((O|0)<=-1){if((S|0)<0){M=f[s>>2]|0;W=(M|0)>-1?M:0-M|0;X=M}else{M=f[s>>2]|0;W=(f[w>>2]|0)-((M|0)>-1?M:0-M|0)|0;X=M}if((X|0)<0){Y=(S|0)>-1?S:0-S|0;Z=W;_=X;break}else{Y=(f[w>>2]|0)-((S|0)>-1?S:0-S|0)|0;Z=W;_=X;break}}else{M=f[s>>2]|0;Y=M+T|0;Z=T+S|0;_=M}while(0);M=(Z|0)==0;P=(Y|0)==0;N=f[w>>2]|0;do if(Y|Z){H=(N|0)==(Y|0);if(!(M&H)){p=(N|0)==(Z|0);if(!(P&p)){if(M&(T|0)<(Y|0)){$=0;aa=(T<<1)-Y|0;break}if(p&(T|0)>(Y|0)){$=Z;aa=(T<<1)-Y|0;break}if(H&(T|0)>(Z|0)){$=(T<<1)-Z|0;aa=Y;break}if(P){$=(T|0)<(Z|0)?(T<<1)-Z|0:Z;aa=0}else{$=Z;aa=Y}}else{$=Z;aa=Z}}else{$=Y;aa=Y}}else{$=N;aa=N}while(0);f[i>>2]=$;f[v>>2]=aa;P=0-S|0;M=0-_|0;f[h>>2]=0-O;f[q>>2]=P;f[s>>2]=M;if((O|0)<1){ba=T-_|0;ca=T-S|0}else{H=(_|0)<1?M:_;M=(S|0)<1?P:S;ba=(_|0)>0?M:N-M|0;ca=(S|0)>0?H:N-H|0}H=(ca|0)==0;M=(ba|0)==0;do if(((ba|ca|0)!=0?(P=(N|0)==(ba|0),!(H&P)):0)?(p=(N|0)==(ca|0),!(M&p)):0){if(H&(T|0)<(ba|0)){da=0;ea=(T<<1)-ba|0;break}if(p&(T|0)>(ba|0)){da=N;ea=(T<<1)-ba|0;break}if(P&(T|0)>(ca|0)){da=(T<<1)-ca|0;ea=N;break}if(M){da=(T|0)<(ca|0)?(T<<1)-ca|0:ca;ea=0}else{da=ca;ea=ba}}else{da=N;ea=N}while(0);f[j>>2]=da;f[x>>2]=ea;N=K<<1;M=b+(N<<2)|0;H=f[y>>2]|0;if((H|0)>0){O=0;P=i;p=H;while(1){if((p|0)>0){H=0;do{V=f[P+(H<<2)>>2]|0;U=f[z>>2]|0;if((V|0)>(U|0)){fa=f[A>>2]|0;f[fa+(H<<2)>>2]=U;ga=fa}else{fa=f[B>>2]|0;U=f[A>>2]|0;f[U+(H<<2)>>2]=(V|0)<(fa|0)?fa:V;ga=U}H=H+1|0;U=f[y>>2]|0}while((H|0)<(U|0));ha=ga;ia=U}else{ha=f[A>>2]|0;ia=p}H=(f[M+(O<<2)>>2]|0)-(f[ha+(O<<2)>>2]|0)|0;U=k+(O<<2)|0;f[U>>2]=H;ja=f[C>>2]|0;if((H|0)>=(ja|0)){if((H|0)>(f[E>>2]|0)){ka=H-(f[D>>2]|0)|0;la=52}}else{ka=(f[D>>2]|0)+H|0;la=52}if((la|0)==52){la=0;f[U>>2]=ka}O=O+1|0;if((O|0)>=(ia|0))break;else{P=ha;p=ia}}if((ia|0)>0){p=0;P=j;O=ia;U=ja;while(1){if((O|0)>0){H=0;do{V=f[P+(H<<2)>>2]|0;fa=f[z>>2]|0;if((V|0)>(fa|0))f[ha+(H<<2)>>2]=fa;else{fa=f[B>>2]|0;f[ha+(H<<2)>>2]=(V|0)<(fa|0)?fa:V}H=H+1|0;ma=f[y>>2]|0}while((H|0)<(ma|0));na=f[C>>2]|0;oa=ma}else{na=U;oa=O}H=(f[M+(p<<2)>>2]|0)-(f[ha+(p<<2)>>2]|0)|0;V=l+(p<<2)|0;f[V>>2]=H;if((H|0)>=(na|0)){if((H|0)>(f[E>>2]|0)){pa=H-(f[D>>2]|0)|0;la=65}}else{pa=(f[D>>2]|0)+H|0;la=65}if((la|0)==65){la=0;f[V>>2]=pa}p=p+1|0;if((p|0)>=(oa|0))break;else{P=ha;O=oa;U=na}}}}U=f[k>>2]|0;O=f[t>>2]|0;if((O|0)>=(U|0))if((U|0)<(0-O|0))qa=(f[F>>2]|0)+U|0;else qa=U;else qa=U-(f[F>>2]|0)|0;f[k>>2]=qa;U=f[a>>2]|0;if((O|0)>=(U|0))if((U|0)<(0-O|0))ra=(f[F>>2]|0)+U|0;else ra=U;else ra=U-(f[F>>2]|0)|0;f[a>>2]=ra;U=f[l>>2]|0;if((O|0)>=(U|0))if((U|0)<(0-O|0))sa=(f[F>>2]|0)+U|0;else sa=U;else sa=U-(f[F>>2]|0)|0;f[l>>2]=sa;U=f[G>>2]|0;if((O|0)>=(U|0))if((U|0)<(0-O|0))ta=(f[F>>2]|0)+U|0;else ta=U;else ta=U-(f[F>>2]|0)|0;f[G>>2]=ta;if((((ra|0)>-1?ra:0-ra|0)+((qa|0)>-1?qa:0-qa|0)|0)<(((sa|0)>-1?sa:0-sa|0)+((ta|0)>-1?ta:0-ta|0)|0)){fj(g,0);ua=k}else{fj(g,1);ua=l}U=f[ua>>2]|0;if((U|0)<0)va=(f[F>>2]|0)+U|0;else va=U;U=c+(N<<2)|0;f[U>>2]=va;O=f[ua+4>>2]|0;if((O|0)<0)wa=(f[F>>2]|0)+O|0;else wa=O;f[U+4>>2]=wa;K=K+1|0;if((K|0)>=(r|0)){la=3;break}U=f[o>>2]|0;L=f[U>>2]|0;if((f[U+4>>2]|0)-L>>2>>>0<=K>>>0){J=U;la=4;break}}if((la|0)==3){u=e;return 1}else if((la|0)==4)aq(J);return 0}function Ub(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,i=0,j=0,k=0,l=0,m=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=Oa,V=Oa,Y=Oa,Z=0,_=0,aa=0,ba=0;d=u;u=u+16|0;e=d;g=a+16|0;f[a>>2]=0;f[a+4>>2]=0;f[a+8>>2]=0;f[a+12>>2]=0;n[g>>2]=$(1.0);i=a+20|0;f[i>>2]=0;f[i+4>>2]=0;f[i+8>>2]=0;f[i+12>>2]=0;n[a+36>>2]=$(1.0);j=f[c+8>>2]|0;a:do if(j|0){k=a+4|0;l=a+12|0;m=a+8|0;o=j;p=j;while(1){q=o+8|0;r=b[q+11>>0]|0;s=r<<24>>24<0;t=s?f[q>>2]|0:q;v=s?f[o+12>>2]|0:r&255;if(v>>>0>3){r=t;s=v;w=v;while(1){x=X(h[r>>0]|h[r+1>>0]<<8|h[r+2>>0]<<16|h[r+3>>0]<<24,1540483477)|0;s=(X(x>>>24^x,1540483477)|0)^(X(s,1540483477)|0);w=w+-4|0;if(w>>>0<=3)break;else r=r+4|0}r=v+-4|0;w=r&-4;y=r-w|0;z=t+(w+4)|0;A=s}else{y=v;z=t;A=v}switch(y|0){case 3:{B=h[z+2>>0]<<16^A;C=8;break}case 2:{B=A;C=8;break}case 1:{D=A;C=9;break}default:E=A}if((C|0)==8){C=0;D=h[z+1>>0]<<8^B;C=9}if((C|0)==9){C=0;E=X(D^h[z>>0],1540483477)|0}w=X(E>>>13^E,1540483477)|0;r=w>>>15^w;w=f[k>>2]|0;x=(w|0)==0;b:do if(!x){F=w+-1|0;G=(F&w|0)==0;if(!G)if(r>>>0<w>>>0)H=r;else H=(r>>>0)%(w>>>0)|0;else H=r&F;I=f[(f[a>>2]|0)+(H<<2)>>2]|0;if((I|0)!=0?(J=f[I>>2]|0,(J|0)!=0):0){I=(v|0)==0;if(G){if(I){G=J;while(1){K=f[G+4>>2]|0;if(!((K|0)==(r|0)|(K&F|0)==(H|0))){L=H;C=50;break b}K=b[G+8+11>>0]|0;if(!((K<<24>>24<0?f[G+12>>2]|0:K&255)|0))break b;G=f[G>>2]|0;if(!G){L=H;C=50;break b}}}else M=J;while(1){G=f[M+4>>2]|0;if(!((G|0)==(r|0)|(G&F|0)==(H|0))){L=H;C=50;break b}G=M+8|0;K=b[G+11>>0]|0;N=K<<24>>24<0;O=K&255;do if(((N?f[M+12>>2]|0:O)|0)==(v|0)){K=f[G>>2]|0;if(N)if(!(Vk(K,t,v)|0))break b;else break;if((b[t>>0]|0)==(K&255)<<24>>24){K=G;P=O;Q=t;do{P=P+-1|0;K=K+1|0;if(!P)break b;Q=Q+1|0}while((b[K>>0]|0)==(b[Q>>0]|0))}}while(0);M=f[M>>2]|0;if(!M){L=H;C=50;break b}}}if(I){F=J;while(1){O=f[F+4>>2]|0;if((O|0)!=(r|0)){if(O>>>0<w>>>0)R=O;else R=(O>>>0)%(w>>>0)|0;if((R|0)!=(H|0)){L=H;C=50;break b}}O=b[F+8+11>>0]|0;if(!((O<<24>>24<0?f[F+12>>2]|0:O&255)|0))break b;F=f[F>>2]|0;if(!F){L=H;C=50;break b}}}else S=J;while(1){F=f[S+4>>2]|0;if((F|0)!=(r|0)){if(F>>>0<w>>>0)T=F;else T=(F>>>0)%(w>>>0)|0;if((T|0)!=(H|0)){L=H;C=50;break b}}F=S+8|0;I=b[F+11>>0]|0;O=I<<24>>24<0;G=I&255;do if(((O?f[S+12>>2]|0:G)|0)==(v|0)){I=f[F>>2]|0;if(O)if(!(Vk(I,t,v)|0))break b;else break;if((b[t>>0]|0)==(I&255)<<24>>24){I=F;N=G;Q=t;do{N=N+-1|0;I=I+1|0;if(!N)break b;Q=Q+1|0}while((b[I>>0]|0)==(b[Q>>0]|0))}}while(0);S=f[S>>2]|0;if(!S){L=H;C=50;break}}}else{L=H;C=50}}else{L=0;C=50}while(0);if((C|0)==50){C=0;Di(e,a,r,q);U=$(((f[l>>2]|0)+1|0)>>>0);V=$(w>>>0);Y=$(n[g>>2]);do if(x|$(Y*V)<U){t=w<<1|(w>>>0<3|(w+-1&w|0)!=0)&1;v=~~$(W($(U/Y)))>>>0;ei(a,t>>>0<v>>>0?v:t);t=f[k>>2]|0;v=t+-1|0;if(!(v&t)){Z=t;_=v&r;break}if(r>>>0<t>>>0){Z=t;_=r}else{Z=t;_=(r>>>0)%(t>>>0)|0}}else{Z=w;_=L}while(0);w=f[(f[a>>2]|0)+(_<<2)>>2]|0;if(!w){f[f[e>>2]>>2]=f[m>>2];f[m>>2]=f[e>>2];f[(f[a>>2]|0)+(_<<2)>>2]=m;r=f[e>>2]|0;x=f[r>>2]|0;if(x|0){q=f[x+4>>2]|0;x=Z+-1|0;if(x&Z)if(q>>>0<Z>>>0)aa=q;else aa=(q>>>0)%(Z>>>0)|0;else aa=q&x;f[(f[a>>2]|0)+(aa<<2)>>2]=r}}else{f[f[e>>2]>>2]=f[w>>2];f[w>>2]=f[e>>2]}f[l>>2]=(f[l>>2]|0)+1}w=f[p>>2]|0;if(!w)break a;else{o=w;p=w}}}while(0);e=f[c+28>>2]|0;if(!e){u=d;return}else ba=e;do{e=ba;c=ln(40)|0;Ub(c,f[e+20>>2]|0);aa=Ec(i,e+8|0)|0;e=f[aa>>2]|0;f[aa>>2]=c;if(e|0){c=f[e+28>>2]|0;if(c|0){aa=c;do{c=aa;aa=f[aa>>2]|0;ri(c+8|0);Oq(c)}while((aa|0)!=0)}aa=e+20|0;c=f[aa>>2]|0;f[aa>>2]=0;if(c|0)Oq(c);c=f[e+8>>2]|0;if(c|0){aa=c;do{c=aa;aa=f[aa>>2]|0;a=c+8|0;Z=f[c+20>>2]|0;if(Z|0){_=c+24|0;if((f[_>>2]|0)!=(Z|0))f[_>>2]=Z;Oq(Z)}if((b[a+11>>0]|0)<0)Oq(f[a>>2]|0);Oq(c)}while((aa|0)!=0)}aa=f[e>>2]|0;f[e>>2]=0;if(aa|0)Oq(aa);Oq(e)}ba=f[ba>>2]|0}while((ba|0)!=0);u=d;return}function Vb(a,c,e){a=a|0;c=c|0;e=e|0;var g=0,i=0,j=0,k=0,l=0,m=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,X=0,Y=0,Z=0,_=0,aa=0,ba=0,ca=0,da=0,ea=Oa,fa=Oa,ga=Oa,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0;g=u;u=u+48|0;i=g+16|0;j=g+12|0;k=g;l=i+16|0;f[i>>2]=0;f[i+4>>2]=0;f[i+8>>2]=0;f[i+12>>2]=0;n[l>>2]=$(1.0);m=a+80|0;o=f[m>>2]|0;f[k>>2]=0;p=k+4|0;f[p>>2]=0;f[k+8>>2]=0;if(o){if(o>>>0>1073741823)aq(k);q=o<<2;r=ln(q)|0;f[k>>2]=r;s=r+(o<<2)|0;f[k+8>>2]=s;sj(r|0,0,q|0)|0;f[p>>2]=s;s=c+48|0;q=c+40|0;o=i+4|0;t=i+12|0;v=i+8|0;w=a+40|0;x=a+64|0;y=f[e>>2]|0;e=r;z=0;A=0;B=r;C=r;D=0;E=r;while(1){r=s;F=f[r>>2]|0;G=f[r+4>>2]|0;r=q;H=un(f[r>>2]|0,f[r+4>>2]|0,y+z|0,0)|0;r=Vn(H|0,I|0,F|0,G|0)|0;G=(f[f[c>>2]>>2]|0)+r|0;r=h[G>>0]|h[G+1>>0]<<8|h[G+2>>0]<<16|h[G+3>>0]<<24;f[j>>2]=r;G=r&65535;F=r>>>16;H=F&65535;J=(r&65535^318)+239^F;F=(D|0)==0;a:do if(!F){K=D+-1|0;L=(K&D|0)==0;if(!L)if(J>>>0<D>>>0)M=J;else M=(J>>>0)%(D>>>0)|0;else M=J&K;N=f[(f[i>>2]|0)+(M<<2)>>2]|0;do if(N|0?(O=f[N>>2]|0,O|0):0){b:do if(L){P=O;while(1){Q=f[P+4>>2]|0;R=(Q|0)==(J|0);if(!(R|(Q&K|0)==(M|0))){S=27;break b}if((R?(R=P+8|0,(d[R>>1]|0)==G<<16>>16):0)?(d[R+2>>1]|0)==H<<16>>16:0){T=P;S=26;break b}P=f[P>>2]|0;if(!P){S=27;break}}}else{P=O;while(1){R=f[P+4>>2]|0;if((R|0)==(J|0)){Q=P+8|0;if((d[Q>>1]|0)==G<<16>>16?(d[Q+2>>1]|0)==H<<16>>16:0){T=P;S=26;break b}}else{if(R>>>0<D>>>0)U=R;else U=(R>>>0)%(D>>>0)|0;if((U|0)!=(M|0)){S=27;break b}}P=f[P>>2]|0;if(!P){S=27;break}}}while(0);if((S|0)==26){S=0;f[E+(z<<2)>>2]=f[T+12>>2];V=e;X=A;Y=C;Z=B;_=E;break a}else if((S|0)==27){S=0;if(F){aa=0;S=46;break a}else break}}while(0);K=D+-1|0;L=(K&D|0)==0;if(!L)if(J>>>0<D>>>0)ba=J;else ba=(J>>>0)%(D>>>0)|0;else ba=K&J;N=f[(f[i>>2]|0)+(ba<<2)>>2]|0;if((N|0)!=0?(O=f[N>>2]|0,(O|0)!=0):0){if(L){L=O;while(1){N=f[L+4>>2]|0;if(!((N|0)==(J|0)|(N&K|0)==(ba|0))){aa=ba;S=46;break a}N=L+8|0;if((d[N>>1]|0)==G<<16>>16?(d[N+2>>1]|0)==H<<16>>16:0){S=61;break a}L=f[L>>2]|0;if(!L){aa=ba;S=46;break a}}}else ca=O;while(1){L=f[ca+4>>2]|0;if((L|0)!=(J|0)){if(L>>>0<D>>>0)da=L;else da=(L>>>0)%(D>>>0)|0;if((da|0)!=(ba|0)){aa=ba;S=46;break a}}L=ca+8|0;if((d[L>>1]|0)==G<<16>>16?(d[L+2>>1]|0)==H<<16>>16:0){S=61;break a}ca=f[ca>>2]|0;if(!ca){aa=ba;S=46;break}}}else{aa=ba;S=46}}else{aa=0;S=46}while(0);if((S|0)==46){S=0;H=ln(16)|0;G=H+8|0;d[G>>1]=r;d[G+2>>1]=r>>>16;f[H+12>>2]=A;f[H+4>>2]=J;f[H>>2]=0;ea=$(((f[t>>2]|0)+1|0)>>>0);fa=$(D>>>0);ga=$(n[l>>2]);do if(F|$(ga*fa)<ea){G=D<<1|(D>>>0<3|(D+-1&D|0)!=0)&1;O=~~$(W($(ea/ga)))>>>0;Uh(i,G>>>0<O>>>0?O:G);G=f[o>>2]|0;O=G+-1|0;if(!(O&G)){ha=G;ia=O&J;break}if(J>>>0<G>>>0){ha=G;ia=J}else{ha=G;ia=(J>>>0)%(G>>>0)|0}}else{ha=D;ia=aa}while(0);J=(f[i>>2]|0)+(ia<<2)|0;F=f[J>>2]|0;if(!F){f[H>>2]=f[v>>2];f[v>>2]=H;f[J>>2]=v;J=f[H>>2]|0;if(J|0){r=f[J+4>>2]|0;J=ha+-1|0;if(J&ha)if(r>>>0<ha>>>0)ja=r;else ja=(r>>>0)%(ha>>>0)|0;else ja=r&J;ka=(f[i>>2]|0)+(ja<<2)|0;S=59}}else{f[H>>2]=f[F>>2];ka=F;S=59}if((S|0)==59){S=0;f[ka>>2]=H}f[t>>2]=(f[t>>2]|0)+1;S=61}if((S|0)==61){S=0;F=w;J=f[F>>2]|0;r=un(J|0,f[F+4>>2]|0,A|0,0)|0;kh((f[f[x>>2]>>2]|0)+r|0,j|0,J|0)|0;J=f[k>>2]|0;f[J+(z<<2)>>2]=A;V=J;X=A+1|0;Y=J;Z=J;_=J}J=z+1|0;la=f[m>>2]|0;if(J>>>0>=la>>>0)break;e=V;z=J;A=X;B=Z;C=Y;D=f[o>>2]|0;E=_}if((X|0)==(la|0))ma=Z;else{Z=a+84|0;if(!(b[Z>>0]|0)){_=f[a+72>>2]|0;E=f[a+68>>2]|0;o=E;if((_|0)==(E|0))na=V;else{D=_-E>>2;E=0;do{_=o+(E<<2)|0;f[_>>2]=f[Y+(f[_>>2]<<2)>>2];E=E+1|0}while(E>>>0<D>>>0);na=V}}else{b[Z>>0]=0;Z=a+68|0;V=a+72|0;D=f[V>>2]|0;E=f[Z>>2]|0;Y=D-E>>2;o=E;E=D;if(la>>>0<=Y>>>0)if(la>>>0<Y>>>0?(D=o+(la<<2)|0,(D|0)!=(E|0)):0){f[V>>2]=E+(~((E+-4-D|0)>>>2)<<2);oa=la}else oa=la;else{Ch(Z,la-Y|0,1220);oa=f[m>>2]|0}Y=f[k>>2]|0;if(!oa)na=Y;else{k=f[a+68>>2]|0;a=0;do{f[k+(a<<2)>>2]=f[Y+(a<<2)>>2];a=a+1|0}while(a>>>0<oa>>>0);na=Y}}f[m>>2]=X;ma=na}if(!ma)pa=X;else{na=f[p>>2]|0;if((na|0)!=(ma|0))f[p>>2]=na+(~((na+-4-ma|0)>>>2)<<2);Oq(ma);pa=X}}else pa=0;X=f[i+8>>2]|0;if(X|0){ma=X;do{X=ma;ma=f[ma>>2]|0;Oq(X)}while((ma|0)!=0)}ma=f[i>>2]|0;f[i>>2]=0;if(!ma){u=g;return pa|0}Oq(ma);u=g;return pa|0}function Wb(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,i=0,j=0,k=0,l=0,m=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,X=0,Y=0,Z=0,_=0,aa=0,ba=0,ca=Oa,da=Oa,ea=Oa,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0;e=u;u=u+48|0;g=e+20|0;i=e;j=e+8|0;k=g+16|0;f[g>>2]=0;f[g+4>>2]=0;f[g+8>>2]=0;f[g+12>>2]=0;n[k>>2]=$(1.0);l=a+80|0;m=f[l>>2]|0;f[j>>2]=0;o=j+4|0;f[o>>2]=0;f[j+8>>2]=0;if(m){if(m>>>0>1073741823)aq(j);p=m<<2;q=ln(p)|0;f[j>>2]=q;r=q+(m<<2)|0;f[j+8>>2]=r;sj(q|0,0,p|0)|0;f[o>>2]=r;r=c+48|0;p=c+40|0;m=g+4|0;s=g+12|0;t=g+8|0;v=a+40|0;w=a+64|0;x=f[d>>2]|0;d=q;y=0;z=0;A=q;B=q;C=q;q=0;while(1){D=r;E=f[D>>2]|0;F=f[D+4>>2]|0;D=p;G=un(f[D>>2]|0,f[D+4>>2]|0,x+y|0,0)|0;D=Vn(G|0,I|0,E|0,F|0)|0;F=(f[f[c>>2]>>2]|0)+D|0;D=F;E=h[D>>0]|h[D+1>>0]<<8|h[D+2>>0]<<16|h[D+3>>0]<<24;D=F+4|0;F=h[D>>0]|h[D+1>>0]<<8|h[D+2>>0]<<16|h[D+3>>0]<<24;D=i;f[D>>2]=E;f[D+4>>2]=F;D=(E^318)+239^F;G=(q|0)==0;a:do if(!G){H=q+-1|0;J=(H&q|0)==0;if(!J)if(D>>>0<q>>>0)K=D;else K=(D>>>0)%(q>>>0)|0;else K=D&H;L=f[(f[g>>2]|0)+(K<<2)>>2]|0;do if(L|0?(M=f[L>>2]|0,M|0):0){b:do if(J){N=M;while(1){O=f[N+4>>2]|0;P=(O|0)==(D|0);if(!(P|(O&H|0)==(K|0))){Q=27;break b}if((P?(f[N+8>>2]|0)==(E|0):0)?(f[N+12>>2]|0)==(F|0):0){R=N;Q=26;break b}N=f[N>>2]|0;if(!N){Q=27;break}}}else{N=M;while(1){P=f[N+4>>2]|0;if((P|0)==(D|0)){if((f[N+8>>2]|0)==(E|0)?(f[N+12>>2]|0)==(F|0):0){R=N;Q=26;break b}}else{if(P>>>0<q>>>0)S=P;else S=(P>>>0)%(q>>>0)|0;if((S|0)!=(K|0)){Q=27;break b}}N=f[N>>2]|0;if(!N){Q=27;break}}}while(0);if((Q|0)==26){Q=0;f[A+(y<<2)>>2]=f[R+16>>2];T=d;U=z;V=C;X=B;Y=A;break a}else if((Q|0)==27){Q=0;if(G){Z=0;Q=46;break a}else break}}while(0);H=q+-1|0;J=(H&q|0)==0;if(!J)if(D>>>0<q>>>0)_=D;else _=(D>>>0)%(q>>>0)|0;else _=H&D;L=f[(f[g>>2]|0)+(_<<2)>>2]|0;if((L|0)!=0?(M=f[L>>2]|0,(M|0)!=0):0){if(J){J=M;while(1){L=f[J+4>>2]|0;if(!((L|0)==(D|0)|(L&H|0)==(_|0))){Z=_;Q=46;break a}if((f[J+8>>2]|0)==(E|0)?(f[J+12>>2]|0)==(F|0):0){Q=61;break a}J=f[J>>2]|0;if(!J){Z=_;Q=46;break a}}}else aa=M;while(1){J=f[aa+4>>2]|0;if((J|0)!=(D|0)){if(J>>>0<q>>>0)ba=J;else ba=(J>>>0)%(q>>>0)|0;if((ba|0)!=(_|0)){Z=_;Q=46;break a}}if((f[aa+8>>2]|0)==(E|0)?(f[aa+12>>2]|0)==(F|0):0){Q=61;break a}aa=f[aa>>2]|0;if(!aa){Z=_;Q=46;break}}}else{Z=_;Q=46}}else{Z=0;Q=46}while(0);if((Q|0)==46){Q=0;M=ln(20)|0;J=M+8|0;f[J>>2]=E;f[J+4>>2]=F;f[M+16>>2]=z;f[M+4>>2]=D;f[M>>2]=0;ca=$(((f[s>>2]|0)+1|0)>>>0);da=$(q>>>0);ea=$(n[k>>2]);do if(G|$(ea*da)<ca){J=q<<1|(q>>>0<3|(q+-1&q|0)!=0)&1;H=~~$(W($(ca/ea)))>>>0;Yh(g,J>>>0<H>>>0?H:J);J=f[m>>2]|0;H=J+-1|0;if(!(H&J)){fa=J;ga=H&D;break}if(D>>>0<J>>>0){fa=J;ga=D}else{fa=J;ga=(D>>>0)%(J>>>0)|0}}else{fa=q;ga=Z}while(0);D=(f[g>>2]|0)+(ga<<2)|0;G=f[D>>2]|0;if(!G){f[M>>2]=f[t>>2];f[t>>2]=M;f[D>>2]=t;D=f[M>>2]|0;if(D|0){F=f[D+4>>2]|0;D=fa+-1|0;if(D&fa)if(F>>>0<fa>>>0)ha=F;else ha=(F>>>0)%(fa>>>0)|0;else ha=F&D;ia=(f[g>>2]|0)+(ha<<2)|0;Q=59}}else{f[M>>2]=f[G>>2];ia=G;Q=59}if((Q|0)==59){Q=0;f[ia>>2]=M}f[s>>2]=(f[s>>2]|0)+1;Q=61}if((Q|0)==61){Q=0;G=v;D=f[G>>2]|0;F=un(D|0,f[G+4>>2]|0,z|0,0)|0;kh((f[f[w>>2]>>2]|0)+F|0,i|0,D|0)|0;D=f[j>>2]|0;f[D+(y<<2)>>2]=z;T=D;U=z+1|0;V=D;X=D;Y=D}D=y+1|0;ja=f[l>>2]|0;if(D>>>0>=ja>>>0)break;d=T;y=D;z=U;A=Y;B=X;C=V;q=f[m>>2]|0}if((U|0)==(ja|0))ka=X;else{X=a+84|0;if(!(b[X>>0]|0)){m=f[a+72>>2]|0;q=f[a+68>>2]|0;C=q;if((m|0)==(q|0))la=T;else{B=m-q>>2;q=0;do{m=C+(q<<2)|0;f[m>>2]=f[V+(f[m>>2]<<2)>>2];q=q+1|0}while(q>>>0<B>>>0);la=T}}else{b[X>>0]=0;X=a+68|0;T=a+72|0;B=f[T>>2]|0;q=f[X>>2]|0;V=B-q>>2;C=q;q=B;if(ja>>>0<=V>>>0)if(ja>>>0<V>>>0?(B=C+(ja<<2)|0,(B|0)!=(q|0)):0){f[T>>2]=q+(~((q+-4-B|0)>>>2)<<2);ma=ja}else ma=ja;else{Ch(X,ja-V|0,1220);ma=f[l>>2]|0}V=f[j>>2]|0;if(!ma)la=V;else{j=f[a+68>>2]|0;a=0;do{f[j+(a<<2)>>2]=f[V+(a<<2)>>2];a=a+1|0}while(a>>>0<ma>>>0);la=V}}f[l>>2]=U;ka=la}if(!ka)na=U;else{la=f[o>>2]|0;if((la|0)!=(ka|0))f[o>>2]=la+(~((la+-4-ka|0)>>>2)<<2);Oq(ka);na=U}}else na=0;U=f[g+8>>2]|0;if(U|0){ka=U;do{U=ka;ka=f[ka>>2]|0;Oq(U)}while((ka|0)!=0)}ka=f[g>>2]|0;f[g>>2]=0;if(!ka){u=e;return na|0}Oq(ka);u=e;return na|0}function Xb(a,c,e){a=a|0;c=c|0;e=e|0;var g=0,i=0,j=0,k=0,l=0,m=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,X=0,Y=0,Z=0,_=0,aa=0,ba=0,ca=0,da=0,ea=Oa,fa=Oa,ga=Oa,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0;g=u;u=u+48|0;i=g+12|0;j=g+32|0;k=g;l=i+16|0;f[i>>2]=0;f[i+4>>2]=0;f[i+8>>2]=0;f[i+12>>2]=0;n[l>>2]=$(1.0);m=a+80|0;o=f[m>>2]|0;f[k>>2]=0;p=k+4|0;f[p>>2]=0;f[k+8>>2]=0;if(o){if(o>>>0>1073741823)aq(k);q=o<<2;r=ln(q)|0;f[k>>2]=r;s=r+(o<<2)|0;f[k+8>>2]=s;sj(r|0,0,q|0)|0;f[p>>2]=s;s=c+48|0;q=c+40|0;o=i+4|0;t=i+12|0;v=i+8|0;w=a+40|0;x=a+64|0;y=f[e>>2]|0;e=r;z=0;A=0;B=r;C=r;D=0;E=r;while(1){r=s;F=f[r>>2]|0;G=f[r+4>>2]|0;r=q;H=un(f[r>>2]|0,f[r+4>>2]|0,y+z|0,0)|0;r=Vn(H|0,I|0,F|0,G|0)|0;G=(f[f[c>>2]>>2]|0)+r|0;r=h[G>>0]|h[G+1>>0]<<8;d[j>>1]=r;G=r&255;F=(r&65535)>>>8;H=F&255;J=((r&255^318)+239<<16>>16^F)&65535;F=(D|0)==0;a:do if(!F){K=D+-1|0;L=(K&D|0)==0;if(!L)if(D>>>0>J>>>0)M=J;else M=(J>>>0)%(D>>>0)|0;else M=K&J;N=f[(f[i>>2]|0)+(M<<2)>>2]|0;do if(N|0?(O=f[N>>2]|0,O|0):0){b:do if(L){P=O;while(1){Q=f[P+4>>2]|0;R=(Q|0)==(J|0);if(!(R|(Q&K|0)==(M|0))){S=27;break b}if((R?(R=P+8|0,(b[R>>0]|0)==G<<24>>24):0)?(b[R+1>>0]|0)==H<<24>>24:0){T=P;S=26;break b}P=f[P>>2]|0;if(!P){S=27;break}}}else{P=O;while(1){R=f[P+4>>2]|0;if((R|0)==(J|0)){Q=P+8|0;if((b[Q>>0]|0)==G<<24>>24?(b[Q+1>>0]|0)==H<<24>>24:0){T=P;S=26;break b}}else{if(R>>>0<D>>>0)U=R;else U=(R>>>0)%(D>>>0)|0;if((U|0)!=(M|0)){S=27;break b}}P=f[P>>2]|0;if(!P){S=27;break}}}while(0);if((S|0)==26){S=0;f[E+(z<<2)>>2]=f[T+12>>2];V=e;X=A;Y=C;Z=B;_=E;break a}else if((S|0)==27){S=0;if(F){aa=0;S=46;break a}else break}}while(0);K=D+-1|0;L=(K&D|0)==0;if(!L)if(D>>>0>J>>>0)ba=J;else ba=(J>>>0)%(D>>>0)|0;else ba=K&J;N=f[(f[i>>2]|0)+(ba<<2)>>2]|0;if((N|0)!=0?(O=f[N>>2]|0,(O|0)!=0):0){if(L){L=O;while(1){N=f[L+4>>2]|0;if(!((N|0)==(J|0)|(N&K|0)==(ba|0))){aa=ba;S=46;break a}N=L+8|0;if((b[N>>0]|0)==G<<24>>24?(b[N+1>>0]|0)==H<<24>>24:0){S=61;break a}L=f[L>>2]|0;if(!L){aa=ba;S=46;break a}}}else ca=O;while(1){L=f[ca+4>>2]|0;if((L|0)!=(J|0)){if(L>>>0<D>>>0)da=L;else da=(L>>>0)%(D>>>0)|0;if((da|0)!=(ba|0)){aa=ba;S=46;break a}}L=ca+8|0;if((b[L>>0]|0)==G<<24>>24?(b[L+1>>0]|0)==H<<24>>24:0){S=61;break a}ca=f[ca>>2]|0;if(!ca){aa=ba;S=46;break}}}else{aa=ba;S=46}}else{aa=0;S=46}while(0);if((S|0)==46){S=0;H=ln(16)|0;G=H+8|0;b[G>>0]=r;b[G+1>>0]=r>>8;f[H+12>>2]=A;f[H+4>>2]=J;f[H>>2]=0;ea=$(((f[t>>2]|0)+1|0)>>>0);fa=$(D>>>0);ga=$(n[l>>2]);do if(F|$(ga*fa)<ea){G=D<<1|(D>>>0<3|(D+-1&D|0)!=0)&1;O=~~$(W($(ea/ga)))>>>0;$h(i,G>>>0<O>>>0?O:G);G=f[o>>2]|0;O=G+-1|0;if(!(O&G)){ha=G;ia=O&J;break}if(G>>>0>J>>>0){ha=G;ia=J}else{ha=G;ia=(J>>>0)%(G>>>0)|0}}else{ha=D;ia=aa}while(0);J=(f[i>>2]|0)+(ia<<2)|0;F=f[J>>2]|0;if(!F){f[H>>2]=f[v>>2];f[v>>2]=H;f[J>>2]=v;J=f[H>>2]|0;if(J|0){r=f[J+4>>2]|0;J=ha+-1|0;if(J&ha)if(r>>>0<ha>>>0)ja=r;else ja=(r>>>0)%(ha>>>0)|0;else ja=r&J;ka=(f[i>>2]|0)+(ja<<2)|0;S=59}}else{f[H>>2]=f[F>>2];ka=F;S=59}if((S|0)==59){S=0;f[ka>>2]=H}f[t>>2]=(f[t>>2]|0)+1;S=61}if((S|0)==61){S=0;F=w;J=f[F>>2]|0;r=un(J|0,f[F+4>>2]|0,A|0,0)|0;kh((f[f[x>>2]>>2]|0)+r|0,j|0,J|0)|0;J=f[k>>2]|0;f[J+(z<<2)>>2]=A;V=J;X=A+1|0;Y=J;Z=J;_=J}J=z+1|0;la=f[m>>2]|0;if(J>>>0>=la>>>0)break;e=V;z=J;A=X;B=Z;C=Y;D=f[o>>2]|0;E=_}if((X|0)==(la|0))ma=Z;else{Z=a+84|0;if(!(b[Z>>0]|0)){_=f[a+72>>2]|0;E=f[a+68>>2]|0;o=E;if((_|0)==(E|0))na=V;else{D=_-E>>2;E=0;do{_=o+(E<<2)|0;f[_>>2]=f[Y+(f[_>>2]<<2)>>2];E=E+1|0}while(E>>>0<D>>>0);na=V}}else{b[Z>>0]=0;Z=a+68|0;V=a+72|0;D=f[V>>2]|0;E=f[Z>>2]|0;Y=D-E>>2;o=E;E=D;if(la>>>0<=Y>>>0)if(la>>>0<Y>>>0?(D=o+(la<<2)|0,(D|0)!=(E|0)):0){f[V>>2]=E+(~((E+-4-D|0)>>>2)<<2);oa=la}else oa=la;else{Ch(Z,la-Y|0,1220);oa=f[m>>2]|0}Y=f[k>>2]|0;if(!oa)na=Y;else{k=f[a+68>>2]|0;a=0;do{f[k+(a<<2)>>2]=f[Y+(a<<2)>>2];a=a+1|0}while(a>>>0<oa>>>0);na=Y}}f[m>>2]=X;ma=na}if(!ma)pa=X;else{na=f[p>>2]|0;if((na|0)!=(ma|0))f[p>>2]=na+(~((na+-4-ma|0)>>>2)<<2);Oq(ma);pa=X}}else pa=0;X=f[i+8>>2]|0;if(X|0){ma=X;do{X=ma;ma=f[ma>>2]|0;Oq(X)}while((ma|0)!=0)}ma=f[i>>2]|0;f[i>>2]=0;if(!ma){u=g;return pa|0}Oq(ma);u=g;return pa|0}function Yb(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0;c=u;u=u+16|0;d=c+8|0;e=c;g=c+4|0;h=a+16|0;i=f[h>>2]|0;j=a+20|0;k=f[j>>2]|0;if((k|0)==(i|0))l=i;else{m=k+(~((k+-4-i|0)>>>2)<<2)|0;f[j>>2]=m;l=m}m=a+24|0;if((l|0)==(f[m>>2]|0)){Ri(h,b);n=f[h>>2]|0;o=f[j>>2]|0}else{f[l>>2]=f[b>>2];k=l+4|0;f[j>>2]=k;n=i;o=k}k=f[a+8>>2]|0;i=(f[k+100>>2]|0)-(f[k+96>>2]|0)|0;k=(i|0)/12|0;if((n|0)==(o|0)){u=c;return 1}n=a+28|0;l=(i|0)>0;i=a+164|0;p=a+12|0;q=a+76|0;r=a+80|0;s=a+72|0;t=a+200|0;v=a+320|0;w=a+152|0;x=a+84|0;y=a+324|0;z=a+292|0;A=a+304|0;B=a+316|0;C=a+328|0;D=a+336|0;E=a+332|0;F=a+168|0;G=a+140|0;H=a+120|0;I=o;do{o=f[I+-4>>2]|0;f[b>>2]=o;a:do if((o|0)!=-1?(J=(o>>>0)/3|0,K=f[n>>2]|0,(f[K+(J>>>5<<2)>>2]&1<<(J&31)|0)==0):0){if(l){J=0;L=K;b:while(1){K=J+1|0;f[i>>2]=(f[i>>2]|0)+1;M=f[b>>2]|0;N=(M|0)==-1?-1:(M>>>0)/3|0;M=L+(N>>>5<<2)|0;f[M>>2]=1<<(N&31)|f[M>>2];M=f[q>>2]|0;if((M|0)==(f[r>>2]|0))Ri(s,b);else{f[M>>2]=f[b>>2];f[q>>2]=M+4}f[v>>2]=f[b>>2];M=f[b>>2]|0;if((M|0)==-1)O=-1;else O=f[(f[f[p>>2]>>2]|0)+(M<<2)>>2]|0;P=(f[(f[w>>2]|0)+(O<<2)>>2]|0)!=-1;Q=(f[x>>2]|0)+(O>>>5<<2)|0;R=1<<(O&31);S=f[Q>>2]|0;do if(!(S&R)){f[Q>>2]=S|R;if(P){T=f[b>>2]|0;U=38;break}f[y>>2]=(f[y>>2]|0)+1;V=f[v>>2]|0;W=V+1|0;do if((V|0)!=-1){X=((W>>>0)%3|0|0)==0?V+-2|0:W;if(!((V>>>0)%3|0)){Y=V+2|0;Z=X;break}else{Y=V+-1|0;Z=X;break}}else{Y=-1;Z=-1}while(0);V=f[z>>2]|0;W=f[A>>2]|0;X=W+(f[V+(Z<<2)>>2]<<2)|0;_=f[X>>2]|0;f[X>>2]=_+-1;X=W+(f[V+(Y<<2)>>2]<<2)|0;f[X>>2]=(f[X>>2]|0)+-1;X=f[B>>2]|0;if((X|0)!=-1){V=f[C>>2]|0;if((_|0)<(V|0))$=V;else{W=f[E>>2]|0;$=(_|0)>(W|0)?W:_}_=$-V|0;V=f[D>>2]|0;W=f[3724+(X<<2)>>2]|0;f[d>>2]=W;X=V+(_*12|0)+4|0;aa=f[X>>2]|0;if(aa>>>0<(f[V+(_*12|0)+8>>2]|0)>>>0){f[aa>>2]=W;f[X>>2]=aa+4}else Ri(V+(_*12|0)|0,d)}f[B>>2]=0;_=f[b>>2]|0;V=_+1|0;if((_|0)!=-1?(aa=((V>>>0)%3|0|0)==0?_+-2|0:V,(aa|0)!=-1):0)ba=f[(f[(f[p>>2]|0)+12>>2]|0)+(aa<<2)>>2]|0;else ba=-1;f[b>>2]=ba}else{T=M;U=38}while(0);if((U|0)==38){U=0;M=T+1|0;if((T|0)==-1){U=43;break}R=((M>>>0)%3|0|0)==0?T+-2|0:M;if((R|0)==-1)ca=-1;else ca=f[(f[(f[p>>2]|0)+12>>2]|0)+(R<<2)>>2]|0;f[e>>2]=ca;R=(((T>>>0)%3|0|0)==0?2:-1)+T|0;if((R|0)==-1)da=-1;else da=f[(f[(f[p>>2]|0)+12>>2]|0)+(R<<2)>>2]|0;R=(ca|0)==-1;S=R?-1:(ca>>>0)/3|0;ea=(da|0)==-1;fa=ea?-1:(da>>>0)/3|0;Q=((M>>>0)%3|0|0)==0?T+-2|0:M;if(((Q|0)!=-1?(M=f[(f[p>>2]|0)+12>>2]|0,aa=f[M+(Q<<2)>>2]|0,(aa|0)!=-1):0)?(Q=(aa>>>0)/3|0,aa=f[n>>2]|0,(f[aa+(Q>>>5<<2)>>2]&1<<(Q&31)|0)==0):0){Q=(((T>>>0)%3|0|0)==0?2:-1)+T|0;do if((Q|0)!=-1){V=f[M+(Q<<2)>>2]|0;if((V|0)==-1)break;_=(V>>>0)/3|0;if(!(f[aa+(_>>>5<<2)>>2]&1<<(_&31))){U=62;break b}}while(0);if(!ea)xf(a,f[i>>2]|0,N,0,fa);nd(t,3);ga=f[e>>2]|0}else{if(!R){xf(a,f[i>>2]|0,N,1,S);aa=f[b>>2]|0;if((aa|0)==-1){U=52;break}else ha=aa}else ha=T;aa=(((ha>>>0)%3|0|0)==0?2:-1)+ha|0;if((aa|0)==-1){U=52;break}Q=f[(f[(f[p>>2]|0)+12>>2]|0)+(aa<<2)>>2]|0;if((Q|0)==-1){U=52;break}aa=(Q>>>0)/3|0;if(f[(f[n>>2]|0)+(aa>>>5<<2)>>2]&1<<(aa&31)|0){U=52;break}nd(t,5);ga=da}f[b>>2]=ga}if((K|0)>=(k|0))break a;J=K;L=f[n>>2]|0}do if((U|0)==43){U=0;f[e>>2]=-1;U=54}else if((U|0)==52){U=0;if(ea)U=54;else{xf(a,f[i>>2]|0,N,0,fa);U=54}}else if((U|0)==62){U=0;nd(t,1);f[F>>2]=(f[F>>2]|0)+1;if(P?(L=f[(f[w>>2]|0)+(O<<2)>>2]|0,(1<<(L&31)&f[(f[G>>2]|0)+(L>>>5<<2)>>2]|0)==0):0){f[g>>2]=f[b>>2];f[d>>2]=f[g>>2];Pe(a,d,0)|0}L=f[i>>2]|0;f[d>>2]=N;J=je(H,d)|0;f[J>>2]=L;L=f[j>>2]|0;f[L+-4>>2]=da;if((L|0)==(f[m>>2]|0)){Ri(h,e);break}else{f[L>>2]=f[e>>2];f[j>>2]=L+4;break}}while(0);if((U|0)==54){U=0;nd(t,7);f[j>>2]=(f[j>>2]|0)+-4}}}else U=11;while(0);if((U|0)==11){U=0;f[j>>2]=I+-4}I=f[j>>2]|0}while((f[h>>2]|0)!=(I|0));u=c;return 1}function Zb(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0;c=u;u=u+16|0;d=c+8|0;e=c;g=f[b>>2]|0;if((g|0)==-1){u=c;return}h=(g>>>0)/3|0;i=a+12|0;if(f[(f[i>>2]|0)+(h>>>5<<2)>>2]&1<<(h&31)|0){u=c;return}h=a+56|0;j=f[h>>2]|0;k=a+60|0;l=f[k>>2]|0;if((l|0)==(j|0))m=j;else{n=l+(~((l+-4-j|0)>>>2)<<2)|0;f[k>>2]=n;m=n}n=a+64|0;if((m|0)==(f[n>>2]|0))Ri(h,b);else{f[m>>2]=g;f[k>>2]=m+4}m=f[a>>2]|0;g=f[b>>2]|0;j=g+1|0;do if((g|0)!=-1){l=f[m+28>>2]|0;o=f[l+((((j>>>0)%3|0|0)==0?g+-2|0:j)<<2)>>2]|0;if(!((g>>>0)%3|0)){p=o;q=g+2|0;r=l;break}else{p=o;q=g+-1|0;r=l;break}}else{l=f[m+28>>2]|0;p=f[l+-4>>2]|0;q=-1;r=l}while(0);m=f[r+(q<<2)>>2]|0;q=a+24|0;r=f[q>>2]|0;g=r+(p>>>5<<2)|0;j=1<<(p&31);l=f[g>>2]|0;if(!(l&j)){f[g>>2]=l|j;j=f[b>>2]|0;l=j+1|0;if((j|0)==-1)s=-1;else s=((l>>>0)%3|0|0)==0?j+-2|0:l;f[e>>2]=s;l=f[(f[(f[a+44>>2]|0)+96>>2]|0)+(((s>>>0)/3|0)*12|0)+(((s>>>0)%3|0)<<2)>>2]|0;s=f[a+48>>2]|0;f[d>>2]=l;j=f[s+4>>2]|0;s=j+4|0;g=f[s>>2]|0;if((g|0)==(f[j+8>>2]|0))Ri(j,d);else{f[g>>2]=l;f[s>>2]=g+4}g=a+40|0;s=f[g>>2]|0;l=s+4|0;j=f[l>>2]|0;if((j|0)==(f[s+8>>2]|0)){Ri(s,e);t=f[g>>2]|0}else{f[j>>2]=f[e>>2];f[l>>2]=j+4;t=s}s=t+24|0;f[(f[t+12>>2]|0)+(p<<2)>>2]=f[s>>2];f[s>>2]=(f[s>>2]|0)+1;v=f[q>>2]|0}else v=r;r=v+(m>>>5<<2)|0;v=1<<(m&31);s=f[r>>2]|0;if(!(s&v)){f[r>>2]=s|v;v=f[b>>2]|0;do if((v|0)!=-1)if(!((v>>>0)%3|0)){w=v+2|0;break}else{w=v+-1|0;break}else w=-1;while(0);f[e>>2]=w;v=f[(f[(f[a+44>>2]|0)+96>>2]|0)+(((w>>>0)/3|0)*12|0)+(((w>>>0)%3|0)<<2)>>2]|0;w=f[a+48>>2]|0;f[d>>2]=v;s=f[w+4>>2]|0;w=s+4|0;r=f[w>>2]|0;if((r|0)==(f[s+8>>2]|0))Ri(s,d);else{f[r>>2]=v;f[w>>2]=r+4}r=a+40|0;w=f[r>>2]|0;v=w+4|0;s=f[v>>2]|0;if((s|0)==(f[w+8>>2]|0)){Ri(w,e);x=f[r>>2]|0}else{f[s>>2]=f[e>>2];f[v>>2]=s+4;x=w}w=x+24|0;f[(f[x+12>>2]|0)+(m<<2)>>2]=f[w>>2];f[w>>2]=(f[w>>2]|0)+1}w=f[h>>2]|0;m=f[k>>2]|0;if((w|0)==(m|0)){u=c;return}x=a+44|0;s=a+48|0;v=a+40|0;r=m;m=w;while(1){w=f[r+-4>>2]|0;f[b>>2]=w;p=(w>>>0)/3|0;if((w|0)!=-1?(w=f[i>>2]|0,(f[w+(p>>>5<<2)>>2]&1<<(p&31)|0)==0):0){t=p;p=w;w=f[a>>2]|0;a:while(1){j=p+(t>>>5<<2)|0;f[j>>2]=f[j>>2]|1<<(t&31);j=f[b>>2]|0;l=f[(f[w+28>>2]|0)+(j<<2)>>2]|0;g=(f[q>>2]|0)+(l>>>5<<2)|0;o=1<<(l&31);y=f[g>>2]|0;if(!(o&y)){z=f[(f[w+40>>2]|0)+(l<<2)>>2]|0;if((z|0)==-1)A=1;else{B=f[(f[f[w+64>>2]>>2]|0)+(z<<2)>>2]|0;A=(1<<(B&31)&f[(f[w+12>>2]|0)+(B>>>5<<2)>>2]|0)!=0}f[g>>2]=y|o;o=f[b>>2]|0;f[e>>2]=o;y=f[(f[(f[x>>2]|0)+96>>2]|0)+(((o>>>0)/3|0)*12|0)+(((o>>>0)%3|0)<<2)>>2]|0;o=f[s>>2]|0;f[d>>2]=y;g=f[o+4>>2]|0;o=g+4|0;B=f[o>>2]|0;if((B|0)==(f[g+8>>2]|0))Ri(g,d);else{f[B>>2]=y;f[o>>2]=B+4}B=f[v>>2]|0;o=B+4|0;y=f[o>>2]|0;if((y|0)==(f[B+8>>2]|0)){Ri(B,e);C=f[v>>2]|0}else{f[y>>2]=f[e>>2];f[o>>2]=y+4;C=B}B=C+24|0;f[(f[C+12>>2]|0)+(l<<2)>>2]=f[B>>2];f[B>>2]=(f[B>>2]|0)+1;B=f[a>>2]|0;l=f[b>>2]|0;if(A){D=l;E=B;F=57}else{y=l+1|0;do if((l|0)==-1)G=-1;else{o=((y>>>0)%3|0|0)==0?l+-2|0:y;if((o|0)==-1){G=-1;break}if(f[(f[B>>2]|0)+(o>>>5<<2)>>2]&1<<(o&31)|0){G=-1;break}G=f[(f[(f[B+64>>2]|0)+12>>2]|0)+(o<<2)>>2]|0}while(0);f[b>>2]=G;H=(G>>>0)/3|0;I=B}}else{D=j;E=w;F=57}if((F|0)==57){F=0;y=D+1|0;if((D|0)==-1){F=58;break}l=((y>>>0)%3|0|0)==0?D+-2|0:y;if((l|0)!=-1?(f[(f[E>>2]|0)+(l>>>5<<2)>>2]&1<<(l&31)|0)==0:0)J=f[(f[(f[E+64>>2]|0)+12>>2]|0)+(l<<2)>>2]|0;else J=-1;f[d>>2]=J;l=(((D>>>0)%3|0|0)==0?2:-1)+D|0;if((l|0)!=-1?(f[(f[E>>2]|0)+(l>>>5<<2)>>2]&1<<(l&31)|0)==0:0)K=f[(f[(f[E+64>>2]|0)+12>>2]|0)+(l<<2)>>2]|0;else K=-1;l=(J|0)==-1;y=(J>>>0)/3|0;o=l?-1:y;g=(K|0)==-1;z=(K>>>0)/3|0;L=g?-1:z;do if(!l){M=f[i>>2]|0;if(f[M+(o>>>5<<2)>>2]&1<<(o&31)|0){F=67;break}if(g){N=J;O=y;break}if(!(f[M+(L>>>5<<2)>>2]&1<<(L&31))){F=72;break a}else{N=J;O=y}}else F=67;while(0);if((F|0)==67){F=0;if(g){F=69;break}if(!(f[(f[i>>2]|0)+(L>>>5<<2)>>2]&1<<(L&31))){N=K;O=z}else{F=69;break}}f[b>>2]=N;H=O;I=E}t=H;p=f[i>>2]|0;w=I}do if((F|0)==58){F=0;f[d>>2]=-1;F=69}else if((F|0)==72){F=0;w=f[k>>2]|0;f[w+-4>>2]=K;if((w|0)==(f[n>>2]|0)){Ri(h,d);P=f[k>>2]|0;break}else{f[w>>2]=f[d>>2];p=w+4|0;f[k>>2]=p;P=p;break}}while(0);if((F|0)==69){F=0;p=(f[k>>2]|0)+-4|0;f[k>>2]=p;P=p}Q=f[h>>2]|0;R=P}else{p=r+-4|0;f[k>>2]=p;Q=m;R=p}if((Q|0)==(R|0))break;else{r=R;m=Q}}u=c;return}function _b(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,i=0,j=0,k=0,l=0,m=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=Oa,K=Oa,L=Oa,M=0,N=0,O=0,P=0;e=u;u=u+64|0;g=e+40|0;i=e+16|0;j=e;k=Id(a,c)|0;if(k|0){f[i>>2]=k;f[g>>2]=f[i>>2];lf(a,g)|0}f[j>>2]=0;k=j+4|0;f[k>>2]=0;f[j+8>>2]=0;Fi(j,8);l=d;d=l;m=h[d>>0]|h[d+1>>0]<<8|h[d+2>>0]<<16|h[d+3>>0]<<24;d=l+4|0;l=h[d>>0]|h[d+1>>0]<<8|h[d+2>>0]<<16|h[d+3>>0]<<24;d=f[j>>2]|0;o=d;b[o>>0]=m;b[o+1>>0]=m>>8;b[o+2>>0]=m>>16;b[o+3>>0]=m>>24;m=d+4|0;b[m>>0]=l;b[m+1>>0]=l>>8;b[m+2>>0]=l>>16;b[m+3>>0]=l>>24;pj(i,c);c=i+12|0;f[c>>2]=0;l=i+16|0;f[l>>2]=0;f[i+20>>2]=0;m=f[k>>2]|0;d=f[j>>2]|0;o=m-d|0;if(!o){p=d;q=m;r=0}else{Fi(c,o);p=f[j>>2]|0;q=f[k>>2]|0;r=f[c>>2]|0}kh(r|0,p|0,q-p|0)|0;p=i+11|0;q=b[p>>0]|0;r=q<<24>>24<0;c=r?f[i>>2]|0:i;o=r?f[i+4>>2]|0:q&255;if(o>>>0>3){q=c;r=o;m=o;while(1){d=X(h[q>>0]|h[q+1>>0]<<8|h[q+2>>0]<<16|h[q+3>>0]<<24,1540483477)|0;r=(X(d>>>24^d,1540483477)|0)^(X(r,1540483477)|0);m=m+-4|0;if(m>>>0<=3)break;else q=q+4|0}q=o+-4|0;m=q&-4;s=q-m|0;t=c+(m+4)|0;v=r}else{s=o;t=c;v=o}switch(s|0){case 3:{w=h[t+2>>0]<<16^v;x=10;break}case 2:{w=v;x=10;break}case 1:{y=v;x=11;break}default:z=v}if((x|0)==10){y=h[t+1>>0]<<8^w;x=11}if((x|0)==11)z=X(y^h[t>>0],1540483477)|0;t=X(z>>>13^z,1540483477)|0;z=t>>>15^t;t=a+4|0;y=f[t>>2]|0;w=(y|0)==0;a:do if(!w){v=y+-1|0;s=(v&y|0)==0;if(!s)if(z>>>0<y>>>0)A=z;else A=(z>>>0)%(y>>>0)|0;else A=z&v;r=f[(f[a>>2]|0)+(A<<2)>>2]|0;if((r|0)!=0?(m=f[r>>2]|0,(m|0)!=0):0){r=(o|0)==0;if(s){if(r){s=m;while(1){q=f[s+4>>2]|0;if(!((q|0)==(z|0)|(q&v|0)==(A|0))){B=A;x=52;break a}q=b[s+8+11>>0]|0;if(!((q<<24>>24<0?f[s+12>>2]|0:q&255)|0))break a;s=f[s>>2]|0;if(!s){B=A;x=52;break a}}}else C=m;while(1){s=f[C+4>>2]|0;if(!((s|0)==(z|0)|(s&v|0)==(A|0))){B=A;x=52;break a}s=C+8|0;q=b[s+11>>0]|0;d=q<<24>>24<0;D=q&255;do if(((d?f[C+12>>2]|0:D)|0)==(o|0)){q=f[s>>2]|0;if(d)if(!(Vk(q,c,o)|0))break a;else break;if((b[c>>0]|0)==(q&255)<<24>>24){q=s;E=D;F=c;do{E=E+-1|0;q=q+1|0;if(!E)break a;F=F+1|0}while((b[q>>0]|0)==(b[F>>0]|0))}}while(0);C=f[C>>2]|0;if(!C){B=A;x=52;break a}}}if(r){v=m;while(1){D=f[v+4>>2]|0;if((D|0)!=(z|0)){if(D>>>0<y>>>0)G=D;else G=(D>>>0)%(y>>>0)|0;if((G|0)!=(A|0)){B=A;x=52;break a}}D=b[v+8+11>>0]|0;if(!((D<<24>>24<0?f[v+12>>2]|0:D&255)|0))break a;v=f[v>>2]|0;if(!v){B=A;x=52;break a}}}else H=m;while(1){v=f[H+4>>2]|0;if((v|0)!=(z|0)){if(v>>>0<y>>>0)I=v;else I=(v>>>0)%(y>>>0)|0;if((I|0)!=(A|0)){B=A;x=52;break a}}v=H+8|0;r=b[v+11>>0]|0;D=r<<24>>24<0;s=r&255;do if(((D?f[H+12>>2]|0:s)|0)==(o|0)){r=f[v>>2]|0;if(D)if(!(Vk(r,c,o)|0))break a;else break;if((b[c>>0]|0)==(r&255)<<24>>24){r=v;d=s;F=c;do{d=d+-1|0;r=r+1|0;if(!d)break a;F=F+1|0}while((b[r>>0]|0)==(b[F>>0]|0))}}while(0);H=f[H>>2]|0;if(!H){B=A;x=52;break}}}else{B=A;x=52}}else{B=0;x=52}while(0);if((x|0)==52){oi(g,a,z,i);x=a+12|0;J=$(((f[x>>2]|0)+1|0)>>>0);K=$(y>>>0);L=$(n[a+16>>2]);do if(w|$(L*K)<J){A=y<<1|(y>>>0<3|(y+-1&y|0)!=0)&1;H=~~$(W($(J/L)))>>>0;ei(a,A>>>0<H>>>0?H:A);A=f[t>>2]|0;H=A+-1|0;if(!(H&A)){M=A;N=H&z;break}if(z>>>0<A>>>0){M=A;N=z}else{M=A;N=(z>>>0)%(A>>>0)|0}}else{M=y;N=B}while(0);B=f[(f[a>>2]|0)+(N<<2)>>2]|0;if(!B){y=a+8|0;f[f[g>>2]>>2]=f[y>>2];f[y>>2]=f[g>>2];f[(f[a>>2]|0)+(N<<2)>>2]=y;y=f[g>>2]|0;N=f[y>>2]|0;if(!N)O=g;else{z=f[N+4>>2]|0;N=M+-1|0;if(N&M)if(z>>>0<M>>>0)P=z;else P=(z>>>0)%(M>>>0)|0;else P=z&N;f[(f[a>>2]|0)+(P<<2)>>2]=y;O=g}}else{f[f[g>>2]>>2]=f[B>>2];f[B>>2]=f[g>>2];O=g}f[x>>2]=(f[x>>2]|0)+1;f[O>>2]=0}O=f[i+12>>2]|0;if(O|0){if((f[l>>2]|0)!=(O|0))f[l>>2]=O;Oq(O)}if((b[p>>0]|0)<0)Oq(f[i>>2]|0);i=f[j>>2]|0;if(!i){u=e;return}if((f[k>>2]|0)!=(i|0))f[k>>2]=i;Oq(i);u=e;return}function $b(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0;e=u;u=u+96|0;g=e+92|0;h=e+88|0;i=e+72|0;j=e+48|0;k=e+24|0;l=e;m=a+16|0;n=f[m>>2]|0;o=f[c>>2]|0;f[i>>2]=n;f[i+4>>2]=o;c=i+8|0;f[c>>2]=o;b[i+12>>0]=1;p=(o|0)==-1;if(p)q=-1;else q=f[(f[n>>2]|0)+(o<<2)>>2]|0;n=a+20|0;r=f[n>>2]|0;s=f[r>>2]|0;if((f[r+4>>2]|0)-s>>2>>>0<=q>>>0)aq(r);r=a+8|0;t=f[(f[r>>2]|0)+(f[s+(q<<2)>>2]<<2)>>2]|0;q=a+4|0;s=f[q>>2]|0;if(!(b[s+84>>0]|0))v=f[(f[s+68>>2]|0)+(t<<2)>>2]|0;else v=t;f[j>>2]=0;f[j+4>>2]=0;f[j+8>>2]=0;f[j+12>>2]=0;f[j+16>>2]=0;f[j+20>>2]=0;f[h>>2]=v;v=b[s+24>>0]|0;f[g>>2]=f[h>>2];vb(s,g,v,j)|0;v=a+28|0;a=(f[v>>2]|0)==0;a:do if(!p){s=k+8|0;t=j+8|0;w=k+16|0;x=j+16|0;y=l+8|0;z=l+16|0;A=o;B=o;C=0;D=0;E=0;F=0;G=0;H=0;J=a;K=o;while(1){do if(J){L=K+1|0;if((K|0)==-1){M=A;N=-1;O=-1;P=-1;break}Q=((L>>>0)%3|0|0)==0?K+-2|0:L;if((A|0)!=-1)if(!((A>>>0)%3|0)){R=A;S=A+2|0;T=Q;U=A;V=19;break}else{R=A;S=A+-1|0;T=Q;U=A;V=19;break}else{R=-1;S=-1;T=Q;U=-1;V=19}}else{Q=B+1|0;L=((Q>>>0)%3|0|0)==0?B+-2|0:Q;if(!((B>>>0)%3|0)){R=A;S=B+2|0;T=L;U=K;V=19;break}else{R=A;S=B+-1|0;T=L;U=K;V=19;break}}while(0);if((V|0)==19){V=0;if((T|0)==-1){M=R;N=-1;O=S;P=U}else{M=R;N=f[(f[f[m>>2]>>2]|0)+(T<<2)>>2]|0;O=S;P=U}}W=f[n>>2]|0;L=f[W>>2]|0;if((f[W+4>>2]|0)-L>>2>>>0<=N>>>0){V=22;break}Q=f[(f[r>>2]|0)+(f[L+(N<<2)>>2]<<2)>>2]|0;L=f[q>>2]|0;if(!(b[L+84>>0]|0))X=f[(f[L+68>>2]|0)+(Q<<2)>>2]|0;else X=Q;f[k>>2]=0;f[k+4>>2]=0;f[k+8>>2]=0;f[k+12>>2]=0;f[k+16>>2]=0;f[k+20>>2]=0;f[h>>2]=X;Q=b[L+24>>0]|0;f[g>>2]=f[h>>2];vb(L,g,Q,k)|0;if((O|0)==-1)Y=-1;else Y=f[(f[f[m>>2]>>2]|0)+(O<<2)>>2]|0;Z=f[n>>2]|0;Q=f[Z>>2]|0;if((f[Z+4>>2]|0)-Q>>2>>>0<=Y>>>0){V=28;break}L=f[(f[r>>2]|0)+(f[Q+(Y<<2)>>2]<<2)>>2]|0;Q=f[q>>2]|0;if(!(b[Q+84>>0]|0))_=f[(f[Q+68>>2]|0)+(L<<2)>>2]|0;else _=L;f[l>>2]=0;f[l+4>>2]=0;f[l+8>>2]=0;f[l+12>>2]=0;f[l+16>>2]=0;f[l+20>>2]=0;f[h>>2]=_;L=b[Q+24>>0]|0;f[g>>2]=f[h>>2];vb(Q,g,L,l)|0;L=k;Q=j;$=f[Q>>2]|0;aa=f[Q+4>>2]|0;Q=Xn(f[L>>2]|0,f[L+4>>2]|0,$|0,aa|0)|0;L=I;ba=s;ca=t;da=f[ca>>2]|0;ea=f[ca+4>>2]|0;ca=Xn(f[ba>>2]|0,f[ba+4>>2]|0,da|0,ea|0)|0;ba=I;fa=w;ga=x;ha=f[ga>>2]|0;ia=f[ga+4>>2]|0;ga=Xn(f[fa>>2]|0,f[fa+4>>2]|0,ha|0,ia|0)|0;fa=I;ja=l;ka=Xn(f[ja>>2]|0,f[ja+4>>2]|0,$|0,aa|0)|0;aa=I;$=y;ja=Xn(f[$>>2]|0,f[$+4>>2]|0,da|0,ea|0)|0;ea=I;da=z;$=Xn(f[da>>2]|0,f[da+4>>2]|0,ha|0,ia|0)|0;ia=I;ha=un($|0,ia|0,ca|0,ba|0)|0;da=I;la=un(ja|0,ea|0,ga|0,fa|0)|0;ma=I;na=un(ka|0,aa|0,ga|0,fa|0)|0;fa=I;ga=un($|0,ia|0,Q|0,L|0)|0;ia=I;$=un(ja|0,ea|0,Q|0,L|0)|0;L=I;Q=un(ka|0,aa|0,ca|0,ba|0)|0;ba=I;ca=Xn(C|0,D|0,la|0,ma|0)|0;ma=Vn(ca|0,I|0,ha|0,da|0)|0;da=I;ha=Vn(na|0,fa|0,E|0,F|0)|0;fa=Xn(ha|0,I|0,ga|0,ia|0)|0;ia=I;ga=Xn(G|0,H|0,Q|0,ba|0)|0;ba=Vn(ga|0,I|0,$|0,L|0)|0;L=I;Hh(i);B=f[c>>2]|0;$=(f[v>>2]|0)==0;if((B|0)==-1){oa=$;pa=da;qa=ma;ra=ia;sa=fa;ta=L;ua=ba;break a}else{A=M;C=ma;D=da;E=fa;F=ia;G=ba;H=L;J=$;K=P}}if((V|0)==22)aq(W);else if((V|0)==28)aq(Z)}else{oa=a;pa=0;qa=0;ra=0;sa=0;ta=0;ua=0}while(0);a=(pa|0)>-1|(pa|0)==-1&qa>>>0>4294967295;Z=Xn(0,0,qa|0,pa|0)|0;V=a?pa:I;W=(ra|0)>-1|(ra|0)==-1&sa>>>0>4294967295;P=Xn(0,0,sa|0,ra|0)|0;M=W?ra:I;v=(ta|0)>-1|(ta|0)==-1&ua>>>0>4294967295;c=Xn(0,0,ua|0,ta|0)|0;i=Vn((W?sa:P)|0,M|0,(v?ua:c)|0,(v?ta:I)|0)|0;v=Vn(i|0,I|0,(a?qa:Z)|0,V|0)|0;V=I;if(oa){if((v|0)<=536870912){va=qa;wa=sa;xa=ua;f[d>>2]=va;ya=d+4|0;f[ya>>2]=wa;za=d+8|0;f[za>>2]=xa;u=e;return}oa=Yn(v|0,V|0,29)|0;Z=oa&7;oa=Ik(qa|0,pa|0,Z|0,0)|0;a=Ik(sa|0,ra|0,Z|0,0)|0;i=Ik(ua|0,ta|0,Z|0,0)|0;va=oa;wa=a;xa=i;f[d>>2]=va;ya=d+4|0;f[ya>>2]=wa;za=d+8|0;f[za>>2]=xa;u=e;return}else{if(!((V|0)>0|(V|0)==0&v>>>0>536870912)){va=qa;wa=sa;xa=ua;f[d>>2]=va;ya=d+4|0;f[ya>>2]=wa;za=d+8|0;f[za>>2]=xa;u=e;return}i=Yn(v|0,V|0,29)|0;V=I;v=Ik(qa|0,pa|0,i|0,V|0)|0;pa=Ik(sa|0,ra|0,i|0,V|0)|0;ra=Ik(ua|0,ta|0,i|0,V|0)|0;va=v;wa=pa;xa=ra;f[d>>2]=va;ya=d+4|0;f[ya>>2]=wa;za=d+8|0;f[za>>2]=xa;u=e;return}}function ac(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,i=0,j=0,k=0,l=0,m=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=Oa,M=Oa,N=Oa,O=0,P=0,Q=0,R=0;e=u;u=u+64|0;g=e+40|0;i=e+16|0;j=e;k=Id(a,c)|0;if(k|0){f[i>>2]=k;f[g>>2]=f[i>>2];lf(a,g)|0}f[j>>2]=0;k=j+4|0;f[k>>2]=0;f[j+8>>2]=0;l=d+11|0;m=b[l>>0]|0;o=d+4|0;p=f[o>>2]|0;q=m<<24>>24<0?p:m&255;if(!q){r=m;s=p;t=0}else{Fi(j,q);r=b[l>>0]|0;s=f[o>>2]|0;t=f[j>>2]|0}o=r<<24>>24<0;kh(t|0,(o?f[d>>2]|0:d)|0,(o?s:r&255)|0)|0;pj(i,c);c=i+12|0;f[c>>2]=0;r=i+16|0;f[r>>2]=0;f[i+20>>2]=0;s=f[k>>2]|0;o=f[j>>2]|0;d=s-o|0;if(!d){v=o;w=s;x=0}else{Fi(c,d);v=f[j>>2]|0;w=f[k>>2]|0;x=f[c>>2]|0}kh(x|0,v|0,w-v|0)|0;v=i+11|0;w=b[v>>0]|0;x=w<<24>>24<0;c=x?f[i>>2]|0:i;d=x?f[i+4>>2]|0:w&255;if(d>>>0>3){w=c;x=d;s=d;while(1){o=X(h[w>>0]|h[w+1>>0]<<8|h[w+2>>0]<<16|h[w+3>>0]<<24,1540483477)|0;x=(X(o>>>24^o,1540483477)|0)^(X(x,1540483477)|0);s=s+-4|0;if(s>>>0<=3)break;else w=w+4|0}w=d+-4|0;s=w&-4;y=w-s|0;z=c+(s+4)|0;A=x}else{y=d;z=c;A=d}switch(y|0){case 3:{B=h[z+2>>0]<<16^A;C=12;break}case 2:{B=A;C=12;break}case 1:{D=A;C=13;break}default:E=A}if((C|0)==12){D=h[z+1>>0]<<8^B;C=13}if((C|0)==13)E=X(D^h[z>>0],1540483477)|0;z=X(E>>>13^E,1540483477)|0;E=z>>>15^z;z=a+4|0;D=f[z>>2]|0;B=(D|0)==0;a:do if(!B){A=D+-1|0;y=(A&D|0)==0;if(!y)if(E>>>0<D>>>0)F=E;else F=(E>>>0)%(D>>>0)|0;else F=E&A;x=f[(f[a>>2]|0)+(F<<2)>>2]|0;if((x|0)!=0?(s=f[x>>2]|0,(s|0)!=0):0){x=(d|0)==0;if(y){if(x){y=s;while(1){w=f[y+4>>2]|0;if(!((w|0)==(E|0)|(w&A|0)==(F|0))){G=F;C=54;break a}w=b[y+8+11>>0]|0;if(!((w<<24>>24<0?f[y+12>>2]|0:w&255)|0))break a;y=f[y>>2]|0;if(!y){G=F;C=54;break a}}}else H=s;while(1){y=f[H+4>>2]|0;if(!((y|0)==(E|0)|(y&A|0)==(F|0))){G=F;C=54;break a}y=H+8|0;w=b[y+11>>0]|0;o=w<<24>>24<0;t=w&255;do if(((o?f[H+12>>2]|0:t)|0)==(d|0)){w=f[y>>2]|0;if(o)if(!(Vk(w,c,d)|0))break a;else break;if((b[c>>0]|0)==(w&255)<<24>>24){w=y;l=t;q=c;do{l=l+-1|0;w=w+1|0;if(!l)break a;q=q+1|0}while((b[w>>0]|0)==(b[q>>0]|0))}}while(0);H=f[H>>2]|0;if(!H){G=F;C=54;break a}}}if(x){A=s;while(1){t=f[A+4>>2]|0;if((t|0)!=(E|0)){if(t>>>0<D>>>0)I=t;else I=(t>>>0)%(D>>>0)|0;if((I|0)!=(F|0)){G=F;C=54;break a}}t=b[A+8+11>>0]|0;if(!((t<<24>>24<0?f[A+12>>2]|0:t&255)|0))break a;A=f[A>>2]|0;if(!A){G=F;C=54;break a}}}else J=s;while(1){A=f[J+4>>2]|0;if((A|0)!=(E|0)){if(A>>>0<D>>>0)K=A;else K=(A>>>0)%(D>>>0)|0;if((K|0)!=(F|0)){G=F;C=54;break a}}A=J+8|0;x=b[A+11>>0]|0;t=x<<24>>24<0;y=x&255;do if(((t?f[J+12>>2]|0:y)|0)==(d|0)){x=f[A>>2]|0;if(t)if(!(Vk(x,c,d)|0))break a;else break;if((b[c>>0]|0)==(x&255)<<24>>24){x=A;o=y;q=c;do{o=o+-1|0;x=x+1|0;if(!o)break a;q=q+1|0}while((b[x>>0]|0)==(b[q>>0]|0))}}while(0);J=f[J>>2]|0;if(!J){G=F;C=54;break}}}else{G=F;C=54}}else{G=0;C=54}while(0);if((C|0)==54){oi(g,a,E,i);C=a+12|0;L=$(((f[C>>2]|0)+1|0)>>>0);M=$(D>>>0);N=$(n[a+16>>2]);do if(B|$(N*M)<L){F=D<<1|(D>>>0<3|(D+-1&D|0)!=0)&1;J=~~$(W($(L/N)))>>>0;ei(a,F>>>0<J>>>0?J:F);F=f[z>>2]|0;J=F+-1|0;if(!(J&F)){O=F;P=J&E;break}if(E>>>0<F>>>0){O=F;P=E}else{O=F;P=(E>>>0)%(F>>>0)|0}}else{O=D;P=G}while(0);G=f[(f[a>>2]|0)+(P<<2)>>2]|0;if(!G){D=a+8|0;f[f[g>>2]>>2]=f[D>>2];f[D>>2]=f[g>>2];f[(f[a>>2]|0)+(P<<2)>>2]=D;D=f[g>>2]|0;P=f[D>>2]|0;if(!P)Q=g;else{E=f[P+4>>2]|0;P=O+-1|0;if(P&O)if(E>>>0<O>>>0)R=E;else R=(E>>>0)%(O>>>0)|0;else R=E&P;f[(f[a>>2]|0)+(R<<2)>>2]=D;Q=g}}else{f[f[g>>2]>>2]=f[G>>2];f[G>>2]=f[g>>2];Q=g}f[C>>2]=(f[C>>2]|0)+1;f[Q>>2]=0}Q=f[i+12>>2]|0;if(Q|0){if((f[r>>2]|0)!=(Q|0))f[r>>2]=Q;Oq(Q)}if((b[v>>0]|0)<0)Oq(f[i>>2]|0);i=f[j>>2]|0;if(!i){u=e;return}if((f[k>>2]|0)!=(i|0))f[k>>2]=i;Oq(i);u=e;return}function bc(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0;d=u;u=u+192|0;e=d+152|0;g=d+144|0;h=d+72|0;i=d;j=d+112|0;k=d+108|0;l=d+104|0;m=a+352|0;if(b[m>>0]|0?(n=Qa[f[(f[a>>2]|0)+40>>2]&127](a)|0,((f[n+12>>2]|0)-(f[n+8>>2]|0)|0)>0):0){n=(Qa[f[(f[a>>2]|0)+40>>2]&127](a)|0)+8|0;o=f[f[n>>2]>>2]|0;f[e>>2]=c;n=o+4|0;p=o+8|0;q=f[p>>2]|0;if((q|0)==(f[o+12>>2]|0))Ri(n,e);else{f[q>>2]=c;f[p>>2]=q+4}q=f[e>>2]|0;r=o+16|0;s=o+20|0;o=f[s>>2]|0;t=f[r>>2]|0;v=o-t>>2;w=t;if((q|0)<(v|0)){x=w;y=q}else{t=q+1|0;f[g>>2]=-1;z=o;if(t>>>0<=v>>>0)if(t>>>0<v>>>0?(o=w+(t<<2)|0,(o|0)!=(z|0)):0){f[s>>2]=z+(~((z+-4-o|0)>>>2)<<2);A=q;B=w}else{A=q;B=w}else{Ch(r,t-v|0,g);A=f[e>>2]|0;B=f[r>>2]|0}x=B;y=A}f[x+(y<<2)>>2]=((f[p>>2]|0)-(f[n>>2]|0)>>2)+-1;C=1;u=d;return C|0}n=(Qa[f[(f[a>>2]|0)+40>>2]&127](a)|0)+52|0;p=f[(f[(f[n>>2]|0)+84>>2]|0)+(c<<2)>>2]|0;n=(Qa[f[(f[a>>2]|0)+40>>2]&127](a)|0)+4|0;y=f[(f[(f[n>>2]|0)+8>>2]|0)+(c<<2)>>2]|0;f[g>>2]=-1;n=a+172|0;x=f[a+176>>2]|0;A=f[n>>2]|0;B=A;a:do if((x|0)==(A|0))D=-1;else{r=(x-A|0)/136|0;v=0;while(1){if((f[B+(v*136|0)>>2]|0)==(c|0))break;t=v+1|0;if(t>>>0<r>>>0)v=t;else{D=-1;break a}}f[g>>2]=v;D=v}while(0);b:do if(!(b[m>>0]|0)){A=(f[y+56>>2]|0)==0;do if(!((p|0)==0|A)){if((p|0)==1?b[B+(D*136|0)+28>>0]|0:0)break;x=ln(88)|0;r=f[a+8>>2]|0;t=B+(D*136|0)+104|0;f[x+4>>2]=0;f[x>>2]=3564;w=x+12|0;f[w>>2]=3588;q=x+64|0;f[q>>2]=0;f[x+68>>2]=0;f[x+72>>2]=0;o=x+16|0;z=o+44|0;do{f[o>>2]=0;o=o+4|0}while((o|0)<(z|0));f[x+76>>2]=r;f[x+80>>2]=t;s=x+84|0;f[s>>2]=0;f[h>>2]=3588;E=h+4|0;F=E+4|0;f[F>>2]=0;f[F+4>>2]=0;f[F+8>>2]=0;f[F+12>>2]=0;f[F+16>>2]=0;f[F+20>>2]=0;F=B+(D*136|0)+4|0;G=i+4|0;f[G>>2]=3588;H=i+56|0;f[H>>2]=0;I=i+60|0;f[I>>2]=0;f[i+64>>2]=0;o=i+8|0;z=o+44|0;do{f[o>>2]=0;o=o+4|0}while((o|0)<(z|0));f[E>>2]=F;o=f[B+(D*136|0)+68>>2]|0;z=((f[o+4>>2]|0)-(f[o>>2]|0)>>2>>>0)/3|0;b[e>>0]=0;qh(h+8|0,z,e);Va[f[(f[h>>2]|0)+8>>2]&127](h);Df(j,h);Df(e,j);f[i>>2]=f[e+4>>2];z=i+4|0;fg(z,e)|0;f[e>>2]=3588;o=f[e+20>>2]|0;if(o|0)Oq(o);o=f[e+8>>2]|0;if(o|0)Oq(o);f[i+36>>2]=F;f[i+40>>2]=t;f[i+44>>2]=r;f[i+48>>2]=x;f[j>>2]=3588;o=f[j+20>>2]|0;if(o|0)Oq(o);o=f[j+8>>2]|0;if(o|0)Oq(o);f[s>>2]=a+72;f[x+8>>2]=f[i>>2];fg(w,z)|0;z=x+44|0;o=i+36|0;f[z>>2]=f[o>>2];f[z+4>>2]=f[o+4>>2];f[z+8>>2]=f[o+8>>2];f[z+12>>2]=f[o+12>>2];b[z+16>>0]=b[o+16>>0]|0;ng(q,f[H>>2]|0,f[I>>2]|0);o=x;z=f[H>>2]|0;if(z|0){J=f[I>>2]|0;if((J|0)!=(z|0))f[I>>2]=J+(~((J+-4-z|0)>>>2)<<2);Oq(z)}f[G>>2]=3588;z=f[i+24>>2]|0;if(z|0)Oq(z);z=f[i+12>>2]|0;if(z|0)Oq(z);f[h>>2]=3588;z=f[h+20>>2]|0;if(z|0)Oq(z);z=f[h+8>>2]|0;if(z|0)Oq(z);K=0;L=o;M=54;break b}while(0);if(!A){b[B+(D*136|0)+100>>0]=0;N=B+(D*136|0)+104|0;M=26}else M=24}else M=24;while(0);if((M|0)==24){N=a+40|0;M=26}if((M|0)==26){D=(Qa[f[(f[a>>2]|0)+40>>2]&127](a)|0)+48|0;do if((mi(f[D>>2]|0)|0)==0?(f[y+56>>2]|0)==0:0){if(b[m>>0]|0?(B=f[a+8>>2]|0,((f[B+12>>2]|0)-(f[B+8>>2]|0)|0)>4):0){M=31;break}gf(e,a,N);O=1;P=f[e>>2]|0}else M=31;while(0);if((M|0)==31){Vd(e,a,N);O=0;P=f[e>>2]|0}if(!P)Q=0;else{K=O;L=P;M=54}}if((M|0)==54){M=f[g>>2]|0;if((M|0)==-1)R=a+68|0;else R=(f[n>>2]|0)+(M*136|0)+132|0;f[R>>2]=K;K=ln(76)|0;f[k>>2]=L;rl(K,k,c);c=K;K=f[k>>2]|0;f[k>>2]=0;if(K|0)Va[f[(f[K>>2]|0)+4>>2]&127](K);K=a+188|0;k=f[K>>2]|0;if((k|0)==(f[a+192>>2]|0))Ri(a+184|0,g);else{f[k>>2]=f[g>>2];f[K>>2]=k+4}k=Qa[f[(f[a>>2]|0)+40>>2]&127](a)|0;f[l>>2]=c;a=k+12|0;K=f[a>>2]|0;if(K>>>0<(f[k+16>>2]|0)>>>0){f[l>>2]=0;f[K>>2]=c;f[a>>2]=K+4;S=l}else{Qg(k+8|0,l);S=l}l=f[S>>2]|0;f[S>>2]=0;if(!l)Q=1;else{Va[f[(f[l>>2]|0)+4>>2]&127](l);Q=1}}C=Q;u=d;return C|0}function cc(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0;d=u;u=u+192|0;e=d+152|0;g=d+144|0;h=d+72|0;i=d;j=d+112|0;k=d+108|0;l=d+104|0;m=a+288|0;if(b[m>>0]|0?(n=Qa[f[(f[a>>2]|0)+40>>2]&127](a)|0,((f[n+12>>2]|0)-(f[n+8>>2]|0)|0)>0):0){n=(Qa[f[(f[a>>2]|0)+40>>2]&127](a)|0)+8|0;o=f[f[n>>2]>>2]|0;f[e>>2]=c;n=o+4|0;p=o+8|0;q=f[p>>2]|0;if((q|0)==(f[o+12>>2]|0))Ri(n,e);else{f[q>>2]=c;f[p>>2]=q+4}q=f[e>>2]|0;r=o+16|0;s=o+20|0;o=f[s>>2]|0;t=f[r>>2]|0;v=o-t>>2;w=t;if((q|0)<(v|0)){x=w;y=q}else{t=q+1|0;f[g>>2]=-1;z=o;if(t>>>0<=v>>>0)if(t>>>0<v>>>0?(o=w+(t<<2)|0,(o|0)!=(z|0)):0){f[s>>2]=z+(~((z+-4-o|0)>>>2)<<2);A=q;B=w}else{A=q;B=w}else{Ch(r,t-v|0,g);A=f[e>>2]|0;B=f[r>>2]|0}x=B;y=A}f[x+(y<<2)>>2]=((f[p>>2]|0)-(f[n>>2]|0)>>2)+-1;C=1;u=d;return C|0}n=(Qa[f[(f[a>>2]|0)+40>>2]&127](a)|0)+52|0;p=f[(f[(f[n>>2]|0)+84>>2]|0)+(c<<2)>>2]|0;n=(Qa[f[(f[a>>2]|0)+40>>2]&127](a)|0)+4|0;y=f[(f[(f[n>>2]|0)+8>>2]|0)+(c<<2)>>2]|0;f[g>>2]=-1;n=a+172|0;x=f[a+176>>2]|0;A=f[n>>2]|0;B=A;a:do if((x|0)==(A|0))D=-1;else{r=(x-A|0)/136|0;v=0;while(1){if((f[B+(v*136|0)>>2]|0)==(c|0))break;t=v+1|0;if(t>>>0<r>>>0)v=t;else{D=-1;break a}}f[g>>2]=v;D=v}while(0);b:do if(!(b[m>>0]|0)){A=(f[y+56>>2]|0)==0;do if(!((p|0)==0|A)){if((p|0)==1?b[B+(D*136|0)+28>>0]|0:0)break;x=ln(88)|0;r=f[a+8>>2]|0;t=B+(D*136|0)+104|0;f[x+4>>2]=0;f[x>>2]=3564;w=x+12|0;f[w>>2]=3588;q=x+64|0;f[q>>2]=0;f[x+68>>2]=0;f[x+72>>2]=0;o=x+16|0;z=o+44|0;do{f[o>>2]=0;o=o+4|0}while((o|0)<(z|0));f[x+76>>2]=r;f[x+80>>2]=t;s=x+84|0;f[s>>2]=0;f[h>>2]=3588;E=h+4|0;F=E+4|0;f[F>>2]=0;f[F+4>>2]=0;f[F+8>>2]=0;f[F+12>>2]=0;f[F+16>>2]=0;f[F+20>>2]=0;F=B+(D*136|0)+4|0;G=i+4|0;f[G>>2]=3588;H=i+56|0;f[H>>2]=0;I=i+60|0;f[I>>2]=0;f[i+64>>2]=0;o=i+8|0;z=o+44|0;do{f[o>>2]=0;o=o+4|0}while((o|0)<(z|0));f[E>>2]=F;o=f[B+(D*136|0)+68>>2]|0;z=((f[o+4>>2]|0)-(f[o>>2]|0)>>2>>>0)/3|0;b[e>>0]=0;qh(h+8|0,z,e);Va[f[(f[h>>2]|0)+8>>2]&127](h);Df(j,h);Df(e,j);f[i>>2]=f[e+4>>2];z=i+4|0;fg(z,e)|0;f[e>>2]=3588;o=f[e+20>>2]|0;if(o|0)Oq(o);o=f[e+8>>2]|0;if(o|0)Oq(o);f[i+36>>2]=F;f[i+40>>2]=t;f[i+44>>2]=r;f[i+48>>2]=x;f[j>>2]=3588;o=f[j+20>>2]|0;if(o|0)Oq(o);o=f[j+8>>2]|0;if(o|0)Oq(o);f[s>>2]=a+72;f[x+8>>2]=f[i>>2];fg(w,z)|0;z=x+44|0;o=i+36|0;f[z>>2]=f[o>>2];f[z+4>>2]=f[o+4>>2];f[z+8>>2]=f[o+8>>2];f[z+12>>2]=f[o+12>>2];b[z+16>>0]=b[o+16>>0]|0;ng(q,f[H>>2]|0,f[I>>2]|0);o=x;z=f[H>>2]|0;if(z|0){J=f[I>>2]|0;if((J|0)!=(z|0))f[I>>2]=J+(~((J+-4-z|0)>>>2)<<2);Oq(z)}f[G>>2]=3588;z=f[i+24>>2]|0;if(z|0)Oq(z);z=f[i+12>>2]|0;if(z|0)Oq(z);f[h>>2]=3588;z=f[h+20>>2]|0;if(z|0)Oq(z);z=f[h+8>>2]|0;if(z|0)Oq(z);K=0;L=o;M=54;break b}while(0);if(!A){b[B+(D*136|0)+100>>0]=0;N=B+(D*136|0)+104|0;M=26}else M=24}else M=24;while(0);if((M|0)==24){N=a+40|0;M=26}if((M|0)==26){D=(Qa[f[(f[a>>2]|0)+40>>2]&127](a)|0)+48|0;do if((mi(f[D>>2]|0)|0)==0?(f[y+56>>2]|0)==0:0){if(b[m>>0]|0?(B=f[a+8>>2]|0,((f[B+12>>2]|0)-(f[B+8>>2]|0)|0)>4):0){M=31;break}gf(e,a,N);O=1;P=f[e>>2]|0}else M=31;while(0);if((M|0)==31){Vd(e,a,N);O=0;P=f[e>>2]|0}if(!P)Q=0;else{K=O;L=P;M=54}}if((M|0)==54){M=f[g>>2]|0;if((M|0)==-1)R=a+68|0;else R=(f[n>>2]|0)+(M*136|0)+132|0;f[R>>2]=K;K=ln(76)|0;f[k>>2]=L;rl(K,k,c);c=K;K=f[k>>2]|0;f[k>>2]=0;if(K|0)Va[f[(f[K>>2]|0)+4>>2]&127](K);K=a+188|0;k=f[K>>2]|0;if((k|0)==(f[a+192>>2]|0))Ri(a+184|0,g);else{f[k>>2]=f[g>>2];f[K>>2]=k+4}k=Qa[f[(f[a>>2]|0)+40>>2]&127](a)|0;f[l>>2]=c;a=k+12|0;K=f[a>>2]|0;if(K>>>0<(f[k+16>>2]|0)>>>0){f[l>>2]=0;f[K>>2]=c;f[a>>2]=K+4;S=l}else{Qg(k+8|0,l);S=l}l=f[S>>2]|0;f[S>>2]=0;if(!l)Q=1;else{Va[f[(f[l>>2]|0)+4>>2]&127](l);Q=1}}C=Q;u=d;return C|0}function dc(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0;c=u;u=u+16|0;d=c+8|0;e=c;g=f[b>>2]|0;if((g|0)==-1){u=c;return}h=(g>>>0)/3|0;i=a+12|0;if(f[(f[i>>2]|0)+(h>>>5<<2)>>2]&1<<(h&31)|0){u=c;return}h=a+56|0;j=f[h>>2]|0;k=a+60|0;l=f[k>>2]|0;if((l|0)==(j|0))m=j;else{n=l+(~((l+-4-j|0)>>>2)<<2)|0;f[k>>2]=n;m=n}n=a+64|0;if((m|0)==(f[n>>2]|0))Ri(h,b);else{f[m>>2]=g;f[k>>2]=m+4}m=f[a>>2]|0;g=f[b>>2]|0;j=g+1|0;if((g|0)!=-1){l=((j>>>0)%3|0|0)==0?g+-2|0:j;if((l|0)==-1)o=-1;else o=f[(f[m>>2]|0)+(l<<2)>>2]|0;l=(((g>>>0)%3|0|0)==0?2:-1)+g|0;if((l|0)==-1){p=o;q=-1}else{p=o;q=f[(f[m>>2]|0)+(l<<2)>>2]|0}}else{p=-1;q=-1}l=a+24|0;m=f[l>>2]|0;o=m+(p>>>5<<2)|0;g=1<<(p&31);j=f[o>>2]|0;if(!(j&g)){f[o>>2]=j|g;g=f[b>>2]|0;j=g+1|0;if((g|0)==-1)r=-1;else r=((j>>>0)%3|0|0)==0?g+-2|0:j;f[e>>2]=r;j=f[(f[(f[a+44>>2]|0)+96>>2]|0)+(((r>>>0)/3|0)*12|0)+(((r>>>0)%3|0)<<2)>>2]|0;r=f[a+48>>2]|0;f[d>>2]=j;g=f[r+4>>2]|0;r=g+4|0;o=f[r>>2]|0;if((o|0)==(f[g+8>>2]|0))Ri(g,d);else{f[o>>2]=j;f[r>>2]=o+4}o=a+40|0;r=f[o>>2]|0;j=r+4|0;g=f[j>>2]|0;if((g|0)==(f[r+8>>2]|0)){Ri(r,e);s=f[o>>2]|0}else{f[g>>2]=f[e>>2];f[j>>2]=g+4;s=r}r=s+24|0;f[(f[s+12>>2]|0)+(p<<2)>>2]=f[r>>2];f[r>>2]=(f[r>>2]|0)+1;t=f[l>>2]|0}else t=m;m=t+(q>>>5<<2)|0;t=1<<(q&31);r=f[m>>2]|0;if(!(r&t)){f[m>>2]=r|t;t=f[b>>2]|0;do if((t|0)!=-1)if(!((t>>>0)%3|0)){v=t+2|0;break}else{v=t+-1|0;break}else v=-1;while(0);f[e>>2]=v;t=f[(f[(f[a+44>>2]|0)+96>>2]|0)+(((v>>>0)/3|0)*12|0)+(((v>>>0)%3|0)<<2)>>2]|0;v=f[a+48>>2]|0;f[d>>2]=t;r=f[v+4>>2]|0;v=r+4|0;m=f[v>>2]|0;if((m|0)==(f[r+8>>2]|0))Ri(r,d);else{f[m>>2]=t;f[v>>2]=m+4}m=a+40|0;v=f[m>>2]|0;t=v+4|0;r=f[t>>2]|0;if((r|0)==(f[v+8>>2]|0)){Ri(v,e);w=f[m>>2]|0}else{f[r>>2]=f[e>>2];f[t>>2]=r+4;w=v}v=w+24|0;f[(f[w+12>>2]|0)+(q<<2)>>2]=f[v>>2];f[v>>2]=(f[v>>2]|0)+1}v=f[h>>2]|0;q=f[k>>2]|0;if((v|0)==(q|0)){u=c;return}w=a+44|0;r=a+48|0;t=a+40|0;m=q;q=v;while(1){v=f[m+-4>>2]|0;f[b>>2]=v;p=(v>>>0)/3|0;if((v|0)!=-1?(v=f[i>>2]|0,(f[v+(p>>>5<<2)>>2]&1<<(p&31)|0)==0):0){s=p;p=v;a:while(1){v=p+(s>>>5<<2)|0;f[v>>2]=f[v>>2]|1<<(s&31);v=f[b>>2]|0;if((v|0)==-1)x=-1;else x=f[(f[f[a>>2]>>2]|0)+(v<<2)>>2]|0;g=(f[l>>2]|0)+(x>>>5<<2)|0;j=1<<(x&31);o=f[g>>2]|0;do if(!(j&o)){y=f[a>>2]|0;z=f[(f[y+24>>2]|0)+(x<<2)>>2]|0;A=z+1|0;if(((z|0)!=-1?(B=((A>>>0)%3|0|0)==0?z+-2|0:A,(B|0)!=-1):0)?(A=f[(f[y+12>>2]|0)+(B<<2)>>2]|0,B=A+1|0,(A|0)!=-1):0)C=((((B>>>0)%3|0|0)==0?A+-2|0:B)|0)==-1;else C=1;f[g>>2]=o|j;B=f[b>>2]|0;f[e>>2]=B;A=f[(f[(f[w>>2]|0)+96>>2]|0)+(((B>>>0)/3|0)*12|0)+(((B>>>0)%3|0)<<2)>>2]|0;B=f[r>>2]|0;f[d>>2]=A;y=f[B+4>>2]|0;B=y+4|0;z=f[B>>2]|0;if((z|0)==(f[y+8>>2]|0))Ri(y,d);else{f[z>>2]=A;f[B>>2]=z+4}z=f[t>>2]|0;B=z+4|0;A=f[B>>2]|0;if((A|0)==(f[z+8>>2]|0)){Ri(z,e);D=f[t>>2]|0}else{f[A>>2]=f[e>>2];f[B>>2]=A+4;D=z}z=D+24|0;f[(f[D+12>>2]|0)+(x<<2)>>2]=f[z>>2];f[z>>2]=(f[z>>2]|0)+1;if(C){E=f[b>>2]|0;F=60;break}z=f[a>>2]|0;A=f[b>>2]|0;do if((A|0)==-1)G=-1;else{B=A+1|0;y=((B>>>0)%3|0|0)==0?A+-2|0:B;if((y|0)==-1){G=-1;break}G=f[(f[z+12>>2]|0)+(y<<2)>>2]|0}while(0);f[b>>2]=G;H=(G>>>0)/3|0}else{E=v;F=60}while(0);if((F|0)==60){F=0;v=f[a>>2]|0;if((E|0)==-1){F=61;break}j=E+1|0;o=((j>>>0)%3|0|0)==0?E+-2|0:j;if((o|0)==-1)I=-1;else I=f[(f[v+12>>2]|0)+(o<<2)>>2]|0;f[d>>2]=I;o=(((E>>>0)%3|0|0)==0?2:-1)+E|0;if((o|0)==-1)J=-1;else J=f[(f[v+12>>2]|0)+(o<<2)>>2]|0;o=(I|0)==-1;v=(I>>>0)/3|0;j=o?-1:v;g=(J|0)==-1;z=(J>>>0)/3|0;A=g?-1:z;do if(!o){y=f[i>>2]|0;if(f[y+(j>>>5<<2)>>2]&1<<(j&31)|0){F=68;break}if(g){K=I;L=v;break}if(!(f[y+(A>>>5<<2)>>2]&1<<(A&31))){F=73;break a}else{K=I;L=v}}else F=68;while(0);if((F|0)==68){F=0;if(g){F=70;break}if(!(f[(f[i>>2]|0)+(A>>>5<<2)>>2]&1<<(A&31))){K=J;L=z}else{F=70;break}}f[b>>2]=K;H=L}s=H;p=f[i>>2]|0}do if((F|0)==61){F=0;f[d>>2]=-1;F=70}else if((F|0)==73){F=0;p=f[k>>2]|0;f[p+-4>>2]=J;if((p|0)==(f[n>>2]|0)){Ri(h,d);M=f[k>>2]|0;break}else{f[p>>2]=f[d>>2];s=p+4|0;f[k>>2]=s;M=s;break}}while(0);if((F|0)==70){F=0;s=(f[k>>2]|0)+-4|0;f[k>>2]=s;M=s}N=f[h>>2]|0;O=M}else{s=m+-4|0;f[k>>2]=s;N=q;O=s}if((N|0)==(O|0))break;else{m=O;q=N}}u=c;return}function ec(a,c,e){a=a|0;c=c|0;e=e|0;var g=0,i=0,j=0,k=0,l=0,m=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,X=0,Y=0,Z=0,_=0,aa=0,ba=0,ca=0,da=0,ea=Oa,fa=Oa,ga=Oa,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0;g=u;u=u+48|0;i=g+12|0;j=g+32|0;k=g;l=i+16|0;f[i>>2]=0;f[i+4>>2]=0;f[i+8>>2]=0;f[i+12>>2]=0;n[l>>2]=$(1.0);m=a+80|0;o=f[m>>2]|0;f[k>>2]=0;p=k+4|0;f[p>>2]=0;f[k+8>>2]=0;if(o){if(o>>>0>1073741823)aq(k);q=o<<2;r=ln(q)|0;f[k>>2]=r;s=r+(o<<2)|0;f[k+8>>2]=s;sj(r|0,0,q|0)|0;f[p>>2]=s;s=c+48|0;q=c+40|0;o=i+4|0;t=i+12|0;v=i+8|0;w=a+40|0;x=a+64|0;y=f[e>>2]|0;e=0;z=r;A=0;B=0;C=r;D=r;E=r;while(1){r=s;F=f[r>>2]|0;G=f[r+4>>2]|0;r=q;H=un(f[r>>2]|0,f[r+4>>2]|0,y+A|0,0)|0;r=Vn(H|0,I|0,F|0,G|0)|0;G=(f[f[c>>2]>>2]|0)+r|0;r=h[G>>0]|h[G+1>>0]<<8;d[j>>1]=r;G=(r^318)&65535;a:do if(e){F=e+-1|0;H=(F&e|0)==0;if(!H)if(e>>>0>G>>>0)J=G;else J=(G>>>0)%(e>>>0)|0;else J=F&G;K=f[i>>2]|0;L=f[K+(J<<2)>>2]|0;b:do if(L|0?(M=f[L>>2]|0,M|0):0){c:do if(H){N=M;while(1){O=f[N+4>>2]|0;P=(O|0)==(G|0);if(!(P|(O&F|0)==(J|0)))break b;if(P?(d[N+8>>1]|0)==r<<16>>16:0){Q=N;break c}N=f[N>>2]|0;if(!N)break b}}else{N=M;while(1){P=f[N+4>>2]|0;if((P|0)==(G|0)){if((d[N+8>>1]|0)==r<<16>>16){Q=N;break c}}else{if(P>>>0<e>>>0)R=P;else R=(P>>>0)%(e>>>0)|0;if((R|0)!=(J|0))break b}N=f[N>>2]|0;if(!N)break b}}while(0);f[E+(A<<2)>>2]=f[Q+12>>2];S=z;T=B;U=D;V=C;X=E;break a}while(0);if(!H)if(e>>>0>G>>>0)Y=G;else Y=(G>>>0)%(e>>>0)|0;else Y=F&G;L=f[K+(Y<<2)>>2]|0;if(!L){Z=Y;_=e;aa=0;ba=40}else{if(H){M=L;while(1){M=f[M>>2]|0;if(!M){Z=Y;_=e;aa=0;ba=40;break a}N=f[M+4>>2]|0;if(!((N|0)==(G|0)|(N&F|0)==(Y|0))){Z=Y;_=e;aa=0;ba=40;break a}if((d[M+8>>1]|0)==r<<16>>16){ba=55;break a}}}else ca=L;while(1){ca=f[ca>>2]|0;if(!ca){Z=Y;_=e;aa=0;ba=40;break a}M=f[ca+4>>2]|0;if((M|0)!=(G|0)){if(M>>>0<e>>>0)da=M;else da=(M>>>0)%(e>>>0)|0;if((da|0)!=(Y|0)){Z=Y;_=e;aa=0;ba=40;break a}}if((d[ca+8>>1]|0)==r<<16>>16){ba=55;break}}}}else{Z=0;_=0;aa=1;ba=40}while(0);if((ba|0)==40){ba=0;L=ln(16)|0;d[L+8>>1]=r;f[L+12>>2]=B;f[L+4>>2]=G;f[L>>2]=0;ea=$(((f[t>>2]|0)+1|0)>>>0);fa=$(_>>>0);ga=$(n[l>>2]);do if(aa|$(ga*fa)<ea){M=_<<1|(_>>>0<3|(_+-1&_|0)!=0)&1;F=~~$(W($(ea/ga)))>>>0;Vh(i,M>>>0<F>>>0?F:M);M=f[o>>2]|0;F=M+-1|0;if(!(F&M)){ha=M;ia=F&G;break}if(M>>>0>G>>>0){ha=M;ia=G}else{ha=M;ia=(G>>>0)%(M>>>0)|0}}else{ha=_;ia=Z}while(0);G=(f[i>>2]|0)+(ia<<2)|0;r=f[G>>2]|0;if(!r){f[L>>2]=f[v>>2];f[v>>2]=L;f[G>>2]=v;G=f[L>>2]|0;if(G|0){M=f[G+4>>2]|0;G=ha+-1|0;if(G&ha)if(M>>>0<ha>>>0)ja=M;else ja=(M>>>0)%(ha>>>0)|0;else ja=M&G;ka=(f[i>>2]|0)+(ja<<2)|0;ba=53}}else{f[L>>2]=f[r>>2];ka=r;ba=53}if((ba|0)==53){ba=0;f[ka>>2]=L}f[t>>2]=(f[t>>2]|0)+1;ba=55}if((ba|0)==55){ba=0;r=w;G=f[r>>2]|0;M=un(G|0,f[r+4>>2]|0,B|0,0)|0;kh((f[f[x>>2]>>2]|0)+M|0,j|0,G|0)|0;G=f[k>>2]|0;f[G+(A<<2)>>2]=B;S=G;T=B+1|0;U=G;V=G;X=G}G=A+1|0;la=f[m>>2]|0;if(G>>>0>=la>>>0)break;e=f[o>>2]|0;z=S;A=G;B=T;C=V;D=U;E=X}if((T|0)==(la|0))ma=V;else{V=a+84|0;if(!(b[V>>0]|0)){X=f[a+72>>2]|0;E=f[a+68>>2]|0;D=E;if((X|0)==(E|0))na=S;else{C=X-E>>2;E=0;do{X=D+(E<<2)|0;f[X>>2]=f[U+(f[X>>2]<<2)>>2];E=E+1|0}while(E>>>0<C>>>0);na=S}}else{b[V>>0]=0;V=a+68|0;S=a+72|0;C=f[S>>2]|0;E=f[V>>2]|0;U=C-E>>2;D=E;E=C;if(la>>>0<=U>>>0)if(la>>>0<U>>>0?(C=D+(la<<2)|0,(C|0)!=(E|0)):0){f[S>>2]=E+(~((E+-4-C|0)>>>2)<<2);oa=la}else oa=la;else{Ch(V,la-U|0,1220);oa=f[m>>2]|0}U=f[k>>2]|0;if(!oa)na=U;else{k=f[a+68>>2]|0;a=0;do{f[k+(a<<2)>>2]=f[U+(a<<2)>>2];a=a+1|0}while(a>>>0<oa>>>0);na=U}}f[m>>2]=T;ma=na}if(!ma)pa=T;else{na=f[p>>2]|0;if((na|0)!=(ma|0))f[p>>2]=na+(~((na+-4-ma|0)>>>2)<<2);Oq(ma);pa=T}}else pa=0;T=f[i+8>>2]|0;if(T|0){ma=T;do{T=ma;ma=f[ma>>2]|0;Oq(T)}while((ma|0)!=0)}ma=f[i>>2]|0;f[i>>2]=0;if(!ma){u=g;return pa|0}Oq(ma);u=g;return pa|0}function fc(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,i=0,j=0,k=0,l=0,m=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=Oa,K=Oa,L=Oa,M=0,N=0,O=0,P=0;e=u;u=u+64|0;g=e+40|0;i=e+16|0;j=e;k=Id(a,c)|0;if(k|0){f[i>>2]=k;f[g>>2]=f[i>>2];lf(a,g)|0}f[j>>2]=0;k=j+4|0;f[k>>2]=0;f[j+8>>2]=0;Fi(j,4);l=f[j>>2]|0;m=h[d>>0]|h[d+1>>0]<<8|h[d+2>>0]<<16|h[d+3>>0]<<24;b[l>>0]=m;b[l+1>>0]=m>>8;b[l+2>>0]=m>>16;b[l+3>>0]=m>>24;pj(i,c);c=i+12|0;f[c>>2]=0;m=i+16|0;f[m>>2]=0;f[i+20>>2]=0;l=f[k>>2]|0;d=f[j>>2]|0;o=l-d|0;if(!o){p=d;q=l;r=0}else{Fi(c,o);p=f[j>>2]|0;q=f[k>>2]|0;r=f[c>>2]|0}kh(r|0,p|0,q-p|0)|0;p=i+11|0;q=b[p>>0]|0;r=q<<24>>24<0;c=r?f[i>>2]|0:i;o=r?f[i+4>>2]|0:q&255;if(o>>>0>3){q=c;r=o;l=o;while(1){d=X(h[q>>0]|h[q+1>>0]<<8|h[q+2>>0]<<16|h[q+3>>0]<<24,1540483477)|0;r=(X(d>>>24^d,1540483477)|0)^(X(r,1540483477)|0);l=l+-4|0;if(l>>>0<=3)break;else q=q+4|0}q=o+-4|0;l=q&-4;s=q-l|0;t=c+(l+4)|0;v=r}else{s=o;t=c;v=o}switch(s|0){case 3:{w=h[t+2>>0]<<16^v;x=10;break}case 2:{w=v;x=10;break}case 1:{y=v;x=11;break}default:z=v}if((x|0)==10){y=h[t+1>>0]<<8^w;x=11}if((x|0)==11)z=X(y^h[t>>0],1540483477)|0;t=X(z>>>13^z,1540483477)|0;z=t>>>15^t;t=a+4|0;y=f[t>>2]|0;w=(y|0)==0;a:do if(!w){v=y+-1|0;s=(v&y|0)==0;if(!s)if(z>>>0<y>>>0)A=z;else A=(z>>>0)%(y>>>0)|0;else A=z&v;r=f[(f[a>>2]|0)+(A<<2)>>2]|0;if((r|0)!=0?(l=f[r>>2]|0,(l|0)!=0):0){r=(o|0)==0;if(s){if(r){s=l;while(1){q=f[s+4>>2]|0;if(!((q|0)==(z|0)|(q&v|0)==(A|0))){B=A;x=52;break a}q=b[s+8+11>>0]|0;if(!((q<<24>>24<0?f[s+12>>2]|0:q&255)|0))break a;s=f[s>>2]|0;if(!s){B=A;x=52;break a}}}else C=l;while(1){s=f[C+4>>2]|0;if(!((s|0)==(z|0)|(s&v|0)==(A|0))){B=A;x=52;break a}s=C+8|0;q=b[s+11>>0]|0;d=q<<24>>24<0;D=q&255;do if(((d?f[C+12>>2]|0:D)|0)==(o|0)){q=f[s>>2]|0;if(d)if(!(Vk(q,c,o)|0))break a;else break;if((b[c>>0]|0)==(q&255)<<24>>24){q=s;E=D;F=c;do{E=E+-1|0;q=q+1|0;if(!E)break a;F=F+1|0}while((b[q>>0]|0)==(b[F>>0]|0))}}while(0);C=f[C>>2]|0;if(!C){B=A;x=52;break a}}}if(r){v=l;while(1){D=f[v+4>>2]|0;if((D|0)!=(z|0)){if(D>>>0<y>>>0)G=D;else G=(D>>>0)%(y>>>0)|0;if((G|0)!=(A|0)){B=A;x=52;break a}}D=b[v+8+11>>0]|0;if(!((D<<24>>24<0?f[v+12>>2]|0:D&255)|0))break a;v=f[v>>2]|0;if(!v){B=A;x=52;break a}}}else H=l;while(1){v=f[H+4>>2]|0;if((v|0)!=(z|0)){if(v>>>0<y>>>0)I=v;else I=(v>>>0)%(y>>>0)|0;if((I|0)!=(A|0)){B=A;x=52;break a}}v=H+8|0;r=b[v+11>>0]|0;D=r<<24>>24<0;s=r&255;do if(((D?f[H+12>>2]|0:s)|0)==(o|0)){r=f[v>>2]|0;if(D)if(!(Vk(r,c,o)|0))break a;else break;if((b[c>>0]|0)==(r&255)<<24>>24){r=v;d=s;F=c;do{d=d+-1|0;r=r+1|0;if(!d)break a;F=F+1|0}while((b[r>>0]|0)==(b[F>>0]|0))}}while(0);H=f[H>>2]|0;if(!H){B=A;x=52;break}}}else{B=A;x=52}}else{B=0;x=52}while(0);if((x|0)==52){oi(g,a,z,i);x=a+12|0;J=$(((f[x>>2]|0)+1|0)>>>0);K=$(y>>>0);L=$(n[a+16>>2]);do if(w|$(L*K)<J){A=y<<1|(y>>>0<3|(y+-1&y|0)!=0)&1;H=~~$(W($(J/L)))>>>0;ei(a,A>>>0<H>>>0?H:A);A=f[t>>2]|0;H=A+-1|0;if(!(H&A)){M=A;N=H&z;break}if(z>>>0<A>>>0){M=A;N=z}else{M=A;N=(z>>>0)%(A>>>0)|0}}else{M=y;N=B}while(0);B=f[(f[a>>2]|0)+(N<<2)>>2]|0;if(!B){y=a+8|0;f[f[g>>2]>>2]=f[y>>2];f[y>>2]=f[g>>2];f[(f[a>>2]|0)+(N<<2)>>2]=y;y=f[g>>2]|0;N=f[y>>2]|0;if(!N)O=g;else{z=f[N+4>>2]|0;N=M+-1|0;if(N&M)if(z>>>0<M>>>0)P=z;else P=(z>>>0)%(M>>>0)|0;else P=z&N;f[(f[a>>2]|0)+(P<<2)>>2]=y;O=g}}else{f[f[g>>2]>>2]=f[B>>2];f[B>>2]=f[g>>2];O=g}f[x>>2]=(f[x>>2]|0)+1;f[O>>2]=0}O=f[i+12>>2]|0;if(O|0){if((f[m>>2]|0)!=(O|0))f[m>>2]=O;Oq(O)}if((b[p>>0]|0)<0)Oq(f[i>>2]|0);i=f[j>>2]|0;if(!i){u=e;return}if((f[k>>2]|0)!=(i|0))f[k>>2]=i;Oq(i);u=e;return}function gc(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,X=0,Y=0,Z=0,_=0,aa=0,ba=0,ca=Oa,da=Oa,ea=Oa,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0;e=u;u=u+48|0;g=e+12|0;h=e+32|0;i=e;j=g+16|0;f[g>>2]=0;f[g+4>>2]=0;f[g+8>>2]=0;f[g+12>>2]=0;n[j>>2]=$(1.0);k=a+80|0;l=f[k>>2]|0;f[i>>2]=0;m=i+4|0;f[m>>2]=0;f[i+8>>2]=0;if(l){if(l>>>0>1073741823)aq(i);o=l<<2;p=ln(o)|0;f[i>>2]=p;q=p+(l<<2)|0;f[i+8>>2]=q;sj(p|0,0,o|0)|0;f[m>>2]=q;q=c+48|0;o=c+40|0;l=g+4|0;r=g+12|0;s=g+8|0;t=a+40|0;v=a+64|0;w=f[d>>2]|0;d=0;x=p;y=0;z=0;A=p;B=p;C=p;while(1){p=q;D=f[p>>2]|0;E=f[p+4>>2]|0;p=o;F=un(f[p>>2]|0,f[p+4>>2]|0,w+y|0,0)|0;p=Vn(F|0,I|0,D|0,E|0)|0;E=b[(f[f[c>>2]>>2]|0)+p>>0]|0;b[h>>0]=E;p=E&255^318;a:do if(d){D=d+-1|0;F=(D&d|0)==0;if(!F)if(p>>>0<d>>>0)G=p;else G=(p>>>0)%(d>>>0)|0;else G=D&p;H=f[g>>2]|0;J=f[H+(G<<2)>>2]|0;b:do if(J|0?(K=f[J>>2]|0,K|0):0){c:do if(F){L=K;while(1){M=f[L+4>>2]|0;N=(M|0)==(p|0);if(!(N|(M&D|0)==(G|0)))break b;if(N?(b[L+8>>0]|0)==E<<24>>24:0){O=L;break c}L=f[L>>2]|0;if(!L)break b}}else{L=K;while(1){N=f[L+4>>2]|0;if((N|0)==(p|0)){if((b[L+8>>0]|0)==E<<24>>24){O=L;break c}}else{if(N>>>0<d>>>0)P=N;else P=(N>>>0)%(d>>>0)|0;if((P|0)!=(G|0))break b}L=f[L>>2]|0;if(!L)break b}}while(0);f[C+(y<<2)>>2]=f[O+12>>2];Q=x;R=z;S=B;T=A;U=C;break a}while(0);if(!F)if(p>>>0<d>>>0)V=p;else V=(p>>>0)%(d>>>0)|0;else V=D&p;J=f[H+(V<<2)>>2]|0;if(!J){X=V;Y=d;Z=0;_=40}else{if(F){K=J;while(1){K=f[K>>2]|0;if(!K){X=V;Y=d;Z=0;_=40;break a}L=f[K+4>>2]|0;if(!((L|0)==(p|0)|(L&D|0)==(V|0))){X=V;Y=d;Z=0;_=40;break a}if((b[K+8>>0]|0)==E<<24>>24){_=55;break a}}}else aa=J;while(1){aa=f[aa>>2]|0;if(!aa){X=V;Y=d;Z=0;_=40;break a}K=f[aa+4>>2]|0;if((K|0)!=(p|0)){if(K>>>0<d>>>0)ba=K;else ba=(K>>>0)%(d>>>0)|0;if((ba|0)!=(V|0)){X=V;Y=d;Z=0;_=40;break a}}if((b[aa+8>>0]|0)==E<<24>>24){_=55;break}}}}else{X=0;Y=0;Z=1;_=40}while(0);if((_|0)==40){_=0;J=ln(16)|0;b[J+8>>0]=E;f[J+12>>2]=z;f[J+4>>2]=p;f[J>>2]=0;ca=$(((f[r>>2]|0)+1|0)>>>0);da=$(Y>>>0);ea=$(n[j>>2]);do if(Z|$(ea*da)<ca){K=Y<<1|(Y>>>0<3|(Y+-1&Y|0)!=0)&1;D=~~$(W($(ca/ea)))>>>0;ai(g,K>>>0<D>>>0?D:K);K=f[l>>2]|0;D=K+-1|0;if(!(D&K)){fa=K;ga=D&p;break}if(p>>>0<K>>>0){fa=K;ga=p}else{fa=K;ga=(p>>>0)%(K>>>0)|0}}else{fa=Y;ga=X}while(0);p=(f[g>>2]|0)+(ga<<2)|0;E=f[p>>2]|0;if(!E){f[J>>2]=f[s>>2];f[s>>2]=J;f[p>>2]=s;p=f[J>>2]|0;if(p|0){K=f[p+4>>2]|0;p=fa+-1|0;if(p&fa)if(K>>>0<fa>>>0)ha=K;else ha=(K>>>0)%(fa>>>0)|0;else ha=K&p;ia=(f[g>>2]|0)+(ha<<2)|0;_=53}}else{f[J>>2]=f[E>>2];ia=E;_=53}if((_|0)==53){_=0;f[ia>>2]=J}f[r>>2]=(f[r>>2]|0)+1;_=55}if((_|0)==55){_=0;E=t;p=f[E>>2]|0;K=un(p|0,f[E+4>>2]|0,z|0,0)|0;kh((f[f[v>>2]>>2]|0)+K|0,h|0,p|0)|0;p=f[i>>2]|0;f[p+(y<<2)>>2]=z;Q=p;R=z+1|0;S=p;T=p;U=p}p=y+1|0;ja=f[k>>2]|0;if(p>>>0>=ja>>>0)break;d=f[l>>2]|0;x=Q;y=p;z=R;A=T;B=S;C=U}if((R|0)==(ja|0))ka=T;else{T=a+84|0;if(!(b[T>>0]|0)){U=f[a+72>>2]|0;C=f[a+68>>2]|0;B=C;if((U|0)==(C|0))la=Q;else{A=U-C>>2;C=0;do{U=B+(C<<2)|0;f[U>>2]=f[S+(f[U>>2]<<2)>>2];C=C+1|0}while(C>>>0<A>>>0);la=Q}}else{b[T>>0]=0;T=a+68|0;Q=a+72|0;A=f[Q>>2]|0;C=f[T>>2]|0;S=A-C>>2;B=C;C=A;if(ja>>>0<=S>>>0)if(ja>>>0<S>>>0?(A=B+(ja<<2)|0,(A|0)!=(C|0)):0){f[Q>>2]=C+(~((C+-4-A|0)>>>2)<<2);ma=ja}else ma=ja;else{Ch(T,ja-S|0,1220);ma=f[k>>2]|0}S=f[i>>2]|0;if(!ma)la=S;else{i=f[a+68>>2]|0;a=0;do{f[i+(a<<2)>>2]=f[S+(a<<2)>>2];a=a+1|0}while(a>>>0<ma>>>0);la=S}}f[k>>2]=R;ka=la}if(!ka)na=R;else{la=f[m>>2]|0;if((la|0)!=(ka|0))f[m>>2]=la+(~((la+-4-ka|0)>>>2)<<2);Oq(ka);na=R}}else na=0;R=f[g+8>>2]|0;if(R|0){ka=R;do{R=ka;ka=f[ka>>2]|0;Oq(R)}while((ka|0)!=0)}ka=f[g>>2]|0;f[g>>2]=0;if(!ka){u=e;return na|0}Oq(ka);u=e;return na|0}function hc(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,i=0,j=0,k=0,l=0,m=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,X=0,Y=0,Z=0,_=0,aa=0,ba=0,ca=0,da=Oa,ea=Oa,fa=Oa,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0;e=u;u=u+48|0;g=e+16|0;i=e+12|0;j=e;k=g+16|0;f[g>>2]=0;f[g+4>>2]=0;f[g+8>>2]=0;f[g+12>>2]=0;n[k>>2]=$(1.0);l=a+80|0;m=f[l>>2]|0;f[j>>2]=0;o=j+4|0;f[o>>2]=0;f[j+8>>2]=0;if(m){if(m>>>0>1073741823)aq(j);p=m<<2;q=ln(p)|0;f[j>>2]=q;r=q+(m<<2)|0;f[j+8>>2]=r;sj(q|0,0,p|0)|0;f[o>>2]=r;r=c+48|0;p=c+40|0;m=g+4|0;s=g+12|0;t=g+8|0;v=a+40|0;w=a+64|0;x=f[d>>2]|0;d=0;y=q;z=0;A=0;B=q;C=q;D=q;while(1){q=r;E=f[q>>2]|0;F=f[q+4>>2]|0;q=p;G=un(f[q>>2]|0,f[q+4>>2]|0,x+z|0,0)|0;q=Vn(G|0,I|0,E|0,F|0)|0;F=(f[f[c>>2]>>2]|0)+q|0;q=h[F>>0]|h[F+1>>0]<<8|h[F+2>>0]<<16|h[F+3>>0]<<24;f[i>>2]=q;F=q^318;a:do if(d){E=d+-1|0;G=(E&d|0)==0;if(!G)if(F>>>0<d>>>0)H=F;else H=(F>>>0)%(d>>>0)|0;else H=E&F;J=f[g>>2]|0;K=f[J+(H<<2)>>2]|0;b:do if(K|0?(L=f[K>>2]|0,L|0):0){c:do if(G){M=L;while(1){N=f[M+4>>2]|0;O=(N|0)==(F|0);if(!(O|(N&E|0)==(H|0)))break b;if(O?(f[M+8>>2]|0)==(q|0):0){P=M;break c}M=f[M>>2]|0;if(!M)break b}}else{M=L;while(1){O=f[M+4>>2]|0;if((O|0)==(F|0)){if((f[M+8>>2]|0)==(q|0)){P=M;break c}}else{if(O>>>0<d>>>0)Q=O;else Q=(O>>>0)%(d>>>0)|0;if((Q|0)!=(H|0))break b}M=f[M>>2]|0;if(!M)break b}}while(0);f[D+(z<<2)>>2]=f[P+12>>2];R=y;S=A;T=C;U=B;V=D;break a}while(0);if(!G)if(F>>>0<d>>>0)X=F;else X=(F>>>0)%(d>>>0)|0;else X=E&F;K=f[J+(X<<2)>>2]|0;if(!K){Y=X;Z=d;_=0;aa=40}else{if(G){L=K;while(1){L=f[L>>2]|0;if(!L){Y=X;Z=d;_=0;aa=40;break a}M=f[L+4>>2]|0;if(!((M|0)==(F|0)|(M&E|0)==(X|0))){Y=X;Z=d;_=0;aa=40;break a}if((f[L+8>>2]|0)==(q|0)){aa=55;break a}}}else ba=K;while(1){ba=f[ba>>2]|0;if(!ba){Y=X;Z=d;_=0;aa=40;break a}L=f[ba+4>>2]|0;if((L|0)!=(F|0)){if(L>>>0<d>>>0)ca=L;else ca=(L>>>0)%(d>>>0)|0;if((ca|0)!=(X|0)){Y=X;Z=d;_=0;aa=40;break a}}if((f[ba+8>>2]|0)==(q|0)){aa=55;break}}}}else{Y=0;Z=0;_=1;aa=40}while(0);if((aa|0)==40){aa=0;K=ln(16)|0;f[K+8>>2]=q;f[K+12>>2]=A;f[K+4>>2]=F;f[K>>2]=0;da=$(((f[s>>2]|0)+1|0)>>>0);ea=$(Z>>>0);fa=$(n[k>>2]);do if(_|$(fa*ea)<da){L=Z<<1|(Z>>>0<3|(Z+-1&Z|0)!=0)&1;E=~~$(W($(da/fa)))>>>0;Hi(g,L>>>0<E>>>0?E:L);L=f[m>>2]|0;E=L+-1|0;if(!(E&L)){ga=L;ha=E&F;break}if(F>>>0<L>>>0){ga=L;ha=F}else{ga=L;ha=(F>>>0)%(L>>>0)|0}}else{ga=Z;ha=Y}while(0);F=(f[g>>2]|0)+(ha<<2)|0;q=f[F>>2]|0;if(!q){f[K>>2]=f[t>>2];f[t>>2]=K;f[F>>2]=t;F=f[K>>2]|0;if(F|0){L=f[F+4>>2]|0;F=ga+-1|0;if(F&ga)if(L>>>0<ga>>>0)ia=L;else ia=(L>>>0)%(ga>>>0)|0;else ia=L&F;ja=(f[g>>2]|0)+(ia<<2)|0;aa=53}}else{f[K>>2]=f[q>>2];ja=q;aa=53}if((aa|0)==53){aa=0;f[ja>>2]=K}f[s>>2]=(f[s>>2]|0)+1;aa=55}if((aa|0)==55){aa=0;q=v;F=f[q>>2]|0;L=un(F|0,f[q+4>>2]|0,A|0,0)|0;kh((f[f[w>>2]>>2]|0)+L|0,i|0,F|0)|0;F=f[j>>2]|0;f[F+(z<<2)>>2]=A;R=F;S=A+1|0;T=F;U=F;V=F}F=z+1|0;ka=f[l>>2]|0;if(F>>>0>=ka>>>0)break;d=f[m>>2]|0;y=R;z=F;A=S;B=U;C=T;D=V}if((S|0)==(ka|0))la=U;else{U=a+84|0;if(!(b[U>>0]|0)){V=f[a+72>>2]|0;D=f[a+68>>2]|0;C=D;if((V|0)==(D|0))ma=R;else{B=V-D>>2;D=0;do{V=C+(D<<2)|0;f[V>>2]=f[T+(f[V>>2]<<2)>>2];D=D+1|0}while(D>>>0<B>>>0);ma=R}}else{b[U>>0]=0;U=a+68|0;R=a+72|0;B=f[R>>2]|0;D=f[U>>2]|0;T=B-D>>2;C=D;D=B;if(ka>>>0<=T>>>0)if(ka>>>0<T>>>0?(B=C+(ka<<2)|0,(B|0)!=(D|0)):0){f[R>>2]=D+(~((D+-4-B|0)>>>2)<<2);na=ka}else na=ka;else{Ch(U,ka-T|0,1220);na=f[l>>2]|0}T=f[j>>2]|0;if(!na)ma=T;else{j=f[a+68>>2]|0;a=0;do{f[j+(a<<2)>>2]=f[T+(a<<2)>>2];a=a+1|0}while(a>>>0<na>>>0);ma=T}}f[l>>2]=S;la=ma}if(!la)oa=S;else{ma=f[o>>2]|0;if((ma|0)!=(la|0))f[o>>2]=ma+(~((ma+-4-la|0)>>>2)<<2);Oq(la);oa=S}}else oa=0;S=f[g+8>>2]|0;if(S|0){la=S;do{S=la;la=f[la>>2]|0;Oq(S)}while((la|0)!=0)}la=f[g>>2]|0;f[g>>2]=0;if(!la){u=e;return oa|0}Oq(la);u=e;return oa|0}function ic(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0;e=u;u=u+96|0;g=e+92|0;h=e+88|0;i=e+72|0;j=e+48|0;k=e+24|0;l=e;m=a+16|0;n=f[m>>2]|0;o=f[c>>2]|0;f[i>>2]=n;f[i+4>>2]=o;c=i+8|0;f[c>>2]=o;b[i+12>>0]=1;p=f[(f[n+28>>2]|0)+(o<<2)>>2]|0;n=a+20|0;q=f[n>>2]|0;r=f[q>>2]|0;if((f[q+4>>2]|0)-r>>2>>>0<=p>>>0)aq(q);q=a+8|0;s=f[(f[q>>2]|0)+(f[r+(p<<2)>>2]<<2)>>2]|0;p=a+4|0;r=f[p>>2]|0;if(!(b[r+84>>0]|0))t=f[(f[r+68>>2]|0)+(s<<2)>>2]|0;else t=s;f[j>>2]=0;f[j+4>>2]=0;f[j+8>>2]=0;f[j+12>>2]=0;f[j+16>>2]=0;f[j+20>>2]=0;f[h>>2]=t;t=b[r+24>>0]|0;f[g>>2]=f[h>>2];vb(r,g,t,j)|0;t=a+28|0;a=(f[t>>2]|0)==0;a:do if((o|0)!=-1){r=k+8|0;s=j+8|0;v=k+16|0;w=j+16|0;x=l+8|0;y=l+16|0;z=o;A=o;B=0;C=0;D=0;E=0;F=0;G=0;H=a;J=o;while(1){do if(H){K=J+1|0;if((J|0)!=-1){L=((K>>>0)%3|0|0)==0?J+-2|0:K;if((z|0)!=-1)if(!((z>>>0)%3|0)){M=z;N=z+2|0;O=L;P=z;break}else{M=z;N=z+-1|0;O=L;P=z;break}else{M=-1;N=-1;O=L;P=-1}}else{M=z;N=-1;O=-1;P=-1}}else{L=A+1|0;K=((L>>>0)%3|0|0)==0?A+-2|0:L;if(!((A>>>0)%3|0)){M=z;N=A+2|0;O=K;P=J;break}else{M=z;N=A+-1|0;O=K;P=J;break}}while(0);K=f[(f[(f[m>>2]|0)+28>>2]|0)+(O<<2)>>2]|0;Q=f[n>>2]|0;L=f[Q>>2]|0;if((f[Q+4>>2]|0)-L>>2>>>0<=K>>>0){R=17;break}S=f[(f[q>>2]|0)+(f[L+(K<<2)>>2]<<2)>>2]|0;K=f[p>>2]|0;if(!(b[K+84>>0]|0))T=f[(f[K+68>>2]|0)+(S<<2)>>2]|0;else T=S;f[k>>2]=0;f[k+4>>2]=0;f[k+8>>2]=0;f[k+12>>2]=0;f[k+16>>2]=0;f[k+20>>2]=0;f[h>>2]=T;S=b[K+24>>0]|0;f[g>>2]=f[h>>2];vb(K,g,S,k)|0;S=f[(f[(f[m>>2]|0)+28>>2]|0)+(N<<2)>>2]|0;U=f[n>>2]|0;K=f[U>>2]|0;if((f[U+4>>2]|0)-K>>2>>>0<=S>>>0){R=21;break}L=f[(f[q>>2]|0)+(f[K+(S<<2)>>2]<<2)>>2]|0;S=f[p>>2]|0;if(!(b[S+84>>0]|0))V=f[(f[S+68>>2]|0)+(L<<2)>>2]|0;else V=L;f[l>>2]=0;f[l+4>>2]=0;f[l+8>>2]=0;f[l+12>>2]=0;f[l+16>>2]=0;f[l+20>>2]=0;f[h>>2]=V;L=b[S+24>>0]|0;f[g>>2]=f[h>>2];vb(S,g,L,l)|0;L=k;S=j;K=f[S>>2]|0;W=f[S+4>>2]|0;S=Xn(f[L>>2]|0,f[L+4>>2]|0,K|0,W|0)|0;L=I;X=r;Y=s;Z=f[Y>>2]|0;_=f[Y+4>>2]|0;Y=Xn(f[X>>2]|0,f[X+4>>2]|0,Z|0,_|0)|0;X=I;$=v;aa=w;ba=f[aa>>2]|0;ca=f[aa+4>>2]|0;aa=Xn(f[$>>2]|0,f[$+4>>2]|0,ba|0,ca|0)|0;$=I;da=l;ea=Xn(f[da>>2]|0,f[da+4>>2]|0,K|0,W|0)|0;W=I;K=x;da=Xn(f[K>>2]|0,f[K+4>>2]|0,Z|0,_|0)|0;_=I;Z=y;K=Xn(f[Z>>2]|0,f[Z+4>>2]|0,ba|0,ca|0)|0;ca=I;ba=un(K|0,ca|0,Y|0,X|0)|0;Z=I;fa=un(da|0,_|0,aa|0,$|0)|0;ga=I;ha=un(ea|0,W|0,aa|0,$|0)|0;$=I;aa=un(K|0,ca|0,S|0,L|0)|0;ca=I;K=un(da|0,_|0,S|0,L|0)|0;L=I;S=un(ea|0,W|0,Y|0,X|0)|0;X=I;Y=Xn(B|0,C|0,fa|0,ga|0)|0;ga=Vn(Y|0,I|0,ba|0,Z|0)|0;Z=I;ba=Vn(ha|0,$|0,D|0,E|0)|0;$=Xn(ba|0,I|0,aa|0,ca|0)|0;ca=I;aa=Xn(F|0,G|0,S|0,X|0)|0;X=Vn(aa|0,I|0,K|0,L|0)|0;L=I;Pg(i);A=f[c>>2]|0;K=(f[t>>2]|0)==0;if((A|0)==-1){ia=K;ja=Z;ka=ga;la=ca;ma=$;na=L;oa=X;break a}else{z=M;B=ga;C=Z;D=$;E=ca;F=X;G=L;H=K;J=P}}if((R|0)==17)aq(Q);else if((R|0)==21)aq(U)}else{ia=a;ja=0;ka=0;la=0;ma=0;na=0;oa=0}while(0);a=(ja|0)>-1|(ja|0)==-1&ka>>>0>4294967295;U=Xn(0,0,ka|0,ja|0)|0;R=a?ja:I;Q=(la|0)>-1|(la|0)==-1&ma>>>0>4294967295;P=Xn(0,0,ma|0,la|0)|0;M=Q?la:I;t=(na|0)>-1|(na|0)==-1&oa>>>0>4294967295;c=Xn(0,0,oa|0,na|0)|0;i=Vn((Q?ma:P)|0,M|0,(t?oa:c)|0,(t?na:I)|0)|0;t=Vn(i|0,I|0,(a?ka:U)|0,R|0)|0;R=I;if(ia){if((t|0)<=536870912){pa=ka;qa=ma;ra=oa;f[d>>2]=pa;sa=d+4|0;f[sa>>2]=qa;ta=d+8|0;f[ta>>2]=ra;u=e;return}ia=Yn(t|0,R|0,29)|0;U=ia&7;ia=Ik(ka|0,ja|0,U|0,0)|0;a=Ik(ma|0,la|0,U|0,0)|0;i=Ik(oa|0,na|0,U|0,0)|0;pa=ia;qa=a;ra=i;f[d>>2]=pa;sa=d+4|0;f[sa>>2]=qa;ta=d+8|0;f[ta>>2]=ra;u=e;return}else{if(!((R|0)>0|(R|0)==0&t>>>0>536870912)){pa=ka;qa=ma;ra=oa;f[d>>2]=pa;sa=d+4|0;f[sa>>2]=qa;ta=d+8|0;f[ta>>2]=ra;u=e;return}i=Yn(t|0,R|0,29)|0;R=I;t=Ik(ka|0,ja|0,i|0,R|0)|0;ja=Ik(ma|0,la|0,i|0,R|0)|0;la=Ik(oa|0,na|0,i|0,R|0)|0;pa=t;qa=ja;ra=la;f[d>>2]=pa;sa=d+4|0;f[sa>>2]=qa;ta=d+8|0;f[ta>>2]=ra;u=e;return}}function jc(a,c,e){a=a|0;c=c|0;e=e|0;var g=0,i=0,j=0,k=0,l=0,m=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=Oa,V=Oa,X=Oa,Y=0,Z=0,_=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0;g=u;u=u+48|0;i=g+28|0;j=g+8|0;k=g;l=g+16|0;m=i+16|0;f[i>>2]=0;f[i+4>>2]=0;f[i+8>>2]=0;f[i+12>>2]=0;n[m>>2]=$(1.0);o=a+80|0;p=f[o>>2]|0;f[l>>2]=0;q=l+4|0;f[q>>2]=0;f[l+8>>2]=0;if(p){if(p>>>0>1073741823)aq(l);r=p<<2;s=ln(r)|0;f[l>>2]=s;t=s+(p<<2)|0;f[l+8>>2]=t;sj(s|0,0,r|0)|0;f[q>>2]=t;t=f[e>>2]|0;e=c+48|0;r=c+40|0;s=i+4|0;p=i+12|0;v=i+8|0;w=a+40|0;x=a+64|0;y=0;z=0;while(1){A=e;B=f[A>>2]|0;C=f[A+4>>2]|0;A=r;D=un(f[A>>2]|0,f[A+4>>2]|0,t+y|0,0)|0;A=Vn(D|0,I|0,B|0,C|0)|0;C=(f[f[c>>2]>>2]|0)+A|0;A=C;B=h[A>>0]|h[A+1>>0]<<8|h[A+2>>0]<<16|h[A+3>>0]<<24;A=C+4|0;C=h[A>>0]|h[A+1>>0]<<8|h[A+2>>0]<<16|h[A+3>>0]<<24;A=j;f[A>>2]=B;f[A+4>>2]=C;A=k;f[A>>2]=B;f[A+4>>2]=C;C=yf(i,k)|0;if(!C){A=k;B=f[A>>2]|0;D=f[A+4>>2]|0;A=B&65535;E=Yn(B|0,D|0,16)|0;F=E&65535;G=D&65535;H=Yn(B|0,D|0,48)|0;J=H&65535;K=((((A^318)&65535)+239^E&65535)+239^D&65535)+239^H&65535;H=f[s>>2]|0;E=(H|0)==0;a:do if(!E){L=H+-1|0;M=(L&H|0)==0;if(!M)if(K>>>0<H>>>0)N=K;else N=(K>>>0)%(H>>>0)|0;else N=K&L;O=f[(f[i>>2]|0)+(N<<2)>>2]|0;if((O|0)!=0?(P=f[O>>2]|0,(P|0)!=0):0){if(M){M=P;while(1){O=f[M+4>>2]|0;if(!((O|0)==(K|0)|(O&L|0)==(N|0))){Q=N;R=31;break a}O=M+8|0;if((((d[O>>1]|0)==A<<16>>16?(d[O+2>>1]|0)==F<<16>>16:0)?(d[M+12>>1]|0)==G<<16>>16:0)?(d[O+6>>1]|0)==J<<16>>16:0)break a;M=f[M>>2]|0;if(!M){Q=N;R=31;break a}}}else S=P;while(1){M=f[S+4>>2]|0;if((M|0)!=(K|0)){if(M>>>0<H>>>0)T=M;else T=(M>>>0)%(H>>>0)|0;if((T|0)!=(N|0)){Q=N;R=31;break a}}M=S+8|0;if((((d[M>>1]|0)==A<<16>>16?(d[M+2>>1]|0)==F<<16>>16:0)?(d[S+12>>1]|0)==G<<16>>16:0)?(d[M+6>>1]|0)==J<<16>>16:0)break a;S=f[S>>2]|0;if(!S){Q=N;R=31;break}}}else{Q=N;R=31}}else{Q=0;R=31}while(0);if((R|0)==31){R=0;J=ln(20)|0;G=J+8|0;F=G;d[F>>1]=B;d[F+2>>1]=B>>>16;F=G+4|0;d[F>>1]=D;d[F+2>>1]=D>>>16;f[J+16>>2]=z;f[J+4>>2]=K;f[J>>2]=0;U=$(((f[p>>2]|0)+1|0)>>>0);V=$(H>>>0);X=$(n[m>>2]);do if(E|$(X*V)<U){F=H<<1|(H>>>0<3|(H+-1&H|0)!=0)&1;G=~~$(W($(U/X)))>>>0;Sh(i,F>>>0<G>>>0?G:F);F=f[s>>2]|0;G=F+-1|0;if(!(G&F)){Y=F;Z=G&K;break}if(K>>>0<F>>>0){Y=F;Z=K}else{Y=F;Z=(K>>>0)%(F>>>0)|0}}else{Y=H;Z=Q}while(0);H=(f[i>>2]|0)+(Z<<2)|0;K=f[H>>2]|0;if(!K){f[J>>2]=f[v>>2];f[v>>2]=J;f[H>>2]=v;H=f[J>>2]|0;if(H|0){E=f[H+4>>2]|0;H=Y+-1|0;if(H&Y)if(E>>>0<Y>>>0)_=E;else _=(E>>>0)%(Y>>>0)|0;else _=E&H;aa=(f[i>>2]|0)+(_<<2)|0;R=44}}else{f[J>>2]=f[K>>2];aa=K;R=44}if((R|0)==44){R=0;f[aa>>2]=J}f[p>>2]=(f[p>>2]|0)+1}K=w;H=f[K>>2]|0;E=un(H|0,f[K+4>>2]|0,z|0,0)|0;kh((f[f[x>>2]>>2]|0)+E|0,j|0,H|0)|0;H=f[l>>2]|0;f[H+(y<<2)>>2]=z;ba=z+1|0;ca=H}else{H=f[l>>2]|0;f[H+(y<<2)>>2]=f[C+16>>2];ba=z;ca=H}y=y+1|0;da=f[o>>2]|0;if(y>>>0>=da>>>0)break;else z=ba}if((ba|0)==(da|0))ea=ca;else{z=a+84|0;if(!(b[z>>0]|0)){y=f[a+72>>2]|0;j=f[a+68>>2]|0;x=j;if((y|0)==(j|0))fa=ca;else{w=y-j>>2;j=0;do{y=x+(j<<2)|0;f[y>>2]=f[ca+(f[y>>2]<<2)>>2];j=j+1|0}while(j>>>0<w>>>0);fa=ca}}else{b[z>>0]=0;z=a+68|0;ca=a+72|0;w=f[ca>>2]|0;j=f[z>>2]|0;x=w-j>>2;y=j;j=w;if(da>>>0<=x>>>0)if(da>>>0<x>>>0?(w=y+(da<<2)|0,(w|0)!=(j|0)):0){f[ca>>2]=j+(~((j+-4-w|0)>>>2)<<2);ga=da}else ga=da;else{Ch(z,da-x|0,1220);ga=f[o>>2]|0}x=f[l>>2]|0;if(!ga)fa=x;else{l=f[a+68>>2]|0;a=0;do{f[l+(a<<2)>>2]=f[x+(a<<2)>>2];a=a+1|0}while(a>>>0<ga>>>0);fa=x}}f[o>>2]=ba;ea=fa}if(!ea)ha=ba;else{fa=f[q>>2]|0;if((fa|0)!=(ea|0))f[q>>2]=fa+(~((fa+-4-ea|0)>>>2)<<2);Oq(ea);ha=ba}}else ha=0;ba=f[i+8>>2]|0;if(ba|0){ea=ba;do{ba=ea;ea=f[ea>>2]|0;Oq(ba)}while((ea|0)!=0)}ea=f[i>>2]|0;f[i>>2]=0;if(!ea){u=g;return ha|0}Oq(ea);u=g;return ha|0}function kc(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0;c=u;u=u+16|0;d=c+8|0;e=c;g=c+4|0;h=a+16|0;i=f[h>>2]|0;j=a+20|0;k=f[j>>2]|0;if((k|0)==(i|0))l=i;else{m=k+(~((k+-4-i|0)>>>2)<<2)|0;f[j>>2]=m;l=m}m=a+24|0;if((l|0)==(f[m>>2]|0)){Ri(h,b);n=f[h>>2]|0;o=f[j>>2]|0}else{f[l>>2]=f[b>>2];k=l+4|0;f[j>>2]=k;n=i;o=k}k=f[a+8>>2]|0;i=(f[k+100>>2]|0)-(f[k+96>>2]|0)|0;k=(i|0)/12|0;if((n|0)==(o|0)){u=c;return 1}n=a+28|0;l=(i|0)>0;i=a+164|0;p=a+12|0;q=a+76|0;r=a+80|0;s=a+72|0;t=a+152|0;v=a+84|0;w=a+272|0;x=a+276|0;y=a+268|0;z=a+168|0;A=a+140|0;B=a+120|0;C=o;do{o=f[C+-4>>2]|0;f[b>>2]=o;a:do if((o|0)!=-1?(D=(o>>>0)/3|0,E=f[n>>2]|0,(f[E+(D>>>5<<2)>>2]&1<<(D&31)|0)==0):0){if(l){D=0;F=E;b:while(1){E=D+1|0;f[i>>2]=(f[i>>2]|0)+1;G=f[b>>2]|0;H=(G|0)==-1?-1:(G>>>0)/3|0;G=F+(H>>>5<<2)|0;f[G>>2]=1<<(H&31)|f[G>>2];G=f[q>>2]|0;if((G|0)==(f[r>>2]|0))Ri(s,b);else{f[G>>2]=f[b>>2];f[q>>2]=G+4}G=f[b>>2]|0;if((G|0)==-1)I=-1;else I=f[(f[f[p>>2]>>2]|0)+(G<<2)>>2]|0;J=(f[(f[t>>2]|0)+(I<<2)>>2]|0)!=-1;K=(f[v>>2]|0)+(I>>>5<<2)|0;L=1<<(I&31);M=f[K>>2]|0;do if(!(M&L)){f[K>>2]=M|L;if(J){N=f[b>>2]|0;O=30;break}f[d>>2]=0;P=f[w>>2]|0;if((P|0)==(f[x>>2]|0))Ri(y,d);else{f[P>>2]=0;f[w>>2]=P+4}P=f[b>>2]|0;Q=P+1|0;if((P|0)!=-1?(R=((Q>>>0)%3|0|0)==0?P+-2|0:Q,(R|0)!=-1):0)S=f[(f[(f[p>>2]|0)+12>>2]|0)+(R<<2)>>2]|0;else S=-1;f[b>>2]=S}else{N=G;O=30}while(0);if((O|0)==30){O=0;G=N+1|0;if((N|0)==-1){O=35;break}L=((G>>>0)%3|0|0)==0?N+-2|0:G;if((L|0)==-1)T=-1;else T=f[(f[(f[p>>2]|0)+12>>2]|0)+(L<<2)>>2]|0;f[e>>2]=T;L=(((N>>>0)%3|0|0)==0?2:-1)+N|0;if((L|0)==-1)U=-1;else U=f[(f[(f[p>>2]|0)+12>>2]|0)+(L<<2)>>2]|0;L=(T|0)==-1;M=L?-1:(T>>>0)/3|0;V=(U|0)==-1;W=V?-1:(U>>>0)/3|0;K=((G>>>0)%3|0|0)==0?N+-2|0:G;if(((K|0)!=-1?(G=f[(f[p>>2]|0)+12>>2]|0,R=f[G+(K<<2)>>2]|0,(R|0)!=-1):0)?(K=(R>>>0)/3|0,R=f[n>>2]|0,(f[R+(K>>>5<<2)>>2]&1<<(K&31)|0)==0):0){K=(((N>>>0)%3|0|0)==0?2:-1)+N|0;do if((K|0)!=-1){Q=f[G+(K<<2)>>2]|0;if((Q|0)==-1)break;P=(Q>>>0)/3|0;if(!(f[R+(P>>>5<<2)>>2]&1<<(P&31))){O=63;break b}}while(0);if(!V)xf(a,f[i>>2]|0,H,0,W);f[d>>2]=3;R=f[w>>2]|0;if((R|0)==(f[x>>2]|0))Ri(y,d);else{f[R>>2]=3;f[w>>2]=R+4}X=f[e>>2]|0}else{if(!L){xf(a,f[i>>2]|0,H,1,M);R=f[b>>2]|0;if((R|0)==-1){O=44;break}else Y=R}else Y=N;R=(((Y>>>0)%3|0|0)==0?2:-1)+Y|0;if((R|0)==-1){O=44;break}K=f[(f[(f[p>>2]|0)+12>>2]|0)+(R<<2)>>2]|0;if((K|0)==-1){O=44;break}R=(K>>>0)/3|0;if(f[(f[n>>2]|0)+(R>>>5<<2)>>2]&1<<(R&31)|0){O=44;break}f[d>>2]=5;R=f[w>>2]|0;if((R|0)==(f[x>>2]|0))Ri(y,d);else{f[R>>2]=5;f[w>>2]=R+4}X=U}f[b>>2]=X}if((E|0)>=(k|0))break a;D=E;F=f[n>>2]|0}do if((O|0)==35){O=0;f[e>>2]=-1;O=46}else if((O|0)==44){O=0;if(V)O=46;else{xf(a,f[i>>2]|0,H,0,W);O=46}}else if((O|0)==63){O=0;f[d>>2]=1;F=f[w>>2]|0;if((F|0)==(f[x>>2]|0))Ri(y,d);else{f[F>>2]=1;f[w>>2]=F+4}f[z>>2]=(f[z>>2]|0)+1;if(J?(F=f[(f[t>>2]|0)+(I<<2)>>2]|0,(1<<(F&31)&f[(f[A>>2]|0)+(F>>>5<<2)>>2]|0)==0):0){f[g>>2]=f[b>>2];f[d>>2]=f[g>>2];Pe(a,d,0)|0}F=f[i>>2]|0;f[d>>2]=H;D=je(B,d)|0;f[D>>2]=F;F=f[j>>2]|0;f[F+-4>>2]=U;if((F|0)==(f[m>>2]|0)){Ri(h,e);break}else{f[F>>2]=f[e>>2];f[j>>2]=F+4;break}}while(0);if((O|0)==46){O=0;f[d>>2]=7;F=f[w>>2]|0;if((F|0)==(f[x>>2]|0))Ri(y,d);else{f[F>>2]=7;f[w>>2]=F+4}f[j>>2]=(f[j>>2]|0)+-4}}}else O=11;while(0);if((O|0)==11){O=0;f[j>>2]=C+-4}C=f[j>>2]|0}while((f[h>>2]|0)!=(C|0));u=c;return 1}function lc(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,i=0,j=0,k=0,l=0,m=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=Oa,V=Oa,X=Oa,Y=0,Z=0,_=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0;e=u;u=u+48|0;g=e+20|0;i=e+16|0;j=e+12|0;k=e;l=g+16|0;f[g>>2]=0;f[g+4>>2]=0;f[g+8>>2]=0;f[g+12>>2]=0;n[l>>2]=$(1.0);m=a+80|0;o=f[m>>2]|0;f[k>>2]=0;p=k+4|0;f[p>>2]=0;f[k+8>>2]=0;if(o){if(o>>>0>1073741823)aq(k);q=o<<2;r=ln(q)|0;f[k>>2]=r;s=r+(o<<2)|0;f[k+8>>2]=s;sj(r|0,0,q|0)|0;f[p>>2]=s;s=f[d>>2]|0;d=c+48|0;q=c+40|0;r=g+4|0;o=g+12|0;t=g+8|0;v=a+40|0;w=a+64|0;x=0;y=0;while(1){z=d;A=f[z>>2]|0;B=f[z+4>>2]|0;z=q;C=un(f[z>>2]|0,f[z+4>>2]|0,s+x|0,0)|0;z=Vn(C|0,I|0,A|0,B|0)|0;B=(f[f[c>>2]>>2]|0)+z|0;z=h[B>>0]|h[B+1>>0]<<8|h[B+2>>0]<<16|h[B+3>>0]<<24;f[i>>2]=z;f[j>>2]=z;z=Ef(g,j)|0;if(!z){B=f[j>>2]|0;A=B&255;C=B>>>8;D=C&255;E=B>>>16;F=E&255;G=B>>>24;H=G&255;J=C&255;C=E&255;E=(((B&255^318)+239^J)+239^C)+239^G;G=f[r>>2]|0;K=(G|0)==0;a:do if(!K){L=G+-1|0;M=(L&G|0)==0;if(!M)if(E>>>0<G>>>0)N=E;else N=(E>>>0)%(G>>>0)|0;else N=E&L;O=f[(f[g>>2]|0)+(N<<2)>>2]|0;if((O|0)!=0?(P=f[O>>2]|0,(P|0)!=0):0){if(M){M=P;while(1){O=f[M+4>>2]|0;if(!((O|0)==(E|0)|(O&L|0)==(N|0))){Q=N;R=31;break a}O=M+8|0;if((((b[O>>0]|0)==A<<24>>24?(b[O+1>>0]|0)==D<<24>>24:0)?(b[O+2>>0]|0)==F<<24>>24:0)?(b[O+3>>0]|0)==H<<24>>24:0)break a;M=f[M>>2]|0;if(!M){Q=N;R=31;break a}}}else S=P;while(1){M=f[S+4>>2]|0;if((M|0)!=(E|0)){if(M>>>0<G>>>0)T=M;else T=(M>>>0)%(G>>>0)|0;if((T|0)!=(N|0)){Q=N;R=31;break a}}M=S+8|0;if((((b[M>>0]|0)==A<<24>>24?(b[M+1>>0]|0)==D<<24>>24:0)?(b[M+2>>0]|0)==F<<24>>24:0)?(b[M+3>>0]|0)==H<<24>>24:0)break a;S=f[S>>2]|0;if(!S){Q=N;R=31;break}}}else{Q=N;R=31}}else{Q=0;R=31}while(0);if((R|0)==31){R=0;H=ln(16)|0;F=H+8|0;D=B&-16776961|C<<16|J<<8;b[F>>0]=D;b[F+1>>0]=D>>8;b[F+2>>0]=D>>16;b[F+3>>0]=D>>24;f[H+12>>2]=y;f[H+4>>2]=E;f[H>>2]=0;U=$(((f[o>>2]|0)+1|0)>>>0);V=$(G>>>0);X=$(n[l>>2]);do if(K|$(X*V)<U){D=G<<1|(G>>>0<3|(G+-1&G|0)!=0)&1;F=~~$(W($(U/X)))>>>0;Zh(g,D>>>0<F>>>0?F:D);D=f[r>>2]|0;F=D+-1|0;if(!(F&D)){Y=D;Z=F&E;break}if(E>>>0<D>>>0){Y=D;Z=E}else{Y=D;Z=(E>>>0)%(D>>>0)|0}}else{Y=G;Z=Q}while(0);G=(f[g>>2]|0)+(Z<<2)|0;E=f[G>>2]|0;if(!E){f[H>>2]=f[t>>2];f[t>>2]=H;f[G>>2]=t;G=f[H>>2]|0;if(G|0){K=f[G+4>>2]|0;G=Y+-1|0;if(G&Y)if(K>>>0<Y>>>0)_=K;else _=(K>>>0)%(Y>>>0)|0;else _=K&G;aa=(f[g>>2]|0)+(_<<2)|0;R=44}}else{f[H>>2]=f[E>>2];aa=E;R=44}if((R|0)==44){R=0;f[aa>>2]=H}f[o>>2]=(f[o>>2]|0)+1}E=v;G=f[E>>2]|0;K=un(G|0,f[E+4>>2]|0,y|0,0)|0;kh((f[f[w>>2]>>2]|0)+K|0,i|0,G|0)|0;G=f[k>>2]|0;f[G+(x<<2)>>2]=y;ba=y+1|0;ca=G}else{G=f[k>>2]|0;f[G+(x<<2)>>2]=f[z+12>>2];ba=y;ca=G}x=x+1|0;da=f[m>>2]|0;if(x>>>0>=da>>>0)break;else y=ba}if((ba|0)==(da|0))ea=ca;else{y=a+84|0;if(!(b[y>>0]|0)){x=f[a+72>>2]|0;i=f[a+68>>2]|0;w=i;if((x|0)==(i|0))fa=ca;else{v=x-i>>2;i=0;do{x=w+(i<<2)|0;f[x>>2]=f[ca+(f[x>>2]<<2)>>2];i=i+1|0}while(i>>>0<v>>>0);fa=ca}}else{b[y>>0]=0;y=a+68|0;ca=a+72|0;v=f[ca>>2]|0;i=f[y>>2]|0;w=v-i>>2;x=i;i=v;if(da>>>0<=w>>>0)if(da>>>0<w>>>0?(v=x+(da<<2)|0,(v|0)!=(i|0)):0){f[ca>>2]=i+(~((i+-4-v|0)>>>2)<<2);ga=da}else ga=da;else{Ch(y,da-w|0,1220);ga=f[m>>2]|0}w=f[k>>2]|0;if(!ga)fa=w;else{k=f[a+68>>2]|0;a=0;do{f[k+(a<<2)>>2]=f[w+(a<<2)>>2];a=a+1|0}while(a>>>0<ga>>>0);fa=w}}f[m>>2]=ba;ea=fa}if(!ea)ha=ba;else{fa=f[p>>2]|0;if((fa|0)!=(ea|0))f[p>>2]=fa+(~((fa+-4-ea|0)>>>2)<<2);Oq(ea);ha=ba}}else ha=0;ba=f[g+8>>2]|0;if(ba|0){ea=ba;do{ba=ea;ea=f[ea>>2]|0;Oq(ba)}while((ea|0)!=0)}ea=f[g>>2]|0;f[g>>2]=0;if(!ea){u=e;return ha|0}Oq(ea);u=e;return ha|0}function mc(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=Oa,V=Oa,X=Oa,Y=0,Z=0,_=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0;e=u;u=u+80|0;g=e+48|0;h=e+32|0;i=e+16|0;j=e;k=g+16|0;f[g>>2]=0;f[g+4>>2]=0;f[g+8>>2]=0;f[g+12>>2]=0;n[k>>2]=$(1.0);l=a+80|0;m=f[l>>2]|0;f[j>>2]=0;o=j+4|0;f[o>>2]=0;f[j+8>>2]=0;if(m){if(m>>>0>1073741823)aq(j);p=m<<2;q=ln(p)|0;f[j>>2]=q;r=q+(m<<2)|0;f[j+8>>2]=r;sj(q|0,0,p|0)|0;f[o>>2]=r;r=f[d>>2]|0;d=c+48|0;p=c+40|0;q=i+4|0;m=i+8|0;s=i+12|0;t=g+4|0;v=g+12|0;w=g+8|0;x=a+40|0;y=a+64|0;z=0;A=0;while(1){B=d;C=f[B>>2]|0;D=f[B+4>>2]|0;B=p;E=un(f[B>>2]|0,f[B+4>>2]|0,r+A|0,0)|0;B=Vn(E|0,I|0,C|0,D|0)|0;D=(f[f[c>>2]>>2]|0)+B|0;B=h;C=D;E=B+16|0;do{b[B>>0]=b[C>>0]|0;B=B+1|0;C=C+1|0}while((B|0)<(E|0));im(i|0,D|0,16)|0;C=Vf(g,i)|0;if(!C){B=f[i>>2]|0;E=f[q>>2]|0;F=f[m>>2]|0;G=f[s>>2]|0;H=(((B^318)+239^E)+239^F)+239^G;J=f[t>>2]|0;K=(J|0)==0;a:do if(!K){L=J+-1|0;M=(L&J|0)==0;if(!M)if(H>>>0<J>>>0)N=H;else N=(H>>>0)%(J>>>0)|0;else N=H&L;O=f[(f[g>>2]|0)+(N<<2)>>2]|0;if((O|0)!=0?(P=f[O>>2]|0,(P|0)!=0):0){if(M){M=P;while(1){O=f[M+4>>2]|0;if(!((O|0)==(H|0)|(O&L|0)==(N|0))){Q=N;R=31;break a}if((((f[M+8>>2]|0)==(B|0)?(f[M+12>>2]|0)==(E|0):0)?(f[M+16>>2]|0)==(F|0):0)?(f[M+20>>2]|0)==(G|0):0)break a;M=f[M>>2]|0;if(!M){Q=N;R=31;break a}}}else S=P;while(1){M=f[S+4>>2]|0;if((M|0)!=(H|0)){if(M>>>0<J>>>0)T=M;else T=(M>>>0)%(J>>>0)|0;if((T|0)!=(N|0)){Q=N;R=31;break a}}if((((f[S+8>>2]|0)==(B|0)?(f[S+12>>2]|0)==(E|0):0)?(f[S+16>>2]|0)==(F|0):0)?(f[S+20>>2]|0)==(G|0):0)break a;S=f[S>>2]|0;if(!S){Q=N;R=31;break}}}else{Q=N;R=31}}else{Q=0;R=31}while(0);if((R|0)==31){R=0;D=ln(28)|0;f[D+8>>2]=B;f[D+12>>2]=E;f[D+16>>2]=F;f[D+20>>2]=G;f[D+24>>2]=z;f[D+4>>2]=H;f[D>>2]=0;U=$(((f[v>>2]|0)+1|0)>>>0);V=$(J>>>0);X=$(n[k>>2]);do if(K|$(X*V)<U){P=J<<1|(J>>>0<3|(J+-1&J|0)!=0)&1;M=~~$(W($(U/X)))>>>0;Wh(g,P>>>0<M>>>0?M:P);P=f[t>>2]|0;M=P+-1|0;if(!(M&P)){Y=P;Z=M&H;break}if(H>>>0<P>>>0){Y=P;Z=H}else{Y=P;Z=(H>>>0)%(P>>>0)|0}}else{Y=J;Z=Q}while(0);J=(f[g>>2]|0)+(Z<<2)|0;H=f[J>>2]|0;if(!H){f[D>>2]=f[w>>2];f[w>>2]=D;f[J>>2]=w;J=f[D>>2]|0;if(J|0){K=f[J+4>>2]|0;J=Y+-1|0;if(J&Y)if(K>>>0<Y>>>0)_=K;else _=(K>>>0)%(Y>>>0)|0;else _=K&J;aa=(f[g>>2]|0)+(_<<2)|0;R=44}}else{f[D>>2]=f[H>>2];aa=H;R=44}if((R|0)==44){R=0;f[aa>>2]=D}f[v>>2]=(f[v>>2]|0)+1}H=x;J=f[H>>2]|0;K=un(J|0,f[H+4>>2]|0,z|0,0)|0;kh((f[f[y>>2]>>2]|0)+K|0,h|0,J|0)|0;J=f[j>>2]|0;f[J+(A<<2)>>2]=z;ba=z+1|0;ca=J}else{J=f[j>>2]|0;f[J+(A<<2)>>2]=f[C+24>>2];ba=z;ca=J}A=A+1|0;da=f[l>>2]|0;if(A>>>0>=da>>>0)break;else z=ba}if((ba|0)==(da|0))ea=ca;else{z=a+84|0;if(!(b[z>>0]|0)){A=f[a+72>>2]|0;h=f[a+68>>2]|0;y=h;if((A|0)==(h|0))fa=ca;else{x=A-h>>2;h=0;do{A=y+(h<<2)|0;f[A>>2]=f[ca+(f[A>>2]<<2)>>2];h=h+1|0}while(h>>>0<x>>>0);fa=ca}}else{b[z>>0]=0;z=a+68|0;ca=a+72|0;x=f[ca>>2]|0;h=f[z>>2]|0;y=x-h>>2;A=h;h=x;if(da>>>0<=y>>>0)if(da>>>0<y>>>0?(x=A+(da<<2)|0,(x|0)!=(h|0)):0){f[ca>>2]=h+(~((h+-4-x|0)>>>2)<<2);ga=da}else ga=da;else{Ch(z,da-y|0,1220);ga=f[l>>2]|0}y=f[j>>2]|0;if(!ga)fa=y;else{j=f[a+68>>2]|0;a=0;do{f[j+(a<<2)>>2]=f[y+(a<<2)>>2];a=a+1|0}while(a>>>0<ga>>>0);fa=y}}f[l>>2]=ba;ea=fa}if(!ea)ha=ba;else{fa=f[o>>2]|0;if((fa|0)!=(ea|0))f[o>>2]=fa+(~((fa+-4-ea|0)>>>2)<<2);Oq(ea);ha=ba}}else ha=0;ba=f[g+8>>2]|0;if(ba|0){ea=ba;do{ba=ea;ea=f[ea>>2]|0;Oq(ba)}while((ea|0)!=0)}ea=f[g>>2]|0;f[g>>2]=0;if(!ea){u=e;return ha|0}Oq(ea);u=e;return ha|0}function nc(a,c,e){a=a|0;c=c|0;e=e|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=Oa,T=Oa,U=Oa,V=0,X=0,Y=0,Z=0,_=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0;g=u;u=u+48|0;h=g+12|0;i=g+38|0;j=g+32|0;k=g;l=h+16|0;f[h>>2]=0;f[h+4>>2]=0;f[h+8>>2]=0;f[h+12>>2]=0;n[l>>2]=$(1.0);m=a+80|0;o=f[m>>2]|0;f[k>>2]=0;p=k+4|0;f[p>>2]=0;f[k+8>>2]=0;if(o){if(o>>>0>1073741823)aq(k);q=o<<2;r=ln(q)|0;f[k>>2]=r;s=r+(o<<2)|0;f[k+8>>2]=s;sj(r|0,0,q|0)|0;f[p>>2]=s;s=f[e>>2]|0;e=c+48|0;q=c+40|0;r=j+2|0;o=j+4|0;t=h+4|0;v=h+12|0;w=h+8|0;x=a+40|0;y=a+64|0;z=0;A=0;while(1){B=e;C=f[B>>2]|0;D=f[B+4>>2]|0;B=q;E=un(f[B>>2]|0,f[B+4>>2]|0,s+A|0,0)|0;B=Vn(E|0,I|0,C|0,D|0)|0;D=(f[f[c>>2]>>2]|0)+B|0;b[i>>0]=b[D>>0]|0;b[i+1>>0]=b[D+1>>0]|0;b[i+2>>0]=b[D+2>>0]|0;b[i+3>>0]=b[D+3>>0]|0;b[i+4>>0]=b[D+4>>0]|0;b[i+5>>0]=b[D+5>>0]|0;im(j|0,D|0,6)|0;D=dg(h,j)|0;if(!D){B=d[j>>1]|0;C=d[r>>1]|0;E=d[o>>1]|0;F=(((B^318)&65535)+239^C&65535)+239^E&65535;G=f[t>>2]|0;H=(G|0)==0;a:do if(!H){J=G+-1|0;K=(J&G|0)==0;if(!K)if(F>>>0<G>>>0)L=F;else L=(F>>>0)%(G>>>0)|0;else L=F&J;M=f[(f[h>>2]|0)+(L<<2)>>2]|0;if((M|0)!=0?(N=f[M>>2]|0,(N|0)!=0):0){if(K){K=N;while(1){M=f[K+4>>2]|0;if(!((M|0)==(F|0)|(M&J|0)==(L|0))){O=L;P=29;break a}M=K+8|0;if(((d[M>>1]|0)==B<<16>>16?(d[M+2>>1]|0)==C<<16>>16:0)?(d[K+12>>1]|0)==E<<16>>16:0)break a;K=f[K>>2]|0;if(!K){O=L;P=29;break a}}}else Q=N;while(1){K=f[Q+4>>2]|0;if((K|0)!=(F|0)){if(K>>>0<G>>>0)R=K;else R=(K>>>0)%(G>>>0)|0;if((R|0)!=(L|0)){O=L;P=29;break a}}K=Q+8|0;if(((d[K>>1]|0)==B<<16>>16?(d[K+2>>1]|0)==C<<16>>16:0)?(d[Q+12>>1]|0)==E<<16>>16:0)break a;Q=f[Q>>2]|0;if(!Q){O=L;P=29;break}}}else{O=L;P=29}}else{O=0;P=29}while(0);if((P|0)==29){P=0;N=ln(20)|0;d[N+8>>1]=B;d[N+10>>1]=C;d[N+12>>1]=E;f[N+16>>2]=z;f[N+4>>2]=F;f[N>>2]=0;S=$(((f[v>>2]|0)+1|0)>>>0);T=$(G>>>0);U=$(n[l>>2]);do if(H|$(U*T)<S){K=G<<1|(G>>>0<3|(G+-1&G|0)!=0)&1;J=~~$(W($(S/U)))>>>0;Th(h,K>>>0<J>>>0?J:K);K=f[t>>2]|0;J=K+-1|0;if(!(J&K)){V=K;X=J&F;break}if(F>>>0<K>>>0){V=K;X=F}else{V=K;X=(F>>>0)%(K>>>0)|0}}else{V=G;X=O}while(0);G=(f[h>>2]|0)+(X<<2)|0;F=f[G>>2]|0;if(!F){f[N>>2]=f[w>>2];f[w>>2]=N;f[G>>2]=w;G=f[N>>2]|0;if(G|0){H=f[G+4>>2]|0;G=V+-1|0;if(G&V)if(H>>>0<V>>>0)Y=H;else Y=(H>>>0)%(V>>>0)|0;else Y=H&G;Z=(f[h>>2]|0)+(Y<<2)|0;P=42}}else{f[N>>2]=f[F>>2];Z=F;P=42}if((P|0)==42){P=0;f[Z>>2]=N}f[v>>2]=(f[v>>2]|0)+1}F=x;G=f[F>>2]|0;H=un(G|0,f[F+4>>2]|0,z|0,0)|0;kh((f[f[y>>2]>>2]|0)+H|0,i|0,G|0)|0;G=f[k>>2]|0;f[G+(A<<2)>>2]=z;_=z+1|0;aa=G}else{G=f[k>>2]|0;f[G+(A<<2)>>2]=f[D+16>>2];_=z;aa=G}A=A+1|0;ba=f[m>>2]|0;if(A>>>0>=ba>>>0)break;else z=_}if((_|0)==(ba|0))ca=aa;else{z=a+84|0;if(!(b[z>>0]|0)){A=f[a+72>>2]|0;i=f[a+68>>2]|0;y=i;if((A|0)==(i|0))da=aa;else{x=A-i>>2;i=0;do{A=y+(i<<2)|0;f[A>>2]=f[aa+(f[A>>2]<<2)>>2];i=i+1|0}while(i>>>0<x>>>0);da=aa}}else{b[z>>0]=0;z=a+68|0;aa=a+72|0;x=f[aa>>2]|0;i=f[z>>2]|0;y=x-i>>2;A=i;i=x;if(ba>>>0<=y>>>0)if(ba>>>0<y>>>0?(x=A+(ba<<2)|0,(x|0)!=(i|0)):0){f[aa>>2]=i+(~((i+-4-x|0)>>>2)<<2);ea=ba}else ea=ba;else{Ch(z,ba-y|0,1220);ea=f[m>>2]|0}y=f[k>>2]|0;if(!ea)da=y;else{k=f[a+68>>2]|0;a=0;do{f[k+(a<<2)>>2]=f[y+(a<<2)>>2];a=a+1|0}while(a>>>0<ea>>>0);da=y}}f[m>>2]=_;ca=da}if(!ca)fa=_;else{da=f[p>>2]|0;if((da|0)!=(ca|0))f[p>>2]=da+(~((da+-4-ca|0)>>>2)<<2);Oq(ca);fa=_}}else fa=0;_=f[h+8>>2]|0;if(_|0){ca=_;do{_=ca;ca=f[ca>>2]|0;Oq(_)}while((ca|0)!=0)}ca=f[h>>2]|0;f[h>>2]=0;if(!ca){u=g;return fa|0}Oq(ca);u=g;return fa|0}function oc(a,b,c,d,e,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,Y=0,Z=0,_=0;g=a+8|0;Mh(g,b,d,e);d=f[a+48>>2]|0;h=f[a+52>>2]|0;i=e>>>0>1073741823?-1:e<<2;j=Lq(i)|0;sj(j|0,0,i|0)|0;k=Lq(i)|0;sj(k|0,0,i|0)|0;i=f[a+56>>2]|0;l=i+4|0;m=f[l>>2]|0;n=f[i>>2]|0;o=m-n|0;a:do if((o|0)>4){p=o>>2;q=(e|0)>0;r=a+16|0;s=a+32|0;t=a+12|0;u=a+28|0;v=a+20|0;w=a+24|0;x=d+12|0;y=e<<2;z=p+-1|0;if(m-n>>2>>>0>z>>>0){A=p;B=z;C=n}else aq(i);while(1){z=f[C+(B<<2)>>2]|0;if(q)sj(j|0,0,y|0)|0;if((z|0)!=-1){p=f[x>>2]|0;D=0;E=z;while(1){F=f[p+(E<<2)>>2]|0;if((F|0)!=-1){G=f[d>>2]|0;H=f[h>>2]|0;I=f[H+(f[G+(F<<2)>>2]<<2)>>2]|0;J=F+1|0;K=((J>>>0)%3|0|0)==0?F+-2|0:J;if((K|0)==-1)L=-1;else L=f[G+(K<<2)>>2]|0;K=f[H+(L<<2)>>2]|0;J=(((F>>>0)%3|0|0)==0?2:-1)+F|0;if((J|0)==-1)M=-1;else M=f[G+(J<<2)>>2]|0;J=f[H+(M<<2)>>2]|0;if((I|0)<(B|0)&(K|0)<(B|0)&(J|0)<(B|0)){H=X(I,e)|0;I=X(K,e)|0;K=X(J,e)|0;if(q){J=0;do{f[k+(J<<2)>>2]=(f[b+(J+K<<2)>>2]|0)+(f[b+(J+I<<2)>>2]|0)-(f[b+(J+H<<2)>>2]|0);J=J+1|0}while((J|0)!=(e|0));if(q){J=0;do{H=j+(J<<2)|0;f[H>>2]=(f[H>>2]|0)+(f[k+(J<<2)>>2]|0);J=J+1|0}while((J|0)!=(e|0))}}N=D+1|0}else N=D}else N=D;J=(((E>>>0)%3|0|0)==0?2:-1)+E|0;do if((J|0)!=-1?(H=f[p+(J<<2)>>2]|0,(H|0)!=-1):0)if(!((H>>>0)%3|0)){O=H+2|0;break}else{O=H+-1|0;break}else O=-1;while(0);E=(O|0)==(z|0)?-1:O;if((E|0)==-1)break;else D=N}D=X(B,e)|0;if(N){if(q){E=0;do{z=j+(E<<2)|0;f[z>>2]=(f[z>>2]|0)/(N|0)|0;E=E+1|0}while((E|0)!=(e|0))}E=b+(D<<2)|0;z=c+(D<<2)|0;p=f[g>>2]|0;if((p|0)>0){J=0;H=j;I=p;while(1){if((I|0)>0){p=0;do{K=f[H+(p<<2)>>2]|0;G=f[r>>2]|0;if((K|0)>(G|0)){F=f[s>>2]|0;f[F+(p<<2)>>2]=G;P=F}else{F=f[t>>2]|0;G=f[s>>2]|0;f[G+(p<<2)>>2]=(K|0)<(F|0)?F:K;P=G}p=p+1|0}while((p|0)<(f[g>>2]|0));Q=P}else Q=f[s>>2]|0;p=(f[E+(J<<2)>>2]|0)-(f[Q+(J<<2)>>2]|0)|0;G=z+(J<<2)|0;f[G>>2]=p;if((p|0)>=(f[u>>2]|0)){if((p|0)>(f[w>>2]|0)){R=p-(f[v>>2]|0)|0;S=57}}else{R=(f[v>>2]|0)+p|0;S=57}if((S|0)==57){S=0;f[G>>2]=R}J=J+1|0;I=f[g>>2]|0;if((J|0)>=(I|0))break;else H=Q}}}else{T=D;S=30}}else{T=X(B,e)|0;S=30}if((S|0)==30?(S=0,H=b+(T<<2)|0,I=c+(T<<2)|0,J=f[g>>2]|0,(J|0)>0):0){z=0;E=b+((X(A+-2|0,e)|0)<<2)|0;G=J;while(1){if((G|0)>0){J=0;do{p=f[E+(J<<2)>>2]|0;K=f[r>>2]|0;if((p|0)>(K|0)){F=f[s>>2]|0;f[F+(J<<2)>>2]=K;U=F}else{F=f[t>>2]|0;K=f[s>>2]|0;f[K+(J<<2)>>2]=(p|0)<(F|0)?F:p;U=K}J=J+1|0}while((J|0)<(f[g>>2]|0));V=U}else V=f[s>>2]|0;J=(f[H+(z<<2)>>2]|0)-(f[V+(z<<2)>>2]|0)|0;K=I+(z<<2)|0;f[K>>2]=J;if((J|0)>=(f[u>>2]|0)){if((J|0)>(f[w>>2]|0)){W=J-(f[v>>2]|0)|0;S=42}}else{W=(f[v>>2]|0)+J|0;S=42}if((S|0)==42){S=0;f[K>>2]=W}z=z+1|0;G=f[g>>2]|0;if((z|0)>=(G|0))break;else E=V}}if((A|0)<=2)break a;C=f[i>>2]|0;E=B+-1|0;if((f[l>>2]|0)-C>>2>>>0<=E>>>0)break;else{G=B;B=E;A=G}}aq(i)}while(0);if((e|0)>0)sj(j|0,0,e<<2|0)|0;e=f[g>>2]|0;if((e|0)<=0){Mq(k);Mq(j);return 1}i=a+16|0;A=a+32|0;B=a+12|0;C=a+28|0;l=a+20|0;V=a+24|0;a=0;W=j;U=e;while(1){if((U|0)>0){e=0;do{T=f[W+(e<<2)>>2]|0;Q=f[i>>2]|0;if((T|0)>(Q|0)){R=f[A>>2]|0;f[R+(e<<2)>>2]=Q;Y=R}else{R=f[B>>2]|0;Q=f[A>>2]|0;f[Q+(e<<2)>>2]=(T|0)<(R|0)?R:T;Y=Q}e=e+1|0}while((e|0)<(f[g>>2]|0));Z=Y}else Z=f[A>>2]|0;e=(f[b+(a<<2)>>2]|0)-(f[Z+(a<<2)>>2]|0)|0;Q=c+(a<<2)|0;f[Q>>2]=e;if((e|0)>=(f[C>>2]|0)){if((e|0)>(f[V>>2]|0)){_=e-(f[l>>2]|0)|0;S=72}}else{_=(f[l>>2]|0)+e|0;S=72}if((S|0)==72){S=0;f[Q>>2]=_}a=a+1|0;U=f[g>>2]|0;if((a|0)>=(U|0))break;else W=Z}Mq(k);Mq(j);return 1}function pc(a,b,c,d,e,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,Y=0,Z=0;g=a+8|0;Mh(g,b,d,e);d=f[a+48>>2]|0;h=f[a+52>>2]|0;i=e>>>0>1073741823?-1:e<<2;j=Lq(i)|0;sj(j|0,0,i|0)|0;k=Lq(i)|0;sj(k|0,0,i|0)|0;i=f[a+56>>2]|0;l=i+4|0;m=f[l>>2]|0;n=f[i>>2]|0;o=m-n|0;a:do if((o|0)>4){p=o>>2;q=(e|0)>0;r=a+16|0;s=a+32|0;t=a+12|0;u=a+28|0;v=a+20|0;w=a+24|0;x=d+64|0;y=d+28|0;z=e<<2;A=p+-1|0;if(m-n>>2>>>0>A>>>0){B=p;C=A;D=n}else aq(i);while(1){A=f[D+(C<<2)>>2]|0;if(q)sj(j|0,0,z|0)|0;if((A|0)!=-1){p=f[d>>2]|0;E=0;F=A;while(1){if(((f[p+(F>>>5<<2)>>2]&1<<(F&31)|0)==0?(G=f[(f[(f[x>>2]|0)+12>>2]|0)+(F<<2)>>2]|0,(G|0)!=-1):0)?(H=f[y>>2]|0,I=f[h>>2]|0,J=f[I+(f[H+(G<<2)>>2]<<2)>>2]|0,K=G+1|0,L=f[I+(f[H+((((K>>>0)%3|0|0)==0?G+-2|0:K)<<2)>>2]<<2)>>2]|0,K=f[I+(f[H+((((G>>>0)%3|0|0)==0?2:-1)+G<<2)>>2]<<2)>>2]|0,(J|0)<(C|0)&(L|0)<(C|0)&(K|0)<(C|0)):0){G=X(J,e)|0;J=X(L,e)|0;L=X(K,e)|0;if(q){K=0;do{f[k+(K<<2)>>2]=(f[b+(K+L<<2)>>2]|0)+(f[b+(K+J<<2)>>2]|0)-(f[b+(K+G<<2)>>2]|0);K=K+1|0}while((K|0)!=(e|0));if(q){K=0;do{G=j+(K<<2)|0;f[G>>2]=(f[G>>2]|0)+(f[k+(K<<2)>>2]|0);K=K+1|0}while((K|0)!=(e|0))}}M=E+1|0}else M=E;K=(((F>>>0)%3|0|0)==0?2:-1)+F|0;do if(((K|0)!=-1?(f[p+(K>>>5<<2)>>2]&1<<(K&31)|0)==0:0)?(G=f[(f[(f[x>>2]|0)+12>>2]|0)+(K<<2)>>2]|0,(G|0)!=-1):0)if(!((G>>>0)%3|0)){N=G+2|0;break}else{N=G+-1|0;break}else N=-1;while(0);F=(N|0)==(A|0)?-1:N;if((F|0)==-1)break;else E=M}E=X(C,e)|0;if(M){if(q){F=0;do{A=j+(F<<2)|0;f[A>>2]=(f[A>>2]|0)/(M|0)|0;F=F+1|0}while((F|0)!=(e|0))}F=b+(E<<2)|0;A=c+(E<<2)|0;p=f[g>>2]|0;if((p|0)>0){K=0;G=j;J=p;while(1){if((J|0)>0){p=0;do{L=f[G+(p<<2)>>2]|0;H=f[r>>2]|0;if((L|0)>(H|0)){I=f[s>>2]|0;f[I+(p<<2)>>2]=H;O=I}else{I=f[t>>2]|0;H=f[s>>2]|0;f[H+(p<<2)>>2]=(L|0)<(I|0)?I:L;O=H}p=p+1|0}while((p|0)<(f[g>>2]|0));P=O}else P=f[s>>2]|0;p=(f[F+(K<<2)>>2]|0)-(f[P+(K<<2)>>2]|0)|0;H=A+(K<<2)|0;f[H>>2]=p;if((p|0)>=(f[u>>2]|0)){if((p|0)>(f[w>>2]|0)){Q=p-(f[v>>2]|0)|0;R=55}}else{Q=(f[v>>2]|0)+p|0;R=55}if((R|0)==55){R=0;f[H>>2]=Q}K=K+1|0;J=f[g>>2]|0;if((K|0)>=(J|0))break;else G=P}}}else{S=E;R=28}}else{S=X(C,e)|0;R=28}if((R|0)==28?(R=0,G=b+(S<<2)|0,J=c+(S<<2)|0,K=f[g>>2]|0,(K|0)>0):0){A=0;F=b+((X(B+-2|0,e)|0)<<2)|0;H=K;while(1){if((H|0)>0){K=0;do{p=f[F+(K<<2)>>2]|0;L=f[r>>2]|0;if((p|0)>(L|0)){I=f[s>>2]|0;f[I+(K<<2)>>2]=L;T=I}else{I=f[t>>2]|0;L=f[s>>2]|0;f[L+(K<<2)>>2]=(p|0)<(I|0)?I:p;T=L}K=K+1|0}while((K|0)<(f[g>>2]|0));U=T}else U=f[s>>2]|0;K=(f[G+(A<<2)>>2]|0)-(f[U+(A<<2)>>2]|0)|0;L=J+(A<<2)|0;f[L>>2]=K;if((K|0)>=(f[u>>2]|0)){if((K|0)>(f[w>>2]|0)){V=K-(f[v>>2]|0)|0;R=40}}else{V=(f[v>>2]|0)+K|0;R=40}if((R|0)==40){R=0;f[L>>2]=V}A=A+1|0;H=f[g>>2]|0;if((A|0)>=(H|0))break;else F=U}}if((B|0)<=2)break a;D=f[i>>2]|0;F=C+-1|0;if((f[l>>2]|0)-D>>2>>>0<=F>>>0)break;else{H=C;C=F;B=H}}aq(i)}while(0);if((e|0)>0)sj(j|0,0,e<<2|0)|0;e=f[g>>2]|0;if((e|0)<=0){Mq(k);Mq(j);return 1}i=a+16|0;B=a+32|0;C=a+12|0;D=a+28|0;l=a+20|0;U=a+24|0;a=0;V=j;T=e;while(1){if((T|0)>0){e=0;do{S=f[V+(e<<2)>>2]|0;P=f[i>>2]|0;if((S|0)>(P|0)){Q=f[B>>2]|0;f[Q+(e<<2)>>2]=P;W=Q}else{Q=f[C>>2]|0;P=f[B>>2]|0;f[P+(e<<2)>>2]=(S|0)<(Q|0)?Q:S;W=P}e=e+1|0}while((e|0)<(f[g>>2]|0));Y=W}else Y=f[B>>2]|0;e=(f[b+(a<<2)>>2]|0)-(f[Y+(a<<2)>>2]|0)|0;P=c+(a<<2)|0;f[P>>2]=e;if((e|0)>=(f[D>>2]|0)){if((e|0)>(f[U>>2]|0)){Z=e-(f[l>>2]|0)|0;R=70}}else{Z=(f[l>>2]|0)+e|0;R=70}if((R|0)==70){R=0;f[P>>2]=Z}a=a+1|0;T=f[g>>2]|0;if((a|0)>=(T|0))break;else V=Y}Mq(k);Mq(j);return 1}function qc(a,b,c,d,e,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0;e=u;u=u+64|0;d=e+48|0;h=e+40|0;i=e+32|0;j=e+16|0;k=e+8|0;l=e;m=e+28|0;n=a+8|0;o=f[n>>2]|0;if((o+-2|0)>>>0<=28){f[a+72>>2]=o;p=1<<o;f[a+76>>2]=p+-1;o=p+-2|0;f[a+80>>2]=o;f[a+84>>2]=(o|0)/2|0}o=a+40|0;f[a+48>>2]=g;g=a+88|0;tk(g);p=a+36|0;q=f[p>>2]|0;r=(f[q+4>>2]|0)-(f[q>>2]|0)|0;s=r>>2;f[j>>2]=0;f[j+4>>2]=0;f[j+8>>2]=0;t=k;f[t>>2]=0;f[t+4>>2]=0;t=l;f[t>>2]=0;f[t+4>>2]=0;if((r|0)<=0){u=e;return 1}r=j+4|0;t=j+8|0;v=a+84|0;w=a+80|0;x=h+4|0;y=i+4|0;z=d+4|0;A=k+4|0;B=h+4|0;C=i+4|0;D=d+4|0;E=l+4|0;F=a+76|0;a=k+4|0;G=l+4|0;H=f[q>>2]|0;if((f[q+4>>2]|0)==(H|0)){J=q;aq(J)}else{K=0;L=H}while(1){f[m>>2]=f[L+(K<<2)>>2];f[d>>2]=f[m>>2];ic(o,d,j);H=f[j>>2]|0;q=(H|0)>-1?H:0-H|0;M=f[r>>2]|0;N=(M|0)>-1?M:0-M|0;O=Vn(N|0,((N|0)<0)<<31>>31|0,q|0,((q|0)<0)<<31>>31|0)|0;q=f[t>>2]|0;N=(q|0)>-1;P=N?q:0-q|0;q=Vn(O|0,I|0,P|0,((P|0)<0)<<31>>31|0)|0;P=I;if((q|0)==0&(P|0)==0){O=f[v>>2]|0;Q=O;R=j;S=M;T=O}else{O=f[v>>2]|0;U=((O|0)<0)<<31>>31;V=un(O|0,U|0,H|0,((H|0)<0)<<31>>31|0)|0;H=Ik(V|0,I|0,q|0,P|0)|0;f[j>>2]=H;V=un(O|0,U|0,M|0,((M|0)<0)<<31>>31|0)|0;M=Ik(V|0,I|0,q|0,P|0)|0;f[r>>2]=M;P=O-((H|0)>-1?H:0-H|0)-((M|0)>-1?M:0-M|0)|0;Q=N?P:0-P|0;R=t;S=M;T=O}f[R>>2]=Q;O=f[j>>2]|0;do if((O|0)<=-1){if((S|0)<0){M=f[t>>2]|0;W=(M|0)>-1?M:0-M|0;X=M}else{M=f[t>>2]|0;W=(f[w>>2]|0)-((M|0)>-1?M:0-M|0)|0;X=M}if((X|0)<0){Y=(S|0)>-1?S:0-S|0;Z=W;_=X;break}else{Y=(f[w>>2]|0)-((S|0)>-1?S:0-S|0)|0;Z=W;_=X;break}}else{M=f[t>>2]|0;Y=M+T|0;Z=T+S|0;_=M}while(0);M=(Z|0)==0;P=(Y|0)==0;N=f[w>>2]|0;do if(Y|Z){H=(N|0)==(Y|0);if(!(M&H)){q=(N|0)==(Z|0);if(!(P&q)){if(M&(T|0)<(Y|0)){$=0;aa=(T<<1)-Y|0;break}if(q&(T|0)>(Y|0)){$=Z;aa=(T<<1)-Y|0;break}if(H&(T|0)>(Z|0)){$=(T<<1)-Z|0;aa=Y;break}if(P){$=(T|0)<(Z|0)?(T<<1)-Z|0:Z;aa=0}else{$=Z;aa=Y}}else{$=Z;aa=Z}}else{$=Y;aa=Y}}else{$=N;aa=N}while(0);P=0-S|0;M=0-_|0;f[j>>2]=0-O;f[r>>2]=P;f[t>>2]=M;if((O|0)<1){ba=T-_|0;ca=T-S|0}else{H=(_|0)<1?M:_;M=(S|0)<1?P:S;ba=(_|0)>0?M:N-M|0;ca=(S|0)>0?H:N-H|0}H=(ca|0)==0;M=(ba|0)==0;do if(((ba|ca|0)!=0?(P=(N|0)==(ba|0),!(H&P)):0)?(q=(N|0)==(ca|0),!(M&q)):0){if(H&(T|0)<(ba|0)){da=0;ea=(T<<1)-ba|0;break}if(q&(T|0)>(ba|0)){da=N;ea=(T<<1)-ba|0;break}if(P&(T|0)>(ca|0)){da=(T<<1)-ca|0;ea=N;break}if(M){da=(T|0)<(ca|0)?(T<<1)-ca|0:ca;ea=0}else{da=ca;ea=ba}}else{da=N;ea=N}while(0);N=K<<1;M=b+(N<<2)|0;H=M+4|0;O=f[H>>2]|0;f[h>>2]=f[M>>2];f[x>>2]=O;f[i>>2]=$;f[y>>2]=aa;Od(d,n,h,i);O=f[d>>2]|0;f[k>>2]=O;P=f[z>>2]|0;f[A>>2]=P;q=f[H>>2]|0;f[h>>2]=f[M>>2];f[B>>2]=q;f[i>>2]=da;f[C>>2]=ea;Od(d,n,h,i);q=f[d>>2]|0;f[l>>2]=q;M=f[D>>2]|0;f[E>>2]=M;H=f[v>>2]|0;if((H|0)>=(O|0))if((O|0)<(0-H|0))fa=(f[F>>2]|0)+O|0;else fa=O;else fa=O-(f[F>>2]|0)|0;f[k>>2]=fa;if((H|0)>=(P|0))if((P|0)<(0-H|0))ga=(f[F>>2]|0)+P|0;else ga=P;else ga=P-(f[F>>2]|0)|0;f[a>>2]=ga;if((H|0)>=(q|0))if((q|0)<(0-H|0))ha=(f[F>>2]|0)+q|0;else ha=q;else ha=q-(f[F>>2]|0)|0;f[l>>2]=ha;if((H|0)>=(M|0))if((M|0)<(0-H|0))ia=(f[F>>2]|0)+M|0;else ia=M;else ia=M-(f[F>>2]|0)|0;f[G>>2]=ia;if((((ga|0)>-1?ga:0-ga|0)+((fa|0)>-1?fa:0-fa|0)|0)<(((ha|0)>-1?ha:0-ha|0)+((ia|0)>-1?ia:0-ia|0)|0)){fj(g,0);ja=k}else{fj(g,1);ja=l}M=f[ja>>2]|0;if((M|0)<0)ka=(f[F>>2]|0)+M|0;else ka=M;M=c+(N<<2)|0;f[M>>2]=ka;N=f[ja+4>>2]|0;if((N|0)<0)la=(f[F>>2]|0)+N|0;else la=N;f[M+4>>2]=la;K=K+1|0;if((K|0)>=(s|0)){ma=5;break}M=f[p>>2]|0;L=f[M>>2]|0;if((f[M+4>>2]|0)-L>>2>>>0<=K>>>0){J=M;ma=6;break}}if((ma|0)==5){u=e;return 1}else if((ma|0)==6)aq(J);return 0}function rc(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0;c=u;u=u+48|0;d=c+24|0;e=c+12|0;g=c;if(!b){h=0;u=c;return h|0}i=a+12|0;j=a+4|0;k=f[j>>2]|0;l=f[a>>2]|0;m=k-l>>2;n=a+16|0;o=f[n>>2]|0;p=f[i>>2]|0;q=o-p>>2;r=p;p=o;if(m>>>0<=q>>>0)if(m>>>0<q>>>0?(o=r+(m<<2)|0,(o|0)!=(p|0)):0){f[n>>2]=p+(~((p+-4-o|0)>>>2)<<2);s=l;t=k}else{s=l;t=k}else{Ch(i,m-q|0,6140);s=f[a>>2]|0;t=f[j>>2]|0}f[d>>2]=0;q=d+4|0;f[q>>2]=0;f[d+8>>2]=0;gk(d,t-s>>2);s=f[j>>2]|0;t=f[a>>2]|0;if((s|0)==(t|0)){v=s;w=s}else{m=f[d>>2]|0;k=m;l=k;o=0;p=s;s=k;k=t;t=m;while(1){m=f[k+(o<<2)>>2]|0;n=f[q>>2]|0;if(m>>>0<n-t>>2>>>0){x=l;y=s;z=k;A=p}else{r=m+1|0;f[e>>2]=0;B=n-t>>2;C=t;D=n;if(r>>>0<=B>>>0)if(r>>>0<B>>>0?(n=C+(r<<2)|0,(n|0)!=(D|0)):0){f[q>>2]=D+(~((D+-4-n|0)>>>2)<<2);E=l;F=p;G=k}else{E=l;F=p;G=k}else{Ch(d,r-B|0,e);E=f[d>>2]|0;F=f[j>>2]|0;G=f[a>>2]|0}x=E;y=E;z=G;A=F}B=y+(m<<2)|0;f[B>>2]=(f[B>>2]|0)+1;o=o+1|0;if(o>>>0>=A-z>>2>>>0){v=z;w=A;break}else{l=x;p=A;s=y;k=z;t=y}}}y=w-v|0;v=y>>2;f[e>>2]=0;w=e+4|0;f[w>>2]=0;f[e+8>>2]=0;if(!v){H=0;I=0}else{if(v>>>0>536870911)aq(e);t=ln(y<<1)|0;f[w>>2]=t;f[e>>2]=t;y=t+(v<<3)|0;f[e+8>>2]=y;z=v;v=t;k=t;while(1){s=v;f[s>>2]=-1;f[s+4>>2]=-1;s=k+8|0;A=z+-1|0;if(!A)break;else{z=A;v=s;k=s}}f[w>>2]=y;H=t;I=t}t=f[q>>2]|0;y=f[d>>2]|0;k=t-y|0;v=k>>2;f[g>>2]=0;z=g+4|0;f[z>>2]=0;f[g+8>>2]=0;s=y;do if(v)if(v>>>0>1073741823)aq(g);else{A=ln(k)|0;f[g>>2]=A;p=A+(v<<2)|0;f[g+8>>2]=p;sj(A|0,0,k|0)|0;f[z>>2]=p;J=A;K=p;L=A;break}else{J=0;K=0;L=0}while(0);if((t|0)!=(y|0)){y=0;t=0;while(1){f[J+(t<<2)>>2]=y;k=t+1|0;if(k>>>0<v>>>0){y=(f[s+(t<<2)>>2]|0)+y|0;t=k}else break}}t=f[j>>2]|0;j=f[a>>2]|0;y=j;if((t|0)!=(j|0)){k=a+40|0;a=t-j>>2;j=H;t=H;g=H;A=H;p=H;x=H;l=0;o=J;while(1){F=f[y+(l<<2)>>2]|0;G=l+1|0;E=((G>>>0)%3|0|0)==0?l+-2|0:G;if((E|0)==-1)M=-1;else M=f[y+(E<<2)>>2]|0;E=((l>>>0)%3|0|0)==0;G=(E?2:-1)+l|0;if((G|0)==-1)N=-1;else N=f[y+(G<<2)>>2]|0;if(E?(M|0)==(N|0)|((F|0)==(M|0)|(F|0)==(N|0)):0){f[k>>2]=(f[k>>2]|0)+1;O=j;P=t;Q=g;R=A;S=p;T=x;U=l+2|0;V=o}else W=51;a:do if((W|0)==51){W=0;E=f[s+(N<<2)>>2]|0;b:do if((E|0)>0){G=0;B=f[o+(N<<2)>>2]|0;while(1){m=f[p+(B<<3)>>2]|0;if((m|0)==-1){X=j;Y=t;Z=A;_=p;break b}if((m|0)==(M|0)){m=f[p+(B<<3)+4>>2]|0;if((m|0)==-1)$=-1;else $=f[y+(m<<2)>>2]|0;if((F|0)!=($|0))break}m=G+1|0;if((m|0)<(E|0)){G=m;B=B+1|0}else{X=j;Y=t;Z=A;_=p;break b}}m=f[A+(B<<3)+4>>2]|0;r=G;n=B;D=t;while(1){r=r+1|0;if((r|0)>=(E|0))break;C=n+1|0;f[D+(n<<3)>>2]=f[D+(C<<3)>>2];f[D+(n<<3)+4>>2]=f[D+(C<<3)+4>>2];if((f[j+(n<<3)>>2]|0)==-1)break;else{n=C;D=j}}f[g+(n<<3)>>2]=-1;if((m|0)==-1){X=g;Y=g;Z=g;_=g}else{D=f[i>>2]|0;f[D+(l<<2)>>2]=m;f[D+(m<<2)>>2]=l;O=g;P=g;Q=g;R=g;S=g;T=x;U=l;V=o;break a}}else{X=j;Y=t;Z=A;_=p}while(0);E=f[s+(M<<2)>>2]|0;if((E|0)>0){D=0;r=f[J+(M<<2)>>2]|0;while(1){aa=x+(r<<3)|0;if((f[aa>>2]|0)==-1)break;D=D+1|0;if((D|0)>=(E|0)){O=x;P=x;Q=x;R=x;S=x;T=x;U=l;V=J;break a}else r=r+1|0}f[aa>>2]=N;f[H+(r<<3)+4>>2]=l;O=H;P=H;Q=H;R=H;S=H;T=H;U=l;V=J}else{O=X;P=Y;Q=g;R=Z;S=_;T=x;U=l;V=o}}while(0);l=U+1|0;if(l>>>0>=a>>>0)break;else{j=O;t=P;g=Q;A=R;p=S;x=T;o=V}}}f[b>>2]=v;if(!J){ba=H;ca=I}else{if((K|0)!=(J|0))f[z>>2]=K+(~((K+-4-J|0)>>>2)<<2);Oq(L);L=f[e>>2]|0;ba=L;ca=L}if(ba|0){L=f[w>>2]|0;if((L|0)!=(ba|0))f[w>>2]=L+(~((L+-8-ba|0)>>>3)<<3);Oq(ca)}ca=f[d>>2]|0;if(ca|0){d=f[q>>2]|0;if((d|0)!=(ca|0))f[q>>2]=d+(~((d+-4-ca|0)>>>2)<<2);Oq(ca)}h=1;u=c;return h|0}function sc(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=Oa,S=Oa,T=Oa,U=0,V=0,X=0,Y=0,Z=0,_=0,aa=0,ba=0,ca=0,da=0,ea=0;e=u;u=u+48|0;g=e+12|0;h=e+35|0;i=e+32|0;j=e;k=g+16|0;f[g>>2]=0;f[g+4>>2]=0;f[g+8>>2]=0;f[g+12>>2]=0;n[k>>2]=$(1.0);l=a+80|0;m=f[l>>2]|0;f[j>>2]=0;o=j+4|0;f[o>>2]=0;f[j+8>>2]=0;if(m){if(m>>>0>1073741823)aq(j);p=m<<2;q=ln(p)|0;f[j>>2]=q;r=q+(m<<2)|0;f[j+8>>2]=r;sj(q|0,0,p|0)|0;f[o>>2]=r;r=f[d>>2]|0;d=c+48|0;p=c+40|0;q=i+1|0;m=i+2|0;s=g+4|0;t=g+12|0;v=g+8|0;w=a+40|0;x=a+64|0;y=0;z=0;while(1){A=d;B=f[A>>2]|0;C=f[A+4>>2]|0;A=p;D=un(f[A>>2]|0,f[A+4>>2]|0,r+y|0,0)|0;A=Vn(D|0,I|0,B|0,C|0)|0;C=(f[f[c>>2]>>2]|0)+A|0;b[h>>0]=b[C>>0]|0;b[h+1>>0]=b[C+1>>0]|0;b[h+2>>0]=b[C+2>>0]|0;im(i|0,C|0,3)|0;C=jg(g,i)|0;if(!C){A=b[i>>0]|0;B=b[q>>0]|0;D=b[m>>0]|0;E=((A&255^318)+239^B&255)+239^D&255;F=f[s>>2]|0;G=(F|0)==0;a:do if(!G){H=F+-1|0;J=(H&F|0)==0;if(!J)if(E>>>0<F>>>0)K=E;else K=(E>>>0)%(F>>>0)|0;else K=E&H;L=f[(f[g>>2]|0)+(K<<2)>>2]|0;if((L|0)!=0?(M=f[L>>2]|0,(M|0)!=0):0){if(J){J=M;while(1){L=f[J+4>>2]|0;if(!((L|0)==(E|0)|(L&H|0)==(K|0))){N=K;O=29;break a}L=J+8|0;if(((b[L>>0]|0)==A<<24>>24?(b[L+1>>0]|0)==B<<24>>24:0)?(b[L+2>>0]|0)==D<<24>>24:0)break a;J=f[J>>2]|0;if(!J){N=K;O=29;break a}}}else P=M;while(1){J=f[P+4>>2]|0;if((J|0)!=(E|0)){if(J>>>0<F>>>0)Q=J;else Q=(J>>>0)%(F>>>0)|0;if((Q|0)!=(K|0)){N=K;O=29;break a}}J=P+8|0;if(((b[J>>0]|0)==A<<24>>24?(b[J+1>>0]|0)==B<<24>>24:0)?(b[J+2>>0]|0)==D<<24>>24:0)break a;P=f[P>>2]|0;if(!P){N=K;O=29;break}}}else{N=K;O=29}}else{N=0;O=29}while(0);if((O|0)==29){O=0;M=ln(16)|0;b[M+8>>0]=A;b[M+9>>0]=B;b[M+10>>0]=D;f[M+12>>2]=z;f[M+4>>2]=E;f[M>>2]=0;R=$(((f[t>>2]|0)+1|0)>>>0);S=$(F>>>0);T=$(n[k>>2]);do if(G|$(T*S)<R){J=F<<1|(F>>>0<3|(F+-1&F|0)!=0)&1;H=~~$(W($(R/T)))>>>0;_h(g,J>>>0<H>>>0?H:J);J=f[s>>2]|0;H=J+-1|0;if(!(H&J)){U=J;V=H&E;break}if(E>>>0<J>>>0){U=J;V=E}else{U=J;V=(E>>>0)%(J>>>0)|0}}else{U=F;V=N}while(0);F=(f[g>>2]|0)+(V<<2)|0;E=f[F>>2]|0;if(!E){f[M>>2]=f[v>>2];f[v>>2]=M;f[F>>2]=v;F=f[M>>2]|0;if(F|0){G=f[F+4>>2]|0;F=U+-1|0;if(F&U)if(G>>>0<U>>>0)X=G;else X=(G>>>0)%(U>>>0)|0;else X=G&F;Y=(f[g>>2]|0)+(X<<2)|0;O=42}}else{f[M>>2]=f[E>>2];Y=E;O=42}if((O|0)==42){O=0;f[Y>>2]=M}f[t>>2]=(f[t>>2]|0)+1}E=w;F=f[E>>2]|0;G=un(F|0,f[E+4>>2]|0,z|0,0)|0;kh((f[f[x>>2]>>2]|0)+G|0,h|0,F|0)|0;F=f[j>>2]|0;f[F+(y<<2)>>2]=z;Z=z+1|0;_=F}else{F=f[j>>2]|0;f[F+(y<<2)>>2]=f[C+12>>2];Z=z;_=F}y=y+1|0;aa=f[l>>2]|0;if(y>>>0>=aa>>>0)break;else z=Z}if((Z|0)==(aa|0))ba=_;else{z=a+84|0;if(!(b[z>>0]|0)){y=f[a+72>>2]|0;h=f[a+68>>2]|0;x=h;if((y|0)==(h|0))ca=_;else{w=y-h>>2;h=0;do{y=x+(h<<2)|0;f[y>>2]=f[_+(f[y>>2]<<2)>>2];h=h+1|0}while(h>>>0<w>>>0);ca=_}}else{b[z>>0]=0;z=a+68|0;_=a+72|0;w=f[_>>2]|0;h=f[z>>2]|0;x=w-h>>2;y=h;h=w;if(aa>>>0<=x>>>0)if(aa>>>0<x>>>0?(w=y+(aa<<2)|0,(w|0)!=(h|0)):0){f[_>>2]=h+(~((h+-4-w|0)>>>2)<<2);da=aa}else da=aa;else{Ch(z,aa-x|0,1220);da=f[l>>2]|0}x=f[j>>2]|0;if(!da)ca=x;else{j=f[a+68>>2]|0;a=0;do{f[j+(a<<2)>>2]=f[x+(a<<2)>>2];a=a+1|0}while(a>>>0<da>>>0);ca=x}}f[l>>2]=Z;ba=ca}if(!ba)ea=Z;else{ca=f[o>>2]|0;if((ca|0)!=(ba|0))f[o>>2]=ca+(~((ca+-4-ba|0)>>>2)<<2);Oq(ba);ea=Z}}else ea=0;Z=f[g+8>>2]|0;if(Z|0){ba=Z;do{Z=ba;ba=f[ba>>2]|0;Oq(Z)}while((ba|0)!=0)}ba=f[g>>2]|0;f[g>>2]=0;if(!ba){u=e;return ea|0}Oq(ba);u=e;return ea|0}function tc(a,b,c,d,e,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0;e=u;u=u+64|0;d=e+48|0;h=e+40|0;i=e+32|0;j=e+16|0;k=e+8|0;l=e;m=e+28|0;n=a+8|0;o=f[n>>2]|0;if((o+-2|0)>>>0<=28){f[a+72>>2]=o;p=1<<o;f[a+76>>2]=p+-1;o=p+-2|0;f[a+80>>2]=o;f[a+84>>2]=(o|0)/2|0}o=a+40|0;f[a+48>>2]=g;g=a+88|0;tk(g);p=a+36|0;q=f[p>>2]|0;r=(f[q+4>>2]|0)-(f[q>>2]|0)|0;s=r>>2;f[j>>2]=0;f[j+4>>2]=0;f[j+8>>2]=0;t=k;f[t>>2]=0;f[t+4>>2]=0;t=l;f[t>>2]=0;f[t+4>>2]=0;if((r|0)<=0){u=e;return 1}r=j+4|0;t=j+8|0;v=a+84|0;w=a+80|0;x=h+4|0;y=i+4|0;z=d+4|0;A=k+4|0;B=h+4|0;C=i+4|0;D=d+4|0;E=l+4|0;F=a+76|0;a=k+4|0;G=l+4|0;H=f[q>>2]|0;if((f[q+4>>2]|0)==(H|0)){J=q;aq(J)}else{K=0;L=H}while(1){f[m>>2]=f[L+(K<<2)>>2];f[d>>2]=f[m>>2];$b(o,d,j);H=f[j>>2]|0;q=(H|0)>-1?H:0-H|0;M=f[r>>2]|0;N=(M|0)>-1?M:0-M|0;O=Vn(N|0,((N|0)<0)<<31>>31|0,q|0,((q|0)<0)<<31>>31|0)|0;q=f[t>>2]|0;N=(q|0)>-1;P=N?q:0-q|0;q=Vn(O|0,I|0,P|0,((P|0)<0)<<31>>31|0)|0;P=I;if((q|0)==0&(P|0)==0){O=f[v>>2]|0;Q=O;R=j;S=M;T=O}else{O=f[v>>2]|0;U=((O|0)<0)<<31>>31;V=un(O|0,U|0,H|0,((H|0)<0)<<31>>31|0)|0;H=Ik(V|0,I|0,q|0,P|0)|0;f[j>>2]=H;V=un(O|0,U|0,M|0,((M|0)<0)<<31>>31|0)|0;M=Ik(V|0,I|0,q|0,P|0)|0;f[r>>2]=M;P=O-((H|0)>-1?H:0-H|0)-((M|0)>-1?M:0-M|0)|0;Q=N?P:0-P|0;R=t;S=M;T=O}f[R>>2]=Q;O=f[j>>2]|0;do if((O|0)<=-1){if((S|0)<0){M=f[t>>2]|0;W=(M|0)>-1?M:0-M|0;X=M}else{M=f[t>>2]|0;W=(f[w>>2]|0)-((M|0)>-1?M:0-M|0)|0;X=M}if((X|0)<0){Y=(S|0)>-1?S:0-S|0;Z=W;_=X;break}else{Y=(f[w>>2]|0)-((S|0)>-1?S:0-S|0)|0;Z=W;_=X;break}}else{M=f[t>>2]|0;Y=M+T|0;Z=T+S|0;_=M}while(0);M=(Z|0)==0;P=(Y|0)==0;N=f[w>>2]|0;do if(Y|Z){H=(N|0)==(Y|0);if(!(M&H)){q=(N|0)==(Z|0);if(!(P&q)){if(M&(T|0)<(Y|0)){$=0;aa=(T<<1)-Y|0;break}if(q&(T|0)>(Y|0)){$=Z;aa=(T<<1)-Y|0;break}if(H&(T|0)>(Z|0)){$=(T<<1)-Z|0;aa=Y;break}if(P){$=(T|0)<(Z|0)?(T<<1)-Z|0:Z;aa=0}else{$=Z;aa=Y}}else{$=Z;aa=Z}}else{$=Y;aa=Y}}else{$=N;aa=N}while(0);P=0-S|0;M=0-_|0;f[j>>2]=0-O;f[r>>2]=P;f[t>>2]=M;if((O|0)<1){ba=T-_|0;ca=T-S|0}else{H=(_|0)<1?M:_;M=(S|0)<1?P:S;ba=(_|0)>0?M:N-M|0;ca=(S|0)>0?H:N-H|0}H=(ca|0)==0;M=(ba|0)==0;do if(((ba|ca|0)!=0?(P=(N|0)==(ba|0),!(H&P)):0)?(q=(N|0)==(ca|0),!(M&q)):0){if(H&(T|0)<(ba|0)){da=0;ea=(T<<1)-ba|0;break}if(q&(T|0)>(ba|0)){da=N;ea=(T<<1)-ba|0;break}if(P&(T|0)>(ca|0)){da=(T<<1)-ca|0;ea=N;break}if(M){da=(T|0)<(ca|0)?(T<<1)-ca|0:ca;ea=0}else{da=ca;ea=ba}}else{da=N;ea=N}while(0);N=K<<1;M=b+(N<<2)|0;H=M+4|0;O=f[H>>2]|0;f[h>>2]=f[M>>2];f[x>>2]=O;f[i>>2]=$;f[y>>2]=aa;Od(d,n,h,i);O=f[d>>2]|0;f[k>>2]=O;P=f[z>>2]|0;f[A>>2]=P;q=f[H>>2]|0;f[h>>2]=f[M>>2];f[B>>2]=q;f[i>>2]=da;f[C>>2]=ea;Od(d,n,h,i);q=f[d>>2]|0;f[l>>2]=q;M=f[D>>2]|0;f[E>>2]=M;H=f[v>>2]|0;if((H|0)>=(O|0))if((O|0)<(0-H|0))fa=(f[F>>2]|0)+O|0;else fa=O;else fa=O-(f[F>>2]|0)|0;f[k>>2]=fa;if((H|0)>=(P|0))if((P|0)<(0-H|0))ga=(f[F>>2]|0)+P|0;else ga=P;else ga=P-(f[F>>2]|0)|0;f[a>>2]=ga;if((H|0)>=(q|0))if((q|0)<(0-H|0))ha=(f[F>>2]|0)+q|0;else ha=q;else ha=q-(f[F>>2]|0)|0;f[l>>2]=ha;if((H|0)>=(M|0))if((M|0)<(0-H|0))ia=(f[F>>2]|0)+M|0;else ia=M;else ia=M-(f[F>>2]|0)|0;f[G>>2]=ia;if((((ga|0)>-1?ga:0-ga|0)+((fa|0)>-1?fa:0-fa|0)|0)<(((ha|0)>-1?ha:0-ha|0)+((ia|0)>-1?ia:0-ia|0)|0)){fj(g,0);ja=k}else{fj(g,1);ja=l}M=f[ja>>2]|0;if((M|0)<0)ka=(f[F>>2]|0)+M|0;else ka=M;M=c+(N<<2)|0;f[M>>2]=ka;N=f[ja+4>>2]|0;if((N|0)<0)la=(f[F>>2]|0)+N|0;else la=N;f[M+4>>2]=la;K=K+1|0;if((K|0)>=(s|0)){ma=5;break}M=f[p>>2]|0;L=f[M>>2]|0;if((f[M+4>>2]|0)-L>>2>>>0<=K>>>0){J=M;ma=6;break}}if((ma|0)==5){u=e;return 1}else if((ma|0)==6)aq(J);return 0}function uc(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=Oa,T=Oa,U=Oa,V=0,X=0,Y=0,Z=0,_=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0;e=u;u=u+64|0;g=e+36|0;h=e+24|0;i=e+12|0;j=e;k=g+16|0;f[g>>2]=0;f[g+4>>2]=0;f[g+8>>2]=0;f[g+12>>2]=0;n[k>>2]=$(1.0);l=a+80|0;m=f[l>>2]|0;f[j>>2]=0;o=j+4|0;f[o>>2]=0;f[j+8>>2]=0;if(m){if(m>>>0>1073741823)aq(j);p=m<<2;q=ln(p)|0;f[j>>2]=q;r=q+(m<<2)|0;f[j+8>>2]=r;sj(q|0,0,p|0)|0;f[o>>2]=r;r=f[d>>2]|0;d=c+48|0;p=c+40|0;q=i+4|0;m=i+8|0;s=g+4|0;t=g+12|0;v=g+8|0;w=a+40|0;x=a+64|0;y=0;z=0;while(1){A=d;B=f[A>>2]|0;C=f[A+4>>2]|0;A=p;D=un(f[A>>2]|0,f[A+4>>2]|0,r+z|0,0)|0;A=Vn(D|0,I|0,B|0,C|0)|0;C=(f[f[c>>2]>>2]|0)+A|0;A=h;B=C;D=A+12|0;do{b[A>>0]=b[B>>0]|0;A=A+1|0;B=B+1|0}while((A|0)<(D|0));im(i|0,C|0,12)|0;B=qg(g,i)|0;if(!B){A=f[i>>2]|0;D=f[q>>2]|0;E=f[m>>2]|0;F=((A^318)+239^D)+239^E;G=f[s>>2]|0;H=(G|0)==0;a:do if(!H){J=G+-1|0;K=(J&G|0)==0;if(!K)if(F>>>0<G>>>0)L=F;else L=(F>>>0)%(G>>>0)|0;else L=F&J;M=f[(f[g>>2]|0)+(L<<2)>>2]|0;if((M|0)!=0?(N=f[M>>2]|0,(N|0)!=0):0){if(K){K=N;while(1){M=f[K+4>>2]|0;if(!((M|0)==(F|0)|(M&J|0)==(L|0))){O=L;P=29;break a}if(((f[K+8>>2]|0)==(A|0)?(f[K+12>>2]|0)==(D|0):0)?(f[K+16>>2]|0)==(E|0):0)break a;K=f[K>>2]|0;if(!K){O=L;P=29;break a}}}else Q=N;while(1){K=f[Q+4>>2]|0;if((K|0)!=(F|0)){if(K>>>0<G>>>0)R=K;else R=(K>>>0)%(G>>>0)|0;if((R|0)!=(L|0)){O=L;P=29;break a}}if(((f[Q+8>>2]|0)==(A|0)?(f[Q+12>>2]|0)==(D|0):0)?(f[Q+16>>2]|0)==(E|0):0)break a;Q=f[Q>>2]|0;if(!Q){O=L;P=29;break}}}else{O=L;P=29}}else{O=0;P=29}while(0);if((P|0)==29){P=0;C=ln(24)|0;f[C+8>>2]=A;f[C+12>>2]=D;f[C+16>>2]=E;f[C+20>>2]=y;f[C+4>>2]=F;f[C>>2]=0;S=$(((f[t>>2]|0)+1|0)>>>0);T=$(G>>>0);U=$(n[k>>2]);do if(H|$(U*T)<S){N=G<<1|(G>>>0<3|(G+-1&G|0)!=0)&1;K=~~$(W($(S/U)))>>>0;Xh(g,N>>>0<K>>>0?K:N);N=f[s>>2]|0;K=N+-1|0;if(!(K&N)){V=N;X=K&F;break}if(F>>>0<N>>>0){V=N;X=F}else{V=N;X=(F>>>0)%(N>>>0)|0}}else{V=G;X=O}while(0);G=(f[g>>2]|0)+(X<<2)|0;F=f[G>>2]|0;if(!F){f[C>>2]=f[v>>2];f[v>>2]=C;f[G>>2]=v;G=f[C>>2]|0;if(G|0){H=f[G+4>>2]|0;G=V+-1|0;if(G&V)if(H>>>0<V>>>0)Y=H;else Y=(H>>>0)%(V>>>0)|0;else Y=H&G;Z=(f[g>>2]|0)+(Y<<2)|0;P=42}}else{f[C>>2]=f[F>>2];Z=F;P=42}if((P|0)==42){P=0;f[Z>>2]=C}f[t>>2]=(f[t>>2]|0)+1}F=w;G=f[F>>2]|0;H=un(G|0,f[F+4>>2]|0,y|0,0)|0;kh((f[f[x>>2]>>2]|0)+H|0,h|0,G|0)|0;G=f[j>>2]|0;f[G+(z<<2)>>2]=y;_=y+1|0;aa=G}else{G=f[j>>2]|0;f[G+(z<<2)>>2]=f[B+20>>2];_=y;aa=G}z=z+1|0;ba=f[l>>2]|0;if(z>>>0>=ba>>>0)break;else y=_}if((_|0)==(ba|0))ca=aa;else{y=a+84|0;if(!(b[y>>0]|0)){z=f[a+72>>2]|0;h=f[a+68>>2]|0;x=h;if((z|0)==(h|0))da=aa;else{w=z-h>>2;h=0;do{z=x+(h<<2)|0;f[z>>2]=f[aa+(f[z>>2]<<2)>>2];h=h+1|0}while(h>>>0<w>>>0);da=aa}}else{b[y>>0]=0;y=a+68|0;aa=a+72|0;w=f[aa>>2]|0;h=f[y>>2]|0;x=w-h>>2;z=h;h=w;if(ba>>>0<=x>>>0)if(ba>>>0<x>>>0?(w=z+(ba<<2)|0,(w|0)!=(h|0)):0){f[aa>>2]=h+(~((h+-4-w|0)>>>2)<<2);ea=ba}else ea=ba;else{Ch(y,ba-x|0,1220);ea=f[l>>2]|0}x=f[j>>2]|0;if(!ea)da=x;else{j=f[a+68>>2]|0;a=0;do{f[j+(a<<2)>>2]=f[x+(a<<2)>>2];a=a+1|0}while(a>>>0<ea>>>0);da=x}}f[l>>2]=_;ca=da}if(!ca)fa=_;else{da=f[o>>2]|0;if((da|0)!=(ca|0))f[o>>2]=da+(~((da+-4-ca|0)>>>2)<<2);Oq(ca);fa=_}}else fa=0;_=f[g+8>>2]|0;if(_|0){ca=_;do{_=ca;ca=f[ca>>2]|0;Oq(_)}while((ca|0)!=0)}ca=f[g>>2]|0;f[g>>2]=0;if(!ca){u=e;return fa|0}Oq(ca);u=e;return fa|0}\nfunction di(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;d=u;u=u+16|0;e=d;Je(e,a+40|0,f[a+8>>2]|0,b,c);gj(a,e);a=f[e>>2]|0;f[e>>2]=0;if(!a){u=d;return 1}e=a+88|0;c=f[e>>2]|0;f[e>>2]=0;if(c|0){e=f[c+8>>2]|0;if(e|0){b=c+12|0;if((f[b>>2]|0)!=(e|0))f[b>>2]=e;Oq(e)}Oq(c)}c=f[a+68>>2]|0;if(c|0){e=a+72|0;b=f[e>>2]|0;if((b|0)!=(c|0))f[e>>2]=b+(~((b+-4-c|0)>>>2)<<2);Oq(c)}c=a+64|0;b=f[c>>2]|0;f[c>>2]=0;if(b|0){c=f[b>>2]|0;if(c|0){e=b+4|0;if((f[e>>2]|0)!=(c|0))f[e>>2]=c;Oq(c)}Oq(b)}Oq(a);u=d;return 1}function ei(a,b){a=a|0;b=b|0;var c=0,d=Oa,e=0,g=0;if((b|0)!=1)if(!(b+-1&b))c=b;else c=cb(b)|0;else c=2;b=f[a+4>>2]|0;if(c>>>0>b>>>0){Bd(a,c);return}if(c>>>0>=b>>>0)return;d=$((f[a+12>>2]|0)>>>0);e=~~$(W($(d/$(n[a+16>>2]))))>>>0;if(b>>>0>2&(b+-1&b|0)==0)g=1<<32-(_(e+-1|0)|0);else g=cb(e)|0;e=c>>>0<g>>>0?g:c;if(e>>>0>=b>>>0)return;Bd(a,e);return}function fi(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0;e=u;u=u+48|0;g=e;h=e+32|0;if(!c){i=0;u=e;return i|0}Gn(g);if((dm(c,0)|0)!=-1?Qa[f[(f[c>>2]|0)+16>>2]&127](c)|0:0){Va[f[(f[c>>2]|0)+20>>2]&127](c);ch(h,a,c,g);c=(f[h>>2]|0)==0;a=h+4|0;if((b[a+11>>0]|0)<0)Oq(f[a>>2]|0);if(c){c=f[g>>2]|0;a=g+4|0;rg(d,c,c+((f[a>>2]|0)-c)|0);j=(f[a>>2]|0)-(f[g>>2]|0)|0}else j=0}else j=0;a=g+12|0;c=f[a>>2]|0;f[a>>2]=0;if(c|0)Oq(c);c=f[g>>2]|0;if(c|0){a=g+4|0;if((f[a>>2]|0)!=(c|0))f[a>>2]=c;Oq(c)}i=j;u=e;return i|0}function gi(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;d=u;u=u+16|0;e=d;Fe(e,a+40|0,f[a+8>>2]|0,b,c);gj(a,e);a=f[e>>2]|0;f[e>>2]=0;if(!a){u=d;return 1}e=a+88|0;c=f[e>>2]|0;f[e>>2]=0;if(c|0){e=f[c+8>>2]|0;if(e|0){b=c+12|0;if((f[b>>2]|0)!=(e|0))f[b>>2]=e;Oq(e)}Oq(c)}c=f[a+68>>2]|0;if(c|0){e=a+72|0;b=f[e>>2]|0;if((b|0)!=(c|0))f[e>>2]=b+(~((b+-4-c|0)>>>2)<<2);Oq(c)}c=a+64|0;b=f[c>>2]|0;f[c>>2]=0;if(b|0){c=f[b>>2]|0;if(c|0){e=b+4|0;if((f[e>>2]|0)!=(c|0))f[e>>2]=c;Oq(c)}Oq(b)}Oq(a);u=d;return 1}function hi(a){a=a|0;var b=0,c=0,d=0,e=0,g=0,h=0,i=0,j=0;b=f[a>>2]|0;if(!b)return;c=a+4|0;d=f[c>>2]|0;if((d|0)==(b|0))e=b;else{g=d;do{d=g+-4|0;f[c>>2]=d;h=f[d>>2]|0;f[d>>2]=0;if(h|0){d=h+88|0;i=f[d>>2]|0;f[d>>2]=0;if(i|0){d=f[i+8>>2]|0;if(d|0){j=i+12|0;if((f[j>>2]|0)!=(d|0))f[j>>2]=d;Oq(d)}Oq(i)}i=f[h+68>>2]|0;if(i|0){d=h+72|0;j=f[d>>2]|0;if((j|0)!=(i|0))f[d>>2]=j+(~((j+-4-i|0)>>>2)<<2);Oq(i)}i=h+64|0;j=f[i>>2]|0;f[i>>2]=0;if(j|0){i=f[j>>2]|0;if(i|0){d=j+4|0;if((f[d>>2]|0)!=(i|0))f[d>>2]=i;Oq(i)}Oq(j)}Oq(h)}g=f[c>>2]|0}while((g|0)!=(b|0));e=f[a>>2]|0}Oq(e);return}function ii(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;d=u;u=u+16|0;e=d+4|0;g=d;h=d+8|0;if(!(Ie(a,c)|0)){i=0;u=d;return i|0}j=a+36|0;k=a+40|0;a=f[j>>2]|0;if((f[k>>2]|0)==(a|0)){i=1;u=d;return i|0}l=c+16|0;m=c+4|0;n=h+1|0;o=0;p=a;do{a=f[p+(o<<2)>>2]|0;q=Qa[f[(f[a>>2]|0)+32>>2]&127](a)|0;b[h>>0]=q;q=l;a=f[q+4>>2]|0;if(!((a|0)>0|(a|0)==0&(f[q>>2]|0)>>>0>0)){f[g>>2]=f[m>>2];f[e>>2]=f[g>>2];Me(c,e,h,n)|0}o=o+1|0;p=f[j>>2]|0}while(o>>>0<(f[k>>2]|0)-p>>2>>>0);i=1;u=d;return i|0}function ji(a){a=a|0;var c=0,d=0,e=0,g=0,h=0,i=0;c=u;u=u+16|0;d=c;lp(a);f[a+16>>2]=0;f[a+20>>2]=0;f[a+12>>2]=a+16;e=a+24|0;lp(e);f[d>>2]=0;f[d+4>>2]=0;f[d+8>>2]=0;a=ln(32)|0;f[d>>2]=a;f[d+8>>2]=-2147483616;f[d+4>>2]=20;g=a;h=14538;i=g+20|0;do{b[g>>0]=b[h>>0]|0;g=g+1|0;h=h+1|0}while((g|0)<(i|0));b[a+20>>0]=0;Vj(e,d,1);if((b[d+11>>0]|0)<0)Oq(f[d>>2]|0);f[d>>2]=0;f[d+4>>2]=0;f[d+8>>2]=0;a=ln(32)|0;f[d>>2]=a;f[d+8>>2]=-2147483616;f[d+4>>2]=22;g=a;h=14559;i=g+22|0;do{b[g>>0]=b[h>>0]|0;g=g+1|0;h=h+1|0}while((g|0)<(i|0));b[a+22>>0]=0;Vj(e,d,1);if((b[d+11>>0]|0)>=0){u=c;return}Oq(f[d>>2]|0);u=c;return}function ki(a){a=a|0;var b=0,c=0,d=0,e=0,g=0,h=0,i=0;b=f[a+4>>2]|0;c=a+8|0;d=f[c>>2]|0;if((d|0)!=(b|0)){e=d;do{d=e+-4|0;f[c>>2]=d;g=f[d>>2]|0;f[d>>2]=0;if(g|0){d=g+88|0;h=f[d>>2]|0;f[d>>2]=0;if(h|0){d=f[h+8>>2]|0;if(d|0){i=h+12|0;if((f[i>>2]|0)!=(d|0))f[i>>2]=d;Oq(d)}Oq(h)}h=f[g+68>>2]|0;if(h|0){d=g+72|0;i=f[d>>2]|0;if((i|0)!=(h|0))f[d>>2]=i+(~((i+-4-h|0)>>>2)<<2);Oq(h)}h=g+64|0;i=f[h>>2]|0;f[h>>2]=0;if(i|0){h=f[i>>2]|0;if(h|0){d=i+4|0;if((f[d>>2]|0)!=(h|0))f[d>>2]=h;Oq(h)}Oq(i)}Oq(g)}e=f[c>>2]|0}while((e|0)!=(b|0))}b=f[a>>2]|0;if(!b)return;Oq(b);return}function li(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;c=u;u=u+16|0;d=c+8|0;e=c+4|0;g=c;f[g>>2]=f[a+12>>2];h=b+16|0;i=h;j=f[i>>2]|0;k=f[i+4>>2]|0;if((k|0)>0|(k|0)==0&j>>>0>0){l=k;m=j}else{f[e>>2]=f[b+4>>2];f[d>>2]=f[e>>2];Me(b,d,g,g+4|0)|0;j=h;l=f[j+4>>2]|0;m=f[j>>2]|0}f[g>>2]=f[a+20>>2];if((l|0)>0|(l|0)==0&m>>>0>0){u=c;return 1}f[e>>2]=f[b+4>>2];f[d>>2]=f[e>>2];Me(b,d,g,g+4|0)|0;u=c;return 1}function mi(a){a=a|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;c=u;u=u+16|0;d=c;e=ln(16)|0;f[d>>2]=e;f[d+8>>2]=-2147483632;f[d+4>>2]=14;g=e;h=14408;i=g+14|0;do{b[g>>0]=b[h>>0]|0;g=g+1|0;h=h+1|0}while((g|0)<(i|0));b[e+14>>0]=0;e=Hk(a,d,-1)|0;if((b[d+11>>0]|0)<0)Oq(f[d>>2]|0);j=ln(16)|0;f[d>>2]=j;f[d+8>>2]=-2147483632;f[d+4>>2]=14;g=j;h=14423;i=g+14|0;do{b[g>>0]=b[h>>0]|0;g=g+1|0;h=h+1|0}while((g|0)<(i|0));b[j+14>>0]=0;j=Hk(a,d,-1)|0;if((b[d+11>>0]|0)>=0){k=(e|0)<(j|0);l=k?j:e;m=(l|0)==-1;n=m?5:l;u=c;return n|0}Oq(f[d>>2]|0);k=(e|0)<(j|0);l=k?j:e;m=(l|0)==-1;n=m?5:l;u=c;return n|0}function ni(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;c=u;u=u+16|0;d=c+8|0;e=c+4|0;g=c;f[g>>2]=f[a+12>>2];h=b+16|0;i=h;j=f[i>>2]|0;k=f[i+4>>2]|0;if((k|0)>0|(k|0)==0&j>>>0>0){l=k;m=j}else{f[e>>2]=f[b+4>>2];f[d>>2]=f[e>>2];Me(b,d,g,g+4|0)|0;j=h;l=f[j+4>>2]|0;m=f[j>>2]|0}f[g>>2]=f[a+16>>2];if((l|0)>0|(l|0)==0&m>>>0>0){u=c;return 1}f[e>>2]=f[b+4>>2];f[d>>2]=f[e>>2];Me(b,d,g,g+4|0)|0;u=c;return 1}function oi(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;g=ln(32)|0;f[a>>2]=g;f[a+4>>2]=c+8;c=a+8|0;b[c>>0]=0;h=g+8|0;f[h>>2]=f[e>>2];f[h+4>>2]=f[e+4>>2];f[h+8>>2]=f[e+8>>2];f[e>>2]=0;f[e+4>>2]=0;f[e+8>>2]=0;h=g+20|0;i=e+12|0;f[h>>2]=0;f[g+24>>2]=0;f[g+28>>2]=0;g=e+16|0;e=f[g>>2]|0;j=f[i>>2]|0;k=e-j|0;if(!k){l=j;m=e;n=0}else{Fi(h,k);l=f[i>>2]|0;m=f[g>>2]|0;n=f[h>>2]|0}kh(n|0,l|0,m-l|0)|0;b[c>>0]=1;c=f[a>>2]|0;f[c+4>>2]=d;f[c>>2]=0;return}function pi(a){a=a|0;var b=0,c=0,d=0,e=0,g=0,h=0,i=0,j=0;b=a+32|0;ld(a,b);c=a+80|0;d=f[c>>2]|0;if((d|0?(e=a+84|0,(f[e>>2]|0)>0):0)?(ld(d,b),(f[e>>2]|0)>1):0){d=1;do{ld((f[c>>2]|0)+(d<<5)|0,b);d=d+1|0}while((d|0)<(f[e>>2]|0))}e=a+136|0;d=a+140|0;a=f[e>>2]|0;if((f[d>>2]|0)==(a|0))return;c=0;g=a;while(1){a=g;ci((f[a+(c*12|0)+4>>2]|0)-(f[a+(c*12|0)>>2]|0)>>2,b)|0;a=f[e>>2]|0;h=f[a+(c*12|0)>>2]|0;i=(f[a+(c*12|0)+4>>2]|0)-h>>2;if(!i)j=a;else{Mc(h,i,1,0,b)|0;j=f[e>>2]|0}c=c+1|0;if(c>>>0>=(((f[d>>2]|0)-j|0)/12|0)>>>0)break;else g=j}return}function qi(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;e=d+16|0;g=f[e>>2]|0;if(!g)if(!(vl(d)|0)){h=f[e>>2]|0;i=5}else j=0;else{h=g;i=5}a:do if((i|0)==5){g=d+20|0;e=f[g>>2]|0;k=e;if((h-e|0)>>>0<c>>>0){j=Sa[f[d+36>>2]&31](d,a,c)|0;break}b:do if((b[d+75>>0]|0)>-1){e=c;while(1){if(!e){l=0;m=a;n=c;o=k;break b}p=e+-1|0;if((b[a+p>>0]|0)==10)break;else e=p}p=Sa[f[d+36>>2]&31](d,a,e)|0;if(p>>>0<e>>>0){j=p;break a}l=e;m=a+e|0;n=c-e|0;o=f[g>>2]|0}else{l=0;m=a;n=c;o=k}while(0);kh(o|0,m|0,n|0)|0;f[g>>2]=(f[g>>2]|0)+n;j=l+n|0}while(0);return j|0}function ri(a){a=a|0;var c=0,d=0,e=0,g=0,h=0,i=0;c=a+12|0;d=f[c>>2]|0;f[c>>2]=0;if(d|0){c=f[d+28>>2]|0;if(c|0){e=c;do{c=e;e=f[e>>2]|0;ri(c+8|0);Oq(c)}while((e|0)!=0)}e=d+20|0;c=f[e>>2]|0;f[e>>2]=0;if(c|0)Oq(c);c=f[d+8>>2]|0;if(c|0){e=c;do{c=e;e=f[e>>2]|0;g=c+8|0;h=f[c+20>>2]|0;if(h|0){i=c+24|0;if((f[i>>2]|0)!=(h|0))f[i>>2]=h;Oq(h)}if((b[g+11>>0]|0)<0)Oq(f[g>>2]|0);Oq(c)}while((e|0)!=0)}e=f[d>>2]|0;f[d>>2]=0;if(e|0)Oq(e);Oq(d)}if((b[a+11>>0]|0)>=0)return;Oq(f[a>>2]|0);return}function si(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,o=0;g=u;u=u+32|0;h=g+12|0;i=g;f[h>>2]=0;f[h+4>>2]=0;f[h+8>>2]=0;if((e|0)>0){j=i+11|0;k=i+4|0;l=0;do{if((l|0)>0)An(h,14477)|0;il(i,$(n[d+(l<<2)>>2]));m=b[j>>0]|0;o=m<<24>>24<0;lj(h,o?f[i>>2]|0:i,o?f[k>>2]|0:m&255)|0;if((b[j>>0]|0)<0)Oq(f[i>>2]|0);l=l+1|0}while((l|0)<(e|0))}am(Ai(a,c)|0,h)|0;if((b[h+11>>0]|0)>=0){u=g;return}Oq(f[h>>2]|0);u=g;return}function ti(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;c=u;u=u+16|0;d=c;if((Qa[f[(f[b>>2]|0)+20>>2]&127](b)|0)<=0){e=1;u=c;return e|0}g=a+4|0;h=a+20|0;i=a+24|0;j=a+16|0;a=0;while(1){k=f[(f[g>>2]|0)+4>>2]|0;l=dm(k,Ra[f[(f[b>>2]|0)+24>>2]&127](b,a)|0)|0;f[d>>2]=l;if((l|0)==-1)break;k=f[h>>2]|0;if((k|0)==(f[i>>2]|0))Ri(j,d);else{f[k>>2]=l;f[h>>2]=k+4}gl(f[g>>2]|0,f[d>>2]|0)|0;a=a+1|0;if((a|0)>=(Qa[f[(f[b>>2]|0)+20>>2]&127](b)|0)){e=1;m=9;break}}if((m|0)==9){u=c;return e|0}e=0;u=c;return e|0}function ui(a){a=a|0;var b=0,c=0,d=0,e=0,g=0,h=0;f[a>>2]=1292;hi(a+60|0);b=f[a+48>>2]|0;if(b|0){c=a+52|0;d=f[c>>2]|0;if((d|0)!=(b|0))f[c>>2]=d+(~((d+-4-b|0)>>>2)<<2);Oq(b)}b=a+36|0;d=f[b>>2]|0;if(d|0){c=a+40|0;e=f[c>>2]|0;if((e|0)==(d|0))g=d;else{h=e;do{e=h+-24|0;f[c>>2]=e;Va[f[f[e>>2]>>2]&127](e);h=f[c>>2]|0}while((h|0)!=(d|0));g=f[b>>2]|0}Oq(g)}f[a>>2]=1232;g=f[a+16>>2]|0;if(g|0){b=a+20|0;d=f[b>>2]|0;if((d|0)!=(g|0))f[b>>2]=d+(~((d+-4-g|0)>>>2)<<2);Oq(g)}g=f[a+4>>2]|0;if(!g)return;d=a+8|0;a=f[d>>2]|0;if((a|0)!=(g|0))f[d>>2]=a+(~((a+-4-g|0)>>>2)<<2);Oq(g);return}function vi(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0;c=u;u=u+32|0;d=c+16|0;e=c+8|0;g=c;h=a+8|0;if(f[h>>2]<<5>>>0>=b>>>0){u=c;return}f[d>>2]=0;i=d+4|0;f[i>>2]=0;j=d+8|0;f[j>>2]=0;if((b|0)<0)aq(d);k=((b+-1|0)>>>5)+1|0;b=ln(k<<2)|0;f[d>>2]=b;f[i>>2]=0;f[j>>2]=k;k=f[a>>2]|0;f[e>>2]=k;f[e+4>>2]=0;b=a+4|0;l=f[b>>2]|0;f[g>>2]=k+(l>>>5<<2);f[g+4>>2]=l&31;zg(d,e,g);g=f[a>>2]|0;f[a>>2]=f[d>>2];f[d>>2]=g;d=f[b>>2]|0;f[b>>2]=f[i>>2];f[i>>2]=d;d=f[h>>2]|0;f[h>>2]=f[j>>2];f[j>>2]=d;if(g|0)Oq(g);u=c;return}function wi(a){a=a|0;var b=0,c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0;b=a+136|0;c=f[b>>2]|0;if(c|0){d=a+140|0;e=f[d>>2]|0;if((e|0)==(c|0))g=c;else{h=e;while(1){e=h+-12|0;f[d>>2]=e;i=f[e>>2]|0;if(!i)j=e;else{e=h+-8|0;k=f[e>>2]|0;if((k|0)!=(i|0))f[e>>2]=k+(~((k+-4-i|0)>>>2)<<2);Oq(i);j=f[d>>2]|0}if((j|0)==(c|0))break;else h=j}g=f[b>>2]|0}Oq(g)}g=f[a+104>>2]|0;if(g|0){b=a+108|0;j=f[b>>2]|0;if((j|0)!=(g|0))f[b>>2]=j+(~((j+-4-g|0)>>>2)<<2);Oq(g)}g=f[a+92>>2]|0;if(!g){uj(a);return}j=a+96|0;b=f[j>>2]|0;if((b|0)!=(g|0))f[j>>2]=b+(~((b+-4-g|0)>>>2)<<2);Oq(g);uj(a);return}function xi(a){a=a|0;var c=0,d=0,e=0,g=0;f[a>>2]=3680;c=a+72|0;d=a+136|0;e=a+4|0;g=e+64|0;do{f[e>>2]=0;e=e+4|0}while((e|0)<(g|0));e=c;g=e+64|0;do{f[e>>2]=0;e=e+4|0}while((e|0)<(g|0));n[d>>2]=$(1.0);d=a+140|0;f[d>>2]=0;f[d+4>>2]=0;f[d+8>>2]=0;f[d+12>>2]=0;f[d+16>>2]=0;f[d+20>>2]=0;f[a+164>>2]=-1;d=a+168|0;f[d>>2]=0;f[d+4>>2]=0;f[d+8>>2]=0;f[d+12>>2]=0;f[d+16>>2]=0;f[d+20>>2]=0;f[d+24>>2]=0;wn(a+200|0);Gn(a+232|0);d=a+316|0;e=a+264|0;g=e+52|0;do{f[e>>2]=0;e=e+4|0}while((e|0)<(g|0));f[d>>2]=-1;f[a+320>>2]=-1;f[a+324>>2]=0;f[a+328>>2]=2;f[a+332>>2]=7;f[a+336>>2]=0;f[a+340>>2]=0;f[a+344>>2]=0;b[a+352>>0]=0;return}function yi(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;c=a+4|0;d=f[a>>2]|0;e=(f[c>>2]|0)-d|0;g=(e|0)/12|0;h=g+1|0;if(h>>>0>357913941)aq(a);i=a+8|0;j=((f[i>>2]|0)-d|0)/12|0;k=j<<1;l=j>>>0<178956970?(k>>>0<h>>>0?h:k):357913941;do if(l)if(l>>>0>357913941){k=ra(8)|0;Oo(k,16035);f[k>>2]=7256;va(k|0,1112,110)}else{m=ln(l*12|0)|0;break}else m=0;while(0);k=m+(g*12|0)|0;f[k>>2]=f[b>>2];f[k+4>>2]=f[b+4>>2];f[k+8>>2]=f[b+8>>2];b=k+(((e|0)/-12|0)*12|0)|0;if((e|0)>0)kh(b|0,d|0,e|0)|0;f[a>>2]=b;f[c>>2]=k+12;f[i>>2]=m+(l*12|0);if(!d)return;Oq(d);return}function zi(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;g=a+16|0;h=g;i=f[h+4>>2]|0;if((d|0)<0|(d|0)==0&c>>>0<1|((i|0)>0|(i|0)==0&(f[h>>2]|0)>>>0>0)){j=0;return j|0}b[a+24>>0]=e&1;h=Vn(c|0,d|0,7,0)|0;d=Ik(h|0,I|0,8,0)|0;h=I;c=g;f[c>>2]=d;f[c+4>>2]=h;c=a+4|0;g=f[c>>2]|0;i=f[a>>2]|0;k=g-i|0;l=Vn(k|0,0,8,0)|0;m=e?l:k;l=Vn(m|0,(e?I:0)|0,d|0,h|0)|0;h=i;i=g;if(k>>>0>=l>>>0)if(k>>>0>l>>>0?(g=h+l|0,(g|0)!=(i|0)):0){f[c>>2]=g;n=h}else n=h;else{Fi(a,l-k|0);n=f[a>>2]|0}k=ln(8)|0;f[k>>2]=n+m;f[k+4>>2]=0;m=a+12|0;a=f[m>>2]|0;f[m>>2]=k;if(!a){j=1;return j|0}Oq(a);j=1;return j|0}function Ai(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0;c=u;u=u+16|0;d=c;e=yg(a,d,b)|0;g=f[e>>2]|0;if(g|0){h=g;i=h+28|0;u=c;return i|0}g=ln(40)|0;pj(g+16|0,b);b=g+28|0;f[b>>2]=0;f[b+4>>2]=0;f[b+8>>2]=0;b=f[d>>2]|0;f[g>>2]=0;f[g+4>>2]=0;f[g+8>>2]=b;f[e>>2]=g;b=f[f[a>>2]>>2]|0;if(!b)j=g;else{f[a>>2]=b;j=f[e>>2]|0}Oe(f[a+4>>2]|0,j);j=a+8|0;f[j>>2]=(f[j>>2]|0)+1;h=g;i=h+28|0;u=c;return i|0}function Bi(a,c,d,e,g,h,i,j){a=a|0;c=c|0;d=d|0;e=e|0;g=g|0;h=h|0;i=i|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0;k=u;u=u+16|0;l=k;if((-18-c|0)>>>0<d>>>0)aq(a);if((b[a+11>>0]|0)<0)m=f[a>>2]|0;else m=a;if(c>>>0<2147483623){n=d+c|0;d=c<<1;o=n>>>0<d>>>0?d:n;p=o>>>0<11?11:o+16&-16}else p=-17;o=ln(p)|0;if(g|0)Fo(o,m,g)|0;if(i|0)Fo(o+g|0,j,i)|0;j=e-h|0;e=j-g|0;if(e|0)Fo(o+g+i|0,m+g+h|0,e)|0;if((c|0)!=10)Oq(m);f[a>>2]=o;f[a+8>>2]=p|-2147483648;p=j+i|0;f[a+4>>2]=p;b[l>>0]=0;up(o+p|0,l);u=k;return}function Ci(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;c=a+8|0;d=f[c>>2]|0;e=a+4|0;g=f[e>>2]|0;if(d-g>>2>>>0>=b>>>0){sj(g|0,0,b<<2|0)|0;f[e>>2]=g+(b<<2);return}h=f[a>>2]|0;i=g-h|0;g=i>>2;j=g+b|0;if(j>>>0>1073741823)aq(a);k=d-h|0;d=k>>1;l=k>>2>>>0<536870911?(d>>>0<j>>>0?j:d):1073741823;do if(l)if(l>>>0>1073741823){d=ra(8)|0;Oo(d,16035);f[d>>2]=7256;va(d|0,1112,110)}else{d=ln(l<<2)|0;m=d;n=d;break}else{m=0;n=0}while(0);d=m+(g<<2)|0;sj(d|0,0,b<<2|0)|0;if((i|0)>0)kh(n|0,h|0,i|0)|0;f[a>>2]=m;f[e>>2]=d+(b<<2);f[c>>2]=m+(l<<2);if(!h)return;Oq(h);return}function Di(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;g=ln(32)|0;f[a>>2]=g;f[a+4>>2]=c+8;c=a+8|0;b[c>>0]=0;pj(g+8|0,e);h=g+20|0;i=e+12|0;f[h>>2]=0;f[g+24>>2]=0;f[g+28>>2]=0;g=e+16|0;e=f[g>>2]|0;j=f[i>>2]|0;k=e-j|0;if(!k){l=j;m=e;n=0}else{Fi(h,k);l=f[i>>2]|0;m=f[g>>2]|0;n=f[h>>2]|0}kh(n|0,l|0,m-l|0)|0;b[c>>0]=1;c=f[a>>2]|0;f[c+4>>2]=d;f[c>>2]=0;return}function Ei(a,c,d){a=a|0;c=c|0;d=$(d);var e=0,g=0,h=0,i=0,j=0,k=0.0,l=0,m=0,n=0,o=0;e=u;u=u+16|0;g=e;h=c+11|0;i=b[h>>0]|0;if(i<<24>>24<0)j=f[c+4>>2]|0;else j=i&255;k=+d;l=j;j=i;while(1){if(j<<24>>24<0)m=f[c>>2]|0;else m=c;p[g>>3]=k;n=Bn(m,l+1|0,18562,g)|0;if((n|0)>-1)if(n>>>0>l>>>0)o=n;else break;else o=l<<1|1;Hj(c,o,0);l=o;j=b[h>>0]|0}Hj(c,n,0);f[a>>2]=f[c>>2];f[a+4>>2]=f[c+4>>2];f[a+8>>2]=f[c+8>>2];a=0;while(1){if((a|0)==3)break;f[c+(a<<2)>>2]=0;a=a+1|0}u=e;return}function Fi(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0;d=a+8|0;e=f[d>>2]|0;g=a+4|0;h=f[g>>2]|0;if((e-h|0)>>>0>=c>>>0){i=c;j=h;do{b[j>>0]=0;j=(f[g>>2]|0)+1|0;f[g>>2]=j;i=i+-1|0}while((i|0)!=0);return}i=f[a>>2]|0;j=h-i|0;h=j+c|0;if((h|0)<0)aq(a);k=e-i|0;i=k<<1;e=k>>>0<1073741823?(i>>>0<h>>>0?h:i):2147483647;if(!e)l=0;else l=ln(e)|0;i=l+j|0;j=l+e|0;e=c;c=i;l=i;do{b[l>>0]=0;l=c+1|0;c=l;e=e+-1|0}while((e|0)!=0);e=f[a>>2]|0;l=(f[g>>2]|0)-e|0;h=i+(0-l)|0;if((l|0)>0)kh(h|0,e|0,l|0)|0;f[a>>2]=h;f[g>>2]=c;f[d>>2]=j;if(!e)return;Oq(e);return}function Gi(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0;c=a+4|0;d=f[c>>2]|0;e=f[a>>2]|0;g=(d-e|0)/136|0;h=d;if(g>>>0<b>>>0){Ge(a,b-g|0);return}if(g>>>0<=b>>>0)return;g=e+(b*136|0)|0;if((g|0)==(h|0))return;else i=h;do{f[c>>2]=i+-136;h=f[i+-20>>2]|0;if(h|0){b=i+-16|0;e=f[b>>2]|0;if((e|0)!=(h|0))f[b>>2]=e+(~((e+-4-h|0)>>>2)<<2);Oq(h)}h=f[i+-32>>2]|0;if(h|0){e=i+-28|0;b=f[e>>2]|0;if((b|0)!=(h|0))f[e>>2]=b+(~((b+-4-h|0)>>>2)<<2);Oq(h)}Mi(i+-132|0);i=f[c>>2]|0}while((i|0)!=(g|0));return}function Hi(a,b){a=a|0;b=b|0;var c=0,d=Oa,e=0,g=0;if((b|0)!=1)if(!(b+-1&b))c=b;else c=cb(b)|0;else c=2;b=f[a+4>>2]|0;if(c>>>0>b>>>0){Sd(a,c);return}if(c>>>0>=b>>>0)return;d=$((f[a+12>>2]|0)>>>0);e=~~$(W($(d/$(n[a+16>>2]))))>>>0;if(b>>>0>2&(b+-1&b|0)==0)g=1<<32-(_(e+-1|0)|0);else g=cb(e)|0;e=c>>>0<g>>>0?g:c;if(e>>>0>=b>>>0)return;Sd(a,e);return}function Ii(a){a=a|0;var b=0,c=0,d=0;b=f[a+76>>2]|0;if(b|0){c=a+80|0;d=f[c>>2]|0;if((d|0)!=(b|0))f[c>>2]=d+(~((d+-4-b|0)>>>2)<<2);Oq(b)}b=f[a+64>>2]|0;if(b|0){d=a+68|0;if((f[d>>2]|0)!=(b|0))f[d>>2]=b;Oq(b)}b=f[a+48>>2]|0;if(b|0){d=a+52|0;c=f[d>>2]|0;if((c|0)!=(b|0))f[d>>2]=c+(~((c+-4-b|0)>>>2)<<2);Oq(b)}b=f[a+24>>2]|0;if(b|0){c=a+28|0;d=f[c>>2]|0;if((d|0)!=(b|0))f[c>>2]=d+(~((d+-4-b|0)>>>2)<<2);Oq(b)}b=f[a+12>>2]|0;if(b|0){d=a+16|0;c=f[d>>2]|0;if((c|0)!=(b|0))f[d>>2]=c+(~((c+-4-b|0)>>>2)<<2);Oq(b)}b=f[a>>2]|0;if(!b)return;c=a+4|0;a=f[c>>2]|0;if((a|0)!=(b|0))f[c>>2]=a+(~((a+-4-b|0)>>>2)<<2);Oq(b);return}function Ji(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;e=u;u=u+16|0;g=e;h=c+11|0;i=b[h>>0]|0;if(i<<24>>24<0)j=f[c+4>>2]|0;else j=i&255;k=j;j=i;while(1){if(j<<24>>24<0)l=f[c>>2]|0;else l=c;f[g>>2]=d;m=Bn(l,k+1|0,18559,g)|0;if((m|0)>-1)if(m>>>0>k>>>0)n=m;else break;else n=k<<1|1;Hj(c,n,0);k=n;j=b[h>>0]|0}Hj(c,m,0);f[a>>2]=f[c>>2];f[a+4>>2]=f[c+4>>2];f[a+8>>2]=f[c+8>>2];a=0;while(1){if((a|0)==3)break;f[c+(a<<2)>>2]=0;a=a+1|0}u=e;return}function Ki(a){a=a|0;var b=0,c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;b=a+8|0;c=f[b>>2]|0;if((c|0)<0){d=0;return d|0}e=a+4|0;a=f[e>>2]|0;g=a+4|0;h=f[g>>2]|0;i=f[a>>2]|0;j=h-i>>2;k=i;i=h;if(c>>>0<=j>>>0)if(c>>>0<j>>>0?(h=k+(c<<2)|0,(h|0)!=(i|0)):0){f[g>>2]=i+(~((i+-4-h|0)>>>2)<<2);l=c}else l=c;else{Ci(a,c-j|0);l=f[b>>2]|0}if((l|0)<=0){d=1;return d|0}b=f[e>>2]|0;e=f[b>>2]|0;j=(f[b+4>>2]|0)-e>>2;c=e;e=0;while(1){if(j>>>0<=e>>>0){m=10;break}f[c+(e<<2)>>2]=e;e=e+1|0;if((e|0)>=(l|0)){d=1;m=12;break}}if((m|0)==10)aq(b);else if((m|0)==12)return d|0;return 0}function Li(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0;e=u;u=u+16|0;g=e;h=ln(16)|0;f[g>>2]=h;f[g+8>>2]=-2147483632;f[g+4>>2]=14;i=h;j=14408;k=i+14|0;do{b[i>>0]=b[j>>0]|0;i=i+1|0;j=j+1|0}while((i|0)<(k|0));b[h+14>>0]=0;Xj(a,g,c);if((b[g+11>>0]|0)<0)Oq(f[g>>2]|0);c=ln(16)|0;f[g>>2]=c;f[g+8>>2]=-2147483632;f[g+4>>2]=14;i=c;j=14423;k=i+14|0;do{b[i>>0]=b[j>>0]|0;i=i+1|0;j=j+1|0}while((i|0)<(k|0));b[c+14>>0]=0;Xj(a,g,d);if((b[g+11>>0]|0)>=0){u=e;return}Oq(f[g>>2]|0);u=e;return}function Mi(a){a=a|0;var b=0,c=0,d=0;b=f[a+84>>2]|0;if(b|0){c=a+88|0;d=f[c>>2]|0;if((d|0)!=(b|0))f[c>>2]=d+(~((d+-4-b|0)>>>2)<<2);Oq(b)}b=f[a+72>>2]|0;if(b|0){d=a+76|0;if((f[d>>2]|0)!=(b|0))f[d>>2]=b;Oq(b)}b=f[a+52>>2]|0;if(b|0){d=a+56|0;c=f[d>>2]|0;if((c|0)!=(b|0))f[d>>2]=c+(~((c+-4-b|0)>>>2)<<2);Oq(b)}b=f[a+40>>2]|0;if(b|0){c=a+44|0;d=f[c>>2]|0;if((d|0)!=(b|0))f[c>>2]=d+(~((d+-4-b|0)>>>2)<<2);Oq(b)}b=f[a+28>>2]|0;if(b|0){d=a+32|0;c=f[d>>2]|0;if((c|0)!=(b|0))f[d>>2]=c+(~((c+-4-b|0)>>>2)<<2);Oq(b)}b=f[a+12>>2]|0;if(b|0)Oq(b);b=f[a>>2]|0;if(!b)return;Oq(b);return}function Ni(a){a=a|0;var b=0,c=0,d=0,e=0;f[a>>2]=1352;b=a+32|0;c=f[b>>2]|0;f[b>>2]=0;if(c|0){b=c+88|0;d=f[b>>2]|0;f[b>>2]=0;if(d|0){b=f[d+8>>2]|0;if(b|0){e=d+12|0;if((f[e>>2]|0)!=(b|0))f[e>>2]=b;Oq(b)}Oq(d)}d=f[c+68>>2]|0;if(d|0){b=c+72|0;e=f[b>>2]|0;if((e|0)!=(d|0))f[b>>2]=e+(~((e+-4-d|0)>>>2)<<2);Oq(d)}d=c+64|0;e=f[d>>2]|0;f[d>>2]=0;if(e|0){d=f[e>>2]|0;if(d|0){b=e+4|0;if((f[b>>2]|0)!=(d|0))f[b>>2]=d;Oq(d)}Oq(e)}Oq(c)}c=f[a+16>>2]|0;if(!c)return;e=a+20|0;a=f[e>>2]|0;if((a|0)!=(c|0))f[e>>2]=a+(~((a+-4-c|0)>>>2)<<2);Oq(c);return}function Oi(){var a=0,b=0,c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0;a=u;u=u+48|0;b=a+32|0;c=a+24|0;d=a+16|0;e=a;g=a+36|0;a=sn()|0;if(a|0?(h=f[a>>2]|0,h|0):0){a=h+48|0;i=f[a>>2]|0;j=f[a+4>>2]|0;if(!((i&-256|0)==1126902528&(j|0)==1129074247)){f[c>>2]=18701;Hn(18651,c)}if((i|0)==1126902529&(j|0)==1129074247)k=f[h+44>>2]|0;else k=h+80|0;f[g>>2]=k;k=f[h>>2]|0;h=f[k+4>>2]|0;if(Sa[f[(f[258]|0)+16>>2]&31](1032,k,g)|0){k=f[g>>2]|0;g=Qa[f[(f[k>>2]|0)+8>>2]&127](k)|0;f[e>>2]=18701;f[e+4>>2]=h;f[e+8>>2]=g;Hn(18565,e)}else{f[d>>2]=18701;f[d+4>>2]=h;Hn(18610,d)}}Hn(18689,b)}function Pi(a,c,d){a=a|0;c=c|0;d=d|0;var e=0;do if(a){if(c>>>0<128){b[a>>0]=c;e=1;break}d=(Jq()|0)+188|0;if(!(f[f[d>>2]>>2]|0))if((c&-128|0)==57216){b[a>>0]=c;e=1;break}else{d=Vq()|0;f[d>>2]=84;e=-1;break}if(c>>>0<2048){b[a>>0]=c>>>6|192;b[a+1>>0]=c&63|128;e=2;break}if(c>>>0<55296|(c&-8192|0)==57344){b[a>>0]=c>>>12|224;b[a+1>>0]=c>>>6&63|128;b[a+2>>0]=c&63|128;e=3;break}if((c+-65536|0)>>>0<1048576){b[a>>0]=c>>>18|240;b[a+1>>0]=c>>>12&63|128;b[a+2>>0]=c>>>6&63|128;b[a+3>>0]=c&63|128;e=4;break}else{d=Vq()|0;f[d>>2]=84;e=-1;break}}else e=1;while(0);return e|0}function Qi(a){a=a|0;var b=0,c=0,d=0;b=f[a+92>>2]|0;if(b|0){c=a+96|0;d=f[c>>2]|0;if((d|0)!=(b|0))f[c>>2]=d+(~((d+-4-b|0)>>>2)<<2);Oq(b)}b=f[a+76>>2]|0;if(b|0){d=a+80|0;c=f[d>>2]|0;if((c|0)!=(b|0))f[d>>2]=c+(~((c+-4-b|0)>>>2)<<2);Oq(b)}b=f[a+64>>2]|0;if(b|0){c=a+68|0;d=f[c>>2]|0;if((d|0)!=(b|0))f[c>>2]=d+(~((d+-4-b|0)>>>2)<<2);Oq(b)}b=f[a+52>>2]|0;if(b|0){d=a+56|0;c=f[d>>2]|0;if((c|0)!=(b|0))f[d>>2]=c+(~((c+-4-b|0)>>>2)<<2);Oq(b)}f[a+4>>2]=3636;b=f[a+24>>2]|0;if(b|0)Oq(b);b=f[a+12>>2]|0;if(!b)return;Oq(b);return}function Ri(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;c=a+4|0;d=f[a>>2]|0;e=(f[c>>2]|0)-d|0;g=e>>2;h=g+1|0;if(h>>>0>1073741823)aq(a);i=a+8|0;j=(f[i>>2]|0)-d|0;k=j>>1;l=j>>2>>>0<536870911?(k>>>0<h>>>0?h:k):1073741823;do if(l)if(l>>>0>1073741823){k=ra(8)|0;Oo(k,16035);f[k>>2]=7256;va(k|0,1112,110)}else{k=ln(l<<2)|0;m=k;n=k;break}else{m=0;n=0}while(0);k=m+(g<<2)|0;f[k>>2]=f[b>>2];if((e|0)>0)kh(n|0,d|0,e|0)|0;f[a>>2]=m;f[c>>2]=k+4;f[i>>2]=m+(l<<2);if(!d)return;Oq(d);return}function Si(a){a=a|0;var c=0,d=0,e=0,g=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;c=a+104|0;d=f[c>>2]|0;if((d|0)!=0?(f[a+108>>2]|0)>=(d|0):0)e=4;else{d=Wm(a)|0;if((d|0)>=0){g=f[c>>2]|0;c=a+8|0;if(g){i=f[c>>2]|0;j=f[a+4>>2]|0;k=g-(f[a+108>>2]|0)|0;g=i;if((i-j|0)<(k|0)){l=g;m=g}else{l=j+(k+-1)|0;m=g}}else{g=f[c>>2]|0;l=g;m=g}f[a+100>>2]=l;l=a+4|0;if(!m)n=f[l>>2]|0;else{g=f[l>>2]|0;l=a+108|0;f[l>>2]=m+1-g+(f[l>>2]|0);n=g}g=n+-1|0;if((d|0)==(h[g>>0]|0|0))o=d;else{b[g>>0]=d;o=d}}else e=4}if((e|0)==4){f[a+100>>2]=0;o=-1}return o|0}function Ti(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;f[a>>2]=1544;f[a+4>>2]=b;b=a+8|0;f[b>>2]=f[c>>2];f[b+4>>2]=f[c+4>>2];f[b+8>>2]=f[c+8>>2];f[b+12>>2]=f[c+12>>2];f[b+16>>2]=f[c+16>>2];f[b+20>>2]=f[c+20>>2];fk(a+32|0,c+24|0);f[a>>2]=2384;c=a+44|0;f[c>>2]=f[d>>2];f[c+4>>2]=f[d+4>>2];f[c+8>>2]=f[d+8>>2];f[c+12>>2]=f[d+12>>2];f[a>>2]=2440;d=a+112|0;c=a+60|0;b=c+52|0;do{f[c>>2]=0;c=c+4|0}while((c|0)<(b|0));Zm(d);f[a+152>>2]=0;f[a+156>>2]=0;f[a+160>>2]=0;return}function Ui(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;f[a>>2]=1544;f[a+4>>2]=b;b=a+8|0;f[b>>2]=f[c>>2];f[b+4>>2]=f[c+4>>2];f[b+8>>2]=f[c+8>>2];f[b+12>>2]=f[c+12>>2];f[b+16>>2]=f[c+16>>2];f[b+20>>2]=f[c+20>>2];fk(a+32|0,c+24|0);f[a>>2]=1964;c=a+44|0;f[c>>2]=f[d>>2];f[c+4>>2]=f[d+4>>2];f[c+8>>2]=f[d+8>>2];f[c+12>>2]=f[d+12>>2];f[a>>2]=2020;d=a+112|0;c=a+60|0;b=c+52|0;do{f[c>>2]=0;c=c+4|0}while((c|0)<(b|0));Zm(d);f[a+152>>2]=0;f[a+156>>2]=0;f[a+160>>2]=0;return}function Vi(a){a=a|0;var b=0,c=0,d=0;f[a>>2]=2440;b=f[a+152>>2]|0;if(b|0){c=a+156|0;d=f[c>>2]|0;if((d|0)!=(b|0))f[c>>2]=d+(~((d+-4-b|0)>>>2)<<2);Oq(b)}b=f[a+112>>2]|0;if(b|0){d=a+116|0;c=f[d>>2]|0;if((c|0)!=(b|0))f[d>>2]=c+(~((c+-4-b|0)>>>2)<<2);Oq(b)}b=f[a+96>>2]|0;if(b|0)Oq(b);b=f[a+84>>2]|0;if(b|0)Oq(b);b=f[a+72>>2]|0;if(b|0)Oq(b);b=f[a+60>>2]|0;if(b|0)Oq(b);f[a>>2]=1544;b=f[a+32>>2]|0;if(!b)return;c=a+36|0;a=f[c>>2]|0;if((a|0)!=(b|0))f[c>>2]=a+(~((a+-4-b|0)>>>2)<<2);Oq(b);return}function Wi(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0;d=u;u=u+16|0;e=d;g=f[(f[c+4>>2]|0)+4>>2]|0;if(!g){f[a>>2]=0;f[a+4>>2]=0;f[a+8>>2]=0;f[a+12>>2]=0;u=d;return}if(!(Dj(d+12|0,f[c+44>>2]|0,g)|0)){g=ln(32)|0;f[e>>2]=g;f[e+8>>2]=-2147483616;f[e+4>>2]=26;c=g;h=15859;i=c+26|0;do{b[c>>0]=b[h>>0]|0;c=c+1|0;h=h+1|0}while((c|0)<(i|0));b[g+26>>0]=0;f[a>>2]=-1;pj(a+4|0,e);if((b[e+11>>0]|0)<0)Oq(f[e>>2]|0)}else{f[a>>2]=0;f[a+4>>2]=0;f[a+8>>2]=0;f[a+12>>2]=0}u=d;return}function Xi(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0;c=b+48|0;if((mi(f[c>>2]|0)|0)>9){d=0;return d|0}if((Qa[f[(f[b>>2]|0)+8>>2]&127](b)|0)!=1){d=0;return d|0}e=b+4|0;b=(f[(f[(f[e>>2]|0)+8>>2]|0)+(a<<2)>>2]|0)+56|0;a=f[b>>2]|0;do if((a|0)==3)if((mi(f[c>>2]|0)|0)<4){d=5;return d|0}else{g=f[b>>2]|0;break}else g=a;while(0);a=mi(f[c>>2]|0)|0;if((g|0)==1){d=(a|0)<4?6:0;return d|0}if((a|0)>7){d=0;return d|0}if((mi(f[c>>2]|0)|0)>1){d=1;return d|0}else return ((f[(f[e>>2]|0)+80>>2]|0)>>>0<40?1:4)|0;return 0}function Yi(a){a=a|0;var b=0,c=0,d=0;f[a>>2]=2020;b=f[a+152>>2]|0;if(b|0){c=a+156|0;d=f[c>>2]|0;if((d|0)!=(b|0))f[c>>2]=d+(~((d+-4-b|0)>>>2)<<2);Oq(b)}b=f[a+112>>2]|0;if(b|0){d=a+116|0;c=f[d>>2]|0;if((c|0)!=(b|0))f[d>>2]=c+(~((c+-4-b|0)>>>2)<<2);Oq(b)}b=f[a+96>>2]|0;if(b|0)Oq(b);b=f[a+84>>2]|0;if(b|0)Oq(b);b=f[a+72>>2]|0;if(b|0)Oq(b);b=f[a+60>>2]|0;if(b|0)Oq(b);f[a>>2]=1544;b=f[a+32>>2]|0;if(!b)return;c=a+36|0;a=f[c>>2]|0;if((a|0)!=(b|0))f[c>>2]=a+(~((a+-4-b|0)>>>2)<<2);Oq(b);return}function Zi(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;g=u;u=u+128|0;h=g+124|0;i=g;j=i;k=6596;l=j+124|0;do{f[j>>2]=f[k>>2];j=j+4|0;k=k+4|0}while((j|0)<(l|0));if((c+-1|0)>>>0>2147483646)if(!c){m=h;n=1;o=4}else{h=Vq()|0;f[h>>2]=75;p=-1}else{m=a;n=c;o=4}if((o|0)==4){o=-2-m|0;c=n>>>0>o>>>0?o:n;f[i+48>>2]=c;n=i+20|0;f[n>>2]=m;f[i+44>>2]=m;o=m+c|0;m=i+16|0;f[m>>2]=o;f[i+28>>2]=o;o=Ah(i,d,e)|0;if(!c)p=o;else{c=f[n>>2]|0;b[c+(((c|0)==(f[m>>2]|0))<<31>>31)>>0]=0;p=o}}u=g;return p|0}function _i(a){a=a|0;var c=0,d=0,e=0,g=0;f[a>>2]=3480;c=a+72|0;d=a+136|0;e=a+4|0;g=e+64|0;do{f[e>>2]=0;e=e+4|0}while((e|0)<(g|0));e=c;g=e+64|0;do{f[e>>2]=0;e=e+4|0}while((e|0)<(g|0));n[d>>2]=$(1.0);d=a+140|0;f[d>>2]=0;f[d+4>>2]=0;f[d+8>>2]=0;f[d+12>>2]=0;f[d+16>>2]=0;f[d+20>>2]=0;f[a+164>>2]=-1;d=a+168|0;f[d>>2]=0;f[d+4>>2]=0;f[d+8>>2]=0;f[d+12>>2]=0;f[d+16>>2]=0;f[d+20>>2]=0;f[d+24>>2]=0;wn(a+200|0);Gn(a+232|0);d=a+264|0;f[d>>2]=0;f[d+4>>2]=0;f[d+8>>2]=0;f[d+12>>2]=0;f[d+16>>2]=0;f[d+20>>2]=0;b[d+24>>0]=0;return}function $i(a,c,d,e){a=a|0;c=c|0;d=d|0;e=+e;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;a=u;u=u+16|0;g=a;if(!c){h=0;u=a;return h|0}f[g>>2]=0;f[g+4>>2]=0;f[g+8>>2]=0;i=Gj(d)|0;if(i>>>0>4294967279)aq(g);if(i>>>0<11){b[g+11>>0]=i;if(!i)j=g;else{k=g;l=7}}else{m=i+16&-16;n=ln(m)|0;f[g>>2]=n;f[g+8>>2]=m|-2147483648;f[g+4>>2]=i;k=n;l=7}if((l|0)==7){kh(k|0,d|0,i|0)|0;j=k}b[j+i>>0]=0;Zl(c,g,e);if((b[g+11>>0]|0)<0)Oq(f[g>>2]|0);h=1;u=a;return h|0}function aj(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;a=u;u=u+16|0;g=a;if(!c){h=0;u=a;return h|0}f[g>>2]=0;f[g+4>>2]=0;f[g+8>>2]=0;i=Gj(d)|0;if(i>>>0>4294967279)aq(g);if(i>>>0<11){b[g+11>>0]=i;if(!i)j=g;else{k=g;l=7}}else{m=i+16&-16;n=ln(m)|0;f[g>>2]=n;f[g+8>>2]=m|-2147483648;f[g+4>>2]=i;k=n;l=7}if((l|0)==7){kh(k|0,d|0,i|0)|0;j=k}b[j+i>>0]=0;$l(c,g,e);if((b[g+11>>0]|0)<0)Oq(f[g>>2]|0);h=1;u=a;return h|0}function bj(a){a=a|0;var c=0,d=0,e=0,g=0,h=0;c=f[a+28>>2]|0;if(c|0){d=c;do{c=d;d=f[d>>2]|0;e=c+8|0;g=c+20|0;h=f[g>>2]|0;f[g>>2]=0;if(h|0){bj(h);Oq(h)}if((b[e+11>>0]|0)<0)Oq(f[e>>2]|0);Oq(c)}while((d|0)!=0)}d=a+20|0;c=f[d>>2]|0;f[d>>2]=0;if(c|0)Oq(c);c=f[a+8>>2]|0;if(c|0){d=c;do{c=d;d=f[d>>2]|0;e=c+8|0;h=f[c+20>>2]|0;if(h|0){g=c+24|0;if((f[g>>2]|0)!=(h|0))f[g>>2]=h;Oq(h)}if((b[e+11>>0]|0)<0)Oq(f[e>>2]|0);Oq(c)}while((d|0)!=0)}d=f[a>>2]|0;f[a>>2]=0;if(!d)return;Oq(d);return}function cj(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0;e=u;u=u+16|0;g=e;h=f[c+36>>2]|0;if(!h){i=ln(32)|0;f[g>>2]=i;f[g+8>>2]=-2147483616;f[g+4>>2]=23;j=i;k=15706;l=j+23|0;do{b[j>>0]=b[k>>0]|0;j=j+1|0;k=k+1|0}while((j|0)<(l|0));b[i+23>>0]=0;f[a>>2]=-1;pj(a+4|0,g);if((b[g+11>>0]|0)<0)Oq(f[g>>2]|0);u=e;return}g=f[c+40>>2]|0;if(!g){Sc(a,c,h,d);u=e;return}else{bi(a,c,g,d);u=e;return}}function dj(a){a=a|0;var b=0,c=0,d=0,e=0,g=0,h=0;tk(a);b=a+84|0;c=f[b>>2]|0;if((c|0)<=0)return;d=c<<5;e=Lq(c>>>0>134217727|d>>>0>4294967291?-1:d+4|0)|0;f[e>>2]=c;d=e+4|0;e=d+(c<<5)|0;c=d;do{wn(c);c=c+32|0}while((c|0)!=(e|0));e=a+80|0;a=f[e>>2]|0;f[e>>2]=d;if(a|0){d=a+-4|0;c=f[d>>2]|0;if(c|0){g=a+(c<<5)|0;do{g=g+-32|0;Fj(g)}while((g|0)!=(a|0))}Mq(d)}if((f[b>>2]|0)>0)h=0;else return;do{tk((f[e>>2]|0)+(h<<5)|0);h=h+1|0}while((h|0)<(f[b>>2]|0));return}function ej(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0;if(!b){d=0;return d|0}if(f[b+4>>2]|0){d=0;return d|0}a=ln(52)|0;Ub(a,c);f[a+40>>2]=0;f[a+44>>2]=0;f[a+48>>2]=0;c=b+4|0;b=f[c>>2]|0;f[c>>2]=a;if(!b){d=1;return d|0}a=b+40|0;c=f[a>>2]|0;if(c|0){e=b+44|0;g=f[e>>2]|0;if((g|0)==(c|0))h=c;else{i=g;do{g=i+-4|0;f[e>>2]=g;j=f[g>>2]|0;f[g>>2]=0;if(j|0){bj(j);Oq(j)}i=f[e>>2]|0}while((i|0)!=(c|0));h=f[a>>2]|0}Oq(h)}bj(b);Oq(b);d=1;return d|0}function fj(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0;c=f[a>>2]|0;if(b){b=c+8|0;d=b;e=Vn(f[d>>2]|0,f[d+4>>2]|0,1,0)|0;d=b;f[d>>2]=e;f[d+4>>2]=I;d=a+28|0;e=f[d>>2]|0;b=a+24|0;f[b>>2]=f[b>>2]|1<<e;g=d;h=e}else{e=c;d=Vn(f[e>>2]|0,f[e+4>>2]|0,1,0)|0;e=c;f[e>>2]=d;f[e+4>>2]=I;e=a+28|0;g=e;h=f[e>>2]|0}e=h+1|0;f[g>>2]=e;if((e|0)!=32)return;e=a+24|0;h=a+16|0;d=f[h>>2]|0;if((d|0)==(f[a+20>>2]|0))Ri(a+12|0,e);else{f[d>>2]=f[e>>2];f[h>>2]=d+4}f[g>>2]=0;f[e>>2]=0;return}function gj(a,b){a=a|0;b=b|0;var c=0,d=0;c=a+32|0;a=f[b>>2]|0;f[b>>2]=0;b=f[c>>2]|0;f[c>>2]=a;if(!b)return;a=b+88|0;c=f[a>>2]|0;f[a>>2]=0;if(c|0){a=f[c+8>>2]|0;if(a|0){d=c+12|0;if((f[d>>2]|0)!=(a|0))f[d>>2]=a;Oq(a)}Oq(c)}c=f[b+68>>2]|0;if(c|0){a=b+72|0;d=f[a>>2]|0;if((d|0)!=(c|0))f[a>>2]=d+(~((d+-4-c|0)>>>2)<<2);Oq(c)}c=b+64|0;d=f[c>>2]|0;f[c>>2]=0;if(d|0){c=f[d>>2]|0;if(c|0){a=d+4|0;if((f[a>>2]|0)!=(c|0))f[a>>2]=c;Oq(c)}Oq(d)}Oq(b);return}function hj(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;e=u;u=u+16|0;g=e;if(c|0){h=a+11|0;i=b[h>>0]|0;if(i<<24>>24<0){j=f[a+4>>2]|0;k=(f[a+8>>2]&2147483647)+-1|0}else{j=i&255;k=10}if((k-j|0)>>>0<c>>>0){xj(a,k,c-k+j|0,j,j,0,0);l=b[h>>0]|0}else l=i;if(l<<24>>24<0)m=f[a>>2]|0;else m=a;Qn(m+j|0,c,d)|0;d=j+c|0;if((b[h>>0]|0)<0)f[a+4>>2]=d;else b[h>>0]=d;b[g>>0]=0;up(m+d|0,g)}u=e;return a|0}function ij(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0;d=u;u=u+48|0;e=d+4|0;g=d;h=f[b+12>>2]|0;i=f[b+4>>2]|0;b=e;j=b+36|0;do{f[b>>2]=0;b=b+4|0}while((b|0)<(j|0));zh(g,c,h,i,e);i=f[e+24>>2]|0;if(!i){k=f[g>>2]|0;f[a>>2]=k;u=d;return}h=e+28|0;e=f[h>>2]|0;if((e|0)!=(i|0))f[h>>2]=e+(~((e+-4-i|0)>>>2)<<2);Oq(i);k=f[g>>2]|0;f[a>>2]=k;u=d;return}function jj(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;e=u;u=u+16|0;g=e;h=a+11|0;i=b[h>>0]|0;j=i<<24>>24<0;if(j)k=(f[a+8>>2]&2147483647)+-1|0;else k=10;do if(k>>>0>=d>>>0){if(j)l=f[a>>2]|0;else l=a;Eo(l,c,d)|0;b[g>>0]=0;up(l+d|0,g);if((b[h>>0]|0)<0){f[a+4>>2]=d;break}else{b[h>>0]=d;break}}else{if(j)m=f[a+4>>2]|0;else m=i&255;Bi(a,k,d-k|0,m,0,m,d,c)}while(0);u=e;return a|0}function kj(a){a=a|0;var b=0,c=0,d=0,e=0,g=0,h=0,i=0;b=f[a>>2]|0;if(!b)return;c=a+4|0;d=f[c>>2]|0;if((d|0)==(b|0))e=b;else{g=d;do{f[c>>2]=g+-136;d=f[g+-20>>2]|0;if(d|0){h=g+-16|0;i=f[h>>2]|0;if((i|0)!=(d|0))f[h>>2]=i+(~((i+-4-d|0)>>>2)<<2);Oq(d)}d=f[g+-32>>2]|0;if(d|0){i=g+-28|0;h=f[i>>2]|0;if((h|0)!=(d|0))f[i>>2]=h+(~((h+-4-d|0)>>>2)<<2);Oq(d)}Mi(g+-132|0);g=f[c>>2]|0}while((g|0)!=(b|0));e=f[a>>2]|0}Oq(e);return}function lj(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;e=u;u=u+16|0;g=e;h=a+11|0;i=b[h>>0]|0;j=i<<24>>24<0;if(j){k=f[a+4>>2]|0;l=(f[a+8>>2]&2147483647)+-1|0}else{k=i&255;l=10}if((l-k|0)>>>0>=d>>>0){if(d|0){if(j)m=f[a>>2]|0;else m=a;Fo(m+k|0,c,d)|0;j=k+d|0;if((b[h>>0]|0)<0)f[a+4>>2]=j;else b[h>>0]=j;b[g>>0]=0;up(m+j|0,g)}}else Bi(a,l,d-l+k|0,k,k,0,d,c);u=e;return a|0}function mj(a){a=a|0;var b=0,c=0,d=0,e=0,g=0,h=0;f[a>>2]=3932;b=f[a+32>>2]|0;if(b|0){c=a+36|0;d=f[c>>2]|0;if((d|0)!=(b|0))f[c>>2]=d+(~((d+-4-b|0)>>>2)<<2);Oq(b)}b=f[a+20>>2]|0;if(b|0){d=a+24|0;c=f[d>>2]|0;if((c|0)!=(b|0))f[d>>2]=c+(~((c+-4-b|0)>>>2)<<2);Oq(b)}b=a+8|0;c=f[b>>2]|0;if(!c)return;d=a+12|0;a=f[d>>2]|0;if((a|0)==(c|0))e=c;else{g=a;do{a=g+-4|0;f[d>>2]=a;h=f[a>>2]|0;f[a>>2]=0;if(h|0)Va[f[(f[h>>2]|0)+4>>2]&127](h);g=f[d>>2]|0}while((g|0)!=(c|0));e=f[b>>2]|0}Oq(e);return}function nj(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0;c=a+4|0;if((Qa[f[(f[b>>2]|0)+20>>2]&127](b)|0)<=0){d=1;return d|0}a=0;while(1){e=f[(f[c>>2]|0)+4>>2]|0;g=dm(e,Ra[f[(f[b>>2]|0)+24>>2]&127](b,a)|0)|0;if((g|0)==-1){d=0;h=6;break}e=f[(f[b>>2]|0)+28>>2]|0;i=fl(f[c>>2]|0,g)|0;a=a+1|0;if(!(Ra[e&127](b,i)|0)){d=0;h=6;break}if((a|0)>=(Qa[f[(f[b>>2]|0)+20>>2]&127](b)|0)){d=1;h=6;break}}if((h|0)==6)return d|0;return 0}function oj(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0;if(!(ho(a,b,c)|0)){d=0;return d|0}if(!(Qa[f[(f[a>>2]|0)+52>>2]&127](a)|0)){d=0;return d|0}c=a+4|0;e=a+8|0;g=f[c>>2]|0;if((f[e>>2]|0)==(g|0)){d=1;return d|0}h=a+36|0;a=0;i=g;while(1){g=f[(f[h>>2]|0)+(a<<2)>>2]|0;if(!(Sa[f[(f[g>>2]|0)+8>>2]&31](g,b,f[i+(a<<2)>>2]|0)|0)){d=0;j=7;break}a=a+1|0;i=f[c>>2]|0;if(a>>>0>=(f[e>>2]|0)-i>>2>>>0){d=1;j=7;break}}if((j|0)==7)return d|0;return 0}function pj(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0;d=u;u=u+16|0;e=d;f[a>>2]=0;f[a+4>>2]=0;f[a+8>>2]=0;if((b[c+11>>0]|0)<0){g=f[c>>2]|0;h=f[c+4>>2]|0;if(h>>>0>4294967279)aq(a);if(h>>>0<11){b[a+11>>0]=h;i=a}else{j=h+16&-16;k=ln(j)|0;f[a>>2]=k;f[a+8>>2]=j|-2147483648;f[a+4>>2]=h;i=k}Fo(i,g,h)|0;b[e>>0]=0;up(i+h|0,e)}else{f[a>>2]=f[c>>2];f[a+4>>2]=f[c+4>>2];f[a+8>>2]=f[c+8>>2]}u=d;return}function qj(a,c,d,e,g){a=a|0;c=c|0;d=d|0;e=e|0;g=g|0;var h=0,i=0;b[c+53>>0]=1;do if((f[c+4>>2]|0)==(e|0)){b[c+52>>0]=1;a=c+16|0;h=f[a>>2]|0;if(!h){f[a>>2]=d;f[c+24>>2]=g;f[c+36>>2]=1;if(!((g|0)==1?(f[c+48>>2]|0)==1:0))break;b[c+54>>0]=1;break}if((h|0)!=(d|0)){h=c+36|0;f[h>>2]=(f[h>>2]|0)+1;b[c+54>>0]=1;break}h=c+24|0;a=f[h>>2]|0;if((a|0)==2){f[h>>2]=g;i=g}else i=a;if((i|0)==1?(f[c+48>>2]|0)==1:0)b[c+54>>0]=1}while(0);return}function rj(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0;c=a+36|0;d=a+40|0;e=f[c>>2]|0;if((f[d>>2]|0)!=(e|0)){g=0;h=e;do{vg(h+(g*24|0)|0,b)|0;g=g+1|0;h=f[c>>2]|0}while(g>>>0<(((f[d>>2]|0)-h|0)/24|0)>>>0)}h=a+48|0;d=a+52|0;a=f[h>>2]|0;if((f[d>>2]|0)==(a|0))return 1;else{i=0;j=a}do{a=f[j+(i<<2)>>2]|0;ci(a<<1^a>>31,b)|0;i=i+1|0;j=f[h>>2]|0}while(i>>>0<(f[d>>2]|0)-j>>2>>>0);return 1}function sj(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0;e=a+d|0;c=c&255;if((d|0)>=67){while(a&3){b[a>>0]=c;a=a+1|0}g=e&-4|0;h=g-64|0;i=c|c<<8|c<<16|c<<24;while((a|0)<=(h|0)){f[a>>2]=i;f[a+4>>2]=i;f[a+8>>2]=i;f[a+12>>2]=i;f[a+16>>2]=i;f[a+20>>2]=i;f[a+24>>2]=i;f[a+28>>2]=i;f[a+32>>2]=i;f[a+36>>2]=i;f[a+40>>2]=i;f[a+44>>2]=i;f[a+48>>2]=i;f[a+52>>2]=i;f[a+56>>2]=i;f[a+60>>2]=i;a=a+64|0}while((a|0)<(g|0)){f[a>>2]=i;a=a+4|0}}while((a|0)<(e|0)){b[a>>0]=c;a=a+1|0}return e-d|0}function tj(a,c,d,e,g){a=a|0;c=c|0;d=d|0;e=e|0;g=g|0;var h=0;do if(!(fp(a,f[c+8>>2]|0,g)|0)){if(fp(a,f[c>>2]|0,g)|0){if((f[c+16>>2]|0)!=(d|0)?(h=c+20|0,(f[h>>2]|0)!=(d|0)):0){f[c+32>>2]=e;f[h>>2]=d;h=c+40|0;f[h>>2]=(f[h>>2]|0)+1;if((f[c+36>>2]|0)==1?(f[c+24>>2]|0)==2:0)b[c+54>>0]=1;f[c+44>>2]=4;break}if((e|0)==1)f[c+32>>2]=1}}else Vm(0,c,d,e);while(0);return}function uj(a){a=a|0;var b=0,c=0,d=0,e=0;b=a+80|0;c=f[b>>2]|0;f[b>>2]=0;if(c|0){b=c+-4|0;d=f[b>>2]|0;if(d|0){e=c+(d<<5)|0;do{e=e+-32|0;Fj(e)}while((e|0)!=(c|0))}Mq(b)}b=f[a+68>>2]|0;if(b|0){c=a+72|0;e=f[c>>2]|0;if((e|0)!=(b|0))f[c>>2]=e+(~((e+-4-b|0)>>>2)<<2);Oq(b)}b=a+44|0;e=f[b>>2]|0;f[b>>2]=0;if(e|0)Oq(e);e=f[a+32>>2]|0;if(!e){Fj(a);return}b=a+36|0;if((f[b>>2]|0)!=(e|0))f[b>>2]=e;Oq(e);Fj(a);return}function vj(a){a=a|0;var b=0,c=0,d=0;f[a>>2]=3092;b=f[a+136>>2]|0;if(b|0){c=a+140|0;d=f[c>>2]|0;if((d|0)!=(b|0))f[c>>2]=d+(~((d+-4-b|0)>>>2)<<2);Oq(b)}b=f[a+96>>2]|0;if(b|0){d=a+100|0;c=f[d>>2]|0;if((c|0)!=(b|0))f[d>>2]=c+(~((c+-4-b|0)>>>2)<<2);Oq(b)}b=f[a+76>>2]|0;if(b|0)Oq(b);b=f[a+64>>2]|0;if(b|0)Oq(b);b=f[a+52>>2]|0;if(b|0)Oq(b);b=f[a+40>>2]|0;if(!b)return;Oq(b);return}function wj(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0;if((d|0)<0){e=0;return e|0}do if(!b){d=a+4|0;g=f[d>>2]|0;h=f[a>>2]|0;i=g-h|0;if(i>>>0<c>>>0){Fi(a,c-i|0);break}if(i>>>0>c>>>0?(i=h+c|0,(i|0)!=(g|0)):0)f[d>>2]=i}else Cg(a,b,b+c|0);while(0);c=a+24|0;a=c;b=Vn(f[a>>2]|0,f[a+4>>2]|0,1,0)|0;a=c;f[a>>2]=b;f[a+4>>2]=I;e=1;return e|0}function xj(a,c,d,e,g,h,i){a=a|0;c=c|0;d=d|0;e=e|0;g=g|0;h=h|0;i=i|0;var j=0,k=0,l=0,m=0;if((-17-c|0)>>>0<d>>>0)aq(a);if((b[a+11>>0]|0)<0)j=f[a>>2]|0;else j=a;if(c>>>0<2147483623){k=d+c|0;d=c<<1;l=k>>>0<d>>>0?d:k;m=l>>>0<11?11:l+16&-16}else m=-17;l=ln(m)|0;if(g|0)Fo(l,j,g)|0;k=e-h-g|0;if(k|0)Fo(l+g+i|0,j+g+h|0,k)|0;if((c|0)!=10)Oq(j);f[a>>2]=l;f[a+8>>2]=m|-2147483648;return}function yj(a){a=a|0;var b=0,c=0,d=0;f[a>>2]=2728;b=f[a+136>>2]|0;if(b|0){c=a+140|0;d=f[c>>2]|0;if((d|0)!=(b|0))f[c>>2]=d+(~((d+-4-b|0)>>>2)<<2);Oq(b)}b=f[a+96>>2]|0;if(b|0){d=a+100|0;c=f[d>>2]|0;if((c|0)!=(b|0))f[d>>2]=c+(~((c+-4-b|0)>>>2)<<2);Oq(b)}b=f[a+76>>2]|0;if(b|0)Oq(b);b=f[a+64>>2]|0;if(b|0)Oq(b);b=f[a+52>>2]|0;if(b|0)Oq(b);b=f[a+40>>2]|0;if(!b)return;Oq(b);return}function zj(a,b){a=a|0;b=b|0;if(!b)return;else{zj(a,f[b>>2]|0);zj(a,f[b+4>>2]|0);Ej(b+20|0,f[b+24>>2]|0);Oq(b);return}}function Aj(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;Yf(a,b,c);c=f[a+100>>2]|0;d=f[a+96>>2]|0;a=d;if((c|0)==(d|0))return;e=f[b>>2]|0;b=(c-d|0)/12|0;d=0;do{c=a+(d*12|0)|0;f[c>>2]=f[e+(f[c>>2]<<2)>>2];c=a+(d*12|0)+4|0;f[c>>2]=f[e+(f[c>>2]<<2)>>2];c=a+(d*12|0)+8|0;f[c>>2]=f[e+(f[c>>2]<<2)>>2];d=d+1|0}while(d>>>0<b>>>0);return}function Bj(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0;d=a+64|0;if((f[d>>2]|0)==0?(e=ln(32)|0,yn(e),g=f[d>>2]|0,f[d>>2]=e,g|0):0){e=f[g>>2]|0;if(e|0){h=g+4|0;if((f[h>>2]|0)!=(e|0))f[h>>2]=e;Oq(e)}Oq(g)}g=Vl(f[a+28>>2]|0)|0;e=X(g,b[a+24>>0]|0)|0;g=((e|0)<0)<<31>>31;h=f[d>>2]|0;i=un(e|0,g|0,c|0,0)|0;if(!(wj(h,0,i,I)|0)){j=0;return j|0}Kk(a,f[d>>2]|0,e,g,0,0);f[a+80>>2]=c;j=1;return j|0}function Cj(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0;d=u;u=u+64|0;e=d;if(!(fp(a,b,0)|0))if((b|0)!=0?(g=Eh(b,1056,1040,0)|0,(g|0)!=0):0){b=e+4|0;h=b+52|0;do{f[b>>2]=0;b=b+4|0}while((b|0)<(h|0));f[e>>2]=g;f[e+8>>2]=a;f[e+12>>2]=-1;f[e+48>>2]=1;Ya[f[(f[g>>2]|0)+28>>2]&3](g,e,f[c>>2]|0,1);if((f[e+24>>2]|0)==1){f[c>>2]=f[e+16>>2];i=1}else i=0;j=i}else j=0;else j=1;u=d;return j|0}function Dj(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0;if(!c){d=0;return d|0}e=c+40|0;g=c+44|0;ci((f[g>>2]|0)-(f[e>>2]|0)>>2,b)|0;h=f[e>>2]|0;e=f[g>>2]|0;if((h|0)!=(e|0)){g=h;do{h=f[g>>2]|0;if(h|0){ci(f[h+40>>2]|0,b)|0;lg(a,b,h)|0}g=g+4|0}while((g|0)!=(e|0))}lg(a,b,c)|0;d=1;return d|0}function Ej(a,c){a=a|0;c=c|0;var d=0;if(!c)return;Ej(a,f[c>>2]|0);Ej(a,f[c+4>>2]|0);a=c+16|0;d=c+28|0;if((b[d+11>>0]|0)<0)Oq(f[d>>2]|0);if((b[a+11>>0]|0)<0)Oq(f[a>>2]|0);Oq(c);return}function Fj(a){a=a|0;var b=0,c=0,d=0,e=0,g=0,h=0;b=u;u=u+16|0;c=b;d=c;f[d>>2]=0;f[d+4>>2]=0;qf(a,2,c);c=f[a+12>>2]|0;d=a+16|0;e=f[d>>2]|0;if((e|0)==(c|0))g=c;else{h=e+(~((e+-4-c|0)>>>2)<<2)|0;f[d>>2]=h;g=h}f[a+24>>2]=0;f[a+28>>2]=0;if(c|0){if((g|0)!=(c|0))f[d>>2]=g+(~((g+-4-c|0)>>>2)<<2);Oq(c)}c=f[a>>2]|0;if(!c){u=b;return}g=a+4|0;a=f[g>>2]|0;if((a|0)!=(c|0))f[g>>2]=a+(~((a+-8-c|0)>>>3)<<3);Oq(c);u=b;return}function Gj(a){a=a|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0;c=a;a:do if(!(c&3)){d=a;e=4}else{g=a;h=c;while(1){if(!(b[g>>0]|0)){i=h;break a}j=g+1|0;h=j;if(!(h&3)){d=j;e=4;break}else g=j}}while(0);if((e|0)==4){e=d;while(1){k=f[e>>2]|0;if(!((k&-2139062144^-2139062144)&k+-16843009))e=e+4|0;else break}if(!((k&255)<<24>>24))l=e;else{k=e;while(1){e=k+1|0;if(!(b[e>>0]|0)){l=e;break}else k=e}}i=l}return i-c|0}function Hj(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0;e=u;u=u+16|0;g=e;h=a+11|0;i=b[h>>0]|0;j=i<<24>>24<0;if(j)k=f[a+4>>2]|0;else k=i&255;do if(k>>>0>=c>>>0)if(j){i=(f[a>>2]|0)+c|0;b[g>>0]=0;up(i,g);f[a+4>>2]=c;break}else{b[g>>0]=0;up(a+c|0,g);b[h>>0]=c;break}else hj(a,c-k|0,d)|0;while(0);u=e;return}function Ij(a){a=a|0;var b=0,c=0,d=0;if(!a)return;b=a+88|0;c=f[b>>2]|0;f[b>>2]=0;if(c|0){b=f[c+8>>2]|0;if(b|0){d=c+12|0;if((f[d>>2]|0)!=(b|0))f[d>>2]=b;Oq(b)}Oq(c)}c=f[a+68>>2]|0;if(c|0){b=a+72|0;d=f[b>>2]|0;if((d|0)!=(c|0))f[b>>2]=d+(~((d+-4-c|0)>>>2)<<2);Oq(c)}c=a+64|0;d=f[c>>2]|0;f[c>>2]=0;if(d|0){c=f[d>>2]|0;if(c|0){b=d+4|0;if((f[b>>2]|0)!=(c|0))f[b>>2]=c;Oq(c)}Oq(d)}Oq(a);return}function Jj(a,c,d,e,g,h,i,j,k,l){a=a|0;c=c|0;d=d|0;e=e|0;g=g|0;h=h|0;i=i|0;j=j|0;k=k|0;l=l|0;var m=0,n=0,o=0;f[a>>2]=d;if(d|0){m=d+16|0;n=f[m+4>>2]|0;o=a+8|0;f[o>>2]=f[m>>2];f[o+4>>2]=n;n=d+24|0;d=f[n+4>>2]|0;o=a+16|0;f[o>>2]=f[n>>2];f[o+4>>2]=d}b[a+24>>0]=e;f[a+28>>2]=g;b[a+32>>0]=h&1;h=a+40|0;f[h>>2]=i;f[h+4>>2]=j;j=a+48|0;f[j>>2]=k;f[j+4>>2]=l;f[a+56>>2]=c;return}function Kj(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0;c=ln(88)|0;d=c+60|0;e=c;g=e+60|0;do{f[e>>2]=0;e=e+4|0}while((e|0)<(g|0));f[d>>2]=c;d=c+64|0;f[d>>2]=0;f[d+4>>2]=0;f[d+8>>2]=0;f[d+12>>2]=0;f[d+16>>2]=0;f[d+20>>2]=0;d=cg(c,b)|0;f[a>>2]=d?c:0;a=d?0:c;if(d)return;Ii(a);Oq(a);return}function Lj(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0;if((f[c+76>>2]|0)>=0?(Tq(c)|0)!=0:0){d=a&255;e=a&255;if((e|0)!=(b[c+75>>0]|0)?(g=c+20|0,h=f[g>>2]|0,h>>>0<(f[c+16>>2]|0)>>>0):0){f[g>>2]=h+1;b[h>>0]=d;i=e}else i=Nj(c,a)|0;Sq(c);j=i}else k=3;do if((k|0)==3){i=a&255;e=a&255;if((e|0)!=(b[c+75>>0]|0)?(d=c+20|0,h=f[d>>2]|0,h>>>0<(f[c+16>>2]|0)>>>0):0){f[d>>2]=h+1;b[h>>0]=i;j=e;break}j=Nj(c,a)|0}while(0);return j|0}function Mj(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0;d=u;u=u+16|0;e=d+4|0;g=d;h=d+8|0;i=f[a+4>>2]|0;if((i|0)==-1){j=0;u=d;return j|0}b[h>>0]=i;i=c+16|0;a=f[i+4>>2]|0;if(!((a|0)>0|(a|0)==0&(f[i>>2]|0)>>>0>0)){f[g>>2]=f[c+4>>2];f[e>>2]=f[g>>2];Me(c,e,h,h+1|0)|0}j=1;u=d;return j|0}function Nj(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,i=0,j=0,k=0,l=0,m=0,n=0;d=u;u=u+16|0;e=d;g=c&255;b[e>>0]=g;i=a+16|0;j=f[i>>2]|0;if(!j)if(!(vl(a)|0)){k=f[i>>2]|0;l=4}else m=-1;else{k=j;l=4}do if((l|0)==4){j=a+20|0;i=f[j>>2]|0;if(i>>>0<k>>>0?(n=c&255,(n|0)!=(b[a+75>>0]|0)):0){f[j>>2]=i+1;b[i>>0]=g;m=n;break}if((Sa[f[a+36>>2]&31](a,e,1)|0)==1)m=h[e>>0]|0;else m=-1}while(0);u=d;return m|0}function Oj(a,b){a=a|0;b=b|0;if(!b)return;else{Oj(a,f[b>>2]|0);Oj(a,f[b+4>>2]|0);Ej(b+20|0,f[b+24>>2]|0);Oq(b);return}}function Pj(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0;e=u;u=u+16|0;g=e;h=e+4|0;f[g>>2]=c;c=ln(32)|0;f[h>>2]=c;f[h+8>>2]=-2147483616;f[h+4>>2]=17;i=c;j=14495;k=i+17|0;do{b[i>>0]=b[j>>0]|0;i=i+1|0;j=j+1|0}while((i|0)<(k|0));b[c+17>>0]=0;Xj(Hd(a,g)|0,h,d);if((b[h+11>>0]|0)>=0){u=e;return}Oq(f[h>>2]|0);u=e;return}function Qj(a,b){a=a|0;b=b|0;var c=0,d=0,e=0;c=f[a+16>>2]|0;if(((f[a+20>>2]|0)-c>>2|0)<=(b|0)){d=0;return d|0}e=f[c+(b<<2)>>2]|0;if((e|0)<0){d=0;return d|0}b=a+48|0;if((f[a+52>>2]|0)>>>0<=e>>>0)Ce(b,e+1|0,0);c=(f[b>>2]|0)+(e>>>5<<2)|0;f[c>>2]=f[c>>2]|1<<(e&31);c=f[a+36>>2]|0;if((f[a+40>>2]|0)-c>>2>>>0<=e>>>0){d=1;return d|0}Bp(f[c+(e<<2)>>2]|0);d=1;return d|0}function Rj(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;if(c>>>0>0|(c|0)==0&a>>>0>4294967295){e=d;f=a;g=c;while(1){c=hn(f|0,g|0,10,0)|0;e=e+-1|0;b[e>>0]=c&255|48;c=f;f=jp(f|0,g|0,10,0)|0;if(!(g>>>0>9|(g|0)==9&c>>>0>4294967295))break;else g=I}h=f;i=e}else{h=a;i=d}if(!h)j=i;else{d=h;h=i;while(1){i=h+-1|0;b[i>>0]=(d>>>0)%10|0|48;if(d>>>0<10){j=i;break}else{d=(d>>>0)/10|0;h=i}}}return j|0}function Sj(a){a=a|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0;c=a;while(1){d=c+1|0;if(!(eq(b[c>>0]|0)|0))break;else c=d}a=b[c>>0]|0;switch(a<<24>>24|0){case 45:{e=1;f=5;break}case 43:{e=0;f=5;break}default:{g=0;h=c;i=a}}if((f|0)==5){g=e;h=d;i=b[d>>0]|0}if(!(Aq(i<<24>>24)|0))j=0;else{i=0;d=h;while(1){h=(i*10|0)+48-(b[d>>0]|0)|0;d=d+1|0;if(!(Aq(b[d>>0]|0)|0)){j=h;break}else i=h}}return (g|0?j:0-j|0)|0}function Tj(a,c,d){a=a|0;c=c|0;d=$(d);var e=0,g=0,h=0;e=u;u=u+16|0;g=e;il(g,d);h=Ai(a,c)|0;c=h+11|0;if((b[c>>0]|0)<0){b[f[h>>2]>>0]=0;f[h+4>>2]=0}else{b[h>>0]=0;b[c>>0]=0}gh(h,0);f[h>>2]=f[g>>2];f[h+4>>2]=f[g+4>>2];f[h+8>>2]=f[g+8>>2];u=e;return}function Uj(a){a=a|0;var b=0,c=0,d=0,e=0,g=0,h=0;b=u;u=u+16|0;c=b+8|0;d=b+4|0;e=b;f[e>>2]=f[(f[a+4>>2]|0)+80>>2];g=f[a+44>>2]|0;a=g+16|0;h=f[a+4>>2]|0;if((h|0)>0|(h|0)==0&(f[a>>2]|0)>>>0>0){u=b;return 1}f[d>>2]=f[g+4>>2];f[c>>2]=f[d>>2];Me(g,c,e,e+4|0)|0;u=b;return 1}function Vj(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0;e=u;u=u+16|0;g=e;ll(g,d&1);d=Ai(a,c)|0;c=d+11|0;if((b[c>>0]|0)<0){b[f[d>>2]>>0]=0;f[d+4>>2]=0}else{b[d>>0]=0;b[c>>0]=0}gh(d,0);f[d>>2]=f[g>>2];f[d+4>>2]=f[g+4>>2];f[d+8>>2]=f[g+8>>2];u=e;return}function Wj(a){a=a|0;if(!a)return;Ej(a+24|0,f[a+28>>2]|0);zj(a+12|0,f[a+16>>2]|0);Ej(a,f[a+4>>2]|0);Oq(a);return}function Xj(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0;e=u;u=u+16|0;g=e;ll(g,d);d=Ai(a,c)|0;c=d+11|0;if((b[c>>0]|0)<0){b[f[d>>2]>>0]=0;f[d+4>>2]=0}else{b[d>>0]=0;b[c>>0]=0}gh(d,0);f[d>>2]=f[g>>2];f[d+4>>2]=f[g+4>>2];f[d+8>>2]=f[g+8>>2];u=e;return}function Yj(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0;e=Rg(a,c)|0;if((e|0)==(a+4|0)){g=-1;h=(g|0)==-1;i=(g|0)!=0;j=h?d:i;return j|0}a=e+28|0;if((b[a+11>>0]|0)<0)k=f[a>>2]|0;else k=a;g=Sj(k)|0;h=(g|0)==-1;i=(g|0)!=0;j=h?d:i;return j|0}function Zj(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0;d=u;u=u+16|0;e=d;if(c>>>0>10){g=0;u=d;return g|0}h=ln(48)|0;f[e>>2]=h;f[e+8>>2]=-2147483600;f[e+4>>2]=33;i=h;j=15987;k=i+33|0;do{b[i>>0]=b[j>>0]|0;i=i+1|0;j=j+1|0}while((i|0)<(k|0));b[h+33>>0]=0;Xj(a,e,c);if((b[e+11>>0]|0)<0)Oq(f[e>>2]|0);g=1;u=d;return g|0}function _j(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0;c=f[b>>2]|0;if((c|0)==-1)return 1;b=c*3|0;if((b|0)==-1)return 1;c=f[a>>2]|0;a=f[c+(b<<2)>>2]|0;d=b+1|0;e=((d>>>0)%3|0|0)==0?b+-2|0:d;if((e|0)==-1)g=-1;else g=f[c+(e<<2)>>2]|0;e=(((b>>>0)%3|0|0)==0?2:-1)+b|0;if((e|0)==-1)h=-1;else h=f[c+(e<<2)>>2]|0;if((a|0)==(g|0))return 1;else return (a|0)==(h|0)|(g|0)==(h|0)|0;return 0}function $j(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,i=0,j=0,k=0;d=0;while(1){if((h[16654+d>>0]|0)==(a|0)){e=2;break}g=d+1|0;if((g|0)==87){i=16742;j=87;e=5;break}else d=g}if((e|0)==2)if(!d)k=16742;else{i=16742;j=d;e=5}if((e|0)==5)while(1){e=0;d=i;do{a=d;d=d+1|0}while((b[a>>0]|0)!=0);j=j+-1|0;if(!j){k=d;break}else{i=d;e=5}}return jq(k,f[c+20>>2]|0)|0}function ak(a,b){a=+a;b=b|0;var c=0,d=0,e=0,g=0.0,h=0.0,i=0,j=0.0;p[s>>3]=a;c=f[s>>2]|0;d=f[s+4>>2]|0;e=Yn(c|0,d|0,52)|0;switch(e&2047){case 0:{if(a!=0.0){g=+ak(a*18446744073709551616.0,b);h=g;i=(f[b>>2]|0)+-64|0}else{h=a;i=0}f[b>>2]=i;j=h;break}case 2047:{j=a;break}default:{f[b>>2]=(e&2047)+-1022;f[s>>2]=c;f[s+4>>2]=d&-2146435073|1071644672;j=+p[s>>3]}}return +j}function bk(a,b){a=+a;b=b|0;var c=0.0,d=0,e=0,g=0.0,h=0;if((b|0)<=1023)if((b|0)<-1022){c=a*2.2250738585072014e-308;d=(b|0)<-2044;e=b+2044|0;g=d?c*2.2250738585072014e-308:c;h=d?((e|0)>-1022?e:-1022):b+1022|0}else{g=a;h=b}else{c=a*8988465674311579538646525.0e283;e=(b|0)>2046;d=b+-2046|0;g=e?c*8988465674311579538646525.0e283:c;h=e?((d|0)<1023?d:1023):b+-1023|0}b=Tn(h+1023|0,0,52)|0;h=I;f[s>>2]=b;f[s+4>>2]=h;return +(g*+p[s>>3])}function ck(a){a=a|0;var b=0,c=0,d=0,e=0,g=0,h=0;if(!(f[a+80>>2]|0)){b=0;return b|0}c=a+8|0;d=a+12|0;a=f[c>>2]|0;if(((f[d>>2]|0)-a|0)>0){e=0;g=a}else{b=1;return b|0}while(1){a=f[g+(e<<2)>>2]|0;e=e+1|0;if(!(Gl(a,a)|0)){b=0;h=5;break}g=f[c>>2]|0;if((e|0)>=((f[d>>2]|0)-g>>2|0)){b=1;h=5;break}}if((h|0)==5)return b|0;return 0}function dk(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0;c=a+36|0;d=a+40|0;e=f[c>>2]|0;if((f[d>>2]|0)==(e|0)){g=1;return g|0}h=a+60|0;a=0;i=e;while(1){e=f[i+(a<<2)>>2]|0;a=a+1|0;if(!(Sa[f[(f[e>>2]|0)+20>>2]&31](e,h,b)|0)){g=0;j=5;break}i=f[c>>2]|0;if(a>>>0>=(f[d>>2]|0)-i>>2>>>0){g=1;j=5;break}}if((j|0)==5)return g|0;return 0}function ek(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0;c=a+36|0;d=a+40|0;a=f[c>>2]|0;if((f[d>>2]|0)==(a|0)){e=1;return e|0}else{g=0;h=a}while(1){a=f[h+(g<<2)>>2]|0;g=g+1|0;if(!(Ra[f[(f[a>>2]|0)+24>>2]&127](a,b)|0)){e=0;i=4;break}h=f[c>>2]|0;if(g>>>0>=(f[d>>2]|0)-h>>2>>>0){e=1;i=4;break}}if((i|0)==4)return e|0;return 0}function fk(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0;f[a>>2]=0;c=a+4|0;f[c>>2]=0;f[a+8>>2]=0;d=b+4|0;e=(f[d>>2]|0)-(f[b>>2]|0)|0;g=e>>2;if(!g)return;if(g>>>0>1073741823)aq(a);h=ln(e)|0;f[c>>2]=h;f[a>>2]=h;f[a+8>>2]=h+(g<<2);g=f[b>>2]|0;b=(f[d>>2]|0)-g|0;if((b|0)<=0)return;kh(h|0,g|0,b|0)|0;f[c>>2]=h+(b>>>2<<2);return}function gk(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0;c=a+8|0;d=f[a>>2]|0;if((f[c>>2]|0)-d>>2>>>0>=b>>>0)return;e=a+4|0;if(b>>>0>1073741823){g=ra(8)|0;Oo(g,16035);f[g>>2]=7256;va(g|0,1112,110)}g=(f[e>>2]|0)-d|0;h=ln(b<<2)|0;if((g|0)>0)kh(h|0,d|0,g|0)|0;f[a>>2]=h;f[e>>2]=h+(g>>2<<2);f[c>>2]=h+(b<<2);if(!d)return;Oq(d);return}function hk(a){a=a|0;var b=0,c=0,d=0,e=0,g=0,h=0,i=0;b=a+36|0;c=a+40|0;d=f[b>>2]|0;if((f[c>>2]|0)==(d|0)){e=1;return e|0}g=a+60|0;a=0;h=d;while(1){d=f[h+(a<<2)>>2]|0;a=a+1|0;if(!(Ra[f[(f[d>>2]|0)+16>>2]&127](d,g)|0)){e=0;i=5;break}h=f[b>>2]|0;if(a>>>0>=(f[c>>2]|0)-h>>2>>>0){e=1;i=5;break}}if((i|0)==5)return e|0;return 0}function ik(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0;d=f[a+176>>2]|0;e=f[a+172>>2]|0;a=e;if((d|0)==(e|0))return 0;g=(d-e|0)/136|0;e=0;while(1){if((f[a+(e*136|0)>>2]|0)==(c|0)){h=4;break}d=e+1|0;if(d>>>0<g>>>0)e=d;else{h=6;break}}if((h|0)==4)return ((b[a+(e*136|0)+100>>0]|0)==0?0:a+(e*136|0)+4|0)|0;else if((h|0)==6)return 0;return 0}function jk(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0;d=u;u=u+16|0;e=d;g=ln(16)|0;f[e>>2]=g;f[e+8>>2]=-2147483632;f[e+4>>2]=15;h=g;i=14479;j=h+15|0;do{b[h>>0]=b[i>>0]|0;h=h+1|0;i=i+1|0}while((h|0)<(j|0));b[g+15>>0]=0;Xj(a,e,c);if((b[e+11>>0]|0)>=0){u=d;return}Oq(f[e>>2]|0);u=d;return}function kk(a,b){a=a|0;b=b|0;var c=0,d=0;c=f[a+72>>2]|0;if(!c){d=0;return d|0}f[c+4>>2]=a+60;if(!(Qa[f[(f[c>>2]|0)+12>>2]&127](c)|0)){d=0;return d|0}if(!(Qa[f[(f[a>>2]|0)+40>>2]&127](a)|0)){d=0;return d|0}if(!(Ra[f[(f[a>>2]|0)+44>>2]&127](a,b)|0)){d=0;return d|0}d=Ra[f[(f[a>>2]|0)+48>>2]&127](a,b)|0;return d|0}function lk(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;f[a>>2]=0;d=a+4|0;f[d>>2]=0;f[a+8>>2]=0;if(!b)return;if(b>>>0>357913941)aq(a);e=ln(b*12|0)|0;f[d>>2]=e;f[a>>2]=e;f[a+8>>2]=e+(b*12|0);a=b;b=e;do{fk(b,c);b=(f[d>>2]|0)+12|0;f[d>>2]=b;a=a+-1|0}while((a|0)!=0);return}function mk(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0;c=f[b>>2]|0;if(!c){d=0;return d|0}e=a+44|0;g=f[e>>2]|0;if(g>>>0<(f[a+48>>2]|0)>>>0){f[b>>2]=0;f[g>>2]=c;f[e>>2]=(f[e>>2]|0)+4;d=1;return d|0}else{Ug(a+40|0,b);d=1;return d|0}return 0}function nk(a){a=a|0;var b=0,c=0,d=0;f[a>>2]=3564;b=f[a+64>>2]|0;if(b|0){c=a+68|0;d=f[c>>2]|0;if((d|0)!=(b|0))f[c>>2]=d+(~((d+-4-b|0)>>>2)<<2);Oq(b)}f[a+12>>2]=3588;b=f[a+32>>2]|0;if(b|0)Oq(b);b=f[a+20>>2]|0;if(!b){Oq(a);return}Oq(b);Oq(a);return}function ok(a){a=a|0;var b=0,c=0,d=0;f[a>>2]=3344;f[a+40>>2]=1196;b=f[a+48>>2]|0;if(b|0){c=a+52|0;d=f[c>>2]|0;if((d|0)!=(b|0))f[c>>2]=d+(~((d+-4-b|0)>>>2)<<2);Oq(b)}f[a>>2]=1476;b=a+36|0;d=f[b>>2]|0;f[b>>2]=0;if(!d){Ni(a);Oq(a);return}Va[f[(f[d>>2]|0)+4>>2]&127](d);Ni(a);Oq(a);return}function pk(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,i=0;f[c>>2]=2;d=a+4|0;a=c+8|0;e=f[a>>2]|0;g=(f[c+12>>2]|0)-e|0;if(g>>>0<4294967292){Lk(a,g+4|0,0);i=f[a>>2]|0}else i=e;e=i+g|0;g=h[d>>0]|h[d+1>>0]<<8|h[d+2>>0]<<16|h[d+3>>0]<<24;b[e>>0]=g;b[e+1>>0]=g>>8;b[e+2>>0]=g>>16;b[e+3>>0]=g>>24;return}function qk(a){a=a|0;var b=0,c=0,d=0;f[a>>2]=3612;b=f[a+64>>2]|0;if(b|0){c=a+68|0;d=f[c>>2]|0;if((d|0)!=(b|0))f[c>>2]=d+(~((d+-4-b|0)>>>2)<<2);Oq(b)}f[a+12>>2]=3636;b=f[a+32>>2]|0;if(b|0)Oq(b);b=f[a+20>>2]|0;if(!b){Oq(a);return}Oq(b);Oq(a);return}function rk(a){a=a|0;var b=0,c=0,d=0;f[a>>2]=2188;b=f[a+76>>2]|0;if(b|0)Oq(b);b=a+68|0;c=f[b>>2]|0;f[b>>2]=0;if(c|0)Mq(c);f[a>>2]=1544;c=f[a+32>>2]|0;if(!c){Oq(a);return}b=a+36|0;d=f[b>>2]|0;if((d|0)!=(c|0))f[b>>2]=d+(~((d+-4-c|0)>>>2)<<2);Oq(c);Oq(a);return}function sk(a,c,d){a=a|0;c=c|0;d=$(d);var e=0,g=Oa,h=0;e=Rg(a,c)|0;if((e|0)==(a+4|0)){g=d;return $(g)}a=e+28|0;if((b[a+11>>0]|0)<0)h=f[a>>2]|0;else h=a;g=$(+Iq(h));return $(g)}function tk(a){a=a|0;var b=0,c=0,d=0,e=0,g=0,h=0;b=u;u=u+16|0;c=b;d=c;f[d>>2]=0;f[d+4>>2]=0;qf(a,2,c);c=f[a+12>>2]|0;d=a+16|0;e=f[d>>2]|0;if((e|0)==(c|0)){g=a+24|0;f[g>>2]=0;h=a+28|0;f[h>>2]=0;u=b;return}f[d>>2]=e+(~((e+-4-c|0)>>>2)<<2);g=a+24|0;f[g>>2]=0;h=a+28|0;f[h>>2]=0;u=b;return}function uk(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0;c=f[a+176>>2]|0;d=f[a+172>>2]|0;e=d;a:do if((c|0)!=(d|0)){g=(c-d|0)/136|0;h=0;while(1){if((f[e+(h*136|0)>>2]|0)==(b|0))break;i=h+1|0;if(i>>>0<g>>>0)h=i;else break a}j=e+(h*136|0)+104|0;return j|0}while(0);j=a+40|0;return j|0}function vk(a){a=a|0;var b=0,c=0,d=0;f[a>>2]=3564;b=f[a+64>>2]|0;if(b|0){c=a+68|0;d=f[c>>2]|0;if((d|0)!=(b|0))f[c>>2]=d+(~((d+-4-b|0)>>>2)<<2);Oq(b)}f[a+12>>2]=3588;b=f[a+32>>2]|0;if(b|0)Oq(b);b=f[a+20>>2]|0;if(!b)return;Oq(b);return}function wk(a){a=a|0;var b=0,c=0,d=0;f[a>>2]=1768;b=f[a+76>>2]|0;if(b|0)Oq(b);b=a+68|0;c=f[b>>2]|0;f[b>>2]=0;if(c|0)Mq(c);f[a>>2]=1544;c=f[a+32>>2]|0;if(!c){Oq(a);return}b=a+36|0;d=f[b>>2]|0;if((d|0)!=(c|0))f[b>>2]=d+(~((d+-4-c|0)>>>2)<<2);Oq(c);Oq(a);return}function xk(a){a=a|0;var b=0,c=0,d=0;f[a>>2]=3344;f[a+40>>2]=1196;b=f[a+48>>2]|0;if(b|0){c=a+52|0;d=f[c>>2]|0;if((d|0)!=(b|0))f[c>>2]=d+(~((d+-4-b|0)>>>2)<<2);Oq(b)}f[a>>2]=1476;b=a+36|0;d=f[b>>2]|0;f[b>>2]=0;if(!d){Ni(a);return}Va[f[(f[d>>2]|0)+4>>2]&127](d);Ni(a);return}function yk(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0;Nc(a,b);if((b|0)<=-1)return;c=a+88|0;d=f[c>>2]|0;e=f[a+84>>2]|0;if((d-e>>2|0)<=(b|0))return;a=e+(b<<2)|0;b=a+4|0;e=d-b|0;g=e>>2;if(!g)h=d;else{im(a|0,b|0,e|0)|0;h=f[c>>2]|0}e=a+(g<<2)|0;if((h|0)==(e|0))return;f[c>>2]=h+(~((h+-4-e|0)>>>2)<<2);return}function zk(a){a=a|0;var b=0,c=0,d=0,e=0,g=0,h=0;b=f[a+32>>2]|0;c=f[a+36>>2]|0;if((b|0)==(c|0)){d=1;return d|0}e=a+8|0;g=a+44|0;a=b;while(1){b=f[(f[e>>2]|0)+(f[a>>2]<<2)>>2]|0;a=a+4|0;if(!(Ra[f[(f[b>>2]|0)+20>>2]&127](b,f[g>>2]|0)|0)){d=0;h=5;break}if((a|0)==(c|0)){d=1;h=5;break}}if((h|0)==5)return d|0;return 0}function Ak(a){a=a|0;var b=0,c=0,d=0;f[a>>2]=3612;b=f[a+64>>2]|0;if(b|0){c=a+68|0;d=f[c>>2]|0;if((d|0)!=(b|0))f[c>>2]=d+(~((d+-4-b|0)>>>2)<<2);Oq(b)}f[a+12>>2]=3636;b=f[a+32>>2]|0;if(b|0)Oq(b);b=f[a+20>>2]|0;if(!b)return;Oq(b);return}function Bk(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0.0;d=u;u=u+128|0;e=d;g=e;h=g+124|0;do{f[g>>2]=0;g=g+4|0}while((g|0)<(h|0));g=e+4|0;f[g>>2]=a;h=e+8|0;f[h>>2]=-1;f[e+44>>2]=a;f[e+76>>2]=-1;Ym(e,0);i=+Rc(e,c,1);c=(f[g>>2]|0)-(f[h>>2]|0)+(f[e+108>>2]|0)|0;if(b|0)f[b>>2]=c|0?a+c|0:a;u=d;return +i}function Ck(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var g=0,h=0;a=c+16|0;g=f[a>>2]|0;do if(g){if((g|0)!=(d|0)){h=c+36|0;f[h>>2]=(f[h>>2]|0)+1;f[c+24>>2]=2;b[c+54>>0]=1;break}h=c+24|0;if((f[h>>2]|0)==2)f[h>>2]=e}else{f[a>>2]=d;f[c+24>>2]=e;f[c+36>>2]=1}while(0);return}function Dk(a){a=a|0;var b=0,c=0;f[a>>2]=2188;b=f[a+76>>2]|0;if(b|0)Oq(b);b=a+68|0;c=f[b>>2]|0;f[b>>2]=0;if(c|0)Mq(c);f[a>>2]=1544;c=f[a+32>>2]|0;if(!c)return;b=a+36|0;a=f[b>>2]|0;if((a|0)!=(c|0))f[b>>2]=a+(~((a+-4-c|0)>>>2)<<2);Oq(c);return}function Ek(a){a=a|0;var c=0,d=0,e=0;c=a+74|0;d=b[c>>0]|0;b[c>>0]=d+255|d;d=a+20|0;c=a+28|0;if((f[d>>2]|0)>>>0>(f[c>>2]|0)>>>0)Sa[f[a+36>>2]&31](a,0,0)|0;f[a+16>>2]=0;f[c>>2]=0;f[d>>2]=0;d=f[a>>2]|0;if(!(d&4)){c=(f[a+44>>2]|0)+(f[a+48>>2]|0)|0;f[a+8>>2]=c;f[a+4>>2]=c;e=d<<27>>31}else{f[a>>2]=d|32;e=-1}return e|0}function Fk(a,c){a=a|0;c=c|0;var d=0,e=0,g=0;d=Rg(a,c)|0;if((d|0)==(a+4|0)){e=0;return e|0}a=d+28|0;if((b[a+11>>0]|0)<0)g=f[a>>2]|0;else g=a;e=((Sj(g)|0)+1|0)>>>0>1;return e|0}function Gk(a){a=a|0;var b=0,c=0,d=0;f[a>>2]=6152;b=f[a+96>>2]|0;if(b|0){c=a+100|0;d=f[c>>2]|0;if((d|0)!=(b|0))f[c>>2]=d+(~(((d+-12-b|0)>>>0)/12|0)*12|0);Oq(b)}b=f[a+84>>2]|0;if(!b){Og(a);Oq(a);return}d=a+88|0;c=f[d>>2]|0;if((c|0)!=(b|0))f[d>>2]=c+(~((c+-4-b|0)>>>2)<<2);Oq(b);Og(a);Oq(a);return}function Hk(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0;e=Rg(a,c)|0;if((e|0)==(a+4|0)){g=d;return g|0}d=e+28|0;if((b[d+11>>0]|0)<0)h=f[d>>2]|0;else h=d;g=Sj(h)|0;return g|0}function Ik(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0;e=b>>31|((b|0)<0?-1:0)<<1;f=((b|0)<0?-1:0)>>31|((b|0)<0?-1:0)<<1;g=d>>31|((d|0)<0?-1:0)<<1;h=((d|0)<0?-1:0)>>31|((d|0)<0?-1:0)<<1;i=Xn(e^a|0,f^b|0,e|0,f|0)|0;b=I;a=g^e;e=h^f;return Xn((Ld(i,b,Xn(g^c|0,h^d|0,g|0,h|0)|0,I,0)|0)^a|0,I^e|0,a|0,e|0)|0}function Jk(a){a=a|0;var b=0,c=0;f[a>>2]=1768;b=f[a+76>>2]|0;if(b|0)Oq(b);b=a+68|0;c=f[b>>2]|0;f[b>>2]=0;if(c|0)Mq(c);f[a>>2]=1544;c=f[a+32>>2]|0;if(!c)return;b=a+36|0;a=f[b>>2]|0;if((a|0)!=(c|0))f[b>>2]=a+(~((a+-4-c|0)>>>2)<<2);Oq(c);return}function Kk(a,b,c,d,e,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;g=g|0;var h=0,i=0,j=0;f[a>>2]=b;h=b+16|0;i=f[h+4>>2]|0;j=a+8|0;f[j>>2]=f[h>>2];f[j+4>>2]=i;i=b+24|0;b=f[i+4>>2]|0;j=a+16|0;f[j>>2]=f[i>>2];f[j+4>>2]=b;b=a+40|0;f[b>>2]=c;f[b+4>>2]=d;d=a+48|0;f[d>>2]=e;f[d+4>>2]=g;return}function Lk(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0;c=a+4|0;d=f[c>>2]|0;e=f[a>>2]|0;g=d-e|0;h=e;e=d;if(g>>>0>=b>>>0){if(g>>>0>b>>>0?(d=h+b|0,(d|0)!=(e|0)):0)f[c>>2]=d}else Fi(a,b-g|0);g=a+24|0;a=g;b=Vn(f[a>>2]|0,f[a+4>>2]|0,1,0)|0;a=g;f[a>>2]=b;f[a+4>>2]=I;return}function Mk(a,c){a=a|0;c=c|0;var d=0,e=0,g=0;d=Rg(a,c)|0;if((d|0)==(a+4|0)){e=-1;return e|0}a=d+28|0;if((b[a+11>>0]|0)<0)g=f[a>>2]|0;else g=a;e=Sj(g)|0;return e|0}function Nk(a){a=a|0;var b=0,c=0,d=0;f[a>>2]=6152;b=f[a+96>>2]|0;if(b|0){c=a+100|0;d=f[c>>2]|0;if((d|0)!=(b|0))f[c>>2]=d+(~(((d+-12-b|0)>>>0)/12|0)*12|0);Oq(b)}b=f[a+84>>2]|0;if(!b){Og(a);return}d=a+88|0;c=f[d>>2]|0;if((c|0)!=(b|0))f[d>>2]=c+(~((c+-4-b|0)>>>2)<<2);Oq(b);Og(a);return}function Ok(a){a=a|0;var c=0,d=0,e=0;f[a>>2]=0;f[a+4>>2]=0;f[a+8>>2]=0;f[a+12>>2]=0;f[a+16>>2]=0;f[a+20>>2]=0;b[a+24>>0]=1;c=a+68|0;d=a+28|0;e=d+40|0;do{f[d>>2]=0;d=d+4|0}while((d|0)<(e|0));f[c>>2]=a;c=a+72|0;f[c>>2]=0;f[c+4>>2]=0;f[c+8>>2]=0;f[c+12>>2]=0;f[c+16>>2]=0;f[c+20>>2]=0;return}function Pk(a){a=a|0;var b=0,c=0,d=0;f[a>>2]=2244;b=f[a+76>>2]|0;if(b|0)Oq(b);f[a>>2]=1544;b=f[a+32>>2]|0;if(!b){Oq(a);return}c=a+36|0;d=f[c>>2]|0;if((d|0)!=(b|0))f[c>>2]=d+(~((d+-4-b|0)>>>2)<<2);Oq(b);Oq(a);return}function Qk(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0,g=0,h=0;f=u;u=u+256|0;g=f;if((c|0)>(d|0)&(e&73728|0)==0){e=c-d|0;sj(g|0,b<<24>>24|0,(e>>>0<256?e:256)|0)|0;if(e>>>0>255){b=c-d|0;d=e;do{Xo(a,g,256);d=d+-256|0}while(d>>>0>255);h=b&255}else h=e;Xo(a,g,h)}u=f;return}function Rk(a){a=a|0;var b=0,c=0,d=0;f[a>>2]=1824;b=f[a+76>>2]|0;if(b|0)Oq(b);f[a>>2]=1544;b=f[a+32>>2]|0;if(!b){Oq(a);return}c=a+36|0;d=f[c>>2]|0;if((d|0)!=(b|0))f[c>>2]=d+(~((d+-4-b|0)>>>2)<<2);Oq(b);Oq(a);return}function Sk(a,b,c,d,e,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;g=g|0;var h=0;if(fp(a,f[b+8>>2]|0,g)|0)qj(0,b,c,d,e);else{h=f[a+8>>2]|0;_a[f[(f[h>>2]|0)+20>>2]&3](h,b,c,d,e,g)}return}function Tk(a){a=a|0;var b=0,c=0,d=0;f[a>>2]=2300;Fj(a+108|0);f[a>>2]=1544;b=f[a+32>>2]|0;if(!b){Oq(a);return}c=a+36|0;d=f[c>>2]|0;if((d|0)!=(b|0))f[c>>2]=d+(~((d+-4-b|0)>>>2)<<2);Oq(b);Oq(a);return}function Uk(a){a=a|0;var b=0,c=0,d=0;f[a>>2]=1880;Fj(a+108|0);f[a>>2]=1544;b=f[a+32>>2]|0;if(!b){Oq(a);return}c=a+36|0;d=f[c>>2]|0;if((d|0)!=(b|0))f[c>>2]=d+(~((d+-4-b|0)>>>2)<<2);Oq(b);Oq(a);return}function Vk(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;a:do if(!d)e=0;else{f=a;g=d;h=c;while(1){i=b[f>>0]|0;j=b[h>>0]|0;if(i<<24>>24!=j<<24>>24)break;g=g+-1|0;if(!g){e=0;break a}else{f=f+1|0;h=h+1|0}}e=(i&255)-(j&255)|0}while(0);return e|0}function Wk(a){a=a|0;if(!(f[a+44>>2]|0))return 0;if(!(f[a+48>>2]|0))return 0;if(!(f[a+24>>2]|0))return 0;if(!(f[a+28>>2]|0))return 0;if(!(f[a+32>>2]|0))return 0;else return (f[a+36>>2]|0)!=0|0;return 0}function Xk(a){a=a|0;var b=0,c=0;f[a>>2]=2244;b=f[a+76>>2]|0;if(b|0)Oq(b);f[a>>2]=1544;b=f[a+32>>2]|0;if(!b)return;c=a+36|0;a=f[c>>2]|0;if((a|0)!=(b|0))f[c>>2]=a+(~((a+-4-b|0)>>>2)<<2);Oq(b);return}function Yk(a){a=a|0;var c=0,d=0;f[a>>2]=0;f[a+4>>2]=0;f[a+8>>2]=0;c=0;while(1){if((c|0)==3)break;f[a+(c<<2)>>2]=0;c=c+1|0}if((b[a+11>>0]|0)<0)d=(f[a+8>>2]&2147483647)+-1|0;else d=10;Hj(a,d,0);return}function Zk(a){a=a|0;var b=0,c=0,d=0,e=0.0,g=0.0;b=f[a+8>>2]|0;if((b|0)<2){c=0;d=0;I=c;return d|0}e=+(b|0);g=+Zg(e)*e;e=+W(+(g-+p[a>>3]));c=+K(e)>=1.0?(e>0.0?~~+Y(+J(e/4294967296.0),4294967295.0)>>>0:~~+W((e-+(~~e>>>0))/4294967296.0)>>>0):0;d=~~e>>>0;I=c;return d|0}function _k(a){a=a|0;var b=0,c=0;f[a>>2]=1824;b=f[a+76>>2]|0;if(b|0)Oq(b);f[a>>2]=1544;b=f[a+32>>2]|0;if(!b)return;c=a+36|0;a=f[c>>2]|0;if((a|0)!=(b|0))f[c>>2]=a+(~((a+-4-b|0)>>>2)<<2);Oq(b);return}function $k(a,b){a=a|0;b=b|0;var c=0,d=0,e=0;c=f[a+16>>2]|0;if(((f[a+20>>2]|0)-c>>2|0)<=(b|0)){d=0;return d|0}e=f[c+(b<<2)>>2]|0;if((e|0)<0){d=0;return d|0}b=f[(f[a+36>>2]|0)+(e<<2)>>2]|0;e=f[b+32>>2]|0;if(e|0){d=e;return d|0}d=f[b+8>>2]|0;return d|0}function al(a){a=a|0;var b=0,c=0,d=0;f[a>>2]=1232;b=f[a+16>>2]|0;if(b|0){c=a+20|0;d=f[c>>2]|0;if((d|0)!=(b|0))f[c>>2]=d+(~((d+-4-b|0)>>>2)<<2);Oq(b)}b=f[a+4>>2]|0;if(!b)return;d=a+8|0;a=f[d>>2]|0;if((a|0)!=(b|0))f[d>>2]=a+(~((a+-4-b|0)>>>2)<<2);Oq(b);return}function bl(a){a=a|0;var b=0,c=0;f[a>>2]=2300;Fj(a+108|0);f[a>>2]=1544;b=f[a+32>>2]|0;if(!b)return;c=a+36|0;a=f[c>>2]|0;if((a|0)!=(b|0))f[c>>2]=a+(~((a+-4-b|0)>>>2)<<2);Oq(b);return}function cl(a){a=a|0;if(!(f[a+64>>2]|0))return 0;if(!(f[a+68>>2]|0))return 0;if(!(f[a+44>>2]|0))return 0;if(!(f[a+48>>2]|0))return 0;if(!(f[a+52>>2]|0))return 0;else return (f[a+56>>2]|0)!=0|0;return 0}function dl(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0;if(fp(a,f[b+8>>2]|0,0)|0)Ck(0,b,c,d);else{e=f[a+8>>2]|0;Ya[f[(f[e>>2]|0)+28>>2]&3](e,b,c,d)}return}function el(a){a=a|0;var b=0,c=0;f[a>>2]=1880;Fj(a+108|0);f[a>>2]=1544;b=f[a+32>>2]|0;if(!b)return;c=a+36|0;a=f[c>>2]|0;if((a|0)!=(b|0))f[c>>2]=a+(~((a+-4-b|0)>>>2)<<2);Oq(b);return}function fl(a,b){a=a|0;b=b|0;var c=0,d=0;if((b|0)<0){c=0;return c|0}d=f[a+4>>2]|0;if(((f[d+12>>2]|0)-(f[d+8>>2]|0)>>2|0)<=(b|0)){c=0;return c|0}d=f[(f[a+8>>2]|0)+(f[(f[a+20>>2]|0)+(b<<2)>>2]<<2)>>2]|0;c=Ra[f[(f[d>>2]|0)+36>>2]&127](d,b)|0;return c|0}function gl(a,b){a=a|0;b=b|0;var c=0,d=0;if((b|0)<0){c=0;return c|0}d=f[a+4>>2]|0;if(((f[d+12>>2]|0)-(f[d+8>>2]|0)>>2|0)<=(b|0)){c=0;return c|0}d=f[(f[a+8>>2]|0)+(f[(f[a+20>>2]|0)+(b<<2)>>2]<<2)>>2]|0;c=Ra[f[(f[d>>2]|0)+32>>2]&127](d,b)|0;return c|0}function hl(a,c){a=a|0;c=c|0;var d=0,e=0,f=0,g=0;d=b[a>>0]|0;e=b[c>>0]|0;if(d<<24>>24==0?1:d<<24>>24!=e<<24>>24){f=e;g=d}else{d=c;c=a;do{c=c+1|0;d=d+1|0;a=b[c>>0]|0;e=b[d>>0]|0}while(!(a<<24>>24==0?1:a<<24>>24!=e<<24>>24));f=e;g=a}return (g&255)-(f&255)|0}function il(a,b){a=a|0;b=$(b);var c=0,d=0;c=u;u=u+16|0;d=c;Yk(d);Ei(a,d,b);Bo(d);u=c;return}function jl(a){a=a|0;var b=0,c=0,d=0,e=0,g=0;b=f[a>>2]|0;c=a+4|0;d=f[c>>2]|0;if((d|0)==(b|0))e=b;else{g=d+(~((d+-4-b|0)>>>2)<<2)|0;f[c>>2]=g;e=g}f[a+12>>2]=0;f[a+16>>2]=0;if(!b)return;if((e|0)!=(b|0))f[c>>2]=e+(~((e+-4-b|0)>>>2)<<2);Oq(b);return}function kl(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0;d=f[a+16>>2]|0;if(((f[a+20>>2]|0)-d>>2|0)<=(b|0)){e=-1;return e|0}g=f[d+(b<<2)>>2]|0;if((g|0)<0){e=-1;return e|0}e=f[(f[(f[(f[a+36>>2]|0)+(g<<2)>>2]|0)+16>>2]|0)+(c<<2)>>2]|0;return e|0}function ll(a,b){a=a|0;b=b|0;var c=0,d=0;c=u;u=u+16|0;d=c;Yk(d);Ji(a,d,b);Bo(d);u=c;return}function ml(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0;d=u;u=u+32|0;e=d;g=d+20|0;f[e>>2]=f[a+60>>2];f[e+4>>2]=0;f[e+8>>2]=b;f[e+12>>2]=g;f[e+16>>2]=c;if((to(za(140,e|0)|0)|0)<0){f[g>>2]=-1;h=-1}else h=f[g>>2]|0;u=d;return h|0}function nl(a,b){a=a|0;b=b|0;var c=0,d=0;if((b|0)==-1|(b|0)>4){c=0;return c|0}d=f[a+20+(b*12|0)>>2]|0;if(((f[a+20+(b*12|0)+4>>2]|0)-d|0)<=0){c=0;return c|0}b=f[d>>2]|0;if((b|0)==-1){c=0;return c|0}c=f[(f[a+8>>2]|0)+(b<<2)>>2]|0;return c|0}function ol(a,b){a=a|0;b=b|0;var c=0,d=0,e=0;c=f[a+16>>2]|0;if(((f[a+20>>2]|0)-c>>2|0)<=(b|0)){d=0;return d|0}e=f[c+(b<<2)>>2]|0;if((e|0)<0){d=0;return d|0}b=f[(f[a+36>>2]|0)+(e<<2)>>2]|0;d=(f[b+20>>2]|0)-(f[b+16>>2]|0)>>2;return d|0}function pl(a){a=a|0;if(!(f[a+40>>2]|0))return 0;if(!(f[a+24>>2]|0))return 0;if(!(f[a+28>>2]|0))return 0;if(!(f[a+32>>2]|0))return 0;else return (f[a+36>>2]|0)!=0|0;return 0}function ql(a){a=a|0;var b=0;if(!(f[a+24>>2]|0)){b=0;return b|0}if(!(f[a+28>>2]|0)){b=0;return b|0}if(!(f[a+32>>2]|0)){b=0;return b|0}b=(f[a+36>>2]|0)!=0;return b|0}function rl(a,b,c){a=a|0;b=b|0;c=c|0;var d=0;lh(a,c);f[a>>2]=1408;c=a+72|0;d=a+36|0;a=d+36|0;do{f[d>>2]=0;d=d+4|0}while((d|0)<(a|0));d=f[b>>2]|0;f[b>>2]=0;f[c>>2]=d;return}function sl(a){a=a|0;var b=0,c=0;f[a>>2]=3148;b=f[a+56>>2]|0;if(b|0)Oq(b);b=a+48|0;c=f[b>>2]|0;f[b>>2]=0;if(!c){Oq(a);return}Mq(c);Oq(a);return}function tl(a,c){a=a|0;c=c|0;var d=0,e=0;d=a;e=c;c=d+64|0;do{f[d>>2]=f[e>>2];d=d+4|0;e=e+4|0}while((d|0)<(c|0));e=a+64|0;f[a+88>>2]=0;f[e>>2]=0;f[e+4>>2]=0;f[e+8>>2]=0;f[e+12>>2]=0;f[e+16>>2]=0;b[e+20>>0]=0;return}function ul(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var f=0,g=0;if((a|0)==0&(c|0)==0)f=d;else{g=d;d=c;c=a;while(1){a=g+-1|0;b[a>>0]=h[16636+(c&15)>>0]|0|e;c=Yn(c|0,d|0,4)|0;d=I;if((c|0)==0&(d|0)==0){f=a;break}else g=a}}return f|0}function vl(a){a=a|0;var c=0,d=0,e=0;c=a+74|0;d=b[c>>0]|0;b[c>>0]=d+255|d;d=f[a>>2]|0;if(!(d&8)){f[a+8>>2]=0;f[a+4>>2]=0;c=f[a+44>>2]|0;f[a+28>>2]=c;f[a+20>>2]=c;f[a+16>>2]=c+(f[a+48>>2]|0);e=0}else{f[a>>2]=d|32;e=-1}return e|0}function wl(a){a=a|0;if(!(f[a+60>>2]|0))return 0;if(!(f[a+44>>2]|0))return 0;if(!(f[a+48>>2]|0))return 0;if(!(f[a+52>>2]|0))return 0;else return (f[a+56>>2]|0)!=0|0;return 0}function xl(a,b){a=a|0;b=b|0;var c=0,d=0;c=f[b+88>>2]|0;if(!c){d=0;return d|0}if((f[c>>2]|0)!=2){d=0;return d|0}b=f[c+8>>2]|0;f[a+4>>2]=h[b>>0]|h[b+1>>0]<<8|h[b+2>>0]<<16|h[b+3>>0]<<24;d=1;return d|0}function yl(a){a=a|0;var b=0;if(!(f[a+44>>2]|0)){b=0;return b|0}if(!(f[a+48>>2]|0)){b=0;return b|0}if(!(f[a+52>>2]|0)){b=0;return b|0}b=(f[a+56>>2]|0)!=0;return b|0}function zl(a){a=a|0;vj(a);Oq(a);return}function Al(a){a=a|0;var b=0,c=0;f[a>>2]=2784;b=f[a+56>>2]|0;if(b|0)Oq(b);b=a+48|0;c=f[b>>2]|0;f[b>>2]=0;if(!c){Oq(a);return}Mq(c);Oq(a);return}function Bl(a,c){a=a|0;c=c|0;var d=0;if(f[c+56>>2]|0){d=0;return d|0}if((b[c+24>>0]|0)!=3){d=0;return d|0}f[a+44>>2]=c;d=1;return d|0}function Cl(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0;c=a+4|0;d=f[c>>2]|0;e=f[a>>2]|0;g=d-e|0;if(g>>>0<b>>>0){Fi(a,b-g|0);return}if(g>>>0<=b>>>0)return;g=e+b|0;if((g|0)==(d|0))return;f[c>>2]=g;return}function Dl(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=$(e);f[a+4>>2]=b;Zf(a+8|0,c,c+(d<<2)|0);n[a+20>>2]=e;return}function El(a,b){a=a|0;b=b|0;var c=0;if(!(Qa[f[(f[a>>2]|0)+40>>2]&127](a)|0)){c=0;return c|0}if(!(Ra[f[(f[a>>2]|0)+44>>2]&127](a,b)|0)){c=0;return c|0}c=Ra[f[(f[a>>2]|0)+48>>2]&127](a,b)|0;return c|0}function Fl(a,c){a=a|0;c=c|0;var d=0;if(f[c+56>>2]|0){d=0;return d|0}if((b[c+24>>0]|0)!=3){d=0;return d|0}f[a+40>>2]=c;d=1;return d|0}function Gl(a,b){a=a|0;b=b|0;var c=0,d=0,e=0;c=u;u=u+16|0;d=c+4|0;e=c;f[e>>2]=0;f[d>>2]=f[e>>2];e=vc(a,b,d)|0;u=c;return e|0}function Hl(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,g=0;d=f[c>>2]|0;c=a;e=b-a>>2;while(1){if(!e)break;a=(e|0)/2|0;b=c+(a<<2)|0;g=(f[b>>2]|0)>>>0<d>>>0;c=g?b+4|0:c;e=g?e+-1-a|0:a}return c|0}function Il(a){a=a|0;var c=0;f[a>>2]=0;c=a+8|0;f[c>>2]=0;f[c+4>>2]=0;f[c+8>>2]=0;f[c+12>>2]=0;b[a+24>>0]=1;f[a+28>>2]=9;c=a+40|0;f[c>>2]=0;f[c+4>>2]=0;f[c+8>>2]=0;f[c+12>>2]=0;f[a+56>>2]=-1;f[a+60>>2]=0;return}function Jl(a){a=a|0;yj(a);Oq(a);return}function Kl(a){a=a|0;var b=0;f[a>>2]=3148;b=f[a+56>>2]|0;if(b|0)Oq(b);b=a+48|0;a=f[b>>2]|0;f[b>>2]=0;if(!a)return;Mq(a);return}function Ll(a){a=a|0;var c=0,d=0,e=0,g=0,h=0;if(!(Aq(b[f[a>>2]>>0]|0)|0))c=0;else{d=0;while(1){e=f[a>>2]|0;g=(d*10|0)+-48+(b[e>>0]|0)|0;h=e+1|0;f[a>>2]=h;if(!(Aq(b[h>>0]|0)|0)){c=g;break}else d=g}}return c|0}function Ml(a,c){a=a|0;c=c|0;var d=0;if(f[c+56>>2]|0){d=0;return d|0}if((b[c+24>>0]|0)!=3){d=0;return d|0}f[a+64>>2]=c;d=1;return d|0}function Nl(a){a=a|0;var b=0,c=0;b=f[r>>2]|0;c=b+a|0;if((a|0)>0&(c|0)<(b|0)|(c|0)<0){ea()|0;ya(12);return -1}f[r>>2]=c;if((c|0)>(da()|0)?(ca()|0)==0:0){f[r>>2]=b;ya(12);return -1}return b|0}function Ol(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,f=0;if((a|0)==0&(c|0)==0)e=d;else{f=d;d=c;c=a;while(1){a=f+-1|0;b[a>>0]=c&7|48;c=Yn(c|0,d|0,3)|0;d=I;if((c|0)==0&(d|0)==0){e=a;break}else f=a}}return e|0}function Pl(a,c){a=a|0;c=c|0;var d=0;if(f[c+56>>2]|0){d=0;return d|0}if((b[c+24>>0]|0)!=3){d=0;return d|0}f[a+60>>2]=c;d=1;return d|0}function Ql(a){a=a|0;var b=0,c=0,d=0;f[a>>2]=1544;b=f[a+32>>2]|0;if(!b){Oq(a);return}c=a+36|0;d=f[c>>2]|0;if((d|0)!=(b|0))f[c>>2]=d+(~((d+-4-b|0)>>>2)<<2);Oq(b);Oq(a);return}function Rl(a,b,c,d,e,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;g=g|0;if(fp(a,f[b+8>>2]|0,g)|0)qj(0,b,c,d,e);return}function Sl(a){a=a|0;var b=0;f[a>>2]=2784;b=f[a+56>>2]|0;if(b|0)Oq(b);b=a+48|0;a=f[b>>2]|0;f[b>>2]=0;if(!a)return;Mq(a);return}function Tl(a){a=a|0;var c=0,d=0,e=0,g=0;c=u;u=u+16|0;d=c;e=f[a+4>>2]|0;g=(f[e+56>>2]|0)-(f[e+52>>2]|0)>>2;b[d>>0]=0;qh(a+20|0,g,d);u=c;return}function Ul(a){a=a|0;Vi(a);Oq(a);return}function Vl(a){a=a|0;var b=0;switch(a|0){case 11:case 2:case 1:{b=1;break}case 4:case 3:{b=2;break}case 6:case 5:{b=4;break}case 8:case 7:{b=8;break}case 9:{b=4;break}case 10:{b=8;break}default:b=-1}return b|0}function Wl(a){a=a|0;var c=0,d=0,e=0,g=0;c=u;u=u+16|0;d=c;e=f[a+4>>2]|0;g=(f[e+28>>2]|0)-(f[e+24>>2]|0)>>2;b[d>>0]=0;qh(a+20|0,g,d);u=c;return}function Xl(){var a=0,b=0;a=ln(40)|0;f[a>>2]=0;f[a+4>>2]=0;f[a+8>>2]=0;f[a+12>>2]=0;n[a+16>>2]=$(1.0);b=a+20|0;f[b>>2]=0;f[b+4>>2]=0;f[b+8>>2]=0;f[b+12>>2]=0;n[a+36>>2]=$(1.0);return a|0}function Yl(a,b){a=+a;b=+b;var c=0,d=0,e=0;p[s>>3]=a;c=f[s>>2]|0;d=f[s+4>>2]|0;p[s>>3]=b;e=f[s+4>>2]&-2147483648|d&2147483647;f[s>>2]=c;f[s+4>>2]=e;return +(+p[s>>3])}function Zl(a,b,c){a=a|0;b=b|0;c=+c;var d=0,e=0;d=u;u=u+16|0;e=d;p[e>>3]=c;_b(a,b,e);u=d;return}function _l(a){a=a|0;f[a>>2]=3656;Qi(a+8|0);Oq(a);return}function $l(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;d=u;u=u+16|0;e=d;f[e>>2]=c;fc(a,b,e);u=d;return}function am(a,c){a=a|0;c=c|0;var d=0,e=0;if((a|0)!=(c|0)){d=b[c+11>>0]|0;e=d<<24>>24<0;jj(a,e?f[c>>2]|0:c,e?f[c+4>>2]|0:d&255)|0}return a|0}function bm(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0;c=a&65535;d=b&65535;e=X(d,c)|0;f=a>>>16;a=(e>>>16)+(X(d,f)|0)|0;d=b>>>16;b=X(d,c)|0;return (I=(a>>>16)+(X(d,f)|0)+(((a&65535)+b|0)>>>16)|0,a+b<<16|e&65535|0)|0}function cm(a,b){a=a|0;b=b|0;var c=0,d=0,e=0;c=Gj(b)|0;d=ln(c+13|0)|0;f[d>>2]=c;f[d+4>>2]=c;f[d+8>>2]=0;e=Fp(d)|0;kh(e|0,b|0,c+1|0)|0;f[a>>2]=e;return}function dm(a,b){a=a|0;b=b|0;var c=0,d=0;if((b|0)==-1|(b|0)>4){c=-1;return c|0}d=f[a+20+(b*12|0)>>2]|0;if(((f[a+20+(b*12|0)+4>>2]|0)-d|0)<=0){c=-1;return c|0}c=f[d>>2]|0;return c|0}function em(a){a=a|0;Yi(a);Oq(a);return}function fm(a){a=a|0;f[a>>2]=3656;Qi(a+8|0);return}function gm(a){a=a|0;var b=0,c=0;f[a>>2]=1544;b=f[a+32>>2]|0;if(!b)return;c=a+36|0;a=f[c>>2]|0;if((a|0)!=(b|0))f[c>>2]=a+(~((a+-4-b|0)>>>2)<<2);Oq(b);return}function hm(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;if(fp(a,f[b+8>>2]|0,0)|0)Ck(0,b,c,d);return}function im(a,c,d){a=a|0;c=c|0;d=d|0;var e=0;if((c|0)<(a|0)&(a|0)<(c+d|0)){e=a;c=c+d|0;a=a+d|0;while((d|0)>0){a=a-1|0;c=c-1|0;d=d-1|0;b[a>>0]=b[c>>0]|0}a=e}else kh(a,c,d)|0;return a|0}function jm(a){a=a|0;var b=0,c=0,d=0;f[a>>2]=1196;b=f[a+8>>2]|0;if(!b){Oq(a);return}c=a+12|0;d=f[c>>2]|0;if((d|0)!=(b|0))f[c>>2]=d+(~((d+-4-b|0)>>>2)<<2);Oq(b);Oq(a);return}function km(a){a=a|0;var b=0;f[a>>2]=3204;b=f[a+56>>2]|0;if(!b){Oq(a);return}Oq(b);Oq(a);return}function lm(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0;d=u;u=u+16|0;e=d;f[e>>2]=f[c>>2];g=Sa[f[(f[a>>2]|0)+16>>2]&31](a,b,e)|0;if(g)f[c>>2]=f[e>>2];u=d;return g&1|0}function mm(a,b){a=a|0;b=b|0;var c=0;if(b>>>0>=2){c=0;return c|0}f[a+28>>2]=b;c=1;return c|0}function nm(a){a=a|0;var b=0,c=0;f[a>>2]=3408;b=a+56|0;c=f[b>>2]|0;f[b>>2]=0;if(!c){mj(a);return}Va[f[(f[c>>2]|0)+4>>2]&127](c);mj(a);return}function om(){var a=0,b=0;a=sn()|0;if((a|0?(b=f[a>>2]|0,b|0):0)?(a=b+48|0,(f[a>>2]&-256|0)==1126902528?(f[a+4>>2]|0)==1129074247:0):0)Ho(f[b+12>>2]|0);Ho(Qp()|0)}function pm(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;return Qf(a,b,c,d,e,f,6)|0}function qm(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;return Pf(a,b,c,d,e,f,4)|0}function rm(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;return Wf(a,b,c,d,e,f,2)|0}function sm(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;return Pf(a,b,c,d,e,f,3)|0}function tm(a){a=a|0;var b=0;f[a>>2]=2840;b=f[a+56>>2]|0;if(!b){Oq(a);return}Oq(b);Oq(a);return}function um(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;return Wf(a,b,c,d,e,f,1)|0}function vm(a){a=a|0;var c=0;c=b[w+(a&255)>>0]|0;if((c|0)<8)return c|0;c=b[w+(a>>8&255)>>0]|0;if((c|0)<8)return c+8|0;c=b[w+(a>>16&255)>>0]|0;if((c|0)<8)return c+16|0;return (b[w+(a>>>24)>>0]|0)+24|0}function wm(a,b){a=a|0;b=b|0;var c=0.0,d=0.0,e=0.0,f=0.0;if(!a){c=0.0;return +c}if((b|0)==0|(a|0)==(b|0)){c=0.0;return +c}d=+(b>>>0)/+(a>>>0);e=1.0-d;f=d*+Zg(d);c=-(f+e*+Zg(e));return +c}function xm(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;if((b|0)>0)d=0;else return;do{e=f[a+(d<<2)>>2]|0;f[c+(d<<2)>>2]=e<<1^e>>31;d=d+1|0}while((d|0)!=(b|0));return}function ym(a){a=a|0;var b=0;zo(a);f[a>>2]=3344;f[a+40>>2]=1196;f[a+44>>2]=-1;b=a+48|0;f[b>>2]=0;f[b+4>>2]=0;f[b+8>>2]=0;f[b+12>>2]=0;return}function zm(a,c){a=a|0;c=c|0;var d=0;b[c+84>>0]=1;a=f[c+68>>2]|0;d=c+72|0;c=f[d>>2]|0;if((c|0)==(a|0))return 1;f[d>>2]=c+(~((c+-4-a|0)>>>2)<<2);return 1}function Am(a){a=a|0;var b=0,c=0;if(pq(a)|0?(b=Mp(f[a>>2]|0)|0,a=b+8|0,c=f[a>>2]|0,f[a>>2]=c+-1,(c+-1|0)<0):0)Oq(b);return}function Bm(a){a=a|0;var b=0,c=0;b=f[a+16>>2]|0;c=(((f[a+12>>2]|0)+1-b|0)/64|0)+b<<3;a=b<<3;b=Vn(c|0,((c|0)<0)<<31>>31|0,a|0,((a|0)<0)<<31>>31|0)|0;return b|0}function Cm(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;return Qf(a,b,c,d,e,f,5)|0}function Dm(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;return Qf(a,b,c,d,e,f,9)|0}function Em(a){a=a|0;var b=0;f[a>>2]=3204;b=f[a+56>>2]|0;if(!b)return;Oq(b);return}function Fm(a){a=a|0;var b=0,c=0;f[a>>2]=1476;b=a+36|0;c=f[b>>2]|0;f[b>>2]=0;if(c|0)Va[f[(f[c>>2]|0)+4>>2]&127](c);Ni(a);Oq(a);return}function Gm(a){a=a|0;var b=0,c=0;f[a>>2]=1196;b=f[a+8>>2]|0;if(!b)return;c=a+12|0;a=f[c>>2]|0;if((a|0)!=(b|0))f[c>>2]=a+(~((a+-4-b|0)>>>2)<<2);Oq(b);return}function Hm(a){a=a|0;var c=0;f[a>>2]=1352;f[a+4>>2]=0;f[a+8>>2]=0;f[a+12>>2]=-1;c=a+16|0;f[a+32>>2]=0;f[c>>2]=0;f[c+4>>2]=0;f[c+8>>2]=0;b[c+12>>0]=0;return}function Im(a){a=a|0;var b=0;f[a>>2]=2840;b=f[a+56>>2]|0;if(!b)return;Oq(b);return}function Jm(a){a=a|0;var b=0,c=0;f[a>>2]=1476;b=a+36|0;c=f[b>>2]|0;f[b>>2]=0;if(c|0)Va[f[(f[c>>2]|0)+4>>2]&127](c);Ni(a);return}function Km(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=$(f);Fg(a,b,c,d,e,f);return}function Lm(a){a=a|0;var b=0,c=0;f[a>>2]=3408;b=a+56|0;c=f[b>>2]|0;f[b>>2]=0;if(c|0)Va[f[(f[c>>2]|0)+4>>2]&127](c);mj(a);Oq(a);return}function Mm(a){a=a|0;var b=0,c=0,d=0;b=f[a>>2]|0;c=a+4|0;d=f[c>>2]|0;if((d|0)!=(b|0))f[c>>2]=d+(~((d+-4-b|0)>>>2)<<2);f[a+12>>2]=0;f[a+16>>2]=0;return}function Nm(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0;d=a+20|0;e=f[d>>2]|0;g=(f[a+16>>2]|0)-e|0;a=g>>>0>c>>>0?c:g;kh(e|0,b|0,a|0)|0;f[d>>2]=(f[d>>2]|0)+a;return c|0}function Om(a){a=a|0;var b=0;f[a>>2]=3588;b=f[a+20>>2]|0;if(b|0)Oq(b);b=f[a+8>>2]|0;if(!b){Oq(a);return}Oq(b);Oq(a);return}function Pm(a){a=a|0;var b=0,c=0;b=f[a>>2]|0;if(!b)return;c=a+4|0;a=f[c>>2]|0;if((a|0)!=(b|0))f[c>>2]=a+(~((a+-8-b|0)>>>3)<<3);Oq(b);return}function Qm(a){a=a|0;var b=0,c=0;b=f[a>>2]|0;if(!b)return;c=a+4|0;a=f[c>>2]|0;if((a|0)!=(b|0))f[c>>2]=a+(~((a+-4-b|0)>>>2)<<2);Oq(b);return}function Rm(a,b){a=a|0;b=b|0;var c=0;c=f[b>>2]|0;return (1<<(c&31)&f[(f[a+28>>2]|0)+(c>>>5<<2)>>2]|0)!=0|0}function Sm(a,b,c){a=a|0;b=b|0;c=c|0;return Sa[f[(f[a>>2]|0)+44>>2]&31](a,b,c)|0}function Tm(a){a=a|0;var c=0;Il(a);c=a+64|0;f[a+88>>2]=0;f[c>>2]=0;f[c+4>>2]=0;f[c+8>>2]=0;f[c+12>>2]=0;f[c+16>>2]=0;b[c+20>>0]=0;return}function Um(a){a=a|0;f[a>>2]=3260;Fj(a+88|0);Oq(a);return}function Vm(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;if((f[b+4>>2]|0)==(c|0)?(c=b+28|0,(f[c>>2]|0)!=1):0)f[c>>2]=d;return}function Wm(a){a=a|0;var b=0,c=0,d=0;b=u;u=u+16|0;c=b;if((Ek(a)|0)==0?(Sa[f[a+32>>2]&31](a,c,1)|0)==1:0)d=h[c>>0]|0;else d=-1;u=b;return d|0}function Xm(a){a=a|0;var b=0;f[a>>2]=3636;b=f[a+20>>2]|0;if(b|0)Oq(b);b=f[a+8>>2]|0;if(!b){Oq(a);return}Oq(b);Oq(a);return}function Ym(a,b){a=a|0;b=b|0;var c=0,d=0,e=0;f[a+104>>2]=b;c=f[a+8>>2]|0;d=f[a+4>>2]|0;e=c-d|0;f[a+108>>2]=e;f[a+100>>2]=(b|0)!=0&(e|0)>(b|0)?d+b|0:c;return}function Zm(a){a=a|0;var b=0;f[a>>2]=0;f[a+4>>2]=0;f[a+8>>2]=0;b=a+16|0;f[b>>2]=0;f[b+4>>2]=0;f[b+8>>2]=0;f[b+12>>2]=0;f[b+16>>2]=0;return}function _m(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=$(f);Km(a,b,c,d,e,f);return}function $m(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;return pm(a,b,c,d,e,f)|0}function an(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;return qm(a,b,c,d,e,f)|0}function bn(a,b,c){a=a|0;b=b|0;c=c|0;f[a+4>>2]=b;f[a+8>>2]=f[(f[(f[b+4>>2]|0)+8>>2]|0)+(c<<2)>>2];f[a+12>>2]=c;return 1}function cn(a){a=a|0;var b=0,c=0;if(!a)return;b=f[a>>2]|0;if(b|0){c=a+4|0;if((f[c>>2]|0)!=(b|0))f[c>>2]=b;Oq(b)}Oq(a);return}function dn(a){a=a|0;f[a>>2]=2896;Fj(a+88|0);Oq(a);return}function en(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;return rm(a,b,c,d,e,f)|0}function fn(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;return sm(a,b,c,d,e,f)|0}function gn(a){a=a|0;f[a>>2]=3260;Fj(a+88|0);return}function hn(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,g=0;e=u;u=u+16|0;g=e|0;Ld(a,b,c,d,g)|0;u=e;return (I=f[g+4>>2]|0,f[g>>2]|0)|0}function jn(a){a=a|0;var b=0;eo(a);f[a>>2]=6152;b=a+84|0;f[b>>2]=0;f[b+4>>2]=0;f[b+8>>2]=0;f[b+12>>2]=0;f[b+16>>2]=0;f[b+20>>2]=0;return}function kn(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;return um(a,b,c,d,e,f)|0}function ln(a){a=a|0;var b=0,c=0;b=(a|0)==0?1:a;while(1){a=$a(b)|0;if(a|0){c=a;break}a=Op()|0;if(!a){c=0;break}Ua[a&3]()}return c|0}function mn(a,b,c){a=a|0;b=b|0;c=c|0;ac(a,b,c);return}function nn(a){a=a|0;var b=0;f[a>>2]=3588;b=f[a+20>>2]|0;if(b|0)Oq(b);b=f[a+8>>2]|0;if(!b)return;Oq(b);return}function on(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;return Cm(a,b,c,d,e,f)|0}function pn(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;return Dm(a,b,c,d,e,f)|0}function qn(a){a=a|0;f[a>>2]=2896;Fj(a+88|0);return}function rn(a){a=a|0;var b=0,c=0,d=0;b=u;u=u+16|0;c=b;d=Qq(f[a+60>>2]|0)|0;f[c>>2]=d;d=to(Ba(6,c|0)|0)|0;u=b;return d|0}function sn(){var a=0,b=0;a=u;u=u+16|0;if(!(Ka(19700,3)|0)){b=Ia(f[4926]|0)|0;u=a;return b|0}else Hn(18840,a);return 0}function tn(a){a=a|0;var b=0;f[a>>2]=3636;b=f[a+20>>2]|0;if(b|0)Oq(b);b=f[a+8>>2]|0;if(!b)return;Oq(b);return}function un(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0;e=a;a=c;c=bm(e,a)|0;f=I;return (I=(X(b,a)|0)+(X(d,e)|0)+f|f&0,c|0|0)|0}function vn(a,b){a=a|0;b=b|0;lh(a,b);f[a>>2]=1292;b=a+36|0;a=b+40|0;do{f[b>>2]=0;b=b+4|0}while((b|0)<(a|0));return}function wn(a){a=a|0;f[a>>2]=0;f[a+4>>2]=0;f[a+8>>2]=0;f[a+12>>2]=0;f[a+16>>2]=0;f[a+20>>2]=0;f[a+24>>2]=0;f[a+28>>2]=0;return}function xn(a){a=a|0;var b=0;b=u;u=u+16|0;yc(a);if(!(La(f[4926]|0,0)|0)){u=b;return}else Hn(18939,b)}function yn(a){a=a|0;var b=0;f[a>>2]=0;f[a+4>>2]=0;f[a+8>>2]=0;b=a+16|0;f[b>>2]=0;f[b+4>>2]=0;f[b+8>>2]=0;f[b+12>>2]=0;return}function zn(a,b){a=a|0;b=b|0;return vg(a+40|0,b)|0}function An(a,b){a=a|0;b=b|0;return lj(a,b,lq(b)|0)|0}function Bn(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,g=0;e=u;u=u+16|0;g=e;f[g>>2]=d;d=Zi(a,b,c,g)|0;u=e;return d|0}function Cn(a,b){a=a|0;b=b|0;return Mj(a+40|0,b)|0}function Dn(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return Qh(a,b,c,d)|0}function En(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return uh(a,b,c,d)|0}function Fn(a,b){a=a|0;b=b|0;var c=0;c=f[a+56>>2]|0;return Ra[f[(f[c>>2]|0)+24>>2]&127](c,b)|0}function Gn(a){a=a|0;f[a>>2]=0;f[a+4>>2]=0;f[a+8>>2]=0;f[a+12>>2]=0;f[a+16>>2]=0;f[a+20>>2]=0;b[a+24>>0]=0;return}function Hn(a,b){a=a|0;b=b|0;var c=0,d=0;c=u;u=u+16|0;d=c;f[d>>2]=b;b=f[1556]|0;Ah(b,a,d)|0;Lj(10,b)|0;Ca()}function In(a,b,c,d,e,f,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;return Ta[a&31](b|0,c|0,d|0,e|0,f|0,g|0)|0}function Jn(a,b){a=a|0;b=b|0;var c=0;c=f[a+56>>2]|0;return Ra[f[(f[c>>2]|0)+16>>2]&127](c,b)|0}function Kn(a,b){a=a|0;b=b|0;var c=0;c=f[a+56>>2]|0;return Ra[f[(f[c>>2]|0)+20>>2]&127](c,b)|0}function Ln(a,b){a=a|0;b=b|0;var c=0;c=f[a+56>>2]|0;return Ra[f[(f[c>>2]|0)+12>>2]&127](c,b)|0}function Mn(){var a=0;a=u;u=u+16|0;if(!(Ja(19704,113)|0)){u=a;return}else Hn(18889,a)}function Nn(a,b,c){a=a|0;b=b|0;c=c|0;Pj(a,b,c);return}function On(a){a=a|0;cf(a);Oq(a);return}function Pn(a,b,c,d,e,f,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;_a[a&3](b|0,c|0,d|0,e|0,f|0,g|0)}function Qn(a,b,c){a=a|0;b=b|0;c=c|0;if(b|0)sj(a|0,(kq(c)|0)&255|0,b|0)|0;return a|0}function Rn(a){a=a|0;return 4}function Sn(a,b,c){a=a|0;b=b|0;c=c|0;return ej(0,b,c)|0}function Tn(a,b,c){a=a|0;b=b|0;c=c|0;if((c|0)<32){I=b<<c|(a&(1<<c)-1<<32-c)>>>32-c;return a<<c}I=a<<c-32;return 0}function Un(){}function Vn(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0;e=a+c>>>0;return (I=b+d+(e>>>0<a>>>0|0)>>>0,e|0)|0}function Wn(a,b){a=a|0;b=b|0;var c=0;if(!b)c=0;else c=Dh(f[b>>2]|0,f[b+4>>2]|0,a)|0;return (c|0?c:a)|0}function Xn(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0;e=b-d>>>0;e=b-d-(c>>>0>a>>>0|0)>>>0;return (I=e,a-c>>>0|0)|0}function Yn(a,b,c){a=a|0;b=b|0;c=c|0;if((c|0)<32){I=b>>>c;return a>>>c|(b&(1<<c)-1)<<32-c}I=0;return b>>>c-32|0}function Zn(a){a=a|0;var b=0;f[a>>2]=3932;b=a+4|0;a=b+44|0;do{f[b>>2]=0;b=b+4|0}while((b|0)<(a|0));return}function _n(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return De(a,b,c,d)|0}function $n(a){a=a|0;ff(a);Oq(a);return}function ao(a,b){a=a|0;b=b|0;ji(a);f[a+36>>2]=b;f[a+40>>2]=0;return}function bo(a,b,c,d){a=a|0;b=b|0;c=c|0;d=+d;return $i(a,b,c,d)|0}function co(a){a=a|0;return 5}function eo(a){a=a|0;var b=0;f[a>>2]=6192;b=a+4|0;a=b+80|0;do{f[b>>2]=0;b=b+4|0}while((b|0)<(a|0));return}function fo(a){a=a|0;return 6}function go(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return aj(a,b,c,d)|0}function ho(a,b,c){a=a|0;b=b|0;c=c|0;f[a+28>>2]=b;f[a+32>>2]=c;return 1}function io(a,b){a=a|0;b=b|0;ji(a);f[a+36>>2]=b;f[a+40>>2]=b;return}function jo(a,b,c){a=a|0;b=b|0;c=c|0;Nn(a,b,c);return}function ko(a){a=a|0;var b=0;b=f[a+56>>2]|0;return Qa[f[(f[b>>2]|0)+28>>2]&127](b)|0}function lo(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;Ve(a,b,c,d,1);return}function mo(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;Ve(a,b,c,d,0);return}function no(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return Xg(a,b,c,d)|0}function oo(a,b,c){a=a|0;b=b|0;c=c|0;return fi(a,b,c)|0}function po(a){a=a|0;var b=0;b=f[a+56>>2]|0;return Qa[f[(f[b>>2]|0)+32>>2]&127](b)|0}function qo(a,b,c){a=a|0;b=b|0;c=c|0;return ej(a,b,c)|0}function ro(a,b,c){a=a|0;b=b|0;c=c|0;return Sn(a,b,c)|0}function so(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;Za[a&3](b|0,c|0,d|0,e|0,f|0)}function to(a){a=a|0;var b=0,c=0;if(a>>>0>4294963200){b=Vq()|0;f[b>>2]=0-a;c=-1}else c=a;return c|0}function uo(a,b,c){a=a|0;b=b|0;c=c|0;Li(a,b,c);return}function vo(a){a=a|0;f[a>>2]=0;f[a+4>>2]=0;f[a+8>>2]=0;f[a+12>>2]=0;f[a+16>>2]=0;return}function wo(a,b){a=a|0;b=b|0;f[a+8>>2]=b;f[a+12>>2]=-1;return 1}function xo(a,b){a=a|0;b=b|0;f[a+52>>2]=b;ip(a,b);return}function yo(a){a=+a;var b=0;p[s>>3]=a;b=f[s>>2]|0;I=f[s+4>>2]|0;return b|0}function zo(a){a=a|0;Hm(a);f[a>>2]=1476;f[a+36>>2]=0;return}function Ao(a){a=a|0;var b=0;if(!a)b=0;else b=(Eh(a,1056,1144,0)|0)!=0&1;return b|0}function Bo(a){a=a|0;if((b[a+11>>0]|0)<0)Oq(f[a>>2]|0);return}function Co(a){a=a|0;if(!a)return;Va[f[(f[a>>2]|0)+4>>2]&127](a);return}function Do(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;Ya[a&3](b|0,c|0,d|0,e|0)}function Eo(a,b,c){a=a|0;b=b|0;c=c|0;if(c|0)im(a|0,b|0,c|0)|0;return a|0}function Fo(a,b,c){a=a|0;b=b|0;c=c|0;if(c|0)kh(a|0,b|0,c|0)|0;return a|0}function Go(a,b){a=a|0;b=b|0;return -1}function Ho(a){a=a|0;var b=0;b=u;u=u+16|0;Ua[a&3]();Hn(18992,b)}function Io(a){a=a|0;Lh(a);Oq(a);return}function Jo(a,b,c){a=a|0;b=b|0;c=c|0;Ro(a,b,c);return}function Ko(a,b,c){a=a|0;b=$(b);c=c|0;f[a+4>>2]=c;n[a>>2]=b;return}function Lo(a){a=a|0;To(a);f[a>>2]=3408;f[a+56>>2]=0;return}function Mo(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return Sa[a&31](b|0,c|0,d|0)|0}function No(a,b){a=a|0;b=b|0;return (wp(a,b)|0)<<24>>24|0}function Oo(a,b){a=a|0;b=b|0;f[a>>2]=7236;cm(a+4|0,b);return}function Po(a,b){a=a|0;b=b|0;var c=0;if(!a)c=0;else c=Pi(a,b,0)|0;return c|0}function Qo(a){a=a|0;return f[a+12>>2]|0}function Ro(a,b,c){a=a|0;b=b|0;c=c|0;uo(a,b,c);return}function So(){var a=0;a=ln(64)|0;Il(a);return a|0}function To(a){a=a|0;Zn(a);f[a>>2]=3764;f[a+52>>2]=0;return}function Uo(a){a=a|0;if(!a)return;bj(a);Oq(a);return}function Vo(a){a=a|0;return Qa[f[(f[a>>2]|0)+60>>2]&127](a)|0}function Wo(a){a=a|0;return f[a+4>>2]|0}function Xo(a,b,c){a=a|0;b=b|0;c=c|0;if(!(f[a>>2]&32))qi(b,c,a)|0;return}function Yo(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;Xa[a&15](b|0,c|0,d|0)}function Zo(){var a=0;a=ln(96)|0;Tm(a);return a|0}function _o(a){a=a|0;var b=0;b=u;u=u+a|0;u=u+15&-16;return b|0}function $o(a){a=a|0;var b=0;b=(Jq()|0)+188|0;return $j(a,f[b>>2]|0)|0}function ap(a){a=a|0;return ((f[a+100>>2]|0)-(f[a+96>>2]|0)|0)/12|0|0}function bp(a,b){a=a|0;b=b|0;kp(a,b);return}function cp(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;aa(3);return 0}function dp(){var a=0;a=ln(12)|0;op(a);return a|0}function ep(a){a=a|0;Ni(a);Oq(a);return}function fp(a,b,c){a=a|0;b=b|0;c=c|0;return (a|0)==(b|0)|0}function gp(a,b){a=a|0;b=b|0;var c=0;c=sp(a|0)|0;return ((b|0)==0?a:c)|0}function hp(a){a=a|0;return (f[a+12>>2]|0)-(f[a+8>>2]|0)>>2|0}function ip(a,b){a=a|0;b=b|0;f[a+4>>2]=b;return}function jp(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return Ld(a,b,c,d,0)|0}function kp(a,b){a=a|0;b=b|0;jk(a,b);return}function lp(a){a=a|0;f[a+4>>2]=0;f[a+8>>2]=0;f[a>>2]=a+4;return}function mp(){var a=0;a=ln(84)|0;eo(a);return a|0}function np(a){a=a|0;ui(a);Oq(a);return}function op(a){a=a|0;f[a>>2]=0;f[a+4>>2]=0;f[a+8>>2]=0;return}function pp(a){a=a|0;f[a>>2]=7236;Am(a+4|0);return}function qp(a,b,c){a=a|0;b=b|0;c=c|0;return Ra[a&127](b|0,c|0)|0}function rp(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;aa(10)}function sp(a){a=a|0;return (a&255)<<24|(a>>8&255)<<16|(a>>16&255)<<8|a>>>24|0}function tp(a){a=a|0;To(a);f[a>>2]=3836;return}function up(a,c){a=a|0;c=c|0;b[a>>0]=b[c>>0]|0;return}function vp(a,b,c){a=a|0;b=b|0;c=c|0;return -1}function wp(a,c){a=a|0;c=c|0;return b[(f[a>>2]|0)+c>>0]|0}function xp(a){a=a|0;return (f[a+4>>2]|0)-(f[a>>2]|0)|0}function yp(a){a=a|0;mj(a);Oq(a);return}function zp(a){a=a|0;if(!a)return;Oq(a);return}function Ap(a){a=a|0;n[a>>2]=$(1.0);f[a+4>>2]=1;return}function Bp(a){a=a|0;b[a+28>>0]=1;return}function Cp(a,b){a=a|0;b=b|0;if(!x){x=a;y=b}}function Dp(a){a=a|0;ji(a);return}function Ep(a,b){a=a|0;b=b|0;return 1}function Fp(a){a=a|0;return a+12|0}function Gp(a,b){a=a|0;b=b|0;f[a+80>>2]=b;return}function Hp(a,b,c){a=a|0;b=b|0;c=c|0;Wa[a&7](b|0,c|0)}function Ip(){var a=0;a=ln(36)|0;qq(a);return a|0}function Jp(a){a=a|0;return gq(a+4|0)|0}function Kp(){var a=0;a=ln(108)|0;jn(a);return a|0}function Lp(a){a=a|0;return (b[a+32>>0]|0)!=0|0}function Mp(a){a=a|0;return a+-12|0}function Np(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;aa(9)}function Op(){var a=0;a=f[4927]|0;f[4927]=a+0;return a|0}function Pp(a){a=a|0;return f[a+56>>2]|0}function Qp(){var a=0;a=f[1786]|0;f[1786]=a+0;return a|0}function Rp(a){a=a|0;Og(a);Oq(a);return}function Sp(a){a=a|0;Sq(a);Oq(a);return}function Tp(a){a=a|0;return b[a+24>>0]|0}function Up(a,b){a=a|0;b=b|0;return 0}function Vp(a){a=a|0;return f[a+40>>2]|0}function Wp(a){a=a|0;return f[a+48>>2]|0}function Xp(a,b){a=a|0;b=b|0;return Qa[a&127](b|0)|0}function Yp(a){a=a|0;return f[a+60>>2]|0}function Zp(a){a=a|0;return f[a+28>>2]|0}function _p(a){a=a|0;sa(a|0)|0;om()}function $p(a){a=a|0;pp(a);Oq(a);return}function aq(a){a=a|0;Ca()}function bq(a,b){a=a|0;b=b|0;return $(+Bk(a,b,0))}function cq(a){a=a|0;return 3}function dq(a,b){a=a|0;b=b|0;u=a;v=b}function eq(a){a=a|0;return ((a|0)==32|(a+-9|0)>>>0<5)&1|0}function fq(a){a=a|0;return f[a+80>>2]|0}function gq(a){a=a|0;return f[a>>2]|0}function hq(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;aa(8)}function iq(a,b){a=a|0;b=b|0;Va[a&127](b|0)}function jq(a,b){a=a|0;b=b|0;return Wn(a,b)|0}function kq(a){a=a|0;return a&255|0}function lq(a){a=a|0;return Gj(a)|0}function mq(a,b){a=a|0;b=b|0;return +(+Bk(a,b,1))}function nq(a,b,c){a=a|0;b=b|0;c=c|0;aa(2);return 0}function oq(a){a=a|0;return 2}function pq(a){a=a|0;return 1}function qq(a){a=a|0;Dp(a);return}function rq(a,b){a=+a;b=+b;return +(+Yl(a,b))}function sq(a,b){a=+a;b=b|0;return +(+bk(a,b))}function tq(a,b){a=+a;b=b|0;return +(+ak(a,b))}function uq(){return 3}function vq(a,b,c){a=a|0;b=b|0;c=c|0;aa(7)}function wq(){return 0}function xq(){return -1}function yq(){return ln(1)|0}function zq(){return 4}function Aq(a){a=a|0;return (a+-48|0)>>>0<10|0}function Bq(){return 1}function Cq(){return 2}function Dq(a,b){a=+a;b=+b;return +(+xd(a,b))}function Eq(a,b){a=a|0;b=b|0;aa(1);return 0}function Fq(a){a=a|0;Ha()}function Gq(a){a=a|0;Ua[a&3]()}function Hq(){ua()}function Iq(a){a=a|0;return +(+mq(a,0))}function Jq(){return Yq()|0}function Kq(a,b){a=a|0;b=b|0;aa(6)}function Lq(a){a=a|0;return ln(a)|0}function Mq(a){a=a|0;Oq(a);return}function Nq(a){a=a|0;u=a}function Oq(a){a=a|0;yc(a);return}function Pq(a){a=a|0;I=a}function Qq(a){a=a|0;return a|0}function Rq(a){a=a|0;aa(0);return 0}function Sq(a){a=a|0;return}function Tq(a){a=a|0;return 0}function Uq(){return I|0}function Vq(){return 19632}function Wq(){return u|0}function Xq(a){a=a|0;aa(5)}function Yq(){return 6352}function Zq(){aa(4)}\n\n// EMSCRIPTEN_END_FUNCS\nvar Qa=[Rq,oq,pq,pq,oq,gb,Tq,Tq,Tq,hk,kg,pq,Wo,Tq,Tq,pq,Tq,pq,pq,yl,oq,yl,cq,wl,pq,co,wl,pq,fo,cl,pq,Zp,Rn,yl,pq,yl,oq,yl,cq,wl,pq,co,wl,pq,fo,cl,pq,Zp,Rn,yl,pq,cq,Tq,Wo,pq,Tq,pq,cq,pq,ql,oq,ql,Rn,ql,cq,pl,pq,co,pl,pq,fo,Wk,pq,Zp,pq,ql,oq,ql,Rn,ql,cq,pl,pq,co,pl,pq,fo,Wk,pq,Zp,pq,oq,pq,pq,Nd,pq,Vo,Xe,mh,zk,po,ko,pb,Qo,Wo,Mg,Wg,Lf,rb,Qo,Wo,pq,Tq,Tq,zc,Ki,Tq,pq,pq,Uj,Tq,Uj,ck,rn,Jp,Rq,Rq,Rq];var Ra=[Eq,xl,nh,Ie,El,Up,Up,Up,Ep,jb,rj,wo,Ep,Ep,ti,nj,ii,kk,ol,Qj,$k,dk,ek,Te,Go,Up,ni,Up,Pl,$d,Up,Pl,nf,Up,Ml,sh,mm,Ed,Up,Pl,$d,Up,Pl,nf,Up,Ml,sh,mm,Ed,Cn,Go,Up,li,Dd,Up,Fl,Zd,Up,Fl,hf,Up,Bl,rh,mm,Dd,Up,Fl,Zd,Up,Fl,hf,Up,Bl,rh,mm,zn,Kn,Fn,Ln,Jn,dh,ik,uk,cc,ye,Rm,og,vf,wf,ah,ik,uk,bc,ye,Rm,Ep,Up,Up,of,zm,mg,of,Eq,Eq,Eq,Eq,Eq,Eq,Eq,Eq,Eq,Eq,Eq,Eq,Eq,Eq,Eq,Eq,Eq,Eq,Eq,Eq,Eq,Eq,Eq,Eq,Eq,Eq];var Sa=[nq,ho,vp,bn,Sm,wg,oj,kl,xh,wc,Kh,pg,gi,Rb,di,Ng,ml,Nm,Cj,nq,nq,nq,nq,nq,nq,nq,nq,nq,nq,nq,nq,nq];var Ta=[cp,Xd,Jc,oc,be,Ae,Tb,bb,Lc,pc,ae,ze,Sb,ab,eh,kd,Ic,fb,pf,If,tc,od,Kc,db,kf,Gf,qc,cp,cp,cp,cp,cp];var Ua=[Zq,Hq,Oi,Mn];var Va=[Xq,Sq,Mq,Gm,jm,al,Fq,ui,np,Ni,ep,Lh,Io,Jm,Fm,gm,Fq,Ql,Ql,Ql,Jk,wk,_k,Rk,el,Uk,Sq,Mq,Fq,Yi,em,Ql,Ql,Dk,rk,Xk,Pk,bl,Tk,Sq,Mq,Fq,Vi,Ul,Jm,Fm,Sq,Mq,Mq,Mq,yj,Jl,Sl,Al,Im,tm,qn,dn,Sq,Mq,Mq,Mq,vj,zl,Kl,sl,Em,km,gn,Um,Sq,Mq,xk,ok,nm,Lm,ff,$n,vk,nk,nn,Om,Tl,Ak,qk,tn,Xm,Wl,fm,_l,cf,On,mj,Fq,yp,Sq,Mq,Fq,yp,yp,Nk,Gk,sb,Og,Rp,Sq,Sp,Sq,Sq,Sp,pp,$p,$p,xn,Xq,Xq,Xq,Xq,Xq,Xq,Xq,Xq,Xq,Xq,Xq,Xq,Xq,Xq];var Wa=[Kq,pk,gg,yk,Nc,Kq,Kq,Kq];var Xa=[vq,Ne,ij,$b,ic,yd,$b,ic,$g,Aj,Lg,Yf,vq,vq,vq,vq];var Ya=[hq,hm,dl,hq];var Za=[Np,tj,oh,Np];var _a=[rp,Rl,Sk,rp];return{___cxa_can_catch:lm,___cxa_is_pointer_type:Ao,___divdi3:Ik,___muldi3:un,___udivdi3:jp,___uremdi3:hn,_bitshift64Lshr:Yn,_bitshift64Shl:Tn,_emscripten_bind_DracoInt8Array_DracoInt8Array_0:dp,_emscripten_bind_DracoInt8Array_GetValue_1:No,_emscripten_bind_DracoInt8Array___destroy___0:cn,_emscripten_bind_DracoInt8Array_size_0:xp,_emscripten_bind_Encoder_EncodeMeshToDracoBuffer_2:oo,_emscripten_bind_Encoder_EncodePointCloudToDracoBuffer_3:En,_emscripten_bind_Encoder_Encoder_0:Ip,_emscripten_bind_Encoder_SetAttributeExplicitQuantization_5:_m,_emscripten_bind_Encoder_SetAttributeQuantization_2:jo,_emscripten_bind_Encoder_SetEncodingMethod_1:bp,_emscripten_bind_Encoder_SetSpeedOptions_2:Jo,_emscripten_bind_Encoder___destroy___0:Wj,_emscripten_bind_GeometryAttribute_GeometryAttribute_0:So,_emscripten_bind_GeometryAttribute___destroy___0:zp,_emscripten_bind_MeshBuilder_AddFacesToMesh_3:no,_emscripten_bind_MeshBuilder_AddFloatAttributeToMesh_5:pn,_emscripten_bind_MeshBuilder_AddFloatAttribute_5:pn,_emscripten_bind_MeshBuilder_AddInt16Attribute_5:fn,_emscripten_bind_MeshBuilder_AddInt32AttributeToMesh_5:on,_emscripten_bind_MeshBuilder_AddInt32Attribute_5:on,_emscripten_bind_MeshBuilder_AddInt8Attribute_5:kn,_emscripten_bind_MeshBuilder_AddMetadataToMesh_2:ro,_emscripten_bind_MeshBuilder_AddMetadata_2:qo,_emscripten_bind_MeshBuilder_AddUInt16Attribute_5:an,_emscripten_bind_MeshBuilder_AddUInt32Attribute_5:$m,_emscripten_bind_MeshBuilder_AddUInt8Attribute_5:en,_emscripten_bind_MeshBuilder_MeshBuilder_0:yq,_emscripten_bind_MeshBuilder_SetMetadataForAttribute_3:Dn,_emscripten_bind_MeshBuilder___destroy___0:zp,_emscripten_bind_Mesh_Mesh_0:Kp,_emscripten_bind_Mesh___destroy___0:Co,_emscripten_bind_Mesh_num_attributes_0:hp,_emscripten_bind_Mesh_num_faces_0:ap,_emscripten_bind_Mesh_num_points_0:fq,_emscripten_bind_Mesh_set_num_points_1:Gp,_emscripten_bind_MetadataBuilder_AddDoubleEntry_3:bo,_emscripten_bind_MetadataBuilder_AddIntEntry_3:go,_emscripten_bind_MetadataBuilder_AddStringEntry_3:_n,_emscripten_bind_MetadataBuilder_MetadataBuilder_0:yq,_emscripten_bind_MetadataBuilder___destroy___0:zp,_emscripten_bind_Metadata_Metadata_0:Xl,_emscripten_bind_Metadata___destroy___0:Uo,_emscripten_bind_PointAttribute_PointAttribute_0:Zo,_emscripten_bind_PointAttribute___destroy___0:Ij,_emscripten_bind_PointAttribute_attribute_type_0:Pp,_emscripten_bind_PointAttribute_byte_offset_0:Wp,_emscripten_bind_PointAttribute_byte_stride_0:Vp,_emscripten_bind_PointAttribute_data_type_0:Zp,_emscripten_bind_PointAttribute_normalized_0:Lp,_emscripten_bind_PointAttribute_num_components_0:Tp,_emscripten_bind_PointAttribute_size_0:fq,_emscripten_bind_PointAttribute_unique_id_0:Yp,_emscripten_bind_PointCloudBuilder_AddFloatAttribute_5:pn,_emscripten_bind_PointCloudBuilder_AddInt16Attribute_5:fn,_emscripten_bind_PointCloudBuilder_AddInt32Attribute_5:on,_emscripten_bind_PointCloudBuilder_AddInt8Attribute_5:kn,_emscripten_bind_PointCloudBuilder_AddMetadata_2:qo,_emscripten_bind_PointCloudBuilder_AddUInt16Attribute_5:an,_emscripten_bind_PointCloudBuilder_AddUInt32Attribute_5:$m,_emscripten_bind_PointCloudBuilder_AddUInt8Attribute_5:en,_emscripten_bind_PointCloudBuilder_PointCloudBuilder_0:yq,_emscripten_bind_PointCloudBuilder_SetMetadataForAttribute_3:Dn,_emscripten_bind_PointCloudBuilder___destroy___0:zp,_emscripten_bind_PointCloud_PointCloud_0:mp,_emscripten_bind_PointCloud___destroy___0:Co,_emscripten_bind_PointCloud_num_attributes_0:hp,_emscripten_bind_PointCloud_num_points_0:fq,_emscripten_bind_VoidPtr___destroy___0:zp,_emscripten_enum_draco_EncodedGeometryType_INVALID_GEOMETRY_TYPE:xq,_emscripten_enum_draco_EncodedGeometryType_POINT_CLOUD:wq,_emscripten_enum_draco_EncodedGeometryType_TRIANGULAR_MESH:Bq,_emscripten_enum_draco_GeometryAttribute_Type_COLOR:Cq,_emscripten_enum_draco_GeometryAttribute_Type_GENERIC:zq,_emscripten_enum_draco_GeometryAttribute_Type_INVALID:xq,_emscripten_enum_draco_GeometryAttribute_Type_NORMAL:Bq,_emscripten_enum_draco_GeometryAttribute_Type_POSITION:wq,_emscripten_enum_draco_GeometryAttribute_Type_TEX_COORD:uq,_emscripten_enum_draco_MeshEncoderMethod_MESH_EDGEBREAKER_ENCODING:Bq,_emscripten_enum_draco_MeshEncoderMethod_MESH_SEQUENTIAL_ENCODING:wq,_emscripten_replace_memory:Pa,_free:yc,_i64Add:Vn,_i64Subtract:Xn,_llvm_bswap_i32:sp,_malloc:$a,_memcpy:kh,_memmove:im,_memset:sj,_sbrk:Nl,dynCall_ii:Xp,dynCall_iii:qp,dynCall_iiii:Mo,dynCall_iiiiiii:In,dynCall_v:Gq,dynCall_vi:iq,dynCall_vii:Hp,dynCall_viii:Yo,dynCall_viiii:Do,dynCall_viiiii:so,dynCall_viiiiii:Pn,establishStackSpace:dq,getTempRet0:Uq,runPostSets:Un,setTempRet0:Pq,setThrew:Cp,stackAlloc:_o,stackRestore:Nq,stackSave:Wq}})\n\n\n// EMSCRIPTEN_END_ASM\n(Module.asmGlobalArg,Module.asmLibraryArg,buffer);var ___cxa_can_catch=Module[\"___cxa_can_catch\"]=asm[\"___cxa_can_catch\"];var ___cxa_is_pointer_type=Module[\"___cxa_is_pointer_type\"]=asm[\"___cxa_is_pointer_type\"];var ___divdi3=Module[\"___divdi3\"]=asm[\"___divdi3\"];var ___muldi3=Module[\"___muldi3\"]=asm[\"___muldi3\"];var ___udivdi3=Module[\"___udivdi3\"]=asm[\"___udivdi3\"];var ___uremdi3=Module[\"___uremdi3\"]=asm[\"___uremdi3\"];var _bitshift64Lshr=Module[\"_bitshift64Lshr\"]=asm[\"_bitshift64Lshr\"];var _bitshift64Shl=Module[\"_bitshift64Shl\"]=asm[\"_bitshift64Shl\"];var _emscripten_bind_DracoInt8Array_DracoInt8Array_0=Module[\"_emscripten_bind_DracoInt8Array_DracoInt8Array_0\"]=asm[\"_emscripten_bind_DracoInt8Array_DracoInt8Array_0\"];var _emscripten_bind_DracoInt8Array_GetValue_1=Module[\"_emscripten_bind_DracoInt8Array_GetValue_1\"]=asm[\"_emscripten_bind_DracoInt8Array_GetValue_1\"];var _emscripten_bind_DracoInt8Array___destroy___0=Module[\"_emscripten_bind_DracoInt8Array___destroy___0\"]=asm[\"_emscripten_bind_DracoInt8Array___destroy___0\"];var _emscripten_bind_DracoInt8Array_size_0=Module[\"_emscripten_bind_DracoInt8Array_size_0\"]=asm[\"_emscripten_bind_DracoInt8Array_size_0\"];var _emscripten_bind_Encoder_EncodeMeshToDracoBuffer_2=Module[\"_emscripten_bind_Encoder_EncodeMeshToDracoBuffer_2\"]=asm[\"_emscripten_bind_Encoder_EncodeMeshToDracoBuffer_2\"];var _emscripten_bind_Encoder_EncodePointCloudToDracoBuffer_3=Module[\"_emscripten_bind_Encoder_EncodePointCloudToDracoBuffer_3\"]=asm[\"_emscripten_bind_Encoder_EncodePointCloudToDracoBuffer_3\"];var _emscripten_bind_Encoder_Encoder_0=Module[\"_emscripten_bind_Encoder_Encoder_0\"]=asm[\"_emscripten_bind_Encoder_Encoder_0\"];var _emscripten_bind_Encoder_SetAttributeExplicitQuantization_5=Module[\"_emscripten_bind_Encoder_SetAttributeExplicitQuantization_5\"]=asm[\"_emscripten_bind_Encoder_SetAttributeExplicitQuantization_5\"];var _emscripten_bind_Encoder_SetAttributeQuantization_2=Module[\"_emscripten_bind_Encoder_SetAttributeQuantization_2\"]=asm[\"_emscripten_bind_Encoder_SetAttributeQuantization_2\"];var _emscripten_bind_Encoder_SetEncodingMethod_1=Module[\"_emscripten_bind_Encoder_SetEncodingMethod_1\"]=asm[\"_emscripten_bind_Encoder_SetEncodingMethod_1\"];var _emscripten_bind_Encoder_SetSpeedOptions_2=Module[\"_emscripten_bind_Encoder_SetSpeedOptions_2\"]=asm[\"_emscripten_bind_Encoder_SetSpeedOptions_2\"];var _emscripten_bind_Encoder___destroy___0=Module[\"_emscripten_bind_Encoder___destroy___0\"]=asm[\"_emscripten_bind_Encoder___destroy___0\"];var _emscripten_bind_GeometryAttribute_GeometryAttribute_0=Module[\"_emscripten_bind_GeometryAttribute_GeometryAttribute_0\"]=asm[\"_emscripten_bind_GeometryAttribute_GeometryAttribute_0\"];var _emscripten_bind_GeometryAttribute___destroy___0=Module[\"_emscripten_bind_GeometryAttribute___destroy___0\"]=asm[\"_emscripten_bind_GeometryAttribute___destroy___0\"];var _emscripten_bind_MeshBuilder_AddFacesToMesh_3=Module[\"_emscripten_bind_MeshBuilder_AddFacesToMesh_3\"]=asm[\"_emscripten_bind_MeshBuilder_AddFacesToMesh_3\"];var _emscripten_bind_MeshBuilder_AddFloatAttributeToMesh_5=Module[\"_emscripten_bind_MeshBuilder_AddFloatAttributeToMesh_5\"]=asm[\"_emscripten_bind_MeshBuilder_AddFloatAttributeToMesh_5\"];var _emscripten_bind_MeshBuilder_AddFloatAttribute_5=Module[\"_emscripten_bind_MeshBuilder_AddFloatAttribute_5\"]=asm[\"_emscripten_bind_MeshBuilder_AddFloatAttribute_5\"];var _emscripten_bind_MeshBuilder_AddInt16Attribute_5=Module[\"_emscripten_bind_MeshBuilder_AddInt16Attribute_5\"]=asm[\"_emscripten_bind_MeshBuilder_AddInt16Attribute_5\"];var _emscripten_bind_MeshBuilder_AddInt32AttributeToMesh_5=Module[\"_emscripten_bind_MeshBuilder_AddInt32AttributeToMesh_5\"]=asm[\"_emscripten_bind_MeshBuilder_AddInt32AttributeToMesh_5\"];var _emscripten_bind_MeshBuilder_AddInt32Attribute_5=Module[\"_emscripten_bind_MeshBuilder_AddInt32Attribute_5\"]=asm[\"_emscripten_bind_MeshBuilder_AddInt32Attribute_5\"];var _emscripten_bind_MeshBuilder_AddInt8Attribute_5=Module[\"_emscripten_bind_MeshBuilder_AddInt8Attribute_5\"]=asm[\"_emscripten_bind_MeshBuilder_AddInt8Attribute_5\"];var _emscripten_bind_MeshBuilder_AddMetadataToMesh_2=Module[\"_emscripten_bind_MeshBuilder_AddMetadataToMesh_2\"]=asm[\"_emscripten_bind_MeshBuilder_AddMetadataToMesh_2\"];var _emscripten_bind_MeshBuilder_AddMetadata_2=Module[\"_emscripten_bind_MeshBuilder_AddMetadata_2\"]=asm[\"_emscripten_bind_MeshBuilder_AddMetadata_2\"];var _emscripten_bind_MeshBuilder_AddUInt16Attribute_5=Module[\"_emscripten_bind_MeshBuilder_AddUInt16Attribute_5\"]=asm[\"_emscripten_bind_MeshBuilder_AddUInt16Attribute_5\"];var _emscripten_bind_MeshBuilder_AddUInt32Attribute_5=Module[\"_emscripten_bind_MeshBuilder_AddUInt32Attribute_5\"]=asm[\"_emscripten_bind_MeshBuilder_AddUInt32Attribute_5\"];var _emscripten_bind_MeshBuilder_AddUInt8Attribute_5=Module[\"_emscripten_bind_MeshBuilder_AddUInt8Attribute_5\"]=asm[\"_emscripten_bind_MeshBuilder_AddUInt8Attribute_5\"];var _emscripten_bind_MeshBuilder_MeshBuilder_0=Module[\"_emscripten_bind_MeshBuilder_MeshBuilder_0\"]=asm[\"_emscripten_bind_MeshBuilder_MeshBuilder_0\"];var _emscripten_bind_MeshBuilder_SetMetadataForAttribute_3=Module[\"_emscripten_bind_MeshBuilder_SetMetadataForAttribute_3\"]=asm[\"_emscripten_bind_MeshBuilder_SetMetadataForAttribute_3\"];var _emscripten_bind_MeshBuilder___destroy___0=Module[\"_emscripten_bind_MeshBuilder___destroy___0\"]=asm[\"_emscripten_bind_MeshBuilder___destroy___0\"];var _emscripten_bind_Mesh_Mesh_0=Module[\"_emscripten_bind_Mesh_Mesh_0\"]=asm[\"_emscripten_bind_Mesh_Mesh_0\"];var _emscripten_bind_Mesh___destroy___0=Module[\"_emscripten_bind_Mesh___destroy___0\"]=asm[\"_emscripten_bind_Mesh___destroy___0\"];var _emscripten_bind_Mesh_num_attributes_0=Module[\"_emscripten_bind_Mesh_num_attributes_0\"]=asm[\"_emscripten_bind_Mesh_num_attributes_0\"];var _emscripten_bind_Mesh_num_faces_0=Module[\"_emscripten_bind_Mesh_num_faces_0\"]=asm[\"_emscripten_bind_Mesh_num_faces_0\"];var _emscripten_bind_Mesh_num_points_0=Module[\"_emscripten_bind_Mesh_num_points_0\"]=asm[\"_emscripten_bind_Mesh_num_points_0\"];var _emscripten_bind_Mesh_set_num_points_1=Module[\"_emscripten_bind_Mesh_set_num_points_1\"]=asm[\"_emscripten_bind_Mesh_set_num_points_1\"];var _emscripten_bind_MetadataBuilder_AddDoubleEntry_3=Module[\"_emscripten_bind_MetadataBuilder_AddDoubleEntry_3\"]=asm[\"_emscripten_bind_MetadataBuilder_AddDoubleEntry_3\"];var _emscripten_bind_MetadataBuilder_AddIntEntry_3=Module[\"_emscripten_bind_MetadataBuilder_AddIntEntry_3\"]=asm[\"_emscripten_bind_MetadataBuilder_AddIntEntry_3\"];var _emscripten_bind_MetadataBuilder_AddStringEntry_3=Module[\"_emscripten_bind_MetadataBuilder_AddStringEntry_3\"]=asm[\"_emscripten_bind_MetadataBuilder_AddStringEntry_3\"];var _emscripten_bind_MetadataBuilder_MetadataBuilder_0=Module[\"_emscripten_bind_MetadataBuilder_MetadataBuilder_0\"]=asm[\"_emscripten_bind_MetadataBuilder_MetadataBuilder_0\"];var _emscripten_bind_MetadataBuilder___destroy___0=Module[\"_emscripten_bind_MetadataBuilder___destroy___0\"]=asm[\"_emscripten_bind_MetadataBuilder___destroy___0\"];var _emscripten_bind_Metadata_Metadata_0=Module[\"_emscripten_bind_Metadata_Metadata_0\"]=asm[\"_emscripten_bind_Metadata_Metadata_0\"];var _emscripten_bind_Metadata___destroy___0=Module[\"_emscripten_bind_Metadata___destroy___0\"]=asm[\"_emscripten_bind_Metadata___destroy___0\"];var _emscripten_bind_PointAttribute_PointAttribute_0=Module[\"_emscripten_bind_PointAttribute_PointAttribute_0\"]=asm[\"_emscripten_bind_PointAttribute_PointAttribute_0\"];var _emscripten_bind_PointAttribute___destroy___0=Module[\"_emscripten_bind_PointAttribute___destroy___0\"]=asm[\"_emscripten_bind_PointAttribute___destroy___0\"];var _emscripten_bind_PointAttribute_attribute_type_0=Module[\"_emscripten_bind_PointAttribute_attribute_type_0\"]=asm[\"_emscripten_bind_PointAttribute_attribute_type_0\"];var _emscripten_bind_PointAttribute_byte_offset_0=Module[\"_emscripten_bind_PointAttribute_byte_offset_0\"]=asm[\"_emscripten_bind_PointAttribute_byte_offset_0\"];var _emscripten_bind_PointAttribute_byte_stride_0=Module[\"_emscripten_bind_PointAttribute_byte_stride_0\"]=asm[\"_emscripten_bind_PointAttribute_byte_stride_0\"];var _emscripten_bind_PointAttribute_data_type_0=Module[\"_emscripten_bind_PointAttribute_data_type_0\"]=asm[\"_emscripten_bind_PointAttribute_data_type_0\"];var _emscripten_bind_PointAttribute_normalized_0=Module[\"_emscripten_bind_PointAttribute_normalized_0\"]=asm[\"_emscripten_bind_PointAttribute_normalized_0\"];var _emscripten_bind_PointAttribute_num_components_0=Module[\"_emscripten_bind_PointAttribute_num_components_0\"]=asm[\"_emscripten_bind_PointAttribute_num_components_0\"];var _emscripten_bind_PointAttribute_size_0=Module[\"_emscripten_bind_PointAttribute_size_0\"]=asm[\"_emscripten_bind_PointAttribute_size_0\"];var _emscripten_bind_PointAttribute_unique_id_0=Module[\"_emscripten_bind_PointAttribute_unique_id_0\"]=asm[\"_emscripten_bind_PointAttribute_unique_id_0\"];var _emscripten_bind_PointCloudBuilder_AddFloatAttribute_5=Module[\"_emscripten_bind_PointCloudBuilder_AddFloatAttribute_5\"]=asm[\"_emscripten_bind_PointCloudBuilder_AddFloatAttribute_5\"];var _emscripten_bind_PointCloudBuilder_AddInt16Attribute_5=Module[\"_emscripten_bind_PointCloudBuilder_AddInt16Attribute_5\"]=asm[\"_emscripten_bind_PointCloudBuilder_AddInt16Attribute_5\"];var _emscripten_bind_PointCloudBuilder_AddInt32Attribute_5=Module[\"_emscripten_bind_PointCloudBuilder_AddInt32Attribute_5\"]=asm[\"_emscripten_bind_PointCloudBuilder_AddInt32Attribute_5\"];var _emscripten_bind_PointCloudBuilder_AddInt8Attribute_5=Module[\"_emscripten_bind_PointCloudBuilder_AddInt8Attribute_5\"]=asm[\"_emscripten_bind_PointCloudBuilder_AddInt8Attribute_5\"];var _emscripten_bind_PointCloudBuilder_AddMetadata_2=Module[\"_emscripten_bind_PointCloudBuilder_AddMetadata_2\"]=asm[\"_emscripten_bind_PointCloudBuilder_AddMetadata_2\"];var _emscripten_bind_PointCloudBuilder_AddUInt16Attribute_5=Module[\"_emscripten_bind_PointCloudBuilder_AddUInt16Attribute_5\"]=asm[\"_emscripten_bind_PointCloudBuilder_AddUInt16Attribute_5\"];var _emscripten_bind_PointCloudBuilder_AddUInt32Attribute_5=Module[\"_emscripten_bind_PointCloudBuilder_AddUInt32Attribute_5\"]=asm[\"_emscripten_bind_PointCloudBuilder_AddUInt32Attribute_5\"];var _emscripten_bind_PointCloudBuilder_AddUInt8Attribute_5=Module[\"_emscripten_bind_PointCloudBuilder_AddUInt8Attribute_5\"]=asm[\"_emscripten_bind_PointCloudBuilder_AddUInt8Attribute_5\"];var _emscripten_bind_PointCloudBuilder_PointCloudBuilder_0=Module[\"_emscripten_bind_PointCloudBuilder_PointCloudBuilder_0\"]=asm[\"_emscripten_bind_PointCloudBuilder_PointCloudBuilder_0\"];var _emscripten_bind_PointCloudBuilder_SetMetadataForAttribute_3=Module[\"_emscripten_bind_PointCloudBuilder_SetMetadataForAttribute_3\"]=asm[\"_emscripten_bind_PointCloudBuilder_SetMetadataForAttribute_3\"];var _emscripten_bind_PointCloudBuilder___destroy___0=Module[\"_emscripten_bind_PointCloudBuilder___destroy___0\"]=asm[\"_emscripten_bind_PointCloudBuilder___destroy___0\"];var _emscripten_bind_PointCloud_PointCloud_0=Module[\"_emscripten_bind_PointCloud_PointCloud_0\"]=asm[\"_emscripten_bind_PointCloud_PointCloud_0\"];var _emscripten_bind_PointCloud___destroy___0=Module[\"_emscripten_bind_PointCloud___destroy___0\"]=asm[\"_emscripten_bind_PointCloud___destroy___0\"];var _emscripten_bind_PointCloud_num_attributes_0=Module[\"_emscripten_bind_PointCloud_num_attributes_0\"]=asm[\"_emscripten_bind_PointCloud_num_attributes_0\"];var _emscripten_bind_PointCloud_num_points_0=Module[\"_emscripten_bind_PointCloud_num_points_0\"]=asm[\"_emscripten_bind_PointCloud_num_points_0\"];var _emscripten_bind_VoidPtr___destroy___0=Module[\"_emscripten_bind_VoidPtr___destroy___0\"]=asm[\"_emscripten_bind_VoidPtr___destroy___0\"];var _emscripten_enum_draco_EncodedGeometryType_INVALID_GEOMETRY_TYPE=Module[\"_emscripten_enum_draco_EncodedGeometryType_INVALID_GEOMETRY_TYPE\"]=asm[\"_emscripten_enum_draco_EncodedGeometryType_INVALID_GEOMETRY_TYPE\"];var _emscripten_enum_draco_EncodedGeometryType_POINT_CLOUD=Module[\"_emscripten_enum_draco_EncodedGeometryType_POINT_CLOUD\"]=asm[\"_emscripten_enum_draco_EncodedGeometryType_POINT_CLOUD\"];var _emscripten_enum_draco_EncodedGeometryType_TRIANGULAR_MESH=Module[\"_emscripten_enum_draco_EncodedGeometryType_TRIANGULAR_MESH\"]=asm[\"_emscripten_enum_draco_EncodedGeometryType_TRIANGULAR_MESH\"];var _emscripten_enum_draco_GeometryAttribute_Type_COLOR=Module[\"_emscripten_enum_draco_GeometryAttribute_Type_COLOR\"]=asm[\"_emscripten_enum_draco_GeometryAttribute_Type_COLOR\"];var _emscripten_enum_draco_GeometryAttribute_Type_GENERIC=Module[\"_emscripten_enum_draco_GeometryAttribute_Type_GENERIC\"]=asm[\"_emscripten_enum_draco_GeometryAttribute_Type_GENERIC\"];var _emscripten_enum_draco_GeometryAttribute_Type_INVALID=Module[\"_emscripten_enum_draco_GeometryAttribute_Type_INVALID\"]=asm[\"_emscripten_enum_draco_GeometryAttribute_Type_INVALID\"];var _emscripten_enum_draco_GeometryAttribute_Type_NORMAL=Module[\"_emscripten_enum_draco_GeometryAttribute_Type_NORMAL\"]=asm[\"_emscripten_enum_draco_GeometryAttribute_Type_NORMAL\"];var _emscripten_enum_draco_GeometryAttribute_Type_POSITION=Module[\"_emscripten_enum_draco_GeometryAttribute_Type_POSITION\"]=asm[\"_emscripten_enum_draco_GeometryAttribute_Type_POSITION\"];var _emscripten_enum_draco_GeometryAttribute_Type_TEX_COORD=Module[\"_emscripten_enum_draco_GeometryAttribute_Type_TEX_COORD\"]=asm[\"_emscripten_enum_draco_GeometryAttribute_Type_TEX_COORD\"];var _emscripten_enum_draco_MeshEncoderMethod_MESH_EDGEBREAKER_ENCODING=Module[\"_emscripten_enum_draco_MeshEncoderMethod_MESH_EDGEBREAKER_ENCODING\"]=asm[\"_emscripten_enum_draco_MeshEncoderMethod_MESH_EDGEBREAKER_ENCODING\"];var _emscripten_enum_draco_MeshEncoderMethod_MESH_SEQUENTIAL_ENCODING=Module[\"_emscripten_enum_draco_MeshEncoderMethod_MESH_SEQUENTIAL_ENCODING\"]=asm[\"_emscripten_enum_draco_MeshEncoderMethod_MESH_SEQUENTIAL_ENCODING\"];var _emscripten_replace_memory=Module[\"_emscripten_replace_memory\"]=asm[\"_emscripten_replace_memory\"];var _free=Module[\"_free\"]=asm[\"_free\"];var _i64Add=Module[\"_i64Add\"]=asm[\"_i64Add\"];var _i64Subtract=Module[\"_i64Subtract\"]=asm[\"_i64Subtract\"];var _llvm_bswap_i32=Module[\"_llvm_bswap_i32\"]=asm[\"_llvm_bswap_i32\"];var _malloc=Module[\"_malloc\"]=asm[\"_malloc\"];var _memcpy=Module[\"_memcpy\"]=asm[\"_memcpy\"];var _memmove=Module[\"_memmove\"]=asm[\"_memmove\"];var _memset=Module[\"_memset\"]=asm[\"_memset\"];var _sbrk=Module[\"_sbrk\"]=asm[\"_sbrk\"];var establishStackSpace=Module[\"establishStackSpace\"]=asm[\"establishStackSpace\"];var getTempRet0=Module[\"getTempRet0\"]=asm[\"getTempRet0\"];var runPostSets=Module[\"runPostSets\"]=asm[\"runPostSets\"];var setTempRet0=Module[\"setTempRet0\"]=asm[\"setTempRet0\"];var setThrew=Module[\"setThrew\"]=asm[\"setThrew\"];var stackAlloc=Module[\"stackAlloc\"]=asm[\"stackAlloc\"];var stackRestore=Module[\"stackRestore\"]=asm[\"stackRestore\"];var stackSave=Module[\"stackSave\"]=asm[\"stackSave\"];var dynCall_ii=Module[\"dynCall_ii\"]=asm[\"dynCall_ii\"];var dynCall_iii=Module[\"dynCall_iii\"]=asm[\"dynCall_iii\"];var dynCall_iiii=Module[\"dynCall_iiii\"]=asm[\"dynCall_iiii\"];var dynCall_iiiiiii=Module[\"dynCall_iiiiiii\"]=asm[\"dynCall_iiiiiii\"];var dynCall_v=Module[\"dynCall_v\"]=asm[\"dynCall_v\"];var dynCall_vi=Module[\"dynCall_vi\"]=asm[\"dynCall_vi\"];var dynCall_vii=Module[\"dynCall_vii\"]=asm[\"dynCall_vii\"];var dynCall_viii=Module[\"dynCall_viii\"]=asm[\"dynCall_viii\"];var dynCall_viiii=Module[\"dynCall_viiii\"]=asm[\"dynCall_viiii\"];var dynCall_viiiii=Module[\"dynCall_viiiii\"]=asm[\"dynCall_viiiii\"];var dynCall_viiiiii=Module[\"dynCall_viiiiii\"]=asm[\"dynCall_viiiiii\"];Module[\"asm\"]=asm;if(memoryInitializer){if(!isDataURI(memoryInitializer)){if(typeof Module[\"locateFile\"]===\"function\"){memoryInitializer=Module[\"locateFile\"](memoryInitializer)}else if(Module[\"memoryInitializerPrefixURL\"]){memoryInitializer=Module[\"memoryInitializerPrefixURL\"]+memoryInitializer}}if(ENVIRONMENT_IS_NODE||ENVIRONMENT_IS_SHELL){var data=Module[\"readBinary\"](memoryInitializer);HEAPU8.set(data,GLOBAL_BASE)}else{addRunDependency(\"memory initializer\");var applyMemoryInitializer=(function(data){if(data.byteLength)data=new Uint8Array(data);HEAPU8.set(data,GLOBAL_BASE);if(Module[\"memoryInitializerRequest\"])delete Module[\"memoryInitializerRequest\"].response;removeRunDependency(\"memory initializer\")});function doBrowserLoad(){Module[\"readAsync\"](memoryInitializer,applyMemoryInitializer,(function(){throw\"could not load memory initializer \"+memoryInitializer}))}var memoryInitializerBytes=tryParseAsDataURI(memoryInitializer);if(memoryInitializerBytes){applyMemoryInitializer(memoryInitializerBytes.buffer)}else if(Module[\"memoryInitializerRequest\"]){function useRequest(){var request=Module[\"memoryInitializerRequest\"];var response=request.response;if(request.status!==200&&request.status!==0){var data=tryParseAsDataURI(Module[\"memoryInitializerRequestURL\"]);if(data){response=data.buffer}else{console.warn(\"a problem seems to have happened with Module.memoryInitializerRequest, status: \"+request.status+\", retrying \"+memoryInitializer);doBrowserLoad();return}}applyMemoryInitializer(response)}if(Module[\"memoryInitializerRequest\"].response){setTimeout(useRequest,0)}else{Module[\"memoryInitializerRequest\"].addEventListener(\"load\",useRequest)}}else{doBrowserLoad()}}}Module[\"then\"]=(function(func){if(Module[\"calledRun\"]){func(Module)}else{var old=Module[\"onRuntimeInitialized\"];Module[\"onRuntimeInitialized\"]=(function(){if(old)old();func(Module)})}return Module});function ExitStatus(status){this.name=\"ExitStatus\";this.message=\"Program terminated with exit(\"+status+\")\";this.status=status}ExitStatus.prototype=new Error;ExitStatus.prototype.constructor=ExitStatus;var initialStackTop;dependenciesFulfilled=function runCaller(){if(!Module[\"calledRun\"])run();if(!Module[\"calledRun\"])dependenciesFulfilled=runCaller};function run(args){args=args||Module[\"arguments\"];if(runDependencies>0){return}preRun();if(runDependencies>0)return;if(Module[\"calledRun\"])return;function doRun(){if(Module[\"calledRun\"])return;Module[\"calledRun\"]=true;if(ABORT)return;ensureInitRuntime();preMain();if(Module[\"onRuntimeInitialized\"])Module[\"onRuntimeInitialized\"]();postRun()}if(Module[\"setStatus\"]){Module[\"setStatus\"](\"Running...\");setTimeout((function(){setTimeout((function(){Module[\"setStatus\"](\"\")}),1);doRun()}),1)}else{doRun()}}Module[\"run\"]=run;function exit(status,implicit){if(implicit&&Module[\"noExitRuntime\"]&&status===0){return}if(Module[\"noExitRuntime\"]){}else{ABORT=true;EXITSTATUS=status;STACKTOP=initialStackTop;exitRuntime();if(Module[\"onExit\"])Module[\"onExit\"](status)}if(ENVIRONMENT_IS_NODE){process[\"exit\"](status)}Module[\"quit\"](status,new ExitStatus(status))}Module[\"exit\"]=exit;function abort(what){if(Module[\"onAbort\"]){Module[\"onAbort\"](what)}if(what!==undefined){Module.print(what);Module.printErr(what);what=JSON.stringify(what)}else{what=\"\"}ABORT=true;EXITSTATUS=1;throw\"abort(\"+what+\"). Build with -s ASSERTIONS=1 for more info.\"}Module[\"abort\"]=abort;if(Module[\"preInit\"]){if(typeof Module[\"preInit\"]==\"function\")Module[\"preInit\"]=[Module[\"preInit\"]];while(Module[\"preInit\"].length>0){Module[\"preInit\"].pop()()}}Module[\"noExitRuntime\"]=true;run();function WrapperObject(){}WrapperObject.prototype=Object.create(WrapperObject.prototype);WrapperObject.prototype.constructor=WrapperObject;WrapperObject.prototype.__class__=WrapperObject;WrapperObject.__cache__={};Module[\"WrapperObject\"]=WrapperObject;function getCache(__class__){return(__class__||WrapperObject).__cache__}Module[\"getCache\"]=getCache;function wrapPointer(ptr,__class__){var cache=getCache(__class__);var ret=cache[ptr];if(ret)return ret;ret=Object.create((__class__||WrapperObject).prototype);ret.ptr=ptr;return cache[ptr]=ret}Module[\"wrapPointer\"]=wrapPointer;function castObject(obj,__class__){return wrapPointer(obj.ptr,__class__)}Module[\"castObject\"]=castObject;Module[\"NULL\"]=wrapPointer(0);function destroy(obj){if(!obj[\"__destroy__\"])throw\"Error: Cannot destroy object. (Did you create it yourself?)\";obj[\"__destroy__\"]();delete getCache(obj.__class__)[obj.ptr]}Module[\"destroy\"]=destroy;function compare(obj1,obj2){return obj1.ptr===obj2.ptr}Module[\"compare\"]=compare;function getPointer(obj){return obj.ptr}Module[\"getPointer\"]=getPointer;function getClass(obj){return obj.__class__}Module[\"getClass\"]=getClass;var ensureCache={buffer:0,size:0,pos:0,temps:[],needed:0,prepare:(function(){if(ensureCache.needed){for(var i=0;i<ensureCache.temps.length;i++){Module[\"_free\"](ensureCache.temps[i])}ensureCache.temps.length=0;Module[\"_free\"](ensureCache.buffer);ensureCache.buffer=0;ensureCache.size+=ensureCache.needed;ensureCache.needed=0}if(!ensureCache.buffer){ensureCache.size+=128;ensureCache.buffer=Module[\"_malloc\"](ensureCache.size);assert(ensureCache.buffer)}ensureCache.pos=0}),alloc:(function(array,view){assert(ensureCache.buffer);var bytes=view.BYTES_PER_ELEMENT;var len=array.length*bytes;len=len+7&-8;var ret;if(ensureCache.pos+len>=ensureCache.size){assert(len>0);ensureCache.needed+=len;ret=Module[\"_malloc\"](len);ensureCache.temps.push(ret)}else{ret=ensureCache.buffer+ensureCache.pos;ensureCache.pos+=len}return ret}),copy:(function(array,view,offset){var offsetShifted=offset;var bytes=view.BYTES_PER_ELEMENT;switch(bytes){case 2:offsetShifted>>=1;break;case 4:offsetShifted>>=2;break;case 8:offsetShifted>>=3;break}for(var i=0;i<array.length;i++){view[offsetShifted+i]=array[i]}})};function ensureString(value){if(typeof value===\"string\"){var intArray=intArrayFromString(value);var offset=ensureCache.alloc(intArray,HEAP8);ensureCache.copy(intArray,HEAP8,offset);return offset}return value}function ensureInt8(value){if(typeof value===\"object\"){var offset=ensureCache.alloc(value,HEAP8);ensureCache.copy(value,HEAP8,offset);return offset}return value}function ensureInt16(value){if(typeof value===\"object\"){var offset=ensureCache.alloc(value,HEAP16);ensureCache.copy(value,HEAP16,offset);return offset}return value}function ensureInt32(value){if(typeof value===\"object\"){var offset=ensureCache.alloc(value,HEAP32);ensureCache.copy(value,HEAP32,offset);return offset}return value}function ensureFloat32(value){if(typeof value===\"object\"){var offset=ensureCache.alloc(value,HEAPF32);ensureCache.copy(value,HEAPF32,offset);return offset}return value}function PointCloud(){this.ptr=_emscripten_bind_PointCloud_PointCloud_0();getCache(PointCloud)[this.ptr]=this}PointCloud.prototype=Object.create(WrapperObject.prototype);PointCloud.prototype.constructor=PointCloud;PointCloud.prototype.__class__=PointCloud;PointCloud.__cache__={};Module[\"PointCloud\"]=PointCloud;PointCloud.prototype[\"num_attributes\"]=PointCloud.prototype.num_attributes=(function(){var self=this.ptr;return _emscripten_bind_PointCloud_num_attributes_0(self)});PointCloud.prototype[\"num_points\"]=PointCloud.prototype.num_points=(function(){var self=this.ptr;return _emscripten_bind_PointCloud_num_points_0(self)});PointCloud.prototype[\"__destroy__\"]=PointCloud.prototype.__destroy__=(function(){var self=this.ptr;_emscripten_bind_PointCloud___destroy___0(self)});function PointAttribute(){this.ptr=_emscripten_bind_PointAttribute_PointAttribute_0();getCache(PointAttribute)[this.ptr]=this}PointAttribute.prototype=Object.create(WrapperObject.prototype);PointAttribute.prototype.constructor=PointAttribute;PointAttribute.prototype.__class__=PointAttribute;PointAttribute.__cache__={};Module[\"PointAttribute\"]=PointAttribute;PointAttribute.prototype[\"size\"]=PointAttribute.prototype.size=(function(){var self=this.ptr;return _emscripten_bind_PointAttribute_size_0(self)});PointAttribute.prototype[\"attribute_type\"]=PointAttribute.prototype.attribute_type=(function(){var self=this.ptr;return _emscripten_bind_PointAttribute_attribute_type_0(self)});PointAttribute.prototype[\"data_type\"]=PointAttribute.prototype.data_type=(function(){var self=this.ptr;return _emscripten_bind_PointAttribute_data_type_0(self)});PointAttribute.prototype[\"num_components\"]=PointAttribute.prototype.num_components=(function(){var self=this.ptr;return _emscripten_bind_PointAttribute_num_components_0(self)});PointAttribute.prototype[\"normalized\"]=PointAttribute.prototype.normalized=(function(){var self=this.ptr;return!!_emscripten_bind_PointAttribute_normalized_0(self)});PointAttribute.prototype[\"byte_stride\"]=PointAttribute.prototype.byte_stride=(function(){var self=this.ptr;return _emscripten_bind_PointAttribute_byte_stride_0(self)});PointAttribute.prototype[\"byte_offset\"]=PointAttribute.prototype.byte_offset=(function(){var self=this.ptr;return _emscripten_bind_PointAttribute_byte_offset_0(self)});PointAttribute.prototype[\"unique_id\"]=PointAttribute.prototype.unique_id=(function(){var self=this.ptr;return _emscripten_bind_PointAttribute_unique_id_0(self)});PointAttribute.prototype[\"__destroy__\"]=PointAttribute.prototype.__destroy__=(function(){var self=this.ptr;_emscripten_bind_PointAttribute___destroy___0(self)});function Encoder(){this.ptr=_emscripten_bind_Encoder_Encoder_0();getCache(Encoder)[this.ptr]=this}Encoder.prototype=Object.create(WrapperObject.prototype);Encoder.prototype.constructor=Encoder;Encoder.prototype.__class__=Encoder;Encoder.__cache__={};Module[\"Encoder\"]=Encoder;Encoder.prototype[\"SetEncodingMethod\"]=Encoder.prototype.SetEncodingMethod=(function(arg0){var self=this.ptr;if(arg0&&typeof arg0===\"object\")arg0=arg0.ptr;_emscripten_bind_Encoder_SetEncodingMethod_1(self,arg0)});Encoder.prototype[\"SetAttributeQuantization\"]=Encoder.prototype.SetAttributeQuantization=(function(arg0,arg1){var self=this.ptr;if(arg0&&typeof arg0===\"object\")arg0=arg0.ptr;if(arg1&&typeof arg1===\"object\")arg1=arg1.ptr;_emscripten_bind_Encoder_SetAttributeQuantization_2(self,arg0,arg1)});Encoder.prototype[\"SetAttributeExplicitQuantization\"]=Encoder.prototype.SetAttributeExplicitQuantization=(function(arg0,arg1,arg2,arg3,arg4){var self=this.ptr;ensureCache.prepare();if(arg0&&typeof arg0===\"object\")arg0=arg0.ptr;if(arg1&&typeof arg1===\"object\")arg1=arg1.ptr;if(arg2&&typeof arg2===\"object\")arg2=arg2.ptr;if(typeof arg3==\"object\"){arg3=ensureFloat32(arg3)}if(arg4&&typeof arg4===\"object\")arg4=arg4.ptr;_emscripten_bind_Encoder_SetAttributeExplicitQuantization_5(self,arg0,arg1,arg2,arg3,arg4)});Encoder.prototype[\"SetSpeedOptions\"]=Encoder.prototype.SetSpeedOptions=(function(arg0,arg1){var self=this.ptr;if(arg0&&typeof arg0===\"object\")arg0=arg0.ptr;if(arg1&&typeof arg1===\"object\")arg1=arg1.ptr;_emscripten_bind_Encoder_SetSpeedOptions_2(self,arg0,arg1)});Encoder.prototype[\"EncodeMeshToDracoBuffer\"]=Encoder.prototype.EncodeMeshToDracoBuffer=(function(arg0,arg1){var self=this.ptr;if(arg0&&typeof arg0===\"object\")arg0=arg0.ptr;if(arg1&&typeof arg1===\"object\")arg1=arg1.ptr;return _emscripten_bind_Encoder_EncodeMeshToDracoBuffer_2(self,arg0,arg1)});Encoder.prototype[\"EncodePointCloudToDracoBuffer\"]=Encoder.prototype.EncodePointCloudToDracoBuffer=(function(arg0,arg1,arg2){var self=this.ptr;if(arg0&&typeof arg0===\"object\")arg0=arg0.ptr;if(arg1&&typeof arg1===\"object\")arg1=arg1.ptr;if(arg2&&typeof arg2===\"object\")arg2=arg2.ptr;return _emscripten_bind_Encoder_EncodePointCloudToDracoBuffer_3(self,arg0,arg1,arg2)});Encoder.prototype[\"__destroy__\"]=Encoder.prototype.__destroy__=(function(){var self=this.ptr;_emscripten_bind_Encoder___destroy___0(self)});function MeshBuilder(){this.ptr=_emscripten_bind_MeshBuilder_MeshBuilder_0();getCache(MeshBuilder)[this.ptr]=this}MeshBuilder.prototype=Object.create(WrapperObject.prototype);MeshBuilder.prototype.constructor=MeshBuilder;MeshBuilder.prototype.__class__=MeshBuilder;MeshBuilder.__cache__={};Module[\"MeshBuilder\"]=MeshBuilder;MeshBuilder.prototype[\"AddFacesToMesh\"]=MeshBuilder.prototype.AddFacesToMesh=(function(arg0,arg1,arg2){var self=this.ptr;ensureCache.prepare();if(arg0&&typeof arg0===\"object\")arg0=arg0.ptr;if(arg1&&typeof arg1===\"object\")arg1=arg1.ptr;if(typeof arg2==\"object\"){arg2=ensureInt32(arg2)}return!!_emscripten_bind_MeshBuilder_AddFacesToMesh_3(self,arg0,arg1,arg2)});MeshBuilder.prototype[\"AddFloatAttributeToMesh\"]=MeshBuilder.prototype.AddFloatAttributeToMesh=(function(arg0,arg1,arg2,arg3,arg4){var self=this.ptr;ensureCache.prepare();if(arg0&&typeof arg0===\"object\")arg0=arg0.ptr;if(arg1&&typeof arg1===\"object\")arg1=arg1.ptr;if(arg2&&typeof arg2===\"object\")arg2=arg2.ptr;if(arg3&&typeof arg3===\"object\")arg3=arg3.ptr;if(typeof arg4==\"object\"){arg4=ensureFloat32(arg4)}return _emscripten_bind_MeshBuilder_AddFloatAttributeToMesh_5(self,arg0,arg1,arg2,arg3,arg4)});MeshBuilder.prototype[\"AddInt32AttributeToMesh\"]=MeshBuilder.prototype.AddInt32AttributeToMesh=(function(arg0,arg1,arg2,arg3,arg4){var self=this.ptr;ensureCache.prepare();if(arg0&&typeof arg0===\"object\")arg0=arg0.ptr;if(arg1&&typeof arg1===\"object\")arg1=arg1.ptr;if(arg2&&typeof arg2===\"object\")arg2=arg2.ptr;if(arg3&&typeof arg3===\"object\")arg3=arg3.ptr;if(typeof arg4==\"object\"){arg4=ensureInt32(arg4)}return _emscripten_bind_MeshBuilder_AddInt32AttributeToMesh_5(self,arg0,arg1,arg2,arg3,arg4)});MeshBuilder.prototype[\"AddMetadataToMesh\"]=MeshBuilder.prototype.AddMetadataToMesh=(function(arg0,arg1){var self=this.ptr;if(arg0&&typeof arg0===\"object\")arg0=arg0.ptr;if(arg1&&typeof arg1===\"object\")arg1=arg1.ptr;return!!_emscripten_bind_MeshBuilder_AddMetadataToMesh_2(self,arg0,arg1)});MeshBuilder.prototype[\"AddFloatAttribute\"]=MeshBuilder.prototype.AddFloatAttribute=(function(arg0,arg1,arg2,arg3,arg4){var self=this.ptr;ensureCache.prepare();if(arg0&&typeof arg0===\"object\")arg0=arg0.ptr;if(arg1&&typeof arg1===\"object\")arg1=arg1.ptr;if(arg2&&typeof arg2===\"object\")arg2=arg2.ptr;if(arg3&&typeof arg3===\"object\")arg3=arg3.ptr;if(typeof arg4==\"object\"){arg4=ensureFloat32(arg4)}return _emscripten_bind_MeshBuilder_AddFloatAttribute_5(self,arg0,arg1,arg2,arg3,arg4)});MeshBuilder.prototype[\"AddInt8Attribute\"]=MeshBuilder.prototype.AddInt8Attribute=(function(arg0,arg1,arg2,arg3,arg4){var self=this.ptr;ensureCache.prepare();if(arg0&&typeof arg0===\"object\")arg0=arg0.ptr;if(arg1&&typeof arg1===\"object\")arg1=arg1.ptr;if(arg2&&typeof arg2===\"object\")arg2=arg2.ptr;if(arg3&&typeof arg3===\"object\")arg3=arg3.ptr;if(typeof arg4==\"object\"){arg4=ensureInt8(arg4)}return _emscripten_bind_MeshBuilder_AddInt8Attribute_5(self,arg0,arg1,arg2,arg3,arg4)});MeshBuilder.prototype[\"AddUInt8Attribute\"]=MeshBuilder.prototype.AddUInt8Attribute=(function(arg0,arg1,arg2,arg3,arg4){var self=this.ptr;ensureCache.prepare();if(arg0&&typeof arg0===\"object\")arg0=arg0.ptr;if(arg1&&typeof arg1===\"object\")arg1=arg1.ptr;if(arg2&&typeof arg2===\"object\")arg2=arg2.ptr;if(arg3&&typeof arg3===\"object\")arg3=arg3.ptr;if(typeof arg4==\"object\"){arg4=ensureInt8(arg4)}return _emscripten_bind_MeshBuilder_AddUInt8Attribute_5(self,arg0,arg1,arg2,arg3,arg4)});MeshBuilder.prototype[\"AddInt16Attribute\"]=MeshBuilder.prototype.AddInt16Attribute=(function(arg0,arg1,arg2,arg3,arg4){var self=this.ptr;ensureCache.prepare();if(arg0&&typeof arg0===\"object\")arg0=arg0.ptr;if(arg1&&typeof arg1===\"object\")arg1=arg1.ptr;if(arg2&&typeof arg2===\"object\")arg2=arg2.ptr;if(arg3&&typeof arg3===\"object\")arg3=arg3.ptr;if(typeof arg4==\"object\"){arg4=ensureInt16(arg4)}return _emscripten_bind_MeshBuilder_AddInt16Attribute_5(self,arg0,arg1,arg2,arg3,arg4)});MeshBuilder.prototype[\"AddUInt16Attribute\"]=MeshBuilder.prototype.AddUInt16Attribute=(function(arg0,arg1,arg2,arg3,arg4){var self=this.ptr;ensureCache.prepare();if(arg0&&typeof arg0===\"object\")arg0=arg0.ptr;if(arg1&&typeof arg1===\"object\")arg1=arg1.ptr;if(arg2&&typeof arg2===\"object\")arg2=arg2.ptr;if(arg3&&typeof arg3===\"object\")arg3=arg3.ptr;if(typeof arg4==\"object\"){arg4=ensureInt16(arg4)}return _emscripten_bind_MeshBuilder_AddUInt16Attribute_5(self,arg0,arg1,arg2,arg3,arg4)});MeshBuilder.prototype[\"AddInt32Attribute\"]=MeshBuilder.prototype.AddInt32Attribute=(function(arg0,arg1,arg2,arg3,arg4){var self=this.ptr;ensureCache.prepare();if(arg0&&typeof arg0===\"object\")arg0=arg0.ptr;if(arg1&&typeof arg1===\"object\")arg1=arg1.ptr;if(arg2&&typeof arg2===\"object\")arg2=arg2.ptr;if(arg3&&typeof arg3===\"object\")arg3=arg3.ptr;if(typeof arg4==\"object\"){arg4=ensureInt32(arg4)}return _emscripten_bind_MeshBuilder_AddInt32Attribute_5(self,arg0,arg1,arg2,arg3,arg4)});MeshBuilder.prototype[\"AddUInt32Attribute\"]=MeshBuilder.prototype.AddUInt32Attribute=(function(arg0,arg1,arg2,arg3,arg4){var self=this.ptr;ensureCache.prepare();if(arg0&&typeof arg0===\"object\")arg0=arg0.ptr;if(arg1&&typeof arg1===\"object\")arg1=arg1.ptr;if(arg2&&typeof arg2===\"object\")arg2=arg2.ptr;if(arg3&&typeof arg3===\"object\")arg3=arg3.ptr;if(typeof arg4==\"object\"){arg4=ensureInt32(arg4)}return _emscripten_bind_MeshBuilder_AddUInt32Attribute_5(self,arg0,arg1,arg2,arg3,arg4)});MeshBuilder.prototype[\"AddMetadata\"]=MeshBuilder.prototype.AddMetadata=(function(arg0,arg1){var self=this.ptr;if(arg0&&typeof arg0===\"object\")arg0=arg0.ptr;if(arg1&&typeof arg1===\"object\")arg1=arg1.ptr;return!!_emscripten_bind_MeshBuilder_AddMetadata_2(self,arg0,arg1)});MeshBuilder.prototype[\"SetMetadataForAttribute\"]=MeshBuilder.prototype.SetMetadataForAttribute=(function(arg0,arg1,arg2){var self=this.ptr;if(arg0&&typeof arg0===\"object\")arg0=arg0.ptr;if(arg1&&typeof arg1===\"object\")arg1=arg1.ptr;if(arg2&&typeof arg2===\"object\")arg2=arg2.ptr;return!!_emscripten_bind_MeshBuilder_SetMetadataForAttribute_3(self,arg0,arg1,arg2)});MeshBuilder.prototype[\"__destroy__\"]=MeshBuilder.prototype.__destroy__=(function(){var self=this.ptr;_emscripten_bind_MeshBuilder___destroy___0(self)});function DracoInt8Array(){this.ptr=_emscripten_bind_DracoInt8Array_DracoInt8Array_0();getCache(DracoInt8Array)[this.ptr]=this}DracoInt8Array.prototype=Object.create(WrapperObject.prototype);DracoInt8Array.prototype.constructor=DracoInt8Array;DracoInt8Array.prototype.__class__=DracoInt8Array;DracoInt8Array.__cache__={};Module[\"DracoInt8Array\"]=DracoInt8Array;DracoInt8Array.prototype[\"GetValue\"]=DracoInt8Array.prototype.GetValue=(function(arg0){var self=this.ptr;if(arg0&&typeof arg0===\"object\")arg0=arg0.ptr;return _emscripten_bind_DracoInt8Array_GetValue_1(self,arg0)});DracoInt8Array.prototype[\"size\"]=DracoInt8Array.prototype.size=(function(){var self=this.ptr;return _emscripten_bind_DracoInt8Array_size_0(self)});DracoInt8Array.prototype[\"__destroy__\"]=DracoInt8Array.prototype.__destroy__=(function(){var self=this.ptr;_emscripten_bind_DracoInt8Array___destroy___0(self)});function MetadataBuilder(){this.ptr=_emscripten_bind_MetadataBuilder_MetadataBuilder_0();getCache(MetadataBuilder)[this.ptr]=this}MetadataBuilder.prototype=Object.create(WrapperObject.prototype);MetadataBuilder.prototype.constructor=MetadataBuilder;MetadataBuilder.prototype.__class__=MetadataBuilder;MetadataBuilder.__cache__={};Module[\"MetadataBuilder\"]=MetadataBuilder;MetadataBuilder.prototype[\"AddStringEntry\"]=MetadataBuilder.prototype.AddStringEntry=(function(arg0,arg1,arg2){var self=this.ptr;ensureCache.prepare();if(arg0&&typeof arg0===\"object\")arg0=arg0.ptr;if(arg1&&typeof arg1===\"object\")arg1=arg1.ptr;else arg1=ensureString(arg1);if(arg2&&typeof arg2===\"object\")arg2=arg2.ptr;else arg2=ensureString(arg2);return!!_emscripten_bind_MetadataBuilder_AddStringEntry_3(self,arg0,arg1,arg2)});MetadataBuilder.prototype[\"AddIntEntry\"]=MetadataBuilder.prototype.AddIntEntry=(function(arg0,arg1,arg2){var self=this.ptr;ensureCache.prepare();if(arg0&&typeof arg0===\"object\")arg0=arg0.ptr;if(arg1&&typeof arg1===\"object\")arg1=arg1.ptr;else arg1=ensureString(arg1);if(arg2&&typeof arg2===\"object\")arg2=arg2.ptr;return!!_emscripten_bind_MetadataBuilder_AddIntEntry_3(self,arg0,arg1,arg2)});MetadataBuilder.prototype[\"AddDoubleEntry\"]=MetadataBuilder.prototype.AddDoubleEntry=(function(arg0,arg1,arg2){var self=this.ptr;ensureCache.prepare();if(arg0&&typeof arg0===\"object\")arg0=arg0.ptr;if(arg1&&typeof arg1===\"object\")arg1=arg1.ptr;else arg1=ensureString(arg1);if(arg2&&typeof arg2===\"object\")arg2=arg2.ptr;return!!_emscripten_bind_MetadataBuilder_AddDoubleEntry_3(self,arg0,arg1,arg2)});MetadataBuilder.prototype[\"__destroy__\"]=MetadataBuilder.prototype.__destroy__=(function(){var self=this.ptr;_emscripten_bind_MetadataBuilder___destroy___0(self)});function GeometryAttribute(){this.ptr=_emscripten_bind_GeometryAttribute_GeometryAttribute_0();getCache(GeometryAttribute)[this.ptr]=this}GeometryAttribute.prototype=Object.create(WrapperObject.prototype);GeometryAttribute.prototype.constructor=GeometryAttribute;GeometryAttribute.prototype.__class__=GeometryAttribute;GeometryAttribute.__cache__={};Module[\"GeometryAttribute\"]=GeometryAttribute;GeometryAttribute.prototype[\"__destroy__\"]=GeometryAttribute.prototype.__destroy__=(function(){var self=this.ptr;_emscripten_bind_GeometryAttribute___destroy___0(self)});function Mesh(){this.ptr=_emscripten_bind_Mesh_Mesh_0();getCache(Mesh)[this.ptr]=this}Mesh.prototype=Object.create(WrapperObject.prototype);Mesh.prototype.constructor=Mesh;Mesh.prototype.__class__=Mesh;Mesh.__cache__={};Module[\"Mesh\"]=Mesh;Mesh.prototype[\"num_faces\"]=Mesh.prototype.num_faces=(function(){var self=this.ptr;return _emscripten_bind_Mesh_num_faces_0(self)});Mesh.prototype[\"num_attributes\"]=Mesh.prototype.num_attributes=(function(){var self=this.ptr;return _emscripten_bind_Mesh_num_attributes_0(self)});Mesh.prototype[\"num_points\"]=Mesh.prototype.num_points=(function(){var self=this.ptr;return _emscripten_bind_Mesh_num_points_0(self)});Mesh.prototype[\"set_num_points\"]=Mesh.prototype.set_num_points=(function(arg0){var self=this.ptr;if(arg0&&typeof arg0===\"object\")arg0=arg0.ptr;_emscripten_bind_Mesh_set_num_points_1(self,arg0)});Mesh.prototype[\"__destroy__\"]=Mesh.prototype.__destroy__=(function(){var self=this.ptr;_emscripten_bind_Mesh___destroy___0(self)});function PointCloudBuilder(){this.ptr=_emscripten_bind_PointCloudBuilder_PointCloudBuilder_0();getCache(PointCloudBuilder)[this.ptr]=this}PointCloudBuilder.prototype=Object.create(WrapperObject.prototype);PointCloudBuilder.prototype.constructor=PointCloudBuilder;PointCloudBuilder.prototype.__class__=PointCloudBuilder;PointCloudBuilder.__cache__={};Module[\"PointCloudBuilder\"]=PointCloudBuilder;PointCloudBuilder.prototype[\"AddFloatAttribute\"]=PointCloudBuilder.prototype.AddFloatAttribute=(function(arg0,arg1,arg2,arg3,arg4){var self=this.ptr;ensureCache.prepare();if(arg0&&typeof arg0===\"object\")arg0=arg0.ptr;if(arg1&&typeof arg1===\"object\")arg1=arg1.ptr;if(arg2&&typeof arg2===\"object\")arg2=arg2.ptr;if(arg3&&typeof arg3===\"object\")arg3=arg3.ptr;if(typeof arg4==\"object\"){arg4=ensureFloat32(arg4)}return _emscripten_bind_PointCloudBuilder_AddFloatAttribute_5(self,arg0,arg1,arg2,arg3,arg4)});PointCloudBuilder.prototype[\"AddInt8Attribute\"]=PointCloudBuilder.prototype.AddInt8Attribute=(function(arg0,arg1,arg2,arg3,arg4){var self=this.ptr;ensureCache.prepare();if(arg0&&typeof arg0===\"object\")arg0=arg0.ptr;if(arg1&&typeof arg1===\"object\")arg1=arg1.ptr;if(arg2&&typeof arg2===\"object\")arg2=arg2.ptr;if(arg3&&typeof arg3===\"object\")arg3=arg3.ptr;if(typeof arg4==\"object\"){arg4=ensureInt8(arg4)}return _emscripten_bind_PointCloudBuilder_AddInt8Attribute_5(self,arg0,arg1,arg2,arg3,arg4)});PointCloudBuilder.prototype[\"AddUInt8Attribute\"]=PointCloudBuilder.prototype.AddUInt8Attribute=(function(arg0,arg1,arg2,arg3,arg4){var self=this.ptr;ensureCache.prepare();if(arg0&&typeof arg0===\"object\")arg0=arg0.ptr;if(arg1&&typeof arg1===\"object\")arg1=arg1.ptr;if(arg2&&typeof arg2===\"object\")arg2=arg2.ptr;if(arg3&&typeof arg3===\"object\")arg3=arg3.ptr;if(typeof arg4==\"object\"){arg4=ensureInt8(arg4)}return _emscripten_bind_PointCloudBuilder_AddUInt8Attribute_5(self,arg0,arg1,arg2,arg3,arg4)});PointCloudBuilder.prototype[\"AddInt16Attribute\"]=PointCloudBuilder.prototype.AddInt16Attribute=(function(arg0,arg1,arg2,arg3,arg4){var self=this.ptr;ensureCache.prepare();if(arg0&&typeof arg0===\"object\")arg0=arg0.ptr;if(arg1&&typeof arg1===\"object\")arg1=arg1.ptr;if(arg2&&typeof arg2===\"object\")arg2=arg2.ptr;if(arg3&&typeof arg3===\"object\")arg3=arg3.ptr;if(typeof arg4==\"object\"){arg4=ensureInt16(arg4)}return _emscripten_bind_PointCloudBuilder_AddInt16Attribute_5(self,arg0,arg1,arg2,arg3,arg4)});PointCloudBuilder.prototype[\"AddUInt16Attribute\"]=PointCloudBuilder.prototype.AddUInt16Attribute=(function(arg0,arg1,arg2,arg3,arg4){var self=this.ptr;ensureCache.prepare();if(arg0&&typeof arg0===\"object\")arg0=arg0.ptr;if(arg1&&typeof arg1===\"object\")arg1=arg1.ptr;if(arg2&&typeof arg2===\"object\")arg2=arg2.ptr;if(arg3&&typeof arg3===\"object\")arg3=arg3.ptr;if(typeof arg4==\"object\"){arg4=ensureInt16(arg4)}return _emscripten_bind_PointCloudBuilder_AddUInt16Attribute_5(self,arg0,arg1,arg2,arg3,arg4)});PointCloudBuilder.prototype[\"AddInt32Attribute\"]=PointCloudBuilder.prototype.AddInt32Attribute=(function(arg0,arg1,arg2,arg3,arg4){var self=this.ptr;ensureCache.prepare();if(arg0&&typeof arg0===\"object\")arg0=arg0.ptr;if(arg1&&typeof arg1===\"object\")arg1=arg1.ptr;if(arg2&&typeof arg2===\"object\")arg2=arg2.ptr;if(arg3&&typeof arg3===\"object\")arg3=arg3.ptr;if(typeof arg4==\"object\"){arg4=ensureInt32(arg4)}return _emscripten_bind_PointCloudBuilder_AddInt32Attribute_5(self,arg0,arg1,arg2,arg3,arg4)});PointCloudBuilder.prototype[\"AddUInt32Attribute\"]=PointCloudBuilder.prototype.AddUInt32Attribute=(function(arg0,arg1,arg2,arg3,arg4){var self=this.ptr;ensureCache.prepare();if(arg0&&typeof arg0===\"object\")arg0=arg0.ptr;if(arg1&&typeof arg1===\"object\")arg1=arg1.ptr;if(arg2&&typeof arg2===\"object\")arg2=arg2.ptr;if(arg3&&typeof arg3===\"object\")arg3=arg3.ptr;if(typeof arg4==\"object\"){arg4=ensureInt32(arg4)}return _emscripten_bind_PointCloudBuilder_AddUInt32Attribute_5(self,arg0,arg1,arg2,arg3,arg4)});PointCloudBuilder.prototype[\"AddMetadata\"]=PointCloudBuilder.prototype.AddMetadata=(function(arg0,arg1){var self=this.ptr;if(arg0&&typeof arg0===\"object\")arg0=arg0.ptr;if(arg1&&typeof arg1===\"object\")arg1=arg1.ptr;return!!_emscripten_bind_PointCloudBuilder_AddMetadata_2(self,arg0,arg1)});PointCloudBuilder.prototype[\"SetMetadataForAttribute\"]=PointCloudBuilder.prototype.SetMetadataForAttribute=(function(arg0,arg1,arg2){var self=this.ptr;if(arg0&&typeof arg0===\"object\")arg0=arg0.ptr;if(arg1&&typeof arg1===\"object\")arg1=arg1.ptr;if(arg2&&typeof arg2===\"object\")arg2=arg2.ptr;return!!_emscripten_bind_PointCloudBuilder_SetMetadataForAttribute_3(self,arg0,arg1,arg2)});PointCloudBuilder.prototype[\"__destroy__\"]=PointCloudBuilder.prototype.__destroy__=(function(){var self=this.ptr;_emscripten_bind_PointCloudBuilder___destroy___0(self)});function VoidPtr(){throw\"cannot construct a VoidPtr, no constructor in IDL\"}VoidPtr.prototype=Object.create(WrapperObject.prototype);VoidPtr.prototype.constructor=VoidPtr;VoidPtr.prototype.__class__=VoidPtr;VoidPtr.__cache__={};Module[\"VoidPtr\"]=VoidPtr;VoidPtr.prototype[\"__destroy__\"]=VoidPtr.prototype.__destroy__=(function(){var self=this.ptr;_emscripten_bind_VoidPtr___destroy___0(self)});function Metadata(){this.ptr=_emscripten_bind_Metadata_Metadata_0();getCache(Metadata)[this.ptr]=this}Metadata.prototype=Object.create(WrapperObject.prototype);Metadata.prototype.constructor=Metadata;Metadata.prototype.__class__=Metadata;Metadata.__cache__={};Module[\"Metadata\"]=Metadata;Metadata.prototype[\"__destroy__\"]=Metadata.prototype.__destroy__=(function(){var self=this.ptr;_emscripten_bind_Metadata___destroy___0(self)});((function(){function setupEnums(){Module[\"MESH_SEQUENTIAL_ENCODING\"]=_emscripten_enum_draco_MeshEncoderMethod_MESH_SEQUENTIAL_ENCODING();Module[\"MESH_EDGEBREAKER_ENCODING\"]=_emscripten_enum_draco_MeshEncoderMethod_MESH_EDGEBREAKER_ENCODING();Module[\"INVALID_GEOMETRY_TYPE\"]=_emscripten_enum_draco_EncodedGeometryType_INVALID_GEOMETRY_TYPE();Module[\"POINT_CLOUD\"]=_emscripten_enum_draco_EncodedGeometryType_POINT_CLOUD();Module[\"TRIANGULAR_MESH\"]=_emscripten_enum_draco_EncodedGeometryType_TRIANGULAR_MESH();Module[\"INVALID\"]=_emscripten_enum_draco_GeometryAttribute_Type_INVALID();Module[\"POSITION\"]=_emscripten_enum_draco_GeometryAttribute_Type_POSITION();Module[\"NORMAL\"]=_emscripten_enum_draco_GeometryAttribute_Type_NORMAL();Module[\"COLOR\"]=_emscripten_enum_draco_GeometryAttribute_Type_COLOR();Module[\"TEX_COORD\"]=_emscripten_enum_draco_GeometryAttribute_Type_TEX_COORD();Module[\"GENERIC\"]=_emscripten_enum_draco_GeometryAttribute_Type_GENERIC()}if(Module[\"calledRun\"])setupEnums();else addOnPreMain(setupEnums)}))();if(typeof Module[\"onModuleParsed\"]===\"function\"){Module[\"onModuleParsed\"]()}\n\n\n\n\n\n\n  return DracoEncoderModule;\n};\nif (typeof exports === 'object' && typeof module === 'object')\n  module.exports = DracoEncoderModule;\nelse if (typeof define === 'function' && define['amd'])\n  define([], function() { return DracoEncoderModule; });\nelse if (typeof exports === 'object')\n  exports[\"DracoEncoderModule\"] = DracoEncoderModule;\n"
  },
  {
    "path": "examples/libs/draco/gltf/draco_wasm_wrapper.js",
    "content": "var $jscomp=$jscomp||{};$jscomp.scope={};$jscomp.arrayIteratorImpl=function(h){var n=0;return function(){return n<h.length?{done:!1,value:h[n++]}:{done:!0}}};$jscomp.arrayIterator=function(h){return{next:$jscomp.arrayIteratorImpl(h)}};$jscomp.makeIterator=function(h){var n=\"undefined\"!=typeof Symbol&&Symbol.iterator&&h[Symbol.iterator];return n?n.call(h):$jscomp.arrayIterator(h)};$jscomp.ASSUME_ES5=!1;$jscomp.ASSUME_NO_NATIVE_MAP=!1;$jscomp.ASSUME_NO_NATIVE_SET=!1;$jscomp.SIMPLE_FROUND_POLYFILL=!1;\n$jscomp.ISOLATE_POLYFILLS=!1;$jscomp.FORCE_POLYFILL_PROMISE=!1;$jscomp.FORCE_POLYFILL_PROMISE_WHEN_NO_UNHANDLED_REJECTION=!1;$jscomp.getGlobal=function(h){h=[\"object\"==typeof globalThis&&globalThis,h,\"object\"==typeof window&&window,\"object\"==typeof self&&self,\"object\"==typeof global&&global];for(var n=0;n<h.length;++n){var k=h[n];if(k&&k.Math==Math)return k}throw Error(\"Cannot find global object\");};$jscomp.global=$jscomp.getGlobal(this);\n$jscomp.defineProperty=$jscomp.ASSUME_ES5||\"function\"==typeof Object.defineProperties?Object.defineProperty:function(h,n,k){if(h==Array.prototype||h==Object.prototype)return h;h[n]=k.value;return h};$jscomp.IS_SYMBOL_NATIVE=\"function\"===typeof Symbol&&\"symbol\"===typeof Symbol(\"x\");$jscomp.TRUST_ES6_POLYFILLS=!$jscomp.ISOLATE_POLYFILLS||$jscomp.IS_SYMBOL_NATIVE;$jscomp.polyfills={};$jscomp.propertyToPolyfillSymbol={};$jscomp.POLYFILL_PREFIX=\"$jscp$\";\nvar $jscomp$lookupPolyfilledValue=function(h,n){var k=$jscomp.propertyToPolyfillSymbol[n];if(null==k)return h[n];k=h[k];return void 0!==k?k:h[n]};$jscomp.polyfill=function(h,n,k,p){n&&($jscomp.ISOLATE_POLYFILLS?$jscomp.polyfillIsolated(h,n,k,p):$jscomp.polyfillUnisolated(h,n,k,p))};\n$jscomp.polyfillUnisolated=function(h,n,k,p){k=$jscomp.global;h=h.split(\".\");for(p=0;p<h.length-1;p++){var l=h[p];if(!(l in k))return;k=k[l]}h=h[h.length-1];p=k[h];n=n(p);n!=p&&null!=n&&$jscomp.defineProperty(k,h,{configurable:!0,writable:!0,value:n})};\n$jscomp.polyfillIsolated=function(h,n,k,p){var l=h.split(\".\");h=1===l.length;p=l[0];p=!h&&p in $jscomp.polyfills?$jscomp.polyfills:$jscomp.global;for(var y=0;y<l.length-1;y++){var f=l[y];if(!(f in p))return;p=p[f]}l=l[l.length-1];k=$jscomp.IS_SYMBOL_NATIVE&&\"es6\"===k?p[l]:null;n=n(k);null!=n&&(h?$jscomp.defineProperty($jscomp.polyfills,l,{configurable:!0,writable:!0,value:n}):n!==k&&(void 0===$jscomp.propertyToPolyfillSymbol[l]&&(k=1E9*Math.random()>>>0,$jscomp.propertyToPolyfillSymbol[l]=$jscomp.IS_SYMBOL_NATIVE?\n$jscomp.global.Symbol(l):$jscomp.POLYFILL_PREFIX+k+\"$\"+l),$jscomp.defineProperty(p,$jscomp.propertyToPolyfillSymbol[l],{configurable:!0,writable:!0,value:n})))};\n$jscomp.polyfill(\"Promise\",function(h){function n(){this.batch_=null}function k(f){return f instanceof l?f:new l(function(q,u){q(f)})}if(h&&(!($jscomp.FORCE_POLYFILL_PROMISE||$jscomp.FORCE_POLYFILL_PROMISE_WHEN_NO_UNHANDLED_REJECTION&&\"undefined\"===typeof $jscomp.global.PromiseRejectionEvent)||!$jscomp.global.Promise||-1===$jscomp.global.Promise.toString().indexOf(\"[native code]\")))return h;n.prototype.asyncExecute=function(f){if(null==this.batch_){this.batch_=[];var q=this;this.asyncExecuteFunction(function(){q.executeBatch_()})}this.batch_.push(f)};\nvar p=$jscomp.global.setTimeout;n.prototype.asyncExecuteFunction=function(f){p(f,0)};n.prototype.executeBatch_=function(){for(;this.batch_&&this.batch_.length;){var f=this.batch_;this.batch_=[];for(var q=0;q<f.length;++q){var u=f[q];f[q]=null;try{u()}catch(A){this.asyncThrow_(A)}}}this.batch_=null};n.prototype.asyncThrow_=function(f){this.asyncExecuteFunction(function(){throw f;})};var l=function(f){this.state_=0;this.result_=void 0;this.onSettledCallbacks_=[];this.isRejectionHandled_=!1;var q=this.createResolveAndReject_();\ntry{f(q.resolve,q.reject)}catch(u){q.reject(u)}};l.prototype.createResolveAndReject_=function(){function f(A){return function(F){u||(u=!0,A.call(q,F))}}var q=this,u=!1;return{resolve:f(this.resolveTo_),reject:f(this.reject_)}};l.prototype.resolveTo_=function(f){if(f===this)this.reject_(new TypeError(\"A Promise cannot resolve to itself\"));else if(f instanceof l)this.settleSameAsPromise_(f);else{a:switch(typeof f){case \"object\":var q=null!=f;break a;case \"function\":q=!0;break a;default:q=!1}q?this.resolveToNonPromiseObj_(f):\nthis.fulfill_(f)}};l.prototype.resolveToNonPromiseObj_=function(f){var q=void 0;try{q=f.then}catch(u){this.reject_(u);return}\"function\"==typeof q?this.settleSameAsThenable_(q,f):this.fulfill_(f)};l.prototype.reject_=function(f){this.settle_(2,f)};l.prototype.fulfill_=function(f){this.settle_(1,f)};l.prototype.settle_=function(f,q){if(0!=this.state_)throw Error(\"Cannot settle(\"+f+\", \"+q+\"): Promise already settled in state\"+this.state_);this.state_=f;this.result_=q;2===this.state_&&this.scheduleUnhandledRejectionCheck_();\nthis.executeOnSettledCallbacks_()};l.prototype.scheduleUnhandledRejectionCheck_=function(){var f=this;p(function(){if(f.notifyUnhandledRejection_()){var q=$jscomp.global.console;\"undefined\"!==typeof q&&q.error(f.result_)}},1)};l.prototype.notifyUnhandledRejection_=function(){if(this.isRejectionHandled_)return!1;var f=$jscomp.global.CustomEvent,q=$jscomp.global.Event,u=$jscomp.global.dispatchEvent;if(\"undefined\"===typeof u)return!0;\"function\"===typeof f?f=new f(\"unhandledrejection\",{cancelable:!0}):\n\"function\"===typeof q?f=new q(\"unhandledrejection\",{cancelable:!0}):(f=$jscomp.global.document.createEvent(\"CustomEvent\"),f.initCustomEvent(\"unhandledrejection\",!1,!0,f));f.promise=this;f.reason=this.result_;return u(f)};l.prototype.executeOnSettledCallbacks_=function(){if(null!=this.onSettledCallbacks_){for(var f=0;f<this.onSettledCallbacks_.length;++f)y.asyncExecute(this.onSettledCallbacks_[f]);this.onSettledCallbacks_=null}};var y=new n;l.prototype.settleSameAsPromise_=function(f){var q=this.createResolveAndReject_();\nf.callWhenSettled_(q.resolve,q.reject)};l.prototype.settleSameAsThenable_=function(f,q){var u=this.createResolveAndReject_();try{f.call(q,u.resolve,u.reject)}catch(A){u.reject(A)}};l.prototype.then=function(f,q){function u(w,B){return\"function\"==typeof w?function(R){try{A(w(R))}catch(Z){F(Z)}}:B}var A,F,v=new l(function(w,B){A=w;F=B});this.callWhenSettled_(u(f,A),u(q,F));return v};l.prototype.catch=function(f){return this.then(void 0,f)};l.prototype.callWhenSettled_=function(f,q){function u(){switch(A.state_){case 1:f(A.result_);\nbreak;case 2:q(A.result_);break;default:throw Error(\"Unexpected state: \"+A.state_);}}var A=this;null==this.onSettledCallbacks_?y.asyncExecute(u):this.onSettledCallbacks_.push(u);this.isRejectionHandled_=!0};l.resolve=k;l.reject=function(f){return new l(function(q,u){u(f)})};l.race=function(f){return new l(function(q,u){for(var A=$jscomp.makeIterator(f),F=A.next();!F.done;F=A.next())k(F.value).callWhenSettled_(q,u)})};l.all=function(f){var q=$jscomp.makeIterator(f),u=q.next();return u.done?k([]):new l(function(A,\nF){function v(R){return function(Z){w[R]=Z;B--;0==B&&A(w)}}var w=[],B=0;do w.push(void 0),B++,k(u.value).callWhenSettled_(v(w.length-1),F),u=q.next();while(!u.done)})};return l},\"es6\",\"es3\");$jscomp.owns=function(h,n){return Object.prototype.hasOwnProperty.call(h,n)};$jscomp.assign=$jscomp.TRUST_ES6_POLYFILLS&&\"function\"==typeof Object.assign?Object.assign:function(h,n){for(var k=1;k<arguments.length;k++){var p=arguments[k];if(p)for(var l in p)$jscomp.owns(p,l)&&(h[l]=p[l])}return h};\n$jscomp.polyfill(\"Object.assign\",function(h){return h||$jscomp.assign},\"es6\",\"es3\");$jscomp.checkStringArgs=function(h,n,k){if(null==h)throw new TypeError(\"The 'this' value for String.prototype.\"+k+\" must not be null or undefined\");if(n instanceof RegExp)throw new TypeError(\"First argument to String.prototype.\"+k+\" must not be a regular expression\");return h+\"\"};\n$jscomp.polyfill(\"String.prototype.startsWith\",function(h){return h?h:function(n,k){var p=$jscomp.checkStringArgs(this,n,\"startsWith\");n+=\"\";var l=p.length,y=n.length;k=Math.max(0,Math.min(k|0,p.length));for(var f=0;f<y&&k<l;)if(p[k++]!=n[f++])return!1;return f>=y}},\"es6\",\"es3\");\n$jscomp.polyfill(\"Array.prototype.copyWithin\",function(h){function n(k){k=Number(k);return Infinity===k||-Infinity===k?k:k|0}return h?h:function(k,p,l){var y=this.length;k=n(k);p=n(p);l=void 0===l?y:n(l);k=0>k?Math.max(y+k,0):Math.min(k,y);p=0>p?Math.max(y+p,0):Math.min(p,y);l=0>l?Math.max(y+l,0):Math.min(l,y);if(k<p)for(;p<l;)p in this?this[k++]=this[p++]:(delete this[k++],p++);else for(l=Math.min(l,y+p-k),k+=l-p;l>p;)--l in this?this[--k]=this[l]:delete this[--k];return this}},\"es6\",\"es3\");\n$jscomp.typedArrayCopyWithin=function(h){return h?h:Array.prototype.copyWithin};$jscomp.polyfill(\"Int8Array.prototype.copyWithin\",$jscomp.typedArrayCopyWithin,\"es6\",\"es5\");$jscomp.polyfill(\"Uint8Array.prototype.copyWithin\",$jscomp.typedArrayCopyWithin,\"es6\",\"es5\");$jscomp.polyfill(\"Uint8ClampedArray.prototype.copyWithin\",$jscomp.typedArrayCopyWithin,\"es6\",\"es5\");$jscomp.polyfill(\"Int16Array.prototype.copyWithin\",$jscomp.typedArrayCopyWithin,\"es6\",\"es5\");\n$jscomp.polyfill(\"Uint16Array.prototype.copyWithin\",$jscomp.typedArrayCopyWithin,\"es6\",\"es5\");$jscomp.polyfill(\"Int32Array.prototype.copyWithin\",$jscomp.typedArrayCopyWithin,\"es6\",\"es5\");$jscomp.polyfill(\"Uint32Array.prototype.copyWithin\",$jscomp.typedArrayCopyWithin,\"es6\",\"es5\");$jscomp.polyfill(\"Float32Array.prototype.copyWithin\",$jscomp.typedArrayCopyWithin,\"es6\",\"es5\");$jscomp.polyfill(\"Float64Array.prototype.copyWithin\",$jscomp.typedArrayCopyWithin,\"es6\",\"es5\");\nvar DracoDecoderModule=function(){var h=\"undefined\"!==typeof document&&document.currentScript?document.currentScript.src:void 0;\"undefined\"!==typeof __filename&&(h=h||__filename);return function(n){function k(e){return a.locateFile?a.locateFile(e,U):U+e}function p(e,b){if(e){var c=ia;var d=e+b;for(b=e;c[b]&&!(b>=d);)++b;if(16<b-e&&c.buffer&&ra)c=ra.decode(c.subarray(e,b));else{for(d=\"\";e<b;){var g=c[e++];if(g&128){var t=c[e++]&63;if(192==(g&224))d+=String.fromCharCode((g&31)<<6|t);else{var aa=c[e++]&\n63;g=224==(g&240)?(g&15)<<12|t<<6|aa:(g&7)<<18|t<<12|aa<<6|c[e++]&63;65536>g?d+=String.fromCharCode(g):(g-=65536,d+=String.fromCharCode(55296|g>>10,56320|g&1023))}}else d+=String.fromCharCode(g)}c=d}}else c=\"\";return c}function l(){var e=ja.buffer;a.HEAP8=W=new Int8Array(e);a.HEAP16=new Int16Array(e);a.HEAP32=ca=new Int32Array(e);a.HEAPU8=ia=new Uint8Array(e);a.HEAPU16=new Uint16Array(e);a.HEAPU32=Y=new Uint32Array(e);a.HEAPF32=new Float32Array(e);a.HEAPF64=new Float64Array(e)}function y(e){if(a.onAbort)a.onAbort(e);\ne=\"Aborted(\"+e+\")\";da(e);sa=!0;e=new WebAssembly.RuntimeError(e+\". Build with -sASSERTIONS for more info.\");ka(e);throw e;}function f(e){try{if(e==P&&ea)return new Uint8Array(ea);if(ma)return ma(e);throw\"both async and sync fetching of the wasm failed\";}catch(b){y(b)}}function q(){if(!ea&&(ta||fa)){if(\"function\"==typeof fetch&&!P.startsWith(\"file://\"))return fetch(P,{credentials:\"same-origin\"}).then(function(e){if(!e.ok)throw\"failed to load wasm binary file at '\"+P+\"'\";return e.arrayBuffer()}).catch(function(){return f(P)});\nif(na)return new Promise(function(e,b){na(P,function(c){e(new Uint8Array(c))},b)})}return Promise.resolve().then(function(){return f(P)})}function u(e){for(;0<e.length;)e.shift()(a)}function A(e){this.excPtr=e;this.ptr=e-24;this.set_type=function(b){Y[this.ptr+4>>2]=b};this.get_type=function(){return Y[this.ptr+4>>2]};this.set_destructor=function(b){Y[this.ptr+8>>2]=b};this.get_destructor=function(){return Y[this.ptr+8>>2]};this.set_refcount=function(b){ca[this.ptr>>2]=b};this.set_caught=function(b){W[this.ptr+\n12>>0]=b?1:0};this.get_caught=function(){return 0!=W[this.ptr+12>>0]};this.set_rethrown=function(b){W[this.ptr+13>>0]=b?1:0};this.get_rethrown=function(){return 0!=W[this.ptr+13>>0]};this.init=function(b,c){this.set_adjusted_ptr(0);this.set_type(b);this.set_destructor(c);this.set_refcount(0);this.set_caught(!1);this.set_rethrown(!1)};this.add_ref=function(){ca[this.ptr>>2]+=1};this.release_ref=function(){var b=ca[this.ptr>>2];ca[this.ptr>>2]=b-1;return 1===b};this.set_adjusted_ptr=function(b){Y[this.ptr+\n16>>2]=b};this.get_adjusted_ptr=function(){return Y[this.ptr+16>>2]};this.get_exception_ptr=function(){if(ua(this.get_type()))return Y[this.excPtr>>2];var b=this.get_adjusted_ptr();return 0!==b?b:this.excPtr}}function F(){function e(){if(!la&&(la=!0,a.calledRun=!0,!sa)){va=!0;u(oa);wa(a);if(a.onRuntimeInitialized)a.onRuntimeInitialized();if(a.postRun)for(\"function\"==typeof a.postRun&&(a.postRun=[a.postRun]);a.postRun.length;)xa.unshift(a.postRun.shift());u(xa)}}if(!(0<ba)){if(a.preRun)for(\"function\"==\ntypeof a.preRun&&(a.preRun=[a.preRun]);a.preRun.length;)ya.unshift(a.preRun.shift());u(ya);0<ba||(a.setStatus?(a.setStatus(\"Running...\"),setTimeout(function(){setTimeout(function(){a.setStatus(\"\")},1);e()},1)):e())}}function v(){}function w(e){return(e||v).__cache__}function B(e,b){var c=w(b),d=c[e];if(d)return d;d=Object.create((b||v).prototype);d.ptr=e;return c[e]=d}function R(e){if(\"string\"===typeof e){for(var b=0,c=0;c<e.length;++c){var d=e.charCodeAt(c);127>=d?b++:2047>=d?b+=2:55296<=d&&57343>=\nd?(b+=4,++c):b+=3}b=Array(b+1);c=0;d=b.length;if(0<d){d=c+d-1;for(var g=0;g<e.length;++g){var t=e.charCodeAt(g);if(55296<=t&&57343>=t){var aa=e.charCodeAt(++g);t=65536+((t&1023)<<10)|aa&1023}if(127>=t){if(c>=d)break;b[c++]=t}else{if(2047>=t){if(c+1>=d)break;b[c++]=192|t>>6}else{if(65535>=t){if(c+2>=d)break;b[c++]=224|t>>12}else{if(c+3>=d)break;b[c++]=240|t>>18;b[c++]=128|t>>12&63}b[c++]=128|t>>6&63}b[c++]=128|t&63}}b[c]=0}e=r.alloc(b,W);r.copy(b,W,e);return e}return e}function Z(e){if(\"object\"===\ntypeof e){var b=r.alloc(e,W);r.copy(e,W,b);return b}return e}function X(){throw\"cannot construct a VoidPtr, no constructor in IDL\";}function S(){this.ptr=za();w(S)[this.ptr]=this}function Q(){this.ptr=Aa();w(Q)[this.ptr]=this}function V(){this.ptr=Ba();w(V)[this.ptr]=this}function x(){this.ptr=Ca();w(x)[this.ptr]=this}function D(){this.ptr=Da();w(D)[this.ptr]=this}function G(){this.ptr=Ea();w(G)[this.ptr]=this}function H(){this.ptr=Fa();w(H)[this.ptr]=this}function E(){this.ptr=Ga();w(E)[this.ptr]=\nthis}function T(){this.ptr=Ha();w(T)[this.ptr]=this}function C(){throw\"cannot construct a Status, no constructor in IDL\";}function I(){this.ptr=Ia();w(I)[this.ptr]=this}function J(){this.ptr=Ja();w(J)[this.ptr]=this}function K(){this.ptr=Ka();w(K)[this.ptr]=this}function L(){this.ptr=La();w(L)[this.ptr]=this}function M(){this.ptr=Ma();w(M)[this.ptr]=this}function N(){this.ptr=Na();w(N)[this.ptr]=this}function O(){this.ptr=Oa();w(O)[this.ptr]=this}function z(){this.ptr=Pa();w(z)[this.ptr]=this}function m(){this.ptr=\nQa();w(m)[this.ptr]=this}n=void 0===n?{}:n;var a=\"undefined\"!=typeof n?n:{},wa,ka;a.ready=new Promise(function(e,b){wa=e;ka=b});var Ra=!1,Sa=!1;a.onRuntimeInitialized=function(){Ra=!0;if(Sa&&\"function\"===typeof a.onModuleLoaded)a.onModuleLoaded(a)};a.onModuleParsed=function(){Sa=!0;if(Ra&&\"function\"===typeof a.onModuleLoaded)a.onModuleLoaded(a)};a.isVersionSupported=function(e){if(\"string\"!==typeof e)return!1;e=e.split(\".\");return 2>e.length||3<e.length?!1:1==e[0]&&0<=e[1]&&5>=e[1]?!0:0!=e[0]||10<\ne[1]?!1:!0};var Ta=Object.assign({},a),ta=\"object\"==typeof window,fa=\"function\"==typeof importScripts,Ua=\"object\"==typeof process&&\"object\"==typeof process.versions&&\"string\"==typeof process.versions.node,U=\"\";if(Ua){var Va=require(\"fs\"),pa=require(\"path\");U=fa?pa.dirname(U)+\"/\":__dirname+\"/\";var Wa=function(e,b){e=e.startsWith(\"file://\")?new URL(e):pa.normalize(e);return Va.readFileSync(e,b?void 0:\"utf8\")};var ma=function(e){e=Wa(e,!0);e.buffer||(e=new Uint8Array(e));return e};var na=function(e,\nb,c){e=e.startsWith(\"file://\")?new URL(e):pa.normalize(e);Va.readFile(e,function(d,g){d?c(d):b(g.buffer)})};1<process.argv.length&&process.argv[1].replace(/\\\\/g,\"/\");process.argv.slice(2);a.inspect=function(){return\"[Emscripten Module object]\"}}else if(ta||fa)fa?U=self.location.href:\"undefined\"!=typeof document&&document.currentScript&&(U=document.currentScript.src),h&&(U=h),U=0!==U.indexOf(\"blob:\")?U.substr(0,U.replace(/[?#].*/,\"\").lastIndexOf(\"/\")+1):\"\",Wa=function(e){var b=new XMLHttpRequest;b.open(\"GET\",\ne,!1);b.send(null);return b.responseText},fa&&(ma=function(e){var b=new XMLHttpRequest;b.open(\"GET\",e,!1);b.responseType=\"arraybuffer\";b.send(null);return new Uint8Array(b.response)}),na=function(e,b,c){var d=new XMLHttpRequest;d.open(\"GET\",e,!0);d.responseType=\"arraybuffer\";d.onload=function(){200==d.status||0==d.status&&d.response?b(d.response):c()};d.onerror=c;d.send(null)};a.print||console.log.bind(console);var da=a.printErr||console.warn.bind(console);Object.assign(a,Ta);Ta=null;var ea;a.wasmBinary&&\n(ea=a.wasmBinary);\"object\"!=typeof WebAssembly&&y(\"no native wasm support detected\");var ja,sa=!1,ra=\"undefined\"!=typeof TextDecoder?new TextDecoder(\"utf8\"):void 0,W,ia,ca,Y,ya=[],oa=[],xa=[],va=!1,ba=0,qa=null,ha=null;var P=\"draco_decoder_gltf.wasm\";P.startsWith(\"data:application/octet-stream;base64,\")||(P=k(P));var pd=0,qd={b:function(e,b,c){(new A(e)).init(b,c);pd++;throw e;},a:function(){y(\"\")},d:function(e,b,c){ia.copyWithin(e,b,b+c)},c:function(e){var b=ia.length;e>>>=0;if(2147483648<e)return!1;\nfor(var c=1;4>=c;c*=2){var d=b*(1+.2/c);d=Math.min(d,e+100663296);var g=Math;d=Math.max(e,d);g=g.min.call(g,2147483648,d+(65536-d%65536)%65536);a:{d=ja.buffer;try{ja.grow(g-d.byteLength+65535>>>16);l();var t=1;break a}catch(aa){}t=void 0}if(t)return!0}return!1}};(function(){function e(g,t){a.asm=g.exports;ja=a.asm.e;l();oa.unshift(a.asm.f);ba--;a.monitorRunDependencies&&a.monitorRunDependencies(ba);0==ba&&(null!==qa&&(clearInterval(qa),qa=null),ha&&(g=ha,ha=null,g()))}function b(g){e(g.instance)}\nfunction c(g){return q().then(function(t){return WebAssembly.instantiate(t,d)}).then(function(t){return t}).then(g,function(t){da(\"failed to asynchronously prepare wasm: \"+t);y(t)})}var d={a:qd};ba++;a.monitorRunDependencies&&a.monitorRunDependencies(ba);if(a.instantiateWasm)try{return a.instantiateWasm(d,e)}catch(g){da(\"Module.instantiateWasm callback failed with error: \"+g),ka(g)}(function(){return ea||\"function\"!=typeof WebAssembly.instantiateStreaming||P.startsWith(\"data:application/octet-stream;base64,\")||\nP.startsWith(\"file://\")||Ua||\"function\"!=typeof fetch?c(b):fetch(P,{credentials:\"same-origin\"}).then(function(g){return WebAssembly.instantiateStreaming(g,d).then(b,function(t){da(\"wasm streaming compile failed: \"+t);da(\"falling back to ArrayBuffer instantiation\");return c(b)})})})().catch(ka);return{}})();var Xa=a._emscripten_bind_VoidPtr___destroy___0=function(){return(Xa=a._emscripten_bind_VoidPtr___destroy___0=a.asm.h).apply(null,arguments)},za=a._emscripten_bind_DecoderBuffer_DecoderBuffer_0=\nfunction(){return(za=a._emscripten_bind_DecoderBuffer_DecoderBuffer_0=a.asm.i).apply(null,arguments)},Ya=a._emscripten_bind_DecoderBuffer_Init_2=function(){return(Ya=a._emscripten_bind_DecoderBuffer_Init_2=a.asm.j).apply(null,arguments)},Za=a._emscripten_bind_DecoderBuffer___destroy___0=function(){return(Za=a._emscripten_bind_DecoderBuffer___destroy___0=a.asm.k).apply(null,arguments)},Aa=a._emscripten_bind_AttributeTransformData_AttributeTransformData_0=function(){return(Aa=a._emscripten_bind_AttributeTransformData_AttributeTransformData_0=\na.asm.l).apply(null,arguments)},$a=a._emscripten_bind_AttributeTransformData_transform_type_0=function(){return($a=a._emscripten_bind_AttributeTransformData_transform_type_0=a.asm.m).apply(null,arguments)},ab=a._emscripten_bind_AttributeTransformData___destroy___0=function(){return(ab=a._emscripten_bind_AttributeTransformData___destroy___0=a.asm.n).apply(null,arguments)},Ba=a._emscripten_bind_GeometryAttribute_GeometryAttribute_0=function(){return(Ba=a._emscripten_bind_GeometryAttribute_GeometryAttribute_0=\na.asm.o).apply(null,arguments)},bb=a._emscripten_bind_GeometryAttribute___destroy___0=function(){return(bb=a._emscripten_bind_GeometryAttribute___destroy___0=a.asm.p).apply(null,arguments)},Ca=a._emscripten_bind_PointAttribute_PointAttribute_0=function(){return(Ca=a._emscripten_bind_PointAttribute_PointAttribute_0=a.asm.q).apply(null,arguments)},cb=a._emscripten_bind_PointAttribute_size_0=function(){return(cb=a._emscripten_bind_PointAttribute_size_0=a.asm.r).apply(null,arguments)},db=a._emscripten_bind_PointAttribute_GetAttributeTransformData_0=\nfunction(){return(db=a._emscripten_bind_PointAttribute_GetAttributeTransformData_0=a.asm.s).apply(null,arguments)},eb=a._emscripten_bind_PointAttribute_attribute_type_0=function(){return(eb=a._emscripten_bind_PointAttribute_attribute_type_0=a.asm.t).apply(null,arguments)},fb=a._emscripten_bind_PointAttribute_data_type_0=function(){return(fb=a._emscripten_bind_PointAttribute_data_type_0=a.asm.u).apply(null,arguments)},gb=a._emscripten_bind_PointAttribute_num_components_0=function(){return(gb=a._emscripten_bind_PointAttribute_num_components_0=\na.asm.v).apply(null,arguments)},hb=a._emscripten_bind_PointAttribute_normalized_0=function(){return(hb=a._emscripten_bind_PointAttribute_normalized_0=a.asm.w).apply(null,arguments)},ib=a._emscripten_bind_PointAttribute_byte_stride_0=function(){return(ib=a._emscripten_bind_PointAttribute_byte_stride_0=a.asm.x).apply(null,arguments)},jb=a._emscripten_bind_PointAttribute_byte_offset_0=function(){return(jb=a._emscripten_bind_PointAttribute_byte_offset_0=a.asm.y).apply(null,arguments)},kb=a._emscripten_bind_PointAttribute_unique_id_0=\nfunction(){return(kb=a._emscripten_bind_PointAttribute_unique_id_0=a.asm.z).apply(null,arguments)},lb=a._emscripten_bind_PointAttribute___destroy___0=function(){return(lb=a._emscripten_bind_PointAttribute___destroy___0=a.asm.A).apply(null,arguments)},Da=a._emscripten_bind_AttributeQuantizationTransform_AttributeQuantizationTransform_0=function(){return(Da=a._emscripten_bind_AttributeQuantizationTransform_AttributeQuantizationTransform_0=a.asm.B).apply(null,arguments)},mb=a._emscripten_bind_AttributeQuantizationTransform_InitFromAttribute_1=\nfunction(){return(mb=a._emscripten_bind_AttributeQuantizationTransform_InitFromAttribute_1=a.asm.C).apply(null,arguments)},nb=a._emscripten_bind_AttributeQuantizationTransform_quantization_bits_0=function(){return(nb=a._emscripten_bind_AttributeQuantizationTransform_quantization_bits_0=a.asm.D).apply(null,arguments)},ob=a._emscripten_bind_AttributeQuantizationTransform_min_value_1=function(){return(ob=a._emscripten_bind_AttributeQuantizationTransform_min_value_1=a.asm.E).apply(null,arguments)},pb=\na._emscripten_bind_AttributeQuantizationTransform_range_0=function(){return(pb=a._emscripten_bind_AttributeQuantizationTransform_range_0=a.asm.F).apply(null,arguments)},qb=a._emscripten_bind_AttributeQuantizationTransform___destroy___0=function(){return(qb=a._emscripten_bind_AttributeQuantizationTransform___destroy___0=a.asm.G).apply(null,arguments)},Ea=a._emscripten_bind_AttributeOctahedronTransform_AttributeOctahedronTransform_0=function(){return(Ea=a._emscripten_bind_AttributeOctahedronTransform_AttributeOctahedronTransform_0=\na.asm.H).apply(null,arguments)},rb=a._emscripten_bind_AttributeOctahedronTransform_InitFromAttribute_1=function(){return(rb=a._emscripten_bind_AttributeOctahedronTransform_InitFromAttribute_1=a.asm.I).apply(null,arguments)},sb=a._emscripten_bind_AttributeOctahedronTransform_quantization_bits_0=function(){return(sb=a._emscripten_bind_AttributeOctahedronTransform_quantization_bits_0=a.asm.J).apply(null,arguments)},tb=a._emscripten_bind_AttributeOctahedronTransform___destroy___0=function(){return(tb=\na._emscripten_bind_AttributeOctahedronTransform___destroy___0=a.asm.K).apply(null,arguments)},Fa=a._emscripten_bind_PointCloud_PointCloud_0=function(){return(Fa=a._emscripten_bind_PointCloud_PointCloud_0=a.asm.L).apply(null,arguments)},ub=a._emscripten_bind_PointCloud_num_attributes_0=function(){return(ub=a._emscripten_bind_PointCloud_num_attributes_0=a.asm.M).apply(null,arguments)},vb=a._emscripten_bind_PointCloud_num_points_0=function(){return(vb=a._emscripten_bind_PointCloud_num_points_0=a.asm.N).apply(null,\narguments)},wb=a._emscripten_bind_PointCloud___destroy___0=function(){return(wb=a._emscripten_bind_PointCloud___destroy___0=a.asm.O).apply(null,arguments)},Ga=a._emscripten_bind_Mesh_Mesh_0=function(){return(Ga=a._emscripten_bind_Mesh_Mesh_0=a.asm.P).apply(null,arguments)},xb=a._emscripten_bind_Mesh_num_faces_0=function(){return(xb=a._emscripten_bind_Mesh_num_faces_0=a.asm.Q).apply(null,arguments)},yb=a._emscripten_bind_Mesh_num_attributes_0=function(){return(yb=a._emscripten_bind_Mesh_num_attributes_0=\na.asm.R).apply(null,arguments)},zb=a._emscripten_bind_Mesh_num_points_0=function(){return(zb=a._emscripten_bind_Mesh_num_points_0=a.asm.S).apply(null,arguments)},Ab=a._emscripten_bind_Mesh___destroy___0=function(){return(Ab=a._emscripten_bind_Mesh___destroy___0=a.asm.T).apply(null,arguments)},Ha=a._emscripten_bind_Metadata_Metadata_0=function(){return(Ha=a._emscripten_bind_Metadata_Metadata_0=a.asm.U).apply(null,arguments)},Bb=a._emscripten_bind_Metadata___destroy___0=function(){return(Bb=a._emscripten_bind_Metadata___destroy___0=\na.asm.V).apply(null,arguments)},Cb=a._emscripten_bind_Status_code_0=function(){return(Cb=a._emscripten_bind_Status_code_0=a.asm.W).apply(null,arguments)},Db=a._emscripten_bind_Status_ok_0=function(){return(Db=a._emscripten_bind_Status_ok_0=a.asm.X).apply(null,arguments)},Eb=a._emscripten_bind_Status_error_msg_0=function(){return(Eb=a._emscripten_bind_Status_error_msg_0=a.asm.Y).apply(null,arguments)},Fb=a._emscripten_bind_Status___destroy___0=function(){return(Fb=a._emscripten_bind_Status___destroy___0=\na.asm.Z).apply(null,arguments)},Ia=a._emscripten_bind_DracoFloat32Array_DracoFloat32Array_0=function(){return(Ia=a._emscripten_bind_DracoFloat32Array_DracoFloat32Array_0=a.asm._).apply(null,arguments)},Gb=a._emscripten_bind_DracoFloat32Array_GetValue_1=function(){return(Gb=a._emscripten_bind_DracoFloat32Array_GetValue_1=a.asm.$).apply(null,arguments)},Hb=a._emscripten_bind_DracoFloat32Array_size_0=function(){return(Hb=a._emscripten_bind_DracoFloat32Array_size_0=a.asm.aa).apply(null,arguments)},Ib=\na._emscripten_bind_DracoFloat32Array___destroy___0=function(){return(Ib=a._emscripten_bind_DracoFloat32Array___destroy___0=a.asm.ba).apply(null,arguments)},Ja=a._emscripten_bind_DracoInt8Array_DracoInt8Array_0=function(){return(Ja=a._emscripten_bind_DracoInt8Array_DracoInt8Array_0=a.asm.ca).apply(null,arguments)},Jb=a._emscripten_bind_DracoInt8Array_GetValue_1=function(){return(Jb=a._emscripten_bind_DracoInt8Array_GetValue_1=a.asm.da).apply(null,arguments)},Kb=a._emscripten_bind_DracoInt8Array_size_0=\nfunction(){return(Kb=a._emscripten_bind_DracoInt8Array_size_0=a.asm.ea).apply(null,arguments)},Lb=a._emscripten_bind_DracoInt8Array___destroy___0=function(){return(Lb=a._emscripten_bind_DracoInt8Array___destroy___0=a.asm.fa).apply(null,arguments)},Ka=a._emscripten_bind_DracoUInt8Array_DracoUInt8Array_0=function(){return(Ka=a._emscripten_bind_DracoUInt8Array_DracoUInt8Array_0=a.asm.ga).apply(null,arguments)},Mb=a._emscripten_bind_DracoUInt8Array_GetValue_1=function(){return(Mb=a._emscripten_bind_DracoUInt8Array_GetValue_1=\na.asm.ha).apply(null,arguments)},Nb=a._emscripten_bind_DracoUInt8Array_size_0=function(){return(Nb=a._emscripten_bind_DracoUInt8Array_size_0=a.asm.ia).apply(null,arguments)},Ob=a._emscripten_bind_DracoUInt8Array___destroy___0=function(){return(Ob=a._emscripten_bind_DracoUInt8Array___destroy___0=a.asm.ja).apply(null,arguments)},La=a._emscripten_bind_DracoInt16Array_DracoInt16Array_0=function(){return(La=a._emscripten_bind_DracoInt16Array_DracoInt16Array_0=a.asm.ka).apply(null,arguments)},Pb=a._emscripten_bind_DracoInt16Array_GetValue_1=\nfunction(){return(Pb=a._emscripten_bind_DracoInt16Array_GetValue_1=a.asm.la).apply(null,arguments)},Qb=a._emscripten_bind_DracoInt16Array_size_0=function(){return(Qb=a._emscripten_bind_DracoInt16Array_size_0=a.asm.ma).apply(null,arguments)},Rb=a._emscripten_bind_DracoInt16Array___destroy___0=function(){return(Rb=a._emscripten_bind_DracoInt16Array___destroy___0=a.asm.na).apply(null,arguments)},Ma=a._emscripten_bind_DracoUInt16Array_DracoUInt16Array_0=function(){return(Ma=a._emscripten_bind_DracoUInt16Array_DracoUInt16Array_0=\na.asm.oa).apply(null,arguments)},Sb=a._emscripten_bind_DracoUInt16Array_GetValue_1=function(){return(Sb=a._emscripten_bind_DracoUInt16Array_GetValue_1=a.asm.pa).apply(null,arguments)},Tb=a._emscripten_bind_DracoUInt16Array_size_0=function(){return(Tb=a._emscripten_bind_DracoUInt16Array_size_0=a.asm.qa).apply(null,arguments)},Ub=a._emscripten_bind_DracoUInt16Array___destroy___0=function(){return(Ub=a._emscripten_bind_DracoUInt16Array___destroy___0=a.asm.ra).apply(null,arguments)},Na=a._emscripten_bind_DracoInt32Array_DracoInt32Array_0=\nfunction(){return(Na=a._emscripten_bind_DracoInt32Array_DracoInt32Array_0=a.asm.sa).apply(null,arguments)},Vb=a._emscripten_bind_DracoInt32Array_GetValue_1=function(){return(Vb=a._emscripten_bind_DracoInt32Array_GetValue_1=a.asm.ta).apply(null,arguments)},Wb=a._emscripten_bind_DracoInt32Array_size_0=function(){return(Wb=a._emscripten_bind_DracoInt32Array_size_0=a.asm.ua).apply(null,arguments)},Xb=a._emscripten_bind_DracoInt32Array___destroy___0=function(){return(Xb=a._emscripten_bind_DracoInt32Array___destroy___0=\na.asm.va).apply(null,arguments)},Oa=a._emscripten_bind_DracoUInt32Array_DracoUInt32Array_0=function(){return(Oa=a._emscripten_bind_DracoUInt32Array_DracoUInt32Array_0=a.asm.wa).apply(null,arguments)},Yb=a._emscripten_bind_DracoUInt32Array_GetValue_1=function(){return(Yb=a._emscripten_bind_DracoUInt32Array_GetValue_1=a.asm.xa).apply(null,arguments)},Zb=a._emscripten_bind_DracoUInt32Array_size_0=function(){return(Zb=a._emscripten_bind_DracoUInt32Array_size_0=a.asm.ya).apply(null,arguments)},$b=a._emscripten_bind_DracoUInt32Array___destroy___0=\nfunction(){return($b=a._emscripten_bind_DracoUInt32Array___destroy___0=a.asm.za).apply(null,arguments)},Pa=a._emscripten_bind_MetadataQuerier_MetadataQuerier_0=function(){return(Pa=a._emscripten_bind_MetadataQuerier_MetadataQuerier_0=a.asm.Aa).apply(null,arguments)},ac=a._emscripten_bind_MetadataQuerier_HasEntry_2=function(){return(ac=a._emscripten_bind_MetadataQuerier_HasEntry_2=a.asm.Ba).apply(null,arguments)},bc=a._emscripten_bind_MetadataQuerier_GetIntEntry_2=function(){return(bc=a._emscripten_bind_MetadataQuerier_GetIntEntry_2=\na.asm.Ca).apply(null,arguments)},cc=a._emscripten_bind_MetadataQuerier_GetIntEntryArray_3=function(){return(cc=a._emscripten_bind_MetadataQuerier_GetIntEntryArray_3=a.asm.Da).apply(null,arguments)},dc=a._emscripten_bind_MetadataQuerier_GetDoubleEntry_2=function(){return(dc=a._emscripten_bind_MetadataQuerier_GetDoubleEntry_2=a.asm.Ea).apply(null,arguments)},ec=a._emscripten_bind_MetadataQuerier_GetStringEntry_2=function(){return(ec=a._emscripten_bind_MetadataQuerier_GetStringEntry_2=a.asm.Fa).apply(null,\narguments)},fc=a._emscripten_bind_MetadataQuerier_NumEntries_1=function(){return(fc=a._emscripten_bind_MetadataQuerier_NumEntries_1=a.asm.Ga).apply(null,arguments)},gc=a._emscripten_bind_MetadataQuerier_GetEntryName_2=function(){return(gc=a._emscripten_bind_MetadataQuerier_GetEntryName_2=a.asm.Ha).apply(null,arguments)},hc=a._emscripten_bind_MetadataQuerier___destroy___0=function(){return(hc=a._emscripten_bind_MetadataQuerier___destroy___0=a.asm.Ia).apply(null,arguments)},Qa=a._emscripten_bind_Decoder_Decoder_0=\nfunction(){return(Qa=a._emscripten_bind_Decoder_Decoder_0=a.asm.Ja).apply(null,arguments)},ic=a._emscripten_bind_Decoder_DecodeArrayToPointCloud_3=function(){return(ic=a._emscripten_bind_Decoder_DecodeArrayToPointCloud_3=a.asm.Ka).apply(null,arguments)},jc=a._emscripten_bind_Decoder_DecodeArrayToMesh_3=function(){return(jc=a._emscripten_bind_Decoder_DecodeArrayToMesh_3=a.asm.La).apply(null,arguments)},kc=a._emscripten_bind_Decoder_GetAttributeId_2=function(){return(kc=a._emscripten_bind_Decoder_GetAttributeId_2=\na.asm.Ma).apply(null,arguments)},lc=a._emscripten_bind_Decoder_GetAttributeIdByName_2=function(){return(lc=a._emscripten_bind_Decoder_GetAttributeIdByName_2=a.asm.Na).apply(null,arguments)},mc=a._emscripten_bind_Decoder_GetAttributeIdByMetadataEntry_3=function(){return(mc=a._emscripten_bind_Decoder_GetAttributeIdByMetadataEntry_3=a.asm.Oa).apply(null,arguments)},nc=a._emscripten_bind_Decoder_GetAttribute_2=function(){return(nc=a._emscripten_bind_Decoder_GetAttribute_2=a.asm.Pa).apply(null,arguments)},\noc=a._emscripten_bind_Decoder_GetAttributeByUniqueId_2=function(){return(oc=a._emscripten_bind_Decoder_GetAttributeByUniqueId_2=a.asm.Qa).apply(null,arguments)},pc=a._emscripten_bind_Decoder_GetMetadata_1=function(){return(pc=a._emscripten_bind_Decoder_GetMetadata_1=a.asm.Ra).apply(null,arguments)},qc=a._emscripten_bind_Decoder_GetAttributeMetadata_2=function(){return(qc=a._emscripten_bind_Decoder_GetAttributeMetadata_2=a.asm.Sa).apply(null,arguments)},rc=a._emscripten_bind_Decoder_GetFaceFromMesh_3=\nfunction(){return(rc=a._emscripten_bind_Decoder_GetFaceFromMesh_3=a.asm.Ta).apply(null,arguments)},sc=a._emscripten_bind_Decoder_GetTriangleStripsFromMesh_2=function(){return(sc=a._emscripten_bind_Decoder_GetTriangleStripsFromMesh_2=a.asm.Ua).apply(null,arguments)},tc=a._emscripten_bind_Decoder_GetTrianglesUInt16Array_3=function(){return(tc=a._emscripten_bind_Decoder_GetTrianglesUInt16Array_3=a.asm.Va).apply(null,arguments)},uc=a._emscripten_bind_Decoder_GetTrianglesUInt32Array_3=function(){return(uc=\na._emscripten_bind_Decoder_GetTrianglesUInt32Array_3=a.asm.Wa).apply(null,arguments)},vc=a._emscripten_bind_Decoder_GetAttributeFloat_3=function(){return(vc=a._emscripten_bind_Decoder_GetAttributeFloat_3=a.asm.Xa).apply(null,arguments)},wc=a._emscripten_bind_Decoder_GetAttributeFloatForAllPoints_3=function(){return(wc=a._emscripten_bind_Decoder_GetAttributeFloatForAllPoints_3=a.asm.Ya).apply(null,arguments)},xc=a._emscripten_bind_Decoder_GetAttributeIntForAllPoints_3=function(){return(xc=a._emscripten_bind_Decoder_GetAttributeIntForAllPoints_3=\na.asm.Za).apply(null,arguments)},yc=a._emscripten_bind_Decoder_GetAttributeInt8ForAllPoints_3=function(){return(yc=a._emscripten_bind_Decoder_GetAttributeInt8ForAllPoints_3=a.asm._a).apply(null,arguments)},zc=a._emscripten_bind_Decoder_GetAttributeUInt8ForAllPoints_3=function(){return(zc=a._emscripten_bind_Decoder_GetAttributeUInt8ForAllPoints_3=a.asm.$a).apply(null,arguments)},Ac=a._emscripten_bind_Decoder_GetAttributeInt16ForAllPoints_3=function(){return(Ac=a._emscripten_bind_Decoder_GetAttributeInt16ForAllPoints_3=\na.asm.ab).apply(null,arguments)},Bc=a._emscripten_bind_Decoder_GetAttributeUInt16ForAllPoints_3=function(){return(Bc=a._emscripten_bind_Decoder_GetAttributeUInt16ForAllPoints_3=a.asm.bb).apply(null,arguments)},Cc=a._emscripten_bind_Decoder_GetAttributeInt32ForAllPoints_3=function(){return(Cc=a._emscripten_bind_Decoder_GetAttributeInt32ForAllPoints_3=a.asm.cb).apply(null,arguments)},Dc=a._emscripten_bind_Decoder_GetAttributeUInt32ForAllPoints_3=function(){return(Dc=a._emscripten_bind_Decoder_GetAttributeUInt32ForAllPoints_3=\na.asm.db).apply(null,arguments)},Ec=a._emscripten_bind_Decoder_GetAttributeDataArrayForAllPoints_5=function(){return(Ec=a._emscripten_bind_Decoder_GetAttributeDataArrayForAllPoints_5=a.asm.eb).apply(null,arguments)},Fc=a._emscripten_bind_Decoder_SkipAttributeTransform_1=function(){return(Fc=a._emscripten_bind_Decoder_SkipAttributeTransform_1=a.asm.fb).apply(null,arguments)},Gc=a._emscripten_bind_Decoder_GetEncodedGeometryType_Deprecated_1=function(){return(Gc=a._emscripten_bind_Decoder_GetEncodedGeometryType_Deprecated_1=\na.asm.gb).apply(null,arguments)},Hc=a._emscripten_bind_Decoder_DecodeBufferToPointCloud_2=function(){return(Hc=a._emscripten_bind_Decoder_DecodeBufferToPointCloud_2=a.asm.hb).apply(null,arguments)},Ic=a._emscripten_bind_Decoder_DecodeBufferToMesh_2=function(){return(Ic=a._emscripten_bind_Decoder_DecodeBufferToMesh_2=a.asm.ib).apply(null,arguments)},Jc=a._emscripten_bind_Decoder___destroy___0=function(){return(Jc=a._emscripten_bind_Decoder___destroy___0=a.asm.jb).apply(null,arguments)},Kc=a._emscripten_enum_draco_AttributeTransformType_ATTRIBUTE_INVALID_TRANSFORM=\nfunction(){return(Kc=a._emscripten_enum_draco_AttributeTransformType_ATTRIBUTE_INVALID_TRANSFORM=a.asm.kb).apply(null,arguments)},Lc=a._emscripten_enum_draco_AttributeTransformType_ATTRIBUTE_NO_TRANSFORM=function(){return(Lc=a._emscripten_enum_draco_AttributeTransformType_ATTRIBUTE_NO_TRANSFORM=a.asm.lb).apply(null,arguments)},Mc=a._emscripten_enum_draco_AttributeTransformType_ATTRIBUTE_QUANTIZATION_TRANSFORM=function(){return(Mc=a._emscripten_enum_draco_AttributeTransformType_ATTRIBUTE_QUANTIZATION_TRANSFORM=\na.asm.mb).apply(null,arguments)},Nc=a._emscripten_enum_draco_AttributeTransformType_ATTRIBUTE_OCTAHEDRON_TRANSFORM=function(){return(Nc=a._emscripten_enum_draco_AttributeTransformType_ATTRIBUTE_OCTAHEDRON_TRANSFORM=a.asm.nb).apply(null,arguments)},Oc=a._emscripten_enum_draco_GeometryAttribute_Type_INVALID=function(){return(Oc=a._emscripten_enum_draco_GeometryAttribute_Type_INVALID=a.asm.ob).apply(null,arguments)},Pc=a._emscripten_enum_draco_GeometryAttribute_Type_POSITION=function(){return(Pc=a._emscripten_enum_draco_GeometryAttribute_Type_POSITION=\na.asm.pb).apply(null,arguments)},Qc=a._emscripten_enum_draco_GeometryAttribute_Type_NORMAL=function(){return(Qc=a._emscripten_enum_draco_GeometryAttribute_Type_NORMAL=a.asm.qb).apply(null,arguments)},Rc=a._emscripten_enum_draco_GeometryAttribute_Type_COLOR=function(){return(Rc=a._emscripten_enum_draco_GeometryAttribute_Type_COLOR=a.asm.rb).apply(null,arguments)},Sc=a._emscripten_enum_draco_GeometryAttribute_Type_TEX_COORD=function(){return(Sc=a._emscripten_enum_draco_GeometryAttribute_Type_TEX_COORD=\na.asm.sb).apply(null,arguments)},Tc=a._emscripten_enum_draco_GeometryAttribute_Type_GENERIC=function(){return(Tc=a._emscripten_enum_draco_GeometryAttribute_Type_GENERIC=a.asm.tb).apply(null,arguments)},Uc=a._emscripten_enum_draco_EncodedGeometryType_INVALID_GEOMETRY_TYPE=function(){return(Uc=a._emscripten_enum_draco_EncodedGeometryType_INVALID_GEOMETRY_TYPE=a.asm.ub).apply(null,arguments)},Vc=a._emscripten_enum_draco_EncodedGeometryType_POINT_CLOUD=function(){return(Vc=a._emscripten_enum_draco_EncodedGeometryType_POINT_CLOUD=\na.asm.vb).apply(null,arguments)},Wc=a._emscripten_enum_draco_EncodedGeometryType_TRIANGULAR_MESH=function(){return(Wc=a._emscripten_enum_draco_EncodedGeometryType_TRIANGULAR_MESH=a.asm.wb).apply(null,arguments)},Xc=a._emscripten_enum_draco_DataType_DT_INVALID=function(){return(Xc=a._emscripten_enum_draco_DataType_DT_INVALID=a.asm.xb).apply(null,arguments)},Yc=a._emscripten_enum_draco_DataType_DT_INT8=function(){return(Yc=a._emscripten_enum_draco_DataType_DT_INT8=a.asm.yb).apply(null,arguments)},Zc=\na._emscripten_enum_draco_DataType_DT_UINT8=function(){return(Zc=a._emscripten_enum_draco_DataType_DT_UINT8=a.asm.zb).apply(null,arguments)},$c=a._emscripten_enum_draco_DataType_DT_INT16=function(){return($c=a._emscripten_enum_draco_DataType_DT_INT16=a.asm.Ab).apply(null,arguments)},ad=a._emscripten_enum_draco_DataType_DT_UINT16=function(){return(ad=a._emscripten_enum_draco_DataType_DT_UINT16=a.asm.Bb).apply(null,arguments)},bd=a._emscripten_enum_draco_DataType_DT_INT32=function(){return(bd=a._emscripten_enum_draco_DataType_DT_INT32=\na.asm.Cb).apply(null,arguments)},cd=a._emscripten_enum_draco_DataType_DT_UINT32=function(){return(cd=a._emscripten_enum_draco_DataType_DT_UINT32=a.asm.Db).apply(null,arguments)},dd=a._emscripten_enum_draco_DataType_DT_INT64=function(){return(dd=a._emscripten_enum_draco_DataType_DT_INT64=a.asm.Eb).apply(null,arguments)},ed=a._emscripten_enum_draco_DataType_DT_UINT64=function(){return(ed=a._emscripten_enum_draco_DataType_DT_UINT64=a.asm.Fb).apply(null,arguments)},fd=a._emscripten_enum_draco_DataType_DT_FLOAT32=\nfunction(){return(fd=a._emscripten_enum_draco_DataType_DT_FLOAT32=a.asm.Gb).apply(null,arguments)},gd=a._emscripten_enum_draco_DataType_DT_FLOAT64=function(){return(gd=a._emscripten_enum_draco_DataType_DT_FLOAT64=a.asm.Hb).apply(null,arguments)},hd=a._emscripten_enum_draco_DataType_DT_BOOL=function(){return(hd=a._emscripten_enum_draco_DataType_DT_BOOL=a.asm.Ib).apply(null,arguments)},id=a._emscripten_enum_draco_DataType_DT_TYPES_COUNT=function(){return(id=a._emscripten_enum_draco_DataType_DT_TYPES_COUNT=\na.asm.Jb).apply(null,arguments)},jd=a._emscripten_enum_draco_StatusCode_OK=function(){return(jd=a._emscripten_enum_draco_StatusCode_OK=a.asm.Kb).apply(null,arguments)},kd=a._emscripten_enum_draco_StatusCode_DRACO_ERROR=function(){return(kd=a._emscripten_enum_draco_StatusCode_DRACO_ERROR=a.asm.Lb).apply(null,arguments)},ld=a._emscripten_enum_draco_StatusCode_IO_ERROR=function(){return(ld=a._emscripten_enum_draco_StatusCode_IO_ERROR=a.asm.Mb).apply(null,arguments)},md=a._emscripten_enum_draco_StatusCode_INVALID_PARAMETER=\nfunction(){return(md=a._emscripten_enum_draco_StatusCode_INVALID_PARAMETER=a.asm.Nb).apply(null,arguments)},nd=a._emscripten_enum_draco_StatusCode_UNSUPPORTED_VERSION=function(){return(nd=a._emscripten_enum_draco_StatusCode_UNSUPPORTED_VERSION=a.asm.Ob).apply(null,arguments)},od=a._emscripten_enum_draco_StatusCode_UNKNOWN_VERSION=function(){return(od=a._emscripten_enum_draco_StatusCode_UNKNOWN_VERSION=a.asm.Pb).apply(null,arguments)};a._malloc=function(){return(a._malloc=a.asm.Qb).apply(null,arguments)};\na._free=function(){return(a._free=a.asm.Rb).apply(null,arguments)};var ua=function(){return(ua=a.asm.Sb).apply(null,arguments)};a.___start_em_js=11660;a.___stop_em_js=11758;var la;ha=function b(){la||F();la||(ha=b)};if(a.preInit)for(\"function\"==typeof a.preInit&&(a.preInit=[a.preInit]);0<a.preInit.length;)a.preInit.pop()();F();v.prototype=Object.create(v.prototype);v.prototype.constructor=v;v.prototype.__class__=v;v.__cache__={};a.WrapperObject=v;a.getCache=w;a.wrapPointer=B;a.castObject=function(b,\nc){return B(b.ptr,c)};a.NULL=B(0);a.destroy=function(b){if(!b.__destroy__)throw\"Error: Cannot destroy object. (Did you create it yourself?)\";b.__destroy__();delete w(b.__class__)[b.ptr]};a.compare=function(b,c){return b.ptr===c.ptr};a.getPointer=function(b){return b.ptr};a.getClass=function(b){return b.__class__};var r={buffer:0,size:0,pos:0,temps:[],needed:0,prepare:function(){if(r.needed){for(var b=0;b<r.temps.length;b++)a._free(r.temps[b]);r.temps.length=0;a._free(r.buffer);r.buffer=0;r.size+=\nr.needed;r.needed=0}r.buffer||(r.size+=128,r.buffer=a._malloc(r.size),r.buffer||y(void 0));r.pos=0},alloc:function(b,c){r.buffer||y(void 0);b=b.length*c.BYTES_PER_ELEMENT;b=b+7&-8;r.pos+b>=r.size?(0<b||y(void 0),r.needed+=b,c=a._malloc(b),r.temps.push(c)):(c=r.buffer+r.pos,r.pos+=b);return c},copy:function(b,c,d){d>>>=0;switch(c.BYTES_PER_ELEMENT){case 2:d>>>=1;break;case 4:d>>>=2;break;case 8:d>>>=3}for(var g=0;g<b.length;g++)c[d+g]=b[g]}};X.prototype=Object.create(v.prototype);X.prototype.constructor=\nX;X.prototype.__class__=X;X.__cache__={};a.VoidPtr=X;X.prototype.__destroy__=X.prototype.__destroy__=function(){Xa(this.ptr)};S.prototype=Object.create(v.prototype);S.prototype.constructor=S;S.prototype.__class__=S;S.__cache__={};a.DecoderBuffer=S;S.prototype.Init=S.prototype.Init=function(b,c){var d=this.ptr;r.prepare();\"object\"==typeof b&&(b=Z(b));c&&\"object\"===typeof c&&(c=c.ptr);Ya(d,b,c)};S.prototype.__destroy__=S.prototype.__destroy__=function(){Za(this.ptr)};Q.prototype=Object.create(v.prototype);\nQ.prototype.constructor=Q;Q.prototype.__class__=Q;Q.__cache__={};a.AttributeTransformData=Q;Q.prototype.transform_type=Q.prototype.transform_type=function(){return $a(this.ptr)};Q.prototype.__destroy__=Q.prototype.__destroy__=function(){ab(this.ptr)};V.prototype=Object.create(v.prototype);V.prototype.constructor=V;V.prototype.__class__=V;V.__cache__={};a.GeometryAttribute=V;V.prototype.__destroy__=V.prototype.__destroy__=function(){bb(this.ptr)};x.prototype=Object.create(v.prototype);x.prototype.constructor=\nx;x.prototype.__class__=x;x.__cache__={};a.PointAttribute=x;x.prototype.size=x.prototype.size=function(){return cb(this.ptr)};x.prototype.GetAttributeTransformData=x.prototype.GetAttributeTransformData=function(){return B(db(this.ptr),Q)};x.prototype.attribute_type=x.prototype.attribute_type=function(){return eb(this.ptr)};x.prototype.data_type=x.prototype.data_type=function(){return fb(this.ptr)};x.prototype.num_components=x.prototype.num_components=function(){return gb(this.ptr)};x.prototype.normalized=\nx.prototype.normalized=function(){return!!hb(this.ptr)};x.prototype.byte_stride=x.prototype.byte_stride=function(){return ib(this.ptr)};x.prototype.byte_offset=x.prototype.byte_offset=function(){return jb(this.ptr)};x.prototype.unique_id=x.prototype.unique_id=function(){return kb(this.ptr)};x.prototype.__destroy__=x.prototype.__destroy__=function(){lb(this.ptr)};D.prototype=Object.create(v.prototype);D.prototype.constructor=D;D.prototype.__class__=D;D.__cache__={};a.AttributeQuantizationTransform=\nD;D.prototype.InitFromAttribute=D.prototype.InitFromAttribute=function(b){var c=this.ptr;b&&\"object\"===typeof b&&(b=b.ptr);return!!mb(c,b)};D.prototype.quantization_bits=D.prototype.quantization_bits=function(){return nb(this.ptr)};D.prototype.min_value=D.prototype.min_value=function(b){var c=this.ptr;b&&\"object\"===typeof b&&(b=b.ptr);return ob(c,b)};D.prototype.range=D.prototype.range=function(){return pb(this.ptr)};D.prototype.__destroy__=D.prototype.__destroy__=function(){qb(this.ptr)};G.prototype=\nObject.create(v.prototype);G.prototype.constructor=G;G.prototype.__class__=G;G.__cache__={};a.AttributeOctahedronTransform=G;G.prototype.InitFromAttribute=G.prototype.InitFromAttribute=function(b){var c=this.ptr;b&&\"object\"===typeof b&&(b=b.ptr);return!!rb(c,b)};G.prototype.quantization_bits=G.prototype.quantization_bits=function(){return sb(this.ptr)};G.prototype.__destroy__=G.prototype.__destroy__=function(){tb(this.ptr)};H.prototype=Object.create(v.prototype);H.prototype.constructor=H;H.prototype.__class__=\nH;H.__cache__={};a.PointCloud=H;H.prototype.num_attributes=H.prototype.num_attributes=function(){return ub(this.ptr)};H.prototype.num_points=H.prototype.num_points=function(){return vb(this.ptr)};H.prototype.__destroy__=H.prototype.__destroy__=function(){wb(this.ptr)};E.prototype=Object.create(v.prototype);E.prototype.constructor=E;E.prototype.__class__=E;E.__cache__={};a.Mesh=E;E.prototype.num_faces=E.prototype.num_faces=function(){return xb(this.ptr)};E.prototype.num_attributes=E.prototype.num_attributes=\nfunction(){return yb(this.ptr)};E.prototype.num_points=E.prototype.num_points=function(){return zb(this.ptr)};E.prototype.__destroy__=E.prototype.__destroy__=function(){Ab(this.ptr)};T.prototype=Object.create(v.prototype);T.prototype.constructor=T;T.prototype.__class__=T;T.__cache__={};a.Metadata=T;T.prototype.__destroy__=T.prototype.__destroy__=function(){Bb(this.ptr)};C.prototype=Object.create(v.prototype);C.prototype.constructor=C;C.prototype.__class__=C;C.__cache__={};a.Status=C;C.prototype.code=\nC.prototype.code=function(){return Cb(this.ptr)};C.prototype.ok=C.prototype.ok=function(){return!!Db(this.ptr)};C.prototype.error_msg=C.prototype.error_msg=function(){return p(Eb(this.ptr))};C.prototype.__destroy__=C.prototype.__destroy__=function(){Fb(this.ptr)};I.prototype=Object.create(v.prototype);I.prototype.constructor=I;I.prototype.__class__=I;I.__cache__={};a.DracoFloat32Array=I;I.prototype.GetValue=I.prototype.GetValue=function(b){var c=this.ptr;b&&\"object\"===typeof b&&(b=b.ptr);return Gb(c,\nb)};I.prototype.size=I.prototype.size=function(){return Hb(this.ptr)};I.prototype.__destroy__=I.prototype.__destroy__=function(){Ib(this.ptr)};J.prototype=Object.create(v.prototype);J.prototype.constructor=J;J.prototype.__class__=J;J.__cache__={};a.DracoInt8Array=J;J.prototype.GetValue=J.prototype.GetValue=function(b){var c=this.ptr;b&&\"object\"===typeof b&&(b=b.ptr);return Jb(c,b)};J.prototype.size=J.prototype.size=function(){return Kb(this.ptr)};J.prototype.__destroy__=J.prototype.__destroy__=function(){Lb(this.ptr)};\nK.prototype=Object.create(v.prototype);K.prototype.constructor=K;K.prototype.__class__=K;K.__cache__={};a.DracoUInt8Array=K;K.prototype.GetValue=K.prototype.GetValue=function(b){var c=this.ptr;b&&\"object\"===typeof b&&(b=b.ptr);return Mb(c,b)};K.prototype.size=K.prototype.size=function(){return Nb(this.ptr)};K.prototype.__destroy__=K.prototype.__destroy__=function(){Ob(this.ptr)};L.prototype=Object.create(v.prototype);L.prototype.constructor=L;L.prototype.__class__=L;L.__cache__={};a.DracoInt16Array=\nL;L.prototype.GetValue=L.prototype.GetValue=function(b){var c=this.ptr;b&&\"object\"===typeof b&&(b=b.ptr);return Pb(c,b)};L.prototype.size=L.prototype.size=function(){return Qb(this.ptr)};L.prototype.__destroy__=L.prototype.__destroy__=function(){Rb(this.ptr)};M.prototype=Object.create(v.prototype);M.prototype.constructor=M;M.prototype.__class__=M;M.__cache__={};a.DracoUInt16Array=M;M.prototype.GetValue=M.prototype.GetValue=function(b){var c=this.ptr;b&&\"object\"===typeof b&&(b=b.ptr);return Sb(c,b)};\nM.prototype.size=M.prototype.size=function(){return Tb(this.ptr)};M.prototype.__destroy__=M.prototype.__destroy__=function(){Ub(this.ptr)};N.prototype=Object.create(v.prototype);N.prototype.constructor=N;N.prototype.__class__=N;N.__cache__={};a.DracoInt32Array=N;N.prototype.GetValue=N.prototype.GetValue=function(b){var c=this.ptr;b&&\"object\"===typeof b&&(b=b.ptr);return Vb(c,b)};N.prototype.size=N.prototype.size=function(){return Wb(this.ptr)};N.prototype.__destroy__=N.prototype.__destroy__=function(){Xb(this.ptr)};\nO.prototype=Object.create(v.prototype);O.prototype.constructor=O;O.prototype.__class__=O;O.__cache__={};a.DracoUInt32Array=O;O.prototype.GetValue=O.prototype.GetValue=function(b){var c=this.ptr;b&&\"object\"===typeof b&&(b=b.ptr);return Yb(c,b)};O.prototype.size=O.prototype.size=function(){return Zb(this.ptr)};O.prototype.__destroy__=O.prototype.__destroy__=function(){$b(this.ptr)};z.prototype=Object.create(v.prototype);z.prototype.constructor=z;z.prototype.__class__=z;z.__cache__={};a.MetadataQuerier=\nz;z.prototype.HasEntry=z.prototype.HasEntry=function(b,c){var d=this.ptr;r.prepare();b&&\"object\"===typeof b&&(b=b.ptr);c=c&&\"object\"===typeof c?c.ptr:R(c);return!!ac(d,b,c)};z.prototype.GetIntEntry=z.prototype.GetIntEntry=function(b,c){var d=this.ptr;r.prepare();b&&\"object\"===typeof b&&(b=b.ptr);c=c&&\"object\"===typeof c?c.ptr:R(c);return bc(d,b,c)};z.prototype.GetIntEntryArray=z.prototype.GetIntEntryArray=function(b,c,d){var g=this.ptr;r.prepare();b&&\"object\"===typeof b&&(b=b.ptr);c=c&&\"object\"===\ntypeof c?c.ptr:R(c);d&&\"object\"===typeof d&&(d=d.ptr);cc(g,b,c,d)};z.prototype.GetDoubleEntry=z.prototype.GetDoubleEntry=function(b,c){var d=this.ptr;r.prepare();b&&\"object\"===typeof b&&(b=b.ptr);c=c&&\"object\"===typeof c?c.ptr:R(c);return dc(d,b,c)};z.prototype.GetStringEntry=z.prototype.GetStringEntry=function(b,c){var d=this.ptr;r.prepare();b&&\"object\"===typeof b&&(b=b.ptr);c=c&&\"object\"===typeof c?c.ptr:R(c);return p(ec(d,b,c))};z.prototype.NumEntries=z.prototype.NumEntries=function(b){var c=this.ptr;\nb&&\"object\"===typeof b&&(b=b.ptr);return fc(c,b)};z.prototype.GetEntryName=z.prototype.GetEntryName=function(b,c){var d=this.ptr;b&&\"object\"===typeof b&&(b=b.ptr);c&&\"object\"===typeof c&&(c=c.ptr);return p(gc(d,b,c))};z.prototype.__destroy__=z.prototype.__destroy__=function(){hc(this.ptr)};m.prototype=Object.create(v.prototype);m.prototype.constructor=m;m.prototype.__class__=m;m.__cache__={};a.Decoder=m;m.prototype.DecodeArrayToPointCloud=m.prototype.DecodeArrayToPointCloud=function(b,c,d){var g=\nthis.ptr;r.prepare();\"object\"==typeof b&&(b=Z(b));c&&\"object\"===typeof c&&(c=c.ptr);d&&\"object\"===typeof d&&(d=d.ptr);return B(ic(g,b,c,d),C)};m.prototype.DecodeArrayToMesh=m.prototype.DecodeArrayToMesh=function(b,c,d){var g=this.ptr;r.prepare();\"object\"==typeof b&&(b=Z(b));c&&\"object\"===typeof c&&(c=c.ptr);d&&\"object\"===typeof d&&(d=d.ptr);return B(jc(g,b,c,d),C)};m.prototype.GetAttributeId=m.prototype.GetAttributeId=function(b,c){var d=this.ptr;b&&\"object\"===typeof b&&(b=b.ptr);c&&\"object\"===typeof c&&\n(c=c.ptr);return kc(d,b,c)};m.prototype.GetAttributeIdByName=m.prototype.GetAttributeIdByName=function(b,c){var d=this.ptr;r.prepare();b&&\"object\"===typeof b&&(b=b.ptr);c=c&&\"object\"===typeof c?c.ptr:R(c);return lc(d,b,c)};m.prototype.GetAttributeIdByMetadataEntry=m.prototype.GetAttributeIdByMetadataEntry=function(b,c,d){var g=this.ptr;r.prepare();b&&\"object\"===typeof b&&(b=b.ptr);c=c&&\"object\"===typeof c?c.ptr:R(c);d=d&&\"object\"===typeof d?d.ptr:R(d);return mc(g,b,c,d)};m.prototype.GetAttribute=\nm.prototype.GetAttribute=function(b,c){var d=this.ptr;b&&\"object\"===typeof b&&(b=b.ptr);c&&\"object\"===typeof c&&(c=c.ptr);return B(nc(d,b,c),x)};m.prototype.GetAttributeByUniqueId=m.prototype.GetAttributeByUniqueId=function(b,c){var d=this.ptr;b&&\"object\"===typeof b&&(b=b.ptr);c&&\"object\"===typeof c&&(c=c.ptr);return B(oc(d,b,c),x)};m.prototype.GetMetadata=m.prototype.GetMetadata=function(b){var c=this.ptr;b&&\"object\"===typeof b&&(b=b.ptr);return B(pc(c,b),T)};m.prototype.GetAttributeMetadata=m.prototype.GetAttributeMetadata=\nfunction(b,c){var d=this.ptr;b&&\"object\"===typeof b&&(b=b.ptr);c&&\"object\"===typeof c&&(c=c.ptr);return B(qc(d,b,c),T)};m.prototype.GetFaceFromMesh=m.prototype.GetFaceFromMesh=function(b,c,d){var g=this.ptr;b&&\"object\"===typeof b&&(b=b.ptr);c&&\"object\"===typeof c&&(c=c.ptr);d&&\"object\"===typeof d&&(d=d.ptr);return!!rc(g,b,c,d)};m.prototype.GetTriangleStripsFromMesh=m.prototype.GetTriangleStripsFromMesh=function(b,c){var d=this.ptr;b&&\"object\"===typeof b&&(b=b.ptr);c&&\"object\"===typeof c&&(c=c.ptr);\nreturn sc(d,b,c)};m.prototype.GetTrianglesUInt16Array=m.prototype.GetTrianglesUInt16Array=function(b,c,d){var g=this.ptr;b&&\"object\"===typeof b&&(b=b.ptr);c&&\"object\"===typeof c&&(c=c.ptr);d&&\"object\"===typeof d&&(d=d.ptr);return!!tc(g,b,c,d)};m.prototype.GetTrianglesUInt32Array=m.prototype.GetTrianglesUInt32Array=function(b,c,d){var g=this.ptr;b&&\"object\"===typeof b&&(b=b.ptr);c&&\"object\"===typeof c&&(c=c.ptr);d&&\"object\"===typeof d&&(d=d.ptr);return!!uc(g,b,c,d)};m.prototype.GetAttributeFloat=m.prototype.GetAttributeFloat=\nfunction(b,c,d){var g=this.ptr;b&&\"object\"===typeof b&&(b=b.ptr);c&&\"object\"===typeof c&&(c=c.ptr);d&&\"object\"===typeof d&&(d=d.ptr);return!!vc(g,b,c,d)};m.prototype.GetAttributeFloatForAllPoints=m.prototype.GetAttributeFloatForAllPoints=function(b,c,d){var g=this.ptr;b&&\"object\"===typeof b&&(b=b.ptr);c&&\"object\"===typeof c&&(c=c.ptr);d&&\"object\"===typeof d&&(d=d.ptr);return!!wc(g,b,c,d)};m.prototype.GetAttributeIntForAllPoints=m.prototype.GetAttributeIntForAllPoints=function(b,c,d){var g=this.ptr;\nb&&\"object\"===typeof b&&(b=b.ptr);c&&\"object\"===typeof c&&(c=c.ptr);d&&\"object\"===typeof d&&(d=d.ptr);return!!xc(g,b,c,d)};m.prototype.GetAttributeInt8ForAllPoints=m.prototype.GetAttributeInt8ForAllPoints=function(b,c,d){var g=this.ptr;b&&\"object\"===typeof b&&(b=b.ptr);c&&\"object\"===typeof c&&(c=c.ptr);d&&\"object\"===typeof d&&(d=d.ptr);return!!yc(g,b,c,d)};m.prototype.GetAttributeUInt8ForAllPoints=m.prototype.GetAttributeUInt8ForAllPoints=function(b,c,d){var g=this.ptr;b&&\"object\"===typeof b&&(b=\nb.ptr);c&&\"object\"===typeof c&&(c=c.ptr);d&&\"object\"===typeof d&&(d=d.ptr);return!!zc(g,b,c,d)};m.prototype.GetAttributeInt16ForAllPoints=m.prototype.GetAttributeInt16ForAllPoints=function(b,c,d){var g=this.ptr;b&&\"object\"===typeof b&&(b=b.ptr);c&&\"object\"===typeof c&&(c=c.ptr);d&&\"object\"===typeof d&&(d=d.ptr);return!!Ac(g,b,c,d)};m.prototype.GetAttributeUInt16ForAllPoints=m.prototype.GetAttributeUInt16ForAllPoints=function(b,c,d){var g=this.ptr;b&&\"object\"===typeof b&&(b=b.ptr);c&&\"object\"===typeof c&&\n(c=c.ptr);d&&\"object\"===typeof d&&(d=d.ptr);return!!Bc(g,b,c,d)};m.prototype.GetAttributeInt32ForAllPoints=m.prototype.GetAttributeInt32ForAllPoints=function(b,c,d){var g=this.ptr;b&&\"object\"===typeof b&&(b=b.ptr);c&&\"object\"===typeof c&&(c=c.ptr);d&&\"object\"===typeof d&&(d=d.ptr);return!!Cc(g,b,c,d)};m.prototype.GetAttributeUInt32ForAllPoints=m.prototype.GetAttributeUInt32ForAllPoints=function(b,c,d){var g=this.ptr;b&&\"object\"===typeof b&&(b=b.ptr);c&&\"object\"===typeof c&&(c=c.ptr);d&&\"object\"===\ntypeof d&&(d=d.ptr);return!!Dc(g,b,c,d)};m.prototype.GetAttributeDataArrayForAllPoints=m.prototype.GetAttributeDataArrayForAllPoints=function(b,c,d,g,t){var aa=this.ptr;b&&\"object\"===typeof b&&(b=b.ptr);c&&\"object\"===typeof c&&(c=c.ptr);d&&\"object\"===typeof d&&(d=d.ptr);g&&\"object\"===typeof g&&(g=g.ptr);t&&\"object\"===typeof t&&(t=t.ptr);return!!Ec(aa,b,c,d,g,t)};m.prototype.SkipAttributeTransform=m.prototype.SkipAttributeTransform=function(b){var c=this.ptr;b&&\"object\"===typeof b&&(b=b.ptr);Fc(c,\nb)};m.prototype.GetEncodedGeometryType_Deprecated=m.prototype.GetEncodedGeometryType_Deprecated=function(b){var c=this.ptr;b&&\"object\"===typeof b&&(b=b.ptr);return Gc(c,b)};m.prototype.DecodeBufferToPointCloud=m.prototype.DecodeBufferToPointCloud=function(b,c){var d=this.ptr;b&&\"object\"===typeof b&&(b=b.ptr);c&&\"object\"===typeof c&&(c=c.ptr);return B(Hc(d,b,c),C)};m.prototype.DecodeBufferToMesh=m.prototype.DecodeBufferToMesh=function(b,c){var d=this.ptr;b&&\"object\"===typeof b&&(b=b.ptr);c&&\"object\"===\ntypeof c&&(c=c.ptr);return B(Ic(d,b,c),C)};m.prototype.__destroy__=m.prototype.__destroy__=function(){Jc(this.ptr)};(function(){function b(){a.ATTRIBUTE_INVALID_TRANSFORM=Kc();a.ATTRIBUTE_NO_TRANSFORM=Lc();a.ATTRIBUTE_QUANTIZATION_TRANSFORM=Mc();a.ATTRIBUTE_OCTAHEDRON_TRANSFORM=Nc();a.INVALID=Oc();a.POSITION=Pc();a.NORMAL=Qc();a.COLOR=Rc();a.TEX_COORD=Sc();a.GENERIC=Tc();a.INVALID_GEOMETRY_TYPE=Uc();a.POINT_CLOUD=Vc();a.TRIANGULAR_MESH=Wc();a.DT_INVALID=Xc();a.DT_INT8=Yc();a.DT_UINT8=Zc();a.DT_INT16=\n$c();a.DT_UINT16=ad();a.DT_INT32=bd();a.DT_UINT32=cd();a.DT_INT64=dd();a.DT_UINT64=ed();a.DT_FLOAT32=fd();a.DT_FLOAT64=gd();a.DT_BOOL=hd();a.DT_TYPES_COUNT=id();a.OK=jd();a.DRACO_ERROR=kd();a.IO_ERROR=ld();a.INVALID_PARAMETER=md();a.UNSUPPORTED_VERSION=nd();a.UNKNOWN_VERSION=od()}va?b():oa.unshift(b)})();if(\"function\"===typeof a.onModuleParsed)a.onModuleParsed();a.Decoder.prototype.GetEncodedGeometryType=function(b){if(b.__class__&&b.__class__===a.DecoderBuffer)return a.Decoder.prototype.GetEncodedGeometryType_Deprecated(b);\nif(8>b.byteLength)return a.INVALID_GEOMETRY_TYPE;switch(b[7]){case 0:return a.POINT_CLOUD;case 1:return a.TRIANGULAR_MESH;default:return a.INVALID_GEOMETRY_TYPE}};return n.ready}}();\"object\"===typeof exports&&\"object\"===typeof module?module.exports=DracoDecoderModule:\"function\"===typeof define&&define.amd?define([],function(){return DracoDecoderModule}):\"object\"===typeof exports&&(exports.DracoDecoderModule=DracoDecoderModule);\n"
  },
  {
    "path": "examples/libs/es-module-shims.js",
    "content": "/* ES Module Shims 1.5.17 */\n(function () {\n\n  const hasWindow = typeof window !== 'undefined';\n  const hasDocument = typeof document !== 'undefined';\n\n  const noop = () => {};\n\n  const optionsScript = hasDocument ? document.querySelector('script[type=esms-options]') : undefined;\n\n  const esmsInitOptions = optionsScript ? JSON.parse(optionsScript.innerHTML) : {};\n  Object.assign(esmsInitOptions, self.esmsInitOptions || {});\n\n  let shimMode = hasDocument ? !!esmsInitOptions.shimMode : true;\n\n  const importHook = globalHook(shimMode && esmsInitOptions.onimport);\n  const resolveHook = globalHook(shimMode && esmsInitOptions.resolve);\n  let fetchHook = esmsInitOptions.fetch ? globalHook(esmsInitOptions.fetch) : fetch;\n  const metaHook = esmsInitOptions.meta ? globalHook(shimMode && esmsInitOptions.meta) : noop;\n\n  const skip = esmsInitOptions.skip ? new RegExp(esmsInitOptions.skip) : null;\n\n  const mapOverrides = esmsInitOptions.mapOverrides;\n\n  let nonce = esmsInitOptions.nonce;\n  if (!nonce && hasDocument) {\n    const nonceElement = document.querySelector('script[nonce]');\n    if (nonceElement)\n      nonce = nonceElement.nonce || nonceElement.getAttribute('nonce');\n  }\n\n  const onerror = globalHook(esmsInitOptions.onerror || noop);\n  const onpolyfill = esmsInitOptions.onpolyfill ? globalHook(esmsInitOptions.onpolyfill) : () => {\n    console.log('%c^^ Module TypeError above is polyfilled and can be ignored ^^', 'font-weight:900;color:#391');\n  };\n\n  const { revokeBlobURLs, noLoadEventRetriggers, enforceIntegrity } = esmsInitOptions;\n\n  function globalHook (name) {\n    return typeof name === 'string' ? self[name] : name;\n  }\n\n  const enable = Array.isArray(esmsInitOptions.polyfillEnable) ? esmsInitOptions.polyfillEnable : [];\n  const cssModulesEnabled = enable.includes('css-modules');\n  const jsonModulesEnabled = enable.includes('json-modules');\n\n  const edge = !navigator.userAgentData && !!navigator.userAgent.match(/Edge\\/\\d+\\.\\d+/);\n\n  const baseUrl = hasDocument\n    ? document.baseURI\n    : `${location.protocol}//${location.host}${location.pathname.includes('/') \n    ? location.pathname.slice(0, location.pathname.lastIndexOf('/') + 1) \n    : location.pathname}`;\n\n  const createBlob = (source, type = 'text/javascript') => URL.createObjectURL(new Blob([source], { type }));\n\n  const eoop = err => setTimeout(() => { throw err });\n\n  const throwError = err => { (self.reportError || hasWindow && window.safari && console.error || eoop)(err), void onerror(err); };\n\n  function fromParent (parent) {\n    return parent ? ` imported from ${parent}` : '';\n  }\n\n  let importMapSrcOrLazy = false;\n\n  function setImportMapSrcOrLazy () {\n    importMapSrcOrLazy = true;\n  }\n\n  // shim mode is determined on initialization, no late shim mode\n  if (!shimMode) {\n    if (document.querySelectorAll('script[type=module-shim],script[type=importmap-shim],link[rel=modulepreload-shim]').length) {\n      shimMode = true;\n    }\n    else {\n      let seenScript = false;\n      for (const script of document.querySelectorAll('script[type=module],script[type=importmap]')) {\n        if (!seenScript) {\n          if (script.type === 'module' && !script.ep)\n            seenScript = true;\n        }\n        else if (script.type === 'importmap' && seenScript) {\n          importMapSrcOrLazy = true;\n          break;\n        }\n      }\n    }\n  }\n\n  const backslashRegEx = /\\\\/g;\n\n  function isURL (url) {\n    if (url.indexOf(':') === -1) return false;\n    try {\n      new URL(url);\n      return true;\n    }\n    catch (_) {\n      return false;\n    }\n  }\n\n  /*\n   * Import maps implementation\n   *\n   * To make lookups fast we pre-resolve the entire import map\n   * and then match based on backtracked hash lookups\n   *\n   */\n  function resolveUrl (relUrl, parentUrl) {\n    return resolveIfNotPlainOrUrl(relUrl, parentUrl) || (isURL(relUrl) ? relUrl : resolveIfNotPlainOrUrl('./' + relUrl, parentUrl));\n  }\n\n  function resolveIfNotPlainOrUrl (relUrl, parentUrl) {\n    // strip off any trailing query params or hashes\n    const queryHashIndex = parentUrl.indexOf('?', parentUrl.indexOf('#') === -1 ? parentUrl.indexOf('#') : parentUrl.length);\n    if (queryHashIndex !== -1)\n      parentUrl = parentUrl.slice(0, queryHashIndex);\n    if (relUrl.indexOf('\\\\') !== -1)\n      relUrl = relUrl.replace(backslashRegEx, '/');\n    // protocol-relative\n    if (relUrl[0] === '/' && relUrl[1] === '/') {\n      return parentUrl.slice(0, parentUrl.indexOf(':') + 1) + relUrl;\n    }\n    // relative-url\n    else if (relUrl[0] === '.' && (relUrl[1] === '/' || relUrl[1] === '.' && (relUrl[2] === '/' || relUrl.length === 2 && (relUrl += '/')) ||\n        relUrl.length === 1  && (relUrl += '/')) ||\n        relUrl[0] === '/') {\n      const parentProtocol = parentUrl.slice(0, parentUrl.indexOf(':') + 1);\n      // Disabled, but these cases will give inconsistent results for deep backtracking\n      //if (parentUrl[parentProtocol.length] !== '/')\n      //  throw new Error('Cannot resolve');\n      // read pathname from parent URL\n      // pathname taken to be part after leading \"/\"\n      let pathname;\n      if (parentUrl[parentProtocol.length + 1] === '/') {\n        // resolving to a :// so we need to read out the auth and host\n        if (parentProtocol !== 'file:') {\n          pathname = parentUrl.slice(parentProtocol.length + 2);\n          pathname = pathname.slice(pathname.indexOf('/') + 1);\n        }\n        else {\n          pathname = parentUrl.slice(8);\n        }\n      }\n      else {\n        // resolving to :/ so pathname is the /... part\n        pathname = parentUrl.slice(parentProtocol.length + (parentUrl[parentProtocol.length] === '/'));\n      }\n\n      if (relUrl[0] === '/')\n        return parentUrl.slice(0, parentUrl.length - pathname.length - 1) + relUrl;\n\n      // join together and split for removal of .. and . segments\n      // looping the string instead of anything fancy for perf reasons\n      // '../../../../../z' resolved to 'x/y' is just 'z'\n      const segmented = pathname.slice(0, pathname.lastIndexOf('/') + 1) + relUrl;\n\n      const output = [];\n      let segmentIndex = -1;\n      for (let i = 0; i < segmented.length; i++) {\n        // busy reading a segment - only terminate on '/'\n        if (segmentIndex !== -1) {\n          if (segmented[i] === '/') {\n            output.push(segmented.slice(segmentIndex, i + 1));\n            segmentIndex = -1;\n          }\n          continue;\n        }\n        // new segment - check if it is relative\n        else if (segmented[i] === '.') {\n          // ../ segment\n          if (segmented[i + 1] === '.' && (segmented[i + 2] === '/' || i + 2 === segmented.length)) {\n            output.pop();\n            i += 2;\n            continue;\n          }\n          // ./ segment\n          else if (segmented[i + 1] === '/' || i + 1 === segmented.length) {\n            i += 1;\n            continue;\n          }\n        }\n        // it is the start of a new segment\n        while (segmented[i] === '/') i++;\n        segmentIndex = i; \n      }\n      // finish reading out the last segment\n      if (segmentIndex !== -1)\n        output.push(segmented.slice(segmentIndex));\n      return parentUrl.slice(0, parentUrl.length - pathname.length) + output.join('');\n    }\n  }\n\n  function resolveAndComposeImportMap (json, baseUrl, parentMap) {\n    const outMap = { imports: Object.assign({}, parentMap.imports), scopes: Object.assign({}, parentMap.scopes) };\n\n    if (json.imports)\n      resolveAndComposePackages(json.imports, outMap.imports, baseUrl, parentMap);\n\n    if (json.scopes)\n      for (let s in json.scopes) {\n        const resolvedScope = resolveUrl(s, baseUrl);\n        resolveAndComposePackages(json.scopes[s], outMap.scopes[resolvedScope] || (outMap.scopes[resolvedScope] = {}), baseUrl, parentMap);\n      }\n\n    return outMap;\n  }\n\n  function getMatch (path, matchObj) {\n    if (matchObj[path])\n      return path;\n    let sepIndex = path.length;\n    do {\n      const segment = path.slice(0, sepIndex + 1);\n      if (segment in matchObj)\n        return segment;\n    } while ((sepIndex = path.lastIndexOf('/', sepIndex - 1)) !== -1)\n  }\n\n  function applyPackages (id, packages) {\n    const pkgName = getMatch(id, packages);\n    if (pkgName) {\n      const pkg = packages[pkgName];\n      if (pkg === null) return;\n      return pkg + id.slice(pkgName.length);\n    }\n  }\n\n\n  function resolveImportMap (importMap, resolvedOrPlain, parentUrl) {\n    let scopeUrl = parentUrl && getMatch(parentUrl, importMap.scopes);\n    while (scopeUrl) {\n      const packageResolution = applyPackages(resolvedOrPlain, importMap.scopes[scopeUrl]);\n      if (packageResolution)\n        return packageResolution;\n      scopeUrl = getMatch(scopeUrl.slice(0, scopeUrl.lastIndexOf('/')), importMap.scopes);\n    }\n    return applyPackages(resolvedOrPlain, importMap.imports) || resolvedOrPlain.indexOf(':') !== -1 && resolvedOrPlain;\n  }\n\n  function resolveAndComposePackages (packages, outPackages, baseUrl, parentMap) {\n    for (let p in packages) {\n      const resolvedLhs = resolveIfNotPlainOrUrl(p, baseUrl) || p;\n      if ((!shimMode || !mapOverrides) && outPackages[resolvedLhs] && (outPackages[resolvedLhs] !== packages[resolvedLhs])) {\n        throw Error(`Rejected map override \"${resolvedLhs}\" from ${outPackages[resolvedLhs]} to ${packages[resolvedLhs]}.`);\n      }\n      let target = packages[p];\n      if (typeof target !== 'string')\n        continue;\n      const mapped = resolveImportMap(parentMap, resolveIfNotPlainOrUrl(target, baseUrl) || target, baseUrl);\n      if (mapped) {\n        outPackages[resolvedLhs] = mapped;\n        continue;\n      }\n      console.warn(`Mapping \"${p}\" -> \"${packages[p]}\" does not resolve`);\n    }\n  }\n\n  let dynamicImport = !hasDocument && (0, eval)('u=>import(u)');\n\n  let supportsDynamicImport;\n\n  const dynamicImportCheck = hasDocument && new Promise(resolve => {\n    const s = Object.assign(document.createElement('script'), {\n      src: createBlob('self._d=u=>import(u)'),\n      ep: true\n    });\n    s.setAttribute('nonce', nonce);\n    s.addEventListener('load', () => {\n      if (!(supportsDynamicImport = !!(dynamicImport = self._d))) {\n        let err;\n        window.addEventListener('error', _err => err = _err);\n        dynamicImport = (url, opts) => new Promise((resolve, reject) => {\n          const s = Object.assign(document.createElement('script'), {\n            type: 'module',\n            src: createBlob(`import*as m from'${url}';self._esmsi=m`)\n          });\n          err = undefined;\n          s.ep = true;\n          if (nonce)\n            s.setAttribute('nonce', nonce);\n          // Safari is unique in supporting module script error events\n          s.addEventListener('error', cb);\n          s.addEventListener('load', cb);\n          function cb (_err) {\n            document.head.removeChild(s);\n            if (self._esmsi) {\n              resolve(self._esmsi, baseUrl);\n              self._esmsi = undefined;\n            }\n            else {\n              reject(!(_err instanceof Event) && _err || err && err.error || new Error(`Error loading ${opts && opts.errUrl || url} (${s.src}).`));\n              err = undefined;\n            }\n          }\n          document.head.appendChild(s);\n        });\n      }\n      document.head.removeChild(s);\n      delete self._d;\n      resolve();\n    });\n    document.head.appendChild(s);\n  });\n\n  // support browsers without dynamic import support (eg Firefox 6x)\n  let supportsJsonAssertions = false;\n  let supportsCssAssertions = false;\n\n  let supportsImportMaps = hasDocument && HTMLScriptElement.supports ? HTMLScriptElement.supports('importmap') : false;\n  let supportsImportMeta = supportsImportMaps;\n\n  const importMetaCheck = 'import.meta';\n  const cssModulesCheck = `import\"x\"assert{type:\"css\"}`;\n  const jsonModulesCheck = `import\"x\"assert{type:\"json\"}`;\n\n  const featureDetectionPromise = Promise.resolve(dynamicImportCheck).then(() => {\n    if (!supportsDynamicImport || supportsImportMaps && !cssModulesEnabled && !jsonModulesEnabled)\n      return;\n\n    if (!hasDocument)\n      return Promise.all([\n        supportsImportMaps || dynamicImport(createBlob(importMetaCheck)).then(() => supportsImportMeta = true, noop),\n        cssModulesEnabled && dynamicImport(createBlob(cssModulesCheck.replace('x', createBlob('', 'text/css')))).then(() => supportsCssAssertions = true, noop),\n        jsonModulesEnabled && dynamicImport(createBlob(jsonModulescheck.replace('x', createBlob('{}', 'text/json')))).then(() => supportsJsonAssertions = true, noop),\n      ]);\n\n    return new Promise(resolve => {\n      const iframe = document.createElement('iframe');\n      iframe.style.display = 'none';\n      iframe.setAttribute('nonce', nonce);\n      function cb ({ data: [a, b, c, d] }) {\n        supportsImportMaps = a;\n        supportsImportMeta = b;\n        supportsCssAssertions = c;\n        supportsJsonAssertions = d;\n        resolve();\n        document.head.removeChild(iframe);\n        window.removeEventListener('message', cb, false);\n      }\n      window.addEventListener('message', cb, false);\n\n      const importMapTest = `<script nonce=${nonce || ''}>b=(s,type='text/javascript')=>URL.createObjectURL(new Blob([s],{type}));document.head.appendChild(Object.assign(document.createElement('script'),{type:'importmap',nonce:\"${nonce}\",innerText:\\`{\"imports\":{\"x\":\"\\${b('')}\"}}\\`}));Promise.all([${\n      supportsImportMaps ? 'true,true' : `'x',b('${importMetaCheck}')`}, ${cssModulesEnabled ? `b('${cssModulesCheck}'.replace('x',b('','text/css')))` : 'false'}, ${\n      jsonModulesEnabled ? `b('${jsonModulesCheck}'.replace('x',b('{}','text/json')))` : 'false'}].map(x =>typeof x==='string'?import(x).then(x =>!!x,()=>false):x)).then(a=>parent.postMessage(a,'*'))<${''}/script>`;\n\n      iframe.onload = () => {\n        // WeChat browser doesn't support setting srcdoc scripts\n        // But iframe sandboxes don't support contentDocument so we do this as a fallback\n        const doc = iframe.contentDocument;\n        if (doc && doc.head.childNodes.length === 0) {\n          const s = doc.createElement('script');\n          if (nonce)\n            s.setAttribute('nonce', nonce);\n          s.innerHTML = importMapTest.slice(15 + (nonce ? nonce.length : 0), -9);\n          doc.head.appendChild(s);\n        }\n      };\n      // WeChat browser requires append before setting srcdoc\n      document.head.appendChild(iframe);\n      // setting srcdoc is not supported in React native webviews on iOS\n      // setting src to a blob URL results in a navigation event in webviews\n      // document.write gives usability warnings\n      if ('srcdoc' in iframe)\n        iframe.srcdoc = importMapTest;\n      else\n        iframe.contentDocument.write(importMapTest);\n    });\n  });\n\n  /* es-module-lexer 1.0.3 */\n  let e,a,r,i=2<<19;const s=1===new Uint8Array(new Uint16Array([1]).buffer)[0]?function(e,a){const r=e.length;let i=0;for(;i<r;)a[i]=e.charCodeAt(i++);}:function(e,a){const r=e.length;let i=0;for(;i<r;){const r=e.charCodeAt(i);a[i++]=(255&r)<<8|r>>>8;}},t=\"xportmportlassetafromssertvoyiedelecontininstantybreareturdebuggeawaithrwhileforifcatcfinallels\";let c$1,f,n;function parse(l,k=\"@\"){c$1=l,f=k;const u=2*c$1.length+(2<<18);if(u>i||!e){for(;u>i;)i*=2;a=new ArrayBuffer(i),s(t,new Uint16Array(a,16,95)),e=function(e,a,r){\"use asm\";var i=new e.Int8Array(r),s=new e.Int16Array(r),t=new e.Int32Array(r),c=new e.Uint8Array(r),f=new e.Uint16Array(r),n=1008;function b(e){e=e|0;var a=0,r=0,c=0,b=0,o=0,w=0;w=n;n=n+10240|0;i[775]=1;s[385]=0;s[386]=0;t[62]=t[2];i[776]=0;t[61]=0;i[774]=0;t[63]=w+2048;t[64]=w;i[777]=0;e=(t[3]|0)+-2|0;t[65]=e;a=e+(t[59]<<1)|0;t[66]=a;e:while(1){r=e+2|0;t[65]=r;if(e>>>0>=a>>>0){b=18;break}a:do{switch(s[r>>1]|0){case 9:case 10:case 11:case 12:case 13:case 32:break;case 101:{if((((s[386]|0)==0?F(r)|0:0)?(m(e+4|0,16,10)|0)==0:0)?(l(),(i[775]|0)==0):0){b=9;break e}else b=17;break}case 105:{if(F(r)|0?(m(e+4|0,26,10)|0)==0:0){k();b=17;}else b=17;break}case 59:{b=17;break}case 47:switch(s[e+4>>1]|0){case 47:{E();break a}case 42:{y(1);break a}default:{b=16;break e}}default:{b=16;break e}}}while(0);if((b|0)==17){b=0;t[62]=t[65];}e=t[65]|0;a=t[66]|0;}if((b|0)==9){e=t[65]|0;t[62]=e;b=19;}else if((b|0)==16){i[775]=0;t[65]=e;b=19;}else if((b|0)==18)if(!(i[774]|0)){e=r;b=19;}else e=0;do{if((b|0)==19){e:while(1){a=e+2|0;t[65]=a;c=a;if(e>>>0>=(t[66]|0)>>>0){b=82;break}a:do{switch(s[a>>1]|0){case 9:case 10:case 11:case 12:case 13:case 32:break;case 101:{if(((s[386]|0)==0?F(a)|0:0)?(m(e+4|0,16,10)|0)==0:0){l();b=81;}else b=81;break}case 105:{if(F(a)|0?(m(e+4|0,26,10)|0)==0:0){k();b=81;}else b=81;break}case 99:{if((F(a)|0?(m(e+4|0,36,8)|0)==0:0)?R(s[e+12>>1]|0)|0:0){i[777]=1;b=81;}else b=81;break}case 40:{c=t[63]|0;a=s[386]|0;b=a&65535;t[c+(b<<3)>>2]=1;r=t[62]|0;s[386]=a+1<<16>>16;t[c+(b<<3)+4>>2]=r;b=81;break}case 41:{a=s[386]|0;if(!(a<<16>>16)){b=36;break e}a=a+-1<<16>>16;s[386]=a;r=s[385]|0;if(r<<16>>16!=0?(o=t[(t[64]|0)+((r&65535)+-1<<2)>>2]|0,(t[o+20>>2]|0)==(t[(t[63]|0)+((a&65535)<<3)+4>>2]|0)):0){a=o+4|0;if(!(t[a>>2]|0))t[a>>2]=c;t[o+12>>2]=e+4;s[385]=r+-1<<16>>16;b=81;}else b=81;break}case 123:{b=t[62]|0;c=t[56]|0;e=b;do{if((s[b>>1]|0)==41&(c|0)!=0?(t[c+4>>2]|0)==(b|0):0){a=t[57]|0;t[56]=a;if(!a){t[52]=0;break}else {t[a+28>>2]=0;break}}}while(0);c=t[63]|0;r=s[386]|0;b=r&65535;t[c+(b<<3)>>2]=(i[777]|0)==0?2:6;s[386]=r+1<<16>>16;t[c+(b<<3)+4>>2]=e;i[777]=0;b=81;break}case 125:{e=s[386]|0;if(!(e<<16>>16)){b=49;break e}c=t[63]|0;b=e+-1<<16>>16;s[386]=b;if((t[c+((b&65535)<<3)>>2]|0)==4){h();b=81;}else b=81;break}case 39:{d(39);b=81;break}case 34:{d(34);b=81;break}case 47:switch(s[e+4>>1]|0){case 47:{E();break a}case 42:{y(1);break a}default:{e=t[62]|0;c=s[e>>1]|0;r:do{if(!(U(c)|0)){switch(c<<16>>16){case 41:if(z(t[(t[63]|0)+(f[386]<<3)+4>>2]|0)|0){b=69;break r}else {b=66;break r}case 125:break;default:{b=66;break r}}a=t[63]|0;r=f[386]|0;if(!(p(t[a+(r<<3)+4>>2]|0)|0)?(t[a+(r<<3)>>2]|0)!=6:0)b=66;else b=69;}else switch(c<<16>>16){case 46:if(((s[e+-2>>1]|0)+-48&65535)<10){b=66;break r}else {b=69;break r}case 43:if((s[e+-2>>1]|0)==43){b=66;break r}else {b=69;break r}case 45:if((s[e+-2>>1]|0)==45){b=66;break r}else {b=69;break r}default:{b=69;break r}}}while(0);r:do{if((b|0)==66){b=0;if(!(u(e)|0)){switch(c<<16>>16){case 0:{b=69;break r}case 47:{if(i[776]|0){b=69;break r}break}default:{}}r=t[3]|0;a=c;do{if(e>>>0<=r>>>0)break;e=e+-2|0;t[62]=e;a=s[e>>1]|0;}while(!(B(a)|0));if(D(a)|0){do{if(e>>>0<=r>>>0)break;e=e+-2|0;t[62]=e;}while(D(s[e>>1]|0)|0);if($(e)|0){g();i[776]=0;b=81;break a}else e=1;}else e=1;}else b=69;}}while(0);if((b|0)==69){g();e=0;}i[776]=e;b=81;break a}}case 96:{c=t[63]|0;r=s[386]|0;b=r&65535;t[c+(b<<3)+4>>2]=t[62];s[386]=r+1<<16>>16;t[c+(b<<3)>>2]=3;h();b=81;break}default:b=81;}}while(0);if((b|0)==81){b=0;t[62]=t[65];}e=t[65]|0;}if((b|0)==36){Q();e=0;break}else if((b|0)==49){Q();e=0;break}else if((b|0)==82){e=(i[774]|0)==0?(s[385]|s[386])<<16>>16==0:0;break}}}while(0);n=w;return e|0}function l(){var e=0,a=0,r=0,c=0,f=0,n=0,b=0;f=t[65]|0;n=t[58]|0;b=f+12|0;t[65]=b;r=w(1)|0;e=t[65]|0;if(!((e|0)==(b|0)?!(I(r)|0):0))c=3;e:do{if((c|0)==3){a:do{switch(r<<16>>16){case 123:{t[65]=e+2;e=w(1)|0;r=t[65]|0;while(1){if(T(e)|0){d(e);e=(t[65]|0)+2|0;t[65]=e;}else {P(e)|0;e=t[65]|0;}w(1)|0;e=v(r,e)|0;if(e<<16>>16==44){t[65]=(t[65]|0)+2;e=w(1)|0;}a=r;r=t[65]|0;if(e<<16>>16==125){c=15;break}if((r|0)==(a|0)){c=12;break}if(r>>>0>(t[66]|0)>>>0){c=14;break}}if((c|0)==12){Q();break e}else if((c|0)==14){Q();break e}else if((c|0)==15){t[65]=r+2;break a}break}case 42:{t[65]=e+2;w(1)|0;b=t[65]|0;v(b,b)|0;break}default:{i[775]=0;switch(r<<16>>16){case 100:{O(e,e+14|0,0,0);break e}case 97:{t[65]=e+10;w(1)|0;e=t[65]|0;c=20;break}case 102:{c=20;break}case 99:{if((m(e+2|0,36,8)|0)==0?(a=e+10|0,B(s[a>>1]|0)|0):0){t[65]=a;b=w(1)|0;n=t[65]|0;P(b)|0;b=t[65]|0;O(n,b,n,b);t[65]=(t[65]|0)+-2;break e}e=e+4|0;t[65]=e;break}case 108:case 118:break;default:break e}if((c|0)==20){t[65]=e+16;e=w(1)|0;if(e<<16>>16==42){t[65]=(t[65]|0)+2;e=w(1)|0;}n=t[65]|0;P(e)|0;b=t[65]|0;O(n,b,n,b);t[65]=(t[65]|0)+-2;break e}e=e+4|0;t[65]=e;i[775]=0;r:while(1){t[65]=e+2;b=w(1)|0;e=t[65]|0;switch((P(b)|0)<<16>>16){case 91:case 123:break r;default:{}}a=t[65]|0;if((a|0)==(e|0))break e;O(e,a,e,a);if((w(1)|0)<<16>>16!=44)break;e=t[65]|0;}t[65]=(t[65]|0)+-2;break e}}}while(0);b=(w(1)|0)<<16>>16==102;e=t[65]|0;if(b?(m(e+2|0,52,6)|0)==0:0){t[65]=e+8;o(f,w(1)|0);e=(n|0)==0?212:n+16|0;while(1){e=t[e>>2]|0;if(!e)break e;t[e+12>>2]=0;t[e+8>>2]=0;e=e+16|0;}}t[65]=e+-2;}}while(0);return}function k(){var e=0,a=0,r=0,c=0,f=0,n=0;f=t[65]|0;a=f+12|0;t[65]=a;e:do{switch((w(1)|0)<<16>>16){case 40:{a=t[63]|0;n=s[386]|0;r=n&65535;t[a+(r<<3)>>2]=5;e=t[65]|0;s[386]=n+1<<16>>16;t[a+(r<<3)+4>>2]=e;if((s[t[62]>>1]|0)!=46){t[65]=e+2;n=w(1)|0;A(f,t[65]|0,0,e);a=t[56]|0;r=t[64]|0;f=s[385]|0;s[385]=f+1<<16>>16;t[r+((f&65535)<<2)>>2]=a;switch(n<<16>>16){case 39:{d(39);break}case 34:{d(34);break}default:{t[65]=(t[65]|0)+-2;break e}}e=(t[65]|0)+2|0;t[65]=e;switch((w(1)|0)<<16>>16){case 44:{t[65]=(t[65]|0)+2;w(1)|0;f=t[56]|0;t[f+4>>2]=e;n=t[65]|0;t[f+16>>2]=n;i[f+24>>0]=1;t[65]=n+-2;break e}case 41:{s[386]=(s[386]|0)+-1<<16>>16;n=t[56]|0;t[n+4>>2]=e;t[n+12>>2]=(t[65]|0)+2;i[n+24>>0]=1;s[385]=(s[385]|0)+-1<<16>>16;break e}default:{t[65]=(t[65]|0)+-2;break e}}}break}case 46:{t[65]=(t[65]|0)+2;if(((w(1)|0)<<16>>16==109?(e=t[65]|0,(m(e+2|0,44,6)|0)==0):0)?(s[t[62]>>1]|0)!=46:0)A(f,f,e+8|0,2);break}case 42:case 39:case 34:{c=17;break}case 123:{e=t[65]|0;if(s[386]|0){t[65]=e+-2;break e}while(1){if(e>>>0>=(t[66]|0)>>>0)break;e=w(1)|0;if(!(T(e)|0)){if(e<<16>>16==125){c=32;break}}else d(e);e=(t[65]|0)+2|0;t[65]=e;}if((c|0)==32)t[65]=(t[65]|0)+2;w(1)|0;e=t[65]|0;if(m(e,50,8)|0){Q();break e}t[65]=e+8;e=w(1)|0;if(T(e)|0){o(f,e);break e}else {Q();break e}}default:if((t[65]|0)==(a|0))t[65]=f+10;else c=17;}}while(0);do{if((c|0)==17){if(s[386]|0){t[65]=(t[65]|0)+-2;break}e=t[66]|0;a=t[65]|0;while(1){if(a>>>0>=e>>>0){c=24;break}r=s[a>>1]|0;if(T(r)|0){c=22;break}n=a+2|0;t[65]=n;a=n;}if((c|0)==22){o(f,r);break}else if((c|0)==24){Q();break}}}while(0);return}function u(e){e=e|0;e:do{switch(s[e>>1]|0){case 100:switch(s[e+-2>>1]|0){case 105:{e=S(e+-4|0,68,2)|0;break e}case 108:{e=S(e+-4|0,72,3)|0;break e}default:{e=0;break e}}case 101:switch(s[e+-2>>1]|0){case 115:switch(s[e+-4>>1]|0){case 108:{e=j(e+-6|0,101)|0;break e}case 97:{e=j(e+-6|0,99)|0;break e}default:{e=0;break e}}case 116:{e=S(e+-4|0,78,4)|0;break e}case 117:{e=S(e+-4|0,86,6)|0;break e}default:{e=0;break e}}case 102:{if((s[e+-2>>1]|0)==111?(s[e+-4>>1]|0)==101:0)switch(s[e+-6>>1]|0){case 99:{e=S(e+-8|0,98,6)|0;break e}case 112:{e=S(e+-8|0,110,2)|0;break e}default:{e=0;break e}}else e=0;break}case 107:{e=S(e+-2|0,114,4)|0;break}case 110:{e=e+-2|0;if(j(e,105)|0)e=1;else e=S(e,122,5)|0;break}case 111:{e=j(e+-2|0,100)|0;break}case 114:{e=S(e+-2|0,132,7)|0;break}case 116:{e=S(e+-2|0,146,4)|0;break}case 119:switch(s[e+-2>>1]|0){case 101:{e=j(e+-4|0,110)|0;break e}case 111:{e=S(e+-4|0,154,3)|0;break e}default:{e=0;break e}}default:e=0;}}while(0);return e|0}function o(e,a){e=e|0;a=a|0;var r=0,i=0;r=(t[65]|0)+2|0;switch(a<<16>>16){case 39:{d(39);i=5;break}case 34:{d(34);i=5;break}default:Q();}do{if((i|0)==5){A(e,r,t[65]|0,1);t[65]=(t[65]|0)+2;i=(w(0)|0)<<16>>16==97;a=t[65]|0;if(i?(m(a+2|0,58,10)|0)==0:0){t[65]=a+12;if((w(1)|0)<<16>>16!=123){t[65]=a;break}e=t[65]|0;r=e;e:while(1){t[65]=r+2;r=w(1)|0;switch(r<<16>>16){case 39:{d(39);t[65]=(t[65]|0)+2;r=w(1)|0;break}case 34:{d(34);t[65]=(t[65]|0)+2;r=w(1)|0;break}default:r=P(r)|0;}if(r<<16>>16!=58){i=16;break}t[65]=(t[65]|0)+2;switch((w(1)|0)<<16>>16){case 39:{d(39);break}case 34:{d(34);break}default:{i=20;break e}}t[65]=(t[65]|0)+2;switch((w(1)|0)<<16>>16){case 125:{i=25;break e}case 44:break;default:{i=24;break e}}t[65]=(t[65]|0)+2;if((w(1)|0)<<16>>16==125){i=25;break}r=t[65]|0;}if((i|0)==16){t[65]=a;break}else if((i|0)==20){t[65]=a;break}else if((i|0)==24){t[65]=a;break}else if((i|0)==25){i=t[56]|0;t[i+16>>2]=e;t[i+12>>2]=(t[65]|0)+2;break}}t[65]=a+-2;}}while(0);return}function h(){var e=0,a=0,r=0,i=0;a=t[66]|0;r=t[65]|0;e:while(1){e=r+2|0;if(r>>>0>=a>>>0){a=10;break}switch(s[e>>1]|0){case 96:{a=7;break e}case 36:{if((s[r+4>>1]|0)==123){a=6;break e}break}case 92:{e=r+4|0;break}default:{}}r=e;}if((a|0)==6){e=r+4|0;t[65]=e;a=t[63]|0;i=s[386]|0;r=i&65535;t[a+(r<<3)>>2]=4;s[386]=i+1<<16>>16;t[a+(r<<3)+4>>2]=e;}else if((a|0)==7){t[65]=e;r=t[63]|0;i=(s[386]|0)+-1<<16>>16;s[386]=i;if((t[r+((i&65535)<<3)>>2]|0)!=3)Q();}else if((a|0)==10){t[65]=e;Q();}return}function w(e){e=e|0;var a=0,r=0,i=0;r=t[65]|0;e:do{a=s[r>>1]|0;a:do{if(a<<16>>16!=47)if(e)if(R(a)|0)break;else break e;else if(D(a)|0)break;else break e;else switch(s[r+2>>1]|0){case 47:{E();break a}case 42:{y(e);break a}default:{a=47;break e}}}while(0);i=t[65]|0;r=i+2|0;t[65]=r;}while(i>>>0<(t[66]|0)>>>0);return a|0}function d(e){e=e|0;var a=0,r=0,i=0,c=0;c=t[66]|0;a=t[65]|0;while(1){i=a+2|0;if(a>>>0>=c>>>0){a=9;break}r=s[i>>1]|0;if(r<<16>>16==e<<16>>16){a=10;break}if(r<<16>>16==92){r=a+4|0;if((s[r>>1]|0)==13){a=a+6|0;a=(s[a>>1]|0)==10?a:r;}else a=r;}else if(X(r)|0){a=9;break}else a=i;}if((a|0)==9){t[65]=i;Q();}else if((a|0)==10)t[65]=i;return}function v(e,a){e=e|0;a=a|0;var r=0,i=0,c=0,f=0;r=t[65]|0;i=s[r>>1]|0;f=(e|0)==(a|0);c=f?0:e;f=f?0:a;if(i<<16>>16==97){t[65]=r+4;r=w(1)|0;e=t[65]|0;if(T(r)|0){d(r);a=(t[65]|0)+2|0;t[65]=a;}else {P(r)|0;a=t[65]|0;}i=w(1)|0;r=t[65]|0;}if((r|0)!=(e|0))O(e,a,c,f);return i|0}function A(e,a,r,s){e=e|0;a=a|0;r=r|0;s=s|0;var c=0,f=0;c=t[60]|0;t[60]=c+32;f=t[56]|0;t[((f|0)==0?208:f+28|0)>>2]=c;t[57]=f;t[56]=c;t[c+8>>2]=e;if(2==(s|0))e=r;else e=1==(s|0)?r+2|0:0;t[c+12>>2]=e;t[c>>2]=a;t[c+4>>2]=r;t[c+16>>2]=0;t[c+20>>2]=s;i[c+24>>0]=1==(s|0)&1;t[c+28>>2]=0;return}function C(){var e=0,a=0,r=0;r=t[66]|0;a=t[65]|0;e:while(1){e=a+2|0;if(a>>>0>=r>>>0){a=6;break}switch(s[e>>1]|0){case 13:case 10:{a=6;break e}case 93:{a=7;break e}case 92:{e=a+4|0;break}default:{}}a=e;}if((a|0)==6){t[65]=e;Q();e=0;}else if((a|0)==7){t[65]=e;e=93;}return e|0}function g(){var e=0,a=0,r=0;e:while(1){e=t[65]|0;a=e+2|0;t[65]=a;if(e>>>0>=(t[66]|0)>>>0){r=7;break}switch(s[a>>1]|0){case 13:case 10:{r=7;break e}case 47:break e;case 91:{C()|0;break}case 92:{t[65]=e+4;break}default:{}}}if((r|0)==7)Q();return}function p(e){e=e|0;switch(s[e>>1]|0){case 62:{e=(s[e+-2>>1]|0)==61;break}case 41:case 59:{e=1;break}case 104:{e=S(e+-2|0,180,4)|0;break}case 121:{e=S(e+-2|0,188,6)|0;break}case 101:{e=S(e+-2|0,200,3)|0;break}default:e=0;}return e|0}function y(e){e=e|0;var a=0,r=0,i=0,c=0,f=0;c=(t[65]|0)+2|0;t[65]=c;r=t[66]|0;while(1){a=c+2|0;if(c>>>0>=r>>>0)break;i=s[a>>1]|0;if(!e?X(i)|0:0)break;if(i<<16>>16==42?(s[c+4>>1]|0)==47:0){f=8;break}c=a;}if((f|0)==8){t[65]=a;a=c+4|0;}t[65]=a;return}function m(e,a,r){e=e|0;a=a|0;r=r|0;var s=0,t=0;e:do{if(!r)e=0;else {while(1){s=i[e>>0]|0;t=i[a>>0]|0;if(s<<24>>24!=t<<24>>24)break;r=r+-1|0;if(!r){e=0;break e}else {e=e+1|0;a=a+1|0;}}e=(s&255)-(t&255)|0;}}while(0);return e|0}function I(e){e=e|0;e:do{switch(e<<16>>16){case 38:case 37:case 33:{e=1;break}default:if((e&-8)<<16>>16==40|(e+-58&65535)<6)e=1;else {switch(e<<16>>16){case 91:case 93:case 94:{e=1;break e}default:{}}e=(e+-123&65535)<4;}}}while(0);return e|0}function U(e){e=e|0;e:do{switch(e<<16>>16){case 38:case 37:case 33:break;default:if(!((e+-58&65535)<6|(e+-40&65535)<7&e<<16>>16!=41)){switch(e<<16>>16){case 91:case 94:break e;default:{}}return e<<16>>16!=125&(e+-123&65535)<4|0}}}while(0);return 1}function x(e){e=e|0;var a=0,r=0,i=0,c=0;r=n;n=n+16|0;i=r;t[i>>2]=0;t[59]=e;a=t[3]|0;c=a+(e<<1)|0;e=c+2|0;s[c>>1]=0;t[i>>2]=e;t[60]=e;t[52]=0;t[56]=0;t[54]=0;t[53]=0;t[58]=0;t[55]=0;n=r;return a|0}function S(e,a,r){e=e|0;a=a|0;r=r|0;var i=0,c=0;i=e+(0-r<<1)|0;c=i+2|0;e=t[3]|0;if(c>>>0>=e>>>0?(m(c,a,r<<1)|0)==0:0)if((c|0)==(e|0))e=1;else e=B(s[i>>1]|0)|0;else e=0;return e|0}function O(e,a,r,i){e=e|0;a=a|0;r=r|0;i=i|0;var s=0,c=0;s=t[60]|0;t[60]=s+20;c=t[58]|0;t[((c|0)==0?212:c+16|0)>>2]=s;t[58]=s;t[s>>2]=e;t[s+4>>2]=a;t[s+8>>2]=r;t[s+12>>2]=i;t[s+16>>2]=0;return}function $(e){e=e|0;switch(s[e>>1]|0){case 107:{e=S(e+-2|0,114,4)|0;break}case 101:{if((s[e+-2>>1]|0)==117)e=S(e+-4|0,86,6)|0;else e=0;break}default:e=0;}return e|0}function j(e,a){e=e|0;a=a|0;var r=0;r=t[3]|0;if(r>>>0<=e>>>0?(s[e>>1]|0)==a<<16>>16:0)if((r|0)==(e|0))r=1;else r=B(s[e+-2>>1]|0)|0;else r=0;return r|0}function B(e){e=e|0;e:do{if((e+-9&65535)<5)e=1;else {switch(e<<16>>16){case 32:case 160:{e=1;break e}default:{}}e=e<<16>>16!=46&(I(e)|0);}}while(0);return e|0}function E(){var e=0,a=0,r=0;e=t[66]|0;r=t[65]|0;e:while(1){a=r+2|0;if(r>>>0>=e>>>0)break;switch(s[a>>1]|0){case 13:case 10:break e;default:r=a;}}t[65]=a;return}function P(e){e=e|0;while(1){if(R(e)|0)break;if(I(e)|0)break;e=(t[65]|0)+2|0;t[65]=e;e=s[e>>1]|0;if(!(e<<16>>16)){e=0;break}}return e|0}function q(){var e=0;e=t[(t[54]|0)+20>>2]|0;switch(e|0){case 1:{e=-1;break}case 2:{e=-2;break}default:e=e-(t[3]|0)>>1;}return e|0}function z(e){e=e|0;if(!(S(e,160,5)|0)?!(S(e,170,3)|0):0)e=S(e,176,2)|0;else e=1;return e|0}function D(e){e=e|0;switch(e<<16>>16){case 160:case 32:case 12:case 11:case 9:{e=1;break}default:e=0;}return e|0}function F(e){e=e|0;if((t[3]|0)==(e|0))e=1;else e=B(s[e+-2>>1]|0)|0;return e|0}function G(){var e=0;e=t[(t[55]|0)+12>>2]|0;if(!e)e=-1;else e=e-(t[3]|0)>>1;return e|0}function H(){var e=0;e=t[(t[54]|0)+12>>2]|0;if(!e)e=-1;else e=e-(t[3]|0)>>1;return e|0}function J(){var e=0;e=t[(t[55]|0)+8>>2]|0;if(!e)e=-1;else e=e-(t[3]|0)>>1;return e|0}function K(){var e=0;e=t[(t[54]|0)+16>>2]|0;if(!e)e=-1;else e=e-(t[3]|0)>>1;return e|0}function L(){var e=0;e=t[(t[54]|0)+4>>2]|0;if(!e)e=-1;else e=e-(t[3]|0)>>1;return e|0}function M(){var e=0;e=t[54]|0;e=t[((e|0)==0?208:e+28|0)>>2]|0;t[54]=e;return (e|0)!=0|0}function N(){var e=0;e=t[55]|0;e=t[((e|0)==0?212:e+16|0)>>2]|0;t[55]=e;return (e|0)!=0|0}function Q(){i[774]=1;t[61]=(t[65]|0)-(t[3]|0)>>1;t[65]=(t[66]|0)+2;return}function R(e){e=e|0;return (e|128)<<16>>16==160|(e+-9&65535)<5|0}function T(e){e=e|0;return e<<16>>16==39|e<<16>>16==34|0}function V(){return (t[(t[54]|0)+8>>2]|0)-(t[3]|0)>>1|0}function W(){return (t[(t[55]|0)+4>>2]|0)-(t[3]|0)>>1|0}function X(e){e=e|0;return e<<16>>16==13|e<<16>>16==10|0}function Y(){return (t[t[54]>>2]|0)-(t[3]|0)>>1|0}function Z(){return (t[t[55]>>2]|0)-(t[3]|0)>>1|0}function _(){return c[(t[54]|0)+24>>0]|0|0}function ee(e){e=e|0;t[3]=e;return}function ae(){return (i[775]|0)!=0|0}function re(){return t[61]|0}function ie(e){e=e|0;n=e+992+15&-16;return 992}return {su:ie,ai:K,e:re,ee:W,ele:G,els:J,es:Z,f:ae,id:q,ie:L,ip:_,is:Y,p:b,re:N,ri:M,sa:x,se:H,ses:ee,ss:V}}(\"undefined\"!=typeof self?self:global,{},a),r=e.su(i-(2<<17));}const h=c$1.length+1;e.ses(r),e.sa(h-1),s(c$1,new Uint16Array(a,r,h)),e.p()||(n=e.e(),o());const w=[],d=[];for(;e.ri();){const a=e.is(),r=e.ie(),i=e.ai(),s=e.id(),t=e.ss(),f=e.se();let n;e.ip()&&(n=b(-1===s?a:a+1,c$1.charCodeAt(-1===s?a-1:a))),w.push({n:n,s:a,e:r,ss:t,se:f,d:s,a:i});}for(;e.re();){const a=e.es(),r=e.ee(),i=e.els(),s=e.ele(),t=c$1.charCodeAt(a),f=i>=0?c$1.charCodeAt(i):-1;d.push({s:a,e:r,ls:i,le:s,n:34===t||39===t?b(a+1,t):c$1.slice(a,r),ln:i<0?void 0:34===f||39===f?b(i+1,f):c$1.slice(i,s)});}return [w,d,!!e.f()]}function b(e,a){n=e;let r=\"\",i=n;for(;;){n>=c$1.length&&o();const e=c$1.charCodeAt(n);if(e===a)break;92===e?(r+=c$1.slice(i,n),r+=l(),i=n):(8232===e||8233===e||u(e)&&o(),++n);}return r+=c$1.slice(i,n++),r}function l(){let e=c$1.charCodeAt(++n);switch(++n,e){case 110:return \"\\n\";case 114:return \"\\r\";case 120:return String.fromCharCode(k(2));case 117:return function(){let e;123===c$1.charCodeAt(n)?(++n,e=k(c$1.indexOf(\"}\",n)-n),++n,e>1114111&&o()):e=k(4);return e<=65535?String.fromCharCode(e):(e-=65536,String.fromCharCode(55296+(e>>10),56320+(1023&e)))}();case 116:return \"\\t\";case 98:return \"\\b\";case 118:return \"\\v\";case 102:return \"\\f\";case 13:10===c$1.charCodeAt(n)&&++n;case 10:return \"\";case 56:case 57:o();default:if(e>=48&&e<=55){let a=c$1.substr(n-1,3).match(/^[0-7]+/)[0],r=parseInt(a,8);return r>255&&(a=a.slice(0,-1),r=parseInt(a,8)),n+=a.length-1,e=c$1.charCodeAt(n),\"0\"===a&&56!==e&&57!==e||o(),String.fromCharCode(r)}return u(e)?\"\":String.fromCharCode(e)}}function k(e){const a=n;let r=0,i=0;for(let a=0;a<e;++a,++n){let e,s=c$1.charCodeAt(n);if(95!==s){if(s>=97)e=s-97+10;else if(s>=65)e=s-65+10;else {if(!(s>=48&&s<=57))break;e=s-48;}if(e>=16)break;i=s,r=16*r+e;}else 95!==i&&0!==a||o(),i=s;}return 95!==i&&n-a===e||o(),r}function u(e){return 13===e||10===e}function o(){throw Object.assign(Error(`Parse error ${f}:${c$1.slice(0,n).split(\"\\n\").length}:${n-c$1.lastIndexOf(\"\\n\",n-1)}`),{idx:n})}\n\n  async function _resolve (id, parentUrl) {\n    const urlResolved = resolveIfNotPlainOrUrl(id, parentUrl);\n    return {\n      r: resolveImportMap(importMap, urlResolved || id, parentUrl) || throwUnresolved(id, parentUrl),\n      // b = bare specifier\n      b: !urlResolved && !isURL(id)\n    };\n  }\n\n  const resolve = resolveHook ? async (id, parentUrl) => {\n    let result = resolveHook(id, parentUrl, defaultResolve);\n    // will be deprecated in next major\n    if (result && result.then)\n      result = await result;\n    return result ? { r: result, b: !resolveIfNotPlainOrUrl(id, parentUrl) && !isURL(id) } : _resolve(id, parentUrl);\n  } : _resolve;\n\n  // importShim('mod');\n  // importShim('mod', { opts });\n  // importShim('mod', { opts }, parentUrl);\n  // importShim('mod', parentUrl);\n  async function importShim (id, ...args) {\n    // parentUrl if present will be the last argument\n    let parentUrl = args[args.length - 1];\n    if (typeof parentUrl !== 'string')\n      parentUrl = baseUrl;\n    // needed for shim check\n    await initPromise;\n    if (importHook) await importHook(id, typeof args[1] !== 'string' ? args[1] : {}, parentUrl);\n    if (acceptingImportMaps || shimMode || !baselinePassthrough) {\n      if (hasDocument)\n        processScriptsAndPreloads(true);\n      if (!shimMode)\n        acceptingImportMaps = false;\n    }\n    await importMapPromise;\n    return topLevelLoad((await resolve(id, parentUrl)).r, { credentials: 'same-origin' });\n  }\n\n  self.importShim = importShim;\n\n  function defaultResolve (id, parentUrl) {\n    return resolveImportMap(importMap, resolveIfNotPlainOrUrl(id, parentUrl) || id, parentUrl) || throwUnresolved(id, parentUrl);\n  }\n\n  function throwUnresolved (id, parentUrl) {\n    throw Error(`Unable to resolve specifier '${id}'${fromParent(parentUrl)}`);\n  }\n\n  const resolveSync = (id, parentUrl = baseUrl) => {\n    parentUrl = `${parentUrl}`;\n    const result = resolveHook && resolveHook(id, parentUrl, defaultResolve);\n    return result && !result.then ? result : defaultResolve(id, parentUrl);\n  };\n\n  function metaResolve (id, parentUrl = this.url) {\n    return resolveSync(id, parentUrl);\n  }\n\n  importShim.resolve = resolveSync;\n  importShim.getImportMap = () => JSON.parse(JSON.stringify(importMap));\n  importShim.addImportMap = importMapIn => {\n    if (!shimMode) throw new Error('Unsupported in polyfill mode.');\n    importMap = resolveAndComposeImportMap(importMapIn, baseUrl, importMap);\n  };\n\n  const registry = importShim._r = {};\n\n  async function loadAll (load, seen) {\n    if (load.b || seen[load.u])\n      return;\n    seen[load.u] = 1;\n    await load.L;\n    await Promise.all(load.d.map(dep => loadAll(dep, seen)));\n    if (!load.n)\n      load.n = load.d.some(dep => dep.n);\n  }\n\n  let importMap = { imports: {}, scopes: {} };\n  let baselinePassthrough;\n\n  const initPromise = featureDetectionPromise.then(() => {\n    baselinePassthrough = esmsInitOptions.polyfillEnable !== true && supportsDynamicImport && supportsImportMeta && supportsImportMaps && (!jsonModulesEnabled || supportsJsonAssertions) && (!cssModulesEnabled || supportsCssAssertions) && !importMapSrcOrLazy && !false;\n    if (hasDocument) {\n      if (!supportsImportMaps) {\n        const supports = HTMLScriptElement.supports || (type => type === 'classic' || type === 'module');\n        HTMLScriptElement.supports = type => type === 'importmap' || supports(type);\n      }\n      if (shimMode || !baselinePassthrough) {\n        new MutationObserver(mutations => {\n          for (const mutation of mutations) {\n            if (mutation.type !== 'childList') continue;\n            for (const node of mutation.addedNodes) {\n              if (node.tagName === 'SCRIPT') {\n                if (node.type === (shimMode ? 'module-shim' : 'module'))\n                  processScript(node, true);\n                if (node.type === (shimMode ? 'importmap-shim' : 'importmap'))\n                  processImportMap(node, true);\n              }\n              else if (node.tagName === 'LINK' && node.rel === (shimMode ? 'modulepreload-shim' : 'modulepreload')) {\n                processPreload(node);\n              }\n            }\n          }\n        }).observe(document, {childList: true, subtree: true});\n        processScriptsAndPreloads();\n        if (document.readyState === 'complete') {\n          readyStateCompleteCheck();\n        }\n        else {\n          async function readyListener() {\n            await initPromise;\n            processScriptsAndPreloads();\n            if (document.readyState === 'complete') {\n              readyStateCompleteCheck();\n              document.removeEventListener('readystatechange', readyListener);\n            }\n          }\n          document.addEventListener('readystatechange', readyListener);\n        }\n      }\n    }\n    return undefined;\n  });\n  let importMapPromise = initPromise;\n  let firstPolyfillLoad = true;\n  let acceptingImportMaps = true;\n\n  async function topLevelLoad (url, fetchOpts, source, nativelyLoaded, lastStaticLoadPromise) {\n    if (!shimMode)\n      acceptingImportMaps = false;\n    await initPromise;\n    await importMapPromise;\n    if (importHook) await importHook(url, typeof fetchOpts !== 'string' ? fetchOpts : {}, '');\n    // early analysis opt-out - no need to even fetch if we have feature support\n    if (!shimMode && baselinePassthrough) {\n      // for polyfill case, only dynamic import needs a return value here, and dynamic import will never pass nativelyLoaded\n      if (nativelyLoaded)\n        return null;\n      await lastStaticLoadPromise;\n      return dynamicImport(source ? createBlob(source) : url, { errUrl: url || source });\n    }\n    const load = getOrCreateLoad(url, fetchOpts, null, source);\n    const seen = {};\n    await loadAll(load, seen);\n    lastLoad = undefined;\n    resolveDeps(load, seen);\n    await lastStaticLoadPromise;\n    if (source && !shimMode && !load.n && !false) {\n      const module = await dynamicImport(createBlob(source), { errUrl: source });\n      if (revokeBlobURLs) revokeObjectURLs(Object.keys(seen));\n      return module;\n    }\n    if (firstPolyfillLoad && !shimMode && load.n && nativelyLoaded) {\n      onpolyfill();\n      firstPolyfillLoad = false;\n    }\n    const module = await dynamicImport(!shimMode && !load.n && nativelyLoaded ? load.u : load.b, { errUrl: load.u });\n    // if the top-level load is a shell, run its update function\n    if (load.s)\n      (await dynamicImport(load.s)).u$_(module);\n    if (revokeBlobURLs) revokeObjectURLs(Object.keys(seen));\n    // when tla is supported, this should return the tla promise as an actual handle\n    // so readystate can still correspond to the sync subgraph exec completions\n    return module;\n  }\n\n  function revokeObjectURLs(registryKeys) {\n    let batch = 0;\n    const keysLength = registryKeys.length;\n    const schedule = self.requestIdleCallback ? self.requestIdleCallback : self.requestAnimationFrame;\n    schedule(cleanup);\n    function cleanup() {\n      const batchStartIndex = batch * 100;\n      if (batchStartIndex > keysLength) return\n      for (const key of registryKeys.slice(batchStartIndex, batchStartIndex + 100)) {\n        const load = registry[key];\n        if (load) URL.revokeObjectURL(load.b);\n      }\n      batch++;\n      schedule(cleanup);\n    }\n  }\n\n  function urlJsString (url) {\n    return `'${url.replace(/'/g, \"\\\\'\")}'`;\n  }\n\n  let lastLoad;\n  function resolveDeps (load, seen) {\n    if (load.b || !seen[load.u])\n      return;\n    seen[load.u] = 0;\n\n    for (const dep of load.d)\n      resolveDeps(dep, seen);\n\n    const [imports, exports] = load.a;\n\n    // \"execution\"\n    const source = load.S;\n\n    // edge doesnt execute sibling in order, so we fix this up by ensuring all previous executions are explicit dependencies\n    let resolvedSource = edge && lastLoad ? `import '${lastLoad}';` : '';\n\n    if (!imports.length) {\n      resolvedSource += source;\n    }\n    else {\n      // once all deps have loaded we can inline the dependency resolution blobs\n      // and define this blob\n      let lastIndex = 0, depIndex = 0, dynamicImportEndStack = [];\n      function pushStringTo (originalIndex) {\n        while (dynamicImportEndStack[dynamicImportEndStack.length - 1] < originalIndex) {\n          const dynamicImportEnd = dynamicImportEndStack.pop();\n          resolvedSource += `${source.slice(lastIndex, dynamicImportEnd)}, ${urlJsString(load.r)}`;\n          lastIndex = dynamicImportEnd;\n        }\n        resolvedSource += source.slice(lastIndex, originalIndex);\n        lastIndex = originalIndex;\n      }\n      for (const { s: start, ss: statementStart, se: statementEnd, d: dynamicImportIndex } of imports) {\n        // dependency source replacements\n        if (dynamicImportIndex === -1) {\n          let depLoad = load.d[depIndex++], blobUrl = depLoad.b, cycleShell = !blobUrl;\n          if (cycleShell) {\n            // circular shell creation\n            if (!(blobUrl = depLoad.s)) {\n              blobUrl = depLoad.s = createBlob(`export function u$_(m){${\n              depLoad.a[1].map(({ s, e }, i) => {\n                const q = depLoad.S[s] === '\"' || depLoad.S[s] === \"'\";\n                return `e$_${i}=m${q ? `[` : '.'}${depLoad.S.slice(s, e)}${q ? `]` : ''}`;\n              }).join(',')\n            }}${\n              depLoad.a[1].length ? `let ${depLoad.a[1].map((_, i) => `e$_${i}`).join(',')};` : ''\n            }export {${\n              depLoad.a[1].map(({ s, e }, i) => `e$_${i} as ${depLoad.S.slice(s, e)}`).join(',')\n            }}\\n//# sourceURL=${depLoad.r}?cycle`);\n            }\n          }\n\n          pushStringTo(start - 1);\n          resolvedSource += `/*${source.slice(start - 1, statementEnd)}*/${urlJsString(blobUrl)}`;\n\n          // circular shell execution\n          if (!cycleShell && depLoad.s) {\n            resolvedSource += `;import*as m$_${depIndex} from'${depLoad.b}';import{u$_ as u$_${depIndex}}from'${depLoad.s}';u$_${depIndex}(m$_${depIndex})`;\n            depLoad.s = undefined;\n          }\n          lastIndex = statementEnd;\n        }\n        // import.meta\n        else if (dynamicImportIndex === -2) {\n          load.m = { url: load.r, resolve: metaResolve };\n          metaHook(load.m, load.u);\n          pushStringTo(start);\n          resolvedSource += `importShim._r[${urlJsString(load.u)}].m`;\n          lastIndex = statementEnd;\n        }\n        // dynamic import\n        else {\n          pushStringTo(statementStart + 6);\n          resolvedSource += `Shim(`;\n          dynamicImportEndStack.push(statementEnd - 1);\n          lastIndex = start;\n        }\n      }\n\n      // support progressive cycle binding updates\n      if (load.s)\n        resolvedSource += `\\n;import{u$_}from'${load.s}';u$_({ ${exports.filter(e => e.ln).map(({ s, e, ln }) => `${source.slice(s, e)}: ${ln}`).join(',')} });\\n`;\n\n      pushStringTo(source.length);\n    }\n\n    let hasSourceURL = false;\n    resolvedSource = resolvedSource.replace(sourceMapURLRegEx, (match, isMapping, url) => (hasSourceURL = !isMapping, match.replace(url, () => new URL(url, load.r))));\n    if (!hasSourceURL)\n      resolvedSource += '\\n//# sourceURL=' + load.r;\n\n    load.b = lastLoad = createBlob(resolvedSource);\n    load.S = undefined;\n  }\n\n  // ; and // trailer support added for Ruby on Rails 7 source maps compatibility\n  // https://github.com/guybedford/es-module-shims/issues/228\n  const sourceMapURLRegEx = /\\n\\/\\/# source(Mapping)?URL=([^\\n]+)\\s*((;|\\/\\/[^#][^\\n]*)\\s*)*$/;\n\n  const jsContentType = /^(text|application)\\/(x-)?javascript(;|$)/;\n  const jsonContentType = /^(text|application)\\/json(;|$)/;\n  const cssContentType = /^(text|application)\\/css(;|$)/;\n\n  const cssUrlRegEx = /url\\(\\s*(?:([\"'])((?:\\\\.|[^\\n\\\\\"'])+)\\1|((?:\\\\.|[^\\s,\"'()\\\\])+))\\s*\\)/g;\n\n  // restrict in-flight fetches to a pool of 100\n  let p = [];\n  let c = 0;\n  function pushFetchPool () {\n    if (++c > 100)\n      return new Promise(r => p.push(r));\n  }\n  function popFetchPool () {\n    c--;\n    if (p.length)\n      p.shift()();\n  }\n\n  async function doFetch (url, fetchOpts, parent) {\n    if (enforceIntegrity && !fetchOpts.integrity)\n      throw Error(`No integrity for ${url}${fromParent(parent)}.`);\n    const poolQueue = pushFetchPool();\n    if (poolQueue) await poolQueue;\n    try {\n      var res = await fetchHook(url, fetchOpts);\n    }\n    catch (e) {\n      e.message = `Unable to fetch ${url}${fromParent(parent)} - see network log for details.\\n` + e.message;\n      throw e;\n    }\n    finally {\n      popFetchPool();\n    }\n    if (!res.ok)\n      throw Error(`${res.status} ${res.statusText} ${res.url}${fromParent(parent)}`);\n    return res;\n  }\n\n  async function fetchModule (url, fetchOpts, parent) {\n    const res = await doFetch(url, fetchOpts, parent);\n    const contentType = res.headers.get('content-type');\n    if (jsContentType.test(contentType))\n      return { r: res.url, s: await res.text(), t: 'js' };\n    else if (jsonContentType.test(contentType))\n      return { r: res.url, s: `export default ${await res.text()}`, t: 'json' };\n    else if (cssContentType.test(contentType)) {\n      return { r: res.url, s: `var s=new CSSStyleSheet();s.replaceSync(${\n        JSON.stringify((await res.text()).replace(cssUrlRegEx, (_match, quotes = '', relUrl1, relUrl2) => `url(${quotes}${resolveUrl(relUrl1 || relUrl2, url)}${quotes})`))\n      });export default s;`, t: 'css' };\n    }\n    else\n      throw Error(`Unsupported Content-Type \"${contentType}\" loading ${url}${fromParent(parent)}. Modules must be served with a valid MIME type like application/javascript.`);\n  }\n\n  function getOrCreateLoad (url, fetchOpts, parent, source) {\n    let load = registry[url];\n    if (load && !source)\n      return load;\n\n    load = {\n      // url\n      u: url,\n      // response url\n      r: source ? url : undefined,\n      // fetchPromise\n      f: undefined,\n      // source\n      S: undefined,\n      // linkPromise\n      L: undefined,\n      // analysis\n      a: undefined,\n      // deps\n      d: undefined,\n      // blobUrl\n      b: undefined,\n      // shellUrl\n      s: undefined,\n      // needsShim\n      n: false,\n      // type\n      t: null,\n      // meta\n      m: null\n    };\n    if (registry[url]) {\n      let i = 0;\n      while (registry[load.u + ++i]);\n      load.u += i;\n    }\n    registry[load.u] = load;\n\n    load.f = (async () => {\n      if (!source) {\n        // preload fetch options override fetch options (race)\n        let t;\n        ({ r: load.r, s: source, t } = await (fetchCache[url] || fetchModule(url, fetchOpts, parent)));\n        if (t && !shimMode) {\n          if (t === 'css' && !cssModulesEnabled || t === 'json' && !jsonModulesEnabled)\n            throw Error(`${t}-modules require <script type=\"esms-options\">{ \"polyfillEnable\": [\"${t}-modules\"] }<${''}/script>`);\n          if (t === 'css' && !supportsCssAssertions || t === 'json' && !supportsJsonAssertions)\n            load.n = true;\n        }\n      }\n      try {\n        load.a = parse(source, load.u);\n      }\n      catch (e) {\n        throwError(e);\n        load.a = [[], [], false];\n      }\n      load.S = source;\n      return load;\n    })();\n\n    load.L = load.f.then(async () => {\n      let childFetchOpts = fetchOpts;\n      load.d = (await Promise.all(load.a[0].map(async ({ n, d }) => {\n        if (d >= 0 && !supportsDynamicImport || d === -2 && !supportsImportMeta)\n          load.n = true;\n        if (d !== -1 || !n) return;\n        const { r, b } = await resolve(n, load.r || load.u);\n        if (b && (!supportsImportMaps || importMapSrcOrLazy))\n          load.n = true;\n        if (skip && skip.test(r)) return { b: r };\n        if (childFetchOpts.integrity)\n          childFetchOpts = Object.assign({}, childFetchOpts, { integrity: undefined });\n        return getOrCreateLoad(r, childFetchOpts, load.r).f;\n      }))).filter(l => l);\n    });\n\n    return load;\n  }\n\n  function processScriptsAndPreloads (mapsOnly = false) {\n    if (!mapsOnly)\n      for (const link of document.querySelectorAll(shimMode ? 'link[rel=modulepreload-shim]' : 'link[rel=modulepreload]'))\n        processPreload(link);\n    for (const script of document.querySelectorAll(shimMode ? 'script[type=importmap-shim]' : 'script[type=importmap]'))\n      processImportMap(script);\n    if (!mapsOnly)\n      for (const script of document.querySelectorAll(shimMode ? 'script[type=module-shim]' : 'script[type=module]'))\n        processScript(script);\n  }\n\n  function getFetchOpts (script) {\n    const fetchOpts = {};\n    if (script.integrity)\n      fetchOpts.integrity = script.integrity;\n    if (script.referrerpolicy)\n      fetchOpts.referrerPolicy = script.referrerpolicy;\n    if (script.crossorigin === 'use-credentials')\n      fetchOpts.credentials = 'include';\n    else if (script.crossorigin === 'anonymous')\n      fetchOpts.credentials = 'omit';\n    else\n      fetchOpts.credentials = 'same-origin';\n    return fetchOpts;\n  }\n\n  let lastStaticLoadPromise = Promise.resolve();\n\n  let domContentLoadedCnt = 1;\n  function domContentLoadedCheck () {\n    if (--domContentLoadedCnt === 0 && !noLoadEventRetriggers)\n      document.dispatchEvent(new Event('DOMContentLoaded'));\n  }\n  // this should always trigger because we assume es-module-shims is itself a domcontentloaded requirement\n  if (hasDocument) {\n    document.addEventListener('DOMContentLoaded', async () => {\n      await initPromise;\n      if (shimMode || !baselinePassthrough)\n        domContentLoadedCheck();\n    });\n  }\n\n  let readyStateCompleteCnt = 1;\n  function readyStateCompleteCheck () {\n    if (--readyStateCompleteCnt === 0 && !noLoadEventRetriggers)\n      document.dispatchEvent(new Event('readystatechange'));\n  }\n\n  const hasNext = script => script.nextSibling || script.parentNode && hasNext(script.parentNode);\n  const epCheck = (script, ready) => script.ep || !ready && (!script.src && !script.innerHTML || !hasNext(script)) || script.getAttribute('noshim') !== null || !(script.ep = true);\n\n  function processImportMap (script, ready = readyStateCompleteCnt > 0) {\n    if (epCheck(script, ready)) return;\n    // we dont currently support multiple, external or dynamic imports maps in polyfill mode to match native\n    if (script.src) {\n      if (!shimMode)\n        return;\n      setImportMapSrcOrLazy();\n    }\n    if (acceptingImportMaps) {\n      importMapPromise = importMapPromise\n        .then(async () => {\n          importMap = resolveAndComposeImportMap(script.src ? await (await doFetch(script.src, getFetchOpts(script))).json() : JSON.parse(script.innerHTML), script.src || baseUrl, importMap);\n        })\n        .catch(e => {\n          console.log(e);\n          if (e instanceof SyntaxError)\n            e = new Error(`Unable to parse import map ${e.message} in: ${script.src || script.innerHTML}`);\n          throwError(e);\n        });\n      if (!shimMode)\n        acceptingImportMaps = false;\n    }\n  }\n\n  function processScript (script, ready = readyStateCompleteCnt > 0) {\n    if (epCheck(script, ready)) return;\n    // does this load block readystate complete\n    const isBlockingReadyScript = script.getAttribute('async') === null && readyStateCompleteCnt > 0;\n    // does this load block DOMContentLoaded\n    const isDomContentLoadedScript = domContentLoadedCnt > 0;\n    if (isBlockingReadyScript) readyStateCompleteCnt++;\n    if (isDomContentLoadedScript) domContentLoadedCnt++;\n    const loadPromise = topLevelLoad(script.src || baseUrl, getFetchOpts(script), !script.src && script.innerHTML, !shimMode, isBlockingReadyScript && lastStaticLoadPromise).catch(throwError);\n    if (isBlockingReadyScript)\n      lastStaticLoadPromise = loadPromise.then(readyStateCompleteCheck);\n    if (isDomContentLoadedScript)\n      loadPromise.then(domContentLoadedCheck);\n  }\n\n  const fetchCache = {};\n  function processPreload (link) {\n    if (link.ep) return;\n    link.ep = true;\n    if (fetchCache[link.href])\n      return;\n    fetchCache[link.href] = fetchModule(link.href, getFetchOpts(link));\n  }\n\n})();"
  },
  {
    "path": "examples/libs/fflate.module.js",
    "content": "/*!\nfflate - fast JavaScript compression/decompression\n<https://101arrowz.github.io/fflate>\nLicensed under MIT. https://github.com/101arrowz/fflate/blob/master/LICENSE\nversion 0.6.9\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 durl = function (c) { return URL.createObjectURL(new Blob([c], { type: 'text/javascript' })); };\nvar cwk = function (u) { return new Worker(u); };\ntry {\n    URL.revokeObjectURL(durl(''));\n}\ncatch (e) {\n    // We're in Deno or a very old browser\n    durl = function (c) { return 'data:application/javascript;charset=UTF-8,' + encodeURI(c); };\n    // If Deno, this is necessary; if not, this changes nothing\n    cwk = function (u) { return new Worker(u, { type: 'module' }); };\n}\nvar wk = (function (c, id, msg, transfer, cb) {\n    var w = cwk(ch2[id] || (ch2[id] = durl(c)));\n    w.onerror = function (e) { return cb(e.error, null); };\n    w.onmessage = function (e) { return cb(null, e.data); };\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, u32 = Uint32Array;\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\n// see fleb note\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 u32(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, r];\n};\nvar _a = freb(fleb, 2), fl = _a[0], revfl = _a[1];\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[0], revfd = _b[1];\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        ++l[cd[i] - 1];\n    // u16 \"map\": index -> minimum code for bit length = index\n    var le = new u16(mb);\n    for (i = 0; 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 / 8) | 0) + (p & 7 && 1); };\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    var n = new (v instanceof u16 ? u16 : v instanceof u32 ? u32 : u8)(e - s);\n    n.set(v.subarray(s, e));\n    return n;\n};\n// expands raw DEFLATE data\nvar inflt = function (dat, buf, st) {\n    // source length\n    var sl = dat.length;\n    if (!sl || (st && !st.l && sl < 5))\n        return buf || new u8(0);\n    // have to estimate size\n    var noBuf = !buf || st;\n    // no state\n    var noSt = !st || st.i;\n    if (!st)\n        st = {};\n    // Assumes roughly 33% compression ratio average\n    if (!buf)\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            st.f = 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                        throw 'unexpected EOF';\n                    break;\n                }\n                // ensure size\n                if (noBuf)\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;\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                throw 'invalid block type';\n            if (pos > tbts) {\n                if (noSt)\n                    throw 'unexpected EOF';\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 (noBuf)\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                    throw 'unexpected EOF';\n                break;\n            }\n            if (!c)\n                throw 'invalid length/literal';\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                    throw 'invalid distance';\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                        throw 'unexpected EOF';\n                    break;\n                }\n                if (noBuf)\n                    cbuf(bt + 131072);\n                var end = bt + add;\n                for (; bt < end; bt += 4) {\n                    buf[bt] = buf[bt - dt];\n                    buf[bt + 1] = buf[bt + 1 - dt];\n                    buf[bt + 2] = buf[bt + 2 - dt];\n                    buf[bt + 3] = buf[bt + 3 - dt];\n                }\n                bt = end;\n            }\n        }\n        st.l = lm, st.p = lpos, st.b = bt;\n        if (lm)\n            final = 1, st.m = lbt, st.d = dm, st.n = dbt;\n    } while (!final);\n    return bt == buf.length ? buf : slc(buf, 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 [et, 0];\n    if (s == 1) {\n        var v = new u8(t[0].s + 1);\n        v[t[0].s] = 1;\n        return [v, 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 [new u8(tr), 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 [cl.subarray(0, cli), 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[0], mlb = _a[1];\n    var _b = hTree(df, 15), ddt = _b[0], mdb = _b[1];\n    var _c = lc(dlt), lclt = _c[0], nlc = _c[1];\n    var _d = lc(ddt), lcdt = _d[0], ndc = _d[1];\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[0], mlcb = _e[1];\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 (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        if (syms[i] > 255) {\n            var len = (syms[i] >>> 18) & 31;\n            wbits16(out, p, lm[len + 257]), p += ll[len + 257];\n            if (len > 7)\n                wbits(out, p, (syms[i] >>> 23) & 31), p += fleb[len];\n            var dst = syms[i] & 31;\n            wbits16(out, p, dm[dst]), p += dl[dst];\n            if (dst > 3)\n                wbits16(out, p, (syms[i] >>> 5) & 8191), p += fdeb[dst];\n        }\n        else {\n            wbits16(out, p, lm[syms[i]]), p += ll[syms[i]];\n        }\n    }\n    wbits16(out, p, lm[256]);\n    return p + ll[256];\n};\n// deflate options (nice << 13) | chain\nvar deo = /*#__PURE__*/ new u32([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, lst) {\n    var s = 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 pos = 0;\n    if (!lvl || s < 8) {\n        for (var i = 0; i <= s; i += 65535) {\n            // end\n            var e = i + 65535;\n            if (e < s) {\n                // write full block\n                pos = wfblk(w, pos, dat.subarray(i, e));\n            }\n            else {\n                // write final block\n                w[i] = lst;\n                pos = wfblk(w, pos, dat.subarray(i, s));\n            }\n        }\n    }\n    else {\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 = new u16(32768), head = 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 u32(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  bitpos\n        var lc_1 = 0, eb = 0, i = 0, li = 0, wi = 0, bs = 0;\n        for (; i < s; ++i) {\n            // hash value\n            // deopt when i > s - 3 - at end, deopt acceptable\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) {\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 + 32768) & 32767;\n                                    var pti = prev[ti];\n                                    var cd = (ti - pti + 32768) & 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 + 32768) & 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 Uint32\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        pos = wblk(dat, w, lst, syms, lf, df, eb, li, bs, i - bs, pos);\n        // this is the easiest way to avoid needing to maintain state\n        if (!lst && pos & 7)\n            pos = wfblk(w, pos + 1, et);\n    }\n    return slc(o, 0, pre + shft(pos) + post);\n};\n// CRC32 table\nvar crct = /*#__PURE__*/ (function () {\n    var t = new u32(256);\n    for (var i = 0; i < 256; ++i) {\n        var c = i, k = 9;\n        while (--k)\n            c = ((c & 1) && 0xEDB88320) ^ (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// Alder32\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;\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 >>> 8) << 16 | (b & 255) << 8 | (b >>> 8);\n        }\n    };\n};\n;\n// deflate with opts\nvar dopt = function (dat, opt, pre, post, st) {\n    return dflt(dat, opt.level == null ? 6 : opt.level, opt.mem == null ? Math.ceil(Math.max(8, Math.min(13, Math.log(dat.length))) * 1.5) : (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(/ /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, td];\n};\nvar ch = [];\n// clone bufs\nvar cbfs = function (v) {\n    var tl = [];\n    for (var k in v) {\n        if (v[k] instanceof u8 || v[k] instanceof u16 || v[k] instanceof u32)\n            tl.push((v[k] = new v[k].constructor(v[k])).buffer);\n    }\n    return tl;\n};\n// use a worker to execute code\nvar wrkr = function (fns, init, id, cb) {\n    var _a;\n    if (!ch[id]) {\n        var fnStr = '', td_1 = {}, m = fns.length - 1;\n        for (var i = 0; i < m; ++i)\n            _a = wcln(fns[i], fnStr, td_1), fnStr = _a[0], td_1 = _a[1];\n        ch[id] = wcln(fns[m], fnStr, td_1);\n    }\n    var td = mrg({}, ch[id][1]);\n    return wk(ch[id][0] + ';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, u32, fleb, fdeb, clim, fl, fd, flrm, fdrm, rev, hMap, max, bits, bits16, shft, slc, inflt, inflateSync, pbf, gu8]; };\nvar bDflt = function () { return [u8, u16, u32, 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 [zlv]; };\n// post buf\nvar pbf = function (msg) { return postMessage(msg, [msg.buffer]); };\n// get u8\nvar gu8 = function (o) { return o && o.size && new u8(o.size); };\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) { return strm.push(ev.data[0], ev.data[1]); };\n};\n// async stream attach\nvar astrmify = function (fns, strm, opts, init, id) {\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 {\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.push = function (d, f) {\n        if (t)\n            throw 'stream finished';\n        if (!strm.ondata)\n            throw 'no stream handler';\n        w.postMessage([d, t = f], [d.buffer]);\n    };\n    strm.terminate = function () { w.terminate(); };\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        throw '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) | (fl ? (32 - 2 * fl) : 1);\n};\n// zlib valid\nvar zlv = function (d) {\n    if ((d[0] & 15) != 8 || (d[0] >>> 4) > 7 || ((d[0] << 8 | d[1]) % 31))\n        throw 'invalid zlib data';\n    if (d[1] & 32)\n        throw 'invalid zlib data: preset dictionaries not supported';\n};\nfunction AsyncCmpStrm(opts, cb) {\n    if (!cb && typeof opts == 'function')\n        cb = opts, opts = {};\n    this.ondata = cb;\n    return opts;\n}\n// zlib footer: -4 to -0 is Adler32\n/**\n * Streaming DEFLATE compression\n */\nvar Deflate = /*#__PURE__*/ (function () {\n    function Deflate(opts, cb) {\n        if (!cb && typeof opts == 'function')\n            cb = opts, opts = {};\n        this.ondata = cb;\n        this.o = opts || {};\n    }\n    Deflate.prototype.p = function (c, f) {\n        this.ondata(dopt(c, this.o, 0, 0, !f), 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.d)\n            throw 'stream finished';\n        if (!this.ondata)\n            throw 'no stream handler';\n        this.d = final;\n        this.p(chunk, final || false);\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, AsyncCmpStrm.call(this, opts, cb), function (ev) {\n            var strm = new Deflate(ev.data);\n            onmessage = astrm(strm);\n        }, 6);\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        throw 'no callback';\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    /**\n     * Creates an inflation stream\n     * @param cb The callback to call whenever data is inflated\n     */\n    function Inflate(cb) {\n        this.s = {};\n        this.p = new u8(0);\n        this.ondata = cb;\n    }\n    Inflate.prototype.e = function (c) {\n        if (this.d)\n            throw 'stream finished';\n        if (!this.ondata)\n            throw 'no stream handler';\n        var l = this.p.length;\n        var n = new u8(l + c.length);\n        n.set(this.p), n.set(c, l), this.p = n;\n    };\n    Inflate.prototype.c = function (final) {\n        this.d = this.s.i = final || false;\n        var bts = this.s.b;\n        var dt = inflt(this.p, this.o, this.s);\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    /**\n     * Creates an asynchronous inflation stream\n     * @param cb The callback to call whenever data is deflated\n     */\n    function AsyncInflate(cb) {\n        this.ondata = cb;\n        astrmify([\n            bInflt,\n            function () { return [astrm, Inflate]; }\n        ], this, 0, function () {\n            var strm = new Inflate();\n            onmessage = astrm(strm);\n        }, 7);\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        throw 'no callback';\n    return cbify(data, opts, [\n        bInflt\n    ], function (ev) { return pbf(inflateSync(ev.data[0], gu8(ev.data[1]))); }, 1, cb);\n}\n/**\n * Expands DEFLATE data with no wrapper\n * @param data The data to decompress\n * @param out Where to write the data. Saves memory if you know the decompressed size and provide an output buffer of that length.\n * @returns The decompressed version of the data\n */\nexport function inflateSync(data, out) {\n    return inflt(data, out);\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        Deflate.prototype.push.call(this, chunk, final);\n    };\n    Gzip.prototype.p = function (c, f) {\n        this.c.p(c);\n        this.l += c.length;\n        var raw = dopt(c, this.o, this.v && gzhl(this.o), f && 8, !f);\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    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, AsyncCmpStrm.call(this, opts, cb), function (ev) {\n            var strm = new Gzip(ev.data);\n            onmessage = astrm(strm);\n        }, 8);\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        throw 'no callback';\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 GZIP decompression\n */\nvar Gunzip = /*#__PURE__*/ (function () {\n    /**\n     * Creates a GUNZIP stream\n     * @param cb The callback to call whenever data is inflated\n     */\n    function Gunzip(cb) {\n        this.v = 1;\n        Inflate.call(this, 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        if (this.v) {\n            var s = this.p.length > 3 ? gzs(this.p) : 4;\n            if (s >= this.p.length && !final)\n                return;\n            this.p = this.p.subarray(s), this.v = 0;\n        }\n        if (final) {\n            if (this.p.length < 8)\n                throw 'invalid gzip stream';\n            this.p = this.p.subarray(0, -8);\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 Gunzip;\n}());\nexport { Gunzip };\n/**\n * Asynchronous streaming GZIP decompression\n */\nvar AsyncGunzip = /*#__PURE__*/ (function () {\n    /**\n     * Creates an asynchronous GUNZIP stream\n     * @param cb The callback to call whenever data is deflated\n     */\n    function AsyncGunzip(cb) {\n        this.ondata = cb;\n        astrmify([\n            bInflt,\n            guze,\n            function () { return [astrm, Inflate, Gunzip]; }\n        ], this, 0, function () {\n            var strm = new Gunzip();\n            onmessage = astrm(strm);\n        }, 9);\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        throw 'no callback';\n    return cbify(data, opts, [\n        bInflt,\n        guze,\n        function () { return [gunzipSync]; }\n    ], function (ev) { return pbf(gunzipSync(ev.data[0])); }, 3, cb);\n}\n/**\n * Expands GZIP data\n * @param data The data to decompress\n * @param out Where to write the data. GZIP already encodes the output size, so providing this doesn't save memory.\n * @returns The decompressed version of the data\n */\nexport function gunzipSync(data, out) {\n    return inflt(data.subarray(gzs(data), -8), out || new u8(gzl(data)));\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        Deflate.prototype.push.call(this, chunk, final);\n    };\n    Zlib.prototype.p = function (c, f) {\n        this.c.p(c);\n        var raw = dopt(c, this.o, this.v && 2, f && 4, !f);\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    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, AsyncCmpStrm.call(this, opts, cb), function (ev) {\n            var strm = new Zlib(ev.data);\n            onmessage = astrm(strm);\n        }, 10);\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        throw 'no callback';\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, 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    /**\n     * Creates a Zlib decompression stream\n     * @param cb The callback to call whenever data is inflated\n     */\n    function Unzlib(cb) {\n        this.v = 1;\n        Inflate.call(this, cb);\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 < 2 && !final)\n                return;\n            this.p = this.p.subarray(2), this.v = 0;\n        }\n        if (final) {\n            if (this.p.length < 4)\n                throw 'invalid zlib stream';\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    /**\n     * Creates an asynchronous Zlib decompression stream\n     * @param cb The callback to call whenever data is deflated\n     */\n    function AsyncUnzlib(cb) {\n        this.ondata = cb;\n        astrmify([\n            bInflt,\n            zule,\n            function () { return [astrm, Inflate, Unzlib]; }\n        ], this, 0, function () {\n            var strm = new Unzlib();\n            onmessage = astrm(strm);\n        }, 11);\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        throw 'no callback';\n    return cbify(data, opts, [\n        bInflt,\n        zule,\n        function () { return [unzlibSync]; }\n    ], function (ev) { return pbf(unzlibSync(ev.data[0], gu8(ev.data[1]))); }, 5, cb);\n}\n/**\n * Expands Zlib data\n * @param data The data to decompress\n * @param out Where to write the data. Saves memory if you know the decompressed size and provide an output buffer of that length.\n * @returns The decompressed version of the data\n */\nexport function unzlibSync(data, out) {\n    return inflt((zlv(data), data.subarray(2, -4)), out);\n}\n// Default algorithm for compression (used because having a known output size allows faster decompression)\nexport { gzip as compress, AsyncGzip as AsyncCompress };\n// Default algorithm for compression (used because having a known output size allows faster decompression)\nexport { gzipSync as compressSync, Gzip as Compress };\n/**\n * Streaming GZIP, Zlib, or raw DEFLATE decompression\n */\nvar Decompress = /*#__PURE__*/ (function () {\n    /**\n     * Creates a decompression stream\n     * @param cb The callback to call whenever data is decompressed\n     */\n    function Decompress(cb) {\n        this.G = Gunzip;\n        this.I = Inflate;\n        this.Z = Unzlib;\n        this.ondata = cb;\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            throw 'no stream handler';\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                var _this_1 = this;\n                var cb = function () { _this_1.ondata.apply(_this_1, arguments); };\n                this.s = (this.p[0] == 31 && this.p[1] == 139 && this.p[2] == 8)\n                    ? new this.G(cb)\n                    : ((this.p[0] & 15) != 8 || (this.p[0] >> 4) > 7 || ((this.p[0] << 8 | this.p[1]) % 31))\n                        ? new this.I(cb)\n                        : new this.Z(cb);\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    /**\n   * Creates an asynchronous decompression stream\n   * @param cb The callback to call whenever data is decompressed\n   */\n    function AsyncDecompress(cb) {\n        this.G = AsyncGunzip;\n        this.I = AsyncInflate;\n        this.Z = AsyncUnzlib;\n        this.ondata = cb;\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        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        throw 'no callback';\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 out Where to write the data. Saves memory if you know the decompressed size and provide an output buffer of that length.\n * @returns The decompressed version of the data\n */\nexport function decompressSync(data, out) {\n    return (data[0] == 31 && data[1] == 139 && data[2] == 8)\n        ? gunzipSync(data, out)\n        : ((data[0] & 15) != 8 || (data[0] >> 4) > 7 || ((data[0] << 8 | data[1]) % 31))\n            ? inflateSync(data, out)\n            : unzlibSync(data, out);\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;\n        if (val instanceof u8)\n            t[n] = [val, o];\n        else if (Array.isArray(val))\n            t[n] = [val[0], mrg(o, val[1])];\n        else\n            fltn(val, n + '/', t, o);\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 [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            throw 'no callback';\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                    throw 'invalid utf-8 data';\n                this.t = null;\n            }\n            return;\n        }\n        if (!this.p)\n            throw 'stream finished';\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), ch = _a[0], np = _a[1];\n        if (final) {\n            if (np.length)\n                throw 'invalid utf-8 data';\n            this.p = null;\n        }\n        else\n            this.p = np;\n        this.ondata(ch, 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            throw 'no callback';\n        if (this.d)\n            throw 'stream finished';\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    else {\n        var _a = dutf8(dat), out = _a[0], ext = _a[1];\n        if (ext.length)\n            throw 'invalid utf-8 data';\n        return out;\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                throw 'extra field too long';\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 == null && 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        throw 'date not in range 1980-2099';\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 != null) {\n        wbytes(d, b, f.crc);\n        wbytes(d, b + 4, 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            throw 'no callback - add to ZIP archive before pushing';\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_1 = this;\n        if (!opts)\n            opts = {};\n        ZipPassThrough.call(this, filename);\n        this.d = new Deflate(opts, function (dat, final) {\n            _this_1.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 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 AsyncZipDeflate(filename, opts) {\n        var _this_1 = this;\n        if (!opts)\n            opts = {};\n        ZipPassThrough.call(this, filename);\n        this.d = new AsyncDeflate(opts, function (err, dat, final) {\n            _this_1.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_1 = this;\n        if (this.d & 2)\n            throw 'stream finished';\n        var f = strToU8(file.filename), fl = f.length;\n        var com = file.comment, o = com && strToU8(com);\n        var u = fl != file.filename.length || (o && (com.length != o.length));\n        var hl = fl + exfl(file.extra) + 30;\n        if (fl > 65535)\n            throw 'filename too long';\n        var header = new u8(hl);\n        wzh(header, 0, file, f, u);\n        var chks = [header];\n        var pAll = function () {\n            for (var _i = 0, chks_1 = chks; _i < chks_1.length; _i++) {\n                var chk = chks_1[_i];\n                _this_1.ondata(null, chk, false);\n            }\n            chks = [];\n        };\n        var tr = this.d;\n        this.d = 0;\n        var ind = this.u.length;\n        var uf = 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();\n                if (tr) {\n                    var nxt = _this_1.u[ind + 1];\n                    if (nxt)\n                        nxt.r();\n                    else\n                        _this_1.d = 1;\n                }\n                tr = 1;\n            }\n        });\n        var cl = 0;\n        file.ondata = function (err, dat, final) {\n            if (err) {\n                _this_1.ondata(err, dat, final);\n                _this_1.terminate();\n            }\n            else {\n                cl += dat.length;\n                chks.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);\n                    wbytes(dd, 12, file.size);\n                    chks.push(dd);\n                    uf.c = cl, uf.b = hl + cl + 16, uf.crc = file.crc, uf.size = file.size;\n                    if (tr)\n                        uf.r();\n                    tr = 1;\n                }\n                else if (tr)\n                    pAll();\n            }\n        };\n        this.u.push(uf);\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_1 = this;\n        if (this.d & 2) {\n            if (this.d & 1)\n                throw 'stream finishing';\n            throw 'stream finished';\n        }\n        if (this.d)\n            this.e();\n        else\n            this.u.push({\n                r: function () {\n                    if (!(_this_1.d & 1))\n                        return;\n                    _this_1.u.splice(-1, 1);\n                    _this_1.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, 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        throw 'no callback';\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 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 cb(e, null);\n            }\n        }\n        wzf(out, o, files.length, cdl, oe);\n        cb(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                cb(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('filename too long', 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            throw 'filename too long';\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_1 = this;\n        this.i = new Inflate(function (dat, final) {\n            _this_1.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, data, 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_1 = this;\n        if (sz < 320000) {\n            this.i = new Inflate(function (dat, final) {\n                _this_1.ondata(null, dat, final);\n            });\n        }\n        else {\n            this.i = new AsyncInflate(function (err, dat, final) {\n                _this_1.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_1 = this;\n        if (!this.onfile)\n            throw 'no callback';\n        if (!this.p)\n            throw 'stream finished';\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_2 = [];\n                        this_1.k.unshift(chks_2);\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                                    throw 'no callback';\n                                if (!sc_1)\n                                    file_1.ondata(null, et, true);\n                                else {\n                                    var ctr = _this_1.o[cmp_1];\n                                    if (!ctr)\n                                        throw 'unknown compression type ' + cmp_1;\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_3 = chks_2; _i < chks_3.length; _i++) {\n                                        var dat = chks_3[_i];\n                                        d_1.push(dat, false);\n                                    }\n                                    if (_this_1.k[0] == chks_2 && _this_1.c)\n                                        _this_1.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                throw 'invalid zip file';\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 };\n/**\n * Asynchronously decompresses a ZIP archive\n * @param data The raw compressed ZIP file\n * @param cb The callback to call with the decompressed files\n * @returns A function that can be used to immediately terminate the unzipping\n */\nexport function unzip(data, cb) {\n    if (typeof cb != 'function')\n        throw 'no callback';\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 e = data.length - 22;\n    for (; b4(data, e) != 0x6054B50; --e) {\n        if (!e || data.length - e > 65558) {\n            cb('invalid zip file', null);\n            return;\n        }\n    }\n    ;\n    var lft = b2(data, e + 8);\n    if (!lft)\n        cb(null, {});\n    var c = lft;\n    var o = b4(data, e + 16);\n    var z = o == 4294967295;\n    if (z) {\n        e = b4(data, e - 12);\n        if (b4(data, e) != 0x6064B50) {\n            cb('invalid zip file', null);\n            return;\n        }\n        c = lft = b4(data, e + 32);\n        o = b4(data, e + 48);\n    }\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                cb(e, null);\n            }\n            else {\n                files[fn] = d;\n                if (!--lft)\n                    cb(null, files);\n            }\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            if (sc < 320000) {\n                try {\n                    cbl(null, inflateSync(infl, 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('unknown compression type ' + c_1, null);\n    };\n    for (var i = 0; i < c; ++i) {\n        _loop_3(i);\n    }\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 * @returns The decompressed files\n */\nexport function unzipSync(data) {\n    var files = {};\n    var e = data.length - 22;\n    for (; b4(data, e) != 0x6054B50; --e) {\n        if (!e || data.length - e > 65558)\n            throw 'invalid zip file';\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;\n    if (z) {\n        e = b4(data, e - 12);\n        if (b4(data, e) != 0x6064B50)\n            throw 'invalid zip file';\n        c = b4(data, e + 32);\n        o = b4(data, e + 48);\n    }\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 (!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), new u8(su));\n        else\n            throw 'unknown compression type ' + c_2;\n    }\n    return files;\n}\n"
  },
  {
    "path": "examples/libs/ktx-parse.module.js",
    "content": "const t=0,e=1,n=2,i=3,s=0,a=0,r=2,o=0,l=1,f=160,U=161,c=162,h=163,_=0,p=1,g=0,y=1,x=2,u=3,b=4,d=5,m=6,w=7,D=8,B=9,L=10,A=11,k=12,v=13,S=14,I=15,O=16,T=17,V=18,E=0,F=1,P=2,C=3,z=4,M=5,W=6,N=7,H=8,K=9,X=10,j=11,R=0,Y=1,q=2,G=13,J=14,Q=15,Z=128,$=64,tt=32,et=16,nt=0,it=1,st=2,at=3,rt=4,ot=5,lt=6,ft=7,Ut=8,ct=9,ht=10,_t=13,pt=14,gt=15,yt=16,xt=17,ut=20,bt=21,dt=22,mt=23,wt=24,Dt=27,Bt=28,Lt=29,At=30,kt=31,vt=34,St=35,It=36,Ot=37,Tt=38,Vt=41,Et=42,Ft=43,Pt=44,Ct=45,zt=48,Mt=49,Wt=50,Nt=58,Ht=59,Kt=62,Xt=63,jt=64,Rt=65,Yt=68,qt=69,Gt=70,Jt=71,Qt=74,Zt=75,$t=76,te=77,ee=78,ne=81,ie=82,se=83,ae=84,re=85,oe=88,le=89,fe=90,Ue=91,ce=92,he=95,_e=96,pe=97,ge=98,ye=99,xe=100,ue=101,be=102,de=103,me=104,we=105,De=106,Be=107,Le=108,Ae=109,ke=110,ve=111,Se=112,Ie=113,Oe=114,Te=115,Ve=116,Ee=117,Fe=118,Pe=119,Ce=120,ze=121,Me=122,We=123,Ne=124,He=125,Ke=126,Xe=127,je=128,Re=129,Ye=130,qe=131,Ge=132,Je=133,Qe=134,Ze=135,$e=136,tn=137,en=138,nn=139,sn=140,an=141,rn=142,on=143,ln=144,fn=145,Un=146,cn=147,hn=148,_n=149,pn=150,gn=151,yn=152,xn=153,un=154,bn=155,dn=156,mn=157,wn=158,Dn=159,Bn=160,Ln=161,An=162,kn=163,vn=164,Sn=165,In=166,On=167,Tn=168,Vn=169,En=170,Fn=171,Pn=172,Cn=173,zn=174,Mn=175,Wn=176,Nn=177,Hn=178,Kn=179,Xn=180,jn=181,Rn=182,Yn=183,qn=184,Gn=1000156007,Jn=1000156008,Qn=1000156009,Zn=1000156010,$n=1000156011,ti=1000156017,ei=1000156018,ni=1000156019,ii=1000156020,si=1000156021,ai=1000054e3,ri=1000054001,oi=1000054002,li=1000054003,fi=1000054004,Ui=1000054005,ci=1000054006,hi=1000054007,_i=1000066e3,pi=1000066001,gi=1000066002,yi=1000066003,xi=1000066004,ui=1000066005,bi=1000066006,di=1000066007,mi=1000066008,wi=1000066009,Di=1000066010,Bi=1000066011,Li=1000066012,Ai=1000066013,ki=100034e4,vi=1000340001;class Si{constructor(){this.vkFormat=0,this.typeSize=1,this.pixelWidth=0,this.pixelHeight=0,this.pixelDepth=0,this.layerCount=0,this.faceCount=1,this.supercompressionScheme=0,this.levels=[],this.dataFormatDescriptor=[{vendorId:0,descriptorType:0,descriptorBlockSize:0,versionNumber:2,colorModel:0,colorPrimaries:1,transferFunction:2,flags:0,texelBlockDimension:[0,0,0,0],bytesPlane:[0,0,0,0,0,0,0,0],samples:[]}],this.keyValue={},this.globalData=null}}class Ii{constructor(t,e,n,i){this._dataView=new DataView(t.buffer,t.byteOffset+e,n),this._littleEndian=i,this._offset=0}_nextUint8(){const t=this._dataView.getUint8(this._offset);return this._offset+=1,t}_nextUint16(){const t=this._dataView.getUint16(this._offset,this._littleEndian);return this._offset+=2,t}_nextUint32(){const t=this._dataView.getUint32(this._offset,this._littleEndian);return this._offset+=4,t}_nextUint64(){const t=this._dataView.getUint32(this._offset,this._littleEndian)+2**32*this._dataView.getUint32(this._offset+4,this._littleEndian);return this._offset+=8,t}_nextInt32(){const t=this._dataView.getInt32(this._offset,this._littleEndian);return this._offset+=4,t}_skip(t){return this._offset+=t,this}_scan(t,e=0){const n=this._offset;let i=0;for(;this._dataView.getUint8(this._offset)!==e&&i<t;)i++,this._offset++;return i<t&&this._offset++,new Uint8Array(this._dataView.buffer,this._dataView.byteOffset+n,i)}}const Oi=new Uint8Array([0]),Ti=[171,75,84,88,32,50,48,187,13,10,26,10];function Vi(t){return\"undefined\"!=typeof TextEncoder?(new TextEncoder).encode(t):Buffer.from(t)}function Ei(t){return\"undefined\"!=typeof TextDecoder?(new TextDecoder).decode(t):Buffer.from(t).toString(\"utf8\")}function Fi(t){let e=0;for(const n of t)e+=n.byteLength;const n=new Uint8Array(e);let i=0;for(const e of t)n.set(new Uint8Array(e),i),i+=e.byteLength;return n}function Pi(t){const e=new Uint8Array(t.buffer,t.byteOffset,Ti.length);if(e[0]!==Ti[0]||e[1]!==Ti[1]||e[2]!==Ti[2]||e[3]!==Ti[3]||e[4]!==Ti[4]||e[5]!==Ti[5]||e[6]!==Ti[6]||e[7]!==Ti[7]||e[8]!==Ti[8]||e[9]!==Ti[9]||e[10]!==Ti[10]||e[11]!==Ti[11])throw new Error(\"Missing KTX 2.0 identifier.\");const n=new Si,i=17*Uint32Array.BYTES_PER_ELEMENT,s=new Ii(t,Ti.length,i,!0);n.vkFormat=s._nextUint32(),n.typeSize=s._nextUint32(),n.pixelWidth=s._nextUint32(),n.pixelHeight=s._nextUint32(),n.pixelDepth=s._nextUint32(),n.layerCount=s._nextUint32(),n.faceCount=s._nextUint32();const a=s._nextUint32();n.supercompressionScheme=s._nextUint32();const r=s._nextUint32(),o=s._nextUint32(),l=s._nextUint32(),f=s._nextUint32(),U=s._nextUint64(),c=s._nextUint64(),h=new Ii(t,Ti.length+i,3*a*8,!0);for(let e=0;e<a;e++)n.levels.push({levelData:new Uint8Array(t.buffer,t.byteOffset+h._nextUint64(),h._nextUint64()),uncompressedByteLength:h._nextUint64()});const _=new Ii(t,r,o,!0),p={vendorId:_._skip(4)._nextUint16(),descriptorType:_._nextUint16(),versionNumber:_._nextUint16(),descriptorBlockSize:_._nextUint16(),colorModel:_._nextUint8(),colorPrimaries:_._nextUint8(),transferFunction:_._nextUint8(),flags:_._nextUint8(),texelBlockDimension:[_._nextUint8(),_._nextUint8(),_._nextUint8(),_._nextUint8()],bytesPlane:[_._nextUint8(),_._nextUint8(),_._nextUint8(),_._nextUint8(),_._nextUint8(),_._nextUint8(),_._nextUint8(),_._nextUint8()],samples:[]},g=(p.descriptorBlockSize/4-6)/4;for(let t=0;t<g;t++){const e={bitOffset:_._nextUint16(),bitLength:_._nextUint8(),channelType:_._nextUint8(),samplePosition:[_._nextUint8(),_._nextUint8(),_._nextUint8(),_._nextUint8()],sampleLower:-Infinity,sampleUpper:Infinity};64&e.channelType?(e.sampleLower=_._nextInt32(),e.sampleUpper=_._nextInt32()):(e.sampleLower=_._nextUint32(),e.sampleUpper=_._nextUint32()),p.samples[t]=e}n.dataFormatDescriptor.length=0,n.dataFormatDescriptor.push(p);const y=new Ii(t,l,f,!0);for(;y._offset<f;){const t=y._nextUint32(),e=y._scan(t),i=Ei(e),s=y._scan(t-e.byteLength);n.keyValue[i]=i.match(/^ktx/i)?Ei(s):s,y._offset%4&&y._skip(4-y._offset%4)}if(c<=0)return n;const x=new Ii(t,U,c,!0),u=x._nextUint16(),b=x._nextUint16(),d=x._nextUint32(),m=x._nextUint32(),w=x._nextUint32(),D=x._nextUint32(),B=[];for(let t=0;t<a;t++)B.push({imageFlags:x._nextUint32(),rgbSliceByteOffset:x._nextUint32(),rgbSliceByteLength:x._nextUint32(),alphaSliceByteOffset:x._nextUint32(),alphaSliceByteLength:x._nextUint32()});const L=U+x._offset,A=L+d,k=A+m,v=k+w,S=new Uint8Array(t.buffer,t.byteOffset+L,d),I=new Uint8Array(t.buffer,t.byteOffset+A,m),O=new Uint8Array(t.buffer,t.byteOffset+k,w),T=new Uint8Array(t.buffer,t.byteOffset+v,D);return n.globalData={endpointCount:u,selectorCount:b,imageDescs:B,endpointsData:S,selectorsData:I,tablesData:O,extendedData:T},n}function Ci(){return(Ci=Object.assign||function(t){for(var e=1;e<arguments.length;e++){var n=arguments[e];for(var i in n)Object.prototype.hasOwnProperty.call(n,i)&&(t[i]=n[i])}return t}).apply(this,arguments)}const zi={keepWriter:!1};function Mi(t,e={}){e=Ci({},zi,e);let n=new ArrayBuffer(0);if(t.globalData){const e=new ArrayBuffer(20+5*t.globalData.imageDescs.length*4),i=new DataView(e);i.setUint16(0,t.globalData.endpointCount,!0),i.setUint16(2,t.globalData.selectorCount,!0),i.setUint32(4,t.globalData.endpointsData.byteLength,!0),i.setUint32(8,t.globalData.selectorsData.byteLength,!0),i.setUint32(12,t.globalData.tablesData.byteLength,!0),i.setUint32(16,t.globalData.extendedData.byteLength,!0);for(let e=0;e<t.globalData.imageDescs.length;e++){const n=t.globalData.imageDescs[e];i.setUint32(20+5*e*4+0,n.imageFlags,!0),i.setUint32(20+5*e*4+4,n.rgbSliceByteOffset,!0),i.setUint32(20+5*e*4+8,n.rgbSliceByteLength,!0),i.setUint32(20+5*e*4+12,n.alphaSliceByteOffset,!0),i.setUint32(20+5*e*4+16,n.alphaSliceByteLength,!0)}n=Fi([e,t.globalData.endpointsData,t.globalData.selectorsData,t.globalData.tablesData,t.globalData.extendedData])}const i=[];let s=t.keyValue;e.keepWriter||(s=Ci({},t.keyValue,{KTXwriter:\"KTX-Parse v0.3.1\"}));for(const t in s){const e=s[t],n=Vi(t),a=\"string\"==typeof e?Vi(e):e,r=n.byteLength+1+a.byteLength+1,o=r%4?4-r%4:0;i.push(Fi([new Uint32Array([r]),n,Oi,a,Oi,new Uint8Array(o).fill(0)]))}const a=Fi(i);if(1!==t.dataFormatDescriptor.length||0!==t.dataFormatDescriptor[0].descriptorType)throw new Error(\"Only BASICFORMAT Data Format Descriptor output supported.\");const r=t.dataFormatDescriptor[0],o=new ArrayBuffer(28+16*r.samples.length),l=new DataView(o),f=24+16*r.samples.length;if(l.setUint32(0,o.byteLength,!0),l.setUint16(4,r.vendorId,!0),l.setUint16(6,r.descriptorType,!0),l.setUint16(8,r.versionNumber,!0),l.setUint16(10,f,!0),l.setUint8(12,r.colorModel),l.setUint8(13,r.colorPrimaries),l.setUint8(14,r.transferFunction),l.setUint8(15,r.flags),!Array.isArray(r.texelBlockDimension))throw new Error(\"texelBlockDimension is now an array. For dimensionality `d`, set `d - 1`.\");l.setUint8(16,r.texelBlockDimension[0]),l.setUint8(17,r.texelBlockDimension[1]),l.setUint8(18,r.texelBlockDimension[2]),l.setUint8(19,r.texelBlockDimension[3]);for(let t=0;t<8;t++)l.setUint8(20+t,r.bytesPlane[t]);for(let t=0;t<r.samples.length;t++){const e=r.samples[t],n=28+16*t;if(e.channelID)throw new Error(\"channelID has been renamed to channelType.\");l.setUint16(n+0,e.bitOffset,!0),l.setUint8(n+2,e.bitLength),l.setUint8(n+3,e.channelType),l.setUint8(n+4,e.samplePosition[0]),l.setUint8(n+5,e.samplePosition[1]),l.setUint8(n+6,e.samplePosition[2]),l.setUint8(n+7,e.samplePosition[3]),64&e.channelType?(l.setInt32(n+8,e.sampleLower,!0),l.setInt32(n+12,e.sampleUpper,!0)):(l.setUint32(n+8,e.sampleLower,!0),l.setUint32(n+12,e.sampleUpper,!0))}const U=Ti.length+68+3*t.levels.length*8,c=U+o.byteLength;let h=n.byteLength>0?c+a.byteLength:0;h%8&&(h+=8-h%8);const _=[],p=new DataView(new ArrayBuffer(3*t.levels.length*8));let g=(h||c+a.byteLength)+n.byteLength;for(let e=0;e<t.levels.length;e++){const n=t.levels[e];_.push(n.levelData),p.setBigUint64(24*e+0,BigInt(g),!0),p.setBigUint64(24*e+8,BigInt(n.levelData.byteLength),!0),p.setBigUint64(24*e+16,BigInt(n.uncompressedByteLength),!0),g+=n.levelData.byteLength}const y=new ArrayBuffer(68),x=new DataView(y);return x.setUint32(0,t.vkFormat,!0),x.setUint32(4,t.typeSize,!0),x.setUint32(8,t.pixelWidth,!0),x.setUint32(12,t.pixelHeight,!0),x.setUint32(16,t.pixelDepth,!0),x.setUint32(20,t.layerCount,!0),x.setUint32(24,t.faceCount,!0),x.setUint32(28,t.levels.length,!0),x.setUint32(32,t.supercompressionScheme,!0),x.setUint32(36,U,!0),x.setUint32(40,o.byteLength,!0),x.setUint32(44,c,!0),x.setUint32(48,a.byteLength,!0),x.setBigUint64(52,BigInt(n.byteLength>0?h:0),!0),x.setBigUint64(60,BigInt(n.byteLength),!0),new Uint8Array(Fi([new Uint8Array(Ti).buffer,y,p.buffer,o,a,h>0?new ArrayBuffer(h-(c+a.byteLength)):new ArrayBuffer(0),n,..._]))}export{Q as KHR_DF_CHANNEL_RGBSDA_ALPHA,q as KHR_DF_CHANNEL_RGBSDA_BLUE,J as KHR_DF_CHANNEL_RGBSDA_DEPTH,Y as KHR_DF_CHANNEL_RGBSDA_GREEN,R as KHR_DF_CHANNEL_RGBSDA_RED,G as KHR_DF_CHANNEL_RGBSDA_STENCIL,p as KHR_DF_FLAG_ALPHA_PREMULTIPLIED,_ as KHR_DF_FLAG_ALPHA_STRAIGHT,s as KHR_DF_KHR_DESCRIPTORTYPE_BASICFORMAT,c as KHR_DF_MODEL_ASTC,f as KHR_DF_MODEL_ETC1,h as KHR_DF_MODEL_ETC1S,U as KHR_DF_MODEL_ETC2,l as KHR_DF_MODEL_RGBSDA,o as KHR_DF_MODEL_UNSPECIFIED,W as KHR_DF_PRIMARIES_ACES,N as KHR_DF_PRIMARIES_ACESCC,j as KHR_DF_PRIMARIES_ADOBERGB,z as KHR_DF_PRIMARIES_BT2020,P as KHR_DF_PRIMARIES_BT601_EBU,C as KHR_DF_PRIMARIES_BT601_SMPTE,F as KHR_DF_PRIMARIES_BT709,M as KHR_DF_PRIMARIES_CIEXYZ,X as KHR_DF_PRIMARIES_DISPLAYP3,H as KHR_DF_PRIMARIES_NTSC1953,K as KHR_DF_PRIMARIES_PAL525,E as KHR_DF_PRIMARIES_UNSPECIFIED,tt as KHR_DF_SAMPLE_DATATYPE_EXPONENT,Z as KHR_DF_SAMPLE_DATATYPE_FLOAT,et as KHR_DF_SAMPLE_DATATYPE_LINEAR,$ as KHR_DF_SAMPLE_DATATYPE_SIGNED,O as KHR_DF_TRANSFER_ACESCC,T as KHR_DF_TRANSFER_ACESCCT,V as KHR_DF_TRANSFER_ADOBERGB,w as KHR_DF_TRANSFER_BT1886,k as KHR_DF_TRANSFER_DCIP3,B as KHR_DF_TRANSFER_HLG_EOTF,D as KHR_DF_TRANSFER_HLG_OETF,u as KHR_DF_TRANSFER_ITU,y as KHR_DF_TRANSFER_LINEAR,b as KHR_DF_TRANSFER_NTSC,S as KHR_DF_TRANSFER_PAL625_EOTF,v as KHR_DF_TRANSFER_PAL_OETF,L as KHR_DF_TRANSFER_PQ_EOTF,A as KHR_DF_TRANSFER_PQ_OETF,d as KHR_DF_TRANSFER_SLOG,m as KHR_DF_TRANSFER_SLOG2,x as KHR_DF_TRANSFER_SRGB,I as KHR_DF_TRANSFER_ST240,g as KHR_DF_TRANSFER_UNSPECIFIED,a as KHR_DF_VENDORID_KHRONOS,r as KHR_DF_VERSION,e as KHR_SUPERCOMPRESSION_BASISLZ,t as KHR_SUPERCOMPRESSION_NONE,i as KHR_SUPERCOMPRESSION_ZLIB,n as KHR_SUPERCOMPRESSION_ZSTD,Si as KTX2Container,Ut as VK_FORMAT_A1R5G5B5_UNORM_PACK16,qt as VK_FORMAT_A2B10G10R10_SINT_PACK32,Rt as VK_FORMAT_A2B10G10R10_SNORM_PACK32,Yt as VK_FORMAT_A2B10G10R10_UINT_PACK32,jt as VK_FORMAT_A2B10G10R10_UNORM_PACK32,Xt as VK_FORMAT_A2R10G10B10_SINT_PACK32,Ht as VK_FORMAT_A2R10G10B10_SNORM_PACK32,Kt as VK_FORMAT_A2R10G10B10_UINT_PACK32,Nt as VK_FORMAT_A2R10G10B10_UNORM_PACK32,vi as VK_FORMAT_A4B4G4R4_UNORM_PACK16_EXT,ki as VK_FORMAT_A4R4G4B4_UNORM_PACK16_EXT,Bi as VK_FORMAT_ASTC_10x10_SFLOAT_BLOCK_EXT,Xn as VK_FORMAT_ASTC_10x10_SRGB_BLOCK,Kn as VK_FORMAT_ASTC_10x10_UNORM_BLOCK,mi as VK_FORMAT_ASTC_10x5_SFLOAT_BLOCK_EXT,zn as VK_FORMAT_ASTC_10x5_SRGB_BLOCK,Cn as VK_FORMAT_ASTC_10x5_UNORM_BLOCK,wi as VK_FORMAT_ASTC_10x6_SFLOAT_BLOCK_EXT,Wn as VK_FORMAT_ASTC_10x6_SRGB_BLOCK,Mn as VK_FORMAT_ASTC_10x6_UNORM_BLOCK,Di as VK_FORMAT_ASTC_10x8_SFLOAT_BLOCK_EXT,Hn as VK_FORMAT_ASTC_10x8_SRGB_BLOCK,Nn as VK_FORMAT_ASTC_10x8_UNORM_BLOCK,Li as VK_FORMAT_ASTC_12x10_SFLOAT_BLOCK_EXT,Rn as VK_FORMAT_ASTC_12x10_SRGB_BLOCK,jn as VK_FORMAT_ASTC_12x10_UNORM_BLOCK,Ai as VK_FORMAT_ASTC_12x12_SFLOAT_BLOCK_EXT,qn as VK_FORMAT_ASTC_12x12_SRGB_BLOCK,Yn as VK_FORMAT_ASTC_12x12_UNORM_BLOCK,_i as VK_FORMAT_ASTC_4x4_SFLOAT_BLOCK_EXT,wn as VK_FORMAT_ASTC_4x4_SRGB_BLOCK,mn as VK_FORMAT_ASTC_4x4_UNORM_BLOCK,pi as VK_FORMAT_ASTC_5x4_SFLOAT_BLOCK_EXT,Bn as VK_FORMAT_ASTC_5x4_SRGB_BLOCK,Dn as VK_FORMAT_ASTC_5x4_UNORM_BLOCK,gi as VK_FORMAT_ASTC_5x5_SFLOAT_BLOCK_EXT,An as VK_FORMAT_ASTC_5x5_SRGB_BLOCK,Ln as VK_FORMAT_ASTC_5x5_UNORM_BLOCK,yi as VK_FORMAT_ASTC_6x5_SFLOAT_BLOCK_EXT,vn as VK_FORMAT_ASTC_6x5_SRGB_BLOCK,kn as VK_FORMAT_ASTC_6x5_UNORM_BLOCK,xi as VK_FORMAT_ASTC_6x6_SFLOAT_BLOCK_EXT,In as VK_FORMAT_ASTC_6x6_SRGB_BLOCK,Sn as VK_FORMAT_ASTC_6x6_UNORM_BLOCK,ui as VK_FORMAT_ASTC_8x5_SFLOAT_BLOCK_EXT,Tn as VK_FORMAT_ASTC_8x5_SRGB_BLOCK,On as VK_FORMAT_ASTC_8x5_UNORM_BLOCK,bi as VK_FORMAT_ASTC_8x6_SFLOAT_BLOCK_EXT,En as VK_FORMAT_ASTC_8x6_SRGB_BLOCK,Vn as VK_FORMAT_ASTC_8x6_UNORM_BLOCK,di as VK_FORMAT_ASTC_8x8_SFLOAT_BLOCK_EXT,Pn as VK_FORMAT_ASTC_8x8_SRGB_BLOCK,Fn as VK_FORMAT_ASTC_8x8_UNORM_BLOCK,Me as VK_FORMAT_B10G11R11_UFLOAT_PACK32,$n as VK_FORMAT_B10X6G10X6R10X6G10X6_422_UNORM_4PACK16,si as VK_FORMAT_B12X4G12X4R12X4G12X4_422_UNORM_4PACK16,at as VK_FORMAT_B4G4R4A4_UNORM_PACK16,ft as VK_FORMAT_B5G5R5A1_UNORM_PACK16,ot as VK_FORMAT_B5G6R5_UNORM_PACK16,Mt as VK_FORMAT_B8G8R8A8_SINT,Ct as VK_FORMAT_B8G8R8A8_SNORM,Wt as VK_FORMAT_B8G8R8A8_SRGB,zt as VK_FORMAT_B8G8R8A8_UINT,Pt as VK_FORMAT_B8G8R8A8_UNORM,St as VK_FORMAT_B8G8R8_SINT,kt as VK_FORMAT_B8G8R8_SNORM,It as VK_FORMAT_B8G8R8_SRGB,vt as VK_FORMAT_B8G8R8_UINT,At as VK_FORMAT_B8G8R8_UNORM,Qe as VK_FORMAT_BC1_RGBA_SRGB_BLOCK,Je as VK_FORMAT_BC1_RGBA_UNORM_BLOCK,Ge as VK_FORMAT_BC1_RGB_SRGB_BLOCK,qe as VK_FORMAT_BC1_RGB_UNORM_BLOCK,$e as VK_FORMAT_BC2_SRGB_BLOCK,Ze as VK_FORMAT_BC2_UNORM_BLOCK,en as VK_FORMAT_BC3_SRGB_BLOCK,tn as VK_FORMAT_BC3_UNORM_BLOCK,sn as VK_FORMAT_BC4_SNORM_BLOCK,nn as VK_FORMAT_BC4_UNORM_BLOCK,rn as VK_FORMAT_BC5_SNORM_BLOCK,an as VK_FORMAT_BC5_UNORM_BLOCK,ln as VK_FORMAT_BC6H_SFLOAT_BLOCK,on as VK_FORMAT_BC6H_UFLOAT_BLOCK,Un as VK_FORMAT_BC7_SRGB_BLOCK,fn as VK_FORMAT_BC7_UNORM_BLOCK,Ne as VK_FORMAT_D16_UNORM,je as VK_FORMAT_D16_UNORM_S8_UINT,Re as VK_FORMAT_D24_UNORM_S8_UINT,Ke as VK_FORMAT_D32_SFLOAT,Ye as VK_FORMAT_D32_SFLOAT_S8_UINT,We as VK_FORMAT_E5B9G9R9_UFLOAT_PACK32,dn as VK_FORMAT_EAC_R11G11_SNORM_BLOCK,bn as VK_FORMAT_EAC_R11G11_UNORM_BLOCK,un as VK_FORMAT_EAC_R11_SNORM_BLOCK,xn as VK_FORMAT_EAC_R11_UNORM_BLOCK,pn as VK_FORMAT_ETC2_R8G8B8A1_SRGB_BLOCK,_n as VK_FORMAT_ETC2_R8G8B8A1_UNORM_BLOCK,yn as VK_FORMAT_ETC2_R8G8B8A8_SRGB_BLOCK,gn as VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK,hn as VK_FORMAT_ETC2_R8G8B8_SRGB_BLOCK,cn as VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK,Zn as VK_FORMAT_G10X6B10X6G10X6R10X6_422_UNORM_4PACK16,ii as VK_FORMAT_G12X4B12X4G12X4R12X4_422_UNORM_4PACK16,fi as VK_FORMAT_PVRTC1_2BPP_SRGB_BLOCK_IMG,ai as VK_FORMAT_PVRTC1_2BPP_UNORM_BLOCK_IMG,Ui as VK_FORMAT_PVRTC1_4BPP_SRGB_BLOCK_IMG,ri as VK_FORMAT_PVRTC1_4BPP_UNORM_BLOCK_IMG,ci as VK_FORMAT_PVRTC2_2BPP_SRGB_BLOCK_IMG,oi as VK_FORMAT_PVRTC2_2BPP_UNORM_BLOCK_IMG,hi as VK_FORMAT_PVRTC2_4BPP_SRGB_BLOCK_IMG,li as VK_FORMAT_PVRTC2_4BPP_UNORM_BLOCK_IMG,Qn as VK_FORMAT_R10X6G10X6B10X6A10X6_UNORM_4PACK16,Jn as VK_FORMAT_R10X6G10X6_UNORM_2PACK16,Gn as VK_FORMAT_R10X6_UNORM_PACK16,ni as VK_FORMAT_R12X4G12X4B12X4A12X4_UNORM_4PACK16,ei as VK_FORMAT_R12X4G12X4_UNORM_2PACK16,ti as VK_FORMAT_R12X4_UNORM_PACK16,pe as VK_FORMAT_R16G16B16A16_SFLOAT,_e as VK_FORMAT_R16G16B16A16_SINT,ce as VK_FORMAT_R16G16B16A16_SNORM,he as VK_FORMAT_R16G16B16A16_UINT,Ue as VK_FORMAT_R16G16B16A16_UNORM,fe as VK_FORMAT_R16G16B16_SFLOAT,le as VK_FORMAT_R16G16B16_SINT,re as VK_FORMAT_R16G16B16_SNORM,oe as VK_FORMAT_R16G16B16_UINT,ae as VK_FORMAT_R16G16B16_UNORM,se as VK_FORMAT_R16G16_SFLOAT,ie as VK_FORMAT_R16G16_SINT,ee as VK_FORMAT_R16G16_SNORM,ne as VK_FORMAT_R16G16_UINT,te as VK_FORMAT_R16G16_UNORM,$t as VK_FORMAT_R16_SFLOAT,Zt as VK_FORMAT_R16_SINT,Jt as VK_FORMAT_R16_SNORM,Qt as VK_FORMAT_R16_UINT,Gt as VK_FORMAT_R16_UNORM,Ae as VK_FORMAT_R32G32B32A32_SFLOAT,Le as VK_FORMAT_R32G32B32A32_SINT,Be as VK_FORMAT_R32G32B32A32_UINT,De as VK_FORMAT_R32G32B32_SFLOAT,we as VK_FORMAT_R32G32B32_SINT,me as VK_FORMAT_R32G32B32_UINT,de as VK_FORMAT_R32G32_SFLOAT,be as VK_FORMAT_R32G32_SINT,ue as VK_FORMAT_R32G32_UINT,xe as VK_FORMAT_R32_SFLOAT,ye as VK_FORMAT_R32_SINT,ge as VK_FORMAT_R32_UINT,st as VK_FORMAT_R4G4B4A4_UNORM_PACK16,it as VK_FORMAT_R4G4_UNORM_PACK8,lt as VK_FORMAT_R5G5B5A1_UNORM_PACK16,rt as VK_FORMAT_R5G6B5_UNORM_PACK16,ze as VK_FORMAT_R64G64B64A64_SFLOAT,Ce as VK_FORMAT_R64G64B64A64_SINT,Pe as VK_FORMAT_R64G64B64A64_UINT,Fe as VK_FORMAT_R64G64B64_SFLOAT,Ee as VK_FORMAT_R64G64B64_SINT,Ve as VK_FORMAT_R64G64B64_UINT,Te as VK_FORMAT_R64G64_SFLOAT,Oe as VK_FORMAT_R64G64_SINT,Ie as VK_FORMAT_R64G64_UINT,Se as VK_FORMAT_R64_SFLOAT,ve as VK_FORMAT_R64_SINT,ke as VK_FORMAT_R64_UINT,Et as VK_FORMAT_R8G8B8A8_SINT,Tt as VK_FORMAT_R8G8B8A8_SNORM,Ft as VK_FORMAT_R8G8B8A8_SRGB,Vt as VK_FORMAT_R8G8B8A8_UINT,Ot as VK_FORMAT_R8G8B8A8_UNORM,Bt as VK_FORMAT_R8G8B8_SINT,wt as VK_FORMAT_R8G8B8_SNORM,Lt as VK_FORMAT_R8G8B8_SRGB,Dt as VK_FORMAT_R8G8B8_UINT,mt as VK_FORMAT_R8G8B8_UNORM,bt as VK_FORMAT_R8G8_SINT,xt as VK_FORMAT_R8G8_SNORM,dt as VK_FORMAT_R8G8_SRGB,ut as VK_FORMAT_R8G8_UINT,yt as VK_FORMAT_R8G8_UNORM,pt as VK_FORMAT_R8_SINT,ht as VK_FORMAT_R8_SNORM,gt as VK_FORMAT_R8_SRGB,_t as VK_FORMAT_R8_UINT,ct as VK_FORMAT_R8_UNORM,Xe as VK_FORMAT_S8_UINT,nt as VK_FORMAT_UNDEFINED,He as VK_FORMAT_X8_D24_UNORM_PACK32,Pi as read,Mi as write};\n"
  },
  {
    "path": "examples/libs/meshopt_decoder.module.js",
    "content": "// This file is part of meshoptimizer library and is distributed under the terms of MIT License.\n// Copyright (C) 2016-2022, by Arseny Kapoulkine (arseny.kapoulkine@gmail.com)\nvar MeshoptDecoder = (function() {\n\t\"use strict\";\n\n\t// Built with clang version 14.0.4\n\t// Built from meshoptimizer 0.18\n\tvar wasm_base = \"b9H79Tebbbe8Fv9Gbb9Gvuuuuueu9Giuuub9Geueu9Giuuueuikqbeeedddillviebeoweuec:q;iekr;leDo9TW9T9VV95dbH9F9F939H79T9F9J9H229F9Jt9VV7bb8A9TW79O9V9Wt9F9KW9J9V9KW9wWVtW949c919M9MWVbeY9TW79O9V9Wt9F9KW9J9V9KW69U9KW949c919M9MWVbdE9TW79O9V9Wt9F9KW9J9V9KW69U9KW949tWG91W9U9JWbiL9TW79O9V9Wt9F9KW9J9V9KWS9P2tWV9p9JtblK9TW79O9V9Wt9F9KW9J9V9KWS9P2tWV9r919HtbvL9TW79O9V9Wt9F9KW9J9V9KWS9P2tWVT949Wbol79IV9Rbrq:P8Yqdbk;3sezu8Jjjjjbcj;eb9Rgv8Kjjjjbc9:hodnadcefal0mbcuhoaiRbbc:Ge9hmbavaialfgrad9Radz1jjjbhwcj;abad9UhoaicefhldnadTmbaoc;WFbGgocjdaocjd6EhDcbhqinaqae9pmeaDaeaq9RaqaDfae6Egkcsfgocl4cifcd4hxdndndndnaoc9WGgmTmbcbhPcehsawcjdfhzalhHinaraH9Rax6midnaraHaxfgl9RcK6mbczhoinawcj;cbfaogifgoc9WfhOdndndndndnaHaic9WfgAco4fRbbaAci4coG4ciGPlbedibkaO9cb83ibaOcwf9cb83ibxikaOalRblalRbbgAco4gCaCciSgCE86bbaocGfalclfaCfgORbbaAcl4ciGgCaCciSgCE86bbaocVfaOaCfgORbbaAcd4ciGgCaCciSgCE86bbaoc7faOaCfgORbbaAciGgAaAciSgAE86bbaoctfaOaAfgARbbalRbegOco4gCaCciSgCE86bbaoc91faAaCfgARbbaOcl4ciGgCaCciSgCE86bbaoc4faAaCfgARbbaOcd4ciGgCaCciSgCE86bbaoc93faAaCfgARbbaOciGgOaOciSgOE86bbaoc94faAaOfgARbbalRbdgOco4gCaCciSgCE86bbaoc95faAaCfgARbbaOcl4ciGgCaCciSgCE86bbaoc96faAaCfgARbbaOcd4ciGgCaCciSgCE86bbaoc97faAaCfgARbbaOciGgOaOciSgOE86bbaoc98faAaOfgORbbalRbiglco4gAaAciSgAE86bbaoc99faOaAfgORbbalcl4ciGgAaAciSgAE86bbaoc9:faOaAfgORbbalcd4ciGgAaAciSgAE86bbaocufaOaAfgoRbbalciGglalciSglE86bbaoalfhlxdkaOalRbwalRbbgAcl4gCaCcsSgCE86bbaocGfalcwfaCfgORbbaAcsGgAaAcsSgAE86bbaocVfaOaAfgORbbalRbegAcl4gCaCcsSgCE86bbaoc7faOaCfgORbbaAcsGgAaAcsSgAE86bbaoctfaOaAfgORbbalRbdgAcl4gCaCcsSgCE86bbaoc91faOaCfgORbbaAcsGgAaAcsSgAE86bbaoc4faOaAfgORbbalRbigAcl4gCaCcsSgCE86bbaoc93faOaCfgORbbaAcsGgAaAcsSgAE86bbaoc94faOaAfgORbbalRblgAcl4gCaCcsSgCE86bbaoc95faOaCfgORbbaAcsGgAaAcsSgAE86bbaoc96faOaAfgORbbalRbvgAcl4gCaCcsSgCE86bbaoc97faOaCfgORbbaAcsGgAaAcsSgAE86bbaoc98faOaAfgORbbalRbogAcl4gCaCcsSgCE86bbaoc99faOaCfgORbbaAcsGgAaAcsSgAE86bbaoc9:faOaAfgORbbalRbrglcl4gAaAcsSgAE86bbaocufaOaAfgoRbbalcsGglalcsSglE86bbaoalfhlxekaOal8Pbb83bbaOcwfalcwf8Pbb83bbalczfhlkdnaiam9pmbaiczfhoaral9RcL0mekkaiam6mialTmidnakTmbawaPfRbbhOcbhoazhiinaiawcj;cbfaofRbbgAce4cbaAceG9R7aOfgO86bbaiadfhiaocefgoak9hmbkkazcefhzaPcefgPad6hsalhHaPad9hmexvkkcbhlasceGmdxikalaxad2fhCdnakTmbcbhHcehsawcjdfhminaral9Rax6mialTmdalaxfhlawaHfRbbhOcbhoamhiinaiawcj;cbfaofRbbgAce4cbaAceG9R7aOfgO86bbaiadfhiaocefgoak9hmbkamcefhmaHcefgHad6hsaHad9hmbkaChlxikcbhocehsinaral9Rax6mdalTmealaxfhlaocefgoad6hsadao9hmbkaChlxdkcbhlasceGTmekc9:hoxikabaqad2fawcjdfakad2z1jjjb8Aawawcjdfakcufad2fadz1jjjb8Aakaqfhqalmbkc9:hoxekcbc99aral9Radcaadca0ESEhokavcj;ebf8Kjjjjbaok;yzeHu8Jjjjjbc;ae9Rgv8Kjjjjbc9:hodnaeci9UgrcHfal0mbcuhoaiRbbgwc;WeGc;Ge9hmbawcsGgDce0mbavc;abfcFecjez:jjjjb8AavcUf9cu83ibavc8Wf9cu83ibavcyf9cu83ibavcaf9cu83ibavcKf9cu83ibavczf9cu83ibav9cu83iwav9cu83ibaialfc9WfhqaicefgwarfhodnaeTmbcmcsaDceSEhkcbhxcbhmcbhDcbhicbhlindnaoaq9nmbc9:hoxikdndnawRbbgrc;Ve0mbavc;abfalarcl4cu7fcsGcitfgPydlhsaPydbhzdnarcsGgPak9pmbavaiarcu7fcsGcdtfydbaxaPEhraPThPdndnadcd9hmbabaDcetfgHaz87ebaHcdfas87ebaHclfar87ebxekabaDcdtfgHazBdbaHclfasBdbaHcwfarBdbkaxaPfhxavc;abfalcitfgHarBdbaHasBdlavaicdtfarBdbavc;abfalcefcsGglcitfgHazBdbaHarBdlaiaPfhialcefhlxdkdndnaPcsSmbamaPfaPc987fcefhmxekaocefhrao8SbbgPcFeGhHdndnaPcu9mmbarhoxekaocvfhoaHcFbGhHcrhPdninar8SbbgOcFbGaPtaHVhHaOcu9kmearcefhraPcrfgPc8J9hmbxdkkarcefhokaHce4cbaHceG9R7amfhmkdndnadcd9hmbabaDcetfgraz87ebarcdfas87ebarclfam87ebxekabaDcdtfgrazBdbarclfasBdbarcwfamBdbkavc;abfalcitfgramBdbarasBdlavaicdtfamBdbavc;abfalcefcsGglcitfgrazBdbaramBdlaicefhialcefhlxekdnarcpe0mbaxcefgOavaiaqarcsGfRbbgPcl49RcsGcdtfydbaPcz6gHEhravaiaP9RcsGcdtfydbaOaHfgsaPcsGgOEhPaOThOdndnadcd9hmbabaDcetfgzax87ebazcdfar87ebazclfaP87ebxekabaDcdtfgzaxBdbazclfarBdbazcwfaPBdbkavaicdtfaxBdbavc;abfalcitfgzarBdbazaxBdlavaicefgicsGcdtfarBdbavc;abfalcefcsGcitfgzaPBdbazarBdlavaiaHfcsGgicdtfaPBdbavc;abfalcdfcsGglcitfgraxBdbaraPBdlalcefhlaiaOfhiasaOfhxxekaxcbaoRbbgzEgAarc;:eSgrfhsazcsGhCazcl4hXdndnazcs0mbascefhOxekashOavaiaX9RcsGcdtfydbhskdndnaCmbaOcefhxxekaOhxavaiaz9RcsGcdtfydbhOkdndnarTmbaocefhrxekaocdfhrao8SbegHcFeGhPdnaHcu9kmbaocofhAaPcFbGhPcrhodninar8SbbgHcFbGaotaPVhPaHcu9kmearcefhraocrfgoc8J9hmbkaAhrxekarcefhrkaPce4cbaPceG9R7amfgmhAkdndnaXcsSmbarhPxekarcefhPar8SbbgocFeGhHdnaocu9kmbarcvfhsaHcFbGhHcrhodninaP8SbbgrcFbGaotaHVhHarcu9kmeaPcefhPaocrfgoc8J9hmbkashPxekaPcefhPkaHce4cbaHceG9R7amfgmhskdndnaCcsSmbaPhoxekaPcefhoaP8SbbgrcFeGhHdnarcu9kmbaPcvfhOaHcFbGhHcrhrdninao8SbbgPcFbGartaHVhHaPcu9kmeaocefhoarcrfgrc8J9hmbkaOhoxekaocefhokaHce4cbaHceG9R7amfgmhOkdndnadcd9hmbabaDcetfgraA87ebarcdfas87ebarclfaO87ebxekabaDcdtfgraABdbarclfasBdbarcwfaOBdbkavc;abfalcitfgrasBdbaraABdlavaicdtfaABdbavc;abfalcefcsGcitfgraOBdbarasBdlavaicefgicsGcdtfasBdbavc;abfalcdfcsGcitfgraABdbaraOBdlavaiazcz6aXcsSVfgicsGcdtfaOBdbaiaCTaCcsSVfhialcifhlkawcefhwalcsGhlaicsGhiaDcifgDae6mbkkcbc99aoaqSEhokavc;aef8Kjjjjbaok:llevu8Jjjjjbcz9Rhvc9:hodnaecvfal0mbcuhoaiRbbc;:eGc;qe9hmbav9cb83iwaicefhraialfc98fhwdnaeTmbdnadcdSmbcbhDindnaraw6mbc9:skarcefhoar8SbbglcFeGhidndnalcu9mmbaohrxekarcvfhraicFbGhicrhldninao8SbbgdcFbGaltaiVhiadcu9kmeaocefhoalcrfglc8J9hmbxdkkaocefhrkabaDcdtfaicd4cbaice4ceG9R7avcwfaiceGcdtVgoydbfglBdbaoalBdbaDcefgDae9hmbxdkkcbhDindnaraw6mbc9:skarcefhoar8SbbglcFeGhidndnalcu9mmbaohrxekarcvfhraicFbGhicrhldninao8SbbgdcFbGaltaiVhiadcu9kmeaocefhoalcrfglc8J9hmbxdkkaocefhrkabaDcetfaicd4cbaice4ceG9R7avcwfaiceGcdtVgoydbfgl87ebaoalBdbaDcefgDae9hmbkkcbc99arawSEhokaok:Lvoeue99dud99eud99dndnadcl9hmbaeTmeindndnabcdfgd8Sbb:Yab8Sbbgi:Ygl:l:tabcefgv8Sbbgo:Ygr:l:tgwJbb;:9cawawNJbbbbawawJbbbb9GgDEgq:mgkaqaicb9iEalMgwawNakaqaocb9iEarMgqaqNMM:r:vglNJbbbZJbbb:;aDEMgr:lJbbb9p9DTmbar:Ohixekcjjjj94hikadai86bbdndnaqalNJbbbZJbbb:;aqJbbbb9GEMgq:lJbbb9p9DTmbaq:Ohdxekcjjjj94hdkavad86bbdndnawalNJbbbZJbbb:;awJbbbb9GEMgw:lJbbb9p9DTmbaw:Ohdxekcjjjj94hdkabad86bbabclfhbaecufgembxdkkaeTmbindndnabclfgd8Ueb:Yab8Uebgi:Ygl:l:tabcdfgv8Uebgo:Ygr:l:tgwJb;:FSawawNJbbbbawawJbbbb9GgDEgq:mgkaqaicb9iEalMgwawNakaqaocb9iEarMgqaqNMM:r:vglNJbbbZJbbb:;aDEMgr:lJbbb9p9DTmbar:Ohixekcjjjj94hikadai87ebdndnaqalNJbbbZJbbb:;aqJbbbb9GEMgq:lJbbb9p9DTmbaq:Ohdxekcjjjj94hdkavad87ebdndnawalNJbbbZJbbb:;awJbbbb9GEMgw:lJbbb9p9DTmbaw:Ohdxekcjjjj94hdkabad87ebabcwfhbaecufgembkkk;siliui99iue99dnaeTmbcbhiabhlindndnJ;Zl81Zalcof8UebgvciV:Y:vgoal8Ueb:YNgrJb;:FSNJbbbZJbbb:;arJbbbb9GEMgw:lJbbb9p9DTmbaw:OhDxekcjjjj94hDkalclf8Uebhqalcdf8UebhkabavcefciGaiVcetfaD87ebdndnaoak:YNgwJb;:FSNJbbbZJbbb:;awJbbbb9GEMgx:lJbbb9p9DTmbax:Ohkxekcjjjj94hkkabavcdfciGaiVcetfak87ebdndnaoaq:YNgoJb;:FSNJbbbZJbbb:;aoJbbbb9GEMgx:lJbbb9p9DTmbax:Ohqxekcjjjj94hqkabavcufciGaiVcetfaq87ebdndnJbbjZararN:tawawN:taoaoN:tgrJbbbbarJbbbb9GE:rJb;:FSNJbbbZMgr:lJbbb9p9DTmbar:Ohqxekcjjjj94hqkabavciGaiVcetfaq87ebalcwfhlaiclfhiaecufgembkkk9mbdnadcd4ae2geTmbinababydbgdcwtcw91:Yadce91cjjj;8ifcjjj98G::NUdbabclfhbaecufgembkkk9teiucbcbydj1jjbgeabcifc98GfgbBdj1jjbdndnabZbcztgd9nmbcuhiabad9RcFFifcz4nbcuSmekaehikaik;LeeeudndnaeabVciGTmbabhixekdndnadcz9pmbabhixekabhiinaiaeydbBdbaiclfaeclfydbBdbaicwfaecwfydbBdbaicxfaecxfydbBdbaiczfhiaeczfheadc9Wfgdcs0mbkkadcl6mbinaiaeydbBdbaeclfheaiclfhiadc98fgdci0mbkkdnadTmbinaiaeRbb86bbaicefhiaecefheadcufgdmbkkabk;aeedudndnabciGTmbabhixekaecFeGc:b:c:ew2hldndnadcz9pmbabhixekabhiinaialBdbaicxfalBdbaicwfalBdbaiclfalBdbaiczfhiadc9Wfgdcs0mbkkadcl6mbinaialBdbaiclfhiadc98fgdci0mbkkdnadTmbinaiae86bbaicefhiadcufgdmbkkabkkkebcjwklz9Kbb\";\n\tvar wasm_simd = \"b9H79TebbbeKl9Gbb9Gvuuuuueu9Giuuub9Geueuikqbbebeedddilve9Weeeviebeoweuec:q;Aekr;leDo9TW9T9VV95dbH9F9F939H79T9F9J9H229F9Jt9VV7bb8A9TW79O9V9Wt9F9KW9J9V9KW9wWVtW949c919M9MWVbdY9TW79O9V9Wt9F9KW9J9V9KW69U9KW949c919M9MWVblE9TW79O9V9Wt9F9KW9J9V9KW69U9KW949tWG91W9U9JWbvL9TW79O9V9Wt9F9KW9J9V9KWS9P2tWV9p9JtboK9TW79O9V9Wt9F9KW9J9V9KWS9P2tWV9r919HtbrL9TW79O9V9Wt9F9KW9J9V9KWS9P2tWVT949Wbwl79IV9RbDq;t9tqlbzik9:evu8Jjjjjbcz9Rhbcbheincbhdcbhiinabcwfadfaicjuaead4ceGglE86bbaialfhiadcefgdcw9hmbkaec:q:yjjbfai86bbaecitc:q1jjbfab8Piw83ibaecefgecjd9hmbkk;h8JlHud97euo978Jjjjjbcj;kb9Rgv8Kjjjjbc9:hodnadcefal0mbcuhoaiRbbc:Ge9hmbavaialfgrad9Rad;8qbbcj;abad9UhoaicefhldnadTmbaoc;WFbGgocjdaocjd6EhwcbhDinaDae9pmeawaeaD9RaDawfae6Egqcsfgoc9WGgkci2hxakcethmaocl4cifcd4hPabaDad2fhscbhzdnincehHalhOcbhAdninaraO9RaP6miavcj;cbfaAak2fhCaOaPfhlcbhidnakc;ab6mbaral9Rc;Gb6mbcbhoinaCaofhidndndndndnaOaoco4fRbbgXciGPlbedibkaipxbbbbbbbbbbbbbbbbpklbxikaialpbblalpbbbgQclp:meaQpmbzeHdOiAlCvXoQrLgQcdp:meaQpmbzeHdOiAlCvXoQrLpxiiiiiiiiiiiiiiiip9ogLpxiiiiiiiiiiiiiiiip8JgQp5b9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibaKc:q:yjjbfpbbbgYaYpmbbbbbbbbbbbbbbbbaQp5e9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibp9UpmbedilvorzHOACXQLpPaLaQp9spklbalclfaYpQbfaKc:q:yjjbfRbbfhlxdkaialpbbwalpbbbgQclp:meaQpmbzeHdOiAlCvXoQrLpxssssssssssssssssp9ogLpxssssssssssssssssp8JgQp5b9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibaKc:q:yjjbfpbbbgYaYpmbbbbbbbbbbbbbbbbaQp5e9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibp9UpmbedilvorzHOACXQLpPaLaQp9spklbalcwfaYpQbfaKc:q:yjjbfRbbfhlxekaialpbbbpklbalczfhlkdndndndndnaXcd4ciGPlbedibkaipxbbbbbbbbbbbbbbbbpklzxikaialpbblalpbbbgQclp:meaQpmbzeHdOiAlCvXoQrLgQcdp:meaQpmbzeHdOiAlCvXoQrLpxiiiiiiiiiiiiiiiip9ogLpxiiiiiiiiiiiiiiiip8JgQp5b9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibaKc:q:yjjbfpbbbgYaYpmbbbbbbbbbbbbbbbbaQp5e9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibp9UpmbedilvorzHOACXQLpPaLaQp9spklzalclfaYpQbfaKc:q:yjjbfRbbfhlxdkaialpbbwalpbbbgQclp:meaQpmbzeHdOiAlCvXoQrLpxssssssssssssssssp9ogLpxssssssssssssssssp8JgQp5b9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibaKc:q:yjjbfpbbbgYaYpmbbbbbbbbbbbbbbbbaQp5e9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibp9UpmbedilvorzHOACXQLpPaLaQp9spklzalcwfaYpQbfaKc:q:yjjbfRbbfhlxekaialpbbbpklzalczfhlkdndndndndnaXcl4ciGPlbedibkaipxbbbbbbbbbbbbbbbbpklaxikaialpbblalpbbbgQclp:meaQpmbzeHdOiAlCvXoQrLgQcdp:meaQpmbzeHdOiAlCvXoQrLpxiiiiiiiiiiiiiiiip9ogLpxiiiiiiiiiiiiiiiip8JgQp5b9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibaKc:q:yjjbfpbbbgYaYpmbbbbbbbbbbbbbbbbaQp5e9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibp9UpmbedilvorzHOACXQLpPaLaQp9spklaalclfaYpQbfaKc:q:yjjbfRbbfhlxdkaialpbbwalpbbbgQclp:meaQpmbzeHdOiAlCvXoQrLpxssssssssssssssssp9ogLpxssssssssssssssssp8JgQp5b9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibaKc:q:yjjbfpbbbgYaYpmbbbbbbbbbbbbbbbbaQp5e9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibp9UpmbedilvorzHOACXQLpPaLaQp9spklaalcwfaYpQbfaKc:q:yjjbfRbbfhlxekaialpbbbpklaalczfhlkdndndndndnaXco4Plbedibkaipxbbbbbbbbbbbbbbbbpkl8WxikaialpbblalpbbbgQclp:meaQpmbzeHdOiAlCvXoQrLgQcdp:meaQpmbzeHdOiAlCvXoQrLpxiiiiiiiiiiiiiiiip9ogLpxiiiiiiiiiiiiiiiip8JgQp5b9cjF;8;4;W;G;ab9:9cU1:NgXcitc:q1jjbfpbibaXc:q:yjjbfpbbbgYaYpmbbbbbbbbbbbbbbbbaQp5e9cjF;8;4;W;G;ab9:9cU1:NgXcitc:q1jjbfpbibp9UpmbedilvorzHOACXQLpPaLaQp9spkl8WalclfaYpQbfaXc:q:yjjbfRbbfhlxdkaialpbbwalpbbbgQclp:meaQpmbzeHdOiAlCvXoQrLpxssssssssssssssssp9ogLpxssssssssssssssssp8JgQp5b9cjF;8;4;W;G;ab9:9cU1:NgXcitc:q1jjbfpbibaXc:q:yjjbfpbbbgYaYpmbbbbbbbbbbbbbbbbaQp5e9cjF;8;4;W;G;ab9:9cU1:NgXcitc:q1jjbfpbibp9UpmbedilvorzHOACXQLpPaLaQp9spkl8WalcwfaYpQbfaXc:q:yjjbfRbbfhlxekaialpbbbpkl8Walczfhlkaoc;abfhiaocjefak0meaihoaral9Rc;Fb0mbkkdndnaiak9pmbaici4hoinaral9RcK6mdaCaifhXdndndndndnaOaico4fRbbaocoG4ciGPlbedibkaXpxbbbbbbbbbbbbbbbbpklbxikaXalpbblalpbbbgQclp:meaQpmbzeHdOiAlCvXoQrLgQcdp:meaQpmbzeHdOiAlCvXoQrLpxiiiiiiiiiiiiiiiip9ogLpxiiiiiiiiiiiiiiiip8JgQp5b9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibaKc:q:yjjbfpbbbgYaYpmbbbbbbbbbbbbbbbbaQp5e9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibp9UpmbedilvorzHOACXQLpPaLaQp9spklbalclfaYpQbfaKc:q:yjjbfRbbfhlxdkaXalpbbwalpbbbgQclp:meaQpmbzeHdOiAlCvXoQrLpxssssssssssssssssp9ogLpxssssssssssssssssp8JgQp5b9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibaKc:q:yjjbfpbbbgYaYpmbbbbbbbbbbbbbbbbaQp5e9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibp9UpmbedilvorzHOACXQLpPaLaQp9spklbalcwfaYpQbfaKc:q:yjjbfRbbfhlxekaXalpbbbpklbalczfhlkaocdfhoaiczfgiak6mbkkalTmbaAci6hHalhOaAcefgohAaoclSmdxekkcbhlaHceGmdkdnakTmbavcjdfazfhiavazfpbdbhYcbhXinaiavcj;cbfaXfgopblbgLcep9TaLpxeeeeeeeeeeeeeeeegQp9op9Hp9rgLaoakfpblbg8Acep9Ta8AaQp9op9Hp9rg8ApmbzeHdOiAlCvXoQrLgEaoamfpblbg3cep9Ta3aQp9op9Hp9rg3aoaxfpblbg5cep9Ta5aQp9op9Hp9rg5pmbzeHdOiAlCvXoQrLg8EpmbezHdiOAlvCXorQLgQaQpmbedibedibedibediaYp9UgYp9AdbbaiadfgoaYaQaQpmlvorlvorlvorlvorp9UgYp9AdbbaoadfgoaYaQaQpmwDqkwDqkwDqkwDqkp9UgYp9AdbbaoadfgoaYaQaQpmxmPsxmPsxmPsxmPsp9UgYp9AdbbaoadfgoaYaEa8EpmwDKYqk8AExm35Ps8E8FgQaQpmbedibedibedibedip9UgYp9AdbbaoadfgoaYaQaQpmlvorlvorlvorlvorp9UgYp9AdbbaoadfgoaYaQaQpmwDqkwDqkwDqkwDqkp9UgYp9AdbbaoadfgoaYaQaQpmxmPsxmPsxmPsxmPsp9UgYp9AdbbaoadfgoaYaLa8ApmwKDYq8AkEx3m5P8Es8FgLa3a5pmwKDYq8AkEx3m5P8Es8Fg8ApmbezHdiOAlvCXorQLgQaQpmbedibedibedibedip9UgYp9AdbbaoadfgoaYaQaQpmlvorlvorlvorlvorp9UgYp9AdbbaoadfgoaYaQaQpmwDqkwDqkwDqkwDqkp9UgYp9AdbbaoadfgoaYaQaQpmxmPsxmPsxmPsxmPsp9UgYp9AdbbaoadfgoaYaLa8ApmwDKYqk8AExm35Ps8E8FgQaQpmbedibedibedibedip9UgYp9AdbbaoadfgoaYaQaQpmlvorlvorlvorlvorp9UgYp9AdbbaoadfgoaYaQaQpmwDqkwDqkwDqkwDqkp9UgYp9AdbbaoadfgoaYaQaQpmxmPsxmPsxmPsxmPsp9UgYp9AdbbaoadfhiaXczfgXak6mbkkazclfgzad6mbkasavcjdfaqad2;8qbbavavcjdfaqcufad2fad;8qbbaqaDfhDc9:hoalmexikkc9:hoxekcbc99aral9Radcaadca0ESEhokavcj;kbf8Kjjjjbaokwbz:bjjjbk;uzeHu8Jjjjjbc;ae9Rgv8Kjjjjbc9:hodnaeci9UgrcHfal0mbcuhoaiRbbgwc;WeGc;Ge9hmbawcsGgDce0mbavc;abfcFecje;8kbavcUf9cu83ibavc8Wf9cu83ibavcyf9cu83ibavcaf9cu83ibavcKf9cu83ibavczf9cu83ibav9cu83iwav9cu83ibaialfc9WfhqaicefgwarfhodnaeTmbcmcsaDceSEhkcbhxcbhmcbhDcbhicbhlindnaoaq9nmbc9:hoxikdndnawRbbgrc;Ve0mbavc;abfalarcl4cu7fcsGcitfgPydlhsaPydbhzdnarcsGgPak9pmbavaiarcu7fcsGcdtfydbaxaPEhraPThPdndnadcd9hmbabaDcetfgHaz87ebaHcdfas87ebaHclfar87ebxekabaDcdtfgHazBdbaHclfasBdbaHcwfarBdbkaxaPfhxavc;abfalcitfgHarBdbaHasBdlavaicdtfarBdbavc;abfalcefcsGglcitfgHazBdbaHarBdlaiaPfhialcefhlxdkdndnaPcsSmbamaPfaPc987fcefhmxekaocefhrao8SbbgPcFeGhHdndnaPcu9mmbarhoxekaocvfhoaHcFbGhHcrhPdninar8SbbgOcFbGaPtaHVhHaOcu9kmearcefhraPcrfgPc8J9hmbxdkkarcefhokaHce4cbaHceG9R7amfhmkdndnadcd9hmbabaDcetfgraz87ebarcdfas87ebarclfam87ebxekabaDcdtfgrazBdbarclfasBdbarcwfamBdbkavc;abfalcitfgramBdbarasBdlavaicdtfamBdbavc;abfalcefcsGglcitfgrazBdbaramBdlaicefhialcefhlxekdnarcpe0mbaxcefgOavaiaqarcsGfRbbgPcl49RcsGcdtfydbaPcz6gHEhravaiaP9RcsGcdtfydbaOaHfgsaPcsGgOEhPaOThOdndnadcd9hmbabaDcetfgzax87ebazcdfar87ebazclfaP87ebxekabaDcdtfgzaxBdbazclfarBdbazcwfaPBdbkavaicdtfaxBdbavc;abfalcitfgzarBdbazaxBdlavaicefgicsGcdtfarBdbavc;abfalcefcsGcitfgzaPBdbazarBdlavaiaHfcsGgicdtfaPBdbavc;abfalcdfcsGglcitfgraxBdbaraPBdlalcefhlaiaOfhiasaOfhxxekaxcbaoRbbgzEgAarc;:eSgrfhsazcsGhCazcl4hXdndnazcs0mbascefhOxekashOavaiaX9RcsGcdtfydbhskdndnaCmbaOcefhxxekaOhxavaiaz9RcsGcdtfydbhOkdndnarTmbaocefhrxekaocdfhrao8SbegHcFeGhPdnaHcu9kmbaocofhAaPcFbGhPcrhodninar8SbbgHcFbGaotaPVhPaHcu9kmearcefhraocrfgoc8J9hmbkaAhrxekarcefhrkaPce4cbaPceG9R7amfgmhAkdndnaXcsSmbarhPxekarcefhPar8SbbgocFeGhHdnaocu9kmbarcvfhsaHcFbGhHcrhodninaP8SbbgrcFbGaotaHVhHarcu9kmeaPcefhPaocrfgoc8J9hmbkashPxekaPcefhPkaHce4cbaHceG9R7amfgmhskdndnaCcsSmbaPhoxekaPcefhoaP8SbbgrcFeGhHdnarcu9kmbaPcvfhOaHcFbGhHcrhrdninao8SbbgPcFbGartaHVhHaPcu9kmeaocefhoarcrfgrc8J9hmbkaOhoxekaocefhokaHce4cbaHceG9R7amfgmhOkdndnadcd9hmbabaDcetfgraA87ebarcdfas87ebarclfaO87ebxekabaDcdtfgraABdbarclfasBdbarcwfaOBdbkavc;abfalcitfgrasBdbaraABdlavaicdtfaABdbavc;abfalcefcsGcitfgraOBdbarasBdlavaicefgicsGcdtfasBdbavc;abfalcdfcsGcitfgraABdbaraOBdlavaiazcz6aXcsSVfgicsGcdtfaOBdbaiaCTaCcsSVfhialcifhlkawcefhwalcsGhlaicsGhiaDcifgDae6mbkkcbc99aoaqSEhokavc;aef8Kjjjjbaok:llevu8Jjjjjbcz9Rhvc9:hodnaecvfal0mbcuhoaiRbbc;:eGc;qe9hmbav9cb83iwaicefhraialfc98fhwdnaeTmbdnadcdSmbcbhDindnaraw6mbc9:skarcefhoar8SbbglcFeGhidndnalcu9mmbaohrxekarcvfhraicFbGhicrhldninao8SbbgdcFbGaltaiVhiadcu9kmeaocefhoalcrfglc8J9hmbxdkkaocefhrkabaDcdtfaicd4cbaice4ceG9R7avcwfaiceGcdtVgoydbfglBdbaoalBdbaDcefgDae9hmbxdkkcbhDindnaraw6mbc9:skarcefhoar8SbbglcFeGhidndnalcu9mmbaohrxekarcvfhraicFbGhicrhldninao8SbbgdcFbGaltaiVhiadcu9kmeaocefhoalcrfglc8J9hmbxdkkaocefhrkabaDcetfaicd4cbaice4ceG9R7avcwfaiceGcdtVgoydbfgl87ebaoalBdbaDcefgDae9hmbkkcbc99arawSEhokaok:EPliuo97eue978Jjjjjbca9Rhidndnadcl9hmbdnaec98GglTmbcbhvabhdinadadpbbbgocKp:RecKp:Sep;6egraocwp:RecKp:Sep;6earp;Geaoczp:RecKp:Sep;6egwp;Gep;Kep;LegDpxbbbbbbbbbbbbbbbbp:2egqarpxbbbjbbbjbbbjbbbjgkp9op9rp;Kegrpxbb;:9cbb;:9cbb;:9cbb;:9cararp;MeaDaDp;Meawaqawakp9op9rp;Kegrarp;Mep;Kep;Kep;Jep;Negwp;Mepxbbn0bbn0bbn0bbn0gqp;KepxFbbbFbbbFbbbFbbbp9oaopxbbbFbbbFbbbFbbbFp9op9qarawp;Meaqp;Kecwp:RepxbFbbbFbbbFbbbFbbp9op9qaDawp;Meaqp;Keczp:RepxbbFbbbFbbbFbbbFbp9op9qpkbbadczfhdavclfgval6mbkkalae9pmeaiaeciGgvcdtgdVcbczad9R;8kbaiabalcdtfglad;8qbbdnavTmbaiaipblbgocKp:RecKp:Sep;6egraocwp:RecKp:Sep;6earp;Geaoczp:RecKp:Sep;6egwp;Gep;Kep;LegDpxbbbbbbbbbbbbbbbbp:2egqarpxbbbjbbbjbbbjbbbjgkp9op9rp;Kegrpxbb;:9cbb;:9cbb;:9cbb;:9cararp;MeaDaDp;Meawaqawakp9op9rp;Kegrarp;Mep;Kep;Kep;Jep;Negwp;Mepxbbn0bbn0bbn0bbn0gqp;KepxFbbbFbbbFbbbFbbbp9oaopxbbbFbbbFbbbFbbbFp9op9qarawp;Meaqp;Kecwp:RepxbFbbbFbbbFbbbFbbp9op9qaDawp;Meaqp;Keczp:RepxbbFbbbFbbbFbbbFbp9op9qpklbkalaiad;8qbbskdnaec98GgxTmbcbhvabhdinadczfglalpbbbgopxbbbbbbFFbbbbbbFFgkp9oadpbbbgDaopmlvorxmPsCXQL358E8FpxFubbFubbFubbFubbp9op;6eaDaopmbediwDqkzHOAKY8AEgoczp:Sep;6egrp;Geaoczp:Reczp:Sep;6egwp;Gep;Kep;Legopxb;:FSb;:FSb;:FSb;:FSawaopxbbbbbbbbbbbbbbbbp:2egqawpxbbbjbbbjbbbjbbbjgmp9op9rp;Kegwawp;Meaoaop;Mearaqaramp9op9rp;Kegoaop;Mep;Kep;Kep;Jep;Negrp;Mepxbbn0bbn0bbn0bbn0gqp;Keczp:Reawarp;Meaqp;KepxFFbbFFbbFFbbFFbbp9op9qgwaoarp;Meaqp;KepxFFbbFFbbFFbbFFbbp9ogopmwDKYqk8AExm35Ps8E8Fp9qpkbbadaDakp9oawaopmbezHdiOAlvCXorQLp9qpkbbadcafhdavclfgvax6mbkkaxae9pmbaiaeciGgvcitgdfcbcaad9R;8kbaiabaxcitfglad;8qbbdnavTmbaiaipblzgopxbbbbbbFFbbbbbbFFgkp9oaipblbgDaopmlvorxmPsCXQL358E8FpxFubbFubbFubbFubbp9op;6eaDaopmbediwDqkzHOAKY8AEgoczp:Sep;6egrp;Geaoczp:Reczp:Sep;6egwp;Gep;Kep;Legopxb;:FSb;:FSb;:FSb;:FSawaopxbbbbbbbbbbbbbbbbp:2egqawpxbbbjbbbjbbbjbbbjgmp9op9rp;Kegwawp;Meaoaop;Mearaqaramp9op9rp;Kegoaop;Mep;Kep;Kep;Jep;Negrp;Mepxbbn0bbn0bbn0bbn0gqp;Keczp:Reawarp;Meaqp;KepxFFbbFFbbFFbbFFbbp9op9qgwaoarp;Meaqp;KepxFFbbFFbbFFbbFFbbp9ogopmwDKYqk8AExm35Ps8E8Fp9qpklzaiaDakp9oawaopmbezHdiOAlvCXorQLp9qpklbkalaiad;8qbbkk;4wllue97euv978Jjjjjbc8W9Rhidnaec98GglTmbcbhvabhoinaiaopbbbgraoczfgwpbbbgDpmlvorxmPsCXQL358E8Fgqczp:Segkclp:RepklbaopxbbjZbbjZbbjZbbjZpx;Zl81Z;Zl81Z;Zl81Z;Zl81Zakpxibbbibbbibbbibbbp9qp;6ep;NegkaraDpmbediwDqkzHOAKY8AEgrczp:Reczp:Sep;6ep;MegDaDp;Meakarczp:Sep;6ep;Megxaxp;Meakaqczp:Reczp:Sep;6ep;Megqaqp;Mep;Kep;Kep;Lepxbbbbbbbbbbbbbbbbp:4ep;Jepxb;:FSb;:FSb;:FSb;:FSgkp;Mepxbbn0bbn0bbn0bbn0grp;KepxFFbbFFbbFFbbFFbbgmp9oaxakp;Mearp;Keczp:Rep9qgxaqakp;Mearp;Keczp:ReaDakp;Mearp;Keamp9op9qgkpmbezHdiOAlvCXorQLgrp5baipblbpEb:T:j83ibaocwfarp5eaipblbpEe:T:j83ibawaxakpmwDKYqk8AExm35Ps8E8Fgkp5baipblbpEd:T:j83ibaocKfakp5eaipblbpEi:T:j83ibaocafhoavclfgval6mbkkdnalae9pmbaiaeciGgvcitgofcbcaao9R;8kbaiabalcitfgwao;8qbbdnavTmbaiaipblbgraipblzgDpmlvorxmPsCXQL358E8Fgqczp:Segkclp:RepklaaipxbbjZbbjZbbjZbbjZpx;Zl81Z;Zl81Z;Zl81Z;Zl81Zakpxibbbibbbibbbibbbp9qp;6ep;NegkaraDpmbediwDqkzHOAKY8AEgrczp:Reczp:Sep;6ep;MegDaDp;Meakarczp:Sep;6ep;Megxaxp;Meakaqczp:Reczp:Sep;6ep;Megqaqp;Mep;Kep;Kep;Lepxbbbbbbbbbbbbbbbbp:4ep;Jepxb;:FSb;:FSb;:FSb;:FSgkp;Mepxbbn0bbn0bbn0bbn0grp;KepxFFbbFFbbFFbbFFbbgmp9oaxakp;Mearp;Keczp:Rep9qgxaqakp;Mearp;Keczp:ReaDakp;Mearp;Keamp9op9qgkpmbezHdiOAlvCXorQLgrp5baipblapEb:T:j83ibaiarp5eaipblapEe:T:j83iwaiaxakpmwDKYqk8AExm35Ps8E8Fgkp5baipblapEd:T:j83izaiakp5eaipblapEi:T:j83iKkawaiao;8qbbkk:Pddiue978Jjjjjbc;ab9Rhidnadcd4ae2glc98GgvTmbcbhdabheinaeaepbbbgocwp:Recwp:Sep;6eaocep:SepxbbjZbbjZbbjZbbjZp:UepxbbjFbbjFbbjFbbjFp9op;Mepkbbaeczfheadclfgdav6mbkkdnaval9pmbaialciGgdcdtgeVcbc;abae9R;8kbaiabavcdtfgvae;8qbbdnadTmbaiaipblbgocwp:Recwp:Sep;6eaocep:SepxbbjZbbjZbbjZbbjZp:UepxbbjFbbjFbbjFbbjFp9op;Mepklbkavaiae;8qbbkk9teiucbcbydj1jjbgeabcifc98GfgbBdj1jjbdndnabZbcztgd9nmbcuhiabad9RcFFifcz4nbcuSmekaehikaikkkebcjwklz9Tbb\";\n\n\tvar detector = new Uint8Array([0,97,115,109,1,0,0,0,1,4,1,96,0,0,3,3,2,0,0,5,3,1,0,1,12,1,0,10,22,2,12,0,65,0,65,0,65,0,252,10,0,0,11,7,0,65,0,253,15,26,11]);\n\tvar wasmpack = new Uint8Array([32,0,65,2,1,106,34,33,3,128,11,4,13,64,6,253,10,7,15,116,127,5,8,12,40,16,19,54,20,9,27,255,113,17,42,67,24,23,146,148,18,14,22,45,70,69,56,114,101,21,25,63,75,136,108,28,118,29,73,115]);\n\n\tif (typeof WebAssembly !== 'object') {\n\t\treturn {\n\t\t\tsupported: false,\n\t\t};\n\t}\n\n\tvar wasm = WebAssembly.validate(detector) ? wasm_simd : wasm_base;\n\n\tvar instance;\n\n\tvar ready =\n\t\tWebAssembly.instantiate(unpack(wasm), {})\n\t\t.then(function(result) {\n\t\t\tinstance = result.instance;\n\t\t\tinstance.exports.__wasm_call_ctors();\n\t\t});\n\n\tfunction unpack(data) {\n\t\tvar result = new Uint8Array(data.length);\n\t\tfor (var i = 0; i < data.length; ++i) {\n\t\t\tvar ch = data.charCodeAt(i);\n\t\t\tresult[i] = ch > 96 ? ch - 97 : ch > 64 ? ch - 39 : ch + 4;\n\t\t}\n\t\tvar write = 0;\n\t\tfor (var i = 0; i < data.length; ++i) {\n\t\t\tresult[write++] = (result[i] < 60) ? wasmpack[result[i]] : (result[i] - 60) * 64 + result[++i];\n\t\t}\n\t\treturn result.buffer.slice(0, write);\n\t}\n\n\tfunction decode(fun, target, count, size, source, filter) {\n\t\tvar sbrk = instance.exports.sbrk;\n\t\tvar count4 = (count + 3) & ~3;\n\t\tvar tp = sbrk(count4 * size);\n\t\tvar sp = sbrk(source.length);\n\t\tvar heap = new Uint8Array(instance.exports.memory.buffer);\n\t\theap.set(source, sp);\n\t\tvar res = fun(tp, count, size, sp, source.length);\n\t\tif (res == 0 && filter) {\n\t\t\tfilter(tp, count4, size);\n\t\t}\n\t\ttarget.set(heap.subarray(tp, tp + count * size));\n\t\tsbrk(tp - sbrk(0));\n\t\tif (res != 0) {\n\t\t\tthrow new Error(\"Malformed buffer data: \" + res);\n\t\t}\n\t}\n\n\tvar filters = {\n\t\tNONE: \"\",\n\t\tOCTAHEDRAL: \"meshopt_decodeFilterOct\",\n\t\tQUATERNION: \"meshopt_decodeFilterQuat\",\n\t\tEXPONENTIAL: \"meshopt_decodeFilterExp\",\n\t};\n\n\tvar decoders = {\n\t\tATTRIBUTES: \"meshopt_decodeVertexBuffer\",\n\t\tTRIANGLES: \"meshopt_decodeIndexBuffer\",\n\t\tINDICES: \"meshopt_decodeIndexSequence\",\n\t};\n\n\tvar workers = [];\n\tvar requestId = 0;\n\n\tfunction createWorker(url) {\n\t\tvar worker = {\n\t\t\tobject: new Worker(url),\n\t\t\tpending: 0,\n\t\t\trequests: {}\n\t\t};\n\n\t\tworker.object.onmessage = function(event) {\n\t\t\tvar data = event.data;\n\n\t\t\tworker.pending -= data.count;\n\t\t\tworker.requests[data.id][data.action](data.value);\n\n\t\t\tdelete worker.requests[data.id];\n\t\t};\n\n\t\treturn worker;\n\t}\n\n\tfunction initWorkers(count) {\n\t\tvar source =\n\t\t\t\"var instance; var ready = WebAssembly.instantiate(new Uint8Array([\" + new Uint8Array(unpack(wasm)) + \"]), {})\" +\n\t\t\t\".then(function(result) { instance = result.instance; instance.exports.__wasm_call_ctors(); });\" +\n\t\t\t\"self.onmessage = workerProcess;\" +\n\t\t\tdecode.toString() + workerProcess.toString();\n\n\t\tvar blob = new Blob([source], {type: 'text/javascript'});\n\t\tvar url = URL.createObjectURL(blob);\n\n\t\tfor (var i = 0; i < count; ++i) {\n\t\t\tworkers[i] = createWorker(url);\n\t\t}\n\n\t\tURL.revokeObjectURL(url);\n\t}\n\n\tfunction decodeWorker(count, size, source, mode, filter) {\n\t\tvar worker = workers[0];\n\n\t\tfor (var i = 1; i < workers.length; ++i) {\n\t\t\tif (workers[i].pending < worker.pending) {\n\t\t\t\tworker = workers[i];\n\t\t\t}\n\t\t}\n\n\t\treturn new Promise(function (resolve, reject) {\n\t\t\tvar data = new Uint8Array(source);\n\t\t\tvar id = requestId++;\n\n\t\t\tworker.pending += count;\n\t\t\tworker.requests[id] = { resolve: resolve, reject: reject };\n\t\t\tworker.object.postMessage({ id: id, count: count, size: size, source: data, mode: mode, filter: filter }, [ data.buffer ]);\n\t\t});\n\t}\n\n\tfunction workerProcess(event) {\n\t\tready.then(function() {\n\t\t\tvar data = event.data;\n\t\t\ttry {\n\t\t\t\tvar target = new Uint8Array(data.count * data.size);\n\t\t\t\tdecode(instance.exports[data.mode], target, data.count, data.size, data.source, instance.exports[data.filter]);\n\t\t\t\tself.postMessage({ id: data.id, count: data.count, action: \"resolve\", value: target }, [ target.buffer ]);\n\t\t\t} catch (error) {\n\t\t\t\tself.postMessage({ id: data.id, count: data.count, action: \"reject\", value: error });\n\t\t\t}\n\t\t});\n\t}\n\n\treturn {\n\t\tready: ready,\n\t\tsupported: true,\n\t\tuseWorkers: function(count) {\n\t\t\tinitWorkers(count);\n\t\t},\n\t\tdecodeVertexBuffer: function(target, count, size, source, filter) {\n\t\t\tdecode(instance.exports.meshopt_decodeVertexBuffer, target, count, size, source, instance.exports[filters[filter]]);\n\t\t},\n\t\tdecodeIndexBuffer: function(target, count, size, source) {\n\t\t\tdecode(instance.exports.meshopt_decodeIndexBuffer, target, count, size, source);\n\t\t},\n\t\tdecodeIndexSequence: function(target, count, size, source) {\n\t\t\tdecode(instance.exports.meshopt_decodeIndexSequence, target, count, size, source);\n\t\t},\n\t\tdecodeGltfBuffer: function(target, count, size, source, mode, filter) {\n\t\t\tdecode(instance.exports[decoders[mode]], target, count, size, source, instance.exports[filters[filter]]);\n\t\t},\n\t\tdecodeGltfBufferAsync: function(count, size, source, mode, filter) {\n\t\t\tif (workers.length > 0) {\n\t\t\t\treturn decodeWorker(count, size, source, decoders[mode], filters[filter]);\n\t\t\t}\n\n\t\t\treturn ready.then(function() {\n\t\t\t\tvar target = new Uint8Array(count * size);\n\t\t\t\tdecode(instance.exports[decoders[mode]], target, count, size, source, instance.exports[filters[filter]]);\n\t\t\t\treturn target;\n\t\t\t});\n\t\t}\n\t};\n})();\n\nexport { MeshoptDecoder };\n"
  },
  {
    "path": "examples/libs/nanobar.js",
    "content": "/* http://nanobar.micronube.com/  ||  https://github.com/jacoborus/nanobar/    MIT LICENSE */\n(function (root) {\n  'use strict'\n  // container styles\n  var css = '.nanobar{width:100%;height:4px;z-index:9999;top:0}.bar{width:0;height:100%;transition:height .3s;background:#000}'\n\n  // add required css in head div\n  function addCss () {\n    var s = document.getElementById('nanobarcss')\n\n    // check whether style tag is already inserted\n    if (s === null) {\n      s = document.createElement('style')\n      s.type = 'text/css'\n      s.id = 'nanobarcss'\n      document.head.insertBefore(s, document.head.firstChild)\n      // the world\n      if (!s.styleSheet) return s.appendChild(document.createTextNode(css))\n      // IE\n      s.styleSheet.cssText = css\n    }\n  }\n\n  function addClass (el, cls) {\n    if (el.classList) el.classList.add(cls)\n    else el.className += ' ' + cls\n  }\n\n  // create a progress bar\n  // this will be destroyed after reaching 100% progress\n  function createBar (rm) {\n    // create progress element\n    var el = document.createElement('div'),\n        width = 0,\n        here = 0,\n        on = 0,\n        bar = {\n          el: el,\n          go: go\n        }\n\n    addClass(el, 'bar')\n\n    // animation loop\n    function move () {\n      var dist = width - here\n\n      if (dist < 0.1 && dist > -0.1) {\n        place(here)\n        on = 0\n        if (width >= 100) {\n          el.style.height = 0\n          setTimeout(function () {\n            rm(el)\n          }, 300)\n        }\n      } else {\n        place(width - dist / 4)\n        setTimeout(go, 16)\n      }\n    }\n\n    // set bar width\n    function place (num) {\n      width = num\n      el.style.width = width + '%'\n    }\n\n    function go (num) {\n      if (num >= 0) {\n        here = num\n        if (!on) {\n          on = 1\n          move()\n        }\n      } else if (on) {\n        move()\n      }\n    }\n    return bar\n  }\n\n  function Nanobar (opts) {\n    opts = opts || {}\n    // set options\n    var el = document.createElement('div'),\n        applyGo,\n        nanobar = {\n          el: el,\n          go: function (p) {\n            // expand bar\n            applyGo(p)\n            // create new bar when progress reaches 100%\n            if (p >= 100) {\n              init()\n            }\n          }\n        }\n\n    // remove element from nanobar container\n    function rm (child) {\n      el.removeChild(child)\n    }\n\n    // create and insert progress var in nanobar container\n    function init () {\n      var bar = createBar(rm)\n      el.appendChild(bar.el)\n      applyGo = bar.go\n    }\n\n    addCss()\n\n    addClass(el, 'nanobar')\n    if (opts.id) el.id = opts.id\n    if (opts.classname) addClass(el, opts.classname)\n\n    // insert container\n    if (opts.target) {\n      // inside a div\n      el.style.position = 'relative'\n      opts.target.insertBefore(el, opts.target.firstChild)\n    } else {\n      // on top of the page\n      el.style.position = 'fixed'\n      document.getElementsByTagName('body')[0].appendChild(el)\n    }\n\n    init()\n    return nanobar\n  }\n\n  if (typeof exports === 'object') {\n    // CommonJS\n    module.exports = Nanobar\n  } else if (typeof define === 'function' && define.amd) {\n    // AMD. Register as an anonymous module.\n    define([], function () { return Nanobar })\n  } else {\n    // Browser globals\n    window.Nanobar = Nanobar\n  }\n}(this))\n\n"
  },
  {
    "path": "examples/libs/simplex-noise.js",
    "content": "/*\n * A fast javascript implementation of simplex noise by Jonas Wagner\n\nBased on a speed-improved simplex noise algorithm for 2D, 3D and 4D in Java.\nWhich is based on example code by Stefan Gustavson (stegu@itn.liu.se).\nWith Optimisations by Peter Eastman (peastman@drizzle.stanford.edu).\nBetter rank ordering method by Stefan Gustavson in 2012.\n\n Copyright (c) 2018 Jonas Wagner\n\n Permission is hereby granted, free of charge, to any person obtaining a copy\n of this software and associated documentation files (the \"Software\"), to deal\n in the Software without restriction, including without limitation the rights\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n copies of the Software, and to permit persons to whom the Software is\n furnished to do so, subject to the following conditions:\n\n The above copyright notice and this permission notice shall be included in all\n copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n SOFTWARE.\n */\n(function() {\n  'use strict';\n\n  var F2 = 0.5 * (Math.sqrt(3.0) - 1.0);\n  var G2 = (3.0 - Math.sqrt(3.0)) / 6.0;\n  var F3 = 1.0 / 3.0;\n  var G3 = 1.0 / 6.0;\n  var F4 = (Math.sqrt(5.0) - 1.0) / 4.0;\n  var G4 = (5.0 - Math.sqrt(5.0)) / 20.0;\n\n  function SimplexNoise(randomOrSeed) {\n    var random;\n    if (typeof randomOrSeed == 'function') {\n      random = randomOrSeed;\n    }\n    else if (randomOrSeed) {\n      random = alea(randomOrSeed);\n    } else {\n      random = Math.random;\n    }\n    this.p = buildPermutationTable(random);\n    this.perm = new Uint8Array(512);\n    this.permMod12 = new Uint8Array(512);\n    for (var i = 0; i < 512; i++) {\n      this.perm[i] = this.p[i & 255];\n      this.permMod12[i] = this.perm[i] % 12;\n    }\n\n  }\n  SimplexNoise.prototype = {\n    grad3: new Float32Array([1, 1, 0,\n      -1, 1, 0,\n      1, -1, 0,\n\n      -1, -1, 0,\n      1, 0, 1,\n      -1, 0, 1,\n\n      1, 0, -1,\n      -1, 0, -1,\n      0, 1, 1,\n\n      0, -1, 1,\n      0, 1, -1,\n      0, -1, -1]),\n    grad4: new Float32Array([0, 1, 1, 1, 0, 1, 1, -1, 0, 1, -1, 1, 0, 1, -1, -1,\n      0, -1, 1, 1, 0, -1, 1, -1, 0, -1, -1, 1, 0, -1, -1, -1,\n      1, 0, 1, 1, 1, 0, 1, -1, 1, 0, -1, 1, 1, 0, -1, -1,\n      -1, 0, 1, 1, -1, 0, 1, -1, -1, 0, -1, 1, -1, 0, -1, -1,\n      1, 1, 0, 1, 1, 1, 0, -1, 1, -1, 0, 1, 1, -1, 0, -1,\n      -1, 1, 0, 1, -1, 1, 0, -1, -1, -1, 0, 1, -1, -1, 0, -1,\n      1, 1, 1, 0, 1, 1, -1, 0, 1, -1, 1, 0, 1, -1, -1, 0,\n      -1, 1, 1, 0, -1, 1, -1, 0, -1, -1, 1, 0, -1, -1, -1, 0]),\n    noise2D: function(xin, yin) {\n      var permMod12 = this.permMod12;\n      var perm = this.perm;\n      var grad3 = this.grad3;\n      var n0 = 0; // Noise contributions from the three corners\n      var n1 = 0;\n      var n2 = 0;\n      // Skew the input space to determine which simplex cell we're in\n      var s = (xin + yin) * F2; // Hairy factor for 2D\n      var i = Math.floor(xin + s);\n      var j = Math.floor(yin + s);\n      var t = (i + j) * G2;\n      var X0 = i - t; // Unskew the cell origin back to (x,y) space\n      var Y0 = j - t;\n      var x0 = xin - X0; // The x,y distances from the cell origin\n      var y0 = yin - Y0;\n      // For the 2D case, the simplex shape is an equilateral triangle.\n      // Determine which simplex we are in.\n      var i1, j1; // Offsets for second (middle) corner of simplex in (i,j) coords\n      if (x0 > y0) {\n        i1 = 1;\n        j1 = 0;\n      } // lower triangle, XY order: (0,0)->(1,0)->(1,1)\n      else {\n        i1 = 0;\n        j1 = 1;\n      } // upper triangle, YX order: (0,0)->(0,1)->(1,1)\n      // A step of (1,0) in (i,j) means a step of (1-c,-c) in (x,y), and\n      // a step of (0,1) in (i,j) means a step of (-c,1-c) in (x,y), where\n      // c = (3-sqrt(3))/6\n      var x1 = x0 - i1 + G2; // Offsets for middle corner in (x,y) unskewed coords\n      var y1 = y0 - j1 + G2;\n      var x2 = x0 - 1.0 + 2.0 * G2; // Offsets for last corner in (x,y) unskewed coords\n      var y2 = y0 - 1.0 + 2.0 * G2;\n      // Work out the hashed gradient indices of the three simplex corners\n      var ii = i & 255;\n      var jj = j & 255;\n      // Calculate the contribution from the three corners\n      var t0 = 0.5 - x0 * x0 - y0 * y0;\n      if (t0 >= 0) {\n        var gi0 = permMod12[ii + perm[jj]] * 3;\n        t0 *= t0;\n        n0 = t0 * t0 * (grad3[gi0] * x0 + grad3[gi0 + 1] * y0); // (x,y) of grad3 used for 2D gradient\n      }\n      var t1 = 0.5 - x1 * x1 - y1 * y1;\n      if (t1 >= 0) {\n        var gi1 = permMod12[ii + i1 + perm[jj + j1]] * 3;\n        t1 *= t1;\n        n1 = t1 * t1 * (grad3[gi1] * x1 + grad3[gi1 + 1] * y1);\n      }\n      var t2 = 0.5 - x2 * x2 - y2 * y2;\n      if (t2 >= 0) {\n        var gi2 = permMod12[ii + 1 + perm[jj + 1]] * 3;\n        t2 *= t2;\n        n2 = t2 * t2 * (grad3[gi2] * x2 + grad3[gi2 + 1] * y2);\n      }\n      // Add contributions from each corner to get the final noise value.\n      // The result is scaled to return values in the interval [-1,1].\n      return 70.0 * (n0 + n1 + n2);\n    },\n    // 3D simplex noise\n    noise3D: function(xin, yin, zin) {\n      var permMod12 = this.permMod12;\n      var perm = this.perm;\n      var grad3 = this.grad3;\n      var n0, n1, n2, n3; // Noise contributions from the four corners\n      // Skew the input space to determine which simplex cell we're in\n      var s = (xin + yin + zin) * F3; // Very nice and simple skew factor for 3D\n      var i = Math.floor(xin + s);\n      var j = Math.floor(yin + s);\n      var k = Math.floor(zin + s);\n      var t = (i + j + k) * G3;\n      var X0 = i - t; // Unskew the cell origin back to (x,y,z) space\n      var Y0 = j - t;\n      var Z0 = k - t;\n      var x0 = xin - X0; // The x,y,z distances from the cell origin\n      var y0 = yin - Y0;\n      var z0 = zin - Z0;\n      // For the 3D case, the simplex shape is a slightly irregular tetrahedron.\n      // Determine which simplex we are in.\n      var i1, j1, k1; // Offsets for second corner of simplex in (i,j,k) coords\n      var i2, j2, k2; // Offsets for third corner of simplex in (i,j,k) coords\n      if (x0 >= y0) {\n        if (y0 >= z0) {\n          i1 = 1;\n          j1 = 0;\n          k1 = 0;\n          i2 = 1;\n          j2 = 1;\n          k2 = 0;\n        } // X Y Z order\n        else if (x0 >= z0) {\n          i1 = 1;\n          j1 = 0;\n          k1 = 0;\n          i2 = 1;\n          j2 = 0;\n          k2 = 1;\n        } // X Z Y order\n        else {\n          i1 = 0;\n          j1 = 0;\n          k1 = 1;\n          i2 = 1;\n          j2 = 0;\n          k2 = 1;\n        } // Z X Y order\n      }\n      else { // x0<y0\n        if (y0 < z0) {\n          i1 = 0;\n          j1 = 0;\n          k1 = 1;\n          i2 = 0;\n          j2 = 1;\n          k2 = 1;\n        } // Z Y X order\n        else if (x0 < z0) {\n          i1 = 0;\n          j1 = 1;\n          k1 = 0;\n          i2 = 0;\n          j2 = 1;\n          k2 = 1;\n        } // Y Z X order\n        else {\n          i1 = 0;\n          j1 = 1;\n          k1 = 0;\n          i2 = 1;\n          j2 = 1;\n          k2 = 0;\n        } // Y X Z order\n      }\n      // A step of (1,0,0) in (i,j,k) means a step of (1-c,-c,-c) in (x,y,z),\n      // a step of (0,1,0) in (i,j,k) means a step of (-c,1-c,-c) in (x,y,z), and\n      // a step of (0,0,1) in (i,j,k) means a step of (-c,-c,1-c) in (x,y,z), where\n      // c = 1/6.\n      var x1 = x0 - i1 + G3; // Offsets for second corner in (x,y,z) coords\n      var y1 = y0 - j1 + G3;\n      var z1 = z0 - k1 + G3;\n      var x2 = x0 - i2 + 2.0 * G3; // Offsets for third corner in (x,y,z) coords\n      var y2 = y0 - j2 + 2.0 * G3;\n      var z2 = z0 - k2 + 2.0 * G3;\n      var x3 = x0 - 1.0 + 3.0 * G3; // Offsets for last corner in (x,y,z) coords\n      var y3 = y0 - 1.0 + 3.0 * G3;\n      var z3 = z0 - 1.0 + 3.0 * G3;\n      // Work out the hashed gradient indices of the four simplex corners\n      var ii = i & 255;\n      var jj = j & 255;\n      var kk = k & 255;\n      // Calculate the contribution from the four corners\n      var t0 = 0.6 - x0 * x0 - y0 * y0 - z0 * z0;\n      if (t0 < 0) n0 = 0.0;\n      else {\n        var gi0 = permMod12[ii + perm[jj + perm[kk]]] * 3;\n        t0 *= t0;\n        n0 = t0 * t0 * (grad3[gi0] * x0 + grad3[gi0 + 1] * y0 + grad3[gi0 + 2] * z0);\n      }\n      var t1 = 0.6 - x1 * x1 - y1 * y1 - z1 * z1;\n      if (t1 < 0) n1 = 0.0;\n      else {\n        var gi1 = permMod12[ii + i1 + perm[jj + j1 + perm[kk + k1]]] * 3;\n        t1 *= t1;\n        n1 = t1 * t1 * (grad3[gi1] * x1 + grad3[gi1 + 1] * y1 + grad3[gi1 + 2] * z1);\n      }\n      var t2 = 0.6 - x2 * x2 - y2 * y2 - z2 * z2;\n      if (t2 < 0) n2 = 0.0;\n      else {\n        var gi2 = permMod12[ii + i2 + perm[jj + j2 + perm[kk + k2]]] * 3;\n        t2 *= t2;\n        n2 = t2 * t2 * (grad3[gi2] * x2 + grad3[gi2 + 1] * y2 + grad3[gi2 + 2] * z2);\n      }\n      var t3 = 0.6 - x3 * x3 - y3 * y3 - z3 * z3;\n      if (t3 < 0) n3 = 0.0;\n      else {\n        var gi3 = permMod12[ii + 1 + perm[jj + 1 + perm[kk + 1]]] * 3;\n        t3 *= t3;\n        n3 = t3 * t3 * (grad3[gi3] * x3 + grad3[gi3 + 1] * y3 + grad3[gi3 + 2] * z3);\n      }\n      // Add contributions from each corner to get the final noise value.\n      // The result is scaled to stay just inside [-1,1]\n      return 32.0 * (n0 + n1 + n2 + n3);\n    },\n    // 4D simplex noise, better simplex rank ordering method 2012-03-09\n    noise4D: function(x, y, z, w) {\n      var perm = this.perm;\n      var grad4 = this.grad4;\n\n      var n0, n1, n2, n3, n4; // Noise contributions from the five corners\n      // Skew the (x,y,z,w) space to determine which cell of 24 simplices we're in\n      var s = (x + y + z + w) * F4; // Factor for 4D skewing\n      var i = Math.floor(x + s);\n      var j = Math.floor(y + s);\n      var k = Math.floor(z + s);\n      var l = Math.floor(w + s);\n      var t = (i + j + k + l) * G4; // Factor for 4D unskewing\n      var X0 = i - t; // Unskew the cell origin back to (x,y,z,w) space\n      var Y0 = j - t;\n      var Z0 = k - t;\n      var W0 = l - t;\n      var x0 = x - X0; // The x,y,z,w distances from the cell origin\n      var y0 = y - Y0;\n      var z0 = z - Z0;\n      var w0 = w - W0;\n      // For the 4D case, the simplex is a 4D shape I won't even try to describe.\n      // To find out which of the 24 possible simplices we're in, we need to\n      // determine the magnitude ordering of x0, y0, z0 and w0.\n      // Six pair-wise comparisons are performed between each possible pair\n      // of the four coordinates, and the results are used to rank the numbers.\n      var rankx = 0;\n      var ranky = 0;\n      var rankz = 0;\n      var rankw = 0;\n      if (x0 > y0) rankx++;\n      else ranky++;\n      if (x0 > z0) rankx++;\n      else rankz++;\n      if (x0 > w0) rankx++;\n      else rankw++;\n      if (y0 > z0) ranky++;\n      else rankz++;\n      if (y0 > w0) ranky++;\n      else rankw++;\n      if (z0 > w0) rankz++;\n      else rankw++;\n      var i1, j1, k1, l1; // The integer offsets for the second simplex corner\n      var i2, j2, k2, l2; // The integer offsets for the third simplex corner\n      var i3, j3, k3, l3; // The integer offsets for the fourth simplex corner\n      // simplex[c] is a 4-vector with the numbers 0, 1, 2 and 3 in some order.\n      // Many values of c will never occur, since e.g. x>y>z>w makes x<z, y<w and x<w\n      // impossible. Only the 24 indices which have non-zero entries make any sense.\n      // We use a thresholding to set the coordinates in turn from the largest magnitude.\n      // Rank 3 denotes the largest coordinate.\n      i1 = rankx >= 3 ? 1 : 0;\n      j1 = ranky >= 3 ? 1 : 0;\n      k1 = rankz >= 3 ? 1 : 0;\n      l1 = rankw >= 3 ? 1 : 0;\n      // Rank 2 denotes the second largest coordinate.\n      i2 = rankx >= 2 ? 1 : 0;\n      j2 = ranky >= 2 ? 1 : 0;\n      k2 = rankz >= 2 ? 1 : 0;\n      l2 = rankw >= 2 ? 1 : 0;\n      // Rank 1 denotes the second smallest coordinate.\n      i3 = rankx >= 1 ? 1 : 0;\n      j3 = ranky >= 1 ? 1 : 0;\n      k3 = rankz >= 1 ? 1 : 0;\n      l3 = rankw >= 1 ? 1 : 0;\n      // The fifth corner has all coordinate offsets = 1, so no need to compute that.\n      var x1 = x0 - i1 + G4; // Offsets for second corner in (x,y,z,w) coords\n      var y1 = y0 - j1 + G4;\n      var z1 = z0 - k1 + G4;\n      var w1 = w0 - l1 + G4;\n      var x2 = x0 - i2 + 2.0 * G4; // Offsets for third corner in (x,y,z,w) coords\n      var y2 = y0 - j2 + 2.0 * G4;\n      var z2 = z0 - k2 + 2.0 * G4;\n      var w2 = w0 - l2 + 2.0 * G4;\n      var x3 = x0 - i3 + 3.0 * G4; // Offsets for fourth corner in (x,y,z,w) coords\n      var y3 = y0 - j3 + 3.0 * G4;\n      var z3 = z0 - k3 + 3.0 * G4;\n      var w3 = w0 - l3 + 3.0 * G4;\n      var x4 = x0 - 1.0 + 4.0 * G4; // Offsets for last corner in (x,y,z,w) coords\n      var y4 = y0 - 1.0 + 4.0 * G4;\n      var z4 = z0 - 1.0 + 4.0 * G4;\n      var w4 = w0 - 1.0 + 4.0 * G4;\n      // Work out the hashed gradient indices of the five simplex corners\n      var ii = i & 255;\n      var jj = j & 255;\n      var kk = k & 255;\n      var ll = l & 255;\n      // Calculate the contribution from the five corners\n      var t0 = 0.6 - x0 * x0 - y0 * y0 - z0 * z0 - w0 * w0;\n      if (t0 < 0) n0 = 0.0;\n      else {\n        var gi0 = (perm[ii + perm[jj + perm[kk + perm[ll]]]] % 32) * 4;\n        t0 *= t0;\n        n0 = t0 * t0 * (grad4[gi0] * x0 + grad4[gi0 + 1] * y0 + grad4[gi0 + 2] * z0 + grad4[gi0 + 3] * w0);\n      }\n      var t1 = 0.6 - x1 * x1 - y1 * y1 - z1 * z1 - w1 * w1;\n      if (t1 < 0) n1 = 0.0;\n      else {\n        var gi1 = (perm[ii + i1 + perm[jj + j1 + perm[kk + k1 + perm[ll + l1]]]] % 32) * 4;\n        t1 *= t1;\n        n1 = t1 * t1 * (grad4[gi1] * x1 + grad4[gi1 + 1] * y1 + grad4[gi1 + 2] * z1 + grad4[gi1 + 3] * w1);\n      }\n      var t2 = 0.6 - x2 * x2 - y2 * y2 - z2 * z2 - w2 * w2;\n      if (t2 < 0) n2 = 0.0;\n      else {\n        var gi2 = (perm[ii + i2 + perm[jj + j2 + perm[kk + k2 + perm[ll + l2]]]] % 32) * 4;\n        t2 *= t2;\n        n2 = t2 * t2 * (grad4[gi2] * x2 + grad4[gi2 + 1] * y2 + grad4[gi2 + 2] * z2 + grad4[gi2 + 3] * w2);\n      }\n      var t3 = 0.6 - x3 * x3 - y3 * y3 - z3 * z3 - w3 * w3;\n      if (t3 < 0) n3 = 0.0;\n      else {\n        var gi3 = (perm[ii + i3 + perm[jj + j3 + perm[kk + k3 + perm[ll + l3]]]] % 32) * 4;\n        t3 *= t3;\n        n3 = t3 * t3 * (grad4[gi3] * x3 + grad4[gi3 + 1] * y3 + grad4[gi3 + 2] * z3 + grad4[gi3 + 3] * w3);\n      }\n      var t4 = 0.6 - x4 * x4 - y4 * y4 - z4 * z4 - w4 * w4;\n      if (t4 < 0) n4 = 0.0;\n      else {\n        var gi4 = (perm[ii + 1 + perm[jj + 1 + perm[kk + 1 + perm[ll + 1]]]] % 32) * 4;\n        t4 *= t4;\n        n4 = t4 * t4 * (grad4[gi4] * x4 + grad4[gi4 + 1] * y4 + grad4[gi4 + 2] * z4 + grad4[gi4 + 3] * w4);\n      }\n      // Sum up and scale the result to cover the range [-1,1]\n      return 27.0 * (n0 + n1 + n2 + n3 + n4);\n    }\n  };\n\n  function buildPermutationTable(random) {\n    var i;\n    var p = new Uint8Array(256);\n    for (i = 0; i < 256; i++) {\n      p[i] = i;\n    }\n    for (i = 0; i < 255; i++) {\n      var r = i + ~~(random() * (256 - i));\n      var aux = p[i];\n      p[i] = p[r];\n      p[r] = aux;\n    }\n    return p;\n  }\n  SimplexNoise._buildPermutationTable = buildPermutationTable;\n\n  /*\n  The ALEA PRNG and masher code used by simplex-noise.js\n  is based on code by Johannes Baagøe, modified by Jonas Wagner.\n  See alea.md for the full license.\n  */\n  function alea() {\n    var s0 = 0;\n    var s1 = 0;\n    var s2 = 0;\n    var c = 1;\n\n    var mash = masher();\n    s0 = mash(' ');\n    s1 = mash(' ');\n    s2 = mash(' ');\n\n    for (var i = 0; i < arguments.length; i++) {\n      s0 -= mash(arguments[i]);\n      if (s0 < 0) {\n        s0 += 1;\n      }\n      s1 -= mash(arguments[i]);\n      if (s1 < 0) {\n        s1 += 1;\n      }\n      s2 -= mash(arguments[i]);\n      if (s2 < 0) {\n        s2 += 1;\n      }\n    }\n    mash = null;\n    return function() {\n      var t = 2091639 * s0 + c * 2.3283064365386963e-10; // 2^-32\n      s0 = s1;\n      s1 = s2;\n      return s2 = t - (c = t | 0);\n    };\n  }\n  function masher() {\n    var n = 0xefc8249d;\n    return function(data) {\n      data = data.toString();\n      for (var i = 0; i < data.length; i++) {\n        n += data.charCodeAt(i);\n        var h = 0.02519603282416938 * n;\n        n = h >>> 0;\n        h -= n;\n        h *= n;\n        n = h >>> 0;\n        h -= n;\n        n += h * 0x100000000; // 2^32\n      }\n      return (n >>> 0) * 2.3283064365386963e-10; // 2^-32\n    };\n  }\n\n  // amd\n  if (typeof define !== 'undefined' && define.amd) define(function() {return SimplexNoise;});\n  // common js\n  if (typeof exports !== 'undefined') exports.SimplexNoise = SimplexNoise;\n  // browser\n  else if (typeof window !== 'undefined') window.SimplexNoise = SimplexNoise;\n  // nodejs\n  if (typeof module !== 'undefined') {\n    module.exports = SimplexNoise;\n  }\n\n})();\n\n"
  },
  {
    "path": "examples/libs/stats.module.js",
    "content": "var Stats = function () {\n\n\tvar mode = 0;\n\n\tvar container = document.createElement( 'div' );\n\tcontainer.style.cssText = 'position:fixed;top:0;left:0;cursor:pointer;opacity:0.9;z-index:10000';\n\tcontainer.addEventListener( 'click', function ( event ) {\n\n\t\tevent.preventDefault();\n\t\tshowPanel( ++ mode % container.children.length );\n\n\t}, false );\n\n\t//\n\n\tfunction addPanel( panel ) {\n\n\t\tcontainer.appendChild( panel.dom );\n\t\treturn panel;\n\n\t}\n\n\tfunction showPanel( id ) {\n\n\t\tfor ( var i = 0; i < container.children.length; i ++ ) {\n\n\t\t\tcontainer.children[ i ].style.display = i === id ? 'block' : 'none';\n\n\t\t}\n\n\t\tmode = id;\n\n\t}\n\n\t//\n\n\tvar beginTime = ( performance || Date ).now(), prevTime = beginTime, frames = 0;\n\n\tvar fpsPanel = addPanel( new Stats.Panel( 'FPS', '#0ff', '#002' ) );\n\tvar msPanel = addPanel( new Stats.Panel( 'MS', '#0f0', '#020' ) );\n\n\tif ( self.performance && self.performance.memory ) {\n\n\t\tvar memPanel = addPanel( new Stats.Panel( 'MB', '#f08', '#201' ) );\n\n\t}\n\n\tshowPanel( 0 );\n\n\treturn {\n\n\t\tREVISION: 16,\n\n\t\tdom: container,\n\n\t\taddPanel: addPanel,\n\t\tshowPanel: showPanel,\n\n\t\tbegin: function () {\n\n\t\t\tbeginTime = ( performance || Date ).now();\n\n\t\t},\n\n\t\tend: function () {\n\n\t\t\tframes ++;\n\n\t\t\tvar time = ( performance || Date ).now();\n\n\t\t\tmsPanel.update( time - beginTime, 200 );\n\n\t\t\tif ( time >= prevTime + 1000 ) {\n\n\t\t\t\tfpsPanel.update( ( frames * 1000 ) / ( time - prevTime ), 100 );\n\n\t\t\t\tprevTime = time;\n\t\t\t\tframes = 0;\n\n\t\t\t\tif ( memPanel ) {\n\n\t\t\t\t\tvar memory = performance.memory;\n\t\t\t\t\tmemPanel.update( memory.usedJSHeapSize / 1048576, memory.jsHeapSizeLimit / 1048576 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn time;\n\n\t\t},\n\n\t\tupdate: function () {\n\n\t\t\tbeginTime = this.end();\n\n\t\t},\n\n\t\t// Backwards Compatibility\n\n\t\tdomElement: container,\n\t\tsetMode: showPanel\n\n\t};\n\n};\n\nStats.Panel = function ( name, fg, bg ) {\n\n\tvar min = Infinity, max = 0, round = Math.round;\n\tvar PR = round( window.devicePixelRatio || 1 );\n\n\tvar WIDTH = 80 * PR, HEIGHT = 48 * PR,\n\t\tTEXT_X = 3 * PR, TEXT_Y = 2 * PR,\n\t\tGRAPH_X = 3 * PR, GRAPH_Y = 15 * PR,\n\t\tGRAPH_WIDTH = 74 * PR, GRAPH_HEIGHT = 30 * PR;\n\n\tvar canvas = document.createElement( 'canvas' );\n\tcanvas.width = WIDTH;\n\tcanvas.height = HEIGHT;\n\tcanvas.style.cssText = 'width:80px;height:48px';\n\n\tvar context = canvas.getContext( '2d' );\n\tcontext.font = 'bold ' + ( 9 * PR ) + 'px Helvetica,Arial,sans-serif';\n\tcontext.textBaseline = 'top';\n\n\tcontext.fillStyle = bg;\n\tcontext.fillRect( 0, 0, WIDTH, HEIGHT );\n\n\tcontext.fillStyle = fg;\n\tcontext.fillText( name, TEXT_X, TEXT_Y );\n\tcontext.fillRect( GRAPH_X, GRAPH_Y, GRAPH_WIDTH, GRAPH_HEIGHT );\n\n\tcontext.fillStyle = bg;\n\tcontext.globalAlpha = 0.9;\n\tcontext.fillRect( GRAPH_X, GRAPH_Y, GRAPH_WIDTH, GRAPH_HEIGHT );\n\n\treturn {\n\n\t\tdom: canvas,\n\n\t\tupdate: function ( value, maxValue ) {\n\n\t\t\tmin = Math.min( min, value );\n\t\t\tmax = Math.max( max, value );\n\n\t\t\tcontext.fillStyle = bg;\n\t\t\tcontext.globalAlpha = 1;\n\t\t\tcontext.fillRect( 0, 0, WIDTH, GRAPH_Y );\n\t\t\tcontext.fillStyle = fg;\n\t\t\tcontext.fillText( round( value ) + ' ' + name + ' (' + round( min ) + '-' + round( max ) + ')', TEXT_X, TEXT_Y );\n\n\t\t\tcontext.drawImage( canvas, GRAPH_X + PR, GRAPH_Y, GRAPH_WIDTH - PR, GRAPH_HEIGHT, GRAPH_X, GRAPH_Y, GRAPH_WIDTH - PR, GRAPH_HEIGHT );\n\n\t\t\tcontext.fillRect( GRAPH_X + GRAPH_WIDTH - PR, GRAPH_Y, PR, GRAPH_HEIGHT );\n\n\t\t\tcontext.fillStyle = bg;\n\t\t\tcontext.globalAlpha = 0.9;\n\t\t\tcontext.fillRect( GRAPH_X + GRAPH_WIDTH - PR, GRAPH_Y, PR, round( ( 1 - ( value / maxValue ) ) * GRAPH_HEIGHT ) );\n\n\t\t}\n\n\t};\n\n};\n\nexport default Stats;\n"
  },
  {
    "path": "examples/libs/tween.module.js",
    "content": "/**\n * The Ease class provides a collection of easing functions for use with tween.js.\n */\nvar Easing = Object.freeze({\n    Linear: Object.freeze({\n        None: function (amount) {\n            return amount;\n        },\n        In: function (amount) {\n            return amount;\n        },\n        Out: function (amount) {\n            return amount;\n        },\n        InOut: function (amount) {\n            return amount;\n        },\n    }),\n    Quadratic: Object.freeze({\n        In: function (amount) {\n            return amount * amount;\n        },\n        Out: function (amount) {\n            return amount * (2 - amount);\n        },\n        InOut: function (amount) {\n            if ((amount *= 2) < 1) {\n                return 0.5 * amount * amount;\n            }\n            return -0.5 * (--amount * (amount - 2) - 1);\n        },\n    }),\n    Cubic: Object.freeze({\n        In: function (amount) {\n            return amount * amount * amount;\n        },\n        Out: function (amount) {\n            return --amount * amount * amount + 1;\n        },\n        InOut: function (amount) {\n            if ((amount *= 2) < 1) {\n                return 0.5 * amount * amount * amount;\n            }\n            return 0.5 * ((amount -= 2) * amount * amount + 2);\n        },\n    }),\n    Quartic: Object.freeze({\n        In: function (amount) {\n            return amount * amount * amount * amount;\n        },\n        Out: function (amount) {\n            return 1 - --amount * amount * amount * amount;\n        },\n        InOut: function (amount) {\n            if ((amount *= 2) < 1) {\n                return 0.5 * amount * amount * amount * amount;\n            }\n            return -0.5 * ((amount -= 2) * amount * amount * amount - 2);\n        },\n    }),\n    Quintic: Object.freeze({\n        In: function (amount) {\n            return amount * amount * amount * amount * amount;\n        },\n        Out: function (amount) {\n            return --amount * amount * amount * amount * amount + 1;\n        },\n        InOut: function (amount) {\n            if ((amount *= 2) < 1) {\n                return 0.5 * amount * amount * amount * amount * amount;\n            }\n            return 0.5 * ((amount -= 2) * amount * amount * amount * amount + 2);\n        },\n    }),\n    Sinusoidal: Object.freeze({\n        In: function (amount) {\n            return 1 - Math.sin(((1.0 - amount) * Math.PI) / 2);\n        },\n        Out: function (amount) {\n            return Math.sin((amount * Math.PI) / 2);\n        },\n        InOut: function (amount) {\n            return 0.5 * (1 - Math.sin(Math.PI * (0.5 - amount)));\n        },\n    }),\n    Exponential: Object.freeze({\n        In: function (amount) {\n            return amount === 0 ? 0 : Math.pow(1024, amount - 1);\n        },\n        Out: function (amount) {\n            return amount === 1 ? 1 : 1 - Math.pow(2, -10 * amount);\n        },\n        InOut: function (amount) {\n            if (amount === 0) {\n                return 0;\n            }\n            if (amount === 1) {\n                return 1;\n            }\n            if ((amount *= 2) < 1) {\n                return 0.5 * Math.pow(1024, amount - 1);\n            }\n            return 0.5 * (-Math.pow(2, -10 * (amount - 1)) + 2);\n        },\n    }),\n    Circular: Object.freeze({\n        In: function (amount) {\n            return 1 - Math.sqrt(1 - amount * amount);\n        },\n        Out: function (amount) {\n            return Math.sqrt(1 - --amount * amount);\n        },\n        InOut: function (amount) {\n            if ((amount *= 2) < 1) {\n                return -0.5 * (Math.sqrt(1 - amount * amount) - 1);\n            }\n            return 0.5 * (Math.sqrt(1 - (amount -= 2) * amount) + 1);\n        },\n    }),\n    Elastic: Object.freeze({\n        In: function (amount) {\n            if (amount === 0) {\n                return 0;\n            }\n            if (amount === 1) {\n                return 1;\n            }\n            return -Math.pow(2, 10 * (amount - 1)) * Math.sin((amount - 1.1) * 5 * Math.PI);\n        },\n        Out: function (amount) {\n            if (amount === 0) {\n                return 0;\n            }\n            if (amount === 1) {\n                return 1;\n            }\n            return Math.pow(2, -10 * amount) * Math.sin((amount - 0.1) * 5 * Math.PI) + 1;\n        },\n        InOut: function (amount) {\n            if (amount === 0) {\n                return 0;\n            }\n            if (amount === 1) {\n                return 1;\n            }\n            amount *= 2;\n            if (amount < 1) {\n                return -0.5 * Math.pow(2, 10 * (amount - 1)) * Math.sin((amount - 1.1) * 5 * Math.PI);\n            }\n            return 0.5 * Math.pow(2, -10 * (amount - 1)) * Math.sin((amount - 1.1) * 5 * Math.PI) + 1;\n        },\n    }),\n    Back: Object.freeze({\n        In: function (amount) {\n            var s = 1.70158;\n            return amount === 1 ? 1 : amount * amount * ((s + 1) * amount - s);\n        },\n        Out: function (amount) {\n            var s = 1.70158;\n            return amount === 0 ? 0 : --amount * amount * ((s + 1) * amount + s) + 1;\n        },\n        InOut: function (amount) {\n            var s = 1.70158 * 1.525;\n            if ((amount *= 2) < 1) {\n                return 0.5 * (amount * amount * ((s + 1) * amount - s));\n            }\n            return 0.5 * ((amount -= 2) * amount * ((s + 1) * amount + s) + 2);\n        },\n    }),\n    Bounce: Object.freeze({\n        In: function (amount) {\n            return 1 - Easing.Bounce.Out(1 - amount);\n        },\n        Out: function (amount) {\n            if (amount < 1 / 2.75) {\n                return 7.5625 * amount * amount;\n            }\n            else if (amount < 2 / 2.75) {\n                return 7.5625 * (amount -= 1.5 / 2.75) * amount + 0.75;\n            }\n            else if (amount < 2.5 / 2.75) {\n                return 7.5625 * (amount -= 2.25 / 2.75) * amount + 0.9375;\n            }\n            else {\n                return 7.5625 * (amount -= 2.625 / 2.75) * amount + 0.984375;\n            }\n        },\n        InOut: function (amount) {\n            if (amount < 0.5) {\n                return Easing.Bounce.In(amount * 2) * 0.5;\n            }\n            return Easing.Bounce.Out(amount * 2 - 1) * 0.5 + 0.5;\n        },\n    }),\n    generatePow: function (power) {\n        if (power === void 0) { power = 4; }\n        power = power < Number.EPSILON ? Number.EPSILON : power;\n        power = power > 10000 ? 10000 : power;\n        return {\n            In: function (amount) {\n                return Math.pow(amount, power);\n            },\n            Out: function (amount) {\n                return 1 - Math.pow((1 - amount), power);\n            },\n            InOut: function (amount) {\n                if (amount < 0.5) {\n                    return Math.pow((amount * 2), power) / 2;\n                }\n                return (1 - Math.pow((2 - amount * 2), power)) / 2 + 0.5;\n            },\n        };\n    },\n});\n\nvar now = function () { return performance.now(); };\n\n/**\n * Controlling groups of tweens\n *\n * Using the TWEEN singleton to manage your tweens can cause issues in large apps with many components.\n * In these cases, you may want to create your own smaller groups of tween\n */\nvar Group = /** @class */ (function () {\n    function Group() {\n        var tweens = [];\n        for (var _i = 0; _i < arguments.length; _i++) {\n            tweens[_i] = arguments[_i];\n        }\n        this._tweens = {};\n        this._tweensAddedDuringUpdate = {};\n        this.add.apply(this, tweens);\n    }\n    Group.prototype.getAll = function () {\n        var _this = this;\n        return Object.keys(this._tweens).map(function (tweenId) { return _this._tweens[tweenId]; });\n    };\n    Group.prototype.removeAll = function () {\n        this._tweens = {};\n    };\n    Group.prototype.add = function () {\n        var _a;\n        var tweens = [];\n        for (var _i = 0; _i < arguments.length; _i++) {\n            tweens[_i] = arguments[_i];\n        }\n        for (var _b = 0, tweens_1 = tweens; _b < tweens_1.length; _b++) {\n            var tween = tweens_1[_b];\n            // Remove from any other group first, a tween can only be in one group at a time.\n            // @ts-expect-error library internal access\n            (_a = tween._group) === null || _a === void 0 ? void 0 : _a.remove(tween);\n            // @ts-expect-error library internal access\n            tween._group = this;\n            this._tweens[tween.getId()] = tween;\n            this._tweensAddedDuringUpdate[tween.getId()] = tween;\n        }\n    };\n    Group.prototype.remove = function () {\n        var tweens = [];\n        for (var _i = 0; _i < arguments.length; _i++) {\n            tweens[_i] = arguments[_i];\n        }\n        for (var _a = 0, tweens_2 = tweens; _a < tweens_2.length; _a++) {\n            var tween = tweens_2[_a];\n            // @ts-expect-error library internal access\n            tween._group = undefined;\n            delete this._tweens[tween.getId()];\n            delete this._tweensAddedDuringUpdate[tween.getId()];\n        }\n    };\n    /** Return true if all tweens in the group are not paused or playing. */\n    Group.prototype.allStopped = function () {\n        return this.getAll().every(function (tween) { return !tween.isPlaying(); });\n    };\n    Group.prototype.update = function (time, preserve) {\n        if (time === void 0) { time = now(); }\n        if (preserve === void 0) { preserve = true; }\n        var tweenIds = Object.keys(this._tweens);\n        if (tweenIds.length === 0)\n            return;\n        // Tweens are updated in \"batches\". If you add a new tween during an\n        // update, then the new tween will be updated in the next batch.\n        // If you remove a tween during an update, it may or may not be updated.\n        // However, if the removed tween was added during the current batch,\n        // then it will not be updated.\n        while (tweenIds.length > 0) {\n            this._tweensAddedDuringUpdate = {};\n            for (var i = 0; i < tweenIds.length; i++) {\n                var tween = this._tweens[tweenIds[i]];\n                var autoStart = !preserve;\n                if (tween && tween.update(time, autoStart) === false && !preserve)\n                    this.remove(tween);\n            }\n            tweenIds = Object.keys(this._tweensAddedDuringUpdate);\n        }\n    };\n    return Group;\n}());\n\n/**\n *\n */\nvar Interpolation = {\n    Linear: function (v, k) {\n        var m = v.length - 1;\n        var f = m * k;\n        var i = Math.floor(f);\n        var fn = Interpolation.Utils.Linear;\n        if (k < 0) {\n            return fn(v[0], v[1], f);\n        }\n        if (k > 1) {\n            return fn(v[m], v[m - 1], m - f);\n        }\n        return fn(v[i], v[i + 1 > m ? m : i + 1], f - i);\n    },\n    Bezier: function (v, k) {\n        var b = 0;\n        var n = v.length - 1;\n        var pw = Math.pow;\n        var bn = Interpolation.Utils.Bernstein;\n        for (var i = 0; i <= n; i++) {\n            b += pw(1 - k, n - i) * pw(k, i) * v[i] * bn(n, i);\n        }\n        return b;\n    },\n    CatmullRom: function (v, k) {\n        var m = v.length - 1;\n        var f = m * k;\n        var i = Math.floor(f);\n        var fn = Interpolation.Utils.CatmullRom;\n        if (v[0] === v[m]) {\n            if (k < 0) {\n                i = Math.floor((f = m * (1 + k)));\n            }\n            return fn(v[(i - 1 + m) % m], v[i], v[(i + 1) % m], v[(i + 2) % m], f - i);\n        }\n        else {\n            if (k < 0) {\n                return v[0] - (fn(v[0], v[0], v[1], v[1], -f) - v[0]);\n            }\n            if (k > 1) {\n                return v[m] - (fn(v[m], v[m], v[m - 1], v[m - 1], f - m) - v[m]);\n            }\n            return fn(v[i ? i - 1 : 0], v[i], v[m < i + 1 ? m : i + 1], v[m < i + 2 ? m : i + 2], f - i);\n        }\n    },\n    Utils: {\n        Linear: function (p0, p1, t) {\n            return (p1 - p0) * t + p0;\n        },\n        Bernstein: function (n, i) {\n            var fc = Interpolation.Utils.Factorial;\n            return fc(n) / fc(i) / fc(n - i);\n        },\n        Factorial: (function () {\n            var a = [1];\n            return function (n) {\n                var s = 1;\n                if (a[n]) {\n                    return a[n];\n                }\n                for (var i = n; i > 1; i--) {\n                    s *= i;\n                }\n                a[n] = s;\n                return s;\n            };\n        })(),\n        CatmullRom: function (p0, p1, p2, p3, t) {\n            var v0 = (p2 - p0) * 0.5;\n            var v1 = (p3 - p1) * 0.5;\n            var t2 = t * t;\n            var t3 = t * t2;\n            return (2 * p1 - 2 * p2 + v0 + v1) * t3 + (-3 * p1 + 3 * p2 - 2 * v0 - v1) * t2 + v0 * t + p1;\n        },\n    },\n};\n\n/**\n * Utils\n */\nvar Sequence = /** @class */ (function () {\n    function Sequence() {\n    }\n    Sequence.nextId = function () {\n        return Sequence._nextId++;\n    };\n    Sequence._nextId = 0;\n    return Sequence;\n}());\n\nvar mainGroup = new Group();\n\n/**\n * Tween.js - Licensed under the MIT license\n * https://github.com/tweenjs/tween.js\n * ----------------------------------------------\n *\n * See https://github.com/tweenjs/tween.js/graphs/contributors for the full list of contributors.\n * Thank you all, you're awesome!\n */\nvar Tween = /** @class */ (function () {\n    function Tween(object, group) {\n        this._isPaused = false;\n        this._pauseStart = 0;\n        this._valuesStart = {};\n        this._valuesEnd = {};\n        this._valuesStartRepeat = {};\n        this._duration = 1000;\n        this._isDynamic = false;\n        this._initialRepeat = 0;\n        this._repeat = 0;\n        this._yoyo = false;\n        this._isPlaying = false;\n        this._reversed = false;\n        this._delayTime = 0;\n        this._startTime = 0;\n        this._easingFunction = Easing.Linear.None;\n        this._interpolationFunction = Interpolation.Linear;\n        // eslint-disable-next-line\n        this._chainedTweens = [];\n        this._onStartCallbackFired = false;\n        this._onEveryStartCallbackFired = false;\n        this._id = Sequence.nextId();\n        this._isChainStopped = false;\n        this._propertiesAreSetUp = false;\n        this._goToEnd = false;\n        this._object = object;\n        if (typeof group === 'object') {\n            this._group = group;\n            group.add(this);\n        }\n        // Use \"true\" to restore old behavior (will be removed in future release).\n        else if (group === true) {\n            this._group = mainGroup;\n            mainGroup.add(this);\n        }\n    }\n    Tween.prototype.getId = function () {\n        return this._id;\n    };\n    Tween.prototype.isPlaying = function () {\n        return this._isPlaying;\n    };\n    Tween.prototype.isPaused = function () {\n        return this._isPaused;\n    };\n    Tween.prototype.getDuration = function () {\n        return this._duration;\n    };\n    Tween.prototype.to = function (target, duration) {\n        if (duration === void 0) { duration = 1000; }\n        if (this._isPlaying)\n            throw new Error('Can not call Tween.to() while Tween is already started or paused. Stop the Tween first.');\n        this._valuesEnd = target;\n        this._propertiesAreSetUp = false;\n        this._duration = duration < 0 ? 0 : duration;\n        return this;\n    };\n    Tween.prototype.duration = function (duration) {\n        if (duration === void 0) { duration = 1000; }\n        this._duration = duration < 0 ? 0 : duration;\n        return this;\n    };\n    Tween.prototype.dynamic = function (dynamic) {\n        if (dynamic === void 0) { dynamic = false; }\n        this._isDynamic = dynamic;\n        return this;\n    };\n    Tween.prototype.start = function (time, overrideStartingValues) {\n        if (time === void 0) { time = now(); }\n        if (overrideStartingValues === void 0) { overrideStartingValues = false; }\n        if (this._isPlaying) {\n            return this;\n        }\n        this._repeat = this._initialRepeat;\n        if (this._reversed) {\n            // If we were reversed (f.e. using the yoyo feature) then we need to\n            // flip the tween direction back to forward.\n            this._reversed = false;\n            for (var property in this._valuesStartRepeat) {\n                this._swapEndStartRepeatValues(property);\n                this._valuesStart[property] = this._valuesStartRepeat[property];\n            }\n        }\n        this._isPlaying = true;\n        this._isPaused = false;\n        this._onStartCallbackFired = false;\n        this._onEveryStartCallbackFired = false;\n        this._isChainStopped = false;\n        this._startTime = time;\n        this._startTime += this._delayTime;\n        if (!this._propertiesAreSetUp || overrideStartingValues) {\n            this._propertiesAreSetUp = true;\n            // If dynamic is not enabled, clone the end values instead of using the passed-in end values.\n            if (!this._isDynamic) {\n                var tmp = {};\n                for (var prop in this._valuesEnd)\n                    tmp[prop] = this._valuesEnd[prop];\n                this._valuesEnd = tmp;\n            }\n            this._setupProperties(this._object, this._valuesStart, this._valuesEnd, this._valuesStartRepeat, overrideStartingValues);\n        }\n        return this;\n    };\n    Tween.prototype.startFromCurrentValues = function (time) {\n        return this.start(time, true);\n    };\n    Tween.prototype._setupProperties = function (_object, _valuesStart, _valuesEnd, _valuesStartRepeat, overrideStartingValues) {\n        for (var property in _valuesEnd) {\n            var startValue = _object[property];\n            var startValueIsArray = Array.isArray(startValue);\n            var propType = startValueIsArray ? 'array' : typeof startValue;\n            var isInterpolationList = !startValueIsArray && Array.isArray(_valuesEnd[property]);\n            // If `to()` specifies a property that doesn't exist in the source object,\n            // we should not set that property in the object\n            if (propType === 'undefined' || propType === 'function') {\n                continue;\n            }\n            // Check if an Array was provided as property value\n            if (isInterpolationList) {\n                var endValues = _valuesEnd[property];\n                if (endValues.length === 0) {\n                    continue;\n                }\n                // Handle an array of relative values.\n                // Creates a local copy of the Array with the start value at the front\n                var temp = [startValue];\n                for (var i = 0, l = endValues.length; i < l; i += 1) {\n                    var value = this._handleRelativeValue(startValue, endValues[i]);\n                    if (isNaN(value)) {\n                        isInterpolationList = false;\n                        console.warn('Found invalid interpolation list. Skipping.');\n                        break;\n                    }\n                    temp.push(value);\n                }\n                if (isInterpolationList) {\n                    // if (_valuesStart[property] === undefined) { // handle end values only the first time. NOT NEEDED? setupProperties is now guarded by _propertiesAreSetUp.\n                    _valuesEnd[property] = temp;\n                    // }\n                }\n            }\n            // handle the deepness of the values\n            if ((propType === 'object' || startValueIsArray) && startValue && !isInterpolationList) {\n                _valuesStart[property] = startValueIsArray ? [] : {};\n                var nestedObject = startValue;\n                for (var prop in nestedObject) {\n                    _valuesStart[property][prop] = nestedObject[prop];\n                }\n                // TODO? repeat nested values? And yoyo? And array values?\n                _valuesStartRepeat[property] = startValueIsArray ? [] : {};\n                var endValues = _valuesEnd[property];\n                // If dynamic is not enabled, clone the end values instead of using the passed-in end values.\n                if (!this._isDynamic) {\n                    var tmp = {};\n                    for (var prop in endValues)\n                        tmp[prop] = endValues[prop];\n                    _valuesEnd[property] = endValues = tmp;\n                }\n                this._setupProperties(nestedObject, _valuesStart[property], endValues, _valuesStartRepeat[property], overrideStartingValues);\n            }\n            else {\n                // Save the starting value, but only once unless override is requested.\n                if (typeof _valuesStart[property] === 'undefined' || overrideStartingValues) {\n                    _valuesStart[property] = startValue;\n                }\n                if (!startValueIsArray) {\n                    // eslint-disable-next-line\n                    // @ts-ignore FIXME?\n                    _valuesStart[property] *= 1.0; // Ensures we're using numbers, not strings\n                }\n                if (isInterpolationList) {\n                    // eslint-disable-next-line\n                    // @ts-ignore FIXME?\n                    _valuesStartRepeat[property] = _valuesEnd[property].slice().reverse();\n                }\n                else {\n                    _valuesStartRepeat[property] = _valuesStart[property] || 0;\n                }\n            }\n        }\n    };\n    Tween.prototype.stop = function () {\n        if (!this._isChainStopped) {\n            this._isChainStopped = true;\n            this.stopChainedTweens();\n        }\n        if (!this._isPlaying) {\n            return this;\n        }\n        this._isPlaying = false;\n        this._isPaused = false;\n        if (this._onStopCallback) {\n            this._onStopCallback(this._object);\n        }\n        return this;\n    };\n    Tween.prototype.end = function () {\n        this._goToEnd = true;\n        this.update(this._startTime + this._duration);\n        return this;\n    };\n    Tween.prototype.pause = function (time) {\n        if (time === void 0) { time = now(); }\n        if (this._isPaused || !this._isPlaying) {\n            return this;\n        }\n        this._isPaused = true;\n        this._pauseStart = time;\n        return this;\n    };\n    Tween.prototype.resume = function (time) {\n        if (time === void 0) { time = now(); }\n        if (!this._isPaused || !this._isPlaying) {\n            return this;\n        }\n        this._isPaused = false;\n        this._startTime += time - this._pauseStart;\n        this._pauseStart = 0;\n        return this;\n    };\n    Tween.prototype.stopChainedTweens = function () {\n        for (var i = 0, numChainedTweens = this._chainedTweens.length; i < numChainedTweens; i++) {\n            this._chainedTweens[i].stop();\n        }\n        return this;\n    };\n    Tween.prototype.group = function (group) {\n        if (!group) {\n            console.warn('tween.group() without args has been removed, use group.add(tween) instead.');\n            return this;\n        }\n        group.add(this);\n        return this;\n    };\n    /**\n     * Removes the tween from whichever group it is in.\n     */\n    Tween.prototype.remove = function () {\n        var _a;\n        (_a = this._group) === null || _a === void 0 ? void 0 : _a.remove(this);\n        return this;\n    };\n    Tween.prototype.delay = function (amount) {\n        if (amount === void 0) { amount = 0; }\n        this._delayTime = amount;\n        return this;\n    };\n    Tween.prototype.repeat = function (times) {\n        if (times === void 0) { times = 0; }\n        this._initialRepeat = times;\n        this._repeat = times;\n        return this;\n    };\n    Tween.prototype.repeatDelay = function (amount) {\n        this._repeatDelayTime = amount;\n        return this;\n    };\n    Tween.prototype.yoyo = function (yoyo) {\n        if (yoyo === void 0) { yoyo = false; }\n        this._yoyo = yoyo;\n        return this;\n    };\n    Tween.prototype.easing = function (easingFunction) {\n        if (easingFunction === void 0) { easingFunction = Easing.Linear.None; }\n        this._easingFunction = easingFunction;\n        return this;\n    };\n    Tween.prototype.interpolation = function (interpolationFunction) {\n        if (interpolationFunction === void 0) { interpolationFunction = Interpolation.Linear; }\n        this._interpolationFunction = interpolationFunction;\n        return this;\n    };\n    // eslint-disable-next-line\n    Tween.prototype.chain = function () {\n        var tweens = [];\n        for (var _i = 0; _i < arguments.length; _i++) {\n            tweens[_i] = arguments[_i];\n        }\n        this._chainedTweens = tweens;\n        return this;\n    };\n    Tween.prototype.onStart = function (callback) {\n        this._onStartCallback = callback;\n        return this;\n    };\n    Tween.prototype.onEveryStart = function (callback) {\n        this._onEveryStartCallback = callback;\n        return this;\n    };\n    Tween.prototype.onUpdate = function (callback) {\n        this._onUpdateCallback = callback;\n        return this;\n    };\n    Tween.prototype.onRepeat = function (callback) {\n        this._onRepeatCallback = callback;\n        return this;\n    };\n    Tween.prototype.onComplete = function (callback) {\n        this._onCompleteCallback = callback;\n        return this;\n    };\n    Tween.prototype.onStop = function (callback) {\n        this._onStopCallback = callback;\n        return this;\n    };\n    /**\n     * @returns true if the tween is still playing after the update, false\n     * otherwise (calling update on a paused tween still returns true because\n     * it is still playing, just paused).\n     *\n     * @param autoStart - When true, calling update will implicitly call start()\n     * as well. Note, if you stop() or end() the tween, but are still calling\n     * update(), it will start again!\n     */\n    Tween.prototype.update = function (time, autoStart) {\n        var _this = this;\n        var _a;\n        if (time === void 0) { time = now(); }\n        if (autoStart === void 0) { autoStart = Tween.autoStartOnUpdate; }\n        if (this._isPaused)\n            return true;\n        var property;\n        if (!this._goToEnd && !this._isPlaying) {\n            if (autoStart)\n                this.start(time, true);\n            else\n                return false;\n        }\n        this._goToEnd = false;\n        if (time < this._startTime) {\n            return true;\n        }\n        if (this._onStartCallbackFired === false) {\n            if (this._onStartCallback) {\n                this._onStartCallback(this._object);\n            }\n            this._onStartCallbackFired = true;\n        }\n        if (this._onEveryStartCallbackFired === false) {\n            if (this._onEveryStartCallback) {\n                this._onEveryStartCallback(this._object);\n            }\n            this._onEveryStartCallbackFired = true;\n        }\n        var elapsedTime = time - this._startTime;\n        var durationAndDelay = this._duration + ((_a = this._repeatDelayTime) !== null && _a !== void 0 ? _a : this._delayTime);\n        var totalTime = this._duration + this._repeat * durationAndDelay;\n        var calculateElapsedPortion = function () {\n            if (_this._duration === 0)\n                return 1;\n            if (elapsedTime > totalTime) {\n                return 1;\n            }\n            var timesRepeated = Math.trunc(elapsedTime / durationAndDelay);\n            var timeIntoCurrentRepeat = elapsedTime - timesRepeated * durationAndDelay;\n            // TODO use %?\n            // const timeIntoCurrentRepeat = elapsedTime % durationAndDelay\n            var portion = Math.min(timeIntoCurrentRepeat / _this._duration, 1);\n            if (portion === 0 && elapsedTime === _this._duration) {\n                return 1;\n            }\n            return portion;\n        };\n        var elapsed = calculateElapsedPortion();\n        var value = this._easingFunction(elapsed);\n        // properties transformations\n        this._updateProperties(this._object, this._valuesStart, this._valuesEnd, value);\n        if (this._onUpdateCallback) {\n            this._onUpdateCallback(this._object, elapsed);\n        }\n        if (this._duration === 0 || elapsedTime >= this._duration) {\n            if (this._repeat > 0) {\n                var completeCount = Math.min(Math.trunc((elapsedTime - this._duration) / durationAndDelay) + 1, this._repeat);\n                if (isFinite(this._repeat)) {\n                    this._repeat -= completeCount;\n                }\n                // Reassign starting values, restart by making startTime = now\n                for (property in this._valuesStartRepeat) {\n                    if (!this._yoyo && typeof this._valuesEnd[property] === 'string') {\n                        this._valuesStartRepeat[property] =\n                            // eslint-disable-next-line\n                            // @ts-ignore FIXME?\n                            this._valuesStartRepeat[property] + parseFloat(this._valuesEnd[property]);\n                    }\n                    if (this._yoyo) {\n                        this._swapEndStartRepeatValues(property);\n                    }\n                    this._valuesStart[property] = this._valuesStartRepeat[property];\n                }\n                if (this._yoyo) {\n                    this._reversed = !this._reversed;\n                }\n                this._startTime += durationAndDelay * completeCount;\n                if (this._onRepeatCallback) {\n                    this._onRepeatCallback(this._object);\n                }\n                this._onEveryStartCallbackFired = false;\n                return true;\n            }\n            else {\n                if (this._onCompleteCallback) {\n                    this._onCompleteCallback(this._object);\n                }\n                for (var i = 0, numChainedTweens = this._chainedTweens.length; i < numChainedTweens; i++) {\n                    // Make the chained tweens start exactly at the time they should,\n                    // even if the `update()` method was called way past the duration of the tween\n                    this._chainedTweens[i].start(this._startTime + this._duration, false);\n                }\n                this._isPlaying = false;\n                return false;\n            }\n        }\n        return true;\n    };\n    Tween.prototype._updateProperties = function (_object, _valuesStart, _valuesEnd, value) {\n        for (var property in _valuesEnd) {\n            // Don't update properties that do not exist in the source object\n            if (_valuesStart[property] === undefined) {\n                continue;\n            }\n            var start = _valuesStart[property] || 0;\n            var end = _valuesEnd[property];\n            var startIsArray = Array.isArray(_object[property]);\n            var endIsArray = Array.isArray(end);\n            var isInterpolationList = !startIsArray && endIsArray;\n            if (isInterpolationList) {\n                _object[property] = this._interpolationFunction(end, value);\n            }\n            else if (typeof end === 'object' && end) {\n                // eslint-disable-next-line\n                // @ts-ignore FIXME?\n                this._updateProperties(_object[property], start, end, value);\n            }\n            else {\n                // Parses relative end values with start as base (e.g.: +10, -3)\n                end = this._handleRelativeValue(start, end);\n                // Protect against non numeric properties.\n                if (typeof end === 'number') {\n                    // eslint-disable-next-line\n                    // @ts-ignore FIXME?\n                    _object[property] = start + (end - start) * value;\n                }\n            }\n        }\n    };\n    Tween.prototype._handleRelativeValue = function (start, end) {\n        if (typeof end !== 'string') {\n            return end;\n        }\n        if (end.charAt(0) === '+' || end.charAt(0) === '-') {\n            return start + parseFloat(end);\n        }\n        return parseFloat(end);\n    };\n    Tween.prototype._swapEndStartRepeatValues = function (property) {\n        var tmp = this._valuesStartRepeat[property];\n        var endValue = this._valuesEnd[property];\n        if (typeof endValue === 'string') {\n            this._valuesStartRepeat[property] = this._valuesStartRepeat[property] + parseFloat(endValue);\n        }\n        else {\n            this._valuesStartRepeat[property] = this._valuesEnd[property];\n        }\n        this._valuesEnd[property] = tmp;\n    };\n    Tween.autoStartOnUpdate = false;\n    return Tween;\n}());\n\nvar VERSION = '25.0.0';\n\n/**\n * Tween.js - Licensed under the MIT license\n * https://github.com/tweenjs/tween.js\n * ----------------------------------------------\n *\n * See https://github.com/tweenjs/tween.js/graphs/contributors for the full list of contributors.\n * Thank you all, you're awesome!\n */\nvar nextId = Sequence.nextId;\n/**\n * Controlling groups of tweens\n *\n * Using the TWEEN singleton to manage your tweens can cause issues in large apps with many components.\n * In these cases, you may want to create your own smaller groups of tweens.\n */\nvar TWEEN = mainGroup;\n// This is the best way to export things in a way that's compatible with both ES\n// Modules and CommonJS, without build hacks, and so as not to break the\n// existing API.\n// https://github.com/rollup/rollup/issues/1961#issuecomment-423037881\n/**\n * @deprecated The global TWEEN Group will be removed in a following major\n * release. To migrate, create a `new Group()` instead of using `TWEEN` as a\n * group.\n *\n * Old code:\n *\n * ```js\n * import * as TWEEN from '@tweenjs/tween.js'\n *\n * //...\n *\n * const tween = new TWEEN.Tween(obj)\n * const tween2 = new TWEEN.Tween(obj2)\n *\n * //...\n *\n * requestAnimationFrame(function loop(time) {\n *   TWEEN.update(time)\n *   requestAnimationFrame(loop)\n * })\n * ```\n *\n * New code:\n *\n * ```js\n * import {Tween, Group} from '@tweenjs/tween.js'\n *\n * //...\n *\n * const tween = new Tween(obj)\n * const tween2 = new TWEEN.Tween(obj2)\n *\n * //...\n *\n * const group = new Group()\n * group.add(tween)\n * group.add(tween2)\n *\n * //...\n *\n * requestAnimationFrame(function loop(time) {\n *   group.update(time)\n *   requestAnimationFrame(loop)\n * })\n * ```\n */\nvar getAll = TWEEN.getAll.bind(TWEEN);\n/**\n * @deprecated The global TWEEN Group will be removed in a following major\n * release. To migrate, create a `new Group()` instead of using `TWEEN` as a\n * group.\n *\n * Old code:\n *\n * ```js\n * import * as TWEEN from '@tweenjs/tween.js'\n *\n * //...\n *\n * const tween = new TWEEN.Tween(obj)\n * const tween2 = new TWEEN.Tween(obj2)\n *\n * //...\n *\n * requestAnimationFrame(function loop(time) {\n *   TWEEN.update(time)\n *   requestAnimationFrame(loop)\n * })\n * ```\n *\n * New code:\n *\n * ```js\n * import {Tween, Group} from '@tweenjs/tween.js'\n *\n * //...\n *\n * const tween = new Tween(obj)\n * const tween2 = new TWEEN.Tween(obj2)\n *\n * //...\n *\n * const group = new Group()\n * group.add(tween)\n * group.add(tween2)\n *\n * //...\n *\n * requestAnimationFrame(function loop(time) {\n *   group.update(time)\n *   requestAnimationFrame(loop)\n * })\n * ```\n */\nvar removeAll = TWEEN.removeAll.bind(TWEEN);\n/**\n * @deprecated The global TWEEN Group will be removed in a following major\n * release. To migrate, create a `new Group()` instead of using `TWEEN` as a\n * group.\n *\n * Old code:\n *\n * ```js\n * import * as TWEEN from '@tweenjs/tween.js'\n *\n * //...\n *\n * const tween = new TWEEN.Tween(obj)\n * const tween2 = new TWEEN.Tween(obj2)\n *\n * //...\n *\n * requestAnimationFrame(function loop(time) {\n *   TWEEN.update(time)\n *   requestAnimationFrame(loop)\n * })\n * ```\n *\n * New code:\n *\n * ```js\n * import {Tween, Group} from '@tweenjs/tween.js'\n *\n * //...\n *\n * const tween = new Tween(obj)\n * const tween2 = new TWEEN.Tween(obj2)\n *\n * //...\n *\n * const group = new Group()\n * group.add(tween)\n * group.add(tween2)\n *\n * //...\n *\n * requestAnimationFrame(function loop(time) {\n *   group.update(time)\n *   requestAnimationFrame(loop)\n * })\n * ```\n */\nvar add = TWEEN.add.bind(TWEEN);\n/**\n * @deprecated The global TWEEN Group will be removed in a following major\n * release. To migrate, create a `new Group()` instead of using `TWEEN` as a\n * group.\n *\n * Old code:\n *\n * ```js\n * import * as TWEEN from '@tweenjs/tween.js'\n *\n * //...\n *\n * const tween = new TWEEN.Tween(obj)\n * const tween2 = new TWEEN.Tween(obj2)\n *\n * //...\n *\n * requestAnimationFrame(function loop(time) {\n *   TWEEN.update(time)\n *   requestAnimationFrame(loop)\n * })\n * ```\n *\n * New code:\n *\n * ```js\n * import {Tween, Group} from '@tweenjs/tween.js'\n *\n * //...\n *\n * const tween = new Tween(obj)\n * const tween2 = new TWEEN.Tween(obj2)\n *\n * //...\n *\n * const group = new Group()\n * group.add(tween)\n * group.add(tween2)\n *\n * //...\n *\n * requestAnimationFrame(function loop(time) {\n *   group.update(time)\n *   requestAnimationFrame(loop)\n * })\n * ```\n */\nvar remove = TWEEN.remove.bind(TWEEN);\n/**\n * @deprecated The global TWEEN Group will be removed in a following major\n * release. To migrate, create a `new Group()` instead of using `TWEEN` as a\n * group.\n *\n * Old code:\n *\n * ```js\n * import * as TWEEN from '@tweenjs/tween.js'\n *\n * //...\n *\n * const tween = new TWEEN.Tween(obj)\n * const tween2 = new TWEEN.Tween(obj2)\n *\n * //...\n *\n * requestAnimationFrame(function loop(time) {\n *   TWEEN.update(time)\n *   requestAnimationFrame(loop)\n * })\n * ```\n *\n * New code:\n *\n * ```js\n * import {Tween, Group} from '@tweenjs/tween.js'\n *\n * //...\n *\n * const tween = new Tween(obj)\n * const tween2 = new TWEEN.Tween(obj2)\n *\n * //...\n *\n * const group = new Group()\n * group.add(tween)\n * group.add(tween2)\n *\n * //...\n *\n * requestAnimationFrame(function loop(time) {\n *   group.update(time)\n *   requestAnimationFrame(loop)\n * })\n * ```\n */\nvar update = TWEEN.update.bind(TWEEN);\nvar exports = {\n    Easing: Easing,\n    Group: Group,\n    Interpolation: Interpolation,\n    now: now,\n    Sequence: Sequence,\n    nextId: nextId,\n    Tween: Tween,\n    VERSION: VERSION,\n    /**\n     * @deprecated The global TWEEN Group will be removed in a following major\n     * release. To migrate, create a `new Group()` instead of using `TWEEN` as a\n     * group.\n     *\n     * Old code:\n     *\n     * ```js\n     * import * as TWEEN from '@tweenjs/tween.js'\n     *\n     * //...\n     *\n     * const tween = new TWEEN.Tween(obj)\n     * const tween2 = new TWEEN.Tween(obj2)\n     *\n     * //...\n     *\n     * requestAnimationFrame(function loop(time) {\n     *   TWEEN.update(time)\n     *   requestAnimationFrame(loop)\n     * })\n     * ```\n     *\n     * New code:\n     *\n     * ```js\n     * import {Tween, Group} from '@tweenjs/tween.js'\n     *\n     * //...\n     *\n     * const tween = new Tween(obj)\n     * const tween2 = new TWEEN.Tween(obj2)\n     *\n     * //...\n     *\n     * const group = new Group()\n     * group.add(tween)\n     * group.add(tween2)\n     *\n     * //...\n     *\n     * requestAnimationFrame(function loop(time) {\n     *   group.update(time)\n     *   requestAnimationFrame(loop)\n     * })\n     * ```\n     */\n    getAll: getAll,\n    /**\n     * @deprecated The global TWEEN Group will be removed in a following major\n     * release. To migrate, create a `new Group()` instead of using `TWEEN` as a\n     * group.\n     *\n     * Old code:\n     *\n     * ```js\n     * import * as TWEEN from '@tweenjs/tween.js'\n     *\n     * //...\n     *\n     * const tween = new TWEEN.Tween(obj)\n     * const tween2 = new TWEEN.Tween(obj2)\n     *\n     * //...\n     *\n     * requestAnimationFrame(function loop(time) {\n     *   TWEEN.update(time)\n     *   requestAnimationFrame(loop)\n     * })\n     * ```\n     *\n     * New code:\n     *\n     * ```js\n     * import {Tween, Group} from '@tweenjs/tween.js'\n     *\n     * //...\n     *\n     * const tween = new Tween(obj)\n     * const tween2 = new TWEEN.Tween(obj2)\n     *\n     * //...\n     *\n     * const group = new Group()\n     * group.add(tween)\n     * group.add(tween2)\n     *\n     * //...\n     *\n     * requestAnimationFrame(function loop(time) {\n     *   group.update(time)\n     *   requestAnimationFrame(loop)\n     * })\n     * ```\n     */\n    removeAll: removeAll,\n    /**\n     * @deprecated The global TWEEN Group will be removed in a following major\n     * release. To migrate, create a `new Group()` instead of using `TWEEN` as a\n     * group.\n     *\n     * Old code:\n     *\n     * ```js\n     * import * as TWEEN from '@tweenjs/tween.js'\n     *\n     * //...\n     *\n     * const tween = new TWEEN.Tween(obj)\n     * const tween2 = new TWEEN.Tween(obj2)\n     *\n     * //...\n     *\n     * requestAnimationFrame(function loop(time) {\n     *   TWEEN.update(time)\n     *   requestAnimationFrame(loop)\n     * })\n     * ```\n     *\n     * New code:\n     *\n     * ```js\n     * import {Tween, Group} from '@tweenjs/tween.js'\n     *\n     * //...\n     *\n     * const tween = new Tween(obj)\n     * const tween2 = new TWEEN.Tween(obj2)\n     *\n     * //...\n     *\n     * const group = new Group()\n     * group.add(tween)\n     * group.add(tween2)\n     *\n     * //...\n     *\n     * requestAnimationFrame(function loop(time) {\n     *   group.update(time)\n     *   requestAnimationFrame(loop)\n     * })\n     * ```\n     */\n    add: add,\n    /**\n     * @deprecated The global TWEEN Group will be removed in a following major\n     * release. To migrate, create a `new Group()` instead of using `TWEEN` as a\n     * group.\n     *\n     * Old code:\n     *\n     * ```js\n     * import * as TWEEN from '@tweenjs/tween.js'\n     *\n     * //...\n     *\n     * const tween = new TWEEN.Tween(obj)\n     * const tween2 = new TWEEN.Tween(obj2)\n     *\n     * //...\n     *\n     * requestAnimationFrame(function loop(time) {\n     *   TWEEN.update(time)\n     *   requestAnimationFrame(loop)\n     * })\n     * ```\n     *\n     * New code:\n     *\n     * ```js\n     * import {Tween, Group} from '@tweenjs/tween.js'\n     *\n     * //...\n     *\n     * const tween = new Tween(obj)\n     * const tween2 = new TWEEN.Tween(obj2)\n     *\n     * //...\n     *\n     * const group = new Group()\n     * group.add(tween)\n     * group.add(tween2)\n     *\n     * //...\n     *\n     * requestAnimationFrame(function loop(time) {\n     *   group.update(time)\n     *   requestAnimationFrame(loop)\n     * })\n     * ```\n     */\n    remove: remove,\n    /**\n     * @deprecated The global TWEEN Group will be removed in a following major\n     * release. To migrate, create a `new Group()` instead of using `TWEEN` as a\n     * group.\n     *\n     * Old code:\n     *\n     * ```js\n     * import * as TWEEN from '@tweenjs/tween.js'\n     *\n     * //...\n     *\n     * const tween = new TWEEN.Tween(obj)\n     * const tween2 = new TWEEN.Tween(obj2)\n     *\n     * //...\n     *\n     * requestAnimationFrame(function loop(time) {\n     *   TWEEN.update(time)\n     *   requestAnimationFrame(loop)\n     * })\n     * ```\n     *\n     * New code:\n     *\n     * ```js\n     * import {Tween, Group} from '@tweenjs/tween.js'\n     *\n     * //...\n     *\n     * const tween = new Tween(obj)\n     * const tween2 = new TWEEN.Tween(obj2)\n     *\n     * //...\n     *\n     * const group = new Group()\n     * group.add(tween)\n     * group.add(tween2)\n     *\n     * //...\n     *\n     * requestAnimationFrame(function loop(time) {\n     *   group.update(time)\n     *   requestAnimationFrame(loop)\n     * })\n     * ```\n     */\n    update: update,\n};\n\nexport { Easing, Group, Interpolation, Sequence, Tween, VERSION, add, exports as default, getAll, nextId, now, remove, removeAll, update };\n"
  },
  {
    "path": "examples/libs/webvr-polyfill.js",
    "content": "/**\n * @license\n * webvr-polyfill\n * Copyright (c) 2015-2017 Google\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 * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * @license\n * cardboard-vr-display\n * Copyright (c) 2015-2017 Google\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 * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * @license\n * webvr-polyfill-dpdb \n * Copyright (c) 2017 Google\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 * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * @license\n * wglu-preserve-state\n * Copyright (c) 2016, Brandon Jones.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\n\n/**\n * @license\n * nosleep.js\n * Copyright (c) 2017, Rich Tibbett\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\n\n(function (global, factory) {\n\ttypeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :\n\ttypeof define === 'function' && define.amd ? define(factory) :\n\t(global.WebVRPolyfill = factory());\n}(this, (function () { 'use strict';\n\nvar commonjsGlobal = typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};\n\n\n\nfunction unwrapExports (x) {\n\treturn x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x['default'] : x;\n}\n\nfunction createCommonjsModule(fn, module) {\n\treturn module = { exports: {} }, fn(module, module.exports), module.exports;\n}\n\nvar isMobile = function isMobile() {\n  return (/Android/i.test(navigator.userAgent) || /iPhone|iPad|iPod/i.test(navigator.userAgent)\n  );\n};\nvar copyArray = function copyArray(source, dest) {\n  for (var i = 0, n = source.length; i < n; i++) {\n    dest[i] = source[i];\n  }\n};\nvar extend = function extend(dest, src) {\n  for (var key in src) {\n    if (src.hasOwnProperty(key)) {\n      dest[key] = src[key];\n    }\n  }\n  return dest;\n};\n\nvar cardboardVrDisplay = createCommonjsModule(function (module, exports) {\n/**\n * @license\n * cardboard-vr-display\n * Copyright (c) 2015-2017 Google\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 * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * @license\n * gl-preserve-state\n * Copyright (c) 2016, Brandon Jones.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\n/**\n * @license\n * webvr-polyfill-dpdb\n * Copyright (c) 2015-2017 Google\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 * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * @license\n * nosleep.js\n * Copyright (c) 2017, Rich Tibbett\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\n(function (global, factory) {\n\tmodule.exports = factory();\n}(commonjsGlobal, (function () { var classCallCheck = function (instance, Constructor) {\n  if (!(instance instanceof Constructor)) {\n    throw new TypeError(\"Cannot call a class as a function\");\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  return function (Constructor, protoProps, staticProps) {\n    if (protoProps) defineProperties(Constructor.prototype, protoProps);\n    if (staticProps) defineProperties(Constructor, staticProps);\n    return Constructor;\n  };\n}();\nvar slicedToArray = function () {\n  function sliceIterator(arr, i) {\n    var _arr = [];\n    var _n = true;\n    var _d = false;\n    var _e = undefined;\n    try {\n      for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) {\n        _arr.push(_s.value);\n        if (i && _arr.length === i) break;\n      }\n    } catch (err) {\n      _d = true;\n      _e = err;\n    } finally {\n      try {\n        if (!_n && _i[\"return\"]) _i[\"return\"]();\n      } finally {\n        if (_d) throw _e;\n      }\n    }\n    return _arr;\n  }\n  return function (arr, i) {\n    if (Array.isArray(arr)) {\n      return arr;\n    } else if (Symbol.iterator in Object(arr)) {\n      return sliceIterator(arr, i);\n    } else {\n      throw new TypeError(\"Invalid attempt to destructure non-iterable instance\");\n    }\n  };\n}();\nvar MIN_TIMESTEP = 0.001;\nvar MAX_TIMESTEP = 1;\nvar dataUri = function dataUri(mimeType, svg) {\n  return 'data:' + mimeType + ',' + encodeURIComponent(svg);\n};\nvar lerp = function lerp(a, b, t) {\n  return a + (b - a) * t;\n};\nvar isIOS = function () {\n  var isIOS = /iPad|iPhone|iPod/.test(navigator.platform);\n  return function () {\n    return isIOS;\n  };\n}();\nvar isWebViewAndroid = function () {\n  var isWebViewAndroid = navigator.userAgent.indexOf('Version') !== -1 && navigator.userAgent.indexOf('Android') !== -1 && navigator.userAgent.indexOf('Chrome') !== -1;\n  return function () {\n    return isWebViewAndroid;\n  };\n}();\nvar isSafari = function () {\n  var isSafari = /^((?!chrome|android).)*safari/i.test(navigator.userAgent);\n  return function () {\n    return isSafari;\n  };\n}();\nvar isFirefoxAndroid = function () {\n  var isFirefoxAndroid = navigator.userAgent.indexOf('Firefox') !== -1 && navigator.userAgent.indexOf('Android') !== -1;\n  return function () {\n    return isFirefoxAndroid;\n  };\n}();\nvar getChromeVersion = function () {\n  var match = navigator.userAgent.match(/.*Chrome\\/([0-9]+)/);\n  var value = match ? parseInt(match[1], 10) : null;\n  return function () {\n    return value;\n  };\n}();\nvar isSafariWithoutDeviceMotion = function () {\n  var value = false;\n  value = isIOS() && isSafari() && navigator.userAgent.indexOf('13_4') !== -1;\n  return function () {\n    return value;\n  };\n}();\nvar isChromeWithoutDeviceMotion = function () {\n  var value = false;\n  if (getChromeVersion() === 65) {\n    var match = navigator.userAgent.match(/.*Chrome\\/([0-9\\.]*)/);\n    if (match) {\n      var _match$1$split = match[1].split('.'),\n          _match$1$split2 = slicedToArray(_match$1$split, 4),\n          major = _match$1$split2[0],\n          minor = _match$1$split2[1],\n          branch = _match$1$split2[2],\n          build = _match$1$split2[3];\n      value = parseInt(branch, 10) === 3325 && parseInt(build, 10) < 148;\n    }\n  }\n  return function () {\n    return value;\n  };\n}();\nvar isR7 = function () {\n  var isR7 = navigator.userAgent.indexOf('R7 Build') !== -1;\n  return function () {\n    return isR7;\n  };\n}();\nvar isLandscapeMode = function isLandscapeMode() {\n  var rtn = window.orientation == 90 || window.orientation == -90;\n  return isR7() ? !rtn : rtn;\n};\nvar isTimestampDeltaValid = function isTimestampDeltaValid(timestampDeltaS) {\n  if (isNaN(timestampDeltaS)) {\n    return false;\n  }\n  if (timestampDeltaS <= MIN_TIMESTEP) {\n    return false;\n  }\n  if (timestampDeltaS > MAX_TIMESTEP) {\n    return false;\n  }\n  return true;\n};\nvar getScreenWidth = function getScreenWidth() {\n  return Math.max(window.screen.width, window.screen.height) * window.devicePixelRatio;\n};\nvar getScreenHeight = function getScreenHeight() {\n  return Math.min(window.screen.width, window.screen.height) * window.devicePixelRatio;\n};\nvar requestFullscreen = function requestFullscreen(element) {\n  if (isWebViewAndroid()) {\n    return false;\n  }\n  if (element.requestFullscreen) {\n    element.requestFullscreen();\n  } else if (element.webkitRequestFullscreen) {\n    element.webkitRequestFullscreen();\n  } else if (element.mozRequestFullScreen) {\n    element.mozRequestFullScreen();\n  } else if (element.msRequestFullscreen) {\n    element.msRequestFullscreen();\n  } else {\n    return false;\n  }\n  return true;\n};\nvar exitFullscreen = function exitFullscreen() {\n  if (document.exitFullscreen) {\n    document.exitFullscreen();\n  } else if (document.webkitExitFullscreen) {\n    document.webkitExitFullscreen();\n  } else if (document.mozCancelFullScreen) {\n    document.mozCancelFullScreen();\n  } else if (document.msExitFullscreen) {\n    document.msExitFullscreen();\n  } else {\n    return false;\n  }\n  return true;\n};\nvar getFullscreenElement = function getFullscreenElement() {\n  return document.fullscreenElement || document.webkitFullscreenElement || document.mozFullScreenElement || document.msFullscreenElement;\n};\nvar linkProgram = function linkProgram(gl, vertexSource, fragmentSource, attribLocationMap) {\n  var vertexShader = gl.createShader(gl.VERTEX_SHADER);\n  gl.shaderSource(vertexShader, vertexSource);\n  gl.compileShader(vertexShader);\n  var fragmentShader = gl.createShader(gl.FRAGMENT_SHADER);\n  gl.shaderSource(fragmentShader, fragmentSource);\n  gl.compileShader(fragmentShader);\n  var program = gl.createProgram();\n  gl.attachShader(program, vertexShader);\n  gl.attachShader(program, fragmentShader);\n  for (var attribName in attribLocationMap) {\n    gl.bindAttribLocation(program, attribLocationMap[attribName], attribName);\n  }gl.linkProgram(program);\n  gl.deleteShader(vertexShader);\n  gl.deleteShader(fragmentShader);\n  return program;\n};\nvar getProgramUniforms = function getProgramUniforms(gl, program) {\n  var uniforms = {};\n  var uniformCount = gl.getProgramParameter(program, gl.ACTIVE_UNIFORMS);\n  var uniformName = '';\n  for (var i = 0; i < uniformCount; i++) {\n    var uniformInfo = gl.getActiveUniform(program, i);\n    uniformName = uniformInfo.name.replace('[0]', '');\n    uniforms[uniformName] = gl.getUniformLocation(program, uniformName);\n  }\n  return uniforms;\n};\nvar orthoMatrix = function orthoMatrix(out, left, right, bottom, top, near, far) {\n  var lr = 1 / (left - right),\n      bt = 1 / (bottom - top),\n      nf = 1 / (near - far);\n  out[0] = -2 * lr;\n  out[1] = 0;\n  out[2] = 0;\n  out[3] = 0;\n  out[4] = 0;\n  out[5] = -2 * bt;\n  out[6] = 0;\n  out[7] = 0;\n  out[8] = 0;\n  out[9] = 0;\n  out[10] = 2 * nf;\n  out[11] = 0;\n  out[12] = (left + right) * lr;\n  out[13] = (top + bottom) * bt;\n  out[14] = (far + near) * nf;\n  out[15] = 1;\n  return out;\n};\nvar isMobile = function isMobile() {\n  var check = false;\n  (function (a) {\n    if (/(android|bb\\d+|meego).+mobile|avantgo|bada\\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(a) || /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\\-(n|u)|c55\\/|capi|ccwa|cdm\\-|cell|chtm|cldc|cmd\\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\\-s|devi|dica|dmob|do(c|p)o|ds(12|\\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\\-|_)|g1 u|g560|gene|gf\\-5|g\\-mo|go(\\.w|od)|gr(ad|un)|haie|hcit|hd\\-(m|p|t)|hei\\-|hi(pt|ta)|hp( i|ip)|hs\\-c|ht(c(\\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\\-(20|go|ma)|i230|iac( |\\-|\\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\\/)|klon|kpt |kwc\\-|kyo(c|k)|le(no|xi)|lg( g|\\/(k|l|u)|50|54|\\-[a-w])|libw|lynx|m1\\-w|m3ga|m50\\/|ma(te|ui|xo)|mc(01|21|ca)|m\\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\\-2|po(ck|rt|se)|prox|psio|pt\\-g|qa\\-a|qc(07|12|21|32|60|\\-[2-7]|i\\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\\-|oo|p\\-)|sdk\\/|se(c(\\-|0|1)|47|mc|nd|ri)|sgh\\-|shar|sie(\\-|m)|sk\\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\\-|v\\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\\-|tdg\\-|tel(i|m)|tim\\-|t\\-mo|to(pl|sh)|ts(70|m\\-|m3|m5)|tx\\-9|up(\\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\\-|your|zeto|zte\\-/i.test(a.substr(0, 4))) check = true;\n  })(navigator.userAgent || navigator.vendor || window.opera);\n  return check;\n};\nvar extend = function extend(dest, src) {\n  for (var key in src) {\n    if (src.hasOwnProperty(key)) {\n      dest[key] = src[key];\n    }\n  }\n  return dest;\n};\nvar safariCssSizeWorkaround = function safariCssSizeWorkaround(canvas) {\n  if (isIOS()) {\n    var width = canvas.style.width;\n    var height = canvas.style.height;\n    canvas.style.width = parseInt(width) + 1 + 'px';\n    canvas.style.height = parseInt(height) + 'px';\n    setTimeout(function () {\n      canvas.style.width = width;\n      canvas.style.height = height;\n    }, 100);\n  }\n  window.canvas = canvas;\n};\nvar frameDataFromPose = function () {\n  var piOver180 = Math.PI / 180.0;\n  var rad45 = Math.PI * 0.25;\n  function mat4_perspectiveFromFieldOfView(out, fov, near, far) {\n    var upTan = Math.tan(fov ? fov.upDegrees * piOver180 : rad45),\n        downTan = Math.tan(fov ? fov.downDegrees * piOver180 : rad45),\n        leftTan = Math.tan(fov ? fov.leftDegrees * piOver180 : rad45),\n        rightTan = Math.tan(fov ? fov.rightDegrees * piOver180 : rad45),\n        xScale = 2.0 / (leftTan + rightTan),\n        yScale = 2.0 / (upTan + downTan);\n    out[0] = xScale;\n    out[1] = 0.0;\n    out[2] = 0.0;\n    out[3] = 0.0;\n    out[4] = 0.0;\n    out[5] = yScale;\n    out[6] = 0.0;\n    out[7] = 0.0;\n    out[8] = -((leftTan - rightTan) * xScale * 0.5);\n    out[9] = (upTan - downTan) * yScale * 0.5;\n    out[10] = far / (near - far);\n    out[11] = -1.0;\n    out[12] = 0.0;\n    out[13] = 0.0;\n    out[14] = far * near / (near - far);\n    out[15] = 0.0;\n    return out;\n  }\n  function mat4_fromRotationTranslation(out, q, v) {\n    var x = q[0],\n        y = q[1],\n        z = q[2],\n        w = q[3],\n        x2 = x + x,\n        y2 = y + y,\n        z2 = z + z,\n        xx = x * x2,\n        xy = x * y2,\n        xz = x * z2,\n        yy = y * y2,\n        yz = y * z2,\n        zz = z * z2,\n        wx = w * x2,\n        wy = w * y2,\n        wz = w * z2;\n    out[0] = 1 - (yy + zz);\n    out[1] = xy + wz;\n    out[2] = xz - wy;\n    out[3] = 0;\n    out[4] = xy - wz;\n    out[5] = 1 - (xx + zz);\n    out[6] = yz + wx;\n    out[7] = 0;\n    out[8] = xz + wy;\n    out[9] = yz - wx;\n    out[10] = 1 - (xx + yy);\n    out[11] = 0;\n    out[12] = v[0];\n    out[13] = v[1];\n    out[14] = v[2];\n    out[15] = 1;\n    return out;\n  }\n  function mat4_translate(out, a, v) {\n    var x = v[0],\n        y = v[1],\n        z = v[2],\n        a00,\n        a01,\n        a02,\n        a03,\n        a10,\n        a11,\n        a12,\n        a13,\n        a20,\n        a21,\n        a22,\n        a23;\n    if (a === out) {\n      out[12] = a[0] * x + a[4] * y + a[8] * z + a[12];\n      out[13] = a[1] * x + a[5] * y + a[9] * z + a[13];\n      out[14] = a[2] * x + a[6] * y + a[10] * z + a[14];\n      out[15] = a[3] * x + a[7] * y + a[11] * z + a[15];\n    } else {\n      a00 = a[0];a01 = a[1];a02 = a[2];a03 = a[3];\n      a10 = a[4];a11 = a[5];a12 = a[6];a13 = a[7];\n      a20 = a[8];a21 = a[9];a22 = a[10];a23 = a[11];\n      out[0] = a00;out[1] = a01;out[2] = a02;out[3] = a03;\n      out[4] = a10;out[5] = a11;out[6] = a12;out[7] = a13;\n      out[8] = a20;out[9] = a21;out[10] = a22;out[11] = a23;\n      out[12] = a00 * x + a10 * y + a20 * z + a[12];\n      out[13] = a01 * x + a11 * y + a21 * z + a[13];\n      out[14] = a02 * x + a12 * y + a22 * z + a[14];\n      out[15] = a03 * x + a13 * y + a23 * z + a[15];\n    }\n    return out;\n  }\n  function mat4_invert(out, a) {\n    var a00 = a[0],\n        a01 = a[1],\n        a02 = a[2],\n        a03 = a[3],\n        a10 = a[4],\n        a11 = a[5],\n        a12 = a[6],\n        a13 = a[7],\n        a20 = a[8],\n        a21 = a[9],\n        a22 = a[10],\n        a23 = a[11],\n        a30 = a[12],\n        a31 = a[13],\n        a32 = a[14],\n        a33 = a[15],\n        b00 = a00 * a11 - a01 * a10,\n        b01 = a00 * a12 - a02 * a10,\n        b02 = a00 * a13 - a03 * a10,\n        b03 = a01 * a12 - a02 * a11,\n        b04 = a01 * a13 - a03 * a11,\n        b05 = a02 * a13 - a03 * a12,\n        b06 = a20 * a31 - a21 * a30,\n        b07 = a20 * a32 - a22 * a30,\n        b08 = a20 * a33 - a23 * a30,\n        b09 = a21 * a32 - a22 * a31,\n        b10 = a21 * a33 - a23 * a31,\n        b11 = a22 * a33 - a23 * a32,\n    det = b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06;\n    if (!det) {\n      return null;\n    }\n    det = 1.0 / det;\n    out[0] = (a11 * b11 - a12 * b10 + a13 * b09) * det;\n    out[1] = (a02 * b10 - a01 * b11 - a03 * b09) * det;\n    out[2] = (a31 * b05 - a32 * b04 + a33 * b03) * det;\n    out[3] = (a22 * b04 - a21 * b05 - a23 * b03) * det;\n    out[4] = (a12 * b08 - a10 * b11 - a13 * b07) * det;\n    out[5] = (a00 * b11 - a02 * b08 + a03 * b07) * det;\n    out[6] = (a32 * b02 - a30 * b05 - a33 * b01) * det;\n    out[7] = (a20 * b05 - a22 * b02 + a23 * b01) * det;\n    out[8] = (a10 * b10 - a11 * b08 + a13 * b06) * det;\n    out[9] = (a01 * b08 - a00 * b10 - a03 * b06) * det;\n    out[10] = (a30 * b04 - a31 * b02 + a33 * b00) * det;\n    out[11] = (a21 * b02 - a20 * b04 - a23 * b00) * det;\n    out[12] = (a11 * b07 - a10 * b09 - a12 * b06) * det;\n    out[13] = (a00 * b09 - a01 * b07 + a02 * b06) * det;\n    out[14] = (a31 * b01 - a30 * b03 - a32 * b00) * det;\n    out[15] = (a20 * b03 - a21 * b01 + a22 * b00) * det;\n    return out;\n  }\n  var defaultOrientation = new Float32Array([0, 0, 0, 1]);\n  var defaultPosition = new Float32Array([0, 0, 0]);\n  function updateEyeMatrices(projection, view, pose, fov, offset, vrDisplay) {\n    mat4_perspectiveFromFieldOfView(projection, fov || null, vrDisplay.depthNear, vrDisplay.depthFar);\n    var orientation = pose.orientation || defaultOrientation;\n    var position = pose.position || defaultPosition;\n    mat4_fromRotationTranslation(view, orientation, position);\n    if (offset) mat4_translate(view, view, offset);\n    mat4_invert(view, view);\n  }\n  return function (frameData, pose, vrDisplay) {\n    if (!frameData || !pose) return false;\n    frameData.pose = pose;\n    frameData.timestamp = pose.timestamp;\n    updateEyeMatrices(frameData.leftProjectionMatrix, frameData.leftViewMatrix, pose, vrDisplay._getFieldOfView(\"left\"), vrDisplay._getEyeOffset(\"left\"), vrDisplay);\n    updateEyeMatrices(frameData.rightProjectionMatrix, frameData.rightViewMatrix, pose, vrDisplay._getFieldOfView(\"right\"), vrDisplay._getEyeOffset(\"right\"), vrDisplay);\n    return true;\n  };\n}();\nvar isInsideCrossOriginIFrame = function isInsideCrossOriginIFrame() {\n  var isFramed = window.self !== window.top;\n  var refOrigin = getOriginFromUrl(document.referrer);\n  var thisOrigin = getOriginFromUrl(window.location.href);\n  return isFramed && refOrigin !== thisOrigin;\n};\nvar getOriginFromUrl = function getOriginFromUrl(url) {\n  var domainIdx;\n  var protoSepIdx = url.indexOf(\"://\");\n  if (protoSepIdx !== -1) {\n    domainIdx = protoSepIdx + 3;\n  } else {\n    domainIdx = 0;\n  }\n  var domainEndIdx = url.indexOf('/', domainIdx);\n  if (domainEndIdx === -1) {\n    domainEndIdx = url.length;\n  }\n  return url.substring(0, domainEndIdx);\n};\nvar getQuaternionAngle = function getQuaternionAngle(quat) {\n  if (quat.w > 1) {\n    console.warn('getQuaternionAngle: w > 1');\n    return 0;\n  }\n  var angle = 2 * Math.acos(quat.w);\n  return angle;\n};\nvar warnOnce = function () {\n  var observedWarnings = {};\n  return function (key, message) {\n    if (observedWarnings[key] === undefined) {\n      console.warn('webvr-polyfill: ' + message);\n      observedWarnings[key] = true;\n    }\n  };\n}();\nvar deprecateWarning = function deprecateWarning(deprecated, suggested) {\n  var alternative = suggested ? 'Please use ' + suggested + ' instead.' : '';\n  warnOnce(deprecated, deprecated + ' has been deprecated. ' + 'This may not work on native WebVR displays. ' + alternative);\n};\nfunction WGLUPreserveGLState(gl, bindings, callback) {\n  if (!bindings) {\n    callback(gl);\n    return;\n  }\n  var boundValues = [];\n  var activeTexture = null;\n  for (var i = 0; i < bindings.length; ++i) {\n    var binding = bindings[i];\n    switch (binding) {\n      case gl.TEXTURE_BINDING_2D:\n      case gl.TEXTURE_BINDING_CUBE_MAP:\n        var textureUnit = bindings[++i];\n        if (textureUnit < gl.TEXTURE0 || textureUnit > gl.TEXTURE31) {\n          console.error(\"TEXTURE_BINDING_2D or TEXTURE_BINDING_CUBE_MAP must be followed by a valid texture unit\");\n          boundValues.push(null, null);\n          break;\n        }\n        if (!activeTexture) {\n          activeTexture = gl.getParameter(gl.ACTIVE_TEXTURE);\n        }\n        gl.activeTexture(textureUnit);\n        boundValues.push(gl.getParameter(binding), null);\n        break;\n      case gl.ACTIVE_TEXTURE:\n        activeTexture = gl.getParameter(gl.ACTIVE_TEXTURE);\n        boundValues.push(null);\n        break;\n      default:\n        boundValues.push(gl.getParameter(binding));\n        break;\n    }\n  }\n  callback(gl);\n  for (var i = 0; i < bindings.length; ++i) {\n    var binding = bindings[i];\n    var boundValue = boundValues[i];\n    switch (binding) {\n      case gl.ACTIVE_TEXTURE:\n        break;\n      case gl.ARRAY_BUFFER_BINDING:\n        gl.bindBuffer(gl.ARRAY_BUFFER, boundValue);\n        break;\n      case gl.COLOR_CLEAR_VALUE:\n        gl.clearColor(boundValue[0], boundValue[1], boundValue[2], boundValue[3]);\n        break;\n      case gl.COLOR_WRITEMASK:\n        gl.colorMask(boundValue[0], boundValue[1], boundValue[2], boundValue[3]);\n        break;\n      case gl.CURRENT_PROGRAM:\n        gl.useProgram(boundValue);\n        break;\n      case gl.ELEMENT_ARRAY_BUFFER_BINDING:\n        gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, boundValue);\n        break;\n      case gl.FRAMEBUFFER_BINDING:\n        gl.bindFramebuffer(gl.FRAMEBUFFER, boundValue);\n        break;\n      case gl.RENDERBUFFER_BINDING:\n        gl.bindRenderbuffer(gl.RENDERBUFFER, boundValue);\n        break;\n      case gl.TEXTURE_BINDING_2D:\n        var textureUnit = bindings[++i];\n        if (textureUnit < gl.TEXTURE0 || textureUnit > gl.TEXTURE31)\n          break;\n        gl.activeTexture(textureUnit);\n        gl.bindTexture(gl.TEXTURE_2D, boundValue);\n        break;\n      case gl.TEXTURE_BINDING_CUBE_MAP:\n        var textureUnit = bindings[++i];\n        if (textureUnit < gl.TEXTURE0 || textureUnit > gl.TEXTURE31)\n          break;\n        gl.activeTexture(textureUnit);\n        gl.bindTexture(gl.TEXTURE_CUBE_MAP, boundValue);\n        break;\n      case gl.VIEWPORT:\n        gl.viewport(boundValue[0], boundValue[1], boundValue[2], boundValue[3]);\n        break;\n      case gl.BLEND:\n      case gl.CULL_FACE:\n      case gl.DEPTH_TEST:\n      case gl.SCISSOR_TEST:\n      case gl.STENCIL_TEST:\n        if (boundValue) {\n          gl.enable(binding);\n        } else {\n          gl.disable(binding);\n        }\n        break;\n      default:\n        console.log(\"No GL restore behavior for 0x\" + binding.toString(16));\n        break;\n    }\n    if (activeTexture) {\n      gl.activeTexture(activeTexture);\n    }\n  }\n}\nvar glPreserveState = WGLUPreserveGLState;\nvar distortionVS = ['attribute vec2 position;', 'attribute vec3 texCoord;', 'varying vec2 vTexCoord;', 'uniform vec4 viewportOffsetScale[2];', 'void main() {', '  vec4 viewport = viewportOffsetScale[int(texCoord.z)];', '  vTexCoord = (texCoord.xy * viewport.zw) + viewport.xy;', '  gl_Position = vec4( position, 1.0, 1.0 );', '}'].join('\\n');\nvar distortionFS = ['precision mediump float;', 'uniform sampler2D diffuse;', 'varying vec2 vTexCoord;', 'void main() {', '  gl_FragColor = texture2D(diffuse, vTexCoord);', '}'].join('\\n');\nfunction CardboardDistorter(gl, cardboardUI, bufferScale, dirtySubmitFrameBindings) {\n  this.gl = gl;\n  this.cardboardUI = cardboardUI;\n  this.bufferScale = bufferScale;\n  this.dirtySubmitFrameBindings = dirtySubmitFrameBindings;\n  this.ctxAttribs = gl.getContextAttributes();\n  this.instanceExt = gl.getExtension('ANGLE_instanced_arrays');\n  this.meshWidth = 20;\n  this.meshHeight = 20;\n  this.bufferWidth = gl.drawingBufferWidth;\n  this.bufferHeight = gl.drawingBufferHeight;\n  this.realBindFramebuffer = gl.bindFramebuffer;\n  this.realEnable = gl.enable;\n  this.realDisable = gl.disable;\n  this.realColorMask = gl.colorMask;\n  this.realClearColor = gl.clearColor;\n  this.realViewport = gl.viewport;\n  if (!isIOS()) {\n    this.realCanvasWidth = Object.getOwnPropertyDescriptor(gl.canvas.__proto__, 'width');\n    this.realCanvasHeight = Object.getOwnPropertyDescriptor(gl.canvas.__proto__, 'height');\n  }\n  this.isPatched = false;\n  this.lastBoundFramebuffer = null;\n  this.cullFace = false;\n  this.depthTest = false;\n  this.blend = false;\n  this.scissorTest = false;\n  this.stencilTest = false;\n  this.viewport = [0, 0, 0, 0];\n  this.colorMask = [true, true, true, true];\n  this.clearColor = [0, 0, 0, 0];\n  this.attribs = {\n    position: 0,\n    texCoord: 1\n  };\n  this.program = linkProgram(gl, distortionVS, distortionFS, this.attribs);\n  this.uniforms = getProgramUniforms(gl, this.program);\n  this.viewportOffsetScale = new Float32Array(8);\n  this.setTextureBounds();\n  this.vertexBuffer = gl.createBuffer();\n  this.indexBuffer = gl.createBuffer();\n  this.indexCount = 0;\n  this.renderTarget = gl.createTexture();\n  this.framebuffer = gl.createFramebuffer();\n  this.depthStencilBuffer = null;\n  this.depthBuffer = null;\n  this.stencilBuffer = null;\n  if (this.ctxAttribs.depth && this.ctxAttribs.stencil) {\n    this.depthStencilBuffer = gl.createRenderbuffer();\n  } else if (this.ctxAttribs.depth) {\n    this.depthBuffer = gl.createRenderbuffer();\n  } else if (this.ctxAttribs.stencil) {\n    this.stencilBuffer = gl.createRenderbuffer();\n  }\n  this.patch();\n  this.onResize();\n}\nCardboardDistorter.prototype.destroy = function () {\n  var gl = this.gl;\n  this.unpatch();\n  gl.deleteProgram(this.program);\n  gl.deleteBuffer(this.vertexBuffer);\n  gl.deleteBuffer(this.indexBuffer);\n  gl.deleteTexture(this.renderTarget);\n  gl.deleteFramebuffer(this.framebuffer);\n  if (this.depthStencilBuffer) {\n    gl.deleteRenderbuffer(this.depthStencilBuffer);\n  }\n  if (this.depthBuffer) {\n    gl.deleteRenderbuffer(this.depthBuffer);\n  }\n  if (this.stencilBuffer) {\n    gl.deleteRenderbuffer(this.stencilBuffer);\n  }\n  if (this.cardboardUI) {\n    this.cardboardUI.destroy();\n  }\n};\nCardboardDistorter.prototype.onResize = function () {\n  var gl = this.gl;\n  var self = this;\n  var glState = [gl.RENDERBUFFER_BINDING, gl.TEXTURE_BINDING_2D, gl.TEXTURE0];\n  glPreserveState(gl, glState, function (gl) {\n    self.realBindFramebuffer.call(gl, gl.FRAMEBUFFER, null);\n    if (self.scissorTest) {\n      self.realDisable.call(gl, gl.SCISSOR_TEST);\n    }\n    self.realColorMask.call(gl, true, true, true, true);\n    self.realViewport.call(gl, 0, 0, gl.drawingBufferWidth, gl.drawingBufferHeight);\n    self.realClearColor.call(gl, 0, 0, 0, 1);\n    gl.clear(gl.COLOR_BUFFER_BIT);\n    self.realBindFramebuffer.call(gl, gl.FRAMEBUFFER, self.framebuffer);\n    gl.bindTexture(gl.TEXTURE_2D, self.renderTarget);\n    gl.texImage2D(gl.TEXTURE_2D, 0, self.ctxAttribs.alpha ? gl.RGBA : gl.RGB, self.bufferWidth, self.bufferHeight, 0, self.ctxAttribs.alpha ? gl.RGBA : gl.RGB, gl.UNSIGNED_BYTE, null);\n    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);\n    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);\n    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n    gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, self.renderTarget, 0);\n    if (self.ctxAttribs.depth && self.ctxAttribs.stencil) {\n      gl.bindRenderbuffer(gl.RENDERBUFFER, self.depthStencilBuffer);\n      gl.renderbufferStorage(gl.RENDERBUFFER, gl.DEPTH_STENCIL, self.bufferWidth, self.bufferHeight);\n      gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.DEPTH_STENCIL_ATTACHMENT, gl.RENDERBUFFER, self.depthStencilBuffer);\n    } else if (self.ctxAttribs.depth) {\n      gl.bindRenderbuffer(gl.RENDERBUFFER, self.depthBuffer);\n      gl.renderbufferStorage(gl.RENDERBUFFER, gl.DEPTH_COMPONENT16, self.bufferWidth, self.bufferHeight);\n      gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.DEPTH_ATTACHMENT, gl.RENDERBUFFER, self.depthBuffer);\n    } else if (self.ctxAttribs.stencil) {\n      gl.bindRenderbuffer(gl.RENDERBUFFER, self.stencilBuffer);\n      gl.renderbufferStorage(gl.RENDERBUFFER, gl.STENCIL_INDEX8, self.bufferWidth, self.bufferHeight);\n      gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.STENCIL_ATTACHMENT, gl.RENDERBUFFER, self.stencilBuffer);\n    }\n    if (!gl.checkFramebufferStatus(gl.FRAMEBUFFER) === gl.FRAMEBUFFER_COMPLETE) {\n      console.error('Framebuffer incomplete!');\n    }\n    self.realBindFramebuffer.call(gl, gl.FRAMEBUFFER, self.lastBoundFramebuffer);\n    if (self.scissorTest) {\n      self.realEnable.call(gl, gl.SCISSOR_TEST);\n    }\n    self.realColorMask.apply(gl, self.colorMask);\n    self.realViewport.apply(gl, self.viewport);\n    self.realClearColor.apply(gl, self.clearColor);\n  });\n  if (this.cardboardUI) {\n    this.cardboardUI.onResize();\n  }\n};\nCardboardDistorter.prototype.patch = function () {\n  if (this.isPatched) {\n    return;\n  }\n  var self = this;\n  var canvas = this.gl.canvas;\n  var gl = this.gl;\n  if (!isIOS()) {\n    canvas.width = getScreenWidth() * this.bufferScale;\n    canvas.height = getScreenHeight() * this.bufferScale;\n    Object.defineProperty(canvas, 'width', {\n      configurable: true,\n      enumerable: true,\n      get: function get() {\n        return self.bufferWidth;\n      },\n      set: function set(value) {\n        self.bufferWidth = value;\n        self.realCanvasWidth.set.call(canvas, value);\n        self.onResize();\n      }\n    });\n    Object.defineProperty(canvas, 'height', {\n      configurable: true,\n      enumerable: true,\n      get: function get() {\n        return self.bufferHeight;\n      },\n      set: function set(value) {\n        self.bufferHeight = value;\n        self.realCanvasHeight.set.call(canvas, value);\n        self.onResize();\n      }\n    });\n  }\n  this.lastBoundFramebuffer = gl.getParameter(gl.FRAMEBUFFER_BINDING);\n  if (this.lastBoundFramebuffer == null) {\n    this.lastBoundFramebuffer = this.framebuffer;\n    this.gl.bindFramebuffer(gl.FRAMEBUFFER, this.framebuffer);\n  }\n  this.gl.bindFramebuffer = function (target, framebuffer) {\n    self.lastBoundFramebuffer = framebuffer ? framebuffer : self.framebuffer;\n    self.realBindFramebuffer.call(gl, target, self.lastBoundFramebuffer);\n  };\n  this.cullFace = gl.getParameter(gl.CULL_FACE);\n  this.depthTest = gl.getParameter(gl.DEPTH_TEST);\n  this.blend = gl.getParameter(gl.BLEND);\n  this.scissorTest = gl.getParameter(gl.SCISSOR_TEST);\n  this.stencilTest = gl.getParameter(gl.STENCIL_TEST);\n  gl.enable = function (pname) {\n    switch (pname) {\n      case gl.CULL_FACE:\n        self.cullFace = true;break;\n      case gl.DEPTH_TEST:\n        self.depthTest = true;break;\n      case gl.BLEND:\n        self.blend = true;break;\n      case gl.SCISSOR_TEST:\n        self.scissorTest = true;break;\n      case gl.STENCIL_TEST:\n        self.stencilTest = true;break;\n    }\n    self.realEnable.call(gl, pname);\n  };\n  gl.disable = function (pname) {\n    switch (pname) {\n      case gl.CULL_FACE:\n        self.cullFace = false;break;\n      case gl.DEPTH_TEST:\n        self.depthTest = false;break;\n      case gl.BLEND:\n        self.blend = false;break;\n      case gl.SCISSOR_TEST:\n        self.scissorTest = false;break;\n      case gl.STENCIL_TEST:\n        self.stencilTest = false;break;\n    }\n    self.realDisable.call(gl, pname);\n  };\n  this.colorMask = gl.getParameter(gl.COLOR_WRITEMASK);\n  gl.colorMask = function (r, g, b, a) {\n    self.colorMask[0] = r;\n    self.colorMask[1] = g;\n    self.colorMask[2] = b;\n    self.colorMask[3] = a;\n    self.realColorMask.call(gl, r, g, b, a);\n  };\n  this.clearColor = gl.getParameter(gl.COLOR_CLEAR_VALUE);\n  gl.clearColor = function (r, g, b, a) {\n    self.clearColor[0] = r;\n    self.clearColor[1] = g;\n    self.clearColor[2] = b;\n    self.clearColor[3] = a;\n    self.realClearColor.call(gl, r, g, b, a);\n  };\n  this.viewport = gl.getParameter(gl.VIEWPORT);\n  gl.viewport = function (x, y, w, h) {\n    self.viewport[0] = x;\n    self.viewport[1] = y;\n    self.viewport[2] = w;\n    self.viewport[3] = h;\n    self.realViewport.call(gl, x, y, w, h);\n  };\n  this.isPatched = true;\n  safariCssSizeWorkaround(canvas);\n};\nCardboardDistorter.prototype.unpatch = function () {\n  if (!this.isPatched) {\n    return;\n  }\n  var gl = this.gl;\n  var canvas = this.gl.canvas;\n  if (!isIOS()) {\n    Object.defineProperty(canvas, 'width', this.realCanvasWidth);\n    Object.defineProperty(canvas, 'height', this.realCanvasHeight);\n  }\n  canvas.width = this.bufferWidth;\n  canvas.height = this.bufferHeight;\n  gl.bindFramebuffer = this.realBindFramebuffer;\n  gl.enable = this.realEnable;\n  gl.disable = this.realDisable;\n  gl.colorMask = this.realColorMask;\n  gl.clearColor = this.realClearColor;\n  gl.viewport = this.realViewport;\n  if (this.lastBoundFramebuffer == this.framebuffer) {\n    gl.bindFramebuffer(gl.FRAMEBUFFER, null);\n  }\n  this.isPatched = false;\n  setTimeout(function () {\n    safariCssSizeWorkaround(canvas);\n  }, 1);\n};\nCardboardDistorter.prototype.setTextureBounds = function (leftBounds, rightBounds) {\n  if (!leftBounds) {\n    leftBounds = [0, 0, 0.5, 1];\n  }\n  if (!rightBounds) {\n    rightBounds = [0.5, 0, 0.5, 1];\n  }\n  this.viewportOffsetScale[0] = leftBounds[0];\n  this.viewportOffsetScale[1] = leftBounds[1];\n  this.viewportOffsetScale[2] = leftBounds[2];\n  this.viewportOffsetScale[3] = leftBounds[3];\n  this.viewportOffsetScale[4] = rightBounds[0];\n  this.viewportOffsetScale[5] = rightBounds[1];\n  this.viewportOffsetScale[6] = rightBounds[2];\n  this.viewportOffsetScale[7] = rightBounds[3];\n};\nCardboardDistorter.prototype.submitFrame = function () {\n  var gl = this.gl;\n  var self = this;\n  var glState = [];\n  if (!this.dirtySubmitFrameBindings) {\n    glState.push(gl.CURRENT_PROGRAM, gl.ARRAY_BUFFER_BINDING, gl.ELEMENT_ARRAY_BUFFER_BINDING, gl.TEXTURE_BINDING_2D, gl.TEXTURE0);\n  }\n  glPreserveState(gl, glState, function (gl) {\n    self.realBindFramebuffer.call(gl, gl.FRAMEBUFFER, null);\n    var positionDivisor = 0;\n    var texCoordDivisor = 0;\n    if (self.instanceExt) {\n      positionDivisor = gl.getVertexAttrib(self.attribs.position, self.instanceExt.VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE);\n      texCoordDivisor = gl.getVertexAttrib(self.attribs.texCoord, self.instanceExt.VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE);\n    }\n    if (self.cullFace) {\n      self.realDisable.call(gl, gl.CULL_FACE);\n    }\n    if (self.depthTest) {\n      self.realDisable.call(gl, gl.DEPTH_TEST);\n    }\n    if (self.blend) {\n      self.realDisable.call(gl, gl.BLEND);\n    }\n    if (self.scissorTest) {\n      self.realDisable.call(gl, gl.SCISSOR_TEST);\n    }\n    if (self.stencilTest) {\n      self.realDisable.call(gl, gl.STENCIL_TEST);\n    }\n    self.realColorMask.call(gl, true, true, true, true);\n    self.realViewport.call(gl, 0, 0, gl.drawingBufferWidth, gl.drawingBufferHeight);\n    if (self.ctxAttribs.alpha || isIOS()) {\n      self.realClearColor.call(gl, 0, 0, 0, 1);\n      gl.clear(gl.COLOR_BUFFER_BIT);\n    }\n    gl.useProgram(self.program);\n    gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, self.indexBuffer);\n    gl.bindBuffer(gl.ARRAY_BUFFER, self.vertexBuffer);\n    gl.enableVertexAttribArray(self.attribs.position);\n    gl.enableVertexAttribArray(self.attribs.texCoord);\n    gl.vertexAttribPointer(self.attribs.position, 2, gl.FLOAT, false, 20, 0);\n    gl.vertexAttribPointer(self.attribs.texCoord, 3, gl.FLOAT, false, 20, 8);\n    if (self.instanceExt) {\n      if (positionDivisor != 0) {\n        self.instanceExt.vertexAttribDivisorANGLE(self.attribs.position, 0);\n      }\n      if (texCoordDivisor != 0) {\n        self.instanceExt.vertexAttribDivisorANGLE(self.attribs.texCoord, 0);\n      }\n    }\n    gl.activeTexture(gl.TEXTURE0);\n    gl.uniform1i(self.uniforms.diffuse, 0);\n    gl.bindTexture(gl.TEXTURE_2D, self.renderTarget);\n    gl.uniform4fv(self.uniforms.viewportOffsetScale, self.viewportOffsetScale);\n    gl.drawElements(gl.TRIANGLES, self.indexCount, gl.UNSIGNED_SHORT, 0);\n    if (self.cardboardUI) {\n      self.cardboardUI.renderNoState();\n    }\n    self.realBindFramebuffer.call(self.gl, gl.FRAMEBUFFER, self.framebuffer);\n    if (!self.ctxAttribs.preserveDrawingBuffer) {\n      self.realClearColor.call(gl, 0, 0, 0, 0);\n      gl.clear(gl.COLOR_BUFFER_BIT);\n    }\n    if (!self.dirtySubmitFrameBindings) {\n      self.realBindFramebuffer.call(gl, gl.FRAMEBUFFER, self.lastBoundFramebuffer);\n    }\n    if (self.cullFace) {\n      self.realEnable.call(gl, gl.CULL_FACE);\n    }\n    if (self.depthTest) {\n      self.realEnable.call(gl, gl.DEPTH_TEST);\n    }\n    if (self.blend) {\n      self.realEnable.call(gl, gl.BLEND);\n    }\n    if (self.scissorTest) {\n      self.realEnable.call(gl, gl.SCISSOR_TEST);\n    }\n    if (self.stencilTest) {\n      self.realEnable.call(gl, gl.STENCIL_TEST);\n    }\n    self.realColorMask.apply(gl, self.colorMask);\n    self.realViewport.apply(gl, self.viewport);\n    if (self.ctxAttribs.alpha || !self.ctxAttribs.preserveDrawingBuffer) {\n      self.realClearColor.apply(gl, self.clearColor);\n    }\n    if (self.instanceExt) {\n      if (positionDivisor != 0) {\n        self.instanceExt.vertexAttribDivisorANGLE(self.attribs.position, positionDivisor);\n      }\n      if (texCoordDivisor != 0) {\n        self.instanceExt.vertexAttribDivisorANGLE(self.attribs.texCoord, texCoordDivisor);\n      }\n    }\n  });\n  if (isIOS()) {\n    var canvas = gl.canvas;\n    if (canvas.width != self.bufferWidth || canvas.height != self.bufferHeight) {\n      self.bufferWidth = canvas.width;\n      self.bufferHeight = canvas.height;\n      self.onResize();\n    }\n  }\n};\nCardboardDistorter.prototype.updateDeviceInfo = function (deviceInfo) {\n  var gl = this.gl;\n  var self = this;\n  var glState = [gl.ARRAY_BUFFER_BINDING, gl.ELEMENT_ARRAY_BUFFER_BINDING];\n  glPreserveState(gl, glState, function (gl) {\n    var vertices = self.computeMeshVertices_(self.meshWidth, self.meshHeight, deviceInfo);\n    gl.bindBuffer(gl.ARRAY_BUFFER, self.vertexBuffer);\n    gl.bufferData(gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW);\n    if (!self.indexCount) {\n      var indices = self.computeMeshIndices_(self.meshWidth, self.meshHeight);\n      gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, self.indexBuffer);\n      gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, indices, gl.STATIC_DRAW);\n      self.indexCount = indices.length;\n    }\n  });\n};\nCardboardDistorter.prototype.computeMeshVertices_ = function (width, height, deviceInfo) {\n  var vertices = new Float32Array(2 * width * height * 5);\n  var lensFrustum = deviceInfo.getLeftEyeVisibleTanAngles();\n  var noLensFrustum = deviceInfo.getLeftEyeNoLensTanAngles();\n  var viewport = deviceInfo.getLeftEyeVisibleScreenRect(noLensFrustum);\n  var vidx = 0;\n  for (var e = 0; e < 2; e++) {\n    for (var j = 0; j < height; j++) {\n      for (var i = 0; i < width; i++, vidx++) {\n        var u = i / (width - 1);\n        var v = j / (height - 1);\n        var s = u;\n        var t = v;\n        var x = lerp(lensFrustum[0], lensFrustum[2], u);\n        var y = lerp(lensFrustum[3], lensFrustum[1], v);\n        var d = Math.sqrt(x * x + y * y);\n        var r = deviceInfo.distortion.distortInverse(d);\n        var p = x * r / d;\n        var q = y * r / d;\n        u = (p - noLensFrustum[0]) / (noLensFrustum[2] - noLensFrustum[0]);\n        v = (q - noLensFrustum[3]) / (noLensFrustum[1] - noLensFrustum[3]);\n        u = (viewport.x + u * viewport.width - 0.5) * 2.0;\n        v = (viewport.y + v * viewport.height - 0.5) * 2.0;\n        vertices[vidx * 5 + 0] = u;\n        vertices[vidx * 5 + 1] = v;\n        vertices[vidx * 5 + 2] = s;\n        vertices[vidx * 5 + 3] = t;\n        vertices[vidx * 5 + 4] = e;\n      }\n    }\n    var w = lensFrustum[2] - lensFrustum[0];\n    lensFrustum[0] = -(w + lensFrustum[0]);\n    lensFrustum[2] = w - lensFrustum[2];\n    w = noLensFrustum[2] - noLensFrustum[0];\n    noLensFrustum[0] = -(w + noLensFrustum[0]);\n    noLensFrustum[2] = w - noLensFrustum[2];\n    viewport.x = 1 - (viewport.x + viewport.width);\n  }\n  return vertices;\n};\nCardboardDistorter.prototype.computeMeshIndices_ = function (width, height) {\n  var indices = new Uint16Array(2 * (width - 1) * (height - 1) * 6);\n  var halfwidth = width / 2;\n  var halfheight = height / 2;\n  var vidx = 0;\n  var iidx = 0;\n  for (var e = 0; e < 2; e++) {\n    for (var j = 0; j < height; j++) {\n      for (var i = 0; i < width; i++, vidx++) {\n        if (i == 0 || j == 0) continue;\n        if (i <= halfwidth == j <= halfheight) {\n          indices[iidx++] = vidx;\n          indices[iidx++] = vidx - width - 1;\n          indices[iidx++] = vidx - width;\n          indices[iidx++] = vidx - width - 1;\n          indices[iidx++] = vidx;\n          indices[iidx++] = vidx - 1;\n        } else {\n          indices[iidx++] = vidx - 1;\n          indices[iidx++] = vidx - width;\n          indices[iidx++] = vidx;\n          indices[iidx++] = vidx - width;\n          indices[iidx++] = vidx - 1;\n          indices[iidx++] = vidx - width - 1;\n        }\n      }\n    }\n  }\n  return indices;\n};\nCardboardDistorter.prototype.getOwnPropertyDescriptor_ = function (proto, attrName) {\n  var descriptor = Object.getOwnPropertyDescriptor(proto, attrName);\n  if (descriptor.get === undefined || descriptor.set === undefined) {\n    descriptor.configurable = true;\n    descriptor.enumerable = true;\n    descriptor.get = function () {\n      return this.getAttribute(attrName);\n    };\n    descriptor.set = function (val) {\n      this.setAttribute(attrName, val);\n    };\n  }\n  return descriptor;\n};\nvar uiVS = ['attribute vec2 position;', 'uniform mat4 projectionMat;', 'void main() {', '  gl_Position = projectionMat * vec4( position, -1.0, 1.0 );', '}'].join('\\n');\nvar uiFS = ['precision mediump float;', 'uniform vec4 color;', 'void main() {', '  gl_FragColor = color;', '}'].join('\\n');\nvar DEG2RAD = Math.PI / 180.0;\nvar kAnglePerGearSection = 60;\nvar kOuterRimEndAngle = 12;\nvar kInnerRimBeginAngle = 20;\nvar kOuterRadius = 1;\nvar kMiddleRadius = 0.75;\nvar kInnerRadius = 0.3125;\nvar kCenterLineThicknessDp = 4;\nvar kButtonWidthDp = 28;\nvar kTouchSlopFactor = 1.5;\nfunction CardboardUI(gl) {\n  this.gl = gl;\n  this.attribs = {\n    position: 0\n  };\n  this.program = linkProgram(gl, uiVS, uiFS, this.attribs);\n  this.uniforms = getProgramUniforms(gl, this.program);\n  this.vertexBuffer = gl.createBuffer();\n  this.gearOffset = 0;\n  this.gearVertexCount = 0;\n  this.arrowOffset = 0;\n  this.arrowVertexCount = 0;\n  this.projMat = new Float32Array(16);\n  this.listener = null;\n  this.onResize();\n}\nCardboardUI.prototype.destroy = function () {\n  var gl = this.gl;\n  if (this.listener) {\n    gl.canvas.removeEventListener('click', this.listener, false);\n  }\n  gl.deleteProgram(this.program);\n  gl.deleteBuffer(this.vertexBuffer);\n};\nCardboardUI.prototype.listen = function (optionsCallback, backCallback) {\n  var canvas = this.gl.canvas;\n  this.listener = function (event) {\n    var midline = canvas.clientWidth / 2;\n    var buttonSize = kButtonWidthDp * kTouchSlopFactor;\n    if (event.clientX > midline - buttonSize && event.clientX < midline + buttonSize && event.clientY > canvas.clientHeight - buttonSize) {\n      optionsCallback(event);\n    }\n    else if (event.clientX < buttonSize && event.clientY < buttonSize) {\n        backCallback(event);\n      }\n  };\n  canvas.addEventListener('click', this.listener, false);\n};\nCardboardUI.prototype.onResize = function () {\n  var gl = this.gl;\n  var self = this;\n  var glState = [gl.ARRAY_BUFFER_BINDING];\n  glPreserveState(gl, glState, function (gl) {\n    var vertices = [];\n    var midline = gl.drawingBufferWidth / 2;\n    var physicalPixels = Math.max(screen.width, screen.height) * window.devicePixelRatio;\n    var scalingRatio = gl.drawingBufferWidth / physicalPixels;\n    var dps = scalingRatio * window.devicePixelRatio;\n    var lineWidth = kCenterLineThicknessDp * dps / 2;\n    var buttonSize = kButtonWidthDp * kTouchSlopFactor * dps;\n    var buttonScale = kButtonWidthDp * dps / 2;\n    var buttonBorder = (kButtonWidthDp * kTouchSlopFactor - kButtonWidthDp) * dps;\n    vertices.push(midline - lineWidth, buttonSize);\n    vertices.push(midline - lineWidth, gl.drawingBufferHeight);\n    vertices.push(midline + lineWidth, buttonSize);\n    vertices.push(midline + lineWidth, gl.drawingBufferHeight);\n    self.gearOffset = vertices.length / 2;\n    function addGearSegment(theta, r) {\n      var angle = (90 - theta) * DEG2RAD;\n      var x = Math.cos(angle);\n      var y = Math.sin(angle);\n      vertices.push(kInnerRadius * x * buttonScale + midline, kInnerRadius * y * buttonScale + buttonScale);\n      vertices.push(r * x * buttonScale + midline, r * y * buttonScale + buttonScale);\n    }\n    for (var i = 0; i <= 6; i++) {\n      var segmentTheta = i * kAnglePerGearSection;\n      addGearSegment(segmentTheta, kOuterRadius);\n      addGearSegment(segmentTheta + kOuterRimEndAngle, kOuterRadius);\n      addGearSegment(segmentTheta + kInnerRimBeginAngle, kMiddleRadius);\n      addGearSegment(segmentTheta + (kAnglePerGearSection - kInnerRimBeginAngle), kMiddleRadius);\n      addGearSegment(segmentTheta + (kAnglePerGearSection - kOuterRimEndAngle), kOuterRadius);\n    }\n    self.gearVertexCount = vertices.length / 2 - self.gearOffset;\n    self.arrowOffset = vertices.length / 2;\n    function addArrowVertex(x, y) {\n      vertices.push(buttonBorder + x, gl.drawingBufferHeight - buttonBorder - y);\n    }\n    var angledLineWidth = lineWidth / Math.sin(45 * DEG2RAD);\n    addArrowVertex(0, buttonScale);\n    addArrowVertex(buttonScale, 0);\n    addArrowVertex(buttonScale + angledLineWidth, angledLineWidth);\n    addArrowVertex(angledLineWidth, buttonScale + angledLineWidth);\n    addArrowVertex(angledLineWidth, buttonScale - angledLineWidth);\n    addArrowVertex(0, buttonScale);\n    addArrowVertex(buttonScale, buttonScale * 2);\n    addArrowVertex(buttonScale + angledLineWidth, buttonScale * 2 - angledLineWidth);\n    addArrowVertex(angledLineWidth, buttonScale - angledLineWidth);\n    addArrowVertex(0, buttonScale);\n    addArrowVertex(angledLineWidth, buttonScale - lineWidth);\n    addArrowVertex(kButtonWidthDp * dps, buttonScale - lineWidth);\n    addArrowVertex(angledLineWidth, buttonScale + lineWidth);\n    addArrowVertex(kButtonWidthDp * dps, buttonScale + lineWidth);\n    self.arrowVertexCount = vertices.length / 2 - self.arrowOffset;\n    gl.bindBuffer(gl.ARRAY_BUFFER, self.vertexBuffer);\n    gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(vertices), gl.STATIC_DRAW);\n  });\n};\nCardboardUI.prototype.render = function () {\n  var gl = this.gl;\n  var self = this;\n  var glState = [gl.CULL_FACE, gl.DEPTH_TEST, gl.BLEND, gl.SCISSOR_TEST, gl.STENCIL_TEST, gl.COLOR_WRITEMASK, gl.VIEWPORT, gl.CURRENT_PROGRAM, gl.ARRAY_BUFFER_BINDING];\n  glPreserveState(gl, glState, function (gl) {\n    gl.disable(gl.CULL_FACE);\n    gl.disable(gl.DEPTH_TEST);\n    gl.disable(gl.BLEND);\n    gl.disable(gl.SCISSOR_TEST);\n    gl.disable(gl.STENCIL_TEST);\n    gl.colorMask(true, true, true, true);\n    gl.viewport(0, 0, gl.drawingBufferWidth, gl.drawingBufferHeight);\n    self.renderNoState();\n  });\n};\nCardboardUI.prototype.renderNoState = function () {\n  var gl = this.gl;\n  gl.useProgram(this.program);\n  gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer);\n  gl.enableVertexAttribArray(this.attribs.position);\n  gl.vertexAttribPointer(this.attribs.position, 2, gl.FLOAT, false, 8, 0);\n  gl.uniform4f(this.uniforms.color, 1.0, 1.0, 1.0, 1.0);\n  orthoMatrix(this.projMat, 0, gl.drawingBufferWidth, 0, gl.drawingBufferHeight, 0.1, 1024.0);\n  gl.uniformMatrix4fv(this.uniforms.projectionMat, false, this.projMat);\n  gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);\n  gl.drawArrays(gl.TRIANGLE_STRIP, this.gearOffset, this.gearVertexCount);\n  gl.drawArrays(gl.TRIANGLE_STRIP, this.arrowOffset, this.arrowVertexCount);\n};\nfunction Distortion(coefficients) {\n  this.coefficients = coefficients;\n}\nDistortion.prototype.distortInverse = function (radius) {\n  var r0 = 0;\n  var r1 = 1;\n  var dr0 = radius - this.distort(r0);\n  while (Math.abs(r1 - r0) > 0.0001             ) {\n    var dr1 = radius - this.distort(r1);\n    var r2 = r1 - dr1 * ((r1 - r0) / (dr1 - dr0));\n    r0 = r1;\n    r1 = r2;\n    dr0 = dr1;\n  }\n  return r1;\n};\nDistortion.prototype.distort = function (radius) {\n  var r2 = radius * radius;\n  var ret = 0;\n  for (var i = 0; i < this.coefficients.length; i++) {\n    ret = r2 * (ret + this.coefficients[i]);\n  }\n  return (ret + 1) * radius;\n};\nvar degToRad = Math.PI / 180;\nvar radToDeg = 180 / Math.PI;\nvar Vector3 = function Vector3(x, y, z) {\n  this.x = x || 0;\n  this.y = y || 0;\n  this.z = z || 0;\n};\nVector3.prototype = {\n  constructor: Vector3,\n  set: function set(x, y, z) {\n    this.x = x;\n    this.y = y;\n    this.z = z;\n    return this;\n  },\n  copy: function copy(v) {\n    this.x = v.x;\n    this.y = v.y;\n    this.z = v.z;\n    return this;\n  },\n  length: function length() {\n    return Math.sqrt(this.x * this.x + this.y * this.y + this.z * this.z);\n  },\n  normalize: function normalize() {\n    var scalar = this.length();\n    if (scalar !== 0) {\n      var invScalar = 1 / scalar;\n      this.multiplyScalar(invScalar);\n    } else {\n      this.x = 0;\n      this.y = 0;\n      this.z = 0;\n    }\n    return this;\n  },\n  multiplyScalar: function multiplyScalar(scalar) {\n    this.x *= scalar;\n    this.y *= scalar;\n    this.z *= scalar;\n  },\n  applyQuaternion: function applyQuaternion(q) {\n    var x = this.x;\n    var y = this.y;\n    var z = this.z;\n    var qx = q.x;\n    var qy = q.y;\n    var qz = q.z;\n    var qw = q.w;\n    var ix = qw * x + qy * z - qz * y;\n    var iy = qw * y + qz * x - qx * z;\n    var iz = qw * z + qx * y - qy * x;\n    var iw = -qx * x - qy * y - qz * z;\n    this.x = ix * qw + iw * -qx + iy * -qz - iz * -qy;\n    this.y = iy * qw + iw * -qy + iz * -qx - ix * -qz;\n    this.z = iz * qw + iw * -qz + ix * -qy - iy * -qx;\n    return this;\n  },\n  dot: function dot(v) {\n    return this.x * v.x + this.y * v.y + this.z * v.z;\n  },\n  crossVectors: function crossVectors(a, b) {\n    var ax = a.x,\n        ay = a.y,\n        az = a.z;\n    var bx = b.x,\n        by = b.y,\n        bz = b.z;\n    this.x = ay * bz - az * by;\n    this.y = az * bx - ax * bz;\n    this.z = ax * by - ay * bx;\n    return this;\n  }\n};\nvar Quaternion = function Quaternion(x, y, z, w) {\n  this.x = x || 0;\n  this.y = y || 0;\n  this.z = z || 0;\n  this.w = w !== undefined ? w : 1;\n};\nQuaternion.prototype = {\n  constructor: Quaternion,\n  set: function set(x, y, z, w) {\n    this.x = x;\n    this.y = y;\n    this.z = z;\n    this.w = w;\n    return this;\n  },\n  copy: function copy(quaternion) {\n    this.x = quaternion.x;\n    this.y = quaternion.y;\n    this.z = quaternion.z;\n    this.w = quaternion.w;\n    return this;\n  },\n  setFromEulerXYZ: function setFromEulerXYZ(x, y, z) {\n    var c1 = Math.cos(x / 2);\n    var c2 = Math.cos(y / 2);\n    var c3 = Math.cos(z / 2);\n    var s1 = Math.sin(x / 2);\n    var s2 = Math.sin(y / 2);\n    var s3 = Math.sin(z / 2);\n    this.x = s1 * c2 * c3 + c1 * s2 * s3;\n    this.y = c1 * s2 * c3 - s1 * c2 * s3;\n    this.z = c1 * c2 * s3 + s1 * s2 * c3;\n    this.w = c1 * c2 * c3 - s1 * s2 * s3;\n    return this;\n  },\n  setFromEulerYXZ: function setFromEulerYXZ(x, y, z) {\n    var c1 = Math.cos(x / 2);\n    var c2 = Math.cos(y / 2);\n    var c3 = Math.cos(z / 2);\n    var s1 = Math.sin(x / 2);\n    var s2 = Math.sin(y / 2);\n    var s3 = Math.sin(z / 2);\n    this.x = s1 * c2 * c3 + c1 * s2 * s3;\n    this.y = c1 * s2 * c3 - s1 * c2 * s3;\n    this.z = c1 * c2 * s3 - s1 * s2 * c3;\n    this.w = c1 * c2 * c3 + s1 * s2 * s3;\n    return this;\n  },\n  setFromAxisAngle: function setFromAxisAngle(axis, angle) {\n    var halfAngle = angle / 2,\n        s = Math.sin(halfAngle);\n    this.x = axis.x * s;\n    this.y = axis.y * s;\n    this.z = axis.z * s;\n    this.w = Math.cos(halfAngle);\n    return this;\n  },\n  multiply: function multiply(q) {\n    return this.multiplyQuaternions(this, q);\n  },\n  multiplyQuaternions: function multiplyQuaternions(a, b) {\n    var qax = a.x,\n        qay = a.y,\n        qaz = a.z,\n        qaw = a.w;\n    var qbx = b.x,\n        qby = b.y,\n        qbz = b.z,\n        qbw = b.w;\n    this.x = qax * qbw + qaw * qbx + qay * qbz - qaz * qby;\n    this.y = qay * qbw + qaw * qby + qaz * qbx - qax * qbz;\n    this.z = qaz * qbw + qaw * qbz + qax * qby - qay * qbx;\n    this.w = qaw * qbw - qax * qbx - qay * qby - qaz * qbz;\n    return this;\n  },\n  inverse: function inverse() {\n    this.x *= -1;\n    this.y *= -1;\n    this.z *= -1;\n    this.normalize();\n    return this;\n  },\n  normalize: function normalize() {\n    var l = Math.sqrt(this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w);\n    if (l === 0) {\n      this.x = 0;\n      this.y = 0;\n      this.z = 0;\n      this.w = 1;\n    } else {\n      l = 1 / l;\n      this.x = this.x * l;\n      this.y = this.y * l;\n      this.z = this.z * l;\n      this.w = this.w * l;\n    }\n    return this;\n  },\n  slerp: function slerp(qb, t) {\n    if (t === 0) return this;\n    if (t === 1) return this.copy(qb);\n    var x = this.x,\n        y = this.y,\n        z = this.z,\n        w = this.w;\n    var cosHalfTheta = w * qb.w + x * qb.x + y * qb.y + z * qb.z;\n    if (cosHalfTheta < 0) {\n      this.w = -qb.w;\n      this.x = -qb.x;\n      this.y = -qb.y;\n      this.z = -qb.z;\n      cosHalfTheta = -cosHalfTheta;\n    } else {\n      this.copy(qb);\n    }\n    if (cosHalfTheta >= 1.0) {\n      this.w = w;\n      this.x = x;\n      this.y = y;\n      this.z = z;\n      return this;\n    }\n    var halfTheta = Math.acos(cosHalfTheta);\n    var sinHalfTheta = Math.sqrt(1.0 - cosHalfTheta * cosHalfTheta);\n    if (Math.abs(sinHalfTheta) < 0.001) {\n      this.w = 0.5 * (w + this.w);\n      this.x = 0.5 * (x + this.x);\n      this.y = 0.5 * (y + this.y);\n      this.z = 0.5 * (z + this.z);\n      return this;\n    }\n    var ratioA = Math.sin((1 - t) * halfTheta) / sinHalfTheta,\n        ratioB = Math.sin(t * halfTheta) / sinHalfTheta;\n    this.w = w * ratioA + this.w * ratioB;\n    this.x = x * ratioA + this.x * ratioB;\n    this.y = y * ratioA + this.y * ratioB;\n    this.z = z * ratioA + this.z * ratioB;\n    return this;\n  },\n  setFromUnitVectors: function () {\n    var v1, r;\n    var EPS = 0.000001;\n    return function (vFrom, vTo) {\n      if (v1 === undefined) v1 = new Vector3();\n      r = vFrom.dot(vTo) + 1;\n      if (r < EPS) {\n        r = 0;\n        if (Math.abs(vFrom.x) > Math.abs(vFrom.z)) {\n          v1.set(-vFrom.y, vFrom.x, 0);\n        } else {\n          v1.set(0, -vFrom.z, vFrom.y);\n        }\n      } else {\n        v1.crossVectors(vFrom, vTo);\n      }\n      this.x = v1.x;\n      this.y = v1.y;\n      this.z = v1.z;\n      this.w = r;\n      this.normalize();\n      return this;\n    };\n  }()\n};\nfunction Device(params) {\n  this.width = params.width || getScreenWidth();\n  this.height = params.height || getScreenHeight();\n  this.widthMeters = params.widthMeters;\n  this.heightMeters = params.heightMeters;\n  this.bevelMeters = params.bevelMeters;\n}\nvar DEFAULT_ANDROID = new Device({\n  widthMeters: 0.110,\n  heightMeters: 0.062,\n  bevelMeters: 0.004\n});\nvar DEFAULT_IOS = new Device({\n  widthMeters: 0.1038,\n  heightMeters: 0.0584,\n  bevelMeters: 0.004\n});\nvar Viewers = {\n  CardboardV1: new CardboardViewer({\n    id: 'CardboardV1',\n    label: 'Cardboard I/O 2014',\n    fov: 40,\n    interLensDistance: 0.060,\n    baselineLensDistance: 0.035,\n    screenLensDistance: 0.042,\n    distortionCoefficients: [0.441, 0.156],\n    inverseCoefficients: [-0.4410035, 0.42756155, -0.4804439, 0.5460139, -0.58821183, 0.5733938, -0.48303202, 0.33299083, -0.17573841, 0.0651772, -0.01488963, 0.001559834]\n  }),\n  CardboardV2: new CardboardViewer({\n    id: 'CardboardV2',\n    label: 'Cardboard I/O 2015',\n    fov: 60,\n    interLensDistance: 0.064,\n    baselineLensDistance: 0.035,\n    screenLensDistance: 0.039,\n    distortionCoefficients: [0.34, 0.55],\n    inverseCoefficients: [-0.33836704, -0.18162185, 0.862655, -1.2462051, 1.0560602, -0.58208317, 0.21609078, -0.05444823, 0.009177956, -9.904169E-4, 6.183535E-5, -1.6981803E-6]\n  })\n};\nfunction DeviceInfo(deviceParams, additionalViewers) {\n  this.viewer = Viewers.CardboardV2;\n  this.updateDeviceParams(deviceParams);\n  this.distortion = new Distortion(this.viewer.distortionCoefficients);\n  for (var i = 0; i < additionalViewers.length; i++) {\n    var viewer = additionalViewers[i];\n    Viewers[viewer.id] = new CardboardViewer(viewer);\n  }\n}\nDeviceInfo.prototype.updateDeviceParams = function (deviceParams) {\n  this.device = this.determineDevice_(deviceParams) || this.device;\n};\nDeviceInfo.prototype.getDevice = function () {\n  return this.device;\n};\nDeviceInfo.prototype.setViewer = function (viewer) {\n  this.viewer = viewer;\n  this.distortion = new Distortion(this.viewer.distortionCoefficients);\n};\nDeviceInfo.prototype.determineDevice_ = function (deviceParams) {\n  if (!deviceParams) {\n    if (isIOS()) {\n      console.warn('Using fallback iOS device measurements.');\n      return DEFAULT_IOS;\n    } else {\n      console.warn('Using fallback Android device measurements.');\n      return DEFAULT_ANDROID;\n    }\n  }\n  var METERS_PER_INCH = 0.0254;\n  var metersPerPixelX = METERS_PER_INCH / deviceParams.xdpi;\n  var metersPerPixelY = METERS_PER_INCH / deviceParams.ydpi;\n  var width = getScreenWidth();\n  var height = getScreenHeight();\n  return new Device({\n    widthMeters: metersPerPixelX * width,\n    heightMeters: metersPerPixelY * height,\n    bevelMeters: deviceParams.bevelMm * 0.001\n  });\n};\nDeviceInfo.prototype.getDistortedFieldOfViewLeftEye = function () {\n  var viewer = this.viewer;\n  var device = this.device;\n  var distortion = this.distortion;\n  var eyeToScreenDistance = viewer.screenLensDistance;\n  var outerDist = (device.widthMeters - viewer.interLensDistance) / 2;\n  var innerDist = viewer.interLensDistance / 2;\n  var bottomDist = viewer.baselineLensDistance - device.bevelMeters;\n  var topDist = device.heightMeters - bottomDist;\n  var outerAngle = radToDeg * Math.atan(distortion.distort(outerDist / eyeToScreenDistance));\n  var innerAngle = radToDeg * Math.atan(distortion.distort(innerDist / eyeToScreenDistance));\n  var bottomAngle = radToDeg * Math.atan(distortion.distort(bottomDist / eyeToScreenDistance));\n  var topAngle = radToDeg * Math.atan(distortion.distort(topDist / eyeToScreenDistance));\n  return {\n    leftDegrees: Math.min(outerAngle, viewer.fov),\n    rightDegrees: Math.min(innerAngle, viewer.fov),\n    downDegrees: Math.min(bottomAngle, viewer.fov),\n    upDegrees: Math.min(topAngle, viewer.fov)\n  };\n};\nDeviceInfo.prototype.getLeftEyeVisibleTanAngles = function () {\n  var viewer = this.viewer;\n  var device = this.device;\n  var distortion = this.distortion;\n  var fovLeft = Math.tan(-degToRad * viewer.fov);\n  var fovTop = Math.tan(degToRad * viewer.fov);\n  var fovRight = Math.tan(degToRad * viewer.fov);\n  var fovBottom = Math.tan(-degToRad * viewer.fov);\n  var halfWidth = device.widthMeters / 4;\n  var halfHeight = device.heightMeters / 2;\n  var verticalLensOffset = viewer.baselineLensDistance - device.bevelMeters - halfHeight;\n  var centerX = viewer.interLensDistance / 2 - halfWidth;\n  var centerY = -verticalLensOffset;\n  var centerZ = viewer.screenLensDistance;\n  var screenLeft = distortion.distort((centerX - halfWidth) / centerZ);\n  var screenTop = distortion.distort((centerY + halfHeight) / centerZ);\n  var screenRight = distortion.distort((centerX + halfWidth) / centerZ);\n  var screenBottom = distortion.distort((centerY - halfHeight) / centerZ);\n  var result = new Float32Array(4);\n  result[0] = Math.max(fovLeft, screenLeft);\n  result[1] = Math.min(fovTop, screenTop);\n  result[2] = Math.min(fovRight, screenRight);\n  result[3] = Math.max(fovBottom, screenBottom);\n  return result;\n};\nDeviceInfo.prototype.getLeftEyeNoLensTanAngles = function () {\n  var viewer = this.viewer;\n  var device = this.device;\n  var distortion = this.distortion;\n  var result = new Float32Array(4);\n  var fovLeft = distortion.distortInverse(Math.tan(-degToRad * viewer.fov));\n  var fovTop = distortion.distortInverse(Math.tan(degToRad * viewer.fov));\n  var fovRight = distortion.distortInverse(Math.tan(degToRad * viewer.fov));\n  var fovBottom = distortion.distortInverse(Math.tan(-degToRad * viewer.fov));\n  var halfWidth = device.widthMeters / 4;\n  var halfHeight = device.heightMeters / 2;\n  var verticalLensOffset = viewer.baselineLensDistance - device.bevelMeters - halfHeight;\n  var centerX = viewer.interLensDistance / 2 - halfWidth;\n  var centerY = -verticalLensOffset;\n  var centerZ = viewer.screenLensDistance;\n  var screenLeft = (centerX - halfWidth) / centerZ;\n  var screenTop = (centerY + halfHeight) / centerZ;\n  var screenRight = (centerX + halfWidth) / centerZ;\n  var screenBottom = (centerY - halfHeight) / centerZ;\n  result[0] = Math.max(fovLeft, screenLeft);\n  result[1] = Math.min(fovTop, screenTop);\n  result[2] = Math.min(fovRight, screenRight);\n  result[3] = Math.max(fovBottom, screenBottom);\n  return result;\n};\nDeviceInfo.prototype.getLeftEyeVisibleScreenRect = function (undistortedFrustum) {\n  var viewer = this.viewer;\n  var device = this.device;\n  var dist = viewer.screenLensDistance;\n  var eyeX = (device.widthMeters - viewer.interLensDistance) / 2;\n  var eyeY = viewer.baselineLensDistance - device.bevelMeters;\n  var left = (undistortedFrustum[0] * dist + eyeX) / device.widthMeters;\n  var top = (undistortedFrustum[1] * dist + eyeY) / device.heightMeters;\n  var right = (undistortedFrustum[2] * dist + eyeX) / device.widthMeters;\n  var bottom = (undistortedFrustum[3] * dist + eyeY) / device.heightMeters;\n  return {\n    x: left,\n    y: bottom,\n    width: right - left,\n    height: top - bottom\n  };\n};\nDeviceInfo.prototype.getFieldOfViewLeftEye = function (opt_isUndistorted) {\n  return opt_isUndistorted ? this.getUndistortedFieldOfViewLeftEye() : this.getDistortedFieldOfViewLeftEye();\n};\nDeviceInfo.prototype.getFieldOfViewRightEye = function (opt_isUndistorted) {\n  var fov = this.getFieldOfViewLeftEye(opt_isUndistorted);\n  return {\n    leftDegrees: fov.rightDegrees,\n    rightDegrees: fov.leftDegrees,\n    upDegrees: fov.upDegrees,\n    downDegrees: fov.downDegrees\n  };\n};\nDeviceInfo.prototype.getUndistortedFieldOfViewLeftEye = function () {\n  var p = this.getUndistortedParams_();\n  return {\n    leftDegrees: radToDeg * Math.atan(p.outerDist),\n    rightDegrees: radToDeg * Math.atan(p.innerDist),\n    downDegrees: radToDeg * Math.atan(p.bottomDist),\n    upDegrees: radToDeg * Math.atan(p.topDist)\n  };\n};\nDeviceInfo.prototype.getUndistortedViewportLeftEye = function () {\n  var p = this.getUndistortedParams_();\n  var viewer = this.viewer;\n  var device = this.device;\n  var eyeToScreenDistance = viewer.screenLensDistance;\n  var screenWidth = device.widthMeters / eyeToScreenDistance;\n  var screenHeight = device.heightMeters / eyeToScreenDistance;\n  var xPxPerTanAngle = device.width / screenWidth;\n  var yPxPerTanAngle = device.height / screenHeight;\n  var x = Math.round((p.eyePosX - p.outerDist) * xPxPerTanAngle);\n  var y = Math.round((p.eyePosY - p.bottomDist) * yPxPerTanAngle);\n  return {\n    x: x,\n    y: y,\n    width: Math.round((p.eyePosX + p.innerDist) * xPxPerTanAngle) - x,\n    height: Math.round((p.eyePosY + p.topDist) * yPxPerTanAngle) - y\n  };\n};\nDeviceInfo.prototype.getUndistortedParams_ = function () {\n  var viewer = this.viewer;\n  var device = this.device;\n  var distortion = this.distortion;\n  var eyeToScreenDistance = viewer.screenLensDistance;\n  var halfLensDistance = viewer.interLensDistance / 2 / eyeToScreenDistance;\n  var screenWidth = device.widthMeters / eyeToScreenDistance;\n  var screenHeight = device.heightMeters / eyeToScreenDistance;\n  var eyePosX = screenWidth / 2 - halfLensDistance;\n  var eyePosY = (viewer.baselineLensDistance - device.bevelMeters) / eyeToScreenDistance;\n  var maxFov = viewer.fov;\n  var viewerMax = distortion.distortInverse(Math.tan(degToRad * maxFov));\n  var outerDist = Math.min(eyePosX, viewerMax);\n  var innerDist = Math.min(halfLensDistance, viewerMax);\n  var bottomDist = Math.min(eyePosY, viewerMax);\n  var topDist = Math.min(screenHeight - eyePosY, viewerMax);\n  return {\n    outerDist: outerDist,\n    innerDist: innerDist,\n    topDist: topDist,\n    bottomDist: bottomDist,\n    eyePosX: eyePosX,\n    eyePosY: eyePosY\n  };\n};\nfunction CardboardViewer(params) {\n  this.id = params.id;\n  this.label = params.label;\n  this.fov = params.fov;\n  this.interLensDistance = params.interLensDistance;\n  this.baselineLensDistance = params.baselineLensDistance;\n  this.screenLensDistance = params.screenLensDistance;\n  this.distortionCoefficients = params.distortionCoefficients;\n  this.inverseCoefficients = params.inverseCoefficients;\n}\nDeviceInfo.Viewers = Viewers;\nvar format = 1;\nvar last_updated = \"2019-11-09T17:36:14Z\";\nvar devices = [{\"type\":\"android\",\"rules\":[{\"mdmh\":\"asus/*/Nexus 7/*\"},{\"ua\":\"Nexus 7\"}],\"dpi\":[320.8,323],\"bw\":3,\"ac\":500},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"asus/*/ASUS_X00PD/*\"},{\"ua\":\"ASUS_X00PD\"}],\"dpi\":245,\"bw\":3,\"ac\":500},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"asus/*/ASUS_X008D/*\"},{\"ua\":\"ASUS_X008D\"}],\"dpi\":282,\"bw\":3,\"ac\":500},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"asus/*/ASUS_Z00AD/*\"},{\"ua\":\"ASUS_Z00AD\"}],\"dpi\":[403,404.6],\"bw\":3,\"ac\":1000},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"Google/*/Pixel 2 XL/*\"},{\"ua\":\"Pixel 2 XL\"}],\"dpi\":537.9,\"bw\":3,\"ac\":1000},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"Google/*/Pixel 3 XL/*\"},{\"ua\":\"Pixel 3 XL\"}],\"dpi\":[558.5,553.8],\"bw\":3,\"ac\":1000},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"Google/*/Pixel XL/*\"},{\"ua\":\"Pixel XL\"}],\"dpi\":[537.9,533],\"bw\":3,\"ac\":1000},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"Google/*/Pixel 3/*\"},{\"ua\":\"Pixel 3\"}],\"dpi\":442.4,\"bw\":3,\"ac\":1000},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"Google/*/Pixel 2/*\"},{\"ua\":\"Pixel 2\"}],\"dpi\":441,\"bw\":3,\"ac\":500},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"Google/*/Pixel/*\"},{\"ua\":\"Pixel\"}],\"dpi\":[432.6,436.7],\"bw\":3,\"ac\":1000},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"HTC/*/HTC6435LVW/*\"},{\"ua\":\"HTC6435LVW\"}],\"dpi\":[449.7,443.3],\"bw\":3,\"ac\":1000},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"HTC/*/HTC One XL/*\"},{\"ua\":\"HTC One XL\"}],\"dpi\":[315.3,314.6],\"bw\":3,\"ac\":1000},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"htc/*/Nexus 9/*\"},{\"ua\":\"Nexus 9\"}],\"dpi\":289,\"bw\":3,\"ac\":500},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"HTC/*/HTC One M9/*\"},{\"ua\":\"HTC One M9\"}],\"dpi\":[442.5,443.3],\"bw\":3,\"ac\":500},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"HTC/*/HTC One_M8/*\"},{\"ua\":\"HTC One_M8\"}],\"dpi\":[449.7,447.4],\"bw\":3,\"ac\":500},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"HTC/*/HTC One/*\"},{\"ua\":\"HTC One\"}],\"dpi\":472.8,\"bw\":3,\"ac\":1000},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"Huawei/*/Nexus 6P/*\"},{\"ua\":\"Nexus 6P\"}],\"dpi\":[515.1,518],\"bw\":3,\"ac\":1000},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"Huawei/*/BLN-L24/*\"},{\"ua\":\"HONORBLN-L24\"}],\"dpi\":480,\"bw\":4,\"ac\":500},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"Huawei/*/BKL-L09/*\"},{\"ua\":\"BKL-L09\"}],\"dpi\":403,\"bw\":3.47,\"ac\":500},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"LENOVO/*/Lenovo PB2-690Y/*\"},{\"ua\":\"Lenovo PB2-690Y\"}],\"dpi\":[457.2,454.713],\"bw\":3,\"ac\":500},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"LGE/*/Nexus 5X/*\"},{\"ua\":\"Nexus 5X\"}],\"dpi\":[422,419.9],\"bw\":3,\"ac\":1000},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"LGE/*/LGMS345/*\"},{\"ua\":\"LGMS345\"}],\"dpi\":[221.7,219.1],\"bw\":3,\"ac\":500},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"LGE/*/LG-D800/*\"},{\"ua\":\"LG-D800\"}],\"dpi\":[422,424.1],\"bw\":3,\"ac\":500},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"LGE/*/LG-D850/*\"},{\"ua\":\"LG-D850\"}],\"dpi\":[537.9,541.9],\"bw\":3,\"ac\":500},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"LGE/*/VS985 4G/*\"},{\"ua\":\"VS985 4G\"}],\"dpi\":[537.9,535.6],\"bw\":3,\"ac\":1000},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"LGE/*/Nexus 5/*\"},{\"ua\":\"Nexus 5 B\"}],\"dpi\":[442.4,444.8],\"bw\":3,\"ac\":1000},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"LGE/*/Nexus 4/*\"},{\"ua\":\"Nexus 4\"}],\"dpi\":[319.8,318.4],\"bw\":3,\"ac\":1000},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"LGE/*/LG-P769/*\"},{\"ua\":\"LG-P769\"}],\"dpi\":[240.6,247.5],\"bw\":3,\"ac\":1000},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"LGE/*/LGMS323/*\"},{\"ua\":\"LGMS323\"}],\"dpi\":[206.6,204.6],\"bw\":3,\"ac\":1000},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"LGE/*/LGLS996/*\"},{\"ua\":\"LGLS996\"}],\"dpi\":[403.4,401.5],\"bw\":3,\"ac\":1000},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"Micromax/*/4560MMX/*\"},{\"ua\":\"4560MMX\"}],\"dpi\":[240,219.4],\"bw\":3,\"ac\":1000},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"Micromax/*/A250/*\"},{\"ua\":\"Micromax A250\"}],\"dpi\":[480,446.4],\"bw\":3,\"ac\":1000},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"Micromax/*/Micromax AQ4501/*\"},{\"ua\":\"Micromax AQ4501\"}],\"dpi\":240,\"bw\":3,\"ac\":500},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"motorola/*/G5/*\"},{\"ua\":\"Moto G (5) Plus\"}],\"dpi\":[403.4,403],\"bw\":3,\"ac\":1000},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"motorola/*/DROID RAZR/*\"},{\"ua\":\"DROID RAZR\"}],\"dpi\":[368.1,256.7],\"bw\":3,\"ac\":1000},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"motorola/*/XT830C/*\"},{\"ua\":\"XT830C\"}],\"dpi\":[254,255.9],\"bw\":3,\"ac\":1000},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"motorola/*/XT1021/*\"},{\"ua\":\"XT1021\"}],\"dpi\":[254,256.7],\"bw\":3,\"ac\":500},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"motorola/*/XT1023/*\"},{\"ua\":\"XT1023\"}],\"dpi\":[254,256.7],\"bw\":3,\"ac\":500},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"motorola/*/XT1028/*\"},{\"ua\":\"XT1028\"}],\"dpi\":[326.6,327.6],\"bw\":3,\"ac\":1000},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"motorola/*/XT1034/*\"},{\"ua\":\"XT1034\"}],\"dpi\":[326.6,328.4],\"bw\":3,\"ac\":500},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"motorola/*/XT1053/*\"},{\"ua\":\"XT1053\"}],\"dpi\":[315.3,316.1],\"bw\":3,\"ac\":1000},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"motorola/*/XT1562/*\"},{\"ua\":\"XT1562\"}],\"dpi\":[403.4,402.7],\"bw\":3,\"ac\":1000},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"motorola/*/Nexus 6/*\"},{\"ua\":\"Nexus 6 B\"}],\"dpi\":[494.3,489.7],\"bw\":3,\"ac\":1000},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"motorola/*/XT1063/*\"},{\"ua\":\"XT1063\"}],\"dpi\":[295,296.6],\"bw\":3,\"ac\":1000},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"motorola/*/XT1064/*\"},{\"ua\":\"XT1064\"}],\"dpi\":[295,295.6],\"bw\":3,\"ac\":500},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"motorola/*/XT1092/*\"},{\"ua\":\"XT1092\"}],\"dpi\":[422,424.1],\"bw\":3,\"ac\":500},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"motorola/*/XT1095/*\"},{\"ua\":\"XT1095\"}],\"dpi\":[422,423.4],\"bw\":3,\"ac\":1000},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"motorola/*/G4/*\"},{\"ua\":\"Moto G (4)\"}],\"dpi\":401,\"bw\":4,\"ac\":1000},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"OnePlus/*/A0001/*\"},{\"ua\":\"A0001\"}],\"dpi\":[403.4,401],\"bw\":3,\"ac\":1000},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"OnePlus/*/ONE E1001/*\"},{\"ua\":\"ONE E1001\"}],\"dpi\":[442.4,441.4],\"bw\":3,\"ac\":1000},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"OnePlus/*/ONE E1003/*\"},{\"ua\":\"ONE E1003\"}],\"dpi\":[442.4,441.4],\"bw\":3,\"ac\":1000},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"OnePlus/*/ONE E1005/*\"},{\"ua\":\"ONE E1005\"}],\"dpi\":[442.4,441.4],\"bw\":3,\"ac\":1000},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"OnePlus/*/ONE A2001/*\"},{\"ua\":\"ONE A2001\"}],\"dpi\":[391.9,405.4],\"bw\":3,\"ac\":1000},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"OnePlus/*/ONE A2003/*\"},{\"ua\":\"ONE A2003\"}],\"dpi\":[391.9,405.4],\"bw\":3,\"ac\":1000},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"OnePlus/*/ONE A2005/*\"},{\"ua\":\"ONE A2005\"}],\"dpi\":[391.9,405.4],\"bw\":3,\"ac\":1000},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"OnePlus/*/ONEPLUS A3000/*\"},{\"ua\":\"ONEPLUS A3000\"}],\"dpi\":401,\"bw\":3,\"ac\":500},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"OnePlus/*/ONEPLUS A3003/*\"},{\"ua\":\"ONEPLUS A3003\"}],\"dpi\":401,\"bw\":3,\"ac\":500},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"OnePlus/*/ONEPLUS A3010/*\"},{\"ua\":\"ONEPLUS A3010\"}],\"dpi\":401,\"bw\":3,\"ac\":500},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"OnePlus/*/ONEPLUS A5000/*\"},{\"ua\":\"ONEPLUS A5000 \"}],\"dpi\":[403.411,399.737],\"bw\":3,\"ac\":1000},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"OnePlus/*/ONE A5010/*\"},{\"ua\":\"ONEPLUS A5010\"}],\"dpi\":[403,400],\"bw\":2,\"ac\":1000},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"OnePlus/*/ONEPLUS A6000/*\"},{\"ua\":\"ONEPLUS A6000\"}],\"dpi\":401,\"bw\":3,\"ac\":500},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"OnePlus/*/ONEPLUS A6003/*\"},{\"ua\":\"ONEPLUS A6003\"}],\"dpi\":401,\"bw\":3,\"ac\":500},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"OnePlus/*/ONEPLUS A6010/*\"},{\"ua\":\"ONEPLUS A6010\"}],\"dpi\":401,\"bw\":2,\"ac\":500},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"OnePlus/*/ONEPLUS A6013/*\"},{\"ua\":\"ONEPLUS A6013\"}],\"dpi\":401,\"bw\":2,\"ac\":500},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"OPPO/*/X909/*\"},{\"ua\":\"X909\"}],\"dpi\":[442.4,444.1],\"bw\":3,\"ac\":1000},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"samsung/*/GT-I9082/*\"},{\"ua\":\"GT-I9082\"}],\"dpi\":[184.7,185.4],\"bw\":3,\"ac\":1000},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"samsung/*/SM-G360P/*\"},{\"ua\":\"SM-G360P\"}],\"dpi\":[196.7,205.4],\"bw\":3,\"ac\":1000},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"samsung/*/Nexus S/*\"},{\"ua\":\"Nexus S\"}],\"dpi\":[234.5,229.8],\"bw\":3,\"ac\":1000},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"samsung/*/GT-I9300/*\"},{\"ua\":\"GT-I9300\"}],\"dpi\":[304.8,303.9],\"bw\":5,\"ac\":500},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"samsung/*/SM-T230NU/*\"},{\"ua\":\"SM-T230NU\"}],\"dpi\":216,\"bw\":3,\"ac\":500},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"samsung/*/SGH-T399/*\"},{\"ua\":\"SGH-T399\"}],\"dpi\":[217.7,231.4],\"bw\":3,\"ac\":1000},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"samsung/*/SGH-M919/*\"},{\"ua\":\"SGH-M919\"}],\"dpi\":[440.8,437.7],\"bw\":3,\"ac\":1000},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"samsung/*/SM-N9005/*\"},{\"ua\":\"SM-N9005\"}],\"dpi\":[386.4,387],\"bw\":3,\"ac\":500},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"samsung/*/SAMSUNG-SM-N900A/*\"},{\"ua\":\"SAMSUNG-SM-N900A\"}],\"dpi\":[386.4,387.7],\"bw\":3,\"ac\":1000},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"samsung/*/GT-I9500/*\"},{\"ua\":\"GT-I9500\"}],\"dpi\":[442.5,443.3],\"bw\":3,\"ac\":500},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"samsung/*/GT-I9505/*\"},{\"ua\":\"GT-I9505\"}],\"dpi\":439.4,\"bw\":4,\"ac\":1000},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"samsung/*/SM-G900F/*\"},{\"ua\":\"SM-G900F\"}],\"dpi\":[415.6,431.6],\"bw\":5,\"ac\":1000},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"samsung/*/SM-G900M/*\"},{\"ua\":\"SM-G900M\"}],\"dpi\":[415.6,431.6],\"bw\":5,\"ac\":1000},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"samsung/*/SM-G800F/*\"},{\"ua\":\"SM-G800F\"}],\"dpi\":326.8,\"bw\":3,\"ac\":1000},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"samsung/*/SM-G906S/*\"},{\"ua\":\"SM-G906S\"}],\"dpi\":[562.7,572.4],\"bw\":3,\"ac\":1000},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"samsung/*/GT-I9300/*\"},{\"ua\":\"GT-I9300\"}],\"dpi\":[306.7,304.8],\"bw\":5,\"ac\":1000},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"samsung/*/SM-T535/*\"},{\"ua\":\"SM-T535\"}],\"dpi\":[142.6,136.4],\"bw\":3,\"ac\":500},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"samsung/*/SM-N920C/*\"},{\"ua\":\"SM-N920C\"}],\"dpi\":[515.1,518.4],\"bw\":3,\"ac\":1000},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"samsung/*/SM-N920P/*\"},{\"ua\":\"SM-N920P\"}],\"dpi\":[386.3655,390.144],\"bw\":3,\"ac\":1000},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"samsung/*/SM-N920W8/*\"},{\"ua\":\"SM-N920W8\"}],\"dpi\":[515.1,518.4],\"bw\":3,\"ac\":1000},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"samsung/*/GT-I9300I/*\"},{\"ua\":\"GT-I9300I\"}],\"dpi\":[304.8,305.8],\"bw\":3,\"ac\":1000},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"samsung/*/GT-I9195/*\"},{\"ua\":\"GT-I9195\"}],\"dpi\":[249.4,256.7],\"bw\":3,\"ac\":500},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"samsung/*/SPH-L520/*\"},{\"ua\":\"SPH-L520\"}],\"dpi\":[249.4,255.9],\"bw\":3,\"ac\":1000},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"samsung/*/SAMSUNG-SGH-I717/*\"},{\"ua\":\"SAMSUNG-SGH-I717\"}],\"dpi\":285.8,\"bw\":3,\"ac\":1000},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"samsung/*/SPH-D710/*\"},{\"ua\":\"SPH-D710\"}],\"dpi\":[217.7,204.2],\"bw\":3,\"ac\":1000},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"samsung/*/GT-N7100/*\"},{\"ua\":\"GT-N7100\"}],\"dpi\":265.1,\"bw\":3,\"ac\":1000},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"samsung/*/SCH-I605/*\"},{\"ua\":\"SCH-I605\"}],\"dpi\":265.1,\"bw\":3,\"ac\":1000},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"samsung/*/Galaxy Nexus/*\"},{\"ua\":\"Galaxy Nexus\"}],\"dpi\":[315.3,314.2],\"bw\":3,\"ac\":1000},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"samsung/*/SM-N910H/*\"},{\"ua\":\"SM-N910H\"}],\"dpi\":[515.1,518],\"bw\":3,\"ac\":1000},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"samsung/*/SM-N910C/*\"},{\"ua\":\"SM-N910C\"}],\"dpi\":[515.2,520.2],\"bw\":3,\"ac\":500},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"samsung/*/SM-G130M/*\"},{\"ua\":\"SM-G130M\"}],\"dpi\":[165.9,164.8],\"bw\":3,\"ac\":500},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"samsung/*/SM-G928I/*\"},{\"ua\":\"SM-G928I\"}],\"dpi\":[515.1,518.4],\"bw\":3,\"ac\":1000},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"samsung/*/SM-G920F/*\"},{\"ua\":\"SM-G920F\"}],\"dpi\":580.6,\"bw\":3,\"ac\":500},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"samsung/*/SM-G920P/*\"},{\"ua\":\"SM-G920P\"}],\"dpi\":[522.5,577],\"bw\":3,\"ac\":1000},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"samsung/*/SM-G925F/*\"},{\"ua\":\"SM-G925F\"}],\"dpi\":580.6,\"bw\":3,\"ac\":500},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"samsung/*/SM-G925V/*\"},{\"ua\":\"SM-G925V\"}],\"dpi\":[522.5,576.6],\"bw\":3,\"ac\":1000},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"samsung/*/SM-G930F/*\"},{\"ua\":\"SM-G930F\"}],\"dpi\":576.6,\"bw\":3,\"ac\":1000},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"samsung/*/SM-G935F/*\"},{\"ua\":\"SM-G935F\"}],\"dpi\":533,\"bw\":3,\"ac\":500},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"samsung/*/SM-G950F/*\"},{\"ua\":\"SM-G950F\"}],\"dpi\":[562.707,565.293],\"bw\":3,\"ac\":500},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"samsung/*/SM-G955U/*\"},{\"ua\":\"SM-G955U\"}],\"dpi\":[522.514,525.762],\"bw\":3,\"ac\":500},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"samsung/*/SM-G955F/*\"},{\"ua\":\"SM-G955F\"}],\"dpi\":[522.514,525.762],\"bw\":3,\"ac\":500},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"samsung/*/SM-G960F/*\"},{\"ua\":\"SM-G960F\"}],\"dpi\":[569.575,571.5],\"bw\":3,\"ac\":1000},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"samsung/*/SM-G9600/*\"},{\"ua\":\"SM-G9600\"}],\"dpi\":[569.575,571.5],\"bw\":3,\"ac\":1000},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"samsung/*/SM-G960T/*\"},{\"ua\":\"SM-G960T\"}],\"dpi\":[569.575,571.5],\"bw\":3,\"ac\":1000},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"samsung/*/SM-G960N/*\"},{\"ua\":\"SM-G960N\"}],\"dpi\":[569.575,571.5],\"bw\":3,\"ac\":1000},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"samsung/*/SM-G960U/*\"},{\"ua\":\"SM-G960U\"}],\"dpi\":[569.575,571.5],\"bw\":3,\"ac\":1000},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"samsung/*/SM-G9608/*\"},{\"ua\":\"SM-G9608\"}],\"dpi\":[569.575,571.5],\"bw\":3,\"ac\":1000},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"samsung/*/SM-G960FD/*\"},{\"ua\":\"SM-G960FD\"}],\"dpi\":[569.575,571.5],\"bw\":3,\"ac\":1000},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"samsung/*/SM-G960W/*\"},{\"ua\":\"SM-G960W\"}],\"dpi\":[569.575,571.5],\"bw\":3,\"ac\":1000},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"samsung/*/SM-G965F/*\"},{\"ua\":\"SM-G965F\"}],\"dpi\":529,\"bw\":2,\"ac\":1000},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"Sony/*/C6903/*\"},{\"ua\":\"C6903\"}],\"dpi\":[442.5,443.3],\"bw\":3,\"ac\":500},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"Sony/*/D6653/*\"},{\"ua\":\"D6653\"}],\"dpi\":[428.6,427.6],\"bw\":3,\"ac\":1000},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"Sony/*/E6653/*\"},{\"ua\":\"E6653\"}],\"dpi\":[428.6,425.7],\"bw\":3,\"ac\":1000},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"Sony/*/E6853/*\"},{\"ua\":\"E6853\"}],\"dpi\":[403.4,401.9],\"bw\":3,\"ac\":1000},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"Sony/*/SGP321/*\"},{\"ua\":\"SGP321\"}],\"dpi\":[224.7,224.1],\"bw\":3,\"ac\":500},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"TCT/*/ALCATEL ONE TOUCH Fierce/*\"},{\"ua\":\"ALCATEL ONE TOUCH Fierce\"}],\"dpi\":[240,247.5],\"bw\":3,\"ac\":1000},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"THL/*/thl 5000/*\"},{\"ua\":\"thl 5000\"}],\"dpi\":[480,443.3],\"bw\":3,\"ac\":1000},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"Fly/*/IQ4412/*\"},{\"ua\":\"IQ4412\"}],\"dpi\":307.9,\"bw\":3,\"ac\":1000},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"ZTE/*/ZTE Blade L2/*\"},{\"ua\":\"ZTE Blade L2\"}],\"dpi\":240,\"bw\":3,\"ac\":500},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"BENEVE/*/VR518/*\"},{\"ua\":\"VR518\"}],\"dpi\":480,\"bw\":3,\"ac\":500},{\"type\":\"ios\",\"rules\":[{\"res\":[640,960]}],\"dpi\":[325.1,328.4],\"bw\":4,\"ac\":1000},{\"type\":\"ios\",\"rules\":[{\"res\":[640,1136]}],\"dpi\":[317.1,320.2],\"bw\":3,\"ac\":1000},{\"type\":\"ios\",\"rules\":[{\"res\":[750,1334]}],\"dpi\":326.4,\"bw\":4,\"ac\":1000},{\"type\":\"ios\",\"rules\":[{\"res\":[1242,2208]}],\"dpi\":[453.6,458.4],\"bw\":4,\"ac\":1000},{\"type\":\"ios\",\"rules\":[{\"res\":[1125,2001]}],\"dpi\":[410.9,415.4],\"bw\":4,\"ac\":1000},{\"type\":\"ios\",\"rules\":[{\"res\":[1125,2436]}],\"dpi\":458,\"bw\":4,\"ac\":1000},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"Huawei/*/EML-L29/*\"},{\"ua\":\"EML-L29\"}],\"dpi\":428,\"bw\":3.45,\"ac\":500},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"Nokia/*/Nokia 7.1/*\"},{\"ua\":\"Nokia 7.1\"}],\"dpi\":[432,431.9],\"bw\":3,\"ac\":500},{\"type\":\"ios\",\"rules\":[{\"res\":[1242,2688]}],\"dpi\":458,\"bw\":4,\"ac\":1000},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"samsung/*/SM-G570M/*\"},{\"ua\":\"SM-G570M\"}],\"dpi\":320,\"bw\":3.684,\"ac\":1000},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"samsung/*/SM-G970F/*\"},{\"ua\":\"SM-G970F\"}],\"dpi\":438,\"bw\":2.281,\"ac\":500},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"samsung/*/SM-G973F/*\"},{\"ua\":\"SM-G973F\"}],\"dpi\":550,\"bw\":2.002,\"ac\":500},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"samsung/*/SM-G975F/*\"},{\"ua\":\"SM-G975F\"}],\"dpi\":522,\"bw\":2.054,\"ac\":500},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"samsung/*/SM-G977F/*\"},{\"ua\":\"SM-G977F\"}],\"dpi\":505,\"bw\":2.334,\"ac\":500},{\"type\":\"ios\",\"rules\":[{\"res\":[828,1792]}],\"dpi\":326,\"bw\":5,\"ac\":500}];\nvar DPDB_CACHE = {\n\tformat: format,\n\tlast_updated: last_updated,\n\tdevices: devices\n};\nfunction Dpdb(url, onDeviceParamsUpdated) {\n  this.dpdb = DPDB_CACHE;\n  this.recalculateDeviceParams_();\n  if (url) {\n    this.onDeviceParamsUpdated = onDeviceParamsUpdated;\n    var xhr = new XMLHttpRequest();\n    var obj = this;\n    xhr.open('GET', url, true);\n    xhr.addEventListener('load', function () {\n      obj.loading = false;\n      if (xhr.status >= 200 && xhr.status <= 299) {\n        obj.dpdb = JSON.parse(xhr.response);\n        obj.recalculateDeviceParams_();\n      } else {\n        console.error('Error loading online DPDB!');\n      }\n    });\n    xhr.send();\n  }\n}\nDpdb.prototype.getDeviceParams = function () {\n  return this.deviceParams;\n};\nDpdb.prototype.recalculateDeviceParams_ = function () {\n  var newDeviceParams = this.calcDeviceParams_();\n  if (newDeviceParams) {\n    this.deviceParams = newDeviceParams;\n    if (this.onDeviceParamsUpdated) {\n      this.onDeviceParamsUpdated(this.deviceParams);\n    }\n  } else {\n    console.error('Failed to recalculate device parameters.');\n  }\n};\nDpdb.prototype.calcDeviceParams_ = function () {\n  var db = this.dpdb;\n  if (!db) {\n    console.error('DPDB not available.');\n    return null;\n  }\n  if (db.format != 1) {\n    console.error('DPDB has unexpected format version.');\n    return null;\n  }\n  if (!db.devices || !db.devices.length) {\n    console.error('DPDB does not have a devices section.');\n    return null;\n  }\n  var userAgent = navigator.userAgent || navigator.vendor || window.opera;\n  var width = getScreenWidth();\n  var height = getScreenHeight();\n  if (!db.devices) {\n    console.error('DPDB has no devices section.');\n    return null;\n  }\n  for (var i = 0; i < db.devices.length; i++) {\n    var device = db.devices[i];\n    if (!device.rules) {\n      console.warn('Device[' + i + '] has no rules section.');\n      continue;\n    }\n    if (device.type != 'ios' && device.type != 'android') {\n      console.warn('Device[' + i + '] has invalid type.');\n      continue;\n    }\n    if (isIOS() != (device.type == 'ios')) continue;\n    var matched = false;\n    for (var j = 0; j < device.rules.length; j++) {\n      var rule = device.rules[j];\n      if (this.ruleMatches_(rule, userAgent, width, height)) {\n        matched = true;\n        break;\n      }\n    }\n    if (!matched) continue;\n    var xdpi = device.dpi[0] || device.dpi;\n    var ydpi = device.dpi[1] || device.dpi;\n    return new DeviceParams({ xdpi: xdpi, ydpi: ydpi, bevelMm: device.bw });\n  }\n  console.warn('No DPDB device match.');\n  return null;\n};\nDpdb.prototype.ruleMatches_ = function (rule, ua, screenWidth, screenHeight) {\n  if (!rule.ua && !rule.res) return false;\n  if (rule.ua && rule.ua.substring(0, 2) === 'SM') rule.ua = rule.ua.substring(0, 7);\n  if (rule.ua && ua.indexOf(rule.ua) < 0) return false;\n  if (rule.res) {\n    if (!rule.res[0] || !rule.res[1]) return false;\n    var resX = rule.res[0];\n    var resY = rule.res[1];\n    if (Math.min(screenWidth, screenHeight) != Math.min(resX, resY) || Math.max(screenWidth, screenHeight) != Math.max(resX, resY)) {\n      return false;\n    }\n  }\n  return true;\n};\nfunction DeviceParams(params) {\n  this.xdpi = params.xdpi;\n  this.ydpi = params.ydpi;\n  this.bevelMm = params.bevelMm;\n}\nfunction SensorSample(sample, timestampS) {\n  this.set(sample, timestampS);\n}\nSensorSample.prototype.set = function (sample, timestampS) {\n  this.sample = sample;\n  this.timestampS = timestampS;\n};\nSensorSample.prototype.copy = function (sensorSample) {\n  this.set(sensorSample.sample, sensorSample.timestampS);\n};\nfunction ComplementaryFilter(kFilter, isDebug) {\n  this.kFilter = kFilter;\n  this.isDebug = isDebug;\n  this.currentAccelMeasurement = new SensorSample();\n  this.currentGyroMeasurement = new SensorSample();\n  this.previousGyroMeasurement = new SensorSample();\n  if (isIOS()) {\n    this.filterQ = new Quaternion(-1, 0, 0, 1);\n  } else {\n    this.filterQ = new Quaternion(1, 0, 0, 1);\n  }\n  this.previousFilterQ = new Quaternion();\n  this.previousFilterQ.copy(this.filterQ);\n  this.accelQ = new Quaternion();\n  this.isOrientationInitialized = false;\n  this.estimatedGravity = new Vector3();\n  this.measuredGravity = new Vector3();\n  this.gyroIntegralQ = new Quaternion();\n}\nComplementaryFilter.prototype.addAccelMeasurement = function (vector, timestampS) {\n  this.currentAccelMeasurement.set(vector, timestampS);\n};\nComplementaryFilter.prototype.addGyroMeasurement = function (vector, timestampS) {\n  this.currentGyroMeasurement.set(vector, timestampS);\n  var deltaT = timestampS - this.previousGyroMeasurement.timestampS;\n  if (isTimestampDeltaValid(deltaT)) {\n    this.run_();\n  }\n  this.previousGyroMeasurement.copy(this.currentGyroMeasurement);\n};\nComplementaryFilter.prototype.run_ = function () {\n  if (!this.isOrientationInitialized) {\n    this.accelQ = this.accelToQuaternion_(this.currentAccelMeasurement.sample);\n    this.previousFilterQ.copy(this.accelQ);\n    this.isOrientationInitialized = true;\n    return;\n  }\n  var deltaT = this.currentGyroMeasurement.timestampS - this.previousGyroMeasurement.timestampS;\n  var gyroDeltaQ = this.gyroToQuaternionDelta_(this.currentGyroMeasurement.sample, deltaT);\n  this.gyroIntegralQ.multiply(gyroDeltaQ);\n  this.filterQ.copy(this.previousFilterQ);\n  this.filterQ.multiply(gyroDeltaQ);\n  var invFilterQ = new Quaternion();\n  invFilterQ.copy(this.filterQ);\n  invFilterQ.inverse();\n  this.estimatedGravity.set(0, 0, -1);\n  this.estimatedGravity.applyQuaternion(invFilterQ);\n  this.estimatedGravity.normalize();\n  this.measuredGravity.copy(this.currentAccelMeasurement.sample);\n  this.measuredGravity.normalize();\n  var deltaQ = new Quaternion();\n  deltaQ.setFromUnitVectors(this.estimatedGravity, this.measuredGravity);\n  deltaQ.inverse();\n  if (this.isDebug) {\n    console.log('Delta: %d deg, G_est: (%s, %s, %s), G_meas: (%s, %s, %s)', radToDeg * getQuaternionAngle(deltaQ), this.estimatedGravity.x.toFixed(1), this.estimatedGravity.y.toFixed(1), this.estimatedGravity.z.toFixed(1), this.measuredGravity.x.toFixed(1), this.measuredGravity.y.toFixed(1), this.measuredGravity.z.toFixed(1));\n  }\n  var targetQ = new Quaternion();\n  targetQ.copy(this.filterQ);\n  targetQ.multiply(deltaQ);\n  this.filterQ.slerp(targetQ, 1 - this.kFilter);\n  this.previousFilterQ.copy(this.filterQ);\n};\nComplementaryFilter.prototype.getOrientation = function () {\n  return this.filterQ;\n};\nComplementaryFilter.prototype.accelToQuaternion_ = function (accel) {\n  var normAccel = new Vector3();\n  normAccel.copy(accel);\n  normAccel.normalize();\n  var quat = new Quaternion();\n  quat.setFromUnitVectors(new Vector3(0, 0, -1), normAccel);\n  quat.inverse();\n  return quat;\n};\nComplementaryFilter.prototype.gyroToQuaternionDelta_ = function (gyro, dt) {\n  var quat = new Quaternion();\n  var axis = new Vector3();\n  axis.copy(gyro);\n  axis.normalize();\n  quat.setFromAxisAngle(axis, gyro.length() * dt);\n  return quat;\n};\nfunction PosePredictor(predictionTimeS, isDebug) {\n  this.predictionTimeS = predictionTimeS;\n  this.isDebug = isDebug;\n  this.previousQ = new Quaternion();\n  this.previousTimestampS = null;\n  this.deltaQ = new Quaternion();\n  this.outQ = new Quaternion();\n}\nPosePredictor.prototype.getPrediction = function (currentQ, gyro, timestampS) {\n  if (!this.previousTimestampS) {\n    this.previousQ.copy(currentQ);\n    this.previousTimestampS = timestampS;\n    return currentQ;\n  }\n  var axis = new Vector3();\n  axis.copy(gyro);\n  axis.normalize();\n  var angularSpeed = gyro.length();\n  if (angularSpeed < degToRad * 20) {\n    if (this.isDebug) {\n      console.log('Moving slowly, at %s deg/s: no prediction', (radToDeg * angularSpeed).toFixed(1));\n    }\n    this.outQ.copy(currentQ);\n    this.previousQ.copy(currentQ);\n    return this.outQ;\n  }\n  var predictAngle = angularSpeed * this.predictionTimeS;\n  this.deltaQ.setFromAxisAngle(axis, predictAngle);\n  this.outQ.copy(this.previousQ);\n  this.outQ.multiply(this.deltaQ);\n  this.previousQ.copy(currentQ);\n  this.previousTimestampS = timestampS;\n  return this.outQ;\n};\nfunction FusionPoseSensor(kFilter, predictionTime, yawOnly, isDebug) {\n  this.yawOnly = yawOnly;\n  this.accelerometer = new Vector3();\n  this.gyroscope = new Vector3();\n  this.filter = new ComplementaryFilter(kFilter, isDebug);\n  this.posePredictor = new PosePredictor(predictionTime, isDebug);\n  this.isFirefoxAndroid = isFirefoxAndroid();\n  this.isIOS = isIOS();\n  var chromeVersion = getChromeVersion();\n  this.isDeviceMotionInRadians = !this.isIOS && chromeVersion && chromeVersion < 66;\n  this.isWithoutDeviceMotion = isChromeWithoutDeviceMotion() || isSafariWithoutDeviceMotion();\n  this.filterToWorldQ = new Quaternion();\n  if (isIOS()) {\n    this.filterToWorldQ.setFromAxisAngle(new Vector3(1, 0, 0), Math.PI / 2);\n  } else {\n    this.filterToWorldQ.setFromAxisAngle(new Vector3(1, 0, 0), -Math.PI / 2);\n  }\n  this.inverseWorldToScreenQ = new Quaternion();\n  this.worldToScreenQ = new Quaternion();\n  this.originalPoseAdjustQ = new Quaternion();\n  this.originalPoseAdjustQ.setFromAxisAngle(new Vector3(0, 0, 1), -window.orientation * Math.PI / 180);\n  this.setScreenTransform_();\n  if (isLandscapeMode()) {\n    this.filterToWorldQ.multiply(this.inverseWorldToScreenQ);\n  }\n  this.resetQ = new Quaternion();\n  this.orientationOut_ = new Float32Array(4);\n  this.start();\n}\nFusionPoseSensor.prototype.getPosition = function () {\n  return null;\n};\nFusionPoseSensor.prototype.getOrientation = function () {\n  var orientation = void 0;\n  if (this.isWithoutDeviceMotion && this._deviceOrientationQ) {\n    this.deviceOrientationFixQ = this.deviceOrientationFixQ || function () {\n      var z = new Quaternion().setFromAxisAngle(new Vector3(0, 0, -1), 0);\n      var y = new Quaternion();\n      if (window.orientation === -90) {\n        y.setFromAxisAngle(new Vector3(0, 1, 0), Math.PI / -2);\n      } else {\n        y.setFromAxisAngle(new Vector3(0, 1, 0), Math.PI / 2);\n      }\n      return z.multiply(y);\n    }();\n    this.deviceOrientationFilterToWorldQ = this.deviceOrientationFilterToWorldQ || function () {\n      var q = new Quaternion();\n      q.setFromAxisAngle(new Vector3(1, 0, 0), -Math.PI / 2);\n      return q;\n    }();\n    orientation = this._deviceOrientationQ;\n    var out = new Quaternion();\n    out.copy(orientation);\n    out.multiply(this.deviceOrientationFilterToWorldQ);\n    out.multiply(this.resetQ);\n    out.multiply(this.worldToScreenQ);\n    out.multiplyQuaternions(this.deviceOrientationFixQ, out);\n    if (this.yawOnly) {\n      out.x = 0;\n      out.z = 0;\n      out.normalize();\n    }\n    this.orientationOut_[0] = out.x;\n    this.orientationOut_[1] = out.y;\n    this.orientationOut_[2] = out.z;\n    this.orientationOut_[3] = out.w;\n    return this.orientationOut_;\n  } else {\n    var filterOrientation = this.filter.getOrientation();\n    orientation = this.posePredictor.getPrediction(filterOrientation, this.gyroscope, this.previousTimestampS);\n  }\n  var out = new Quaternion();\n  out.copy(this.filterToWorldQ);\n  out.multiply(this.resetQ);\n  out.multiply(orientation);\n  out.multiply(this.worldToScreenQ);\n  if (this.yawOnly) {\n    out.x = 0;\n    out.z = 0;\n    out.normalize();\n  }\n  this.orientationOut_[0] = out.x;\n  this.orientationOut_[1] = out.y;\n  this.orientationOut_[2] = out.z;\n  this.orientationOut_[3] = out.w;\n  return this.orientationOut_;\n};\nFusionPoseSensor.prototype.resetPose = function () {\n  this.resetQ.copy(this.filter.getOrientation());\n  this.resetQ.x = 0;\n  this.resetQ.y = 0;\n  this.resetQ.z *= -1;\n  this.resetQ.normalize();\n  if (isLandscapeMode()) {\n    this.resetQ.multiply(this.inverseWorldToScreenQ);\n  }\n  this.resetQ.multiply(this.originalPoseAdjustQ);\n};\nFusionPoseSensor.prototype.onDeviceOrientation_ = function (e) {\n  this._deviceOrientationQ = this._deviceOrientationQ || new Quaternion();\n  var alpha = e.alpha,\n      beta = e.beta,\n      gamma = e.gamma;\n  alpha = (alpha || 0) * Math.PI / 180;\n  beta = (beta || 0) * Math.PI / 180;\n  gamma = (gamma || 0) * Math.PI / 180;\n  this._deviceOrientationQ.setFromEulerYXZ(beta, alpha, -gamma);\n};\nFusionPoseSensor.prototype.onDeviceMotion_ = function (deviceMotion) {\n  this.updateDeviceMotion_(deviceMotion);\n};\nFusionPoseSensor.prototype.updateDeviceMotion_ = function (deviceMotion) {\n  var accGravity = deviceMotion.accelerationIncludingGravity;\n  var rotRate = deviceMotion.rotationRate;\n  var timestampS = deviceMotion.timeStamp / 1000;\n  var deltaS = timestampS - this.previousTimestampS;\n  if (deltaS < 0) {\n    warnOnce('fusion-pose-sensor:invalid:non-monotonic', 'Invalid timestamps detected: non-monotonic timestamp from devicemotion');\n    this.previousTimestampS = timestampS;\n    return;\n  } else if (deltaS <= MIN_TIMESTEP || deltaS > MAX_TIMESTEP) {\n    warnOnce('fusion-pose-sensor:invalid:outside-threshold', 'Invalid timestamps detected: Timestamp from devicemotion outside expected range.');\n    this.previousTimestampS = timestampS;\n    return;\n  }\n  this.accelerometer.set(-accGravity.x, -accGravity.y, -accGravity.z);\n  if (rotRate) {\n    if (isR7()) {\n      this.gyroscope.set(-rotRate.beta, rotRate.alpha, rotRate.gamma);\n    } else {\n      this.gyroscope.set(rotRate.alpha, rotRate.beta, rotRate.gamma);\n    }\n    if (!this.isDeviceMotionInRadians) {\n      this.gyroscope.multiplyScalar(Math.PI / 180);\n    }\n    this.filter.addGyroMeasurement(this.gyroscope, timestampS);\n  }\n  this.filter.addAccelMeasurement(this.accelerometer, timestampS);\n  this.previousTimestampS = timestampS;\n};\nFusionPoseSensor.prototype.onOrientationChange_ = function (screenOrientation) {\n  this.setScreenTransform_();\n};\nFusionPoseSensor.prototype.onMessage_ = function (event) {\n  var message = event.data;\n  if (!message || !message.type) {\n    return;\n  }\n  var type = message.type.toLowerCase();\n  if (type !== 'devicemotion') {\n    return;\n  }\n  this.updateDeviceMotion_(message.deviceMotionEvent);\n};\nFusionPoseSensor.prototype.setScreenTransform_ = function () {\n  this.worldToScreenQ.set(0, 0, 0, 1);\n  switch (window.orientation) {\n    case 0:\n      break;\n    case 90:\n      this.worldToScreenQ.setFromAxisAngle(new Vector3(0, 0, 1), -Math.PI / 2);\n      break;\n    case -90:\n      this.worldToScreenQ.setFromAxisAngle(new Vector3(0, 0, 1), Math.PI / 2);\n      break;\n    case 180:\n      break;\n  }\n  this.inverseWorldToScreenQ.copy(this.worldToScreenQ);\n  this.inverseWorldToScreenQ.inverse();\n};\nFusionPoseSensor.prototype.start = function () {\n  this.onDeviceMotionCallback_ = this.onDeviceMotion_.bind(this);\n  this.onOrientationChangeCallback_ = this.onOrientationChange_.bind(this);\n  this.onMessageCallback_ = this.onMessage_.bind(this);\n  this.onDeviceOrientationCallback_ = this.onDeviceOrientation_.bind(this);\n  if (isIOS() && isInsideCrossOriginIFrame()) {\n    window.addEventListener('message', this.onMessageCallback_);\n  }\n  window.addEventListener('orientationchange', this.onOrientationChangeCallback_);\n  if (this.isWithoutDeviceMotion) {\n    window.addEventListener('deviceorientation', this.onDeviceOrientationCallback_);\n  } else {\n    window.addEventListener('devicemotion', this.onDeviceMotionCallback_);\n  }\n};\nFusionPoseSensor.prototype.stop = function () {\n  window.removeEventListener('devicemotion', this.onDeviceMotionCallback_);\n  window.removeEventListener('deviceorientation', this.onDeviceOrientationCallback_);\n  window.removeEventListener('orientationchange', this.onOrientationChangeCallback_);\n  window.removeEventListener('message', this.onMessageCallback_);\n};\nvar SENSOR_FREQUENCY = 60;\nvar X_AXIS = new Vector3(1, 0, 0);\nvar Z_AXIS = new Vector3(0, 0, 1);\nvar SENSOR_TO_VR = new Quaternion();\nSENSOR_TO_VR.setFromAxisAngle(X_AXIS, -Math.PI / 2);\nSENSOR_TO_VR.multiply(new Quaternion().setFromAxisAngle(Z_AXIS, Math.PI / 2));\nvar PoseSensor = function () {\n  function PoseSensor(config) {\n    classCallCheck(this, PoseSensor);\n    this.config = config;\n    this.sensor = null;\n    this.fusionSensor = null;\n    this._out = new Float32Array(4);\n    this.api = null;\n    this.errors = [];\n    this._sensorQ = new Quaternion();\n    this._outQ = new Quaternion();\n    this._onSensorRead = this._onSensorRead.bind(this);\n    this._onSensorError = this._onSensorError.bind(this);\n    this.init();\n  }\n  createClass(PoseSensor, [{\n    key: 'init',\n    value: function init() {\n      var sensor = null;\n      try {\n        sensor = new RelativeOrientationSensor({\n          frequency: SENSOR_FREQUENCY,\n          referenceFrame: 'screen'\n        });\n        sensor.addEventListener('error', this._onSensorError);\n      } catch (error) {\n        this.errors.push(error);\n        if (error.name === 'SecurityError') {\n          console.error('Cannot construct sensors due to the Feature Policy');\n          console.warn('Attempting to fall back using \"devicemotion\"; however this will ' + 'fail in the future without correct permissions.');\n          this.useDeviceMotion();\n        } else if (error.name === 'ReferenceError') {\n          this.useDeviceMotion();\n        } else {\n          console.error(error);\n        }\n      }\n      if (sensor) {\n        this.api = 'sensor';\n        this.sensor = sensor;\n        this.sensor.addEventListener('reading', this._onSensorRead);\n        this.sensor.start();\n      }\n    }\n  }, {\n    key: 'useDeviceMotion',\n    value: function useDeviceMotion() {\n      this.api = 'devicemotion';\n      this.fusionSensor = new FusionPoseSensor(this.config.K_FILTER, this.config.PREDICTION_TIME_S, this.config.YAW_ONLY, this.config.DEBUG);\n      if (this.sensor) {\n        this.sensor.removeEventListener('reading', this._onSensorRead);\n        this.sensor.removeEventListener('error', this._onSensorError);\n        this.sensor = null;\n      }\n    }\n  }, {\n    key: 'getOrientation',\n    value: function getOrientation() {\n      if (this.fusionSensor) {\n        return this.fusionSensor.getOrientation();\n      }\n      if (!this.sensor || !this.sensor.quaternion) {\n        this._out[0] = this._out[1] = this._out[2] = 0;\n        this._out[3] = 1;\n        return this._out;\n      }\n      var q = this.sensor.quaternion;\n      this._sensorQ.set(q[0], q[1], q[2], q[3]);\n      var out = this._outQ;\n      out.copy(SENSOR_TO_VR);\n      out.multiply(this._sensorQ);\n      if (this.config.YAW_ONLY) {\n        out.x = out.z = 0;\n        out.normalize();\n      }\n      this._out[0] = out.x;\n      this._out[1] = out.y;\n      this._out[2] = out.z;\n      this._out[3] = out.w;\n      return this._out;\n    }\n  }, {\n    key: '_onSensorError',\n    value: function _onSensorError(event) {\n      this.errors.push(event.error);\n      if (event.error.name === 'NotAllowedError') {\n        console.error('Permission to access sensor was denied');\n      } else if (event.error.name === 'NotReadableError') {\n        console.error('Sensor could not be read');\n      } else {\n        console.error(event.error);\n      }\n      this.useDeviceMotion();\n    }\n  }, {\n    key: '_onSensorRead',\n    value: function _onSensorRead() {}\n  }]);\n  return PoseSensor;\n}();\nvar rotateInstructionsAsset = \"<svg width='198' height='240' viewBox='0 0 198 240' xmlns='http://www.w3.org/2000/svg'><g fill='none' fill-rule='evenodd'><path d='M149.625 109.527l6.737 3.891v.886c0 .177.013.36.038.549.01.081.02.162.027.242.14 1.415.974 2.998 2.105 3.999l5.72 5.062.081-.09s4.382-2.53 5.235-3.024l25.97 14.993v54.001c0 .771-.386 1.217-.948 1.217-.233 0-.495-.076-.772-.236l-23.967-13.838-.014.024-27.322 15.775-.85-1.323c-4.731-1.529-9.748-2.74-14.951-3.61a.27.27 0 0 0-.007.024l-5.067 16.961-7.891 4.556-.037-.063v27.59c0 .772-.386 1.217-.948 1.217-.232 0-.495-.076-.772-.236l-42.473-24.522c-.95-.549-1.72-1.877-1.72-2.967v-1.035l-.021.047a5.111 5.111 0 0 0-1.816-.399 5.682 5.682 0 0 0-.546.001 13.724 13.724 0 0 1-1.918-.041c-1.655-.153-3.2-.6-4.404-1.296l-46.576-26.89.005.012-10.278-18.75c-1.001-1.827-.241-4.216 1.698-5.336l56.011-32.345a4.194 4.194 0 0 1 2.099-.572c1.326 0 2.572.659 3.227 1.853l.005-.003.227.413-.006.004a9.63 9.63 0 0 0 1.477 2.018l.277.27c1.914 1.85 4.468 2.801 7.113 2.801 1.949 0 3.948-.517 5.775-1.572.013 0 7.319-4.219 7.319-4.219a4.194 4.194 0 0 1 2.099-.572c1.326 0 2.572.658 3.226 1.853l3.25 5.928.022-.018 6.785 3.917-.105-.182 46.881-26.965m0-1.635c-.282 0-.563.073-.815.218l-46.169 26.556-5.41-3.124-3.005-5.481c-.913-1.667-2.699-2.702-4.66-2.703-1.011 0-2.02.274-2.917.792a3825 3825 0 0 1-7.275 4.195l-.044.024a9.937 9.937 0 0 1-4.957 1.353c-2.292 0-4.414-.832-5.976-2.342l-.252-.245a7.992 7.992 0 0 1-1.139-1.534 1.379 1.379 0 0 0-.06-.122l-.227-.414a1.718 1.718 0 0 0-.095-.154c-.938-1.574-2.673-2.545-4.571-2.545-1.011 0-2.02.274-2.917.792L3.125 155.502c-2.699 1.559-3.738 4.94-2.314 7.538l10.278 18.75c.177.323.448.563.761.704l46.426 26.804c1.403.81 3.157 1.332 5.072 1.508a15.661 15.661 0 0 0 2.146.046 4.766 4.766 0 0 1 .396 0c.096.004.19.011.283.022.109 1.593 1.159 3.323 2.529 4.114l42.472 24.522c.524.302 1.058.455 1.59.455 1.497 0 2.583-1.2 2.583-2.852v-26.562l7.111-4.105a1.64 1.64 0 0 0 .749-.948l4.658-15.593c4.414.797 8.692 1.848 12.742 3.128l.533.829a1.634 1.634 0 0 0 2.193.531l26.532-15.317L193 192.433c.523.302 1.058.455 1.59.455 1.497 0 2.583-1.199 2.583-2.852v-54.001c0-.584-.312-1.124-.818-1.416l-25.97-14.993a1.633 1.633 0 0 0-1.636.001c-.606.351-2.993 1.73-4.325 2.498l-4.809-4.255c-.819-.725-1.461-1.933-1.561-2.936a7.776 7.776 0 0 0-.033-.294 2.487 2.487 0 0 1-.023-.336v-.886c0-.584-.312-1.123-.817-1.416l-6.739-3.891a1.633 1.633 0 0 0-.817-.219' fill='#455A64'/><path d='M96.027 132.636l46.576 26.891c1.204.695 1.979 1.587 2.242 2.541l-.01.007-81.374 46.982h-.001c-1.654-.152-3.199-.6-4.403-1.295l-46.576-26.891 83.546-48.235' fill='#FAFAFA'/><path d='M63.461 209.174c-.008 0-.015 0-.022-.002-1.693-.156-3.228-.609-4.441-1.309l-46.576-26.89a.118.118 0 0 1 0-.203l83.546-48.235a.117.117 0 0 1 .117 0l46.576 26.891c1.227.708 2.021 1.612 2.296 2.611a.116.116 0 0 1-.042.124l-.021.016-81.375 46.981a.11.11 0 0 1-.058.016zm-50.747-28.303l46.401 26.79c1.178.68 2.671 1.121 4.32 1.276l81.272-46.922c-.279-.907-1.025-1.73-2.163-2.387l-46.517-26.857-83.313 48.1z' fill='#607D8B'/><path d='M148.327 165.471a5.85 5.85 0 0 1-.546.001c-1.894-.083-3.302-1.038-3.145-2.132a2.693 2.693 0 0 0-.072-1.105l-81.103 46.822c.628.058 1.272.073 1.918.042.182-.009.364-.009.546-.001 1.894.083 3.302 1.038 3.145 2.132l79.257-45.759' fill='#FFF'/><path d='M69.07 211.347a.118.118 0 0 1-.115-.134c.045-.317-.057-.637-.297-.925-.505-.61-1.555-1.022-2.738-1.074a5.966 5.966 0 0 0-.535.001 14.03 14.03 0 0 1-1.935-.041.117.117 0 0 1-.103-.092.116.116 0 0 1 .055-.126l81.104-46.822a.117.117 0 0 1 .171.07c.104.381.129.768.074 1.153-.045.316.057.637.296.925.506.61 1.555 1.021 2.739 1.073.178.008.357.008.535-.001a.117.117 0 0 1 .064.218l-79.256 45.759a.114.114 0 0 1-.059.016zm-3.405-2.372c.089 0 .177.002.265.006 1.266.056 2.353.488 2.908 1.158.227.274.35.575.36.882l78.685-45.429c-.036 0-.072-.001-.107-.003-1.267-.056-2.354-.489-2.909-1.158-.282-.34-.402-.724-.347-1.107a2.604 2.604 0 0 0-.032-.91L63.846 208.97a13.91 13.91 0 0 0 1.528.012c.097-.005.194-.007.291-.007z' fill='#607D8B'/><path d='M2.208 162.134c-1.001-1.827-.241-4.217 1.698-5.337l56.011-32.344c1.939-1.12 4.324-.546 5.326 1.281l.232.41a9.344 9.344 0 0 0 1.47 2.021l.278.27c3.325 3.214 8.583 3.716 12.888 1.23l7.319-4.22c1.94-1.119 4.324-.546 5.325 1.282l3.25 5.928-83.519 48.229-10.278-18.75z' fill='#FAFAFA'/><path d='M12.486 181.001a.112.112 0 0 1-.031-.005.114.114 0 0 1-.071-.056L2.106 162.19c-1.031-1.88-.249-4.345 1.742-5.494l56.01-32.344a4.328 4.328 0 0 1 2.158-.588c1.415 0 2.65.702 3.311 1.882.01.008.018.017.024.028l.227.414a.122.122 0 0 1 .013.038 9.508 9.508 0 0 0 1.439 1.959l.275.266c1.846 1.786 4.344 2.769 7.031 2.769 1.977 0 3.954-.538 5.717-1.557a.148.148 0 0 1 .035-.013l7.284-4.206a4.321 4.321 0 0 1 2.157-.588c1.427 0 2.672.716 3.329 1.914l3.249 5.929a.116.116 0 0 1-.044.157l-83.518 48.229a.116.116 0 0 1-.059.016zm49.53-57.004c-.704 0-1.41.193-2.041.557l-56.01 32.345c-1.882 1.086-2.624 3.409-1.655 5.179l10.221 18.645 83.317-48.112-3.195-5.829c-.615-1.122-1.783-1.792-3.124-1.792a4.08 4.08 0 0 0-2.04.557l-7.317 4.225a.148.148 0 0 1-.035.013 11.7 11.7 0 0 1-5.801 1.569c-2.748 0-5.303-1.007-7.194-2.835l-.278-.27a9.716 9.716 0 0 1-1.497-2.046.096.096 0 0 1-.013-.037l-.191-.347a.11.11 0 0 1-.023-.029c-.615-1.123-1.783-1.793-3.124-1.793z' fill='#607D8B'/><path d='M42.434 155.808c-2.51-.001-4.697-1.258-5.852-3.365-1.811-3.304-.438-7.634 3.059-9.654l12.291-7.098a7.599 7.599 0 0 1 3.789-1.033c2.51 0 4.697 1.258 5.852 3.365 1.811 3.304.439 7.634-3.059 9.654l-12.291 7.098a7.606 7.606 0 0 1-3.789 1.033zm13.287-20.683a7.128 7.128 0 0 0-3.555.971l-12.291 7.098c-3.279 1.893-4.573 5.942-2.883 9.024 1.071 1.955 3.106 3.122 5.442 3.122a7.13 7.13 0 0 0 3.556-.97l12.291-7.098c3.279-1.893 4.572-5.942 2.883-9.024-1.072-1.955-3.106-3.123-5.443-3.123z' fill='#607D8B'/><path d='M149.588 109.407l6.737 3.89v.887c0 .176.013.36.037.549.011.081.02.161.028.242.14 1.415.973 2.998 2.105 3.999l7.396 6.545c.177.156.358.295.541.415 1.579 1.04 2.95.466 3.062-1.282.049-.784.057-1.595.023-2.429l-.003-.16v-1.151l25.987 15.003v54c0 1.09-.77 1.53-1.72.982l-42.473-24.523c-.95-.548-1.72-1.877-1.72-2.966v-34.033' fill='#FAFAFA'/><path d='M194.553 191.25c-.257 0-.54-.085-.831-.253l-42.472-24.521c-.981-.567-1.779-1.943-1.779-3.068v-34.033h.234v34.033c0 1.051.745 2.336 1.661 2.866l42.473 24.521c.424.245.816.288 1.103.122.285-.164.442-.52.442-1.002v-53.933l-25.753-14.868.003 1.106c.034.832.026 1.654-.024 2.439-.054.844-.396 1.464-.963 1.746-.619.309-1.45.173-2.28-.373a5.023 5.023 0 0 1-.553-.426l-7.397-6.544c-1.158-1.026-1.999-2.625-2.143-4.076a9.624 9.624 0 0 0-.027-.238 4.241 4.241 0 0 1-.038-.564v-.82l-6.68-3.856.117-.202 6.738 3.89.058.034v.954c0 .171.012.351.036.533.011.083.021.165.029.246.138 1.395.948 2.935 2.065 3.923l7.397 6.545c.173.153.35.289.527.406.758.499 1.504.63 2.047.359.49-.243.786-.795.834-1.551.05-.778.057-1.591.024-2.417l-.004-.163v-1.355l.175.1 25.987 15.004.059.033v54.068c0 .569-.198.996-.559 1.204a1.002 1.002 0 0 1-.506.131' fill='#607D8B'/><path d='M145.685 163.161l24.115 13.922-25.978 14.998-1.462-.307c-6.534-2.17-13.628-3.728-21.019-4.616-4.365-.524-8.663 1.096-9.598 3.62a2.746 2.746 0 0 0-.011 1.928c1.538 4.267 4.236 8.363 7.995 12.135l.532.845-25.977 14.997-24.115-13.922 75.518-43.6' fill='#FFF'/><path d='M94.282 220.818l-.059-.033-24.29-14.024.175-.101 75.577-43.634.058.033 24.29 14.024-26.191 15.122-.045-.01-1.461-.307c-6.549-2.174-13.613-3.725-21.009-4.614a13.744 13.744 0 0 0-1.638-.097c-3.758 0-7.054 1.531-7.837 3.642a2.62 2.62 0 0 0-.01 1.848c1.535 4.258 4.216 8.326 7.968 12.091l.016.021.526.835.006.01.064.102-.105.061-25.977 14.998-.058.033zm-23.881-14.057l23.881 13.788 24.802-14.32c.546-.315.846-.489 1.017-.575l-.466-.74c-3.771-3.787-6.467-7.881-8.013-12.168a2.851 2.851 0 0 1 .011-2.008c.815-2.199 4.203-3.795 8.056-3.795.557 0 1.117.033 1.666.099 7.412.891 14.491 2.445 21.041 4.621.836.175 1.215.254 1.39.304l25.78-14.884-23.881-13.788-75.284 43.466z' fill='#607D8B'/><path d='M167.23 125.979v50.871l-27.321 15.773-6.461-14.167c-.91-1.996-3.428-1.738-5.624.574a10.238 10.238 0 0 0-2.33 4.018l-6.46 21.628-27.322 15.774v-50.871l75.518-43.6' fill='#FFF'/><path d='M91.712 220.567a.127.127 0 0 1-.059-.016.118.118 0 0 1-.058-.101v-50.871c0-.042.023-.08.058-.101l75.519-43.6a.117.117 0 0 1 .175.101v50.871c0 .041-.023.08-.059.1l-27.321 15.775a.118.118 0 0 1-.094.01.12.12 0 0 1-.071-.063l-6.46-14.168c-.375-.822-1.062-1.275-1.934-1.275-1.089 0-2.364.686-3.5 1.881a10.206 10.206 0 0 0-2.302 3.972l-6.46 21.627a.118.118 0 0 1-.054.068L91.77 220.551a.12.12 0 0 1-.058.016zm.117-50.92v50.601l27.106-15.65 6.447-21.583a10.286 10.286 0 0 1 2.357-4.065c1.18-1.242 2.517-1.954 3.669-1.954.969 0 1.731.501 2.146 1.411l6.407 14.051 27.152-15.676v-50.601l-75.284 43.466z' fill='#607D8B'/><path d='M168.543 126.213v50.87l-27.322 15.774-6.46-14.168c-.91-1.995-3.428-1.738-5.624.574a10.248 10.248 0 0 0-2.33 4.019l-6.461 21.627-27.321 15.774v-50.87l75.518-43.6' fill='#FFF'/><path d='M93.025 220.8a.123.123 0 0 1-.059-.015.12.12 0 0 1-.058-.101v-50.871c0-.042.023-.08.058-.101l75.518-43.6a.112.112 0 0 1 .117 0c.036.02.059.059.059.1v50.871a.116.116 0 0 1-.059.101l-27.321 15.774a.111.111 0 0 1-.094.01.115.115 0 0 1-.071-.062l-6.46-14.168c-.375-.823-1.062-1.275-1.935-1.275-1.088 0-2.363.685-3.499 1.881a10.19 10.19 0 0 0-2.302 3.971l-6.461 21.628a.108.108 0 0 1-.053.067l-27.322 15.775a.12.12 0 0 1-.058.015zm.117-50.919v50.6l27.106-15.649 6.447-21.584a10.293 10.293 0 0 1 2.357-4.065c1.179-1.241 2.516-1.954 3.668-1.954.969 0 1.732.502 2.147 1.412l6.407 14.051 27.152-15.676v-50.601l-75.284 43.466z' fill='#607D8B'/><path d='M169.8 177.083l-27.322 15.774-6.46-14.168c-.91-1.995-3.428-1.738-5.625.574a10.246 10.246 0 0 0-2.329 4.019l-6.461 21.627-27.321 15.774v-50.87l75.518-43.6v50.87z' fill='#FAFAFA'/><path d='M94.282 220.917a.234.234 0 0 1-.234-.233v-50.871c0-.083.045-.161.117-.202l75.518-43.601a.234.234 0 1 1 .35.202v50.871a.233.233 0 0 1-.116.202l-27.322 15.775a.232.232 0 0 1-.329-.106l-6.461-14.168c-.36-.789-.992-1.206-1.828-1.206-1.056 0-2.301.672-3.415 1.844a10.099 10.099 0 0 0-2.275 3.924l-6.46 21.628a.235.235 0 0 1-.107.136l-27.322 15.774a.23.23 0 0 1-.116.031zm.233-50.969v50.331l26.891-15.525 6.434-21.539a10.41 10.41 0 0 1 2.384-4.112c1.201-1.265 2.569-1.991 3.753-1.991 1.018 0 1.818.526 2.253 1.48l6.354 13.934 26.982-15.578v-50.331l-75.051 43.331z' fill='#607D8B'/><path d='M109.894 199.943c-1.774 0-3.241-.725-4.244-2.12a.224.224 0 0 1 .023-.294.233.233 0 0 1 .301-.023c.78.547 1.705.827 2.75.827 1.323 0 2.754-.439 4.256-1.306 5.311-3.067 9.631-10.518 9.631-16.611 0-1.927-.442-3.56-1.278-4.724a.232.232 0 0 1 .323-.327c1.671 1.172 2.591 3.381 2.591 6.219 0 6.242-4.426 13.863-9.865 17.003-1.574.908-3.084 1.356-4.488 1.356zm-2.969-1.542c.813.651 1.82.877 2.968.877h.001c1.321 0 2.753-.327 4.254-1.194 5.311-3.067 9.632-10.463 9.632-16.556 0-1.979-.463-3.599-1.326-4.761.411 1.035.625 2.275.625 3.635 0 6.243-4.426 13.883-9.865 17.023-1.574.909-3.084 1.317-4.49 1.317-.641 0-1.243-.149-1.799-.341z' fill='#607D8B'/><path d='M113.097 197.23c5.384-3.108 9.748-10.636 9.748-16.814 0-2.051-.483-3.692-1.323-4.86-1.784-1.252-4.374-1.194-7.257.47-5.384 3.108-9.748 10.636-9.748 16.814 0 2.051.483 3.692 1.323 4.86 1.784 1.252 4.374 1.194 7.257-.47' fill='#FAFAFA'/><path d='M108.724 198.614c-1.142 0-2.158-.213-3.019-.817-.021-.014-.04.014-.055-.007-.894-1.244-1.367-2.948-1.367-4.973 0-6.242 4.426-13.864 9.865-17.005 1.574-.908 3.084-1.363 4.49-1.363 1.142 0 2.158.309 3.018.913a.23.23 0 0 1 .056.056c.894 1.244 1.367 2.972 1.367 4.997 0 6.243-4.426 13.783-9.865 16.923-1.574.909-3.084 1.276-4.49 1.276zm-2.718-1.109c.774.532 1.688.776 2.718.776 1.323 0 2.754-.413 4.256-1.28 5.311-3.066 9.631-10.505 9.631-16.598 0-1.909-.434-3.523-1.255-4.685-.774-.533-1.688-.799-2.718-.799-1.323 0-2.755.441-4.256 1.308-5.311 3.066-9.631 10.506-9.631 16.599 0 1.909.434 3.517 1.255 4.679z' fill='#607D8B'/><path d='M149.318 114.262l-9.984 8.878 15.893 11.031 5.589-6.112-11.498-13.797' fill='#FAFAFA'/><path d='M169.676 120.84l-9.748 5.627c-3.642 2.103-9.528 2.113-13.147.024-3.62-2.089-3.601-5.488.041-7.591l9.495-5.608-6.729-3.885-81.836 47.071 45.923 26.514 3.081-1.779c.631-.365.869-.898.618-1.39-2.357-4.632-2.593-9.546-.683-14.262 5.638-13.92 24.509-24.815 48.618-28.07 8.169-1.103 16.68-.967 24.704.394.852.145 1.776.008 2.407-.357l3.081-1.778-25.825-14.91' fill='#FAFAFA'/><path d='M113.675 183.459a.47.47 0 0 1-.233-.062l-45.924-26.515a.468.468 0 0 1 .001-.809l81.836-47.071a.467.467 0 0 1 .466 0l6.729 3.885a.467.467 0 0 1-.467.809l-6.496-3.75-80.9 46.533 44.988 25.973 2.848-1.644c.192-.111.62-.409.435-.773-2.416-4.748-2.658-9.814-.7-14.65 2.806-6.927 8.885-13.242 17.582-18.263 8.657-4.998 19.518-8.489 31.407-10.094 8.198-1.107 16.79-.97 24.844.397.739.125 1.561.007 2.095-.301l2.381-1.374-25.125-14.506a.467.467 0 0 1 .467-.809l25.825 14.91a.467.467 0 0 1 0 .809l-3.081 1.779c-.721.417-1.763.575-2.718.413-7.963-1.351-16.457-1.486-24.563-.392-11.77 1.589-22.512 5.039-31.065 9.977-8.514 4.916-14.456 11.073-17.183 17.805-1.854 4.578-1.623 9.376.666 13.875.37.725.055 1.513-.8 2.006l-3.081 1.78a.476.476 0 0 1-.234.062' fill='#455A64'/><path d='M153.316 128.279c-2.413 0-4.821-.528-6.652-1.586-1.818-1.049-2.82-2.461-2.82-3.975 0-1.527 1.016-2.955 2.861-4.02l9.493-5.607a.233.233 0 1 1 .238.402l-9.496 5.609c-1.696.979-2.628 2.263-2.628 3.616 0 1.34.918 2.608 2.585 3.571 3.549 2.049 9.343 2.038 12.914-.024l9.748-5.628a.234.234 0 0 1 .234.405l-9.748 5.628c-1.858 1.072-4.296 1.609-6.729 1.609' fill='#607D8B'/><path d='M113.675 182.992l-45.913-26.508M113.675 183.342a.346.346 0 0 1-.175-.047l-45.913-26.508a.35.35 0 1 1 .35-.607l45.913 26.508a.35.35 0 0 1-.175.654' fill='#455A64'/><path d='M67.762 156.484v54.001c0 1.09.77 2.418 1.72 2.967l42.473 24.521c.95.549 1.72.11 1.72-.98v-54.001' fill='#FAFAFA'/><path d='M112.727 238.561c-.297 0-.62-.095-.947-.285l-42.473-24.521c-1.063-.613-1.895-2.05-1.895-3.27v-54.001a.35.35 0 1 1 .701 0v54.001c0 .96.707 2.18 1.544 2.663l42.473 24.522c.344.198.661.243.87.122.206-.119.325-.411.325-.799v-54.001a.35.35 0 1 1 .7 0v54.001c0 .655-.239 1.154-.675 1.406a1.235 1.235 0 0 1-.623.162' fill='#455A64'/><path d='M112.86 147.512h-.001c-2.318 0-4.499-.522-6.142-1.471-1.705-.984-2.643-2.315-2.643-3.749 0-1.445.952-2.791 2.68-3.788l12.041-6.953c1.668-.962 3.874-1.493 6.212-1.493 2.318 0 4.499.523 6.143 1.472 1.704.984 2.643 2.315 2.643 3.748 0 1.446-.952 2.791-2.68 3.789l-12.042 6.952c-1.668.963-3.874 1.493-6.211 1.493zm12.147-16.753c-2.217 0-4.298.497-5.861 1.399l-12.042 6.952c-1.502.868-2.33 1.998-2.33 3.182 0 1.173.815 2.289 2.293 3.142 1.538.889 3.596 1.378 5.792 1.378h.001c2.216 0 4.298-.497 5.861-1.399l12.041-6.953c1.502-.867 2.33-1.997 2.33-3.182 0-1.172-.814-2.288-2.292-3.142-1.539-.888-3.596-1.377-5.793-1.377z' fill='#607D8B'/><path d='M165.63 123.219l-5.734 3.311c-3.167 1.828-8.286 1.837-11.433.02-3.147-1.817-3.131-4.772.036-6.601l5.734-3.31 11.397 6.58' fill='#FAFAFA'/><path d='M154.233 117.448l9.995 5.771-4.682 2.704c-1.434.827-3.352 1.283-5.399 1.283-2.029 0-3.923-.449-5.333-1.263-1.29-.744-2-1.694-2-2.674 0-.991.723-1.955 2.036-2.713l5.383-3.108m0-.809l-5.734 3.31c-3.167 1.829-3.183 4.784-.036 6.601 1.568.905 3.623 1.357 5.684 1.357 2.077 0 4.159-.46 5.749-1.377l5.734-3.311-11.397-6.58M145.445 179.667c-1.773 0-3.241-.85-4.243-2.245-.067-.092-.057-.275.023-.356.08-.081.207-.12.3-.055.781.548 1.706.812 2.751.811 1.322 0 2.754-.446 4.256-1.313 5.31-3.066 9.631-10.522 9.631-16.615 0-1.927-.442-3.562-1.279-4.726a.235.235 0 0 1 .024-.301.232.232 0 0 1 .3-.027c1.67 1.172 2.59 3.38 2.59 6.219 0 6.242-4.425 13.987-9.865 17.127-1.573.908-3.083 1.481-4.488 1.481zM142.476 178c.814.651 1.82 1.002 2.969 1.002 1.322 0 2.753-.452 4.255-1.32 5.31-3.065 9.631-10.523 9.631-16.617 0-1.98-.463-3.63-1.325-4.793.411 1.035.624 2.26.624 3.62 0 6.242-4.425 13.875-9.865 17.015-1.573.909-3.084 1.376-4.489 1.376a5.49 5.49 0 0 1-1.8-.283z' fill='#607D8B'/><path d='M148.648 176.704c5.384-3.108 9.748-10.636 9.748-16.813 0-2.052-.483-3.693-1.322-4.861-1.785-1.252-4.375-1.194-7.258.471-5.383 3.108-9.748 10.636-9.748 16.813 0 2.051.484 3.692 1.323 4.86 1.785 1.253 4.374 1.195 7.257-.47' fill='#FAFAFA'/><path d='M144.276 178.276c-1.143 0-2.158-.307-3.019-.911a.217.217 0 0 1-.055-.054c-.895-1.244-1.367-2.972-1.367-4.997 0-6.241 4.425-13.875 9.865-17.016 1.573-.908 3.084-1.369 4.489-1.369 1.143 0 2.158.307 3.019.91a.24.24 0 0 1 .055.055c.894 1.244 1.367 2.971 1.367 4.997 0 6.241-4.425 13.875-9.865 17.016-1.573.908-3.084 1.369-4.489 1.369zm-2.718-1.172c.773.533 1.687.901 2.718.901 1.322 0 2.754-.538 4.256-1.405 5.31-3.066 9.631-10.567 9.631-16.661 0-1.908-.434-3.554-1.256-4.716-.774-.532-1.688-.814-2.718-.814-1.322 0-2.754.433-4.256 1.3-5.31 3.066-9.631 10.564-9.631 16.657 0 1.91.434 3.576 1.256 4.738z' fill='#607D8B'/><path d='M150.72 172.361l-.363-.295a24.105 24.105 0 0 0 2.148-3.128 24.05 24.05 0 0 0 1.977-4.375l.443.149a24.54 24.54 0 0 1-2.015 4.46 24.61 24.61 0 0 1-2.19 3.189M115.917 191.514l-.363-.294a24.174 24.174 0 0 0 2.148-3.128 24.038 24.038 0 0 0 1.976-4.375l.443.148a24.48 24.48 0 0 1-2.015 4.461 24.662 24.662 0 0 1-2.189 3.188M114 237.476V182.584 237.476' fill='#607D8B'/><g><path d='M81.822 37.474c.017-.135-.075-.28-.267-.392-.327-.188-.826-.21-1.109-.045l-6.012 3.471c-.131.076-.194.178-.191.285.002.132.002.461.002.578v.043l-.007.128-6.591 3.779c-.001 0-2.077 1.046-2.787 5.192 0 0-.912 6.961-.898 19.745.015 12.57.606 17.07 1.167 21.351.22 1.684 3.001 2.125 3.001 2.125.331.04.698-.027 1.08-.248l75.273-43.551c1.808-1.069 2.667-3.719 3.056-6.284 1.213-7.99 1.675-32.978-.275-39.878-.196-.693-.51-1.083-.868-1.282l-2.086-.79c-.727.028-1.416.467-1.534.535L82.032 37.072l-.21.402' fill='#FFF'/><path d='M144.311 1.701l2.085.79c.358.199.672.589.868 1.282 1.949 6.9 1.487 31.887.275 39.878-.39 2.565-1.249 5.215-3.056 6.284L69.21 93.486a1.78 1.78 0 0 1-.896.258l-.183-.011c0 .001-2.782-.44-3.003-2.124-.56-4.282-1.151-8.781-1.165-21.351-.015-12.784.897-19.745.897-19.745.71-4.146 2.787-5.192 2.787-5.192l6.591-3.779.007-.128v-.043c0-.117 0-.446-.002-.578-.003-.107.059-.21.191-.285l6.012-3.472a.98.98 0 0 1 .481-.11c.218 0 .449.053.627.156.193.112.285.258.268.392l.211-.402 60.744-34.836c.117-.068.806-.507 1.534-.535m0-.997l-.039.001c-.618.023-1.283.244-1.974.656l-.021.012-60.519 34.706a2.358 2.358 0 0 0-.831-.15c-.365 0-.704.084-.98.244l-6.012 3.471c-.442.255-.699.69-.689 1.166l.001.15-6.08 3.487c-.373.199-2.542 1.531-3.29 5.898l-.006.039c-.009.07-.92 7.173-.906 19.875.014 12.62.603 17.116 1.172 21.465l.002.015c.308 2.355 3.475 2.923 3.836 2.98l.034.004c.101.013.204.019.305.019a2.77 2.77 0 0 0 1.396-.392l75.273-43.552c1.811-1.071 2.999-3.423 3.542-6.997 1.186-7.814 1.734-33.096-.301-40.299-.253-.893-.704-1.527-1.343-1.882l-.132-.062-2.085-.789a.973.973 0 0 0-.353-.065' fill='#455A64'/><path d='M128.267 11.565l1.495.434-56.339 32.326' fill='#FFF'/><path d='M74.202 90.545a.5.5 0 0 1-.25-.931l18.437-10.645a.499.499 0 1 1 .499.864L74.451 90.478l-.249.067M75.764 42.654l-.108-.062.046-.171 5.135-2.964.17.045-.045.171-5.135 2.964-.063.017M70.52 90.375V46.421l.063-.036L137.84 7.554v43.954l-.062.036L70.52 90.375zm.25-43.811v43.38l66.821-38.579V7.985L70.77 46.564z' fill='#607D8B'/><path d='M86.986 83.182c-.23.149-.612.384-.849.523l-11.505 6.701c-.237.139-.206.252.068.252h.565c.275 0 .693-.113.93-.252L87.7 83.705c.237-.139.428-.253.425-.256a11.29 11.29 0 0 1-.006-.503c0-.274-.188-.377-.418-.227l-.715.463' fill='#607D8B'/><path d='M75.266 90.782H74.7c-.2 0-.316-.056-.346-.166-.03-.11.043-.217.215-.317l11.505-6.702c.236-.138.615-.371.844-.519l.715-.464a.488.488 0 0 1 .266-.089c.172 0 .345.13.345.421 0 .214.001.363.003.437l.006.004-.004.069c-.003.075-.003.075-.486.356l-11.505 6.702a2.282 2.282 0 0 1-.992.268zm-.6-.25l.034.001h.566c.252 0 .649-.108.866-.234l11.505-6.702c.168-.098.294-.173.361-.214-.004-.084-.004-.218-.004-.437l-.095-.171-.131.049-.714.463c-.232.15-.616.386-.854.525l-11.505 6.702-.029.018z' fill='#607D8B'/><path d='M75.266 89.871H74.7c-.2 0-.316-.056-.346-.166-.03-.11.043-.217.215-.317l11.505-6.702c.258-.151.694-.268.993-.268h.565c.2 0 .316.056.346.166.03.11-.043.217-.215.317l-11.505 6.702a2.282 2.282 0 0 1-.992.268zm-.6-.25l.034.001h.566c.252 0 .649-.107.866-.234l11.505-6.702.03-.018-.035-.001h-.565c-.252 0-.649.108-.867.234l-11.505 6.702-.029.018zM74.37 90.801v-1.247 1.247' fill='#607D8B'/><path d='M68.13 93.901c-.751-.093-1.314-.737-1.439-1.376-.831-4.238-1.151-8.782-1.165-21.352-.015-12.784.897-19.745.897-19.745.711-4.146 2.787-5.192 2.787-5.192l74.859-43.219c.223-.129 2.487-1.584 3.195.923 1.95 6.9 1.488 31.887.275 39.878-.389 2.565-1.248 5.215-3.056 6.283L69.21 93.653c-.382.221-.749.288-1.08.248 0 0-2.781-.441-3.001-2.125-.561-4.281-1.152-8.781-1.167-21.351-.014-12.784.898-19.745.898-19.745.71-4.146 2.787-5.191 2.787-5.191l6.598-3.81.871-.119 6.599-3.83.046-.461L68.13 93.901' fill='#FAFAFA'/><path d='M68.317 94.161l-.215-.013h-.001l-.244-.047c-.719-.156-2.772-.736-2.976-2.292-.568-4.34-1.154-8.813-1.168-21.384-.014-12.654.891-19.707.9-19.777.725-4.231 2.832-5.338 2.922-5.382l6.628-3.827.87-.119 6.446-3.742.034-.334a.248.248 0 0 1 .273-.223.248.248 0 0 1 .223.272l-.059.589-6.752 3.919-.87.118-6.556 3.785c-.031.016-1.99 1.068-2.666 5.018-.007.06-.908 7.086-.894 19.702.014 12.539.597 16.996 1.161 21.305.091.691.689 1.154 1.309 1.452a1.95 1.95 0 0 1-.236-.609c-.781-3.984-1.155-8.202-1.17-21.399-.014-12.653.891-19.707.9-19.777.725-4.231 2.832-5.337 2.922-5.382-.004.001 74.444-42.98 74.846-43.212l.028-.017c.904-.538 1.72-.688 2.36-.433.555.221.949.733 1.172 1.52 2.014 7.128 1.46 32.219.281 39.983-.507 3.341-1.575 5.515-3.175 6.462L69.335 93.869a2.023 2.023 0 0 1-1.018.292zm-.147-.507c.293.036.604-.037.915-.217l75.273-43.551c1.823-1.078 2.602-3.915 2.934-6.106 1.174-7.731 1.731-32.695-.268-39.772-.178-.631-.473-1.032-.876-1.192-.484-.193-1.166-.052-1.921.397l-.034.021-74.858 43.218c-.031.017-1.989 1.069-2.666 5.019-.007.059-.908 7.085-.894 19.702.015 13.155.386 17.351 1.161 21.303.09.461.476.983 1.037 1.139.114.025.185.037.196.039h.001z' fill='#455A64'/><path d='M69.317 68.982c.489-.281.885-.056.885.505 0 .56-.396 1.243-.885 1.525-.488.282-.884.057-.884-.504 0-.56.396-1.243.884-1.526' fill='#FFF'/><path d='M68.92 71.133c-.289 0-.487-.228-.487-.625 0-.56.396-1.243.884-1.526a.812.812 0 0 1 .397-.121c.289 0 .488.229.488.626 0 .56-.396 1.243-.885 1.525a.812.812 0 0 1-.397.121m.794-2.459a.976.976 0 0 0-.49.147c-.548.317-.978 1.058-.978 1.687 0 .486.271.812.674.812a.985.985 0 0 0 .491-.146c.548-.317.978-1.057.978-1.687 0-.486-.272-.813-.675-.813' fill='#8097A2'/><path d='M68.92 70.947c-.271 0-.299-.307-.299-.439 0-.491.361-1.116.79-1.363a.632.632 0 0 1 .303-.096c.272 0 .301.306.301.438 0 .491-.363 1.116-.791 1.364a.629.629 0 0 1-.304.096m.794-2.086a.812.812 0 0 0-.397.121c-.488.283-.884.966-.884 1.526 0 .397.198.625.487.625a.812.812 0 0 0 .397-.121c.489-.282.885-.965.885-1.525 0-.397-.199-.626-.488-.626' fill='#8097A2'/><path d='M69.444 85.35c.264-.152.477-.031.477.272 0 .303-.213.67-.477.822-.263.153-.477.031-.477-.271 0-.302.214-.671.477-.823' fill='#FFF'/><path d='M69.23 86.51c-.156 0-.263-.123-.263-.337 0-.302.214-.671.477-.823a.431.431 0 0 1 .214-.066c.156 0 .263.124.263.338 0 .303-.213.67-.477.822a.431.431 0 0 1-.214.066m.428-1.412c-.1 0-.203.029-.307.09-.32.185-.57.618-.57.985 0 .309.185.524.449.524a.63.63 0 0 0 .308-.09c.32-.185.57-.618.57-.985 0-.309-.185-.524-.45-.524' fill='#8097A2'/><path d='M69.23 86.322l-.076-.149c0-.235.179-.544.384-.661l.12-.041.076.151c0 .234-.179.542-.383.66l-.121.04m.428-1.038a.431.431 0 0 0-.214.066c-.263.152-.477.521-.477.823 0 .214.107.337.263.337a.431.431 0 0 0 .214-.066c.264-.152.477-.519.477-.822 0-.214-.107-.338-.263-.338' fill='#8097A2'/><path d='M139.278 7.769v43.667L72.208 90.16V46.493l67.07-38.724' fill='#455A64'/><path d='M72.083 90.375V46.421l.063-.036 67.257-38.831v43.954l-.062.036-67.258 38.831zm.25-43.811v43.38l66.821-38.579V7.985L72.333 46.564z' fill='#607D8B'/></g><path d='M125.737 88.647l-7.639 3.334V84l-11.459 4.713v8.269L99 100.315l13.369 3.646 13.368-15.314' fill='#455A64'/></g></svg>\";\nfunction RotateInstructions() {\n  this.loadIcon_();\n  var overlay = document.createElement('div');\n  var s = overlay.style;\n  s.position = 'fixed';\n  s.top = 0;\n  s.right = 0;\n  s.bottom = 0;\n  s.left = 0;\n  s.backgroundColor = 'gray';\n  s.fontFamily = 'sans-serif';\n  s.zIndex = 1000000;\n  var img = document.createElement('img');\n  img.src = this.icon;\n  var s = img.style;\n  s.marginLeft = '25%';\n  s.marginTop = '25%';\n  s.width = '50%';\n  overlay.appendChild(img);\n  var text = document.createElement('div');\n  var s = text.style;\n  s.textAlign = 'center';\n  s.fontSize = '16px';\n  s.lineHeight = '24px';\n  s.margin = '24px 25%';\n  s.width = '50%';\n  text.innerHTML = 'Place your phone into your Cardboard viewer.';\n  overlay.appendChild(text);\n  var snackbar = document.createElement('div');\n  var s = snackbar.style;\n  s.backgroundColor = '#CFD8DC';\n  s.position = 'fixed';\n  s.bottom = 0;\n  s.width = '100%';\n  s.height = '48px';\n  s.padding = '14px 24px';\n  s.boxSizing = 'border-box';\n  s.color = '#656A6B';\n  overlay.appendChild(snackbar);\n  var snackbarText = document.createElement('div');\n  snackbarText.style.float = 'left';\n  snackbarText.innerHTML = 'No Cardboard viewer?';\n  var snackbarButton = document.createElement('a');\n  snackbarButton.href = 'https://www.google.com/get/cardboard/get-cardboard/';\n  snackbarButton.innerHTML = 'get one';\n  snackbarButton.target = '_blank';\n  var s = snackbarButton.style;\n  s.float = 'right';\n  s.fontWeight = 600;\n  s.textTransform = 'uppercase';\n  s.borderLeft = '1px solid gray';\n  s.paddingLeft = '24px';\n  s.textDecoration = 'none';\n  s.color = '#656A6B';\n  snackbar.appendChild(snackbarText);\n  snackbar.appendChild(snackbarButton);\n  this.overlay = overlay;\n  this.text = text;\n  this.hide();\n}\nRotateInstructions.prototype.show = function (parent) {\n  if (!parent && !this.overlay.parentElement) {\n    document.body.appendChild(this.overlay);\n  } else if (parent) {\n    if (this.overlay.parentElement && this.overlay.parentElement != parent) this.overlay.parentElement.removeChild(this.overlay);\n    parent.appendChild(this.overlay);\n  }\n  this.overlay.style.display = 'block';\n  var img = this.overlay.querySelector('img');\n  var s = img.style;\n  if (isLandscapeMode()) {\n    s.width = '20%';\n    s.marginLeft = '40%';\n    s.marginTop = '3%';\n  } else {\n    s.width = '50%';\n    s.marginLeft = '25%';\n    s.marginTop = '25%';\n  }\n};\nRotateInstructions.prototype.hide = function () {\n  this.overlay.style.display = 'none';\n};\nRotateInstructions.prototype.showTemporarily = function (ms, parent) {\n  this.show(parent);\n  this.timer = setTimeout(this.hide.bind(this), ms);\n};\nRotateInstructions.prototype.disableShowTemporarily = function () {\n  clearTimeout(this.timer);\n};\nRotateInstructions.prototype.update = function () {\n  this.disableShowTemporarily();\n  if (!isLandscapeMode() && isMobile()) {\n    this.show();\n  } else {\n    this.hide();\n  }\n};\nRotateInstructions.prototype.loadIcon_ = function () {\n  this.icon = dataUri('image/svg+xml', rotateInstructionsAsset);\n};\nvar DEFAULT_VIEWER = 'CardboardV1';\nvar VIEWER_KEY = 'WEBVR_CARDBOARD_VIEWER';\nvar CLASS_NAME = 'webvr-polyfill-viewer-selector';\nfunction ViewerSelector(defaultViewer) {\n  try {\n    this.selectedKey = localStorage.getItem(VIEWER_KEY);\n  } catch (error) {\n    console.error('Failed to load viewer profile: %s', error);\n  }\n  if (!this.selectedKey) {\n    this.selectedKey = defaultViewer || DEFAULT_VIEWER;\n  }\n  this.dialog = this.createDialog_(DeviceInfo.Viewers);\n  this.root = null;\n  this.onChangeCallbacks_ = [];\n}\nViewerSelector.prototype.show = function (root) {\n  this.root = root;\n  root.appendChild(this.dialog);\n  var selected = this.dialog.querySelector('#' + this.selectedKey);\n  selected.checked = true;\n  this.dialog.style.display = 'block';\n};\nViewerSelector.prototype.hide = function () {\n  if (this.root && this.root.contains(this.dialog)) {\n    this.root.removeChild(this.dialog);\n  }\n  this.dialog.style.display = 'none';\n};\nViewerSelector.prototype.getCurrentViewer = function () {\n  return DeviceInfo.Viewers[this.selectedKey];\n};\nViewerSelector.prototype.getSelectedKey_ = function () {\n  var input = this.dialog.querySelector('input[name=field]:checked');\n  if (input) {\n    return input.id;\n  }\n  return null;\n};\nViewerSelector.prototype.onChange = function (cb) {\n  this.onChangeCallbacks_.push(cb);\n};\nViewerSelector.prototype.fireOnChange_ = function (viewer) {\n  for (var i = 0; i < this.onChangeCallbacks_.length; i++) {\n    this.onChangeCallbacks_[i](viewer);\n  }\n};\nViewerSelector.prototype.onSave_ = function () {\n  this.selectedKey = this.getSelectedKey_();\n  if (!this.selectedKey || !DeviceInfo.Viewers[this.selectedKey]) {\n    console.error('ViewerSelector.onSave_: this should never happen!');\n    return;\n  }\n  this.fireOnChange_(DeviceInfo.Viewers[this.selectedKey]);\n  try {\n    localStorage.setItem(VIEWER_KEY, this.selectedKey);\n  } catch (error) {\n    console.error('Failed to save viewer profile: %s', error);\n  }\n  this.hide();\n};\nViewerSelector.prototype.createDialog_ = function (options) {\n  var container = document.createElement('div');\n  container.classList.add(CLASS_NAME);\n  container.style.display = 'none';\n  var overlay = document.createElement('div');\n  var s = overlay.style;\n  s.position = 'fixed';\n  s.left = 0;\n  s.top = 0;\n  s.width = '100%';\n  s.height = '100%';\n  s.background = 'rgba(0, 0, 0, 0.3)';\n  overlay.addEventListener('click', this.hide.bind(this));\n  var width = 280;\n  var dialog = document.createElement('div');\n  var s = dialog.style;\n  s.boxSizing = 'border-box';\n  s.position = 'fixed';\n  s.top = '24px';\n  s.left = '50%';\n  s.marginLeft = -width / 2 + 'px';\n  s.width = width + 'px';\n  s.padding = '24px';\n  s.overflow = 'hidden';\n  s.background = '#fafafa';\n  s.fontFamily = \"'Roboto', sans-serif\";\n  s.boxShadow = '0px 5px 20px #666';\n  dialog.appendChild(this.createH1_('Select your viewer'));\n  for (var id in options) {\n    dialog.appendChild(this.createChoice_(id, options[id].label));\n  }\n  dialog.appendChild(this.createButton_('Save', this.onSave_.bind(this)));\n  container.appendChild(overlay);\n  container.appendChild(dialog);\n  return container;\n};\nViewerSelector.prototype.createH1_ = function (name) {\n  var h1 = document.createElement('h1');\n  var s = h1.style;\n  s.color = 'black';\n  s.fontSize = '20px';\n  s.fontWeight = 'bold';\n  s.marginTop = 0;\n  s.marginBottom = '24px';\n  h1.innerHTML = name;\n  return h1;\n};\nViewerSelector.prototype.createChoice_ = function (id, name) {\n  var div = document.createElement('div');\n  div.style.marginTop = '8px';\n  div.style.color = 'black';\n  var input = document.createElement('input');\n  input.style.fontSize = '30px';\n  input.setAttribute('id', id);\n  input.setAttribute('type', 'radio');\n  input.setAttribute('value', id);\n  input.setAttribute('name', 'field');\n  var label = document.createElement('label');\n  label.style.marginLeft = '4px';\n  label.setAttribute('for', id);\n  label.innerHTML = name;\n  div.appendChild(input);\n  div.appendChild(label);\n  return div;\n};\nViewerSelector.prototype.createButton_ = function (label, onclick) {\n  var button = document.createElement('button');\n  button.innerHTML = label;\n  var s = button.style;\n  s.float = 'right';\n  s.textTransform = 'uppercase';\n  s.color = '#1094f7';\n  s.fontSize = '14px';\n  s.letterSpacing = 0;\n  s.border = 0;\n  s.background = 'none';\n  s.marginTop = '16px';\n  button.addEventListener('click', onclick);\n  return button;\n};\nvar commonjsGlobal$$1 = typeof window !== 'undefined' ? window : typeof commonjsGlobal !== 'undefined' ? commonjsGlobal : typeof self !== 'undefined' ? self : {};\nfunction unwrapExports$$1 (x) {\n\treturn x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x['default'] : x;\n}\nfunction createCommonjsModule$$1(fn, module) {\n\treturn module = { exports: {} }, fn(module, module.exports), module.exports;\n}\nvar NoSleep = createCommonjsModule$$1(function (module, exports) {\n(function webpackUniversalModuleDefinition(root, factory) {\n\tmodule.exports = factory();\n})(commonjsGlobal$$1, function() {\nreturn          (function(modules) {\n         \tvar installedModules = {};\n         \tfunction __webpack_require__(moduleId) {\n         \t\tif(installedModules[moduleId]) {\n         \t\t\treturn installedModules[moduleId].exports;\n         \t\t}\n         \t\tvar module = installedModules[moduleId] = {\n         \t\t\ti: moduleId,\n         \t\t\tl: false,\n         \t\t\texports: {}\n         \t\t};\n         \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n         \t\tmodule.l = true;\n         \t\treturn module.exports;\n         \t}\n         \t__webpack_require__.m = modules;\n         \t__webpack_require__.c = installedModules;\n         \t__webpack_require__.d = function(exports, name, getter) {\n         \t\tif(!__webpack_require__.o(exports, name)) {\n         \t\t\tObject.defineProperty(exports, name, {\n         \t\t\t\tconfigurable: false,\n         \t\t\t\tenumerable: true,\n         \t\t\t\tget: getter\n         \t\t\t});\n         \t\t}\n         \t};\n         \t__webpack_require__.n = function(module) {\n         \t\tvar getter = module && module.__esModule ?\n         \t\t\tfunction getDefault() { return module['default']; } :\n         \t\t\tfunction getModuleExports() { return module; };\n         \t\t__webpack_require__.d(getter, 'a', getter);\n         \t\treturn getter;\n         \t};\n         \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n         \t__webpack_require__.p = \"\";\n         \treturn __webpack_require__(__webpack_require__.s = 0);\n         })\n         ([\n      (function(module, exports, __webpack_require__) {\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\nvar mediaFile = __webpack_require__(1);\nvar oldIOS = typeof navigator !== 'undefined' && parseFloat(('' + (/CPU.*OS ([0-9_]{3,4})[0-9_]{0,1}|(CPU like).*AppleWebKit.*Mobile/i.exec(navigator.userAgent) || [0, ''])[1]).replace('undefined', '3_2').replace('_', '.').replace('_', '')) < 10 && !window.MSStream;\nvar NoSleep = function () {\n  function NoSleep() {\n    _classCallCheck(this, NoSleep);\n    if (oldIOS) {\n      this.noSleepTimer = null;\n    } else {\n      this.noSleepVideo = document.createElement('video');\n      this.noSleepVideo.setAttribute('playsinline', '');\n      this.noSleepVideo.setAttribute('src', mediaFile);\n      this.noSleepVideo.addEventListener('timeupdate', function (e) {\n        if (this.noSleepVideo.currentTime > 0.5) {\n          this.noSleepVideo.currentTime = Math.random();\n        }\n      }.bind(this));\n    }\n  }\n  _createClass(NoSleep, [{\n    key: 'enable',\n    value: function enable() {\n      if (oldIOS) {\n        this.disable();\n        this.noSleepTimer = window.setInterval(function () {\n          window.location.href = '/';\n          window.setTimeout(window.stop, 0);\n        }, 15000);\n      } else {\n        this.noSleepVideo.play();\n      }\n    }\n  }, {\n    key: 'disable',\n    value: function disable() {\n      if (oldIOS) {\n        if (this.noSleepTimer) {\n          window.clearInterval(this.noSleepTimer);\n          this.noSleepTimer = null;\n        }\n      } else {\n        this.noSleepVideo.pause();\n      }\n    }\n  }]);\n  return NoSleep;\n}();\nmodule.exports = NoSleep;\n      }),\n      (function(module, exports, __webpack_require__) {\nmodule.exports = 'data:video/mp4;base64,AAAAIGZ0eXBtcDQyAAACAGlzb21pc28yYXZjMW1wNDEAAAAIZnJlZQAACKBtZGF0AAAC8wYF///v3EXpvebZSLeWLNgg2SPu73gyNjQgLSBjb3JlIDE0MiByMjQ3OSBkZDc5YTYxIC0gSC4yNjQvTVBFRy00IEFWQyBjb2RlYyAtIENvcHlsZWZ0IDIwMDMtMjAxNCAtIGh0dHA6Ly93d3cudmlkZW9sYW4ub3JnL3gyNjQuaHRtbCAtIG9wdGlvbnM6IGNhYmFjPTEgcmVmPTEgZGVibG9jaz0xOjA6MCBhbmFseXNlPTB4MToweDExMSBtZT1oZXggc3VibWU9MiBwc3k9MSBwc3lfcmQ9MS4wMDowLjAwIG1peGVkX3JlZj0wIG1lX3JhbmdlPTE2IGNocm9tYV9tZT0xIHRyZWxsaXM9MCA4eDhkY3Q9MCBjcW09MCBkZWFkem9uZT0yMSwxMSBmYXN0X3Bza2lwPTEgY2hyb21hX3FwX29mZnNldD0wIHRocmVhZHM9NiBsb29rYWhlYWRfdGhyZWFkcz0xIHNsaWNlZF90aHJlYWRzPTAgbnI9MCBkZWNpbWF0ZT0xIGludGVybGFjZWQ9MCBibHVyYXlfY29tcGF0PTAgY29uc3RyYWluZWRfaW50cmE9MCBiZnJhbWVzPTMgYl9weXJhbWlkPTIgYl9hZGFwdD0xIGJfYmlhcz0wIGRpcmVjdD0xIHdlaWdodGI9MSBvcGVuX2dvcD0wIHdlaWdodHA9MSBrZXlpbnQ9MzAwIGtleWludF9taW49MzAgc2NlbmVjdXQ9NDAgaW50cmFfcmVmcmVzaD0wIHJjX2xvb2thaGVhZD0xMCByYz1jcmYgbWJ0cmVlPTEgY3JmPTIwLjAgcWNvbXA9MC42MCBxcG1pbj0wIHFwbWF4PTY5IHFwc3RlcD00IHZidl9tYXhyYXRlPTIwMDAwIHZidl9idWZzaXplPTI1MDAwIGNyZl9tYXg9MC4wIG5hbF9ocmQ9bm9uZSBmaWxsZXI9MCBpcF9yYXRpbz0xLjQwIGFxPTE6MS4wMACAAAAAOWWIhAA3//p+C7v8tDDSTjf97w55i3SbRPO4ZY+hkjD5hbkAkL3zpJ6h/LR1CAABzgB1kqqzUorlhQAAAAxBmiQYhn/+qZYADLgAAAAJQZ5CQhX/AAj5IQADQGgcIQADQGgcAAAACQGeYUQn/wALKCEAA0BoHAAAAAkBnmNEJ/8ACykhAANAaBwhAANAaBwAAAANQZpoNExDP/6plgAMuSEAA0BoHAAAAAtBnoZFESwr/wAI+SEAA0BoHCEAA0BoHAAAAAkBnqVEJ/8ACykhAANAaBwAAAAJAZ6nRCf/AAsoIQADQGgcIQADQGgcAAAADUGarDRMQz/+qZYADLghAANAaBwAAAALQZ7KRRUsK/8ACPkhAANAaBwAAAAJAZ7pRCf/AAsoIQADQGgcIQADQGgcAAAACQGe60Qn/wALKCEAA0BoHAAAAA1BmvA0TEM//qmWAAy5IQADQGgcIQADQGgcAAAAC0GfDkUVLCv/AAj5IQADQGgcAAAACQGfLUQn/wALKSEAA0BoHCEAA0BoHAAAAAkBny9EJ/8ACyghAANAaBwAAAANQZs0NExDP/6plgAMuCEAA0BoHAAAAAtBn1JFFSwr/wAI+SEAA0BoHCEAA0BoHAAAAAkBn3FEJ/8ACyghAANAaBwAAAAJAZ9zRCf/AAsoIQADQGgcIQADQGgcAAAADUGbeDRMQz/+qZYADLkhAANAaBwAAAALQZ+WRRUsK/8ACPghAANAaBwhAANAaBwAAAAJAZ+1RCf/AAspIQADQGgcAAAACQGft0Qn/wALKSEAA0BoHCEAA0BoHAAAAA1Bm7w0TEM//qmWAAy4IQADQGgcAAAAC0Gf2kUVLCv/AAj5IQADQGgcAAAACQGf+UQn/wALKCEAA0BoHCEAA0BoHAAAAAkBn/tEJ/8ACykhAANAaBwAAAANQZvgNExDP/6plgAMuSEAA0BoHCEAA0BoHAAAAAtBnh5FFSwr/wAI+CEAA0BoHAAAAAkBnj1EJ/8ACyghAANAaBwhAANAaBwAAAAJAZ4/RCf/AAspIQADQGgcAAAADUGaJDRMQz/+qZYADLghAANAaBwAAAALQZ5CRRUsK/8ACPkhAANAaBwhAANAaBwAAAAJAZ5hRCf/AAsoIQADQGgcAAAACQGeY0Qn/wALKSEAA0BoHCEAA0BoHAAAAA1Bmmg0TEM//qmWAAy5IQADQGgcAAAAC0GehkUVLCv/AAj5IQADQGgcIQADQGgcAAAACQGepUQn/wALKSEAA0BoHAAAAAkBnqdEJ/8ACyghAANAaBwAAAANQZqsNExDP/6plgAMuCEAA0BoHCEAA0BoHAAAAAtBnspFFSwr/wAI+SEAA0BoHAAAAAkBnulEJ/8ACyghAANAaBwhAANAaBwAAAAJAZ7rRCf/AAsoIQADQGgcAAAADUGa8DRMQz/+qZYADLkhAANAaBwhAANAaBwAAAALQZ8ORRUsK/8ACPkhAANAaBwAAAAJAZ8tRCf/AAspIQADQGgcIQADQGgcAAAACQGfL0Qn/wALKCEAA0BoHAAAAA1BmzQ0TEM//qmWAAy4IQADQGgcAAAAC0GfUkUVLCv/AAj5IQADQGgcIQADQGgcAAAACQGfcUQn/wALKCEAA0BoHAAAAAkBn3NEJ/8ACyghAANAaBwhAANAaBwAAAANQZt4NExC//6plgAMuSEAA0BoHAAAAAtBn5ZFFSwr/wAI+CEAA0BoHCEAA0BoHAAAAAkBn7VEJ/8ACykhAANAaBwAAAAJAZ+3RCf/AAspIQADQGgcAAAADUGbuzRMQn/+nhAAYsAhAANAaBwhAANAaBwAAAAJQZ/aQhP/AAspIQADQGgcAAAACQGf+UQn/wALKCEAA0BoHCEAA0BoHCEAA0BoHCEAA0BoHCEAA0BoHCEAA0BoHAAACiFtb292AAAAbG12aGQAAAAA1YCCX9WAgl8AAAPoAAAH/AABAAABAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAGGlvZHMAAAAAEICAgAcAT////v7/AAAF+XRyYWsAAABcdGtoZAAAAAPVgIJf1YCCXwAAAAEAAAAAAAAH0AAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAEAAAAAAygAAAMoAAAAAACRlZHRzAAAAHGVsc3QAAAAAAAAAAQAAB9AAABdwAAEAAAAABXFtZGlhAAAAIG1kaGQAAAAA1YCCX9WAgl8AAV+QAAK/IFXEAAAAAAAtaGRscgAAAAAAAAAAdmlkZQAAAAAAAAAAAAAAAFZpZGVvSGFuZGxlcgAAAAUcbWluZgAAABR2bWhkAAAAAQAAAAAAAAAAAAAAJGRpbmYAAAAcZHJlZgAAAAAAAAABAAAADHVybCAAAAABAAAE3HN0YmwAAACYc3RzZAAAAAAAAAABAAAAiGF2YzEAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAygDKAEgAAABIAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAY//8AAAAyYXZjQwFNQCj/4QAbZ01AKOyho3ySTUBAQFAAAAMAEAAr8gDxgxlgAQAEaO+G8gAAABhzdHRzAAAAAAAAAAEAAAA8AAALuAAAABRzdHNzAAAAAAAAAAEAAAABAAAB8GN0dHMAAAAAAAAAPAAAAAEAABdwAAAAAQAAOpgAAAABAAAXcAAAAAEAAAAAAAAAAQAAC7gAAAABAAA6mAAAAAEAABdwAAAAAQAAAAAAAAABAAALuAAAAAEAADqYAAAAAQAAF3AAAAABAAAAAAAAAAEAAAu4AAAAAQAAOpgAAAABAAAXcAAAAAEAAAAAAAAAAQAAC7gAAAABAAA6mAAAAAEAABdwAAAAAQAAAAAAAAABAAALuAAAAAEAADqYAAAAAQAAF3AAAAABAAAAAAAAAAEAAAu4AAAAAQAAOpgAAAABAAAXcAAAAAEAAAAAAAAAAQAAC7gAAAABAAA6mAAAAAEAABdwAAAAAQAAAAAAAAABAAALuAAAAAEAADqYAAAAAQAAF3AAAAABAAAAAAAAAAEAAAu4AAAAAQAAOpgAAAABAAAXcAAAAAEAAAAAAAAAAQAAC7gAAAABAAA6mAAAAAEAABdwAAAAAQAAAAAAAAABAAALuAAAAAEAADqYAAAAAQAAF3AAAAABAAAAAAAAAAEAAAu4AAAAAQAAOpgAAAABAAAXcAAAAAEAAAAAAAAAAQAAC7gAAAABAAA6mAAAAAEAABdwAAAAAQAAAAAAAAABAAALuAAAAAEAAC7gAAAAAQAAF3AAAAABAAAAAAAAABxzdHNjAAAAAAAAAAEAAAABAAAAAQAAAAEAAAEEc3RzegAAAAAAAAAAAAAAPAAAAzQAAAAQAAAADQAAAA0AAAANAAAAEQAAAA8AAAANAAAADQAAABEAAAAPAAAADQAAAA0AAAARAAAADwAAAA0AAAANAAAAEQAAAA8AAAANAAAADQAAABEAAAAPAAAADQAAAA0AAAARAAAADwAAAA0AAAANAAAAEQAAAA8AAAANAAAADQAAABEAAAAPAAAADQAAAA0AAAARAAAADwAAAA0AAAANAAAAEQAAAA8AAAANAAAADQAAABEAAAAPAAAADQAAAA0AAAARAAAADwAAAA0AAAANAAAAEQAAAA8AAAANAAAADQAAABEAAAANAAAADQAAAQBzdGNvAAAAAAAAADwAAAAwAAADZAAAA3QAAAONAAADoAAAA7kAAAPQAAAD6wAAA/4AAAQXAAAELgAABEMAAARcAAAEbwAABIwAAAShAAAEugAABM0AAATkAAAE/wAABRIAAAUrAAAFQgAABV0AAAVwAAAFiQAABaAAAAW1AAAFzgAABeEAAAX+AAAGEwAABiwAAAY/AAAGVgAABnEAAAaEAAAGnQAABrQAAAbPAAAG4gAABvUAAAcSAAAHJwAAB0AAAAdTAAAHcAAAB4UAAAeeAAAHsQAAB8gAAAfjAAAH9gAACA8AAAgmAAAIQQAACFQAAAhnAAAIhAAACJcAAAMsdHJhawAAAFx0a2hkAAAAA9WAgl/VgIJfAAAAAgAAAAAAAAf8AAAAAAAAAAAAAAABAQAAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAACsm1kaWEAAAAgbWRoZAAAAADVgIJf1YCCXwAArEQAAWAAVcQAAAAAACdoZGxyAAAAAAAAAABzb3VuAAAAAAAAAAAAAAAAU3RlcmVvAAAAAmNtaW5mAAAAEHNtaGQAAAAAAAAAAAAAACRkaW5mAAAAHGRyZWYAAAAAAAAAAQAAAAx1cmwgAAAAAQAAAidzdGJsAAAAZ3N0c2QAAAAAAAAAAQAAAFdtcDRhAAAAAAAAAAEAAAAAAAAAAAACABAAAAAArEQAAAAAADNlc2RzAAAAAAOAgIAiAAIABICAgBRAFQAAAAADDUAAAAAABYCAgAISEAaAgIABAgAAABhzdHRzAAAAAAAAAAEAAABYAAAEAAAAABxzdHNjAAAAAAAAAAEAAAABAAAAAQAAAAEAAAAUc3RzegAAAAAAAAAGAAAAWAAAAXBzdGNvAAAAAAAAAFgAAAOBAAADhwAAA5oAAAOtAAADswAAA8oAAAPfAAAD5QAAA/gAAAQLAAAEEQAABCgAAAQ9AAAEUAAABFYAAARpAAAEgAAABIYAAASbAAAErgAABLQAAATHAAAE3gAABPMAAAT5AAAFDAAABR8AAAUlAAAFPAAABVEAAAVXAAAFagAABX0AAAWDAAAFmgAABa8AAAXCAAAFyAAABdsAAAXyAAAF+AAABg0AAAYgAAAGJgAABjkAAAZQAAAGZQAABmsAAAZ+AAAGkQAABpcAAAauAAAGwwAABskAAAbcAAAG7wAABwYAAAcMAAAHIQAABzQAAAc6AAAHTQAAB2QAAAdqAAAHfwAAB5IAAAeYAAAHqwAAB8IAAAfXAAAH3QAAB/AAAAgDAAAICQAACCAAAAg1AAAIOwAACE4AAAhhAAAIeAAACH4AAAiRAAAIpAAACKoAAAiwAAAItgAACLwAAAjCAAAAFnVkdGEAAAAObmFtZVN0ZXJlbwAAAHB1ZHRhAAAAaG1ldGEAAAAAAAAAIWhkbHIAAAAAAAAAAG1kaXJhcHBsAAAAAAAAAAAAAAAAO2lsc3QAAAAzqXRvbwAAACtkYXRhAAAAAQAAAABIYW5kQnJha2UgMC4xMC4yIDIwMTUwNjExMDA=';\n      })\n         ]);\n});\n});\nvar NoSleep$1 = unwrapExports$$1(NoSleep);\nvar nextDisplayId = 1000;\nvar defaultLeftBounds = [0, 0, 0.5, 1];\nvar defaultRightBounds = [0.5, 0, 0.5, 1];\nvar raf = window.requestAnimationFrame;\nvar caf = window.cancelAnimationFrame;\nfunction VRFrameData() {\n  this.leftProjectionMatrix = new Float32Array(16);\n  this.leftViewMatrix = new Float32Array(16);\n  this.rightProjectionMatrix = new Float32Array(16);\n  this.rightViewMatrix = new Float32Array(16);\n  this.pose = null;\n}\nfunction VRDisplayCapabilities(config) {\n  Object.defineProperties(this, {\n    hasPosition: {\n      writable: false, enumerable: true, value: config.hasPosition\n    },\n    hasExternalDisplay: {\n      writable: false, enumerable: true, value: config.hasExternalDisplay\n    },\n    canPresent: {\n      writable: false, enumerable: true, value: config.canPresent\n    },\n    maxLayers: {\n      writable: false, enumerable: true, value: config.maxLayers\n    },\n    hasOrientation: {\n      enumerable: true, get: function get() {\n        deprecateWarning('VRDisplayCapabilities.prototype.hasOrientation', 'VRDisplay.prototype.getFrameData');\n        return config.hasOrientation;\n      }\n    }\n  });\n}\nfunction VRDisplay(config) {\n  config = config || {};\n  var USE_WAKELOCK = 'wakelock' in config ? config.wakelock : true;\n  this.isPolyfilled = true;\n  this.displayId = nextDisplayId++;\n  this.displayName = '';\n  this.depthNear = 0.01;\n  this.depthFar = 10000.0;\n  this.isPresenting = false;\n  Object.defineProperty(this, 'isConnected', {\n    get: function get() {\n      deprecateWarning('VRDisplay.prototype.isConnected', 'VRDisplayCapabilities.prototype.hasExternalDisplay');\n      return false;\n    }\n  });\n  this.capabilities = new VRDisplayCapabilities({\n    hasPosition: false,\n    hasOrientation: false,\n    hasExternalDisplay: false,\n    canPresent: false,\n    maxLayers: 1\n  });\n  this.stageParameters = null;\n  this.waitingForPresent_ = false;\n  this.layer_ = null;\n  this.originalParent_ = null;\n  this.fullscreenElement_ = null;\n  this.fullscreenWrapper_ = null;\n  this.fullscreenElementCachedStyle_ = null;\n  this.fullscreenEventTarget_ = null;\n  this.fullscreenChangeHandler_ = null;\n  this.fullscreenErrorHandler_ = null;\n  if (USE_WAKELOCK && isMobile()) {\n    this.wakelock_ = new NoSleep$1();\n  }\n}\nVRDisplay.prototype.getFrameData = function (frameData) {\n  return frameDataFromPose(frameData, this._getPose(), this);\n};\nVRDisplay.prototype.getPose = function () {\n  deprecateWarning('VRDisplay.prototype.getPose', 'VRDisplay.prototype.getFrameData');\n  return this._getPose();\n};\nVRDisplay.prototype.resetPose = function () {\n  deprecateWarning('VRDisplay.prototype.resetPose');\n  return this._resetPose();\n};\nVRDisplay.prototype.getImmediatePose = function () {\n  deprecateWarning('VRDisplay.prototype.getImmediatePose', 'VRDisplay.prototype.getFrameData');\n  return this._getPose();\n};\nVRDisplay.prototype.requestAnimationFrame = function (callback) {\n  return raf(callback);\n};\nVRDisplay.prototype.cancelAnimationFrame = function (id) {\n  return caf(id);\n};\nVRDisplay.prototype.wrapForFullscreen = function (element) {\n  if (isIOS()) {\n    return element;\n  }\n  if (!this.fullscreenWrapper_) {\n    this.fullscreenWrapper_ = document.createElement('div');\n    var cssProperties = ['height: ' + Math.min(screen.height, screen.width) + 'px !important', 'top: 0 !important', 'left: 0 !important', 'right: 0 !important', 'border: 0', 'margin: 0', 'padding: 0', 'z-index: 999999 !important', 'position: fixed'];\n    this.fullscreenWrapper_.setAttribute('style', cssProperties.join('; ') + ';');\n    this.fullscreenWrapper_.classList.add('webvr-polyfill-fullscreen-wrapper');\n  }\n  if (this.fullscreenElement_ == element) {\n    return this.fullscreenWrapper_;\n  }\n  if (this.fullscreenElement_) {\n    if (this.originalParent_) {\n      this.originalParent_.appendChild(this.fullscreenElement_);\n    } else {\n      this.fullscreenElement_.parentElement.removeChild(this.fullscreenElement_);\n    }\n  }\n  this.fullscreenElement_ = element;\n  this.originalParent_ = element.parentElement;\n  if (!this.originalParent_) {\n    document.body.appendChild(element);\n  }\n  if (!this.fullscreenWrapper_.parentElement) {\n    var parent = this.fullscreenElement_.parentElement;\n    parent.insertBefore(this.fullscreenWrapper_, this.fullscreenElement_);\n    parent.removeChild(this.fullscreenElement_);\n  }\n  this.fullscreenWrapper_.insertBefore(this.fullscreenElement_, this.fullscreenWrapper_.firstChild);\n  this.fullscreenElementCachedStyle_ = this.fullscreenElement_.getAttribute('style');\n  var self = this;\n  function applyFullscreenElementStyle() {\n    if (!self.fullscreenElement_) {\n      return;\n    }\n    var cssProperties = ['position: absolute', 'top: 0', 'left: 0', 'width: ' + Math.max(screen.width, screen.height) + 'px', 'height: ' + Math.min(screen.height, screen.width) + 'px', 'border: 0', 'margin: 0', 'padding: 0'];\n    self.fullscreenElement_.setAttribute('style', cssProperties.join('; ') + ';');\n  }\n  applyFullscreenElementStyle();\n  return this.fullscreenWrapper_;\n};\nVRDisplay.prototype.removeFullscreenWrapper = function () {\n  if (!this.fullscreenElement_) {\n    return;\n  }\n  var element = this.fullscreenElement_;\n  if (this.fullscreenElementCachedStyle_) {\n    element.setAttribute('style', this.fullscreenElementCachedStyle_);\n  } else {\n    element.removeAttribute('style');\n  }\n  this.fullscreenElement_ = null;\n  this.fullscreenElementCachedStyle_ = null;\n  var parent = this.fullscreenWrapper_.parentElement;\n  this.fullscreenWrapper_.removeChild(element);\n  if (this.originalParent_ === parent) {\n    parent.insertBefore(element, this.fullscreenWrapper_);\n  }\n  else if (this.originalParent_) {\n      this.originalParent_.appendChild(element);\n    }\n  parent.removeChild(this.fullscreenWrapper_);\n  return element;\n};\nVRDisplay.prototype.requestPresent = function (layers) {\n  var wasPresenting = this.isPresenting;\n  var self = this;\n  if (!(layers instanceof Array)) {\n    deprecateWarning('VRDisplay.prototype.requestPresent with non-array argument', 'an array of VRLayers as the first argument');\n    layers = [layers];\n  }\n  return new Promise(function (resolve, reject) {\n    if (!self.capabilities.canPresent) {\n      reject(new Error('VRDisplay is not capable of presenting.'));\n      return;\n    }\n    if (layers.length == 0 || layers.length > self.capabilities.maxLayers) {\n      reject(new Error('Invalid number of layers.'));\n      return;\n    }\n    var incomingLayer = layers[0];\n    if (!incomingLayer.source) {\n      resolve();\n      return;\n    }\n    var leftBounds = incomingLayer.leftBounds || defaultLeftBounds;\n    var rightBounds = incomingLayer.rightBounds || defaultRightBounds;\n    if (wasPresenting) {\n      var layer = self.layer_;\n      if (layer.source !== incomingLayer.source) {\n        layer.source = incomingLayer.source;\n      }\n      for (var i = 0; i < 4; i++) {\n        layer.leftBounds[i] = leftBounds[i];\n        layer.rightBounds[i] = rightBounds[i];\n      }\n      self.wrapForFullscreen(self.layer_.source);\n      self.updatePresent_();\n      resolve();\n      return;\n    }\n    self.layer_ = {\n      predistorted: incomingLayer.predistorted,\n      source: incomingLayer.source,\n      leftBounds: leftBounds.slice(0),\n      rightBounds: rightBounds.slice(0)\n    };\n    self.waitingForPresent_ = false;\n    if (self.layer_ && self.layer_.source) {\n      var fullscreenElement = self.wrapForFullscreen(self.layer_.source);\n      var onFullscreenChange = function onFullscreenChange() {\n        var actualFullscreenElement = getFullscreenElement();\n        self.isPresenting = fullscreenElement === actualFullscreenElement;\n        if (self.isPresenting) {\n          if (screen.orientation && screen.orientation.lock) {\n            screen.orientation.lock('landscape-primary').catch(function (error) {\n              console.error('screen.orientation.lock() failed due to', error.message);\n            });\n          }\n          self.waitingForPresent_ = false;\n          self.beginPresent_();\n          resolve();\n        } else {\n          if (screen.orientation && screen.orientation.unlock) {\n            screen.orientation.unlock();\n          }\n          self.removeFullscreenWrapper();\n          self.disableWakeLock();\n          self.endPresent_();\n          self.removeFullscreenListeners_();\n        }\n        self.fireVRDisplayPresentChange_();\n      };\n      var onFullscreenError = function onFullscreenError() {\n        if (!self.waitingForPresent_) {\n          return;\n        }\n        self.removeFullscreenWrapper();\n        self.removeFullscreenListeners_();\n        self.disableWakeLock();\n        self.waitingForPresent_ = false;\n        self.isPresenting = false;\n        reject(new Error('Unable to present.'));\n      };\n      self.addFullscreenListeners_(fullscreenElement, onFullscreenChange, onFullscreenError);\n      if (requestFullscreen(fullscreenElement)) {\n        self.enableWakeLock();\n        self.waitingForPresent_ = true;\n      } else if (isIOS() || isWebViewAndroid()) {\n        self.enableWakeLock();\n        self.isPresenting = true;\n        self.beginPresent_();\n        self.fireVRDisplayPresentChange_();\n        resolve();\n      }\n    }\n    if (!self.waitingForPresent_ && !isIOS()) {\n      exitFullscreen();\n      reject(new Error('Unable to present.'));\n    }\n  });\n};\nVRDisplay.prototype.exitPresent = function () {\n  var wasPresenting = this.isPresenting;\n  var self = this;\n  this.isPresenting = false;\n  this.layer_ = null;\n  this.disableWakeLock();\n  return new Promise(function (resolve, reject) {\n    if (wasPresenting) {\n      if (!exitFullscreen() && isIOS()) {\n        self.endPresent_();\n        self.fireVRDisplayPresentChange_();\n      }\n      if (isWebViewAndroid()) {\n        self.removeFullscreenWrapper();\n        self.removeFullscreenListeners_();\n        self.endPresent_();\n        self.fireVRDisplayPresentChange_();\n      }\n      resolve();\n    } else {\n      reject(new Error('Was not presenting to VRDisplay.'));\n    }\n  });\n};\nVRDisplay.prototype.getLayers = function () {\n  if (this.layer_) {\n    return [this.layer_];\n  }\n  return [];\n};\nVRDisplay.prototype.fireVRDisplayPresentChange_ = function () {\n  var event = new CustomEvent('vrdisplaypresentchange', { detail: { display: this } });\n  window.dispatchEvent(event);\n};\nVRDisplay.prototype.fireVRDisplayConnect_ = function () {\n  var event = new CustomEvent('vrdisplayconnect', { detail: { display: this } });\n  window.dispatchEvent(event);\n};\nVRDisplay.prototype.addFullscreenListeners_ = function (element, changeHandler, errorHandler) {\n  this.removeFullscreenListeners_();\n  this.fullscreenEventTarget_ = element;\n  this.fullscreenChangeHandler_ = changeHandler;\n  this.fullscreenErrorHandler_ = errorHandler;\n  if (changeHandler) {\n    if (document.fullscreenEnabled) {\n      element.addEventListener('fullscreenchange', changeHandler, false);\n    } else if (document.webkitFullscreenEnabled) {\n      element.addEventListener('webkitfullscreenchange', changeHandler, false);\n    } else if (document.mozFullScreenEnabled) {\n      document.addEventListener('mozfullscreenchange', changeHandler, false);\n    } else if (document.msFullscreenEnabled) {\n      element.addEventListener('msfullscreenchange', changeHandler, false);\n    }\n  }\n  if (errorHandler) {\n    if (document.fullscreenEnabled) {\n      element.addEventListener('fullscreenerror', errorHandler, false);\n    } else if (document.webkitFullscreenEnabled) {\n      element.addEventListener('webkitfullscreenerror', errorHandler, false);\n    } else if (document.mozFullScreenEnabled) {\n      document.addEventListener('mozfullscreenerror', errorHandler, false);\n    } else if (document.msFullscreenEnabled) {\n      element.addEventListener('msfullscreenerror', errorHandler, false);\n    }\n  }\n};\nVRDisplay.prototype.removeFullscreenListeners_ = function () {\n  if (!this.fullscreenEventTarget_) return;\n  var element = this.fullscreenEventTarget_;\n  if (this.fullscreenChangeHandler_) {\n    var changeHandler = this.fullscreenChangeHandler_;\n    element.removeEventListener('fullscreenchange', changeHandler, false);\n    element.removeEventListener('webkitfullscreenchange', changeHandler, false);\n    document.removeEventListener('mozfullscreenchange', changeHandler, false);\n    element.removeEventListener('msfullscreenchange', changeHandler, false);\n  }\n  if (this.fullscreenErrorHandler_) {\n    var errorHandler = this.fullscreenErrorHandler_;\n    element.removeEventListener('fullscreenerror', errorHandler, false);\n    element.removeEventListener('webkitfullscreenerror', errorHandler, false);\n    document.removeEventListener('mozfullscreenerror', errorHandler, false);\n    element.removeEventListener('msfullscreenerror', errorHandler, false);\n  }\n  this.fullscreenEventTarget_ = null;\n  this.fullscreenChangeHandler_ = null;\n  this.fullscreenErrorHandler_ = null;\n};\nVRDisplay.prototype.enableWakeLock = function () {\n  if (this.wakelock_) {\n    this.wakelock_.enable();\n  }\n};\nVRDisplay.prototype.disableWakeLock = function () {\n  if (this.wakelock_) {\n    this.wakelock_.disable();\n  }\n};\nVRDisplay.prototype.beginPresent_ = function () {\n};\nVRDisplay.prototype.endPresent_ = function () {\n};\nVRDisplay.prototype.submitFrame = function (pose) {\n};\nVRDisplay.prototype.getEyeParameters = function (whichEye) {\n  return null;\n};\nvar config = {\n  ADDITIONAL_VIEWERS: [],\n  DEFAULT_VIEWER: '',\n  MOBILE_WAKE_LOCK: true,\n  DEBUG: false,\n  DPDB_URL: 'https://dpdb.webvr.rocks/dpdb.json',\n  K_FILTER: 0.98,\n  PREDICTION_TIME_S: 0.040,\n  CARDBOARD_UI_DISABLED: false,\n  ROTATE_INSTRUCTIONS_DISABLED: false,\n  YAW_ONLY: false,\n  BUFFER_SCALE: 0.5,\n  DIRTY_SUBMIT_FRAME_BINDINGS: false\n};\nvar Eye = {\n  LEFT: 'left',\n  RIGHT: 'right'\n};\nfunction CardboardVRDisplay(config$$1) {\n  var defaults = extend({}, config);\n  config$$1 = extend(defaults, config$$1 || {});\n  VRDisplay.call(this, {\n    wakelock: config$$1.MOBILE_WAKE_LOCK\n  });\n  this.config = config$$1;\n  this.displayName = 'Cardboard VRDisplay';\n  this.capabilities = new VRDisplayCapabilities({\n    hasPosition: false,\n    hasOrientation: true,\n    hasExternalDisplay: false,\n    canPresent: true,\n    maxLayers: 1\n  });\n  this.stageParameters = null;\n  this.bufferScale_ = this.config.BUFFER_SCALE;\n  this.poseSensor_ = new PoseSensor(this.config);\n  this.distorter_ = null;\n  this.cardboardUI_ = null;\n  this.dpdb_ = new Dpdb(this.config.DPDB_URL, this.onDeviceParamsUpdated_.bind(this));\n  this.deviceInfo_ = new DeviceInfo(this.dpdb_.getDeviceParams(), config$$1.ADDITIONAL_VIEWERS);\n  this.viewerSelector_ = new ViewerSelector(config$$1.DEFAULT_VIEWER);\n  this.viewerSelector_.onChange(this.onViewerChanged_.bind(this));\n  this.deviceInfo_.setViewer(this.viewerSelector_.getCurrentViewer());\n  if (!this.config.ROTATE_INSTRUCTIONS_DISABLED) {\n    this.rotateInstructions_ = new RotateInstructions();\n  }\n  if (isIOS()) {\n    window.addEventListener('resize', this.onResize_.bind(this));\n  }\n}\nCardboardVRDisplay.prototype = Object.create(VRDisplay.prototype);\nCardboardVRDisplay.prototype._getPose = function () {\n  return {\n    position: null,\n    orientation: this.poseSensor_.getOrientation(),\n    linearVelocity: null,\n    linearAcceleration: null,\n    angularVelocity: null,\n    angularAcceleration: null\n  };\n};\nCardboardVRDisplay.prototype._resetPose = function () {\n  if (this.poseSensor_.resetPose) {\n    this.poseSensor_.resetPose();\n  }\n};\nCardboardVRDisplay.prototype._getFieldOfView = function (whichEye) {\n  var fieldOfView;\n  if (whichEye == Eye.LEFT) {\n    fieldOfView = this.deviceInfo_.getFieldOfViewLeftEye();\n  } else if (whichEye == Eye.RIGHT) {\n    fieldOfView = this.deviceInfo_.getFieldOfViewRightEye();\n  } else {\n    console.error('Invalid eye provided: %s', whichEye);\n    return null;\n  }\n  return fieldOfView;\n};\nCardboardVRDisplay.prototype._getEyeOffset = function (whichEye) {\n  var offset;\n  if (whichEye == Eye.LEFT) {\n    offset = [-this.deviceInfo_.viewer.interLensDistance * 0.5, 0.0, 0.0];\n  } else if (whichEye == Eye.RIGHT) {\n    offset = [this.deviceInfo_.viewer.interLensDistance * 0.5, 0.0, 0.0];\n  } else {\n    console.error('Invalid eye provided: %s', whichEye);\n    return null;\n  }\n  return offset;\n};\nCardboardVRDisplay.prototype.getEyeParameters = function (whichEye) {\n  var offset = this._getEyeOffset(whichEye);\n  var fieldOfView = this._getFieldOfView(whichEye);\n  var eyeParams = {\n    offset: offset,\n    renderWidth: this.deviceInfo_.device.width * 0.5 * this.bufferScale_,\n    renderHeight: this.deviceInfo_.device.height * this.bufferScale_\n  };\n  Object.defineProperty(eyeParams, 'fieldOfView', {\n    enumerable: true,\n    get: function get() {\n      deprecateWarning('VRFieldOfView', 'VRFrameData\\'s projection matrices');\n      return fieldOfView;\n    }\n  });\n  return eyeParams;\n};\nCardboardVRDisplay.prototype.onDeviceParamsUpdated_ = function (newParams) {\n  if (this.config.DEBUG) {\n    console.log('DPDB reported that device params were updated.');\n  }\n  this.deviceInfo_.updateDeviceParams(newParams);\n  if (this.distorter_) {\n    this.distorter_.updateDeviceInfo(this.deviceInfo_);\n  }\n};\nCardboardVRDisplay.prototype.updateBounds_ = function () {\n  if (this.layer_ && this.distorter_ && (this.layer_.leftBounds || this.layer_.rightBounds)) {\n    this.distorter_.setTextureBounds(this.layer_.leftBounds, this.layer_.rightBounds);\n  }\n};\nCardboardVRDisplay.prototype.beginPresent_ = function () {\n  var gl = this.layer_.source.getContext('webgl');\n  if (!gl) gl = this.layer_.source.getContext('experimental-webgl');\n  if (!gl) gl = this.layer_.source.getContext('webgl2');\n  if (!gl) return;\n  if (this.layer_.predistorted) {\n    if (!this.config.CARDBOARD_UI_DISABLED) {\n      gl.canvas.width = getScreenWidth() * this.bufferScale_;\n      gl.canvas.height = getScreenHeight() * this.bufferScale_;\n      this.cardboardUI_ = new CardboardUI(gl);\n    }\n  } else {\n    if (!this.config.CARDBOARD_UI_DISABLED) {\n      this.cardboardUI_ = new CardboardUI(gl);\n    }\n    this.distorter_ = new CardboardDistorter(gl, this.cardboardUI_, this.config.BUFFER_SCALE, this.config.DIRTY_SUBMIT_FRAME_BINDINGS);\n    this.distorter_.updateDeviceInfo(this.deviceInfo_);\n  }\n  if (this.cardboardUI_) {\n    this.cardboardUI_.listen(function (e) {\n      this.viewerSelector_.show(this.layer_.source.parentElement);\n      e.stopPropagation();\n      e.preventDefault();\n    }.bind(this), function (e) {\n      this.exitPresent();\n      e.stopPropagation();\n      e.preventDefault();\n    }.bind(this));\n  }\n  if (this.rotateInstructions_) {\n    if (isLandscapeMode() && isMobile()) {\n      this.rotateInstructions_.showTemporarily(3000, this.layer_.source.parentElement);\n    } else {\n      this.rotateInstructions_.update();\n    }\n  }\n  this.orientationHandler = this.onOrientationChange_.bind(this);\n  window.addEventListener('orientationchange', this.orientationHandler);\n  this.vrdisplaypresentchangeHandler = this.updateBounds_.bind(this);\n  window.addEventListener('vrdisplaypresentchange', this.vrdisplaypresentchangeHandler);\n  this.fireVRDisplayDeviceParamsChange_();\n};\nCardboardVRDisplay.prototype.endPresent_ = function () {\n  if (this.distorter_) {\n    this.distorter_.destroy();\n    this.distorter_ = null;\n  }\n  if (this.cardboardUI_) {\n    this.cardboardUI_.destroy();\n    this.cardboardUI_ = null;\n  }\n  if (this.rotateInstructions_) {\n    this.rotateInstructions_.hide();\n  }\n  this.viewerSelector_.hide();\n  window.removeEventListener('orientationchange', this.orientationHandler);\n  window.removeEventListener('vrdisplaypresentchange', this.vrdisplaypresentchangeHandler);\n};\nCardboardVRDisplay.prototype.updatePresent_ = function () {\n  this.endPresent_();\n  this.beginPresent_();\n};\nCardboardVRDisplay.prototype.submitFrame = function (pose) {\n  if (this.distorter_) {\n    this.updateBounds_();\n    this.distorter_.submitFrame();\n  } else if (this.cardboardUI_ && this.layer_) {\n    var gl = this.layer_.source.getContext('webgl');\n    if (!gl) gl = this.layer_.source.getContext('experimental-webgl');\n    if (!gl) gl = this.layer_.source.getContext('webgl2');\n    var canvas = gl.canvas;\n    if (canvas.width != this.lastWidth || canvas.height != this.lastHeight) {\n      this.cardboardUI_.onResize();\n    }\n    this.lastWidth = canvas.width;\n    this.lastHeight = canvas.height;\n    this.cardboardUI_.render();\n  }\n};\nCardboardVRDisplay.prototype.onOrientationChange_ = function (e) {\n  this.viewerSelector_.hide();\n  if (this.rotateInstructions_) {\n    this.rotateInstructions_.update();\n  }\n  this.onResize_();\n};\nCardboardVRDisplay.prototype.onResize_ = function (e) {\n  if (this.layer_) {\n    var gl = this.layer_.source.getContext('webgl');\n    if (!gl) gl = this.layer_.source.getContext('experimental-webgl');\n    if (!gl) gl = this.layer_.source.getContext('webgl2');\n    var cssProperties = ['position: absolute', 'top: 0', 'left: 0',\n    'width: 100vw', 'height: 100vh', 'border: 0', 'margin: 0',\n    'padding: 0px', 'box-sizing: content-box'];\n    gl.canvas.setAttribute('style', cssProperties.join('; ') + ';');\n    safariCssSizeWorkaround(gl.canvas);\n  }\n};\nCardboardVRDisplay.prototype.onViewerChanged_ = function (viewer) {\n  this.deviceInfo_.setViewer(viewer);\n  if (this.distorter_) {\n    this.distorter_.updateDeviceInfo(this.deviceInfo_);\n  }\n  this.fireVRDisplayDeviceParamsChange_();\n};\nCardboardVRDisplay.prototype.fireVRDisplayDeviceParamsChange_ = function () {\n  var event = new CustomEvent('vrdisplaydeviceparamschange', {\n    detail: {\n      vrdisplay: this,\n      deviceInfo: this.deviceInfo_\n    }\n  });\n  window.dispatchEvent(event);\n};\nCardboardVRDisplay.VRFrameData = VRFrameData;\nCardboardVRDisplay.VRDisplay = VRDisplay;\nreturn CardboardVRDisplay;\n})));\n});\nvar CardboardVRDisplay = unwrapExports(cardboardVrDisplay);\n\nvar version = \"0.10.12\";\n\nvar DefaultConfig = {\n  ADDITIONAL_VIEWERS: [],\n  DEFAULT_VIEWER: '',\n  PROVIDE_MOBILE_VRDISPLAY: true,\n  MOBILE_WAKE_LOCK: true,\n  DEBUG: false,\n  DPDB_URL: 'https://dpdb.webvr.rocks/dpdb.json',\n  K_FILTER: 0.98,\n  PREDICTION_TIME_S: 0.040,\n  CARDBOARD_UI_DISABLED: false,\n  ROTATE_INSTRUCTIONS_DISABLED: false,\n  YAW_ONLY: false,\n  BUFFER_SCALE: 0.5,\n  DIRTY_SUBMIT_FRAME_BINDINGS: false\n};\n\nfunction WebVRPolyfill(config) {\n  this.config = extend(extend({}, DefaultConfig), config);\n  this.polyfillDisplays = [];\n  this.enabled = false;\n  this.hasNative = 'getVRDisplays' in navigator;\n  this.native = {};\n  this.native.getVRDisplays = navigator.getVRDisplays;\n  this.native.VRFrameData = window.VRFrameData;\n  this.native.VRDisplay = window.VRDisplay;\n  if (!this.hasNative || this.config.PROVIDE_MOBILE_VRDISPLAY && isMobile()) {\n    this.enable();\n    this.getVRDisplays().then(function (displays) {\n      if (displays && displays[0] && displays[0].fireVRDisplayConnect_) {\n        displays[0].fireVRDisplayConnect_();\n      }\n    });\n  }\n}\nWebVRPolyfill.prototype.getPolyfillDisplays = function () {\n  if (this._polyfillDisplaysPopulated) {\n    return this.polyfillDisplays;\n  }\n  if (isMobile()) {\n    var vrDisplay = new CardboardVRDisplay({\n      ADDITIONAL_VIEWERS: this.config.ADDITIONAL_VIEWERS,\n      DEFAULT_VIEWER: this.config.DEFAULT_VIEWER,\n      MOBILE_WAKE_LOCK: this.config.MOBILE_WAKE_LOCK,\n      DEBUG: this.config.DEBUG,\n      DPDB_URL: this.config.DPDB_URL,\n      CARDBOARD_UI_DISABLED: this.config.CARDBOARD_UI_DISABLED,\n      K_FILTER: this.config.K_FILTER,\n      PREDICTION_TIME_S: this.config.PREDICTION_TIME_S,\n      ROTATE_INSTRUCTIONS_DISABLED: this.config.ROTATE_INSTRUCTIONS_DISABLED,\n      YAW_ONLY: this.config.YAW_ONLY,\n      BUFFER_SCALE: this.config.BUFFER_SCALE,\n      DIRTY_SUBMIT_FRAME_BINDINGS: this.config.DIRTY_SUBMIT_FRAME_BINDINGS\n    });\n    this.polyfillDisplays.push(vrDisplay);\n  }\n  this._polyfillDisplaysPopulated = true;\n  return this.polyfillDisplays;\n};\nWebVRPolyfill.prototype.enable = function () {\n  this.enabled = true;\n  if (this.hasNative && this.native.VRFrameData) {\n    var NativeVRFrameData = this.native.VRFrameData;\n    var nativeFrameData = new this.native.VRFrameData();\n    var nativeGetFrameData = this.native.VRDisplay.prototype.getFrameData;\n    window.VRDisplay.prototype.getFrameData = function (frameData) {\n      if (frameData instanceof NativeVRFrameData) {\n        nativeGetFrameData.call(this, frameData);\n        return;\n      }\n      nativeGetFrameData.call(this, nativeFrameData);\n      frameData.pose = nativeFrameData.pose;\n      copyArray(nativeFrameData.leftProjectionMatrix, frameData.leftProjectionMatrix);\n      copyArray(nativeFrameData.rightProjectionMatrix, frameData.rightProjectionMatrix);\n      copyArray(nativeFrameData.leftViewMatrix, frameData.leftViewMatrix);\n      copyArray(nativeFrameData.rightViewMatrix, frameData.rightViewMatrix);\n    };\n  }\n  navigator.getVRDisplays = this.getVRDisplays.bind(this);\n  window.VRDisplay = CardboardVRDisplay.VRDisplay;\n  window.VRFrameData = CardboardVRDisplay.VRFrameData;\n};\nWebVRPolyfill.prototype.getVRDisplays = function () {\n  var _this = this;\n  var config = this.config;\n  if (!this.hasNative) {\n    return Promise.resolve(this.getPolyfillDisplays());\n  }\n  return this.native.getVRDisplays.call(navigator).then(function (nativeDisplays) {\n    return nativeDisplays.length > 0 ? nativeDisplays : _this.getPolyfillDisplays();\n  });\n};\nWebVRPolyfill.version = version;\nWebVRPolyfill.VRFrameData = CardboardVRDisplay.VRFrameData;\nWebVRPolyfill.VRDisplay = CardboardVRDisplay.VRDisplay;\n\n\nvar webvrPolyfill = Object.freeze({\n\tdefault: WebVRPolyfill\n});\n\nvar require$$0 = ( webvrPolyfill && WebVRPolyfill ) || webvrPolyfill;\n\nif (typeof commonjsGlobal !== 'undefined' && commonjsGlobal.window) {\n  if (!commonjsGlobal.document) {\n    commonjsGlobal.document = commonjsGlobal.window.document;\n  }\n  if (!commonjsGlobal.navigator) {\n    commonjsGlobal.navigator = commonjsGlobal.window.navigator;\n  }\n}\nvar src = require$$0;\n\nreturn src;\n\n})));\n"
  },
  {
    "path": "examples/libs/zstddec.module.js",
    "content": "let A,I,B;const g={env:{emscripten_notify_memory_growth:function(A){B=new Uint8Array(I.exports.memory.buffer)}}};class Q{init(){return A||(A=\"undefined\"!=typeof fetch?fetch(\"data:application/wasm;base64,\"+C).then(A=>A.arrayBuffer()).then(A=>WebAssembly.instantiate(A,g)).then(this._init):WebAssembly.instantiate(Buffer.from(C,\"base64\"),g).then(this._init),A)}_init(A){I=A.instance,g.env.emscripten_notify_memory_growth(0)}decode(A,g=0){if(!I)throw new Error(\"ZSTDDecoder: Await .init() before decoding.\");const Q=A.byteLength,C=I.exports.malloc(Q);B.set(A,C),g=g||Number(I.exports.ZSTD_findDecompressedSize(C,Q));const E=I.exports.malloc(g),i=I.exports.ZSTD_decompress(E,g,C,Q),D=B.slice(E,E+i);return I.exports.free(C),I.exports.free(E),D}}const C=\"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IAMNACAEQQNxBEADQCACRQ0FIAAgAkF/aiICaiIDIAEgAmotAAA6AAAgA0EDcQ0ACwsgAkEDTQ0AA0AgACACQXxqIgJqIAEgAmooAgA2AgAgAkEDSw0ACwsgAkUNAgNAIAAgAkF/aiICaiABIAJqLQAAOgAAIAINAAsMAgsgAkEDTQ0AIAIhBANAIAMgASgCADYCACABQQRqIQEgA0EEaiEDIARBfGoiBEEDSw0ACyACQQNxIQILIAJFDQADQCADIAEtAAA6AAAgA0EBaiEDIAFBAWohASACQX9qIgINAAsLIAAL8wICAn8BfgJAIAJFDQAgACACaiIDQX9qIAE6AAAgACABOgAAIAJBA0kNACADQX5qIAE6AAAgACABOgABIANBfWogAToAACAAIAE6AAIgAkEHSQ0AIANBfGogAToAACAAIAE6AAMgAkEJSQ0AIABBACAAa0EDcSIEaiIDIAFB/wFxQYGChAhsIgE2AgAgAyACIARrQXxxIgRqIgJBfGogATYCACAEQQlJDQAgAyABNgIIIAMgATYCBCACQXhqIAE2AgAgAkF0aiABNgIAIARBGUkNACADIAE2AhggAyABNgIUIAMgATYCECADIAE2AgwgAkFwaiABNgIAIAJBbGogATYCACACQWhqIAE2AgAgAkFkaiABNgIAIAQgA0EEcUEYciIEayICQSBJDQAgAa0iBUIghiAFhCEFIAMgBGohAQNAIAEgBTcDGCABIAU3AxAgASAFNwMIIAEgBTcDACABQSBqIQEgAkFgaiICQR9LDQALCyAACy8BAn8gACgCBCAAKAIAQQJ0aiICLQACIQMgACACLwEAIAEgAi0AAxAIajYCACADCy8BAn8gACgCBCAAKAIAQQJ0aiICLQACIQMgACACLwEAIAEgAi0AAxAFajYCACADCx8AIAAgASACKAIEEAg2AgAgARAEGiAAIAJBCGo2AgQLCAAgAGdBH3MLugUBDX8jAEEQayIKJAACfyAEQQNNBEAgCkEANgIMIApBDGogAyAEEAsaIAAgASACIApBDGpBBBAVIgBBbCAAEAMbIAAgACAESxsMAQsgAEEAIAEoAgBBAXRBAmoQECENQVQgAygAACIGQQ9xIgBBCksNABogAiAAQQVqNgIAIAMgBGoiAkF8aiEMIAJBeWohDiACQXtqIRAgAEEGaiELQQQh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ASIDNgLE4AEgACgCvOABIQQgACABNgK84AEgACABIAJqNgK44AEgACABIAQgA2tqNgLA4AELpgEBAX8gACAAKALs4QEQFjYCyOABIABCADcD+OABIABCADcDuOABIABBwOABakIANwMAIABBqNAAaiIBQYyAgOAANgIAIABBADYCmOIBIABCADcDiOEBIABCAzcDgOEBIABBrNABakHgEikCADcCACAAQbTQAWpB6BIoAgA2AgAgACABNgIMIAAgAEGYIGo2AgggACAAQaAwajYCBCAAIABBEGo2AgALYQEBf0G4fyEDAkAgAUEDSQ0AIAIgABAhIgFBA3YiADYCCCACIAFBAXE2AgQgAiABQQF2QQNxIgM2AgACQCADQX9qIgFBAksNAAJAIAFBAWsOAgEAAgtBbA8LIAAhAwsgAwsMACAAIAEgAkEAEC4LiAQCA38CfiADEBYhBCAAQQBBKBAQIQAgBCACSwRAIAQPCyABRQRAQX8PCwJAAkAgA0EBRg0AIAEoAAAiBkGo6r5pRg0AQXYhAyAGQXBxQdDUtMIBRw0BQQghAyACQQhJDQEgAEEAQSgQECEAIAEoAAQhASAAQQE2AhQgACABrTcDAEEADwsgASACIAMQLyIDIAJLDQAgACADNgIYQXIhAyABIARqIgVBf2otAAAiAkEIcQ0AIAJBIHEiBkUEQEFwIQMgBS0AACIFQacBSw0BIAVBB3GtQgEgBUEDdkEKaq2GIgdCA4h+IAd8IQggBEEBaiEECyACQQZ2IQMgAkECdiEFAkAgAkEDcUF/aiICQQJLBEBBACECDAELAkACQAJAIAJBAWsOAgECAAsgASAEai0AACECIARBAWohBAwCCyABIARqLwAAIQIgBEECaiEEDAELIAEgBGooAAAhAiAEQQRqIQQLIAVBAXEhBQJ+AkACQAJAIANBf2oiA0ECTQRAIANBAWsOAgIDAQtCfyAGRQ0DGiABIARqMQAADAMLIAEgBGovAACtQoACfAwCCyABIARqKAAArQwBCyABIARqKQAACyEHIAAgBTYCICAAIAI2AhwgACAHNwMAQQAhAyAAQQA2AhQgACAHIAggBhsiBzcDCCAAIAdCgIAIIAdCgIAIVBs+AhALIAMLWwEBf0G4fyEDIAIQFiICIAFNBH8gACACakF/ai0AACIAQQNxQQJ0QaAeaigC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C0Egak8NAQsgByAHKQNoNwMQIAcgBykDYDcDCCAEIA0gB0EIaiAHQdwAaiAPIA4gESAQEB4hCwwBCyACIARqIQggBCAKEAcgAkERTwRAIARBEGohAgNAIAIgCkEQaiIKEAcgAkEQaiICIAhJDQALCyAIIAlrIQIgByATNgJcIAkgCCAOa0sEQCAJIAggEWtLBEBBbCELDAILIBAgAiAOayICaiIKIANqIBBNBEAgCCAKIAMQDxoMAgsgCCAKQQAgAmsQDyEIIAcgAiADaiIDNgJkIAggAmshCCAOIQILIAlBEE8EQCADIAhqIQMDQCAIIAIQByACQRBqIQIgCEEQaiIIIANJDQALDAELAkAgCUEHTQRAIAggAi0AADoAACAIIAItAAE6AAEgCCACLQACOgACIAggAi0AAzoAAyAIQQRqIAIgCUECdCIDQcAeaigCAGoiAhAXIAIgA0HgHmooAgBrIQIgBygCZCEDDAELIAggAhAMCyADQQlJDQAgAyAIaiEDIAhBCGoiCCACQQhqIgJrQQ9MBEADQCAIIAIQDCACQQhqIQIgCEEIaiIIIANJDQAMAgALAAsDQCAIIAIQByACQRBqIQIgCEEQaiIIIANJDQALCyAHQRhqEAQaIAsgDCALEAMiAhshDCAEIAQgC2ogAhshBCAFQX9qIgUNAAsgDBADDQFBbCEMIAdBGGoQBEECSQ0BQQAhCANAIAhBA0cEQCAAIAhBAnQiAmpBrNABaiACIAdqKAJENgIAIAhBAWohCAwBCwsgBygCXCEIC0G6fyEMIA8gCGsiACANIARrSw0AIAQEfyAEIAggABALIABqBUEACyABayEMCyAHQfAAaiQAIAwLkRcCFn8FfiMAQdABayIHJAAgByAAKALw4QEiCDYCvAEgASACaiESIAggACgCgOIBaiETAkACQCAFRQRAIAEhAwwBCyAAKALE4AEhESAAKALA4AEhFSAAKAK84AEhDyAAQQE2AozhAUEAIQgDQCAIQQNHBEAgByAIQQJ0IgJqIAAgAmpBrNABaigCADYCVCAIQQFqIQgMAQsLIAcgETYCZCAHIA82AmAgByABIA9rNgJoQWwhECAHQShqIAMgBBAGEAMNASAFQQQgBUEESBshFyAHQTxqIAdBKGogACgCABATIAdBxABqIAdBKGogACgCCBATIAdBzABqIAdB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IAdB0AFqJAAgEAslACAAQgA3AgAgAEEAOwEIIABBADoACyAAIAE2AgwgACACOgAKC7QFAQN/IwBBMGsiBCQAIABB/wFqIgVBfWohBgJAIAMvAQIEQCAEQRhqIAEgAhAGIgIQAw0BIARBEGogBEEYaiADEBwgBEEIaiAEQRhqIAMQHCAAIQMDQAJAIARBGGoQBCADIAZPckUEQCADIARBEGogBEEYahASOgAAIAMgBEEIaiAEQRhqEBI6AAEgBEEYahAERQ0BIANBAmohAwsgBUF+aiEFAn8DQEG6fyECIAMiASAFSw0FIAEgBEEQaiAEQRhqEBI6AAAgAUEBaiEDIARBGGoQBEEDRgRAQQIhAiAEQQhqDAILIAMgBUsNBSABIARBCGogBEEYahASOgABIAFBAmohA0EDIQIgBEEYahAEQQNHDQALIARBEGoLIQUgAyAFIARBGGoQEjoAACABIAJqIABrIQIMAwsgAyAEQRBqIARBGGoQEjoAAiADIARBCGogBEEYahASOgADIANBBGohAwwAAAsACyAEQRhqIAEgAhAGIgIQAw0AIARBEGogBEEYaiADEBwgBEEIaiAEQRhqIAMQHCAAIQMDQAJAIARBGGoQBCADIAZPckUEQCADIARBEGogBEEYahAROgAAIAMgBEEIaiAEQRhqEBE6AAEgBEEYahAERQ0BIANBAmohAwsgBUF+aiEFAn8DQEG6fyECIAMiASAFSw0EIAEgBEEQaiAEQRhqEBE6AAAgAUEBaiEDIARBGGoQBEEDRgRAQQIhAiAEQQhqDAILIAMgBUsNBCABIARBCGogBEEYahAROgABIAFBAmohA0EDIQIgBEEYahAEQQNHDQALIARBEGoLIQUgAyAFIARBGGoQEToAACABIAJqIABrIQIMAgsgAyAEQRBqIARBGGoQEToAAiADIARBCGogBEEYahAROgADIANBBGohAwwAAAsACyAEQTBqJAAgAgtpAQF/An8CQAJAIAJBB00NACABKAAAQbfIwuF+Rw0AIAAgASgABDYCmOIBQWIgAEEQaiABIAIQPiIDEAMNAhogAEKBgICAEDcDiOEBIAAgASADaiACIANrECoMAQsgACABIAIQKgtBAAsLrQMBBn8jAEGAAWsiAyQAQWIhCAJAIAJBCUkNACAAQZjQAGogAUEIaiIEIAJBeGogAEGY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wOABCwutAgIEfwF+IwBBQGoiBCQAAkACQCACQQhJDQAgASgAAEFwcUHQ1LTCAUcNACABIAIQIiEBIABCADcDCCAAQQA2AgQgACABNgIADAELIARBGGogASACEC0iAxADBEAgACADEBoMAQsgAwRAIABBuH8QGgwBCyACIAQoAjAiA2shAiABIANqIQMDQAJAIAAgAyACIARBCGoQLCIFEAMEfyAFBSACIAVBA2oiBU8NAUG4fwsQGgwCCyAGQQFqIQYgAiAFayECIAMgBWohAyAEKAIMRQ0ACyAEKAI4BEAgAkEDTQRAIABBuH8QGgwCCyADQQRqIQMLIAQoAighAiAEKQMYIQcgAEEANgIEIAAgAyABazYCACAAIAIgBmytIAcgB0J/URs3AwgLIARBQGskAAslAQF/IwBBEGsiAiQAIAIgACABEFEgAigCACEAIAJBEGokACAAC30BBH8jAEGQBGsiBCQAIARB/wE2AggCQCAEQRBqIARBCGogBEEMaiABIAIQFSIGEAMEQCAGIQUMAQtBVCEFIAQoAgwiB0EGSw0AIAMgBEEQaiAEKAIIIAcQQSIFEAMNACAAIAEgBmogAiAGayADEDwhBQsgBEGQBGokACAFC4cBAgJ/An5BABAWIQMCQANAIAEgA08EQAJAIAAoAABBcHFB0NS0wgFGBEAgACABECIiAhADRQ0BQn4PCyAAIAEQVSIEQn1WDQMgBCAFfCIFIARUIQJCfiEEIAINAyAAIAEQUiICEAMNAwsgASACayEBIAAgAmohAAwBCwtCfiAFIAEbIQQLIAQLPwIBfwF+IwBBMGsiAiQAAn5CfiACQQhqIAAgARAtDQAaQgAgAigCHEEBRg0AGiACKQMICyEDIAJBMGokACADC40BAQJ/IwBBMGsiASQAAkAgAEUNACAAKAKI4gENACABIABB/OEBaigCADYCKCABIAApAvThATcDICAAEDAgACgCqOIBIQIgASABKAIoNgIYIAEgASkDIDcDECACIAFBEGoQGyAAQQA2AqjiASABIAEoAig2AgggASABKQMgNwMAIAAgARAbCyABQTBqJAALKgECfyMAQRBrIgAkACAAQQA2AgggAEIANwMAIAAQWCEBIABBEGokACABC4cBAQN/IwBBEGsiAiQAAkAgACgCAEUgACgCBEVzDQAgAiAAKAIINgIIIAIgACkCADcDAAJ/IAIoAgAiAQRAIAIoAghBqOMJIAERBQAMAQtBqOMJECgLIgFFDQAgASAAKQIANwL04QEgAUH84QFqIAAoAgg2AgAgARBZIAEhAwsgAkEQaiQAIAMLywEBAn8jAEEgayIBJAAgAEGBgIDAADYCtOIBIABBADYCiOIBIABBADYC7OEBIABCADcDkOIBIABBADYCpOMJIABBADYC3OIBIABCADcCzOIBIABBADYCvOIBIABBADYCxOABIABCADcCnOIBIABBpOIBakIANwIAIABBrOIBakEANgIAIAFCADcCECABQgA3AhggASABKQMYNwMIIAEgASkDEDcDACABKAIIQQh2QQFxIQIgAEEANgLg4gEgACACNgKM4gEgAUEgaiQAC3YBA38jAEEwayIBJAAgAARAIAEgAEHE0AFqIgIoAgA2AiggASAAKQK80AE3AyAgACgCACEDIAEgAigCADYCGCABIAApArzQATcDECADIAFBEGoQGyABIAEoAig2AgggASABKQMgNwMAIAAgARAbCyABQTBqJAALzAEBAX8gACABKAK00AE2ApjiASAAIAEoAgQiAjYCwOABIAAgAjYCvOABIAAgAiABKAIIaiICNgK44AEgACACNgLE4AEgASgCuNABBEAgAEKBgICAEDcDiOEBIAAgAUGk0ABqNgIMIAAgAUGUIGo2AgggACABQZwwajYCBCAAIAFBDGo2AgAgAEGs0AFqIAFBqNABaigCADYCACAAQbDQAWogAUGs0AFqKAIANgIAIABBtNABaiABQbDQAWooAgA2AgAPCyAAQgA3A4jhAQs7ACACRQRAQbp/DwsgBEUEQEFsDwsgAiAEEGAEQCAAIAEgAiADIAQgBRBhDwsgACABIAIgAyAEIAUQZQtGAQF/IwBBEGsiBSQAIAVBCGogBBAOAn8gBS0ACQRAIAAgASACIAMgBBAyDAELIAAgASACIAMgBBA0CyEAIAVBEGokACAACzQAIAAgAyAEIAUQNiIFEAMEQCAFDwsgBSAESQR/IAEgAiADIAVqIAQgBWsgABA1BUG4fwsLRgEBfyMAQRBrIgUkACAFQQhqIAQQDgJ/IAUtAAkEQCAAIAEgAiADIAQQYgwBCyAAIAEgAiADIAQQNQshACAFQRBqJAAgAAtZAQF/QQ8hAiABIABJBEAgAUEE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\";export{Q as ZSTDDecoder};\n"
  },
  {
    "path": "examples/light_directlight.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>t3d - directlight</title>\n\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n\t<link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n</head>\n<body>\n    <div id=\"info\">\n        <a href=\"\" target=\"_blank\">t3d</a> - directional light\n    </div>\n\n\t<script src=\"./libs/nanobar.js\"></script>\n\n\t<!-- Import maps polyfill -->\n    <!-- Remove this when import maps will be widely supported -->\n    <script async src=\"./libs/es-module-shims.js\"></script>\n\n    <script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n    <script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { GLTFLoader } from 't3d/addons/loaders/glTF/GLTFLoader.js';\n\t\timport { DirectionalLightHelper } from 't3d/addons/objects/DirectionalLightHelper.js';\n\t\timport { ForwardRenderer } from 't3d/addons/render/ForwardRenderer.js';\n\t\timport { OrbitControls } from 't3d/addons/controls/OrbitControls.js';\n\t\timport { GUI } from './libs/lil-gui.esm.min.js';\n\n\t\tlet width = window.innerWidth || 2;\n\t\tlet height = window.innerHeight || 2;\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = width;\n\t\tcanvas.height = height;\n\t\tdocument.body.appendChild(canvas);\n\n\t\tconst forwardRenderer = new ForwardRenderer(canvas);\n\n\t\tconst scene = new t3d.Scene();\n\t\tscene.fog = new t3d.Fog(0x000000, 50, 1000);\n\n\t\tconst nanobar = new Nanobar();\n\t\tnanobar.el.style.background = 'gray';\n\n\t\tconst loadingManager = new t3d.LoadingManager(function() {\n\t\t\tnanobar.go(100);\n\t\t\tnanobar.el.style.background = 'transparent';\n\t\t}, function(url, itemsLoaded, itemsTotal) {\n\t\t\tif (itemsLoaded < itemsTotal) {\n\t\t\t\tnanobar.go(itemsLoaded / itemsTotal * 100);\n\t\t\t}\n\t\t});\n\n\t\tlet model;\n\n\t\tconsole.time('Load glTF');\n\t\tconst gltfUri = './resources/models/gltf/bust_of_woman/glTF-Binary/bust_of_woman.glb';\n\t\tnew GLTFLoader(loadingManager).load(gltfUri).then(function(result) {\n\t\t\tconsole.timeEnd('Load glTF');\n\n\t\t\tmodel = result.root;\n\n\t\t\tmodel.traverse(node => {\n\t\t\t\tif (node.isMesh) {\n\t\t\t\t\tnode.castShadow = true;\n\t\t\t\t\tnode.receiveShadow = true;\n\t\t\t\t\tnode.shadowType = t3d.SHADOW_TYPE.PCF5_SOFT;\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tscene.add(model);\n\t\t}).catch(function(e) { console.error(e) });\n\n\t\tconst sphere_geometry = new t3d.SphereGeometry(10, 32, 16);\n\t\tconst sphere_material = new t3d.PBRMaterial();\n\t\tsphere_material.diffuse.setHex(0xBBBBBB);\n\t\tsphere_material.metalness = 0;\n\t\tsphere_material.roughness = 1;\n\t\tsphere_material.side = t3d.DRAW_SIDE.DOUBLE;\n\t\tconst sphere = new t3d.Mesh(sphere_geometry, sphere_material);\n\t\tsphere.position.set(-2, 10, -30);\n\t\tsphere.shadowType = t3d.SHADOW_TYPE.PCF5_SOFT;\n\t\tsphere.castShadow = true;\n\t\tsphere.receiveShadow = true;\n\t\tscene.add(sphere);\n\n\t\tconst box_geometry = new t3d.BoxGeometry(20, 40, 20);\n\t\tconst box_material = new t3d.PBRMaterial();\n\t\tbox_material.diffuse.setHex(0xBBBBBB);\n\t\tbox_material.metalness = 0;\n\t\tbox_material.roughness = 1;\n\t\tbox_material.side = t3d.DRAW_SIDE.DOUBLE;\n\t\tconst box = new t3d.Mesh(box_geometry, box_material);\n\t\tbox.position.set(50, 20, -10);\n\t\tbox.shadowType = t3d.SHADOW_TYPE.PCF5_SOFT;\n\t\tbox.castShadow = true;\n\t\tbox.receiveShadow = true;\n\t\tscene.add(box);\n\n\t\tconst plane_geometry = new t3d.PlaneGeometry(2000, 2000);\n\t\tconst plane_material = new t3d.LambertMaterial();\n\t\tplane_material.diffuse.setHex(0x999999);\n\t\tplane_material.dithering = true;\n\t\tconst plane = new t3d.Mesh(plane_geometry, plane_material);\n\t\tplane.shadowType = t3d.SHADOW_TYPE.PCF5_SOFT;\n\t\tplane.receiveShadow = true;\n\t\tscene.add(plane);\n\n\t\tconst ambientLight = new t3d.AmbientLight(0xffffff, 0.4);\n\t\tscene.add(ambientLight);\n\n\t\tconst directionalLight = new t3d.DirectionalLight(0xffffff, 0.9);\n\t\tdirectionalLight.castShadow = true;\n\t\tdirectionalLight.shadow.windowSize = 150;\n\t\tdirectionalLight.shadow.mapSize.set(1024, 1024);\n\t\tdirectionalLight.shadow.bias = -0.001;\n\t\tdirectionalLight.shadow.normalBias = 0.2;\n\t\tdirectionalLight.shadow.cameraNear = 10;\n\t\tscene.add(directionalLight);\n\t\t\n\t\tconst directionalLightHelper = new DirectionalLightHelper(directionalLight, 2);\n\t\tdirectionalLight.add(directionalLightHelper);\n\n\t\tconst camera = new t3d.Camera();\n\t\tcamera.position.set(-70, 20, 70);\n\t\tcamera.lookAt(new t3d.Vector3(0, 26, 0), new t3d.Vector3(0, 1, 0));\n\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 0.1, 1000);\n\t\tscene.add(camera);\n\n\t\tconst controller = new OrbitControls(camera, canvas);\n\t\tcontroller.target.set(0, 26, 0);\n\n\t\tfunction setLightPosition(angle) {\n\t\t\tdirectionalLight.position.x = -Math.sin(angle / 180 * Math.PI) * 50;\n\t\t\tdirectionalLight.position.y = 50;\n\t\t\tdirectionalLight.position.z = -Math.cos(angle / 180 * Math.PI) * 50;\n\t\t\tdirectionalLight.lookAt(new t3d.Vector3(0, 25, 0), new t3d.Vector3(0, 1, 0));\n\t\t}\n\n\t\tsetLightPosition(90);\n\n\t\tconst gui = new GUI();\n\t\tgui.add({ version: 'WebGL ' + forwardRenderer.capabilities.version }, 'version').disable();\n\t\tgui.add(directionalLight, 'intensity', 0, 2, 0.01);\n\t\tgui.addColor(directionalLight, 'color');\n\t\tgui.add({ angle: 90 }, 'angle', 0, 360, 0.01).onChange(setLightPosition);\n\t\tgui.add(directionalLightHelper, 'visible').name('helper');\n\t\tconst shadowFolder = gui.addFolder('Shadow');\n\t\tshadowFolder.add(directionalLight, 'castShadow').name('enable');\n\t\tshadowFolder.add(scene, 'disableShadowSampler');\n\t\tshadowFolder.add(plane, 'shadowType', t3d.SHADOW_TYPE).onChange(function(value) {\n\t\t\tif (model) {\n\t\t\t\tmodel.traverse(node => {\n\t\t\t\t\tif (node.isMesh) {\n\t\t\t\t\t\tnode.shadowType = value;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t\tsphere.shadowType = value;\n\t\t\tbox.shadowType = value;\n\t\t});\n\t\tshadowFolder.add(directionalLight.shadow, 'radius', 0, 5, 0.01);\n\t\tshadowFolder.add(directionalLight.shadow, 'bias', -0.002, 0.002, 0.0001);\n\t\tshadowFolder.add(directionalLight.shadow, 'normalBias', -0.5, 0.5, 0.001);\n\t\tshadowFolder.close();\n\n\t\tfunction loop(count) {\n\t\t\trequestAnimationFrame(loop);\n\t\t\n\t\t\tcontroller.update();\n\t\t\tdirectionalLightHelper.update();\n\n\t\t\tforwardRenderer.render(scene, camera);\n\t\t}\n\t\trequestAnimationFrame(loop);\n\n\t\tfunction onWindowResize() {\n\t\t\twidth = window.innerWidth || 2;\n\t\t\theight = window.innerHeight || 2;\n\n\t\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 0.1, 1000);\n\n\t\t\tforwardRenderer.screenRenderTarget.resize(width, height);\n\t\t}\n\t\twindow.addEventListener('resize', onWindowResize, false);\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "examples/light_group.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>t3d - light group</title>\n\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n\t<link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n</head>\n<body>\n    <div id=\"info\">\n        <a href=\"\" target=\"_blank\">t3d</a> - light group<br/>\n\t\tSelect the lighting group for the center mesh material.\n    </div>\n\n\t<script src=\"./libs/nanobar.js\"></script>\n\n\t<!-- Import maps polyfill -->\n    <!-- Remove this when import maps will be widely supported -->\n    <script async src=\"./libs/es-module-shims.js\"></script>\n\n    <script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n    <script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { GLTFLoader } from 't3d/addons/loaders/glTF/GLTFLoader.js';\n\t\timport { OrbitControls } from 't3d/addons/controls/OrbitControls.js';\n\t\timport { DirectionalLightHelper } from 't3d/addons/objects/DirectionalLightHelper.js';\n\t\timport { PointLightHelper } from 't3d/addons/objects/PointLightHelper.js';\n\t\timport { ForwardRenderer } from 't3d/addons/render/ForwardRenderer.js';\n\t\timport { Timer } from 't3d/addons/misc/Timer.js';\n\t\timport { GUI } from './libs/lil-gui.esm.min.js';\n\n\t\tlet width = window.innerWidth || 2;\n\t\tlet height = window.innerHeight || 2;\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = width;\n\t\tcanvas.height = height;\n\t\tdocument.body.appendChild(canvas);\n\n\t\tconst forwardRenderer = new ForwardRenderer(canvas);\n\n\t\tconst scene = new t3d.Scene();\n\t\tscene.maxLightingGroups = 5;\n\t\tscene.fog = new t3d.Fog(0x000000, 50, 1000);\n\n\t\tconst camera = new t3d.Camera();\n\t\tcamera.outputEncoding = t3d.TEXEL_ENCODING_TYPE.SRGB;\n\t\tcamera.position.set(0, 24, 130);\n\t\tcamera.lookAt(new t3d.Vector3(0, 0, 0), new t3d.Vector3(0, 1, 0));\n\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 1000);\n\t\tscene.add(camera);\n\n\t\tconst controller = new OrbitControls(camera, canvas);\n\t\tcontroller.target.set(0, 26, 0);\n\n\t\t// Prepare scene\n\n\t\tconst nanobar = new Nanobar();\n\t\tnanobar.el.style.background = 'gray';\n\n\t\tconst loadingManager = new t3d.LoadingManager(function() {\n\t\t\tnanobar.go(100);\n\t\t\tnanobar.el.style.background = 'transparent';\n\t\t}, function(url, itemsLoaded, itemsTotal) {\n\t\t\tif (itemsLoaded < itemsTotal) {\n\t\t\t\tnanobar.go(itemsLoaded / itemsTotal * 100);\n\t\t\t}\n\t\t});\n\n\t\tconsole.time('Load glTF');\n\t\tconst gltfUri = './resources/models/gltf/bust_of_woman/glTF-Binary/bust_of_woman.glb';\n\t\tnew GLTFLoader(loadingManager).load(gltfUri).then(function(result) {\n\t\t\tconsole.timeEnd('Load glTF');\n\n\t\t\tconst tempMesh = result.root.children[0];\n\t\t\ttempMesh.castShadow = true;\n\t\t\ttempMesh.receiveShadow = true;\n\n\t\t\tfunction cloneMesh() {\n\t\t\t\tconst mesh = tempMesh.clone();\n\t\t\t\tmesh.material = tempMesh.material.clone();\n\t\t\t\treturn mesh;\n\t\t\t}\n\n\t\t\tconst meshLeft = cloneMesh();\n\t\t\tmeshLeft.position.x = -40;\n\t\t\tmeshLeft.material.lightingGroup = 2;\n\t\t\tscene.add(meshLeft);\n\n\t\t\tconst meshCenter = cloneMesh();\n\t\t\tmeshCenter.material.lightingGroup = 1;\n\t\t\tscene.add(meshCenter);\n\n\t\t\tconst meshRight = cloneMesh();\n\t\t\tmeshRight.position.x = 40;\n\t\t\tmeshRight.material.lightingGroup = 3;\n\t\t\tscene.add(meshRight);\n\n\t\t\t// GUI\n\n\t\t\tconst gui = new GUI();\n\t\t\tgui.add(meshCenter.material, 'lightingGroup', {\n\t\t\t\t'All': 0,\n\t\t\t\t'Only White': 1,\n\t\t\t\t'Only Blue': 2,\n\t\t\t\t'Only Red': 3\n\t\t\t}).name('Lighting');\n\t\t}).catch(function(e) { console.error(e) });\n\n\t\tconst plane_geometry = new t3d.PlaneGeometry(2000, 2000);\n\t\tconst plane_material = new t3d.LambertMaterial();\n\t\tplane_material.diffuse.setHex(0x999999);\n\t\tplane_material.dithering = true;\n\t\tconst plane = new t3d.Mesh(plane_geometry, plane_material);\n\t\tplane.shadowType = t3d.SHADOW_TYPE.PCF5_SOFT;\n\t\tplane.receiveShadow = true;\n\t\tscene.add(plane);\n\n\t\tconst bg_geometry = new t3d.PlaneGeometry(250, 250);\n\t\tconst bg_material = new t3d.PBRMaterial();\n\t\tbg_material.roughness = 0.8;\n\t\tbg_material.metalness = 0;\n\t\tbg_material.diffuse.setHex(0xffffff);\n\t\tbg_material.dithering = true;\n\t\tbg_material.side = t3d.DRAW_SIDE.DOUBLE;\n\t\tconst bg = new t3d.Mesh(bg_geometry, bg_material);\n\t\tbg.shadowType = t3d.SHADOW_TYPE.PCF5_SOFT;\n\t\tbg.receiveShadow = true;\n\t\tbg.castShadow = true;\n\t\tbg.euler.x = Math.PI / 2;\n\t\tbg.position.z = -25;\n\t\tscene.add(bg);\n\n\t\t// Prepare lights\n\n\t\tconst directionalLight = new t3d.DirectionalLight(0xffffff, 0.2);\n\t\tdirectionalLight.position.set(10, 35, 30);\n\t\tdirectionalLight.lookAt(new t3d.Vector3(0, 30, 0), new t3d.Vector3(0, 1, 0));\n\t\tdirectionalLight.shadow.windowSize = 150;\n\t\tdirectionalLight.shadow.cameraFar = 300;\n\t\tdirectionalLight.shadow.mapSize.set(1024, 1024);\n\t\tdirectionalLight.shadow.bias = -0.003;\n\t\tdirectionalLight.castShadow = true;\n\t\tdirectionalLight.groupMask = 1 << 0 | 1 << 1;\n\t\tscene.add(directionalLight);\n\t\t\n\t\tconst directionalLightHelper = new DirectionalLightHelper(directionalLight, 1);\n\t\tdirectionalLight.add(directionalLightHelper);\n\n\t\tconst pointLightBlue = new t3d.PointLight(0x0000ff, 0.7, 80);\n\t\tpointLightBlue.position.set(0, 30, 0);\n\t\tpointLightBlue.groupMask = 1 << 0 | 1 << 2;\n\t\tscene.add(pointLightBlue);\n\t\t\n\t\tconst pointLightBlueHelper = new PointLightHelper(pointLightBlue, 1);\n\t\tpointLightBlue.add(pointLightBlueHelper);\n\n\t\tconst pointLightRed = new t3d.PointLight(0xff0000, 0.7, 80);\n\t\tpointLightRed.position.set(0, 30, 0);\n\t\tpointLightRed.groupMask = 1 << 0 | 1 << 3;\n\t\tscene.add(pointLightRed);\n\t\t\n\t\tconst pointLightRedHelper = new PointLightHelper(pointLightRed, 1);\n\t\tpointLightRed.add(pointLightRedHelper);\n\n\t\t//\n\n\t\tconst timer = new Timer();\n\n\t\tfunction loop(timestamp) {\n\t\t\trequestAnimationFrame(loop);\n\n\t\t\ttimer.update(timestamp);\n\n\t\t\tcontroller.update();\n\n\t\t\tconst elapsedTime = timer.getElapsed();\n\n\t\t\tpointLightBlue.position.x = 24 * Math.cos(elapsedTime);\n\t\t\tpointLightBlue.position.z = 24 * Math.sin(elapsedTime);\n\n\t\t\tpointLightRed.position.x = 24 * Math.cos(elapsedTime + Math.PI);\n\t\t\tpointLightRed.position.z = 24 * Math.sin(elapsedTime + Math.PI);\n\n\t\t\tpointLightBlueHelper.update();\n\t\t\tpointLightRedHelper.update();\n\t\t\tdirectionalLightHelper.update();\n\n\t\t\tforwardRenderer.render(scene, camera);\n\t\t}\n\t\trequestAnimationFrame(loop);\n\n\t\tfunction onWindowResize() {\n\t\t\twidth = window.innerWidth || 2;\n\t\t\theight = window.innerHeight || 2;\n\n\t\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 1000);\n\n\t\t\tforwardRenderer.screenRenderTarget.resize(width, height);\n\t\t}\n\t\twindow.addEventListener('resize', onWindowResize, false);\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "examples/light_hemispherelight.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>t3d - hemisphere light</title>\n\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n\t<link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n</head>\n<body>\n    <div id=\"info\">\n        <a href=\"\" target=\"_blank\">t3d</a> - hemisphere light\n    </div>\n\n\t<script src=\"./libs/nanobar.js\"></script>\n\n\t<!-- Import maps polyfill -->\n    <!-- Remove this when import maps will be widely supported -->\n    <script async src=\"./libs/es-module-shims.js\"></script>\n\n    <script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n    <script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { GLTFLoader } from 't3d/addons/loaders/glTF/GLTFLoader.js';\n\t\timport { HemisphereLightHelper } from 't3d/addons/objects/HemisphereLightHelper.js';\n\t\timport { ForwardRenderer } from 't3d/addons/render/ForwardRenderer.js';\n\t\timport { OrbitControls } from 't3d/addons/controls/OrbitControls.js';\n\t\timport { GUI } from './libs/lil-gui.esm.min.js';\n\n\t\tlet width = window.innerWidth || 2;\n\t\tlet height = window.innerHeight || 2;\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = width;\n\t\tcanvas.height = height;\n\t\tdocument.body.appendChild(canvas);\n\n\t\tconst forwardRenderer = new ForwardRenderer(canvas);\n\n\t\tconst scene = new t3d.Scene();\n\n\t\tconst nanobar = new Nanobar();\n\t\tnanobar.el.style.background = 'gray';\n\n\t\tconst loadingManager = new t3d.LoadingManager(function() {\n\t\t\tnanobar.go(100);\n\t\t\tnanobar.el.style.background = 'transparent';\n\t\t}, function(url, itemsLoaded, itemsTotal) {\n\t\t\tif (itemsLoaded < itemsTotal) {\n\t\t\t\tnanobar.go(itemsLoaded / itemsTotal * 100);\n\t\t\t}\n\t\t});\n\n\t\tlet model;\n\n\t\tconsole.time('Load glTF');\n\t\tconst gltfUri = './resources/models/gltf/bust_of_woman/glTF-Binary/bust_of_woman.glb';\n\t\tnew GLTFLoader(loadingManager).load(gltfUri).then(function(result) {\n\t\t\tconsole.timeEnd('Load glTF');\n\n\t\t\tmodel = result.root;\n\n\t\t\tmodel.traverse(node => {\n\t\t\t\tif (node.isMesh) {\n\t\t\t\t\tnode.castShadow = true;\n\t\t\t\t\tnode.receiveShadow = true;\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tscene.add(model);\n\t\t}).catch(function(e) { console.error(e) });\n\n\t\tconst hemisphereLight = new t3d.HemisphereLight(0xff1111, 0x1111ff, 1);\n\t\themisphereLight.position.set(25, 10, 0);\n\t\tscene.add(hemisphereLight);\n\n\t\tconst hemisphereLightHelper = new HemisphereLightHelper(hemisphereLight, 4);\n\t\themisphereLight.add(hemisphereLightHelper);\n\n\t\tconst camera = new t3d.Camera();\n\t\tcamera.position.set(0, 26, 100);\n\t\tcamera.lookAt(new t3d.Vector3(0, 26, 0), new t3d.Vector3(0, 1, 0));\n\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 1000);\n\t\tscene.add(camera);\n\n\t\tconst controller = new OrbitControls(camera, canvas);\n\t\tcontroller.target.set(0, 26, 0);\n\n\t\tconst gui = new GUI();\n\t\tgui.add({ version: 'WebGL ' + forwardRenderer.capabilities.version }, 'version').disable();\n\t\tgui.add(hemisphereLight, 'intensity', 0, 2, 0.01);\n\t\tgui.addColor(hemisphereLight, 'color').name('skyColor').onChange(function() {\n\t\t\themisphereLightHelper.update();\n\t\t});\n\t\tgui.addColor(hemisphereLight, 'groundColor').onChange(function() {\n\t\t\themisphereLightHelper.update();\n\t\t});\n\t\tgui.add({ rotation: 0 }, 'rotation', 0, 360, 0.01).onChange(function(value) {\n\t\t\themisphereLight.euler.z = value / 180 * Math.PI;\n\t\t});\n\n\t\tfunction loop(count) {\n\t\t\trequestAnimationFrame(loop);\n\t\t\n\t\t\tcontroller.update();\n\n\t\t\tforwardRenderer.render(scene, camera);\n\t\t}\n\t\trequestAnimationFrame(loop);\n\n\t\tfunction onWindowResize() {\n\t\t\twidth = window.innerWidth || 2;\n\t\t\theight = window.innerHeight || 2;\n\n\t\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 1000);\n\n\t\t\tforwardRenderer.screenRenderTarget.resize(width, height);\n\t\t}\n\t\twindow.addEventListener('resize', onWindowResize, false);\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "examples/light_pointlight.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>t3d - pointlight</title>\n\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n\t<link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n</head>\n<body>\n    <div id=\"info\">\n        <a href=\"\" target=\"_blank\">t3d</a> - point light\n    </div>\n\n\t<script src=\"./libs/nanobar.js\"></script>\n\n\t<!-- Import maps polyfill -->\n    <!-- Remove this when import maps will be widely supported -->\n    <script async src=\"./libs/es-module-shims.js\"></script>\n\n    <script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n    <script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { GLTFLoader } from 't3d/addons/loaders/glTF/GLTFLoader.js';\n\t\timport { PointLightHelper } from 't3d/addons/objects/PointLightHelper.js';\n\t\timport { ForwardRenderer } from 't3d/addons/render/ForwardRenderer.js';\n\t\timport { OrbitControls } from 't3d/addons/controls/OrbitControls.js';\n\t\timport { GUI } from './libs/lil-gui.esm.min.js';\n\n\t\tlet width = window.innerWidth || 2;\n\t\tlet height = window.innerHeight || 2;\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = width;\n\t\tcanvas.height = height;\n\t\tdocument.body.appendChild(canvas);\n\n\t\tconst forwardRenderer = new ForwardRenderer(canvas);\n\n\t\tconst scene = new t3d.Scene();\n\t\tscene.fog = new t3d.Fog(0x000000, 50, 1000);\n\n\t\tconst nanobar = new Nanobar();\n\t\tnanobar.el.style.background = 'gray';\n\n\t\tconst loadingManager = new t3d.LoadingManager(function() {\n\t\t\tnanobar.go(100);\n\t\t\tnanobar.el.style.background = 'transparent';\n\t\t}, function(url, itemsLoaded, itemsTotal) {\n\t\t\tif (itemsLoaded < itemsTotal) {\n\t\t\t\tnanobar.go(itemsLoaded / itemsTotal * 100);\n\t\t\t}\n\t\t});\n\n\t\tlet model;\n\n\t\tconsole.time('Load glTF');\n\t\tconst gltfUri = './resources/models/gltf/bust_of_woman/glTF-Binary/bust_of_woman.glb';\n\t\tnew GLTFLoader(loadingManager).load(gltfUri).then(function(result) {\n\t\t\tconsole.timeEnd('Load glTF');\n\n\t\t\tmodel = result.root;\n\n\t\t\tmodel.traverse(node => {\n\t\t\t\tif (node.isMesh) {\n\t\t\t\t\tnode.castShadow = true;\n\t\t\t\t\tnode.receiveShadow = true;\n\t\t\t\t\tnode.shadowType = t3d.SHADOW_TYPE.PCF5_SOFT;\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tscene.add(model);\n\t\t}).catch(function(e) { console.error(e) });\n\n\t\tconst sphere_geometry = new t3d.SphereGeometry(10, 32, 16);\n\t\tconst sphere_material = new t3d.PBRMaterial();\n\t\tsphere_material.diffuse.setHex(0xBBBBBB);\n\t\tsphere_material.metalness = 0;\n\t\tsphere_material.roughness = 1;\n\t\tsphere_material.side = t3d.DRAW_SIDE.DOUBLE;\n\t\tconst sphere = new t3d.Mesh(sphere_geometry, sphere_material);\n\t\tsphere.position.set(-2, 10, -30);\n\t\tsphere.shadowType = t3d.SHADOW_TYPE.PCF5_SOFT;\n\t\tsphere.castShadow = true;\n\t\tsphere.receiveShadow = true;\n\t\tscene.add(sphere);\n\n\t\tconst box_geometry = new t3d.BoxGeometry(20, 40, 20);\n\t\tconst box_material = new t3d.PBRMaterial();\n\t\tbox_material.diffuse.setHex(0xBBBBBB);\n\t\tbox_material.metalness = 0;\n\t\tbox_material.roughness = 1;\n\t\tbox_material.side = t3d.DRAW_SIDE.DOUBLE;\n\t\tconst box = new t3d.Mesh(box_geometry, box_material);\n\t\tbox.position.set(50, 20, -10);\n\t\tbox.shadowType = t3d.SHADOW_TYPE.PCF5_SOFT;\n\t\tbox.castShadow = true;\n\t\tbox.receiveShadow = true;\n\t\tscene.add(box);\n\n\t\tconst plane_geometry = new t3d.PlaneGeometry(2000, 2000);\n\t\tconst plane_material = new t3d.LambertMaterial();\n\t\tplane_material.diffuse.setHex(0x999999);\n\t\tplane_material.dithering = true;\n\t\tconst plane = new t3d.Mesh(plane_geometry, plane_material);\n\t\tplane.shadowType = t3d.SHADOW_TYPE.PCF5_SOFT;\n\t\tplane.receiveShadow = true;\n\t\tscene.add(plane);\n\n\t\tconst ambientLight = new t3d.AmbientLight(0xffffff, 0.4);\n\t\tscene.add(ambientLight);\n\n\t\tconst pointLight = new t3d.PointLight(0xffffff, 1, 150);\n\t\tpointLight.castShadow = true;\n\t\tpointLight.shadow.mapSize.set(1024, 1024);\n\t\tpointLight.shadow.bias = -0.001;\n\t\tpointLight.shadow.normalBias = 0.2;\n\t\tpointLight.shadow.cameraNear = 10;\n\t\tscene.add(pointLight);\n\t\t\n\t\tconst pointLightHelper = new PointLightHelper(pointLight, 2);\n\t\tpointLight.add(pointLightHelper);\n\n\t\tconst camera = new t3d.Camera();\n\t\tcamera.position.set(-70, 20, 70);\n\t\tcamera.lookAt(new t3d.Vector3(0, 26, 0), new t3d.Vector3(0, 1, 0));\n\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 0.1, 1000);\n\t\tscene.add(camera);\n\n\t\tconst controller = new OrbitControls(camera, canvas);\n\t\tcontroller.target.set(0, 26, 0);\n\n\t\tfunction setLightPosition(angle) {\n\t\t\tpointLight.position.x = -Math.sin(angle / 180 * Math.PI) * 30;\n\t\t\tpointLight.position.y = 45;\n\t\t\tpointLight.position.z = -Math.cos(angle / 180 * Math.PI) * 30;\n\t\t}\n\n\t\tsetLightPosition(90);\n\n\t\tconst gui = new GUI();\n\t\tgui.add({ version: 'WebGL ' + forwardRenderer.capabilities.version }, 'version').disable();\n\t\tgui.add(pointLight, 'intensity', 0, 2, 0.01);\n\t\tgui.addColor(pointLight, 'color');\n\t\tgui.add({ angle: 90 }, 'angle', 0, 360, 0.01).onChange(setLightPosition);\n\t\tgui.add(pointLightHelper, 'visible').name('helper');\n\t\tconst shadowFolder = gui.addFolder('Shadow');\n\t\tshadowFolder.add(pointLight, 'castShadow').name('enable');\n\t\tshadowFolder.add(scene, 'disableShadowSampler');\n\t\tshadowFolder.add(plane, 'shadowType', t3d.SHADOW_TYPE).onChange(function(value) {\n\t\t\tif (model) {\n\t\t\t\tmodel.traverse(node => {\n\t\t\t\t\tif (node.isMesh) {\n\t\t\t\t\t\tnode.shadowType = value;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t\tsphere.shadowType = value;\n\t\t\tbox.shadowType = value;\n\t\t});\n\t\tshadowFolder.add(pointLight.shadow, 'radius', 0, 5, 0.01);\n\t\tshadowFolder.add(pointLight.shadow, 'bias', -0.002, 0.002, 0.0001);\n\t\tshadowFolder.add(pointLight.shadow, 'normalBias', -0.5, 0.5, 0.001);\n\t\tshadowFolder.close();\n\n\t\tfunction loop(count) {\n\t\t\trequestAnimationFrame(loop);\n\t\t\n\t\t\tcontroller.update();\n\t\t\tpointLightHelper.update();\n\n\t\t\tforwardRenderer.render(scene, camera);\n\t\t}\n\t\trequestAnimationFrame(loop);\n\n\t\tfunction onWindowResize() {\n\t\t\twidth = window.innerWidth || 2;\n\t\t\theight = window.innerHeight || 2;\n\n\t\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 0.1, 1000);\n\n\t\t\tforwardRenderer.screenRenderTarget.resize(width, height);\n\t\t}\n\t\twindow.addEventListener('resize', onWindowResize, false);\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "examples/light_rectarealight.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta charset=\"utf-8\" />\n\t<title>t3d - rect area light</title>\n\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\"/>\n\t<link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\" />\n</head>\n<body>\n\t<div id=\"info\">\n\t\t<a href=\"\" target=\"_blank\">t3d</a> - rect area light\n\t\t<div id=\"notSupported\" style=\"display:none\">Sorry, your graphics card + browser does not support float texture or OES_texture_float_linear</div>\n\t</div>\n\n\t<script src=\"./libs/nanobar.js\"></script>\n\n\t<!-- Import maps polyfill -->\n\t<!-- Remove this when import maps will be widely supported -->\n\t<script async src=\"./libs/es-module-shims.js\"></script>\n\n\t<script type=\"importmap\">\n\t\t{\n\t\t\t\"imports\": {\n\t\t\t\t\"t3d\": \"../build/t3d.module.js\",\n\t\t\t\t\"t3d/addons/\": \"./jsm/\"\n\t\t\t}\n\t\t}\n\t</script>\n\n\t<script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { RectAreaLightLTC } from 't3d/addons/lights/RectAreaLightLTC.js';\n\t\timport { RectAreaLightHelper } from 't3d/addons/objects/RectAreaLightHelper.js';\n\t\timport { ForwardRenderer } from 't3d/addons/render/ForwardRenderer.js';\n\t\timport { OrbitControls } from 't3d/addons/controls/OrbitControls.js';\n\n\t\tlet width = window.innerWidth || 2;\n\t\tlet height = window.innerHeight || 2;\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = width;\n\t\tcanvas.height = height;\n\t\tdocument.body.appendChild(canvas);\n\n\t\tconst forwardRenderer = new ForwardRenderer(canvas);\n\n\t\tconst scene = new t3d.Scene();\n\n\t\tconst geometry = new t3d.TorusKnotGeometry(1.5, 0.5, 200, 16);\n\t\tconst material = new t3d.PBRMaterial();\n\t\tmaterial.metalness = 0.8;\n\t\tmaterial.roughness = 0.2;\n\t\tconst mesh = new t3d.Mesh(geometry, material);\n\t\tmesh.position.set(0, 5, 0);\n\t\tscene.add(mesh);\n\n\t\tconst plane_geometry = new t3d.PlaneGeometry(2000, 2000);\n\t\tconst plane_material = new t3d.PBRMaterial();\n\t\tplane_material.diffuse.setHex(0xbcbcbc);\n\t\tplane_material.metalness = 0;\n\t\tplane_material.roughness = 0.1;\n\t\tplane_material.dithering = true;\n\t\tconst plane = new t3d.Mesh(plane_geometry, plane_material);\n\t\tscene.add(plane);\n\n\t\tt3d.RectAreaLight.LTC1 = RectAreaLightLTC.getLTC1();\n\t\tt3d.RectAreaLight.LTC2 = RectAreaLightLTC.getLTC2();\n\n\t\tconst rectLight1 = new t3d.RectAreaLight(0xff0000, 5, 4, 10);\n\t\trectLight1.position.set(-5, 5, 5);\n\t\tscene.add(rectLight1);\n\t\tconst pointLightHelper1 = new RectAreaLightHelper(rectLight1);\n\t\tpointLightHelper1.update();\n\t\trectLight1.add(pointLightHelper1);\n\n\t\tconst rectLight2 = new t3d.RectAreaLight(0x00ff00, 5, 4, 10);\n\t\trectLight2.position.set(0, 5, 5);\n\t\tscene.add(rectLight2);\n\t\tconst pointLightHelper2 = new RectAreaLightHelper(rectLight2);\n\t\tpointLightHelper2.update();\n\t\trectLight2.add(pointLightHelper2);\n\n\t\tconst rectLight3 = new t3d.RectAreaLight(0x0000ff, 5, 4, 10);\n\t\trectLight3.position.set(5, 5, 5);\n\t\tscene.add(rectLight3);\n\t\tconst pointLightHelper3 = new RectAreaLightHelper(rectLight3);\n\t\tpointLightHelper3.update();\n\t\trectLight3.add(pointLightHelper3);\n\n\t\tconst camera = new t3d.Camera();\n\t\tcamera.outputEncoding = t3d.TEXEL_ENCODING_TYPE.SRGB;\n\t\tcamera.setPerspective((45 / 180) * Math.PI, width / height, 1, 1000);\n\t\tcamera.position.set(0, 5, -20);\n\t\tscene.add(camera);\n\n\t\tconst controller = new OrbitControls(camera, canvas);\n\t\tcontroller.target.copy(mesh.position);\n\n\t\tfunction loop(count) {\n\t\t\tmesh.euler.y = count / 1000 * Math.PI / 180 * 30;\n\t\t\n\t\t\trequestAnimationFrame(loop);\n\n\t\t\tcontroller.update();\n\n\t\t\tforwardRenderer.render(scene, camera);\n\t\t}\n\n\t\tconst capabilities = forwardRenderer.capabilities;\n\t\tif ((capabilities.version > 1 || !!capabilities.getExtension('OES_texture_float')) &&\n\t\t\t!!capabilities.getExtension('OES_texture_float_linear')) {\n\t\t\trequestAnimationFrame(loop);\n\t\t} else {\n\t\t\tdocument.getElementById('notSupported').style.display = '';\n\t\t}\n\n\t\tfunction onWindowResize() {\n\t\t\twidth = window.innerWidth || 2;\n\t\t\theight = window.innerHeight || 2;\n\n\t\t\tcamera.setPerspective((45 / 180) * Math.PI, width / height, 1, 1000);\n\n\t\t\tforwardRenderer.screenRenderTarget.resize(width, height);\n\t\t}\n\t\twindow.addEventListener('resize', onWindowResize, false);\n\t</script>\n</body>\n</html>\n"
  },
  {
    "path": "examples/light_shadow.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>t3d - shadow</title>\n\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n\t<link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n</head>\n<body>\n    <div id=\"info\">\n        <a href=\"\" target=\"_blank\">t3d</a> - shadow\n    </div>\n\n\t<script src=\"./libs/nanobar.js\"></script>\n\n\t<!-- Import maps polyfill -->\n    <!-- Remove this when import maps will be widely supported -->\n    <script async src=\"./libs/es-module-shims.js\"></script>\n\n    <script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n    <script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { GLTFLoader } from 't3d/addons/loaders/glTF/GLTFLoader.js';\n\t\timport { OrbitControls } from 't3d/addons/controls/OrbitControls.js';\n\t\timport { DirectionalLightHelper } from 't3d/addons/objects/DirectionalLightHelper.js';\n\t\timport { PointLightHelper } from 't3d/addons/objects/PointLightHelper.js';\n\t\timport { ForwardRenderer } from 't3d/addons/render/ForwardRenderer.js';\n\n\t\tlet width = window.innerWidth || 2;\n\t\tlet height = window.innerHeight || 2;\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = width;\n\t\tcanvas.height = height;\n\t\tdocument.body.appendChild(canvas);\n\n\t\tconst forwardRenderer = new ForwardRenderer(canvas);\n\t\tforwardRenderer.shadowAutoUpdate = false;\n\n\t\tconst scene = new t3d.Scene();\n\t\tscene.fog = new t3d.Fog(0x000000, 50, 1000);\n\n\t\tconst nanobar = new Nanobar();\n\t\tnanobar.el.style.background = 'gray';\n\n\t\tconst loadingManager = new t3d.LoadingManager(function() {\n\t\t\tnanobar.go(100);\n\t\t\tnanobar.el.style.background = 'transparent';\n\t\t}, function(url, itemsLoaded, itemsTotal) {\n\t\t\tif (itemsLoaded < itemsTotal) {\n\t\t\t\tnanobar.go(itemsLoaded / itemsTotal * 100);\n\t\t\t}\n\t\t});\n\n\t\tconsole.time('Load glTF');\n\t\tconst gltfUri = './resources/models/gltf/bust_of_woman/glTF-Binary/bust_of_woman.glb';\n\t\tnew GLTFLoader(loadingManager).load(gltfUri).then(function(result) {\n\t\t\tconsole.timeEnd('Load glTF');\n\n\t\t\tconst model = result.root;\n\n\t\t\tmodel.traverse(node => {\n\t\t\t\tif (node.isMesh) {\n\t\t\t\t\tnode.castShadow = true;\n\t\t\t\t\tnode.receiveShadow = true;\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tscene.add(model);\n\n\t\t\tforwardRenderer.shadowNeedsUpdate = true;\n\t\t}).catch(function(e) { console.error(e) });\n\n\t\tconst plane_geometry = new t3d.PlaneGeometry(2000, 2000);\n\t\tconst plane_material = new t3d.LambertMaterial();\n\t\tplane_material.diffuse.setHex(0x999999);\n\t\tplane_material.dithering = true;\n\t\tconst plane = new t3d.Mesh(plane_geometry, plane_material);\n\t\tplane.shadowType = t3d.SHADOW_TYPE.PCF5_SOFT;\n\t\tplane.receiveShadow = true;\n\t\tscene.add(plane);\n\n\t\tconst bg_geometry = new t3d.PlaneGeometry(150, 150);\n\t\tconst bg_material = new t3d.PBRMaterial();\n\t\tbg_material.roughness = 0.8;\n\t\tbg_material.metalness = 0;\n\t\tbg_material.diffuse.setHex(0xffffff);\n\t\tbg_material.dithering = true;\n\t\tbg_material.side = t3d.DRAW_SIDE.DOUBLE;\n\t\tconst bg = new t3d.Mesh(bg_geometry, bg_material);\n\t\tbg.shadowType = t3d.SHADOW_TYPE.PCF5_SOFT;\n\t\tbg.receiveShadow = true;\n\t\tbg.castShadow = true;\n\t\tbg.euler.x = Math.PI / 2;\n\t\tbg.position.z = -25;\n\t\tscene.add(bg);\n\n\t\tconst pointLight = new t3d.PointLight(0x0000ff, 0.7, 80);\n\t\tpointLight.position.set(30, 30, 20);\n\t\tpointLight.shadow.cameraNear = 0.1;\n\t\tpointLight.shadow.cameraFar = 100;\n\t\tpointLight.shadow.mapSize.set(1024, 1024);\n\t\tpointLight.shadow.bias = -0.003;\n\t\tpointLight.castShadow = true;\n\t\tscene.add(pointLight);\n\t\t\n\t\tconst pointLightHelper = new PointLightHelper(pointLight, 1);\n\t\tpointLight.add(pointLightHelper);\n\n\t\tconst pointLight2 = new t3d.PointLight(0xff0000, 0.7, 80);\n\t\tpointLight2.position.set(-30, 30, 20);\n\t\tpointLight2.shadow.cameraNear = 0.1;\n\t\tpointLight2.shadow.cameraFar = 100;\n\t\tpointLight2.shadow.mapSize.set(1024, 1024);\n\t\tpointLight2.shadow.bias = -0.003;\n\t\tpointLight2.castShadow = true;\n\t\tscene.add(pointLight2);\n\t\t\n\t\tconst pointLightHelper2 = new PointLightHelper(pointLight2, 1);\n\t\tpointLight2.add(pointLightHelper2);\n\n\t\tconst directionalLight = new t3d.DirectionalLight(0xffffff, 0.2);\n\t\tdirectionalLight.position.set(10, 35, 30);\n\t\tdirectionalLight.lookAt(new t3d.Vector3(0, 30, 0), new t3d.Vector3(0, 1, 0));\n\t\tdirectionalLight.shadow.windowSize = 100;\n\t\tdirectionalLight.shadow.cameraFar = 300;\n\t\tdirectionalLight.shadow.mapSize.set(1024, 1024);\n\t\tdirectionalLight.shadow.bias = -0.003;\n\t\tdirectionalLight.castShadow = true;\n\t\tscene.add(directionalLight);\n\t\t\n\t\tconst directionalLightHelper = new DirectionalLightHelper(directionalLight, 1);\n\t\tdirectionalLight.add(directionalLightHelper);\n\n\t\tconst camera = new t3d.Camera();\n\t\tcamera.outputEncoding = t3d.TEXEL_ENCODING_TYPE.SRGB;\n\t\tcamera.position.set(0, 24, 130);\n\t\tcamera.lookAt(new t3d.Vector3(0, 0, 0), new t3d.Vector3(0, 1, 0));\n\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 1000);\n\t\tscene.add(camera);\n\n\t\tconst controller = new OrbitControls(camera, canvas);\n\t\tcontroller.target.set(0, 26, 0);\n\n\t\tfunction loop(count) {\n\t\t\trequestAnimationFrame(loop);\n\n\t\t\tcontroller.update();\n\n\t\t\tpointLightHelper.update();\n\t\t\tpointLightHelper2.update();\n\t\t\tdirectionalLightHelper.update();\n\n\t\t\tforwardRenderer.render(scene, camera);\n\t\t}\n\t\trequestAnimationFrame(loop);\n\n\t\tfunction onWindowResize() {\n\t\t\twidth = window.innerWidth || 2;\n\t\t\theight = window.innerHeight || 2;\n\n\t\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 1000);\n\n\t\t\tforwardRenderer.screenRenderTarget.resize(width, height);\n\t\t}\n\t\twindow.addEventListener('resize', onWindowResize, false);\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "examples/light_shadow_adapter.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>t3d - shadow adapter</title>\n\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n\t<link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n</head>\n<body>\n    <div id=\"info\">\n        <a href=\"\" target=\"_blank\">t3d</a> - shadow adapter\n    </div>\n\n\t<script src=\"./libs/nanobar.js\"></script>\n\n\t<!-- Import maps polyfill -->\n    <!-- Remove this when import maps will be widely supported -->\n    <script async src=\"./libs/es-module-shims.js\"></script>\n\n    <script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n    <script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { ForwardRenderer } from 't3d/addons/render/ForwardRenderer.js';\n\t\timport { OrbitControls } from 't3d/addons/controls/OrbitControls.js';\n\t\timport { GeometryUtils } from 't3d/addons/geometries/GeometryUtils.js';\n\t\timport { LightShadowAdapter } from 't3d/addons/lights/LightShadowAdapter.js';\n\t\timport { LightShadowAdapterHelper } from 't3d/addons/objects/LightShadowAdapterHelper.js';\n\t\timport { Box3Helper } from 't3d/addons/objects/Box3Helper.js';\n\t\timport { CameraHelper } from 't3d/addons/objects/CameraHelper.js';\n\t\timport { DirectionalLightHelper } from 't3d/addons/objects/DirectionalLightHelper.js';\n\t\timport { AxisHelper } from 't3d/addons/objects/AxisHelper.js';\n\t\timport { GUI } from './libs/lil-gui.esm.min.js';\n\n\t\tlet width = window.innerWidth || 2;\n\t\tlet height = window.innerHeight || 2;\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = width;\n\t\tcanvas.height = height;\n\t\tdocument.body.appendChild(canvas);\n\n\t\tconst forwardRenderer = new ForwardRenderer(canvas);\n\t\tconst scene = new t3d.Scene();\n\n\t\tconst ambientLight = new t3d.AmbientLight(0xffffff, 0.5);\n\t\tscene.add(ambientLight);\n\n\t\tconst directionalLight = new t3d.DirectionalLight(0xffffff, 0.6);\n\t\tdirectionalLight.castShadow = true;\n\t\tdirectionalLight.shadow.mapSize.set(2048, 2048);\n\t\tdirectionalLight.shadow.bias = 0.0013;\n\t\tdirectionalLight.shadow.normalBias = 4;\n\t\tdirectionalLight.shadow.frustumEdgeFalloff = -0.5;\n\t\tscene.add(directionalLight);\n\t\t\n\t\tconst camera = new t3d.Camera();\n\t\tcamera.position.set(0, 800, 2000);\n\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 500, 50000);\n\t\tscene.add(camera);\n\n\t\tconst debugCamera = new t3d.Camera();\n\t\tdebugCamera.position.set(2000, 5000, 5000);\n\t\tdebugCamera.setPerspective(60 / 180 * Math.PI, width / height, 500, 100000);\n\t\tscene.add(debugCamera);\n\n\t\tconst controller = new OrbitControls(camera, canvas);\n\t\tcontroller.enablePan = true;\n\n\t\tconst debugController = new OrbitControls(debugCamera, canvas);\n\t\tdebugController.enablePan = true;\n\n\t\tconst geometries = [], offsetMatrix = new t3d.Matrix4();\n\t\tfor (let i = 0; i < 2000; i++) {\n\t\t\toffsetMatrix.elements[12] = Math.random() * 20000 - 10000;\n\t\t\toffsetMatrix.elements[13] = 100;\n\t\t\toffsetMatrix.elements[14] = Math.random() * 20000 - 10000;\n\t\t\tconst geometry = new t3d.BoxGeometry(50, 200, 50);\n\t\t\tGeometryUtils.applyMatrix4(geometry, offsetMatrix);\n\t\t\tgeometries.push(geometry);\n\t\t}\n\t\tconst boxesGeometry = GeometryUtils.mergeGeometries(geometries);\n\t\tboxesGeometry.computeBoundingBox();\n\t\tboxesGeometry.computeBoundingSphere();\n\t\tconst boxes = new t3d.Mesh(boxesGeometry, new t3d.PhongMaterial());\n\t\tboxes.material.diffuse.setHex(0xBBBBBB);\n\t\tboxes.material.metalness = 0;\n\t\tboxes.material.roughness = 1;\n\t\tboxes.castShadow = true;\n\t\tboxes.receiveShadow = true;\n\t\tscene.add(boxes);\n\n\t\tconst plane = new t3d.Mesh(new t3d.PlaneGeometry(100000, 100000), new t3d.LambertMaterial());\n\t\tplane.material.diffuse.setHex(0x999999);\n\t\tplane.material.dithering = true;\n\t\tplane.shadowType = t3d.SHADOW_TYPE.PCF5_SOFT;\n\t\tplane.receiveShadow = true;\n\t\tscene.add(plane);\n\n\t\t// shadow adapter\n\n\t\tconst shadowBox = new t3d.Box3();\n\t\tshadowBox.min.set(-10000, 0, -10000);\n\t\tshadowBox.max.set(10000, 200, 10000);\n\n\t\tconst shadowAdapter = new LightShadowAdapter(directionalLight);\n\t\tshadowAdapter.bindBox.fromBox3(shadowBox);\n\t\tshadowAdapter.bindCamera = camera;\n\t\tshadowAdapter.bindCameraDistance = 3500;\n\n\t\t// helpers\n\n\t\tconst shadowAdapterHelper = new LightShadowAdapterHelper(shadowAdapter);\n\t\tscene.add(shadowAdapterHelper);\n\n\t\tconst boxHelper = new Box3Helper(shadowBox, 0xffff00);\n\t\tscene.add(boxHelper);\n\n\t\tconst cameraHelper = new CameraHelper(camera);\n\t\tcamera.add(cameraHelper);\n\n\t\tconst directionalLightHelper = new DirectionalLightHelper(directionalLight, 200);\n\t\tdirectionalLight.add(directionalLightHelper);\n\n\t\tconst axisHelper = new AxisHelper(200);\n\t\tdirectionalLight.add(axisHelper);\n\n\t\t// gui\n\n\t\tconst params = { type: 'BOX3+CAMERA', phi: 45, theta: 45, sizeFactor: 1.05, depthFactor: 1.1, nearFactor: 0.1, debug: true };\n\n\t\tshadowAdapter.shadowSizeFunction = function(size) { return size * params.sizeFactor };\n\t\tshadowAdapter.shadowDepthFunction = function(depth, size) { return Math.max(depth * params.depthFactor, size * 0.8) };\n\t\tshadowAdapter.shadowNearFunction = function(depth) { return depth * params.nearFactor };\n\n\t\tfunction updateLightDirection() {\n\t\t\tshadowAdapter.direction.setFromSphericalAngles(params.phi / 180 * Math.PI, params.theta / 180 * Math.PI);\n\t\t}\n\t\tupdateLightDirection();\n\n\t\tfunction setDebugger(value, sync = true) {\n\t\t\tcontroller.enabled = !value;\n\t\t\tdebugController.enabled = value;\n\t\t\tif (value && sync) {\n\t\t\t\tdebugCamera.position.copy(camera.position);\n\t\t\t\tdebugCamera.quaternion.copy(camera.quaternion);\n\t\t\t\tdebugController.target.copy(controller.target);\n\t\t\t}\n\n\t\t\tshadowAdapterHelper.visible = value;\n\t\t\tboxHelper.visible = value;\n\t\t\tcameraHelper.visible = value;\n\t\t\tdirectionalLightHelper.visible = value;\n\t\t\taxisHelper.visible = value;\n\t\t}\n\t\tsetDebugger(params.debug, false);\n\n\t\tconst gui = new GUI();\n\n\t\tconst lightFolder = gui.addFolder('Light').onChange(updateLightDirection);\n\t\tlightFolder.add(params, 'phi', 0.1, 90, 0.1);\n\t\tlightFolder.add(params, 'theta', 0, 360, 0.1);\n\n\t\tconst shadowFolder = gui.addFolder('Shadow').close();\n\t\tshadowFolder.add(directionalLight.shadow, 'bias', -0.02, 0.02, 0.0001);\n\t\tshadowFolder.add(directionalLight.shadow, 'normalBias', -5, 5, 0.1);\n\t\tshadowFolder.add(directionalLight.shadow, 'frustumEdgeFalloff', -1, 1, 0.01);\n\n\t\tconst adapterFolder = gui.addFolder('Shadow Adapter');\n\t\tadapterFolder.add(params, 'type', ['BOX3+CAMERA', 'BOX3', 'CAMERA']).onChange(value => {\n\t\t\tif (value === 'BOX3+CAMERA') {\n\t\t\t\tshadowAdapter.bindBox.fromBox3(shadowBox);\n\t\t\t\tshadowAdapter.bindCamera = camera;\n\t\t\t} else if (value === 'BOX3') {\n\t\t\t\tshadowAdapter.bindBox.fromBox3(shadowBox);\n\t\t\t\tshadowAdapter.bindCamera = null;\n\t\t\t} else if (value === 'CAMERA') {\n\t\t\t\tshadowAdapter.bindBox.makeEmpty();\n\t\t\t\tshadowAdapter.bindCamera = camera;\n\t\t\t}\n\t\t});\n\t\tadapterFolder.add(shadowAdapter, 'autoCorrectUp');\n\t\tadapterFolder.add(shadowAdapter, 'bindCameraDistance', 0.1, 8000, 1);\n\t\tconst detailFolder = adapterFolder.addFolder('Detail').close();\n\t\tdetailFolder.add(params, 'sizeFactor', 1, 1.5, 0.01);\n\t\tdetailFolder.add(params, 'depthFactor', 1, 1.5, 0.01);\n\t\tdetailFolder.add(params, 'nearFactor', 0, 1, 0.01);\n\t\tdetailFolder.add(shadowAdapter.shadowOffsetFactor, 'x', 0, 1, 0.1).name('offsetFactorY');\n\t\tdetailFolder.add(shadowAdapter.shadowOffsetFactor, 'y', 0, 1, 0.1).name('offsetFactorZ');\n\n\t\tconst debugFolder = gui.addFolder('Debug');\n\t\tdebugFolder.add(params, 'debug').onChange(setDebugger);\n\n\t\t//\n\n\t\tfunction loop(count) {\n\t\t\trequestAnimationFrame(loop);\n\n\t\t\tcontroller.update();\n\t\t\tdebugController.update();\n\n\t\t\tcamera.updateMatrix(); // update camera matrix before calculate shadow\n\t\t\tshadowAdapter.update();\n\n\t\t\tdirectionalLightHelper.update();\n\n\t\t\t//\n\n\t\t\tforwardRenderer.render(scene, params.debug ? debugCamera : camera);\n\t\t}\n\t\trequestAnimationFrame(loop);\n\n\t\tfunction onWindowResize() {\n\t\t\twidth = window.innerWidth || 2;\n\t\t\theight = window.innerHeight || 2;\n\n\t\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 500, 50000);\n\t\t\tdebugCamera.setPerspective(60 / 180 * Math.PI, width / height, 500, 100000);\n\t\t\n\t\t\tcameraHelper.update();\n\n\t\t\tforwardRenderer.screenRenderTarget.resize(width, height);\n\t\t}\n\t\twindow.addEventListener('resize', onWindowResize, false);\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "examples/light_softshadow.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>t3d - soft shadow</title>\n\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n\t<link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n</head>\n<body>\n    <div id=\"info\">\n        <a href=\"\" target=\"_blank\">t3d</a> - soft shadow\n    </div>\n\n\t<!-- Import maps polyfill -->\n    <!-- Remove this when import maps will be widely supported -->\n    <script async src=\"./libs/es-module-shims.js\"></script>\n\n    <script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n    <script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { Clock } from 't3d/addons/Clock.js';\n\t\timport { OrbitControls } from 't3d/addons/controls/OrbitControls.js';\n\t\timport { SpotLightHelper } from 't3d/addons/objects/SpotLightHelper.js';\n\t\timport { ForwardRenderer } from 't3d/addons/render/ForwardRenderer.js';\n\t\timport { GUI } from './libs/lil-gui.esm.min.js';\n\n\t\tlet width = window.innerWidth || 2;\n\t\tlet height = window.innerHeight || 2;\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = width;\n\t\tcanvas.height = height;\n\t\tdocument.body.appendChild(canvas);\n\n\t\tconst forwardRenderer = new ForwardRenderer(canvas);\n\n\t\tconst scene = new t3d.Scene();\n\t\tscene.fog = new t3d.Fog(0x000000, 10, 1000);\n\t\t\n\t\tconst cubes = [];\n\t\tconst positions = [\n\t\t\tnew t3d.Vector3(0, 20, 0),\n\t\t\tnew t3d.Vector3(20, 20, -20),\n\t\t\tnew t3d.Vector3(-20, 20, 20)\n\t\t];\n\n\t\tfor (let i = 0; i < 3; i++) {\n\t\t\tconst cube_geometry = new t3d.BoxGeometry(3, 40, 3);\n\t\t\tconst lambert = new t3d.LambertMaterial();\n\t\t\tlambert.diffuse.setHex(0xffffff);\n\t\t\tconst cube = new t3d.Mesh(cube_geometry, lambert);\n\t\t\tcube.position.copy(positions[i]);\n\t\t\tcube.castShadow = true;\n\t\t\tcube.receiveShadow = true;\n\t\t\tscene.add(cube);\n\t\t\tcubes.push(cube);\n\t\t}\n\n\t\tconst plane_geometry = new t3d.PlaneGeometry(2000, 2000);\n\t\tconst lambert = new t3d.LambertMaterial();\n\t\tlambert.diffuse.setHex(0xffffff);\n\t\tlambert.dithering = true;\n\t\tconst plane = new t3d.Mesh(plane_geometry, lambert);\n\t\tplane.receiveShadow = true;\n\t\tplane.shadowType = forwardRenderer.capabilities.version >= 2 ? t3d.SHADOW_TYPE.PCSS32_SOFT : t3d.SHADOW_TYPE.POISSON_SOFT;\n\t\tscene.add(plane);\n\n\t\tconst sphere_geometry = new t3d.SphereGeometry(3, 10, 10);\n\t\tconst basic = new t3d.BasicMaterial();\n\t\tbasic.diffuse.setHex(0xffffff);\n\t\tconst lightSphere = new t3d.Mesh(sphere_geometry, basic);\n\t\tlightSphere.position.set(50, 50, 50);\n\t\tscene.add(lightSphere);\n\n\t\tconst ambientLight = new t3d.AmbientLight(0xffffff, 0.05);\n\t\tscene.add(ambientLight);\n\n\t\tconst spotLight = new t3d.SpotLight(0xffffff, 0.9, 400, Math.PI / 5, 0.2);\n\t\tspotLight.position.set(50, 50, 50);\n\t\tspotLight.lookAt(new t3d.Vector3(0, 10, 0), new t3d.Vector3(0, 1, 0));\n\t\tspotLight.castShadow = true;\n\t\tspotLight.shadow.cameraNear = 20; // because PCSS soft shadow need a bigger value range\n\t\tspotLight.shadow.cameraFar = 350;\n\t\tspotLight.shadow.mapSize.set(1024, 1024);\n\t\tscene.add(spotLight);\n\t\t\n\t\tconst spotLightHelper = new SpotLightHelper(spotLight);\n\t\tspotLight.add(spotLightHelper);\n\n\t\tconst camera = new t3d.Camera();\n\t\tcamera.outputEncoding = t3d.TEXEL_ENCODING_TYPE.SRGB;\n\t\tcamera.position.set(80, 130, 150);\n\t\tcamera.lookAt(new t3d.Vector3(0, 0, 0), new t3d.Vector3(0, 1, 0));\n\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 1000);\n\t\tscene.add(camera);\n\n\t\tconst controller = new OrbitControls(camera, canvas);\n\t\tcontroller.target.set(0, 20, 0);\n\n\t\tconst gui = new GUI();\n\t\tgui.add({ version: 'WebGL ' + forwardRenderer.capabilities.version }, 'version').disable();\n\t\tgui.add(scene, 'disableShadowSampler');\n\t\tgui.add(plane, 'shadowType', t3d.SHADOW_TYPE);\n\t\tgui.add(spotLight.shadow, 'radius', 0.1, 10);\n\n\t\tconst clock = new Clock();\n\n\t\tfunction loop(count) {\n\t\t\trequestAnimationFrame(loop);\n\n\t\t\tcontroller.update();\n\n\t\t\tconst elapsedTime = clock.getElapsedTime();\n\t\t\tcubes[0].position.y = 25 * Math.sin(elapsedTime * 1.2) + 25;\n\n\t\t\tspotLightHelper.update();\n\n\t\t\tforwardRenderer.render(scene, camera);\n\t\t}\n\t\trequestAnimationFrame(loop);\n\n\t\tfunction onWindowResize() {\n\t\t\twidth = window.innerWidth || 2;\n\t\t\theight = window.innerHeight || 2;\n\n\t\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 1000);\n\n\t\t\tforwardRenderer.screenRenderTarget.resize(width, height);\n\t\t}\n\t\twindow.addEventListener('resize', onWindowResize, false);\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "examples/light_sphericalharmonicslight.html",
    "content": "<!DOCTYPE html>\n<html>\n\t<head>\n\t\t<meta charset=\"utf-8\" />\n\t\t<title>t3d - sphericalharmonicslight</title>\n\t\t<meta\n\t\t\tname=\"viewport\"\n\t\t\tcontent=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\"\n\t\t/>\n\t\t<link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\" />\n\t</head>\n\t<body>\n\t\t<div id=\"info\"><a href=\"\" target=\"_blank\">t3d</a> - pbr</div>\n\n\t\t<!-- Import maps polyfill -->\n\t\t<!-- Remove this when import maps will be widely supported -->\n\t\t<script async src=\"./libs/es-module-shims.js\"></script>\n\n\t\t<script type=\"importmap\">\n\t\t\t{\n\t\t\t\t\"imports\": {\n\t\t\t\t\t\"t3d\": \"../build/t3d.module.js\",\n\t\t\t\t\t\"t3d/addons/\": \"./jsm/\"\n\t\t\t\t}\n\t\t\t}\n\t\t</script>\n\n\t\t<script type=\"module\">\n\t\t\timport * as t3d from 't3d';\n\t\t\timport { GUI } from './libs/lil-gui.esm.min.js';\n\t\t\timport { SkyBox } from 't3d/addons/objects/SkyBox.js';\n\t\t\timport { OrbitControls } from 't3d/addons/controls/OrbitControls.js';\n\t\t\timport { ForwardRenderer } from 't3d/addons/render/ForwardRenderer.js';\n\t\t\timport { TextureCubeLoader } from 't3d/addons/loaders/TextureCubeLoader.js';\n\t\t\timport { PMREMGenerator } from 't3d/addons/textures/PMREMGenerator.js';\n\t\t\t// import { SHGenerator } from './jsm/SHGenerator.js';\n\n\t\t\tconst useDevicePixelRatio = true;\n\t\t\tconst devicePixelRatio = window.devicePixelRatio;\n\n\t\t\tlet width = window.innerWidth || 2;\n\t\t\tlet height = window.innerHeight || 2;\n\n\t\t\tconst canvas = document.createElement('canvas');\n\t\t\tcanvas.width = useDevicePixelRatio ? width * devicePixelRatio : width;\n\t\t\tcanvas.height = useDevicePixelRatio ? height * devicePixelRatio : height;\n\t\t\tcanvas.style.width = width + 'px';\n\t\t\tcanvas.style.height = height + 'px';\n\t\t\tdocument.body.appendChild(canvas);\n\n\t\t\tconst forwardRenderer = new ForwardRenderer(canvas);\n\n\t\t\tconst scene = new t3d.Scene();\n\n\t\t\tconst directionalLight = new t3d.DirectionalLight(0xffffff, 0.2);\n\t\t\tdirectionalLight.position.set(10, 10, 10);\n\t\t\tdirectionalLight.lookAt(new t3d.Vector3(), new t3d.Vector3(0, 1, 0));\n\t\t\tscene.add(directionalLight);\n\n\t\t\tconst camera = new t3d.Camera();\n\t\t\tcamera.outputEncoding = t3d.TEXEL_ENCODING_TYPE.SRGB;\n\t\t\tcamera.position.set(0, 0, 30);\n\t\t\tcamera.lookAt(new t3d.Vector3(0, 0, 0), new t3d.Vector3(0, 1, 0));\n\t\t\tcamera.setPerspective((40 / 180) * Math.PI, width / height, 1, 1000);\n\t\t\tscene.add(camera);\n\n\t\t\tconst shData = [\n\t\t\t\t0.46473264481252535, 0.4236897533417428, 0.45701205619485963,\n\t\t\t\t0.3082483306011903, 0.27957493334994027, 0.35204972217190333,\n\t\t\t\t0.031559873309940596, 0.05869524291220626, 0.07546942518474699,\n\t\t\t\t0.0783877292004041, -0.12536110355589788, -0.29476339800614265,\n\t\t\t\t0.1023572930696087, -0.12603253904914027, -0.32909081046315386,\n\t\t\t\t0.0333243263361059, 0.0673778529179098, 0.08473670022869158,\n\t\t\t\t-0.04482904299350188, -0.040847638305410224, -0.06280256304709063,\n\t\t\t\t0.06313178648937207, -0.029214406490743174, -0.07707942563681561,\n\t\t\t\t0.03484167978594885, 0.03851877222487137, 0.002600994399406049\n\t\t\t];\n\n\t\t\tconst sphere_geometry = new t3d.SphereGeometry(5, 64, 32);\n\t\t\tconst pbr_mat = new t3d.PBRMaterial();\n\t\t\tpbr_mat.diffuse.setHSL(1.0, 1.0, 1.0);\n\t\t\tpbr_mat.metalness = 0;\n\t\t\tpbr_mat.roughness = 1;\n\t\t\tconst sphere = new t3d.Mesh(sphere_geometry, pbr_mat);\n\t\t\tscene.add(sphere);\n\n\t\t\tconst cubeTexturePath = './resources/skybox/pisa/';\n\t\t\tlet cubeTexture = new TextureCubeLoader().load(\n\t\t\t\t[\n\t\t\t\t\tcubeTexturePath + 'px.png',\n\t\t\t\t\tcubeTexturePath + 'nx.png',\n\t\t\t\t\tcubeTexturePath + 'py.png',\n\t\t\t\t\tcubeTexturePath + 'ny.png',\n\t\t\t\t\tcubeTexturePath + 'pz.png',\n\t\t\t\t\tcubeTexturePath + 'nz.png'\n\t\t\t\t],\n\t\t\t\tfunction() {\n\t\t\t\t\tconst sphericalHarmonicsLight = new t3d.SphericalHarmonicsLight();\n\t\t\t\t\tscene.add(sphericalHarmonicsLight);\n\n\t\t\t\t\tcubeTexture.encoding = t3d.TEXEL_ENCODING_TYPE.SRGB;\n\t\t\t\t\t// SHGenerator.fromCubeTexture(forwardRenderer, cubeTexture, sphericalHarmonicsLight.sh);\n\t\t\t\t\tsphericalHarmonicsLight.sh.fromArray(shData);\n\n\t\t\t\t\tcubeTexture = (new PMREMGenerator(128)).prefilter(forwardRenderer, cubeTexture);\n\n\t\t\t\t\tconst skyBox = new SkyBox(cubeTexture);\n\t\t\t\t\tskyBox.gamma = true;\n\t\t\t\t\tscene.add(skyBox);\n\n\t\t\t\t\tscene.environment = cubeTexture;\n\t\t\t\t\tscene.envDiffuseIntensity = 0;\n\n\t\t\t\t\tconst gui = new GUI();\n\t\t\t\t\tgui.add(sphericalHarmonicsLight, 'intensity', 0, 1, 0.01).name('sphericalHarmonicsLight');\n\t\t\t\t\tgui.add(scene, 'envDiffuseIntensity', 0, 1, 0.01).name('environmentLight');\n\t\t\t\t}\n\t\t\t);\n\n\t\t\t// add a hover controller\n\t\t\tconst controller = new OrbitControls(camera, canvas);\n\n\t\t\tfunction loop(count) {\n\t\t\t\trequestAnimationFrame(loop);\n\n\t\t\t\tcontroller.update();\n\t\t\t\tscene.updateMatrix();\n\t\t\t\tscene.updateRenderStates(camera);\n\t\t\t\tscene.updateRenderQueue(camera);\n\t\t\t\tforwardRenderer.render(scene, camera);\n\t\t\t}\n\t\t\trequestAnimationFrame(loop);\n\n\t\t\tfunction onWindowResize() {\n\t\t\t\twidth = window.innerWidth || 2;\n\t\t\t\theight = window.innerHeight || 2;\n\n\t\t\t\tcamera.setPerspective((40 / 180) * Math.PI, width / height, 1, 1000);\n\n\t\t\t\tforwardRenderer.screenRenderTarget.resize(\n\t\t\t\t\tuseDevicePixelRatio ? width * devicePixelRatio : width,\n\t\t\t\t\tuseDevicePixelRatio ? height * devicePixelRatio : height\n\t\t\t\t);\n\t\t\t\tcanvas.style.width = width + 'px';\n\t\t\t\tcanvas.style.height = height + 'px';\n\t\t\t}\n\t\t\twindow.addEventListener('resize', onWindowResize, false);\n\t\t</script>\n\t</body>\n</html>\n"
  },
  {
    "path": "examples/light_spotlight.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>t3d - spotlight</title>\n\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n\t<link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n</head>\n<body>\n    <div id=\"info\">\n        <a href=\"\" target=\"_blank\">t3d</a> - spot light\n    </div>\n\n\t<script src=\"./libs/nanobar.js\"></script>\n\n\t<!-- Import maps polyfill -->\n    <!-- Remove this when import maps will be widely supported -->\n    <script async src=\"./libs/es-module-shims.js\"></script>\n\n    <script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n    <script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { GLTFLoader } from 't3d/addons/loaders/glTF/GLTFLoader.js';\n\t\timport { SpotLightHelper } from 't3d/addons/objects/SpotLightHelper.js';\n\t\timport { ForwardRenderer } from 't3d/addons/render/ForwardRenderer.js';\n\t\timport { OrbitControls } from 't3d/addons/controls/OrbitControls.js';\n\t\timport { GUI } from './libs/lil-gui.esm.min.js';\n\n\t\tlet width = window.innerWidth || 2;\n\t\tlet height = window.innerHeight || 2;\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = width;\n\t\tcanvas.height = height;\n\t\tdocument.body.appendChild(canvas);\n\n\t\tconst forwardRenderer = new ForwardRenderer(canvas);\n\n\t\tconst scene = new t3d.Scene();\n\t\tscene.fog = new t3d.Fog(0x000000, 10, 1000);\n\n\t\tconst nanobar = new Nanobar();\n\t\tnanobar.el.style.background = 'gray';\n\n\t\tconst loadingManager = new t3d.LoadingManager(function() {\n\t\t\tnanobar.go(100);\n\t\t\tnanobar.el.style.background = 'transparent';\n\t\t}, function(url, itemsLoaded, itemsTotal) {\n\t\t\tif (itemsLoaded < itemsTotal) {\n\t\t\t\tnanobar.go(itemsLoaded / itemsTotal * 100);\n\t\t\t}\n\t\t});\n\n\t\tlet model;\n\n\t\tconsole.time('Load glTF');\n\t\tconst gltfUri = './resources/models/gltf/bust_of_woman/glTF-Binary/bust_of_woman.glb';\n\t\tnew GLTFLoader(loadingManager).load(gltfUri).then(function(result) {\n\t\t\tconsole.timeEnd('Load glTF');\n\n\t\t\tmodel = result.root;\n\n\t\t\tmodel.traverse(node => {\n\t\t\t\tif (node.isMesh) {\n\t\t\t\t\tnode.castShadow = true;\n\t\t\t\t\tnode.receiveShadow = true;\n\t\t\t\t\tnode.shadowType = t3d.SHADOW_TYPE.PCF5_SOFT;\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tscene.add(model);\n\t\t}).catch(function(e) { console.error(e) });\n\n\t\tconst sphere_geometry = new t3d.SphereGeometry(10, 32, 16);\n\t\tconst sphere_material = new t3d.PBRMaterial();\n\t\tsphere_material.diffuse.setHex(0xBBBBBB);\n\t\tsphere_material.metalness = 0;\n\t\tsphere_material.roughness = 1;\n\t\tsphere_material.side = t3d.DRAW_SIDE.DOUBLE;\n\t\tconst sphere = new t3d.Mesh(sphere_geometry, sphere_material);\n\t\tsphere.position.set(-2, 10, -30);\n\t\tsphere.shadowType = t3d.SHADOW_TYPE.PCF5_SOFT;\n\t\tsphere.castShadow = true;\n\t\tsphere.receiveShadow = true;\n\t\tscene.add(sphere);\n\n\t\tconst box_geometry = new t3d.BoxGeometry(20, 40, 20);\n\t\tconst box_material = new t3d.PBRMaterial();\n\t\tbox_material.diffuse.setHex(0xBBBBBB);\n\t\tbox_material.metalness = 0;\n\t\tbox_material.roughness = 1;\n\t\tbox_material.side = t3d.DRAW_SIDE.DOUBLE;\n\t\tconst box = new t3d.Mesh(box_geometry, box_material);\n\t\tbox.position.set(50, 20, -10);\n\t\tbox.shadowType = t3d.SHADOW_TYPE.PCF5_SOFT;\n\t\tbox.castShadow = true;\n\t\tbox.receiveShadow = true;\n\t\tscene.add(box);\n\n\t\tconst plane_geometry = new t3d.PlaneGeometry(2000, 2000);\n\t\tconst plane_material = new t3d.LambertMaterial();\n\t\tplane_material.diffuse.setHex(0x999999);\n\t\tplane_material.dithering = true;\n\t\tconst plane = new t3d.Mesh(plane_geometry, plane_material);\n\t\tplane.shadowType = t3d.SHADOW_TYPE.PCF5_SOFT;\n\t\tplane.receiveShadow = true;\n\t\tscene.add(plane);\n\n\t\tconst ambientLight = new t3d.AmbientLight(0xffffff, 0.3);\n\t\tscene.add(ambientLight);\n\n\t\tconst spotLight = new t3d.SpotLight(0xffffff, 1, 500, Math.PI / 6, 0.2);\n\t\tspotLight.castShadow = true;\n\t\tspotLight.shadow.mapSize.set(1024, 1024);\n\t\tspotLight.shadow.bias = -0.001;\n\t\tspotLight.shadow.normalBias = 0.1;\n\t\tspotLight.shadow.cameraNear = 10;\n\t\tscene.add(spotLight);\n\t\t\n\t\tconst spotLightHelper = new SpotLightHelper(spotLight);\n\t\tspotLight.add(spotLightHelper);\n\n\t\tconst camera = new t3d.Camera();\n\t\tcamera.position.set(-80, 30, 80);\n\t\tcamera.lookAt(new t3d.Vector3(0, 26, 0), new t3d.Vector3(0, 1, 0));\n\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 0.1, 1000);\n\t\tscene.add(camera);\n\n\t\tconst controller = new OrbitControls(camera, canvas);\n\t\tcontroller.target.set(0, 26, 0);\n\n\t\tfunction setLightPosition(angle) {\n\t\t\tspotLight.position.x = -Math.sin(angle / 180 * Math.PI) * 60;\n\t\t\tspotLight.position.y = 50;\n\t\t\tspotLight.position.z = -Math.cos(angle / 180 * Math.PI) * 60;\n\t\t\tspotLight.lookAt(new t3d.Vector3(0, 26, 0), new t3d.Vector3(0, 1, 0));\n\t\t}\n\n\t\tsetLightPosition(120);\n\n\t\tconst gui = new GUI();\n\t\tgui.add({ version: 'WebGL ' + forwardRenderer.capabilities.version }, 'version').disable();\n\t\tgui.add(spotLight, 'intensity', 0, 2, 0.01);\n\t\tgui.addColor(spotLight, 'color');\n\t\tgui.add({ angle: 90 }, 'angle', 0, 360, 0.01).onChange(setLightPosition);\n\t\tgui.add(spotLightHelper, 'visible').name('helper');\n\t\tconst detailFolder = gui.addFolder('Details');\n\t\tdetailFolder.add(spotLight, 'decay', 0, 4, 0.01);\n\t\tdetailFolder.add(spotLight, 'distance', 1, 500, 0.1);\n\t\tdetailFolder.add(spotLight, 'penumbra', 0, 1, 0.01);\n\t\tdetailFolder.add({ angle: 30 }, 'angle', 0, 90).onChange(function(value) { spotLight.angle = value / 180 * Math.PI });\n\t\tdetailFolder.close();\n\t\tconst shadowFolder = gui.addFolder('Shadow');\n\t\tshadowFolder.add(spotLight, 'castShadow').name('enable');\n\t\tshadowFolder.add(scene, 'disableShadowSampler');\n\t\tshadowFolder.add(plane, 'shadowType', t3d.SHADOW_TYPE).onChange(function(value) {\n\t\t\tif (model) {\n\t\t\t\tmodel.traverse(node => {\n\t\t\t\t\tif (node.isMesh) {\n\t\t\t\t\t\tnode.shadowType = value;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t\tsphere.shadowType = value;\n\t\t\tbox.shadowType = value;\n\t\t});\n\t\tshadowFolder.add(spotLight.shadow, 'radius', 0, 5, 0.01);\n\t\tshadowFolder.add(spotLight.shadow, 'bias', -0.002, 0.002, 0.0001);\n\t\tshadowFolder.add(spotLight.shadow, 'normalBias', -0.5, 0.5, 0.001);\n\t\tshadowFolder.close();\n\n\t\tfunction loop(count) {\n\t\t\trequestAnimationFrame(loop);\n\n\t\t\tcontroller.update();\n\t\t\tspotLightHelper.update();\n\n\t\t\tforwardRenderer.render(scene, camera);\n\t\t}\n\t\trequestAnimationFrame(loop);\n\n\t\tfunction onWindowResize() {\n\t\t\twidth = window.innerWidth || 2;\n\t\t\theight = window.innerHeight || 2;\n\n\t\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 0.1, 1000);\n\n\t\t\tforwardRenderer.screenRenderTarget.resize(width, height);\n\t\t}\n\t\twindow.addEventListener('resize', onWindowResize, false);\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "examples/lines_dashedlines.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>t3d - dashed lines</title>\n\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n\t<link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n</head>\n<body>\n    <div id=\"info\">\n        <a href=\"\" target=\"_blank\">t3d</a> - dashed lines\n    </div>\n\n\t<!-- Import maps polyfill -->\n    <!-- Remove this when import maps will be widely supported -->\n    <script async src=\"./libs/es-module-shims.js\"></script>\n\n    <script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n    <script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { LineDashedShader } from 't3d/addons/shaders/LineDashedShader.js';\n\t\timport { CurveUtils } from 't3d/addons/math/curves/CurveUtils.js';\n\t\timport { ForwardRenderer } from 't3d/addons/render/ForwardRenderer.js';\n\n\t\tlet width = window.innerWidth || 2;\n\t\tlet height = window.innerHeight || 2;\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = width;\n\t\tcanvas.height = height;\n\t\tdocument.body.appendChild(canvas);\n\n\t\tconst forwardRenderer = new ForwardRenderer(canvas);\n\n\t\tconst scene = new t3d.Scene();\n\t\tscene.fog = new t3d.Fog(0x000000, 250, 400);\n\n\t\tconst points = CurveUtils.hilbert3D(new t3d.Vector3(0, 0, 0), 50, 2, 0, 1, 2, 3, 4, 5, 6, 7);\n\n\t\tconst lineGeometry = new t3d.Geometry();\n\t\tconst verticesArray = [];\n\n\t\tpoints.forEach((point, i) => {\n\t\t\tverticesArray.push(point.x, point.y, point.z, i % 2 === 0 ? 0 : 15);\n\t\t});\n\t\tconst buffer = new t3d.Buffer(new Float32Array(verticesArray), 4);\n\n\t\tlineGeometry.addAttribute('a_Position', new t3d.Attribute(buffer, 3, 0));\n\t\tlineGeometry.addAttribute('lineDistance', new t3d.Attribute(buffer, 1, 3));\n\n\t\tlineGeometry.computeBoundingBox();\n\t\tlineGeometry.computeBoundingSphere();\n\n\t\tconst linesMaterial = new t3d.ShaderMaterial(LineDashedShader);\n\t\tlinesMaterial.diffuse.setHex(0xffff00);\n\t\tlinesMaterial.lineWidth = 1;\n\t\tlinesMaterial.drawMode = t3d.DRAW_MODE.LINE_STRIP;\n\n\t\tconst lines = new t3d.Mesh(lineGeometry, linesMaterial);\n\t\tscene.add(lines);\n\n\t\tconst camera = new t3d.Camera();\n\t\tcamera.position.set(0, 0, 1000);\n\t\tcamera.lookAt(new t3d.Vector3(0, 0, 0), new t3d.Vector3(0, 1, 0));\n\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 500);\n\t\tscene.add(camera);\n\n\t\tfunction loop(count) {\n\t\t\trequestAnimationFrame(loop);\n\n\t\t\t// rotate camera\n\t\t\tcamera.position.x = 300 * Math.sin(count / 1000 * .3);\n\t\t\tcamera.position.z = 300 * Math.cos(count / 1000 * .3);\n\t\t\tcamera.lookAt(new t3d.Vector3(0, 0, 0), new t3d.Vector3(0, 1, 0));\n\n\t\t\tforwardRenderer.render(scene, camera);\n\t\t}\n\t\trequestAnimationFrame(loop);\n\n\t\tfunction onWindowResize() {\n\t\t\twidth = window.innerWidth || 2;\n\t\t\theight = window.innerHeight || 2;\n\n\t\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 500);\n\n\t\t\tforwardRenderer.screenRenderTarget.resize(width, height);\n\t\t}\n\t\twindow.addEventListener('resize', onWindowResize, false);\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "examples/lines_instancedlines.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>t3d - instanced lines</title>\n\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n\t<link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n</head>\n<body>\n    <div id=\"info\">\n        <a href=\"\" target=\"_blank\">t3d</a> - instanced lines\n    </div>\n\n\t<!-- Import maps polyfill -->\n    <!-- Remove this when import maps will be widely supported -->\n    <script async src=\"./libs/es-module-shims.js\"></script>\n\n    <script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n    <script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { InstancedLine } from 't3d/addons/objects/InstancedLine.js';\n\t\timport { CurveUtils } from 't3d/addons/math/curves/CurveUtils.js';\n\t\timport { ForwardRenderer } from 't3d/addons/render/ForwardRenderer.js';\n\t\timport { OrbitControls } from 't3d/addons/controls/OrbitControls.js';\n\t\timport { Texture2DLoader } from 't3d/addons/loaders/Texture2DLoader.js';\n\t\timport { Clock } from 't3d/addons/Clock.js';\n\t\timport { GUI } from './libs/lil-gui.esm.min.js';\n\n\t\tlet width = window.innerWidth || 2;\n\t\tlet height = window.innerHeight || 2;\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = width;\n\t\tcanvas.height = height;\n\t\tdocument.body.appendChild(canvas);\n\n\t\tconst forwardRenderer = new ForwardRenderer(canvas);\n\n\t\tconst scene = new t3d.Scene();\n\t\t// scene.fog = new t3d.FogExp2(0x000000, 0.005);\n\t\tscene.fog = new t3d.Fog(0x000000, 150, 500);\n\n\t\tconst texture = new Texture2DLoader().load('./resources/platte.png');\n\t\ttexture.anisotropy = forwardRenderer.capabilities.maxAnisotropy;\n\t\ttexture.wrapS = texture.wrapT = t3d.TEXTURE_WRAP.REPEAT;\n\n\t\tconst params = { lineWidth: 5, cornerThreshold: 0.3 };\n\n\t\tconst points = CurveUtils.hilbert3D(new t3d.Vector3(0, 0, 0), 80, 2, 0, 1, 2, 3, 4, 5, 6, 7);\n\n\t\tconst instancedLine = new InstancedLine();\n\t\tinstancedLine.material.uniforms.lineWidth = params.lineWidth;\n\t\tinstancedLine.material.uniforms.cornerThreshold = params.cornerThreshold;\n\t\tinstancedLine.material.diffuse.setRGB(0, 245 / 255, 255 / 255);\n\t\tinstancedLine.geometry.setFromPoints(points);\n\t\tinstancedLine.position.set(-100, 0, 0);\n\t\tscene.add(instancedLine);\n\n\t\tconst instancedLine2 = new InstancedLine();\n\t\tinstancedLine2.material.defines.SWAP_UV = true;\n\t\tinstancedLine2.material.defines.FLAT_W = true;\n\t\tinstancedLine2.material.defines.LINE_BREAK = true;\n\t\tinstancedLine2.material.uniforms.lineWidth = params.lineWidth;\n\t\tinstancedLine2.material.uniforms.cornerThreshold = params.cornerThreshold;\n\t\tinstancedLine2.material.diffuseMap = texture;\n\t\tinstancedLine2.material.diffuseMapTransform.setUvTransform(0, 0, 0.002, 1, 0, 0.5, 0.5);\n\t\tinstancedLine2.geometry.setFromPoints(points, [2, 5]); // Mark line break at index 2 & 5\n\t\tinstancedLine2.position.set(100, 0, 0);\n\t\tscene.add(instancedLine2);\n\n\t\tconst camera = new t3d.Camera();\n\t\tcamera.position.set(0, 0, 300);\n\t\tcamera.lookAt(new t3d.Vector3(0, 0, 0), new t3d.Vector3(0, 1, 0));\n\t\tcamera.setPerspective(75 / 180 * Math.PI, width / height, 1, 500);\n\t\tscene.add(camera);\n\n\t\tconst gui = new GUI();\n\t\tgui.add(params, 'lineWidth', 0, 10, 0.1).onChange(value => {\n\t\t\tinstancedLine.material.uniforms.lineWidth = value;\n\t\t\tinstancedLine2.material.uniforms.lineWidth = value;\n\t\t});\n\t\tgui.add(params, 'cornerThreshold', 0, 1, 0.01).onChange(value => {\n\t\t\tinstancedLine.material.uniforms.cornerThreshold = value;\n\t\t\tinstancedLine2.material.uniforms.cornerThreshold = value;\n\t\t});\n\n\t\tconst controller = new OrbitControls(camera, canvas);\n\t\tcontroller.enablePan = false;\n\t\tcontroller.enableDollying = false;\n\n\t\tconst clock = new Clock();\n\n\t\tlet offsetX = 0;\n\n\t\tfunction loop(count) {\n\t\t\trequestAnimationFrame(loop);\n\n\t\t\tconst deltaTime = clock.getDelta();\n\t\t\toffsetX += 0.2 * deltaTime;\n\n\t\t\tinstancedLine2.material.diffuseMapTransform.setUvTransform(offsetX, 0, 0.002, 1, 0, 0.5, 0.5);\n\n\t\t\tinstancedLine.euler.y += 0.1 * deltaTime;\n\t\t\tinstancedLine2.euler.y += 0.1 * deltaTime;\n\n\t\t\tcontroller.update();\n\n\t\t\tforwardRenderer.render(scene, camera);\n\t\t}\n\t\trequestAnimationFrame(loop);\n\n\t\tfunction onWindowResize() {\n\t\t\twidth = window.innerWidth || 2;\n\t\t\theight = window.innerHeight || 2;\n\n\t\t\tcamera.setPerspective(75 / 180 * Math.PI, width / height, 1, 500);\n\n\t\t\tforwardRenderer.screenRenderTarget.resize(width, height);\n\t\t}\n\t\twindow.addEventListener('resize', onWindowResize, false);\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "examples/lines_lines.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>t3d - lines</title>\n\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n\t<link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n</head>\n<body>\n    <div id=\"info\">\n        <a href=\"\" target=\"_blank\">t3d</a> - lines\n    </div>\n\n\t<!-- Import maps polyfill -->\n    <!-- Remove this when import maps will be widely supported -->\n    <script async src=\"./libs/es-module-shims.js\"></script>\n\n    <script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n    <script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { Clock } from 't3d/addons/Clock.js';\n\t\timport { ForwardRenderer } from 't3d/addons/render/ForwardRenderer.js';\n\t\timport { Texture2DLoader } from 't3d/addons/loaders/Texture2DLoader.js';\n\n\t\tlet width = window.innerWidth || 2;\n\t\tlet height = window.innerHeight || 2;\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = width * window.devicePixelRatio;\n\t\tcanvas.height = height * window.devicePixelRatio;\n\t\tcanvas.style.width = width + 'px';\n\t\tcanvas.style.height = height + 'px';\n\t\tdocument.body.appendChild(canvas);\n\n\t\tconst forwardRenderer = new ForwardRenderer(canvas);\n\n\t\tconst scene = new t3d.Scene();\n\t\tscene.fog = new t3d.Fog(0x000000, 50, 60);\n\t\t\n\t\tconst texture = new Texture2DLoader().load('./resources/light1.png');\n\t\ttexture.anisotropy = forwardRenderer.capabilities.maxAnisotropy;\n\t\ttexture.wrapS = texture.wrapT = t3d.TEXTURE_WRAP.REPEAT;\n\n\t\tconst linesMaterial = new t3d.BasicMaterial();\n\t\tlinesMaterial.diffuse.setHex(0xffffff);\n\t\tlinesMaterial.diffuseMap = texture;\n\t\tlinesMaterial.drawMode = t3d.DRAW_MODE.LINE_LOOP;\n\t\tlinesMaterial.transparent = true;\n\t\tlinesMaterial.blend = t3d.BLEND_TYPE.ADD;\n\n\t\tconst material = new t3d.BasicMaterial();\n\t\tmaterial.diffuse.setHex(0xffff00);\n\t\tmaterial.drawMode = t3d.DRAW_MODE.LINES;\n\t\tmaterial.transparent = true;\n\t\tmaterial.opacity = 0.7;\n\t\tmaterial.blend = t3d.BLEND_TYPE.NORMAL;\n\n\t\tconst lines = [];\n\t\tconst speeds = [];\n\t\tfor (let i = 0; i < 18; i++) {\n\t\t\tconst lineGeometry = new t3d.SphereGeometry(2 * i + 2, 10, 5);\n\n\t\t\tconst line = new t3d.Mesh(lineGeometry, i == 0 ? material : linesMaterial);\n\t\t\n\t\t\tif (i > 0) {\n\t\t\t\tline.euler.x = Math.PI * 2 * Math.random();\n\t\t\t\tline.euler.y = Math.PI * 2 * Math.random();\n\t\t\t\tline.euler.z = Math.PI * 2 * Math.random();\n\t\t\t}\n\n\t\t\tscene.add(line);\n\n\t\t\tlines.push(line);\n\n\t\t\tspeeds.push(new t3d.Vector3(Math.random() - 0.5, Math.random() - 0.5, Math.random() - 0.5).multiplyScalar(0.005));\n\t\t}\n\n\t\tconst camera = new t3d.Camera();\n\t\tcamera.position.set(0, 0, 50);\n\t\tcamera.lookAt(new t3d.Vector3(0, 0, 0), new t3d.Vector3(0, 1, 0));\n\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 1000);\n\t\tscene.add(camera);\n\n\t\tconst clock = new Clock();\n\n\t\tlet offsetX = 0;\n\n\t\tfunction loop(count) {\n\t\t\trequestAnimationFrame(loop);\n\n\t\t\tconst deltaTime = clock.getDelta();\n\n\t\t\tfor (let i = 0; i < lines.length; i++) {\n\t\t\t\tconst line = lines[i];\n\t\t\t\tconst speed = speeds[i];\n\n\t\t\t\tline.euler.x += speed.x;\n\t\t\t\tline.euler.y += speed.y;\n\t\t\t\tline.euler.z += speed.z;\n\t\t\t}\n\n\t\t\toffsetX += 0.2 * deltaTime;\n\t\t\tlinesMaterial.diffuseMapTransform.setUvTransform(offsetX, 0, 1, 1, 0, 0.5, 0.5);\n\n\t\t\tforwardRenderer.render(scene, camera);\n\t\t}\n\t\trequestAnimationFrame(loop);\n\n\t\tfunction onWindowResize() {\n\t\t\twidth = window.innerWidth || 2;\n\t\t\theight = window.innerHeight || 2;\n\n\t\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 1000);\n\n\t\t\tforwardRenderer.screenRenderTarget.resize(width * window.devicePixelRatio, height * window.devicePixelRatio);\n\n\t\t\tcanvas.style.width = width + 'px';\n\t\t\tcanvas.style.height = height + 'px';\n\t\t}\n\t\twindow.addEventListener('resize', onWindowResize, false);\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "examples/main.css",
    "content": "@font-face {\n    font-family: 'body';\n    src: url('./files/fonts/Montserrat-Regular.ttf') format('truetype');\n    font-display: fallback;\n}\n\nbody {\n    margin: 0px;\n    background-color: #f0f0f0;\n    color: #fff;\n    font-family: \"body\", \"Arial\", sans-serif;\n    font-size: 13px;\n\tline-height: 24px;\n\toverscroll-behavior: none;\n    overflow: hidden;\n}\n\n.dark {\n    color: #000;\n}\n\na {\n    color: #FF7F02;\n    text-decoration: none;\n}\n\na:hover {\n    text-decoration: underline;\n}\n\n#info {\n    position: absolute;\n    top: 0px;\n    width: 100%;\n    padding: 10px;\n    box-sizing: border-box;\n    text-align: center;\n    -moz-user-select: none;\n\t-webkit-user-select: none;\n\t-ms-user-select: none;\n\tuser-select: none;\n    pointer-events: none;\n    z-index: 1; /* TODO Solve this in HTML */\n}\n\na {\n    pointer-events: auto;\n}\n\ncanvas {\n    display: block;\n    -webkit-tap-highlight-color: rgba(0,0,0,0);\n    -moz-user-select: none;\n\t-webkit-user-select: none;\n\t-ms-user-select: none;\n\tuser-select: none;\n}\n\n.lil-gui {\n    --number-color: #ff8002;\n\t--string-color: lightgreen;\n\tz-index: 2 !important; /* TODO Solve this in HTML */\n}\n\n@media all and (max-width: 640px) {\n\t.lil-gui.root { \n\t\tright: auto;\n\t\ttop: auto;\n\t\tmax-height: 50%;\n\t\tmax-width: 80%;\n\t\tbottom: 0;\n\t\tleft: 0;\n\t}\n}\n\n.bar {\n    background: lightgreen;\n}\n\n#notSupported {\n\twidth: 50%;\n\tmargin: auto;\n\tbackground-color: #f00;\n\tmargin-top: 20px;\n\tpadding: 10px;\n}"
  },
  {
    "path": "examples/material_alphahash.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>t3d - alpha hash</title>\n\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n\t<link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n</head>\n<body>\n    <div id=\"info\">\n        <a href=\"\" target=\"_blank\">t3d</a> - alpha hash\n    </div>\n\n\t<!-- Import maps polyfill -->\n    <!-- Remove this when import maps will be widely supported -->\n    <script async src=\"./libs/es-module-shims.js\"></script>\n\n    <script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n    <script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { OrbitControls } from 't3d/addons/controls/OrbitControls.js';\n\t\timport { TextureCubeLoader } from 't3d/addons/loaders/TextureCubeLoader.js';\n\t\timport { GBuffer } from 't3d/addons/GBuffer.js';\n\t\timport { CopyShader } from 't3d/addons/shaders/CopyShader.js';\n\t\timport { SuperSampling } from 't3d/addons/SuperSampling.js';\n\t\timport { AlphaHashedPBRMaterial } from 't3d/addons/materials/AlphaHashedPBRMaterial.js';\n\t\timport { GUI } from './libs/lil-gui.esm.min.js';\n\n\t\tlet width = window.innerWidth || 2;\n\t\tlet height = window.innerHeight || 2;\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = width * window.devicePixelRatio;\n\t\tcanvas.height = height * window.devicePixelRatio;\n\t\tcanvas.style.width = width + 'px';\n\t\tcanvas.style.height = height + 'px';\n\t\tdocument.body.appendChild(canvas);\n\n\t\tconst screenRenderTarget = new t3d.ScreenRenderTarget(canvas);\n\n\t\tconst contextParams = { antialias: false, alpha: false };\n\t\tconst gl = canvas.getContext('webgl2', contextParams) || canvas.getContext('webgl', contextParams);\n\t\tconst renderer = new t3d.WebGLRenderer(gl);\n\n\t\tconst scene = new t3d.Scene();\n\n\t\tconst ambientLight = new t3d.AmbientLight(0xffffff, 0.5);\n\t\tscene.add(ambientLight);\n\n\t\tconst directionalLight = new t3d.DirectionalLight(0xffffff, 0.7);\n\t\tdirectionalLight.position.set(-20, 20, 30);\n\t\tdirectionalLight.lookAt(new t3d.Vector3(), new t3d.Vector3(0, 1, 0));\n\t\tscene.add(directionalLight);\n\n\t\tconst camera = new t3d.Camera();\n\t\tcamera.outputEncoding = t3d.TEXEL_ENCODING_TYPE.SRGB;\n\t\tcamera.position.set(4, 3, 5);\n\t\tcamera.lookAt(new t3d.Vector3(0, 0, 0), new t3d.Vector3(0, 1, 0));\n\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 0.1, 1000);\n\t\tscene.add(camera);\n\n\t\tconst controller = new OrbitControls(camera, canvas);\n\t\tcontroller.enableDamping = false;\n\n\t\tconst cubeTexturePath = './resources/skybox/sunset/';\n\t\tconst cubeTexture = new TextureCubeLoader().load([\n\t\t\tcubeTexturePath + 'px.jpg',\n\t\t\tcubeTexturePath + 'nx.jpg',\n\t\t\tcubeTexturePath + 'py.jpg',\n\t\t\tcubeTexturePath + 'ny.jpg',\n\t\t\tcubeTexturePath + 'pz.jpg',\n\t\t\tcubeTexturePath + 'nz.jpg'\n\t\t], function() {\n\t\t\tcubeTexture.encoding = t3d.TEXEL_ENCODING_TYPE.SRGB;\n\t\t\tscene.environment = cubeTexture;\n\t\t\tsceneChange = true;\n\t\t});\n\n\t\t// create spheres\n\n\t\tconst sphereGeometry = new t3d.SphereGeometry(0.5, 20, 20);\n\n\t\tconst amount = 3;\n\t\tconst offset = (amount - 1) / 2;\n\t\tconst materialAray = [];\n\t\tfor (let x = 0; x < amount; x++) {\n\t\t\tfor (let y = 0; y < amount; y++) {\n\t\t\t\tfor (let z = 0; z < amount; z++) {\n\t\t\t\t\tconst alphahashPBR = new AlphaHashedPBRMaterial();\n\t\t\t\t\talphahashPBR.diffuse.setHex(0xffffff * Math.random());\n\t\t\t\t\talphahashPBR.opacity = 0.7;\n\t\t\t\t\talphahashPBR.roughness = 1;\n\t\t\t\t\talphahashPBR.metalness = 0;\n\t\t\t\t\tmaterialAray.push(alphahashPBR);\n\t\t\t\t\tconst sphere = new t3d.Mesh(sphereGeometry, alphahashPBR);\n\t\t\t\t\tsphere.position.set(offset - x, offset - y, offset - z);\n\t\t\t\t\tscene.add(sphere);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// taa passes\n\n\t\tconst tempRenderTarget = t3d.OffscreenRenderTarget.create2D(width, height);\n\t\ttempRenderTarget.texture.minFilter = t3d.TEXTURE_FILTER.LINEAR;\n\t\ttempRenderTarget.texture.magFilter = t3d.TEXTURE_FILTER.LINEAR;\n\t\ttempRenderTarget.texture.generateMipmaps = false;\n\n\t\tconst copyPass = new t3d.ShaderPostPass(CopyShader);\n\n\t\tconst gBuffer = new GBuffer(width, height);\n\t\tgBuffer.enableMotion = true;\n\t\tgBuffer._debugPass.material.defines.ARROW_TILE_SIZE = '16.0';\n\t\tgBuffer._debugPass.material.uniforms.velocityThreshold = 0.001;\n\t\tgBuffer._debugPass.material.uniforms.arrowScale = 20;\n\n\t\tconst superSampling = new SuperSampling(width, height, 30);\n\n\t\tconst oldProjectionMatrix = new t3d.Matrix4();\n\n\t\tlet sceneChange = false;\n\n\t\t// gui\n\n\t\tconst params = { taa: true, dynamic: false, debug: false, opacity: 0.7 }; // taa works bad on android and ios\n\t\tconst gui = new GUI();\n\t\tgui.add(params, 'opacity', 0, 1, 0.01).onChange(() => {\n\t\t\tmaterialAray.forEach(material => {\n\t\t\t\tmaterial.opacity = params.opacity;\n\t\t\t});\n\t\t\tsuperSampling.start();\n\t\t});\n\t\tconst taaFolder = gui.addFolder('TAA');\n\t\ttaaFolder.add(params, 'taa').onChange(() => {\n\t\t\tsuperSampling.start();\n\t\t});\n\t\ttaaFolder.add(params, 'dynamic').onChange(() => {\n\t\t\tsuperSampling.start();\n\t\t});\n\t\ttaaFolder.add(params, 'debug').onChange(() => {\n\t\t\tsuperSampling.start();\n\t\t});\n\t\ttaaFolder.close();\n\n\t\t//\n\n\t\tfunction loop(count) {\n\t\t\trequestAnimationFrame(loop);\n\n\t\t\tconst change = controller.update() || sceneChange;\n\n\t\t\tif (params.debug) {\n\t\t\t\tscene.updateMatrix();\n\t\t\t\tscene.updateRenderStates(camera);\n\t\t\t\tscene.updateRenderQueue(camera);\n\n\t\t\t\tgBuffer.update(renderer, scene, camera);\n\n\t\t\t\tscreenRenderTarget.setColorClearValue(0, 0, 0, 1);\n\t\t\t\tgBuffer.renderDebug(renderer, camera, 'velocity', screenRenderTarget);\n\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (!params.taa) {\n\t\t\t\tscene.updateMatrix();\n\t\t\t\tscene.updateRenderStates(camera);\n\t\t\t\tscene.updateRenderQueue(camera);\n\t\t\n\t\t\t\tscreenRenderTarget.setColorClearValue(0.3, 0.3, 0.3, 1);\n\t\t\t\trenderer.renderScene(scene, camera, screenRenderTarget);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (change) {\n\t\t\t\tif (!params.dynamic || sceneChange) {\n\t\t\t\t\tsuperSampling.start();\n\t\t\t\t}\n\t\t\n\t\t\t\tsceneChange = false;\n\t\t\t}\n\n\t\t\tlet tex;\n\n\t\t\tif (params.dynamic || !superSampling.finished()) {\n\t\t\t\tscene.updateMatrix();\n\t\t\t\tscene.updateRenderStates(camera);\n\t\t\t\tscene.updateRenderQueue(camera);\n\n\t\t\t\tif (params.dynamic) {\n\t\t\t\t\tgBuffer.update(renderer, scene, camera);\n\n\t\t\t\t\tif (superSampling.finished()) {\n\t\t\t\t\t\tsuperSampling._frame = 1;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\toldProjectionMatrix.copy(camera.projectionMatrix);\n\t\t\t\tsuperSampling.jitterProjection(camera, width, height);\n\n\t\t\t\tscene.updateRenderStates(camera, false);\n\t\t\t\ttempRenderTarget.setColorClearValue(0.3, 0.3, 0.3, 1);\n\t\t\t\trenderer.renderScene(scene, camera, tempRenderTarget);\n\n\t\t\t\tcamera.projectionMatrix.copy(oldProjectionMatrix);\n\n\t\t\t\ttex = superSampling.sample(renderer, tempRenderTarget.texture, gBuffer.getMotionTexture(), gBuffer.getDepthTexture(), !params.dynamic);\n\t\t\t} else {\n\t\t\t\ttex = superSampling.output();\n\t\t\t}\n\n\t\t\tcopyPass.uniforms['tDiffuse'] = tex;\n\t\t\tcopyPass.material.transparent = true;\n\t\t\tscreenRenderTarget.setColorClearValue(0, 0, 0, 0);\n\t\t\tcopyPass.render(renderer, screenRenderTarget);\n\t\t}\n\n\t\trequestAnimationFrame(loop);\n\n\t\tfunction onWindowResize() {\n\t\t\twidth = window.innerWidth || 2;\n\t\t\theight = window.innerHeight || 2;\n\n\t\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 0.1, 1000);\n\n\t\t\tscreenRenderTarget.resize(width * window.devicePixelRatio, height * window.devicePixelRatio);\n\t\t\ttempRenderTarget.resize(width * window.devicePixelRatio, height * window.devicePixelRatio);\n\n\t\t\tgBuffer.resize(width * window.devicePixelRatio, height * window.devicePixelRatio);\n\t\t\tsuperSampling.resize(width * window.devicePixelRatio, height * window.devicePixelRatio);\n\n\t\t\tcanvas.style.width = width + 'px';\n\t\t\tcanvas.style.height = height + 'px';\n\n\t\t\tsceneChange = true;\n\t\t}\n\t\twindow.addEventListener('resize', onWindowResize, false);\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "examples/material_alphamask.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>t3d - alpha mask</title>\n\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n\t<link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n</head>\n<body>\n    <div id=\"info\" class=\"dark\">\n        <a href=\"\" target=\"_blank\">t3d</a> - alpha mask\n\t\t<br/>\n\t\tImage by <a href=\"https://unsplash.com/@nypl\" target=\"_blank\">unsplash.com/@nypl</a>\n    </div>\n\n\t<script src=\"./libs/nanobar.min.js\"></script>\n\n\t<!-- Import maps polyfill -->\n    <!-- Remove this when import maps will be widely supported -->\n    <script async src=\"./libs/es-module-shims.js\"></script>\n\n    <script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n    <script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { GLTFLoader } from 't3d/addons/loaders/glTF/GLTFLoader.js';\n\t\timport { ForwardRenderer } from 't3d/addons/render/ForwardRenderer.js';\n\t\timport { OrbitControls } from 't3d/addons/controls/OrbitControls.js';\n\t\timport { Texture2DLoader } from 't3d/addons/loaders/Texture2DLoader.js';\n\t\timport { GUI } from './libs/lil-gui.esm.min.js';\n\n\t\tlet width = window.innerWidth || 2;\n\t\tlet height = window.innerHeight || 2;\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = width * window.devicePixelRatio;\n\t\tcanvas.height = height * window.devicePixelRatio;\n\t\tcanvas.style.width = width + 'px';\n\t\tcanvas.style.height = height + 'px';\n\t\tdocument.body.appendChild(canvas);\n\n\t\tconst forwardRenderer = new ForwardRenderer(canvas, {\n\t\t\tantialias: true\n\t\t});\n\t\tforwardRenderer.screenRenderTarget.setColorClearValue(251 / 255, 243 / 255, 228 / 255, 1);\n\n\t\tconst scene = new t3d.Scene();\n\t\tscene.fog = new t3d.Fog(undefined, 18, 25);\n\t\tscene.fog.color.setRGB(251 / 255, 243 / 255, 228 / 255);\n\t\t\n\t\tconst texture = new Texture2DLoader().load('./resources/flower.png');\n\t\ttexture.wrapT = texture.wrapS = t3d.TEXTURE_WRAP.REPEAT;\n\t\ttexture.anisotropy = forwardRenderer.capabilities.maxAnisotropy;\n\n\t\tconst nanobar = new Nanobar();\n\t\tnanobar.el.style.background = 'gray';\n\n\t\tconst loadingManager = new t3d.LoadingManager(function() {\n\t\t\tnanobar.go(100);\n\t\t\tnanobar.el.style.background = 'transparent';\n\t\t}, function(url, itemsLoaded, itemsTotal) {\n\t\t\tif (itemsLoaded < itemsTotal) {\n\t\t\t\tnanobar.go(itemsLoaded / itemsTotal * 100);\n\t\t\t}\n\t\t});\n\n\t\tconst uvTransform = new t3d.Matrix3();\n\n\t\tconst loader = new GLTFLoader(loadingManager);\n\t\tlet root;\n\t\tconst materials = [];\n\t\tloader.load(\n\t\t\t'./resources/models/gltf/LeePerrySmith/LeePerrySmith.glb'\n\t\t).then(function(result) {\n\t\t\troot = result.root;\n\n\t\t\troot.traverse(node => {\n\t\t\t\tif (node.material) {\n\t\t\t\t\tnode.material = new t3d.BasicMaterial();\n\t\t\t\t\tnode.material.diffuseMap = texture;\n\t\t\t\t\tnode.material.diffuseMapTransform = uvTransform;\n\t\t\t\t\tnode.material.transparent = true;\n\t\t\t\t\tnode.material.alphaToCoverage = true;\n\t\t\t\t\tnode.material.side = t3d.DRAW_SIDE.DOUBLE;\n\t\t\t\t\tmaterials.push(node.material);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tscene.add(root);\n\t\t});\n\n\t\tconst plane_geometry = new t3d.PlaneGeometry(100, 100);\n\t\tconst plane_material = new t3d.BasicMaterial();\n\t\tplane_material.opacity = 0.5;\n\t\tplane_material.transparent = true;\n\t\tplane_material.diffuse.setRGB(255 / 255, 248 / 255, 238 / 255);\n\t\tconst plane = new t3d.Mesh(plane_geometry, plane_material);\n\t\tplane.position.y -= 4;\n\t\tscene.add(plane);\n\n\t\tconst camera = new t3d.Camera();\n\t\tcamera.outputEncoding = t3d.TEXEL_ENCODING_TYPE.SRGB;\n\t\tcamera.position.set(0, 2, 11);\n\t\tcamera.lookAt(new t3d.Vector3(0, 0, 0), new t3d.Vector3(0, 1, 0));\n\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 0.1, 1000);\n\t\tscene.add(camera);\n\n\t\tconst controller = new OrbitControls(camera, canvas);\n\t\tcontroller.enablePan = false;\n\t\tcontroller.minDistance = 5;\n\t\tcontroller.maxDistance = 16;\n\t\tcontroller.autoRotate = true;\n\t\tcontroller.autoRotateSpeed = 0.2;\n\n\t\tconst API = {\n\t\t\toffsetX: 0.48,\n\t\t\toffsetY: 0.48,\n\t\t\trepeat: 6,\n\t\t\trotation: 45, // positive is counter-clockwise\n\t\t\tcenterX: 0.5,\n\t\t\tcenterY: 0.5\n\t\t};\n\n\t\tfunction updateUvTransform() {\n\t\t\tuvTransform.setUvTransform(API.offsetX, API.offsetY, API.repeat, API.repeat, API.rotation / 180 * Math.PI, API.centerX, API.centerY);\n\t\t}\n\n\t\tupdateUvTransform();\n\n\t\tconst gui = new GUI();\n\t\tgui.add({ version: 'WebGL ' + forwardRenderer.capabilities.version }, 'version').disable();\n\t\tgui.add(controller, 'autoRotate');\n\t\tgui.add({ type: 'alphaToCoverage' }, 'type', ['transparent', 'alphaTest', 'alphaToCoverage']).onChange(value => {\n\t\t\tmaterials.forEach(material => {\n\t\t\t\tmaterial.transparent = (value === 'transparent') || (value === 'alphaToCoverage');\n\t\t\t\tmaterial.alphaTest = (value === 'alphaTest') ? 0.5 : 0;\n\t\t\t\tmaterial.alphaToCoverage = (value === 'alphaToCoverage');\n\t\t\t\tmaterial.needsUpdate = true;\n\t\t\t});\n\t\t});\n\t\tconst transformFolder = gui.addFolder('transform');\n\t\ttransformFolder.add(API, 'offsetX', 0.0, 1.0, 0.01).name('offset.x').onChange(updateUvTransform);\n\t\ttransformFolder.add(API, 'offsetY', 0.0, 1.0, 0.01).name('offset.y').onChange(updateUvTransform);\n\t\ttransformFolder.add(API, 'repeat', 0.25, 10.0, 0.1).onChange(updateUvTransform);\n\t\ttransformFolder.add(API, 'rotation', 0, 180, 0.1).onChange(updateUvTransform);\n\n\t\tfunction loop(count) {\n\t\t\trequestAnimationFrame(loop);\n\n\t\t\tcontroller.update();\n\n\t\t\tforwardRenderer.render(scene, camera);\n\t\t}\n\t\trequestAnimationFrame(loop);\n\n\t\tfunction onWindowResize() {\n\t\t\twidth = window.innerWidth || 2;\n\t\t\theight = window.innerHeight || 2;\n\n\t\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 0.1, 1000);\n\n\t\t\tforwardRenderer.screenRenderTarget.resize(width * window.devicePixelRatio, height * window.devicePixelRatio);\n\n\t\t\tcanvas.style.width = width + 'px';\n\t\t\tcanvas.style.height = height + 'px';\n\t\t}\n\t\twindow.addEventListener('resize', onWindowResize, false);\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "examples/material_blending.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>t3d - material blending</title>\n\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n\t<link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n</head>\n<body>\n\t<script src=\"./libs/simplex-noise.js\"></script>\n\n\t<!-- Import maps polyfill -->\n    <!-- Remove this when import maps will be widely supported -->\n    <script async src=\"./libs/es-module-shims.js\"></script>\n\n    <script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n    <script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { ForwardRenderer } from 't3d/addons/render/ForwardRenderer.js';\n\t\timport { Texture2DLoader } from 't3d/addons/loaders/Texture2DLoader.js';\n\n\t\tlet width = window.innerWidth || 2;\n\t\tlet height = window.innerHeight || 2;\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = width;\n\t\tcanvas.height = height;\n\t\tdocument.body.appendChild(canvas);\n\n\t\tconst forwardRenderer = new ForwardRenderer(canvas);\n\t\tforwardRenderer.screenRenderTarget.setColorClearValue(0.1, 0.8, 0.9, 1);\n\n\t\tconst scene = new t3d.Scene();\n\n\t\tfunction generateLabelMaterial(text) {\n\t\t\tconst canvas = document.createElement('canvas');\n\t\t\tconst ctx = canvas.getContext('2d');\n\t\t\tcanvas.width = 128;\n\t\t\tcanvas.height = 32;\n\n\t\t\tctx.fillStyle = 'rgba(0, 0, 0, 0.95)';\n\t\t\tctx.fillRect(0, 0, 128, 32);\n\n\t\t\tctx.fillStyle = 'white';\n\t\t\tctx.font = 'bold 14pt arial';\n\t\t\tctx.textAlign = 'center';\n\t\t\tctx.fillText(text, 64, 22);\n\n\t\t\tconst map = new t3d.Texture2D();\n\t\t\tmap.encoding = t3d.TEXEL_ENCODING_TYPE.SRGB;\n\t\t\tmap.image = canvas;\n\t\t\tmap.version++;\n\n\t\t\tconst material = new t3d.BasicMaterial();\n\t\t\tmaterial.diffuseMap = map;\n\t\t\tmaterial.transparent = true;\n\n\t\t\treturn material;\n\t\t}\n\n\t\tconst blendings = [\n\t\t\t{ constant: t3d.BLEND_TYPE.NONE, labelMaterial: generateLabelMaterial('None') },\n\t\t\t{ constant: t3d.BLEND_TYPE.NORMAL, labelMaterial: generateLabelMaterial('Normal') },\n\t\t\t{ constant: t3d.BLEND_TYPE.ADD, labelMaterial: generateLabelMaterial('Add') },\n\t\t\t{ constant: t3d.BLEND_TYPE.SUB, labelMaterial: generateLabelMaterial('Sub') },\n\t\t\t{ constant: t3d.BLEND_TYPE.MUL, labelMaterial: generateLabelMaterial('Mul') }\n\t\t];\n\n\t\tconst assignSRGB = texture => {\n\t\t\ttexture.encoding = t3d.TEXEL_ENCODING_TYPE.SRGB;\n\t\t};\n\n\t\tconst loader = new Texture2DLoader();\n\n\t\tconst map0 = loader.load('./resources/UV_Grid_Sm.jpg', assignSRGB);\n\t\tconst map1 = loader.load('./resources/sprites/sprite0.jpg', assignSRGB);\n\t\tconst map2 = loader.load('./resources/sprites/sprite0.png', assignSRGB);\n\t\tconst map3 = loader.load('./resources/lensflare/lensflare0.png', assignSRGB);\n\t\tconst map4 = loader.load('./resources/lensflare/lensflare0_alpha.png', assignSRGB);\n\n\t\tconst geo1 = new t3d.PlaneGeometry(100, 100);\n\t\tconst geo2 = new t3d.PlaneGeometry(100, 25);\n\n\t\tfunction addImageRow(map, y) {\n\t\t\tfor (let i = 0; i < blendings.length; i++) {\n\t\t\t\tconst blending = blendings[i];\n\n\t\t\t\tconst material = new t3d.BasicMaterial();\n\t\t\t\tmaterial.diffuseMap = map;\n\t\t\t\tmaterial.transparent = true;\n\t\t\t\tmaterial.blending = blending.constant;\n\n\t\t\t\tconst x = (i - blendings.length / 2 + 0.5) * 110;\n\t\t\t\tconst z = 0;\n\n\t\t\t\tlet mesh = new t3d.Mesh(geo1, material);\n\t\t\t\tmesh.position.set(x, y, z);\n\t\t\t\tmesh.euler.x = Math.PI / 2;\n\t\t\t\tscene.add(mesh);\n\n\t\t\t\tmesh = new t3d.Mesh(geo2, blending.labelMaterial);\n\t\t\t\tmesh.position.set(x, y - 75, z);\n\t\t\t\tmesh.euler.x = Math.PI / 2;\n\t\t\t\tscene.add(mesh);\n\t\t\t}\n\t\t}\n\n\t\taddImageRow(map0, 300);\n\t\taddImageRow(map1, 150);\n\t\taddImageRow(map2, 0);\n\t\taddImageRow(map3, -150);\n\t\taddImageRow(map4, -300);\n\n\t\t// Create background plane\n\n\t\tconst bgCanvas = document.createElement('canvas');\n\t\tconst bgContext = bgCanvas.getContext('2d');\n\t\tbgCanvas.width = bgCanvas.height = 128;\n\t\tbgContext.fillStyle = '#ddd';\n\t\tbgContext.fillRect(0, 0, 128, 128);\n\t\tbgContext.fillStyle = '#555';\n\t\tbgContext.fillRect(0, 0, 64, 64);\n\t\tbgContext.fillStyle = '#555';\n\t\tbgContext.fillRect(64, 64, 64, 64);\n\n\t\tconst texture = new t3d.Texture2D();\n\t\ttexture.image = bgCanvas;\n\t\ttexture.anisotropy = forwardRenderer.capabilities.maxAnisotropy;\n\t\ttexture.wrapS = texture.wrapT = t3d.TEXTURE_WRAP.REPEAT;\n\t\ttexture.encoding = t3d.TEXEL_ENCODING_TYPE.SRGB;\n\n\t\tconst bg_geometry = new t3d.PlaneGeometry(2000, 2000);\n\t\tconst bg_material = new t3d.BasicMaterial();\n\t\tbg_material.diffuseMap = texture;\n\t\tbg_material.diffuseMapTransform.setUvTransform(0, 0, 64, 64, 0, 0.5, 0.5);\n\t\tconst background = new t3d.Mesh(bg_geometry, bg_material);\n\t\tbackground.position.set(0, 0, -1);\n\t\tbackground.euler.x = Math.PI / 2;\n\t\tscene.add(background);\n\n\t\tconst camera = new t3d.Camera();\n\t\tcamera.outputEncoding = t3d.TEXEL_ENCODING_TYPE.SRGB;\n\t\tcamera.position.set(0, 0, 600);\n\t\tcamera.lookAt(new t3d.Vector3(0, 0, 0), new t3d.Vector3(0, 1, 0));\n\t\tcamera.setPerspective(70 / 180 * Math.PI, width / height, 1, 1000);\n\t\tscene.add(camera);\n\n\t\tfunction loop(count) {\n\t\t\trequestAnimationFrame(loop);\n\n\t\t\tconst offset = count / 4000;\n\t\t\tbg_material.diffuseMapTransform.setUvTransform(-offset, -offset, 64, 64, 0, 0.5, 0.5);\n\n\t\t\tforwardRenderer.render(scene, camera);\n\t\t}\n\t\trequestAnimationFrame(loop);\n\n\t\tfunction onWindowResize() {\n\t\t\twidth = window.innerWidth || 2;\n\t\t\theight = window.innerHeight || 2;\n\n\t\t\tcamera.setPerspective(70 / 180 * Math.PI, width / height, 1, 1000);\n\n\t\t\tforwardRenderer.screenRenderTarget.resize(width, height);\n\t\t}\n\t\twindow.addEventListener('resize', onWindowResize, false);\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "examples/material_bumpmap.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>t3d - bump map</title>\n\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n\t<link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n</head>\n<body>\n    <div id=\"info\">\n        <a href=\"\" target=\"_blank\">t3d</a> - bump map\n    </div>\n\n\t<script src=\"./libs/nanobar.min.js\"></script>\n\n\t<!-- Import maps polyfill -->\n    <!-- Remove this when import maps will be widely supported -->\n    <script async src=\"./libs/es-module-shims.js\"></script>\n\n    <script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n    <script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { GLTFLoader } from 't3d/addons/loaders/glTF/GLTFLoader.js';\n\t\timport { OrbitControls } from 't3d/addons/controls/OrbitControls.js';\n\t\timport { Texture2DLoader } from 't3d/addons/loaders/Texture2DLoader.js';\n\t\timport { ForwardRenderer } from 't3d/addons/render/ForwardRenderer.js';\n\t\timport { GUI } from './libs/lil-gui.esm.min.js';\n\n\t\tlet width = window.innerWidth || 2;\n\t\tlet height = window.innerHeight || 2;\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = width;\n\t\tcanvas.height = height;\n\t\tdocument.body.appendChild(canvas);\n\n\t\tconst forwardRenderer = new ForwardRenderer(canvas);\n\n\t\tconst scene = new t3d.Scene();\n\n\t\tconst nanobar = new Nanobar();\n\t\tnanobar.el.style.background = 'gray';\n\n\t\tconst loadingManager = new t3d.LoadingManager(function() {\n\t\t\tnanobar.go(100);\n\t\t\tnanobar.el.style.background = 'transparent';\n\t\t}, function(url, itemsLoaded, itemsTotal) {\n\t\t\tif (itemsLoaded < itemsTotal) {\n\t\t\t\tnanobar.go(itemsLoaded / itemsTotal * 100);\n\t\t\t}\n\t\t});\n\n\t\tconst bumpTexture = new Texture2DLoader(loadingManager)\n\t\t\t.load('./resources/models/gltf/LeePerrySmith/Infinite-Level_02_Disp_NoSmoothUV-4096.jpg');\n\n\t\tconst material = new t3d.PhongMaterial();\n\t\tmaterial.diffuse.setHex(0x9c6e49);\n\t\tmaterial.specular.setHex(0x666666);\n\t\tmaterial.shininess = 15;\n\t\tmaterial.bumpMap = bumpTexture;\n\t\tmaterial.bumpScale = 0.1;\n\n\t\tconst gltfUri = './resources/models/gltf/LeePerrySmith/LeePerrySmith.glb';\n\t\tnew GLTFLoader(loadingManager).load(gltfUri).then(function(result) {\n\t\t\tconst root = result.root;\n\t\t\tresult.root.children[0].material = material;\n\t\t\tscene.add(root);\n\t\t});\n\n\t\tconst spotLight = new t3d.SpotLight(0xffffde, 0.8, 200, Math.PI / 3, 0.8);\n\t\tspotLight.position.set(3.5, 0, 7);\n\t\tspotLight.lookAt(new t3d.Vector3(0, 0, 0), new t3d.Vector3(0, 1, 0));\n\t\tscene.add(spotLight);\n\n\t\tconst camera = new t3d.Camera();\n\t\tcamera.outputEncoding = t3d.TEXEL_ENCODING_TYPE.SRGB;\n\t\tcamera.position.set(0, 1, 10.4);\n\t\tcamera.lookAt(new t3d.Vector3(0, 0, 0), new t3d.Vector3(0, 1, 0));\n\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 0.1, 1000);\n\t\tscene.add(camera);\n\n\t\tconst controller = new OrbitControls(camera, canvas);\n\t\tcontroller.enablePan = false;\n\t\tcontroller.minDistance = 5;\n\t\tcontroller.maxDistance = 20;\n\n\t\tconst gui = new GUI();\n\t\tgui.add(material, 'bumpScale', 0.0, 0.2, 0.001);\n\n\t\tfunction loop(count) {\n\t\t\trequestAnimationFrame(loop);\n\n\t\t\tcontroller.update();\n\n\t\t\tforwardRenderer.render(scene, camera);\n\t\t}\n\t\trequestAnimationFrame(loop);\n\n\t\tfunction onWindowResize() {\n\t\t\twidth = window.innerWidth || 2;\n\t\t\theight = window.innerHeight || 2;\n\n\t\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 0.1, 1000);\n\n\t\t\tforwardRenderer.screenRenderTarget.resize(width, height);\n\t\t}\n\t\twindow.addEventListener('resize', onWindowResize, false);\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "examples/material_clearcoat.html",
    "content": "<!DOCTYPE html>\n<html>\n\n<head>\n    <meta charset=\"utf-8\">\n    <title>t3d - clearcoat</title>\n    <meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n    <link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n</head>\n\n<body>\n    <div id=\"info\">\n        <a href=\"\" target=\"_blank\">t3d</a> - clearcoat\n    </div>\n\n    <!-- Import maps polyfill -->\n    <!-- Remove this when import maps will be widely supported -->\n    <script async src=\"./libs/es-module-shims.js\"></script>\n\n    <script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n    <script type=\"module\">\n        import * as t3d from 't3d';\n        import { Texture2DLoader } from 't3d/addons/loaders/Texture2DLoader.js';\n        import { SkyBox } from 't3d/addons/objects/SkyBox.js';\n        import { RGBELoader } from 't3d/addons/loaders/RGBELoader.js';\n        import { PMREMGenerator } from 't3d/addons/textures/PMREMGenerator.js';\n        import { ForwardRenderer } from 't3d/addons/render/ForwardRenderer.js';\n        import { OrbitControls } from 't3d/addons/controls/OrbitControls.js';\n        import { GUI } from './libs/lil-gui.esm.min.js';\n\n        let width = window.innerWidth || 2;\n        let height = window.innerHeight || 2;\n\n        const canvas = document.createElement('canvas');\n        canvas.width = width;\n        canvas.height = height;\n        document.body.appendChild(canvas);\n\n        const forwardRenderer = new ForwardRenderer(canvas);\n\n        const scene = new t3d.Scene();\n\n        const rgbeLoader = new RGBELoader();\n\n        const textureLoader = new Texture2DLoader();\n\n        const capabilities = forwardRenderer.capabilities;\n        if ((capabilities.version > 1 || !!capabilities.getExtension('OES_texture_float')) &&\n            !!capabilities.getExtension('OES_texture_float_linear')) {\n        \trgbeLoader.type = t3d.PIXEL_TYPE.FLOAT;\n        }\n\n        const imageUrls = [\n        \t'resources/hdr/pisaHDR/px.hdr',\n        \t'resources/hdr/pisaHDR/nx.hdr',\n        \t'resources/hdr/pisaHDR/py.hdr',\n        \t'resources/hdr/pisaHDR/ny.hdr',\n        \t'resources/hdr/pisaHDR/pz.hdr',\n        \t'resources/hdr/pisaHDR/nz.hdr'\n        ];\n\n        let texture = new t3d.TextureCube();\n\n        const promiseArray = [];\n        for (let i = 0; i < 6; i++) {\n        \tpromiseArray.push(rgbeLoader.loadAsync(imageUrls[i]));\n        }\n\n        Promise.all(promiseArray).then(function(textureDatas) {\n        \tfor (let i = 0; i < 6; i++) {\n        \t\ttexture.images.push({\n        \t\t\tdata: textureDatas[i].data,\n        \t\t\twidth: textureDatas[i].width,\n        \t\t\theight: textureDatas[i].height\n        \t\t});\n        \t}\n\n        \tconst textureData = textureDatas[0];\n        \ttexture.type = textureData.type;\n\n        \tif (textureData.generateMipmaps !== undefined) {\n        \t\ttexture.generateMipmaps = textureData.generateMipmaps;\n        \t}\n\n        \ttexture.magFilter = textureData.magFilter !== undefined ? textureData.magFilter : t3d.TEXTURE_FILTER.LINEAR;\n        \ttexture.minFilter = textureData.minFilter !== undefined ? textureData.minFilter : t3d.TEXTURE_FILTER.LINEAR;\n\n        \ttexture.version++;\n\n        \t//\n\n        \ttexture = (new PMREMGenerator()).prefilter(forwardRenderer, texture);\n\n        \tconst skyBox = new SkyBox(texture);\n        \tskyBox.gamma = true;\n        \tscene.add(skyBox);\n\n        \tscene.environment = texture;\n        });\n\n        const sphere_geometry = new t3d.SphereGeometry(80, 64, 32);\n\n        const water = textureLoader.load('./resources/waternormals.jpg');\n        const golfBall = textureLoader.load('./resources/golfball.jpg');\n\n        const scratched = textureLoader.load('./resources/Scratched_Normal.png');\n\n        const sphere_material = new t3d.PBRMaterial();\n        sphere_material.diffuse.setHex(0xffffff);\n        sphere_material.metalness = 0.0;\n        sphere_material.roughness = 1.0;\n        sphere_material.clearcoat = 1.0;\n\n        // y scale is negated to compensate for normal map handedness.\n        sphere_material.clearcoatNormalScale = new t3d.Vector2(2.0, -2.0);\n\n        const sphere = new t3d.Mesh(sphere_geometry, sphere_material);\n\n        scene.add(sphere);\n\n        const particleLight = new t3d.Object3D();\n        scene.add(particleLight);\n\n        const pointLight = new t3d.PointLight(0xffffff, 1, 800);\n        pointLight.decay = 1;\n        particleLight.add(pointLight);\n\n        const lightBall_geometry = new t3d.SphereGeometry(4, 8, 8);\n        const basic = new t3d.BasicMaterial();\n        basic.diffuse.setHex(0xffffff);\n        const lightBall = new t3d.Mesh(lightBall_geometry, basic);\n        particleLight.add(lightBall);\n\n        const camera = new t3d.Camera();\n        camera.outputEncoding = t3d.TEXEL_ENCODING_TYPE.SRGB;\n        camera.setPerspective(30 / 180 * Math.PI, width / height, 1, 10000);\n        camera.position.set(0, 0, 500);\n        scene.add(camera);\n\n        const controller = new OrbitControls(camera, canvas);\n\n        const gui = new GUI();\n\n        const params = {\n        \t'diffuseColor': 0xffffff,\n        \t'metalness': 0.0,\n        \t'roughness': 1.0,\n        \t'clearcoat': 1.0,\n        \t'clearcoatRoughness': 0.0,\n        \t'normalMap': 'null',\n        \t'clearcoatNormalMap': 'null'\n        };\n\n        gui.addColor(params, 'diffuseColor').onChange(value => {\n        \tsphere_material.diffuse.setHex(value);\n        });\n        gui.add(params, 'metalness', 0.0, 1.0, 0.1).onChange(value => {\n        \tsphere_material.metalness = value;\n        });\n        gui.add(params, 'roughness', 0.0, 1.0, 0.1).onChange(value => {\n        \tsphere_material.roughness = value;\n        });\n        gui.add(params, 'clearcoat', 0.0, 1.0, 0.1).onChange(value => {\n        \tsphere_material.clearcoat = value;\n        });\n        gui.add(params, 'clearcoatRoughness', 0.0, 1.0, 0.1).onChange(value => {\n        \tsphere_material.clearcoatRoughness = value;\n        });\n        gui.add(params, 'normalMap', ['null', 'water', 'golfBall']).onChange(value => {\n        \tswitch (value) {\n        \t\tcase 'null':\n        \t\t\tsphere_material.normalMap = null;\n        \t\t\tbreak;\n        \t\tcase 'water':\n        \t\t\tsphere_material.normalMap = water;\n        \t\t\tbreak;\n        \t\tcase 'golfBall':\n        \t\t\tsphere_material.normalMap = golfBall;\n        \t\t\tbreak;\n        \t}\n        \tsphere_material.needsUpdate = true;\n        });\n        gui.add(params, 'clearcoatNormalMap', ['null', 'scratched']).onChange(value => {\n        \tswitch (value) {\n        \t\tcase 'null':\n        \t\t\tsphere_material.clearcoatNormalMap = null;\n        \t\t\tbreak;\n        \t\tcase 'scratched':\n        \t\t\tsphere_material.clearcoatNormalMap = scratched;\n        \t\t\tbreak;\n        \t}\n        \tsphere_material.needsUpdate = true;\n        });\n\n        function loop(timestamp) {\n        \trequestAnimationFrame(loop);\n\n        \tconst timer = timestamp * 0.00025;\n\n        \tparticleLight.position.x = Math.sin(timer * 7) * 300;\n        \tparticleLight.position.y = Math.cos(timer * 5) * 400;\n        \tparticleLight.position.z = Math.cos(timer * 3) * 300;\n        \n        \tsphere.euler.y += 0.005;\n\n        \tcontroller.update();\n\n        \tforwardRenderer.render(scene, camera);\n        }\n\n        requestAnimationFrame(loop);\n\n        function onWindowResize() {\n        \twidth = window.innerWidth || 2;\n        \theight = window.innerHeight || 2;\n\n        \tcamera.setPerspective(30 / 180 * Math.PI, width / height, 1, 10000);\n\n        \tforwardRenderer.screenRenderTarget.resize(width, height);\n        }\n        window.addEventListener('resize', onWindowResize, false);\n    </script>\n</body>\n\n</html>"
  },
  {
    "path": "examples/material_clippingplanes.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>t3d - material clipping planes</title>\n\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n\t<link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n</head>\n<body>\n    <div id=\"info\">\n        <a href=\"\" target=\"_blank\">t3d</a> - material clipping planes\n    </div>\n\n\t<!-- Import maps polyfill -->\n    <!-- Remove this when import maps will be widely supported -->\n    <script async src=\"./libs/es-module-shims.js\"></script>\n\n    <script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n    <script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { ForwardRenderer } from 't3d/addons/render/ForwardRenderer.js';\n\n\t\tlet width = window.innerWidth || 2;\n\t\tlet height = window.innerHeight || 2;\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = width;\n\t\tcanvas.height = height;\n\t\tdocument.body.appendChild(canvas);\n\n\t\tconst forwardRenderer = new ForwardRenderer(canvas);\n\n\t\tconst scene = new t3d.Scene();\n\n\t\tconst sphere_geometry = new t3d.SphereGeometry(10, 20, 20);\n\t\tconst phong = new t3d.PhongMaterial();\n\t\tphong.diffuse.setHex(0xffffff);\n\t\tphong.side = t3d.DRAW_SIDE.DOUBLE;\n\t\tphong.clippingPlanes = [new t3d.Plane(new t3d.Vector3(-1, 0, 0), 4), new t3d.Plane(new t3d.Vector3(1, 0, 0), 4)];\n\t\tconst sphere = new t3d.Mesh(sphere_geometry, phong);\n\t\tsphere.castShadow = true;\n\t\tscene.add(sphere);\n\n\t\tconst cube_geometry = new t3d.BoxGeometry(40, 5, 5);\n\t\tconst phong1 = new t3d.PhongMaterial();\n\t\tphong1.diffuse.setHex(0xffffff);\n\t\tconst cube = new t3d.Mesh(cube_geometry, phong1);\n\t\tcube.castShadow = true;\n\t\tscene.add(cube);\n\n\t\tconst plane_geometry = new t3d.PlaneGeometry(100, 100);\n\t\tconst lambert = new t3d.LambertMaterial();\n\t\tlambert.diffuse.setHex(0xffffff);\n\t\tconst plane = new t3d.Mesh(plane_geometry, lambert);\n\t\tplane.position.y = -10;\n\t\tplane.receiveShadow = true;\n\t\tscene.add(plane);\n\n\t\tconst ambientLight = new t3d.AmbientLight(0xffffff, 0.3);\n\t\tscene.add(ambientLight);\n\n\t\tconst directionalLight = new t3d.DirectionalLight(0xffffff, 0.3);\n\t\tdirectionalLight.position.set(-40, 40, 0);\n\t\tdirectionalLight.lookAt(new t3d.Vector3(), new t3d.Vector3(0, 1, 0));\n\t\tdirectionalLight.shadow.windowSize = 100;\n\t\tdirectionalLight.castShadow = true;\n\t\tscene.add(directionalLight);\n\n\t\tconst pointLight = new t3d.PointLight(0xffffff, 0.3);\n\t\tpointLight.position.set(40, 40, 0);\n\t\tpointLight.castShadow = true;\n\t\tscene.add(pointLight);\n\n\t\tconst camera = new t3d.Camera();\n\t\tcamera.position.set(0, 80, 100);\n\t\tcamera.lookAt(new t3d.Vector3(0, 0, 0), new t3d.Vector3(0, 1, 0));\n\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 1000);\n\t\tscene.add(camera);\n\n\t\tfunction loop(count) {\n\t\t\trequestAnimationFrame(loop);\n\n\t\t\t// rotate camera\n\t\t\tcamera.position.x = 100 * Math.sin(count / 1000 * .5);\n\t\t\tcamera.position.z = 100 * Math.cos(count / 1000 * .5);\n\t\t\tcamera.lookAt(new t3d.Vector3(0, 0, 0), new t3d.Vector3(0, 1, 0));\n\n\t\t\tforwardRenderer.render(scene, camera);\n\t\t}\n\t\trequestAnimationFrame(loop);\n\n\t\tfunction onWindowResize() {\n\t\t\twidth = window.innerWidth || 2;\n\t\t\theight = window.innerHeight || 2;\n\n\t\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 1000);\n\n\t\t\tforwardRenderer.screenRenderTarget.resize(width, height);\n\t\t}\n\t\twindow.addEventListener('resize', onWindowResize, false);\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "examples/material_depth.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>t3d - depth material</title>\n\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n\t<link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n</head>\n<body>\n    <div id=\"info\">\n        <a href=\"\" target=\"_blank\">t3d</a> - depth material\n    </div>\n\n\t<!-- Import maps polyfill -->\n    <!-- Remove this when import maps will be widely supported -->\n    <script async src=\"./libs/es-module-shims.js\"></script>\n\n    <script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n    <script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { ForwardRenderer } from 't3d/addons/render/ForwardRenderer.js';\n\t\timport { GUI } from './libs/lil-gui.esm.min.js';\n\n\t\tlet width = window.innerWidth || 2;\n\t\tlet height = window.innerHeight || 2;\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = width;\n\t\tcanvas.height = height;\n\t\tdocument.body.appendChild(canvas);\n\n\t\tconst forwardRenderer = new ForwardRenderer(canvas);\n\n\t\tconst scene = new t3d.Scene();\n\n\t\tconst depthMaterial = new t3d.DepthMaterial();\n\n\t\tconst phong = new t3d.PhongMaterial();\n\t\tphong.diffuse.setHex(0xffffff);\n\n\t\tconst lambert = new t3d.LambertMaterial();\n\t\tlambert.diffuse.setHex(0xffffff);\n\n\t\tconst sphere = new t3d.Mesh(new t3d.SphereGeometry(10, 20, 20), depthMaterial);\n\t\tscene.add(sphere);\n\t\t\n\t\tconst plane = new t3d.Mesh(new t3d.PlaneGeometry(100, 100), depthMaterial);\n\t\tplane.position.y = -10;\n\t\tscene.add(plane);\n\n\t\tconst ambientLight = new t3d.AmbientLight(0xffffff, 0.3);\n\t\tscene.add(ambientLight);\n\n\t\tconst directionalLight = new t3d.DirectionalLight(0xffffff, 0.7);\n\t\tdirectionalLight.position.set(-40, 40, 0);\n\t\tdirectionalLight.lookAt(new t3d.Vector3(), new t3d.Vector3(0, 1, 0));\n\t\tscene.add(directionalLight);\n\n\t\tconst camera = new t3d.Camera();\n\t\tcamera.position.set(0, 80, 100);\n\t\tcamera.lookAt(new t3d.Vector3(0, 0, 0), new t3d.Vector3(0, 1, 0));\n\t\t// camera.setPerspective(45 / 180 * Math.PI, width / height, 2, 400);\n\t\tcamera.setOrtho(-width / 4 / 2, width / 4 / 2, -height / 4 / 2, height / 4 / 2, 2, 300);\n\t\tscene.add(camera);\n\n\t\t// gui\n\t\tconst params = { onlyDepth: true, packToRGBA: false };\n\t\tconst gui = new GUI();\n\t\tgui.add(params, 'onlyDepth').onChange(value => {\n\t\t\tif (value) {\n\t\t\t\tsphere.material = depthMaterial;\n\t\t\t\tplane.material = depthMaterial;\n\t\t\t} else {\n\t\t\t\tsphere.material = phong;\n\t\t\t\tplane.material = lambert;\n\t\t\t}\n\t\t});\n\t\tgui.add(params, 'packToRGBA').onChange(value => {\n\t\t\tdepthMaterial.packToRGBA = value;\n\t\t\tdepthMaterial.needsUpdate = true;\n\t\t});\n\n\t\tfunction loop(count) {\n\t\t\trequestAnimationFrame(loop);\n\n\t\t\t// rotate camera\n\t\t\tcamera.position.x = 100 * Math.sin(count / 1000 * .5);\n\t\t\tcamera.position.z = 100 * Math.cos(count / 1000 * .5);\n\t\t\tcamera.lookAt(new t3d.Vector3(0, 0, 0), new t3d.Vector3(0, 1, 0));\n\n\t\t\tforwardRenderer.render(scene, camera);\n\t\t}\n\n\t\trequestAnimationFrame(loop);\n\n\t\tfunction onWindowResize() {\n\t\t\twidth = window.innerWidth || 2;\n\t\t\theight = window.innerHeight || 2;\n\n\t\t\t// camera.setPerspective(45 / 180 * Math.PI, width / height, 2, 400);\n\t\t\tcamera.setOrtho(-width / 4 / 2, width / 4 / 2, -height / 4 / 2, height / 4 / 2, 2, 300);\n\n\t\t\tforwardRenderer.screenRenderTarget.resize(width, height);\n\t\t}\n\t\twindow.addEventListener('resize', onWindowResize, false);\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "examples/material_emissivemap.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>t3d - emissivemap</title>\n\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n\t<link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n</head>\n<body>\n    <div id=\"info\">\n        <a href=\"\" target=\"_blank\">t3d</a> - emissivemap\n    </div>\n\n\t<!-- Import maps polyfill -->\n    <!-- Remove this when import maps will be widely supported -->\n    <script async src=\"./libs/es-module-shims.js\"></script>\n\n    <script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n    <script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { ForwardRenderer } from 't3d/addons/render/ForwardRenderer.js';\n\t\timport { Texture2DLoader } from 't3d/addons/loaders/Texture2DLoader.js';\n\t\timport { GUI } from './libs/lil-gui.esm.min.js';\n\n\t\tlet width = window.innerWidth || 2;\n\t\tlet height = window.innerHeight || 2;\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = width;\n\t\tcanvas.height = height;\n\t\tdocument.body.appendChild(canvas);\n\n\t\tconst forwardRenderer = new ForwardRenderer(canvas);\n\n\t\tconst scene = new t3d.Scene();\n\n\t\tconst textureLoader = new Texture2DLoader();\n\t\tconst diffuse_texture = textureLoader.load('./resources/hardwood2_diffuse.jpg');\n\t\tconst emissive_texture = textureLoader.load('./resources/emissive_light.jpg');\n\t\temissive_texture.wrapT = emissive_texture.wrapS = t3d.TEXTURE_WRAP.REPEAT;\n\n\t\tconst material = new t3d.PhongMaterial();\n\t\tmaterial.diffuseMap = diffuse_texture;\n\t\tmaterial.emissiveMap = emissive_texture;\n\t\tconst geom = new t3d.SphereGeometry(10, 40, 40);\n\t\tconst cube = new t3d.Mesh(geom, material);\n\t\tscene.add(cube);\n\n\t\tconst ambientLight = new t3d.AmbientLight(0xffffff, 0.3);\n\t\tscene.add(ambientLight);\n\n\t\tconst pointLight = new t3d.PointLight(0xffffff, 0.7);\n\t\tpointLight.position.set(-40, 40, 0);\n\t\tscene.add(pointLight);\n\n\t\tconst camera = new t3d.Camera();\n\t\tcamera.position.set(0, 10, 80);\n\t\tcamera.lookAt(new t3d.Vector3(0, 0, 0), new t3d.Vector3(0, 1, 0));\n\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 10000);\n\t\tscene.add(camera);\n\n\t\tconst emissiveMapTransform = material.emissiveMapTransform;\n\t\temissiveMapTransform.scale.set(4, 2);\n\t\temissiveMapTransform.center.set(0.5, 0.5);\n\n\t\tconst gui = new GUI();\n\t\tgui.add(emissiveMapTransform.scale, 'x', 0.1, 5.0, 0.01).name('scale.x');\n\t\tgui.add(emissiveMapTransform.scale, 'y', 0.1, 5.0, 0.01).name('scale.y');\n\n\t\tlet randomCount = 0;\n\t\tfunction loop(count) {\n\t\t\trequestAnimationFrame(loop);\n\n\t\t\tconst intensity = Math.abs(Math.sin(randomCount += Math.random() * 0.1 - 0.04)) * 0.5 + 0.3;\n\t\t\tmaterial.emissive.setRGB(intensity, intensity, intensity);\n\n\t\t\temissiveMapTransform.offset.y += 0.01;\n\t\t\temissiveMapTransform.needsUpdate = true;\n\n\t\t\tpointLight.position.x = 40 * Math.sin(count / 1000 * .7);\n\t\t\tpointLight.position.z = 40 * Math.cos(count / 1000 * .7);\n\n\t\t\t// rotate camera\n\t\t\tcamera.position.x = 30 * Math.sin(count / 1000 * .4);\n\t\t\tcamera.position.z = 30 * Math.cos(count / 1000 * .4);\n\t\t\tcamera.lookAt(new t3d.Vector3(0, 0, 0), new t3d.Vector3(0, 1, 0));\n\t\t\tforwardRenderer.render(scene, camera);\n\t\t}\n\t\trequestAnimationFrame(loop);\n\n\t\tfunction onWindowResize() {\n\t\t\twidth = window.innerWidth || 2;\n\t\t\theight = window.innerHeight || 2;\n\n\t\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 10000);\n\n\t\t\tforwardRenderer.screenRenderTarget.resize(width, height);\n\t\t}\n\t\twindow.addEventListener('resize', onWindowResize, false);\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "examples/material_envmap.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>t3d - envmap</title>\n\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n\t<link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n</head>\n<body>\n\n    <div id=\"info\">\n        <a href=\"\" target=\"_blank\">t3d</a> - envmap\n    </div>\n\n\t<!-- Import maps polyfill -->\n    <!-- Remove this when import maps will be widely supported -->\n    <script async src=\"./libs/es-module-shims.js\"></script>\n\n    <script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n    <script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { SkyBox } from 't3d/addons/objects/SkyBox.js';\n\t\timport { ForwardRenderer } from 't3d/addons/render/ForwardRenderer.js';\n\t\timport { OrbitControls } from 't3d/addons/controls/OrbitControls.js';\n\t\timport { TextureCubeLoader } from 't3d/addons/loaders/TextureCubeLoader.js';\n\t\timport { GUI } from './libs/lil-gui.esm.min.js';\n\n\t\tlet width = window.innerWidth || 2;\n\t\tlet height = window.innerHeight || 2;\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = width;\n\t\tcanvas.height = height;\n\t\tdocument.body.appendChild(canvas);\n\n\t\tconst forwardRenderer = new ForwardRenderer(canvas);\n\n\t\tconst scene = new t3d.Scene();\n\n\t\tconst cubeTexturePath = './resources/skybox/Park2/';\n\t\tconst cubeTexture = new TextureCubeLoader().load([\n\t\t\tcubeTexturePath + 'posx.jpg',\n\t\t\tcubeTexturePath + 'negx.jpg',\n\t\t\tcubeTexturePath + 'posy.jpg',\n\t\t\tcubeTexturePath + 'negy.jpg',\n\t\t\tcubeTexturePath + 'posz.jpg',\n\t\t\tcubeTexturePath + 'negz.jpg'\n\t\t]);\n\t\tcubeTexture.encoding = t3d.TEXEL_ENCODING_TYPE.SRGB;\n\n\t\tconst skyBox = new SkyBox(cubeTexture);\n\t\tskyBox.gamma = true;\n\t\tscene.add(skyBox);\n\n\t\tscene.environment = cubeTexture;\n\n\t\tconst plane_geometry = new t3d.PlaneGeometry(60, 60);\n\t\tconst sphere_geometry = new t3d.SphereGeometry(20, 20, 20);\n\n\t\tconst material = new t3d.PBRMaterial();\n\t\tmaterial.diffuse.setHex(0xffffff);\n\t\tmaterial.roughness = 0;\n\t\tmaterial.metalness = 1;\n\t\tmaterial.side = t3d.DRAW_SIDE.DOUBLE;\n\n\t\tconst plane = new t3d.Mesh(plane_geometry, material);\n\t\tplane.position.set(30, 0, 0);\n\t\tscene.add(plane);\n\n\t\tconst sphere = new t3d.Mesh(sphere_geometry, material);\n\t\tsphere.position.set(-30, 0, 0);\n\t\tscene.add(sphere);\n\n\t\tconst camera = new t3d.Camera();\n\t\tcamera.outputEncoding = t3d.TEXEL_ENCODING_TYPE.SRGB;\n\t\tcamera.position.set(0, 50, 150);\n\t\tcamera.lookAt(new t3d.Vector3(0, 0, 0), new t3d.Vector3(0, 1, 0));\n\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 10000);\n\t\tscene.add(camera);\n\n\t\tconst controller = new OrbitControls(camera, canvas);\n\n\t\tconst gui = new GUI();\n\t\tconst envFolder = gui.addFolder('Environment');\n\t\tenvFolder.add(scene, 'envDiffuseIntensity', 0, 1, 0.01).name('Diffuse Intensity');\n\t\tenvFolder.add(scene, 'envSpecularIntensity', 0, 1, 0.01).name('Specular Intensity');\n\t\tconst materialFolder = gui.addFolder('Material');\n\t\tmaterialFolder.add(material, 'roughness', 0, 1, 0.01);\n\t\tmaterialFolder.add(material, 'metalness', 0, 1, 0.01);\n\n\t\tfunction loop(count) {\n\t\t\trequestAnimationFrame(loop);\n\n\t\t\tcontroller.update();\n\n\t\t\tforwardRenderer.render(scene, camera);\n\t\t}\n\t\trequestAnimationFrame(loop);\n\n\t\tfunction onWindowResize() {\n\t\t\twidth = window.innerWidth || 2;\n\t\t\theight = window.innerHeight || 2;\n\n\t\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 10000);\n\n\t\t\tforwardRenderer.screenRenderTarget.resize(width, height);\n\t\t}\n\t\twindow.addEventListener('resize', onWindowResize, false);\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "examples/material_flatshading.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>t3d - flat shading</title>\n\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n\t<link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n</head>\n<body>\n    <div id=\"info\">\n        <a href=\"\" target=\"_blank\">t3d</a> - flat shading\n    </div>\n\n\t<!-- Import maps polyfill -->\n    <!-- Remove this when import maps will be widely supported -->\n    <script async src=\"./libs/es-module-shims.js\"></script>\n\n    <script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n    <script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { GUI } from './libs/lil-gui.esm.min.js';\n\t\timport { ForwardRenderer } from 't3d/addons/render/ForwardRenderer.js';\n\n\t\tlet width = window.innerWidth || 2;\n\t\tlet height = window.innerHeight || 2;\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = width;\n\t\tcanvas.height = height;\n\t\tdocument.body.appendChild(canvas);\n\n\t\tconst forwardRenderer = new ForwardRenderer(canvas);\n\n\t\tconst scene = new t3d.Scene();\n\n\t\tconst sphere_geometry = new t3d.SphereGeometry(10, 20, 20);\n\t\tconst phong = new t3d.PhongMaterial();\n\t\tphong.diffuse.setHex(0xffffff);\n\t\tphong.shading = t3d.SHADING_TYPE.FLAT_SHADING;\n\t\tconst sphere = new t3d.Mesh(sphere_geometry, phong);\n\t\tsphere.castShadow = true;\n\t\tscene.add(sphere);\n\n\t\tconst plane_geometry = new t3d.PlaneGeometry(100, 100);\n\t\tconst lambert = new t3d.LambertMaterial();\n\t\tlambert.diffuse.setHex(0xffffff);\n\t\tconst plane = new t3d.Mesh(plane_geometry, lambert);\n\t\tplane.position.y = -10;\n\t\tplane.receiveShadow = true;\n\t\tscene.add(plane);\n\n\t\tconst ambientLight = new t3d.AmbientLight(0xffffff, 0.3);\n\t\tscene.add(ambientLight);\n\n\t\tconst directionalLight = new t3d.DirectionalLight(0xffffff, 0.6);\n\t\tdirectionalLight.position.set(-40, 40, 0);\n\t\tdirectionalLight.lookAt(new t3d.Vector3(), new t3d.Vector3(0, 1, 0));\n\t\tdirectionalLight.shadow.windowSize = 100;\n\t\tdirectionalLight.castShadow = true;\n\t\tscene.add(directionalLight);\n\n\t\tconst camera = new t3d.Camera();\n\t\tcamera.position.set(0, 80, 100);\n\t\tcamera.lookAt(new t3d.Vector3(0, 0, 0), new t3d.Vector3(0, 1, 0));\n\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 1000);\n\t\tscene.add(camera);\n\n\t\t// input\n\n\t\tconst gui = new GUI();\n\t\tgui.add({ flatShading: true }, 'flatShading').onChange(value => {\n\t\t\tphong.shading = value ? t3d.SHADING_TYPE.FLAT_SHADING : t3d.SHADING_TYPE.SMOOTH_SHADING;\n\t\t\tphong.needsUpdate = true;\n\t\t});\n\n\t\tfunction loop(count) {\n\t\t\trequestAnimationFrame(loop);\n\n\t\t\t// rotate camera\n\t\t\tcamera.position.x = 100 * Math.sin(count / 1000 * .5);\n\t\t\tcamera.position.z = 100 * Math.cos(count / 1000 * .5);\n\t\t\tcamera.lookAt(new t3d.Vector3(0, 0, 0), new t3d.Vector3(0, 1, 0));\n\n\t\t\tforwardRenderer.render(scene, camera);\n\t\t}\n\t\trequestAnimationFrame(loop);\n\n\t\tfunction onWindowResize() {\n\t\t\twidth = window.innerWidth || 2;\n\t\t\theight = window.innerHeight || 2;\n\n\t\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 1000);\n\n\t\t\tforwardRenderer.screenRenderTarget.resize(width, height);\n\t\t}\n\t\twindow.addEventListener('resize', onWindowResize, false);\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "examples/material_lightmap.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>t3d - lightmap</title>\n\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n\t<link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n</head>\n<body>\n    <div id=\"info\">\n        <a href=\"\" target=\"_blank\">t3d</a> - lightmap\n    </div>\n\n\t<script src=\"./libs/nanobar.js\"></script>\n\n\t<!-- Import maps polyfill -->\n    <!-- Remove this when import maps will be widely supported -->\n    <script async src=\"./libs/es-module-shims.js\"></script>\n\n    <script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n    <script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { ForwardRenderer } from 't3d/addons/render/ForwardRenderer.js';\n\t\timport { Texture2DLoader } from 't3d/addons/loaders/Texture2DLoader.js';\n\t\timport { OrbitControls } from 't3d/addons/controls/OrbitControls.js';\n\t\timport { GLTFLoader } from 't3d/addons/loaders/glTF/GLTFLoader.js';\n\t\timport { GUI } from './libs/lil-gui.esm.min.js';\n\n\t\tlet width = window.innerWidth || 2;\n\t\tlet height = window.innerHeight || 2;\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = width;\n\t\tcanvas.height = height;\n\t\tdocument.body.appendChild(canvas);\n\n\t\tconst forwardRenderer = new ForwardRenderer(canvas);\n\n\t\tconst scene = new t3d.Scene();\n\n\t\tlet vertexShader = t3d.ShaderLib.pbr_vert;\n\t\tlet fragmentShader = t3d.ShaderLib.pbr_frag;\n\t\tvertexShader = vertexShader.replace('#include <logdepthbuf_pars_vert>', `\n\t\t\t#include <logdepthbuf_pars_vert>\n\n\t\t\t#ifdef USE_LIGHT_MAP\n\t\t\t\tvarying vec2 vLightMapUV;\n\t\t\t#endif\n\t\t`);\n\t\tvertexShader = vertexShader.replace('#include <emissiveMap_vert>', `\n\t\t\t#include <emissiveMap_vert>\n\n\t\t\t#ifdef USE_LIGHT_MAP\n\t\t\t\tvLightMapUV = a_Uv;\n\t\t\t#endif\n\t\t`);\n\t\tfragmentShader = fragmentShader.replace('#include <clippingPlanes_pars_frag>', `\n\t\t\t#include <clippingPlanes_pars_frag>\n\n\t\t\t#ifdef USE_LIGHT_MAP\n\t\t\t\tuniform sampler2D lightMap;\n\t\t\t\tuniform float lightMapIntensity;\n\t\t\t\tvarying vec2 vLightMapUV;\n\t\t\t#endif\n\t\t`);\n\t\tfragmentShader = fragmentShader.replace('#include <aoMap_frag>', `\n\t\t\t#include <aoMap_frag>\n\t\t\t\n\t\t\t#ifdef USE_LIGHT_MAP\n\t\t\t\tvec4 lightMapTexel = sRGBToLinear(texture2D(lightMap, vLightMapUV)) * lightMapIntensity;\n\n\t\t\t\t#ifdef USE_LIGHT_MAP_AS_SHADOW_MAP\n\t\t\t\t\treflectedLight.directDiffuse.rgb *= lightMapTexel.rgb;\n\t\t\t\t\treflectedLight.directSpecular.rgb *= lightMapTexel.rgb;\n\t\t\t\t#else\n\t\t\t\t\treflectedLight.directDiffuse.rgb += lightMapTexel.rgb;\n\t\t\t\t#endif\n\t\t\t#endif\n\t\t`);\n\n\t\tconst nanobar = new Nanobar();\n\t\tnanobar.el.style.background = 'gray';\n\n\t\tconst loadingManager = new t3d.LoadingManager(function() {\n\t\t\tnanobar.go(100);\n\t\t\tnanobar.el.style.background = 'transparent';\n\t\t}, function(url, itemsLoaded, itemsTotal) {\n\t\t\tif (itemsLoaded < itemsTotal) {\n\t\t\t\tnanobar.go(itemsLoaded / itemsTotal * 100);\n\t\t\t}\n\t\t});\n\n\t\tconst textureLoader = new Texture2DLoader(loadingManager);\n\t\tconst lightmapPromise = textureLoader.loadAsync('./resources/lightmap.png').then(texture => {\n\t\t\ttexture.flipY = false;\n\t\t\ttexture.minFilter = t3d.TEXTURE_FILTER.LINEAR;\n\t\t\ttexture.generateMipmaps = false;\n\t\t\treturn texture;\n\t\t});\n\n\t\tconst loader = new GLTFLoader(loadingManager);\n\t\tconst modelPromise = loader.load('./resources/models/gltf/CornellBox.glb');\n\n\t\tconst materials = [];\n\t\tPromise.all([lightmapPromise, modelPromise]).then(([lightmap, result]) => {\n\t\t\tresult.root.traverse(node => {\n\t\t\t\tif (!node.isMesh) return;\n\n\t\t\t\tconst material = node.material;\n\t\t\t\tmaterial.type = t3d.MATERIAL_TYPE.SHADER;\n\t\t\t\tmaterial.shaderName = 'pbr_lightmap';\n\t\t\t\tmaterial.vertexShader = vertexShader;\n\t\t\t\tmaterial.fragmentShader = fragmentShader;\n\t\t\t\tmaterial.defines.USE_UV1 = true;\n\t\t\t\tmaterial.defines.USE_LIGHT_MAP = true;\n\t\t\t\tmaterial.defines.USE_LIGHT_MAP_AS_SHADOW_MAP = false;\n\n\t\t\t\tmaterial.uniforms.lightMap = lightmap;\n\t\t\t\tmaterial.uniforms.lightMapIntensity = 1;\n\t\t\n\t\t\t\tnode.receiveShadow = true;\n\t\t\t\tnode.castShadow = true;\n\n\t\t\t\tmaterials.push(material);\n\t\t\t});\n\n\t\t\tscene.add(result.root);\n\t\t});\n\n\t\tconst ambientLight = new t3d.AmbientLight(0xffffff, 0.4);\n\t\tambientLight.visible = false;\n\t\tscene.add(ambientLight);\n\n\t\tconst pointLight = new t3d.PointLight(0xffffff, 0.8, 3, 2);\n\t\tpointLight.position.set(0, 1.5, 0);\n\t\tpointLight.castShadow = true;\n\t\tpointLight.shadow.mapSize.set(1024, 1024);\n\t\tscene.add(pointLight);\n\n\t\tconst lightBall = new t3d.Mesh(new t3d.SphereGeometry(0.03, 20, 20), new t3d.BasicMaterial());\n\t\tpointLight.add(lightBall);\n\n\t\tconst camera = new t3d.Camera();\n\t\tcamera.outputEncoding = t3d.TEXEL_ENCODING_TYPE.SRGB;\n\t\tcamera.position.set(0, 1, 5);\n\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 0.1, 1000);\n\t\tscene.add(camera);\n\n\t\tconst controller = new OrbitControls(camera, canvas);\n\t\tcontroller.target.y = 1;\n\n\t\tconst param = {\n\t\t\tambientType: 'lightmap',\n\t\t\tlightMapIntensity: 1\n\t\t};\n\t\tconst gui = new GUI();\n\t\tgui.add(param, 'ambientType', ['lightmap', 'light', 'none']).onChange(value => {\n\t\t\tmaterials.forEach(material => {\n\t\t\t\tmaterial.defines.USE_LIGHT_MAP = value === 'lightmap';\n\t\t\t\tmaterial.defines.USE_UV1 = value === 'lightmap';\n\t\t\t\tmaterial.needsUpdate = true;\n\t\t\t});\n\n\t\t\tambientLight.visible = value === 'light';\n\t\t});\n\t\tgui.add(param, 'lightMapIntensity', 0, 5, 0.1).onChange(value => {\n\t\t\tmaterials.forEach(material => {\n\t\t\t\tmaterial.uniforms.lightMapIntensity = value;\n\t\t\t});\n\t\t});\n\t\tgui.add(ambientLight, 'intensity', 0, 2, 0.1).name('lightIntensity');\n\t\tconst pointLightFolder = gui.addFolder('Point Light').close();\n\t\tpointLightFolder.add(pointLight, 'visible');\n\t\tpointLightFolder.add(pointLight, 'castShadow');\n\t\tpointLightFolder.add(pointLight, 'intensity', 0, 2, 0.1);\n\t\tpointLightFolder.addColor(pointLight, 'color').onChange(value => {\n\t\t\tlightBall.material.diffuse.copy(value);\n\t\t});\n\n\t\tfunction loop(count) {\n\t\t\trequestAnimationFrame(loop);\n\n\t\t\tcontroller.update();\n\n\t\t\tpointLight.position.z = 0.8 * Math.sin(count / 1000);\n\t\t\tpointLight.position.x = 0.8 * Math.sin(count / 1000);\n\n\t\t\tforwardRenderer.render(scene, camera);\n\t\t}\n\t\trequestAnimationFrame(loop);\n\n\t\tfunction onWindowResize() {\n\t\t\twidth = window.innerWidth || 2;\n\t\t\theight = window.innerHeight || 2;\n\n\t\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 0.1, 1000);\n\n\t\t\tforwardRenderer.screenRenderTarget.resize(width, height);\n\t\t}\n\t\twindow.addEventListener('resize', onWindowResize, false);\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "examples/material_materials.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>t3d - materials</title>\n\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n\t<link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n</head>\n<body>\n    <div id=\"info\">\n        <a href=\"\" target=\"_blank\">t3d</a> - materials\n    </div>\n\n\t<!-- Import maps polyfill -->\n    <!-- Remove this when import maps will be widely supported -->\n    <script async src=\"./libs/es-module-shims.js\"></script>\n\n    <script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n    <script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { SkyBox } from 't3d/addons/objects/SkyBox.js';\n\t\timport { ForwardRenderer } from 't3d/addons/render/ForwardRenderer.js';\n\t\timport { Texture2DLoader } from 't3d/addons/loaders/Texture2DLoader.js';\n\t\timport { TextureCubeLoader } from 't3d/addons/loaders/TextureCubeLoader.js';\n\t\timport { AttenuationPBRMaterial } from 't3d/addons/materials/AttenuationMaterial.js';\n\t\timport { OrbitControls } from 't3d/addons/controls/OrbitControls.js';\n\n\t\tlet width = window.innerWidth || 2;\n\t\tlet height = window.innerHeight || 2;\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = width;\n\t\tcanvas.height = height;\n\t\tdocument.body.appendChild(canvas);\n\n\t\tconst forwardRenderer = new ForwardRenderer(canvas);\n\n\t\tconst scene = new t3d.Scene();\n\n\t\tconst textureLoader = new Texture2DLoader();\n\n\t\tconst texture = textureLoader.load('./resources/hardwood2_diffuse.jpg');\n\t\ttexture.anisotropy = forwardRenderer.capabilities.maxAnisotropy;\n\t\ttexture.encoding = t3d.TEXEL_ENCODING_TYPE.SRGB;\n\n\t\tconst ao_texture = textureLoader.load('./resources/ao.png');\n\n\t\tconst cubeTexturePath = './resources/skybox/sunset/';\n\t\tconst cubeTexture = new TextureCubeLoader().load([\n\t\t\tcubeTexturePath + 'px.jpg',\n\t\t\tcubeTexturePath + 'nx.jpg',\n\t\t\tcubeTexturePath + 'py.jpg',\n\t\t\tcubeTexturePath + 'ny.jpg',\n\t\t\tcubeTexturePath + 'pz.jpg',\n\t\t\tcubeTexturePath + 'nz.jpg'\n\t\t]);\n\t\tcubeTexture.encoding = t3d.TEXEL_ENCODING_TYPE.SRGB;\n\n\t\tconst skyBox = new SkyBox(cubeTexture);\n\t\tskyBox.gamma = true;\n\t\tscene.add(skyBox);\n\n\t\tconst camera = new t3d.Camera();\n\t\tcamera.outputEncoding = t3d.TEXEL_ENCODING_TYPE.SRGB;\n\t\tcamera.position.set(0, 0, 12);\n\t\tcamera.lookAt(new t3d.Vector3(0, 0, 0), new t3d.Vector3(0, 1, 0));\n\t\tcamera.setPerspective(60 / 180 * Math.PI, width / height, 1, 1000);\n\t\tscene.add(camera);\n\n\t\tconst controller = new OrbitControls(camera, canvas);\n\n\t\tconst directionalLight = new t3d.DirectionalLight(0xffffff, 0.7);\n\t\tdirectionalLight.position.set(20, 30, 40);\n\t\tdirectionalLight.lookAt(new t3d.Vector3(), new t3d.Vector3(0, 1, 0));\n\t\tscene.add(directionalLight);\n\n\t\t// materials\n\n\t\tconst points = new t3d.PointsMaterial();\n\t\tpoints.size = 0.1;\n\n\t\tconst line = new t3d.LineMaterial();\n\n\t\tconst lineloop = new t3d.LineMaterial();\n\t\tlineloop.drawMode = t3d.DRAW_MODE.LINE_LOOP;\n\n\t\tconst baisc = new t3d.BasicMaterial();\n\t\tbaisc.diffuse.setHex(0xffffff);\n\t\tbaisc.diffuseMap = texture;\n\t\tbaisc.aoMap = ao_texture;\n\n\t\tconst lambert = new t3d.LambertMaterial();\n\t\tlambert.diffuse.setHex(0xffffff);\n\t\tlambert.diffuseMap = texture;\n\n\t\tconst phong = new t3d.PhongMaterial();\n\t\tphong.diffuse.setHex(0xffffff);\n\t\tphong.diffuseMap = texture;\n\n\t\tconst pbr = new t3d.PBRMaterial();\n\t\tpbr.diffuse.setHex(0xffffff);\n\t\tpbr.diffuseMap = texture;\n\n\t\tconst attenuation = new AttenuationPBRMaterial();\n\t\tattenuation.diffuseMap = texture;\n\n\t\t// spheres\n\n\t\tconst geometry = new t3d.SphereGeometry(1, 20, 20);\n\t\tconst materials = [\n\t\t\tpoints, line, lineloop, baisc,\n\t\t\tlambert, phong, pbr, attenuation\n\t\t];\n\n\t\tfor (let i = 0, l = materials.length; i < l; i++) {\n\t\t\tfor (let j = 0; j < 2; j++) {\n\t\t\t\tlet material = materials[i];\n\t\t\t\tif (j > 0) {\n\t\t\t\t\tmaterial = material.clone();\n\t\t\t\t\tmaterial.envMap = cubeTexture;\n\t\t\t\t\tmaterial.envMapIntensity = i < 6 ? 0.5 : 1;\n\t\t\t\t}\n\t\t\t\tconst sphere = new t3d.Mesh(geometry, material);\n\t\t\t\tsphere.position.x = i % 4 * 2.5 - 3.5;\n\t\t\t\tsphere.position.y = (-Math.floor(i / 4) * 5 + 3.5) - (j * 2.5);\n\t\t\t\tscene.add(sphere);\n\t\t\t}\n\t\t}\n\n\t\t//\n\n\t\tfunction loop(timestamp) {\n\t\t\trequestAnimationFrame(loop);\n\n\t\t\tcontroller.update();\n\n\t\t\tforwardRenderer.render(scene, camera);\n\t\t}\n\t\trequestAnimationFrame(loop);\n\n\t\tfunction onWindowResize() {\n\t\t\twidth = window.innerWidth || 2;\n\t\t\theight = window.innerHeight || 2;\n\n\t\t\tcamera.setPerspective(60 / 180 * Math.PI, width / height, 1, 1000);\n\n\t\t\tforwardRenderer.screenRenderTarget.resize(width, height);\n\t\t}\n\t\twindow.addEventListener('resize', onWindowResize, false);\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "examples/material_normalmap.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>t3d - normalmap</title>\n\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n\t<link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n</head>\n<body>\n    <div id=\"info\">\n        <a href=\"\" target=\"_blank\">t3d</a> - normalmap\n    </div>\n\n\t<!-- Import maps polyfill -->\n    <!-- Remove this when import maps will be widely supported -->\n    <script async src=\"./libs/es-module-shims.js\"></script>\n\n    <script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n    <script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { ForwardRenderer } from 't3d/addons/render/ForwardRenderer.js';\n\t\timport { Texture2DLoader } from 't3d/addons/loaders/Texture2DLoader.js';\n\n\t\tlet width = window.innerWidth || 2;\n\t\tlet height = window.innerHeight || 2;\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = width;\n\t\tcanvas.height = height;\n\t\tdocument.body.appendChild(canvas);\n\n\t\tconst forwardRenderer = new ForwardRenderer(canvas);\n\n\t\tconst scene = new t3d.Scene();\n\n\t\t// couch\n\t\tconst textureLoader = new Texture2DLoader();\n\t\tconst couch_texture = textureLoader.load('./resources/normal/couch.jpg');\n\t\tconst couch_norm_texture = textureLoader.load('./resources/normal/counch_norm.jpg');\n\t\tconst couch_material = new t3d.PhongMaterial();\n\t\tcouch_material.diffuseMap = couch_texture;\n\t\tcouch_material.normalMap = couch_norm_texture;\n\t\tconst couch_geom = new t3d.PlaneGeometry(100, 100);\n\t\tconst couch = new t3d.Mesh(couch_geom, couch_material);\n\t\tscene.add(couch);\n\n\t\tconst ambientLight = new t3d.AmbientLight(0xffffff, 0.3);\n\t\tscene.add(ambientLight);\n\n\t\tconst pointLight = new t3d.PointLight(0xffffff, 1, 300, 1);\n\t\tpointLight.position.set(0, 5, 0);\n\t\tscene.add(pointLight);\n\n\t\tconst lightBall_geometry = new t3d.SphereGeometry(2, 10, 10);\n\t\tconst basic = new t3d.BasicMaterial();\n\t\tbasic.diffuse.setHex(0xffffff);\n\t\tconst lightBall = new t3d.Mesh(lightBall_geometry, basic);\n\t\tlightBall.position.set(0, 5, 0);\n\t\tscene.add(lightBall);\n\n\t\tconst camera = new t3d.Camera();\n\t\tcamera.position.set(0, 100, 80);\n\t\tcamera.lookAt(new t3d.Vector3(0, 0, 0), new t3d.Vector3(0, 1, 0));\n\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 10000);\n\t\tscene.add(camera);\n\n\t\tfunction loop(count) {\n\t\t\trequestAnimationFrame(loop);\n\n\t\t\tpointLight.position.x = 30 * Math.sin(count / 1000 * 1);\n\t\t\tpointLight.position.z = 30 * Math.cos(count / 1000 * 1);\n\n\t\t\tlightBall.position.x = 30 * Math.sin(count / 1000 * 1);\n\t\t\tlightBall.position.z = 30 * Math.cos(count / 1000 * 1);\n\n\t\t\t// rotate camera\n\t\t\tcamera.position.x = 80 * Math.sin(count / 1000 * .1);\n\t\t\tcamera.position.z = 80 * Math.cos(count / 1000 * .1);\n\t\t\tcamera.lookAt(new t3d.Vector3(0, 0, 0), new t3d.Vector3(0, 1, 0));\n\n\t\t\tforwardRenderer.render(scene, camera);\n\t\t}\n\t\trequestAnimationFrame(loop);\n\n\t\tfunction onWindowResize() {\n\t\t\twidth = window.innerWidth || 2;\n\t\t\theight = window.innerHeight || 2;\n\n\t\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 10000);\n\n\t\t\tforwardRenderer.screenRenderTarget.resize(width, height);\n\t\t}\n\t\twindow.addEventListener('resize', onWindowResize, false);\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "examples/material_pbr.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>t3d - pbr</title>\n\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n\t<link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n</head>\n<body>\n    <div id=\"info\">\n        <a href=\"\" target=\"_blank\">t3d</a> - pbr\n    </div>\n\n\t<!-- Import maps polyfill -->\n    <!-- Remove this when import maps will be widely supported -->\n    <script async src=\"./libs/es-module-shims.js\"></script>\n\n    <script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n    <script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { GUI } from './libs/lil-gui.esm.min.js';\n\t\timport { SkyBox } from 't3d/addons/objects/SkyBox.js';\n\t\timport { OrbitControls } from 't3d/addons/controls/OrbitControls.js';\n\t\timport { ForwardRenderer } from 't3d/addons/render/ForwardRenderer.js';\n\t\timport { TextureCubeLoader } from 't3d/addons/loaders/TextureCubeLoader.js';\n\t\timport { PMREMGenerator } from 't3d/addons/textures/PMREMGenerator.js';\n\n\t\tconst useDevicePixelRatio = true;\n\t\tconst devicePixelRatio = window.devicePixelRatio;\n\n\t\tlet width = window.innerWidth || 2;\n\t\tlet height = window.innerHeight || 2;\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = useDevicePixelRatio ? width * devicePixelRatio : width;\n\t\tcanvas.height = useDevicePixelRatio ? height * devicePixelRatio : height;\n\t\tcanvas.style.width = width + 'px';\n\t\tcanvas.style.height = height + 'px';\n\t\tdocument.body.appendChild(canvas);\n\n\t\tconst forwardRenderer = new ForwardRenderer(canvas);\n\n\t\tconst scene = new t3d.Scene();\n\n\t\tconst ambientLight = new t3d.AmbientLight(0x666666);\n\t\tscene.add(ambientLight);\n\n\t\tconst directLight = new t3d.DirectionalLight(0xffffff, 1);\n\t\tdirectLight.position.set(1, 1, 1);\n\t\tdirectLight.lookAt(new t3d.Vector3(), new t3d.Vector3(0, 1, 0));\n\t\tscene.add(directLight);\n\n\t\tconst particleLight = new t3d.Object3D();\n\t\tscene.add(particleLight);\n\n\t\tconst pointLight = new t3d.PointLight(0xffffff, 2, 800);\n\t\tparticleLight.add(pointLight);\n\n\t\tconst lightBall_geometry = new t3d.SphereGeometry(4, 10, 10);\n\t\tconst basic = new t3d.BasicMaterial();\n\t\tbasic.diffuse.setHex(0xffffff);\n\t\tconst lightBall = new t3d.Mesh(lightBall_geometry, basic);\n\t\tparticleLight.add(lightBall);\n\n\t\tconst camera = new t3d.Camera();\n\t\tcamera.outputEncoding = t3d.TEXEL_ENCODING_TYPE.SRGB;\n\t\tcamera.position.set(800, 600, 800);\n\t\tcamera.lookAt(new t3d.Vector3(0, 0, 0), new t3d.Vector3(0, 1, 0));\n\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 2000);\n\t\tscene.add(camera);\n\n\t\tconst cubeTexturePath = './resources/skybox/Bridge2/';\n\t\tlet cubeTexture = new TextureCubeLoader().load([\n\t\t\tcubeTexturePath + 'posx.jpg',\n\t\t\tcubeTexturePath + 'negx.jpg',\n\t\t\tcubeTexturePath + 'posy.jpg',\n\t\t\tcubeTexturePath + 'negy.jpg',\n\t\t\tcubeTexturePath + 'posz.jpg',\n\t\t\tcubeTexturePath + 'negz.jpg'\n\t\t], function() {\n\t\t\tcubeTexture.encoding = t3d.TEXEL_ENCODING_TYPE.SRGB;\n\n\t\t\tcubeTexture = (new PMREMGenerator(128)).prefilter(forwardRenderer, cubeTexture);\n\t\t\n\t\t\tconst skyBox = new SkyBox(cubeTexture);\n\t\t\tskyBox.gamma = true;\n\t\t\tscene.add(skyBox);\n\n\t\t\tconst cubeWidth = 400;\n\t\t\tconst numberOfSphersPerSide = 5;\n\t\t\tconst sphereRadius = (cubeWidth / numberOfSphersPerSide) * 0.8 * 0.5;\n\t\t\tconst stepSize = 1.0 / numberOfSphersPerSide;\n\n\t\t\tconst sphere_geometry = new t3d.SphereGeometry(sphereRadius, 32, 16);\n\n\t\t\tlet index = 0;\n\n\t\t\tfor (let alpha = 0; alpha <= 1.0; alpha += stepSize) {\n\t\t\t\tfor (let beta = 0; beta <= 1.0; beta += stepSize) {\n\t\t\t\t\tfor (let gamma = 0; gamma <= 1.0; gamma += stepSize) {\n\t\t\t\t\t\tconst pbr_mat = new t3d.PBRMaterial();\n\t\t\t\t\t\tpbr_mat.diffuse.setHSL(alpha, 0.5, gamma * 0.5);\n\t\t\t\t\t\tpbr_mat.metalness = beta;\n\t\t\t\t\t\tpbr_mat.roughness = 1.0 - alpha;\n\t\t\t\t\t\tpbr_mat.envMap = index % 2 === 0 ? null : cubeTexture;\n\n\t\t\t\t\t\tindex++;\n\n\t\t\t\t\t\tconst sphere = new t3d.Mesh(sphere_geometry, pbr_mat);\n\t\t\t\t\t\tsphere.position.x = alpha * 400 - 200;\n\t\t\t\t\t\tsphere.position.y = beta * 400 - 200;\n\t\t\t\t\t\tsphere.position.z = gamma * 400 - 200;\n\t\t\t\t\t\tscene.add(sphere);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tindex++;\n\t\t\t}\n\n\t\t\tconst gui = new GUI();\n\t\t\tgui.add({ version: 'WebGL ' + forwardRenderer.capabilities.version }, 'version').disable();\n\t\t\tgui.add(skyBox, 'level', 0, 8, 1);\n\t\t});\n\t\t\n\t\t// add a hover controller\n\t\tconst controller = new OrbitControls(camera, canvas);\n\n\t\tfunction loop(timestamp) {\n\t\t\trequestAnimationFrame(loop);\n\n\t\t\tconst timer = timestamp * 0.00025;\n\n\t\t\tparticleLight.position.x = Math.sin(timer * 7) * 300;\n\t\t\tparticleLight.position.y = Math.cos(timer * 5) * 400;\n\t\t\tparticleLight.position.z = Math.cos(timer * 3) * 300;\n\n\t\t\tcontroller.update();\n\n\t\t\tforwardRenderer.render(scene, camera);\n\t\t}\n\t\trequestAnimationFrame(loop);\n\n\t\tfunction onWindowResize() {\n\t\t\twidth = window.innerWidth || 2;\n\t\t\theight = window.innerHeight || 2;\n\n\t\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 2000);\n\n\t\t\tforwardRenderer.screenRenderTarget.resize(useDevicePixelRatio ? width * devicePixelRatio : width, useDevicePixelRatio ? height * devicePixelRatio : height);\n\t\t\tcanvas.style.width = width + 'px';\n\t\t\tcanvas.style.height = height + 'px';\n\t\t}\n\t\twindow.addEventListener('resize', onWindowResize, false);\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "examples/material_shader_background.html",
    "content": "<!DOCTYPE html>\n<html>\n\n<head>\n    <meta charset=\"utf-8\">\n    <title>t3d - shader background</title>\n    <meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n    <link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n</head>\n\n<body>\n    <div id=\"info\">\n        <a href=\"\" target=\"_blank\">t3d</a> - shader background\n    </div>\n\n    <!-- Import maps polyfill -->\n    <!-- Remove this when import maps will be widely supported -->\n    <script async src=\"./libs/es-module-shims.js\"></script>\n\n    <script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n    <script type=\"module\">\n        import * as t3d from 't3d';\n        import { ForwardRenderer } from 't3d/addons/render/ForwardRenderer.js';\n        import { OrbitControls } from 't3d/addons/controls/OrbitControls.js';\n        import { Background, BACKGROUND_LAYOUT } from 't3d/addons/objects/Background.js';\n        import { Texture2DLoader } from 't3d/addons/loaders/Texture2DLoader.js';\n        import { GUI } from './libs/lil-gui.esm.min.js';\n\n        let width = window.innerWidth || 2;\n        let height = window.innerHeight || 2;\n\n        const canvas = document.createElement('canvas');\n        canvas.width = width;\n        canvas.height = height;\n        document.body.appendChild(canvas);\n\n        const forwardRenderer = new ForwardRenderer(canvas);\n\n        const scene = new t3d.Scene();\n\n        const geometry = new t3d.BoxGeometry(8, 8, 8);\n        const material = new t3d.PBRMaterial();\n        const mesh = new t3d.Mesh(geometry, material);\n        scene.add(mesh);\n\n        const ambientLight = new t3d.AmbientLight(0xffffff);\n        scene.add(ambientLight);\n\n        const directionalLight = new t3d.DirectionalLight(0xffffff);\n        directionalLight.position.set(-3, 4, 5);\n        directionalLight.lookAt(new t3d.Vector3(), new t3d.Vector3(0, 1, 0));\n        scene.add(directionalLight);\n\n        const camera = new t3d.Camera();\n        camera.outputEncoding = t3d.TEXEL_ENCODING_TYPE.SRGB;\n        camera.position.set(0, 10, 50);\n        camera.lookAt(new t3d.Vector3(0, 0, 0), new t3d.Vector3(0, 1, 0));\n        camera.setPerspective(45 / 180 * Math.PI, width / height, 1, 1000);\n        scene.add(camera);\n\n        const controller = new OrbitControls(camera, canvas);\n        controller.autoRotate = true;\n        controller.autoRotateSpeed = 5;\n\n        // Create Background\n\n        const textures = [\n        \t{ name: 'UV_Grid_Sm.jpg', aspect: 1024 / 1024, texture: null },\n        \t{ name: 'earth4.jpg', aspect: 2048 / 1024, texture: null }\n        ];\n\n        const textureLoader = new Texture2DLoader().setPath('resources/');\n        textures.forEach(item => {\n        \titem.texture = textureLoader.load(item.name);\n        \titem.texture.encoding = t3d.TEXEL_ENCODING_TYPE.SRGB;\n        \titem.texture.wrapT = item.texture.wrapS = t3d.TEXTURE_WRAP.REPEAT;\n        });\n\n        const background = new Background(textures[0].texture, BACKGROUND_LAYOUT.Contain, width / height, textures[0].aspect);\n        background.gamma = true;\n        scene.add(background);\n\n        // GUI\n\n        const params = { image: textures[0].name };\n\n        const gui = new GUI();\n        gui.add(params, 'image', textures.map(item => item.name)).onChange(value => {\n        \tconst targetItem = textures.find(item => item.name === value);\n        \tbackground.texture = targetItem.texture;\n        \tbackground.textureAspect = targetItem.aspect;\n        });\n        gui.add(background, 'layout', BACKGROUND_LAYOUT);\n\n        //\n\n        function loop(count) {\n        \trequestAnimationFrame(loop);\n\n        \tcontroller.update();\n        \n        \tforwardRenderer.render(scene, camera);\n        }\n        requestAnimationFrame(loop);\n\n        function onWindowResize() {\n        \twidth = window.innerWidth || 2;\n        \theight = window.innerHeight || 2;\n\n        \tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 1000);\n\n        \tbackground.screenAspect = width / height;\n\n        \tforwardRenderer.screenRenderTarget.resize(width, height);\n        }\n        window.addEventListener('resize', onWindowResize, false);\n    </script>\n</body>\n\n</html>"
  },
  {
    "path": "examples/material_shader_extend.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>t3d - shader extend</title>\n\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n\t<link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n</head>\n<body>\n    <div id=\"info\">\n        <a href=\"\" target=\"_blank\">t3d</a> - shader extend\n    </div>\n\n\t<script src=\"./libs/nanobar.min.js\"></script>\n\n\t<!-- Import maps polyfill -->\n    <!-- Remove this when import maps will be widely supported -->\n    <script async src=\"./libs/es-module-shims.js\"></script>\n\n    <script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n    <script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { GLTFLoader } from 't3d/addons/loaders/glTF/GLTFLoader.js';\n\t\timport { TextureCubeLoader } from 't3d/addons/loaders/TextureCubeLoader.js';\n\t\timport { OrbitControls } from 't3d/addons/controls/OrbitControls.js';\n\t\timport { ForwardRenderer } from 't3d/addons/render/ForwardRenderer.js';\n\t\timport { GUI } from './libs/lil-gui.esm.min.js';\n\n\t\tlet width = window.innerWidth || 2;\n\t\tlet height = window.innerHeight || 2;\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = width;\n\t\tcanvas.height = height;\n\t\tdocument.body.appendChild(canvas);\n\n\t\tconst forwardRenderer = new ForwardRenderer(canvas);\n\t\tforwardRenderer.screenRenderTarget.setColorClearValue(0.05, 0.05, 0.05, 1);\n\n\t\tconst cubeTexturePath = './resources/skybox/Bridge2/';\n\t\tconst cubeTexture = new TextureCubeLoader().load([\n\t\t\tcubeTexturePath + 'posx.jpg',\n\t\t\tcubeTexturePath + 'negx.jpg',\n\t\t\tcubeTexturePath + 'posy.jpg',\n\t\t\tcubeTexturePath + 'negy.jpg',\n\t\t\tcubeTexturePath + 'posz.jpg',\n\t\t\tcubeTexturePath + 'negz.jpg'\n\t\t]);\n\t\tcubeTexture.encoding = t3d.TEXEL_ENCODING_TYPE.SRGB;\n\n\t\tconst scene = new t3d.Scene();\n\t\tscene.environment = cubeTexture;\n\n\t\tlet vertexShader = t3d.ShaderLib.pbr_vert;\n\t\tlet fragmentShader = t3d.ShaderLib.pbr_frag;\n\n\t\tvertexShader = vertexShader.replace('#include <logdepthbuf_pars_vert>', `\n\t\t\t#include <logdepthbuf_pars_vert>\n\t\t\n\t\t\tuniform float power;\n\t\t\tuniform bool glowInverse;\n\t\t\tvarying float intensity;\n\t\t`);\n\n\t\tvertexShader = vertexShader.replace('#include <shadowMap_vert>', `\n\t\t\t#include <shadowMap_vert>\n\n\t\t\tmat4 normalMatrix = transposeMat4(inverseMat4(u_View * u_Model));\n\t\t\tvec3 viewSpaceNormal = normalize(normalize(normalMatrix * vec4(a_Normal, 0.0)).xyz);\n\t\t\tif (glowInverse) {\n\t\t\t\tintensity = pow(abs(dot(viewSpaceNormal, vec3(0, 0, 1.))), power);\n\t\t\t} else {\n\t\t\t\tintensity = pow(1.0 - abs(dot(viewSpaceNormal, vec3(0, 0, 1.))), power);\n\t\t\t}\n\t\t`);\n\n\t\tfragmentShader = fragmentShader.replace('#include <clippingPlanes_pars_frag>', `\n\t\t\t#include <clippingPlanes_pars_frag>\n\n\t\t\tuniform vec3 glowColor;\n\t\t\tuniform float mixWeight;\n\t\t\tvarying float intensity;\n\t\t`);\n\n\t\tfragmentShader = fragmentShader.replace('#include <end_frag>', `\n\t\t\tvec3 glow = glowColor * intensity;\n\t\t\toutColor = vec4(mix(outColor.rgb, glow, mixWeight), intensity);\n\n\t\t\t#include <end_frag>\n\t\t`);\n\n\t\tconst uniforms = {\n\t\t\tpower: 0.54,\n\t\t\tglowInverse: false,\n\t\t\tglowColor: [32 / 255, 84 / 255, 255 / 255],\n\t\t\tmixWeight: 0.47\n\t\t};\n\n\t\tconst nanobar = new Nanobar();\n\t\tnanobar.el.style.background = 'gray';\n\n\t\tconst loadingManager = new t3d.LoadingManager(function() {\n\t\t\tnanobar.go(100);\n\t\t\tnanobar.el.style.background = 'transparent';\n\t\t}, function(url, itemsLoaded, itemsTotal) {\n\t\t\tif (itemsLoaded < itemsTotal) {\n\t\t\t\tnanobar.go(itemsLoaded / itemsTotal * 100);\n\t\t\t}\n\t\t});\n\n\t\tconst loader = new GLTFLoader(loadingManager);\n\t\tloader.load(\n\t\t\t'./resources/models/gltf/UinoHelmet/glTF/UinoHelmet.gltf'\n\t\t).then(function(result) {\n\t\t\tconst object = result.root;\n\n\t\t\tobject.traverse(node => {\n\t\t\t\tif (node.material) {\n\t\t\t\t\tconst material = new t3d.PBRMaterial();\n\t\t\t\t\tmaterial.type = t3d.MATERIAL_TYPE.SHADER;\n\n\t\t\t\t\tmaterial.copy(node.material);\n\n\t\t\t\t\tmaterial.uniforms = uniforms;\n\t\t\t\t\tmaterial.shaderName = 'CUSTOM_PBR';\n\t\t\t\t\tmaterial.vertexShader = vertexShader;\n\t\t\t\t\tmaterial.fragmentShader = fragmentShader;\n\n\t\t\t\t\tmaterial.transparent = true;\n\t\t\t\t\tmaterial.side = t3d.DRAW_SIDE.DOUBLE;\n\n\t\t\t\t\tnode.material = material;\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tobject.scale.set(30, 30, 30);\n\t\t\tobject.position.set(0, -34, -1);\n\n\t\t\tscene.add(object);\n\t\t});\n\n\t\t// top light\n\t\tconst directionalLightTop = new t3d.DirectionalLight(0xbbbbff, 0.5);\n\t\tdirectionalLightTop.euler.set(Math.PI / 2, 0, 0);\n\t\tscene.add(directionalLightTop);\n\n\t\t// bottom light\n\t\tconst directionalLightBottom = new t3d.DirectionalLight(0x444422, 0.5);\n\t\tdirectionalLightBottom.euler.set(-Math.PI / 2, 0, 0);\n\t\tscene.add(directionalLightBottom);\n\n\t\tconst camera = new t3d.Camera();\n\t\tcamera.outputEncoding = t3d.TEXEL_ENCODING_TYPE.SRGB;\n\t\tcamera.position.set(25, 5, 25);\n\t\tcamera.lookAt(new t3d.Vector3(0, 0, 0), new t3d.Vector3(0, 1, 0));\n\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 8000);\n\t\tscene.add(camera);\n\n\t\tconst controller = new OrbitControls(camera, canvas);\n\t\tcontroller.enablePan = false;\n\t\tcontroller.autoRotate = true;\n\t\tcontroller.autoRotateSpeed = 0.1;\n\n\t\tconst gui = new GUI();\n\t\tgui.add({ version: 'WebGL ' + forwardRenderer.capabilities.version }, 'version').disable();\n\t\tgui.add(uniforms, 'power', 0, 2, 0.01);\n\t\tgui.add(uniforms, 'glowInverse');\n\t\tgui.addColor(uniforms, 'glowColor');\n\t\tgui.add(uniforms, 'mixWeight', 0, 1, 0.01);\n\n\t\tfunction loop(count) {\n\t\t\trequestAnimationFrame(loop);\n\n\t\t\tcontroller.update();\n\n\t\t\tforwardRenderer.render(scene, camera);\n\t\t}\n\t\trequestAnimationFrame(loop);\n\n\t\tfunction onWindowResize() {\n\t\t\twidth = window.innerWidth || 2;\n\t\t\theight = window.innerHeight || 2;\n\n\t\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 8000);\n\n\t\t\tforwardRenderer.screenRenderTarget.resize(width, height);\n\t\t}\n\t\twindow.addEventListener('resize', onWindowResize, false);\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "examples/material_shader_fakeInterior.html",
    "content": "<!DOCTYPE html>\n<html>\n\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>t3d - fake interior</title>\n\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n\t<link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n</head>\n\n<body>\n\t<div id=\"info\" class=\"dark\">\n\t\t<a href=\"\" target=\"_blank\">t3d</a> - fake interior\n\t\t<br />reference: <a href=\"https://github.com/OBKF/Fake-Interior-Shader-for-GodotEngine\" target=\"_blank\">Fake-Interior-Shader-for-GodotEngine</a>\n\t</div>\n\n\t<script id=\"vertexShader\" type=\"x-shader/x-vertex\">\n\t\t#define USE_TANGENT\n\n\t\t#include <common_vert>\n\t\t#include <normal_pars_vert>\n\t\t#include <uv_pars_vert>\n\n\t\tuniform vec2 atlasGrid;\n\t\tuniform vec2 cellGrid;\n\t\tuniform float depth;\n\t\t\n\t\tvarying vec3 v_ViewDirTS;\n\t\tvarying vec2 v_UvTS;\n\n\t\tvoid main() {\n\t\t\t#include <begin_vert>\n\t\t\t#include <uv_vert>\n\t\t\t#include <pvm_vert>\n\n\t\t\t// Scale the UVs by cellGrid.\n\t\t\tv_UvTS = vec2(a_Uv.x, 1.0 - a_Uv.y) * cellGrid;\n\t\t\t\n\t\t\t// Get the object space view direction.\n\t\t\tvec3 objSpaceCameraPos = (inverseMat4(u_Model) * vec4(u_CameraPosition, 1.0)).xyz;\n\t\t\tvec3 viewDirOS = a_Position - objSpaceCameraPos;\n\n\t\t\t// Get the tangent space view direction.\n\t\t\tvec3 bitangent = normalize(cross(a_Normal.xyz, a_Tangent.xyz) * a_Tangent.w);\n\t\t\tv_ViewDirTS = vec3(\n\t\t\t\tdot(viewDirOS, a_Tangent.xyz),\n\t\t\t\tdot(viewDirOS, bitangent),\n\t\t\t\tdot(viewDirOS, a_Normal.xyz));\n\t\t}\n\t</script>\n\n\t<script id=\"fragmentShader\" type=\"x-shader/x-fragment\">\n\t\t#include <common_frag>\n\t\t#include <uv_pars_frag>\n\t\t#include <diffuseMap_pars_frag>\n\n\t\t#ifdef USE_EMISSIVEMAP\n\t\t\tuniform sampler2D emissiveMap;\n\t\t#endif\n\t\n\t\tuniform sampler2D overlayMap;\n\t\t\n\t\tuniform vec2 atlasGrid;\n\t\tuniform vec2 cellGrid;\n\t\tuniform float depth;\n\t\tuniform float emissionThreshold;\n\t\tuniform float emissionStrength;\n\t\tuniform float textureSeed;\n\t\tuniform float emissionSeed;\n\n\t\t// Random with float input.\n\t\tvec2 f_random(float co){\n\t\t\treturn fract(sin((co + textureSeed) * vec2(12.9898,78.233)) * 43758.5453);\n\t\t}\n\n\t\t// Random with vec2 input.\n\t\tfloat v_random (vec2 co) {\n\t\t\treturn fract(sin(dot(co + vec2(emissionSeed), vec2(12.9898,78.233))) * 43758.5453123);\n\t\t}\n\n\t\tvarying vec3 v_ViewDirTS;\n\t\tvarying vec2 v_UvTS;\n\n\t\tvoid main() {\n\t\t\t// Get the uv coordinates [0.0 - 1.0] of the current texture atlas.\n\t\t\tvec2 texture_uv = fract(v_UvTS);\n\n\t\t\t// Get the uv atlas index.\n\t\t\tvec2 texture_index_uv = floor(v_UvTS);\n\n\t\t\t// Randomize the cell grid.\n\t\t\tvec2 n = floor(f_random(texture_index_uv.x + texture_index_uv.y * (texture_index_uv.x + 1.0)) * atlasGrid);\n\t\t\ttexture_index_uv += n;\n\n\t\t\t// Get parallax depth from diffuseMap alpha, or use depth uniform.\n\t\t\tfloat far_frac = texture(diffuseMap, (texture_index_uv + 0.5) / atlasGrid).a;\n\t\t\tif (far_frac == 1.0) far_frac = depth;\n\n\t\t\t// Calculate depth scale.\n\t\t\tfloat depth_scale = 1.0 / (1.0 - far_frac) - 1.0;\n\n\t\t\t// Get the intersection point with the box in tangent space.\n\t\t\tvec3 pos = vec3(texture_uv * 2.0 - 1.0, -1.0);\n\t\t\tvec3 _tangent_view_dir = v_ViewDirTS;\n\t\t\t_tangent_view_dir.z *= -depth_scale;\n\t\t\tvec3 id = 1.0 / _tangent_view_dir;\n\t\t\tvec3 k = abs(id) - pos * id;\n\t\t\tfloat k_min = min(min(k.x, k.y), k.z);\n\t\t\tpos += k_min * _tangent_view_dir;\n\n\t\t\t// Map the depth to [0.0 - 1.0].\n\t\t\tfloat interpolate = (pos.z + 1.0) * 0.5;\n\n\t\t\t// Calculate the real depth.\n\t\t\tfloat real_z = clamp(interpolate, 0.0, 1.0) / depth_scale + 1.0;\n\t\t\tinterpolate = 1.0 - (1.0 / real_z);\n\t\t\tinterpolate *= depth_scale + 1.0;\n\n\t\t\t// Interpolate from far back to near.\n\t\t\tvec2 interior_uv = pos.xy * mix(1.0, far_frac, interpolate);\n\t\t\tinterior_uv = interior_uv * 0.5 + 0.5;\n\n\t\t\t// Sampler value from map or map atlas.\n\t\t\tvec2 uvTemp = texture_index_uv + interior_uv;\n\t\t\tuvTemp.y = 1.0 - uvTemp.y;\t// Flip y.\n\t\t\tvec2 uv = uvTemp / atlasGrid;\n\t\t\tvec3 diffuse = texture(diffuseMap, uv).rgb;\n\t\t\tvec3 emit = texture(emissiveMap, uv).rgb;\n\t\t\tvec4 overlayColor = texture(overlayMap, v_UvTS);\n\t\t\t\n\t\t\t// Use emission map based on threshold parameter.\n\t\t\tfloat is_emit = v_random(floor(v_UvTS));\n\t\t\tis_emit = 1.0 - step(emissionThreshold, is_emit);\n\n\t\t\tvec3 color = diffuse * (1.0 - is_emit);\n\t\t\tvec3 emission = emit * is_emit * emissionStrength;\n\n\t\t\t// Add overlay color.\n\t\t\tvec4 finalColor = vec4(color + emission, 1.0);\n\t\t\tfinalColor.rgb = mix(finalColor.rgb, overlayColor.rgb, overlayColor.a);\n\n\t\t\tgl_FragColor = finalColor;\n\t\t}\n\t</script>\n\n\t<script src=\"./libs/simplex-noise.js\"></script>\n\n\t<!-- Import maps polyfill -->\n\t<!-- Remove this when import maps will be widely supported -->\n\t<script async src=\"./libs/es-module-shims.js\"></script>\n\n\t<script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n\t<script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { OrbitControls } from 't3d/addons/controls/OrbitControls.js';\n\t\timport { ForwardRenderer } from 't3d/addons/render/ForwardRenderer.js';\n\t\timport { Texture2DLoader } from 't3d/addons/loaders/Texture2DLoader.js';\n\t\timport { GeometryUtils } from 't3d/addons/geometries/GeometryUtils.js';\n\t\timport { GUI } from './libs/lil-gui.esm.min.js';\n\n\t\tlet width = window.innerWidth || 2;\n\t\tlet height = window.innerHeight || 2;\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = width;\n\t\tcanvas.height = height;\n\t\tdocument.body.appendChild(canvas);\n\n\t\tconst forwardRenderer = new ForwardRenderer(canvas);\n\t\tforwardRenderer.screenRenderTarget.setColorClearValue(0.6, 0.7, 0.8, 1);\n\n\t\tconst scene = new t3d.Scene();\n\t\tscene.fog = new t3d.Fog(undefined, 10, 500);\n\t\tscene.fog.color.setRGB(0.6, 0.7, 0.8);\n\n\t\tfunction createTexture(uri) {\n\t\t\tconst texture = new Texture2DLoader().load('./resources/interior/' + uri);\n\t\t\ttexture.wrapS = t3d.TEXTURE_WRAP.REPEAT;\n\t\t\ttexture.wrapT = t3d.TEXTURE_WRAP.REPEAT;\n\t\t\treturn texture;\n\t\t}\n\n\t\tconst glassTexture = createTexture('glass.png');\n\n\t\tconst fakeInteriorTextures = {\n\t\t\t'dir_test': {\n\t\t\t\tdiffuseDepth: createTexture('interior_2d.png'),\n\t\t\t\temissive: createTexture('interior_2d.png'),\n\t\t\t\tatlasGrid: [1, 1]\n\t\t\t},\n\t\t\t'single_test': {\n\t\t\t\tdiffuseDepth: createTexture('t1_depth.png'),\n\t\t\t\temissive: createTexture('t2_emit.png'),\n\t\t\t\tatlasGrid: [1, 1]\n\t\t\t},\n\t\t\t'multiple_test': {\n\t\t\t\tdiffuseDepth: createTexture('rooms_depth.png'),\n\t\t\t\temissive: createTexture('rooms_emit.png'),\n\t\t\t\tatlasGrid: [3, 2]\n\t\t\t},\n\t\t\t'beauty': {\n\t\t\t\tdiffuseDepth: createTexture('room_3.png'),\n\t\t\t\temissive: createTexture('room_3_E.png'),\n\t\t\t\tatlasGrid: [1, 1],\n\t\t\t\tdepth: 0.5\n\t\t\t}\n\t\t};\n\n\t\tconst shaderMaterial = new t3d.ShaderMaterial({\n\t\t\tvertexShader: document.getElementById('vertexShader').textContent,\n\t\t\tfragmentShader: document.getElementById('fragmentShader').textContent,\n\t\t\tuniforms: {\n\t\t\t\toverlayMap: glassTexture,\n\t\t\t\tdepth: 0.5,\n\t\t\t\tatlasGrid: [1, 1],\n\t\t\t\tcellGrid: [6, 6],\n\t\t\t\temissionThreshold: 0.3,\n\t\t\t\temissionStrength: 1.0,\n\t\t\t\ttextureSeed: 0,\n\t\t\t\temissionSeed: 0\n\t\t\t}\n\t\t});\n\n\t\tconst geometry = new t3d.PlaneGeometry(1, 1, 1, 1);\n\t\tGeometryUtils.computeTangents(geometry);\n\t\tconst plane = new t3d.Mesh(geometry, shaderMaterial);\n\t\tplane.scale.set(20, 20, 20);\n\t\tplane.position.set(0, 10, 0);\n\t\tplane.euler.x = Math.PI / 2;\n\t\tplane.frustumCulled = false;\n\t\tscene.add(plane);\n\n\t\tconst cylinderGeometry = new t3d.CylinderGeometry(1, 1, 2, 6);\n\t\tGeometryUtils.computeTangents(cylinderGeometry);\n\t\tconst sphere = new t3d.Mesh(cylinderGeometry, shaderMaterial);\n\t\tsphere.scale.set(10, 10, 10);\n\t\tsphere.position.set(25, 10, 0);\n\t\tscene.add(sphere);\n\n\t\tconst boxGeometry = new t3d.BoxGeometry();\n\t\tGeometryUtils.computeTangents(boxGeometry);\n\t\tconst box = new t3d.Mesh(boxGeometry, shaderMaterial);\n\t\tbox.scale.set(20, 20, 20);\n\t\tbox.position.set(-25, 10, 0);\n\t\tscene.add(box);\n\n\t\tconst plane_geometry = new t3d.PlaneGeometry(1000, 1000);\n\t\tconst plane_material = new t3d.BasicMaterial();\n\t\tplane_material.roughness = 1;\n\t\tplane_material.diffuse.setHex(0x888888);\n\t\tconst ground = new t3d.Mesh(plane_geometry, plane_material);\n\t\tscene.add(ground);\n\n\t\tconst camera = new t3d.Camera();\n\t\tcamera.outputEncoding = t3d.TEXEL_ENCODING_TYPE.SRGB;\n\t\tcamera.position.set(0, 20, 80);\n\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 0.1, 1000);\n\t\tscene.add(camera);\n\n\t\tconst controller = new OrbitControls(camera, canvas);\n\t\tcontroller.target.set(0, 10, 0);\n\n\t\tfunction setTextures(data) {\n\t\t\tshaderMaterial.diffuseMap = data.diffuseDepth;\n\t\t\tshaderMaterial.emissiveMap = data.emissive;\n\t\t\tshaderMaterial.uniforms.atlasGrid = data.atlasGrid;\n\t\t\tshaderMaterial.uniforms.depth = data.depth || 0;\n\t\t\tshaderMaterial.needsUpdate = true;\n\t\t}\n\n\t\tsetTextures(fakeInteriorTextures['beauty']);\n\n\t\t// gui\n\t\tconst gui = new GUI();\n\t\tgui.add({ texture: 'beauty' }, 'texture', fakeInteriorTextures).onChange(value => {\n\t\t\tsetTextures(value);\n\t\t});\n\t\tconst uniforms = shaderMaterial.uniforms;\n\t\tconst emission = gui.addFolder('Emission');\n\t\temission.add(uniforms, 'emissionThreshold', 0, 1, 0.01).name('threshold');\n\t\temission.add(uniforms, 'emissionStrength', 0, 2, 0.1).name('strength');\n\t\tconst seed = gui.addFolder('Random Seed');\n\t\tseed.add(uniforms, 'textureSeed', 0, 10, 1).name('texture');\n\t\tseed.add(uniforms, 'emissionSeed', 0, 10, 1).name('emission');\n\t\tconst cellGrid = gui.addFolder('Cell Grid');\n\t\tcellGrid.add(uniforms.cellGrid, '0', 1, 10, 1).name('x');\n\t\tcellGrid.add(uniforms.cellGrid, '1', 1, 10, 1).name('y');\n\t\tcellGrid.close();\n\n\t\tfunction loop(count) {\n\t\t\trequestAnimationFrame(loop);\n\n\t\t\tcontroller.update();\n\n\t\t\tforwardRenderer.render(scene, camera);\n\t\t}\n\t\trequestAnimationFrame(loop);\n\n\t\tfunction onWindowResize() {\n\t\t\twidth = window.innerWidth || 2;\n\t\t\theight = window.innerHeight || 2;\n\n\t\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 0.1, 1000);\n\n\t\t\tforwardRenderer.screenRenderTarget.resize(width, height);\n\t\t}\n\t\twindow.addEventListener('resize', onWindowResize, false);\n\t</script>\n</body>\n\n</html>"
  },
  {
    "path": "examples/material_shader_grid.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>t3d - shader grid material</title>\n\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n\t<link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n</head>\n\n<body>\n\t<div id=\"info\">\n\t\t<a href=\"\" target=\"_blank\">t3d</a> - shader grid\n\t\t<br/>\n\t\t<div id=\"notSupported\" style=\"display:none\">Sorry, your graphics card + browser does not support Frag Depth</div>\n\t</div>\n\n\t<!-- Import maps polyfill -->\n\t<!-- Remove this when import maps will be widely supported -->\n\t<script async src=\"./libs/es-module-shims.js\"></script>\n\n\t<script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n\t<script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { Texture2DLoader } from 't3d/addons/loaders/Texture2DLoader.js';\n\t\timport { OrbitControls } from 't3d/addons/controls/OrbitControls.js';\n\t\timport { InfiniteGridShader } from 't3d/addons/shaders/InfiniteGridShader.js';\n\t\timport { Clock } from 't3d/addons/Clock.js';\n\t\timport { GUI } from './libs/lil-gui.esm.min.js';\n\n\t\tlet width = window.innerWidth || 2;\n\t\tlet height = window.innerHeight || 2;\n\t\t\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = width;\n\t\tcanvas.height = height;\n\t\tdocument.body.appendChild(canvas);\n\n\t\tconst contextParams = { antialias: true, alpha: false };\n\t\tconst gl = canvas.getContext('webgl2', contextParams) || canvas.getContext('webgl', contextParams);\n\t\tconst renderer = new t3d.WebGLRenderer(gl);\n\n\t\tconst capabilities = renderer.capabilities;\n\n\t\tif (capabilities.version < 2 && !capabilities.getExtension('EXT_frag_depth')) {\n\t\t\tdocument.getElementById('notSupported').style.display = '';\n\t\t\tthrow Error('Sorry, your graphics card + browser does not support Frag Depth.');\n\t\t}\n\t\tif (capabilities.version < 2 && capabilities.getExtension('EXT_frag_depth')) {\n\t\t\tInfiniteGridShader.fragmentShader = '#extension GL_EXT_frag_depth : enable \\n' + InfiniteGridShader.fragmentShader;\n\t\t}\n\n\t\tconst screenRenderTarget = new t3d.ScreenRenderTarget(canvas);\n\t\tscreenRenderTarget\n\t\t\t.setColorClearValue(0, 0, 0, 1)\n\t\t\t.setClear(true, true, false);\n\n\t\tconst scene = new t3d.Scene();\n\n\t\tconst textureLoader = new Texture2DLoader();\n\t\tconst texture = textureLoader.load('./resources/logo.jpg');\n\t\ttexture.encoding = t3d.TEXEL_ENCODING_TYPE.SRGB;\n\t\ttexture.anisotropy = renderer.capabilities.maxAnisotropy;\n\n\t\tconst boxGeometry = new t3d.BoxGeometry(1, 1, 1);\n\t\tconst boxMaterial = new t3d.PBRMaterial();\n\t\tboxMaterial.diffuseMap = texture;\n\t\tboxMaterial.roughness = 1;\n\t\tboxMaterial.metalness = 0;\n\t\tconst box = new t3d.Mesh(boxGeometry, boxMaterial);\n\t\tscene.add(box);\n\n\t\tconst directionalLight = new t3d.DirectionalLight(0xffffff, 0.8);\n\t\tdirectionalLight.position.set(-30, 30, 30);\n\t\tdirectionalLight.lookAt(new t3d.Vector3(), new t3d.Vector3(0, 1, 0));\n\t\tscene.add(directionalLight);\n\n\t\tconst ambientLight = new t3d.AmbientLight(0xffffff, 0.5);\n\t\tscene.add(ambientLight);\n\n\t\tconst camera = new t3d.Camera();\n\t\tcamera.outputEncoding = t3d.TEXEL_ENCODING_TYPE.SRGB;\n\t\tcamera.position.set(5, 3, 5);\n\t\tcamera.lookAt(new t3d.Vector3(6, 1, 0), new t3d.Vector3(0, 1, 0));\n\t\tcamera.setPerspective(60 / 180 * Math.PI, width / height, 0.1, 1000);\n\t\tscene.add(camera);\n\n\t\tconst controller = new OrbitControls(camera, canvas);\n\n\t\tconst geometryData = {\n\t\t\tpositions: [\n\t\t\t\t1, 1, 0,\n\t\t\t\t-1, -1, 0,\n\t\t\t\t-1, 1, 0,\n\t\t\t\t-1, -1, 0,\n\t\t\t\t1, 1, 0,\n\t\t\t\t1, -1, 0\n\t\t\t],\n\t\t\tnormals: [\n\t\t\t\t0, 0, 1,\n\t\t\t\t0, 0, 1,\n\t\t\t\t0, 0, 1,\n\t\t\t\t0, 0, 1,\n\t\t\t\t0, 0, 1,\n\t\t\t\t0, 0, 1\n\t\t\t]\n\t\t};\n\n\t\tconst gridmaterial = new t3d.ShaderMaterial(InfiniteGridShader);\n\t\tgridmaterial.transparent = true;\n\t\tgridmaterial.defines.USE_LINEARFADE = true;\n\t\tconst gridgeometry = new t3d.Geometry();\n\t\tgridgeometry.addAttribute('a_Position', new t3d.Attribute(new t3d.Buffer(new Float32Array(geometryData.positions), 3)));\n\t\tgridgeometry.addAttribute('a_Normal', new t3d.Attribute(new t3d.Buffer(new Float32Array(geometryData.normals), 3)));\n\t\tgridgeometry.setIndex(new t3d.Attribute(new t3d.Buffer(new Uint16Array([2, 1, 0, 5, 4, 3]), 1)));\n\n\t\tconst grid = new t3d.Mesh(gridgeometry, gridmaterial);\n\t\tgrid.frustumCulled = false;\n\t\tscene.add(grid);\n\n\t\tconst param = { d2: false, fade: true };\n\t\tlet progress;\n\t\t\n\t\tconst gui = new GUI();\n\t\tgui.add(param, 'd2').onChange(value => {\n\t\t\tparam.d2 = value;\n\t\t\tprogress = 0.01;\n\t\t}).name('2d grid');\n\t\tconst styleFolder = gui.addFolder('style');\n\t\tstyleFolder.add(gridmaterial.uniforms, 'axisIntensity', 0, 1, 0.01);\n\t\tstyleFolder.add(gridmaterial.uniforms, 'gridIntensity', 0, 1, 0.01);\n\t\tstyleFolder.add(gridmaterial.uniforms, 'primaryScale', 0, 10, 0.1);\n\t\tstyleFolder.add(gridmaterial.uniforms, 'secondaryScale', 0, 10, 0.1);\n\t\tstyleFolder.add(gridmaterial.uniforms, 'primaryFade', 0, 1, 0.1);\n\t\tstyleFolder.add(gridmaterial.uniforms, 'secondaryFade', 0, 1, 0.1);\n\t\tstyleFolder.close();\n\t\tconst linearFadeFolder = gui.addFolder('fade');\n\t\tlinearFadeFolder.add(param, 'fade').onChange(value => {\n\t\t\tgrid.material.defines.USE_LINEARFADE = value;\n\t\t\tgrid.material.needsUpdate = true;\n\t\t});\n\t\tlinearFadeFolder.add(gridmaterial.uniforms, 'start', 0, 49, 0.01);\n\t\tlinearFadeFolder.add(gridmaterial.uniforms, 'end', 50, 200, 0.01);\n\t\tlinearFadeFolder.close();\n\n\t\tconst clock = new Clock();\n\n\t\tfunction loop(count) {\n\t\t\trequestAnimationFrame(loop);\n\n\t\t\tconst delta = clock.getDelta();\n\t\t\tif (progress > 0 && progress < 1) {\n\t\t\t\tprogress += delta * 10.0;\n\t\t\t\tprogress = Math.min(1, progress);\n\t\t\t\tgridmaterial.uniforms.flipProgress = param.d2 ? progress : (1 - progress);\n\t\t\t}\n\n\t\t\tcontroller.update();\n\t\t\n\t\t\tscene.updateMatrix();\n\t\t\tscene.updateRenderStates(camera);\n\t\t\tscene.updateRenderQueue(camera);\n\n\t\t\trenderer.renderScene(scene, camera, screenRenderTarget);\n\t\t}\n\t\trequestAnimationFrame(loop);\n\n\t\tfunction onWindowResize() {\n\t\t\twidth = window.innerWidth || 2;\n\t\t\theight = window.innerHeight || 2;\n\n\t\t\tcamera.setPerspective(60 / 180 * Math.PI, width / height, 0.1, 1000);\n\n\t\t\tscreenRenderTarget.resize(width, height);\n\t\t}\n\t\twindow.addEventListener('resize', onWindowResize, false);\n\t</script>\n</body>\n\n</html>"
  },
  {
    "path": "examples/material_shader_matcap.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>t3d - matcap</title>\n\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n\t<link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n</head>\n<body>\n    <div id=\"info\">\n        <a href=\"\" target=\"_blank\">t3d</a> - matcap\n    </div>\n\n\t<script src=\"./libs/nanobar.min.js\"></script>\n\n\t<!-- Import maps polyfill -->\n    <!-- Remove this when import maps will be widely supported -->\n    <script async src=\"./libs/es-module-shims.js\"></script>\n\n    <script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n    <script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { GLTFLoader } from 't3d/addons/loaders/glTF/GLTFLoader.js';\n\t\timport { Texture2DLoader } from 't3d/addons/loaders/Texture2DLoader.js';\n\t\timport { OrbitControls } from 't3d/addons/controls/OrbitControls.js';\n\t\timport { ForwardRenderer } from 't3d/addons/render/ForwardRenderer.js';\n\t\timport { MatcapShader } from 't3d/addons/shaders/MatcapShader.js';\n\t\timport { GUI } from './libs/lil-gui.esm.min.js';\n\n\t\tlet width = window.innerWidth || 2;\n\t\tlet height = window.innerHeight || 2;\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = width * window.devicePixelRatio;\n\t\tcanvas.height = height * window.devicePixelRatio;\n\t\tcanvas.style.width = width + 'px';\n\t\tcanvas.style.height = height + 'px';\n\t\tdocument.body.appendChild(canvas);\n\n\t\tconst forwardRenderer = new ForwardRenderer(canvas);\n\n\t\tconst scene = new t3d.Scene();\n\n\t\tconst textureLoader = new Texture2DLoader();\n\n\t\tconst matcapTextures = {\n\t\t\tcollor: textureLoader.load('./resources/matcaps/matcap-collor.jpg'),\n\t\t\tdarkgreymetal: textureLoader.load('./resources/matcaps/matcap-darkgreymetal.jpg')\n\t\t};\n\n\t\tconst nanobar = new Nanobar();\n\t\tnanobar.el.style.background = 'gray';\n\n\t\tconst loadingManager = new t3d.LoadingManager(function() {\n\t\t\tnanobar.go(100);\n\t\t\tnanobar.el.style.background = 'transparent';\n\t\t}, function(url, itemsLoaded, itemsTotal) {\n\t\t\tif (itemsLoaded < itemsTotal) {\n\t\t\t\tnanobar.go(itemsLoaded / itemsTotal * 100);\n\t\t\t}\n\t\t});\n\n\t\tconst loader = new GLTFLoader(loadingManager);\n\t\tlet root;\n\t\tloader.load(\n\t\t\t'./resources/models/gltf/LeePerrySmith/LeePerrySmith.glb'\n\t\t).then(function(result) {\n\t\t\t// add mesh to scene\n\t\t\troot = result.root;\n\n\t\t\troot.traverse(node => {\n\t\t\t\tif (node.material) {\n\t\t\t\t\tnode.material = new t3d.ShaderMaterial(MatcapShader);\n\t\t\t\t\tnode.material.uniforms.matcap = matcapTextures.darkgreymetal;\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tscene.add(root);\n\t\t});\n\n\t\tconst camera = new t3d.Camera();\n\t\tcamera.outputEncoding = t3d.TEXEL_ENCODING_TYPE.SRGB;\n\t\tcamera.position.set(0, 3, 15);\n\t\tcamera.lookAt(new t3d.Vector3(0, 0, 0), new t3d.Vector3(0, 1, 0));\n\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 0.1, 1000);\n\t\tscene.add(camera);\n\n\t\tconst controller = new OrbitControls(camera, canvas);\n\t\tcontroller.enablePan = false;\n\t\tcontroller.minDistance = 10;\n\t\tcontroller.maxDistance = 200;\n\n\t\tconst gui = new GUI();\n\t\tgui.add({ version: 'WebGL ' + forwardRenderer.capabilities.version }, 'version').disable();\n\t\tgui.add({ matcap: 'darkgreymetal' }, 'matcap', ['collor', 'darkgreymetal']).onChange(value => {\n\t\t\troot.traverse(node => {\n\t\t\t\tif (node.material) {\n\t\t\t\t\tnode.material.uniforms.matcap = matcapTextures[value];\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\n\t\tfunction loop(count) {\n\t\t\trequestAnimationFrame(loop);\n\n\t\t\tcontroller.update();\n\n\t\t\tforwardRenderer.render(scene, camera);\n\t\t}\n\t\trequestAnimationFrame(loop);\n\n\t\tfunction onWindowResize() {\n\t\t\twidth = window.innerWidth || 2;\n\t\t\theight = window.innerHeight || 2;\n\n\t\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 0.1, 1000);\n\n\t\t\tforwardRenderer.screenRenderTarget.resize(width * window.devicePixelRatio, height * window.devicePixelRatio);\n\n\t\t\tcanvas.style.width = width + 'px';\n\t\t\tcanvas.style.height = height + 'px';\n\t\t}\n\t\twindow.addEventListener('resize', onWindowResize, false);\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "examples/material_shader_shadow.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>t3d - shadow material</title>\n\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n\t<link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n</head>\n<body>\n    <div id=\"info\" class=\"dark\">\n        <a href=\"\" target=\"_blank\">t3d</a> - shadow material\n    </div>\n\n\t<script src=\"./libs/nanobar.js\"></script>\n\n\t<!-- Import maps polyfill -->\n    <!-- Remove this when import maps will be widely supported -->\n    <script async src=\"./libs/es-module-shims.js\"></script>\n\n    <script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n    <script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { GLTFLoader } from 't3d/addons/loaders/glTF/GLTFLoader.js';\n\t\timport { OrbitControls } from 't3d/addons/controls/OrbitControls.js';\n\t\timport { DirectionalLightHelper } from 't3d/addons/objects/DirectionalLightHelper.js';\n\t\timport { PointLightHelper } from 't3d/addons/objects/PointLightHelper.js';\n\t\timport { ShadowShader } from 't3d/addons/shaders/ShadowShader.js';\n\t\timport { ForwardRenderer } from 't3d/addons/render/ForwardRenderer.js';\n\t\timport { GUI } from './libs/lil-gui.esm.min.js';\n\n\t\tlet width = window.innerWidth || 2;\n\t\tlet height = window.innerHeight || 2;\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = width;\n\t\tcanvas.height = height;\n\t\tdocument.body.appendChild(canvas);\n\n\t\tconst forwardRenderer = new ForwardRenderer(canvas);\n\t\tforwardRenderer.screenRenderTarget.setColorClearValue(0.8, 0.8, 0.8, 1);\n\t\tforwardRenderer.shadowAutoUpdate = false;\n\n\t\tconst scene = new t3d.Scene();\n\n\t\tconst camera = new t3d.Camera();\n\t\tcamera.outputEncoding = t3d.TEXEL_ENCODING_TYPE.SRGB;\n\t\tcamera.position.set(0, 5, 15);\n\t\tcamera.lookAt(new t3d.Vector3(0, 0, 0), new t3d.Vector3(0, 1, 0));\n\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 1000);\n\t\tscene.add(camera);\n\n\t\tconst controller = new OrbitControls(camera, canvas);\n\n\t\tconst nanobar = new Nanobar();\n\t\tnanobar.el.style.background = 'gray';\n\n\t\tconst loadingManager = new t3d.LoadingManager(function() {\n\t\t\tnanobar.go(100);\n\t\t\tnanobar.el.style.background = 'transparent';\n\t\t}, function(url, itemsLoaded, itemsTotal) {\n\t\t\tif (itemsLoaded < itemsTotal) {\n\t\t\t\tnanobar.go(itemsLoaded / itemsTotal * 100);\n\t\t\t}\n\t\t});\n\n\t\tconst loader = new GLTFLoader(loadingManager);\n\t\tloader.load('resources/models/gltf/suzanne/suzanne.gltf').then(function(result) {\n\t\t\tconst object = result.root.children[0];\n\t\t\tobject.castShadow = true;\n\t\t\tscene.add(object);\n\n\t\t\tforwardRenderer.shadowNeedsUpdate = true;\n\t\t});\n\n\t\tconst plane_geometry = new t3d.PlaneGeometry(100, 100);\n\t\tconst shadowMaterial = new t3d.ShaderMaterial(ShadowShader);\n\t\tshadowMaterial.transparent = true;\n\t\tshadowMaterial.opacity = 0.5;\n\t\tshadowMaterial.acceptLight = true;\n\t\tshadowMaterial.diffuse.setHex(0x000000);\n\t\tconst plane = new t3d.Mesh(plane_geometry, shadowMaterial);\n\t\tplane.position.y = -1;\n\t\tplane.receiveShadow = true;\n\t\tscene.add(plane);\n\n\t\tconst ambientLight = new t3d.AmbientLight(0xffffff, 0);\n\t\tscene.add(ambientLight);\n\n\t\tconst directionalLight = new t3d.DirectionalLight(0xffffff, 0.7);\n\t\tdirectionalLight.position.set(-3, 3, 3);\n\t\tdirectionalLight.lookAt(new t3d.Vector3(), new t3d.Vector3(0, 1, 0));\n\t\tdirectionalLight.shadow.windowSize = 10;\n\t\tdirectionalLight.shadow.cameraFar = 20;\n\t\tdirectionalLight.castShadow = true;\n\t\tscene.add(directionalLight);\n\n\t\tconst directionalLightHelper = new DirectionalLightHelper(directionalLight, 0.5);\n\t\tdirectionalLight.add(directionalLightHelper);\n\n\t\tconst pointLight = new t3d.PointLight(0xffffff, 1, 20);\n\t\tpointLight.position.set(3, 3, 3);\n\t\tpointLight.castShadow = true;\n\t\tpointLight.shadow.cameraFar = 20;\n\t\tscene.add(pointLight);\n\n\t\tconst pointLightHelper = new PointLightHelper(pointLight, 0.5);\n\t\tpointLight.add(pointLightHelper);\n\n\t\tconst gui = new GUI();\n\t\tgui.add(shadowMaterial, 'opacity', 0, 1).name('Shadow Intensity');\n\n\t\tfunction loop(count) {\n\t\t\trequestAnimationFrame(loop);\n\n\t\t\tcontroller.update();\n\n\t\t\tdirectionalLightHelper.update();\n\n\t\t\tforwardRenderer.render(scene, camera);\n\t\t}\n\t\trequestAnimationFrame(loop);\n\n\t\tfunction onWindowResize() {\n\t\t\twidth = window.innerWidth || 2;\n\t\t\theight = window.innerHeight || 2;\n\n\t\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 1000);\n\n\t\t\tforwardRenderer.screenRenderTarget.resize(width, height);\n\t\t}\n\t\twindow.addEventListener('resize', onWindowResize, false);\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "examples/material_shader_sky.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>t3d - shader sky</title>\n\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n\t<link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n</head>\n<body>\n    <div id=\"info\">\n        <a href=\"\" target=\"_blank\">t3d</a> - shader sky\n    </div>\n\n\t<!-- Import maps polyfill -->\n    <!-- Remove this when import maps will be widely supported -->\n    <script async src=\"./libs/es-module-shims.js\"></script>\n\n    <script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n    <script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { OrbitControls } from 't3d/addons/controls/OrbitControls.js';\n\t\timport { Sky } from 't3d/addons/objects/Sky.js';\n\t\timport { GridHelper } from 't3d/addons/objects/GridHelper.js';\n\t\timport { ForwardRenderer } from 't3d/addons/render/ForwardRenderer.js';\n\t\timport { GUI } from './libs/lil-gui.esm.min.js';\n\n\t\tlet width = window.innerWidth || 2;\n\t\tlet height = window.innerHeight || 2;\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = width;\n\t\tcanvas.height = height;\n\t\tdocument.body.appendChild(canvas);\n\n\t\tconst forwardRenderer = new ForwardRenderer(canvas);\n\n\t\tconst scene = new t3d.Scene();\n\n\t\tconst grid = new GridHelper(100, 10, 0x85a4d7, 0xffffff);\n\t\tgrid.position.y = -10;\n\t\tscene.add(grid);\n\t\t\n\t\tconst sunSphere = new t3d.Mesh(\n\t\t\tnew t3d.SphereGeometry(20000, 16, 8),\n\t\t\tnew t3d.BasicMaterial()\n\t\t);\n\t\tsunSphere.material.diffuse.setRGB(1, 1, 1);\n\t\tsunSphere.position.y = -700000;\n\n\t\tconst sky = new Sky();\n\t\tscene.add(sky);\n\n\t\tconst camera = new t3d.Camera();\n\t\tcamera.position.set(0, 0, 100);\n\t\tcamera.setPerspective(60 / 180 * Math.PI, width / height, 1, 10000);\n\t\tscene.add(camera);\n\n\t\t// add a hover controller\n\t\tconst controller = new OrbitControls(camera, canvas);\n\t\t\n\t\t// GUI\n\n\t\tconst effectController = {\n\t\t\tturbidity: 10,\n\t\t\trayleigh: 2,\n\t\t\tmieCoefficient: 0.005,\n\t\t\tmieDirectionalG: 0.8,\n\t\t\tluminance: 1,\n\t\t\tinclination: 0.49, // elevation / inclination\n\t\t\tazimuth: 0.25, // Facing front,\n\t\t\tsun: !true\n\t\t};\n\n\t\tconst distance = 400000;\n\n\t\tfunction guiChanged() {\n\t\t\tconst uniforms = sky.material.uniforms;\n\t\t\tuniforms.turbidity = effectController.turbidity;\n\t\t\tuniforms.rayleigh = effectController.rayleigh;\n\t\t\tuniforms.luminance = effectController.luminance;\n\t\t\tuniforms.mieCoefficient = effectController.mieCoefficient;\n\t\t\tuniforms.mieDirectionalG = effectController.mieDirectionalG;\n\n\t\t\tconst theta = Math.PI * (effectController.inclination - 0.5);\n\t\t\tconst phi = 2 * Math.PI * (effectController.azimuth - 0.5);\n\n\t\t\tsunSphere.position.x = distance * Math.cos(phi);\n\t\t\tsunSphere.position.y = distance * Math.sin(phi) * Math.sin(theta);\n\t\t\tsunSphere.position.z = distance * Math.sin(phi) * Math.cos(theta);\n\n\t\t\tscene.remove(sunSphere);\n\t\t\teffectController.sun && scene.add(sunSphere);\n\n\t\t\tuniforms.sunPosition[0] = distance * Math.cos(phi);\n\t\t\tuniforms.sunPosition[1] = distance * Math.sin(phi) * Math.sin(theta);\n\t\t\tuniforms.sunPosition[2] = distance * Math.sin(phi) * Math.cos(theta);\n\t\t}\n\n\t\tconst gui = new GUI();\n\n\t\tgui.add(effectController, 'turbidity', 1.0, 20.0, 0.1).onChange(guiChanged);\n\t\tgui.add(effectController, 'rayleigh', 0.0, 4, 0.001).onChange(guiChanged);\n\t\tgui.add(effectController, 'mieCoefficient', 0.0, 0.1, 0.001).onChange(guiChanged);\n\t\tgui.add(effectController, 'mieDirectionalG', 0.0, 1, 0.001).onChange(guiChanged);\n\t\tgui.add(effectController, 'luminance', 0.0, 2).onChange(guiChanged);\n\t\tgui.add(effectController, 'inclination', 0, 1, 0.0001).onChange(guiChanged);\n\t\tgui.add(effectController, 'azimuth', 0, 1, 0.0001).onChange(guiChanged);\n\t\tgui.add(effectController, 'sun').onChange(guiChanged);\n\n\t\tguiChanged();\n\n\t\tfunction loop(count) {\n\t\t\trequestAnimationFrame(loop);\n\n\t\t\tcontroller.update();\n\n\t\t\tforwardRenderer.render(scene, camera);\n\t\t}\n\n\t\trequestAnimationFrame(loop);\n\n\t\tfunction onWindowResize() {\n\t\t\twidth = window.innerWidth || 2;\n\t\t\theight = window.innerHeight || 2;\n\n\t\t\tcamera.setPerspective(60 / 180 * Math.PI, width / height, 1, 10000);\n\n\t\t\tforwardRenderer.screenRenderTarget.resize(width, height);\n\t\t}\n\t\twindow.addEventListener('resize', onWindowResize, false);\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "examples/material_shader_sky2.html",
    "content": "<!DOCTYPE html>\n<html>\n\n<head>\n    <meta charset=\"utf-8\">\n    <title>t3d - skybox</title>\n    <meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n    <link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n</head>\n\n<body>\n    <div id=\"info\">\n        <a href=\"\" target=\"_blank\">t3d</a> - skybox\n    </div>\n\n    <!-- Import maps polyfill -->\n    <!-- Remove this when import maps will be widely supported -->\n    <script async src=\"./libs/es-module-shims.js\"></script>\n\n    <script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n    <script type=\"module\">\n        import * as t3d from 't3d';\n        import { GUI } from './libs/lil-gui.esm.min.js';\n        import { OrbitControls } from 't3d/addons/controls/OrbitControls.js';\n\n        import { SkyBox } from 't3d/addons/objects/SkyBox.js';\n        import { ForwardRenderer } from 't3d/addons/render/ForwardRenderer.js';\n        import { SkyShader } from 't3d/addons/shaders/SkyShader.js';\n\n        let width = window.innerWidth || 2;\n        let height = window.innerHeight || 2;\n\n        const canvas = document.createElement('canvas');\n        canvas.width = width;\n        canvas.height = height;\n        document.body.appendChild(canvas);\n\n        const forwardRenderer = new ForwardRenderer(canvas);\n\n        const scene = new t3d.Scene();\n\n        const camera = new t3d.Camera();\n        camera.setPerspective(60 / 180 * Math.PI, width / height, 1, 1000);\n        camera.position.set(-10, 0, 0);\n        scene.add(camera);\n\n        const skyBox = new SkyBox(forwardRenderer.texture);\n        scene.add(skyBox);\n\n        const controller = new OrbitControls(camera, canvas);\n\n        const tempRenderTarget = t3d.OffscreenRenderTarget.create2D(512, 256);\n        tempRenderTarget.texture.minFilter = t3d.TEXTURE_FILTER.LINEAR;\n        tempRenderTarget.texture.magFilter = t3d.TEXTURE_FILTER.LINEAR;\n        tempRenderTarget.texture.generateMipmaps = false;\n\n        const skyPass = new t3d.ShaderPostPass(SkyShader);\n\n        skyBox.texture = tempRenderTarget.texture;\n\n        const params = { sunHorizontal: 0, sunVertical: 10 };\n\n        function setSunDirection() {\n        \tskyPass.material.uniforms.sunU = params.sunHorizontal / 180;\n        \tskyPass.material.uniforms.sunV = params.sunVertical / 180 + 0.5;\n        }\n        setSunDirection();\n\n        const gui = new GUI();\n        gui.add(params, 'sunHorizontal', 0, 360, 0.1).onChange(setSunDirection);\n        gui.add(params, 'sunVertical', -90, 90, 0.1).onChange(setSunDirection);\n        gui.add(skyPass.material.uniforms, 'eyePos', 0.0, 10000, 1);\n        gui.add(skyPass.material.uniforms, 'sunRadiance', 0, 50, 1);\n        gui.add(skyPass.material.uniforms, 'mieG', 0, 1, 0.01);\n        gui.add(skyPass.material.uniforms, 'mieHeight', 0, 10000, 1);\n        gui.add(skyPass.material.defines, 'DISPLAY_SUN').onChange(() => skyPass.material.needsUpdate = true);\n        gui.add(skyPass.material.uniforms, 'sunRadius', 0.0, 1000, 1);\n        gui.add(skyPass.material.uniforms, 'sunBrightness', 0, 2, 0.1);\n\n        function loop(count) {\n        \trequestAnimationFrame(loop);\n\n        \tcontroller.update();\n\n        \tskyPass.render(forwardRenderer, tempRenderTarget);\n        \n        \tforwardRenderer.render(scene, camera);\n        }\n\n        requestAnimationFrame(loop);\n\n        function onWindowResize() {\n        \twidth = window.innerWidth || 2;\n        \theight = window.innerHeight || 2;\n\n        \tcamera.setPerspective(60 / 180 * Math.PI, width / height, 1, 1000);\n\n        \tforwardRenderer.screenRenderTarget.resize(width, height);\n        }\n        window.addEventListener('resize', onWindowResize, false);\n    </script>\n</body>\n\n</html>"
  },
  {
    "path": "examples/material_shader_sky_gradient.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>t3d - gradient sky</title>\n\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n\t<link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n</head>\n<body>\n    <div id=\"info\">\n        <a href=\"\" target=\"_blank\">t3d</a> - shader gradient sky\n    </div>\n\n\t<!-- Import maps polyfill -->\n    <!-- Remove this when import maps will be widely supported -->\n    <script async src=\"./libs/es-module-shims.js\"></script>\n\n    <script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n    <script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { OrbitControls } from 't3d/addons/controls/OrbitControls.js';\n\t\timport { GradientSky } from 't3d/addons/objects/GradientSky.js';\n\t\timport { ForwardRenderer } from 't3d/addons/render/ForwardRenderer.js';\n\t\timport { GUI } from './libs/lil-gui.esm.min.js';\n\n\t\tlet width = window.innerWidth || 2;\n\t\tlet height = window.innerHeight || 2;\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = width;\n\t\tcanvas.height = height;\n\t\tdocument.body.appendChild(canvas);\n\n\t\tconst forwardRenderer = new ForwardRenderer(canvas);\n\n\t\tconst scene = new t3d.Scene();\n\n\t\tconst sky = new GradientSky();\n\t\tscene.add(sky);\n\n\t\tconst camera = new t3d.Camera();\n\t\tcamera.position.set(0, 0, 100);\n\t\tcamera.setPerspective(60 / 180 * Math.PI, width / height, 1, 1000);\n\t\tscene.add(camera);\n\n\t\tconst controller = new OrbitControls(camera, canvas);\n\t\t\n\t\t// GUI\n\n\t\tconst gui = new GUI();\n\n\t\tgui.addColor(sky.material.uniforms, 'topColor');\n\t\tgui.addColor(sky.material.uniforms, 'middleColor');\n\t\tgui.addColor(sky.material.uniforms, 'bottomColor');\n\t\tgui.add(sky.material.uniforms, 'diffusion', 0, 3);\n\n\t\tfunction loop(count) {\n\t\t\trequestAnimationFrame(loop);\n\n\t\t\tcontroller.update();\n\n\t\t\tforwardRenderer.render(scene, camera);\n\t\t}\n\n\t\trequestAnimationFrame(loop);\n\n\t\tfunction onWindowResize() {\n\t\t\twidth = window.innerWidth || 2;\n\t\t\theight = window.innerHeight || 2;\n\n\t\t\tcamera.setPerspective(60 / 180 * Math.PI, width / height, 1, 1000);\n\n\t\t\tforwardRenderer.screenRenderTarget.resize(width, height);\n\t\t}\n\t\twindow.addEventListener('resize', onWindowResize, false);\n\t</script>\n</body>\n</html>\n"
  },
  {
    "path": "examples/material_shader_skybox.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>t3d - skybox</title>\n\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n\t<link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n</head>\n<body>\n    <div id=\"info\">\n        <a href=\"\" target=\"_blank\">t3d</a> - skybox\n    </div>\n\n\t<!-- Import maps polyfill -->\n    <!-- Remove this when import maps will be widely supported -->\n    <script async src=\"./libs/es-module-shims.js\"></script>\n\n    <script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n    <script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { GUI } from './libs/lil-gui.esm.min.js';\n\t\timport { SkyBox } from 't3d/addons/objects/SkyBox.js';\n\t\timport { ForwardRenderer } from 't3d/addons/render/ForwardRenderer.js';\n\t\timport { TextureCubeLoader } from 't3d/addons/loaders/TextureCubeLoader.js';\n\n\t\tlet width = window.innerWidth || 2;\n\t\tlet height = window.innerHeight || 2;\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = width;\n\t\tcanvas.height = height;\n\t\tdocument.body.appendChild(canvas);\n\n\t\tconst forwardRenderer = new ForwardRenderer(canvas);\n\n\t\tconst scene = new t3d.Scene();\n\n\t\tconst cubeTexturePath = './resources/skybox/sunset/';\n\t\tconst cubeTexture = new TextureCubeLoader().load([\n\t\t\tcubeTexturePath + 'px.jpg',\n\t\t\tcubeTexturePath + 'nx.jpg',\n\t\t\tcubeTexturePath + 'py.jpg',\n\t\t\tcubeTexturePath + 'ny.jpg',\n\t\t\tcubeTexturePath + 'pz.jpg',\n\t\t\tcubeTexturePath + 'nz.jpg'\n\t\t]);\n\t\tconst skyBox = new SkyBox(cubeTexture);\n\t\tscene.add(skyBox);\n\n\t\tconst camera = new t3d.Camera();\n\t\tcamera.setPerspective(60 / 180 * Math.PI, width / height, 1, 1000);\n\t\tscene.add(camera);\n\t\t\n\t\tconst gui = new GUI();\n\t\tgui.add({ version: 'WebGL ' + forwardRenderer.capabilities.version }, 'version').disable();\n\t\tgui.add(skyBox, 'level', 0, 8, 1);\n\n\t\tfunction loop(count) {\n\t\t\trequestAnimationFrame(loop);\n\n\t\t\t// rotate camera\n\t\t\tcamera.euler.y = count / 1000 * 0.2;\n\n\t\t\tforwardRenderer.render(scene, camera);\n\t\t}\n\n\t\trequestAnimationFrame(loop);\n\n\t\tfunction onWindowResize() {\n\t\t\twidth = window.innerWidth || 2;\n\t\t\theight = window.innerHeight || 2;\n\n\t\t\tcamera.setPerspective(60 / 180 * Math.PI, width / height, 1, 1000);\n\n\t\t\tforwardRenderer.screenRenderTarget.resize(width, height);\n\t\t}\n\t\twindow.addEventListener('resize', onWindowResize, false);\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "examples/material_shader_skybox_filter.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>t3d - skybox filter</title>\n\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n\t<link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n<body>\n    <div id=\"info\">\n        <a href=\"\" target=\"_blank\">t3d</a> - skybox filter\n    </div>\n\n\t<!-- Import maps polyfill -->\n    <!-- Remove this when import maps will be widely supported -->\n    <script async src=\"./libs/es-module-shims.js\"></script>\n\n    <script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n    <script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { SkyBox } from 't3d/addons/objects/SkyBox.js';\n\t\timport { PMREMGenerator } from 't3d/addons/textures/PMREMGenerator.js';\n\t\timport { ForwardRenderer } from 't3d/addons/render/ForwardRenderer.js';\n\t\timport { TextureCubeLoader } from 't3d/addons/loaders/TextureCubeLoader.js';\n\t\timport { GUI } from './libs/lil-gui.esm.min.js';\n\n\t\tlet width = window.innerWidth || 2;\n\t\tlet height = window.innerHeight || 2;\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = width;\n\t\tcanvas.height = height;\n\t\tdocument.body.appendChild(canvas);\n\n\t\tconst forwardRenderer = new ForwardRenderer(canvas);\n\n\t\tconst scene = new t3d.Scene();\n\n\t\tconst cubeTexturePath = './resources/skybox/sunset/';\n\t\tlet cube_texture = new TextureCubeLoader().load([\n\t\t\tcubeTexturePath + 'px.jpg',\n\t\t\tcubeTexturePath + 'nx.jpg',\n\t\t\tcubeTexturePath + 'py.jpg',\n\t\t\tcubeTexturePath + 'ny.jpg',\n\t\t\tcubeTexturePath + 'pz.jpg',\n\t\t\tcubeTexturePath + 'nz.jpg'\n\t\t], function() {\n\t\t\tcube_texture = (new PMREMGenerator()).prefilter(forwardRenderer, cube_texture);\n\t\t\n\t\t\tconst skyBox = new SkyBox(cube_texture);\n\t\t\tscene.add(skyBox);\n\n\t\t\tconst gui = new GUI();\n\t\t\tgui.add({ version: 'WebGL ' + forwardRenderer.capabilities.version }, 'version').disable();\n\t\t\tgui.add(skyBox, 'level', 0, 8, 1);\n\t\t});\n\n\t\tconst camera = new t3d.Camera();\n\t\tcamera.setPerspective(60 / 180 * Math.PI, width / height, 1, 1000);\n\t\tscene.add(camera);\n\n\t\tfunction loop(count) {\n\t\t\trequestAnimationFrame(loop);\n\n\t\t\t// rotate camera\n\t\t\tcamera.euler.y = count / 1000 * 0.2;\n\n\t\t\tforwardRenderer.render(scene, camera);\n\t\t}\n\t\trequestAnimationFrame(loop);\n\n\t\tfunction onWindowResize() {\n\t\t\twidth = window.innerWidth || 2;\n\t\t\theight = window.innerHeight || 2;\n\n\t\t\tcamera.setPerspective(60 / 180 * Math.PI, width / height, 1, 1000);\n\n\t\t\tforwardRenderer.screenRenderTarget.resize(width, height);\n\t\t}\n\t\twindow.addEventListener('resize', onWindowResize, false);\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "examples/material_shader_skybox_groundprojected.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>t3d - ground projected skybox</title>\n\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n\t<link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n</head>\n<body>\n    <div id=\"info\" class=\"dark\">\n        <a href=\"\" target=\"_blank\">t3d</a> - ground projected skybox\n    </div>\n\n\t<!-- Import maps polyfill -->\n    <!-- Remove this when import maps will be widely supported -->\n    <script async src=\"./libs/es-module-shims.js\"></script>\n\n    <script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n    <script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { RGBELoader } from 't3d/addons/loaders/RGBELoader.js';\n\t\timport { GLTFLoader } from 't3d/addons/loaders/glTF/GLTFLoader.js';\n\t\timport { DRACOLoader } from 't3d/addons/loaders/DRACOLoader.js';\n\t\timport { Texture2DLoader } from 't3d/addons/loaders/Texture2DLoader.js';\n\t\timport { OrbitControls } from 't3d/addons/controls/OrbitControls.js';\n\t\timport { PMREMGenerator } from 't3d/addons/textures/PMREMGenerator.js';\n\t\timport { ForwardRenderer } from 't3d/addons/render/ForwardRenderer.js';\n\t\timport { GroundProjectedSkyboxShader } from 't3d/addons/shaders/GroundProjectedSkyboxShader.js';\n\t\timport { GUI } from './libs/lil-gui.esm.min.js';\n\n\t\tlet width = window.innerWidth || 2;\n\t\tlet height = window.innerHeight || 2;\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = width;\n\t\tcanvas.height = height;\n\t\tdocument.body.appendChild(canvas);\n\n\t\tconst forwardRenderer = new ForwardRenderer(canvas);\n\n\t\tconst scene = new t3d.Scene();\n\n\t\tconst bodyMaterial = new t3d.PBRMaterial();\n\t\tbodyMaterial.diffuse.setHex(0x000000);\n\t\tbodyMaterial.metalness = 1.0;\n\t\tbodyMaterial.roughness = 0.8;\n\t\tbodyMaterial.clearcoat = 1.0,\n\t\tbodyMaterial.clearcoatRoughness = 0.0;\n\n\t\tconst detailsMaterial = new t3d.PBRMaterial();\n\t\tdetailsMaterial.diffuse.setHex(0xffffff);\n\t\tdetailsMaterial.metalness = 1.0;\n\t\tdetailsMaterial.roughness = 0.5;\n\n\t\tconst glassMaterial = new t3d.PBRMaterial();\n\t\tglassMaterial.transparent = true;\n\t\tglassMaterial.opacity = 0.5;\n\t\tglassMaterial.diffuse.setHex(0xffffff);\n\t\tglassMaterial.metalness = 0.25;\n\t\tglassMaterial.roughness = 0;\n\n\t\tconst shadow = new Texture2DLoader().load('./resources/models/gltf/ferrari/ferrari_ao.png');\n\t\tconst shadowMaterial = new t3d.BasicMaterial();\n\t\tshadowMaterial.transparent = true;\n\t\tshadowMaterial.diffuseMap = shadow;\n\t\tshadowMaterial.blending = t3d.BLEND_TYPE.MUL;\n\t\tshadowMaterial.envMap = undefined;\n\n\t\tconst dracoLoader = new DRACOLoader();\n\t\tdracoLoader.setDecoderPath('libs/draco/');\n\t\tconst gltfloader = new GLTFLoader();\n\t\tgltfloader.setDRACOLoader(dracoLoader);\n\n\t\tgltfloader.load(\n\t\t\t'./resources/models/gltf/ferrari/ferrari.glb'\n\t\t).then(function(result) {\n\t\t\tconst object = result.root;\n\n\t\t\tobject.getObjectByName('body').material = bodyMaterial;\n\n\t\t\tobject.getObjectByName('rim_fl').material = detailsMaterial;\n\t\t\tobject.getObjectByName('rim_fr').material = detailsMaterial;\n\t\t\tobject.getObjectByName('rim_rr').material = detailsMaterial;\n\t\t\tobject.getObjectByName('rim_rl').material = detailsMaterial;\n\t\t\tobject.getObjectByName('trim').material = detailsMaterial;\n\n\t\t\tobject.getObjectByName('glass').material = glassMaterial;\n\n\t\t\tobject.scale.multiplyScalar(4);\n\n\t\t\tconst mesh = new t3d.Mesh(\n\t\t\t\tnew t3d.PlaneGeometry(0.655 * 4, 1.3 * 4),\n\t\t\t\tshadowMaterial\n\t\t\t);\n\t\t\tobject.add(mesh);\n\n\t\t\tscene.add(object);\n\t\t});\n\n\t\tnew RGBELoader().load('resources/hdr/blouberg_sunrise_2_1k.hdr', function(textureData) {\n\t\t\tlet texture = new t3d.Texture2D();\n\t\t\ttexture.image = { data: textureData.data, width: textureData.width, height: textureData.height };\n\t\t\ttexture.version++;\n\t\t\n\t\t\ttexture.type = textureData.type;\n\t\t\ttexture.format = textureData.format;\n\n\t\t\ttexture.magFilter = textureData.magFilter;\n\t\t\ttexture.minFilter = textureData.minFilter;\n\t\t\ttexture.flipY = textureData.flipY;\n\t\t\ttexture.generateMipmaps = textureData.generateMipmaps;\n\n\t\t\ttexture = (new PMREMGenerator()).prefilter(forwardRenderer, texture);\n\n\t\t\tconst geometry = new t3d.BoxGeometry(1, 1, 1);\n\t\t\tconst material = new t3d.ShaderMaterial(GroundProjectedSkyboxShader);\n\t\t\tmaterial.side = t3d.DRAW_SIDE.BACK;\n\t\t\tmaterial.defines.PANORAMA = false;\n\t\t\tmaterial.defines.GAMMA = true;\n\t\t\tmaterial.cubeMap = texture;\n\t\t\tmaterial.uniforms.height = 20;\n\t\t\tmaterial.uniforms.radius = 440;\n\t\t\tconst skyBox = new t3d.Mesh(geometry, material);\n\t\t\tskyBox.frustumCulled = false;\n\t\t\tscene.add(skyBox);\n\n\t\t\tscene.environment = texture;\n\n\t\t\tconst gui = new GUI();\n\t\t\tgui.add(material.uniforms, 'height', 10, 50);\n\t\t\tgui.add(material.uniforms, 'radius', 200, 600);\n\t\t});\n\n\t\tconst light = new t3d.DirectionalLight(0xffffff, 0.2);\n\t\tlight.position.set(5, 5, 5);\n\t\tscene.add(light);\n\n\t\tconst camera = new t3d.Camera();\n\t\tcamera.outputEncoding = t3d.TEXEL_ENCODING_TYPE.SRGB;\n\t\tcamera.position.set(20, 7, -20);\n\t\tcamera.setPerspective(40 / 180 * Math.PI, width / height, 1, 1000);\n\t\tscene.add(camera);\n\n\t\tconst controller = new OrbitControls(camera, canvas);\n\t\tcontroller.target.set(0, 2, 0);\n\t\tcontroller.maxPolarAngle = Math.PI / 2;\n\t\tcontroller.maxDistance = 80;\n\t\tcontroller.minDistance = 20;\n\t\tcontroller.enablePan = false;\n\n\t\tfunction loop(count) {\n\t\t\trequestAnimationFrame(loop);\n\n\t\t\tcontroller.update();\n\n\t\t\tforwardRenderer.render(scene, camera);\n\t\t}\n\t\trequestAnimationFrame(loop);\n\n\t\tfunction onWindowResize() {\n\t\t\twidth = window.innerWidth || 2;\n\t\t\theight = window.innerHeight || 2;\n\n\t\t\tcamera.setPerspective(40 / 180 * Math.PI, width / height, 1, 1000);\n\n\t\t\tforwardRenderer.screenRenderTarget.resize(width, height);\n\t\t}\n\t\twindow.addEventListener('resize', onWindowResize, false);\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "examples/material_shader_volume.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>t3d - volume</title>\n\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n\t<link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n</head>\n<body>\n    <div id=\"info\">\n\t\t<a href=\"\" target=\"_blank\">t3d</a> - volume\n\t</div>\n\n\t<script src=\"./libs/simplex-noise.js\"></script>\n\n\t<!-- Import maps polyfill -->\n    <!-- Remove this when import maps will be widely supported -->\n    <script async src=\"./libs/es-module-shims.js\"></script>\n\n    <script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n    <script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { OrbitControls } from 't3d/addons/controls/OrbitControls.js';\n\t\timport { VolumeShader } from 't3d/addons/shaders/VolumeShader.js';\n\t\timport { ForwardRenderer } from 't3d/addons/render/ForwardRenderer.js';\n\t\timport { Texture2DLoader } from 't3d/addons/loaders/Texture2DLoader.js';\n\t\timport { GUI } from './libs/lil-gui.esm.min.js';\n\n\t\tlet width = window.innerWidth || 2;\n\t\tlet height = window.innerHeight || 2;\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = width;\n\t\tcanvas.height = height;\n\t\tdocument.body.appendChild(canvas);\n\n\t\tconst forwardRenderer = new ForwardRenderer(canvas);\n\n\t\tconst scene = new t3d.Scene();\n\t\t\n\t\tconst SIZE = 128;\n\t\tconst simplex = new SimplexNoise(Math.random);\n\t\tconst scale = 0.02;\n\n\t\tconst src = new Uint8Array(SIZE * SIZE * SIZE);\n\t\tfor (let k = 0; k < SIZE; k += 1) {\n\t\t\tfor (let j = 0; j < SIZE; j += 1) {\n\t\t\t\tfor (let i = 0; i < SIZE; i += 1) {\n\t\t\t\t\tif (k > 0.2 * SIZE && i < 0.8 * SIZE && i > 0.2 * SIZE && k < 0.8 * SIZE) {\n\t\t\t\t\t\tsrc[i + j * SIZE + k * SIZE * SIZE] = 0;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tsrc[i + j * SIZE + k * SIZE * SIZE] = Math.abs(simplex.noise3D(i * scale, j * scale, k * scale)) * 255;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst texture3d = new t3d.Texture3D();\n\t\ttexture3d.image = {\n\t\t\tdata: src,\n\t\t\twidth: SIZE,\n\t\t\theight: SIZE,\n\t\t\tdepth: SIZE\n\t\t};\n\n\t\tconst geometry = new t3d.BoxGeometry(1, 1, 1);\n\n\t\tconst invTransform = new t3d.Matrix4();\n\n\t\tconst shaderMaterial = new t3d.ShaderMaterial(VolumeShader);\n\t\tshaderMaterial.transparent = true;\n\t\tshaderMaterial.premultipliedAlpha = true;\n\t\tshaderMaterial.uniforms.densityTexture = texture3d;\n\t\tshaderMaterial.uniforms.platteTexture = new Texture2DLoader().load('./resources/platte.png');\n\t\tshaderMaterial.uniforms.uInvTransform = invTransform.elements;\n\t\tshaderMaterial.uniforms.uAlphaCorrection = 0.09;\n\n\t\tconst box = new t3d.Mesh(geometry, shaderMaterial);\n\t\tbox.scale.set(2, 2, 2);\n\t\tscene.add(box);\n\n\t\tconst camera = new t3d.Camera();\n\t\tcamera.position.set(3, 5.5, 3.5);\n\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 0.1, 100);\n\t\tscene.add(camera);\n\t\t\n\t\tconst controller = new OrbitControls(camera, canvas);\n\t\tcontroller.target.set(0, 0, 0);\n\t\tcontroller.enablePan = false;\n\t\tcontroller.rotateSpeed = 0.5;\n\n\t\t// gui\n\t\tconst gui = new GUI();\n\t\tgui.add({ version: 'WebGL ' + forwardRenderer.capabilities.version }, 'version').disable();\n\t\tgui.add(shaderMaterial.uniforms, 'uAlphaCorrection', 0, 0.1, 0.001);\n\n\t\tfunction loop(count) {\n\t\t\trequestAnimationFrame(loop);\n\t\t\n\t\t\tcontroller.update();\n\n\t\t\tinvTransform.copy(box.matrix).invert();\n\n\t\t\tforwardRenderer.render(scene, camera);\n\t\t}\n\t\trequestAnimationFrame(loop);\n\n\t\tfunction onWindowResize() {\n\t\t\twidth = window.innerWidth || 2;\n\t\t\theight = window.innerHeight || 2;\n\n\t\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 0.1, 100);\n\n\t\t\tforwardRenderer.screenRenderTarget.resize(width, height);\n\t\t}\n\t\twindow.addEventListener('resize', onWindowResize, false);\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "examples/material_shader_volume_layered.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>t3d - shader Layered Volume</title>\n\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n\t<link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n</head>\n<body>\n    <div id=\"info\">\n        <a href=\"\" target=\"_blank\">t3d</a> - shader Layered Volume\n    </div>\n\n\t<script src=\"./libs/nanobar.min.js\"></script>\n\t<script src=\"./libs/simplex-noise.js\"></script>\n\n\t<!-- Import maps polyfill -->\n    <!-- Remove this when import maps will be widely supported -->\n    <script async src=\"./libs/es-module-shims.js\"></script>\n\n    <script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n    <script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { OrbitControls } from 't3d/addons/controls/OrbitControls.js';\n\t\timport { ForwardRenderer } from 't3d/addons/render/ForwardRenderer.js';\n\t\timport { LayeredVolumeMesh } from 't3d/addons/objects/LayeredVolumeMesh.js';\n\t\timport { Texture2DLoader } from 't3d/addons/loaders/Texture2DLoader.js';\n\t\timport { GUI } from './libs/lil-gui.esm.min.js';\n\n\t\tlet width = window.innerWidth || 2;\n\t\tlet height = window.innerHeight || 2;\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = width;\n\t\tcanvas.height = height;\n\t\tdocument.body.appendChild(canvas);\n\n\t\tconst forwardRenderer = new ForwardRenderer(canvas);\n\n\t\tconst scene = new t3d.Scene();\n\n\t\tconst camera = new t3d.Camera();\n\t\tcamera.position.set(20, 20, 30);\n\t\tcamera.lookAt(new t3d.Vector3(0, 0, 0), new t3d.Vector3(0, 1, 0));\n\t\tcamera.setPerspective(30 / 180 * Math.PI, width / height, 0.1, 1000);\n\t\tscene.add(camera);\n\n\t\tconst controller = new OrbitControls(camera, canvas);\n\n\t\t// textures\n\n\t\tconst SIZE = 128;\n\t\tconst simplex = new SimplexNoise(Math.random);\n\t\tconst scale = 0.02;\n\t\tconst src = new Uint8Array(SIZE * SIZE * SIZE);\n\t\tfor (let k = 0; k < SIZE; k += 1) {\n\t\t\tfor (let j = 0; j < SIZE; j += 1) {\n\t\t\t\tfor (let i = 0; i < SIZE; i += 1) {\n\t\t\t\t\tsrc[i + j * SIZE + k * SIZE * SIZE] = Math.abs(simplex.noise3D(i * scale, j * scale, k * scale)) * 255;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst texture3d = new t3d.Texture3D();\n\t\ttexture3d.image = { data: src, width: SIZE, height: SIZE, depth: SIZE };\n\n\t\tconst platteTexture = new Texture2DLoader().load('./resources/platte.png');\n\n\t\t// volume mesh\n\n\t\tconst volumeMesh = new LayeredVolumeMesh({\n\t\t\twidth: 10,\n\t\t\theight: 10,\n\t\t\tdepth: 5,\n\t\t\tlayer: 50,\n\t\t\tdensityTexture: texture3d,\n\t\t\tplatteTexture: platteTexture,\n\t\t\tdiskSize: 0.018,\n\t\t\tdiskSpacing: 0.002\n\t\t});\n\t\tvolumeMesh.position.y = -2.5;\n\t\tscene.add(volumeMesh);\n\t\t\n\t\t// gui\n\n\t\tconst gui = new GUI();\n\t\tgui.add(volumeMesh.material, 'opacity', 0, 1, 0.01);\n\t\tgui.add(volumeMesh.material.uniforms, 'diskSize', 0.001, 0.05, 0.001);\n\t\tgui.add(volumeMesh.material.uniforms, 'diskSpacing', 0.001, 0.01, 0.001);\n\n\t\tfunction loop(count) {\n\t\t\trequestAnimationFrame(loop);\n\n\t\t\tcontroller.update();\n\n\t\t\tforwardRenderer.render(scene, camera);\n\t\t}\n\t\trequestAnimationFrame(loop);\n\n\t\tfunction onWindowResize() {\n\t\t\twidth = window.innerWidth || 2;\n\t\t\theight = window.innerHeight || 2;\n\n\t\t\tcamera.setPerspective(30 / 180 * Math.PI, width / height, 0.1, 1000);\n\n\t\t\tforwardRenderer.screenRenderTarget.resize(width, height);\n\t\t}\n\t\twindow.addEventListener('resize', onWindowResize, false);\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "examples/material_shader_water.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>t3d - shader water</title>\n\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n\t<link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n</head>\n<body>\n    <div id=\"info\">\n        <a href=\"\" target=\"_blank\">t3d</a> - shader water\n    </div>\n\n\t<!-- Import maps polyfill -->\n    <!-- Remove this when import maps will be widely supported -->\n    <script async src=\"./libs/es-module-shims.js\"></script>\n\n    <script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n    <script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { SkyBox } from 't3d/addons/objects/SkyBox.js';\n\t\timport { WaterShader } from 't3d/addons/shaders/WaterShader.js';\n\t\timport { OrbitControls } from 't3d/addons/controls/OrbitControls.js';\n\t\timport { ForwardRenderer } from 't3d/addons/render/ForwardRenderer.js';\n\t\timport { Texture2DLoader } from 't3d/addons/loaders/Texture2DLoader.js';\n\t\timport { TextureCubeLoader } from 't3d/addons/loaders/TextureCubeLoader.js';\n\t\timport { GUI } from './libs/lil-gui.esm.min.js';\n\t\timport Stats from './libs/stats.module.js';\n\n\t\tlet width = window.innerWidth || 2;\n\t\tlet height = window.innerHeight || 2;\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = width;\n\t\tcanvas.height = height;\n\t\tdocument.body.appendChild(canvas);\n\n\t\t// stats\n\t\tconst stats = new Stats();\n\t\tstats.showPanel(0);\n\t\tdocument.body.appendChild(stats.dom);\n\n\t\tconst renderer = new ForwardRenderer(canvas);\n\n\t\tconst scene = new t3d.Scene();\n\t\tconst fog = new t3d.Fog(0x304847, 500, 2000);\n\t\tconst fogExp2 = new t3d.FogExp2(0x304847, 0.0006);\n\t\tscene.fog = fogExp2;\n\n\t\t// skybox\n\t\tconst cubeTexturePath = './resources/skybox/Bridge2/';\n\t\tconst cubeTexture = new TextureCubeLoader().load([\n\t\t\tcubeTexturePath + 'posx.jpg',\n\t\t\tcubeTexturePath + 'negx.jpg',\n\t\t\tcubeTexturePath + 'posy.jpg',\n\t\t\tcubeTexturePath + 'negy.jpg',\n\t\t\tcubeTexturePath + 'posz.jpg',\n\t\t\tcubeTexturePath + 'negz.jpg'\n\t\t]);\n\t\tconst skyBox = new SkyBox(cubeTexture);\n\t\tscene.add(skyBox);\n\n\t\tconst camera = new t3d.Camera();\n\t\tcamera.position.set(0, 150, 350);\n\t\tcamera.lookAt(new t3d.Vector3(-0, 0, 0), new t3d.Vector3(0, 1, 0));\n\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 0.1, 3000);\n\t\tscene.add(camera);\n\n\t\tconst controller = new OrbitControls(camera, canvas);\n\t\tcontroller.target.set(0, 0, 0);\n\t\tcontroller.maxDistance = 900;\n\t\tcontroller.enablePan = false;\n\t\tcontroller.maxPolarAngle = Math.PI / 2 - 0.001;\n\n\t\tconst texture = new Texture2DLoader().load('./resources/waternormals.jpg');\n\t\ttexture.wrapS = texture.wrapT = t3d.TEXTURE_WRAP.REPEAT;\n\n\t\tconst waterMaterial = new t3d.ShaderMaterial(WaterShader);\n\t\twaterMaterial.transparent = true;\n\t\tconst uniforms = waterMaterial.uniforms;\n\t\tuniforms.envMap = cubeTexture;\n\t\tuniforms.normalMap = texture;\n\t\tconst waterGeometry = new t3d.PlaneGeometry(3000, 3000);\n\t\tconst uvArray = waterGeometry.getAttribute('a_Uv').buffer.array;\n\t\tfor (let i = 0; i < uvArray.length; i++) {\n\t\t\tuvArray[i] *= 3000;\n\t\t}\n\t\tconst water = new t3d.Mesh(waterGeometry, waterMaterial);\n\t\twater.position.set(-0, 0, 0);\n\t\tscene.add(water);\n\n\t\t// gui\n\n\t\tconst params = { scroll: [0.003, 0.003], timeScaler: 0.004 };\n\n\t\tconst gui = new GUI();\n\t\t\n\t\tconst waterFolder = gui.addFolder('water');\n\t\twaterFolder.addColor(uniforms, 'waterColor');\n\t\twaterFolder.addColor(uniforms, 'sunColor');\n\t\twaterFolder.add(uniforms, 'distortionScale', 0, 20, 0.1);\n\t\twaterFolder.add(uniforms, 'opacity', 0, 1, .001);\n\t\twaterFolder.add(uniforms, 'waveStrength', 0, 1, .001);\n\t\twaterFolder.add(uniforms, 'reflectWeight', 0, 1, .001);\n\t\twaterFolder.add(uniforms.size, 0, 0.1, 1, 0.1).name('sizeX').onChange(ev => {\n\t\t\tuniforms.size[0] = ev;\n\t\t});\n\t\twaterFolder.add(uniforms.size, 1, 0.1, 1, 0.1).name('sizeY').onChange(ev => {\n\t\t\tuniforms.size[1] = ev;\n\t\t});\n\n\t\tconst flowFolder = gui.addFolder('flow');\n\t\tflowFolder.add(params.scroll, 0, -0.1, 0.1, 0.001).name('flowX');\n\t\tflowFolder.add(params.scroll, 1, -0.1, 0.1, 0.001).name('flowY');\n\t\tflowFolder.add(params, 'timeScaler', -0.1, 0.1, 0.001).name('timeScaler');\n\n\t\tconst fogFolder = gui.addFolder('fog');\n\t\tfogFolder.add({ type: 'exp' }, 'type', ['linear', 'exp', 'none']).onChange(value => {\n\t\t\tswitch (value) {\n\t\t\t\tcase 'linear':\n\t\t\t\t\tscene.fog = fog;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'exp':\n\t\t\t\t\tscene.fog = fogExp2;\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tscene.fog = null;\n\t\t\t}\n\t\t});\n\t\tfogFolder.add(fogExp2, 'density', 0, 0.01);\n\t\tfogFolder.add(fog, 'near', 1, 1000);\n\t\tfogFolder.add(fog, 'far', 2000, 5000);\n\n\t\tfunction loop(count) {\n\t\t\trequestAnimationFrame(loop);\n\n\t\t\tstats.begin();\n\n\t\t\twaterMaterial.uniforms.offset[0] += params.scroll[0];\n\t\t\twaterMaterial.uniforms.offset[1] += params.scroll[1];\n\t\t\twaterMaterial.uniforms.time += params.timeScaler;\n\n\t\t\tcontroller.update();\n\n\t\t\trenderer.render(scene, camera);\n\n\t\t\tstats.end();\n\t\t}\n\t\trequestAnimationFrame(loop);\n\n\t\tfunction onWindowResize() {\n\t\t\twidth = window.innerWidth || 2;\n\t\t\theight = window.innerHeight || 2;\n\n\t\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 0.1, 3000);\n\n\t\t\trenderer.screenRenderTarget.resize(width, height);\n\t\t}\n\t\twindow.addEventListener('resize', onWindowResize, false);\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "examples/material_shader_water_pbr.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>t3d - pbr water</title>\n\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n\t<link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n</head>\n<body>\n    <div id=\"info\">\n        <a href=\"\" target=\"_blank\">t3d</a> - pbr water\n    </div>\n\n\t<!-- Import maps polyfill -->\n    <!-- Remove this when import maps will be widely supported -->\n    <script async src=\"./libs/es-module-shims.js\"></script>\n\n    <script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n    <script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { SkyBox } from 't3d/addons/objects/SkyBox.js';\n\t\timport { Clock } from 't3d/addons/Clock.js';\n\t\timport { OrbitControls } from 't3d/addons/controls/OrbitControls.js';\n\t\timport { ForwardRenderer } from 't3d/addons/render/ForwardRenderer.js';\n\t\timport { Texture2DLoader } from 't3d/addons/loaders/Texture2DLoader.js';\n\t\timport { TextureCubeLoader } from 't3d/addons/loaders/TextureCubeLoader.js';\n\t\timport { GUI } from './libs/lil-gui.esm.min.js';\n\t\timport Stats from './libs/stats.module.js';\n\n\t\tlet width = window.innerWidth || 2;\n\t\tlet height = window.innerHeight || 2;\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = width;\n\t\tcanvas.height = height;\n\t\tdocument.body.appendChild(canvas);\n\n\t\tconst params = {\n\t\t\tscroll: [1.2, 0],\n\t\t\ttimeScaler: 100,\n\t\t\tstrength: 1,\n\t\t\tdebug: false,\n\n\t\t\tphi: 70,\n\t\t\ttheta: 224\n\t\t};\n\n\t\tfunction updateSpherePosition() {\n\t\t\tspherical.radius = 100;\n\t\t\tspherical.phi = params.phi / 180 * Math.PI;\n\t\t\tspherical.theta = params.theta / 180 * Math.PI;\n\t\t\tdirectionalLight.position.setFromSpherical(spherical);\n\t\t\tdirectionalLight.lookAt(new t3d.Vector3(0, 0, 0), new t3d.Vector3(0, 1, 0));\n\t\t}\n\n\t\tconst stats = new Stats();\n\t\tstats.showPanel(0);\n\t\tdocument.body.appendChild(stats.dom);\n\n\t\tconst renderer = new ForwardRenderer(canvas);\n\n\t\tconst scene = new t3d.Scene();\n\t\tconst fog = new t3d.Fog(0xd38b64, 500, 2000);\n\t\tconst fogExp2 = new t3d.FogExp2(0xd38b64, 0.0008);\n\t\tscene.fog = fog;\n\n\t\tconst directionalLight = new t3d.DirectionalLight(0xffffff, 0.3);\n\t\tscene.add(directionalLight);\n\n\t\t// add light for the specular of the top view\n\t\tconst directionalLight2 = new t3d.DirectionalLight(0xffffff, 0.2);\n\t\tdirectionalLight2.position.set(0, 100, 0);\n\t\tdirectionalLight2.lookAt(new t3d.Vector3(0, 0, 0), new t3d.Vector3(0, 1, 0));\n\t\tscene.add(directionalLight2);\n\n\t\tconst spherical = new t3d.Spherical();\n\t\tupdateSpherePosition();\n\n\t\tconst cubeTexturePath = './resources/skybox/sunset/';\n\t\tconst cubeTexture = new TextureCubeLoader().load([\n\t\t\tcubeTexturePath + 'px.jpg',\n\t\t\tcubeTexturePath + 'nx.jpg',\n\t\t\tcubeTexturePath + 'py.jpg',\n\t\t\tcubeTexturePath + 'ny.jpg',\n\t\t\tcubeTexturePath + 'pz.jpg',\n\t\t\tcubeTexturePath + 'nz.jpg'\n\t\t]);\n\t\tcubeTexture.encoding = t3d.TEXEL_ENCODING_TYPE.SRGB;\n\t\t\n\t\tconst skyBox = new SkyBox(cubeTexture);\n\t\tskyBox.gamma = true;\n\t\tskyBox.fog = true;\n\t\tfog.color.toArray(skyBox.material.uniforms.fogColor);\n\t\tscene.add(skyBox);\n\n\t\tscene.environment = cubeTexture;\n\n\t\tconst camera = new t3d.Camera();\n\t\tcamera.outputEncoding = t3d.TEXEL_ENCODING_TYPE.SRGB;\n\t\tcamera.position.set(300, 100, 300);\n\t\tcamera.lookAt(new t3d.Vector3(0, 0, 0), new t3d.Vector3(0, 1, 0));\n\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 10000);\n\t\tscene.add(camera);\n\n\t\tconst controller = new OrbitControls(camera, canvas);\n\t\tcontroller.target.set(0, 0, 0);\n\t\tcontroller.maxPolarAngle = Math.PI / 2 - 0.01;\n\t\tcontroller.maxDistance = 700;\n\t\tcontroller.minDistance = 100;\n\n\t\tconst texture = new Texture2DLoader().load('./resources/waternormals.jpg');\n\t\ttexture.wrapS = texture.wrapT = t3d.TEXTURE_WRAP.REPEAT;\n\t\ttexture.anisotropy = 16;\n\n\t\tconst vertexShader = t3d.ShaderLib.pbr_vert;\n\t\tlet fragmentShader = t3d.ShaderLib.pbr_frag;\n\n\t\t// pars\n\t\tfragmentShader = fragmentShader.replace('#include <clippingPlanes_pars_frag>', `\n\t\t\t#include <clippingPlanes_pars_frag>\n\n\t\t\t#ifdef USE_NORMAL_MAP\n\t\t\t\tuniform float time;\n\t\t\t\tuniform vec4 flow1;\t// .xy is x-direction, y-direction velocity; .z is uv scale size; .w is normal specific gravity.\n\t\t\t\tuniform vec4 flow2;\n\t\t\t\tuniform vec4 flow3;\n\t\t\t\tuniform vec4 flow4;\n\n\t\t\t\tvec4 getNoise(vec2 uv) {\n\t\t\t\t\tvec2 uv1 = (uv + time * flow1.xy) * flow1.z;\n\t\t\t\t\tvec2 uv2 = (uv + time * flow2.xy) * flow2.z;\n\t\t\t\t\tvec2 uv3 = (uv + time * flow3.xy) * flow3.z;\n\t\t\t\t\tvec2 uv4 = (uv + time * flow4.xy) * flow4.z;\n\t\t\t\t\tvec4 noise = texture2D(normalMap, uv1) * flow1 .w\n\t\t\t\t\t+ texture2D(normalMap, uv2) * flow2.w\n\t\t\t\t\t+ texture2D(normalMap, uv3) * flow3.w\n\t\t\t\t\t+ texture2D(normalMap, uv4) * flow4.w;\n\n\t\t\t\t\treturn noise;\n\t\t\t\t}\n\t\t\t#endif\n\t\t`);\n\n\t\t// frag code\n\t\tfragmentShader = fragmentShader.replace('#include <normal_frag>', `\n\t\t\t// Use v_modelPos from modelPos_pars_frag\n\n\t\t\t#ifdef FLAT_SHADED\n\t\t\t\tvec3 fdx = dFdx(v_modelPos);\n\t\t\t\tvec3 fdy = dFdy(v_modelPos);\n\t\t\t\tvec3 N = normalize(cross(fdx, fdy));\n\t\t\t#else\n\t\t\t\tvec3 N = normalize(v_Normal);\n\t\t\t\t#ifdef DOUBLE_SIDED\n\t\t\t\t\tN = N * (float(gl_FrontFacing) * 2.0 - 1.0);\n\t\t\t\t#endif\n\t\t\t#endif\n\n\t\t\t#ifdef USE_TBN\n\t\t\t\tvec3 tangent = normalize(v_Tangent);\n\t\t\t\tvec3 bitangent = normalize(v_Bitangent);\n\t\t\t\t#ifdef DOUBLE_SIDED\n\t\t\t\t\ttangent = tangent * (float(gl_FrontFacing) * 2.0 - 1.0);\n\t\t\t\t\tbitangent = bitangent * (float(gl_FrontFacing) * 2.0 - 1.0);\n\t\t\t\t#endif\n\t\t\t\tmat3 tspace = mat3(tangent, bitangent, N);\n\t\t\t#endif\n\n\t\t\t// non perturbed normal\n\t\t\tvec3 geometryNormal = N;\n\n\t\t\t#ifdef USE_NORMAL_MAP\n\t\t\t\tvec3 mapN = getNoise(v_Uv).rgb * 2.0 - 1.0;\t// @water-modify\n\t\t\t\tmapN.xy *= normalScale;\n\t\t\t\t#ifdef USE_TBN\n\t\t\t\t\tN = normalize(tspace * mapN);\n\t\t\t\t#else\n\t\t\t\t\tmapN.xy *= (float(gl_FrontFacing) * 2.0 - 1.0);\n\t\t\t\t\tN = normalize(tsn(N, v_modelPos, v_Uv) * mapN);\n\t\t\t\t#endif\n\t\t\t#elif defined(USE_BUMPMAP)\n\t\t\t\tN = perturbNormalArb(v_modelPos, N, dHdxy_fwd(v_Uv));\n\t\t\t#endif\n\n\t\t\t#ifdef USE_CLEARCOAT\n\t\t\t\tvec3 clearcoatNormal = geometryNormal;\n\t\t\t#endif\n\n\t\t\t#ifdef USE_CLEARCOAT_NORMALMAP\n\t\t\t\tvec3 clearcoatMapN = texture2D(clearcoatNormalMap, v_Uv).xyz * 2.0 - 1.0;\n\t\t\t\tclearcoatMapN.xy *= clearcoatNormalScale;\n\n\t\t\t\t#ifdef USE_TBN\n\t\t\t\t\tclearcoatNormal = normalize(tspace * clearcoatMapN);\n\t\t\t\t#else\n\t\t\t\t\tclearcoatMapN.xy *= (float(gl_FrontFacing) * 2.0 - 1.0);\n\t\t\t\t\tclearcoatNormal = normalize(tsn(clearcoatNormal, v_modelPos, v_Uv) * clearcoatMapN);\n\t\t\t\t#endif\n\t\t\t#endif\n\t\t`);\n\n\t\tfragmentShader = fragmentShader.replace('#include <dithering_frag>', `\n\t\t\t#include <dithering_frag>\n\n\t\t\t#ifdef USE_DEBUG\n\t\t\t\tgl_FragColor = vec4(N, 1.0);\n\t\t\t#endif\n\t\t`);\n\n\t\tconst waterMaterial = new t3d.PBRMaterial();\n\t\twaterMaterial.type = t3d.MATERIAL_TYPE.SHADER;\n\t\twaterMaterial.uniforms = {\n\t\t\t'time': 0.0,\n\t\t\t'flow1': [0.059, 0.034, 0.0097, 1 / 4],\n\t\t\t'flow2': [0.053, -0.032, 0.0093, 1 / 4],\n\t\t\t'flow3': [0.01, 0.011, 0.0001, 1 / 4],\n\t\t\t'flow4': [-0.009, 0.009, 0.0053, 1 / 4]\n\t\t};\n\t\twaterMaterial.shaderName = 'waterShader';\n\t\twaterMaterial.vertexShader = vertexShader;\n\t\twaterMaterial.fragmentShader = fragmentShader;\n\t\twaterMaterial.clearcoat = 0.05;\n\t\twaterMaterial.clearcoatRoughness = 0.35;\n\t\twaterMaterial.metalness = 0.5;\n\t\twaterMaterial.roughness = 0.12;\n\t\twaterMaterial.normalMap = texture;\n\t\twaterMaterial.diffuse.setHex(0x064569);\n\t\twaterMaterial.transparent = true;\n\n\t\tconst waterGeometry = new t3d.PlaneGeometry(1000, 1000);\n\t\tconst uvArray = waterGeometry.getAttribute('a_Uv').buffer.array;\n\t\tfor (let i = 0; i < uvArray.length; i++) {\n\t\t\tuvArray[i] *= 1000;\n\t\t}\n\t\tconst water = new t3d.Mesh(waterGeometry, waterMaterial);\n\t\twater.position.set(0, 0, 0);\n\t\twater.scale.set(3, 3, 3);\n\t\twater.receiveShadow = true;\n\t\tscene.add(water);\n\n\t\tconst gui = new GUI();\n\t\tgui.close();\n\t\t\n\t\tconst waterFolder = gui.addFolder('water');\n\t\twaterFolder.addColor(waterMaterial, 'diffuse');\n\t\twaterFolder.add(waterMaterial, 'clearcoat', 0, 1, .001).onChange(() => waterMaterial.needsUpdate = true);\n\t\twaterFolder.add(waterMaterial, 'clearcoatRoughness', 0, 1, .001);\n\t\twaterFolder.add(waterMaterial, 'metalness', 0, 1, .001);\n\t\twaterFolder.add(waterMaterial, 'roughness', 0, 1, .001);\n\t\twaterFolder.add(waterMaterial, 'opacity', 0, 1, .001);\n\t\twaterFolder.add(params, 'strength', 0, 1, .001).onChange(value => {\n\t\t\twaterMaterial.normalScale.set(value, value);\n\t\t});\n\n\t\tconst uniforms = waterMaterial.uniforms;\n\t\twaterFolder.add(uniforms.flow1, 2, 0.0001, 0.1, 0.0001).name('size1');\n\t\twaterFolder.add(uniforms.flow2, 2, 0.0001, 0.1, 0.0001).name('size2');\n\t\twaterFolder.add(uniforms.flow3, 2, 0.0001, 0.1, 0.0001).name('size3');\n\t\twaterFolder.add(uniforms.flow4, 2, 0.0001, 0.1, 0.0001).name('size4');\n\t\twaterFolder.add(params, 'debug').onChange(value => {\n\t\t\tif (value) {\n\t\t\t\twaterMaterial.defines.USE_DEBUG = true;\n\t\t\t\twaterMaterial.needsUpdate = true;\n\t\t\t} else {\n\t\t\t\twaterMaterial.defines.USE_DEBUG = false;\n\t\t\t\twaterMaterial.needsUpdate = true;\n\t\t\t}\n\t\t});\n\n\t\tconst flowFolder = gui.addFolder('flow');\n\t\tflowFolder.add(uniforms.flow1, 0, -1, 1., 0.001).name('flowSpeed1_X');\n\t\tflowFolder.add(uniforms.flow1, 1, -1, 1, 0.001).name('flowSpeed1_Y');\n\t\tflowFolder.add(uniforms.flow2, 0, -1, 1, 0.001).name('flowSpeed2_X');\n\t\tflowFolder.add(uniforms.flow2, 1, -1, 1, 0.001).name('flowSpeed2_Y');\n\t\tflowFolder.add(uniforms.flow3, 0, -1, 1, 0.001).name('flowSpeed3_X');\n\t\tflowFolder.add(uniforms.flow3, 1, -1, 1, 0.001).name('flowSpeed3_Y');\n\t\tflowFolder.add(uniforms.flow4, 0, -1, 1, 0.001).name('flowSpeed4_X');\n\t\tflowFolder.add(uniforms.flow4, 1, -1, 1, 0.001).name('flowSpeed4_Y');\n\t\tflowFolder.add(params, 'timeScaler', -1000, 1000, 1).name('timeScaler');\n\n\t\tconst fogFolder = gui.addFolder('fog');\n\t\tfogFolder.add({ type: 'linear' }, 'type', ['linear', 'exp', 'none']).onChange(value => {\n\t\t\tswitch (value) {\n\t\t\t\tcase 'linear':\n\t\t\t\t\tscene.fog = fog;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'exp':\n\t\t\t\t\tscene.fog = fogExp2;\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tscene.fog = null;\n\t\t\t}\n\t\t});\n\t\tfogFolder.addColor(skyBox.material.uniforms, 'fogColor').onChange(value => {\n\t\t\tfog.color.fromArray(value);\n\t\t\tfogExp2.color.fromArray(value);\n\t\t});\n\t\tfogFolder.add(fogExp2, 'density', 0, 0.01);\n\t\tfogFolder.add(fog, 'near', 1, 500);\n\t\tfogFolder.add(fog, 'far', 500, 3000);\n\n\t\tconst lightFolder = gui.addFolder('light');\n\t\tlightFolder.add(params, 'phi', 10, 89, 0.001).onChange(updateSpherePosition);\n\t\tlightFolder.add(params, 'theta', 0, 360, 0.001).onChange(updateSpherePosition);\n\n\t\tconst clock = new Clock();\n\n\t\tfunction loop(count) {\n\t\t\trequestAnimationFrame(loop);\n\n\t\t\tstats.begin();\n\t\t\twaterMaterial.uniforms.time += clock.getDelta() * params.timeScaler;\n\t\t\tcontroller.update();\n\t\t\trenderer.render(scene, camera);\n\t\t\tstats.end();\n\t\t}\n\t\trequestAnimationFrame(loop);\n\n\t\tfunction onWindowResize() {\n\t\t\twidth = window.innerWidth || 2;\n\t\t\theight = window.innerHeight || 2;\n\n\t\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 10000);\n\n\t\t\trenderer.screenRenderTarget.resize(width, height);\n\t\t}\n\t\twindow.addEventListener('resize', onWindowResize, false);\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "examples/material_shader_xray.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>t3d - shader XRay</title>\n\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n\t<link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n</head>\n<body>\n    <div id=\"info\">\n        <a href=\"\" target=\"_blank\">t3d</a> - shader XRay\n    </div>\n\n\t<script src=\"./libs/nanobar.min.js\"></script>\n\n\t<!-- Import maps polyfill -->\n    <!-- Remove this when import maps will be widely supported -->\n    <script async src=\"./libs/es-module-shims.js\"></script>\n\n    <script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n    <script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { GLTFLoader } from 't3d/addons/loaders/glTF/GLTFLoader.js';\n\t\timport { OrbitControls } from 't3d/addons/controls/OrbitControls.js';\n\t\timport { ForwardRenderer } from 't3d/addons/render/ForwardRenderer.js';\n\t\timport { XRayShader } from 't3d/addons/shaders/XRayShader.js';\n\t\timport { GUI } from './libs/lil-gui.esm.min.js';\n\n\t\tlet width = window.innerWidth || 2;\n\t\tlet height = window.innerHeight || 2;\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = width;\n\t\tcanvas.height = height;\n\t\tdocument.body.appendChild(canvas);\n\n\t\tconst forwardRenderer = new ForwardRenderer(canvas);\n\n\t\tconst scene = new t3d.Scene();\n\n\t\tconst material = new t3d.ShaderMaterial(XRayShader);\n\n\t\tconst nanobar = new Nanobar();\n\t\tnanobar.el.style.background = 'gray';\n\n\t\tconst loadingManager = new t3d.LoadingManager(function() {\n\t\t\tnanobar.go(100);\n\t\t\tnanobar.el.style.background = 'transparent';\n\t\t}, function(url, itemsLoaded, itemsTotal) {\n\t\t\tif (itemsLoaded < itemsTotal) {\n\t\t\t\tnanobar.go(itemsLoaded / itemsTotal * 100);\n\t\t\t}\n\t\t});\n\n\t\tconst loader = new GLTFLoader(loadingManager);\n\t\tloader.load(\n\t\t\t'./resources/models/gltf/DamagedHelmet/glTF/DamagedHelmet.gltf'\n\t\t).then(function(result) {\n\t\t\t// add mesh to scene\n\t\t\tconst object = result.root.children[0];\n\n\t\t\tobject.material = material;\n\t\t\tobject.material.depthWrite = false;\n\t\t\tobject.material.side = t3d.DRAW_SIDE.DOUBLE;\n\t\t\tobject.material.transparent = true;\n\n\t\t\tobject.scale.set(10, 10, 10);\n\t\t\tobject.euler.z = -Math.PI / 6;\n\n\t\t\tscene.add(object);\n\t\t});\n\n\t\tconst camera = new t3d.Camera();\n\t\tcamera.outputEncoding = t3d.TEXEL_ENCODING_TYPE.SRGB;\n\t\tcamera.position.set(20, 10, 35);\n\t\tcamera.lookAt(new t3d.Vector3(0, 0, 0), new t3d.Vector3(0, 1, 0));\n\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 8000);\n\t\tscene.add(camera);\n\n\t\tconst controller = new OrbitControls(camera, canvas);\n\t\tcontroller.enablePan = false;\n\t\tcontroller.autoRotate = true;\n\t\tcontroller.autoRotateSpeed = 0.5;\n\n\t\tconst gui = new GUI();\n\t\tgui.add({ version: 'WebGL ' + forwardRenderer.capabilities.version }, 'version').disable();\n\t\tgui.add(material.uniforms, 'power', 0, 2, 0.01);\n\t\tgui.add(material.uniforms, 'glowInverse');\n\t\tgui.addColor(material.uniforms, 'glowColor');\n\n\t\tfunction loop(count) {\n\t\t\trequestAnimationFrame(loop);\n\n\t\t\tcontroller.update();\n\n\t\t\tforwardRenderer.render(scene, camera);\n\t\t}\n\t\trequestAnimationFrame(loop);\n\n\t\tfunction onWindowResize() {\n\t\t\twidth = window.innerWidth || 2;\n\t\t\theight = window.innerHeight || 2;\n\n\t\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 8000);\n\n\t\t\tforwardRenderer.screenRenderTarget.resize(width, height);\n\t\t}\n\t\twindow.addEventListener('resize', onWindowResize, false);\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "examples/material_shadermaterial.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>t3d - shadermaterial</title>\n\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n\t<link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n</head>\n<body>\n    <div id=\"info\">\n        <a href=\"\" target=\"_blank\">t3d</a> - shadermaterial\n    </div>\n\n\t<script id=\"vertexShader\" type=\"x-shader/x-vertex\">\n\t\tattribute vec3 a_Position;\n\n\t\tattribute vec2 a_Uv;\n\t\tvarying vec2 v_Uv;\n\n\t\tuniform mat4 u_ProjectionView;\n\t\tuniform mat4 u_Model;\n\n\t\tvoid main() {\n\t\t\tgl_Position = u_ProjectionView * u_Model * vec4(a_Position, 1.0);\n\t\t\tv_Uv = a_Uv;\n\t\t}\n\t</script>\n\n\t<script id=\"fragmentShader1\" type=\"x-shader/x-fragment\">\n\t\tvarying vec2 v_Uv;\n\n\t\tuniform float time;\n\n\t\tvoid main() {\n\t\t\tvec3 c;\n\t\t\tfloat l,z=time;\n\t\t\tfor(int i=0;i<3;i++) {\n\t\t\t\tvec2 uv,p=v_Uv;\n\t\t\t\tuv=p;\n\t\t\t\tp-=.5;\n\t\t\t\tz+=.07;\n\t\t\t\tl=length(p);\n\t\t\t\tuv+=p/l*(sin(z)+1.)*abs(sin(l*9.-z*2.));\n\t\t\t\tc[i]=.01/length(abs(mod(uv,1.)-.5));\n\t\t\t}\n\t\t\tgl_FragColor=vec4(c/l, time);\n\t\t}\n\t</script>\n\n\t<script id=\"fragmentShader2\" type=\"x-shader/x-fragment\">\n\t\tvarying vec2 v_Uv;\n\n\t\tuniform float time;\n\n\t\tvoid main() {\n\t\t\tvec3 p = (vec3(v_Uv.xy, .0) - 0.5) * abs(sin(time/10.0)) * 50.0;\n\t\t\tfloat d = sin(length(p)+time), a = sin(mod(atan(p.y, p.x) + time + sin(d+time), 3.1416/3.)*3.), v = a + d, m = sin(length(p)*4.0-a+time);\n\t\t\tfloat _r = -v*sin(m*sin(-d)+time*.1);\n\t\t\tfloat _g = v*m*sin(tan(sin(-a))*sin(-a*3.)*3.+time*.5);\n\t\t\tfloat _b = mod(v,m);\n\t\t\tgl_FragColor = vec4(_r, _g, _b, 1.);\n\t\t}\n\t</script>\n\n\t<!-- Import maps polyfill -->\n    <!-- Remove this when import maps will be widely supported -->\n    <script async src=\"./libs/es-module-shims.js\"></script>\n\n    <script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n    <script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { ForwardRenderer } from 't3d/addons/render/ForwardRenderer.js';\n\t\timport { GUI } from './libs/lil-gui.esm.min.js';\n\n\t\tlet width = window.innerWidth || 2;\n\t\tlet height = window.innerHeight || 2;\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = width;\n\t\tcanvas.height = height;\n\t\tdocument.body.appendChild(canvas);\n\n\t\tconst forwardRenderer = new ForwardRenderer(canvas);\n\n\t\tconst scene = new t3d.Scene();\n\n\t\tconst vertexShader = document.getElementById('vertexShader').textContent;\n\t\tconst fragmentShader1 = document.getElementById('fragmentShader1').textContent;\n\t\tconst fragmentShader2 = document.getElementById('fragmentShader2').textContent;\n\n\t\tconst shader1 = {\n\t\t\tvertexShader: vertexShader,\n\t\t\tfragmentShader: fragmentShader1,\n\t\t\tuniforms: { time: 10 }\n\t\t};\n\n\t\tconst shader2 = {\n\t\t\tvertexShader: vertexShader,\n\t\t\tfragmentShader: fragmentShader2,\n\t\t\tuniforms: { time: 10 }\n\t\t};\n\n\t\tconst material1 = new t3d.ShaderMaterial(shader1);\n\t\tconst material2 = new t3d.ShaderMaterial(shader2);\n\n\t\tconst sphere_geometry = new t3d.SphereGeometry(10, 20, 20);\n\t\tconst sphere = new t3d.Mesh(sphere_geometry, material2);\n\t\tsphere.euler.z = -Math.PI / 2;\n\t\tsphere.position.y = 10;\n\t\tscene.add(sphere);\n\n\t\tconst plane_geometry = new t3d.PlaneGeometry(100, 100);\n\t\tconst plane = new t3d.Mesh(plane_geometry, material2);\n\t\tplane.position.y = 0;\n\t\tscene.add(plane);\n\n\t\tconst camera = new t3d.Camera();\n\t\tcamera.position.set(0, 80, 100);\n\t\tcamera.lookAt(new t3d.Vector3(0, 0, 0), new t3d.Vector3(0, 1, 0));\n\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 1000);\n\t\tscene.add(camera);\n\n\t\tconst gui = new GUI();\n\t\tgui.add({ version: 'WebGL ' + forwardRenderer.capabilities.version }, 'version').disable();\n\t\tgui.add({ material: 'sample1' }, 'material', ['sample1', 'sample2']).onChange(value => {\n\t\t\tsphere.material = value === 'sample1' ? material2 : material1;\n\t\t\tplane.material = value === 'sample1' ? material2 : material1;\n\t\t});\n\n\t\tfunction loop(count) {\n\t\t\trequestAnimationFrame(loop);\n\n\t\t\tmaterial1.uniforms.time += 0.01;\n\t\t\tmaterial2.uniforms.time += 0.01;\n\t\t\tif (material1.uniforms.time > 100) {\n\t\t\t\tmaterial1.uniforms.time = 0;\n\t\t\t\tmaterial2.uniforms.time = 0;\n\t\t\t}\n\n\t\t\t// rotate camera\n\t\t\tcamera.position.x = 100 * Math.sin(count / 1000 * .5);\n\t\t\tcamera.position.z = 100 * Math.cos(count / 1000 * .5);\n\t\t\tcamera.position.y = 30 * Math.cos(count / 1000 * .5) + 50;\n\t\t\tcamera.lookAt(new t3d.Vector3(0, 0, 0), new t3d.Vector3(0, 1, 0));\n\n\t\t\tforwardRenderer.render(scene, camera);\n\t\t}\n\t\trequestAnimationFrame(loop);\n\n\t\tfunction onWindowResize() {\n\t\t\twidth = window.innerWidth || 2;\n\t\t\theight = window.innerHeight || 2;\n\n\t\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 1000);\n\n\t\t\tforwardRenderer.screenRenderTarget.resize(width, height);\n\t\t}\n\t\twindow.addEventListener('resize', onWindowResize, false);\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "examples/material_transparent.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>t3d - transparent</title>\n\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n\t<link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n</head>\n<body>\n    <div id=\"info\">\n        <a href=\"\" target=\"_blank\">t3d</a> - transparent\n    </div>\n\n\t<!-- Import maps polyfill -->\n    <!-- Remove this when import maps will be widely supported -->\n    <script async src=\"./libs/es-module-shims.js\"></script>\n\n    <script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n    <script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { OrbitControls } from 't3d/addons/controls/OrbitControls.js';\n\t\timport { ForwardRenderer } from 't3d/addons/render/ForwardRenderer.js';\n\t\timport { GUI } from './libs/lil-gui.esm.min.js';\n\n\t\tlet width = window.innerWidth || 2;\n\t\tlet height = window.innerHeight || 2;\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = width;\n\t\tcanvas.height = height;\n\t\tdocument.body.appendChild(canvas);\n\n\t\tconst forwardRenderer = new ForwardRenderer(canvas);\n\n\t\tconst scene = new t3d.Scene();\n\n\t\t// Create 3 torus-knot\n\n\t\tconst geometry = new t3d.TorusKnotGeometry(1, 0.4, 128, 16);\n\n\t\tconst material1 = new t3d.PhongMaterial();\n\t\tmaterial1.diffuse.setHex(0x00ff00);\n\t\tmaterial1.transparent = true;\n\t\tmaterial1.opacity = 0.7;\n\t\tmaterial1.depthWrite = false;\n\t\tconst mesh1 = new t3d.Mesh(geometry, material1);\n\t\tmesh1.position.set(-1 / Math.tan(Math.PI / 6), -1, 0);\n\t\tscene.add(mesh1);\n\n\t\tconst material2 = new t3d.PhongMaterial();\n\t\tmaterial2.diffuse.setHex(0xff0000);\n\t\tmaterial2.transparent = true;\n\t\tmaterial2.opacity = 0.7;\n\t\tmaterial2.depthWrite = false;\n\t\tconst mesh2 = new t3d.Mesh(geometry, material2);\n\t\tmesh2.position.set(1 / Math.tan(Math.PI / 6), -1, 0);\n\t\tscene.add(mesh2);\n\n\t\tconst material3 = new t3d.PhongMaterial();\n\t\tmaterial3.diffuse.setHex(0x0000ff);\n\t\tmaterial3.transparent = true;\n\t\tmaterial3.opacity = 0.7;\n\t\tconst mesh3 = new t3d.Mesh(geometry, material3);\n\t\tmesh3.position.set(0, 2, 0);\n\t\tscene.add(mesh3);\n\n\t\t// Create background plane\n\n\t\tconst bgCanvas = document.createElement('canvas');\n\t\tconst bgContext = bgCanvas.getContext('2d');\n\t\tbgCanvas.width = bgCanvas.height = 128;\n\t\tbgContext.fillStyle = '#ddd';\n\t\tbgContext.fillRect(0, 0, 128, 128);\n\t\tbgContext.fillStyle = '#555';\n\t\tbgContext.fillRect(0, 0, 64, 64);\n\t\tbgContext.fillStyle = '#555';\n\t\tbgContext.fillRect(64, 64, 64, 64);\n\n\t\tconst texture = new t3d.Texture2D();\n\t\ttexture.image = bgCanvas;\n\t\ttexture.anisotropy = forwardRenderer.capabilities.maxAnisotropy;\n\t\ttexture.wrapS = texture.wrapT = t3d.TEXTURE_WRAP.REPEAT;\n\n\t\tconst bg_geometry = new t3d.BoxGeometry(50, 50, 50);\n\t\tconst bg_material = new t3d.BasicMaterial();\n\t\tbg_material.diffuseMap = texture;\n\t\tbg_material.diffuseMapTransform.setUvTransform(0, 0, 64, 64, 0, 0.5, 0.5);\n\t\tbg_material.side = t3d.DRAW_SIDE.BACK;\n\t\tconst background = new t3d.Mesh(bg_geometry, bg_material);\n\t\tbackground.euler.x = Math.PI / 2;\n\t\tbackground.position.set(0, 0.5, -2);\n\t\tscene.add(background);\n\n\t\t// Create lights and camera\n\n\t\tconst ambientLight = new t3d.AmbientLight(0xffffff, 0.5);\n\t\tscene.add(ambientLight);\n\n\t\tconst directLight1 = new t3d.DirectionalLight(0xffffff, 0.5);\n\t\tdirectLight1.euler.set(Math.PI / 2, Math.PI / 4, 0);\n\t\tdirectLight1.position.set(40, 40, 40);\n\t\tdirectLight1.lookAt(new t3d.Vector3(0, 0, 0), new t3d.Vector3(0, 1, 0));\n\t\tscene.add(directLight1);\n\n\t\tconst camera = new t3d.Camera();\n\t\tcamera.position.set(0, 0.5, 16);\n\t\tcamera.lookAt(new t3d.Vector3(0, 0.5, 0), new t3d.Vector3(0, 1, 0));\n\t\tcamera.setPerspective(30 / 180 * Math.PI, width / height, 1, 1000);\n\t\tscene.add(camera);\n\t\t\n\t\tconst controller = new OrbitControls(camera, canvas);\n\t\tcontroller.target.set(0, 0.5, 0);\n\t\t\n\t\t// GUI\n\n\t\tconst params = { depthWrite: false, depthTest: true, doubleSide: false };\n\t\tconst gui = new GUI();\n\t\tgui.add(params, 'depthWrite').onChange(value => {\n\t\t\tmaterial1.depthWrite = value;\n\t\t\tmaterial2.depthWrite = value;\n\t\t});\n\t\tgui.add(params, 'depthTest').onChange(value => {\n\t\t\tmaterial1.depthTest = value;\n\t\t\tmaterial2.depthTest = value;\n\t\t});\n\t\tgui.add(params, 'doubleSide').onChange(value => {\n\t\t\tmaterial1.side = value ? t3d.DRAW_SIDE.DOUBLE : t3d.DRAW_SIDE.FRONT;\n\t\t\tmaterial2.side = value ? t3d.DRAW_SIDE.DOUBLE : t3d.DRAW_SIDE.FRONT;\n\t\t});\n\n\t\tfunction loop(count) {\n\t\t\trequestAnimationFrame(loop);\n\n\t\t\tcontroller.update();\n\n\t\t\tforwardRenderer.render(scene, camera);\n\t\t}\n\t\trequestAnimationFrame(loop);\n\n\t\tfunction onWindowResize() {\n\t\t\twidth = window.innerWidth || 2;\n\t\t\theight = window.innerHeight || 2;\n\n\t\t\tcamera.setPerspective(30 / 180 * Math.PI, width / height, 1, 1000);\n\n\t\t\tforwardRenderer.screenRenderTarget.resize(width, height);\n\t\t}\n\t\twindow.addEventListener('resize', onWindowResize, false);\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "examples/material_uvcoord.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>t3d - uv coord</title>\n\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n\t<link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n</head>\n<body>\n    <div id=\"info\">\n        <a href=\"\" target=\"_blank\">t3d</a> - uv coord\n    </div>\n\n\t<!-- Import maps polyfill -->\n    <!-- Remove this when import maps will be widely supported -->\n    <script async src=\"./libs/es-module-shims.js\"></script>\n\n    <script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n    <script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { ForwardRenderer } from 't3d/addons/render/ForwardRenderer.js';\n\t\timport { Texture2DLoader } from 't3d/addons/loaders/Texture2DLoader.js';\n\t\timport { GUI } from './libs/lil-gui.esm.min.js';\n\n\t\tlet width = window.innerWidth || 2;\n\t\tlet height = window.innerHeight || 2;\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = width;\n\t\tcanvas.height = height;\n\t\tdocument.body.appendChild(canvas);\n\n\t\tconst forwardRenderer = new ForwardRenderer(canvas);\n\n\t\tconst scene = new t3d.Scene();\n\n\t\tconst texture = new Texture2DLoader().load('./resources/UV_Grid_Sm.jpg');\n\t\ttexture.anisotropy = forwardRenderer.capabilities.maxAnisotropy;\n\t\ttexture.wrapS = texture.wrapT = t3d.TEXTURE_WRAP.REPEAT;\n\n\t\tconst geometry = new t3d.PlaneGeometry(30, 30);\n\t\tgeometry.addAttribute('a_Uv2', new t3d.Attribute(new t3d.Buffer(new Float32Array([0.5, 1, 1, 1, 0.5, 0, 1, 0]), 2)));\n\t\tconst material = new t3d.BasicMaterial();\n\t\tmaterial.diffuseMap = texture;\n\t\tmaterial.diffuseMapCoord = 0;\n\t\tconst cube = new t3d.Mesh(geometry, material);\n\t\tscene.add(cube);\n\n\t\tconst camera = new t3d.Camera();\n\t\tcamera.position.set(0, 10, 30);\n\t\tcamera.lookAt(new t3d.Vector3(0, 0, 0), new t3d.Vector3(0, 1, 0));\n\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 1000);\n\t\tscene.add(camera);\n\t\t\n\t\tfunction updateUvCoord(val) {\n\t\t\tmaterial.diffuseMapCoord = parseInt(val);\n\t\t\tmaterial.needsUpdate = true;\n\t\t}\n\n\t\t// gui\n\t\tconst gui = new GUI();\n\t\tgui.add({ coord: 0 }, 'coord', [0, 1]).onChange(updateUvCoord);\n\n\t\tfunction loop(count) {\n\t\t\trequestAnimationFrame(loop);\n\n\t\t\t// rotate camera\n\t\t\tcamera.position.x = 30 * Math.sin(count / 1000 * .5);\n\t\t\tcamera.position.z = 30 * Math.cos(count / 1000 * .5);\n\t\t\tcamera.lookAt(new t3d.Vector3(0, 0, 0), new t3d.Vector3(0, 1, 0));\n\n\t\t\tforwardRenderer.render(scene, camera);\n\t\t}\n\t\trequestAnimationFrame(loop);\n\n\t\tfunction onWindowResize() {\n\t\t\twidth = window.innerWidth || 2;\n\t\t\theight = window.innerHeight || 2;\n\n\t\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 1000);\n\n\t\t\tforwardRenderer.screenRenderTarget.resize(width, height);\n\t\t}\n\t\twindow.addEventListener('resize', onWindowResize, false);\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "examples/material_uvtransform.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>t3d - uv transform</title>\n\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n\t<link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n</head>\n<body>\n    <div id=\"info\">\n        <a href=\"\" target=\"_blank\">t3d</a> - uv transform\n    </div>\n\n\t<!-- Import maps polyfill -->\n    <!-- Remove this when import maps will be widely supported -->\n    <script async src=\"./libs/es-module-shims.js\"></script>\n\n    <script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n    <script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { ForwardRenderer } from 't3d/addons/render/ForwardRenderer.js';\n\t\timport { Texture2DLoader } from 't3d/addons/loaders/Texture2DLoader.js';\n\t\timport { GUI } from './libs/lil-gui.esm.min.js';\n\n\t\tlet width = window.innerWidth || 2;\n\t\tlet height = window.innerHeight || 2;\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = width;\n\t\tcanvas.height = height;\n\t\tdocument.body.appendChild(canvas);\n\n\t\tconst forwardRenderer = new ForwardRenderer(canvas);\n\n\t\tconst scene = new t3d.Scene();\n\n\t\tconst texture = new Texture2DLoader().load('./resources/UV_Grid_Sm.jpg');\n\t\ttexture.anisotropy = forwardRenderer.capabilities.maxAnisotropy;\n\t\ttexture.wrapS = texture.wrapT = t3d.TEXTURE_WRAP.REPEAT;\n\n\t\tconst material = new t3d.BasicMaterial();\n\t\tmaterial.diffuseMap = texture;\n\t\tconst cube = new t3d.Mesh(new t3d.BoxGeometry(8, 8, 8), material);\n\t\tscene.add(cube);\n\n\t\tconst camera = new t3d.Camera();\n\t\tcamera.position.set(0, 10, 30);\n\t\tcamera.lookAt(new t3d.Vector3(0, 0, 0), new t3d.Vector3(0, 1, 0));\n\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 1000);\n\t\tscene.add(camera);\n\n\t\tconst diffuseMapTransform = material.diffuseMapTransform;\n\t\tdiffuseMapTransform.center.set(0.5, 0.5);\n\t\t\n\t\tfunction updateUvTransform() {\n\t\t\tdiffuseMapTransform.needsUpdate = true;\n\t\t}\n\n\t\tconst gui = new GUI();\n\t\tgui.add(diffuseMapTransform.offset, 'x', 0.0, 1.0, 0.01).name('offset.x').onChange(updateUvTransform);\n\t\tgui.add(diffuseMapTransform.offset, 'y', 0.0, 1.0, 0.01).name('offset.y').onChange(updateUvTransform);\n\t\tgui.add(diffuseMapTransform.scale, 'x', 0.25, 2.0, 0.1).name('scale.x').onChange(updateUvTransform);\n\t\tgui.add(diffuseMapTransform.scale, 'y', 0.25, 2.0, 0.1).name('scale.y').onChange(updateUvTransform);\n\t\tgui.add(diffuseMapTransform, 'rotation', -2.0, 2.0, 0.1).name('rotation').onChange(updateUvTransform);\n\t\tgui.add(diffuseMapTransform.center, 'x', 0.0, 1.0, 0.01).name('center.x').onChange(updateUvTransform);\n\t\tgui.add(diffuseMapTransform.center, 'y', 0.0, 1.0, 0.01).name('center.y').onChange(updateUvTransform);\n\n\t\tfunction loop(count) {\n\t\t\trequestAnimationFrame(loop);\n\n\t\t\t// rotate camera\n\t\t\tcamera.position.x = 30 * Math.sin(count / 1000 * .5);\n\t\t\tcamera.position.z = 30 * Math.cos(count / 1000 * .5);\n\t\t\tcamera.lookAt(new t3d.Vector3(0, 0, 0), new t3d.Vector3(0, 1, 0));\n\n\t\t\tforwardRenderer.render(scene, camera);\n\t\t}\n\t\trequestAnimationFrame(loop);\n\n\t\tfunction onWindowResize() {\n\t\t\twidth = window.innerWidth || 2;\n\t\t\theight = window.innerHeight || 2;\n\n\t\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 1000);\n\n\t\t\tforwardRenderer.screenRenderTarget.resize(width, height);\n\t\t}\n\t\twindow.addEventListener('resize', onWindowResize, false);\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "examples/material_vertexcolors.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>t3d - vertex colors</title>\n\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n\t<link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n</head>\n<body>\n    <div id=\"info\">\n        <a href=\"\" target=\"_blank\">t3d</a> - vertex colors\n    </div>\n\n\t<!-- Import maps polyfill -->\n    <!-- Remove this when import maps will be widely supported -->\n    <script async src=\"./libs/es-module-shims.js\"></script>\n\n    <script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n    <script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { ForwardRenderer } from 't3d/addons/render/ForwardRenderer.js';\n\n\t\tlet width = window.innerWidth || 2;\n\t\tlet height = window.innerHeight || 2;\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = width;\n\t\tcanvas.height = height;\n\t\tdocument.body.appendChild(canvas);\n\n\t\tconst forwardRenderer = new ForwardRenderer(canvas);\n\n\t\tconst scene = new t3d.Scene();\n\n\t\tfunction addVertexColors(geometry, r, g, b, a) {\n\t\t\tconst count = geometry.getAttribute('a_Position').buffer.count;\n\t\t\tconst colors = [];\n\t\t\tfor (let i = 0; i < count; i++) {\n\t\t\t\tcolors.push(r, g, b, a);\n\t\t\t}\n\t\t\tgeometry.addAttribute('a_Color', new t3d.Attribute(new t3d.Buffer(new Float32Array(colors), 4)));\n\t\t}\n\n\t\tconst sphere_geometry = new t3d.SphereGeometry(10, 20, 20);\n\t\taddVertexColors(sphere_geometry, 1, 0, 0, 0.5);\n\t\tconst phong = new t3d.PhongMaterial();\n\t\tphong.diffuse.setHex(0xffffff);\n\t\tphong.vertexColors = t3d.VERTEX_COLOR.RGBA;\n\t\tphong.transparent = true;\n\t\tconst sphere = new t3d.Mesh(sphere_geometry, phong);\n\t\tscene.add(sphere);\n\n\t\tconst plane_geometry = new t3d.PlaneGeometry(100, 100);\n\t\taddVertexColors(plane_geometry, 1, 1, 0, 1);\n\t\tconst lambert = new t3d.LambertMaterial();\n\t\tlambert.diffuse.setHex(0xffffff);\n\t\tlambert.vertexColors = t3d.VERTEX_COLOR.RGBA;\n\t\tconst plane = new t3d.Mesh(plane_geometry, lambert);\n\t\tplane.position.y = -10;\n\t\tscene.add(plane);\n\n\t\tconst ambientLight = new t3d.AmbientLight(0xffffff, 0.3);\n\t\tscene.add(ambientLight);\n\n\t\tconst directionalLight = new t3d.DirectionalLight(0xffffff, 0.6);\n\t\tdirectionalLight.position.set(-40, 40, 0);\n\t\tdirectionalLight.lookAt(new t3d.Vector3(), new t3d.Vector3(0, 1, 0));\n\t\tdirectionalLight.shadow.windowSize = 100;\n\t\tscene.add(directionalLight);\n\n\t\tconst camera = new t3d.Camera();\n\t\tcamera.position.set(0, 80, 100);\n\t\tcamera.lookAt(new t3d.Vector3(0, 0, 0), new t3d.Vector3(0, 1, 0));\n\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 1000);\n\t\tscene.add(camera);\n\n\t\tfunction loop(count) {\n\t\t\trequestAnimationFrame(loop);\n\n\t\t\t// rotate camera\n\t\t\tcamera.position.x = 100 * Math.sin(count / 1000 * .5);\n\t\t\tcamera.position.z = 100 * Math.cos(count / 1000 * .5);\n\t\t\tcamera.lookAt(new t3d.Vector3(0, 0, 0), new t3d.Vector3(0, 1, 0));\n\n\t\t\tforwardRenderer.render(scene, camera);\n\t\t}\n\n\t\trequestAnimationFrame(loop);\n\n\t\tfunction onWindowResize() {\n\t\t\twidth = window.innerWidth || 2;\n\t\t\theight = window.innerHeight || 2;\n\n\t\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 1000);\n\n\t\t\tforwardRenderer.screenRenderTarget.resize(width, height);\n\t\t}\n\t\twindow.addEventListener('resize', onWindowResize, false);\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "examples/math_curve.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>t3d - curve</title>\n\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n\t<link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n</head>\n<body>\n    <div id=\"info\">\n        <a href=\"\" target=\"_blank\">t3d</a> - curve\n    </div>\n\n\t<!-- Import maps polyfill -->\n    <!-- Remove this when import maps will be widely supported -->\n    <script async src=\"./libs/es-module-shims.js\"></script>\n\n    <script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n    <script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { CubicBezierCurve3, QuadraticBezierCurve3, CurvePath2, CurvePath3 } from 't3d/addons/math/curves/Curves.js';\n\t\timport { CurveUtils } from 't3d/addons/math/curves/CurveUtils.js';\n\t\timport { OrbitControls } from 't3d/addons/controls/OrbitControls.js';\n\t\timport { ForwardRenderer } from 't3d/addons/render/ForwardRenderer.js';\n\t\timport { GUI } from './libs/lil-gui.esm.min.js';\n\n\t\tlet width = window.innerWidth || 2;\n\t\tlet height = window.innerHeight || 2;\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = width;\n\t\tcanvas.height = height;\n\t\tdocument.body.appendChild(canvas);\n\n\t\tconst forwardRenderer = new ForwardRenderer(canvas);\n\n\t\tconst scene = new t3d.Scene();\n\n\t\tconst camera = new t3d.Camera();\n\t\tcamera.position.set(150, 80, 250);\n\t\tcamera.lookAt(new t3d.Vector3(0, 0, -1), new t3d.Vector3(0, 1, 0));\n\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 1000);\n\t\tscene.add(camera);\n\n\t\tconst controller = new OrbitControls(camera, canvas);\n\n\t\t// curves\n\n\t\tfunction createMeshByPoints(points) {\n\t\t\tconst verticesArray = [];\n\t\t\tconst colorsArray = [];\n\t\t\tpoints.forEach((point, i) => {\n\t\t\t\tverticesArray.push(point.x, point.y, point.z || 0);\n\t\t\t\tcolorsArray.push(Math.random(), Math.random(), Math.random());\n\t\t\t});\n\t\t\tconst lineGeometry = new t3d.Geometry();\n\t\t\tlineGeometry.addAttribute('a_Position', new t3d.Attribute(new t3d.Buffer(new Float32Array(verticesArray), 3)));\n\t\t\tlineGeometry.addAttribute('a_Color', new t3d.Attribute(new t3d.Buffer(new Float32Array(colorsArray), 3)));\n\t\t\tlineGeometry.computeBoundingBox();\n\t\t\tlineGeometry.computeBoundingSphere();\n\t\t\tconst linesMaterial = new t3d.BasicMaterial();\n\t\t\tlinesMaterial.vertexColors = t3d.VERTEX_COLOR.RGB;\n\t\t\tlinesMaterial.diffuse.setHex(0xffffff);\n\t\t\tlinesMaterial.lineWidth = 1;\n\t\t\tlinesMaterial.drawMode = t3d.DRAW_MODE.LINE_STRIP;\n\t\t\tconst lines = new t3d.Mesh(lineGeometry, linesMaterial);\n\t\t\treturn lines;\n\t\t}\n\n\t\tfunction disposeMesh(mesh) {\n\t\t\tmesh.geometry.dispose();\n\t\t\tmesh.material.dispose();\n\t\t\tscene.remove(mesh);\n\t\t}\n\n\t\tconst params = { sampleNum: 4, bevelRadius: 4 };\n\n\t\tlet line1, line2, line3, line4;\n\t\tfunction createLines() {\n\t\t\tif (line1) disposeMesh(line1);\n\t\t\tif (line2) disposeMesh(line2);\n\t\t\tif (line3) disposeMesh(line3);\n\t\t\tif (line4) disposeMesh(line4);\n\n\t\t\tconst quadraticBezierCurve3 = new QuadraticBezierCurve3(\n\t\t\t\tnew t3d.Vector3(-10, 10, 0),\n\t\t\t\tnew t3d.Vector3(0, 0, 0),\n\t\t\t\tnew t3d.Vector3(10, 10, 0)\n\t\t\t);\n\t\t\tline1 = createMeshByPoints(quadraticBezierCurve3.getSpacedPoints(params.sampleNum));\n\t\t\tline1.position.set(50, 0, 0);\n\t\t\tscene.add(line1);\n\n\t\t\tconst cubicBezierCurve3 = new CubicBezierCurve3(\n\t\t\t\tnew t3d.Vector3(-10, 10, 0),\n\t\t\t\tnew t3d.Vector3(-10, 0, 0),\n\t\t\t\tnew t3d.Vector3(10, 0, 0),\n\t\t\t\tnew t3d.Vector3(10, 10, 0)\n\t\t\t);\n\t\t\tline2 = createMeshByPoints(cubicBezierCurve3.getSpacedPoints(params.sampleNum));\n\t\t\tline2.position.set(50, 0, 0);\n\t\t\tscene.add(line2);\n\n\t\t\tconst hilbert3DPoints = CurveUtils.hilbert3D(new t3d.Vector3(0, 0, 0), 50, 1, 0, 1, 2, 3, 4, 5, 6, 7);\n\t\t\tconst curvePath3 = new CurvePath3();\n\t\t\tcurvePath3.setBeveledCurves(hilbert3DPoints, { close: false, bevelRadius: params.bevelRadius });\n\t\t\tline3 = createMeshByPoints(curvePath3.getPoints(params.sampleNum));\n\t\t\tline3.position.set(-50, 0, 0);\n\t\t\tscene.add(line3);\n\n\t\t\tconst rectangle2DPoints = [\n\t\t\t\tnew t3d.Vector2(-35, 35),\n\t\t\t\tnew t3d.Vector2(-35, -35),\n\t\t\t\tnew t3d.Vector2(35, -35),\n\t\t\t\tnew t3d.Vector2(35, 35)\n\t\t\t];\n\t\t\tconst curvePath2 = new CurvePath2();\n\t\t\tcurvePath2.setBeveledCurves(rectangle2DPoints, { close: true, bevelRadius: params.bevelRadius });\n\t\t\tline4 = createMeshByPoints(curvePath2.getPoints(params.sampleNum));\n\t\t\tline4.position.set(50, 0, 0);\n\t\t\tscene.add(line4);\n\t\t}\n\n\t\tcreateLines();\n\n\t\t// gui\n\t\t\n\t\tconst gui = new GUI();\n\t\tgui.add(params, 'bevelRadius', 0, 50, 0.01).onChange(createLines);\n\t\tgui.add(params, 'sampleNum', 2, 20, 1).onChange(createLines);\n\n\t\tfunction loop(count) {\n\t\t\trequestAnimationFrame(loop);\n\n\t\t\tcontroller.update();\n\n\t\t\tforwardRenderer.render(scene, camera);\n\t\t}\n\t\trequestAnimationFrame(loop);\n\n\t\tfunction onWindowResize() {\n\t\t\twidth = window.innerWidth || 2;\n\t\t\theight = window.innerHeight || 2;\n\n\t\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 1000);\n\n\t\t\tforwardRenderer.screenRenderTarget.resize(width, height);\n\t\t}\n\t\twindow.addEventListener('resize', onWindowResize, false);\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "examples/math_curve_motion.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>t3d - curve motion</title>\n\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n\t<link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n</head>\n<body>\n    <div id=\"info\">\n        <a href=\"\" target=\"_blank\">t3d</a> - curve motion\n    </div>\n\n\t<!-- Import maps polyfill -->\n    <!-- Remove this when import maps will be widely supported -->\n    <script async src=\"./libs/es-module-shims.js\"></script>\n\n    <script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n    <script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { CurvePath3 } from 't3d/addons/math/curves/Curves.js';\n\t\timport { GridHelper } from 't3d/addons/objects/GridHelper.js';\n\t\timport { AxisHelper } from 't3d/addons/objects/AxisHelper.js';\n\t\timport { RouteBuilder } from 't3d/addons/geometries/builders/RouteBuilder.js';\n\t\timport { Texture2DLoader } from 't3d/addons/loaders/Texture2DLoader.js';\n\t\timport { OrbitControls } from 't3d/addons/controls/OrbitControls.js';\n\t\timport { ForwardRenderer } from 't3d/addons/render/ForwardRenderer.js';\n\t\timport { Clock } from 't3d/addons/Clock.js';\n\t\timport { GUI } from './libs/lil-gui.esm.min.js';\n\n\t\tlet width = window.innerWidth || 2;\n\t\tlet height = window.innerHeight || 2;\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = width;\n\t\tcanvas.height = height;\n\t\tdocument.body.appendChild(canvas);\n\n\t\tconst forwardRenderer = new ForwardRenderer(canvas);\n\n\t\tconst scene = new t3d.Scene();\n\n\t\tconst camera = new t3d.Camera();\n\t\tcamera.outputEncoding = t3d.TEXEL_ENCODING_TYPE.SRGB;\n\t\tcamera.position.set(22, 22, 0);\n\t\tcamera.lookAt(new t3d.Vector3(0, 0, -1), new t3d.Vector3(0, 1, 0));\n\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 1000);\n\t\tscene.add(camera);\n\n\t\tconst controller = new OrbitControls(camera, canvas);\n\n\t\tconst ambientLight = new t3d.AmbientLight(0xffffff, 0.5);\n\t\tscene.add(ambientLight);\n\n\t\tconst directionalLight = new t3d.DirectionalLight(0xffffff, 0.7);\n\t\tdirectionalLight.position.set(-20, 20, 0);\n\t\tdirectionalLight.lookAt(new t3d.Vector3(), new t3d.Vector3(0, 1, 0));\n\t\tdirectionalLight.castShadow = true;\n\t\tdirectionalLight.shadow.windowSize = 15;\n\t\tdirectionalLight.shadow.mapSize.set(1024, 1024);\n\t\tdirectionalLight.shadow.bias = -0.0002;\n\t\tdirectionalLight.shadow.normalBias = 0.01;\n\t\tdirectionalLight.shadow.cameraNear = 10;\n\t\tscene.add(directionalLight);\n\n\t\tconst grid = new GridHelper(50, 50, 0xffffff, 0x111111);\n\t\tgrid.position.y = -0.1;\n\t\tscene.add(grid);\n\n\t\tfunction createRoadPoints() {\n\t\t\tconst roadRegionHalfSize = new t3d.Vector2(10, 8);\n\t\t\tconst bridgeHeight = 1.5;\n\t\t\treturn [\n\t\t\t\tnew t3d.Vector3(-roadRegionHalfSize.x, 0, 0),\n\t\t\t\tnew t3d.Vector3(-roadRegionHalfSize.x, 0, roadRegionHalfSize.y),\n\t\t\t\tnew t3d.Vector3(0, 0, 0),\n\t\t\t\tnew t3d.Vector3(roadRegionHalfSize.x, 0, -roadRegionHalfSize.y),\n\t\t\t\tnew t3d.Vector3(roadRegionHalfSize.x, 0, roadRegionHalfSize.y),\n\t\t\t\tnew t3d.Vector3(roadRegionHalfSize.x / 2, 0, roadRegionHalfSize.y / 2),\n\t\t\t\tnew t3d.Vector3(0, bridgeHeight, 0),\n\t\t\t\tnew t3d.Vector3(-roadRegionHalfSize.x / 2, 0, -roadRegionHalfSize.y / 2),\n\t\t\t\tnew t3d.Vector3(-roadRegionHalfSize.x, 0, -roadRegionHalfSize.y)\n\t\t\t];\n\t\t}\n\n\t\tfunction createCurveFrames() {\n\t\t\tconst curvePath3 = new CurvePath3();\n\t\t\tcurvePath3.setBeveledCurves(createRoadPoints(), { close: true, bevelRadius: 3.5 });\n\t\t\treturn curvePath3.computeFrames({ divisions: 12, up: new t3d.Vector3(0, 1, 0) });\n\t\t}\n\n\t\tfunction createRoad(frames) {\n\t\t\tconst texture = new Texture2DLoader().load('./resources/mainroad.jpg');\n\t\t\ttexture.anisotropy = forwardRenderer.capabilities.maxAnisotropy;\n\t\t\ttexture.wrapS = texture.wrapT = t3d.TEXTURE_WRAP.REPEAT;\n\n\t\t\tconst roadMaterial = new t3d.PBRMaterial();\n\t\t\troadMaterial.diffuse.setHex(0x888888);\n\t\t\troadMaterial.diffuseMap = texture;\n\t\t\troadMaterial.side = t3d.DRAW_SIDE.DOUBLE;\n\n\t\t\tconst geometryData = RouteBuilder.getGeometryData(frames, { width: 1.5, side: 'both', arrow: false });\n\t\t\tconst geometry = new t3d.Geometry();\n\t\t\tgeometry.addAttribute('a_Position', new t3d.Attribute(new t3d.Buffer(new Float32Array(geometryData.positions), 3)));\n\t\t\tgeometry.addAttribute('a_Normal', new t3d.Attribute(new t3d.Buffer(new Float32Array(geometryData.normals), 3)));\n\t\t\tgeometry.addAttribute('a_Uv', new t3d.Attribute(new t3d.Buffer(new Float32Array(geometryData.uvs), 2)));\n\t\t\tgeometry.setIndex(new t3d.Attribute(new t3d.Buffer(\n\t\t\t\t(geometryData.positions.length / 3) > 65536 ? new Uint32Array(geometryData.indices) : new Uint16Array(geometryData.indices),\n\t\t\t\t1\n\t\t\t)));\n\t\t\tgeometry.computeBoundingBox();\n\t\t\tgeometry.computeBoundingSphere();\n\n\t\t\tconst route = new t3d.Mesh(geometry, roadMaterial);\n\t\t\troute.receiveShadow = true;\n\t\t\troute.castShadow = true;\n\t\t\tscene.add(route);\n\n\t\t\treturn route;\n\t\t}\n\n\t\tconst up = new t3d.Vector3(0, 1, 0);\n\t\tconst tangent = new t3d.Vector3();\n\t\tconst normal = new t3d.Vector3(0, 1, 0);\n\t\tconst binormal = new t3d.Vector3();\n\t\tconst rotationMatrix = new t3d.Matrix4();\n\t\tfunction getPositionAndQuaternionOnPath(frames, t, position, quaternion) {\n\t\t\tconst totalLength = frames.lengths[frames.lengths.length - 1];\n\t\t\tconst length = totalLength * t;\n\n\t\t\tconst index = frames.lengths.findIndex(l => l >= length);\n\n\t\t\tif (index === 0) {\n\t\t\t\ttangent.copy(frames.tangents[0]);\n\t\t\t\tposition.copy(frames.points[0]);\n\t\t\t} else {\n\t\t\t\tconst previousLength = frames.lengths[index - 1];\n\t\t\t\tconst segmentLength = frames.lengths[index] - previousLength;\n\t\t\t\tconst segmentT = (length - previousLength) / segmentLength;\n\t\t\t\tconst point = frames.points[index];\n\t\t\t\tconst previousPoint = frames.points[index - 1];\n\n\t\t\t\ttangent.copy(point).sub(previousPoint).normalize();\n\t\t\t\tposition.copy(tangent).multiplyScalar(segmentLength * segmentT).add(previousPoint);\n\t\t\t}\n\n\t\t\tbinormal.crossVectors(tangent, up).normalize();\n\t\t\tnormal.crossVectors(binormal, tangent).normalize();\n\n\t\t\trotationMatrix.set(\n\t\t\t\tbinormal.x, binormal.y, binormal.z, 0,\n\t\t\t\tnormal.x, normal.y, normal.z, 0,\n\t\t\t\t-tangent.x, -tangent.y, -tangent.z, 0,\n\t\t\t\t0, 0, 0, 1\n\t\t\t);\n\t\t\trotationMatrix.invert();\n\n\t\t\tquaternion.setFromRotationMatrix(rotationMatrix);\n\t\t}\n\n\t\tconst curveFrames = createCurveFrames();\n\t\tcreateRoad(curveFrames);\n\n\t\tconst car = new t3d.Object3D();\n\t\tconst carMesh = new t3d.Mesh(new t3d.CylinderGeometry(0, 0.25, 1), new t3d.PBRMaterial());\n\t\tcarMesh.material.roughness = 1;\n\t\tcarMesh.material.diffuse.setHex(0x08ff08);\n\t\tcarMesh.euler.set(-Math.PI / 2, 0, 0); // towards the negative z axis.\n\t\tcarMesh.position.y += 0.35;\n\t\tcarMesh.castShadow = true;\n\t\tcar.add(carMesh);\n\t\tconst carAxis = new AxisHelper(1);\n\t\tcarAxis.visible = false;\n\t\tcar.add(carAxis);\n\t\tscene.add(car);\n\n\t\tconst gui = new GUI();\n\t\tconst params = { autoPlay: true, progress: 0 };\n\t\tgui.add(params, 'autoPlay');\n\t\tgui.add(params, 'progress', 0, 1, 0.001).listen();\n\t\tgui.add(carAxis, 'visible').name('car axis');\n\n\t\tconst clock = new Clock();\n\n\t\tfunction loop(count) {\n\t\t\trequestAnimationFrame(loop);\n\n\t\t\tcontroller.update();\n\n\t\t\tconst deltaTime = clock.getDelta();\n\n\t\t\tif (params.autoPlay) {\n\t\t\t\tparams.progress += deltaTime * 0.15;\n\t\t\t\twhile (params.progress >= 1) {\n\t\t\t\t\tparams.progress -= 1;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tgetPositionAndQuaternionOnPath(curveFrames, params.progress, car.position, car.quaternion);\n\n\t\t\tforwardRenderer.render(scene, camera);\n\t\t}\n\t\trequestAnimationFrame(loop);\n\n\t\tfunction onWindowResize() {\n\t\t\twidth = window.innerWidth || 2;\n\t\t\theight = window.innerHeight || 2;\n\n\t\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 1000);\n\n\t\t\tforwardRenderer.screenRenderTarget.resize(width, height);\n\t\t}\n\t\twindow.addEventListener('resize', onWindowResize, false);\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "examples/math_obb.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>t3d - obb test</title>\n\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n\t<link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n</head>\n<body>\n    <div id=\"info\">\n        <a href=\"\" target=\"_blank\">t3d</a> - obb test\n    </div>\n\n\t<!-- Import maps polyfill -->\n    <!-- Remove this when import maps will be widely supported -->\n    <script async src=\"./libs/es-module-shims.js\"></script>\n\n    <script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n    <script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { ForwardRenderer } from 't3d/addons/render/ForwardRenderer.js';\n\t\timport { Timer } from 't3d/addons/misc/Timer.js';\n\t\timport { OBB } from 't3d/addons/math/OBB.js';\n\t\timport { EdgesBuilder } from 't3d/addons/geometries/builders/EdgesBuilder.js';\n\t\timport { OrbitControls } from 't3d/addons/controls/OrbitControls.js';\n\t\timport Stats from './libs/stats.module.js';\n\n\t\tlet width = window.innerWidth || 2;\n\t\tlet height = window.innerHeight || 2;\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = width;\n\t\tcanvas.height = height;\n\t\tdocument.body.appendChild(canvas);\n\n\t\tconst forwardRenderer = new ForwardRenderer(canvas);\n\n\t\tconst scene = new t3d.Scene();\n\n\t\tconst camera = new t3d.Camera();\n\t\tcamera.outputEncoding = t3d.TEXEL_ENCODING_TYPE.SRGB;\n\t\tcamera.position.set(0, 0, 75);\n\t\tcamera.setPerspective(70 / 180 * Math.PI, width / height, 1, 1000);\n\t\tscene.add(camera);\n\n\t\tconst controller = new OrbitControls(camera, canvas);\n\n\t\tconst ambientLight = new t3d.AmbientLight(0xffffff, 0.3);\n\t\tscene.add(ambientLight);\n\n\t\tconst directionalLight = new t3d.DirectionalLight(0xffffff, 0.6);\n\t\tdirectionalLight.position.set(40, 40, 0);\n\t\tdirectionalLight.lookAt(new t3d.Vector3(), new t3d.Vector3(0, 1, 0));\n\t\tscene.add(directionalLight);\n\n\t\t// create objects\n\n\t\tconst objects = [];\n\n\t\tconst size = new t3d.Vector3(10, 5, 6);\n\t\tconst geometry = new t3d.BoxGeometry(size.x, size.y, size.z);\n\n\t\tgeometry.userData = { obb: new OBB() };\n\t\tgeometry.userData.obb.halfSize.copy(size).multiplyScalar(0.5);\n\n\t\tfor (let i = 0; i < 100; i++) {\n\t\t\tconst object = new t3d.Mesh(geometry, new t3d.LambertMaterial());\n\t\t\tobject.matrixAutoUpdate = false;\n\n\t\t\tobject.position.x = Math.random() * 80 - 40;\n\t\t\tobject.position.y = Math.random() * 80 - 40;\n\t\t\tobject.position.z = Math.random() * 80 - 40;\n\n\t\t\tobject.euler.x = Math.random() * 2 * Math.PI;\n\t\t\tobject.euler.y = Math.random() * 2 * Math.PI;\n\t\t\tobject.euler.z = Math.random() * 2 * Math.PI;\n\n\t\t\tobject.scale.x = Math.random() + 0.5;\n\t\t\tobject.scale.y = Math.random() + 0.5;\n\t\t\tobject.scale.z = Math.random() + 0.5;\n\n\t\t\tobject.material.diffuse.setHex(0x00ff00);\n\n\t\t\tscene.add(object);\n\n\t\t\t// bounding volume on object level (this will reflect the current world transform)\n\n\t\t\tobject.userData.obb = new OBB();\n\n\t\t\tobjects.push(object);\n\t\t}\n\n\t\t// mouse picking\n\n\t\tconst geometryData = EdgesBuilder.getGeometryData(\n\t\t\tgeometry.attributes.a_Position.buffer.array,\n\t\t\tgeometry.index.buffer.array,\n\t\t\t{ thresholdAngle: 0.5 }\n\t\t);\n\t\tconst hitboxGeometry = new t3d.Geometry();\n\t\thitboxGeometry.addAttribute('a_Position', new t3d.Attribute(new t3d.Buffer(new Float32Array(geometryData.positions), 3)));\n\t\thitboxGeometry.computeBoundingBox();\n\t\thitboxGeometry.computeBoundingSphere();\n\t\tconst hitboxMaterial = new t3d.BasicMaterial();\n\t\thitboxMaterial.diffuse.setHex(0xffffff);\n\t\thitboxMaterial.drawMode = t3d.DRAW_MODE.LINES;\n\t\tconst hitbox = new t3d.Mesh(hitboxGeometry, hitboxMaterial);\n\n\t\tconst raycaster = new t3d.Raycaster();\n\n\t\tconst mouse = new t3d.Vector2();\n\n\t\tfunction sortIntersections(a, b) {\n\t\t\treturn a.distance - b.distance;\n\t\t}\n\n\t\tfunction onClick(event) {\n\t\t\tevent.preventDefault();\n\n\t\t\tmouse.x = (event.clientX / window.innerWidth) * 2 - 1;\n\t\t\tmouse.y = -(event.clientY / window.innerHeight) * 2 + 1;\n\n\t\t\traycaster.setFromCamera(mouse, camera);\n\n\t\t\tconst intersectionPoint = new t3d.Vector3();\n\t\t\tconst intersections = [];\n\n\t\t\tfor (let i = 0, il = objects.length; i < il; i++) {\n\t\t\t\tconst object = objects[i];\n\t\t\t\tconst obb = object.userData.obb;\n\n\t\t\t\tconst ray = raycaster.ray;\n\n\t\t\t\tif (obb.intersectRay(ray, intersectionPoint) !== null) {\n\t\t\t\t\tconst distance = ray.origin.distanceTo(intersectionPoint);\n\t\t\t\t\tintersections.push({ distance: distance, object: object });\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (intersections.length > 0) {\n\t\t\t\t// determine closest intersection and highlight the respective 3D object\n\n\t\t\t\tintersections.sort(sortIntersections);\n\n\t\t\t\tintersections[0].object.add(hitbox);\n\t\t\t} else {\n\t\t\t\tconst parent = hitbox.parent;\n\n\t\t\t\tif (parent) parent.remove(hitbox);\n\t\t\t}\n\t\t}\n\n\t\tdocument.addEventListener('click', onClick);\n\n\t\t//\n\n\t\tconst stats = new Stats();\n\t\tstats.showPanel(0);\n\t\tdocument.body.appendChild(stats.dom);\n\n\t\tconst timer = new Timer();\n\n\t\tfunction loop(timestamp) {\n\t\t\trequestAnimationFrame(loop);\n\n\t\t\tstats.begin();\n\n\t\t\ttimer.update(timestamp);\n\n\t\t\tcontroller.update();\n\n\t\t\t// transform boxes\n\n\t\t\tconst delta = timer.getDelta();\n\n\t\t\tfor (let i = 0, il = objects.length; i < il; i++) {\n\t\t\t\tconst object = objects[i];\n\n\t\t\t\tobject.euler.x += delta * Math.PI * 0.20;\n\t\t\t\tobject.euler.y += delta * Math.PI * 0.1;\n\n\t\t\t\tobject.matrixNeedsUpdate = true;\n\n\t\t\t\t// update OBB\n\n\t\t\t\tobject.userData.obb.copy(object.geometry.userData.obb);\n\t\t\t\tobject.userData.obb.applyMatrix4(object.worldMatrix);\n\n\t\t\t\t// reset\n\n\t\t\t\tobject.material.diffuse.setHex(0x00ff00);\n\t\t\t}\n\n\t\t\t// collision detection\n\n\t\t\tfor (let i = 0, il = objects.length; i < il; i++) {\n\t\t\t\tconst object = objects[i];\n\t\t\t\tconst obb = object.userData.obb;\n\n\t\t\t\tfor (let j = i + 1, jl = objects.length; j < jl; j++) {\n\t\t\t\t\tconst objectToTest = objects[j];\n\t\t\t\t\tconst obbToTest = objectToTest.userData.obb;\n\n\t\t\t\t\t// now perform intersection test\n\n\t\t\t\t\tif (obb.intersectsOBB(obbToTest) === true) {\n\t\t\t\t\t\tobject.material.diffuse.setHex(0xff0000);\n\t\t\t\t\t\tobjectToTest.material.diffuse.setHex(0xff0000);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tforwardRenderer.render(scene, camera);\n\n\t\t\tstats.end();\n\t\t}\n\t\trequestAnimationFrame(loop);\n\n\t\tfunction onWindowResize() {\n\t\t\twidth = window.innerWidth || 2;\n\t\t\theight = window.innerHeight || 2;\n\n\t\t\tcamera.setPerspective(70 / 180 * Math.PI, width / height, 1, 1000);\n\n\t\t\tforwardRenderer.screenRenderTarget.resize(width, height);\n\t\t}\n\t\twindow.addEventListener('resize', onWindowResize, false);\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "examples/math_octree.html",
    "content": "<!DOCTYPE html>\n<html>\n\n<head>\n    <meta charset=\"utf-8\">\n    <title>t3d - octree</title>\n    <meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n    <link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n\n<body>\n    <div id=\"info\">\n        <a href=\"\" target=\"_blank\">t3d</a> - octree\n    </div>\n\n    <script src=\"./libs/nanobar.js\"></script>\n\n    <!-- Import maps polyfill -->\n    <!-- Remove this when import maps will be widely supported -->\n    <script async src=\"./libs/es-module-shims.js\"></script>\n\n    <script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n    <script type=\"module\">\n        import * as t3d from 't3d';\n        import { GLTFLoader } from 't3d/addons/loaders/glTF/GLTFLoader.js';\n        import { OrbitControls } from 't3d/addons/controls/OrbitControls.js';\n        import { ForwardRenderer } from 't3d/addons/render/ForwardRenderer.js';\n        import { TrianglesOctree } from 't3d/addons/math/TrianglesOctree.js';\n        import { OctreeHelper } from 't3d/addons/objects/OctreeHelper.js';\n        import { GUI } from './libs/lil-gui.esm.min.js';\n        import Stats from './libs/stats.module.js';\n\n        let width = window.innerWidth || 2;\n        let height = window.innerHeight || 2;\n\n        const canvas = document.createElement('canvas');\n        canvas.width = width * window.devicePixelRatio;\n        canvas.height = height * window.devicePixelRatio;\n        canvas.style.width = width + 'px';\n        canvas.style.height = height + 'px';\n        document.body.appendChild(canvas);\n\n        const forwardRenderer = new ForwardRenderer(canvas);\n\n        const scene = new t3d.Scene();\n\n        const ambientLight = new t3d.AmbientLight(undefined, 0.4);\n        ambientLight.color.setRGB(0.6, 0.7, 0.8);\n        scene.add(ambientLight);\n\n        const directionalLight = new t3d.DirectionalLight(0xffffff, 0.8);\n        directionalLight.position.set(-10, 10, 10);\n        directionalLight.lookAt(new t3d.Vector3(), new t3d.Vector3(0, 1, 0));\n        scene.add(directionalLight);\n\n        const camera = new t3d.Camera();\n        camera.outputEncoding = t3d.TEXEL_ENCODING_TYPE.SRGB;\n        camera.position.set(-80, 50, 80);\n        camera.lookAt(new t3d.Vector3(0, 20, 0), new t3d.Vector3(0, 1, 0));\n        camera.setPerspective(45 / 180 * Math.PI, width / height, 1, 8000);\n        scene.add(camera);\n\n        const nanobar = new Nanobar();\n        nanobar.el.style.background = 'gray';\n\n        const loadingManager = new t3d.LoadingManager(function() {\n        \tnanobar.go(100);\n        \tnanobar.el.style.background = 'transparent';\n        }, function(url, itemsLoaded, itemsTotal) {\n        \tif (itemsLoaded < itemsTotal) {\n        \t\tnanobar.go(itemsLoaded / itemsTotal * 100);\n        \t}\n        });\n\n        const loader = new GLTFLoader(loadingManager);\n        loader.autoLogError = false;\n\n        console.time('GLTFLoader');\n        loader.load(\n        \t'./resources/models/gltf/bust_of_woman/glTF/bust_of_woman.gltf'\n        ).then(function(result) {\n        \tconsole.timeEnd('GLTFLoader');\n\n        \tconst object = result.root;\n        \tscene.add(object);\n\n        \tscene.updateMatrix();\n        \n        \tconsole.time('generate-octree');\n        \tlet worldOctree = TrianglesOctree.fromNode(object, 3);\n        \tconsole.timeEnd('generate-octree');\n\n        \tconst helper = new OctreeHelper();\n        \thelper.frustumCulled = false;\n        \tconsole.time('helper-update');\n        \thelper.update(worldOctree, false);\n        \tconsole.timeEnd('helper-update');\n        \tscene.add(helper);\n\n        \tconst gui = new GUI();\n        \tgui.add({ maxDepth: 3 }, 'maxDepth', [0, 1, 2, 3, 4]).onChange(value => {\n        \t\tconsole.time('generate-octree');\n        \t\tworldOctree = TrianglesOctree.fromNode(object, value);\n        \t\tconsole.timeEnd('generate-octree');\n        \t\tconsole.time('helper-update');\n        \t\thelper.update(worldOctree, false);\n        \t\tconsole.timeEnd('helper-update');\n        \t});\n        \tgui.add(helper, 'visible').name('debugger');\n        }).catch(e => console.error(e));\n\n        const controller = new OrbitControls(camera, canvas);\n        controller.target.set(0, 20, 0);\n\n        // stats\n        const stats = new Stats();\n        stats.showPanel(0);\n        document.body.appendChild(stats.dom);\n\n        function loop(count) {\n        \trequestAnimationFrame(loop);\n\n        \tstats.begin();\n\n        \tcontroller.update();\n\n        \tforwardRenderer.render(scene, camera);\n        \tstats.end();\n        }\n        requestAnimationFrame(loop);\n\n        function onWindowResize() {\n        \twidth = window.innerWidth || 2;\n        \theight = window.innerHeight || 2;\n\n        \tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 8000);\n\n        \tforwardRenderer.screenRenderTarget.resize(width * window.devicePixelRatio, height * window.devicePixelRatio);\n\n        \tcanvas.style.width = width + 'px';\n        \tcanvas.style.height = height + 'px';\n        }\n        window.addEventListener('resize', onWindowResize, false);\n    </script>\n</body>\n\n</html>"
  },
  {
    "path": "examples/navigation_pathfinding.html",
    "content": "<!DOCTYPE html>\n<html>\n\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>t3d - navigation path finding</title>\n\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n\t<link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n</head>\n<body>\n\t<div id=\"info\">\n\t\t<a href=\"https://github.com/uinosoft/t3d.js\" target=\"_blank\">t3d</a> - \n\t\tnavigation path finding reference to <a href=\"https://github.com/donmccurdy/three-pathfinding\" target=\"_blank\" rel=\"noopener\">three-pathfinding</a><br/>\n\t\t<strong>Controls:</strong> LeftClick: Set start/destination | RightClick/Ctrl+LeftClick: Reset path\n\t</div>\n\n\t<script src=\"./libs/nanobar.js\"></script>\n\n\t<!-- Import maps polyfill -->\n\t<!-- Remove this when import maps will be widely supported -->\n\t<script async src=\"./libs/es-module-shims.js\"></script>\n\n\t<script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n\t<script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { ForwardRenderer } from 't3d/addons/render/ForwardRenderer.js';\n\t\timport { OrbitControls } from 't3d/addons/controls/OrbitControls.js';\n\t\timport { TriangleSoup } from 't3d/addons/math/TriangleSoup.js';\n\t\timport { TriangleSoupHelper } from 't3d/addons/objects/TriangleSoupHelper.js';\n\t\timport { GeometryUtils } from 't3d/addons/geometries/GeometryUtils.js';\n\t\timport { GLTFLoader } from 't3d/addons/loaders/glTF/GLTFLoader.js';\n\t\timport { Pathfinding } from 't3d/addons/navigation/Pathfinding.js';\n\t\timport { Zone } from 't3d/addons/navigation/Zone.js';\n\t\timport { PathfindingHelper } from 't3d/addons/navigation/PathfindingHelper.js';\n\n\t\tlet width = window.innerWidth || 2;\n\t\tlet height = window.innerHeight || 2;\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = width;\n\t\tcanvas.height = height;\n\t\tdocument.body.appendChild(canvas);\n\n\t\tconst forwardRenderer = new ForwardRenderer(canvas);\n\n\t\tconst scene = new t3d.Scene();\n\n\t\tconst camera = new t3d.Camera();\n\t\tcamera.outputEncoding = t3d.TEXEL_ENCODING_TYPE.SRGB;\n\t\tcamera.position.set(0, 10, 13);\n\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 0.1, 1000);\n\t\tscene.add(camera);\n\n\t\tconst controls = new OrbitControls(camera, canvas);\n\n\t\tconst ambientLight = new t3d.AmbientLight(0xffffff, 0.2);\n\t\tscene.add(ambientLight);\n\n\t\tconst directionalLight = new t3d.DirectionalLight(0xffffff, 1);\n\t\tdirectionalLight.position.set(6, 8, 4);\n\t\tdirectionalLight.lookAt(new t3d.Vector3(0, 0, 0), new t3d.Vector3(0, 1, 0));\n\t\tdirectionalLight.castShadow = true;\n\t\tdirectionalLight.shadow.windowSize = 25;\n\t\tdirectionalLight.shadow.mapSize.set(512, 512);\n\t\tdirectionalLight.shadow.cameraNear = 0.1;\n\t\tdirectionalLight.shadow.cameraFar = 50;\n\t\tscene.add(directionalLight);\n\n\t\t// gltf loader\n\n\t\tconst nanobar = new Nanobar();\n\t\tnanobar.el.style.background = 'gray';\n\n\t\tconst loadingManager = new t3d.LoadingManager(function() {\n\t\t\tnanobar.go(100);\n\t\t\tnanobar.el.style.background = 'transparent';\n\t\t}, function(url, itemsLoaded, itemsTotal) {\n\t\t\tif (itemsLoaded < itemsTotal) {\n\t\t\t\tnanobar.go((itemsLoaded / itemsTotal) * 100);\n\t\t\t}\n\t\t});\n\n\t\tconst gltfLoader = new GLTFLoader(loadingManager);\n\n\t\t// load model\n\n\t\tgltfLoader.load('./resources/navigation/level.glb').then(result => {\n\t\t\tresult.root.traverse(node => {\n\t\t\t\tif (!node.isMesh) return;\n\t\t\t\tGeometryUtils.computeNormals(node.geometry);\n\t\t\t\tnode.receiveShadow = true;\n\t\t\t\tnode.castShadow = true;\n\t\t\t});\n\n\t\t\tscene.add(result.root);\n\t\t}).catch(function(e) {\n\t\t\tconsole.error(e);\n\t\t});\n\n\t\t// load navmesh\n\n\t\tgltfLoader.load('./resources/navigation/level.nav.glb').then(function(gltf) {\n\t\t\tconst navMesh = gltf.root.children[0];\n\t\t\n\t\t\tconst triangleSoup = new TriangleSoup();\n\t\t\ttriangleSoup.addMesh(navMesh, new t3d.Matrix4());\n\t\t\ttriangleSoup.mergeVertices();\n\n\t\t\tconst triangleSoupHelper = new TriangleSoupHelper(triangleSoup);\n\t\t\ttriangleSoupHelper.wireframe(true);\n\t\t\ttriangleSoupHelper.mesh.isNavMesh = true;\n\t\t\tscene.add(triangleSoupHelper);\n\n\t\t\tzone = Zone.createFromTriangleSoup(triangleSoup);\n\t\t}).catch(function(e) {\n\t\t\tconsole.error(e);\n\t\t});\n\n\t\t// User interaction\n\n\t\tconst pathfindingHelper = new PathfindingHelper();\n\t\tscene.add(pathfindingHelper);\n\n\t\tconst SPEED = 10;\n\n\t\tlet path, zone, settedPlayerPosition = false;\n\n\t\tconst playerPosition = new t3d.Vector3();\n\t\tconst targetPosition = new t3d.Vector3();\n\n\t\tconst mouse = new t3d.Vector2();\n\t\tconst mouseDown = new t3d.Vector2();\n\t\tconst raycaster = new t3d.Raycaster();\n\n\t\tfunction onDocumentPointerDown(event) {\n\t\t\tmouseDown.x = (event.clientX / window.innerWidth) * 2 - 1;\n\t\t\tmouseDown.y = -(event.clientY / window.innerHeight) * 2 + 1;\n\t\t}\n\n\t\tfunction onDocumentPointerUp(event) {\n\t\t\tif (event.ctrlKey || event.metaKey || event.button === 2) {\n\t\t\t\tpath = null;\n\t\t\t\tpathfindingHelper.reset();\n\t\t\t\tsettedPlayerPosition = false;\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tmouse.x = (event.clientX / window.innerWidth) * 2 - 1;\n\t\t\tmouse.y = -(event.clientY / window.innerHeight) * 2 + 1;\n\n\t\t\tif (\n\t\t\t\tMath.abs(mouseDown.x - mouse.x) > 0 ||\n\t\t\t\tMath.abs(mouseDown.y - mouse.y) > 0\n\t\t\t) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\traycaster.setFromCamera(mouse, camera);\n\n\t\t\tconst intersects = raycaster.intersectObject(scene, true);\n\n\t\t\tif (!intersects.length) return;\n\t\t\tif (!intersects[0].object.isNavMesh) return;\n\n\t\t\ttargetPosition.copy(intersects[0].point);\n\n\t\t\tpathfindingHelper.reset().setPlayerPosition(playerPosition);\n\n\t\t\tif (!settedPlayerPosition) {\n\t\t\t\tpath = null;\n\t\t\t\tsettedPlayerPosition = true;\n\t\t\t\tplayerPosition.copy(targetPosition);\n\t\t\t\tpathfindingHelper.setPlayerPosition(playerPosition);\n\t\t\t\treturn;\n\t\t\t} else {\n\t\t\t\tpathfindingHelper.setTargetPosition(targetPosition);\n\n\t\t\t\t// Calculate a path to the target and store it\n\t\t\t\tpath = Pathfinding.findPath(playerPosition, targetPosition, zone);\n\t\t\t\tif (path && path.length) {\n\t\t\t\t\tpathfindingHelper.setPath(path);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tdocument.addEventListener('pointerdown', onDocumentPointerDown, false);\n\t\tdocument.addEventListener('pointerup', onDocumentPointerUp, false);\n\n\t\t//\n\n\t\tfunction move() {\n\t\t\tif (!(path || []).length) return;\n\n\t\t\tconst targetPosition = path[0];\n\t\t\tconst velocity = targetPosition.clone().sub(playerPosition);\n\t\t\tif (velocity.getLengthSquared() > 0.08 * 0.08) {\n\t\t\t\tvelocity.normalize();\n\t\t\t\t// Move player to target\n\t\t\t\tplayerPosition.add(velocity.multiplyScalar(0.016 * SPEED));\n\t\t\t\tpathfindingHelper.setPlayerPosition(playerPosition);\n\t\t\t} else {\n\t\t\t\t// Remove node from the path we calculated\n\t\t\t\tpath.shift();\n\t\t\t}\n\t\t}\n\n\t\tfunction loop(count) {\n\t\t\trequestAnimationFrame(loop);\n\n\t\t\tcontrols.update();\n\n\t\t\tmove();\n\n\t\t\tforwardRenderer.render(scene, camera);\n\t\t}\n\t\trequestAnimationFrame(loop);\n\n\t\tfunction onWindowResize() {\n\t\t\twidth = window.innerWidth || 2;\n\t\t\theight = window.innerHeight || 2;\n\n\t\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 0.1, 1000);\n\n\t\t\tforwardRenderer.screenRenderTarget.resize(width, height);\n\t\t}\n\t\twindow.addEventListener('resize', onWindowResize, false);\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "examples/navigation_recast_crowd.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>t3d - navigation recast crowd</title>\n\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n\t<link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n<body>\n\t<div id=\"info\">\n\t\t<a href=\"https://github.com/uinosoft/t3d.js\" target=\"_blank\">t3d</a> - \n\t\tNavigation recast crowd using <a href=\"https://github.com/isaac-mason/recast-navigation-js\" target=\"_blank\">recast-navigation-js</a><br/>\n\t\t<strong>Controls:</strong> Click to move all agents to that position\n\t</div>\n\n\t<script src=\"./libs/nanobar.js\"></script>\n\n\t<!-- Import maps polyfill -->\n\t<!-- Remove this when import maps will be widely supported -->\n\t<script async src=\"./libs/es-module-shims.js\"></script>\n\n\t<script type=\"importmap\">\n\t\t{\n\t\t\t\"imports\": {\n\t\t\t\t\"t3d\": \"../build/t3d.module.js\",\n\t\t\t\t\"t3d/addons/\": \"./jsm/\",\n\t\t\t\t\"@recast-navigation/core\": \"https://cdn.skypack.dev/@recast-navigation/core@latest\"\n            }\n        }\n    </script>\n\n\t<script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { Timer } from 't3d/addons/misc/Timer.js';\n\t\timport { GLTFLoader } from 't3d/addons/loaders/glTF/GLTFLoader.js';\n\t\timport { OrbitControls } from 't3d/addons/controls/OrbitControls.js';\n\t\timport { CapsuleGeometry } from 't3d/addons/geometries/CapsuleGeometry.js';\n\t\timport { GeometryUtils } from 't3d/addons/geometries/GeometryUtils.js';\n\t\timport { TriangleSoupHelper } from 't3d/addons/objects/TriangleSoupHelper.js';\n\t\timport { TriangleSoup } from 't3d/addons/math/TriangleSoup.js';\n\t\timport { ForwardRenderer } from 't3d/addons/render/ForwardRenderer.js';\n\t\timport { GUI } from './libs/lil-gui.esm.min.js';\n\t\timport Stats from './libs/stats.module.js';\n\t\timport { init, NavMeshQuery, Crowd, getNavMeshPositionsAndIndices, importNavMesh } from '@recast-navigation/core';\n\n\t\tinit().then(async () => {\n\t\t\tlet width = window.innerWidth || 2;\n\t\t\tlet height = window.innerHeight || 2;\n\n\t\t\tconst canvas = document.createElement('canvas');\n\t\t\tcanvas.width = width * window.devicePixelRatio;\n\t\t\tcanvas.height = height * window.devicePixelRatio;\n\t\t\tcanvas.style.width = width + 'px';\n\t\t\tcanvas.style.height = height + 'px';\n\t\t\tdocument.body.appendChild(canvas);\n\n\t\t\tconst forwardRenderer = new ForwardRenderer(canvas);\n\n\t\t\tconst scene = new t3d.Scene();\n\n\t\t\tconst ambientLight = new t3d.AmbientLight(0xffffff, 0.2);\n\t\t\tscene.add(ambientLight);\n\n\t\t\tconst directionalLight = new t3d.DirectionalLight(0xffffff, 1);\n\t\t\tdirectionalLight.position.set(6, 10, 6);\n\t\t\tdirectionalLight.lookAt(new t3d.Vector3(0, 0, 0), new t3d.Vector3(0, 1, 0));\n\t\t\tdirectionalLight.castShadow = true;\n\t\t\tdirectionalLight.shadow.windowSize = 25;\n\t\t\tdirectionalLight.shadow.mapSize.set(512, 512);\n\t\t\tdirectionalLight.shadow.cameraNear = 0.1;\n\t\t\tdirectionalLight.shadow.cameraFar = 50;\n\t\t\tscene.add(directionalLight);\n\n\t\t\tconst camera = new t3d.Camera();\n\t\t\tcamera.outputEncoding = t3d.TEXEL_ENCODING_TYPE.SRGB;\n\t\t\tcamera.position.set(0, 15, 15);\n\t\t\tcamera.lookAt(new t3d.Vector3(0, 0, 0), new t3d.Vector3(0, 1, 0));\n\t\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 0.1, 1000);\n\t\t\tscene.add(camera);\n\n\t\t\tconst controller = new OrbitControls(camera, canvas);\n\n\t\t\t// gltf loader\n\n\t\t\tconst nanobar = new Nanobar();\n\t\t\tnanobar.el.style.background = 'gray';\n\n\t\t\tconst loadingManager = new t3d.LoadingManager(function() {\n\t\t\t\tnanobar.go(100);\n\t\t\t\tnanobar.el.style.background = 'transparent';\n\t\t\t}, function(url, itemsLoaded, itemsTotal) {\n\t\t\t\tif (itemsLoaded < itemsTotal) {\n\t\t\t\t\tnanobar.go((itemsLoaded / itemsTotal) * 100);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tconst gltfLoader = new GLTFLoader(loadingManager);\n\n\t\t\t// load the scene model\n\n\t\t\tconst { root: sceneModel } = await gltfLoader.load('./resources/navigation/level.glb')\n\t\t\t\t.then(result => {\n\t\t\t\t\tresult.root.traverse(node => {\n\t\t\t\t\t\tif (!node.isMesh) return;\n\t\t\t\t\t\tnode.castShadow = true;\n\t\t\t\t\t\tnode.receiveShadow = true;\n\t\t\t\t\t\tGeometryUtils.computeNormals(node.geometry);\n\t\t\t\t\t});\n\t\t\t\t\treturn result;\n\t\t\t\t});\n\t\t\tscene.add(sceneModel);\n\n\t\t\t// init navigation\n\n\t\t\tconst navMesh = await fetch('./resources/navigation/level.nav.bin')\n\t\t\t\t.then(response => response.arrayBuffer())\n\t\t\t\t.then(data => {\n\t\t\t\t\tconst { navMesh } = importNavMesh(new Uint8Array(data));\n\t\t\t\t\treturn navMesh;\n\t\t\t\t});\n\n\t\t\tconst navMeshQuery = new NavMeshQuery(navMesh);\n\n\t\t\tconst [positions, indices] = getNavMeshPositionsAndIndices(navMesh);\n\t\t\n\t\t\tconst triangleSoup = new TriangleSoup();\n\t\t\ttriangleSoup.positions = positions;\n\t\t\ttriangleSoup.indices = indices;\n\t\t\n\t\t\tconst triangleSoupHelper = new TriangleSoupHelper(triangleSoup);\n\t\t\ttriangleSoupHelper.wireframe(true);\n\t\t\ttriangleSoupHelper.position.y = 0.05;\n\t\t\tscene.add(triangleSoupHelper);\n\n\t\t\t// Create crowd and agents\n\n\t\t\tconst agentCount = 300;\n\t\t\tconst agentRadius = 0.05;\n\n\t\t\tconst crowd = new Crowd(navMesh, {\n\t\t\t\tmaxAgents: agentCount,\n\t\t\t\tmaxAgentRadius: agentRadius\n\t\t\t});\n\n\t\t\tconst agentObjects = [];\n\t\t\tconst agentMap = new WeakMap();\n\t\t\n\t\t\tconst agentGeometry = new CapsuleGeometry(agentRadius, 0.1, 10, 10);\n\t\t\tfor (let i = 0; i < agentCount; i++) {\n\t\t\t\tconst { randomPoint } =\n\t\t\t\t\tnavMeshQuery.findRandomPointAroundCircle({ x: -0.2, y: 3, z: 2.3 }, 2);\n\t\t\n\t\t\t\tconst agent = crowd.addAgent(randomPoint, {\n\t\t\t\t\tradius: agentRadius, // Radius of the agent. World Unit.\n\t\t\t\t\theight: 0.2, // Heigh in World Unit.\n\t\t\t\t\tmaxAcceleration: 10.0, // Acceleration max in World Unit per second.\n\t\t\t\t\tmaxSpeed: 5.0, // Max speed in World Unit per second.\n\t\t\t\t\tseparationWeight: 0.5, // How hard the system will try to separate the agent. A Value of 0 means it will not try and agents might collide.\n\t\t\t\t\tcollisionQueryRange: agentRadius * 2, // The agent collision system will take care of others within that radius in World Unit.\n    \t\t\t\tpathOptimizationRange: 0.0 // How the path will be optimized and made more straight.\n\t\t\t\t});\n\t\t\n\t\t\t\tconst agentMesh = new t3d.Mesh(agentGeometry, new t3d.LambertMaterial());\n\t\t\t\tagentMesh.material.diffuse.setHSL(i / agentCount, 0.7, 0.5);\n\t\t\t\tagentMesh.position.y = 0.1;\n\t\t\t\tagentMesh.castShadow = true;\n\t\t\t\tagentMesh.receiveShadow = true;\n\t\t\n\t\t\t\tconst agentObject = new t3d.Object3D();\n\t\t\t\tagentObject.position.copy(randomPoint);\n\t\t\t\tagentObject.add(agentMesh);\n\t\t\t\tscene.add(agentObject);\n\n\t\t\t\tagentObjects.push(agentObject);\n\t\t\t\tagentMap.set(agentObject, agent);\n\t\t\t}\n\n\t\t\tfunction updateAgents(dt) {\n\t\t\t\tcrowd.update(dt);\n\n\t\t\t\tfor (let i = 0, l = agentObjects.length; i < l; i++) {\n\t\t\t\t\tconst agentObject = agentObjects[i];\n\t\t\t\t\tconst agent = agentMap.get(agentObject);\n\t\t\t\t\tif (agent) {\n\t\t\t\t\t\tconst position = agent.position();\n\t\t\t\t\t\tagentObject.position.set(position.x, position.y, position.z);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// user interaction\n\n\t\t\tconst targetRadius = 1.5;\n\n\t\t\tconst markerSize = 0.2;\n\t\t\tconst targetMarker = new t3d.Mesh(\n\t\t\t\tnew t3d.BoxGeometry(markerSize, markerSize, markerSize),\n\t\t\t\tnew t3d.BasicMaterial()\n\t\t\t);\n\t\t\ttargetMarker.material.diffuse.setRGB(1, 0.5, 0);\n\t\t\ttargetMarker.visible = false;\n\t\t\tscene.add(targetMarker);\n\t\t\n\t\t\tconst raycaster = new t3d.Raycaster();\n\t\t\tconst mouse = new t3d.Vector2();\n\t\t\tconst mouseDown = new t3d.Vector2();\n\n\t\t\tfunction onPointerDown(event) {\n\t\t\t\tmouseDown.x = (event.clientX / width) * 2 - 1;\n\t\t\t\tmouseDown.y = -(event.clientY / height) * 2 + 1;\n\t\t\t}\n\n\t\t\tfunction onPointerUp(event) {\n\t\t\t\tmouse.x = (event.clientX / width) * 2 - 1;\n\t\t\t\tmouse.y = -(event.clientY / height) * 2 + 1;\n\n\t\t\t\tif (\n\t\t\t\t\tMath.abs(mouseDown.x - mouse.x) > 0.01 ||\n\t\t\t\t\tMath.abs(mouseDown.y - mouse.y) > 0.01\n\t\t\t\t) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\traycaster.setFromCamera(mouse, camera);\n\t\t\n\t\t\t\tconst intersects = raycaster.intersectObject(sceneModel, true);\n\t\t\n\t\t\t\tif (intersects.length > 0) {\n\t\t\t\t\tconst hitPoint = intersects[0].point;\n\t\t\n\t\t\t\t\tconst { point, polyRef } = navMeshQuery.findClosestPoint(hitPoint);\n\n\t\t\t\t\tif (polyRef) {\n\t\t\t\t\t\ttargetMarker.visible = true;\n\t\t\t\t\t\ttargetMarker.position.copy(point);\n\n\t\t\t\t\t\tfor (const agent of crowd.getAgents()) {\n\t\t\t\t\t\t\tconst { randomPoint } = navMeshQuery.findRandomPointAroundCircle(point, targetRadius);\n\t\t\t\t\t\t\tagent.requestMoveTarget(randomPoint);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tdocument.addEventListener('pointerdown', onPointerDown, false);\n\t\t\tdocument.addEventListener('pointerup', onPointerUp, false);\n\n\t\t\t// gui\n\t\t\n\t\t\tconst gui = new GUI().close();\n\t\t\tconst debugFolder = gui.addFolder('Debug');\n\t\t\tdebugFolder.add(sceneModel, 'visible').name('Scene Model');\n\t\t\tdebugFolder.add(triangleSoupHelper, 'visible').name('Nav Mesh');\n\t\t\n\t\t\t//\n\n\t\t\tconst stats = new Stats();\n\t\t\tstats.showPanel(0);\n\t\t\tdocument.body.appendChild(stats.dom);\n\n\t\t\tconst timer = new Timer();\n\n\t\t\tfunction loop(timestamp) {\n\t\t\t\trequestAnimationFrame(loop);\n\n\t\t\t\tstats.begin();\n\n\t\t\t\ttimer.update(timestamp);\n\n\t\t\t\tcontroller.update();\n\n\t\t\t\tconst deltaTime = Math.min(timer.getDelta(), 1 / 60);\n\t\t\n\t\t\t\tupdateAgents(deltaTime);\n\t\t\n\t\t\t\tforwardRenderer.render(scene, camera);\n\n\t\t\t\tstats.end();\n\t\t\t}\n\t\t\trequestAnimationFrame(loop);\n\n\t\t\tfunction onWindowResize() {\n\t\t\t\twidth = window.innerWidth || 2;\n\t\t\t\theight = window.innerHeight || 2;\n\n\t\t\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 0.1, 1000);\n\n\t\t\t\tforwardRenderer.screenRenderTarget.resize(width * window.devicePixelRatio, height * window.devicePixelRatio);\n\n\t\t\t\tcanvas.style.width = width + 'px';\n\t\t\t\tcanvas.style.height = height + 'px';\n\t\t\t}\n\t\t\twindow.addEventListener('resize', onWindowResize, false);\n\t\t});\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "examples/navigation_recast_generation.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>t3d - navigation recast generation</title>\n\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n\t<link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n<body>\n\t<div id=\"info\">\n\t\t<a href=\"https://github.com/uinosoft/t3d.js\" target=\"_blank\">t3d</a> - \n\t\tNavigation mesh generation using <a href=\"https://github.com/isaac-mason/recast-navigation-js\" target=\"_blank\">recast-navigation-js</a><br/>\n\t\t<strong>Controls:</strong> Click to move agent\n\t</div>\n\n\t<script src=\"./libs/nanobar.js\"></script>\n\n\t<!-- Import maps polyfill -->\n\t<!-- Remove this when import maps will be widely supported -->\n\t<script async src=\"./libs/es-module-shims.js\"></script>\n\n\t<script type=\"importmap\">\n\t\t{\n\t\t\t\"imports\": {\n\t\t\t\t\"t3d\": \"../build/t3d.module.js\",\n\t\t\t\t\"t3d/addons/\": \"./jsm/\",\n\t\t\t\t\"@recast-navigation/core\": \"https://cdn.skypack.dev/@recast-navigation/core@0.39\",\n\t\t\t\t\"@recast-navigation/generators\": \"https://cdn.skypack.dev/@recast-navigation/generators@0.39\"\n            }\n        }\n    </script>\n\n\t<script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { Timer } from 't3d/addons/misc/Timer.js';\n\t\timport { GLTFLoader } from 't3d/addons/loaders/glTF/GLTFLoader.js';\n\t\timport { OrbitControls } from 't3d/addons/controls/OrbitControls.js';\n\t\timport { CapsuleGeometry } from 't3d/addons/geometries/CapsuleGeometry.js';\n\t\timport { GeometryUtils } from 't3d/addons/geometries/GeometryUtils.js';\n\t\timport { TriangleSoupHelper } from 't3d/addons/objects/TriangleSoupHelper.js';\n\t\timport { TriangleSoup } from 't3d/addons/math/TriangleSoup.js';\n\t\timport { ForwardRenderer } from 't3d/addons/render/ForwardRenderer.js';\n\t\timport { GUI } from './libs/lil-gui.esm.min.js';\n\t\timport { init, NavMeshQuery, exportNavMesh, getNavMeshPositionsAndIndices } from '@recast-navigation/core';\n\t\timport { generateSoloNavMesh } from '@recast-navigation/generators';\n\n\t\tinit().then(async () => {\n\t\t\tlet width = window.innerWidth || 2;\n\t\t\tlet height = window.innerHeight || 2;\n\n\t\t\tconst canvas = document.createElement('canvas');\n\t\t\tcanvas.width = width * window.devicePixelRatio;\n\t\t\tcanvas.height = height * window.devicePixelRatio;\n\t\t\tcanvas.style.width = width + 'px';\n\t\t\tcanvas.style.height = height + 'px';\n\t\t\tdocument.body.appendChild(canvas);\n\n\t\t\tconst forwardRenderer = new ForwardRenderer(canvas);\n\n\t\t\tconst scene = new t3d.Scene();\n\n\t\t\tconst ambientLight = new t3d.AmbientLight(0xffffff, 0.2);\n\t\t\tscene.add(ambientLight);\n\n\t\t\tconst directionalLight = new t3d.DirectionalLight(0xffffff, 1);\n\t\t\tdirectionalLight.position.set(6, 10, 6);\n\t\t\tdirectionalLight.lookAt(new t3d.Vector3(0, 0, 0), new t3d.Vector3(0, 1, 0));\n\t\t\tdirectionalLight.castShadow = true;\n\t\t\tdirectionalLight.shadow.windowSize = 25;\n\t\t\tdirectionalLight.shadow.mapSize.set(512, 512);\n\t\t\tdirectionalLight.shadow.cameraNear = 0.1;\n\t\t\tdirectionalLight.shadow.cameraFar = 50;\n\t\t\tscene.add(directionalLight);\n\n\t\t\tconst camera = new t3d.Camera();\n\t\t\tcamera.outputEncoding = t3d.TEXEL_ENCODING_TYPE.SRGB;\n\t\t\tcamera.position.set(0, 15, 15);\n\t\t\tcamera.lookAt(new t3d.Vector3(0, 0, 0), new t3d.Vector3(0, 1, 0));\n\t\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 0.1, 1000);\n\t\t\tscene.add(camera);\n\n\t\t\tconst controller = new OrbitControls(camera, canvas);\n\n\t\t\t// Create obstacles and ground\n\n\t\t\tconst nanobar = new Nanobar();\n\t\t\tnanobar.el.style.background = 'gray';\n\n\t\t\tconst loadingManager = new t3d.LoadingManager(function() {\n\t\t\t\tnanobar.go(100);\n\t\t\t\tnanobar.el.style.background = 'transparent';\n\t\t\t}, function(url, itemsLoaded, itemsTotal) {\n\t\t\t\tif (itemsLoaded < itemsTotal) {\n\t\t\t\t\tnanobar.go((itemsLoaded / itemsTotal) * 100);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tconst gltfLoader = new GLTFLoader(loadingManager);\n\n\t\t\tconst { root: sceneModel } = await gltfLoader.load('./resources/navigation/level.glb')\n\t\t\t\t.then(result => {\n\t\t\t\t\tresult.root.traverse(node => {\n\t\t\t\t\t\tif (!node.isMesh) return;\n\t\t\t\t\t\tnode.castShadow = true;\n\t\t\t\t\t\tnode.receiveShadow = true;\n\t\t\t\t\t\tGeometryUtils.computeNormals(node.geometry);\n\t\t\t\t\t});\n\t\t\t\t\treturn result;\n\t\t\t\t});\n\t\t\tscene.add(sceneModel);\n\n\t\t\t// Create player\n\n\t\t\tconst playerGeometry = new CapsuleGeometry(0.15, 0.3, 20, 20);\n\t\t\tconst playerMaterial = new t3d.LambertMaterial();\n\t\t\tplayerMaterial.diffuse.setHex(0xff0000);\n\t\t\tconst playerMesh = new t3d.Mesh(playerGeometry, playerMaterial);\n\t\t\tplayerMesh.position.y = 0.3;\n\t\t\tplayerMesh.castShadow = true;\n\n\t\t\tconst player = new t3d.Object3D();\n\t\t\tplayer.add(playerMesh);\n\t\t\tscene.add(player);\n\n\t\t\t// Navmesh\n\n\t\t\tlet navMesh, navMeshQuery;\n\t\t\tconst triangleSoup = new TriangleSoup();\n\t\t\tconst triangleSoupHelper = new TriangleSoupHelper(triangleSoup);\n\t\t\ttriangleSoupHelper.wireframe(true);\n\t\t\ttriangleSoupHelper.position.y = 0.01;\n\t\t\tscene.add(triangleSoupHelper);\n\n\t\t\tconst navMeshConfig = {\n\t\t\t\tcs: 0.05, // The meshes are voxelized in order to compute walkable navmesh. This parameter in world units defines the width and depth of 1 voxel.\n\t\t\t\tch: 0.05, // Same as cs but for height of the voxel.\n\t\t\t\twalkableSlopeAngle: 45, // Angle in degrees for the maximum walkable slope.\n\t\t\t\twalkableHeight: 10, // The height in voxel units that is allowed to walk in.\n\t\t\t\twalkableClimb: 7, // The delta in voxel units that can be climbed.\n\t\t\t\twalkableRadius: 2, // The radius in voxel units of the agents.\n\t\t\t\tmaxEdgeLen: 12, // The maximum allowed length for contour edges along the border of the mesh. Voxel units.\n\t\t\t\tmaxSimplificationError: 1.3, // The maximum distance a simplified contour's border edges should deviate the original raw contour. Voxel units.\n\t\t\t\tminRegionArea: 8, // The minimum number of cells allowed to form isolated island areas. Voxel units.\n\t\t\t\tmergeRegionArea: 20, // Any regions with a span count smaller than this value will, if possible, be merged with larger regions. Voxel units.\n\t\t\t\tmaxVertsPerPoly: 6, // The maximum number of vertices allowed for polygons generated during the contour to polygon conversion process. Must be > 3.\n\t\t\t\tdetailSampleDist: 6, // Sets the sampling distance to use when generating the detail mesh. World units.\n\t\t\t\tdetailSampleMaxError: .5 // The maximum distance the detail mesh surface should deviate from heightfield data. World Units.\n\t\t\t};\n\n\t\t\tfunction generateNavMesh() {\n\t\t\t\tsceneModel.updateMatrix();\n\n\t\t\t\tconsole.time('Collecting Geometry');\n\t\t\t\ttriangleSoup.clear();\n\t\t\t\tsceneModel.traverse(node => {\n\t\t\t\t\tif (!node.isMesh) return;\n\t\t\t\t\ttriangleSoup.addMesh(node);\n\t\t\t\t});\n\t\t\t\ttriangleSoup.mergeVertices();\n\t\t\t\tconsole.timeEnd('Collecting Geometry');\n\n\t\t\t\tconsole.time('NavMesh Generation');\n\t\t\t\tconst result = generateSoloNavMesh(\n\t\t\t\t\tnew Float32Array(triangleSoup.positions),\n\t\t\t\t\tnew Uint32Array(triangleSoup.indices),\n\t\t\t\t\tnavMeshConfig\n\t\t\t\t);\n\t\t\t\tconsole.timeEnd('NavMesh Generation');\n\n\t\t\t\tif (!result.success) {\n\t\t\t\t\tconsole.error('Failed to generate navmesh');\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\tnavMesh = result.navMesh;\n\t\t\t\tnavMeshQuery = new NavMeshQuery(navMesh);\n\n\t\t\t\tconst [positions, indices] = getNavMeshPositionsAndIndices(navMesh);\n\n\t\t\t\ttriangleSoup.positions = positions;\n\t\t\t\ttriangleSoup.indices = indices;\n\n\t\t\t\ttriangleSoupHelper.update();\n\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\tgenerateNavMesh();\n\n\t\t\tconst spawnPoint = { x: -0.2, y: 3, z: 2.3 };\n\t\t\tconst playerSpawnPoint = new t3d.Vector3().copy(\n\t\t\t\tnavMeshQuery.findClosestPoint(spawnPoint).point\n\t\t\t);\n\t\t\tplayer.position.copy(playerSpawnPoint);\n\n\t\t\t// Player pathfinding\n\n\t\t\tlet path = null;\n\t\t\tlet currentPathIndex = 0;\n\t\t\n\t\t\tconst raycaster = new t3d.Raycaster();\n\t\t\tconst mouse = new t3d.Vector2();\n\t\t\tconst mouseDown = new t3d.Vector2();\n\n\t\t\tfunction onPointerDown(event) {\n\t\t\t\tmouseDown.x = (event.clientX / width) * 2 - 1;\n\t\t\t\tmouseDown.y = -(event.clientY / height) * 2 + 1;\n\t\t\t}\n\t\t\n\t\t\tfunction onPointerUp(event) {\n\t\t\t\tmouse.x = (event.clientX / width) * 2 - 1;\n\t\t\t\tmouse.y = -(event.clientY / height) * 2 + 1;\n\n\t\t\t\tif (\n\t\t\t\t\tMath.abs(mouseDown.x - mouse.x) > 0.01 ||\n\t\t\t\t\tMath.abs(mouseDown.y - mouse.y) > 0.01\n\t\t\t\t) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\traycaster.setFromCamera(mouse, camera);\n\n\t\t\t\tconst intersects = raycaster.intersectObject(sceneModel, true);\n\n\t\t\t\tif (intersects.length > 0) {\n\t\t\t\t\tconst hitPoint = intersects[0].point;\n\t\t\n\t\t\t\t\tif (navMeshQuery) {\n\t\t\t\t\t\tconst { point, polyRef } = navMeshQuery.findClosestPoint(hitPoint);\n\t\t\t\t\t\tif (polyRef) {\n\t\t\t\t\t\t\tconst startResult = navMeshQuery.findClosestPoint(player.position);\n\t\t\t\t\t\t\tif (startResult.polyRef) {\n\t\t\t\t\t\t\t\tconst pathResult = navMeshQuery.computePath(startResult.point, point);\n\t\t\t\t\t\t\t\tif (pathResult.success) {\n\t\t\t\t\t\t\t\t\tpath = pathResult.path;\n\t\t\t\t\t\t\t\t\tcurrentPathIndex = 0;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\n\t\t\tdocument.addEventListener('pointerdown', onPointerDown, false);\n\t\t\tdocument.addEventListener('pointerup', onPointerUp, false);\n\n\t\t\tconst playerSpeed = 5;\n\t\t\tconst playerDirection = new t3d.Vector3();\n\t\t\n\t\t\tfunction updatePlayer(deltaTime) {\n\t\t\t\tif (path && path.length > 0 && currentPathIndex < path.length) {\n\t\t\t\t\tconst targetPos = path[currentPathIndex];\n\t\t\t\t\tconst direction = playerDirection.copy(targetPos).sub(player.position);\n\t\t\t\t\tconst distance = direction.getLength();\n\t\t\n\t\t\t\t\tif (distance > 0.1) {\n\t\t\t\t\t\tdirection.normalize().multiplyScalar(playerSpeed * deltaTime);\n\t\t\n\t\t\t\t\t\t// Don't move further than the distance to the target\n\t\t\t\t\t\tif (direction.getLength() > distance) {\n\t\t\t\t\t\t\tdirection.normalize().multiplyScalar(distance);\n\t\t\t\t\t\t}\n\t\t\n\t\t\t\t\t\tplayer.position.add(direction);\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// Close enough to the current path point, move to the next one\n\t\t\t\t\t\tcurrentPathIndex++;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// GUI\n\t\t\n\t\t\tconst gui = new GUI();\n\t\t\n\t\t\tconst navMeshFolder = gui.addFolder('NavMesh Parameters');\n\t\t\tnavMeshFolder.add(navMeshConfig, 'cs', 0.05, 0.2, 0.01).name('Cell Size');\n\t\t\tnavMeshFolder.add(navMeshConfig, 'ch', 0.05, 0.2, 0.01).name('Cell Height');\n\t\t\tnavMeshFolder.add(navMeshConfig, 'walkableSlopeAngle', 0, 90, 1).name('Walkable Slope Angle');\n\t\t\tnavMeshFolder.add(navMeshConfig, 'walkableHeight', 0.1, 40, 0.1).name('Walkable Height');\n\t\t\tnavMeshFolder.add(navMeshConfig, 'walkableClimb', 0.1, 20, 0.1).name('Walkable Climb');\n\t\t\tnavMeshFolder.add(navMeshConfig, 'walkableRadius', 0.1, 10, 0.1).name('Walkable Radius');\n\t\t\n\t\t\tconst advancedFolder = navMeshFolder.addFolder('Advanced').close();\n\t\t\tadvancedFolder.add(navMeshConfig, 'maxEdgeLen', 1, 50).name('Max Edge Length');\n\t\t\tadvancedFolder.add(navMeshConfig, 'maxSimplificationError', 0.1, 3).name('Simplification Error');\n\t\t\tadvancedFolder.add(navMeshConfig, 'minRegionArea', 1, 50).name('Min Region Area');\n\t\t\tadvancedFolder.add(navMeshConfig, 'mergeRegionArea', 1, 100).name('Merge Region Area');\n\t\t\tadvancedFolder.add(navMeshConfig, 'maxVertsPerPoly', 3, 12, 1).name('Max Verts Per Poly');\n\t\t\tadvancedFolder.add(navMeshConfig, 'detailSampleDist', 0, 10).name('Detail Sample Dist');\n\t\t\tadvancedFolder.add(navMeshConfig, 'detailSampleMaxError', 0, 2).name('Detail Sample Max Error');\n\t\t\n\t\t\tnavMeshFolder.add({ generateNavMesh }, 'generateNavMesh').name('Generate NavMesh');\n\t\t\n\t\t\tconst visFolder = gui.addFolder('Visualization').close();\n\t\t\tvisFolder.add(triangleSoupHelper, 'visible').name('NavMesh');\n\t\t\tvisFolder.add(player, 'visible').name('Player');\n\t\t\n\t\t\tconst navMeshIO = gui.addFolder('NavMesh IO').close();\n\t\t\tnavMeshIO.add({\n\t\t\t\tsave: function() {\n\t\t\t\t\tif (!navMesh) return;\n\t\t\t\t\tconst navmeshBuffer = exportNavMesh(navMesh);\n\t\t\t\t\tdownloadFile(navmeshBuffer, 'application/octet-stream', 'navmesh.bin');\n\t\t\t\t}\n\t\t\t}, 'save').name('Save NavMesh');\n\n\t\t\tfunction downloadFile(data, type, filename) {\n\t\t\t\tconst blob = new Blob([data], { type });\n\t\t\t\tconst url = URL.createObjectURL(blob);\n\t\t\t\tconst link = document.createElement('a');\n\t\t\t\tlink.href = url;\n\t\t\t\tlink.download = filename;\n\t\t\t\tdocument.body.appendChild(link);\n\t\t\t\tlink.click();\n\t\t\t\tdocument.body.removeChild(link);\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tconst timer = new Timer();\n\n\t\t\tfunction loop(timestamp) {\n\t\t\t\trequestAnimationFrame(loop);\n\n\t\t\t\ttimer.update(timestamp);\n\n\t\t\t\tcontroller.update();\n\n\t\t\t\tupdatePlayer(timer.getDelta());\n\n\t\t\t\tforwardRenderer.render(scene, camera);\n\t\t\t}\n\t\t\trequestAnimationFrame(loop);\n\n\t\t\tfunction onWindowResize() {\n\t\t\t\twidth = window.innerWidth || 2;\n\t\t\t\theight = window.innerHeight || 2;\n\n\t\t\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 0.1, 1000);\n\n\t\t\t\tforwardRenderer.screenRenderTarget.resize(width * window.devicePixelRatio, height * window.devicePixelRatio);\n\n\t\t\t\tcanvas.style.width = width + 'px';\n\t\t\t\tcanvas.style.height = height + 'px';\n\t\t\t}\n\t\t\twindow.addEventListener('resize', onWindowResize, false);\n\t\t});\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "examples/navigation_recast_obstacles.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>t3d - navigation recast obstacles</title>\n\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n\t<link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n<body>\n\t<div id=\"info\">\n\t\t<a href=\"https://github.com/uinosoft/t3d.js\" target=\"_blank\">t3d</a> - \n\t\tNavigation mesh obstacles using <a href=\"https://github.com/isaac-mason/recast-navigation-js\" target=\"_blank\">recast-navigation-js</a><br/>\n\t\t<strong>Controls:</strong> Click to move agent\n\t</div>\n\n\t<!-- Import maps polyfill -->\n\t<!-- Remove this when import maps will be widely supported -->\n\t<script async src=\"./libs/es-module-shims.js\"></script>\n\n\t<script type=\"importmap\">\n\t\t{\n\t\t\t\"imports\": {\n\t\t\t\t\"t3d\": \"../build/t3d.module.js\",\n\t\t\t\t\"t3d/addons/\": \"./jsm/\",\n\t\t\t\t\"@recast-navigation/core\": \"https://cdn.skypack.dev/@recast-navigation/core@0.39\",\n\t\t\t\t\"@recast-navigation/generators\": \"https://cdn.skypack.dev/@recast-navigation/generators@0.39\"\n            }\n        }\n    </script>\n\n\t<script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { Timer } from 't3d/addons/misc/Timer.js';\n\t\timport { OrbitControls } from 't3d/addons/controls/OrbitControls.js';\n\t\timport { CapsuleGeometry } from 't3d/addons/geometries/CapsuleGeometry.js';\n\t\timport { TriangleSoupHelper } from 't3d/addons/objects/TriangleSoupHelper.js';\n\t\timport { TriangleSoup } from 't3d/addons/math/TriangleSoup.js';\n\t\timport { ForwardRenderer } from 't3d/addons/render/ForwardRenderer.js';\n\t\timport { GUI } from './libs/lil-gui.esm.min.js';\n\t\timport { init, NavMeshQuery, getNavMeshPositionsAndIndices } from '@recast-navigation/core';\n\t\timport { generateTileCache } from '@recast-navigation/generators';\n\n\t\tinit().then(async () => {\n\t\t\tlet width = window.innerWidth || 2;\n\t\t\tlet height = window.innerHeight || 2;\n\n\t\t\tconst canvas = document.createElement('canvas');\n\t\t\tcanvas.width = width * window.devicePixelRatio;\n\t\t\tcanvas.height = height * window.devicePixelRatio;\n\t\t\tcanvas.style.width = width + 'px';\n\t\t\tcanvas.style.height = height + 'px';\n\t\t\tdocument.body.appendChild(canvas);\n\n\t\t\tconst forwardRenderer = new ForwardRenderer(canvas);\n\n\t\t\tconst scene = new t3d.Scene();\n\n\t\t\tconst ambientLight = new t3d.AmbientLight(0xffffff, 0.2);\n\t\t\tscene.add(ambientLight);\n\n\t\t\tconst directionalLight = new t3d.DirectionalLight(0xffffff, 1);\n\t\t\tdirectionalLight.position.set(-8, 10, 6);\n\t\t\tdirectionalLight.lookAt(new t3d.Vector3(0, 0, 0), new t3d.Vector3(0, 1, 0));\n\t\t\tdirectionalLight.castShadow = true;\n\t\t\tdirectionalLight.shadow.windowSize = 25;\n\t\t\tdirectionalLight.shadow.mapSize.set(512, 512);\n\t\t\tdirectionalLight.shadow.cameraNear = 0.1;\n\t\t\tdirectionalLight.shadow.cameraFar = 50;\n\t\t\tscene.add(directionalLight);\n\n\t\t\tconst camera = new t3d.Camera();\n\t\t\tcamera.outputEncoding = t3d.TEXEL_ENCODING_TYPE.SRGB;\n\t\t\tcamera.position.set(-10, 15, 15);\n\t\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 0.1, 1000);\n\t\t\tscene.add(camera);\n\n\t\t\tconst controller = new OrbitControls(camera, canvas);\n\n\t\t\t// Create static scene and door\n\n\t\t\tconst staticScene = new t3d.Object3D();\n\t\t\tscene.add(staticScene);\n\n\t\t\tconst groundGeometry = new t3d.PlaneGeometry(15, 15);\n\t\t\tconst groundMaterial = new t3d.LambertMaterial();\n\t\t\tgroundMaterial.diffuse.setHex(0x888888);\n\t\t\tconst ground = new t3d.Mesh(groundGeometry, groundMaterial);\n\t\t\tground.receiveShadow = true;\n\t\t\tstaticScene.add(ground);\n\n\t\t\tfunction createBox(x, y, z, width, height, depth) {\n\t\t\t\tconst geometry = new t3d.BoxGeometry(width, height, depth);\n\t\t\t\tconst material = new t3d.LambertMaterial();\n\t\t\t\tmaterial.diffuse.setHex(0x888888);\n\t\t\t\tconst wall = new t3d.Mesh(geometry, material);\n\t\t\t\twall.position.set(x, y + height / 2, z);\n\t\t\t\twall.castShadow = true;\n\t\t\t\twall.receiveShadow = true;\n\t\t\t\treturn wall;\n\t\t\t}\n\n\t\t\tstaticScene.add(createBox(0, 0, 5, 2, 3, 5));\n\t\t\tstaticScene.add(createBox(0, 0, -5, 2, 3, 5));\n\n\t\t\tconst door = createBox(0, 0, 0, 1, 3, 5);\n\t\t\tdoor.material.diffuse.setHex(0x555555);\n\t\t\tdoor.visible = false;\n\t\t\tscene.add(door);\n\n\t\t\t// Create player\n\n\t\t\tconst playerGeometry = new CapsuleGeometry(0.15, 0.3, 20, 20);\n\t\t\tconst playerMaterial = new t3d.LambertMaterial();\n\t\t\tplayerMaterial.diffuse.setHex(0xff0000);\n\t\t\tconst playerMesh = new t3d.Mesh(playerGeometry, playerMaterial);\n\t\t\tplayerMesh.position.y = 0.3;\n\t\t\tplayerMesh.castShadow = true;\n\t\t\tplayerMesh.receiveShadow = true;\n\n\t\t\tconst player = new t3d.Object3D();\n\t\t\tplayer.add(playerMesh);\n\t\t\tscene.add(player);\n\n\t\t\t// Navmesh\n\n\t\t\tstaticScene.updateMatrix();\n\n\t\t\tconst triangleSoup = new TriangleSoup();\n\n\t\t\tconst triangleSoupHelper = new TriangleSoupHelper(triangleSoup);\n\t\t\ttriangleSoupHelper.wireframe(true);\n\t\t\ttriangleSoupHelper.position.y = 0.01;\n\t\t\tscene.add(triangleSoupHelper);\n\n\t\t\tconsole.time('Collecting Geometry');\n\t\t\tstaticScene.traverse(node => {\n\t\t\t\tif (!node.isMesh) return;\n\t\t\t\ttriangleSoup.addMesh(node);\n\t\t\t});\n\t\t\ttriangleSoup.mergeVertices();\n\t\t\tconsole.timeEnd('Collecting Geometry');\n\n\t\t\tconsole.time('NavMesh Generation');\n\t\t\tconst result = generateTileCache(\n\t\t\t\tnew Float32Array(triangleSoup.positions),\n\t\t\t\tnew Uint32Array(triangleSoup.indices),\n\t\t\t\t{\n\t\t\t\t\tcs: 0.1,\n\t\t\t\t\tch: 0.1,\n\t\t\t\t\tmaxObstacles: 5,\n\t\t\t\t\twalkableRadius: 2,\n\t\t\t\t\ttileSize: 32\n\t\t\t\t}\n\t\t\t);\n\t\t\tconsole.timeEnd('NavMesh Generation');\n\n\t\t\tconst navMesh = result.navMesh;\n\t\t\tconst tileCache = result.tileCache;\n\t\t\tconst navMeshQuery = new NavMeshQuery(navMesh);\n\n\t\t\tlet obstacle = null;\n\t\t\tconst obstaclePosition = { x: 0, y: 1.5, z: 0 };\n\t\t\tconst obstacleBoxExtent = { x: 0.5 + 0.2, y: 1.5, z: 2.5 };\n\n\t\t\tfunction toggleObstacle() {\n\t\t\t\tif (obstacle) {\n\t\t\t\t\ttileCache.removeObstacle(obstacle);\n\t\t\t\t\tobstacle = null;\n\t\t\t\t} else {\n\t\t\t\t\tconst obstacleResult = tileCache.addBoxObstacle(obstaclePosition, obstacleBoxExtent, 0);\n\t\t\t\t\tobstacle = obstacleResult.obstacle;\n\t\t\t\t}\n\t\t\n\t\t\t\tfullTileCacheUpdate();\n\n\t\t\t\tupdateNavMeshHelper();\n\n\t\t\t\tdoor.visible = !door.visible;\n\t\t\t}\n\n\t\t\tfunction fullTileCacheUpdate() {\n\t\t\t\twhile (!tileCache.update(navMesh).upToDate) {\n\t\t\t\t\t// Keep updating until the tile cache is up to date\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfunction updateNavMeshHelper() {\n\t\t\t\tconst [positions, indices] = getNavMeshPositionsAndIndices(navMesh);\n\n\t\t\t\ttriangleSoup.positions = positions;\n\t\t\t\ttriangleSoup.indices = indices;\n\n\t\t\t\ttriangleSoupHelper.update();\n\t\t\t}\n\n\t\t\ttoggleObstacle();\n\n\t\t\tconst spawnPoint = { x: -5, y: 1, z: 0 };\n\t\t\tconst playerSpawnPoint = new t3d.Vector3().copy(\n\t\t\t\tnavMeshQuery.findClosestPoint(spawnPoint).point\n\t\t\t);\n\t\t\tplayer.position.copy(playerSpawnPoint);\n\n\t\t\t// Player pathfinding\n\n\t\t\tlet path = null;\n\t\t\tlet currentPathIndex = 0;\n\t\t\n\t\t\tconst raycaster = new t3d.Raycaster();\n\t\t\tconst mouse = new t3d.Vector2();\n\t\t\tconst mouseDown = new t3d.Vector2();\n\n\t\t\tfunction onPointerDown(event) {\n\t\t\t\tmouseDown.x = (event.clientX / width) * 2 - 1;\n\t\t\t\tmouseDown.y = -(event.clientY / height) * 2 + 1;\n\t\t\t}\n\t\t\n\t\t\tfunction onPointerUp(event) {\n\t\t\t\tmouse.x = (event.clientX / width) * 2 - 1;\n\t\t\t\tmouse.y = -(event.clientY / height) * 2 + 1;\n\n\t\t\t\tif (\n\t\t\t\t\tMath.abs(mouseDown.x - mouse.x) > 0.01 ||\n\t\t\t\t\tMath.abs(mouseDown.y - mouse.y) > 0.01\n\t\t\t\t) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\traycaster.setFromCamera(mouse, camera);\n\n\t\t\t\tconst intersects = raycaster.intersectObject(staticScene, true);\n\n\t\t\t\tif (intersects.length > 0) {\n\t\t\t\t\tconst hitPoint = intersects[0].point;\n\t\t\n\t\t\t\t\tif (navMeshQuery) {\n\t\t\t\t\t\tconst { point, polyRef } = navMeshQuery.findClosestPoint(hitPoint);\n\t\t\t\t\t\tif (polyRef) {\n\t\t\t\t\t\t\tconst startResult = navMeshQuery.findClosestPoint(player.position);\n\t\t\t\t\t\t\tif (startResult.polyRef) {\n\t\t\t\t\t\t\t\tconst pathResult = navMeshQuery.computePath(startResult.point, point);\n\t\t\t\t\t\t\t\tif (pathResult.success) {\n\t\t\t\t\t\t\t\t\tpath = pathResult.path;\n\t\t\t\t\t\t\t\t\tcurrentPathIndex = 0;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\n\t\t\tdocument.addEventListener('pointerdown', onPointerDown, false);\n\t\t\tdocument.addEventListener('pointerup', onPointerUp, false);\n\n\t\t\tconst playerSpeed = 8;\n\t\t\tconst playerDirection = new t3d.Vector3();\n\t\t\n\t\t\tfunction updatePlayer(deltaTime) {\n\t\t\t\tif (path && path.length > 0 && currentPathIndex < path.length) {\n\t\t\t\t\tconst targetPos = path[currentPathIndex];\n\t\t\t\t\tconst direction = playerDirection.copy(targetPos).sub(player.position);\n\t\t\t\t\tconst distance = direction.getLength();\n\t\t\n\t\t\t\t\tif (distance > 0.1) {\n\t\t\t\t\t\tdirection.normalize().multiplyScalar(playerSpeed * deltaTime);\n\t\t\n\t\t\t\t\t\t// Don't move further than the distance to the target\n\t\t\t\t\t\tif (direction.getLength() > distance) {\n\t\t\t\t\t\t\tdirection.normalize().multiplyScalar(distance);\n\t\t\t\t\t\t}\n\t\t\n\t\t\t\t\t\tplayer.position.add(direction);\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// Close enough to the current path point, move to the next one\n\t\t\t\t\t\tcurrentPathIndex++;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// GUI\n\t\t\n\t\t\tconst gui = new GUI();\n\t\t\tgui.add({ toggleObstacle }, 'toggleObstacle').name('Toggle Door');\n\n\t\t\t//\n\n\t\t\tconst timer = new Timer();\n\n\t\t\tfunction loop(timestamp) {\n\t\t\t\trequestAnimationFrame(loop);\n\n\t\t\t\ttimer.update(timestamp);\n\n\t\t\t\tcontroller.update();\n\n\t\t\t\tupdatePlayer(timer.getDelta());\n\n\t\t\t\tforwardRenderer.render(scene, camera);\n\t\t\t}\n\t\t\trequestAnimationFrame(loop);\n\n\t\t\tfunction onWindowResize() {\n\t\t\t\twidth = window.innerWidth || 2;\n\t\t\t\theight = window.innerHeight || 2;\n\n\t\t\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 0.1, 1000);\n\n\t\t\t\tforwardRenderer.screenRenderTarget.resize(width * window.devicePixelRatio, height * window.devicePixelRatio);\n\n\t\t\t\tcanvas.style.width = width + 'px';\n\t\t\t\tcanvas.style.height = height + 'px';\n\t\t\t}\n\t\t\twindow.addEventListener('resize', onWindowResize, false);\n\t\t});\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "examples/navigation_recast_walking.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>t3d - navigation recast walking</title>\n\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n\t<link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n<body>\n\t<div id=\"info\">\n\t\t<a href=\"https://github.com/uinosoft/t3d.js\" target=\"_blank\">t3d</a> - \n\t\tNavigation walking using <a href=\"https://github.com/isaac-mason/recast-navigation-js\" target=\"_blank\">recast-navigation-js</a><br/>\n\t\t<strong>Controls:</strong> 'WASD' keys to move, 'Shift' to run faster\n\t</div>\n\n\t<script src=\"./libs/nanobar.js\"></script>\n\n\t<!-- Import maps polyfill -->\n\t<!-- Remove this when import maps will be widely supported -->\n\t<script async src=\"./libs/es-module-shims.js\"></script>\n\n\t<script type=\"importmap\">\n\t\t{\n\t\t\t\"imports\": {\n\t\t\t\t\"t3d\": \"../build/t3d.module.js\",\n\t\t\t\t\"t3d/addons/\": \"./jsm/\",\n\t\t\t\t\"@recast-navigation/core\": \"https://cdn.skypack.dev/@recast-navigation/core@0.39\"\n            }\n        }\n    </script>\n\n\t<script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { Timer } from 't3d/addons/misc/Timer.js';\n\t\timport { GLTFLoader } from 't3d/addons/loaders/glTF/GLTFLoader.js';\n\t\timport { OrbitControls } from 't3d/addons/controls/OrbitControls.js';\n\t\timport { CapsuleGeometry } from 't3d/addons/geometries/CapsuleGeometry.js';\n\t\timport { GeometryUtils } from 't3d/addons/geometries/GeometryUtils.js';\n\t\timport { AxisHelper } from 't3d/addons/objects/AxisHelper.js';\n\t\timport { TriangleSoupHelper } from 't3d/addons/objects/TriangleSoupHelper.js';\n\t\timport { TriangleSoup } from 't3d/addons/math/TriangleSoup.js';\n\t\timport { ForwardRenderer } from 't3d/addons/render/ForwardRenderer.js';\n\t\timport { GUI } from './libs/lil-gui.esm.min.js';\n\t\timport { init, NavMeshQuery, importNavMesh, getNavMeshPositionsAndIndices } from '@recast-navigation/core';\n\n\t\tinit().then(async () => {\n\t\t\tlet width = window.innerWidth || 2;\n\t\t\tlet height = window.innerHeight || 2;\n\n\t\t\tconst canvas = document.createElement('canvas');\n\t\t\tcanvas.width = width * window.devicePixelRatio;\n\t\t\tcanvas.height = height * window.devicePixelRatio;\n\t\t\tcanvas.style.width = width + 'px';\n\t\t\tcanvas.style.height = height + 'px';\n\t\t\tdocument.body.appendChild(canvas);\n\n\t\t\tconst forwardRenderer = new ForwardRenderer(canvas);\n\n\t\t\tconst scene = new t3d.Scene();\n\n\t\t\tconst ambientLight = new t3d.AmbientLight(0xffffff, 0.2);\n\t\t\tscene.add(ambientLight);\n\n\t\t\tconst directionalLight = new t3d.DirectionalLight(0xffffff, 1);\n\t\t\tdirectionalLight.position.set(6, 10, 6);\n\t\t\tdirectionalLight.lookAt(new t3d.Vector3(0, 0, 0), new t3d.Vector3(0, 1, 0));\n\t\t\tdirectionalLight.castShadow = true;\n\t\t\tdirectionalLight.shadow.windowSize = 25;\n\t\t\tdirectionalLight.shadow.mapSize.set(512, 512);\n\t\t\tdirectionalLight.shadow.cameraNear = 0.1;\n\t\t\tdirectionalLight.shadow.cameraFar = 50;\n\t\t\tscene.add(directionalLight);\n\n\t\t\tconst cameraContainer = new t3d.Object3D();\n\t\t\tscene.add(cameraContainer);\n\n\t\t\tconst camera = new t3d.Camera();\n\t\t\tcamera.outputEncoding = t3d.TEXEL_ENCODING_TYPE.SRGB;\n\t\t\tcamera.position.set(0, 10, 10);\n\t\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 0.1, 1000);\n\t\t\tcameraContainer.add(camera);\n\n\t\t\tconst controller = new OrbitControls(camera, canvas);\n\t\t\tcontroller.enablePan = false;\n\n\t\t\t// gltf loader\n\n\t\t\tconst nanobar = new Nanobar();\n\t\t\tnanobar.el.style.background = 'gray';\n\n\t\t\tconst loadingManager = new t3d.LoadingManager(function() {\n\t\t\t\tnanobar.go(100);\n\t\t\t\tnanobar.el.style.background = 'transparent';\n\t\t\t}, function(url, itemsLoaded, itemsTotal) {\n\t\t\t\tif (itemsLoaded < itemsTotal) {\n\t\t\t\t\tnanobar.go((itemsLoaded / itemsTotal) * 100);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tconst gltfLoader = new GLTFLoader(loadingManager);\n\n\t\t\t// load model\n\n\t\t\tconst { root: sceneModel } = await gltfLoader.load('./resources/navigation/level.glb')\n\t\t\t\t.then(result => {\n\t\t\t\t\tresult.root.traverse(node => {\n\t\t\t\t\t\tif (!node.isMesh) return;\n\t\t\t\t\t\tnode.castShadow = true;\n\t\t\t\t\t\tnode.receiveShadow = true;\n\t\t\t\t\t\tGeometryUtils.computeNormals(node.geometry);\n\t\t\t\t\t});\n\t\t\t\t\treturn result;\n\t\t\t\t});\n\t\t\tscene.add(sceneModel);\n\n\t\t\t// create player\n\n\t\t\tfunction createPlayer() {\n\t\t\t\tconst character = new t3d.Mesh(new CapsuleGeometry(0.15, 0.3, 20, 20), new t3d.PBRMaterial());\n\t\t\t\tcharacter.material.diffuse.setHex(0xff0000);\n\t\t\t\tcharacter.castShadow = true;\n\t\t\t\tcharacter.position.y = 0.3;\n\n\t\t\t\tconst axis = new AxisHelper(0.5);\n\t\t\t\taxis.position.y = 0.4;\n\t\t\n\t\t\t\tconst container = new t3d.Object3D();\n\t\t\t\tcontainer.add(character);\n\t\t\t\tcontainer.add(axis);\n\t\t\t\treturn container;\n\t\t\t}\n\t\t\n\t\t\tconst player = createPlayer();\n\t\t\tscene.add(player);\n\n\t\t\t// init navigation\n\n\t\t\tconst navMesh = await fetch('./resources/navigation/level.nav.bin')\n\t\t\t\t.then(response => response.arrayBuffer())\n\t\t\t\t.then(data => {\n\t\t\t\t\tconst { navMesh } = importNavMesh(new Uint8Array(data));\n\t\t\t\t\treturn navMesh;\n\t\t\t\t});\n\n\t\t\tconst navMeshQuery = new NavMeshQuery(navMesh);\n\n\t\t\tconst spawnPoint = { x: -0.2, y: 3, z: 2.3 };\n\t\t\tconst playerSpawnPoint = new t3d.Vector3().copy(\n\t\t\t\tnavMeshQuery.findClosestPoint(spawnPoint).point\n\t\t\t);\n\t\t\tplayer.position.copy(playerSpawnPoint);\n\t\t\n\t\t\t// navmesh helper\n\n\t\t\tconst [positions, indices] = getNavMeshPositionsAndIndices(navMesh);\n\n\t\t\tconst triangleSoup = new TriangleSoup();\n\t\t\ttriangleSoup.positions = positions;\n\t\t\ttriangleSoup.indices = indices;\n\n\t\t\tconst triangleSoupHelper = new TriangleSoupHelper(triangleSoup);\n\t\t\ttriangleSoupHelper.wireframe(true);\n\t\t\ttriangleSoupHelper.visible = true;\n\t\t\ttriangleSoupHelper.position.y = 0.05;\n\t\t\tscene.add(triangleSoupHelper);\n\n\t\t\t// User interaction\n\n\t\t\tconst keyboardState = { w: false, a: false, s: false, d: false, shift: false };\n\n\t\t\tdocument.addEventListener('keydown', event => {\n\t\t\t\tswitch (event.key.toLowerCase()) {\n\t\t\t\t\tcase 'w':\n\t\t\t\t\t\tkeyboardState.w = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'a':\n\t\t\t\t\t\tkeyboardState.a = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 's':\n\t\t\t\t\t\tkeyboardState.s = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'd':\n\t\t\t\t\t\tkeyboardState.d = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'shift':\n\t\t\t\t\t\tkeyboardState.shift = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tdocument.addEventListener('keyup', event => {\n\t\t\t\tswitch (event.key.toLowerCase()) {\n\t\t\t\t\tcase 'w':\n\t\t\t\t\t\tkeyboardState.w = false;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'a':\n\t\t\t\t\t\tkeyboardState.a = false;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 's':\n\t\t\t\t\t\tkeyboardState.s = false;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'd':\n\t\t\t\t\t\tkeyboardState.d = false;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'shift':\n\t\t\t\t\t\tkeyboardState.shift = false;\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tconst speeds = { rotate: 5, move: 2 };\n\t\t\tconst position = new t3d.Vector3();\n\t\t\tconst moveDirection = new t3d.Vector3();\n\n\t\t\tfunction handleInputTransform(deltaTime) {\n\t\t\t\tlet dir = 0;\n\n\t\t\t\tif (keyboardState.w) dir = 1;\n\t\t\t\tif (keyboardState.s) dir = -1;\n\n\t\t\t\tif (keyboardState.a) player.euler.y += speeds.rotate * deltaTime;\n\t\t\t\tif (keyboardState.d) player.euler.y -= speeds.rotate * deltaTime;\n\n\t\t\t\tplayer.getWorldDirection(moveDirection);\n\t\t\t\tmoveDirection.multiplyScalar(dir).multiplyScalar((keyboardState.shift ? 2 : 1) * speeds.move * deltaTime);\n\n\t\t\t\tif (moveDirection.getLengthSquared() === 0) return;\n\n\t\t\t\tposition.copy(player.position).add(moveDirection);\n\t\t\t}\n\n\t\t\tfunction handleNavmesh() {\n\t\t\t\tif (moveDirection.getLengthSquared() === 0) return;\n\n\t\t\t\tconst { point, polyRef } = navMeshQuery.findClosestPoint(player.position);\n\t\t\n\t\t\t\tconst { resultPosition } = navMeshQuery.moveAlongSurface(polyRef, point, position);\n\n\t\t\t\tconst polyHeightResult = navMeshQuery.getPolyHeight(polyRef, resultPosition);\n\n\t\t\t\tplayer.position.set(\n\t\t\t\t\tresultPosition.x,\n\t\t\t\t\tpolyHeightResult.success ? polyHeightResult.height : resultPosition.y,\n\t\t\t\t\tresultPosition.z\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst gui = new GUI();\n\t\t\tconst speedsFolder = gui.addFolder('Player Speeds').close();\n\t\t\tspeedsFolder.add(speeds, 'move', 0, 10).name('Move');\n\t\t\tspeedsFolder.add(speeds, 'rotate', 0, 10).name('Rotate');\n\t\t\tconst debugFolder = gui.addFolder('Debug').close();\n\t\t\tdebugFolder.add(sceneModel, 'visible').name('Scene Model');\n\t\t\tdebugFolder.add(triangleSoupHelper, 'visible').name('Nav Mesh');\n\n\t\t\t//\n\n\t\t\tconst timer = new Timer();\n\n\t\t\tfunction loop(timestamp) {\n\t\t\t\trequestAnimationFrame(loop);\n\n\t\t\t\ttimer.update(timestamp);\n\n\t\t\t\tcontroller.update();\n\n\t\t\t\tconst deltaTime = Math.min(timer.getDelta(), 1 / 60);\n\n\t\t\t\thandleInputTransform(deltaTime);\n\t\t\t\thandleNavmesh();\n\t\t\t\tcameraContainer.position.copy(player.position);\n\n\t\t\t\tforwardRenderer.render(scene, camera);\n\t\t\t}\n\t\t\trequestAnimationFrame(loop);\n\n\t\t\tfunction onWindowResize() {\n\t\t\t\twidth = window.innerWidth || 2;\n\t\t\t\theight = window.innerHeight || 2;\n\n\t\t\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 0.1, 1000);\n\n\t\t\t\tforwardRenderer.screenRenderTarget.resize(width * window.devicePixelRatio, height * window.devicePixelRatio);\n\n\t\t\t\tcanvas.style.width = width + 'px';\n\t\t\t\tcanvas.style.height = height + 'px';\n\t\t\t}\n\t\t\twindow.addEventListener('resize', onWindowResize, false);\n\t\t});\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "examples/particle_particle.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>t3d - particle</title>\n\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n\t<link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n</head>\n<body>\n    <div id=\"info\">\n        <a href=\"\" target=\"_blank\">t3d</a> - particle\n    </div>\n\n\t<!-- Import maps polyfill -->\n    <!-- Remove this when import maps will be widely supported -->\n    <script async src=\"./libs/es-module-shims.js\"></script>\n\n    <script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n    <script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { ParticleContainer } from 't3d/addons/objects/ParticleContainer.js';\n\t\timport { ForwardRenderer } from 't3d/addons/render/ForwardRenderer.js';\n\t\timport { Texture2DLoader } from 't3d/addons/loaders/Texture2DLoader.js';\n\t\timport { Clock } from 't3d/addons/Clock.js';\n\t\timport { GUI } from './libs/lil-gui.esm.min.js';\n\n\t\tlet width = window.innerWidth || 2;\n\t\tlet height = window.innerHeight || 2;\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = width;\n\t\tcanvas.height = height;\n\t\tdocument.body.appendChild(canvas);\n\n\t\tconst forwardRenderer = new ForwardRenderer(canvas);\n\n\t\tconst scene = new t3d.Scene();\n\n\t\tconst image = new Image();\n\t\tconst perlin = new t3d.Texture2D();\n\t\timage.onload = function() {\n\t\t\tperlin.wrapS = t3d.TEXTURE_WRAP.REPEAT;\n\t\t\tperlin.wrapT = t3d.TEXTURE_WRAP.REPEAT;\n\t\t\tperlin.format = t3d.PIXEL_FORMAT.RGBA;\n\t\t\tperlin.image = image;\n\t\t\tperlin.version++;\n\t\t};\n\t\timage.src = 'resources/perlin-512.png';\n\n\t\tconst particle = new ParticleContainer({\n\t\t\tmaxParticleCount: 25000,\n\t\t\tparticleNoiseTex: perlin,\n\t\t\tparticleSpriteTex: new Texture2DLoader().load('./resources/particle2.png')\n\t\t});\n\t\tscene.add(particle);\n\n\t\tconst camera = new t3d.Camera();\n\t\tcamera.position.set(0, 0, 100);\n\t\tcamera.lookAt(new t3d.Vector3(0, 0, 0), new t3d.Vector3(0, 1, 0));\n\t\tcamera.setPerspective(28 / 180 * Math.PI, width / height, 1, 1000);\n\t\tscene.add(camera);\n\n\t\tlet delay = 0;\n\t\tlet time = 0;\n\t\tconst options = {\n\t\t\tposition: new t3d.Vector3(),\n\t\t\tpositionRandomness: .3,\n\t\t\tvelocity: new t3d.Vector3(),\n\t\t\tvelocityRandomness: 2,\n\t\t\tcolor: new t3d.Color3().setHex(0xaa88ff),\n\t\t\tcolorRandomness: .2,\n\t\t\tturbulence: .5,\n\t\t\tlifetime: 5,\n\t\t\tsize: 5,\n\t\t\tsizeRandomness: 1\n\t\t};\n\n\t\t// gui\n\t\tconst gui = new GUI();\n\t\tgui.add(options, 'positionRandomness', 0, 3, 0.01);\n\t\tgui.add(options, 'velocityRandomness', 0, 3, 0.01);\n\t\tgui.add(options, 'colorRandomness', 0, 1, 0.01);\n\t\tgui.add(options, 'turbulence', 0, 1, 0.01);\n\t\tgui.add(options, 'lifetime', 0, 25, 0.01);\n\t\tgui.add(options, 'size', 0, 10, 0.01);\n\t\tgui.add(options, 'sizeRandomness', 0, 25, 0.01);\n\n\t\tconst clock = new Clock();\n\n\t\tfunction loop(count) {\n\t\t\trequestAnimationFrame(loop);\n\n\t\t\tdelay = clock.getDelta();\n\t\t\ttime += delay;\n\n\t\t\tif (delay > 0) {\n\t\t\t\toptions.position.x = Math.sin(time * 1.5) * 10;\n\t\t\t\toptions.position.y = Math.sin(time * 1.33) * 10;\n\t\t\t\toptions.position.z = Math.sin(time * 1.5 + 1.33) * 5;\n\n\t\t\t\tfor (let x = 0; x < 15 * delay * 1000; x++) {\n\t\t\t\t\t// Yep, that's really it.\tSpawning particles is super cheap, and once you spawn them, the rest of\n\t\t\t\t\t// their lifecycle is handled entirely on the GPU, driven by a time uniform updated below\n\t\t\t\t\tparticle.spawn(options);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tparticle.update(time);\n\n\t\t\tforwardRenderer.render(scene, camera);\n\t\t}\n\t\trequestAnimationFrame(loop);\n\n\t\tfunction onWindowResize() {\n\t\t\twidth = window.innerWidth || 2;\n\t\t\theight = window.innerHeight || 2;\n\n\t\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 2000);\n\n\t\t\tforwardRenderer.screenRenderTarget.resize(width, height);\n\t\t}\n\t\twindow.addEventListener('resize', onWindowResize, false);\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "examples/physics_ammo.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>t3d - ammo</title>\n\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n\t<link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n</head>\n<body>\n    <div id=\"info\" class=\"dark\">\n\t\t<a href=\"https://github.com/uinosoft/t3d.js\" target=\"_blank\">t3d.js</a> - Physics demo with <a href=\"https://github.com/kripken/ammo.js/\" target=\"_blank\">ammo.js</a>\n        <br/>\n\t\tClick once to create a cube, or click and hold to create multiple cubes\n    </div>\n\n\t<script src=\"./libs/ammo.wasm.js\"></script>\n\n\t<!-- Import maps polyfill -->\n    <!-- Remove this when import maps will be widely supported -->\n    <script async src=\"./libs/es-module-shims.js\"></script>\n\n    <script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n    <script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { ForwardRenderer } from 't3d/addons/render/ForwardRenderer.js';\n\t\timport { Texture2DLoader } from 't3d/addons/loaders/Texture2DLoader.js';\n\n\t\t/* eslint-disable new-cap */\n\n\t\tAmmo().then(Ammo => { // eslint-disable-line no-undef\n\t\t\tlet width = window.innerWidth || 2;\n\t\t\tlet height = window.innerHeight || 2;\n\n\t\t\tconst canvas = document.createElement('canvas');\n\t\t\tcanvas.width = width;\n\t\t\tcanvas.height = height;\n\t\t\tdocument.body.appendChild(canvas);\n\n\t\t\tconst forwardRenderer = new ForwardRenderer(canvas);\n\t\t\tforwardRenderer.screenRenderTarget.setColorClearValue(0.75, 0.82, 0.9, 1);\n\n\t\t\tconst scene = new t3d.Scene();\n\t\t\tscene.fog = new t3d.Fog(0xbfd1e5, 50, 80);\n\n\t\t\tconst ambientLight = new t3d.AmbientLight(0xffffff, 0.1);\n\t\t\tscene.add(ambientLight);\n\n\t\t\tconst directionalLight = new t3d.DirectionalLight(0xffffff, 0.75);\n\t\t\tdirectionalLight.position.set(-40, 50, 30);\n\t\t\tdirectionalLight.lookAt(new t3d.Vector3(), new t3d.Vector3(0, 1, 0));\n\t\t\tdirectionalLight.castShadow = true;\n\t\t\tdirectionalLight.shadow.mapSize.set(1024, 1024);\n\t\t\tdirectionalLight.shadow.windowSize = 40;\n\t\t\tdirectionalLight.shadow.normalBias = -0.05;\n\t\t\tscene.add(directionalLight);\n\n\t\t\tconst camera = new t3d.Camera();\n\t\t\tcamera.outputEncoding = t3d.TEXEL_ENCODING_TYPE.SRGB;\n\t\t\tcamera.position.set(0, 10, 25);\n\t\t\tcamera.lookAt(new t3d.Vector3(0, 1, 0), new t3d.Vector3(0, 1, 0));\n\t\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 1000);\n\t\t\tscene.add(camera);\n\n\t\t\t// Init physics world\n\n\t\t\tconst collisionConfiguration = new Ammo.btDefaultCollisionConfiguration();\n\t\t\tconst dispatcher = new Ammo.btCollisionDispatcher(collisionConfiguration);\n\t\t\tconst broadphase = new Ammo.btDbvtBroadphase();\n\t\t\tconst solver = new Ammo.btSequentialImpulseConstraintSolver();\n\t\t\tconst physicsWorld = new Ammo.btDiscreteDynamicsWorld(dispatcher, broadphase, solver, collisionConfiguration);\n\t\t\tphysicsWorld.setGravity(new Ammo.btVector3(0, -9.8, 0));\n\n\t\t\tconst meshes = [];\n\t\t\tconst meshMap = new WeakMap();\n\n\t\t\tconst worldTransform = new Ammo.btTransform();\n\n\t\t\tfunction createRigidBody(mesh, mass, shape) {\n\t\t\t\tconst position = mesh.position;\n\t\t\t\tconst quaternion = mesh.quaternion;\n\n\t\t\t\tconst transform = new Ammo.btTransform();\n\t\t\t\ttransform.setIdentity();\n\t\t\t\ttransform.setOrigin(new Ammo.btVector3(position.x, position.y, position.z));\n\t\t\t\ttransform.setRotation(new Ammo.btQuaternion(quaternion.x, quaternion.y, quaternion.z, quaternion.w));\n\n\t\t\t\tconst motionState = new Ammo.btDefaultMotionState(transform);\n\n\t\t\t\tconst localInertia = new Ammo.btVector3(0, 0, 0);\n\t\t\t\tshape.calculateLocalInertia(mass, localInertia);\n\n\t\t\t\tconst rbInfo = new Ammo.btRigidBodyConstructionInfo(mass, motionState, shape, localInertia);\n\n\t\t\t\tconst body = new Ammo.btRigidBody(rbInfo);\n\t\t\t\tphysicsWorld.addRigidBody(body);\n\n\t\t\t\tif (mass > 0) {\n\t\t\t\t\tmeshes.push(mesh);\n\t\t\t\t\tmeshMap.set(mesh, body);\n\t\t\t\t}\n\n\t\t\t\treturn body;\n\t\t\t}\n\n\t\t\tfunction syncTransforms() {\n\t\t\t\tfor (let i = 0, l = meshes.length; i < l; i++) {\n\t\t\t\t\tconst ms = meshMap.get(meshes[i]).getMotionState();\n\t\t\t\t\tif (ms) {\n\t\t\t\t\t\tms.getWorldTransform(worldTransform);\n\t\t\t\t\t\tconst p = worldTransform.getOrigin();\n\t\t\t\t\t\tconst q = worldTransform.getRotation();\n\t\t\t\t\t\tmeshes[i].position.set(p.x(), p.y(), p.z());\n\t\t\t\t\t\tmeshes[i].quaternion.set(q.x(), q.y(), q.z(), q.w());\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Create ground\n\n\t\t\tconst groundMaterial = new t3d.LambertMaterial();\n\t\t\tgroundMaterial.diffuse.setHex(0xffffff);\n\t\t\tgroundMaterial.diffuseMap = new Texture2DLoader().load('./resources/grid.png');\n\t\t\tgroundMaterial.diffuseMap.wrapS = groundMaterial.diffuseMap.wrapT = t3d.TEXTURE_WRAP.REPEAT;\n\t\t\tgroundMaterial.diffuseMap.encoding = t3d.TEXEL_ENCODING_TYPE.SRGB;\n\t\t\tgroundMaterial.diffuseMap.anisotropy = 8;\n\t\t\tgroundMaterial.diffuseMapTransform.setUvTransform(0, 0, 100, 100, 0, 0.5, 0.5);\n\t\t\tconst ground = new t3d.Mesh(new t3d.BoxGeometry(200, 1, 200), groundMaterial);\n\t\t\tground.receiveShadow = true;\n\t\t\tground.position.y = -1;\n\t\t\tscene.add(ground);\n\n\t\t\tconst shape = new Ammo.btBoxShape(new Ammo.btVector3(100, 0.5, 100));\n\t\t\tshape.setMargin(0.05);\n\t\t\tconst groundBody = createRigidBody(ground, 0, shape);\n\t\t\tgroundBody.setFriction(1);\n\n\t\t\t// Create boxes\n\t\t\n\t\t\tfunction createOneBox() {\n\t\t\t\tconst material = new t3d.PhongMaterial();\n\t\t\t\tmaterial.diffuse.setHex(0xffffff * Math.random()).convertSRGBToLinear();\n\t\t\t\tconst box = new t3d.Mesh(new t3d.BoxGeometry(1, 1, 1), material);\n\t\t\t\tbox.position.x = Math.random() * 2 - 1;\n\t\t\t\tbox.position.y = Math.random() * 5 + 10;\n\t\t\t\tbox.position.z = Math.random() * 2 - 1;\n\t\t\t\tbox.castShadow = true;\n\t\t\t\tscene.add(box);\n\n\t\t\t\tconst shape = new Ammo.btBoxShape(new Ammo.btVector3(0.5, 0.5, 0.5));\n\t\t\t\tshape.setMargin(0.05);\n\t\t\t\tconst body = createRigidBody(box, 15, shape);\n\t\t\t\tbody.setAngularVelocity(new Ammo.btVector3(0, 10, 0));\n\t\t\t\tbody.setFriction(0.5);\n\t\t\t\tbody.setRestitution(0.5);\n\t\t\t\tbody.setDamping(0.01, 0.1);\n\t\t\t}\n\n\t\t\tcreateOneBox();\n\n\t\t\t// User interaction\n\n\t\t\tlet isDown = false;\n\t\t\tlet createInterval;\n\n\t\t\tfunction onPointerDown(event) {\n\t\t\t\tisDown = true;\n\t\t\t\tcreateOneBox();\n\t\t\t\tcreateInterval = setInterval(createOneBox, 100);\n\t\t\t}\n\n\t\t\tfunction onPointerUp(event) {\n\t\t\t\tif (isDown) {\n\t\t\t\t\tisDown = false;\n\t\t\t\t\tclearInterval(createInterval);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tdocument.addEventListener('pointerdown', onPointerDown);\n\t\t\tdocument.addEventListener('pointerup', onPointerUp);\n\t\t\tdocument.addEventListener('pointerleave', onPointerUp);\n\n\t\t\t//\n\n\t\t\tlet lastTime = 0;\n\t\t\tfunction loop(timestamp) {\n\t\t\t\trequestAnimationFrame(loop);\n\n\t\t\t\tif (lastTime > 0) {\n\t\t\t\t\tconst delta = (timestamp - lastTime) / 1000;\n\t\t\t\t\tphysicsWorld.stepSimulation(delta, 10);\n\t\t\t\t\tsyncTransforms();\n\t\t\t\t}\n\n\t\t\t\tlastTime = timestamp;\n\n\t\t\t\tforwardRenderer.render(scene, camera);\n\t\t\t}\n\t\t\trequestAnimationFrame(loop);\n\n\t\t\tfunction onWindowResize() {\n\t\t\t\twidth = window.innerWidth || 2;\n\t\t\t\theight = window.innerHeight || 2;\n\n\t\t\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 1000);\n\n\t\t\t\tforwardRenderer.screenRenderTarget.resize(width, height);\n\t\t\t}\n\t\t\twindow.addEventListener('resize', onWindowResize, false);\n\t\t});\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "examples/physics_ammo_softbody_volume.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>t3d - ammo softbody volume</title>\n\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n\t<link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n</head>\n<body>\n    <div id=\"info\" class=\"dark\">\n        <a href=\"https://github.com/uinosoft/t3d.js\" target=\"_blank\">t3d.js</a> - Physics demo Soft Body with <a href=\"https://github.com/kripken/ammo.js/\" target=\"_blank\">ammo.js</a>\n        <br/>\n        Touch screen to throw a ball\n    </div>\n\n\t<script src=\"./libs/ammo.wasm.js\"></script>\n\n\t<!-- Import maps polyfill -->\n    <!-- Remove this when import maps will be widely supported -->\n    <script async src=\"./libs/es-module-shims.js\"></script>\n\n    <script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n    <script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { OrbitControls } from 't3d/addons/controls/OrbitControls.js';\n\t\timport { TriangleSoup } from 't3d/addons/math/TriangleSoup.js';\n\t\timport { ForwardRenderer } from 't3d/addons/render/ForwardRenderer.js';\n\t\timport { Texture2DLoader } from 't3d/addons/loaders/Texture2DLoader.js';\n\t\timport Stats from './libs/stats.module.js';\n\n\t\t/* eslint-disable new-cap */\n\n\t\tAmmo().then(Ammo => { // eslint-disable-line no-undef\n\t\t\tlet width = window.innerWidth || 2;\n\t\t\tlet height = window.innerHeight || 2;\n\n\t\t\tconst canvas = document.createElement('canvas');\n\t\t\tcanvas.width = width;\n\t\t\tcanvas.height = height;\n\t\t\tdocument.body.appendChild(canvas);\n\n\t\t\tconst forwardRenderer = new ForwardRenderer(canvas);\n\t\t\tforwardRenderer.screenRenderTarget.setColorClearValue(0.75, 0.82, 0.9, 1);\n\n\t\t\tconst scene = new t3d.Scene();\n\n\t\t\tconst ambientLight = new t3d.AmbientLight(0xffffff, 0.2);\n\t\t\tscene.add(ambientLight);\n\n\t\t\tconst directionalLight = new t3d.DirectionalLight(0xffffff, 0.7);\n\t\t\tdirectionalLight.position.set(-10, 10, 5);\n\t\t\tdirectionalLight.lookAt(new t3d.Vector3(), new t3d.Vector3(0, 1, 0));\n\t\t\tdirectionalLight.castShadow = true;\n\t\t\tdirectionalLight.shadow.mapSize.set(1024, 1024);\n\t\t\tdirectionalLight.shadow.windowSize = 40;\n\t\t\tdirectionalLight.shadow.cameraNear = 2;\n\t\t\tdirectionalLight.shadow.cameraFar = 50;\n\t\t\tscene.add(directionalLight);\n\t\t\n\t\t\tconst camera = new t3d.Camera();\n\t\t\tcamera.outputEncoding = t3d.TEXEL_ENCODING_TYPE.SRGB;\n\t\t\tcamera.position.set(-7, 5, 8);\n\t\t\tcamera.setPerspective(60 / 180 * Math.PI, width / height, 0.2, 2000);\n\t\t\tscene.add(camera);\n\n\t\t\tconst controls = new OrbitControls(camera, canvas);\n\t\t\tcontrols.target.set(0, 2, 0);\n\n\t\t\t// Init physics world\n\n\t\t\tconst collisionConfiguration = new Ammo.btSoftBodyRigidBodyCollisionConfiguration();\n\t\t\tconst dispatcher = new Ammo.btCollisionDispatcher(collisionConfiguration);\n\t\t\tconst broadphase = new Ammo.btDbvtBroadphase();\n\t\t\tconst solver = new Ammo.btSequentialImpulseConstraintSolver();\n\t\t\tconst softBodySolver = new Ammo.btDefaultSoftBodySolver();\n\t\t\tconst physicsWorld = new Ammo.btSoftRigidDynamicsWorld(dispatcher, broadphase, solver, collisionConfiguration, softBodySolver);\n\t\t\tphysicsWorld.setGravity(new Ammo.btVector3(0, -9.8, 0));\n\t\t\tphysicsWorld.getWorldInfo().set_m_gravity(new Ammo.btVector3(0, -9.8, 0));\n\n\t\t\tconst margin = 0.05;\n\t\t\n\t\t\tconst worldTransform = new Ammo.btTransform();\n\t\t\tconst softBodyHelpers = new Ammo.btSoftBodyHelpers();\n\n\t\t\tconst meshes = [];\n\t\t\tconst softMeshes = [];\n\t\t\tconst meshMap = new WeakMap();\n\t\t\tconst geometryMap = new WeakMap();\n\n\t\t\tfunction createRigidBody(mesh, mass, shape) {\n\t\t\t\tconst position = mesh.position;\n\t\t\t\tconst quaternion = mesh.quaternion;\n\n\t\t\t\tconst transform = new Ammo.btTransform();\n\t\t\t\ttransform.setIdentity();\n\t\t\t\ttransform.setOrigin(new Ammo.btVector3(position.x, position.y, position.z));\n\t\t\t\ttransform.setRotation(new Ammo.btQuaternion(quaternion.x, quaternion.y, quaternion.z, quaternion.w));\n\t\t\n\t\t\t\tconst motionState = new Ammo.btDefaultMotionState(transform);\n\n\t\t\t\tconst localInertia = new Ammo.btVector3(0, 0, 0);\n\t\t\t\tshape.calculateLocalInertia(mass, localInertia);\n\n\t\t\t\tconst rbInfo = new Ammo.btRigidBodyConstructionInfo(mass, motionState, shape, localInertia);\n\n\t\t\t\tconst body = new Ammo.btRigidBody(rbInfo);\n\t\t\t\tphysicsWorld.addRigidBody(body);\n\n\t\t\t\tif (mass > 0) {\n\t\t\t\t\tmeshes.push(mesh);\n\t\t\t\t\tmeshMap.set(mesh, body);\n\t\t\t\t\tbody.setActivationState(4); // disable deactivation\n\t\t\t\t}\n\n\t\t\t\treturn body;\n\t\t\t}\n\n\t\t\tfunction createSoftBody(mesh, mass, pressure, ammoGeometry) {\n\t\t\t\tconst softBody = softBodyHelpers.CreateFromTriMesh(\n\t\t\t\t\tphysicsWorld.getWorldInfo(),\n\t\t\t\t\tammoGeometry.vertices,\n\t\t\t\t\tammoGeometry.indices,\n\t\t\t\t\tammoGeometry.indices.length / 3,\n\t\t\t\t\ttrue\n\t\t\t\t);\n\n\t\t\t\tconst sbConfig = softBody.get_m_cfg();\n\t\t\t\tsbConfig.set_viterations(40);\n\t\t\t\tsbConfig.set_piterations(40);\n\t\t\t\tsbConfig.set_collisions(0x11); // Soft-soft and soft-rigid collisions\n\t\t\t\tsbConfig.set_kDF(0.1); // Friction\n\t\t\t\tsbConfig.set_kDP(0.01); // Damping\n\t\t\t\tsbConfig.set_kPR(pressure); // Pressure\n\n\t\t\t\t// Stiffness\n\t\t\t\tsoftBody.get_m_materials().at(0).set_m_kLST(0.9);\n\t\t\t\tsoftBody.get_m_materials().at(0).set_m_kAST(0.9);\n\n\t\t\t\tsoftBody.setTotalMass(mass, false);\n\n\t\t\t\tAmmo.castObject(softBody, Ammo.btCollisionObject).getCollisionShape().setMargin(margin);\n\t\t\t\tphysicsWorld.addSoftBody(softBody, 1, -1);\n\t\t\n\t\t\t\tsoftBody.setActivationState(4); // Disable deactivation\n\n\t\t\t\tsoftMeshes.push(mesh);\n\t\t\t\tmeshMap.set(mesh, softBody);\n\t\t\t}\n\n\t\t\tfunction syncTransforms(deltaTime) {\n\t\t\t\tfor (let i = 0, il = softMeshes.length; i < il; i++) {\n\t\t\t\t\tconst mesh = softMeshes[i];\n\t\t\t\t\tconst geometry = mesh.geometry;\n\t\t\t\t\tconst softBody = meshMap.get(mesh);\n\t\t\t\t\tconst ammoGeometry = geometryMap.get(geometry);\n\t\t\n\t\t\t\t\tconst changes = ammoGeometry.changes;\n\t\t\t\t\tconst nodes = softBody.get_m_nodes();\n\n\t\t\t\t\tconst positions = geometry.attributes.a_Position.buffer.array;\n\t\t\t\t\tconst normals = geometry.attributes.a_Normal.buffer.array;\n\t\t\n\t\t\t\t\tfor (let j = 0, jl = changes.length; j < jl; j++) {\n\t\t\t\t\t\tconst node = nodes.at(changes[j]);\n\t\t\t\t\t\tconst nodePos = node.get_m_x();\n\t\t\t\t\t\tconst nodeNormal = node.get_m_n();\n\n\t\t\t\t\t\tpositions[j * 3] = nodePos.x();\n\t\t\t\t\t\tpositions[j * 3 + 1] = nodePos.y();\n\t\t\t\t\t\tpositions[j * 3 + 2] = nodePos.z();\n\n\t\t\t\t\t\tnormals[j * 3] = nodeNormal.x();\n\t\t\t\t\t\tnormals[j * 3 + 1] = nodeNormal.y();\n\t\t\t\t\t\tnormals[j * 3 + 2] = nodeNormal.z();\n\t\t\t\t\t}\n\n\t\t\t\t\tgeometry.attributes.a_Position.buffer.version++;\n\t\t\t\t\tgeometry.attributes.a_Normal.buffer.version++;\n\t\t\t\t}\n\t\t\n\t\t\t\tfor (let i = 0, il = meshes.length; i < il; i++) {\n\t\t\t\t\tconst mesh = meshes[i];\n\t\t\t\t\tconst rigidBody = meshMap.get(mesh);\n\t\t\t\t\tconst ms = rigidBody.getMotionState();\n\t\t\t\t\tif (ms) {\n\t\t\t\t\t\tms.getWorldTransform(worldTransform);\n\t\t\t\t\t\tconst p = worldTransform.getOrigin();\n\t\t\t\t\t\tconst q = worldTransform.getRotation();\n\t\t\t\t\t\tmesh.position.set(p.x(), p.y(), p.z());\n\t\t\t\t\t\tmesh.quaternion.set(q.x(), q.y(), q.z(), q.w());\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Helper Variables and Functions to create scene objects\n\n\t\t\tconst textureLoader = new Texture2DLoader();\n\n\t\t\tconst pos = new t3d.Vector3();\n\t\t\tconst quat = new t3d.Quaternion();\n\n\t\t\tfunction createParalellepiped(sx, sy, sz, mass, pos, quat, material) {\n\t\t\t\tconst mesh = new t3d.Mesh(new t3d.BoxGeometry(sx, sy, sz), new t3d.PhongMaterial());\n\t\t\t\tmesh.position.copy(pos);\n\t\t\t\tmesh.quaternion.copy(quat);\n\t\t\t\tscene.add(mesh);\n\n\t\t\t\tconst shape = new Ammo.btBoxShape(new Ammo.btVector3(sx * 0.5, sy * 0.5, sz * 0.5));\n\t\t\t\tshape.setMargin(margin);\n\n\t\t\t\tcreateRigidBody(mesh, mass, shape);\n\n\t\t\t\treturn mesh;\n\t\t\t}\n\n\t\t\tfunction createSoftVolume(bufferGeom, pos, mass, pressure) {\n\t\t\t\tconst mesh = new t3d.Mesh(bufferGeom, new t3d.PhongMaterial());\n\t\t\t\tmesh.castShadow = true;\n\t\t\t\tmesh.receiveShadow = true;\n\t\t\t\tmesh.frustumCulled = false;\n\t\t\t\tscene.add(mesh);\n\n\t\t\t\tmesh.material.diffuse.setRGB(1, 1, 1);\n\t\t\t\tmesh.material.diffuseMap = textureLoader.load('./resources/logo.jpg');\n\t\t\t\tmesh.material.diffuseMap.encoding = t3d.TEXEL_ENCODING_TYPE.SRGB;\n\t\t\n\t\t\t\tconst ammoGeom = getAmmoGeom(mesh, pos);\n\t\t\t\tgeometryMap.set(mesh.geometry, ammoGeom);\n\n\t\t\t\tcreateSoftBody(mesh, mass, pressure, ammoGeom);\n\n\t\t\t\treturn mesh;\n\t\t\t}\n\n\t\t\tfunction getAmmoGeom(mesh, pos) {\n\t\t\t\tconst matrix = new t3d.Matrix4();\n\t\t\t\tmatrix.makeTranslation(pos.x, pos.y, pos.z);\n\n\t\t\t\tconst triangleSoup = new TriangleSoup();\n\t\t\t\ttriangleSoup.addMesh(mesh, matrix);\n\t\t\t\ttriangleSoup.mergeVertices();\n\n\t\t\t\tconst indices = triangleSoup.indices;\n\t\t\t\tconst oldIndices = mesh.geometry.index.buffer.array;\n\n\t\t\t\tconst changes = [];\n\t\t\t\tfor (let i = 0, il = oldIndices.length; i < il; i++) {\n\t\t\t\t\tchanges[oldIndices[i]] = indices[i];\n\t\t\t\t}\n\n\t\t\t\treturn {\n\t\t\t\t\tvertices: triangleSoup.positions,\n\t\t\t\t\tindices: indices,\n\t\t\t\t\tchanges: changes\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t// Create ground\n\n\t\t\tconst ground = createParalellepiped(40, 1, 40, 0, pos.set(0, -0.5, 0), quat.set(0, 0, 0, 1));\n\t\t\tground.receiveShadow = true;\n\t\t\tground.material.diffuse.setRGB(1, 1, 1);\n\t\t\tground.material.diffuseMap = textureLoader.load('./resources/grid.png');\n\t\t\tground.material.diffuseMap.wrapS = ground.material.diffuseMap.wrapT = t3d.TEXTURE_WRAP.REPEAT;\n\t\t\tground.material.diffuseMap.encoding = t3d.TEXEL_ENCODING_TYPE.SRGB;\n\t\t\tground.material.diffuseMap.anisotropy = 8;\n\t\t\tground.material.diffuseMapTransform.setUvTransform(0, 0, 40, 40, 0, 0.5, 0.5);\n\n\t\t\t// Create Ramp\n\n\t\t\tquat.setFromAxisAngle(new t3d.Vector3(0, 0, 1), 30 * Math.PI / 180);\n\t\t\tconst obstacle = createParalellepiped(10, 1, 4, 0, pos.set(3, 1, 0), quat);\n\t\t\tobstacle.castShadow = true;\n\t\t\tobstacle.receiveShadow = true;\n\t\t\tobstacle.material.diffuse.setHex(0x808080).convertSRGBToLinear();\n\n\t\t\t// Create soft volumes\n\t\t\n\t\t\tconst sphereGeometry = new t3d.SphereGeometry(1.5, 40, 25);\n\t\t\tcreateSoftVolume(sphereGeometry, pos.set(5, 5, 0), 15, 250);\n\n\t\t\tconst boxGeometry = new t3d.BoxGeometry(1, 1, 5, 4, 4, 20);\n\t\t\tcreateSoftVolume(boxGeometry, pos.set(-2, 5, 0), 15, 120);\n\n\t\t\t// User interaction\n\n\t\t\tlet clickRequest = false;\n\t\t\tconst mouseCoords = new t3d.Vector2();\n\t\t\tconst raycaster = new t3d.Raycaster();\n\n\t\t\twindow.addEventListener('mousedown', function(event) {\n\t\t\t\tif (!clickRequest) {\n\t\t\t\t\tmouseCoords.set(\n\t\t\t\t\t\t(event.clientX / window.innerWidth) * 2 - 1,\n\t\t\t\t\t\t-(event.clientY / window.innerHeight) * 2 + 1\n\t\t\t\t\t);\n\n\t\t\t\t\tclickRequest = true;\n\t\t\t\t}\n\t\t\t}, false);\n\n\t\t\twindow.addEventListener('touchstart', function(event) {\n\t\t\t\tif (!clickRequest) {\n\t\t\t\t\tmouseCoords.set(\n\t\t\t\t\t\t(event.touches[0].clientX / window.innerWidth) * 2 - 1,\n\t\t\t\t\t\t-(event.touches[0].clientY / window.innerHeight) * 2 + 1\n\t\t\t\t\t);\n\n\t\t\t\t\tclickRequest = true;\n\t\t\t\t}\n\t\t\t}, false);\n\n\t\t\tconst ballMaterial = new t3d.PhongMaterial();\n\t\t\tballMaterial.diffuse.setHex(0x303030).convertSRGBToLinear();\n\n\t\t\tfunction processClick() {\n\t\t\t\tif (clickRequest) {\n\t\t\t\t\traycaster.setFromCamera(mouseCoords, camera);\n\n\t\t\t\t\tconst ballRadius = 0.4;\n\n\t\t\t\t\tconst ball = new t3d.Mesh(new t3d.SphereGeometry(ballRadius, 18, 16), ballMaterial);\n\t\t\t\t\tball.castShadow = true;\n\t\t\t\t\tball.receiveShadow = true;\n\t\t\t\t\tball.position.copy(raycaster.ray.origin).add(raycaster.ray.direction);\n\t\t\t\t\tscene.add(ball);\n\n\t\t\t\t\tconst ballShape = new Ammo.btSphereShape(ballRadius);\n\t\t\t\t\tballShape.setMargin(margin);\n\t\t\n\t\t\t\t\tconst ballBody = createRigidBody(ball, 3, ballShape);\n\t\t\t\t\tballBody.setFriction(0.5);\n\n\t\t\t\t\tpos.copy(raycaster.ray.direction).multiplyScalar(14);\n\t\t\t\t\tballBody.setLinearVelocity(new Ammo.btVector3(pos.x, pos.y, pos.z));\n\n\t\t\t\t\tclickRequest = false;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tconst stats = new Stats();\n\t\t\tstats.domElement.style.position = 'absolute';\n\t\t\tstats.domElement.style.top = '0px';\n\t\t\tcanvas.parentElement.appendChild(stats.domElement);\n\n\t\t\tlet lastTime = 0;\n\t\t\tfunction loop(timestamp) {\n\t\t\t\trequestAnimationFrame(loop);\n\n\t\t\t\tstats.begin();\n\n\t\t\t\tcontrols.update();\n\n\t\t\t\tif (lastTime > 0) {\n\t\t\t\t\tconst delta = (timestamp - lastTime) / 1000;\n\t\t\t\t\tphysicsWorld.stepSimulation(delta, 1);\n\t\t\t\t\tsyncTransforms(delta);\n\t\t\t\t\tprocessClick();\n\t\t\t\t}\n\n\t\t\t\tlastTime = timestamp;\n\n\t\t\t\tforwardRenderer.render(scene, camera);\n\n\t\t\t\tstats.end();\n\t\t\t}\n\t\t\trequestAnimationFrame(loop);\n\n\t\t\tfunction onWindowResize() {\n\t\t\t\twidth = window.innerWidth || 2;\n\t\t\t\theight = window.innerHeight || 2;\n\n\t\t\t\tcamera.setPerspective(60 / 180 * Math.PI, window.innerWidth / window.innerHeight, 0.2, 2000);\n\n\t\t\t\tforwardRenderer.screenRenderTarget.resize(width, height);\n\t\t\t}\n\t\t\twindow.addEventListener('resize', onWindowResize, false);\n\t\t});\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "examples/physics_cannon.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>t3d - cannon</title>\n\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n\t<link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n</head>\n<body>\n    <div id=\"info\" class=\"dark\">\n\t\t<a href=\"https://github.com/uinosoft/t3d.js\" target=\"_blank\">t3d.js</a> - Physics demo with <a href=\"http://schteppe.github.io/cannon.js\" target=\"_blank\">cannon.js</a>\n        <br/>\n\t\tClick once to create a cube, or click and hold to create multiple cubes\n    </div>\n\n\t<script src=\"./libs/cannon.min.js\"></script>\n\n\t<!-- Import maps polyfill -->\n    <!-- Remove this when import maps will be widely supported -->\n    <script async src=\"./libs/es-module-shims.js\"></script>\n\n    <script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n    <script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { ForwardRenderer } from 't3d/addons/render/ForwardRenderer.js';\n\t\timport { Texture2DLoader } from 't3d/addons/loaders/Texture2DLoader.js';\n\n\t\t/* global CANNON */\n\n\t\tlet width = window.innerWidth || 2;\n\t\tlet height = window.innerHeight || 2;\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = width;\n\t\tcanvas.height = height;\n\t\tdocument.body.appendChild(canvas);\n\n\t\tconst forwardRenderer = new ForwardRenderer(canvas);\n\t\tforwardRenderer.screenRenderTarget.setColorClearValue(0.75, 0.82, 0.9, 1);\n\n\t\tconst scene = new t3d.Scene();\n\t\tscene.fog = new t3d.Fog(0xbfd1e5, 50, 80);\n\n\t\tconst ambientLight = new t3d.AmbientLight(0xffffff, 0.1);\n\t\tscene.add(ambientLight);\n\n\t\tconst directionalLight = new t3d.DirectionalLight(0xffffff, 0.75);\n\t\tdirectionalLight.position.set(-40, 50, 30);\n\t\tdirectionalLight.lookAt(new t3d.Vector3(), new t3d.Vector3(0, 1, 0));\n\t\tdirectionalLight.castShadow = true;\n\t\tdirectionalLight.shadow.mapSize.set(1024, 1024);\n\t\tdirectionalLight.shadow.windowSize = 40;\n\t\tdirectionalLight.shadow.normalBias = -0.05;\n\t\tscene.add(directionalLight);\n\n\t\tconst camera = new t3d.Camera();\n\t\tcamera.outputEncoding = t3d.TEXEL_ENCODING_TYPE.SRGB;\n\t\tcamera.position.set(0, 10, 25);\n\t\tcamera.lookAt(new t3d.Vector3(0, 1, 0), new t3d.Vector3(0, 1, 0));\n\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 1000);\n\t\tscene.add(camera);\n\n\t\t// Init physics world\n\n\t\tconst world = new CANNON.World();\n\t\tworld.gravity.set(0, -9.8, 0);\n\t\tworld.broadphase = new CANNON.NaiveBroadphase();\n\t\tworld.solver.iterations = 10;\n\n\t\tconst meshes = [];\n\t\tconst meshMap = new Map();\n\n\t\tfunction createRigidBody(mesh, mass, shape) {\n\t\t\tconst position = mesh.position;\n\t\t\tconst quaternion = mesh.quaternion;\n\n\t\t\tconst body = new CANNON.Body({\n\t\t\t\tmass: mass,\n\t\t\t\tposition: new CANNON.Vec3(position.x, position.y, position.z),\n\t\t\t\tquaternion: new CANNON.Quaternion(quaternion.x, quaternion.y, quaternion.z, quaternion.w)\n\t\t\t});\n\t\t\tbody.addShape(shape);\n\t\t\tworld.addBody(body);\n\n\t\t\tif (mass > 0) {\n\t\t\t\tmeshes.push(mesh);\n\t\t\t\tmeshMap.set(mesh, body);\n\t\t\t}\n\n\t\t\treturn body;\n\t\t}\n\n\t\tfunction syncTransforms() {\n\t\t\tfor (let i = 0, l = meshes.length; i < l; i++) {\n\t\t\t\tconst body = meshMap.get(meshes[i]);\n\t\t\t\tif (body) {\n\t\t\t\t\tconst position = body.position;\n\t\t\t\t\tconst quaternion = body.quaternion;\n\t\t\t\t\tmeshes[i].position.set(position.x, position.y, position.z);\n\t\t\t\t\tmeshes[i].quaternion.set(quaternion.x, quaternion.y, quaternion.z, quaternion.w);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Create ground\n\t\t\n\t\tconst groundMaterial = new t3d.LambertMaterial();\n\t\tgroundMaterial.diffuse.setHex(0xffffff);\n\t\tgroundMaterial.diffuseMap = new Texture2DLoader().load('./resources/grid.png');\n\t\tgroundMaterial.diffuseMap.wrapS = groundMaterial.diffuseMap.wrapT = t3d.TEXTURE_WRAP.REPEAT;\n\t\tgroundMaterial.diffuseMap.encoding = t3d.TEXEL_ENCODING_TYPE.SRGB;\n\t\tgroundMaterial.diffuseMap.anisotropy = 8;\n\t\tgroundMaterial.diffuseMapTransform.setUvTransform(0, 0, 100, 100, 0, 0.5, 0.5);\n\t\tconst ground = new t3d.Mesh(new t3d.BoxGeometry(200, 1, 200), groundMaterial);\n\t\tground.receiveShadow = true;\n\t\tground.position.y = -1;\n\t\tscene.add(ground);\n\n\t\tconst shape = new CANNON.Box(new CANNON.Vec3(100, 0.5, 100));\n\t\tconst groundBody = createRigidBody(ground, 0, shape);\n\t\tgroundBody.material = new CANNON.Material();\n\t\tgroundBody.material.friction = 1;\n\n\t\t// Create boxes\n\n\t\tfunction createOneBox() {\n\t\t\tconst material = new t3d.PhongMaterial();\n\t\t\tmaterial.diffuse.setHex(0xffffff * Math.random()).convertSRGBToLinear();\n\t\t\tconst box = new t3d.Mesh(new t3d.BoxGeometry(1, 1, 1), material);\n\t\t\tbox.position.x = Math.random() * 2 - 1;\n\t\t\tbox.position.y = Math.random() * 5 + 10;\n\t\t\tbox.position.z = Math.random() * 2 - 1;\n\t\t\tbox.castShadow = true;\n\t\t\tscene.add(box);\n\n\t\t\tconst shape = new CANNON.Box(new CANNON.Vec3(0.5, 0.5, 0.5));\n\t\t\tconst body = createRigidBody(box, 15, shape);\n\t\t\tbody.angularVelocity.set(0, 10, 0);\n\t\t\tbody.material = new CANNON.Material();\n\t\t\tbody.material.friction = 0.5;\n\t\t\tbody.material.restitution = 0.5;\n\t\t\tbody.linearDamping = 0.01;\n\t\t\tbody.angularDamping = 0.1;\n\t\t}\n\n\t\tcreateOneBox();\n\n\t\t// User interaction\n\n\t\tlet isDown = false;\n\t\tlet createInterval;\n\n\t\tfunction onPointerDown(event) {\n\t\t\tisDown = true;\n\t\t\tcreateOneBox();\n\t\t\tcreateInterval = setInterval(createOneBox, 100);\n\t\t}\n\n\t\tfunction onPointerUp(event) {\n\t\t\tif (isDown) {\n\t\t\t\tisDown = false;\n\t\t\t\tclearInterval(createInterval);\n\t\t\t}\n\t\t}\n\n\t\tdocument.addEventListener('pointerdown', onPointerDown);\n\t\tdocument.addEventListener('pointerup', onPointerUp);\n\t\tdocument.addEventListener('pointerleave', onPointerUp);\n\n\t\t//\n\t\t\n\t\tlet lastTime = 0;\n\t\tfunction loop(timestamp) {\n\t\t\trequestAnimationFrame(loop);\n\n\t\t\tif (lastTime > 0) {\n\t\t\t\tconst delta = (timestamp - lastTime) / 1000;\n\t\t\t\tworld.step(delta);\n\t\t\t\tsyncTransforms();\n\t\t\t}\n\n\t\t\tlastTime = timestamp;\n\n\t\t\tforwardRenderer.render(scene, camera);\n\t\t}\n\t\trequestAnimationFrame(loop);\n\n\t\tfunction onWindowResize() {\n\t\t\twidth = window.innerWidth || 2;\n\t\t\theight = window.innerHeight || 2;\n\n\t\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 1000);\n\n\t\t\tforwardRenderer.screenRenderTarget.resize(width, height);\n\t\t}\n\t\twindow.addEventListener('resize', onWindowResize, false);\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "examples/physics_ik.html",
    "content": "<!DOCTYPE html>\n<html>\n\t<head>\n\t\t<meta charset=\"utf-8\" />\n\t\t<title>t3d - physics ik</title>\n\t\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\"/>\n\t\t<link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\" />\n\t</head>\n\t<body>\n\t\t<div id=\"info\" class=\"dark\">\n\t\t\t<a href=\"\" target=\"_blank\">t3d</a> - physics ik\n\t\t</div>\n\n\t\t<script src=\"./libs/nanobar.js\"></script>\n\n\t\t<!-- Import maps polyfill -->\n\t\t<!-- Remove this when import maps will be widely supported -->\n\t\t<script async src=\"./libs/es-module-shims.js\"></script>\n\n\t\t<script type=\"importmap\">\n\t\t\t{\n\t\t\t\t\"imports\": {\n\t\t\t\t\t\"t3d\": \"../build/t3d.module.js\",\n\t\t\t\t\t\"t3d/addons/\": \"./jsm/\"\n\t\t\t\t}\n\t\t\t}\n\t\t</script>\n\n\t\t<script type=\"module\">\n\t\t\timport * as t3d from 't3d';\n\t\t\timport { OrbitControls } from 't3d/addons/controls/OrbitControls.js';\n\t\t\timport { TransformControls } from 't3d/addons/controls/TransformControls.js';\n\t\t\timport { GLTFLoader } from 't3d/addons/loaders/glTF/GLTFLoader.js';\n\t\t\timport { Texture2DLoader } from 't3d/addons/loaders/Texture2DLoader.js';\n\t\t\timport { ForwardRenderer } from 't3d/addons/render/ForwardRenderer.js';\n\t\t\timport { SkeletonHelper } from 't3d/addons/objects/SkeletonHelper.js';\n\t\t\timport { CCDIKSolver } from 't3d/addons/animation/CCDIKSolver.js';\n\t\t\timport { LockedTrack } from 't3d/addons/animation/LockedTrack.js';\n\t\t\timport { GUI } from './libs/lil-gui.esm.min.js';\n\t\t\timport Stats from './libs/stats.module.js';\n\n\t\t\tconst devicePixelRatio = window.devicePixelRatio;\n\n\t\t\tlet width = window.innerWidth || 2;\n\t\t\tlet height = window.innerHeight || 2;\n\n\t\t\tconst canvas = document.createElement('canvas');\n\t\t\tcanvas.width = devicePixelRatio * width;\n\t\t\tcanvas.height = devicePixelRatio * height;\n\t\t\tcanvas.style.width = width + 'px';\n\t\t\tcanvas.style.height = height + 'px';\n\t\t\tdocument.body.appendChild(canvas);\n\n\t\t\tconst forwardRenderer = new ForwardRenderer(canvas);\n\t\t\tforwardRenderer.screenRenderTarget.setColorClearValue(0.6, 0.7, 0.8, 1);\n\n\t\t\tconst stats = new Stats();\n\t\t\tdocument.body.appendChild(stats.dom);\n\n\t\t\tconst scene = new t3d.Scene();\n\t\t\tscene.fog = new t3d.Fog(undefined, 10, 50);\n\t\t\tscene.fog.color.setRGB(0.6, 0.7, 0.8);\n\n\t\t\tconst camera = new t3d.Camera();\n\t\t\tcamera.position.set(0, 2, 5);\n\t\t\tcamera.lookAt(new t3d.Vector3(0, 0, 0), new t3d.Vector3(0, 1, 0));\n\t\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 0.1, 1000);\n\t\t\tcamera.outputEncoding = t3d.TEXEL_ENCODING_TYPE.SRGB;\n\t\t\tscene.add(camera);\n\n\t\t\tconst controls = new OrbitControls(camera, canvas);\n\t\t\tcontrols.target.set(0, 0.5, 0);\n\n\t\t\tconst ambientLight = new t3d.AmbientLight(0xffffff, 0.2);\n\t\t\tscene.add(ambientLight);\n\n\t\t\tconst directionalLight = new t3d.DirectionalLight(0xffffff, 1);\n\t\t\tdirectionalLight.position.set(-40, 50, 30);\n\t\t\tdirectionalLight.lookAt(new t3d.Vector3(), new t3d.Vector3(0, 1, 0));\n\t\t\tdirectionalLight.castShadow = true;\n\t\t\tdirectionalLight.shadow.mapSize.set(1024, 1024);\n\t\t\tdirectionalLight.shadow.windowSize = 5;\n\t\t\tdirectionalLight.shadow.normalBias = 0.05;\n\t\t\tscene.add(directionalLight);\n\n\t\t\tconst groundMaterial = new t3d.LambertMaterial();\n\t\t\tgroundMaterial.diffuse.setHex(0xaaaaaa);\n\t\t\tgroundMaterial.diffuseMap = new Texture2DLoader().load('./resources/grid.png');\n\t\t\tgroundMaterial.diffuseMap.wrapS = groundMaterial.diffuseMap.wrapT = t3d.TEXTURE_WRAP.REPEAT;\n\t\t\tgroundMaterial.diffuseMap.encoding = t3d.TEXEL_ENCODING_TYPE.SRGB;\n\t\t\tgroundMaterial.diffuseMap.anisotropy = 8;\n\t\t\tgroundMaterial.diffuseMapTransform.setUvTransform(0, 0, 400, 400, 0, 0.5, 0.5);\n\t\t\tconst ground = new t3d.Mesh(new t3d.PlaneGeometry(200, 200), groundMaterial);\n\t\t\tground.receiveShadow = true;\n\t\t\tscene.add(ground);\n\n\t\t\tconst nanobar = new Nanobar();\n\t\t\tnanobar.el.style.background = 'gray';\n\t\t\tconst loadingManager = new t3d.LoadingManager(function() {\n\t\t\t\tnanobar.go(100);\n\t\t\t\tnanobar.el.style.background = 'transparent';\n\t\t\t}, function(url, itemsLoaded, itemsTotal) {\n\t\t\t\tif (itemsLoaded < itemsTotal) {\n\t\t\t\t\tnanobar.go((itemsLoaded / itemsTotal) * 100);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tlet ikSolver, lockedTrack, target, transformControls;\n\n\t\t\tconst gltfLoader = new GLTFLoader(loadingManager);\n\t\t\tgltfLoader.load('./resources/models/gltf/IKTest.glb').then(function(gltf) {\n\t\t\t\tgltf.nodes.forEach(n => {\n\t\t\t\t\tn.castShadow = true;\n\t\t\t\t\tn.receiveShadow = true;\n\t\t\t\t});\n\n\t\t\t\tconst model = gltf.root;\n\t\t\t\tscene.add(model);\n\n\t\t\t\tconst DegToRad = Math.PI / 180;\n\n\t\t\t\tconst bones = [\n\t\t\t\t\tmodel.getObjectByName('Bone_4'),\n\t\t\t\t\tmodel.getObjectByName('Bone_3'),\n\t\t\t\t\tmodel.getObjectByName('Bone_2'),\n\t\t\t\t\tmodel.getObjectByName('Bone_1')\n\t\t\t\t];\n\n\t\t\t\tconst iks = [{\n\t\t\t\t\teffector: 0,\n\t\t\t\t\titeration: 10,\n\t\t\t\t\tlinks: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tindex: 1,\n\t\t\t\t\t\t\trotationMin: new t3d.Vector3(0 * DegToRad, 0, 0),\n\t\t\t\t\t\t\trotationMax: new t3d.Vector3(120 * DegToRad, 0, 0)\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tindex: 2,\n\t\t\t\t\t\t\trotationMin: new t3d.Vector3(0 * DegToRad, 0, 0),\n\t\t\t\t\t\t\trotationMax: new t3d.Vector3(120 * DegToRad, 0, 0)\n\t\t\t\t\t\t}, {\n\t\t\t\t\t\t\tindex: 3,\n\t\t\t\t\t\t\trotationMin: new t3d.Vector3(0 * DegToRad, 0, 0),\n\t\t\t\t\t\t\trotationMax: new t3d.Vector3(90 * DegToRad, 0, 0)\n\t\t\t\t\t\t}\n\t\t\t\t\t]\n\t\t\t\t}];\n\n\t\t\t\tikSolver = new CCDIKSolver(bones, iks);\n\t\t\t\tlockedTrack = new LockedTrack(model.getObjectByName('Bone_root'));\n\n\t\t\t\ttarget = model.getObjectByName('Target');\n\t\t\t\ttarget.position.set(1, 0.5, 1);\n\t\t\t\ttarget.updateMatrix();\n\t\t\t\n\t\t\t\ttransformControls = new TransformControls(camera, canvas);\n\t\t\t\ttransformControls.mode = 'translate';\n\t\t\t\ttransformControls.group.addObject(target);\n\t\t\t\ttransformControls.onDragStart = function() {\n\t\t\t\t\tcontrols.enabled = false;\n\t\t\t\t};\n\t\t\t\ttransformControls.onDragEnd = function() {\n\t\t\t\t\tcontrols.enabled = true;\n\t\t\t\t};\n\t\t\t\tscene.add(transformControls);\n\n\t\t\t\tconst skeletonHelper = new SkeletonHelper(scene);\n\t\t\t\tskeletonHelper.visible = false;\n\t\t\t\tskeletonHelper.midWidthScale = 0.06;\n\t\t\t\tskeletonHelper.ballScale = 0.2;\n\t\t\t\tconst gui = new GUI();\n\t\t\t\tgui.add(skeletonHelper, 'visible').name('skeleton').onChange(value => {\n\t\t\t\t\tif (value) {\n\t\t\t\t\t\tscene.add(skeletonHelper);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tscene.remove(skeletonHelper);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}).catch(e => console.error(e));\n\n\t\t\tfunction loop(count) {\n\t\t\t\trequestAnimationFrame(loop);\n\n\t\t\t\tcontrols.update();\n\t\t\t\tstats.update();\n\t\t\t\n\t\t\t\tif (ikSolver) {\n\t\t\t\t\ttransformControls.update();\n\t\t\t\t\ttarget.updateMatrix();\n\n\t\t\t\t\tlockedTrack.target.setFromMatrixPosition(target.worldMatrix);\n\t\t\t\t\tlockedTrack.update();\n\n\t\t\t\t\tikSolver.target.setFromMatrixPosition(target.worldMatrix);\n\t\t\t\t\tikSolver.update();\n\t\t\t\t}\n\n\t\t\t\tforwardRenderer.render(scene, camera);\n\t\t\t}\n\t\t\trequestAnimationFrame(loop);\n\n\t\t\tfunction onWindowResize() {\n\t\t\t\twidth = window.innerWidth || 2;\n\t\t\t\theight = window.innerHeight || 2;\n\n\t\t\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 0.1, 1000);\n\n\t\t\t\tforwardRenderer.screenRenderTarget.resize(devicePixelRatio * width, devicePixelRatio * height);\n\n\t\t\t\tcanvas.style.width = width + 'px';\n\t\t\t\tcanvas.style.height = height + 'px';\n\t\t\t}\n\t\t\twindow.addEventListener('resize', onWindowResize, false);\n\t\t</script>\n\t</body>\n</html>"
  },
  {
    "path": "examples/physics_rapier.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>t3d - rapier</title>\n\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n\t<link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n</head>\n<body>\n    <div id=\"info\" class=\"dark\">\n\t\t<a href=\"https://github.com/uinosoft/t3d.js\" target=\"_blank\">t3d.js</a> - Physics demo with <a href=\"https://rapier.rs\" target=\"_blank\">rapier.js</a>\n        <br/>\n\t\tClick once to create a cube, or click and hold to create multiple cubes\n    </div>\n\n\t<!-- Import maps polyfill -->\n    <!-- Remove this when import maps will be widely supported -->\n    <script async src=\"./libs/es-module-shims.js\"></script>\n\n    <script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n    <script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { ForwardRenderer } from 't3d/addons/render/ForwardRenderer.js';\n\t\timport { Texture2DLoader } from 't3d/addons/loaders/Texture2DLoader.js';\n\t\timport RAPIER from 'https://cdn.skypack.dev/@dimforge/rapier3d-compat@0.12.0';\n\n\t\tRAPIER.init().then(() => {\n\t\t\tlet width = window.innerWidth || 2;\n\t\t\tlet height = window.innerHeight || 2;\n\n\t\t\tconst canvas = document.createElement('canvas');\n\t\t\tcanvas.width = width;\n\t\t\tcanvas.height = height;\n\t\t\tdocument.body.appendChild(canvas);\n\n\t\t\tconst forwardRenderer = new ForwardRenderer(canvas);\n\t\t\tforwardRenderer.screenRenderTarget.setColorClearValue(0.75, 0.82, 0.9, 1);\n\n\t\t\tconst scene = new t3d.Scene();\n\t\t\tscene.fog = new t3d.Fog(0xbfd1e5, 50, 80);\n\n\t\t\tconst ambientLight = new t3d.AmbientLight(0xffffff, 0.1);\n\t\t\tscene.add(ambientLight);\n\n\t\t\tconst directionalLight = new t3d.DirectionalLight(0xffffff, 0.75);\n\t\t\tdirectionalLight.position.set(-40, 50, 30);\n\t\t\tdirectionalLight.lookAt(new t3d.Vector3(), new t3d.Vector3(0, 1, 0));\n\t\t\tdirectionalLight.castShadow = true;\n\t\t\tdirectionalLight.shadow.mapSize.set(1024, 1024);\n\t\t\tdirectionalLight.shadow.windowSize = 40;\n\t\t\tdirectionalLight.shadow.normalBias = -0.05;\n\t\t\tscene.add(directionalLight);\n\n\t\t\tconst camera = new t3d.Camera();\n\t\t\tcamera.outputEncoding = t3d.TEXEL_ENCODING_TYPE.SRGB;\n\t\t\tcamera.position.set(0, 10, 25);\n\t\t\tcamera.lookAt(new t3d.Vector3(0, 1, 0), new t3d.Vector3(0, 1, 0));\n\t\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 1000);\n\t\t\tscene.add(camera);\n\n\t\t\t// Init physics world\n\n\t\t\tconst gravity = { x: 0.0, y: -9.8, z: 0.0 };\n\t\t\tconst world = new RAPIER.World(gravity);\n\n\t\t\tconst meshes = [];\n\t\t\tconst meshMap = new Map();\n\n\t\t\tfunction createRigidBody(mesh, mass, shape) {\n\t\t\t\tconst position = mesh.position;\n\t\t\t\tconst quaternion = mesh.quaternion;\n\n\t\t\t\tlet rigidBodyDesc;\n\t\t\t\tif (mass === 0) {\n\t\t\t\t\trigidBodyDesc = RAPIER.RigidBodyDesc.fixed();\n\t\t\t\t} else {\n\t\t\t\t\trigidBodyDesc = RAPIER.RigidBodyDesc.dynamic();\n\t\t\t\t\tshape.setMass(mass);\n\t\t\t\t}\n\n\t\t\t\trigidBodyDesc.setTranslation(position.x, position.y, position.z);\n\t\t\t\trigidBodyDesc.setRotation({ x: quaternion.x, y: quaternion.y, z: quaternion.z, w: quaternion.w });\n\n\t\t\t\tconst body = world.createRigidBody(rigidBodyDesc);\n\t\t\t\tworld.createCollider(shape, body);\n\n\t\t\t\tif (mass > 0) {\n\t\t\t\t\tmeshes.push(mesh);\n\t\t\t\t\tmeshMap.set(mesh, body);\n\t\t\t\t}\n\n\t\t\t\treturn body;\n\t\t\t}\n\n\t\t\tfunction syncTransforms() {\n\t\t\t\tfor (let i = 0, l = meshes.length; i < l; i++) {\n\t\t\t\t\tconst body = meshMap.get(meshes[i]);\n\t\t\t\t\tif (body) {\n\t\t\t\t\t\tconst position = body.translation();\n\t\t\t\t\t\tconst quaternion = body.rotation();\n\t\t\t\t\t\tmeshes[i].position.set(position.x, position.y, position.z);\n\t\t\t\t\t\tmeshes[i].quaternion.set(quaternion.x, quaternion.y, quaternion.z, quaternion.w);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Create ground\n\n\t\t\tconst groundMaterial = new t3d.LambertMaterial();\n\t\t\tgroundMaterial.diffuse.setHex(0xffffff);\n\t\t\tgroundMaterial.diffuseMap = new Texture2DLoader().load('./resources/grid.png');\n\t\t\tgroundMaterial.diffuseMap.wrapS = groundMaterial.diffuseMap.wrapT = t3d.TEXTURE_WRAP.REPEAT;\n\t\t\tgroundMaterial.diffuseMap.encoding = t3d.TEXEL_ENCODING_TYPE.SRGB;\n\t\t\tgroundMaterial.diffuseMap.anisotropy = 8;\n\t\t\tgroundMaterial.diffuseMapTransform.setUvTransform(0, 0, 100, 100, 0, 0.5, 0.5);\n\t\t\tconst ground = new t3d.Mesh(new t3d.BoxGeometry(200, 1, 200), groundMaterial);\n\t\t\tground.receiveShadow = true;\n\t\t\tground.position.y = -1;\n\t\t\tscene.add(ground);\n\n\t\t\tconst groundShape = RAPIER.ColliderDesc.cuboid(100, 0.5, 100);\n\t\t\tgroundShape.setFriction(1.0);\n\t\t\tcreateRigidBody(ground, 0, groundShape);\n\t\t\n\n\t\t\t// Create boxes\n\n\t\t\tfunction createOneBox() {\n\t\t\t\tconst material = new t3d.PhongMaterial();\n\t\t\t\tmaterial.diffuse.setHex(0xffffff * Math.random()).convertSRGBToLinear();\n\t\t\t\tconst box = new t3d.Mesh(new t3d.BoxGeometry(1, 1, 1), material);\n\t\t\t\tbox.position.x = Math.random() * 2 - 1;\n\t\t\t\tbox.position.y = Math.random() * 5 + 10;\n\t\t\t\tbox.position.z = Math.random() * 2 - 1;\n\t\t\t\tbox.castShadow = true;\n\t\t\t\tscene.add(box);\n\n\t\t\t\tconst boxShape = RAPIER.ColliderDesc.cuboid(0.5, 0.5, 0.5);\n\t\t\t\tconst body = createRigidBody(box, 15, boxShape);\n\t\t\t\tbody.setAngvel({ x: 0.0, y: 10.0, z: 0.0 });\n\t\t\t\tboxShape.setFriction(0.5);\n\t\t\t\tboxShape.setRestitution(0.5);\n\t\t\t\tbody.setLinearDamping(0.01);\n\t\t\t\tbody.setAngularDamping(0.1);\n\t\t\t}\n\n\t\t\tcreateOneBox();\n\n\t\t\t// User interaction\n\n\t\t\tlet isDown = false;\n\t\t\tlet createInterval;\n\n\t\t\tfunction onPointerDown(event) {\n\t\t\t\tisDown = true;\n\t\t\t\tcreateOneBox();\n\t\t\t\tcreateInterval = setInterval(createOneBox, 100);\n\t\t\t}\n\n\t\t\tfunction onPointerUp(event) {\n\t\t\t\tif (isDown) {\n\t\t\t\t\tisDown = false;\n\t\t\t\t\tclearInterval(createInterval);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tdocument.addEventListener('pointerdown', onPointerDown);\n\t\t\tdocument.addEventListener('pointerup', onPointerUp);\n\t\t\tdocument.addEventListener('pointerleave', onPointerUp);\n\n\t\t\t//\n\n\t\t\tlet lastTime = 0;\n\t\t\tfunction loop(timestamp) {\n\t\t\t\trequestAnimationFrame(loop);\n\n\t\t\t\tif (lastTime > 0) {\n\t\t\t\t\tconst delta = (timestamp - lastTime) / 1000;\n\t\t\t\t\tworld.timestamp = delta;\n\t\t\t\t\tworld.step();\n\t\t\t\t\tsyncTransforms();\n\t\t\t\t}\n\n\t\t\t\tlastTime = timestamp;\n\n\t\t\t\tforwardRenderer.render(scene, camera);\n\t\t\t}\n\t\t\trequestAnimationFrame(loop);\n\n\t\t\tfunction onWindowResize() {\n\t\t\t\twidth = window.innerWidth || 2;\n\t\t\t\theight = window.innerHeight || 2;\n\n\t\t\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 1000);\n\n\t\t\t\tforwardRenderer.screenRenderTarget.resize(width, height);\n\t\t\t}\n\t\t\twindow.addEventListener('resize', onWindowResize, false);\n\t\t});\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "examples/physics_rapier_character_controller.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>t3d - rapier</title>\n\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n\t<link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n</head>\n<body>\n    <div id=\"info\" class=\"dark\">\n\t\t<a href=\"https://github.com/uinosoft/t3d.js\" target=\"_blank\">t3d.js</a> - Physics demo character controller with <a href=\"https://rapier.rs\" target=\"_blank\">rapier.js</a>\n        <br/>\n\t\tWASD or Arrow keys to move\n    </div>\n\n\t<!-- Import maps polyfill -->\n    <!-- Remove this when import maps will be widely supported -->\n    <script async src=\"./libs/es-module-shims.js\"></script>\n\n    <script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n    <script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { ForwardRenderer } from 't3d/addons/render/ForwardRenderer.js';\n\t\timport { Texture2DLoader } from 't3d/addons/loaders/Texture2DLoader.js';\n\t\timport { CapsuleGeometry } from 't3d/addons/geometries/CapsuleGeometry.js';\n\t\timport RAPIER from 'https://cdn.skypack.dev/@dimforge/rapier3d-compat@0.12.0';\n\n\t\tRAPIER.init().then(() => {\n\t\t\tlet width = window.innerWidth || 2;\n\t\t\tlet height = window.innerHeight || 2;\n\n\t\t\tconst canvas = document.createElement('canvas');\n\t\t\tcanvas.width = width;\n\t\t\tcanvas.height = height;\n\t\t\tdocument.body.appendChild(canvas);\n\n\t\t\tconst forwardRenderer = new ForwardRenderer(canvas);\n\t\t\tforwardRenderer.screenRenderTarget.setColorClearValue(0.75, 0.82, 0.9, 1);\n\n\t\t\tconst scene = new t3d.Scene();\n\t\t\tscene.fog = new t3d.Fog(0xbfd1e5, 50, 80);\n\n\t\t\tconst ambientLight = new t3d.AmbientLight(0xffffff, 0.1);\n\t\t\tscene.add(ambientLight);\n\n\t\t\tconst directionalLight = new t3d.DirectionalLight(0xffffff, 0.75);\n\t\t\tdirectionalLight.position.set(-40, 50, 30);\n\t\t\tdirectionalLight.lookAt(new t3d.Vector3(), new t3d.Vector3(0, 1, 0));\n\t\t\tdirectionalLight.castShadow = true;\n\t\t\tdirectionalLight.shadow.mapSize.set(1024, 1024);\n\t\t\tdirectionalLight.shadow.windowSize = 40;\n\t\t\tdirectionalLight.shadow.normalBias = -0.05;\n\t\t\tscene.add(directionalLight);\n\n\t\t\tconst camera = new t3d.Camera();\n\t\t\tcamera.outputEncoding = t3d.TEXEL_ENCODING_TYPE.SRGB;\n\t\t\tcamera.position.set(0, 15, 30);\n\t\t\tcamera.lookAt(new t3d.Vector3(0, 1, 0), new t3d.Vector3(0, 1, 0));\n\t\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 1000);\n\t\t\tscene.add(camera);\n\n\t\t\t// Init physics world\n\n\t\t\tconst gravity = { x: 0.0, y: -9.8, z: 0.0 };\n\t\t\tconst world = new RAPIER.World(gravity);\n\n\t\t\tconst meshes = [];\n\t\t\tconst meshMap = new Map();\n\n\t\t\tfunction createRigidBody(mesh, mass, shape) {\n\t\t\t\tconst position = mesh.position;\n\t\t\t\tconst quaternion = mesh.quaternion;\n\n\t\t\t\tlet rigidBodyDesc;\n\t\t\t\tif (mass === 0) {\n\t\t\t\t\trigidBodyDesc = RAPIER.RigidBodyDesc.fixed();\n\t\t\t\t} else {\n\t\t\t\t\trigidBodyDesc = RAPIER.RigidBodyDesc.dynamic();\n\t\t\t\t\tshape.setMass(mass);\n\t\t\t\t}\n\n\t\t\t\trigidBodyDesc.setTranslation(position.x, position.y, position.z);\n\t\t\t\trigidBodyDesc.setRotation({ x: quaternion.x, y: quaternion.y, z: quaternion.z, w: quaternion.w });\n\n\t\t\t\tconst body = world.createRigidBody(rigidBodyDesc);\n\t\t\t\tworld.createCollider(shape, body);\n\n\t\t\t\tif (mass > 0) {\n\t\t\t\t\tmeshes.push(mesh);\n\t\t\t\t\tmeshMap.set(mesh, body);\n\t\t\t\t}\n\n\t\t\t\treturn body;\n\t\t\t}\n\n\t\t\tfunction syncTransforms() {\n\t\t\t\tfor (let i = 0, l = meshes.length; i < l; i++) {\n\t\t\t\t\tconst body = meshMap.get(meshes[i]);\n\t\t\t\t\tif (body) {\n\t\t\t\t\t\tconst position = body.translation();\n\t\t\t\t\t\tconst quaternion = body.rotation();\n\t\t\t\t\t\tmeshes[i].position.set(position.x, position.y, position.z);\n\t\t\t\t\t\tmeshes[i].quaternion.set(quaternion.x, quaternion.y, quaternion.z, quaternion.w);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Create ground\n\n\t\t\tconst groundMaterial = new t3d.LambertMaterial();\n\t\t\tgroundMaterial.diffuse.setHex(0xffffff);\n\t\t\tgroundMaterial.diffuseMap = new Texture2DLoader().load('./resources/grid.png');\n\t\t\tgroundMaterial.diffuseMap.wrapS = groundMaterial.diffuseMap.wrapT = t3d.TEXTURE_WRAP.REPEAT;\n\t\t\tgroundMaterial.diffuseMap.encoding = t3d.TEXEL_ENCODING_TYPE.SRGB;\n\t\t\tgroundMaterial.diffuseMap.anisotropy = 8;\n\t\t\tgroundMaterial.diffuseMapTransform.setUvTransform(0, 0, 100, 100, 0, 0.5, 0.5);\n\t\t\tconst ground = new t3d.Mesh(new t3d.BoxGeometry(200, 1, 200), groundMaterial);\n\t\t\tground.receiveShadow = true;\n\t\t\tground.position.y = -1;\n\t\t\tscene.add(ground);\n\n\t\t\tconst groundShape = RAPIER.ColliderDesc.cuboid(100, 0.5, 100);\n\t\t\tgroundShape.setFriction(1.0);\n\t\t\tcreateRigidBody(ground, 0, groundShape);\n\n\t\t\t// Create random static and dynamic objects\n\n\t\t\tfunction random(min, max) {\n\t\t\t\treturn Math.random() * (max - min) + min;\n\t\t\t}\n\n\t\t\tfunction createRandomObject(fixed = true) {\n\t\t\t\tconst geometry = fixed ? new t3d.BoxGeometry(1.5, 1.5, 1.5) : new t3d.SphereGeometry(0.5, 16, 16);\n\t\t\t\tconst material = new t3d.PhongMaterial();\n\t\t\t\tmaterial.diffuse.setHex(fixed ? 0xff0000 : 0x00ff00).convertSRGBToLinear();\n\t\t\t\tconst mesh = new t3d.Mesh(geometry, material);\n\t\t\t\tmesh.position.set(random(-12, 12), 0.75 - 0.5, random(-12, 12));\n\t\t\t\tmesh.castShadow = true;\n\t\t\t\tscene.add(mesh);\n\n\t\t\t\tconst shape = fixed ? RAPIER.ColliderDesc.cuboid(0.75, 0.75, 0.75) : RAPIER.ColliderDesc.ball(0.5);\n\t\t\t\tshape.setRestitution(fixed ? 0 : 0.3);\n\n\t\t\t\tcreateRigidBody(mesh, fixed ? 0 : 1, shape);\n\t\t\t}\n\t\t\n\t\t\tfor (let i = 0; i < 10; i++) {\n\t\t\t\tcreateRandomObject(Math.random() > 0.7);\n\t\t\t}\n\n\t\t\t// Create Character\n\n\t\t\tconst characterMaterial = new t3d.PhongMaterial();\n\t\t\tcharacterMaterial.diffuse.setHex(0x0000ff).convertSRGBToLinear();\n\t\t\tconst character = new t3d.Mesh(new CapsuleGeometry(0.5, 1, 20, 20), characterMaterial);\n\t\t\tcharacter.castShadow = true;\n\t\t\tcharacter.position.set(0, 0.5, 0);\n\t\t\tscene.add(character);\n\n\t\t\tconst characterShape = RAPIER.ColliderDesc.capsule(0.5, 0.5).setTranslation(0, 0.5, 0);\n\t\t\tcharacter.userData.collider = world.createCollider(characterShape);\n\n\t\t\tconst characterController = world.createCharacterController(0.01);\n\t\t\tcharacterController.setApplyImpulsesToDynamicBodies(true);\n\t\t\tcharacterController.setCharacterMass(3);\n\t\t\n\t\t\t// User interaction\n\t\t\n\t\t\tconst moveDirection = new t3d.Vector2();\n\n\t\t\tconst keyStates = {};\n\t\t\n\t\t\tfunction handleKeyDown(event) {\n\t\t\t\tkeyStates[event.code] = true;\n\t\t\t}\n\t\t\n\t\t\tfunction handleKeyUp(event) {\n\t\t\t\tkeyStates[event.code] = false;\n\t\t\t}\n\t\t\n\t\t\tdocument.addEventListener('keydown', handleKeyDown);\n\t\t\tdocument.addEventListener('keyup', handleKeyUp);\n\t\t\n\t\t\tfunction updateCharacterMovement(deltaTime) {\n\t\t\t\tmoveDirection.x = 0;\n\t\t\t\tmoveDirection.z = 0;\n\t\t\n\t\t\t\tif (keyStates['KeyW'] || keyStates['ArrowUp']) moveDirection.z = -1;\n\t\t\t\tif (keyStates['KeyS'] || keyStates['ArrowDown']) moveDirection.z = 1;\n\t\t\t\tif (keyStates['KeyA'] || keyStates['ArrowLeft']) moveDirection.x = -1;\n\t\t\t\tif (keyStates['KeyD'] || keyStates['ArrowRight']) moveDirection.x = 1;\n\t\t\n\t\t\t\tif (moveDirection.x !== 0 && moveDirection.z !== 0) {\n\t\t\t\t\tmoveDirection.normalize();\n\t\t\t\t}\n\n\t\t\t\tconst moveSpeed = 15 * deltaTime;\n\n\t\t\t\tconst moveVector = new RAPIER.Vector3(moveDirection.x * moveSpeed, 0, moveDirection.z * moveSpeed);\n\t\t\t\tcharacterController.computeColliderMovement(character.userData.collider, moveVector);\n\t\t\n\t\t\t\tconst translation = characterController.computedMovement();\n\t\t\t\tconst position = character.userData.collider.translation();\n\n\t\t\t\tposition.x += translation.x;\n\t\t\t\tposition.y += translation.y;\n\t\t\t\tposition.z += translation.z;\n\n\t\t\t\tcharacter.userData.collider.setTranslation(position);\n\t\t\t\tcharacter.position.set(position.x, position.y, position.z);\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tlet lastTime = 0;\n\t\t\tfunction loop(timestamp) {\n\t\t\t\trequestAnimationFrame(loop);\n\n\t\t\t\tif (lastTime > 0) {\n\t\t\t\t\tconst delta = (timestamp - lastTime) / 1000;\n\t\t\t\t\tupdateCharacterMovement(delta);\n\t\t\t\t\tworld.timestamp = delta;\n\t\t\t\t\tworld.step();\n\t\t\t\t\tsyncTransforms();\n\t\t\t\t}\n\n\t\t\t\tlastTime = timestamp;\n\n\t\t\t\tforwardRenderer.render(scene, camera);\n\t\t\t}\n\t\t\trequestAnimationFrame(loop);\n\n\t\t\tfunction onWindowResize() {\n\t\t\t\twidth = window.innerWidth || 2;\n\t\t\t\theight = window.innerHeight || 2;\n\n\t\t\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 1000);\n\n\t\t\t\tforwardRenderer.screenRenderTarget.resize(width, height);\n\t\t\t}\n\t\t\twindow.addEventListener('resize', onWindowResize, false);\n\t\t});\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "examples/points_sprites.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>t3d - sprites</title>\n\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n\t<link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n</head>\n<body>\n    <div id=\"info\">\n        <a href=\"\" target=\"_blank\">t3d</a> - sprites\n    </div>\n\n\t<!-- Import maps polyfill -->\n    <!-- Remove this when import maps will be widely supported -->\n    <script async src=\"./libs/es-module-shims.js\"></script>\n\n    <script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n    <script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { ForwardRenderer } from 't3d/addons/render/ForwardRenderer.js';\n\t\timport { Texture2DLoader } from 't3d/addons/loaders/Texture2DLoader.js';\n\n\t\tlet width = window.innerWidth || 2;\n\t\tlet height = window.innerHeight || 2;\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = width;\n\t\tcanvas.height = height;\n\t\tdocument.body.appendChild(canvas);\n\n\t\tconst forwardRenderer = new ForwardRenderer(canvas);\n\n\t\tconst scene = new t3d.Scene();\n\t\tscene.fog = new t3d.FogExp2(0x000000, 0.0008);\n\n\t\tconst loader = new Texture2DLoader();\n\n\t\tconst texture1 = loader.load('./resources/sprites/snowflake1.png');\n\t\tconst texture2 = loader.load('./resources/sprites/snowflake2.png');\n\t\tconst texture3 = loader.load('./resources/sprites/snowflake3.png');\n\t\tconst texture4 = loader.load('./resources/sprites/snowflake4.png');\n\t\tconst texture5 = loader.load('./resources/sprites/snowflake5.png');\n\n\t\tconst pointsGeometry = new t3d.Geometry();\n\t\tconst verticesArray = [];\n\n\t\tfor (let i = 0; i < 10000; i++) {\n\t\t\tverticesArray.push(\n\t\t\t\tMath.random() * 2000 - 1000,\n\t\t\t\tMath.random() * 2000 - 1000,\n\t\t\t\tMath.random() * 2000 - 1000\n\t\t\t);\n\t\t}\n\n\t\tpointsGeometry.addAttribute('a_Position', new t3d.Attribute(new t3d.Buffer(new Float32Array(verticesArray), 3)));\n\n\t\tpointsGeometry.computeBoundingBox();\n\t\tpointsGeometry.computeBoundingSphere();\n\n\t\tconst params = [\n\t\t\t[texture2, 20],\n\t\t\t[texture3, 15],\n\t\t\t[texture1, 10],\n\t\t\t[texture5, 8],\n\t\t\t[texture4, 5]\n\t\t];\n\t\tconst pointsArray = [];\n\t\tfor (let j = 0; j < params.length; j++) {\n\t\t\tconst param = params[j];\n\n\t\t\tconst pointsMaterial = new t3d.PointsMaterial();\n\t\t\tpointsMaterial.diffuse.setHex(0xffffff);\n\t\t\tpointsMaterial.diffuseMap = param[0];\n\t\t\tpointsMaterial.size = param[1];\n\t\t\tpointsMaterial.blending = t3d.BLEND_TYPE.ADD;\n\t\t\tpointsMaterial.depthWrite = false;\n\t\t\tpointsMaterial.transparent = true;\n\n\t\t\tconst points = new t3d.Mesh(pointsGeometry, pointsMaterial);\n\t\t\tscene.add(points);\n\n\t\t\tpoints.euler.x = Math.random() * 6;\n\t\t\tpoints.euler.y = Math.random() * 6;\n\t\t\tpoints.euler.z = Math.random() * 6;\n\n\t\t\tpointsArray.push(points);\n\t\t}\n\n\t\tconst camera = new t3d.Camera();\n\t\tcamera.position.set(0, 0, 1000);\n\t\tcamera.lookAt(new t3d.Vector3(0, 0, 0), new t3d.Vector3(0, 1, 0));\n\t\tcamera.setPerspective(75 / 180 * Math.PI, width / height, 1, 2000);\n\t\tscene.add(camera);\n\n\t\tfunction loop(timestamp) {\n\t\t\trequestAnimationFrame(loop);\n\n\t\t\tconst time = timestamp * 0.00005;\n\n\t\t\tfor (let i = 0; i < pointsArray.length; i++) {\n\t\t\t\tpointsArray[i].euler.y = time * (i < 4 ? i + 1 : -(i + 1));\n\t\t\t}\n\n\t\t\tforwardRenderer.render(scene, camera);\n\t\t}\n\t\trequestAnimationFrame(loop);\n\n\t\tfunction onWindowResize() {\n\t\t\twidth = window.innerWidth || 2;\n\t\t\theight = window.innerHeight || 2;\n\n\t\t\tcamera.setPerspective(75 / 180 * Math.PI, width / height, 1, 2000);\n\n\t\t\tforwardRenderer.screenRenderTarget.resize(width, height);\n\t\t}\n\t\twindow.addEventListener('resize', onWindowResize, false);\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "examples/probes_reflection.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>t3d - probes reflection</title>\n\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n\t<link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n</head>\n<body>\n    <div id=\"info\">\n        <a href=\"\" target=\"_blank\">t3d</a> - probes reflection\n    </div>\n\n\t<script src=\"./libs/nanobar.js\"></script>\n\n\t<!-- Import maps polyfill -->\n    <!-- Remove this when import maps will be widely supported -->\n    <script async src=\"./libs/es-module-shims.js\"></script>\n\n    <script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n    <script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { ForwardRenderer } from 't3d/addons/render/ForwardRenderer.js';\n\t\timport { SkyBox } from 't3d/addons/objects/SkyBox.js';\n\t\timport { GLTFLoader } from 't3d/addons/loaders/glTF/GLTFLoader.js';\n\t\timport { Texture2DLoader } from 't3d/addons/loaders/Texture2DLoader.js';\n\t\timport { TextureCubeLoader } from 't3d/addons/loaders/TextureCubeLoader.js';\n\t\timport { ReflectionProbe } from 't3d/addons/probes/ReflectionProbe.js';\n\n\t\tlet width = window.innerWidth || 2;\n\t\tlet height = window.innerHeight || 2;\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = width;\n\t\tcanvas.height = height;\n\t\tdocument.body.appendChild(canvas);\n\n\t\tconst forwardRenderer = new ForwardRenderer(canvas);\n\t\tforwardRenderer.matrixAutoUpdate = false;\n\t\tforwardRenderer.renderStatesAutoUpdate = false;\n\t\tforwardRenderer.renderQueueAutoUpdate = false;\n\t\tforwardRenderer.screenRenderTarget.setColorClearValue(0.1, 0.2, 0.3, 1);\n\n\t\tconst scene = new t3d.Scene();\n\n\t\tconst cubeTexturePath = './resources/skybox/sunset/';\n\t\tconst cubeTexture = new TextureCubeLoader().load([\n\t\t\tcubeTexturePath + 'px.jpg',\n\t\t\tcubeTexturePath + 'nx.jpg',\n\t\t\tcubeTexturePath + 'py.jpg',\n\t\t\tcubeTexturePath + 'ny.jpg',\n\t\t\tcubeTexturePath + 'pz.jpg',\n\t\t\tcubeTexturePath + 'nz.jpg'\n\t\t]);\n\t\tconst skyBox = new SkyBox(cubeTexture);\n\t\tscene.add(skyBox);\n\n\t\t// small ball\n\t\tconst ball_geometry = new t3d.SphereGeometry(2, 32, 16);\n\n\t\tconst ball1_material = new t3d.BasicMaterial();\n\t\tball1_material.diffuse.setHex(0xff2222);\n\t\tconst ball1 = new t3d.Mesh(ball_geometry, ball1_material);\n\t\tball1.position.set(20, 0, 0);\n\t\tscene.add(ball1);\n\n\t\tconst pointLight1 = new t3d.PointLight(0xff2222, 1, 50);\n\t\tball1.add(pointLight1);\n\n\t\tconst ball2_material = new t3d.BasicMaterial();\n\t\tball2_material.diffuse.setHex(0x2222ff);\n\t\tconst ball2 = new t3d.Mesh(ball_geometry, ball2_material);\n\t\tball2.position.set(0, 0, 15);\n\t\tscene.add(ball2);\n\n\t\tconst pointLight2 = new t3d.PointLight(0x2222ff, 1, 50);\n\t\tball2.add(pointLight2);\n\n\t\t// plane\n\t\tconst texture = new Texture2DLoader().load('./resources/hardwood2_diffuse.jpg');\n\t\ttexture.anisotropy = 16;\n\t\ttexture.wrapT = texture.wrapS = t3d.TEXTURE_WRAP.REPEAT;\n\t\tconst plane_geometry = new t3d.PlaneGeometry(1000, 1000);\n\t\tconst plane_material = new t3d.PBRMaterial();\n\t\tplane_material.diffuse.setHex(0xffffff);\n\t\tplane_material.diffuseMap = texture;\n\t\tplane_material.diffuseMapTransform.setUvTransform(0, 0, 20, 20, 0, 0.5, 0.5);\n\t\tplane_material.roughness = 0.8;\n\t\tplane_material.metalness = 0.2;\n\t\tconst plane = new t3d.Mesh(plane_geometry, plane_material);\n\t\tplane.position.set(0, -18, 0);\n\t\tscene.add(plane);\n\n\t\t// sphere\n\t\tconst reflectionProbe = new ReflectionProbe();\n\n\t\tconst nanobar = new Nanobar();\n\t\tnanobar.el.style.background = 'gray';\n\n\t\tconst loadingManager = new t3d.LoadingManager(function() {\n\t\t\tnanobar.go(100);\n\t\t\tnanobar.el.style.background = 'transparent';\n\t\t}, function(url, itemsLoaded, itemsTotal) {\n\t\t\tif (itemsLoaded < itemsTotal) {\n\t\t\t\tnanobar.go(itemsLoaded / itemsTotal * 100);\n\t\t\t}\n\t\t});\n\n\t\tconst loader = new GLTFLoader(loadingManager);\n\t\tloader.load('./resources/models/gltf/suzanne/suzanne.gltf').then(function(result) {\n\t\t\tconst object = result.root.children[0];\n\t\t\tobject.scale.set(10, 10, 10);\n\t\t\tobject.material.roughness = 0.2;\n\t\t\tobject.material.metalness = 0.95;\n\t\t\tobject.material.diffuse.setRGB(1, 1, 1);\n\t\t\tobject.skipReflectionProbe = true;\n\t\t\tobject.material.envMap = reflectionProbe.renderTexture;\n\t\t\tscene.add(object);\n\n\t\t\tforwardRenderer.shadowNeedsUpdate = true;\n\t\t});\n\n\t\tconst ambientLight = new t3d.AmbientLight(0xffffff, 0.8);\n\t\tscene.add(ambientLight);\n\n\t\t// camera\n\t\tconst camera = new t3d.Camera();\n\t\tcamera.position.set(0, 10, 100);\n\t\tcamera.lookAt(new t3d.Vector3(0, 0, 0), new t3d.Vector3(0, 1, 0));\n\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 1000);\n\t\tscene.add(camera);\n\n\t\tfunction loop(count) {\n\t\t\trequestAnimationFrame(loop);\n\n\t\t\t// ball rotation\n\t\t\tball1.position.x = Math.sin(count / 1000 * 1) * 20;\n\t\t\tball1.position.y = 0;\n\t\t\tball1.position.z = Math.cos(count / 1000 * 1) * 20;\n\t\t\tball2.position.x = 0;\n\t\t\tball2.position.y = Math.sin(count / 1000 * 1) * 15;\n\t\t\tball2.position.z = Math.cos(count / 1000 * 1) * 15;\n\n\t\t\t// rotate camera\n\t\t\tcamera.position.x = 80 * Math.sin(count / 1000 * .2);\n\t\t\tcamera.position.z = 80 * Math.cos(count / 1000 * .2);\n\t\t\tcamera.lookAt(new t3d.Vector3(0, 0, 0), new t3d.Vector3(0, 1, 0));\n\n\t\t\tscene.updateMatrix();\n\t\t\tscene.updateRenderStates(camera);\n\t\t\tscene.updateRenderQueue(camera);\n\n\t\t\treflectionProbe.render(forwardRenderer, scene);\n\t\t\n\t\t\tforwardRenderer.render(scene, camera);\n\t\t}\n\t\trequestAnimationFrame(loop);\n\n\t\tfunction onWindowResize() {\n\t\t\twidth = window.innerWidth || 2;\n\t\t\theight = window.innerHeight || 2;\n\n\t\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 1000);\n\n\t\t\tforwardRenderer.screenRenderTarget.resize(width, height);\n\t\t}\n\t\twindow.addEventListener('resize', onWindowResize, false);\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "examples/probes_reflection_planar.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>t3d - probes reflection planar</title>\n\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n\t<link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n</head>\n<body>\n    <div id=\"info\">\n        <a href=\"\" target=\"_blank\">t3d</a> - probes reflection planar\n    </div>\n\n\t<script src=\"./libs/nanobar.js\"></script>\n\n\t<!-- Import maps polyfill -->\n    <!-- Remove this when import maps will be widely supported -->\n    <script async src=\"./libs/es-module-shims.js\"></script>\n\n    <script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n    <script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { Clock } from 't3d/addons/Clock.js';\n\t\timport { ForwardRenderer } from 't3d/addons/render/ForwardRenderer.js';\n\t\timport { SkyBox } from 't3d/addons/objects/SkyBox.js';\n\t\timport { GLTFLoader } from 't3d/addons/loaders/glTF/GLTFLoader.js';\n\t\timport { EnvTextureCubeLoader } from 't3d/addons/loaders/EnvLoader.js';\n\t\timport { Texture2DLoader } from 't3d/addons/loaders/Texture2DLoader.js';\n\t\timport { OrbitControls } from 't3d/addons/controls/OrbitControls.js';\n\t\timport { PlanarReflectionProbe } from 't3d/addons/probes/PlanarReflectionProbe.js';\n\t\timport { PlanarReflectionMaterial } from 't3d/addons/materials/PlanarReflectionMaterial.js';\n\t\timport { GUI } from './libs/lil-gui.esm.min.js';\n\n\t\tlet width = window.innerWidth || 2;\n\t\tlet height = window.innerHeight || 2;\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = width;\n\t\tcanvas.height = height;\n\t\tdocument.body.appendChild(canvas);\n\n\t\tconst forwardRenderer = new ForwardRenderer(canvas);\n\t\tforwardRenderer.shadowAutoUpdate = false;\n\n\t\tconst scene = new t3d.Scene();\n\n\t\tconst camera = new t3d.Camera();\n\t\tcamera.outputEncoding = t3d.TEXEL_ENCODING_TYPE.SRGB;\n\t\tcamera.position.set(0, 2, 5);\n\t\tcamera.lookAt(new t3d.Vector3(0, 0, 0), new t3d.Vector3(0, 1, 0));\n\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 0.1, 1000);\n\t\tscene.add(camera);\n\n\t\tconst controller = new OrbitControls(camera, canvas);\n\t\tcontroller.target.set(0, 1, 0);\n\n\t\tconst leftLight = new t3d.DirectionalLight(0x00ff00);\n\t\tleftLight.position.set(-10, 10, 10);\n\t\tleftLight.lookAt(new t3d.Vector3(), new t3d.Vector3(0, 1, 0));\n\t\tleftLight.castShadow = true;\n\t\tleftLight.shadow.mapSize.set(512, 512);\n\t\tleftLight.shadow.windowSize = 5;\n\t\tscene.add(leftLight);\n\n\t\tconst rightLight = new t3d.DirectionalLight(0xff00ff);\n\t\trightLight.position.set(10, 10, 10);\n\t\trightLight.lookAt(new t3d.Vector3(), new t3d.Vector3(0, 1, 0));\n\t\trightLight.castShadow = true;\n\t\trightLight.shadow.mapSize.set(512, 512);\n\t\trightLight.shadow.windowSize = 5;\n\t\tscene.add(rightLight);\n\n\t\tconst nanobar = new Nanobar();\n\t\tnanobar.el.style.background = 'gray';\n\n\t\tconst loadingManager = new t3d.LoadingManager(function() {\n\t\t\tnanobar.go(100);\n\t\t\tnanobar.el.style.background = 'transparent';\n\t\t}, function(url, itemsLoaded, itemsTotal) {\n\t\t\tif (itemsLoaded < itemsTotal) {\n\t\t\t\tnanobar.go(itemsLoaded / itemsTotal * 100);\n\t\t\t}\n\t\t});\n\n\t\t// prepare environment\n\n\t\tconst envTextureLoader = new EnvTextureCubeLoader(loadingManager);\n\t\tenvTextureLoader.setRenderer(forwardRenderer);\n\t\tenvTextureLoader.loadAsync('./resources/hdr/Grand_Canyon_C.env').then(cubeTexture => {\n\t\t\tscene.environment = cubeTexture;\n\t\t\tscene.envSpecularIntensity = 2.5;\n\n\t\t\tconst skyBox = new SkyBox(cubeTexture);\n\t\t\tskyBox.gamma = true;\n\t\t\tskyBox.level = 3;\n\t\t\tscene.add(skyBox);\n\t\t});\n\n\t\t// load model\n\t\t\n\t\tlet animation;\n\n\t\tconst loader = new GLTFLoader(loadingManager);\n\t\tloader.load('./resources/models/gltf/Michelle.glb').then(function(result) {\n\t\t\tconst object = result.root;\n\n\t\t\tobject.traverse(node => {\n\t\t\t\tif (node.isMesh) {\n\t\t\t\t\tnode.frustumCulled = false;\n\t\t\t\t\tnode.castShadow = true;\n\t\t\t\t}\n\t\t\t});\n\t\t\n\t\t\tconst action = new t3d.AnimationAction(result.animations[0]);\n\t\t\taction.time = 0;\n\t\t\taction.weight = 1;\n\t\t\tanimation = new t3d.AnimationMixer();\n\t\t\tanimation.addAction(action);\n\t\t\n\t\t\tscene.add(object);\n\t\t}).catch(e => console.error(e));\n\n\t\t// create planes\n\n\t\tconst textureLoader = new Texture2DLoader(loadingManager);\n\n\t\tconst diffuseMap = textureLoader.load('./resources/floors/FloorsCheckerboard_S_Diffuse.jpg');\n\t\tdiffuseMap.wrapT = diffuseMap.wrapS = t3d.TEXTURE_WRAP.REPEAT;\n\t\tdiffuseMap.encoding = t3d.TEXEL_ENCODING_TYPE.SRGB;\n\t\tdiffuseMap.anisotropy = 16;\n\n\t\tconst normalMap = textureLoader.load('./resources/floors/FloorsCheckerboard_S_Normal.jpg');\n\t\tnormalMap.wrapT = normalMap.wrapS = t3d.TEXTURE_WRAP.REPEAT;\n\n\t\tconst planeGeometry = new t3d.PlaneGeometry(5, 3);\n\n\t\tfunction createPlane(x, y, z, rotationX = 0) {\n\t\t\tconst planeMaterial = new PlanarReflectionMaterial();\n\t\t\tplaneMaterial.diffuse.setHex(0xffffff);\n\t\t\tplaneMaterial.diffuseMap = diffuseMap;\n\t\t\tif (rotationX) {\n\t\t\t\tplaneMaterial.diffuseMapTransform.setUvTransform(0, 0, 5, 3, 0, 0.5, 0.5);\n\t\t\t} else {\n\t\t\t\tplaneMaterial.diffuseMapTransform.setUvTransform(0.25, 0.25, 2.5, 1.5, 0, 0.5, 0.5);\n\t\t\t}\n\t\t\tplaneMaterial.normalMap = normalMap;\n\t\t\tplaneMaterial.normalScale.set(0.1, 0.1);\n\t\t\tplaneMaterial.roughness = rotationX ? 0 : 0.3;\n\t\t\tplaneMaterial.metalness = rotationX ? 1 : 0.7;\n\t\t\n\t\t\tconst plane = new t3d.Mesh(planeGeometry, planeMaterial);\n\t\t\tplane.position.set(x, y, z);\n\t\t\tplane.euler.x = rotationX;\n\t\t\tplane.receiveShadow = true;\n\n\t\t\tconst probe = new PlanarReflectionProbe();\n\t\t\tprobe.renderTexture.encoding = t3d.TEXEL_ENCODING_TYPE.SRGB;\n\t\t\tprobe.renderOption.ifRender = function(renderable) {\n\t\t\t\tif (!params.reflectSky && renderable.material.shaderName == 'skybox') {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\treturn renderable.object !== plane;\n\t\t\t};\n\t\t\n\t\t\tplane.probe = probe;\n\t\t\tplane.material.uniforms.reflectTexture = probe.renderTexture;\n\t\t\n\t\t\treturn plane;\n\t\t}\n\n\t\tconst groundPlane = createPlane(0, 0, 0);\n\t\tgroundPlane.probe.plane.normal.set(0, 1, 0);\n\t\tgroundPlane.probe.plane.constant = 0;\n\t\tscene.add(groundPlane);\n\n\t\tconst wallPlane = createPlane(0, 1, -1.5, Math.PI / 2);\n\t\twallPlane.probe.plane.normal.set(0, 0, 1);\n\t\twallPlane.probe.plane.constant = 1.5;\n\t\tscene.add(wallPlane);\n\t\t\n\t\t// gui\n\n\t\tconst params = { reflectIntensity: 0.39, reflectNormalScale: 1, reflectSky: true };\n\t\tconst gui = new GUI();\n\t\tgui.add(params, 'reflectIntensity', 0, 1, 0.01).name('Reflect Intensity');\n\t\tgui.add(params, 'reflectNormalScale', 0, 2, 0.01).name('Reflect Normal Scale');\n\t\tgui.add(params, 'reflectSky').name('Reflect Sky');\n\n\t\t//\n\n\t\tconst clock = new Clock();\n\t\tfunction loop(count) {\n\t\t\trequestAnimationFrame(loop);\n\t\t\tcontroller.update();\n\t\t\n\t\t\tconst delta = clock.getDelta();\n\n\t\t\tanimation && animation.update(delta);\n\n\t\t\tscene.updateMatrix();\n\t\t\tscene.updateRenderStates(camera);\n\t\t\tscene.updateRenderQueue(camera);\n\n\t\t\tforwardRenderer.shadowMapPass.render(forwardRenderer, scene);\n\n\t\t\tforwardRenderer.screenRenderTarget.setColorClearValue(0, 0, 0, 0);\n\n\t\t\t// clear reflection before render probes\n\t\t\t// to avoid self reflection\n\t\t\twallPlane.material.uniforms.reflectIntensity = 0;\n\t\t\tgroundPlane.material.uniforms.reflectIntensity = 0;\n\n\t\t\tgroundPlane.probe.render(forwardRenderer, scene, camera);\n\t\t\tgroundPlane.probe.textureMatrix.toArray(groundPlane.material.uniforms.reflectTextureMatrix);\n\n\t\t\twallPlane.probe.render(forwardRenderer, scene, camera);\n\t\t\twallPlane.probe.textureMatrix.toArray(wallPlane.material.uniforms.reflectTextureMatrix);\n\n\t\t\t// restore reflect intensity\n\t\t\twallPlane.material.uniforms.reflectIntensity = params.reflectIntensity;\n\t\t\tgroundPlane.material.uniforms.reflectIntensity = params.reflectIntensity * 0.8;\n\n\t\t\twallPlane.material.uniforms.reflectNormalScale = params.reflectNormalScale;\n\t\t\tgroundPlane.material.uniforms.reflectNormalScale = params.reflectNormalScale * 2;\n\n\t\t\tforwardRenderer.screenRenderTarget.setColorClearValue(0.2, 0.2, 0.2, 1);\n\n\t\t\tforwardRenderer.render(scene, camera);\n\t\t}\n\t\trequestAnimationFrame(loop);\n\n\t\tfunction onWindowResize() {\n\t\t\twidth = window.innerWidth || 2;\n\t\t\theight = window.innerHeight || 2;\n\n\t\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 0.1, 1000);\n\n\t\t\tforwardRenderer.screenRenderTarget.resize(width, height);\n\t\t}\n\t\twindow.addEventListener('resize', onWindowResize, false);\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "examples/raycast_raycaster.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>t3d - raycaster</title>\n\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n\t<link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n</head>\n<body>\n    <div id=\"info\">\n        <a href=\"\" target=\"_blank\">t3d</a> - raycaster\n\t\t<br/>\n\t\tmove mouse to raycast objects\n    </div>\n\n\t<!-- Import maps polyfill -->\n    <!-- Remove this when import maps will be widely supported -->\n    <script async src=\"./libs/es-module-shims.js\"></script>\n\n    <script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n    <script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { ForwardRenderer } from 't3d/addons/render/ForwardRenderer.js';\n\n\t\tlet width = window.innerWidth || 2;\n\t\tlet height = window.innerHeight || 2;\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = width;\n\t\tcanvas.height = height;\n\t\tdocument.body.appendChild(canvas);\n\n\t\tconst forwardRenderer = new ForwardRenderer(canvas);\n\n\t\tconst scene = new t3d.Scene();\n\n\t\tconst camera = new t3d.Camera();\n\t\tcamera.position.set(0, 0, 400);\n\t\tcamera.lookAt(new t3d.Vector3(0, 0, 0), new t3d.Vector3(0, 1, 0));\n\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 2000);\n\t\tscene.add(camera);\n\n\t\t// meshes\n\n\t\tconst container = new t3d.Object3D();\n\t\tscene.add(container);\n\n\t\t// indexed geometry\n\t\tconst planeGeometry = new t3d.PlaneGeometry(20, 20, 20);\n\n\t\t// non-indexed geometry with groups\n\t\tconst triangleGeometry = new t3d.Geometry();\n\t\tconst positionAttribute = new t3d.Attribute(new t3d.Buffer(new Float32Array([10, 10, 0, -10, -10, 0, 10, -10, 0]), 3));\n\t\tconst normalAttribute = new t3d.Attribute(new t3d.Buffer(new Float32Array([0, 0, 1, 0, 0, 1, 0, 0, 1]), 3));\n\t\ttriangleGeometry.addAttribute('a_Position', positionAttribute);\n\t\ttriangleGeometry.addAttribute('a_Normal', normalAttribute);\n\t\ttriangleGeometry.computeBoundingBox();\n\t\ttriangleGeometry.computeBoundingSphere();\n\t\ttriangleGeometry.addGroup(0, 3, 0);\n\n\t\tfor (let i = 0; i < 15; i++) {\n\t\t\tconst material = new t3d.BasicMaterial();\n\t\t\tmaterial.side = t3d.DRAW_SIDE.DOUBLE;\n\t\t\tmaterial.diffuse.setHex(0x888888);\n\t\t\tconst plane = new t3d.Mesh(planeGeometry, material);\n\t\t\trandomPosition(plane);\n\t\t\tplane.euler.x = -Math.PI / 2;\n\t\t\tcontainer.add(plane);\n\t\t}\n\n\t\tfor (let i = 0; i < 15; i++) {\n\t\t\tconst material = new t3d.BasicMaterial();\n\t\t\tmaterial.side = t3d.DRAW_SIDE.DOUBLE;\n\t\t\tmaterial.diffuse.setHex(0x888888);\n\t\t\tconst triangle = new t3d.Mesh(triangleGeometry, [material]);\n\t\t\trandomPosition(triangle);\n\t\t\tcontainer.add(triangle);\n\t\t}\n\n\t\tfunction randomPosition(mesh) {\n\t\t\tmesh.position.x = Math.random() * 200 - 100;\n\t\t\tmesh.position.y = Math.random() * 200 - 100;\n\t\t\tmesh.position.z = Math.random() * 200 - 100;\n\t\t}\n\n\t\t// input\n\n\t\tconst raycaster = new t3d.Raycaster();\n\n\t\tconst mouse = new t3d.Vector2();\n\n\t\tdocument.addEventListener('mousemove', function(e) {\n\t\t\tmouse.x = (event.clientX / window.innerWidth) * 2 - 1;\n\t\t\tmouse.y = -(event.clientY / window.innerHeight) * 2 + 1;\n\n\t\t\traycaster.setFromCamera(mouse, camera);\n\n\t\t\tfor (let i = 0, l = container.children.length; i < l; i++) {\n\t\t\t\tconst child = container.children[i];\n\t\t\t\tsetColor(child, 0x888888);\n\t\t\t}\n\n\t\t\tconst array = raycaster.intersectObject(container, true);\n\t\t\tfor (let i = 0, l = array.length; i < l; i++) {\n\t\t\t\tconst object = array[i].object;\n\t\t\t\tif (i === 0) {\n\t\t\t\t\tsetColor(object, 0xff0000);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\tfunction setColor(mesh, hex) {\n\t\t\tconst material = Array.isArray(mesh.material) ? mesh.material[0] : mesh.material;\n\t\t\tmaterial.diffuse.setHex(hex);\n\t\t}\n\n\t\t//\n\n\t\tfunction loop(count) {\n\t\t\trequestAnimationFrame(loop);\n\n\t\t\t// rotate camera\n\t\t\tcamera.position.x = 600 * Math.sin(count / 1000 * .5);\n\t\t\tcamera.position.z = 600 * Math.cos(count / 1000 * .5);\n\t\t\tcamera.lookAt(new t3d.Vector3(0, 0, 0), new t3d.Vector3(0, 1, 0));\n\n\t\t\tforwardRenderer.render(scene, camera);\n\t\t}\n\t\trequestAnimationFrame(loop);\n\n\t\tfunction onWindowResize() {\n\t\t\twidth = window.innerWidth || 2;\n\t\t\theight = window.innerHeight || 2;\n\n\t\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 2000);\n\n\t\t\tforwardRenderer.screenRenderTarget.resize(width, height);\n\t\t}\n\t\twindow.addEventListener('resize', onWindowResize, false);\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "examples/renderer_clustered_lighting.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>t3d - clustered lighting</title>\n\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n\t<link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n</head>\n<body>\n    <div id=\"info\">\n        <a href=\"\" target=\"_blank\">t3d</a> - renderer - clustered lighting<br/>\n\t\tAvailable only for WebGL 2.0\n\t\t<div id=\"notSupported\" style=\"display:none\">Sorry, your graphics card + browser does not support WebGL2</div>\n    </div>\n\n\t<!-- Import maps polyfill -->\n    <!-- Remove this when import maps will be widely supported -->\n    <script async src=\"./libs/es-module-shims.js\"></script>\n\t<script src=\"./libs/nanobar.js\"></script>\n\n    <script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n    <script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { OrbitControls } from 't3d/addons/controls/OrbitControls.js';\n\t\timport { GeometryUtils } from 't3d/addons/geometries/GeometryUtils.js';\n\t\timport { TextureCubeLoader } from 't3d/addons/loaders/TextureCubeLoader.js';\n\t\timport { ClusteredDebugShader } from 't3d/addons/shaders/ClusteredDebugShader.js';\n\t\timport { GUI } from './libs/lil-gui.esm.min.js';\n\t\timport Stats from './libs/stats.module.js';\n\n\t\tlet width = window.innerWidth || 2;\n\t\tlet height = window.innerHeight || 2;\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = width;\n\t\tcanvas.height = height;\n\t\tdocument.body.appendChild(canvas);\n\n\t\tconst gl = canvas.getContext('webgl2', { antialias: true });\n\n\t\tif (!gl) {\n\t\t\tdocument.getElementById('notSupported').style.display = '';\n\t\t\tthrow new Error('WebGL2 is not supported on this device');\n\t\t}\n\n\t\tconst renderer = new t3d.WebGLRenderer(gl);\n\t\trenderer.shaderCompileOptions.compileAsynchronously = true;\n\t\tconst screenRenderTarget = new t3d.ScreenRenderTarget(canvas);\n\t\tscreenRenderTarget\n\t\t\t.setColorClearValue(0.1, 0.1, 0.1, 1)\n\t\t\t.setClear(true, true, false);\n\t\tconst shadowMapPass = new t3d.ShadowMapPass();\n\n\t\tconst scene = new t3d.Scene();\n\n\t\tconst cubeTexturePath = './resources/skybox/Bridge2/';\n\t\tconst cubeTexture = new TextureCubeLoader().load([\n\t\t\tcubeTexturePath + 'posx.jpg',\n\t\t\tcubeTexturePath + 'negx.jpg',\n\t\t\tcubeTexturePath + 'posy.jpg',\n\t\t\tcubeTexturePath + 'negy.jpg',\n\t\t\tcubeTexturePath + 'posz.jpg',\n\t\t\tcubeTexturePath + 'negz.jpg'\n\t\t]);\n\t\tscene.environment = cubeTexture;\n\n\t\tconst camera = new t3d.Camera();\n\t\tcamera.position.set(0, 400, 400);\n\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 5000);\n\t\tscene.add(camera);\n\n\t\tconst controller = new OrbitControls(camera, canvas);\n\t\tcontroller.target.set(0, -5, 0);\n\n\t\t// Create meshes\n\n\t\tconst meshMaterial = new t3d.PBRMaterial();\n\t\tmeshMaterial.diffuse.setRGB(1, 1, 1);\n\t\tmeshMaterial.roughness = 0.2;\n\t\tmeshMaterial.metalness = 0.8;\n\n\t\tconst geometries = [], offsetMatrix = new t3d.Matrix4();\n\t\tfor (let i = 0; i < 15; i++) {\n\t\t\tfor (let j = 0; j < 15; j++) {\n\t\t\t\toffsetMatrix.elements[12] = (i - 7) * 50;\n\t\t\t\toffsetMatrix.elements[14] = (j - 7) * 50;\n\t\t\t\toffsetMatrix.elements[5] = Math.random() * 1 + 2;\n\t\t\t\tconst geometry = Math.random() > 0.6 ? new t3d.BoxGeometry(20, 20, 20) : new t3d.SphereGeometry(10, 10, 20);\n\t\t\t\tGeometryUtils.applyMatrix4(geometry, offsetMatrix);\n\t\t\t\tgeometries.push(geometry);\n\t\t\t}\n\t\t}\n\t\tconst combinedGeometry = GeometryUtils.mergeGeometries(geometries);\n\t\tcombinedGeometry.computeBoundingBox();\n\t\tcombinedGeometry.computeBoundingSphere();\n\t\tconst combinedMesh = new t3d.Mesh(combinedGeometry, meshMaterial);\n\t\tcombinedMesh.castShadow = true;\n\t\tscene.add(combinedMesh);\n\n\t\t// Create plane\n\n\t\tconst planeGeometry = new t3d.PlaneGeometry(1500, 1500);\n\t\tconst planeMaterial = new t3d.PBRMaterial();\n\t\tplaneMaterial.diffuse.setHex(0x555555);\n\t\tplaneMaterial.roughness = 0.6;\n\t\tplaneMaterial.metalness = 0.4;\n\t\tplaneMaterial.dithering = true;\n\t\tconst plane = new t3d.Mesh(planeGeometry, planeMaterial);\n\t\tplane.receiveShadow = true;\n\t\tplane.position.y = -10;\n\t\tscene.add(plane);\n\n\t\t// Create Lights\n\n\t\tconst directionalLight = new t3d.DirectionalLight(0xffffff, 0.08);\n\t\tdirectionalLight.position.set(50, 200, -50);\n\t\tdirectionalLight.lookAt(new t3d.Vector3(), new t3d.Vector3(0, 1, 0));\n\t\tdirectionalLight.castShadow = true;\n\t\tdirectionalLight.shadow.windowSize = 1000;\n\t\tdirectionalLight.shadow.mapSize.set(2048, 2048);\n\t\tscene.add(directionalLight);\n\n\t\tconst maxLightCount = 1024;\n\t\t\n\t\tconst lights = [], lightHelpers = [];\n\t\tconst helpherGeometry = new t3d.SphereGeometry(1);\n\t\tfor (let i = 0; i < maxLightCount; i++) {\n\t\t\tconst h = Math.random(), s = Math.random();\n\n\t\t\tlet light;\n\t\t\tif (Math.random() > 0.5) {\n\t\t\t\tlight = new t3d.PointLight(undefined, 1, 50);\n\t\t\t} else {\n\t\t\t\tlight = new t3d.SpotLight(undefined, 1, 30, Math.PI / 6, 0.5);\n\t\t\t\tlight.euler.x = -Math.PI * 0.5;\n\t\t\t}\n\t\t\n\t\t\tlight.color.setHSL(h, s, 0.5);\n\t\t\tlight.position.y = Math.random() * 10;\n\t\t\tlights.push(light);\n\n\t\t\tlight._angle = Math.PI * 2 * Math.random();\n\t\t\tlight._radius = Math.random() * 500 + 20;\n\t\t\tlight._speed = (Math.random() - 0.5) * 0.03;\n\n\t\t\tlight.position.x = Math.cos(light._angle) * light._radius;\n\t\t\tlight.position.z = Math.sin(light._angle) * light._radius;\n\n\t\t\tconst mesh = new t3d.Mesh(helpherGeometry, new t3d.BasicMaterial());\n\t\t\tmesh.material.diffuse.setHSL(h, s, 0.75);\n\t\t\tmesh.material.envMap = undefined;\n\t\t\tlight.add(mesh);\n\t\t\tlightHelpers.push(mesh);\n\t\t}\n\n\t\tfunction setLights(value) {\n\t\t\tfor (let i = 0, light; i < maxLightCount; i++) {\n\t\t\t\tlight = lights[i];\n\t\t\t\tif (i < value) {\n\t\t\t\t\tscene.add(light);\n\t\t\t\t} else {\n\t\t\t\t\tscene.remove(light);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Prepare clustered lighting\n\n\t\tconst clusteredOptions = renderer.lightingOptions.clustered;\n\t\tclusteredOptions.enabled = true;\n\t\tclusteredOptions.maxClusterLights = maxLightCount;\n\t\tclusteredOptions.gridDimensions.set(16, 8, 32);\n\t\tclusteredOptions.maxLightsPerCell = 256;\n\n\t\tconst cellsTableMap = {\n\t\t\t'8-4-16': [8, 4, 16],\n\t\t\t'16-8-32': [16, 8, 32],\n\t\t\t'32-16-64': [32, 16, 64]\n\t\t};\n\n\t\tconst params = {\n\t\t\tlightCount: 500,\n\t\t\trenderMode: 'Forward+',\n\t\t\trotate: true,\n\t\t\tlightHelpers: true,\n\t\t\tcellsTable: cellsTableMap['16-8-32']\n\t\t};\n\n\t\tsetLights(params.lightCount);\n\n\t\t// GUI\n\n\t\tconst gui = new GUI();\n\t\tconst lightCountControl = gui.add(params, 'lightCount', 0, maxLightCount, 1).onChange(setLights);\n\t\tgui.add(params, 'renderMode', ['Forward', 'Forward+', 'Forward+Debug']).onChange(function(value) {\n\t\t\tif (value === 'Forward') {\n\t\t\t\t// clamp light count to 0-100 to avoid leaking lights\n\t\t\t\tparams.lightCount = Math.min(params.lightCount, 50);\n\t\t\t\tlightCountControl.setValue(params.lightCount);\n\t\t\t\tlightCountControl.max(100);\n\t\t\t} else {\n\t\t\t\tlightCountControl.max(maxLightCount);\n\t\t\t}\n\n\t\t\tlightCountControl.updateDisplay();\n\n\t\t\tclusteredOptions.enabled = value !== 'Forward';\n\t\t\tclusteredOptions.version++;\n\t\t});\n\t\tgui.add(params, 'rotate');\n\t\tgui.add(params, 'lightHelpers').onChange(function(value) {\n\t\t\tfor (let i = 0; i < lightHelpers.length; i++) {\n\t\t\t\tlightHelpers[i].visible = value;\n\t\t\t}\n\t\t});\n\t\t\n\t\tconst advancedFolder = gui.addFolder('Advanced').close().onChange(() => {\n\t\t\tclusteredOptions.version++;\n\t\t});\n\t\tadvancedFolder.add(clusteredOptions.zClip, 'y', -1, 3000, 0.01).name('clipFar');\n\t\tconst cellsDebugFolder = advancedFolder.addFolder('Cells');\n\t\tcellsDebugFolder.add(clusteredOptions, 'maxLightsPerCell', [8, 16, 32, 64, 128, 256]);\n\t\tcellsDebugFolder.add(params, 'cellsTable', cellsTableMap).onChange(() => {\n\t\t\tclusteredOptions.gridDimensions.fromArray(params.cellsTable);\n\t\t});\n\n\t\t//\n\n\t\tconst stats = new Stats();\n\t\tconst gpuPanel = stats.addPanel(new Stats.Panel('MS GPU', '#ff8', '#221'));\n\t\tstats.showPanel(3);\n\t\tdocument.body.appendChild(stats.dom);\n\n\t\tlet isQuerySetReading = false;\n\t\tconst timerQuerySet = new t3d.QuerySet(t3d.QUERYSET_TYPE.TIMESTAMP, 2);\n\t\tscreenRenderTarget.setTimestampWrites(timerQuerySet, 0, 1);\n\n\t\tconst clusteredDebugMaterial = new t3d.ShaderMaterial(ClusteredDebugShader);\n\t\tclusteredDebugMaterial.acceptLight = true;\n\t\tconst renderOptions = {\n\t\t\tgetMaterial: function(renderable) {\n\t\t\t\tconst material = renderable.material;\n\t\t\t\tif (material.acceptLight && params.renderMode === 'Forward+Debug') {\n\t\t\t\t\treturn clusteredDebugMaterial;\n\t\t\t\t}\n\t\t\t\treturn material;\n\t\t\t}\n\t\t};\n\n\t\tfunction loop(count) {\n\t\t\trequestAnimationFrame(loop);\n\n\t\t\tstats.begin();\n\n\t\t\tcontroller.update();\n\n\t\t\tif (params.rotate) {\n\t\t\t\tfor (let i = 0; i < lights.length; i++) {\n\t\t\t\t\tconst light = lights[i];\n\n\t\t\t\t\tlight._angle += light._speed;\n\n\t\t\t\t\tlight.position.x = Math.cos(light._angle) * light._radius;\n\t\t\t\t\tlight.position.z = Math.sin(light._angle) * light._radius;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tscene.updateMatrix();\n\t\t\tscene.updateRenderQueue(camera);\n\t\t\tscene.updateRenderStates(camera);\n\n\t\t\tshadowMapPass.render(renderer, scene);\n\n\t\t\trenderer.renderScene(scene, camera, screenRenderTarget, renderOptions);\n\n\t\t\tif (!isQuerySetReading) {\n\t\t\t\trenderer.readQuerySetResults(timerQuerySet, [0, 1])\n\t\t\t\t\t.then(buffer => {\n\t\t\t\t\t\tconst time = (buffer[1] - buffer[0]) / 1e6;\n\t\t\t\t\t\tgpuPanel.update(time, 10);\n\t\t\t\t\t\tisQuerySetReading = false;\n\t\t\t\t\t});\n\t\t\t\tisQuerySetReading = true;\n\t\t\t}\n\n\t\t\tstats.end();\n\t\t}\n\t\trequestAnimationFrame(loop);\n\n\t\tfunction onWindowResize() {\n\t\t\twidth = window.innerWidth || 2;\n\t\t\theight = window.innerHeight || 2;\n\n\t\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 5000);\n\n\t\t\tscreenRenderTarget.resize(width, height);\n\t\t}\n\t\twindow.addEventListener('resize', onWindowResize, false);\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "examples/renderer_culling_contribution.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>t3d - Size-Based Culling</title>\n\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n\t<link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n</head>\n<body>\n\t<div id=\"info\">\n\t\t<a href=\"\" target=\"_blank\">t3d</a> - Size-Based Culling (Contribution Culling)\n\t</div>\n\n\t<script src=\"./libs/nanobar.js\"></script>\n\n\t<!-- Import maps polyfill -->\n\t<script async src=\"./libs/es-module-shims.js\"></script>\n\n\t<script type=\"importmap\">\n\t\t{\n\t\t\t\"imports\": {\n\t\t\t\t\"t3d\": \"../build/t3d.module.js\",\n\t\t\t\t\"t3d/addons/\": \"./jsm/\"\n\t\t\t}\n\t\t}\n\t</script>\n\n\t<script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { TextureCubeLoader } from 't3d/addons/loaders/TextureCubeLoader.js';\n\t\timport { OrbitControls } from 't3d/addons/controls/OrbitControls.js';\n\t\timport { PolyhedronBuilder } from 't3d/addons/geometries/builders/PolyhedronBuilder.js';\n\t\timport { GeometryUtils } from 't3d/addons/geometries/GeometryUtils.js';\n\t\timport { GUI } from './libs/lil-gui.esm.min.js';\n\t\timport Stats from './libs/stats.module.js';\n\n\t\tlet width = window.innerWidth || 2;\n\t\tlet height = window.innerHeight || 2;\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = Math.floor(width * window.devicePixelRatio);\n\t\tcanvas.height = Math.floor(height * window.devicePixelRatio);\n\t\tcanvas.style.width = width + 'px';\n\t\tcanvas.style.height = height + 'px';\n\t\tdocument.body.appendChild(canvas);\n\n\t\tconst gl = canvas.getContext('webgl2', { antialias: true, alpha: false });\n\t\tconst renderer = new t3d.WebGLRenderer(gl);\n\n\t\trenderer.lightingOptions.clustered.enabled = true;\n\t\trenderer.lightingOptions.clustered.gridDimensions.set(16, 8, 32);\n\t\trenderer.lightingOptions.clustered.maxLightsPerCell = 256;\n\n\t\tconst screenRenderTarget = new t3d.ScreenRenderTarget(canvas);\n\t\tscreenRenderTarget.setColorClearValue(0, 0, 0, 1).setClear(true, true, false);\n\n\t\tconst scene = new t3d.Scene();\n\t\tscene.fog = new t3d.FogExp2(0x000000, 0.0005);\n\n\t\tconst cubeTexture = new TextureCubeLoader().load([\n\t\t\t'./resources/skybox/sunset/px.jpg', './resources/skybox/sunset/nx.jpg',\n\t\t\t'./resources/skybox/sunset/py.jpg', './resources/skybox/sunset/ny.jpg',\n\t\t\t'./resources/skybox/sunset/pz.jpg', './resources/skybox/sunset/nz.jpg'\n\t\t]);\n\t\tcubeTexture.encoding = t3d.TEXEL_ENCODING_TYPE.SRGB;\n\t\tscene.environment = cubeTexture;\n\n\t\tconst camera = new t3d.Camera();\n\t\tcamera.outputEncoding = t3d.TEXEL_ENCODING_TYPE.SRGB;\n\t\tcamera.position.set(283, -49, 852);\n\t\tcamera.setPerspective(60 / 180 * Math.PI, width / height, 0.1, 2000);\n\t\tscene.add(camera);\n\n\t\tconst controller = new OrbitControls(camera, canvas);\n\t\tcontroller.autoRotate = true;\n\t\tcontroller.autoRotateSpeed = 0.5;\n\n\t\tconst cullOptions = {\n\t\t\tenabled: true,\n\t\t\tminContributionThreshold: 0.02, // Objects smaller than this screen fraction are culled\n\t\t\tdebugMode: false,\n\t\t\tvisibleCount: 0\n\t\t};\n\n\t\tconst culledMaterial = new t3d.PBRMaterial();\n\t\tculledMaterial.diffuse.setHex(0xff0000);\n\t\tculledMaterial.emissive.setHex(0xff0000);\n\t\tculledMaterial.transparent = true;\n\t\tculledMaterial.opacity = 0.5;\n\n\t\tconst _tempSphere = new t3d.Sphere();\n\t\tconst _posView = new t3d.Vector3();\n\t\tconst _screenExtents = new t3d.Vector4();\n\n\t\t// Override checkVisibility to implement size-based culling\n\t\tscene.collector.checkVisibility = function(object, camera) {\n\t\t\tif (!object.renderable) return false;\n\n\t\t\t// Camera Frustum Culling\n\t\t\tif (object.frustumCulled && camera.frustumCulled) {\n\t\t\t\t_tempSphere.copy(object.geometry.boundingSphere).applyMatrix4(object.worldMatrix);\n\t\t\t\tif (camera.frustum.intersectsSphere(_tempSphere) === false) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Contribution (Size-Based) Culling\n\t\t\tif (cullOptions.enabled && object._originalMaterial) {\n\t\t\t\t_tempSphere.copy(object.geometry.boundingSphere).applyMatrix4(object.worldMatrix);\n\t\t\n\t\t\t\t// Calculate screen projected size\n\t\t\t\t_posView.copy(_tempSphere.center).applyMatrix4(camera.viewMatrix);\n\t\t\t\tsphereScreenExtents(_posView, _tempSphere.radius, camera.projectionMatrix, _screenExtents);\n\t\t\n\t\t\t\t// Calculate max dimension in screen space\n\t\t\t\tconst maxDim = Math.max(_screenExtents.z - _screenExtents.x, _screenExtents.w - _screenExtents.y);\n\n\t\t\t\tif (maxDim < cullOptions.minContributionThreshold) {\n\t\t\t\t\tif (cullOptions.debugMode) {\n\t\t\t\t\t\tobject.material = culledMaterial;\n\t\t\t\t\t\treturn true; // Render as debug material\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn false; // Skip rendering\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Restore material if visible\n\t\t\tif (cullOptions.debugMode && object._originalMaterial) {\n\t\t\t\tobject.material = object._originalMaterial;\n\t\t\t}\n\n\t\t\tcullOptions.visibleCount++;\n\t\t\treturn true;\n\t\t};\n\n\t\t// Calculate sphere extents in screen space\n\t\tfunction sphereScreenExtents(posView, radius, projectionMat, target) {\n\t\t\tconst z = Math.abs(posView.z);\n\t\t\tconst r2 = radius * radius;\n\t\t\tconst x = posView.x, y = posView.y;\n\t\t\n\t\t\tif (z <= radius) return target.set(-1, -1, 1, 1);\n\n\t\t\tconst p = projectionMat.elements;\n\n\t\t\t// Horizontal\n\t\t\tconst h2 = x * x + z * z - r2;\n\t\t\tif (h2 < 0) return target.set(-1, -1, 1, 1);\n\t\t\tconst h = Math.sqrt(h2);\n\t\t\tconst left = ((x * h - z * radius) * p[0]) / (z * h + x * radius);\n\t\t\tconst right = ((x * h + z * radius) * p[0]) / (z * h - x * radius);\n\n\t\t\t// Vertical\n\t\t\tconst v2 = y * y + z * z - r2;\n\t\t\tif (v2 < 0) return target.set(-1, -1, 1, 1);\n\t\t\tconst v = Math.sqrt(v2);\n\t\t\tconst bottom = ((y * v - z * radius) * p[5]) / (z * v + y * radius);\n\t\t\tconst top = ((y * v + z * radius) * p[5]) / (z * v - y * radius);\n\n\t\t\treturn target.set(left, bottom, right, top);\n\t\t}\n\n\t\t// Scene Content Generation\n\t\tconst container = new t3d.Object3D();\n\t\tscene.add(container);\n\t\tconst { meshes, lightCount } = generateGalaxy(container);\n\t\t\n\t\trenderer.lightingOptions.clustered.maxClusterLights = lightCount + 10;\n\n\t\tconst ambientLight = new t3d.AmbientLight(0xffffff, 0.3);\n\t\tscene.add(ambientLight);\n\t\t\n\t\tconst sunLight = new t3d.DirectionalLight(0xffffff, 0.4);\n\t\tsunLight.position.set(40, 100, 40);\n\t\tsunLight.lookAt(new t3d.Vector3(0, 0, 0), new t3d.Vector3(0, 1, 0));\n\t\tscene.add(sunLight);\n\n\t\tconst gui = new GUI();\n\t\tgui.add(cullOptions, 'enabled').name('Enable Size Culling');\n\t\tgui.add(cullOptions, 'minContributionThreshold', 0, 0.2).name('Threshold');\n\t\tgui.add(cullOptions, 'debugMode').name('Debug: Show Culled').onChange(v => {\n\t\t\tif (!v) meshes.forEach(obj => obj.material = obj._originalMaterial);\n\t\t});\n\n\t\tconst infoFolder = gui.addFolder('Info');\n\t\tinfoFolder.add(cullOptions, 'visibleCount').name('Visible Objects').listen().disable();\n\t\tinfoFolder.add({ total: meshes.length }, 'total').name('Total Objects').disable();\n\n\t\tconst stats = new Stats();\n\t\tstats.showPanel(0);\n\t\tdocument.body.appendChild(stats.dom);\n\n\t\tconst renderOption = { renderInfo: new t3d.RenderInfo() };\n\t\tgui.add(renderOption.renderInfo.render, 'calls').disable().listen();\n\n\t\tfunction loop() {\n\t\t\trequestAnimationFrame(loop);\n\t\t\tstats.begin();\n\n\t\t\tcontroller.update();\n\t\t\n\t\t\tcontainer.euler.y += 0.001;\n\t\t\tcontainer.euler.z += 0.0005;\n\n\t\t\tscene.updateMatrix();\n\t\t\n\t\t\t// Reset counter before rendering\n\t\t\tcullOptions.visibleCount = 0;\n\t\t\trenderOption.renderInfo.reset();\n\n\t\t\tscene.updateRenderStates(camera);\n\t\t\tscene.updateRenderQueue(camera);\n\n\t\t\trenderer.renderScene(scene, camera, screenRenderTarget, renderOption);\n\t\t\tstats.end();\n\t\t}\n\t\trequestAnimationFrame(loop);\n\n\t\twindow.addEventListener('resize', () => {\n\t\t\twidth = window.innerWidth || 2;\n\t\t\theight = window.innerHeight || 2;\n\t\t\tcamera.setPerspective(60 / 180 * Math.PI, width / height, 0.1, 2000);\n\t\t\n\t\t\tconst dpr = window.devicePixelRatio;\n\t\t\tscreenRenderTarget.resize(Math.floor(width * dpr), Math.floor(height * dpr));\n\n\t\t\tcanvas.style.width = width + 'px';\n\t\t\tcanvas.style.height = height + 'px';\n\t\t});\n\n\t\t// Build scene\n\t\tfunction generateGalaxy(root) {\n\t\t\tconst meshes = [];\n\t\t\tlet lightCount = 0;\n\n\t\t\tconst baseMat = new t3d.PBRMaterial();\n\t\t\tbaseMat.roughness = 0.4;\n\t\t\tbaseMat.metalness = 0.6;\n\t\t\tbaseMat.envMap = scene.environment;\n\n\t\t\tconst geoData = PolyhedronBuilder.getIcosahedronGeometryData(1, 0);\n\t\t\tconst geometry = createGeometryByData(geoData);\n\n\t\t\tconst _tempVec = new t3d.Vector3();\n\t\t\tconst _tempSpherical = new t3d.Spherical();\n\n\t\t\tfunction createBody(level, pos, scaleMult) {\n\t\t\t\tconst mat = baseMat.clone();\n\t\t\t\tconst mesh = new t3d.Mesh(geometry, mat);\n\t\t\t\tlet size;\n\n\t\t\t\tif (level === 1) {\n\t\t\t\t\tsize = 20 + Math.random() * 15;\n\t\t\t\t\tmat.diffuse.setHSL(Math.random(), 1.0, 0.6);\n\t\t\t\t\tmat.emissive.copy(mat.diffuse);\n\t\t\t\t\tmat.emissive.r *= 0.5; mat.emissive.g *= 0.5; mat.emissive.b *= 0.5;\n\n\t\t\t\t\tconst light = new t3d.PointLight(undefined, 1.2, 300 * scaleMult);\n\t\t\t\t\tlight.color.copy(mat.diffuse);\n\t\t\t\t\tlight.position.copy(pos);\n\t\t\t\t\troot.add(light);\n\t\t\t\t\tlightCount++;\n\t\t\t\t} else if (level === 2) {\n\t\t\t\t\tsize = 4 + Math.random() * 4;\n\t\t\t\t\tmat.diffuse.setHSL(Math.random(), 0.8, 0.4);\n\t\t\t\t} else {\n\t\t\t\t\tsize = 0.8 + Math.random() * 1.5;\n\t\t\t\t\tmat.diffuse.setHSL(Math.random(), 0.2, 0.8);\n\t\t\t\t}\n\n\t\t\t\tmesh.scale.setScalar(size * scaleMult);\n\t\t\t\tmesh.position.copy(pos);\n\t\t\t\tmesh.euler.set(Math.random() * Math.PI, Math.random() * Math.PI, Math.random() * Math.PI);\n\t\t\t\tmesh._originalMaterial = mat;\n\t\t\n\t\t\t\troot.add(mesh);\n\t\t\t\tmeshes.push(mesh);\n\t\t\t}\n\n\t\t\tconst numStars = 100;\n\t\t\tconst starRadius = 1200;\n\n\t\t\tfor (let i = 0; i < numStars; i++) {\n\t\t\t\tconst systemScale = 0.5 + Math.random() * 2.5;\n\t\t\n\t\t\t\t// Random point in sphere\n\t\t\t\tconst r = Math.pow(Math.random(), 1 / 3) * starRadius;\n\t\t\t\tconst theta = Math.random() * Math.PI * 2;\n\t\t\t\tconst phi = Math.acos(2 * Math.random() - 1);\n\t\t\t\tconst starPos = new t3d.Vector3().setFromSpherical(_tempSpherical.set(r, phi, theta));\n\n\t\t\t\tcreateBody(1, starPos, systemScale);\n\n\t\t\t\tfor (let j = 0; j < 8; j++) {\n\t\t\t\t\tconst r2 = (25 + Math.random() * 80) * systemScale;\n\t\t\t\t\tconst planetPos = starPos.clone().add(_tempVec.setFromSpherical(_tempSpherical.set(r2, Math.random() * Math.PI, Math.random() * Math.PI * 2)));\n\t\t\t\t\tcreateBody(2, planetPos, systemScale);\n\n\t\t\t\t\tfor (let k = 0; k < 6; k++) {\n\t\t\t\t\t\tconst r3 = (5 + Math.random() * 15) * systemScale;\n\t\t\t\t\t\tconst moonPos = planetPos.clone().add(_tempVec.setFromSpherical(_tempSpherical.set(r3, Math.random() * Math.PI, Math.random() * Math.PI * 2)));\n\t\t\t\t\t\tcreateBody(3, moonPos, systemScale);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn { meshes, lightCount };\n\t\t}\n\n\t\tfunction createGeometryByData(data) {\n\t\t\tconst geometry = new t3d.Geometry();\n\t\t\tgeometry.addAttribute('a_Position', new t3d.Attribute(new t3d.Buffer(new Float32Array(data.positions), 3)));\n\t\t\tgeometry.addAttribute('a_Uv', new t3d.Attribute(new t3d.Buffer(new Float32Array(data.uvs), 2)));\n\t\t\tif (data.indices) geometry.setIndex(data.indices);\n\t\t\tGeometryUtils.computeNormals(geometry);\n\t\t\tgeometry.computeBoundingSphere();\n\t\t\treturn geometry;\n\t\t}\n\n\t</script>\n</body>\n</html>\n"
  },
  {
    "path": "examples/renderer_culling_frustum.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>t3d - frustum culling test</title>\n\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n\t<link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n</head>\n<body>\n    <div id=\"info\">\n        <a href=\"\" target=\"_blank\">t3d</a> - frustum culling test\n    </div>\n\n\t<!-- Import maps polyfill -->\n    <!-- Remove this when import maps will be widely supported -->\n    <script async src=\"./libs/es-module-shims.js\"></script>\n\n    <script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n    <script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { CameraHelper } from 't3d/addons/objects/CameraHelper.js';\n\t\timport { OrbitControls } from 't3d/addons/controls/OrbitControls.js';\n\t\timport { GUI } from './libs/lil-gui.esm.min.js';\n\n\t\tlet width = window.innerWidth || 2;\n\t\tlet height = window.innerHeight || 2;\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = width;\n\t\tcanvas.height = height;\n\t\tdocument.body.appendChild(canvas);\n\n\t\tconst contextParams = { antialias: true, alpha: false };\n\t\tconst gl = canvas.getContext('webgl2', contextParams) || canvas.getContext('webgl', contextParams);\n\n\t\tconst renderer = new t3d.WebGLRenderer(gl);\n\n\t\tconst screenRenderTarget = new t3d.ScreenRenderTarget(canvas);\n\t\tscreenRenderTarget\n\t\t\t.setColorClearValue(0.1, 0.1, 0.1, 1)\n\t\t\t.setClear(true, true, false);\n\n\t\tconst scene = new t3d.Scene();\n\n\t\tconst ambientLight = new t3d.AmbientLight(0xffffff, 0.3);\n\t\tscene.add(ambientLight);\n\n\t\tconst directionalLight = new t3d.DirectionalLight(0xffffff, 0.6);\n\t\tdirectionalLight.position.set(40, 40, 0);\n\t\tdirectionalLight.lookAt(new t3d.Vector3(), new t3d.Vector3(0, 1, 0));\n\t\tscene.add(directionalLight);\n\n\t\tconst camera = new t3d.Camera();\n\t\tcamera.position.set(0, 30, 60);\n\t\tcamera.lookAt(new t3d.Vector3(0, 0, 0), new t3d.Vector3(0, 1, 0));\n\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 1000);\n\t\tscene.add(camera);\n\n\t\tconst controller = new OrbitControls(camera, canvas);\n\t\tcontroller.target.set(0, 3, 0);\n\n\t\t// create 100 random spheres\n\n\t\tconst sphereGeometry = new t3d.SphereGeometry(0.5, 10, 10);\n\t\tconst sphereMaterial = new t3d.PhongMaterial();\n\t\tfor (let i = 0; i < 100; i++) {\n\t\t\tconst sphereMesh = new t3d.Mesh(sphereGeometry, sphereMaterial);\n\t\t\tsphereMesh.position.set(\n\t\t\t\tMath.random() * 40 - 20,\n\t\t\t\t0.5,\n\t\t\t\tMath.random() * 40 - 20\n\t\t\t);\n\t\t\tscene.add(sphereMesh);\n\t\t}\n\n\t\t// create 100 random boxes\n\n\t\tconst boxGeometry = new t3d.BoxGeometry(1, 1, 1);\n\t\tconst boxMaterial = new t3d.PhongMaterial();\n\t\tfor (let i = 0; i < 100; i++) {\n\t\t\tconst boxMesh = new t3d.Mesh(boxGeometry, boxMaterial);\n\t\t\tboxMesh.position.set(\n\t\t\t\tMath.random() * 40 - 20,\n\t\t\t\t0.5,\n\t\t\t\tMath.random() * 40 - 20\n\t\t\t);\n\t\t\tscene.add(boxMesh);\n\t\t}\n\n\t\t// create ground plane\n\n\t\tconst planeGeometry = new t3d.PlaneGeometry(50, 50, 1, 1);\n\t\tconst planeMaterial = new t3d.LambertMaterial();\n\t\tplaneMaterial.diffuse.setHex(0x999999);\n\t\tconst planeMesh = new t3d.Mesh(planeGeometry, planeMaterial);\n\t\tscene.add(planeMesh);\n\n\t\t// create test camera\n\n\t\tconst testCamera = new t3d.Camera();\n\t\ttestCamera.position.set(0, 3, 0);\n\t\ttestCamera.lookAt(new t3d.Vector3(0, 3, -1), new t3d.Vector3(0, 1, 0));\n\t\ttestCamera.setPerspective(45 / 180 * Math.PI, 16 / 9, 5, 20);\n\t\tscene.add(testCamera);\n\n\t\tconst cameraHelper = new CameraHelper(testCamera);\n\t\ttestCamera.add(cameraHelper);\n\n\t\t// change visibility checking function, use testCamera's frustum\n\t\t// instead of render camera's frustum\n\n\t\tconst _boundingSphere = new t3d.Sphere();\n\t\tscene.collector.checkVisibility = function(object, camera) {\n\t\t\tif (!object.renderable) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tif (!object.frustumCulled || !camera.frustumCulled) {\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\t_boundingSphere.copy(object.geometry.boundingSphere).applyMatrix4(object.worldMatrix);\n\n\t\t\treturn testCamera.frustum.intersectsSphere(_boundingSphere);\n\t\t};\n\n\t\t// gui\n\n\t\tconst renderOption = { renderInfo: new t3d.RenderInfo() };\n\n\t\tconst gui = new GUI();\n\t\tgui.add(renderOption.renderInfo.render, 'calls').disable().listen();\n\n\t\tfunction loop(count) {\n\t\t\trequestAnimationFrame(loop);\n\n\t\t\tcontroller.update();\n\n\t\t\ttestCamera.euler.y = count * 0.0005;\n\n\t\t\tscene.updateMatrix();\n        \tscene.updateRenderStates(camera);\n        \tscene.updateRenderQueue(camera);\n\n        \trenderOption.renderInfo.reset();\n\n\t\t\trenderer.renderScene(scene, camera, screenRenderTarget, renderOption);\n\t\t}\n\t\trequestAnimationFrame(loop);\n\n\t\tfunction onWindowResize() {\n\t\t\twidth = window.innerWidth || 2;\n\t\t\theight = window.innerHeight || 2;\n\n\t\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 1000);\n\n\t\t\tscreenRenderTarget.resize(width, height);\n\t\t}\n\t\twindow.addEventListener('resize', onWindowResize, false);\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "examples/renderer_deferred.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>t3d - deferred renderer</title>\n\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n\t<link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n</head>\n<body>\n    <div id=\"info\">\n        <a href=\"\" target=\"_blank\">t3d</a> - deferred renderer\n    </div>\n\n\t<!-- Import maps polyfill -->\n    <!-- Remove this when import maps will be widely supported -->\n    <script async src=\"./libs/es-module-shims.js\"></script>\n\n    <script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n    <script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { GLTFLoader } from 't3d/addons/loaders/glTF/GLTFLoader.js';\n\t\timport { TextureCubeLoader } from 't3d/addons/loaders/TextureCubeLoader.js';\n\t\timport { DirectionalLightHelper } from 't3d/addons/objects/DirectionalLightHelper.js';\n\t\timport { PointLightHelper } from 't3d/addons/objects/PointLightHelper.js';\n\t\timport { SpotLightHelper } from 't3d/addons/objects/SpotLightHelper.js';\n\t\timport { OrbitControls } from 't3d/addons/controls/OrbitControls.js';\n\t\timport { FXAAShader } from 't3d/addons/shaders/FXAAShader.js';\n\t\timport { DeferredRenderer } from 't3d/addons/render/DeferredRenderer.js';\n\t\timport { GUI } from './libs/lil-gui.esm.min.js';\n\n\t\tlet width = window.innerWidth || 2;\n\t\tlet height = window.innerHeight || 2;\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = width;\n\t\tcanvas.height = height;\n\t\tdocument.body.appendChild(canvas);\n\n\t\tconst scene = new t3d.Scene();\n\n\t\tconst loader = new GLTFLoader();\n\t\tloader.load(\n\t\t\t'./resources/models/gltf/DamagedHelmet/glTF/DamagedHelmet.gltf'\n\t\t).then(function(result) {\n\t\t\t// add mesh to scene\n\t\t\tconst object = result.root.children[0];\n\n\t\t\tobject.castShadow = true;\n\n\t\t\tobject.position.set(0, 5, 0);\n\t\t\tobject.scale.set(15, 15, 15);\n\t\t\tobject.euler.z = -Math.PI / 6;\n\n\t\t\tscene.add(object);\n\t\t});\n\n\t\tconst cube_material = new t3d.BasicMaterial();\n\t\tcube_material.diffuse.setRGB(0, 1, 1);\n\t\tcube_material.transparent = true;\n\t\tcube_material.opacity = 0.3;\n\t\tconst cube = new t3d.Mesh(new t3d.BoxGeometry(5, 5, 5), cube_material);\n\t\tcube.position.set(20, 0, 0);\n\t\tscene.add(cube);\n\n\t\tconst plane_geometry = new t3d.PlaneGeometry(500, 500);\n\t\tconst plane_material = new t3d.LambertMaterial();\n\t\tplane_material.diffuse.setHex(0xffffff);\n\t\tplane_material.roughness = 0.9;\n\t\tplane_material.metalness = 0.9;\n\t\t// material.emissive.setRGB(1, 0, 0);\n\t\t// material.specular.setRGB(0, 0, 0);\n\t\tconst plane = new t3d.Mesh(plane_geometry, plane_material);\n\t\tplane.receiveShadow = true;\n\t\tplane.position.y = -10;\n\t\tscene.add(plane);\n\n\t\t// const ambientLight = new t3d.AmbientLight(0xffffff, 0.5);\n\t\t// scene.add(ambientLight);\n\n\t\tconst directionalLight = new t3d.DirectionalLight(0xffffff, 0.3);\n\t\tdirectionalLight.position.set(-30, 30, 0);\n\t\tdirectionalLight.lookAt(new t3d.Vector3(), new t3d.Vector3(0, 1, 0));\n\t\tdirectionalLight.castShadow = true;\n\t\tdirectionalLight.shadow.windowSize = 50;\n\t\tscene.add(directionalLight);\n\n\t\tconst directionalLightHelper = new DirectionalLightHelper(directionalLight, 3);\n\t\tdirectionalLight.add(directionalLightHelper);\n\n\t\tconst pointLight = new t3d.PointLight(0x00ffff, 0.3, 200, 2);\n\t\tpointLight.position.set(30, 30, 30);\n\t\tpointLight.castShadow = true;\n\t\tscene.add(pointLight);\n\n\t\tconst pointLightHelper = new PointLightHelper(pointLight, 2);\n\t\tpointLight.add(pointLightHelper);\n\n\t\tconst spotLight = new t3d.SpotLight(0x00ff00, 0.3, 400, Math.PI / 6, 0.2);\n\t\tspotLight.position.set(0, 40, -40);\n\t\tspotLight.lookAt(new t3d.Vector3(), new t3d.Vector3(0, 1, 0));\n\t\tspotLight.castShadow = true;\n\t\tspotLight.shadow.windowSize = 50;\n\t\tscene.add(spotLight);\n\t\t\n\t\tconst spotLightHelper = new SpotLightHelper(spotLight);\n\t\tspotLight.add(spotLightHelper);\n\n\t\tconst camera = new t3d.Camera();\n\t\tcamera.position.set(30, 50, 100);\n\t\tcamera.lookAt(new t3d.Vector3(0, 0, 0), new t3d.Vector3(0, 1, 0));\n\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 500);\n\t\tscene.add(camera);\n\n\t\tconst controller = new OrbitControls(camera, canvas);\n\n\t\tconst deferredRenderer = new DeferredRenderer(canvas);\n\t\tconst cubeTexturePath = './resources/skybox/Bridge2/';\n\t\tdeferredRenderer.ambientCubemap = new TextureCubeLoader().load([\n\t\t\tcubeTexturePath + 'posx.jpg',\n\t\t\tcubeTexturePath + 'negx.jpg',\n\t\t\tcubeTexturePath + 'posy.jpg',\n\t\t\tcubeTexturePath + 'negy.jpg',\n\t\t\tcubeTexturePath + 'posz.jpg',\n\t\t\tcubeTexturePath + 'negz.jpg'\n\t\t]);\n\t\tdeferredRenderer.ambientCubemapIntensity = 1;\n\n\t\tconst tempRenderTarget = t3d.OffscreenRenderTarget.create2D(width, height);\n\t\ttempRenderTarget.texture.minFilter = t3d.TEXTURE_FILTER.LINEAR;\n\t\ttempRenderTarget.texture.magFilter = t3d.TEXTURE_FILTER.LINEAR;\n\t\t\n\t\tconst fxaaPass = new t3d.ShaderPostPass(FXAAShader);\n\t\tfxaaPass.uniforms['tDiffuse'] = tempRenderTarget.texture;\n\n\t\tconst params = { fxaa: true };\n\t\tconst gui = new GUI();\n\t\tgui.add({ version: 'WebGL ' + deferredRenderer.capabilities.version }, 'version').disable();\n\t\tgui.add(params, 'fxaa');\n\n\t\tfunction loop(count) {\n\t\t\trequestAnimationFrame(loop);\n\n\t\t\tcontroller.update();\n\n\t\t\tdirectionalLightHelper.update();\n\t\t\tpointLightHelper.update();\n\t\t\tspotLightHelper.update();\n\n\t\t\tif (params.fxaa) {\n\t\t\t\tdeferredRenderer.render(scene, camera, tempRenderTarget);\n\t\t\t\tfxaaPass.render(deferredRenderer, deferredRenderer.screenRenderTarget);\n\t\t\t} else {\n\t\t\t\tdeferredRenderer.render(scene, camera);\n\t\t\t}\n\t\t}\n\n\t\trequestAnimationFrame(loop);\n\n\t\tfunction onWindowResize() {\n\t\t\twidth = window.innerWidth || 2;\n\t\t\theight = window.innerHeight || 2;\n\n\t\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 500);\n\n\t\t\tdeferredRenderer.resize(width, height);\n\t\t\ttempRenderTarget.resize(width, height);\n\t\t}\n\t\twindow.addEventListener('resize', onWindowResize, false);\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "examples/renderer_deferred_lighting.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>t3d - deferred lighting</title>\n\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n\t<link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n</head>\n<body>\n    <div id=\"info\">\n        <a href=\"\" target=\"_blank\">t3d</a> - renderer - deferred lighting\n    </div>\n\n\t<!-- Import maps polyfill -->\n    <!-- Remove this when import maps will be widely supported -->\n    <script async src=\"./libs/es-module-shims.js\"></script>\n\n    <script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n    <script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { OrbitControls } from 't3d/addons/controls/OrbitControls.js';\n\t\timport { FXAAShader } from 't3d/addons/shaders/FXAAShader.js';\n\t\timport { PMREMGenerator } from 't3d/addons/textures/PMREMGenerator.js';\n\t\timport { GeometryUtils } from 't3d/addons/geometries/GeometryUtils.js';\n\t\timport { DeferredRenderer } from 't3d/addons/render/DeferredRenderer.js';\n\t\timport { TextureCubeLoader } from 't3d/addons/loaders/TextureCubeLoader.js';\n\t\timport { GUI } from './libs/lil-gui.esm.min.js';\n\t\timport Stats from './libs/stats.module.js';\n\n\t\tlet width = window.innerWidth || 2;\n\t\tlet height = window.innerHeight || 2;\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = width;\n\t\tcanvas.height = height;\n\t\tdocument.body.appendChild(canvas);\n\n\t\tconst scene = new t3d.Scene();\n\n\t\t// Create spheres\n\n\t\tconst spheresMaterial = new t3d.PBRMaterial();\n\t\tspheresMaterial.diffuse.setRGB(1, 1, 1);\n\t\tspheresMaterial.roughness = 0.4;\n\t\tspheresMaterial.metalness = 0.6;\n\n\t\tconst geometries = [], offsetMatrix = new t3d.Matrix4();\n\t\tfor (let i = 0; i < 15; i++) {\n\t\t\tfor (let j = 0; j < 15; j++) {\n\t\t\t\toffsetMatrix.elements[12] = (i - 7) * 50;\n\t\t\t\toffsetMatrix.elements[14] = (j - 7) * 50;\n\t\t\t\toffsetMatrix.elements[5] = Math.random() * 1 + 2;\n\t\t\t\tconst geometry = Math.random() > 0.6 ? new t3d.BoxGeometry(20, 20, 20) : new t3d.SphereGeometry(10, 10, 20);\n\t\t\t\tGeometryUtils.applyMatrix4(geometry, offsetMatrix);\n\t\t\t\tgeometries.push(geometry);\n\t\t\t}\n\t\t}\n\t\tconst spheresGeometry = GeometryUtils.mergeGeometries(geometries);\n\t\tspheresGeometry.computeBoundingBox();\n\t\tspheresGeometry.computeBoundingSphere();\n\t\tconst spheres = new t3d.Mesh(spheresGeometry, spheresMaterial);\n\t\tspheres.castShadow = true;\n\t\tscene.add(spheres);\n\n\t\t// Create plane\n\n\t\tconst plane_geometry = new t3d.PlaneGeometry(1500, 1500);\n\t\tconst plane_material = new t3d.PBRMaterial();\n\t\tplane_material.diffuse.setHex(0x555555);\n\t\tplane_material.roughness = 0.8;\n\t\tplane_material.metalness = 0.2;\n\t\tconst plane = new t3d.Mesh(plane_geometry, plane_material);\n\t\tplane.receiveShadow = true;\n\t\tplane.position.y = -10;\n\t\tscene.add(plane);\n\n\t\t// Create Lights\n\n\t\tconst maxLightCount = 500;\n\n\t\t// const ambientLight = new t3d.AmbientLight(0xaaaaff, 0.05);\n\t\t// scene.add(ambientLight);\n\n\t\tconst directionalLight = new t3d.DirectionalLight(0xffffff, 0.08);\n\t\tdirectionalLight.position.set(50, 200, -50);\n\t\tdirectionalLight.lookAt(new t3d.Vector3(), new t3d.Vector3(0, 1, 0));\n\t\tdirectionalLight.castShadow = true;\n\t\tdirectionalLight.shadow.windowSize = 1000;\n\t\tdirectionalLight.shadow.mapSize.set(2048, 2048);\n\t\tdirectionalLight.shadow.autoUpdate = false;\n\t\tdirectionalLight.shadow.needsUpdate = true;\n\t\tscene.add(directionalLight);\n\t\t\n\t\tconst lights = [], lightHelpers = [];\n\t\tconst helpherGeometry = new t3d.SphereGeometry(10);\n\t\tfor (let i = 0; i < maxLightCount; i++) {\n\t\t\tconst pointLight = new t3d.PointLight(undefined, 0.8, 50);\n\t\t\tpointLight.color.setHSL(Math.random(), Math.random(), 0.5);\n\t\t\tpointLight.position.y = Math.random() * 10;\n\t\t\tlights.push(pointLight);\n\n\t\t\tpointLight._angle = Math.PI * 2 * Math.random();\n\t\t\tpointLight._radius = Math.random() * 350 + 20;\n\t\t\tpointLight._speed = (Math.random() - 0.5) * 0.03;\n\n\t\t\tpointLight.position.x = Math.cos(pointLight._angle) * pointLight._radius;\n\t\t\tpointLight.position.z = Math.sin(pointLight._angle) * pointLight._radius;\n\n\t\t\tconst mesh = new t3d.Mesh(helpherGeometry, new t3d.PBRMaterial());\n\t\t\tmesh.material.diffuse.copy(pointLight.color);\n\t\t\tmesh.material.roughness = 1;\n\t\t\tmesh.material.metalness = 0;\n\t\t\tlightHelpers.push(mesh);\n\t\t}\n\n\t\tfunction setLights(value) {\n\t\t\tfor (let i = 0, light; i < maxLightCount; i++) {\n\t\t\t\tlight = lights[i];\n\t\t\t\tif (i < value) {\n\t\t\t\t\tscene.add(light);\n\t\t\t\t} else {\n\t\t\t\t\tscene.remove(light);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tsetLights(100);\n\n\t\t//\n\n\t\tconst camera = new t3d.Camera();\n\t\tcamera.position.set(0, 300, 300);\n\t\tcamera.lookAt(new t3d.Vector3(0, 0, -20), new t3d.Vector3(0, 1, 0));\n\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 5000);\n\t\tscene.add(camera);\n\n\t\tconst controller = new OrbitControls(camera, canvas);\n\t\tcontroller.target.set(0, -5, 0);\n\n\t\tconst deferredRenderer = new DeferredRenderer(canvas);\n\n\t\tconst cubeTexturePath = './resources/skybox/Bridge2/';\n\t\tlet cubeTexture = new TextureCubeLoader().load([\n\t\t\tcubeTexturePath + 'posx.jpg',\n\t\t\tcubeTexturePath + 'negx.jpg',\n\t\t\tcubeTexturePath + 'posy.jpg',\n\t\t\tcubeTexturePath + 'negy.jpg',\n\t\t\tcubeTexturePath + 'posz.jpg',\n\t\t\tcubeTexturePath + 'negz.jpg'\n\t\t], function() {\n\t\t\tcubeTexture = (new PMREMGenerator()).prefilter(deferredRenderer, cubeTexture);\n\n\t\t\tdeferredRenderer.ambientCubemap = cubeTexture;\n\t\t\tdeferredRenderer.ambientCubemapIntensity = 1;\n\t\t});\n\n\t\tconst tempRenderTarget = t3d.OffscreenRenderTarget.create2D(width, height);\n\t\ttempRenderTarget.texture.minFilter = t3d.TEXTURE_FILTER.LINEAR;\n\t\ttempRenderTarget.texture.magFilter = t3d.TEXTURE_FILTER.LINEAR;\n\t\t\n\t\tconst fxaaPass = new t3d.ShaderPostPass(FXAAShader);\n\t\tfxaaPass.uniforms['tDiffuse'] = tempRenderTarget.texture;\n\n\t\tconst params = { lightCount: 100, rotate: true, fxaa: true };\n\t\tconst gui = new GUI();\n\t\tgui.add({ version: 'WebGL ' + deferredRenderer.capabilities.version }, 'version').disable();\n\t\tgui.add(params, 'lightCount', 0, maxLightCount, 1).onChange(setLights);\n\t\tgui.add(params, 'rotate');\n\t\tgui.add(params, 'fxaa');\n\n\t\tconst stats = new Stats();\n\t\tstats.showPanel(0);\n\t\tdocument.body.appendChild(stats.dom);\n\n\t\tfunction loop(count) {\n\t\t\trequestAnimationFrame(loop);\n\n\t\t\tstats.begin();\n\n\t\t\tcontroller.update();\n\n\t\t\tif (params.rotate) {\n\t\t\t\tfor (let i = 0; i < lights.length; i++) {\n\t\t\t\t\tconst pointLight = lights[i];\n\n\t\t\t\t\tpointLight._angle += pointLight._speed;\n\n\t\t\t\t\tpointLight.position.x = Math.cos(pointLight._angle) * pointLight._radius;\n\t\t\t\t\tpointLight.position.z = Math.sin(pointLight._angle) * pointLight._radius;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (params.fxaa) {\n\t\t\t\tdeferredRenderer.render(scene, camera, tempRenderTarget);\n\t\t\t\tfxaaPass.render(deferredRenderer, deferredRenderer.screenRenderTarget);\n\t\t\t} else {\n\t\t\t\tdeferredRenderer.render(scene, camera);\n\t\t\t}\n\n\t\t\tstats.end();\n\t\t}\n\t\trequestAnimationFrame(loop);\n\n\t\tfunction onWindowResize() {\n\t\t\twidth = window.innerWidth || 2;\n\t\t\theight = window.innerHeight || 2;\n\n\t\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 5000);\n\n\t\t\tdeferredRenderer.resize(width, height);\n\t\t\ttempRenderTarget.resize(width, height);\n\t\t}\n\t\twindow.addEventListener('resize', onWindowResize, false);\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "examples/resources/3d/Readme.txt",
    "content": "﻿** head256x256x109.zip\n\nThis file is from\n\nhttps://www.codeproject.com/Articles/352270/Getting-started-with-Volume-Rendering\n\nThis file is licensed under The Code Project Open License (CPOL)\n\nhttps://www.codeproject.com/info/cpol10.aspx\n"
  },
  {
    "path": "examples/resources/fonts/msdf/roboto-regular.fnt",
    "content": "{\n    \"pages\": [\n        \"roboto-regular.png\"\n    ],\n    \"chars\": [\n        {\n            \"id\": 40,\n            \"index\": 12,\n            \"char\": \"(\",\n            \"width\": 25,\n            \"height\": 87,\n            \"xoffset\": 3,\n            \"yoffset\": -2,\n            \"xadvance\": 27,\n            \"chnl\": 15,\n            \"x\": 0,\n            \"y\": 0,\n            \"page\": 0\n        },\n        {\n            \"id\": 41,\n            \"index\": 13,\n            \"char\": \")\",\n            \"width\": 25,\n            \"height\": 87,\n            \"xoffset\": -1,\n            \"yoffset\": -2,\n            \"xadvance\": 28,\n            \"chnl\": 15,\n            \"x\": 0,\n            \"y\": 88,\n            \"page\": 0\n        },\n        {\n            \"id\": 91,\n            \"index\": 63,\n            \"char\": \"[\",\n            \"width\": 19,\n            \"height\": 81,\n            \"xoffset\": 4,\n            \"yoffset\": -3,\n            \"xadvance\": 21,\n            \"chnl\": 15,\n            \"x\": 0,\n            \"y\": 176,\n            \"page\": 0\n        },\n        {\n            \"id\": 93,\n            \"index\": 65,\n            \"char\": \"]\",\n            \"width\": 19,\n            \"height\": 81,\n            \"xoffset\": -2,\n            \"yoffset\": -3,\n            \"xadvance\": 21,\n            \"chnl\": 15,\n            \"x\": 0,\n            \"y\": 258,\n            \"page\": 0\n        },\n        {\n            \"id\": 123,\n            \"index\": 95,\n            \"char\": \"{\",\n            \"width\": 28,\n            \"height\": 81,\n            \"xoffset\": 1,\n            \"yoffset\": 0,\n            \"xadvance\": 27,\n            \"chnl\": 15,\n            \"x\": 0,\n            \"y\": 340,\n            \"page\": 0\n        },\n        {\n            \"id\": 125,\n            \"index\": 97,\n            \"char\": \"}\",\n            \"width\": 28,\n            \"height\": 81,\n            \"xoffset\": -1,\n            \"yoffset\": 0,\n            \"xadvance\": 27,\n            \"chnl\": 15,\n            \"x\": 0,\n            \"y\": 422,\n            \"page\": 0\n        },\n        {\n            \"id\": 106,\n            \"index\": 78,\n            \"char\": \"j\",\n            \"width\": 20,\n            \"height\": 79,\n            \"xoffset\": -5,\n            \"yoffset\": 4,\n            \"xadvance\": 19,\n            \"chnl\": 15,\n            \"x\": 20,\n            \"y\": 176,\n            \"page\": 0\n        },\n        {\n            \"id\": 36,\n            \"index\": 8,\n            \"char\": \"$\",\n            \"width\": 40,\n            \"height\": 78,\n            \"xoffset\": 2,\n            \"yoffset\": -4,\n            \"xadvance\": 45,\n            \"chnl\": 15,\n            \"x\": 20,\n            \"y\": 256,\n            \"page\": 0\n        },\n        {\n            \"id\": 64,\n            \"index\": 36,\n            \"char\": \"@\",\n            \"width\": 67,\n            \"height\": 78,\n            \"xoffset\": 3,\n            \"yoffset\": 6,\n            \"xadvance\": 72,\n            \"chnl\": 15,\n            \"x\": 26,\n            \"y\": 0,\n            \"page\": 0\n        },\n        {\n            \"id\": 81,\n            \"index\": 53,\n            \"char\": \"Q\",\n            \"width\": 50,\n            \"height\": 71,\n            \"xoffset\": 2,\n            \"yoffset\": 4,\n            \"xadvance\": 55,\n            \"chnl\": 15,\n            \"x\": 26,\n            \"y\": 79,\n            \"page\": 0\n        },\n        {\n            \"id\": 87,\n            \"index\": 59,\n            \"char\": \"W\",\n            \"width\": 71,\n            \"height\": 61,\n            \"xoffset\": 0,\n            \"yoffset\": 5,\n            \"xadvance\": 71,\n            \"chnl\": 15,\n            \"x\": 41,\n            \"y\": 151,\n            \"page\": 0\n        },\n        {\n            \"id\": 124,\n            \"index\": 96,\n            \"char\": \"|\",\n            \"width\": 10,\n            \"height\": 71,\n            \"xoffset\": 5,\n            \"yoffset\": 5,\n            \"xadvance\": 19,\n            \"chnl\": 15,\n            \"x\": 77,\n            \"y\": 79,\n            \"page\": 0\n        },\n        {\n            \"id\": 92,\n            \"index\": 64,\n            \"char\": \"\\\\\",\n            \"width\": 35,\n            \"height\": 66,\n            \"xoffset\": 0,\n            \"yoffset\": 5,\n            \"xadvance\": 33,\n            \"chnl\": 15,\n            \"x\": 88,\n            \"y\": 79,\n            \"page\": 0\n        },\n        {\n            \"id\": 47,\n            \"index\": 19,\n            \"char\": \"/\",\n            \"width\": 34,\n            \"height\": 66,\n            \"xoffset\": -1,\n            \"yoffset\": 5,\n            \"xadvance\": 33,\n            \"chnl\": 15,\n            \"x\": 94,\n            \"y\": 0,\n            \"page\": 0\n        },\n        {\n            \"id\": 162,\n            \"index\": 100,\n            \"char\": \"¢\",\n            \"width\": 40,\n            \"height\": 65,\n            \"xoffset\": 2,\n            \"yoffset\": 11,\n            \"xadvance\": 44,\n            \"chnl\": 15,\n            \"x\": 29,\n            \"y\": 335,\n            \"page\": 0\n        },\n        {\n            \"id\": 98,\n            \"index\": 70,\n            \"char\": \"b\",\n            \"width\": 40,\n            \"height\": 65,\n            \"xoffset\": 3,\n            \"yoffset\": 2,\n            \"xadvance\": 45,\n            \"chnl\": 15,\n            \"x\": 29,\n            \"y\": 401,\n            \"page\": 0\n        },\n        {\n            \"id\": 100,\n            \"index\": 72,\n            \"char\": \"d\",\n            \"width\": 40,\n            \"height\": 65,\n            \"xoffset\": 2,\n            \"yoffset\": 2,\n            \"xadvance\": 45,\n            \"chnl\": 15,\n            \"x\": 61,\n            \"y\": 213,\n            \"page\": 0\n        },\n        {\n            \"id\": 102,\n            \"index\": 74,\n            \"char\": \"f\",\n            \"width\": 30,\n            \"height\": 65,\n            \"xoffset\": 0,\n            \"yoffset\": 1,\n            \"xadvance\": 28,\n            \"chnl\": 15,\n            \"x\": 70,\n            \"y\": 279,\n            \"page\": 0\n        },\n        {\n            \"id\": 103,\n            \"index\": 75,\n            \"char\": \"g\",\n            \"width\": 40,\n            \"height\": 64,\n            \"xoffset\": 2,\n            \"yoffset\": 19,\n            \"xadvance\": 45,\n            \"chnl\": 15,\n            \"x\": 70,\n            \"y\": 345,\n            \"page\": 0\n        },\n        {\n            \"id\": 104,\n            \"index\": 76,\n            \"char\": \"h\",\n            \"width\": 37,\n            \"height\": 64,\n            \"xoffset\": 3,\n            \"yoffset\": 2,\n            \"xadvance\": 44,\n            \"chnl\": 15,\n            \"x\": 101,\n            \"y\": 279,\n            \"page\": 0\n        },\n        {\n            \"id\": 107,\n            \"index\": 79,\n            \"char\": \"k\",\n            \"width\": 39,\n            \"height\": 64,\n            \"xoffset\": 4,\n            \"yoffset\": 2,\n            \"xadvance\": 41,\n            \"chnl\": 15,\n            \"x\": 102,\n            \"y\": 213,\n            \"page\": 0\n        },\n        {\n            \"id\": 108,\n            \"index\": 80,\n            \"char\": \"l\",\n            \"width\": 11,\n            \"height\": 64,\n            \"xoffset\": 4,\n            \"yoffset\": 2,\n            \"xadvance\": 19,\n            \"chnl\": 15,\n            \"x\": 113,\n            \"y\": 146,\n            \"page\": 0\n        },\n        {\n            \"id\": 37,\n            \"index\": 9,\n            \"char\": \"%\",\n            \"width\": 55,\n            \"height\": 63,\n            \"xoffset\": 2,\n            \"yoffset\": 4,\n            \"xadvance\": 59,\n            \"chnl\": 15,\n            \"x\": 124,\n            \"y\": 67,\n            \"page\": 0\n        },\n        {\n            \"id\": 109,\n            \"index\": 81,\n            \"char\": \"m\",\n            \"width\": 63,\n            \"height\": 47,\n            \"xoffset\": 3,\n            \"yoffset\": 19,\n            \"xadvance\": 70,\n            \"chnl\": 15,\n            \"x\": 129,\n            \"y\": 0,\n            \"page\": 0\n        },\n        {\n            \"id\": 112,\n            \"index\": 84,\n            \"char\": \"p\",\n            \"width\": 40,\n            \"height\": 63,\n            \"xoffset\": 3,\n            \"yoffset\": 19,\n            \"xadvance\": 45,\n            \"chnl\": 15,\n            \"x\": 125,\n            \"y\": 131,\n            \"page\": 0\n        },\n        {\n            \"id\": 113,\n            \"index\": 85,\n            \"char\": \"q\",\n            \"width\": 40,\n            \"height\": 63,\n            \"xoffset\": 2,\n            \"yoffset\": 19,\n            \"xadvance\": 45,\n            \"chnl\": 15,\n            \"x\": 70,\n            \"y\": 410,\n            \"page\": 0\n        },\n        {\n            \"id\": 121,\n            \"index\": 93,\n            \"char\": \"y\",\n            \"width\": 40,\n            \"height\": 63,\n            \"xoffset\": -1,\n            \"yoffset\": 20,\n            \"xadvance\": 38,\n            \"chnl\": 15,\n            \"x\": 111,\n            \"y\": 344,\n            \"page\": 0\n        },\n        {\n            \"id\": 163,\n            \"index\": 101,\n            \"char\": \"£\",\n            \"width\": 45,\n            \"height\": 62,\n            \"xoffset\": 2,\n            \"yoffset\": 4,\n            \"xadvance\": 46,\n            \"chnl\": 15,\n            \"x\": 139,\n            \"y\": 278,\n            \"page\": 0\n        },\n        {\n            \"id\": 38,\n            \"index\": 10,\n            \"char\": \"&\",\n            \"width\": 50,\n            \"height\": 62,\n            \"xoffset\": 2,\n            \"yoffset\": 4,\n            \"xadvance\": 50,\n            \"chnl\": 15,\n            \"x\": 142,\n            \"y\": 195,\n            \"page\": 0\n        },\n        {\n            \"id\": 48,\n            \"index\": 20,\n            \"char\": \"0\",\n            \"width\": 40,\n            \"height\": 62,\n            \"xoffset\": 2,\n            \"yoffset\": 4,\n            \"xadvance\": 45,\n            \"chnl\": 15,\n            \"x\": 166,\n            \"y\": 131,\n            \"page\": 0\n        },\n        {\n            \"id\": 50,\n            \"index\": 22,\n            \"char\": \"2\",\n            \"width\": 42,\n            \"height\": 62,\n            \"xoffset\": 2,\n            \"yoffset\": 4,\n            \"xadvance\": 45,\n            \"chnl\": 15,\n            \"x\": 180,\n            \"y\": 48,\n            \"page\": 0\n        },\n        {\n            \"id\": 51,\n            \"index\": 23,\n            \"char\": \"3\",\n            \"width\": 40,\n            \"height\": 62,\n            \"xoffset\": 2,\n            \"yoffset\": 4,\n            \"xadvance\": 45,\n            \"chnl\": 15,\n            \"x\": 111,\n            \"y\": 408,\n            \"page\": 0\n        },\n        {\n            \"id\": 53,\n            \"index\": 25,\n            \"char\": \"5\",\n            \"width\": 40,\n            \"height\": 62,\n            \"xoffset\": 4,\n            \"yoffset\": 5,\n            \"xadvance\": 45,\n            \"chnl\": 15,\n            \"x\": 152,\n            \"y\": 341,\n            \"page\": 0\n        },\n        {\n            \"id\": 54,\n            \"index\": 26,\n            \"char\": \"6\",\n            \"width\": 40,\n            \"height\": 62,\n            \"xoffset\": 3,\n            \"yoffset\": 5,\n            \"xadvance\": 45,\n            \"chnl\": 15,\n            \"x\": 185,\n            \"y\": 258,\n            \"page\": 0\n        },\n        {\n            \"id\": 56,\n            \"index\": 28,\n            \"char\": \"8\",\n            \"width\": 40,\n            \"height\": 62,\n            \"xoffset\": 2,\n            \"yoffset\": 4,\n            \"xadvance\": 45,\n            \"chnl\": 15,\n            \"x\": 193,\n            \"y\": 194,\n            \"page\": 0\n        },\n        {\n            \"id\": 57,\n            \"index\": 29,\n            \"char\": \"9\",\n            \"width\": 40,\n            \"height\": 62,\n            \"xoffset\": 2,\n            \"yoffset\": 4,\n            \"xadvance\": 45,\n            \"chnl\": 15,\n            \"x\": 207,\n            \"y\": 111,\n            \"page\": 0\n        },\n        {\n            \"id\": 63,\n            \"index\": 35,\n            \"char\": \"?\",\n            \"width\": 36,\n            \"height\": 62,\n            \"xoffset\": 1,\n            \"yoffset\": 4,\n            \"xadvance\": 38,\n            \"chnl\": 15,\n            \"x\": 152,\n            \"y\": 404,\n            \"page\": 0\n        },\n        {\n            \"id\": 67,\n            \"index\": 39,\n            \"char\": \"C\",\n            \"width\": 48,\n            \"height\": 62,\n            \"xoffset\": 3,\n            \"yoffset\": 4,\n            \"xadvance\": 52,\n            \"chnl\": 15,\n            \"x\": 189,\n            \"y\": 404,\n            \"page\": 0\n        },\n        {\n            \"id\": 71,\n            \"index\": 43,\n            \"char\": \"G\",\n            \"width\": 48,\n            \"height\": 62,\n            \"xoffset\": 3,\n            \"yoffset\": 4,\n            \"xadvance\": 54,\n            \"chnl\": 15,\n            \"x\": 193,\n            \"y\": 321,\n            \"page\": 0\n        },\n        {\n            \"id\": 74,\n            \"index\": 46,\n            \"char\": \"J\",\n            \"width\": 40,\n            \"height\": 62,\n            \"xoffset\": 0,\n            \"yoffset\": 5,\n            \"xadvance\": 44,\n            \"chnl\": 15,\n            \"x\": 226,\n            \"y\": 257,\n            \"page\": 0\n        },\n        {\n            \"id\": 79,\n            \"index\": 51,\n            \"char\": \"O\",\n            \"width\": 50,\n            \"height\": 62,\n            \"xoffset\": 3,\n            \"yoffset\": 4,\n            \"xadvance\": 55,\n            \"chnl\": 15,\n            \"x\": 234,\n            \"y\": 174,\n            \"page\": 0\n        },\n        {\n            \"id\": 83,\n            \"index\": 55,\n            \"char\": \"S\",\n            \"width\": 45,\n            \"height\": 62,\n            \"xoffset\": 1,\n            \"yoffset\": 4,\n            \"xadvance\": 47,\n            \"chnl\": 15,\n            \"x\": 223,\n            \"y\": 0,\n            \"page\": 0\n        },\n        {\n            \"id\": 85,\n            \"index\": 57,\n            \"char\": \"U\",\n            \"width\": 45,\n            \"height\": 62,\n            \"xoffset\": 3,\n            \"yoffset\": 5,\n            \"xadvance\": 52,\n            \"chnl\": 15,\n            \"x\": 248,\n            \"y\": 63,\n            \"page\": 0\n        },\n        {\n            \"id\": 105,\n            \"index\": 77,\n            \"char\": \"i\",\n            \"width\": 13,\n            \"height\": 62,\n            \"xoffset\": 4,\n            \"yoffset\": 4,\n            \"xadvance\": 19,\n            \"chnl\": 15,\n            \"x\": 269,\n            \"y\": 0,\n            \"page\": 0\n        },\n        {\n            \"id\": 165,\n            \"index\": 103,\n            \"char\": \"¥\",\n            \"width\": 45,\n            \"height\": 61,\n            \"xoffset\": -1,\n            \"yoffset\": 5,\n            \"xadvance\": 42,\n            \"chnl\": 15,\n            \"x\": 283,\n            \"y\": 0,\n            \"page\": 0\n        },\n        {\n            \"id\": 161,\n            \"index\": 99,\n            \"char\": \"¡\",\n            \"width\": 13,\n            \"height\": 61,\n            \"xoffset\": 3,\n            \"yoffset\": 19,\n            \"xadvance\": 19,\n            \"chnl\": 15,\n            \"x\": 238,\n            \"y\": 384,\n            \"page\": 0\n        },\n        {\n            \"id\": 33,\n            \"index\": 5,\n            \"char\": \"!\",\n            \"width\": 13,\n            \"height\": 61,\n            \"xoffset\": 4,\n            \"yoffset\": 5,\n            \"xadvance\": 21,\n            \"chnl\": 15,\n            \"x\": 242,\n            \"y\": 320,\n            \"page\": 0\n        },\n        {\n            \"id\": 35,\n            \"index\": 7,\n            \"char\": \"#\",\n            \"width\": 48,\n            \"height\": 61,\n            \"xoffset\": 3,\n            \"yoffset\": 5,\n            \"xadvance\": 49,\n            \"chnl\": 15,\n            \"x\": 238,\n            \"y\": 446,\n            \"page\": 0\n        },\n        {\n            \"id\": 49,\n            \"index\": 21,\n            \"char\": \"1\",\n            \"width\": 26,\n            \"height\": 61,\n            \"xoffset\": 5,\n            \"yoffset\": 5,\n            \"xadvance\": 45,\n            \"chnl\": 15,\n            \"x\": 252,\n            \"y\": 382,\n            \"page\": 0\n        },\n        {\n            \"id\": 52,\n            \"index\": 24,\n            \"char\": \"4\",\n            \"width\": 45,\n            \"height\": 61,\n            \"xoffset\": 0,\n            \"yoffset\": 5,\n            \"xadvance\": 45,\n            \"chnl\": 15,\n            \"x\": 256,\n            \"y\": 320,\n            \"page\": 0\n        },\n        {\n            \"id\": 55,\n            \"index\": 27,\n            \"char\": \"7\",\n            \"width\": 42,\n            \"height\": 61,\n            \"xoffset\": 1,\n            \"yoffset\": 5,\n            \"xadvance\": 45,\n            \"chnl\": 15,\n            \"x\": 279,\n            \"y\": 382,\n            \"page\": 0\n        },\n        {\n            \"id\": 65,\n            \"index\": 37,\n            \"char\": \"A\",\n            \"width\": 54,\n            \"height\": 61,\n            \"xoffset\": -1,\n            \"yoffset\": 5,\n            \"xadvance\": 52,\n            \"chnl\": 15,\n            \"x\": 287,\n            \"y\": 444,\n            \"page\": 0\n        },\n        {\n            \"id\": 66,\n            \"index\": 38,\n            \"char\": \"B\",\n            \"width\": 43,\n            \"height\": 61,\n            \"xoffset\": 5,\n            \"yoffset\": 5,\n            \"xadvance\": 50,\n            \"chnl\": 15,\n            \"x\": 267,\n            \"y\": 237,\n            \"page\": 0\n        },\n        {\n            \"id\": 68,\n            \"index\": 40,\n            \"char\": \"D\",\n            \"width\": 45,\n            \"height\": 61,\n            \"xoffset\": 5,\n            \"yoffset\": 5,\n            \"xadvance\": 52,\n            \"chnl\": 15,\n            \"x\": 302,\n            \"y\": 299,\n            \"page\": 0\n        },\n        {\n            \"id\": 69,\n            \"index\": 41,\n            \"char\": \"E\",\n            \"width\": 40,\n            \"height\": 61,\n            \"xoffset\": 5,\n            \"yoffset\": 5,\n            \"xadvance\": 45,\n            \"chnl\": 15,\n            \"x\": 322,\n            \"y\": 361,\n            \"page\": 0\n        },\n        {\n            \"id\": 70,\n            \"index\": 42,\n            \"char\": \"F\",\n            \"width\": 39,\n            \"height\": 61,\n            \"xoffset\": 5,\n            \"yoffset\": 5,\n            \"xadvance\": 44,\n            \"chnl\": 15,\n            \"x\": 342,\n            \"y\": 423,\n            \"page\": 0\n        },\n        {\n            \"id\": 72,\n            \"index\": 44,\n            \"char\": \"H\",\n            \"width\": 48,\n            \"height\": 61,\n            \"xoffset\": 5,\n            \"yoffset\": 5,\n            \"xadvance\": 57,\n            \"chnl\": 15,\n            \"x\": 285,\n            \"y\": 126,\n            \"page\": 0\n        },\n        {\n            \"id\": 73,\n            \"index\": 45,\n            \"char\": \"I\",\n            \"width\": 12,\n            \"height\": 61,\n            \"xoffset\": 5,\n            \"yoffset\": 5,\n            \"xadvance\": 22,\n            \"chnl\": 15,\n            \"x\": 294,\n            \"y\": 62,\n            \"page\": 0\n        },\n        {\n            \"id\": 75,\n            \"index\": 47,\n            \"char\": \"K\",\n            \"width\": 48,\n            \"height\": 61,\n            \"xoffset\": 5,\n            \"yoffset\": 5,\n            \"xadvance\": 50,\n            \"chnl\": 15,\n            \"x\": 307,\n            \"y\": 62,\n            \"page\": 0\n        },\n        {\n            \"id\": 76,\n            \"index\": 48,\n            \"char\": \"L\",\n            \"width\": 38,\n            \"height\": 61,\n            \"xoffset\": 5,\n            \"yoffset\": 5,\n            \"xadvance\": 43,\n            \"chnl\": 15,\n            \"x\": 329,\n            \"y\": 0,\n            \"page\": 0\n        },\n        {\n            \"id\": 77,\n            \"index\": 49,\n            \"char\": \"M\",\n            \"width\": 61,\n            \"height\": 61,\n            \"xoffset\": 5,\n            \"yoffset\": 5,\n            \"xadvance\": 70,\n            \"chnl\": 15,\n            \"x\": 311,\n            \"y\": 188,\n            \"page\": 0\n        },\n        {\n            \"id\": 78,\n            \"index\": 50,\n            \"char\": \"N\",\n            \"width\": 48,\n            \"height\": 61,\n            \"xoffset\": 5,\n            \"yoffset\": 5,\n            \"xadvance\": 57,\n            \"chnl\": 15,\n            \"x\": 334,\n            \"y\": 124,\n            \"page\": 0\n        },\n        {\n            \"id\": 80,\n            \"index\": 52,\n            \"char\": \"P\",\n            \"width\": 45,\n            \"height\": 61,\n            \"xoffset\": 5,\n            \"yoffset\": 5,\n            \"xadvance\": 50,\n            \"chnl\": 15,\n            \"x\": 356,\n            \"y\": 62,\n            \"page\": 0\n        },\n        {\n            \"id\": 82,\n            \"index\": 54,\n            \"char\": \"R\",\n            \"width\": 45,\n            \"height\": 61,\n            \"xoffset\": 5,\n            \"yoffset\": 5,\n            \"xadvance\": 49,\n            \"chnl\": 15,\n            \"x\": 368,\n            \"y\": 0,\n            \"page\": 0\n        },\n        {\n            \"id\": 84,\n            \"index\": 56,\n            \"char\": \"T\",\n            \"width\": 48,\n            \"height\": 61,\n            \"xoffset\": 0,\n            \"yoffset\": 5,\n            \"xadvance\": 48,\n            \"chnl\": 15,\n            \"x\": 348,\n            \"y\": 250,\n            \"page\": 0\n        },\n        {\n            \"id\": 86,\n            \"index\": 58,\n            \"char\": \"V\",\n            \"width\": 53,\n            \"height\": 61,\n            \"xoffset\": -1,\n            \"yoffset\": 5,\n            \"xadvance\": 51,\n            \"chnl\": 15,\n            \"x\": 373,\n            \"y\": 186,\n            \"page\": 0\n        },\n        {\n            \"id\": 88,\n            \"index\": 60,\n            \"char\": \"X\",\n            \"width\": 50,\n            \"height\": 61,\n            \"xoffset\": 0,\n            \"yoffset\": 5,\n            \"xadvance\": 50,\n            \"chnl\": 15,\n            \"x\": 383,\n            \"y\": 124,\n            \"page\": 0\n        },\n        {\n            \"id\": 89,\n            \"index\": 61,\n            \"char\": \"Y\",\n            \"width\": 51,\n            \"height\": 61,\n            \"xoffset\": -1,\n            \"yoffset\": 5,\n            \"xadvance\": 48,\n            \"chnl\": 15,\n            \"x\": 402,\n            \"y\": 62,\n            \"page\": 0\n        },\n        {\n            \"id\": 90,\n            \"index\": 62,\n            \"char\": \"Z\",\n            \"width\": 45,\n            \"height\": 61,\n            \"xoffset\": 1,\n            \"yoffset\": 5,\n            \"xadvance\": 48,\n            \"chnl\": 15,\n            \"x\": 414,\n            \"y\": 0,\n            \"page\": 0\n        },\n        {\n            \"id\": 119,\n            \"index\": 91,\n            \"char\": \"w\",\n            \"width\": 61,\n            \"height\": 46,\n            \"xoffset\": 0,\n            \"yoffset\": 20,\n            \"xadvance\": 60,\n            \"chnl\": 15,\n            \"x\": 348,\n            \"y\": 312,\n            \"page\": 0\n        },\n        {\n            \"id\": 59,\n            \"index\": 31,\n            \"char\": \";\",\n            \"width\": 16,\n            \"height\": 58,\n            \"xoffset\": 0,\n            \"yoffset\": 19,\n            \"xadvance\": 17,\n            \"chnl\": 15,\n            \"x\": 363,\n            \"y\": 359,\n            \"page\": 0\n        },\n        {\n            \"id\": 116,\n            \"index\": 88,\n            \"char\": \"t\",\n            \"width\": 27,\n            \"height\": 57,\n            \"xoffset\": -2,\n            \"yoffset\": 10,\n            \"xadvance\": 26,\n            \"chnl\": 15,\n            \"x\": 397,\n            \"y\": 248,\n            \"page\": 0\n        },\n        {\n            \"id\": 164,\n            \"index\": 102,\n            \"char\": \"¤\",\n            \"width\": 53,\n            \"height\": 54,\n            \"xoffset\": 2,\n            \"yoffset\": 13,\n            \"xadvance\": 57,\n            \"chnl\": 15,\n            \"x\": 454,\n            \"y\": 62,\n            \"page\": 0\n        },\n        {\n            \"id\": 97,\n            \"index\": 69,\n            \"char\": \"a\",\n            \"width\": 39,\n            \"height\": 48,\n            \"xoffset\": 2,\n            \"yoffset\": 19,\n            \"xadvance\": 44,\n            \"chnl\": 15,\n            \"x\": 460,\n            \"y\": 0,\n            \"page\": 0\n        },\n        {\n            \"id\": 99,\n            \"index\": 71,\n            \"char\": \"c\",\n            \"width\": 40,\n            \"height\": 48,\n            \"xoffset\": 2,\n            \"yoffset\": 19,\n            \"xadvance\": 42,\n            \"chnl\": 15,\n            \"x\": 380,\n            \"y\": 359,\n            \"page\": 0\n        },\n        {\n            \"id\": 101,\n            \"index\": 73,\n            \"char\": \"e\",\n            \"width\": 40,\n            \"height\": 48,\n            \"xoffset\": 2,\n            \"yoffset\": 19,\n            \"xadvance\": 42,\n            \"chnl\": 15,\n            \"x\": 410,\n            \"y\": 306,\n            \"page\": 0\n        },\n        {\n            \"id\": 111,\n            \"index\": 83,\n            \"char\": \"o\",\n            \"width\": 42,\n            \"height\": 48,\n            \"xoffset\": 2,\n            \"yoffset\": 19,\n            \"xadvance\": 46,\n            \"chnl\": 15,\n            \"x\": 425,\n            \"y\": 248,\n            \"page\": 0\n        },\n        {\n            \"id\": 115,\n            \"index\": 87,\n            \"char\": \"s\",\n            \"width\": 38,\n            \"height\": 48,\n            \"xoffset\": 2,\n            \"yoffset\": 19,\n            \"xadvance\": 41,\n            \"chnl\": 15,\n            \"x\": 468,\n            \"y\": 117,\n            \"page\": 0\n        },\n        {\n            \"id\": 126,\n            \"index\": 98,\n            \"char\": \"~\",\n            \"width\": 48,\n            \"height\": 20,\n            \"xoffset\": 3,\n            \"yoffset\": 31,\n            \"xadvance\": 54,\n            \"chnl\": 15,\n            \"x\": 342,\n            \"y\": 485,\n            \"page\": 0\n        },\n        {\n            \"id\": 58,\n            \"index\": 30,\n            \"char\": \":\",\n            \"width\": 13,\n            \"height\": 47,\n            \"xoffset\": 3,\n            \"yoffset\": 19,\n            \"xadvance\": 19,\n            \"chnl\": 15,\n            \"x\": 193,\n            \"y\": 0,\n            \"page\": 0\n        },\n        {\n            \"id\": 110,\n            \"index\": 82,\n            \"char\": \"n\",\n            \"width\": 37,\n            \"height\": 47,\n            \"xoffset\": 3,\n            \"yoffset\": 19,\n            \"xadvance\": 44,\n            \"chnl\": 15,\n            \"x\": 468,\n            \"y\": 166,\n            \"page\": 0\n        },\n        {\n            \"id\": 114,\n            \"index\": 86,\n            \"char\": \"r\",\n            \"width\": 24,\n            \"height\": 47,\n            \"xoffset\": 3,\n            \"yoffset\": 19,\n            \"xadvance\": 27,\n            \"chnl\": 15,\n            \"x\": 223,\n            \"y\": 63,\n            \"page\": 0\n        },\n        {\n            \"id\": 117,\n            \"index\": 89,\n            \"char\": \"u\",\n            \"width\": 37,\n            \"height\": 47,\n            \"xoffset\": 3,\n            \"yoffset\": 20,\n            \"xadvance\": 44,\n            \"chnl\": 15,\n            \"x\": 427,\n            \"y\": 186,\n            \"page\": 0\n        },\n        {\n            \"id\": 118,\n            \"index\": 90,\n            \"char\": \"v\",\n            \"width\": 40,\n            \"height\": 46,\n            \"xoffset\": -1,\n            \"yoffset\": 20,\n            \"xadvance\": 39,\n            \"chnl\": 15,\n            \"x\": 468,\n            \"y\": 214,\n            \"page\": 0\n        },\n        {\n            \"id\": 120,\n            \"index\": 92,\n            \"char\": \"x\",\n            \"width\": 40,\n            \"height\": 46,\n            \"xoffset\": 0,\n            \"yoffset\": 20,\n            \"xadvance\": 40,\n            \"chnl\": 15,\n            \"x\": 468,\n            \"y\": 261,\n            \"page\": 0\n        },\n        {\n            \"id\": 122,\n            \"index\": 94,\n            \"char\": \"z\",\n            \"width\": 38,\n            \"height\": 46,\n            \"xoffset\": 1,\n            \"yoffset\": 20,\n            \"xadvance\": 40,\n            \"chnl\": 15,\n            \"x\": 451,\n            \"y\": 308,\n            \"page\": 0\n        },\n        {\n            \"id\": 43,\n            \"index\": 15,\n            \"char\": \"+\",\n            \"width\": 43,\n            \"height\": 45,\n            \"xoffset\": 1,\n            \"yoffset\": 15,\n            \"xadvance\": 45,\n            \"chnl\": 15,\n            \"x\": 152,\n            \"y\": 467,\n            \"page\": 0\n        },\n        {\n            \"id\": 95,\n            \"index\": 67,\n            \"char\": \"_\",\n            \"width\": 40,\n            \"height\": 10,\n            \"xoffset\": -2,\n            \"yoffset\": 62,\n            \"xadvance\": 36,\n            \"chnl\": 15,\n            \"x\": 29,\n            \"y\": 467,\n            \"page\": 0\n        },\n        {\n            \"id\": 60,\n            \"index\": 32,\n            \"char\": \"<\",\n            \"width\": 36,\n            \"height\": 39,\n            \"xoffset\": 1,\n            \"yoffset\": 19,\n            \"xadvance\": 41,\n            \"chnl\": 15,\n            \"x\": 248,\n            \"y\": 126,\n            \"page\": 0\n        },\n        {\n            \"id\": 62,\n            \"index\": 34,\n            \"char\": \">\",\n            \"width\": 37,\n            \"height\": 39,\n            \"xoffset\": 3,\n            \"yoffset\": 19,\n            \"xadvance\": 42,\n            \"chnl\": 15,\n            \"x\": 111,\n            \"y\": 471,\n            \"page\": 0\n        },\n        {\n            \"id\": 42,\n            \"index\": 14,\n            \"char\": \"*\",\n            \"width\": 36,\n            \"height\": 37,\n            \"xoffset\": -1,\n            \"yoffset\": 5,\n            \"xadvance\": 34,\n            \"chnl\": 15,\n            \"x\": 311,\n            \"y\": 250,\n            \"page\": 0\n        },\n        {\n            \"id\": 61,\n            \"index\": 33,\n            \"char\": \"=\",\n            \"width\": 37,\n            \"height\": 27,\n            \"xoffset\": 4,\n            \"yoffset\": 24,\n            \"xadvance\": 44,\n            \"chnl\": 15,\n            \"x\": 70,\n            \"y\": 474,\n            \"page\": 0\n        },\n        {\n            \"id\": 171,\n            \"index\": 109,\n            \"char\": \"«\",\n            \"width\": 34,\n            \"height\": 35,\n            \"xoffset\": 2,\n            \"yoffset\": 25,\n            \"xadvance\": 38,\n            \"chnl\": 15,\n            \"x\": 196,\n            \"y\": 467,\n            \"page\": 0\n        },\n        {\n            \"id\": 94,\n            \"index\": 66,\n            \"char\": \"^\",\n            \"width\": 32,\n            \"height\": 32,\n            \"xoffset\": 1,\n            \"yoffset\": 5,\n            \"xadvance\": 33,\n            \"chnl\": 15,\n            \"x\": 434,\n            \"y\": 124,\n            \"page\": 0\n        },\n        {\n            \"id\": 44,\n            \"index\": 16,\n            \"char\": \",\",\n            \"width\": 15,\n            \"height\": 24,\n            \"xoffset\": -1,\n            \"yoffset\": 53,\n            \"xadvance\": 16,\n            \"chnl\": 15,\n            \"x\": 207,\n            \"y\": 0,\n            \"page\": 0\n        },\n        {\n            \"id\": 34,\n            \"index\": 6,\n            \"char\": \"\\\"\",\n            \"width\": 20,\n            \"height\": 23,\n            \"xoffset\": 3,\n            \"yoffset\": 2,\n            \"xadvance\": 26,\n            \"chnl\": 15,\n            \"x\": 490,\n            \"y\": 308,\n            \"page\": 0\n        },\n        {\n            \"id\": 39,\n            \"index\": 11,\n            \"char\": \"'\",\n            \"width\": 10,\n            \"height\": 23,\n            \"xoffset\": 2,\n            \"yoffset\": 2,\n            \"xadvance\": 14,\n            \"chnl\": 15,\n            \"x\": 26,\n            \"y\": 151,\n            \"page\": 0\n        },\n        {\n            \"id\": 45,\n            \"index\": 17,\n            \"char\": \"-\",\n            \"width\": 23,\n            \"height\": 10,\n            \"xoffset\": -1,\n            \"yoffset\": 35,\n            \"xadvance\": 22,\n            \"chnl\": 15,\n            \"x\": 311,\n            \"y\": 288,\n            \"page\": 0\n        },\n        {\n            \"id\": 96,\n            \"index\": 68,\n            \"char\": \"`\",\n            \"width\": 20,\n            \"height\": 15,\n            \"xoffset\": 0,\n            \"yoffset\": 2,\n            \"xadvance\": 25,\n            \"chnl\": 15,\n            \"x\": 490,\n            \"y\": 332,\n            \"page\": 0\n        },\n        {\n            \"id\": 46,\n            \"index\": 18,\n            \"char\": \".\",\n            \"width\": 13,\n            \"height\": 13,\n            \"xoffset\": 4,\n            \"yoffset\": 54,\n            \"xadvance\": 21,\n            \"chnl\": 15,\n            \"x\": 427,\n            \"y\": 234,\n            \"page\": 0\n        },\n        {\n            \"id\": 32,\n            \"index\": 4,\n            \"char\": \" \",\n            \"width\": 0,\n            \"height\": 0,\n            \"xoffset\": -2,\n            \"yoffset\": 62,\n            \"xadvance\": 20,\n            \"chnl\": 15,\n            \"x\": 124,\n            \"y\": 131,\n            \"page\": 0\n        }\n    ],\n    \"info\": {\n        \"face\": \"Roboto-Regular\",\n        \"size\": 80,\n        \"bold\": 0,\n        \"italic\": 0,\n        \"charset\": [\n            \"«\",\n            \"¢\",\n            \"£\",\n            \"¤\",\n            \"¥\",\n            \"¡\",\n            \"!\",\n            \"\\\\\",\n            \"\\\"\",\n            \"#\",\n            \"$\",\n            \"%\",\n            \"&\",\n            \"'\",\n            \"(\",\n            \")\",\n            \"*\",\n            \"+\",\n            \",\",\n            \"-\",\n            \".\",\n            \"/\",\n            \"0\",\n            \"1\",\n            \"2\",\n            \"3\",\n            \"4\",\n            \"5\",\n            \"6\",\n            \"7\",\n            \"8\",\n            \"9\",\n            \":\",\n            \";\",\n            \"<\",\n            \"=\",\n            \">\",\n            \"?\",\n            \"@\",\n            \"A\",\n            \"B\",\n            \"C\",\n            \"D\",\n            \"E\",\n            \"F\",\n            \"G\",\n            \"H\",\n            \"I\",\n            \"J\",\n            \"K\",\n            \"L\",\n            \"M\",\n            \"N\",\n            \"O\",\n            \"P\",\n            \"Q\",\n            \"R\",\n            \"S\",\n            \"T\",\n            \"U\",\n            \"V\",\n            \"W\",\n            \"X\",\n            \"Y\",\n            \"Z\",\n            \"[\",\n            \"]\",\n            \"^\",\n            \"_\",\n            \"`\",\n            \"a\",\n            \"b\",\n            \"c\",\n            \"d\",\n            \"e\",\n            \"f\",\n            \"g\",\n            \"h\",\n            \"i\",\n            \"j\",\n            \"k\",\n            \"l\",\n            \"m\",\n            \"n\",\n            \"o\",\n            \"p\",\n            \"q\",\n            \"r\",\n            \"s\",\n            \"t\",\n            \"u\",\n            \"v\",\n            \"w\",\n            \"x\",\n            \"y\",\n            \"z\",\n            \"{\",\n            \"|\",\n            \"}\",\n            \"~\",\n            \" \"\n        ],\n        \"unicode\": 1,\n        \"stretchH\": 100,\n        \"smooth\": 1,\n        \"aa\": 1,\n        \"padding\": [\n            2,\n            2,\n            2,\n            2\n        ],\n        \"spacing\": [\n            0,\n            0\n        ]\n    },\n    \"common\": {\n        \"lineHeight\": 84,\n        \"base\": 62,\n        \"scaleW\": 512,\n        \"scaleH\": 512,\n        \"pages\": 1,\n        \"packed\": 0,\n        \"alphaChnl\": 0,\n        \"redChnl\": 0,\n        \"greenChnl\": 0,\n        \"blueChnl\": 0\n    },\n    \"distanceField\": {\n        \"fieldType\": \"msdf\",\n        \"distanceRange\": 4\n    },\n    \"kernings\": [\n        {\n            \"first\": 34,\n            \"second\": 34,\n            \"amount\": -4\n        },\n        {\n            \"first\": 34,\n            \"second\": 39,\n            \"amount\": -4\n        },\n        {\n            \"first\": 34,\n            \"second\": 65,\n            \"amount\": -5\n        },\n        {\n            \"first\": 34,\n            \"second\": 97,\n            \"amount\": -2\n        },\n        {\n            \"first\": 34,\n            \"second\": 99,\n            \"amount\": -2\n        },\n        {\n            \"first\": 34,\n            \"second\": 100,\n            \"amount\": -2\n        },\n        {\n            \"first\": 34,\n            \"second\": 101,\n            \"amount\": -2\n        },\n        {\n            \"first\": 34,\n            \"second\": 103,\n            \"amount\": -2\n        },\n        {\n            \"first\": 34,\n            \"second\": 109,\n            \"amount\": -1\n        },\n        {\n            \"first\": 34,\n            \"second\": 110,\n            \"amount\": -1\n        },\n        {\n            \"first\": 34,\n            \"second\": 111,\n            \"amount\": -2\n        },\n        {\n            \"first\": 34,\n            \"second\": 112,\n            \"amount\": -1\n        },\n        {\n            \"first\": 34,\n            \"second\": 113,\n            \"amount\": -2\n        },\n        {\n            \"first\": 34,\n            \"second\": 115,\n            \"amount\": -3\n        },\n        {\n            \"first\": 34,\n            \"second\": 119,\n            \"amount\": 0\n        },\n        {\n            \"first\": 39,\n            \"second\": 34,\n            \"amount\": -4\n        },\n        {\n            \"first\": 39,\n            \"second\": 39,\n            \"amount\": -4\n        },\n        {\n            \"first\": 39,\n            \"second\": 65,\n            \"amount\": -5\n        },\n        {\n            \"first\": 39,\n            \"second\": 97,\n            \"amount\": -2\n        },\n        {\n            \"first\": 39,\n            \"second\": 99,\n            \"amount\": -2\n        },\n        {\n            \"first\": 39,\n            \"second\": 100,\n            \"amount\": -2\n        },\n        {\n            \"first\": 39,\n            \"second\": 101,\n            \"amount\": -2\n        },\n        {\n            \"first\": 39,\n            \"second\": 103,\n            \"amount\": -2\n        },\n        {\n            \"first\": 39,\n            \"second\": 109,\n            \"amount\": -1\n        },\n        {\n            \"first\": 39,\n            \"second\": 110,\n            \"amount\": -1\n        },\n        {\n            \"first\": 39,\n            \"second\": 111,\n            \"amount\": -2\n        },\n        {\n            \"first\": 39,\n            \"second\": 112,\n            \"amount\": -1\n        },\n        {\n            \"first\": 39,\n            \"second\": 113,\n            \"amount\": -2\n        },\n        {\n            \"first\": 39,\n            \"second\": 115,\n            \"amount\": -3\n        },\n        {\n            \"first\": 39,\n            \"second\": 119,\n            \"amount\": 0\n        },\n        {\n            \"first\": 40,\n            \"second\": 86,\n            \"amount\": 1\n        },\n        {\n            \"first\": 40,\n            \"second\": 87,\n            \"amount\": 1\n        },\n        {\n            \"first\": 40,\n            \"second\": 89,\n            \"amount\": 1\n        },\n        {\n            \"first\": 44,\n            \"second\": 34,\n            \"amount\": -7\n        },\n        {\n            \"first\": 44,\n            \"second\": 39,\n            \"amount\": -7\n        },\n        {\n            \"first\": 46,\n            \"second\": 34,\n            \"amount\": -7\n        },\n        {\n            \"first\": 46,\n            \"second\": 39,\n            \"amount\": -7\n        },\n        {\n            \"first\": 47,\n            \"second\": 47,\n            \"amount\": -9\n        },\n        {\n            \"first\": 65,\n            \"second\": 34,\n            \"amount\": -5\n        },\n        {\n            \"first\": 65,\n            \"second\": 39,\n            \"amount\": -5\n        },\n        {\n            \"first\": 65,\n            \"second\": 63,\n            \"amount\": -2\n        },\n        {\n            \"first\": 65,\n            \"second\": 67,\n            \"amount\": 0\n        },\n        {\n            \"first\": 65,\n            \"second\": 71,\n            \"amount\": 0\n        },\n        {\n            \"first\": 65,\n            \"second\": 79,\n            \"amount\": 0\n        },\n        {\n            \"first\": 65,\n            \"second\": 81,\n            \"amount\": 0\n        },\n        {\n            \"first\": 65,\n            \"second\": 84,\n            \"amount\": -5\n        },\n        {\n            \"first\": 65,\n            \"second\": 85,\n            \"amount\": -1\n        },\n        {\n            \"first\": 65,\n            \"second\": 86,\n            \"amount\": -3\n        },\n        {\n            \"first\": 65,\n            \"second\": 87,\n            \"amount\": -3\n        },\n        {\n            \"first\": 65,\n            \"second\": 89,\n            \"amount\": -4\n        },\n        {\n            \"first\": 65,\n            \"second\": 111,\n            \"amount\": 0\n        },\n        {\n            \"first\": 65,\n            \"second\": 116,\n            \"amount\": -1\n        },\n        {\n            \"first\": 65,\n            \"second\": 117,\n            \"amount\": 0\n        },\n        {\n            \"first\": 65,\n            \"second\": 118,\n            \"amount\": -2\n        },\n        {\n            \"first\": 65,\n            \"second\": 119,\n            \"amount\": -1\n        },\n        {\n            \"first\": 65,\n            \"second\": 121,\n            \"amount\": -2\n        },\n        {\n            \"first\": 65,\n            \"second\": 122,\n            \"amount\": 0\n        },\n        {\n            \"first\": 66,\n            \"second\": 84,\n            \"amount\": -1\n        },\n        {\n            \"first\": 66,\n            \"second\": 86,\n            \"amount\": -1\n        },\n        {\n            \"first\": 66,\n            \"second\": 89,\n            \"amount\": -2\n        },\n        {\n            \"first\": 67,\n            \"second\": 41,\n            \"amount\": -1\n        },\n        {\n            \"first\": 67,\n            \"second\": 84,\n            \"amount\": -1\n        },\n        {\n            \"first\": 67,\n            \"second\": 93,\n            \"amount\": 0\n        },\n        {\n            \"first\": 67,\n            \"second\": 125,\n            \"amount\": -1\n        },\n        {\n            \"first\": 68,\n            \"second\": 44,\n            \"amount\": -4\n        },\n        {\n            \"first\": 68,\n            \"second\": 46,\n            \"amount\": -4\n        },\n        {\n            \"first\": 68,\n            \"second\": 65,\n            \"amount\": -1\n        },\n        {\n            \"first\": 68,\n            \"second\": 84,\n            \"amount\": -1\n        },\n        {\n            \"first\": 68,\n            \"second\": 86,\n            \"amount\": -1\n        },\n        {\n            \"first\": 68,\n            \"second\": 88,\n            \"amount\": -1\n        },\n        {\n            \"first\": 68,\n            \"second\": 89,\n            \"amount\": -2\n        },\n        {\n            \"first\": 68,\n            \"second\": 90,\n            \"amount\": -1\n        },\n        {\n            \"first\": 69,\n            \"second\": 84,\n            \"amount\": 1\n        },\n        {\n            \"first\": 69,\n            \"second\": 99,\n            \"amount\": -1\n        },\n        {\n            \"first\": 69,\n            \"second\": 100,\n            \"amount\": -1\n        },\n        {\n            \"first\": 69,\n            \"second\": 101,\n            \"amount\": -1\n        },\n        {\n            \"first\": 69,\n            \"second\": 102,\n            \"amount\": -1\n        },\n        {\n            \"first\": 69,\n            \"second\": 103,\n            \"amount\": -1\n        },\n        {\n            \"first\": 69,\n            \"second\": 111,\n            \"amount\": -1\n        },\n        {\n            \"first\": 69,\n            \"second\": 113,\n            \"amount\": -1\n        },\n        {\n            \"first\": 69,\n            \"second\": 117,\n            \"amount\": -1\n        },\n        {\n            \"first\": 69,\n            \"second\": 118,\n            \"amount\": -1\n        },\n        {\n            \"first\": 69,\n            \"second\": 119,\n            \"amount\": -1\n        },\n        {\n            \"first\": 69,\n            \"second\": 121,\n            \"amount\": -1\n        },\n        {\n            \"first\": 70,\n            \"second\": 44,\n            \"amount\": -9\n        },\n        {\n            \"first\": 70,\n            \"second\": 46,\n            \"amount\": -9\n        },\n        {\n            \"first\": 70,\n            \"second\": 65,\n            \"amount\": -7\n        },\n        {\n            \"first\": 70,\n            \"second\": 74,\n            \"amount\": -10\n        },\n        {\n            \"first\": 70,\n            \"second\": 84,\n            \"amount\": 1\n        },\n        {\n            \"first\": 70,\n            \"second\": 97,\n            \"amount\": -1\n        },\n        {\n            \"first\": 70,\n            \"second\": 99,\n            \"amount\": -1\n        },\n        {\n            \"first\": 70,\n            \"second\": 100,\n            \"amount\": -1\n        },\n        {\n            \"first\": 70,\n            \"second\": 101,\n            \"amount\": -1\n        },\n        {\n            \"first\": 70,\n            \"second\": 103,\n            \"amount\": -1\n        },\n        {\n            \"first\": 70,\n            \"second\": 111,\n            \"amount\": -1\n        },\n        {\n            \"first\": 70,\n            \"second\": 113,\n            \"amount\": -1\n        },\n        {\n            \"first\": 70,\n            \"second\": 114,\n            \"amount\": -1\n        },\n        {\n            \"first\": 70,\n            \"second\": 117,\n            \"amount\": -1\n        },\n        {\n            \"first\": 70,\n            \"second\": 118,\n            \"amount\": -1\n        },\n        {\n            \"first\": 70,\n            \"second\": 121,\n            \"amount\": -1\n        },\n        {\n            \"first\": 72,\n            \"second\": 65,\n            \"amount\": 1\n        },\n        {\n            \"first\": 72,\n            \"second\": 84,\n            \"amount\": -1\n        },\n        {\n            \"first\": 72,\n            \"second\": 88,\n            \"amount\": 1\n        },\n        {\n            \"first\": 72,\n            \"second\": 89,\n            \"amount\": -1\n        },\n        {\n            \"first\": 73,\n            \"second\": 65,\n            \"amount\": 1\n        },\n        {\n            \"first\": 73,\n            \"second\": 84,\n            \"amount\": -1\n        },\n        {\n            \"first\": 73,\n            \"second\": 88,\n            \"amount\": 1\n        },\n        {\n            \"first\": 73,\n            \"second\": 89,\n            \"amount\": -1\n        },\n        {\n            \"first\": 74,\n            \"second\": 65,\n            \"amount\": -1\n        },\n        {\n            \"first\": 75,\n            \"second\": 45,\n            \"amount\": -2\n        },\n        {\n            \"first\": 75,\n            \"second\": 67,\n            \"amount\": -1\n        },\n        {\n            \"first\": 75,\n            \"second\": 71,\n            \"amount\": -1\n        },\n        {\n            \"first\": 75,\n            \"second\": 79,\n            \"amount\": -1\n        },\n        {\n            \"first\": 75,\n            \"second\": 81,\n            \"amount\": -1\n        },\n        {\n            \"first\": 75,\n            \"second\": 99,\n            \"amount\": -1\n        },\n        {\n            \"first\": 75,\n            \"second\": 100,\n            \"amount\": -1\n        },\n        {\n            \"first\": 75,\n            \"second\": 101,\n            \"amount\": -1\n        },\n        {\n            \"first\": 75,\n            \"second\": 103,\n            \"amount\": -1\n        },\n        {\n            \"first\": 75,\n            \"second\": 109,\n            \"amount\": -1\n        },\n        {\n            \"first\": 75,\n            \"second\": 110,\n            \"amount\": -1\n        },\n        {\n            \"first\": 75,\n            \"second\": 111,\n            \"amount\": -1\n        },\n        {\n            \"first\": 75,\n            \"second\": 112,\n            \"amount\": -1\n        },\n        {\n            \"first\": 75,\n            \"second\": 113,\n            \"amount\": -1\n        },\n        {\n            \"first\": 75,\n            \"second\": 117,\n            \"amount\": -1\n        },\n        {\n            \"first\": 75,\n            \"second\": 118,\n            \"amount\": -2\n        },\n        {\n            \"first\": 75,\n            \"second\": 119,\n            \"amount\": -2\n        },\n        {\n            \"first\": 75,\n            \"second\": 121,\n            \"amount\": -2\n        },\n        {\n            \"first\": 76,\n            \"second\": 34,\n            \"amount\": -13\n        },\n        {\n            \"first\": 76,\n            \"second\": 39,\n            \"amount\": -13\n        },\n        {\n            \"first\": 76,\n            \"second\": 65,\n            \"amount\": 1\n        },\n        {\n            \"first\": 76,\n            \"second\": 67,\n            \"amount\": -3\n        },\n        {\n            \"first\": 76,\n            \"second\": 71,\n            \"amount\": -3\n        },\n        {\n            \"first\": 76,\n            \"second\": 79,\n            \"amount\": -3\n        },\n        {\n            \"first\": 76,\n            \"second\": 81,\n            \"amount\": -3\n        },\n        {\n            \"first\": 76,\n            \"second\": 84,\n            \"amount\": -11\n        },\n        {\n            \"first\": 76,\n            \"second\": 85,\n            \"amount\": -2\n        },\n        {\n            \"first\": 76,\n            \"second\": 86,\n            \"amount\": -7\n        },\n        {\n            \"first\": 76,\n            \"second\": 87,\n            \"amount\": -6\n        },\n        {\n            \"first\": 76,\n            \"second\": 89,\n            \"amount\": -9\n        },\n        {\n            \"first\": 76,\n            \"second\": 117,\n            \"amount\": -2\n        },\n        {\n            \"first\": 76,\n            \"second\": 118,\n            \"amount\": -5\n        },\n        {\n            \"first\": 76,\n            \"second\": 119,\n            \"amount\": -4\n        },\n        {\n            \"first\": 76,\n            \"second\": 121,\n            \"amount\": -5\n        },\n        {\n            \"first\": 77,\n            \"second\": 65,\n            \"amount\": 1\n        },\n        {\n            \"first\": 77,\n            \"second\": 84,\n            \"amount\": -1\n        },\n        {\n            \"first\": 77,\n            \"second\": 88,\n            \"amount\": 1\n        },\n        {\n            \"first\": 77,\n            \"second\": 89,\n            \"amount\": -1\n        },\n        {\n            \"first\": 78,\n            \"second\": 65,\n            \"amount\": 1\n        },\n        {\n            \"first\": 78,\n            \"second\": 84,\n            \"amount\": -1\n        },\n        {\n            \"first\": 78,\n            \"second\": 88,\n            \"amount\": 1\n        },\n        {\n            \"first\": 78,\n            \"second\": 89,\n            \"amount\": -1\n        },\n        {\n            \"first\": 79,\n            \"second\": 44,\n            \"amount\": -4\n        },\n        {\n            \"first\": 79,\n            \"second\": 46,\n            \"amount\": -4\n        },\n        {\n            \"first\": 79,\n            \"second\": 65,\n            \"amount\": -1\n        },\n        {\n            \"first\": 79,\n            \"second\": 84,\n            \"amount\": -1\n        },\n        {\n            \"first\": 79,\n            \"second\": 86,\n            \"amount\": -1\n        },\n        {\n            \"first\": 79,\n            \"second\": 88,\n            \"amount\": -1\n        },\n        {\n            \"first\": 79,\n            \"second\": 89,\n            \"amount\": -2\n        },\n        {\n            \"first\": 79,\n            \"second\": 90,\n            \"amount\": -1\n        },\n        {\n            \"first\": 80,\n            \"second\": 44,\n            \"amount\": -13\n        },\n        {\n            \"first\": 80,\n            \"second\": 46,\n            \"amount\": -13\n        },\n        {\n            \"first\": 80,\n            \"second\": 65,\n            \"amount\": -5\n        },\n        {\n            \"first\": 80,\n            \"second\": 74,\n            \"amount\": -8\n        },\n        {\n            \"first\": 80,\n            \"second\": 88,\n            \"amount\": -1\n        },\n        {\n            \"first\": 80,\n            \"second\": 90,\n            \"amount\": -1\n        },\n        {\n            \"first\": 80,\n            \"second\": 97,\n            \"amount\": 0\n        },\n        {\n            \"first\": 80,\n            \"second\": 99,\n            \"amount\": -1\n        },\n        {\n            \"first\": 80,\n            \"second\": 100,\n            \"amount\": -1\n        },\n        {\n            \"first\": 80,\n            \"second\": 101,\n            \"amount\": -1\n        },\n        {\n            \"first\": 80,\n            \"second\": 103,\n            \"amount\": -1\n        },\n        {\n            \"first\": 80,\n            \"second\": 111,\n            \"amount\": -1\n        },\n        {\n            \"first\": 80,\n            \"second\": 113,\n            \"amount\": -1\n        },\n        {\n            \"first\": 80,\n            \"second\": 116,\n            \"amount\": 1\n        },\n        {\n            \"first\": 80,\n            \"second\": 118,\n            \"amount\": 1\n        },\n        {\n            \"first\": 80,\n            \"second\": 121,\n            \"amount\": 1\n        },\n        {\n            \"first\": 81,\n            \"second\": 84,\n            \"amount\": -2\n        },\n        {\n            \"first\": 81,\n            \"second\": 86,\n            \"amount\": -1\n        },\n        {\n            \"first\": 81,\n            \"second\": 87,\n            \"amount\": -1\n        },\n        {\n            \"first\": 81,\n            \"second\": 89,\n            \"amount\": -1\n        },\n        {\n            \"first\": 82,\n            \"second\": 84,\n            \"amount\": -3\n        },\n        {\n            \"first\": 82,\n            \"second\": 86,\n            \"amount\": -1\n        },\n        {\n            \"first\": 82,\n            \"second\": 89,\n            \"amount\": -2\n        },\n        {\n            \"first\": 84,\n            \"second\": 171,\n            \"amount\": -13\n        },\n        {\n            \"first\": 84,\n            \"second\": 44,\n            \"amount\": -9\n        },\n        {\n            \"first\": 84,\n            \"second\": 45,\n            \"amount\": -9\n        },\n        {\n            \"first\": 84,\n            \"second\": 46,\n            \"amount\": -9\n        },\n        {\n            \"first\": 84,\n            \"second\": 65,\n            \"amount\": -3\n        },\n        {\n            \"first\": 84,\n            \"second\": 67,\n            \"amount\": -1\n        },\n        {\n            \"first\": 84,\n            \"second\": 71,\n            \"amount\": -1\n        },\n        {\n            \"first\": 84,\n            \"second\": 74,\n            \"amount\": -9\n        },\n        {\n            \"first\": 84,\n            \"second\": 79,\n            \"amount\": -1\n        },\n        {\n            \"first\": 84,\n            \"second\": 81,\n            \"amount\": -1\n        },\n        {\n            \"first\": 84,\n            \"second\": 83,\n            \"amount\": -1\n        },\n        {\n            \"first\": 84,\n            \"second\": 84,\n            \"amount\": 1\n        },\n        {\n            \"first\": 84,\n            \"second\": 86,\n            \"amount\": 1\n        },\n        {\n            \"first\": 84,\n            \"second\": 87,\n            \"amount\": 1\n        },\n        {\n            \"first\": 84,\n            \"second\": 89,\n            \"amount\": 1\n        },\n        {\n            \"first\": 84,\n            \"second\": 97,\n            \"amount\": -4\n        },\n        {\n            \"first\": 84,\n            \"second\": 99,\n            \"amount\": -4\n        },\n        {\n            \"first\": 84,\n            \"second\": 100,\n            \"amount\": -4\n        },\n        {\n            \"first\": 84,\n            \"second\": 101,\n            \"amount\": -4\n        },\n        {\n            \"first\": 84,\n            \"second\": 103,\n            \"amount\": -4\n        },\n        {\n            \"first\": 84,\n            \"second\": 109,\n            \"amount\": -4\n        },\n        {\n            \"first\": 84,\n            \"second\": 110,\n            \"amount\": -4\n        },\n        {\n            \"first\": 84,\n            \"second\": 111,\n            \"amount\": -4\n        },\n        {\n            \"first\": 84,\n            \"second\": 112,\n            \"amount\": -4\n        },\n        {\n            \"first\": 84,\n            \"second\": 113,\n            \"amount\": -4\n        },\n        {\n            \"first\": 84,\n            \"second\": 114,\n            \"amount\": -3\n        },\n        {\n            \"first\": 84,\n            \"second\": 115,\n            \"amount\": -5\n        },\n        {\n            \"first\": 84,\n            \"second\": 117,\n            \"amount\": -4\n        },\n        {\n            \"first\": 84,\n            \"second\": 118,\n            \"amount\": -3\n        },\n        {\n            \"first\": 84,\n            \"second\": 119,\n            \"amount\": -2\n        },\n        {\n            \"first\": 84,\n            \"second\": 120,\n            \"amount\": -3\n        },\n        {\n            \"first\": 84,\n            \"second\": 121,\n            \"amount\": -3\n        },\n        {\n            \"first\": 84,\n            \"second\": 122,\n            \"amount\": -2\n        },\n        {\n            \"first\": 84,\n            \"second\": 32,\n            \"amount\": -2\n        },\n        {\n            \"first\": 85,\n            \"second\": 65,\n            \"amount\": -1\n        },\n        {\n            \"first\": 86,\n            \"second\": 41,\n            \"amount\": 1\n        },\n        {\n            \"first\": 86,\n            \"second\": 44,\n            \"amount\": -9\n        },\n        {\n            \"first\": 86,\n            \"second\": 45,\n            \"amount\": -1\n        },\n        {\n            \"first\": 86,\n            \"second\": 46,\n            \"amount\": -9\n        },\n        {\n            \"first\": 86,\n            \"second\": 65,\n            \"amount\": -3\n        },\n        {\n            \"first\": 86,\n            \"second\": 67,\n            \"amount\": -1\n        },\n        {\n            \"first\": 86,\n            \"second\": 71,\n            \"amount\": -1\n        },\n        {\n            \"first\": 86,\n            \"second\": 79,\n            \"amount\": -1\n        },\n        {\n            \"first\": 86,\n            \"second\": 81,\n            \"amount\": -1\n        },\n        {\n            \"first\": 86,\n            \"second\": 93,\n            \"amount\": 1\n        },\n        {\n            \"first\": 86,\n            \"second\": 97,\n            \"amount\": -2\n        },\n        {\n            \"first\": 86,\n            \"second\": 99,\n            \"amount\": -2\n        },\n        {\n            \"first\": 86,\n            \"second\": 100,\n            \"amount\": -2\n        },\n        {\n            \"first\": 86,\n            \"second\": 101,\n            \"amount\": -2\n        },\n        {\n            \"first\": 86,\n            \"second\": 103,\n            \"amount\": -2\n        },\n        {\n            \"first\": 86,\n            \"second\": 111,\n            \"amount\": -2\n        },\n        {\n            \"first\": 86,\n            \"second\": 113,\n            \"amount\": -2\n        },\n        {\n            \"first\": 86,\n            \"second\": 114,\n            \"amount\": -1\n        },\n        {\n            \"first\": 86,\n            \"second\": 117,\n            \"amount\": -1\n        },\n        {\n            \"first\": 86,\n            \"second\": 118,\n            \"amount\": 0\n        },\n        {\n            \"first\": 86,\n            \"second\": 121,\n            \"amount\": 0\n        },\n        {\n            \"first\": 86,\n            \"second\": 125,\n            \"amount\": 1\n        },\n        {\n            \"first\": 87,\n            \"second\": 41,\n            \"amount\": 1\n        },\n        {\n            \"first\": 87,\n            \"second\": 44,\n            \"amount\": -5\n        },\n        {\n            \"first\": 87,\n            \"second\": 45,\n            \"amount\": -2\n        },\n        {\n            \"first\": 87,\n            \"second\": 46,\n            \"amount\": -5\n        },\n        {\n            \"first\": 87,\n            \"second\": 65,\n            \"amount\": -2\n        },\n        {\n            \"first\": 87,\n            \"second\": 84,\n            \"amount\": 1\n        },\n        {\n            \"first\": 87,\n            \"second\": 93,\n            \"amount\": 0\n        },\n        {\n            \"first\": 87,\n            \"second\": 97,\n            \"amount\": -1\n        },\n        {\n            \"first\": 87,\n            \"second\": 99,\n            \"amount\": -1\n        },\n        {\n            \"first\": 87,\n            \"second\": 100,\n            \"amount\": -1\n        },\n        {\n            \"first\": 87,\n            \"second\": 101,\n            \"amount\": -1\n        },\n        {\n            \"first\": 87,\n            \"second\": 103,\n            \"amount\": -1\n        },\n        {\n            \"first\": 87,\n            \"second\": 111,\n            \"amount\": -1\n        },\n        {\n            \"first\": 87,\n            \"second\": 113,\n            \"amount\": -1\n        },\n        {\n            \"first\": 87,\n            \"second\": 114,\n            \"amount\": -1\n        },\n        {\n            \"first\": 87,\n            \"second\": 117,\n            \"amount\": -1\n        },\n        {\n            \"first\": 87,\n            \"second\": 125,\n            \"amount\": 1\n        },\n        {\n            \"first\": 88,\n            \"second\": 45,\n            \"amount\": -2\n        },\n        {\n            \"first\": 88,\n            \"second\": 67,\n            \"amount\": -1\n        },\n        {\n            \"first\": 88,\n            \"second\": 71,\n            \"amount\": -1\n        },\n        {\n            \"first\": 88,\n            \"second\": 79,\n            \"amount\": -1\n        },\n        {\n            \"first\": 88,\n            \"second\": 81,\n            \"amount\": -1\n        },\n        {\n            \"first\": 88,\n            \"second\": 86,\n            \"amount\": 1\n        },\n        {\n            \"first\": 88,\n            \"second\": 99,\n            \"amount\": -1\n        },\n        {\n            \"first\": 88,\n            \"second\": 100,\n            \"amount\": -1\n        },\n        {\n            \"first\": 88,\n            \"second\": 101,\n            \"amount\": -1\n        },\n        {\n            \"first\": 88,\n            \"second\": 103,\n            \"amount\": -1\n        },\n        {\n            \"first\": 88,\n            \"second\": 111,\n            \"amount\": -1\n        },\n        {\n            \"first\": 88,\n            \"second\": 113,\n            \"amount\": -1\n        },\n        {\n            \"first\": 88,\n            \"second\": 117,\n            \"amount\": -1\n        },\n        {\n            \"first\": 88,\n            \"second\": 118,\n            \"amount\": -1\n        },\n        {\n            \"first\": 88,\n            \"second\": 121,\n            \"amount\": -1\n        },\n        {\n            \"first\": 89,\n            \"second\": 171,\n            \"amount\": -3\n        },\n        {\n            \"first\": 89,\n            \"second\": 38,\n            \"amount\": -1\n        },\n        {\n            \"first\": 89,\n            \"second\": 41,\n            \"amount\": 1\n        },\n        {\n            \"first\": 89,\n            \"second\": 42,\n            \"amount\": -2\n        },\n        {\n            \"first\": 89,\n            \"second\": 44,\n            \"amount\": -8\n        },\n        {\n            \"first\": 89,\n            \"second\": 45,\n            \"amount\": -2\n        },\n        {\n            \"first\": 89,\n            \"second\": 46,\n            \"amount\": -8\n        },\n        {\n            \"first\": 89,\n            \"second\": 65,\n            \"amount\": -4\n        },\n        {\n            \"first\": 89,\n            \"second\": 67,\n            \"amount\": -1\n        },\n        {\n            \"first\": 89,\n            \"second\": 71,\n            \"amount\": -1\n        },\n        {\n            \"first\": 89,\n            \"second\": 74,\n            \"amount\": -4\n        },\n        {\n            \"first\": 89,\n            \"second\": 79,\n            \"amount\": -1\n        },\n        {\n            \"first\": 89,\n            \"second\": 81,\n            \"amount\": -1\n        },\n        {\n            \"first\": 89,\n            \"second\": 83,\n            \"amount\": -1\n        },\n        {\n            \"first\": 89,\n            \"second\": 84,\n            \"amount\": 1\n        },\n        {\n            \"first\": 89,\n            \"second\": 85,\n            \"amount\": -4\n        },\n        {\n            \"first\": 89,\n            \"second\": 86,\n            \"amount\": 1\n        },\n        {\n            \"first\": 89,\n            \"second\": 87,\n            \"amount\": 1\n        },\n        {\n            \"first\": 89,\n            \"second\": 88,\n            \"amount\": 1\n        },\n        {\n            \"first\": 89,\n            \"second\": 89,\n            \"amount\": 1\n        },\n        {\n            \"first\": 89,\n            \"second\": 93,\n            \"amount\": 1\n        },\n        {\n            \"first\": 89,\n            \"second\": 97,\n            \"amount\": -3\n        },\n        {\n            \"first\": 89,\n            \"second\": 99,\n            \"amount\": -3\n        },\n        {\n            \"first\": 89,\n            \"second\": 100,\n            \"amount\": -3\n        },\n        {\n            \"first\": 89,\n            \"second\": 101,\n            \"amount\": -3\n        },\n        {\n            \"first\": 89,\n            \"second\": 102,\n            \"amount\": -1\n        },\n        {\n            \"first\": 89,\n            \"second\": 103,\n            \"amount\": -3\n        },\n        {\n            \"first\": 89,\n            \"second\": 109,\n            \"amount\": -2\n        },\n        {\n            \"first\": 89,\n            \"second\": 110,\n            \"amount\": -2\n        },\n        {\n            \"first\": 89,\n            \"second\": 111,\n            \"amount\": -3\n        },\n        {\n            \"first\": 89,\n            \"second\": 112,\n            \"amount\": -2\n        },\n        {\n            \"first\": 89,\n            \"second\": 113,\n            \"amount\": -3\n        },\n        {\n            \"first\": 89,\n            \"second\": 114,\n            \"amount\": -2\n        },\n        {\n            \"first\": 89,\n            \"second\": 115,\n            \"amount\": -2\n        },\n        {\n            \"first\": 89,\n            \"second\": 116,\n            \"amount\": -1\n        },\n        {\n            \"first\": 89,\n            \"second\": 117,\n            \"amount\": -2\n        },\n        {\n            \"first\": 89,\n            \"second\": 118,\n            \"amount\": -1\n        },\n        {\n            \"first\": 89,\n            \"second\": 120,\n            \"amount\": -1\n        },\n        {\n            \"first\": 89,\n            \"second\": 121,\n            \"amount\": -1\n        },\n        {\n            \"first\": 89,\n            \"second\": 122,\n            \"amount\": -1\n        },\n        {\n            \"first\": 89,\n            \"second\": 125,\n            \"amount\": 1\n        },\n        {\n            \"first\": 90,\n            \"second\": 65,\n            \"amount\": 1\n        },\n        {\n            \"first\": 90,\n            \"second\": 67,\n            \"amount\": -1\n        },\n        {\n            \"first\": 90,\n            \"second\": 71,\n            \"amount\": -1\n        },\n        {\n            \"first\": 90,\n            \"second\": 79,\n            \"amount\": -1\n        },\n        {\n            \"first\": 90,\n            \"second\": 81,\n            \"amount\": -1\n        },\n        {\n            \"first\": 90,\n            \"second\": 99,\n            \"amount\": -1\n        },\n        {\n            \"first\": 90,\n            \"second\": 100,\n            \"amount\": -1\n        },\n        {\n            \"first\": 90,\n            \"second\": 101,\n            \"amount\": -1\n        },\n        {\n            \"first\": 90,\n            \"second\": 103,\n            \"amount\": -1\n        },\n        {\n            \"first\": 90,\n            \"second\": 111,\n            \"amount\": -1\n        },\n        {\n            \"first\": 90,\n            \"second\": 113,\n            \"amount\": -1\n        },\n        {\n            \"first\": 90,\n            \"second\": 117,\n            \"amount\": -1\n        },\n        {\n            \"first\": 90,\n            \"second\": 118,\n            \"amount\": -1\n        },\n        {\n            \"first\": 90,\n            \"second\": 119,\n            \"amount\": -1\n        },\n        {\n            \"first\": 90,\n            \"second\": 121,\n            \"amount\": -1\n        },\n        {\n            \"first\": 91,\n            \"second\": 74,\n            \"amount\": -1\n        },\n        {\n            \"first\": 91,\n            \"second\": 85,\n            \"amount\": -1\n        },\n        {\n            \"first\": 97,\n            \"second\": 34,\n            \"amount\": -3\n        },\n        {\n            \"first\": 97,\n            \"second\": 39,\n            \"amount\": -3\n        },\n        {\n            \"first\": 97,\n            \"second\": 118,\n            \"amount\": -1\n        },\n        {\n            \"first\": 97,\n            \"second\": 121,\n            \"amount\": -1\n        },\n        {\n            \"first\": 98,\n            \"second\": 34,\n            \"amount\": -1\n        },\n        {\n            \"first\": 98,\n            \"second\": 39,\n            \"amount\": -1\n        },\n        {\n            \"first\": 98,\n            \"second\": 118,\n            \"amount\": 0\n        },\n        {\n            \"first\": 98,\n            \"second\": 120,\n            \"amount\": -1\n        },\n        {\n            \"first\": 98,\n            \"second\": 121,\n            \"amount\": 0\n        },\n        {\n            \"first\": 98,\n            \"second\": 122,\n            \"amount\": -1\n        },\n        {\n            \"first\": 99,\n            \"second\": 34,\n            \"amount\": 0\n        },\n        {\n            \"first\": 99,\n            \"second\": 39,\n            \"amount\": 0\n        },\n        {\n            \"first\": 101,\n            \"second\": 34,\n            \"amount\": -1\n        },\n        {\n            \"first\": 101,\n            \"second\": 39,\n            \"amount\": -1\n        },\n        {\n            \"first\": 101,\n            \"second\": 118,\n            \"amount\": -1\n        },\n        {\n            \"first\": 101,\n            \"second\": 121,\n            \"amount\": -1\n        },\n        {\n            \"first\": 102,\n            \"second\": 34,\n            \"amount\": 1\n        },\n        {\n            \"first\": 102,\n            \"second\": 39,\n            \"amount\": 1\n        },\n        {\n            \"first\": 102,\n            \"second\": 41,\n            \"amount\": 1\n        },\n        {\n            \"first\": 102,\n            \"second\": 93,\n            \"amount\": 1\n        },\n        {\n            \"first\": 102,\n            \"second\": 99,\n            \"amount\": -1\n        },\n        {\n            \"first\": 102,\n            \"second\": 100,\n            \"amount\": -1\n        },\n        {\n            \"first\": 102,\n            \"second\": 101,\n            \"amount\": -1\n        },\n        {\n            \"first\": 102,\n            \"second\": 103,\n            \"amount\": -1\n        },\n        {\n            \"first\": 102,\n            \"second\": 113,\n            \"amount\": -1\n        },\n        {\n            \"first\": 102,\n            \"second\": 125,\n            \"amount\": 1\n        },\n        {\n            \"first\": 104,\n            \"second\": 34,\n            \"amount\": -4\n        },\n        {\n            \"first\": 104,\n            \"second\": 39,\n            \"amount\": -4\n        },\n        {\n            \"first\": 107,\n            \"second\": 99,\n            \"amount\": -1\n        },\n        {\n            \"first\": 107,\n            \"second\": 100,\n            \"amount\": -1\n        },\n        {\n            \"first\": 107,\n            \"second\": 101,\n            \"amount\": -1\n        },\n        {\n            \"first\": 107,\n            \"second\": 103,\n            \"amount\": -1\n        },\n        {\n            \"first\": 107,\n            \"second\": 113,\n            \"amount\": -1\n        },\n        {\n            \"first\": 109,\n            \"second\": 34,\n            \"amount\": -4\n        },\n        {\n            \"first\": 109,\n            \"second\": 39,\n            \"amount\": -4\n        },\n        {\n            \"first\": 110,\n            \"second\": 34,\n            \"amount\": -4\n        },\n        {\n            \"first\": 110,\n            \"second\": 39,\n            \"amount\": -4\n        },\n        {\n            \"first\": 111,\n            \"second\": 34,\n            \"amount\": -5\n        },\n        {\n            \"first\": 111,\n            \"second\": 39,\n            \"amount\": -5\n        },\n        {\n            \"first\": 111,\n            \"second\": 118,\n            \"amount\": -1\n        },\n        {\n            \"first\": 111,\n            \"second\": 120,\n            \"amount\": -1\n        },\n        {\n            \"first\": 111,\n            \"second\": 121,\n            \"amount\": -1\n        },\n        {\n            \"first\": 111,\n            \"second\": 122,\n            \"amount\": -1\n        },\n        {\n            \"first\": 112,\n            \"second\": 34,\n            \"amount\": -1\n        },\n        {\n            \"first\": 112,\n            \"second\": 39,\n            \"amount\": -1\n        },\n        {\n            \"first\": 112,\n            \"second\": 118,\n            \"amount\": 0\n        },\n        {\n            \"first\": 112,\n            \"second\": 120,\n            \"amount\": -1\n        },\n        {\n            \"first\": 112,\n            \"second\": 121,\n            \"amount\": 0\n        },\n        {\n            \"first\": 112,\n            \"second\": 122,\n            \"amount\": -1\n        },\n        {\n            \"first\": 114,\n            \"second\": 34,\n            \"amount\": 1\n        },\n        {\n            \"first\": 114,\n            \"second\": 39,\n            \"amount\": 1\n        },\n        {\n            \"first\": 114,\n            \"second\": 44,\n            \"amount\": -5\n        },\n        {\n            \"first\": 114,\n            \"second\": 46,\n            \"amount\": -5\n        },\n        {\n            \"first\": 114,\n            \"second\": 97,\n            \"amount\": -2\n        },\n        {\n            \"first\": 114,\n            \"second\": 99,\n            \"amount\": -1\n        },\n        {\n            \"first\": 114,\n            \"second\": 100,\n            \"amount\": -1\n        },\n        {\n            \"first\": 114,\n            \"second\": 101,\n            \"amount\": -1\n        },\n        {\n            \"first\": 114,\n            \"second\": 102,\n            \"amount\": 1\n        },\n        {\n            \"first\": 114,\n            \"second\": 103,\n            \"amount\": -1\n        },\n        {\n            \"first\": 114,\n            \"second\": 111,\n            \"amount\": -1\n        },\n        {\n            \"first\": 114,\n            \"second\": 113,\n            \"amount\": -1\n        },\n        {\n            \"first\": 114,\n            \"second\": 116,\n            \"amount\": 2\n        },\n        {\n            \"first\": 114,\n            \"second\": 118,\n            \"amount\": 1\n        },\n        {\n            \"first\": 114,\n            \"second\": 119,\n            \"amount\": 1\n        },\n        {\n            \"first\": 114,\n            \"second\": 121,\n            \"amount\": 1\n        },\n        {\n            \"first\": 116,\n            \"second\": 111,\n            \"amount\": -1\n        },\n        {\n            \"first\": 118,\n            \"second\": 34,\n            \"amount\": 1\n        },\n        {\n            \"first\": 118,\n            \"second\": 39,\n            \"amount\": 1\n        },\n        {\n            \"first\": 118,\n            \"second\": 44,\n            \"amount\": -4\n        },\n        {\n            \"first\": 118,\n            \"second\": 46,\n            \"amount\": -4\n        },\n        {\n            \"first\": 118,\n            \"second\": 97,\n            \"amount\": -1\n        },\n        {\n            \"first\": 118,\n            \"second\": 99,\n            \"amount\": -1\n        },\n        {\n            \"first\": 118,\n            \"second\": 100,\n            \"amount\": -1\n        },\n        {\n            \"first\": 118,\n            \"second\": 101,\n            \"amount\": -1\n        },\n        {\n            \"first\": 118,\n            \"second\": 102,\n            \"amount\": 1\n        },\n        {\n            \"first\": 118,\n            \"second\": 103,\n            \"amount\": -1\n        },\n        {\n            \"first\": 118,\n            \"second\": 111,\n            \"amount\": -1\n        },\n        {\n            \"first\": 118,\n            \"second\": 113,\n            \"amount\": -1\n        },\n        {\n            \"first\": 119,\n            \"second\": 44,\n            \"amount\": -5\n        },\n        {\n            \"first\": 119,\n            \"second\": 46,\n            \"amount\": -5\n        },\n        {\n            \"first\": 120,\n            \"second\": 99,\n            \"amount\": -1\n        },\n        {\n            \"first\": 120,\n            \"second\": 100,\n            \"amount\": -1\n        },\n        {\n            \"first\": 120,\n            \"second\": 101,\n            \"amount\": -1\n        },\n        {\n            \"first\": 120,\n            \"second\": 103,\n            \"amount\": -1\n        },\n        {\n            \"first\": 120,\n            \"second\": 111,\n            \"amount\": -1\n        },\n        {\n            \"first\": 120,\n            \"second\": 113,\n            \"amount\": -1\n        },\n        {\n            \"first\": 121,\n            \"second\": 34,\n            \"amount\": 1\n        },\n        {\n            \"first\": 121,\n            \"second\": 39,\n            \"amount\": 1\n        },\n        {\n            \"first\": 121,\n            \"second\": 44,\n            \"amount\": -4\n        },\n        {\n            \"first\": 121,\n            \"second\": 46,\n            \"amount\": -4\n        },\n        {\n            \"first\": 121,\n            \"second\": 97,\n            \"amount\": -1\n        },\n        {\n            \"first\": 121,\n            \"second\": 99,\n            \"amount\": -1\n        },\n        {\n            \"first\": 121,\n            \"second\": 100,\n            \"amount\": -1\n        },\n        {\n            \"first\": 121,\n            \"second\": 101,\n            \"amount\": -1\n        },\n        {\n            \"first\": 121,\n            \"second\": 102,\n            \"amount\": 1\n        },\n        {\n            \"first\": 121,\n            \"second\": 103,\n            \"amount\": -1\n        },\n        {\n            \"first\": 121,\n            \"second\": 111,\n            \"amount\": -1\n        },\n        {\n            \"first\": 121,\n            \"second\": 113,\n            \"amount\": -1\n        },\n        {\n            \"first\": 122,\n            \"second\": 99,\n            \"amount\": -1\n        },\n        {\n            \"first\": 122,\n            \"second\": 100,\n            \"amount\": -1\n        },\n        {\n            \"first\": 122,\n            \"second\": 101,\n            \"amount\": -1\n        },\n        {\n            \"first\": 122,\n            \"second\": 103,\n            \"amount\": -1\n        },\n        {\n            \"first\": 122,\n            \"second\": 111,\n            \"amount\": -1\n        },\n        {\n            \"first\": 122,\n            \"second\": 113,\n            \"amount\": -1\n        },\n        {\n            \"first\": 123,\n            \"second\": 74,\n            \"amount\": -1\n        },\n        {\n            \"first\": 123,\n            \"second\": 85,\n            \"amount\": -1\n        },\n        {\n            \"first\": 32,\n            \"second\": 84,\n            \"amount\": -2\n        }\n    ]\n}"
  },
  {
    "path": "examples/resources/fonts/typeface/LICENSE",
    "content": "Copyright @ 2004 by MAGENTA Ltd. All Rights Reserved.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of the fonts accompanying this license (\"Fonts\") and associated documentation files (the \"Font Software\"), to reproduce and distribute the Font Software, including without limitation the rights to use, copy, merge, publish, distribute, and/or sell copies of the Font Software, and to permit persons to whom the Font Software is furnished to do so, subject to the following conditions:\n\nThe above copyright and this permission notice shall be included in all copies of one or more of the Font Software typefaces.\n\nThe Font Software may be modified, altered, or added to, and in particular the designs of glyphs or characters in the Fonts may be modified and additional glyphs or characters may be added to the Fonts, only if the fonts are renamed to names not containing the word \"MgOpen\", or if the modifications are accepted for inclusion in the Font Software itself by the each appointed Administrator.\n\nThis License becomes null and void to the extent applicable to Fonts or Font Software that has been modified and is distributed under the \"MgOpen\" name.\n\nThe Font Software may be sold as part of a larger software package but no copy of one or more of the Font Software typefaces may be sold by itself.\n\nTHE FONT SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL MAGENTA OR PERSONS OR BODIES IN CHARGE OF ADMINISTRATION AND MAINTENANCE OF THE FONT SOFTWARE BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE.\n"
  },
  {
    "path": "examples/resources/fonts/typeface/README.md",
    "content": "## MgOpen typefaces\n\n# Source and License\n\nhttps://web.archive.org/web/20050528114140/https://ellak.gr/fonts/mgopen/index.en\n\n# Usage\n\nUse Facetype.js to generate typeface.json fonts: https://gero3.github.io/facetype.js/\n\nCollection of Google fonts as typeface data: https://github.com/components-ai/typefaces\n"
  },
  {
    "path": "examples/resources/fonts/typeface/helvetiker_bold.typeface.json",
    "content": "{\"glyphs\":{\"ο\":{\"x_min\":0,\"x_max\":764,\"ha\":863,\"o\":\"m 380 -25 q 105 87 211 -25 q 0 372 0 200 q 104 660 0 545 q 380 775 209 775 q 658 659 552 775 q 764 372 764 544 q 658 87 764 200 q 380 -25 552 -25 m 379 142 q 515 216 466 142 q 557 373 557 280 q 515 530 557 465 q 379 607 466 607 q 245 530 294 607 q 204 373 204 465 q 245 218 204 283 q 379 142 294 142 \"},\"S\":{\"x_min\":0,\"x_max\":826,\"ha\":915,\"o\":\"m 826 306 q 701 55 826 148 q 423 -29 587 -29 q 138 60 255 -29 q 0 318 13 154 l 208 318 q 288 192 216 238 q 437 152 352 152 q 559 181 506 152 q 623 282 623 217 q 466 411 623 372 q 176 487 197 478 q 18 719 18 557 q 136 958 18 869 q 399 1040 244 1040 q 670 956 561 1040 q 791 713 791 864 l 591 713 q 526 826 583 786 q 393 866 469 866 q 277 838 326 866 q 218 742 218 804 q 374 617 218 655 q 667 542 646 552 q 826 306 826 471 \"},\"¦\":{\"x_min\":0,\"x_max\":143,\"ha\":240,\"o\":\"m 143 462 l 0 462 l 0 984 l 143 984 l 143 462 m 143 -242 l 0 -242 l 0 280 l 143 280 l 143 -242 \"},\"/\":{\"x_min\":196.109375,\"x_max\":632.5625,\"ha\":828,\"o\":\"m 632 1040 l 289 -128 l 196 -128 l 538 1040 l 632 1040 \"},\"Τ\":{\"x_min\":-0.609375,\"x_max\":808,\"ha\":878,\"o\":\"m 808 831 l 508 831 l 508 0 l 298 0 l 298 831 l 0 831 l 0 1013 l 808 1013 l 808 831 \"},\"y\":{\"x_min\":0,\"x_max\":738.890625,\"ha\":828,\"o\":\"m 738 749 l 444 -107 q 361 -238 413 -199 q 213 -277 308 -277 q 156 -275 176 -277 q 120 -271 131 -271 l 120 -110 q 147 -113 134 -111 q 179 -116 161 -116 q 247 -91 226 -116 q 269 -17 269 -67 q 206 173 269 -4 q 84 515 162 301 q 0 749 41 632 l 218 749 l 376 207 l 529 749 l 738 749 \"},\"Π\":{\"x_min\":0,\"x_max\":809,\"ha\":922,\"o\":\"m 809 0 l 598 0 l 598 836 l 208 836 l 208 0 l 0 0 l 0 1012 l 809 1012 l 809 0 \"},\"ΐ\":{\"x_min\":-162,\"x_max\":364,\"ha\":364,\"o\":\"m 364 810 l 235 810 l 235 952 l 364 952 l 364 810 m 301 1064 l 86 810 l -12 810 l 123 1064 l 301 1064 m -33 810 l -162 810 l -162 952 l -33 952 l -33 810 m 200 0 l 0 0 l 0 748 l 200 748 l 200 0 \"},\"g\":{\"x_min\":0,\"x_max\":724,\"ha\":839,\"o\":\"m 724 48 q 637 -223 724 -142 q 357 -304 551 -304 q 140 -253 226 -304 q 23 -72 36 -192 l 243 -72 q 290 -127 255 -110 q 368 -144 324 -144 q 504 -82 470 -144 q 530 71 530 -38 l 530 105 q 441 25 496 51 q 319 0 386 0 q 79 115 166 0 q 0 377 0 219 q 77 647 0 534 q 317 775 166 775 q 534 656 456 775 l 534 748 l 724 748 l 724 48 m 368 167 q 492 237 447 167 q 530 382 530 297 q 490 529 530 466 q 364 603 444 603 q 240 532 284 603 q 201 386 201 471 q 240 239 201 300 q 368 167 286 167 \"},\"²\":{\"x_min\":0,\"x_max\":463,\"ha\":560,\"o\":\"m 463 791 q 365 627 463 706 q 151 483 258 555 l 455 483 l 455 382 l 0 382 q 84 565 0 488 q 244 672 97 576 q 331 784 331 727 q 299 850 331 824 q 228 876 268 876 q 159 848 187 876 q 132 762 132 820 l 10 762 q 78 924 10 866 q 228 976 137 976 q 392 925 322 976 q 463 791 463 874 \"},\"–\":{\"x_min\":0,\"x_max\":704.171875,\"ha\":801,\"o\":\"m 704 297 l 0 297 l 0 450 l 704 450 l 704 297 \"},\"Κ\":{\"x_min\":0,\"x_max\":899.671875,\"ha\":969,\"o\":\"m 899 0 l 646 0 l 316 462 l 208 355 l 208 0 l 0 0 l 0 1013 l 208 1013 l 208 596 l 603 1013 l 863 1013 l 460 603 l 899 0 \"},\"ƒ\":{\"x_min\":-46,\"x_max\":440,\"ha\":525,\"o\":\"m 440 609 l 316 609 l 149 -277 l -46 -277 l 121 609 l 14 609 l 14 749 l 121 749 q 159 949 121 894 q 344 1019 208 1019 l 440 1015 l 440 855 l 377 855 q 326 841 338 855 q 314 797 314 827 q 314 773 314 786 q 314 749 314 761 l 440 749 l 440 609 \"},\"e\":{\"x_min\":0,\"x_max\":708,\"ha\":808,\"o\":\"m 708 321 l 207 321 q 254 186 207 236 q 362 141 298 141 q 501 227 453 141 l 700 227 q 566 36 662 104 q 362 -26 477 -26 q 112 72 213 -26 q 0 369 0 182 q 95 683 0 573 q 358 793 191 793 q 619 677 531 793 q 708 321 708 561 m 501 453 q 460 571 501 531 q 353 612 420 612 q 247 570 287 612 q 207 453 207 529 l 501 453 \"},\"ό\":{\"x_min\":0,\"x_max\":764,\"ha\":863,\"o\":\"m 380 -25 q 105 87 211 -25 q 0 372 0 200 q 104 660 0 545 q 380 775 209 775 q 658 659 552 775 q 764 372 764 544 q 658 87 764 200 q 380 -25 552 -25 m 379 142 q 515 216 466 142 q 557 373 557 280 q 515 530 557 465 q 379 607 466 607 q 245 530 294 607 q 204 373 204 465 q 245 218 204 283 q 379 142 294 142 m 593 1039 l 391 823 l 293 823 l 415 1039 l 593 1039 \"},\"J\":{\"x_min\":0,\"x_max\":649,\"ha\":760,\"o\":\"m 649 294 q 573 48 649 125 q 327 -29 497 -29 q 61 82 136 -29 q 0 375 0 173 l 200 375 l 199 309 q 219 194 199 230 q 321 145 249 145 q 418 193 390 145 q 441 307 441 232 l 441 1013 l 649 1013 l 649 294 \"},\"»\":{\"x_min\":-0.234375,\"x_max\":526,\"ha\":624,\"o\":\"m 526 286 l 297 87 l 296 250 l 437 373 l 297 495 l 297 660 l 526 461 l 526 286 m 229 286 l 0 87 l 0 250 l 140 373 l 0 495 l 0 660 l 229 461 l 229 286 \"},\"©\":{\"x_min\":3,\"x_max\":1007,\"ha\":1104,\"o\":\"m 507 -6 q 129 153 269 -6 q 3 506 3 298 q 127 857 3 713 q 502 1017 266 1017 q 880 855 740 1017 q 1007 502 1007 711 q 882 152 1007 295 q 507 -6 743 -6 m 502 934 q 184 800 302 934 q 79 505 79 680 q 184 210 79 331 q 501 76 302 76 q 819 210 701 76 q 925 507 925 331 q 820 800 925 682 q 502 934 704 934 m 758 410 q 676 255 748 313 q 506 197 605 197 q 298 291 374 197 q 229 499 229 377 q 297 713 229 624 q 494 811 372 811 q 666 760 593 811 q 752 616 739 710 l 621 616 q 587 688 621 658 q 509 719 554 719 q 404 658 441 719 q 368 511 368 598 q 403 362 368 427 q 498 298 438 298 q 624 410 606 298 l 758 410 \"},\"ώ\":{\"x_min\":0,\"x_max\":945,\"ha\":1051,\"o\":\"m 566 528 l 372 528 l 372 323 q 372 298 372 311 q 373 271 372 285 q 360 183 373 211 q 292 142 342 142 q 219 222 243 142 q 203 365 203 279 q 241 565 203 461 q 334 748 273 650 l 130 748 q 36 552 68 650 q 0 337 0 444 q 69 96 0 204 q 276 -29 149 -29 q 390 0 337 -29 q 470 78 444 28 q 551 0 495 30 q 668 -29 608 -29 q 874 96 793 -29 q 945 337 945 205 q 910 547 945 444 q 814 748 876 650 l 610 748 q 703 565 671 650 q 742 365 742 462 q 718 189 742 237 q 651 142 694 142 q 577 190 597 142 q 565 289 565 221 l 565 323 l 566 528 m 718 1039 l 516 823 l 417 823 l 540 1039 l 718 1039 \"},\"^\":{\"x_min\":197.21875,\"x_max\":630.5625,\"ha\":828,\"o\":\"m 630 836 l 536 836 l 413 987 l 294 836 l 197 836 l 331 1090 l 493 1090 l 630 836 \"},\"«\":{\"x_min\":0,\"x_max\":526.546875,\"ha\":624,\"o\":\"m 526 87 l 297 286 l 297 461 l 526 660 l 526 495 l 385 373 l 526 250 l 526 87 m 229 87 l 0 286 l 0 461 l 229 660 l 229 495 l 88 373 l 229 250 l 229 87 \"},\"D\":{\"x_min\":0,\"x_max\":864,\"ha\":968,\"o\":\"m 400 1013 q 736 874 608 1013 q 864 523 864 735 q 717 146 864 293 q 340 0 570 0 l 0 0 l 0 1013 l 400 1013 m 398 837 l 206 837 l 206 182 l 372 182 q 584 276 507 182 q 657 504 657 365 q 594 727 657 632 q 398 837 522 837 \"},\"∙\":{\"x_min\":0,\"x_max\":207,\"ha\":304,\"o\":\"m 207 528 l 0 528 l 0 735 l 207 735 l 207 528 \"},\"ÿ\":{\"x_min\":0,\"x_max\":47,\"ha\":125,\"o\":\"m 47 3 q 37 -7 47 -7 q 28 0 30 -7 q 39 -4 32 -4 q 45 3 45 -1 l 37 0 q 28 9 28 0 q 39 19 28 19 l 47 16 l 47 19 l 47 3 m 37 1 q 44 8 44 1 q 37 16 44 16 q 30 8 30 16 q 37 1 30 1 m 26 1 l 23 22 l 14 0 l 3 22 l 3 3 l 0 25 l 13 1 l 22 25 l 26 1 \"},\"w\":{\"x_min\":0,\"x_max\":1056.953125,\"ha\":1150,\"o\":\"m 1056 749 l 848 0 l 647 0 l 527 536 l 412 0 l 211 0 l 0 749 l 202 749 l 325 226 l 429 748 l 633 748 l 740 229 l 864 749 l 1056 749 \"},\"$\":{\"x_min\":0,\"x_max\":704,\"ha\":800,\"o\":\"m 682 693 l 495 693 q 468 782 491 749 q 391 831 441 824 l 391 579 q 633 462 562 534 q 704 259 704 389 q 616 57 704 136 q 391 -22 528 -22 l 391 -156 l 308 -156 l 308 -22 q 76 69 152 -7 q 0 300 0 147 l 183 300 q 215 191 190 230 q 308 128 245 143 l 308 414 q 84 505 157 432 q 12 700 12 578 q 89 902 12 824 q 308 981 166 981 l 308 1069 l 391 1069 l 391 981 q 595 905 521 981 q 682 693 670 829 m 308 599 l 308 831 q 228 796 256 831 q 200 712 200 762 q 225 642 200 668 q 308 599 251 617 m 391 128 q 476 174 449 140 q 504 258 504 207 q 391 388 504 354 l 391 128 \"},\"\\\\\":{\"x_min\":-0.03125,\"x_max\":434.765625,\"ha\":532,\"o\":\"m 434 -128 l 341 -128 l 0 1039 l 91 1040 l 434 -128 \"},\"µ\":{\"x_min\":0,\"x_max\":647,\"ha\":754,\"o\":\"m 647 0 l 478 0 l 478 68 q 412 9 448 30 q 330 -11 375 -11 q 261 3 296 -11 q 199 43 226 18 l 199 -277 l 0 -277 l 0 749 l 199 749 l 199 358 q 216 221 199 267 q 322 151 244 151 q 435 240 410 151 q 448 401 448 283 l 448 749 l 647 749 l 647 0 \"},\"Ι\":{\"x_min\":42,\"x_max\":250,\"ha\":413,\"o\":\"m 250 0 l 42 0 l 42 1013 l 250 1013 l 250 0 \"},\"Ύ\":{\"x_min\":0,\"x_max\":1211.15625,\"ha\":1289,\"o\":\"m 1211 1012 l 907 376 l 907 0 l 697 0 l 697 376 l 374 1012 l 583 1012 l 802 576 l 1001 1012 l 1211 1012 m 313 1035 l 98 780 l 0 780 l 136 1035 l 313 1035 \"},\"’\":{\"x_min\":0,\"x_max\":192,\"ha\":289,\"o\":\"m 192 834 q 137 692 192 751 q 0 626 83 634 l 0 697 q 101 831 101 723 l 0 831 l 0 1013 l 192 1013 l 192 834 \"},\"Ν\":{\"x_min\":0,\"x_max\":833,\"ha\":946,\"o\":\"m 833 0 l 617 0 l 206 696 l 206 0 l 0 0 l 0 1013 l 216 1013 l 629 315 l 629 1013 l 833 1013 l 833 0 \"},\"-\":{\"x_min\":27.78125,\"x_max\":413.890625,\"ha\":525,\"o\":\"m 413 279 l 27 279 l 27 468 l 413 468 l 413 279 \"},\"Q\":{\"x_min\":0,\"x_max\":995.59375,\"ha\":1096,\"o\":\"m 995 49 l 885 -70 l 762 42 q 641 -12 709 4 q 497 -29 572 -29 q 135 123 271 -29 q 0 504 0 276 q 131 881 0 731 q 497 1040 270 1040 q 859 883 719 1040 q 994 506 994 731 q 966 321 994 413 q 884 152 938 229 l 995 49 m 730 299 q 767 395 755 344 q 779 504 779 446 q 713 743 779 644 q 505 857 638 857 q 284 745 366 857 q 210 501 210 644 q 279 265 210 361 q 492 157 357 157 q 615 181 557 157 l 508 287 l 620 405 l 730 299 \"},\"ς\":{\"x_min\":0,\"x_max\":731.78125,\"ha\":768,\"o\":\"m 731 448 l 547 448 q 485 571 531 533 q 369 610 440 610 q 245 537 292 610 q 204 394 204 473 q 322 186 204 238 q 540 133 430 159 q 659 -15 659 98 q 643 -141 659 -80 q 595 -278 627 -202 l 423 -278 q 458 -186 448 -215 q 474 -88 474 -133 q 352 0 474 -27 q 123 80 181 38 q 0 382 0 170 q 98 660 0 549 q 367 777 202 777 q 622 683 513 777 q 731 448 731 589 \"},\"M\":{\"x_min\":0,\"x_max\":1019,\"ha\":1135,\"o\":\"m 1019 0 l 823 0 l 823 819 l 618 0 l 402 0 l 194 818 l 194 0 l 0 0 l 0 1013 l 309 1012 l 510 241 l 707 1013 l 1019 1013 l 1019 0 \"},\"Ψ\":{\"x_min\":0,\"x_max\":995,\"ha\":1085,\"o\":\"m 995 698 q 924 340 995 437 q 590 200 841 227 l 590 0 l 404 0 l 404 200 q 70 340 152 227 q 0 698 0 437 l 0 1013 l 188 1013 l 188 694 q 212 472 188 525 q 404 383 254 383 l 404 1013 l 590 1013 l 590 383 q 781 472 740 383 q 807 694 807 525 l 807 1013 l 995 1013 l 995 698 \"},\"C\":{\"x_min\":0,\"x_max\":970.828125,\"ha\":1043,\"o\":\"m 970 345 q 802 70 933 169 q 490 -29 672 -29 q 130 130 268 -29 q 0 506 0 281 q 134 885 0 737 q 502 1040 275 1040 q 802 939 668 1040 q 965 679 936 838 l 745 679 q 649 809 716 761 q 495 857 582 857 q 283 747 361 857 q 214 508 214 648 q 282 267 214 367 q 493 154 359 154 q 651 204 584 154 q 752 345 718 255 l 970 345 \"},\"!\":{\"x_min\":0,\"x_max\":204,\"ha\":307,\"o\":\"m 204 739 q 182 515 204 686 q 152 282 167 398 l 52 282 q 13 589 27 473 q 0 739 0 704 l 0 1013 l 204 1013 l 204 739 m 204 0 l 0 0 l 0 203 l 204 203 l 204 0 \"},\"{\":{\"x_min\":0,\"x_max\":501.390625,\"ha\":599,\"o\":\"m 501 -285 q 229 -209 301 -285 q 176 -35 176 -155 q 182 47 176 -8 q 189 126 189 103 q 156 245 189 209 q 0 294 112 294 l 0 438 q 154 485 111 438 q 189 603 189 522 q 186 666 189 636 q 176 783 176 772 q 231 945 176 894 q 501 1015 306 1015 l 501 872 q 370 833 408 872 q 340 737 340 801 q 342 677 340 705 q 353 569 353 579 q 326 451 353 496 q 207 366 291 393 q 327 289 294 346 q 353 164 353 246 q 348 79 353 132 q 344 17 344 26 q 372 -95 344 -58 q 501 -141 408 -141 l 501 -285 \"},\"X\":{\"x_min\":0,\"x_max\":894.453125,\"ha\":999,\"o\":\"m 894 0 l 654 0 l 445 351 l 238 0 l 0 0 l 316 516 l 0 1013 l 238 1013 l 445 659 l 652 1013 l 894 1013 l 577 519 l 894 0 \"},\"#\":{\"x_min\":0,\"x_max\":1019.453125,\"ha\":1117,\"o\":\"m 1019 722 l 969 582 l 776 581 l 717 417 l 919 417 l 868 279 l 668 278 l 566 -6 l 413 -5 l 516 279 l 348 279 l 247 -6 l 94 -6 l 196 278 l 0 279 l 49 417 l 245 417 l 304 581 l 98 582 l 150 722 l 354 721 l 455 1006 l 606 1006 l 507 721 l 673 722 l 776 1006 l 927 1006 l 826 721 l 1019 722 m 627 581 l 454 581 l 394 417 l 567 417 l 627 581 \"},\"ι\":{\"x_min\":42,\"x_max\":242,\"ha\":389,\"o\":\"m 242 0 l 42 0 l 42 749 l 242 749 l 242 0 \"},\"Ά\":{\"x_min\":0,\"x_max\":995.828125,\"ha\":1072,\"o\":\"m 313 1035 l 98 780 l 0 780 l 136 1035 l 313 1035 m 995 0 l 776 0 l 708 208 l 315 208 l 247 0 l 29 0 l 390 1012 l 629 1012 l 995 0 m 652 376 l 509 809 l 369 376 l 652 376 \"},\")\":{\"x_min\":0,\"x_max\":389,\"ha\":486,\"o\":\"m 389 357 q 319 14 389 187 q 145 -293 259 -134 l 0 -293 q 139 22 90 -142 q 189 358 189 187 q 139 689 189 525 q 0 1013 90 853 l 145 1013 q 319 703 258 857 q 389 357 389 528 \"},\"ε\":{\"x_min\":16.671875,\"x_max\":652.78125,\"ha\":742,\"o\":\"m 652 259 q 565 49 652 123 q 340 -25 479 -25 q 102 39 188 -25 q 16 197 16 104 q 45 299 16 249 q 134 390 75 348 q 58 456 86 419 q 25 552 25 502 q 120 717 25 653 q 322 776 208 776 q 537 710 456 776 q 625 508 625 639 l 445 508 q 415 585 445 563 q 327 608 386 608 q 254 590 293 608 q 215 544 215 573 q 252 469 215 490 q 336 453 280 453 q 369 455 347 453 q 400 456 391 456 l 400 308 l 329 308 q 247 291 280 308 q 204 223 204 269 q 255 154 204 172 q 345 143 286 143 q 426 174 398 143 q 454 259 454 206 l 652 259 \"},\"Δ\":{\"x_min\":0,\"x_max\":981.953125,\"ha\":1057,\"o\":\"m 981 0 l 0 0 l 386 1013 l 594 1013 l 981 0 m 715 175 l 490 765 l 266 175 l 715 175 \"},\"}\":{\"x_min\":0,\"x_max\":500,\"ha\":597,\"o\":\"m 500 294 q 348 246 390 294 q 315 128 315 209 q 320 42 315 101 q 326 -48 326 -17 q 270 -214 326 -161 q 0 -285 196 -285 l 0 -141 q 126 -97 90 -141 q 154 8 154 -64 q 150 91 154 37 q 146 157 146 145 q 172 281 146 235 q 294 366 206 339 q 173 451 208 390 q 146 576 146 500 q 150 655 146 603 q 154 731 154 708 q 126 831 154 799 q 0 872 90 872 l 0 1015 q 270 944 196 1015 q 326 777 326 891 q 322 707 326 747 q 313 593 313 612 q 347 482 313 518 q 500 438 390 438 l 500 294 \"},\"‰\":{\"x_min\":0,\"x_max\":1681,\"ha\":1775,\"o\":\"m 861 484 q 1048 404 979 484 q 1111 228 1111 332 q 1048 51 1111 123 q 859 -29 979 -29 q 672 50 740 -29 q 610 227 610 122 q 672 403 610 331 q 861 484 741 484 m 861 120 q 939 151 911 120 q 967 226 967 183 q 942 299 967 270 q 861 333 912 333 q 783 301 811 333 q 756 226 756 269 q 783 151 756 182 q 861 120 810 120 m 904 984 l 316 -28 l 205 -29 l 793 983 l 904 984 m 250 984 q 436 904 366 984 q 499 730 499 832 q 436 552 499 626 q 248 472 366 472 q 62 552 132 472 q 0 728 0 624 q 62 903 0 831 q 250 984 132 984 m 249 835 q 169 801 198 835 q 140 725 140 768 q 167 652 140 683 q 247 621 195 621 q 327 654 298 621 q 357 730 357 687 q 329 803 357 772 q 249 835 301 835 m 1430 484 q 1618 404 1548 484 q 1681 228 1681 332 q 1618 51 1681 123 q 1429 -29 1548 -29 q 1241 50 1309 -29 q 1179 227 1179 122 q 1241 403 1179 331 q 1430 484 1311 484 m 1431 120 q 1509 151 1481 120 q 1537 226 1537 183 q 1511 299 1537 270 q 1431 333 1482 333 q 1352 301 1380 333 q 1325 226 1325 269 q 1352 151 1325 182 q 1431 120 1379 120 \"},\"a\":{\"x_min\":0,\"x_max\":700,\"ha\":786,\"o\":\"m 700 0 l 488 0 q 465 93 469 45 q 365 5 427 37 q 233 -26 303 -26 q 65 37 130 -26 q 0 205 0 101 q 120 409 0 355 q 343 452 168 431 q 465 522 465 468 q 424 588 465 565 q 337 611 384 611 q 250 581 285 611 q 215 503 215 552 l 26 503 q 113 707 26 633 q 328 775 194 775 q 538 723 444 775 q 657 554 657 659 l 657 137 q 666 73 657 101 q 700 33 675 45 l 700 0 m 465 297 l 465 367 q 299 322 358 340 q 193 217 193 287 q 223 150 193 174 q 298 127 254 127 q 417 175 370 127 q 465 297 465 224 \"},\"—\":{\"x_min\":0,\"x_max\":941.671875,\"ha\":1039,\"o\":\"m 941 297 l 0 297 l 0 450 l 941 450 l 941 297 \"},\"=\":{\"x_min\":29.171875,\"x_max\":798.609375,\"ha\":828,\"o\":\"m 798 502 l 29 502 l 29 635 l 798 635 l 798 502 m 798 204 l 29 204 l 29 339 l 798 339 l 798 204 \"},\"N\":{\"x_min\":0,\"x_max\":833,\"ha\":949,\"o\":\"m 833 0 l 617 0 l 206 695 l 206 0 l 0 0 l 0 1013 l 216 1013 l 629 315 l 629 1013 l 833 1013 l 833 0 \"},\"ρ\":{\"x_min\":0,\"x_max\":722,\"ha\":810,\"o\":\"m 364 -17 q 271 0 313 -17 q 194 48 230 16 l 194 -278 l 0 -278 l 0 370 q 87 656 0 548 q 358 775 183 775 q 626 655 524 775 q 722 372 722 541 q 621 95 722 208 q 364 -17 520 -17 m 360 607 q 237 529 280 607 q 201 377 201 463 q 234 229 201 292 q 355 147 277 147 q 467 210 419 147 q 515 374 515 273 q 471 537 515 468 q 360 607 428 607 \"},\"2\":{\"x_min\":64,\"x_max\":764,\"ha\":828,\"o\":\"m 764 685 q 675 452 764 541 q 484 325 637 415 q 307 168 357 250 l 754 168 l 754 0 l 64 0 q 193 301 64 175 q 433 480 202 311 q 564 673 564 576 q 519 780 564 737 q 416 824 475 824 q 318 780 358 824 q 262 633 270 730 l 80 633 q 184 903 80 807 q 415 988 276 988 q 654 907 552 988 q 764 685 764 819 \"},\"¯\":{\"x_min\":0,\"x_max\":775,\"ha\":771,\"o\":\"m 775 958 l 0 958 l 0 1111 l 775 1111 l 775 958 \"},\"Z\":{\"x_min\":0,\"x_max\":804.171875,\"ha\":906,\"o\":\"m 804 836 l 251 182 l 793 182 l 793 0 l 0 0 l 0 176 l 551 830 l 11 830 l 11 1013 l 804 1013 l 804 836 \"},\"u\":{\"x_min\":0,\"x_max\":668,\"ha\":782,\"o\":\"m 668 0 l 474 0 l 474 89 q 363 9 425 37 q 233 -19 301 -19 q 61 53 123 -19 q 0 239 0 126 l 0 749 l 199 749 l 199 296 q 225 193 199 233 q 316 146 257 146 q 424 193 380 146 q 469 304 469 240 l 469 749 l 668 749 l 668 0 \"},\"k\":{\"x_min\":0,\"x_max\":688.890625,\"ha\":771,\"o\":\"m 688 0 l 450 0 l 270 316 l 196 237 l 196 0 l 0 0 l 0 1013 l 196 1013 l 196 483 l 433 748 l 675 748 l 413 469 l 688 0 \"},\"Η\":{\"x_min\":0,\"x_max\":837,\"ha\":950,\"o\":\"m 837 0 l 627 0 l 627 450 l 210 450 l 210 0 l 0 0 l 0 1013 l 210 1013 l 210 635 l 627 635 l 627 1013 l 837 1013 l 837 0 \"},\"Α\":{\"x_min\":0,\"x_max\":966.671875,\"ha\":1043,\"o\":\"m 966 0 l 747 0 l 679 208 l 286 208 l 218 0 l 0 0 l 361 1013 l 600 1013 l 966 0 m 623 376 l 480 809 l 340 376 l 623 376 \"},\"s\":{\"x_min\":0,\"x_max\":681,\"ha\":775,\"o\":\"m 681 229 q 568 33 681 105 q 340 -29 471 -29 q 107 39 202 -29 q 0 245 0 114 l 201 245 q 252 155 201 189 q 358 128 295 128 q 436 144 401 128 q 482 205 482 166 q 363 284 482 255 q 143 348 181 329 q 25 533 25 408 q 129 716 25 647 q 340 778 220 778 q 554 710 465 778 q 658 522 643 643 l 463 522 q 419 596 458 570 q 327 622 380 622 q 255 606 290 622 q 221 556 221 590 q 339 473 221 506 q 561 404 528 420 q 681 229 681 344 \"},\"B\":{\"x_min\":0,\"x_max\":835,\"ha\":938,\"o\":\"m 674 547 q 791 450 747 518 q 835 304 835 383 q 718 75 835 158 q 461 0 612 0 l 0 0 l 0 1013 l 477 1013 q 697 951 609 1013 q 797 754 797 880 q 765 630 797 686 q 674 547 734 575 m 438 621 q 538 646 495 621 q 590 730 590 676 q 537 814 590 785 q 436 838 494 838 l 199 838 l 199 621 l 438 621 m 445 182 q 561 211 513 182 q 618 311 618 247 q 565 410 618 375 q 444 446 512 446 l 199 446 l 199 182 l 445 182 \"},\"…\":{\"x_min\":0,\"x_max\":819,\"ha\":963,\"o\":\"m 206 0 l 0 0 l 0 207 l 206 207 l 206 0 m 512 0 l 306 0 l 306 207 l 512 207 l 512 0 m 819 0 l 613 0 l 613 207 l 819 207 l 819 0 \"},\"?\":{\"x_min\":1,\"x_max\":687,\"ha\":785,\"o\":\"m 687 734 q 621 563 687 634 q 501 454 560 508 q 436 293 436 386 l 251 293 l 251 391 q 363 557 251 462 q 476 724 476 653 q 432 827 476 788 q 332 866 389 866 q 238 827 275 866 q 195 699 195 781 l 1 699 q 110 955 1 861 q 352 1040 210 1040 q 582 963 489 1040 q 687 734 687 878 m 446 0 l 243 0 l 243 203 l 446 203 l 446 0 \"},\"H\":{\"x_min\":0,\"x_max\":838,\"ha\":953,\"o\":\"m 838 0 l 628 0 l 628 450 l 210 450 l 210 0 l 0 0 l 0 1013 l 210 1013 l 210 635 l 628 635 l 628 1013 l 838 1013 l 838 0 \"},\"ν\":{\"x_min\":0,\"x_max\":740.28125,\"ha\":828,\"o\":\"m 740 749 l 473 0 l 266 0 l 0 749 l 222 749 l 373 211 l 529 749 l 740 749 \"},\"c\":{\"x_min\":0,\"x_max\":751.390625,\"ha\":828,\"o\":\"m 751 282 q 625 58 725 142 q 384 -26 526 -26 q 107 84 215 -26 q 0 366 0 195 q 98 651 0 536 q 370 774 204 774 q 616 700 518 774 q 751 486 715 626 l 536 486 q 477 570 516 538 q 380 607 434 607 q 248 533 298 607 q 204 378 204 466 q 242 219 204 285 q 377 139 290 139 q 483 179 438 139 q 543 282 527 220 l 751 282 \"},\"¶\":{\"x_min\":0,\"x_max\":566.671875,\"ha\":678,\"o\":\"m 21 892 l 52 892 l 98 761 l 145 892 l 176 892 l 178 741 l 157 741 l 157 867 l 108 741 l 88 741 l 40 871 l 40 741 l 21 741 l 21 892 m 308 854 l 308 731 q 252 691 308 691 q 227 691 240 691 q 207 696 213 695 l 207 712 l 253 706 q 288 733 288 706 l 288 763 q 244 741 279 741 q 193 797 193 741 q 261 860 193 860 q 287 860 273 860 q 308 854 302 855 m 288 842 l 263 843 q 213 796 213 843 q 248 756 213 756 q 288 796 288 756 l 288 842 m 566 988 l 502 988 l 502 -1 l 439 -1 l 439 988 l 317 988 l 317 -1 l 252 -1 l 252 602 q 81 653 155 602 q 0 805 0 711 q 101 989 0 918 q 309 1053 194 1053 l 566 1053 l 566 988 \"},\"β\":{\"x_min\":0,\"x_max\":703,\"ha\":789,\"o\":\"m 510 539 q 651 429 600 501 q 703 262 703 357 q 617 53 703 136 q 404 -29 532 -29 q 199 51 279 -29 l 199 -278 l 0 -278 l 0 627 q 77 911 0 812 q 343 1021 163 1021 q 551 957 464 1021 q 649 769 649 886 q 613 638 649 697 q 510 539 577 579 m 344 136 q 452 181 408 136 q 497 291 497 227 q 435 409 497 369 q 299 444 381 444 l 299 600 q 407 634 363 600 q 452 731 452 669 q 417 820 452 784 q 329 857 382 857 q 217 775 246 857 q 199 622 199 725 l 199 393 q 221 226 199 284 q 344 136 254 136 \"},\"Μ\":{\"x_min\":0,\"x_max\":1019,\"ha\":1132,\"o\":\"m 1019 0 l 823 0 l 823 818 l 617 0 l 402 0 l 194 818 l 194 0 l 0 0 l 0 1013 l 309 1013 l 509 241 l 708 1013 l 1019 1013 l 1019 0 \"},\"Ό\":{\"x_min\":0.15625,\"x_max\":1174,\"ha\":1271,\"o\":\"m 676 -29 q 312 127 451 -29 q 179 505 179 277 q 311 883 179 733 q 676 1040 449 1040 q 1040 883 901 1040 q 1174 505 1174 733 q 1041 127 1174 277 q 676 -29 903 -29 m 676 154 q 890 266 811 154 q 961 506 961 366 q 891 745 961 648 q 676 857 812 857 q 462 747 541 857 q 392 506 392 648 q 461 266 392 365 q 676 154 540 154 m 314 1034 l 98 779 l 0 779 l 136 1034 l 314 1034 \"},\"Ή\":{\"x_min\":0,\"x_max\":1248,\"ha\":1361,\"o\":\"m 1248 0 l 1038 0 l 1038 450 l 621 450 l 621 0 l 411 0 l 411 1012 l 621 1012 l 621 635 l 1038 635 l 1038 1012 l 1248 1012 l 1248 0 m 313 1035 l 98 780 l 0 780 l 136 1035 l 313 1035 \"},\"•\":{\"x_min\":-27.78125,\"x_max\":691.671875,\"ha\":775,\"o\":\"m 691 508 q 588 252 691 358 q 331 147 486 147 q 77 251 183 147 q -27 508 -27 355 q 75 761 -27 655 q 331 868 179 868 q 585 763 479 868 q 691 508 691 658 \"},\"¥\":{\"x_min\":0,\"x_max\":836,\"ha\":931,\"o\":\"m 195 625 l 0 1013 l 208 1013 l 427 576 l 626 1013 l 836 1013 l 650 625 l 777 625 l 777 472 l 578 472 l 538 389 l 777 389 l 777 236 l 532 236 l 532 0 l 322 0 l 322 236 l 79 236 l 79 389 l 315 389 l 273 472 l 79 472 l 79 625 l 195 625 \"},\"(\":{\"x_min\":0,\"x_max\":388.890625,\"ha\":486,\"o\":\"m 388 -293 l 243 -293 q 70 14 130 -134 q 0 357 0 189 q 69 703 0 526 q 243 1013 129 856 l 388 1013 q 248 695 297 860 q 200 358 200 530 q 248 24 200 187 q 388 -293 297 -138 \"},\"U\":{\"x_min\":0,\"x_max\":813,\"ha\":926,\"o\":\"m 813 362 q 697 79 813 187 q 405 -29 582 -29 q 114 78 229 -29 q 0 362 0 186 l 0 1013 l 210 1013 l 210 387 q 260 226 210 291 q 408 154 315 154 q 554 226 500 154 q 603 387 603 291 l 603 1013 l 813 1013 l 813 362 \"},\"γ\":{\"x_min\":0.0625,\"x_max\":729.234375,\"ha\":815,\"o\":\"m 729 749 l 457 37 l 457 -278 l 257 -278 l 257 37 q 218 155 243 95 q 170 275 194 215 l 0 749 l 207 749 l 363 284 l 522 749 l 729 749 \"},\"α\":{\"x_min\":-1,\"x_max\":722,\"ha\":835,\"o\":\"m 722 0 l 531 0 l 530 101 q 433 8 491 41 q 304 -25 375 -25 q 72 104 157 -25 q -1 372 -1 216 q 72 643 -1 530 q 308 775 158 775 q 433 744 375 775 q 528 656 491 713 l 528 749 l 722 749 l 722 0 m 361 601 q 233 527 277 601 q 196 375 196 464 q 232 224 196 288 q 358 144 277 144 q 487 217 441 144 q 528 370 528 281 q 489 523 528 457 q 361 601 443 601 \"},\"F\":{\"x_min\":0,\"x_max\":706.953125,\"ha\":778,\"o\":\"m 706 837 l 206 837 l 206 606 l 645 606 l 645 431 l 206 431 l 206 0 l 0 0 l 0 1013 l 706 1013 l 706 837 \"},\"­\":{\"x_min\":0,\"x_max\":704.171875,\"ha\":801,\"o\":\"m 704 297 l 0 297 l 0 450 l 704 450 l 704 297 \"},\":\":{\"x_min\":0,\"x_max\":207,\"ha\":304,\"o\":\"m 207 528 l 0 528 l 0 735 l 207 735 l 207 528 m 207 0 l 0 0 l 0 207 l 207 207 l 207 0 \"},\"Χ\":{\"x_min\":0,\"x_max\":894.453125,\"ha\":978,\"o\":\"m 894 0 l 654 0 l 445 351 l 238 0 l 0 0 l 316 516 l 0 1013 l 238 1013 l 445 660 l 652 1013 l 894 1013 l 577 519 l 894 0 \"},\"*\":{\"x_min\":115,\"x_max\":713,\"ha\":828,\"o\":\"m 713 740 l 518 688 l 651 525 l 531 438 l 412 612 l 290 439 l 173 523 l 308 688 l 115 741 l 159 880 l 342 816 l 343 1013 l 482 1013 l 481 816 l 664 880 l 713 740 \"},\"†\":{\"x_min\":0,\"x_max\":809,\"ha\":894,\"o\":\"m 509 804 l 809 804 l 809 621 l 509 621 l 509 0 l 299 0 l 299 621 l 0 621 l 0 804 l 299 804 l 299 1011 l 509 1011 l 509 804 \"},\"°\":{\"x_min\":-1,\"x_max\":363,\"ha\":460,\"o\":\"m 181 808 q 46 862 94 808 q -1 992 -1 917 q 44 1118 -1 1066 q 181 1175 96 1175 q 317 1118 265 1175 q 363 991 363 1066 q 315 862 363 917 q 181 808 267 808 m 181 908 q 240 933 218 908 q 263 992 263 958 q 242 1051 263 1027 q 181 1075 221 1075 q 120 1050 142 1075 q 99 991 99 1026 q 120 933 99 958 q 181 908 142 908 \"},\"V\":{\"x_min\":0,\"x_max\":895.828125,\"ha\":997,\"o\":\"m 895 1013 l 550 0 l 347 0 l 0 1013 l 231 1013 l 447 256 l 666 1013 l 895 1013 \"},\"Ξ\":{\"x_min\":0,\"x_max\":751.390625,\"ha\":800,\"o\":\"m 733 826 l 5 826 l 5 1012 l 733 1012 l 733 826 m 681 432 l 65 432 l 65 617 l 681 617 l 681 432 m 751 0 l 0 0 l 0 183 l 751 183 l 751 0 \"},\" \":{\"x_min\":0,\"x_max\":0,\"ha\":853},\"Ϋ\":{\"x_min\":-0.21875,\"x_max\":836.171875,\"ha\":914,\"o\":\"m 610 1046 l 454 1046 l 454 1215 l 610 1215 l 610 1046 m 369 1046 l 212 1046 l 212 1215 l 369 1215 l 369 1046 m 836 1012 l 532 376 l 532 0 l 322 0 l 322 376 l 0 1012 l 208 1012 l 427 576 l 626 1012 l 836 1012 \"},\"0\":{\"x_min\":51,\"x_max\":779,\"ha\":828,\"o\":\"m 415 -26 q 142 129 242 -26 q 51 476 51 271 q 141 825 51 683 q 415 984 242 984 q 687 825 585 984 q 779 476 779 682 q 688 131 779 271 q 415 -26 587 -26 m 415 137 q 529 242 485 137 q 568 477 568 338 q 530 713 568 619 q 415 821 488 821 q 303 718 344 821 q 262 477 262 616 q 301 237 262 337 q 415 137 341 137 \"},\"”\":{\"x_min\":0,\"x_max\":469,\"ha\":567,\"o\":\"m 192 834 q 137 692 192 751 q 0 626 83 634 l 0 697 q 101 831 101 723 l 0 831 l 0 1013 l 192 1013 l 192 834 m 469 834 q 414 692 469 751 q 277 626 360 634 l 277 697 q 379 831 379 723 l 277 831 l 277 1013 l 469 1013 l 469 834 \"},\"@\":{\"x_min\":0,\"x_max\":1276,\"ha\":1374,\"o\":\"m 1115 -52 q 895 -170 1015 -130 q 647 -211 776 -211 q 158 -34 334 -211 q 0 360 0 123 q 179 810 0 621 q 698 1019 377 1019 q 1138 859 981 1019 q 1276 514 1276 720 q 1173 210 1276 335 q 884 75 1062 75 q 784 90 810 75 q 737 186 749 112 q 647 104 698 133 q 532 75 596 75 q 360 144 420 75 q 308 308 308 205 q 398 568 308 451 q 638 696 497 696 q 731 671 690 696 q 805 604 772 647 l 840 673 l 964 673 q 886 373 915 490 q 856 239 856 257 q 876 201 856 214 q 920 188 895 188 q 1084 284 1019 188 q 1150 511 1150 380 q 1051 779 1150 672 q 715 905 934 905 q 272 734 439 905 q 121 363 121 580 q 250 41 121 170 q 647 -103 394 -103 q 863 -67 751 -103 q 1061 26 975 -32 l 1115 -52 m 769 483 q 770 500 770 489 q 733 567 770 539 q 651 596 695 596 q 508 504 566 596 q 457 322 457 422 q 483 215 457 256 q 561 175 509 175 q 671 221 625 175 q 733 333 718 268 l 769 483 \"},\"Ί\":{\"x_min\":0,\"x_max\":619,\"ha\":732,\"o\":\"m 313 1035 l 98 780 l 0 780 l 136 1035 l 313 1035 m 619 0 l 411 0 l 411 1012 l 619 1012 l 619 0 \"},\"i\":{\"x_min\":14,\"x_max\":214,\"ha\":326,\"o\":\"m 214 830 l 14 830 l 14 1013 l 214 1013 l 214 830 m 214 0 l 14 0 l 14 748 l 214 748 l 214 0 \"},\"Β\":{\"x_min\":0,\"x_max\":835,\"ha\":961,\"o\":\"m 675 547 q 791 450 747 518 q 835 304 835 383 q 718 75 835 158 q 461 0 612 0 l 0 0 l 0 1013 l 477 1013 q 697 951 609 1013 q 797 754 797 880 q 766 630 797 686 q 675 547 734 575 m 439 621 q 539 646 496 621 q 590 730 590 676 q 537 814 590 785 q 436 838 494 838 l 199 838 l 199 621 l 439 621 m 445 182 q 561 211 513 182 q 618 311 618 247 q 565 410 618 375 q 444 446 512 446 l 199 446 l 199 182 l 445 182 \"},\"υ\":{\"x_min\":0,\"x_max\":656,\"ha\":767,\"o\":\"m 656 416 q 568 55 656 145 q 326 -25 490 -25 q 59 97 137 -25 q 0 369 0 191 l 0 749 l 200 749 l 200 369 q 216 222 200 268 q 326 142 245 142 q 440 247 411 142 q 456 422 456 304 l 456 749 l 656 749 l 656 416 \"},\"]\":{\"x_min\":0,\"x_max\":349,\"ha\":446,\"o\":\"m 349 -300 l 0 -300 l 0 -154 l 163 -154 l 163 866 l 0 866 l 0 1013 l 349 1013 l 349 -300 \"},\"m\":{\"x_min\":0,\"x_max\":1065,\"ha\":1174,\"o\":\"m 1065 0 l 866 0 l 866 483 q 836 564 866 532 q 759 596 807 596 q 663 555 700 596 q 627 454 627 514 l 627 0 l 433 0 l 433 481 q 403 563 433 531 q 323 596 374 596 q 231 554 265 596 q 197 453 197 513 l 197 0 l 0 0 l 0 748 l 189 748 l 189 665 q 279 745 226 715 q 392 775 333 775 q 509 744 455 775 q 606 659 563 713 q 695 744 640 713 q 814 775 749 775 q 992 702 920 775 q 1065 523 1065 630 l 1065 0 \"},\"χ\":{\"x_min\":0,\"x_max\":759.71875,\"ha\":847,\"o\":\"m 759 -299 l 548 -299 l 379 66 l 215 -299 l 0 -299 l 261 233 l 13 749 l 230 749 l 379 400 l 527 749 l 738 749 l 500 238 l 759 -299 \"},\"8\":{\"x_min\":57,\"x_max\":770,\"ha\":828,\"o\":\"m 625 516 q 733 416 697 477 q 770 284 770 355 q 675 69 770 161 q 415 -29 574 -29 q 145 65 244 -29 q 57 273 57 150 q 93 413 57 350 q 204 516 130 477 q 112 609 142 556 q 83 718 83 662 q 177 905 83 824 q 414 986 272 986 q 650 904 555 986 q 745 715 745 822 q 716 608 745 658 q 625 516 688 558 m 414 590 q 516 624 479 590 q 553 706 553 659 q 516 791 553 755 q 414 828 480 828 q 311 792 348 828 q 275 706 275 757 q 310 624 275 658 q 414 590 345 590 m 413 135 q 527 179 487 135 q 564 279 564 218 q 525 386 564 341 q 411 436 482 436 q 298 387 341 436 q 261 282 261 344 q 300 178 261 222 q 413 135 340 135 \"},\"ί\":{\"x_min\":42,\"x_max\":371.171875,\"ha\":389,\"o\":\"m 242 0 l 42 0 l 42 748 l 242 748 l 242 0 m 371 1039 l 169 823 l 71 823 l 193 1039 l 371 1039 \"},\"Ζ\":{\"x_min\":0,\"x_max\":804.171875,\"ha\":886,\"o\":\"m 804 835 l 251 182 l 793 182 l 793 0 l 0 0 l 0 176 l 551 829 l 11 829 l 11 1012 l 804 1012 l 804 835 \"},\"R\":{\"x_min\":0,\"x_max\":836.109375,\"ha\":947,\"o\":\"m 836 0 l 608 0 q 588 53 596 20 q 581 144 581 86 q 581 179 581 162 q 581 215 581 197 q 553 345 581 306 q 428 393 518 393 l 208 393 l 208 0 l 0 0 l 0 1013 l 491 1013 q 720 944 630 1013 q 819 734 819 869 q 778 584 819 654 q 664 485 738 513 q 757 415 727 463 q 794 231 794 358 l 794 170 q 800 84 794 116 q 836 31 806 51 l 836 0 m 462 838 l 208 838 l 208 572 l 452 572 q 562 604 517 572 q 612 704 612 640 q 568 801 612 765 q 462 838 525 838 \"},\"o\":{\"x_min\":0,\"x_max\":764,\"ha\":871,\"o\":\"m 380 -26 q 105 86 211 -26 q 0 371 0 199 q 104 660 0 545 q 380 775 209 775 q 658 659 552 775 q 764 371 764 544 q 658 86 764 199 q 380 -26 552 -26 m 379 141 q 515 216 466 141 q 557 373 557 280 q 515 530 557 465 q 379 607 466 607 q 245 530 294 607 q 204 373 204 465 q 245 217 204 282 q 379 141 294 141 \"},\"5\":{\"x_min\":59,\"x_max\":767,\"ha\":828,\"o\":\"m 767 319 q 644 59 767 158 q 382 -29 533 -29 q 158 43 247 -29 q 59 264 59 123 l 252 264 q 295 165 252 201 q 400 129 339 129 q 512 172 466 129 q 564 308 564 220 q 514 437 564 387 q 398 488 464 488 q 329 472 361 488 q 271 420 297 456 l 93 428 l 157 958 l 722 958 l 722 790 l 295 790 l 271 593 q 348 635 306 621 q 431 649 389 649 q 663 551 560 649 q 767 319 767 453 \"},\"7\":{\"x_min\":65.28125,\"x_max\":762.5,\"ha\":828,\"o\":\"m 762 808 q 521 435 604 626 q 409 0 438 244 l 205 0 q 313 422 227 234 q 548 789 387 583 l 65 789 l 65 958 l 762 958 l 762 808 \"},\"K\":{\"x_min\":0,\"x_max\":900,\"ha\":996,\"o\":\"m 900 0 l 647 0 l 316 462 l 208 355 l 208 0 l 0 0 l 0 1013 l 208 1013 l 208 595 l 604 1013 l 863 1013 l 461 603 l 900 0 \"},\",\":{\"x_min\":0,\"x_max\":206,\"ha\":303,\"o\":\"m 206 5 q 150 -151 206 -88 q 0 -238 94 -213 l 0 -159 q 84 -100 56 -137 q 111 -2 111 -62 l 0 -2 l 0 205 l 206 205 l 206 5 \"},\"d\":{\"x_min\":0,\"x_max\":722,\"ha\":836,\"o\":\"m 722 0 l 530 0 l 530 101 q 303 -26 449 -26 q 72 103 155 -26 q 0 373 0 214 q 72 642 0 528 q 305 775 156 775 q 433 743 373 775 q 530 656 492 712 l 530 1013 l 722 1013 l 722 0 m 361 600 q 234 523 280 600 q 196 372 196 458 q 233 220 196 286 q 358 143 278 143 q 489 216 442 143 q 530 369 530 280 q 491 522 530 456 q 361 600 443 600 \"},\"¨\":{\"x_min\":212,\"x_max\":609,\"ha\":933,\"o\":\"m 609 1046 l 453 1046 l 453 1216 l 609 1216 l 609 1046 m 369 1046 l 212 1046 l 212 1216 l 369 1216 l 369 1046 \"},\"E\":{\"x_min\":0,\"x_max\":761.109375,\"ha\":824,\"o\":\"m 761 0 l 0 0 l 0 1013 l 734 1013 l 734 837 l 206 837 l 206 621 l 690 621 l 690 446 l 206 446 l 206 186 l 761 186 l 761 0 \"},\"Y\":{\"x_min\":0,\"x_max\":836,\"ha\":931,\"o\":\"m 836 1013 l 532 376 l 532 0 l 322 0 l 322 376 l 0 1013 l 208 1013 l 427 576 l 626 1013 l 836 1013 \"},\"\\\"\":{\"x_min\":0,\"x_max\":357,\"ha\":454,\"o\":\"m 357 604 l 225 604 l 225 988 l 357 988 l 357 604 m 132 604 l 0 604 l 0 988 l 132 988 l 132 604 \"},\"‹\":{\"x_min\":35.984375,\"x_max\":791.671875,\"ha\":828,\"o\":\"m 791 17 l 36 352 l 35 487 l 791 823 l 791 672 l 229 421 l 791 168 l 791 17 \"},\"„\":{\"x_min\":0,\"x_max\":483,\"ha\":588,\"o\":\"m 206 5 q 150 -151 206 -88 q 0 -238 94 -213 l 0 -159 q 84 -100 56 -137 q 111 -2 111 -62 l 0 -2 l 0 205 l 206 205 l 206 5 m 483 5 q 427 -151 483 -88 q 277 -238 371 -213 l 277 -159 q 361 -100 334 -137 q 388 -2 388 -62 l 277 -2 l 277 205 l 483 205 l 483 5 \"},\"δ\":{\"x_min\":6,\"x_max\":732,\"ha\":835,\"o\":\"m 732 352 q 630 76 732 177 q 354 -25 529 -25 q 101 74 197 -25 q 6 333 6 174 q 89 581 6 480 q 323 690 178 690 q 66 864 201 787 l 66 1013 l 669 1013 l 669 856 l 348 856 q 532 729 461 789 q 673 566 625 651 q 732 352 732 465 m 419 551 q 259 496 321 551 q 198 344 198 441 q 238 208 198 267 q 357 140 283 140 q 484 203 437 140 q 526 344 526 260 q 499 466 526 410 q 419 551 473 521 \"},\"έ\":{\"x_min\":16.671875,\"x_max\":652.78125,\"ha\":742,\"o\":\"m 652 259 q 565 49 652 123 q 340 -25 479 -25 q 102 39 188 -25 q 16 197 16 104 q 45 299 16 250 q 134 390 75 348 q 58 456 86 419 q 25 552 25 502 q 120 717 25 653 q 322 776 208 776 q 537 710 456 776 q 625 508 625 639 l 445 508 q 415 585 445 563 q 327 608 386 608 q 254 590 293 608 q 215 544 215 573 q 252 469 215 490 q 336 453 280 453 q 369 455 347 453 q 400 456 391 456 l 400 308 l 329 308 q 247 291 280 308 q 204 223 204 269 q 255 154 204 172 q 345 143 286 143 q 426 174 398 143 q 454 259 454 206 l 652 259 m 579 1039 l 377 823 l 279 823 l 401 1039 l 579 1039 \"},\"ω\":{\"x_min\":0,\"x_max\":945,\"ha\":1051,\"o\":\"m 565 323 l 565 289 q 577 190 565 221 q 651 142 597 142 q 718 189 694 142 q 742 365 742 237 q 703 565 742 462 q 610 749 671 650 l 814 749 q 910 547 876 650 q 945 337 945 444 q 874 96 945 205 q 668 -29 793 -29 q 551 0 608 -29 q 470 78 495 30 q 390 0 444 28 q 276 -29 337 -29 q 69 96 149 -29 q 0 337 0 204 q 36 553 0 444 q 130 749 68 650 l 334 749 q 241 565 273 650 q 203 365 203 461 q 219 222 203 279 q 292 142 243 142 q 360 183 342 142 q 373 271 373 211 q 372 298 372 285 q 372 323 372 311 l 372 528 l 566 528 l 565 323 \"},\"´\":{\"x_min\":0,\"x_max\":132,\"ha\":299,\"o\":\"m 132 604 l 0 604 l 0 988 l 132 988 l 132 604 \"},\"±\":{\"x_min\":29,\"x_max\":798,\"ha\":828,\"o\":\"m 798 480 l 484 480 l 484 254 l 344 254 l 344 480 l 29 480 l 29 615 l 344 615 l 344 842 l 484 842 l 484 615 l 798 615 l 798 480 m 798 0 l 29 0 l 29 136 l 798 136 l 798 0 \"},\"|\":{\"x_min\":0,\"x_max\":143,\"ha\":240,\"o\":\"m 143 462 l 0 462 l 0 984 l 143 984 l 143 462 m 143 -242 l 0 -242 l 0 280 l 143 280 l 143 -242 \"},\"ϋ\":{\"x_min\":0,\"x_max\":656,\"ha\":767,\"o\":\"m 535 810 l 406 810 l 406 952 l 535 952 l 535 810 m 271 810 l 142 810 l 142 952 l 271 952 l 271 810 m 656 417 q 568 55 656 146 q 326 -25 490 -25 q 59 97 137 -25 q 0 369 0 192 l 0 748 l 200 748 l 200 369 q 216 222 200 268 q 326 142 245 142 q 440 247 411 142 q 456 422 456 304 l 456 748 l 656 748 l 656 417 \"},\"§\":{\"x_min\":0,\"x_max\":633,\"ha\":731,\"o\":\"m 633 469 q 601 356 633 406 q 512 274 569 305 q 570 197 548 242 q 593 105 593 152 q 501 -76 593 -5 q 301 -142 416 -142 q 122 -82 193 -142 q 43 108 43 -15 l 212 108 q 251 27 220 53 q 321 1 283 1 q 389 23 360 1 q 419 83 419 46 q 310 194 419 139 q 108 297 111 295 q 0 476 0 372 q 33 584 0 537 q 120 659 62 626 q 72 720 91 686 q 53 790 53 755 q 133 978 53 908 q 312 1042 207 1042 q 483 984 412 1042 q 574 807 562 921 l 409 807 q 379 875 409 851 q 307 900 349 900 q 244 881 270 900 q 218 829 218 862 q 324 731 218 781 q 524 636 506 647 q 633 469 633 565 m 419 334 q 473 411 473 372 q 451 459 473 436 q 390 502 430 481 l 209 595 q 167 557 182 577 q 153 520 153 537 q 187 461 153 491 q 263 413 212 440 l 419 334 \"},\"b\":{\"x_min\":0,\"x_max\":722,\"ha\":822,\"o\":\"m 416 -26 q 289 6 346 -26 q 192 101 232 39 l 192 0 l 0 0 l 0 1013 l 192 1013 l 192 656 q 286 743 226 712 q 415 775 346 775 q 649 644 564 775 q 722 374 722 533 q 649 106 722 218 q 416 -26 565 -26 m 361 600 q 232 524 279 600 q 192 371 192 459 q 229 221 192 284 q 357 145 275 145 q 487 221 441 145 q 526 374 526 285 q 488 523 526 460 q 361 600 442 600 \"},\"q\":{\"x_min\":0,\"x_max\":722,\"ha\":833,\"o\":\"m 722 -298 l 530 -298 l 530 97 q 306 -25 449 -25 q 73 104 159 -25 q 0 372 0 216 q 72 643 0 529 q 305 775 156 775 q 430 742 371 775 q 530 654 488 709 l 530 750 l 722 750 l 722 -298 m 360 601 q 234 527 278 601 q 197 378 197 466 q 233 225 197 291 q 357 144 277 144 q 488 217 441 144 q 530 370 530 282 q 491 523 530 459 q 360 601 443 601 \"},\"Ω\":{\"x_min\":-0.03125,\"x_max\":1008.53125,\"ha\":1108,\"o\":\"m 1008 0 l 589 0 l 589 199 q 717 368 670 265 q 764 580 764 471 q 698 778 764 706 q 504 855 629 855 q 311 773 380 855 q 243 563 243 691 q 289 360 243 458 q 419 199 336 262 l 419 0 l 0 0 l 0 176 l 202 176 q 77 355 123 251 q 32 569 32 459 q 165 908 32 776 q 505 1040 298 1040 q 844 912 711 1040 q 977 578 977 785 q 931 362 977 467 q 805 176 886 256 l 1008 176 l 1008 0 \"},\"ύ\":{\"x_min\":0,\"x_max\":656,\"ha\":767,\"o\":\"m 656 417 q 568 55 656 146 q 326 -25 490 -25 q 59 97 137 -25 q 0 369 0 192 l 0 748 l 200 748 l 201 369 q 218 222 201 269 q 326 142 245 142 q 440 247 411 142 q 456 422 456 304 l 456 748 l 656 748 l 656 417 m 579 1039 l 378 823 l 279 823 l 401 1039 l 579 1039 \"},\"z\":{\"x_min\":0,\"x_max\":663.890625,\"ha\":753,\"o\":\"m 663 0 l 0 0 l 0 154 l 411 591 l 25 591 l 25 749 l 650 749 l 650 584 l 245 165 l 663 165 l 663 0 \"},\"™\":{\"x_min\":0,\"x_max\":951,\"ha\":1063,\"o\":\"m 405 921 l 255 921 l 255 506 l 149 506 l 149 921 l 0 921 l 0 1013 l 405 1013 l 405 921 m 951 506 l 852 506 l 852 916 l 750 506 l 643 506 l 539 915 l 539 506 l 442 506 l 442 1013 l 595 1012 l 695 625 l 794 1013 l 951 1013 l 951 506 \"},\"ή\":{\"x_min\":0,\"x_max\":669,\"ha\":779,\"o\":\"m 669 -278 l 469 -278 l 469 390 q 448 526 469 473 q 348 606 417 606 q 244 553 288 606 q 201 441 201 501 l 201 0 l 0 0 l 0 749 l 201 749 l 201 665 q 301 744 244 715 q 423 774 359 774 q 606 685 538 774 q 669 484 669 603 l 669 -278 m 495 1039 l 293 823 l 195 823 l 317 1039 l 495 1039 \"},\"Θ\":{\"x_min\":0,\"x_max\":993,\"ha\":1092,\"o\":\"m 497 -29 q 133 127 272 -29 q 0 505 0 277 q 133 883 0 733 q 497 1040 272 1040 q 861 883 722 1040 q 993 505 993 733 q 861 127 993 277 q 497 -29 722 -29 m 497 154 q 711 266 631 154 q 782 506 782 367 q 712 746 782 648 q 497 858 634 858 q 281 746 361 858 q 211 506 211 648 q 280 266 211 365 q 497 154 359 154 m 676 430 l 316 430 l 316 593 l 676 593 l 676 430 \"},\"®\":{\"x_min\":3,\"x_max\":1007,\"ha\":1104,\"o\":\"m 507 -6 q 129 153 269 -6 q 3 506 3 298 q 127 857 3 713 q 502 1017 266 1017 q 880 855 740 1017 q 1007 502 1007 711 q 882 152 1007 295 q 507 -6 743 -6 m 502 934 q 184 800 302 934 q 79 505 79 680 q 184 210 79 331 q 501 76 302 76 q 819 210 701 76 q 925 507 925 331 q 820 800 925 682 q 502 934 704 934 m 782 190 l 639 190 q 627 225 632 202 q 623 285 623 248 l 623 326 q 603 411 623 384 q 527 439 584 439 l 388 439 l 388 190 l 257 190 l 257 829 l 566 829 q 709 787 654 829 q 772 654 772 740 q 746 559 772 604 q 675 497 720 514 q 735 451 714 483 q 756 341 756 419 l 756 299 q 760 244 756 265 q 782 212 764 223 l 782 190 m 546 718 l 388 718 l 388 552 l 541 552 q 612 572 584 552 q 641 635 641 593 q 614 695 641 672 q 546 718 587 718 \"},\"~\":{\"x_min\":0,\"x_max\":851,\"ha\":949,\"o\":\"m 851 968 q 795 750 851 831 q 599 656 730 656 q 406 744 506 656 q 259 832 305 832 q 162 775 193 832 q 139 656 139 730 l 0 656 q 58 871 0 787 q 251 968 124 968 q 442 879 341 968 q 596 791 544 791 q 691 849 663 791 q 712 968 712 892 l 851 968 \"},\"Ε\":{\"x_min\":0,\"x_max\":761.546875,\"ha\":824,\"o\":\"m 761 0 l 0 0 l 0 1012 l 735 1012 l 735 836 l 206 836 l 206 621 l 690 621 l 690 446 l 206 446 l 206 186 l 761 186 l 761 0 \"},\"³\":{\"x_min\":0,\"x_max\":467,\"ha\":564,\"o\":\"m 467 555 q 393 413 467 466 q 229 365 325 365 q 70 413 134 365 q 0 565 0 467 l 123 565 q 163 484 131 512 q 229 461 190 461 q 299 486 269 461 q 329 553 329 512 q 281 627 329 607 q 187 641 248 641 l 187 722 q 268 737 237 722 q 312 804 312 758 q 285 859 312 837 q 224 882 259 882 q 165 858 189 882 q 135 783 140 834 l 12 783 q 86 930 20 878 q 230 976 145 976 q 379 931 314 976 q 444 813 444 887 q 423 744 444 773 q 365 695 402 716 q 439 640 412 676 q 467 555 467 605 \"},\"[\":{\"x_min\":0,\"x_max\":347.21875,\"ha\":444,\"o\":\"m 347 -300 l 0 -300 l 0 1013 l 347 1013 l 347 866 l 188 866 l 188 -154 l 347 -154 l 347 -300 \"},\"L\":{\"x_min\":0,\"x_max\":704.171875,\"ha\":763,\"o\":\"m 704 0 l 0 0 l 0 1013 l 208 1013 l 208 186 l 704 186 l 704 0 \"},\"σ\":{\"x_min\":0,\"x_max\":851.3125,\"ha\":940,\"o\":\"m 851 594 l 712 594 q 761 369 761 485 q 658 83 761 191 q 379 -25 555 -25 q 104 87 208 -25 q 0 372 0 200 q 103 659 0 544 q 378 775 207 775 q 464 762 407 775 q 549 750 521 750 l 851 750 l 851 594 m 379 142 q 515 216 466 142 q 557 373 557 280 q 515 530 557 465 q 379 608 465 608 q 244 530 293 608 q 203 373 203 465 q 244 218 203 283 q 379 142 293 142 \"},\"ζ\":{\"x_min\":0,\"x_max\":622,\"ha\":701,\"o\":\"m 622 -32 q 604 -158 622 -98 q 551 -278 587 -218 l 373 -278 q 426 -180 406 -229 q 446 -80 446 -131 q 421 -22 446 -37 q 354 -8 397 -8 q 316 -9 341 -8 q 280 -11 291 -11 q 75 69 150 -11 q 0 283 0 150 q 87 596 0 437 q 291 856 162 730 l 47 856 l 47 1013 l 592 1013 l 592 904 q 317 660 422 800 q 197 318 197 497 q 306 141 197 169 q 510 123 408 131 q 622 -32 622 102 \"},\"θ\":{\"x_min\":0,\"x_max\":714,\"ha\":817,\"o\":\"m 357 1022 q 633 833 534 1022 q 714 486 714 679 q 634 148 714 288 q 354 -25 536 -25 q 79 147 175 -25 q 0 481 0 288 q 79 831 0 679 q 357 1022 177 1022 m 510 590 q 475 763 510 687 q 351 862 430 862 q 233 763 272 862 q 204 590 204 689 l 510 590 m 510 440 l 204 440 q 233 251 204 337 q 355 131 274 131 q 478 248 434 131 q 510 440 510 337 \"},\"Ο\":{\"x_min\":0,\"x_max\":995,\"ha\":1092,\"o\":\"m 497 -29 q 133 127 272 -29 q 0 505 0 277 q 132 883 0 733 q 497 1040 270 1040 q 861 883 722 1040 q 995 505 995 733 q 862 127 995 277 q 497 -29 724 -29 m 497 154 q 711 266 632 154 q 781 506 781 365 q 711 745 781 647 q 497 857 632 857 q 283 747 361 857 q 213 506 213 647 q 282 266 213 365 q 497 154 361 154 \"},\"Γ\":{\"x_min\":0,\"x_max\":703.84375,\"ha\":742,\"o\":\"m 703 836 l 208 836 l 208 0 l 0 0 l 0 1012 l 703 1012 l 703 836 \"},\" \":{\"x_min\":0,\"x_max\":0,\"ha\":375},\"%\":{\"x_min\":0,\"x_max\":1111,\"ha\":1213,\"o\":\"m 861 484 q 1048 404 979 484 q 1111 228 1111 332 q 1048 51 1111 123 q 859 -29 979 -29 q 672 50 740 -29 q 610 227 610 122 q 672 403 610 331 q 861 484 741 484 m 861 120 q 939 151 911 120 q 967 226 967 183 q 942 299 967 270 q 861 333 912 333 q 783 301 811 333 q 756 226 756 269 q 783 151 756 182 q 861 120 810 120 m 904 984 l 316 -28 l 205 -29 l 793 983 l 904 984 m 250 984 q 436 904 366 984 q 499 730 499 832 q 436 552 499 626 q 248 472 366 472 q 62 552 132 472 q 0 728 0 624 q 62 903 0 831 q 250 984 132 984 m 249 835 q 169 801 198 835 q 140 725 140 768 q 167 652 140 683 q 247 621 195 621 q 327 654 298 621 q 357 730 357 687 q 329 803 357 772 q 249 835 301 835 \"},\"P\":{\"x_min\":0,\"x_max\":771,\"ha\":838,\"o\":\"m 208 361 l 208 0 l 0 0 l 0 1013 l 450 1013 q 682 919 593 1013 q 771 682 771 826 q 687 452 771 544 q 466 361 604 361 l 208 361 m 421 837 l 208 837 l 208 544 l 410 544 q 525 579 480 544 q 571 683 571 615 q 527 792 571 747 q 421 837 484 837 \"},\"Έ\":{\"x_min\":0,\"x_max\":1172.546875,\"ha\":1235,\"o\":\"m 1172 0 l 411 0 l 411 1012 l 1146 1012 l 1146 836 l 617 836 l 617 621 l 1101 621 l 1101 446 l 617 446 l 617 186 l 1172 186 l 1172 0 m 313 1035 l 98 780 l 0 780 l 136 1035 l 313 1035 \"},\"Ώ\":{\"x_min\":0.4375,\"x_max\":1189.546875,\"ha\":1289,\"o\":\"m 1189 0 l 770 0 l 770 199 q 897 369 849 263 q 945 580 945 474 q 879 778 945 706 q 685 855 810 855 q 492 773 561 855 q 424 563 424 691 q 470 360 424 458 q 600 199 517 262 l 600 0 l 180 0 l 180 176 l 383 176 q 258 355 304 251 q 213 569 213 459 q 346 908 213 776 q 686 1040 479 1040 q 1025 912 892 1040 q 1158 578 1158 785 q 1112 362 1158 467 q 986 176 1067 256 l 1189 176 l 1189 0 m 314 1092 l 99 837 l 0 837 l 136 1092 l 314 1092 \"},\"_\":{\"x_min\":61.109375,\"x_max\":766.671875,\"ha\":828,\"o\":\"m 766 -333 l 61 -333 l 61 -190 l 766 -190 l 766 -333 \"},\"Ϊ\":{\"x_min\":-56,\"x_max\":342,\"ha\":503,\"o\":\"m 342 1046 l 186 1046 l 186 1215 l 342 1215 l 342 1046 m 101 1046 l -56 1046 l -56 1215 l 101 1215 l 101 1046 m 249 0 l 41 0 l 41 1012 l 249 1012 l 249 0 \"},\"+\":{\"x_min\":43,\"x_max\":784,\"ha\":828,\"o\":\"m 784 353 l 483 353 l 483 0 l 343 0 l 343 353 l 43 353 l 43 489 l 343 489 l 343 840 l 483 840 l 483 489 l 784 489 l 784 353 \"},\"½\":{\"x_min\":0,\"x_max\":1090,\"ha\":1188,\"o\":\"m 1090 380 q 992 230 1090 301 q 779 101 886 165 q 822 94 784 95 q 924 93 859 93 l 951 93 l 973 93 l 992 93 l 1009 93 q 1046 93 1027 93 q 1085 93 1066 93 l 1085 0 l 650 0 l 654 38 q 815 233 665 137 q 965 376 965 330 q 936 436 965 412 q 869 461 908 461 q 806 435 831 461 q 774 354 780 409 l 659 354 q 724 505 659 451 q 870 554 783 554 q 1024 506 958 554 q 1090 380 1090 459 m 868 998 l 268 -28 l 154 -27 l 757 999 l 868 998 m 272 422 l 147 422 l 147 799 l 0 799 l 0 875 q 126 900 91 875 q 170 973 162 926 l 272 973 l 272 422 \"},\"Ρ\":{\"x_min\":0,\"x_max\":771,\"ha\":838,\"o\":\"m 208 361 l 208 0 l 0 0 l 0 1012 l 450 1012 q 682 919 593 1012 q 771 681 771 826 q 687 452 771 544 q 466 361 604 361 l 208 361 m 422 836 l 209 836 l 209 544 l 410 544 q 525 579 480 544 q 571 683 571 614 q 527 791 571 747 q 422 836 484 836 \"},\"'\":{\"x_min\":0,\"x_max\":192,\"ha\":289,\"o\":\"m 192 834 q 137 692 192 751 q 0 626 82 632 l 0 697 q 101 830 101 726 l 0 830 l 0 1013 l 192 1013 l 192 834 \"},\"ª\":{\"x_min\":0,\"x_max\":350,\"ha\":393,\"o\":\"m 350 625 l 245 625 q 237 648 241 636 q 233 672 233 661 q 117 611 192 611 q 33 643 66 611 q 0 727 0 675 q 116 846 0 828 q 233 886 233 864 q 211 919 233 907 q 168 931 190 931 q 108 877 108 931 l 14 877 q 56 977 14 942 q 165 1013 98 1013 q 270 987 224 1013 q 329 903 329 955 l 329 694 q 332 661 329 675 q 350 641 336 648 l 350 625 m 233 774 l 233 809 q 151 786 180 796 q 97 733 97 768 q 111 700 97 712 q 149 689 126 689 q 210 713 187 689 q 233 774 233 737 \"},\"΅\":{\"x_min\":57,\"x_max\":584,\"ha\":753,\"o\":\"m 584 810 l 455 810 l 455 952 l 584 952 l 584 810 m 521 1064 l 305 810 l 207 810 l 343 1064 l 521 1064 m 186 810 l 57 810 l 57 952 l 186 952 l 186 810 \"},\"T\":{\"x_min\":0,\"x_max\":809,\"ha\":894,\"o\":\"m 809 831 l 509 831 l 509 0 l 299 0 l 299 831 l 0 831 l 0 1013 l 809 1013 l 809 831 \"},\"Φ\":{\"x_min\":0,\"x_max\":949,\"ha\":1032,\"o\":\"m 566 0 l 385 0 l 385 121 q 111 230 222 121 q 0 508 0 340 q 112 775 0 669 q 385 892 219 875 l 385 1013 l 566 1013 l 566 892 q 836 776 732 875 q 949 507 949 671 q 838 231 949 341 q 566 121 728 121 l 566 0 m 566 285 q 701 352 650 285 q 753 508 753 419 q 703 658 753 597 q 566 729 653 720 l 566 285 m 385 285 l 385 729 q 245 661 297 717 q 193 516 193 604 q 246 356 193 427 q 385 285 300 285 \"},\"j\":{\"x_min\":-45.828125,\"x_max\":242,\"ha\":361,\"o\":\"m 242 830 l 42 830 l 42 1013 l 242 1013 l 242 830 m 242 -119 q 180 -267 242 -221 q 20 -308 127 -308 l -45 -308 l -45 -140 l -24 -140 q 25 -130 8 -140 q 42 -88 42 -120 l 42 748 l 242 748 l 242 -119 \"},\"Σ\":{\"x_min\":0,\"x_max\":772.21875,\"ha\":849,\"o\":\"m 772 0 l 0 0 l 0 140 l 368 526 l 18 862 l 18 1012 l 740 1012 l 740 836 l 315 836 l 619 523 l 298 175 l 772 175 l 772 0 \"},\"1\":{\"x_min\":197.609375,\"x_max\":628,\"ha\":828,\"o\":\"m 628 0 l 434 0 l 434 674 l 197 674 l 197 810 q 373 837 318 810 q 468 984 450 876 l 628 984 l 628 0 \"},\"›\":{\"x_min\":36.109375,\"x_max\":792,\"ha\":828,\"o\":\"m 792 352 l 36 17 l 36 168 l 594 420 l 36 672 l 36 823 l 792 487 l 792 352 \"},\"<\":{\"x_min\":35.984375,\"x_max\":791.671875,\"ha\":828,\"o\":\"m 791 17 l 36 352 l 35 487 l 791 823 l 791 672 l 229 421 l 791 168 l 791 17 \"},\"£\":{\"x_min\":0,\"x_max\":716.546875,\"ha\":814,\"o\":\"m 716 38 q 603 -9 658 5 q 502 -24 548 -24 q 398 -10 451 -24 q 239 25 266 25 q 161 12 200 25 q 77 -29 122 0 l 0 113 q 110 211 81 174 q 151 315 151 259 q 117 440 151 365 l 0 440 l 0 515 l 73 515 q 35 610 52 560 q 15 710 15 671 q 119 910 15 831 q 349 984 216 984 q 570 910 480 984 q 693 668 674 826 l 501 668 q 455 791 501 746 q 353 830 414 830 q 256 795 298 830 q 215 705 215 760 q 249 583 215 655 q 283 515 266 548 l 479 515 l 479 440 l 309 440 q 316 394 313 413 q 319 355 319 374 q 287 241 319 291 q 188 135 263 205 q 262 160 225 152 q 332 168 298 168 q 455 151 368 168 q 523 143 500 143 q 588 152 558 143 q 654 189 617 162 l 716 38 \"},\"t\":{\"x_min\":0,\"x_max\":412,\"ha\":511,\"o\":\"m 412 -6 q 349 -8 391 -6 q 287 -11 307 -11 q 137 38 177 -11 q 97 203 97 87 l 97 609 l 0 609 l 0 749 l 97 749 l 97 951 l 297 951 l 297 749 l 412 749 l 412 609 l 297 609 l 297 191 q 315 152 297 162 q 366 143 334 143 q 389 143 378 143 q 412 143 400 143 l 412 -6 \"},\"¬\":{\"x_min\":0,\"x_max\":704,\"ha\":801,\"o\":\"m 704 93 l 551 93 l 551 297 l 0 297 l 0 450 l 704 450 l 704 93 \"},\"λ\":{\"x_min\":0,\"x_max\":701.390625,\"ha\":775,\"o\":\"m 701 0 l 491 0 l 345 444 l 195 0 l 0 0 l 238 697 l 131 1013 l 334 1013 l 701 0 \"},\"W\":{\"x_min\":0,\"x_max\":1291.671875,\"ha\":1399,\"o\":\"m 1291 1013 l 1002 0 l 802 0 l 645 777 l 490 0 l 288 0 l 0 1013 l 215 1013 l 388 298 l 534 1012 l 757 1013 l 904 299 l 1076 1013 l 1291 1013 \"},\">\":{\"x_min\":36.109375,\"x_max\":792,\"ha\":828,\"o\":\"m 792 352 l 36 17 l 36 168 l 594 420 l 36 672 l 36 823 l 792 487 l 792 352 \"},\"v\":{\"x_min\":0,\"x_max\":740.28125,\"ha\":828,\"o\":\"m 740 749 l 473 0 l 266 0 l 0 749 l 222 749 l 373 211 l 529 749 l 740 749 \"},\"τ\":{\"x_min\":0.28125,\"x_max\":618.734375,\"ha\":699,\"o\":\"m 618 593 l 409 593 l 409 0 l 210 0 l 210 593 l 0 593 l 0 749 l 618 749 l 618 593 \"},\"ξ\":{\"x_min\":0,\"x_max\":640,\"ha\":715,\"o\":\"m 640 -14 q 619 -157 640 -84 q 563 -299 599 -230 l 399 -299 q 442 -194 433 -223 q 468 -85 468 -126 q 440 -25 468 -41 q 368 -10 412 -10 q 333 -11 355 -10 q 302 -13 311 -13 q 91 60 179 -13 q 0 259 0 138 q 56 426 0 354 q 201 530 109 493 q 106 594 144 553 q 65 699 65 642 q 94 787 65 747 q 169 856 123 828 l 22 856 l 22 1013 l 597 1013 l 597 856 l 497 857 q 345 840 398 857 q 257 736 257 812 q 366 614 257 642 q 552 602 416 602 l 552 446 l 513 446 q 313 425 379 446 q 199 284 199 389 q 312 162 199 184 q 524 136 418 148 q 640 -14 640 105 \"},\"&\":{\"x_min\":-1,\"x_max\":910.109375,\"ha\":1007,\"o\":\"m 910 -1 l 676 -1 l 607 83 q 291 -47 439 -47 q 50 100 135 -47 q -1 273 -1 190 q 51 431 -1 357 q 218 568 104 505 q 151 661 169 629 q 120 769 120 717 q 201 951 120 885 q 382 1013 276 1013 q 555 957 485 1013 q 635 789 635 894 q 584 644 635 709 q 468 539 548 597 l 615 359 q 664 527 654 440 l 844 527 q 725 223 824 359 l 910 -1 m 461 787 q 436 848 461 826 q 381 870 412 870 q 325 849 349 870 q 301 792 301 829 q 324 719 301 757 q 372 660 335 703 q 430 714 405 680 q 461 787 461 753 m 500 214 l 318 441 q 198 286 198 363 q 225 204 198 248 q 347 135 268 135 q 425 153 388 135 q 500 214 462 172 \"},\"Λ\":{\"x_min\":0,\"x_max\":894.453125,\"ha\":974,\"o\":\"m 894 0 l 666 0 l 447 757 l 225 0 l 0 0 l 344 1013 l 547 1013 l 894 0 \"},\"I\":{\"x_min\":41,\"x_max\":249,\"ha\":365,\"o\":\"m 249 0 l 41 0 l 41 1013 l 249 1013 l 249 0 \"},\"G\":{\"x_min\":0,\"x_max\":971,\"ha\":1057,\"o\":\"m 971 -1 l 829 -1 l 805 118 q 479 -29 670 -29 q 126 133 261 -29 q 0 509 0 286 q 130 884 0 737 q 493 1040 268 1040 q 790 948 659 1040 q 961 698 920 857 l 736 698 q 643 813 709 769 q 500 857 578 857 q 285 746 364 857 q 213 504 213 644 q 285 263 213 361 q 505 154 365 154 q 667 217 598 154 q 761 374 736 280 l 548 374 l 548 548 l 971 548 l 971 -1 \"},\"ΰ\":{\"x_min\":0,\"x_max\":655,\"ha\":767,\"o\":\"m 583 810 l 454 810 l 454 952 l 583 952 l 583 810 m 186 810 l 57 809 l 57 952 l 186 952 l 186 810 m 516 1039 l 315 823 l 216 823 l 338 1039 l 516 1039 m 655 417 q 567 55 655 146 q 326 -25 489 -25 q 59 97 137 -25 q 0 369 0 192 l 0 748 l 200 748 l 201 369 q 218 222 201 269 q 326 142 245 142 q 439 247 410 142 q 455 422 455 304 l 455 748 l 655 748 l 655 417 \"},\"`\":{\"x_min\":0,\"x_max\":190,\"ha\":288,\"o\":\"m 190 654 l 0 654 l 0 830 q 55 970 0 909 q 190 1040 110 1031 l 190 969 q 111 922 134 952 q 88 836 88 892 l 190 836 l 190 654 \"},\"·\":{\"x_min\":0,\"x_max\":207,\"ha\":304,\"o\":\"m 207 528 l 0 528 l 0 735 l 207 735 l 207 528 \"},\"Υ\":{\"x_min\":-0.21875,\"x_max\":836.171875,\"ha\":914,\"o\":\"m 836 1013 l 532 376 l 532 0 l 322 0 l 322 376 l 0 1013 l 208 1013 l 427 576 l 626 1013 l 836 1013 \"},\"r\":{\"x_min\":0,\"x_max\":431.9375,\"ha\":513,\"o\":\"m 431 564 q 269 536 320 564 q 200 395 200 498 l 200 0 l 0 0 l 0 748 l 183 748 l 183 618 q 285 731 224 694 q 431 768 345 768 l 431 564 \"},\"x\":{\"x_min\":0,\"x_max\":738.890625,\"ha\":826,\"o\":\"m 738 0 l 504 0 l 366 238 l 230 0 l 0 0 l 252 382 l 11 749 l 238 749 l 372 522 l 502 749 l 725 749 l 488 384 l 738 0 \"},\"μ\":{\"x_min\":0,\"x_max\":647,\"ha\":754,\"o\":\"m 647 0 l 477 0 l 477 68 q 411 9 448 30 q 330 -11 374 -11 q 261 3 295 -11 q 199 43 226 18 l 199 -278 l 0 -278 l 0 749 l 199 749 l 199 358 q 216 222 199 268 q 322 152 244 152 q 435 240 410 152 q 448 401 448 283 l 448 749 l 647 749 l 647 0 \"},\"h\":{\"x_min\":0,\"x_max\":669,\"ha\":782,\"o\":\"m 669 0 l 469 0 l 469 390 q 449 526 469 472 q 353 607 420 607 q 248 554 295 607 q 201 441 201 501 l 201 0 l 0 0 l 0 1013 l 201 1013 l 201 665 q 303 743 245 715 q 425 772 362 772 q 609 684 542 772 q 669 484 669 605 l 669 0 \"},\".\":{\"x_min\":0,\"x_max\":206,\"ha\":303,\"o\":\"m 206 0 l 0 0 l 0 207 l 206 207 l 206 0 \"},\"φ\":{\"x_min\":-1,\"x_max\":921,\"ha\":990,\"o\":\"m 542 -278 l 367 -278 l 367 -22 q 99 92 200 -22 q -1 376 -1 206 q 72 627 -1 520 q 288 769 151 742 l 288 581 q 222 495 243 550 q 202 378 202 439 q 240 228 202 291 q 367 145 285 157 l 367 776 l 515 776 q 807 667 694 776 q 921 379 921 558 q 815 93 921 209 q 542 -22 709 -22 l 542 -278 m 542 145 q 672 225 625 145 q 713 381 713 291 q 671 536 713 470 q 542 611 624 611 l 542 145 \"},\";\":{\"x_min\":0,\"x_max\":208,\"ha\":306,\"o\":\"m 208 528 l 0 528 l 0 735 l 208 735 l 208 528 m 208 6 q 152 -151 208 -89 q 0 -238 96 -212 l 0 -158 q 87 -100 61 -136 q 113 0 113 -65 l 0 0 l 0 207 l 208 207 l 208 6 \"},\"f\":{\"x_min\":0,\"x_max\":424,\"ha\":525,\"o\":\"m 424 609 l 300 609 l 300 0 l 107 0 l 107 609 l 0 609 l 0 749 l 107 749 q 145 949 107 894 q 328 1019 193 1019 l 424 1015 l 424 855 l 362 855 q 312 841 324 855 q 300 797 300 827 q 300 773 300 786 q 300 749 300 761 l 424 749 l 424 609 \"},\"“\":{\"x_min\":0,\"x_max\":468,\"ha\":567,\"o\":\"m 190 631 l 0 631 l 0 807 q 55 947 0 885 q 190 1017 110 1010 l 190 947 q 88 813 88 921 l 190 813 l 190 631 m 468 631 l 278 631 l 278 807 q 333 947 278 885 q 468 1017 388 1010 l 468 947 q 366 813 366 921 l 468 813 l 468 631 \"},\"A\":{\"x_min\":0,\"x_max\":966.671875,\"ha\":1069,\"o\":\"m 966 0 l 747 0 l 679 208 l 286 208 l 218 0 l 0 0 l 361 1013 l 600 1013 l 966 0 m 623 376 l 480 810 l 340 376 l 623 376 \"},\"6\":{\"x_min\":57,\"x_max\":771,\"ha\":828,\"o\":\"m 744 734 l 544 734 q 500 802 533 776 q 425 828 466 828 q 315 769 359 828 q 264 571 264 701 q 451 638 343 638 q 691 537 602 638 q 771 315 771 449 q 683 79 771 176 q 420 -29 586 -29 q 134 123 227 -29 q 57 455 57 250 q 184 865 57 721 q 452 988 293 988 q 657 916 570 988 q 744 734 744 845 m 426 128 q 538 178 498 128 q 578 300 578 229 q 538 422 578 372 q 415 479 493 479 q 303 430 342 479 q 264 313 264 381 q 308 184 264 240 q 426 128 352 128 \"},\"‘\":{\"x_min\":0,\"x_max\":190,\"ha\":289,\"o\":\"m 190 631 l 0 631 l 0 807 q 55 947 0 885 q 190 1017 110 1010 l 190 947 q 88 813 88 921 l 190 813 l 190 631 \"},\"ϊ\":{\"x_min\":-55,\"x_max\":337,\"ha\":389,\"o\":\"m 337 810 l 208 810 l 208 952 l 337 952 l 337 810 m 74 810 l -55 810 l -55 952 l 74 952 l 74 810 m 242 0 l 42 0 l 42 748 l 242 748 l 242 0 \"},\"π\":{\"x_min\":0.5,\"x_max\":838.890625,\"ha\":938,\"o\":\"m 838 593 l 750 593 l 750 0 l 549 0 l 549 593 l 287 593 l 287 0 l 88 0 l 88 593 l 0 593 l 0 749 l 838 749 l 838 593 \"},\"ά\":{\"x_min\":-1,\"x_max\":722,\"ha\":835,\"o\":\"m 722 0 l 531 0 l 530 101 q 433 8 491 41 q 304 -25 375 -25 q 72 104 157 -25 q -1 372 -1 216 q 72 643 -1 530 q 308 775 158 775 q 433 744 375 775 q 528 656 491 713 l 528 749 l 722 749 l 722 0 m 361 601 q 233 527 277 601 q 196 375 196 464 q 232 224 196 288 q 358 144 277 144 q 487 217 441 144 q 528 370 528 281 q 489 523 528 457 q 361 601 443 601 m 579 1039 l 377 823 l 279 823 l 401 1039 l 579 1039 \"},\"O\":{\"x_min\":0,\"x_max\":994,\"ha\":1094,\"o\":\"m 497 -29 q 133 127 272 -29 q 0 505 0 277 q 131 883 0 733 q 497 1040 270 1040 q 860 883 721 1040 q 994 505 994 733 q 862 127 994 277 q 497 -29 723 -29 m 497 154 q 710 266 631 154 q 780 506 780 365 q 710 745 780 647 q 497 857 631 857 q 283 747 361 857 q 213 506 213 647 q 282 266 213 365 q 497 154 361 154 \"},\"n\":{\"x_min\":0,\"x_max\":669,\"ha\":782,\"o\":\"m 669 0 l 469 0 l 469 452 q 442 553 469 513 q 352 601 412 601 q 245 553 290 601 q 200 441 200 505 l 200 0 l 0 0 l 0 748 l 194 748 l 194 659 q 289 744 230 713 q 416 775 349 775 q 600 700 531 775 q 669 509 669 626 l 669 0 \"},\"3\":{\"x_min\":61,\"x_max\":767,\"ha\":828,\"o\":\"m 767 290 q 653 51 767 143 q 402 -32 548 -32 q 168 48 262 -32 q 61 300 61 140 l 250 300 q 298 173 250 219 q 405 132 343 132 q 514 169 471 132 q 563 282 563 211 q 491 405 563 369 q 343 432 439 432 l 343 568 q 472 592 425 568 q 534 701 534 626 q 493 793 534 758 q 398 829 453 829 q 306 789 344 829 q 268 669 268 749 l 80 669 q 182 909 80 823 q 410 986 274 986 q 633 916 540 986 q 735 719 735 840 q 703 608 735 656 q 615 522 672 561 q 727 427 687 486 q 767 290 767 369 \"},\"9\":{\"x_min\":58,\"x_max\":769,\"ha\":828,\"o\":\"m 769 492 q 646 90 769 232 q 384 -33 539 -33 q 187 35 271 -33 q 83 224 98 107 l 282 224 q 323 154 286 182 q 404 127 359 127 q 513 182 471 127 q 563 384 563 248 q 475 335 532 355 q 372 315 418 315 q 137 416 224 315 q 58 642 58 507 q 144 877 58 781 q 407 984 239 984 q 694 827 602 984 q 769 492 769 699 m 416 476 q 525 521 488 476 q 563 632 563 566 q 521 764 563 709 q 403 826 474 826 q 297 773 337 826 q 258 649 258 720 q 295 530 258 577 q 416 476 339 476 \"},\"l\":{\"x_min\":41,\"x_max\":240,\"ha\":363,\"o\":\"m 240 0 l 41 0 l 41 1013 l 240 1013 l 240 0 \"},\"¤\":{\"x_min\":40.265625,\"x_max\":727.203125,\"ha\":825,\"o\":\"m 727 792 l 594 659 q 620 552 620 609 q 598 459 620 504 l 725 331 l 620 224 l 491 352 q 382 331 443 331 q 273 352 322 331 l 144 224 l 40 330 l 167 459 q 147 552 147 501 q 172 658 147 608 l 40 794 l 147 898 l 283 759 q 383 776 330 776 q 482 759 434 776 l 620 898 l 727 792 m 383 644 q 308 617 334 644 q 283 551 283 590 q 309 489 283 517 q 381 462 335 462 q 456 488 430 462 q 482 554 482 515 q 455 616 482 588 q 383 644 429 644 \"},\"κ\":{\"x_min\":0,\"x_max\":691.84375,\"ha\":779,\"o\":\"m 691 0 l 479 0 l 284 343 l 196 252 l 196 0 l 0 0 l 0 749 l 196 749 l 196 490 l 440 749 l 677 749 l 416 479 l 691 0 \"},\"4\":{\"x_min\":53,\"x_max\":775.21875,\"ha\":828,\"o\":\"m 775 213 l 660 213 l 660 0 l 470 0 l 470 213 l 53 213 l 53 384 l 416 958 l 660 958 l 660 370 l 775 370 l 775 213 m 474 364 l 474 786 l 204 363 l 474 364 \"},\"p\":{\"x_min\":0,\"x_max\":722,\"ha\":824,\"o\":\"m 415 -26 q 287 4 346 -26 q 192 92 228 34 l 192 -298 l 0 -298 l 0 750 l 192 750 l 192 647 q 289 740 230 706 q 416 775 347 775 q 649 645 566 775 q 722 375 722 534 q 649 106 722 218 q 415 -26 564 -26 m 363 603 q 232 529 278 603 q 192 375 192 465 q 230 222 192 286 q 360 146 276 146 q 487 221 441 146 q 526 371 526 285 q 488 523 526 458 q 363 603 443 603 \"},\"‡\":{\"x_min\":0,\"x_max\":809,\"ha\":894,\"o\":\"m 299 621 l 0 621 l 0 804 l 299 804 l 299 1011 l 509 1011 l 509 804 l 809 804 l 809 621 l 509 621 l 509 387 l 809 387 l 809 205 l 509 205 l 509 0 l 299 0 l 299 205 l 0 205 l 0 387 l 299 387 l 299 621 \"},\"ψ\":{\"x_min\":0,\"x_max\":875,\"ha\":979,\"o\":\"m 522 142 q 657 274 620 163 q 671 352 671 316 l 671 748 l 875 748 l 875 402 q 806 134 875 240 q 525 -22 719 -1 l 525 -278 l 349 -278 l 349 -22 q 65 135 152 -1 q 0 402 0 238 l 0 748 l 204 748 l 204 352 q 231 240 204 295 q 353 142 272 159 l 353 922 l 524 922 l 522 142 \"},\"η\":{\"x_min\":0,\"x_max\":669,\"ha\":779,\"o\":\"m 669 -278 l 469 -278 l 469 390 q 448 526 469 473 q 348 606 417 606 q 244 553 288 606 q 201 441 201 501 l 201 0 l 0 0 l 0 749 l 201 749 l 201 665 q 301 744 244 715 q 423 774 359 774 q 606 685 538 774 q 669 484 669 603 l 669 -278 \"}},\"cssFontWeight\":\"bold\",\"ascender\":1216,\"underlinePosition\":-100,\"cssFontStyle\":\"normal\",\"boundingBox\":{\"yMin\":-333,\"xMin\":-162,\"yMax\":1216,\"xMax\":1681},\"resolution\":1000,\"original_font_information\":{\"postscript_name\":\"Helvetiker-Bold\",\"version_string\":\"Version 1.00 2004 initial release\",\"vendor_url\":\"http://www.magenta.gr\",\"full_font_name\":\"Helvetiker Bold\",\"font_family_name\":\"Helvetiker\",\"copyright\":\"Copyright (c) Magenta ltd, 2004.\",\"description\":\"\",\"trademark\":\"\",\"designer\":\"\",\"designer_url\":\"\",\"unique_font_identifier\":\"Magenta ltd:Helvetiker Bold:22-10-104\",\"license_url\":\"http://www.ellak.gr/fonts/MgOpen/license.html\",\"license_description\":\"Copyright (c) 2004 by MAGENTA Ltd. All Rights Reserved.\\r\\n\\r\\nPermission is hereby granted, free of charge, to any person obtaining a copy of the fonts accompanying this license (\\\"Fonts\\\") and associated documentation files (the \\\"Font Software\\\"), to reproduce and distribute the Font Software, including without limitation the rights to use, copy, merge, publish, distribute, and/or sell copies of the Font Software, and to permit persons to whom the Font Software is furnished to do so, subject to the following conditions: \\r\\n\\r\\nThe above copyright and this permission notice shall be included in all copies of one or more of the Font Software typefaces.\\r\\n\\r\\nThe Font Software may be modified, altered, or added to, and in particular the designs of glyphs or characters in the Fonts may be modified and additional glyphs or characters may be added to the Fonts, only if the fonts are renamed to names not containing the word \\\"MgOpen\\\", or if the modifications are accepted for inclusion in the Font Software itself by the each appointed Administrator.\\r\\n\\r\\nThis License becomes null and void to the extent applicable to Fonts or Font Software that has been modified and is distributed under the \\\"MgOpen\\\" name.\\r\\n\\r\\nThe Font Software may be sold as part of a larger software package but no copy of one or more of the Font Software typefaces may be sold by itself. \\r\\n\\r\\nTHE FONT SOFTWARE IS PROVIDED \\\"AS IS\\\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL MAGENTA OR PERSONS OR BODIES IN CHARGE OF ADMINISTRATION AND MAINTENANCE OF THE FONT SOFTWARE BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE.\",\"manufacturer_name\":\"Magenta ltd\",\"font_sub_family_name\":\"Bold\"},\"descender\":-334,\"familyName\":\"Helvetiker\",\"lineHeight\":1549,\"underlineThickness\":50}"
  },
  {
    "path": "examples/resources/fonts/typeface/helvetiker_regular.typeface.json",
    "content": "{\"glyphs\":{\"ο\":{\"x_min\":0,\"x_max\":712,\"ha\":815,\"o\":\"m 356 -25 q 96 88 192 -25 q 0 368 0 201 q 92 642 0 533 q 356 761 192 761 q 617 644 517 761 q 712 368 712 533 q 619 91 712 201 q 356 -25 520 -25 m 356 85 q 527 175 465 85 q 583 369 583 255 q 528 562 583 484 q 356 651 466 651 q 189 560 250 651 q 135 369 135 481 q 187 177 135 257 q 356 85 250 85 \"},\"S\":{\"x_min\":0,\"x_max\":788,\"ha\":890,\"o\":\"m 788 291 q 662 54 788 144 q 397 -26 550 -26 q 116 68 226 -26 q 0 337 0 168 l 131 337 q 200 152 131 220 q 384 85 269 85 q 557 129 479 85 q 650 270 650 183 q 490 429 650 379 q 194 513 341 470 q 33 739 33 584 q 142 964 33 881 q 388 1041 242 1041 q 644 957 543 1041 q 756 716 756 867 l 625 716 q 561 874 625 816 q 395 933 497 933 q 243 891 309 933 q 164 759 164 841 q 325 609 164 656 q 625 526 475 568 q 788 291 788 454 \"},\"¦\":{\"x_min\":343,\"x_max\":449,\"ha\":792,\"o\":\"m 449 462 l 343 462 l 343 986 l 449 986 l 449 462 m 449 -242 l 343 -242 l 343 280 l 449 280 l 449 -242 \"},\"/\":{\"x_min\":183.25,\"x_max\":608.328125,\"ha\":792,\"o\":\"m 608 1041 l 266 -129 l 183 -129 l 520 1041 l 608 1041 \"},\"Τ\":{\"x_min\":-0.4375,\"x_max\":777.453125,\"ha\":839,\"o\":\"m 777 893 l 458 893 l 458 0 l 319 0 l 319 892 l 0 892 l 0 1013 l 777 1013 l 777 893 \"},\"y\":{\"x_min\":0,\"x_max\":684.78125,\"ha\":771,\"o\":\"m 684 738 l 388 -83 q 311 -216 356 -167 q 173 -279 252 -279 q 97 -266 133 -279 l 97 -149 q 132 -155 109 -151 q 168 -160 155 -160 q 240 -114 213 -160 q 274 -26 248 -98 l 0 738 l 137 737 l 341 139 l 548 737 l 684 738 \"},\"Π\":{\"x_min\":0,\"x_max\":803,\"ha\":917,\"o\":\"m 803 0 l 667 0 l 667 886 l 140 886 l 140 0 l 0 0 l 0 1012 l 803 1012 l 803 0 \"},\"ΐ\":{\"x_min\":-111,\"x_max\":339,\"ha\":361,\"o\":\"m 339 800 l 229 800 l 229 925 l 339 925 l 339 800 m -1 800 l -111 800 l -111 925 l -1 925 l -1 800 m 284 3 q 233 -10 258 -5 q 182 -15 207 -15 q 85 26 119 -15 q 42 200 42 79 l 42 737 l 167 737 l 168 215 q 172 141 168 157 q 226 101 183 101 q 248 103 239 101 q 284 112 257 104 l 284 3 m 302 1040 l 113 819 l 30 819 l 165 1040 l 302 1040 \"},\"g\":{\"x_min\":0,\"x_max\":686,\"ha\":838,\"o\":\"m 686 34 q 586 -213 686 -121 q 331 -306 487 -306 q 131 -252 216 -306 q 31 -84 31 -190 l 155 -84 q 228 -174 166 -138 q 345 -207 284 -207 q 514 -109 454 -207 q 564 89 564 -27 q 461 6 521 36 q 335 -23 401 -23 q 88 100 184 -23 q 0 370 0 215 q 87 634 0 522 q 330 758 183 758 q 457 728 398 758 q 564 644 515 699 l 564 737 l 686 737 l 686 34 m 582 367 q 529 560 582 481 q 358 652 468 652 q 189 561 250 652 q 135 369 135 482 q 189 176 135 255 q 361 85 251 85 q 529 176 468 85 q 582 367 582 255 \"},\"²\":{\"x_min\":0,\"x_max\":442,\"ha\":539,\"o\":\"m 442 383 l 0 383 q 91 566 0 492 q 260 668 176 617 q 354 798 354 727 q 315 875 354 845 q 227 905 277 905 q 136 869 173 905 q 99 761 99 833 l 14 761 q 82 922 14 864 q 232 974 141 974 q 379 926 316 974 q 442 797 442 878 q 351 635 442 704 q 183 539 321 611 q 92 455 92 491 l 442 455 l 442 383 \"},\"–\":{\"x_min\":0,\"x_max\":705.5625,\"ha\":803,\"o\":\"m 705 334 l 0 334 l 0 410 l 705 410 l 705 334 \"},\"Κ\":{\"x_min\":0,\"x_max\":819.5625,\"ha\":893,\"o\":\"m 819 0 l 650 0 l 294 509 l 139 356 l 139 0 l 0 0 l 0 1013 l 139 1013 l 139 526 l 626 1013 l 809 1013 l 395 600 l 819 0 \"},\"ƒ\":{\"x_min\":-46.265625,\"x_max\":392,\"ha\":513,\"o\":\"m 392 651 l 259 651 l 79 -279 l -46 -278 l 134 651 l 14 651 l 14 751 l 135 751 q 151 948 135 900 q 304 1041 185 1041 q 334 1040 319 1041 q 392 1034 348 1039 l 392 922 q 337 931 360 931 q 271 883 287 931 q 260 793 260 853 l 260 751 l 392 751 l 392 651 \"},\"e\":{\"x_min\":0,\"x_max\":714,\"ha\":813,\"o\":\"m 714 326 l 140 326 q 200 157 140 227 q 359 87 260 87 q 488 130 431 87 q 561 245 545 174 l 697 245 q 577 48 670 123 q 358 -26 484 -26 q 97 85 195 -26 q 0 363 0 197 q 94 642 0 529 q 358 765 195 765 q 626 627 529 765 q 714 326 714 503 m 576 429 q 507 583 564 522 q 355 650 445 650 q 206 583 266 650 q 140 429 152 522 l 576 429 \"},\"ό\":{\"x_min\":0,\"x_max\":712,\"ha\":815,\"o\":\"m 356 -25 q 94 91 194 -25 q 0 368 0 202 q 92 642 0 533 q 356 761 192 761 q 617 644 517 761 q 712 368 712 533 q 619 91 712 201 q 356 -25 520 -25 m 356 85 q 527 175 465 85 q 583 369 583 255 q 528 562 583 484 q 356 651 466 651 q 189 560 250 651 q 135 369 135 481 q 187 177 135 257 q 356 85 250 85 m 576 1040 l 387 819 l 303 819 l 438 1040 l 576 1040 \"},\"J\":{\"x_min\":0,\"x_max\":588,\"ha\":699,\"o\":\"m 588 279 q 287 -26 588 -26 q 58 73 126 -26 q 0 327 0 158 l 133 327 q 160 172 133 227 q 288 96 198 96 q 426 171 391 96 q 449 336 449 219 l 449 1013 l 588 1013 l 588 279 \"},\"»\":{\"x_min\":-1,\"x_max\":503,\"ha\":601,\"o\":\"m 503 302 l 280 136 l 281 256 l 429 373 l 281 486 l 280 608 l 503 440 l 503 302 m 221 302 l 0 136 l 0 255 l 145 372 l 0 486 l -1 608 l 221 440 l 221 302 \"},\"©\":{\"x_min\":-3,\"x_max\":1008,\"ha\":1106,\"o\":\"m 502 -7 q 123 151 263 -7 q -3 501 -3 294 q 123 851 -3 706 q 502 1011 263 1011 q 881 851 739 1011 q 1008 501 1008 708 q 883 151 1008 292 q 502 -7 744 -7 m 502 60 q 830 197 709 60 q 940 501 940 322 q 831 805 940 681 q 502 944 709 944 q 174 805 296 944 q 65 501 65 680 q 173 197 65 320 q 502 60 294 60 m 741 394 q 661 246 731 302 q 496 190 591 190 q 294 285 369 190 q 228 497 228 370 q 295 714 228 625 q 499 813 370 813 q 656 762 588 813 q 733 625 724 711 l 634 625 q 589 704 629 673 q 498 735 550 735 q 377 666 421 735 q 334 504 334 597 q 374 340 334 408 q 490 272 415 272 q 589 304 549 272 q 638 394 628 337 l 741 394 \"},\"ώ\":{\"x_min\":0,\"x_max\":922,\"ha\":1030,\"o\":\"m 687 1040 l 498 819 l 415 819 l 549 1040 l 687 1040 m 922 339 q 856 97 922 203 q 650 -26 780 -26 q 538 9 587 -26 q 461 103 489 44 q 387 12 436 46 q 277 -22 339 -22 q 69 97 147 -22 q 0 338 0 202 q 45 551 0 444 q 161 737 84 643 l 302 737 q 175 552 219 647 q 124 336 124 446 q 155 179 124 248 q 275 88 197 88 q 375 163 341 88 q 400 294 400 219 l 400 572 l 524 572 l 524 294 q 561 135 524 192 q 643 88 591 88 q 762 182 719 88 q 797 341 797 257 q 745 555 797 450 q 619 737 705 637 l 760 737 q 874 551 835 640 q 922 339 922 444 \"},\"^\":{\"x_min\":193.0625,\"x_max\":598.609375,\"ha\":792,\"o\":\"m 598 772 l 515 772 l 395 931 l 277 772 l 193 772 l 326 1013 l 462 1013 l 598 772 \"},\"«\":{\"x_min\":0,\"x_max\":507.203125,\"ha\":604,\"o\":\"m 506 136 l 284 302 l 284 440 l 506 608 l 507 485 l 360 371 l 506 255 l 506 136 m 222 136 l 0 302 l 0 440 l 222 608 l 221 486 l 73 373 l 222 256 l 222 136 \"},\"D\":{\"x_min\":0,\"x_max\":828,\"ha\":935,\"o\":\"m 389 1013 q 714 867 593 1013 q 828 521 828 729 q 712 161 828 309 q 382 0 587 0 l 0 0 l 0 1013 l 389 1013 m 376 124 q 607 247 523 124 q 681 510 681 355 q 607 771 681 662 q 376 896 522 896 l 139 896 l 139 124 l 376 124 \"},\"∙\":{\"x_min\":0,\"x_max\":142,\"ha\":239,\"o\":\"m 142 585 l 0 585 l 0 738 l 142 738 l 142 585 \"},\"ÿ\":{\"x_min\":0,\"x_max\":47,\"ha\":125,\"o\":\"m 47 3 q 37 -7 47 -7 q 28 0 30 -7 q 39 -4 32 -4 q 45 3 45 -1 l 37 0 q 28 9 28 0 q 39 19 28 19 l 47 16 l 47 19 l 47 3 m 37 1 q 44 8 44 1 q 37 16 44 16 q 30 8 30 16 q 37 1 30 1 m 26 1 l 23 22 l 14 0 l 3 22 l 3 3 l 0 25 l 13 1 l 22 25 l 26 1 \"},\"w\":{\"x_min\":0,\"x_max\":1009.71875,\"ha\":1100,\"o\":\"m 1009 738 l 783 0 l 658 0 l 501 567 l 345 0 l 222 0 l 0 738 l 130 738 l 284 174 l 432 737 l 576 738 l 721 173 l 881 737 l 1009 738 \"},\"$\":{\"x_min\":0,\"x_max\":700,\"ha\":793,\"o\":\"m 664 717 l 542 717 q 490 825 531 785 q 381 872 450 865 l 381 551 q 620 446 540 522 q 700 241 700 370 q 618 45 700 116 q 381 -25 536 -25 l 381 -152 l 307 -152 l 307 -25 q 81 62 162 -25 q 0 297 0 149 l 124 297 q 169 146 124 204 q 307 81 215 89 l 307 441 q 80 536 148 469 q 13 725 13 603 q 96 910 13 839 q 307 982 180 982 l 307 1077 l 381 1077 l 381 982 q 574 917 494 982 q 664 717 664 845 m 307 565 l 307 872 q 187 831 233 872 q 142 724 142 791 q 180 618 142 656 q 307 565 218 580 m 381 76 q 562 237 562 96 q 517 361 562 313 q 381 423 472 409 l 381 76 \"},\"\\\\\":{\"x_min\":-0.015625,\"x_max\":425.0625,\"ha\":522,\"o\":\"m 425 -129 l 337 -129 l 0 1041 l 83 1041 l 425 -129 \"},\"µ\":{\"x_min\":0,\"x_max\":697.21875,\"ha\":747,\"o\":\"m 697 -4 q 629 -14 658 -14 q 498 97 513 -14 q 422 9 470 41 q 313 -23 374 -23 q 207 4 258 -23 q 119 81 156 32 l 119 -278 l 0 -278 l 0 738 l 124 738 l 124 343 q 165 173 124 246 q 308 83 216 83 q 452 178 402 83 q 493 359 493 255 l 493 738 l 617 738 l 617 214 q 623 136 617 160 q 673 92 637 92 q 697 96 684 92 l 697 -4 \"},\"Ι\":{\"x_min\":42,\"x_max\":181,\"ha\":297,\"o\":\"m 181 0 l 42 0 l 42 1013 l 181 1013 l 181 0 \"},\"Ύ\":{\"x_min\":0,\"x_max\":1144.5,\"ha\":1214,\"o\":\"m 1144 1012 l 807 416 l 807 0 l 667 0 l 667 416 l 325 1012 l 465 1012 l 736 533 l 1004 1012 l 1144 1012 m 277 1040 l 83 799 l 0 799 l 140 1040 l 277 1040 \"},\"’\":{\"x_min\":0,\"x_max\":139,\"ha\":236,\"o\":\"m 139 851 q 102 737 139 784 q 0 669 65 690 l 0 734 q 59 787 42 741 q 72 873 72 821 l 0 873 l 0 1013 l 139 1013 l 139 851 \"},\"Ν\":{\"x_min\":0,\"x_max\":801,\"ha\":915,\"o\":\"m 801 0 l 651 0 l 131 822 l 131 0 l 0 0 l 0 1013 l 151 1013 l 670 191 l 670 1013 l 801 1013 l 801 0 \"},\"-\":{\"x_min\":8.71875,\"x_max\":350.390625,\"ha\":478,\"o\":\"m 350 317 l 8 317 l 8 428 l 350 428 l 350 317 \"},\"Q\":{\"x_min\":0,\"x_max\":968,\"ha\":1072,\"o\":\"m 954 5 l 887 -79 l 744 35 q 622 -11 687 2 q 483 -26 556 -26 q 127 130 262 -26 q 0 504 0 279 q 127 880 0 728 q 484 1041 262 1041 q 841 884 708 1041 q 968 507 968 735 q 933 293 968 398 q 832 104 899 188 l 954 5 m 723 191 q 802 330 777 248 q 828 499 828 412 q 744 790 828 673 q 483 922 650 922 q 228 791 322 922 q 142 505 142 673 q 227 221 142 337 q 487 91 323 91 q 632 123 566 91 l 520 215 l 587 301 l 723 191 \"},\"ς\":{\"x_min\":1,\"x_max\":676.28125,\"ha\":740,\"o\":\"m 676 460 l 551 460 q 498 595 542 546 q 365 651 448 651 q 199 578 263 651 q 136 401 136 505 q 266 178 136 241 q 508 106 387 142 q 640 -50 640 62 q 625 -158 640 -105 q 583 -278 611 -211 l 465 -278 q 498 -182 490 -211 q 515 -80 515 -126 q 381 12 515 -15 q 134 91 197 51 q 1 388 1 179 q 100 651 1 542 q 354 761 199 761 q 587 680 498 761 q 676 460 676 599 \"},\"M\":{\"x_min\":0,\"x_max\":954,\"ha\":1067,\"o\":\"m 954 0 l 819 0 l 819 869 l 537 0 l 405 0 l 128 866 l 128 0 l 0 0 l 0 1013 l 200 1013 l 472 160 l 757 1013 l 954 1013 l 954 0 \"},\"Ψ\":{\"x_min\":0,\"x_max\":1006,\"ha\":1094,\"o\":\"m 1006 678 q 914 319 1006 429 q 571 200 814 200 l 571 0 l 433 0 l 433 200 q 92 319 194 200 q 0 678 0 429 l 0 1013 l 139 1013 l 139 679 q 191 417 139 492 q 433 326 255 326 l 433 1013 l 571 1013 l 571 326 l 580 326 q 813 423 747 326 q 868 679 868 502 l 868 1013 l 1006 1013 l 1006 678 \"},\"C\":{\"x_min\":0,\"x_max\":886,\"ha\":944,\"o\":\"m 886 379 q 760 87 886 201 q 455 -26 634 -26 q 112 136 236 -26 q 0 509 0 283 q 118 882 0 737 q 469 1041 245 1041 q 748 955 630 1041 q 879 708 879 859 l 745 708 q 649 862 724 805 q 473 920 573 920 q 219 791 312 920 q 136 509 136 675 q 217 229 136 344 q 470 99 311 99 q 672 179 591 99 q 753 379 753 259 l 886 379 \"},\"!\":{\"x_min\":0,\"x_max\":138,\"ha\":236,\"o\":\"m 138 684 q 116 409 138 629 q 105 244 105 299 l 33 244 q 16 465 33 313 q 0 684 0 616 l 0 1013 l 138 1013 l 138 684 m 138 0 l 0 0 l 0 151 l 138 151 l 138 0 \"},\"{\":{\"x_min\":0,\"x_max\":480.5625,\"ha\":578,\"o\":\"m 480 -286 q 237 -213 303 -286 q 187 -45 187 -159 q 194 48 187 -15 q 201 141 201 112 q 164 264 201 225 q 0 314 118 314 l 0 417 q 164 471 119 417 q 201 605 201 514 q 199 665 201 644 q 193 772 193 769 q 241 941 193 887 q 480 1015 308 1015 l 480 915 q 336 866 375 915 q 306 742 306 828 q 310 662 306 717 q 314 577 314 606 q 288 452 314 500 q 176 365 256 391 q 289 275 257 337 q 314 143 314 226 q 313 84 314 107 q 310 -11 310 -5 q 339 -131 310 -94 q 480 -182 377 -182 l 480 -286 \"},\"X\":{\"x_min\":-0.015625,\"x_max\":854.15625,\"ha\":940,\"o\":\"m 854 0 l 683 0 l 423 409 l 166 0 l 0 0 l 347 519 l 18 1013 l 186 1013 l 428 637 l 675 1013 l 836 1013 l 504 520 l 854 0 \"},\"#\":{\"x_min\":0,\"x_max\":963.890625,\"ha\":1061,\"o\":\"m 963 690 l 927 590 l 719 590 l 655 410 l 876 410 l 840 310 l 618 310 l 508 -3 l 393 -2 l 506 309 l 329 310 l 215 -2 l 102 -3 l 212 310 l 0 310 l 36 410 l 248 409 l 312 590 l 86 590 l 120 690 l 347 690 l 459 1006 l 573 1006 l 462 690 l 640 690 l 751 1006 l 865 1006 l 754 690 l 963 690 m 606 590 l 425 590 l 362 410 l 543 410 l 606 590 \"},\"ι\":{\"x_min\":42,\"x_max\":284,\"ha\":361,\"o\":\"m 284 3 q 233 -10 258 -5 q 182 -15 207 -15 q 85 26 119 -15 q 42 200 42 79 l 42 738 l 167 738 l 168 215 q 172 141 168 157 q 226 101 183 101 q 248 103 239 101 q 284 112 257 104 l 284 3 \"},\"Ά\":{\"x_min\":0,\"x_max\":906.953125,\"ha\":982,\"o\":\"m 283 1040 l 88 799 l 5 799 l 145 1040 l 283 1040 m 906 0 l 756 0 l 650 303 l 251 303 l 143 0 l 0 0 l 376 1012 l 529 1012 l 906 0 m 609 421 l 452 866 l 293 421 l 609 421 \"},\")\":{\"x_min\":0,\"x_max\":318,\"ha\":415,\"o\":\"m 318 365 q 257 25 318 191 q 87 -290 197 -141 l 0 -290 q 140 21 93 -128 q 193 360 193 189 q 141 704 193 537 q 0 1024 97 850 l 87 1024 q 257 706 197 871 q 318 365 318 542 \"},\"ε\":{\"x_min\":0,\"x_max\":634.71875,\"ha\":714,\"o\":\"m 634 234 q 527 38 634 110 q 300 -25 433 -25 q 98 29 183 -25 q 0 204 0 93 q 37 314 0 265 q 128 390 67 353 q 56 460 82 419 q 26 555 26 505 q 114 712 26 654 q 295 763 191 763 q 499 700 416 763 q 589 515 589 631 l 478 515 q 419 618 464 580 q 307 657 374 657 q 207 630 253 657 q 151 547 151 598 q 238 445 151 469 q 389 434 280 434 l 389 331 l 349 331 q 206 315 255 331 q 125 210 125 287 q 183 107 125 145 q 302 76 233 76 q 436 117 379 76 q 509 234 493 159 l 634 234 \"},\"Δ\":{\"x_min\":0,\"x_max\":952.78125,\"ha\":1028,\"o\":\"m 952 0 l 0 0 l 400 1013 l 551 1013 l 952 0 m 762 124 l 476 867 l 187 124 l 762 124 \"},\"}\":{\"x_min\":0,\"x_max\":481,\"ha\":578,\"o\":\"m 481 314 q 318 262 364 314 q 282 136 282 222 q 284 65 282 97 q 293 -58 293 -48 q 241 -217 293 -166 q 0 -286 174 -286 l 0 -182 q 143 -130 105 -182 q 171 -2 171 -93 q 168 81 171 22 q 165 144 165 140 q 188 275 165 229 q 306 365 220 339 q 191 455 224 391 q 165 588 165 505 q 168 681 165 624 q 171 742 171 737 q 141 865 171 827 q 0 915 102 915 l 0 1015 q 243 942 176 1015 q 293 773 293 888 q 287 675 293 741 q 282 590 282 608 q 318 466 282 505 q 481 417 364 417 l 481 314 \"},\"‰\":{\"x_min\":-3,\"x_max\":1672,\"ha\":1821,\"o\":\"m 846 0 q 664 76 732 0 q 603 244 603 145 q 662 412 603 344 q 846 489 729 489 q 1027 412 959 489 q 1089 244 1089 343 q 1029 76 1089 144 q 846 0 962 0 m 845 103 q 945 143 910 103 q 981 243 981 184 q 947 340 981 301 q 845 385 910 385 q 745 342 782 385 q 709 243 709 300 q 742 147 709 186 q 845 103 781 103 m 888 986 l 284 -25 l 199 -25 l 803 986 l 888 986 m 241 468 q 58 545 126 468 q -3 715 -3 615 q 56 881 -3 813 q 238 958 124 958 q 421 881 353 958 q 483 712 483 813 q 423 544 483 612 q 241 468 356 468 m 241 855 q 137 811 175 855 q 100 710 100 768 q 136 612 100 653 q 240 572 172 572 q 344 614 306 572 q 382 713 382 656 q 347 810 382 771 q 241 855 308 855 m 1428 0 q 1246 76 1314 0 q 1185 244 1185 145 q 1244 412 1185 344 q 1428 489 1311 489 q 1610 412 1542 489 q 1672 244 1672 343 q 1612 76 1672 144 q 1428 0 1545 0 m 1427 103 q 1528 143 1492 103 q 1564 243 1564 184 q 1530 340 1564 301 q 1427 385 1492 385 q 1327 342 1364 385 q 1291 243 1291 300 q 1324 147 1291 186 q 1427 103 1363 103 \"},\"a\":{\"x_min\":0,\"x_max\":698.609375,\"ha\":794,\"o\":\"m 698 0 q 661 -12 679 -7 q 615 -17 643 -17 q 536 12 564 -17 q 500 96 508 41 q 384 6 456 37 q 236 -25 312 -25 q 65 31 130 -25 q 0 194 0 88 q 118 390 0 334 q 328 435 180 420 q 488 483 476 451 q 495 523 495 504 q 442 619 495 584 q 325 654 389 654 q 209 617 257 654 q 152 513 161 580 l 33 513 q 123 705 33 633 q 332 772 207 772 q 528 712 448 772 q 617 531 617 645 l 617 163 q 624 108 617 126 q 664 90 632 90 l 698 94 l 698 0 m 491 262 l 491 372 q 272 329 350 347 q 128 201 128 294 q 166 113 128 144 q 264 83 205 83 q 414 130 346 83 q 491 262 491 183 \"},\"—\":{\"x_min\":0,\"x_max\":941.671875,\"ha\":1039,\"o\":\"m 941 334 l 0 334 l 0 410 l 941 410 l 941 334 \"},\"=\":{\"x_min\":8.71875,\"x_max\":780.953125,\"ha\":792,\"o\":\"m 780 510 l 8 510 l 8 606 l 780 606 l 780 510 m 780 235 l 8 235 l 8 332 l 780 332 l 780 235 \"},\"N\":{\"x_min\":0,\"x_max\":801,\"ha\":914,\"o\":\"m 801 0 l 651 0 l 131 823 l 131 0 l 0 0 l 0 1013 l 151 1013 l 670 193 l 670 1013 l 801 1013 l 801 0 \"},\"ρ\":{\"x_min\":0,\"x_max\":712,\"ha\":797,\"o\":\"m 712 369 q 620 94 712 207 q 362 -26 521 -26 q 230 2 292 -26 q 119 83 167 30 l 119 -278 l 0 -278 l 0 362 q 91 643 0 531 q 355 764 190 764 q 617 647 517 764 q 712 369 712 536 m 583 366 q 530 559 583 480 q 359 651 469 651 q 190 562 252 651 q 135 370 135 483 q 189 176 135 257 q 359 85 250 85 q 528 175 466 85 q 583 366 583 254 \"},\"2\":{\"x_min\":59,\"x_max\":731,\"ha\":792,\"o\":\"m 731 0 l 59 0 q 197 314 59 188 q 457 487 199 315 q 598 691 598 580 q 543 819 598 772 q 411 867 488 867 q 272 811 328 867 q 209 630 209 747 l 81 630 q 182 901 81 805 q 408 986 271 986 q 629 909 536 986 q 731 694 731 826 q 613 449 731 541 q 378 316 495 383 q 201 122 235 234 l 731 122 l 731 0 \"},\"¯\":{\"x_min\":0,\"x_max\":941.671875,\"ha\":938,\"o\":\"m 941 1033 l 0 1033 l 0 1109 l 941 1109 l 941 1033 \"},\"Z\":{\"x_min\":0,\"x_max\":779,\"ha\":849,\"o\":\"m 779 0 l 0 0 l 0 113 l 621 896 l 40 896 l 40 1013 l 779 1013 l 778 887 l 171 124 l 779 124 l 779 0 \"},\"u\":{\"x_min\":0,\"x_max\":617,\"ha\":729,\"o\":\"m 617 0 l 499 0 l 499 110 q 391 10 460 45 q 246 -25 322 -25 q 61 58 127 -25 q 0 258 0 136 l 0 738 l 125 738 l 125 284 q 156 148 125 202 q 273 82 197 82 q 433 165 369 82 q 493 340 493 243 l 493 738 l 617 738 l 617 0 \"},\"k\":{\"x_min\":0,\"x_max\":612.484375,\"ha\":697,\"o\":\"m 612 738 l 338 465 l 608 0 l 469 0 l 251 382 l 121 251 l 121 0 l 0 0 l 0 1013 l 121 1013 l 121 402 l 456 738 l 612 738 \"},\"Η\":{\"x_min\":0,\"x_max\":803,\"ha\":917,\"o\":\"m 803 0 l 667 0 l 667 475 l 140 475 l 140 0 l 0 0 l 0 1013 l 140 1013 l 140 599 l 667 599 l 667 1013 l 803 1013 l 803 0 \"},\"Α\":{\"x_min\":0,\"x_max\":906.953125,\"ha\":985,\"o\":\"m 906 0 l 756 0 l 650 303 l 251 303 l 143 0 l 0 0 l 376 1013 l 529 1013 l 906 0 m 609 421 l 452 866 l 293 421 l 609 421 \"},\"s\":{\"x_min\":0,\"x_max\":604,\"ha\":697,\"o\":\"m 604 217 q 501 36 604 104 q 292 -23 411 -23 q 86 43 166 -23 q 0 238 0 114 l 121 237 q 175 122 121 164 q 300 85 223 85 q 415 112 363 85 q 479 207 479 147 q 361 309 479 276 q 140 372 141 370 q 21 544 21 426 q 111 708 21 647 q 298 761 190 761 q 492 705 413 761 q 583 531 583 643 l 462 531 q 412 625 462 594 q 298 657 363 657 q 199 636 242 657 q 143 558 143 608 q 262 454 143 486 q 484 394 479 397 q 604 217 604 341 \"},\"B\":{\"x_min\":0,\"x_max\":778,\"ha\":876,\"o\":\"m 580 546 q 724 469 670 535 q 778 311 778 403 q 673 83 778 171 q 432 0 575 0 l 0 0 l 0 1013 l 411 1013 q 629 957 541 1013 q 732 768 732 892 q 691 633 732 693 q 580 546 650 572 m 393 899 l 139 899 l 139 588 l 379 588 q 521 624 462 588 q 592 744 592 667 q 531 859 592 819 q 393 899 471 899 m 419 124 q 566 169 504 124 q 635 303 635 219 q 559 436 635 389 q 402 477 494 477 l 139 477 l 139 124 l 419 124 \"},\"…\":{\"x_min\":0,\"x_max\":614,\"ha\":708,\"o\":\"m 142 0 l 0 0 l 0 151 l 142 151 l 142 0 m 378 0 l 236 0 l 236 151 l 378 151 l 378 0 m 614 0 l 472 0 l 472 151 l 614 151 l 614 0 \"},\"?\":{\"x_min\":0,\"x_max\":607,\"ha\":704,\"o\":\"m 607 777 q 543 599 607 674 q 422 474 482 537 q 357 272 357 391 l 236 272 q 297 487 236 395 q 411 619 298 490 q 474 762 474 691 q 422 885 474 838 q 301 933 371 933 q 179 880 228 933 q 124 706 124 819 l 0 706 q 94 963 0 872 q 302 1044 177 1044 q 511 973 423 1044 q 607 777 607 895 m 370 0 l 230 0 l 230 151 l 370 151 l 370 0 \"},\"H\":{\"x_min\":0,\"x_max\":803,\"ha\":915,\"o\":\"m 803 0 l 667 0 l 667 475 l 140 475 l 140 0 l 0 0 l 0 1013 l 140 1013 l 140 599 l 667 599 l 667 1013 l 803 1013 l 803 0 \"},\"ν\":{\"x_min\":0,\"x_max\":675,\"ha\":761,\"o\":\"m 675 738 l 404 0 l 272 0 l 0 738 l 133 738 l 340 147 l 541 738 l 675 738 \"},\"c\":{\"x_min\":1,\"x_max\":701.390625,\"ha\":775,\"o\":\"m 701 264 q 584 53 681 133 q 353 -26 487 -26 q 91 91 188 -26 q 1 370 1 201 q 92 645 1 537 q 353 761 190 761 q 572 688 479 761 q 690 493 666 615 l 556 493 q 487 606 545 562 q 356 650 428 650 q 186 563 246 650 q 134 372 134 487 q 188 179 134 258 q 359 88 250 88 q 492 136 437 88 q 566 264 548 185 l 701 264 \"},\"¶\":{\"x_min\":0,\"x_max\":566.671875,\"ha\":678,\"o\":\"m 21 892 l 52 892 l 98 761 l 145 892 l 176 892 l 178 741 l 157 741 l 157 867 l 108 741 l 88 741 l 40 871 l 40 741 l 21 741 l 21 892 m 308 854 l 308 731 q 252 691 308 691 q 227 691 240 691 q 207 696 213 695 l 207 712 l 253 706 q 288 733 288 706 l 288 763 q 244 741 279 741 q 193 797 193 741 q 261 860 193 860 q 287 860 273 860 q 308 854 302 855 m 288 842 l 263 843 q 213 796 213 843 q 248 756 213 756 q 288 796 288 756 l 288 842 m 566 988 l 502 988 l 502 -1 l 439 -1 l 439 988 l 317 988 l 317 -1 l 252 -1 l 252 602 q 81 653 155 602 q 0 805 0 711 q 101 989 0 918 q 309 1053 194 1053 l 566 1053 l 566 988 \"},\"β\":{\"x_min\":0,\"x_max\":660,\"ha\":745,\"o\":\"m 471 550 q 610 450 561 522 q 660 280 660 378 q 578 64 660 151 q 367 -22 497 -22 q 239 5 299 -22 q 126 82 178 32 l 126 -278 l 0 -278 l 0 593 q 54 903 0 801 q 318 1042 127 1042 q 519 964 436 1042 q 603 771 603 887 q 567 644 603 701 q 471 550 532 586 m 337 79 q 476 138 418 79 q 535 279 535 198 q 427 437 535 386 q 226 477 344 477 l 226 583 q 398 620 329 583 q 486 762 486 668 q 435 884 486 833 q 312 935 384 935 q 169 861 219 935 q 126 698 126 797 l 126 362 q 170 169 126 242 q 337 79 224 79 \"},\"Μ\":{\"x_min\":0,\"x_max\":954,\"ha\":1068,\"o\":\"m 954 0 l 819 0 l 819 868 l 537 0 l 405 0 l 128 865 l 128 0 l 0 0 l 0 1013 l 199 1013 l 472 158 l 758 1013 l 954 1013 l 954 0 \"},\"Ό\":{\"x_min\":0.109375,\"x_max\":1120,\"ha\":1217,\"o\":\"m 1120 505 q 994 132 1120 282 q 642 -29 861 -29 q 290 130 422 -29 q 167 505 167 280 q 294 883 167 730 q 650 1046 430 1046 q 999 882 868 1046 q 1120 505 1120 730 m 977 504 q 896 784 977 669 q 644 915 804 915 q 391 785 484 915 q 307 504 307 669 q 391 224 307 339 q 644 95 486 95 q 894 224 803 95 q 977 504 977 339 m 277 1040 l 83 799 l 0 799 l 140 1040 l 277 1040 \"},\"Ή\":{\"x_min\":0,\"x_max\":1158,\"ha\":1275,\"o\":\"m 1158 0 l 1022 0 l 1022 475 l 496 475 l 496 0 l 356 0 l 356 1012 l 496 1012 l 496 599 l 1022 599 l 1022 1012 l 1158 1012 l 1158 0 m 277 1040 l 83 799 l 0 799 l 140 1040 l 277 1040 \"},\"•\":{\"x_min\":0,\"x_max\":663.890625,\"ha\":775,\"o\":\"m 663 529 q 566 293 663 391 q 331 196 469 196 q 97 294 194 196 q 0 529 0 393 q 96 763 0 665 q 331 861 193 861 q 566 763 469 861 q 663 529 663 665 \"},\"¥\":{\"x_min\":0.1875,\"x_max\":819.546875,\"ha\":886,\"o\":\"m 563 561 l 697 561 l 696 487 l 520 487 l 482 416 l 482 380 l 697 380 l 695 308 l 482 308 l 482 0 l 342 0 l 342 308 l 125 308 l 125 380 l 342 380 l 342 417 l 303 487 l 125 487 l 125 561 l 258 561 l 0 1013 l 140 1013 l 411 533 l 679 1013 l 819 1013 l 563 561 \"},\"(\":{\"x_min\":0,\"x_max\":318.0625,\"ha\":415,\"o\":\"m 318 -290 l 230 -290 q 61 23 122 -142 q 0 365 0 190 q 62 712 0 540 q 230 1024 119 869 l 318 1024 q 175 705 219 853 q 125 360 125 542 q 176 22 125 187 q 318 -290 223 -127 \"},\"U\":{\"x_min\":0,\"x_max\":796,\"ha\":904,\"o\":\"m 796 393 q 681 93 796 212 q 386 -25 566 -25 q 101 95 208 -25 q 0 393 0 211 l 0 1013 l 138 1013 l 138 391 q 204 191 138 270 q 394 107 276 107 q 586 191 512 107 q 656 391 656 270 l 656 1013 l 796 1013 l 796 393 \"},\"γ\":{\"x_min\":0.5,\"x_max\":744.953125,\"ha\":822,\"o\":\"m 744 737 l 463 54 l 463 -278 l 338 -278 l 338 54 l 154 495 q 104 597 124 569 q 13 651 67 651 l 0 651 l 0 751 l 39 753 q 168 711 121 753 q 242 594 207 676 l 403 208 l 617 737 l 744 737 \"},\"α\":{\"x_min\":0,\"x_max\":765.5625,\"ha\":809,\"o\":\"m 765 -4 q 698 -14 726 -14 q 564 97 586 -14 q 466 7 525 40 q 337 -26 407 -26 q 88 98 186 -26 q 0 369 0 212 q 88 637 0 525 q 337 760 184 760 q 465 728 407 760 q 563 637 524 696 l 563 739 l 685 739 l 685 222 q 693 141 685 168 q 748 94 708 94 q 765 96 760 94 l 765 -4 m 584 371 q 531 562 584 485 q 360 653 470 653 q 192 566 254 653 q 135 379 135 489 q 186 181 135 261 q 358 84 247 84 q 528 176 465 84 q 584 371 584 260 \"},\"F\":{\"x_min\":0,\"x_max\":683.328125,\"ha\":717,\"o\":\"m 683 888 l 140 888 l 140 583 l 613 583 l 613 458 l 140 458 l 140 0 l 0 0 l 0 1013 l 683 1013 l 683 888 \"},\"­\":{\"x_min\":0,\"x_max\":705.5625,\"ha\":803,\"o\":\"m 705 334 l 0 334 l 0 410 l 705 410 l 705 334 \"},\":\":{\"x_min\":0,\"x_max\":142,\"ha\":239,\"o\":\"m 142 585 l 0 585 l 0 738 l 142 738 l 142 585 m 142 0 l 0 0 l 0 151 l 142 151 l 142 0 \"},\"Χ\":{\"x_min\":0,\"x_max\":854.171875,\"ha\":935,\"o\":\"m 854 0 l 683 0 l 423 409 l 166 0 l 0 0 l 347 519 l 18 1013 l 186 1013 l 427 637 l 675 1013 l 836 1013 l 504 521 l 854 0 \"},\"*\":{\"x_min\":116,\"x_max\":674,\"ha\":792,\"o\":\"m 674 768 l 475 713 l 610 544 l 517 477 l 394 652 l 272 478 l 178 544 l 314 713 l 116 766 l 153 876 l 341 812 l 342 1013 l 446 1013 l 446 811 l 635 874 l 674 768 \"},\"†\":{\"x_min\":0,\"x_max\":777,\"ha\":835,\"o\":\"m 458 804 l 777 804 l 777 683 l 458 683 l 458 0 l 319 0 l 319 681 l 0 683 l 0 804 l 319 804 l 319 1015 l 458 1013 l 458 804 \"},\"°\":{\"x_min\":0,\"x_max\":347,\"ha\":444,\"o\":\"m 173 802 q 43 856 91 802 q 0 977 0 905 q 45 1101 0 1049 q 173 1153 90 1153 q 303 1098 255 1153 q 347 977 347 1049 q 303 856 347 905 q 173 802 256 802 m 173 884 q 238 910 214 884 q 262 973 262 937 q 239 1038 262 1012 q 173 1064 217 1064 q 108 1037 132 1064 q 85 973 85 1010 q 108 910 85 937 q 173 884 132 884 \"},\"V\":{\"x_min\":0,\"x_max\":862.71875,\"ha\":940,\"o\":\"m 862 1013 l 505 0 l 361 0 l 0 1013 l 143 1013 l 434 165 l 718 1012 l 862 1013 \"},\"Ξ\":{\"x_min\":0,\"x_max\":734.71875,\"ha\":763,\"o\":\"m 723 889 l 9 889 l 9 1013 l 723 1013 l 723 889 m 673 463 l 61 463 l 61 589 l 673 589 l 673 463 m 734 0 l 0 0 l 0 124 l 734 124 l 734 0 \"},\" \":{\"x_min\":0,\"x_max\":0,\"ha\":853},\"Ϋ\":{\"x_min\":0.328125,\"x_max\":819.515625,\"ha\":889,\"o\":\"m 588 1046 l 460 1046 l 460 1189 l 588 1189 l 588 1046 m 360 1046 l 232 1046 l 232 1189 l 360 1189 l 360 1046 m 819 1012 l 482 416 l 482 0 l 342 0 l 342 416 l 0 1012 l 140 1012 l 411 533 l 679 1012 l 819 1012 \"},\"0\":{\"x_min\":73,\"x_max\":715,\"ha\":792,\"o\":\"m 394 -29 q 153 129 242 -29 q 73 479 73 272 q 152 829 73 687 q 394 989 241 989 q 634 829 545 989 q 715 479 715 684 q 635 129 715 270 q 394 -29 546 -29 m 394 89 q 546 211 489 89 q 598 479 598 322 q 548 748 598 640 q 394 871 491 871 q 241 748 298 871 q 190 479 190 637 q 239 211 190 319 q 394 89 296 89 \"},\"”\":{\"x_min\":0,\"x_max\":347,\"ha\":454,\"o\":\"m 139 851 q 102 737 139 784 q 0 669 65 690 l 0 734 q 59 787 42 741 q 72 873 72 821 l 0 873 l 0 1013 l 139 1013 l 139 851 m 347 851 q 310 737 347 784 q 208 669 273 690 l 208 734 q 267 787 250 741 q 280 873 280 821 l 208 873 l 208 1013 l 347 1013 l 347 851 \"},\"@\":{\"x_min\":0,\"x_max\":1260,\"ha\":1357,\"o\":\"m 1098 -45 q 877 -160 1001 -117 q 633 -203 752 -203 q 155 -29 327 -203 q 0 360 0 127 q 176 802 0 616 q 687 1008 372 1008 q 1123 854 969 1008 q 1260 517 1260 718 q 1155 216 1260 341 q 868 82 1044 82 q 772 106 801 82 q 737 202 737 135 q 647 113 700 144 q 527 82 594 82 q 367 147 420 82 q 314 312 314 212 q 401 565 314 452 q 639 690 498 690 q 810 588 760 690 l 849 668 l 938 668 q 877 441 900 532 q 833 226 833 268 q 853 182 833 198 q 902 167 873 167 q 1088 272 1012 167 q 1159 512 1159 372 q 1051 793 1159 681 q 687 925 925 925 q 248 747 415 925 q 97 361 97 586 q 226 26 97 159 q 627 -122 370 -122 q 856 -87 737 -122 q 1061 8 976 -53 l 1098 -45 m 786 488 q 738 580 777 545 q 643 615 700 615 q 483 517 548 615 q 425 322 425 430 q 457 203 425 250 q 552 156 490 156 q 722 273 665 156 q 786 488 738 309 \"},\"Ί\":{\"x_min\":0,\"x_max\":499,\"ha\":613,\"o\":\"m 277 1040 l 83 799 l 0 799 l 140 1040 l 277 1040 m 499 0 l 360 0 l 360 1012 l 499 1012 l 499 0 \"},\"i\":{\"x_min\":14,\"x_max\":136,\"ha\":275,\"o\":\"m 136 873 l 14 873 l 14 1013 l 136 1013 l 136 873 m 136 0 l 14 0 l 14 737 l 136 737 l 136 0 \"},\"Β\":{\"x_min\":0,\"x_max\":778,\"ha\":877,\"o\":\"m 580 545 q 724 468 671 534 q 778 310 778 402 q 673 83 778 170 q 432 0 575 0 l 0 0 l 0 1013 l 411 1013 q 629 957 541 1013 q 732 768 732 891 q 691 632 732 692 q 580 545 650 571 m 393 899 l 139 899 l 139 587 l 379 587 q 521 623 462 587 q 592 744 592 666 q 531 859 592 819 q 393 899 471 899 m 419 124 q 566 169 504 124 q 635 302 635 219 q 559 435 635 388 q 402 476 494 476 l 139 476 l 139 124 l 419 124 \"},\"υ\":{\"x_min\":0,\"x_max\":617,\"ha\":725,\"o\":\"m 617 352 q 540 94 617 199 q 308 -24 455 -24 q 76 94 161 -24 q 0 352 0 199 l 0 739 l 126 739 l 126 355 q 169 185 126 257 q 312 98 220 98 q 451 185 402 98 q 492 355 492 257 l 492 739 l 617 739 l 617 352 \"},\"]\":{\"x_min\":0,\"x_max\":275,\"ha\":372,\"o\":\"m 275 -281 l 0 -281 l 0 -187 l 151 -187 l 151 920 l 0 920 l 0 1013 l 275 1013 l 275 -281 \"},\"m\":{\"x_min\":0,\"x_max\":1019,\"ha\":1128,\"o\":\"m 1019 0 l 897 0 l 897 454 q 860 591 897 536 q 739 660 816 660 q 613 586 659 660 q 573 436 573 522 l 573 0 l 447 0 l 447 455 q 412 591 447 535 q 294 657 372 657 q 165 586 213 657 q 122 437 122 521 l 122 0 l 0 0 l 0 738 l 117 738 l 117 640 q 202 730 150 697 q 316 763 254 763 q 437 730 381 763 q 525 642 494 697 q 621 731 559 700 q 753 763 682 763 q 943 694 867 763 q 1019 512 1019 625 l 1019 0 \"},\"χ\":{\"x_min\":8.328125,\"x_max\":780.5625,\"ha\":815,\"o\":\"m 780 -278 q 715 -294 747 -294 q 616 -257 663 -294 q 548 -175 576 -227 l 379 133 l 143 -277 l 9 -277 l 313 254 l 163 522 q 127 586 131 580 q 36 640 91 640 q 8 637 27 640 l 8 752 l 52 757 q 162 719 113 757 q 236 627 200 690 l 383 372 l 594 737 l 726 737 l 448 250 l 625 -69 q 670 -153 647 -110 q 743 -188 695 -188 q 780 -184 759 -188 l 780 -278 \"},\"8\":{\"x_min\":55,\"x_max\":736,\"ha\":792,\"o\":\"m 571 527 q 694 424 652 491 q 736 280 736 358 q 648 71 736 158 q 395 -26 551 -26 q 142 69 238 -26 q 55 279 55 157 q 96 425 55 359 q 220 527 138 491 q 120 615 153 562 q 88 726 88 668 q 171 904 88 827 q 395 986 261 986 q 618 905 529 986 q 702 727 702 830 q 670 616 702 667 q 571 527 638 565 m 394 565 q 519 610 475 565 q 563 717 563 655 q 521 823 563 781 q 392 872 474 872 q 265 824 312 872 q 224 720 224 783 q 265 613 224 656 q 394 565 312 565 m 395 91 q 545 150 488 91 q 597 280 597 204 q 546 408 597 355 q 395 465 492 465 q 244 408 299 465 q 194 280 194 356 q 244 150 194 203 q 395 91 299 91 \"},\"ί\":{\"x_min\":42,\"x_max\":326.71875,\"ha\":361,\"o\":\"m 284 3 q 233 -10 258 -5 q 182 -15 207 -15 q 85 26 119 -15 q 42 200 42 79 l 42 737 l 167 737 l 168 215 q 172 141 168 157 q 226 101 183 101 q 248 102 239 101 q 284 112 257 104 l 284 3 m 326 1040 l 137 819 l 54 819 l 189 1040 l 326 1040 \"},\"Ζ\":{\"x_min\":0,\"x_max\":779.171875,\"ha\":850,\"o\":\"m 779 0 l 0 0 l 0 113 l 620 896 l 40 896 l 40 1013 l 779 1013 l 779 887 l 170 124 l 779 124 l 779 0 \"},\"R\":{\"x_min\":0,\"x_max\":781.953125,\"ha\":907,\"o\":\"m 781 0 l 623 0 q 587 242 590 52 q 407 433 585 433 l 138 433 l 138 0 l 0 0 l 0 1013 l 396 1013 q 636 946 539 1013 q 749 731 749 868 q 711 597 749 659 q 608 502 674 534 q 718 370 696 474 q 729 207 722 352 q 781 26 736 62 l 781 0 m 373 551 q 533 594 465 551 q 614 731 614 645 q 532 859 614 815 q 373 896 465 896 l 138 896 l 138 551 l 373 551 \"},\"o\":{\"x_min\":0,\"x_max\":713,\"ha\":821,\"o\":\"m 357 -25 q 94 91 194 -25 q 0 368 0 202 q 93 642 0 533 q 357 761 193 761 q 618 644 518 761 q 713 368 713 533 q 619 91 713 201 q 357 -25 521 -25 m 357 85 q 528 175 465 85 q 584 369 584 255 q 529 562 584 484 q 357 651 467 651 q 189 560 250 651 q 135 369 135 481 q 187 177 135 257 q 357 85 250 85 \"},\"5\":{\"x_min\":54.171875,\"x_max\":738,\"ha\":792,\"o\":\"m 738 314 q 626 60 738 153 q 382 -23 526 -23 q 155 47 248 -23 q 54 256 54 125 l 183 256 q 259 132 204 174 q 382 91 314 91 q 533 149 471 91 q 602 314 602 213 q 538 469 602 411 q 386 528 475 528 q 284 506 332 528 q 197 439 237 484 l 81 439 l 159 958 l 684 958 l 684 840 l 254 840 l 214 579 q 306 627 258 612 q 407 643 354 643 q 636 552 540 643 q 738 314 738 457 \"},\"7\":{\"x_min\":58.71875,\"x_max\":730.953125,\"ha\":792,\"o\":\"m 730 839 q 469 448 560 641 q 335 0 378 255 l 192 0 q 328 441 235 252 q 593 830 421 630 l 58 830 l 58 958 l 730 958 l 730 839 \"},\"K\":{\"x_min\":0,\"x_max\":819.46875,\"ha\":906,\"o\":\"m 819 0 l 649 0 l 294 509 l 139 355 l 139 0 l 0 0 l 0 1013 l 139 1013 l 139 526 l 626 1013 l 809 1013 l 395 600 l 819 0 \"},\",\":{\"x_min\":0,\"x_max\":142,\"ha\":239,\"o\":\"m 142 -12 q 105 -132 142 -82 q 0 -205 68 -182 l 0 -138 q 57 -82 40 -124 q 70 0 70 -51 l 0 0 l 0 151 l 142 151 l 142 -12 \"},\"d\":{\"x_min\":0,\"x_max\":683,\"ha\":796,\"o\":\"m 683 0 l 564 0 l 564 93 q 456 6 516 38 q 327 -25 395 -25 q 87 100 181 -25 q 0 365 0 215 q 90 639 0 525 q 343 763 187 763 q 564 647 486 763 l 564 1013 l 683 1013 l 683 0 m 582 373 q 529 562 582 484 q 361 653 468 653 q 190 561 253 653 q 135 365 135 479 q 189 175 135 254 q 358 85 251 85 q 529 178 468 85 q 582 373 582 258 \"},\"¨\":{\"x_min\":-109,\"x_max\":247,\"ha\":232,\"o\":\"m 247 1046 l 119 1046 l 119 1189 l 247 1189 l 247 1046 m 19 1046 l -109 1046 l -109 1189 l 19 1189 l 19 1046 \"},\"E\":{\"x_min\":0,\"x_max\":736.109375,\"ha\":789,\"o\":\"m 736 0 l 0 0 l 0 1013 l 725 1013 l 725 889 l 139 889 l 139 585 l 677 585 l 677 467 l 139 467 l 139 125 l 736 125 l 736 0 \"},\"Y\":{\"x_min\":0,\"x_max\":820,\"ha\":886,\"o\":\"m 820 1013 l 482 416 l 482 0 l 342 0 l 342 416 l 0 1013 l 140 1013 l 411 534 l 679 1012 l 820 1013 \"},\"\\\"\":{\"x_min\":0,\"x_max\":299,\"ha\":396,\"o\":\"m 299 606 l 203 606 l 203 988 l 299 988 l 299 606 m 96 606 l 0 606 l 0 988 l 96 988 l 96 606 \"},\"‹\":{\"x_min\":17.984375,\"x_max\":773.609375,\"ha\":792,\"o\":\"m 773 40 l 18 376 l 17 465 l 773 799 l 773 692 l 159 420 l 773 149 l 773 40 \"},\"„\":{\"x_min\":0,\"x_max\":364,\"ha\":467,\"o\":\"m 141 -12 q 104 -132 141 -82 q 0 -205 67 -182 l 0 -138 q 56 -82 40 -124 q 69 0 69 -51 l 0 0 l 0 151 l 141 151 l 141 -12 m 364 -12 q 327 -132 364 -82 q 222 -205 290 -182 l 222 -138 q 279 -82 262 -124 q 292 0 292 -51 l 222 0 l 222 151 l 364 151 l 364 -12 \"},\"δ\":{\"x_min\":1,\"x_max\":710,\"ha\":810,\"o\":\"m 710 360 q 616 87 710 196 q 356 -28 518 -28 q 99 82 197 -28 q 1 356 1 192 q 100 606 1 509 q 355 703 199 703 q 180 829 288 754 q 70 903 124 866 l 70 1012 l 643 1012 l 643 901 l 258 901 q 462 763 422 794 q 636 592 577 677 q 710 360 710 485 m 584 365 q 552 501 584 447 q 451 602 521 555 q 372 611 411 611 q 197 541 258 611 q 136 355 136 472 q 190 171 136 245 q 358 85 252 85 q 528 173 465 85 q 584 365 584 252 \"},\"έ\":{\"x_min\":0,\"x_max\":634.71875,\"ha\":714,\"o\":\"m 634 234 q 527 38 634 110 q 300 -25 433 -25 q 98 29 183 -25 q 0 204 0 93 q 37 313 0 265 q 128 390 67 352 q 56 459 82 419 q 26 555 26 505 q 114 712 26 654 q 295 763 191 763 q 499 700 416 763 q 589 515 589 631 l 478 515 q 419 618 464 580 q 307 657 374 657 q 207 630 253 657 q 151 547 151 598 q 238 445 151 469 q 389 434 280 434 l 389 331 l 349 331 q 206 315 255 331 q 125 210 125 287 q 183 107 125 145 q 302 76 233 76 q 436 117 379 76 q 509 234 493 159 l 634 234 m 520 1040 l 331 819 l 248 819 l 383 1040 l 520 1040 \"},\"ω\":{\"x_min\":0,\"x_max\":922,\"ha\":1031,\"o\":\"m 922 339 q 856 97 922 203 q 650 -26 780 -26 q 538 9 587 -26 q 461 103 489 44 q 387 12 436 46 q 277 -22 339 -22 q 69 97 147 -22 q 0 339 0 203 q 45 551 0 444 q 161 738 84 643 l 302 738 q 175 553 219 647 q 124 336 124 446 q 155 179 124 249 q 275 88 197 88 q 375 163 341 88 q 400 294 400 219 l 400 572 l 524 572 l 524 294 q 561 135 524 192 q 643 88 591 88 q 762 182 719 88 q 797 342 797 257 q 745 556 797 450 q 619 738 705 638 l 760 738 q 874 551 835 640 q 922 339 922 444 \"},\"´\":{\"x_min\":0,\"x_max\":96,\"ha\":251,\"o\":\"m 96 606 l 0 606 l 0 988 l 96 988 l 96 606 \"},\"±\":{\"x_min\":11,\"x_max\":781,\"ha\":792,\"o\":\"m 781 490 l 446 490 l 446 255 l 349 255 l 349 490 l 11 490 l 11 586 l 349 586 l 349 819 l 446 819 l 446 586 l 781 586 l 781 490 m 781 21 l 11 21 l 11 115 l 781 115 l 781 21 \"},\"|\":{\"x_min\":343,\"x_max\":449,\"ha\":792,\"o\":\"m 449 462 l 343 462 l 343 986 l 449 986 l 449 462 m 449 -242 l 343 -242 l 343 280 l 449 280 l 449 -242 \"},\"ϋ\":{\"x_min\":0,\"x_max\":617,\"ha\":725,\"o\":\"m 482 800 l 372 800 l 372 925 l 482 925 l 482 800 m 239 800 l 129 800 l 129 925 l 239 925 l 239 800 m 617 352 q 540 93 617 199 q 308 -24 455 -24 q 76 93 161 -24 q 0 352 0 199 l 0 738 l 126 738 l 126 354 q 169 185 126 257 q 312 98 220 98 q 451 185 402 98 q 492 354 492 257 l 492 738 l 617 738 l 617 352 \"},\"§\":{\"x_min\":0,\"x_max\":593,\"ha\":690,\"o\":\"m 593 425 q 554 312 593 369 q 467 233 516 254 q 537 83 537 172 q 459 -74 537 -12 q 288 -133 387 -133 q 115 -69 184 -133 q 47 96 47 -6 l 166 96 q 199 7 166 40 q 288 -26 232 -26 q 371 -5 332 -26 q 420 60 420 21 q 311 201 420 139 q 108 309 210 255 q 0 490 0 383 q 33 602 0 551 q 124 687 66 654 q 75 743 93 712 q 58 812 58 773 q 133 984 58 920 q 300 1043 201 1043 q 458 987 394 1043 q 529 814 529 925 l 411 814 q 370 908 404 877 q 289 939 336 939 q 213 911 246 939 q 180 841 180 883 q 286 720 180 779 q 484 612 480 615 q 593 425 593 534 m 467 409 q 355 544 467 473 q 196 630 228 612 q 146 587 162 609 q 124 525 124 558 q 239 387 124 462 q 398 298 369 315 q 448 345 429 316 q 467 409 467 375 \"},\"b\":{\"x_min\":0,\"x_max\":685,\"ha\":783,\"o\":\"m 685 372 q 597 99 685 213 q 347 -25 501 -25 q 219 5 277 -25 q 121 93 161 36 l 121 0 l 0 0 l 0 1013 l 121 1013 l 121 634 q 214 723 157 692 q 341 754 272 754 q 591 637 493 754 q 685 372 685 526 m 554 356 q 499 550 554 470 q 328 644 437 644 q 162 556 223 644 q 108 369 108 478 q 160 176 108 256 q 330 83 221 83 q 498 169 435 83 q 554 356 554 245 \"},\"q\":{\"x_min\":0,\"x_max\":683,\"ha\":876,\"o\":\"m 683 -278 l 564 -278 l 564 97 q 474 8 533 39 q 345 -23 415 -23 q 91 93 188 -23 q 0 364 0 203 q 87 635 0 522 q 337 760 184 760 q 466 727 408 760 q 564 637 523 695 l 564 737 l 683 737 l 683 -278 m 582 375 q 527 564 582 488 q 358 652 466 652 q 190 565 253 652 q 135 377 135 488 q 189 179 135 261 q 361 84 251 84 q 530 179 469 84 q 582 375 582 260 \"},\"Ω\":{\"x_min\":-0.171875,\"x_max\":969.5625,\"ha\":1068,\"o\":\"m 969 0 l 555 0 l 555 123 q 744 308 675 194 q 814 558 814 423 q 726 812 814 709 q 484 922 633 922 q 244 820 334 922 q 154 567 154 719 q 223 316 154 433 q 412 123 292 199 l 412 0 l 0 0 l 0 124 l 217 124 q 68 327 122 210 q 15 572 15 444 q 144 911 15 781 q 484 1041 274 1041 q 822 909 691 1041 q 953 569 953 777 q 899 326 953 443 q 750 124 846 210 l 969 124 l 969 0 \"},\"ύ\":{\"x_min\":0,\"x_max\":617,\"ha\":725,\"o\":\"m 617 352 q 540 93 617 199 q 308 -24 455 -24 q 76 93 161 -24 q 0 352 0 199 l 0 738 l 126 738 l 126 354 q 169 185 126 257 q 312 98 220 98 q 451 185 402 98 q 492 354 492 257 l 492 738 l 617 738 l 617 352 m 535 1040 l 346 819 l 262 819 l 397 1040 l 535 1040 \"},\"z\":{\"x_min\":-0.015625,\"x_max\":613.890625,\"ha\":697,\"o\":\"m 613 0 l 0 0 l 0 100 l 433 630 l 20 630 l 20 738 l 594 738 l 593 636 l 163 110 l 613 110 l 613 0 \"},\"™\":{\"x_min\":0,\"x_max\":894,\"ha\":1000,\"o\":\"m 389 951 l 229 951 l 229 503 l 160 503 l 160 951 l 0 951 l 0 1011 l 389 1011 l 389 951 m 894 503 l 827 503 l 827 939 l 685 503 l 620 503 l 481 937 l 481 503 l 417 503 l 417 1011 l 517 1011 l 653 580 l 796 1010 l 894 1011 l 894 503 \"},\"ή\":{\"x_min\":0.78125,\"x_max\":697,\"ha\":810,\"o\":\"m 697 -278 l 572 -278 l 572 454 q 540 587 572 536 q 425 650 501 650 q 271 579 337 650 q 206 420 206 509 l 206 0 l 81 0 l 81 489 q 73 588 81 562 q 0 644 56 644 l 0 741 q 68 755 38 755 q 158 721 124 755 q 200 630 193 687 q 297 726 234 692 q 434 761 359 761 q 620 692 544 761 q 697 516 697 624 l 697 -278 m 479 1040 l 290 819 l 207 819 l 341 1040 l 479 1040 \"},\"Θ\":{\"x_min\":0,\"x_max\":960,\"ha\":1056,\"o\":\"m 960 507 q 833 129 960 280 q 476 -32 698 -32 q 123 129 255 -32 q 0 507 0 280 q 123 883 0 732 q 476 1045 255 1045 q 832 883 696 1045 q 960 507 960 732 m 817 500 q 733 789 817 669 q 476 924 639 924 q 223 792 317 924 q 142 507 142 675 q 222 222 142 339 q 476 89 315 89 q 730 218 636 89 q 817 500 817 334 m 716 449 l 243 449 l 243 571 l 716 571 l 716 449 \"},\"®\":{\"x_min\":-3,\"x_max\":1008,\"ha\":1106,\"o\":\"m 503 532 q 614 562 566 532 q 672 658 672 598 q 614 747 672 716 q 503 772 569 772 l 338 772 l 338 532 l 503 532 m 502 -7 q 123 151 263 -7 q -3 501 -3 294 q 123 851 -3 706 q 502 1011 263 1011 q 881 851 739 1011 q 1008 501 1008 708 q 883 151 1008 292 q 502 -7 744 -7 m 502 60 q 830 197 709 60 q 940 501 940 322 q 831 805 940 681 q 502 944 709 944 q 174 805 296 944 q 65 501 65 680 q 173 197 65 320 q 502 60 294 60 m 788 146 l 678 146 q 653 316 655 183 q 527 449 652 449 l 338 449 l 338 146 l 241 146 l 241 854 l 518 854 q 688 808 621 854 q 766 658 766 755 q 739 563 766 607 q 668 497 713 519 q 751 331 747 472 q 788 164 756 190 l 788 146 \"},\"~\":{\"x_min\":0,\"x_max\":833,\"ha\":931,\"o\":\"m 833 958 q 778 753 833 831 q 594 665 716 665 q 402 761 502 665 q 240 857 302 857 q 131 795 166 857 q 104 665 104 745 l 0 665 q 54 867 0 789 q 237 958 116 958 q 429 861 331 958 q 594 765 527 765 q 704 827 670 765 q 729 958 729 874 l 833 958 \"},\"Ε\":{\"x_min\":0,\"x_max\":736.21875,\"ha\":778,\"o\":\"m 736 0 l 0 0 l 0 1013 l 725 1013 l 725 889 l 139 889 l 139 585 l 677 585 l 677 467 l 139 467 l 139 125 l 736 125 l 736 0 \"},\"³\":{\"x_min\":0,\"x_max\":450,\"ha\":547,\"o\":\"m 450 552 q 379 413 450 464 q 220 366 313 366 q 69 414 130 366 q 0 567 0 470 l 85 567 q 126 470 85 504 q 225 437 168 437 q 320 467 280 437 q 360 552 360 498 q 318 632 360 608 q 213 657 276 657 q 195 657 203 657 q 176 657 181 657 l 176 722 q 279 733 249 722 q 334 815 334 752 q 300 881 334 856 q 220 907 267 907 q 133 875 169 907 q 97 781 97 844 l 15 781 q 78 926 15 875 q 220 972 135 972 q 364 930 303 972 q 426 817 426 888 q 344 697 426 733 q 421 642 392 681 q 450 552 450 603 \"},\"[\":{\"x_min\":0,\"x_max\":273.609375,\"ha\":371,\"o\":\"m 273 -281 l 0 -281 l 0 1013 l 273 1013 l 273 920 l 124 920 l 124 -187 l 273 -187 l 273 -281 \"},\"L\":{\"x_min\":0,\"x_max\":645.828125,\"ha\":696,\"o\":\"m 645 0 l 0 0 l 0 1013 l 140 1013 l 140 126 l 645 126 l 645 0 \"},\"σ\":{\"x_min\":0,\"x_max\":803.390625,\"ha\":894,\"o\":\"m 803 628 l 633 628 q 713 368 713 512 q 618 93 713 204 q 357 -25 518 -25 q 94 91 194 -25 q 0 368 0 201 q 94 644 0 533 q 356 761 194 761 q 481 750 398 761 q 608 739 564 739 l 803 739 l 803 628 m 360 85 q 529 180 467 85 q 584 374 584 262 q 527 566 584 490 q 352 651 463 651 q 187 559 247 651 q 135 368 135 478 q 189 175 135 254 q 360 85 251 85 \"},\"ζ\":{\"x_min\":0,\"x_max\":573,\"ha\":642,\"o\":\"m 573 -40 q 553 -162 573 -97 q 510 -278 543 -193 l 400 -278 q 441 -187 428 -219 q 462 -90 462 -132 q 378 -14 462 -14 q 108 45 197 -14 q 0 290 0 117 q 108 631 0 462 q 353 901 194 767 l 55 901 l 55 1012 l 561 1012 l 561 924 q 261 669 382 831 q 128 301 128 489 q 243 117 128 149 q 458 98 350 108 q 573 -40 573 80 \"},\"θ\":{\"x_min\":0,\"x_max\":674,\"ha\":778,\"o\":\"m 674 496 q 601 160 674 304 q 336 -26 508 -26 q 73 153 165 -26 q 0 485 0 296 q 72 840 0 683 q 343 1045 166 1045 q 605 844 516 1045 q 674 496 674 692 m 546 579 q 498 798 546 691 q 336 935 437 935 q 178 798 237 935 q 126 579 137 701 l 546 579 m 546 475 l 126 475 q 170 233 126 348 q 338 80 230 80 q 504 233 447 80 q 546 475 546 346 \"},\"Ο\":{\"x_min\":0,\"x_max\":958,\"ha\":1054,\"o\":\"m 485 1042 q 834 883 703 1042 q 958 511 958 735 q 834 136 958 287 q 481 -26 701 -26 q 126 130 261 -26 q 0 504 0 279 q 127 880 0 729 q 485 1042 263 1042 m 480 98 q 731 225 638 98 q 815 504 815 340 q 733 783 815 670 q 480 913 640 913 q 226 785 321 913 q 142 504 142 671 q 226 224 142 339 q 480 98 319 98 \"},\"Γ\":{\"x_min\":0,\"x_max\":705.28125,\"ha\":749,\"o\":\"m 705 886 l 140 886 l 140 0 l 0 0 l 0 1012 l 705 1012 l 705 886 \"},\" \":{\"x_min\":0,\"x_max\":0,\"ha\":375},\"%\":{\"x_min\":-3,\"x_max\":1089,\"ha\":1186,\"o\":\"m 845 0 q 663 76 731 0 q 602 244 602 145 q 661 412 602 344 q 845 489 728 489 q 1027 412 959 489 q 1089 244 1089 343 q 1029 76 1089 144 q 845 0 962 0 m 844 103 q 945 143 909 103 q 981 243 981 184 q 947 340 981 301 q 844 385 909 385 q 744 342 781 385 q 708 243 708 300 q 741 147 708 186 q 844 103 780 103 m 888 986 l 284 -25 l 199 -25 l 803 986 l 888 986 m 241 468 q 58 545 126 468 q -3 715 -3 615 q 56 881 -3 813 q 238 958 124 958 q 421 881 353 958 q 483 712 483 813 q 423 544 483 612 q 241 468 356 468 m 241 855 q 137 811 175 855 q 100 710 100 768 q 136 612 100 653 q 240 572 172 572 q 344 614 306 572 q 382 713 382 656 q 347 810 382 771 q 241 855 308 855 \"},\"P\":{\"x_min\":0,\"x_max\":726,\"ha\":806,\"o\":\"m 424 1013 q 640 931 555 1013 q 726 719 726 850 q 637 506 726 587 q 413 426 548 426 l 140 426 l 140 0 l 0 0 l 0 1013 l 424 1013 m 379 889 l 140 889 l 140 548 l 372 548 q 522 589 459 548 q 593 720 593 637 q 528 845 593 801 q 379 889 463 889 \"},\"Έ\":{\"x_min\":0,\"x_max\":1078.21875,\"ha\":1118,\"o\":\"m 1078 0 l 342 0 l 342 1013 l 1067 1013 l 1067 889 l 481 889 l 481 585 l 1019 585 l 1019 467 l 481 467 l 481 125 l 1078 125 l 1078 0 m 277 1040 l 83 799 l 0 799 l 140 1040 l 277 1040 \"},\"Ώ\":{\"x_min\":0.125,\"x_max\":1136.546875,\"ha\":1235,\"o\":\"m 1136 0 l 722 0 l 722 123 q 911 309 842 194 q 981 558 981 423 q 893 813 981 710 q 651 923 800 923 q 411 821 501 923 q 321 568 321 720 q 390 316 321 433 q 579 123 459 200 l 579 0 l 166 0 l 166 124 l 384 124 q 235 327 289 210 q 182 572 182 444 q 311 912 182 782 q 651 1042 441 1042 q 989 910 858 1042 q 1120 569 1120 778 q 1066 326 1120 443 q 917 124 1013 210 l 1136 124 l 1136 0 m 277 1040 l 83 800 l 0 800 l 140 1041 l 277 1040 \"},\"_\":{\"x_min\":0,\"x_max\":705.5625,\"ha\":803,\"o\":\"m 705 -334 l 0 -334 l 0 -234 l 705 -234 l 705 -334 \"},\"Ϊ\":{\"x_min\":-110,\"x_max\":246,\"ha\":275,\"o\":\"m 246 1046 l 118 1046 l 118 1189 l 246 1189 l 246 1046 m 18 1046 l -110 1046 l -110 1189 l 18 1189 l 18 1046 m 136 0 l 0 0 l 0 1012 l 136 1012 l 136 0 \"},\"+\":{\"x_min\":23,\"x_max\":768,\"ha\":792,\"o\":\"m 768 372 l 444 372 l 444 0 l 347 0 l 347 372 l 23 372 l 23 468 l 347 468 l 347 840 l 444 840 l 444 468 l 768 468 l 768 372 \"},\"½\":{\"x_min\":0,\"x_max\":1050,\"ha\":1149,\"o\":\"m 1050 0 l 625 0 q 712 178 625 108 q 878 277 722 187 q 967 385 967 328 q 932 456 967 429 q 850 484 897 484 q 759 450 798 484 q 721 352 721 416 l 640 352 q 706 502 640 448 q 851 551 766 551 q 987 509 931 551 q 1050 385 1050 462 q 976 251 1050 301 q 829 179 902 215 q 717 68 740 133 l 1050 68 l 1050 0 m 834 985 l 215 -28 l 130 -28 l 750 984 l 834 985 m 224 422 l 142 422 l 142 811 l 0 811 l 0 867 q 104 889 62 867 q 164 973 157 916 l 224 973 l 224 422 \"},\"Ρ\":{\"x_min\":0,\"x_max\":720,\"ha\":783,\"o\":\"m 424 1013 q 637 933 554 1013 q 720 723 720 853 q 633 508 720 591 q 413 426 546 426 l 140 426 l 140 0 l 0 0 l 0 1013 l 424 1013 m 378 889 l 140 889 l 140 548 l 371 548 q 521 589 458 548 q 592 720 592 637 q 527 845 592 801 q 378 889 463 889 \"},\"'\":{\"x_min\":0,\"x_max\":139,\"ha\":236,\"o\":\"m 139 851 q 102 737 139 784 q 0 669 65 690 l 0 734 q 59 787 42 741 q 72 873 72 821 l 0 873 l 0 1013 l 139 1013 l 139 851 \"},\"ª\":{\"x_min\":0,\"x_max\":350,\"ha\":397,\"o\":\"m 350 625 q 307 616 328 616 q 266 631 281 616 q 247 673 251 645 q 190 628 225 644 q 116 613 156 613 q 32 641 64 613 q 0 722 0 669 q 72 826 0 800 q 247 866 159 846 l 247 887 q 220 934 247 916 q 162 953 194 953 q 104 934 129 953 q 76 882 80 915 l 16 882 q 60 976 16 941 q 166 1011 104 1011 q 266 979 224 1011 q 308 891 308 948 l 308 706 q 311 679 308 688 q 331 670 315 670 l 350 672 l 350 625 m 247 757 l 247 811 q 136 790 175 798 q 64 726 64 773 q 83 682 64 697 q 132 667 103 667 q 207 690 174 667 q 247 757 247 718 \"},\"΅\":{\"x_min\":0,\"x_max\":450,\"ha\":553,\"o\":\"m 450 800 l 340 800 l 340 925 l 450 925 l 450 800 m 406 1040 l 212 800 l 129 800 l 269 1040 l 406 1040 m 110 800 l 0 800 l 0 925 l 110 925 l 110 800 \"},\"T\":{\"x_min\":0,\"x_max\":777,\"ha\":835,\"o\":\"m 777 894 l 458 894 l 458 0 l 319 0 l 319 894 l 0 894 l 0 1013 l 777 1013 l 777 894 \"},\"Φ\":{\"x_min\":0,\"x_max\":915,\"ha\":997,\"o\":\"m 527 0 l 389 0 l 389 122 q 110 231 220 122 q 0 509 0 340 q 110 785 0 677 q 389 893 220 893 l 389 1013 l 527 1013 l 527 893 q 804 786 693 893 q 915 509 915 679 q 805 231 915 341 q 527 122 696 122 l 527 0 m 527 226 q 712 310 641 226 q 779 507 779 389 q 712 705 779 627 q 527 787 641 787 l 527 226 m 389 226 l 389 787 q 205 698 275 775 q 136 505 136 620 q 206 308 136 391 q 389 226 276 226 \"},\"⁋\":{\"x_min\":0,\"x_max\":0,\"ha\":694},\"j\":{\"x_min\":-77.78125,\"x_max\":167,\"ha\":349,\"o\":\"m 167 871 l 42 871 l 42 1013 l 167 1013 l 167 871 m 167 -80 q 121 -231 167 -184 q -26 -278 76 -278 l -77 -278 l -77 -164 l -41 -164 q 26 -143 11 -164 q 42 -65 42 -122 l 42 737 l 167 737 l 167 -80 \"},\"Σ\":{\"x_min\":0,\"x_max\":756.953125,\"ha\":819,\"o\":\"m 756 0 l 0 0 l 0 107 l 395 523 l 22 904 l 22 1013 l 745 1013 l 745 889 l 209 889 l 566 523 l 187 125 l 756 125 l 756 0 \"},\"1\":{\"x_min\":215.671875,\"x_max\":574,\"ha\":792,\"o\":\"m 574 0 l 442 0 l 442 697 l 215 697 l 215 796 q 386 833 330 796 q 475 986 447 875 l 574 986 l 574 0 \"},\"›\":{\"x_min\":18.0625,\"x_max\":774,\"ha\":792,\"o\":\"m 774 376 l 18 40 l 18 149 l 631 421 l 18 692 l 18 799 l 774 465 l 774 376 \"},\"<\":{\"x_min\":17.984375,\"x_max\":773.609375,\"ha\":792,\"o\":\"m 773 40 l 18 376 l 17 465 l 773 799 l 773 692 l 159 420 l 773 149 l 773 40 \"},\"£\":{\"x_min\":0,\"x_max\":704.484375,\"ha\":801,\"o\":\"m 704 41 q 623 -10 664 5 q 543 -26 583 -26 q 359 15 501 -26 q 243 36 288 36 q 158 23 197 36 q 73 -21 119 10 l 6 76 q 125 195 90 150 q 175 331 175 262 q 147 443 175 383 l 0 443 l 0 512 l 108 512 q 43 734 43 623 q 120 929 43 854 q 358 1010 204 1010 q 579 936 487 1010 q 678 729 678 857 l 678 684 l 552 684 q 504 838 552 780 q 362 896 457 896 q 216 852 263 896 q 176 747 176 815 q 199 627 176 697 q 248 512 217 574 l 468 512 l 468 443 l 279 443 q 297 356 297 398 q 230 194 297 279 q 153 107 211 170 q 227 133 190 125 q 293 142 264 142 q 410 119 339 142 q 516 96 482 96 q 579 105 550 96 q 648 142 608 115 l 704 41 \"},\"t\":{\"x_min\":0,\"x_max\":367,\"ha\":458,\"o\":\"m 367 0 q 312 -5 339 -2 q 262 -8 284 -8 q 145 28 183 -8 q 108 143 108 64 l 108 638 l 0 638 l 0 738 l 108 738 l 108 944 l 232 944 l 232 738 l 367 738 l 367 638 l 232 638 l 232 185 q 248 121 232 140 q 307 102 264 102 q 345 104 330 102 q 367 107 360 107 l 367 0 \"},\"¬\":{\"x_min\":0,\"x_max\":706,\"ha\":803,\"o\":\"m 706 411 l 706 158 l 630 158 l 630 335 l 0 335 l 0 411 l 706 411 \"},\"λ\":{\"x_min\":0,\"x_max\":750,\"ha\":803,\"o\":\"m 750 -7 q 679 -15 716 -15 q 538 59 591 -15 q 466 214 512 97 l 336 551 l 126 0 l 0 0 l 270 705 q 223 837 247 770 q 116 899 190 899 q 90 898 100 899 l 90 1004 q 152 1011 125 1011 q 298 938 244 1011 q 373 783 326 901 l 605 192 q 649 115 629 136 q 716 95 669 95 l 736 95 q 750 97 745 97 l 750 -7 \"},\"W\":{\"x_min\":0,\"x_max\":1263.890625,\"ha\":1351,\"o\":\"m 1263 1013 l 995 0 l 859 0 l 627 837 l 405 0 l 265 0 l 0 1013 l 136 1013 l 342 202 l 556 1013 l 701 1013 l 921 207 l 1133 1012 l 1263 1013 \"},\">\":{\"x_min\":18.0625,\"x_max\":774,\"ha\":792,\"o\":\"m 774 376 l 18 40 l 18 149 l 631 421 l 18 692 l 18 799 l 774 465 l 774 376 \"},\"v\":{\"x_min\":0,\"x_max\":675.15625,\"ha\":761,\"o\":\"m 675 738 l 404 0 l 272 0 l 0 738 l 133 737 l 340 147 l 541 737 l 675 738 \"},\"τ\":{\"x_min\":0.28125,\"x_max\":644.5,\"ha\":703,\"o\":\"m 644 628 l 382 628 l 382 179 q 388 120 382 137 q 436 91 401 91 q 474 94 447 91 q 504 97 501 97 l 504 0 q 454 -9 482 -5 q 401 -14 426 -14 q 278 67 308 -14 q 260 233 260 118 l 260 628 l 0 628 l 0 739 l 644 739 l 644 628 \"},\"ξ\":{\"x_min\":0,\"x_max\":624.9375,\"ha\":699,\"o\":\"m 624 -37 q 608 -153 624 -96 q 563 -278 593 -211 l 454 -278 q 491 -183 486 -200 q 511 -83 511 -126 q 484 -23 511 -44 q 370 1 452 1 q 323 0 354 1 q 283 -1 293 -1 q 84 76 169 -1 q 0 266 0 154 q 56 431 0 358 q 197 538 108 498 q 94 613 134 562 q 54 730 54 665 q 77 823 54 780 q 143 901 101 867 l 27 901 l 27 1012 l 576 1012 l 576 901 l 380 901 q 244 863 303 901 q 178 745 178 820 q 312 600 178 636 q 532 582 380 582 l 532 479 q 276 455 361 479 q 118 281 118 410 q 165 173 118 217 q 274 120 208 133 q 494 101 384 110 q 624 -37 624 76 \"},\"&\":{\"x_min\":-3,\"x_max\":894.25,\"ha\":992,\"o\":\"m 894 0 l 725 0 l 624 123 q 471 0 553 40 q 306 -41 390 -41 q 168 -7 231 -41 q 62 92 105 26 q 14 187 31 139 q -3 276 -3 235 q 55 433 -3 358 q 248 581 114 508 q 170 689 196 640 q 137 817 137 751 q 214 985 137 922 q 384 1041 284 1041 q 548 988 483 1041 q 622 824 622 928 q 563 666 622 739 q 431 556 516 608 l 621 326 q 649 407 639 361 q 663 493 653 426 l 781 493 q 703 229 781 352 l 894 0 m 504 818 q 468 908 504 877 q 384 940 433 940 q 293 907 331 940 q 255 818 255 875 q 289 714 255 767 q 363 628 313 678 q 477 729 446 682 q 504 818 504 771 m 556 209 l 314 499 q 179 395 223 449 q 135 283 135 341 q 146 222 135 253 q 183 158 158 192 q 333 80 241 80 q 556 209 448 80 \"},\"Λ\":{\"x_min\":0,\"x_max\":862.5,\"ha\":942,\"o\":\"m 862 0 l 719 0 l 426 847 l 143 0 l 0 0 l 356 1013 l 501 1013 l 862 0 \"},\"I\":{\"x_min\":41,\"x_max\":180,\"ha\":293,\"o\":\"m 180 0 l 41 0 l 41 1013 l 180 1013 l 180 0 \"},\"G\":{\"x_min\":0,\"x_max\":921,\"ha\":1011,\"o\":\"m 921 0 l 832 0 l 801 136 q 655 15 741 58 q 470 -28 568 -28 q 126 133 259 -28 q 0 499 0 284 q 125 881 0 731 q 486 1043 259 1043 q 763 957 647 1043 q 905 709 890 864 l 772 709 q 668 866 747 807 q 486 926 589 926 q 228 795 322 926 q 142 507 142 677 q 228 224 142 342 q 483 94 323 94 q 712 195 625 94 q 796 435 796 291 l 477 435 l 477 549 l 921 549 l 921 0 \"},\"ΰ\":{\"x_min\":0,\"x_max\":617,\"ha\":725,\"o\":\"m 524 800 l 414 800 l 414 925 l 524 925 l 524 800 m 183 800 l 73 800 l 73 925 l 183 925 l 183 800 m 617 352 q 540 93 617 199 q 308 -24 455 -24 q 76 93 161 -24 q 0 352 0 199 l 0 738 l 126 738 l 126 354 q 169 185 126 257 q 312 98 220 98 q 451 185 402 98 q 492 354 492 257 l 492 738 l 617 738 l 617 352 m 489 1040 l 300 819 l 216 819 l 351 1040 l 489 1040 \"},\"`\":{\"x_min\":0,\"x_max\":138.890625,\"ha\":236,\"o\":\"m 138 699 l 0 699 l 0 861 q 36 974 0 929 q 138 1041 72 1020 l 138 977 q 82 931 95 969 q 69 839 69 893 l 138 839 l 138 699 \"},\"·\":{\"x_min\":0,\"x_max\":142,\"ha\":239,\"o\":\"m 142 585 l 0 585 l 0 738 l 142 738 l 142 585 \"},\"Υ\":{\"x_min\":0.328125,\"x_max\":819.515625,\"ha\":889,\"o\":\"m 819 1013 l 482 416 l 482 0 l 342 0 l 342 416 l 0 1013 l 140 1013 l 411 533 l 679 1013 l 819 1013 \"},\"r\":{\"x_min\":0,\"x_max\":355.5625,\"ha\":432,\"o\":\"m 355 621 l 343 621 q 179 569 236 621 q 122 411 122 518 l 122 0 l 0 0 l 0 737 l 117 737 l 117 604 q 204 719 146 686 q 355 753 262 753 l 355 621 \"},\"x\":{\"x_min\":0,\"x_max\":675,\"ha\":764,\"o\":\"m 675 0 l 525 0 l 331 286 l 144 0 l 0 0 l 256 379 l 12 738 l 157 737 l 336 473 l 516 738 l 661 738 l 412 380 l 675 0 \"},\"μ\":{\"x_min\":0,\"x_max\":696.609375,\"ha\":747,\"o\":\"m 696 -4 q 628 -14 657 -14 q 498 97 513 -14 q 422 8 470 41 q 313 -24 374 -24 q 207 3 258 -24 q 120 80 157 31 l 120 -278 l 0 -278 l 0 738 l 124 738 l 124 343 q 165 172 124 246 q 308 82 216 82 q 451 177 402 82 q 492 358 492 254 l 492 738 l 616 738 l 616 214 q 623 136 616 160 q 673 92 636 92 q 696 95 684 92 l 696 -4 \"},\"h\":{\"x_min\":0,\"x_max\":615,\"ha\":724,\"o\":\"m 615 472 l 615 0 l 490 0 l 490 454 q 456 590 490 535 q 338 654 416 654 q 186 588 251 654 q 122 436 122 522 l 122 0 l 0 0 l 0 1013 l 122 1013 l 122 633 q 218 727 149 694 q 362 760 287 760 q 552 676 484 760 q 615 472 615 600 \"},\".\":{\"x_min\":0,\"x_max\":142,\"ha\":239,\"o\":\"m 142 0 l 0 0 l 0 151 l 142 151 l 142 0 \"},\"φ\":{\"x_min\":-2,\"x_max\":878,\"ha\":974,\"o\":\"m 496 -279 l 378 -279 l 378 -17 q 101 88 204 -17 q -2 367 -2 194 q 68 626 -2 510 q 283 758 151 758 l 283 646 q 167 537 209 626 q 133 373 133 462 q 192 177 133 254 q 378 93 259 93 l 378 758 q 445 764 426 763 q 476 765 464 765 q 765 659 653 765 q 878 377 878 553 q 771 96 878 209 q 496 -17 665 -17 l 496 -279 m 496 93 l 514 93 q 687 183 623 93 q 746 380 746 265 q 691 569 746 491 q 522 658 629 658 l 496 656 l 496 93 \"},\";\":{\"x_min\":0,\"x_max\":142,\"ha\":239,\"o\":\"m 142 585 l 0 585 l 0 738 l 142 738 l 142 585 m 142 -12 q 105 -132 142 -82 q 0 -206 68 -182 l 0 -138 q 58 -82 43 -123 q 68 0 68 -56 l 0 0 l 0 151 l 142 151 l 142 -12 \"},\"f\":{\"x_min\":0,\"x_max\":378,\"ha\":472,\"o\":\"m 378 638 l 246 638 l 246 0 l 121 0 l 121 638 l 0 638 l 0 738 l 121 738 q 137 935 121 887 q 290 1028 171 1028 q 320 1027 305 1028 q 378 1021 334 1026 l 378 908 q 323 918 346 918 q 257 870 273 918 q 246 780 246 840 l 246 738 l 378 738 l 378 638 \"},\"“\":{\"x_min\":1,\"x_max\":348.21875,\"ha\":454,\"o\":\"m 140 670 l 1 670 l 1 830 q 37 943 1 897 q 140 1011 74 990 l 140 947 q 82 900 97 940 q 68 810 68 861 l 140 810 l 140 670 m 348 670 l 209 670 l 209 830 q 245 943 209 897 q 348 1011 282 990 l 348 947 q 290 900 305 940 q 276 810 276 861 l 348 810 l 348 670 \"},\"A\":{\"x_min\":0.03125,\"x_max\":906.953125,\"ha\":1008,\"o\":\"m 906 0 l 756 0 l 648 303 l 251 303 l 142 0 l 0 0 l 376 1013 l 529 1013 l 906 0 m 610 421 l 452 867 l 293 421 l 610 421 \"},\"6\":{\"x_min\":53,\"x_max\":739,\"ha\":792,\"o\":\"m 739 312 q 633 62 739 162 q 400 -31 534 -31 q 162 78 257 -31 q 53 439 53 206 q 178 859 53 712 q 441 986 284 986 q 643 912 559 986 q 732 713 732 833 l 601 713 q 544 830 594 786 q 426 875 494 875 q 268 793 331 875 q 193 517 193 697 q 301 597 240 570 q 427 624 362 624 q 643 540 552 624 q 739 312 739 451 m 603 298 q 540 461 603 400 q 404 516 484 516 q 268 461 323 516 q 207 300 207 401 q 269 137 207 198 q 405 83 325 83 q 541 137 486 83 q 603 298 603 197 \"},\"‘\":{\"x_min\":1,\"x_max\":139.890625,\"ha\":236,\"o\":\"m 139 670 l 1 670 l 1 830 q 37 943 1 897 q 139 1011 74 990 l 139 947 q 82 900 97 940 q 68 810 68 861 l 139 810 l 139 670 \"},\"ϊ\":{\"x_min\":-70,\"x_max\":283,\"ha\":361,\"o\":\"m 283 800 l 173 800 l 173 925 l 283 925 l 283 800 m 40 800 l -70 800 l -70 925 l 40 925 l 40 800 m 283 3 q 232 -10 257 -5 q 181 -15 206 -15 q 84 26 118 -15 q 41 200 41 79 l 41 737 l 166 737 l 167 215 q 171 141 167 157 q 225 101 182 101 q 247 103 238 101 q 283 112 256 104 l 283 3 \"},\"π\":{\"x_min\":-0.21875,\"x_max\":773.21875,\"ha\":857,\"o\":\"m 773 -7 l 707 -11 q 575 40 607 -11 q 552 174 552 77 l 552 226 l 552 626 l 222 626 l 222 0 l 97 0 l 97 626 l 0 626 l 0 737 l 773 737 l 773 626 l 676 626 l 676 171 q 695 103 676 117 q 773 90 714 90 l 773 -7 \"},\"ά\":{\"x_min\":0,\"x_max\":765.5625,\"ha\":809,\"o\":\"m 765 -4 q 698 -14 726 -14 q 564 97 586 -14 q 466 7 525 40 q 337 -26 407 -26 q 88 98 186 -26 q 0 369 0 212 q 88 637 0 525 q 337 760 184 760 q 465 727 407 760 q 563 637 524 695 l 563 738 l 685 738 l 685 222 q 693 141 685 168 q 748 94 708 94 q 765 95 760 94 l 765 -4 m 584 371 q 531 562 584 485 q 360 653 470 653 q 192 566 254 653 q 135 379 135 489 q 186 181 135 261 q 358 84 247 84 q 528 176 465 84 q 584 371 584 260 m 604 1040 l 415 819 l 332 819 l 466 1040 l 604 1040 \"},\"O\":{\"x_min\":0,\"x_max\":958,\"ha\":1057,\"o\":\"m 485 1041 q 834 882 702 1041 q 958 512 958 734 q 834 136 958 287 q 481 -26 702 -26 q 126 130 261 -26 q 0 504 0 279 q 127 880 0 728 q 485 1041 263 1041 m 480 98 q 731 225 638 98 q 815 504 815 340 q 733 783 815 669 q 480 912 640 912 q 226 784 321 912 q 142 504 142 670 q 226 224 142 339 q 480 98 319 98 \"},\"n\":{\"x_min\":0,\"x_max\":615,\"ha\":724,\"o\":\"m 615 463 l 615 0 l 490 0 l 490 454 q 453 592 490 537 q 331 656 410 656 q 178 585 240 656 q 117 421 117 514 l 117 0 l 0 0 l 0 738 l 117 738 l 117 630 q 218 728 150 693 q 359 764 286 764 q 552 675 484 764 q 615 463 615 593 \"},\"3\":{\"x_min\":54,\"x_max\":737,\"ha\":792,\"o\":\"m 737 284 q 635 55 737 141 q 399 -25 541 -25 q 156 52 248 -25 q 54 308 54 140 l 185 308 q 245 147 185 202 q 395 96 302 96 q 539 140 484 96 q 602 280 602 190 q 510 429 602 390 q 324 454 451 454 l 324 565 q 487 584 441 565 q 565 719 565 617 q 515 835 565 791 q 395 879 466 879 q 255 824 307 879 q 203 661 203 769 l 78 661 q 166 909 78 822 q 387 992 250 992 q 603 921 513 992 q 701 723 701 844 q 669 607 701 656 q 578 524 637 558 q 696 434 655 499 q 737 284 737 369 \"},\"9\":{\"x_min\":53,\"x_max\":739,\"ha\":792,\"o\":\"m 739 524 q 619 94 739 241 q 362 -32 516 -32 q 150 47 242 -32 q 59 244 59 126 l 191 244 q 246 129 191 176 q 373 82 301 82 q 526 161 466 82 q 597 440 597 255 q 363 334 501 334 q 130 432 216 334 q 53 650 53 521 q 134 880 53 786 q 383 986 226 986 q 659 841 566 986 q 739 524 739 719 m 388 449 q 535 514 480 449 q 585 658 585 573 q 535 805 585 744 q 388 873 480 873 q 242 809 294 873 q 191 658 191 745 q 239 514 191 572 q 388 449 292 449 \"},\"l\":{\"x_min\":41,\"x_max\":166,\"ha\":279,\"o\":\"m 166 0 l 41 0 l 41 1013 l 166 1013 l 166 0 \"},\"¤\":{\"x_min\":40.09375,\"x_max\":728.796875,\"ha\":825,\"o\":\"m 728 304 l 649 224 l 512 363 q 383 331 458 331 q 256 363 310 331 l 119 224 l 40 304 l 177 441 q 150 553 150 493 q 184 673 150 621 l 40 818 l 119 898 l 267 749 q 321 766 291 759 q 384 773 351 773 q 447 766 417 773 q 501 749 477 759 l 649 898 l 728 818 l 585 675 q 612 618 604 648 q 621 553 621 587 q 591 441 621 491 l 728 304 m 384 682 q 280 643 318 682 q 243 551 243 604 q 279 461 243 499 q 383 423 316 423 q 487 461 449 423 q 525 553 525 500 q 490 641 525 605 q 384 682 451 682 \"},\"κ\":{\"x_min\":0,\"x_max\":632.328125,\"ha\":679,\"o\":\"m 632 0 l 482 0 l 225 384 l 124 288 l 124 0 l 0 0 l 0 738 l 124 738 l 124 446 l 433 738 l 596 738 l 312 466 l 632 0 \"},\"4\":{\"x_min\":48,\"x_max\":742.453125,\"ha\":792,\"o\":\"m 742 243 l 602 243 l 602 0 l 476 0 l 476 243 l 48 243 l 48 368 l 476 958 l 602 958 l 602 354 l 742 354 l 742 243 m 476 354 l 476 792 l 162 354 l 476 354 \"},\"p\":{\"x_min\":0,\"x_max\":685,\"ha\":786,\"o\":\"m 685 364 q 598 96 685 205 q 350 -23 504 -23 q 121 89 205 -23 l 121 -278 l 0 -278 l 0 738 l 121 738 l 121 633 q 220 726 159 691 q 351 761 280 761 q 598 636 504 761 q 685 364 685 522 m 557 371 q 501 560 557 481 q 330 651 437 651 q 162 559 223 651 q 108 366 108 479 q 162 177 108 254 q 333 87 224 87 q 502 178 441 87 q 557 371 557 258 \"},\"‡\":{\"x_min\":0,\"x_max\":777,\"ha\":835,\"o\":\"m 458 238 l 458 0 l 319 0 l 319 238 l 0 238 l 0 360 l 319 360 l 319 681 l 0 683 l 0 804 l 319 804 l 319 1015 l 458 1013 l 458 804 l 777 804 l 777 683 l 458 683 l 458 360 l 777 360 l 777 238 l 458 238 \"},\"ψ\":{\"x_min\":0,\"x_max\":808,\"ha\":907,\"o\":\"m 465 -278 l 341 -278 l 341 -15 q 87 102 180 -15 q 0 378 0 210 l 0 739 l 133 739 l 133 379 q 182 195 133 275 q 341 98 242 98 l 341 922 l 465 922 l 465 98 q 623 195 563 98 q 675 382 675 278 l 675 742 l 808 742 l 808 381 q 720 104 808 213 q 466 -13 627 -13 l 465 -278 \"},\"η\":{\"x_min\":0.78125,\"x_max\":697,\"ha\":810,\"o\":\"m 697 -278 l 572 -278 l 572 454 q 540 587 572 536 q 425 650 501 650 q 271 579 337 650 q 206 420 206 509 l 206 0 l 81 0 l 81 489 q 73 588 81 562 q 0 644 56 644 l 0 741 q 68 755 38 755 q 158 720 124 755 q 200 630 193 686 q 297 726 234 692 q 434 761 359 761 q 620 692 544 761 q 697 516 697 624 l 697 -278 \"}},\"cssFontWeight\":\"normal\",\"ascender\":1189,\"underlinePosition\":-100,\"cssFontStyle\":\"normal\",\"boundingBox\":{\"yMin\":-334,\"xMin\":-111,\"yMax\":1189,\"xMax\":1672},\"resolution\":1000,\"original_font_information\":{\"postscript_name\":\"Helvetiker-Regular\",\"version_string\":\"Version 1.00 2004 initial release\",\"vendor_url\":\"http://www.magenta.gr/\",\"full_font_name\":\"Helvetiker\",\"font_family_name\":\"Helvetiker\",\"copyright\":\"Copyright (c) Μagenta ltd, 2004\",\"description\":\"\",\"trademark\":\"\",\"designer\":\"\",\"designer_url\":\"\",\"unique_font_identifier\":\"Μagenta ltd:Helvetiker:22-10-104\",\"license_url\":\"http://www.ellak.gr/fonts/MgOpen/license.html\",\"license_description\":\"Copyright (c) 2004 by MAGENTA Ltd. All Rights Reserved.\\r\\n\\r\\nPermission is hereby granted, free of charge, to any person obtaining a copy of the fonts accompanying this license (\\\"Fonts\\\") and associated documentation files (the \\\"Font Software\\\"), to reproduce and distribute the Font Software, including without limitation the rights to use, copy, merge, publish, distribute, and/or sell copies of the Font Software, and to permit persons to whom the Font Software is furnished to do so, subject to the following conditions: \\r\\n\\r\\nThe above copyright and this permission notice shall be included in all copies of one or more of the Font Software typefaces.\\r\\n\\r\\nThe Font Software may be modified, altered, or added to, and in particular the designs of glyphs or characters in the Fonts may be modified and additional glyphs or characters may be added to the Fonts, only if the fonts are renamed to names not containing the word \\\"MgOpen\\\", or if the modifications are accepted for inclusion in the Font Software itself by the each appointed Administrator.\\r\\n\\r\\nThis License becomes null and void to the extent applicable to Fonts or Font Software that has been modified and is distributed under the \\\"MgOpen\\\" name.\\r\\n\\r\\nThe Font Software may be sold as part of a larger software package but no copy of one or more of the Font Software typefaces may be sold by itself. \\r\\n\\r\\nTHE FONT SOFTWARE IS PROVIDED \\\"AS IS\\\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL MAGENTA OR PERSONS OR BODIES IN CHARGE OF ADMINISTRATION AND MAINTENANCE OF THE FONT SOFTWARE BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE.\",\"manufacturer_name\":\"Μagenta ltd\",\"font_sub_family_name\":\"Regular\"},\"descender\":-334,\"familyName\":\"Helvetiker\",\"lineHeight\":1522,\"underlineThickness\":50}"
  },
  {
    "path": "examples/resources/fonts/typeface/optimer_bold.typeface.json",
    "content": "{\"glyphs\":{\"ο\":{\"x_min\":30,\"x_max\":741,\"ha\":774,\"o\":\"m 395 683 q 645 587 550 683 q 741 337 741 492 q 646 79 741 173 q 385 -15 552 -15 q 127 78 225 -15 q 30 333 30 172 q 129 590 30 498 q 395 683 228 683 m 269 174 q 305 85 275 119 q 386 52 335 52 q 464 85 436 52 q 503 172 491 119 q 510 237 506 194 q 515 336 515 279 q 510 431 515 391 q 503 494 506 472 q 464 581 491 548 q 385 615 436 615 q 291 563 315 615 q 261 459 267 512 q 256 333 256 407 q 269 174 256 248 \"},\"S\":{\"x_min\":55,\"x_max\":687,\"ha\":742,\"o\":\"m 95 251 l 116 251 q 188 116 145 158 q 322 75 231 75 q 438 113 385 75 q 491 211 491 151 q 382 350 491 294 q 168 461 273 407 q 55 664 55 539 q 159 875 55 801 q 409 949 264 949 q 653 891 535 949 q 622 805 635 848 q 598 712 609 762 l 583 712 q 509 818 559 779 q 391 857 459 857 q 283 827 328 857 q 238 738 238 797 q 349 609 238 666 q 570 497 461 551 q 687 295 687 416 q 570 62 687 143 q 292 -18 453 -18 q 171 -8 229 -18 q 55 26 113 1 q 72 116 64 68 q 95 251 80 165 \"},\"/\":{\"x_min\":-32.953125,\"x_max\":420,\"ha\":383,\"o\":\"m 339 1023 l 420 1024 l 47 -126 l -32 -126 l 339 1023 \"},\"Τ\":{\"x_min\":8,\"x_max\":738,\"ha\":749,\"o\":\"m 493 818 q 490 723 493 790 q 487 652 487 656 q 490 427 487 529 q 498 201 494 326 q 503 0 503 77 q 438 2 482 0 q 374 5 395 5 q 317 3 351 5 q 244 0 284 1 q 252 266 244 88 q 261 476 261 444 q 258 670 261 533 q 255 818 255 808 q 158 815 188 818 q 8 801 128 813 l 12 872 l 8 932 q 198 927 70 932 q 373 922 327 922 q 572 927 445 922 q 738 932 700 932 l 733 870 l 738 801 q 493 818 614 818 \"},\"ϕ\":{\"x_min\":32,\"x_max\":997,\"ha\":1028,\"o\":\"m 418 -6 q 146 79 261 -6 q 32 322 32 165 q 143 560 32 474 q 418 664 254 646 q 411 819 418 715 q 404 978 404 923 q 483 970 445 970 q 622 977 556 970 q 616 829 622 938 q 611 664 611 719 q 882 573 768 664 q 997 328 997 483 q 886 90 997 171 q 611 -6 776 9 q 616 -197 611 -68 q 622 -374 622 -326 l 544 -365 q 471 -366 503 -365 q 404 -373 438 -368 q 411 -183 404 -315 q 418 -6 418 -51 m 611 328 l 611 61 q 742 147 704 72 q 780 328 780 222 q 741 510 780 433 q 612 601 703 588 l 611 328 m 418 601 q 287 510 326 588 q 249 328 249 433 q 286 147 249 223 q 416 61 324 72 l 418 328 l 418 601 \"},\"y\":{\"x_min\":0,\"x_max\":669.453125,\"ha\":653,\"o\":\"m 269 -16 l 76 481 q 37 579 58 529 q 0 667 16 629 q 66 664 22 667 q 134 661 111 661 q 201 664 154 661 q 251 667 248 667 q 308 465 277 561 q 380 256 338 368 l 452 463 q 482 562 462 493 q 512 667 502 631 l 577 661 q 623 664 593 661 q 669 667 654 667 q 438 139 536 375 q 244 -373 341 -97 q 165 -368 206 -368 q 132 -368 145 -368 q 86 -373 119 -368 q 145 -277 119 -323 q 195 -176 170 -230 l 269 -16 \"},\"≈\":{\"x_min\":118.0625,\"x_max\":1019.453125,\"ha\":1139,\"o\":\"m 1019 527 q 894 458 956 483 q 766 433 831 433 q 570 477 698 433 q 373 522 443 522 q 238 489 297 522 q 118 417 179 457 l 118 563 q 254 632 187 607 q 391 658 320 658 q 577 614 450 658 q 761 571 704 571 q 886 596 826 571 q 1019 671 945 622 l 1019 527 m 1019 251 q 892 182 952 207 q 766 158 831 158 q 568 202 697 158 q 373 246 440 246 q 251 219 308 246 q 118 140 194 192 l 118 286 q 252 358 187 331 q 387 385 318 385 q 575 339 447 385 q 761 294 704 294 q 886 321 825 294 q 1019 397 947 348 l 1019 251 \"},\"Π\":{\"x_min\":91,\"x_max\":957,\"ha\":1049,\"o\":\"m 105 284 l 105 461 q 102 651 105 534 q 99 784 99 768 l 91 932 q 210 926 129 932 q 331 921 290 921 l 711 921 q 833 926 751 921 q 957 932 915 932 q 948 692 957 857 q 939 465 939 527 q 942 221 939 315 q 957 0 945 127 l 829 5 q 756 2 808 5 q 698 0 703 0 q 707 63 704 33 q 710 130 710 93 l 713 504 l 710 813 l 515 818 l 336 813 q 333 643 336 762 q 331 516 331 523 l 336 130 q 345 0 336 59 q 278 2 322 0 q 215 5 234 5 l 91 0 q 98 146 91 40 q 105 284 105 252 \"},\"ΐ\":{\"x_min\":-147,\"x_max\":552,\"ha\":396,\"o\":\"m 92 126 l 92 543 l 80 666 q 139 661 105 663 q 197 658 173 658 q 265 660 239 658 q 315 666 292 663 q 305 586 308 616 q 302 523 302 557 l 302 113 q 303 72 302 88 q 315 0 305 56 l 196 4 l 82 0 q 88 67 85 30 q 92 126 92 104 m -65 961 q -7 935 -31 961 q 17 877 17 909 q -8 820 17 844 q -65 797 -33 797 q -121 820 -96 797 q -147 879 -147 844 q -123 935 -147 910 q -65 961 -99 961 m 275 1017 q 316 998 298 1017 q 334 957 334 980 q 321 919 334 935 q 283 886 307 903 l 94 755 l 36 755 l 182 950 q 225 998 204 980 q 275 1017 247 1017 m 470 961 q 528 935 504 961 q 552 877 552 910 q 528 820 552 844 q 471 797 504 797 q 413 820 438 797 q 388 879 388 844 q 412 936 388 912 q 470 961 436 961 \"},\"g\":{\"x_min\":23,\"x_max\":714.671875,\"ha\":700,\"o\":\"m 213 272 q 93 331 142 278 q 45 456 45 384 q 128 623 45 563 q 322 683 211 683 l 382 683 l 534 664 l 606 660 q 666 662 641 660 q 714 666 692 665 l 714 585 l 581 589 q 623 543 610 570 q 637 477 637 515 q 541 300 637 353 q 310 248 446 248 q 258 236 281 248 q 236 199 236 225 q 386 142 236 150 q 623 102 536 134 q 711 -68 711 71 q 591 -296 711 -218 q 313 -374 471 -374 q 111 -326 199 -374 q 23 -175 23 -279 q 63 -64 23 -110 q 171 -7 104 -19 l 171 0 q 103 39 130 7 q 76 112 76 70 q 117 201 76 163 q 213 251 159 239 l 213 272 m 169 -143 q 221 -255 169 -215 q 351 -295 274 -295 q 483 -254 427 -295 q 540 -139 540 -214 q 524 -81 540 -107 q 472 -40 508 -54 q 383 -19 437 -25 q 269 -13 330 -13 l 239 -12 q 169 -143 169 -54 m 332 304 q 411 351 392 304 q 431 472 431 399 q 413 581 431 536 q 341 626 395 626 q 267 578 287 626 q 247 466 247 530 q 262 350 247 396 q 332 304 277 304 \"},\"²\":{\"x_min\":22,\"x_max\":465.0625,\"ha\":494,\"o\":\"m 22 401 q 156 502 102 456 q 248 607 210 548 q 287 742 287 667 q 267 825 287 802 q 216 848 248 848 q 146 816 167 848 q 110 725 126 785 l 102 725 l 30 800 q 245 901 116 901 q 385 864 327 901 q 444 751 444 827 q 411 643 444 681 q 201 471 378 604 l 284 471 q 387 473 314 471 q 465 476 459 476 q 456 413 456 439 q 459 383 456 401 q 465 354 462 365 q 331 356 412 354 q 249 358 251 358 l 27 354 l 22 401 \"},\"Κ\":{\"x_min\":90,\"x_max\":892.78125,\"ha\":856,\"o\":\"m 334 716 l 334 515 l 569 787 q 635 866 619 845 q 682 932 651 886 l 767 926 q 817 929 784 926 q 870 932 851 932 q 687 746 790 851 q 503 554 585 641 l 623 377 q 892 0 753 179 l 753 5 q 664 2 727 5 q 595 0 600 0 q 484 190 545 98 q 334 404 424 281 l 334 193 q 348 0 334 94 q 270 2 325 0 q 212 5 215 5 l 90 0 q 99 236 90 69 q 108 461 108 402 q 103 623 108 515 q 99 787 99 731 l 90 932 q 157 927 113 932 q 219 922 201 922 q 282 925 252 922 q 342 932 312 927 q 338 831 342 907 q 334 716 334 755 \"},\"ë\":{\"x_min\":41,\"x_max\":684.046875,\"ha\":729,\"o\":\"m 482 98 q 566 112 532 98 q 643 160 600 126 l 661 151 q 643 96 652 125 q 628 40 634 66 q 521 -1 577 11 q 403 -15 466 -15 q 141 79 241 -15 q 41 336 41 173 q 137 586 41 490 q 386 683 234 683 q 608 601 532 683 q 684 373 684 520 l 684 332 l 267 332 q 325 165 267 232 q 482 98 383 98 m 233 976 q 300 948 272 976 q 328 878 328 920 q 303 811 328 839 q 236 784 278 784 q 166 811 194 784 q 138 878 138 838 q 166 947 138 918 q 233 976 194 976 m 493 976 q 560 948 532 976 q 588 878 588 920 q 562 811 588 838 q 496 784 536 784 q 427 811 455 784 q 399 878 399 838 q 426 946 399 917 q 493 976 454 976 m 478 411 q 481 444 481 422 q 459 566 481 513 q 377 620 438 620 q 292 562 318 620 q 267 437 267 505 l 267 411 l 478 411 \"},\"e\":{\"x_min\":43,\"x_max\":686.046875,\"ha\":729,\"o\":\"m 484 95 q 566 110 531 95 q 644 161 601 125 l 662 154 q 640 84 647 105 q 629 40 634 62 q 522 -1 577 11 q 404 -15 468 -15 q 141 77 240 -15 q 43 336 43 170 q 138 585 43 488 q 387 683 234 683 q 609 602 533 683 q 686 375 686 522 l 684 332 l 269 332 q 326 162 269 230 q 484 95 384 95 m 480 411 l 482 444 q 459 567 482 513 q 379 622 437 622 q 293 565 318 622 q 269 438 269 509 l 269 411 l 480 411 \"},\"ό\":{\"x_min\":30,\"x_max\":741,\"ha\":774,\"o\":\"m 395 683 q 645 587 550 683 q 741 337 741 492 q 646 79 741 173 q 385 -15 552 -15 q 127 78 225 -15 q 30 333 30 172 q 129 590 30 498 q 395 683 228 683 m 538 953 q 591 1001 571 986 q 639 1017 611 1017 q 692 994 671 1017 q 713 943 713 972 q 694 897 713 915 q 643 863 675 878 l 420 755 l 352 755 l 538 953 m 269 174 q 305 85 275 119 q 386 52 335 52 q 464 85 436 52 q 503 172 491 119 q 510 237 506 194 q 515 336 515 279 q 510 431 515 391 q 503 494 506 472 q 464 581 491 548 q 385 615 436 615 q 291 563 315 615 q 261 459 267 512 q 256 333 256 407 q 269 174 256 248 \"},\"J\":{\"x_min\":-37,\"x_max\":356,\"ha\":447,\"o\":\"m 214 926 q 293 929 237 926 q 356 932 349 932 q 349 680 356 857 q 342 450 342 502 q 344 314 342 411 q 346 213 346 218 l 346 105 q 249 -128 346 -36 q 10 -221 153 -221 l -24 -216 l -37 -143 l 13 -145 q 97 -94 76 -145 q 118 28 118 -44 l 118 219 q 110 619 118 352 q 103 931 103 886 l 214 926 \"},\"»\":{\"x_min\":54.5625,\"x_max\":587.890625,\"ha\":629,\"o\":\"m 187 330 l 54 604 l 110 656 l 339 333 l 110 9 l 54 66 l 187 330 m 437 330 l 304 604 l 358 656 l 587 333 l 358 9 l 304 66 l 437 330 \"},\"©\":{\"x_min\":72,\"x_max\":1064,\"ha\":1138,\"o\":\"m 1064 486 q 918 139 1064 285 q 570 -6 772 -6 q 220 139 369 -6 q 72 488 72 285 q 219 836 72 688 q 568 985 367 985 q 916 836 769 985 q 1064 486 1064 687 m 155 490 q 276 199 155 323 q 566 75 398 75 q 858 197 734 75 q 982 487 982 319 q 861 781 982 659 q 567 904 740 904 q 276 781 398 904 q 155 490 155 658 m 683 597 q 649 666 683 637 q 573 696 616 696 q 470 636 501 696 q 439 499 439 577 q 468 354 439 421 q 563 288 497 288 q 687 397 664 288 l 815 397 q 735 247 805 303 q 570 191 666 191 q 374 273 448 191 q 301 481 301 356 q 371 696 301 604 q 559 788 441 788 q 726 737 655 788 q 808 597 796 686 l 683 597 \"},\"ώ\":{\"x_min\":30,\"x_max\":1059,\"ha\":1093,\"o\":\"m 335 -15 q 111 79 192 -15 q 30 320 30 173 q 72 504 30 420 q 192 666 114 588 q 297 661 237 661 q 347 663 319 661 q 390 666 374 665 q 247 280 247 498 q 269 123 247 194 q 358 52 291 52 q 421 86 399 52 q 443 165 443 121 l 443 291 q 441 415 443 379 q 435 512 440 451 q 511 505 499 505 q 544 505 522 505 q 608 508 579 505 q 657 512 636 511 q 648 402 652 465 q 644 289 644 340 q 644 237 644 258 q 650 165 644 215 q 669 85 650 119 q 730 52 688 52 q 821 122 798 52 q 844 279 844 192 q 807 481 844 386 q 700 666 771 576 q 746 662 724 663 q 793 661 767 661 q 846 663 812 661 q 898 666 881 666 q 1016 508 974 594 q 1059 322 1059 422 q 974 83 1059 182 q 753 -15 890 -15 q 630 13 685 -15 q 545 100 575 41 q 459 14 516 44 q 335 -15 402 -15 m 684 953 q 737 1001 717 986 q 786 1017 757 1017 q 838 994 817 1017 q 859 943 859 972 q 840 897 859 915 q 790 863 821 878 l 567 755 l 498 755 l 684 953 \"},\"≥\":{\"x_min\":170.828125,\"x_max\":965,\"ha\":1139,\"o\":\"m 965 571 l 965 455 l 173 199 l 173 338 l 732 514 l 173 690 l 173 830 l 965 571 m 965 132 l 965 0 l 170 0 l 170 132 l 965 132 \"},\"^\":{\"x_min\":-3,\"x_max\":425,\"ha\":438,\"o\":\"m 148 1003 l 270 1003 l 425 755 l 357 755 l 210 878 l 62 755 l -3 755 l 148 1003 \"},\"«\":{\"x_min\":40.28125,\"x_max\":575,\"ha\":629,\"o\":\"m 193 336 l 326 62 l 272 9 l 40 333 l 272 656 l 325 599 l 193 336 m 443 336 l 575 62 l 520 9 l 288 333 l 520 656 l 575 599 l 443 336 \"},\"D\":{\"x_min\":87,\"x_max\":987,\"ha\":1032,\"o\":\"m 104 221 l 104 465 q 100 742 104 650 q 89 932 97 834 l 216 929 l 283 929 l 442 929 q 532 929 488 929 q 622 929 576 929 q 894 797 802 912 q 987 496 987 682 q 832 110 987 221 q 389 -1 677 -1 l 201 -1 l 87 -1 q 98 119 93 60 q 104 221 104 178 m 415 89 q 659 192 580 89 q 738 468 738 296 q 663 746 738 653 q 407 839 588 839 l 334 839 l 330 605 l 334 98 q 374 91 353 94 q 415 89 394 89 \"},\"w\":{\"x_min\":6.9375,\"x_max\":1048.625,\"ha\":1042,\"o\":\"m 302 6 q 270 5 281 6 q 215 0 258 4 l 6 667 q 77 663 33 667 q 129 659 120 659 q 197 663 154 659 q 248 667 240 667 q 359 238 293 457 l 440 505 l 484 667 q 540 663 502 667 q 580 659 577 659 q 637 663 598 659 q 677 667 676 667 q 712 520 695 586 q 748 383 729 454 l 790 238 l 855 475 q 875 555 862 501 q 899 667 888 609 q 939 662 917 665 q 973 659 961 659 q 1017 662 998 659 q 1048 667 1036 665 l 956 423 l 812 0 q 759 4 776 3 q 727 6 743 6 q 678 3 712 6 q 643 0 644 0 l 562 288 l 522 423 q 391 0 455 221 q 336 4 354 3 q 302 6 318 6 \"},\"$\":{\"x_min\":43,\"x_max\":697,\"ha\":749,\"o\":\"m 43 79 q 104 254 76 165 l 128 254 q 202 128 150 177 q 331 79 254 79 l 331 365 q 108 474 168 409 q 49 623 49 539 q 130 807 49 737 q 331 889 211 878 q 322 1010 331 949 q 344 1006 329 1008 q 371 1002 360 1004 q 393 1004 382 1004 q 417 1010 403 1005 q 410 955 412 983 q 409 892 409 926 q 555 868 502 880 q 662 823 607 855 q 601 665 626 746 l 570 665 q 409 817 538 789 l 409 554 q 637 445 577 511 q 697 289 697 379 q 615 91 697 168 q 409 0 534 15 l 409 -62 q 409 -97 409 -84 q 411 -136 410 -109 l 368 -133 l 325 -136 q 328 -69 328 -112 q 331 0 329 -26 q 43 79 173 0 m 331 817 q 243 778 278 817 q 209 686 209 739 q 245 615 209 644 q 331 577 282 586 l 331 817 m 534 212 q 499 299 534 267 q 405 347 464 330 l 405 78 q 497 123 461 89 q 534 212 534 157 \"},\"‧\":{\"x_min\":105,\"x_max\":343,\"ha\":447,\"o\":\"m 223 654 q 306 617 270 654 q 343 533 343 581 q 306 451 343 486 q 223 417 270 417 q 139 450 174 417 q 105 534 105 483 q 139 619 105 584 q 223 654 174 654 \"},\"\\\\\":{\"x_min\":-31.953125,\"x_max\":422,\"ha\":383,\"o\":\"m -31 1024 l 49 1024 l 422 -126 l 338 -126 l -31 1024 \"},\"Ι\":{\"x_min\":94,\"x_max\":354,\"ha\":447,\"o\":\"m 111 402 q 107 716 111 609 q 94 932 103 822 q 161 925 124 929 q 220 922 198 922 q 292 927 245 922 q 353 931 339 932 q 340 716 343 819 q 337 465 337 613 q 340 221 337 326 q 354 0 344 116 q 273 2 330 0 q 214 5 216 5 l 95 0 q 107 199 103 88 q 111 402 111 311 \"},\"Ύ\":{\"x_min\":-28,\"x_max\":1295.609375,\"ha\":1247,\"o\":\"m 635 650 q 566 772 622 672 q 469 931 509 872 l 591 926 q 683 929 619 926 q 755 931 748 931 q 844 740 803 825 q 941 554 885 656 q 1040 730 991 636 q 1135 931 1088 825 l 1210 926 q 1252 929 1224 926 q 1295 931 1280 931 q 1142 689 1213 812 q 997 420 1072 566 l 1001 143 l 1007 0 l 913 5 l 755 0 q 761 138 755 50 q 768 237 768 226 l 768 402 l 635 650 m 158 953 q 211 1001 191 986 q 259 1017 231 1017 q 312 994 291 1017 q 333 943 333 972 q 314 897 333 916 q 264 863 295 878 l 40 755 l -28 755 l 158 953 \"},\"’\":{\"x_min\":70.828125,\"x_max\":337.5,\"ha\":374,\"o\":\"m 70 528 l 151 848 q 183 919 158 889 q 244 949 208 949 q 310 924 283 949 q 337 862 337 900 q 331 829 337 845 q 316 797 326 813 l 111 511 l 70 528 \"},\"Ν\":{\"x_min\":86,\"x_max\":930.453125,\"ha\":1010,\"o\":\"m 101 444 q 97 645 101 523 q 94 787 94 768 l 90 931 l 177 926 l 268 934 q 526 623 395 775 q 792 327 657 470 l 792 584 q 787 766 792 643 q 782 931 782 888 q 825 927 811 929 q 854 926 838 926 q 890 927 876 926 q 930 934 904 929 q 919 838 923 889 q 915 738 915 788 q 913 461 915 600 q 911 184 912 322 q 913 106 911 147 q 920 0 915 66 q 876 4 901 2 q 838 6 851 6 q 794 4 812 6 q 756 0 777 2 q 495 309 631 151 q 220 618 359 466 l 220 241 l 227 0 q 194 4 213 1 q 159 6 175 6 q 119 4 134 6 q 86 0 103 2 q 97 208 94 105 q 101 444 101 311 \"},\"-\":{\"x_min\":58.71875,\"x_max\":386.5,\"ha\":447,\"o\":\"m 65 334 q 62 383 65 352 q 58 422 58 415 l 386 422 l 379 333 l 386 247 l 58 247 q 62 296 58 265 q 65 334 65 327 \"},\"Q\":{\"x_min\":40,\"x_max\":1098.328125,\"ha\":1129,\"o\":\"m 40 456 q 190 819 40 689 q 577 949 340 949 q 945 829 804 949 q 1086 486 1086 709 q 1004 185 1086 313 q 759 10 922 56 l 883 -72 q 1098 -182 979 -129 l 1098 -200 q 1005 -241 1053 -216 q 906 -294 956 -265 q 737 -160 824 -226 q 533 -13 649 -94 q 174 110 308 -13 q 40 456 40 233 m 562 72 q 773 193 706 72 q 840 472 840 315 q 773 741 840 623 q 566 860 706 860 q 354 741 421 860 q 287 465 287 622 q 353 192 287 312 q 562 72 420 72 \"},\"ς\":{\"x_min\":48,\"x_max\":647,\"ha\":689,\"o\":\"m 421 600 q 306 538 350 600 q 263 404 263 477 q 357 244 263 304 q 532 151 445 197 q 627 -17 627 88 q 527 -214 627 -140 q 302 -288 427 -288 q 291 -198 302 -247 q 318 -203 296 -198 q 353 -207 341 -207 q 440 -176 402 -207 q 484 -95 478 -145 q 324 60 484 -17 q 106 179 164 139 q 48 353 48 219 q 153 590 48 500 q 409 681 259 681 q 527 666 470 681 q 647 623 584 651 q 616 532 626 561 q 597 465 606 504 l 559 465 q 513 563 546 526 q 421 600 479 600 \"},\"M\":{\"x_min\":32,\"x_max\":1165,\"ha\":1217,\"o\":\"m 105 465 l 168 932 q 211 927 190 929 q 261 926 231 926 q 309 929 277 926 q 358 932 341 932 q 441 709 409 790 q 503 559 473 629 q 608 316 533 488 l 778 690 q 872 932 834 808 q 919 929 887 932 q 966 926 951 926 q 1027 929 1006 926 q 1059 932 1048 932 l 1105 473 q 1130 240 1117 354 q 1165 0 1144 127 q 1095 3 1140 0 q 1041 6 1051 6 q 969 3 1015 6 q 915 0 924 0 q 895 291 915 142 l 865 616 q 731 317 802 480 q 597 0 661 153 l 551 0 l 500 0 q 409 218 465 87 q 317 426 352 349 q 236 605 282 504 l 196 229 q 185 108 190 173 q 180 0 180 44 q 134 3 165 0 q 100 6 102 6 q 60 4 77 6 q 32 0 43 1 q 105 465 77 258 \"},\"Ψ\":{\"x_min\":84,\"x_max\":1097.890625,\"ha\":1185,\"o\":\"m 307 708 q 307 639 307 686 q 307 569 307 593 q 342 407 307 462 q 478 353 377 353 l 480 484 q 472 735 480 568 q 464 932 464 903 q 530 925 494 929 q 587 922 566 922 q 658 927 612 922 q 719 931 705 932 q 712 777 719 877 q 706 666 706 677 l 702 353 q 800 378 761 353 q 853 457 839 404 q 871 582 868 511 q 875 670 875 652 q 868 811 875 720 q 861 931 861 901 q 926 927 881 931 q 984 922 970 922 q 1039 926 1002 922 q 1097 930 1077 930 q 1093 869 1094 904 q 1092 801 1092 834 l 1092 738 l 1092 687 l 1092 610 q 992 354 1092 432 q 702 261 892 277 q 710 126 702 219 q 719 0 719 33 q 646 3 691 0 q 591 6 601 6 q 516 3 562 6 q 464 0 470 0 q 472 134 464 40 q 480 261 480 229 q 188 358 287 261 q 90 651 90 455 l 90 804 l 90 820 q 84 930 90 881 q 139 926 102 930 q 196 922 177 922 q 257 927 219 922 q 322 931 295 931 q 311 813 316 876 q 307 708 307 750 \"},\"C\":{\"x_min\":43,\"x_max\":891.84375,\"ha\":900,\"o\":\"m 587 856 q 363 744 442 856 q 285 479 285 632 q 361 202 285 322 q 586 82 437 82 q 740 108 668 82 q 855 194 812 135 l 877 184 q 861 120 868 152 q 846 45 854 88 q 710 -2 786 12 q 555 -18 634 -18 q 184 109 326 -18 q 43 464 43 236 q 190 819 43 690 q 569 949 338 949 q 723 932 652 949 q 891 876 793 915 q 866 793 879 840 q 846 710 852 746 l 827 710 q 734 818 799 781 q 587 856 669 856 \"},\"œ\":{\"x_min\":36,\"x_max\":1154.0625,\"ha\":1197,\"o\":\"m 387 -15 q 131 79 227 -15 q 36 334 36 173 q 131 586 36 490 q 383 683 226 683 q 630 606 515 683 q 735 664 677 645 q 859 683 792 683 q 1076 600 999 683 q 1154 377 1154 517 l 1152 332 l 736 332 q 793 165 736 232 q 951 98 851 98 q 1111 160 1042 98 l 1127 151 q 1111 101 1116 119 q 1094 40 1105 83 q 990 -1 1049 11 q 870 -15 931 -15 q 735 2 794 -15 q 628 68 676 20 q 521 4 584 23 q 387 -15 458 -15 m 949 411 l 949 445 q 921 580 949 541 q 844 620 893 620 q 756 557 777 620 q 736 411 736 494 l 949 411 m 276 171 q 315 80 286 115 q 395 45 344 45 q 453 62 424 45 q 498 115 481 79 q 520 204 514 151 q 526 329 526 257 q 516 475 526 408 q 476 577 506 542 q 394 612 445 612 q 294 552 327 612 q 271 470 279 520 q 264 329 264 420 q 266 244 264 269 q 276 171 268 219 \"},\"!\":{\"x_min\":103,\"x_max\":341,\"ha\":444,\"o\":\"m 222 221 q 306 187 271 221 q 341 104 341 154 q 306 19 341 54 q 222 -15 271 -15 q 138 19 173 -15 q 103 103 103 53 q 137 186 103 151 q 222 221 172 221 m 113 818 q 142 910 113 872 q 224 949 171 949 q 304 921 274 949 q 334 847 334 894 q 325 741 334 796 q 306 628 317 687 l 276 462 q 253 296 259 369 l 193 296 q 113 818 153 557 \"},\"ç\":{\"x_min\":36,\"x_max\":622,\"ha\":660,\"o\":\"m 423 600 q 306 528 346 600 q 267 373 267 457 q 313 176 267 265 q 459 88 359 88 q 542 99 500 88 q 612 133 584 111 l 622 126 l 590 19 q 502 -6 551 1 q 406 -15 453 -15 q 141 76 247 -15 q 36 325 36 168 q 140 583 36 485 q 408 681 245 681 q 622 637 519 681 q 590 459 602 550 l 565 459 q 519 561 555 522 q 423 600 483 600 m 175 -203 q 276 -231 251 -226 q 332 -236 301 -236 q 381 -223 361 -236 q 402 -184 402 -211 q 384 -144 402 -161 q 341 -128 366 -128 q 319 -130 328 -128 q 301 -135 310 -132 l 301 2 l 358 2 l 358 -77 l 418 -75 q 496 -108 465 -80 q 527 -183 527 -136 q 487 -274 527 -239 q 388 -310 448 -310 q 268 -299 326 -310 q 151 -265 211 -289 l 175 -203 \"},\"{\":{\"x_min\":104,\"x_max\":587.328125,\"ha\":683,\"o\":\"m 587 844 l 540 844 q 468 821 487 844 q 446 785 449 798 q 443 752 443 773 l 443 712 l 443 552 q 416 424 443 464 q 304 353 390 383 q 413 287 383 335 q 443 155 443 238 l 443 -5 q 465 -105 443 -74 q 555 -136 488 -136 l 587 -136 l 587 -277 l 481 -275 q 343 -234 396 -268 q 280 -122 289 -200 l 280 -50 l 280 116 q 246 238 280 194 q 137 283 212 283 l 104 283 l 104 422 q 240 458 201 422 q 280 588 280 494 l 280 756 l 280 831 q 355 951 292 919 q 517 983 417 983 l 587 983 l 587 844 \"},\"X\":{\"x_min\":-1.390625,\"x_max\":801.390625,\"ha\":782,\"o\":\"m 169 241 l 301 436 l 15 932 q 94 929 38 932 q 155 926 150 926 q 235 929 179 926 q 298 932 291 932 q 314 893 308 907 q 358 802 320 880 l 445 638 q 547 805 513 748 q 613 932 581 862 q 655 929 627 932 q 698 926 683 926 q 740 929 712 926 q 783 932 768 932 q 685 800 709 833 q 616 701 661 766 l 502 531 l 801 0 q 713 2 776 0 q 647 5 651 5 l 516 0 l 470 108 l 356 326 q 265 174 316 263 q 170 0 215 84 q 118 3 154 0 q 77 6 81 6 q 31 4 52 6 q -1 0 11 1 l 169 241 \"},\"ô\":{\"x_min\":32,\"x_max\":743,\"ha\":775,\"o\":\"m 395 683 q 647 588 551 683 q 743 337 743 494 q 648 79 743 173 q 387 -15 554 -15 q 129 78 227 -15 q 32 333 32 172 q 130 590 32 497 q 395 683 229 683 m 325 1003 l 450 1003 l 601 755 l 534 755 l 387 878 l 238 755 l 174 755 l 325 1003 m 269 174 q 307 85 277 120 q 387 50 337 50 q 466 84 437 50 q 500 156 494 119 q 511 215 507 194 q 517 335 517 271 q 511 450 517 395 q 500 509 507 471 q 466 582 494 548 q 387 616 439 616 q 294 564 319 616 q 263 459 269 513 q 258 333 258 406 q 260 244 258 270 q 269 174 262 217 \"},\"#\":{\"x_min\":30,\"x_max\":1019,\"ha\":1049,\"o\":\"m 619 974 l 522 698 l 684 698 l 781 974 l 930 975 l 831 698 l 1019 699 l 970 564 l 783 563 l 725 403 l 920 403 l 873 271 l 678 271 l 579 -5 l 432 -5 l 530 271 l 367 271 l 270 -5 l 121 -5 l 220 270 l 30 271 l 79 403 l 268 403 l 326 563 l 127 564 l 174 699 l 374 698 l 472 975 l 619 974 m 414 402 l 582 402 l 639 563 l 470 563 l 414 402 \"},\"ι\":{\"x_min\":80,\"x_max\":314.71875,\"ha\":396,\"o\":\"m 91 126 l 91 543 l 80 667 q 139 661 105 664 q 196 658 173 658 q 264 661 238 658 q 314 666 291 663 q 304 587 307 616 q 301 523 301 558 l 301 113 q 302 72 301 88 q 314 0 304 56 l 195 4 l 81 0 q 87 67 84 30 q 91 126 91 104 \"},\"Ά\":{\"x_min\":-28,\"x_max\":983.109375,\"ha\":963,\"o\":\"m 242 322 q 326 529 276 400 q 411 751 377 659 q 484 948 445 843 l 553 944 l 623 948 q 805 450 717 684 q 983 0 892 215 l 849 4 l 713 0 l 684 91 l 630 259 q 531 261 581 259 q 433 264 481 262 l 335 259 q 245 0 295 134 l 155 4 l 103 0 l 242 322 m 158 953 q 211 1001 191 986 q 259 1017 231 1017 q 312 994 291 1017 q 333 943 333 972 q 314 897 333 916 q 265 863 295 878 l 40 755 l -28 755 l 158 953 m 487 368 l 597 368 q 549 509 573 446 q 488 662 526 572 q 376 370 428 519 l 487 368 \"},\")\":{\"x_min\":72.21875,\"x_max\":383,\"ha\":449,\"o\":\"m 227 366 q 191 656 227 521 q 76 906 156 792 l 120 949 q 317 691 252 826 q 383 382 383 555 q 317 63 383 201 q 115 -201 252 -75 l 72 -158 q 191 81 156 -48 q 227 366 227 211 \"},\"ε\":{\"x_min\":55,\"x_max\":599,\"ha\":657,\"o\":\"m 512 502 q 472 579 502 548 q 396 611 442 611 q 323 577 352 611 q 295 499 295 544 q 317 429 295 460 q 377 394 340 399 l 449 394 l 449 373 q 449 336 449 349 q 449 316 449 323 q 413 319 438 319 q 322 281 362 319 q 283 195 283 244 q 323 101 283 144 q 412 59 363 59 q 498 88 461 59 q 571 167 535 117 l 599 155 q 593 130 595 144 q 592 104 592 115 q 592 82 592 90 q 599 53 592 74 q 351 -15 485 -15 q 145 30 236 -15 q 55 176 55 75 q 105 289 55 244 q 232 360 155 335 q 127 421 166 385 q 88 516 88 456 q 165 643 88 603 q 340 683 243 683 q 592 612 479 683 q 565 556 576 583 q 551 502 554 530 l 512 502 \"},\"Δ\":{\"x_min\":11,\"x_max\":958.328125,\"ha\":972,\"o\":\"m 490 926 q 531 928 509 926 q 566 932 554 930 q 690 599 633 746 q 815 296 747 452 q 958 0 884 140 q 720 3 879 0 q 481 8 562 8 q 247 3 404 8 q 11 0 90 0 q 234 470 126 223 q 415 932 342 716 q 448 928 429 930 q 490 926 468 926 m 314 373 q 217 127 262 259 q 425 118 314 118 q 542 122 468 118 q 636 127 616 127 q 598 232 616 184 q 538 391 580 280 l 433 645 l 314 373 \"},\"â\":{\"x_min\":44,\"x_max\":706.78125,\"ha\":706,\"o\":\"m 237 -15 q 98 35 153 -15 q 44 169 44 86 q 212 352 44 301 q 401 421 380 403 q 410 439 410 432 q 373 539 410 502 q 275 577 337 577 q 140 511 185 577 l 135 511 l 115 585 q 230 657 164 632 q 365 683 296 683 q 543 623 479 683 q 608 452 608 564 l 604 213 q 604 166 604 184 q 608 123 604 148 q 625 87 612 99 q 658 76 638 76 q 679 80 666 76 q 702 90 691 84 l 706 40 q 643 1 676 14 q 566 -15 610 -10 q 482 5 520 -15 q 421 64 443 25 q 237 -15 351 -15 m 291 1003 l 413 1003 l 566 755 l 501 755 l 350 878 l 203 755 l 138 755 l 291 1003 m 240 200 q 261 128 240 158 q 321 99 282 99 q 388 131 367 99 q 410 211 410 164 l 410 352 q 287 302 335 338 q 240 200 240 267 \"},\"}\":{\"x_min\":93,\"x_max\":579,\"ha\":683,\"o\":\"m 126 983 q 323 955 243 983 q 403 831 403 927 l 403 756 l 403 588 q 423 478 403 512 q 473 434 443 444 q 539 423 504 424 q 579 422 574 422 l 579 283 q 442 249 481 283 q 403 116 403 216 l 403 -50 q 373 -204 403 -147 q 284 -267 343 -260 q 179 -275 225 -274 q 93 -277 133 -277 l 93 -137 q 201 -121 163 -137 q 240 -43 240 -105 l 240 -4 l 240 155 q 269 285 240 241 q 380 353 298 328 q 268 421 296 378 q 240 553 240 463 l 240 713 q 227 805 240 771 q 166 844 215 838 l 93 844 l 93 983 l 126 983 \"},\"‰\":{\"x_min\":28,\"x_max\":1618,\"ha\":1647,\"o\":\"m 265 910 q 434 844 369 910 q 500 672 500 779 q 435 496 500 562 q 258 431 370 431 q 91 498 154 431 q 28 669 28 565 q 93 843 28 776 q 265 910 158 910 m 831 1015 l 917 1014 l 272 -125 l 184 -125 l 831 1015 m 850 463 q 1020 401 955 463 q 1085 230 1085 339 q 1023 51 1085 117 q 846 -15 961 -15 q 678 51 743 -15 q 613 222 613 118 q 676 398 613 333 q 850 463 739 463 m 1383 463 q 1554 400 1490 463 q 1618 229 1618 337 q 1556 51 1618 117 q 1378 -15 1494 -15 q 1209 51 1274 -15 q 1144 222 1144 118 q 1209 396 1144 329 q 1383 463 1274 463 m 780 112 q 798 57 780 83 q 847 31 817 31 q 895 59 874 31 q 916 114 916 87 q 922 222 922 162 q 922 275 922 248 q 915 338 917 312 q 896 389 912 364 q 848 414 880 414 q 813 404 828 414 q 792 375 797 394 q 777 312 781 347 q 773 241 773 276 l 773 222 q 773 183 773 201 q 780 112 774 165 m 196 561 q 214 505 196 532 q 261 478 232 478 q 297 489 280 478 q 323 525 314 501 q 335 586 332 548 q 339 669 339 625 q 337 723 339 697 q 332 780 336 749 q 311 836 327 811 q 264 861 296 861 q 204 820 222 861 q 191 752 194 786 q 188 669 188 719 q 196 561 188 615 m 1315 112 q 1333 56 1315 82 q 1381 31 1351 31 q 1417 42 1402 31 q 1442 76 1433 53 q 1454 138 1451 100 q 1458 222 1458 176 q 1458 275 1458 248 q 1449 344 1453 312 q 1426 395 1445 376 q 1383 414 1408 414 q 1327 379 1338 414 q 1311 301 1315 344 q 1307 222 1307 258 q 1308 164 1307 190 q 1315 112 1309 139 \"},\"Ä\":{\"x_min\":-28,\"x_max\":848.390625,\"ha\":829,\"o\":\"m 109 323 q 187 512 148 413 q 274 740 225 611 q 350 948 323 870 l 420 945 l 492 948 q 666 463 583 687 q 848 0 749 240 l 718 2 l 579 0 l 551 91 l 497 259 q 399 261 448 259 q 300 264 349 262 l 202 259 l 113 0 q 74 2 95 2 q 42 2 53 2 l 21 2 l -28 0 l 109 323 m 284 1242 q 351 1214 323 1242 q 380 1148 380 1187 q 353 1079 380 1108 q 286 1050 327 1050 q 216 1077 245 1050 q 187 1148 187 1105 q 215 1214 187 1187 q 284 1242 243 1242 m 543 1242 q 611 1215 583 1242 q 639 1148 639 1189 q 613 1078 639 1107 q 546 1050 587 1050 q 478 1077 507 1050 q 449 1148 449 1105 q 476 1214 449 1186 q 543 1242 504 1242 m 352 368 l 462 368 q 414 511 437 450 q 350 662 390 571 q 243 370 296 516 l 352 368 \"},\"a\":{\"x_min\":47,\"x_max\":708.15625,\"ha\":706,\"o\":\"m 237 -15 q 100 35 154 -15 q 47 169 47 86 q 213 352 47 301 q 403 422 380 404 q 410 440 410 433 q 373 541 410 504 q 273 579 337 579 q 197 561 232 579 q 140 509 162 544 l 135 509 l 114 585 q 364 683 218 683 q 541 624 478 683 q 604 452 604 566 l 604 214 q 604 169 604 191 q 606 119 604 148 q 656 76 616 76 q 677 79 665 76 q 702 89 690 83 l 708 40 q 563 -11 644 -11 q 479 7 516 -11 q 421 64 441 26 q 339 4 387 23 q 237 -15 291 -15 m 240 198 q 261 127 240 158 q 322 97 282 97 q 388 131 367 97 q 410 212 410 165 l 410 351 q 287 301 334 337 q 240 198 240 266 \"},\"—\":{\"x_min\":226.390625,\"x_max\":1138.890625,\"ha\":1365,\"o\":\"m 226 421 l 1138 421 l 1138 278 l 226 278 l 226 421 \"},\"=\":{\"x_min\":169.4375,\"x_max\":968.0625,\"ha\":1138,\"o\":\"m 968 615 l 968 484 l 169 484 l 169 615 l 968 615 m 968 329 l 968 196 l 169 196 l 169 329 l 968 329 \"},\"N\":{\"x_min\":86,\"x_max\":930.453125,\"ha\":1010,\"o\":\"m 101 444 q 97 645 101 523 q 94 787 94 768 l 90 931 l 177 926 l 268 934 q 526 623 395 775 q 792 327 657 470 l 792 584 q 787 766 792 643 q 782 931 782 888 q 825 927 811 929 q 854 926 838 926 q 890 927 876 926 q 930 934 904 929 q 919 838 923 889 q 915 738 915 788 q 913 461 915 600 q 911 184 912 322 q 913 106 911 147 q 920 0 915 66 q 876 4 901 2 q 838 6 851 6 q 794 4 812 6 q 756 0 777 2 q 495 309 631 151 q 220 618 359 466 l 220 241 l 227 0 q 194 4 213 1 q 159 6 175 6 q 119 4 134 6 q 86 0 103 2 q 97 208 94 105 q 101 444 101 311 \"},\"ρ\":{\"x_min\":48,\"x_max\":759,\"ha\":793,\"o\":\"m 160 -366 q 48 -374 109 -366 q 52 -291 48 -343 q 56 -223 56 -239 l 56 169 l 48 314 q 139 585 48 488 q 403 683 231 683 q 661 589 563 683 q 759 336 759 495 q 681 89 759 194 q 465 -15 603 -15 q 266 65 346 -15 l 264 -208 q 265 -268 264 -241 q 275 -373 267 -295 q 197 -367 220 -368 q 160 -366 173 -366 m 275 347 q 284 196 275 264 q 324 109 295 142 q 404 77 352 77 q 494 120 473 77 q 522 212 514 164 q 531 347 531 260 q 526 431 531 388 q 517 511 522 473 q 483 582 512 549 q 401 615 453 615 q 309 566 340 615 q 279 452 279 517 q 275 372 275 412 l 275 347 \"},\"2\":{\"x_min\":33,\"x_max\":706.625,\"ha\":749,\"o\":\"m 33 75 q 236 249 152 168 q 379 431 321 330 q 438 652 438 533 q 413 772 438 723 q 325 822 389 822 q 220 767 251 822 q 170 616 189 712 l 155 616 q 44 743 107 691 q 189 867 105 823 q 373 911 273 911 q 586 847 500 911 q 673 658 673 783 q 619 480 673 548 q 304 196 566 411 l 430 195 l 553 195 l 706 201 q 689 94 689 148 q 696 38 689 66 q 706 0 703 11 q 514 3 630 0 q 380 7 399 7 q 181 3 302 7 q 44 0 60 0 l 33 75 \"},\"ü\":{\"x_min\":75,\"x_max\":722,\"ha\":808,\"o\":\"m 292 -15 q 142 41 202 -15 q 83 188 83 98 l 83 337 q 79 508 83 394 q 75 666 75 623 q 134 660 108 662 q 185 658 160 658 q 240 660 209 658 q 300 666 271 663 q 290 454 290 569 l 290 384 l 290 279 q 316 146 290 181 q 394 111 343 111 q 467 147 441 111 q 501 234 493 184 l 501 330 q 498 498 501 385 q 495 666 495 610 q 554 660 518 663 q 613 658 589 658 q 671 660 640 658 q 722 666 701 663 q 717 479 722 598 q 712 326 712 359 q 717 156 712 270 q 722 1 722 43 l 617 4 l 511 1 l 511 96 q 410 15 468 46 q 292 -15 353 -15 m 273 976 q 338 948 310 976 q 366 878 366 920 q 339 811 366 839 q 274 784 313 784 q 205 811 234 784 q 176 878 176 839 q 204 947 176 918 q 273 976 232 976 m 531 976 q 599 948 571 976 q 627 878 627 920 q 599 812 627 841 q 533 784 572 784 q 464 811 495 784 q 434 878 434 839 q 462 947 434 918 q 531 976 490 976 \"},\"Z\":{\"x_min\":25,\"x_max\":831.953125,\"ha\":831,\"o\":\"m 25 54 q 186 311 81 142 q 354 582 291 480 q 495 813 418 685 l 294 813 q 98 801 186 813 l 105 852 q 98 932 105 894 l 444 926 q 657 928 509 926 q 815 931 805 931 l 815 903 q 573 517 695 715 q 331 119 451 320 l 566 119 q 706 122 654 119 q 831 136 758 125 q 826 43 826 96 l 827 0 q 606 3 761 0 q 443 6 451 6 q 203 3 370 6 q 25 0 36 0 l 25 54 \"},\"u\":{\"x_min\":75,\"x_max\":722,\"ha\":808,\"o\":\"m 292 -15 q 141 41 200 -15 q 83 189 83 97 l 83 336 q 79 508 83 393 q 75 667 75 624 q 140 659 109 662 q 185 656 171 656 q 251 661 218 656 q 299 666 285 665 l 290 454 l 290 382 l 290 279 q 316 147 290 182 q 393 112 343 112 q 464 146 441 112 q 497 234 488 181 l 501 331 q 497 498 501 387 q 493 667 493 610 q 563 659 531 662 q 612 656 594 656 q 672 661 640 656 q 722 666 703 665 q 716 495 722 609 q 711 326 711 381 q 716 163 711 272 q 722 1 722 55 l 616 4 l 511 1 l 511 94 q 411 15 470 45 q 292 -15 353 -15 \"},\"k\":{\"x_min\":80,\"x_max\":732.765625,\"ha\":756,\"o\":\"m 93 550 q 86 827 93 648 q 80 1024 80 1005 q 184 1018 125 1018 q 307 1023 252 1018 q 301 812 307 959 q 296 602 296 665 l 296 389 q 424 511 368 445 q 545 666 481 576 q 595 665 562 666 q 645 663 628 663 l 709 666 l 714 656 l 628 576 l 475 425 q 636 154 543 304 l 732 0 q 661 3 706 0 q 607 6 616 6 q 537 3 580 6 q 487 0 494 0 q 386 174 441 83 q 296 329 332 266 q 299 141 296 273 q 302 0 302 9 l 191 4 l 80 0 q 86 320 80 113 q 93 550 93 526 \"},\"Η\":{\"x_min\":91,\"x_max\":955,\"ha\":1049,\"o\":\"m 105 286 l 105 459 q 101 650 105 533 q 98 784 98 766 l 91 932 q 156 926 125 929 q 214 923 187 923 q 277 926 241 923 q 344 931 314 929 q 339 818 344 894 q 334 713 334 741 l 334 563 l 514 561 l 710 561 l 710 712 q 707 812 710 778 q 697 932 705 846 q 764 926 727 929 q 828 923 800 923 q 889 926 854 923 q 955 931 924 929 q 948 690 955 856 q 941 465 941 523 q 948 225 941 391 q 955 0 955 58 l 828 5 q 764 2 807 5 q 698 0 721 0 q 707 99 704 47 q 710 202 710 152 l 710 444 q 595 447 665 444 q 514 451 525 451 q 411 447 475 451 q 334 444 346 444 l 334 202 q 339 97 334 167 q 344 0 344 26 q 270 2 323 0 q 214 5 218 5 l 91 0 q 98 146 91 40 q 105 286 105 252 \"},\"Α\":{\"x_min\":-29.171875,\"x_max\":850,\"ha\":829,\"o\":\"m 109 322 q 193 530 143 400 q 278 751 244 660 q 351 949 312 843 l 420 944 l 490 949 q 672 450 584 685 q 850 0 759 215 l 716 4 l 580 0 l 551 91 l 497 259 q 398 261 448 259 q 300 264 348 262 l 202 259 q 112 0 162 134 l 22 4 l -29 0 l 109 322 m 354 368 l 464 368 q 416 509 440 446 q 355 662 393 572 q 243 370 295 519 l 354 368 \"},\"ß\":{\"x_min\":84,\"x_max\":776,\"ha\":811,\"o\":\"m 198 4 l 84 1 q 87 120 84 45 q 91 212 91 195 l 91 352 l 91 651 q 167 928 91 832 q 420 1024 243 1024 q 603 985 522 1024 q 684 854 684 946 q 607 713 684 786 q 530 601 530 640 q 543 563 530 583 q 574 533 556 543 l 688 447 q 776 275 776 379 q 690 67 776 150 q 478 -15 605 -15 q 373 8 428 -15 l 403 161 l 417 161 q 461 88 435 113 q 535 64 488 64 q 600 91 574 64 q 626 157 626 118 q 504 316 626 219 q 377 476 383 413 q 459 650 377 547 q 542 822 542 754 q 511 908 542 873 q 428 943 481 943 q 327 892 361 943 q 294 770 294 841 q 296 495 294 602 q 301 238 298 387 q 304 1 304 88 l 198 4 \"},\"é\":{\"x_min\":41,\"x_max\":684.046875,\"ha\":729,\"o\":\"m 482 98 q 566 112 532 98 q 643 160 600 126 l 661 151 q 643 96 652 125 q 628 40 634 66 q 521 -1 577 11 q 403 -15 466 -15 q 141 79 241 -15 q 41 336 41 173 q 137 586 41 490 q 386 683 234 683 q 608 601 532 683 q 684 373 684 520 l 684 332 l 267 332 q 325 165 267 232 q 482 98 383 98 m 409 951 q 459 1000 436 983 q 511 1017 481 1017 q 563 994 542 1017 q 585 943 585 971 q 565 895 585 915 q 515 861 545 875 l 292 754 l 223 754 l 409 951 m 478 411 q 481 444 481 422 q 459 566 481 513 q 377 620 438 620 q 292 562 318 620 q 267 437 267 505 l 267 411 l 478 411 \"},\"s\":{\"x_min\":43,\"x_max\":543,\"ha\":583,\"o\":\"m 95 197 q 155 95 115 133 q 256 57 195 57 q 338 77 300 57 q 376 140 376 98 q 213 259 376 195 q 51 456 51 323 q 129 623 51 563 q 319 683 208 683 q 411 671 366 683 q 515 638 455 660 l 464 485 l 450 485 q 397 575 433 542 q 303 608 362 608 q 234 588 264 608 q 205 530 205 569 q 374 417 205 478 q 543 227 543 356 q 464 48 543 112 q 266 -15 386 -15 q 148 -6 201 -15 q 43 26 95 3 l 76 197 l 95 197 \"},\"B\":{\"x_min\":91,\"x_max\":773,\"ha\":815,\"o\":\"m 109 208 l 109 465 q 105 714 109 605 q 91 932 102 823 l 250 929 l 417 929 q 655 881 560 929 q 751 707 751 834 q 692 566 751 618 q 542 503 634 515 l 542 491 q 704 431 636 491 q 773 276 773 372 q 678 69 773 138 q 438 0 584 0 l 250 4 q 152 2 211 4 q 91 0 92 0 q 103 104 97 51 q 109 208 109 158 m 519 698 q 479 803 519 763 q 374 844 440 844 l 335 839 q 331 687 331 766 l 331 540 q 466 578 413 540 q 519 698 519 617 m 380 87 q 490 137 450 87 q 531 258 531 187 q 484 392 531 338 q 360 446 437 446 l 331 446 l 331 276 l 335 91 l 380 87 \"},\"…\":{\"x_min\":93,\"x_max\":1053,\"ha\":1182,\"o\":\"m 195 191 q 268 160 236 191 q 300 88 300 129 q 268 16 300 46 q 195 -13 237 -13 q 123 16 154 -13 q 93 88 93 45 q 123 160 93 129 q 195 191 154 191 m 575 191 q 647 160 615 191 q 679 88 679 129 q 647 16 679 46 q 575 -13 616 -13 q 501 16 532 -13 q 471 88 471 45 q 501 160 471 129 q 575 191 532 191 m 948 191 q 1021 160 989 191 q 1053 88 1053 129 q 1021 16 1053 46 q 948 -13 990 -13 q 876 16 907 -13 q 846 88 846 45 q 876 160 846 129 q 948 191 907 191 \"},\"?\":{\"x_min\":93,\"x_max\":539,\"ha\":597,\"o\":\"m 295 221 q 377 186 340 221 q 414 104 414 152 q 378 23 414 61 q 295 -15 343 -15 q 210 19 245 -15 q 175 103 175 53 q 211 183 175 146 q 295 221 247 221 m 433 288 q 378 277 411 280 q 339 275 344 275 q 201 329 261 275 q 142 459 142 383 q 238 620 142 530 q 335 777 335 709 q 310 838 335 812 q 252 864 286 864 q 175 838 211 864 q 119 775 138 813 l 101 777 q 93 891 101 843 q 294 949 181 949 q 467 890 395 949 q 539 730 539 832 q 429 554 539 644 q 320 407 320 464 q 338 363 320 378 q 386 349 357 349 q 421 353 403 349 q 448 358 439 357 l 433 288 \"},\"H\":{\"x_min\":91,\"x_max\":957,\"ha\":1049,\"o\":\"m 105 284 l 105 461 q 101 651 105 534 q 98 787 98 768 l 91 932 q 153 927 107 932 q 222 922 200 922 q 288 926 252 922 q 345 932 324 930 q 336 827 339 886 q 334 712 334 769 l 334 564 l 515 560 l 710 564 l 710 712 q 699 932 710 833 q 767 927 721 932 q 829 922 813 922 q 895 927 851 922 q 956 932 940 932 q 943 702 947 829 q 939 461 939 576 q 942 217 939 306 q 957 0 945 128 q 883 3 930 0 q 829 6 837 6 q 755 3 804 6 q 698 0 706 0 q 707 97 704 35 q 710 201 710 158 l 710 445 q 599 447 676 445 q 515 450 522 450 l 334 445 l 334 201 q 336 88 334 120 q 345 0 338 56 q 278 2 322 0 q 215 5 234 5 q 153 2 194 5 q 91 0 111 0 q 98 146 91 40 q 105 284 105 252 \"},\"ν\":{\"x_min\":9,\"x_max\":658,\"ha\":694,\"o\":\"m 470 438 q 463 504 470 477 q 422 642 457 532 q 641 671 528 660 q 658 582 658 626 q 614 412 658 494 l 541 270 q 462 107 487 161 q 417 0 438 53 q 374 3 403 0 q 331 8 345 8 q 289 3 317 8 q 246 0 261 0 q 165 236 209 110 q 85 458 121 361 q 9 667 49 555 q 72 661 40 664 q 128 659 103 659 q 184 661 152 659 q 245 666 217 664 q 403 184 300 449 q 454 328 438 275 q 470 438 470 381 \"},\"î\":{\"x_min\":-15,\"x_max\":413,\"ha\":396,\"o\":\"m 93 126 l 93 543 q 87 602 93 558 q 82 666 82 645 q 141 661 111 664 q 198 659 172 659 q 255 661 223 659 q 316 666 287 664 q 311 621 315 658 q 303 544 307 584 l 303 319 q 305 144 303 212 q 316 0 307 76 l 196 2 l 81 0 q 93 126 93 66 m 136 1003 l 258 1003 l 413 755 l 345 755 l 198 878 l 50 755 l -15 755 l 136 1003 \"},\"c\":{\"x_min\":36,\"x_max\":623.109375,\"ha\":660,\"o\":\"m 421 600 q 306 530 344 600 q 268 376 268 461 q 313 177 268 266 q 459 88 359 88 q 539 99 498 88 q 608 135 580 111 l 617 126 l 587 21 q 500 -5 546 3 q 404 -15 454 -15 q 140 76 245 -15 q 36 324 36 168 q 140 583 36 484 q 406 683 245 683 q 623 638 514 683 q 607 570 617 620 q 587 462 596 520 l 562 462 q 515 561 550 522 q 421 600 480 600 \"},\"¶\":{\"x_min\":18,\"x_max\":531,\"ha\":590,\"o\":\"m 298 968 l 531 968 l 531 910 l 473 910 l 473 4 l 415 4 l 415 910 l 305 910 l 305 4 l 247 4 l 247 558 q 99 601 163 558 q 27 690 36 645 q 18 744 18 734 q 90 896 18 824 q 298 968 163 968 \"},\"β\":{\"x_min\":82,\"x_max\":753,\"ha\":828,\"o\":\"m 91 -115 q 86 188 91 -19 q 82 493 82 397 q 85 654 82 597 q 102 796 88 711 q 205 951 115 882 q 421 1021 294 1021 q 626 953 540 1021 q 713 770 713 886 q 671 634 713 690 q 553 542 629 579 q 700 438 647 506 q 753 273 753 369 q 680 68 753 152 q 490 -15 608 -15 q 390 0 435 -15 q 298 50 345 16 l 298 -105 l 306 -371 q 246 -365 278 -368 q 192 -362 214 -362 q 138 -365 169 -362 q 82 -370 108 -368 q 86 -238 82 -327 q 91 -115 91 -148 m 372 572 q 474 623 445 572 q 503 757 503 674 q 484 897 503 839 q 403 956 466 956 q 332 908 354 956 q 305 807 310 861 q 299 683 300 752 q 298 551 298 613 l 298 269 q 320 131 298 188 q 412 75 343 75 q 501 135 477 75 q 525 273 525 195 q 496 431 525 377 q 372 486 467 486 l 372 572 \"},\"Μ\":{\"x_min\":32,\"x_max\":1165,\"ha\":1217,\"o\":\"m 105 465 l 168 932 q 211 927 190 929 q 261 926 231 926 q 309 929 277 926 q 358 932 341 932 q 441 709 409 790 q 503 559 473 629 q 608 316 533 488 l 778 690 q 872 932 834 808 q 919 929 887 932 q 966 926 951 926 q 1027 929 1006 926 q 1059 932 1048 932 l 1105 473 q 1130 240 1117 354 q 1165 0 1144 127 q 1095 3 1140 0 q 1041 6 1051 6 q 969 3 1015 6 q 915 0 924 0 q 895 291 915 142 l 865 616 q 731 317 802 480 q 597 0 661 153 l 551 0 l 500 0 q 409 218 465 87 q 317 426 352 349 q 236 605 282 504 l 196 229 q 185 108 190 173 q 180 0 180 44 q 134 3 165 0 q 100 6 102 6 q 60 4 77 6 q 32 0 43 1 q 105 465 77 258 \"},\"Ό\":{\"x_min\":-28,\"x_max\":1364,\"ha\":1407,\"o\":\"m 855 949 q 1223 829 1082 949 q 1364 486 1364 710 q 1220 114 1364 244 q 830 -15 1076 -15 q 454 107 591 -15 q 318 465 318 229 q 466 823 318 697 q 855 949 615 949 m 158 953 q 211 1001 191 986 q 259 1017 231 1017 q 312 994 291 1017 q 333 943 333 972 q 314 897 333 916 q 265 863 295 878 l 40 755 l -28 755 l 158 953 m 840 73 q 1051 194 984 73 q 1118 472 1118 315 q 1051 742 1118 624 q 844 860 984 860 q 631 742 698 860 q 565 465 565 624 q 631 193 565 313 q 840 73 698 73 \"},\"Ή\":{\"x_min\":-28,\"x_max\":1333.109375,\"ha\":1424,\"o\":\"m 482 284 l 482 460 q 478 651 482 534 q 474 787 474 768 l 468 931 q 530 927 484 931 q 599 922 577 922 q 665 926 629 922 q 722 931 701 930 q 713 827 716 886 q 711 711 711 769 l 711 563 l 891 560 l 1086 564 l 1086 712 q 1075 931 1086 833 q 1143 927 1097 931 q 1205 922 1190 922 q 1272 927 1227 922 q 1333 931 1316 931 q 1319 702 1323 829 q 1315 460 1315 576 q 1318 217 1315 306 q 1333 0 1321 128 q 1260 3 1306 0 q 1205 6 1213 6 q 1131 3 1180 6 q 1074 0 1083 0 q 1083 97 1080 35 q 1086 201 1086 158 l 1086 444 q 975 447 1052 444 q 891 450 898 450 l 711 444 l 711 201 q 713 88 711 120 q 722 0 715 56 q 655 2 699 0 q 592 5 611 5 q 530 2 571 5 q 468 0 488 0 q 475 146 468 40 q 482 284 482 252 m 158 953 q 211 1001 191 986 q 259 1017 231 1017 q 312 994 291 1017 q 333 943 333 972 q 314 897 333 916 q 265 863 295 878 l 40 755 l -28 755 l 158 953 \"},\"•\":{\"x_min\":215.28125,\"x_max\":805.5625,\"ha\":1024,\"o\":\"m 512 803 q 718 714 631 803 q 805 505 805 626 q 719 299 805 387 q 512 212 633 212 q 301 298 387 212 q 215 505 215 384 q 303 714 215 626 q 512 803 391 803 \"},\"¥\":{\"x_min\":8,\"x_max\":752,\"ha\":764,\"o\":\"m 38 252 l 38 336 l 160 332 l 277 332 l 277 417 q 140 413 225 417 q 38 410 55 410 l 38 494 q 131 486 87 486 l 228 486 l 143 644 q 87 751 114 704 q 8 888 60 799 q 82 884 34 888 q 138 881 130 881 q 213 884 167 881 q 265 888 258 888 q 433 529 349 696 q 524 707 478 613 q 608 888 571 802 q 640 888 624 888 q 674 888 657 888 l 752 888 q 602 642 653 729 q 516 486 551 554 l 722 494 l 722 410 q 583 413 668 410 q 485 417 497 417 l 485 331 l 722 336 l 722 252 q 604 255 690 252 q 485 258 518 258 q 490 123 485 213 q 495 0 495 33 l 386 5 q 316 2 364 5 q 264 0 268 0 q 274 126 271 59 q 277 258 277 194 q 140 255 235 258 q 38 252 45 252 \"},\"(\":{\"x_min\":91,\"x_max\":403.5,\"ha\":449,\"o\":\"m 249 479 l 249 379 l 249 277 q 287 54 249 161 q 402 -158 326 -53 l 356 -201 q 158 57 225 -80 q 91 365 91 195 q 158 683 91 541 q 359 949 225 825 l 403 906 q 288 701 328 808 q 249 479 249 594 \"},\"U\":{\"x_min\":82,\"x_max\":910,\"ha\":999,\"o\":\"m 211 926 q 275 929 232 926 q 338 932 318 932 q 325 681 329 826 q 321 421 321 536 q 373 175 321 241 q 521 110 425 110 q 678 161 611 110 q 755 278 746 212 q 768 419 765 344 q 771 547 771 494 q 754 931 771 761 l 812 926 l 910 932 q 903 769 910 882 q 896 615 896 655 l 896 480 q 896 427 896 462 q 896 375 896 391 q 793 82 896 180 q 494 -15 691 -15 q 211 55 323 -15 q 100 286 100 126 q 91 616 100 383 q 82 932 82 850 q 154 929 102 932 q 211 926 207 926 \"},\"γ\":{\"x_min\":0,\"x_max\":713.890625,\"ha\":700,\"o\":\"m 523 199 q 486 87 498 128 q 474 -62 474 47 q 477 -246 474 -135 q 481 -374 481 -357 q 407 -366 442 -368 q 326 -365 373 -365 l 250 -370 q 258 -204 250 -315 q 267 -72 267 -93 q 246 138 267 52 q 189 344 225 224 q 130 512 154 463 q 50 561 105 561 q 25 558 38 561 q 0 553 11 555 l 0 635 q 79 669 38 656 q 159 683 119 683 q 329 593 293 683 q 433 233 365 503 q 519 456 482 349 q 576 666 555 562 l 644 663 l 713 666 q 633 490 665 572 q 523 199 601 408 \"},\"α\":{\"x_min\":30,\"x_max\":827.21875,\"ha\":878,\"o\":\"m 669 665 l 749 662 l 827 665 q 763 499 782 551 q 720 377 743 447 l 818 0 q 763 6 792 2 q 717 10 733 10 q 662 5 692 10 q 615 0 632 1 l 594 101 q 361 -15 501 -15 q 120 83 210 -15 q 30 334 30 182 q 123 583 30 484 q 368 683 217 683 q 515 647 449 683 q 633 547 582 612 q 651 601 640 563 q 669 665 662 638 m 383 614 q 313 588 343 614 q 276 523 283 562 q 260 434 265 484 q 256 333 256 385 q 269 174 256 249 q 305 87 275 122 q 385 52 335 52 q 509 144 473 52 q 546 340 546 236 q 522 504 546 428 q 455 597 498 580 q 383 614 411 614 \"},\"F\":{\"x_min\":91,\"x_max\":645.15625,\"ha\":686,\"o\":\"m 109 465 q 105 710 109 620 q 91 932 102 800 l 357 926 q 520 929 406 926 q 645 932 635 932 l 638 871 q 645 810 638 844 q 524 815 607 810 q 415 820 442 820 l 339 820 q 337 663 339 778 q 335 546 335 548 l 634 557 l 629 494 l 634 431 q 462 437 573 431 q 335 443 350 443 l 335 236 q 337 106 335 149 q 348 0 339 62 l 219 2 l 91 0 q 105 209 102 102 q 109 465 109 316 \"},\"­\":{\"x_min\":0,\"x_max\":683.328125,\"ha\":683,\"o\":\"m 0 421 l 683 421 l 683 278 l 0 278 l 0 421 \"},\":\":{\"x_min\":105,\"x_max\":343,\"ha\":447,\"o\":\"m 223 221 q 307 185 272 221 q 343 103 343 150 q 306 19 343 54 q 223 -15 270 -15 q 139 18 174 -15 q 105 103 105 51 q 139 186 105 151 q 223 221 174 221 m 223 654 q 306 617 270 654 q 343 532 343 581 q 306 450 343 485 q 223 416 270 416 q 139 449 174 416 q 105 534 105 482 q 139 619 105 584 q 223 654 174 654 \"},\"Χ\":{\"x_min\":-1.390625,\"x_max\":801.390625,\"ha\":782,\"o\":\"m 169 241 l 301 436 l 15 932 q 94 929 38 932 q 155 926 150 926 q 235 929 179 926 q 298 932 291 932 q 314 893 308 907 q 358 802 320 880 l 445 638 q 547 805 513 748 q 613 932 581 862 q 655 929 627 932 q 698 926 683 926 q 740 929 712 926 q 783 932 768 932 q 685 800 709 833 q 616 701 661 766 l 502 531 l 801 0 q 713 2 776 0 q 647 5 651 5 l 516 0 l 470 108 l 356 326 q 265 174 316 263 q 170 0 215 84 q 118 3 154 0 q 77 6 81 6 q 31 4 52 6 q -1 0 11 1 l 169 241 \"},\"*\":{\"x_min\":91,\"x_max\":588,\"ha\":683,\"o\":\"m 154 520 q 128 571 139 550 q 91 634 117 593 q 186 665 139 650 q 284 698 234 680 q 190 734 242 716 q 91 765 139 751 q 154 879 125 816 l 310 750 l 298 808 l 275 949 l 339 947 l 405 948 l 368 745 l 525 879 q 588 765 553 822 q 398 698 499 737 q 490 664 441 680 q 588 634 539 648 q 557 581 574 612 q 525 520 540 551 l 370 650 q 389 528 381 580 q 404 443 397 476 l 337 446 l 273 446 l 310 650 l 154 520 \"},\"°\":{\"x_min\":165,\"x_max\":519,\"ha\":683,\"o\":\"m 165 913 q 221 1032 165 980 q 351 1084 278 1084 q 469 1040 420 1084 q 519 926 519 996 q 464 804 519 853 q 335 755 409 755 q 214 799 264 755 q 165 913 165 844 m 241 905 q 268 832 241 863 q 338 801 295 801 q 414 837 388 801 q 441 927 441 874 q 416 1009 441 977 q 345 1042 392 1042 q 281 1018 310 1042 q 247 962 253 994 q 241 905 241 930 \"},\"V\":{\"x_min\":-19.4375,\"x_max\":856.953125,\"ha\":818,\"o\":\"m 255 230 l -19 932 q 61 929 4 932 q 120 926 117 926 l 247 932 q 298 768 270 840 l 476 296 l 646 770 q 673 852 662 812 q 692 932 685 891 l 766 926 q 812 929 781 926 q 856 932 843 932 q 752 706 801 819 l 566 231 q 488 0 520 123 q 445 4 463 2 q 413 6 427 6 q 368 3 397 6 q 336 0 340 0 q 304 97 322 46 q 255 230 286 147 \"},\"Ξ\":{\"x_min\":58.328125,\"x_max\":816.671875,\"ha\":876,\"o\":\"m 438 190 q 653 193 518 190 q 816 197 788 197 q 812 124 812 160 l 812 99 q 812 51 812 74 q 816 0 812 27 q 629 4 754 0 q 438 8 504 8 q 248 4 375 8 q 58 0 122 0 l 63 98 l 58 197 q 281 193 145 197 q 438 190 418 190 m 438 747 q 258 743 379 747 q 77 739 137 739 q 84 804 83 784 q 84 834 84 823 q 77 932 84 879 q 267 927 140 932 q 438 922 394 922 q 626 927 500 922 q 797 932 752 932 l 793 835 l 797 739 q 619 743 738 739 q 438 747 500 747 m 708 467 l 713 375 q 577 379 669 375 q 438 383 486 383 q 300 379 391 383 q 162 375 208 375 q 165 418 163 397 q 168 468 168 440 q 165 523 168 484 q 162 567 162 562 q 438 554 300 554 q 713 566 577 554 l 708 467 \"},\" \":{\"x_min\":0,\"x_max\":0,\"ha\":375},\"Ϋ\":{\"x_min\":-32,\"x_max\":797,\"ha\":747,\"o\":\"m 133 650 q 52 795 94 720 q -32 931 11 869 l 91 928 l 256 932 q 365 700 329 773 q 441 554 401 627 q 541 731 491 634 q 636 932 590 827 l 711 928 l 797 932 q 644 689 714 812 q 498 420 573 566 l 502 143 l 509 0 l 413 5 l 256 0 q 261 118 256 38 q 267 236 267 197 l 267 402 l 133 650 m 242 1242 q 309 1215 281 1242 q 337 1148 337 1189 q 311 1078 337 1107 q 243 1050 285 1050 q 173 1078 203 1050 q 144 1148 144 1107 q 173 1214 144 1186 q 242 1242 202 1242 m 502 1242 q 571 1214 542 1242 q 600 1148 600 1187 q 572 1078 600 1107 q 505 1050 545 1050 q 435 1077 463 1050 q 408 1148 408 1105 q 435 1214 408 1186 q 502 1242 463 1242 \"},\"0\":{\"x_min\":34,\"x_max\":709,\"ha\":749,\"o\":\"m 367 -19 q 104 104 175 -19 q 34 436 34 228 q 109 777 34 644 q 377 910 184 910 q 640 785 572 910 q 709 443 709 660 q 635 108 709 236 q 367 -19 561 -19 m 260 447 q 261 330 260 382 q 269 213 262 279 q 296 101 276 147 q 374 56 316 56 q 453 108 430 56 q 477 221 477 160 q 480 287 478 254 q 483 458 483 365 q 480 590 483 543 q 477 665 478 637 q 452 779 477 727 q 372 832 428 832 q 281 765 299 832 q 263 598 263 698 q 261 505 263 561 q 260 447 260 448 \"},\"”\":{\"x_min\":72.21875,\"x_max\":615.28125,\"ha\":654,\"o\":\"m 72 528 l 152 848 q 183 920 159 891 q 245 949 206 949 q 311 926 286 949 q 337 861 337 903 q 315 797 337 827 l 112 511 l 72 528 m 351 528 l 430 848 q 462 919 437 889 q 525 949 487 949 q 588 925 562 949 q 615 864 615 901 q 609 829 615 845 q 594 797 604 813 l 391 511 l 351 528 \"},\"@\":{\"x_min\":59,\"x_max\":1305,\"ha\":1365,\"o\":\"m 581 72 q 418 131 475 72 q 362 298 362 191 q 455 554 362 437 q 684 672 548 672 q 771 650 734 672 q 843 586 808 629 l 877 653 l 998 653 l 897 254 l 893 229 q 912 193 893 205 q 957 181 931 181 q 1119 290 1056 181 q 1183 504 1183 399 q 1060 772 1183 668 q 771 877 937 877 q 354 735 526 877 q 183 353 183 594 q 327 20 183 140 q 689 -100 471 -100 q 898 -66 792 -100 q 1092 25 1004 -33 l 1143 -51 q 689 -204 945 -204 q 244 -54 429 -204 q 59 348 59 94 q 261 804 59 621 q 739 988 464 988 q 1134 856 964 988 q 1305 505 1305 725 q 1195 206 1305 340 q 920 72 1085 72 l 895 72 q 818 90 846 72 q 777 180 791 108 q 691 99 739 127 q 581 72 643 72 m 693 578 q 552 487 600 578 q 505 294 505 397 q 532 207 505 245 q 606 169 560 169 q 712 212 668 169 q 772 322 756 256 l 808 466 q 773 546 804 515 q 693 578 742 578 \"},\"Ί\":{\"x_min\":-28,\"x_max\":728,\"ha\":822,\"o\":\"m 485 402 q 481 715 485 609 q 468 931 477 822 q 535 925 498 929 q 594 922 572 922 q 666 927 620 922 q 727 931 713 931 q 714 716 717 819 q 711 465 711 613 q 714 221 711 326 q 728 0 718 116 q 647 2 704 0 q 588 5 590 5 l 469 0 q 481 199 477 88 q 485 402 485 310 m 157 953 q 210 1001 190 986 q 258 1017 230 1017 q 311 994 290 1017 q 332 943 332 972 q 313 897 332 916 q 264 863 294 878 l 40 755 l -28 755 l 157 953 \"},\"ö\":{\"x_min\":32,\"x_max\":743,\"ha\":775,\"o\":\"m 395 683 q 647 588 551 683 q 743 337 743 494 q 648 79 743 173 q 387 -15 554 -15 q 129 78 227 -15 q 32 333 32 172 q 130 590 32 497 q 395 683 229 683 m 257 976 q 324 948 296 976 q 352 878 352 920 q 325 811 352 839 q 258 784 299 784 q 190 811 221 784 q 160 878 160 839 q 188 947 160 918 q 257 976 217 976 m 517 976 q 585 948 557 976 q 613 878 613 920 q 586 811 613 839 q 519 784 560 784 q 450 811 479 784 q 421 878 421 839 q 449 947 421 918 q 517 976 478 976 m 269 174 q 307 85 277 120 q 387 50 337 50 q 466 84 437 50 q 500 156 494 119 q 511 215 507 194 q 517 335 517 271 q 511 450 517 395 q 500 509 507 471 q 466 582 494 548 q 387 616 439 616 q 294 564 319 616 q 263 459 269 513 q 258 333 258 406 q 260 244 258 270 q 269 174 262 217 \"},\"i\":{\"x_min\":80,\"x_max\":314.71875,\"ha\":396,\"o\":\"m 196 1014 q 273 980 240 1014 q 307 902 307 947 q 274 825 307 858 q 196 793 241 793 q 118 824 151 793 q 85 902 85 856 q 118 980 85 947 q 196 1014 151 1014 m 91 127 l 91 543 l 80 666 q 140 660 109 663 q 196 658 171 658 q 253 660 223 658 q 314 666 284 663 l 301 545 l 301 319 q 302 145 301 206 q 312 0 304 84 l 194 4 l 81 0 q 88 64 85 33 q 91 127 91 95 \"},\"Β\":{\"x_min\":91,\"x_max\":773,\"ha\":815,\"o\":\"m 109 208 l 109 465 q 105 714 109 605 q 91 932 102 823 l 250 929 l 417 929 q 655 881 560 929 q 751 707 751 834 q 692 566 751 618 q 542 503 634 515 l 542 491 q 704 431 636 491 q 773 276 773 372 q 678 69 773 138 q 438 0 584 0 l 250 4 q 152 2 211 4 q 91 0 92 0 q 103 104 97 51 q 109 208 109 158 m 519 698 q 479 803 519 763 q 374 844 440 844 l 335 839 q 331 687 331 766 l 331 540 q 466 578 413 540 q 519 698 519 617 m 380 87 q 490 137 450 87 q 531 258 531 187 q 484 392 531 338 q 360 446 437 446 l 331 446 l 331 276 l 335 91 l 380 87 \"},\"≤\":{\"x_min\":170.984375,\"x_max\":962.28125,\"ha\":1139,\"o\":\"m 960 690 l 403 514 l 960 338 l 960 200 l 171 455 l 170 572 l 960 830 l 960 690 m 962 132 l 962 0 l 171 0 l 171 132 l 962 132 \"},\"υ\":{\"x_min\":82,\"x_max\":765,\"ha\":843,\"o\":\"m 765 416 q 663 115 765 245 q 401 -15 562 -15 q 162 56 243 -15 q 82 284 82 128 l 86 479 q 84 590 86 523 q 82 666 82 656 q 145 663 99 666 q 195 661 191 661 q 263 663 216 661 q 311 666 309 666 q 295 477 301 566 q 290 294 290 387 q 310 122 290 193 q 402 52 330 52 q 515 146 487 52 q 544 351 544 240 q 525 502 544 433 q 469 656 507 570 q 580 659 528 656 q 684 673 632 662 q 743 548 721 614 q 765 416 765 482 \"},\"]\":{\"x_min\":76,\"x_max\":385.71875,\"ha\":454,\"o\":\"m 80 -129 l 76 -85 l 227 -88 q 231 134 227 -14 q 235 356 235 282 q 231 605 235 438 q 227 855 227 771 l 164 855 l 76 855 l 80 885 q 80 908 80 896 q 76 931 77 925 l 230 926 l 385 933 l 373 566 l 373 359 l 373 199 l 383 -164 l 227 -157 q 141 -160 195 -157 q 76 -164 86 -164 l 80 -129 \"},\"m\":{\"x_min\":80,\"x_max\":1135,\"ha\":1217,\"o\":\"m 91 329 q 85 517 91 394 q 80 667 80 640 l 184 662 l 293 666 l 293 571 q 392 651 334 619 q 511 683 450 683 q 628 653 579 683 q 700 559 676 623 q 791 651 733 620 q 921 683 849 683 q 1068 624 1011 683 q 1125 477 1125 566 l 1125 331 q 1130 158 1125 274 q 1135 0 1135 41 q 1070 2 1116 0 q 1019 5 1024 5 q 954 2 999 5 q 905 0 909 0 q 910 155 905 51 q 915 298 915 259 l 915 385 q 896 506 915 458 q 818 554 877 554 q 755 528 779 554 q 719 460 730 502 q 712 381 714 426 q 710 319 710 335 q 715 153 710 265 q 720 0 720 41 q 656 3 694 0 q 608 6 617 6 q 544 3 585 6 q 496 0 504 0 q 501 155 496 51 q 506 298 506 259 l 506 385 q 487 505 506 456 q 409 554 469 554 q 346 528 370 554 q 310 460 321 502 q 303 381 305 426 q 301 319 301 335 q 306 153 301 265 q 311 0 311 41 q 243 3 284 0 q 195 6 202 6 q 128 3 170 6 q 80 0 86 0 q 85 163 80 53 q 91 329 91 273 \"},\"χ\":{\"x_min\":15.28125,\"x_max\":730.5625,\"ha\":731,\"o\":\"m 569 380 l 472 204 l 545 31 q 631 -159 586 -62 q 729 -368 676 -255 l 600 -363 q 475 -371 537 -363 q 404 -147 438 -259 l 350 1 l 268 -155 q 218 -260 242 -204 q 176 -371 194 -316 q 105 -363 143 -363 q 16 -371 62 -363 q 97 -240 52 -319 q 197 -66 141 -162 l 298 111 l 168 423 q 130 509 148 466 q 63 568 101 563 l 15 564 l 15 638 q 166 683 83 683 q 286 628 252 683 q 367 445 320 573 l 422 318 l 499 479 q 572 665 544 582 l 634 662 q 697 665 674 662 q 730 668 719 668 l 569 380 \"},\"8\":{\"x_min\":34,\"x_max\":710,\"ha\":749,\"o\":\"m 511 492 q 654 412 598 471 q 710 266 710 352 q 607 53 710 128 q 360 -21 504 -21 q 131 50 229 -21 q 34 248 34 122 q 88 406 34 341 q 235 492 143 471 l 235 502 q 117 568 164 516 q 71 689 71 620 q 165 855 71 802 q 382 908 259 908 q 584 857 498 908 q 671 696 671 806 q 628 574 671 621 q 511 502 586 526 l 511 492 m 373 528 q 456 573 432 528 q 481 684 481 618 q 458 792 481 748 q 376 836 435 836 q 290 791 316 836 q 264 683 264 747 q 291 575 264 622 q 373 528 318 528 m 369 55 q 464 117 439 55 q 489 259 489 180 q 465 396 489 335 q 379 457 441 457 q 285 393 314 457 q 256 256 256 329 q 278 114 256 174 q 369 55 301 55 \"},\"ί\":{\"x_min\":80,\"x_max\":478.609375,\"ha\":396,\"o\":\"m 91 126 l 91 543 l 80 666 q 139 660 105 663 q 196 658 173 658 q 264 660 238 658 q 314 666 291 663 q 304 586 307 616 q 301 523 301 557 l 301 113 q 302 72 301 88 q 314 0 304 56 l 195 4 l 81 0 q 87 67 84 30 q 91 126 91 104 m 303 953 q 357 1001 337 986 q 406 1017 377 1017 q 457 994 437 1017 q 478 943 478 972 q 459 897 478 915 q 410 863 441 878 l 187 755 l 118 755 l 303 953 \"},\"Ζ\":{\"x_min\":25,\"x_max\":831.953125,\"ha\":831,\"o\":\"m 25 54 q 186 311 81 142 q 354 582 291 480 q 495 813 418 685 l 294 813 q 98 801 186 813 l 105 852 q 98 932 105 894 l 444 926 q 657 928 509 926 q 815 931 805 931 l 815 903 q 573 517 695 715 q 331 119 451 320 l 566 119 q 706 122 654 119 q 831 136 758 125 q 826 43 826 96 l 827 0 q 606 3 761 0 q 443 6 451 6 q 203 3 370 6 q 25 0 36 0 l 25 54 \"},\"R\":{\"x_min\":87,\"x_max\":860.609375,\"ha\":836,\"o\":\"m 106 398 q 96 663 106 486 q 87 931 87 841 l 182 927 q 295 932 207 927 q 420 938 382 938 q 699 874 625 938 q 773 697 773 811 q 713 538 773 603 q 560 465 654 474 q 701 235 627 350 q 860 0 775 120 l 753 5 l 578 0 q 469 202 531 100 q 320 438 408 304 l 320 258 q 322 114 320 154 q 331 0 324 75 q 261 3 304 0 q 211 6 217 6 q 140 3 184 6 q 87 0 95 0 q 96 198 87 65 q 106 398 106 331 m 544 689 q 505 805 544 760 q 397 850 467 850 l 324 850 l 320 696 l 320 506 q 483 548 422 506 q 544 689 544 590 \"},\"×\":{\"x_min\":183.828125,\"x_max\":970.171875,\"ha\":1139,\"o\":\"m 577 501 l 877 800 l 970 706 l 670 408 l 970 106 l 876 13 l 577 314 l 277 13 l 184 106 l 483 408 l 183 706 l 277 800 l 577 501 \"},\"o\":{\"x_min\":30,\"x_max\":741,\"ha\":774,\"o\":\"m 395 683 q 645 587 550 683 q 741 337 741 492 q 646 79 741 173 q 385 -15 552 -15 q 127 78 225 -15 q 30 333 30 172 q 129 590 30 498 q 395 683 228 683 m 269 174 q 305 85 275 119 q 386 52 335 52 q 464 85 436 52 q 503 172 491 119 q 510 237 506 194 q 515 336 515 279 q 510 431 515 391 q 503 494 506 472 q 464 581 491 548 q 385 615 436 615 q 291 563 315 615 q 261 459 267 512 q 256 333 256 407 q 269 174 256 248 \"},\"5\":{\"x_min\":46,\"x_max\":670,\"ha\":749,\"o\":\"m 284 60 q 397 118 360 60 q 434 258 434 176 q 404 391 434 333 q 307 450 375 450 q 183 388 238 450 l 118 422 q 128 525 126 467 q 131 606 131 583 q 126 749 131 684 q 108 878 121 814 l 118 888 q 268 883 173 888 q 387 878 362 878 q 635 888 519 878 l 630 793 q 636 696 630 739 q 479 702 579 696 q 365 709 378 709 l 225 709 q 213 501 213 608 q 399 548 301 548 q 591 480 513 548 q 670 300 670 413 q 559 59 670 139 q 280 -21 449 -21 q 156 -7 222 -21 q 46 32 90 5 q 94 133 74 84 q 131 238 115 182 l 152 237 q 180 109 152 158 q 284 60 208 60 \"},\"7\":{\"x_min\":96,\"x_max\":760,\"ha\":749,\"o\":\"m 333 343 l 549 689 q 439 693 511 689 q 329 697 366 697 q 221 694 272 697 q 98 689 171 691 q 105 755 104 734 q 105 787 105 775 q 102 844 105 808 q 98 888 98 881 l 401 883 l 741 887 l 760 849 q 312 0 491 452 l 216 0 l 105 0 l 96 18 q 229 187 177 119 q 333 343 280 255 \"},\"K\":{\"x_min\":90,\"x_max\":892.78125,\"ha\":856,\"o\":\"m 334 716 l 334 515 l 569 787 q 635 866 619 845 q 682 932 651 886 l 767 926 q 817 929 784 926 q 870 932 851 932 q 687 746 790 851 q 503 554 585 641 l 623 377 q 892 0 753 179 l 753 5 q 664 2 727 5 q 595 0 600 0 q 484 190 545 98 q 334 404 424 281 l 334 193 q 348 0 334 94 q 270 2 325 0 q 212 5 215 5 l 90 0 q 99 236 90 69 q 108 461 108 402 q 103 623 108 515 q 99 787 99 731 l 90 932 q 157 927 113 932 q 219 922 201 922 q 282 925 252 922 q 342 932 312 927 q 338 831 342 907 q 334 716 334 755 \"},\",\":{\"x_min\":25,\"x_max\":319.4375,\"ha\":375,\"o\":\"m 109 121 q 146 203 119 168 q 218 238 173 238 q 289 208 259 238 q 319 136 319 178 q 313 101 319 118 q 294 64 306 85 l 62 -253 l 25 -238 l 109 121 \"},\"d\":{\"x_min\":54,\"x_max\":744,\"ha\":825,\"o\":\"m 318 -15 q 115 84 177 -15 q 54 336 54 184 q 124 583 54 483 q 336 683 194 683 q 525 584 451 683 l 525 738 l 518 1024 q 581 1016 554 1019 q 630 1013 609 1013 q 678 1015 653 1013 q 744 1023 703 1018 q 740 900 744 983 q 736 775 736 816 q 738 403 736 627 q 740 176 740 179 l 744 0 q 680 3 721 0 q 630 6 638 6 q 568 3 608 6 q 520 0 528 0 q 523 39 522 16 q 525 85 525 62 q 430 8 477 32 q 318 -15 383 -15 m 396 587 q 328 562 355 587 q 289 499 300 538 q 273 409 277 460 q 269 316 269 358 q 295 158 269 227 q 396 89 321 89 q 501 167 473 89 q 530 338 530 245 q 503 511 530 435 q 396 587 477 587 \"},\"¨\":{\"x_min\":65.28125,\"x_max\":609.71875,\"ha\":654,\"o\":\"m 251 613 q 218 541 243 570 q 154 512 194 512 q 90 537 116 512 q 65 601 65 563 q 87 665 65 634 l 291 949 l 331 933 l 251 613 m 530 613 q 498 542 525 573 q 433 512 472 512 q 371 536 397 512 q 345 598 345 560 q 366 665 345 633 l 570 949 l 609 933 l 530 613 \"},\"E\":{\"x_min\":90,\"x_max\":644.15625,\"ha\":703,\"o\":\"m 108 222 l 108 465 q 104 710 108 620 q 91 932 101 800 l 357 926 q 520 929 405 926 q 644 932 634 932 q 640 903 641 916 q 638 872 638 890 q 639 848 638 857 q 644 810 640 840 q 530 815 606 810 q 414 820 453 820 l 338 820 l 334 545 l 634 557 q 630 527 631 541 q 628 494 628 514 l 633 431 q 459 437 571 431 q 334 444 347 444 l 334 296 q 336 190 334 264 q 338 113 338 115 q 638 129 489 113 l 634 63 l 638 0 q 433 3 562 0 q 278 7 305 7 q 169 3 235 7 q 90 0 102 0 q 102 114 96 54 q 108 222 108 175 \"},\"Y\":{\"x_min\":-30,\"x_max\":797,\"ha\":747,\"o\":\"m 136 650 q 67 772 123 672 q -30 932 10 872 l 92 926 q 184 929 120 926 q 256 931 249 931 q 345 740 304 825 q 442 554 386 656 q 541 730 492 636 q 637 931 589 825 l 712 926 q 753 929 726 926 q 797 931 781 931 q 644 689 714 812 q 498 420 573 566 l 502 143 l 508 0 l 414 5 l 256 0 q 262 138 256 50 q 269 237 269 226 l 269 402 l 136 650 \"},\"\\\"\":{\"x_min\":53,\"x_max\":399,\"ha\":451,\"o\":\"m 181 958 l 181 586 l 53 586 l 53 958 l 181 958 m 399 958 l 399 586 l 271 586 l 271 958 l 399 958 \"},\"ê\":{\"x_min\":41,\"x_max\":684.046875,\"ha\":729,\"o\":\"m 482 98 q 566 112 532 98 q 643 160 600 126 l 661 151 q 643 96 652 125 q 628 40 634 66 q 521 -1 577 11 q 403 -15 466 -15 q 141 79 241 -15 q 41 336 41 173 q 137 586 41 490 q 386 683 234 683 q 608 601 532 683 q 684 373 684 520 l 684 332 l 267 332 q 325 165 267 232 q 482 98 383 98 m 302 1001 l 426 1001 l 577 754 l 512 754 l 364 876 l 216 754 l 149 754 l 302 1001 m 478 411 q 481 444 481 422 q 459 566 481 513 q 377 620 438 620 q 292 562 318 620 q 267 437 267 505 l 267 411 l 478 411 \"},\"δ\":{\"x_min\":30,\"x_max\":688,\"ha\":719,\"o\":\"m 543 794 q 498 889 531 854 q 407 924 465 924 q 329 895 362 924 q 296 822 296 867 q 393 671 296 739 q 585 539 490 603 q 688 308 688 444 q 600 71 688 157 q 359 -15 513 -15 q 119 70 209 -15 q 30 305 30 155 q 88 503 30 419 q 256 614 147 586 q 130 696 178 650 q 82 812 82 743 q 173 968 82 916 q 374 1021 263 1021 q 629 946 510 1021 q 606 875 617 912 q 582 788 596 839 l 543 794 m 269 163 q 296 83 276 114 q 360 52 317 52 q 435 95 414 52 q 462 204 456 139 l 462 306 l 462 407 q 438 513 462 464 q 363 561 415 561 q 298 529 321 561 q 269 449 274 496 q 260 382 263 421 q 258 306 258 343 q 260 227 258 249 q 269 163 262 206 \"},\"έ\":{\"x_min\":55,\"x_max\":667.5,\"ha\":657,\"o\":\"m 512 501 q 472 579 502 548 q 396 611 442 611 q 323 577 352 611 q 295 498 295 544 q 316 429 295 458 q 375 394 337 399 l 450 394 l 450 373 q 450 336 450 349 q 450 316 450 323 q 414 319 438 319 q 322 280 361 319 q 283 194 283 242 q 323 101 283 144 q 413 59 363 59 q 498 88 461 59 q 572 167 536 117 l 600 155 q 594 130 596 144 q 593 104 593 115 q 593 82 593 90 q 600 53 593 74 q 351 -15 486 -15 q 145 30 236 -15 q 55 176 55 75 q 105 289 55 244 q 233 360 156 335 q 127 421 167 385 q 88 516 88 456 q 165 643 88 603 q 340 683 243 683 q 593 612 480 683 q 565 556 576 583 q 551 501 555 530 l 512 501 m 492 955 q 545 1003 525 988 q 595 1019 566 1019 q 646 996 625 1019 q 667 945 667 974 q 648 899 667 917 q 600 865 630 880 l 375 757 l 306 757 l 492 955 \"},\"ω\":{\"x_min\":30,\"x_max\":1059,\"ha\":1093,\"o\":\"m 335 -15 q 111 79 192 -15 q 30 321 30 173 q 72 505 30 421 q 192 667 114 589 q 297 661 237 661 q 347 663 319 661 q 390 667 374 665 q 247 281 247 499 q 269 123 247 195 q 358 52 291 52 q 421 86 399 52 q 443 165 443 121 l 443 291 q 441 415 443 379 q 435 512 440 451 q 510 505 499 505 q 544 505 522 505 q 608 508 579 505 q 657 512 636 511 q 648 402 652 465 q 644 289 644 340 q 644 237 644 258 q 650 165 644 215 q 669 85 650 119 q 730 52 688 52 q 821 122 798 52 q 844 279 844 192 q 807 481 844 386 q 700 666 771 576 q 746 662 724 663 q 793 661 767 661 q 846 664 812 661 q 898 667 881 667 q 1016 508 974 595 q 1059 322 1059 422 q 974 83 1059 182 q 753 -15 890 -15 q 630 13 685 -15 q 545 100 575 41 q 459 14 516 44 q 335 -15 402 -15 \"},\"´\":{\"x_min\":70.828125,\"x_max\":337.5,\"ha\":374,\"o\":\"m 70 528 l 151 848 q 183 919 158 889 q 244 949 208 949 q 310 924 283 949 q 337 862 337 900 q 331 829 337 845 q 316 797 326 813 l 111 511 l 70 528 \"},\"±\":{\"x_min\":169,\"x_max\":969,\"ha\":1139,\"o\":\"m 636 815 l 636 597 l 969 597 l 969 465 l 636 465 l 636 246 l 501 246 l 501 465 l 169 465 l 169 597 l 501 597 l 501 815 l 636 815 m 969 132 l 969 0 l 169 0 l 169 132 l 969 132 \"},\"|\":{\"x_min\":272,\"x_max\":411,\"ha\":683,\"o\":\"m 411 956 l 411 447 l 272 447 l 272 956 l 411 956 m 411 272 l 411 -233 l 272 -233 l 272 272 l 411 272 \"},\"ϋ\":{\"x_min\":82,\"x_max\":765,\"ha\":843,\"o\":\"m 765 415 q 663 114 765 244 q 401 -15 562 -15 q 162 56 243 -15 q 82 284 82 127 l 86 478 q 84 589 86 523 q 82 666 82 656 q 145 663 99 666 q 195 661 191 661 q 263 663 216 661 q 311 666 309 666 q 295 476 301 566 q 290 294 290 387 q 310 122 290 193 q 402 52 330 52 q 515 146 487 52 q 544 351 544 240 q 525 502 544 433 q 469 657 507 570 q 580 659 528 657 q 684 672 632 662 q 743 547 721 613 q 765 415 765 482 m 262 975 q 329 947 301 975 q 357 879 357 919 q 331 811 357 840 q 265 783 305 783 q 195 810 226 783 q 165 879 165 838 q 192 947 165 919 q 262 975 220 975 m 522 975 q 589 947 561 975 q 617 879 617 919 q 591 811 617 840 q 525 783 565 783 q 456 811 486 783 q 427 879 427 840 q 454 947 427 919 q 522 975 482 975 \"},\"§\":{\"x_min\":61,\"x_max\":685,\"ha\":743,\"o\":\"m 118 39 l 136 38 q 207 -72 149 -32 q 341 -113 265 -113 q 441 -84 398 -113 q 485 -1 485 -56 q 378 121 485 73 q 170 213 272 169 q 61 386 61 277 q 95 495 61 437 q 175 584 129 554 q 133 649 148 615 q 118 721 118 683 q 206 887 118 825 q 406 949 295 949 q 531 937 479 949 q 630 895 583 926 q 598 826 613 860 q 570 754 583 791 l 558 754 q 499 848 548 812 q 388 884 451 884 q 300 858 340 884 q 261 785 261 832 q 366 672 261 717 q 575 583 472 626 q 685 414 685 519 q 657 302 685 354 q 580 216 630 250 q 622 149 602 197 q 643 68 643 101 q 545 -116 643 -51 q 322 -182 447 -182 q 197 -171 255 -182 q 86 -135 138 -161 q 118 39 106 -38 m 197 478 q 310 346 197 400 q 521 249 423 293 q 546 312 546 274 q 433 432 546 379 q 224 528 320 485 q 197 478 201 508 \"},\"b\":{\"x_min\":79,\"x_max\":772,\"ha\":825,\"o\":\"m 89 647 q 84 844 89 712 q 79 1024 79 977 q 136 1018 105 1021 q 192 1015 167 1015 q 249 1018 217 1015 q 306 1023 280 1020 l 299 724 l 299 578 q 389 656 339 630 q 505 683 439 683 q 704 581 637 683 q 772 340 772 479 q 694 88 772 191 q 470 -15 617 -15 q 340 15 400 -15 q 237 104 280 45 q 202 74 215 87 q 136 1 190 62 l 79 1 q 84 357 79 132 q 89 647 89 583 m 430 586 q 318 512 346 586 q 291 338 291 438 q 316 162 291 238 q 424 86 342 86 q 528 159 503 86 q 554 331 554 233 q 531 510 554 434 q 430 586 508 586 \"},\"q\":{\"x_min\":51,\"x_max\":741,\"ha\":825,\"o\":\"m 331 -15 q 121 81 191 -15 q 51 323 51 177 q 117 576 51 469 q 323 683 184 683 q 523 580 446 683 l 523 605 q 516 666 523 631 q 586 660 568 661 q 627 659 604 659 q 741 666 675 659 q 738 416 741 561 q 732 125 735 271 q 730 -124 730 -19 q 735 -246 730 -164 q 741 -371 741 -328 q 687 -363 718 -366 q 628 -361 656 -361 q 563 -363 581 -361 q 514 -372 545 -365 l 523 -58 l 523 85 q 437 10 482 35 q 331 -15 392 -15 m 386 81 q 484 135 452 81 q 523 261 516 189 l 523 300 q 523 351 523 330 q 523 392 523 372 q 490 518 523 460 q 393 576 458 576 q 290 502 314 576 q 266 327 266 429 q 288 155 266 229 q 386 81 310 81 \"},\"Ω\":{\"x_min\":36,\"x_max\":1174.890625,\"ha\":1211,\"o\":\"m 1173 129 q 1170 103 1170 116 q 1170 83 1170 90 l 1170 70 q 1170 36 1170 52 q 1174 0 1170 19 l 953 4 l 715 0 l 715 103 q 848 251 813 162 q 883 473 883 340 q 815 741 883 623 q 607 860 747 860 q 396 738 461 860 q 331 457 331 616 q 369 245 331 339 q 496 102 407 152 l 496 0 l 256 4 l 36 0 l 38 80 l 36 129 q 264 113 151 113 q 128 258 172 167 q 85 464 85 350 q 235 821 85 693 q 622 949 386 949 q 988 830 846 949 q 1130 491 1130 712 q 1082 272 1130 363 q 928 112 1034 180 q 1173 129 1049 112 \"},\"ύ\":{\"x_min\":82,\"x_max\":765,\"ha\":843,\"o\":\"m 765 415 q 663 114 765 244 q 400 -15 561 -15 q 162 56 242 -15 q 82 284 82 128 l 86 479 q 84 590 86 523 q 82 666 82 656 q 145 663 99 666 q 195 661 191 661 q 263 663 216 661 q 311 666 309 666 q 295 477 301 566 q 290 294 290 387 q 310 122 290 193 q 402 52 330 52 q 515 146 487 52 q 544 351 544 240 q 525 502 544 433 q 469 656 507 570 q 580 659 528 656 q 684 672 632 662 q 743 547 721 613 q 765 415 765 482 m 548 953 q 601 1001 581 986 q 651 1017 621 1017 q 702 994 681 1017 q 723 943 723 972 q 704 897 723 916 q 655 863 685 878 l 431 755 l 362 755 l 548 953 \"},\"Ö\":{\"x_min\":40,\"x_max\":1087,\"ha\":1129,\"o\":\"m 577 949 q 946 829 805 949 q 1087 486 1087 710 q 942 115 1087 246 q 552 -15 798 -15 q 176 107 313 -15 q 40 465 40 229 q 188 823 40 697 q 577 949 337 949 m 434 1242 q 501 1215 473 1242 q 529 1148 529 1189 q 502 1079 529 1108 q 435 1050 476 1050 q 366 1079 396 1050 q 337 1148 337 1109 q 366 1214 337 1186 q 434 1242 395 1242 m 693 1242 q 761 1215 733 1242 q 789 1148 789 1189 q 762 1079 789 1108 q 695 1050 736 1050 q 627 1079 655 1050 q 600 1148 600 1108 q 627 1214 600 1186 q 693 1242 655 1242 m 562 71 q 774 194 706 71 q 843 470 843 318 q 774 742 843 623 q 563 861 706 861 q 353 741 420 861 q 287 465 287 622 q 354 191 287 312 q 562 71 421 71 \"},\"z\":{\"x_min\":19.4375,\"x_max\":640.28125,\"ha\":664,\"o\":\"m 19 75 q 118 216 33 94 q 257 415 204 337 q 359 567 311 493 l 255 568 q 151 562 205 568 q 65 552 97 556 l 68 608 l 65 667 l 337 660 q 507 663 404 660 q 627 666 611 666 l 627 588 q 515 441 573 519 q 399 276 458 362 q 280 98 340 190 l 375 96 q 506 101 418 96 q 640 107 595 107 q 638 76 638 93 q 637 51 637 59 l 637 34 l 640 0 q 459 3 568 0 q 333 7 351 7 q 147 3 259 7 q 19 0 36 0 l 19 75 \"},\"™\":{\"x_min\":136,\"x_max\":964,\"ha\":1138,\"o\":\"m 461 975 l 461 900 l 350 900 l 350 610 l 249 610 l 249 900 l 136 900 l 136 975 l 461 975 m 666 974 l 751 751 l 833 974 l 964 975 l 964 610 l 874 610 l 874 882 l 772 610 l 730 610 l 625 881 l 625 610 l 535 610 l 535 975 l 666 974 \"},\"ή\":{\"x_min\":80,\"x_max\":727,\"ha\":808,\"o\":\"m 91 339 q 85 512 91 391 q 80 667 80 632 q 137 661 125 662 q 180 661 149 661 q 244 663 199 661 q 293 666 290 666 l 293 568 q 391 651 338 622 q 511 681 443 681 q 660 622 602 681 q 719 471 719 564 l 719 327 l 719 -50 q 723 -219 719 -107 q 727 -374 727 -332 q 618 -365 670 -365 q 502 -373 562 -365 l 512 16 l 512 251 l 512 368 q 491 499 512 446 q 408 552 471 552 q 319 488 342 552 q 302 419 305 457 q 299 330 299 382 q 304 148 299 264 q 309 0 309 33 q 243 3 278 0 q 195 6 207 6 q 127 3 163 6 q 80 0 92 0 q 85 188 80 65 q 91 339 91 311 m 552 953 q 605 1001 585 986 q 654 1017 625 1017 q 706 994 685 1017 q 727 943 727 972 q 708 897 727 916 q 658 863 689 878 l 435 756 l 366 756 l 552 953 \"},\"Θ\":{\"x_min\":40,\"x_max\":1087,\"ha\":1129,\"o\":\"m 51 585 q 235 855 85 761 q 577 949 385 949 q 944 829 802 949 q 1087 487 1087 710 q 941 116 1087 247 q 552 -15 796 -15 q 176 107 313 -15 q 40 465 40 229 q 41 510 40 492 q 51 585 42 528 m 559 73 q 771 194 703 73 q 840 472 840 315 q 773 742 840 624 q 566 860 706 860 q 353 742 420 860 q 287 465 287 624 q 353 193 287 314 q 559 73 419 73 m 566 525 q 678 528 610 525 q 755 532 745 532 l 754 539 l 754 472 l 754 403 l 755 407 l 563 414 l 373 407 l 373 469 l 373 531 q 484 528 416 531 q 566 525 553 525 \"},\"®\":{\"x_min\":72,\"x_max\":1065,\"ha\":1138,\"o\":\"m 1065 488 q 917 139 1065 285 q 567 -6 770 -6 q 219 139 366 -6 q 72 488 72 285 q 219 836 72 688 q 567 985 367 985 q 917 839 770 985 q 1065 488 1065 693 m 155 488 q 276 197 155 320 q 566 75 398 75 q 858 197 734 75 q 983 487 983 320 q 860 780 983 656 q 567 904 738 904 q 277 780 399 904 q 155 488 155 656 m 577 774 q 741 740 670 774 q 812 625 812 707 q 778 527 812 569 q 692 468 745 484 l 811 223 l 666 222 l 561 447 l 497 447 l 497 223 l 361 223 l 361 774 l 577 774 m 497 528 l 562 528 q 641 546 609 528 q 673 608 673 564 q 655 660 673 638 q 607 685 638 682 q 555 691 584 691 l 497 691 l 497 528 \"},\"É\":{\"x_min\":90,\"x_max\":644.15625,\"ha\":703,\"o\":\"m 108 223 l 108 465 q 104 713 108 622 q 91 933 101 804 l 357 929 l 644 933 l 640 872 l 644 811 q 530 816 606 811 q 415 822 453 822 l 340 822 q 337 663 340 774 q 334 545 334 551 l 634 557 q 631 521 634 546 q 628 493 628 496 q 630 458 628 477 q 634 429 633 440 q 476 436 587 429 q 334 444 365 444 l 334 294 q 335 203 334 249 q 340 111 336 156 q 483 114 419 111 q 640 128 546 118 q 634 65 634 100 q 635 37 634 47 q 640 0 635 27 q 427 3 556 0 q 280 7 298 7 q 169 3 242 7 q 90 0 95 0 q 102 117 97 59 q 108 223 108 175 m 410 1222 q 465 1272 445 1257 q 515 1288 485 1288 q 566 1265 545 1288 q 587 1215 587 1243 q 568 1169 587 1189 q 519 1133 549 1148 l 294 1025 l 225 1025 l 410 1222 \"},\"~\":{\"x_min\":266,\"x_max\":1091,\"ha\":1367,\"o\":\"m 1091 938 q 1033 721 1091 807 q 847 636 975 636 q 661 720 757 636 q 518 805 564 805 q 427 756 453 805 q 402 636 402 708 l 266 636 q 327 849 266 761 q 510 938 388 938 q 696 853 599 938 q 846 768 793 768 q 933 815 911 768 q 956 938 956 863 l 1091 938 \"},\"Ε\":{\"x_min\":90,\"x_max\":644.15625,\"ha\":703,\"o\":\"m 108 222 l 108 465 q 104 710 108 620 q 91 932 101 800 l 357 926 q 520 929 405 926 q 644 932 634 932 q 640 903 641 916 q 638 872 638 890 q 639 848 638 857 q 644 810 640 840 q 530 815 606 810 q 414 820 453 820 l 338 820 l 334 545 l 634 557 q 630 527 631 541 q 628 494 628 514 l 633 431 q 459 437 571 431 q 334 444 347 444 l 334 296 q 336 190 334 264 q 338 113 338 115 q 638 129 489 113 l 634 63 l 638 0 q 433 3 562 0 q 278 7 305 7 q 169 3 235 7 q 90 0 102 0 q 102 114 96 54 q 108 222 108 175 \"},\"³\":{\"x_min\":18,\"x_max\":448,\"ha\":494,\"o\":\"m 242 899 q 370 867 315 899 q 425 770 425 836 q 399 699 425 730 q 301 645 373 667 q 403 605 359 642 q 448 512 448 569 q 375 384 448 426 q 210 342 303 342 q 108 352 152 342 q 18 391 65 362 q 88 505 60 451 l 98 505 q 119 420 98 452 q 191 388 141 388 q 263 421 237 388 q 290 501 290 454 q 262 580 290 549 q 186 612 235 612 l 151 612 l 151 660 l 181 658 q 259 684 228 658 q 290 759 290 710 q 268 828 290 800 q 207 856 246 856 q 141 821 163 856 q 119 742 119 787 l 110 736 q 26 815 75 777 q 120 876 53 854 q 242 899 187 899 \"},\"[\":{\"x_min\":104,\"x_max\":415.109375,\"ha\":454,\"o\":\"m 409 883 l 415 852 l 261 855 l 257 541 q 261 212 257 433 q 266 -86 266 -8 l 327 -88 l 415 -88 l 409 -117 q 415 -162 409 -142 l 261 -157 l 104 -164 q 110 154 104 -50 q 117 383 117 359 q 110 703 117 496 q 104 933 104 909 q 194 929 138 933 q 258 926 249 926 q 347 929 284 926 q 415 933 410 933 q 409 883 409 911 \"},\"L\":{\"x_min\":91,\"x_max\":639.609375,\"ha\":650,\"o\":\"m 109 465 q 105 710 109 620 q 91 932 102 800 l 216 927 l 350 931 q 337 618 337 783 l 337 296 q 337 201 337 249 q 341 113 337 153 q 639 129 491 113 l 635 63 l 639 0 q 434 3 563 0 q 279 7 306 7 q 170 3 236 7 q 91 0 103 0 q 105 209 102 102 q 109 465 109 316 \"},\"σ\":{\"x_min\":30,\"x_max\":832,\"ha\":826,\"o\":\"m 679 557 q 730 451 724 495 q 738 384 736 407 q 741 339 741 361 q 738 277 741 295 q 726 190 736 259 q 617 53 716 121 q 385 -15 518 -15 q 126 78 223 -15 q 30 336 30 172 q 127 588 30 494 q 384 683 224 683 q 536 671 432 683 q 677 660 639 660 q 765 663 705 660 q 831 666 825 666 q 827 611 827 637 l 827 594 l 832 552 l 702 557 l 679 557 m 256 333 q 269 174 256 248 q 304 88 275 124 q 381 52 332 52 q 475 104 443 52 q 508 221 508 156 q 512 258 509 235 q 515 323 515 282 q 512 411 515 370 q 508 444 509 427 q 479 563 508 511 q 389 615 450 615 q 299 565 327 615 q 263 450 271 516 q 256 333 256 384 \"},\"ζ\":{\"x_min\":64,\"x_max\":667,\"ha\":656,\"o\":\"m 231 360 l 231 340 l 231 314 q 343 192 231 217 q 554 162 448 176 q 667 24 667 133 q 628 -103 667 -42 q 525 -221 589 -164 l 458 -181 q 505 -114 493 -134 q 521 -63 516 -95 q 375 13 521 -6 q 146 71 229 33 q 64 260 64 110 q 123 495 64 382 q 257 692 182 608 q 467 905 333 776 q 278 903 353 905 q 122 893 204 901 l 126 958 l 122 1024 q 255 1019 166 1024 q 389 1015 344 1015 q 511 1019 429 1015 q 635 1024 593 1024 l 630 978 l 634 934 q 433 764 520 848 q 288 578 346 680 q 231 360 231 476 \"},\"θ\":{\"x_min\":34,\"x_max\":710,\"ha\":749,\"o\":\"m 710 450 q 636 110 710 240 q 367 -19 562 -19 q 104 103 175 -19 q 34 434 34 226 q 106 774 34 641 q 368 908 178 908 q 637 785 565 908 q 710 450 710 662 m 370 416 q 305 413 351 416 q 255 410 259 410 q 257 322 255 371 q 266 208 259 273 q 292 96 272 143 q 370 49 312 49 q 429 72 406 49 q 463 135 452 96 q 479 263 474 192 q 484 410 484 335 q 418 413 464 410 q 370 416 372 416 m 484 601 q 464 769 484 698 q 372 840 445 840 q 277 759 300 840 q 255 560 255 679 l 255 492 l 372 488 l 488 492 l 484 601 \"},\"Ο\":{\"x_min\":40,\"x_max\":1086,\"ha\":1129,\"o\":\"m 577 949 q 945 829 804 949 q 1086 486 1086 710 q 942 114 1086 244 q 552 -15 798 -15 q 176 107 313 -15 q 40 465 40 229 q 188 823 40 697 q 577 949 337 949 m 562 73 q 773 194 706 73 q 840 472 840 315 q 773 742 840 624 q 566 860 706 860 q 353 742 420 860 q 287 465 287 624 q 353 193 287 313 q 562 73 420 73 \"},\"Γ\":{\"x_min\":91,\"x_max\":639.609375,\"ha\":650,\"o\":\"m 232 926 l 449 926 l 639 932 l 635 866 l 639 802 q 485 815 548 812 q 341 819 423 819 q 338 769 339 805 q 337 681 337 734 l 337 635 l 337 312 q 339 138 337 195 q 351 0 341 81 l 216 4 l 91 0 q 100 238 91 70 q 109 465 109 406 q 105 713 109 613 q 91 932 102 813 q 161 929 114 932 q 232 926 209 926 \"},\" \":{\"x_min\":0,\"x_max\":0,\"ha\":375},\"%\":{\"x_min\":28,\"x_max\":1085,\"ha\":1122,\"o\":\"m 265 910 q 434 844 369 910 q 500 672 500 779 q 435 496 500 562 q 258 431 370 431 q 91 498 154 431 q 28 669 28 565 q 93 843 28 776 q 265 910 158 910 m 831 1015 l 917 1014 l 272 -125 l 184 -125 l 831 1015 m 849 463 q 1020 401 955 463 q 1085 230 1085 339 q 1023 51 1085 117 q 845 -15 961 -15 q 677 51 742 -15 q 612 222 612 118 q 675 398 612 333 q 849 463 738 463 m 196 561 q 214 505 196 532 q 261 478 232 478 q 297 489 280 478 q 323 525 314 501 q 335 586 332 548 q 339 669 339 625 q 337 723 339 697 q 332 780 336 749 q 311 836 327 811 q 264 861 296 861 q 204 820 222 861 q 191 752 194 786 q 188 669 188 719 q 196 561 188 615 m 779 112 q 797 57 779 83 q 847 31 816 31 q 895 59 873 31 q 916 114 916 87 q 922 222 922 162 q 922 275 922 248 q 915 338 917 312 q 896 389 912 364 q 848 414 880 414 q 812 404 827 414 q 791 375 797 394 q 776 312 780 347 q 772 241 772 276 l 772 222 q 772 183 772 201 q 779 112 773 165 \"},\"P\":{\"x_min\":91,\"x_max\":765,\"ha\":801,\"o\":\"m 334 201 q 335 129 334 148 q 348 0 336 110 q 272 3 317 0 q 219 6 226 6 q 143 3 189 6 q 91 0 97 0 q 104 212 100 112 q 108 462 108 313 q 99 725 108 549 q 91 933 91 900 q 161 929 111 933 q 215 925 211 925 l 395 933 l 445 933 q 677 876 590 933 q 765 681 765 819 q 691 486 765 565 q 544 400 618 408 q 423 390 470 391 q 334 389 375 389 l 334 201 m 536 669 q 498 788 536 741 q 390 836 461 836 l 334 836 l 334 694 l 334 486 q 485 529 435 486 q 536 669 536 572 \"},\"Ώ\":{\"x_min\":-28,\"x_max\":1452.5625,\"ha\":1489,\"o\":\"m 1451 129 q 1448 104 1448 117 q 1448 83 1448 90 l 1448 70 q 1448 36 1448 52 q 1452 0 1448 19 l 1231 4 l 993 0 l 993 103 q 1126 251 1091 162 q 1161 473 1161 340 q 1092 741 1161 623 q 884 860 1024 860 q 673 738 738 860 q 608 457 608 616 q 646 245 608 339 q 774 102 684 152 l 774 0 l 534 4 l 314 0 l 316 80 l 313 129 q 542 113 429 113 q 405 258 449 167 q 362 464 362 350 q 512 821 362 693 q 899 949 663 949 q 1266 830 1124 949 q 1408 491 1408 712 q 1360 272 1408 363 q 1206 112 1312 180 q 1451 129 1327 112 m 158 953 q 211 1001 191 986 q 259 1017 231 1017 q 312 994 291 1017 q 333 943 333 972 q 314 897 333 916 q 265 863 295 878 l 40 755 l -28 755 l 158 953 \"},\"Έ\":{\"x_min\":-28,\"x_max\":1020.609375,\"ha\":1078,\"o\":\"m 485 222 l 485 465 q 481 710 485 620 q 467 931 478 800 l 733 926 q 896 929 781 926 q 1020 932 1010 932 q 1016 903 1017 916 q 1015 872 1015 890 q 1015 848 1015 857 q 1020 810 1016 839 q 906 815 983 810 q 791 820 830 820 l 715 820 l 711 544 l 1010 556 q 1006 527 1008 540 q 1005 493 1005 513 l 1009 430 q 836 436 948 430 q 711 443 724 443 l 711 296 q 713 189 711 264 q 715 113 715 115 q 1015 129 865 113 l 1010 63 l 1015 0 q 810 3 938 0 q 655 7 681 7 q 545 3 612 7 q 466 0 478 0 q 478 114 472 54 q 485 222 485 175 m 158 953 q 212 1001 191 986 q 260 1017 232 1017 q 313 994 292 1017 q 334 943 334 972 q 315 897 334 916 q 265 863 296 878 l 40 755 l -28 755 l 158 953 \"},\"_\":{\"x_min\":0,\"x_max\":683.328125,\"ha\":683,\"o\":\"m 683 -184 l 683 -322 l 0 -322 l 0 -184 l 683 -184 \"},\"Ϊ\":{\"x_min\":-1,\"x_max\":450,\"ha\":449,\"o\":\"m 110 402 q 103 709 110 511 q 97 932 97 908 q 161 926 130 929 q 220 923 192 923 q 287 927 242 923 q 351 931 331 931 q 343 688 351 859 q 336 465 336 516 q 343 221 336 391 q 351 0 351 51 q 283 2 330 0 q 212 5 236 5 l 97 0 q 103 233 97 83 q 110 402 110 383 m 93 1242 q 160 1215 132 1242 q 188 1148 188 1189 q 162 1078 188 1107 q 97 1050 136 1050 q 28 1079 57 1050 q -1 1148 -1 1108 q 26 1214 -1 1186 q 93 1242 54 1242 m 352 1242 q 421 1214 393 1242 q 450 1148 450 1187 q 423 1079 450 1108 q 356 1050 397 1050 q 286 1078 316 1050 q 257 1148 257 1107 q 286 1214 257 1186 q 352 1242 315 1242 \"},\"+\":{\"x_min\":169,\"x_max\":968,\"ha\":1138,\"o\":\"m 636 813 l 636 473 l 968 473 l 968 340 l 636 340 l 636 0 l 501 0 l 501 340 l 169 340 l 169 473 l 501 473 l 501 813 l 636 813 \"},\"½\":{\"x_min\":68,\"x_max\":1145.765625,\"ha\":1171,\"o\":\"m 207 481 l 207 736 l 207 808 q 150 784 180 798 q 103 763 120 770 l 68 813 q 195 860 131 834 q 331 918 259 886 l 348 909 q 346 744 348 844 q 344 644 344 645 l 345 650 l 345 505 l 345 511 q 345 458 345 480 q 349 391 345 437 l 299 394 q 247 392 281 394 q 198 391 213 391 l 207 481 m 844 1014 l 928 1014 l 326 -124 l 243 -124 l 844 1014 m 721 42 q 908 194 839 122 q 977 365 977 266 q 962 434 977 408 q 905 460 947 460 q 840 427 864 460 q 805 345 816 395 l 795 345 q 768 379 789 358 q 727 418 747 400 q 822 487 773 465 q 936 510 870 510 q 1068 474 1012 510 q 1124 365 1124 439 q 1035 209 1124 271 q 890 110 947 147 l 970 109 q 1070 111 999 109 q 1145 114 1140 114 q 1134 48 1134 80 q 1138 23 1134 37 q 1144 0 1143 9 l 1006 3 l 729 3 l 721 42 \"},\"Ρ\":{\"x_min\":91,\"x_max\":765,\"ha\":801,\"o\":\"m 334 201 q 335 129 334 148 q 348 0 336 110 q 272 3 317 0 q 219 6 226 6 q 143 3 189 6 q 91 0 97 0 q 104 212 100 112 q 108 462 108 313 q 99 725 108 549 q 91 933 91 900 q 161 929 111 933 q 215 925 211 925 l 395 933 l 445 933 q 677 876 590 933 q 765 681 765 819 q 691 486 765 565 q 544 400 618 408 q 423 390 470 391 q 334 389 375 389 l 334 201 m 536 669 q 498 788 536 741 q 390 836 461 836 l 334 836 l 334 694 l 334 486 q 485 529 435 486 q 536 669 536 572 \"},\"'\":{\"x_min\":72.21875,\"x_max\":337.5,\"ha\":375,\"o\":\"m 72 528 l 152 848 q 184 919 159 889 q 245 949 209 949 q 311 923 284 949 q 337 861 337 898 q 315 797 337 827 l 112 511 l 72 528 \"},\"T\":{\"x_min\":8,\"x_max\":738,\"ha\":749,\"o\":\"m 493 818 q 490 723 493 790 q 487 652 487 656 q 490 427 487 529 q 498 201 494 326 q 503 0 503 77 q 438 2 482 0 q 374 5 395 5 q 317 3 351 5 q 244 0 284 1 q 252 266 244 88 q 261 476 261 444 q 258 670 261 533 q 255 818 255 808 q 158 815 188 818 q 8 801 128 813 l 12 872 l 8 932 q 198 927 70 932 q 373 922 327 922 q 572 927 445 922 q 738 932 700 932 l 733 870 l 738 801 q 493 818 614 818 \"},\"Φ\":{\"x_min\":36,\"x_max\":1093,\"ha\":1129,\"o\":\"m 445 960 q 513 952 484 955 q 566 950 543 950 q 634 954 599 950 q 683 960 669 958 q 676 909 680 943 q 672 858 672 876 l 751 851 q 998 732 904 829 q 1093 484 1093 634 q 980 206 1093 301 q 672 72 867 112 q 673 31 672 44 q 683 -26 674 19 q 619 -20 653 -23 q 566 -17 585 -17 q 500 -20 535 -17 q 445 -26 465 -24 q 453 17 449 -5 q 458 72 458 40 l 380 82 q 133 205 231 103 q 36 454 36 307 q 150 732 36 636 q 458 858 265 828 q 452 911 458 879 q 445 960 447 943 m 668 700 l 668 467 l 668 234 l 672 171 q 817 266 774 182 q 861 468 861 351 q 817 666 861 583 q 669 764 773 750 l 668 700 m 419 755 q 301 654 336 739 q 267 469 267 570 q 309 267 267 351 q 455 171 351 183 l 458 234 l 462 424 l 458 700 l 458 764 l 419 755 \"},\"j\":{\"x_min\":-62,\"x_max\":313,\"ha\":396,\"o\":\"m 196 660 q 235 660 215 660 q 307 666 254 661 l 306 490 q 309 182 306 369 q 313 -31 313 -4 q 217 -278 313 -195 q -49 -361 121 -361 l -62 -305 q 59 -240 24 -305 q 95 -81 95 -175 l 95 255 q 89 459 95 322 q 84 666 84 597 q 196 660 143 660 m 195 1014 q 272 980 239 1014 q 306 902 306 947 q 273 825 306 858 q 195 793 240 793 q 117 824 150 793 q 84 902 84 856 q 117 980 84 947 q 195 1014 150 1014 \"},\"Σ\":{\"x_min\":18.0625,\"x_max\":801.390625,\"ha\":843,\"o\":\"m 747 865 l 751 804 q 641 808 715 804 q 527 813 568 813 l 369 813 q 481 664 427 733 q 594 519 534 594 q 402 315 496 419 l 304 203 l 544 203 q 672 208 586 203 q 801 214 758 214 l 794 112 q 801 0 794 59 l 456 4 l 18 0 l 18 57 q 261 330 138 181 l 365 461 q 222 657 298 559 q 55 865 147 755 l 55 932 q 243 928 118 932 q 431 924 368 924 q 630 928 511 924 q 751 932 750 932 l 747 865 \"},\"1\":{\"x_min\":55,\"x_max\":502,\"ha\":749,\"o\":\"m 276 616 q 273 680 276 637 q 271 747 271 723 q 197 713 223 726 q 112 666 172 700 l 55 754 q 471 940 291 848 l 498 927 l 492 454 l 493 465 l 493 202 l 493 216 q 497 102 493 178 q 502 0 502 26 l 383 6 q 314 3 362 6 q 264 0 266 0 q 270 359 264 127 q 276 616 276 591 \"},\"ä\":{\"x_min\":44,\"x_max\":706.78125,\"ha\":706,\"o\":\"m 236 -15 q 98 35 153 -15 q 44 169 44 86 q 212 352 44 301 q 401 421 380 403 q 410 439 410 432 q 373 539 410 502 q 275 577 337 577 q 140 511 185 577 l 135 511 l 115 585 q 230 657 164 632 q 365 683 296 683 q 543 623 479 683 q 608 452 608 564 l 604 213 q 604 166 604 184 q 608 123 604 148 q 625 87 612 99 q 658 76 638 76 q 679 80 666 76 q 702 90 691 84 l 706 40 q 643 1 676 14 q 563 -15 610 -10 q 480 5 518 -15 q 419 64 442 25 q 236 -15 350 -15 m 221 976 q 289 948 261 976 q 317 878 317 920 q 290 811 317 839 q 223 784 264 784 q 155 811 186 784 q 125 878 125 839 q 154 946 125 917 q 221 976 183 976 m 481 976 q 549 948 521 976 q 577 878 577 920 q 550 811 577 839 q 483 784 524 784 q 414 812 444 784 q 385 878 385 841 q 412 946 385 917 q 481 976 440 976 m 240 200 q 261 128 240 158 q 321 99 282 99 q 388 131 367 99 q 410 211 410 164 l 410 352 q 287 302 335 338 q 240 200 240 267 \"},\"<\":{\"x_min\":175,\"x_max\":959.75,\"ha\":1138,\"o\":\"m 959 650 l 362 406 l 959 162 l 959 17 l 175 340 l 175 471 l 959 796 l 959 650 \"},\"£\":{\"x_min\":48,\"x_max\":734.109375,\"ha\":749,\"o\":\"m 56 88 q 52 142 56 117 q 48 181 49 167 q 138 198 100 181 q 185 254 177 215 q 193 315 193 292 l 191 429 l 153 429 q 99 425 128 429 q 56 421 70 421 l 61 467 l 56 512 q 113 506 81 508 q 184 504 145 504 q 172 598 172 552 q 259 829 172 748 q 499 910 346 910 q 734 848 623 910 q 710 778 718 809 q 691 695 702 747 l 658 695 q 613 795 645 758 q 523 833 581 833 q 417 787 455 833 q 379 671 379 741 q 384 582 379 637 q 391 504 390 527 l 463 504 l 480 504 q 519 504 500 504 q 598 512 538 505 l 593 466 l 598 422 l 493 429 l 391 429 q 343 288 382 340 q 219 184 303 236 l 542 189 l 724 195 q 716 146 720 174 q 711 98 711 117 q 713 62 711 78 q 724 0 716 45 q 557 3 667 0 q 391 8 448 8 q 220 3 334 8 q 48 0 106 0 q 52 46 49 16 q 56 88 56 77 \"},\"¹\":{\"x_min\":66,\"x_max\":360,\"ha\":494,\"o\":\"m 212 726 l 212 802 q 158 781 187 795 q 102 755 129 768 l 66 808 q 206 857 157 838 q 342 919 256 876 l 356 910 l 356 627 l 356 638 l 356 477 l 356 484 q 356 429 356 451 q 360 354 356 408 l 307 358 l 202 354 q 210 520 209 418 q 212 634 212 623 l 212 726 \"},\"t\":{\"x_min\":9,\"x_max\":468.71875,\"ha\":463,\"o\":\"m 9 584 l 10 627 l 10 671 q 54 667 25 668 q 102 667 84 667 l 102 687 l 102 704 q 95 823 102 765 q 192 859 147 839 q 298 914 237 880 l 327 914 q 319 853 323 890 q 315 791 315 816 l 315 667 l 344 667 q 433 670 387 667 l 430 629 l 430 582 l 309 584 l 309 226 q 322 107 309 149 q 393 65 335 65 q 468 72 427 65 l 463 9 q 381 -11 425 -4 q 292 -18 336 -18 q 145 25 196 -18 q 95 165 95 69 q 98 410 95 260 q 102 583 102 559 l 9 584 \"},\"λ\":{\"x_min\":22.609375,\"x_max\":662.890625,\"ha\":686,\"o\":\"m 550 0 l 433 0 q 394 177 417 79 q 360 323 372 275 q 318 490 349 372 q 234 238 269 359 q 179 0 199 116 l 103 0 l 22 0 q 109 214 69 109 q 182 416 149 318 q 264 662 215 514 q 214 834 247 760 q 111 909 180 909 q 80 903 99 909 q 51 895 61 898 l 32 964 q 121 1008 76 993 q 215 1024 167 1024 q 384 925 342 1024 q 458 718 426 826 l 529 459 l 662 0 l 550 0 \"},\"ù\":{\"x_min\":75,\"x_max\":722,\"ha\":808,\"o\":\"m 474 757 l 249 865 q 198 900 216 883 q 181 946 181 917 q 203 998 181 977 q 256 1019 225 1019 q 303 1003 282 1019 q 356 955 324 987 l 542 757 l 474 757 m 292 -15 q 142 41 202 -15 q 83 189 83 98 l 83 337 q 79 509 83 394 q 75 668 75 624 q 134 661 108 663 q 185 659 160 659 q 240 662 209 659 q 300 668 271 665 q 290 455 290 570 l 290 384 l 290 279 q 316 146 290 181 q 394 111 343 111 q 467 147 441 111 q 501 234 493 184 l 501 330 q 499 488 501 415 q 495 668 497 562 q 554 662 518 665 q 613 659 589 659 q 671 662 640 659 q 722 668 701 665 q 717 505 722 625 q 712 326 712 386 q 717 156 712 270 q 722 1 722 43 l 617 4 l 511 1 l 511 96 q 410 15 468 46 q 292 -15 353 -15 \"},\"W\":{\"x_min\":-8.328125,\"x_max\":1325,\"ha\":1326,\"o\":\"m -8 932 q 67 929 13 932 q 125 926 120 926 q 190 929 147 926 q 255 932 233 932 q 300 737 277 829 q 357 519 323 644 q 419 298 391 394 q 504 548 455 403 q 576 759 554 693 q 633 932 598 825 l 711 926 q 756 929 726 926 q 802 932 787 932 q 859 729 836 807 q 913 557 881 651 q 998 297 944 462 q 1166 932 1094 604 l 1248 926 q 1298 929 1280 926 q 1325 932 1316 932 l 1230 643 l 1019 0 q 972 4 983 4 q 937 5 962 5 q 884 2 904 5 q 855 0 865 0 q 793 200 831 80 q 740 363 754 319 l 652 623 q 543 325 594 476 q 441 0 493 175 q 393 3 423 0 q 359 6 363 6 q 308 4 330 6 q 272 0 286 1 q 184 320 222 191 q 107 576 147 450 q -8 932 68 703 \"},\"ï\":{\"x_min\":-26,\"x_max\":422,\"ha\":396,\"o\":\"m 93 126 l 93 542 q 87 601 93 557 q 82 666 82 645 q 141 660 111 663 q 198 658 172 658 q 255 661 223 658 q 316 666 287 663 q 311 621 315 658 q 303 544 307 584 l 303 319 l 303 115 l 315 0 l 195 2 l 81 0 q 93 126 93 66 m 68 976 q 134 947 107 976 q 162 878 162 918 q 136 811 162 839 q 71 784 111 784 q 2 811 31 784 q -26 878 -26 838 q 1 946 -26 917 q 68 976 29 976 m 327 976 q 394 948 366 976 q 422 878 422 920 q 396 811 422 838 q 329 784 370 784 q 260 811 288 784 q 232 878 232 838 q 260 947 232 918 q 327 976 288 976 \"},\">\":{\"x_min\":174.984375,\"x_max\":961,\"ha\":1138,\"o\":\"m 961 472 l 961 340 l 175 17 l 175 162 l 773 406 l 174 650 l 174 796 l 961 472 \"},\"v\":{\"x_min\":0,\"x_max\":669.453125,\"ha\":667,\"o\":\"m 0 667 q 75 663 26 667 q 131 659 123 659 q 202 663 156 659 q 255 667 247 667 l 293 528 l 387 223 q 526 667 473 447 l 595 659 q 637 663 611 659 q 669 667 663 667 q 541 343 602 505 q 418 0 480 181 q 368 4 395 2 q 330 6 341 6 q 279 3 311 6 q 244 0 248 0 q 129 340 184 186 q 0 667 73 494 \"},\"τ\":{\"x_min\":9,\"x_max\":654.84375,\"ha\":661,\"o\":\"m 446 557 l 445 521 l 445 108 q 456 0 445 55 l 338 4 l 225 0 q 234 69 231 40 q 237 125 237 98 l 237 320 l 237 516 l 237 557 q 59 459 115 557 l 24 459 q 20 516 24 490 q 9 581 17 543 q 122 641 59 625 q 263 658 185 658 l 440 656 q 654 667 556 656 q 649 610 649 641 q 654 554 649 580 q 525 555 603 554 q 446 557 447 557 \"},\"û\":{\"x_min\":75,\"x_max\":722,\"ha\":808,\"o\":\"m 339 1004 l 463 1004 l 616 757 l 549 757 l 400 879 l 254 757 l 186 757 l 339 1004 m 292 -15 q 142 41 202 -15 q 83 189 83 98 l 83 337 q 79 509 83 394 q 75 668 75 625 q 134 662 108 664 q 185 660 160 660 q 240 662 209 660 q 300 668 271 665 q 290 455 290 570 l 290 384 l 290 279 q 316 146 290 181 q 394 111 343 111 q 467 147 441 111 q 501 234 493 184 l 501 330 q 499 488 501 415 q 495 668 497 562 q 554 662 518 665 q 613 660 589 660 q 671 662 640 660 q 722 668 701 665 q 717 505 722 625 q 712 326 712 386 q 717 156 712 270 q 722 1 722 43 l 617 4 l 511 1 l 511 96 q 410 15 468 46 q 292 -15 353 -15 \"},\"ξ\":{\"x_min\":53,\"x_max\":675,\"ha\":675,\"o\":\"m 559 813 q 508 904 534 873 q 432 936 482 936 q 335 887 372 936 q 299 776 299 838 q 372 648 299 683 q 550 614 446 614 l 546 569 l 546 525 l 455 528 q 320 498 379 528 q 251 432 261 469 q 240 386 241 396 q 239 360 239 376 q 240 322 239 335 q 244 304 241 310 q 363 205 258 226 q 569 165 469 183 q 675 25 675 130 q 647 -83 675 -27 q 536 -221 619 -139 l 468 -181 q 514 -114 498 -141 q 531 -55 531 -88 q 380 23 531 -5 q 141 98 229 53 q 53 287 53 143 q 113 467 53 390 q 274 586 173 544 q 144 666 196 615 q 92 790 92 716 q 180 962 92 901 q 389 1024 269 1024 q 515 1009 455 1024 q 640 963 575 994 q 620 886 632 936 q 604 809 608 836 l 559 813 \"},\"&\":{\"x_min\":50,\"x_max\":948.609375,\"ha\":974,\"o\":\"m 316 -18 q 128 44 206 -18 q 50 215 50 107 q 115 388 50 315 q 281 502 180 462 q 216 609 243 547 q 190 723 190 670 q 266 877 190 823 q 446 932 342 932 q 604 889 537 932 q 672 761 672 847 q 621 631 672 687 q 495 541 571 576 q 709 295 593 412 q 786 421 751 348 q 845 567 822 494 q 880 517 861 538 q 934 463 899 495 q 851 336 888 387 q 761 233 813 285 q 856 123 811 174 q 948 26 902 71 l 948 1 q 860 7 887 6 q 817 8 833 8 q 756 6 779 8 q 690 1 734 5 l 612 92 q 469 11 545 40 q 316 -18 394 -18 m 232 284 q 284 160 232 214 q 408 106 337 106 q 484 118 449 106 q 562 155 519 130 q 421 323 469 264 q 330 443 373 382 q 258 373 284 411 q 232 284 232 336 m 547 759 q 522 831 547 802 q 453 860 498 860 q 419 854 435 860 q 379 823 394 850 q 365 769 365 797 q 383 697 365 740 q 449 597 402 654 q 520 668 493 627 q 547 759 547 709 \"},\"Λ\":{\"x_min\":-19.4375,\"x_max\":856.953125,\"ha\":836,\"o\":\"m 583 700 l 856 0 q 781 3 823 0 q 723 6 740 6 q 645 3 688 6 q 587 0 602 0 q 563 90 579 43 q 538 163 547 137 l 359 637 l 189 161 q 142 0 163 87 l 72 5 q 35 4 48 5 q -19 0 23 4 q 25 92 -2 33 q 83 226 52 151 l 272 698 q 311 810 290 747 q 348 932 331 873 q 394 927 379 929 q 423 926 409 926 q 474 929 456 926 q 501 932 491 932 q 583 700 536 819 \"},\"I\":{\"x_min\":94,\"x_max\":354,\"ha\":447,\"o\":\"m 111 402 q 107 716 111 609 q 94 932 103 822 q 161 925 124 929 q 220 922 198 922 q 292 927 245 922 q 353 931 339 932 q 340 716 343 819 q 337 465 337 613 q 340 221 337 326 q 354 0 344 116 q 273 2 330 0 q 214 5 216 5 l 95 0 q 107 199 103 88 q 111 402 111 311 \"},\"G\":{\"x_min\":43,\"x_max\":948,\"ha\":1015,\"o\":\"m 552 -15 q 183 110 324 -15 q 43 461 43 236 q 195 823 43 693 q 583 954 347 954 q 763 932 679 954 q 929 865 848 911 q 879 697 895 784 l 862 697 q 749 816 818 772 q 595 860 680 860 q 390 769 471 860 q 300 608 309 679 q 289 513 291 536 q 287 469 287 490 q 289 404 287 426 q 294 375 292 382 q 389 167 310 250 q 590 84 468 84 q 713 100 651 84 q 699 430 713 272 q 824 423 768 423 q 948 431 886 423 q 942 323 948 395 q 937 214 937 251 q 939 118 937 185 q 942 47 942 51 q 746 1 839 17 q 552 -15 652 -15 \"},\"ΰ\":{\"x_min\":39,\"x_max\":768,\"ha\":843,\"o\":\"m 768 415 q 666 114 768 244 q 404 -15 565 -15 q 165 56 246 -15 q 85 284 85 127 l 89 478 q 87 589 89 523 q 85 666 85 656 q 148 663 102 666 q 198 661 194 661 q 266 663 219 661 q 314 666 312 666 q 298 476 304 566 q 293 294 293 387 q 313 122 293 193 q 405 52 333 52 q 518 146 490 52 q 547 351 547 240 q 528 502 547 433 q 472 656 510 570 q 583 659 531 656 q 687 672 636 662 q 746 547 725 613 q 768 415 768 481 m 121 961 q 179 935 155 961 q 203 877 203 910 q 179 820 203 844 q 121 797 155 797 q 64 820 89 797 q 39 879 39 844 q 62 935 39 910 q 121 961 86 961 m 462 1017 q 504 998 486 1017 q 522 957 522 980 q 508 919 522 935 q 470 886 494 903 l 282 755 l 224 755 l 368 950 q 413 998 391 979 q 462 1017 434 1017 m 657 961 q 713 935 688 961 q 739 877 739 910 q 715 820 739 844 q 658 797 691 797 q 600 820 625 797 q 575 879 575 844 q 599 936 575 912 q 657 961 623 961 \"},\"`\":{\"x_min\":65.671875,\"x_max\":330.9375,\"ha\":375,\"o\":\"m 251 613 q 217 540 240 569 q 153 512 193 512 q 92 537 118 512 q 65 598 65 562 q 87 665 65 634 l 292 949 l 330 933 l 251 613 \"},\"Υ\":{\"x_min\":-30,\"x_max\":797,\"ha\":747,\"o\":\"m 136 650 q 67 772 123 672 q -30 932 10 872 l 92 926 q 184 929 120 926 q 256 931 249 931 q 345 740 304 825 q 442 554 386 656 q 541 730 492 636 q 637 931 589 825 l 712 926 q 753 929 726 926 q 797 931 781 931 q 644 689 714 812 q 498 420 573 566 l 502 143 l 508 0 l 414 5 l 256 0 q 262 138 256 50 q 269 237 269 226 l 269 402 l 136 650 \"},\"r\":{\"x_min\":80,\"x_max\":505,\"ha\":521,\"o\":\"m 91 326 q 85 495 91 381 q 80 666 80 609 l 181 661 q 246 663 201 661 q 297 666 291 666 q 283 592 287 630 q 280 504 280 554 l 288 504 q 357 632 311 581 q 474 683 403 683 l 505 683 q 495 571 498 631 q 492 457 492 511 q 448 477 471 468 q 406 486 424 486 q 320 439 343 486 q 298 323 298 392 q 300 147 298 208 q 311 0 302 85 q 247 3 288 0 q 195 6 206 6 q 130 3 171 6 q 80 0 88 0 q 85 162 80 53 q 91 326 91 270 \"},\"x\":{\"x_min\":-4.5625,\"x_max\":646.828125,\"ha\":644,\"o\":\"m 155 0 l 84 5 q 28 4 46 5 q -4 0 6 0 q 110 148 55 75 q 223 307 164 222 l 113 498 l 7 667 q 86 663 38 667 q 141 659 134 659 q 215 663 169 659 q 271 667 262 667 l 366 473 q 419 555 398 521 q 481 667 439 590 l 553 659 q 601 663 571 659 q 637 667 631 667 q 537 542 580 598 q 419 384 494 486 l 537 177 q 646 0 588 88 q 571 3 620 0 q 516 6 523 6 q 441 3 489 6 q 385 0 392 0 l 276 218 l 155 0 \"},\"è\":{\"x_min\":41,\"x_max\":684.046875,\"ha\":729,\"o\":\"m 482 98 q 566 112 532 98 q 643 160 600 126 l 661 151 q 643 96 652 125 q 628 40 634 66 q 521 -1 577 11 q 403 -15 466 -15 q 141 79 241 -15 q 41 336 41 173 q 137 586 41 490 q 386 683 234 683 q 608 601 532 683 q 684 373 684 520 l 684 332 l 267 332 q 325 165 267 232 q 482 98 383 98 m 436 754 l 211 862 q 162 896 181 877 q 143 946 143 915 q 165 996 143 976 q 217 1017 186 1017 q 274 996 250 1017 q 320 952 298 975 l 508 754 l 436 754 m 478 411 q 481 444 481 422 q 459 566 481 513 q 377 620 438 620 q 292 562 318 620 q 267 437 267 505 l 267 411 l 478 411 \"},\"μ\":{\"x_min\":79,\"x_max\":729,\"ha\":808,\"o\":\"m 717 322 q 723 136 717 256 q 729 0 729 15 l 629 5 q 564 2 609 5 q 518 0 519 0 l 518 81 q 448 4 479 23 q 384 -15 417 -15 q 333 -4 352 -15 q 288 25 313 7 l 288 34 l 287 -57 l 288 -190 l 287 -180 q 292 -278 287 -212 q 297 -368 297 -344 q 221 -361 240 -361 q 189 -361 201 -361 q 150 -361 168 -361 q 79 -368 131 -362 q 86 -277 83 -323 q 90 -187 90 -231 l 90 116 q 90 303 90 177 q 90 491 90 428 q 86 593 90 530 q 82 667 82 655 q 190 659 139 659 q 255 663 214 659 q 305 666 296 666 q 301 506 305 613 q 297 360 297 398 l 297 260 q 315 142 297 189 q 396 95 334 95 q 486 153 466 95 q 507 299 507 211 q 503 517 507 385 q 500 667 500 650 q 619 659 566 659 q 683 663 645 659 q 729 666 722 666 q 723 465 729 594 q 717 322 717 336 \"},\"÷\":{\"x_min\":169,\"x_max\":969,\"ha\":1139,\"o\":\"m 669 667 q 638 597 669 626 q 566 568 608 568 q 497 597 526 568 q 468 669 468 626 q 497 739 468 710 q 567 769 526 769 q 639 739 610 769 q 669 667 669 710 m 969 474 l 969 342 l 169 342 l 169 474 l 969 474 m 669 144 q 638 73 669 103 q 568 44 608 44 q 497 73 526 44 q 468 142 468 102 q 498 214 468 184 q 568 244 528 244 q 639 216 610 244 q 669 144 669 188 \"},\"h\":{\"x_min\":80,\"x_max\":729,\"ha\":808,\"o\":\"m 509 683 q 660 626 601 683 q 719 477 719 570 l 719 403 l 719 246 q 720 109 719 148 q 729 0 722 70 q 665 2 709 0 q 617 5 620 5 q 551 2 598 5 q 501 0 505 0 q 510 147 508 73 q 513 333 513 221 l 509 426 q 482 516 503 482 q 411 551 461 551 q 356 534 380 551 q 322 489 332 517 q 306 428 312 462 q 301 331 301 394 q 304 166 301 277 q 308 0 308 55 q 244 3 284 0 q 194 6 204 6 q 129 3 171 6 q 80 0 88 0 q 85 255 80 84 q 91 513 91 426 q 85 769 91 598 q 80 1024 80 940 l 180 1018 l 197 1018 q 308 1023 259 1018 q 304 902 308 976 q 301 815 301 827 l 301 583 q 509 683 379 683 \"},\".\":{\"x_min\":68,\"x_max\":306,\"ha\":375,\"o\":\"m 187 221 q 268 186 230 221 q 306 104 306 151 q 270 23 306 61 q 187 -15 235 -15 q 102 18 137 -15 q 68 103 68 51 q 102 186 68 151 q 187 221 137 221 \"},\"φ\":{\"x_min\":32,\"x_max\":1012,\"ha\":1044,\"o\":\"m 418 388 q 477 605 418 528 q 671 683 537 683 q 913 589 814 683 q 1012 352 1012 495 q 902 94 1012 180 q 612 -7 793 9 q 617 -198 612 -69 q 622 -374 622 -326 l 544 -365 q 471 -366 503 -365 q 404 -373 438 -368 q 411 -183 404 -315 q 418 -5 418 -51 q 359 1 377 0 q 320 8 341 2 q 112 118 193 29 q 32 334 32 206 q 123 568 32 488 q 374 669 215 648 q 381 643 376 656 q 393 612 386 629 q 278 504 311 576 q 246 329 246 431 q 285 142 246 223 q 418 61 325 61 l 418 276 l 418 388 m 612 61 q 707 88 670 66 q 763 157 743 109 q 788 255 782 205 q 794 377 794 305 q 791 450 794 416 q 779 528 788 484 q 748 593 770 572 q 696 614 725 614 q 631 564 650 614 q 612 459 612 515 l 612 276 l 612 61 \"},\";\":{\"x_min\":51.390625,\"x_max\":347,\"ha\":447,\"o\":\"m 226 654 q 310 619 274 654 q 347 534 347 584 q 312 450 347 485 q 227 416 277 416 q 142 449 177 416 q 108 534 108 482 q 142 619 108 584 q 226 654 177 654 m 134 120 q 172 203 145 170 q 244 237 200 237 q 313 207 284 237 q 343 137 343 178 q 337 100 343 116 q 319 63 331 84 l 88 -254 l 51 -238 l 134 120 \"},\"f\":{\"x_min\":8,\"x_max\":463.5625,\"ha\":425,\"o\":\"m 381 1024 q 433 1019 413 1024 q 463 1010 453 1012 q 443 934 456 987 q 419 826 430 880 l 412 826 q 362 862 384 850 q 310 874 339 874 q 233 812 233 874 q 258 729 233 773 q 300 658 284 685 l 317 658 q 354 658 336 658 q 428 665 372 659 l 425 669 l 425 641 q 425 607 425 625 q 425 576 425 590 l 356 583 l 306 583 l 306 273 q 308 166 306 200 q 323 0 310 133 q 258 3 299 0 q 209 6 217 6 q 144 3 185 6 q 92 0 102 0 q 102 127 99 51 q 105 272 105 203 l 105 580 l 56 583 l 8 583 l 9 622 l 9 665 q 52 659 29 660 q 105 658 74 658 q 183 904 105 784 q 381 1024 262 1024 \"},\"“\":{\"x_min\":65.28125,\"x_max\":609.71875,\"ha\":654,\"o\":\"m 251 613 q 218 541 243 570 q 154 512 194 512 q 90 537 116 512 q 65 601 65 563 q 87 665 65 634 l 291 949 l 331 933 l 251 613 m 530 613 q 498 542 525 573 q 433 512 472 512 q 371 536 397 512 q 345 598 345 560 q 366 665 345 633 l 570 949 l 609 933 l 530 613 \"},\"A\":{\"x_min\":-29.171875,\"x_max\":850,\"ha\":829,\"o\":\"m 109 322 q 193 530 143 400 q 278 751 244 660 q 351 949 312 843 l 420 944 l 490 949 q 672 450 584 685 q 850 0 759 215 l 716 4 l 580 0 l 551 91 l 497 259 q 398 261 448 259 q 300 264 348 262 l 202 259 q 112 0 162 134 l 22 4 l -29 0 l 109 322 m 354 368 l 464 368 q 416 509 440 446 q 355 662 393 572 q 243 370 295 519 l 354 368 \"},\"6\":{\"x_min\":40,\"x_max\":716,\"ha\":749,\"o\":\"m 463 545 q 646 475 576 545 q 716 293 716 405 q 628 65 716 150 q 398 -19 541 -19 q 133 84 226 -19 q 40 362 40 187 q 160 750 40 590 q 501 911 280 911 q 582 903 544 911 q 670 879 620 895 q 658 812 663 845 q 652 748 652 779 l 643 747 q 579 804 612 784 q 502 825 546 825 q 330 716 383 825 q 278 475 278 608 q 359 528 309 511 q 463 545 409 545 m 383 449 q 297 393 317 449 q 278 257 278 337 q 296 113 278 174 q 381 52 315 52 q 469 110 449 52 q 490 256 490 169 q 469 393 490 337 q 383 449 449 449 \"},\"‘\":{\"x_min\":68.0625,\"x_max\":331.9375,\"ha\":374,\"o\":\"m 251 613 q 218 540 241 569 q 151 512 194 512 q 92 537 116 512 q 68 599 68 563 q 75 632 68 612 q 90 663 81 652 l 293 949 l 331 935 l 251 613 \"},\"ϊ\":{\"x_min\":-28,\"x_max\":423,\"ha\":396,\"o\":\"m 91 126 l 91 543 l 80 666 q 139 661 105 663 q 196 658 173 658 q 264 660 238 658 q 314 666 290 663 q 304 586 307 616 q 301 523 301 557 l 301 113 q 302 72 301 88 q 314 0 304 56 l 195 4 l 81 0 q 87 67 84 30 q 91 126 91 104 m 68 975 q 136 947 108 975 q 164 879 164 919 q 138 811 164 840 q 72 783 112 783 q 2 810 33 783 q -28 879 -28 838 q 0 947 -28 919 q 68 975 27 975 m 328 975 q 395 947 367 975 q 423 879 423 919 q 397 811 423 840 q 331 783 371 783 q 261 810 292 783 q 231 879 231 838 q 258 947 231 919 q 328 975 286 975 \"},\"π\":{\"x_min\":19,\"x_max\":957.890625,\"ha\":965,\"o\":\"m 802 521 l 802 108 l 812 0 l 696 4 l 582 0 q 585 61 582 19 q 589 125 589 102 l 594 320 l 589 557 l 504 563 l 421 557 l 421 520 l 421 108 q 432 0 421 55 l 314 4 l 200 0 q 209 64 206 37 q 213 115 213 91 l 213 315 l 213 514 l 213 557 q 129 531 165 557 q 68 461 93 505 l 33 461 q 31 510 33 497 q 19 603 30 523 q 136 645 75 634 q 273 657 196 657 l 531 657 l 792 657 l 957 667 l 955 612 l 957 552 l 803 557 l 802 521 \"},\"ά\":{\"x_min\":30,\"x_max\":827.21875,\"ha\":878,\"o\":\"m 669 665 l 749 662 l 827 665 q 763 499 782 551 q 720 377 743 447 l 818 0 q 763 6 792 2 q 717 10 733 10 q 662 5 692 10 q 615 0 632 1 l 594 101 q 361 -15 501 -15 q 120 83 210 -15 q 30 334 30 182 q 123 583 30 484 q 368 683 217 683 q 515 647 449 683 q 633 547 582 612 q 651 601 640 563 q 669 665 662 638 m 523 952 q 576 1001 556 986 q 625 1017 596 1017 q 677 994 656 1017 q 698 943 698 972 q 679 896 698 915 q 629 862 660 877 l 406 754 l 337 754 l 523 952 m 383 614 q 313 588 343 614 q 276 523 283 562 q 260 434 265 484 q 256 333 256 385 q 269 174 256 249 q 305 87 275 122 q 385 52 335 52 q 509 144 473 52 q 546 340 546 236 q 522 504 546 428 q 455 597 498 580 q 383 614 411 614 \"},\"O\":{\"x_min\":40,\"x_max\":1086,\"ha\":1129,\"o\":\"m 577 949 q 945 829 804 949 q 1086 486 1086 710 q 942 114 1086 244 q 552 -15 798 -15 q 176 107 313 -15 q 40 465 40 229 q 188 823 40 697 q 577 949 337 949 m 562 73 q 773 194 706 73 q 840 472 840 315 q 773 742 840 624 q 566 860 706 860 q 353 742 420 860 q 287 465 287 624 q 353 193 287 313 q 562 73 420 73 \"},\"n\":{\"x_min\":80,\"x_max\":727,\"ha\":808,\"o\":\"m 91 338 q 85 512 91 391 q 80 667 80 632 q 137 661 125 662 q 180 661 149 661 q 249 661 215 661 q 293 666 279 665 l 293 568 q 391 648 333 616 q 508 681 449 681 q 659 624 600 681 q 719 475 719 567 l 719 329 q 723 172 719 287 q 727 0 727 58 q 673 2 709 0 q 617 5 637 5 q 552 2 598 5 q 502 0 506 0 q 507 175 502 58 q 512 333 512 291 l 512 358 q 508 426 512 393 q 483 514 508 476 q 411 552 459 552 q 355 534 379 552 q 318 487 331 517 q 302 419 305 457 q 299 330 299 382 q 304 148 299 264 q 309 0 309 33 q 244 3 285 0 q 195 6 203 6 q 128 3 170 6 q 80 0 86 0 q 85 188 80 65 q 91 338 91 311 \"},\"3\":{\"x_min\":30,\"x_max\":680,\"ha\":749,\"o\":\"m 365 908 q 561 853 479 908 q 643 691 643 799 q 593 565 643 612 q 457 485 544 517 l 457 476 q 617 410 555 463 q 680 260 680 356 q 573 50 680 122 q 318 -21 466 -21 q 30 58 155 -21 q 90 161 67 120 q 137 250 113 202 l 154 250 q 185 109 154 167 q 292 51 216 51 q 404 109 367 51 q 442 245 442 167 q 397 376 442 327 q 271 425 353 425 l 231 425 l 231 505 l 268 504 q 392 549 345 504 q 439 670 439 594 q 408 785 439 738 q 313 833 377 833 q 213 776 244 833 q 183 644 183 719 l 170 634 q 121 690 145 665 q 43 767 97 716 q 179 874 94 840 q 365 908 265 908 \"},\"9\":{\"x_min\":30,\"x_max\":705,\"ha\":749,\"o\":\"m 281 343 q 98 414 167 343 q 30 601 30 486 q 121 827 30 744 q 359 911 213 911 q 618 801 532 911 q 705 515 705 692 q 583 135 705 291 q 243 -21 461 -21 q 158 -12 193 -21 q 74 9 123 -4 q 87 74 82 42 q 92 140 92 106 l 102 143 q 163 84 127 105 q 243 64 199 64 q 414 172 362 64 q 467 414 467 280 q 386 359 435 376 q 281 343 337 343 m 360 440 q 446 495 426 440 q 467 630 467 551 q 447 775 467 714 q 361 837 427 837 q 274 778 293 837 q 256 631 256 720 q 276 496 256 553 q 360 440 296 440 \"},\"l\":{\"x_min\":86,\"x_max\":316,\"ha\":407,\"o\":\"m 99 501 q 95 701 99 579 q 92 843 92 823 l 86 1024 q 154 1016 125 1019 q 201 1013 183 1013 q 265 1018 232 1013 q 316 1023 297 1022 q 309 719 316 915 q 303 501 303 523 l 307 180 l 316 0 q 263 5 309 1 q 201 10 218 10 q 138 6 169 10 q 86 0 108 2 q 92 292 86 104 q 99 501 99 480 \"},\"κ\":{\"x_min\":80,\"x_max\":732.765625,\"ha\":756,\"o\":\"m 184 659 q 306 667 239 659 l 301 509 l 295 461 l 295 389 q 422 510 367 447 q 545 667 478 573 l 618 667 l 709 667 l 714 657 l 628 576 l 475 425 q 552 292 510 364 q 636 154 595 220 l 732 0 q 661 3 706 0 q 607 6 616 6 q 536 3 579 6 q 486 0 493 0 q 386 174 440 83 q 295 329 331 266 l 295 249 q 298 106 295 206 q 301 0 301 6 l 190 4 l 80 0 q 85 127 80 43 q 91 255 91 212 q 85 461 91 323 q 80 666 80 598 l 184 659 \"},\"4\":{\"x_min\":43,\"x_max\":708.265625,\"ha\":749,\"o\":\"m 706 383 l 701 299 q 704 248 701 271 q 708 211 706 225 q 592 221 650 221 l 592 176 q 594 83 592 127 q 606 0 597 40 q 540 3 579 0 q 497 6 501 6 q 433 3 473 6 q 384 0 393 0 q 393 104 390 44 q 396 219 396 165 l 309 221 q 169 216 262 221 q 43 212 76 212 l 44 296 l 44 379 q 174 568 113 477 q 287 738 235 658 q 396 909 338 818 q 503 902 444 902 q 553 902 527 902 q 606 909 589 907 q 599 720 606 843 q 592 534 592 596 l 592 370 q 650 375 614 370 q 706 383 686 380 m 396 370 l 396 752 l 141 370 l 396 370 \"},\"p\":{\"x_min\":82,\"x_max\":772,\"ha\":825,\"o\":\"m 502 683 q 704 574 636 683 q 772 322 772 466 q 701 82 772 179 q 491 -15 630 -15 q 302 85 371 -15 l 302 -71 l 309 -385 q 249 -379 278 -382 q 196 -376 221 -376 q 139 -379 171 -376 q 82 -384 108 -381 q 87 -252 82 -341 q 92 -131 92 -162 l 88 487 l 82 666 q 195 659 141 659 q 235 660 216 659 q 307 666 254 661 q 302 580 302 618 q 391 656 343 630 q 502 683 440 683 m 430 79 q 472 86 453 79 q 515 122 491 94 q 548 204 539 151 q 557 337 557 258 q 532 503 557 431 q 430 576 507 576 q 324 501 350 576 q 298 327 298 427 q 323 152 298 226 q 430 79 349 79 \"},\"ψ\":{\"x_min\":59,\"x_max\":1025,\"ha\":1064,\"o\":\"m 1025 437 q 919 131 1025 249 q 625 -7 813 13 q 630 -190 625 -68 q 636 -374 636 -312 l 558 -365 q 483 -366 516 -365 q 418 -373 451 -368 q 424 -159 418 -297 q 431 -5 431 -22 q 374 0 401 -2 q 271 20 348 2 q 127 124 195 37 q 59 331 59 211 l 60 484 l 59 666 l 168 663 l 277 666 q 269 506 277 619 q 261 358 261 392 q 293 144 261 228 q 431 51 325 60 l 431 253 q 424 572 431 367 q 418 800 418 777 l 536 795 l 636 798 q 630 650 636 748 q 625 501 625 551 l 625 254 l 625 51 q 767 146 726 51 q 808 359 808 241 q 798 498 808 440 q 762 650 788 556 q 867 654 821 650 q 980 666 913 658 q 1025 437 1025 552 \"},\"Ü\":{\"x_min\":82,\"x_max\":910,\"ha\":997,\"o\":\"m 210 927 l 338 931 q 329 643 338 836 q 321 421 321 451 q 360 197 321 284 q 521 110 400 110 q 678 162 609 110 q 756 279 747 214 q 768 420 765 344 q 771 548 771 495 q 756 931 771 755 l 814 927 l 910 931 q 903 770 910 883 q 896 616 896 657 l 896 480 l 896 375 q 794 81 896 178 q 493 -15 692 -15 q 210 56 321 -15 q 100 287 100 128 q 91 619 100 386 q 82 931 82 852 l 210 927 m 394 1242 q 461 1215 433 1242 q 489 1148 489 1189 q 463 1078 489 1107 q 396 1050 437 1050 q 327 1078 355 1050 q 299 1148 299 1107 q 326 1214 299 1186 q 394 1242 354 1242 m 654 1242 q 721 1214 694 1242 q 749 1148 749 1187 q 724 1079 749 1108 q 658 1050 699 1050 q 588 1077 617 1050 q 559 1148 559 1105 q 587 1214 559 1187 q 654 1242 615 1242 \"},\"à\":{\"x_min\":44,\"x_max\":706.78125,\"ha\":706,\"o\":\"m 237 -15 q 98 35 153 -15 q 44 169 44 86 q 212 352 44 301 q 401 421 380 403 q 410 439 410 432 q 373 539 410 502 q 275 577 337 577 q 140 511 185 577 l 135 511 l 115 585 q 230 657 164 632 q 365 683 296 683 q 543 623 479 683 q 608 452 608 564 l 604 213 q 604 166 604 184 q 608 123 604 148 q 625 87 612 99 q 658 76 638 76 q 679 80 666 76 q 702 90 691 84 l 706 40 q 643 1 676 14 q 563 -15 610 -10 q 481 5 520 -15 q 421 64 441 26 q 237 -15 351 -15 m 425 755 l 201 863 q 145 902 159 883 q 131 944 131 921 q 153 996 131 975 q 206 1017 175 1017 q 253 1002 232 1017 q 309 953 273 987 l 494 755 l 425 755 m 240 200 q 261 128 240 158 q 321 99 282 99 q 388 131 367 99 q 410 211 410 164 l 410 352 q 287 302 335 338 q 240 200 240 267 \"},\"η\":{\"x_min\":80,\"x_max\":727,\"ha\":808,\"o\":\"m 91 339 q 85 512 91 391 q 80 667 80 632 q 137 661 125 662 q 180 661 149 661 q 244 663 199 661 q 293 666 290 666 l 293 568 q 391 651 338 622 q 511 681 443 681 q 660 622 602 681 q 719 471 719 564 l 719 328 l 719 -49 q 723 -219 719 -106 q 727 -373 727 -332 q 618 -365 670 -365 q 502 -373 562 -365 l 512 16 l 512 251 l 512 368 q 491 499 512 446 q 408 552 471 552 q 319 488 342 552 q 302 419 305 457 q 299 330 299 382 q 304 148 299 264 q 309 0 309 33 q 243 3 278 0 q 195 6 207 6 q 127 3 163 6 q 80 0 92 0 q 85 188 80 65 q 91 339 91 311 \"}},\"cssFontWeight\":\"bold\",\"ascender\":1288,\"underlinePosition\":-133,\"cssFontStyle\":\"normal\",\"boundingBox\":{\"yMin\":-385,\"xMin\":-147,\"yMax\":1288,\"xMax\":1618},\"resolution\":1000,\"original_font_information\":{\"postscript_name\":\"Optimer-Bold\",\"version_string\":\"Version 1.00 2004 initial release\",\"vendor_url\":\"http://www.magenta.gr/\",\"full_font_name\":\"Optimer Bold\",\"font_family_name\":\"Optimer\",\"copyright\":\"Copyright (c) Magenta Ltd., 2004.\",\"description\":\"\",\"trademark\":\"\",\"designer\":\"\",\"designer_url\":\"\",\"unique_font_identifier\":\"Magenta Ltd.:Optimer Bold:22-10-104\",\"license_url\":\"http://www.ellak.gr/fonts/MgOpen/license.html\",\"license_description\":\"Copyright (c) 2004 by MAGENTA Ltd. All Rights Reserved.\\r\\n\\r\\nPermission is hereby granted, free of charge, to any person obtaining a copy of the fonts accompanying this license (\\\"Fonts\\\") and associated documentation files (the \\\"Font Software\\\"), to reproduce and distribute the Font Software, including without limitation the rights to use, copy, merge, publish, distribute, and/or sell copies of the Font Software, and to permit persons to whom the Font Software is furnished to do so, subject to the following conditions: \\r\\n\\r\\nThe above copyright and this permission notice shall be included in all copies of one or more of the Font Software typefaces.\\r\\n\\r\\nThe Font Software may be modified, altered, or added to, and in particular the designs of glyphs or characters in the Fonts may be modified and additional glyphs or characters may be added to the Fonts, only if the fonts are renamed to names not containing the word \\\"MgOpen\\\", or if the modifications are accepted for inclusion in the Font Software itself by the each appointed Administrator.\\r\\n\\r\\nThis License becomes null and void to the extent applicable to Fonts or Font Software that has been modified and is distributed under the \\\"MgOpen\\\" name.\\r\\n\\r\\nThe Font Software may be sold as part of a larger software package but no copy of one or more of the Font Software typefaces may be sold by itself. \\r\\n\\r\\nTHE FONT SOFTWARE IS PROVIDED \\\"AS IS\\\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL MAGENTA OR PERSONS OR BODIES IN CHARGE OF ADMINISTRATION AND MAINTENANCE OF THE FONT SOFTWARE BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE.\",\"manufacturer_name\":\"Magenta Ltd.\",\"font_sub_family_name\":\"Bold\"},\"descender\":-385,\"familyName\":\"Optimer\",\"lineHeight\":1672,\"underlineThickness\":20}"
  },
  {
    "path": "examples/resources/fonts/typeface/optimer_regular.typeface.json",
    "content": "{\"glyphs\":{\"ο\":{\"x_min\":41,\"x_max\":710,\"ha\":753,\"o\":\"m 371 -15 q 131 78 222 -15 q 41 322 41 172 q 133 573 41 474 q 378 672 225 672 q 619 574 528 672 q 710 326 710 477 q 617 80 710 175 q 371 -15 525 -15 m 377 619 q 226 530 272 619 q 180 327 180 441 q 227 125 180 216 q 375 35 274 35 q 524 123 478 35 q 570 326 570 211 q 524 529 570 440 q 377 619 479 619 \"},\"S\":{\"x_min\":50,\"x_max\":639,\"ha\":699,\"o\":\"m 88 208 q 179 88 122 131 q 318 46 237 46 q 457 98 397 46 q 518 227 518 150 q 401 400 518 336 q 184 498 293 448 q 68 688 68 566 q 156 880 68 811 q 370 950 244 950 q 480 936 430 950 q 597 891 530 922 q 570 822 583 858 q 553 756 558 786 l 539 756 q 354 897 502 897 q 231 855 282 897 q 181 742 181 813 q 298 580 181 640 q 519 483 408 531 q 639 286 639 413 q 538 68 639 152 q 301 -15 438 -15 q 166 2 229 -15 q 50 59 104 19 q 68 135 62 104 q 75 205 75 166 l 88 208 \"},\"/\":{\"x_min\":-36.03125,\"x_max\":404.15625,\"ha\":383,\"o\":\"m -36 -125 l 340 1025 l 404 1024 l 28 -126 l -36 -125 \"},\"Τ\":{\"x_min\":11,\"x_max\":713,\"ha\":725,\"o\":\"m 11 839 l 15 884 l 11 932 q 194 927 72 932 q 361 922 316 922 q 544 927 421 922 q 713 932 668 932 q 707 883 707 911 q 707 861 707 870 q 713 834 707 852 q 609 850 666 843 q 504 857 552 857 l 428 857 q 426 767 428 830 q 424 701 424 704 l 428 220 q 442 0 428 122 q 362 8 401 3 q 323 5 344 8 q 282 0 301 2 q 289 132 282 40 q 296 259 296 225 l 296 683 l 296 857 q 11 839 164 857 \"},\"ϕ\":{\"x_min\":41,\"x_max\":960,\"ha\":1006,\"o\":\"m 441 -10 q 162 76 283 -10 q 41 316 41 163 q 162 562 41 470 q 441 654 283 654 q 434 838 441 719 q 427 971 427 957 q 464 965 443 968 q 503 962 485 962 q 540 965 519 962 q 578 970 560 968 q 563 654 563 824 q 839 567 719 654 q 960 324 960 481 q 841 79 960 169 q 563 -10 722 -10 q 570 -201 563 -68 q 578 -371 578 -334 q 505 -362 539 -362 q 465 -365 483 -362 q 427 -372 446 -368 q 434 -161 427 -297 q 441 -10 441 -26 m 563 39 q 757 118 690 39 q 824 330 824 198 q 750 523 824 445 q 564 601 677 601 l 563 319 l 563 39 m 441 319 l 441 601 q 253 523 326 601 q 180 330 180 446 q 245 117 180 195 q 439 39 310 39 l 441 319 \"},\"y\":{\"x_min\":4.171875,\"x_max\":665.28125,\"ha\":664,\"o\":\"m 4 654 l 86 647 l 165 654 q 202 536 188 577 q 241 431 215 495 l 363 129 l 473 413 q 552 654 519 537 q 606 647 583 647 q 665 654 633 647 q 416 125 531 388 q 223 -372 301 -137 l 187 -366 q 141 -366 163 -366 q 112 -372 122 -370 l 290 -22 q 4 654 170 294 \"},\"≈\":{\"x_min\":118.0625,\"x_max\":1019.453125,\"ha\":1139,\"o\":\"m 765 442 q 564 487 700 442 q 376 533 429 533 q 250 506 298 533 q 118 427 202 480 l 118 501 q 245 572 180 545 q 376 600 311 600 q 574 553 438 600 q 765 507 709 507 q 888 534 829 507 q 1019 614 947 562 l 1019 538 q 892 467 954 493 q 765 442 830 442 m 759 214 q 568 260 702 214 q 376 307 433 307 q 236 272 300 307 q 118 202 173 238 l 118 277 q 247 346 181 320 q 380 372 312 372 q 570 326 445 372 q 765 281 695 281 q 883 306 830 281 q 1019 388 936 331 l 1019 313 q 894 240 959 266 q 759 214 829 214 \"},\"Π\":{\"x_min\":108,\"x_max\":927.453125,\"ha\":1036,\"o\":\"m 432 846 l 263 846 q 260 634 263 781 q 257 475 257 486 q 262 236 257 395 q 268 0 268 77 q 229 3 255 0 q 188 8 202 8 q 149 3 177 8 q 108 0 121 0 q 117 239 108 70 q 126 465 126 408 q 122 711 126 620 q 108 932 119 803 q 285 926 166 932 q 464 921 405 921 q 695 926 541 921 q 927 932 849 932 q 915 793 921 871 q 909 659 909 716 l 909 504 q 917 245 909 427 q 926 0 926 62 q 887 4 913 0 q 847 8 860 8 q 810 5 827 8 q 768 0 792 2 q 773 259 768 94 q 778 469 778 423 l 778 731 l 773 846 l 432 846 \"},\"ΐ\":{\"x_min\":-41,\"x_max\":384,\"ha\":342,\"o\":\"m 105 333 l 105 520 q 104 566 105 544 q 97 654 103 588 q 141 647 131 648 q 166 647 152 647 q 234 654 196 647 q 225 555 226 599 q 224 437 224 510 l 224 406 q 229 194 224 337 q 234 0 234 51 q 202 3 217 1 q 166 5 186 5 q 128 3 149 5 q 97 0 108 1 q 101 165 97 51 q 105 333 105 279 m 18 865 q 61 846 43 865 q 80 804 80 828 q 61 761 80 779 q 18 743 43 743 q -22 761 -4 743 q -41 804 -41 779 q -22 846 -41 828 q 18 865 -4 865 m 172 929 q 189 969 179 956 q 225 982 199 982 q 256 971 243 982 q 270 941 270 961 q 257 904 270 919 l 149 743 l 117 743 l 172 929 m 324 865 q 366 846 348 865 q 384 804 384 828 q 366 761 384 779 q 324 743 348 743 q 281 761 298 743 q 265 804 265 779 q 281 846 265 828 q 324 865 298 865 \"},\"g\":{\"x_min\":32,\"x_max\":672,\"ha\":688,\"o\":\"m 81 123 q 112 201 81 169 q 193 252 144 233 l 193 262 q 97 329 130 277 q 64 447 64 380 q 141 610 64 549 q 323 672 218 672 q 421 661 357 672 q 500 650 486 651 l 672 654 l 672 582 q 599 592 635 587 q 537 597 563 597 q 607 458 607 548 q 527 294 607 356 q 342 232 447 232 q 291 235 319 232 q 255 239 262 239 q 208 220 228 239 q 188 173 188 201 q 221 120 188 136 q 296 104 254 104 l 427 104 q 603 56 534 104 q 672 -93 672 9 q 560 -299 672 -226 q 309 -372 448 -372 q 115 -327 199 -372 q 32 -183 32 -283 q 76 -62 32 -110 q 193 8 121 -13 q 112 51 143 25 q 81 123 81 77 m 332 278 q 439 332 401 278 q 478 457 478 386 q 441 575 478 525 q 338 625 404 625 q 232 570 271 625 q 194 447 194 515 q 230 328 194 379 q 332 278 266 278 m 337 -316 q 491 -270 423 -316 q 559 -141 559 -224 q 500 -29 559 -62 q 353 3 441 3 q 199 -36 263 3 q 136 -162 136 -76 q 195 -277 136 -238 q 337 -316 255 -316 \"},\"²\":{\"x_min\":15.28125,\"x_max\":412.5,\"ha\":496,\"o\":\"m 297 744 q 270 830 297 795 q 197 866 244 866 q 120 837 149 866 q 83 761 90 808 l 76 759 q 54 802 68 780 q 31 837 40 824 q 210 901 108 901 q 334 862 278 901 q 390 758 390 824 q 282 568 390 656 q 111 428 174 479 l 293 428 q 350 431 316 428 q 412 439 384 434 l 406 397 l 412 356 l 304 361 l 111 361 l 15 355 l 15 378 q 220 567 144 484 q 297 744 297 651 \"},\"Κ\":{\"x_min\":108,\"x_max\":856.625,\"ha\":821,\"o\":\"m 255 314 q 261 132 255 250 q 268 0 268 13 q 229 4 255 0 q 188 8 202 8 q 148 4 174 8 q 108 0 121 0 q 117 239 108 70 q 126 465 126 408 q 122 712 126 621 q 108 932 119 803 q 153 928 124 932 q 188 925 183 925 q 231 928 203 925 q 267 932 259 932 l 255 671 l 255 499 q 480 693 375 586 q 687 932 585 800 q 732 932 710 932 q 777 932 753 932 l 837 932 q 606 727 720 830 q 389 522 493 623 q 525 358 465 426 q 666 202 586 290 q 856 0 747 115 l 746 0 q 692 -1 716 0 q 644 -8 669 -2 q 571 92 610 44 q 477 204 532 140 l 255 459 l 255 314 \"},\"ë\":{\"x_min\":40,\"x_max\":646.9375,\"ha\":681,\"o\":\"m 406 42 q 602 130 523 42 l 621 130 q 613 93 617 112 q 609 47 609 73 q 496 0 558 14 q 369 -15 435 -15 q 130 73 220 -15 q 40 311 40 162 q 126 562 40 456 q 355 669 212 669 q 564 590 481 669 q 646 386 646 512 l 644 331 q 438 333 562 331 q 313 335 315 335 l 179 331 q 235 127 179 212 q 406 42 291 42 m 219 929 q 271 906 249 929 q 294 854 294 884 q 273 800 294 822 q 221 778 252 778 q 166 800 190 778 q 143 854 143 822 q 165 906 143 884 q 219 929 187 929 m 460 929 q 513 906 492 929 q 534 854 534 884 q 513 799 534 820 q 461 778 493 778 q 407 800 429 778 q 385 854 385 822 q 407 906 385 884 q 460 929 429 929 m 513 392 l 513 437 q 470 563 513 509 q 356 618 427 618 q 233 552 271 618 q 183 390 195 487 l 513 392 \"},\"e\":{\"x_min\":41,\"x_max\":645.15625,\"ha\":681,\"o\":\"m 406 42 q 602 130 523 42 l 618 125 q 611 86 614 104 q 609 44 609 67 q 497 0 561 14 q 370 -15 434 -15 q 130 73 220 -15 q 41 311 41 161 q 127 563 41 455 q 356 672 214 672 q 563 592 482 672 q 645 385 645 512 l 643 331 l 313 335 l 179 331 q 235 126 179 210 q 406 42 291 42 m 511 392 l 513 436 q 470 563 513 509 q 356 618 427 618 q 230 553 268 618 q 179 388 191 488 l 511 392 \"},\"ό\":{\"x_min\":41,\"x_max\":710,\"ha\":753,\"o\":\"m 371 -15 q 131 78 222 -15 q 41 322 41 172 q 133 573 41 474 q 378 672 225 672 q 619 574 528 672 q 710 326 710 477 q 617 80 710 175 q 371 -15 525 -15 m 524 943 q 558 974 542 964 q 595 985 574 985 q 632 969 618 985 q 646 932 646 954 q 632 897 646 911 q 591 866 618 883 l 390 743 l 341 743 l 524 943 m 377 619 q 226 530 272 619 q 180 327 180 441 q 227 125 180 216 q 375 35 274 35 q 524 123 478 35 q 570 326 570 211 q 524 529 570 440 q 377 619 479 619 \"},\"J\":{\"x_min\":-71,\"x_max\":277,\"ha\":385,\"o\":\"m 118 -40 q 131 62 128 9 q 135 184 135 115 q 132 462 135 325 q 127 690 130 598 q 111 932 123 782 q 159 928 129 932 q 193 925 189 925 q 238 927 221 925 q 277 932 256 929 q 268 665 277 843 q 260 457 260 487 l 260 165 q 260 107 260 147 q 260 48 260 68 q 169 -155 260 -88 q -62 -222 79 -222 l -71 -180 q 50 -134 1 -166 q 118 -40 100 -102 \"},\"»\":{\"x_min\":43,\"x_max\":543,\"ha\":607,\"o\":\"m 196 322 l 43 607 l 81 645 l 303 322 l 81 0 l 43 37 l 196 322 m 436 322 l 283 607 l 322 645 l 543 322 l 322 0 l 283 37 l 436 322 \"},\"©\":{\"x_min\":80,\"x_max\":1058,\"ha\":1139,\"o\":\"m 816 905 q 992 726 927 841 q 1058 481 1058 611 q 912 138 1058 283 q 567 -6 766 -6 q 225 139 370 -6 q 80 481 80 284 q 224 826 80 681 q 569 971 368 971 q 816 905 698 971 m 569 918 q 263 788 392 918 q 134 481 134 659 q 261 175 134 306 q 566 45 389 45 q 872 174 741 45 q 1004 478 1004 304 q 947 699 1004 596 q 787 859 890 801 q 569 918 684 918 m 570 724 q 441 652 483 724 q 399 490 399 581 q 438 320 399 396 q 560 245 478 245 q 664 278 621 245 q 723 370 707 311 l 798 370 q 720 232 788 283 q 561 181 653 181 q 379 268 446 181 q 313 476 313 355 q 380 694 313 604 q 571 785 447 785 q 717 738 656 785 q 793 610 779 691 l 715 610 q 664 692 705 660 q 570 724 624 724 \"},\"ώ\":{\"x_min\":39.71875,\"x_max\":1028.9375,\"ha\":1068,\"o\":\"m 534 528 l 596 528 l 594 305 q 616 117 594 193 q 722 42 638 42 q 850 118 811 42 q 888 293 888 194 q 829 502 888 409 q 664 654 769 594 l 717 648 q 805 654 766 648 q 967 510 905 606 q 1028 304 1028 413 q 948 81 1028 177 q 744 -15 867 -15 q 622 16 678 -15 q 534 104 566 47 q 445 16 500 48 q 323 -15 389 -15 q 118 83 196 -15 q 39 311 39 182 q 100 511 39 419 q 262 654 161 604 q 303 650 278 651 q 349 648 327 648 l 402 654 q 238 501 296 593 q 179 291 179 409 q 218 116 179 191 q 348 42 257 42 q 419 68 390 42 q 461 138 448 94 q 472 216 469 175 q 475 303 475 257 q 472 420 475 353 q 469 529 470 486 l 534 528 m 681 943 q 714 974 699 964 q 751 985 730 985 q 788 969 774 985 q 802 932 802 954 q 787 896 802 912 q 746 866 773 880 l 547 743 l 498 743 l 681 943 \"},\"≥\":{\"x_min\":176.1875,\"x_max\":963,\"ha\":1139,\"o\":\"m 963 462 l 176 196 l 176 266 l 850 491 l 176 718 l 176 788 l 963 522 l 963 462 m 963 26 l 176 26 l 176 93 l 963 93 l 963 26 \"},\"^\":{\"x_min\":0,\"x_max\":390,\"ha\":403,\"o\":\"m 150 978 l 239 978 l 390 743 l 344 743 l 195 875 l 49 743 l 0 743 l 150 978 \"},\"«\":{\"x_min\":48,\"x_max\":549.390625,\"ha\":607,\"o\":\"m 152 326 l 309 42 l 268 3 l 48 326 l 268 649 l 309 611 l 152 326 m 394 326 l 549 42 l 509 3 l 288 326 l 509 649 l 549 611 l 394 326 \"},\"D\":{\"x_min\":108,\"x_max\":991,\"ha\":1043,\"o\":\"m 126 465 q 117 704 126 536 q 108 931 108 872 l 210 929 q 350 934 251 929 q 477 939 449 939 q 579 936 553 939 q 709 917 605 934 q 902 775 814 900 q 991 483 991 650 q 852 130 991 261 q 491 0 713 0 l 378 0 l 228 7 l 203 7 q 148 4 173 7 q 108 0 123 1 q 117 239 108 70 q 126 465 126 408 m 402 64 q 724 168 609 64 q 840 479 840 273 q 730 774 840 671 q 428 878 621 878 q 345 873 400 878 q 262 869 289 869 l 255 497 l 255 376 l 262 76 q 332 68 292 72 q 402 64 373 64 \"},\"w\":{\"x_min\":4.171875,\"x_max\":1052.78125,\"ha\":1047,\"o\":\"m 4 655 q 55 648 41 648 q 86 647 69 647 q 165 654 120 647 q 190 540 176 587 q 238 394 204 492 l 329 141 q 498 654 419 386 q 551 647 526 647 q 609 654 577 647 q 637 544 620 601 q 677 420 654 487 l 770 135 l 872 413 q 911 532 893 472 q 944 654 930 592 q 979 647 970 648 q 1000 647 988 647 q 1052 654 1022 647 q 961 457 1002 555 q 871 235 919 359 q 782 0 824 110 q 755 3 772 0 q 733 6 738 6 q 708 3 724 6 q 686 0 692 0 q 650 127 667 72 q 611 239 632 183 l 518 494 q 432 258 475 382 q 348 0 390 134 q 325 3 336 1 q 297 5 313 5 q 269 3 284 5 q 245 0 254 1 q 162 244 200 140 q 86 447 125 347 q 4 655 47 546 \"},\"$\":{\"x_min\":89,\"x_max\":666,\"ha\":749,\"o\":\"m 139 186 l 146 186 q 213 91 165 119 q 342 50 261 63 l 342 416 q 142 515 196 458 q 89 648 89 573 q 164 819 89 752 q 342 886 239 886 q 330 985 342 936 l 359 979 l 404 984 q 400 924 401 945 q 399 886 399 904 q 510 874 457 886 q 605 834 562 862 q 582 788 592 808 q 555 729 572 768 l 547 729 q 495 810 535 783 q 399 837 455 837 l 399 520 q 610 419 554 479 q 666 277 666 359 q 588 87 666 164 q 399 0 511 9 l 399 -32 q 399 -63 399 -48 q 405 -125 400 -78 l 368 -121 l 329 -125 l 342 0 q 210 13 273 0 q 98 58 147 27 l 139 186 m 342 836 q 237 787 278 826 q 196 686 196 748 q 237 588 196 626 q 342 537 279 551 l 342 836 m 553 231 q 513 337 553 300 q 399 402 473 375 l 399 51 q 512 113 471 66 q 553 231 553 159 \"},\"‧\":{\"x_min\":134,\"x_max\":309,\"ha\":446,\"o\":\"m 222 636 q 284 611 259 636 q 309 548 309 586 q 284 486 309 512 q 222 461 260 461 q 160 486 186 461 q 134 548 134 511 q 159 610 134 584 q 222 636 185 636 \"},\"\\\\\":{\"x_min\":-36,\"x_max\":403.140625,\"ha\":383,\"o\":\"m -36 1025 l 28 1025 l 403 -125 l 340 -125 l -36 1025 \"},\"Ι\":{\"x_min\":109,\"x_max\":271,\"ha\":385,\"o\":\"m 127 465 q 123 711 127 620 q 109 932 120 803 q 154 927 129 929 q 190 925 179 925 q 238 928 209 925 q 271 931 266 931 q 263 788 271 887 q 256 659 256 690 l 256 448 l 256 283 q 263 135 256 238 q 271 0 271 31 q 231 3 258 0 q 190 8 204 8 q 151 5 172 8 q 109 0 129 2 q 118 239 109 70 q 127 465 127 408 \"},\"Ύ\":{\"x_min\":-1,\"x_max\":1204.5625,\"ha\":1165,\"o\":\"m 758 177 l 758 386 q 651 570 717 458 q 543 750 585 681 q 431 931 501 819 q 483 928 449 931 q 522 925 518 925 q 572 927 550 925 q 606 931 593 930 q 666 800 633 866 q 735 676 699 734 l 849 475 q 968 688 910 575 q 1086 931 1027 801 l 1142 926 q 1174 927 1160 926 q 1204 931 1187 929 q 1014 627 1099 769 l 891 415 l 891 240 q 894 101 891 198 q 897 0 897 5 q 860 4 885 1 q 820 6 835 6 q 778 4 793 6 q 743 0 763 2 q 753 88 748 36 q 758 177 758 140 m 182 943 q 215 974 200 964 q 252 985 231 985 q 289 969 274 985 q 305 932 305 954 q 290 896 305 911 q 248 866 275 882 l 48 743 l -1 743 l 182 943 \"},\"’\":{\"x_min\":90.28125,\"x_max\":305.5625,\"ha\":374,\"o\":\"m 169 859 q 197 923 177 894 q 250 953 218 953 q 288 939 272 953 q 305 902 305 925 q 295 857 305 882 q 269 811 284 833 l 120 568 l 90 576 l 169 859 \"},\"Ν\":{\"x_min\":98,\"x_max\":911.890625,\"ha\":1011,\"o\":\"m 112 230 q 114 486 112 315 q 117 741 117 656 l 117 950 l 166 950 q 326 766 239 865 q 468 606 413 667 q 610 451 524 544 l 821 227 l 821 604 q 816 765 821 685 q 803 931 812 845 l 855 927 l 911 931 q 901 831 906 884 q 897 741 897 779 q 894 413 897 619 q 892 165 892 207 l 892 -15 l 849 -15 q 730 125 796 50 q 589 281 664 201 l 193 702 l 193 330 q 212 -1 193 169 l 149 2 l 98 -1 q 108 125 105 79 q 112 230 112 170 \"},\"-\":{\"x_min\":58.328125,\"x_max\":388.890625,\"ha\":449,\"o\":\"m 58 390 l 388 390 l 388 273 l 58 273 l 58 390 \"},\"Q\":{\"x_min\":51,\"x_max\":1074.609375,\"ha\":1119,\"o\":\"m 566 -14 q 194 113 338 -14 q 51 465 51 241 q 192 820 51 690 q 559 950 333 950 q 892 853 754 950 q 1047 654 1031 756 q 1065 525 1062 551 q 1068 462 1068 499 q 1065 405 1068 429 q 1050 305 1062 381 q 960 144 1038 229 q 748 6 881 59 l 930 -112 q 1004 -161 963 -136 q 1074 -200 1045 -186 q 1008 -228 1035 -214 q 951 -267 980 -243 q 876 -208 912 -234 q 803 -154 841 -182 l 606 -14 l 566 -14 m 202 468 q 290 163 202 283 q 559 43 379 43 q 826 163 738 43 q 915 468 915 284 q 825 770 915 651 q 559 889 735 889 q 348 826 429 889 q 225 638 267 763 q 202 468 202 552 \"},\"ς\":{\"x_min\":44,\"x_max\":613.453125,\"ha\":644,\"o\":\"m 305 -206 q 350 -218 325 -218 q 447 -177 407 -218 q 487 -79 487 -136 q 376 55 487 4 q 159 156 266 106 q 44 365 44 231 q 143 585 44 499 q 380 672 242 672 q 506 658 448 672 q 613 616 564 645 q 587 500 595 559 l 562 500 q 501 586 549 557 q 391 616 453 616 q 233 551 296 616 q 170 393 170 486 q 216 271 170 320 q 339 196 263 223 l 467 149 q 569 76 531 119 q 608 -27 608 34 q 522 -206 608 -136 q 321 -293 437 -276 l 305 -206 \"},\"M\":{\"x_min\":55,\"x_max\":1165,\"ha\":1238,\"o\":\"m 190 950 l 243 950 q 331 772 291 851 q 412 612 370 693 q 504 436 454 532 l 626 214 q 742 435 671 298 q 882 711 813 572 q 1001 950 952 850 l 1052 950 q 1082 649 1067 791 q 1118 341 1098 508 q 1165 0 1139 174 q 1121 8 1139 5 q 1088 11 1103 11 q 1049 6 1071 11 q 1008 0 1027 2 q 998 226 1008 109 q 974 461 989 343 q 944 695 959 579 l 748 312 q 610 0 665 152 l 594 1 l 576 0 q 227 685 402 364 l 188 307 q 172 128 175 179 q 168 0 168 77 q 138 4 157 1 q 110 6 118 6 q 81 4 93 6 q 55 0 68 2 q 121 333 89 168 q 171 652 152 498 q 190 950 190 805 \"},\"Ψ\":{\"x_min\":73,\"x_max\":995.609375,\"ha\":1071,\"o\":\"m 609 0 q 561 5 585 2 q 532 8 536 8 q 494 5 515 8 q 456 0 474 2 q 463 151 456 45 q 470 297 470 258 q 180 383 287 297 q 73 650 73 469 l 73 817 l 73 932 q 139 925 110 925 q 180 928 155 925 q 212 931 206 931 q 200 818 204 861 q 197 723 197 774 l 197 688 l 197 638 q 268 438 197 508 q 472 368 340 368 l 473 481 q 464 736 473 566 q 456 932 456 905 q 499 927 481 929 q 532 925 518 925 q 577 927 557 925 q 609 931 596 930 q 601 635 609 841 q 594 368 594 429 l 645 372 q 816 465 765 372 q 868 691 868 559 q 861 829 868 740 q 855 932 855 919 q 896 927 878 929 q 924 925 913 925 q 971 927 955 925 q 995 931 987 930 l 994 839 l 994 675 q 894 388 994 480 q 594 297 794 297 q 601 142 594 249 q 609 0 609 35 \"},\"C\":{\"x_min\":51,\"x_max\":881.5625,\"ha\":913,\"o\":\"m 828 737 q 552 889 733 889 q 295 768 383 889 q 207 469 207 647 q 299 177 207 305 q 551 50 391 50 q 710 86 637 50 q 855 189 783 122 l 870 183 q 858 122 862 147 q 855 69 855 97 q 521 -15 699 -15 q 180 116 309 -15 q 51 462 51 248 q 189 820 51 690 q 556 950 327 950 q 719 930 638 950 q 881 875 799 911 q 857 809 867 843 q 845 737 847 775 l 828 737 \"},\"œ\":{\"x_min\":39,\"x_max\":1195.9375,\"ha\":1226,\"o\":\"m 359 -15 q 125 76 212 -15 q 39 318 39 167 q 125 571 39 470 q 362 672 212 672 q 514 640 441 672 q 641 551 588 608 q 897 672 741 672 q 1110 593 1024 672 q 1195 390 1195 515 l 1193 331 q 1022 332 1108 331 q 851 334 935 333 l 708 331 q 765 124 708 206 q 944 42 822 42 q 1145 130 1068 42 l 1162 130 q 1155 85 1158 110 q 1151 47 1152 60 q 1036 0 1100 14 q 904 -15 973 -15 q 754 12 819 -15 q 641 106 689 40 q 514 14 584 44 q 359 -15 444 -15 m 376 625 q 224 534 270 625 q 179 328 179 443 q 224 124 179 215 q 369 34 269 34 q 521 127 470 34 q 573 328 573 221 q 526 534 573 443 q 376 625 480 625 m 1061 392 l 1061 423 q 1017 561 1061 504 q 894 618 973 618 q 756 549 805 618 q 708 390 708 480 l 1061 392 \"},\"!\":{\"x_min\":136,\"x_max\":312,\"ha\":449,\"o\":\"m 223 156 q 285 130 259 156 q 312 68 312 105 q 285 8 312 32 q 223 -15 259 -15 q 161 9 187 -15 q 136 68 136 33 q 160 130 136 105 q 223 156 185 156 m 150 752 l 144 841 q 161 919 144 888 q 223 950 178 950 q 282 925 260 950 q 304 863 304 901 q 299 808 304 845 q 295 752 295 770 l 246 250 q 223 250 238 250 q 199 250 206 250 l 150 752 \"},\"ç\":{\"x_min\":34,\"x_max\":614.5625,\"ha\":644,\"o\":\"m 607 119 l 592 41 q 490 -2 549 10 q 363 -15 431 -15 q 130 80 227 -15 q 34 313 34 175 q 132 576 34 480 q 397 672 231 672 q 511 659 456 672 q 614 617 565 647 q 597 558 604 587 q 584 492 589 528 l 570 492 q 507 587 547 553 q 406 622 467 622 q 234 534 293 622 q 176 329 176 447 q 238 126 176 211 q 414 42 300 42 q 592 124 521 42 l 607 119 m 202 -212 q 350 -246 273 -246 q 414 -232 388 -246 q 440 -186 440 -219 q 421 -142 440 -158 q 373 -126 402 -126 l 323 -126 l 323 0 l 367 0 l 367 -77 l 404 -73 q 495 -102 457 -73 q 533 -183 533 -132 q 494 -270 533 -237 q 402 -303 456 -303 q 286 -294 335 -303 q 184 -261 238 -286 l 202 -212 \"},\"{\":{\"x_min\":116,\"x_max\":567.390625,\"ha\":683,\"o\":\"m 491 909 q 421 874 445 909 q 397 792 397 839 l 397 744 l 397 583 q 368 434 397 493 q 263 354 339 376 q 367 272 338 332 q 397 125 397 212 l 397 -35 q 414 -149 397 -108 q 471 -197 431 -191 q 529 -204 511 -204 q 567 -204 548 -204 l 567 -276 q 387 -239 459 -276 q 315 -105 315 -203 l 315 -28 l 315 132 q 296 244 315 194 q 240 303 277 294 q 176 314 204 312 q 116 317 148 317 l 116 389 q 270 429 225 389 q 315 576 315 469 l 315 737 q 348 918 315 870 q 450 977 381 966 q 567 983 503 983 l 567 912 l 491 909 \"},\"X\":{\"x_min\":0,\"x_max\":739,\"ha\":739,\"o\":\"m 200 285 l 318 456 q 18 932 159 718 q 63 929 33 932 q 109 926 94 926 q 168 929 147 926 q 198 932 188 932 q 296 743 244 841 q 391 568 348 644 l 489 726 q 597 932 548 825 q 627 927 614 929 q 661 926 641 926 q 693 929 671 926 q 728 932 715 932 q 616 781 673 862 q 524 652 558 700 l 427 512 q 523 347 480 419 q 614 197 566 275 q 739 0 662 119 q 686 3 719 0 q 647 6 652 6 q 595 4 618 6 q 558 0 572 1 q 459 197 512 97 q 353 398 405 298 l 265 249 q 174 96 193 130 q 127 0 155 62 q 89 3 113 0 q 62 6 65 6 q 26 4 43 6 q 0 0 9 1 l 200 285 \"},\"ô\":{\"x_min\":40,\"x_max\":712,\"ha\":753,\"o\":\"m 371 -15 q 131 79 223 -15 q 40 322 40 173 q 133 572 40 473 q 380 672 227 672 q 621 575 530 672 q 712 327 712 479 q 619 80 712 175 q 371 -15 527 -15 m 332 978 l 421 978 l 572 743 l 525 743 l 376 875 l 229 743 l 180 743 l 332 978 m 377 622 q 227 532 274 622 q 180 327 180 442 q 227 125 180 216 q 375 35 274 35 q 524 124 478 35 q 570 327 570 214 q 524 531 570 441 q 377 622 479 622 \"},\"#\":{\"x_min\":78,\"x_max\":972.4375,\"ha\":1050,\"o\":\"m 497 647 l 675 647 l 791 969 l 877 968 l 761 647 l 972 647 l 948 576 l 736 576 l 671 390 l 896 390 l 873 319 l 644 319 l 531 0 l 446 0 l 559 319 l 382 319 l 266 0 l 182 0 l 294 319 l 78 319 l 102 390 l 320 390 l 386 576 l 151 576 l 176 647 l 410 647 l 526 969 l 610 969 l 497 647 m 472 576 l 407 390 l 587 390 l 650 576 l 472 576 \"},\"ι\":{\"x_min\":96,\"x_max\":233.5,\"ha\":342,\"o\":\"m 104 333 l 104 521 q 103 567 104 545 q 96 655 102 589 q 141 648 130 648 q 165 647 151 647 q 233 654 196 647 q 224 555 226 599 q 223 437 223 511 l 223 406 q 228 194 223 337 q 233 0 233 51 q 201 3 216 1 q 165 5 185 5 q 127 3 148 5 q 96 0 107 1 q 100 165 96 51 q 104 333 104 279 \"},\"Ά\":{\"x_min\":12,\"x_max\":910.609375,\"ha\":896,\"o\":\"m 328 639 l 458 950 q 489 944 464 947 q 522 950 507 944 q 655 613 602 745 q 770 331 709 480 q 910 0 832 181 q 859 3 891 0 q 823 6 827 6 q 772 4 795 6 q 735 0 749 1 q 672 195 692 135 q 613 353 652 255 l 449 358 l 285 353 l 233 205 q 173 0 194 94 l 116 5 q 76 2 91 5 q 55 0 62 0 q 146 211 101 105 q 229 404 192 317 q 328 639 266 490 m 195 943 q 228 974 213 964 q 265 985 244 985 q 302 969 287 985 q 318 932 318 954 q 303 896 318 911 q 261 866 288 882 l 61 743 l 12 743 l 195 943 m 450 419 l 585 425 l 451 761 l 318 425 l 450 419 \"},\")\":{\"x_min\":65.671875,\"x_max\":332,\"ha\":449,\"o\":\"m 332 376 q 271 81 332 217 q 96 -183 211 -54 q 65 -151 83 -164 q 193 104 155 -16 q 232 386 232 226 q 191 661 232 533 q 65 918 150 789 q 96 950 87 933 q 273 681 215 816 q 332 376 332 545 \"},\"ε\":{\"x_min\":53,\"x_max\":567,\"ha\":628,\"o\":\"m 506 516 q 433 591 467 566 q 353 616 400 616 q 261 580 298 616 q 225 492 225 545 q 268 406 225 437 q 372 375 311 375 l 418 375 l 417 349 l 417 310 l 343 317 q 236 282 280 317 q 193 183 193 247 q 238 77 193 117 q 352 38 284 38 q 460 66 410 38 q 543 144 510 94 q 553 99 547 121 q 567 54 558 76 q 452 2 515 19 q 321 -15 388 -15 q 134 31 216 -15 q 53 175 53 78 q 95 286 53 246 q 214 355 137 326 q 127 408 162 370 q 93 497 93 445 q 165 625 93 579 q 323 672 237 672 q 430 654 378 672 q 541 604 481 637 q 522 564 529 584 q 506 516 514 545 \"},\"Δ\":{\"x_min\":0,\"x_max\":899,\"ha\":899,\"o\":\"m 899 0 q 701 5 833 0 q 501 11 569 11 q 251 5 418 11 q 0 0 84 0 q 225 473 126 251 q 407 932 323 696 q 432 929 415 932 q 457 926 448 926 q 482 927 471 926 q 505 932 493 929 q 691 449 601 664 q 899 0 782 234 m 281 429 q 158 90 212 259 q 290 84 201 90 q 423 79 379 79 l 456 79 q 587 81 550 79 q 692 90 625 83 l 651 188 l 576 383 l 422 778 l 281 429 \"},\"â\":{\"x_min\":43,\"x_max\":655.5,\"ha\":649,\"o\":\"m 234 -15 q 98 33 153 -15 q 43 162 43 82 q 106 303 43 273 q 303 364 169 333 q 444 448 437 395 q 403 568 444 521 q 288 616 362 616 q 191 587 233 616 q 124 507 149 559 l 95 520 l 104 591 q 202 651 144 631 q 323 672 261 672 q 500 622 444 672 q 557 455 557 573 l 557 133 q 567 69 557 84 q 618 54 577 54 q 655 58 643 54 l 655 26 q 594 5 626 14 q 537 -6 562 -3 q 438 85 453 -6 q 342 10 388 35 q 234 -15 296 -15 m 279 978 l 368 978 l 522 743 l 471 743 l 323 875 l 176 743 l 126 743 l 279 978 m 176 186 q 204 98 176 133 q 284 64 232 64 q 390 107 342 64 q 438 212 438 151 l 438 345 q 239 293 303 319 q 176 186 176 268 \"},\"}\":{\"x_min\":114,\"x_max\":567,\"ha\":683,\"o\":\"m 369 576 q 405 438 369 487 q 527 389 441 389 l 567 389 l 567 317 q 415 278 461 317 q 369 132 369 239 l 369 -28 q 319 -229 369 -182 q 114 -276 270 -276 l 114 -204 q 252 -172 218 -204 q 286 -83 286 -141 l 286 -35 l 286 125 q 314 271 286 212 q 418 354 342 329 q 311 435 337 382 q 286 584 286 488 l 286 745 q 268 860 286 818 q 191 913 251 903 l 114 913 l 114 983 l 186 982 q 287 960 242 982 q 346 900 331 938 q 365 822 362 862 q 369 737 369 783 l 369 576 \"},\"‰\":{\"x_min\":28,\"x_max\":1511,\"ha\":1536,\"o\":\"m 799 0 q 647 62 708 0 q 586 218 586 124 q 647 372 586 309 q 799 436 709 436 q 949 373 888 436 q 1011 223 1011 311 q 995 130 1011 176 q 918 35 972 70 q 799 0 865 0 m 1298 0 q 1146 62 1206 0 q 1087 218 1087 124 q 1148 372 1087 308 q 1299 436 1209 436 q 1449 373 1388 436 q 1511 223 1511 311 q 1494 130 1511 169 q 1418 34 1472 69 q 1298 0 1365 0 m 241 448 q 89 510 150 448 q 28 663 28 573 q 89 820 28 755 q 241 885 151 885 q 391 823 329 885 q 453 672 453 761 q 434 580 453 620 q 359 483 412 518 q 241 448 307 448 m 863 1015 l 227 -125 l 158 -125 l 793 1015 l 863 1015 m 897 260 q 872 353 897 310 q 798 397 847 397 q 718 340 737 397 q 700 202 700 283 q 719 86 700 133 q 798 40 738 40 q 866 73 840 40 q 892 149 892 106 q 895 206 894 169 q 897 260 897 242 m 339 684 q 319 797 339 750 q 244 845 300 845 q 161 784 182 845 q 141 645 141 723 q 165 540 141 590 q 237 490 189 490 q 303 524 278 490 q 334 598 329 558 q 339 684 339 638 m 1397 260 q 1373 356 1397 315 q 1297 397 1349 397 q 1218 340 1237 397 q 1200 202 1200 283 q 1219 87 1200 134 q 1297 40 1238 40 q 1366 73 1340 40 q 1392 149 1392 106 q 1395 206 1394 169 q 1397 260 1397 242 \"},\"Ä\":{\"x_min\":-16,\"x_max\":839.5625,\"ha\":826,\"o\":\"m 258 638 l 389 951 q 420 945 395 948 q 453 951 438 945 q 570 651 500 826 q 688 360 640 477 q 839 0 736 242 q 788 3 820 0 q 752 6 756 6 q 702 3 728 6 q 665 0 675 0 q 599 204 615 158 q 542 357 584 251 l 378 357 l 214 357 l 161 207 q 130 109 147 170 q 102 0 113 47 l 45 5 q 20 4 29 5 q -16 0 10 4 q 72 203 29 105 q 169 427 115 301 q 258 638 222 552 m 293 1208 q 345 1186 325 1208 q 366 1133 366 1164 q 345 1080 366 1102 q 293 1058 324 1058 q 239 1080 261 1058 q 217 1133 217 1102 q 239 1185 217 1163 q 293 1208 261 1208 m 535 1208 q 587 1186 565 1208 q 609 1133 609 1164 q 587 1080 609 1103 q 535 1058 565 1058 q 481 1080 503 1058 q 459 1133 459 1102 q 481 1185 459 1163 q 535 1208 503 1208 m 378 421 l 515 425 l 381 762 l 247 425 l 378 421 \"},\"a\":{\"x_min\":44,\"x_max\":653.734375,\"ha\":647,\"o\":\"m 233 -15 q 99 33 154 -15 q 44 162 44 82 q 105 302 44 273 q 302 363 167 331 q 444 448 437 395 q 401 567 444 519 q 287 615 359 615 q 190 587 231 615 q 124 508 149 560 l 95 519 l 103 591 q 204 651 148 631 q 323 672 260 672 q 499 623 443 672 q 555 457 555 574 l 555 132 q 566 70 555 86 q 616 55 578 55 l 653 55 l 653 26 q 594 4 624 15 q 536 -6 564 -6 q 468 15 492 -6 q 436 83 445 38 q 341 9 387 34 q 233 -15 294 -15 m 175 185 q 204 99 175 135 q 282 63 234 63 q 389 106 343 63 q 436 211 436 150 l 436 344 q 239 294 304 320 q 175 185 175 268 \"},\"—\":{\"x_min\":226.390625,\"x_max\":1138.890625,\"ha\":1367,\"o\":\"m 226 375 l 1138 375 l 1138 292 l 226 292 l 226 375 \"},\"=\":{\"x_min\":169.4375,\"x_max\":969.453125,\"ha\":1139,\"o\":\"m 969 499 l 169 499 l 169 564 l 969 564 l 969 499 m 969 248 l 169 248 l 169 315 l 969 315 l 969 248 \"},\"N\":{\"x_min\":98,\"x_max\":911.890625,\"ha\":1011,\"o\":\"m 112 230 q 114 486 112 315 q 117 741 117 656 l 117 950 l 166 950 q 326 766 239 865 q 468 606 413 667 q 610 451 524 544 l 821 227 l 821 604 q 816 765 821 685 q 803 931 812 845 l 855 927 l 911 931 q 901 831 906 884 q 897 741 897 779 q 894 413 897 619 q 892 165 892 207 l 892 -15 l 849 -15 q 730 125 796 50 q 589 281 664 201 l 193 702 l 193 330 q 212 -1 193 169 l 149 2 l 98 -1 q 108 125 105 79 q 112 230 112 170 \"},\"ρ\":{\"x_min\":65,\"x_max\":711,\"ha\":758,\"o\":\"m 191 -99 q 195 -235 191 -145 q 199 -371 199 -325 q 161 -367 169 -367 q 134 -366 153 -366 q 96 -368 116 -366 q 65 -372 76 -370 q 70 -190 65 -311 q 76 -8 76 -69 q 73 166 76 67 q 70 329 71 265 q 148 578 70 484 q 380 672 226 672 q 617 573 524 672 q 711 329 711 474 q 625 84 711 184 q 396 -15 539 -15 q 285 7 334 -15 q 191 78 236 30 l 191 -99 m 377 619 q 231 533 271 619 q 191 327 191 447 q 241 103 191 169 q 376 38 292 38 q 525 125 479 38 q 571 326 571 212 q 525 529 571 440 q 377 619 480 619 \"},\"2\":{\"x_min\":22,\"x_max\":622,\"ha\":749,\"o\":\"m 449 648 q 410 789 449 727 q 298 851 371 851 q 173 802 219 851 q 128 676 128 753 l 118 673 q 84 740 100 712 q 47 799 69 768 q 313 911 158 911 q 507 844 426 911 q 589 667 589 777 q 527 479 589 555 q 315 258 466 404 l 169 118 l 442 118 q 531 123 485 118 q 622 136 576 129 q 617 102 619 117 q 616 68 616 87 q 617 37 616 54 q 622 0 619 20 q 438 4 562 0 q 252 8 315 8 q 142 7 195 8 q 22 0 88 6 l 22 40 q 234 238 155 158 q 380 430 312 319 q 449 648 449 541 \"},\"ü\":{\"x_min\":90,\"x_max\":664,\"ha\":754,\"o\":\"m 653 498 q 653 329 653 443 q 653 158 653 215 q 664 0 653 82 q 631 3 647 1 q 598 5 616 5 q 563 3 583 5 q 533 0 544 1 l 538 118 q 440 18 494 52 q 312 -15 385 -15 q 148 50 201 -15 q 96 229 96 115 l 96 354 l 96 516 l 90 655 q 120 650 103 651 q 158 648 136 648 q 192 650 175 648 q 227 656 210 651 q 220 446 227 592 q 213 247 213 300 q 247 115 213 163 q 362 68 281 68 q 477 113 428 68 q 531 217 525 159 q 538 340 538 274 q 533 520 538 394 q 528 655 528 647 q 558 650 542 651 q 596 648 574 648 q 629 650 612 648 q 663 656 646 651 q 653 498 653 574 m 253 929 q 307 906 285 929 q 330 854 330 884 q 309 800 330 822 q 257 778 288 778 q 202 800 225 778 q 180 854 180 823 q 200 906 180 884 q 253 929 221 929 m 498 929 q 549 906 527 929 q 572 854 572 884 q 551 799 572 820 q 499 778 531 778 q 444 800 466 778 q 422 854 422 822 q 444 906 422 884 q 498 929 466 929 \"},\"Z\":{\"x_min\":6.9375,\"x_max\":801.390625,\"ha\":828,\"o\":\"m 6 36 q 222 324 112 176 q 425 605 333 473 l 597 857 l 433 857 q 59 836 247 857 l 65 883 l 59 932 q 262 927 134 932 q 427 922 390 922 q 622 927 491 922 q 801 932 754 932 l 801 904 q 594 629 709 785 q 399 361 479 473 q 201 77 319 249 l 427 77 q 581 82 520 77 q 801 103 643 87 l 797 68 l 795 54 l 797 34 l 801 0 q 504 4 683 0 q 325 8 326 8 q 166 4 272 8 q 6 0 61 0 l 6 36 \"},\"u\":{\"x_min\":90,\"x_max\":662.21875,\"ha\":754,\"o\":\"m 653 497 l 653 156 q 654 83 653 122 q 661 -1 656 44 q 623 3 632 2 q 596 4 615 4 q 572 3 581 4 q 533 -1 563 2 l 536 117 q 439 18 491 51 q 313 -15 386 -15 q 147 48 199 -15 q 96 227 96 112 l 96 352 l 96 516 l 90 654 q 158 647 125 647 q 189 648 178 647 q 226 654 200 650 q 220 450 226 586 q 215 246 215 314 q 248 114 215 163 q 361 66 281 66 q 473 112 426 66 q 527 225 520 158 q 536 340 536 282 q 531 497 536 393 q 527 654 527 601 q 572 647 563 647 q 595 647 581 647 q 626 648 616 647 q 662 654 637 650 l 653 497 \"},\"k\":{\"x_min\":97,\"x_max\":677.5625,\"ha\":683,\"o\":\"m 104 656 q 100 873 104 741 q 97 1025 97 1005 q 164 1018 134 1018 q 231 1025 196 1018 q 227 825 231 962 q 223 622 223 687 l 223 377 l 245 377 q 507 654 391 506 q 563 647 538 647 q 616 647 589 647 q 648 652 638 651 l 349 398 l 548 165 q 608 93 577 127 q 677 19 638 59 l 677 0 q 628 3 659 0 q 591 6 597 6 q 544 3 567 6 q 510 0 520 0 q 438 101 473 54 q 360 197 402 148 l 269 308 l 252 324 l 223 326 q 227 164 223 272 q 231 0 231 55 q 200 4 215 2 q 164 5 185 5 q 127 3 146 5 q 97 0 108 1 q 100 386 97 151 q 104 656 104 620 \"},\"Η\":{\"x_min\":109,\"x_max\":928.453125,\"ha\":1039,\"o\":\"m 257 317 q 262 142 257 253 q 267 0 267 30 q 226 3 253 0 q 188 8 200 8 q 147 3 174 8 q 109 0 121 0 q 116 243 109 72 q 124 465 124 415 q 116 710 124 540 q 109 932 109 880 q 152 929 121 932 q 188 926 183 926 q 231 929 200 926 q 267 932 262 932 q 262 719 267 854 q 257 547 257 584 q 406 544 301 547 q 517 541 511 541 q 666 544 562 541 q 777 547 770 547 q 773 786 777 641 q 769 932 769 930 q 813 929 781 932 q 849 926 845 926 q 893 929 861 926 q 928 932 924 932 q 914 795 920 866 q 909 659 909 723 l 909 505 q 918 252 909 420 q 927 0 927 84 q 887 4 913 0 q 848 8 861 8 q 811 5 829 8 q 769 0 793 2 q 773 103 769 41 q 777 176 777 166 l 777 317 l 777 465 q 604 466 692 465 q 430 469 517 467 l 257 465 l 257 317 \"},\"Α\":{\"x_min\":-15.28125,\"x_max\":838.890625,\"ha\":825,\"o\":\"m 257 639 l 387 950 q 402 945 395 947 q 417 944 409 944 q 452 950 437 944 q 576 629 536 733 q 686 359 617 526 q 838 0 755 192 q 789 3 820 0 q 751 6 758 6 q 700 4 723 6 q 663 0 677 1 q 600 199 622 137 q 543 353 579 260 l 377 358 l 215 353 l 162 205 q 130 110 145 160 q 101 0 115 59 l 44 5 q 6 2 20 5 q -15 0 -8 0 q 76 211 30 105 q 158 404 121 318 q 257 639 195 490 m 378 419 l 513 425 l 379 761 l 246 425 l 378 419 \"},\"ß\":{\"x_min\":94,\"x_max\":726,\"ha\":765,\"o\":\"m 107 431 l 107 611 l 107 761 q 200 948 118 872 q 395 1025 283 1025 q 543 979 478 1025 q 608 852 608 933 q 530 709 608 783 q 453 586 453 636 q 589 457 453 547 q 726 259 726 368 q 648 64 726 143 q 453 -15 570 -15 q 379 -6 418 -15 q 309 15 339 1 l 334 128 l 348 127 q 405 70 368 91 q 485 49 442 49 q 583 92 544 49 q 622 193 622 135 q 484 365 622 280 q 347 525 347 450 q 433 667 347 561 q 520 838 520 773 q 483 939 520 899 q 386 979 446 979 q 269 924 313 979 q 226 795 226 870 l 226 629 l 226 344 q 229 141 226 265 q 233 1 233 18 q 196 4 219 1 q 166 8 173 8 q 123 5 142 8 q 94 1 105 2 q 100 250 94 91 q 107 431 107 409 \"},\"é\":{\"x_min\":40,\"x_max\":646.9375,\"ha\":681,\"o\":\"m 406 42 q 602 130 523 42 l 621 130 q 613 93 617 112 q 609 47 609 73 q 496 0 558 14 q 369 -15 435 -15 q 130 73 220 -15 q 40 311 40 162 q 126 562 40 456 q 355 669 212 669 q 564 590 481 669 q 646 386 646 512 l 644 331 q 438 333 562 331 q 313 335 315 335 l 179 331 q 235 127 179 212 q 406 42 291 42 m 406 945 q 440 976 424 966 q 477 986 455 986 q 528 934 528 986 q 513 895 528 912 q 471 866 498 879 l 272 743 l 222 743 l 406 945 m 513 392 l 513 437 q 470 563 513 509 q 356 618 427 618 q 233 552 271 618 q 183 390 195 487 l 513 392 \"},\"s\":{\"x_min\":68,\"x_max\":531,\"ha\":593,\"o\":\"m 117 161 q 172 69 130 102 q 276 36 214 36 q 378 67 333 36 q 424 152 424 98 q 334 260 424 224 q 168 320 251 290 q 79 460 79 366 q 147 612 79 552 q 310 672 216 672 q 400 660 355 672 q 500 627 446 649 l 461 508 l 448 508 q 401 587 433 561 q 314 614 369 614 q 223 584 262 614 q 185 505 185 555 q 358 375 185 427 q 531 197 531 322 q 450 39 531 93 q 259 -15 369 -15 q 68 23 162 -15 l 103 161 l 117 161 \"},\"B\":{\"x_min\":109,\"x_max\":751,\"ha\":801,\"o\":\"m 127 559 q 109 931 127 759 l 203 929 q 338 932 244 929 q 438 935 432 935 q 629 883 549 935 q 709 726 709 832 q 638 579 709 633 q 464 504 567 524 q 673 438 595 490 q 751 268 751 387 q 639 66 751 133 q 382 0 528 0 l 232 6 q 162 3 211 6 q 109 0 113 0 q 118 287 109 86 q 127 559 127 488 m 256 257 l 256 149 l 261 61 l 337 57 q 526 108 450 57 q 602 266 602 159 q 523 428 602 386 q 312 471 444 471 l 256 471 l 256 257 m 569 706 q 507 834 569 788 q 361 879 446 879 l 261 875 q 252 709 252 798 l 252 522 q 476 558 384 522 q 569 706 569 595 \"},\"…\":{\"x_min\":119,\"x_max\":1005,\"ha\":1160,\"o\":\"m 191 130 q 244 108 223 130 q 266 55 266 87 q 244 5 266 25 q 191 -15 223 -15 q 139 4 160 -15 q 119 55 119 23 q 139 108 119 87 q 191 130 159 130 m 560 130 q 612 108 591 130 q 634 55 634 87 q 612 5 634 25 q 560 -15 591 -15 q 507 4 528 -15 q 487 55 487 23 q 507 109 487 88 q 560 130 528 130 m 930 130 q 983 108 962 130 q 1005 55 1005 87 q 983 5 1005 25 q 930 -15 962 -15 q 878 4 899 -15 q 858 55 858 23 q 878 108 858 87 q 930 130 898 130 \"},\"?\":{\"x_min\":128,\"x_max\":520,\"ha\":601,\"o\":\"m 307 156 q 367 130 342 156 q 392 68 392 105 q 367 7 392 30 q 307 -15 343 -15 q 244 8 269 -15 q 220 68 220 32 q 244 130 220 105 q 307 156 269 156 m 329 250 q 214 290 261 250 q 168 399 168 331 q 287 595 168 479 q 406 776 406 712 q 371 858 406 823 q 292 894 337 894 q 207 867 243 894 q 162 794 171 840 l 150 794 q 142 835 146 822 q 128 894 139 849 q 210 936 165 922 q 305 950 255 950 q 457 893 394 950 q 520 748 520 837 q 398 550 520 657 q 276 370 276 443 q 293 316 276 337 q 343 296 310 296 q 397 302 372 296 l 383 256 q 357 251 365 252 q 329 250 348 250 \"},\"H\":{\"x_min\":108,\"x_max\":927.453125,\"ha\":1036,\"o\":\"m 258 318 q 263 143 258 255 q 268 0 268 30 q 229 3 255 0 q 188 8 202 8 q 148 3 174 8 q 108 0 121 0 q 117 239 108 70 q 126 465 126 408 q 122 711 126 620 q 108 932 119 803 q 153 928 124 932 q 188 925 183 925 q 231 928 204 925 q 268 932 259 932 q 263 719 268 854 q 258 547 258 584 l 517 543 l 777 547 q 773 786 777 641 q 769 932 769 930 q 814 928 785 932 q 848 925 842 925 q 894 928 864 925 q 927 932 923 932 q 914 798 919 868 q 909 659 909 729 l 909 448 l 909 283 q 916 135 909 238 q 924 0 924 31 q 885 4 911 0 q 846 8 860 8 q 807 4 832 8 q 769 0 781 0 q 773 101 769 37 q 777 177 777 164 l 777 318 l 777 468 q 604 468 720 468 q 431 468 489 468 l 258 468 l 258 318 \"},\"ν\":{\"x_min\":0,\"x_max\":632,\"ha\":654,\"o\":\"m 319 8 q 296 5 309 8 q 272 0 283 2 q 200 206 234 120 q 0 654 165 291 q 84 647 45 647 q 113 647 98 647 q 168 654 127 648 q 252 402 204 529 l 360 131 q 469 358 440 267 q 499 520 499 448 q 492 579 499 543 q 477 641 486 615 q 552 649 527 645 q 613 661 576 652 q 628 611 625 623 q 632 576 632 598 q 621 501 632 536 q 560 373 611 466 q 461 190 509 280 q 372 0 412 99 q 345 3 363 0 q 319 8 327 8 \"},\"î\":{\"x_min\":-25,\"x_max\":365.328125,\"ha\":340,\"o\":\"m 104 144 l 104 522 l 97 655 q 138 650 113 651 q 167 649 162 649 q 233 655 206 649 q 225 506 225 581 q 229 254 225 423 q 233 0 233 84 q 201 3 216 1 q 164 5 186 5 q 127 3 146 5 q 97 0 108 1 l 104 144 m 125 978 l 214 978 l 365 743 l 319 743 l 170 875 l 24 743 l -25 743 l 125 978 \"},\"c\":{\"x_min\":36,\"x_max\":613.78125,\"ha\":644,\"o\":\"m 606 119 l 594 41 q 493 -3 548 7 q 365 -15 438 -15 q 131 79 227 -15 q 36 312 36 173 q 134 576 36 480 q 399 672 233 672 q 513 658 459 672 q 613 616 566 645 q 586 492 597 563 l 571 492 q 510 586 550 553 q 406 619 470 619 q 235 532 294 619 q 176 327 176 445 q 237 125 176 209 q 415 42 299 42 q 594 122 520 42 l 606 119 \"},\"¶\":{\"x_min\":18,\"x_max\":531,\"ha\":590,\"o\":\"m 298 968 l 531 968 l 531 910 l 473 910 l 473 4 l 415 4 l 415 910 l 305 910 l 305 4 l 247 4 l 247 558 q 99 602 163 558 q 27 690 36 645 q 18 744 18 734 q 90 896 18 824 q 298 968 163 968 \"},\"β\":{\"x_min\":96,\"x_max\":737.671875,\"ha\":779,\"o\":\"m 160 -365 q 129 -367 151 -365 q 96 -369 107 -369 q 100 -253 96 -325 q 104 -169 104 -182 l 104 101 l 104 565 q 168 898 104 771 q 419 1025 232 1025 q 605 960 525 1025 q 686 787 686 895 q 641 641 686 705 q 522 548 597 577 q 682 454 626 515 q 737 290 737 394 q 648 73 737 162 q 431 -15 559 -15 q 324 3 372 -15 q 226 61 276 22 q 224 -44 226 19 q 223 -110 223 -107 l 230 -369 q 193 -367 220 -369 q 160 -365 166 -365 m 356 564 q 507 618 458 564 q 557 779 557 673 q 520 917 557 859 q 407 975 483 975 q 279 906 323 975 q 234 752 234 838 q 232 613 234 701 q 230 506 230 524 l 226 355 l 230 230 q 275 94 230 147 q 406 41 321 41 q 552 116 504 41 q 600 297 600 192 q 550 443 600 386 q 412 499 500 499 q 361 497 384 499 q 327 493 337 494 l 329 516 l 329 565 l 356 564 \"},\"Μ\":{\"x_min\":55,\"x_max\":1165,\"ha\":1238,\"o\":\"m 190 950 l 243 950 q 331 772 291 851 q 412 612 370 693 q 504 436 454 532 l 626 214 q 742 435 671 298 q 882 711 813 572 q 1001 950 952 850 l 1052 950 q 1082 649 1067 791 q 1118 341 1098 508 q 1165 0 1139 174 q 1121 8 1139 5 q 1088 11 1103 11 q 1049 6 1071 11 q 1008 0 1027 2 q 998 226 1008 109 q 974 461 989 343 q 944 695 959 579 l 748 312 q 610 0 665 152 l 594 1 l 576 0 q 227 685 402 364 l 188 307 q 172 128 175 179 q 168 0 168 77 q 138 4 157 1 q 110 6 118 6 q 81 4 93 6 q 55 0 68 2 q 121 333 89 168 q 171 652 152 498 q 190 950 190 805 \"},\"Ό\":{\"x_min\":-1,\"x_max\":1305,\"ha\":1356,\"o\":\"m 288 465 q 429 820 288 690 q 796 950 570 950 q 1129 853 991 950 q 1284 654 1268 757 q 1302 525 1299 551 q 1305 462 1305 500 q 1302 402 1305 426 q 1284 277 1299 379 q 1131 80 1268 175 q 797 -15 993 -15 q 684 -10 733 -15 q 541 29 635 -5 q 367 186 447 64 q 288 465 288 308 m 182 943 q 215 974 200 964 q 251 985 230 985 q 289 969 274 985 q 304 932 304 954 q 290 896 304 911 q 247 866 275 882 l 48 743 l -1 743 l 182 943 m 439 468 q 527 162 439 282 q 796 42 616 42 q 1063 162 975 42 q 1152 468 1152 283 q 1062 770 1152 651 q 796 889 972 889 q 585 826 666 889 q 462 639 504 764 q 439 468 439 552 \"},\"Ή\":{\"x_min\":-1.390625,\"x_max\":1233.046875,\"ha\":1341,\"o\":\"m 564 316 q 569 142 564 254 q 574 0 574 30 q 535 4 561 0 q 494 8 508 8 q 454 4 480 8 q 414 0 427 0 q 423 239 414 70 q 432 465 432 408 q 428 711 432 620 q 414 931 425 802 q 459 928 430 931 q 494 924 489 924 q 537 928 510 924 q 574 931 565 931 q 569 719 574 854 q 564 547 564 584 l 823 543 l 1083 547 q 1078 786 1083 641 q 1074 931 1074 930 q 1119 928 1091 931 q 1153 924 1148 924 q 1199 928 1170 924 q 1233 931 1228 931 q 1221 798 1226 868 q 1217 659 1217 729 l 1215 448 l 1217 283 q 1225 135 1217 238 q 1233 0 1233 31 q 1194 4 1220 0 q 1154 8 1167 8 q 1113 4 1140 8 q 1075 0 1087 0 q 1078 100 1075 37 q 1082 176 1082 163 l 1083 316 l 1083 465 q 910 466 1026 465 q 737 468 795 468 l 564 465 l 564 316 m 181 943 q 215 974 200 964 q 251 985 230 985 q 288 969 273 985 q 304 932 304 954 q 289 896 304 911 q 247 866 275 882 l 47 743 l -1 743 l 181 943 \"},\"•\":{\"x_min\":204.171875,\"x_max\":795.828125,\"ha\":1003,\"o\":\"m 501 789 q 709 702 622 789 q 795 493 795 615 q 709 286 795 372 q 501 201 623 201 q 290 286 377 201 q 204 493 204 371 q 226 605 204 550 q 312 725 248 661 q 501 789 376 789 \"},\"¥\":{\"x_min\":32,\"x_max\":699,\"ha\":750,\"o\":\"m 313 278 q 176 273 268 278 q 50 268 83 268 l 50 335 q 147 332 82 335 q 246 329 213 329 l 313 329 l 313 436 l 176 436 l 50 432 l 50 495 q 182 492 90 495 q 281 490 275 490 l 126 743 l 32 888 l 91 883 l 191 887 q 225 814 208 845 q 287 699 241 783 l 397 512 q 477 653 433 570 q 592 887 521 736 l 643 883 l 699 887 l 625 773 l 554 655 l 454 490 q 593 492 496 490 q 697 495 690 495 l 697 431 l 434 436 l 434 330 l 572 329 q 636 332 595 329 q 697 335 678 335 l 697 268 l 568 278 l 434 278 q 434 143 434 208 q 442 0 435 77 l 365 5 l 299 0 q 310 131 307 54 q 313 278 313 208 \"},\"(\":{\"x_min\":114,\"x_max\":380.5625,\"ha\":449,\"o\":\"m 114 388 q 175 684 114 545 q 351 950 237 822 q 380 918 361 933 q 253 660 291 782 q 215 379 215 538 q 256 103 215 231 q 380 -151 297 -25 q 351 -183 361 -167 q 173 84 232 -50 q 114 388 114 219 \"},\"U\":{\"x_min\":101,\"x_max\":919.0625,\"ha\":1015,\"o\":\"m 181 926 q 228 929 195 926 q 263 932 262 932 q 251 804 255 853 q 248 697 248 755 l 248 457 q 315 134 248 212 q 515 57 382 57 q 733 129 654 57 q 813 334 813 201 l 813 458 l 813 655 q 810 797 813 733 q 798 931 807 862 q 827 927 813 929 q 859 926 841 926 q 888 929 868 926 q 919 932 907 932 q 905 779 909 853 q 902 600 902 705 l 902 366 q 793 81 902 178 q 492 -15 685 -15 q 211 66 307 -15 q 116 323 116 147 l 116 425 l 116 698 q 109 826 116 759 q 101 931 103 893 q 138 927 120 929 q 181 926 156 926 \"},\"γ\":{\"x_min\":-12,\"x_max\":701,\"ha\":681,\"o\":\"m 642 647 q 701 654 669 647 q 593 440 633 520 q 502 247 553 359 l 411 48 l 411 -90 q 415 -238 411 -138 q 419 -372 419 -337 l 372 -366 q 282 -372 325 -366 q 287 -195 282 -313 q 292 -33 292 -76 q 260 192 292 47 q 170 460 229 338 q 39 583 111 583 l -12 579 l -10 608 l -12 638 q 43 662 14 653 q 101 672 71 672 q 279 554 234 672 q 398 143 324 437 q 496 393 439 244 q 590 654 553 541 q 615 648 607 650 q 642 647 623 647 \"},\"α\":{\"x_min\":41,\"x_max\":827.109375,\"ha\":846,\"o\":\"m 705 352 q 803 -1 763 155 l 739 1 l 673 -1 l 632 172 q 521 36 593 87 q 356 -15 448 -15 q 129 81 217 -15 q 41 316 41 177 q 130 569 41 467 q 368 672 220 672 q 537 622 464 672 q 659 486 610 573 q 711 654 691 569 l 770 650 l 827 654 q 763 505 792 576 q 705 352 734 434 m 377 619 q 226 530 272 619 q 181 326 181 442 q 223 124 181 214 q 367 34 265 34 q 528 137 480 34 q 601 323 577 240 q 527 531 578 444 q 377 619 475 619 \"},\"F\":{\"x_min\":108,\"x_max\":613.5625,\"ha\":671,\"o\":\"m 258 316 q 263 142 258 254 q 268 0 268 30 q 229 3 255 0 q 188 8 202 8 q 148 3 174 8 q 108 0 121 0 q 117 239 108 70 q 126 465 126 408 q 122 711 126 620 q 108 932 119 802 l 358 928 l 613 931 l 610 886 l 613 836 q 505 855 549 851 q 388 860 460 860 l 260 860 l 258 671 l 258 528 l 398 528 q 587 541 480 528 l 584 497 l 587 451 l 394 463 l 258 463 l 258 316 \"},\"­\":{\"x_min\":0,\"x_max\":683.328125,\"ha\":683,\"o\":\"m 0 374 l 683 374 l 683 289 l 0 289 l 0 374 \"},\":\":{\"x_min\":134,\"x_max\":309,\"ha\":446,\"o\":\"m 222 636 q 284 611 259 636 q 309 548 309 586 q 284 486 309 512 q 222 461 260 461 q 160 486 186 461 q 134 548 134 511 q 159 610 134 584 q 222 636 185 636 m 221 156 q 283 131 257 156 q 309 69 309 107 q 284 8 309 32 q 221 -15 259 -15 q 159 9 185 -15 q 134 69 134 33 q 159 131 134 107 q 221 156 185 156 \"},\"Χ\":{\"x_min\":0,\"x_max\":739,\"ha\":739,\"o\":\"m 200 285 l 318 456 q 18 932 159 718 q 63 929 33 932 q 109 926 94 926 q 168 929 147 926 q 198 932 188 932 q 296 743 244 841 q 391 568 348 644 l 489 726 q 597 932 548 825 q 627 927 614 929 q 661 926 641 926 q 693 929 671 926 q 728 932 715 932 q 616 781 673 862 q 524 652 558 700 l 427 512 q 523 347 480 419 q 614 197 566 275 q 739 0 662 119 q 686 3 719 0 q 647 6 652 6 q 595 4 618 6 q 558 0 572 1 q 459 197 512 97 q 353 398 405 298 l 265 249 q 174 96 193 130 q 127 0 155 62 q 89 3 113 0 q 62 6 65 6 q 26 4 43 6 q 0 0 9 1 l 200 285 \"},\"*\":{\"x_min\":94,\"x_max\":580,\"ha\":675,\"o\":\"m 336 940 q 367 944 349 940 q 389 948 385 948 q 368 850 375 902 q 362 747 362 799 q 522 873 442 800 q 548 812 539 829 q 580 778 556 796 q 386 702 485 750 q 476 661 427 680 q 575 629 524 643 q 521 535 539 587 q 441 604 478 573 q 362 661 403 634 q 369 564 362 615 q 391 459 377 513 q 360 463 379 459 q 336 467 340 467 q 306 463 325 467 q 282 459 288 459 q 304 568 296 522 q 313 661 313 615 q 152 535 221 602 q 128 589 138 569 q 97 630 117 608 q 185 661 140 643 q 287 704 231 679 q 189 746 234 728 q 94 777 145 763 q 125 818 113 795 q 150 873 137 841 q 227 805 184 839 q 313 747 269 771 q 309 810 313 784 q 282 950 305 836 q 310 942 297 945 q 336 940 324 940 \"},\"°\":{\"x_min\":176,\"x_max\":508,\"ha\":683,\"o\":\"m 176 889 q 228 1010 176 961 q 355 1060 280 1060 q 460 1011 413 1060 q 508 904 508 962 q 455 785 508 839 q 337 731 402 731 q 222 776 269 731 q 176 889 176 821 m 241 880 q 266 805 241 836 q 336 775 292 775 q 413 811 386 775 q 441 899 441 847 q 417 985 441 952 q 343 1018 393 1018 q 281 995 307 1018 q 247 940 254 973 q 241 880 241 906 \"},\"V\":{\"x_min\":0,\"x_max\":852.78125,\"ha\":853,\"o\":\"m 190 477 l 74 759 l 0 932 l 83 926 q 134 929 98 926 q 173 931 170 931 q 206 829 187 884 q 248 704 224 773 l 308 548 l 454 153 l 586 502 q 729 931 666 713 l 790 927 l 852 931 q 643 467 748 720 q 470 0 538 215 q 445 4 457 1 q 418 6 432 6 q 384 3 399 6 q 366 0 368 0 q 279 256 331 123 q 190 477 226 389 \"},\"Ξ\":{\"x_min\":58.328125,\"x_max\":818.0625,\"ha\":878,\"o\":\"m 437 821 q 258 817 377 821 q 77 813 138 813 q 84 851 83 838 q 84 872 84 864 q 77 932 84 900 q 256 928 137 932 q 437 924 376 924 q 618 928 497 924 q 797 932 738 932 l 791 872 q 794 842 791 861 q 797 813 797 822 q 619 817 738 813 q 437 821 500 821 m 470 430 q 335 425 440 430 q 183 421 230 421 q 187 456 186 433 q 188 481 188 480 q 183 543 188 515 q 304 538 215 543 q 437 533 394 533 q 572 538 481 533 q 694 543 662 543 l 687 482 l 694 421 q 572 425 650 421 q 470 430 494 430 m 437 8 q 250 4 376 8 q 58 0 123 0 l 63 63 l 58 129 q 268 124 134 129 q 437 119 401 119 q 636 124 502 119 q 818 129 769 129 l 813 63 l 818 0 q 627 4 754 0 q 437 8 501 8 \"},\" \":{\"x_min\":0,\"x_max\":0,\"ha\":375},\"Ϋ\":{\"x_min\":-26,\"x_max\":746,\"ha\":708,\"o\":\"m 299 177 l 299 387 q 190 577 235 501 q 87 747 146 652 q -26 931 29 841 q 23 929 -13 931 q 65 926 61 926 q 110 929 78 926 q 146 931 143 931 q 208 800 175 866 q 278 676 241 734 l 391 475 q 627 931 519 693 l 683 927 q 721 929 701 927 q 746 931 741 931 q 652 786 702 866 q 557 627 602 705 l 432 415 l 432 241 q 435 97 432 184 q 439 0 439 10 q 395 4 414 2 q 361 6 376 6 q 320 4 336 6 q 286 0 304 2 q 294 88 290 36 q 299 177 299 141 m 233 1208 q 286 1187 265 1208 q 307 1133 307 1166 q 285 1080 307 1103 q 233 1058 263 1058 q 179 1080 202 1058 q 157 1133 157 1103 q 179 1186 157 1164 q 233 1208 202 1208 m 475 1208 q 528 1186 506 1208 q 550 1133 550 1164 q 528 1080 550 1103 q 475 1058 506 1058 q 422 1080 444 1058 q 400 1133 400 1102 q 421 1186 400 1164 q 475 1208 443 1208 \"},\"0\":{\"x_min\":48,\"x_max\":699,\"ha\":749,\"o\":\"m 372 909 q 621 773 544 909 q 699 451 699 637 q 627 116 699 252 q 372 -19 556 -19 q 120 114 193 -19 q 48 444 48 247 q 120 774 48 639 q 372 909 193 909 m 187 365 q 226 137 187 238 q 373 37 266 37 q 457 62 421 37 q 519 142 494 88 q 552 271 545 196 q 559 455 559 346 q 526 736 559 622 q 371 851 493 851 q 245 783 280 851 q 198 647 210 716 q 187 444 187 577 l 187 365 \"},\"”\":{\"x_min\":104.171875,\"x_max\":570.828125,\"ha\":625,\"o\":\"m 184 858 q 211 924 193 898 q 265 951 230 951 q 320 903 316 951 q 310 856 320 881 q 283 812 300 831 l 136 568 l 104 576 l 184 858 m 433 858 q 468 928 452 905 q 516 951 483 951 q 555 938 540 951 q 570 903 570 926 q 561 859 570 881 q 536 812 552 837 l 387 568 l 355 576 l 433 858 \"},\"@\":{\"x_min\":78,\"x_max\":1289,\"ha\":1367,\"o\":\"m 906 640 l 970 640 l 876 266 l 864 203 q 886 157 864 172 q 940 142 908 142 q 1136 262 1062 142 q 1211 513 1211 383 q 1067 801 1211 693 q 735 909 923 909 q 324 753 495 909 q 154 362 154 598 q 301 1 154 135 q 679 -132 448 -132 q 904 -99 791 -132 q 1105 -6 1016 -67 l 1129 -43 q 923 -150 1033 -113 q 694 -188 812 -188 q 258 -43 439 -188 q 78 350 78 100 q 273 791 78 614 q 737 969 469 969 q 1122 843 955 969 q 1289 507 1289 717 q 1187 214 1289 346 q 930 82 1086 82 q 835 103 879 82 q 792 170 792 124 l 792 203 q 709 116 762 150 q 595 82 655 82 q 439 139 493 82 q 386 302 386 197 q 471 553 386 441 q 692 665 556 665 q 797 639 754 665 q 864 556 840 613 l 906 640 m 849 477 q 796 572 835 535 q 701 609 758 609 q 529 511 592 609 q 467 297 467 413 q 503 184 467 230 q 605 139 540 139 q 733 188 679 139 q 807 313 787 238 l 849 477 \"},\"Ί\":{\"x_min\":-1.390625,\"x_max\":580.0625,\"ha\":690,\"o\":\"m 433 465 q 429 711 433 620 q 414 931 426 802 q 461 927 435 929 q 498 925 487 925 q 546 928 517 925 q 580 931 575 931 q 572 788 580 887 q 564 659 564 690 l 562 448 l 564 283 q 572 135 564 238 q 580 0 580 31 q 539 4 567 0 q 498 8 512 8 q 457 5 480 8 q 414 0 435 2 q 423 239 414 70 q 433 465 433 408 m 181 943 q 215 974 200 964 q 251 985 230 985 q 288 969 273 985 q 304 932 304 954 q 289 896 304 911 q 247 866 275 882 l 47 743 l -1 743 l 181 943 \"},\"ö\":{\"x_min\":40,\"x_max\":712,\"ha\":753,\"o\":\"m 371 -15 q 131 79 223 -15 q 40 322 40 173 q 133 572 40 473 q 380 672 227 672 q 621 575 530 672 q 712 327 712 479 q 619 80 712 175 q 371 -15 527 -15 m 253 929 q 307 906 285 929 q 330 854 330 884 q 309 800 330 822 q 257 778 288 778 q 202 800 225 778 q 180 854 180 823 q 200 906 180 884 q 253 929 221 929 m 498 929 q 549 906 527 929 q 572 854 572 884 q 551 799 572 820 q 499 778 531 778 q 444 800 466 778 q 422 854 422 822 q 444 906 422 884 q 498 929 466 929 m 377 622 q 227 532 274 622 q 180 327 180 442 q 227 125 180 216 q 375 35 274 35 q 524 124 478 35 q 570 327 570 214 q 524 531 570 441 q 377 622 479 622 \"},\"i\":{\"x_min\":91.765625,\"x_max\":244,\"ha\":342,\"o\":\"m 100 144 l 100 520 l 93 654 q 161 648 130 648 q 194 649 182 648 q 229 654 207 650 q 221 579 224 616 q 219 505 219 543 q 224 240 219 417 q 229 0 229 63 q 197 3 212 1 q 161 5 181 5 q 116 2 131 5 q 91 0 100 0 l 100 144 m 168 963 q 223 940 202 963 q 244 881 244 917 q 222 831 244 849 q 168 813 200 813 q 115 833 137 813 q 93 885 93 853 q 113 941 93 919 q 168 963 134 963 \"},\"Β\":{\"x_min\":109,\"x_max\":751,\"ha\":801,\"o\":\"m 127 559 q 109 931 127 759 l 203 929 q 338 932 244 929 q 438 935 432 935 q 629 883 549 935 q 709 726 709 832 q 638 579 709 633 q 464 504 567 524 q 673 438 595 490 q 751 268 751 387 q 639 66 751 133 q 382 0 528 0 l 232 6 q 162 3 211 6 q 109 0 113 0 q 118 287 109 86 q 127 559 127 488 m 256 257 l 256 149 l 261 61 l 337 57 q 526 108 450 57 q 602 266 602 159 q 523 428 602 386 q 312 471 444 471 l 256 471 l 256 257 m 569 706 q 507 834 569 788 q 361 879 446 879 l 261 875 q 252 709 252 798 l 252 522 q 476 558 384 522 q 569 706 569 595 \"},\"≤\":{\"x_min\":176,\"x_max\":962.703125,\"ha\":1139,\"o\":\"m 288 491 l 962 266 l 962 196 l 176 462 l 176 521 l 962 788 l 962 718 l 288 491 m 962 26 l 176 26 l 176 93 l 962 93 l 962 26 \"},\"υ\":{\"x_min\":79,\"x_max\":703,\"ha\":774,\"o\":\"m 703 397 q 596 110 703 236 q 332 -15 489 -15 q 145 54 211 -15 q 79 244 79 123 l 83 430 q 81 542 83 486 q 79 654 80 598 l 146 650 l 217 654 q 209 503 217 608 q 202 366 202 398 l 202 261 q 240 105 202 168 q 369 43 279 43 q 523 133 476 43 q 571 341 571 223 q 548 493 571 418 q 488 645 526 568 q 550 648 529 645 q 627 659 571 650 q 703 397 703 538 \"},\"]\":{\"x_min\":83,\"x_max\":332,\"ha\":449,\"o\":\"m 209 -154 l 83 -158 l 85 -129 l 85 -98 q 183 -104 128 -104 l 229 -104 l 232 386 l 232 880 l 185 880 q 134 877 162 880 q 83 872 107 874 l 85 903 l 85 932 l 205 929 l 332 929 q 326 852 332 909 q 321 766 321 794 l 321 455 l 321 2 l 332 -158 l 209 -154 \"},\"m\":{\"x_min\":91,\"x_max\":1075,\"ha\":1167,\"o\":\"m 101 155 l 101 494 q 98 568 101 529 q 91 654 96 606 q 155 647 123 647 l 221 654 l 216 537 q 317 638 261 604 q 450 672 373 672 q 629 547 581 672 q 733 639 677 606 q 860 672 789 672 q 1018 606 968 672 q 1069 429 1069 540 l 1069 298 l 1069 136 l 1075 0 q 1038 3 1063 0 q 1006 6 1013 6 q 968 3 992 6 q 938 0 943 0 q 944 203 938 68 q 950 406 950 338 q 918 536 950 486 q 810 587 887 587 q 699 540 745 587 q 648 452 653 493 q 642 376 643 410 q 641 326 641 342 l 641 314 q 644 132 641 258 q 647 0 647 6 q 607 4 621 2 q 581 5 593 5 q 542 2 570 5 q 514 0 515 0 q 519 168 514 55 q 524 321 524 280 l 524 406 q 490 534 524 482 q 383 587 457 587 q 273 541 314 587 q 223 436 231 496 q 216 314 216 376 q 219 133 216 244 q 222 0 222 22 q 183 3 207 0 q 154 6 159 6 q 117 4 134 6 q 91 0 100 1 l 101 155 \"},\"χ\":{\"x_min\":-1,\"x_max\":725.390625,\"ha\":713,\"o\":\"m 500 426 q 554 536 528 476 q 607 654 580 595 l 675 650 l 725 652 q 623 507 672 586 q 519 330 573 427 l 444 197 q 575 -85 507 55 q 719 -371 643 -227 q 665 -371 701 -371 q 611 -371 629 -371 l 560 -371 q 444 -115 497 -230 q 358 72 392 -1 l 255 -95 q 178 -237 208 -174 q 125 -371 147 -299 l 62 -371 l 0 -371 q 125 -192 68 -278 q 240 -5 182 -106 l 324 136 l 201 402 q 146 519 174 460 q 43 587 103 587 l -1 584 l -1 638 q 128 672 57 672 q 222 627 181 672 q 292 522 264 583 l 359 374 l 411 260 l 500 426 \"},\"8\":{\"x_min\":59,\"x_max\":689,\"ha\":749,\"o\":\"m 110 696 q 187 853 110 797 q 370 909 264 909 q 558 854 480 909 q 636 694 636 800 q 589 575 636 621 q 467 510 543 529 l 467 499 q 630 413 572 475 q 689 247 689 351 q 597 51 689 120 q 374 -18 505 -18 q 149 48 239 -18 q 59 247 59 115 q 118 414 59 347 q 281 499 178 480 l 281 510 q 157 570 205 521 q 110 696 110 619 m 371 531 q 472 577 437 531 q 507 693 507 624 q 470 810 507 764 q 366 856 433 856 q 271 807 305 856 q 238 693 238 758 q 271 578 238 625 q 371 531 305 531 m 373 31 q 505 97 461 31 q 550 255 550 164 q 506 415 550 348 q 373 482 462 482 q 239 416 283 482 q 195 255 195 351 q 240 96 195 162 q 373 31 285 31 \"},\"ί\":{\"x_min\":96,\"x_max\":429.34375,\"ha\":342,\"o\":\"m 104 333 l 104 520 q 103 566 104 544 q 96 654 102 588 q 141 647 130 648 q 165 647 151 647 q 233 654 196 647 q 224 555 226 599 q 223 437 223 511 l 223 406 q 228 194 223 337 q 233 0 233 51 q 201 3 216 1 q 165 5 185 5 q 127 3 148 5 q 96 0 107 1 q 100 165 96 51 q 104 333 104 279 m 308 943 q 341 974 326 964 q 377 985 357 985 q 415 969 401 985 q 429 932 429 954 q 414 896 429 912 q 373 866 400 880 l 174 743 l 125 743 l 308 943 \"},\"Ζ\":{\"x_min\":6.9375,\"x_max\":801.390625,\"ha\":828,\"o\":\"m 6 36 q 222 324 112 176 q 425 605 333 473 l 597 857 l 433 857 q 59 836 247 857 l 65 883 l 59 932 q 262 927 134 932 q 427 922 390 922 q 622 927 491 922 q 801 932 754 932 l 801 904 q 594 629 709 785 q 399 361 479 473 q 201 77 319 249 l 427 77 q 581 82 520 77 q 801 103 643 87 l 797 68 l 795 54 l 797 34 l 801 0 q 504 4 683 0 q 325 8 326 8 q 166 4 272 8 q 6 0 61 0 l 6 36 \"},\"R\":{\"x_min\":109,\"x_max\":806.234375,\"ha\":785,\"o\":\"m 261 0 q 223 3 248 0 q 185 8 198 8 q 148 5 168 8 q 109 0 127 2 q 118 306 109 90 q 127 598 127 523 q 122 761 127 672 q 109 931 117 849 l 203 929 l 409 935 q 618 882 529 935 q 708 719 708 830 q 634 559 708 615 q 442 473 560 503 q 620 240 533 355 q 806 0 708 124 l 732 5 l 610 0 q 449 240 529 127 q 283 455 369 353 l 251 455 l 251 307 q 256 138 251 245 q 261 0 261 31 m 570 699 q 504 835 570 791 q 344 879 439 879 l 261 875 q 253 772 255 834 q 251 701 251 709 l 251 504 q 479 542 388 504 q 570 699 570 581 \"},\"×\":{\"x_min\":203.984375,\"x_max\":938.015625,\"ha\":1139,\"o\":\"m 892 775 l 938 729 l 616 406 l 938 86 l 892 38 l 571 361 l 247 38 l 203 86 l 525 407 l 204 729 l 247 775 l 570 453 l 892 775 \"},\"o\":{\"x_min\":41,\"x_max\":710,\"ha\":753,\"o\":\"m 371 -15 q 131 78 222 -15 q 41 322 41 172 q 133 573 41 474 q 378 672 225 672 q 619 574 528 672 q 710 326 710 477 q 617 80 710 175 q 371 -15 525 -15 m 377 619 q 226 530 272 619 q 180 327 180 441 q 227 125 180 216 q 375 35 274 35 q 524 123 478 35 q 570 326 570 211 q 524 529 570 440 q 377 619 479 619 \"},\"5\":{\"x_min\":75,\"x_max\":654,\"ha\":749,\"o\":\"m 116 201 q 176 77 131 120 q 303 35 221 35 q 454 98 396 35 q 512 255 512 161 q 457 407 512 346 q 313 469 403 469 q 170 417 227 469 l 150 428 l 158 526 q 158 662 158 570 q 158 801 158 754 l 147 888 l 383 879 l 412 879 q 628 887 520 879 q 624 848 626 870 q 622 818 622 826 l 626 760 l 425 761 l 227 761 q 221 631 227 717 q 216 500 216 544 q 375 536 296 536 q 572 465 491 536 q 654 279 654 394 q 550 60 654 139 q 304 -18 447 -18 q 179 -6 231 -18 q 75 34 127 4 q 101 201 87 118 l 116 201 \"},\"7\":{\"x_min\":122.609375,\"x_max\":729.5625,\"ha\":749,\"o\":\"m 461 553 l 586 770 l 362 770 q 129 755 232 770 q 133 786 132 769 q 135 820 135 804 q 128 888 135 853 l 408 883 l 729 887 l 729 871 q 463 429 582 641 q 251 0 344 216 l 194 8 q 153 5 169 8 q 122 0 137 2 q 214 146 179 91 q 333 339 249 201 q 461 553 417 477 \"},\"K\":{\"x_min\":108,\"x_max\":856.625,\"ha\":821,\"o\":\"m 255 314 q 261 132 255 250 q 268 0 268 13 q 229 4 255 0 q 188 8 202 8 q 148 4 174 8 q 108 0 121 0 q 117 239 108 70 q 126 465 126 408 q 122 712 126 621 q 108 932 119 803 q 153 928 124 932 q 188 925 183 925 q 231 928 203 925 q 267 932 259 932 l 255 671 l 255 499 q 480 693 375 586 q 687 932 585 800 q 732 932 710 932 q 777 932 753 932 l 837 932 q 606 727 720 830 q 389 522 493 623 q 525 358 465 426 q 666 202 586 290 q 856 0 747 115 l 746 0 q 692 -1 716 0 q 644 -8 669 -2 q 571 92 610 44 q 477 204 532 140 l 255 459 l 255 314 \"},\",\":{\"x_min\":40.28125,\"x_max\":272.21875,\"ha\":374,\"o\":\"m 131 75 q 160 147 144 120 q 213 175 176 175 q 272 119 272 175 q 259 67 272 91 q 231 18 245 43 l 73 -243 l 40 -231 l 131 75 \"},\"d\":{\"x_min\":55,\"x_max\":676,\"ha\":758,\"o\":\"m 668 762 l 672 137 l 676 -1 q 638 3 653 1 q 611 5 623 5 q 574 2 597 5 q 547 -1 551 -1 l 557 119 q 336 -15 484 -15 q 127 86 200 -15 q 55 330 55 187 q 127 569 55 467 q 332 672 199 672 q 457 643 402 672 q 551 556 513 615 l 551 756 l 551 789 l 551 818 q 542 1025 551 927 q 609 1018 576 1018 q 639 1019 628 1018 q 675 1025 651 1020 l 668 762 m 374 57 q 515 139 473 57 q 557 332 557 222 q 513 522 557 437 q 374 607 470 607 q 236 522 278 607 q 194 332 194 438 q 235 141 194 225 q 374 57 277 57 \"},\"¨\":{\"x_min\":83.71875,\"x_max\":550.390625,\"ha\":625,\"o\":\"m 471 659 q 441 593 458 618 q 389 568 424 568 q 350 579 365 568 q 335 613 335 591 q 346 660 335 633 q 371 706 358 687 l 519 950 l 550 940 l 471 659 m 221 659 q 192 593 211 618 q 137 568 174 568 q 83 613 83 568 q 93 658 83 637 q 119 706 103 680 l 268 950 l 300 940 l 221 659 \"},\"E\":{\"x_min\":108,\"x_max\":613.5625,\"ha\":686,\"o\":\"m 126 465 q 122 711 126 620 q 108 932 119 802 l 353 928 l 610 931 l 606 884 l 610 836 q 508 853 562 847 q 408 860 453 860 l 260 860 l 258 671 l 258 528 l 398 528 q 587 541 480 528 l 584 497 l 587 451 l 394 463 l 258 463 l 258 316 l 264 73 q 456 76 380 73 q 613 94 531 80 l 610 47 l 613 0 l 358 4 l 108 0 q 117 239 108 70 q 126 465 126 408 \"},\"Y\":{\"x_min\":-28,\"x_max\":746,\"ha\":707,\"o\":\"m 297 177 l 297 386 q 191 570 256 458 q 84 750 125 682 q -28 932 42 819 q 24 928 -9 932 q 63 925 59 925 q 112 927 91 925 q 146 932 134 930 q 207 800 174 866 q 275 676 239 735 l 389 475 q 509 688 451 575 q 627 932 567 801 l 683 926 q 715 927 701 926 q 746 932 729 929 q 555 627 640 769 l 432 415 l 432 240 q 435 101 432 198 q 438 0 438 5 q 401 4 426 1 q 361 6 376 6 q 319 4 334 6 q 284 0 304 2 q 292 88 288 36 q 297 177 297 140 \"},\"\\\"\":{\"x_min\":64,\"x_max\":315,\"ha\":379,\"o\":\"m 133 587 l 64 587 l 64 957 l 133 957 l 133 587 m 315 587 l 247 587 l 247 957 l 315 957 l 315 587 \"},\"ê\":{\"x_min\":40,\"x_max\":646.9375,\"ha\":681,\"o\":\"m 406 42 q 602 130 523 42 l 621 130 q 613 93 617 112 q 609 47 609 73 q 496 0 558 14 q 369 -15 435 -15 q 130 73 220 -15 q 40 311 40 162 q 126 562 40 456 q 355 669 212 669 q 564 590 481 669 q 646 386 646 512 l 644 331 q 438 333 562 331 q 314 335 315 335 l 179 331 q 235 127 179 212 q 406 42 291 42 m 296 978 l 386 978 l 537 743 l 488 743 l 340 875 l 193 743 l 143 743 l 296 978 m 513 392 l 513 437 q 470 563 513 509 q 356 618 427 618 q 233 552 271 618 q 183 390 195 487 l 513 392 \"},\"δ\":{\"x_min\":41,\"x_max\":670,\"ha\":710,\"o\":\"m 102 840 q 185 981 102 937 q 375 1025 268 1025 q 497 1010 436 1025 q 621 968 559 995 q 595 876 604 923 q 500 947 547 923 q 393 972 453 972 q 280 937 328 972 q 233 840 233 902 q 272 742 233 794 q 434 627 312 691 q 613 504 556 563 q 670 305 670 445 q 581 75 670 165 q 350 -15 492 -15 q 125 73 210 -15 q 41 305 41 162 q 113 526 41 430 q 306 622 186 622 q 145 726 189 674 q 102 840 102 779 m 356 576 q 221 492 261 576 q 181 302 181 409 q 223 118 181 203 q 356 34 265 34 q 490 116 450 34 q 530 307 530 198 q 489 492 530 409 q 356 576 449 576 \"},\"έ\":{\"x_min\":53,\"x_max\":598.828125,\"ha\":628,\"o\":\"m 506 516 q 433 591 467 566 q 353 616 400 616 q 261 580 298 616 q 225 492 225 545 q 268 406 225 437 q 372 375 311 375 l 418 375 l 417 352 l 417 313 l 343 317 q 237 282 281 317 q 193 185 193 247 q 238 78 193 118 q 352 38 284 38 q 460 66 410 38 q 543 144 510 94 q 553 99 547 121 q 567 54 558 76 q 452 2 515 19 q 321 -15 388 -15 q 134 31 216 -15 q 53 176 53 78 q 96 286 53 246 q 214 355 139 326 q 127 408 162 370 q 93 497 93 445 q 165 625 93 579 q 323 672 237 672 q 430 654 378 672 q 541 604 481 637 q 522 564 529 584 q 506 516 514 545 m 476 944 q 510 975 494 965 q 547 986 526 986 q 584 970 569 986 q 598 933 598 954 q 584 898 598 912 q 541 867 569 884 l 342 744 l 293 744 l 476 944 \"},\"ω\":{\"x_min\":39.71875,\"x_max\":1028.9375,\"ha\":1068,\"o\":\"m 535 526 l 596 528 l 594 305 q 616 117 594 193 q 722 42 638 42 q 850 118 811 42 q 888 293 888 194 q 829 502 888 409 q 664 654 769 594 l 717 648 q 805 654 766 648 q 967 510 905 606 q 1028 304 1028 413 q 948 81 1028 177 q 744 -15 867 -15 q 622 16 678 -15 q 534 104 566 47 q 445 16 500 48 q 323 -15 389 -15 q 118 83 196 -15 q 39 311 39 182 q 100 511 39 419 q 262 654 161 604 q 303 650 278 651 q 349 648 327 648 l 402 654 q 238 501 296 593 q 179 291 179 409 q 218 116 179 191 q 348 42 257 42 q 419 68 390 42 q 461 137 448 94 q 472 216 469 175 q 475 303 475 257 q 472 419 475 353 q 469 528 470 485 l 535 526 \"},\"´\":{\"x_min\":90.28125,\"x_max\":305.5625,\"ha\":374,\"o\":\"m 169 859 q 197 923 177 894 q 250 953 218 953 q 288 939 272 953 q 305 902 305 925 q 295 857 305 882 q 269 811 284 833 l 120 568 l 90 576 l 169 859 \"},\"±\":{\"x_min\":169,\"x_max\":969,\"ha\":1139,\"o\":\"m 602 549 l 969 549 l 969 482 l 602 482 l 602 247 l 534 247 l 534 482 l 169 482 l 169 549 l 534 549 l 534 779 l 602 779 l 602 549 m 969 33 l 169 33 l 169 100 l 969 100 l 969 33 \"},\"|\":{\"x_min\":305,\"x_max\":376,\"ha\":683,\"o\":\"m 376 448 l 305 448 l 305 956 l 376 956 l 376 448 m 376 -233 l 305 -233 l 305 272 l 376 272 l 376 -233 \"},\"ϋ\":{\"x_min\":79,\"x_max\":703,\"ha\":774,\"o\":\"m 703 395 q 595 110 703 236 q 332 -15 488 -15 q 145 54 211 -15 q 79 244 79 123 l 83 429 q 81 542 83 486 q 79 654 80 598 l 146 650 l 217 654 q 209 502 217 608 q 202 365 202 397 l 202 261 q 240 105 202 168 q 369 43 279 43 q 523 132 476 43 q 571 340 571 222 q 548 493 571 418 q 488 645 526 568 q 550 647 529 645 q 627 658 571 650 q 703 395 703 537 m 227 928 q 281 907 259 928 q 304 853 304 886 q 283 800 304 822 q 230 778 262 778 q 175 800 197 778 q 153 853 153 822 q 174 906 153 884 q 227 928 195 928 m 469 928 q 523 906 501 928 q 545 853 545 884 q 524 799 545 821 q 472 778 504 778 q 418 800 440 778 q 396 853 396 822 q 416 905 396 883 q 469 928 437 928 \"},\"§\":{\"x_min\":64,\"x_max\":620,\"ha\":675,\"o\":\"m 114 36 l 128 36 q 198 -76 148 -33 q 319 -120 247 -120 q 430 -78 384 -120 q 476 27 476 -37 q 369 169 476 116 q 170 252 269 210 q 64 419 64 312 q 91 522 64 476 q 171 609 119 568 q 122 739 122 669 q 195 896 122 837 q 369 956 268 956 q 473 940 422 956 q 576 894 523 925 q 559 864 568 882 q 521 775 551 846 l 508 775 q 445 871 483 839 q 343 903 407 903 q 251 867 289 903 q 213 777 213 832 q 318 644 213 694 q 514 563 415 604 q 620 408 620 507 q 592 299 620 348 q 515 213 565 251 q 560 143 544 179 q 576 65 576 108 q 494 -112 576 -46 q 298 -178 412 -178 q 179 -163 239 -178 q 76 -119 120 -148 q 97 -42 86 -89 q 114 36 108 4 m 138 479 q 257 340 138 396 q 478 238 376 285 q 524 285 508 261 q 541 342 541 310 q 384 490 541 423 q 197 587 228 556 q 156 532 175 563 q 138 479 138 501 \"},\"b\":{\"x_min\":78,\"x_max\":703,\"ha\":758,\"o\":\"m 152 1018 q 219 1025 181 1018 q 212 916 214 966 q 210 788 210 866 l 210 755 l 210 555 q 419 672 283 672 q 629 569 555 672 q 703 322 703 466 q 630 79 703 173 q 414 -15 558 -15 q 296 8 350 -15 q 193 79 242 31 q 160 49 175 64 q 120 -1 145 33 l 78 -1 q 87 106 82 43 q 92 213 92 169 l 92 545 q 88 784 92 625 q 85 1025 85 944 q 152 1018 119 1018 m 383 605 q 243 520 285 605 q 202 323 202 435 q 245 133 202 218 q 383 48 288 48 q 522 132 480 48 q 564 326 564 217 q 522 519 564 434 q 383 605 480 605 \"},\"q\":{\"x_min\":54,\"x_max\":675,\"ha\":758,\"o\":\"m 608 -368 q 579 -368 591 -368 q 540 -373 567 -369 q 549 -213 548 -312 q 551 -101 551 -115 l 551 99 q 339 -15 476 -15 q 130 82 207 -15 q 54 316 54 180 q 125 564 54 456 q 333 672 197 672 q 464 636 407 672 q 557 535 520 601 q 546 655 557 594 q 586 649 576 650 q 611 648 597 648 q 674 655 640 648 l 671 433 q 669 163 671 298 q 666 -106 668 27 l 675 -373 q 643 -369 658 -370 q 608 -368 627 -368 m 373 48 q 515 134 473 48 q 557 331 557 220 q 511 514 557 433 q 372 596 466 596 q 234 512 276 596 q 193 322 193 429 q 236 133 193 218 q 373 48 279 48 \"},\"Ω\":{\"x_min\":8,\"x_max\":1119.125,\"ha\":1129,\"o\":\"m 449 0 q 318 4 410 0 q 223 8 227 8 l 10 0 l 13 47 q 11 74 13 59 q 8 95 9 88 q 119 88 69 90 q 249 86 169 86 q 103 261 152 170 q 55 473 55 352 q 200 822 55 694 q 567 950 345 950 q 931 823 791 950 q 1072 473 1072 697 q 1025 261 1072 350 q 878 86 978 173 q 992 91 902 86 q 1119 96 1083 96 l 1114 33 l 1117 0 l 906 8 q 778 4 867 8 q 682 0 688 0 l 682 72 q 864 215 807 122 q 921 451 921 309 q 834 764 921 639 q 565 889 747 889 q 296 767 384 889 q 209 454 209 645 q 268 217 209 319 q 449 72 327 115 l 449 0 \"},\"ύ\":{\"x_min\":79,\"x_max\":703,\"ha\":774,\"o\":\"m 703 395 q 595 110 703 236 q 332 -15 488 -15 q 145 54 211 -15 q 79 244 79 123 l 83 429 q 81 541 83 484 q 79 652 80 597 l 146 648 l 217 652 q 209 502 217 606 q 202 365 202 397 l 202 261 q 240 105 202 168 q 369 43 279 43 q 523 132 476 43 q 571 340 571 222 q 548 491 571 416 q 488 644 526 566 q 550 646 529 644 q 627 656 571 648 q 703 395 703 536 m 499 941 q 532 972 517 962 q 568 983 547 983 q 606 967 592 983 q 620 930 620 952 q 605 894 620 910 q 564 865 590 878 l 365 741 l 316 741 l 499 941 \"},\"Ö\":{\"x_min\":51,\"x_max\":1069,\"ha\":1121,\"o\":\"m 51 465 q 191 819 51 688 q 559 950 332 950 q 891 852 750 950 q 1046 659 1031 755 q 1065 535 1062 562 q 1069 462 1069 508 q 1066 395 1069 416 q 1047 275 1063 373 q 894 80 1031 176 q 562 -15 756 -15 q 451 -8 503 -15 q 304 31 399 -2 q 130 187 209 65 q 51 465 51 308 m 439 1208 q 491 1186 470 1208 q 513 1133 513 1164 q 491 1080 513 1103 q 439 1058 470 1058 q 385 1080 409 1058 q 362 1133 362 1102 q 384 1186 362 1164 q 439 1208 407 1208 m 682 1208 q 735 1186 713 1208 q 757 1133 757 1164 q 735 1080 757 1103 q 682 1058 713 1058 q 628 1079 650 1058 q 607 1133 607 1101 q 628 1186 607 1164 q 682 1208 650 1208 m 204 469 q 292 162 204 283 q 559 42 380 42 q 827 162 739 42 q 916 469 916 283 q 825 767 916 648 q 559 887 735 887 q 349 825 430 887 q 226 638 267 763 q 204 469 204 558 \"},\"z\":{\"x_min\":15.28125,\"x_max\":606.9375,\"ha\":647,\"o\":\"m 15 29 q 164 224 88 124 q 302 416 240 323 l 418 586 l 270 586 q 181 581 218 586 q 62 565 145 577 l 68 609 l 62 654 q 181 648 115 650 q 330 646 248 646 l 363 646 l 393 646 q 606 654 500 646 l 606 626 q 453 428 545 549 q 317 246 361 306 q 194 68 273 185 l 343 68 q 456 72 400 68 q 594 86 513 77 l 588 42 l 594 0 l 280 8 q 148 4 237 8 q 15 0 59 0 l 15 29 \"},\"™\":{\"x_min\":176,\"x_max\":918,\"ha\":1139,\"o\":\"m 463 930 l 346 930 l 346 614 l 293 614 l 293 930 l 176 930 l 176 969 l 463 969 l 463 930 m 736 690 l 840 968 l 918 969 l 918 614 l 871 614 l 871 927 l 752 614 l 719 614 l 594 930 l 594 614 l 548 614 l 548 969 l 625 969 l 736 690 \"},\"ή\":{\"x_min\":91,\"x_max\":662,\"ha\":754,\"o\":\"m 594 -365 q 557 -366 577 -365 q 526 -369 537 -368 q 531 -189 526 -310 q 537 -7 537 -68 l 537 406 q 503 536 537 485 q 391 587 469 587 q 255 508 290 587 q 220 315 220 430 q 222 133 220 259 q 224 1 224 8 l 158 6 l 91 1 l 101 156 l 101 495 q 97 584 101 527 q 93 655 93 640 q 119 650 105 652 q 155 648 134 648 q 185 650 175 648 q 221 655 195 651 l 220 538 q 321 637 265 602 q 452 672 378 672 q 604 603 552 672 q 656 430 656 535 l 656 329 l 656 -186 q 659 -293 656 -227 q 662 -370 662 -359 q 630 -366 645 -368 q 594 -365 614 -365 m 481 944 q 515 975 499 965 q 552 986 531 986 q 589 970 575 986 q 603 933 603 955 q 589 898 603 912 q 547 868 575 884 l 348 744 l 298 744 l 481 944 \"},\"Θ\":{\"x_min\":51,\"x_max\":1068,\"ha\":1119,\"o\":\"m 51 465 q 193 820 51 690 q 562 950 335 950 q 893 852 755 950 q 1047 653 1031 755 q 1065 525 1062 551 q 1068 462 1068 500 q 1065 402 1068 426 q 1047 280 1062 379 q 892 83 1033 182 q 560 -15 751 -15 q 435 -7 480 -15 q 299 32 390 0 q 130 187 209 65 q 51 465 51 308 m 202 468 q 290 163 202 283 q 559 43 379 43 q 826 163 738 43 q 915 468 915 283 q 826 770 915 652 q 559 889 738 889 q 254 720 306 889 q 202 468 202 552 m 560 507 q 683 510 608 507 q 768 514 758 514 l 765 465 l 765 429 q 648 432 730 429 q 558 435 566 435 q 440 432 523 435 q 351 429 357 429 l 353 470 l 353 514 q 474 510 400 514 q 560 507 549 507 \"},\"®\":{\"x_min\":80,\"x_max\":1058,\"ha\":1139,\"o\":\"m 816 905 q 992 726 927 841 q 1058 481 1058 611 q 912 138 1058 283 q 567 -6 766 -6 q 225 139 370 -6 q 80 481 80 284 q 224 826 80 681 q 569 971 368 971 q 816 905 698 971 m 569 918 q 263 788 392 918 q 134 481 134 659 q 261 175 134 306 q 566 45 389 45 q 872 174 741 45 q 1004 478 1004 304 q 947 699 1004 596 q 787 859 890 801 q 569 918 684 918 m 815 619 q 776 521 815 562 q 681 468 738 480 l 809 209 l 709 208 l 592 456 l 462 457 l 462 209 l 376 209 l 376 771 l 581 771 q 745 737 676 771 q 815 619 815 704 m 462 714 l 462 513 l 566 513 q 682 532 635 513 q 729 611 729 551 q 681 692 729 671 q 564 714 634 714 l 462 714 \"},\"É\":{\"x_min\":109,\"x_max\":614.5625,\"ha\":685,\"o\":\"m 124 465 q 116 710 124 540 q 109 932 109 880 l 353 929 l 610 929 q 607 904 607 918 q 607 884 607 891 l 610 838 q 407 860 506 860 l 259 860 l 257 670 l 257 530 l 397 530 q 586 542 492 530 q 584 518 584 530 q 584 499 584 506 q 586 450 584 465 q 487 458 542 454 q 393 463 432 463 l 257 463 l 257 318 l 262 74 q 452 77 381 74 q 614 94 524 80 l 613 47 l 614 0 l 356 0 l 109 0 q 116 243 109 72 q 124 465 124 415 m 426 1225 q 461 1255 445 1244 q 499 1267 478 1267 q 536 1251 522 1267 q 549 1212 549 1236 q 533 1176 549 1192 q 492 1147 517 1160 l 292 1024 l 242 1024 l 426 1225 \"},\"~\":{\"x_min\":284,\"x_max\":1080,\"ha\":1368,\"o\":\"m 850 650 q 667 750 761 650 q 511 850 573 850 q 396 793 431 850 q 362 650 362 737 l 284 650 q 339 846 284 768 q 508 924 395 924 q 697 824 606 924 q 853 725 788 725 q 969 779 936 725 q 1002 924 1002 834 l 1080 924 q 1023 727 1080 805 q 850 650 966 650 \"},\"Ε\":{\"x_min\":108,\"x_max\":613.5625,\"ha\":686,\"o\":\"m 126 465 q 122 711 126 620 q 108 932 119 802 l 353 928 l 610 931 l 606 884 l 610 836 q 508 853 562 847 q 408 860 453 860 l 260 860 l 258 671 l 258 528 l 398 528 q 587 541 480 528 l 584 497 l 587 451 l 394 463 l 258 463 l 258 316 l 264 73 q 456 76 380 73 q 613 94 531 80 l 610 47 l 613 0 l 358 4 l 108 0 q 117 239 108 70 q 126 465 126 408 \"},\"³\":{\"x_min\":48,\"x_max\":424,\"ha\":496,\"o\":\"m 159 636 l 156 663 q 178 661 167 661 q 200 661 189 661 q 280 690 248 661 q 312 767 312 719 q 212 869 312 869 q 143 846 168 869 q 107 781 117 823 l 102 779 q 84 812 93 795 q 66 845 75 830 q 134 886 98 871 q 212 901 171 901 q 341 873 284 901 q 398 778 398 845 q 355 691 398 724 q 252 643 313 658 q 373 610 322 643 q 424 509 424 577 q 353 385 424 427 q 196 343 283 343 q 48 373 117 343 q 57 422 52 391 q 66 469 63 454 l 75 469 q 120 399 88 425 q 199 374 153 374 q 294 409 254 374 q 334 499 334 444 q 299 588 334 553 q 207 623 264 623 q 179 620 193 623 q 156 617 166 618 l 159 636 \"},\"[\":{\"x_min\":116,\"x_max\":364.609375,\"ha\":449,\"o\":\"m 127 2 l 127 386 l 127 769 l 116 932 l 235 929 l 364 929 l 363 908 l 363 872 q 263 880 313 880 l 216 880 l 216 387 l 216 -105 l 264 -105 q 329 -102 308 -105 q 364 -98 351 -99 l 363 -123 l 363 -158 l 237 -154 l 116 -158 q 121 -81 116 -138 q 127 2 127 -24 \"},\"L\":{\"x_min\":108,\"x_max\":627.453125,\"ha\":629,\"o\":\"m 126 465 q 122 712 126 621 q 108 932 119 803 q 149 930 126 932 q 188 926 173 927 q 233 929 202 926 q 268 932 265 932 q 263 797 268 883 q 258 684 258 711 q 261 332 258 577 q 264 73 264 86 l 402 73 q 512 78 458 73 q 627 94 566 84 l 624 47 l 627 0 l 358 4 l 108 0 q 117 239 108 70 q 126 465 126 408 \"},\"σ\":{\"x_min\":41,\"x_max\":802.109375,\"ha\":806,\"o\":\"m 625 644 l 802 651 l 797 611 l 802 566 l 626 573 q 690 464 671 527 q 710 327 710 402 q 616 81 710 177 q 371 -15 522 -15 q 131 78 222 -15 q 41 322 41 172 q 131 572 41 472 q 371 672 221 672 q 439 665 403 672 q 508 653 475 659 q 569 645 541 646 q 625 644 597 644 m 376 619 q 226 530 272 619 q 181 326 181 442 q 224 124 181 213 q 369 35 268 35 q 522 123 474 35 q 570 326 570 211 q 524 529 570 440 q 376 619 479 619 \"},\"ζ\":{\"x_min\":75,\"x_max\":675,\"ha\":683,\"o\":\"m 642 987 l 642 949 q 425 760 524 860 q 260 545 326 661 q 194 303 194 428 q 194 278 194 289 q 202 215 194 267 q 335 141 210 163 q 558 116 447 128 q 675 -7 675 91 q 643 -109 675 -65 q 544 -232 612 -154 l 500 -205 q 565 -113 555 -131 q 576 -66 576 -94 q 552 -20 576 -37 q 292 22 509 2 q 75 240 75 41 q 143 487 75 357 q 297 719 212 616 q 508 949 383 821 l 359 949 q 252 945 301 949 q 130 933 204 941 l 134 977 l 130 1025 q 272 1021 186 1025 q 372 1018 358 1018 q 526 1021 429 1018 q 643 1025 623 1025 l 642 987 \"},\"θ\":{\"x_min\":48,\"x_max\":699,\"ha\":749,\"o\":\"m 375 909 q 621 773 544 909 q 699 456 699 638 q 627 118 699 255 q 372 -19 556 -19 q 120 114 193 -19 q 48 444 48 247 q 122 773 48 638 q 375 909 196 909 m 184 383 q 221 136 184 242 q 374 31 259 31 q 534 137 505 31 q 564 424 564 244 l 408 428 l 184 423 l 184 383 m 371 858 q 257 804 300 858 q 196 673 214 751 q 186 581 189 630 q 184 483 184 532 l 322 478 q 461 480 364 478 q 564 483 558 483 q 528 747 564 637 q 371 858 493 858 \"},\"Ο\":{\"x_min\":51,\"x_max\":1068,\"ha\":1119,\"o\":\"m 51 465 q 192 820 51 690 q 559 950 333 950 q 892 853 754 950 q 1047 654 1031 757 q 1065 525 1062 551 q 1068 462 1068 500 q 1065 402 1068 426 q 1047 277 1062 379 q 894 80 1031 175 q 560 -15 756 -15 q 447 -10 496 -15 q 304 29 398 -5 q 130 186 210 64 q 51 465 51 308 m 202 468 q 290 162 202 282 q 559 42 379 42 q 826 162 738 42 q 915 468 915 283 q 825 770 915 651 q 559 889 735 889 q 348 826 429 889 q 225 639 267 764 q 202 468 202 552 \"},\"Γ\":{\"x_min\":108,\"x_max\":627.453125,\"ha\":629,\"o\":\"m 448 932 l 627 932 q 623 902 624 921 q 621 874 621 883 l 627 836 q 402 863 512 863 l 264 863 q 261 586 264 779 q 258 379 258 393 q 263 181 258 313 q 268 0 268 48 l 187 5 l 108 0 q 121 209 117 106 q 126 427 126 311 q 117 686 126 504 q 108 932 108 869 l 448 932 \"},\" \":{\"x_min\":0,\"x_max\":0,\"ha\":375},\"%\":{\"x_min\":28,\"x_max\":1011,\"ha\":1032,\"o\":\"m 799 0 q 647 62 708 0 q 586 218 586 124 q 647 372 586 309 q 799 436 709 436 q 949 373 888 436 q 1011 223 1011 311 q 995 130 1011 176 q 918 35 972 70 q 799 0 865 0 m 863 1015 l 227 -125 l 158 -125 l 793 1015 l 863 1015 m 241 451 q 89 513 150 451 q 28 668 28 576 q 89 823 28 759 q 241 888 150 888 q 391 825 330 888 q 453 673 453 762 q 434 581 453 623 q 359 486 412 521 q 241 451 307 451 m 897 260 q 872 353 897 310 q 798 397 847 397 q 718 340 737 397 q 700 202 700 283 q 719 86 700 133 q 798 40 738 40 q 866 73 840 40 q 892 149 892 106 q 895 206 894 169 q 897 260 897 242 m 339 689 q 312 812 339 775 q 240 849 285 849 q 160 788 179 849 q 141 648 141 728 q 164 541 141 590 q 240 493 188 493 q 307 527 281 493 q 334 602 334 561 q 339 689 339 641 \"},\"P\":{\"x_min\":109,\"x_max\":722,\"ha\":736,\"o\":\"m 127 559 q 109 931 127 759 l 231 927 q 337 931 270 927 q 416 935 403 935 q 632 874 543 935 q 722 694 722 814 q 616 493 722 564 q 371 422 510 422 l 252 422 q 257 200 252 348 q 262 0 262 52 q 224 3 249 0 q 185 8 199 8 q 147 5 168 8 q 109 0 127 2 q 118 287 109 85 q 127 559 127 488 m 576 684 q 515 826 576 773 q 364 879 455 879 l 262 875 q 254 781 257 827 q 252 688 252 735 l 252 476 q 507 530 439 476 q 576 684 576 584 \"},\"Ώ\":{\"x_min\":-1,\"x_max\":1355.953125,\"ha\":1365,\"o\":\"m 685 0 q 555 4 646 0 q 460 8 464 8 l 247 0 l 250 47 q 248 74 250 59 q 244 95 246 88 q 355 88 305 90 q 486 86 405 86 q 340 261 389 170 q 292 473 292 352 q 437 822 292 694 q 804 950 582 950 q 1168 823 1028 950 q 1309 473 1309 697 q 1262 261 1309 350 q 1115 86 1215 173 q 1229 91 1139 86 q 1355 96 1319 96 l 1351 33 l 1354 0 l 1143 8 q 1014 4 1104 8 q 918 0 924 0 l 918 72 q 1100 215 1043 122 q 1158 451 1158 309 q 1071 764 1158 639 q 802 889 984 889 q 533 767 621 889 q 446 454 446 645 q 505 217 446 319 q 685 72 564 115 l 685 0 m 182 943 q 215 974 200 964 q 251 985 230 985 q 289 969 274 985 q 304 932 304 954 q 290 896 304 911 q 247 866 275 882 l 48 743 l -1 743 l 182 943 \"},\"Έ\":{\"x_min\":-1.390625,\"x_max\":920.015625,\"ha\":992,\"o\":\"m 432 465 q 428 711 432 620 q 414 932 425 802 l 660 928 l 917 932 l 912 884 l 917 836 q 814 853 868 847 q 714 860 760 860 l 567 860 l 564 671 l 564 528 l 704 528 q 893 541 786 528 l 890 497 l 893 451 l 700 462 l 564 462 l 564 317 l 570 74 q 762 77 686 74 q 920 94 838 80 l 917 47 l 920 0 l 664 4 l 414 0 q 423 239 414 70 q 432 465 432 408 m 181 943 q 215 974 200 964 q 251 985 230 985 q 288 969 273 985 q 304 932 304 954 q 289 896 304 911 q 247 866 275 882 l 47 743 l -1 743 l 181 943 \"},\"_\":{\"x_min\":0,\"x_max\":683.328125,\"ha\":683,\"o\":\"m 683 -322 l 0 -322 l 0 -256 l 683 -256 l 683 -322 \"},\"Ϊ\":{\"x_min\":-3,\"x_max\":388,\"ha\":386,\"o\":\"m 126 465 q 118 710 126 540 q 111 932 111 880 q 156 929 123 932 q 192 926 190 926 q 238 929 205 926 q 276 932 271 932 q 265 697 276 863 q 255 465 255 530 q 265 230 255 397 q 276 0 276 63 q 233 3 260 0 q 192 8 205 8 q 153 5 176 8 q 111 0 131 2 q 118 243 111 72 q 126 465 126 415 m 73 1208 q 124 1186 102 1208 q 146 1133 146 1164 q 123 1081 146 1105 q 73 1058 101 1058 q 19 1080 42 1058 q -3 1133 -3 1103 q 19 1185 -3 1163 q 73 1208 41 1208 m 313 1208 q 366 1186 344 1208 q 388 1133 388 1164 q 365 1080 388 1103 q 313 1058 342 1058 q 260 1080 283 1058 q 238 1133 238 1103 q 260 1185 238 1163 q 313 1208 282 1208 \"},\"+\":{\"x_min\":169,\"x_max\":970,\"ha\":1139,\"o\":\"m 603 441 l 970 441 l 970 374 l 603 374 l 603 0 l 536 0 l 536 374 l 169 374 l 169 441 l 536 441 l 536 816 l 603 816 l 603 441 \"},\"½\":{\"x_min\":83,\"x_max\":1094.125,\"ha\":1172,\"o\":\"m 250 743 l 245 836 q 181 804 205 818 q 120 768 156 791 q 104 788 117 775 q 83 808 91 801 q 200 851 141 825 q 327 913 259 877 l 336 911 q 331 724 336 850 q 326 551 326 598 l 326 391 q 301 394 319 391 q 280 397 283 397 q 254 394 271 397 q 233 391 238 391 q 246 551 242 473 q 250 743 250 629 m 859 1015 l 929 1015 l 312 -124 l 243 -124 l 859 1015 m 982 363 q 959 443 982 413 q 887 478 936 473 q 821 458 852 478 q 784 407 790 439 l 778 377 l 773 376 q 728 448 753 416 q 899 513 801 513 q 1019 476 967 513 q 1072 374 1072 439 q 955 189 1072 285 q 806 67 838 93 l 978 67 q 1094 79 1039 67 q 1090 63 1092 76 q 1088 41 1088 49 q 1094 3 1088 18 q 981 3 1056 3 q 867 3 906 3 q 791 3 842 3 q 714 3 739 3 l 714 25 q 913 198 844 125 q 982 363 982 270 \"},\"Ρ\":{\"x_min\":109,\"x_max\":722,\"ha\":736,\"o\":\"m 127 559 q 109 931 127 759 l 231 927 q 337 931 270 927 q 416 935 403 935 q 632 874 543 935 q 722 694 722 814 q 616 493 722 564 q 371 422 510 422 l 252 422 q 257 200 252 348 q 262 0 262 52 q 224 3 249 0 q 185 8 199 8 q 147 5 168 8 q 109 0 127 2 q 118 287 109 85 q 127 559 127 488 m 576 684 q 515 826 576 773 q 364 879 455 879 l 262 875 q 254 781 257 827 q 252 688 252 735 l 252 476 q 507 530 439 476 q 576 684 576 584 \"},\"'\":{\"x_min\":88.890625,\"x_max\":306.9375,\"ha\":374,\"o\":\"m 169 858 q 196 923 177 896 q 250 951 215 951 q 289 937 272 951 q 306 903 306 923 q 295 858 306 883 q 269 812 284 833 l 122 568 l 88 576 l 169 858 \"},\"T\":{\"x_min\":11,\"x_max\":713,\"ha\":725,\"o\":\"m 11 839 l 15 884 l 11 932 q 194 927 72 932 q 361 922 316 922 q 544 927 421 922 q 713 932 668 932 q 707 883 707 911 q 707 861 707 870 q 713 834 707 852 q 609 850 666 843 q 504 857 552 857 l 428 857 q 426 767 428 830 q 424 701 424 704 l 428 220 q 442 0 428 122 q 362 8 401 3 q 323 5 344 8 q 282 0 301 2 q 289 132 282 40 q 296 259 296 225 l 296 683 l 296 857 q 11 839 164 857 \"},\"Φ\":{\"x_min\":50,\"x_max\":1068,\"ha\":1119,\"o\":\"m 637 -25 q 559 -15 591 -15 q 527 -17 544 -15 q 483 -25 509 -19 l 487 68 q 181 179 313 68 q 50 465 50 291 q 172 744 50 647 q 487 865 295 842 l 483 958 q 522 952 502 955 q 559 950 543 950 q 596 952 576 950 q 637 958 616 955 l 631 865 q 942 758 816 865 q 1068 465 1068 651 q 944 184 1068 286 q 631 68 820 83 l 637 -25 m 501 502 q 497 677 501 570 q 494 800 494 784 q 278 698 354 786 q 203 466 203 611 q 282 231 203 331 q 494 132 361 132 q 497 363 494 225 q 501 502 501 501 m 915 466 q 839 706 915 612 q 626 800 764 800 q 622 636 626 738 q 618 470 618 533 q 622 301 618 408 q 626 132 626 194 q 839 226 764 132 q 915 466 915 320 \"},\"j\":{\"x_min\":-55,\"x_max\":248,\"ha\":342,\"o\":\"m 113 391 q 106 543 113 444 q 100 654 100 641 q 144 648 135 648 q 167 648 153 648 q 202 649 189 648 q 241 654 214 650 q 237 507 241 595 q 234 405 234 419 l 234 -13 l 234 -109 q 154 -303 234 -234 q -55 -372 74 -372 l -55 -333 q 78 -267 44 -323 q 113 -103 113 -212 l 113 -26 l 113 391 m 171 963 q 226 940 205 963 q 248 881 248 917 q 226 831 248 849 q 171 813 204 813 q 116 833 139 813 q 94 885 94 853 q 115 941 94 919 q 171 963 136 963 \"},\"Σ\":{\"x_min\":44.4375,\"x_max\":790.28125,\"ha\":825,\"o\":\"m 729 883 l 733 835 q 272 855 519 855 q 544 500 391 691 q 372 312 446 399 q 219 119 297 224 l 455 119 q 638 124 522 119 q 790 129 755 129 l 784 86 l 783 68 l 784 42 q 785 25 784 33 q 790 0 786 17 q 558 4 694 0 q 416 8 422 8 q 230 4 350 8 q 44 0 111 0 l 44 50 q 169 182 105 109 q 307 344 232 255 l 406 468 q 242 689 314 594 q 76 899 170 785 l 76 932 q 231 929 123 932 q 345 926 340 926 q 568 929 412 926 q 733 932 723 932 l 729 883 \"},\"1\":{\"x_min\":72,\"x_max\":472,\"ha\":749,\"o\":\"m 334 626 q 331 722 334 655 q 329 793 329 788 q 228 737 278 765 q 133 673 177 709 q 102 713 124 688 q 72 743 80 737 q 274 827 177 780 q 458 935 372 875 l 472 929 q 463 552 472 804 q 455 259 455 300 l 459 0 q 421 5 441 2 q 384 8 401 8 q 349 5 367 8 q 312 0 330 2 q 329 289 324 133 q 334 626 334 445 \"},\"ä\":{\"x_min\":43,\"x_max\":655.5,\"ha\":649,\"o\":\"m 234 -15 q 98 33 153 -15 q 43 162 43 82 q 106 303 43 273 q 303 364 169 333 q 444 448 437 395 q 403 568 444 521 q 288 616 362 616 q 191 587 233 616 q 124 507 149 559 l 95 520 l 104 591 q 202 651 144 631 q 323 672 261 672 q 500 622 444 672 q 557 455 557 573 l 557 133 q 567 69 557 84 q 618 54 577 54 q 655 58 643 54 l 655 26 q 594 5 626 14 q 537 -6 562 -3 q 438 85 453 -6 q 342 10 388 35 q 234 -15 296 -15 m 203 929 q 254 906 232 929 q 277 854 277 884 q 256 799 277 820 q 204 778 236 778 q 149 800 173 778 q 126 854 126 822 q 148 906 126 884 q 203 929 170 929 m 444 929 q 498 906 476 929 q 521 854 521 884 q 500 800 521 822 q 447 778 479 778 q 392 800 415 778 q 370 854 370 823 q 392 906 370 884 q 444 929 414 929 m 176 186 q 204 98 176 133 q 284 64 232 64 q 390 107 342 64 q 438 212 438 151 l 438 345 q 239 293 303 319 q 176 186 176 268 \"},\"<\":{\"x_min\":176,\"x_max\":961.109375,\"ha\":1139,\"o\":\"m 279 406 l 960 130 l 961 56 l 176 379 l 176 432 l 960 756 l 960 682 l 279 406 \"},\"£\":{\"x_min\":65,\"x_max\":728.890625,\"ha\":749,\"o\":\"m 67 47 l 65 98 l 116 101 q 203 168 176 112 q 231 292 231 224 q 227 375 231 330 q 221 444 223 420 q 139 441 171 444 q 76 432 107 439 l 78 479 l 76 503 q 105 495 92 498 q 134 493 117 493 l 219 493 q 212 550 214 522 q 209 609 209 578 q 304 825 209 742 q 537 909 399 909 q 633 896 592 909 q 723 864 673 884 q 666 731 694 809 l 656 731 q 605 825 641 791 q 512 859 570 859 q 383 796 427 859 q 340 646 340 734 l 345 493 l 366 493 q 523 502 450 493 l 521 466 l 526 434 q 438 441 493 439 q 345 444 383 444 l 345 378 q 310 238 345 302 q 213 107 275 173 q 527 113 421 107 q 728 134 633 119 l 721 66 q 728 0 721 34 q 542 3 666 0 q 358 8 419 8 q 176 3 285 8 q 65 0 67 0 l 67 47 \"},\"¹\":{\"x_min\":82,\"x_max\":347,\"ha\":496,\"o\":\"m 255 731 l 255 833 l 123 759 q 104 780 120 763 q 82 801 87 797 q 208 850 148 822 q 337 917 269 878 l 347 912 q 341 721 347 848 q 336 529 336 593 l 336 356 q 311 358 327 356 q 289 361 295 361 q 264 358 280 361 q 242 356 248 356 q 251 498 247 407 q 255 731 255 590 \"},\"t\":{\"x_min\":18,\"x_max\":415.21875,\"ha\":425,\"o\":\"m 18 586 l 22 630 l 18 654 q 133 643 80 643 q 131 732 133 669 q 129 799 129 796 q 199 827 163 811 q 263 863 234 843 q 252 758 255 811 q 250 643 250 705 q 334 645 310 643 q 401 654 358 647 l 398 618 l 401 586 q 248 594 323 594 l 243 258 l 243 162 q 272 76 243 109 q 353 43 301 43 q 387 44 369 43 q 415 48 405 46 l 415 4 q 349 -10 378 -5 q 290 -15 319 -15 q 174 18 221 -15 q 123 118 128 51 l 123 200 l 129 387 l 133 594 q 84 592 113 594 q 18 586 55 590 \"},\"λ\":{\"x_min\":2.78125,\"x_max\":652.78125,\"ha\":657,\"o\":\"m 302 670 q 227 871 262 803 q 111 940 193 940 q 78 937 94 940 q 20 924 62 934 l 20 978 q 96 1012 59 1000 q 170 1025 133 1025 q 329 947 287 1025 q 427 692 372 869 q 538 340 481 515 q 652 1 594 166 l 579 5 l 504 0 q 336 573 423 305 q 218 301 272 438 q 111 0 163 163 l 61 6 q 27 3 48 6 q 2 0 5 0 q 302 670 165 329 \"},\"ù\":{\"x_min\":90,\"x_max\":664,\"ha\":754,\"o\":\"m 653 498 q 653 329 653 443 q 653 158 653 215 q 664 0 653 81 q 631 3 647 1 q 598 5 616 5 q 563 3 583 5 q 533 0 544 1 l 538 118 q 440 18 494 52 q 312 -15 385 -15 q 148 50 201 -15 q 96 229 96 115 l 96 354 l 96 516 l 90 655 q 120 650 103 651 q 158 648 136 648 q 192 650 175 648 q 227 655 210 651 q 220 445 227 591 q 213 247 213 299 q 247 115 213 163 q 362 68 281 68 q 477 113 428 68 q 531 217 525 159 q 538 340 538 274 q 533 520 538 394 q 528 655 528 647 q 561 650 548 651 q 596 648 574 648 q 663 655 628 648 q 653 498 653 573 m 445 743 l 244 866 q 205 896 223 877 q 187 934 187 915 q 202 970 187 955 q 238 986 217 986 q 277 973 256 986 q 309 945 298 961 l 496 743 l 445 743 \"},\"W\":{\"x_min\":0,\"x_max\":1306.953125,\"ha\":1307,\"o\":\"m 0 932 q 47 927 31 929 q 76 926 62 926 q 121 929 88 926 q 155 931 154 931 q 262 547 200 750 l 380 171 q 470 437 415 272 q 552 693 525 602 q 619 931 580 784 l 672 926 q 700 928 684 926 q 726 931 716 930 q 825 604 787 727 q 883 419 862 482 q 969 171 904 357 l 1087 522 q 1143 720 1120 623 q 1187 931 1166 816 q 1221 929 1197 931 q 1247 926 1245 926 q 1280 928 1262 926 q 1306 931 1298 930 q 1131 467 1218 716 q 990 0 1045 217 q 963 4 980 1 q 937 7 947 7 q 904 3 925 7 q 880 0 883 0 q 761 385 831 184 l 641 733 l 491 287 q 402 0 438 133 q 370 3 391 0 q 344 7 350 7 q 315 4 327 7 q 287 0 302 2 q 206 296 252 142 q 122 568 161 450 q 0 932 83 686 \"},\"ï\":{\"x_min\":-25,\"x_max\":365.328125,\"ha\":340,\"o\":\"m 104 144 l 104 522 l 97 655 q 138 650 113 651 q 167 648 162 648 q 233 655 206 648 q 225 506 225 581 q 229 254 225 423 q 233 0 233 84 q 201 3 216 1 q 164 5 186 5 q 128 3 143 5 q 97 0 113 1 l 104 144 m 50 929 q 102 906 80 929 q 125 854 125 884 q 104 799 125 820 q 52 778 84 778 q -2 800 19 778 q -25 854 -25 822 q -4 906 -25 884 q 50 929 16 929 m 290 929 q 343 906 320 929 q 365 854 365 884 q 345 799 365 820 q 294 778 324 778 q 238 800 260 778 q 216 854 216 822 q 237 906 216 884 q 290 929 258 929 \"},\">\":{\"x_min\":176.390625,\"x_max\":963,\"ha\":1139,\"o\":\"m 963 379 l 176 56 l 176 130 l 858 406 l 176 682 l 176 756 l 962 432 l 963 379 \"},\"v\":{\"x_min\":0,\"x_max\":658.328125,\"ha\":654,\"o\":\"m 0 655 q 54 648 38 648 q 86 647 69 647 q 113 647 100 647 q 168 654 127 648 q 252 402 204 529 l 358 134 l 470 436 q 543 654 508 533 q 570 650 554 651 q 600 648 586 648 q 636 648 618 648 q 658 654 652 652 q 506 340 577 502 q 372 0 436 177 q 347 5 362 2 q 319 8 333 8 q 296 5 309 8 q 272 0 283 2 q 200 206 234 120 q 0 655 165 292 \"},\"τ\":{\"x_min\":30,\"x_max\":677,\"ha\":701,\"o\":\"m 423 573 l 419 303 q 423 146 419 250 q 428 0 428 42 q 394 4 410 2 q 359 5 378 5 q 333 4 343 5 q 289 0 323 4 l 298 194 l 294 573 q 156 553 207 573 q 57 472 105 534 q 30 559 49 522 q 149 626 82 609 q 307 644 216 644 l 510 644 q 604 647 545 644 q 677 651 664 651 l 671 610 q 677 566 671 586 q 527 569 618 566 q 423 573 436 573 \"},\"û\":{\"x_min\":90,\"x_max\":664,\"ha\":754,\"o\":\"m 653 498 q 653 328 653 442 q 653 158 653 215 q 664 0 653 81 q 631 3 647 1 q 598 5 616 5 q 563 3 583 5 q 533 0 544 1 l 538 118 q 440 18 494 52 q 312 -15 385 -15 q 148 50 201 -15 q 96 229 96 115 l 96 354 l 96 516 l 90 655 q 120 650 103 651 q 158 648 136 648 q 192 649 175 648 q 227 655 210 651 q 220 445 227 591 q 213 247 213 299 q 247 115 213 163 q 362 68 281 68 q 477 113 428 68 q 531 217 525 159 q 538 340 538 274 q 533 520 538 394 q 528 655 528 647 q 558 650 542 651 q 596 648 574 648 q 629 649 612 648 q 663 655 646 651 q 653 498 653 573 m 332 978 l 421 978 l 572 743 l 525 743 l 376 875 l 227 743 l 180 743 l 332 978 \"},\"ξ\":{\"x_min\":64,\"x_max\":654,\"ha\":656,\"o\":\"m 562 861 q 502 941 539 911 q 414 972 465 972 q 299 917 342 972 q 256 788 256 862 q 312 650 256 701 q 458 599 369 599 l 526 599 l 524 563 l 524 528 q 480 533 503 532 q 427 535 457 535 q 271 494 337 535 q 197 408 205 454 q 187 347 188 361 q 186 326 186 333 q 186 294 186 300 q 190 282 187 287 q 238 200 201 229 q 335 153 276 171 l 494 118 q 610 73 567 100 q 654 -13 654 46 q 628 -103 654 -60 q 511 -238 602 -146 l 466 -210 q 541 -121 530 -139 q 553 -75 553 -103 q 393 16 553 -18 q 149 92 234 50 q 64 276 64 133 q 130 462 64 379 q 299 575 197 544 q 175 652 222 600 q 128 780 128 704 q 213 954 128 883 q 405 1025 298 1025 q 507 1009 458 1025 q 609 965 555 994 q 585 914 600 945 q 562 861 571 883 \"},\"&\":{\"x_min\":76,\"x_max\":917.671875,\"ha\":975,\"o\":\"m 360 -18 q 160 41 245 -18 q 76 211 76 101 q 137 382 76 315 q 314 515 199 448 q 249 618 273 569 q 225 722 225 668 q 287 872 225 812 q 441 932 349 932 q 581 891 520 932 q 643 777 643 851 q 588 640 643 701 q 453 532 533 579 q 568 390 509 459 q 690 253 627 321 q 815 530 792 379 l 829 530 l 887 466 q 814 327 856 396 q 727 209 772 259 q 807 115 760 169 q 917 0 853 61 q 855 1 896 0 q 791 2 813 2 l 739 0 l 649 110 q 515 15 586 48 q 360 -18 445 -18 m 341 475 q 234 380 267 419 q 201 273 201 340 q 258 125 201 190 q 401 61 316 61 q 508 86 458 61 q 606 154 559 111 l 341 475 m 547 770 q 524 854 547 823 q 454 886 502 886 q 363 851 402 886 q 325 769 325 817 q 344 685 325 718 q 422 575 363 652 q 514 661 481 615 q 547 770 547 708 \"},\"Λ\":{\"x_min\":0,\"x_max\":852.78125,\"ha\":853,\"o\":\"m 662 452 l 778 172 l 852 0 l 769 5 q 734 4 747 5 q 679 0 722 4 q 647 102 661 55 q 605 226 633 148 l 547 383 l 401 777 l 266 429 q 191 213 226 319 q 125 0 157 108 l 62 2 l 0 0 q 205 459 95 191 q 380 932 315 726 q 404 927 393 929 q 431 926 416 926 q 459 929 441 926 q 487 932 477 932 q 548 743 511 850 q 662 452 586 637 \"},\"I\":{\"x_min\":109,\"x_max\":271,\"ha\":385,\"o\":\"m 127 465 q 123 711 127 620 q 109 932 120 803 q 154 927 129 929 q 190 925 179 925 q 238 928 209 925 q 271 931 266 931 q 263 788 271 887 q 256 659 256 690 l 256 448 l 256 283 q 263 135 256 238 q 271 0 271 31 q 231 3 258 0 q 190 8 204 8 q 151 5 172 8 q 109 0 129 2 q 118 239 109 70 q 127 465 127 408 \"},\"G\":{\"x_min\":51,\"x_max\":942,\"ha\":1001,\"o\":\"m 581 -15 q 198 107 345 -15 q 51 459 51 229 q 196 815 51 680 q 566 950 342 950 q 755 929 659 950 q 930 869 852 909 q 906 802 916 836 q 895 737 897 769 l 874 737 q 739 855 808 818 q 571 893 670 893 q 305 770 406 893 q 204 479 204 647 q 298 168 204 291 q 577 46 393 46 q 689 56 640 46 q 790 94 738 66 q 794 184 790 123 q 798 251 798 246 q 794 337 798 280 q 790 423 790 394 q 830 417 821 418 q 863 416 838 416 q 901 419 880 416 q 941 425 923 422 l 936 236 q 939 121 936 201 q 942 37 942 41 q 757 -1 843 11 q 581 -15 672 -15 \"},\"ΰ\":{\"x_min\":79,\"x_max\":703,\"ha\":774,\"o\":\"m 703 395 q 595 110 703 236 q 332 -15 488 -15 q 145 54 211 -15 q 79 244 79 123 l 83 430 q 81 542 83 486 q 79 654 80 598 l 146 650 l 217 654 q 209 502 217 608 q 202 365 202 397 l 202 261 q 240 105 202 168 q 369 43 279 43 q 523 132 476 43 q 571 340 571 222 q 548 493 571 418 q 488 645 526 568 q 550 647 529 645 q 627 658 571 650 q 703 395 703 537 m 209 865 q 250 846 232 865 q 269 804 269 828 q 251 761 269 780 q 209 743 234 743 q 166 761 184 743 q 148 804 148 779 q 166 846 148 828 q 209 865 184 865 m 361 929 q 378 969 368 956 q 414 982 388 982 q 458 941 458 982 q 446 904 458 919 l 338 743 l 306 743 l 361 929 m 513 865 q 555 846 537 865 q 573 804 573 828 q 555 761 573 779 q 513 743 537 743 q 470 761 487 743 q 454 804 454 779 q 470 846 454 828 q 513 865 487 865 \"},\"`\":{\"x_min\":86.5,\"x_max\":303.171875,\"ha\":374,\"o\":\"m 222 659 q 194 595 214 622 q 140 568 175 568 q 86 613 86 568 q 96 660 86 636 q 122 706 107 684 l 271 950 l 303 940 l 222 659 \"},\"Υ\":{\"x_min\":-28,\"x_max\":746,\"ha\":707,\"o\":\"m 297 177 l 297 386 q 191 570 256 458 q 84 750 125 682 q -28 932 42 819 q 24 928 -9 932 q 63 925 59 925 q 112 927 91 925 q 146 932 134 930 q 207 800 174 866 q 275 676 239 735 l 389 475 q 509 688 451 575 q 627 932 567 801 l 683 926 q 715 927 701 926 q 746 932 729 929 q 555 627 640 769 l 432 415 l 432 240 q 435 101 432 198 q 438 0 438 5 q 401 4 426 1 q 361 6 376 6 q 319 4 334 6 q 284 0 304 2 q 292 88 288 36 q 297 177 297 140 \"},\"r\":{\"x_min\":89,\"x_max\":465.390625,\"ha\":488,\"o\":\"m 99 120 l 99 400 l 99 433 q 91 654 99 548 q 125 648 114 650 q 162 647 136 647 q 232 654 195 647 q 223 588 226 626 q 220 516 220 550 q 313 628 264 589 q 437 668 362 668 l 465 668 l 459 604 l 465 537 q 427 544 448 541 q 383 551 407 548 q 256 482 292 551 q 220 312 220 413 q 222 131 220 256 q 225 0 225 6 l 157 6 l 89 0 l 99 120 \"},\"x\":{\"x_min\":1,\"x_max\":635,\"ha\":632,\"o\":\"m 264 316 l 158 461 q 78 563 120 508 q 5 655 36 619 q 97 647 51 647 q 141 649 120 647 q 177 654 162 651 q 249 538 214 592 q 334 415 284 484 q 420 533 377 473 q 501 654 464 592 q 523 650 508 652 q 550 647 539 648 q 616 654 582 647 l 371 365 q 477 210 434 267 q 635 0 519 152 q 587 3 616 0 q 551 6 558 6 q 501 4 523 6 q 465 0 479 1 q 380 140 407 98 q 295 264 352 183 q 172 84 194 117 q 123 0 151 51 l 66 5 q 33 2 55 5 q 1 0 10 0 q 131 154 63 72 q 264 316 199 236 \"},\"è\":{\"x_min\":40,\"x_max\":646.9375,\"ha\":681,\"o\":\"m 407 42 q 602 130 523 42 l 621 130 q 613 93 617 112 q 609 47 609 73 q 496 0 558 14 q 369 -15 435 -15 q 130 73 220 -15 q 40 311 40 162 q 126 562 40 456 q 355 669 212 669 q 564 590 481 669 q 646 386 646 512 l 644 331 q 438 333 562 331 q 313 335 315 335 l 179 331 q 235 127 179 212 q 407 42 291 42 m 407 743 l 208 866 q 166 895 183 880 q 149 934 149 911 q 167 967 149 949 q 202 986 185 986 q 243 969 220 986 q 273 945 266 952 l 457 743 l 407 743 m 513 392 l 513 437 q 470 563 513 509 q 356 618 427 618 q 233 552 271 618 q 183 390 195 487 l 513 392 \"},\"μ\":{\"x_min\":84,\"x_max\":669.109375,\"ha\":754,\"o\":\"m 331 -15 q 265 -7 292 -15 q 210 19 238 0 l 208 -128 q 211 -266 208 -178 q 214 -373 214 -354 q 183 -369 198 -370 q 150 -368 168 -368 q 114 -370 133 -368 q 84 -373 95 -372 q 89 -165 84 -304 q 94 43 94 -26 q 89 363 94 149 q 84 655 84 578 q 150 647 118 647 q 219 654 180 647 q 213 495 219 601 q 208 334 208 390 q 232 155 208 227 q 339 75 256 83 q 471 112 419 75 q 531 212 523 150 q 539 332 539 273 q 536 518 539 388 q 533 655 533 648 q 600 647 568 647 q 669 654 629 647 q 660 477 662 566 q 658 257 658 389 q 660 113 658 171 q 669 -1 662 55 l 602 4 l 537 -1 l 539 106 q 449 17 502 50 q 331 -15 397 -15 \"},\"÷\":{\"x_min\":169,\"x_max\":969,\"ha\":1139,\"o\":\"m 641 643 q 618 593 641 615 q 566 571 596 571 q 518 592 538 571 q 498 643 498 613 q 518 692 498 670 q 567 715 539 715 q 610 703 579 715 q 641 643 641 691 m 969 374 l 169 374 l 169 441 l 969 441 l 969 374 m 641 170 q 619 120 641 141 q 570 100 598 100 q 519 120 540 100 q 498 170 498 141 q 518 221 498 199 q 568 243 538 243 q 604 235 584 243 q 632 214 624 227 q 641 170 641 201 \"},\"h\":{\"x_min\":92,\"x_max\":665,\"ha\":758,\"o\":\"m 102 136 l 102 859 q 100 934 102 894 q 94 1025 98 975 q 136 1018 126 1019 q 158 1018 146 1018 q 226 1025 188 1018 q 222 957 223 1001 q 221 888 221 913 l 221 868 l 221 543 q 322 637 264 602 q 450 672 380 672 q 608 606 558 672 q 659 429 659 541 l 659 298 l 659 136 l 665 0 q 633 3 648 1 q 597 5 617 5 q 560 3 580 5 q 529 0 540 1 q 534 202 529 68 q 540 405 540 337 q 503 533 540 481 q 394 586 467 586 q 256 508 291 586 q 221 313 221 430 q 224 133 221 244 q 227 0 227 22 q 188 3 211 0 q 161 6 164 6 q 123 4 137 6 q 92 0 108 2 l 102 136 \"},\".\":{\"x_min\":100,\"x_max\":274,\"ha\":374,\"o\":\"m 187 156 q 248 130 223 156 q 274 68 274 105 q 248 8 274 32 q 187 -15 223 -15 q 125 8 150 -15 q 100 68 100 32 q 125 130 100 105 q 187 156 150 156 \"},\"φ\":{\"x_min\":39,\"x_max\":965,\"ha\":1006,\"o\":\"m 578 -371 q 505 -362 539 -362 q 465 -365 483 -362 q 427 -372 446 -368 q 433 -163 427 -298 q 440 -11 440 -29 q 156 76 274 -11 q 39 327 39 163 q 145 571 39 486 q 410 656 252 656 q 412 635 411 645 q 413 615 413 625 q 235 516 292 580 q 179 327 179 451 q 247 118 179 197 q 442 39 316 39 l 444 197 l 444 311 q 444 400 444 340 q 444 491 444 461 q 514 619 452 570 q 657 668 577 668 q 879 568 794 668 q 965 332 965 469 q 850 84 965 169 q 563 -14 735 0 q 570 -203 563 -71 q 578 -371 578 -334 m 826 347 q 794 534 826 451 q 677 617 763 617 q 592 572 621 617 q 563 470 563 527 l 559 350 l 563 39 q 759 126 693 39 q 826 347 826 213 \"},\";\":{\"x_min\":72.609375,\"x_max\":312,\"ha\":446,\"o\":\"m 224 636 q 287 611 262 636 q 312 548 312 586 q 287 486 312 511 q 224 461 262 461 q 162 486 188 461 q 137 548 137 512 q 162 611 137 586 q 224 636 187 636 m 164 75 q 198 157 182 140 q 244 175 214 175 q 304 119 304 175 q 296 75 304 93 q 262 18 287 56 l 103 -243 l 72 -231 l 164 75 \"},\"f\":{\"x_min\":12,\"x_max\":432.546875,\"ha\":397,\"o\":\"m 127 324 l 127 597 q 66 595 92 597 q 12 588 39 594 l 14 626 l 12 654 q 79 648 38 649 q 127 647 121 647 q 192 901 127 777 q 378 1025 257 1025 q 409 1022 400 1025 q 432 1015 418 1019 l 415 896 q 371 911 395 905 q 325 918 347 918 q 252 886 278 918 q 227 805 227 855 q 235 713 227 760 q 246 647 243 665 q 330 650 276 647 q 396 654 384 654 q 391 642 393 647 q 389 633 389 637 l 388 622 l 389 610 q 396 589 389 609 q 323 595 357 594 q 246 597 289 597 l 246 366 q 250 183 246 305 q 254 0 254 60 q 213 3 238 0 q 183 6 187 6 q 144 4 161 6 q 116 0 127 1 q 121 160 116 52 q 127 324 127 269 \"},\"“\":{\"x_min\":83.71875,\"x_max\":550.390625,\"ha\":625,\"o\":\"m 471 659 q 441 593 458 618 q 389 568 424 568 q 350 579 365 568 q 335 613 335 591 q 346 660 335 633 q 371 706 358 687 l 519 950 l 550 940 l 471 659 m 221 659 q 192 593 211 618 q 137 568 174 568 q 83 613 83 568 q 93 658 83 637 q 119 706 103 680 l 268 950 l 300 940 l 221 659 \"},\"A\":{\"x_min\":-15.28125,\"x_max\":838.890625,\"ha\":825,\"o\":\"m 257 639 l 387 950 q 402 945 395 947 q 417 944 409 944 q 452 950 437 944 q 576 629 536 733 q 686 359 617 526 q 838 0 755 192 q 789 3 820 0 q 751 6 758 6 q 700 4 723 6 q 663 0 677 1 q 600 199 622 137 q 543 353 579 260 l 377 358 l 215 353 l 162 205 q 130 110 145 160 q 101 0 115 59 l 44 5 q 6 2 20 5 q -15 0 -8 0 q 76 211 30 105 q 158 404 121 318 q 257 639 195 490 m 378 419 l 513 425 l 379 761 l 246 425 l 378 419 \"},\"6\":{\"x_min\":64,\"x_max\":692,\"ha\":749,\"o\":\"m 464 859 q 267 730 324 859 q 210 442 210 602 q 315 514 262 488 q 431 540 367 540 q 618 462 545 540 q 692 270 692 385 q 604 65 692 145 q 390 -15 516 -15 q 142 93 221 -15 q 64 377 64 201 q 167 745 64 581 q 462 909 270 909 q 524 905 501 909 q 579 890 547 902 l 574 827 q 521 851 547 844 q 464 859 495 859 m 554 258 q 510 409 554 347 q 380 471 466 471 q 255 409 300 471 q 210 264 210 348 q 253 105 210 172 q 384 39 297 39 q 485 73 441 39 q 540 148 529 108 q 552 206 551 187 q 554 258 554 225 \"},\"‘\":{\"x_min\":86.5,\"x_max\":303.171875,\"ha\":374,\"o\":\"m 224 659 q 193 594 212 620 q 140 568 174 568 q 86 615 86 568 q 98 660 86 633 q 122 708 110 687 l 271 951 l 303 942 l 224 659 \"},\"ϊ\":{\"x_min\":-29,\"x_max\":362,\"ha\":342,\"o\":\"m 104 333 l 104 520 q 103 566 104 544 q 96 654 102 588 q 140 647 130 648 q 165 647 151 647 q 232 654 195 647 q 224 555 225 599 q 223 437 223 511 l 223 406 q 228 194 223 337 q 233 0 233 51 q 201 3 216 1 q 165 5 185 5 q 127 3 148 5 q 96 0 107 1 q 100 165 96 51 q 104 333 104 279 m 45 928 q 99 907 77 928 q 122 853 122 886 q 101 800 122 822 q 48 778 80 778 q -6 800 15 778 q -29 853 -29 822 q -7 906 -29 884 q 45 928 13 928 m 286 928 q 340 906 318 928 q 362 853 362 884 q 341 799 362 821 q 289 778 321 778 q 235 800 257 778 q 213 853 213 822 q 233 905 213 883 q 286 928 254 928 \"},\"π\":{\"x_min\":19,\"x_max\":957,\"ha\":989,\"o\":\"m 702 5 l 635 0 q 639 114 635 44 q 643 196 643 185 l 643 575 l 508 575 l 373 575 l 369 284 q 373 143 369 236 q 377 0 377 50 q 345 3 360 1 q 309 5 329 5 q 271 3 292 5 q 239 0 250 1 l 248 196 l 243 575 q 130 553 171 575 q 43 472 89 532 q 19 559 35 519 q 139 627 71 611 q 305 644 207 644 l 658 644 l 852 644 l 957 651 l 951 610 l 957 566 l 769 575 l 765 310 q 769 154 765 257 q 773 0 773 51 q 739 3 755 1 q 702 5 724 5 \"},\"ά\":{\"x_min\":41,\"x_max\":827.109375,\"ha\":846,\"o\":\"m 705 352 q 803 -1 763 155 l 739 1 l 673 -1 l 632 172 q 521 36 593 87 q 356 -15 448 -15 q 129 81 217 -15 q 41 316 41 177 q 130 569 41 467 q 368 672 220 672 q 537 622 464 672 q 659 486 610 573 q 711 654 691 569 l 770 650 l 827 654 q 763 505 792 576 q 705 352 734 434 m 518 943 q 552 974 536 964 q 589 985 568 985 q 626 969 611 985 q 641 932 641 953 q 627 897 641 911 q 585 866 613 883 l 384 743 l 335 743 l 518 943 m 377 619 q 226 530 272 619 q 181 326 181 442 q 223 124 181 214 q 367 34 265 34 q 528 137 480 34 q 601 323 577 240 q 527 531 578 444 q 377 619 475 619 \"},\"O\":{\"x_min\":51,\"x_max\":1068,\"ha\":1119,\"o\":\"m 51 465 q 192 820 51 690 q 559 950 333 950 q 892 853 754 950 q 1047 654 1031 757 q 1065 525 1062 551 q 1068 462 1068 500 q 1065 402 1068 426 q 1047 277 1062 379 q 894 80 1031 175 q 560 -15 756 -15 q 447 -10 496 -15 q 304 29 398 -5 q 130 186 210 64 q 51 465 51 308 m 202 468 q 290 162 202 282 q 559 42 379 42 q 826 162 738 42 q 915 468 915 283 q 825 770 915 651 q 559 889 735 889 q 348 826 429 889 q 225 639 267 764 q 202 468 202 552 \"},\"n\":{\"x_min\":89,\"x_max\":661,\"ha\":754,\"o\":\"m 99 155 l 99 495 q 97 569 99 530 q 91 655 95 608 q 153 648 122 648 l 219 656 l 218 539 q 319 635 260 599 q 451 672 378 672 q 591 624 528 672 q 654 501 654 576 l 654 299 l 654 136 l 661 0 q 629 3 644 1 q 593 5 613 5 q 556 3 576 5 q 525 0 536 1 q 530 222 525 80 q 535 406 535 364 q 501 536 535 485 q 389 587 467 587 q 253 508 288 587 q 218 313 218 430 q 220 132 218 258 q 222 0 222 6 q 184 3 208 0 q 155 6 159 6 q 117 3 141 6 q 89 0 93 0 l 99 155 \"},\"3\":{\"x_min\":75,\"x_max\":644,\"ha\":749,\"o\":\"m 241 465 l 238 512 l 294 510 q 424 554 375 510 q 474 680 474 599 q 434 805 474 754 q 322 856 394 856 q 220 818 257 856 q 164 711 183 780 l 153 706 q 127 767 136 747 q 99 819 118 788 q 220 886 162 863 q 348 909 278 909 q 526 857 450 909 q 603 706 603 805 q 542 564 603 617 q 383 479 482 511 q 567 423 490 479 q 644 262 644 366 q 542 55 644 129 q 302 -18 441 -18 q 183 -6 240 -18 q 75 32 127 5 q 99 189 91 116 l 113 188 q 182 73 136 115 q 302 31 229 31 q 448 92 392 31 q 505 246 505 154 q 451 389 505 333 q 312 446 398 446 q 238 435 279 446 l 241 465 \"},\"9\":{\"x_min\":57,\"x_max\":688,\"ha\":749,\"o\":\"m 261 38 q 475 166 405 38 q 546 451 546 295 q 442 378 494 403 q 325 354 389 354 q 132 428 208 354 q 57 617 57 502 q 148 828 57 748 q 372 909 240 909 q 612 801 536 909 q 688 520 688 693 q 574 143 688 305 q 252 -18 461 -18 q 186 -14 211 -18 q 127 0 161 -11 l 113 90 q 180 51 143 64 q 261 38 218 38 m 372 419 q 501 482 457 419 q 546 634 546 545 q 504 790 546 725 q 373 855 462 855 q 238 791 284 855 q 193 637 193 727 q 238 482 193 545 q 372 419 284 419 \"},\"l\":{\"x_min\":100,\"x_max\":237.5,\"ha\":342,\"o\":\"m 107 118 l 107 881 q 104 965 107 915 q 101 1025 101 1016 q 169 1018 138 1018 q 237 1025 203 1018 q 228 872 230 948 q 226 684 226 797 l 226 512 l 232 111 l 237 0 q 205 3 220 1 q 169 5 189 5 q 131 3 152 5 q 100 0 111 1 l 107 118 \"},\"κ\":{\"x_min\":97,\"x_max\":677.5625,\"ha\":683,\"o\":\"m 104 365 q 100 531 104 428 q 97 655 97 634 q 164 647 134 647 q 231 654 196 647 q 227 516 231 608 q 223 377 223 425 l 258 377 q 386 498 323 431 q 528 654 449 565 q 588 647 563 647 q 640 647 613 647 q 672 652 662 651 l 358 387 l 548 165 q 608 93 577 127 q 677 19 638 59 l 677 0 q 628 3 659 0 q 591 6 596 6 q 544 3 567 6 q 510 0 520 0 q 437 100 477 47 q 360 196 398 153 l 269 308 l 252 323 l 223 326 q 227 163 223 274 q 231 0 231 52 l 164 5 l 97 0 q 100 208 97 77 q 104 365 104 339 \"},\"4\":{\"x_min\":39,\"x_max\":691.78125,\"ha\":749,\"o\":\"m 453 252 l 177 257 l 39 253 l 39 291 q 204 522 111 392 q 345 721 297 653 q 475 906 394 789 l 527 906 l 581 906 q 575 805 581 872 q 569 705 569 739 l 569 343 l 598 343 q 644 344 620 343 q 690 350 667 345 l 683 297 q 686 270 683 287 q 691 244 689 254 q 568 253 629 253 l 568 137 l 569 0 l 505 6 l 437 0 q 450 120 447 51 q 453 252 453 190 m 453 767 l 344 626 q 230 465 298 562 q 144 343 162 368 l 453 343 l 453 767 \"},\"p\":{\"x_min\":83,\"x_max\":702,\"ha\":758,\"o\":\"m 91 -106 q 89 202 91 47 q 87 513 88 358 l 83 655 q 109 650 95 652 q 146 648 124 648 q 177 650 165 648 q 213 655 188 651 q 202 535 202 591 q 297 637 246 602 q 425 672 349 672 q 630 567 558 672 q 702 322 702 463 q 629 84 702 183 q 423 -15 556 -15 q 210 99 287 -15 l 210 -101 q 214 -244 210 -148 q 219 -373 219 -340 q 185 -369 201 -370 q 151 -368 170 -368 q 130 -368 138 -368 q 83 -373 123 -368 q 87 -240 83 -329 q 91 -106 91 -151 m 384 596 q 245 514 289 596 q 202 328 202 433 q 244 134 202 220 q 383 48 286 48 q 520 131 478 48 q 563 322 563 215 q 519 509 563 423 q 384 596 475 596 \"},\"ψ\":{\"x_min\":78,\"x_max\":1002,\"ha\":1038,\"o\":\"m 78 294 l 82 477 l 82 654 l 145 650 l 215 654 q 209 517 215 605 q 203 421 203 430 l 203 341 q 264 117 203 197 q 465 38 325 38 l 468 260 q 461 535 468 342 q 455 786 455 729 q 496 779 479 782 q 526 776 513 776 q 566 780 545 776 q 600 786 587 784 q 591 496 600 690 q 583 270 583 302 l 587 38 q 791 132 715 38 q 867 357 867 227 q 824 641 867 506 q 885 645 857 641 q 960 656 912 648 q 1002 419 1002 544 q 891 118 1002 231 q 587 -13 780 5 l 591 -221 l 600 -372 q 561 -365 578 -367 q 526 -363 543 -363 q 491 -366 511 -363 q 455 -372 471 -369 q 461 -162 455 -302 q 468 -13 468 -22 q 194 64 310 -13 q 78 294 78 142 \"},\"Ü\":{\"x_min\":101,\"x_max\":919.0625,\"ha\":1015,\"o\":\"m 182 927 l 262 931 q 250 805 253 854 q 247 697 247 757 l 247 457 q 314 136 247 212 q 516 60 381 60 q 733 130 654 60 q 813 336 813 201 l 813 458 l 813 657 q 799 931 813 802 l 859 927 l 919 931 q 905 770 909 863 q 901 600 901 677 l 901 366 q 792 82 901 179 q 491 -15 684 -15 q 211 66 307 -15 q 116 325 116 148 l 116 426 l 116 698 q 112 805 116 757 q 101 931 109 854 l 182 927 m 410 1208 q 462 1186 442 1208 q 483 1133 483 1164 q 460 1081 483 1105 q 410 1058 438 1058 q 356 1080 379 1058 q 334 1133 334 1103 q 356 1185 334 1163 q 410 1208 378 1208 m 650 1208 q 704 1187 682 1208 q 727 1133 727 1166 q 704 1080 727 1103 q 650 1058 681 1058 q 598 1078 620 1058 q 576 1133 576 1099 q 598 1185 576 1163 q 650 1208 620 1208 \"},\"à\":{\"x_min\":43,\"x_max\":655.5,\"ha\":649,\"o\":\"m 234 -15 q 98 33 153 -15 q 43 162 43 82 q 106 303 43 273 q 303 364 169 333 q 444 448 437 395 q 403 568 444 521 q 288 616 362 616 q 191 587 233 616 q 124 507 149 559 l 95 520 l 104 591 q 202 651 144 631 q 323 672 261 672 q 500 622 444 672 q 557 455 557 573 l 557 133 q 567 69 557 84 q 618 54 577 54 q 655 58 643 54 l 655 26 q 594 5 626 14 q 537 -6 562 -3 q 438 85 453 -6 q 342 10 388 35 q 234 -15 296 -15 m 392 743 l 191 866 q 152 896 170 877 q 133 934 133 915 q 148 970 133 955 q 186 986 163 986 q 222 972 200 986 q 254 945 245 958 l 442 743 l 392 743 m 176 186 q 204 98 176 133 q 284 64 232 64 q 390 107 342 64 q 438 212 438 151 l 438 345 q 239 293 303 319 q 176 186 176 268 \"},\"η\":{\"x_min\":91,\"x_max\":662,\"ha\":754,\"o\":\"m 594 -365 q 557 -366 577 -365 q 526 -369 537 -368 q 531 -189 526 -310 q 537 -7 537 -68 l 537 406 q 503 536 537 485 q 391 587 469 587 q 255 508 290 587 q 220 315 220 430 q 222 133 220 259 q 224 1 224 8 l 158 6 l 91 1 l 101 156 l 101 495 q 97 584 101 527 q 93 655 93 640 q 119 650 105 652 q 155 648 134 648 q 185 650 175 648 q 221 655 195 651 l 220 538 q 321 637 265 602 q 452 672 378 672 q 604 603 552 672 q 656 430 656 535 l 656 329 l 656 -186 q 659 -293 656 -227 q 662 -370 662 -359 q 630 -366 645 -368 q 594 -365 614 -365 \"}},\"cssFontWeight\":\"normal\",\"ascender\":1267,\"underlinePosition\":-133,\"cssFontStyle\":\"normal\",\"boundingBox\":{\"yMin\":-373.75,\"xMin\":-71,\"yMax\":1267,\"xMax\":1511},\"resolution\":1000,\"original_font_information\":{\"postscript_name\":\"Optimer-Regular\",\"version_string\":\"Version 1.00 2004 initial release\",\"vendor_url\":\"http://www.magenta.gr/\",\"full_font_name\":\"Optimer\",\"font_family_name\":\"Optimer\",\"copyright\":\"Copyright (c) Magenta Ltd., 2004\",\"description\":\"\",\"trademark\":\"\",\"designer\":\"\",\"designer_url\":\"\",\"unique_font_identifier\":\"Magenta Ltd.:Optimer:22-10-104\",\"license_url\":\"http://www.ellak.gr/fonts/MgOpen/license.html\",\"license_description\":\"Copyright (c) 2004 by MAGENTA Ltd. All Rights Reserved.\\r\\n\\r\\nPermission is hereby granted, free of charge, to any person obtaining a copy of the fonts accompanying this license (\\\"Fonts\\\") and associated documentation files (the \\\"Font Software\\\"), to reproduce and distribute the Font Software, including without limitation the rights to use, copy, merge, publish, distribute, and/or sell copies of the Font Software, and to permit persons to whom the Font Software is furnished to do so, subject to the following conditions: \\r\\n\\r\\nThe above copyright and this permission notice shall be included in all copies of one or more of the Font Software typefaces.\\r\\n\\r\\nThe Font Software may be modified, altered, or added to, and in particular the designs of glyphs or characters in the Fonts may be modified and additional glyphs or characters may be added to the Fonts, only if the fonts are renamed to names not containing the word \\\"MgOpen\\\", or if the modifications are accepted for inclusion in the Font Software itself by the each appointed Administrator.\\r\\n\\r\\nThis License becomes null and void to the extent applicable to Fonts or Font Software that has been modified and is distributed under the \\\"MgOpen\\\" name.\\r\\n\\r\\nThe Font Software may be sold as part of a larger software package but no copy of one or more of the Font Software typefaces may be sold by itself. \\r\\n\\r\\nTHE FONT SOFTWARE IS PROVIDED \\\"AS IS\\\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL MAGENTA OR PERSONS OR BODIES IN CHARGE OF ADMINISTRATION AND MAINTENANCE OF THE FONT SOFTWARE BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE.\",\"manufacturer_name\":\"Magenta Ltd.\",\"font_sub_family_name\":\"Regular\"},\"descender\":-374,\"familyName\":\"Optimer\",\"lineHeight\":1640,\"underlineThickness\":20}"
  },
  {
    "path": "examples/resources/lensflare/LICENSE.txt",
    "content": "lensflare0.png\nlensflare1.png\nlensflare2.png\nlensflare3.png\n\n3D assets and textures for ROME \"3 Dreams of Black\" at http://www.ro.me are licensed \nunder a Creative CommonsAttribution-NonCommercial-ShareAlike 3.0 Unported License\n( http://creativecommons.org/licenses/by-nc-sa/3.0/ ).\n\n---------------------------------------------------------------------------\nhexangle.png\n\nCC0 - Public Domain Donation by hackcraft.de\n\nhttp://opengameart.org/content/lens-flares-and-particles\nhttp://creativecommons.org/publicdomain/zero/1.0/\n"
  },
  {
    "path": "examples/resources/models/assimp/interior/interior.assimp.json",
    "content": "{\n\t \"__metadata__\": {\n\t \t \"format\" : \"assimp2json\"\n\t \t,\"version\": 100\n\t}\n\t,\"rootnode\": {\n\t\t \"name\": \"<3DSRoot>\"\n\t\t,\"transformation\": [\n\t\t\t 1\n\t\t\t,0\n\t\t\t,0\n\t\t\t,0\n\t\t\t,0\n\t\t\t,1\n\t\t\t,0\n\t\t\t,0\n\t\t\t,0\n\t\t\t,0\n\t\t\t,1\n\t\t\t,0\n\t\t\t,0\n\t\t\t,0\n\t\t\t,0\n\t\t\t,1\n\t\t]\n\t\t,\"children\": [\n\t\t\t{\n\t\t\t\t \"name\": \"Box01\"\n\t\t\t\t,\"transformation\": [\n\t\t\t\t\t -1.20922e-008\n\t\t\t\t\t,0.101437\n\t\t\t\t\t,9.06915e-009\n\t\t\t\t\t,-0.243822\n\t\t\t\t\t,0\n\t\t\t\t\t,-1.20922e-008\n\t\t\t\t\t,0.101437\n\t\t\t\t\t,0.00185142\n\t\t\t\t\t,0.101437\n\t\t\t\t\t,9.06915e-009\n\t\t\t\t\t,0\n\t\t\t\t\t,0.0490567\n\t\t\t\t\t,0\n\t\t\t\t\t,0\n\t\t\t\t\t,0\n\t\t\t\t\t,1\n\t\t\t\t]\n\t\t\t\t,\"meshes\": [\n\t\t\t\t\t 0\n\t\t\t\t]\n\t\t\t}\n\t\t\t,{\n\t\t\t\t \"name\": \"Box02\"\n\t\t\t\t,\"transformation\": [\n\t\t\t\t\t -1.20922e-008\n\t\t\t\t\t,0.101437\n\t\t\t\t\t,9.06915e-009\n\t\t\t\t\t,-0.0708746\n\t\t\t\t\t,0\n\t\t\t\t\t,-1.20922e-008\n\t\t\t\t\t,0.101437\n\t\t\t\t\t,0.00185238\n\t\t\t\t\t,0.101437\n\t\t\t\t\t,9.06915e-009\n\t\t\t\t\t,0\n\t\t\t\t\t,-9.95899\n\t\t\t\t\t,0\n\t\t\t\t\t,0\n\t\t\t\t\t,0\n\t\t\t\t\t,1\n\t\t\t\t]\n\t\t\t\t,\"meshes\": [\n\t\t\t\t\t 1\n\t\t\t\t]\n\t\t\t}\n\t\t\t,{\n\t\t\t\t \"name\": \"Box04\"\n\t\t\t\t,\"transformation\": [\n\t\t\t\t\t 0.101437\n\t\t\t\t\t,1.80188e-016\n\t\t\t\t\t,4.43394e-009\n\t\t\t\t\t,9.64867\n\t\t\t\t\t,-4.43394e-009\n\t\t\t\t\t,6.0461e-009\n\t\t\t\t\t,0.101437\n\t\t\t\t\t,0.0018519\n\t\t\t\t\t,-1.80188e-016\n\t\t\t\t\t,-0.101437\n\t\t\t\t\t,6.0461e-009\n\t\t\t\t\t,0.0215668\n\t\t\t\t\t,0\n\t\t\t\t\t,0\n\t\t\t\t\t,0\n\t\t\t\t\t,1\n\t\t\t\t]\n\t\t\t\t,\"meshes\": [\n\t\t\t\t\t 3\n\t\t\t\t]\n\t\t\t}\n\t\t\t,{\n\t\t\t\t \"name\": \"Box05\"\n\t\t\t\t,\"transformation\": [\n\t\t\t\t\t 0.0522438\n\t\t\t\t\t,0.0869483\n\t\t\t\t\t,6.0461e-009\n\t\t\t\t\t,4.86169\n\t\t\t\t\t,-6.0461e-009\n\t\t\t\t\t,0\n\t\t\t\t\t,0.101437\n\t\t\t\t\t,0.00185238\n\t\t\t\t\t,0.0869483\n\t\t\t\t\t,-0.0522438\n\t\t\t\t\t,6.0461e-009\n\t\t\t\t\t,-7.55933\n\t\t\t\t\t,0\n\t\t\t\t\t,0\n\t\t\t\t\t,0\n\t\t\t\t\t,1\n\t\t\t\t]\n\t\t\t\t,\"meshes\": [\n\t\t\t\t\t 2\n\t\t\t\t]\n\t\t\t}\n\t\t\t,{\n\t\t\t\t \"name\": \"Box06\"\n\t\t\t\t,\"transformation\": [\n\t\t\t\t\t 0.0468383\n\t\t\t\t\t,0.0899755\n\t\t\t\t\t,0\n\t\t\t\t\t,6.39023\n\t\t\t\t\t,-9.06915e-009\n\t\t\t\t\t,6.0461e-009\n\t\t\t\t\t,0.101437\n\t\t\t\t\t,0.00185238\n\t\t\t\t\t,0.0899755\n\t\t\t\t\t,-0.0468383\n\t\t\t\t\t,1.20922e-008\n\t\t\t\t\t,-5.19486\n\t\t\t\t\t,0\n\t\t\t\t\t,0\n\t\t\t\t\t,0\n\t\t\t\t\t,1\n\t\t\t\t]\n\t\t\t\t,\"meshes\": [\n\t\t\t\t\t 2\n\t\t\t\t]\n\t\t\t}\n\t\t\t,{\n\t\t\t\t \"name\": \"Box07\"\n\t\t\t\t,\"transformation\": [\n\t\t\t\t\t 0.0723498\n\t\t\t\t\t,0.071098\n\t\t\t\t\t,0\n\t\t\t\t\t,5.66533\n\t\t\t\t\t,-6.0461e-009\n\t\t\t\t\t,0\n\t\t\t\t\t,0.101437\n\t\t\t\t\t,2.0261\n\t\t\t\t\t,0.071098\n\t\t\t\t\t,-0.0723498\n\t\t\t\t\t,0\n\t\t\t\t\t,-6.25246\n\t\t\t\t\t,0\n\t\t\t\t\t,0\n\t\t\t\t\t,0\n\t\t\t\t\t,1\n\t\t\t\t]\n\t\t\t\t,\"meshes\": [\n\t\t\t\t\t 2\n\t\t\t\t]\n\t\t\t}\n\t\t\t,{\n\t\t\t\t \"name\": \"Box08\"\n\t\t\t\t,\"transformation\": [\n\t\t\t\t\t 1.20922e-008\n\t\t\t\t\t,-0.101437\n\t\t\t\t\t,0\n\t\t\t\t\t,-0.427656\n\t\t\t\t\t,0\n\t\t\t\t\t,0\n\t\t\t\t\t,0.101437\n\t\t\t\t\t,0.00185095\n\t\t\t\t\t,-0.101437\n\t\t\t\t\t,-1.81383e-008\n\t\t\t\t\t,0\n\t\t\t\t\t,10.0504\n\t\t\t\t\t,0\n\t\t\t\t\t,0\n\t\t\t\t\t,0\n\t\t\t\t\t,1\n\t\t\t\t]\n\t\t\t\t,\"meshes\": [\n\t\t\t\t\t 1\n\t\t\t\t]\n\t\t\t}\n\t\t\t,{\n\t\t\t\t \"name\": \"Box09\"\n\t\t\t\t,\"transformation\": [\n\t\t\t\t\t -0.101437\n\t\t\t\t\t,-1.29215e-008\n\t\t\t\t\t,-3.80372e-010\n\t\t\t\t\t,-10.1472\n\t\t\t\t\t,-3.80372e-010\n\t\t\t\t\t,-1.20922e-008\n\t\t\t\t\t,0.101437\n\t\t\t\t\t,0.00185238\n\t\t\t\t\t,-1.29215e-008\n\t\t\t\t\t,0.101437\n\t\t\t\t\t,6.0461e-009\n\t\t\t\t\t,0.0585555\n\t\t\t\t\t,0\n\t\t\t\t\t,0\n\t\t\t\t\t,0\n\t\t\t\t\t,1\n\t\t\t\t]\n\t\t\t\t,\"meshes\": [\n\t\t\t\t\t 4\n\t\t\t\t]\n\t\t\t}\n\t\t\t,{\n\t\t\t\t \"name\": \"Box10\"\n\t\t\t\t,\"transformation\": [\n\t\t\t\t\t -1.20922e-008\n\t\t\t\t\t,0.101437\n\t\t\t\t\t,9.06915e-009\n\t\t\t\t\t,-0.243822\n\t\t\t\t\t,0\n\t\t\t\t\t,-1.20922e-008\n\t\t\t\t\t,0.101437\n\t\t\t\t\t,10.2303\n\t\t\t\t\t,0.101437\n\t\t\t\t\t,9.06915e-009\n\t\t\t\t\t,0\n\t\t\t\t\t,0.0490569\n\t\t\t\t\t,0\n\t\t\t\t\t,0\n\t\t\t\t\t,0\n\t\t\t\t\t,1\n\t\t\t\t]\n\t\t\t\t,\"meshes\": [\n\t\t\t\t\t 0\n\t\t\t\t]\n\t\t\t}\n\t\t]\n\t}\n\t,\"flags\": 8\n\t,\"meshes\": [\n\t\t{\n\t\t\t \"name\": \"0\"\n\t\t\t,\"materialindex\": 0\n\t\t\t,\"primitivetypes\": 4\n\t\t\t,\"vertices\": [\n\t\t\t\t -100.483\n\t\t\t\t,99.5169\n\t\t\t\t,-1.86265e-009\n\t\t\t\t,-100.483\n\t\t\t\t,-99.5169\n\t\t\t\t,0\n\t\t\t\t,100.483\n\t\t\t\t,99.5169\n\t\t\t\t,-1.86265e-009\n\t\t\t\t,100.483\n\t\t\t\t,-99.5169\n\t\t\t\t,0\n\t\t\t\t,100.483\n\t\t\t\t,-99.5169\n\t\t\t\t,-1.93237\n\t\t\t\t,-100.483\n\t\t\t\t,-99.5169\n\t\t\t\t,-1.93237\n\t\t\t\t,100.483\n\t\t\t\t,99.5169\n\t\t\t\t,-1.93237\n\t\t\t\t,-100.483\n\t\t\t\t,99.5169\n\t\t\t\t,-1.93237\n\t\t\t\t,100.483\n\t\t\t\t,-99.5169\n\t\t\t\t,0\n\t\t\t\t,-100.483\n\t\t\t\t,-99.5169\n\t\t\t\t,0\n\t\t\t\t,100.483\n\t\t\t\t,-99.5169\n\t\t\t\t,-1.93237\n\t\t\t\t,-100.483\n\t\t\t\t,-99.5169\n\t\t\t\t,-1.93237\n\t\t\t\t,100.483\n\t\t\t\t,99.5169\n\t\t\t\t,-1.86265e-009\n\t\t\t\t,100.483\n\t\t\t\t,-99.5169\n\t\t\t\t,0\n\t\t\t\t,100.483\n\t\t\t\t,99.5169\n\t\t\t\t,-1.93237\n\t\t\t\t,100.483\n\t\t\t\t,-99.5169\n\t\t\t\t,-1.93237\n\t\t\t\t,-100.483\n\t\t\t\t,99.5169\n\t\t\t\t,-1.86265e-009\n\t\t\t\t,100.483\n\t\t\t\t,99.5169\n\t\t\t\t,-1.86265e-009\n\t\t\t\t,-100.483\n\t\t\t\t,99.5169\n\t\t\t\t,-1.93237\n\t\t\t\t,100.483\n\t\t\t\t,99.5169\n\t\t\t\t,-1.93237\n\t\t\t\t,-100.483\n\t\t\t\t,-99.5169\n\t\t\t\t,0\n\t\t\t\t,-100.483\n\t\t\t\t,99.5169\n\t\t\t\t,-1.86265e-009\n\t\t\t\t,-100.483\n\t\t\t\t,-99.5169\n\t\t\t\t,-1.93237\n\t\t\t\t,-100.483\n\t\t\t\t,99.5169\n\t\t\t\t,-1.93237\n\t\t\t]\n\t\t\t,\"normals\": [\n\t\t\t\t -3.77254e-013\n\t\t\t\t,-1.38133e-013\n\t\t\t\t,0.101437\n\t\t\t\t,-3.77254e-013\n\t\t\t\t,-1.38355e-013\n\t\t\t\t,0.101437\n\t\t\t\t,-3.77254e-013\n\t\t\t\t,-1.38355e-013\n\t\t\t\t,0.101437\n\t\t\t\t,-3.77254e-013\n\t\t\t\t,-1.38355e-013\n\t\t\t\t,0.101437\n\t\t\t\t,-1.70011e-011\n\t\t\t\t,1.41759e-011\n\t\t\t\t,-0.101437\n\t\t\t\t,2.00728e-011\n\t\t\t\t,-2.32577e-011\n\t\t\t\t,-0.101437\n\t\t\t\t,2.00728e-011\n\t\t\t\t,-2.32577e-011\n\t\t\t\t,-0.101437\n\t\t\t\t,5.71465e-011\n\t\t\t\t,-6.06915e-011\n\t\t\t\t,-0.101437\n\t\t\t\t,1.51153e-009\n\t\t\t\t,-0.101437\n\t\t\t\t,-3.02305e-009\n\t\t\t\t,1.51153e-009\n\t\t\t\t,-0.101437\n\t\t\t\t,-3.02305e-009\n\t\t\t\t,1.51153e-009\n\t\t\t\t,-0.101437\n\t\t\t\t,-3.02305e-009\n\t\t\t\t,1.51153e-009\n\t\t\t\t,-0.101437\n\t\t\t\t,-3.02305e-009\n\t\t\t\t,0.101437\n\t\t\t\t,-1.76847e-009\n\t\t\t\t,6.0461e-009\n\t\t\t\t,0.101437\n\t\t\t\t,-1.76847e-009\n\t\t\t\t,6.0461e-009\n\t\t\t\t,0.101437\n\t\t\t\t,-1.76847e-009\n\t\t\t\t,6.0461e-009\n\t\t\t\t,0.101437\n\t\t\t\t,-1.76847e-009\n\t\t\t\t,6.0461e-009\n\t\t\t\t,3.23392e-009\n\t\t\t\t,0.101437\n\t\t\t\t,3.02305e-009\n\t\t\t\t,3.23392e-009\n\t\t\t\t,0.101437\n\t\t\t\t,3.02305e-009\n\t\t\t\t,3.23392e-009\n\t\t\t\t,0.101437\n\t\t\t\t,3.02305e-009\n\t\t\t\t,3.23392e-009\n\t\t\t\t,0.101437\n\t\t\t\t,3.02305e-009\n\t\t\t\t,-0.101437\n\t\t\t\t,-3.02305e-009\n\t\t\t\t,4.87481e-007\n\t\t\t\t,-0.101437\n\t\t\t\t,-6.27291e-010\n\t\t\t\t,2.40717e-007\n\t\t\t\t,-0.101437\n\t\t\t\t,-6.27291e-010\n\t\t\t\t,2.40717e-007\n\t\t\t\t,-0.101437\n\t\t\t\t,1.76847e-009\n\t\t\t\t,-6.0461e-009\n\t\t\t]\n\t\t\t,\"tangents\": [\n\t\t\t\t 1\n\t\t\t\t,1.99309e-007\n\t\t\t\t,3.82652e-014\n\t\t\t\t,1\n\t\t\t\t,1.99309e-007\n\t\t\t\t,3.82652e-014\n\t\t\t\t,1\n\t\t\t\t,1.99309e-007\n\t\t\t\t,3.82652e-014\n\t\t\t\t,1\n\t\t\t\t,2.37272e-007\n\t\t\t\t,3.82652e-014\n\t\t\t\t,-1\n\t\t\t\t,-2.37272e-007\n\t\t\t\t,5.88802e-010\n\t\t\t\t,-1\n\t\t\t\t,-2.37272e-007\n\t\t\t\t,5.85041e-010\n\t\t\t\t,-1\n\t\t\t\t,-2.37272e-007\n\t\t\t\t,5.85041e-010\n\t\t\t\t,-1\n\t\t\t\t,-1.99309e-007\n\t\t\t\t,-5.79661e-012\n\t\t\t\t,1\n\t\t\t\t,1.53324e-010\n\t\t\t\t,4.56942e-018\n\t\t\t\t,1\n\t\t\t\t,1.53324e-010\n\t\t\t\t,4.56942e-018\n\t\t\t\t,1\n\t\t\t\t,1.53324e-010\n\t\t\t\t,4.56942e-018\n\t\t\t\t,1\n\t\t\t\t,1.53324e-010\n\t\t\t\t,-5.93181e-010\n\t\t\t\t,7.60549e-008\n\t\t\t\t,1\n\t\t\t\t,-9.35847e-012\n\t\t\t\t,7.60549e-008\n\t\t\t\t,1\n\t\t\t\t,-9.35847e-012\n\t\t\t\t,7.60549e-008\n\t\t\t\t,1\n\t\t\t\t,-9.35847e-012\n\t\t\t\t,7.60549e-008\n\t\t\t\t,1\n\t\t\t\t,-3.63256e-017\n\t\t\t\t,-1\n\t\t\t\t,3.7901e-008\n\t\t\t\t,-1.86516e-018\n\t\t\t\t,-1\n\t\t\t\t,3.7901e-008\n\t\t\t\t,-1.86516e-018\n\t\t\t\t,-1\n\t\t\t\t,3.7901e-008\n\t\t\t\t,-1.86516e-018\n\t\t\t\t,-1\n\t\t\t\t,3.7901e-008\n\t\t\t\t,-1.86516e-018\n\t\t\t\t,3.06648e-010\n\t\t\t\t,-1\n\t\t\t\t,9.35696e-012\n\t\t\t\t,6.36304e-011\n\t\t\t\t,-1\n\t\t\t\t,9.35828e-012\n\t\t\t\t,6.36304e-011\n\t\t\t\t,-1\n\t\t\t\t,9.35828e-012\n\t\t\t\t,-3.81171e-008\n\t\t\t\t,-1\n\t\t\t\t,5.9894e-010\n\t\t\t]\n\t\t\t,\"bitangents\": [\n\t\t\t\t 2.39576e-007\n\t\t\t\t,-1\n\t\t\t\t,9.24813e-012\n\t\t\t\t,2.39576e-007\n\t\t\t\t,-1\n\t\t\t\t,9.24811e-012\n\t\t\t\t,2.39576e-007\n\t\t\t\t,-1\n\t\t\t\t,9.24811e-012\n\t\t\t\t,1.62912e-007\n\t\t\t\t,-1\n\t\t\t\t,9.24811e-012\n\t\t\t\t,1.62912e-007\n\t\t\t\t,-1\n\t\t\t\t,-1.4381e-012\n\t\t\t\t,1.62912e-007\n\t\t\t\t,-1\n\t\t\t\t,2.35905e-012\n\t\t\t\t,1.62912e-007\n\t\t\t\t,-1\n\t\t\t\t,2.35905e-012\n\t\t\t\t,2.01244e-007\n\t\t\t\t,-1\n\t\t\t\t,5.98934e-010\n\t\t\t\t,-4.56942e-018\n\t\t\t\t,3.06648e-010\n\t\t\t\t,-1\n\t\t\t\t,-4.56942e-018\n\t\t\t\t,3.06648e-010\n\t\t\t\t,-1\n\t\t\t\t,-4.56942e-018\n\t\t\t\t,3.06648e-010\n\t\t\t\t,-1\n\t\t\t\t,-3.94822e-006\n\t\t\t\t,3.06648e-010\n\t\t\t\t,-1\n\t\t\t\t,6.13297e-010\n\t\t\t\t,-1.06923e-017\n\t\t\t\t,-1\n\t\t\t\t,6.13297e-010\n\t\t\t\t,-1.06923e-017\n\t\t\t\t,-1\n\t\t\t\t,6.13297e-010\n\t\t\t\t,-1.06923e-017\n\t\t\t\t,-1\n\t\t\t\t,6.13297e-010\n\t\t\t\t,-1.06923e-017\n\t\t\t\t,-1\n\t\t\t\t,9.77631e-018\n\t\t\t\t,3.06648e-010\n\t\t\t\t,-1\n\t\t\t\t,9.77631e-018\n\t\t\t\t,3.06648e-010\n\t\t\t\t,-1\n\t\t\t\t,9.77631e-018\n\t\t\t\t,3.06648e-010\n\t\t\t\t,-1\n\t\t\t\t,9.77631e-018\n\t\t\t\t,3.06648e-010\n\t\t\t\t,-1\n\t\t\t\t,-3.95704e-006\n\t\t\t\t,-2.62965e-016\n\t\t\t\t,-1\n\t\t\t\t,-3.93201e-006\n\t\t\t\t,1.00227e-016\n\t\t\t\t,-1\n\t\t\t\t,-3.93201e-006\n\t\t\t\t,1.00227e-016\n\t\t\t\t,-1\n\t\t\t\t,6.13297e-010\n\t\t\t\t,-1.06923e-017\n\t\t\t\t,-1\n\t\t\t]\n\t\t\t,\"numuvcomponents\": [\n\t\t\t\t 2\n\t\t\t]\n\t\t\t,\"texturecoords\": [\n\t\t\t\t[\n\t\t\t\t\t -0.00966144\n\t\t\t\t\t,3.99034\n\t\t\t\t\t,-0.00966239\n\t\t\t\t\t,0.00966239\n\t\t\t\t\t,4.00966\n\t\t\t\t\t,3.99034\n\t\t\t\t\t,4.00966\n\t\t\t\t\t,0.00966144\n\t\t\t\t\t,-0.00966144\n\t\t\t\t\t,0.00966144\n\t\t\t\t\t,4.00966\n\t\t\t\t\t,0.00966239\n\t\t\t\t\t,-0.00966239\n\t\t\t\t\t,3.99034\n\t\t\t\t\t,4.00966\n\t\t\t\t\t,3.99034\n\t\t\t\t\t,4.00966\n\t\t\t\t\t,2.01932\n\t\t\t\t\t,-0.00966239\n\t\t\t\t\t,2.01932\n\t\t\t\t\t,4.00966\n\t\t\t\t\t,1.98068\n\t\t\t\t\t,-0.00966239\n\t\t\t\t\t,1.98068\n\t\t\t\t\t,3.99034\n\t\t\t\t\t,2.01932\n\t\t\t\t\t,0.00966144\n\t\t\t\t\t,2.01932\n\t\t\t\t\t,3.99034\n\t\t\t\t\t,1.98068\n\t\t\t\t\t,0.00966144\n\t\t\t\t\t,1.98068\n\t\t\t\t\t,4.00966\n\t\t\t\t\t,2.01932\n\t\t\t\t\t,-0.00966239\n\t\t\t\t\t,2.01932\n\t\t\t\t\t,4.00966\n\t\t\t\t\t,1.98068\n\t\t\t\t\t,-0.00966239\n\t\t\t\t\t,1.98068\n\t\t\t\t\t,3.99034\n\t\t\t\t\t,2.01932\n\t\t\t\t\t,0.00966144\n\t\t\t\t\t,2.01932\n\t\t\t\t\t,3.99034\n\t\t\t\t\t,1.98068\n\t\t\t\t\t,0.00966144\n\t\t\t\t\t,1.98068\n\t\t\t\t]\n\t\t\t]\n\t\t\t,\"faces\": [\n\t\t\t\t[\n\t\t\t\t\t 0\n\t\t\t\t\t,1\n\t\t\t\t\t,2\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 3\n\t\t\t\t\t,2\n\t\t\t\t\t,1\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 4\n\t\t\t\t\t,5\n\t\t\t\t\t,6\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 7\n\t\t\t\t\t,6\n\t\t\t\t\t,5\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 8\n\t\t\t\t\t,9\n\t\t\t\t\t,10\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 11\n\t\t\t\t\t,10\n\t\t\t\t\t,9\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 12\n\t\t\t\t\t,13\n\t\t\t\t\t,14\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 15\n\t\t\t\t\t,14\n\t\t\t\t\t,13\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 16\n\t\t\t\t\t,17\n\t\t\t\t\t,18\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 19\n\t\t\t\t\t,18\n\t\t\t\t\t,17\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 20\n\t\t\t\t\t,21\n\t\t\t\t\t,22\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 23\n\t\t\t\t\t,22\n\t\t\t\t\t,21\n\t\t\t\t]\n\t\t\t]\n\t\t}\n\t\t,{\n\t\t\t \"name\": \"1\"\n\t\t\t,\"materialindex\": 1\n\t\t\t,\"primitivetypes\": 4\n\t\t\t,\"vertices\": [\n\t\t\t\t -1.93237\n\t\t\t\t,-97.4285\n\t\t\t\t,8.19564e-008\n\t\t\t\t,-1.93237\n\t\t\t\t,93.9098\n\t\t\t\t,-7.63685e-008\n\t\t\t\t,1.93237\n\t\t\t\t,93.9098\n\t\t\t\t,-1.30385e-007\n\t\t\t\t,1.93236\n\t\t\t\t,-97.4285\n\t\t\t\t,2.79397e-008\n\t\t\t\t,-1.93237\n\t\t\t\t,-97.4285\n\t\t\t\t,99.5169\n\t\t\t\t,1.93237\n\t\t\t\t,-97.4285\n\t\t\t\t,99.5169\n\t\t\t\t,1.93236\n\t\t\t\t,93.9098\n\t\t\t\t,99.5169\n\t\t\t\t,-1.93237\n\t\t\t\t,93.9098\n\t\t\t\t,99.5169\n\t\t\t\t,-1.93237\n\t\t\t\t,-97.4285\n\t\t\t\t,8.19564e-008\n\t\t\t\t,1.93236\n\t\t\t\t,-97.4285\n\t\t\t\t,2.79397e-008\n\t\t\t\t,1.93237\n\t\t\t\t,-97.4285\n\t\t\t\t,99.5169\n\t\t\t\t,-1.93237\n\t\t\t\t,-97.4285\n\t\t\t\t,99.5169\n\t\t\t\t,1.93236\n\t\t\t\t,-97.4285\n\t\t\t\t,2.79397e-008\n\t\t\t\t,1.93237\n\t\t\t\t,93.9098\n\t\t\t\t,-1.30385e-007\n\t\t\t\t,1.93236\n\t\t\t\t,93.9098\n\t\t\t\t,99.5169\n\t\t\t\t,1.93237\n\t\t\t\t,-97.4285\n\t\t\t\t,99.5169\n\t\t\t\t,1.93237\n\t\t\t\t,93.9098\n\t\t\t\t,-1.30385e-007\n\t\t\t\t,-1.93237\n\t\t\t\t,93.9098\n\t\t\t\t,-7.63685e-008\n\t\t\t\t,-1.93237\n\t\t\t\t,93.9098\n\t\t\t\t,99.5169\n\t\t\t\t,1.93236\n\t\t\t\t,93.9098\n\t\t\t\t,99.5169\n\t\t\t\t,-1.93237\n\t\t\t\t,93.9098\n\t\t\t\t,-7.63685e-008\n\t\t\t\t,-1.93237\n\t\t\t\t,-97.4285\n\t\t\t\t,8.19564e-008\n\t\t\t\t,-1.93237\n\t\t\t\t,-97.4285\n\t\t\t\t,99.5169\n\t\t\t\t,-1.93237\n\t\t\t\t,93.9098\n\t\t\t\t,99.5169\n\t\t\t]\n\t\t\t,\"normals\": [\n\t\t\t\t -1.43508e-009\n\t\t\t\t,-8.37691e-011\n\t\t\t\t,-0.101437\n\t\t\t\t,-1.43508e-009\n\t\t\t\t,-8.37691e-011\n\t\t\t\t,-0.101437\n\t\t\t\t,-1.43508e-009\n\t\t\t\t,-8.37691e-011\n\t\t\t\t,-0.101437\n\t\t\t\t,-1.43508e-009\n\t\t\t\t,-8.37691e-011\n\t\t\t\t,-0.101437\n\t\t\t\t,-3.02305e-009\n\t\t\t\t,3.47271e-009\n\t\t\t\t,0.101437\n\t\t\t\t,-3.02305e-009\n\t\t\t\t,3.47271e-009\n\t\t\t\t,0.101437\n\t\t\t\t,-3.02305e-009\n\t\t\t\t,3.47271e-009\n\t\t\t\t,0.101437\n\t\t\t\t,-3.02305e-009\n\t\t\t\t,3.47271e-009\n\t\t\t\t,0.101437\n\t\t\t\t,1.51153e-009\n\t\t\t\t,-0.101437\n\t\t\t\t,-3.02305e-009\n\t\t\t\t,1.51153e-009\n\t\t\t\t,-0.101437\n\t\t\t\t,-3.02305e-009\n\t\t\t\t,1.51153e-009\n\t\t\t\t,-0.101437\n\t\t\t\t,-3.02305e-009\n\t\t\t\t,1.51153e-009\n\t\t\t\t,-0.101437\n\t\t\t\t,-3.02305e-009\n\t\t\t\t,0.101437\n\t\t\t\t,5.30934e-010\n\t\t\t\t,1.25458e-009\n\t\t\t\t,0.101437\n\t\t\t\t,-1.96118e-009\n\t\t\t\t,6.0461e-009\n\t\t\t\t,0.101437\n\t\t\t\t,5.30934e-010\n\t\t\t\t,1.25458e-009\n\t\t\t\t,0.101437\n\t\t\t\t,3.02305e-009\n\t\t\t\t,-3.53694e-009\n\t\t\t\t,-1.51153e-009\n\t\t\t\t,0.101437\n\t\t\t\t,3.02305e-009\n\t\t\t\t,-1.51153e-009\n\t\t\t\t,0.101437\n\t\t\t\t,3.02305e-009\n\t\t\t\t,-1.51153e-009\n\t\t\t\t,0.101437\n\t\t\t\t,3.02305e-009\n\t\t\t\t,-1.51153e-009\n\t\t\t\t,0.101437\n\t\t\t\t,3.02305e-009\n\t\t\t\t,-0.101437\n\t\t\t\t,1.96118e-009\n\t\t\t\t,3.53694e-009\n\t\t\t\t,-0.101437\n\t\t\t\t,1.96118e-009\n\t\t\t\t,3.53694e-009\n\t\t\t\t,-0.101437\n\t\t\t\t,1.96118e-009\n\t\t\t\t,3.53694e-009\n\t\t\t\t,-0.101437\n\t\t\t\t,1.96118e-009\n\t\t\t\t,3.53694e-009\n\t\t\t]\n\t\t\t,\"tangents\": [\n\t\t\t\t -1\n\t\t\t\t,1.4501e-021\n\t\t\t\t,1.39786e-008\n\t\t\t\t,-1\n\t\t\t\t,1.4501e-021\n\t\t\t\t,1.39786e-008\n\t\t\t\t,-1\n\t\t\t\t,1.4501e-021\n\t\t\t\t,1.39786e-008\n\t\t\t\t,-1\n\t\t\t\t,1.4501e-021\n\t\t\t\t,1.39786e-008\n\t\t\t\t,1\n\t\t\t\t,1.04982e-017\n\t\t\t\t,3.06648e-010\n\t\t\t\t,1\n\t\t\t\t,1.04982e-017\n\t\t\t\t,3.06648e-010\n\t\t\t\t,1\n\t\t\t\t,1.04982e-017\n\t\t\t\t,3.06648e-010\n\t\t\t\t,1\n\t\t\t\t,1.04982e-017\n\t\t\t\t,3.06648e-010\n\t\t\t\t,1\n\t\t\t\t,1.53324e-010\n\t\t\t\t,-1.39768e-008\n\t\t\t\t,1\n\t\t\t\t,1.53324e-010\n\t\t\t\t,-1.39768e-008\n\t\t\t\t,1\n\t\t\t\t,1.53324e-010\n\t\t\t\t,-1.39768e-008\n\t\t\t\t,1\n\t\t\t\t,1.53324e-010\n\t\t\t\t,4.56942e-018\n\t\t\t\t,3.94097e-008\n\t\t\t\t,1\n\t\t\t\t,-8.2746e-010\n\t\t\t\t,3.96625e-008\n\t\t\t\t,1\n\t\t\t\t,-8.2746e-010\n\t\t\t\t,3.94097e-008\n\t\t\t\t,1\n\t\t\t\t,-8.2746e-010\n\t\t\t\t,-3.97702e-008\n\t\t\t\t,1\n\t\t\t\t,-3.98739e-008\n\t\t\t\t,-1\n\t\t\t\t,-1.53324e-010\n\t\t\t\t,1.39768e-008\n\t\t\t\t,-1\n\t\t\t\t,-1.53324e-010\n\t\t\t\t,1.39768e-008\n\t\t\t\t,-1\n\t\t\t\t,-1.53324e-010\n\t\t\t\t,1.39768e-008\n\t\t\t\t,-1\n\t\t\t\t,-1.53324e-010\n\t\t\t\t,-4.56942e-018\n\t\t\t\t,-3.96625e-008\n\t\t\t\t,-1\n\t\t\t\t,8.2746e-010\n\t\t\t\t,-3.96625e-008\n\t\t\t\t,-1\n\t\t\t\t,8.2746e-010\n\t\t\t\t,-3.96625e-008\n\t\t\t\t,-1\n\t\t\t\t,8.2746e-010\n\t\t\t\t,-1.98936e-010\n\t\t\t\t,-1\n\t\t\t\t,3.98739e-008\n\t\t\t]\n\t\t\t,\"bitangents\": [\n\t\t\t\t 2.09338e-007\n\t\t\t\t,-1\n\t\t\t\t,8.2744e-010\n\t\t\t\t,2.09338e-007\n\t\t\t\t,-1\n\t\t\t\t,8.2744e-010\n\t\t\t\t,2.09338e-007\n\t\t\t\t,-1\n\t\t\t\t,8.2744e-010\n\t\t\t\t,2.09338e-007\n\t\t\t\t,-1\n\t\t\t\t,8.2744e-010\n\t\t\t\t,2.90176e-007\n\t\t\t\t,-1\n\t\t\t\t,3.98158e-008\n\t\t\t\t,2.90176e-007\n\t\t\t\t,-1\n\t\t\t\t,3.98158e-008\n\t\t\t\t,2.90176e-007\n\t\t\t\t,-1\n\t\t\t\t,3.98158e-008\n\t\t\t\t,2.49874e-007\n\t\t\t\t,-1\n\t\t\t\t,3.98158e-008\n\t\t\t\t,-7.74879e-008\n\t\t\t\t,3.06648e-010\n\t\t\t\t,-1\n\t\t\t\t,-7.74879e-008\n\t\t\t\t,3.06648e-010\n\t\t\t\t,-1\n\t\t\t\t,-7.74879e-008\n\t\t\t\t,3.06648e-010\n\t\t\t\t,-1\n\t\t\t\t,-7.74879e-008\n\t\t\t\t,3.06648e-010\n\t\t\t\t,-1\n\t\t\t\t,7.60027e-008\n\t\t\t\t,-3.46275e-018\n\t\t\t\t,-1\n\t\t\t\t,7.64888e-008\n\t\t\t\t,3.39378e-018\n\t\t\t\t,-1\n\t\t\t\t,7.60027e-008\n\t\t\t\t,-3.46275e-018\n\t\t\t\t,-1\n\t\t\t\t,-7.62343e-008\n\t\t\t\t,1.28166e-017\n\t\t\t\t,-1\n\t\t\t\t,-4.56942e-018\n\t\t\t\t,3.06648e-010\n\t\t\t\t,-1\n\t\t\t\t,-4.56942e-018\n\t\t\t\t,3.06648e-010\n\t\t\t\t,-1\n\t\t\t\t,-4.56942e-018\n\t\t\t\t,3.06648e-010\n\t\t\t\t,-1\n\t\t\t\t,7.74879e-008\n\t\t\t\t,3.06648e-010\n\t\t\t\t,-1\n\t\t\t\t,-7.62343e-008\n\t\t\t\t,-8.31471e-018\n\t\t\t\t,-1\n\t\t\t\t,-7.62343e-008\n\t\t\t\t,-8.31471e-018\n\t\t\t\t,-1\n\t\t\t\t,-7.62343e-008\n\t\t\t\t,-8.31471e-018\n\t\t\t\t,-1\n\t\t\t\t,-3.58775e-010\n\t\t\t\t,6.93657e-018\n\t\t\t\t,-1\n\t\t\t]\n\t\t\t,\"numuvcomponents\": [\n\t\t\t\t 2\n\t\t\t]\n\t\t\t,\"texturecoords\": [\n\t\t\t\t[\n\t\t\t\t\t 0.519324\n\t\t\t\t\t,-0.509662\n\t\t\t\t\t,0.519323\n\t\t\t\t\t,1.50966\n\t\t\t\t\t,0.480676\n\t\t\t\t\t,1.50966\n\t\t\t\t\t,0.480677\n\t\t\t\t\t,-0.509662\n\t\t\t\t\t,0.480676\n\t\t\t\t\t,-0.509662\n\t\t\t\t\t,0.519323\n\t\t\t\t\t,-0.509662\n\t\t\t\t\t,0.519324\n\t\t\t\t\t,1.50966\n\t\t\t\t\t,0.480677\n\t\t\t\t\t,1.50966\n\t\t\t\t\t,0.480676\n\t\t\t\t\t,0.00241548\n\t\t\t\t\t,0.519323\n\t\t\t\t\t,0.00241548\n\t\t\t\t\t,0.519323\n\t\t\t\t\t,0.997585\n\t\t\t\t\t,0.480676\n\t\t\t\t\t,0.997585\n\t\t\t\t\t,-0.509662\n\t\t\t\t\t,0.00241548\n\t\t\t\t\t,1.50966\n\t\t\t\t\t,0.00241548\n\t\t\t\t\t,1.50966\n\t\t\t\t\t,0.997585\n\t\t\t\t\t,-0.509662\n\t\t\t\t\t,0.997585\n\t\t\t\t\t,0.480676\n\t\t\t\t\t,0.00241548\n\t\t\t\t\t,0.519323\n\t\t\t\t\t,0.00241548\n\t\t\t\t\t,0.519323\n\t\t\t\t\t,0.997585\n\t\t\t\t\t,0.480676\n\t\t\t\t\t,0.997585\n\t\t\t\t\t,-0.509662\n\t\t\t\t\t,0.00241548\n\t\t\t\t\t,1.50966\n\t\t\t\t\t,0.00241548\n\t\t\t\t\t,1.50966\n\t\t\t\t\t,0.997585\n\t\t\t\t\t,-0.509662\n\t\t\t\t\t,0.997585\n\t\t\t\t]\n\t\t\t]\n\t\t\t,\"faces\": [\n\t\t\t\t[\n\t\t\t\t\t 0\n\t\t\t\t\t,1\n\t\t\t\t\t,2\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2\n\t\t\t\t\t,3\n\t\t\t\t\t,0\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 4\n\t\t\t\t\t,5\n\t\t\t\t\t,6\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 6\n\t\t\t\t\t,7\n\t\t\t\t\t,4\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 8\n\t\t\t\t\t,9\n\t\t\t\t\t,10\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 10\n\t\t\t\t\t,11\n\t\t\t\t\t,8\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 12\n\t\t\t\t\t,13\n\t\t\t\t\t,14\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 14\n\t\t\t\t\t,15\n\t\t\t\t\t,12\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 16\n\t\t\t\t\t,17\n\t\t\t\t\t,18\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 18\n\t\t\t\t\t,19\n\t\t\t\t\t,16\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 20\n\t\t\t\t\t,21\n\t\t\t\t\t,22\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 22\n\t\t\t\t\t,23\n\t\t\t\t\t,20\n\t\t\t\t]\n\t\t\t]\n\t\t}\n\t\t,{\n\t\t\t \"name\": \"3\"\n\t\t\t,\"materialindex\": 2\n\t\t\t,\"primitivetypes\": 4\n\t\t\t,\"vertices\": [\n\t\t\t\t -9.99999\n\t\t\t\t,-9.99999\n\t\t\t\t,3.72529e-009\n\t\t\t\t,-9.99999\n\t\t\t\t,10\n\t\t\t\t,1.86265e-009\n\t\t\t\t,10\n\t\t\t\t,10\n\t\t\t\t,1.86265e-009\n\t\t\t\t,10\n\t\t\t\t,-9.99999\n\t\t\t\t,1.86265e-009\n\t\t\t\t,-10\n\t\t\t\t,-10\n\t\t\t\t,20\n\t\t\t\t,10\n\t\t\t\t,-10\n\t\t\t\t,20\n\t\t\t\t,10\n\t\t\t\t,10\n\t\t\t\t,20\n\t\t\t\t,-9.99999\n\t\t\t\t,10\n\t\t\t\t,20\n\t\t\t\t,-9.99999\n\t\t\t\t,-9.99999\n\t\t\t\t,3.72529e-009\n\t\t\t\t,10\n\t\t\t\t,-9.99999\n\t\t\t\t,1.86265e-009\n\t\t\t\t,10\n\t\t\t\t,-10\n\t\t\t\t,20\n\t\t\t\t,-10\n\t\t\t\t,-10\n\t\t\t\t,20\n\t\t\t\t,10\n\t\t\t\t,-9.99999\n\t\t\t\t,1.86265e-009\n\t\t\t\t,10\n\t\t\t\t,10\n\t\t\t\t,1.86265e-009\n\t\t\t\t,10\n\t\t\t\t,10\n\t\t\t\t,20\n\t\t\t\t,10\n\t\t\t\t,-10\n\t\t\t\t,20\n\t\t\t\t,10\n\t\t\t\t,10\n\t\t\t\t,1.86265e-009\n\t\t\t\t,-9.99999\n\t\t\t\t,10\n\t\t\t\t,1.86265e-009\n\t\t\t\t,-9.99999\n\t\t\t\t,10\n\t\t\t\t,20\n\t\t\t\t,10\n\t\t\t\t,10\n\t\t\t\t,20\n\t\t\t\t,-9.99999\n\t\t\t\t,10\n\t\t\t\t,1.86265e-009\n\t\t\t\t,-9.99999\n\t\t\t\t,-9.99999\n\t\t\t\t,3.72529e-009\n\t\t\t\t,-10\n\t\t\t\t,-10\n\t\t\t\t,20\n\t\t\t\t,-9.99999\n\t\t\t\t,10\n\t\t\t\t,20\n\t\t\t]\n\t\t\t,\"normals\": [\n\t\t\t\t -4.3574e-012\n\t\t\t\t,-5.33795e-013\n\t\t\t\t,-0.101437\n\t\t\t\t,-4.36096e-012\n\t\t\t\t,-5.29354e-013\n\t\t\t\t,-0.101437\n\t\t\t\t,-4.3574e-012\n\t\t\t\t,-5.33795e-013\n\t\t\t\t,-0.101437\n\t\t\t\t,-4.3574e-012\n\t\t\t\t,-5.33795e-013\n\t\t\t\t,-0.101437\n\t\t\t\t,5.2823e-010\n\t\t\t\t,-4.14386e-009\n\t\t\t\t,0.101437\n\t\t\t\t,5.28228e-010\n\t\t\t\t,-4.14386e-009\n\t\t\t\t,0.101437\n\t\t\t\t,5.2823e-010\n\t\t\t\t,-4.14386e-009\n\t\t\t\t,0.101437\n\t\t\t\t,5.28232e-010\n\t\t\t\t,-4.14386e-009\n\t\t\t\t,0.101437\n\t\t\t\t,0\n\t\t\t\t,-0.101437\n\t\t\t\t,-2.30238e-009\n\t\t\t\t,3.72529e-009\n\t\t\t\t,-0.101437\n\t\t\t\t,-8.17843e-009\n\t\t\t\t,0\n\t\t\t\t,-0.101437\n\t\t\t\t,-2.30238e-009\n\t\t\t\t,-7.45058e-009\n\t\t\t\t,-0.101437\n\t\t\t\t,3.57366e-009\n\t\t\t\t,0.101437\n\t\t\t\t,3.72529e-009\n\t\t\t\t,8.20599e-009\n\t\t\t\t,0.101437\n\t\t\t\t,1.86265e-008\n\t\t\t\t,-7.95311e-009\n\t\t\t\t,0.101437\n\t\t\t\t,3.72529e-009\n\t\t\t\t,8.20599e-009\n\t\t\t\t,0.101437\n\t\t\t\t,-1.11759e-008\n\t\t\t\t,2.43651e-008\n\t\t\t\t,-1.49012e-008\n\t\t\t\t,0.101437\n\t\t\t\t,-6.35636e-010\n\t\t\t\t,-1.49012e-008\n\t\t\t\t,0.101437\n\t\t\t\t,-6.35636e-010\n\t\t\t\t,-1.49012e-008\n\t\t\t\t,0.101437\n\t\t\t\t,-6.35636e-010\n\t\t\t\t,-1.49012e-008\n\t\t\t\t,0.101437\n\t\t\t\t,-6.35636e-010\n\t\t\t\t,-0.101437\n\t\t\t\t,1.11759e-008\n\t\t\t\t,-5.26798e-009\n\t\t\t\t,-0.101437\n\t\t\t\t,-7.45058e-009\n\t\t\t\t,-1.84891e-008\n\t\t\t\t,-0.101437\n\t\t\t\t,1.11759e-008\n\t\t\t\t,-5.26798e-009\n\t\t\t\t,-0.101437\n\t\t\t\t,2.23517e-008\n\t\t\t\t,7.95311e-009\n\t\t\t]\n\t\t\t,\"tangents\": [\n\t\t\t\t -1\n\t\t\t\t,-5.72777e-007\n\t\t\t\t,4.42023e-013\n\t\t\t\t,-1\n\t\t\t\t,-5.72777e-007\n\t\t\t\t,4.42383e-013\n\t\t\t\t,-1\n\t\t\t\t,-5.72777e-007\n\t\t\t\t,4.42023e-013\n\t\t\t\t,-1\n\t\t\t\t,-2.86388e-007\n\t\t\t\t,9.2616e-011\n\t\t\t\t,1\n\t\t\t\t,2.38657e-007\n\t\t\t\t,-5.35818e-011\n\t\t\t\t,1\n\t\t\t\t,2.38657e-007\n\t\t\t\t,-5.35817e-011\n\t\t\t\t,1\n\t\t\t\t,2.38657e-007\n\t\t\t\t,-5.35818e-011\n\t\t\t\t,1\n\t\t\t\t,6.20127e-007\n\t\t\t\t,-5.35818e-011\n\t\t\t\t,1\n\t\t\t\t,2.17507e-020\n\t\t\t\t,-9.31323e-011\n\t\t\t\t,1\n\t\t\t\t,3.77881e-010\n\t\t\t\t,-9.31322e-011\n\t\t\t\t,1\n\t\t\t\t,2.17507e-020\n\t\t\t\t,-9.31323e-011\n\t\t\t\t,1\n\t\t\t\t,-7.55763e-010\n\t\t\t\t,2.66258e-017\n\t\t\t\t,-3.77923e-007\n\t\t\t\t,1\n\t\t\t\t,2.86962e-016\n\t\t\t\t,-3.79434e-007\n\t\t\t\t,1\n\t\t\t\t,-1.59608e-016\n\t\t\t\t,-3.77923e-007\n\t\t\t\t,1\n\t\t\t\t,2.86962e-016\n\t\t\t\t,1.13364e-009\n\t\t\t\t,1\n\t\t\t\t,2.72301e-016\n\t\t\t\t,-1\n\t\t\t\t,-3.79056e-007\n\t\t\t\t,-1.51243e-017\n\t\t\t\t,-1\n\t\t\t\t,-3.79056e-007\n\t\t\t\t,-1.51243e-017\n\t\t\t\t,-1\n\t\t\t\t,-3.79056e-007\n\t\t\t\t,-1.51243e-017\n\t\t\t\t,-1\n\t\t\t\t,-3.79056e-007\n\t\t\t\t,-1.51243e-017\n\t\t\t\t,-1.13364e-009\n\t\t\t\t,-1\n\t\t\t\t,9.31322e-011\n\t\t\t\t,7.55763e-010\n\t\t\t\t,-1\n\t\t\t\t,9.31324e-011\n\t\t\t\t,-1.13364e-009\n\t\t\t\t,-1\n\t\t\t\t,9.31322e-011\n\t\t\t\t,-3.79812e-007\n\t\t\t\t,-1\n\t\t\t\t,-1.2998e-016\n\t\t\t]\n\t\t\t,\"bitangents\": [\n\t\t\t\t 2.38657e-007\n\t\t\t\t,-1\n\t\t\t\t,9.22282e-011\n\t\t\t\t,2.38657e-007\n\t\t\t\t,-1\n\t\t\t\t,9.22277e-011\n\t\t\t\t,2.38657e-007\n\t\t\t\t,-1\n\t\t\t\t,9.22282e-011\n\t\t\t\t,5.90295e-007\n\t\t\t\t,-1\n\t\t\t\t,5.4127e-014\n\t\t\t\t,2.86388e-007\n\t\t\t\t,-1\n\t\t\t\t,-4.2034e-010\n\t\t\t\t,2.86388e-007\n\t\t\t\t,-1\n\t\t\t\t,-4.2034e-010\n\t\t\t\t,2.86388e-007\n\t\t\t\t,-1\n\t\t\t\t,-4.2034e-010\n\t\t\t\t,-9.54628e-008\n\t\t\t\t,-1\n\t\t\t\t,-4.2034e-010\n\t\t\t\t,1.90926e-007\n\t\t\t\t,3.77778e-007\n\t\t\t\t,-1\n\t\t\t\t,1.90926e-007\n\t\t\t\t,3.78374e-007\n\t\t\t\t,-1\n\t\t\t\t,1.90926e-007\n\t\t\t\t,3.77778e-007\n\t\t\t\t,-1\n\t\t\t\t,2.86388e-007\n\t\t\t\t,3.77182e-007\n\t\t\t\t,-1\n\t\t\t\t,-9.35538e-008\n\t\t\t\t,6.66073e-017\n\t\t\t\t,-1\n\t\t\t\t,-9.51929e-008\n\t\t\t\t,3.20496e-017\n\t\t\t\t,-1\n\t\t\t\t,-9.35538e-008\n\t\t\t\t,6.66073e-017\n\t\t\t\t,-1\n\t\t\t\t,2.8563e-007\n\t\t\t\t,3.81851e-007\n\t\t\t\t,-1\n\t\t\t\t,9.47171e-018\n\t\t\t\t,-6.44768e-011\n\t\t\t\t,-1\n\t\t\t\t,9.47171e-018\n\t\t\t\t,-6.44768e-011\n\t\t\t\t,-1\n\t\t\t\t,9.47171e-018\n\t\t\t\t,-6.44768e-011\n\t\t\t\t,-1\n\t\t\t\t,-9.54628e-008\n\t\t\t\t,-6.4477e-011\n\t\t\t\t,-1\n\t\t\t\t,3.78079e-007\n\t\t\t\t,3.81851e-007\n\t\t\t\t,-1\n\t\t\t\t,3.7942e-007\n\t\t\t\t,3.81851e-007\n\t\t\t\t,-1\n\t\t\t\t,3.78079e-007\n\t\t\t\t,3.81851e-007\n\t\t\t\t,-1\n\t\t\t\t,-8.06738e-010\n\t\t\t\t,1.77766e-016\n\t\t\t\t,-1\n\t\t\t]\n\t\t\t,\"numuvcomponents\": [\n\t\t\t\t 2\n\t\t\t]\n\t\t\t,\"texturecoords\": [\n\t\t\t\t[\n\t\t\t\t\t 0.999501\n\t\t\t\t\t,0.000499606\n\t\t\t\t\t,0.9995\n\t\t\t\t\t,0.999501\n\t\t\t\t\t,0.000499487\n\t\t\t\t\t,0.9995\n\t\t\t\t\t,0.000499696\n\t\t\t\t\t,0.000499368\n\t\t\t\t\t,0.000499487\n\t\t\t\t\t,0.000499606\n\t\t\t\t\t,0.9995\n\t\t\t\t\t,0.000499368\n\t\t\t\t\t,0.999501\n\t\t\t\t\t,0.9995\n\t\t\t\t\t,0.000499696\n\t\t\t\t\t,0.999501\n\t\t\t\t\t,0.000499487\n\t\t\t\t\t,0.000499517\n\t\t\t\t\t,0.9995\n\t\t\t\t\t,0.000499517\n\t\t\t\t\t,0.9995\n\t\t\t\t\t,0.999501\n\t\t\t\t\t,0.000499487\n\t\t\t\t\t,0.999501\n\t\t\t\t\t,0.000499368\n\t\t\t\t\t,0.000499517\n\t\t\t\t\t,0.9995\n\t\t\t\t\t,0.000499517\n\t\t\t\t\t,0.9995\n\t\t\t\t\t,0.999501\n\t\t\t\t\t,0.000499368\n\t\t\t\t\t,0.999501\n\t\t\t\t\t,0.000499487\n\t\t\t\t\t,0.000499517\n\t\t\t\t\t,0.9995\n\t\t\t\t\t,0.000499517\n\t\t\t\t\t,0.9995\n\t\t\t\t\t,0.999501\n\t\t\t\t\t,0.000499487\n\t\t\t\t\t,0.999501\n\t\t\t\t\t,0.000499368\n\t\t\t\t\t,0.000499517\n\t\t\t\t\t,0.9995\n\t\t\t\t\t,0.000499517\n\t\t\t\t\t,0.9995\n\t\t\t\t\t,0.999501\n\t\t\t\t\t,0.000499368\n\t\t\t\t\t,0.999501\n\t\t\t\t]\n\t\t\t]\n\t\t\t,\"faces\": [\n\t\t\t\t[\n\t\t\t\t\t 0\n\t\t\t\t\t,1\n\t\t\t\t\t,2\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2\n\t\t\t\t\t,3\n\t\t\t\t\t,0\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 4\n\t\t\t\t\t,5\n\t\t\t\t\t,6\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 6\n\t\t\t\t\t,7\n\t\t\t\t\t,4\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 8\n\t\t\t\t\t,9\n\t\t\t\t\t,10\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 10\n\t\t\t\t\t,11\n\t\t\t\t\t,8\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 12\n\t\t\t\t\t,13\n\t\t\t\t\t,14\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 14\n\t\t\t\t\t,15\n\t\t\t\t\t,12\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 16\n\t\t\t\t\t,17\n\t\t\t\t\t,18\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 18\n\t\t\t\t\t,19\n\t\t\t\t\t,16\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 20\n\t\t\t\t\t,21\n\t\t\t\t\t,22\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 22\n\t\t\t\t\t,23\n\t\t\t\t\t,20\n\t\t\t\t]\n\t\t\t]\n\t\t}\n\t\t,{\n\t\t\t \"name\": \"2\"\n\t\t\t,\"materialindex\": 1\n\t\t\t,\"primitivetypes\": 4\n\t\t\t,\"vertices\": [\n\t\t\t\t -1.93237\n\t\t\t\t,-100.745\n\t\t\t\t,-1.02445e-007\n\t\t\t\t,-1.93237\n\t\t\t\t,100.248\n\t\t\t\t,-2.98023e-008\n\t\t\t\t,1.93236\n\t\t\t\t,100.248\n\t\t\t\t,1.39698e-007\n\t\t\t\t,1.93236\n\t\t\t\t,-100.745\n\t\t\t\t,6.70552e-008\n\t\t\t\t,-1.93237\n\t\t\t\t,-100.745\n\t\t\t\t,99.5169\n\t\t\t\t,1.93236\n\t\t\t\t,-100.745\n\t\t\t\t,99.5169\n\t\t\t\t,1.93236\n\t\t\t\t,100.248\n\t\t\t\t,99.5169\n\t\t\t\t,-1.93237\n\t\t\t\t,100.248\n\t\t\t\t,99.5169\n\t\t\t\t,-1.93237\n\t\t\t\t,-100.745\n\t\t\t\t,-1.02445e-007\n\t\t\t\t,1.93236\n\t\t\t\t,-100.745\n\t\t\t\t,6.70552e-008\n\t\t\t\t,1.93236\n\t\t\t\t,-100.745\n\t\t\t\t,99.5169\n\t\t\t\t,-1.93237\n\t\t\t\t,-100.745\n\t\t\t\t,99.5169\n\t\t\t\t,1.93236\n\t\t\t\t,-100.745\n\t\t\t\t,6.70552e-008\n\t\t\t\t,1.93236\n\t\t\t\t,100.248\n\t\t\t\t,1.39698e-007\n\t\t\t\t,1.93236\n\t\t\t\t,100.248\n\t\t\t\t,99.5169\n\t\t\t\t,1.93236\n\t\t\t\t,-100.745\n\t\t\t\t,99.5169\n\t\t\t\t,1.93236\n\t\t\t\t,100.248\n\t\t\t\t,1.39698e-007\n\t\t\t\t,-1.93237\n\t\t\t\t,100.248\n\t\t\t\t,-2.98023e-008\n\t\t\t\t,-1.93237\n\t\t\t\t,100.248\n\t\t\t\t,99.5169\n\t\t\t\t,1.93236\n\t\t\t\t,100.248\n\t\t\t\t,99.5169\n\t\t\t\t,-1.93237\n\t\t\t\t,100.248\n\t\t\t\t,-2.98023e-008\n\t\t\t\t,-1.93237\n\t\t\t\t,-100.745\n\t\t\t\t,-1.02445e-007\n\t\t\t\t,-1.93237\n\t\t\t\t,-100.745\n\t\t\t\t,99.5169\n\t\t\t\t,-1.93237\n\t\t\t\t,100.248\n\t\t\t\t,99.5169\n\t\t\t]\n\t\t\t,\"normals\": [\n\t\t\t\t 4.43394e-009\n\t\t\t\t,3.56648e-011\n\t\t\t\t,-0.101437\n\t\t\t\t,4.43394e-009\n\t\t\t\t,3.56648e-011\n\t\t\t\t,-0.101437\n\t\t\t\t,4.43394e-009\n\t\t\t\t,3.56648e-011\n\t\t\t\t,-0.101437\n\t\t\t\t,4.43394e-009\n\t\t\t\t,3.56648e-011\n\t\t\t\t,-0.101437\n\t\t\t\t,-4.43394e-009\n\t\t\t\t,-2.14222e-009\n\t\t\t\t,0.101437\n\t\t\t\t,-4.43394e-009\n\t\t\t\t,-2.14222e-009\n\t\t\t\t,0.101437\n\t\t\t\t,-4.43394e-009\n\t\t\t\t,-2.14222e-009\n\t\t\t\t,0.101437\n\t\t\t\t,-4.43394e-009\n\t\t\t\t,-2.14222e-009\n\t\t\t\t,0.101437\n\t\t\t\t,2.387e-016\n\t\t\t\t,-0.101437\n\t\t\t\t,2.50916e-009\n\t\t\t\t,2.387e-016\n\t\t\t\t,-0.101437\n\t\t\t\t,2.50916e-009\n\t\t\t\t,2.387e-016\n\t\t\t\t,-0.101437\n\t\t\t\t,2.50916e-009\n\t\t\t\t,2.387e-016\n\t\t\t\t,-0.101437\n\t\t\t\t,2.50916e-009\n\t\t\t\t,0.101437\n\t\t\t\t,2.83063e-016\n\t\t\t\t,-5.1491e-009\n\t\t\t\t,0.101437\n\t\t\t\t,1.83557e-016\n\t\t\t\t,-5.1491e-009\n\t\t\t\t,0.101437\n\t\t\t\t,2.83063e-016\n\t\t\t\t,-5.1491e-009\n\t\t\t\t,0.101437\n\t\t\t\t,3.82569e-016\n\t\t\t\t,-5.1491e-009\n\t\t\t\t,-2.387e-016\n\t\t\t\t,0.101437\n\t\t\t\t,-2.50916e-009\n\t\t\t\t,-2.387e-016\n\t\t\t\t,0.101437\n\t\t\t\t,-2.50916e-009\n\t\t\t\t,-2.387e-016\n\t\t\t\t,0.101437\n\t\t\t\t,-2.50916e-009\n\t\t\t\t,-2.387e-016\n\t\t\t\t,0.101437\n\t\t\t\t,-2.50916e-009\n\t\t\t\t,-0.101437\n\t\t\t\t,-1.80188e-016\n\t\t\t\t,-4.43394e-009\n\t\t\t\t,-0.101437\n\t\t\t\t,-1.80188e-016\n\t\t\t\t,-4.43394e-009\n\t\t\t\t,-0.101437\n\t\t\t\t,-1.80188e-016\n\t\t\t\t,-4.43394e-009\n\t\t\t\t,-0.101437\n\t\t\t\t,-1.80188e-016\n\t\t\t\t,-4.43394e-009\n\t\t\t]\n\t\t\t,\"tangents\": [\n\t\t\t\t -1\n\t\t\t\t,-5.31936e-022\n\t\t\t\t,-4.38569e-008\n\t\t\t\t,-1\n\t\t\t\t,-5.31936e-022\n\t\t\t\t,-4.38569e-008\n\t\t\t\t,-1\n\t\t\t\t,-5.31936e-022\n\t\t\t\t,-4.38569e-008\n\t\t\t\t,-1\n\t\t\t\t,-5.31936e-022\n\t\t\t\t,-4.38569e-008\n\t\t\t\t,1\n\t\t\t\t,-9.49846e-018\n\t\t\t\t,4.49765e-010\n\t\t\t\t,1\n\t\t\t\t,-9.49846e-018\n\t\t\t\t,4.49765e-010\n\t\t\t\t,1\n\t\t\t\t,-9.49846e-018\n\t\t\t\t,4.49765e-010\n\t\t\t\t,1\n\t\t\t\t,-9.49846e-018\n\t\t\t\t,4.49765e-010\n\t\t\t\t,1\n\t\t\t\t,3.53759e-017\n\t\t\t\t,4.38584e-008\n\t\t\t\t,1\n\t\t\t\t,3.53759e-017\n\t\t\t\t,4.38584e-008\n\t\t\t\t,1\n\t\t\t\t,3.53759e-017\n\t\t\t\t,4.38584e-008\n\t\t\t\t,1\n\t\t\t\t,2.4213e-017\n\t\t\t\t,-5.98938e-025\n\t\t\t\t,-2.85243e-017\n\t\t\t\t,1\n\t\t\t\t,3.61421e-010\n\t\t\t\t,-1.84307e-017\n\t\t\t\t,1\n\t\t\t\t,3.61421e-010\n\t\t\t\t,-2.85243e-017\n\t\t\t\t,1\n\t\t\t\t,3.61421e-010\n\t\t\t\t,-5.86326e-017\n\t\t\t\t,1\n\t\t\t\t,-3.79585e-008\n\t\t\t\t,-1\n\t\t\t\t,-3.53759e-017\n\t\t\t\t,-4.38584e-008\n\t\t\t\t,-1\n\t\t\t\t,-3.53759e-017\n\t\t\t\t,-4.38584e-008\n\t\t\t\t,-1\n\t\t\t\t,-3.53759e-017\n\t\t\t\t,-4.38584e-008\n\t\t\t\t,-1\n\t\t\t\t,-2.4213e-017\n\t\t\t\t,5.98938e-025\n\t\t\t\t,1.84402e-017\n\t\t\t\t,-1\n\t\t\t\t,-3.61421e-010\n\t\t\t\t,1.84402e-017\n\t\t\t\t,-1\n\t\t\t\t,-3.61421e-010\n\t\t\t\t,1.84402e-017\n\t\t\t\t,-1\n\t\t\t\t,-3.61421e-010\n\t\t\t\t,1.2053e-018\n\t\t\t\t,-1\n\t\t\t\t,3.79585e-008\n\t\t\t]\n\t\t\t,\"bitangents\": [\n\t\t\t\t 2.3724e-007\n\t\t\t\t,-1\n\t\t\t\t,-3.61309e-010\n\t\t\t\t,2.3724e-007\n\t\t\t\t,-1\n\t\t\t\t,-3.61309e-010\n\t\t\t\t,2.3724e-007\n\t\t\t\t,-1\n\t\t\t\t,-3.61309e-010\n\t\t\t\t,2.3724e-007\n\t\t\t\t,-1\n\t\t\t\t,-3.61309e-010\n\t\t\t\t,2.37871e-007\n\t\t\t\t,-1\n\t\t\t\t,3.73506e-008\n\t\t\t\t,2.37871e-007\n\t\t\t\t,-1\n\t\t\t\t,3.73506e-008\n\t\t\t\t,2.37871e-007\n\t\t\t\t,-1\n\t\t\t\t,3.73506e-008\n\t\t\t\t,2.37871e-007\n\t\t\t\t,-1\n\t\t\t\t,3.73506e-008\n\t\t\t\t,-1.25733e-024\n\t\t\t\t,-7.613e-008\n\t\t\t\t,-1\n\t\t\t\t,-1.25733e-024\n\t\t\t\t,-7.613e-008\n\t\t\t\t,-1\n\t\t\t\t,-1.25733e-024\n\t\t\t\t,-7.613e-008\n\t\t\t\t,-1\n\t\t\t\t,7.74879e-008\n\t\t\t\t,-7.613e-008\n\t\t\t\t,-1\n\t\t\t\t,-5.22308e-010\n\t\t\t\t,-1.45752e-024\n\t\t\t\t,-1\n\t\t\t\t,-5.22308e-010\n\t\t\t\t,-9.45154e-025\n\t\t\t\t,-1\n\t\t\t\t,-5.22308e-010\n\t\t\t\t,-1.45752e-024\n\t\t\t\t,-1\n\t\t\t\t,-5.22308e-010\n\t\t\t\t,-1.96989e-024\n\t\t\t\t,-1\n\t\t\t\t,7.74879e-008\n\t\t\t\t,-7.613e-008\n\t\t\t\t,-1\n\t\t\t\t,7.74879e-008\n\t\t\t\t,-7.613e-008\n\t\t\t\t,-1\n\t\t\t\t,7.74879e-008\n\t\t\t\t,-7.613e-008\n\t\t\t\t,-1\n\t\t\t\t,-1.25733e-024\n\t\t\t\t,-7.613e-008\n\t\t\t\t,-1\n\t\t\t\t,7.63252e-008\n\t\t\t\t,-6.02302e-025\n\t\t\t\t,-1\n\t\t\t\t,7.63252e-008\n\t\t\t\t,-6.02302e-025\n\t\t\t\t,-1\n\t\t\t\t,7.63252e-008\n\t\t\t\t,-6.02302e-025\n\t\t\t\t,-1\n\t\t\t\t,7.63252e-008\n\t\t\t\t,-6.02303e-025\n\t\t\t\t,-1\n\t\t\t]\n\t\t\t,\"numuvcomponents\": [\n\t\t\t\t 2\n\t\t\t]\n\t\t\t,\"texturecoords\": [\n\t\t\t\t[\n\t\t\t\t\t 0.519324\n\t\t\t\t\t,-0.509662\n\t\t\t\t\t,0.519323\n\t\t\t\t\t,1.50966\n\t\t\t\t\t,0.480676\n\t\t\t\t\t,1.50966\n\t\t\t\t\t,0.480677\n\t\t\t\t\t,-0.509662\n\t\t\t\t\t,0.480676\n\t\t\t\t\t,-0.509662\n\t\t\t\t\t,0.519323\n\t\t\t\t\t,-0.509662\n\t\t\t\t\t,0.519324\n\t\t\t\t\t,1.50966\n\t\t\t\t\t,0.480677\n\t\t\t\t\t,1.50966\n\t\t\t\t\t,0.480676\n\t\t\t\t\t,0.00241548\n\t\t\t\t\t,0.519323\n\t\t\t\t\t,0.00241548\n\t\t\t\t\t,0.519323\n\t\t\t\t\t,0.997585\n\t\t\t\t\t,0.480676\n\t\t\t\t\t,0.997585\n\t\t\t\t\t,-0.509662\n\t\t\t\t\t,0.00241548\n\t\t\t\t\t,1.50966\n\t\t\t\t\t,0.00241548\n\t\t\t\t\t,1.50966\n\t\t\t\t\t,0.997585\n\t\t\t\t\t,-0.509662\n\t\t\t\t\t,0.997585\n\t\t\t\t\t,0.480676\n\t\t\t\t\t,0.00241548\n\t\t\t\t\t,0.519323\n\t\t\t\t\t,0.00241548\n\t\t\t\t\t,0.519323\n\t\t\t\t\t,0.997585\n\t\t\t\t\t,0.480676\n\t\t\t\t\t,0.997585\n\t\t\t\t\t,-0.509662\n\t\t\t\t\t,0.00241548\n\t\t\t\t\t,1.50966\n\t\t\t\t\t,0.00241548\n\t\t\t\t\t,1.50966\n\t\t\t\t\t,0.997585\n\t\t\t\t\t,-0.509662\n\t\t\t\t\t,0.997585\n\t\t\t\t]\n\t\t\t]\n\t\t\t,\"faces\": [\n\t\t\t\t[\n\t\t\t\t\t 0\n\t\t\t\t\t,1\n\t\t\t\t\t,2\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2\n\t\t\t\t\t,3\n\t\t\t\t\t,0\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 4\n\t\t\t\t\t,5\n\t\t\t\t\t,6\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 6\n\t\t\t\t\t,7\n\t\t\t\t\t,4\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 8\n\t\t\t\t\t,9\n\t\t\t\t\t,10\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 10\n\t\t\t\t\t,11\n\t\t\t\t\t,8\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 12\n\t\t\t\t\t,13\n\t\t\t\t\t,14\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 14\n\t\t\t\t\t,15\n\t\t\t\t\t,12\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 16\n\t\t\t\t\t,17\n\t\t\t\t\t,18\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 18\n\t\t\t\t\t,19\n\t\t\t\t\t,16\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 20\n\t\t\t\t\t,21\n\t\t\t\t\t,22\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 22\n\t\t\t\t\t,23\n\t\t\t\t\t,20\n\t\t\t\t]\n\t\t\t]\n\t\t}\n\t\t,{\n\t\t\t \"name\": \"7\"\n\t\t\t,\"materialindex\": 1\n\t\t\t,\"primitivetypes\": 4\n\t\t\t,\"vertices\": [\n\t\t\t\t -1.93236\n\t\t\t\t,-100.69\n\t\t\t\t,-7.45058e-008\n\t\t\t\t,-1.93236\n\t\t\t\t,100.447\n\t\t\t\t,-7.63685e-008\n\t\t\t\t,1.93237\n\t\t\t\t,100.447\n\t\t\t\t,9.31323e-008\n\t\t\t\t,1.93237\n\t\t\t\t,-100.69\n\t\t\t\t,9.49949e-008\n\t\t\t\t,-1.93237\n\t\t\t\t,-100.69\n\t\t\t\t,99.5169\n\t\t\t\t,1.93237\n\t\t\t\t,-100.69\n\t\t\t\t,99.5169\n\t\t\t\t,1.93237\n\t\t\t\t,100.447\n\t\t\t\t,99.5169\n\t\t\t\t,-1.93237\n\t\t\t\t,100.447\n\t\t\t\t,99.5169\n\t\t\t\t,-1.93236\n\t\t\t\t,-100.69\n\t\t\t\t,-7.45058e-008\n\t\t\t\t,1.93237\n\t\t\t\t,-100.69\n\t\t\t\t,9.49949e-008\n\t\t\t\t,1.93237\n\t\t\t\t,-100.69\n\t\t\t\t,99.5169\n\t\t\t\t,-1.93237\n\t\t\t\t,-100.69\n\t\t\t\t,99.5169\n\t\t\t\t,1.93237\n\t\t\t\t,-100.69\n\t\t\t\t,9.49949e-008\n\t\t\t\t,1.93237\n\t\t\t\t,100.447\n\t\t\t\t,9.31323e-008\n\t\t\t\t,1.93237\n\t\t\t\t,100.447\n\t\t\t\t,99.5169\n\t\t\t\t,1.93237\n\t\t\t\t,-100.69\n\t\t\t\t,99.5169\n\t\t\t\t,1.93237\n\t\t\t\t,100.447\n\t\t\t\t,9.31323e-008\n\t\t\t\t,-1.93236\n\t\t\t\t,100.447\n\t\t\t\t,-7.63685e-008\n\t\t\t\t,-1.93237\n\t\t\t\t,100.447\n\t\t\t\t,99.5169\n\t\t\t\t,1.93237\n\t\t\t\t,100.447\n\t\t\t\t,99.5169\n\t\t\t\t,-1.93236\n\t\t\t\t,100.447\n\t\t\t\t,-7.63685e-008\n\t\t\t\t,-1.93236\n\t\t\t\t,-100.69\n\t\t\t\t,-7.45058e-008\n\t\t\t\t,-1.93237\n\t\t\t\t,-100.69\n\t\t\t\t,99.5169\n\t\t\t\t,-1.93237\n\t\t\t\t,100.447\n\t\t\t\t,99.5169\n\t\t\t]\n\t\t\t,\"normals\": [\n\t\t\t\t 4.43394e-009\n\t\t\t\t,-1.67688e-012\n\t\t\t\t,-0.101437\n\t\t\t\t,4.43394e-009\n\t\t\t\t,-1.67688e-012\n\t\t\t\t,-0.101437\n\t\t\t\t,4.43394e-009\n\t\t\t\t,-1.67688e-012\n\t\t\t\t,-0.101437\n\t\t\t\t,4.43394e-009\n\t\t\t\t,-1.67688e-012\n\t\t\t\t,-0.101437\n\t\t\t\t,-4.43394e-009\n\t\t\t\t,5.67379e-009\n\t\t\t\t,0.101437\n\t\t\t\t,-4.43394e-009\n\t\t\t\t,5.67379e-009\n\t\t\t\t,0.101437\n\t\t\t\t,-4.43394e-009\n\t\t\t\t,5.67379e-009\n\t\t\t\t,0.101437\n\t\t\t\t,-4.43394e-009\n\t\t\t\t,5.67379e-009\n\t\t\t\t,0.101437\n\t\t\t\t,8.86788e-009\n\t\t\t\t,-0.101437\n\t\t\t\t,7.07387e-009\n\t\t\t\t,8.86788e-009\n\t\t\t\t,-0.101437\n\t\t\t\t,7.07387e-009\n\t\t\t\t,8.86788e-009\n\t\t\t\t,-0.101437\n\t\t\t\t,7.07387e-009\n\t\t\t\t,8.86788e-009\n\t\t\t\t,-0.101437\n\t\t\t\t,7.07387e-009\n\t\t\t\t,0.101437\n\t\t\t\t,-6.14966e-010\n\t\t\t\t,-5.1491e-009\n\t\t\t\t,0.101437\n\t\t\t\t,-6.14964e-010\n\t\t\t\t,-5.1491e-009\n\t\t\t\t,0.101437\n\t\t\t\t,-6.14966e-010\n\t\t\t\t,-5.1491e-009\n\t\t\t\t,0.101437\n\t\t\t\t,-6.14965e-010\n\t\t\t\t,-5.14909e-009\n\t\t\t\t,-8.86788e-009\n\t\t\t\t,0.101437\n\t\t\t\t,2.50916e-009\n\t\t\t\t,-8.86788e-009\n\t\t\t\t,0.101437\n\t\t\t\t,2.50916e-009\n\t\t\t\t,-8.86788e-009\n\t\t\t\t,0.101437\n\t\t\t\t,2.50916e-009\n\t\t\t\t,-8.86788e-009\n\t\t\t\t,0.101437\n\t\t\t\t,2.50916e-009\n\t\t\t\t,-0.101437\n\t\t\t\t,6.14964e-010\n\t\t\t\t,-4.43394e-009\n\t\t\t\t,-0.101437\n\t\t\t\t,6.14963e-010\n\t\t\t\t,-4.43394e-009\n\t\t\t\t,-0.101437\n\t\t\t\t,6.14964e-010\n\t\t\t\t,-4.43394e-009\n\t\t\t\t,-0.101437\n\t\t\t\t,6.14965e-010\n\t\t\t\t,-4.43394e-009\n\t\t\t]\n\t\t\t,\"tangents\": [\n\t\t\t\t -1\n\t\t\t\t,2.5012e-023\n\t\t\t\t,-4.38569e-008\n\t\t\t\t,-1\n\t\t\t\t,2.5012e-023\n\t\t\t\t,-4.38569e-008\n\t\t\t\t,-1\n\t\t\t\t,2.5012e-023\n\t\t\t\t,-4.38569e-008\n\t\t\t\t,-1\n\t\t\t\t,2.5012e-023\n\t\t\t\t,-4.38569e-008\n\t\t\t\t,1\n\t\t\t\t,2.51572e-017\n\t\t\t\t,4.49765e-010\n\t\t\t\t,1\n\t\t\t\t,2.51572e-017\n\t\t\t\t,4.49765e-010\n\t\t\t\t,1\n\t\t\t\t,2.51572e-017\n\t\t\t\t,4.49765e-010\n\t\t\t\t,1\n\t\t\t\t,2.51572e-017\n\t\t\t\t,4.49765e-010\n\t\t\t\t,1\n\t\t\t\t,8.99529e-010\n\t\t\t\t,4.38584e-008\n\t\t\t\t,1\n\t\t\t\t,8.99529e-010\n\t\t\t\t,4.38584e-008\n\t\t\t\t,1\n\t\t\t\t,8.99529e-010\n\t\t\t\t,4.38584e-008\n\t\t\t\t,1\n\t\t\t\t,8.99529e-010\n\t\t\t\t,-6.27303e-017\n\t\t\t\t,6.23801e-011\n\t\t\t\t,1\n\t\t\t\t,-9.26059e-012\n\t\t\t\t,6.238e-011\n\t\t\t\t,1\n\t\t\t\t,-9.26059e-012\n\t\t\t\t,6.23801e-011\n\t\t\t\t,1\n\t\t\t\t,-9.26059e-012\n\t\t\t\t,3.76035e-008\n\t\t\t\t,1\n\t\t\t\t,-7.58628e-008\n\t\t\t\t,-1\n\t\t\t\t,-8.99529e-010\n\t\t\t\t,-4.38584e-008\n\t\t\t\t,-1\n\t\t\t\t,-8.99529e-010\n\t\t\t\t,-4.38584e-008\n\t\t\t\t,-1\n\t\t\t\t,-8.99529e-010\n\t\t\t\t,-4.38584e-008\n\t\t\t\t,-1\n\t\t\t\t,-8.99529e-010\n\t\t\t\t,-2.2251e-017\n\t\t\t\t,-6.238e-011\n\t\t\t\t,-1\n\t\t\t\t,9.26059e-012\n\t\t\t\t,-6.23799e-011\n\t\t\t\t,-1\n\t\t\t\t,9.26059e-012\n\t\t\t\t,-6.238e-011\n\t\t\t\t,-1\n\t\t\t\t,9.26059e-012\n\t\t\t\t,-6.23801e-011\n\t\t\t\t,-1\n\t\t\t\t,7.58628e-008\n\t\t\t]\n\t\t\t,\"bitangents\": [\n\t\t\t\t 2.37071e-007\n\t\t\t\t,-1\n\t\t\t\t,9.3458e-012\n\t\t\t\t,2.37071e-007\n\t\t\t\t,-1\n\t\t\t\t,9.3458e-012\n\t\t\t\t,2.37071e-007\n\t\t\t\t,-1\n\t\t\t\t,9.3458e-012\n\t\t\t\t,2.37071e-007\n\t\t\t\t,-1\n\t\t\t\t,9.3458e-012\n\t\t\t\t,1.99362e-007\n\t\t\t\t,-1\n\t\t\t\t,7.56577e-008\n\t\t\t\t,1.99362e-007\n\t\t\t\t,-1\n\t\t\t\t,7.56577e-008\n\t\t\t\t,1.99362e-007\n\t\t\t\t,-1\n\t\t\t\t,7.56577e-008\n\t\t\t\t,2.37701e-007\n\t\t\t\t,-1\n\t\t\t\t,7.56577e-008\n\t\t\t\t,-7.51933e-017\n\t\t\t\t,-1.52468e-007\n\t\t\t\t,-1\n\t\t\t\t,-7.51933e-017\n\t\t\t\t,-1.52468e-007\n\t\t\t\t,-1\n\t\t\t\t,-7.51933e-017\n\t\t\t\t,-1.52468e-007\n\t\t\t\t,-1\n\t\t\t\t,7.74879e-008\n\t\t\t\t,-1.52468e-007\n\t\t\t\t,-1\n\t\t\t\t,-7.63978e-008\n\t\t\t\t,-1.61581e-018\n\t\t\t\t,-1\n\t\t\t\t,-7.63978e-008\n\t\t\t\t,-1.6158e-018\n\t\t\t\t,-1\n\t\t\t\t,-7.63978e-008\n\t\t\t\t,-1.61581e-018\n\t\t\t\t,-1\n\t\t\t\t,-5.22307e-010\n\t\t\t\t,-1.51861e-007\n\t\t\t\t,-1\n\t\t\t\t,7.74879e-008\n\t\t\t\t,2.54522e-010\n\t\t\t\t,-1\n\t\t\t\t,7.74879e-008\n\t\t\t\t,2.54521e-010\n\t\t\t\t,-1\n\t\t\t\t,7.74879e-008\n\t\t\t\t,2.54522e-010\n\t\t\t\t,-1\n\t\t\t\t,-7.74879e-008\n\t\t\t\t,2.54521e-010\n\t\t\t\t,-1\n\t\t\t\t,7.63252e-008\n\t\t\t\t,-1.51861e-007\n\t\t\t\t,-1\n\t\t\t\t,7.63252e-008\n\t\t\t\t,-1.51861e-007\n\t\t\t\t,-1\n\t\t\t\t,7.63252e-008\n\t\t\t\t,-1.51861e-007\n\t\t\t\t,-1\n\t\t\t\t,7.63252e-008\n\t\t\t\t,2.0556e-018\n\t\t\t\t,-1\n\t\t\t]\n\t\t\t,\"numuvcomponents\": [\n\t\t\t\t 2\n\t\t\t]\n\t\t\t,\"texturecoords\": [\n\t\t\t\t[\n\t\t\t\t\t 0.519324\n\t\t\t\t\t,-0.509662\n\t\t\t\t\t,0.519323\n\t\t\t\t\t,1.50966\n\t\t\t\t\t,0.480676\n\t\t\t\t\t,1.50966\n\t\t\t\t\t,0.480677\n\t\t\t\t\t,-0.509662\n\t\t\t\t\t,0.480676\n\t\t\t\t\t,-0.509662\n\t\t\t\t\t,0.519323\n\t\t\t\t\t,-0.509662\n\t\t\t\t\t,0.519324\n\t\t\t\t\t,1.50966\n\t\t\t\t\t,0.480677\n\t\t\t\t\t,1.50966\n\t\t\t\t\t,0.480676\n\t\t\t\t\t,0.00241548\n\t\t\t\t\t,0.519323\n\t\t\t\t\t,0.00241548\n\t\t\t\t\t,0.519323\n\t\t\t\t\t,0.997585\n\t\t\t\t\t,0.480676\n\t\t\t\t\t,0.997585\n\t\t\t\t\t,-0.509662\n\t\t\t\t\t,0.00241548\n\t\t\t\t\t,1.50966\n\t\t\t\t\t,0.00241548\n\t\t\t\t\t,1.50966\n\t\t\t\t\t,0.997585\n\t\t\t\t\t,-0.509662\n\t\t\t\t\t,0.997585\n\t\t\t\t\t,0.480676\n\t\t\t\t\t,0.00241548\n\t\t\t\t\t,0.519323\n\t\t\t\t\t,0.00241548\n\t\t\t\t\t,0.519323\n\t\t\t\t\t,0.997585\n\t\t\t\t\t,0.480676\n\t\t\t\t\t,0.997585\n\t\t\t\t\t,-0.509662\n\t\t\t\t\t,0.00241548\n\t\t\t\t\t,1.50966\n\t\t\t\t\t,0.00241548\n\t\t\t\t\t,1.50966\n\t\t\t\t\t,0.997585\n\t\t\t\t\t,-0.509662\n\t\t\t\t\t,0.997585\n\t\t\t\t]\n\t\t\t]\n\t\t\t,\"faces\": [\n\t\t\t\t[\n\t\t\t\t\t 0\n\t\t\t\t\t,1\n\t\t\t\t\t,2\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2\n\t\t\t\t\t,3\n\t\t\t\t\t,0\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 4\n\t\t\t\t\t,5\n\t\t\t\t\t,6\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 6\n\t\t\t\t\t,7\n\t\t\t\t\t,4\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 8\n\t\t\t\t\t,9\n\t\t\t\t\t,10\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 10\n\t\t\t\t\t,11\n\t\t\t\t\t,8\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 12\n\t\t\t\t\t,13\n\t\t\t\t\t,14\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 14\n\t\t\t\t\t,15\n\t\t\t\t\t,12\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 16\n\t\t\t\t\t,17\n\t\t\t\t\t,18\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 18\n\t\t\t\t\t,19\n\t\t\t\t\t,16\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 20\n\t\t\t\t\t,21\n\t\t\t\t\t,22\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 22\n\t\t\t\t\t,23\n\t\t\t\t\t,20\n\t\t\t\t]\n\t\t\t]\n\t\t}\n\t]\n\t,\"materials\": [\n\t\t{\n\t\t\t \"properties\": [\n\t\t\t\t{\n\t\t\t\t\t \"key\": \"?mat.name\"\n\t\t\t\t\t,\"semantic\": 0\n\t\t\t\t\t,\"index\": 0\n\t\t\t\t\t,\"type\": 3\n\t\t\t\t\t,\"value\": \"2 - Default\"\n\t\t\t\t}\n\t\t\t\t,{\n\t\t\t\t\t \"key\": \"$clr.ambient\"\n\t\t\t\t\t,\"semantic\": 0\n\t\t\t\t\t,\"index\": 0\n\t\t\t\t\t,\"type\": 1\n\t\t\t\t\t,\"value\": [\n\t\t\t\t\t\t 0.588235\n\t\t\t\t\t\t,0.588235\n\t\t\t\t\t\t,0.588235\n\t\t\t\t\t]\n\t\t\t\t}\n\t\t\t\t,{\n\t\t\t\t\t \"key\": \"$clr.diffuse\"\n\t\t\t\t\t,\"semantic\": 0\n\t\t\t\t\t,\"index\": 0\n\t\t\t\t\t,\"type\": 1\n\t\t\t\t\t,\"value\": [\n\t\t\t\t\t\t 0.588235\n\t\t\t\t\t\t,0.588235\n\t\t\t\t\t\t,0.588235\n\t\t\t\t\t]\n\t\t\t\t}\n\t\t\t\t,{\n\t\t\t\t\t \"key\": \"$clr.specular\"\n\t\t\t\t\t,\"semantic\": 0\n\t\t\t\t\t,\"index\": 0\n\t\t\t\t\t,\"type\": 1\n\t\t\t\t\t,\"value\": [\n\t\t\t\t\t\t 0.898039\n\t\t\t\t\t\t,0.898039\n\t\t\t\t\t\t,0.898039\n\t\t\t\t\t]\n\t\t\t\t}\n\t\t\t\t,{\n\t\t\t\t\t \"key\": \"$clr.emissive\"\n\t\t\t\t\t,\"semantic\": 0\n\t\t\t\t\t,\"index\": 0\n\t\t\t\t\t,\"type\": 1\n\t\t\t\t\t,\"value\": [\n\t\t\t\t\t\t 0\n\t\t\t\t\t\t,0\n\t\t\t\t\t\t,0\n\t\t\t\t\t]\n\t\t\t\t}\n\t\t\t\t,{\n\t\t\t\t\t \"key\": \"$mat.opacity\"\n\t\t\t\t\t,\"semantic\": 0\n\t\t\t\t\t,\"index\": 0\n\t\t\t\t\t,\"type\": 1\n\t\t\t\t\t,\"value\": 1\n\t\t\t\t}\n\t\t\t\t,{\n\t\t\t\t\t \"key\": \"$mat.bumpscaling\"\n\t\t\t\t\t,\"semantic\": 0\n\t\t\t\t\t,\"index\": 0\n\t\t\t\t\t,\"type\": 1\n\t\t\t\t\t,\"value\": 1\n\t\t\t\t}\n\t\t\t\t,{\n\t\t\t\t\t \"key\": \"$mat.shadingm\"\n\t\t\t\t\t,\"semantic\": 0\n\t\t\t\t\t,\"index\": 0\n\t\t\t\t\t,\"type\": 4\n\t\t\t\t\t,\"value\": 2\n\t\t\t\t}\n\t\t\t\t,{\n\t\t\t\t\t \"key\": \"$tex.file\"\n\t\t\t\t\t,\"semantic\": 1\n\t\t\t\t\t,\"index\": 0\n\t\t\t\t\t,\"type\": 3\n\t\t\t\t\t,\"value\": \"image1.jpg\"\n\t\t\t\t}\n\t\t\t\t,{\n\t\t\t\t\t \"key\": \"$tex.blend\"\n\t\t\t\t\t,\"semantic\": 1\n\t\t\t\t\t,\"index\": 0\n\t\t\t\t\t,\"type\": 1\n\t\t\t\t\t,\"value\": 1\n\t\t\t\t}\n\t\t\t\t,{\n\t\t\t\t\t \"key\": \"$tex.mapmodeu\"\n\t\t\t\t\t,\"semantic\": 1\n\t\t\t\t\t,\"index\": 0\n\t\t\t\t\t,\"type\": 4\n\t\t\t\t\t,\"value\": 0\n\t\t\t\t}\n\t\t\t\t,{\n\t\t\t\t\t \"key\": \"$tex.mapmodev\"\n\t\t\t\t\t,\"semantic\": 1\n\t\t\t\t\t,\"index\": 0\n\t\t\t\t\t,\"type\": 4\n\t\t\t\t\t,\"value\": 0\n\t\t\t\t}\n\t\t\t\t,{\n\t\t\t\t\t \"key\": \"$tex.uvtrafo\"\n\t\t\t\t\t,\"semantic\": 1\n\t\t\t\t\t,\"index\": 0\n\t\t\t\t\t,\"type\": 1\n\t\t\t\t\t,\"value\": [\n\t\t\t\t\t\t 0\n\t\t\t\t\t\t,0\n\t\t\t\t\t\t,1\n\t\t\t\t\t\t,1\n\t\t\t\t\t\t,0\n\t\t\t\t\t]\n\t\t\t\t}\n\t\t\t]\n\t\t}\n\t\t,{\n\t\t\t \"properties\": [\n\t\t\t\t{\n\t\t\t\t\t \"key\": \"?mat.name\"\n\t\t\t\t\t,\"semantic\": 0\n\t\t\t\t\t,\"index\": 0\n\t\t\t\t\t,\"type\": 3\n\t\t\t\t\t,\"value\": \"1 - Default\"\n\t\t\t\t}\n\t\t\t\t,{\n\t\t\t\t\t \"key\": \"$clr.ambient\"\n\t\t\t\t\t,\"semantic\": 0\n\t\t\t\t\t,\"index\": 0\n\t\t\t\t\t,\"type\": 1\n\t\t\t\t\t,\"value\": [\n\t\t\t\t\t\t 0.588235\n\t\t\t\t\t\t,0.588235\n\t\t\t\t\t\t,0.588235\n\t\t\t\t\t]\n\t\t\t\t}\n\t\t\t\t,{\n\t\t\t\t\t \"key\": \"$clr.diffuse\"\n\t\t\t\t\t,\"semantic\": 0\n\t\t\t\t\t,\"index\": 0\n\t\t\t\t\t,\"type\": 1\n\t\t\t\t\t,\"value\": [\n\t\t\t\t\t\t 0.588235\n\t\t\t\t\t\t,0.588235\n\t\t\t\t\t\t,0.588235\n\t\t\t\t\t]\n\t\t\t\t}\n\t\t\t\t,{\n\t\t\t\t\t \"key\": \"$clr.specular\"\n\t\t\t\t\t,\"semantic\": 0\n\t\t\t\t\t,\"index\": 0\n\t\t\t\t\t,\"type\": 1\n\t\t\t\t\t,\"value\": [\n\t\t\t\t\t\t 0.898039\n\t\t\t\t\t\t,0.898039\n\t\t\t\t\t\t,0.898039\n\t\t\t\t\t]\n\t\t\t\t}\n\t\t\t\t,{\n\t\t\t\t\t \"key\": \"$clr.emissive\"\n\t\t\t\t\t,\"semantic\": 0\n\t\t\t\t\t,\"index\": 0\n\t\t\t\t\t,\"type\": 1\n\t\t\t\t\t,\"value\": [\n\t\t\t\t\t\t 0\n\t\t\t\t\t\t,0\n\t\t\t\t\t\t,0\n\t\t\t\t\t]\n\t\t\t\t}\n\t\t\t\t,{\n\t\t\t\t\t \"key\": \"$mat.opacity\"\n\t\t\t\t\t,\"semantic\": 0\n\t\t\t\t\t,\"index\": 0\n\t\t\t\t\t,\"type\": 1\n\t\t\t\t\t,\"value\": 1\n\t\t\t\t}\n\t\t\t\t,{\n\t\t\t\t\t \"key\": \"$mat.bumpscaling\"\n\t\t\t\t\t,\"semantic\": 0\n\t\t\t\t\t,\"index\": 0\n\t\t\t\t\t,\"type\": 1\n\t\t\t\t\t,\"value\": 1\n\t\t\t\t}\n\t\t\t\t,{\n\t\t\t\t\t \"key\": \"$mat.shadingm\"\n\t\t\t\t\t,\"semantic\": 0\n\t\t\t\t\t,\"index\": 0\n\t\t\t\t\t,\"type\": 4\n\t\t\t\t\t,\"value\": 2\n\t\t\t\t}\n\t\t\t\t,{\n\t\t\t\t\t \"key\": \"$tex.file\"\n\t\t\t\t\t,\"semantic\": 1\n\t\t\t\t\t,\"index\": 0\n\t\t\t\t\t,\"type\": 3\n\t\t\t\t\t,\"value\": \"wall.jpg\"\n\t\t\t\t}\n\t\t\t\t,{\n\t\t\t\t\t \"key\": \"$tex.blend\"\n\t\t\t\t\t,\"semantic\": 1\n\t\t\t\t\t,\"index\": 0\n\t\t\t\t\t,\"type\": 1\n\t\t\t\t\t,\"value\": 1\n\t\t\t\t}\n\t\t\t\t,{\n\t\t\t\t\t \"key\": \"$tex.mapmodeu\"\n\t\t\t\t\t,\"semantic\": 1\n\t\t\t\t\t,\"index\": 0\n\t\t\t\t\t,\"type\": 4\n\t\t\t\t\t,\"value\": 0\n\t\t\t\t}\n\t\t\t\t,{\n\t\t\t\t\t \"key\": \"$tex.mapmodev\"\n\t\t\t\t\t,\"semantic\": 1\n\t\t\t\t\t,\"index\": 0\n\t\t\t\t\t,\"type\": 4\n\t\t\t\t\t,\"value\": 0\n\t\t\t\t}\n\t\t\t\t,{\n\t\t\t\t\t \"key\": \"$tex.uvtrafo\"\n\t\t\t\t\t,\"semantic\": 1\n\t\t\t\t\t,\"index\": 0\n\t\t\t\t\t,\"type\": 1\n\t\t\t\t\t,\"value\": [\n\t\t\t\t\t\t 0\n\t\t\t\t\t\t,0\n\t\t\t\t\t\t,1\n\t\t\t\t\t\t,1\n\t\t\t\t\t\t,0\n\t\t\t\t\t]\n\t\t\t\t}\n\t\t\t]\n\t\t}\n\t\t,{\n\t\t\t \"properties\": [\n\t\t\t\t{\n\t\t\t\t\t \"key\": \"?mat.name\"\n\t\t\t\t\t,\"semantic\": 0\n\t\t\t\t\t,\"index\": 0\n\t\t\t\t\t,\"type\": 3\n\t\t\t\t\t,\"value\": \"3 - Default\"\n\t\t\t\t}\n\t\t\t\t,{\n\t\t\t\t\t \"key\": \"$clr.ambient\"\n\t\t\t\t\t,\"semantic\": 0\n\t\t\t\t\t,\"index\": 0\n\t\t\t\t\t,\"type\": 1\n\t\t\t\t\t,\"value\": [\n\t\t\t\t\t\t 0.588235\n\t\t\t\t\t\t,0.588235\n\t\t\t\t\t\t,0.588235\n\t\t\t\t\t]\n\t\t\t\t}\n\t\t\t\t,{\n\t\t\t\t\t \"key\": \"$clr.diffuse\"\n\t\t\t\t\t,\"semantic\": 0\n\t\t\t\t\t,\"index\": 0\n\t\t\t\t\t,\"type\": 1\n\t\t\t\t\t,\"value\": [\n\t\t\t\t\t\t 0.588235\n\t\t\t\t\t\t,0.588235\n\t\t\t\t\t\t,0.588235\n\t\t\t\t\t]\n\t\t\t\t}\n\t\t\t\t,{\n\t\t\t\t\t \"key\": \"$clr.specular\"\n\t\t\t\t\t,\"semantic\": 0\n\t\t\t\t\t,\"index\": 0\n\t\t\t\t\t,\"type\": 1\n\t\t\t\t\t,\"value\": [\n\t\t\t\t\t\t 0.898039\n\t\t\t\t\t\t,0.898039\n\t\t\t\t\t\t,0.898039\n\t\t\t\t\t]\n\t\t\t\t}\n\t\t\t\t,{\n\t\t\t\t\t \"key\": \"$clr.emissive\"\n\t\t\t\t\t,\"semantic\": 0\n\t\t\t\t\t,\"index\": 0\n\t\t\t\t\t,\"type\": 1\n\t\t\t\t\t,\"value\": [\n\t\t\t\t\t\t 0\n\t\t\t\t\t\t,0\n\t\t\t\t\t\t,0\n\t\t\t\t\t]\n\t\t\t\t}\n\t\t\t\t,{\n\t\t\t\t\t \"key\": \"$mat.opacity\"\n\t\t\t\t\t,\"semantic\": 0\n\t\t\t\t\t,\"index\": 0\n\t\t\t\t\t,\"type\": 1\n\t\t\t\t\t,\"value\": 1\n\t\t\t\t}\n\t\t\t\t,{\n\t\t\t\t\t \"key\": \"$mat.bumpscaling\"\n\t\t\t\t\t,\"semantic\": 0\n\t\t\t\t\t,\"index\": 0\n\t\t\t\t\t,\"type\": 1\n\t\t\t\t\t,\"value\": 1\n\t\t\t\t}\n\t\t\t\t,{\n\t\t\t\t\t \"key\": \"$mat.shadingm\"\n\t\t\t\t\t,\"semantic\": 0\n\t\t\t\t\t,\"index\": 0\n\t\t\t\t\t,\"type\": 4\n\t\t\t\t\t,\"value\": 2\n\t\t\t\t}\n\t\t\t\t,{\n\t\t\t\t\t \"key\": \"$tex.file\"\n\t\t\t\t\t,\"semantic\": 1\n\t\t\t\t\t,\"index\": 0\n\t\t\t\t\t,\"type\": 3\n\t\t\t\t\t,\"value\": \"image2.jpg\"\n\t\t\t\t}\n\t\t\t\t,{\n\t\t\t\t\t \"key\": \"$tex.blend\"\n\t\t\t\t\t,\"semantic\": 1\n\t\t\t\t\t,\"index\": 0\n\t\t\t\t\t,\"type\": 1\n\t\t\t\t\t,\"value\": 1\n\t\t\t\t}\n\t\t\t\t,{\n\t\t\t\t\t \"key\": \"$tex.mapmodeu\"\n\t\t\t\t\t,\"semantic\": 1\n\t\t\t\t\t,\"index\": 0\n\t\t\t\t\t,\"type\": 4\n\t\t\t\t\t,\"value\": 0\n\t\t\t\t}\n\t\t\t\t,{\n\t\t\t\t\t \"key\": \"$tex.mapmodev\"\n\t\t\t\t\t,\"semantic\": 1\n\t\t\t\t\t,\"index\": 0\n\t\t\t\t\t,\"type\": 4\n\t\t\t\t\t,\"value\": 0\n\t\t\t\t}\n\t\t\t\t,{\n\t\t\t\t\t \"key\": \"$tex.uvtrafo\"\n\t\t\t\t\t,\"semantic\": 1\n\t\t\t\t\t,\"index\": 0\n\t\t\t\t\t,\"type\": 1\n\t\t\t\t\t,\"value\": [\n\t\t\t\t\t\t 0\n\t\t\t\t\t\t,0\n\t\t\t\t\t\t,1\n\t\t\t\t\t\t,1\n\t\t\t\t\t\t,0\n\t\t\t\t\t]\n\t\t\t\t}\n\t\t\t]\n\t\t}\n\t]\n}\n"
  },
  {
    "path": "examples/resources/models/assimp/jeep/jeep.assimp.json",
    "content": "{\n\t \"__metadata__\": {\n\t \t \"format\" : \"assimp2json\"\n\t \t,\"version\": 100\n\t}\n\t,\"rootnode\": {\n\t\t \"name\": \"<MS3DRoot>\"\n\t\t,\"transformation\": [\n\t\t\t 1\n\t\t\t,0\n\t\t\t,0\n\t\t\t,0\n\t\t\t,0\n\t\t\t,1\n\t\t\t,0\n\t\t\t,0\n\t\t\t,0\n\t\t\t,0\n\t\t\t,1\n\t\t\t,0\n\t\t\t,0\n\t\t\t,0\n\t\t\t,0\n\t\t\t,1\n\t\t]\n\t\t,\"meshes\": [\n\t\t\t 0\n\t\t]\n\t}\n\t,\"flags\": 8\n\t,\"meshes\": [\n\t\t{\n\t\t\t \"name\": \"\"\n\t\t\t,\"materialindex\": 0\n\t\t\t,\"primitivetypes\": 4\n\t\t\t,\"vertices\": [\n\t\t\t\t 5.3674\n\t\t\t\t,2.79918\n\t\t\t\t,5.58144\n\t\t\t\t,5.3674\n\t\t\t\t,2.71248\n\t\t\t\t,6.01734\n\t\t\t\t,5.3674\n\t\t\t\t,1.66012\n\t\t\t\t,5.58144\n\t\t\t\t,3.33216\n\t\t\t\t,2.92574\n\t\t\t\t,5.58144\n\t\t\t\t,3.33216\n\t\t\t\t,1.66012\n\t\t\t\t,5.58144\n\t\t\t\t,3.33216\n\t\t\t\t,2.8294\n\t\t\t\t,6.06577\n\t\t\t\t,5.52924\n\t\t\t\t,2.92574\n\t\t\t\t,5.58144\n\t\t\t\t,5.26276\n\t\t\t\t,3.17887\n\t\t\t\t,5.58144\n\t\t\t\t,5.26276\n\t\t\t\t,3.06326\n\t\t\t\t,6.16264\n\t\t\t\t,5.52924\n\t\t\t\t,2.8294\n\t\t\t\t,6.06577\n\t\t\t\t,3.59863\n\t\t\t\t,3.17887\n\t\t\t\t,5.58144\n\t\t\t\t,3.59863\n\t\t\t\t,3.06326\n\t\t\t\t,6.16264\n\t\t\t\t,5.3674\n\t\t\t\t,2.46556\n\t\t\t\t,6.38688\n\t\t\t\t,3.33216\n\t\t\t\t,2.55505\n\t\t\t\t,6.47637\n\t\t\t\t,5.52924\n\t\t\t\t,2.55505\n\t\t\t\t,6.47637\n\t\t\t\t,5.26276\n\t\t\t\t,2.73404\n\t\t\t\t,6.65536\n\t\t\t\t,3.59863\n\t\t\t\t,2.73404\n\t\t\t\t,6.65536\n\t\t\t\t,5.3674\n\t\t\t\t,2.09602\n\t\t\t\t,6.63379\n\t\t\t\t,3.33216\n\t\t\t\t,2.14445\n\t\t\t\t,6.75072\n\t\t\t\t,5.26276\n\t\t\t\t,2.24132\n\t\t\t\t,6.98458\n\t\t\t\t,5.52924\n\t\t\t\t,2.14445\n\t\t\t\t,6.75072\n\t\t\t\t,3.59863\n\t\t\t\t,2.24132\n\t\t\t\t,6.98458\n\t\t\t\t,5.3674\n\t\t\t\t,1.66012\n\t\t\t\t,6.7205\n\t\t\t\t,3.33216\n\t\t\t\t,1.66012\n\t\t\t\t,6.84706\n\t\t\t\t,5.52924\n\t\t\t\t,1.66012\n\t\t\t\t,6.84706\n\t\t\t\t,5.26276\n\t\t\t\t,1.66012\n\t\t\t\t,7.10019\n\t\t\t\t,3.59863\n\t\t\t\t,1.66012\n\t\t\t\t,7.10019\n\t\t\t\t,5.3674\n\t\t\t\t,1.22421\n\t\t\t\t,6.63379\n\t\t\t\t,3.33216\n\t\t\t\t,1.17579\n\t\t\t\t,6.75072\n\t\t\t\t,5.26276\n\t\t\t\t,1.07892\n\t\t\t\t,6.98458\n\t\t\t\t,5.52924\n\t\t\t\t,1.17579\n\t\t\t\t,6.75072\n\t\t\t\t,3.59863\n\t\t\t\t,1.07892\n\t\t\t\t,6.98458\n\t\t\t\t,5.3674\n\t\t\t\t,0.854673\n\t\t\t\t,6.38688\n\t\t\t\t,3.33216\n\t\t\t\t,0.765187\n\t\t\t\t,6.47637\n\t\t\t\t,5.52924\n\t\t\t\t,0.765187\n\t\t\t\t,6.47637\n\t\t\t\t,5.26276\n\t\t\t\t,0.586201\n\t\t\t\t,6.65536\n\t\t\t\t,3.59863\n\t\t\t\t,0.586201\n\t\t\t\t,6.65536\n\t\t\t\t,5.3674\n\t\t\t\t,0.607756\n\t\t\t\t,6.01734\n\t\t\t\t,3.33216\n\t\t\t\t,0.490834\n\t\t\t\t,6.06577\n\t\t\t\t,5.26276\n\t\t\t\t,0.256977\n\t\t\t\t,6.16264\n\t\t\t\t,5.52924\n\t\t\t\t,0.490834\n\t\t\t\t,6.06577\n\t\t\t\t,3.59863\n\t\t\t\t,0.256977\n\t\t\t\t,6.16264\n\t\t\t\t,5.3674\n\t\t\t\t,0.52106\n\t\t\t\t,5.58144\n\t\t\t\t,3.33216\n\t\t\t\t,0.394494\n\t\t\t\t,5.58144\n\t\t\t\t,5.52924\n\t\t\t\t,0.394494\n\t\t\t\t,5.58144\n\t\t\t\t,5.26276\n\t\t\t\t,0.141369\n\t\t\t\t,5.58144\n\t\t\t\t,3.59863\n\t\t\t\t,0.141369\n\t\t\t\t,5.58144\n\t\t\t\t,5.3674\n\t\t\t\t,0.607756\n\t\t\t\t,5.14554\n\t\t\t\t,3.33216\n\t\t\t\t,0.490834\n\t\t\t\t,5.09711\n\t\t\t\t,5.26276\n\t\t\t\t,0.256977\n\t\t\t\t,5.00024\n\t\t\t\t,5.52924\n\t\t\t\t,0.490834\n\t\t\t\t,5.09711\n\t\t\t\t,3.59863\n\t\t\t\t,0.256977\n\t\t\t\t,5.00024\n\t\t\t\t,5.3674\n\t\t\t\t,0.854673\n\t\t\t\t,4.776\n\t\t\t\t,3.33216\n\t\t\t\t,0.765187\n\t\t\t\t,4.68651\n\t\t\t\t,5.52924\n\t\t\t\t,0.765187\n\t\t\t\t,4.68651\n\t\t\t\t,5.26276\n\t\t\t\t,0.586201\n\t\t\t\t,4.50752\n\t\t\t\t,3.59863\n\t\t\t\t,0.586201\n\t\t\t\t,4.50752\n\t\t\t\t,5.3674\n\t\t\t\t,1.22421\n\t\t\t\t,4.52909\n\t\t\t\t,3.33216\n\t\t\t\t,1.17579\n\t\t\t\t,4.41216\n\t\t\t\t,5.26276\n\t\t\t\t,1.07892\n\t\t\t\t,4.1783\n\t\t\t\t,5.52924\n\t\t\t\t,1.17579\n\t\t\t\t,4.41216\n\t\t\t\t,3.59863\n\t\t\t\t,1.07892\n\t\t\t\t,4.1783\n\t\t\t\t,5.3674\n\t\t\t\t,1.66012\n\t\t\t\t,4.44238\n\t\t\t\t,3.33216\n\t\t\t\t,1.66012\n\t\t\t\t,4.31581\n\t\t\t\t,5.52924\n\t\t\t\t,1.66012\n\t\t\t\t,4.31581\n\t\t\t\t,5.26276\n\t\t\t\t,1.66012\n\t\t\t\t,4.06269\n\t\t\t\t,3.59863\n\t\t\t\t,1.66012\n\t\t\t\t,4.06269\n\t\t\t\t,5.3674\n\t\t\t\t,2.09602\n\t\t\t\t,4.52909\n\t\t\t\t,3.33216\n\t\t\t\t,2.14445\n\t\t\t\t,4.41216\n\t\t\t\t,5.26276\n\t\t\t\t,2.24132\n\t\t\t\t,4.1783\n\t\t\t\t,5.52924\n\t\t\t\t,2.14445\n\t\t\t\t,4.41216\n\t\t\t\t,3.59863\n\t\t\t\t,2.24132\n\t\t\t\t,4.1783\n\t\t\t\t,5.3674\n\t\t\t\t,2.46556\n\t\t\t\t,4.776\n\t\t\t\t,3.33216\n\t\t\t\t,2.55505\n\t\t\t\t,4.68651\n\t\t\t\t,5.52924\n\t\t\t\t,2.55505\n\t\t\t\t,4.68651\n\t\t\t\t,5.26276\n\t\t\t\t,2.73404\n\t\t\t\t,4.50752\n\t\t\t\t,3.59863\n\t\t\t\t,2.73404\n\t\t\t\t,4.50752\n\t\t\t\t,5.3674\n\t\t\t\t,2.71248\n\t\t\t\t,5.14554\n\t\t\t\t,3.33216\n\t\t\t\t,2.8294\n\t\t\t\t,5.09711\n\t\t\t\t,5.26276\n\t\t\t\t,3.06326\n\t\t\t\t,5.00024\n\t\t\t\t,5.52924\n\t\t\t\t,2.8294\n\t\t\t\t,5.09711\n\t\t\t\t,3.59863\n\t\t\t\t,3.06326\n\t\t\t\t,5.00024\n\t\t\t\t,5.26276\n\t\t\t\t,3.17887\n\t\t\t\t,5.58144\n\t\t\t\t,4.4307\n\t\t\t\t,3.33074\n\t\t\t\t,5.58144\n\t\t\t\t,5.26276\n\t\t\t\t,3.06326\n\t\t\t\t,6.16264\n\t\t\t\t,4.4307\n\t\t\t\t,3.20358\n\t\t\t\t,6.22076\n\t\t\t\t,4.4307\n\t\t\t\t,3.33074\n\t\t\t\t,5.58144\n\t\t\t\t,3.59863\n\t\t\t\t,3.17887\n\t\t\t\t,5.58144\n\t\t\t\t,3.59863\n\t\t\t\t,3.06326\n\t\t\t\t,6.16264\n\t\t\t\t,4.4307\n\t\t\t\t,3.20358\n\t\t\t\t,6.22076\n\t\t\t\t,5.26276\n\t\t\t\t,3.06326\n\t\t\t\t,6.16264\n\t\t\t\t,4.4307\n\t\t\t\t,3.20358\n\t\t\t\t,6.22076\n\t\t\t\t,4.4307\n\t\t\t\t,2.84143\n\t\t\t\t,6.76275\n\t\t\t\t,5.26276\n\t\t\t\t,2.73404\n\t\t\t\t,6.65536\n\t\t\t\t,4.4307\n\t\t\t\t,3.20358\n\t\t\t\t,6.22076\n\t\t\t\t,3.59863\n\t\t\t\t,3.06326\n\t\t\t\t,6.16264\n\t\t\t\t,4.4307\n\t\t\t\t,2.84143\n\t\t\t\t,6.76275\n\t\t\t\t,3.59863\n\t\t\t\t,2.73404\n\t\t\t\t,6.65536\n\t\t\t\t,5.26276\n\t\t\t\t,2.73404\n\t\t\t\t,6.65536\n\t\t\t\t,4.4307\n\t\t\t\t,2.84143\n\t\t\t\t,6.76275\n\t\t\t\t,5.26276\n\t\t\t\t,2.24132\n\t\t\t\t,6.98458\n\t\t\t\t,4.4307\n\t\t\t\t,2.29944\n\t\t\t\t,7.1249\n\t\t\t\t,4.4307\n\t\t\t\t,2.84143\n\t\t\t\t,6.76275\n\t\t\t\t,3.59863\n\t\t\t\t,2.73404\n\t\t\t\t,6.65536\n\t\t\t\t,3.59863\n\t\t\t\t,2.24132\n\t\t\t\t,6.98458\n\t\t\t\t,4.4307\n\t\t\t\t,2.29944\n\t\t\t\t,7.1249\n\t\t\t\t,5.26276\n\t\t\t\t,2.24132\n\t\t\t\t,6.98458\n\t\t\t\t,4.4307\n\t\t\t\t,2.29944\n\t\t\t\t,7.1249\n\t\t\t\t,4.4307\n\t\t\t\t,1.66012\n\t\t\t\t,7.25206\n\t\t\t\t,5.26276\n\t\t\t\t,1.66012\n\t\t\t\t,7.10019\n\t\t\t\t,4.4307\n\t\t\t\t,2.29944\n\t\t\t\t,7.1249\n\t\t\t\t,3.59863\n\t\t\t\t,2.24132\n\t\t\t\t,6.98458\n\t\t\t\t,4.4307\n\t\t\t\t,1.66012\n\t\t\t\t,7.25206\n\t\t\t\t,3.59863\n\t\t\t\t,1.66012\n\t\t\t\t,7.10019\n\t\t\t\t,5.26276\n\t\t\t\t,1.66012\n\t\t\t\t,7.10019\n\t\t\t\t,4.4307\n\t\t\t\t,1.66012\n\t\t\t\t,7.25206\n\t\t\t\t,5.26276\n\t\t\t\t,1.07892\n\t\t\t\t,6.98458\n\t\t\t\t,4.4307\n\t\t\t\t,1.0208\n\t\t\t\t,7.1249\n\t\t\t\t,4.4307\n\t\t\t\t,1.66012\n\t\t\t\t,7.25206\n\t\t\t\t,3.59863\n\t\t\t\t,1.66012\n\t\t\t\t,7.10019\n\t\t\t\t,3.59863\n\t\t\t\t,1.07892\n\t\t\t\t,6.98458\n\t\t\t\t,4.4307\n\t\t\t\t,1.0208\n\t\t\t\t,7.1249\n\t\t\t\t,5.26276\n\t\t\t\t,1.07892\n\t\t\t\t,6.98458\n\t\t\t\t,4.4307\n\t\t\t\t,1.0208\n\t\t\t\t,7.1249\n\t\t\t\t,4.4307\n\t\t\t\t,0.478809\n\t\t\t\t,6.76275\n\t\t\t\t,5.26276\n\t\t\t\t,0.586201\n\t\t\t\t,6.65536\n\t\t\t\t,4.4307\n\t\t\t\t,1.0208\n\t\t\t\t,7.1249\n\t\t\t\t,3.59863\n\t\t\t\t,1.07892\n\t\t\t\t,6.98458\n\t\t\t\t,4.4307\n\t\t\t\t,0.478809\n\t\t\t\t,6.76275\n\t\t\t\t,3.59863\n\t\t\t\t,0.586201\n\t\t\t\t,6.65536\n\t\t\t\t,5.26276\n\t\t\t\t,0.586201\n\t\t\t\t,6.65536\n\t\t\t\t,4.4307\n\t\t\t\t,0.478809\n\t\t\t\t,6.76275\n\t\t\t\t,5.26276\n\t\t\t\t,0.256977\n\t\t\t\t,6.16264\n\t\t\t\t,4.4307\n\t\t\t\t,0.116663\n\t\t\t\t,6.22076\n\t\t\t\t,4.4307\n\t\t\t\t,0.478809\n\t\t\t\t,6.76275\n\t\t\t\t,3.59863\n\t\t\t\t,0.586201\n\t\t\t\t,6.65536\n\t\t\t\t,3.59863\n\t\t\t\t,0.256977\n\t\t\t\t,6.16264\n\t\t\t\t,4.4307\n\t\t\t\t,0.116663\n\t\t\t\t,6.22076\n\t\t\t\t,5.26276\n\t\t\t\t,0.256977\n\t\t\t\t,6.16264\n\t\t\t\t,4.4307\n\t\t\t\t,0.116663\n\t\t\t\t,6.22076\n\t\t\t\t,4.4307\n\t\t\t\t,-0.0105057\n\t\t\t\t,5.58144\n\t\t\t\t,5.26276\n\t\t\t\t,0.141369\n\t\t\t\t,5.58144\n\t\t\t\t,4.4307\n\t\t\t\t,0.116663\n\t\t\t\t,6.22076\n\t\t\t\t,3.59863\n\t\t\t\t,0.256977\n\t\t\t\t,6.16264\n\t\t\t\t,4.4307\n\t\t\t\t,-0.0105057\n\t\t\t\t,5.58144\n\t\t\t\t,3.59863\n\t\t\t\t,0.141369\n\t\t\t\t,5.58144\n\t\t\t\t,5.26276\n\t\t\t\t,0.141369\n\t\t\t\t,5.58144\n\t\t\t\t,4.4307\n\t\t\t\t,-0.0105057\n\t\t\t\t,5.58144\n\t\t\t\t,5.26276\n\t\t\t\t,0.256977\n\t\t\t\t,5.00024\n\t\t\t\t,4.4307\n\t\t\t\t,0.116663\n\t\t\t\t,4.94212\n\t\t\t\t,4.4307\n\t\t\t\t,-0.0105057\n\t\t\t\t,5.58144\n\t\t\t\t,3.59863\n\t\t\t\t,0.141369\n\t\t\t\t,5.58144\n\t\t\t\t,3.59863\n\t\t\t\t,0.256977\n\t\t\t\t,5.00024\n\t\t\t\t,4.4307\n\t\t\t\t,0.116663\n\t\t\t\t,4.94212\n\t\t\t\t,5.26276\n\t\t\t\t,0.256977\n\t\t\t\t,5.00024\n\t\t\t\t,4.4307\n\t\t\t\t,0.116663\n\t\t\t\t,4.94212\n\t\t\t\t,4.4307\n\t\t\t\t,0.478809\n\t\t\t\t,4.40013\n\t\t\t\t,5.26276\n\t\t\t\t,0.586201\n\t\t\t\t,4.50752\n\t\t\t\t,4.4307\n\t\t\t\t,0.116663\n\t\t\t\t,4.94212\n\t\t\t\t,3.59863\n\t\t\t\t,0.256977\n\t\t\t\t,5.00024\n\t\t\t\t,4.4307\n\t\t\t\t,0.478809\n\t\t\t\t,4.40013\n\t\t\t\t,3.59863\n\t\t\t\t,0.586201\n\t\t\t\t,4.50752\n\t\t\t\t,5.26276\n\t\t\t\t,0.586201\n\t\t\t\t,4.50752\n\t\t\t\t,4.4307\n\t\t\t\t,0.478809\n\t\t\t\t,4.40013\n\t\t\t\t,5.26276\n\t\t\t\t,1.07892\n\t\t\t\t,4.1783\n\t\t\t\t,4.4307\n\t\t\t\t,1.0208\n\t\t\t\t,4.03798\n\t\t\t\t,4.4307\n\t\t\t\t,0.478809\n\t\t\t\t,4.40013\n\t\t\t\t,3.59863\n\t\t\t\t,0.586201\n\t\t\t\t,4.50752\n\t\t\t\t,3.59863\n\t\t\t\t,1.07892\n\t\t\t\t,4.1783\n\t\t\t\t,4.4307\n\t\t\t\t,1.0208\n\t\t\t\t,4.03798\n\t\t\t\t,5.26276\n\t\t\t\t,1.07892\n\t\t\t\t,4.1783\n\t\t\t\t,4.4307\n\t\t\t\t,1.0208\n\t\t\t\t,4.03798\n\t\t\t\t,4.4307\n\t\t\t\t,1.66012\n\t\t\t\t,3.91081\n\t\t\t\t,5.26276\n\t\t\t\t,1.66012\n\t\t\t\t,4.06269\n\t\t\t\t,4.4307\n\t\t\t\t,1.0208\n\t\t\t\t,4.03798\n\t\t\t\t,3.59863\n\t\t\t\t,1.07892\n\t\t\t\t,4.1783\n\t\t\t\t,4.4307\n\t\t\t\t,1.66012\n\t\t\t\t,3.91081\n\t\t\t\t,3.59863\n\t\t\t\t,1.66012\n\t\t\t\t,4.06269\n\t\t\t\t,5.26276\n\t\t\t\t,1.66012\n\t\t\t\t,4.06269\n\t\t\t\t,4.4307\n\t\t\t\t,1.66012\n\t\t\t\t,3.91081\n\t\t\t\t,5.26276\n\t\t\t\t,2.24132\n\t\t\t\t,4.1783\n\t\t\t\t,4.4307\n\t\t\t\t,2.29944\n\t\t\t\t,4.03798\n\t\t\t\t,4.4307\n\t\t\t\t,1.66012\n\t\t\t\t,3.91081\n\t\t\t\t,3.59863\n\t\t\t\t,1.66012\n\t\t\t\t,4.06269\n\t\t\t\t,3.59863\n\t\t\t\t,2.24132\n\t\t\t\t,4.1783\n\t\t\t\t,4.4307\n\t\t\t\t,2.29944\n\t\t\t\t,4.03798\n\t\t\t\t,5.26276\n\t\t\t\t,2.24132\n\t\t\t\t,4.1783\n\t\t\t\t,4.4307\n\t\t\t\t,2.29944\n\t\t\t\t,4.03798\n\t\t\t\t,4.4307\n\t\t\t\t,2.84143\n\t\t\t\t,4.40013\n\t\t\t\t,5.26276\n\t\t\t\t,2.73404\n\t\t\t\t,4.50752\n\t\t\t\t,4.4307\n\t\t\t\t,2.29944\n\t\t\t\t,4.03798\n\t\t\t\t,3.59863\n\t\t\t\t,2.24132\n\t\t\t\t,4.1783\n\t\t\t\t,4.4307\n\t\t\t\t,2.84143\n\t\t\t\t,4.40013\n\t\t\t\t,3.59863\n\t\t\t\t,2.73404\n\t\t\t\t,4.50752\n\t\t\t\t,5.26276\n\t\t\t\t,2.73404\n\t\t\t\t,4.50752\n\t\t\t\t,4.4307\n\t\t\t\t,2.84143\n\t\t\t\t,4.40013\n\t\t\t\t,5.26276\n\t\t\t\t,3.06326\n\t\t\t\t,5.00024\n\t\t\t\t,4.4307\n\t\t\t\t,3.20358\n\t\t\t\t,4.94212\n\t\t\t\t,4.4307\n\t\t\t\t,2.84143\n\t\t\t\t,4.40013\n\t\t\t\t,3.59863\n\t\t\t\t,2.73404\n\t\t\t\t,4.50752\n\t\t\t\t,3.59863\n\t\t\t\t,3.06326\n\t\t\t\t,5.00024\n\t\t\t\t,4.4307\n\t\t\t\t,3.20358\n\t\t\t\t,4.94212\n\t\t\t\t,5.26276\n\t\t\t\t,3.06326\n\t\t\t\t,5.00024\n\t\t\t\t,4.4307\n\t\t\t\t,3.20358\n\t\t\t\t,4.94212\n\t\t\t\t,4.4307\n\t\t\t\t,3.33074\n\t\t\t\t,5.58144\n\t\t\t\t,5.26276\n\t\t\t\t,3.17887\n\t\t\t\t,5.58144\n\t\t\t\t,4.4307\n\t\t\t\t,3.20358\n\t\t\t\t,4.94212\n\t\t\t\t,3.59863\n\t\t\t\t,3.06326\n\t\t\t\t,5.00024\n\t\t\t\t,4.4307\n\t\t\t\t,3.33074\n\t\t\t\t,5.58144\n\t\t\t\t,3.59863\n\t\t\t\t,3.17887\n\t\t\t\t,5.58144\n\t\t\t\t,-5.3674\n\t\t\t\t,1.66012\n\t\t\t\t,-5\n\t\t\t\t,-5.3674\n\t\t\t\t,2.71248\n\t\t\t\t,-4.5641\n\t\t\t\t,-5.3674\n\t\t\t\t,2.79918\n\t\t\t\t,-5\n\t\t\t\t,-3.33216\n\t\t\t\t,2.8294\n\t\t\t\t,-4.51567\n\t\t\t\t,-3.33216\n\t\t\t\t,1.66012\n\t\t\t\t,-5\n\t\t\t\t,-3.33216\n\t\t\t\t,2.92574\n\t\t\t\t,-5\n\t\t\t\t,-5.26276\n\t\t\t\t,3.06326\n\t\t\t\t,-4.4188\n\t\t\t\t,-5.26276\n\t\t\t\t,3.17887\n\t\t\t\t,-5\n\t\t\t\t,-5.52924\n\t\t\t\t,2.92574\n\t\t\t\t,-5\n\t\t\t\t,-5.52924\n\t\t\t\t,2.8294\n\t\t\t\t,-4.51567\n\t\t\t\t,-3.59863\n\t\t\t\t,3.06326\n\t\t\t\t,-4.4188\n\t\t\t\t,-3.59863\n\t\t\t\t,3.17887\n\t\t\t\t,-5\n\t\t\t\t,-5.3674\n\t\t\t\t,2.46556\n\t\t\t\t,-4.19456\n\t\t\t\t,-3.33216\n\t\t\t\t,2.55505\n\t\t\t\t,-4.10507\n\t\t\t\t,-5.52924\n\t\t\t\t,2.55505\n\t\t\t\t,-4.10507\n\t\t\t\t,-5.26276\n\t\t\t\t,2.73404\n\t\t\t\t,-3.92608\n\t\t\t\t,-3.59863\n\t\t\t\t,2.73404\n\t\t\t\t,-3.92608\n\t\t\t\t,-5.3674\n\t\t\t\t,2.09602\n\t\t\t\t,-3.94765\n\t\t\t\t,-3.33216\n\t\t\t\t,2.14445\n\t\t\t\t,-3.83072\n\t\t\t\t,-5.26276\n\t\t\t\t,2.24132\n\t\t\t\t,-3.59686\n\t\t\t\t,-5.52924\n\t\t\t\t,2.14445\n\t\t\t\t,-3.83072\n\t\t\t\t,-3.59863\n\t\t\t\t,2.24132\n\t\t\t\t,-3.59686\n\t\t\t\t,-5.3674\n\t\t\t\t,1.66012\n\t\t\t\t,-3.86094\n\t\t\t\t,-3.33216\n\t\t\t\t,1.66012\n\t\t\t\t,-3.73438\n\t\t\t\t,-5.52924\n\t\t\t\t,1.66012\n\t\t\t\t,-3.73438\n\t\t\t\t,-5.26276\n\t\t\t\t,1.66012\n\t\t\t\t,-3.48125\n\t\t\t\t,-3.59863\n\t\t\t\t,1.66012\n\t\t\t\t,-3.48125\n\t\t\t\t,-5.3674\n\t\t\t\t,1.22421\n\t\t\t\t,-3.94765\n\t\t\t\t,-3.33216\n\t\t\t\t,1.17579\n\t\t\t\t,-3.83072\n\t\t\t\t,-5.26276\n\t\t\t\t,1.07892\n\t\t\t\t,-3.59686\n\t\t\t\t,-5.52924\n\t\t\t\t,1.17579\n\t\t\t\t,-3.83072\n\t\t\t\t,-3.59863\n\t\t\t\t,1.07892\n\t\t\t\t,-3.59686\n\t\t\t\t,-5.3674\n\t\t\t\t,0.854673\n\t\t\t\t,-4.19456\n\t\t\t\t,-3.33216\n\t\t\t\t,0.765187\n\t\t\t\t,-4.10507\n\t\t\t\t,-5.52924\n\t\t\t\t,0.765187\n\t\t\t\t,-4.10507\n\t\t\t\t,-5.26276\n\t\t\t\t,0.586201\n\t\t\t\t,-3.92608\n\t\t\t\t,-3.59863\n\t\t\t\t,0.586201\n\t\t\t\t,-3.92608\n\t\t\t\t,-5.3674\n\t\t\t\t,0.607756\n\t\t\t\t,-4.5641\n\t\t\t\t,-3.33216\n\t\t\t\t,0.490834\n\t\t\t\t,-4.51567\n\t\t\t\t,-5.26276\n\t\t\t\t,0.256977\n\t\t\t\t,-4.4188\n\t\t\t\t,-5.52924\n\t\t\t\t,0.490834\n\t\t\t\t,-4.51567\n\t\t\t\t,-3.59863\n\t\t\t\t,0.256977\n\t\t\t\t,-4.4188\n\t\t\t\t,-5.3674\n\t\t\t\t,0.52106\n\t\t\t\t,-5\n\t\t\t\t,-3.33216\n\t\t\t\t,0.394494\n\t\t\t\t,-5\n\t\t\t\t,-5.52924\n\t\t\t\t,0.394494\n\t\t\t\t,-5\n\t\t\t\t,-5.26276\n\t\t\t\t,0.141369\n\t\t\t\t,-5\n\t\t\t\t,-3.59863\n\t\t\t\t,0.141369\n\t\t\t\t,-5\n\t\t\t\t,-5.3674\n\t\t\t\t,0.607756\n\t\t\t\t,-5.4359\n\t\t\t\t,-3.33216\n\t\t\t\t,0.490834\n\t\t\t\t,-5.48433\n\t\t\t\t,-5.26276\n\t\t\t\t,0.256977\n\t\t\t\t,-5.5812\n\t\t\t\t,-5.52924\n\t\t\t\t,0.490834\n\t\t\t\t,-5.48433\n\t\t\t\t,-3.59863\n\t\t\t\t,0.256977\n\t\t\t\t,-5.5812\n\t\t\t\t,-5.3674\n\t\t\t\t,0.854673\n\t\t\t\t,-5.80544\n\t\t\t\t,-3.33216\n\t\t\t\t,0.765187\n\t\t\t\t,-5.89493\n\t\t\t\t,-5.52924\n\t\t\t\t,0.765187\n\t\t\t\t,-5.89493\n\t\t\t\t,-5.26276\n\t\t\t\t,0.586201\n\t\t\t\t,-6.07392\n\t\t\t\t,-3.59863\n\t\t\t\t,0.586201\n\t\t\t\t,-6.07392\n\t\t\t\t,-5.3674\n\t\t\t\t,1.22421\n\t\t\t\t,-6.05235\n\t\t\t\t,-3.33216\n\t\t\t\t,1.17579\n\t\t\t\t,-6.16928\n\t\t\t\t,-5.26276\n\t\t\t\t,1.07892\n\t\t\t\t,-6.40314\n\t\t\t\t,-5.52924\n\t\t\t\t,1.17579\n\t\t\t\t,-6.16928\n\t\t\t\t,-3.59863\n\t\t\t\t,1.07892\n\t\t\t\t,-6.40314\n\t\t\t\t,-5.3674\n\t\t\t\t,1.66012\n\t\t\t\t,-6.13906\n\t\t\t\t,-3.33216\n\t\t\t\t,1.66012\n\t\t\t\t,-6.26563\n\t\t\t\t,-5.52924\n\t\t\t\t,1.66012\n\t\t\t\t,-6.26563\n\t\t\t\t,-5.26276\n\t\t\t\t,1.66012\n\t\t\t\t,-6.51875\n\t\t\t\t,-3.59863\n\t\t\t\t,1.66012\n\t\t\t\t,-6.51875\n\t\t\t\t,-5.3674\n\t\t\t\t,2.09602\n\t\t\t\t,-6.05235\n\t\t\t\t,-3.33216\n\t\t\t\t,2.14445\n\t\t\t\t,-6.16928\n\t\t\t\t,-5.26276\n\t\t\t\t,2.24132\n\t\t\t\t,-6.40314\n\t\t\t\t,-5.52924\n\t\t\t\t,2.14445\n\t\t\t\t,-6.16928\n\t\t\t\t,-3.59863\n\t\t\t\t,2.24132\n\t\t\t\t,-6.40314\n\t\t\t\t,-5.3674\n\t\t\t\t,2.46556\n\t\t\t\t,-5.80544\n\t\t\t\t,-3.33216\n\t\t\t\t,2.55505\n\t\t\t\t,-5.89493\n\t\t\t\t,-5.52924\n\t\t\t\t,2.55505\n\t\t\t\t,-5.89493\n\t\t\t\t,-5.26276\n\t\t\t\t,2.73404\n\t\t\t\t,-6.07392\n\t\t\t\t,-3.59863\n\t\t\t\t,2.73404\n\t\t\t\t,-6.07392\n\t\t\t\t,-5.3674\n\t\t\t\t,2.71248\n\t\t\t\t,-5.4359\n\t\t\t\t,-3.33216\n\t\t\t\t,2.8294\n\t\t\t\t,-5.48433\n\t\t\t\t,-5.26276\n\t\t\t\t,3.06326\n\t\t\t\t,-5.5812\n\t\t\t\t,-5.52924\n\t\t\t\t,2.8294\n\t\t\t\t,-5.48433\n\t\t\t\t,-3.59863\n\t\t\t\t,3.06326\n\t\t\t\t,-5.5812\n\t\t\t\t,-5.26276\n\t\t\t\t,3.06326\n\t\t\t\t,-4.4188\n\t\t\t\t,-4.4307\n\t\t\t\t,3.33074\n\t\t\t\t,-5\n\t\t\t\t,-5.26276\n\t\t\t\t,3.17887\n\t\t\t\t,-5\n\t\t\t\t,-4.4307\n\t\t\t\t,3.20358\n\t\t\t\t,-4.36068\n\t\t\t\t,-3.59863\n\t\t\t\t,3.06326\n\t\t\t\t,-4.4188\n\t\t\t\t,-3.59863\n\t\t\t\t,3.17887\n\t\t\t\t,-5\n\t\t\t\t,-4.4307\n\t\t\t\t,3.33074\n\t\t\t\t,-5\n\t\t\t\t,-4.4307\n\t\t\t\t,3.20358\n\t\t\t\t,-4.36068\n\t\t\t\t,-4.4307\n\t\t\t\t,2.84143\n\t\t\t\t,-3.81869\n\t\t\t\t,-4.4307\n\t\t\t\t,3.20358\n\t\t\t\t,-4.36068\n\t\t\t\t,-5.26276\n\t\t\t\t,3.06326\n\t\t\t\t,-4.4188\n\t\t\t\t,-5.26276\n\t\t\t\t,2.73404\n\t\t\t\t,-3.92608\n\t\t\t\t,-4.4307\n\t\t\t\t,2.84143\n\t\t\t\t,-3.81869\n\t\t\t\t,-3.59863\n\t\t\t\t,3.06326\n\t\t\t\t,-4.4188\n\t\t\t\t,-4.4307\n\t\t\t\t,3.20358\n\t\t\t\t,-4.36068\n\t\t\t\t,-3.59863\n\t\t\t\t,2.73404\n\t\t\t\t,-3.92608\n\t\t\t\t,-5.26276\n\t\t\t\t,2.24132\n\t\t\t\t,-3.59686\n\t\t\t\t,-4.4307\n\t\t\t\t,2.84143\n\t\t\t\t,-3.81869\n\t\t\t\t,-5.26276\n\t\t\t\t,2.73404\n\t\t\t\t,-3.92608\n\t\t\t\t,-4.4307\n\t\t\t\t,2.29944\n\t\t\t\t,-3.45654\n\t\t\t\t,-3.59863\n\t\t\t\t,2.24132\n\t\t\t\t,-3.59686\n\t\t\t\t,-3.59863\n\t\t\t\t,2.73404\n\t\t\t\t,-3.92608\n\t\t\t\t,-4.4307\n\t\t\t\t,2.84143\n\t\t\t\t,-3.81869\n\t\t\t\t,-4.4307\n\t\t\t\t,2.29944\n\t\t\t\t,-3.45654\n\t\t\t\t,-4.4307\n\t\t\t\t,1.66012\n\t\t\t\t,-3.32937\n\t\t\t\t,-4.4307\n\t\t\t\t,2.29944\n\t\t\t\t,-3.45654\n\t\t\t\t,-5.26276\n\t\t\t\t,2.24132\n\t\t\t\t,-3.59686\n\t\t\t\t,-5.26276\n\t\t\t\t,1.66012\n\t\t\t\t,-3.48125\n\t\t\t\t,-4.4307\n\t\t\t\t,1.66012\n\t\t\t\t,-3.32937\n\t\t\t\t,-3.59863\n\t\t\t\t,2.24132\n\t\t\t\t,-3.59686\n\t\t\t\t,-4.4307\n\t\t\t\t,2.29944\n\t\t\t\t,-3.45654\n\t\t\t\t,-3.59863\n\t\t\t\t,1.66012\n\t\t\t\t,-3.48125\n\t\t\t\t,-5.26276\n\t\t\t\t,1.07892\n\t\t\t\t,-3.59686\n\t\t\t\t,-4.4307\n\t\t\t\t,1.66012\n\t\t\t\t,-3.32937\n\t\t\t\t,-5.26276\n\t\t\t\t,1.66012\n\t\t\t\t,-3.48125\n\t\t\t\t,-4.4307\n\t\t\t\t,1.0208\n\t\t\t\t,-3.45654\n\t\t\t\t,-3.59863\n\t\t\t\t,1.07892\n\t\t\t\t,-3.59686\n\t\t\t\t,-3.59863\n\t\t\t\t,1.66012\n\t\t\t\t,-3.48125\n\t\t\t\t,-4.4307\n\t\t\t\t,1.66012\n\t\t\t\t,-3.32937\n\t\t\t\t,-4.4307\n\t\t\t\t,1.0208\n\t\t\t\t,-3.45654\n\t\t\t\t,-4.4307\n\t\t\t\t,0.478809\n\t\t\t\t,-3.81869\n\t\t\t\t,-4.4307\n\t\t\t\t,1.0208\n\t\t\t\t,-3.45654\n\t\t\t\t,-5.26276\n\t\t\t\t,1.07892\n\t\t\t\t,-3.59686\n\t\t\t\t,-5.26276\n\t\t\t\t,0.586201\n\t\t\t\t,-3.92608\n\t\t\t\t,-4.4307\n\t\t\t\t,0.478809\n\t\t\t\t,-3.81869\n\t\t\t\t,-3.59863\n\t\t\t\t,1.07892\n\t\t\t\t,-3.59686\n\t\t\t\t,-4.4307\n\t\t\t\t,1.0208\n\t\t\t\t,-3.45654\n\t\t\t\t,-3.59863\n\t\t\t\t,0.586201\n\t\t\t\t,-3.92608\n\t\t\t\t,-5.26276\n\t\t\t\t,0.256977\n\t\t\t\t,-4.4188\n\t\t\t\t,-4.4307\n\t\t\t\t,0.478809\n\t\t\t\t,-3.81869\n\t\t\t\t,-5.26276\n\t\t\t\t,0.586201\n\t\t\t\t,-3.92608\n\t\t\t\t,-4.4307\n\t\t\t\t,0.116663\n\t\t\t\t,-4.36068\n\t\t\t\t,-3.59863\n\t\t\t\t,0.256977\n\t\t\t\t,-4.4188\n\t\t\t\t,-3.59863\n\t\t\t\t,0.586201\n\t\t\t\t,-3.92608\n\t\t\t\t,-4.4307\n\t\t\t\t,0.478809\n\t\t\t\t,-3.81869\n\t\t\t\t,-4.4307\n\t\t\t\t,0.116663\n\t\t\t\t,-4.36068\n\t\t\t\t,-4.4307\n\t\t\t\t,-0.0105057\n\t\t\t\t,-5\n\t\t\t\t,-4.4307\n\t\t\t\t,0.116663\n\t\t\t\t,-4.36068\n\t\t\t\t,-5.26276\n\t\t\t\t,0.256977\n\t\t\t\t,-4.4188\n\t\t\t\t,-5.26276\n\t\t\t\t,0.141369\n\t\t\t\t,-5\n\t\t\t\t,-4.4307\n\t\t\t\t,-0.0105057\n\t\t\t\t,-5\n\t\t\t\t,-3.59863\n\t\t\t\t,0.256977\n\t\t\t\t,-4.4188\n\t\t\t\t,-4.4307\n\t\t\t\t,0.116663\n\t\t\t\t,-4.36068\n\t\t\t\t,-3.59863\n\t\t\t\t,0.141369\n\t\t\t\t,-5\n\t\t\t\t,-5.26276\n\t\t\t\t,0.256977\n\t\t\t\t,-5.5812\n\t\t\t\t,-4.4307\n\t\t\t\t,-0.0105057\n\t\t\t\t,-5\n\t\t\t\t,-5.26276\n\t\t\t\t,0.141369\n\t\t\t\t,-5\n\t\t\t\t,-4.4307\n\t\t\t\t,0.116663\n\t\t\t\t,-5.63932\n\t\t\t\t,-3.59863\n\t\t\t\t,0.256977\n\t\t\t\t,-5.5812\n\t\t\t\t,-3.59863\n\t\t\t\t,0.141369\n\t\t\t\t,-5\n\t\t\t\t,-4.4307\n\t\t\t\t,-0.0105057\n\t\t\t\t,-5\n\t\t\t\t,-4.4307\n\t\t\t\t,0.116663\n\t\t\t\t,-5.63932\n\t\t\t\t,-4.4307\n\t\t\t\t,0.478809\n\t\t\t\t,-6.18131\n\t\t\t\t,-4.4307\n\t\t\t\t,0.116663\n\t\t\t\t,-5.63932\n\t\t\t\t,-5.26276\n\t\t\t\t,0.256977\n\t\t\t\t,-5.5812\n\t\t\t\t,-5.26276\n\t\t\t\t,0.586201\n\t\t\t\t,-6.07392\n\t\t\t\t,-4.4307\n\t\t\t\t,0.478809\n\t\t\t\t,-6.18131\n\t\t\t\t,-3.59863\n\t\t\t\t,0.256977\n\t\t\t\t,-5.5812\n\t\t\t\t,-4.4307\n\t\t\t\t,0.116663\n\t\t\t\t,-5.63932\n\t\t\t\t,-3.59863\n\t\t\t\t,0.586201\n\t\t\t\t,-6.07392\n\t\t\t\t,-5.26276\n\t\t\t\t,1.07892\n\t\t\t\t,-6.40314\n\t\t\t\t,-4.4307\n\t\t\t\t,0.478809\n\t\t\t\t,-6.18131\n\t\t\t\t,-5.26276\n\t\t\t\t,0.586201\n\t\t\t\t,-6.07392\n\t\t\t\t,-4.4307\n\t\t\t\t,1.0208\n\t\t\t\t,-6.54346\n\t\t\t\t,-3.59863\n\t\t\t\t,1.07892\n\t\t\t\t,-6.40314\n\t\t\t\t,-3.59863\n\t\t\t\t,0.586201\n\t\t\t\t,-6.07392\n\t\t\t\t,-4.4307\n\t\t\t\t,0.478809\n\t\t\t\t,-6.18131\n\t\t\t\t,-4.4307\n\t\t\t\t,1.0208\n\t\t\t\t,-6.54346\n\t\t\t\t,-4.4307\n\t\t\t\t,1.66012\n\t\t\t\t,-6.67063\n\t\t\t\t,-4.4307\n\t\t\t\t,1.0208\n\t\t\t\t,-6.54346\n\t\t\t\t,-5.26276\n\t\t\t\t,1.07892\n\t\t\t\t,-6.40314\n\t\t\t\t,-5.26276\n\t\t\t\t,1.66012\n\t\t\t\t,-6.51875\n\t\t\t\t,-4.4307\n\t\t\t\t,1.66012\n\t\t\t\t,-6.67063\n\t\t\t\t,-3.59863\n\t\t\t\t,1.07892\n\t\t\t\t,-6.40314\n\t\t\t\t,-4.4307\n\t\t\t\t,1.0208\n\t\t\t\t,-6.54346\n\t\t\t\t,-3.59863\n\t\t\t\t,1.66012\n\t\t\t\t,-6.51875\n\t\t\t\t,-5.26276\n\t\t\t\t,2.24132\n\t\t\t\t,-6.40314\n\t\t\t\t,-4.4307\n\t\t\t\t,1.66012\n\t\t\t\t,-6.67063\n\t\t\t\t,-5.26276\n\t\t\t\t,1.66012\n\t\t\t\t,-6.51875\n\t\t\t\t,-4.4307\n\t\t\t\t,2.29944\n\t\t\t\t,-6.54346\n\t\t\t\t,-3.59863\n\t\t\t\t,2.24132\n\t\t\t\t,-6.40314\n\t\t\t\t,-3.59863\n\t\t\t\t,1.66012\n\t\t\t\t,-6.51875\n\t\t\t\t,-4.4307\n\t\t\t\t,1.66012\n\t\t\t\t,-6.67063\n\t\t\t\t,-4.4307\n\t\t\t\t,2.29944\n\t\t\t\t,-6.54346\n\t\t\t\t,-4.4307\n\t\t\t\t,2.84143\n\t\t\t\t,-6.18131\n\t\t\t\t,-4.4307\n\t\t\t\t,2.29944\n\t\t\t\t,-6.54346\n\t\t\t\t,-5.26276\n\t\t\t\t,2.24132\n\t\t\t\t,-6.40314\n\t\t\t\t,-5.26276\n\t\t\t\t,2.73404\n\t\t\t\t,-6.07392\n\t\t\t\t,-4.4307\n\t\t\t\t,2.84143\n\t\t\t\t,-6.18131\n\t\t\t\t,-3.59863\n\t\t\t\t,2.24132\n\t\t\t\t,-6.40314\n\t\t\t\t,-4.4307\n\t\t\t\t,2.29944\n\t\t\t\t,-6.54346\n\t\t\t\t,-3.59863\n\t\t\t\t,2.73404\n\t\t\t\t,-6.07392\n\t\t\t\t,-5.26276\n\t\t\t\t,3.06326\n\t\t\t\t,-5.5812\n\t\t\t\t,-4.4307\n\t\t\t\t,2.84143\n\t\t\t\t,-6.18131\n\t\t\t\t,-5.26276\n\t\t\t\t,2.73404\n\t\t\t\t,-6.07392\n\t\t\t\t,-4.4307\n\t\t\t\t,3.20358\n\t\t\t\t,-5.63932\n\t\t\t\t,-3.59863\n\t\t\t\t,3.06326\n\t\t\t\t,-5.5812\n\t\t\t\t,-3.59863\n\t\t\t\t,2.73404\n\t\t\t\t,-6.07392\n\t\t\t\t,-4.4307\n\t\t\t\t,2.84143\n\t\t\t\t,-6.18131\n\t\t\t\t,-4.4307\n\t\t\t\t,3.20358\n\t\t\t\t,-5.63932\n\t\t\t\t,-4.4307\n\t\t\t\t,3.33074\n\t\t\t\t,-5\n\t\t\t\t,-4.4307\n\t\t\t\t,3.20358\n\t\t\t\t,-5.63932\n\t\t\t\t,-5.26276\n\t\t\t\t,3.06326\n\t\t\t\t,-5.5812\n\t\t\t\t,-5.26276\n\t\t\t\t,3.17887\n\t\t\t\t,-5\n\t\t\t\t,-4.4307\n\t\t\t\t,3.33074\n\t\t\t\t,-5\n\t\t\t\t,-3.59863\n\t\t\t\t,3.06326\n\t\t\t\t,-5.5812\n\t\t\t\t,-4.4307\n\t\t\t\t,3.20358\n\t\t\t\t,-5.63932\n\t\t\t\t,-3.59863\n\t\t\t\t,3.17887\n\t\t\t\t,-5\n\t\t\t\t,-5.3674\n\t\t\t\t,1.66012\n\t\t\t\t,5.58144\n\t\t\t\t,-5.3674\n\t\t\t\t,2.71248\n\t\t\t\t,6.01734\n\t\t\t\t,-5.3674\n\t\t\t\t,2.79918\n\t\t\t\t,5.58144\n\t\t\t\t,-3.33216\n\t\t\t\t,2.8294\n\t\t\t\t,6.06577\n\t\t\t\t,-3.33216\n\t\t\t\t,1.66012\n\t\t\t\t,5.58144\n\t\t\t\t,-3.33216\n\t\t\t\t,2.92574\n\t\t\t\t,5.58144\n\t\t\t\t,-5.26276\n\t\t\t\t,3.06326\n\t\t\t\t,6.16264\n\t\t\t\t,-5.26276\n\t\t\t\t,3.17887\n\t\t\t\t,5.58144\n\t\t\t\t,-5.52924\n\t\t\t\t,2.92574\n\t\t\t\t,5.58144\n\t\t\t\t,-5.52924\n\t\t\t\t,2.8294\n\t\t\t\t,6.06577\n\t\t\t\t,-3.59863\n\t\t\t\t,3.06326\n\t\t\t\t,6.16264\n\t\t\t\t,-3.59863\n\t\t\t\t,3.17887\n\t\t\t\t,5.58144\n\t\t\t\t,-5.3674\n\t\t\t\t,2.46556\n\t\t\t\t,6.38688\n\t\t\t\t,-3.33216\n\t\t\t\t,2.55505\n\t\t\t\t,6.47637\n\t\t\t\t,-5.52924\n\t\t\t\t,2.55505\n\t\t\t\t,6.47637\n\t\t\t\t,-5.26276\n\t\t\t\t,2.73404\n\t\t\t\t,6.65536\n\t\t\t\t,-3.59863\n\t\t\t\t,2.73404\n\t\t\t\t,6.65536\n\t\t\t\t,-5.3674\n\t\t\t\t,2.09602\n\t\t\t\t,6.63379\n\t\t\t\t,-3.33216\n\t\t\t\t,2.14445\n\t\t\t\t,6.75072\n\t\t\t\t,-5.26276\n\t\t\t\t,2.24132\n\t\t\t\t,6.98458\n\t\t\t\t,-5.52924\n\t\t\t\t,2.14445\n\t\t\t\t,6.75072\n\t\t\t\t,-3.59863\n\t\t\t\t,2.24132\n\t\t\t\t,6.98458\n\t\t\t\t,-5.3674\n\t\t\t\t,1.66012\n\t\t\t\t,6.7205\n\t\t\t\t,-3.33216\n\t\t\t\t,1.66012\n\t\t\t\t,6.84706\n\t\t\t\t,-5.52924\n\t\t\t\t,1.66012\n\t\t\t\t,6.84706\n\t\t\t\t,-5.26276\n\t\t\t\t,1.66012\n\t\t\t\t,7.10019\n\t\t\t\t,-3.59863\n\t\t\t\t,1.66012\n\t\t\t\t,7.10019\n\t\t\t\t,-5.3674\n\t\t\t\t,1.22421\n\t\t\t\t,6.63379\n\t\t\t\t,-3.33216\n\t\t\t\t,1.17579\n\t\t\t\t,6.75072\n\t\t\t\t,-5.26276\n\t\t\t\t,1.07892\n\t\t\t\t,6.98458\n\t\t\t\t,-5.52924\n\t\t\t\t,1.17579\n\t\t\t\t,6.75072\n\t\t\t\t,-3.59863\n\t\t\t\t,1.07892\n\t\t\t\t,6.98458\n\t\t\t\t,-5.3674\n\t\t\t\t,0.854673\n\t\t\t\t,6.38688\n\t\t\t\t,-3.33216\n\t\t\t\t,0.765187\n\t\t\t\t,6.47637\n\t\t\t\t,-5.52924\n\t\t\t\t,0.765187\n\t\t\t\t,6.47637\n\t\t\t\t,-5.26276\n\t\t\t\t,0.586201\n\t\t\t\t,6.65536\n\t\t\t\t,-3.59863\n\t\t\t\t,0.586201\n\t\t\t\t,6.65536\n\t\t\t\t,-5.3674\n\t\t\t\t,0.607756\n\t\t\t\t,6.01734\n\t\t\t\t,-3.33216\n\t\t\t\t,0.490834\n\t\t\t\t,6.06577\n\t\t\t\t,-5.26276\n\t\t\t\t,0.256977\n\t\t\t\t,6.16264\n\t\t\t\t,-5.52924\n\t\t\t\t,0.490834\n\t\t\t\t,6.06577\n\t\t\t\t,-3.59863\n\t\t\t\t,0.256977\n\t\t\t\t,6.16264\n\t\t\t\t,-5.3674\n\t\t\t\t,0.52106\n\t\t\t\t,5.58144\n\t\t\t\t,-3.33216\n\t\t\t\t,0.394494\n\t\t\t\t,5.58144\n\t\t\t\t,-5.52924\n\t\t\t\t,0.394494\n\t\t\t\t,5.58144\n\t\t\t\t,-5.26276\n\t\t\t\t,0.141369\n\t\t\t\t,5.58144\n\t\t\t\t,-3.59863\n\t\t\t\t,0.141369\n\t\t\t\t,5.58144\n\t\t\t\t,-5.3674\n\t\t\t\t,0.607756\n\t\t\t\t,5.14554\n\t\t\t\t,-3.33216\n\t\t\t\t,0.490834\n\t\t\t\t,5.09711\n\t\t\t\t,-5.26276\n\t\t\t\t,0.256977\n\t\t\t\t,5.00024\n\t\t\t\t,-5.52924\n\t\t\t\t,0.490834\n\t\t\t\t,5.09711\n\t\t\t\t,-3.59863\n\t\t\t\t,0.256977\n\t\t\t\t,5.00024\n\t\t\t\t,-5.3674\n\t\t\t\t,0.854673\n\t\t\t\t,4.776\n\t\t\t\t,-3.33216\n\t\t\t\t,0.765187\n\t\t\t\t,4.68651\n\t\t\t\t,-5.52924\n\t\t\t\t,0.765187\n\t\t\t\t,4.68651\n\t\t\t\t,-5.26276\n\t\t\t\t,0.586201\n\t\t\t\t,4.50752\n\t\t\t\t,-3.59863\n\t\t\t\t,0.586201\n\t\t\t\t,4.50752\n\t\t\t\t,-5.3674\n\t\t\t\t,1.22421\n\t\t\t\t,4.52909\n\t\t\t\t,-3.33216\n\t\t\t\t,1.17579\n\t\t\t\t,4.41216\n\t\t\t\t,-5.26276\n\t\t\t\t,1.07892\n\t\t\t\t,4.1783\n\t\t\t\t,-5.52924\n\t\t\t\t,1.17579\n\t\t\t\t,4.41216\n\t\t\t\t,-3.59863\n\t\t\t\t,1.07892\n\t\t\t\t,4.1783\n\t\t\t\t,-5.3674\n\t\t\t\t,1.66012\n\t\t\t\t,4.44238\n\t\t\t\t,-3.33216\n\t\t\t\t,1.66012\n\t\t\t\t,4.31581\n\t\t\t\t,-5.52924\n\t\t\t\t,1.66012\n\t\t\t\t,4.31581\n\t\t\t\t,-5.26276\n\t\t\t\t,1.66012\n\t\t\t\t,4.06269\n\t\t\t\t,-3.59863\n\t\t\t\t,1.66012\n\t\t\t\t,4.06269\n\t\t\t\t,-5.3674\n\t\t\t\t,2.09602\n\t\t\t\t,4.52909\n\t\t\t\t,-3.33216\n\t\t\t\t,2.14445\n\t\t\t\t,4.41216\n\t\t\t\t,-5.26276\n\t\t\t\t,2.24132\n\t\t\t\t,4.1783\n\t\t\t\t,-5.52924\n\t\t\t\t,2.14445\n\t\t\t\t,4.41216\n\t\t\t\t,-3.59863\n\t\t\t\t,2.24132\n\t\t\t\t,4.1783\n\t\t\t\t,-5.3674\n\t\t\t\t,2.46556\n\t\t\t\t,4.776\n\t\t\t\t,-3.33216\n\t\t\t\t,2.55505\n\t\t\t\t,4.68651\n\t\t\t\t,-5.52924\n\t\t\t\t,2.55505\n\t\t\t\t,4.68651\n\t\t\t\t,-5.26276\n\t\t\t\t,2.73404\n\t\t\t\t,4.50752\n\t\t\t\t,-3.59863\n\t\t\t\t,2.73404\n\t\t\t\t,4.50752\n\t\t\t\t,-5.3674\n\t\t\t\t,2.71248\n\t\t\t\t,5.14554\n\t\t\t\t,-3.33216\n\t\t\t\t,2.8294\n\t\t\t\t,5.09711\n\t\t\t\t,-5.26276\n\t\t\t\t,3.06326\n\t\t\t\t,5.00024\n\t\t\t\t,-5.52924\n\t\t\t\t,2.8294\n\t\t\t\t,5.09711\n\t\t\t\t,-3.59863\n\t\t\t\t,3.06326\n\t\t\t\t,5.00024\n\t\t\t\t,-5.26276\n\t\t\t\t,3.06326\n\t\t\t\t,6.16264\n\t\t\t\t,-4.4307\n\t\t\t\t,3.33074\n\t\t\t\t,5.58144\n\t\t\t\t,-5.26276\n\t\t\t\t,3.17887\n\t\t\t\t,5.58144\n\t\t\t\t,-4.4307\n\t\t\t\t,3.20358\n\t\t\t\t,6.22076\n\t\t\t\t,-3.59863\n\t\t\t\t,3.06326\n\t\t\t\t,6.16264\n\t\t\t\t,-3.59863\n\t\t\t\t,3.17887\n\t\t\t\t,5.58144\n\t\t\t\t,-4.4307\n\t\t\t\t,3.33074\n\t\t\t\t,5.58144\n\t\t\t\t,-4.4307\n\t\t\t\t,3.20358\n\t\t\t\t,6.22076\n\t\t\t\t,-4.4307\n\t\t\t\t,2.84143\n\t\t\t\t,6.76275\n\t\t\t\t,-4.4307\n\t\t\t\t,3.20358\n\t\t\t\t,6.22076\n\t\t\t\t,-5.26276\n\t\t\t\t,3.06326\n\t\t\t\t,6.16264\n\t\t\t\t,-5.26276\n\t\t\t\t,2.73404\n\t\t\t\t,6.65536\n\t\t\t\t,-4.4307\n\t\t\t\t,2.84143\n\t\t\t\t,6.76275\n\t\t\t\t,-3.59863\n\t\t\t\t,3.06326\n\t\t\t\t,6.16264\n\t\t\t\t,-4.4307\n\t\t\t\t,3.20358\n\t\t\t\t,6.22076\n\t\t\t\t,-3.59863\n\t\t\t\t,2.73404\n\t\t\t\t,6.65536\n\t\t\t\t,-5.26276\n\t\t\t\t,2.24132\n\t\t\t\t,6.98458\n\t\t\t\t,-4.4307\n\t\t\t\t,2.84143\n\t\t\t\t,6.76275\n\t\t\t\t,-5.26276\n\t\t\t\t,2.73404\n\t\t\t\t,6.65536\n\t\t\t\t,-4.4307\n\t\t\t\t,2.29944\n\t\t\t\t,7.1249\n\t\t\t\t,-3.59863\n\t\t\t\t,2.24132\n\t\t\t\t,6.98458\n\t\t\t\t,-3.59863\n\t\t\t\t,2.73404\n\t\t\t\t,6.65536\n\t\t\t\t,-4.4307\n\t\t\t\t,2.84143\n\t\t\t\t,6.76275\n\t\t\t\t,-4.4307\n\t\t\t\t,2.29944\n\t\t\t\t,7.1249\n\t\t\t\t,-4.4307\n\t\t\t\t,1.66012\n\t\t\t\t,7.25206\n\t\t\t\t,-4.4307\n\t\t\t\t,2.29944\n\t\t\t\t,7.1249\n\t\t\t\t,-5.26276\n\t\t\t\t,2.24132\n\t\t\t\t,6.98458\n\t\t\t\t,-5.26276\n\t\t\t\t,1.66012\n\t\t\t\t,7.10019\n\t\t\t\t,-4.4307\n\t\t\t\t,1.66012\n\t\t\t\t,7.25206\n\t\t\t\t,-3.59863\n\t\t\t\t,2.24132\n\t\t\t\t,6.98458\n\t\t\t\t,-4.4307\n\t\t\t\t,2.29944\n\t\t\t\t,7.1249\n\t\t\t\t,-3.59863\n\t\t\t\t,1.66012\n\t\t\t\t,7.10019\n\t\t\t\t,-5.26276\n\t\t\t\t,1.07892\n\t\t\t\t,6.98458\n\t\t\t\t,-4.4307\n\t\t\t\t,1.66012\n\t\t\t\t,7.25206\n\t\t\t\t,-5.26276\n\t\t\t\t,1.66012\n\t\t\t\t,7.10019\n\t\t\t\t,-4.4307\n\t\t\t\t,1.0208\n\t\t\t\t,7.1249\n\t\t\t\t,-3.59863\n\t\t\t\t,1.07892\n\t\t\t\t,6.98458\n\t\t\t\t,-3.59863\n\t\t\t\t,1.66012\n\t\t\t\t,7.10019\n\t\t\t\t,-4.4307\n\t\t\t\t,1.66012\n\t\t\t\t,7.25206\n\t\t\t\t,-4.4307\n\t\t\t\t,1.0208\n\t\t\t\t,7.1249\n\t\t\t\t,-4.4307\n\t\t\t\t,0.478809\n\t\t\t\t,6.76275\n\t\t\t\t,-4.4307\n\t\t\t\t,1.0208\n\t\t\t\t,7.1249\n\t\t\t\t,-5.26276\n\t\t\t\t,1.07892\n\t\t\t\t,6.98458\n\t\t\t\t,-5.26276\n\t\t\t\t,0.586201\n\t\t\t\t,6.65536\n\t\t\t\t,-4.4307\n\t\t\t\t,0.478809\n\t\t\t\t,6.76275\n\t\t\t\t,-3.59863\n\t\t\t\t,1.07892\n\t\t\t\t,6.98458\n\t\t\t\t,-4.4307\n\t\t\t\t,1.0208\n\t\t\t\t,7.1249\n\t\t\t\t,-3.59863\n\t\t\t\t,0.586201\n\t\t\t\t,6.65536\n\t\t\t\t,-5.26276\n\t\t\t\t,0.256977\n\t\t\t\t,6.16264\n\t\t\t\t,-4.4307\n\t\t\t\t,0.478809\n\t\t\t\t,6.76275\n\t\t\t\t,-5.26276\n\t\t\t\t,0.586201\n\t\t\t\t,6.65536\n\t\t\t\t,-4.4307\n\t\t\t\t,0.116663\n\t\t\t\t,6.22076\n\t\t\t\t,-3.59863\n\t\t\t\t,0.256977\n\t\t\t\t,6.16264\n\t\t\t\t,-3.59863\n\t\t\t\t,0.586201\n\t\t\t\t,6.65536\n\t\t\t\t,-4.4307\n\t\t\t\t,0.478809\n\t\t\t\t,6.76275\n\t\t\t\t,-4.4307\n\t\t\t\t,0.116663\n\t\t\t\t,6.22076\n\t\t\t\t,-4.4307\n\t\t\t\t,-0.0105057\n\t\t\t\t,5.58144\n\t\t\t\t,-4.4307\n\t\t\t\t,0.116663\n\t\t\t\t,6.22076\n\t\t\t\t,-5.26276\n\t\t\t\t,0.256977\n\t\t\t\t,6.16264\n\t\t\t\t,-5.26276\n\t\t\t\t,0.141369\n\t\t\t\t,5.58144\n\t\t\t\t,-4.4307\n\t\t\t\t,-0.0105057\n\t\t\t\t,5.58144\n\t\t\t\t,-3.59863\n\t\t\t\t,0.256977\n\t\t\t\t,6.16264\n\t\t\t\t,-4.4307\n\t\t\t\t,0.116663\n\t\t\t\t,6.22076\n\t\t\t\t,-3.59863\n\t\t\t\t,0.141369\n\t\t\t\t,5.58144\n\t\t\t\t,-5.26276\n\t\t\t\t,0.256977\n\t\t\t\t,5.00024\n\t\t\t\t,-4.4307\n\t\t\t\t,-0.0105057\n\t\t\t\t,5.58144\n\t\t\t\t,-5.26276\n\t\t\t\t,0.141369\n\t\t\t\t,5.58144\n\t\t\t\t,-4.4307\n\t\t\t\t,0.116663\n\t\t\t\t,4.94212\n\t\t\t\t,-3.59863\n\t\t\t\t,0.256977\n\t\t\t\t,5.00024\n\t\t\t\t,-3.59863\n\t\t\t\t,0.141369\n\t\t\t\t,5.58144\n\t\t\t\t,-4.4307\n\t\t\t\t,-0.0105057\n\t\t\t\t,5.58144\n\t\t\t\t,-4.4307\n\t\t\t\t,0.116663\n\t\t\t\t,4.94212\n\t\t\t\t,-4.4307\n\t\t\t\t,0.478809\n\t\t\t\t,4.40013\n\t\t\t\t,-4.4307\n\t\t\t\t,0.116663\n\t\t\t\t,4.94212\n\t\t\t\t,-5.26276\n\t\t\t\t,0.256977\n\t\t\t\t,5.00024\n\t\t\t\t,-5.26276\n\t\t\t\t,0.586201\n\t\t\t\t,4.50752\n\t\t\t\t,-4.4307\n\t\t\t\t,0.478809\n\t\t\t\t,4.40013\n\t\t\t\t,-3.59863\n\t\t\t\t,0.256977\n\t\t\t\t,5.00024\n\t\t\t\t,-4.4307\n\t\t\t\t,0.116663\n\t\t\t\t,4.94212\n\t\t\t\t,-3.59863\n\t\t\t\t,0.586201\n\t\t\t\t,4.50752\n\t\t\t\t,-5.26276\n\t\t\t\t,1.07892\n\t\t\t\t,4.1783\n\t\t\t\t,-4.4307\n\t\t\t\t,0.478809\n\t\t\t\t,4.40013\n\t\t\t\t,-5.26276\n\t\t\t\t,0.586201\n\t\t\t\t,4.50752\n\t\t\t\t,-4.4307\n\t\t\t\t,1.0208\n\t\t\t\t,4.03798\n\t\t\t\t,-3.59863\n\t\t\t\t,1.07892\n\t\t\t\t,4.1783\n\t\t\t\t,-3.59863\n\t\t\t\t,0.586201\n\t\t\t\t,4.50752\n\t\t\t\t,-4.4307\n\t\t\t\t,0.478809\n\t\t\t\t,4.40013\n\t\t\t\t,-4.4307\n\t\t\t\t,1.0208\n\t\t\t\t,4.03798\n\t\t\t\t,-4.4307\n\t\t\t\t,1.66012\n\t\t\t\t,3.91081\n\t\t\t\t,-4.4307\n\t\t\t\t,1.0208\n\t\t\t\t,4.03798\n\t\t\t\t,-5.26276\n\t\t\t\t,1.07892\n\t\t\t\t,4.1783\n\t\t\t\t,-5.26276\n\t\t\t\t,1.66012\n\t\t\t\t,4.06269\n\t\t\t\t,-4.4307\n\t\t\t\t,1.66012\n\t\t\t\t,3.91081\n\t\t\t\t,-3.59863\n\t\t\t\t,1.07892\n\t\t\t\t,4.1783\n\t\t\t\t,-4.4307\n\t\t\t\t,1.0208\n\t\t\t\t,4.03798\n\t\t\t\t,-3.59863\n\t\t\t\t,1.66012\n\t\t\t\t,4.06269\n\t\t\t\t,-5.26276\n\t\t\t\t,2.24132\n\t\t\t\t,4.1783\n\t\t\t\t,-4.4307\n\t\t\t\t,1.66012\n\t\t\t\t,3.91081\n\t\t\t\t,-5.26276\n\t\t\t\t,1.66012\n\t\t\t\t,4.06269\n\t\t\t\t,-4.4307\n\t\t\t\t,2.29944\n\t\t\t\t,4.03798\n\t\t\t\t,-3.59863\n\t\t\t\t,2.24132\n\t\t\t\t,4.1783\n\t\t\t\t,-3.59863\n\t\t\t\t,1.66012\n\t\t\t\t,4.06269\n\t\t\t\t,-4.4307\n\t\t\t\t,1.66012\n\t\t\t\t,3.91081\n\t\t\t\t,-4.4307\n\t\t\t\t,2.29944\n\t\t\t\t,4.03798\n\t\t\t\t,-4.4307\n\t\t\t\t,2.84143\n\t\t\t\t,4.40013\n\t\t\t\t,-4.4307\n\t\t\t\t,2.29944\n\t\t\t\t,4.03798\n\t\t\t\t,-5.26276\n\t\t\t\t,2.24132\n\t\t\t\t,4.1783\n\t\t\t\t,-5.26276\n\t\t\t\t,2.73404\n\t\t\t\t,4.50752\n\t\t\t\t,-4.4307\n\t\t\t\t,2.84143\n\t\t\t\t,4.40013\n\t\t\t\t,-3.59863\n\t\t\t\t,2.24132\n\t\t\t\t,4.1783\n\t\t\t\t,-4.4307\n\t\t\t\t,2.29944\n\t\t\t\t,4.03798\n\t\t\t\t,-3.59863\n\t\t\t\t,2.73404\n\t\t\t\t,4.50752\n\t\t\t\t,-5.26276\n\t\t\t\t,3.06326\n\t\t\t\t,5.00024\n\t\t\t\t,-4.4307\n\t\t\t\t,2.84143\n\t\t\t\t,4.40013\n\t\t\t\t,-5.26276\n\t\t\t\t,2.73404\n\t\t\t\t,4.50752\n\t\t\t\t,-4.4307\n\t\t\t\t,3.20358\n\t\t\t\t,4.94212\n\t\t\t\t,-3.59863\n\t\t\t\t,3.06326\n\t\t\t\t,5.00024\n\t\t\t\t,-3.59863\n\t\t\t\t,2.73404\n\t\t\t\t,4.50752\n\t\t\t\t,-4.4307\n\t\t\t\t,2.84143\n\t\t\t\t,4.40013\n\t\t\t\t,-4.4307\n\t\t\t\t,3.20358\n\t\t\t\t,4.94212\n\t\t\t\t,-4.4307\n\t\t\t\t,3.33074\n\t\t\t\t,5.58144\n\t\t\t\t,-4.4307\n\t\t\t\t,3.20358\n\t\t\t\t,4.94212\n\t\t\t\t,-5.26276\n\t\t\t\t,3.06326\n\t\t\t\t,5.00024\n\t\t\t\t,-5.26276\n\t\t\t\t,3.17887\n\t\t\t\t,5.58144\n\t\t\t\t,-4.4307\n\t\t\t\t,3.33074\n\t\t\t\t,5.58144\n\t\t\t\t,-3.59863\n\t\t\t\t,3.06326\n\t\t\t\t,5.00024\n\t\t\t\t,-4.4307\n\t\t\t\t,3.20358\n\t\t\t\t,4.94212\n\t\t\t\t,-3.59863\n\t\t\t\t,3.17887\n\t\t\t\t,5.58144\n\t\t\t\t,1.57047\n\t\t\t\t,5.64031\n\t\t\t\t,-1.49622\n\t\t\t\t,1.57047\n\t\t\t\t,5.26549\n\t\t\t\t,-1.33712\n\t\t\t\t,1.44886\n\t\t\t\t,4.47065\n\t\t\t\t,-3.87612\n\t\t\t\t,1.44886\n\t\t\t\t,4.36605\n\t\t\t\t,-3.83172\n\t\t\t\t,1.35471\n\t\t\t\t,4.47065\n\t\t\t\t,-3.87612\n\t\t\t\t,1.35471\n\t\t\t\t,4.36605\n\t\t\t\t,-3.83172\n\t\t\t\t,1.2331\n\t\t\t\t,5.64031\n\t\t\t\t,-1.49622\n\t\t\t\t,1.2331\n\t\t\t\t,5.26549\n\t\t\t\t,-1.33712\n\t\t\t\t,1.35471\n\t\t\t\t,4.47065\n\t\t\t\t,-3.87612\n\t\t\t\t,1.2331\n\t\t\t\t,5.64031\n\t\t\t\t,-1.49622\n\t\t\t\t,1.44886\n\t\t\t\t,4.47065\n\t\t\t\t,-3.87612\n\t\t\t\t,1.57047\n\t\t\t\t,5.64031\n\t\t\t\t,-1.49622\n\t\t\t\t,1.2331\n\t\t\t\t,5.26549\n\t\t\t\t,-1.33712\n\t\t\t\t,1.35471\n\t\t\t\t,4.36605\n\t\t\t\t,-3.83172\n\t\t\t\t,1.57047\n\t\t\t\t,5.26549\n\t\t\t\t,-1.33712\n\t\t\t\t,1.44886\n\t\t\t\t,4.36605\n\t\t\t\t,-3.83172\n\t\t\t\t,1.14686\n\t\t\t\t,5.85852\n\t\t\t\t,-1.33471\n\t\t\t\t,1.14686\n\t\t\t\t,5.30763\n\t\t\t\t,-1.10087\n\t\t\t\t,1.64686\n\t\t\t\t,5.85852\n\t\t\t\t,-1.33471\n\t\t\t\t,1.64686\n\t\t\t\t,5.30763\n\t\t\t\t,-1.10087\n\t\t\t\t,2.09281\n\t\t\t\t,5.79411\n\t\t\t\t,-1.12728\n\t\t\t\t,2.09281\n\t\t\t\t,5.5316\n\t\t\t\t,-1.01586\n\t\t\t\t,2.09281\n\t\t\t\t,5.73347\n\t\t\t\t,-1.27015\n\t\t\t\t,2.09281\n\t\t\t\t,5.47096\n\t\t\t\t,-1.15873\n\t\t\t\t,1.64686\n\t\t\t\t,5.74398\n\t\t\t\t,-1.60456\n\t\t\t\t,1.64686\n\t\t\t\t,5.19309\n\t\t\t\t,-1.37072\n\t\t\t\t,1.14686\n\t\t\t\t,5.74398\n\t\t\t\t,-1.60456\n\t\t\t\t,1.14686\n\t\t\t\t,5.19309\n\t\t\t\t,-1.37072\n\t\t\t\t,0.635642\n\t\t\t\t,5.74122\n\t\t\t\t,-1.26406\n\t\t\t\t,0.635642\n\t\t\t\t,5.46936\n\t\t\t\t,-1.14866\n\t\t\t\t,0.635642\n\t\t\t\t,5.79925\n\t\t\t\t,-1.12735\n\t\t\t\t,0.635642\n\t\t\t\t,5.52739\n\t\t\t\t,-1.01195\n\t\t\t\t,1.14686\n\t\t\t\t,5.85852\n\t\t\t\t,-1.33471\n\t\t\t\t,1.64686\n\t\t\t\t,5.85852\n\t\t\t\t,-1.33471\n\t\t\t\t,1.14686\n\t\t\t\t,5.19309\n\t\t\t\t,-1.37072\n\t\t\t\t,1.64686\n\t\t\t\t,5.19309\n\t\t\t\t,-1.37072\n\t\t\t\t,2.09281\n\t\t\t\t,5.79411\n\t\t\t\t,-1.12728\n\t\t\t\t,2.09281\n\t\t\t\t,5.5316\n\t\t\t\t,-1.01586\n\t\t\t\t,2.09281\n\t\t\t\t,5.79411\n\t\t\t\t,-1.12728\n\t\t\t\t,2.09281\n\t\t\t\t,5.5316\n\t\t\t\t,-1.01586\n\t\t\t\t,1.64686\n\t\t\t\t,5.19309\n\t\t\t\t,-1.37072\n\t\t\t\t,2.09281\n\t\t\t\t,5.47096\n\t\t\t\t,-1.15873\n\t\t\t\t,0.635642\n\t\t\t\t,5.79925\n\t\t\t\t,-1.12735\n\t\t\t\t,0.635642\n\t\t\t\t,5.46936\n\t\t\t\t,-1.14866\n\t\t\t\t,0.635642\n\t\t\t\t,5.52739\n\t\t\t\t,-1.01195\n\t\t\t\t,0.635642\n\t\t\t\t,5.79925\n\t\t\t\t,-1.12735\n\t\t\t\t,-1.44886\n\t\t\t\t,4.47065\n\t\t\t\t,-3.87612\n\t\t\t\t,-1.57047\n\t\t\t\t,5.26549\n\t\t\t\t,-1.33712\n\t\t\t\t,-1.57047\n\t\t\t\t,5.64031\n\t\t\t\t,-1.49622\n\t\t\t\t,-1.44886\n\t\t\t\t,4.36605\n\t\t\t\t,-3.83172\n\t\t\t\t,-1.2331\n\t\t\t\t,5.64031\n\t\t\t\t,-1.49622\n\t\t\t\t,-1.35471\n\t\t\t\t,4.36605\n\t\t\t\t,-3.83172\n\t\t\t\t,-1.35471\n\t\t\t\t,4.47065\n\t\t\t\t,-3.87612\n\t\t\t\t,-1.2331\n\t\t\t\t,5.26549\n\t\t\t\t,-1.33712\n\t\t\t\t,-1.44886\n\t\t\t\t,4.47065\n\t\t\t\t,-3.87612\n\t\t\t\t,-1.2331\n\t\t\t\t,5.64031\n\t\t\t\t,-1.49622\n\t\t\t\t,-1.35471\n\t\t\t\t,4.47065\n\t\t\t\t,-3.87612\n\t\t\t\t,-1.57047\n\t\t\t\t,5.64031\n\t\t\t\t,-1.49622\n\t\t\t\t,-1.57047\n\t\t\t\t,5.26549\n\t\t\t\t,-1.33712\n\t\t\t\t,-1.35471\n\t\t\t\t,4.36605\n\t\t\t\t,-3.83172\n\t\t\t\t,-1.2331\n\t\t\t\t,5.26549\n\t\t\t\t,-1.33712\n\t\t\t\t,-1.44886\n\t\t\t\t,4.36605\n\t\t\t\t,-3.83172\n\t\t\t\t,-1.64686\n\t\t\t\t,5.85852\n\t\t\t\t,-1.33471\n\t\t\t\t,-1.14686\n\t\t\t\t,5.30763\n\t\t\t\t,-1.10087\n\t\t\t\t,-1.14686\n\t\t\t\t,5.85852\n\t\t\t\t,-1.33471\n\t\t\t\t,-1.64686\n\t\t\t\t,5.30763\n\t\t\t\t,-1.10087\n\t\t\t\t,-2.09281\n\t\t\t\t,5.73347\n\t\t\t\t,-1.27015\n\t\t\t\t,-2.09281\n\t\t\t\t,5.5316\n\t\t\t\t,-1.01586\n\t\t\t\t,-2.09281\n\t\t\t\t,5.79411\n\t\t\t\t,-1.12728\n\t\t\t\t,-2.09281\n\t\t\t\t,5.47096\n\t\t\t\t,-1.15873\n\t\t\t\t,-1.14686\n\t\t\t\t,5.74398\n\t\t\t\t,-1.60456\n\t\t\t\t,-1.64686\n\t\t\t\t,5.19309\n\t\t\t\t,-1.37072\n\t\t\t\t,-1.64686\n\t\t\t\t,5.74398\n\t\t\t\t,-1.60456\n\t\t\t\t,-1.14686\n\t\t\t\t,5.19309\n\t\t\t\t,-1.37072\n\t\t\t\t,-0.635642\n\t\t\t\t,5.79925\n\t\t\t\t,-1.12735\n\t\t\t\t,-0.635642\n\t\t\t\t,5.46936\n\t\t\t\t,-1.14866\n\t\t\t\t,-0.635642\n\t\t\t\t,5.74122\n\t\t\t\t,-1.26406\n\t\t\t\t,-0.635642\n\t\t\t\t,5.52739\n\t\t\t\t,-1.01195\n\t\t\t\t,-1.14686\n\t\t\t\t,5.85852\n\t\t\t\t,-1.33471\n\t\t\t\t,-1.64686\n\t\t\t\t,5.85852\n\t\t\t\t,-1.33471\n\t\t\t\t,-1.14686\n\t\t\t\t,5.19309\n\t\t\t\t,-1.37072\n\t\t\t\t,-1.64686\n\t\t\t\t,5.19309\n\t\t\t\t,-1.37072\n\t\t\t\t,-2.09281\n\t\t\t\t,5.79411\n\t\t\t\t,-1.12728\n\t\t\t\t,-2.09281\n\t\t\t\t,5.5316\n\t\t\t\t,-1.01586\n\t\t\t\t,-2.09281\n\t\t\t\t,5.73347\n\t\t\t\t,-1.27015\n\t\t\t\t,-2.09281\n\t\t\t\t,5.79411\n\t\t\t\t,-1.12728\n\t\t\t\t,-1.64686\n\t\t\t\t,5.19309\n\t\t\t\t,-1.37072\n\t\t\t\t,-2.09281\n\t\t\t\t,5.47096\n\t\t\t\t,-1.15873\n\t\t\t\t,-2.09281\n\t\t\t\t,5.73347\n\t\t\t\t,-1.27015\n\t\t\t\t,-0.635642\n\t\t\t\t,5.74122\n\t\t\t\t,-1.26406\n\t\t\t\t,-0.635642\n\t\t\t\t,5.46936\n\t\t\t\t,-1.14866\n\t\t\t\t,-0.635642\n\t\t\t\t,5.79925\n\t\t\t\t,-1.12735\n\t\t\t\t,-0.635642\n\t\t\t\t,5.74122\n\t\t\t\t,-1.26406\n\t\t\t\t,-0.635642\n\t\t\t\t,5.79925\n\t\t\t\t,-1.12735\n\t\t\t\t,3.28145\n\t\t\t\t,5.5256\n\t\t\t\t,5.3738\n\t\t\t\t,4.1697\n\t\t\t\t,4.0473\n\t\t\t\t,5.3738\n\t\t\t\t,3.86047\n\t\t\t\t,5.75026\n\t\t\t\t,5.25979\n\t\t\t\t,4.63989\n\t\t\t\t,4.45308\n\t\t\t\t,5.25979\n\t\t\t\t,3.86047\n\t\t\t\t,5.75026\n\t\t\t\t,5.25979\n\t\t\t\t,4.63989\n\t\t\t\t,4.45308\n\t\t\t\t,5.25979\n\t\t\t\t,3.86047\n\t\t\t\t,5.75026\n\t\t\t\t,4.3003\n\t\t\t\t,4.63989\n\t\t\t\t,4.45308\n\t\t\t\t,4.3003\n\t\t\t\t,3.86047\n\t\t\t\t,5.75026\n\t\t\t\t,4.3003\n\t\t\t\t,4.63989\n\t\t\t\t,4.45308\n\t\t\t\t,4.3003\n\t\t\t\t,3.28145\n\t\t\t\t,5.5256\n\t\t\t\t,4.1863\n\t\t\t\t,4.63989\n\t\t\t\t,4.45308\n\t\t\t\t,4.3003\n\t\t\t\t,4.1697\n\t\t\t\t,4.0473\n\t\t\t\t,4.1863\n\t\t\t\t,3.28145\n\t\t\t\t,5.5256\n\t\t\t\t,4.1863\n\t\t\t\t,3.28145\n\t\t\t\t,5.5256\n\t\t\t\t,5.3738\n\t\t\t\t,3.86047\n\t\t\t\t,5.75026\n\t\t\t\t,4.3003\n\t\t\t\t,3.86047\n\t\t\t\t,5.75026\n\t\t\t\t,5.25979\n\t\t\t\t,4.1697\n\t\t\t\t,4.0473\n\t\t\t\t,5.3738\n\t\t\t\t,4.1697\n\t\t\t\t,4.0473\n\t\t\t\t,4.1863\n\t\t\t\t,4.63989\n\t\t\t\t,4.45308\n\t\t\t\t,5.25979\n\t\t\t\t,4.63989\n\t\t\t\t,4.45308\n\t\t\t\t,4.3003\n\t\t\t\t,2.15556\n\t\t\t\t,3.39441\n\t\t\t\t,-0.97551\n\t\t\t\t,2.15556\n\t\t\t\t,4.16003\n\t\t\t\t,-1.06926\n\t\t\t\t,2.15556\n\t\t\t\t,4.44128\n\t\t\t\t,-0.88176\n\t\t\t\t,2.15556\n\t\t\t\t,4.22253\n\t\t\t\t,0.368225\n\t\t\t\t,2.15556\n\t\t\t\t,3.39441\n\t\t\t\t,1.64948\n\t\t\t\t,2.15556\n\t\t\t\t,5.50378\n\t\t\t\t,0.961975\n\t\t\t\t,2.15556\n\t\t\t\t,5.37878\n\t\t\t\t,1.46198\n\t\t\t\t,0.6\n\t\t\t\t,3.39441\n\t\t\t\t,-0.97551\n\t\t\t\t,0.6\n\t\t\t\t,4.16003\n\t\t\t\t,-1.06926\n\t\t\t\t,2.15556\n\t\t\t\t,4.16003\n\t\t\t\t,-1.06926\n\t\t\t\t,0.6\n\t\t\t\t,4.44128\n\t\t\t\t,-0.88176\n\t\t\t\t,2.15556\n\t\t\t\t,4.44128\n\t\t\t\t,-0.88176\n\t\t\t\t,2.15556\n\t\t\t\t,4.44128\n\t\t\t\t,-0.88176\n\t\t\t\t,0.6\n\t\t\t\t,4.44128\n\t\t\t\t,-0.88176\n\t\t\t\t,0.6\n\t\t\t\t,4.22253\n\t\t\t\t,0.36824\n\t\t\t\t,2.15556\n\t\t\t\t,4.22253\n\t\t\t\t,0.368225\n\t\t\t\t,2.15556\n\t\t\t\t,4.22253\n\t\t\t\t,0.368225\n\t\t\t\t,0.6\n\t\t\t\t,4.22253\n\t\t\t\t,0.36824\n\t\t\t\t,0.6\n\t\t\t\t,5.50378\n\t\t\t\t,0.96199\n\t\t\t\t,2.15556\n\t\t\t\t,5.50378\n\t\t\t\t,0.961975\n\t\t\t\t,2.15556\n\t\t\t\t,5.50378\n\t\t\t\t,0.961975\n\t\t\t\t,0.6\n\t\t\t\t,5.50378\n\t\t\t\t,0.96199\n\t\t\t\t,0.6\n\t\t\t\t,5.37878\n\t\t\t\t,1.46199\n\t\t\t\t,2.15556\n\t\t\t\t,5.37878\n\t\t\t\t,1.46198\n\t\t\t\t,2.15556\n\t\t\t\t,5.37878\n\t\t\t\t,1.46198\n\t\t\t\t,0.6\n\t\t\t\t,5.37878\n\t\t\t\t,1.46199\n\t\t\t\t,0.6\n\t\t\t\t,3.39441\n\t\t\t\t,1.64949\n\t\t\t\t,2.15556\n\t\t\t\t,3.39441\n\t\t\t\t,1.64948\n\t\t\t\t,0.6\n\t\t\t\t,4.44128\n\t\t\t\t,-0.88176\n\t\t\t\t,0.6\n\t\t\t\t,4.22253\n\t\t\t\t,0.36824\n\t\t\t\t,0.6\n\t\t\t\t,3.39441\n\t\t\t\t,1.64949\n\t\t\t\t,0.6\n\t\t\t\t,5.37878\n\t\t\t\t,1.46199\n\t\t\t\t,0.6\n\t\t\t\t,5.50378\n\t\t\t\t,0.96199\n\t\t\t\t,3.01518\n\t\t\t\t,4.97158\n\t\t\t\t,3.09081\n\t\t\t\t,3.01518\n\t\t\t\t,6.18587\n\t\t\t\t,3.09081\n\t\t\t\t,2.92589\n\t\t\t\t,4.97158\n\t\t\t\t,3.24546\n\t\t\t\t,2.92589\n\t\t\t\t,6.18586\n\t\t\t\t,3.24546\n\t\t\t\t,2.74732\n\t\t\t\t,6.18586\n\t\t\t\t,3.24546\n\t\t\t\t,2.74732\n\t\t\t\t,4.97158\n\t\t\t\t,3.24546\n\t\t\t\t,2.65804\n\t\t\t\t,4.97158\n\t\t\t\t,3.09081\n\t\t\t\t,2.65804\n\t\t\t\t,6.18587\n\t\t\t\t,3.09081\n\t\t\t\t,2.65804\n\t\t\t\t,4.97158\n\t\t\t\t,3.09081\n\t\t\t\t,2.65804\n\t\t\t\t,6.18587\n\t\t\t\t,3.09081\n\t\t\t\t,2.74732\n\t\t\t\t,6.18586\n\t\t\t\t,2.93617\n\t\t\t\t,2.74732\n\t\t\t\t,4.97157\n\t\t\t\t,2.93617\n\t\t\t\t,2.92589\n\t\t\t\t,4.97157\n\t\t\t\t,2.93617\n\t\t\t\t,2.92589\n\t\t\t\t,6.18586\n\t\t\t\t,2.93617\n\t\t\t\t,3.01518\n\t\t\t\t,6.18587\n\t\t\t\t,3.09081\n\t\t\t\t,3.01518\n\t\t\t\t,4.97158\n\t\t\t\t,3.09081\n\t\t\t\t,2.77919\n\t\t\t\t,6.71412\n\t\t\t\t,3.24546\n\t\t\t\t,2.86501\n\t\t\t\t,6.73873\n\t\t\t\t,3.09081\n\t\t\t\t,2.60753\n\t\t\t\t,6.6649\n\t\t\t\t,3.24546\n\t\t\t\t,2.5217\n\t\t\t\t,6.64029\n\t\t\t\t,3.09081\n\t\t\t\t,2.60753\n\t\t\t\t,6.6649\n\t\t\t\t,2.93616\n\t\t\t\t,2.5217\n\t\t\t\t,6.64029\n\t\t\t\t,3.09081\n\t\t\t\t,2.77919\n\t\t\t\t,6.71413\n\t\t\t\t,2.93616\n\t\t\t\t,2.86501\n\t\t\t\t,6.73873\n\t\t\t\t,3.09081\n\t\t\t\t,2.55914\n\t\t\t\t,7.02218\n\t\t\t\t,3.24546\n\t\t\t\t,2.61412\n\t\t\t\t,7.09253\n\t\t\t\t,3.09081\n\t\t\t\t,2.44921\n\t\t\t\t,6.88147\n\t\t\t\t,3.24546\n\t\t\t\t,2.39421\n\t\t\t\t,6.81111\n\t\t\t\t,3.09081\n\t\t\t\t,2.44921\n\t\t\t\t,6.88147\n\t\t\t\t,2.93617\n\t\t\t\t,2.39421\n\t\t\t\t,6.81111\n\t\t\t\t,3.09081\n\t\t\t\t,2.55914\n\t\t\t\t,7.02219\n\t\t\t\t,2.93617\n\t\t\t\t,2.61412\n\t\t\t\t,7.09253\n\t\t\t\t,3.09081\n\t\t\t\t,2.28942\n\t\t\t\t,7.15433\n\t\t\t\t,3.24546\n\t\t\t\t,2.30647\n\t\t\t\t,7.24197\n\t\t\t\t,3.09081\n\t\t\t\t,2.25536\n\t\t\t\t,6.97905\n\t\t\t\t,3.24546\n\t\t\t\t,2.23831\n\t\t\t\t,6.89137\n\t\t\t\t,3.09081\n\t\t\t\t,2.25536\n\t\t\t\t,6.97905\n\t\t\t\t,2.93616\n\t\t\t\t,2.23831\n\t\t\t\t,6.89137\n\t\t\t\t,3.09081\n\t\t\t\t,2.28942\n\t\t\t\t,7.15433\n\t\t\t\t,2.93616\n\t\t\t\t,2.30647\n\t\t\t\t,7.24197\n\t\t\t\t,3.09081\n\t\t\t\t,1.98661\n\t\t\t\t,7.18344\n\t\t\t\t,3.24546\n\t\t\t\t,1.98661\n\t\t\t\t,7.27268\n\t\t\t\t,3.09081\n\t\t\t\t,1.98661\n\t\t\t\t,7.00489\n\t\t\t\t,3.24546\n\t\t\t\t,1.98661\n\t\t\t\t,6.91558\n\t\t\t\t,3.09081\n\t\t\t\t,1.98661\n\t\t\t\t,7.00489\n\t\t\t\t,2.93616\n\t\t\t\t,1.98661\n\t\t\t\t,6.91558\n\t\t\t\t,3.09081\n\t\t\t\t,1.98661\n\t\t\t\t,7.18344\n\t\t\t\t,2.93617\n\t\t\t\t,1.98661\n\t\t\t\t,7.27268\n\t\t\t\t,3.09081\n\t\t\t\t,-0.00112091\n\t\t\t\t,7.18345\n\t\t\t\t,3.24546\n\t\t\t\t,1.98661\n\t\t\t\t,7.18344\n\t\t\t\t,3.24546\n\t\t\t\t,1.98661\n\t\t\t\t,7.27268\n\t\t\t\t,3.09081\n\t\t\t\t,-0.00112091\n\t\t\t\t,7.27269\n\t\t\t\t,3.09081\n\t\t\t\t,-0.00112091\n\t\t\t\t,7.00489\n\t\t\t\t,3.24546\n\t\t\t\t,1.98661\n\t\t\t\t,7.00489\n\t\t\t\t,3.24546\n\t\t\t\t,-0.00112091\n\t\t\t\t,6.91557\n\t\t\t\t,3.09081\n\t\t\t\t,1.98661\n\t\t\t\t,6.91558\n\t\t\t\t,3.09081\n\t\t\t\t,-0.00112091\n\t\t\t\t,7.0049\n\t\t\t\t,2.93616\n\t\t\t\t,1.98661\n\t\t\t\t,7.00489\n\t\t\t\t,2.93616\n\t\t\t\t,1.98661\n\t\t\t\t,6.91558\n\t\t\t\t,3.09081\n\t\t\t\t,-0.00112091\n\t\t\t\t,6.91557\n\t\t\t\t,3.09081\n\t\t\t\t,-0.00112091\n\t\t\t\t,7.18345\n\t\t\t\t,2.93617\n\t\t\t\t,1.98661\n\t\t\t\t,7.18344\n\t\t\t\t,2.93617\n\t\t\t\t,-0.00112091\n\t\t\t\t,7.27269\n\t\t\t\t,3.09081\n\t\t\t\t,1.98661\n\t\t\t\t,7.27268\n\t\t\t\t,3.09081\n\t\t\t\t,1.40786\n\t\t\t\t,7.11017\n\t\t\t\t,-1.88513\n\t\t\t\t,1.40786\n\t\t\t\t,7.08937\n\t\t\t\t,3.10419\n\t\t\t\t,1.34143\n\t\t\t\t,6.99511\n\t\t\t\t,-1.88513\n\t\t\t\t,1.34143\n\t\t\t\t,6.97431\n\t\t\t\t,3.10419\n\t\t\t\t,1.34143\n\t\t\t\t,6.99511\n\t\t\t\t,-1.88513\n\t\t\t\t,1.34143\n\t\t\t\t,6.97431\n\t\t\t\t,3.10419\n\t\t\t\t,1.20857\n\t\t\t\t,6.97431\n\t\t\t\t,3.10419\n\t\t\t\t,1.20857\n\t\t\t\t,6.99511\n\t\t\t\t,-1.88513\n\t\t\t\t,1.20857\n\t\t\t\t,6.99511\n\t\t\t\t,-1.88513\n\t\t\t\t,1.20857\n\t\t\t\t,6.97431\n\t\t\t\t,3.10419\n\t\t\t\t,1.14214\n\t\t\t\t,7.11017\n\t\t\t\t,-1.88513\n\t\t\t\t,1.14214\n\t\t\t\t,7.08937\n\t\t\t\t,3.10419\n\t\t\t\t,1.14214\n\t\t\t\t,7.11017\n\t\t\t\t,-1.88513\n\t\t\t\t,1.14214\n\t\t\t\t,7.08937\n\t\t\t\t,3.10419\n\t\t\t\t,1.20857\n\t\t\t\t,7.20442\n\t\t\t\t,3.10419\n\t\t\t\t,1.20857\n\t\t\t\t,7.22523\n\t\t\t\t,-1.88513\n\t\t\t\t,1.20857\n\t\t\t\t,7.22523\n\t\t\t\t,-1.88513\n\t\t\t\t,1.20857\n\t\t\t\t,7.20442\n\t\t\t\t,3.10419\n\t\t\t\t,1.34143\n\t\t\t\t,7.22523\n\t\t\t\t,-1.88513\n\t\t\t\t,1.34143\n\t\t\t\t,7.20442\n\t\t\t\t,3.10419\n\t\t\t\t,1.34143\n\t\t\t\t,7.22523\n\t\t\t\t,-1.88513\n\t\t\t\t,1.34143\n\t\t\t\t,7.20442\n\t\t\t\t,3.10419\n\t\t\t\t,1.40786\n\t\t\t\t,7.08937\n\t\t\t\t,3.10419\n\t\t\t\t,1.40786\n\t\t\t\t,7.11017\n\t\t\t\t,-1.88513\n\t\t\t\t,2.52315\n\t\t\t\t,1.65387\n\t\t\t\t,-4.08368\n\t\t\t\t,3.57579\n\t\t\t\t,1.65387\n\t\t\t\t,-4.08368\n\t\t\t\t,2.52315\n\t\t\t\t,2.29555\n\t\t\t\t,-4.35369\n\t\t\t\t,3.57579\n\t\t\t\t,2.29555\n\t\t\t\t,-4.35369\n\t\t\t\t,3.57579\n\t\t\t\t,2.56134\n\t\t\t\t,-5.00556\n\t\t\t\t,2.52315\n\t\t\t\t,2.56134\n\t\t\t\t,-5.00556\n\t\t\t\t,2.52315\n\t\t\t\t,2.29555\n\t\t\t\t,-5.65742\n\t\t\t\t,3.57579\n\t\t\t\t,2.29555\n\t\t\t\t,-5.65742\n\t\t\t\t,3.57579\n\t\t\t\t,1.65387\n\t\t\t\t,-5.92743\n\t\t\t\t,2.52315\n\t\t\t\t,1.65387\n\t\t\t\t,-5.92743\n\t\t\t\t,2.52315\n\t\t\t\t,1.01219\n\t\t\t\t,-5.65742\n\t\t\t\t,3.57579\n\t\t\t\t,1.01219\n\t\t\t\t,-5.65742\n\t\t\t\t,2.52315\n\t\t\t\t,1.01219\n\t\t\t\t,-5.65742\n\t\t\t\t,3.57579\n\t\t\t\t,1.01219\n\t\t\t\t,-5.65742\n\t\t\t\t,3.57579\n\t\t\t\t,0.746398\n\t\t\t\t,-5.00556\n\t\t\t\t,2.52315\n\t\t\t\t,0.746398\n\t\t\t\t,-5.00556\n\t\t\t\t,2.52315\n\t\t\t\t,1.01219\n\t\t\t\t,-4.35369\n\t\t\t\t,3.57579\n\t\t\t\t,1.01219\n\t\t\t\t,-4.35369\n\t\t\t\t,1.64814\n\t\t\t\t,1.65387\n\t\t\t\t,-4.70739\n\t\t\t\t,1.64814\n\t\t\t\t,1.8494\n\t\t\t\t,-4.79472\n\t\t\t\t,1.64814\n\t\t\t\t,1.93039\n\t\t\t\t,-5.00556\n\t\t\t\t,1.64814\n\t\t\t\t,1.8494\n\t\t\t\t,-5.2164\n\t\t\t\t,1.64814\n\t\t\t\t,1.65387\n\t\t\t\t,-5.30373\n\t\t\t\t,1.64814\n\t\t\t\t,1.45834\n\t\t\t\t,-5.2164\n\t\t\t\t,1.64814\n\t\t\t\t,1.45834\n\t\t\t\t,-5.2164\n\t\t\t\t,1.64814\n\t\t\t\t,1.37735\n\t\t\t\t,-5.00556\n\t\t\t\t,1.64814\n\t\t\t\t,1.45834\n\t\t\t\t,-4.79472\n\t\t\t\t,-0.00112091\n\t\t\t\t,1.65387\n\t\t\t\t,-4.70738\n\t\t\t\t,-0.00112091\n\t\t\t\t,1.8494\n\t\t\t\t,-4.79472\n\t\t\t\t,-0.00112091\n\t\t\t\t,1.93039\n\t\t\t\t,-5.00555\n\t\t\t\t,-0.00112091\n\t\t\t\t,1.8494\n\t\t\t\t,-5.2164\n\t\t\t\t,-0.00112091\n\t\t\t\t,1.65387\n\t\t\t\t,-5.30373\n\t\t\t\t,-0.00112091\n\t\t\t\t,1.45834\n\t\t\t\t,-5.2164\n\t\t\t\t,-0.00112091\n\t\t\t\t,1.45834\n\t\t\t\t,-5.2164\n\t\t\t\t,1.64814\n\t\t\t\t,1.45834\n\t\t\t\t,-5.2164\n\t\t\t\t,1.64814\n\t\t\t\t,1.37735\n\t\t\t\t,-5.00556\n\t\t\t\t,-0.00112091\n\t\t\t\t,1.45834\n\t\t\t\t,-5.2164\n\t\t\t\t,-0.00112091\n\t\t\t\t,1.37735\n\t\t\t\t,-5.00555\n\t\t\t\t,-0.00112091\n\t\t\t\t,1.45834\n\t\t\t\t,-4.79472\n\t\t\t\t,-0.00112091\n\t\t\t\t,1.11017\n\t\t\t\t,-4.09113\n\t\t\t\t,-0.00112091\n\t\t\t\t,1.11017\n\t\t\t\t,-5.91612\n\t\t\t\t,0.99375\n\t\t\t\t,1.11017\n\t\t\t\t,-5.91612\n\t\t\t\t,1.1009\n\t\t\t\t,1.22686\n\t\t\t\t,-4.09113\n\t\t\t\t,1.10089\n\t\t\t\t,1.22686\n\t\t\t\t,-5.91612\n\t\t\t\t,1.49375\n\t\t\t\t,1.34941\n\t\t\t\t,-5.72404\n\t\t\t\t,-0.00112091\n\t\t\t\t,1.11017\n\t\t\t\t,-4.09113\n\t\t\t\t,0.99375\n\t\t\t\t,1.11017\n\t\t\t\t,-4.09113\n\t\t\t\t,-0.00112091\n\t\t\t\t,3.47859\n\t\t\t\t,-4.09113\n\t\t\t\t,1.1009\n\t\t\t\t,1.22686\n\t\t\t\t,-4.09113\n\t\t\t\t,0.99375\n\t\t\t\t,2.22859\n\t\t\t\t,-4.09113\n\t\t\t\t,1.49375\n\t\t\t\t,1.34941\n\t\t\t\t,-4.28321\n\t\t\t\t,1.49375\n\t\t\t\t,2.10776\n\t\t\t\t,-4.28321\n\t\t\t\t,1.57708\n\t\t\t\t,3.47859\n\t\t\t\t,-4.09113\n\t\t\t\t,0.99375\n\t\t\t\t,1.11017\n\t\t\t\t,-4.09113\n\t\t\t\t,1.49375\n\t\t\t\t,1.34941\n\t\t\t\t,-4.28321\n\t\t\t\t,1.49375\n\t\t\t\t,2.10776\n\t\t\t\t,-5.72404\n\t\t\t\t,1.49375\n\t\t\t\t,2.10776\n\t\t\t\t,-4.28321\n\t\t\t\t,0.99375\n\t\t\t\t,2.22859\n\t\t\t\t,-5.91612\n\t\t\t\t,0.99375\n\t\t\t\t,2.22859\n\t\t\t\t,-4.09113\n\t\t\t\t,0.99375\n\t\t\t\t,2.22859\n\t\t\t\t,-4.09113\n\t\t\t\t,0.99375\n\t\t\t\t,2.22859\n\t\t\t\t,-5.91612\n\t\t\t\t,1.57708\n\t\t\t\t,3.47859\n\t\t\t\t,-5.91612\n\t\t\t\t,1.57708\n\t\t\t\t,3.47859\n\t\t\t\t,-4.09113\n\t\t\t\t,-0.00112091\n\t\t\t\t,3.47859\n\t\t\t\t,-5.91612\n\t\t\t\t,0.99375\n\t\t\t\t,2.22859\n\t\t\t\t,-5.91612\n\t\t\t\t,1.10089\n\t\t\t\t,1.22686\n\t\t\t\t,-5.91612\n\t\t\t\t,1.49375\n\t\t\t\t,1.34941\n\t\t\t\t,-5.72404\n\t\t\t\t,1.57708\n\t\t\t\t,3.47859\n\t\t\t\t,-5.91612\n\t\t\t\t,1.77987\n\t\t\t\t,3.46628\n\t\t\t\t,7.95238\n\t\t\t\t,2.06737\n\t\t\t\t,3.46628\n\t\t\t\t,7.95238\n\t\t\t\t,1.92362\n\t\t\t\t,3.69856\n\t\t\t\t,8.10906\n\t\t\t\t,2.21112\n\t\t\t\t,3.69856\n\t\t\t\t,8.10906\n\t\t\t\t,2.35487\n\t\t\t\t,3.46628\n\t\t\t\t,7.95238\n\t\t\t\t,2.21112\n\t\t\t\t,3.234\n\t\t\t\t,7.79569\n\t\t\t\t,1.92362\n\t\t\t\t,3.234\n\t\t\t\t,7.79569\n\t\t\t\t,1.77987\n\t\t\t\t,3.46429\n\t\t\t\t,5.25238\n\t\t\t\t,1.77987\n\t\t\t\t,3.46628\n\t\t\t\t,7.95238\n\t\t\t\t,1.92362\n\t\t\t\t,3.71327\n\t\t\t\t,5.25238\n\t\t\t\t,1.92362\n\t\t\t\t,3.69856\n\t\t\t\t,8.10906\n\t\t\t\t,2.21112\n\t\t\t\t,3.69856\n\t\t\t\t,8.10906\n\t\t\t\t,2.21112\n\t\t\t\t,3.71327\n\t\t\t\t,5.25238\n\t\t\t\t,2.35487\n\t\t\t\t,3.46429\n\t\t\t\t,5.25238\n\t\t\t\t,2.35487\n\t\t\t\t,3.46628\n\t\t\t\t,7.95238\n\t\t\t\t,2.35487\n\t\t\t\t,3.46429\n\t\t\t\t,5.25238\n\t\t\t\t,2.35487\n\t\t\t\t,3.46628\n\t\t\t\t,7.95238\n\t\t\t\t,2.21112\n\t\t\t\t,3.234\n\t\t\t\t,7.79569\n\t\t\t\t,2.21112\n\t\t\t\t,3.2153\n\t\t\t\t,5.25238\n\t\t\t\t,1.92362\n\t\t\t\t,3.2153\n\t\t\t\t,5.25238\n\t\t\t\t,1.92362\n\t\t\t\t,3.234\n\t\t\t\t,7.79569\n\t\t\t\t,1.77987\n\t\t\t\t,3.46628\n\t\t\t\t,7.95238\n\t\t\t\t,1.77987\n\t\t\t\t,3.46429\n\t\t\t\t,5.25238\n\t\t\t\t,2.70328\n\t\t\t\t,4.08592\n\t\t\t\t,-8.12664\n\t\t\t\t,2.69656\n\t\t\t\t,3.52342\n\t\t\t\t,-8.12664\n\t\t\t\t,0.752339\n\t\t\t\t,4.08592\n\t\t\t\t,-8.12664\n\t\t\t\t,0.75906\n\t\t\t\t,3.52342\n\t\t\t\t,-8.12664\n\t\t\t\t,2.69656\n\t\t\t\t,4.08592\n\t\t\t\t,-6.18914\n\t\t\t\t,2.69656\n\t\t\t\t,3.52342\n\t\t\t\t,-6.18914\n\t\t\t\t,2.70328\n\t\t\t\t,4.08592\n\t\t\t\t,-8.12664\n\t\t\t\t,2.69656\n\t\t\t\t,3.52342\n\t\t\t\t,-8.12664\n\t\t\t\t,0.752339\n\t\t\t\t,4.08592\n\t\t\t\t,-8.12664\n\t\t\t\t,0.75906\n\t\t\t\t,3.52342\n\t\t\t\t,-8.12664\n\t\t\t\t,0.75906\n\t\t\t\t,4.08592\n\t\t\t\t,-6.18914\n\t\t\t\t,0.75906\n\t\t\t\t,3.52342\n\t\t\t\t,-6.18914\n\t\t\t\t,0.752339\n\t\t\t\t,4.08592\n\t\t\t\t,-8.12664\n\t\t\t\t,0.75906\n\t\t\t\t,4.08592\n\t\t\t\t,-6.18914\n\t\t\t\t,2.70328\n\t\t\t\t,4.08592\n\t\t\t\t,-8.12664\n\t\t\t\t,2.69656\n\t\t\t\t,4.08592\n\t\t\t\t,-6.18914\n\t\t\t\t,0.75906\n\t\t\t\t,3.52342\n\t\t\t\t,-6.18914\n\t\t\t\t,0.75906\n\t\t\t\t,3.52342\n\t\t\t\t,-8.12664\n\t\t\t\t,2.69656\n\t\t\t\t,3.52342\n\t\t\t\t,-6.18914\n\t\t\t\t,2.69656\n\t\t\t\t,3.52342\n\t\t\t\t,-8.12664\n\t\t\t\t,2.53125\n\t\t\t\t,5.01497\n\t\t\t\t,7.64841\n\t\t\t\t,0\n\t\t\t\t,5.01498\n\t\t\t\t,8.02341\n\t\t\t\t,0\n\t\t\t\t,4.10615\n\t\t\t\t,7.89073\n\t\t\t\t,2.53125\n\t\t\t\t,4.10616\n\t\t\t\t,7.51572\n\t\t\t\t,3.15717\n\t\t\t\t,5.00932\n\t\t\t\t,7.64841\n\t\t\t\t,3.15717\n\t\t\t\t,4.54371\n\t\t\t\t,7.51572\n\t\t\t\t,2.53125\n\t\t\t\t,1.87535\n\t\t\t\t,-2.97386\n\t\t\t\t,-0.00112091\n\t\t\t\t,1.87534\n\t\t\t\t,-2.97386\n\t\t\t\t,-0.00112091\n\t\t\t\t,1.87534\n\t\t\t\t,-3.16136\n\t\t\t\t,2.53125\n\t\t\t\t,1.87535\n\t\t\t\t,-3.16136\n\t\t\t\t,2.53125\n\t\t\t\t,1.87535\n\t\t\t\t,0.0198975\n\t\t\t\t,-0.00112091\n\t\t\t\t,1.87534\n\t\t\t\t,0.0198903\n\t\t\t\t,2.53125\n\t\t\t\t,1.87535\n\t\t\t\t,2.5199\n\t\t\t\t,-0.00112091\n\t\t\t\t,1.87534\n\t\t\t\t,2.51989\n\t\t\t\t,-0.00112091\n\t\t\t\t,1.87534\n\t\t\t\t,-3.66136\n\t\t\t\t,2.53125\n\t\t\t\t,1.87535\n\t\t\t\t,-3.66136\n\t\t\t\t,-0.00112091\n\t\t\t\t,1.87534\n\t\t\t\t,-4.78636\n\t\t\t\t,2.53125\n\t\t\t\t,1.87535\n\t\t\t\t,-4.78636\n\t\t\t\t,-0.00112091\n\t\t\t\t,1.87534\n\t\t\t\t,-5.81761\n\t\t\t\t,2.53125\n\t\t\t\t,1.87535\n\t\t\t\t,-5.81761\n\t\t\t\t,-0.00112091\n\t\t\t\t,1.87534\n\t\t\t\t,-6.59886\n\t\t\t\t,2.19301\n\t\t\t\t,1.87535\n\t\t\t\t,-6.59886\n\t\t\t\t,-0.00112091\n\t\t\t\t,1.43397\n\t\t\t\t,-7.87386\n\t\t\t\t,2.19301\n\t\t\t\t,1.43398\n\t\t\t\t,-7.37386\n\t\t\t\t,2.53125\n\t\t\t\t,2.69243\n\t\t\t\t,3.46884\n\t\t\t\t,-0.00112091\n\t\t\t\t,2.69243\n\t\t\t\t,3.46884\n\t\t\t\t,2.53125\n\t\t\t\t,3.14684\n\t\t\t\t,6.12253\n\t\t\t\t,-0.00112091\n\t\t\t\t,3.14684\n\t\t\t\t,6.12254\n\t\t\t\t,2.53125\n\t\t\t\t,4.10616\n\t\t\t\t,7.51572\n\t\t\t\t,0\n\t\t\t\t,4.10615\n\t\t\t\t,7.89073\n\t\t\t\t,2.19301\n\t\t\t\t,1.87535\n\t\t\t\t,-8.09261\n\t\t\t\t,-0.00112091\n\t\t\t\t,1.87534\n\t\t\t\t,-8.2505\n\t\t\t\t,-0.00112091\n\t\t\t\t,2.88189\n\t\t\t\t,-8.53681\n\t\t\t\t,2.53125\n\t\t\t\t,2.8819\n\t\t\t\t,-8.37892\n\t\t\t\t,2.19301\n\t\t\t\t,1.43398\n\t\t\t\t,-7.37386\n\t\t\t\t,-0.00112091\n\t\t\t\t,1.43397\n\t\t\t\t,-7.87386\n\t\t\t\t,4.38446\n\t\t\t\t,3.77171\n\t\t\t\t,-2.86449\n\t\t\t\t,4.38446\n\t\t\t\t,3.73002\n\t\t\t\t,0.0210876\n\t\t\t\t,4.38446\n\t\t\t\t,3.70921\n\t\t\t\t,-2.66136\n\t\t\t\t,4.38446\n\t\t\t\t,3.58799\n\t\t\t\t,0.0198975\n\t\t\t\t,4.38446\n\t\t\t\t,3.5599\n\t\t\t\t,2.5199\n\t\t\t\t,4.38446\n\t\t\t\t,3.62965\n\t\t\t\t,2.49609\n\t\t\t\t,4.38446\n\t\t\t\t,3.97909\n\t\t\t\t,-3.66136\n\t\t\t\t,4.38446\n\t\t\t\t,3.77516\n\t\t\t\t,-1.51582\n\t\t\t\t,4.38446\n\t\t\t\t,3.76748\n\t\t\t\t,1.66275\n\t\t\t\t,4.38446\n\t\t\t\t,3.92503\n\t\t\t\t,-2.65868\n\t\t\t\t,4.38446\n\t\t\t\t,4.10062\n\t\t\t\t,-4.23081\n\t\t\t\t,4.38446\n\t\t\t\t,4.33654\n\t\t\t\t,-4.2301\n\t\t\t\t,4.38446\n\t\t\t\t,3.88531\n\t\t\t\t,-5.80244\n\t\t\t\t,4.38446\n\t\t\t\t,4.12002\n\t\t\t\t,-5.87508\n\t\t\t\t,4.38446\n\t\t\t\t,3.23414\n\t\t\t\t,-6.69242\n\t\t\t\t,4.38446\n\t\t\t\t,3.8866\n\t\t\t\t,2.41275\n\t\t\t\t,4.38446\n\t\t\t\t,3.70337\n\t\t\t\t,3.46884\n\t\t\t\t,4.38446\n\t\t\t\t,3.97501\n\t\t\t\t,4.53033\n\t\t\t\t,4.38446\n\t\t\t\t,3.75227\n\t\t\t\t,6.12253\n\t\t\t\t,4.38446\n\t\t\t\t,3.99131\n\t\t\t\t,6.12253\n\t\t\t\t,4.38446\n\t\t\t\t,3.85549\n\t\t\t\t,7.51572\n\t\t\t\t,4.38446\n\t\t\t\t,3.95328\n\t\t\t\t,7.64841\n\t\t\t\t,4.38446\n\t\t\t\t,3.11302\n\t\t\t\t,-6.49854\n\t\t\t\t,4.38446\n\t\t\t\t,3.70921\n\t\t\t\t,-2.66136\n\t\t\t\t,3.15717\n\t\t\t\t,3.40081\n\t\t\t\t,-2.97386\n\t\t\t\t,3.15717\n\t\t\t\t,3.40081\n\t\t\t\t,-3.16136\n\t\t\t\t,4.38446\n\t\t\t\t,3.77171\n\t\t\t\t,-2.86449\n\t\t\t\t,4.38446\n\t\t\t\t,3.58799\n\t\t\t\t,0.0198975\n\t\t\t\t,3.15717\n\t\t\t\t,3.40081\n\t\t\t\t,0.0198975\n\t\t\t\t,4.38446\n\t\t\t\t,3.5599\n\t\t\t\t,2.5199\n\t\t\t\t,3.15717\n\t\t\t\t,3.40081\n\t\t\t\t,2.5199\n\t\t\t\t,3.15717\n\t\t\t\t,3.40081\n\t\t\t\t,-3.66136\n\t\t\t\t,4.38446\n\t\t\t\t,3.97909\n\t\t\t\t,-3.66136\n\t\t\t\t,4.38446\n\t\t\t\t,3.77516\n\t\t\t\t,-1.51582\n\t\t\t\t,3.15717\n\t\t\t\t,4.37021\n\t\t\t\t,-1.51582\n\t\t\t\t,3.15717\n\t\t\t\t,4.33361\n\t\t\t\t,1.66275\n\t\t\t\t,4.38446\n\t\t\t\t,3.76748\n\t\t\t\t,1.66275\n\t\t\t\t,4.38446\n\t\t\t\t,3.92503\n\t\t\t\t,-2.65868\n\t\t\t\t,3.15717\n\t\t\t\t,5.08381\n\t\t\t\t,-2.65868\n\t\t\t\t,3.15717\n\t\t\t\t,3.40081\n\t\t\t\t,-4.78636\n\t\t\t\t,4.38446\n\t\t\t\t,4.10062\n\t\t\t\t,-4.23081\n\t\t\t\t,4.38446\n\t\t\t\t,4.33654\n\t\t\t\t,-4.2301\n\t\t\t\t,3.15717\n\t\t\t\t,5.10278\n\t\t\t\t,-4.2301\n\t\t\t\t,3.15717\n\t\t\t\t,3.40081\n\t\t\t\t,-5.81761\n\t\t\t\t,4.38446\n\t\t\t\t,3.88531\n\t\t\t\t,-5.80244\n\t\t\t\t,3.15717\n\t\t\t\t,4.95639\n\t\t\t\t,-5.87297\n\t\t\t\t,4.38446\n\t\t\t\t,4.12002\n\t\t\t\t,-5.87508\n\t\t\t\t,3.15717\n\t\t\t\t,4.34588\n\t\t\t\t,-7.05154\n\t\t\t\t,3.15717\n\t\t\t\t,3.40081\n\t\t\t\t,-6.59886\n\t\t\t\t,4.38446\n\t\t\t\t,3.11302\n\t\t\t\t,-6.49854\n\t\t\t\t,4.38446\n\t\t\t\t,3.23414\n\t\t\t\t,-6.69242\n\t\t\t\t,3.77628\n\t\t\t\t,2.95636\n\t\t\t\t,-7.52037\n\t\t\t\t,3.15717\n\t\t\t\t,2.79988\n\t\t\t\t,-8.23576\n\t\t\t\t,3.15717\n\t\t\t\t,3.17468\n\t\t\t\t,-7.37386\n\t\t\t\t,3.77628\n\t\t\t\t,2.95636\n\t\t\t\t,-7.52037\n\t\t\t\t,3.15717\n\t\t\t\t,5.59528\n\t\t\t\t,2.99608\n\t\t\t\t,4.38446\n\t\t\t\t,3.8866\n\t\t\t\t,2.41275\n\t\t\t\t,4.38446\n\t\t\t\t,3.70337\n\t\t\t\t,3.46884\n\t\t\t\t,3.15717\n\t\t\t\t,3.81942\n\t\t\t\t,3.46884\n\t\t\t\t,3.15717\n\t\t\t\t,5.80724\n\t\t\t\t,5.11367\n\t\t\t\t,4.38446\n\t\t\t\t,3.97501\n\t\t\t\t,4.53033\n\t\t\t\t,4.38446\n\t\t\t\t,3.75227\n\t\t\t\t,6.12253\n\t\t\t\t,3.15717\n\t\t\t\t,4.05223\n\t\t\t\t,6.12253\n\t\t\t\t,3.15717\n\t\t\t\t,5.88485\n\t\t\t\t,6.70586\n\t\t\t\t,4.38446\n\t\t\t\t,3.99131\n\t\t\t\t,6.12253\n\t\t\t\t,4.38446\n\t\t\t\t,3.85549\n\t\t\t\t,7.51572\n\t\t\t\t,3.15717\n\t\t\t\t,4.54371\n\t\t\t\t,7.51572\n\t\t\t\t,4.38446\n\t\t\t\t,3.95328\n\t\t\t\t,7.64841\n\t\t\t\t,3.15717\n\t\t\t\t,5.00932\n\t\t\t\t,7.64841\n\t\t\t\t,4.38446\n\t\t\t\t,3.95328\n\t\t\t\t,7.64841\n\t\t\t\t,4.38446\n\t\t\t\t,3.95328\n\t\t\t\t,7.64841\n\t\t\t\t,3.15717\n\t\t\t\t,5.00932\n\t\t\t\t,7.64841\n\t\t\t\t,4.38446\n\t\t\t\t,3.23414\n\t\t\t\t,-6.69242\n\t\t\t\t,4.38446\n\t\t\t\t,3.11302\n\t\t\t\t,-6.49854\n\t\t\t\t,3.15717\n\t\t\t\t,3.40081\n\t\t\t\t,-2.97386\n\t\t\t\t,2.53125\n\t\t\t\t,1.87535\n\t\t\t\t,-2.97386\n\t\t\t\t,2.53125\n\t\t\t\t,1.87535\n\t\t\t\t,-3.16136\n\t\t\t\t,3.15717\n\t\t\t\t,3.40081\n\t\t\t\t,-3.16136\n\t\t\t\t,3.15717\n\t\t\t\t,3.40081\n\t\t\t\t,0.0198975\n\t\t\t\t,2.53125\n\t\t\t\t,1.87535\n\t\t\t\t,0.0198975\n\t\t\t\t,3.15717\n\t\t\t\t,3.40081\n\t\t\t\t,2.5199\n\t\t\t\t,2.53125\n\t\t\t\t,1.87535\n\t\t\t\t,2.5199\n\t\t\t\t,2.53125\n\t\t\t\t,1.87535\n\t\t\t\t,-3.66136\n\t\t\t\t,3.15717\n\t\t\t\t,3.40081\n\t\t\t\t,-3.66136\n\t\t\t\t,2.53125\n\t\t\t\t,1.87535\n\t\t\t\t,-4.78636\n\t\t\t\t,3.15717\n\t\t\t\t,3.40081\n\t\t\t\t,-4.78636\n\t\t\t\t,2.53125\n\t\t\t\t,1.87535\n\t\t\t\t,-5.81761\n\t\t\t\t,3.15717\n\t\t\t\t,3.40081\n\t\t\t\t,-5.81761\n\t\t\t\t,2.19301\n\t\t\t\t,1.87535\n\t\t\t\t,-6.59886\n\t\t\t\t,3.15717\n\t\t\t\t,3.40081\n\t\t\t\t,-6.59886\n\t\t\t\t,3.15717\n\t\t\t\t,2.79988\n\t\t\t\t,-8.23576\n\t\t\t\t,2.19301\n\t\t\t\t,1.87535\n\t\t\t\t,-8.09261\n\t\t\t\t,2.53125\n\t\t\t\t,2.8819\n\t\t\t\t,-8.37892\n\t\t\t\t,2.19301\n\t\t\t\t,1.43398\n\t\t\t\t,-7.37386\n\t\t\t\t,3.15717\n\t\t\t\t,3.17468\n\t\t\t\t,-7.37386\n\t\t\t\t,2.19301\n\t\t\t\t,1.43398\n\t\t\t\t,-7.37386\n\t\t\t\t,2.19301\n\t\t\t\t,1.87535\n\t\t\t\t,-8.09261\n\t\t\t\t,3.15717\n\t\t\t\t,2.79988\n\t\t\t\t,-8.23576\n\t\t\t\t,3.15717\n\t\t\t\t,3.81942\n\t\t\t\t,3.46884\n\t\t\t\t,2.53125\n\t\t\t\t,2.69243\n\t\t\t\t,3.46884\n\t\t\t\t,3.15717\n\t\t\t\t,4.05223\n\t\t\t\t,6.12253\n\t\t\t\t,2.53125\n\t\t\t\t,3.14684\n\t\t\t\t,6.12253\n\t\t\t\t,3.15717\n\t\t\t\t,4.54371\n\t\t\t\t,7.51572\n\t\t\t\t,2.53125\n\t\t\t\t,4.10616\n\t\t\t\t,7.51572\n\t\t\t\t,1.15459\n\t\t\t\t,5.34434\n\t\t\t\t,-5.98805\n\t\t\t\t,2.53125\n\t\t\t\t,4.91165\n\t\t\t\t,-5.87297\n\t\t\t\t,0\n\t\t\t\t,4.93088\n\t\t\t\t,-6.07008\n\t\t\t\t,0\n\t\t\t\t,5.34434\n\t\t\t\t,-6.03739\n\t\t\t\t,2.53125\n\t\t\t\t,5.19737\n\t\t\t\t,-4.2301\n\t\t\t\t,0\n\t\t\t\t,5.19737\n\t\t\t\t,-3.51761\n\t\t\t\t,-0.00112091\n\t\t\t\t,5.21324\n\t\t\t\t,-2.65868\n\t\t\t\t,2.53125\n\t\t\t\t,5.21324\n\t\t\t\t,-2.65868\n\t\t\t\t,1.15459\n\t\t\t\t,5.34434\n\t\t\t\t,-5.98805\n\t\t\t\t,0\n\t\t\t\t,5.34434\n\t\t\t\t,-6.03739\n\t\t\t\t,0\n\t\t\t\t,5.4666\n\t\t\t\t,-3.7676\n\t\t\t\t,1.15459\n\t\t\t\t,5.44737\n\t\t\t\t,-4.80095\n\t\t\t\t,2.53125\n\t\t\t\t,4.19736\n\t\t\t\t,-7.05154\n\t\t\t\t,-0.00112091\n\t\t\t\t,4.19737\n\t\t\t\t,-7.61404\n\t\t\t\t,0\n\t\t\t\t,4.93088\n\t\t\t\t,-6.07008\n\t\t\t\t,2.53125\n\t\t\t\t,4.91165\n\t\t\t\t,-5.87297\n\t\t\t\t,2.53125\n\t\t\t\t,2.8819\n\t\t\t\t,-8.37892\n\t\t\t\t,-0.00112091\n\t\t\t\t,2.88189\n\t\t\t\t,-8.53681\n\t\t\t\t,3.15717\n\t\t\t\t,5.10278\n\t\t\t\t,-4.2301\n\t\t\t\t,3.15717\n\t\t\t\t,5.08381\n\t\t\t\t,-2.65868\n\t\t\t\t,3.15717\n\t\t\t\t,4.95639\n\t\t\t\t,-5.87297\n\t\t\t\t,3.15717\n\t\t\t\t,4.34588\n\t\t\t\t,-7.05154\n\t\t\t\t,3.15717\n\t\t\t\t,2.79988\n\t\t\t\t,-8.23576\n\t\t\t\t,3.15717\n\t\t\t\t,2.79988\n\t\t\t\t,-8.23576\n\t\t\t\t,0\n\t\t\t\t,5.34434\n\t\t\t\t,-6.03739\n\t\t\t\t,0\n\t\t\t\t,4.93088\n\t\t\t\t,-6.07008\n\t\t\t\t,0\n\t\t\t\t,5.19737\n\t\t\t\t,-3.51761\n\t\t\t\t,0\n\t\t\t\t,5.4666\n\t\t\t\t,-3.7676\n\t\t\t\t,2.53125\n\t\t\t\t,3.82039\n\t\t\t\t,-1.92372\n\t\t\t\t,-0.00112091\n\t\t\t\t,3.82038\n\t\t\t\t,-1.92372\n\t\t\t\t,-0.00112091\n\t\t\t\t,3.74895\n\t\t\t\t,1.66275\n\t\t\t\t,2.53125\n\t\t\t\t,3.74895\n\t\t\t\t,1.66275\n\t\t\t\t,2.53125\n\t\t\t\t,5.21324\n\t\t\t\t,-2.65868\n\t\t\t\t,-0.00112091\n\t\t\t\t,5.21324\n\t\t\t\t,-2.65868\n\t\t\t\t,-0.00112091\n\t\t\t\t,5.55054\n\t\t\t\t,2.99608\n\t\t\t\t,2.53125\n\t\t\t\t,5.55054\n\t\t\t\t,2.99608\n\t\t\t\t,3.15717\n\t\t\t\t,4.37021\n\t\t\t\t,-1.51582\n\t\t\t\t,3.15717\n\t\t\t\t,4.33361\n\t\t\t\t,1.66275\n\t\t\t\t,3.15717\n\t\t\t\t,5.08381\n\t\t\t\t,-2.65868\n\t\t\t\t,3.15717\n\t\t\t\t,5.08381\n\t\t\t\t,-2.65868\n\t\t\t\t,3.15717\n\t\t\t\t,5.59528\n\t\t\t\t,2.99608\n\t\t\t\t,2.53125\n\t\t\t\t,5.55054\n\t\t\t\t,2.99608\n\t\t\t\t,-0.00112091\n\t\t\t\t,5.55054\n\t\t\t\t,2.99608\n\t\t\t\t,-0.00112091\n\t\t\t\t,5.91138\n\t\t\t\t,5.11366\n\t\t\t\t,2.53125\n\t\t\t\t,5.91138\n\t\t\t\t,5.11367\n\t\t\t\t,0\n\t\t\t\t,6.06285\n\t\t\t\t,6.70587\n\t\t\t\t,2.53125\n\t\t\t\t,6.06285\n\t\t\t\t,6.70586\n\t\t\t\t,0\n\t\t\t\t,5.01498\n\t\t\t\t,8.02341\n\t\t\t\t,2.53125\n\t\t\t\t,5.01497\n\t\t\t\t,7.64841\n\t\t\t\t,3.15717\n\t\t\t\t,5.59528\n\t\t\t\t,2.99608\n\t\t\t\t,3.15717\n\t\t\t\t,5.80724\n\t\t\t\t,5.11367\n\t\t\t\t,3.15717\n\t\t\t\t,5.88485\n\t\t\t\t,6.70586\n\t\t\t\t,3.15717\n\t\t\t\t,5.00932\n\t\t\t\t,7.64841\n\t\t\t\t,3.28145\n\t\t\t\t,5.5256\n\t\t\t\t,6.9363\n\t\t\t\t,4.1697\n\t\t\t\t,4.0473\n\t\t\t\t,6.9363\n\t\t\t\t,3.86047\n\t\t\t\t,5.75026\n\t\t\t\t,6.82229\n\t\t\t\t,4.63989\n\t\t\t\t,4.45308\n\t\t\t\t,6.82229\n\t\t\t\t,3.86047\n\t\t\t\t,5.75026\n\t\t\t\t,6.82229\n\t\t\t\t,4.63989\n\t\t\t\t,4.45308\n\t\t\t\t,6.82229\n\t\t\t\t,3.86047\n\t\t\t\t,5.75026\n\t\t\t\t,5.8628\n\t\t\t\t,4.63989\n\t\t\t\t,4.45308\n\t\t\t\t,5.8628\n\t\t\t\t,3.86047\n\t\t\t\t,5.75026\n\t\t\t\t,5.8628\n\t\t\t\t,4.63989\n\t\t\t\t,4.45308\n\t\t\t\t,5.8628\n\t\t\t\t,3.28145\n\t\t\t\t,5.5256\n\t\t\t\t,5.7488\n\t\t\t\t,4.63989\n\t\t\t\t,4.45308\n\t\t\t\t,5.8628\n\t\t\t\t,4.1697\n\t\t\t\t,4.0473\n\t\t\t\t,5.7488\n\t\t\t\t,3.28145\n\t\t\t\t,5.5256\n\t\t\t\t,5.7488\n\t\t\t\t,3.28145\n\t\t\t\t,5.5256\n\t\t\t\t,6.9363\n\t\t\t\t,3.86047\n\t\t\t\t,5.75026\n\t\t\t\t,5.8628\n\t\t\t\t,3.86047\n\t\t\t\t,5.75026\n\t\t\t\t,6.82229\n\t\t\t\t,4.1697\n\t\t\t\t,4.0473\n\t\t\t\t,6.9363\n\t\t\t\t,4.1697\n\t\t\t\t,4.0473\n\t\t\t\t,5.7488\n\t\t\t\t,4.63989\n\t\t\t\t,4.45308\n\t\t\t\t,6.82229\n\t\t\t\t,4.63989\n\t\t\t\t,4.45308\n\t\t\t\t,5.8628\n\t\t\t\t,3.01518\n\t\t\t\t,4.98901\n\t\t\t\t,-2.96243\n\t\t\t\t,3.01518\n\t\t\t\t,6.20824\n\t\t\t\t,-2.33814\n\t\t\t\t,2.92589\n\t\t\t\t,4.90294\n\t\t\t\t,-2.81899\n\t\t\t\t,2.92589\n\t\t\t\t,6.12216\n\t\t\t\t,-2.19471\n\t\t\t\t,2.74732\n\t\t\t\t,6.12216\n\t\t\t\t,-2.19471\n\t\t\t\t,2.74732\n\t\t\t\t,4.90294\n\t\t\t\t,-2.81899\n\t\t\t\t,2.65804\n\t\t\t\t,4.98901\n\t\t\t\t,-2.96243\n\t\t\t\t,2.65804\n\t\t\t\t,6.20824\n\t\t\t\t,-2.33814\n\t\t\t\t,2.65804\n\t\t\t\t,4.98901\n\t\t\t\t,-2.96243\n\t\t\t\t,2.65804\n\t\t\t\t,6.20824\n\t\t\t\t,-2.33814\n\t\t\t\t,2.74732\n\t\t\t\t,6.29431\n\t\t\t\t,-2.48157\n\t\t\t\t,2.74732\n\t\t\t\t,5.07508\n\t\t\t\t,-3.10586\n\t\t\t\t,2.92589\n\t\t\t\t,5.07508\n\t\t\t\t,-3.10586\n\t\t\t\t,2.92589\n\t\t\t\t,6.29431\n\t\t\t\t,-2.48157\n\t\t\t\t,3.01518\n\t\t\t\t,6.20824\n\t\t\t\t,-2.33814\n\t\t\t\t,3.01518\n\t\t\t\t,4.98901\n\t\t\t\t,-2.96243\n\t\t\t\t,2.77919\n\t\t\t\t,6.65258\n\t\t\t\t,-1.92312\n\t\t\t\t,2.86501\n\t\t\t\t,6.76336\n\t\t\t\t,-2.0539\n\t\t\t\t,2.60753\n\t\t\t\t,6.60316\n\t\t\t\t,-1.94843\n\t\t\t\t,2.5217\n\t\t\t\t,6.66452\n\t\t\t\t,-2.10451\n\t\t\t\t,2.60753\n\t\t\t\t,6.7753\n\t\t\t\t,-2.2353\n\t\t\t\t,2.5217\n\t\t\t\t,6.66452\n\t\t\t\t,-2.10451\n\t\t\t\t,2.77919\n\t\t\t\t,6.82473\n\t\t\t\t,-2.20999\n\t\t\t\t,2.86501\n\t\t\t\t,6.76336\n\t\t\t\t,-2.0539\n\t\t\t\t,2.55914\n\t\t\t\t,6.96189\n\t\t\t\t,-1.76474\n\t\t\t\t,2.61412\n\t\t\t\t,7.1186\n\t\t\t\t,-1.87201\n\t\t\t\t,2.44921\n\t\t\t\t,6.82061\n\t\t\t\t,-1.83709\n\t\t\t\t,2.39421\n\t\t\t\t,6.83603\n\t\t\t\t,-2.01669\n\t\t\t\t,2.44921\n\t\t\t\t,6.99275\n\t\t\t\t,-2.12395\n\t\t\t\t,2.39421\n\t\t\t\t,6.83603\n\t\t\t\t,-2.01669\n\t\t\t\t,2.55914\n\t\t\t\t,7.13404\n\t\t\t\t,-2.05161\n\t\t\t\t,2.61412\n\t\t\t\t,7.1186\n\t\t\t\t,-1.87201\n\t\t\t\t,2.28942\n\t\t\t\t,7.09457\n\t\t\t\t,-1.6968\n\t\t\t\t,2.30647\n\t\t\t\t,7.26864\n\t\t\t\t,-1.79518\n\t\t\t\t,2.25536\n\t\t\t\t,6.91858\n\t\t\t\t,-1.78692\n\t\t\t\t,2.23831\n\t\t\t\t,6.91662\n\t\t\t\t,-1.97543\n\t\t\t\t,2.25536\n\t\t\t\t,7.09073\n\t\t\t\t,-2.07379\n\t\t\t\t,2.23831\n\t\t\t\t,6.91662\n\t\t\t\t,-1.97543\n\t\t\t\t,2.28942\n\t\t\t\t,7.26672\n\t\t\t\t,-1.98367\n\t\t\t\t,2.30647\n\t\t\t\t,7.26864\n\t\t\t\t,-1.79518\n\t\t\t\t,1.98661\n\t\t\t\t,7.1238\n\t\t\t\t,-1.68184\n\t\t\t\t,1.98661\n\t\t\t\t,7.29948\n\t\t\t\t,-1.77939\n\t\t\t\t,1.98661\n\t\t\t\t,6.94453\n\t\t\t\t,-1.77363\n\t\t\t\t,1.98661\n\t\t\t\t,6.94093\n\t\t\t\t,-1.96298\n\t\t\t\t,1.98661\n\t\t\t\t,7.11667\n\t\t\t\t,-2.0605\n\t\t\t\t,1.98661\n\t\t\t\t,6.94093\n\t\t\t\t,-1.96298\n\t\t\t\t,1.98661\n\t\t\t\t,7.29594\n\t\t\t\t,-1.96871\n\t\t\t\t,1.98661\n\t\t\t\t,7.29948\n\t\t\t\t,-1.77939\n\t\t\t\t,-0.00112091\n\t\t\t\t,7.12382\n\t\t\t\t,-1.68183\n\t\t\t\t,1.98661\n\t\t\t\t,7.1238\n\t\t\t\t,-1.68184\n\t\t\t\t,1.98661\n\t\t\t\t,7.29948\n\t\t\t\t,-1.77939\n\t\t\t\t,-0.00112091\n\t\t\t\t,7.29949\n\t\t\t\t,-1.77939\n\t\t\t\t,-0.00112091\n\t\t\t\t,6.94453\n\t\t\t\t,-1.77363\n\t\t\t\t,1.98661\n\t\t\t\t,6.94453\n\t\t\t\t,-1.77363\n\t\t\t\t,-0.00112091\n\t\t\t\t,6.94091\n\t\t\t\t,-1.96299\n\t\t\t\t,1.98661\n\t\t\t\t,6.94093\n\t\t\t\t,-1.96298\n\t\t\t\t,-0.00112091\n\t\t\t\t,7.11668\n\t\t\t\t,-2.0605\n\t\t\t\t,1.98661\n\t\t\t\t,7.11667\n\t\t\t\t,-2.0605\n\t\t\t\t,1.98661\n\t\t\t\t,6.94093\n\t\t\t\t,-1.96298\n\t\t\t\t,-0.00112091\n\t\t\t\t,6.94091\n\t\t\t\t,-1.96299\n\t\t\t\t,-0.00112091\n\t\t\t\t,7.29596\n\t\t\t\t,-1.9687\n\t\t\t\t,1.98661\n\t\t\t\t,7.29594\n\t\t\t\t,-1.96871\n\t\t\t\t,-0.00112091\n\t\t\t\t,7.29949\n\t\t\t\t,-1.77939\n\t\t\t\t,1.98661\n\t\t\t\t,7.29948\n\t\t\t\t,-1.77939\n\t\t\t\t,1.09654\n\t\t\t\t,3.46628\n\t\t\t\t,7.95238\n\t\t\t\t,1.38404\n\t\t\t\t,3.46628\n\t\t\t\t,7.95238\n\t\t\t\t,1.24029\n\t\t\t\t,3.69856\n\t\t\t\t,8.10906\n\t\t\t\t,1.52779\n\t\t\t\t,3.69856\n\t\t\t\t,8.10906\n\t\t\t\t,1.67154\n\t\t\t\t,3.46628\n\t\t\t\t,7.95238\n\t\t\t\t,1.52779\n\t\t\t\t,3.234\n\t\t\t\t,7.79569\n\t\t\t\t,1.24029\n\t\t\t\t,3.234\n\t\t\t\t,7.79569\n\t\t\t\t,1.09654\n\t\t\t\t,3.46429\n\t\t\t\t,5.25238\n\t\t\t\t,1.09654\n\t\t\t\t,3.46628\n\t\t\t\t,7.95238\n\t\t\t\t,1.24029\n\t\t\t\t,3.71327\n\t\t\t\t,5.25238\n\t\t\t\t,1.24029\n\t\t\t\t,3.69856\n\t\t\t\t,8.10906\n\t\t\t\t,1.52779\n\t\t\t\t,3.69856\n\t\t\t\t,8.10906\n\t\t\t\t,1.52779\n\t\t\t\t,3.71327\n\t\t\t\t,5.25238\n\t\t\t\t,1.67154\n\t\t\t\t,3.46429\n\t\t\t\t,5.25238\n\t\t\t\t,1.67154\n\t\t\t\t,3.46628\n\t\t\t\t,7.95238\n\t\t\t\t,1.67154\n\t\t\t\t,3.46429\n\t\t\t\t,5.25238\n\t\t\t\t,1.67154\n\t\t\t\t,3.46628\n\t\t\t\t,7.95238\n\t\t\t\t,1.52779\n\t\t\t\t,3.234\n\t\t\t\t,7.79569\n\t\t\t\t,1.52779\n\t\t\t\t,3.2153\n\t\t\t\t,5.25238\n\t\t\t\t,1.24029\n\t\t\t\t,3.2153\n\t\t\t\t,5.25238\n\t\t\t\t,1.24029\n\t\t\t\t,3.234\n\t\t\t\t,7.79569\n\t\t\t\t,1.09654\n\t\t\t\t,3.46628\n\t\t\t\t,7.95238\n\t\t\t\t,1.09654\n\t\t\t\t,3.46429\n\t\t\t\t,5.25238\n\t\t\t\t,0\n\t\t\t\t,1.02193\n\t\t\t\t,6.13655\n\t\t\t\t,-0.00112091\n\t\t\t\t,1.02193\n\t\t\t\t,4.13605\n\t\t\t\t,0.99375\n\t\t\t\t,1.02193\n\t\t\t\t,4.13605\n\t\t\t\t,1.1009\n\t\t\t\t,1.13863\n\t\t\t\t,6.13655\n\t\t\t\t,1.10089\n\t\t\t\t,1.13863\n\t\t\t\t,4.13605\n\t\t\t\t,1.49375\n\t\t\t\t,1.26118\n\t\t\t\t,4.3466\n\t\t\t\t,0\n\t\t\t\t,1.02193\n\t\t\t\t,6.13655\n\t\t\t\t,0.99375\n\t\t\t\t,1.02193\n\t\t\t\t,6.13655\n\t\t\t\t,-0.00112091\n\t\t\t\t,3.39035\n\t\t\t\t,6.13655\n\t\t\t\t,1.1009\n\t\t\t\t,1.13863\n\t\t\t\t,6.13655\n\t\t\t\t,0.99375\n\t\t\t\t,2.14035\n\t\t\t\t,6.13655\n\t\t\t\t,1.49375\n\t\t\t\t,1.26118\n\t\t\t\t,5.926\n\t\t\t\t,1.49375\n\t\t\t\t,2.01953\n\t\t\t\t,5.926\n\t\t\t\t,1.57708\n\t\t\t\t,3.39035\n\t\t\t\t,6.13655\n\t\t\t\t,0.99375\n\t\t\t\t,1.02193\n\t\t\t\t,6.13655\n\t\t\t\t,1.49375\n\t\t\t\t,1.26118\n\t\t\t\t,5.926\n\t\t\t\t,1.49375\n\t\t\t\t,2.01953\n\t\t\t\t,4.3466\n\t\t\t\t,1.49375\n\t\t\t\t,2.01953\n\t\t\t\t,5.926\n\t\t\t\t,0.99375\n\t\t\t\t,2.14035\n\t\t\t\t,4.13605\n\t\t\t\t,0.99375\n\t\t\t\t,2.14035\n\t\t\t\t,6.13655\n\t\t\t\t,0.99375\n\t\t\t\t,2.14035\n\t\t\t\t,6.13655\n\t\t\t\t,0.99375\n\t\t\t\t,2.14035\n\t\t\t\t,4.13605\n\t\t\t\t,1.57708\n\t\t\t\t,3.39035\n\t\t\t\t,3.46938\n\t\t\t\t,1.57708\n\t\t\t\t,3.39035\n\t\t\t\t,6.13655\n\t\t\t\t,-0.00112091\n\t\t\t\t,3.39035\n\t\t\t\t,3.46938\n\t\t\t\t,0.99375\n\t\t\t\t,2.14035\n\t\t\t\t,4.13605\n\t\t\t\t,1.10089\n\t\t\t\t,1.13863\n\t\t\t\t,4.13605\n\t\t\t\t,1.49375\n\t\t\t\t,1.26118\n\t\t\t\t,4.3466\n\t\t\t\t,1.57708\n\t\t\t\t,3.39035\n\t\t\t\t,3.46938\n\t\t\t\t,2.52315\n\t\t\t\t,1.65387\n\t\t\t\t,6.50281\n\t\t\t\t,3.57579\n\t\t\t\t,1.65387\n\t\t\t\t,6.50281\n\t\t\t\t,2.52315\n\t\t\t\t,2.29555\n\t\t\t\t,6.2328\n\t\t\t\t,3.57579\n\t\t\t\t,2.29555\n\t\t\t\t,6.2328\n\t\t\t\t,3.57579\n\t\t\t\t,2.56134\n\t\t\t\t,5.58093\n\t\t\t\t,2.52315\n\t\t\t\t,2.56134\n\t\t\t\t,5.58093\n\t\t\t\t,2.52315\n\t\t\t\t,2.29555\n\t\t\t\t,4.92907\n\t\t\t\t,3.57579\n\t\t\t\t,2.29555\n\t\t\t\t,4.92907\n\t\t\t\t,3.57579\n\t\t\t\t,1.65387\n\t\t\t\t,4.65906\n\t\t\t\t,2.52315\n\t\t\t\t,1.65387\n\t\t\t\t,4.65906\n\t\t\t\t,2.52315\n\t\t\t\t,1.01219\n\t\t\t\t,4.92907\n\t\t\t\t,3.57579\n\t\t\t\t,1.01219\n\t\t\t\t,4.92907\n\t\t\t\t,2.52315\n\t\t\t\t,1.01219\n\t\t\t\t,4.92907\n\t\t\t\t,3.57579\n\t\t\t\t,1.01219\n\t\t\t\t,4.92907\n\t\t\t\t,3.57579\n\t\t\t\t,0.746398\n\t\t\t\t,5.58093\n\t\t\t\t,2.52315\n\t\t\t\t,0.746398\n\t\t\t\t,5.58093\n\t\t\t\t,2.52315\n\t\t\t\t,1.01219\n\t\t\t\t,6.2328\n\t\t\t\t,3.57579\n\t\t\t\t,1.01219\n\t\t\t\t,6.2328\n\t\t\t\t,1.64814\n\t\t\t\t,1.65387\n\t\t\t\t,5.8791\n\t\t\t\t,1.64814\n\t\t\t\t,1.8494\n\t\t\t\t,5.79177\n\t\t\t\t,1.64814\n\t\t\t\t,1.93039\n\t\t\t\t,5.58093\n\t\t\t\t,1.64814\n\t\t\t\t,1.8494\n\t\t\t\t,5.37009\n\t\t\t\t,1.64814\n\t\t\t\t,1.65387\n\t\t\t\t,5.28276\n\t\t\t\t,1.64814\n\t\t\t\t,1.45834\n\t\t\t\t,5.37009\n\t\t\t\t,1.64814\n\t\t\t\t,1.45834\n\t\t\t\t,5.37009\n\t\t\t\t,1.64814\n\t\t\t\t,1.37735\n\t\t\t\t,5.58093\n\t\t\t\t,1.64814\n\t\t\t\t,1.45834\n\t\t\t\t,5.79177\n\t\t\t\t,-0.00112091\n\t\t\t\t,1.65387\n\t\t\t\t,5.87911\n\t\t\t\t,-0.00112091\n\t\t\t\t,1.8494\n\t\t\t\t,5.79177\n\t\t\t\t,-0.00112091\n\t\t\t\t,1.93039\n\t\t\t\t,5.58094\n\t\t\t\t,-0.00112091\n\t\t\t\t,1.8494\n\t\t\t\t,5.37009\n\t\t\t\t,-0.00112091\n\t\t\t\t,1.65387\n\t\t\t\t,5.28276\n\t\t\t\t,-0.00112091\n\t\t\t\t,1.45834\n\t\t\t\t,5.37009\n\t\t\t\t,-0.00112091\n\t\t\t\t,1.45834\n\t\t\t\t,5.37009\n\t\t\t\t,1.64814\n\t\t\t\t,1.45834\n\t\t\t\t,5.37009\n\t\t\t\t,1.64814\n\t\t\t\t,1.37735\n\t\t\t\t,5.58093\n\t\t\t\t,-0.00112091\n\t\t\t\t,1.45834\n\t\t\t\t,5.37009\n\t\t\t\t,-0.00112091\n\t\t\t\t,1.37735\n\t\t\t\t,5.58094\n\t\t\t\t,-0.00112091\n\t\t\t\t,1.45834\n\t\t\t\t,5.79177\n\t\t\t\t,-3.86047\n\t\t\t\t,5.75026\n\t\t\t\t,5.25979\n\t\t\t\t,-4.1697\n\t\t\t\t,4.0473\n\t\t\t\t,5.3738\n\t\t\t\t,-3.28145\n\t\t\t\t,5.5256\n\t\t\t\t,5.3738\n\t\t\t\t,-4.63989\n\t\t\t\t,4.45308\n\t\t\t\t,5.25979\n\t\t\t\t,-3.86047\n\t\t\t\t,5.75026\n\t\t\t\t,4.3003\n\t\t\t\t,-4.63989\n\t\t\t\t,4.45308\n\t\t\t\t,5.25979\n\t\t\t\t,-3.86047\n\t\t\t\t,5.75026\n\t\t\t\t,5.25979\n\t\t\t\t,-4.63989\n\t\t\t\t,4.45308\n\t\t\t\t,4.3003\n\t\t\t\t,-3.28145\n\t\t\t\t,5.5256\n\t\t\t\t,4.1863\n\t\t\t\t,-4.63989\n\t\t\t\t,4.45308\n\t\t\t\t,4.3003\n\t\t\t\t,-3.86047\n\t\t\t\t,5.75026\n\t\t\t\t,4.3003\n\t\t\t\t,-4.1697\n\t\t\t\t,4.0473\n\t\t\t\t,4.1863\n\t\t\t\t,-4.63989\n\t\t\t\t,4.45308\n\t\t\t\t,4.3003\n\t\t\t\t,-3.86047\n\t\t\t\t,5.75026\n\t\t\t\t,4.3003\n\t\t\t\t,-3.28145\n\t\t\t\t,5.5256\n\t\t\t\t,5.3738\n\t\t\t\t,-3.28145\n\t\t\t\t,5.5256\n\t\t\t\t,4.1863\n\t\t\t\t,-3.86047\n\t\t\t\t,5.75026\n\t\t\t\t,5.25979\n\t\t\t\t,-4.63989\n\t\t\t\t,4.45308\n\t\t\t\t,5.25979\n\t\t\t\t,-4.1697\n\t\t\t\t,4.0473\n\t\t\t\t,4.1863\n\t\t\t\t,-4.1697\n\t\t\t\t,4.0473\n\t\t\t\t,5.3738\n\t\t\t\t,-4.63989\n\t\t\t\t,4.45308\n\t\t\t\t,4.3003\n\t\t\t\t,-2.15556\n\t\t\t\t,4.44128\n\t\t\t\t,-0.88176\n\t\t\t\t,-2.15556\n\t\t\t\t,4.16003\n\t\t\t\t,-1.06926\n\t\t\t\t,-2.15556\n\t\t\t\t,3.39441\n\t\t\t\t,-0.97551\n\t\t\t\t,-2.15556\n\t\t\t\t,4.22253\n\t\t\t\t,0.368225\n\t\t\t\t,-2.15556\n\t\t\t\t,3.39441\n\t\t\t\t,1.64948\n\t\t\t\t,-2.15556\n\t\t\t\t,5.37878\n\t\t\t\t,1.46198\n\t\t\t\t,-2.15556\n\t\t\t\t,5.50378\n\t\t\t\t,0.961975\n\t\t\t\t,-0.6\n\t\t\t\t,4.16003\n\t\t\t\t,-1.06926\n\t\t\t\t,-0.6\n\t\t\t\t,3.39441\n\t\t\t\t,-0.97551\n\t\t\t\t,-2.15556\n\t\t\t\t,3.39441\n\t\t\t\t,-0.97551\n\t\t\t\t,-2.15556\n\t\t\t\t,4.16003\n\t\t\t\t,-1.06926\n\t\t\t\t,-0.6\n\t\t\t\t,4.44128\n\t\t\t\t,-0.88176\n\t\t\t\t,-2.15556\n\t\t\t\t,4.44128\n\t\t\t\t,-0.88176\n\t\t\t\t,-0.6\n\t\t\t\t,4.22253\n\t\t\t\t,0.36824\n\t\t\t\t,-0.6\n\t\t\t\t,4.44128\n\t\t\t\t,-0.88176\n\t\t\t\t,-2.15556\n\t\t\t\t,4.44128\n\t\t\t\t,-0.88176\n\t\t\t\t,-2.15556\n\t\t\t\t,4.22253\n\t\t\t\t,0.368225\n\t\t\t\t,-0.6\n\t\t\t\t,5.50378\n\t\t\t\t,0.96199\n\t\t\t\t,-0.6\n\t\t\t\t,4.22253\n\t\t\t\t,0.36824\n\t\t\t\t,-2.15556\n\t\t\t\t,4.22253\n\t\t\t\t,0.368225\n\t\t\t\t,-2.15556\n\t\t\t\t,5.50378\n\t\t\t\t,0.961975\n\t\t\t\t,-0.6\n\t\t\t\t,5.37878\n\t\t\t\t,1.46199\n\t\t\t\t,-0.6\n\t\t\t\t,5.50378\n\t\t\t\t,0.96199\n\t\t\t\t,-2.15556\n\t\t\t\t,5.50378\n\t\t\t\t,0.961975\n\t\t\t\t,-0.6\n\t\t\t\t,3.39441\n\t\t\t\t,1.64949\n\t\t\t\t,-0.6\n\t\t\t\t,5.37878\n\t\t\t\t,1.46199\n\t\t\t\t,-0.6\n\t\t\t\t,3.39441\n\t\t\t\t,-0.97551\n\t\t\t\t,-0.6\n\t\t\t\t,4.16003\n\t\t\t\t,-1.06926\n\t\t\t\t,-0.6\n\t\t\t\t,4.44128\n\t\t\t\t,-0.88176\n\t\t\t\t,-0.6\n\t\t\t\t,4.22253\n\t\t\t\t,0.36824\n\t\t\t\t,-0.6\n\t\t\t\t,5.50378\n\t\t\t\t,0.96199\n\t\t\t\t,-0.6\n\t\t\t\t,5.37878\n\t\t\t\t,1.46199\n\t\t\t\t,-2.92589\n\t\t\t\t,4.97158\n\t\t\t\t,3.24546\n\t\t\t\t,-3.01518\n\t\t\t\t,6.18587\n\t\t\t\t,3.09081\n\t\t\t\t,-3.01518\n\t\t\t\t,4.97158\n\t\t\t\t,3.09081\n\t\t\t\t,-2.92589\n\t\t\t\t,6.18586\n\t\t\t\t,3.24546\n\t\t\t\t,-2.74732\n\t\t\t\t,6.18586\n\t\t\t\t,3.24546\n\t\t\t\t,-2.74732\n\t\t\t\t,4.97158\n\t\t\t\t,3.24546\n\t\t\t\t,-2.65804\n\t\t\t\t,4.97158\n\t\t\t\t,3.09081\n\t\t\t\t,-2.65804\n\t\t\t\t,6.18587\n\t\t\t\t,3.09081\n\t\t\t\t,-2.74732\n\t\t\t\t,6.18586\n\t\t\t\t,2.93617\n\t\t\t\t,-2.65804\n\t\t\t\t,6.18587\n\t\t\t\t,3.09081\n\t\t\t\t,-2.65804\n\t\t\t\t,4.97158\n\t\t\t\t,3.09081\n\t\t\t\t,-2.74732\n\t\t\t\t,4.97157\n\t\t\t\t,2.93617\n\t\t\t\t,-2.92589\n\t\t\t\t,4.97157\n\t\t\t\t,2.93617\n\t\t\t\t,-2.92589\n\t\t\t\t,6.18586\n\t\t\t\t,2.93617\n\t\t\t\t,-3.01518\n\t\t\t\t,6.18587\n\t\t\t\t,3.09081\n\t\t\t\t,-3.01518\n\t\t\t\t,4.97158\n\t\t\t\t,3.09081\n\t\t\t\t,-2.77919\n\t\t\t\t,6.71412\n\t\t\t\t,3.24546\n\t\t\t\t,-2.86501\n\t\t\t\t,6.73873\n\t\t\t\t,3.09081\n\t\t\t\t,-2.60753\n\t\t\t\t,6.6649\n\t\t\t\t,3.24546\n\t\t\t\t,-2.5217\n\t\t\t\t,6.64029\n\t\t\t\t,3.09081\n\t\t\t\t,-2.60753\n\t\t\t\t,6.6649\n\t\t\t\t,2.93616\n\t\t\t\t,-2.5217\n\t\t\t\t,6.64029\n\t\t\t\t,3.09081\n\t\t\t\t,-2.77919\n\t\t\t\t,6.71413\n\t\t\t\t,2.93616\n\t\t\t\t,-2.86501\n\t\t\t\t,6.73873\n\t\t\t\t,3.09081\n\t\t\t\t,-2.55914\n\t\t\t\t,7.02218\n\t\t\t\t,3.24546\n\t\t\t\t,-2.61412\n\t\t\t\t,7.09253\n\t\t\t\t,3.09081\n\t\t\t\t,-2.44921\n\t\t\t\t,6.88147\n\t\t\t\t,3.24546\n\t\t\t\t,-2.39421\n\t\t\t\t,6.81111\n\t\t\t\t,3.09081\n\t\t\t\t,-2.44921\n\t\t\t\t,6.88147\n\t\t\t\t,2.93617\n\t\t\t\t,-2.39421\n\t\t\t\t,6.81111\n\t\t\t\t,3.09081\n\t\t\t\t,-2.55914\n\t\t\t\t,7.02219\n\t\t\t\t,2.93617\n\t\t\t\t,-2.61412\n\t\t\t\t,7.09253\n\t\t\t\t,3.09081\n\t\t\t\t,-2.28942\n\t\t\t\t,7.15433\n\t\t\t\t,3.24546\n\t\t\t\t,-2.30647\n\t\t\t\t,7.24197\n\t\t\t\t,3.09081\n\t\t\t\t,-2.25536\n\t\t\t\t,6.97905\n\t\t\t\t,3.24546\n\t\t\t\t,-2.23831\n\t\t\t\t,6.89137\n\t\t\t\t,3.09081\n\t\t\t\t,-2.25536\n\t\t\t\t,6.97905\n\t\t\t\t,2.93616\n\t\t\t\t,-2.23831\n\t\t\t\t,6.89137\n\t\t\t\t,3.09081\n\t\t\t\t,-2.28942\n\t\t\t\t,7.15433\n\t\t\t\t,2.93616\n\t\t\t\t,-2.30647\n\t\t\t\t,7.24197\n\t\t\t\t,3.09081\n\t\t\t\t,-1.98661\n\t\t\t\t,7.18344\n\t\t\t\t,3.24546\n\t\t\t\t,-1.98661\n\t\t\t\t,7.27268\n\t\t\t\t,3.09081\n\t\t\t\t,-1.98661\n\t\t\t\t,7.00489\n\t\t\t\t,3.24546\n\t\t\t\t,-1.98661\n\t\t\t\t,6.91558\n\t\t\t\t,3.09081\n\t\t\t\t,-1.98661\n\t\t\t\t,7.00489\n\t\t\t\t,2.93616\n\t\t\t\t,-1.98661\n\t\t\t\t,6.91558\n\t\t\t\t,3.09081\n\t\t\t\t,-1.98661\n\t\t\t\t,7.18344\n\t\t\t\t,2.93617\n\t\t\t\t,-1.98661\n\t\t\t\t,7.27268\n\t\t\t\t,3.09081\n\t\t\t\t,-1.98661\n\t\t\t\t,7.27268\n\t\t\t\t,3.09081\n\t\t\t\t,-1.98661\n\t\t\t\t,7.18344\n\t\t\t\t,3.24546\n\t\t\t\t,0.00112091\n\t\t\t\t,7.18345\n\t\t\t\t,3.24546\n\t\t\t\t,0.00112091\n\t\t\t\t,7.27269\n\t\t\t\t,3.09081\n\t\t\t\t,-1.98661\n\t\t\t\t,7.00489\n\t\t\t\t,3.24546\n\t\t\t\t,0.00112091\n\t\t\t\t,7.00489\n\t\t\t\t,3.24546\n\t\t\t\t,-1.98661\n\t\t\t\t,6.91558\n\t\t\t\t,3.09081\n\t\t\t\t,0.00112091\n\t\t\t\t,6.91557\n\t\t\t\t,3.09081\n\t\t\t\t,-1.98661\n\t\t\t\t,6.91558\n\t\t\t\t,3.09081\n\t\t\t\t,-1.98661\n\t\t\t\t,7.00489\n\t\t\t\t,2.93616\n\t\t\t\t,0.00112091\n\t\t\t\t,7.0049\n\t\t\t\t,2.93616\n\t\t\t\t,0.00112091\n\t\t\t\t,6.91557\n\t\t\t\t,3.09081\n\t\t\t\t,-1.98661\n\t\t\t\t,7.18344\n\t\t\t\t,2.93617\n\t\t\t\t,0.00112091\n\t\t\t\t,7.18345\n\t\t\t\t,2.93617\n\t\t\t\t,-1.98661\n\t\t\t\t,7.27268\n\t\t\t\t,3.09081\n\t\t\t\t,0.00112091\n\t\t\t\t,7.27269\n\t\t\t\t,3.09081\n\t\t\t\t,-1.34143\n\t\t\t\t,6.99511\n\t\t\t\t,-1.88513\n\t\t\t\t,-1.40786\n\t\t\t\t,7.08937\n\t\t\t\t,3.10419\n\t\t\t\t,-1.40786\n\t\t\t\t,7.11017\n\t\t\t\t,-1.88513\n\t\t\t\t,-1.34143\n\t\t\t\t,6.97431\n\t\t\t\t,3.10419\n\t\t\t\t,-1.20857\n\t\t\t\t,6.97431\n\t\t\t\t,3.10419\n\t\t\t\t,-1.34143\n\t\t\t\t,6.97431\n\t\t\t\t,3.10419\n\t\t\t\t,-1.34143\n\t\t\t\t,6.99511\n\t\t\t\t,-1.88513\n\t\t\t\t,-1.20857\n\t\t\t\t,6.99511\n\t\t\t\t,-1.88513\n\t\t\t\t,-1.14214\n\t\t\t\t,7.11017\n\t\t\t\t,-1.88513\n\t\t\t\t,-1.20857\n\t\t\t\t,6.97431\n\t\t\t\t,3.10419\n\t\t\t\t,-1.20857\n\t\t\t\t,6.99511\n\t\t\t\t,-1.88513\n\t\t\t\t,-1.14214\n\t\t\t\t,7.08937\n\t\t\t\t,3.10419\n\t\t\t\t,-1.20857\n\t\t\t\t,7.20442\n\t\t\t\t,3.10419\n\t\t\t\t,-1.14214\n\t\t\t\t,7.08937\n\t\t\t\t,3.10419\n\t\t\t\t,-1.14214\n\t\t\t\t,7.11017\n\t\t\t\t,-1.88513\n\t\t\t\t,-1.20857\n\t\t\t\t,7.22523\n\t\t\t\t,-1.88513\n\t\t\t\t,-1.34143\n\t\t\t\t,7.22523\n\t\t\t\t,-1.88513\n\t\t\t\t,-1.20857\n\t\t\t\t,7.20442\n\t\t\t\t,3.10419\n\t\t\t\t,-1.20857\n\t\t\t\t,7.22523\n\t\t\t\t,-1.88513\n\t\t\t\t,-1.34143\n\t\t\t\t,7.20442\n\t\t\t\t,3.10419\n\t\t\t\t,-1.40786\n\t\t\t\t,7.08937\n\t\t\t\t,3.10419\n\t\t\t\t,-1.34143\n\t\t\t\t,7.20442\n\t\t\t\t,3.10419\n\t\t\t\t,-1.34143\n\t\t\t\t,7.22523\n\t\t\t\t,-1.88513\n\t\t\t\t,-1.40786\n\t\t\t\t,7.11017\n\t\t\t\t,-1.88513\n\t\t\t\t,-2.52315\n\t\t\t\t,2.29555\n\t\t\t\t,-4.35369\n\t\t\t\t,-3.57579\n\t\t\t\t,1.65387\n\t\t\t\t,-4.08368\n\t\t\t\t,-2.52315\n\t\t\t\t,1.65387\n\t\t\t\t,-4.08368\n\t\t\t\t,-3.57579\n\t\t\t\t,2.29555\n\t\t\t\t,-4.35369\n\t\t\t\t,-3.57579\n\t\t\t\t,2.56134\n\t\t\t\t,-5.00556\n\t\t\t\t,-2.52315\n\t\t\t\t,2.56134\n\t\t\t\t,-5.00556\n\t\t\t\t,-2.52315\n\t\t\t\t,2.29555\n\t\t\t\t,-5.65742\n\t\t\t\t,-3.57579\n\t\t\t\t,2.29555\n\t\t\t\t,-5.65742\n\t\t\t\t,-3.57579\n\t\t\t\t,1.65387\n\t\t\t\t,-5.92743\n\t\t\t\t,-2.52315\n\t\t\t\t,1.65387\n\t\t\t\t,-5.92743\n\t\t\t\t,-2.52315\n\t\t\t\t,1.01219\n\t\t\t\t,-5.65742\n\t\t\t\t,-3.57579\n\t\t\t\t,1.01219\n\t\t\t\t,-5.65742\n\t\t\t\t,-3.57579\n\t\t\t\t,0.746398\n\t\t\t\t,-5.00556\n\t\t\t\t,-3.57579\n\t\t\t\t,1.01219\n\t\t\t\t,-5.65742\n\t\t\t\t,-2.52315\n\t\t\t\t,1.01219\n\t\t\t\t,-5.65742\n\t\t\t\t,-2.52315\n\t\t\t\t,0.746398\n\t\t\t\t,-5.00556\n\t\t\t\t,-2.52315\n\t\t\t\t,1.01219\n\t\t\t\t,-4.35369\n\t\t\t\t,-3.57579\n\t\t\t\t,1.01219\n\t\t\t\t,-4.35369\n\t\t\t\t,-1.64814\n\t\t\t\t,1.65387\n\t\t\t\t,-4.70739\n\t\t\t\t,-1.64814\n\t\t\t\t,1.8494\n\t\t\t\t,-4.79472\n\t\t\t\t,-1.64814\n\t\t\t\t,1.93039\n\t\t\t\t,-5.00556\n\t\t\t\t,-1.64814\n\t\t\t\t,1.8494\n\t\t\t\t,-5.2164\n\t\t\t\t,-1.64814\n\t\t\t\t,1.65387\n\t\t\t\t,-5.30373\n\t\t\t\t,-1.64814\n\t\t\t\t,1.45834\n\t\t\t\t,-5.2164\n\t\t\t\t,-1.64814\n\t\t\t\t,1.45834\n\t\t\t\t,-5.2164\n\t\t\t\t,-1.64814\n\t\t\t\t,1.37735\n\t\t\t\t,-5.00556\n\t\t\t\t,-1.64814\n\t\t\t\t,1.45834\n\t\t\t\t,-4.79472\n\t\t\t\t,0.00112091\n\t\t\t\t,1.65387\n\t\t\t\t,-4.70738\n\t\t\t\t,0.00112091\n\t\t\t\t,1.8494\n\t\t\t\t,-4.79472\n\t\t\t\t,0.00112091\n\t\t\t\t,1.93039\n\t\t\t\t,-5.00555\n\t\t\t\t,0.00112091\n\t\t\t\t,1.8494\n\t\t\t\t,-5.2164\n\t\t\t\t,0.00112091\n\t\t\t\t,1.65387\n\t\t\t\t,-5.30373\n\t\t\t\t,0.00112091\n\t\t\t\t,1.45834\n\t\t\t\t,-5.2164\n\t\t\t\t,-1.64814\n\t\t\t\t,1.37735\n\t\t\t\t,-5.00556\n\t\t\t\t,-1.64814\n\t\t\t\t,1.45834\n\t\t\t\t,-5.2164\n\t\t\t\t,0.00112091\n\t\t\t\t,1.45834\n\t\t\t\t,-5.2164\n\t\t\t\t,0.00112091\n\t\t\t\t,1.37735\n\t\t\t\t,-5.00555\n\t\t\t\t,0.00112091\n\t\t\t\t,1.45834\n\t\t\t\t,-5.2164\n\t\t\t\t,0.00112091\n\t\t\t\t,1.45834\n\t\t\t\t,-4.79472\n\t\t\t\t,-0.99375\n\t\t\t\t,1.11017\n\t\t\t\t,-5.91612\n\t\t\t\t,0.00112091\n\t\t\t\t,1.11017\n\t\t\t\t,-5.91612\n\t\t\t\t,0.00112091\n\t\t\t\t,1.11017\n\t\t\t\t,-4.09113\n\t\t\t\t,-1.49375\n\t\t\t\t,1.34941\n\t\t\t\t,-5.72404\n\t\t\t\t,-1.10089\n\t\t\t\t,1.22686\n\t\t\t\t,-5.91612\n\t\t\t\t,-1.1009\n\t\t\t\t,1.22686\n\t\t\t\t,-4.09113\n\t\t\t\t,0.00112091\n\t\t\t\t,3.47859\n\t\t\t\t,-4.09113\n\t\t\t\t,-0.99375\n\t\t\t\t,1.11017\n\t\t\t\t,-4.09113\n\t\t\t\t,-0.99375\n\t\t\t\t,2.22859\n\t\t\t\t,-4.09113\n\t\t\t\t,-1.1009\n\t\t\t\t,1.22686\n\t\t\t\t,-4.09113\n\t\t\t\t,-1.49375\n\t\t\t\t,2.10776\n\t\t\t\t,-4.28321\n\t\t\t\t,-1.49375\n\t\t\t\t,1.34941\n\t\t\t\t,-4.28321\n\t\t\t\t,-1.57708\n\t\t\t\t,3.47859\n\t\t\t\t,-4.09113\n\t\t\t\t,-1.10089\n\t\t\t\t,1.22686\n\t\t\t\t,-5.91612\n\t\t\t\t,-0.99375\n\t\t\t\t,1.11017\n\t\t\t\t,-4.09113\n\t\t\t\t,-0.99375\n\t\t\t\t,1.11017\n\t\t\t\t,-4.09113\n\t\t\t\t,-1.49375\n\t\t\t\t,1.34941\n\t\t\t\t,-4.28321\n\t\t\t\t,-1.49375\n\t\t\t\t,1.34941\n\t\t\t\t,-5.72404\n\t\t\t\t,-1.1009\n\t\t\t\t,1.22686\n\t\t\t\t,-4.09113\n\t\t\t\t,-1.49375\n\t\t\t\t,2.10776\n\t\t\t\t,-5.72404\n\t\t\t\t,-0.99375\n\t\t\t\t,2.22859\n\t\t\t\t,-5.91612\n\t\t\t\t,-1.49375\n\t\t\t\t,2.10776\n\t\t\t\t,-4.28321\n\t\t\t\t,-0.99375\n\t\t\t\t,2.22859\n\t\t\t\t,-4.09113\n\t\t\t\t,-1.57708\n\t\t\t\t,3.47859\n\t\t\t\t,-5.91612\n\t\t\t\t,-0.99375\n\t\t\t\t,2.22859\n\t\t\t\t,-5.91612\n\t\t\t\t,-0.99375\n\t\t\t\t,2.22859\n\t\t\t\t,-4.09113\n\t\t\t\t,-1.57708\n\t\t\t\t,3.47859\n\t\t\t\t,-4.09113\n\t\t\t\t,0.00112091\n\t\t\t\t,1.11017\n\t\t\t\t,-5.91612\n\t\t\t\t,-0.99375\n\t\t\t\t,1.11017\n\t\t\t\t,-5.91612\n\t\t\t\t,0.00112091\n\t\t\t\t,3.47859\n\t\t\t\t,-5.91612\n\t\t\t\t,-1.10089\n\t\t\t\t,1.22686\n\t\t\t\t,-5.91612\n\t\t\t\t,-0.99375\n\t\t\t\t,2.22859\n\t\t\t\t,-5.91612\n\t\t\t\t,-1.49375\n\t\t\t\t,1.34941\n\t\t\t\t,-5.72404\n\t\t\t\t,-1.49375\n\t\t\t\t,2.10776\n\t\t\t\t,-5.72404\n\t\t\t\t,-1.57708\n\t\t\t\t,3.47859\n\t\t\t\t,-5.91612\n\t\t\t\t,-1.92362\n\t\t\t\t,3.69856\n\t\t\t\t,8.10906\n\t\t\t\t,-2.06737\n\t\t\t\t,3.46628\n\t\t\t\t,7.95238\n\t\t\t\t,-1.77987\n\t\t\t\t,3.46628\n\t\t\t\t,7.95238\n\t\t\t\t,-2.21112\n\t\t\t\t,3.69856\n\t\t\t\t,8.10906\n\t\t\t\t,-2.35487\n\t\t\t\t,3.46628\n\t\t\t\t,7.95238\n\t\t\t\t,-2.21112\n\t\t\t\t,3.234\n\t\t\t\t,7.79569\n\t\t\t\t,-1.92362\n\t\t\t\t,3.234\n\t\t\t\t,7.79569\n\t\t\t\t,-1.92362\n\t\t\t\t,3.71327\n\t\t\t\t,5.25238\n\t\t\t\t,-1.77987\n\t\t\t\t,3.46628\n\t\t\t\t,7.95238\n\t\t\t\t,-1.77987\n\t\t\t\t,3.46429\n\t\t\t\t,5.25238\n\t\t\t\t,-1.92362\n\t\t\t\t,3.69856\n\t\t\t\t,8.10906\n\t\t\t\t,-2.21112\n\t\t\t\t,3.69856\n\t\t\t\t,8.10906\n\t\t\t\t,-2.21112\n\t\t\t\t,3.71327\n\t\t\t\t,5.25238\n\t\t\t\t,-2.35487\n\t\t\t\t,3.46429\n\t\t\t\t,5.25238\n\t\t\t\t,-2.35487\n\t\t\t\t,3.46628\n\t\t\t\t,7.95238\n\t\t\t\t,-2.21112\n\t\t\t\t,3.234\n\t\t\t\t,7.79569\n\t\t\t\t,-2.35487\n\t\t\t\t,3.46628\n\t\t\t\t,7.95238\n\t\t\t\t,-2.35487\n\t\t\t\t,3.46429\n\t\t\t\t,5.25238\n\t\t\t\t,-2.21112\n\t\t\t\t,3.2153\n\t\t\t\t,5.25238\n\t\t\t\t,-1.92362\n\t\t\t\t,3.2153\n\t\t\t\t,5.25238\n\t\t\t\t,-2.21112\n\t\t\t\t,3.234\n\t\t\t\t,7.79569\n\t\t\t\t,-1.92362\n\t\t\t\t,3.234\n\t\t\t\t,7.79569\n\t\t\t\t,-1.77987\n\t\t\t\t,3.46628\n\t\t\t\t,7.95238\n\t\t\t\t,-1.92362\n\t\t\t\t,3.234\n\t\t\t\t,7.79569\n\t\t\t\t,-1.77987\n\t\t\t\t,3.46429\n\t\t\t\t,5.25238\n\t\t\t\t,-0.752339\n\t\t\t\t,4.08592\n\t\t\t\t,-8.12664\n\t\t\t\t,-2.69656\n\t\t\t\t,3.52342\n\t\t\t\t,-8.12664\n\t\t\t\t,-2.70328\n\t\t\t\t,4.08592\n\t\t\t\t,-8.12664\n\t\t\t\t,-0.75906\n\t\t\t\t,3.52342\n\t\t\t\t,-8.12664\n\t\t\t\t,-2.70328\n\t\t\t\t,4.08592\n\t\t\t\t,-8.12664\n\t\t\t\t,-2.69656\n\t\t\t\t,3.52342\n\t\t\t\t,-6.18914\n\t\t\t\t,-2.69656\n\t\t\t\t,4.08592\n\t\t\t\t,-6.18914\n\t\t\t\t,-2.69656\n\t\t\t\t,3.52342\n\t\t\t\t,-8.12664\n\t\t\t\t,-0.75906\n\t\t\t\t,4.08592\n\t\t\t\t,-6.18914\n\t\t\t\t,-0.75906\n\t\t\t\t,3.52342\n\t\t\t\t,-8.12664\n\t\t\t\t,-0.752339\n\t\t\t\t,4.08592\n\t\t\t\t,-8.12664\n\t\t\t\t,-0.75906\n\t\t\t\t,3.52342\n\t\t\t\t,-6.18914\n\t\t\t\t,-2.70328\n\t\t\t\t,4.08592\n\t\t\t\t,-8.12664\n\t\t\t\t,-0.75906\n\t\t\t\t,4.08592\n\t\t\t\t,-6.18914\n\t\t\t\t,-0.752339\n\t\t\t\t,4.08592\n\t\t\t\t,-8.12664\n\t\t\t\t,-2.69656\n\t\t\t\t,4.08592\n\t\t\t\t,-6.18914\n\t\t\t\t,-2.69656\n\t\t\t\t,3.52342\n\t\t\t\t,-6.18914\n\t\t\t\t,-0.75906\n\t\t\t\t,3.52342\n\t\t\t\t,-8.12664\n\t\t\t\t,-0.75906\n\t\t\t\t,3.52342\n\t\t\t\t,-6.18914\n\t\t\t\t,-2.69656\n\t\t\t\t,3.52342\n\t\t\t\t,-8.12664\n\t\t\t\t,0\n\t\t\t\t,4.10615\n\t\t\t\t,7.89073\n\t\t\t\t,0\n\t\t\t\t,5.01498\n\t\t\t\t,8.02341\n\t\t\t\t,-2.53125\n\t\t\t\t,5.01497\n\t\t\t\t,7.64841\n\t\t\t\t,-2.53125\n\t\t\t\t,4.10616\n\t\t\t\t,7.51572\n\t\t\t\t,-3.15717\n\t\t\t\t,5.00932\n\t\t\t\t,7.64841\n\t\t\t\t,-3.15717\n\t\t\t\t,4.54371\n\t\t\t\t,7.51572\n\t\t\t\t,0.00112091\n\t\t\t\t,1.87534\n\t\t\t\t,-3.16136\n\t\t\t\t,0.00112091\n\t\t\t\t,1.87534\n\t\t\t\t,-2.97386\n\t\t\t\t,-2.53125\n\t\t\t\t,1.87535\n\t\t\t\t,-2.97386\n\t\t\t\t,-2.53125\n\t\t\t\t,1.87535\n\t\t\t\t,-3.16136\n\t\t\t\t,0.00112091\n\t\t\t\t,1.87534\n\t\t\t\t,0.0198903\n\t\t\t\t,-2.53125\n\t\t\t\t,1.87535\n\t\t\t\t,0.0198975\n\t\t\t\t,0.00112091\n\t\t\t\t,1.87534\n\t\t\t\t,2.51989\n\t\t\t\t,-2.53125\n\t\t\t\t,1.87535\n\t\t\t\t,2.5199\n\t\t\t\t,0.00112091\n\t\t\t\t,1.87534\n\t\t\t\t,-3.66136\n\t\t\t\t,-2.53125\n\t\t\t\t,1.87535\n\t\t\t\t,-3.66136\n\t\t\t\t,0.00112091\n\t\t\t\t,1.87534\n\t\t\t\t,-4.78636\n\t\t\t\t,-2.53125\n\t\t\t\t,1.87535\n\t\t\t\t,-4.78636\n\t\t\t\t,0.00112091\n\t\t\t\t,1.87534\n\t\t\t\t,-5.81761\n\t\t\t\t,-2.53125\n\t\t\t\t,1.87535\n\t\t\t\t,-5.81761\n\t\t\t\t,0.00112091\n\t\t\t\t,1.87534\n\t\t\t\t,-6.59886\n\t\t\t\t,-2.19301\n\t\t\t\t,1.87535\n\t\t\t\t,-6.59886\n\t\t\t\t,0.00112091\n\t\t\t\t,1.43397\n\t\t\t\t,-7.87386\n\t\t\t\t,-2.19301\n\t\t\t\t,1.43398\n\t\t\t\t,-7.37386\n\t\t\t\t,0.00112091\n\t\t\t\t,2.69243\n\t\t\t\t,3.46884\n\t\t\t\t,-2.53125\n\t\t\t\t,2.69243\n\t\t\t\t,3.46884\n\t\t\t\t,0.00112091\n\t\t\t\t,3.14684\n\t\t\t\t,6.12254\n\t\t\t\t,-2.53125\n\t\t\t\t,3.14684\n\t\t\t\t,6.12253\n\t\t\t\t,0\n\t\t\t\t,4.10615\n\t\t\t\t,7.89073\n\t\t\t\t,-2.53125\n\t\t\t\t,4.10616\n\t\t\t\t,7.51572\n\t\t\t\t,0.00112091\n\t\t\t\t,2.88189\n\t\t\t\t,-8.53681\n\t\t\t\t,0.00112091\n\t\t\t\t,1.87534\n\t\t\t\t,-8.2505\n\t\t\t\t,-2.19301\n\t\t\t\t,1.87535\n\t\t\t\t,-8.09261\n\t\t\t\t,-2.53125\n\t\t\t\t,2.8819\n\t\t\t\t,-8.37892\n\t\t\t\t,0.00112091\n\t\t\t\t,1.43397\n\t\t\t\t,-7.87386\n\t\t\t\t,-2.19301\n\t\t\t\t,1.43398\n\t\t\t\t,-7.37386\n\t\t\t\t,-4.38446\n\t\t\t\t,3.70921\n\t\t\t\t,-2.66136\n\t\t\t\t,-4.38446\n\t\t\t\t,3.73002\n\t\t\t\t,0.0210876\n\t\t\t\t,-4.38446\n\t\t\t\t,3.77171\n\t\t\t\t,-2.86449\n\t\t\t\t,-4.38446\n\t\t\t\t,3.58799\n\t\t\t\t,0.0198975\n\t\t\t\t,-4.38446\n\t\t\t\t,3.5599\n\t\t\t\t,2.5199\n\t\t\t\t,-4.38446\n\t\t\t\t,3.62965\n\t\t\t\t,2.49609\n\t\t\t\t,-4.38446\n\t\t\t\t,3.77516\n\t\t\t\t,-1.51582\n\t\t\t\t,-4.38446\n\t\t\t\t,3.97909\n\t\t\t\t,-3.66136\n\t\t\t\t,-4.38446\n\t\t\t\t,3.76748\n\t\t\t\t,1.66275\n\t\t\t\t,-4.38446\n\t\t\t\t,3.92503\n\t\t\t\t,-2.65868\n\t\t\t\t,-4.38446\n\t\t\t\t,4.33654\n\t\t\t\t,-4.2301\n\t\t\t\t,-4.38446\n\t\t\t\t,4.10062\n\t\t\t\t,-4.23081\n\t\t\t\t,-4.38446\n\t\t\t\t,4.12002\n\t\t\t\t,-5.87508\n\t\t\t\t,-4.38446\n\t\t\t\t,3.88531\n\t\t\t\t,-5.80244\n\t\t\t\t,-4.38446\n\t\t\t\t,3.23414\n\t\t\t\t,-6.69242\n\t\t\t\t,-4.38446\n\t\t\t\t,3.8866\n\t\t\t\t,2.41275\n\t\t\t\t,-4.38446\n\t\t\t\t,3.70337\n\t\t\t\t,3.46884\n\t\t\t\t,-4.38446\n\t\t\t\t,3.97501\n\t\t\t\t,4.53033\n\t\t\t\t,-4.38446\n\t\t\t\t,3.75227\n\t\t\t\t,6.12253\n\t\t\t\t,-4.38446\n\t\t\t\t,3.99131\n\t\t\t\t,6.12253\n\t\t\t\t,-4.38446\n\t\t\t\t,3.85549\n\t\t\t\t,7.51572\n\t\t\t\t,-4.38446\n\t\t\t\t,3.95328\n\t\t\t\t,7.64841\n\t\t\t\t,-4.38446\n\t\t\t\t,3.11302\n\t\t\t\t,-6.49854\n\t\t\t\t,-3.15717\n\t\t\t\t,3.40081\n\t\t\t\t,-3.16136\n\t\t\t\t,-3.15717\n\t\t\t\t,3.40081\n\t\t\t\t,-2.97386\n\t\t\t\t,-4.38446\n\t\t\t\t,3.70921\n\t\t\t\t,-2.66136\n\t\t\t\t,-4.38446\n\t\t\t\t,3.77171\n\t\t\t\t,-2.86449\n\t\t\t\t,-3.15717\n\t\t\t\t,3.40081\n\t\t\t\t,0.0198975\n\t\t\t\t,-4.38446\n\t\t\t\t,3.58799\n\t\t\t\t,0.0198975\n\t\t\t\t,-3.15717\n\t\t\t\t,3.40081\n\t\t\t\t,2.5199\n\t\t\t\t,-4.38446\n\t\t\t\t,3.5599\n\t\t\t\t,2.5199\n\t\t\t\t,-3.15717\n\t\t\t\t,3.40081\n\t\t\t\t,-3.66136\n\t\t\t\t,-4.38446\n\t\t\t\t,3.97909\n\t\t\t\t,-3.66136\n\t\t\t\t,-3.15717\n\t\t\t\t,4.33361\n\t\t\t\t,1.66275\n\t\t\t\t,-3.15717\n\t\t\t\t,4.37021\n\t\t\t\t,-1.51582\n\t\t\t\t,-4.38446\n\t\t\t\t,3.77516\n\t\t\t\t,-1.51582\n\t\t\t\t,-4.38446\n\t\t\t\t,3.76748\n\t\t\t\t,1.66275\n\t\t\t\t,-3.15717\n\t\t\t\t,5.08381\n\t\t\t\t,-2.65868\n\t\t\t\t,-4.38446\n\t\t\t\t,3.92503\n\t\t\t\t,-2.65868\n\t\t\t\t,-3.15717\n\t\t\t\t,3.40081\n\t\t\t\t,-4.78636\n\t\t\t\t,-4.38446\n\t\t\t\t,4.10062\n\t\t\t\t,-4.23081\n\t\t\t\t,-4.38446\n\t\t\t\t,4.33654\n\t\t\t\t,-4.2301\n\t\t\t\t,-3.15717\n\t\t\t\t,5.10278\n\t\t\t\t,-4.2301\n\t\t\t\t,-3.15717\n\t\t\t\t,3.40081\n\t\t\t\t,-5.81761\n\t\t\t\t,-4.38446\n\t\t\t\t,3.88531\n\t\t\t\t,-5.80244\n\t\t\t\t,-3.15717\n\t\t\t\t,4.95639\n\t\t\t\t,-5.87297\n\t\t\t\t,-4.38446\n\t\t\t\t,4.12002\n\t\t\t\t,-5.87508\n\t\t\t\t,-3.15717\n\t\t\t\t,4.34588\n\t\t\t\t,-7.05154\n\t\t\t\t,-3.15717\n\t\t\t\t,3.40081\n\t\t\t\t,-6.59886\n\t\t\t\t,-4.38446\n\t\t\t\t,3.11302\n\t\t\t\t,-6.49854\n\t\t\t\t,-4.38446\n\t\t\t\t,3.23414\n\t\t\t\t,-6.69242\n\t\t\t\t,-3.15717\n\t\t\t\t,2.79988\n\t\t\t\t,-8.23576\n\t\t\t\t,-3.77628\n\t\t\t\t,2.95636\n\t\t\t\t,-7.52037\n\t\t\t\t,-3.15717\n\t\t\t\t,3.17468\n\t\t\t\t,-7.37386\n\t\t\t\t,-3.77628\n\t\t\t\t,2.95636\n\t\t\t\t,-7.52037\n\t\t\t\t,-3.15717\n\t\t\t\t,5.59528\n\t\t\t\t,2.99608\n\t\t\t\t,-4.38446\n\t\t\t\t,3.8866\n\t\t\t\t,2.41275\n\t\t\t\t,-3.15717\n\t\t\t\t,3.81942\n\t\t\t\t,3.46884\n\t\t\t\t,-4.38446\n\t\t\t\t,3.70337\n\t\t\t\t,3.46884\n\t\t\t\t,-3.15717\n\t\t\t\t,5.80724\n\t\t\t\t,5.11367\n\t\t\t\t,-4.38446\n\t\t\t\t,3.97501\n\t\t\t\t,4.53033\n\t\t\t\t,-3.15717\n\t\t\t\t,4.05223\n\t\t\t\t,6.12253\n\t\t\t\t,-4.38446\n\t\t\t\t,3.75227\n\t\t\t\t,6.12253\n\t\t\t\t,-3.15717\n\t\t\t\t,5.88485\n\t\t\t\t,6.70586\n\t\t\t\t,-4.38446\n\t\t\t\t,3.99131\n\t\t\t\t,6.12253\n\t\t\t\t,-3.15717\n\t\t\t\t,4.54371\n\t\t\t\t,7.51572\n\t\t\t\t,-4.38446\n\t\t\t\t,3.85549\n\t\t\t\t,7.51572\n\t\t\t\t,-3.15717\n\t\t\t\t,5.00932\n\t\t\t\t,7.64841\n\t\t\t\t,-4.38446\n\t\t\t\t,3.95328\n\t\t\t\t,7.64841\n\t\t\t\t,-4.38446\n\t\t\t\t,3.95328\n\t\t\t\t,7.64841\n\t\t\t\t,-3.15717\n\t\t\t\t,5.00932\n\t\t\t\t,7.64841\n\t\t\t\t,-4.38446\n\t\t\t\t,3.95328\n\t\t\t\t,7.64841\n\t\t\t\t,-4.38446\n\t\t\t\t,3.11302\n\t\t\t\t,-6.49854\n\t\t\t\t,-4.38446\n\t\t\t\t,3.23414\n\t\t\t\t,-6.69242\n\t\t\t\t,-2.53125\n\t\t\t\t,1.87535\n\t\t\t\t,-3.16136\n\t\t\t\t,-2.53125\n\t\t\t\t,1.87535\n\t\t\t\t,-2.97386\n\t\t\t\t,-3.15717\n\t\t\t\t,3.40081\n\t\t\t\t,-2.97386\n\t\t\t\t,-3.15717\n\t\t\t\t,3.40081\n\t\t\t\t,-3.16136\n\t\t\t\t,-2.53125\n\t\t\t\t,1.87535\n\t\t\t\t,0.0198975\n\t\t\t\t,-3.15717\n\t\t\t\t,3.40081\n\t\t\t\t,0.0198975\n\t\t\t\t,-2.53125\n\t\t\t\t,1.87535\n\t\t\t\t,2.5199\n\t\t\t\t,-3.15717\n\t\t\t\t,3.40081\n\t\t\t\t,2.5199\n\t\t\t\t,-2.53125\n\t\t\t\t,1.87535\n\t\t\t\t,-3.66136\n\t\t\t\t,-3.15717\n\t\t\t\t,3.40081\n\t\t\t\t,-3.66136\n\t\t\t\t,-2.53125\n\t\t\t\t,1.87535\n\t\t\t\t,-4.78636\n\t\t\t\t,-3.15717\n\t\t\t\t,3.40081\n\t\t\t\t,-4.78636\n\t\t\t\t,-2.53125\n\t\t\t\t,1.87535\n\t\t\t\t,-5.81761\n\t\t\t\t,-3.15717\n\t\t\t\t,3.40081\n\t\t\t\t,-5.81761\n\t\t\t\t,-2.19301\n\t\t\t\t,1.87535\n\t\t\t\t,-6.59886\n\t\t\t\t,-3.15717\n\t\t\t\t,3.40081\n\t\t\t\t,-6.59886\n\t\t\t\t,-2.53125\n\t\t\t\t,2.8819\n\t\t\t\t,-8.37892\n\t\t\t\t,-2.19301\n\t\t\t\t,1.87535\n\t\t\t\t,-8.09261\n\t\t\t\t,-3.15717\n\t\t\t\t,2.79988\n\t\t\t\t,-8.23576\n\t\t\t\t,-2.19301\n\t\t\t\t,1.43398\n\t\t\t\t,-7.37386\n\t\t\t\t,-3.15717\n\t\t\t\t,3.17468\n\t\t\t\t,-7.37386\n\t\t\t\t,-2.19301\n\t\t\t\t,1.43398\n\t\t\t\t,-7.37386\n\t\t\t\t,-3.15717\n\t\t\t\t,2.79988\n\t\t\t\t,-8.23576\n\t\t\t\t,-2.19301\n\t\t\t\t,1.87535\n\t\t\t\t,-8.09261\n\t\t\t\t,-2.53125\n\t\t\t\t,2.69243\n\t\t\t\t,3.46884\n\t\t\t\t,-3.15717\n\t\t\t\t,3.81942\n\t\t\t\t,3.46884\n\t\t\t\t,-2.53125\n\t\t\t\t,3.14684\n\t\t\t\t,6.12253\n\t\t\t\t,-3.15717\n\t\t\t\t,4.05223\n\t\t\t\t,6.12253\n\t\t\t\t,-2.53125\n\t\t\t\t,4.10616\n\t\t\t\t,7.51572\n\t\t\t\t,-3.15717\n\t\t\t\t,4.54371\n\t\t\t\t,7.51572\n\t\t\t\t,0\n\t\t\t\t,4.93088\n\t\t\t\t,-6.07008\n\t\t\t\t,-2.53125\n\t\t\t\t,4.91165\n\t\t\t\t,-5.87297\n\t\t\t\t,-1.15459\n\t\t\t\t,5.34434\n\t\t\t\t,-5.98805\n\t\t\t\t,0\n\t\t\t\t,5.34434\n\t\t\t\t,-6.03739\n\t\t\t\t,0.00112091\n\t\t\t\t,5.21324\n\t\t\t\t,-2.65868\n\t\t\t\t,0\n\t\t\t\t,5.19737\n\t\t\t\t,-3.51761\n\t\t\t\t,-2.53125\n\t\t\t\t,5.19737\n\t\t\t\t,-4.2301\n\t\t\t\t,-2.53125\n\t\t\t\t,5.21324\n\t\t\t\t,-2.65868\n\t\t\t\t,0\n\t\t\t\t,5.4666\n\t\t\t\t,-3.7676\n\t\t\t\t,0\n\t\t\t\t,5.34434\n\t\t\t\t,-6.03739\n\t\t\t\t,-1.15459\n\t\t\t\t,5.34434\n\t\t\t\t,-5.98805\n\t\t\t\t,-1.15459\n\t\t\t\t,5.44737\n\t\t\t\t,-4.80095\n\t\t\t\t,0\n\t\t\t\t,4.93088\n\t\t\t\t,-6.07008\n\t\t\t\t,0.00112091\n\t\t\t\t,4.19737\n\t\t\t\t,-7.61404\n\t\t\t\t,-2.53125\n\t\t\t\t,4.19736\n\t\t\t\t,-7.05154\n\t\t\t\t,-2.53125\n\t\t\t\t,4.91165\n\t\t\t\t,-5.87297\n\t\t\t\t,0.00112091\n\t\t\t\t,2.88189\n\t\t\t\t,-8.53681\n\t\t\t\t,-2.53125\n\t\t\t\t,2.8819\n\t\t\t\t,-8.37892\n\t\t\t\t,-3.15717\n\t\t\t\t,5.10278\n\t\t\t\t,-4.2301\n\t\t\t\t,-3.15717\n\t\t\t\t,5.08381\n\t\t\t\t,-2.65868\n\t\t\t\t,-3.15717\n\t\t\t\t,4.95639\n\t\t\t\t,-5.87297\n\t\t\t\t,-3.15717\n\t\t\t\t,4.34588\n\t\t\t\t,-7.05154\n\t\t\t\t,-3.15717\n\t\t\t\t,2.79988\n\t\t\t\t,-8.23576\n\t\t\t\t,-3.15717\n\t\t\t\t,2.79988\n\t\t\t\t,-8.23576\n\t\t\t\t,0\n\t\t\t\t,5.19737\n\t\t\t\t,-3.51761\n\t\t\t\t,0\n\t\t\t\t,4.93088\n\t\t\t\t,-6.07008\n\t\t\t\t,0\n\t\t\t\t,5.34434\n\t\t\t\t,-6.03739\n\t\t\t\t,0\n\t\t\t\t,5.4666\n\t\t\t\t,-3.7676\n\t\t\t\t,0.00112091\n\t\t\t\t,3.74895\n\t\t\t\t,1.66275\n\t\t\t\t,0.00112091\n\t\t\t\t,3.82038\n\t\t\t\t,-1.92372\n\t\t\t\t,-2.53125\n\t\t\t\t,3.82039\n\t\t\t\t,-1.92372\n\t\t\t\t,-2.53125\n\t\t\t\t,3.74895\n\t\t\t\t,1.66275\n\t\t\t\t,0.00112091\n\t\t\t\t,5.21324\n\t\t\t\t,-2.65868\n\t\t\t\t,-2.53125\n\t\t\t\t,5.21324\n\t\t\t\t,-2.65868\n\t\t\t\t,0.00112091\n\t\t\t\t,5.55054\n\t\t\t\t,2.99608\n\t\t\t\t,-2.53125\n\t\t\t\t,5.55054\n\t\t\t\t,2.99608\n\t\t\t\t,-3.15717\n\t\t\t\t,4.37021\n\t\t\t\t,-1.51582\n\t\t\t\t,-3.15717\n\t\t\t\t,4.33361\n\t\t\t\t,1.66275\n\t\t\t\t,-3.15717\n\t\t\t\t,5.08381\n\t\t\t\t,-2.65868\n\t\t\t\t,-3.15717\n\t\t\t\t,5.08381\n\t\t\t\t,-2.65868\n\t\t\t\t,-3.15717\n\t\t\t\t,5.59528\n\t\t\t\t,2.99608\n\t\t\t\t,0.00112091\n\t\t\t\t,5.91138\n\t\t\t\t,5.11366\n\t\t\t\t,0.00112091\n\t\t\t\t,5.55054\n\t\t\t\t,2.99608\n\t\t\t\t,-2.53125\n\t\t\t\t,5.55054\n\t\t\t\t,2.99608\n\t\t\t\t,-2.53125\n\t\t\t\t,5.91138\n\t\t\t\t,5.11367\n\t\t\t\t,0\n\t\t\t\t,6.06285\n\t\t\t\t,6.70587\n\t\t\t\t,-2.53125\n\t\t\t\t,6.06285\n\t\t\t\t,6.70586\n\t\t\t\t,0\n\t\t\t\t,5.01498\n\t\t\t\t,8.02341\n\t\t\t\t,-2.53125\n\t\t\t\t,5.01497\n\t\t\t\t,7.64841\n\t\t\t\t,-3.15717\n\t\t\t\t,5.59528\n\t\t\t\t,2.99608\n\t\t\t\t,-3.15717\n\t\t\t\t,5.80724\n\t\t\t\t,5.11367\n\t\t\t\t,-3.15717\n\t\t\t\t,5.88485\n\t\t\t\t,6.70586\n\t\t\t\t,-3.15717\n\t\t\t\t,5.00932\n\t\t\t\t,7.64841\n\t\t\t\t,-3.86047\n\t\t\t\t,5.75026\n\t\t\t\t,6.82229\n\t\t\t\t,-4.1697\n\t\t\t\t,4.0473\n\t\t\t\t,6.9363\n\t\t\t\t,-3.28145\n\t\t\t\t,5.5256\n\t\t\t\t,6.9363\n\t\t\t\t,-4.63989\n\t\t\t\t,4.45308\n\t\t\t\t,6.82229\n\t\t\t\t,-3.86047\n\t\t\t\t,5.75026\n\t\t\t\t,5.8628\n\t\t\t\t,-4.63989\n\t\t\t\t,4.45308\n\t\t\t\t,6.82229\n\t\t\t\t,-3.86047\n\t\t\t\t,5.75026\n\t\t\t\t,6.82229\n\t\t\t\t,-4.63989\n\t\t\t\t,4.45308\n\t\t\t\t,5.8628\n\t\t\t\t,-3.28145\n\t\t\t\t,5.5256\n\t\t\t\t,5.7488\n\t\t\t\t,-4.63989\n\t\t\t\t,4.45308\n\t\t\t\t,5.8628\n\t\t\t\t,-3.86047\n\t\t\t\t,5.75026\n\t\t\t\t,5.8628\n\t\t\t\t,-4.1697\n\t\t\t\t,4.0473\n\t\t\t\t,5.7488\n\t\t\t\t,-4.63989\n\t\t\t\t,4.45308\n\t\t\t\t,5.8628\n\t\t\t\t,-3.86047\n\t\t\t\t,5.75026\n\t\t\t\t,5.8628\n\t\t\t\t,-3.28145\n\t\t\t\t,5.5256\n\t\t\t\t,6.9363\n\t\t\t\t,-3.28145\n\t\t\t\t,5.5256\n\t\t\t\t,5.7488\n\t\t\t\t,-3.86047\n\t\t\t\t,5.75026\n\t\t\t\t,6.82229\n\t\t\t\t,-4.63989\n\t\t\t\t,4.45308\n\t\t\t\t,6.82229\n\t\t\t\t,-4.1697\n\t\t\t\t,4.0473\n\t\t\t\t,5.7488\n\t\t\t\t,-4.1697\n\t\t\t\t,4.0473\n\t\t\t\t,6.9363\n\t\t\t\t,-4.63989\n\t\t\t\t,4.45308\n\t\t\t\t,5.8628\n\t\t\t\t,-2.92589\n\t\t\t\t,4.90294\n\t\t\t\t,-2.81899\n\t\t\t\t,-3.01518\n\t\t\t\t,6.20824\n\t\t\t\t,-2.33814\n\t\t\t\t,-3.01518\n\t\t\t\t,4.98901\n\t\t\t\t,-2.96243\n\t\t\t\t,-2.92589\n\t\t\t\t,6.12216\n\t\t\t\t,-2.19471\n\t\t\t\t,-2.74732\n\t\t\t\t,6.12216\n\t\t\t\t,-2.19471\n\t\t\t\t,-2.74732\n\t\t\t\t,4.90294\n\t\t\t\t,-2.81899\n\t\t\t\t,-2.65804\n\t\t\t\t,4.98901\n\t\t\t\t,-2.96243\n\t\t\t\t,-2.65804\n\t\t\t\t,6.20824\n\t\t\t\t,-2.33814\n\t\t\t\t,-2.74732\n\t\t\t\t,6.29431\n\t\t\t\t,-2.48157\n\t\t\t\t,-2.65804\n\t\t\t\t,6.20824\n\t\t\t\t,-2.33814\n\t\t\t\t,-2.65804\n\t\t\t\t,4.98901\n\t\t\t\t,-2.96243\n\t\t\t\t,-2.74732\n\t\t\t\t,5.07508\n\t\t\t\t,-3.10586\n\t\t\t\t,-2.92589\n\t\t\t\t,5.07508\n\t\t\t\t,-3.10586\n\t\t\t\t,-2.92589\n\t\t\t\t,6.29431\n\t\t\t\t,-2.48157\n\t\t\t\t,-3.01518\n\t\t\t\t,6.20824\n\t\t\t\t,-2.33814\n\t\t\t\t,-3.01518\n\t\t\t\t,4.98901\n\t\t\t\t,-2.96243\n\t\t\t\t,-2.77919\n\t\t\t\t,6.65258\n\t\t\t\t,-1.92312\n\t\t\t\t,-2.86501\n\t\t\t\t,6.76336\n\t\t\t\t,-2.0539\n\t\t\t\t,-2.60753\n\t\t\t\t,6.60316\n\t\t\t\t,-1.94843\n\t\t\t\t,-2.5217\n\t\t\t\t,6.66452\n\t\t\t\t,-2.10451\n\t\t\t\t,-2.60753\n\t\t\t\t,6.7753\n\t\t\t\t,-2.2353\n\t\t\t\t,-2.5217\n\t\t\t\t,6.66452\n\t\t\t\t,-2.10451\n\t\t\t\t,-2.77919\n\t\t\t\t,6.82473\n\t\t\t\t,-2.20999\n\t\t\t\t,-2.86501\n\t\t\t\t,6.76336\n\t\t\t\t,-2.0539\n\t\t\t\t,-2.55914\n\t\t\t\t,6.96189\n\t\t\t\t,-1.76474\n\t\t\t\t,-2.61412\n\t\t\t\t,7.1186\n\t\t\t\t,-1.87201\n\t\t\t\t,-2.44921\n\t\t\t\t,6.82061\n\t\t\t\t,-1.83709\n\t\t\t\t,-2.39421\n\t\t\t\t,6.83603\n\t\t\t\t,-2.01669\n\t\t\t\t,-2.44921\n\t\t\t\t,6.99275\n\t\t\t\t,-2.12395\n\t\t\t\t,-2.39421\n\t\t\t\t,6.83603\n\t\t\t\t,-2.01669\n\t\t\t\t,-2.55914\n\t\t\t\t,7.13404\n\t\t\t\t,-2.05161\n\t\t\t\t,-2.61412\n\t\t\t\t,7.1186\n\t\t\t\t,-1.87201\n\t\t\t\t,-2.28942\n\t\t\t\t,7.09457\n\t\t\t\t,-1.6968\n\t\t\t\t,-2.30647\n\t\t\t\t,7.26864\n\t\t\t\t,-1.79518\n\t\t\t\t,-2.25536\n\t\t\t\t,6.91858\n\t\t\t\t,-1.78692\n\t\t\t\t,-2.23831\n\t\t\t\t,6.91662\n\t\t\t\t,-1.97543\n\t\t\t\t,-2.25536\n\t\t\t\t,7.09073\n\t\t\t\t,-2.07379\n\t\t\t\t,-2.23831\n\t\t\t\t,6.91662\n\t\t\t\t,-1.97543\n\t\t\t\t,-2.28942\n\t\t\t\t,7.26672\n\t\t\t\t,-1.98367\n\t\t\t\t,-2.30647\n\t\t\t\t,7.26864\n\t\t\t\t,-1.79518\n\t\t\t\t,-1.98661\n\t\t\t\t,7.1238\n\t\t\t\t,-1.68184\n\t\t\t\t,-1.98661\n\t\t\t\t,7.29948\n\t\t\t\t,-1.77939\n\t\t\t\t,-1.98661\n\t\t\t\t,6.94453\n\t\t\t\t,-1.77363\n\t\t\t\t,-1.98661\n\t\t\t\t,6.94093\n\t\t\t\t,-1.96298\n\t\t\t\t,-1.98661\n\t\t\t\t,7.11667\n\t\t\t\t,-2.0605\n\t\t\t\t,-1.98661\n\t\t\t\t,6.94093\n\t\t\t\t,-1.96298\n\t\t\t\t,-1.98661\n\t\t\t\t,7.29594\n\t\t\t\t,-1.96871\n\t\t\t\t,-1.98661\n\t\t\t\t,7.29948\n\t\t\t\t,-1.77939\n\t\t\t\t,-1.98661\n\t\t\t\t,7.29948\n\t\t\t\t,-1.77939\n\t\t\t\t,-1.98661\n\t\t\t\t,7.1238\n\t\t\t\t,-1.68184\n\t\t\t\t,0.00112091\n\t\t\t\t,7.12382\n\t\t\t\t,-1.68183\n\t\t\t\t,0.00112091\n\t\t\t\t,7.29949\n\t\t\t\t,-1.77939\n\t\t\t\t,-1.98661\n\t\t\t\t,6.94453\n\t\t\t\t,-1.77363\n\t\t\t\t,0.00112091\n\t\t\t\t,6.94453\n\t\t\t\t,-1.77363\n\t\t\t\t,-1.98661\n\t\t\t\t,6.94093\n\t\t\t\t,-1.96298\n\t\t\t\t,0.00112091\n\t\t\t\t,6.94091\n\t\t\t\t,-1.96299\n\t\t\t\t,-1.98661\n\t\t\t\t,6.94093\n\t\t\t\t,-1.96298\n\t\t\t\t,-1.98661\n\t\t\t\t,7.11667\n\t\t\t\t,-2.0605\n\t\t\t\t,0.00112091\n\t\t\t\t,7.11668\n\t\t\t\t,-2.0605\n\t\t\t\t,0.00112091\n\t\t\t\t,6.94091\n\t\t\t\t,-1.96299\n\t\t\t\t,-1.98661\n\t\t\t\t,7.29594\n\t\t\t\t,-1.96871\n\t\t\t\t,0.00112091\n\t\t\t\t,7.29596\n\t\t\t\t,-1.9687\n\t\t\t\t,-1.98661\n\t\t\t\t,7.29948\n\t\t\t\t,-1.77939\n\t\t\t\t,0.00112091\n\t\t\t\t,7.29949\n\t\t\t\t,-1.77939\n\t\t\t\t,-1.24029\n\t\t\t\t,3.69856\n\t\t\t\t,8.10906\n\t\t\t\t,-1.38404\n\t\t\t\t,3.46628\n\t\t\t\t,7.95238\n\t\t\t\t,-1.09654\n\t\t\t\t,3.46628\n\t\t\t\t,7.95238\n\t\t\t\t,-1.52779\n\t\t\t\t,3.69856\n\t\t\t\t,8.10906\n\t\t\t\t,-1.67154\n\t\t\t\t,3.46628\n\t\t\t\t,7.95238\n\t\t\t\t,-1.52779\n\t\t\t\t,3.234\n\t\t\t\t,7.79569\n\t\t\t\t,-1.24029\n\t\t\t\t,3.234\n\t\t\t\t,7.79569\n\t\t\t\t,-1.24029\n\t\t\t\t,3.71327\n\t\t\t\t,5.25238\n\t\t\t\t,-1.09654\n\t\t\t\t,3.46628\n\t\t\t\t,7.95238\n\t\t\t\t,-1.09654\n\t\t\t\t,3.46429\n\t\t\t\t,5.25238\n\t\t\t\t,-1.24029\n\t\t\t\t,3.69856\n\t\t\t\t,8.10906\n\t\t\t\t,-1.52779\n\t\t\t\t,3.69856\n\t\t\t\t,8.10906\n\t\t\t\t,-1.52779\n\t\t\t\t,3.71327\n\t\t\t\t,5.25238\n\t\t\t\t,-1.67154\n\t\t\t\t,3.46429\n\t\t\t\t,5.25238\n\t\t\t\t,-1.67154\n\t\t\t\t,3.46628\n\t\t\t\t,7.95238\n\t\t\t\t,-1.52779\n\t\t\t\t,3.234\n\t\t\t\t,7.79569\n\t\t\t\t,-1.67154\n\t\t\t\t,3.46628\n\t\t\t\t,7.95238\n\t\t\t\t,-1.67154\n\t\t\t\t,3.46429\n\t\t\t\t,5.25238\n\t\t\t\t,-1.52779\n\t\t\t\t,3.2153\n\t\t\t\t,5.25238\n\t\t\t\t,-1.24029\n\t\t\t\t,3.2153\n\t\t\t\t,5.25238\n\t\t\t\t,-1.52779\n\t\t\t\t,3.234\n\t\t\t\t,7.79569\n\t\t\t\t,-1.24029\n\t\t\t\t,3.234\n\t\t\t\t,7.79569\n\t\t\t\t,-1.09654\n\t\t\t\t,3.46628\n\t\t\t\t,7.95238\n\t\t\t\t,-1.24029\n\t\t\t\t,3.234\n\t\t\t\t,7.79569\n\t\t\t\t,-1.09654\n\t\t\t\t,3.46429\n\t\t\t\t,5.25238\n\t\t\t\t,-0.99375\n\t\t\t\t,1.02193\n\t\t\t\t,4.13605\n\t\t\t\t,0.00112091\n\t\t\t\t,1.02193\n\t\t\t\t,4.13605\n\t\t\t\t,-1.49375\n\t\t\t\t,1.26118\n\t\t\t\t,4.3466\n\t\t\t\t,-1.10089\n\t\t\t\t,1.13863\n\t\t\t\t,4.13605\n\t\t\t\t,-1.1009\n\t\t\t\t,1.13863\n\t\t\t\t,6.13655\n\t\t\t\t,0.00112091\n\t\t\t\t,3.39035\n\t\t\t\t,6.13655\n\t\t\t\t,-0.99375\n\t\t\t\t,1.02193\n\t\t\t\t,6.13655\n\t\t\t\t,0\n\t\t\t\t,1.02193\n\t\t\t\t,6.13655\n\t\t\t\t,-0.99375\n\t\t\t\t,2.14035\n\t\t\t\t,6.13655\n\t\t\t\t,-1.1009\n\t\t\t\t,1.13863\n\t\t\t\t,6.13655\n\t\t\t\t,-1.49375\n\t\t\t\t,2.01953\n\t\t\t\t,5.926\n\t\t\t\t,-1.49375\n\t\t\t\t,1.26118\n\t\t\t\t,5.926\n\t\t\t\t,-1.57708\n\t\t\t\t,3.39035\n\t\t\t\t,6.13655\n\t\t\t\t,-1.10089\n\t\t\t\t,1.13863\n\t\t\t\t,4.13605\n\t\t\t\t,-0.99375\n\t\t\t\t,1.02193\n\t\t\t\t,6.13655\n\t\t\t\t,-0.99375\n\t\t\t\t,1.02193\n\t\t\t\t,6.13655\n\t\t\t\t,-1.49375\n\t\t\t\t,1.26118\n\t\t\t\t,5.926\n\t\t\t\t,-1.49375\n\t\t\t\t,1.26118\n\t\t\t\t,4.3466\n\t\t\t\t,-1.1009\n\t\t\t\t,1.13863\n\t\t\t\t,6.13655\n\t\t\t\t,-1.49375\n\t\t\t\t,2.01953\n\t\t\t\t,4.3466\n\t\t\t\t,-0.99375\n\t\t\t\t,2.14035\n\t\t\t\t,4.13605\n\t\t\t\t,-1.49375\n\t\t\t\t,2.01953\n\t\t\t\t,5.926\n\t\t\t\t,-0.99375\n\t\t\t\t,2.14035\n\t\t\t\t,6.13655\n\t\t\t\t,-1.57708\n\t\t\t\t,3.39035\n\t\t\t\t,3.46938\n\t\t\t\t,-0.99375\n\t\t\t\t,2.14035\n\t\t\t\t,4.13605\n\t\t\t\t,-0.99375\n\t\t\t\t,2.14035\n\t\t\t\t,6.13655\n\t\t\t\t,-1.57708\n\t\t\t\t,3.39035\n\t\t\t\t,6.13655\n\t\t\t\t,0.00112091\n\t\t\t\t,1.02193\n\t\t\t\t,4.13605\n\t\t\t\t,-0.99375\n\t\t\t\t,1.02193\n\t\t\t\t,4.13605\n\t\t\t\t,0.00112091\n\t\t\t\t,3.39035\n\t\t\t\t,3.46938\n\t\t\t\t,-1.10089\n\t\t\t\t,1.13863\n\t\t\t\t,4.13605\n\t\t\t\t,-0.99375\n\t\t\t\t,2.14035\n\t\t\t\t,4.13605\n\t\t\t\t,-1.49375\n\t\t\t\t,1.26118\n\t\t\t\t,4.3466\n\t\t\t\t,-1.49375\n\t\t\t\t,2.01953\n\t\t\t\t,4.3466\n\t\t\t\t,-1.57708\n\t\t\t\t,3.39035\n\t\t\t\t,3.46938\n\t\t\t\t,-2.52315\n\t\t\t\t,2.29555\n\t\t\t\t,6.2328\n\t\t\t\t,-3.57579\n\t\t\t\t,1.65387\n\t\t\t\t,6.50281\n\t\t\t\t,-2.52315\n\t\t\t\t,1.65387\n\t\t\t\t,6.50281\n\t\t\t\t,-3.57579\n\t\t\t\t,2.29555\n\t\t\t\t,6.2328\n\t\t\t\t,-3.57579\n\t\t\t\t,2.56134\n\t\t\t\t,5.58093\n\t\t\t\t,-2.52315\n\t\t\t\t,2.56134\n\t\t\t\t,5.58093\n\t\t\t\t,-2.52315\n\t\t\t\t,2.29555\n\t\t\t\t,4.92907\n\t\t\t\t,-3.57579\n\t\t\t\t,2.29555\n\t\t\t\t,4.92907\n\t\t\t\t,-3.57579\n\t\t\t\t,1.65387\n\t\t\t\t,4.65906\n\t\t\t\t,-2.52315\n\t\t\t\t,1.65387\n\t\t\t\t,4.65906\n\t\t\t\t,-2.52315\n\t\t\t\t,1.01219\n\t\t\t\t,4.92907\n\t\t\t\t,-3.57579\n\t\t\t\t,1.01219\n\t\t\t\t,4.92907\n\t\t\t\t,-3.57579\n\t\t\t\t,0.746398\n\t\t\t\t,5.58093\n\t\t\t\t,-3.57579\n\t\t\t\t,1.01219\n\t\t\t\t,4.92907\n\t\t\t\t,-2.52315\n\t\t\t\t,1.01219\n\t\t\t\t,4.92907\n\t\t\t\t,-2.52315\n\t\t\t\t,0.746398\n\t\t\t\t,5.58093\n\t\t\t\t,-2.52315\n\t\t\t\t,1.01219\n\t\t\t\t,6.2328\n\t\t\t\t,-3.57579\n\t\t\t\t,1.01219\n\t\t\t\t,6.2328\n\t\t\t\t,-1.64814\n\t\t\t\t,1.65387\n\t\t\t\t,5.8791\n\t\t\t\t,-1.64814\n\t\t\t\t,1.8494\n\t\t\t\t,5.79177\n\t\t\t\t,-1.64814\n\t\t\t\t,1.93039\n\t\t\t\t,5.58093\n\t\t\t\t,-1.64814\n\t\t\t\t,1.8494\n\t\t\t\t,5.37009\n\t\t\t\t,-1.64814\n\t\t\t\t,1.65387\n\t\t\t\t,5.28276\n\t\t\t\t,-1.64814\n\t\t\t\t,1.45834\n\t\t\t\t,5.37009\n\t\t\t\t,-1.64814\n\t\t\t\t,1.45834\n\t\t\t\t,5.37009\n\t\t\t\t,-1.64814\n\t\t\t\t,1.37735\n\t\t\t\t,5.58093\n\t\t\t\t,-1.64814\n\t\t\t\t,1.45834\n\t\t\t\t,5.79177\n\t\t\t\t,0.00112091\n\t\t\t\t,1.65387\n\t\t\t\t,5.87911\n\t\t\t\t,0.00112091\n\t\t\t\t,1.8494\n\t\t\t\t,5.79177\n\t\t\t\t,0.00112091\n\t\t\t\t,1.93039\n\t\t\t\t,5.58094\n\t\t\t\t,0.00112091\n\t\t\t\t,1.8494\n\t\t\t\t,5.37009\n\t\t\t\t,0.00112091\n\t\t\t\t,1.65387\n\t\t\t\t,5.28276\n\t\t\t\t,0.00112091\n\t\t\t\t,1.45834\n\t\t\t\t,5.37009\n\t\t\t\t,-1.64814\n\t\t\t\t,1.37735\n\t\t\t\t,5.58093\n\t\t\t\t,-1.64814\n\t\t\t\t,1.45834\n\t\t\t\t,5.37009\n\t\t\t\t,0.00112091\n\t\t\t\t,1.45834\n\t\t\t\t,5.37009\n\t\t\t\t,0.00112091\n\t\t\t\t,1.37735\n\t\t\t\t,5.58094\n\t\t\t\t,0.00112091\n\t\t\t\t,1.45834\n\t\t\t\t,5.37009\n\t\t\t\t,0.00112091\n\t\t\t\t,1.45834\n\t\t\t\t,5.79177\n\t\t\t\t,1.26855\n\t\t\t\t,7.62908\n\t\t\t\t,-1.86968\n\t\t\t\t,1.26855\n\t\t\t\t,7.1118\n\t\t\t\t,-1.86968\n\t\t\t\t,2.12297\n\t\t\t\t,7.62908\n\t\t\t\t,-1.86968\n\t\t\t\t,2.12297\n\t\t\t\t,7.1118\n\t\t\t\t,-1.86968\n\t\t\t\t,2.12297\n\t\t\t\t,7.62908\n\t\t\t\t,-1.86968\n\t\t\t\t,2.12297\n\t\t\t\t,7.1118\n\t\t\t\t,-1.86968\n\t\t\t\t,2.12297\n\t\t\t\t,7.62908\n\t\t\t\t,-2.17578\n\t\t\t\t,2.12297\n\t\t\t\t,7.1118\n\t\t\t\t,-2.17578\n\t\t\t\t,1.26855\n\t\t\t\t,7.62908\n\t\t\t\t,-2.17578\n\t\t\t\t,1.26855\n\t\t\t\t,7.1118\n\t\t\t\t,-2.17578\n\t\t\t\t,1.26855\n\t\t\t\t,7.62908\n\t\t\t\t,-1.86968\n\t\t\t\t,1.26855\n\t\t\t\t,7.1118\n\t\t\t\t,-1.86968\n\t\t\t\t,0.205712\n\t\t\t\t,7.62908\n\t\t\t\t,-1.86968\n\t\t\t\t,0.205712\n\t\t\t\t,7.1118\n\t\t\t\t,-1.86968\n\t\t\t\t,1.06013\n\t\t\t\t,7.62908\n\t\t\t\t,-1.86968\n\t\t\t\t,1.06013\n\t\t\t\t,7.1118\n\t\t\t\t,-1.86968\n\t\t\t\t,1.06013\n\t\t\t\t,7.62908\n\t\t\t\t,-1.86968\n\t\t\t\t,1.06013\n\t\t\t\t,7.1118\n\t\t\t\t,-1.86968\n\t\t\t\t,1.06013\n\t\t\t\t,7.62908\n\t\t\t\t,-2.17578\n\t\t\t\t,1.06013\n\t\t\t\t,7.1118\n\t\t\t\t,-2.17578\n\t\t\t\t,0.205712\n\t\t\t\t,7.62908\n\t\t\t\t,-2.17578\n\t\t\t\t,0.205712\n\t\t\t\t,7.1118\n\t\t\t\t,-2.17578\n\t\t\t\t,0.205712\n\t\t\t\t,7.62908\n\t\t\t\t,-1.86968\n\t\t\t\t,0.205712\n\t\t\t\t,7.1118\n\t\t\t\t,-1.86968\n\t\t\t\t,-2.12297\n\t\t\t\t,7.62908\n\t\t\t\t,-1.86968\n\t\t\t\t,-1.26855\n\t\t\t\t,7.1118\n\t\t\t\t,-1.86968\n\t\t\t\t,-1.26855\n\t\t\t\t,7.62908\n\t\t\t\t,-1.86968\n\t\t\t\t,-2.12297\n\t\t\t\t,7.1118\n\t\t\t\t,-1.86968\n\t\t\t\t,-2.12297\n\t\t\t\t,7.62908\n\t\t\t\t,-2.17578\n\t\t\t\t,-2.12297\n\t\t\t\t,7.1118\n\t\t\t\t,-1.86968\n\t\t\t\t,-2.12297\n\t\t\t\t,7.62908\n\t\t\t\t,-1.86968\n\t\t\t\t,-2.12297\n\t\t\t\t,7.1118\n\t\t\t\t,-2.17578\n\t\t\t\t,-1.26855\n\t\t\t\t,7.62908\n\t\t\t\t,-2.17578\n\t\t\t\t,-1.26855\n\t\t\t\t,7.1118\n\t\t\t\t,-2.17578\n\t\t\t\t,-1.26855\n\t\t\t\t,7.62908\n\t\t\t\t,-1.86968\n\t\t\t\t,-1.26855\n\t\t\t\t,7.1118\n\t\t\t\t,-1.86968\n\t\t\t\t,-1.06013\n\t\t\t\t,7.62908\n\t\t\t\t,-1.86968\n\t\t\t\t,-0.205712\n\t\t\t\t,7.1118\n\t\t\t\t,-1.86968\n\t\t\t\t,-0.205712\n\t\t\t\t,7.62908\n\t\t\t\t,-1.86968\n\t\t\t\t,-1.06013\n\t\t\t\t,7.1118\n\t\t\t\t,-1.86968\n\t\t\t\t,-1.06013\n\t\t\t\t,7.62908\n\t\t\t\t,-2.17578\n\t\t\t\t,-1.06013\n\t\t\t\t,7.1118\n\t\t\t\t,-1.86968\n\t\t\t\t,-1.06013\n\t\t\t\t,7.62908\n\t\t\t\t,-1.86968\n\t\t\t\t,-1.06013\n\t\t\t\t,7.1118\n\t\t\t\t,-2.17578\n\t\t\t\t,-0.205712\n\t\t\t\t,7.62908\n\t\t\t\t,-2.17578\n\t\t\t\t,-0.205712\n\t\t\t\t,7.1118\n\t\t\t\t,-2.17578\n\t\t\t\t,-0.205712\n\t\t\t\t,7.62908\n\t\t\t\t,-1.86968\n\t\t\t\t,-0.205712\n\t\t\t\t,7.1118\n\t\t\t\t,-1.86968\n\t\t\t\t,1.83513\n\t\t\t\t,4.90408\n\t\t\t\t,7.7169\n\t\t\t\t,0.980712\n\t\t\t\t,4.3868\n\t\t\t\t,7.7169\n\t\t\t\t,0.980712\n\t\t\t\t,4.90408\n\t\t\t\t,7.7169\n\t\t\t\t,1.83513\n\t\t\t\t,4.3868\n\t\t\t\t,7.7169\n\t\t\t\t,1.83513\n\t\t\t\t,4.90408\n\t\t\t\t,8.023\n\t\t\t\t,1.83513\n\t\t\t\t,4.3868\n\t\t\t\t,7.7169\n\t\t\t\t,1.83513\n\t\t\t\t,4.90408\n\t\t\t\t,7.7169\n\t\t\t\t,1.83513\n\t\t\t\t,4.3868\n\t\t\t\t,8.023\n\t\t\t\t,0.980712\n\t\t\t\t,4.90408\n\t\t\t\t,8.023\n\t\t\t\t,0.980712\n\t\t\t\t,4.3868\n\t\t\t\t,8.023\n\t\t\t\t,0.980712\n\t\t\t\t,4.90408\n\t\t\t\t,7.7169\n\t\t\t\t,0.980712\n\t\t\t\t,4.3868\n\t\t\t\t,7.7169\n\t\t\t\t,-0.980712\n\t\t\t\t,4.90408\n\t\t\t\t,7.7169\n\t\t\t\t,-0.980712\n\t\t\t\t,4.3868\n\t\t\t\t,7.7169\n\t\t\t\t,-1.83513\n\t\t\t\t,4.90408\n\t\t\t\t,7.7169\n\t\t\t\t,-1.83513\n\t\t\t\t,4.3868\n\t\t\t\t,7.7169\n\t\t\t\t,-1.83513\n\t\t\t\t,4.90408\n\t\t\t\t,7.7169\n\t\t\t\t,-1.83513\n\t\t\t\t,4.3868\n\t\t\t\t,7.7169\n\t\t\t\t,-1.83513\n\t\t\t\t,4.90408\n\t\t\t\t,8.023\n\t\t\t\t,-1.83513\n\t\t\t\t,4.3868\n\t\t\t\t,8.023\n\t\t\t\t,-0.980712\n\t\t\t\t,4.90408\n\t\t\t\t,8.023\n\t\t\t\t,-0.980712\n\t\t\t\t,4.3868\n\t\t\t\t,8.023\n\t\t\t\t,-0.980712\n\t\t\t\t,4.90408\n\t\t\t\t,7.7169\n\t\t\t\t,-0.980712\n\t\t\t\t,4.3868\n\t\t\t\t,7.7169\n\t\t\t\t,5.3674\n\t\t\t\t,2.79918\n\t\t\t\t,-5\n\t\t\t\t,5.3674\n\t\t\t\t,2.71248\n\t\t\t\t,-4.5641\n\t\t\t\t,5.3674\n\t\t\t\t,1.66012\n\t\t\t\t,-5\n\t\t\t\t,3.33216\n\t\t\t\t,2.92574\n\t\t\t\t,-5\n\t\t\t\t,3.33216\n\t\t\t\t,1.66012\n\t\t\t\t,-5\n\t\t\t\t,3.33216\n\t\t\t\t,2.8294\n\t\t\t\t,-4.51567\n\t\t\t\t,5.52924\n\t\t\t\t,2.92574\n\t\t\t\t,-5\n\t\t\t\t,5.26276\n\t\t\t\t,3.17887\n\t\t\t\t,-5\n\t\t\t\t,5.26276\n\t\t\t\t,3.06326\n\t\t\t\t,-4.4188\n\t\t\t\t,5.52924\n\t\t\t\t,2.8294\n\t\t\t\t,-4.51567\n\t\t\t\t,3.59863\n\t\t\t\t,3.17887\n\t\t\t\t,-5\n\t\t\t\t,3.59863\n\t\t\t\t,3.06326\n\t\t\t\t,-4.4188\n\t\t\t\t,5.3674\n\t\t\t\t,2.46556\n\t\t\t\t,-4.19456\n\t\t\t\t,3.33216\n\t\t\t\t,2.55505\n\t\t\t\t,-4.10507\n\t\t\t\t,5.52924\n\t\t\t\t,2.55505\n\t\t\t\t,-4.10507\n\t\t\t\t,5.26276\n\t\t\t\t,2.73404\n\t\t\t\t,-3.92608\n\t\t\t\t,3.59863\n\t\t\t\t,2.73404\n\t\t\t\t,-3.92608\n\t\t\t\t,5.3674\n\t\t\t\t,2.09602\n\t\t\t\t,-3.94765\n\t\t\t\t,3.33216\n\t\t\t\t,2.14445\n\t\t\t\t,-3.83072\n\t\t\t\t,5.26276\n\t\t\t\t,2.24132\n\t\t\t\t,-3.59686\n\t\t\t\t,5.52924\n\t\t\t\t,2.14445\n\t\t\t\t,-3.83072\n\t\t\t\t,3.59863\n\t\t\t\t,2.24132\n\t\t\t\t,-3.59686\n\t\t\t\t,5.3674\n\t\t\t\t,1.66012\n\t\t\t\t,-3.86094\n\t\t\t\t,3.33216\n\t\t\t\t,1.66012\n\t\t\t\t,-3.73438\n\t\t\t\t,5.52924\n\t\t\t\t,1.66012\n\t\t\t\t,-3.73438\n\t\t\t\t,5.26276\n\t\t\t\t,1.66012\n\t\t\t\t,-3.48125\n\t\t\t\t,3.59863\n\t\t\t\t,1.66012\n\t\t\t\t,-3.48125\n\t\t\t\t,5.3674\n\t\t\t\t,1.22421\n\t\t\t\t,-3.94765\n\t\t\t\t,3.33216\n\t\t\t\t,1.17579\n\t\t\t\t,-3.83072\n\t\t\t\t,5.26276\n\t\t\t\t,1.07892\n\t\t\t\t,-3.59686\n\t\t\t\t,5.52924\n\t\t\t\t,1.17579\n\t\t\t\t,-3.83072\n\t\t\t\t,3.59863\n\t\t\t\t,1.07892\n\t\t\t\t,-3.59686\n\t\t\t\t,5.3674\n\t\t\t\t,0.854673\n\t\t\t\t,-4.19456\n\t\t\t\t,3.33216\n\t\t\t\t,0.765187\n\t\t\t\t,-4.10507\n\t\t\t\t,5.52924\n\t\t\t\t,0.765187\n\t\t\t\t,-4.10507\n\t\t\t\t,5.26276\n\t\t\t\t,0.586201\n\t\t\t\t,-3.92608\n\t\t\t\t,3.59863\n\t\t\t\t,0.586201\n\t\t\t\t,-3.92608\n\t\t\t\t,5.3674\n\t\t\t\t,0.607756\n\t\t\t\t,-4.5641\n\t\t\t\t,3.33216\n\t\t\t\t,0.490834\n\t\t\t\t,-4.51567\n\t\t\t\t,5.26276\n\t\t\t\t,0.256977\n\t\t\t\t,-4.4188\n\t\t\t\t,5.52924\n\t\t\t\t,0.490834\n\t\t\t\t,-4.51567\n\t\t\t\t,3.59863\n\t\t\t\t,0.256977\n\t\t\t\t,-4.4188\n\t\t\t\t,5.3674\n\t\t\t\t,0.52106\n\t\t\t\t,-5\n\t\t\t\t,3.33216\n\t\t\t\t,0.394494\n\t\t\t\t,-5\n\t\t\t\t,5.52924\n\t\t\t\t,0.394494\n\t\t\t\t,-5\n\t\t\t\t,5.26276\n\t\t\t\t,0.141369\n\t\t\t\t,-5\n\t\t\t\t,3.59863\n\t\t\t\t,0.141369\n\t\t\t\t,-5\n\t\t\t\t,5.3674\n\t\t\t\t,0.607756\n\t\t\t\t,-5.4359\n\t\t\t\t,3.33216\n\t\t\t\t,0.490834\n\t\t\t\t,-5.48433\n\t\t\t\t,5.26276\n\t\t\t\t,0.256977\n\t\t\t\t,-5.5812\n\t\t\t\t,5.52924\n\t\t\t\t,0.490834\n\t\t\t\t,-5.48433\n\t\t\t\t,3.59863\n\t\t\t\t,0.256977\n\t\t\t\t,-5.5812\n\t\t\t\t,5.3674\n\t\t\t\t,0.854673\n\t\t\t\t,-5.80544\n\t\t\t\t,3.33216\n\t\t\t\t,0.765187\n\t\t\t\t,-5.89493\n\t\t\t\t,5.52924\n\t\t\t\t,0.765187\n\t\t\t\t,-5.89493\n\t\t\t\t,5.26276\n\t\t\t\t,0.586201\n\t\t\t\t,-6.07392\n\t\t\t\t,3.59863\n\t\t\t\t,0.586201\n\t\t\t\t,-6.07392\n\t\t\t\t,5.3674\n\t\t\t\t,1.22421\n\t\t\t\t,-6.05235\n\t\t\t\t,3.33216\n\t\t\t\t,1.17579\n\t\t\t\t,-6.16928\n\t\t\t\t,5.26276\n\t\t\t\t,1.07892\n\t\t\t\t,-6.40314\n\t\t\t\t,5.52924\n\t\t\t\t,1.17579\n\t\t\t\t,-6.16928\n\t\t\t\t,3.59863\n\t\t\t\t,1.07892\n\t\t\t\t,-6.40314\n\t\t\t\t,5.3674\n\t\t\t\t,1.66012\n\t\t\t\t,-6.13906\n\t\t\t\t,3.33216\n\t\t\t\t,1.66012\n\t\t\t\t,-6.26563\n\t\t\t\t,5.52924\n\t\t\t\t,1.66012\n\t\t\t\t,-6.26563\n\t\t\t\t,5.26276\n\t\t\t\t,1.66012\n\t\t\t\t,-6.51875\n\t\t\t\t,3.59863\n\t\t\t\t,1.66012\n\t\t\t\t,-6.51875\n\t\t\t\t,5.3674\n\t\t\t\t,2.09602\n\t\t\t\t,-6.05235\n\t\t\t\t,3.33216\n\t\t\t\t,2.14445\n\t\t\t\t,-6.16928\n\t\t\t\t,5.26276\n\t\t\t\t,2.24132\n\t\t\t\t,-6.40314\n\t\t\t\t,5.52924\n\t\t\t\t,2.14445\n\t\t\t\t,-6.16928\n\t\t\t\t,3.59863\n\t\t\t\t,2.24132\n\t\t\t\t,-6.40314\n\t\t\t\t,5.3674\n\t\t\t\t,2.46556\n\t\t\t\t,-5.80544\n\t\t\t\t,3.33216\n\t\t\t\t,2.55505\n\t\t\t\t,-5.89493\n\t\t\t\t,5.52924\n\t\t\t\t,2.55505\n\t\t\t\t,-5.89493\n\t\t\t\t,5.26276\n\t\t\t\t,2.73404\n\t\t\t\t,-6.07392\n\t\t\t\t,3.59863\n\t\t\t\t,2.73404\n\t\t\t\t,-6.07392\n\t\t\t\t,5.3674\n\t\t\t\t,2.71248\n\t\t\t\t,-5.4359\n\t\t\t\t,3.33216\n\t\t\t\t,2.8294\n\t\t\t\t,-5.48433\n\t\t\t\t,5.26276\n\t\t\t\t,3.06326\n\t\t\t\t,-5.5812\n\t\t\t\t,5.52924\n\t\t\t\t,2.8294\n\t\t\t\t,-5.48433\n\t\t\t\t,3.59863\n\t\t\t\t,3.06326\n\t\t\t\t,-5.5812\n\t\t\t\t,5.26276\n\t\t\t\t,3.17887\n\t\t\t\t,-5\n\t\t\t\t,4.4307\n\t\t\t\t,3.33074\n\t\t\t\t,-5\n\t\t\t\t,5.26276\n\t\t\t\t,3.06326\n\t\t\t\t,-4.4188\n\t\t\t\t,4.4307\n\t\t\t\t,3.20358\n\t\t\t\t,-4.36068\n\t\t\t\t,4.4307\n\t\t\t\t,3.33074\n\t\t\t\t,-5\n\t\t\t\t,3.59863\n\t\t\t\t,3.17887\n\t\t\t\t,-5\n\t\t\t\t,3.59863\n\t\t\t\t,3.06326\n\t\t\t\t,-4.4188\n\t\t\t\t,4.4307\n\t\t\t\t,3.20358\n\t\t\t\t,-4.36068\n\t\t\t\t,5.26276\n\t\t\t\t,3.06326\n\t\t\t\t,-4.4188\n\t\t\t\t,4.4307\n\t\t\t\t,3.20358\n\t\t\t\t,-4.36068\n\t\t\t\t,4.4307\n\t\t\t\t,2.84143\n\t\t\t\t,-3.81869\n\t\t\t\t,5.26276\n\t\t\t\t,2.73404\n\t\t\t\t,-3.92608\n\t\t\t\t,4.4307\n\t\t\t\t,3.20358\n\t\t\t\t,-4.36068\n\t\t\t\t,3.59863\n\t\t\t\t,3.06326\n\t\t\t\t,-4.4188\n\t\t\t\t,4.4307\n\t\t\t\t,2.84143\n\t\t\t\t,-3.81869\n\t\t\t\t,3.59863\n\t\t\t\t,2.73404\n\t\t\t\t,-3.92608\n\t\t\t\t,5.26276\n\t\t\t\t,2.73404\n\t\t\t\t,-3.92608\n\t\t\t\t,4.4307\n\t\t\t\t,2.84143\n\t\t\t\t,-3.81869\n\t\t\t\t,5.26276\n\t\t\t\t,2.24132\n\t\t\t\t,-3.59686\n\t\t\t\t,4.4307\n\t\t\t\t,2.29944\n\t\t\t\t,-3.45654\n\t\t\t\t,4.4307\n\t\t\t\t,2.84143\n\t\t\t\t,-3.81869\n\t\t\t\t,3.59863\n\t\t\t\t,2.73404\n\t\t\t\t,-3.92608\n\t\t\t\t,3.59863\n\t\t\t\t,2.24132\n\t\t\t\t,-3.59686\n\t\t\t\t,4.4307\n\t\t\t\t,2.29944\n\t\t\t\t,-3.45654\n\t\t\t\t,5.26276\n\t\t\t\t,2.24132\n\t\t\t\t,-3.59686\n\t\t\t\t,4.4307\n\t\t\t\t,2.29944\n\t\t\t\t,-3.45654\n\t\t\t\t,4.4307\n\t\t\t\t,1.66012\n\t\t\t\t,-3.32937\n\t\t\t\t,5.26276\n\t\t\t\t,1.66012\n\t\t\t\t,-3.48125\n\t\t\t\t,4.4307\n\t\t\t\t,2.29944\n\t\t\t\t,-3.45654\n\t\t\t\t,3.59863\n\t\t\t\t,2.24132\n\t\t\t\t,-3.59686\n\t\t\t\t,4.4307\n\t\t\t\t,1.66012\n\t\t\t\t,-3.32937\n\t\t\t\t,3.59863\n\t\t\t\t,1.66012\n\t\t\t\t,-3.48125\n\t\t\t\t,5.26276\n\t\t\t\t,1.66012\n\t\t\t\t,-3.48125\n\t\t\t\t,4.4307\n\t\t\t\t,1.66012\n\t\t\t\t,-3.32937\n\t\t\t\t,5.26276\n\t\t\t\t,1.07892\n\t\t\t\t,-3.59686\n\t\t\t\t,4.4307\n\t\t\t\t,1.0208\n\t\t\t\t,-3.45654\n\t\t\t\t,4.4307\n\t\t\t\t,1.66012\n\t\t\t\t,-3.32937\n\t\t\t\t,3.59863\n\t\t\t\t,1.66012\n\t\t\t\t,-3.48125\n\t\t\t\t,3.59863\n\t\t\t\t,1.07892\n\t\t\t\t,-3.59686\n\t\t\t\t,4.4307\n\t\t\t\t,1.0208\n\t\t\t\t,-3.45654\n\t\t\t\t,5.26276\n\t\t\t\t,1.07892\n\t\t\t\t,-3.59686\n\t\t\t\t,4.4307\n\t\t\t\t,1.0208\n\t\t\t\t,-3.45654\n\t\t\t\t,4.4307\n\t\t\t\t,0.478809\n\t\t\t\t,-3.81869\n\t\t\t\t,5.26276\n\t\t\t\t,0.586201\n\t\t\t\t,-3.92608\n\t\t\t\t,4.4307\n\t\t\t\t,1.0208\n\t\t\t\t,-3.45654\n\t\t\t\t,3.59863\n\t\t\t\t,1.07892\n\t\t\t\t,-3.59686\n\t\t\t\t,4.4307\n\t\t\t\t,0.478809\n\t\t\t\t,-3.81869\n\t\t\t\t,3.59863\n\t\t\t\t,0.586201\n\t\t\t\t,-3.92608\n\t\t\t\t,5.26276\n\t\t\t\t,0.586201\n\t\t\t\t,-3.92608\n\t\t\t\t,4.4307\n\t\t\t\t,0.478809\n\t\t\t\t,-3.81869\n\t\t\t\t,5.26276\n\t\t\t\t,0.256977\n\t\t\t\t,-4.4188\n\t\t\t\t,4.4307\n\t\t\t\t,0.116663\n\t\t\t\t,-4.36068\n\t\t\t\t,4.4307\n\t\t\t\t,0.478809\n\t\t\t\t,-3.81869\n\t\t\t\t,3.59863\n\t\t\t\t,0.586201\n\t\t\t\t,-3.92608\n\t\t\t\t,3.59863\n\t\t\t\t,0.256977\n\t\t\t\t,-4.4188\n\t\t\t\t,4.4307\n\t\t\t\t,0.116663\n\t\t\t\t,-4.36068\n\t\t\t\t,5.26276\n\t\t\t\t,0.256977\n\t\t\t\t,-4.4188\n\t\t\t\t,4.4307\n\t\t\t\t,0.116663\n\t\t\t\t,-4.36068\n\t\t\t\t,4.4307\n\t\t\t\t,-0.0105057\n\t\t\t\t,-5\n\t\t\t\t,5.26276\n\t\t\t\t,0.141369\n\t\t\t\t,-5\n\t\t\t\t,4.4307\n\t\t\t\t,0.116663\n\t\t\t\t,-4.36068\n\t\t\t\t,3.59863\n\t\t\t\t,0.256977\n\t\t\t\t,-4.4188\n\t\t\t\t,4.4307\n\t\t\t\t,-0.0105057\n\t\t\t\t,-5\n\t\t\t\t,3.59863\n\t\t\t\t,0.141369\n\t\t\t\t,-5\n\t\t\t\t,5.26276\n\t\t\t\t,0.141369\n\t\t\t\t,-5\n\t\t\t\t,4.4307\n\t\t\t\t,-0.0105057\n\t\t\t\t,-5\n\t\t\t\t,5.26276\n\t\t\t\t,0.256977\n\t\t\t\t,-5.5812\n\t\t\t\t,4.4307\n\t\t\t\t,0.116663\n\t\t\t\t,-5.63932\n\t\t\t\t,4.4307\n\t\t\t\t,-0.0105057\n\t\t\t\t,-5\n\t\t\t\t,3.59863\n\t\t\t\t,0.141369\n\t\t\t\t,-5\n\t\t\t\t,3.59863\n\t\t\t\t,0.256977\n\t\t\t\t,-5.5812\n\t\t\t\t,4.4307\n\t\t\t\t,0.116663\n\t\t\t\t,-5.63932\n\t\t\t\t,5.26276\n\t\t\t\t,0.256977\n\t\t\t\t,-5.5812\n\t\t\t\t,4.4307\n\t\t\t\t,0.116663\n\t\t\t\t,-5.63932\n\t\t\t\t,4.4307\n\t\t\t\t,0.478809\n\t\t\t\t,-6.18131\n\t\t\t\t,5.26276\n\t\t\t\t,0.586201\n\t\t\t\t,-6.07392\n\t\t\t\t,4.4307\n\t\t\t\t,0.116663\n\t\t\t\t,-5.63932\n\t\t\t\t,3.59863\n\t\t\t\t,0.256977\n\t\t\t\t,-5.5812\n\t\t\t\t,4.4307\n\t\t\t\t,0.478809\n\t\t\t\t,-6.18131\n\t\t\t\t,3.59863\n\t\t\t\t,0.586201\n\t\t\t\t,-6.07392\n\t\t\t\t,5.26276\n\t\t\t\t,0.586201\n\t\t\t\t,-6.07392\n\t\t\t\t,4.4307\n\t\t\t\t,0.478809\n\t\t\t\t,-6.18131\n\t\t\t\t,5.26276\n\t\t\t\t,1.07892\n\t\t\t\t,-6.40314\n\t\t\t\t,4.4307\n\t\t\t\t,1.0208\n\t\t\t\t,-6.54346\n\t\t\t\t,4.4307\n\t\t\t\t,0.478809\n\t\t\t\t,-6.18131\n\t\t\t\t,3.59863\n\t\t\t\t,0.586201\n\t\t\t\t,-6.07392\n\t\t\t\t,3.59863\n\t\t\t\t,1.07892\n\t\t\t\t,-6.40314\n\t\t\t\t,4.4307\n\t\t\t\t,1.0208\n\t\t\t\t,-6.54346\n\t\t\t\t,5.26276\n\t\t\t\t,1.07892\n\t\t\t\t,-6.40314\n\t\t\t\t,4.4307\n\t\t\t\t,1.0208\n\t\t\t\t,-6.54346\n\t\t\t\t,4.4307\n\t\t\t\t,1.66012\n\t\t\t\t,-6.67063\n\t\t\t\t,5.26276\n\t\t\t\t,1.66012\n\t\t\t\t,-6.51875\n\t\t\t\t,4.4307\n\t\t\t\t,1.0208\n\t\t\t\t,-6.54346\n\t\t\t\t,3.59863\n\t\t\t\t,1.07892\n\t\t\t\t,-6.40314\n\t\t\t\t,4.4307\n\t\t\t\t,1.66012\n\t\t\t\t,-6.67063\n\t\t\t\t,3.59863\n\t\t\t\t,1.66012\n\t\t\t\t,-6.51875\n\t\t\t\t,5.26276\n\t\t\t\t,1.66012\n\t\t\t\t,-6.51875\n\t\t\t\t,4.4307\n\t\t\t\t,1.66012\n\t\t\t\t,-6.67063\n\t\t\t\t,5.26276\n\t\t\t\t,2.24132\n\t\t\t\t,-6.40314\n\t\t\t\t,4.4307\n\t\t\t\t,2.29944\n\t\t\t\t,-6.54346\n\t\t\t\t,4.4307\n\t\t\t\t,1.66012\n\t\t\t\t,-6.67063\n\t\t\t\t,3.59863\n\t\t\t\t,1.66012\n\t\t\t\t,-6.51875\n\t\t\t\t,3.59863\n\t\t\t\t,2.24132\n\t\t\t\t,-6.40314\n\t\t\t\t,4.4307\n\t\t\t\t,2.29944\n\t\t\t\t,-6.54346\n\t\t\t\t,5.26276\n\t\t\t\t,2.24132\n\t\t\t\t,-6.40314\n\t\t\t\t,4.4307\n\t\t\t\t,2.29944\n\t\t\t\t,-6.54346\n\t\t\t\t,4.4307\n\t\t\t\t,2.84143\n\t\t\t\t,-6.18131\n\t\t\t\t,5.26276\n\t\t\t\t,2.73404\n\t\t\t\t,-6.07392\n\t\t\t\t,4.4307\n\t\t\t\t,2.29944\n\t\t\t\t,-6.54346\n\t\t\t\t,3.59863\n\t\t\t\t,2.24132\n\t\t\t\t,-6.40314\n\t\t\t\t,4.4307\n\t\t\t\t,2.84143\n\t\t\t\t,-6.18131\n\t\t\t\t,3.59863\n\t\t\t\t,2.73404\n\t\t\t\t,-6.07392\n\t\t\t\t,5.26276\n\t\t\t\t,2.73404\n\t\t\t\t,-6.07392\n\t\t\t\t,4.4307\n\t\t\t\t,2.84143\n\t\t\t\t,-6.18131\n\t\t\t\t,5.26276\n\t\t\t\t,3.06326\n\t\t\t\t,-5.5812\n\t\t\t\t,4.4307\n\t\t\t\t,3.20358\n\t\t\t\t,-5.63932\n\t\t\t\t,4.4307\n\t\t\t\t,2.84143\n\t\t\t\t,-6.18131\n\t\t\t\t,3.59863\n\t\t\t\t,2.73404\n\t\t\t\t,-6.07392\n\t\t\t\t,3.59863\n\t\t\t\t,3.06326\n\t\t\t\t,-5.5812\n\t\t\t\t,4.4307\n\t\t\t\t,3.20358\n\t\t\t\t,-5.63932\n\t\t\t\t,5.26276\n\t\t\t\t,3.06326\n\t\t\t\t,-5.5812\n\t\t\t\t,4.4307\n\t\t\t\t,3.20358\n\t\t\t\t,-5.63932\n\t\t\t\t,4.4307\n\t\t\t\t,3.33074\n\t\t\t\t,-5\n\t\t\t\t,5.26276\n\t\t\t\t,3.17887\n\t\t\t\t,-5\n\t\t\t\t,4.4307\n\t\t\t\t,3.20358\n\t\t\t\t,-5.63932\n\t\t\t\t,3.59863\n\t\t\t\t,3.06326\n\t\t\t\t,-5.5812\n\t\t\t\t,4.4307\n\t\t\t\t,3.33074\n\t\t\t\t,-5\n\t\t\t\t,3.59863\n\t\t\t\t,3.17887\n\t\t\t\t,-5\n\t\t\t]\n\t\t\t,\"normals\": [\n\t\t\t\t 0.853097\n\t\t\t\t,-0.520609\n\t\t\t\t,-0.0345183\n\t\t\t\t,0.853101\n\t\t\t\t,-0.467764\n\t\t\t\t,-0.231118\n\t\t\t\t,1\n\t\t\t\t,0\n\t\t\t\t,0\n\t\t\t\t,-0.854735\n\t\t\t\t,0.519065\n\t\t\t\t,1.4012e-007\n\t\t\t\t,-1\n\t\t\t\t,0\n\t\t\t\t,0\n\t\t\t\t,-0.91976\n\t\t\t\t,0.362606\n\t\t\t\t,0.150197\n\t\t\t\t,0.992581\n\t\t\t\t,0.116804\n\t\t\t\t,0.0337532\n\t\t\t\t,0.454129\n\t\t\t\t,0.890936\n\t\t\t\t,2.80027e-007\n\t\t\t\t,0.454129\n\t\t\t\t,0.823118\n\t\t\t\t,0.340946\n\t\t\t\t,0.961402\n\t\t\t\t,-0.268379\n\t\t\t\t,-0.0606564\n\t\t\t\t,-0.45413\n\t\t\t\t,0.890935\n\t\t\t\t,2.83971e-007\n\t\t\t\t,-0.45413\n\t\t\t\t,0.823117\n\t\t\t\t,0.340946\n\t\t\t\t,0.853102\n\t\t\t\t,-0.343712\n\t\t\t\t,-0.392528\n\t\t\t\t,-0.854735\n\t\t\t\t,0.367035\n\t\t\t\t,0.367035\n\t\t\t\t,0.992581\n\t\t\t\t,0.0587307\n\t\t\t\t,0.106462\n\t\t\t\t,0.454129\n\t\t\t\t,0.629987\n\t\t\t\t,0.629987\n\t\t\t\t,-0.45413\n\t\t\t\t,0.629986\n\t\t\t\t,0.629987\n\t\t\t\t,0.853101\n\t\t\t\t,-0.167336\n\t\t\t\t,-0.494183\n\t\t\t\t,-0.919759\n\t\t\t\t,0.150197\n\t\t\t\t,0.362607\n\t\t\t\t,0.454128\n\t\t\t\t,0.340946\n\t\t\t\t,0.823118\n\t\t\t\t,0.961404\n\t\t\t\t,-0.146879\n\t\t\t\t,-0.232654\n\t\t\t\t,-0.454129\n\t\t\t\t,0.340946\n\t\t\t\t,0.823117\n\t\t\t\t,0.8531\n\t\t\t\t,0.034517\n\t\t\t\t,-0.520604\n\t\t\t\t,-0.854734\n\t\t\t\t,0\n\t\t\t\t,0.519066\n\t\t\t\t,0.992581\n\t\t\t\t,-0.0337527\n\t\t\t\t,0.116809\n\t\t\t\t,0.454128\n\t\t\t\t,0\n\t\t\t\t,0.890936\n\t\t\t\t,-0.454129\n\t\t\t\t,0\n\t\t\t\t,0.890936\n\t\t\t\t,0.853099\n\t\t\t\t,0.231119\n\t\t\t\t,-0.467768\n\t\t\t\t,-0.919759\n\t\t\t\t,-0.150197\n\t\t\t\t,0.362607\n\t\t\t\t,0.454128\n\t\t\t\t,-0.340947\n\t\t\t\t,0.823118\n\t\t\t\t,0.961402\n\t\t\t\t,0.0606552\n\t\t\t\t,-0.268377\n\t\t\t\t,-0.454129\n\t\t\t\t,-0.340946\n\t\t\t\t,0.823117\n\t\t\t\t,0.853095\n\t\t\t\t,0.392537\n\t\t\t\t,-0.34372\n\t\t\t\t,-0.854734\n\t\t\t\t,-0.367035\n\t\t\t\t,0.367035\n\t\t\t\t,0.992581\n\t\t\t\t,-0.106458\n\t\t\t\t,0.0587268\n\t\t\t\t,0.454128\n\t\t\t\t,-0.629987\n\t\t\t\t,0.629987\n\t\t\t\t,-0.45413\n\t\t\t\t,-0.629986\n\t\t\t\t,0.629987\n\t\t\t\t,0.853096\n\t\t\t\t,0.494192\n\t\t\t\t,-0.167335\n\t\t\t\t,-0.91976\n\t\t\t\t,-0.362606\n\t\t\t\t,0.150196\n\t\t\t\t,0.454128\n\t\t\t\t,-0.823118\n\t\t\t\t,0.340946\n\t\t\t\t,0.961398\n\t\t\t\t,0.232674\n\t\t\t\t,-0.146889\n\t\t\t\t,-0.45413\n\t\t\t\t,-0.823117\n\t\t\t\t,0.340946\n\t\t\t\t,0.853098\n\t\t\t\t,0.520607\n\t\t\t\t,0.0345189\n\t\t\t\t,-0.854735\n\t\t\t\t,-0.519065\n\t\t\t\t,1.37425e-007\n\t\t\t\t,0.992581\n\t\t\t\t,-0.116805\n\t\t\t\t,-0.0337485\n\t\t\t\t,0.454128\n\t\t\t\t,-0.890936\n\t\t\t\t,2.76083e-007\n\t\t\t\t,-0.45413\n\t\t\t\t,-0.890936\n\t\t\t\t,2.80027e-007\n\t\t\t\t,0.853093\n\t\t\t\t,0.467778\n\t\t\t\t,0.231118\n\t\t\t\t,-0.91976\n\t\t\t\t,-0.362606\n\t\t\t\t,-0.150196\n\t\t\t\t,0.454129\n\t\t\t\t,-0.823118\n\t\t\t\t,-0.340946\n\t\t\t\t,0.9614\n\t\t\t\t,0.268387\n\t\t\t\t,0.0606525\n\t\t\t\t,-0.45413\n\t\t\t\t,-0.823117\n\t\t\t\t,-0.340946\n\t\t\t\t,0.853096\n\t\t\t\t,0.343719\n\t\t\t\t,0.392535\n\t\t\t\t,-0.854735\n\t\t\t\t,-0.367034\n\t\t\t\t,-0.367034\n\t\t\t\t,0.992581\n\t\t\t\t,-0.0587251\n\t\t\t\t,-0.106458\n\t\t\t\t,0.454128\n\t\t\t\t,-0.629987\n\t\t\t\t,-0.629987\n\t\t\t\t,-0.45413\n\t\t\t\t,-0.629987\n\t\t\t\t,-0.629987\n\t\t\t\t,0.853099\n\t\t\t\t,0.167338\n\t\t\t\t,0.494187\n\t\t\t\t,-0.91976\n\t\t\t\t,-0.150196\n\t\t\t\t,-0.362606\n\t\t\t\t,0.454129\n\t\t\t\t,-0.340947\n\t\t\t\t,-0.823117\n\t\t\t\t,0.961401\n\t\t\t\t,0.146885\n\t\t\t\t,0.232664\n\t\t\t\t,-0.45413\n\t\t\t\t,-0.340946\n\t\t\t\t,-0.823117\n\t\t\t\t,0.8531\n\t\t\t\t,-0.0345193\n\t\t\t\t,0.520605\n\t\t\t\t,-0.854735\n\t\t\t\t,0\n\t\t\t\t,-0.519064\n\t\t\t\t,0.992581\n\t\t\t\t,0.0337517\n\t\t\t\t,-0.116805\n\t\t\t\t,0.454129\n\t\t\t\t,0\n\t\t\t\t,-0.890936\n\t\t\t\t,-0.45413\n\t\t\t\t,0\n\t\t\t\t,-0.890935\n\t\t\t\t,0.853103\n\t\t\t\t,-0.231117\n\t\t\t\t,0.467762\n\t\t\t\t,-0.91976\n\t\t\t\t,0.150196\n\t\t\t\t,-0.362606\n\t\t\t\t,0.454129\n\t\t\t\t,0.340946\n\t\t\t\t,-0.823117\n\t\t\t\t,0.961403\n\t\t\t\t,-0.0606557\n\t\t\t\t,0.268376\n\t\t\t\t,-0.45413\n\t\t\t\t,0.340946\n\t\t\t\t,-0.823117\n\t\t\t\t,0.853103\n\t\t\t\t,-0.392528\n\t\t\t\t,0.343712\n\t\t\t\t,-0.854735\n\t\t\t\t,0.367034\n\t\t\t\t,-0.367034\n\t\t\t\t,0.992581\n\t\t\t\t,0.106462\n\t\t\t\t,-0.0587312\n\t\t\t\t,0.454129\n\t\t\t\t,0.629987\n\t\t\t\t,-0.629987\n\t\t\t\t,-0.45413\n\t\t\t\t,0.629986\n\t\t\t\t,-0.629987\n\t\t\t\t,0.853099\n\t\t\t\t,-0.494187\n\t\t\t\t,0.167338\n\t\t\t\t,-0.91976\n\t\t\t\t,0.362606\n\t\t\t\t,-0.150196\n\t\t\t\t,0.454129\n\t\t\t\t,0.823118\n\t\t\t\t,-0.340946\n\t\t\t\t,0.961403\n\t\t\t\t,-0.232658\n\t\t\t\t,0.146881\n\t\t\t\t,-0.45413\n\t\t\t\t,0.823117\n\t\t\t\t,-0.340946\n\t\t\t\t,0.454129\n\t\t\t\t,0.890936\n\t\t\t\t,2.80027e-007\n\t\t\t\t,-1.04184e-007\n\t\t\t\t,1\n\t\t\t\t,1.52417e-007\n\t\t\t\t,0.454129\n\t\t\t\t,0.823118\n\t\t\t\t,0.340946\n\t\t\t\t,-1.04184e-007\n\t\t\t\t,0.923879\n\t\t\t\t,0.382684\n\t\t\t\t,-1.04184e-007\n\t\t\t\t,1\n\t\t\t\t,1.52417e-007\n\t\t\t\t,-0.45413\n\t\t\t\t,0.890935\n\t\t\t\t,2.83971e-007\n\t\t\t\t,-0.45413\n\t\t\t\t,0.823117\n\t\t\t\t,0.340946\n\t\t\t\t,-1.04184e-007\n\t\t\t\t,0.923879\n\t\t\t\t,0.382684\n\t\t\t\t,0.454129\n\t\t\t\t,0.823118\n\t\t\t\t,0.340946\n\t\t\t\t,-1.04184e-007\n\t\t\t\t,0.923879\n\t\t\t\t,0.382684\n\t\t\t\t,-1.04184e-007\n\t\t\t\t,0.707107\n\t\t\t\t,0.707107\n\t\t\t\t,0.454129\n\t\t\t\t,0.629987\n\t\t\t\t,0.629987\n\t\t\t\t,-1.04184e-007\n\t\t\t\t,0.923879\n\t\t\t\t,0.382684\n\t\t\t\t,-0.45413\n\t\t\t\t,0.823117\n\t\t\t\t,0.340946\n\t\t\t\t,-1.04184e-007\n\t\t\t\t,0.707107\n\t\t\t\t,0.707107\n\t\t\t\t,-0.45413\n\t\t\t\t,0.629986\n\t\t\t\t,0.629987\n\t\t\t\t,0.454129\n\t\t\t\t,0.629987\n\t\t\t\t,0.629987\n\t\t\t\t,-1.04184e-007\n\t\t\t\t,0.707107\n\t\t\t\t,0.707107\n\t\t\t\t,0.454128\n\t\t\t\t,0.340946\n\t\t\t\t,0.823118\n\t\t\t\t,-1.04184e-007\n\t\t\t\t,0.382683\n\t\t\t\t,0.92388\n\t\t\t\t,-1.04184e-007\n\t\t\t\t,0.707107\n\t\t\t\t,0.707107\n\t\t\t\t,-0.45413\n\t\t\t\t,0.629986\n\t\t\t\t,0.629987\n\t\t\t\t,-0.454129\n\t\t\t\t,0.340946\n\t\t\t\t,0.823117\n\t\t\t\t,-1.04184e-007\n\t\t\t\t,0.382683\n\t\t\t\t,0.92388\n\t\t\t\t,0.454128\n\t\t\t\t,0.340946\n\t\t\t\t,0.823118\n\t\t\t\t,-1.04184e-007\n\t\t\t\t,0.382683\n\t\t\t\t,0.92388\n\t\t\t\t,-1.04184e-007\n\t\t\t\t,0\n\t\t\t\t,1\n\t\t\t\t,0.454128\n\t\t\t\t,0\n\t\t\t\t,0.890936\n\t\t\t\t,-1.04184e-007\n\t\t\t\t,0.382683\n\t\t\t\t,0.92388\n\t\t\t\t,-0.454129\n\t\t\t\t,0.340946\n\t\t\t\t,0.823117\n\t\t\t\t,-1.04184e-007\n\t\t\t\t,0\n\t\t\t\t,1\n\t\t\t\t,-0.454129\n\t\t\t\t,0\n\t\t\t\t,0.890936\n\t\t\t\t,0.454128\n\t\t\t\t,0\n\t\t\t\t,0.890936\n\t\t\t\t,-1.04184e-007\n\t\t\t\t,0\n\t\t\t\t,1\n\t\t\t\t,0.454128\n\t\t\t\t,-0.340947\n\t\t\t\t,0.823118\n\t\t\t\t,-1.00325e-007\n\t\t\t\t,-0.382684\n\t\t\t\t,0.923879\n\t\t\t\t,-1.04184e-007\n\t\t\t\t,0\n\t\t\t\t,1\n\t\t\t\t,-0.454129\n\t\t\t\t,0\n\t\t\t\t,0.890936\n\t\t\t\t,-0.454129\n\t\t\t\t,-0.340946\n\t\t\t\t,0.823117\n\t\t\t\t,-1.00325e-007\n\t\t\t\t,-0.382684\n\t\t\t\t,0.923879\n\t\t\t\t,0.454128\n\t\t\t\t,-0.340947\n\t\t\t\t,0.823118\n\t\t\t\t,-1.00325e-007\n\t\t\t\t,-0.382684\n\t\t\t\t,0.923879\n\t\t\t\t,-1.00325e-007\n\t\t\t\t,-0.707107\n\t\t\t\t,0.707107\n\t\t\t\t,0.454128\n\t\t\t\t,-0.629987\n\t\t\t\t,0.629987\n\t\t\t\t,-1.00325e-007\n\t\t\t\t,-0.382684\n\t\t\t\t,0.923879\n\t\t\t\t,-0.454129\n\t\t\t\t,-0.340946\n\t\t\t\t,0.823117\n\t\t\t\t,-1.00325e-007\n\t\t\t\t,-0.707107\n\t\t\t\t,0.707107\n\t\t\t\t,-0.45413\n\t\t\t\t,-0.629986\n\t\t\t\t,0.629987\n\t\t\t\t,0.454128\n\t\t\t\t,-0.629987\n\t\t\t\t,0.629987\n\t\t\t\t,-1.00325e-007\n\t\t\t\t,-0.707107\n\t\t\t\t,0.707107\n\t\t\t\t,0.454128\n\t\t\t\t,-0.823118\n\t\t\t\t,0.340946\n\t\t\t\t,-1.04184e-007\n\t\t\t\t,-0.923879\n\t\t\t\t,0.382684\n\t\t\t\t,-1.00325e-007\n\t\t\t\t,-0.707107\n\t\t\t\t,0.707107\n\t\t\t\t,-0.45413\n\t\t\t\t,-0.629986\n\t\t\t\t,0.629987\n\t\t\t\t,-0.45413\n\t\t\t\t,-0.823117\n\t\t\t\t,0.340946\n\t\t\t\t,-1.04184e-007\n\t\t\t\t,-0.923879\n\t\t\t\t,0.382684\n\t\t\t\t,0.454128\n\t\t\t\t,-0.823118\n\t\t\t\t,0.340946\n\t\t\t\t,-1.04184e-007\n\t\t\t\t,-0.923879\n\t\t\t\t,0.382684\n\t\t\t\t,-1.06113e-007\n\t\t\t\t,-1\n\t\t\t\t,1.52417e-007\n\t\t\t\t,0.454128\n\t\t\t\t,-0.890936\n\t\t\t\t,2.76083e-007\n\t\t\t\t,-1.04184e-007\n\t\t\t\t,-0.923879\n\t\t\t\t,0.382684\n\t\t\t\t,-0.45413\n\t\t\t\t,-0.823117\n\t\t\t\t,0.340946\n\t\t\t\t,-1.06113e-007\n\t\t\t\t,-1\n\t\t\t\t,1.52417e-007\n\t\t\t\t,-0.45413\n\t\t\t\t,-0.890936\n\t\t\t\t,2.80027e-007\n\t\t\t\t,0.454128\n\t\t\t\t,-0.890936\n\t\t\t\t,2.76083e-007\n\t\t\t\t,-1.06113e-007\n\t\t\t\t,-1\n\t\t\t\t,1.52417e-007\n\t\t\t\t,0.454129\n\t\t\t\t,-0.823118\n\t\t\t\t,-0.340946\n\t\t\t\t,-1.04184e-007\n\t\t\t\t,-0.92388\n\t\t\t\t,-0.382683\n\t\t\t\t,-1.06113e-007\n\t\t\t\t,-1\n\t\t\t\t,1.52417e-007\n\t\t\t\t,-0.45413\n\t\t\t\t,-0.890936\n\t\t\t\t,2.80027e-007\n\t\t\t\t,-0.45413\n\t\t\t\t,-0.823117\n\t\t\t\t,-0.340946\n\t\t\t\t,-1.04184e-007\n\t\t\t\t,-0.92388\n\t\t\t\t,-0.382683\n\t\t\t\t,0.454129\n\t\t\t\t,-0.823118\n\t\t\t\t,-0.340946\n\t\t\t\t,-1.04184e-007\n\t\t\t\t,-0.92388\n\t\t\t\t,-0.382683\n\t\t\t\t,-1.00325e-007\n\t\t\t\t,-0.707107\n\t\t\t\t,-0.707107\n\t\t\t\t,0.454128\n\t\t\t\t,-0.629987\n\t\t\t\t,-0.629987\n\t\t\t\t,-1.04184e-007\n\t\t\t\t,-0.92388\n\t\t\t\t,-0.382683\n\t\t\t\t,-0.45413\n\t\t\t\t,-0.823117\n\t\t\t\t,-0.340946\n\t\t\t\t,-1.00325e-007\n\t\t\t\t,-0.707107\n\t\t\t\t,-0.707107\n\t\t\t\t,-0.45413\n\t\t\t\t,-0.629987\n\t\t\t\t,-0.629987\n\t\t\t\t,0.454128\n\t\t\t\t,-0.629987\n\t\t\t\t,-0.629987\n\t\t\t\t,-1.00325e-007\n\t\t\t\t,-0.707107\n\t\t\t\t,-0.707107\n\t\t\t\t,0.454129\n\t\t\t\t,-0.340947\n\t\t\t\t,-0.823117\n\t\t\t\t,-1.00325e-007\n\t\t\t\t,-0.382684\n\t\t\t\t,-0.92388\n\t\t\t\t,-1.00325e-007\n\t\t\t\t,-0.707107\n\t\t\t\t,-0.707107\n\t\t\t\t,-0.45413\n\t\t\t\t,-0.629987\n\t\t\t\t,-0.629987\n\t\t\t\t,-0.45413\n\t\t\t\t,-0.340946\n\t\t\t\t,-0.823117\n\t\t\t\t,-1.00325e-007\n\t\t\t\t,-0.382684\n\t\t\t\t,-0.92388\n\t\t\t\t,0.454129\n\t\t\t\t,-0.340947\n\t\t\t\t,-0.823117\n\t\t\t\t,-1.00325e-007\n\t\t\t\t,-0.382684\n\t\t\t\t,-0.92388\n\t\t\t\t,-1.04184e-007\n\t\t\t\t,0\n\t\t\t\t,-1\n\t\t\t\t,0.454129\n\t\t\t\t,0\n\t\t\t\t,-0.890936\n\t\t\t\t,-1.00325e-007\n\t\t\t\t,-0.382684\n\t\t\t\t,-0.92388\n\t\t\t\t,-0.45413\n\t\t\t\t,-0.340946\n\t\t\t\t,-0.823117\n\t\t\t\t,-1.04184e-007\n\t\t\t\t,0\n\t\t\t\t,-1\n\t\t\t\t,-0.45413\n\t\t\t\t,0\n\t\t\t\t,-0.890935\n\t\t\t\t,0.454129\n\t\t\t\t,0\n\t\t\t\t,-0.890936\n\t\t\t\t,-1.04184e-007\n\t\t\t\t,0\n\t\t\t\t,-1\n\t\t\t\t,0.454129\n\t\t\t\t,0.340946\n\t\t\t\t,-0.823117\n\t\t\t\t,-1.00325e-007\n\t\t\t\t,0.382683\n\t\t\t\t,-0.92388\n\t\t\t\t,-1.04184e-007\n\t\t\t\t,0\n\t\t\t\t,-1\n\t\t\t\t,-0.45413\n\t\t\t\t,0\n\t\t\t\t,-0.890935\n\t\t\t\t,-0.45413\n\t\t\t\t,0.340946\n\t\t\t\t,-0.823117\n\t\t\t\t,-1.00325e-007\n\t\t\t\t,0.382683\n\t\t\t\t,-0.92388\n\t\t\t\t,0.454129\n\t\t\t\t,0.340946\n\t\t\t\t,-0.823117\n\t\t\t\t,-1.00325e-007\n\t\t\t\t,0.382683\n\t\t\t\t,-0.92388\n\t\t\t\t,-1.02254e-007\n\t\t\t\t,0.707107\n\t\t\t\t,-0.707107\n\t\t\t\t,0.454129\n\t\t\t\t,0.629987\n\t\t\t\t,-0.629987\n\t\t\t\t,-1.00325e-007\n\t\t\t\t,0.382683\n\t\t\t\t,-0.92388\n\t\t\t\t,-0.45413\n\t\t\t\t,0.340946\n\t\t\t\t,-0.823117\n\t\t\t\t,-1.02254e-007\n\t\t\t\t,0.707107\n\t\t\t\t,-0.707107\n\t\t\t\t,-0.45413\n\t\t\t\t,0.629986\n\t\t\t\t,-0.629987\n\t\t\t\t,0.454129\n\t\t\t\t,0.629987\n\t\t\t\t,-0.629987\n\t\t\t\t,-1.02254e-007\n\t\t\t\t,0.707107\n\t\t\t\t,-0.707107\n\t\t\t\t,0.454129\n\t\t\t\t,0.823118\n\t\t\t\t,-0.340946\n\t\t\t\t,-1.04184e-007\n\t\t\t\t,0.92388\n\t\t\t\t,-0.382683\n\t\t\t\t,-1.02254e-007\n\t\t\t\t,0.707107\n\t\t\t\t,-0.707107\n\t\t\t\t,-0.45413\n\t\t\t\t,0.629986\n\t\t\t\t,-0.629987\n\t\t\t\t,-0.45413\n\t\t\t\t,0.823117\n\t\t\t\t,-0.340946\n\t\t\t\t,-1.04184e-007\n\t\t\t\t,0.92388\n\t\t\t\t,-0.382683\n\t\t\t\t,0.454129\n\t\t\t\t,0.823118\n\t\t\t\t,-0.340946\n\t\t\t\t,-1.04184e-007\n\t\t\t\t,0.92388\n\t\t\t\t,-0.382683\n\t\t\t\t,-1.04184e-007\n\t\t\t\t,1\n\t\t\t\t,1.52417e-007\n\t\t\t\t,0.454129\n\t\t\t\t,0.890936\n\t\t\t\t,2.80027e-007\n\t\t\t\t,-1.04184e-007\n\t\t\t\t,0.92388\n\t\t\t\t,-0.382683\n\t\t\t\t,-0.45413\n\t\t\t\t,0.823117\n\t\t\t\t,-0.340946\n\t\t\t\t,-1.04184e-007\n\t\t\t\t,1\n\t\t\t\t,1.52417e-007\n\t\t\t\t,-0.45413\n\t\t\t\t,0.890935\n\t\t\t\t,2.83971e-007\n\t\t\t\t,-1\n\t\t\t\t,0\n\t\t\t\t,0\n\t\t\t\t,-0.853101\n\t\t\t\t,-0.467763\n\t\t\t\t,-0.231118\n\t\t\t\t,-0.853097\n\t\t\t\t,-0.520609\n\t\t\t\t,-0.0345182\n\t\t\t\t,0.91976\n\t\t\t\t,0.362606\n\t\t\t\t,0.150197\n\t\t\t\t,1\n\t\t\t\t,0\n\t\t\t\t,0\n\t\t\t\t,0.854735\n\t\t\t\t,0.519065\n\t\t\t\t,0\n\t\t\t\t,-0.454129\n\t\t\t\t,0.823118\n\t\t\t\t,0.340947\n\t\t\t\t,-0.454129\n\t\t\t\t,0.890936\n\t\t\t\t,0\n\t\t\t\t,-0.992581\n\t\t\t\t,0.116804\n\t\t\t\t,0.0337531\n\t\t\t\t,-0.961402\n\t\t\t\t,-0.268378\n\t\t\t\t,-0.0606563\n\t\t\t\t,0.45413\n\t\t\t\t,0.823117\n\t\t\t\t,0.340946\n\t\t\t\t,0.45413\n\t\t\t\t,0.890935\n\t\t\t\t,0\n\t\t\t\t,-0.853103\n\t\t\t\t,-0.343712\n\t\t\t\t,-0.392528\n\t\t\t\t,0.854735\n\t\t\t\t,0.367034\n\t\t\t\t,0.367035\n\t\t\t\t,-0.992581\n\t\t\t\t,0.0587309\n\t\t\t\t,0.106462\n\t\t\t\t,-0.454129\n\t\t\t\t,0.629987\n\t\t\t\t,0.629987\n\t\t\t\t,0.45413\n\t\t\t\t,0.629986\n\t\t\t\t,0.629987\n\t\t\t\t,-0.853101\n\t\t\t\t,-0.167337\n\t\t\t\t,-0.494183\n\t\t\t\t,0.91976\n\t\t\t\t,0.150197\n\t\t\t\t,0.362606\n\t\t\t\t,-0.454129\n\t\t\t\t,0.340947\n\t\t\t\t,0.823118\n\t\t\t\t,-0.961404\n\t\t\t\t,-0.146879\n\t\t\t\t,-0.232655\n\t\t\t\t,0.45413\n\t\t\t\t,0.340946\n\t\t\t\t,0.823117\n\t\t\t\t,-0.8531\n\t\t\t\t,0.034517\n\t\t\t\t,-0.520605\n\t\t\t\t,0.854735\n\t\t\t\t,0\n\t\t\t\t,0.519065\n\t\t\t\t,-0.992581\n\t\t\t\t,-0.0337528\n\t\t\t\t,0.116807\n\t\t\t\t,-0.454129\n\t\t\t\t,0\n\t\t\t\t,0.890936\n\t\t\t\t,0.45413\n\t\t\t\t,0\n\t\t\t\t,0.890935\n\t\t\t\t,-0.853099\n\t\t\t\t,0.231119\n\t\t\t\t,-0.467768\n\t\t\t\t,0.91976\n\t\t\t\t,-0.150197\n\t\t\t\t,0.362606\n\t\t\t\t,-0.454129\n\t\t\t\t,-0.340947\n\t\t\t\t,0.823118\n\t\t\t\t,-0.961402\n\t\t\t\t,0.0606557\n\t\t\t\t,-0.268378\n\t\t\t\t,0.45413\n\t\t\t\t,-0.340947\n\t\t\t\t,0.823117\n\t\t\t\t,-0.853095\n\t\t\t\t,0.392537\n\t\t\t\t,-0.34372\n\t\t\t\t,0.854735\n\t\t\t\t,-0.367035\n\t\t\t\t,0.367035\n\t\t\t\t,-0.992581\n\t\t\t\t,-0.106458\n\t\t\t\t,0.0587265\n\t\t\t\t,-0.454128\n\t\t\t\t,-0.629987\n\t\t\t\t,0.629987\n\t\t\t\t,0.45413\n\t\t\t\t,-0.629987\n\t\t\t\t,0.629987\n\t\t\t\t,-0.853097\n\t\t\t\t,0.494192\n\t\t\t\t,-0.167334\n\t\t\t\t,0.91976\n\t\t\t\t,-0.362606\n\t\t\t\t,0.150196\n\t\t\t\t,-0.454128\n\t\t\t\t,-0.823118\n\t\t\t\t,0.340947\n\t\t\t\t,-0.961398\n\t\t\t\t,0.232674\n\t\t\t\t,-0.146889\n\t\t\t\t,0.45413\n\t\t\t\t,-0.823117\n\t\t\t\t,0.340946\n\t\t\t\t,-0.853098\n\t\t\t\t,0.520607\n\t\t\t\t,0.034519\n\t\t\t\t,0.854735\n\t\t\t\t,-0.519065\n\t\t\t\t,0\n\t\t\t\t,-0.992581\n\t\t\t\t,-0.116805\n\t\t\t\t,-0.0337486\n\t\t\t\t,-0.454128\n\t\t\t\t,-0.890936\n\t\t\t\t,0\n\t\t\t\t,0.45413\n\t\t\t\t,-0.890936\n\t\t\t\t,0\n\t\t\t\t,-0.853093\n\t\t\t\t,0.467778\n\t\t\t\t,0.231119\n\t\t\t\t,0.91976\n\t\t\t\t,-0.362606\n\t\t\t\t,-0.150196\n\t\t\t\t,-0.454128\n\t\t\t\t,-0.823118\n\t\t\t\t,-0.340947\n\t\t\t\t,-0.9614\n\t\t\t\t,0.268386\n\t\t\t\t,0.0606523\n\t\t\t\t,0.45413\n\t\t\t\t,-0.823117\n\t\t\t\t,-0.340946\n\t\t\t\t,-0.853096\n\t\t\t\t,0.343719\n\t\t\t\t,0.392535\n\t\t\t\t,0.854735\n\t\t\t\t,-0.367035\n\t\t\t\t,-0.367035\n\t\t\t\t,-0.992581\n\t\t\t\t,-0.058725\n\t\t\t\t,-0.106458\n\t\t\t\t,-0.454128\n\t\t\t\t,-0.629987\n\t\t\t\t,-0.629987\n\t\t\t\t,0.45413\n\t\t\t\t,-0.629987\n\t\t\t\t,-0.629987\n\t\t\t\t,-0.853099\n\t\t\t\t,0.167337\n\t\t\t\t,0.494186\n\t\t\t\t,0.91976\n\t\t\t\t,-0.150197\n\t\t\t\t,-0.362606\n\t\t\t\t,-0.454129\n\t\t\t\t,-0.340947\n\t\t\t\t,-0.823118\n\t\t\t\t,-0.961402\n\t\t\t\t,0.146884\n\t\t\t\t,0.232663\n\t\t\t\t,0.45413\n\t\t\t\t,-0.340947\n\t\t\t\t,-0.823117\n\t\t\t\t,-0.853101\n\t\t\t\t,-0.0345192\n\t\t\t\t,0.520603\n\t\t\t\t,0.854735\n\t\t\t\t,0\n\t\t\t\t,-0.519065\n\t\t\t\t,-0.992581\n\t\t\t\t,0.0337517\n\t\t\t\t,-0.116807\n\t\t\t\t,-0.454129\n\t\t\t\t,0\n\t\t\t\t,-0.890936\n\t\t\t\t,0.45413\n\t\t\t\t,0\n\t\t\t\t,-0.890935\n\t\t\t\t,-0.853103\n\t\t\t\t,-0.231117\n\t\t\t\t,0.467761\n\t\t\t\t,0.91976\n\t\t\t\t,0.150197\n\t\t\t\t,-0.362606\n\t\t\t\t,-0.454129\n\t\t\t\t,0.340947\n\t\t\t\t,-0.823118\n\t\t\t\t,-0.961403\n\t\t\t\t,-0.0606552\n\t\t\t\t,0.268374\n\t\t\t\t,0.45413\n\t\t\t\t,0.340946\n\t\t\t\t,-0.823117\n\t\t\t\t,-0.853102\n\t\t\t\t,-0.392528\n\t\t\t\t,0.343713\n\t\t\t\t,0.854735\n\t\t\t\t,0.367034\n\t\t\t\t,-0.367035\n\t\t\t\t,-0.992581\n\t\t\t\t,0.106462\n\t\t\t\t,-0.0587312\n\t\t\t\t,-0.454129\n\t\t\t\t,0.629987\n\t\t\t\t,-0.629987\n\t\t\t\t,0.45413\n\t\t\t\t,0.629986\n\t\t\t\t,-0.629987\n\t\t\t\t,-0.853099\n\t\t\t\t,-0.494186\n\t\t\t\t,0.167338\n\t\t\t\t,0.91976\n\t\t\t\t,0.362606\n\t\t\t\t,-0.150197\n\t\t\t\t,-0.454129\n\t\t\t\t,0.823118\n\t\t\t\t,-0.340947\n\t\t\t\t,-0.961403\n\t\t\t\t,-0.232658\n\t\t\t\t,0.146881\n\t\t\t\t,0.45413\n\t\t\t\t,0.823117\n\t\t\t\t,-0.340946\n\t\t\t\t,-0.454129\n\t\t\t\t,0.823118\n\t\t\t\t,0.340947\n\t\t\t\t,1.04184e-007\n\t\t\t\t,1\n\t\t\t\t,0\n\t\t\t\t,-0.454129\n\t\t\t\t,0.890936\n\t\t\t\t,0\n\t\t\t\t,1.04184e-007\n\t\t\t\t,0.92388\n\t\t\t\t,0.382683\n\t\t\t\t,0.45413\n\t\t\t\t,0.823117\n\t\t\t\t,0.340946\n\t\t\t\t,0.45413\n\t\t\t\t,0.890935\n\t\t\t\t,0\n\t\t\t\t,1.04184e-007\n\t\t\t\t,1\n\t\t\t\t,0\n\t\t\t\t,1.04184e-007\n\t\t\t\t,0.92388\n\t\t\t\t,0.382683\n\t\t\t\t,1.00325e-007\n\t\t\t\t,0.707107\n\t\t\t\t,0.707107\n\t\t\t\t,1.04184e-007\n\t\t\t\t,0.92388\n\t\t\t\t,0.382683\n\t\t\t\t,-0.454129\n\t\t\t\t,0.823118\n\t\t\t\t,0.340947\n\t\t\t\t,-0.454129\n\t\t\t\t,0.629987\n\t\t\t\t,0.629987\n\t\t\t\t,1.00325e-007\n\t\t\t\t,0.707107\n\t\t\t\t,0.707107\n\t\t\t\t,0.45413\n\t\t\t\t,0.823117\n\t\t\t\t,0.340946\n\t\t\t\t,1.04184e-007\n\t\t\t\t,0.92388\n\t\t\t\t,0.382683\n\t\t\t\t,0.45413\n\t\t\t\t,0.629986\n\t\t\t\t,0.629987\n\t\t\t\t,-0.454129\n\t\t\t\t,0.340947\n\t\t\t\t,0.823118\n\t\t\t\t,1.00325e-007\n\t\t\t\t,0.707107\n\t\t\t\t,0.707107\n\t\t\t\t,-0.454129\n\t\t\t\t,0.629987\n\t\t\t\t,0.629987\n\t\t\t\t,1.00325e-007\n\t\t\t\t,0.382684\n\t\t\t\t,0.92388\n\t\t\t\t,0.45413\n\t\t\t\t,0.340946\n\t\t\t\t,0.823117\n\t\t\t\t,0.45413\n\t\t\t\t,0.629986\n\t\t\t\t,0.629987\n\t\t\t\t,1.00325e-007\n\t\t\t\t,0.707107\n\t\t\t\t,0.707107\n\t\t\t\t,1.00325e-007\n\t\t\t\t,0.382684\n\t\t\t\t,0.92388\n\t\t\t\t,1.04184e-007\n\t\t\t\t,0\n\t\t\t\t,1\n\t\t\t\t,1.00325e-007\n\t\t\t\t,0.382684\n\t\t\t\t,0.92388\n\t\t\t\t,-0.454129\n\t\t\t\t,0.340947\n\t\t\t\t,0.823118\n\t\t\t\t,-0.454129\n\t\t\t\t,0\n\t\t\t\t,0.890936\n\t\t\t\t,1.04184e-007\n\t\t\t\t,0\n\t\t\t\t,1\n\t\t\t\t,0.45413\n\t\t\t\t,0.340946\n\t\t\t\t,0.823117\n\t\t\t\t,1.00325e-007\n\t\t\t\t,0.382684\n\t\t\t\t,0.92388\n\t\t\t\t,0.45413\n\t\t\t\t,0\n\t\t\t\t,0.890935\n\t\t\t\t,-0.454129\n\t\t\t\t,-0.340947\n\t\t\t\t,0.823118\n\t\t\t\t,1.04184e-007\n\t\t\t\t,0\n\t\t\t\t,1\n\t\t\t\t,-0.454129\n\t\t\t\t,0\n\t\t\t\t,0.890936\n\t\t\t\t,1.00325e-007\n\t\t\t\t,-0.382684\n\t\t\t\t,0.923879\n\t\t\t\t,0.45413\n\t\t\t\t,-0.340947\n\t\t\t\t,0.823117\n\t\t\t\t,0.45413\n\t\t\t\t,0\n\t\t\t\t,0.890935\n\t\t\t\t,1.04184e-007\n\t\t\t\t,0\n\t\t\t\t,1\n\t\t\t\t,1.00325e-007\n\t\t\t\t,-0.382684\n\t\t\t\t,0.923879\n\t\t\t\t,1.02254e-007\n\t\t\t\t,-0.707107\n\t\t\t\t,0.707107\n\t\t\t\t,1.00325e-007\n\t\t\t\t,-0.382684\n\t\t\t\t,0.923879\n\t\t\t\t,-0.454129\n\t\t\t\t,-0.340947\n\t\t\t\t,0.823118\n\t\t\t\t,-0.454128\n\t\t\t\t,-0.629987\n\t\t\t\t,0.629987\n\t\t\t\t,1.02254e-007\n\t\t\t\t,-0.707107\n\t\t\t\t,0.707107\n\t\t\t\t,0.45413\n\t\t\t\t,-0.340947\n\t\t\t\t,0.823117\n\t\t\t\t,1.00325e-007\n\t\t\t\t,-0.382684\n\t\t\t\t,0.923879\n\t\t\t\t,0.45413\n\t\t\t\t,-0.629987\n\t\t\t\t,0.629987\n\t\t\t\t,-0.454128\n\t\t\t\t,-0.823118\n\t\t\t\t,0.340947\n\t\t\t\t,1.02254e-007\n\t\t\t\t,-0.707107\n\t\t\t\t,0.707107\n\t\t\t\t,-0.454128\n\t\t\t\t,-0.629987\n\t\t\t\t,0.629987\n\t\t\t\t,1.04184e-007\n\t\t\t\t,-0.92388\n\t\t\t\t,0.382683\n\t\t\t\t,0.45413\n\t\t\t\t,-0.823117\n\t\t\t\t,0.340946\n\t\t\t\t,0.45413\n\t\t\t\t,-0.629987\n\t\t\t\t,0.629987\n\t\t\t\t,1.02254e-007\n\t\t\t\t,-0.707107\n\t\t\t\t,0.707107\n\t\t\t\t,1.04184e-007\n\t\t\t\t,-0.92388\n\t\t\t\t,0.382683\n\t\t\t\t,1.08042e-007\n\t\t\t\t,-1\n\t\t\t\t,0\n\t\t\t\t,1.04184e-007\n\t\t\t\t,-0.92388\n\t\t\t\t,0.382683\n\t\t\t\t,-0.454128\n\t\t\t\t,-0.823118\n\t\t\t\t,0.340947\n\t\t\t\t,-0.454128\n\t\t\t\t,-0.890936\n\t\t\t\t,0\n\t\t\t\t,1.08042e-007\n\t\t\t\t,-1\n\t\t\t\t,0\n\t\t\t\t,0.45413\n\t\t\t\t,-0.823117\n\t\t\t\t,0.340946\n\t\t\t\t,1.04184e-007\n\t\t\t\t,-0.92388\n\t\t\t\t,0.382683\n\t\t\t\t,0.45413\n\t\t\t\t,-0.890936\n\t\t\t\t,0\n\t\t\t\t,-0.454128\n\t\t\t\t,-0.823118\n\t\t\t\t,-0.340947\n\t\t\t\t,1.08042e-007\n\t\t\t\t,-1\n\t\t\t\t,0\n\t\t\t\t,-0.454128\n\t\t\t\t,-0.890936\n\t\t\t\t,0\n\t\t\t\t,1.04184e-007\n\t\t\t\t,-0.92388\n\t\t\t\t,-0.382683\n\t\t\t\t,0.45413\n\t\t\t\t,-0.823117\n\t\t\t\t,-0.340946\n\t\t\t\t,0.45413\n\t\t\t\t,-0.890936\n\t\t\t\t,0\n\t\t\t\t,1.08042e-007\n\t\t\t\t,-1\n\t\t\t\t,0\n\t\t\t\t,1.04184e-007\n\t\t\t\t,-0.92388\n\t\t\t\t,-0.382683\n\t\t\t\t,1.02254e-007\n\t\t\t\t,-0.707107\n\t\t\t\t,-0.707107\n\t\t\t\t,1.04184e-007\n\t\t\t\t,-0.92388\n\t\t\t\t,-0.382683\n\t\t\t\t,-0.454128\n\t\t\t\t,-0.823118\n\t\t\t\t,-0.340947\n\t\t\t\t,-0.454128\n\t\t\t\t,-0.629987\n\t\t\t\t,-0.629987\n\t\t\t\t,1.02254e-007\n\t\t\t\t,-0.707107\n\t\t\t\t,-0.707107\n\t\t\t\t,0.45413\n\t\t\t\t,-0.823117\n\t\t\t\t,-0.340946\n\t\t\t\t,1.04184e-007\n\t\t\t\t,-0.92388\n\t\t\t\t,-0.382683\n\t\t\t\t,0.45413\n\t\t\t\t,-0.629987\n\t\t\t\t,-0.629987\n\t\t\t\t,-0.454129\n\t\t\t\t,-0.340947\n\t\t\t\t,-0.823118\n\t\t\t\t,1.02254e-007\n\t\t\t\t,-0.707107\n\t\t\t\t,-0.707107\n\t\t\t\t,-0.454128\n\t\t\t\t,-0.629987\n\t\t\t\t,-0.629987\n\t\t\t\t,1.00325e-007\n\t\t\t\t,-0.382684\n\t\t\t\t,-0.923879\n\t\t\t\t,0.45413\n\t\t\t\t,-0.340947\n\t\t\t\t,-0.823117\n\t\t\t\t,0.45413\n\t\t\t\t,-0.629987\n\t\t\t\t,-0.629987\n\t\t\t\t,1.02254e-007\n\t\t\t\t,-0.707107\n\t\t\t\t,-0.707107\n\t\t\t\t,1.00325e-007\n\t\t\t\t,-0.382684\n\t\t\t\t,-0.923879\n\t\t\t\t,1.04184e-007\n\t\t\t\t,0\n\t\t\t\t,-1\n\t\t\t\t,1.00325e-007\n\t\t\t\t,-0.382684\n\t\t\t\t,-0.923879\n\t\t\t\t,-0.454129\n\t\t\t\t,-0.340947\n\t\t\t\t,-0.823118\n\t\t\t\t,-0.454129\n\t\t\t\t,0\n\t\t\t\t,-0.890936\n\t\t\t\t,1.04184e-007\n\t\t\t\t,0\n\t\t\t\t,-1\n\t\t\t\t,0.45413\n\t\t\t\t,-0.340947\n\t\t\t\t,-0.823117\n\t\t\t\t,1.00325e-007\n\t\t\t\t,-0.382684\n\t\t\t\t,-0.923879\n\t\t\t\t,0.45413\n\t\t\t\t,0\n\t\t\t\t,-0.890935\n\t\t\t\t,-0.454129\n\t\t\t\t,0.340947\n\t\t\t\t,-0.823118\n\t\t\t\t,1.04184e-007\n\t\t\t\t,0\n\t\t\t\t,-1\n\t\t\t\t,-0.454129\n\t\t\t\t,0\n\t\t\t\t,-0.890936\n\t\t\t\t,1.00325e-007\n\t\t\t\t,0.382684\n\t\t\t\t,-0.92388\n\t\t\t\t,0.45413\n\t\t\t\t,0.340946\n\t\t\t\t,-0.823117\n\t\t\t\t,0.45413\n\t\t\t\t,0\n\t\t\t\t,-0.890935\n\t\t\t\t,1.04184e-007\n\t\t\t\t,0\n\t\t\t\t,-1\n\t\t\t\t,1.00325e-007\n\t\t\t\t,0.382684\n\t\t\t\t,-0.92388\n\t\t\t\t,1.00325e-007\n\t\t\t\t,0.707107\n\t\t\t\t,-0.707107\n\t\t\t\t,1.00325e-007\n\t\t\t\t,0.382684\n\t\t\t\t,-0.92388\n\t\t\t\t,-0.454129\n\t\t\t\t,0.340947\n\t\t\t\t,-0.823118\n\t\t\t\t,-0.454129\n\t\t\t\t,0.629987\n\t\t\t\t,-0.629987\n\t\t\t\t,1.00325e-007\n\t\t\t\t,0.707107\n\t\t\t\t,-0.707107\n\t\t\t\t,0.45413\n\t\t\t\t,0.340946\n\t\t\t\t,-0.823117\n\t\t\t\t,1.00325e-007\n\t\t\t\t,0.382684\n\t\t\t\t,-0.92388\n\t\t\t\t,0.45413\n\t\t\t\t,0.629986\n\t\t\t\t,-0.629987\n\t\t\t\t,-0.454129\n\t\t\t\t,0.823118\n\t\t\t\t,-0.340947\n\t\t\t\t,1.00325e-007\n\t\t\t\t,0.707107\n\t\t\t\t,-0.707107\n\t\t\t\t,-0.454129\n\t\t\t\t,0.629987\n\t\t\t\t,-0.629987\n\t\t\t\t,1.04184e-007\n\t\t\t\t,0.92388\n\t\t\t\t,-0.382683\n\t\t\t\t,0.45413\n\t\t\t\t,0.823117\n\t\t\t\t,-0.340946\n\t\t\t\t,0.45413\n\t\t\t\t,0.629986\n\t\t\t\t,-0.629987\n\t\t\t\t,1.00325e-007\n\t\t\t\t,0.707107\n\t\t\t\t,-0.707107\n\t\t\t\t,1.04184e-007\n\t\t\t\t,0.92388\n\t\t\t\t,-0.382683\n\t\t\t\t,1.04184e-007\n\t\t\t\t,1\n\t\t\t\t,0\n\t\t\t\t,1.04184e-007\n\t\t\t\t,0.92388\n\t\t\t\t,-0.382683\n\t\t\t\t,-0.454129\n\t\t\t\t,0.823118\n\t\t\t\t,-0.340947\n\t\t\t\t,-0.454129\n\t\t\t\t,0.890936\n\t\t\t\t,0\n\t\t\t\t,1.04184e-007\n\t\t\t\t,1\n\t\t\t\t,0\n\t\t\t\t,0.45413\n\t\t\t\t,0.823117\n\t\t\t\t,-0.340946\n\t\t\t\t,1.04184e-007\n\t\t\t\t,0.92388\n\t\t\t\t,-0.382683\n\t\t\t\t,0.45413\n\t\t\t\t,0.890935\n\t\t\t\t,0\n\t\t\t\t,-1\n\t\t\t\t,0\n\t\t\t\t,0\n\t\t\t\t,-0.853101\n\t\t\t\t,-0.467764\n\t\t\t\t,-0.231118\n\t\t\t\t,-0.853097\n\t\t\t\t,-0.520609\n\t\t\t\t,-0.0345183\n\t\t\t\t,0.91976\n\t\t\t\t,0.362606\n\t\t\t\t,0.150197\n\t\t\t\t,1\n\t\t\t\t,0\n\t\t\t\t,0\n\t\t\t\t,0.854735\n\t\t\t\t,0.519065\n\t\t\t\t,1.4012e-007\n\t\t\t\t,-0.454129\n\t\t\t\t,0.823118\n\t\t\t\t,0.340946\n\t\t\t\t,-0.454129\n\t\t\t\t,0.890936\n\t\t\t\t,2.80027e-007\n\t\t\t\t,-0.992581\n\t\t\t\t,0.116804\n\t\t\t\t,0.0337532\n\t\t\t\t,-0.961402\n\t\t\t\t,-0.268379\n\t\t\t\t,-0.0606564\n\t\t\t\t,0.45413\n\t\t\t\t,0.823117\n\t\t\t\t,0.340946\n\t\t\t\t,0.45413\n\t\t\t\t,0.890935\n\t\t\t\t,2.83971e-007\n\t\t\t\t,-0.853102\n\t\t\t\t,-0.343712\n\t\t\t\t,-0.392528\n\t\t\t\t,0.854735\n\t\t\t\t,0.367035\n\t\t\t\t,0.367035\n\t\t\t\t,-0.992581\n\t\t\t\t,0.0587307\n\t\t\t\t,0.106462\n\t\t\t\t,-0.454129\n\t\t\t\t,0.629987\n\t\t\t\t,0.629987\n\t\t\t\t,0.45413\n\t\t\t\t,0.629986\n\t\t\t\t,0.629987\n\t\t\t\t,-0.853101\n\t\t\t\t,-0.167336\n\t\t\t\t,-0.494183\n\t\t\t\t,0.919759\n\t\t\t\t,0.150197\n\t\t\t\t,0.362607\n\t\t\t\t,-0.454128\n\t\t\t\t,0.340946\n\t\t\t\t,0.823118\n\t\t\t\t,-0.961404\n\t\t\t\t,-0.146879\n\t\t\t\t,-0.232654\n\t\t\t\t,0.454129\n\t\t\t\t,0.340946\n\t\t\t\t,0.823117\n\t\t\t\t,-0.8531\n\t\t\t\t,0.034517\n\t\t\t\t,-0.520604\n\t\t\t\t,0.854734\n\t\t\t\t,0\n\t\t\t\t,0.519066\n\t\t\t\t,-0.992581\n\t\t\t\t,-0.0337527\n\t\t\t\t,0.116809\n\t\t\t\t,-0.454128\n\t\t\t\t,0\n\t\t\t\t,0.890936\n\t\t\t\t,0.454129\n\t\t\t\t,0\n\t\t\t\t,0.890936\n\t\t\t\t,-0.853099\n\t\t\t\t,0.231119\n\t\t\t\t,-0.467768\n\t\t\t\t,0.919759\n\t\t\t\t,-0.150197\n\t\t\t\t,0.362607\n\t\t\t\t,-0.454128\n\t\t\t\t,-0.340947\n\t\t\t\t,0.823118\n\t\t\t\t,-0.961402\n\t\t\t\t,0.0606552\n\t\t\t\t,-0.268377\n\t\t\t\t,0.454129\n\t\t\t\t,-0.340946\n\t\t\t\t,0.823117\n\t\t\t\t,-0.853095\n\t\t\t\t,0.392537\n\t\t\t\t,-0.34372\n\t\t\t\t,0.854734\n\t\t\t\t,-0.367035\n\t\t\t\t,0.367035\n\t\t\t\t,-0.992581\n\t\t\t\t,-0.106458\n\t\t\t\t,0.0587268\n\t\t\t\t,-0.454128\n\t\t\t\t,-0.629987\n\t\t\t\t,0.629987\n\t\t\t\t,0.45413\n\t\t\t\t,-0.629986\n\t\t\t\t,0.629987\n\t\t\t\t,-0.853096\n\t\t\t\t,0.494192\n\t\t\t\t,-0.167335\n\t\t\t\t,0.91976\n\t\t\t\t,-0.362606\n\t\t\t\t,0.150196\n\t\t\t\t,-0.454128\n\t\t\t\t,-0.823118\n\t\t\t\t,0.340946\n\t\t\t\t,-0.961398\n\t\t\t\t,0.232674\n\t\t\t\t,-0.146889\n\t\t\t\t,0.45413\n\t\t\t\t,-0.823117\n\t\t\t\t,0.340946\n\t\t\t\t,-0.853098\n\t\t\t\t,0.520607\n\t\t\t\t,0.0345189\n\t\t\t\t,0.854735\n\t\t\t\t,-0.519065\n\t\t\t\t,1.37425e-007\n\t\t\t\t,-0.992581\n\t\t\t\t,-0.116805\n\t\t\t\t,-0.0337485\n\t\t\t\t,-0.454128\n\t\t\t\t,-0.890936\n\t\t\t\t,2.76083e-007\n\t\t\t\t,0.45413\n\t\t\t\t,-0.890936\n\t\t\t\t,2.80027e-007\n\t\t\t\t,-0.853093\n\t\t\t\t,0.467778\n\t\t\t\t,0.231118\n\t\t\t\t,0.91976\n\t\t\t\t,-0.362606\n\t\t\t\t,-0.150196\n\t\t\t\t,-0.454129\n\t\t\t\t,-0.823118\n\t\t\t\t,-0.340946\n\t\t\t\t,-0.9614\n\t\t\t\t,0.268387\n\t\t\t\t,0.0606525\n\t\t\t\t,0.45413\n\t\t\t\t,-0.823117\n\t\t\t\t,-0.340946\n\t\t\t\t,-0.853096\n\t\t\t\t,0.343719\n\t\t\t\t,0.392535\n\t\t\t\t,0.854735\n\t\t\t\t,-0.367034\n\t\t\t\t,-0.367034\n\t\t\t\t,-0.992581\n\t\t\t\t,-0.0587251\n\t\t\t\t,-0.106458\n\t\t\t\t,-0.454128\n\t\t\t\t,-0.629987\n\t\t\t\t,-0.629987\n\t\t\t\t,0.45413\n\t\t\t\t,-0.629987\n\t\t\t\t,-0.629987\n\t\t\t\t,-0.853099\n\t\t\t\t,0.167338\n\t\t\t\t,0.494187\n\t\t\t\t,0.91976\n\t\t\t\t,-0.150196\n\t\t\t\t,-0.362606\n\t\t\t\t,-0.454129\n\t\t\t\t,-0.340947\n\t\t\t\t,-0.823117\n\t\t\t\t,-0.961401\n\t\t\t\t,0.146885\n\t\t\t\t,0.232664\n\t\t\t\t,0.45413\n\t\t\t\t,-0.340946\n\t\t\t\t,-0.823117\n\t\t\t\t,-0.8531\n\t\t\t\t,-0.0345193\n\t\t\t\t,0.520605\n\t\t\t\t,0.854735\n\t\t\t\t,0\n\t\t\t\t,-0.519064\n\t\t\t\t,-0.992581\n\t\t\t\t,0.0337517\n\t\t\t\t,-0.116805\n\t\t\t\t,-0.454129\n\t\t\t\t,0\n\t\t\t\t,-0.890936\n\t\t\t\t,0.45413\n\t\t\t\t,0\n\t\t\t\t,-0.890935\n\t\t\t\t,-0.853103\n\t\t\t\t,-0.231117\n\t\t\t\t,0.467762\n\t\t\t\t,0.91976\n\t\t\t\t,0.150196\n\t\t\t\t,-0.362606\n\t\t\t\t,-0.454129\n\t\t\t\t,0.340946\n\t\t\t\t,-0.823117\n\t\t\t\t,-0.961403\n\t\t\t\t,-0.0606557\n\t\t\t\t,0.268376\n\t\t\t\t,0.45413\n\t\t\t\t,0.340946\n\t\t\t\t,-0.823117\n\t\t\t\t,-0.853103\n\t\t\t\t,-0.392528\n\t\t\t\t,0.343712\n\t\t\t\t,0.854735\n\t\t\t\t,0.367034\n\t\t\t\t,-0.367034\n\t\t\t\t,-0.992581\n\t\t\t\t,0.106462\n\t\t\t\t,-0.0587312\n\t\t\t\t,-0.454129\n\t\t\t\t,0.629987\n\t\t\t\t,-0.629987\n\t\t\t\t,0.45413\n\t\t\t\t,0.629986\n\t\t\t\t,-0.629987\n\t\t\t\t,-0.853099\n\t\t\t\t,-0.494187\n\t\t\t\t,0.167338\n\t\t\t\t,0.91976\n\t\t\t\t,0.362606\n\t\t\t\t,-0.150196\n\t\t\t\t,-0.454129\n\t\t\t\t,0.823118\n\t\t\t\t,-0.340946\n\t\t\t\t,-0.961403\n\t\t\t\t,-0.232658\n\t\t\t\t,0.146881\n\t\t\t\t,0.45413\n\t\t\t\t,0.823117\n\t\t\t\t,-0.340946\n\t\t\t\t,-0.454129\n\t\t\t\t,0.823118\n\t\t\t\t,0.340946\n\t\t\t\t,1.04184e-007\n\t\t\t\t,1\n\t\t\t\t,1.52417e-007\n\t\t\t\t,-0.454129\n\t\t\t\t,0.890936\n\t\t\t\t,2.80027e-007\n\t\t\t\t,1.04184e-007\n\t\t\t\t,0.923879\n\t\t\t\t,0.382684\n\t\t\t\t,0.45413\n\t\t\t\t,0.823117\n\t\t\t\t,0.340946\n\t\t\t\t,0.45413\n\t\t\t\t,0.890935\n\t\t\t\t,2.83971e-007\n\t\t\t\t,1.04184e-007\n\t\t\t\t,1\n\t\t\t\t,1.52417e-007\n\t\t\t\t,1.04184e-007\n\t\t\t\t,0.923879\n\t\t\t\t,0.382684\n\t\t\t\t,1.04184e-007\n\t\t\t\t,0.707107\n\t\t\t\t,0.707107\n\t\t\t\t,1.04184e-007\n\t\t\t\t,0.923879\n\t\t\t\t,0.382684\n\t\t\t\t,-0.454129\n\t\t\t\t,0.823118\n\t\t\t\t,0.340946\n\t\t\t\t,-0.454129\n\t\t\t\t,0.629987\n\t\t\t\t,0.629987\n\t\t\t\t,1.04184e-007\n\t\t\t\t,0.707107\n\t\t\t\t,0.707107\n\t\t\t\t,0.45413\n\t\t\t\t,0.823117\n\t\t\t\t,0.340946\n\t\t\t\t,1.04184e-007\n\t\t\t\t,0.923879\n\t\t\t\t,0.382684\n\t\t\t\t,0.45413\n\t\t\t\t,0.629986\n\t\t\t\t,0.629987\n\t\t\t\t,-0.454128\n\t\t\t\t,0.340946\n\t\t\t\t,0.823118\n\t\t\t\t,1.04184e-007\n\t\t\t\t,0.707107\n\t\t\t\t,0.707107\n\t\t\t\t,-0.454129\n\t\t\t\t,0.629987\n\t\t\t\t,0.629987\n\t\t\t\t,1.04184e-007\n\t\t\t\t,0.382683\n\t\t\t\t,0.92388\n\t\t\t\t,0.454129\n\t\t\t\t,0.340946\n\t\t\t\t,0.823117\n\t\t\t\t,0.45413\n\t\t\t\t,0.629986\n\t\t\t\t,0.629987\n\t\t\t\t,1.04184e-007\n\t\t\t\t,0.707107\n\t\t\t\t,0.707107\n\t\t\t\t,1.04184e-007\n\t\t\t\t,0.382683\n\t\t\t\t,0.92388\n\t\t\t\t,1.04184e-007\n\t\t\t\t,0\n\t\t\t\t,1\n\t\t\t\t,1.04184e-007\n\t\t\t\t,0.382683\n\t\t\t\t,0.92388\n\t\t\t\t,-0.454128\n\t\t\t\t,0.340946\n\t\t\t\t,0.823118\n\t\t\t\t,-0.454128\n\t\t\t\t,0\n\t\t\t\t,0.890936\n\t\t\t\t,1.04184e-007\n\t\t\t\t,0\n\t\t\t\t,1\n\t\t\t\t,0.454129\n\t\t\t\t,0.340946\n\t\t\t\t,0.823117\n\t\t\t\t,1.04184e-007\n\t\t\t\t,0.382683\n\t\t\t\t,0.92388\n\t\t\t\t,0.454129\n\t\t\t\t,0\n\t\t\t\t,0.890936\n\t\t\t\t,-0.454128\n\t\t\t\t,-0.340947\n\t\t\t\t,0.823118\n\t\t\t\t,1.04184e-007\n\t\t\t\t,0\n\t\t\t\t,1\n\t\t\t\t,-0.454128\n\t\t\t\t,0\n\t\t\t\t,0.890936\n\t\t\t\t,1.00325e-007\n\t\t\t\t,-0.382684\n\t\t\t\t,0.923879\n\t\t\t\t,0.454129\n\t\t\t\t,-0.340946\n\t\t\t\t,0.823117\n\t\t\t\t,0.454129\n\t\t\t\t,0\n\t\t\t\t,0.890936\n\t\t\t\t,1.04184e-007\n\t\t\t\t,0\n\t\t\t\t,1\n\t\t\t\t,1.00325e-007\n\t\t\t\t,-0.382684\n\t\t\t\t,0.923879\n\t\t\t\t,1.00325e-007\n\t\t\t\t,-0.707107\n\t\t\t\t,0.707107\n\t\t\t\t,1.00325e-007\n\t\t\t\t,-0.382684\n\t\t\t\t,0.923879\n\t\t\t\t,-0.454128\n\t\t\t\t,-0.340947\n\t\t\t\t,0.823118\n\t\t\t\t,-0.454128\n\t\t\t\t,-0.629987\n\t\t\t\t,0.629987\n\t\t\t\t,1.00325e-007\n\t\t\t\t,-0.707107\n\t\t\t\t,0.707107\n\t\t\t\t,0.454129\n\t\t\t\t,-0.340946\n\t\t\t\t,0.823117\n\t\t\t\t,1.00325e-007\n\t\t\t\t,-0.382684\n\t\t\t\t,0.923879\n\t\t\t\t,0.45413\n\t\t\t\t,-0.629986\n\t\t\t\t,0.629987\n\t\t\t\t,-0.454128\n\t\t\t\t,-0.823118\n\t\t\t\t,0.340946\n\t\t\t\t,1.00325e-007\n\t\t\t\t,-0.707107\n\t\t\t\t,0.707107\n\t\t\t\t,-0.454128\n\t\t\t\t,-0.629987\n\t\t\t\t,0.629987\n\t\t\t\t,1.04184e-007\n\t\t\t\t,-0.923879\n\t\t\t\t,0.382684\n\t\t\t\t,0.45413\n\t\t\t\t,-0.823117\n\t\t\t\t,0.340946\n\t\t\t\t,0.45413\n\t\t\t\t,-0.629986\n\t\t\t\t,0.629987\n\t\t\t\t,1.00325e-007\n\t\t\t\t,-0.707107\n\t\t\t\t,0.707107\n\t\t\t\t,1.04184e-007\n\t\t\t\t,-0.923879\n\t\t\t\t,0.382684\n\t\t\t\t,1.06113e-007\n\t\t\t\t,-1\n\t\t\t\t,1.52417e-007\n\t\t\t\t,1.04184e-007\n\t\t\t\t,-0.923879\n\t\t\t\t,0.382684\n\t\t\t\t,-0.454128\n\t\t\t\t,-0.823118\n\t\t\t\t,0.340946\n\t\t\t\t,-0.454128\n\t\t\t\t,-0.890936\n\t\t\t\t,2.76083e-007\n\t\t\t\t,1.06113e-007\n\t\t\t\t,-1\n\t\t\t\t,1.52417e-007\n\t\t\t\t,0.45413\n\t\t\t\t,-0.823117\n\t\t\t\t,0.340946\n\t\t\t\t,1.04184e-007\n\t\t\t\t,-0.923879\n\t\t\t\t,0.382684\n\t\t\t\t,0.45413\n\t\t\t\t,-0.890936\n\t\t\t\t,2.80027e-007\n\t\t\t\t,-0.454129\n\t\t\t\t,-0.823118\n\t\t\t\t,-0.340946\n\t\t\t\t,1.06113e-007\n\t\t\t\t,-1\n\t\t\t\t,1.52417e-007\n\t\t\t\t,-0.454128\n\t\t\t\t,-0.890936\n\t\t\t\t,2.76083e-007\n\t\t\t\t,1.04184e-007\n\t\t\t\t,-0.92388\n\t\t\t\t,-0.382683\n\t\t\t\t,0.45413\n\t\t\t\t,-0.823117\n\t\t\t\t,-0.340946\n\t\t\t\t,0.45413\n\t\t\t\t,-0.890936\n\t\t\t\t,2.80027e-007\n\t\t\t\t,1.06113e-007\n\t\t\t\t,-1\n\t\t\t\t,1.52417e-007\n\t\t\t\t,1.04184e-007\n\t\t\t\t,-0.92388\n\t\t\t\t,-0.382683\n\t\t\t\t,1.00325e-007\n\t\t\t\t,-0.707107\n\t\t\t\t,-0.707107\n\t\t\t\t,1.04184e-007\n\t\t\t\t,-0.92388\n\t\t\t\t,-0.382683\n\t\t\t\t,-0.454129\n\t\t\t\t,-0.823118\n\t\t\t\t,-0.340946\n\t\t\t\t,-0.454128\n\t\t\t\t,-0.629987\n\t\t\t\t,-0.629987\n\t\t\t\t,1.00325e-007\n\t\t\t\t,-0.707107\n\t\t\t\t,-0.707107\n\t\t\t\t,0.45413\n\t\t\t\t,-0.823117\n\t\t\t\t,-0.340946\n\t\t\t\t,1.04184e-007\n\t\t\t\t,-0.92388\n\t\t\t\t,-0.382683\n\t\t\t\t,0.45413\n\t\t\t\t,-0.629987\n\t\t\t\t,-0.629987\n\t\t\t\t,-0.454129\n\t\t\t\t,-0.340947\n\t\t\t\t,-0.823117\n\t\t\t\t,1.00325e-007\n\t\t\t\t,-0.707107\n\t\t\t\t,-0.707107\n\t\t\t\t,-0.454128\n\t\t\t\t,-0.629987\n\t\t\t\t,-0.629987\n\t\t\t\t,1.00325e-007\n\t\t\t\t,-0.382684\n\t\t\t\t,-0.92388\n\t\t\t\t,0.45413\n\t\t\t\t,-0.340946\n\t\t\t\t,-0.823117\n\t\t\t\t,0.45413\n\t\t\t\t,-0.629987\n\t\t\t\t,-0.629987\n\t\t\t\t,1.00325e-007\n\t\t\t\t,-0.707107\n\t\t\t\t,-0.707107\n\t\t\t\t,1.00325e-007\n\t\t\t\t,-0.382684\n\t\t\t\t,-0.92388\n\t\t\t\t,1.04184e-007\n\t\t\t\t,0\n\t\t\t\t,-1\n\t\t\t\t,1.00325e-007\n\t\t\t\t,-0.382684\n\t\t\t\t,-0.92388\n\t\t\t\t,-0.454129\n\t\t\t\t,-0.340947\n\t\t\t\t,-0.823117\n\t\t\t\t,-0.454129\n\t\t\t\t,0\n\t\t\t\t,-0.890936\n\t\t\t\t,1.04184e-007\n\t\t\t\t,0\n\t\t\t\t,-1\n\t\t\t\t,0.45413\n\t\t\t\t,-0.340946\n\t\t\t\t,-0.823117\n\t\t\t\t,1.00325e-007\n\t\t\t\t,-0.382684\n\t\t\t\t,-0.92388\n\t\t\t\t,0.45413\n\t\t\t\t,0\n\t\t\t\t,-0.890935\n\t\t\t\t,-0.454129\n\t\t\t\t,0.340946\n\t\t\t\t,-0.823117\n\t\t\t\t,1.04184e-007\n\t\t\t\t,0\n\t\t\t\t,-1\n\t\t\t\t,-0.454129\n\t\t\t\t,0\n\t\t\t\t,-0.890936\n\t\t\t\t,1.00325e-007\n\t\t\t\t,0.382683\n\t\t\t\t,-0.92388\n\t\t\t\t,0.45413\n\t\t\t\t,0.340946\n\t\t\t\t,-0.823117\n\t\t\t\t,0.45413\n\t\t\t\t,0\n\t\t\t\t,-0.890935\n\t\t\t\t,1.04184e-007\n\t\t\t\t,0\n\t\t\t\t,-1\n\t\t\t\t,1.00325e-007\n\t\t\t\t,0.382683\n\t\t\t\t,-0.92388\n\t\t\t\t,1.02254e-007\n\t\t\t\t,0.707107\n\t\t\t\t,-0.707107\n\t\t\t\t,1.00325e-007\n\t\t\t\t,0.382683\n\t\t\t\t,-0.92388\n\t\t\t\t,-0.454129\n\t\t\t\t,0.340946\n\t\t\t\t,-0.823117\n\t\t\t\t,-0.454129\n\t\t\t\t,0.629987\n\t\t\t\t,-0.629987\n\t\t\t\t,1.02254e-007\n\t\t\t\t,0.707107\n\t\t\t\t,-0.707107\n\t\t\t\t,0.45413\n\t\t\t\t,0.340946\n\t\t\t\t,-0.823117\n\t\t\t\t,1.00325e-007\n\t\t\t\t,0.382683\n\t\t\t\t,-0.92388\n\t\t\t\t,0.45413\n\t\t\t\t,0.629986\n\t\t\t\t,-0.629987\n\t\t\t\t,-0.454129\n\t\t\t\t,0.823118\n\t\t\t\t,-0.340946\n\t\t\t\t,1.02254e-007\n\t\t\t\t,0.707107\n\t\t\t\t,-0.707107\n\t\t\t\t,-0.454129\n\t\t\t\t,0.629987\n\t\t\t\t,-0.629987\n\t\t\t\t,1.04184e-007\n\t\t\t\t,0.92388\n\t\t\t\t,-0.382683\n\t\t\t\t,0.45413\n\t\t\t\t,0.823117\n\t\t\t\t,-0.340946\n\t\t\t\t,0.45413\n\t\t\t\t,0.629986\n\t\t\t\t,-0.629987\n\t\t\t\t,1.02254e-007\n\t\t\t\t,0.707107\n\t\t\t\t,-0.707107\n\t\t\t\t,1.04184e-007\n\t\t\t\t,0.92388\n\t\t\t\t,-0.382683\n\t\t\t\t,1.04184e-007\n\t\t\t\t,1\n\t\t\t\t,1.52417e-007\n\t\t\t\t,1.04184e-007\n\t\t\t\t,0.92388\n\t\t\t\t,-0.382683\n\t\t\t\t,-0.454129\n\t\t\t\t,0.823118\n\t\t\t\t,-0.340946\n\t\t\t\t,-0.454129\n\t\t\t\t,0.890936\n\t\t\t\t,2.80027e-007\n\t\t\t\t,1.04184e-007\n\t\t\t\t,1\n\t\t\t\t,1.52417e-007\n\t\t\t\t,0.45413\n\t\t\t\t,0.823117\n\t\t\t\t,-0.340946\n\t\t\t\t,1.04184e-007\n\t\t\t\t,0.92388\n\t\t\t\t,-0.382683\n\t\t\t\t,0.45413\n\t\t\t\t,0.890935\n\t\t\t\t,2.83971e-007\n\t\t\t\t,0.705467\n\t\t\t\t,0.621141\n\t\t\t\t,-0.341322\n\t\t\t\t,0.705467\n\t\t\t\t,-0.677007\n\t\t\t\t,0.209709\n\t\t\t\t,0.705467\n\t\t\t\t,0.621141\n\t\t\t\t,-0.341322\n\t\t\t\t,0.705467\n\t\t\t\t,-0.677007\n\t\t\t\t,0.209709\n\t\t\t\t,-0.705467\n\t\t\t\t,0.621141\n\t\t\t\t,-0.341322\n\t\t\t\t,-0.705467\n\t\t\t\t,-0.677007\n\t\t\t\t,0.209709\n\t\t\t\t,-0.705467\n\t\t\t\t,0.621141\n\t\t\t\t,-0.341322\n\t\t\t\t,-0.705467\n\t\t\t\t,-0.677007\n\t\t\t\t,0.209709\n\t\t\t\t,-0.705467\n\t\t\t\t,0.621141\n\t\t\t\t,-0.341322\n\t\t\t\t,-0.705467\n\t\t\t\t,0.621141\n\t\t\t\t,-0.341322\n\t\t\t\t,0.705467\n\t\t\t\t,0.621141\n\t\t\t\t,-0.341322\n\t\t\t\t,0.705467\n\t\t\t\t,0.621141\n\t\t\t\t,-0.341322\n\t\t\t\t,-0.705467\n\t\t\t\t,-0.677007\n\t\t\t\t,0.209709\n\t\t\t\t,-0.705467\n\t\t\t\t,-0.677007\n\t\t\t\t,0.209709\n\t\t\t\t,0.705467\n\t\t\t\t,-0.677007\n\t\t\t\t,0.209709\n\t\t\t\t,0.705467\n\t\t\t\t,-0.677007\n\t\t\t\t,0.209709\n\t\t\t\t,0.0881405\n\t\t\t\t,0.92773\n\t\t\t\t,0.362697\n\t\t\t\t,-0.0749899\n\t\t\t\t,-0.365697\n\t\t\t\t,0.927708\n\t\t\t\t,0.0608426\n\t\t\t\t,0.923563\n\t\t\t\t,0.378589\n\t\t\t\t,-0.0813766\n\t\t\t\t,-0.382524\n\t\t\t\t,0.920355\n\t\t\t\t,0.275718\n\t\t\t\t,0.736009\n\t\t\t\t,0.61828\n\t\t\t\t,0.751143\n\t\t\t\t,-0.42708\n\t\t\t\t,0.503375\n\t\t\t\t,0.835658\n\t\t\t\t,0.378604\n\t\t\t\t,-0.397913\n\t\t\t\t,0.795017\n\t\t\t\t,-0.480746\n\t\t\t\t,-0.369907\n\t\t\t\t,0.338016\n\t\t\t\t,0.398803\n\t\t\t\t,-0.852468\n\t\t\t\t,0.304401\n\t\t\t\t,-0.885556\n\t\t\t\t,-0.3509\n\t\t\t\t,-0.245002\n\t\t\t\t,0.375557\n\t\t\t\t,-0.89383\n\t\t\t\t,-0.320398\n\t\t\t\t,-0.89276\n\t\t\t\t,-0.316741\n\t\t\t\t,-0.760775\n\t\t\t\t,0.0737597\n\t\t\t\t,-0.644811\n\t\t\t\t,-0.833618\n\t\t\t\t,-0.552225\n\t\t\t\t,-0.0113731\n\t\t\t\t,-0.714682\n\t\t\t\t,0.698376\n\t\t\t\t,0.0387337\n\t\t\t\t,-0.308052\n\t\t\t\t,-0.0591974\n\t\t\t\t,0.949526\n\t\t\t\t,0.0881405\n\t\t\t\t,0.92773\n\t\t\t\t,0.362697\n\t\t\t\t,0.0608426\n\t\t\t\t,0.923563\n\t\t\t\t,0.378589\n\t\t\t\t,-0.320398\n\t\t\t\t,-0.89276\n\t\t\t\t,-0.316741\n\t\t\t\t,0.304401\n\t\t\t\t,-0.885556\n\t\t\t\t,-0.3509\n\t\t\t\t,0.275718\n\t\t\t\t,0.736009\n\t\t\t\t,0.61828\n\t\t\t\t,0.751143\n\t\t\t\t,-0.42708\n\t\t\t\t,0.503375\n\t\t\t\t,0.275718\n\t\t\t\t,0.736009\n\t\t\t\t,0.61828\n\t\t\t\t,0.751143\n\t\t\t\t,-0.42708\n\t\t\t\t,0.503375\n\t\t\t\t,0.304401\n\t\t\t\t,-0.885556\n\t\t\t\t,-0.3509\n\t\t\t\t,0.795017\n\t\t\t\t,-0.480746\n\t\t\t\t,-0.369907\n\t\t\t\t,-0.714682\n\t\t\t\t,0.698376\n\t\t\t\t,0.0387337\n\t\t\t\t,-0.833618\n\t\t\t\t,-0.552225\n\t\t\t\t,-0.0113731\n\t\t\t\t,-0.308052\n\t\t\t\t,-0.0591974\n\t\t\t\t,0.949526\n\t\t\t\t,-0.714682\n\t\t\t\t,0.698376\n\t\t\t\t,0.0387337\n\t\t\t\t,-0.705467\n\t\t\t\t,0.621141\n\t\t\t\t,-0.341322\n\t\t\t\t,-0.705467\n\t\t\t\t,-0.677007\n\t\t\t\t,0.209709\n\t\t\t\t,-0.705467\n\t\t\t\t,0.621141\n\t\t\t\t,-0.341322\n\t\t\t\t,-0.705467\n\t\t\t\t,-0.677007\n\t\t\t\t,0.209709\n\t\t\t\t,0.705467\n\t\t\t\t,0.621141\n\t\t\t\t,-0.341322\n\t\t\t\t,0.705467\n\t\t\t\t,-0.677007\n\t\t\t\t,0.209709\n\t\t\t\t,0.705467\n\t\t\t\t,0.621141\n\t\t\t\t,-0.341322\n\t\t\t\t,0.705467\n\t\t\t\t,-0.677007\n\t\t\t\t,0.209709\n\t\t\t\t,-0.705467\n\t\t\t\t,0.621141\n\t\t\t\t,-0.341322\n\t\t\t\t,0.705467\n\t\t\t\t,0.621141\n\t\t\t\t,-0.341322\n\t\t\t\t,0.705467\n\t\t\t\t,0.621141\n\t\t\t\t,-0.341322\n\t\t\t\t,-0.705467\n\t\t\t\t,0.621141\n\t\t\t\t,-0.341322\n\t\t\t\t,-0.705467\n\t\t\t\t,-0.677007\n\t\t\t\t,0.209709\n\t\t\t\t,0.705467\n\t\t\t\t,-0.677007\n\t\t\t\t,0.209709\n\t\t\t\t,0.705467\n\t\t\t\t,-0.677007\n\t\t\t\t,0.209709\n\t\t\t\t,-0.705467\n\t\t\t\t,-0.677007\n\t\t\t\t,0.209709\n\t\t\t\t,-0.0608426\n\t\t\t\t,0.923563\n\t\t\t\t,0.378589\n\t\t\t\t,0.0749899\n\t\t\t\t,-0.365697\n\t\t\t\t,0.927708\n\t\t\t\t,-0.0881405\n\t\t\t\t,0.92773\n\t\t\t\t,0.362697\n\t\t\t\t,0.0813766\n\t\t\t\t,-0.382524\n\t\t\t\t,0.920355\n\t\t\t\t,-0.835658\n\t\t\t\t,0.378604\n\t\t\t\t,-0.397913\n\t\t\t\t,-0.751143\n\t\t\t\t,-0.42708\n\t\t\t\t,0.503375\n\t\t\t\t,-0.275718\n\t\t\t\t,0.736009\n\t\t\t\t,0.61828\n\t\t\t\t,-0.795017\n\t\t\t\t,-0.480746\n\t\t\t\t,-0.369907\n\t\t\t\t,0.245002\n\t\t\t\t,0.375557\n\t\t\t\t,-0.89383\n\t\t\t\t,-0.304401\n\t\t\t\t,-0.885556\n\t\t\t\t,-0.3509\n\t\t\t\t,-0.338016\n\t\t\t\t,0.398803\n\t\t\t\t,-0.852468\n\t\t\t\t,0.320398\n\t\t\t\t,-0.89276\n\t\t\t\t,-0.316741\n\t\t\t\t,0.714682\n\t\t\t\t,0.698376\n\t\t\t\t,0.0387337\n\t\t\t\t,0.833618\n\t\t\t\t,-0.552225\n\t\t\t\t,-0.0113731\n\t\t\t\t,0.760775\n\t\t\t\t,0.0737597\n\t\t\t\t,-0.644811\n\t\t\t\t,0.308052\n\t\t\t\t,-0.0591974\n\t\t\t\t,0.949526\n\t\t\t\t,-0.0881405\n\t\t\t\t,0.92773\n\t\t\t\t,0.362697\n\t\t\t\t,-0.0608426\n\t\t\t\t,0.923563\n\t\t\t\t,0.378589\n\t\t\t\t,0.320398\n\t\t\t\t,-0.89276\n\t\t\t\t,-0.316741\n\t\t\t\t,-0.304401\n\t\t\t\t,-0.885556\n\t\t\t\t,-0.3509\n\t\t\t\t,-0.275718\n\t\t\t\t,0.736009\n\t\t\t\t,0.61828\n\t\t\t\t,-0.751143\n\t\t\t\t,-0.42708\n\t\t\t\t,0.503375\n\t\t\t\t,-0.835658\n\t\t\t\t,0.378604\n\t\t\t\t,-0.397913\n\t\t\t\t,-0.275718\n\t\t\t\t,0.736009\n\t\t\t\t,0.61828\n\t\t\t\t,-0.304401\n\t\t\t\t,-0.885556\n\t\t\t\t,-0.3509\n\t\t\t\t,-0.795017\n\t\t\t\t,-0.480746\n\t\t\t\t,-0.369907\n\t\t\t\t,-0.835658\n\t\t\t\t,0.378604\n\t\t\t\t,-0.397913\n\t\t\t\t,0.760775\n\t\t\t\t,0.0737597\n\t\t\t\t,-0.644811\n\t\t\t\t,0.833618\n\t\t\t\t,-0.552225\n\t\t\t\t,-0.0113731\n\t\t\t\t,0.714682\n\t\t\t\t,0.698376\n\t\t\t\t,0.0387337\n\t\t\t\t,0.760775\n\t\t\t\t,0.0737597\n\t\t\t\t,-0.644811\n\t\t\t\t,0.714682\n\t\t\t\t,0.698376\n\t\t\t\t,0.0387337\n\t\t\t\t,-0.250232\n\t\t\t\t,0.865327\n\t\t\t\t,0.434273\n\t\t\t\t,0.427292\n\t\t\t\t,-0.251098\n\t\t\t\t,0.868546\n\t\t\t\t,0.301697\n\t\t\t\t,0.609799\n\t\t\t\t,0.732887\n\t\t\t\t,0.948845\n\t\t\t\t,-0.116359\n\t\t\t\t,0.293518\n\t\t\t\t,0.301697\n\t\t\t\t,0.609799\n\t\t\t\t,0.732887\n\t\t\t\t,0.948845\n\t\t\t\t,-0.116359\n\t\t\t\t,0.293518\n\t\t\t\t,0.342716\n\t\t\t\t,0.892408\n\t\t\t\t,-0.293518\n\t\t\t\t,0.680059\n\t\t\t\t,-0.0198999\n\t\t\t\t,-0.732887\n\t\t\t\t,0.342716\n\t\t\t\t,0.892408\n\t\t\t\t,-0.293518\n\t\t\t\t,0.680059\n\t\t\t\t,-0.0198999\n\t\t\t\t,-0.732887\n\t\t\t\t,-0.0211057\n\t\t\t\t,0.495159\n\t\t\t\t,-0.868546\n\t\t\t\t,0.680059\n\t\t\t\t,-0.0198999\n\t\t\t\t,-0.732887\n\t\t\t\t,0.646562\n\t\t\t\t,-0.627187\n\t\t\t\t,-0.434273\n\t\t\t\t,-0.0211057\n\t\t\t\t,0.495159\n\t\t\t\t,-0.868546\n\t\t\t\t,-0.250232\n\t\t\t\t,0.865327\n\t\t\t\t,0.434273\n\t\t\t\t,0.342716\n\t\t\t\t,0.892408\n\t\t\t\t,-0.293518\n\t\t\t\t,0.301697\n\t\t\t\t,0.609799\n\t\t\t\t,0.732887\n\t\t\t\t,0.427292\n\t\t\t\t,-0.251098\n\t\t\t\t,0.868546\n\t\t\t\t,0.646562\n\t\t\t\t,-0.627187\n\t\t\t\t,-0.434273\n\t\t\t\t,0.948845\n\t\t\t\t,-0.116359\n\t\t\t\t,0.293518\n\t\t\t\t,0.680059\n\t\t\t\t,-0.0198999\n\t\t\t\t,-0.732887\n\t\t\t\t,0.83205\n\t\t\t\t,-0.0674189\n\t\t\t\t,-0.550588\n\t\t\t\t,0.332707\n\t\t\t\t,0.328669\n\t\t\t\t,-0.883902\n\t\t\t\t,0.613951\n\t\t\t\t,0.775041\n\t\t\t\t,-0.149586\n\t\t\t\t,0.852201\n\t\t\t\t,0.389021\n\t\t\t\t,-0.349881\n\t\t\t\t,0.894428\n\t\t\t\t,0.0420688\n\t\t\t\t,0.445229\n\t\t\t\t,0.384857\n\t\t\t\t,0.908558\n\t\t\t\t,-0.162503\n\t\t\t\t,0.622248\n\t\t\t\t,0.360366\n\t\t\t\t,0.694941\n\t\t\t\t,-0.948683\n\t\t\t\t,-0.0384348\n\t\t\t\t,-0.313883\n\t\t\t\t,-0.332709\n\t\t\t\t,0.103678\n\t\t\t\t,-0.937313\n\t\t\t\t,0.332707\n\t\t\t\t,0.328669\n\t\t\t\t,-0.883902\n\t\t\t\t,-0.613952\n\t\t\t\t,0.642939\n\t\t\t\t,-0.457921\n\t\t\t\t,0.613951\n\t\t\t\t,0.775041\n\t\t\t\t,-0.149586\n\t\t\t\t,0.613951\n\t\t\t\t,0.775041\n\t\t\t\t,-0.149586\n\t\t\t\t,-0.613952\n\t\t\t\t,0.642939\n\t\t\t\t,-0.457921\n\t\t\t\t,-0.852202\n\t\t\t\t,0.5093\n\t\t\t\t,-0.119851\n\t\t\t\t,0.852201\n\t\t\t\t,0.389021\n\t\t\t\t,-0.349881\n\t\t\t\t,0.852201\n\t\t\t\t,0.389021\n\t\t\t\t,-0.349881\n\t\t\t\t,-0.852202\n\t\t\t\t,0.5093\n\t\t\t\t,-0.119851\n\t\t\t\t,-0.384867\n\t\t\t\t,0.697004\n\t\t\t\t,-0.605031\n\t\t\t\t,0.384857\n\t\t\t\t,0.908558\n\t\t\t\t,-0.162503\n\t\t\t\t,0.384857\n\t\t\t\t,0.908558\n\t\t\t\t,-0.162503\n\t\t\t\t,-0.384867\n\t\t\t\t,0.697004\n\t\t\t\t,-0.605031\n\t\t\t\t,-0.622243\n\t\t\t\t,0.632934\n\t\t\t\t,0.46066\n\t\t\t\t,0.622248\n\t\t\t\t,0.360366\n\t\t\t\t,0.694941\n\t\t\t\t,0.622248\n\t\t\t\t,0.360366\n\t\t\t\t,0.694941\n\t\t\t\t,-0.622243\n\t\t\t\t,0.632934\n\t\t\t\t,0.46066\n\t\t\t\t,-0.707103\n\t\t\t\t,0.0665173\n\t\t\t\t,0.703975\n\t\t\t\t,0.894428\n\t\t\t\t,0.0420688\n\t\t\t\t,0.445229\n\t\t\t\t,-0.613952\n\t\t\t\t,0.642939\n\t\t\t\t,-0.457921\n\t\t\t\t,-0.852202\n\t\t\t\t,0.5093\n\t\t\t\t,-0.119851\n\t\t\t\t,-0.707103\n\t\t\t\t,0.0665173\n\t\t\t\t,0.703975\n\t\t\t\t,-0.622243\n\t\t\t\t,0.632934\n\t\t\t\t,0.46066\n\t\t\t\t,-0.384867\n\t\t\t\t,0.697004\n\t\t\t\t,-0.605031\n\t\t\t\t,1\n\t\t\t\t,-3.65927e-012\n\t\t\t\t,-4.68014e-006\n\t\t\t\t,0.990029\n\t\t\t\t,0.114111\n\t\t\t\t,0.0825961\n\t\t\t\t,0.500005\n\t\t\t\t,-2.72063e-006\n\t\t\t\t,0.866023\n\t\t\t\t,0.393293\n\t\t\t\t,0.0538443\n\t\t\t\t,0.917835\n\t\t\t\t,-0.561848\n\t\t\t\t,-0.0816065\n\t\t\t\t,0.823205\n\t\t\t\t,-0.5\n\t\t\t\t,-3.40079e-006\n\t\t\t\t,0.866025\n\t\t\t\t,-1\n\t\t\t\t,-4.53444e-007\n\t\t\t\t,-1.00141e-005\n\t\t\t\t,-0.978292\n\t\t\t\t,-0.172001\n\t\t\t\t,-0.115585\n\t\t\t\t,-1\n\t\t\t\t,-4.53444e-007\n\t\t\t\t,-1.00141e-005\n\t\t\t\t,-0.978292\n\t\t\t\t,-0.172001\n\t\t\t\t,-0.115585\n\t\t\t\t,-0.424177\n\t\t\t\t,-0.0404165\n\t\t\t\t,-0.904677\n\t\t\t\t,-0.499996\n\t\t\t\t,6.80157e-007\n\t\t\t\t,-0.866028\n\t\t\t\t,0.499996\n\t\t\t\t,4.53437e-007\n\t\t\t\t,-0.866028\n\t\t\t\t,0.586015\n\t\t\t\t,0.106145\n\t\t\t\t,-0.803318\n\t\t\t\t,0.990029\n\t\t\t\t,0.114111\n\t\t\t\t,0.0825961\n\t\t\t\t,1\n\t\t\t\t,-3.65927e-012\n\t\t\t\t,-4.68014e-006\n\t\t\t\t,0.463939\n\t\t\t\t,0.188369\n\t\t\t\t,0.865609\n\t\t\t\t,0.903291\n\t\t\t\t,0.429029\n\t\t\t\t,-0.000603461\n\t\t\t\t,-0.434929\n\t\t\t\t,-0.249205\n\t\t\t\t,0.865294\n\t\t\t\t,-0.894154\n\t\t\t\t,-0.447759\n\t\t\t\t,-0.000785258\n\t\t\t\t,-0.461353\n\t\t\t\t,-0.196404\n\t\t\t\t,-0.865205\n\t\t\t\t,-0.894154\n\t\t\t\t,-0.447759\n\t\t\t\t,-0.000785258\n\t\t\t\t,0.438772\n\t\t\t\t,0.242051\n\t\t\t\t,-0.865385\n\t\t\t\t,0.903291\n\t\t\t\t,0.429029\n\t\t\t\t,-0.000603461\n\t\t\t\t,0.3529\n\t\t\t\t,0.350362\n\t\t\t\t,0.867588\n\t\t\t\t,0.647045\n\t\t\t\t,0.76245\n\t\t\t\t,0.00172565\n\t\t\t\t,-0.290974\n\t\t\t\t,-0.402397\n\t\t\t\t,0.867993\n\t\t\t\t,-0.646707\n\t\t\t\t,-0.762736\n\t\t\t\t,-0.00199037\n\t\t\t\t,-0.350494\n\t\t\t\t,-0.353902\n\t\t\t\t,-0.867126\n\t\t\t\t,-0.646707\n\t\t\t\t,-0.762736\n\t\t\t\t,-0.00199037\n\t\t\t\t,0.287348\n\t\t\t\t,0.404025\n\t\t\t\t,-0.868444\n\t\t\t\t,0.647045\n\t\t\t\t,0.76245\n\t\t\t\t,0.00172565\n\t\t\t\t,0.164122\n\t\t\t\t,0.470607\n\t\t\t\t,0.866944\n\t\t\t\t,0.271647\n\t\t\t\t,0.962396\n\t\t\t\t,0.0013418\n\t\t\t\t,-0.108193\n\t\t\t\t,-0.485199\n\t\t\t\t,0.867684\n\t\t\t\t,-0.280939\n\t\t\t\t,-0.959725\n\t\t\t\t,-0.000776519\n\t\t\t\t,-0.169415\n\t\t\t\t,-0.46838\n\t\t\t\t,-0.867132\n\t\t\t\t,-0.280939\n\t\t\t\t,-0.959725\n\t\t\t\t,-0.000776519\n\t\t\t\t,0.106464\n\t\t\t\t,0.485827\n\t\t\t\t,-0.867547\n\t\t\t\t,0.271647\n\t\t\t\t,0.962396\n\t\t\t\t,0.0013418\n\t\t\t\t,0.0319424\n\t\t\t\t,0.499232\n\t\t\t\t,0.865879\n\t\t\t\t,0.0478939\n\t\t\t\t,0.998852\n\t\t\t\t,0.000297822\n\t\t\t\t,-0.015974\n\t\t\t\t,-0.499594\n\t\t\t\t,0.866113\n\t\t\t\t,-0.0479518\n\t\t\t\t,-0.99885\n\t\t\t\t,-0.000332738\n\t\t\t\t,-0.031964\n\t\t\t\t,-0.499119\n\t\t\t\t,-0.865944\n\t\t\t\t,-0.0479518\n\t\t\t\t,-0.99885\n\t\t\t\t,-0.000332738\n\t\t\t\t,0.0159745\n\t\t\t\t,0.499742\n\t\t\t\t,-0.866027\n\t\t\t\t,0.0478939\n\t\t\t\t,0.998852\n\t\t\t\t,0.000297822\n\t\t\t\t,2.96649e-006\n\t\t\t\t,0.654772\n\t\t\t\t,0.755826\n\t\t\t\t,0.0319424\n\t\t\t\t,0.499232\n\t\t\t\t,0.865879\n\t\t\t\t,0.0478939\n\t\t\t\t,0.998852\n\t\t\t\t,0.000297822\n\t\t\t\t,3.71177e-006\n\t\t\t\t,0.981996\n\t\t\t\t,-0.1889\n\t\t\t\t,-1.08423e-007\n\t\t\t\t,-0.327279\n\t\t\t\t,0.944928\n\t\t\t\t,-0.015974\n\t\t\t\t,-0.499594\n\t\t\t\t,0.866113\n\t\t\t\t,4.86842e-006\n\t\t\t\t,-0.981972\n\t\t\t\t,0.189029\n\t\t\t\t,-0.0479518\n\t\t\t\t,-0.99885\n\t\t\t\t,-0.000332738\n\t\t\t\t,1.28932e-006\n\t\t\t\t,-0.654576\n\t\t\t\t,-0.755996\n\t\t\t\t,-0.031964\n\t\t\t\t,-0.499119\n\t\t\t\t,-0.865944\n\t\t\t\t,-0.0479518\n\t\t\t\t,-0.99885\n\t\t\t\t,-0.000332738\n\t\t\t\t,4.86842e-006\n\t\t\t\t,-0.981972\n\t\t\t\t,0.189029\n\t\t\t\t,2.40735e-006\n\t\t\t\t,0.327407\n\t\t\t\t,-0.944883\n\t\t\t\t,0.0159745\n\t\t\t\t,0.499742\n\t\t\t\t,-0.866027\n\t\t\t\t,3.71177e-006\n\t\t\t\t,0.981996\n\t\t\t\t,-0.1889\n\t\t\t\t,0.0478939\n\t\t\t\t,0.998852\n\t\t\t\t,0.000297822\n\t\t\t\t,1\n\t\t\t\t,-2.7014e-006\n\t\t\t\t,-1.12917e-008\n\t\t\t\t,1\n\t\t\t\t,8.51718e-007\n\t\t\t\t,1.69443e-007\n\t\t\t\t,0.499999\n\t\t\t\t,-0.866019\n\t\t\t\t,-0.00360998\n\t\t\t\t,0.499998\n\t\t\t\t,-0.866019\n\t\t\t\t,-0.00360996\n\t\t\t\t,0.499999\n\t\t\t\t,-0.866019\n\t\t\t\t,-0.00360998\n\t\t\t\t,0.499998\n\t\t\t\t,-0.866019\n\t\t\t\t,-0.00360996\n\t\t\t\t,-0.499998\n\t\t\t\t,-0.866019\n\t\t\t\t,-0.00360999\n\t\t\t\t,-0.499999\n\t\t\t\t,-0.866019\n\t\t\t\t,-0.00360996\n\t\t\t\t,-0.499999\n\t\t\t\t,-0.866019\n\t\t\t\t,-0.00360996\n\t\t\t\t,-0.499998\n\t\t\t\t,-0.866019\n\t\t\t\t,-0.00360999\n\t\t\t\t,-1\n\t\t\t\t,8.51718e-007\n\t\t\t\t,1.69443e-007\n\t\t\t\t,-1\n\t\t\t\t,4.40486e-006\n\t\t\t\t,1.84163e-008\n\t\t\t\t,-1\n\t\t\t\t,8.51718e-007\n\t\t\t\t,1.69443e-007\n\t\t\t\t,-1\n\t\t\t\t,4.40486e-006\n\t\t\t\t,1.84163e-008\n\t\t\t\t,-0.499997\n\t\t\t\t,0.866019\n\t\t\t\t,0.00361082\n\t\t\t\t,-0.500001\n\t\t\t\t,0.866017\n\t\t\t\t,0.00361095\n\t\t\t\t,-0.500001\n\t\t\t\t,0.866017\n\t\t\t\t,0.00361095\n\t\t\t\t,-0.499997\n\t\t\t\t,0.866019\n\t\t\t\t,0.00361082\n\t\t\t\t,0.499998\n\t\t\t\t,0.866019\n\t\t\t\t,0.00361082\n\t\t\t\t,0.499994\n\t\t\t\t,0.866021\n\t\t\t\t,0.00361096\n\t\t\t\t,0.499998\n\t\t\t\t,0.866019\n\t\t\t\t,0.00361082\n\t\t\t\t,0.499994\n\t\t\t\t,0.866021\n\t\t\t\t,0.00361096\n\t\t\t\t,1\n\t\t\t\t,8.51718e-007\n\t\t\t\t,1.69443e-007\n\t\t\t\t,1\n\t\t\t\t,-2.7014e-006\n\t\t\t\t,-1.12917e-008\n\t\t\t\t,-0.367955\n\t\t\t\t,-0.0761971\n\t\t\t\t,0.926716\n\t\t\t\t,0\n\t\t\t\t,3.23333e-008\n\t\t\t\t,1\n\t\t\t\t,-0.265348\n\t\t\t\t,0.650654\n\t\t\t\t,0.711505\n\t\t\t\t,0\n\t\t\t\t,0.711033\n\t\t\t\t,0.703159\n\t\t\t\t,0\n\t\t\t\t,1\n\t\t\t\t,2.57476e-007\n\t\t\t\t,-0.370305\n\t\t\t\t,0.926542\n\t\t\t\t,0.0662921\n\t\t\t\t,-0.265741\n\t\t\t\t,0.722166\n\t\t\t\t,-0.638638\n\t\t\t\t,0\n\t\t\t\t,0.711033\n\t\t\t\t,-0.703159\n\t\t\t\t,0\n\t\t\t\t,3.23333e-008\n\t\t\t\t,-1\n\t\t\t\t,-0.367954\n\t\t\t\t,0.0761933\n\t\t\t\t,-0.926717\n\t\t\t\t,-0.265347\n\t\t\t\t,-0.650652\n\t\t\t\t,-0.711507\n\t\t\t\t,0\n\t\t\t\t,-0.711033\n\t\t\t\t,-0.703159\n\t\t\t\t,-0.265347\n\t\t\t\t,-0.650652\n\t\t\t\t,-0.711507\n\t\t\t\t,0\n\t\t\t\t,-0.711033\n\t\t\t\t,-0.703159\n\t\t\t\t,0\n\t\t\t\t,-1\n\t\t\t\t,2.57476e-007\n\t\t\t\t,-0.370305\n\t\t\t\t,-0.926542\n\t\t\t\t,-0.0662905\n\t\t\t\t,-0.265743\n\t\t\t\t,-0.722165\n\t\t\t\t,0.638638\n\t\t\t\t,0\n\t\t\t\t,-0.711033\n\t\t\t\t,0.703159\n\t\t\t\t,-0.31145\n\t\t\t\t,-0.0163108\n\t\t\t\t,0.950123\n\t\t\t\t,-0.311386\n\t\t\t\t,0.679248\n\t\t\t\t,0.664575\n\t\t\t\t,-0.30856\n\t\t\t\t,0.951172\n\t\t\t\t,0.00786251\n\t\t\t\t,-0.308173\n\t\t\t\t,0.69627\n\t\t\t\t,-0.648257\n\t\t\t\t,-0.311446\n\t\t\t\t,0.0162989\n\t\t\t\t,-0.950124\n\t\t\t\t,-0.311387\n\t\t\t\t,-0.679237\n\t\t\t\t,-0.664587\n\t\t\t\t,-0.311387\n\t\t\t\t,-0.679237\n\t\t\t\t,-0.664587\n\t\t\t\t,-0.308561\n\t\t\t\t,-0.951172\n\t\t\t\t,-0.00785359\n\t\t\t\t,-0.308173\n\t\t\t\t,-0.69627\n\t\t\t\t,0.648257\n\t\t\t\t,1.39743e-006\n\t\t\t\t,0.147265\n\t\t\t\t,0.989097\n\t\t\t\t,-3.94317e-007\n\t\t\t\t,0.812825\n\t\t\t\t,0.582508\n\t\t\t\t,7.23949e-007\n\t\t\t\t,0.991903\n\t\t\t\t,-0.127\n\t\t\t\t,7.29602e-007\n\t\t\t\t,0.624982\n\t\t\t\t,-0.780639\n\t\t\t\t,8.25512e-007\n\t\t\t\t,-0.147255\n\t\t\t\t,-0.989099\n\t\t\t\t,8.11694e-007\n\t\t\t\t,-0.81282\n\t\t\t\t,-0.582515\n\t\t\t\t,8.11694e-007\n\t\t\t\t,-0.81282\n\t\t\t\t,-0.582515\n\t\t\t\t,-0.311387\n\t\t\t\t,-0.679237\n\t\t\t\t,-0.664587\n\t\t\t\t,-0.308561\n\t\t\t\t,-0.951172\n\t\t\t\t,-0.00785359\n\t\t\t\t,8.11694e-007\n\t\t\t\t,-0.81282\n\t\t\t\t,-0.582515\n\t\t\t\t,2.83281e-007\n\t\t\t\t,-0.9919\n\t\t\t\t,0.127018\n\t\t\t\t,2.04867e-009\n\t\t\t\t,-0.625\n\t\t\t\t,0.780625\n\t\t\t\t,0\n\t\t\t\t,-0.894427\n\t\t\t\t,0.447214\n\t\t\t\t,0\n\t\t\t\t,-0.707107\n\t\t\t\t,-0.707107\n\t\t\t\t,0.180226\n\t\t\t\t,-0.654801\n\t\t\t\t,-0.733998\n\t\t\t\t,0.489821\n\t\t\t\t,-0.583377\n\t\t\t\t,0.647879\n\t\t\t\t,0.579372\n\t\t\t\t,-0.509948\n\t\t\t\t,-0.635831\n\t\t\t\t,0.694157\n\t\t\t\t,-0.651324\n\t\t\t\t,-0.306469\n\t\t\t\t,0\n\t\t\t\t,-0.894427\n\t\t\t\t,0.447214\n\t\t\t\t,0.360448\n\t\t\t\t,-0.575609\n\t\t\t\t,0.733997\n\t\t\t\t,0\n\t\t\t\t,0\n\t\t\t\t,1\n\t\t\t\t,0.489821\n\t\t\t\t,-0.583377\n\t\t\t\t,0.647879\n\t\t\t\t,0.523076\n\t\t\t\t,0.0358553\n\t\t\t\t,0.851532\n\t\t\t\t,0.901897\n\t\t\t\t,-0.314565\n\t\t\t\t,0.296025\n\t\t\t\t,0.644853\n\t\t\t\t,0.562006\n\t\t\t\t,0.51799\n\t\t\t\t,0.640768\n\t\t\t\t,-0.299025\n\t\t\t\t,0.707107\n\t\t\t\t,0.360448\n\t\t\t\t,-0.575609\n\t\t\t\t,0.733997\n\t\t\t\t,0.901897\n\t\t\t\t,-0.314565\n\t\t\t\t,0.296025\n\t\t\t\t,0.82423\n\t\t\t\t,0.274109\n\t\t\t\t,-0.495489\n\t\t\t\t,0.644853\n\t\t\t\t,0.562006\n\t\t\t\t,0.51799\n\t\t\t\t,0.381047\n\t\t\t\t,0.34121\n\t\t\t\t,-0.85929\n\t\t\t\t,0.523076\n\t\t\t\t,0.0358553\n\t\t\t\t,0.851532\n\t\t\t\t,0.523076\n\t\t\t\t,0.0358553\n\t\t\t\t,0.851532\n\t\t\t\t,0.381047\n\t\t\t\t,0.34121\n\t\t\t\t,-0.85929\n\t\t\t\t,0.810515\n\t\t\t\t,-0.37824\n\t\t\t\t,-0.447214\n\t\t\t\t,0.640768\n\t\t\t\t,-0.299025\n\t\t\t\t,0.707107\n\t\t\t\t,0\n\t\t\t\t,0\n\t\t\t\t,-1\n\t\t\t\t,0.381047\n\t\t\t\t,0.34121\n\t\t\t\t,-0.85929\n\t\t\t\t,0.579372\n\t\t\t\t,-0.509948\n\t\t\t\t,-0.635831\n\t\t\t\t,0.694157\n\t\t\t\t,-0.651324\n\t\t\t\t,-0.306469\n\t\t\t\t,0.810515\n\t\t\t\t,-0.37824\n\t\t\t\t,-0.447214\n\t\t\t\t,-0.863225\n\t\t\t\t,-0.282098\n\t\t\t\t,0.418644\n\t\t\t\t,0\n\t\t\t\t,-0.559231\n\t\t\t\t,0.829012\n\t\t\t\t,-0.444609\n\t\t\t\t,0.212317\n\t\t\t\t,0.870198\n\t\t\t\t,0.560481\n\t\t\t\t,0.623089\n\t\t\t\t,0.545547\n\t\t\t\t,0.647743\n\t\t\t\t,-0.426056\n\t\t\t\t,0.631589\n\t\t\t\t,0.358352\n\t\t\t\t,-0.865449\n\t\t\t\t,0.350116\n\t\t\t\t,-0.261906\n\t\t\t\t,-0.816291\n\t\t\t\t,0.514854\n\t\t\t\t,-1\n\t\t\t\t,-2.06477e-007\n\t\t\t\t,4.43098e-008\n\t\t\t\t,-0.863225\n\t\t\t\t,-0.282098\n\t\t\t\t,0.418644\n\t\t\t\t,-0.493676\n\t\t\t\t,0.869638\n\t\t\t\t,0.00363091\n\t\t\t\t,-0.444609\n\t\t\t\t,0.212317\n\t\t\t\t,0.870198\n\t\t\t\t,0.560481\n\t\t\t\t,0.623089\n\t\t\t\t,0.545547\n\t\t\t\t,0.499997\n\t\t\t\t,0.866015\n\t\t\t\t,0.00445858\n\t\t\t\t,0.999998\n\t\t\t\t,-4.16758e-007\n\t\t\t\t,0.00182103\n\t\t\t\t,0.647743\n\t\t\t\t,-0.426056\n\t\t\t\t,0.631589\n\t\t\t\t,0.999998\n\t\t\t\t,-4.16758e-007\n\t\t\t\t,0.00182103\n\t\t\t\t,0.647743\n\t\t\t\t,-0.426056\n\t\t\t\t,0.631589\n\t\t\t\t,0.358352\n\t\t\t\t,-0.865449\n\t\t\t\t,0.350116\n\t\t\t\t,0.499995\n\t\t\t\t,-0.866005\n\t\t\t\t,0.00636769\n\t\t\t\t,-0.492845\n\t\t\t\t,-0.8701\n\t\t\t\t,0.00544761\n\t\t\t\t,-0.261906\n\t\t\t\t,-0.816291\n\t\t\t\t,0.514854\n\t\t\t\t,-0.863225\n\t\t\t\t,-0.282098\n\t\t\t\t,0.418644\n\t\t\t\t,-1\n\t\t\t\t,-2.06477e-007\n\t\t\t\t,4.43098e-008\n\t\t\t\t,0.668683\n\t\t\t\t,0.664714\n\t\t\t\t,-0.333194\n\t\t\t\t,0.407409\n\t\t\t\t,-0.412306\n\t\t\t\t,-0.814875\n\t\t\t\t,-0.409508\n\t\t\t\t,0.404646\n\t\t\t\t,-0.817658\n\t\t\t\t,-0.665139\n\t\t\t\t,-0.669138\n\t\t\t\t,-0.331428\n\t\t\t\t,0.707103\n\t\t\t\t,0.707107\n\t\t\t\t,0.00245314\n\t\t\t\t,0.704983\n\t\t\t\t,-0.709223\n\t\t\t\t,0.00122293\n\t\t\t\t,0.668683\n\t\t\t\t,0.664714\n\t\t\t\t,-0.333194\n\t\t\t\t,0.407409\n\t\t\t\t,-0.412306\n\t\t\t\t,-0.814875\n\t\t\t\t,-0.409508\n\t\t\t\t,0.404646\n\t\t\t\t,-0.817658\n\t\t\t\t,-0.665139\n\t\t\t\t,-0.669138\n\t\t\t\t,-0.331428\n\t\t\t\t,-0.709208\n\t\t\t\t,0.704998\n\t\t\t\t,0.00123014\n\t\t\t\t,-0.707107\n\t\t\t\t,-0.707107\n\t\t\t\t,0\n\t\t\t\t,-0.409508\n\t\t\t\t,0.404646\n\t\t\t\t,-0.817658\n\t\t\t\t,-0.709208\n\t\t\t\t,0.704998\n\t\t\t\t,0.00123014\n\t\t\t\t,0.668683\n\t\t\t\t,0.664714\n\t\t\t\t,-0.333194\n\t\t\t\t,0.707103\n\t\t\t\t,0.707107\n\t\t\t\t,0.00245314\n\t\t\t\t,-0.707107\n\t\t\t\t,-0.707107\n\t\t\t\t,0\n\t\t\t\t,-0.665139\n\t\t\t\t,-0.669138\n\t\t\t\t,-0.331428\n\t\t\t\t,0.704983\n\t\t\t\t,-0.709223\n\t\t\t\t,0.00122293\n\t\t\t\t,0.407409\n\t\t\t\t,-0.412306\n\t\t\t\t,-0.814875\n\t\t\t\t,0.109932\n\t\t\t\t,0.301712\n\t\t\t\t,0.94704\n\t\t\t\t,0\n\t\t\t\t,0.486826\n\t\t\t\t,0.873499\n\t\t\t\t,0\n\t\t\t\t,-0.43107\n\t\t\t\t,0.902319\n\t\t\t\t,0.166187\n\t\t\t\t,-0.547738\n\t\t\t\t,0.819979\n\t\t\t\t,0.118106\n\t\t\t\t,0.159625\n\t\t\t\t,0.980087\n\t\t\t\t,0.0801055\n\t\t\t\t,-0.70182\n\t\t\t\t,0.707836\n\t\t\t\t,0.556955\n\t\t\t\t,-0.830543\n\t\t\t\t,0\n\t\t\t\t,2.82445e-006\n\t\t\t\t,-1\n\t\t\t\t,0\n\t\t\t\t,2.82445e-006\n\t\t\t\t,-1\n\t\t\t\t,0\n\t\t\t\t,0.556955\n\t\t\t\t,-0.830543\n\t\t\t\t,0\n\t\t\t\t,0.556955\n\t\t\t\t,-0.830543\n\t\t\t\t,0\n\t\t\t\t,2.82445e-006\n\t\t\t\t,-1\n\t\t\t\t,0\n\t\t\t\t,0.538401\n\t\t\t\t,-0.806279\n\t\t\t\t,0.245027\n\t\t\t\t,9.98093e-007\n\t\t\t\t,-0.887667\n\t\t\t\t,0.460485\n\t\t\t\t,2.82445e-006\n\t\t\t\t,-1\n\t\t\t\t,0\n\t\t\t\t,0.556955\n\t\t\t\t,-0.830543\n\t\t\t\t,0\n\t\t\t\t,2.82445e-006\n\t\t\t\t,-1\n\t\t\t\t,0\n\t\t\t\t,0.556955\n\t\t\t\t,-0.830543\n\t\t\t\t,0\n\t\t\t\t,2.82445e-006\n\t\t\t\t,-1\n\t\t\t\t,0\n\t\t\t\t,0.548639\n\t\t\t\t,-0.832661\n\t\t\t\t,-0.0752992\n\t\t\t\t,3.18895e-006\n\t\t\t\t,-0.993887\n\t\t\t\t,0.1104\n\t\t\t\t,0.490043\n\t\t\t\t,-0.858577\n\t\t\t\t,0.150676\n\t\t\t\t,0.0239762\n\t\t\t\t,-0.999311\n\t\t\t\t,0.0283283\n\t\t\t\t,0.559846\n\t\t\t\t,-0.817331\n\t\t\t\t,-0.136172\n\t\t\t\t,0.487773\n\t\t\t\t,-0.780902\n\t\t\t\t,0.390218\n\t\t\t\t,-9.99114e-007\n\t\t\t\t,-0.940053\n\t\t\t\t,0.341028\n\t\t\t\t,0.395642\n\t\t\t\t,-0.862791\n\t\t\t\t,0.314736\n\t\t\t\t,0.0239079\n\t\t\t\t,-0.911301\n\t\t\t\t,0.411046\n\t\t\t\t,0.166187\n\t\t\t\t,-0.547738\n\t\t\t\t,0.819979\n\t\t\t\t,0\n\t\t\t\t,-0.43107\n\t\t\t\t,0.902319\n\t\t\t\t,0.387691\n\t\t\t\t,-0.598574\n\t\t\t\t,-0.701003\n\t\t\t\t,0.0970761\n\t\t\t\t,-0.617147\n\t\t\t\t,-0.780836\n\t\t\t\t,0.0655848\n\t\t\t\t,0.00329327\n\t\t\t\t,-0.997842\n\t\t\t\t,0.156688\n\t\t\t\t,0.310153\n\t\t\t\t,-0.937685\n\t\t\t\t,0.559846\n\t\t\t\t,-0.817331\n\t\t\t\t,-0.136172\n\t\t\t\t,0.0239762\n\t\t\t\t,-0.999311\n\t\t\t\t,0.0283283\n\t\t\t\t,0.823668\n\t\t\t\t,-0.557629\n\t\t\t\t,-0.103061\n\t\t\t\t,1\n\t\t\t\t,0\n\t\t\t\t,0\n\t\t\t\t,0.70498\n\t\t\t\t,-0.704742\n\t\t\t\t,-0.0796332\n\t\t\t\t,0.655536\n\t\t\t\t,-0.755033\n\t\t\t\t,-0.0140547\n\t\t\t\t,0.754386\n\t\t\t\t,-0.655728\n\t\t\t\t,0.0303789\n\t\t\t\t,1\n\t\t\t\t,0\n\t\t\t\t,0\n\t\t\t\t,0.898276\n\t\t\t\t,-0.434238\n\t\t\t\t,-0.0673592\n\t\t\t\t,0.890327\n\t\t\t\t,0.454797\n\t\t\t\t,0.0218428\n\t\t\t\t,0.889904\n\t\t\t\t,0.432015\n\t\t\t\t,-0.146402\n\t\t\t\t,0.84312\n\t\t\t\t,0.512713\n\t\t\t\t,0.162091\n\t\t\t\t,0.860165\n\t\t\t\t,-0.509928\n\t\t\t\t,-0.00944199\n\t\t\t\t,0.853562\n\t\t\t\t,0.520987\n\t\t\t\t,0.00222179\n\t\t\t\t,0.798864\n\t\t\t\t,-0.569515\n\t\t\t\t,0.193569\n\t\t\t\t,0.894332\n\t\t\t\t,0.398965\n\t\t\t\t,-0.202476\n\t\t\t\t,0.928533\n\t\t\t\t,0.101743\n\t\t\t\t,-0.357036\n\t\t\t\t,0.950698\n\t\t\t\t,0.30853\n\t\t\t\t,-0.0313385\n\t\t\t\t,0.801653\n\t\t\t\t,-0.586522\n\t\t\t\t,0.115516\n\t\t\t\t,0.956751\n\t\t\t\t,0.290742\n\t\t\t\t,-0.00983039\n\t\t\t\t,0.637809\n\t\t\t\t,-0.768826\n\t\t\t\t,0.0458956\n\t\t\t\t,0.974108\n\t\t\t\t,0.226078\n\t\t\t\t,0.00164488\n\t\t\t\t,0.311924\n\t\t\t\t,-0.894668\n\t\t\t\t,0.3198\n\t\t\t\t,0.641606\n\t\t\t\t,0.0593124\n\t\t\t\t,0.764738\n\t\t\t\t,0.306116\n\t\t\t\t,-0.910737\n\t\t\t\t,0.277221\n\t\t\t\t,0.70498\n\t\t\t\t,-0.704742\n\t\t\t\t,-0.0796332\n\t\t\t\t,0.644331\n\t\t\t\t,-0.764702\n\t\t\t\t,-0.00822072\n\t\t\t\t,0.676081\n\t\t\t\t,-0.735039\n\t\t\t\t,-0.0512933\n\t\t\t\t,0.823668\n\t\t\t\t,-0.557629\n\t\t\t\t,-0.103061\n\t\t\t\t,0.655536\n\t\t\t\t,-0.755033\n\t\t\t\t,-0.0140547\n\t\t\t\t,0.615222\n\t\t\t\t,-0.788351\n\t\t\t\t,-0.00213144\n\t\t\t\t,0.754386\n\t\t\t\t,-0.655728\n\t\t\t\t,0.0303789\n\t\t\t\t,0.583526\n\t\t\t\t,-0.799513\n\t\t\t\t,0.142397\n\t\t\t\t,0.708729\n\t\t\t\t,-0.704254\n\t\t\t\t,-0.0415815\n\t\t\t\t,0.898276\n\t\t\t\t,-0.434238\n\t\t\t\t,-0.0673592\n\t\t\t\t,0.890327\n\t\t\t\t,0.454797\n\t\t\t\t,0.0218428\n\t\t\t\t,-0.127287\n\t\t\t\t,0.971722\n\t\t\t\t,0.198882\n\t\t\t\t,-0.00964467\n\t\t\t\t,0.911341\n\t\t\t\t,-0.411539\n\t\t\t\t,0.889904\n\t\t\t\t,0.432015\n\t\t\t\t,-0.146402\n\t\t\t\t,0.84312\n\t\t\t\t,0.512713\n\t\t\t\t,0.162091\n\t\t\t\t,0.287558\n\t\t\t\t,0.877073\n\t\t\t\t,0.384777\n\t\t\t\t,0.750597\n\t\t\t\t,-0.660036\n\t\t\t\t,-0.0309251\n\t\t\t\t,0.860165\n\t\t\t\t,-0.509928\n\t\t\t\t,-0.00944199\n\t\t\t\t,0.853562\n\t\t\t\t,0.520987\n\t\t\t\t,0.00222179\n\t\t\t\t,0.317809\n\t\t\t\t,0.947654\n\t\t\t\t,-0.0308062\n\t\t\t\t,0.694281\n\t\t\t\t,-0.718346\n\t\t\t\t,-0.044189\n\t\t\t\t,0.798864\n\t\t\t\t,-0.569515\n\t\t\t\t,0.193569\n\t\t\t\t,0.285563\n\t\t\t\t,0.930791\n\t\t\t\t,-0.228215\n\t\t\t\t,0.894332\n\t\t\t\t,0.398965\n\t\t\t\t,-0.202476\n\t\t\t\t,0.310532\n\t\t\t\t,0.718717\n\t\t\t\t,-0.622106\n\t\t\t\t,0.493777\n\t\t\t\t,-0.819859\n\t\t\t\t,0.289854\n\t\t\t\t,0.306116\n\t\t\t\t,-0.910737\n\t\t\t\t,0.277221\n\t\t\t\t,0.928533\n\t\t\t\t,0.101743\n\t\t\t\t,-0.357036\n\t\t\t\t,0.661634\n\t\t\t\t,-0.628407\n\t\t\t\t,-0.409079\n\t\t\t\t,0.49545\n\t\t\t\t,-0.0410637\n\t\t\t\t,-0.867665\n\t\t\t\t,0.348098\n\t\t\t\t,-0.909\n\t\t\t\t,0.22923\n\t\t\t\t,0.661634\n\t\t\t\t,-0.628407\n\t\t\t\t,-0.409079\n\t\t\t\t,0.369968\n\t\t\t\t,0.867193\n\t\t\t\t,-0.333317\n\t\t\t\t,0.950698\n\t\t\t\t,0.30853\n\t\t\t\t,-0.0313385\n\t\t\t\t,0.801653\n\t\t\t\t,-0.586522\n\t\t\t\t,0.115516\n\t\t\t\t,0.449438\n\t\t\t\t,-0.863991\n\t\t\t\t,0.226992\n\t\t\t\t,0.54844\n\t\t\t\t,0.833839\n\t\t\t\t,-0.0626621\n\t\t\t\t,0.956751\n\t\t\t\t,0.290742\n\t\t\t\t,-0.00983039\n\t\t\t\t,0.637809\n\t\t\t\t,-0.768826\n\t\t\t\t,0.0458956\n\t\t\t\t,0.330452\n\t\t\t\t,-0.928942\n\t\t\t\t,0.166939\n\t\t\t\t,0.573954\n\t\t\t\t,0.756132\n\t\t\t\t,0.31439\n\t\t\t\t,0.974108\n\t\t\t\t,0.226078\n\t\t\t\t,0.00164488\n\t\t\t\t,0.311924\n\t\t\t\t,-0.894668\n\t\t\t\t,0.3198\n\t\t\t\t,0.0801055\n\t\t\t\t,-0.70182\n\t\t\t\t,0.707836\n\t\t\t\t,0.641606\n\t\t\t\t,0.0593124\n\t\t\t\t,0.764738\n\t\t\t\t,0.118106\n\t\t\t\t,0.159625\n\t\t\t\t,0.980087\n\t\t\t\t,0.641606\n\t\t\t\t,0.0593124\n\t\t\t\t,0.764738\n\t\t\t\t,0.641606\n\t\t\t\t,0.0593124\n\t\t\t\t,0.764738\n\t\t\t\t,0.118106\n\t\t\t\t,0.159625\n\t\t\t\t,0.980087\n\t\t\t\t,0.928533\n\t\t\t\t,0.101743\n\t\t\t\t,-0.357036\n\t\t\t\t,0.306116\n\t\t\t\t,-0.910737\n\t\t\t\t,0.277221\n\t\t\t\t,0.644331\n\t\t\t\t,-0.764702\n\t\t\t\t,-0.00822072\n\t\t\t\t,0.556955\n\t\t\t\t,-0.830543\n\t\t\t\t,0\n\t\t\t\t,0.556955\n\t\t\t\t,-0.830543\n\t\t\t\t,0\n\t\t\t\t,0.676081\n\t\t\t\t,-0.735039\n\t\t\t\t,-0.0512933\n\t\t\t\t,0.615222\n\t\t\t\t,-0.788351\n\t\t\t\t,-0.00213144\n\t\t\t\t,0.556955\n\t\t\t\t,-0.830543\n\t\t\t\t,0\n\t\t\t\t,0.583526\n\t\t\t\t,-0.799513\n\t\t\t\t,0.142397\n\t\t\t\t,0.538401\n\t\t\t\t,-0.806279\n\t\t\t\t,0.245027\n\t\t\t\t,0.556955\n\t\t\t\t,-0.830543\n\t\t\t\t,0\n\t\t\t\t,0.708729\n\t\t\t\t,-0.704254\n\t\t\t\t,-0.0415815\n\t\t\t\t,0.556955\n\t\t\t\t,-0.830543\n\t\t\t\t,0\n\t\t\t\t,0.750597\n\t\t\t\t,-0.660036\n\t\t\t\t,-0.0309251\n\t\t\t\t,0.548639\n\t\t\t\t,-0.832661\n\t\t\t\t,-0.0752992\n\t\t\t\t,0.694281\n\t\t\t\t,-0.718346\n\t\t\t\t,-0.044189\n\t\t\t\t,0.490043\n\t\t\t\t,-0.858577\n\t\t\t\t,0.150676\n\t\t\t\t,0.493777\n\t\t\t\t,-0.819859\n\t\t\t\t,0.289854\n\t\t\t\t,0.49545\n\t\t\t\t,-0.0410637\n\t\t\t\t,-0.867665\n\t\t\t\t,0.387691\n\t\t\t\t,-0.598574\n\t\t\t\t,-0.701003\n\t\t\t\t,0.156688\n\t\t\t\t,0.310153\n\t\t\t\t,-0.937685\n\t\t\t\t,0.559846\n\t\t\t\t,-0.817331\n\t\t\t\t,-0.136172\n\t\t\t\t,0.348098\n\t\t\t\t,-0.909\n\t\t\t\t,0.22923\n\t\t\t\t,0.559846\n\t\t\t\t,-0.817331\n\t\t\t\t,-0.136172\n\t\t\t\t,0.387691\n\t\t\t\t,-0.598574\n\t\t\t\t,-0.701003\n\t\t\t\t,0.49545\n\t\t\t\t,-0.0410637\n\t\t\t\t,-0.867665\n\t\t\t\t,0.449438\n\t\t\t\t,-0.863991\n\t\t\t\t,0.226992\n\t\t\t\t,0.487773\n\t\t\t\t,-0.780902\n\t\t\t\t,0.390218\n\t\t\t\t,0.330452\n\t\t\t\t,-0.928942\n\t\t\t\t,0.166939\n\t\t\t\t,0.395642\n\t\t\t\t,-0.862791\n\t\t\t\t,0.314736\n\t\t\t\t,0.0801055\n\t\t\t\t,-0.70182\n\t\t\t\t,0.707836\n\t\t\t\t,0.166187\n\t\t\t\t,-0.547738\n\t\t\t\t,0.819979\n\t\t\t\t,0.0978323\n\t\t\t\t,0.800769\n\t\t\t\t,-0.59093\n\t\t\t\t,0.054913\n\t\t\t\t,0.881302\n\t\t\t\t,-0.469352\n\t\t\t\t,0\n\t\t\t\t,0.52529\n\t\t\t\t,-0.850923\n\t\t\t\t,0\n\t\t\t\t,0.716196\n\t\t\t\t,-0.697899\n\t\t\t\t,0.104375\n\t\t\t\t,0.993297\n\t\t\t\t,0.0496695\n\t\t\t\t,0\n\t\t\t\t,0.922099\n\t\t\t\t,0.386953\n\t\t\t\t,-0.00199464\n\t\t\t\t,0.944738\n\t\t\t\t,0.32782\n\t\t\t\t,0.0874581\n\t\t\t\t,0.852353\n\t\t\t\t,0.515602\n\t\t\t\t,0.0978323\n\t\t\t\t,0.800769\n\t\t\t\t,-0.59093\n\t\t\t\t,0\n\t\t\t\t,0.716196\n\t\t\t\t,-0.697899\n\t\t\t\t,0\n\t\t\t\t,0.981962\n\t\t\t\t,0.189077\n\t\t\t\t,0.156012\n\t\t\t\t,0.986301\n\t\t\t\t,-0.0535787\n\t\t\t\t,0.0343635\n\t\t\t\t,0.784606\n\t\t\t\t,-0.619042\n\t\t\t\t,0.102521\n\t\t\t\t,0.742202\n\t\t\t\t,-0.662288\n\t\t\t\t,0\n\t\t\t\t,0.52529\n\t\t\t\t,-0.850923\n\t\t\t\t,0.054913\n\t\t\t\t,0.881302\n\t\t\t\t,-0.469352\n\t\t\t\t,0.156688\n\t\t\t\t,0.310153\n\t\t\t\t,-0.937685\n\t\t\t\t,0.0655848\n\t\t\t\t,0.00329327\n\t\t\t\t,-0.997842\n\t\t\t\t,0.317809\n\t\t\t\t,0.947654\n\t\t\t\t,-0.0308062\n\t\t\t\t,0.287558\n\t\t\t\t,0.877073\n\t\t\t\t,0.384777\n\t\t\t\t,0.285563\n\t\t\t\t,0.930791\n\t\t\t\t,-0.228215\n\t\t\t\t,0.310532\n\t\t\t\t,0.718717\n\t\t\t\t,-0.622106\n\t\t\t\t,0.49545\n\t\t\t\t,-0.0410637\n\t\t\t\t,-0.867665\n\t\t\t\t,0.49545\n\t\t\t\t,-0.0410637\n\t\t\t\t,-0.867665\n\t\t\t\t,0\n\t\t\t\t,0.716196\n\t\t\t\t,-0.697899\n\t\t\t\t,0\n\t\t\t\t,0.52529\n\t\t\t\t,-0.850923\n\t\t\t\t,0\n\t\t\t\t,0.922099\n\t\t\t\t,0.386953\n\t\t\t\t,0\n\t\t\t\t,0.981962\n\t\t\t\t,0.189077\n\t\t\t\t,-0.26382\n\t\t\t\t,0.858482\n\t\t\t\t,0.439781\n\t\t\t\t,-2.53373e-006\n\t\t\t\t,0.733988\n\t\t\t\t,0.679163\n\t\t\t\t,6.13543e-007\n\t\t\t\t,0.959276\n\t\t\t\t,-0.282471\n\t\t\t\t,-0.359397\n\t\t\t\t,0.820605\n\t\t\t\t,-0.444343\n\t\t\t\t,0.0874581\n\t\t\t\t,0.852353\n\t\t\t\t,0.515602\n\t\t\t\t,-0.00199464\n\t\t\t\t,0.944738\n\t\t\t\t,0.32782\n\t\t\t\t,1.61698e-006\n\t\t\t\t,0.774727\n\t\t\t\t,-0.632296\n\t\t\t\t,-0.109825\n\t\t\t\t,0.866377\n\t\t\t\t,-0.487164\n\t\t\t\t,-0.127287\n\t\t\t\t,0.971722\n\t\t\t\t,0.198882\n\t\t\t\t,-0.00964467\n\t\t\t\t,0.911341\n\t\t\t\t,-0.411539\n\t\t\t\t,0.287558\n\t\t\t\t,0.877073\n\t\t\t\t,0.384777\n\t\t\t\t,0.287558\n\t\t\t\t,0.877073\n\t\t\t\t,0.384777\n\t\t\t\t,0.369968\n\t\t\t\t,0.867193\n\t\t\t\t,-0.333317\n\t\t\t\t,-0.109825\n\t\t\t\t,0.866377\n\t\t\t\t,-0.487164\n\t\t\t\t,1.61698e-006\n\t\t\t\t,0.774727\n\t\t\t\t,-0.632296\n\t\t\t\t,1.32905e-006\n\t\t\t\t,0.98963\n\t\t\t\t,-0.143642\n\t\t\t\t,0.0429343\n\t\t\t\t,0.991846\n\t\t\t\t,-0.119989\n\t\t\t\t,0\n\t\t\t\t,0.98803\n\t\t\t\t,0.15426\n\t\t\t\t,0.135145\n\t\t\t\t,0.929792\n\t\t\t\t,0.342377\n\t\t\t\t,0\n\t\t\t\t,0.486826\n\t\t\t\t,0.873499\n\t\t\t\t,0.109932\n\t\t\t\t,0.301712\n\t\t\t\t,0.94704\n\t\t\t\t,0.369968\n\t\t\t\t,0.867193\n\t\t\t\t,-0.333317\n\t\t\t\t,0.54844\n\t\t\t\t,0.833839\n\t\t\t\t,-0.0626621\n\t\t\t\t,0.573954\n\t\t\t\t,0.756132\n\t\t\t\t,0.31439\n\t\t\t\t,0.118106\n\t\t\t\t,0.159625\n\t\t\t\t,0.980087\n\t\t\t\t,-0.250232\n\t\t\t\t,0.865327\n\t\t\t\t,0.434273\n\t\t\t\t,0.427292\n\t\t\t\t,-0.251098\n\t\t\t\t,0.868546\n\t\t\t\t,0.301697\n\t\t\t\t,0.609799\n\t\t\t\t,0.732887\n\t\t\t\t,0.948845\n\t\t\t\t,-0.116359\n\t\t\t\t,0.293518\n\t\t\t\t,0.301697\n\t\t\t\t,0.609799\n\t\t\t\t,0.732887\n\t\t\t\t,0.948845\n\t\t\t\t,-0.116359\n\t\t\t\t,0.293518\n\t\t\t\t,0.342716\n\t\t\t\t,0.892408\n\t\t\t\t,-0.293518\n\t\t\t\t,0.680059\n\t\t\t\t,-0.0198999\n\t\t\t\t,-0.732887\n\t\t\t\t,0.342716\n\t\t\t\t,0.892408\n\t\t\t\t,-0.293518\n\t\t\t\t,0.680059\n\t\t\t\t,-0.0198999\n\t\t\t\t,-0.732887\n\t\t\t\t,-0.0211057\n\t\t\t\t,0.495159\n\t\t\t\t,-0.868546\n\t\t\t\t,0.680059\n\t\t\t\t,-0.0198999\n\t\t\t\t,-0.732887\n\t\t\t\t,0.646562\n\t\t\t\t,-0.627187\n\t\t\t\t,-0.434273\n\t\t\t\t,-0.0211057\n\t\t\t\t,0.495159\n\t\t\t\t,-0.868546\n\t\t\t\t,-0.250232\n\t\t\t\t,0.865327\n\t\t\t\t,0.434273\n\t\t\t\t,0.342716\n\t\t\t\t,0.892408\n\t\t\t\t,-0.293518\n\t\t\t\t,0.301697\n\t\t\t\t,0.609799\n\t\t\t\t,0.732887\n\t\t\t\t,0.427292\n\t\t\t\t,-0.251098\n\t\t\t\t,0.868546\n\t\t\t\t,0.646562\n\t\t\t\t,-0.627187\n\t\t\t\t,-0.434273\n\t\t\t\t,0.948845\n\t\t\t\t,-0.116359\n\t\t\t\t,0.293518\n\t\t\t\t,0.680059\n\t\t\t\t,-0.0198999\n\t\t\t\t,-0.732887\n\t\t\t\t,1\n\t\t\t\t,2.93206e-006\n\t\t\t\t,-5.72892e-006\n\t\t\t\t,0.991424\n\t\t\t\t,0.052789\n\t\t\t\t,0.119546\n\t\t\t\t,0.513955\n\t\t\t\t,-0.390961\n\t\t\t\t,0.763544\n\t\t\t\t,0.402737\n\t\t\t\t,-0.373096\n\t\t\t\t,0.835824\n\t\t\t\t,-0.581696\n\t\t\t\t,-0.436238\n\t\t\t\t,0.686532\n\t\t\t\t,-0.513952\n\t\t\t\t,-0.390962\n\t\t\t\t,0.763546\n\t\t\t\t,-1\n\t\t\t\t,4.22909e-006\n\t\t\t\t,-8.86377e-006\n\t\t\t\t,-0.981365\n\t\t\t\t,-0.0834974\n\t\t\t\t,-0.173066\n\t\t\t\t,-1\n\t\t\t\t,4.22909e-006\n\t\t\t\t,-8.86377e-006\n\t\t\t\t,-0.981365\n\t\t\t\t,-0.0834974\n\t\t\t\t,-0.173066\n\t\t\t\t,-0.434868\n\t\t\t\t,0.377403\n\t\t\t\t,-0.817592\n\t\t\t\t,-0.513946\n\t\t\t\t,0.390962\n\t\t\t\t,-0.76355\n\t\t\t\t,0.513946\n\t\t\t\t,0.390961\n\t\t\t\t,-0.76355\n\t\t\t\t,0.607667\n\t\t\t\t,0.4464\n\t\t\t\t,-0.656862\n\t\t\t\t,0.991424\n\t\t\t\t,0.052789\n\t\t\t\t,0.119546\n\t\t\t\t,1\n\t\t\t\t,2.93206e-006\n\t\t\t\t,-5.72892e-006\n\t\t\t\t,0.474569\n\t\t\t\t,-0.240957\n\t\t\t\t,0.846596\n\t\t\t\t,0.920933\n\t\t\t\t,0.336333\n\t\t\t\t,0.196882\n\t\t\t\t,-0.463712\n\t\t\t\t,-0.599929\n\t\t\t\t,0.651963\n\t\t\t\t,-0.913194\n\t\t\t\t,-0.351033\n\t\t\t\t,-0.20701\n\t\t\t\t,-0.47197\n\t\t\t\t,0.234426\n\t\t\t\t,-0.849876\n\t\t\t\t,-0.913194\n\t\t\t\t,-0.351033\n\t\t\t\t,-0.20701\n\t\t\t\t,0.467111\n\t\t\t\t,0.593592\n\t\t\t\t,-0.655329\n\t\t\t\t,0.920933\n\t\t\t\t,0.336333\n\t\t\t\t,0.196882\n\t\t\t\t,0.363966\n\t\t\t\t,-0.110945\n\t\t\t\t,0.924781\n\t\t\t\t,0.687988\n\t\t\t\t,0.625185\n\t\t\t\t,0.368533\n\t\t\t\t,-0.32233\n\t\t\t\t,-0.746837\n\t\t\t\t,0.581668\n\t\t\t\t,-0.68821\n\t\t\t\t,-0.624966\n\t\t\t\t,-0.368491\n\t\t\t\t,-0.36174\n\t\t\t\t,0.107949\n\t\t\t\t,-0.926008\n\t\t\t\t,-0.68821\n\t\t\t\t,-0.624966\n\t\t\t\t,-0.368491\n\t\t\t\t,0.318233\n\t\t\t\t,0.748947\n\t\t\t\t,-0.58121\n\t\t\t\t,0.687988\n\t\t\t\t,0.625185\n\t\t\t\t,0.368533\n\t\t\t\t,0.17256\n\t\t\t\t,-0.00979386\n\t\t\t\t,0.98495\n\t\t\t\t,0.303062\n\t\t\t\t,0.823829\n\t\t\t\t,0.479019\n\t\t\t\t,-0.123456\n\t\t\t\t,-0.832746\n\t\t\t\t,0.539716\n\t\t\t\t,-0.313037\n\t\t\t\t,-0.821266\n\t\t\t\t,-0.477001\n\t\t\t\t,-0.177998\n\t\t\t\t,0.0118203\n\t\t\t\t,-0.98396\n\t\t\t\t,-0.313037\n\t\t\t\t,-0.821266\n\t\t\t\t,-0.477001\n\t\t\t\t,0.121571\n\t\t\t\t,0.833336\n\t\t\t\t,-0.539232\n\t\t\t\t,0.303062\n\t\t\t\t,0.823829\n\t\t\t\t,0.479019\n\t\t\t\t,0.0338981\n\t\t\t\t,0.0160758\n\t\t\t\t,0.999296\n\t\t\t\t,0.0544514\n\t\t\t\t,0.864997\n\t\t\t\t,0.498813\n\t\t\t\t,-0.0184916\n\t\t\t\t,-0.847772\n\t\t\t\t,0.530039\n\t\t\t\t,-0.0545173\n\t\t\t\t,-0.864984\n\t\t\t\t,-0.49883\n\t\t\t\t,-0.0339196\n\t\t\t\t,-0.0159525\n\t\t\t\t,-0.999297\n\t\t\t\t,-0.0545173\n\t\t\t\t,-0.864984\n\t\t\t\t,-0.49883\n\t\t\t\t,0.0184925\n\t\t\t\t,0.84787\n\t\t\t\t,-0.529882\n\t\t\t\t,0.0544514\n\t\t\t\t,0.864997\n\t\t\t\t,0.498813\n\t\t\t\t,3.21513e-006\n\t\t\t\t,0.191634\n\t\t\t\t,0.981467\n\t\t\t\t,0.0338981\n\t\t\t\t,0.0160758\n\t\t\t\t,0.999296\n\t\t\t\t,0.0544514\n\t\t\t\t,0.864997\n\t\t\t\t,0.498813\n\t\t\t\t,4.90741e-006\n\t\t\t\t,0.947702\n\t\t\t\t,0.319155\n\t\t\t\t,-3.31268e-007\n\t\t\t\t,-0.728126\n\t\t\t\t,0.685443\n\t\t\t\t,-0.0184916\n\t\t\t\t,-0.847772\n\t\t\t\t,0.530039\n\t\t\t\t,5.65996e-006\n\t\t\t\t,-0.947753\n\t\t\t\t,-0.319005\n\t\t\t\t,-0.0545173\n\t\t\t\t,-0.864984\n\t\t\t\t,-0.49883\n\t\t\t\t,1.41282e-006\n\t\t\t\t,-0.19139\n\t\t\t\t,-0.981514\n\t\t\t\t,-0.0339196\n\t\t\t\t,-0.0159525\n\t\t\t\t,-0.999297\n\t\t\t\t,-0.0545173\n\t\t\t\t,-0.864984\n\t\t\t\t,-0.49883\n\t\t\t\t,5.65996e-006\n\t\t\t\t,-0.947753\n\t\t\t\t,-0.319005\n\t\t\t\t,3.29686e-006\n\t\t\t\t,0.728227\n\t\t\t\t,-0.685337\n\t\t\t\t,0.0184925\n\t\t\t\t,0.84787\n\t\t\t\t,-0.529882\n\t\t\t\t,4.90741e-006\n\t\t\t\t,0.947702\n\t\t\t\t,0.319155\n\t\t\t\t,0.0544514\n\t\t\t\t,0.864997\n\t\t\t\t,0.498813\n\t\t\t\t,-0.863225\n\t\t\t\t,-0.282098\n\t\t\t\t,0.418644\n\t\t\t\t,0\n\t\t\t\t,-0.559231\n\t\t\t\t,0.829012\n\t\t\t\t,-0.444609\n\t\t\t\t,0.212317\n\t\t\t\t,0.870198\n\t\t\t\t,0.560481\n\t\t\t\t,0.623089\n\t\t\t\t,0.545547\n\t\t\t\t,0.647743\n\t\t\t\t,-0.426056\n\t\t\t\t,0.631589\n\t\t\t\t,0.358352\n\t\t\t\t,-0.865449\n\t\t\t\t,0.350116\n\t\t\t\t,-0.261906\n\t\t\t\t,-0.816291\n\t\t\t\t,0.514854\n\t\t\t\t,-1\n\t\t\t\t,-2.06477e-007\n\t\t\t\t,1.51228e-010\n\t\t\t\t,-0.863225\n\t\t\t\t,-0.282098\n\t\t\t\t,0.418644\n\t\t\t\t,-0.493676\n\t\t\t\t,0.869638\n\t\t\t\t,0.0036309\n\t\t\t\t,-0.444609\n\t\t\t\t,0.212317\n\t\t\t\t,0.870198\n\t\t\t\t,0.560481\n\t\t\t\t,0.623089\n\t\t\t\t,0.545547\n\t\t\t\t,0.499997\n\t\t\t\t,0.866015\n\t\t\t\t,0.00445858\n\t\t\t\t,0.999998\n\t\t\t\t,-3.99393e-007\n\t\t\t\t,0.00182101\n\t\t\t\t,0.647743\n\t\t\t\t,-0.426056\n\t\t\t\t,0.631589\n\t\t\t\t,0.999998\n\t\t\t\t,-3.99393e-007\n\t\t\t\t,0.00182101\n\t\t\t\t,0.647743\n\t\t\t\t,-0.426056\n\t\t\t\t,0.631589\n\t\t\t\t,0.358352\n\t\t\t\t,-0.865449\n\t\t\t\t,0.350116\n\t\t\t\t,0.499995\n\t\t\t\t,-0.866005\n\t\t\t\t,0.00636769\n\t\t\t\t,-0.492845\n\t\t\t\t,-0.8701\n\t\t\t\t,0.0054476\n\t\t\t\t,-0.261906\n\t\t\t\t,-0.816291\n\t\t\t\t,0.514854\n\t\t\t\t,-0.863225\n\t\t\t\t,-0.282098\n\t\t\t\t,0.418644\n\t\t\t\t,-1\n\t\t\t\t,-2.06477e-007\n\t\t\t\t,1.51228e-010\n\t\t\t\t,0\n\t\t\t\t,-0.894427\n\t\t\t\t,0.447214\n\t\t\t\t,0\n\t\t\t\t,-0.797167\n\t\t\t\t,-0.603758\n\t\t\t\t,0.303473\n\t\t\t\t,-0.691578\n\t\t\t\t,-0.655457\n\t\t\t\t,0.503047\n\t\t\t\t,-0.581253\n\t\t\t\t,0.639601\n\t\t\t\t,0.591326\n\t\t\t\t,-0.507329\n\t\t\t\t,-0.626858\n\t\t\t\t,0.701164\n\t\t\t\t,-0.647351\n\t\t\t\t,-0.298842\n\t\t\t\t,0\n\t\t\t\t,-0.894427\n\t\t\t\t,0.447214\n\t\t\t\t,0.360448\n\t\t\t\t,-0.575609\n\t\t\t\t,0.733997\n\t\t\t\t,0\n\t\t\t\t,0\n\t\t\t\t,1\n\t\t\t\t,0.503047\n\t\t\t\t,-0.581253\n\t\t\t\t,0.639601\n\t\t\t\t,0.528947\n\t\t\t\t,0.0365059\n\t\t\t\t,0.847869\n\t\t\t\t,0.905362\n\t\t\t\t,-0.311996\n\t\t\t\t,0.28806\n\t\t\t\t,0.657534\n\t\t\t\t,0.558521\n\t\t\t\t,0.50567\n\t\t\t\t,0.640768\n\t\t\t\t,-0.299025\n\t\t\t\t,0.707107\n\t\t\t\t,0.360448\n\t\t\t\t,-0.575609\n\t\t\t\t,0.733997\n\t\t\t\t,0.905362\n\t\t\t\t,-0.311996\n\t\t\t\t,0.28806\n\t\t\t\t,0.832584\n\t\t\t\t,0.272123\n\t\t\t\t,-0.482445\n\t\t\t\t,0.657534\n\t\t\t\t,0.558521\n\t\t\t\t,0.50567\n\t\t\t\t,0.523458\n\t\t\t\t,0.245644\n\t\t\t\t,-0.815874\n\t\t\t\t,0.528947\n\t\t\t\t,0.0365059\n\t\t\t\t,0.847869\n\t\t\t\t,0.528947\n\t\t\t\t,0.0365059\n\t\t\t\t,0.847869\n\t\t\t\t,0.523458\n\t\t\t\t,0.245644\n\t\t\t\t,-0.815874\n\t\t\t\t,0.752803\n\t\t\t\t,-0.546776\n\t\t\t\t,-0.366503\n\t\t\t\t,0.640768\n\t\t\t\t,-0.299025\n\t\t\t\t,0.707107\n\t\t\t\t,0.196581\n\t\t\t\t,-0.261863\n\t\t\t\t,-0.944872\n\t\t\t\t,0.523458\n\t\t\t\t,0.245644\n\t\t\t\t,-0.815874\n\t\t\t\t,0.591326\n\t\t\t\t,-0.507329\n\t\t\t\t,-0.626858\n\t\t\t\t,0.701164\n\t\t\t\t,-0.647351\n\t\t\t\t,-0.298842\n\t\t\t\t,0.752803\n\t\t\t\t,-0.546776\n\t\t\t\t,-0.366503\n\t\t\t\t,-0.367955\n\t\t\t\t,-0.0761964\n\t\t\t\t,0.926716\n\t\t\t\t,0\n\t\t\t\t,3.23333e-008\n\t\t\t\t,1\n\t\t\t\t,-0.265348\n\t\t\t\t,0.650654\n\t\t\t\t,0.711506\n\t\t\t\t,0\n\t\t\t\t,0.711033\n\t\t\t\t,0.703159\n\t\t\t\t,0\n\t\t\t\t,1\n\t\t\t\t,0\n\t\t\t\t,-0.370305\n\t\t\t\t,0.926542\n\t\t\t\t,0.0662918\n\t\t\t\t,-0.265741\n\t\t\t\t,0.722166\n\t\t\t\t,-0.638638\n\t\t\t\t,0\n\t\t\t\t,0.711033\n\t\t\t\t,-0.703159\n\t\t\t\t,0\n\t\t\t\t,3.23333e-008\n\t\t\t\t,-1\n\t\t\t\t,-0.367954\n\t\t\t\t,0.0761937\n\t\t\t\t,-0.926717\n\t\t\t\t,-0.265347\n\t\t\t\t,-0.650652\n\t\t\t\t,-0.711507\n\t\t\t\t,0\n\t\t\t\t,-0.711033\n\t\t\t\t,-0.703159\n\t\t\t\t,-0.265347\n\t\t\t\t,-0.650652\n\t\t\t\t,-0.711507\n\t\t\t\t,0\n\t\t\t\t,-0.711033\n\t\t\t\t,-0.703159\n\t\t\t\t,0\n\t\t\t\t,-1\n\t\t\t\t,0\n\t\t\t\t,-0.370305\n\t\t\t\t,-0.926542\n\t\t\t\t,-0.0662908\n\t\t\t\t,-0.265743\n\t\t\t\t,-0.722165\n\t\t\t\t,0.638638\n\t\t\t\t,0\n\t\t\t\t,-0.711033\n\t\t\t\t,0.703159\n\t\t\t\t,-0.311449\n\t\t\t\t,-0.0163107\n\t\t\t\t,0.950123\n\t\t\t\t,-0.311386\n\t\t\t\t,0.679247\n\t\t\t\t,0.664576\n\t\t\t\t,-0.30856\n\t\t\t\t,0.951172\n\t\t\t\t,0.00786201\n\t\t\t\t,-0.308173\n\t\t\t\t,0.69627\n\t\t\t\t,-0.648257\n\t\t\t\t,-0.311446\n\t\t\t\t,0.016299\n\t\t\t\t,-0.950124\n\t\t\t\t,-0.311387\n\t\t\t\t,-0.679237\n\t\t\t\t,-0.664586\n\t\t\t\t,-0.311387\n\t\t\t\t,-0.679237\n\t\t\t\t,-0.664586\n\t\t\t\t,-0.308561\n\t\t\t\t,-0.951172\n\t\t\t\t,-0.00785409\n\t\t\t\t,-0.308173\n\t\t\t\t,-0.69627\n\t\t\t\t,0.648257\n\t\t\t\t,1.77873e-006\n\t\t\t\t,0.147264\n\t\t\t\t,0.989097\n\t\t\t\t,-3.5727e-007\n\t\t\t\t,0.812825\n\t\t\t\t,0.582507\n\t\t\t\t,7.23951e-007\n\t\t\t\t,0.991903\n\t\t\t\t,-0.127\n\t\t\t\t,6.35273e-007\n\t\t\t\t,0.624982\n\t\t\t\t,-0.780639\n\t\t\t\t,6.34866e-007\n\t\t\t\t,-0.147255\n\t\t\t\t,-0.989098\n\t\t\t\t,7.74649e-007\n\t\t\t\t,-0.81282\n\t\t\t\t,-0.582515\n\t\t\t\t,7.74649e-007\n\t\t\t\t,-0.81282\n\t\t\t\t,-0.582515\n\t\t\t\t,-0.311387\n\t\t\t\t,-0.679237\n\t\t\t\t,-0.664586\n\t\t\t\t,-0.308561\n\t\t\t\t,-0.951172\n\t\t\t\t,-0.00785409\n\t\t\t\t,7.74649e-007\n\t\t\t\t,-0.81282\n\t\t\t\t,-0.582515\n\t\t\t\t,2.83281e-007\n\t\t\t\t,-0.9919\n\t\t\t\t,0.127018\n\t\t\t\t,1.90696e-007\n\t\t\t\t,-0.624998\n\t\t\t\t,0.780626\n\t\t\t\t,-0.301697\n\t\t\t\t,0.609799\n\t\t\t\t,0.732887\n\t\t\t\t,-0.427292\n\t\t\t\t,-0.251098\n\t\t\t\t,0.868546\n\t\t\t\t,0.250232\n\t\t\t\t,0.865327\n\t\t\t\t,0.434273\n\t\t\t\t,-0.948845\n\t\t\t\t,-0.116359\n\t\t\t\t,0.293518\n\t\t\t\t,-0.342716\n\t\t\t\t,0.892408\n\t\t\t\t,-0.293518\n\t\t\t\t,-0.948845\n\t\t\t\t,-0.116359\n\t\t\t\t,0.293518\n\t\t\t\t,-0.301697\n\t\t\t\t,0.609799\n\t\t\t\t,0.732887\n\t\t\t\t,-0.680059\n\t\t\t\t,-0.0198999\n\t\t\t\t,-0.732887\n\t\t\t\t,0.0211057\n\t\t\t\t,0.495159\n\t\t\t\t,-0.868546\n\t\t\t\t,-0.680059\n\t\t\t\t,-0.0198999\n\t\t\t\t,-0.732887\n\t\t\t\t,-0.342716\n\t\t\t\t,0.892408\n\t\t\t\t,-0.293518\n\t\t\t\t,-0.646562\n\t\t\t\t,-0.627187\n\t\t\t\t,-0.434273\n\t\t\t\t,-0.680059\n\t\t\t\t,-0.0198999\n\t\t\t\t,-0.732887\n\t\t\t\t,-0.342716\n\t\t\t\t,0.892408\n\t\t\t\t,-0.293518\n\t\t\t\t,0.250232\n\t\t\t\t,0.865327\n\t\t\t\t,0.434273\n\t\t\t\t,0.0211057\n\t\t\t\t,0.495159\n\t\t\t\t,-0.868546\n\t\t\t\t,-0.301697\n\t\t\t\t,0.609799\n\t\t\t\t,0.732887\n\t\t\t\t,-0.948845\n\t\t\t\t,-0.116359\n\t\t\t\t,0.293518\n\t\t\t\t,-0.646562\n\t\t\t\t,-0.627187\n\t\t\t\t,-0.434273\n\t\t\t\t,-0.427292\n\t\t\t\t,-0.251098\n\t\t\t\t,0.868546\n\t\t\t\t,-0.680059\n\t\t\t\t,-0.0198999\n\t\t\t\t,-0.732887\n\t\t\t\t,-0.613951\n\t\t\t\t,0.775041\n\t\t\t\t,-0.149586\n\t\t\t\t,-0.332707\n\t\t\t\t,0.328669\n\t\t\t\t,-0.883902\n\t\t\t\t,-0.83205\n\t\t\t\t,-0.0674189\n\t\t\t\t,-0.550588\n\t\t\t\t,-0.852201\n\t\t\t\t,0.389021\n\t\t\t\t,-0.349881\n\t\t\t\t,-0.894428\n\t\t\t\t,0.0420688\n\t\t\t\t,0.445229\n\t\t\t\t,-0.622248\n\t\t\t\t,0.360366\n\t\t\t\t,0.694941\n\t\t\t\t,-0.384857\n\t\t\t\t,0.908558\n\t\t\t\t,-0.162503\n\t\t\t\t,0.332709\n\t\t\t\t,0.103678\n\t\t\t\t,-0.937313\n\t\t\t\t,0.948683\n\t\t\t\t,-0.0384348\n\t\t\t\t,-0.313883\n\t\t\t\t,-0.83205\n\t\t\t\t,-0.0674189\n\t\t\t\t,-0.550588\n\t\t\t\t,-0.332707\n\t\t\t\t,0.328669\n\t\t\t\t,-0.883902\n\t\t\t\t,0.613952\n\t\t\t\t,0.642939\n\t\t\t\t,-0.457921\n\t\t\t\t,-0.613951\n\t\t\t\t,0.775041\n\t\t\t\t,-0.149586\n\t\t\t\t,0.852202\n\t\t\t\t,0.5093\n\t\t\t\t,-0.119851\n\t\t\t\t,0.613952\n\t\t\t\t,0.642939\n\t\t\t\t,-0.457921\n\t\t\t\t,-0.613951\n\t\t\t\t,0.775041\n\t\t\t\t,-0.149586\n\t\t\t\t,-0.852201\n\t\t\t\t,0.389021\n\t\t\t\t,-0.349881\n\t\t\t\t,0.384867\n\t\t\t\t,0.697004\n\t\t\t\t,-0.605031\n\t\t\t\t,0.852202\n\t\t\t\t,0.5093\n\t\t\t\t,-0.119851\n\t\t\t\t,-0.852201\n\t\t\t\t,0.389021\n\t\t\t\t,-0.349881\n\t\t\t\t,-0.384857\n\t\t\t\t,0.908558\n\t\t\t\t,-0.162503\n\t\t\t\t,0.622243\n\t\t\t\t,0.632934\n\t\t\t\t,0.46066\n\t\t\t\t,0.384867\n\t\t\t\t,0.697004\n\t\t\t\t,-0.605031\n\t\t\t\t,-0.384857\n\t\t\t\t,0.908558\n\t\t\t\t,-0.162503\n\t\t\t\t,0.707103\n\t\t\t\t,0.0665173\n\t\t\t\t,0.703975\n\t\t\t\t,0.622243\n\t\t\t\t,0.632934\n\t\t\t\t,0.46066\n\t\t\t\t,0.948683\n\t\t\t\t,-0.0384348\n\t\t\t\t,-0.313883\n\t\t\t\t,0.332709\n\t\t\t\t,0.103678\n\t\t\t\t,-0.937313\n\t\t\t\t,0.613952\n\t\t\t\t,0.642939\n\t\t\t\t,-0.457921\n\t\t\t\t,0.852202\n\t\t\t\t,0.5093\n\t\t\t\t,-0.119851\n\t\t\t\t,0.384867\n\t\t\t\t,0.697004\n\t\t\t\t,-0.605031\n\t\t\t\t,0.622243\n\t\t\t\t,0.632934\n\t\t\t\t,0.46066\n\t\t\t\t,-0.500005\n\t\t\t\t,-2.72063e-006\n\t\t\t\t,0.866023\n\t\t\t\t,-0.990029\n\t\t\t\t,0.114111\n\t\t\t\t,0.0825961\n\t\t\t\t,-1\n\t\t\t\t,-3.65927e-012\n\t\t\t\t,-4.68014e-006\n\t\t\t\t,-0.393293\n\t\t\t\t,0.0538443\n\t\t\t\t,0.917835\n\t\t\t\t,0.561848\n\t\t\t\t,-0.0816065\n\t\t\t\t,0.823205\n\t\t\t\t,0.5\n\t\t\t\t,-3.40079e-006\n\t\t\t\t,0.866025\n\t\t\t\t,1\n\t\t\t\t,-4.53444e-007\n\t\t\t\t,-1.00141e-005\n\t\t\t\t,0.978292\n\t\t\t\t,-0.172001\n\t\t\t\t,-0.115585\n\t\t\t\t,0.424177\n\t\t\t\t,-0.0404165\n\t\t\t\t,-0.904677\n\t\t\t\t,0.978292\n\t\t\t\t,-0.172001\n\t\t\t\t,-0.115585\n\t\t\t\t,1\n\t\t\t\t,-4.53444e-007\n\t\t\t\t,-1.00141e-005\n\t\t\t\t,0.499996\n\t\t\t\t,6.80157e-007\n\t\t\t\t,-0.866028\n\t\t\t\t,-0.499996\n\t\t\t\t,4.53437e-007\n\t\t\t\t,-0.866028\n\t\t\t\t,-0.586015\n\t\t\t\t,0.106145\n\t\t\t\t,-0.803318\n\t\t\t\t,-0.990029\n\t\t\t\t,0.114111\n\t\t\t\t,0.0825961\n\t\t\t\t,-1\n\t\t\t\t,-3.65927e-012\n\t\t\t\t,-4.68014e-006\n\t\t\t\t,-0.463939\n\t\t\t\t,0.188369\n\t\t\t\t,0.865609\n\t\t\t\t,-0.903291\n\t\t\t\t,0.429029\n\t\t\t\t,-0.000603461\n\t\t\t\t,0.434929\n\t\t\t\t,-0.249205\n\t\t\t\t,0.865294\n\t\t\t\t,0.894154\n\t\t\t\t,-0.447759\n\t\t\t\t,-0.000785258\n\t\t\t\t,0.461353\n\t\t\t\t,-0.196404\n\t\t\t\t,-0.865205\n\t\t\t\t,0.894154\n\t\t\t\t,-0.447759\n\t\t\t\t,-0.000785258\n\t\t\t\t,-0.438772\n\t\t\t\t,0.242051\n\t\t\t\t,-0.865385\n\t\t\t\t,-0.903291\n\t\t\t\t,0.429029\n\t\t\t\t,-0.000603461\n\t\t\t\t,-0.3529\n\t\t\t\t,0.350362\n\t\t\t\t,0.867588\n\t\t\t\t,-0.647045\n\t\t\t\t,0.76245\n\t\t\t\t,0.00172565\n\t\t\t\t,0.290974\n\t\t\t\t,-0.402397\n\t\t\t\t,0.867993\n\t\t\t\t,0.646707\n\t\t\t\t,-0.762736\n\t\t\t\t,-0.00199037\n\t\t\t\t,0.350494\n\t\t\t\t,-0.353902\n\t\t\t\t,-0.867126\n\t\t\t\t,0.646707\n\t\t\t\t,-0.762736\n\t\t\t\t,-0.00199037\n\t\t\t\t,-0.287348\n\t\t\t\t,0.404025\n\t\t\t\t,-0.868444\n\t\t\t\t,-0.647045\n\t\t\t\t,0.76245\n\t\t\t\t,0.00172565\n\t\t\t\t,-0.164122\n\t\t\t\t,0.470607\n\t\t\t\t,0.866944\n\t\t\t\t,-0.271647\n\t\t\t\t,0.962396\n\t\t\t\t,0.0013418\n\t\t\t\t,0.108193\n\t\t\t\t,-0.485199\n\t\t\t\t,0.867684\n\t\t\t\t,0.280939\n\t\t\t\t,-0.959725\n\t\t\t\t,-0.000776519\n\t\t\t\t,0.169415\n\t\t\t\t,-0.46838\n\t\t\t\t,-0.867132\n\t\t\t\t,0.280939\n\t\t\t\t,-0.959725\n\t\t\t\t,-0.000776519\n\t\t\t\t,-0.106464\n\t\t\t\t,0.485827\n\t\t\t\t,-0.867547\n\t\t\t\t,-0.271647\n\t\t\t\t,0.962396\n\t\t\t\t,0.0013418\n\t\t\t\t,-0.0319424\n\t\t\t\t,0.499232\n\t\t\t\t,0.865879\n\t\t\t\t,-0.0478939\n\t\t\t\t,0.998852\n\t\t\t\t,0.000297822\n\t\t\t\t,0.015974\n\t\t\t\t,-0.499594\n\t\t\t\t,0.866113\n\t\t\t\t,0.0479518\n\t\t\t\t,-0.99885\n\t\t\t\t,-0.000332738\n\t\t\t\t,0.031964\n\t\t\t\t,-0.499119\n\t\t\t\t,-0.865944\n\t\t\t\t,0.0479518\n\t\t\t\t,-0.99885\n\t\t\t\t,-0.000332738\n\t\t\t\t,-0.0159745\n\t\t\t\t,0.499742\n\t\t\t\t,-0.866027\n\t\t\t\t,-0.0478939\n\t\t\t\t,0.998852\n\t\t\t\t,0.000297822\n\t\t\t\t,-0.0478939\n\t\t\t\t,0.998852\n\t\t\t\t,0.000297822\n\t\t\t\t,-0.0319424\n\t\t\t\t,0.499232\n\t\t\t\t,0.865879\n\t\t\t\t,-2.96649e-006\n\t\t\t\t,0.654772\n\t\t\t\t,0.755826\n\t\t\t\t,-3.71177e-006\n\t\t\t\t,0.981996\n\t\t\t\t,-0.1889\n\t\t\t\t,0.015974\n\t\t\t\t,-0.499594\n\t\t\t\t,0.866113\n\t\t\t\t,1.08423e-007\n\t\t\t\t,-0.327279\n\t\t\t\t,0.944928\n\t\t\t\t,0.0479518\n\t\t\t\t,-0.99885\n\t\t\t\t,-0.000332738\n\t\t\t\t,-4.86842e-006\n\t\t\t\t,-0.981972\n\t\t\t\t,0.189029\n\t\t\t\t,0.0479518\n\t\t\t\t,-0.99885\n\t\t\t\t,-0.000332738\n\t\t\t\t,0.031964\n\t\t\t\t,-0.499119\n\t\t\t\t,-0.865944\n\t\t\t\t,-1.28932e-006\n\t\t\t\t,-0.654576\n\t\t\t\t,-0.755996\n\t\t\t\t,-4.86842e-006\n\t\t\t\t,-0.981972\n\t\t\t\t,0.189029\n\t\t\t\t,-0.0159745\n\t\t\t\t,0.499742\n\t\t\t\t,-0.866027\n\t\t\t\t,-2.40735e-006\n\t\t\t\t,0.327407\n\t\t\t\t,-0.944883\n\t\t\t\t,-0.0478939\n\t\t\t\t,0.998852\n\t\t\t\t,0.000297822\n\t\t\t\t,-3.71177e-006\n\t\t\t\t,0.981996\n\t\t\t\t,-0.1889\n\t\t\t\t,-0.499999\n\t\t\t\t,-0.866019\n\t\t\t\t,-0.00360998\n\t\t\t\t,-1\n\t\t\t\t,8.51718e-007\n\t\t\t\t,1.69443e-007\n\t\t\t\t,-1\n\t\t\t\t,-2.7014e-006\n\t\t\t\t,-1.12917e-008\n\t\t\t\t,-0.499998\n\t\t\t\t,-0.866019\n\t\t\t\t,-0.00360996\n\t\t\t\t,0.499998\n\t\t\t\t,-0.866019\n\t\t\t\t,-0.00360999\n\t\t\t\t,-0.499998\n\t\t\t\t,-0.866019\n\t\t\t\t,-0.00360996\n\t\t\t\t,-0.499999\n\t\t\t\t,-0.866019\n\t\t\t\t,-0.00360998\n\t\t\t\t,0.499999\n\t\t\t\t,-0.866019\n\t\t\t\t,-0.00360996\n\t\t\t\t,1\n\t\t\t\t,8.51718e-007\n\t\t\t\t,1.69443e-007\n\t\t\t\t,0.499998\n\t\t\t\t,-0.866019\n\t\t\t\t,-0.00360999\n\t\t\t\t,0.499999\n\t\t\t\t,-0.866019\n\t\t\t\t,-0.00360996\n\t\t\t\t,1\n\t\t\t\t,4.40486e-006\n\t\t\t\t,1.84163e-008\n\t\t\t\t,0.499997\n\t\t\t\t,0.866019\n\t\t\t\t,0.00361082\n\t\t\t\t,1\n\t\t\t\t,4.40486e-006\n\t\t\t\t,1.84163e-008\n\t\t\t\t,1\n\t\t\t\t,8.51718e-007\n\t\t\t\t,1.69443e-007\n\t\t\t\t,0.500001\n\t\t\t\t,0.866017\n\t\t\t\t,0.00361095\n\t\t\t\t,-0.499998\n\t\t\t\t,0.866019\n\t\t\t\t,0.00361082\n\t\t\t\t,0.499997\n\t\t\t\t,0.866019\n\t\t\t\t,0.00361082\n\t\t\t\t,0.500001\n\t\t\t\t,0.866017\n\t\t\t\t,0.00361095\n\t\t\t\t,-0.499994\n\t\t\t\t,0.866021\n\t\t\t\t,0.00361096\n\t\t\t\t,-1\n\t\t\t\t,8.51718e-007\n\t\t\t\t,1.69443e-007\n\t\t\t\t,-0.499994\n\t\t\t\t,0.866021\n\t\t\t\t,0.00361096\n\t\t\t\t,-0.499998\n\t\t\t\t,0.866019\n\t\t\t\t,0.00361082\n\t\t\t\t,-1\n\t\t\t\t,-2.7014e-006\n\t\t\t\t,-1.12917e-008\n\t\t\t\t,0.265348\n\t\t\t\t,0.650654\n\t\t\t\t,0.711505\n\t\t\t\t,0\n\t\t\t\t,3.23333e-008\n\t\t\t\t,1\n\t\t\t\t,0.367955\n\t\t\t\t,-0.0761971\n\t\t\t\t,0.926716\n\t\t\t\t,0\n\t\t\t\t,0.711033\n\t\t\t\t,0.703159\n\t\t\t\t,0\n\t\t\t\t,1\n\t\t\t\t,2.57476e-007\n\t\t\t\t,0.370305\n\t\t\t\t,0.926542\n\t\t\t\t,0.0662921\n\t\t\t\t,0.265741\n\t\t\t\t,0.722166\n\t\t\t\t,-0.638638\n\t\t\t\t,0\n\t\t\t\t,0.711033\n\t\t\t\t,-0.703159\n\t\t\t\t,0\n\t\t\t\t,3.23333e-008\n\t\t\t\t,-1\n\t\t\t\t,0.367954\n\t\t\t\t,0.0761933\n\t\t\t\t,-0.926717\n\t\t\t\t,0.265347\n\t\t\t\t,-0.650652\n\t\t\t\t,-0.711507\n\t\t\t\t,0\n\t\t\t\t,-0.711033\n\t\t\t\t,-0.703159\n\t\t\t\t,0\n\t\t\t\t,-1\n\t\t\t\t,2.57476e-007\n\t\t\t\t,0\n\t\t\t\t,-0.711033\n\t\t\t\t,-0.703159\n\t\t\t\t,0.265347\n\t\t\t\t,-0.650652\n\t\t\t\t,-0.711507\n\t\t\t\t,0.370305\n\t\t\t\t,-0.926542\n\t\t\t\t,-0.0662905\n\t\t\t\t,0.265743\n\t\t\t\t,-0.722165\n\t\t\t\t,0.638638\n\t\t\t\t,0\n\t\t\t\t,-0.711033\n\t\t\t\t,0.703159\n\t\t\t\t,0.31145\n\t\t\t\t,-0.0163108\n\t\t\t\t,0.950123\n\t\t\t\t,0.311386\n\t\t\t\t,0.679248\n\t\t\t\t,0.664575\n\t\t\t\t,0.30856\n\t\t\t\t,0.951172\n\t\t\t\t,0.00786251\n\t\t\t\t,0.308173\n\t\t\t\t,0.69627\n\t\t\t\t,-0.648257\n\t\t\t\t,0.311446\n\t\t\t\t,0.0162989\n\t\t\t\t,-0.950124\n\t\t\t\t,0.311387\n\t\t\t\t,-0.679237\n\t\t\t\t,-0.664587\n\t\t\t\t,0.311387\n\t\t\t\t,-0.679237\n\t\t\t\t,-0.664587\n\t\t\t\t,0.308561\n\t\t\t\t,-0.951172\n\t\t\t\t,-0.00785359\n\t\t\t\t,0.308173\n\t\t\t\t,-0.69627\n\t\t\t\t,0.648257\n\t\t\t\t,-1.39743e-006\n\t\t\t\t,0.147265\n\t\t\t\t,0.989097\n\t\t\t\t,3.94317e-007\n\t\t\t\t,0.812825\n\t\t\t\t,0.582508\n\t\t\t\t,-7.23949e-007\n\t\t\t\t,0.991903\n\t\t\t\t,-0.127\n\t\t\t\t,-7.29602e-007\n\t\t\t\t,0.624982\n\t\t\t\t,-0.780639\n\t\t\t\t,-8.25512e-007\n\t\t\t\t,-0.147255\n\t\t\t\t,-0.989099\n\t\t\t\t,-8.11694e-007\n\t\t\t\t,-0.81282\n\t\t\t\t,-0.582515\n\t\t\t\t,0.308561\n\t\t\t\t,-0.951172\n\t\t\t\t,-0.00785359\n\t\t\t\t,0.311387\n\t\t\t\t,-0.679237\n\t\t\t\t,-0.664587\n\t\t\t\t,-8.11694e-007\n\t\t\t\t,-0.81282\n\t\t\t\t,-0.582515\n\t\t\t\t,-2.83281e-007\n\t\t\t\t,-0.9919\n\t\t\t\t,0.127018\n\t\t\t\t,-8.11694e-007\n\t\t\t\t,-0.81282\n\t\t\t\t,-0.582515\n\t\t\t\t,-2.04867e-009\n\t\t\t\t,-0.625\n\t\t\t\t,0.780625\n\t\t\t\t,-0.180226\n\t\t\t\t,-0.654801\n\t\t\t\t,-0.733998\n\t\t\t\t,0\n\t\t\t\t,-0.707107\n\t\t\t\t,-0.707107\n\t\t\t\t,0\n\t\t\t\t,-0.894427\n\t\t\t\t,0.447214\n\t\t\t\t,-0.694157\n\t\t\t\t,-0.651324\n\t\t\t\t,-0.306469\n\t\t\t\t,-0.579372\n\t\t\t\t,-0.509948\n\t\t\t\t,-0.635831\n\t\t\t\t,-0.489821\n\t\t\t\t,-0.583377\n\t\t\t\t,0.647879\n\t\t\t\t,0\n\t\t\t\t,0\n\t\t\t\t,1\n\t\t\t\t,-0.360448\n\t\t\t\t,-0.575609\n\t\t\t\t,0.733997\n\t\t\t\t,-0.523076\n\t\t\t\t,0.0358553\n\t\t\t\t,0.851532\n\t\t\t\t,-0.489821\n\t\t\t\t,-0.583377\n\t\t\t\t,0.647879\n\t\t\t\t,-0.644853\n\t\t\t\t,0.562006\n\t\t\t\t,0.51799\n\t\t\t\t,-0.901897\n\t\t\t\t,-0.314565\n\t\t\t\t,0.296025\n\t\t\t\t,-0.640768\n\t\t\t\t,-0.299025\n\t\t\t\t,0.707107\n\t\t\t\t,-0.579372\n\t\t\t\t,-0.509948\n\t\t\t\t,-0.635831\n\t\t\t\t,-0.360448\n\t\t\t\t,-0.575609\n\t\t\t\t,0.733997\n\t\t\t\t,-0.360448\n\t\t\t\t,-0.575609\n\t\t\t\t,0.733997\n\t\t\t\t,-0.901897\n\t\t\t\t,-0.314565\n\t\t\t\t,0.296025\n\t\t\t\t,-0.694157\n\t\t\t\t,-0.651324\n\t\t\t\t,-0.306469\n\t\t\t\t,-0.489821\n\t\t\t\t,-0.583377\n\t\t\t\t,0.647879\n\t\t\t\t,-0.82423\n\t\t\t\t,0.274109\n\t\t\t\t,-0.495489\n\t\t\t\t,-0.381047\n\t\t\t\t,0.34121\n\t\t\t\t,-0.85929\n\t\t\t\t,-0.644853\n\t\t\t\t,0.562006\n\t\t\t\t,0.51799\n\t\t\t\t,-0.523076\n\t\t\t\t,0.0358553\n\t\t\t\t,0.851532\n\t\t\t\t,-0.810515\n\t\t\t\t,-0.37824\n\t\t\t\t,-0.447214\n\t\t\t\t,-0.381047\n\t\t\t\t,0.34121\n\t\t\t\t,-0.85929\n\t\t\t\t,-0.523076\n\t\t\t\t,0.0358553\n\t\t\t\t,0.851532\n\t\t\t\t,-0.640768\n\t\t\t\t,-0.299025\n\t\t\t\t,0.707107\n\t\t\t\t,0\n\t\t\t\t,-0.707107\n\t\t\t\t,-0.707107\n\t\t\t\t,-0.180226\n\t\t\t\t,-0.654801\n\t\t\t\t,-0.733998\n\t\t\t\t,0\n\t\t\t\t,0\n\t\t\t\t,-1\n\t\t\t\t,-0.579372\n\t\t\t\t,-0.509948\n\t\t\t\t,-0.635831\n\t\t\t\t,-0.381047\n\t\t\t\t,0.34121\n\t\t\t\t,-0.85929\n\t\t\t\t,-0.694157\n\t\t\t\t,-0.651324\n\t\t\t\t,-0.306469\n\t\t\t\t,-0.82423\n\t\t\t\t,0.274109\n\t\t\t\t,-0.495489\n\t\t\t\t,-0.810515\n\t\t\t\t,-0.37824\n\t\t\t\t,-0.447214\n\t\t\t\t,0.444609\n\t\t\t\t,0.212317\n\t\t\t\t,0.870198\n\t\t\t\t,0\n\t\t\t\t,-0.559231\n\t\t\t\t,0.829012\n\t\t\t\t,0.863225\n\t\t\t\t,-0.282098\n\t\t\t\t,0.418644\n\t\t\t\t,-0.560481\n\t\t\t\t,0.623089\n\t\t\t\t,0.545547\n\t\t\t\t,-0.647743\n\t\t\t\t,-0.426056\n\t\t\t\t,0.631589\n\t\t\t\t,-0.358352\n\t\t\t\t,-0.865449\n\t\t\t\t,0.350116\n\t\t\t\t,0.261906\n\t\t\t\t,-0.816291\n\t\t\t\t,0.514854\n\t\t\t\t,0.493676\n\t\t\t\t,0.869638\n\t\t\t\t,0.00363091\n\t\t\t\t,0.863225\n\t\t\t\t,-0.282098\n\t\t\t\t,0.418644\n\t\t\t\t,1\n\t\t\t\t,-2.06477e-007\n\t\t\t\t,4.43098e-008\n\t\t\t\t,0.444609\n\t\t\t\t,0.212317\n\t\t\t\t,0.870198\n\t\t\t\t,-0.560481\n\t\t\t\t,0.623089\n\t\t\t\t,0.545547\n\t\t\t\t,-0.499997\n\t\t\t\t,0.866015\n\t\t\t\t,0.00445858\n\t\t\t\t,-0.999998\n\t\t\t\t,-4.16758e-007\n\t\t\t\t,0.00182103\n\t\t\t\t,-0.647743\n\t\t\t\t,-0.426056\n\t\t\t\t,0.631589\n\t\t\t\t,-0.358352\n\t\t\t\t,-0.865449\n\t\t\t\t,0.350116\n\t\t\t\t,-0.647743\n\t\t\t\t,-0.426056\n\t\t\t\t,0.631589\n\t\t\t\t,-0.999998\n\t\t\t\t,-4.16758e-007\n\t\t\t\t,0.00182103\n\t\t\t\t,-0.499995\n\t\t\t\t,-0.866005\n\t\t\t\t,0.00636769\n\t\t\t\t,0.492845\n\t\t\t\t,-0.8701\n\t\t\t\t,0.00544761\n\t\t\t\t,-0.358352\n\t\t\t\t,-0.865449\n\t\t\t\t,0.350116\n\t\t\t\t,0.261906\n\t\t\t\t,-0.816291\n\t\t\t\t,0.514854\n\t\t\t\t,0.863225\n\t\t\t\t,-0.282098\n\t\t\t\t,0.418644\n\t\t\t\t,0.261906\n\t\t\t\t,-0.816291\n\t\t\t\t,0.514854\n\t\t\t\t,1\n\t\t\t\t,-2.06477e-007\n\t\t\t\t,4.43098e-008\n\t\t\t\t,0.409508\n\t\t\t\t,0.404646\n\t\t\t\t,-0.817658\n\t\t\t\t,-0.407409\n\t\t\t\t,-0.412306\n\t\t\t\t,-0.814875\n\t\t\t\t,-0.668683\n\t\t\t\t,0.664714\n\t\t\t\t,-0.333194\n\t\t\t\t,0.665139\n\t\t\t\t,-0.669138\n\t\t\t\t,-0.331428\n\t\t\t\t,-0.668683\n\t\t\t\t,0.664714\n\t\t\t\t,-0.333194\n\t\t\t\t,-0.704983\n\t\t\t\t,-0.709223\n\t\t\t\t,0.00122293\n\t\t\t\t,-0.707103\n\t\t\t\t,0.707107\n\t\t\t\t,0.00245314\n\t\t\t\t,-0.407409\n\t\t\t\t,-0.412306\n\t\t\t\t,-0.814875\n\t\t\t\t,0.709208\n\t\t\t\t,0.704998\n\t\t\t\t,0.00123014\n\t\t\t\t,0.665139\n\t\t\t\t,-0.669138\n\t\t\t\t,-0.331428\n\t\t\t\t,0.409508\n\t\t\t\t,0.404646\n\t\t\t\t,-0.817658\n\t\t\t\t,0.707107\n\t\t\t\t,-0.707107\n\t\t\t\t,0\n\t\t\t\t,-0.668683\n\t\t\t\t,0.664714\n\t\t\t\t,-0.333194\n\t\t\t\t,0.709208\n\t\t\t\t,0.704998\n\t\t\t\t,0.00123014\n\t\t\t\t,0.409508\n\t\t\t\t,0.404646\n\t\t\t\t,-0.817658\n\t\t\t\t,-0.707103\n\t\t\t\t,0.707107\n\t\t\t\t,0.00245314\n\t\t\t\t,-0.704983\n\t\t\t\t,-0.709223\n\t\t\t\t,0.00122293\n\t\t\t\t,0.665139\n\t\t\t\t,-0.669138\n\t\t\t\t,-0.331428\n\t\t\t\t,0.707107\n\t\t\t\t,-0.707107\n\t\t\t\t,0\n\t\t\t\t,-0.407409\n\t\t\t\t,-0.412306\n\t\t\t\t,-0.814875\n\t\t\t\t,0\n\t\t\t\t,-0.43107\n\t\t\t\t,0.902319\n\t\t\t\t,0\n\t\t\t\t,0.486826\n\t\t\t\t,0.873499\n\t\t\t\t,-0.109932\n\t\t\t\t,0.301712\n\t\t\t\t,0.94704\n\t\t\t\t,-0.166187\n\t\t\t\t,-0.547738\n\t\t\t\t,0.819979\n\t\t\t\t,-0.118106\n\t\t\t\t,0.159625\n\t\t\t\t,0.980087\n\t\t\t\t,-0.0801055\n\t\t\t\t,-0.70182\n\t\t\t\t,0.707836\n\t\t\t\t,-2.82445e-006\n\t\t\t\t,-1\n\t\t\t\t,0\n\t\t\t\t,-2.82445e-006\n\t\t\t\t,-1\n\t\t\t\t,0\n\t\t\t\t,-0.556955\n\t\t\t\t,-0.830543\n\t\t\t\t,0\n\t\t\t\t,-0.556955\n\t\t\t\t,-0.830543\n\t\t\t\t,0\n\t\t\t\t,-2.82445e-006\n\t\t\t\t,-1\n\t\t\t\t,0\n\t\t\t\t,-0.556955\n\t\t\t\t,-0.830543\n\t\t\t\t,0\n\t\t\t\t,-9.98093e-007\n\t\t\t\t,-0.887667\n\t\t\t\t,0.460485\n\t\t\t\t,-0.538401\n\t\t\t\t,-0.806279\n\t\t\t\t,0.245027\n\t\t\t\t,-2.82445e-006\n\t\t\t\t,-1\n\t\t\t\t,0\n\t\t\t\t,-0.556955\n\t\t\t\t,-0.830543\n\t\t\t\t,0\n\t\t\t\t,-2.82445e-006\n\t\t\t\t,-1\n\t\t\t\t,0\n\t\t\t\t,-0.556955\n\t\t\t\t,-0.830543\n\t\t\t\t,0\n\t\t\t\t,-2.82445e-006\n\t\t\t\t,-1\n\t\t\t\t,0\n\t\t\t\t,-0.548639\n\t\t\t\t,-0.832661\n\t\t\t\t,-0.0752992\n\t\t\t\t,-3.18895e-006\n\t\t\t\t,-0.993887\n\t\t\t\t,0.1104\n\t\t\t\t,-0.490043\n\t\t\t\t,-0.858577\n\t\t\t\t,0.150676\n\t\t\t\t,-0.0239762\n\t\t\t\t,-0.999311\n\t\t\t\t,0.0283283\n\t\t\t\t,-0.559846\n\t\t\t\t,-0.817331\n\t\t\t\t,-0.136172\n\t\t\t\t,9.99114e-007\n\t\t\t\t,-0.940053\n\t\t\t\t,0.341028\n\t\t\t\t,-0.487773\n\t\t\t\t,-0.780902\n\t\t\t\t,0.390218\n\t\t\t\t,-0.0239079\n\t\t\t\t,-0.911301\n\t\t\t\t,0.411046\n\t\t\t\t,-0.395642\n\t\t\t\t,-0.862791\n\t\t\t\t,0.314736\n\t\t\t\t,0\n\t\t\t\t,-0.43107\n\t\t\t\t,0.902319\n\t\t\t\t,-0.166187\n\t\t\t\t,-0.547738\n\t\t\t\t,0.819979\n\t\t\t\t,-0.0655848\n\t\t\t\t,0.00329327\n\t\t\t\t,-0.997842\n\t\t\t\t,-0.0970761\n\t\t\t\t,-0.617147\n\t\t\t\t,-0.780836\n\t\t\t\t,-0.387691\n\t\t\t\t,-0.598574\n\t\t\t\t,-0.701003\n\t\t\t\t,-0.156688\n\t\t\t\t,0.310153\n\t\t\t\t,-0.937685\n\t\t\t\t,-0.0239762\n\t\t\t\t,-0.999311\n\t\t\t\t,0.0283283\n\t\t\t\t,-0.559846\n\t\t\t\t,-0.817331\n\t\t\t\t,-0.136172\n\t\t\t\t,-0.70498\n\t\t\t\t,-0.704742\n\t\t\t\t,-0.0796332\n\t\t\t\t,-1\n\t\t\t\t,0\n\t\t\t\t,0\n\t\t\t\t,-0.823668\n\t\t\t\t,-0.557629\n\t\t\t\t,-0.103061\n\t\t\t\t,-0.655536\n\t\t\t\t,-0.755033\n\t\t\t\t,-0.0140547\n\t\t\t\t,-0.754386\n\t\t\t\t,-0.655728\n\t\t\t\t,0.0303789\n\t\t\t\t,-1\n\t\t\t\t,0\n\t\t\t\t,0\n\t\t\t\t,-0.890327\n\t\t\t\t,0.454797\n\t\t\t\t,0.0218428\n\t\t\t\t,-0.898276\n\t\t\t\t,-0.434238\n\t\t\t\t,-0.0673592\n\t\t\t\t,-0.889904\n\t\t\t\t,0.432015\n\t\t\t\t,-0.146402\n\t\t\t\t,-0.84312\n\t\t\t\t,0.512713\n\t\t\t\t,0.162091\n\t\t\t\t,-0.853562\n\t\t\t\t,0.520987\n\t\t\t\t,0.00222179\n\t\t\t\t,-0.860165\n\t\t\t\t,-0.509928\n\t\t\t\t,-0.00944199\n\t\t\t\t,-0.894332\n\t\t\t\t,0.398965\n\t\t\t\t,-0.202476\n\t\t\t\t,-0.798864\n\t\t\t\t,-0.569515\n\t\t\t\t,0.193569\n\t\t\t\t,-0.928533\n\t\t\t\t,0.101743\n\t\t\t\t,-0.357036\n\t\t\t\t,-0.950698\n\t\t\t\t,0.30853\n\t\t\t\t,-0.0313385\n\t\t\t\t,-0.801653\n\t\t\t\t,-0.586522\n\t\t\t\t,0.115516\n\t\t\t\t,-0.956751\n\t\t\t\t,0.290742\n\t\t\t\t,-0.00983039\n\t\t\t\t,-0.637809\n\t\t\t\t,-0.768826\n\t\t\t\t,0.0458956\n\t\t\t\t,-0.974108\n\t\t\t\t,0.226078\n\t\t\t\t,0.00164488\n\t\t\t\t,-0.311924\n\t\t\t\t,-0.894668\n\t\t\t\t,0.3198\n\t\t\t\t,-0.641606\n\t\t\t\t,0.0593124\n\t\t\t\t,0.764738\n\t\t\t\t,-0.306116\n\t\t\t\t,-0.910737\n\t\t\t\t,0.277221\n\t\t\t\t,-0.676081\n\t\t\t\t,-0.735039\n\t\t\t\t,-0.0512933\n\t\t\t\t,-0.644331\n\t\t\t\t,-0.764702\n\t\t\t\t,-0.00822072\n\t\t\t\t,-0.70498\n\t\t\t\t,-0.704742\n\t\t\t\t,-0.0796332\n\t\t\t\t,-0.823668\n\t\t\t\t,-0.557629\n\t\t\t\t,-0.103061\n\t\t\t\t,-0.615222\n\t\t\t\t,-0.788351\n\t\t\t\t,-0.00213144\n\t\t\t\t,-0.655536\n\t\t\t\t,-0.755033\n\t\t\t\t,-0.0140547\n\t\t\t\t,-0.583526\n\t\t\t\t,-0.799513\n\t\t\t\t,0.142397\n\t\t\t\t,-0.754386\n\t\t\t\t,-0.655728\n\t\t\t\t,0.0303789\n\t\t\t\t,-0.708729\n\t\t\t\t,-0.704254\n\t\t\t\t,-0.0415815\n\t\t\t\t,-0.898276\n\t\t\t\t,-0.434238\n\t\t\t\t,-0.0673592\n\t\t\t\t,0.00964467\n\t\t\t\t,0.911341\n\t\t\t\t,-0.411539\n\t\t\t\t,0.127287\n\t\t\t\t,0.971722\n\t\t\t\t,0.198882\n\t\t\t\t,-0.890327\n\t\t\t\t,0.454797\n\t\t\t\t,0.0218428\n\t\t\t\t,-0.889904\n\t\t\t\t,0.432015\n\t\t\t\t,-0.146402\n\t\t\t\t,-0.287558\n\t\t\t\t,0.877073\n\t\t\t\t,0.384777\n\t\t\t\t,-0.84312\n\t\t\t\t,0.512713\n\t\t\t\t,0.162091\n\t\t\t\t,-0.750597\n\t\t\t\t,-0.660036\n\t\t\t\t,-0.0309251\n\t\t\t\t,-0.860165\n\t\t\t\t,-0.509928\n\t\t\t\t,-0.00944199\n\t\t\t\t,-0.853562\n\t\t\t\t,0.520987\n\t\t\t\t,0.00222179\n\t\t\t\t,-0.317809\n\t\t\t\t,0.947654\n\t\t\t\t,-0.0308062\n\t\t\t\t,-0.694281\n\t\t\t\t,-0.718346\n\t\t\t\t,-0.044189\n\t\t\t\t,-0.798864\n\t\t\t\t,-0.569515\n\t\t\t\t,0.193569\n\t\t\t\t,-0.285563\n\t\t\t\t,0.930791\n\t\t\t\t,-0.228215\n\t\t\t\t,-0.894332\n\t\t\t\t,0.398965\n\t\t\t\t,-0.202476\n\t\t\t\t,-0.310532\n\t\t\t\t,0.718717\n\t\t\t\t,-0.622106\n\t\t\t\t,-0.493777\n\t\t\t\t,-0.819859\n\t\t\t\t,0.289854\n\t\t\t\t,-0.306116\n\t\t\t\t,-0.910737\n\t\t\t\t,0.277221\n\t\t\t\t,-0.928533\n\t\t\t\t,0.101743\n\t\t\t\t,-0.357036\n\t\t\t\t,-0.49545\n\t\t\t\t,-0.0410637\n\t\t\t\t,-0.867665\n\t\t\t\t,-0.661634\n\t\t\t\t,-0.628407\n\t\t\t\t,-0.409079\n\t\t\t\t,-0.348098\n\t\t\t\t,-0.909\n\t\t\t\t,0.22923\n\t\t\t\t,-0.661634\n\t\t\t\t,-0.628407\n\t\t\t\t,-0.409079\n\t\t\t\t,-0.369968\n\t\t\t\t,0.867193\n\t\t\t\t,-0.333317\n\t\t\t\t,-0.950698\n\t\t\t\t,0.30853\n\t\t\t\t,-0.0313385\n\t\t\t\t,-0.449438\n\t\t\t\t,-0.863991\n\t\t\t\t,0.226992\n\t\t\t\t,-0.801653\n\t\t\t\t,-0.586522\n\t\t\t\t,0.115516\n\t\t\t\t,-0.54844\n\t\t\t\t,0.833839\n\t\t\t\t,-0.0626621\n\t\t\t\t,-0.956751\n\t\t\t\t,0.290742\n\t\t\t\t,-0.00983039\n\t\t\t\t,-0.330452\n\t\t\t\t,-0.928942\n\t\t\t\t,0.166939\n\t\t\t\t,-0.637809\n\t\t\t\t,-0.768826\n\t\t\t\t,0.0458956\n\t\t\t\t,-0.573954\n\t\t\t\t,0.756132\n\t\t\t\t,0.31439\n\t\t\t\t,-0.974108\n\t\t\t\t,0.226078\n\t\t\t\t,0.00164488\n\t\t\t\t,-0.0801055\n\t\t\t\t,-0.70182\n\t\t\t\t,0.707836\n\t\t\t\t,-0.311924\n\t\t\t\t,-0.894668\n\t\t\t\t,0.3198\n\t\t\t\t,-0.118106\n\t\t\t\t,0.159625\n\t\t\t\t,0.980087\n\t\t\t\t,-0.641606\n\t\t\t\t,0.0593124\n\t\t\t\t,0.764738\n\t\t\t\t,-0.641606\n\t\t\t\t,0.0593124\n\t\t\t\t,0.764738\n\t\t\t\t,-0.118106\n\t\t\t\t,0.159625\n\t\t\t\t,0.980087\n\t\t\t\t,-0.641606\n\t\t\t\t,0.0593124\n\t\t\t\t,0.764738\n\t\t\t\t,-0.306116\n\t\t\t\t,-0.910737\n\t\t\t\t,0.277221\n\t\t\t\t,-0.928533\n\t\t\t\t,0.101743\n\t\t\t\t,-0.357036\n\t\t\t\t,-0.556955\n\t\t\t\t,-0.830543\n\t\t\t\t,0\n\t\t\t\t,-0.556955\n\t\t\t\t,-0.830543\n\t\t\t\t,0\n\t\t\t\t,-0.644331\n\t\t\t\t,-0.764702\n\t\t\t\t,-0.00822072\n\t\t\t\t,-0.676081\n\t\t\t\t,-0.735039\n\t\t\t\t,-0.0512933\n\t\t\t\t,-0.556955\n\t\t\t\t,-0.830543\n\t\t\t\t,0\n\t\t\t\t,-0.615222\n\t\t\t\t,-0.788351\n\t\t\t\t,-0.00213144\n\t\t\t\t,-0.538401\n\t\t\t\t,-0.806279\n\t\t\t\t,0.245027\n\t\t\t\t,-0.583526\n\t\t\t\t,-0.799513\n\t\t\t\t,0.142397\n\t\t\t\t,-0.556955\n\t\t\t\t,-0.830543\n\t\t\t\t,0\n\t\t\t\t,-0.708729\n\t\t\t\t,-0.704254\n\t\t\t\t,-0.0415815\n\t\t\t\t,-0.556955\n\t\t\t\t,-0.830543\n\t\t\t\t,0\n\t\t\t\t,-0.750597\n\t\t\t\t,-0.660036\n\t\t\t\t,-0.0309251\n\t\t\t\t,-0.548639\n\t\t\t\t,-0.832661\n\t\t\t\t,-0.0752992\n\t\t\t\t,-0.694281\n\t\t\t\t,-0.718346\n\t\t\t\t,-0.044189\n\t\t\t\t,-0.490043\n\t\t\t\t,-0.858577\n\t\t\t\t,0.150676\n\t\t\t\t,-0.493777\n\t\t\t\t,-0.819859\n\t\t\t\t,0.289854\n\t\t\t\t,-0.156688\n\t\t\t\t,0.310153\n\t\t\t\t,-0.937685\n\t\t\t\t,-0.387691\n\t\t\t\t,-0.598574\n\t\t\t\t,-0.701003\n\t\t\t\t,-0.49545\n\t\t\t\t,-0.0410637\n\t\t\t\t,-0.867665\n\t\t\t\t,-0.559846\n\t\t\t\t,-0.817331\n\t\t\t\t,-0.136172\n\t\t\t\t,-0.348098\n\t\t\t\t,-0.909\n\t\t\t\t,0.22923\n\t\t\t\t,-0.559846\n\t\t\t\t,-0.817331\n\t\t\t\t,-0.136172\n\t\t\t\t,-0.49545\n\t\t\t\t,-0.0410637\n\t\t\t\t,-0.867665\n\t\t\t\t,-0.387691\n\t\t\t\t,-0.598574\n\t\t\t\t,-0.701003\n\t\t\t\t,-0.487773\n\t\t\t\t,-0.780902\n\t\t\t\t,0.390218\n\t\t\t\t,-0.449438\n\t\t\t\t,-0.863991\n\t\t\t\t,0.226992\n\t\t\t\t,-0.395642\n\t\t\t\t,-0.862791\n\t\t\t\t,0.314736\n\t\t\t\t,-0.330452\n\t\t\t\t,-0.928942\n\t\t\t\t,0.166939\n\t\t\t\t,-0.166187\n\t\t\t\t,-0.547738\n\t\t\t\t,0.819979\n\t\t\t\t,-0.0801055\n\t\t\t\t,-0.70182\n\t\t\t\t,0.707836\n\t\t\t\t,0\n\t\t\t\t,0.52529\n\t\t\t\t,-0.850923\n\t\t\t\t,-0.054913\n\t\t\t\t,0.881302\n\t\t\t\t,-0.469352\n\t\t\t\t,-0.0978323\n\t\t\t\t,0.800769\n\t\t\t\t,-0.59093\n\t\t\t\t,0\n\t\t\t\t,0.716196\n\t\t\t\t,-0.697899\n\t\t\t\t,0.00199464\n\t\t\t\t,0.944738\n\t\t\t\t,0.32782\n\t\t\t\t,0\n\t\t\t\t,0.922099\n\t\t\t\t,0.386953\n\t\t\t\t,-0.104375\n\t\t\t\t,0.993297\n\t\t\t\t,0.0496695\n\t\t\t\t,-0.0874581\n\t\t\t\t,0.852353\n\t\t\t\t,0.515602\n\t\t\t\t,0\n\t\t\t\t,0.981962\n\t\t\t\t,0.189077\n\t\t\t\t,0\n\t\t\t\t,0.716196\n\t\t\t\t,-0.697899\n\t\t\t\t,-0.0978323\n\t\t\t\t,0.800769\n\t\t\t\t,-0.59093\n\t\t\t\t,-0.156012\n\t\t\t\t,0.986301\n\t\t\t\t,-0.0535787\n\t\t\t\t,0\n\t\t\t\t,0.52529\n\t\t\t\t,-0.850923\n\t\t\t\t,-0.102521\n\t\t\t\t,0.742202\n\t\t\t\t,-0.662288\n\t\t\t\t,-0.0343635\n\t\t\t\t,0.784606\n\t\t\t\t,-0.619042\n\t\t\t\t,-0.054913\n\t\t\t\t,0.881302\n\t\t\t\t,-0.469352\n\t\t\t\t,-0.0655848\n\t\t\t\t,0.00329327\n\t\t\t\t,-0.997842\n\t\t\t\t,-0.156688\n\t\t\t\t,0.310153\n\t\t\t\t,-0.937685\n\t\t\t\t,-0.317809\n\t\t\t\t,0.947654\n\t\t\t\t,-0.0308062\n\t\t\t\t,-0.287558\n\t\t\t\t,0.877073\n\t\t\t\t,0.384777\n\t\t\t\t,-0.285563\n\t\t\t\t,0.930791\n\t\t\t\t,-0.228215\n\t\t\t\t,-0.310532\n\t\t\t\t,0.718717\n\t\t\t\t,-0.622106\n\t\t\t\t,-0.49545\n\t\t\t\t,-0.0410637\n\t\t\t\t,-0.867665\n\t\t\t\t,-0.49545\n\t\t\t\t,-0.0410637\n\t\t\t\t,-0.867665\n\t\t\t\t,0\n\t\t\t\t,0.922099\n\t\t\t\t,0.386953\n\t\t\t\t,0\n\t\t\t\t,0.52529\n\t\t\t\t,-0.850923\n\t\t\t\t,0\n\t\t\t\t,0.716196\n\t\t\t\t,-0.697899\n\t\t\t\t,0\n\t\t\t\t,0.981962\n\t\t\t\t,0.189077\n\t\t\t\t,-6.13543e-007\n\t\t\t\t,0.959276\n\t\t\t\t,-0.282471\n\t\t\t\t,2.53373e-006\n\t\t\t\t,0.733988\n\t\t\t\t,0.679163\n\t\t\t\t,0.26382\n\t\t\t\t,0.858482\n\t\t\t\t,0.439781\n\t\t\t\t,0.359397\n\t\t\t\t,0.820605\n\t\t\t\t,-0.444343\n\t\t\t\t,0.00199464\n\t\t\t\t,0.944738\n\t\t\t\t,0.32782\n\t\t\t\t,-0.0874581\n\t\t\t\t,0.852353\n\t\t\t\t,0.515602\n\t\t\t\t,-1.61698e-006\n\t\t\t\t,0.774727\n\t\t\t\t,-0.632296\n\t\t\t\t,0.109825\n\t\t\t\t,0.866377\n\t\t\t\t,-0.487164\n\t\t\t\t,0.127287\n\t\t\t\t,0.971722\n\t\t\t\t,0.198882\n\t\t\t\t,0.00964467\n\t\t\t\t,0.911341\n\t\t\t\t,-0.411539\n\t\t\t\t,-0.287558\n\t\t\t\t,0.877073\n\t\t\t\t,0.384777\n\t\t\t\t,-0.287558\n\t\t\t\t,0.877073\n\t\t\t\t,0.384777\n\t\t\t\t,-0.369968\n\t\t\t\t,0.867193\n\t\t\t\t,-0.333317\n\t\t\t\t,-1.32905e-006\n\t\t\t\t,0.98963\n\t\t\t\t,-0.143642\n\t\t\t\t,-1.61698e-006\n\t\t\t\t,0.774727\n\t\t\t\t,-0.632296\n\t\t\t\t,0.109825\n\t\t\t\t,0.866377\n\t\t\t\t,-0.487164\n\t\t\t\t,-0.0429343\n\t\t\t\t,0.991846\n\t\t\t\t,-0.119989\n\t\t\t\t,0\n\t\t\t\t,0.98803\n\t\t\t\t,0.15426\n\t\t\t\t,-0.135145\n\t\t\t\t,0.929792\n\t\t\t\t,0.342377\n\t\t\t\t,0\n\t\t\t\t,0.486826\n\t\t\t\t,0.873499\n\t\t\t\t,-0.109932\n\t\t\t\t,0.301712\n\t\t\t\t,0.94704\n\t\t\t\t,-0.369968\n\t\t\t\t,0.867193\n\t\t\t\t,-0.333317\n\t\t\t\t,-0.54844\n\t\t\t\t,0.833839\n\t\t\t\t,-0.0626621\n\t\t\t\t,-0.573954\n\t\t\t\t,0.756132\n\t\t\t\t,0.31439\n\t\t\t\t,-0.118106\n\t\t\t\t,0.159625\n\t\t\t\t,0.980087\n\t\t\t\t,-0.301697\n\t\t\t\t,0.609799\n\t\t\t\t,0.732887\n\t\t\t\t,-0.427292\n\t\t\t\t,-0.251098\n\t\t\t\t,0.868546\n\t\t\t\t,0.250232\n\t\t\t\t,0.865327\n\t\t\t\t,0.434273\n\t\t\t\t,-0.948845\n\t\t\t\t,-0.116359\n\t\t\t\t,0.293518\n\t\t\t\t,-0.342716\n\t\t\t\t,0.892408\n\t\t\t\t,-0.293518\n\t\t\t\t,-0.948845\n\t\t\t\t,-0.116359\n\t\t\t\t,0.293518\n\t\t\t\t,-0.301697\n\t\t\t\t,0.609799\n\t\t\t\t,0.732887\n\t\t\t\t,-0.680059\n\t\t\t\t,-0.0198999\n\t\t\t\t,-0.732887\n\t\t\t\t,0.0211057\n\t\t\t\t,0.495159\n\t\t\t\t,-0.868546\n\t\t\t\t,-0.680059\n\t\t\t\t,-0.0198999\n\t\t\t\t,-0.732887\n\t\t\t\t,-0.342716\n\t\t\t\t,0.892408\n\t\t\t\t,-0.293518\n\t\t\t\t,-0.646562\n\t\t\t\t,-0.627187\n\t\t\t\t,-0.434273\n\t\t\t\t,-0.680059\n\t\t\t\t,-0.0198999\n\t\t\t\t,-0.732887\n\t\t\t\t,-0.342716\n\t\t\t\t,0.892408\n\t\t\t\t,-0.293518\n\t\t\t\t,0.250232\n\t\t\t\t,0.865327\n\t\t\t\t,0.434273\n\t\t\t\t,0.0211057\n\t\t\t\t,0.495159\n\t\t\t\t,-0.868546\n\t\t\t\t,-0.301697\n\t\t\t\t,0.609799\n\t\t\t\t,0.732887\n\t\t\t\t,-0.948845\n\t\t\t\t,-0.116359\n\t\t\t\t,0.293518\n\t\t\t\t,-0.646562\n\t\t\t\t,-0.627187\n\t\t\t\t,-0.434273\n\t\t\t\t,-0.427292\n\t\t\t\t,-0.251098\n\t\t\t\t,0.868546\n\t\t\t\t,-0.680059\n\t\t\t\t,-0.0198999\n\t\t\t\t,-0.732887\n\t\t\t\t,-0.513955\n\t\t\t\t,-0.390961\n\t\t\t\t,0.763544\n\t\t\t\t,-0.991424\n\t\t\t\t,0.052789\n\t\t\t\t,0.119546\n\t\t\t\t,-1\n\t\t\t\t,2.93206e-006\n\t\t\t\t,-5.72892e-006\n\t\t\t\t,-0.402737\n\t\t\t\t,-0.373096\n\t\t\t\t,0.835824\n\t\t\t\t,0.581696\n\t\t\t\t,-0.436238\n\t\t\t\t,0.686532\n\t\t\t\t,0.513952\n\t\t\t\t,-0.390962\n\t\t\t\t,0.763546\n\t\t\t\t,1\n\t\t\t\t,4.22909e-006\n\t\t\t\t,-8.86377e-006\n\t\t\t\t,0.981365\n\t\t\t\t,-0.0834974\n\t\t\t\t,-0.173066\n\t\t\t\t,0.434868\n\t\t\t\t,0.377403\n\t\t\t\t,-0.817592\n\t\t\t\t,0.981365\n\t\t\t\t,-0.0834974\n\t\t\t\t,-0.173066\n\t\t\t\t,1\n\t\t\t\t,4.22909e-006\n\t\t\t\t,-8.86377e-006\n\t\t\t\t,0.513946\n\t\t\t\t,0.390962\n\t\t\t\t,-0.76355\n\t\t\t\t,-0.513946\n\t\t\t\t,0.390961\n\t\t\t\t,-0.76355\n\t\t\t\t,-0.607667\n\t\t\t\t,0.4464\n\t\t\t\t,-0.656862\n\t\t\t\t,-0.991424\n\t\t\t\t,0.052789\n\t\t\t\t,0.119546\n\t\t\t\t,-1\n\t\t\t\t,2.93206e-006\n\t\t\t\t,-5.72892e-006\n\t\t\t\t,-0.474569\n\t\t\t\t,-0.240957\n\t\t\t\t,0.846596\n\t\t\t\t,-0.920933\n\t\t\t\t,0.336333\n\t\t\t\t,0.196882\n\t\t\t\t,0.463712\n\t\t\t\t,-0.599929\n\t\t\t\t,0.651963\n\t\t\t\t,0.913194\n\t\t\t\t,-0.351033\n\t\t\t\t,-0.20701\n\t\t\t\t,0.47197\n\t\t\t\t,0.234426\n\t\t\t\t,-0.849876\n\t\t\t\t,0.913194\n\t\t\t\t,-0.351033\n\t\t\t\t,-0.20701\n\t\t\t\t,-0.467111\n\t\t\t\t,0.593592\n\t\t\t\t,-0.655329\n\t\t\t\t,-0.920933\n\t\t\t\t,0.336333\n\t\t\t\t,0.196882\n\t\t\t\t,-0.363966\n\t\t\t\t,-0.110945\n\t\t\t\t,0.924781\n\t\t\t\t,-0.687988\n\t\t\t\t,0.625185\n\t\t\t\t,0.368533\n\t\t\t\t,0.32233\n\t\t\t\t,-0.746837\n\t\t\t\t,0.581668\n\t\t\t\t,0.68821\n\t\t\t\t,-0.624966\n\t\t\t\t,-0.368491\n\t\t\t\t,0.36174\n\t\t\t\t,0.107949\n\t\t\t\t,-0.926008\n\t\t\t\t,0.68821\n\t\t\t\t,-0.624966\n\t\t\t\t,-0.368491\n\t\t\t\t,-0.318233\n\t\t\t\t,0.748947\n\t\t\t\t,-0.58121\n\t\t\t\t,-0.687988\n\t\t\t\t,0.625185\n\t\t\t\t,0.368533\n\t\t\t\t,-0.17256\n\t\t\t\t,-0.00979386\n\t\t\t\t,0.98495\n\t\t\t\t,-0.303062\n\t\t\t\t,0.823829\n\t\t\t\t,0.479019\n\t\t\t\t,0.123456\n\t\t\t\t,-0.832746\n\t\t\t\t,0.539716\n\t\t\t\t,0.313037\n\t\t\t\t,-0.821266\n\t\t\t\t,-0.477001\n\t\t\t\t,0.177998\n\t\t\t\t,0.0118203\n\t\t\t\t,-0.98396\n\t\t\t\t,0.313037\n\t\t\t\t,-0.821266\n\t\t\t\t,-0.477001\n\t\t\t\t,-0.121571\n\t\t\t\t,0.833336\n\t\t\t\t,-0.539232\n\t\t\t\t,-0.303062\n\t\t\t\t,0.823829\n\t\t\t\t,0.479019\n\t\t\t\t,-0.0338981\n\t\t\t\t,0.0160758\n\t\t\t\t,0.999296\n\t\t\t\t,-0.0544514\n\t\t\t\t,0.864997\n\t\t\t\t,0.498813\n\t\t\t\t,0.0184916\n\t\t\t\t,-0.847772\n\t\t\t\t,0.530039\n\t\t\t\t,0.0545173\n\t\t\t\t,-0.864984\n\t\t\t\t,-0.49883\n\t\t\t\t,0.0339196\n\t\t\t\t,-0.0159525\n\t\t\t\t,-0.999297\n\t\t\t\t,0.0545173\n\t\t\t\t,-0.864984\n\t\t\t\t,-0.49883\n\t\t\t\t,-0.0184925\n\t\t\t\t,0.84787\n\t\t\t\t,-0.529882\n\t\t\t\t,-0.0544514\n\t\t\t\t,0.864997\n\t\t\t\t,0.498813\n\t\t\t\t,-0.0544514\n\t\t\t\t,0.864997\n\t\t\t\t,0.498813\n\t\t\t\t,-0.0338981\n\t\t\t\t,0.0160758\n\t\t\t\t,0.999296\n\t\t\t\t,-3.21513e-006\n\t\t\t\t,0.191634\n\t\t\t\t,0.981467\n\t\t\t\t,-4.90741e-006\n\t\t\t\t,0.947702\n\t\t\t\t,0.319155\n\t\t\t\t,0.0184916\n\t\t\t\t,-0.847772\n\t\t\t\t,0.530039\n\t\t\t\t,3.31268e-007\n\t\t\t\t,-0.728126\n\t\t\t\t,0.685443\n\t\t\t\t,0.0545173\n\t\t\t\t,-0.864984\n\t\t\t\t,-0.49883\n\t\t\t\t,-5.65996e-006\n\t\t\t\t,-0.947753\n\t\t\t\t,-0.319005\n\t\t\t\t,0.0545173\n\t\t\t\t,-0.864984\n\t\t\t\t,-0.49883\n\t\t\t\t,0.0339196\n\t\t\t\t,-0.0159525\n\t\t\t\t,-0.999297\n\t\t\t\t,-1.41282e-006\n\t\t\t\t,-0.19139\n\t\t\t\t,-0.981514\n\t\t\t\t,-5.65996e-006\n\t\t\t\t,-0.947753\n\t\t\t\t,-0.319005\n\t\t\t\t,-0.0184925\n\t\t\t\t,0.84787\n\t\t\t\t,-0.529882\n\t\t\t\t,-3.29686e-006\n\t\t\t\t,0.728227\n\t\t\t\t,-0.685337\n\t\t\t\t,-0.0544514\n\t\t\t\t,0.864997\n\t\t\t\t,0.498813\n\t\t\t\t,-4.90741e-006\n\t\t\t\t,0.947702\n\t\t\t\t,0.319155\n\t\t\t\t,0.444609\n\t\t\t\t,0.212317\n\t\t\t\t,0.870198\n\t\t\t\t,0\n\t\t\t\t,-0.559231\n\t\t\t\t,0.829012\n\t\t\t\t,0.863225\n\t\t\t\t,-0.282098\n\t\t\t\t,0.418644\n\t\t\t\t,-0.560481\n\t\t\t\t,0.623089\n\t\t\t\t,0.545547\n\t\t\t\t,-0.647743\n\t\t\t\t,-0.426056\n\t\t\t\t,0.631589\n\t\t\t\t,-0.358352\n\t\t\t\t,-0.865449\n\t\t\t\t,0.350116\n\t\t\t\t,0.261906\n\t\t\t\t,-0.816291\n\t\t\t\t,0.514854\n\t\t\t\t,0.493676\n\t\t\t\t,0.869638\n\t\t\t\t,0.0036309\n\t\t\t\t,0.863225\n\t\t\t\t,-0.282098\n\t\t\t\t,0.418644\n\t\t\t\t,1\n\t\t\t\t,-2.06477e-007\n\t\t\t\t,1.51228e-010\n\t\t\t\t,0.444609\n\t\t\t\t,0.212317\n\t\t\t\t,0.870198\n\t\t\t\t,-0.560481\n\t\t\t\t,0.623089\n\t\t\t\t,0.545547\n\t\t\t\t,-0.499997\n\t\t\t\t,0.866015\n\t\t\t\t,0.00445858\n\t\t\t\t,-0.999998\n\t\t\t\t,-3.99393e-007\n\t\t\t\t,0.00182101\n\t\t\t\t,-0.647743\n\t\t\t\t,-0.426056\n\t\t\t\t,0.631589\n\t\t\t\t,-0.358352\n\t\t\t\t,-0.865449\n\t\t\t\t,0.350116\n\t\t\t\t,-0.647743\n\t\t\t\t,-0.426056\n\t\t\t\t,0.631589\n\t\t\t\t,-0.999998\n\t\t\t\t,-3.99393e-007\n\t\t\t\t,0.00182101\n\t\t\t\t,-0.499995\n\t\t\t\t,-0.866005\n\t\t\t\t,0.00636769\n\t\t\t\t,0.492845\n\t\t\t\t,-0.8701\n\t\t\t\t,0.0054476\n\t\t\t\t,-0.358352\n\t\t\t\t,-0.865449\n\t\t\t\t,0.350116\n\t\t\t\t,0.261906\n\t\t\t\t,-0.816291\n\t\t\t\t,0.514854\n\t\t\t\t,0.863225\n\t\t\t\t,-0.282098\n\t\t\t\t,0.418644\n\t\t\t\t,0.261906\n\t\t\t\t,-0.816291\n\t\t\t\t,0.514854\n\t\t\t\t,1\n\t\t\t\t,-2.06477e-007\n\t\t\t\t,1.51228e-010\n\t\t\t\t,-0.303473\n\t\t\t\t,-0.691578\n\t\t\t\t,-0.655457\n\t\t\t\t,0\n\t\t\t\t,-0.797167\n\t\t\t\t,-0.603758\n\t\t\t\t,-0.701164\n\t\t\t\t,-0.647351\n\t\t\t\t,-0.298842\n\t\t\t\t,-0.591326\n\t\t\t\t,-0.507329\n\t\t\t\t,-0.626858\n\t\t\t\t,-0.503047\n\t\t\t\t,-0.581253\n\t\t\t\t,0.639601\n\t\t\t\t,0\n\t\t\t\t,0\n\t\t\t\t,1\n\t\t\t\t,-0.360448\n\t\t\t\t,-0.575609\n\t\t\t\t,0.733997\n\t\t\t\t,0\n\t\t\t\t,-0.894427\n\t\t\t\t,0.447214\n\t\t\t\t,-0.528947\n\t\t\t\t,0.0365059\n\t\t\t\t,0.847869\n\t\t\t\t,-0.503047\n\t\t\t\t,-0.581253\n\t\t\t\t,0.639601\n\t\t\t\t,-0.657534\n\t\t\t\t,0.558521\n\t\t\t\t,0.50567\n\t\t\t\t,-0.905362\n\t\t\t\t,-0.311996\n\t\t\t\t,0.28806\n\t\t\t\t,-0.640768\n\t\t\t\t,-0.299025\n\t\t\t\t,0.707107\n\t\t\t\t,-0.591326\n\t\t\t\t,-0.507329\n\t\t\t\t,-0.626858\n\t\t\t\t,-0.360448\n\t\t\t\t,-0.575609\n\t\t\t\t,0.733997\n\t\t\t\t,-0.360448\n\t\t\t\t,-0.575609\n\t\t\t\t,0.733997\n\t\t\t\t,-0.905362\n\t\t\t\t,-0.311996\n\t\t\t\t,0.28806\n\t\t\t\t,-0.701164\n\t\t\t\t,-0.647351\n\t\t\t\t,-0.298842\n\t\t\t\t,-0.503047\n\t\t\t\t,-0.581253\n\t\t\t\t,0.639601\n\t\t\t\t,-0.832584\n\t\t\t\t,0.272123\n\t\t\t\t,-0.482445\n\t\t\t\t,-0.523458\n\t\t\t\t,0.245644\n\t\t\t\t,-0.815874\n\t\t\t\t,-0.657534\n\t\t\t\t,0.558521\n\t\t\t\t,0.50567\n\t\t\t\t,-0.528947\n\t\t\t\t,0.0365059\n\t\t\t\t,0.847869\n\t\t\t\t,-0.752803\n\t\t\t\t,-0.546776\n\t\t\t\t,-0.366503\n\t\t\t\t,-0.523458\n\t\t\t\t,0.245644\n\t\t\t\t,-0.815874\n\t\t\t\t,-0.528947\n\t\t\t\t,0.0365059\n\t\t\t\t,0.847869\n\t\t\t\t,-0.640768\n\t\t\t\t,-0.299025\n\t\t\t\t,0.707107\n\t\t\t\t,0\n\t\t\t\t,-0.797167\n\t\t\t\t,-0.603758\n\t\t\t\t,-0.303473\n\t\t\t\t,-0.691578\n\t\t\t\t,-0.655457\n\t\t\t\t,-0.196581\n\t\t\t\t,-0.261863\n\t\t\t\t,-0.944872\n\t\t\t\t,-0.591326\n\t\t\t\t,-0.507329\n\t\t\t\t,-0.626858\n\t\t\t\t,-0.523458\n\t\t\t\t,0.245644\n\t\t\t\t,-0.815874\n\t\t\t\t,-0.701164\n\t\t\t\t,-0.647351\n\t\t\t\t,-0.298842\n\t\t\t\t,-0.832584\n\t\t\t\t,0.272123\n\t\t\t\t,-0.482445\n\t\t\t\t,-0.752803\n\t\t\t\t,-0.546776\n\t\t\t\t,-0.366503\n\t\t\t\t,0.265348\n\t\t\t\t,0.650654\n\t\t\t\t,0.711506\n\t\t\t\t,0\n\t\t\t\t,3.23333e-008\n\t\t\t\t,1\n\t\t\t\t,0.367955\n\t\t\t\t,-0.0761964\n\t\t\t\t,0.926716\n\t\t\t\t,0\n\t\t\t\t,0.711033\n\t\t\t\t,0.703159\n\t\t\t\t,0\n\t\t\t\t,1\n\t\t\t\t,0\n\t\t\t\t,0.370305\n\t\t\t\t,0.926542\n\t\t\t\t,0.0662918\n\t\t\t\t,0.265741\n\t\t\t\t,0.722166\n\t\t\t\t,-0.638638\n\t\t\t\t,0\n\t\t\t\t,0.711033\n\t\t\t\t,-0.703159\n\t\t\t\t,0\n\t\t\t\t,3.23333e-008\n\t\t\t\t,-1\n\t\t\t\t,0.367954\n\t\t\t\t,0.0761937\n\t\t\t\t,-0.926717\n\t\t\t\t,0.265347\n\t\t\t\t,-0.650652\n\t\t\t\t,-0.711507\n\t\t\t\t,0\n\t\t\t\t,-0.711033\n\t\t\t\t,-0.703159\n\t\t\t\t,0\n\t\t\t\t,-1\n\t\t\t\t,0\n\t\t\t\t,0\n\t\t\t\t,-0.711033\n\t\t\t\t,-0.703159\n\t\t\t\t,0.265347\n\t\t\t\t,-0.650652\n\t\t\t\t,-0.711507\n\t\t\t\t,0.370305\n\t\t\t\t,-0.926542\n\t\t\t\t,-0.0662908\n\t\t\t\t,0.265743\n\t\t\t\t,-0.722165\n\t\t\t\t,0.638638\n\t\t\t\t,0\n\t\t\t\t,-0.711033\n\t\t\t\t,0.703159\n\t\t\t\t,0.311449\n\t\t\t\t,-0.0163107\n\t\t\t\t,0.950123\n\t\t\t\t,0.311386\n\t\t\t\t,0.679247\n\t\t\t\t,0.664576\n\t\t\t\t,0.30856\n\t\t\t\t,0.951172\n\t\t\t\t,0.00786201\n\t\t\t\t,0.308173\n\t\t\t\t,0.69627\n\t\t\t\t,-0.648257\n\t\t\t\t,0.311446\n\t\t\t\t,0.016299\n\t\t\t\t,-0.950124\n\t\t\t\t,0.311387\n\t\t\t\t,-0.679237\n\t\t\t\t,-0.664586\n\t\t\t\t,0.311387\n\t\t\t\t,-0.679237\n\t\t\t\t,-0.664586\n\t\t\t\t,0.308561\n\t\t\t\t,-0.951172\n\t\t\t\t,-0.00785409\n\t\t\t\t,0.308173\n\t\t\t\t,-0.69627\n\t\t\t\t,0.648257\n\t\t\t\t,-1.77873e-006\n\t\t\t\t,0.147264\n\t\t\t\t,0.989097\n\t\t\t\t,3.5727e-007\n\t\t\t\t,0.812825\n\t\t\t\t,0.582507\n\t\t\t\t,-7.23951e-007\n\t\t\t\t,0.991903\n\t\t\t\t,-0.127\n\t\t\t\t,-6.35273e-007\n\t\t\t\t,0.624982\n\t\t\t\t,-0.780639\n\t\t\t\t,-6.34866e-007\n\t\t\t\t,-0.147255\n\t\t\t\t,-0.989098\n\t\t\t\t,-7.74649e-007\n\t\t\t\t,-0.81282\n\t\t\t\t,-0.582515\n\t\t\t\t,0.308561\n\t\t\t\t,-0.951172\n\t\t\t\t,-0.00785409\n\t\t\t\t,0.311387\n\t\t\t\t,-0.679237\n\t\t\t\t,-0.664586\n\t\t\t\t,-7.74649e-007\n\t\t\t\t,-0.81282\n\t\t\t\t,-0.582515\n\t\t\t\t,-2.83281e-007\n\t\t\t\t,-0.9919\n\t\t\t\t,0.127018\n\t\t\t\t,-7.74649e-007\n\t\t\t\t,-0.81282\n\t\t\t\t,-0.582515\n\t\t\t\t,-1.90696e-007\n\t\t\t\t,-0.624998\n\t\t\t\t,0.780626\n\t\t\t\t,-0.666667\n\t\t\t\t,0.666667\n\t\t\t\t,0.333333\n\t\t\t\t,-0.408248\n\t\t\t\t,-0.408248\n\t\t\t\t,0.816497\n\t\t\t\t,0.408248\n\t\t\t\t,0.408248\n\t\t\t\t,0.816497\n\t\t\t\t,0.666667\n\t\t\t\t,-0.666667\n\t\t\t\t,0.333333\n\t\t\t\t,0.408248\n\t\t\t\t,0.408248\n\t\t\t\t,0.816497\n\t\t\t\t,0.666667\n\t\t\t\t,-0.666667\n\t\t\t\t,0.333333\n\t\t\t\t,0.666667\n\t\t\t\t,0.666667\n\t\t\t\t,-0.333333\n\t\t\t\t,0.408248\n\t\t\t\t,-0.408248\n\t\t\t\t,-0.816497\n\t\t\t\t,-0.408248\n\t\t\t\t,0.408248\n\t\t\t\t,-0.816497\n\t\t\t\t,-0.666667\n\t\t\t\t,-0.666667\n\t\t\t\t,-0.333333\n\t\t\t\t,-0.666667\n\t\t\t\t,0.666667\n\t\t\t\t,0.333333\n\t\t\t\t,-0.408248\n\t\t\t\t,-0.408248\n\t\t\t\t,0.816497\n\t\t\t\t,-0.666667\n\t\t\t\t,0.666667\n\t\t\t\t,0.333333\n\t\t\t\t,-0.408248\n\t\t\t\t,-0.408248\n\t\t\t\t,0.816497\n\t\t\t\t,0.408248\n\t\t\t\t,0.408248\n\t\t\t\t,0.816497\n\t\t\t\t,0.666667\n\t\t\t\t,-0.666667\n\t\t\t\t,0.333333\n\t\t\t\t,0.408248\n\t\t\t\t,0.408248\n\t\t\t\t,0.816497\n\t\t\t\t,0.666667\n\t\t\t\t,-0.666667\n\t\t\t\t,0.333333\n\t\t\t\t,0.666667\n\t\t\t\t,0.666667\n\t\t\t\t,-0.333333\n\t\t\t\t,0.408248\n\t\t\t\t,-0.408248\n\t\t\t\t,-0.816497\n\t\t\t\t,-0.408248\n\t\t\t\t,0.408248\n\t\t\t\t,-0.816497\n\t\t\t\t,-0.666667\n\t\t\t\t,-0.666667\n\t\t\t\t,-0.333333\n\t\t\t\t,-0.666667\n\t\t\t\t,0.666667\n\t\t\t\t,0.333333\n\t\t\t\t,-0.408248\n\t\t\t\t,-0.408248\n\t\t\t\t,0.816497\n\t\t\t\t,-0.408248\n\t\t\t\t,0.408248\n\t\t\t\t,0.816497\n\t\t\t\t,0.408248\n\t\t\t\t,-0.408248\n\t\t\t\t,0.816497\n\t\t\t\t,0.666667\n\t\t\t\t,0.666667\n\t\t\t\t,0.333333\n\t\t\t\t,-0.666667\n\t\t\t\t,-0.666667\n\t\t\t\t,0.333333\n\t\t\t\t,-0.666667\n\t\t\t\t,0.666667\n\t\t\t\t,-0.333333\n\t\t\t\t,-0.666667\n\t\t\t\t,-0.666667\n\t\t\t\t,0.333333\n\t\t\t\t,-0.408248\n\t\t\t\t,0.408248\n\t\t\t\t,0.816497\n\t\t\t\t,-0.408248\n\t\t\t\t,-0.408248\n\t\t\t\t,-0.816497\n\t\t\t\t,0.408248\n\t\t\t\t,0.408248\n\t\t\t\t,-0.816497\n\t\t\t\t,0.666667\n\t\t\t\t,-0.666667\n\t\t\t\t,-0.333333\n\t\t\t\t,0.666667\n\t\t\t\t,0.666667\n\t\t\t\t,0.333333\n\t\t\t\t,0.408248\n\t\t\t\t,-0.408248\n\t\t\t\t,0.816497\n\t\t\t\t,-0.408248\n\t\t\t\t,0.408248\n\t\t\t\t,0.816497\n\t\t\t\t,0.408248\n\t\t\t\t,-0.408248\n\t\t\t\t,0.816497\n\t\t\t\t,0.666667\n\t\t\t\t,0.666667\n\t\t\t\t,0.333333\n\t\t\t\t,-0.666667\n\t\t\t\t,-0.666667\n\t\t\t\t,0.333333\n\t\t\t\t,-0.666667\n\t\t\t\t,0.666667\n\t\t\t\t,-0.333333\n\t\t\t\t,-0.666667\n\t\t\t\t,-0.666667\n\t\t\t\t,0.333333\n\t\t\t\t,-0.408248\n\t\t\t\t,0.408248\n\t\t\t\t,0.816497\n\t\t\t\t,-0.408248\n\t\t\t\t,-0.408248\n\t\t\t\t,-0.816497\n\t\t\t\t,0.408248\n\t\t\t\t,0.408248\n\t\t\t\t,-0.816497\n\t\t\t\t,0.666667\n\t\t\t\t,-0.666667\n\t\t\t\t,-0.333333\n\t\t\t\t,0.666667\n\t\t\t\t,0.666667\n\t\t\t\t,0.333333\n\t\t\t\t,0.408248\n\t\t\t\t,-0.408248\n\t\t\t\t,0.816497\n\t\t\t\t,0.408248\n\t\t\t\t,0.408248\n\t\t\t\t,-0.816497\n\t\t\t\t,-0.408248\n\t\t\t\t,-0.408248\n\t\t\t\t,-0.816497\n\t\t\t\t,-0.666667\n\t\t\t\t,0.666667\n\t\t\t\t,-0.333333\n\t\t\t\t,0.666667\n\t\t\t\t,-0.666667\n\t\t\t\t,-0.333333\n\t\t\t\t,0.666667\n\t\t\t\t,0.666667\n\t\t\t\t,0.333333\n\t\t\t\t,0.666667\n\t\t\t\t,-0.666667\n\t\t\t\t,-0.333333\n\t\t\t\t,0.408248\n\t\t\t\t,0.408248\n\t\t\t\t,-0.816497\n\t\t\t\t,0.408248\n\t\t\t\t,-0.408248\n\t\t\t\t,0.816497\n\t\t\t\t,-0.408248\n\t\t\t\t,0.408248\n\t\t\t\t,0.816497\n\t\t\t\t,-0.666667\n\t\t\t\t,-0.666667\n\t\t\t\t,0.333333\n\t\t\t\t,-0.666667\n\t\t\t\t,0.666667\n\t\t\t\t,-0.333333\n\t\t\t\t,-0.408248\n\t\t\t\t,-0.408248\n\t\t\t\t,-0.816497\n\t\t\t\t,0.666667\n\t\t\t\t,0.666667\n\t\t\t\t,-0.333333\n\t\t\t\t,0.408248\n\t\t\t\t,-0.408248\n\t\t\t\t,-0.816497\n\t\t\t\t,-0.408248\n\t\t\t\t,0.408248\n\t\t\t\t,-0.816497\n\t\t\t\t,-0.666667\n\t\t\t\t,-0.666667\n\t\t\t\t,-0.333333\n\t\t\t\t,-0.408248\n\t\t\t\t,0.408248\n\t\t\t\t,-0.816497\n\t\t\t\t,-0.666667\n\t\t\t\t,-0.666667\n\t\t\t\t,-0.333333\n\t\t\t\t,-0.666667\n\t\t\t\t,0.666667\n\t\t\t\t,0.333333\n\t\t\t\t,-0.408248\n\t\t\t\t,-0.408248\n\t\t\t\t,0.816497\n\t\t\t\t,0.408248\n\t\t\t\t,0.408248\n\t\t\t\t,0.816497\n\t\t\t\t,0.666667\n\t\t\t\t,-0.666667\n\t\t\t\t,0.333333\n\t\t\t\t,0.666667\n\t\t\t\t,0.666667\n\t\t\t\t,-0.333333\n\t\t\t\t,0.408248\n\t\t\t\t,-0.408248\n\t\t\t\t,-0.816497\n\t\t\t\t,0.853097\n\t\t\t\t,-0.520609\n\t\t\t\t,-0.0345182\n\t\t\t\t,0.853101\n\t\t\t\t,-0.467763\n\t\t\t\t,-0.231118\n\t\t\t\t,1\n\t\t\t\t,0\n\t\t\t\t,0\n\t\t\t\t,-0.854735\n\t\t\t\t,0.519065\n\t\t\t\t,0\n\t\t\t\t,-1\n\t\t\t\t,0\n\t\t\t\t,0\n\t\t\t\t,-0.91976\n\t\t\t\t,0.362606\n\t\t\t\t,0.150197\n\t\t\t\t,0.992581\n\t\t\t\t,0.116804\n\t\t\t\t,0.0337531\n\t\t\t\t,0.454129\n\t\t\t\t,0.890936\n\t\t\t\t,0\n\t\t\t\t,0.454129\n\t\t\t\t,0.823118\n\t\t\t\t,0.340947\n\t\t\t\t,0.961402\n\t\t\t\t,-0.268378\n\t\t\t\t,-0.0606563\n\t\t\t\t,-0.45413\n\t\t\t\t,0.890935\n\t\t\t\t,0\n\t\t\t\t,-0.45413\n\t\t\t\t,0.823117\n\t\t\t\t,0.340946\n\t\t\t\t,0.853103\n\t\t\t\t,-0.343712\n\t\t\t\t,-0.392528\n\t\t\t\t,-0.854735\n\t\t\t\t,0.367034\n\t\t\t\t,0.367035\n\t\t\t\t,0.992581\n\t\t\t\t,0.0587309\n\t\t\t\t,0.106462\n\t\t\t\t,0.454129\n\t\t\t\t,0.629987\n\t\t\t\t,0.629987\n\t\t\t\t,-0.45413\n\t\t\t\t,0.629986\n\t\t\t\t,0.629987\n\t\t\t\t,0.853101\n\t\t\t\t,-0.167337\n\t\t\t\t,-0.494183\n\t\t\t\t,-0.91976\n\t\t\t\t,0.150197\n\t\t\t\t,0.362606\n\t\t\t\t,0.454129\n\t\t\t\t,0.340947\n\t\t\t\t,0.823118\n\t\t\t\t,0.961404\n\t\t\t\t,-0.146879\n\t\t\t\t,-0.232655\n\t\t\t\t,-0.45413\n\t\t\t\t,0.340946\n\t\t\t\t,0.823117\n\t\t\t\t,0.8531\n\t\t\t\t,0.034517\n\t\t\t\t,-0.520605\n\t\t\t\t,-0.854735\n\t\t\t\t,0\n\t\t\t\t,0.519065\n\t\t\t\t,0.992581\n\t\t\t\t,-0.0337528\n\t\t\t\t,0.116807\n\t\t\t\t,0.454129\n\t\t\t\t,0\n\t\t\t\t,0.890936\n\t\t\t\t,-0.45413\n\t\t\t\t,0\n\t\t\t\t,0.890935\n\t\t\t\t,0.853099\n\t\t\t\t,0.231119\n\t\t\t\t,-0.467768\n\t\t\t\t,-0.91976\n\t\t\t\t,-0.150197\n\t\t\t\t,0.362606\n\t\t\t\t,0.454129\n\t\t\t\t,-0.340947\n\t\t\t\t,0.823118\n\t\t\t\t,0.961402\n\t\t\t\t,0.0606557\n\t\t\t\t,-0.268378\n\t\t\t\t,-0.45413\n\t\t\t\t,-0.340947\n\t\t\t\t,0.823117\n\t\t\t\t,0.853095\n\t\t\t\t,0.392537\n\t\t\t\t,-0.34372\n\t\t\t\t,-0.854735\n\t\t\t\t,-0.367035\n\t\t\t\t,0.367035\n\t\t\t\t,0.992581\n\t\t\t\t,-0.106458\n\t\t\t\t,0.0587265\n\t\t\t\t,0.454128\n\t\t\t\t,-0.629987\n\t\t\t\t,0.629987\n\t\t\t\t,-0.45413\n\t\t\t\t,-0.629987\n\t\t\t\t,0.629987\n\t\t\t\t,0.853097\n\t\t\t\t,0.494192\n\t\t\t\t,-0.167334\n\t\t\t\t,-0.91976\n\t\t\t\t,-0.362606\n\t\t\t\t,0.150196\n\t\t\t\t,0.454128\n\t\t\t\t,-0.823118\n\t\t\t\t,0.340947\n\t\t\t\t,0.961398\n\t\t\t\t,0.232674\n\t\t\t\t,-0.146889\n\t\t\t\t,-0.45413\n\t\t\t\t,-0.823117\n\t\t\t\t,0.340946\n\t\t\t\t,0.853098\n\t\t\t\t,0.520607\n\t\t\t\t,0.034519\n\t\t\t\t,-0.854735\n\t\t\t\t,-0.519065\n\t\t\t\t,0\n\t\t\t\t,0.992581\n\t\t\t\t,-0.116805\n\t\t\t\t,-0.0337486\n\t\t\t\t,0.454128\n\t\t\t\t,-0.890936\n\t\t\t\t,0\n\t\t\t\t,-0.45413\n\t\t\t\t,-0.890936\n\t\t\t\t,0\n\t\t\t\t,0.853093\n\t\t\t\t,0.467778\n\t\t\t\t,0.231119\n\t\t\t\t,-0.91976\n\t\t\t\t,-0.362606\n\t\t\t\t,-0.150196\n\t\t\t\t,0.454128\n\t\t\t\t,-0.823118\n\t\t\t\t,-0.340947\n\t\t\t\t,0.9614\n\t\t\t\t,0.268386\n\t\t\t\t,0.0606523\n\t\t\t\t,-0.45413\n\t\t\t\t,-0.823117\n\t\t\t\t,-0.340946\n\t\t\t\t,0.853096\n\t\t\t\t,0.343719\n\t\t\t\t,0.392535\n\t\t\t\t,-0.854735\n\t\t\t\t,-0.367035\n\t\t\t\t,-0.367035\n\t\t\t\t,0.992581\n\t\t\t\t,-0.058725\n\t\t\t\t,-0.106458\n\t\t\t\t,0.454128\n\t\t\t\t,-0.629987\n\t\t\t\t,-0.629987\n\t\t\t\t,-0.45413\n\t\t\t\t,-0.629987\n\t\t\t\t,-0.629987\n\t\t\t\t,0.853099\n\t\t\t\t,0.167337\n\t\t\t\t,0.494186\n\t\t\t\t,-0.91976\n\t\t\t\t,-0.150197\n\t\t\t\t,-0.362606\n\t\t\t\t,0.454129\n\t\t\t\t,-0.340947\n\t\t\t\t,-0.823118\n\t\t\t\t,0.961402\n\t\t\t\t,0.146884\n\t\t\t\t,0.232663\n\t\t\t\t,-0.45413\n\t\t\t\t,-0.340947\n\t\t\t\t,-0.823117\n\t\t\t\t,0.853101\n\t\t\t\t,-0.0345192\n\t\t\t\t,0.520603\n\t\t\t\t,-0.854735\n\t\t\t\t,0\n\t\t\t\t,-0.519065\n\t\t\t\t,0.992581\n\t\t\t\t,0.0337517\n\t\t\t\t,-0.116807\n\t\t\t\t,0.454129\n\t\t\t\t,0\n\t\t\t\t,-0.890936\n\t\t\t\t,-0.45413\n\t\t\t\t,0\n\t\t\t\t,-0.890935\n\t\t\t\t,0.853103\n\t\t\t\t,-0.231117\n\t\t\t\t,0.467761\n\t\t\t\t,-0.91976\n\t\t\t\t,0.150197\n\t\t\t\t,-0.362606\n\t\t\t\t,0.454129\n\t\t\t\t,0.340947\n\t\t\t\t,-0.823118\n\t\t\t\t,0.961403\n\t\t\t\t,-0.0606552\n\t\t\t\t,0.268374\n\t\t\t\t,-0.45413\n\t\t\t\t,0.340946\n\t\t\t\t,-0.823117\n\t\t\t\t,0.853102\n\t\t\t\t,-0.392528\n\t\t\t\t,0.343713\n\t\t\t\t,-0.854735\n\t\t\t\t,0.367034\n\t\t\t\t,-0.367035\n\t\t\t\t,0.992581\n\t\t\t\t,0.106462\n\t\t\t\t,-0.0587312\n\t\t\t\t,0.454129\n\t\t\t\t,0.629987\n\t\t\t\t,-0.629987\n\t\t\t\t,-0.45413\n\t\t\t\t,0.629986\n\t\t\t\t,-0.629987\n\t\t\t\t,0.853099\n\t\t\t\t,-0.494186\n\t\t\t\t,0.167338\n\t\t\t\t,-0.91976\n\t\t\t\t,0.362606\n\t\t\t\t,-0.150197\n\t\t\t\t,0.454129\n\t\t\t\t,0.823118\n\t\t\t\t,-0.340947\n\t\t\t\t,0.961403\n\t\t\t\t,-0.232658\n\t\t\t\t,0.146881\n\t\t\t\t,-0.45413\n\t\t\t\t,0.823117\n\t\t\t\t,-0.340946\n\t\t\t\t,0.454129\n\t\t\t\t,0.890936\n\t\t\t\t,0\n\t\t\t\t,-1.04184e-007\n\t\t\t\t,1\n\t\t\t\t,0\n\t\t\t\t,0.454129\n\t\t\t\t,0.823118\n\t\t\t\t,0.340947\n\t\t\t\t,-1.04184e-007\n\t\t\t\t,0.92388\n\t\t\t\t,0.382683\n\t\t\t\t,-1.04184e-007\n\t\t\t\t,1\n\t\t\t\t,0\n\t\t\t\t,-0.45413\n\t\t\t\t,0.890935\n\t\t\t\t,0\n\t\t\t\t,-0.45413\n\t\t\t\t,0.823117\n\t\t\t\t,0.340946\n\t\t\t\t,-1.04184e-007\n\t\t\t\t,0.92388\n\t\t\t\t,0.382683\n\t\t\t\t,0.454129\n\t\t\t\t,0.823118\n\t\t\t\t,0.340947\n\t\t\t\t,-1.04184e-007\n\t\t\t\t,0.92388\n\t\t\t\t,0.382683\n\t\t\t\t,-1.00325e-007\n\t\t\t\t,0.707107\n\t\t\t\t,0.707107\n\t\t\t\t,0.454129\n\t\t\t\t,0.629987\n\t\t\t\t,0.629987\n\t\t\t\t,-1.04184e-007\n\t\t\t\t,0.92388\n\t\t\t\t,0.382683\n\t\t\t\t,-0.45413\n\t\t\t\t,0.823117\n\t\t\t\t,0.340946\n\t\t\t\t,-1.00325e-007\n\t\t\t\t,0.707107\n\t\t\t\t,0.707107\n\t\t\t\t,-0.45413\n\t\t\t\t,0.629986\n\t\t\t\t,0.629987\n\t\t\t\t,0.454129\n\t\t\t\t,0.629987\n\t\t\t\t,0.629987\n\t\t\t\t,-1.00325e-007\n\t\t\t\t,0.707107\n\t\t\t\t,0.707107\n\t\t\t\t,0.454129\n\t\t\t\t,0.340947\n\t\t\t\t,0.823118\n\t\t\t\t,-1.00325e-007\n\t\t\t\t,0.382684\n\t\t\t\t,0.92388\n\t\t\t\t,-1.00325e-007\n\t\t\t\t,0.707107\n\t\t\t\t,0.707107\n\t\t\t\t,-0.45413\n\t\t\t\t,0.629986\n\t\t\t\t,0.629987\n\t\t\t\t,-0.45413\n\t\t\t\t,0.340946\n\t\t\t\t,0.823117\n\t\t\t\t,-1.00325e-007\n\t\t\t\t,0.382684\n\t\t\t\t,0.92388\n\t\t\t\t,0.454129\n\t\t\t\t,0.340947\n\t\t\t\t,0.823118\n\t\t\t\t,-1.00325e-007\n\t\t\t\t,0.382684\n\t\t\t\t,0.92388\n\t\t\t\t,-1.04184e-007\n\t\t\t\t,0\n\t\t\t\t,1\n\t\t\t\t,0.454129\n\t\t\t\t,0\n\t\t\t\t,0.890936\n\t\t\t\t,-1.00325e-007\n\t\t\t\t,0.382684\n\t\t\t\t,0.92388\n\t\t\t\t,-0.45413\n\t\t\t\t,0.340946\n\t\t\t\t,0.823117\n\t\t\t\t,-1.04184e-007\n\t\t\t\t,0\n\t\t\t\t,1\n\t\t\t\t,-0.45413\n\t\t\t\t,0\n\t\t\t\t,0.890935\n\t\t\t\t,0.454129\n\t\t\t\t,0\n\t\t\t\t,0.890936\n\t\t\t\t,-1.04184e-007\n\t\t\t\t,0\n\t\t\t\t,1\n\t\t\t\t,0.454129\n\t\t\t\t,-0.340947\n\t\t\t\t,0.823118\n\t\t\t\t,-1.00325e-007\n\t\t\t\t,-0.382684\n\t\t\t\t,0.923879\n\t\t\t\t,-1.04184e-007\n\t\t\t\t,0\n\t\t\t\t,1\n\t\t\t\t,-0.45413\n\t\t\t\t,0\n\t\t\t\t,0.890935\n\t\t\t\t,-0.45413\n\t\t\t\t,-0.340947\n\t\t\t\t,0.823117\n\t\t\t\t,-1.00325e-007\n\t\t\t\t,-0.382684\n\t\t\t\t,0.923879\n\t\t\t\t,0.454129\n\t\t\t\t,-0.340947\n\t\t\t\t,0.823118\n\t\t\t\t,-1.00325e-007\n\t\t\t\t,-0.382684\n\t\t\t\t,0.923879\n\t\t\t\t,-1.02254e-007\n\t\t\t\t,-0.707107\n\t\t\t\t,0.707107\n\t\t\t\t,0.454128\n\t\t\t\t,-0.629987\n\t\t\t\t,0.629987\n\t\t\t\t,-1.00325e-007\n\t\t\t\t,-0.382684\n\t\t\t\t,0.923879\n\t\t\t\t,-0.45413\n\t\t\t\t,-0.340947\n\t\t\t\t,0.823117\n\t\t\t\t,-1.02254e-007\n\t\t\t\t,-0.707107\n\t\t\t\t,0.707107\n\t\t\t\t,-0.45413\n\t\t\t\t,-0.629987\n\t\t\t\t,0.629987\n\t\t\t\t,0.454128\n\t\t\t\t,-0.629987\n\t\t\t\t,0.629987\n\t\t\t\t,-1.02254e-007\n\t\t\t\t,-0.707107\n\t\t\t\t,0.707107\n\t\t\t\t,0.454128\n\t\t\t\t,-0.823118\n\t\t\t\t,0.340947\n\t\t\t\t,-1.04184e-007\n\t\t\t\t,-0.92388\n\t\t\t\t,0.382683\n\t\t\t\t,-1.02254e-007\n\t\t\t\t,-0.707107\n\t\t\t\t,0.707107\n\t\t\t\t,-0.45413\n\t\t\t\t,-0.629987\n\t\t\t\t,0.629987\n\t\t\t\t,-0.45413\n\t\t\t\t,-0.823117\n\t\t\t\t,0.340946\n\t\t\t\t,-1.04184e-007\n\t\t\t\t,-0.92388\n\t\t\t\t,0.382683\n\t\t\t\t,0.454128\n\t\t\t\t,-0.823118\n\t\t\t\t,0.340947\n\t\t\t\t,-1.04184e-007\n\t\t\t\t,-0.92388\n\t\t\t\t,0.382683\n\t\t\t\t,-1.08042e-007\n\t\t\t\t,-1\n\t\t\t\t,0\n\t\t\t\t,0.454128\n\t\t\t\t,-0.890936\n\t\t\t\t,0\n\t\t\t\t,-1.04184e-007\n\t\t\t\t,-0.92388\n\t\t\t\t,0.382683\n\t\t\t\t,-0.45413\n\t\t\t\t,-0.823117\n\t\t\t\t,0.340946\n\t\t\t\t,-1.08042e-007\n\t\t\t\t,-1\n\t\t\t\t,0\n\t\t\t\t,-0.45413\n\t\t\t\t,-0.890936\n\t\t\t\t,0\n\t\t\t\t,0.454128\n\t\t\t\t,-0.890936\n\t\t\t\t,0\n\t\t\t\t,-1.08042e-007\n\t\t\t\t,-1\n\t\t\t\t,0\n\t\t\t\t,0.454128\n\t\t\t\t,-0.823118\n\t\t\t\t,-0.340947\n\t\t\t\t,-1.04184e-007\n\t\t\t\t,-0.92388\n\t\t\t\t,-0.382683\n\t\t\t\t,-1.08042e-007\n\t\t\t\t,-1\n\t\t\t\t,0\n\t\t\t\t,-0.45413\n\t\t\t\t,-0.890936\n\t\t\t\t,0\n\t\t\t\t,-0.45413\n\t\t\t\t,-0.823117\n\t\t\t\t,-0.340946\n\t\t\t\t,-1.04184e-007\n\t\t\t\t,-0.92388\n\t\t\t\t,-0.382683\n\t\t\t\t,0.454128\n\t\t\t\t,-0.823118\n\t\t\t\t,-0.340947\n\t\t\t\t,-1.04184e-007\n\t\t\t\t,-0.92388\n\t\t\t\t,-0.382683\n\t\t\t\t,-1.02254e-007\n\t\t\t\t,-0.707107\n\t\t\t\t,-0.707107\n\t\t\t\t,0.454128\n\t\t\t\t,-0.629987\n\t\t\t\t,-0.629987\n\t\t\t\t,-1.04184e-007\n\t\t\t\t,-0.92388\n\t\t\t\t,-0.382683\n\t\t\t\t,-0.45413\n\t\t\t\t,-0.823117\n\t\t\t\t,-0.340946\n\t\t\t\t,-1.02254e-007\n\t\t\t\t,-0.707107\n\t\t\t\t,-0.707107\n\t\t\t\t,-0.45413\n\t\t\t\t,-0.629987\n\t\t\t\t,-0.629987\n\t\t\t\t,0.454128\n\t\t\t\t,-0.629987\n\t\t\t\t,-0.629987\n\t\t\t\t,-1.02254e-007\n\t\t\t\t,-0.707107\n\t\t\t\t,-0.707107\n\t\t\t\t,0.454129\n\t\t\t\t,-0.340947\n\t\t\t\t,-0.823118\n\t\t\t\t,-1.00325e-007\n\t\t\t\t,-0.382684\n\t\t\t\t,-0.923879\n\t\t\t\t,-1.02254e-007\n\t\t\t\t,-0.707107\n\t\t\t\t,-0.707107\n\t\t\t\t,-0.45413\n\t\t\t\t,-0.629987\n\t\t\t\t,-0.629987\n\t\t\t\t,-0.45413\n\t\t\t\t,-0.340947\n\t\t\t\t,-0.823117\n\t\t\t\t,-1.00325e-007\n\t\t\t\t,-0.382684\n\t\t\t\t,-0.923879\n\t\t\t\t,0.454129\n\t\t\t\t,-0.340947\n\t\t\t\t,-0.823118\n\t\t\t\t,-1.00325e-007\n\t\t\t\t,-0.382684\n\t\t\t\t,-0.923879\n\t\t\t\t,-1.04184e-007\n\t\t\t\t,0\n\t\t\t\t,-1\n\t\t\t\t,0.454129\n\t\t\t\t,0\n\t\t\t\t,-0.890936\n\t\t\t\t,-1.00325e-007\n\t\t\t\t,-0.382684\n\t\t\t\t,-0.923879\n\t\t\t\t,-0.45413\n\t\t\t\t,-0.340947\n\t\t\t\t,-0.823117\n\t\t\t\t,-1.04184e-007\n\t\t\t\t,0\n\t\t\t\t,-1\n\t\t\t\t,-0.45413\n\t\t\t\t,0\n\t\t\t\t,-0.890935\n\t\t\t\t,0.454129\n\t\t\t\t,0\n\t\t\t\t,-0.890936\n\t\t\t\t,-1.04184e-007\n\t\t\t\t,0\n\t\t\t\t,-1\n\t\t\t\t,0.454129\n\t\t\t\t,0.340947\n\t\t\t\t,-0.823118\n\t\t\t\t,-1.00325e-007\n\t\t\t\t,0.382684\n\t\t\t\t,-0.92388\n\t\t\t\t,-1.04184e-007\n\t\t\t\t,0\n\t\t\t\t,-1\n\t\t\t\t,-0.45413\n\t\t\t\t,0\n\t\t\t\t,-0.890935\n\t\t\t\t,-0.45413\n\t\t\t\t,0.340946\n\t\t\t\t,-0.823117\n\t\t\t\t,-1.00325e-007\n\t\t\t\t,0.382684\n\t\t\t\t,-0.92388\n\t\t\t\t,0.454129\n\t\t\t\t,0.340947\n\t\t\t\t,-0.823118\n\t\t\t\t,-1.00325e-007\n\t\t\t\t,0.382684\n\t\t\t\t,-0.92388\n\t\t\t\t,-1.00325e-007\n\t\t\t\t,0.707107\n\t\t\t\t,-0.707107\n\t\t\t\t,0.454129\n\t\t\t\t,0.629987\n\t\t\t\t,-0.629987\n\t\t\t\t,-1.00325e-007\n\t\t\t\t,0.382684\n\t\t\t\t,-0.92388\n\t\t\t\t,-0.45413\n\t\t\t\t,0.340946\n\t\t\t\t,-0.823117\n\t\t\t\t,-1.00325e-007\n\t\t\t\t,0.707107\n\t\t\t\t,-0.707107\n\t\t\t\t,-0.45413\n\t\t\t\t,0.629986\n\t\t\t\t,-0.629987\n\t\t\t\t,0.454129\n\t\t\t\t,0.629987\n\t\t\t\t,-0.629987\n\t\t\t\t,-1.00325e-007\n\t\t\t\t,0.707107\n\t\t\t\t,-0.707107\n\t\t\t\t,0.454129\n\t\t\t\t,0.823118\n\t\t\t\t,-0.340947\n\t\t\t\t,-1.04184e-007\n\t\t\t\t,0.92388\n\t\t\t\t,-0.382683\n\t\t\t\t,-1.00325e-007\n\t\t\t\t,0.707107\n\t\t\t\t,-0.707107\n\t\t\t\t,-0.45413\n\t\t\t\t,0.629986\n\t\t\t\t,-0.629987\n\t\t\t\t,-0.45413\n\t\t\t\t,0.823117\n\t\t\t\t,-0.340946\n\t\t\t\t,-1.04184e-007\n\t\t\t\t,0.92388\n\t\t\t\t,-0.382683\n\t\t\t\t,0.454129\n\t\t\t\t,0.823118\n\t\t\t\t,-0.340947\n\t\t\t\t,-1.04184e-007\n\t\t\t\t,0.92388\n\t\t\t\t,-0.382683\n\t\t\t\t,-1.04184e-007\n\t\t\t\t,1\n\t\t\t\t,0\n\t\t\t\t,0.454129\n\t\t\t\t,0.890936\n\t\t\t\t,0\n\t\t\t\t,-1.04184e-007\n\t\t\t\t,0.92388\n\t\t\t\t,-0.382683\n\t\t\t\t,-0.45413\n\t\t\t\t,0.823117\n\t\t\t\t,-0.340946\n\t\t\t\t,-1.04184e-007\n\t\t\t\t,1\n\t\t\t\t,0\n\t\t\t\t,-0.45413\n\t\t\t\t,0.890935\n\t\t\t\t,0\n\t\t\t]\n\t\t\t,\"tangents\": [\n\t\t\t\t -0.040663\n\t\t\t\t,-0.000383586\n\t\t\t\t,-0.999173\n\t\t\t\t,-0.258808\n\t\t\t\t,0.00523812\n\t\t\t\t,-0.965914\n\t\t\t\t,0\n\t\t\t\t,3.57869e-008\n\t\t\t\t,-1\n\t\t\t\t,-2.18394e-007\n\t\t\t\t,-9.1843e-008\n\t\t\t\t,-1\n\t\t\t\t,0\n\t\t\t\t,-4.76878e-008\n\t\t\t\t,-1\n\t\t\t\t,-0.159762\n\t\t\t\t,0.00365147\n\t\t\t\t,-0.987149\n\t\t\t\t,0.0342898\n\t\t\t\t,-0.00258663\n\t\t\t\t,-0.999409\n\t\t\t\t,0.0552983\n\t\t\t\t,-0.0281864\n\t\t\t\t,-0.998072\n\t\t\t\t,0.414342\n\t\t\t\t,0.143659\n\t\t\t\t,-0.898712\n\t\t\t\t,-0.0602478\n\t\t\t\t,0.00976604\n\t\t\t\t,-0.998136\n\t\t\t\t,-0.055298\n\t\t\t\t,-0.0281863\n\t\t\t\t,-0.998072\n\t\t\t\t,-0.41434\n\t\t\t\t,0.143659\n\t\t\t\t,-0.898712\n\t\t\t\t,-0.411744\n\t\t\t\t,0.0185513\n\t\t\t\t,-0.911111\n\t\t\t\t,-0.388404\n\t\t\t\t,0.016836\n\t\t\t\t,-0.921335\n\t\t\t\t,0.106503\n\t\t\t\t,0.0024515\n\t\t\t\t,-0.994309\n\t\t\t\t,0.709306\n\t\t\t\t,0.17223\n\t\t\t\t,-0.683536\n\t\t\t\t,-0.709305\n\t\t\t\t,0.172231\n\t\t\t\t,-0.683537\n\t\t\t\t,-0.498671\n\t\t\t\t,0.0170538\n\t\t\t\t,-0.866624\n\t\t\t\t,-0.365282\n\t\t\t\t,0.010367\n\t\t\t\t,-0.930839\n\t\t\t\t,0.852957\n\t\t\t\t,0.100491\n\t\t\t\t,-0.512216\n\t\t\t\t,-0.226287\n\t\t\t\t,0.058902\n\t\t\t\t,-0.972278\n\t\t\t\t,-0.852957\n\t\t\t\t,0.100491\n\t\t\t\t,-0.512217\n\t\t\t\t,-0.520791\n\t\t\t\t,-0.00404867\n\t\t\t\t,-0.853675\n\t\t\t\t,-0.519066\n\t\t\t\t,1.53965e-007\n\t\t\t\t,-0.854734\n\t\t\t\t,0.116767\n\t\t\t\t,-0.00323018\n\t\t\t\t,-0.993154\n\t\t\t\t,0.890936\n\t\t\t\t,0\n\t\t\t\t,-0.454128\n\t\t\t\t,-0.890936\n\t\t\t\t,0\n\t\t\t\t,-0.454129\n\t\t\t\t,-0.476485\n\t\t\t\t,-0.0201484\n\t\t\t\t,-0.878952\n\t\t\t\t,-0.365282\n\t\t\t\t,-0.010367\n\t\t\t\t,-0.930839\n\t\t\t\t,0.854508\n\t\t\t\t,-0.0947999\n\t\t\t\t,-0.510714\n\t\t\t\t,-0.266827\n\t\t\t\t,-0.0325038\n\t\t\t\t,-0.963196\n\t\t\t\t,-0.854507\n\t\t\t\t,-0.0948002\n\t\t\t\t,-0.510715\n\t\t\t\t,-0.368075\n\t\t\t\t,-0.0141367\n\t\t\t\t,-0.929689\n\t\t\t\t,-0.388405\n\t\t\t\t,-0.0168355\n\t\t\t\t,-0.921335\n\t\t\t\t,0.0592952\n\t\t\t\t,0.00217883\n\t\t\t\t,-0.998238\n\t\t\t\t,0.731654\n\t\t\t\t,-0.139776\n\t\t\t\t,-0.667191\n\t\t\t\t,-0.731653\n\t\t\t\t,-0.139777\n\t\t\t\t,-0.667193\n\t\t\t\t,-0.191516\n\t\t\t\t,-0.0017315\n\t\t\t\t,-0.981488\n\t\t\t\t,-0.159762\n\t\t\t\t,-0.00365032\n\t\t\t\t,-0.987149\n\t\t\t\t,0.263324\n\t\t\t\t,-0.241582\n\t\t\t\t,-0.933969\n\t\t\t\t,-0.143103\n\t\t\t\t,-0.0331642\n\t\t\t\t,-0.989152\n\t\t\t\t,-0.458106\n\t\t\t\t,-0.112487\n\t\t\t\t,-0.881751\n\t\t\t\t,0.0406642\n\t\t\t\t,-0.000384465\n\t\t\t\t,-0.999173\n\t\t\t\t,-2.64718e-007\n\t\t\t\t,1.77027e-007\n\t\t\t\t,-1\n\t\t\t\t,-0.0335702\n\t\t\t\t,0.00349361\n\t\t\t\t,-0.99943\n\t\t\t\t,0.0330475\n\t\t\t\t,0.0168447\n\t\t\t\t,-0.999312\n\t\t\t\t,-0.0552993\n\t\t\t\t,0.028187\n\t\t\t\t,-0.998072\n\t\t\t\t,0.258811\n\t\t\t\t,0.00523932\n\t\t\t\t,-0.965914\n\t\t\t\t,0.159762\n\t\t\t\t,0.00364994\n\t\t\t\t,-0.987149\n\t\t\t\t,-0.236441\n\t\t\t\t,0.257616\n\t\t\t\t,-0.936872\n\t\t\t\t,0.060244\n\t\t\t\t,0.00976536\n\t\t\t\t,-0.998136\n\t\t\t\t,0.414343\n\t\t\t\t,0.143657\n\t\t\t\t,-0.898712\n\t\t\t\t,0.411752\n\t\t\t\t,0.0185537\n\t\t\t\t,-0.911107\n\t\t\t\t,0.388404\n\t\t\t\t,0.0168356\n\t\t\t\t,-0.921335\n\t\t\t\t,-0.106499\n\t\t\t\t,0.00245157\n\t\t\t\t,-0.99431\n\t\t\t\t,-0.709306\n\t\t\t\t,0.17223\n\t\t\t\t,-0.683536\n\t\t\t\t,0.709305\n\t\t\t\t,0.17223\n\t\t\t\t,-0.683537\n\t\t\t\t,0.498675\n\t\t\t\t,0.017055\n\t\t\t\t,-0.866621\n\t\t\t\t,0.365281\n\t\t\t\t,0.0103668\n\t\t\t\t,-0.93084\n\t\t\t\t,-0.852957\n\t\t\t\t,0.10049\n\t\t\t\t,-0.512217\n\t\t\t\t,0.226296\n\t\t\t\t,0.0589057\n\t\t\t\t,-0.972276\n\t\t\t\t,0.852956\n\t\t\t\t,0.100491\n\t\t\t\t,-0.512218\n\t\t\t\t,0.520792\n\t\t\t\t,-0.00404838\n\t\t\t\t,-0.853674\n\t\t\t\t,0.519064\n\t\t\t\t,-1.4181e-007\n\t\t\t\t,-0.854735\n\t\t\t\t,-0.116762\n\t\t\t\t,-0.00322989\n\t\t\t\t,-0.993155\n\t\t\t\t,-0.890936\n\t\t\t\t,0\n\t\t\t\t,-0.454129\n\t\t\t\t,0.890935\n\t\t\t\t,0\n\t\t\t\t,-0.45413\n\t\t\t\t,0.476479\n\t\t\t\t,-0.020147\n\t\t\t\t,-0.878955\n\t\t\t\t,0.365281\n\t\t\t\t,-0.010367\n\t\t\t\t,-0.93084\n\t\t\t\t,-0.854507\n\t\t\t\t,-0.0948012\n\t\t\t\t,-0.510715\n\t\t\t\t,0.266826\n\t\t\t\t,-0.0325031\n\t\t\t\t,-0.963196\n\t\t\t\t,0.854506\n\t\t\t\t,-0.0948015\n\t\t\t\t,-0.510717\n\t\t\t\t,0.368066\n\t\t\t\t,-0.0141348\n\t\t\t\t,-0.929692\n\t\t\t\t,0.388404\n\t\t\t\t,-0.016836\n\t\t\t\t,-0.921335\n\t\t\t\t,-0.0592997\n\t\t\t\t,0.00217925\n\t\t\t\t,-0.998238\n\t\t\t\t,-0.731653\n\t\t\t\t,-0.139777\n\t\t\t\t,-0.667192\n\t\t\t\t,0.731652\n\t\t\t\t,-0.139778\n\t\t\t\t,-0.667194\n\t\t\t\t,0.191519\n\t\t\t\t,-0.00172977\n\t\t\t\t,-0.981487\n\t\t\t\t,0.159761\n\t\t\t\t,-0.00365147\n\t\t\t\t,-0.987149\n\t\t\t\t,-0.458105\n\t\t\t\t,-0.112489\n\t\t\t\t,-0.881752\n\t\t\t\t,0.143095\n\t\t\t\t,-0.033162\n\t\t\t\t,-0.989153\n\t\t\t\t,0.458104\n\t\t\t\t,-0.112489\n\t\t\t\t,-0.881752\n\t\t\t\t,0.0268145\n\t\t\t\t,-0.0136682\n\t\t\t\t,0.999547\n\t\t\t\t,-2.30261e-009\n\t\t\t\t,-1.46002e-007\n\t\t\t\t,1\n\t\t\t\t,-0.0160933\n\t\t\t\t,-0.375042\n\t\t\t\t,0.926868\n\t\t\t\t,4.14468e-009\n\t\t\t\t,-0.382684\n\t\t\t\t,0.923879\n\t\t\t\t,-2.30261e-009\n\t\t\t\t,-1.46002e-007\n\t\t\t\t,1\n\t\t\t\t,-0.0268146\n\t\t\t\t,-0.0136683\n\t\t\t\t,0.999547\n\t\t\t\t,0.0160933\n\t\t\t\t,-0.375042\n\t\t\t\t,0.926868\n\t\t\t\t,4.14468e-009\n\t\t\t\t,-0.382684\n\t\t\t\t,0.923879\n\t\t\t\t,-0.0160933\n\t\t\t\t,-0.375042\n\t\t\t\t,0.926868\n\t\t\t\t,4.14468e-009\n\t\t\t\t,-0.382684\n\t\t\t\t,0.923879\n\t\t\t\t,2.3026e-009\n\t\t\t\t,-0.707107\n\t\t\t\t,0.707107\n\t\t\t\t,-0.0268147\n\t\t\t\t,-0.697122\n\t\t\t\t,0.716451\n\t\t\t\t,4.14468e-009\n\t\t\t\t,-0.382684\n\t\t\t\t,0.923879\n\t\t\t\t,0.0160933\n\t\t\t\t,-0.375042\n\t\t\t\t,0.926868\n\t\t\t\t,2.3026e-009\n\t\t\t\t,-0.707107\n\t\t\t\t,0.707107\n\t\t\t\t,0.0268147\n\t\t\t\t,-0.697122\n\t\t\t\t,0.716451\n\t\t\t\t,-0.0268147\n\t\t\t\t,-0.697122\n\t\t\t\t,0.716451\n\t\t\t\t,2.3026e-009\n\t\t\t\t,-0.707107\n\t\t\t\t,0.707107\n\t\t\t\t,-0.0160932\n\t\t\t\t,-0.92059\n\t\t\t\t,0.390199\n\t\t\t\t,4.14469e-009\n\t\t\t\t,-0.923879\n\t\t\t\t,0.382684\n\t\t\t\t,2.3026e-009\n\t\t\t\t,-0.707107\n\t\t\t\t,0.707107\n\t\t\t\t,0.0268147\n\t\t\t\t,-0.697122\n\t\t\t\t,0.716451\n\t\t\t\t,0.0160932\n\t\t\t\t,-0.92059\n\t\t\t\t,0.390199\n\t\t\t\t,4.14469e-009\n\t\t\t\t,-0.923879\n\t\t\t\t,0.382684\n\t\t\t\t,-0.0160932\n\t\t\t\t,-0.92059\n\t\t\t\t,0.390199\n\t\t\t\t,4.14469e-009\n\t\t\t\t,-0.923879\n\t\t\t\t,0.382684\n\t\t\t\t,2.3026e-009\n\t\t\t\t,-1\n\t\t\t\t,0\n\t\t\t\t,-0.0268145\n\t\t\t\t,-0.999547\n\t\t\t\t,0.0136679\n\t\t\t\t,4.14469e-009\n\t\t\t\t,-0.923879\n\t\t\t\t,0.382684\n\t\t\t\t,0.0160932\n\t\t\t\t,-0.92059\n\t\t\t\t,0.390199\n\t\t\t\t,2.3026e-009\n\t\t\t\t,-1\n\t\t\t\t,0\n\t\t\t\t,0.0268146\n\t\t\t\t,-0.999547\n\t\t\t\t,0.013668\n\t\t\t\t,-0.0268145\n\t\t\t\t,-0.999547\n\t\t\t\t,0.0136679\n\t\t\t\t,2.3026e-009\n\t\t\t\t,-1\n\t\t\t\t,0\n\t\t\t\t,-0.0160933\n\t\t\t\t,-0.926868\n\t\t\t\t,-0.375042\n\t\t\t\t,3.99119e-009\n\t\t\t\t,-0.923879\n\t\t\t\t,-0.382684\n\t\t\t\t,2.3026e-009\n\t\t\t\t,-1\n\t\t\t\t,0\n\t\t\t\t,0.0268146\n\t\t\t\t,-0.999547\n\t\t\t\t,0.013668\n\t\t\t\t,0.0160933\n\t\t\t\t,-0.926868\n\t\t\t\t,-0.375042\n\t\t\t\t,3.99119e-009\n\t\t\t\t,-0.923879\n\t\t\t\t,-0.382684\n\t\t\t\t,-0.0160933\n\t\t\t\t,-0.926868\n\t\t\t\t,-0.375042\n\t\t\t\t,3.99119e-009\n\t\t\t\t,-0.923879\n\t\t\t\t,-0.382684\n\t\t\t\t,2.21731e-009\n\t\t\t\t,-0.707107\n\t\t\t\t,-0.707107\n\t\t\t\t,-0.0268146\n\t\t\t\t,-0.716451\n\t\t\t\t,-0.697122\n\t\t\t\t,3.99119e-009\n\t\t\t\t,-0.923879\n\t\t\t\t,-0.382684\n\t\t\t\t,0.0160933\n\t\t\t\t,-0.926868\n\t\t\t\t,-0.375042\n\t\t\t\t,2.21731e-009\n\t\t\t\t,-0.707107\n\t\t\t\t,-0.707107\n\t\t\t\t,0.0268146\n\t\t\t\t,-0.716451\n\t\t\t\t,-0.697121\n\t\t\t\t,-0.0268146\n\t\t\t\t,-0.716451\n\t\t\t\t,-0.697122\n\t\t\t\t,2.21731e-009\n\t\t\t\t,-0.707107\n\t\t\t\t,-0.707107\n\t\t\t\t,0.263324\n\t\t\t\t,-0.241582\n\t\t\t\t,-0.933969\n\t\t\t\t,4.1447e-009\n\t\t\t\t,-0.382684\n\t\t\t\t,-0.923879\n\t\t\t\t,2.21731e-009\n\t\t\t\t,-0.707107\n\t\t\t\t,-0.707107\n\t\t\t\t,0.0268146\n\t\t\t\t,-0.716451\n\t\t\t\t,-0.697121\n\t\t\t\t,0.0160934\n\t\t\t\t,-0.3902\n\t\t\t\t,-0.92059\n\t\t\t\t,4.1447e-009\n\t\t\t\t,-0.382684\n\t\t\t\t,-0.923879\n\t\t\t\t,0.263324\n\t\t\t\t,-0.241582\n\t\t\t\t,-0.933969\n\t\t\t\t,4.1447e-009\n\t\t\t\t,-0.382684\n\t\t\t\t,-0.923879\n\t\t\t\t,2.34524e-009\n\t\t\t\t,-1.46002e-007\n\t\t\t\t,-1\n\t\t\t\t,0.0330475\n\t\t\t\t,0.0168447\n\t\t\t\t,-0.999312\n\t\t\t\t,4.1447e-009\n\t\t\t\t,-0.382684\n\t\t\t\t,-0.923879\n\t\t\t\t,0.0160934\n\t\t\t\t,-0.3902\n\t\t\t\t,-0.92059\n\t\t\t\t,2.34524e-009\n\t\t\t\t,-1.46002e-007\n\t\t\t\t,-1\n\t\t\t\t,0.0268145\n\t\t\t\t,-0.0136682\n\t\t\t\t,-0.999547\n\t\t\t\t,0.0330475\n\t\t\t\t,0.0168447\n\t\t\t\t,-0.999312\n\t\t\t\t,2.34524e-009\n\t\t\t\t,-1.46002e-007\n\t\t\t\t,-1\n\t\t\t\t,-0.236441\n\t\t\t\t,0.257616\n\t\t\t\t,-0.936872\n\t\t\t\t,4.14468e-009\n\t\t\t\t,0.382683\n\t\t\t\t,-0.92388\n\t\t\t\t,2.34524e-009\n\t\t\t\t,-1.46002e-007\n\t\t\t\t,-1\n\t\t\t\t,0.0268145\n\t\t\t\t,-0.0136682\n\t\t\t\t,-0.999547\n\t\t\t\t,0.0160934\n\t\t\t\t,0.375042\n\t\t\t\t,-0.926868\n\t\t\t\t,4.14468e-009\n\t\t\t\t,0.382683\n\t\t\t\t,-0.92388\n\t\t\t\t,-0.236441\n\t\t\t\t,0.257616\n\t\t\t\t,-0.936872\n\t\t\t\t,4.14468e-009\n\t\t\t\t,0.382683\n\t\t\t\t,-0.92388\n\t\t\t\t,2.21732e-009\n\t\t\t\t,0.707107\n\t\t\t\t,-0.707107\n\t\t\t\t,-0.0268144\n\t\t\t\t,0.697122\n\t\t\t\t,-0.716451\n\t\t\t\t,4.14468e-009\n\t\t\t\t,0.382683\n\t\t\t\t,-0.92388\n\t\t\t\t,0.0160934\n\t\t\t\t,0.375042\n\t\t\t\t,-0.926868\n\t\t\t\t,2.21732e-009\n\t\t\t\t,0.707107\n\t\t\t\t,-0.707107\n\t\t\t\t,0.0268145\n\t\t\t\t,0.697122\n\t\t\t\t,-0.716451\n\t\t\t\t,-0.0268144\n\t\t\t\t,0.697122\n\t\t\t\t,-0.716451\n\t\t\t\t,2.21732e-009\n\t\t\t\t,0.707107\n\t\t\t\t,-0.707107\n\t\t\t\t,-0.0160934\n\t\t\t\t,0.92059\n\t\t\t\t,-0.3902\n\t\t\t\t,3.9912e-009\n\t\t\t\t,0.923879\n\t\t\t\t,-0.382684\n\t\t\t\t,2.21732e-009\n\t\t\t\t,0.707107\n\t\t\t\t,-0.707107\n\t\t\t\t,0.0268145\n\t\t\t\t,0.697122\n\t\t\t\t,-0.716451\n\t\t\t\t,0.0160934\n\t\t\t\t,0.92059\n\t\t\t\t,-0.3902\n\t\t\t\t,3.9912e-009\n\t\t\t\t,0.923879\n\t\t\t\t,-0.382684\n\t\t\t\t,-0.0160934\n\t\t\t\t,0.92059\n\t\t\t\t,-0.3902\n\t\t\t\t,3.9912e-009\n\t\t\t\t,0.923879\n\t\t\t\t,-0.382684\n\t\t\t\t,2.3026e-009\n\t\t\t\t,1\n\t\t\t\t,0\n\t\t\t\t,-0.0268146\n\t\t\t\t,0.999547\n\t\t\t\t,-0.0136679\n\t\t\t\t,3.9912e-009\n\t\t\t\t,0.923879\n\t\t\t\t,-0.382684\n\t\t\t\t,0.0160934\n\t\t\t\t,0.92059\n\t\t\t\t,-0.3902\n\t\t\t\t,2.3026e-009\n\t\t\t\t,1\n\t\t\t\t,0\n\t\t\t\t,0.0268146\n\t\t\t\t,0.999547\n\t\t\t\t,-0.013668\n\t\t\t\t,-0.0268146\n\t\t\t\t,0.999547\n\t\t\t\t,-0.0136679\n\t\t\t\t,2.3026e-009\n\t\t\t\t,1\n\t\t\t\t,0\n\t\t\t\t,-0.0160933\n\t\t\t\t,0.926868\n\t\t\t\t,0.375042\n\t\t\t\t,3.99119e-009\n\t\t\t\t,0.92388\n\t\t\t\t,0.382683\n\t\t\t\t,2.3026e-009\n\t\t\t\t,1\n\t\t\t\t,0\n\t\t\t\t,0.0268146\n\t\t\t\t,0.999547\n\t\t\t\t,-0.013668\n\t\t\t\t,0.0160933\n\t\t\t\t,0.926868\n\t\t\t\t,0.375042\n\t\t\t\t,3.99119e-009\n\t\t\t\t,0.92388\n\t\t\t\t,0.382683\n\t\t\t\t,-0.0160933\n\t\t\t\t,0.926868\n\t\t\t\t,0.375042\n\t\t\t\t,3.99119e-009\n\t\t\t\t,0.92388\n\t\t\t\t,0.382683\n\t\t\t\t,2.25996e-009\n\t\t\t\t,0.707107\n\t\t\t\t,0.707107\n\t\t\t\t,-0.0268145\n\t\t\t\t,0.716451\n\t\t\t\t,0.697122\n\t\t\t\t,3.99119e-009\n\t\t\t\t,0.92388\n\t\t\t\t,0.382683\n\t\t\t\t,0.0160933\n\t\t\t\t,0.926868\n\t\t\t\t,0.375042\n\t\t\t\t,2.25996e-009\n\t\t\t\t,0.707107\n\t\t\t\t,0.707107\n\t\t\t\t,0.0268146\n\t\t\t\t,0.716451\n\t\t\t\t,0.697122\n\t\t\t\t,-0.0268145\n\t\t\t\t,0.716451\n\t\t\t\t,0.697122\n\t\t\t\t,2.25996e-009\n\t\t\t\t,0.707107\n\t\t\t\t,0.707107\n\t\t\t\t,-0.0160933\n\t\t\t\t,0.3902\n\t\t\t\t,0.92059\n\t\t\t\t,4.14468e-009\n\t\t\t\t,0.382683\n\t\t\t\t,0.92388\n\t\t\t\t,2.25996e-009\n\t\t\t\t,0.707107\n\t\t\t\t,0.707107\n\t\t\t\t,0.0268146\n\t\t\t\t,0.716451\n\t\t\t\t,0.697122\n\t\t\t\t,0.0160934\n\t\t\t\t,0.3902\n\t\t\t\t,0.92059\n\t\t\t\t,4.14468e-009\n\t\t\t\t,0.382683\n\t\t\t\t,0.92388\n\t\t\t\t,-0.0160933\n\t\t\t\t,0.3902\n\t\t\t\t,0.92059\n\t\t\t\t,4.14468e-009\n\t\t\t\t,0.382683\n\t\t\t\t,0.92388\n\t\t\t\t,-2.30261e-009\n\t\t\t\t,-1.46002e-007\n\t\t\t\t,1\n\t\t\t\t,0.0268145\n\t\t\t\t,-0.0136682\n\t\t\t\t,0.999547\n\t\t\t\t,4.14468e-009\n\t\t\t\t,0.382683\n\t\t\t\t,0.92388\n\t\t\t\t,0.0160934\n\t\t\t\t,0.3902\n\t\t\t\t,0.92059\n\t\t\t\t,-2.30261e-009\n\t\t\t\t,-1.46002e-007\n\t\t\t\t,1\n\t\t\t\t,-0.0268146\n\t\t\t\t,-0.0136683\n\t\t\t\t,0.999547\n\t\t\t\t,0\n\t\t\t\t,2.77056e-008\n\t\t\t\t,-1\n\t\t\t\t,0.258809\n\t\t\t\t,0.00523812\n\t\t\t\t,-0.965914\n\t\t\t\t,0.0406628\n\t\t\t\t,-0.000383594\n\t\t\t\t,-0.999173\n\t\t\t\t,0.159762\n\t\t\t\t,0.00365148\n\t\t\t\t,-0.987149\n\t\t\t\t,0\n\t\t\t\t,-5.1428e-008\n\t\t\t\t,-1\n\t\t\t\t,5.07272e-008\n\t\t\t\t,-8.86392e-008\n\t\t\t\t,-1\n\t\t\t\t,-0.414342\n\t\t\t\t,0.143659\n\t\t\t\t,-0.898712\n\t\t\t\t,-0.055298\n\t\t\t\t,-0.0281865\n\t\t\t\t,-0.998072\n\t\t\t\t,-0.0342897\n\t\t\t\t,-0.00258663\n\t\t\t\t,-0.999409\n\t\t\t\t,0.0602476\n\t\t\t\t,0.00976604\n\t\t\t\t,-0.998136\n\t\t\t\t,0.414341\n\t\t\t\t,0.143659\n\t\t\t\t,-0.898712\n\t\t\t\t,0.0552976\n\t\t\t\t,-0.0281864\n\t\t\t\t,-0.998072\n\t\t\t\t,0.411744\n\t\t\t\t,0.0185513\n\t\t\t\t,-0.911111\n\t\t\t\t,0.388404\n\t\t\t\t,0.016836\n\t\t\t\t,-0.921335\n\t\t\t\t,-0.106503\n\t\t\t\t,0.00245147\n\t\t\t\t,-0.994309\n\t\t\t\t,-0.709306\n\t\t\t\t,0.17223\n\t\t\t\t,-0.683536\n\t\t\t\t,0.709305\n\t\t\t\t,0.17223\n\t\t\t\t,-0.683537\n\t\t\t\t,0.498671\n\t\t\t\t,0.0170538\n\t\t\t\t,-0.866624\n\t\t\t\t,0.365281\n\t\t\t\t,0.0103669\n\t\t\t\t,-0.930839\n\t\t\t\t,-0.852957\n\t\t\t\t,0.100491\n\t\t\t\t,-0.512216\n\t\t\t\t,0.226288\n\t\t\t\t,0.0589018\n\t\t\t\t,-0.972278\n\t\t\t\t,0.852956\n\t\t\t\t,0.100492\n\t\t\t\t,-0.512218\n\t\t\t\t,0.520791\n\t\t\t\t,-0.00404873\n\t\t\t\t,-0.853674\n\t\t\t\t,0.519065\n\t\t\t\t,1.4181e-007\n\t\t\t\t,-0.854735\n\t\t\t\t,-0.116765\n\t\t\t\t,-0.00323027\n\t\t\t\t,-0.993154\n\t\t\t\t,-0.890936\n\t\t\t\t,0\n\t\t\t\t,-0.454129\n\t\t\t\t,0.890935\n\t\t\t\t,0\n\t\t\t\t,-0.45413\n\t\t\t\t,0.476485\n\t\t\t\t,-0.0201484\n\t\t\t\t,-0.878952\n\t\t\t\t,0.365281\n\t\t\t\t,-0.0103669\n\t\t\t\t,-0.930839\n\t\t\t\t,-0.854508\n\t\t\t\t,-0.0948003\n\t\t\t\t,-0.510715\n\t\t\t\t,0.266828\n\t\t\t\t,-0.032504\n\t\t\t\t,-0.963196\n\t\t\t\t,0.854507\n\t\t\t\t,-0.0948007\n\t\t\t\t,-0.510716\n\t\t\t\t,0.368075\n\t\t\t\t,-0.0141367\n\t\t\t\t,-0.929689\n\t\t\t\t,0.388405\n\t\t\t\t,-0.0168355\n\t\t\t\t,-0.921335\n\t\t\t\t,-0.0592949\n\t\t\t\t,0.00217878\n\t\t\t\t,-0.998238\n\t\t\t\t,-0.731654\n\t\t\t\t,-0.139776\n\t\t\t\t,-0.667192\n\t\t\t\t,0.731653\n\t\t\t\t,-0.139777\n\t\t\t\t,-0.667193\n\t\t\t\t,0.191515\n\t\t\t\t,-0.00173153\n\t\t\t\t,-0.981488\n\t\t\t\t,0.159762\n\t\t\t\t,-0.00365034\n\t\t\t\t,-0.987149\n\t\t\t\t,-0.263324\n\t\t\t\t,-0.241582\n\t\t\t\t,-0.933969\n\t\t\t\t,0.143103\n\t\t\t\t,-0.0331642\n\t\t\t\t,-0.989152\n\t\t\t\t,0.458106\n\t\t\t\t,-0.112487\n\t\t\t\t,-0.881751\n\t\t\t\t,-0.0406643\n\t\t\t\t,-0.000384468\n\t\t\t\t,-0.999173\n\t\t\t\t,1.08396e-007\n\t\t\t\t,1.75142e-007\n\t\t\t\t,-1\n\t\t\t\t,0.0335703\n\t\t\t\t,0.00349361\n\t\t\t\t,-0.99943\n\t\t\t\t,-0.0330473\n\t\t\t\t,0.0168449\n\t\t\t\t,-0.999312\n\t\t\t\t,0.0552989\n\t\t\t\t,0.0281871\n\t\t\t\t,-0.998072\n\t\t\t\t,-0.258811\n\t\t\t\t,0.00523935\n\t\t\t\t,-0.965914\n\t\t\t\t,-0.159762\n\t\t\t\t,0.00364992\n\t\t\t\t,-0.987149\n\t\t\t\t,0.236441\n\t\t\t\t,0.257617\n\t\t\t\t,-0.936872\n\t\t\t\t,-0.0602438\n\t\t\t\t,0.0097654\n\t\t\t\t,-0.998136\n\t\t\t\t,-0.414343\n\t\t\t\t,0.143657\n\t\t\t\t,-0.898711\n\t\t\t\t,-0.411752\n\t\t\t\t,0.0185537\n\t\t\t\t,-0.911107\n\t\t\t\t,-0.388404\n\t\t\t\t,0.0168356\n\t\t\t\t,-0.921335\n\t\t\t\t,0.106499\n\t\t\t\t,0.00245158\n\t\t\t\t,-0.99431\n\t\t\t\t,0.709307\n\t\t\t\t,0.17223\n\t\t\t\t,-0.683536\n\t\t\t\t,-0.709305\n\t\t\t\t,0.17223\n\t\t\t\t,-0.683537\n\t\t\t\t,-0.498674\n\t\t\t\t,0.0170549\n\t\t\t\t,-0.866622\n\t\t\t\t,-0.365281\n\t\t\t\t,0.0103669\n\t\t\t\t,-0.930839\n\t\t\t\t,0.852957\n\t\t\t\t,0.10049\n\t\t\t\t,-0.512216\n\t\t\t\t,-0.226295\n\t\t\t\t,0.0589055\n\t\t\t\t,-0.972276\n\t\t\t\t,-0.852957\n\t\t\t\t,0.100491\n\t\t\t\t,-0.512218\n\t\t\t\t,-0.52079\n\t\t\t\t,-0.00404831\n\t\t\t\t,-0.853675\n\t\t\t\t,-0.519065\n\t\t\t\t,-1.53965e-007\n\t\t\t\t,-0.854735\n\t\t\t\t,0.116764\n\t\t\t\t,-0.00322987\n\t\t\t\t,-0.993154\n\t\t\t\t,0.890936\n\t\t\t\t,0\n\t\t\t\t,-0.454129\n\t\t\t\t,-0.890935\n\t\t\t\t,0\n\t\t\t\t,-0.45413\n\t\t\t\t,-0.476478\n\t\t\t\t,-0.020147\n\t\t\t\t,-0.878955\n\t\t\t\t,-0.365281\n\t\t\t\t,-0.0103671\n\t\t\t\t,-0.930839\n\t\t\t\t,0.854508\n\t\t\t\t,-0.094801\n\t\t\t\t,-0.510715\n\t\t\t\t,-0.266824\n\t\t\t\t,-0.0325028\n\t\t\t\t,-0.963197\n\t\t\t\t,-0.854507\n\t\t\t\t,-0.0948013\n\t\t\t\t,-0.510716\n\t\t\t\t,-0.368067\n\t\t\t\t,-0.0141349\n\t\t\t\t,-0.929692\n\t\t\t\t,-0.388404\n\t\t\t\t,-0.016836\n\t\t\t\t,-0.921335\n\t\t\t\t,0.0592997\n\t\t\t\t,0.00217923\n\t\t\t\t,-0.998238\n\t\t\t\t,0.731653\n\t\t\t\t,-0.139777\n\t\t\t\t,-0.667192\n\t\t\t\t,-0.731652\n\t\t\t\t,-0.139777\n\t\t\t\t,-0.667194\n\t\t\t\t,-0.191519\n\t\t\t\t,-0.00172977\n\t\t\t\t,-0.981487\n\t\t\t\t,-0.159762\n\t\t\t\t,-0.00365147\n\t\t\t\t,-0.987149\n\t\t\t\t,0.458106\n\t\t\t\t,-0.112489\n\t\t\t\t,-0.881751\n\t\t\t\t,-0.143095\n\t\t\t\t,-0.0331621\n\t\t\t\t,-0.989153\n\t\t\t\t,-0.458104\n\t\t\t\t,-0.112489\n\t\t\t\t,-0.881752\n\t\t\t\t,0.0160933\n\t\t\t\t,-0.375042\n\t\t\t\t,0.926868\n\t\t\t\t,2.30261e-009\n\t\t\t\t,0\n\t\t\t\t,1\n\t\t\t\t,-0.0268145\n\t\t\t\t,-0.0136679\n\t\t\t\t,0.999547\n\t\t\t\t,-4.14468e-009\n\t\t\t\t,-0.382684\n\t\t\t\t,0.92388\n\t\t\t\t,-0.0160934\n\t\t\t\t,-0.375042\n\t\t\t\t,0.926868\n\t\t\t\t,0.0268146\n\t\t\t\t,-0.013668\n\t\t\t\t,0.999547\n\t\t\t\t,2.30261e-009\n\t\t\t\t,0\n\t\t\t\t,1\n\t\t\t\t,-4.14468e-009\n\t\t\t\t,-0.382684\n\t\t\t\t,0.92388\n\t\t\t\t,-2.21733e-009\n\t\t\t\t,-0.707107\n\t\t\t\t,0.707107\n\t\t\t\t,-4.14468e-009\n\t\t\t\t,-0.382684\n\t\t\t\t,0.92388\n\t\t\t\t,0.0160933\n\t\t\t\t,-0.375042\n\t\t\t\t,0.926868\n\t\t\t\t,0.0268145\n\t\t\t\t,-0.697122\n\t\t\t\t,0.716451\n\t\t\t\t,-2.21733e-009\n\t\t\t\t,-0.707107\n\t\t\t\t,0.707107\n\t\t\t\t,-0.0160934\n\t\t\t\t,-0.375042\n\t\t\t\t,0.926868\n\t\t\t\t,-4.14468e-009\n\t\t\t\t,-0.382684\n\t\t\t\t,0.92388\n\t\t\t\t,-0.0268146\n\t\t\t\t,-0.697122\n\t\t\t\t,0.716451\n\t\t\t\t,0.0160933\n\t\t\t\t,-0.92059\n\t\t\t\t,0.3902\n\t\t\t\t,-2.21733e-009\n\t\t\t\t,-0.707107\n\t\t\t\t,0.707107\n\t\t\t\t,0.0268145\n\t\t\t\t,-0.697122\n\t\t\t\t,0.716451\n\t\t\t\t,-3.99117e-009\n\t\t\t\t,-0.92388\n\t\t\t\t,0.382684\n\t\t\t\t,-0.0160933\n\t\t\t\t,-0.92059\n\t\t\t\t,0.3902\n\t\t\t\t,-0.0268146\n\t\t\t\t,-0.697122\n\t\t\t\t,0.716451\n\t\t\t\t,-2.21733e-009\n\t\t\t\t,-0.707107\n\t\t\t\t,0.707107\n\t\t\t\t,-3.99117e-009\n\t\t\t\t,-0.92388\n\t\t\t\t,0.382684\n\t\t\t\t,-2.30261e-009\n\t\t\t\t,-1\n\t\t\t\t,0\n\t\t\t\t,-3.99117e-009\n\t\t\t\t,-0.92388\n\t\t\t\t,0.382684\n\t\t\t\t,0.0160933\n\t\t\t\t,-0.92059\n\t\t\t\t,0.3902\n\t\t\t\t,0.0268145\n\t\t\t\t,-0.999547\n\t\t\t\t,0.0136679\n\t\t\t\t,-2.30261e-009\n\t\t\t\t,-1\n\t\t\t\t,0\n\t\t\t\t,-0.0160933\n\t\t\t\t,-0.92059\n\t\t\t\t,0.3902\n\t\t\t\t,-3.99117e-009\n\t\t\t\t,-0.92388\n\t\t\t\t,0.382684\n\t\t\t\t,-0.0268146\n\t\t\t\t,-0.999547\n\t\t\t\t,0.013668\n\t\t\t\t,0.0160933\n\t\t\t\t,-0.926868\n\t\t\t\t,-0.375043\n\t\t\t\t,-2.30261e-009\n\t\t\t\t,-1\n\t\t\t\t,0\n\t\t\t\t,0.0268145\n\t\t\t\t,-0.999547\n\t\t\t\t,0.0136679\n\t\t\t\t,-3.99117e-009\n\t\t\t\t,-0.923879\n\t\t\t\t,-0.382684\n\t\t\t\t,-0.0160934\n\t\t\t\t,-0.926868\n\t\t\t\t,-0.375043\n\t\t\t\t,-0.0268146\n\t\t\t\t,-0.999547\n\t\t\t\t,0.013668\n\t\t\t\t,-2.30261e-009\n\t\t\t\t,-1\n\t\t\t\t,0\n\t\t\t\t,-3.99117e-009\n\t\t\t\t,-0.923879\n\t\t\t\t,-0.382684\n\t\t\t\t,-2.25996e-009\n\t\t\t\t,-0.707107\n\t\t\t\t,-0.707107\n\t\t\t\t,-3.99117e-009\n\t\t\t\t,-0.923879\n\t\t\t\t,-0.382684\n\t\t\t\t,0.0160933\n\t\t\t\t,-0.926868\n\t\t\t\t,-0.375043\n\t\t\t\t,0.0268144\n\t\t\t\t,-0.716451\n\t\t\t\t,-0.697122\n\t\t\t\t,-2.25996e-009\n\t\t\t\t,-0.707107\n\t\t\t\t,-0.707107\n\t\t\t\t,-0.0160934\n\t\t\t\t,-0.926868\n\t\t\t\t,-0.375043\n\t\t\t\t,-3.99117e-009\n\t\t\t\t,-0.923879\n\t\t\t\t,-0.382684\n\t\t\t\t,-0.0268145\n\t\t\t\t,-0.716451\n\t\t\t\t,-0.697122\n\t\t\t\t,-0.263324\n\t\t\t\t,-0.241582\n\t\t\t\t,-0.933969\n\t\t\t\t,-2.25996e-009\n\t\t\t\t,-0.707107\n\t\t\t\t,-0.707107\n\t\t\t\t,0.0268144\n\t\t\t\t,-0.716451\n\t\t\t\t,-0.697122\n\t\t\t\t,-4.14469e-009\n\t\t\t\t,-0.382684\n\t\t\t\t,-0.92388\n\t\t\t\t,-0.0160934\n\t\t\t\t,-0.3902\n\t\t\t\t,-0.92059\n\t\t\t\t,-0.0268145\n\t\t\t\t,-0.716451\n\t\t\t\t,-0.697122\n\t\t\t\t,-2.25996e-009\n\t\t\t\t,-0.707107\n\t\t\t\t,-0.707107\n\t\t\t\t,-4.14469e-009\n\t\t\t\t,-0.382684\n\t\t\t\t,-0.92388\n\t\t\t\t,-2.38788e-009\n\t\t\t\t,0\n\t\t\t\t,-1\n\t\t\t\t,-4.14469e-009\n\t\t\t\t,-0.382684\n\t\t\t\t,-0.92388\n\t\t\t\t,-0.263324\n\t\t\t\t,-0.241582\n\t\t\t\t,-0.933969\n\t\t\t\t,-0.0330473\n\t\t\t\t,0.0168449\n\t\t\t\t,-0.999312\n\t\t\t\t,-2.38788e-009\n\t\t\t\t,0\n\t\t\t\t,-1\n\t\t\t\t,-0.0160934\n\t\t\t\t,-0.3902\n\t\t\t\t,-0.92059\n\t\t\t\t,-4.14469e-009\n\t\t\t\t,-0.382684\n\t\t\t\t,-0.92388\n\t\t\t\t,-0.0268145\n\t\t\t\t,-0.0136679\n\t\t\t\t,-0.999547\n\t\t\t\t,0.236441\n\t\t\t\t,0.257617\n\t\t\t\t,-0.936872\n\t\t\t\t,-2.38788e-009\n\t\t\t\t,0\n\t\t\t\t,-1\n\t\t\t\t,-0.0330473\n\t\t\t\t,0.0168449\n\t\t\t\t,-0.999312\n\t\t\t\t,-4.14469e-009\n\t\t\t\t,0.382684\n\t\t\t\t,-0.92388\n\t\t\t\t,-0.0160934\n\t\t\t\t,0.375042\n\t\t\t\t,-0.926868\n\t\t\t\t,-0.0268145\n\t\t\t\t,-0.0136679\n\t\t\t\t,-0.999547\n\t\t\t\t,-2.38788e-009\n\t\t\t\t,0\n\t\t\t\t,-1\n\t\t\t\t,-4.14469e-009\n\t\t\t\t,0.382684\n\t\t\t\t,-0.92388\n\t\t\t\t,-2.25996e-009\n\t\t\t\t,0.707107\n\t\t\t\t,-0.707107\n\t\t\t\t,-4.14469e-009\n\t\t\t\t,0.382684\n\t\t\t\t,-0.92388\n\t\t\t\t,0.236441\n\t\t\t\t,0.257617\n\t\t\t\t,-0.936872\n\t\t\t\t,0.0268144\n\t\t\t\t,0.697122\n\t\t\t\t,-0.716451\n\t\t\t\t,-2.25996e-009\n\t\t\t\t,0.707107\n\t\t\t\t,-0.707107\n\t\t\t\t,-0.0160934\n\t\t\t\t,0.375042\n\t\t\t\t,-0.926868\n\t\t\t\t,-4.14469e-009\n\t\t\t\t,0.382684\n\t\t\t\t,-0.92388\n\t\t\t\t,-0.0268145\n\t\t\t\t,0.697122\n\t\t\t\t,-0.716451\n\t\t\t\t,0.0160933\n\t\t\t\t,0.92059\n\t\t\t\t,-0.3902\n\t\t\t\t,-2.25996e-009\n\t\t\t\t,0.707107\n\t\t\t\t,-0.707107\n\t\t\t\t,0.0268144\n\t\t\t\t,0.697122\n\t\t\t\t,-0.716451\n\t\t\t\t,-3.99118e-009\n\t\t\t\t,0.923879\n\t\t\t\t,-0.382684\n\t\t\t\t,-0.0160934\n\t\t\t\t,0.920589\n\t\t\t\t,-0.3902\n\t\t\t\t,-0.0268145\n\t\t\t\t,0.697122\n\t\t\t\t,-0.716451\n\t\t\t\t,-2.25996e-009\n\t\t\t\t,0.707107\n\t\t\t\t,-0.707107\n\t\t\t\t,-3.99118e-009\n\t\t\t\t,0.923879\n\t\t\t\t,-0.382684\n\t\t\t\t,-2.30261e-009\n\t\t\t\t,1\n\t\t\t\t,0\n\t\t\t\t,-3.99118e-009\n\t\t\t\t,0.923879\n\t\t\t\t,-0.382684\n\t\t\t\t,0.0160933\n\t\t\t\t,0.92059\n\t\t\t\t,-0.3902\n\t\t\t\t,0.0268145\n\t\t\t\t,0.999547\n\t\t\t\t,-0.0136679\n\t\t\t\t,-2.30261e-009\n\t\t\t\t,1\n\t\t\t\t,0\n\t\t\t\t,-0.0160934\n\t\t\t\t,0.920589\n\t\t\t\t,-0.3902\n\t\t\t\t,-3.99118e-009\n\t\t\t\t,0.923879\n\t\t\t\t,-0.382684\n\t\t\t\t,-0.0268146\n\t\t\t\t,0.999547\n\t\t\t\t,-0.013668\n\t\t\t\t,0.0160933\n\t\t\t\t,0.926868\n\t\t\t\t,0.375042\n\t\t\t\t,-2.30261e-009\n\t\t\t\t,1\n\t\t\t\t,0\n\t\t\t\t,0.0268145\n\t\t\t\t,0.999547\n\t\t\t\t,-0.0136679\n\t\t\t\t,-3.99117e-009\n\t\t\t\t,0.92388\n\t\t\t\t,0.382684\n\t\t\t\t,-0.0160933\n\t\t\t\t,0.926868\n\t\t\t\t,0.375042\n\t\t\t\t,-0.0268146\n\t\t\t\t,0.999547\n\t\t\t\t,-0.013668\n\t\t\t\t,-2.30261e-009\n\t\t\t\t,1\n\t\t\t\t,0\n\t\t\t\t,-3.99117e-009\n\t\t\t\t,0.92388\n\t\t\t\t,0.382684\n\t\t\t\t,-2.21732e-009\n\t\t\t\t,0.707107\n\t\t\t\t,0.707107\n\t\t\t\t,-3.99117e-009\n\t\t\t\t,0.92388\n\t\t\t\t,0.382684\n\t\t\t\t,0.0160933\n\t\t\t\t,0.926868\n\t\t\t\t,0.375042\n\t\t\t\t,0.0268145\n\t\t\t\t,0.716451\n\t\t\t\t,0.697122\n\t\t\t\t,-2.21732e-009\n\t\t\t\t,0.707107\n\t\t\t\t,0.707107\n\t\t\t\t,-0.0160933\n\t\t\t\t,0.926868\n\t\t\t\t,0.375042\n\t\t\t\t,-3.99117e-009\n\t\t\t\t,0.92388\n\t\t\t\t,0.382684\n\t\t\t\t,-0.0268145\n\t\t\t\t,0.716451\n\t\t\t\t,0.697122\n\t\t\t\t,0.0160933\n\t\t\t\t,0.3902\n\t\t\t\t,0.92059\n\t\t\t\t,-2.21732e-009\n\t\t\t\t,0.707107\n\t\t\t\t,0.707107\n\t\t\t\t,0.0268145\n\t\t\t\t,0.716451\n\t\t\t\t,0.697122\n\t\t\t\t,-4.14468e-009\n\t\t\t\t,0.382684\n\t\t\t\t,0.92388\n\t\t\t\t,-0.0160933\n\t\t\t\t,0.3902\n\t\t\t\t,0.92059\n\t\t\t\t,-0.0268145\n\t\t\t\t,0.716451\n\t\t\t\t,0.697122\n\t\t\t\t,-2.21732e-009\n\t\t\t\t,0.707107\n\t\t\t\t,0.707107\n\t\t\t\t,-4.14468e-009\n\t\t\t\t,0.382684\n\t\t\t\t,0.92388\n\t\t\t\t,2.30261e-009\n\t\t\t\t,0\n\t\t\t\t,1\n\t\t\t\t,-4.14468e-009\n\t\t\t\t,0.382684\n\t\t\t\t,0.92388\n\t\t\t\t,0.0160933\n\t\t\t\t,0.3902\n\t\t\t\t,0.92059\n\t\t\t\t,-0.0268145\n\t\t\t\t,-0.0136679\n\t\t\t\t,0.999547\n\t\t\t\t,2.30261e-009\n\t\t\t\t,0\n\t\t\t\t,1\n\t\t\t\t,-0.0160933\n\t\t\t\t,0.3902\n\t\t\t\t,0.92059\n\t\t\t\t,-4.14468e-009\n\t\t\t\t,0.382684\n\t\t\t\t,0.92388\n\t\t\t\t,0.0268146\n\t\t\t\t,-0.013668\n\t\t\t\t,0.999547\n\t\t\t\t,0\n\t\t\t\t,2.77061e-008\n\t\t\t\t,-1\n\t\t\t\t,0.258808\n\t\t\t\t,0.00523808\n\t\t\t\t,-0.965914\n\t\t\t\t,0.040663\n\t\t\t\t,-0.000383602\n\t\t\t\t,-0.999173\n\t\t\t\t,0.159762\n\t\t\t\t,0.00365147\n\t\t\t\t,-0.987149\n\t\t\t\t,0\n\t\t\t\t,-5.1428e-008\n\t\t\t\t,-1\n\t\t\t\t,2.18928e-007\n\t\t\t\t,-9.1843e-008\n\t\t\t\t,-1\n\t\t\t\t,-0.414342\n\t\t\t\t,0.143659\n\t\t\t\t,-0.898712\n\t\t\t\t,-0.0552983\n\t\t\t\t,-0.0281864\n\t\t\t\t,-0.998072\n\t\t\t\t,-0.0342898\n\t\t\t\t,-0.00258663\n\t\t\t\t,-0.999409\n\t\t\t\t,0.0602478\n\t\t\t\t,0.00976604\n\t\t\t\t,-0.998136\n\t\t\t\t,0.41434\n\t\t\t\t,0.143659\n\t\t\t\t,-0.898712\n\t\t\t\t,0.055298\n\t\t\t\t,-0.0281863\n\t\t\t\t,-0.998072\n\t\t\t\t,0.411744\n\t\t\t\t,0.0185513\n\t\t\t\t,-0.911111\n\t\t\t\t,0.388404\n\t\t\t\t,0.016836\n\t\t\t\t,-0.921335\n\t\t\t\t,-0.106503\n\t\t\t\t,0.00245148\n\t\t\t\t,-0.994309\n\t\t\t\t,-0.709306\n\t\t\t\t,0.17223\n\t\t\t\t,-0.683536\n\t\t\t\t,0.709305\n\t\t\t\t,0.172231\n\t\t\t\t,-0.683537\n\t\t\t\t,0.498671\n\t\t\t\t,0.0170538\n\t\t\t\t,-0.866624\n\t\t\t\t,0.365282\n\t\t\t\t,0.010367\n\t\t\t\t,-0.930839\n\t\t\t\t,-0.852957\n\t\t\t\t,0.100491\n\t\t\t\t,-0.512216\n\t\t\t\t,0.226287\n\t\t\t\t,0.058902\n\t\t\t\t,-0.972278\n\t\t\t\t,0.852957\n\t\t\t\t,0.100491\n\t\t\t\t,-0.512217\n\t\t\t\t,0.520791\n\t\t\t\t,-0.00404872\n\t\t\t\t,-0.853675\n\t\t\t\t,0.519066\n\t\t\t\t,1.4181e-007\n\t\t\t\t,-0.854734\n\t\t\t\t,-0.116767\n\t\t\t\t,-0.00323026\n\t\t\t\t,-0.993154\n\t\t\t\t,-0.890936\n\t\t\t\t,0\n\t\t\t\t,-0.454128\n\t\t\t\t,0.890936\n\t\t\t\t,0\n\t\t\t\t,-0.454129\n\t\t\t\t,0.476485\n\t\t\t\t,-0.0201484\n\t\t\t\t,-0.878952\n\t\t\t\t,0.365282\n\t\t\t\t,-0.010367\n\t\t\t\t,-0.930839\n\t\t\t\t,-0.854508\n\t\t\t\t,-0.0947999\n\t\t\t\t,-0.510714\n\t\t\t\t,0.266827\n\t\t\t\t,-0.0325038\n\t\t\t\t,-0.963196\n\t\t\t\t,0.854507\n\t\t\t\t,-0.0948003\n\t\t\t\t,-0.510715\n\t\t\t\t,0.368075\n\t\t\t\t,-0.0141367\n\t\t\t\t,-0.929689\n\t\t\t\t,0.388405\n\t\t\t\t,-0.0168356\n\t\t\t\t,-0.921335\n\t\t\t\t,-0.0592952\n\t\t\t\t,0.00217881\n\t\t\t\t,-0.998238\n\t\t\t\t,-0.731654\n\t\t\t\t,-0.139776\n\t\t\t\t,-0.667191\n\t\t\t\t,0.731653\n\t\t\t\t,-0.139777\n\t\t\t\t,-0.667193\n\t\t\t\t,0.191516\n\t\t\t\t,-0.00173149\n\t\t\t\t,-0.981488\n\t\t\t\t,0.159762\n\t\t\t\t,-0.00365033\n\t\t\t\t,-0.987149\n\t\t\t\t,-0.263324\n\t\t\t\t,-0.241582\n\t\t\t\t,-0.933969\n\t\t\t\t,0.143103\n\t\t\t\t,-0.0331642\n\t\t\t\t,-0.989152\n\t\t\t\t,0.458106\n\t\t\t\t,-0.112487\n\t\t\t\t,-0.881751\n\t\t\t\t,-0.0406642\n\t\t\t\t,-0.000384472\n\t\t\t\t,-0.999173\n\t\t\t\t,2.69121e-007\n\t\t\t\t,1.82618e-007\n\t\t\t\t,-1\n\t\t\t\t,0.0335702\n\t\t\t\t,0.00349361\n\t\t\t\t,-0.99943\n\t\t\t\t,-0.0330475\n\t\t\t\t,0.0168447\n\t\t\t\t,-0.999312\n\t\t\t\t,0.0552993\n\t\t\t\t,0.028187\n\t\t\t\t,-0.998072\n\t\t\t\t,-0.258811\n\t\t\t\t,0.00523936\n\t\t\t\t,-0.965914\n\t\t\t\t,-0.159762\n\t\t\t\t,0.00364993\n\t\t\t\t,-0.987149\n\t\t\t\t,0.236441\n\t\t\t\t,0.257616\n\t\t\t\t,-0.936872\n\t\t\t\t,-0.060244\n\t\t\t\t,0.00976536\n\t\t\t\t,-0.998136\n\t\t\t\t,-0.414343\n\t\t\t\t,0.143657\n\t\t\t\t,-0.898712\n\t\t\t\t,-0.411752\n\t\t\t\t,0.0185537\n\t\t\t\t,-0.911107\n\t\t\t\t,-0.388404\n\t\t\t\t,0.0168356\n\t\t\t\t,-0.921335\n\t\t\t\t,0.106499\n\t\t\t\t,0.00245154\n\t\t\t\t,-0.99431\n\t\t\t\t,0.709307\n\t\t\t\t,0.17223\n\t\t\t\t,-0.683536\n\t\t\t\t,-0.709305\n\t\t\t\t,0.17223\n\t\t\t\t,-0.683537\n\t\t\t\t,-0.498675\n\t\t\t\t,0.017055\n\t\t\t\t,-0.866621\n\t\t\t\t,-0.365281\n\t\t\t\t,0.0103668\n\t\t\t\t,-0.93084\n\t\t\t\t,0.852957\n\t\t\t\t,0.10049\n\t\t\t\t,-0.512217\n\t\t\t\t,-0.226296\n\t\t\t\t,0.0589056\n\t\t\t\t,-0.972276\n\t\t\t\t,-0.852956\n\t\t\t\t,0.100491\n\t\t\t\t,-0.512218\n\t\t\t\t,-0.520792\n\t\t\t\t,-0.00404834\n\t\t\t\t,-0.853674\n\t\t\t\t,-0.519064\n\t\t\t\t,-1.53965e-007\n\t\t\t\t,-0.854735\n\t\t\t\t,0.116762\n\t\t\t\t,-0.00322988\n\t\t\t\t,-0.993155\n\t\t\t\t,0.890936\n\t\t\t\t,0\n\t\t\t\t,-0.454129\n\t\t\t\t,-0.890935\n\t\t\t\t,0\n\t\t\t\t,-0.45413\n\t\t\t\t,-0.476479\n\t\t\t\t,-0.020147\n\t\t\t\t,-0.878955\n\t\t\t\t,-0.365281\n\t\t\t\t,-0.010367\n\t\t\t\t,-0.93084\n\t\t\t\t,0.854507\n\t\t\t\t,-0.0948012\n\t\t\t\t,-0.510715\n\t\t\t\t,-0.266826\n\t\t\t\t,-0.0325031\n\t\t\t\t,-0.963196\n\t\t\t\t,-0.854506\n\t\t\t\t,-0.0948015\n\t\t\t\t,-0.510717\n\t\t\t\t,-0.368066\n\t\t\t\t,-0.0141349\n\t\t\t\t,-0.929692\n\t\t\t\t,-0.388404\n\t\t\t\t,-0.016836\n\t\t\t\t,-0.921335\n\t\t\t\t,0.0592997\n\t\t\t\t,0.00217922\n\t\t\t\t,-0.998238\n\t\t\t\t,0.731653\n\t\t\t\t,-0.139777\n\t\t\t\t,-0.667192\n\t\t\t\t,-0.731652\n\t\t\t\t,-0.139778\n\t\t\t\t,-0.667194\n\t\t\t\t,-0.191519\n\t\t\t\t,-0.00172975\n\t\t\t\t,-0.981487\n\t\t\t\t,-0.159761\n\t\t\t\t,-0.00365147\n\t\t\t\t,-0.987149\n\t\t\t\t,0.458105\n\t\t\t\t,-0.112489\n\t\t\t\t,-0.881752\n\t\t\t\t,-0.143095\n\t\t\t\t,-0.033162\n\t\t\t\t,-0.989153\n\t\t\t\t,-0.458104\n\t\t\t\t,-0.112489\n\t\t\t\t,-0.881752\n\t\t\t\t,0.0160933\n\t\t\t\t,-0.375042\n\t\t\t\t,0.926868\n\t\t\t\t,2.30261e-009\n\t\t\t\t,-1.46002e-007\n\t\t\t\t,1\n\t\t\t\t,-0.0268145\n\t\t\t\t,-0.0136682\n\t\t\t\t,0.999547\n\t\t\t\t,-4.14468e-009\n\t\t\t\t,-0.382684\n\t\t\t\t,0.923879\n\t\t\t\t,-0.0160933\n\t\t\t\t,-0.375042\n\t\t\t\t,0.926868\n\t\t\t\t,0.0268146\n\t\t\t\t,-0.0136683\n\t\t\t\t,0.999547\n\t\t\t\t,2.30261e-009\n\t\t\t\t,-1.46002e-007\n\t\t\t\t,1\n\t\t\t\t,-4.14468e-009\n\t\t\t\t,-0.382684\n\t\t\t\t,0.923879\n\t\t\t\t,-2.3026e-009\n\t\t\t\t,-0.707107\n\t\t\t\t,0.707107\n\t\t\t\t,-4.14468e-009\n\t\t\t\t,-0.382684\n\t\t\t\t,0.923879\n\t\t\t\t,0.0160933\n\t\t\t\t,-0.375042\n\t\t\t\t,0.926868\n\t\t\t\t,0.0268147\n\t\t\t\t,-0.697122\n\t\t\t\t,0.716451\n\t\t\t\t,-2.3026e-009\n\t\t\t\t,-0.707107\n\t\t\t\t,0.707107\n\t\t\t\t,-0.0160933\n\t\t\t\t,-0.375042\n\t\t\t\t,0.926868\n\t\t\t\t,-4.14468e-009\n\t\t\t\t,-0.382684\n\t\t\t\t,0.923879\n\t\t\t\t,-0.0268147\n\t\t\t\t,-0.697122\n\t\t\t\t,0.716451\n\t\t\t\t,0.0160932\n\t\t\t\t,-0.92059\n\t\t\t\t,0.390199\n\t\t\t\t,-2.3026e-009\n\t\t\t\t,-0.707107\n\t\t\t\t,0.707107\n\t\t\t\t,0.0268147\n\t\t\t\t,-0.697122\n\t\t\t\t,0.716451\n\t\t\t\t,-4.14469e-009\n\t\t\t\t,-0.923879\n\t\t\t\t,0.382683\n\t\t\t\t,-0.0160932\n\t\t\t\t,-0.92059\n\t\t\t\t,0.390199\n\t\t\t\t,-0.0268147\n\t\t\t\t,-0.697122\n\t\t\t\t,0.716451\n\t\t\t\t,-2.3026e-009\n\t\t\t\t,-0.707107\n\t\t\t\t,0.707107\n\t\t\t\t,-4.14469e-009\n\t\t\t\t,-0.923879\n\t\t\t\t,0.382683\n\t\t\t\t,-2.3026e-009\n\t\t\t\t,-1\n\t\t\t\t,0\n\t\t\t\t,-4.14469e-009\n\t\t\t\t,-0.923879\n\t\t\t\t,0.382683\n\t\t\t\t,0.0160932\n\t\t\t\t,-0.92059\n\t\t\t\t,0.390199\n\t\t\t\t,0.0268145\n\t\t\t\t,-0.999547\n\t\t\t\t,0.0136679\n\t\t\t\t,-2.3026e-009\n\t\t\t\t,-1\n\t\t\t\t,0\n\t\t\t\t,-0.0160932\n\t\t\t\t,-0.92059\n\t\t\t\t,0.390199\n\t\t\t\t,-4.14469e-009\n\t\t\t\t,-0.923879\n\t\t\t\t,0.382683\n\t\t\t\t,-0.0268146\n\t\t\t\t,-0.999547\n\t\t\t\t,0.013668\n\t\t\t\t,0.0160933\n\t\t\t\t,-0.926868\n\t\t\t\t,-0.375042\n\t\t\t\t,-2.3026e-009\n\t\t\t\t,-1\n\t\t\t\t,0\n\t\t\t\t,0.0268145\n\t\t\t\t,-0.999547\n\t\t\t\t,0.0136679\n\t\t\t\t,-3.99119e-009\n\t\t\t\t,-0.923879\n\t\t\t\t,-0.382684\n\t\t\t\t,-0.0160933\n\t\t\t\t,-0.926868\n\t\t\t\t,-0.375042\n\t\t\t\t,-0.0268146\n\t\t\t\t,-0.999547\n\t\t\t\t,0.013668\n\t\t\t\t,-2.3026e-009\n\t\t\t\t,-1\n\t\t\t\t,0\n\t\t\t\t,-3.99119e-009\n\t\t\t\t,-0.923879\n\t\t\t\t,-0.382684\n\t\t\t\t,-2.21731e-009\n\t\t\t\t,-0.707107\n\t\t\t\t,-0.707107\n\t\t\t\t,-3.99119e-009\n\t\t\t\t,-0.923879\n\t\t\t\t,-0.382684\n\t\t\t\t,0.0160933\n\t\t\t\t,-0.926868\n\t\t\t\t,-0.375042\n\t\t\t\t,0.0268146\n\t\t\t\t,-0.716451\n\t\t\t\t,-0.697122\n\t\t\t\t,-2.21731e-009\n\t\t\t\t,-0.707107\n\t\t\t\t,-0.707107\n\t\t\t\t,-0.0160933\n\t\t\t\t,-0.926868\n\t\t\t\t,-0.375042\n\t\t\t\t,-3.99119e-009\n\t\t\t\t,-0.923879\n\t\t\t\t,-0.382684\n\t\t\t\t,-0.0268146\n\t\t\t\t,-0.716451\n\t\t\t\t,-0.697121\n\t\t\t\t,-0.263324\n\t\t\t\t,-0.241582\n\t\t\t\t,-0.933969\n\t\t\t\t,-2.21731e-009\n\t\t\t\t,-0.707107\n\t\t\t\t,-0.707107\n\t\t\t\t,0.0268146\n\t\t\t\t,-0.716451\n\t\t\t\t,-0.697122\n\t\t\t\t,-4.1447e-009\n\t\t\t\t,-0.382684\n\t\t\t\t,-0.923879\n\t\t\t\t,-0.0160934\n\t\t\t\t,-0.3902\n\t\t\t\t,-0.92059\n\t\t\t\t,-0.0268146\n\t\t\t\t,-0.716451\n\t\t\t\t,-0.697121\n\t\t\t\t,-2.21731e-009\n\t\t\t\t,-0.707107\n\t\t\t\t,-0.707107\n\t\t\t\t,-4.1447e-009\n\t\t\t\t,-0.382684\n\t\t\t\t,-0.923879\n\t\t\t\t,-2.34524e-009\n\t\t\t\t,-1.46002e-007\n\t\t\t\t,-1\n\t\t\t\t,-4.1447e-009\n\t\t\t\t,-0.382684\n\t\t\t\t,-0.923879\n\t\t\t\t,-0.263324\n\t\t\t\t,-0.241582\n\t\t\t\t,-0.933969\n\t\t\t\t,-0.0330475\n\t\t\t\t,0.0168447\n\t\t\t\t,-0.999312\n\t\t\t\t,-2.34524e-009\n\t\t\t\t,-1.46002e-007\n\t\t\t\t,-1\n\t\t\t\t,-0.0160934\n\t\t\t\t,-0.3902\n\t\t\t\t,-0.92059\n\t\t\t\t,-4.1447e-009\n\t\t\t\t,-0.382684\n\t\t\t\t,-0.923879\n\t\t\t\t,-0.0268145\n\t\t\t\t,-0.0136682\n\t\t\t\t,-0.999547\n\t\t\t\t,0.236441\n\t\t\t\t,0.257616\n\t\t\t\t,-0.936872\n\t\t\t\t,-2.34524e-009\n\t\t\t\t,-1.46002e-007\n\t\t\t\t,-1\n\t\t\t\t,-0.0330475\n\t\t\t\t,0.0168447\n\t\t\t\t,-0.999312\n\t\t\t\t,-4.14468e-009\n\t\t\t\t,0.382683\n\t\t\t\t,-0.92388\n\t\t\t\t,-0.0160934\n\t\t\t\t,0.375042\n\t\t\t\t,-0.926868\n\t\t\t\t,-0.0268145\n\t\t\t\t,-0.0136682\n\t\t\t\t,-0.999547\n\t\t\t\t,-2.34524e-009\n\t\t\t\t,-1.46002e-007\n\t\t\t\t,-1\n\t\t\t\t,-4.14468e-009\n\t\t\t\t,0.382683\n\t\t\t\t,-0.92388\n\t\t\t\t,-2.21732e-009\n\t\t\t\t,0.707107\n\t\t\t\t,-0.707107\n\t\t\t\t,-4.14468e-009\n\t\t\t\t,0.382683\n\t\t\t\t,-0.92388\n\t\t\t\t,0.236441\n\t\t\t\t,0.257616\n\t\t\t\t,-0.936872\n\t\t\t\t,0.0268144\n\t\t\t\t,0.697122\n\t\t\t\t,-0.716451\n\t\t\t\t,-2.21732e-009\n\t\t\t\t,0.707107\n\t\t\t\t,-0.707107\n\t\t\t\t,-0.0160934\n\t\t\t\t,0.375042\n\t\t\t\t,-0.926868\n\t\t\t\t,-4.14468e-009\n\t\t\t\t,0.382683\n\t\t\t\t,-0.92388\n\t\t\t\t,-0.0268145\n\t\t\t\t,0.697122\n\t\t\t\t,-0.716451\n\t\t\t\t,0.0160934\n\t\t\t\t,0.92059\n\t\t\t\t,-0.3902\n\t\t\t\t,-2.21732e-009\n\t\t\t\t,0.707107\n\t\t\t\t,-0.707107\n\t\t\t\t,0.0268144\n\t\t\t\t,0.697122\n\t\t\t\t,-0.716451\n\t\t\t\t,-3.9912e-009\n\t\t\t\t,0.923879\n\t\t\t\t,-0.382684\n\t\t\t\t,-0.0160934\n\t\t\t\t,0.92059\n\t\t\t\t,-0.3902\n\t\t\t\t,-0.0268145\n\t\t\t\t,0.697122\n\t\t\t\t,-0.716451\n\t\t\t\t,-2.21732e-009\n\t\t\t\t,0.707107\n\t\t\t\t,-0.707107\n\t\t\t\t,-3.9912e-009\n\t\t\t\t,0.923879\n\t\t\t\t,-0.382684\n\t\t\t\t,-2.3026e-009\n\t\t\t\t,1\n\t\t\t\t,0\n\t\t\t\t,-3.9912e-009\n\t\t\t\t,0.923879\n\t\t\t\t,-0.382684\n\t\t\t\t,0.0160934\n\t\t\t\t,0.92059\n\t\t\t\t,-0.3902\n\t\t\t\t,0.0268146\n\t\t\t\t,0.999547\n\t\t\t\t,-0.0136679\n\t\t\t\t,-2.3026e-009\n\t\t\t\t,1\n\t\t\t\t,0\n\t\t\t\t,-0.0160934\n\t\t\t\t,0.92059\n\t\t\t\t,-0.3902\n\t\t\t\t,-3.9912e-009\n\t\t\t\t,0.923879\n\t\t\t\t,-0.382684\n\t\t\t\t,-0.0268146\n\t\t\t\t,0.999547\n\t\t\t\t,-0.013668\n\t\t\t\t,0.0160933\n\t\t\t\t,0.926868\n\t\t\t\t,0.375042\n\t\t\t\t,-2.3026e-009\n\t\t\t\t,1\n\t\t\t\t,0\n\t\t\t\t,0.0268146\n\t\t\t\t,0.999547\n\t\t\t\t,-0.0136679\n\t\t\t\t,-3.99119e-009\n\t\t\t\t,0.92388\n\t\t\t\t,0.382683\n\t\t\t\t,-0.0160933\n\t\t\t\t,0.926868\n\t\t\t\t,0.375042\n\t\t\t\t,-0.0268146\n\t\t\t\t,0.999547\n\t\t\t\t,-0.013668\n\t\t\t\t,-2.3026e-009\n\t\t\t\t,1\n\t\t\t\t,0\n\t\t\t\t,-3.99119e-009\n\t\t\t\t,0.92388\n\t\t\t\t,0.382683\n\t\t\t\t,-2.25996e-009\n\t\t\t\t,0.707107\n\t\t\t\t,0.707107\n\t\t\t\t,-3.99119e-009\n\t\t\t\t,0.92388\n\t\t\t\t,0.382683\n\t\t\t\t,0.0160933\n\t\t\t\t,0.926868\n\t\t\t\t,0.375042\n\t\t\t\t,0.0268145\n\t\t\t\t,0.716451\n\t\t\t\t,0.697122\n\t\t\t\t,-2.25996e-009\n\t\t\t\t,0.707107\n\t\t\t\t,0.707107\n\t\t\t\t,-0.0160933\n\t\t\t\t,0.926868\n\t\t\t\t,0.375042\n\t\t\t\t,-3.99119e-009\n\t\t\t\t,0.92388\n\t\t\t\t,0.382683\n\t\t\t\t,-0.0268145\n\t\t\t\t,0.716451\n\t\t\t\t,0.697122\n\t\t\t\t,0.0160933\n\t\t\t\t,0.3902\n\t\t\t\t,0.92059\n\t\t\t\t,-2.25996e-009\n\t\t\t\t,0.707107\n\t\t\t\t,0.707107\n\t\t\t\t,0.0268145\n\t\t\t\t,0.716451\n\t\t\t\t,0.697122\n\t\t\t\t,-4.14468e-009\n\t\t\t\t,0.382683\n\t\t\t\t,0.92388\n\t\t\t\t,-0.0160934\n\t\t\t\t,0.3902\n\t\t\t\t,0.92059\n\t\t\t\t,-0.0268145\n\t\t\t\t,0.716451\n\t\t\t\t,0.697122\n\t\t\t\t,-2.25996e-009\n\t\t\t\t,0.707107\n\t\t\t\t,0.707107\n\t\t\t\t,-4.14468e-009\n\t\t\t\t,0.382683\n\t\t\t\t,0.92388\n\t\t\t\t,2.30261e-009\n\t\t\t\t,-1.46002e-007\n\t\t\t\t,1\n\t\t\t\t,-4.14468e-009\n\t\t\t\t,0.382683\n\t\t\t\t,0.92388\n\t\t\t\t,0.0160933\n\t\t\t\t,0.3902\n\t\t\t\t,0.92059\n\t\t\t\t,-0.0268145\n\t\t\t\t,-0.0136682\n\t\t\t\t,0.999547\n\t\t\t\t,2.30261e-009\n\t\t\t\t,-1.46002e-007\n\t\t\t\t,1\n\t\t\t\t,-0.0160934\n\t\t\t\t,0.3902\n\t\t\t\t,0.92059\n\t\t\t\t,-4.14468e-009\n\t\t\t\t,0.382683\n\t\t\t\t,0.92388\n\t\t\t\t,0.0268146\n\t\t\t\t,-0.0136683\n\t\t\t\t,0.999547\n\t\t\t\t,-0.70793\n\t\t\t\t,0.594509\n\t\t\t\t,-0.381305\n\t\t\t\t,0.670362\n\t\t\t\t,0.541335\n\t\t\t\t,-0.507515\n\t\t\t\t,-0.70793\n\t\t\t\t,0.594509\n\t\t\t\t,-0.381305\n\t\t\t\t,0.670362\n\t\t\t\t,0.541335\n\t\t\t\t,-0.507514\n\t\t\t\t,0.70793\n\t\t\t\t,0.59451\n\t\t\t\t,-0.381303\n\t\t\t\t,-0.670362\n\t\t\t\t,0.541335\n\t\t\t\t,-0.507514\n\t\t\t\t,0.70793\n\t\t\t\t,0.59451\n\t\t\t\t,-0.381304\n\t\t\t\t,-0.670361\n\t\t\t\t,0.541334\n\t\t\t\t,-0.507516\n\t\t\t\t,-0.708743\n\t\t\t\t,-0.61827\n\t\t\t\t,0.339744\n\t\t\t\t,-0.708743\n\t\t\t\t,-0.61827\n\t\t\t\t,0.339744\n\t\t\t\t,-0.708743\n\t\t\t\t,0.61827\n\t\t\t\t,-0.339744\n\t\t\t\t,-0.708743\n\t\t\t\t,0.61827\n\t\t\t\t,-0.339744\n\t\t\t\t,0.708743\n\t\t\t\t,-0.673878\n\t\t\t\t,0.20874\n\t\t\t\t,0.708743\n\t\t\t\t,-0.673878\n\t\t\t\t,0.20874\n\t\t\t\t,0.708743\n\t\t\t\t,0.673878\n\t\t\t\t,-0.20874\n\t\t\t\t,0.708743\n\t\t\t\t,0.673878\n\t\t\t\t,-0.20874\n\t\t\t\t,0.0894402\n\t\t\t\t,-0.370014\n\t\t\t\t,0.924711\n\t\t\t\t,0.00942199\n\t\t\t\t,-0.930546\n\t\t\t\t,-0.366054\n\t\t\t\t,0.06001\n\t\t\t\t,-0.38199\n\t\t\t\t,0.922216\n\t\t\t\t,0.0131886\n\t\t\t\t,-0.92375\n\t\t\t\t,-0.382769\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,0.0762166\n\t\t\t\t,-0.914406\n\t\t\t\t,-0.397558\n\t\t\t\t,-0.28081\n\t\t\t\t,-0.435437\n\t\t\t\t,0.855301\n\t\t\t\t,-0.0401044\n\t\t\t\t,-0.925064\n\t\t\t\t,-0.377688\n\t\t\t\t,0.312326\n\t\t\t\t,-0.415229\n\t\t\t\t,0.854422\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,0.0855202\n\t\t\t\t,0.355722\n\t\t\t\t,-0.930671\n\t\t\t\t,0.0612322\n\t\t\t\t,0.375123\n\t\t\t\t,-0.92495\n\t\t\t\t,0.267143\n\t\t\t\t,0.235642\n\t\t\t\t,-0.934402\n\t\t\t\t,-0.274\n\t\t\t\t,0.271408\n\t\t\t\t,-0.922638\n\t\t\t\t,0.133547\n\t\t\t\t,-0.666305\n\t\t\t\t,0.733623\n\t\t\t\t,-0.548622\n\t\t\t\t,-0.827957\n\t\t\t\t,0.116196\n\t\t\t\t,0.457961\n\t\t\t\t,0.46494\n\t\t\t\t,-0.757695\n\t\t\t\t,0.233189\n\t\t\t\t,-0.54171\n\t\t\t\t,-0.807572\n\t\t\t\t,-0.274001\n\t\t\t\t,0.271408\n\t\t\t\t,-0.922638\n\t\t\t\t,-0.494732\n\t\t\t\t,-0.161046\n\t\t\t\t,-0.853993\n\t\t\t\t,-0.231812\n\t\t\t\t,-0.184249\n\t\t\t\t,-0.955152\n\t\t\t\t,0.193617\n\t\t\t\t,-0.272868\n\t\t\t\t,-0.942367\n\t\t\t\t,-0.188679\n\t\t\t\t,-0.974436\n\t\t\t\t,-0.121963\n\t\t\t\t,-0.576313\n\t\t\t\t,-0.61934\n\t\t\t\t,0.533181\n\t\t\t\t,0.70793\n\t\t\t\t,0.594509\n\t\t\t\t,-0.381305\n\t\t\t\t,-0.670362\n\t\t\t\t,0.541335\n\t\t\t\t,-0.507515\n\t\t\t\t,0.707931\n\t\t\t\t,0.594509\n\t\t\t\t,-0.381305\n\t\t\t\t,-0.670362\n\t\t\t\t,0.541336\n\t\t\t\t,-0.507514\n\t\t\t\t,-0.70793\n\t\t\t\t,0.59451\n\t\t\t\t,-0.381303\n\t\t\t\t,0.670362\n\t\t\t\t,0.541336\n\t\t\t\t,-0.507514\n\t\t\t\t,-0.707931\n\t\t\t\t,0.594511\n\t\t\t\t,-0.381302\n\t\t\t\t,0.670362\n\t\t\t\t,0.541334\n\t\t\t\t,-0.507516\n\t\t\t\t,-0.708743\n\t\t\t\t,-0.61827\n\t\t\t\t,0.339744\n\t\t\t\t,-0.708743\n\t\t\t\t,0.61827\n\t\t\t\t,-0.339744\n\t\t\t\t,-0.708743\n\t\t\t\t,0.61827\n\t\t\t\t,-0.339744\n\t\t\t\t,-0.708743\n\t\t\t\t,-0.61827\n\t\t\t\t,0.339744\n\t\t\t\t,0.708743\n\t\t\t\t,-0.673878\n\t\t\t\t,0.20874\n\t\t\t\t,0.708743\n\t\t\t\t,0.673878\n\t\t\t\t,-0.20874\n\t\t\t\t,0.708743\n\t\t\t\t,0.673878\n\t\t\t\t,-0.20874\n\t\t\t\t,0.708743\n\t\t\t\t,-0.673878\n\t\t\t\t,0.20874\n\t\t\t\t,-0.06001\n\t\t\t\t,-0.38199\n\t\t\t\t,0.922216\n\t\t\t\t,-0.00942199\n\t\t\t\t,-0.930546\n\t\t\t\t,-0.366054\n\t\t\t\t,-0.0894402\n\t\t\t\t,-0.370014\n\t\t\t\t,0.924711\n\t\t\t\t,-0.0131886\n\t\t\t\t,-0.92375\n\t\t\t\t,-0.382769\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,0.0401044\n\t\t\t\t,-0.925064\n\t\t\t\t,-0.377688\n\t\t\t\t,0.28081\n\t\t\t\t,-0.435437\n\t\t\t\t,0.855301\n\t\t\t\t,-0.0762166\n\t\t\t\t,-0.914406\n\t\t\t\t,-0.397558\n\t\t\t\t,-0.312326\n\t\t\t\t,-0.415229\n\t\t\t\t,0.854422\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,-0.0855202\n\t\t\t\t,0.355722\n\t\t\t\t,-0.930671\n\t\t\t\t,-0.0612322\n\t\t\t\t,0.375123\n\t\t\t\t,-0.92495\n\t\t\t\t,-0.267143\n\t\t\t\t,0.235642\n\t\t\t\t,-0.934402\n\t\t\t\t,0.274\n\t\t\t\t,0.271408\n\t\t\t\t,-0.922638\n\t\t\t\t,-0.133547\n\t\t\t\t,-0.666305\n\t\t\t\t,0.733623\n\t\t\t\t,0.548622\n\t\t\t\t,-0.827957\n\t\t\t\t,0.116196\n\t\t\t\t,0.186975\n\t\t\t\t,-0.485107\n\t\t\t\t,-0.854232\n\t\t\t\t,-0.457961\n\t\t\t\t,0.46494\n\t\t\t\t,-0.757695\n\t\t\t\t,0.274001\n\t\t\t\t,0.271408\n\t\t\t\t,-0.922638\n\t\t\t\t,0.248186\n\t\t\t\t,-0.814238\n\t\t\t\t,0.524805\n\t\t\t\t,-0.487613\n\t\t\t\t,-0.844835\n\t\t\t\t,0.220199\n\t\t\t\t,0.25682\n\t\t\t\t,-0.94664\n\t\t\t\t,0.194721\n\t\t\t\t,-0.486292\n\t\t\t\t,-0.74354\n\t\t\t\t,0.458987\n\t\t\t\t,0.231812\n\t\t\t\t,-0.184249\n\t\t\t\t,-0.955152\n\t\t\t\t,-0.520595\n\t\t\t\t,-0.523929\n\t\t\t\t,-0.674151\n\t\t\t\t,0.576313\n\t\t\t\t,-0.61934\n\t\t\t\t,0.533181\n\t\t\t\t,0.939238\n\t\t\t\t,0.325823\n\t\t\t\t,-0.108034\n\t\t\t\t,0.813652\n\t\t\t\t,0.52565\n\t\t\t\t,-0.24832\n\t\t\t\t,0.816155\n\t\t\t\t,0.232159\n\t\t\t\t,-0.529143\n\t\t\t\t,0.239686\n\t\t\t\t,0.870578\n\t\t\t\t,-0.429703\n\t\t\t\t,0.324995\n\t\t\t\t,0.656888\n\t\t\t\t,-0.68035\n\t\t\t\t,0.291336\n\t\t\t\t,-0.0357272\n\t\t\t\t,-0.955954\n\t\t\t\t,-0.105228\n\t\t\t\t,-0.274007\n\t\t\t\t,-0.955953\n\t\t\t\t,-0.728749\n\t\t\t\t,-0.127808\n\t\t\t\t,-0.672749\n\t\t\t\t,-0.881201\n\t\t\t\t,0.19708\n\t\t\t\t,-0.429703\n\t\t\t\t,-0.728749\n\t\t\t\t,-0.127808\n\t\t\t\t,-0.672749\n\t\t\t\t,-0.872154\n\t\t\t\t,-0.433832\n\t\t\t\t,-0.226135\n\t\t\t\t,-0.535068\n\t\t\t\t,-0.696867\n\t\t\t\t,-0.477577\n\t\t\t\t,-0.744618\n\t\t\t\t,-0.64261\n\t\t\t\t,-0.180545\n\t\t\t\t,0.916967\n\t\t\t\t,0.355773\n\t\t\t\t,0.180544\n\t\t\t\t,0.939238\n\t\t\t\t,0.325823\n\t\t\t\t,-0.108034\n\t\t\t\t,0.918921\n\t\t\t\t,-0.253505\n\t\t\t\t,0.302192\n\t\t\t\t,0.866496\n\t\t\t\t,0.145278\n\t\t\t\t,-0.477577\n\t\t\t\t,0.813652\n\t\t\t\t,0.52565\n\t\t\t\t,-0.24832\n\t\t\t\t,0.690656\n\t\t\t\t,0.723009\n\t\t\t\t,-0.0159115\n\t\t\t\t,0.207575\n\t\t\t\t,0.930372\n\t\t\t\t,-0.302192\n\t\t\t\t,0.535068\n\t\t\t\t,0.696867\n\t\t\t\t,0.477577\n\t\t\t\t,0.552068\n\t\t\t\t,0.0040742\n\t\t\t\t,0.833789\n\t\t\t\t,0.628819\n\t\t\t\t,0.621184\n\t\t\t\t,0.467673\n\t\t\t\t,0.0928835\n\t\t\t\t,0.117254\n\t\t\t\t,0.988749\n\t\t\t\t,0.318286\n\t\t\t\t,0.145295\n\t\t\t\t,0.936794\n\t\t\t\t,-0.444737\n\t\t\t\t,-0.020918\n\t\t\t\t,0.895417\n\t\t\t\t,0.0633831\n\t\t\t\t,0.149633\n\t\t\t\t,0.986708\n\t\t\t\t,-0.601371\n\t\t\t\t,-0.348276\n\t\t\t\t,0.719067\n\t\t\t\t,0.31529\n\t\t\t\t,-0.0385742\n\t\t\t\t,-0.948211\n\t\t\t\t,0.94112\n\t\t\t\t,-0.0267278\n\t\t\t\t,-0.337016\n\t\t\t\t,0.94303\n\t\t\t\t,-0.115957\n\t\t\t\t,0.311847\n\t\t\t\t,0.789343\n\t\t\t\t,0.500078\n\t\t\t\t,-0.356173\n\t\t\t\t,0.789344\n\t\t\t\t,-0.602826\n\t\t\t\t,0.116346\n\t\t\t\t,0.789344\n\t\t\t\t,-0.602824\n\t\t\t\t,0.116359\n\t\t\t\t,0.789343\n\t\t\t\t,0.500087\n\t\t\t\t,-0.356162\n\t\t\t\t,0.523212\n\t\t\t\t,0.829547\n\t\t\t\t,-0.195195\n\t\t\t\t,0.523215\n\t\t\t\t,-0.633626\n\t\t\t\t,0.569881\n\t\t\t\t,0.523215\n\t\t\t\t,-0.633639\n\t\t\t\t,0.569866\n\t\t\t\t,0.523212\n\t\t\t\t,0.829538\n\t\t\t\t,-0.195231\n\t\t\t\t,0.922972\n\t\t\t\t,0.290635\n\t\t\t\t,-0.252296\n\t\t\t\t,0.922976\n\t\t\t\t,-0.378847\n\t\t\t\t,0.0677481\n\t\t\t\t,0.922976\n\t\t\t\t,-0.378845\n\t\t\t\t,0.0677604\n\t\t\t\t,0.922972\n\t\t\t\t,0.290641\n\t\t\t\t,-0.252289\n\t\t\t\t,0.782824\n\t\t\t\t,0.5031\n\t\t\t\t,0.366165\n\t\t\t\t,0.78282\n\t\t\t\t,-0.286449\n\t\t\t\t,-0.552395\n\t\t\t\t,0.78282\n\t\t\t\t,-0.286443\n\t\t\t\t,-0.552398\n\t\t\t\t,0.782824\n\t\t\t\t,0.503106\n\t\t\t\t,0.366157\n\t\t\t\t,0.70711\n\t\t\t\t,0.0665175\n\t\t\t\t,0.703968\n\t\t\t\t,0.447212\n\t\t\t\t,-0.084136\n\t\t\t\t,-0.890462\n\t\t\t\t,0.316248\n\t\t\t\t,-0.331179\n\t\t\t\t,-0.888993\n\t\t\t\t,0.102879\n\t\t\t\t,-0.0614834\n\t\t\t\t,-0.992792\n\t\t\t\t,-0.70088\n\t\t\t\t,0.0659316\n\t\t\t\t,-0.710225\n\t\t\t\t,-0.32295\n\t\t\t\t,0.328498\n\t\t\t\t,-0.887577\n\t\t\t\t,0.292458\n\t\t\t\t,-0.529652\n\t\t\t\t,-0.796202\n\t\t\t\t,-4.66623e-006\n\t\t\t\t,-1.0141e-006\n\t\t\t\t,-1\n\t\t\t\t,0.0891725\n\t\t\t\t,-0.0537749\n\t\t\t\t,-0.994563\n\t\t\t\t,0.866023\n\t\t\t\t,-1.32003e-006\n\t\t\t\t,-0.500005\n\t\t\t\t,0.918952\n\t\t\t\t,0.00858595\n\t\t\t\t,-0.394276\n\t\t\t\t,0.826318\n\t\t\t\t,-0.00839817\n\t\t\t\t,0.563141\n\t\t\t\t,0.866025\n\t\t\t\t,-3.16448e-007\n\t\t\t\t,0.5\n\t\t\t\t,-1.00254e-005\n\t\t\t\t,1.41466e-006\n\t\t\t\t,1\n\t\t\t\t,-0.0946283\n\t\t\t\t,-0.125433\n\t\t\t\t,0.987579\n\t\t\t\t,1.00257e-005\n\t\t\t\t,2.35761e-006\n\t\t\t\t,-1\n\t\t\t\t,0.129765\n\t\t\t\t,-0.0735839\n\t\t\t\t,-0.988811\n\t\t\t\t,0.905328\n\t\t\t\t,0.00460623\n\t\t\t\t,-0.424688\n\t\t\t\t,0.866028\n\t\t\t\t,1.79772e-007\n\t\t\t\t,-0.499996\n\t\t\t\t,0.866028\n\t\t\t\t,-8.84776e-007\n\t\t\t\t,0.499996\n\t\t\t\t,0.808754\n\t\t\t\t,-0.0154015\n\t\t\t\t,0.587945\n\t\t\t\t,-0.0738988\n\t\t\t\t,-0.0784591\n\t\t\t\t,0.994175\n\t\t\t\t,4.6663e-006\n\t\t\t\t,-4.6599e-007\n\t\t\t\t,1\n\t\t\t\t,0.879377\n\t\t\t\t,0.0201332\n\t\t\t\t,-0.475699\n\t\t\t\t,0.112386\n\t\t\t\t,-0.237977\n\t\t\t\t,-0.964747\n\t\t\t\t,0.894525\n\t\t\t\t,-0.00938743\n\t\t\t\t,0.446918\n\t\t\t\t,0.11686\n\t\t\t\t,-0.235055\n\t\t\t\t,0.964932\n\t\t\t\t,0.880175\n\t\t\t\t,0.0212998\n\t\t\t\t,-0.474171\n\t\t\t\t,0.12447\n\t\t\t\t,-0.246876\n\t\t\t\t,-0.96102\n\t\t\t\t,0.892955\n\t\t\t\t,-0.00968217\n\t\t\t\t,0.450042\n\t\t\t\t,0.108324\n\t\t\t\t,-0.226708\n\t\t\t\t,0.96792\n\t\t\t\t,0.918026\n\t\t\t\t,0.0495232\n\t\t\t\t,-0.393415\n\t\t\t\t,0.446873\n\t\t\t\t,-0.377399\n\t\t\t\t,-0.811095\n\t\t\t\t,0.947177\n\t\t\t\t,0.00673765\n\t\t\t\t,0.320642\n\t\t\t\t,0.396054\n\t\t\t\t,-0.338033\n\t\t\t\t,0.853742\n\t\t\t\t,0.91865\n\t\t\t\t,0.0503137\n\t\t\t\t,-0.391855\n\t\t\t\t,0.44484\n\t\t\t\t,-0.375047\n\t\t\t\t,-0.8133\n\t\t\t\t,0.948395\n\t\t\t\t,0.00690704\n\t\t\t\t,0.317015\n\t\t\t\t,0.397279\n\t\t\t\t,-0.339077\n\t\t\t\t,0.852758\n\t\t\t\t,0.975209\n\t\t\t\t,0.0548359\n\t\t\t\t,-0.214384\n\t\t\t\t,0.875951\n\t\t\t\t,-0.246669\n\t\t\t\t,-0.414565\n\t\t\t\t,0.991488\n\t\t\t\t,0.0109271\n\t\t\t\t,0.129741\n\t\t\t\t,0.808012\n\t\t\t\t,-0.236965\n\t\t\t\t,0.539411\n\t\t\t\t,0.973924\n\t\t\t\t,0.0551524\n\t\t\t\t,-0.22007\n\t\t\t\t,0.867902\n\t\t\t\t,-0.253714\n\t\t\t\t,-0.427054\n\t\t\t\t,0.991738\n\t\t\t\t,0.0109112\n\t\t\t\t,0.127815\n\t\t\t\t,0.817742\n\t\t\t\t,-0.231552\n\t\t\t\t,0.526956\n\t\t\t\t,0.997571\n\t\t\t\t,0.0377368\n\t\t\t\t,-0.0585581\n\t\t\t\t,0.985273\n\t\t\t\t,-0.0471937\n\t\t\t\t,-0.164349\n\t\t\t\t,0.999658\n\t\t\t\t,0.00994681\n\t\t\t\t,0.0241745\n\t\t\t\t,0.985249\n\t\t\t\t,-0.0473536\n\t\t\t\t,0.164447\n\t\t\t\t,0.99757\n\t\t\t\t,0.0377302\n\t\t\t\t,-0.0585698\n\t\t\t\t,0.98524\n\t\t\t\t,-0.0472436\n\t\t\t\t,-0.164531\n\t\t\t\t,0.999658\n\t\t\t\t,0.00995068\n\t\t\t\t,0.0241815\n\t\t\t\t,0.985269\n\t\t\t\t,-0.0472916\n\t\t\t\t,0.164343\n\t\t\t\t,-1.2838e-007\n\t\t\t\t,-0.755826\n\t\t\t\t,0.654772\n\t\t\t\t,-2.92895e-005\n\t\t\t\t,-0.866321\n\t\t\t\t,0.499488\n\t\t\t\t,0.0275766\n\t\t\t\t,-0.00162034\n\t\t\t\t,0.999618\n\t\t\t\t,3.21231e-006\n\t\t\t\t,0.1889\n\t\t\t\t,0.981996\n\t\t\t\t,4.69657e-009\n\t\t\t\t,-0.944928\n\t\t\t\t,-0.327279\n\t\t\t\t,-6.88603e-006\n\t\t\t\t,-0.866223\n\t\t\t\t,-0.499657\n\t\t\t\t,-1.68692e-006\n\t\t\t\t,-0.189029\n\t\t\t\t,-0.981972\n\t\t\t\t,0.0276702\n\t\t\t\t,-0.000995389\n\t\t\t\t,-0.999617\n\t\t\t\t,5.58621e-008\n\t\t\t\t,-0.755996\n\t\t\t\t,0.654576\n\t\t\t\t,-2.87907e-005\n\t\t\t\t,-0.866386\n\t\t\t\t,0.499375\n\t\t\t\t,0.0276286\n\t\t\t\t,-0.00165941\n\t\t\t\t,0.999617\n\t\t\t\t,-4.21825e-006\n\t\t\t\t,0.189029\n\t\t\t\t,0.981972\n\t\t\t\t,1.04203e-007\n\t\t\t\t,-0.944883\n\t\t\t\t,-0.327407\n\t\t\t\t,-7.25485e-006\n\t\t\t\t,-0.866137\n\t\t\t\t,-0.499806\n\t\t\t\t,1.28528e-006\n\t\t\t\t,-0.1889\n\t\t\t\t,-0.981996\n\t\t\t\t,0.0276164\n\t\t\t\t,-0.00102617\n\t\t\t\t,-0.999618\n\t\t\t\t,1.12927e-008\n\t\t\t\t,6.50157e-009\n\t\t\t\t,1\n\t\t\t\t,-1.69391e-007\n\t\t\t\t,-1.05823e-008\n\t\t\t\t,1\n\t\t\t\t,0.00361003\n\t\t\t\t,-0.00208419\n\t\t\t\t,0.999991\n\t\t\t\t,0.00360995\n\t\t\t\t,-0.0020842\n\t\t\t\t,0.999991\n\t\t\t\t,0.866026\n\t\t\t\t,0.499994\n\t\t\t\t,0.00208422\n\t\t\t\t,0.866027\n\t\t\t\t,0.499994\n\t\t\t\t,0.0020842\n\t\t\t\t,0.866027\n\t\t\t\t,-0.499994\n\t\t\t\t,-0.00208421\n\t\t\t\t,0.866026\n\t\t\t\t,-0.499994\n\t\t\t\t,-0.0020842\n\t\t\t\t,0.00360994\n\t\t\t\t,0.0020842\n\t\t\t\t,-0.999991\n\t\t\t\t,0.00361\n\t\t\t\t,0.00208421\n\t\t\t\t,-0.999991\n\t\t\t\t,-1.69391e-007\n\t\t\t\t,2.06201e-008\n\t\t\t\t,-1\n\t\t\t\t,-1.84449e-008\n\t\t\t\t,4.5788e-009\n\t\t\t\t,-1\n\t\t\t\t,1.69393e-007\n\t\t\t\t,1.48484e-008\n\t\t\t\t,1\n\t\t\t\t,1.84453e-008\n\t\t\t\t,1.7754e-008\n\t\t\t\t,1\n\t\t\t\t,0.00361065\n\t\t\t\t,-0.00208479\n\t\t\t\t,0.999991\n\t\t\t\t,0.00361096\n\t\t\t\t,-0.00208475\n\t\t\t\t,0.999991\n\t\t\t\t,0.866025\n\t\t\t\t,0.499997\n\t\t\t\t,0.00208479\n\t\t\t\t,0.866027\n\t\t\t\t,0.499993\n\t\t\t\t,0.00208469\n\t\t\t\t,0.866027\n\t\t\t\t,-0.499994\n\t\t\t\t,-0.00208469\n\t\t\t\t,0.866029\n\t\t\t\t,-0.49999\n\t\t\t\t,-0.00208476\n\t\t\t\t,0.00361079\n\t\t\t\t,0.00208471\n\t\t\t\t,-0.999991\n\t\t\t\t,0.00361103\n\t\t\t\t,0.00208475\n\t\t\t\t,-0.999991\n\t\t\t\t,1.69393e-007\n\t\t\t\t,-2.21265e-008\n\t\t\t\t,-1\n\t\t\t\t,-1.12926e-008\n\t\t\t\t,4.78852e-010\n\t\t\t\t,-1\n\t\t\t\t,0.0309835\n\t\t\t\t,-0.997088\n\t\t\t\t,-0.0696812\n\t\t\t\t,0\n\t\t\t\t,-1\n\t\t\t\t,2.7732e-008\n\t\t\t\t,-0.0108945\n\t\t\t\t,-0.739935\n\t\t\t\t,0.67259\n\t\t\t\t,0\n\t\t\t\t,-0.703159\n\t\t\t\t,0.711033\n\t\t\t\t,0\n\t\t\t\t,-2.45688e-007\n\t\t\t\t,1\n\t\t\t\t,-0.0175992\n\t\t\t\t,-0.0783506\n\t\t\t\t,0.996771\n\t\t\t\t,-0.0107913\n\t\t\t\t,0.660187\n\t\t\t\t,0.751024\n\t\t\t\t,0\n\t\t\t\t,0.703159\n\t\t\t\t,0.711033\n\t\t\t\t,0\n\t\t\t\t,1\n\t\t\t\t,2.7732e-008\n\t\t\t\t,-0.0172861\n\t\t\t\t,0.995904\n\t\t\t\t,0.0887452\n\t\t\t\t,-0.0108943\n\t\t\t\t,0.739937\n\t\t\t\t,-0.672587\n\t\t\t\t,0\n\t\t\t\t,0.703159\n\t\t\t\t,-0.711033\n\t\t\t\t,-0.0108943\n\t\t\t\t,0.739937\n\t\t\t\t,-0.672587\n\t\t\t\t,0\n\t\t\t\t,0.703159\n\t\t\t\t,-0.711033\n\t\t\t\t,0\n\t\t\t\t,-2.45688e-007\n\t\t\t\t,-1\n\t\t\t\t,-0.0175992\n\t\t\t\t,0.0783489\n\t\t\t\t,-0.996771\n\t\t\t\t,-0.0107913\n\t\t\t\t,-0.660188\n\t\t\t\t,-0.751023\n\t\t\t\t,0\n\t\t\t\t,-0.703159\n\t\t\t\t,-0.711033\n\t\t\t\t,0.02268\n\t\t\t\t,-0.999695\n\t\t\t\t,-0.00972735\n\t\t\t\t,-0.0131054\n\t\t\t\t,-0.702347\n\t\t\t\t,0.711714\n\t\t\t\t,-0.0123839\n\t\t\t\t,-0.0122822\n\t\t\t\t,0.999848\n\t\t\t\t,-0.0131945\n\t\t\t\t,0.678228\n\t\t\t\t,0.734733\n\t\t\t\t,-0.0139963\n\t\t\t\t,0.999666\n\t\t\t\t,0.0217367\n\t\t\t\t,-0.0131051\n\t\t\t\t,0.70236\n\t\t\t\t,-0.711702\n\t\t\t\t,-0.0131051\n\t\t\t\t,0.70236\n\t\t\t\t,-0.711702\n\t\t\t\t,-0.0123841\n\t\t\t\t,0.0122729\n\t\t\t\t,-0.999848\n\t\t\t\t,-0.0131942\n\t\t\t\t,-0.678228\n\t\t\t\t,-0.734733\n\t\t\t\t,-6.97415e-008\n\t\t\t\t,-0.989097\n\t\t\t\t,0.147265\n\t\t\t\t,-6.38197e-008\n\t\t\t\t,-0.582508\n\t\t\t\t,0.812825\n\t\t\t\t,1.0664e-007\n\t\t\t\t,0.127\n\t\t\t\t,0.991903\n\t\t\t\t,1.18101e-007\n\t\t\t\t,0.780639\n\t\t\t\t,0.624982\n\t\t\t\t,1.48067e-007\n\t\t\t\t,0.989099\n\t\t\t\t,-0.147255\n\t\t\t\t,1.31391e-007\n\t\t\t\t,0.582515\n\t\t\t\t,-0.81282\n\t\t\t\t,1.31391e-007\n\t\t\t\t,0.582515\n\t\t\t\t,-0.81282\n\t\t\t\t,-0.0131051\n\t\t\t\t,0.70236\n\t\t\t\t,-0.711702\n\t\t\t\t,-0.0123841\n\t\t\t\t,0.0122729\n\t\t\t\t,-0.999848\n\t\t\t\t,1.31391e-007\n\t\t\t\t,0.582515\n\t\t\t\t,-0.81282\n\t\t\t\t,4.17275e-008\n\t\t\t\t,-0.127018\n\t\t\t\t,-0.9919\n\t\t\t\t,3.31578e-010\n\t\t\t\t,-0.780625\n\t\t\t\t,-0.625\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,-0.416602\n\t\t\t\t,0.496175\n\t\t\t\t,0.761743\n\t\t\t\t,0.477287\n\t\t\t\t,-0.420094\n\t\t\t\t,0.771828\n\t\t\t\t,0.223493\n\t\t\t\t,-0.209701\n\t\t\t\t,0.951881\n\t\t\t\t,1\n\t\t\t\t,0\n\t\t\t\t,0\n\t\t\t\t,0.932779\n\t\t\t\t,0.222428\n\t\t\t\t,-0.283634\n\t\t\t\t,1\n\t\t\t\t,4.06969e-007\n\t\t\t\t,0\n\t\t\t\t,0.863405\n\t\t\t\t,0.221576\n\t\t\t\t,-0.45325\n\t\t\t\t,0.852282\n\t\t\t\t,-0.018877\n\t\t\t\t,-0.522742\n\t\t\t\t,0.388652\n\t\t\t\t,0.291897\n\t\t\t\t,-0.873925\n\t\t\t\t,0.721836\n\t\t\t\t,-0.225049\n\t\t\t\t,-0.654451\n\t\t\t\t,0.767734\n\t\t\t\t,0.249573\n\t\t\t\t,-0.590167\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,-0.279512\n\t\t\t\t,0.0974885\n\t\t\t\t,0.95518\n\t\t\t\t,0.503966\n\t\t\t\t,0.0438818\n\t\t\t\t,0.862608\n\t\t\t\t,-0.390499\n\t\t\t\t,-0.34033\n\t\t\t\t,0.855387\n\t\t\t\t,0.64015\n\t\t\t\t,0.573225\n\t\t\t\t,0.511489\n\t\t\t\t,-0.849538\n\t\t\t\t,-0.0582332\n\t\t\t\t,0.524303\n\t\t\t\t,-0.849538\n\t\t\t\t,-0.0582332\n\t\t\t\t,0.524303\n\t\t\t\t,0.64015\n\t\t\t\t,0.573225\n\t\t\t\t,0.511489\n\t\t\t\t,0.405257\n\t\t\t\t,-0.18912\n\t\t\t\t,0.894427\n\t\t\t\t,-0.640768\n\t\t\t\t,0.299025\n\t\t\t\t,0.707107\n\t\t\t\t,1\n\t\t\t\t,3.6175e-007\n\t\t\t\t,0\n\t\t\t\t,0.924215\n\t\t\t\t,-0.11535\n\t\t\t\t,0.364034\n\t\t\t\t,0.807905\n\t\t\t\t,0.256146\n\t\t\t\t,0.530734\n\t\t\t\t,0.640763\n\t\t\t\t,0.365124\n\t\t\t\t,0.675357\n\t\t\t\t,0.585718\n\t\t\t\t,0.523408\n\t\t\t\t,0.618853\n\t\t\t\t,0.504819\n\t\t\t\t,-0.482379\n\t\t\t\t,0.715869\n\t\t\t\t,1\n\t\t\t\t,0\n\t\t\t\t,0\n\t\t\t\t,0.895725\n\t\t\t\t,0.105387\n\t\t\t\t,0.431939\n\t\t\t\t,0.828167\n\t\t\t\t,-0.421689\n\t\t\t\t,-0.369211\n\t\t\t\t,0.761859\n\t\t\t\t,0.362239\n\t\t\t\t,-0.536986\n\t\t\t\t,0.933587\n\t\t\t\t,0.332198\n\t\t\t\t,-0.13439\n\t\t\t\t,0.965093\n\t\t\t\t,-0.221524\n\t\t\t\t,0.139721\n\t\t\t\t,-4.41571e-008\n\t\t\t\t,-0.000739274\n\t\t\t\t,-1\n\t\t\t\t,-0.398332\n\t\t\t\t,-0.128825\n\t\t\t\t,-0.90815\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,-0.00182102\n\t\t\t\t,-0.0031858\n\t\t\t\t,0.999993\n\t\t\t\t,-0.527237\n\t\t\t\t,0.347745\n\t\t\t\t,0.775303\n\t\t\t\t,-0.00182102\n\t\t\t\t,0.00294379\n\t\t\t\t,0.999994\n\t\t\t\t,-0.527237\n\t\t\t\t,0.347745\n\t\t\t\t,0.775303\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,-0.396257\n\t\t\t\t,-0.135158\n\t\t\t\t,-0.908137\n\t\t\t\t,-4.41571e-008\n\t\t\t\t,-0.000739283\n\t\t\t\t,-1\n\t\t\t\t,-0.743548\n\t\t\t\t,0.597787\n\t\t\t\t,-0.299647\n\t\t\t\t,-0.913246\n\t\t\t\t,-0.183934\n\t\t\t\t,-0.363524\n\t\t\t\t,-0.912307\n\t\t\t\t,-0.181634\n\t\t\t\t,0.367023\n\t\t\t\t,-0.74672\n\t\t\t\t,0.596033\n\t\t\t\t,0.295219\n\t\t\t\t,0.00346926\n\t\t\t\t,0\n\t\t\t\t,-0.999994\n\t\t\t\t,0.0020255\n\t\t\t\t,0.00028907\n\t\t\t\t,-0.999998\n\t\t\t\t,-0.235084\n\t\t\t\t,-0.236129\n\t\t\t\t,-0.942857\n\t\t\t\t,-0.572751\n\t\t\t\t,0.579636\n\t\t\t\t,-0.579636\n\t\t\t\t,-0.578621\n\t\t\t\t,0.577727\n\t\t\t\t,0.575699\n\t\t\t\t,-0.232417\n\t\t\t\t,-0.236283\n\t\t\t\t,0.943479\n\t\t\t\t,0.00202193\n\t\t\t\t,0.000289124\n\t\t\t\t,0.999998\n\t\t\t\t,0\n\t\t\t\t,0\n\t\t\t\t,1\n\t\t\t\t,0.912307\n\t\t\t\t,0.181634\n\t\t\t\t,-0.367023\n\t\t\t\t,0.704999\n\t\t\t\t,0.709207\n\t\t\t\t,0.00123748\n\t\t\t\t,0.743548\n\t\t\t\t,-0.597787\n\t\t\t\t,0.299647\n\t\t\t\t,0.707111\n\t\t\t\t,-0.707098\n\t\t\t\t,-0.00245311\n\t\t\t\t,0.707107\n\t\t\t\t,-0.707107\n\t\t\t\t,0\n\t\t\t\t,0.74672\n\t\t\t\t,-0.596033\n\t\t\t\t,-0.295219\n\t\t\t\t,0.709224\n\t\t\t\t,0.704982\n\t\t\t\t,-0.00121562\n\t\t\t\t,0.913246\n\t\t\t\t,0.183934\n\t\t\t\t,0.363524\n\t\t\t\t,0.993768\n\t\t\t\t,-0.0510411\n\t\t\t\t,-0.0990954\n\t\t\t\t,1\n\t\t\t\t,0.000320418\n\t\t\t\t,-0.000178578\n\t\t\t\t,0.997967\n\t\t\t\t,-0.0575083\n\t\t\t\t,-0.0274738\n\t\t\t\t,0.983829\n\t\t\t\t,0.0357652\n\t\t\t\t,-0.175504\n\t\t\t\t,0.986428\n\t\t\t\t,-0.132236\n\t\t\t\t,-0.0973335\n\t\t\t\t,0.987276\n\t\t\t\t,-0.0419982\n\t\t\t\t,-0.153371\n\t\t\t\t,0.830543\n\t\t\t\t,0.556955\n\t\t\t\t,5.3044e-007\n\t\t\t\t,1\n\t\t\t\t,2.82445e-006\n\t\t\t\t,4.17337e-007\n\t\t\t\t,1\n\t\t\t\t,2.82445e-006\n\t\t\t\t,3.0242e-007\n\t\t\t\t,0.830543\n\t\t\t\t,0.556955\n\t\t\t\t,7.66993e-008\n\t\t\t\t,0.830543\n\t\t\t\t,0.556955\n\t\t\t\t,9.42898e-008\n\t\t\t\t,1\n\t\t\t\t,2.82445e-006\n\t\t\t\t,-8.24994e-008\n\t\t\t\t,0.842689\n\t\t\t\t,0.515139\n\t\t\t\t,-0.156549\n\t\t\t\t,1\n\t\t\t\t,1.11956e-006\n\t\t\t\t,-9.33318e-009\n\t\t\t\t,1\n\t\t\t\t,2.82445e-006\n\t\t\t\t,1.12938e-007\n\t\t\t\t,0.830543\n\t\t\t\t,0.556955\n\t\t\t\t,2.56588e-007\n\t\t\t\t,1\n\t\t\t\t,2.82445e-006\n\t\t\t\t,2.14406e-007\n\t\t\t\t,0.830543\n\t\t\t\t,0.556955\n\t\t\t\t,2.55668e-007\n\t\t\t\t,1\n\t\t\t\t,2.82445e-006\n\t\t\t\t,2.11961e-007\n\t\t\t\t,0.836059\n\t\t\t\t,0.54641\n\t\t\t\t,0.0494127\n\t\t\t\t,1\n\t\t\t\t,3.20177e-006\n\t\t\t\t,-6.11715e-008\n\t\t\t\t,0.871677\n\t\t\t\t,0.481457\n\t\t\t\t,-0.0915289\n\t\t\t\t,0.999712\n\t\t\t\t,0.0239317\n\t\t\t\t,-0.00190884\n\t\t\t\t,0.828268\n\t\t\t\t,0.547386\n\t\t\t\t,0.119753\n\t\t\t\t,0.872971\n\t\t\t\t,0.436329\n\t\t\t\t,-0.218035\n\t\t\t\t,1\n\t\t\t\t,-1.10043e-006\n\t\t\t\t,-1.03653e-007\n\t\t\t\t,0.918405\n\t\t\t\t,0.371684\n\t\t\t\t,-0.135586\n\t\t\t\t,0.99968\n\t\t\t\t,0.0251831\n\t\t\t\t,-0.00231334\n\t\t\t\t,0.985106\n\t\t\t\t,0.129444\n\t\t\t\t,-0.113186\n\t\t\t\t,0.997381\n\t\t\t\t,0.0652659\n\t\t\t\t,0.0311798\n\t\t\t\t,-0.918457\n\t\t\t\t,-0.315448\n\t\t\t\t,-0.238599\n\t\t\t\t,-0.992972\n\t\t\t\t,-0.00669359\n\t\t\t\t,-0.118159\n\t\t\t\t,-0.997847\n\t\t\t\t,-9.88911e-006\n\t\t\t\t,-0.0655852\n\t\t\t\t,-0.987458\n\t\t\t\t,0.0305527\n\t\t\t\t,-0.1549\n\t\t\t\t,-0.827203\n\t\t\t\t,-0.541779\n\t\t\t\t,-0.149033\n\t\t\t\t,-0.974722\n\t\t\t\t,-0.0296636\n\t\t\t\t,-0.221443\n\t\t\t\t,0.559844\n\t\t\t\t,0.828552\n\t\t\t\t,-0.00872992\n\t\t\t\t,0\n\t\t\t\t,1\n\t\t\t\t,6.25899e-007\n\t\t\t\t,0.705857\n\t\t\t\t,0.708126\n\t\t\t\t,-0.0179681\n\t\t\t\t,0.755065\n\t\t\t\t,0.655638\n\t\t\t\t,-0.00397675\n\t\t\t\t,0.655941\n\t\t\t\t,0.754803\n\t\t\t\t,0.00369162\n\t\t\t\t,0\n\t\t\t\t,1\n\t\t\t\t,-1.40878e-006\n\t\t\t\t,0.435118\n\t\t\t\t,0.900372\n\t\t\t\t,-0.00177606\n\t\t\t\t,-0.454661\n\t\t\t\t,0.890595\n\t\t\t\t,-0.0111495\n\t\t\t\t,-0.426285\n\t\t\t\t,0.901867\n\t\t\t\t,0.0701276\n\t\t\t\t,-0.503494\n\t\t\t\t,0.85856\n\t\t\t\t,-0.096789\n\t\t\t\t,0.509945\n\t\t\t\t,0.860207\n\t\t\t\t,-0.000731742\n\t\t\t\t,-0.520985\n\t\t\t\t,0.853565\n\t\t\t\t,-0.00134998\n\t\t\t\t,0.585422\n\t\t\t\t,0.810069\n\t\t\t\t,-0.0326849\n\t\t\t\t,-0.389117\n\t\t\t\t,0.916966\n\t\t\t\t,0.0880983\n\t\t\t\t,-0.0689144\n\t\t\t\t,0.992236\n\t\t\t\t,0.10353\n\t\t\t\t,-0.308362\n\t\t\t\t,0.951215\n\t\t\t\t,0.0101675\n\t\t\t\t,0.591386\n\t\t\t\t,0.806327\n\t\t\t\t,-0.0100185\n\t\t\t\t,-0.290726\n\t\t\t\t,0.956802\n\t\t\t\t,0.00298906\n\t\t\t\t,0.7694\n\t\t\t\t,0.638725\n\t\t\t\t,0.00736961\n\t\t\t\t,-0.226078\n\t\t\t\t,0.974109\n\t\t\t\t,-0.000388176\n\t\t\t\t,0.624699\n\t\t\t\t,0.446731\n\t\t\t\t,0.640455\n\t\t\t\t,-0.03811\n\t\t\t\t,0.99824\n\t\t\t\t,-0.0454488\n\t\t\t\t,0.777048\n\t\t\t\t,0.407267\n\t\t\t\t,0.479928\n\t\t\t\t,0.705857\n\t\t\t\t,0.708126\n\t\t\t\t,-0.0179681\n\t\t\t\t,0.764744\n\t\t\t\t,0.644321\n\t\t\t\t,0.00423865\n\t\t\t\t,0.736651\n\t\t\t\t,0.675801\n\t\t\t\t,0.0252549\n\t\t\t\t,0.559844\n\t\t\t\t,0.828552\n\t\t\t\t,-0.00872992\n\t\t\t\t,0.755065\n\t\t\t\t,0.655638\n\t\t\t\t,-0.00397675\n\t\t\t\t,0.788354\n\t\t\t\t,0.615221\n\t\t\t\t,0.00121186\n\t\t\t\t,0.655941\n\t\t\t\t,0.754803\n\t\t\t\t,0.00369162\n\t\t\t\t,0.812017\n\t\t\t\t,0.576844\n\t\t\t\t,-0.0887654\n\t\t\t\t,0.705293\n\t\t\t\t,0.708668\n\t\t\t\t,0.0187526\n\t\t\t\t,0.435118\n\t\t\t\t,0.900372\n\t\t\t\t,-0.00177606\n\t\t\t\t,0.455167\n\t\t\t\t,-0.89025\n\t\t\t\t,-0.0166657\n\t\t\t\t,0.991861\n\t\t\t\t,0.125333\n\t\t\t\t,0.0224383\n\t\t\t\t,0.999946\n\t\t\t\t,0.00724259\n\t\t\t\t,-0.00739581\n\t\t\t\t,0.447415\n\t\t\t\t,-0.889189\n\t\t\t\t,0.0957192\n\t\t\t\t,0.526887\n\t\t\t\t,-0.847916\n\t\t\t\t,-0.0585537\n\t\t\t\t,0.935437\n\t\t\t\t,-0.343431\n\t\t\t\t,0.0837416\n\t\t\t\t,0.660574\n\t\t\t\t,0.750674\n\t\t\t\t,0.011427\n\t\t\t\t,0.509945\n\t\t\t\t,0.860207\n\t\t\t\t,-0.000731742\n\t\t\t\t,0.52099\n\t\t\t\t,-0.853563\n\t\t\t\t,-0.00088898\n\t\t\t\t,0.948091\n\t\t\t\t,-0.317997\n\t\t\t\t,-0.00126181\n\t\t\t\t,0.719424\n\t\t\t\t,0.694413\n\t\t\t\t,0.0147913\n\t\t\t\t,0.585422\n\t\t\t\t,0.810069\n\t\t\t\t,-0.0326849\n\t\t\t\t,0.955489\n\t\t\t\t,-0.294937\n\t\t\t\t,-0.007325\n\t\t\t\t,0.424833\n\t\t\t\t,-0.899201\n\t\t\t\t,0.104665\n\t\t\t\t,0.920386\n\t\t\t\t,-0.390933\n\t\t\t\t,0.00777883\n\t\t\t\t,0.869582\n\t\t\t\t,0.464234\n\t\t\t\t,-0.168267\n\t\t\t\t,0.94728\n\t\t\t\t,0.262453\n\t\t\t\t,-0.183793\n\t\t\t\t,0.185208\n\t\t\t\t,-0.960441\n\t\t\t\t,0.20797\n\t\t\t\t,0.141208\n\t\t\t\t,-0.431379\n\t\t\t\t,0.891051\n\t\t\t\t,0.714563\n\t\t\t\t,-0.548679\n\t\t\t\t,0.433994\n\t\t\t\t,0.935886\n\t\t\t\t,0.322808\n\t\t\t\t,-0.141113\n\t\t\t\t,0.747349\n\t\t\t\t,0.508342\n\t\t\t\t,0.427853\n\t\t\t\t,0.917491\n\t\t\t\t,-0.397449\n\t\t\t\t,-0.0156682\n\t\t\t\t,0.308974\n\t\t\t\t,-0.951014\n\t\t\t\t,0.0103827\n\t\t\t\t,0.591386\n\t\t\t\t,0.806327\n\t\t\t\t,-0.0100185\n\t\t\t\t,0.892567\n\t\t\t\t,0.423954\n\t\t\t\t,-0.15358\n\t\t\t\t,0.83389\n\t\t\t\t,-0.550948\n\t\t\t\t,-0.0329179\n\t\t\t\t,0.290783\n\t\t\t\t,-0.956784\n\t\t\t\t,0.00300493\n\t\t\t\t,0.7694\n\t\t\t\t,0.638725\n\t\t\t\t,0.00736961\n\t\t\t\t,0.941521\n\t\t\t\t,0.312103\n\t\t\t\t,-0.127005\n\t\t\t\t,0.802496\n\t\t\t\t,-0.595792\n\t\t\t\t,-0.0321219\n\t\t\t\t,0.226079\n\t\t\t\t,-0.974109\n\t\t\t\t,-0.000594702\n\t\t\t\t,0.931115\n\t\t\t\t,0.220888\n\t\t\t\t,-0.290231\n\t\t\t\t,0.903328\n\t\t\t\t,-0.2491\n\t\t\t\t,-0.349211\n\t\t\t\t,0.526489\n\t\t\t\t,-0.759106\n\t\t\t\t,-0.382842\n\t\t\t\t,0.986428\n\t\t\t\t,-0.132236\n\t\t\t\t,-0.0973335\n\t\t\t\t,0.366856\n\t\t\t\t,-0.899308\n\t\t\t\t,-0.238038\n\t\t\t\t,0.562649\n\t\t\t\t,-0.714006\n\t\t\t\t,-0.416678\n\t\t\t\t,0.759812\n\t\t\t\t,-0.649985\n\t\t\t\t,0.0142999\n\t\t\t\t,-0.0689144\n\t\t\t\t,0.992236\n\t\t\t\t,0.10353\n\t\t\t\t,0.777048\n\t\t\t\t,0.407267\n\t\t\t\t,0.479928\n\t\t\t\t,-0.764698\n\t\t\t\t,-0.644374\n\t\t\t\t,0.00429268\n\t\t\t\t,-0.830543\n\t\t\t\t,-0.556955\n\t\t\t\t,0\n\t\t\t\t,-0.830543\n\t\t\t\t,-0.556955\n\t\t\t\t,0\n\t\t\t\t,-0.734963\n\t\t\t\t,-0.677684\n\t\t\t\t,0.0239707\n\t\t\t\t,-0.788351\n\t\t\t\t,-0.615225\n\t\t\t\t,0.00121686\n\t\t\t\t,-0.830543\n\t\t\t\t,-0.556955\n\t\t\t\t,0\n\t\t\t\t,-0.797353\n\t\t\t\t,-0.597315\n\t\t\t\t,-0.0862683\n\t\t\t\t,-0.800918\n\t\t\t\t,-0.580014\n\t\t\t\t,-0.14871\n\t\t\t\t,-0.830543\n\t\t\t\t,-0.556955\n\t\t\t\t,0\n\t\t\t\t,-0.704251\n\t\t\t\t,-0.709743\n\t\t\t\t,0.0172141\n\t\t\t\t,-0.830543\n\t\t\t\t,-0.556955\n\t\t\t\t,0\n\t\t\t\t,-0.660067\n\t\t\t\t,-0.751132\n\t\t\t\t,0.0106532\n\t\t\t\t,-0.831806\n\t\t\t\t,-0.552703\n\t\t\t\t,0.0511714\n\t\t\t\t,-0.718413\n\t\t\t\t,-0.695404\n\t\t\t\t,0.0171949\n\t\t\t\t,-0.856939\n\t\t\t\t,-0.506168\n\t\t\t\t,-0.097211\n\t\t\t\t,-0.824748\n\t\t\t\t,-0.547188\n\t\t\t\t,-0.142744\n\t\t\t\t,-0.52249\n\t\t\t\t,-0.812064\n\t\t\t\t,-0.259918\n\t\t\t\t,-0.694764\n\t\t\t\t,-0.68954\n\t\t\t\t,0.204545\n\t\t\t\t,-0.683381\n\t\t\t\t,-0.651398\n\t\t\t\t,-0.329653\n\t\t\t\t,-0.827203\n\t\t\t\t,-0.541779\n\t\t\t\t,-0.149033\n\t\t\t\t,-0.914563\n\t\t\t\t,-0.382999\n\t\t\t\t,-0.12995\n\t\t\t\t,-0.817866\n\t\t\t\t,-0.571446\n\t\t\t\t,0.0674227\n\t\t\t\t,-0.918457\n\t\t\t\t,-0.315448\n\t\t\t\t,-0.238599\n\t\t\t\t,-0.559876\n\t\t\t\t,-0.778808\n\t\t\t\t,-0.282839\n\t\t\t\t,-0.859345\n\t\t\t\t,-0.487561\n\t\t\t\t,-0.154304\n\t\t\t\t,-0.789697\n\t\t\t\t,-0.585238\n\t\t\t\t,-0.184052\n\t\t\t\t,-0.927622\n\t\t\t\t,-0.35229\n\t\t\t\t,-0.124132\n\t\t\t\t,-0.878387\n\t\t\t\t,-0.455547\n\t\t\t\t,-0.144613\n\t\t\t\t,-0.849184\n\t\t\t\t,-0.419916\n\t\t\t\t,-0.320245\n\t\t\t\t,-0.86283\n\t\t\t\t,-0.483343\n\t\t\t\t,-0.147997\n\t\t\t\t,0.99395\n\t\t\t\t,-0.048829\n\t\t\t\t,0.0983867\n\t\t\t\t,0.996382\n\t\t\t\t,-0.0178275\n\t\t\t\t,0.0830995\n\t\t\t\t,0.999537\n\t\t\t\t,0.0258919\n\t\t\t\t,0.0159835\n\t\t\t\t,0.999532\n\t\t\t\t,0.0213503\n\t\t\t\t,0.0219101\n\t\t\t\t,0.990986\n\t\t\t\t,-0.10809\n\t\t\t\t,0.0791359\n\t\t\t\t,0.999998\n\t\t\t\t,0.000779112\n\t\t\t\t,-0.0018566\n\t\t\t\t,0.999998\n\t\t\t\t,0.00216411\n\t\t\t\t,-0.000152172\n\t\t\t\t,0.995324\n\t\t\t\t,-0.0960751\n\t\t\t\t,-0.0100061\n\t\t\t\t,0.989423\n\t\t\t\t,-0.142164\n\t\t\t\t,-0.0288407\n\t\t\t\t,0.999983\n\t\t\t\t,0.00402042\n\t\t\t\t,0.00412583\n\t\t\t\t,0.99991\n\t\t\t\t,0.0025338\n\t\t\t\t,-0.0131592\n\t\t\t\t,0.983185\n\t\t\t\t,-0.160274\n\t\t\t\t,-0.0875146\n\t\t\t\t,0.996483\n\t\t\t\t,-0.0742679\n\t\t\t\t,-0.0388154\n\t\t\t\t,0.987345\n\t\t\t\t,-0.156908\n\t\t\t\t,-0.0230018\n\t\t\t\t,0.98616\n\t\t\t\t,-0.141079\n\t\t\t\t,-0.0870906\n\t\t\t\t,0.99404\n\t\t\t\t,-0.0925872\n\t\t\t\t,-0.0575508\n\t\t\t\t,0.972498\n\t\t\t\t,-0.214106\n\t\t\t\t,0.0916869\n\t\t\t\t,0.993912\n\t\t\t\t,-0.0889351\n\t\t\t\t,0.0650331\n\t\t\t\t,0.948091\n\t\t\t\t,-0.317997\n\t\t\t\t,-0.00126181\n\t\t\t\t,0.935437\n\t\t\t\t,-0.343431\n\t\t\t\t,0.0837416\n\t\t\t\t,0.955489\n\t\t\t\t,-0.294937\n\t\t\t\t,-0.007325\n\t\t\t\t,0.920386\n\t\t\t\t,-0.390933\n\t\t\t\t,0.00777883\n\t\t\t\t,0.714563\n\t\t\t\t,-0.548679\n\t\t\t\t,0.433994\n\t\t\t\t,0.838368\n\t\t\t\t,0.283993\n\t\t\t\t,0.465281\n\t\t\t\t,0\n\t\t\t\t,-0.697899\n\t\t\t\t,-0.716196\n\t\t\t\t,0\n\t\t\t\t,-0.850923\n\t\t\t\t,-0.52529\n\t\t\t\t,1.291e-008\n\t\t\t\t,-0.386953\n\t\t\t\t,0.922099\n\t\t\t\t,1.69318e-008\n\t\t\t\t,-0.189077\n\t\t\t\t,0.981962\n\t\t\t\t,0.960324\n\t\t\t\t,0.276512\n\t\t\t\t,0.0363171\n\t\t\t\t,1\n\t\t\t\t,3.54941e-006\n\t\t\t\t,-1.05268e-007\n\t\t\t\t,1\n\t\t\t\t,-6.66899e-007\n\t\t\t\t,-9.27443e-008\n\t\t\t\t,0.923116\n\t\t\t\t,0.382387\n\t\t\t\t,-0.0404567\n\t\t\t\t,0.995324\n\t\t\t\t,-0.0960751\n\t\t\t\t,-0.0100061\n\t\t\t\t,0.999998\n\t\t\t\t,0.00216411\n\t\t\t\t,-0.000152172\n\t\t\t\t,1\n\t\t\t\t,-2.412e-006\n\t\t\t\t,-3.98011e-007\n\t\t\t\t,0.992324\n\t\t\t\t,0.123604\n\t\t\t\t,-0.0038891\n\t\t\t\t,0.991861\n\t\t\t\t,0.125333\n\t\t\t\t,0.0224383\n\t\t\t\t,0.999946\n\t\t\t\t,0.00724259\n\t\t\t\t,-0.00739581\n\t\t\t\t,0.935437\n\t\t\t\t,-0.343431\n\t\t\t\t,0.0837416\n\t\t\t\t,0.735604\n\t\t\t\t,0.0550271\n\t\t\t\t,-0.675173\n\t\t\t\t,0.917491\n\t\t\t\t,-0.397449\n\t\t\t\t,-0.0156682\n\t\t\t\t,0.992324\n\t\t\t\t,0.123604\n\t\t\t\t,-0.0038891\n\t\t\t\t,1\n\t\t\t\t,-2.412e-006\n\t\t\t\t,-3.98011e-007\n\t\t\t\t,1\n\t\t\t\t,-1.36444e-006\n\t\t\t\t,-1.47892e-007\n\t\t\t\t,0.998542\n\t\t\t\t,-0.0465329\n\t\t\t\t,-0.0273508\n\t\t\t\t,1\n\t\t\t\t,2.15221e-008\n\t\t\t\t,-1.37849e-007\n\t\t\t\t,0.990722\n\t\t\t\t,-0.131809\n\t\t\t\t,-0.0331124\n\t\t\t\t,1\n\t\t\t\t,0.000320418\n\t\t\t\t,-0.000178578\n\t\t\t\t,0.993768\n\t\t\t\t,-0.0510411\n\t\t\t\t,-0.0990954\n\t\t\t\t,0.917491\n\t\t\t\t,-0.397449\n\t\t\t\t,-0.0156682\n\t\t\t\t,0.83389\n\t\t\t\t,-0.550948\n\t\t\t\t,-0.0329179\n\t\t\t\t,0.802496\n\t\t\t\t,-0.595792\n\t\t\t\t,-0.0321219\n\t\t\t\t,0.986428\n\t\t\t\t,-0.132236\n\t\t\t\t,-0.0973335\n\t\t\t\t,0.939238\n\t\t\t\t,0.325823\n\t\t\t\t,-0.108034\n\t\t\t\t,0.813652\n\t\t\t\t,0.52565\n\t\t\t\t,-0.24832\n\t\t\t\t,0.816155\n\t\t\t\t,0.232159\n\t\t\t\t,-0.529143\n\t\t\t\t,0.239686\n\t\t\t\t,0.870578\n\t\t\t\t,-0.429703\n\t\t\t\t,0.324995\n\t\t\t\t,0.656888\n\t\t\t\t,-0.68035\n\t\t\t\t,0.291336\n\t\t\t\t,-0.0357272\n\t\t\t\t,-0.955954\n\t\t\t\t,-0.105228\n\t\t\t\t,-0.274007\n\t\t\t\t,-0.955953\n\t\t\t\t,-0.728749\n\t\t\t\t,-0.127808\n\t\t\t\t,-0.672748\n\t\t\t\t,-0.881201\n\t\t\t\t,0.19708\n\t\t\t\t,-0.429703\n\t\t\t\t,-0.728749\n\t\t\t\t,-0.127808\n\t\t\t\t,-0.672748\n\t\t\t\t,-0.872154\n\t\t\t\t,-0.433832\n\t\t\t\t,-0.226135\n\t\t\t\t,-0.535068\n\t\t\t\t,-0.696867\n\t\t\t\t,-0.477577\n\t\t\t\t,-0.744618\n\t\t\t\t,-0.64261\n\t\t\t\t,-0.180545\n\t\t\t\t,0.916967\n\t\t\t\t,0.355773\n\t\t\t\t,0.180544\n\t\t\t\t,0.939238\n\t\t\t\t,0.325823\n\t\t\t\t,-0.108034\n\t\t\t\t,0.918921\n\t\t\t\t,-0.253505\n\t\t\t\t,0.302192\n\t\t\t\t,0.866496\n\t\t\t\t,0.145278\n\t\t\t\t,-0.477577\n\t\t\t\t,0.813652\n\t\t\t\t,0.52565\n\t\t\t\t,-0.24832\n\t\t\t\t,0.690656\n\t\t\t\t,0.723009\n\t\t\t\t,-0.0159115\n\t\t\t\t,0.207575\n\t\t\t\t,0.930372\n\t\t\t\t,-0.302192\n\t\t\t\t,0.535068\n\t\t\t\t,0.696867\n\t\t\t\t,0.477577\n\t\t\t\t,-6.40677e-006\n\t\t\t\t,0.514547\n\t\t\t\t,-0.857462\n\t\t\t\t,0.0807288\n\t\t\t\t,0.471967\n\t\t\t\t,-0.877912\n\t\t\t\t,0.85708\n\t\t\t\t,0.270946\n\t\t\t\t,-0.438181\n\t\t\t\t,0.913242\n\t\t\t\t,0.225221\n\t\t\t\t,-0.339506\n\t\t\t\t,0.813342\n\t\t\t\t,-0.301365\n\t\t\t\t,0.497648\n\t\t\t\t,0.857591\n\t\t\t\t,-0.254681\n\t\t\t\t,0.44685\n\t\t\t\t,-9.78097e-006\n\t\t\t\t,-0.514546\n\t\t\t\t,0.857463\n\t\t\t\t,-0.0888403\n\t\t\t\t,-0.601461\n\t\t\t\t,0.793948\n\t\t\t\t,9.78127e-006\n\t\t\t\t,0.514545\n\t\t\t\t,-0.857463\n\t\t\t\t,0.117052\n\t\t\t\t,0.454501\n\t\t\t\t,-0.883022\n\t\t\t\t,0.89894\n\t\t\t\t,0.235267\n\t\t\t\t,-0.369536\n\t\t\t\t,0.856911\n\t\t\t\t,0.274998\n\t\t\t\t,-0.43598\n\t\t\t\t,0.857494\n\t\t\t\t,-0.258752\n\t\t\t\t,0.444692\n\t\t\t\t,0.793899\n\t\t\t\t,-0.318942\n\t\t\t\t,0.517688\n\t\t\t\t,-0.068395\n\t\t\t\t,-0.569894\n\t\t\t\t,0.818867\n\t\t\t\t,6.40692e-006\n\t\t\t\t,-0.514552\n\t\t\t\t,0.857459\n\t\t\t\t,0.869955\n\t\t\t\t,0.274844\n\t\t\t\t,-0.409437\n\t\t\t\t,0.0833837\n\t\t\t\t,0.323442\n\t\t\t\t,-0.942567\n\t\t\t\t,0.882691\n\t\t\t\t,-0.249425\n\t\t\t\t,0.3983\n\t\t\t\t,0.0935362\n\t\t\t\t,-0.67495\n\t\t\t\t,0.731911\n\t\t\t\t,0.870708\n\t\t\t\t,0.27511\n\t\t\t\t,-0.407654\n\t\t\t\t,0.0933141\n\t\t\t\t,0.314358\n\t\t\t\t,-0.944707\n\t\t\t\t,0.881142\n\t\t\t\t,-0.250932\n\t\t\t\t,0.400776\n\t\t\t\t,0.0866726\n\t\t\t\t,-0.669291\n\t\t\t\t,0.737928\n\t\t\t\t,0.908848\n\t\t\t\t,0.259524\n\t\t\t\t,-0.32656\n\t\t\t\t,0.388306\n\t\t\t\t,0.11189\n\t\t\t\t,-0.914712\n\t\t\t\t,0.939037\n\t\t\t\t,-0.174607\n\t\t\t\t,0.296177\n\t\t\t\t,0.34626\n\t\t\t\t,-0.729264\n\t\t\t\t,0.590151\n\t\t\t\t,0.909424\n\t\t\t\t,0.259445\n\t\t\t\t,-0.325017\n\t\t\t\t,0.385592\n\t\t\t\t,0.115156\n\t\t\t\t,-0.915455\n\t\t\t\t,0.940484\n\t\t\t\t,-0.172305\n\t\t\t\t,0.292916\n\t\t\t\t,0.347915\n\t\t\t\t,-0.729789\n\t\t\t\t,0.588527\n\t\t\t\t,0.970804\n\t\t\t\t,0.170841\n\t\t\t\t,-0.168383\n\t\t\t\t,0.854899\n\t\t\t\t,-0.0129293\n\t\t\t\t,-0.518634\n\t\t\t\t,0.989894\n\t\t\t\t,-0.0651038\n\t\t\t\t,0.12598\n\t\t\t\t,0.78082\n\t\t\t\t,-0.508466\n\t\t\t\t,0.363018\n\t\t\t\t,0.969363\n\t\t\t\t,0.174109\n\t\t\t\t,-0.173266\n\t\t\t\t,0.845866\n\t\t\t\t,-0.0126986\n\t\t\t\t,-0.533244\n\t\t\t\t,0.990182\n\t\t\t\t,-0.0640605\n\t\t\t\t,0.124238\n\t\t\t\t,0.791492\n\t\t\t\t,-0.497549\n\t\t\t\t,0.354944\n\t\t\t\t,0.99692\n\t\t\t\t,0.0702108\n\t\t\t\t,-0.034947\n\t\t\t\t,0.982677\n\t\t\t\t,0.0422041\n\t\t\t\t,-0.180458\n\t\t\t\t,0.999622\n\t\t\t\t,-0.00489406\n\t\t\t\t,0.0270462\n\t\t\t\t,0.982659\n\t\t\t\t,-0.135147\n\t\t\t\t,0.126954\n\t\t\t\t,0.996919\n\t\t\t\t,0.0702115\n\t\t\t\t,-0.0349597\n\t\t\t\t,0.982639\n\t\t\t\t,0.0422481\n\t\t\t\t,-0.180652\n\t\t\t\t,0.999622\n\t\t\t\t,-0.0048911\n\t\t\t\t,0.0270597\n\t\t\t\t,0.982683\n\t\t\t\t,-0.135031\n\t\t\t\t,0.126888\n\t\t\t\t,-1.51613e-007\n\t\t\t\t,-0.981467\n\t\t\t\t,0.191634\n\t\t\t\t,-3.22793e-005\n\t\t\t\t,-0.999871\n\t\t\t\t,0.0160862\n\t\t\t\t,0.0326337\n\t\t\t\t,-0.500829\n\t\t\t\t,0.864931\n\t\t\t\t,4.47211e-006\n\t\t\t\t,-0.319155\n\t\t\t\t,0.947702\n\t\t\t\t,1.35144e-008\n\t\t\t\t,-0.685443\n\t\t\t\t,-0.728126\n\t\t\t\t,-1.11493e-005\n\t\t\t\t,-0.530129\n\t\t\t\t,-0.847917\n\t\t\t\t,-2.0258e-006\n\t\t\t\t,0.319005\n\t\t\t\t,-0.947753\n\t\t\t\t,0.0327689\n\t\t\t\t,0.497754\n\t\t\t\t,-0.866699\n\t\t\t\t,6.66766e-008\n\t\t\t\t,-0.981514\n\t\t\t\t,0.19139\n\t\t\t\t,-3.17014e-005\n\t\t\t\t,-0.999873\n\t\t\t\t,0.0159628\n\t\t\t\t,0.0326949\n\t\t\t\t,-0.500851\n\t\t\t\t,0.864916\n\t\t\t\t,-5.16401e-006\n\t\t\t\t,-0.319005\n\t\t\t\t,0.947753\n\t\t\t\t,1.34364e-007\n\t\t\t\t,-0.685337\n\t\t\t\t,-0.728227\n\t\t\t\t,-1.15957e-005\n\t\t\t\t,-0.529973\n\t\t\t\t,-0.848015\n\t\t\t\t,1.75534e-006\n\t\t\t\t,0.319155\n\t\t\t\t,-0.947702\n\t\t\t\t,0.0327056\n\t\t\t\t,0.497741\n\t\t\t\t,-0.866709\n\t\t\t\t,0.504819\n\t\t\t\t,-0.482379\n\t\t\t\t,0.715869\n\t\t\t\t,1\n\t\t\t\t,0\n\t\t\t\t,0\n\t\t\t\t,0.895725\n\t\t\t\t,0.105387\n\t\t\t\t,0.431939\n\t\t\t\t,0.828167\n\t\t\t\t,-0.421689\n\t\t\t\t,-0.369211\n\t\t\t\t,0.761859\n\t\t\t\t,0.362239\n\t\t\t\t,-0.536986\n\t\t\t\t,0.933587\n\t\t\t\t,0.332198\n\t\t\t\t,-0.13439\n\t\t\t\t,0.965093\n\t\t\t\t,-0.221524\n\t\t\t\t,0.139721\n\t\t\t\t,1.41488e-012\n\t\t\t\t,-0.000739274\n\t\t\t\t,-1\n\t\t\t\t,-0.398332\n\t\t\t\t,-0.128825\n\t\t\t\t,-0.908149\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,-0.001821\n\t\t\t\t,-0.0031858\n\t\t\t\t,0.999993\n\t\t\t\t,-0.527237\n\t\t\t\t,0.347746\n\t\t\t\t,0.775303\n\t\t\t\t,-0.001821\n\t\t\t\t,0.00294379\n\t\t\t\t,0.999994\n\t\t\t\t,-0.527237\n\t\t\t\t,0.347746\n\t\t\t\t,0.775303\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,-0.396257\n\t\t\t\t,-0.135158\n\t\t\t\t,-0.908137\n\t\t\t\t,1.41677e-012\n\t\t\t\t,-0.000739283\n\t\t\t\t,-1\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,-0.418557\n\t\t\t\t,0.483631\n\t\t\t\t,0.768707\n\t\t\t\t,0.475756\n\t\t\t\t,-0.408175\n\t\t\t\t,0.779134\n\t\t\t\t,0.219572\n\t\t\t\t,-0.202719\n\t\t\t\t,0.954303\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,0.932779\n\t\t\t\t,0.222428\n\t\t\t\t,-0.283634\n\t\t\t\t,1\n\t\t\t\t,4.06969e-007\n\t\t\t\t,0\n\t\t\t\t,0.854459\n\t\t\t\t,0.223354\n\t\t\t\t,-0.469054\n\t\t\t\t,0.84865\n\t\t\t\t,-0.0193075\n\t\t\t\t,-0.528602\n\t\t\t\t,0.37638\n\t\t\t\t,0.275498\n\t\t\t\t,-0.884556\n\t\t\t\t,0.704193\n\t\t\t\t,-0.216951\n\t\t\t\t,-0.676051\n\t\t\t\t,0.767734\n\t\t\t\t,0.249573\n\t\t\t\t,-0.590167\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,-0.272343\n\t\t\t\t,0.093852\n\t\t\t\t,0.957612\n\t\t\t\t,0.490567\n\t\t\t\t,0.0421639\n\t\t\t\t,0.870383\n\t\t\t\t,-0.385401\n\t\t\t\t,-0.327366\n\t\t\t\t,0.862727\n\t\t\t\t,0.738592\n\t\t\t\t,0.346601\n\t\t\t\t,0.578229\n\t\t\t\t,-0.845857\n\t\t\t\t,-0.0583779\n\t\t\t\t,0.530205\n\t\t\t\t,-0.845857\n\t\t\t\t,-0.0583779\n\t\t\t\t,0.530205\n\t\t\t\t,0.738592\n\t\t\t\t,0.346601\n\t\t\t\t,0.578229\n\t\t\t\t,0.296538\n\t\t\t\t,-0.215382\n\t\t\t\t,0.930417\n\t\t\t\t,-0.640768\n\t\t\t\t,0.299025\n\t\t\t\t,0.707107\n\t\t\t\t,0.979704\n\t\t\t\t,0.0139322\n\t\t\t\t,0.199966\n\t\t\t\t,0.850743\n\t\t\t\t,-0.0976274\n\t\t\t\t,0.516436\n\t\t\t\t,0.798141\n\t\t\t\t,0.256996\n\t\t\t\t,0.544908\n\t\t\t\t,0.622361\n\t\t\t\t,0.351164\n\t\t\t\t,0.699536\n\t\t\t\t,0.658246\n\t\t\t\t,0.625319\n\t\t\t\t,0.419151\n\t\t\t\t,0.0309834\n\t\t\t\t,-0.997088\n\t\t\t\t,-0.0696804\n\t\t\t\t,0\n\t\t\t\t,-1\n\t\t\t\t,2.7732e-008\n\t\t\t\t,-0.0108945\n\t\t\t\t,-0.739936\n\t\t\t\t,0.672589\n\t\t\t\t,0\n\t\t\t\t,-0.703159\n\t\t\t\t,0.711033\n\t\t\t\t,0\n\t\t\t\t,0\n\t\t\t\t,1\n\t\t\t\t,-0.0175992\n\t\t\t\t,-0.0783502\n\t\t\t\t,0.996771\n\t\t\t\t,-0.0107912\n\t\t\t\t,0.660187\n\t\t\t\t,0.751024\n\t\t\t\t,0\n\t\t\t\t,0.703159\n\t\t\t\t,0.711033\n\t\t\t\t,0\n\t\t\t\t,1\n\t\t\t\t,2.7732e-008\n\t\t\t\t,-0.0172861\n\t\t\t\t,0.995904\n\t\t\t\t,0.0887456\n\t\t\t\t,-0.0108943\n\t\t\t\t,0.739937\n\t\t\t\t,-0.672588\n\t\t\t\t,0\n\t\t\t\t,0.703159\n\t\t\t\t,-0.711033\n\t\t\t\t,-0.0108943\n\t\t\t\t,0.739937\n\t\t\t\t,-0.672588\n\t\t\t\t,0\n\t\t\t\t,0.703159\n\t\t\t\t,-0.711033\n\t\t\t\t,0\n\t\t\t\t,0\n\t\t\t\t,-1\n\t\t\t\t,-0.0175992\n\t\t\t\t,0.0783492\n\t\t\t\t,-0.996771\n\t\t\t\t,-0.0107913\n\t\t\t\t,-0.660188\n\t\t\t\t,-0.751023\n\t\t\t\t,0\n\t\t\t\t,-0.703159\n\t\t\t\t,-0.711033\n\t\t\t\t,0.0226799\n\t\t\t\t,-0.999695\n\t\t\t\t,-0.00972728\n\t\t\t\t,-0.0131055\n\t\t\t\t,-0.702348\n\t\t\t\t,0.711713\n\t\t\t\t,-0.0123839\n\t\t\t\t,-0.0122817\n\t\t\t\t,0.999848\n\t\t\t\t,-0.0131944\n\t\t\t\t,0.678228\n\t\t\t\t,0.734733\n\t\t\t\t,-0.0139963\n\t\t\t\t,0.999666\n\t\t\t\t,0.0217368\n\t\t\t\t,-0.0131051\n\t\t\t\t,0.702359\n\t\t\t\t,-0.711702\n\t\t\t\t,-0.0131051\n\t\t\t\t,0.702359\n\t\t\t\t,-0.711702\n\t\t\t\t,-0.0123841\n\t\t\t\t,0.0122734\n\t\t\t\t,-0.999848\n\t\t\t\t,-0.0131943\n\t\t\t\t,-0.678228\n\t\t\t\t,-0.734733\n\t\t\t\t,-8.87697e-008\n\t\t\t\t,-0.989097\n\t\t\t\t,0.147264\n\t\t\t\t,-5.78237e-008\n\t\t\t\t,-0.582507\n\t\t\t\t,0.812825\n\t\t\t\t,1.0664e-007\n\t\t\t\t,0.127\n\t\t\t\t,0.991903\n\t\t\t\t,1.02832e-007\n\t\t\t\t,0.780639\n\t\t\t\t,0.624982\n\t\t\t\t,1.13872e-007\n\t\t\t\t,0.989098\n\t\t\t\t,-0.147255\n\t\t\t\t,1.25395e-007\n\t\t\t\t,0.582515\n\t\t\t\t,-0.81282\n\t\t\t\t,1.25395e-007\n\t\t\t\t,0.582515\n\t\t\t\t,-0.81282\n\t\t\t\t,-0.0131051\n\t\t\t\t,0.702359\n\t\t\t\t,-0.711702\n\t\t\t\t,-0.0123841\n\t\t\t\t,0.0122734\n\t\t\t\t,-0.999848\n\t\t\t\t,1.25395e-007\n\t\t\t\t,0.582515\n\t\t\t\t,-0.81282\n\t\t\t\t,4.17274e-008\n\t\t\t\t,-0.127018\n\t\t\t\t,-0.9919\n\t\t\t\t,3.08643e-008\n\t\t\t\t,-0.780626\n\t\t\t\t,-0.624998\n\t\t\t\t,-0.816155\n\t\t\t\t,0.232159\n\t\t\t\t,-0.529143\n\t\t\t\t,-0.813652\n\t\t\t\t,0.52565\n\t\t\t\t,-0.24832\n\t\t\t\t,-0.939238\n\t\t\t\t,0.325823\n\t\t\t\t,-0.108034\n\t\t\t\t,-0.239686\n\t\t\t\t,0.870578\n\t\t\t\t,-0.429703\n\t\t\t\t,0.105228\n\t\t\t\t,-0.274007\n\t\t\t\t,-0.955953\n\t\t\t\t,-0.291336\n\t\t\t\t,-0.0357272\n\t\t\t\t,-0.955954\n\t\t\t\t,-0.324995\n\t\t\t\t,0.656888\n\t\t\t\t,-0.68035\n\t\t\t\t,0.728749\n\t\t\t\t,-0.127808\n\t\t\t\t,-0.672749\n\t\t\t\t,0.872154\n\t\t\t\t,-0.433832\n\t\t\t\t,-0.226135\n\t\t\t\t,0.728749\n\t\t\t\t,-0.127808\n\t\t\t\t,-0.672749\n\t\t\t\t,0.881201\n\t\t\t\t,0.19708\n\t\t\t\t,-0.429703\n\t\t\t\t,0.744618\n\t\t\t\t,-0.64261\n\t\t\t\t,-0.180545\n\t\t\t\t,0.535068\n\t\t\t\t,-0.696867\n\t\t\t\t,-0.477577\n\t\t\t\t,-0.918921\n\t\t\t\t,-0.253505\n\t\t\t\t,0.302192\n\t\t\t\t,-0.939238\n\t\t\t\t,0.325823\n\t\t\t\t,-0.108034\n\t\t\t\t,-0.916967\n\t\t\t\t,0.355773\n\t\t\t\t,0.180544\n\t\t\t\t,-0.866495\n\t\t\t\t,0.145278\n\t\t\t\t,-0.477577\n\t\t\t\t,-0.207575\n\t\t\t\t,0.930372\n\t\t\t\t,-0.302192\n\t\t\t\t,-0.690656\n\t\t\t\t,0.723009\n\t\t\t\t,-0.0159115\n\t\t\t\t,-0.813652\n\t\t\t\t,0.52565\n\t\t\t\t,-0.24832\n\t\t\t\t,-0.535068\n\t\t\t\t,0.696867\n\t\t\t\t,0.477577\n\t\t\t\t,0.0928836\n\t\t\t\t,-0.117254\n\t\t\t\t,-0.988749\n\t\t\t\t,0.628819\n\t\t\t\t,-0.621184\n\t\t\t\t,-0.467673\n\t\t\t\t,0.548789\n\t\t\t\t,0.0444676\n\t\t\t\t,-0.834777\n\t\t\t\t,0.318286\n\t\t\t\t,-0.145295\n\t\t\t\t,-0.936794\n\t\t\t\t,-0.445819\n\t\t\t\t,-0.0053511\n\t\t\t\t,-0.895107\n\t\t\t\t,-0.736061\n\t\t\t\t,0.0328791\n\t\t\t\t,-0.676116\n\t\t\t\t,0.0633831\n\t\t\t\t,-0.149633\n\t\t\t\t,-0.986708\n\t\t\t\t,-0.94303\n\t\t\t\t,0.0365785\n\t\t\t\t,-0.330692\n\t\t\t\t,-0.316228\n\t\t\t\t,-0.115304\n\t\t\t\t,-0.94165\n\t\t\t\t,-0.5547\n\t\t\t\t,0.101129\n\t\t\t\t,0.825882\n\t\t\t\t,-0.94303\n\t\t\t\t,-0.115957\n\t\t\t\t,0.311847\n\t\t\t\t,-0.789343\n\t\t\t\t,0.500078\n\t\t\t\t,-0.356173\n\t\t\t\t,-0.789344\n\t\t\t\t,-0.602826\n\t\t\t\t,0.116346\n\t\t\t\t,-0.523212\n\t\t\t\t,0.829547\n\t\t\t\t,-0.195195\n\t\t\t\t,-0.789343\n\t\t\t\t,0.500087\n\t\t\t\t,-0.356162\n\t\t\t\t,-0.789344\n\t\t\t\t,-0.602824\n\t\t\t\t,0.116359\n\t\t\t\t,-0.523215\n\t\t\t\t,-0.633626\n\t\t\t\t,0.569881\n\t\t\t\t,-0.922972\n\t\t\t\t,0.290635\n\t\t\t\t,-0.252296\n\t\t\t\t,-0.523212\n\t\t\t\t,0.829538\n\t\t\t\t,-0.195231\n\t\t\t\t,-0.523215\n\t\t\t\t,-0.633639\n\t\t\t\t,0.569866\n\t\t\t\t,-0.922976\n\t\t\t\t,-0.378847\n\t\t\t\t,0.067748\n\t\t\t\t,-0.782824\n\t\t\t\t,0.5031\n\t\t\t\t,0.366166\n\t\t\t\t,-0.922972\n\t\t\t\t,0.290641\n\t\t\t\t,-0.252289\n\t\t\t\t,-0.922976\n\t\t\t\t,-0.378845\n\t\t\t\t,0.0677604\n\t\t\t\t,-0.706113\n\t\t\t\t,0.0135666\n\t\t\t\t,0.707969\n\t\t\t\t,-0.782824\n\t\t\t\t,0.503106\n\t\t\t\t,0.366157\n\t\t\t\t,0.313626\n\t\t\t\t,-0.0127064\n\t\t\t\t,0.949462\n\t\t\t\t,0.894872\n\t\t\t\t,0.278856\n\t\t\t\t,0.348488\n\t\t\t\t,0.316248\n\t\t\t\t,0.331179\n\t\t\t\t,0.888993\n\t\t\t\t,0.102879\n\t\t\t\t,0.0614834\n\t\t\t\t,0.992792\n\t\t\t\t,0.292459\n\t\t\t\t,0.529652\n\t\t\t\t,0.796202\n\t\t\t\t,-0.32295\n\t\t\t\t,-0.328498\n\t\t\t\t,0.887577\n\t\t\t\t,-0.866023\n\t\t\t\t,-1.31114e-006\n\t\t\t\t,-0.500005\n\t\t\t\t,-0.0891725\n\t\t\t\t,-0.0537749\n\t\t\t\t,-0.994563\n\t\t\t\t,4.66623e-006\n\t\t\t\t,-1.0141e-006\n\t\t\t\t,-1\n\t\t\t\t,-0.918952\n\t\t\t\t,0.00858596\n\t\t\t\t,-0.394276\n\t\t\t\t,-0.826318\n\t\t\t\t,-0.00839808\n\t\t\t\t,0.563141\n\t\t\t\t,-0.866025\n\t\t\t\t,-3.16448e-007\n\t\t\t\t,0.5\n\t\t\t\t,1.00254e-005\n\t\t\t\t,1.64624e-006\n\t\t\t\t,1\n\t\t\t\t,0.0946284\n\t\t\t\t,-0.125433\n\t\t\t\t,0.987579\n\t\t\t\t,-0.905328\n\t\t\t\t,0.00460619\n\t\t\t\t,-0.424688\n\t\t\t\t,-0.129765\n\t\t\t\t,-0.073584\n\t\t\t\t,-0.988811\n\t\t\t\t,-1.00257e-005\n\t\t\t\t,2.25984e-006\n\t\t\t\t,-1\n\t\t\t\t,-0.866028\n\t\t\t\t,1.79772e-007\n\t\t\t\t,-0.499996\n\t\t\t\t,-0.866028\n\t\t\t\t,-8.55446e-007\n\t\t\t\t,0.499996\n\t\t\t\t,-0.808754\n\t\t\t\t,-0.0154015\n\t\t\t\t,0.587945\n\t\t\t\t,0.0738988\n\t\t\t\t,-0.0784591\n\t\t\t\t,0.994175\n\t\t\t\t,-4.6663e-006\n\t\t\t\t,-4.6599e-007\n\t\t\t\t,1\n\t\t\t\t,-0.879377\n\t\t\t\t,0.0201331\n\t\t\t\t,-0.475699\n\t\t\t\t,-0.112386\n\t\t\t\t,-0.237977\n\t\t\t\t,-0.964747\n\t\t\t\t,-0.894525\n\t\t\t\t,-0.00938743\n\t\t\t\t,0.446918\n\t\t\t\t,-0.11686\n\t\t\t\t,-0.235055\n\t\t\t\t,0.964932\n\t\t\t\t,-0.880175\n\t\t\t\t,0.0212998\n\t\t\t\t,-0.474171\n\t\t\t\t,-0.12447\n\t\t\t\t,-0.246876\n\t\t\t\t,-0.96102\n\t\t\t\t,-0.892955\n\t\t\t\t,-0.00968219\n\t\t\t\t,0.450042\n\t\t\t\t,-0.108324\n\t\t\t\t,-0.226708\n\t\t\t\t,0.96792\n\t\t\t\t,-0.918026\n\t\t\t\t,0.0495232\n\t\t\t\t,-0.393416\n\t\t\t\t,-0.446873\n\t\t\t\t,-0.377399\n\t\t\t\t,-0.811095\n\t\t\t\t,-0.947177\n\t\t\t\t,0.00673766\n\t\t\t\t,0.320642\n\t\t\t\t,-0.396054\n\t\t\t\t,-0.338033\n\t\t\t\t,0.853742\n\t\t\t\t,-0.91865\n\t\t\t\t,0.0503137\n\t\t\t\t,-0.391855\n\t\t\t\t,-0.44484\n\t\t\t\t,-0.375047\n\t\t\t\t,-0.8133\n\t\t\t\t,-0.948395\n\t\t\t\t,0.00690703\n\t\t\t\t,0.317015\n\t\t\t\t,-0.397279\n\t\t\t\t,-0.339077\n\t\t\t\t,0.852758\n\t\t\t\t,-0.975209\n\t\t\t\t,0.0548359\n\t\t\t\t,-0.214384\n\t\t\t\t,-0.875951\n\t\t\t\t,-0.246669\n\t\t\t\t,-0.414565\n\t\t\t\t,-0.991488\n\t\t\t\t,0.0109271\n\t\t\t\t,0.129741\n\t\t\t\t,-0.808012\n\t\t\t\t,-0.236965\n\t\t\t\t,0.539411\n\t\t\t\t,-0.973924\n\t\t\t\t,0.0551524\n\t\t\t\t,-0.22007\n\t\t\t\t,-0.867902\n\t\t\t\t,-0.253714\n\t\t\t\t,-0.427054\n\t\t\t\t,-0.991738\n\t\t\t\t,0.0109112\n\t\t\t\t,0.127815\n\t\t\t\t,-0.817742\n\t\t\t\t,-0.231552\n\t\t\t\t,0.526956\n\t\t\t\t,-0.997571\n\t\t\t\t,0.0377368\n\t\t\t\t,-0.0585581\n\t\t\t\t,-0.985273\n\t\t\t\t,-0.0471937\n\t\t\t\t,-0.164349\n\t\t\t\t,-0.999658\n\t\t\t\t,0.00994682\n\t\t\t\t,0.0241745\n\t\t\t\t,-0.985249\n\t\t\t\t,-0.0473536\n\t\t\t\t,0.164447\n\t\t\t\t,-0.99757\n\t\t\t\t,0.0377302\n\t\t\t\t,-0.0585698\n\t\t\t\t,-0.98524\n\t\t\t\t,-0.0472436\n\t\t\t\t,-0.164531\n\t\t\t\t,-0.999658\n\t\t\t\t,0.00995069\n\t\t\t\t,0.0241815\n\t\t\t\t,-0.985269\n\t\t\t\t,-0.0472916\n\t\t\t\t,0.164343\n\t\t\t\t,-0.0275766\n\t\t\t\t,-0.00162034\n\t\t\t\t,0.999618\n\t\t\t\t,2.92895e-005\n\t\t\t\t,-0.866321\n\t\t\t\t,0.499488\n\t\t\t\t,1.2838e-007\n\t\t\t\t,-0.755826\n\t\t\t\t,0.654773\n\t\t\t\t,-3.21231e-006\n\t\t\t\t,0.1889\n\t\t\t\t,0.981996\n\t\t\t\t,6.88579e-006\n\t\t\t\t,-0.866223\n\t\t\t\t,-0.499657\n\t\t\t\t,-4.69657e-009\n\t\t\t\t,-0.944928\n\t\t\t\t,-0.327279\n\t\t\t\t,-0.0276702\n\t\t\t\t,-0.000995389\n\t\t\t\t,-0.999617\n\t\t\t\t,1.68692e-006\n\t\t\t\t,-0.189029\n\t\t\t\t,-0.981972\n\t\t\t\t,-0.0276286\n\t\t\t\t,-0.00165941\n\t\t\t\t,0.999617\n\t\t\t\t,2.87907e-005\n\t\t\t\t,-0.866386\n\t\t\t\t,0.499375\n\t\t\t\t,-5.58621e-008\n\t\t\t\t,-0.755996\n\t\t\t\t,0.654576\n\t\t\t\t,4.21825e-006\n\t\t\t\t,0.189029\n\t\t\t\t,0.981972\n\t\t\t\t,7.25438e-006\n\t\t\t\t,-0.866137\n\t\t\t\t,-0.499806\n\t\t\t\t,-1.04203e-007\n\t\t\t\t,-0.944883\n\t\t\t\t,-0.327407\n\t\t\t\t,-0.0276164\n\t\t\t\t,-0.00102617\n\t\t\t\t,-0.999618\n\t\t\t\t,-1.28528e-006\n\t\t\t\t,-0.1889\n\t\t\t\t,-0.981996\n\t\t\t\t,-0.00361003\n\t\t\t\t,-0.00208419\n\t\t\t\t,0.999991\n\t\t\t\t,1.69391e-007\n\t\t\t\t,-1.04569e-008\n\t\t\t\t,1\n\t\t\t\t,-1.12927e-008\n\t\t\t\t,6.50157e-009\n\t\t\t\t,1\n\t\t\t\t,-0.00360995\n\t\t\t\t,-0.0020842\n\t\t\t\t,0.999991\n\t\t\t\t,-0.866027\n\t\t\t\t,-0.499994\n\t\t\t\t,-0.00208421\n\t\t\t\t,-0.866027\n\t\t\t\t,0.499994\n\t\t\t\t,0.0020842\n\t\t\t\t,-0.866026\n\t\t\t\t,0.499994\n\t\t\t\t,0.00208422\n\t\t\t\t,-0.866026\n\t\t\t\t,-0.499994\n\t\t\t\t,-0.0020842\n\t\t\t\t,1.69391e-007\n\t\t\t\t,2.03692e-008\n\t\t\t\t,-1\n\t\t\t\t,-0.00361\n\t\t\t\t,0.00208421\n\t\t\t\t,-0.999991\n\t\t\t\t,-0.00360994\n\t\t\t\t,0.0020842\n\t\t\t\t,-0.999991\n\t\t\t\t,1.84449e-008\n\t\t\t\t,5.33166e-009\n\t\t\t\t,-1\n\t\t\t\t,-0.00361065\n\t\t\t\t,-0.00208479\n\t\t\t\t,0.999991\n\t\t\t\t,-1.84453e-008\n\t\t\t\t,1.81304e-008\n\t\t\t\t,1\n\t\t\t\t,-1.69393e-007\n\t\t\t\t,1.49739e-008\n\t\t\t\t,1\n\t\t\t\t,-0.00361096\n\t\t\t\t,-0.00208475\n\t\t\t\t,0.999991\n\t\t\t\t,-0.866027\n\t\t\t\t,-0.499994\n\t\t\t\t,-0.00208469\n\t\t\t\t,-0.866027\n\t\t\t\t,0.499993\n\t\t\t\t,0.00208469\n\t\t\t\t,-0.866025\n\t\t\t\t,0.499997\n\t\t\t\t,0.00208479\n\t\t\t\t,-0.866029\n\t\t\t\t,-0.49999\n\t\t\t\t,-0.00208476\n\t\t\t\t,-1.69393e-007\n\t\t\t\t,-2.13737e-008\n\t\t\t\t,-1\n\t\t\t\t,-0.00361103\n\t\t\t\t,0.00208475\n\t\t\t\t,-0.999991\n\t\t\t\t,-0.00361079\n\t\t\t\t,0.00208471\n\t\t\t\t,-0.999991\n\t\t\t\t,1.12926e-008\n\t\t\t\t,2.73737e-009\n\t\t\t\t,-1\n\t\t\t\t,0.0108945\n\t\t\t\t,-0.739935\n\t\t\t\t,0.67259\n\t\t\t\t,0\n\t\t\t\t,-1\n\t\t\t\t,2.7732e-008\n\t\t\t\t,-0.0309835\n\t\t\t\t,-0.997088\n\t\t\t\t,-0.0696812\n\t\t\t\t,0\n\t\t\t\t,-0.703159\n\t\t\t\t,0.711033\n\t\t\t\t,0\n\t\t\t\t,-2.45688e-007\n\t\t\t\t,1\n\t\t\t\t,0.0175992\n\t\t\t\t,-0.0783506\n\t\t\t\t,0.996771\n\t\t\t\t,0.0107912\n\t\t\t\t,0.660187\n\t\t\t\t,0.751024\n\t\t\t\t,0\n\t\t\t\t,0.703159\n\t\t\t\t,0.711033\n\t\t\t\t,0\n\t\t\t\t,1\n\t\t\t\t,2.7732e-008\n\t\t\t\t,0.0172861\n\t\t\t\t,0.995904\n\t\t\t\t,0.0887452\n\t\t\t\t,0.0108943\n\t\t\t\t,0.739937\n\t\t\t\t,-0.672587\n\t\t\t\t,0\n\t\t\t\t,0.703159\n\t\t\t\t,-0.711033\n\t\t\t\t,0\n\t\t\t\t,-2.45688e-007\n\t\t\t\t,-1\n\t\t\t\t,0\n\t\t\t\t,0.703159\n\t\t\t\t,-0.711033\n\t\t\t\t,0.0108943\n\t\t\t\t,0.739937\n\t\t\t\t,-0.672587\n\t\t\t\t,0.0175992\n\t\t\t\t,0.0783489\n\t\t\t\t,-0.996771\n\t\t\t\t,0.0107913\n\t\t\t\t,-0.660188\n\t\t\t\t,-0.751023\n\t\t\t\t,0\n\t\t\t\t,-0.703159\n\t\t\t\t,-0.711033\n\t\t\t\t,-0.02268\n\t\t\t\t,-0.999695\n\t\t\t\t,-0.00972736\n\t\t\t\t,0.0131054\n\t\t\t\t,-0.702347\n\t\t\t\t,0.711714\n\t\t\t\t,0.0123839\n\t\t\t\t,-0.0122822\n\t\t\t\t,0.999848\n\t\t\t\t,0.0131945\n\t\t\t\t,0.678228\n\t\t\t\t,0.734733\n\t\t\t\t,0.0139963\n\t\t\t\t,0.999666\n\t\t\t\t,0.0217367\n\t\t\t\t,0.0131051\n\t\t\t\t,0.70236\n\t\t\t\t,-0.711702\n\t\t\t\t,0.0131051\n\t\t\t\t,0.70236\n\t\t\t\t,-0.711702\n\t\t\t\t,0.0123841\n\t\t\t\t,0.0122729\n\t\t\t\t,-0.999848\n\t\t\t\t,0.0131942\n\t\t\t\t,-0.678228\n\t\t\t\t,-0.734733\n\t\t\t\t,6.97414e-008\n\t\t\t\t,-0.989097\n\t\t\t\t,0.147265\n\t\t\t\t,6.38197e-008\n\t\t\t\t,-0.582508\n\t\t\t\t,0.812825\n\t\t\t\t,-1.0664e-007\n\t\t\t\t,0.127\n\t\t\t\t,0.991903\n\t\t\t\t,-1.18101e-007\n\t\t\t\t,0.780639\n\t\t\t\t,0.624982\n\t\t\t\t,-1.48067e-007\n\t\t\t\t,0.989099\n\t\t\t\t,-0.147255\n\t\t\t\t,-1.31391e-007\n\t\t\t\t,0.582515\n\t\t\t\t,-0.81282\n\t\t\t\t,0.0123841\n\t\t\t\t,0.0122729\n\t\t\t\t,-0.999848\n\t\t\t\t,0.0131051\n\t\t\t\t,0.70236\n\t\t\t\t,-0.711702\n\t\t\t\t,-1.31391e-007\n\t\t\t\t,0.582515\n\t\t\t\t,-0.81282\n\t\t\t\t,-4.17275e-008\n\t\t\t\t,-0.127018\n\t\t\t\t,-0.9919\n\t\t\t\t,-1.31391e-007\n\t\t\t\t,0.582515\n\t\t\t\t,-0.81282\n\t\t\t\t,-3.31578e-010\n\t\t\t\t,-0.780625\n\t\t\t\t,-0.625\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,-0.223493\n\t\t\t\t,-0.209701\n\t\t\t\t,0.951881\n\t\t\t\t,-0.477287\n\t\t\t\t,-0.420093\n\t\t\t\t,0.771828\n\t\t\t\t,0.416602\n\t\t\t\t,0.496176\n\t\t\t\t,0.761743\n\t\t\t\t,-1\n\t\t\t\t,3.6175e-007\n\t\t\t\t,0\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,-0.852282\n\t\t\t\t,-0.0188769\n\t\t\t\t,-0.522742\n\t\t\t\t,-0.863405\n\t\t\t\t,0.221576\n\t\t\t\t,-0.45325\n\t\t\t\t,-0.669139\n\t\t\t\t,-0.0876216\n\t\t\t\t,-0.737954\n\t\t\t\t,-0.341422\n\t\t\t\t,0.0993401\n\t\t\t\t,-0.934646\n\t\t\t\t,-0.767734\n\t\t\t\t,0.249573\n\t\t\t\t,-0.590167\n\t\t\t\t,0.477286\n\t\t\t\t,0.420094\n\t\t\t\t,-0.771828\n\t\t\t\t,-0.389556\n\t\t\t\t,-0.622092\n\t\t\t\t,-0.679152\n\t\t\t\t,0.389554\n\t\t\t\t,0.622093\n\t\t\t\t,0.679152\n\t\t\t\t,-0.279512\n\t\t\t\t,-0.0974885\n\t\t\t\t,-0.95518\n\t\t\t\t,0.223492\n\t\t\t\t,0.209701\n\t\t\t\t,-0.951881\n\t\t\t\t,-0.416603\n\t\t\t\t,-0.496174\n\t\t\t\t,-0.761743\n\t\t\t\t,0.47017\n\t\t\t\t,-0.156362\n\t\t\t\t,-0.868614\n\t\t\t\t,0.64015\n\t\t\t\t,-0.573225\n\t\t\t\t,-0.511489\n\t\t\t\t,-0.390499\n\t\t\t\t,0.34033\n\t\t\t\t,-0.855387\n\t\t\t\t,-0.849538\n\t\t\t\t,0.0582332\n\t\t\t\t,-0.524303\n\t\t\t\t,0.405257\n\t\t\t\t,0.18912\n\t\t\t\t,-0.894427\n\t\t\t\t,0.64015\n\t\t\t\t,-0.573225\n\t\t\t\t,-0.511489\n\t\t\t\t,-0.849538\n\t\t\t\t,0.0582332\n\t\t\t\t,-0.524303\n\t\t\t\t,-0.640768\n\t\t\t\t,-0.299025\n\t\t\t\t,-0.707107\n\t\t\t\t,-1\n\t\t\t\t,0\n\t\t\t\t,0\n\t\t\t\t,-0.983625\n\t\t\t\t,0.119978\n\t\t\t\t,0.134487\n\t\t\t\t,-1\n\t\t\t\t,4.06969e-007\n\t\t\t\t,0\n\t\t\t\t,-0.807905\n\t\t\t\t,0.256146\n\t\t\t\t,0.530734\n\t\t\t\t,-0.924215\n\t\t\t\t,-0.11535\n\t\t\t\t,0.364034\n\t\t\t\t,-0.640763\n\t\t\t\t,0.365124\n\t\t\t\t,0.675357\n\t\t\t\t,-0.549804\n\t\t\t\t,-0.178005\n\t\t\t\t,0.816106\n\t\t\t\t,-0.585718\n\t\t\t\t,0.523408\n\t\t\t\t,0.618853\n\t\t\t\t,-0.895725\n\t\t\t\t,0.105387\n\t\t\t\t,0.431939\n\t\t\t\t,-1\n\t\t\t\t,0\n\t\t\t\t,0\n\t\t\t\t,-0.504819\n\t\t\t\t,-0.482379\n\t\t\t\t,0.715869\n\t\t\t\t,-0.828167\n\t\t\t\t,-0.421689\n\t\t\t\t,-0.369211\n\t\t\t\t,-0.761859\n\t\t\t\t,0.362239\n\t\t\t\t,-0.536986\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,-0.398332\n\t\t\t\t,0.128825\n\t\t\t\t,0.90815\n\t\t\t\t,-4.41571e-008\n\t\t\t\t,0.000739282\n\t\t\t\t,1\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,-0.00182102\n\t\t\t\t,0.0031858\n\t\t\t\t,-0.999993\n\t\t\t\t,-0.527237\n\t\t\t\t,-0.347745\n\t\t\t\t,-0.775303\n\t\t\t\t,-0.132834\n\t\t\t\t,-0.323941\n\t\t\t\t,-0.936706\n\t\t\t\t,-0.527237\n\t\t\t\t,-0.347745\n\t\t\t\t,-0.775303\n\t\t\t\t,-0.00182102\n\t\t\t\t,-0.00294379\n\t\t\t\t,-0.999994\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,-0.396257\n\t\t\t\t,0.135158\n\t\t\t\t,0.908137\n\t\t\t\t,-0.154807\n\t\t\t\t,0.491034\n\t\t\t\t,0.857275\n\t\t\t\t,-4.41571e-008\n\t\t\t\t,0.000739274\n\t\t\t\t,1\n\t\t\t\t,0.912307\n\t\t\t\t,-0.181634\n\t\t\t\t,0.367023\n\t\t\t\t,0.913246\n\t\t\t\t,-0.183934\n\t\t\t\t,-0.363524\n\t\t\t\t,0.743548\n\t\t\t\t,0.597787\n\t\t\t\t,-0.299647\n\t\t\t\t,0.74672\n\t\t\t\t,0.596033\n\t\t\t\t,0.295219\n\t\t\t\t,0.235084\n\t\t\t\t,-0.236129\n\t\t\t\t,-0.942857\n\t\t\t\t,-0.0020255\n\t\t\t\t,0.00028907\n\t\t\t\t,-0.999998\n\t\t\t\t,-0.00346926\n\t\t\t\t,0\n\t\t\t\t,-0.999994\n\t\t\t\t,0.572751\n\t\t\t\t,0.579636\n\t\t\t\t,-0.579636\n\t\t\t\t,-0.00202193\n\t\t\t\t,0.000289124\n\t\t\t\t,0.999998\n\t\t\t\t,0.232417\n\t\t\t\t,-0.236283\n\t\t\t\t,0.943479\n\t\t\t\t,0.578621\n\t\t\t\t,0.577727\n\t\t\t\t,0.575699\n\t\t\t\t,0\n\t\t\t\t,0\n\t\t\t\t,1\n\t\t\t\t,-0.743548\n\t\t\t\t,-0.597787\n\t\t\t\t,0.299647\n\t\t\t\t,-0.704999\n\t\t\t\t,0.709207\n\t\t\t\t,0.00123748\n\t\t\t\t,-0.912307\n\t\t\t\t,0.181634\n\t\t\t\t,-0.367023\n\t\t\t\t,-0.707111\n\t\t\t\t,-0.707098\n\t\t\t\t,-0.00245311\n\t\t\t\t,-0.709224\n\t\t\t\t,0.704982\n\t\t\t\t,-0.00121562\n\t\t\t\t,-0.74672\n\t\t\t\t,-0.596033\n\t\t\t\t,-0.295219\n\t\t\t\t,-0.707107\n\t\t\t\t,-0.707107\n\t\t\t\t,0\n\t\t\t\t,-0.913246\n\t\t\t\t,0.183934\n\t\t\t\t,0.363524\n\t\t\t\t,-0.997967\n\t\t\t\t,-0.0575083\n\t\t\t\t,-0.0274738\n\t\t\t\t,-1\n\t\t\t\t,0.000320415\n\t\t\t\t,-0.000178581\n\t\t\t\t,-0.993768\n\t\t\t\t,-0.0510411\n\t\t\t\t,-0.0990954\n\t\t\t\t,-0.983829\n\t\t\t\t,0.0357652\n\t\t\t\t,-0.175504\n\t\t\t\t,-0.986428\n\t\t\t\t,-0.132236\n\t\t\t\t,-0.0973335\n\t\t\t\t,-0.987276\n\t\t\t\t,-0.0419982\n\t\t\t\t,-0.153371\n\t\t\t\t,-1\n\t\t\t\t,2.82445e-006\n\t\t\t\t,3.04293e-007\n\t\t\t\t,-1\n\t\t\t\t,2.82445e-006\n\t\t\t\t,4.24779e-007\n\t\t\t\t,-0.830543\n\t\t\t\t,0.556955\n\t\t\t\t,5.39665e-007\n\t\t\t\t,-0.830543\n\t\t\t\t,0.556955\n\t\t\t\t,7.68321e-008\n\t\t\t\t,-1\n\t\t\t\t,2.82445e-006\n\t\t\t\t,-8.40155e-008\n\t\t\t\t,-0.830543\n\t\t\t\t,0.556955\n\t\t\t\t,1.058e-007\n\t\t\t\t,-1\n\t\t\t\t,1.11515e-006\n\t\t\t\t,-1.78259e-008\n\t\t\t\t,-0.842689\n\t\t\t\t,0.515139\n\t\t\t\t,-0.156549\n\t\t\t\t,-1\n\t\t\t\t,2.82445e-006\n\t\t\t\t,1.14856e-007\n\t\t\t\t,-0.830543\n\t\t\t\t,0.556955\n\t\t\t\t,2.5815e-007\n\t\t\t\t,-1\n\t\t\t\t,2.82445e-006\n\t\t\t\t,2.12345e-007\n\t\t\t\t,-0.830543\n\t\t\t\t,0.556955\n\t\t\t\t,2.55209e-007\n\t\t\t\t,-1\n\t\t\t\t,2.82445e-006\n\t\t\t\t,2.09363e-007\n\t\t\t\t,-0.836059\n\t\t\t\t,0.54641\n\t\t\t\t,0.0494127\n\t\t\t\t,-1\n\t\t\t\t,3.20275e-006\n\t\t\t\t,-5.23691e-008\n\t\t\t\t,-0.871677\n\t\t\t\t,0.481457\n\t\t\t\t,-0.0915289\n\t\t\t\t,-0.999712\n\t\t\t\t,0.0239317\n\t\t\t\t,-0.00190882\n\t\t\t\t,-0.828268\n\t\t\t\t,0.547386\n\t\t\t\t,0.119753\n\t\t\t\t,-1\n\t\t\t\t,-1.10117e-006\n\t\t\t\t,-1.05688e-007\n\t\t\t\t,-0.872971\n\t\t\t\t,0.436329\n\t\t\t\t,-0.218035\n\t\t\t\t,-0.99968\n\t\t\t\t,0.0251831\n\t\t\t\t,-0.00231335\n\t\t\t\t,-0.918405\n\t\t\t\t,0.371684\n\t\t\t\t,-0.135586\n\t\t\t\t,-0.997381\n\t\t\t\t,0.0652659\n\t\t\t\t,0.0311798\n\t\t\t\t,-0.985106\n\t\t\t\t,0.129444\n\t\t\t\t,-0.113186\n\t\t\t\t,0.997847\n\t\t\t\t,-9.89625e-006\n\t\t\t\t,-0.0655852\n\t\t\t\t,0.992972\n\t\t\t\t,-0.00669359\n\t\t\t\t,-0.118159\n\t\t\t\t,0.918457\n\t\t\t\t,-0.315448\n\t\t\t\t,-0.238599\n\t\t\t\t,0.987458\n\t\t\t\t,0.0305527\n\t\t\t\t,-0.1549\n\t\t\t\t,0.974722\n\t\t\t\t,-0.0296636\n\t\t\t\t,-0.221443\n\t\t\t\t,0.827203\n\t\t\t\t,-0.541779\n\t\t\t\t,-0.149033\n\t\t\t\t,-0.705857\n\t\t\t\t,0.708126\n\t\t\t\t,-0.0179683\n\t\t\t\t,0\n\t\t\t\t,1\n\t\t\t\t,1.28542e-006\n\t\t\t\t,-0.559844\n\t\t\t\t,0.828552\n\t\t\t\t,-0.00872875\n\t\t\t\t,-0.755065\n\t\t\t\t,0.655638\n\t\t\t\t,-0.00397711\n\t\t\t\t,-0.655941\n\t\t\t\t,0.754803\n\t\t\t\t,0.00369167\n\t\t\t\t,0\n\t\t\t\t,1\n\t\t\t\t,-1.45679e-006\n\t\t\t\t,0.454661\n\t\t\t\t,0.890595\n\t\t\t\t,-0.0111479\n\t\t\t\t,-0.435118\n\t\t\t\t,0.900372\n\t\t\t\t,-0.00177599\n\t\t\t\t,0.426285\n\t\t\t\t,0.901867\n\t\t\t\t,0.0701275\n\t\t\t\t,0.503495\n\t\t\t\t,0.85856\n\t\t\t\t,-0.0967891\n\t\t\t\t,0.520985\n\t\t\t\t,0.853565\n\t\t\t\t,-0.00135007\n\t\t\t\t,-0.509945\n\t\t\t\t,0.860207\n\t\t\t\t,-0.000731756\n\t\t\t\t,0.389117\n\t\t\t\t,0.916966\n\t\t\t\t,0.0880983\n\t\t\t\t,-0.585422\n\t\t\t\t,0.810069\n\t\t\t\t,-0.0326849\n\t\t\t\t,0.0689144\n\t\t\t\t,0.992236\n\t\t\t\t,0.10353\n\t\t\t\t,0.308362\n\t\t\t\t,0.951215\n\t\t\t\t,0.0101676\n\t\t\t\t,-0.591386\n\t\t\t\t,0.806327\n\t\t\t\t,-0.0100184\n\t\t\t\t,0.290726\n\t\t\t\t,0.956802\n\t\t\t\t,0.00298917\n\t\t\t\t,-0.7694\n\t\t\t\t,0.638725\n\t\t\t\t,0.00736961\n\t\t\t\t,0.226078\n\t\t\t\t,0.974109\n\t\t\t\t,-0.000388153\n\t\t\t\t,-0.624699\n\t\t\t\t,0.446731\n\t\t\t\t,0.640455\n\t\t\t\t,0.03811\n\t\t\t\t,0.99824\n\t\t\t\t,-0.0454488\n\t\t\t\t,-0.777048\n\t\t\t\t,0.407267\n\t\t\t\t,0.479928\n\t\t\t\t,-0.736651\n\t\t\t\t,0.675801\n\t\t\t\t,0.0252549\n\t\t\t\t,-0.764744\n\t\t\t\t,0.644321\n\t\t\t\t,0.00423862\n\t\t\t\t,-0.705857\n\t\t\t\t,0.708126\n\t\t\t\t,-0.0179683\n\t\t\t\t,-0.559844\n\t\t\t\t,0.828552\n\t\t\t\t,-0.00872875\n\t\t\t\t,-0.788354\n\t\t\t\t,0.615221\n\t\t\t\t,0.00121186\n\t\t\t\t,-0.755065\n\t\t\t\t,0.655638\n\t\t\t\t,-0.00397711\n\t\t\t\t,-0.812017\n\t\t\t\t,0.576844\n\t\t\t\t,-0.0887654\n\t\t\t\t,-0.655941\n\t\t\t\t,0.754803\n\t\t\t\t,0.00369167\n\t\t\t\t,-0.705293\n\t\t\t\t,0.708668\n\t\t\t\t,0.0187526\n\t\t\t\t,-0.435118\n\t\t\t\t,0.900372\n\t\t\t\t,-0.00177599\n\t\t\t\t,-0.999946\n\t\t\t\t,0.00724259\n\t\t\t\t,-0.00739581\n\t\t\t\t,-0.991861\n\t\t\t\t,0.125333\n\t\t\t\t,0.0224383\n\t\t\t\t,-0.455167\n\t\t\t\t,-0.89025\n\t\t\t\t,-0.0166657\n\t\t\t\t,-0.447415\n\t\t\t\t,-0.889189\n\t\t\t\t,0.0957192\n\t\t\t\t,-0.935437\n\t\t\t\t,-0.343431\n\t\t\t\t,0.0837416\n\t\t\t\t,-0.526887\n\t\t\t\t,-0.847916\n\t\t\t\t,-0.0585537\n\t\t\t\t,-0.660574\n\t\t\t\t,0.750674\n\t\t\t\t,0.011427\n\t\t\t\t,-0.509945\n\t\t\t\t,0.860207\n\t\t\t\t,-0.000731756\n\t\t\t\t,-0.52099\n\t\t\t\t,-0.853563\n\t\t\t\t,-0.000889001\n\t\t\t\t,-0.948091\n\t\t\t\t,-0.317997\n\t\t\t\t,-0.00126181\n\t\t\t\t,-0.719424\n\t\t\t\t,0.694413\n\t\t\t\t,0.0147913\n\t\t\t\t,-0.585422\n\t\t\t\t,0.810069\n\t\t\t\t,-0.0326849\n\t\t\t\t,-0.955489\n\t\t\t\t,-0.294937\n\t\t\t\t,-0.00732502\n\t\t\t\t,-0.424833\n\t\t\t\t,-0.899201\n\t\t\t\t,0.104665\n\t\t\t\t,-0.920386\n\t\t\t\t,-0.390933\n\t\t\t\t,0.00777882\n\t\t\t\t,-0.869582\n\t\t\t\t,0.464234\n\t\t\t\t,-0.168267\n\t\t\t\t,-0.94728\n\t\t\t\t,0.262453\n\t\t\t\t,-0.183793\n\t\t\t\t,-0.185208\n\t\t\t\t,-0.960441\n\t\t\t\t,0.20797\n\t\t\t\t,-0.714563\n\t\t\t\t,-0.548679\n\t\t\t\t,0.433994\n\t\t\t\t,-0.141208\n\t\t\t\t,-0.431379\n\t\t\t\t,0.891051\n\t\t\t\t,-0.935886\n\t\t\t\t,0.322808\n\t\t\t\t,-0.141113\n\t\t\t\t,-0.747349\n\t\t\t\t,0.508342\n\t\t\t\t,0.427853\n\t\t\t\t,-0.917491\n\t\t\t\t,-0.397449\n\t\t\t\t,-0.0156682\n\t\t\t\t,-0.308974\n\t\t\t\t,-0.951014\n\t\t\t\t,0.0103827\n\t\t\t\t,-0.892567\n\t\t\t\t,0.423954\n\t\t\t\t,-0.15358\n\t\t\t\t,-0.591386\n\t\t\t\t,0.806327\n\t\t\t\t,-0.0100184\n\t\t\t\t,-0.83389\n\t\t\t\t,-0.550948\n\t\t\t\t,-0.0329179\n\t\t\t\t,-0.290783\n\t\t\t\t,-0.956784\n\t\t\t\t,0.00300491\n\t\t\t\t,-0.941521\n\t\t\t\t,0.312103\n\t\t\t\t,-0.127005\n\t\t\t\t,-0.7694\n\t\t\t\t,0.638725\n\t\t\t\t,0.00736961\n\t\t\t\t,-0.802496\n\t\t\t\t,-0.595792\n\t\t\t\t,-0.0321219\n\t\t\t\t,-0.226079\n\t\t\t\t,-0.974109\n\t\t\t\t,-0.00059471\n\t\t\t\t,-0.903328\n\t\t\t\t,-0.2491\n\t\t\t\t,-0.349211\n\t\t\t\t,-0.931115\n\t\t\t\t,0.220888\n\t\t\t\t,-0.290231\n\t\t\t\t,-0.986428\n\t\t\t\t,-0.132236\n\t\t\t\t,-0.0973335\n\t\t\t\t,-0.526489\n\t\t\t\t,-0.759106\n\t\t\t\t,-0.382842\n\t\t\t\t,-0.366856\n\t\t\t\t,-0.899308\n\t\t\t\t,-0.238038\n\t\t\t\t,-0.759812\n\t\t\t\t,-0.649985\n\t\t\t\t,0.0142999\n\t\t\t\t,-0.562649\n\t\t\t\t,-0.714006\n\t\t\t\t,-0.416678\n\t\t\t\t,-0.777048\n\t\t\t\t,0.407267\n\t\t\t\t,0.479928\n\t\t\t\t,0.0689144\n\t\t\t\t,0.992236\n\t\t\t\t,0.10353\n\t\t\t\t,0.830543\n\t\t\t\t,-0.556955\n\t\t\t\t,0\n\t\t\t\t,0.830543\n\t\t\t\t,-0.556955\n\t\t\t\t,0\n\t\t\t\t,0.764698\n\t\t\t\t,-0.644374\n\t\t\t\t,0.00429268\n\t\t\t\t,0.734963\n\t\t\t\t,-0.677684\n\t\t\t\t,0.0239707\n\t\t\t\t,0.830543\n\t\t\t\t,-0.556955\n\t\t\t\t,0\n\t\t\t\t,0.788351\n\t\t\t\t,-0.615225\n\t\t\t\t,0.00121686\n\t\t\t\t,0.800918\n\t\t\t\t,-0.580014\n\t\t\t\t,-0.14871\n\t\t\t\t,0.797353\n\t\t\t\t,-0.597315\n\t\t\t\t,-0.0862683\n\t\t\t\t,0.830543\n\t\t\t\t,-0.556955\n\t\t\t\t,0\n\t\t\t\t,0.704251\n\t\t\t\t,-0.709743\n\t\t\t\t,0.0172141\n\t\t\t\t,0.830543\n\t\t\t\t,-0.556955\n\t\t\t\t,0\n\t\t\t\t,0.660067\n\t\t\t\t,-0.751132\n\t\t\t\t,0.0106532\n\t\t\t\t,0.831806\n\t\t\t\t,-0.552703\n\t\t\t\t,0.0511714\n\t\t\t\t,0.718413\n\t\t\t\t,-0.695404\n\t\t\t\t,0.0171949\n\t\t\t\t,0.856939\n\t\t\t\t,-0.506168\n\t\t\t\t,-0.097211\n\t\t\t\t,0.824748\n\t\t\t\t,-0.547188\n\t\t\t\t,-0.142744\n\t\t\t\t,0.683381\n\t\t\t\t,-0.651398\n\t\t\t\t,-0.329653\n\t\t\t\t,0.694764\n\t\t\t\t,-0.68954\n\t\t\t\t,0.204545\n\t\t\t\t,0.52249\n\t\t\t\t,-0.812064\n\t\t\t\t,-0.259918\n\t\t\t\t,0.827203\n\t\t\t\t,-0.541779\n\t\t\t\t,-0.149033\n\t\t\t\t,0.914563\n\t\t\t\t,-0.382999\n\t\t\t\t,-0.12995\n\t\t\t\t,0.817866\n\t\t\t\t,-0.571446\n\t\t\t\t,0.0674227\n\t\t\t\t,0.559876\n\t\t\t\t,-0.778808\n\t\t\t\t,-0.282839\n\t\t\t\t,0.918457\n\t\t\t\t,-0.315448\n\t\t\t\t,-0.238599\n\t\t\t\t,0.789697\n\t\t\t\t,-0.585238\n\t\t\t\t,-0.184052\n\t\t\t\t,0.859345\n\t\t\t\t,-0.487561\n\t\t\t\t,-0.154304\n\t\t\t\t,0.878387\n\t\t\t\t,-0.455547\n\t\t\t\t,-0.144613\n\t\t\t\t,0.927622\n\t\t\t\t,-0.35229\n\t\t\t\t,-0.124132\n\t\t\t\t,0.862831\n\t\t\t\t,-0.483343\n\t\t\t\t,-0.147997\n\t\t\t\t,0.849184\n\t\t\t\t,-0.419916\n\t\t\t\t,-0.320245\n\t\t\t\t,-0.999537\n\t\t\t\t,0.0258918\n\t\t\t\t,0.0159835\n\t\t\t\t,-0.996382\n\t\t\t\t,-0.0178275\n\t\t\t\t,0.0830995\n\t\t\t\t,-0.99395\n\t\t\t\t,-0.048829\n\t\t\t\t,0.0983867\n\t\t\t\t,-0.999532\n\t\t\t\t,0.0213503\n\t\t\t\t,0.0219101\n\t\t\t\t,-0.999998\n\t\t\t\t,0.00216411\n\t\t\t\t,-0.000152182\n\t\t\t\t,-0.999998\n\t\t\t\t,0.000779111\n\t\t\t\t,-0.0018566\n\t\t\t\t,-0.990986\n\t\t\t\t,-0.10809\n\t\t\t\t,0.0791359\n\t\t\t\t,-0.995324\n\t\t\t\t,-0.0960751\n\t\t\t\t,-0.0100061\n\t\t\t\t,-0.99991\n\t\t\t\t,0.00253381\n\t\t\t\t,-0.0131592\n\t\t\t\t,-0.999983\n\t\t\t\t,0.00402038\n\t\t\t\t,0.00412579\n\t\t\t\t,-0.989423\n\t\t\t\t,-0.142164\n\t\t\t\t,-0.0288407\n\t\t\t\t,-0.983185\n\t\t\t\t,-0.160274\n\t\t\t\t,-0.0875146\n\t\t\t\t,-0.98616\n\t\t\t\t,-0.141079\n\t\t\t\t,-0.0870906\n\t\t\t\t,-0.987345\n\t\t\t\t,-0.156908\n\t\t\t\t,-0.0230018\n\t\t\t\t,-0.996483\n\t\t\t\t,-0.0742679\n\t\t\t\t,-0.0388154\n\t\t\t\t,-0.99404\n\t\t\t\t,-0.0925872\n\t\t\t\t,-0.0575508\n\t\t\t\t,-0.993912\n\t\t\t\t,-0.0889351\n\t\t\t\t,0.0650331\n\t\t\t\t,-0.972498\n\t\t\t\t,-0.214106\n\t\t\t\t,0.0916869\n\t\t\t\t,-0.948091\n\t\t\t\t,-0.317997\n\t\t\t\t,-0.00126181\n\t\t\t\t,-0.935437\n\t\t\t\t,-0.343431\n\t\t\t\t,0.0837416\n\t\t\t\t,-0.955489\n\t\t\t\t,-0.294937\n\t\t\t\t,-0.00732502\n\t\t\t\t,-0.920386\n\t\t\t\t,-0.390933\n\t\t\t\t,0.00777882\n\t\t\t\t,-0.714563\n\t\t\t\t,-0.548679\n\t\t\t\t,0.433994\n\t\t\t\t,-0.838368\n\t\t\t\t,0.283993\n\t\t\t\t,0.465281\n\t\t\t\t,0\n\t\t\t\t,0.386953\n\t\t\t\t,-0.922099\n\t\t\t\t,0\n\t\t\t\t,0.850923\n\t\t\t\t,0.52529\n\t\t\t\t,0\n\t\t\t\t,0.697899\n\t\t\t\t,0.716196\n\t\t\t\t,0\n\t\t\t\t,0.189077\n\t\t\t\t,-0.981962\n\t\t\t\t,-1\n\t\t\t\t,-6.58949e-007\n\t\t\t\t,-6.57428e-008\n\t\t\t\t,-1\n\t\t\t\t,3.53699e-006\n\t\t\t\t,-9.18438e-008\n\t\t\t\t,-0.960324\n\t\t\t\t,0.276512\n\t\t\t\t,0.0363171\n\t\t\t\t,-0.923116\n\t\t\t\t,0.382387\n\t\t\t\t,-0.0404567\n\t\t\t\t,-0.999998\n\t\t\t\t,0.00216411\n\t\t\t\t,-0.000152182\n\t\t\t\t,-0.995324\n\t\t\t\t,-0.0960751\n\t\t\t\t,-0.0100061\n\t\t\t\t,-1\n\t\t\t\t,-2.40393e-006\n\t\t\t\t,-3.88114e-007\n\t\t\t\t,-0.992324\n\t\t\t\t,0.123604\n\t\t\t\t,-0.0038891\n\t\t\t\t,-0.991861\n\t\t\t\t,0.125333\n\t\t\t\t,0.0224383\n\t\t\t\t,-0.999946\n\t\t\t\t,0.00724259\n\t\t\t\t,-0.00739581\n\t\t\t\t,-0.935437\n\t\t\t\t,-0.343431\n\t\t\t\t,0.0837416\n\t\t\t\t,-0.735604\n\t\t\t\t,0.0550272\n\t\t\t\t,-0.675173\n\t\t\t\t,-0.917491\n\t\t\t\t,-0.397449\n\t\t\t\t,-0.0156682\n\t\t\t\t,-1\n\t\t\t\t,-1.36153e-006\n\t\t\t\t,-1.27821e-007\n\t\t\t\t,-1\n\t\t\t\t,-2.40393e-006\n\t\t\t\t,-3.88114e-007\n\t\t\t\t,-0.992324\n\t\t\t\t,0.123604\n\t\t\t\t,-0.0038891\n\t\t\t\t,-0.998542\n\t\t\t\t,-0.0465329\n\t\t\t\t,-0.0273508\n\t\t\t\t,-1\n\t\t\t\t,2.0732e-008\n\t\t\t\t,-1.32789e-007\n\t\t\t\t,-0.990722\n\t\t\t\t,-0.131809\n\t\t\t\t,-0.0331123\n\t\t\t\t,-1\n\t\t\t\t,0.000320415\n\t\t\t\t,-0.000178581\n\t\t\t\t,-0.993768\n\t\t\t\t,-0.0510411\n\t\t\t\t,-0.0990954\n\t\t\t\t,-0.917491\n\t\t\t\t,-0.397449\n\t\t\t\t,-0.0156682\n\t\t\t\t,-0.83389\n\t\t\t\t,-0.550948\n\t\t\t\t,-0.0329179\n\t\t\t\t,-0.802496\n\t\t\t\t,-0.595792\n\t\t\t\t,-0.0321219\n\t\t\t\t,-0.986428\n\t\t\t\t,-0.132236\n\t\t\t\t,-0.0973335\n\t\t\t\t,-0.816155\n\t\t\t\t,0.232159\n\t\t\t\t,-0.529143\n\t\t\t\t,-0.813652\n\t\t\t\t,0.52565\n\t\t\t\t,-0.24832\n\t\t\t\t,-0.939238\n\t\t\t\t,0.325823\n\t\t\t\t,-0.108034\n\t\t\t\t,-0.239686\n\t\t\t\t,0.870578\n\t\t\t\t,-0.429703\n\t\t\t\t,0.105228\n\t\t\t\t,-0.274007\n\t\t\t\t,-0.955953\n\t\t\t\t,-0.291336\n\t\t\t\t,-0.0357272\n\t\t\t\t,-0.955954\n\t\t\t\t,-0.324995\n\t\t\t\t,0.656888\n\t\t\t\t,-0.68035\n\t\t\t\t,0.728749\n\t\t\t\t,-0.127808\n\t\t\t\t,-0.672749\n\t\t\t\t,0.872154\n\t\t\t\t,-0.433832\n\t\t\t\t,-0.226135\n\t\t\t\t,0.728749\n\t\t\t\t,-0.127808\n\t\t\t\t,-0.672749\n\t\t\t\t,0.881201\n\t\t\t\t,0.19708\n\t\t\t\t,-0.429703\n\t\t\t\t,0.744618\n\t\t\t\t,-0.64261\n\t\t\t\t,-0.180545\n\t\t\t\t,0.535068\n\t\t\t\t,-0.696867\n\t\t\t\t,-0.477577\n\t\t\t\t,-0.918921\n\t\t\t\t,-0.253505\n\t\t\t\t,0.302192\n\t\t\t\t,-0.939238\n\t\t\t\t,0.325823\n\t\t\t\t,-0.108034\n\t\t\t\t,-0.916967\n\t\t\t\t,0.355773\n\t\t\t\t,0.180544\n\t\t\t\t,-0.866495\n\t\t\t\t,0.145278\n\t\t\t\t,-0.477577\n\t\t\t\t,-0.207575\n\t\t\t\t,0.930372\n\t\t\t\t,-0.302192\n\t\t\t\t,-0.690656\n\t\t\t\t,0.723009\n\t\t\t\t,-0.0159115\n\t\t\t\t,-0.813652\n\t\t\t\t,0.52565\n\t\t\t\t,-0.24832\n\t\t\t\t,-0.535068\n\t\t\t\t,0.696867\n\t\t\t\t,0.477577\n\t\t\t\t,-0.85708\n\t\t\t\t,0.270946\n\t\t\t\t,-0.438181\n\t\t\t\t,-0.0807288\n\t\t\t\t,0.471967\n\t\t\t\t,-0.877912\n\t\t\t\t,6.40677e-006\n\t\t\t\t,0.514547\n\t\t\t\t,-0.857462\n\t\t\t\t,-0.913242\n\t\t\t\t,0.225221\n\t\t\t\t,-0.339506\n\t\t\t\t,-0.813342\n\t\t\t\t,-0.301365\n\t\t\t\t,0.497648\n\t\t\t\t,-0.857591\n\t\t\t\t,-0.254681\n\t\t\t\t,0.44685\n\t\t\t\t,9.78097e-006\n\t\t\t\t,-0.514546\n\t\t\t\t,0.857463\n\t\t\t\t,0.0888402\n\t\t\t\t,-0.601461\n\t\t\t\t,0.793947\n\t\t\t\t,-0.89894\n\t\t\t\t,0.235268\n\t\t\t\t,-0.369536\n\t\t\t\t,-0.117052\n\t\t\t\t,0.454501\n\t\t\t\t,-0.883022\n\t\t\t\t,-9.78127e-006\n\t\t\t\t,0.514545\n\t\t\t\t,-0.857463\n\t\t\t\t,-0.856911\n\t\t\t\t,0.274998\n\t\t\t\t,-0.43598\n\t\t\t\t,-0.857494\n\t\t\t\t,-0.258752\n\t\t\t\t,0.444691\n\t\t\t\t,-0.793899\n\t\t\t\t,-0.318942\n\t\t\t\t,0.517688\n\t\t\t\t,0.068395\n\t\t\t\t,-0.569894\n\t\t\t\t,0.818867\n\t\t\t\t,-6.40692e-006\n\t\t\t\t,-0.514552\n\t\t\t\t,0.857459\n\t\t\t\t,-0.869955\n\t\t\t\t,0.274844\n\t\t\t\t,-0.409437\n\t\t\t\t,-0.0833837\n\t\t\t\t,0.323442\n\t\t\t\t,-0.942567\n\t\t\t\t,-0.882691\n\t\t\t\t,-0.249425\n\t\t\t\t,0.3983\n\t\t\t\t,-0.0935362\n\t\t\t\t,-0.67495\n\t\t\t\t,0.731911\n\t\t\t\t,-0.870708\n\t\t\t\t,0.27511\n\t\t\t\t,-0.407654\n\t\t\t\t,-0.0933141\n\t\t\t\t,0.314358\n\t\t\t\t,-0.944707\n\t\t\t\t,-0.881142\n\t\t\t\t,-0.250932\n\t\t\t\t,0.400776\n\t\t\t\t,-0.0866726\n\t\t\t\t,-0.669291\n\t\t\t\t,0.737928\n\t\t\t\t,-0.908848\n\t\t\t\t,0.259524\n\t\t\t\t,-0.32656\n\t\t\t\t,-0.388306\n\t\t\t\t,0.11189\n\t\t\t\t,-0.914712\n\t\t\t\t,-0.939037\n\t\t\t\t,-0.174607\n\t\t\t\t,0.296177\n\t\t\t\t,-0.34626\n\t\t\t\t,-0.729264\n\t\t\t\t,0.590151\n\t\t\t\t,-0.909424\n\t\t\t\t,0.259445\n\t\t\t\t,-0.325017\n\t\t\t\t,-0.385592\n\t\t\t\t,0.115156\n\t\t\t\t,-0.915455\n\t\t\t\t,-0.940484\n\t\t\t\t,-0.172305\n\t\t\t\t,0.292916\n\t\t\t\t,-0.347915\n\t\t\t\t,-0.729789\n\t\t\t\t,0.588527\n\t\t\t\t,-0.970804\n\t\t\t\t,0.170841\n\t\t\t\t,-0.168383\n\t\t\t\t,-0.854899\n\t\t\t\t,-0.0129293\n\t\t\t\t,-0.518634\n\t\t\t\t,-0.989894\n\t\t\t\t,-0.0651038\n\t\t\t\t,0.12598\n\t\t\t\t,-0.78082\n\t\t\t\t,-0.508466\n\t\t\t\t,0.363018\n\t\t\t\t,-0.969363\n\t\t\t\t,0.174109\n\t\t\t\t,-0.173266\n\t\t\t\t,-0.845866\n\t\t\t\t,-0.0126986\n\t\t\t\t,-0.533244\n\t\t\t\t,-0.990182\n\t\t\t\t,-0.0640605\n\t\t\t\t,0.124238\n\t\t\t\t,-0.791492\n\t\t\t\t,-0.497549\n\t\t\t\t,0.354944\n\t\t\t\t,-0.99692\n\t\t\t\t,0.0702108\n\t\t\t\t,-0.034947\n\t\t\t\t,-0.982677\n\t\t\t\t,0.0422041\n\t\t\t\t,-0.180458\n\t\t\t\t,-0.999622\n\t\t\t\t,-0.00489406\n\t\t\t\t,0.0270462\n\t\t\t\t,-0.982659\n\t\t\t\t,-0.135147\n\t\t\t\t,0.126954\n\t\t\t\t,-0.996919\n\t\t\t\t,0.0702115\n\t\t\t\t,-0.0349597\n\t\t\t\t,-0.982639\n\t\t\t\t,0.0422481\n\t\t\t\t,-0.180652\n\t\t\t\t,-0.999622\n\t\t\t\t,-0.0048911\n\t\t\t\t,0.0270598\n\t\t\t\t,-0.982683\n\t\t\t\t,-0.135031\n\t\t\t\t,0.126888\n\t\t\t\t,-0.0326337\n\t\t\t\t,-0.500829\n\t\t\t\t,0.864931\n\t\t\t\t,3.22793e-005\n\t\t\t\t,-0.999871\n\t\t\t\t,0.0160862\n\t\t\t\t,1.51613e-007\n\t\t\t\t,-0.981467\n\t\t\t\t,0.191634\n\t\t\t\t,-4.47211e-006\n\t\t\t\t,-0.319155\n\t\t\t\t,0.947702\n\t\t\t\t,1.11493e-005\n\t\t\t\t,-0.530129\n\t\t\t\t,-0.847917\n\t\t\t\t,-1.35144e-008\n\t\t\t\t,-0.685443\n\t\t\t\t,-0.728126\n\t\t\t\t,-0.0327689\n\t\t\t\t,0.497754\n\t\t\t\t,-0.866699\n\t\t\t\t,2.0258e-006\n\t\t\t\t,0.319005\n\t\t\t\t,-0.947753\n\t\t\t\t,-0.0326949\n\t\t\t\t,-0.500851\n\t\t\t\t,0.864916\n\t\t\t\t,3.17023e-005\n\t\t\t\t,-0.999873\n\t\t\t\t,0.0159628\n\t\t\t\t,-6.66766e-008\n\t\t\t\t,-0.981514\n\t\t\t\t,0.19139\n\t\t\t\t,5.16401e-006\n\t\t\t\t,-0.319005\n\t\t\t\t,0.947753\n\t\t\t\t,1.15952e-005\n\t\t\t\t,-0.529973\n\t\t\t\t,-0.848015\n\t\t\t\t,-1.34364e-007\n\t\t\t\t,-0.685337\n\t\t\t\t,-0.728227\n\t\t\t\t,-0.0327056\n\t\t\t\t,0.497741\n\t\t\t\t,-0.866709\n\t\t\t\t,-1.75534e-006\n\t\t\t\t,0.319155\n\t\t\t\t,-0.947702\n\t\t\t\t,-0.895725\n\t\t\t\t,0.105387\n\t\t\t\t,0.431939\n\t\t\t\t,-1\n\t\t\t\t,0\n\t\t\t\t,0\n\t\t\t\t,-0.504819\n\t\t\t\t,-0.482379\n\t\t\t\t,0.715869\n\t\t\t\t,-0.828167\n\t\t\t\t,-0.421689\n\t\t\t\t,-0.369211\n\t\t\t\t,-0.761859\n\t\t\t\t,0.362239\n\t\t\t\t,-0.536986\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,-0.398332\n\t\t\t\t,0.128825\n\t\t\t\t,0.908149\n\t\t\t\t,1.41651e-012\n\t\t\t\t,0.000739282\n\t\t\t\t,1\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,-0.001821\n\t\t\t\t,0.0031858\n\t\t\t\t,-0.999993\n\t\t\t\t,-0.527237\n\t\t\t\t,-0.347746\n\t\t\t\t,-0.775303\n\t\t\t\t,-0.132834\n\t\t\t\t,-0.323941\n\t\t\t\t,-0.936706\n\t\t\t\t,-0.527237\n\t\t\t\t,-0.347746\n\t\t\t\t,-0.775303\n\t\t\t\t,-0.001821\n\t\t\t\t,-0.00294379\n\t\t\t\t,-0.999994\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,-0.396257\n\t\t\t\t,0.135158\n\t\t\t\t,0.908137\n\t\t\t\t,-0.154807\n\t\t\t\t,0.491034\n\t\t\t\t,0.857275\n\t\t\t\t,1.41486e-012\n\t\t\t\t,0.000739274\n\t\t\t\t,1\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,-0.219572\n\t\t\t\t,-0.202719\n\t\t\t\t,0.954303\n\t\t\t\t,-0.475757\n\t\t\t\t,-0.408175\n\t\t\t\t,0.779134\n\t\t\t\t,0.418557\n\t\t\t\t,0.483631\n\t\t\t\t,0.768707\n\t\t\t\t,-1\n\t\t\t\t,3.6175e-007\n\t\t\t\t,0\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,-1\n\t\t\t\t,0\n\t\t\t\t,0\n\t\t\t\t,-0.84865\n\t\t\t\t,-0.0193074\n\t\t\t\t,-0.528602\n\t\t\t\t,-0.854459\n\t\t\t\t,0.223354\n\t\t\t\t,-0.469054\n\t\t\t\t,-0.651469\n\t\t\t\t,-0.0843326\n\t\t\t\t,-0.753973\n\t\t\t\t,-0.330731\n\t\t\t\t,0.0926065\n\t\t\t\t,-0.939171\n\t\t\t\t,-0.767734\n\t\t\t\t,0.249573\n\t\t\t\t,-0.590167\n\t\t\t\t,0.475756\n\t\t\t\t,0.408175\n\t\t\t\t,-0.779134\n\t\t\t\t,-0.389556\n\t\t\t\t,-0.622092\n\t\t\t\t,-0.679152\n\t\t\t\t,0.389554\n\t\t\t\t,0.622093\n\t\t\t\t,0.679152\n\t\t\t\t,-0.272343\n\t\t\t\t,-0.093852\n\t\t\t\t,-0.957612\n\t\t\t\t,0.219571\n\t\t\t\t,0.20272\n\t\t\t\t,-0.954302\n\t\t\t\t,-0.418558\n\t\t\t\t,-0.48363\n\t\t\t\t,-0.768707\n\t\t\t\t,0.458573\n\t\t\t\t,-0.14988\n\t\t\t\t,-0.875926\n\t\t\t\t,0.738592\n\t\t\t\t,-0.346601\n\t\t\t\t,-0.578229\n\t\t\t\t,-0.385401\n\t\t\t\t,0.327366\n\t\t\t\t,-0.862727\n\t\t\t\t,-0.845857\n\t\t\t\t,0.0583779\n\t\t\t\t,-0.530205\n\t\t\t\t,0.296538\n\t\t\t\t,0.215382\n\t\t\t\t,-0.930417\n\t\t\t\t,0.738592\n\t\t\t\t,-0.346601\n\t\t\t\t,-0.578229\n\t\t\t\t,-0.845857\n\t\t\t\t,0.0583779\n\t\t\t\t,-0.530205\n\t\t\t\t,-0.640768\n\t\t\t\t,-0.299025\n\t\t\t\t,-0.707107\n\t\t\t\t,-1\n\t\t\t\t,0\n\t\t\t\t,0\n\t\t\t\t,-0.947738\n\t\t\t\t,0.147993\n\t\t\t\t,0.28265\n\t\t\t\t,-0.979704\n\t\t\t\t,0.0139322\n\t\t\t\t,0.199966\n\t\t\t\t,-0.798141\n\t\t\t\t,0.256996\n\t\t\t\t,0.544908\n\t\t\t\t,-0.850743\n\t\t\t\t,-0.0976276\n\t\t\t\t,0.516436\n\t\t\t\t,-0.622361\n\t\t\t\t,0.351164\n\t\t\t\t,0.699536\n\t\t\t\t,-0.535047\n\t\t\t\t,-0.169815\n\t\t\t\t,0.827579\n\t\t\t\t,-0.658246\n\t\t\t\t,0.625319\n\t\t\t\t,0.419151\n\t\t\t\t,0.0108945\n\t\t\t\t,-0.739936\n\t\t\t\t,0.672589\n\t\t\t\t,0\n\t\t\t\t,-1\n\t\t\t\t,2.7732e-008\n\t\t\t\t,-0.0309834\n\t\t\t\t,-0.997088\n\t\t\t\t,-0.0696804\n\t\t\t\t,0\n\t\t\t\t,-0.703159\n\t\t\t\t,0.711033\n\t\t\t\t,0\n\t\t\t\t,0\n\t\t\t\t,1\n\t\t\t\t,0.0175992\n\t\t\t\t,-0.0783502\n\t\t\t\t,0.996771\n\t\t\t\t,0.0107912\n\t\t\t\t,0.660187\n\t\t\t\t,0.751024\n\t\t\t\t,0\n\t\t\t\t,0.703159\n\t\t\t\t,0.711033\n\t\t\t\t,0\n\t\t\t\t,1\n\t\t\t\t,2.7732e-008\n\t\t\t\t,0.0172861\n\t\t\t\t,0.995904\n\t\t\t\t,0.0887456\n\t\t\t\t,0.0108943\n\t\t\t\t,0.739937\n\t\t\t\t,-0.672588\n\t\t\t\t,0\n\t\t\t\t,0.703159\n\t\t\t\t,-0.711033\n\t\t\t\t,0\n\t\t\t\t,0\n\t\t\t\t,-1\n\t\t\t\t,0\n\t\t\t\t,0.703159\n\t\t\t\t,-0.711033\n\t\t\t\t,0.0108943\n\t\t\t\t,0.739937\n\t\t\t\t,-0.672588\n\t\t\t\t,0.0175992\n\t\t\t\t,0.0783492\n\t\t\t\t,-0.996771\n\t\t\t\t,0.0107913\n\t\t\t\t,-0.660188\n\t\t\t\t,-0.751023\n\t\t\t\t,0\n\t\t\t\t,-0.703159\n\t\t\t\t,-0.711033\n\t\t\t\t,-0.0226799\n\t\t\t\t,-0.999695\n\t\t\t\t,-0.00972728\n\t\t\t\t,0.0131055\n\t\t\t\t,-0.702348\n\t\t\t\t,0.711713\n\t\t\t\t,0.0123839\n\t\t\t\t,-0.0122817\n\t\t\t\t,0.999848\n\t\t\t\t,0.0131944\n\t\t\t\t,0.678228\n\t\t\t\t,0.734733\n\t\t\t\t,0.0139963\n\t\t\t\t,0.999666\n\t\t\t\t,0.0217368\n\t\t\t\t,0.0131051\n\t\t\t\t,0.702359\n\t\t\t\t,-0.711702\n\t\t\t\t,0.0131051\n\t\t\t\t,0.702359\n\t\t\t\t,-0.711702\n\t\t\t\t,0.0123841\n\t\t\t\t,0.0122734\n\t\t\t\t,-0.999848\n\t\t\t\t,0.0131943\n\t\t\t\t,-0.678228\n\t\t\t\t,-0.734733\n\t\t\t\t,8.87696e-008\n\t\t\t\t,-0.989097\n\t\t\t\t,0.147264\n\t\t\t\t,5.78237e-008\n\t\t\t\t,-0.582507\n\t\t\t\t,0.812825\n\t\t\t\t,-1.0664e-007\n\t\t\t\t,0.127\n\t\t\t\t,0.991903\n\t\t\t\t,-1.02832e-007\n\t\t\t\t,0.780639\n\t\t\t\t,0.624982\n\t\t\t\t,-1.13872e-007\n\t\t\t\t,0.989098\n\t\t\t\t,-0.147255\n\t\t\t\t,-1.25395e-007\n\t\t\t\t,0.582515\n\t\t\t\t,-0.81282\n\t\t\t\t,0.0123841\n\t\t\t\t,0.0122734\n\t\t\t\t,-0.999848\n\t\t\t\t,0.0131051\n\t\t\t\t,0.702359\n\t\t\t\t,-0.711702\n\t\t\t\t,-1.25395e-007\n\t\t\t\t,0.582515\n\t\t\t\t,-0.81282\n\t\t\t\t,-4.17274e-008\n\t\t\t\t,-0.127018\n\t\t\t\t,-0.9919\n\t\t\t\t,-1.25395e-007\n\t\t\t\t,0.582515\n\t\t\t\t,-0.81282\n\t\t\t\t,-3.08643e-008\n\t\t\t\t,-0.780626\n\t\t\t\t,-0.624998\n\t\t\t\t,0.745356\n\t\t\t\t,0.596285\n\t\t\t\t,0.298142\n\t\t\t\t,0.912871\n\t\t\t\t,-0.182574\n\t\t\t\t,0.365148\n\t\t\t\t,0.912871\n\t\t\t\t,-0.182574\n\t\t\t\t,-0.365148\n\t\t\t\t,0.745356\n\t\t\t\t,0.596285\n\t\t\t\t,-0.298142\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,0.912871\n\t\t\t\t,0.182574\n\t\t\t\t,-0.365148\n\t\t\t\t,0.745356\n\t\t\t\t,-0.596285\n\t\t\t\t,-0.298142\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,0.745356\n\t\t\t\t,0.596285\n\t\t\t\t,0.298142\n\t\t\t\t,0.912871\n\t\t\t\t,-0.182574\n\t\t\t\t,0.365148\n\t\t\t\t,0.912871\n\t\t\t\t,-0.182574\n\t\t\t\t,-0.365148\n\t\t\t\t,0.745356\n\t\t\t\t,0.596285\n\t\t\t\t,-0.298142\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,0.912871\n\t\t\t\t,0.182574\n\t\t\t\t,-0.365148\n\t\t\t\t,0.745356\n\t\t\t\t,-0.596285\n\t\t\t\t,-0.298142\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,-0.912871\n\t\t\t\t,-0.182574\n\t\t\t\t,-0.365148\n\t\t\t\t,-0.912871\n\t\t\t\t,-0.182574\n\t\t\t\t,0.365148\n\t\t\t\t,-0.745356\n\t\t\t\t,0.596285\n\t\t\t\t,0.298142\n\t\t\t\t,-0.745356\n\t\t\t\t,0.596285\n\t\t\t\t,-0.298142\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,-0.912871\n\t\t\t\t,0.182574\n\t\t\t\t,-0.365148\n\t\t\t\t,-0.745356\n\t\t\t\t,-0.596285\n\t\t\t\t,-0.298142\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,-0.912871\n\t\t\t\t,-0.182574\n\t\t\t\t,-0.365148\n\t\t\t\t,-0.912871\n\t\t\t\t,-0.182574\n\t\t\t\t,0.365148\n\t\t\t\t,-0.745356\n\t\t\t\t,0.596285\n\t\t\t\t,0.298142\n\t\t\t\t,-0.745356\n\t\t\t\t,0.596285\n\t\t\t\t,-0.298142\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,-0.912871\n\t\t\t\t,0.182574\n\t\t\t\t,-0.365148\n\t\t\t\t,-0.745356\n\t\t\t\t,-0.596285\n\t\t\t\t,-0.298142\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,0.912871\n\t\t\t\t,-0.182574\n\t\t\t\t,0.365148\n\t\t\t\t,0.912871\n\t\t\t\t,-0.182574\n\t\t\t\t,-0.365148\n\t\t\t\t,0.745356\n\t\t\t\t,0.596285\n\t\t\t\t,-0.298142\n\t\t\t\t,0.745356\n\t\t\t\t,0.596285\n\t\t\t\t,0.298142\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,0.912871\n\t\t\t\t,0.182574\n\t\t\t\t,0.365148\n\t\t\t\t,0.745356\n\t\t\t\t,-0.596285\n\t\t\t\t,0.298142\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,-0.745356\n\t\t\t\t,0.596285\n\t\t\t\t,-0.298142\n\t\t\t\t,-0.912871\n\t\t\t\t,-0.182574\n\t\t\t\t,-0.365148\n\t\t\t\t,-0.912871\n\t\t\t\t,-0.182574\n\t\t\t\t,0.365148\n\t\t\t\t,-0.745356\n\t\t\t\t,0.596285\n\t\t\t\t,0.298142\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,-0.912871\n\t\t\t\t,0.182574\n\t\t\t\t,0.365148\n\t\t\t\t,-0.745356\n\t\t\t\t,-0.596285\n\t\t\t\t,0.298142\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,-0.0406628\n\t\t\t\t,-0.000383572\n\t\t\t\t,-0.999173\n\t\t\t\t,-0.258808\n\t\t\t\t,0.00523817\n\t\t\t\t,-0.965914\n\t\t\t\t,0\n\t\t\t\t,3.57864e-008\n\t\t\t\t,-1\n\t\t\t\t,-5.60669e-008\n\t\t\t\t,-8.86392e-008\n\t\t\t\t,-1\n\t\t\t\t,0\n\t\t\t\t,-4.76878e-008\n\t\t\t\t,-1\n\t\t\t\t,-0.159762\n\t\t\t\t,0.00365147\n\t\t\t\t,-0.987149\n\t\t\t\t,0.0342897\n\t\t\t\t,-0.00258663\n\t\t\t\t,-0.999409\n\t\t\t\t,0.0552979\n\t\t\t\t,-0.0281865\n\t\t\t\t,-0.998072\n\t\t\t\t,0.414342\n\t\t\t\t,0.143659\n\t\t\t\t,-0.898712\n\t\t\t\t,-0.0602476\n\t\t\t\t,0.00976605\n\t\t\t\t,-0.998136\n\t\t\t\t,-0.0552976\n\t\t\t\t,-0.0281864\n\t\t\t\t,-0.998072\n\t\t\t\t,-0.414341\n\t\t\t\t,0.143659\n\t\t\t\t,-0.898712\n\t\t\t\t,-0.411744\n\t\t\t\t,0.0185513\n\t\t\t\t,-0.911111\n\t\t\t\t,-0.388404\n\t\t\t\t,0.016836\n\t\t\t\t,-0.921335\n\t\t\t\t,0.106503\n\t\t\t\t,0.00245149\n\t\t\t\t,-0.994309\n\t\t\t\t,0.709306\n\t\t\t\t,0.17223\n\t\t\t\t,-0.683536\n\t\t\t\t,-0.709305\n\t\t\t\t,0.17223\n\t\t\t\t,-0.683537\n\t\t\t\t,-0.498671\n\t\t\t\t,0.0170538\n\t\t\t\t,-0.866624\n\t\t\t\t,-0.365281\n\t\t\t\t,0.0103669\n\t\t\t\t,-0.930839\n\t\t\t\t,0.852957\n\t\t\t\t,0.100491\n\t\t\t\t,-0.512216\n\t\t\t\t,-0.226288\n\t\t\t\t,0.0589018\n\t\t\t\t,-0.972278\n\t\t\t\t,-0.852956\n\t\t\t\t,0.100492\n\t\t\t\t,-0.512218\n\t\t\t\t,-0.520791\n\t\t\t\t,-0.00404868\n\t\t\t\t,-0.853674\n\t\t\t\t,-0.519065\n\t\t\t\t,1.53965e-007\n\t\t\t\t,-0.854735\n\t\t\t\t,0.116765\n\t\t\t\t,-0.00323019\n\t\t\t\t,-0.993154\n\t\t\t\t,0.890936\n\t\t\t\t,0\n\t\t\t\t,-0.454129\n\t\t\t\t,-0.890935\n\t\t\t\t,0\n\t\t\t\t,-0.45413\n\t\t\t\t,-0.476485\n\t\t\t\t,-0.0201484\n\t\t\t\t,-0.878952\n\t\t\t\t,-0.365281\n\t\t\t\t,-0.0103669\n\t\t\t\t,-0.930839\n\t\t\t\t,0.854508\n\t\t\t\t,-0.0948003\n\t\t\t\t,-0.510715\n\t\t\t\t,-0.266828\n\t\t\t\t,-0.0325039\n\t\t\t\t,-0.963196\n\t\t\t\t,-0.854507\n\t\t\t\t,-0.0948006\n\t\t\t\t,-0.510716\n\t\t\t\t,-0.368075\n\t\t\t\t,-0.0141367\n\t\t\t\t,-0.929689\n\t\t\t\t,-0.388405\n\t\t\t\t,-0.0168355\n\t\t\t\t,-0.921335\n\t\t\t\t,0.0592949\n\t\t\t\t,0.00217879\n\t\t\t\t,-0.998238\n\t\t\t\t,0.731654\n\t\t\t\t,-0.139776\n\t\t\t\t,-0.667192\n\t\t\t\t,-0.731653\n\t\t\t\t,-0.139777\n\t\t\t\t,-0.667193\n\t\t\t\t,-0.191515\n\t\t\t\t,-0.00173153\n\t\t\t\t,-0.981488\n\t\t\t\t,-0.159762\n\t\t\t\t,-0.00365033\n\t\t\t\t,-0.987149\n\t\t\t\t,0.263324\n\t\t\t\t,-0.241582\n\t\t\t\t,-0.933969\n\t\t\t\t,-0.143103\n\t\t\t\t,-0.0331642\n\t\t\t\t,-0.989152\n\t\t\t\t,-0.458106\n\t\t\t\t,-0.112487\n\t\t\t\t,-0.881751\n\t\t\t\t,0.0406643\n\t\t\t\t,-0.000384458\n\t\t\t\t,-0.999173\n\t\t\t\t,-1.04777e-007\n\t\t\t\t,1.723e-007\n\t\t\t\t,-1\n\t\t\t\t,-0.0335703\n\t\t\t\t,0.00349361\n\t\t\t\t,-0.99943\n\t\t\t\t,0.0330473\n\t\t\t\t,0.0168449\n\t\t\t\t,-0.999312\n\t\t\t\t,-0.055299\n\t\t\t\t,0.0281871\n\t\t\t\t,-0.998072\n\t\t\t\t,0.258811\n\t\t\t\t,0.00523932\n\t\t\t\t,-0.965914\n\t\t\t\t,0.159762\n\t\t\t\t,0.00364992\n\t\t\t\t,-0.987149\n\t\t\t\t,-0.236441\n\t\t\t\t,0.257617\n\t\t\t\t,-0.936872\n\t\t\t\t,0.0602438\n\t\t\t\t,0.00976541\n\t\t\t\t,-0.998136\n\t\t\t\t,0.414343\n\t\t\t\t,0.143657\n\t\t\t\t,-0.898711\n\t\t\t\t,0.411752\n\t\t\t\t,0.0185537\n\t\t\t\t,-0.911107\n\t\t\t\t,0.388404\n\t\t\t\t,0.0168357\n\t\t\t\t,-0.921335\n\t\t\t\t,-0.106499\n\t\t\t\t,0.00245161\n\t\t\t\t,-0.99431\n\t\t\t\t,-0.709307\n\t\t\t\t,0.17223\n\t\t\t\t,-0.683536\n\t\t\t\t,0.709305\n\t\t\t\t,0.17223\n\t\t\t\t,-0.683537\n\t\t\t\t,0.498674\n\t\t\t\t,0.0170549\n\t\t\t\t,-0.866622\n\t\t\t\t,0.365281\n\t\t\t\t,0.0103669\n\t\t\t\t,-0.930839\n\t\t\t\t,-0.852957\n\t\t\t\t,0.10049\n\t\t\t\t,-0.512216\n\t\t\t\t,0.226295\n\t\t\t\t,0.0589055\n\t\t\t\t,-0.972276\n\t\t\t\t,0.852957\n\t\t\t\t,0.100491\n\t\t\t\t,-0.512218\n\t\t\t\t,0.52079\n\t\t\t\t,-0.00404834\n\t\t\t\t,-0.853675\n\t\t\t\t,0.519065\n\t\t\t\t,-1.4181e-007\n\t\t\t\t,-0.854735\n\t\t\t\t,-0.116764\n\t\t\t\t,-0.00322988\n\t\t\t\t,-0.993154\n\t\t\t\t,-0.890936\n\t\t\t\t,0\n\t\t\t\t,-0.454129\n\t\t\t\t,0.890935\n\t\t\t\t,0\n\t\t\t\t,-0.45413\n\t\t\t\t,0.476478\n\t\t\t\t,-0.0201469\n\t\t\t\t,-0.878955\n\t\t\t\t,0.365281\n\t\t\t\t,-0.0103671\n\t\t\t\t,-0.930839\n\t\t\t\t,-0.854508\n\t\t\t\t,-0.0948009\n\t\t\t\t,-0.510715\n\t\t\t\t,0.266824\n\t\t\t\t,-0.0325027\n\t\t\t\t,-0.963197\n\t\t\t\t,0.854507\n\t\t\t\t,-0.0948013\n\t\t\t\t,-0.510716\n\t\t\t\t,0.368067\n\t\t\t\t,-0.0141349\n\t\t\t\t,-0.929692\n\t\t\t\t,0.388404\n\t\t\t\t,-0.016836\n\t\t\t\t,-0.921335\n\t\t\t\t,-0.0592997\n\t\t\t\t,0.00217926\n\t\t\t\t,-0.998238\n\t\t\t\t,-0.731653\n\t\t\t\t,-0.139777\n\t\t\t\t,-0.667192\n\t\t\t\t,0.731652\n\t\t\t\t,-0.139777\n\t\t\t\t,-0.667194\n\t\t\t\t,0.191519\n\t\t\t\t,-0.0017298\n\t\t\t\t,-0.981487\n\t\t\t\t,0.159762\n\t\t\t\t,-0.00365147\n\t\t\t\t,-0.987149\n\t\t\t\t,-0.458106\n\t\t\t\t,-0.112489\n\t\t\t\t,-0.881751\n\t\t\t\t,0.143095\n\t\t\t\t,-0.0331621\n\t\t\t\t,-0.989153\n\t\t\t\t,0.458104\n\t\t\t\t,-0.112489\n\t\t\t\t,-0.881752\n\t\t\t\t,0.0268145\n\t\t\t\t,-0.0136679\n\t\t\t\t,0.999547\n\t\t\t\t,-2.30261e-009\n\t\t\t\t,0\n\t\t\t\t,1\n\t\t\t\t,-0.0160934\n\t\t\t\t,-0.375042\n\t\t\t\t,0.926868\n\t\t\t\t,4.14468e-009\n\t\t\t\t,-0.382684\n\t\t\t\t,0.92388\n\t\t\t\t,-2.30261e-009\n\t\t\t\t,0\n\t\t\t\t,1\n\t\t\t\t,-0.0268146\n\t\t\t\t,-0.013668\n\t\t\t\t,0.999547\n\t\t\t\t,0.0160934\n\t\t\t\t,-0.375042\n\t\t\t\t,0.926868\n\t\t\t\t,4.14468e-009\n\t\t\t\t,-0.382684\n\t\t\t\t,0.92388\n\t\t\t\t,-0.0160934\n\t\t\t\t,-0.375042\n\t\t\t\t,0.926868\n\t\t\t\t,4.14468e-009\n\t\t\t\t,-0.382684\n\t\t\t\t,0.92388\n\t\t\t\t,2.21733e-009\n\t\t\t\t,-0.707107\n\t\t\t\t,0.707107\n\t\t\t\t,-0.0268145\n\t\t\t\t,-0.697122\n\t\t\t\t,0.716451\n\t\t\t\t,4.14468e-009\n\t\t\t\t,-0.382684\n\t\t\t\t,0.92388\n\t\t\t\t,0.0160934\n\t\t\t\t,-0.375042\n\t\t\t\t,0.926868\n\t\t\t\t,2.21733e-009\n\t\t\t\t,-0.707107\n\t\t\t\t,0.707107\n\t\t\t\t,0.0268146\n\t\t\t\t,-0.697122\n\t\t\t\t,0.716451\n\t\t\t\t,-0.0268145\n\t\t\t\t,-0.697122\n\t\t\t\t,0.716451\n\t\t\t\t,2.21733e-009\n\t\t\t\t,-0.707107\n\t\t\t\t,0.707107\n\t\t\t\t,-0.0160933\n\t\t\t\t,-0.92059\n\t\t\t\t,0.3902\n\t\t\t\t,3.99117e-009\n\t\t\t\t,-0.92388\n\t\t\t\t,0.382683\n\t\t\t\t,2.21733e-009\n\t\t\t\t,-0.707107\n\t\t\t\t,0.707107\n\t\t\t\t,0.0268146\n\t\t\t\t,-0.697122\n\t\t\t\t,0.716451\n\t\t\t\t,0.0160933\n\t\t\t\t,-0.92059\n\t\t\t\t,0.3902\n\t\t\t\t,3.99117e-009\n\t\t\t\t,-0.92388\n\t\t\t\t,0.382683\n\t\t\t\t,-0.0160933\n\t\t\t\t,-0.92059\n\t\t\t\t,0.3902\n\t\t\t\t,3.99117e-009\n\t\t\t\t,-0.92388\n\t\t\t\t,0.382683\n\t\t\t\t,2.30261e-009\n\t\t\t\t,-1\n\t\t\t\t,0\n\t\t\t\t,-0.0268145\n\t\t\t\t,-0.999547\n\t\t\t\t,0.0136679\n\t\t\t\t,3.99117e-009\n\t\t\t\t,-0.92388\n\t\t\t\t,0.382683\n\t\t\t\t,0.0160933\n\t\t\t\t,-0.92059\n\t\t\t\t,0.3902\n\t\t\t\t,2.30261e-009\n\t\t\t\t,-1\n\t\t\t\t,0\n\t\t\t\t,0.0268146\n\t\t\t\t,-0.999547\n\t\t\t\t,0.013668\n\t\t\t\t,-0.0268145\n\t\t\t\t,-0.999547\n\t\t\t\t,0.0136679\n\t\t\t\t,2.30261e-009\n\t\t\t\t,-1\n\t\t\t\t,0\n\t\t\t\t,-0.0160933\n\t\t\t\t,-0.926868\n\t\t\t\t,-0.375043\n\t\t\t\t,3.99117e-009\n\t\t\t\t,-0.923879\n\t\t\t\t,-0.382684\n\t\t\t\t,2.30261e-009\n\t\t\t\t,-1\n\t\t\t\t,0\n\t\t\t\t,0.0268146\n\t\t\t\t,-0.999547\n\t\t\t\t,0.013668\n\t\t\t\t,0.0160934\n\t\t\t\t,-0.926868\n\t\t\t\t,-0.375043\n\t\t\t\t,3.99117e-009\n\t\t\t\t,-0.923879\n\t\t\t\t,-0.382684\n\t\t\t\t,-0.0160933\n\t\t\t\t,-0.926868\n\t\t\t\t,-0.375043\n\t\t\t\t,3.99117e-009\n\t\t\t\t,-0.923879\n\t\t\t\t,-0.382684\n\t\t\t\t,2.25996e-009\n\t\t\t\t,-0.707107\n\t\t\t\t,-0.707107\n\t\t\t\t,-0.0268144\n\t\t\t\t,-0.716451\n\t\t\t\t,-0.697122\n\t\t\t\t,3.99117e-009\n\t\t\t\t,-0.923879\n\t\t\t\t,-0.382684\n\t\t\t\t,0.0160934\n\t\t\t\t,-0.926868\n\t\t\t\t,-0.375043\n\t\t\t\t,2.25996e-009\n\t\t\t\t,-0.707107\n\t\t\t\t,-0.707107\n\t\t\t\t,0.0268145\n\t\t\t\t,-0.716451\n\t\t\t\t,-0.697122\n\t\t\t\t,-0.0268144\n\t\t\t\t,-0.716451\n\t\t\t\t,-0.697122\n\t\t\t\t,2.25996e-009\n\t\t\t\t,-0.707107\n\t\t\t\t,-0.707107\n\t\t\t\t,0.263324\n\t\t\t\t,-0.241582\n\t\t\t\t,-0.933969\n\t\t\t\t,4.14469e-009\n\t\t\t\t,-0.382684\n\t\t\t\t,-0.92388\n\t\t\t\t,2.25996e-009\n\t\t\t\t,-0.707107\n\t\t\t\t,-0.707107\n\t\t\t\t,0.0268145\n\t\t\t\t,-0.716451\n\t\t\t\t,-0.697122\n\t\t\t\t,0.0160934\n\t\t\t\t,-0.3902\n\t\t\t\t,-0.92059\n\t\t\t\t,4.14469e-009\n\t\t\t\t,-0.382684\n\t\t\t\t,-0.92388\n\t\t\t\t,0.263324\n\t\t\t\t,-0.241582\n\t\t\t\t,-0.933969\n\t\t\t\t,4.14469e-009\n\t\t\t\t,-0.382684\n\t\t\t\t,-0.92388\n\t\t\t\t,2.38788e-009\n\t\t\t\t,0\n\t\t\t\t,-1\n\t\t\t\t,0.0330473\n\t\t\t\t,0.0168449\n\t\t\t\t,-0.999312\n\t\t\t\t,4.14469e-009\n\t\t\t\t,-0.382684\n\t\t\t\t,-0.92388\n\t\t\t\t,0.0160934\n\t\t\t\t,-0.3902\n\t\t\t\t,-0.92059\n\t\t\t\t,2.38788e-009\n\t\t\t\t,0\n\t\t\t\t,-1\n\t\t\t\t,0.0268145\n\t\t\t\t,-0.0136679\n\t\t\t\t,-0.999547\n\t\t\t\t,0.0330473\n\t\t\t\t,0.0168449\n\t\t\t\t,-0.999312\n\t\t\t\t,2.38788e-009\n\t\t\t\t,0\n\t\t\t\t,-1\n\t\t\t\t,-0.236441\n\t\t\t\t,0.257617\n\t\t\t\t,-0.936872\n\t\t\t\t,4.14469e-009\n\t\t\t\t,0.382684\n\t\t\t\t,-0.92388\n\t\t\t\t,2.38788e-009\n\t\t\t\t,0\n\t\t\t\t,-1\n\t\t\t\t,0.0268145\n\t\t\t\t,-0.0136679\n\t\t\t\t,-0.999547\n\t\t\t\t,0.0160934\n\t\t\t\t,0.375042\n\t\t\t\t,-0.926868\n\t\t\t\t,4.14469e-009\n\t\t\t\t,0.382684\n\t\t\t\t,-0.92388\n\t\t\t\t,-0.236441\n\t\t\t\t,0.257617\n\t\t\t\t,-0.936872\n\t\t\t\t,4.14469e-009\n\t\t\t\t,0.382684\n\t\t\t\t,-0.92388\n\t\t\t\t,2.25996e-009\n\t\t\t\t,0.707107\n\t\t\t\t,-0.707107\n\t\t\t\t,-0.0268144\n\t\t\t\t,0.697122\n\t\t\t\t,-0.716451\n\t\t\t\t,4.14469e-009\n\t\t\t\t,0.382684\n\t\t\t\t,-0.92388\n\t\t\t\t,0.0160934\n\t\t\t\t,0.375042\n\t\t\t\t,-0.926868\n\t\t\t\t,2.25996e-009\n\t\t\t\t,0.707107\n\t\t\t\t,-0.707107\n\t\t\t\t,0.0268145\n\t\t\t\t,0.697122\n\t\t\t\t,-0.716451\n\t\t\t\t,-0.0268144\n\t\t\t\t,0.697122\n\t\t\t\t,-0.716451\n\t\t\t\t,2.25996e-009\n\t\t\t\t,0.707107\n\t\t\t\t,-0.707107\n\t\t\t\t,-0.0160933\n\t\t\t\t,0.92059\n\t\t\t\t,-0.3902\n\t\t\t\t,3.99118e-009\n\t\t\t\t,0.923879\n\t\t\t\t,-0.382684\n\t\t\t\t,2.25996e-009\n\t\t\t\t,0.707107\n\t\t\t\t,-0.707107\n\t\t\t\t,0.0268145\n\t\t\t\t,0.697122\n\t\t\t\t,-0.716451\n\t\t\t\t,0.0160934\n\t\t\t\t,0.920589\n\t\t\t\t,-0.3902\n\t\t\t\t,3.99118e-009\n\t\t\t\t,0.923879\n\t\t\t\t,-0.382684\n\t\t\t\t,-0.0160933\n\t\t\t\t,0.92059\n\t\t\t\t,-0.3902\n\t\t\t\t,3.99118e-009\n\t\t\t\t,0.923879\n\t\t\t\t,-0.382684\n\t\t\t\t,2.30261e-009\n\t\t\t\t,1\n\t\t\t\t,0\n\t\t\t\t,-0.0268145\n\t\t\t\t,0.999547\n\t\t\t\t,-0.0136679\n\t\t\t\t,3.99118e-009\n\t\t\t\t,0.923879\n\t\t\t\t,-0.382684\n\t\t\t\t,0.0160934\n\t\t\t\t,0.920589\n\t\t\t\t,-0.3902\n\t\t\t\t,2.30261e-009\n\t\t\t\t,1\n\t\t\t\t,0\n\t\t\t\t,0.0268146\n\t\t\t\t,0.999547\n\t\t\t\t,-0.013668\n\t\t\t\t,-0.0268145\n\t\t\t\t,0.999547\n\t\t\t\t,-0.0136679\n\t\t\t\t,2.30261e-009\n\t\t\t\t,1\n\t\t\t\t,0\n\t\t\t\t,-0.0160933\n\t\t\t\t,0.926868\n\t\t\t\t,0.375042\n\t\t\t\t,3.99117e-009\n\t\t\t\t,0.92388\n\t\t\t\t,0.382684\n\t\t\t\t,2.30261e-009\n\t\t\t\t,1\n\t\t\t\t,0\n\t\t\t\t,0.0268146\n\t\t\t\t,0.999547\n\t\t\t\t,-0.013668\n\t\t\t\t,0.0160934\n\t\t\t\t,0.926868\n\t\t\t\t,0.375042\n\t\t\t\t,3.99117e-009\n\t\t\t\t,0.92388\n\t\t\t\t,0.382684\n\t\t\t\t,-0.0160933\n\t\t\t\t,0.926868\n\t\t\t\t,0.375042\n\t\t\t\t,3.99117e-009\n\t\t\t\t,0.92388\n\t\t\t\t,0.382684\n\t\t\t\t,2.21732e-009\n\t\t\t\t,0.707107\n\t\t\t\t,0.707107\n\t\t\t\t,-0.0268145\n\t\t\t\t,0.716451\n\t\t\t\t,0.697122\n\t\t\t\t,3.99117e-009\n\t\t\t\t,0.92388\n\t\t\t\t,0.382684\n\t\t\t\t,0.0160934\n\t\t\t\t,0.926868\n\t\t\t\t,0.375042\n\t\t\t\t,2.21732e-009\n\t\t\t\t,0.707107\n\t\t\t\t,0.707107\n\t\t\t\t,0.0268146\n\t\t\t\t,0.716451\n\t\t\t\t,0.697122\n\t\t\t\t,-0.0268145\n\t\t\t\t,0.716451\n\t\t\t\t,0.697122\n\t\t\t\t,2.21732e-009\n\t\t\t\t,0.707107\n\t\t\t\t,0.707107\n\t\t\t\t,-0.0160933\n\t\t\t\t,0.3902\n\t\t\t\t,0.92059\n\t\t\t\t,4.14468e-009\n\t\t\t\t,0.382684\n\t\t\t\t,0.92388\n\t\t\t\t,2.21732e-009\n\t\t\t\t,0.707107\n\t\t\t\t,0.707107\n\t\t\t\t,0.0268146\n\t\t\t\t,0.716451\n\t\t\t\t,0.697122\n\t\t\t\t,0.0160933\n\t\t\t\t,0.3902\n\t\t\t\t,0.92059\n\t\t\t\t,4.14468e-009\n\t\t\t\t,0.382684\n\t\t\t\t,0.92388\n\t\t\t\t,-0.0160933\n\t\t\t\t,0.3902\n\t\t\t\t,0.92059\n\t\t\t\t,4.14468e-009\n\t\t\t\t,0.382684\n\t\t\t\t,0.92388\n\t\t\t\t,-2.30261e-009\n\t\t\t\t,0\n\t\t\t\t,1\n\t\t\t\t,0.0268145\n\t\t\t\t,-0.0136679\n\t\t\t\t,0.999547\n\t\t\t\t,4.14468e-009\n\t\t\t\t,0.382684\n\t\t\t\t,0.92388\n\t\t\t\t,0.0160933\n\t\t\t\t,0.3902\n\t\t\t\t,0.92059\n\t\t\t\t,-2.30261e-009\n\t\t\t\t,0\n\t\t\t\t,1\n\t\t\t\t,-0.0268146\n\t\t\t\t,-0.013668\n\t\t\t\t,0.999547\n\t\t\t]\n\t\t\t,\"bitangents\": [\n\t\t\t\t -0.520796\n\t\t\t\t,-0.853672\n\t\t\t\t,0.00404876\n\t\t\t\t,-0.476481\n\t\t\t\t,-0.878954\n\t\t\t\t,0.0201475\n\t\t\t\t,0\n\t\t\t\t,-1\n\t\t\t\t,2.28704e-009\n\t\t\t\t,-0.519065\n\t\t\t\t,-0.854735\n\t\t\t\t,5.76011e-007\n\t\t\t\t,0\n\t\t\t\t,-1\n\t\t\t\t,9.25277e-010\n\t\t\t\t,-0.365282\n\t\t\t\t,-0.930839\n\t\t\t\t,0.0103679\n\t\t\t\t,0.116762\n\t\t\t\t,-0.993155\n\t\t\t\t,0.00323107\n\t\t\t\t,0.890936\n\t\t\t\t,-0.454129\n\t\t\t\t,8.30525e-008\n\t\t\t\t,0.854507\n\t\t\t\t,-0.510715\n\t\t\t\t,0.0948014\n\t\t\t\t,-0.266829\n\t\t\t\t,-0.963196\n\t\t\t\t,0.0325066\n\t\t\t\t,-0.890935\n\t\t\t\t,-0.45413\n\t\t\t\t,8.42227e-008\n\t\t\t\t,-0.854507\n\t\t\t\t,-0.510716\n\t\t\t\t,0.0948018\n\t\t\t\t,-0.368066\n\t\t\t\t,-0.929692\n\t\t\t\t,0.014135\n\t\t\t\t,-0.388404\n\t\t\t\t,-0.921335\n\t\t\t\t,0.0168356\n\t\t\t\t,0.0592992\n\t\t\t\t,-0.998238\n\t\t\t\t,-0.00217942\n\t\t\t\t,0.731654\n\t\t\t\t,-0.667192\n\t\t\t\t,0.139776\n\t\t\t\t,-0.731652\n\t\t\t\t,-0.667194\n\t\t\t\t,0.139777\n\t\t\t\t,-0.191517\n\t\t\t\t,-0.981488\n\t\t\t\t,0.00173126\n\t\t\t\t,-0.159762\n\t\t\t\t,-0.987149\n\t\t\t\t,0.00365135\n\t\t\t\t,0.458106\n\t\t\t\t,-0.881751\n\t\t\t\t,0.112488\n\t\t\t\t,-0.143094\n\t\t\t\t,-0.989153\n\t\t\t\t,0.0331622\n\t\t\t\t,-0.458105\n\t\t\t\t,-0.881752\n\t\t\t\t,0.112488\n\t\t\t\t,0.0406609\n\t\t\t\t,-0.999173\n\t\t\t\t,0.000383066\n\t\t\t\t,5.39311e-008\n\t\t\t\t,-1\n\t\t\t\t,9.0775e-008\n\t\t\t\t,-0.0335745\n\t\t\t\t,-0.99943\n\t\t\t\t,-0.00349344\n\t\t\t\t,0.055298\n\t\t\t\t,-0.998072\n\t\t\t\t,-0.0281865\n\t\t\t\t,-0.0552977\n\t\t\t\t,-0.998072\n\t\t\t\t,-0.0281864\n\t\t\t\t,0.25881\n\t\t\t\t,-0.965914\n\t\t\t\t,-0.00523834\n\t\t\t\t,0.159762\n\t\t\t\t,-0.987149\n\t\t\t\t,-0.00365168\n\t\t\t\t,-0.414342\n\t\t\t\t,-0.898712\n\t\t\t\t,-0.143659\n\t\t\t\t,0.0602464\n\t\t\t\t,-0.998136\n\t\t\t\t,-0.00976645\n\t\t\t\t,0.414341\n\t\t\t\t,-0.898712\n\t\t\t\t,-0.143659\n\t\t\t\t,0.411755\n\t\t\t\t,-0.911106\n\t\t\t\t,-0.0185524\n\t\t\t\t,0.388405\n\t\t\t\t,-0.921335\n\t\t\t\t,-0.0168356\n\t\t\t\t,-0.106499\n\t\t\t\t,-0.99431\n\t\t\t\t,-0.00245124\n\t\t\t\t,-0.709307\n\t\t\t\t,-0.683536\n\t\t\t\t,-0.172229\n\t\t\t\t,0.709306\n\t\t\t\t,-0.683537\n\t\t\t\t,-0.172229\n\t\t\t\t,0.49868\n\t\t\t\t,-0.866618\n\t\t\t\t,-0.0170546\n\t\t\t\t,0.365281\n\t\t\t\t,-0.930839\n\t\t\t\t,-0.0103678\n\t\t\t\t,-0.879127\n\t\t\t\t,-0.4761\n\t\t\t\t,0.021558\n\t\t\t\t,0.226305\n\t\t\t\t,-0.972273\n\t\t\t\t,-0.0589106\n\t\t\t\t,0.852956\n\t\t\t\t,-0.512218\n\t\t\t\t,-0.100492\n\t\t\t\t,0.520794\n\t\t\t\t,-0.853673\n\t\t\t\t,0.00404863\n\t\t\t\t,0.519065\n\t\t\t\t,-0.854735\n\t\t\t\t,-5.71719e-007\n\t\t\t\t,-0.116763\n\t\t\t\t,-0.993155\n\t\t\t\t,0.00322858\n\t\t\t\t,-0.890936\n\t\t\t\t,-0.454128\n\t\t\t\t,-1.60722e-008\n\t\t\t\t,0.890935\n\t\t\t\t,-0.45413\n\t\t\t\t,-8.30528e-008\n\t\t\t\t,0.476495\n\t\t\t\t,-0.878946\n\t\t\t\t,0.0201482\n\t\t\t\t,0.365281\n\t\t\t\t,-0.930839\n\t\t\t\t,0.0103668\n\t\t\t\t,-0.879612\n\t\t\t\t,-0.475048\n\t\t\t\t,-0.0247441\n\t\t\t\t,0.266837\n\t\t\t\t,-0.963193\n\t\t\t\t,0.0325018\n\t\t\t\t,0.854507\n\t\t\t\t,-0.510716\n\t\t\t\t,0.0948004\n\t\t\t\t,0.368074\n\t\t\t\t,-0.929689\n\t\t\t\t,0.0141374\n\t\t\t\t,0.388404\n\t\t\t\t,-0.921335\n\t\t\t\t,0.0168346\n\t\t\t\t,-0.0592937\n\t\t\t\t,-0.998238\n\t\t\t\t,-0.0021808\n\t\t\t\t,-0.731654\n\t\t\t\t,-0.667192\n\t\t\t\t,0.139776\n\t\t\t\t,0.731653\n\t\t\t\t,-0.667193\n\t\t\t\t,0.139777\n\t\t\t\t,0.191517\n\t\t\t\t,-0.981488\n\t\t\t\t,0.00173398\n\t\t\t\t,0.159762\n\t\t\t\t,-0.987149\n\t\t\t\t,0.00364929\n\t\t\t\t,-0.458107\n\t\t\t\t,-0.881751\n\t\t\t\t,0.112487\n\t\t\t\t,0.143099\n\t\t\t\t,-0.989153\n\t\t\t\t,0.0331632\n\t\t\t\t,0.458106\n\t\t\t\t,-0.881751\n\t\t\t\t,0.112487\n\t\t\t\t,-0.0406631\n\t\t\t\t,-0.999173\n\t\t\t\t,0.000382166\n\t\t\t\t,-8.65033e-008\n\t\t\t\t,-1\n\t\t\t\t,1.40968e-007\n\t\t\t\t,0.0335734\n\t\t\t\t,-0.99943\n\t\t\t\t,-0.00349349\n\t\t\t\t,-0.0552984\n\t\t\t\t,-0.998072\n\t\t\t\t,-0.0281868\n\t\t\t\t,0.055298\n\t\t\t\t,-0.998072\n\t\t\t\t,-0.0281867\n\t\t\t\t,-0.258806\n\t\t\t\t,-0.965915\n\t\t\t\t,-0.00524028\n\t\t\t\t,-0.159762\n\t\t\t\t,-0.987149\n\t\t\t\t,-0.00364977\n\t\t\t\t,0.414343\n\t\t\t\t,-0.898711\n\t\t\t\t,-0.143657\n\t\t\t\t,-0.0602467\n\t\t\t\t,-0.998136\n\t\t\t\t,-0.00976724\n\t\t\t\t,-0.414342\n\t\t\t\t,-0.898712\n\t\t\t\t,-0.143657\n\t\t\t\t,-0.411744\n\t\t\t\t,-0.911111\n\t\t\t\t,-0.018553\n\t\t\t\t,-0.388404\n\t\t\t\t,-0.921335\n\t\t\t\t,-0.0168343\n\t\t\t\t,0.106502\n\t\t\t\t,-0.994309\n\t\t\t\t,-0.00244955\n\t\t\t\t,0.709306\n\t\t\t\t,-0.683536\n\t\t\t\t,-0.17223\n\t\t\t\t,-0.709305\n\t\t\t\t,-0.683537\n\t\t\t\t,-0.17223\n\t\t\t\t,-0.498675\n\t\t\t\t,-0.866621\n\t\t\t\t,-0.0170548\n\t\t\t\t,-0.365281\n\t\t\t\t,-0.930839\n\t\t\t\t,-0.010367\n\t\t\t\t,0.852957\n\t\t\t\t,-0.512216\n\t\t\t\t,-0.10049\n\t\t\t\t,-0.22629\n\t\t\t\t,-0.972277\n\t\t\t\t,-0.0589018\n\t\t\t\t,-0.852957\n\t\t\t\t,-0.512217\n\t\t\t\t,-0.100491\n\t\t\t\t,-0.890936\n\t\t\t\t,0.454129\n\t\t\t\t,8.38242e-008\n\t\t\t\t,-1\n\t\t\t\t,-1.04893e-007\n\t\t\t\t,-2.48621e-009\n\t\t\t\t,-0.890844\n\t\t\t\t,0.425036\n\t\t\t\t,0.160445\n\t\t\t\t,-1\n\t\t\t\t,-1.43853e-007\n\t\t\t\t,7.94187e-008\n\t\t\t\t,-1\n\t\t\t\t,-1.04893e-007\n\t\t\t\t,-2.48621e-009\n\t\t\t\t,-0.890935\n\t\t\t\t,-0.45413\n\t\t\t\t,-8.50053e-008\n\t\t\t\t,-0.890843\n\t\t\t\t,-0.425037\n\t\t\t\t,-0.160445\n\t\t\t\t,-1\n\t\t\t\t,-1.43853e-007\n\t\t\t\t,7.94187e-008\n\t\t\t\t,-0.890844\n\t\t\t\t,0.425036\n\t\t\t\t,0.160445\n\t\t\t\t,-1\n\t\t\t\t,-1.43853e-007\n\t\t\t\t,7.94187e-008\n\t\t\t\t,-0.99997\n\t\t\t\t,0.00548173\n\t\t\t\t,-0.00548187\n\t\t\t\t,-0.890936\n\t\t\t\t,0.321118\n\t\t\t\t,0.321117\n\t\t\t\t,-1\n\t\t\t\t,-1.43853e-007\n\t\t\t\t,7.94187e-008\n\t\t\t\t,-0.890843\n\t\t\t\t,-0.425037\n\t\t\t\t,-0.160445\n\t\t\t\t,-0.99997\n\t\t\t\t,0.00548173\n\t\t\t\t,-0.00548187\n\t\t\t\t,-0.890935\n\t\t\t\t,-0.321119\n\t\t\t\t,-0.321118\n\t\t\t\t,-0.890936\n\t\t\t\t,0.321118\n\t\t\t\t,0.321117\n\t\t\t\t,-0.99997\n\t\t\t\t,0.00548173\n\t\t\t\t,-0.00548187\n\t\t\t\t,-0.890844\n\t\t\t\t,0.187094\n\t\t\t\t,0.413997\n\t\t\t\t,-1\n\t\t\t\t,-6.59327e-008\n\t\t\t\t,-8.69114e-008\n\t\t\t\t,-0.99997\n\t\t\t\t,0.00548173\n\t\t\t\t,-0.00548187\n\t\t\t\t,-0.890935\n\t\t\t\t,-0.321119\n\t\t\t\t,-0.321118\n\t\t\t\t,-0.890843\n\t\t\t\t,-0.187094\n\t\t\t\t,-0.413998\n\t\t\t\t,-1\n\t\t\t\t,-6.59327e-008\n\t\t\t\t,-8.69114e-008\n\t\t\t\t,-0.890844\n\t\t\t\t,0.187094\n\t\t\t\t,0.413997\n\t\t\t\t,-1\n\t\t\t\t,-6.59327e-008\n\t\t\t\t,-8.69114e-008\n\t\t\t\t,-0.99997\n\t\t\t\t,0.00775251\n\t\t\t\t,-1.0489e-007\n\t\t\t\t,-0.890936\n\t\t\t\t,0\n\t\t\t\t,0.454128\n\t\t\t\t,-1\n\t\t\t\t,-6.59327e-008\n\t\t\t\t,-8.69114e-008\n\t\t\t\t,-0.890843\n\t\t\t\t,-0.187094\n\t\t\t\t,-0.413998\n\t\t\t\t,-0.99997\n\t\t\t\t,0.00775251\n\t\t\t\t,-1.0489e-007\n\t\t\t\t,-0.890936\n\t\t\t\t,0\n\t\t\t\t,-0.454129\n\t\t\t\t,-0.890936\n\t\t\t\t,0\n\t\t\t\t,0.454128\n\t\t\t\t,-0.99997\n\t\t\t\t,0.00775251\n\t\t\t\t,-1.0489e-007\n\t\t\t\t,-0.890844\n\t\t\t\t,-0.160444\n\t\t\t\t,0.425036\n\t\t\t\t,-1\n\t\t\t\t,3.11681e-007\n\t\t\t\t,2.09782e-008\n\t\t\t\t,-0.99997\n\t\t\t\t,0.00775251\n\t\t\t\t,-1.0489e-007\n\t\t\t\t,-0.890936\n\t\t\t\t,0\n\t\t\t\t,-0.454129\n\t\t\t\t,-0.890843\n\t\t\t\t,0.160445\n\t\t\t\t,-0.425037\n\t\t\t\t,-1\n\t\t\t\t,3.11681e-007\n\t\t\t\t,2.09782e-008\n\t\t\t\t,-0.890844\n\t\t\t\t,-0.160444\n\t\t\t\t,0.425036\n\t\t\t\t,-1\n\t\t\t\t,3.11681e-007\n\t\t\t\t,2.09782e-008\n\t\t\t\t,-0.99997\n\t\t\t\t,0.00548202\n\t\t\t\t,0.00548188\n\t\t\t\t,-0.890936\n\t\t\t\t,-0.321117\n\t\t\t\t,0.321117\n\t\t\t\t,-1\n\t\t\t\t,3.11681e-007\n\t\t\t\t,2.09782e-008\n\t\t\t\t,-0.890843\n\t\t\t\t,0.160445\n\t\t\t\t,-0.425037\n\t\t\t\t,-0.99997\n\t\t\t\t,0.00548202\n\t\t\t\t,0.00548188\n\t\t\t\t,-0.890936\n\t\t\t\t,0.321118\n\t\t\t\t,-0.321118\n\t\t\t\t,-0.890936\n\t\t\t\t,-0.321117\n\t\t\t\t,0.321117\n\t\t\t\t,-0.99997\n\t\t\t\t,0.00548202\n\t\t\t\t,0.00548188\n\t\t\t\t,-0.879127\n\t\t\t\t,-0.4761\n\t\t\t\t,0.021558\n\t\t\t\t,-1\n\t\t\t\t,1.5584e-007\n\t\t\t\t,9.88985e-008\n\t\t\t\t,-0.99997\n\t\t\t\t,0.00548202\n\t\t\t\t,0.00548188\n\t\t\t\t,-0.890936\n\t\t\t\t,0.321118\n\t\t\t\t,-0.321118\n\t\t\t\t,-0.890843\n\t\t\t\t,0.413998\n\t\t\t\t,-0.187095\n\t\t\t\t,-1\n\t\t\t\t,1.5584e-007\n\t\t\t\t,9.88985e-008\n\t\t\t\t,-0.879127\n\t\t\t\t,-0.4761\n\t\t\t\t,0.021558\n\t\t\t\t,-1\n\t\t\t\t,1.5584e-007\n\t\t\t\t,9.88985e-008\n\t\t\t\t,-0.99997\n\t\t\t\t,1.06553e-007\n\t\t\t\t,0.00775257\n\t\t\t\t,-0.890936\n\t\t\t\t,-0.454128\n\t\t\t\t,-1.60722e-008\n\t\t\t\t,-1\n\t\t\t\t,1.5584e-007\n\t\t\t\t,9.88985e-008\n\t\t\t\t,-0.890843\n\t\t\t\t,0.413998\n\t\t\t\t,-0.187095\n\t\t\t\t,-0.99997\n\t\t\t\t,1.06553e-007\n\t\t\t\t,0.00775257\n\t\t\t\t,-0.890935\n\t\t\t\t,0.45413\n\t\t\t\t,-8.38246e-008\n\t\t\t\t,-0.890936\n\t\t\t\t,-0.454128\n\t\t\t\t,-1.60722e-008\n\t\t\t\t,-0.99997\n\t\t\t\t,1.06553e-007\n\t\t\t\t,0.00775257\n\t\t\t\t,-0.879612\n\t\t\t\t,-0.475048\n\t\t\t\t,-0.0247441\n\t\t\t\t,-1\n\t\t\t\t,3.41061e-013\n\t\t\t\t,2.81711e-007\n\t\t\t\t,-0.99997\n\t\t\t\t,1.06553e-007\n\t\t\t\t,0.00775257\n\t\t\t\t,-0.890935\n\t\t\t\t,0.45413\n\t\t\t\t,-8.38246e-008\n\t\t\t\t,-0.890843\n\t\t\t\t,0.425037\n\t\t\t\t,0.160445\n\t\t\t\t,-1\n\t\t\t\t,3.41061e-013\n\t\t\t\t,2.81711e-007\n\t\t\t\t,-0.879612\n\t\t\t\t,-0.475048\n\t\t\t\t,-0.0247441\n\t\t\t\t,-1\n\t\t\t\t,3.41061e-013\n\t\t\t\t,2.81711e-007\n\t\t\t\t,-0.99997\n\t\t\t\t,-0.00548183\n\t\t\t\t,0.00548198\n\t\t\t\t,-0.890936\n\t\t\t\t,-0.321117\n\t\t\t\t,-0.321117\n\t\t\t\t,-1\n\t\t\t\t,3.41061e-013\n\t\t\t\t,2.81711e-007\n\t\t\t\t,-0.890843\n\t\t\t\t,0.425037\n\t\t\t\t,0.160445\n\t\t\t\t,-0.99997\n\t\t\t\t,-0.00548183\n\t\t\t\t,0.00548198\n\t\t\t\t,-0.890936\n\t\t\t\t,0.321118\n\t\t\t\t,0.321118\n\t\t\t\t,-0.890936\n\t\t\t\t,-0.321117\n\t\t\t\t,-0.321117\n\t\t\t\t,-0.99997\n\t\t\t\t,-0.00548183\n\t\t\t\t,0.00548198\n\t\t\t\t,-0.890843\n\t\t\t\t,-0.187095\n\t\t\t\t,-0.413998\n\t\t\t\t,-1\n\t\t\t\t,-1.49846e-008\n\t\t\t\t,1.1688e-007\n\t\t\t\t,-0.99997\n\t\t\t\t,-0.00548183\n\t\t\t\t,0.00548198\n\t\t\t\t,-0.890936\n\t\t\t\t,0.321118\n\t\t\t\t,0.321118\n\t\t\t\t,-0.890843\n\t\t\t\t,0.187095\n\t\t\t\t,0.413999\n\t\t\t\t,-1\n\t\t\t\t,-1.49846e-008\n\t\t\t\t,1.1688e-007\n\t\t\t\t,-0.890843\n\t\t\t\t,-0.187095\n\t\t\t\t,-0.413998\n\t\t\t\t,-1\n\t\t\t\t,-1.49846e-008\n\t\t\t\t,1.1688e-007\n\t\t\t\t,-0.99997\n\t\t\t\t,-0.00775251\n\t\t\t\t,1.0489e-007\n\t\t\t\t,-0.890936\n\t\t\t\t,0\n\t\t\t\t,-0.454129\n\t\t\t\t,-1\n\t\t\t\t,-1.49846e-008\n\t\t\t\t,1.1688e-007\n\t\t\t\t,-0.890843\n\t\t\t\t,0.187095\n\t\t\t\t,0.413999\n\t\t\t\t,-0.99997\n\t\t\t\t,-0.00775251\n\t\t\t\t,1.0489e-007\n\t\t\t\t,-0.890935\n\t\t\t\t,0\n\t\t\t\t,0.45413\n\t\t\t\t,-0.890936\n\t\t\t\t,0\n\t\t\t\t,-0.454129\n\t\t\t\t,-0.99997\n\t\t\t\t,-0.00775251\n\t\t\t\t,1.0489e-007\n\t\t\t\t,-0.890843\n\t\t\t\t,0.160445\n\t\t\t\t,-0.425036\n\t\t\t\t,-1\n\t\t\t\t,1.04892e-008\n\t\t\t\t,1.10887e-007\n\t\t\t\t,-0.99997\n\t\t\t\t,-0.00775251\n\t\t\t\t,1.0489e-007\n\t\t\t\t,-0.890935\n\t\t\t\t,0\n\t\t\t\t,0.45413\n\t\t\t\t,-0.890843\n\t\t\t\t,-0.160446\n\t\t\t\t,0.425037\n\t\t\t\t,-1\n\t\t\t\t,1.04892e-008\n\t\t\t\t,1.10887e-007\n\t\t\t\t,-0.890843\n\t\t\t\t,0.160445\n\t\t\t\t,-0.425036\n\t\t\t\t,-1\n\t\t\t\t,1.04892e-008\n\t\t\t\t,1.10887e-007\n\t\t\t\t,-0.99997\n\t\t\t\t,-0.00548189\n\t\t\t\t,-0.00548174\n\t\t\t\t,-0.890936\n\t\t\t\t,0.321118\n\t\t\t\t,-0.321117\n\t\t\t\t,-1\n\t\t\t\t,1.04892e-008\n\t\t\t\t,1.10887e-007\n\t\t\t\t,-0.890843\n\t\t\t\t,-0.160446\n\t\t\t\t,0.425037\n\t\t\t\t,-0.99997\n\t\t\t\t,-0.00548189\n\t\t\t\t,-0.00548174\n\t\t\t\t,-0.890935\n\t\t\t\t,-0.321119\n\t\t\t\t,0.321118\n\t\t\t\t,-0.890936\n\t\t\t\t,0.321118\n\t\t\t\t,-0.321117\n\t\t\t\t,-0.99997\n\t\t\t\t,-0.00548189\n\t\t\t\t,-0.00548174\n\t\t\t\t,-0.890844\n\t\t\t\t,0.413998\n\t\t\t\t,-0.187093\n\t\t\t\t,-1\n\t\t\t\t,1.19875e-008\n\t\t\t\t,2.96697e-007\n\t\t\t\t,-0.99997\n\t\t\t\t,-0.00548189\n\t\t\t\t,-0.00548174\n\t\t\t\t,-0.890935\n\t\t\t\t,-0.321119\n\t\t\t\t,0.321118\n\t\t\t\t,-0.890843\n\t\t\t\t,-0.413999\n\t\t\t\t,0.187094\n\t\t\t\t,-1\n\t\t\t\t,1.19875e-008\n\t\t\t\t,2.96697e-007\n\t\t\t\t,-0.890844\n\t\t\t\t,0.413998\n\t\t\t\t,-0.187093\n\t\t\t\t,-1\n\t\t\t\t,1.19875e-008\n\t\t\t\t,2.96697e-007\n\t\t\t\t,-1\n\t\t\t\t,-1.04893e-007\n\t\t\t\t,-2.48621e-009\n\t\t\t\t,-0.890936\n\t\t\t\t,0.454129\n\t\t\t\t,8.38242e-008\n\t\t\t\t,-1\n\t\t\t\t,1.19875e-008\n\t\t\t\t,2.96697e-007\n\t\t\t\t,-0.890843\n\t\t\t\t,-0.413999\n\t\t\t\t,0.187094\n\t\t\t\t,-1\n\t\t\t\t,-1.04893e-007\n\t\t\t\t,-2.48621e-009\n\t\t\t\t,-0.890935\n\t\t\t\t,-0.45413\n\t\t\t\t,-8.50053e-008\n\t\t\t\t,0\n\t\t\t\t,-1\n\t\t\t\t,1.69193e-012\n\t\t\t\t,0.476481\n\t\t\t\t,-0.878954\n\t\t\t\t,0.0201464\n\t\t\t\t,0.520796\n\t\t\t\t,-0.853672\n\t\t\t\t,0.00404837\n\t\t\t\t,0.365281\n\t\t\t\t,-0.930839\n\t\t\t\t,0.0103676\n\t\t\t\t,0\n\t\t\t\t,-1\n\t\t\t\t,4.6264e-009\n\t\t\t\t,0.519065\n\t\t\t\t,-0.854735\n\t\t\t\t,2.48577e-007\n\t\t\t\t,-0.854508\n\t\t\t\t,-0.510715\n\t\t\t\t,0.0948013\n\t\t\t\t,-0.890936\n\t\t\t\t,-0.454129\n\t\t\t\t,0\n\t\t\t\t,-0.116762\n\t\t\t\t,-0.993155\n\t\t\t\t,0.00323127\n\t\t\t\t,0.266828\n\t\t\t\t,-0.963196\n\t\t\t\t,0.0325057\n\t\t\t\t,0.854507\n\t\t\t\t,-0.510716\n\t\t\t\t,0.0948016\n\t\t\t\t,0.890935\n\t\t\t\t,-0.45413\n\t\t\t\t,0\n\t\t\t\t,0.368066\n\t\t\t\t,-0.929692\n\t\t\t\t,0.0141346\n\t\t\t\t,0.388404\n\t\t\t\t,-0.921335\n\t\t\t\t,0.0168349\n\t\t\t\t,-0.0592994\n\t\t\t\t,-0.998238\n\t\t\t\t,-0.00218039\n\t\t\t\t,-0.731654\n\t\t\t\t,-0.667192\n\t\t\t\t,0.139776\n\t\t\t\t,0.731653\n\t\t\t\t,-0.667194\n\t\t\t\t,0.139777\n\t\t\t\t,0.191517\n\t\t\t\t,-0.981488\n\t\t\t\t,0.00173174\n\t\t\t\t,0.159762\n\t\t\t\t,-0.987149\n\t\t\t\t,0.00365074\n\t\t\t\t,-0.458106\n\t\t\t\t,-0.881751\n\t\t\t\t,0.112488\n\t\t\t\t,0.143094\n\t\t\t\t,-0.989153\n\t\t\t\t,0.0331615\n\t\t\t\t,0.458105\n\t\t\t\t,-0.881752\n\t\t\t\t,0.112488\n\t\t\t\t,-0.040661\n\t\t\t\t,-0.999173\n\t\t\t\t,0.000383189\n\t\t\t\t,-5.39311e-008\n\t\t\t\t,-1\n\t\t\t\t,8.75712e-008\n\t\t\t\t,0.0335746\n\t\t\t\t,-0.99943\n\t\t\t\t,-0.00349338\n\t\t\t\t,-0.0552981\n\t\t\t\t,-0.998072\n\t\t\t\t,-0.0281866\n\t\t\t\t,0.0552977\n\t\t\t\t,-0.998072\n\t\t\t\t,-0.0281865\n\t\t\t\t,-0.25881\n\t\t\t\t,-0.965914\n\t\t\t\t,-0.00523882\n\t\t\t\t,-0.159762\n\t\t\t\t,-0.987149\n\t\t\t\t,-0.00365107\n\t\t\t\t,0.414343\n\t\t\t\t,-0.898711\n\t\t\t\t,-0.143659\n\t\t\t\t,-0.060247\n\t\t\t\t,-0.998136\n\t\t\t\t,-0.00976635\n\t\t\t\t,-0.414342\n\t\t\t\t,-0.898712\n\t\t\t\t,-0.143659\n\t\t\t\t,-0.411755\n\t\t\t\t,-0.911106\n\t\t\t\t,-0.0185516\n\t\t\t\t,-0.388405\n\t\t\t\t,-0.921335\n\t\t\t\t,-0.016835\n\t\t\t\t,0.106499\n\t\t\t\t,-0.99431\n\t\t\t\t,-0.00245044\n\t\t\t\t,0.709307\n\t\t\t\t,-0.683536\n\t\t\t\t,-0.172229\n\t\t\t\t,-0.709305\n\t\t\t\t,-0.683537\n\t\t\t\t,-0.17223\n\t\t\t\t,-0.49868\n\t\t\t\t,-0.866619\n\t\t\t\t,-0.0170534\n\t\t\t\t,-0.365281\n\t\t\t\t,-0.930839\n\t\t\t\t,-0.0103672\n\t\t\t\t,0.879127\n\t\t\t\t,-0.4761\n\t\t\t\t,0.021558\n\t\t\t\t,-0.226305\n\t\t\t\t,-0.972273\n\t\t\t\t,-0.0589092\n\t\t\t\t,-0.852956\n\t\t\t\t,-0.512218\n\t\t\t\t,-0.100492\n\t\t\t\t,-0.520794\n\t\t\t\t,-0.853673\n\t\t\t\t,0.00404816\n\t\t\t\t,-0.519065\n\t\t\t\t,-0.854734\n\t\t\t\t,-2.56596e-007\n\t\t\t\t,0.116763\n\t\t\t\t,-0.993155\n\t\t\t\t,0.00322929\n\t\t\t\t,0.890936\n\t\t\t\t,-0.454128\n\t\t\t\t,0\n\t\t\t\t,-0.890936\n\t\t\t\t,-0.45413\n\t\t\t\t,0\n\t\t\t\t,-0.476495\n\t\t\t\t,-0.878946\n\t\t\t\t,0.0201483\n\t\t\t\t,-0.365281\n\t\t\t\t,-0.930839\n\t\t\t\t,0.0103676\n\t\t\t\t,0.879612\n\t\t\t\t,-0.475048\n\t\t\t\t,-0.0247439\n\t\t\t\t,-0.266837\n\t\t\t\t,-0.963193\n\t\t\t\t,0.0325029\n\t\t\t\t,-0.854507\n\t\t\t\t,-0.510716\n\t\t\t\t,0.0948013\n\t\t\t\t,-0.368074\n\t\t\t\t,-0.929689\n\t\t\t\t,0.0141382\n\t\t\t\t,-0.388404\n\t\t\t\t,-0.921335\n\t\t\t\t,0.0168355\n\t\t\t\t,0.0592934\n\t\t\t\t,-0.998238\n\t\t\t\t,-0.00217858\n\t\t\t\t,0.731654\n\t\t\t\t,-0.667192\n\t\t\t\t,0.139776\n\t\t\t\t,-0.731653\n\t\t\t\t,-0.667193\n\t\t\t\t,0.139777\n\t\t\t\t,-0.191517\n\t\t\t\t,-0.981488\n\t\t\t\t,0.00173257\n\t\t\t\t,-0.159762\n\t\t\t\t,-0.987149\n\t\t\t\t,0.00365091\n\t\t\t\t,0.458107\n\t\t\t\t,-0.881751\n\t\t\t\t,0.112488\n\t\t\t\t,-0.143098\n\t\t\t\t,-0.989153\n\t\t\t\t,0.0331639\n\t\t\t\t,-0.458106\n\t\t\t\t,-0.881751\n\t\t\t\t,0.112488\n\t\t\t\t,0.0406632\n\t\t\t\t,-0.999173\n\t\t\t\t,0.000382587\n\t\t\t\t,8.38334e-008\n\t\t\t\t,-1\n\t\t\t\t,1.399e-007\n\t\t\t\t,-0.0335735\n\t\t\t\t,-0.99943\n\t\t\t\t,-0.00349352\n\t\t\t\t,0.0552983\n\t\t\t\t,-0.998072\n\t\t\t\t,-0.0281867\n\t\t\t\t,-0.0552979\n\t\t\t\t,-0.998072\n\t\t\t\t,-0.0281866\n\t\t\t\t,0.258806\n\t\t\t\t,-0.965915\n\t\t\t\t,-0.00524032\n\t\t\t\t,0.159762\n\t\t\t\t,-0.987149\n\t\t\t\t,-0.00365109\n\t\t\t\t,-0.414343\n\t\t\t\t,-0.898711\n\t\t\t\t,-0.143658\n\t\t\t\t,0.0602462\n\t\t\t\t,-0.998136\n\t\t\t\t,-0.0097673\n\t\t\t\t,0.414342\n\t\t\t\t,-0.898712\n\t\t\t\t,-0.143658\n\t\t\t\t,0.411744\n\t\t\t\t,-0.911111\n\t\t\t\t,-0.0185533\n\t\t\t\t,0.388404\n\t\t\t\t,-0.921335\n\t\t\t\t,-0.0168355\n\t\t\t\t,-0.106503\n\t\t\t\t,-0.994309\n\t\t\t\t,-0.00245154\n\t\t\t\t,-0.709306\n\t\t\t\t,-0.683536\n\t\t\t\t,-0.17223\n\t\t\t\t,0.709305\n\t\t\t\t,-0.683538\n\t\t\t\t,-0.17223\n\t\t\t\t,0.498675\n\t\t\t\t,-0.866621\n\t\t\t\t,-0.0170543\n\t\t\t\t,0.365281\n\t\t\t\t,-0.930839\n\t\t\t\t,-0.0103677\n\t\t\t\t,-0.852957\n\t\t\t\t,-0.512216\n\t\t\t\t,-0.100491\n\t\t\t\t,0.22629\n\t\t\t\t,-0.972277\n\t\t\t\t,-0.0589034\n\t\t\t\t,0.852956\n\t\t\t\t,-0.512218\n\t\t\t\t,-0.100491\n\t\t\t\t,0.890844\n\t\t\t\t,0.425036\n\t\t\t\t,0.160445\n\t\t\t\t,1\n\t\t\t\t,-1.04893e-007\n\t\t\t\t,0\n\t\t\t\t,0.890936\n\t\t\t\t,0.454129\n\t\t\t\t,0\n\t\t\t\t,1\n\t\t\t\t,-6.29359e-008\n\t\t\t\t,-1.0789e-007\n\t\t\t\t,0.890843\n\t\t\t\t,-0.425037\n\t\t\t\t,-0.160445\n\t\t\t\t,0.890935\n\t\t\t\t,-0.45413\n\t\t\t\t,0\n\t\t\t\t,1\n\t\t\t\t,-1.04893e-007\n\t\t\t\t,0\n\t\t\t\t,1\n\t\t\t\t,-6.29359e-008\n\t\t\t\t,-1.0789e-007\n\t\t\t\t,0.99997\n\t\t\t\t,0.00548179\n\t\t\t\t,-0.00548193\n\t\t\t\t,1\n\t\t\t\t,-6.29359e-008\n\t\t\t\t,-1.0789e-007\n\t\t\t\t,0.890844\n\t\t\t\t,0.425036\n\t\t\t\t,0.160445\n\t\t\t\t,0.890936\n\t\t\t\t,0.321118\n\t\t\t\t,0.321118\n\t\t\t\t,0.99997\n\t\t\t\t,0.00548179\n\t\t\t\t,-0.00548193\n\t\t\t\t,0.890843\n\t\t\t\t,-0.425037\n\t\t\t\t,-0.160445\n\t\t\t\t,1\n\t\t\t\t,-6.29359e-008\n\t\t\t\t,-1.0789e-007\n\t\t\t\t,0.890935\n\t\t\t\t,-0.321118\n\t\t\t\t,-0.321118\n\t\t\t\t,0.890844\n\t\t\t\t,0.187094\n\t\t\t\t,0.413997\n\t\t\t\t,0.99997\n\t\t\t\t,0.00548179\n\t\t\t\t,-0.00548193\n\t\t\t\t,0.890936\n\t\t\t\t,0.321118\n\t\t\t\t,0.321118\n\t\t\t\t,1\n\t\t\t\t,5.99375e-009\n\t\t\t\t,-1.16881e-007\n\t\t\t\t,0.890843\n\t\t\t\t,-0.187095\n\t\t\t\t,-0.413998\n\t\t\t\t,0.890935\n\t\t\t\t,-0.321118\n\t\t\t\t,-0.321118\n\t\t\t\t,0.99997\n\t\t\t\t,0.00548179\n\t\t\t\t,-0.00548193\n\t\t\t\t,1\n\t\t\t\t,5.99375e-009\n\t\t\t\t,-1.16881e-007\n\t\t\t\t,0.99997\n\t\t\t\t,0.00775251\n\t\t\t\t,-1.0489e-007\n\t\t\t\t,1\n\t\t\t\t,5.99375e-009\n\t\t\t\t,-1.16881e-007\n\t\t\t\t,0.890844\n\t\t\t\t,0.187094\n\t\t\t\t,0.413997\n\t\t\t\t,0.890936\n\t\t\t\t,0\n\t\t\t\t,0.454129\n\t\t\t\t,0.99997\n\t\t\t\t,0.00775251\n\t\t\t\t,-1.0489e-007\n\t\t\t\t,0.890843\n\t\t\t\t,-0.187095\n\t\t\t\t,-0.413998\n\t\t\t\t,1\n\t\t\t\t,5.99375e-009\n\t\t\t\t,-1.16881e-007\n\t\t\t\t,0.890935\n\t\t\t\t,0\n\t\t\t\t,-0.45413\n\t\t\t\t,0.890844\n\t\t\t\t,-0.160444\n\t\t\t\t,0.425036\n\t\t\t\t,0.99997\n\t\t\t\t,0.00775251\n\t\t\t\t,-1.0489e-007\n\t\t\t\t,0.890936\n\t\t\t\t,0\n\t\t\t\t,0.454129\n\t\t\t\t,1\n\t\t\t\t,2.27767e-007\n\t\t\t\t,-1.79818e-008\n\t\t\t\t,0.890843\n\t\t\t\t,0.160445\n\t\t\t\t,-0.425037\n\t\t\t\t,0.890935\n\t\t\t\t,0\n\t\t\t\t,-0.45413\n\t\t\t\t,0.99997\n\t\t\t\t,0.00775251\n\t\t\t\t,-1.0489e-007\n\t\t\t\t,1\n\t\t\t\t,2.27767e-007\n\t\t\t\t,-1.79818e-008\n\t\t\t\t,0.99997\n\t\t\t\t,0.00548196\n\t\t\t\t,0.00548181\n\t\t\t\t,1\n\t\t\t\t,2.27767e-007\n\t\t\t\t,-1.79818e-008\n\t\t\t\t,0.890844\n\t\t\t\t,-0.160444\n\t\t\t\t,0.425036\n\t\t\t\t,0.890936\n\t\t\t\t,-0.321117\n\t\t\t\t,0.321117\n\t\t\t\t,0.99997\n\t\t\t\t,0.00548196\n\t\t\t\t,0.00548181\n\t\t\t\t,0.890843\n\t\t\t\t,0.160445\n\t\t\t\t,-0.425037\n\t\t\t\t,1\n\t\t\t\t,2.27767e-007\n\t\t\t\t,-1.79818e-008\n\t\t\t\t,0.890936\n\t\t\t\t,0.321118\n\t\t\t\t,-0.321118\n\t\t\t\t,0.879127\n\t\t\t\t,-0.4761\n\t\t\t\t,0.021558\n\t\t\t\t,0.99997\n\t\t\t\t,0.00548196\n\t\t\t\t,0.00548181\n\t\t\t\t,0.890936\n\t\t\t\t,-0.321117\n\t\t\t\t,0.321117\n\t\t\t\t,1\n\t\t\t\t,7.49234e-008\n\t\t\t\t,-8.99079e-008\n\t\t\t\t,0.890843\n\t\t\t\t,0.413998\n\t\t\t\t,-0.187094\n\t\t\t\t,0.890936\n\t\t\t\t,0.321118\n\t\t\t\t,-0.321118\n\t\t\t\t,0.99997\n\t\t\t\t,0.00548196\n\t\t\t\t,0.00548181\n\t\t\t\t,1\n\t\t\t\t,7.49234e-008\n\t\t\t\t,-8.99079e-008\n\t\t\t\t,0.99997\n\t\t\t\t,1.0489e-007\n\t\t\t\t,0.00775245\n\t\t\t\t,1\n\t\t\t\t,7.49234e-008\n\t\t\t\t,-8.99079e-008\n\t\t\t\t,0.879127\n\t\t\t\t,-0.4761\n\t\t\t\t,0.021558\n\t\t\t\t,0.890936\n\t\t\t\t,-0.454128\n\t\t\t\t,0\n\t\t\t\t,0.99997\n\t\t\t\t,1.0489e-007\n\t\t\t\t,0.00775245\n\t\t\t\t,0.890843\n\t\t\t\t,0.413998\n\t\t\t\t,-0.187094\n\t\t\t\t,1\n\t\t\t\t,7.49234e-008\n\t\t\t\t,-8.99079e-008\n\t\t\t\t,0.890936\n\t\t\t\t,0.45413\n\t\t\t\t,0\n\t\t\t\t,0.879612\n\t\t\t\t,-0.475048\n\t\t\t\t,-0.0247439\n\t\t\t\t,0.99997\n\t\t\t\t,1.0489e-007\n\t\t\t\t,0.00775245\n\t\t\t\t,0.890936\n\t\t\t\t,-0.454128\n\t\t\t\t,0\n\t\t\t\t,1\n\t\t\t\t,7.19265e-008\n\t\t\t\t,8.84094e-008\n\t\t\t\t,0.890843\n\t\t\t\t,0.425037\n\t\t\t\t,0.160445\n\t\t\t\t,0.890936\n\t\t\t\t,0.45413\n\t\t\t\t,0\n\t\t\t\t,0.99997\n\t\t\t\t,1.0489e-007\n\t\t\t\t,0.00775245\n\t\t\t\t,1\n\t\t\t\t,7.19265e-008\n\t\t\t\t,8.84094e-008\n\t\t\t\t,0.99997\n\t\t\t\t,-0.00548177\n\t\t\t\t,0.00548192\n\t\t\t\t,1\n\t\t\t\t,7.19265e-008\n\t\t\t\t,8.84094e-008\n\t\t\t\t,0.879612\n\t\t\t\t,-0.475048\n\t\t\t\t,-0.0247439\n\t\t\t\t,0.890936\n\t\t\t\t,-0.321117\n\t\t\t\t,-0.321117\n\t\t\t\t,0.99997\n\t\t\t\t,-0.00548177\n\t\t\t\t,0.00548192\n\t\t\t\t,0.890843\n\t\t\t\t,0.425037\n\t\t\t\t,0.160445\n\t\t\t\t,1\n\t\t\t\t,7.19265e-008\n\t\t\t\t,8.84094e-008\n\t\t\t\t,0.890936\n\t\t\t\t,0.321118\n\t\t\t\t,0.321118\n\t\t\t\t,0.890844\n\t\t\t\t,-0.187094\n\t\t\t\t,-0.413997\n\t\t\t\t,0.99997\n\t\t\t\t,-0.00548177\n\t\t\t\t,0.00548192\n\t\t\t\t,0.890936\n\t\t\t\t,-0.321117\n\t\t\t\t,-0.321117\n\t\t\t\t,1\n\t\t\t\t,-1.49837e-009\n\t\t\t\t,1.04893e-007\n\t\t\t\t,0.890843\n\t\t\t\t,0.187095\n\t\t\t\t,0.413998\n\t\t\t\t,0.890936\n\t\t\t\t,0.321118\n\t\t\t\t,0.321118\n\t\t\t\t,0.99997\n\t\t\t\t,-0.00548177\n\t\t\t\t,0.00548192\n\t\t\t\t,1\n\t\t\t\t,-1.49837e-009\n\t\t\t\t,1.04893e-007\n\t\t\t\t,0.99997\n\t\t\t\t,-0.00775251\n\t\t\t\t,1.0489e-007\n\t\t\t\t,1\n\t\t\t\t,-1.49837e-009\n\t\t\t\t,1.04893e-007\n\t\t\t\t,0.890844\n\t\t\t\t,-0.187094\n\t\t\t\t,-0.413997\n\t\t\t\t,0.890936\n\t\t\t\t,0\n\t\t\t\t,-0.454129\n\t\t\t\t,0.99997\n\t\t\t\t,-0.00775251\n\t\t\t\t,1.0489e-007\n\t\t\t\t,0.890843\n\t\t\t\t,0.187095\n\t\t\t\t,0.413998\n\t\t\t\t,1\n\t\t\t\t,-1.49837e-009\n\t\t\t\t,1.04893e-007\n\t\t\t\t,0.890935\n\t\t\t\t,0\n\t\t\t\t,0.45413\n\t\t\t\t,0.890844\n\t\t\t\t,0.160445\n\t\t\t\t,-0.425036\n\t\t\t\t,0.99997\n\t\t\t\t,-0.00775251\n\t\t\t\t,1.0489e-007\n\t\t\t\t,0.890936\n\t\t\t\t,0\n\t\t\t\t,-0.454129\n\t\t\t\t,1\n\t\t\t\t,8.99069e-009\n\t\t\t\t,1.16881e-007\n\t\t\t\t,0.890843\n\t\t\t\t,-0.160445\n\t\t\t\t,0.425037\n\t\t\t\t,0.890935\n\t\t\t\t,0\n\t\t\t\t,0.45413\n\t\t\t\t,0.99997\n\t\t\t\t,-0.00775251\n\t\t\t\t,1.0489e-007\n\t\t\t\t,1\n\t\t\t\t,8.99069e-009\n\t\t\t\t,1.16881e-007\n\t\t\t\t,0.99997\n\t\t\t\t,-0.00548188\n\t\t\t\t,-0.00548174\n\t\t\t\t,1\n\t\t\t\t,8.99069e-009\n\t\t\t\t,1.16881e-007\n\t\t\t\t,0.890844\n\t\t\t\t,0.160445\n\t\t\t\t,-0.425036\n\t\t\t\t,0.890936\n\t\t\t\t,0.321118\n\t\t\t\t,-0.321118\n\t\t\t\t,0.99997\n\t\t\t\t,-0.00548188\n\t\t\t\t,-0.00548174\n\t\t\t\t,0.890843\n\t\t\t\t,-0.160445\n\t\t\t\t,0.425037\n\t\t\t\t,1\n\t\t\t\t,8.99069e-009\n\t\t\t\t,1.16881e-007\n\t\t\t\t,0.890935\n\t\t\t\t,-0.321118\n\t\t\t\t,0.321119\n\t\t\t\t,0.890844\n\t\t\t\t,0.413997\n\t\t\t\t,-0.187094\n\t\t\t\t,0.99997\n\t\t\t\t,-0.00548188\n\t\t\t\t,-0.00548174\n\t\t\t\t,0.890936\n\t\t\t\t,0.321118\n\t\t\t\t,-0.321118\n\t\t\t\t,1\n\t\t\t\t,-5.9939e-008\n\t\t\t\t,1.06391e-007\n\t\t\t\t,0.890843\n\t\t\t\t,-0.413998\n\t\t\t\t,0.187094\n\t\t\t\t,0.890935\n\t\t\t\t,-0.321118\n\t\t\t\t,0.321119\n\t\t\t\t,0.99997\n\t\t\t\t,-0.00548188\n\t\t\t\t,-0.00548174\n\t\t\t\t,1\n\t\t\t\t,-5.9939e-008\n\t\t\t\t,1.06391e-007\n\t\t\t\t,1\n\t\t\t\t,-1.04893e-007\n\t\t\t\t,0\n\t\t\t\t,1\n\t\t\t\t,-5.9939e-008\n\t\t\t\t,1.06391e-007\n\t\t\t\t,0.890844\n\t\t\t\t,0.413997\n\t\t\t\t,-0.187094\n\t\t\t\t,0.890936\n\t\t\t\t,0.454129\n\t\t\t\t,0\n\t\t\t\t,1\n\t\t\t\t,-1.04893e-007\n\t\t\t\t,0\n\t\t\t\t,0.890843\n\t\t\t\t,-0.413998\n\t\t\t\t,0.187094\n\t\t\t\t,1\n\t\t\t\t,-5.9939e-008\n\t\t\t\t,1.06391e-007\n\t\t\t\t,0.890935\n\t\t\t\t,-0.45413\n\t\t\t\t,0\n\t\t\t\t,0\n\t\t\t\t,-1\n\t\t\t\t,2.52284e-012\n\t\t\t\t,0.476481\n\t\t\t\t,-0.878954\n\t\t\t\t,0.0201475\n\t\t\t\t,0.520796\n\t\t\t\t,-0.853672\n\t\t\t\t,0.00404876\n\t\t\t\t,0.365282\n\t\t\t\t,-0.930839\n\t\t\t\t,0.0103679\n\t\t\t\t,0\n\t\t\t\t,-1\n\t\t\t\t,-9.2524e-010\n\t\t\t\t,0.519065\n\t\t\t\t,-0.854735\n\t\t\t\t,5.72002e-007\n\t\t\t\t,-0.854508\n\t\t\t\t,-0.510715\n\t\t\t\t,0.0948014\n\t\t\t\t,-0.890936\n\t\t\t\t,-0.454129\n\t\t\t\t,8.30525e-008\n\t\t\t\t,-0.116762\n\t\t\t\t,-0.993155\n\t\t\t\t,0.00323105\n\t\t\t\t,0.266829\n\t\t\t\t,-0.963196\n\t\t\t\t,0.0325065\n\t\t\t\t,0.854507\n\t\t\t\t,-0.510716\n\t\t\t\t,0.0948018\n\t\t\t\t,0.890935\n\t\t\t\t,-0.45413\n\t\t\t\t,8.42227e-008\n\t\t\t\t,0.368066\n\t\t\t\t,-0.929692\n\t\t\t\t,0.014135\n\t\t\t\t,0.388404\n\t\t\t\t,-0.921335\n\t\t\t\t,0.0168356\n\t\t\t\t,-0.0592992\n\t\t\t\t,-0.998238\n\t\t\t\t,-0.0021794\n\t\t\t\t,-0.731654\n\t\t\t\t,-0.667192\n\t\t\t\t,0.139776\n\t\t\t\t,0.731652\n\t\t\t\t,-0.667194\n\t\t\t\t,0.139777\n\t\t\t\t,0.191517\n\t\t\t\t,-0.981488\n\t\t\t\t,0.00173125\n\t\t\t\t,0.159762\n\t\t\t\t,-0.987149\n\t\t\t\t,0.00365135\n\t\t\t\t,-0.458106\n\t\t\t\t,-0.881751\n\t\t\t\t,0.112488\n\t\t\t\t,0.143094\n\t\t\t\t,-0.989153\n\t\t\t\t,0.0331622\n\t\t\t\t,0.458105\n\t\t\t\t,-0.881752\n\t\t\t\t,0.112488\n\t\t\t\t,-0.040661\n\t\t\t\t,-0.999173\n\t\t\t\t,0.000383077\n\t\t\t\t,-5.5533e-008\n\t\t\t\t,-1\n\t\t\t\t,9.0775e-008\n\t\t\t\t,0.0335745\n\t\t\t\t,-0.99943\n\t\t\t\t,-0.00349344\n\t\t\t\t,-0.055298\n\t\t\t\t,-0.998072\n\t\t\t\t,-0.0281865\n\t\t\t\t,0.0552977\n\t\t\t\t,-0.998072\n\t\t\t\t,-0.0281864\n\t\t\t\t,-0.25881\n\t\t\t\t,-0.965914\n\t\t\t\t,-0.00523835\n\t\t\t\t,-0.159762\n\t\t\t\t,-0.987149\n\t\t\t\t,-0.00365167\n\t\t\t\t,0.414342\n\t\t\t\t,-0.898712\n\t\t\t\t,-0.143659\n\t\t\t\t,-0.0602464\n\t\t\t\t,-0.998136\n\t\t\t\t,-0.00976645\n\t\t\t\t,-0.414341\n\t\t\t\t,-0.898712\n\t\t\t\t,-0.143659\n\t\t\t\t,-0.411755\n\t\t\t\t,-0.911106\n\t\t\t\t,-0.0185524\n\t\t\t\t,-0.388405\n\t\t\t\t,-0.921335\n\t\t\t\t,-0.0168356\n\t\t\t\t,0.106499\n\t\t\t\t,-0.99431\n\t\t\t\t,-0.00245126\n\t\t\t\t,0.709307\n\t\t\t\t,-0.683536\n\t\t\t\t,-0.172229\n\t\t\t\t,-0.709306\n\t\t\t\t,-0.683537\n\t\t\t\t,-0.17223\n\t\t\t\t,-0.49868\n\t\t\t\t,-0.866618\n\t\t\t\t,-0.0170546\n\t\t\t\t,-0.365281\n\t\t\t\t,-0.930839\n\t\t\t\t,-0.0103678\n\t\t\t\t,0.879127\n\t\t\t\t,-0.4761\n\t\t\t\t,0.021558\n\t\t\t\t,-0.226305\n\t\t\t\t,-0.972273\n\t\t\t\t,-0.0589106\n\t\t\t\t,-0.852956\n\t\t\t\t,-0.512218\n\t\t\t\t,-0.100492\n\t\t\t\t,-0.520794\n\t\t\t\t,-0.853673\n\t\t\t\t,0.00404862\n\t\t\t\t,-0.519065\n\t\t\t\t,-0.854735\n\t\t\t\t,-5.75728e-007\n\t\t\t\t,0.116763\n\t\t\t\t,-0.993155\n\t\t\t\t,0.00322857\n\t\t\t\t,0.890936\n\t\t\t\t,-0.454128\n\t\t\t\t,-1.60722e-008\n\t\t\t\t,-0.890935\n\t\t\t\t,-0.45413\n\t\t\t\t,-8.30528e-008\n\t\t\t\t,-0.476495\n\t\t\t\t,-0.878946\n\t\t\t\t,0.0201481\n\t\t\t\t,-0.365281\n\t\t\t\t,-0.930839\n\t\t\t\t,0.0103668\n\t\t\t\t,0.879612\n\t\t\t\t,-0.475048\n\t\t\t\t,-0.0247441\n\t\t\t\t,-0.266837\n\t\t\t\t,-0.963193\n\t\t\t\t,0.0325018\n\t\t\t\t,-0.854507\n\t\t\t\t,-0.510716\n\t\t\t\t,0.0948004\n\t\t\t\t,-0.368074\n\t\t\t\t,-0.929689\n\t\t\t\t,0.0141373\n\t\t\t\t,-0.388404\n\t\t\t\t,-0.921335\n\t\t\t\t,0.0168346\n\t\t\t\t,0.0592937\n\t\t\t\t,-0.998238\n\t\t\t\t,-0.00218079\n\t\t\t\t,0.731654\n\t\t\t\t,-0.667192\n\t\t\t\t,0.139776\n\t\t\t\t,-0.731653\n\t\t\t\t,-0.667193\n\t\t\t\t,0.139777\n\t\t\t\t,-0.191517\n\t\t\t\t,-0.981488\n\t\t\t\t,0.00173398\n\t\t\t\t,-0.159762\n\t\t\t\t,-0.987149\n\t\t\t\t,0.00364927\n\t\t\t\t,0.458107\n\t\t\t\t,-0.881751\n\t\t\t\t,0.112487\n\t\t\t\t,-0.143099\n\t\t\t\t,-0.989153\n\t\t\t\t,0.0331632\n\t\t\t\t,-0.458106\n\t\t\t\t,-0.881751\n\t\t\t\t,0.112487\n\t\t\t\t,0.0406631\n\t\t\t\t,-0.999173\n\t\t\t\t,0.000382177\n\t\t\t\t,8.32995e-008\n\t\t\t\t,-1\n\t\t\t\t,1.38832e-007\n\t\t\t\t,-0.0335734\n\t\t\t\t,-0.99943\n\t\t\t\t,-0.0034935\n\t\t\t\t,0.0552984\n\t\t\t\t,-0.998072\n\t\t\t\t,-0.0281868\n\t\t\t\t,-0.055298\n\t\t\t\t,-0.998072\n\t\t\t\t,-0.0281867\n\t\t\t\t,0.258806\n\t\t\t\t,-0.965915\n\t\t\t\t,-0.00524027\n\t\t\t\t,0.159762\n\t\t\t\t,-0.987149\n\t\t\t\t,-0.00364979\n\t\t\t\t,-0.414343\n\t\t\t\t,-0.898711\n\t\t\t\t,-0.143657\n\t\t\t\t,0.0602467\n\t\t\t\t,-0.998136\n\t\t\t\t,-0.00976724\n\t\t\t\t,0.414342\n\t\t\t\t,-0.898712\n\t\t\t\t,-0.143658\n\t\t\t\t,0.411744\n\t\t\t\t,-0.911111\n\t\t\t\t,-0.0185529\n\t\t\t\t,0.388404\n\t\t\t\t,-0.921335\n\t\t\t\t,-0.0168343\n\t\t\t\t,-0.106502\n\t\t\t\t,-0.994309\n\t\t\t\t,-0.00244955\n\t\t\t\t,-0.709306\n\t\t\t\t,-0.683536\n\t\t\t\t,-0.17223\n\t\t\t\t,0.709305\n\t\t\t\t,-0.683537\n\t\t\t\t,-0.17223\n\t\t\t\t,0.498675\n\t\t\t\t,-0.866621\n\t\t\t\t,-0.0170548\n\t\t\t\t,0.365281\n\t\t\t\t,-0.930839\n\t\t\t\t,-0.010367\n\t\t\t\t,-0.852957\n\t\t\t\t,-0.512216\n\t\t\t\t,-0.10049\n\t\t\t\t,0.22629\n\t\t\t\t,-0.972277\n\t\t\t\t,-0.0589018\n\t\t\t\t,0.852957\n\t\t\t\t,-0.512217\n\t\t\t\t,-0.100491\n\t\t\t\t,0.890844\n\t\t\t\t,0.425036\n\t\t\t\t,0.160445\n\t\t\t\t,1\n\t\t\t\t,-1.04893e-007\n\t\t\t\t,-2.48621e-009\n\t\t\t\t,0.890936\n\t\t\t\t,0.454129\n\t\t\t\t,8.38242e-008\n\t\t\t\t,1\n\t\t\t\t,-1.43853e-007\n\t\t\t\t,8.09172e-008\n\t\t\t\t,0.890843\n\t\t\t\t,-0.425037\n\t\t\t\t,-0.160445\n\t\t\t\t,0.890935\n\t\t\t\t,-0.45413\n\t\t\t\t,-8.50053e-008\n\t\t\t\t,1\n\t\t\t\t,-1.04893e-007\n\t\t\t\t,-2.48621e-009\n\t\t\t\t,1\n\t\t\t\t,-1.43853e-007\n\t\t\t\t,8.09172e-008\n\t\t\t\t,0.99997\n\t\t\t\t,0.00548173\n\t\t\t\t,-0.00548187\n\t\t\t\t,1\n\t\t\t\t,-1.43853e-007\n\t\t\t\t,8.09172e-008\n\t\t\t\t,0.890844\n\t\t\t\t,0.425036\n\t\t\t\t,0.160445\n\t\t\t\t,0.890936\n\t\t\t\t,0.321118\n\t\t\t\t,0.321117\n\t\t\t\t,0.99997\n\t\t\t\t,0.00548173\n\t\t\t\t,-0.00548187\n\t\t\t\t,0.890843\n\t\t\t\t,-0.425037\n\t\t\t\t,-0.160445\n\t\t\t\t,1\n\t\t\t\t,-1.43853e-007\n\t\t\t\t,8.09172e-008\n\t\t\t\t,0.890935\n\t\t\t\t,-0.321119\n\t\t\t\t,-0.321118\n\t\t\t\t,0.890844\n\t\t\t\t,0.187094\n\t\t\t\t,0.413997\n\t\t\t\t,0.99997\n\t\t\t\t,0.00548173\n\t\t\t\t,-0.00548187\n\t\t\t\t,0.890936\n\t\t\t\t,0.321118\n\t\t\t\t,0.321117\n\t\t\t\t,1\n\t\t\t\t,-7.0428e-008\n\t\t\t\t,-8.39144e-008\n\t\t\t\t,0.890843\n\t\t\t\t,-0.187094\n\t\t\t\t,-0.413998\n\t\t\t\t,0.890935\n\t\t\t\t,-0.321119\n\t\t\t\t,-0.321118\n\t\t\t\t,0.99997\n\t\t\t\t,0.00548173\n\t\t\t\t,-0.00548187\n\t\t\t\t,1\n\t\t\t\t,-7.0428e-008\n\t\t\t\t,-8.39144e-008\n\t\t\t\t,0.99997\n\t\t\t\t,0.00775251\n\t\t\t\t,-1.0489e-007\n\t\t\t\t,1\n\t\t\t\t,-7.0428e-008\n\t\t\t\t,-8.39144e-008\n\t\t\t\t,0.890844\n\t\t\t\t,0.187094\n\t\t\t\t,0.413997\n\t\t\t\t,0.890936\n\t\t\t\t,0\n\t\t\t\t,0.454128\n\t\t\t\t,0.99997\n\t\t\t\t,0.00775251\n\t\t\t\t,-1.0489e-007\n\t\t\t\t,0.890843\n\t\t\t\t,-0.187094\n\t\t\t\t,-0.413998\n\t\t\t\t,1\n\t\t\t\t,-7.0428e-008\n\t\t\t\t,-8.39144e-008\n\t\t\t\t,0.890936\n\t\t\t\t,0\n\t\t\t\t,-0.454129\n\t\t\t\t,0.890844\n\t\t\t\t,-0.160444\n\t\t\t\t,0.425036\n\t\t\t\t,0.99997\n\t\t\t\t,0.00775251\n\t\t\t\t,-1.0489e-007\n\t\t\t\t,0.890936\n\t\t\t\t,0\n\t\t\t\t,0.454128\n\t\t\t\t,1\n\t\t\t\t,3.07185e-007\n\t\t\t\t,2.09782e-008\n\t\t\t\t,0.890843\n\t\t\t\t,0.160445\n\t\t\t\t,-0.425037\n\t\t\t\t,0.890936\n\t\t\t\t,0\n\t\t\t\t,-0.454129\n\t\t\t\t,0.99997\n\t\t\t\t,0.00775251\n\t\t\t\t,-1.0489e-007\n\t\t\t\t,1\n\t\t\t\t,3.07185e-007\n\t\t\t\t,2.09782e-008\n\t\t\t\t,0.99997\n\t\t\t\t,0.00548202\n\t\t\t\t,0.00548187\n\t\t\t\t,1\n\t\t\t\t,3.07185e-007\n\t\t\t\t,2.09782e-008\n\t\t\t\t,0.890844\n\t\t\t\t,-0.160444\n\t\t\t\t,0.425036\n\t\t\t\t,0.890936\n\t\t\t\t,-0.321117\n\t\t\t\t,0.321117\n\t\t\t\t,0.99997\n\t\t\t\t,0.00548202\n\t\t\t\t,0.00548187\n\t\t\t\t,0.890843\n\t\t\t\t,0.160445\n\t\t\t\t,-0.425037\n\t\t\t\t,1\n\t\t\t\t,3.07185e-007\n\t\t\t\t,2.09782e-008\n\t\t\t\t,0.890936\n\t\t\t\t,0.321118\n\t\t\t\t,-0.321118\n\t\t\t\t,0.879127\n\t\t\t\t,-0.4761\n\t\t\t\t,0.021558\n\t\t\t\t,0.99997\n\t\t\t\t,0.00548202\n\t\t\t\t,0.00548187\n\t\t\t\t,0.890936\n\t\t\t\t,-0.321117\n\t\t\t\t,0.321117\n\t\t\t\t,1\n\t\t\t\t,1.5584e-007\n\t\t\t\t,1.03394e-007\n\t\t\t\t,0.890843\n\t\t\t\t,0.413998\n\t\t\t\t,-0.187095\n\t\t\t\t,0.890936\n\t\t\t\t,0.321118\n\t\t\t\t,-0.321118\n\t\t\t\t,0.99997\n\t\t\t\t,0.00548202\n\t\t\t\t,0.00548187\n\t\t\t\t,1\n\t\t\t\t,1.5584e-007\n\t\t\t\t,1.03394e-007\n\t\t\t\t,0.99997\n\t\t\t\t,1.06553e-007\n\t\t\t\t,0.00775257\n\t\t\t\t,1\n\t\t\t\t,1.5584e-007\n\t\t\t\t,1.03394e-007\n\t\t\t\t,0.879127\n\t\t\t\t,-0.4761\n\t\t\t\t,0.021558\n\t\t\t\t,0.890936\n\t\t\t\t,-0.454128\n\t\t\t\t,-1.60722e-008\n\t\t\t\t,0.99997\n\t\t\t\t,1.06553e-007\n\t\t\t\t,0.00775257\n\t\t\t\t,0.890843\n\t\t\t\t,0.413998\n\t\t\t\t,-0.187095\n\t\t\t\t,1\n\t\t\t\t,1.5584e-007\n\t\t\t\t,1.03394e-007\n\t\t\t\t,0.890936\n\t\t\t\t,0.45413\n\t\t\t\t,-8.38246e-008\n\t\t\t\t,0.879612\n\t\t\t\t,-0.475048\n\t\t\t\t,-0.0247441\n\t\t\t\t,0.99997\n\t\t\t\t,1.06553e-007\n\t\t\t\t,0.00775257\n\t\t\t\t,0.890936\n\t\t\t\t,-0.454128\n\t\t\t\t,-1.60722e-008\n\t\t\t\t,1\n\t\t\t\t,2.99726e-009\n\t\t\t\t,2.80213e-007\n\t\t\t\t,0.890843\n\t\t\t\t,0.425037\n\t\t\t\t,0.160445\n\t\t\t\t,0.890936\n\t\t\t\t,0.45413\n\t\t\t\t,-8.38246e-008\n\t\t\t\t,0.99997\n\t\t\t\t,1.06553e-007\n\t\t\t\t,0.00775257\n\t\t\t\t,1\n\t\t\t\t,2.99726e-009\n\t\t\t\t,2.80213e-007\n\t\t\t\t,0.99997\n\t\t\t\t,-0.00548183\n\t\t\t\t,0.00548198\n\t\t\t\t,1\n\t\t\t\t,2.99726e-009\n\t\t\t\t,2.80213e-007\n\t\t\t\t,0.879612\n\t\t\t\t,-0.475048\n\t\t\t\t,-0.0247441\n\t\t\t\t,0.890936\n\t\t\t\t,-0.321117\n\t\t\t\t,-0.321117\n\t\t\t\t,0.99997\n\t\t\t\t,-0.00548183\n\t\t\t\t,0.00548198\n\t\t\t\t,0.890843\n\t\t\t\t,0.425037\n\t\t\t\t,0.160445\n\t\t\t\t,1\n\t\t\t\t,2.99726e-009\n\t\t\t\t,2.80213e-007\n\t\t\t\t,0.890936\n\t\t\t\t,0.321118\n\t\t\t\t,0.321118\n\t\t\t\t,0.890843\n\t\t\t\t,-0.187095\n\t\t\t\t,-0.413998\n\t\t\t\t,0.99997\n\t\t\t\t,-0.00548183\n\t\t\t\t,0.00548198\n\t\t\t\t,0.890936\n\t\t\t\t,-0.321117\n\t\t\t\t,-0.321117\n\t\t\t\t,1\n\t\t\t\t,-7.49223e-009\n\t\t\t\t,1.10887e-007\n\t\t\t\t,0.890843\n\t\t\t\t,0.187095\n\t\t\t\t,0.413999\n\t\t\t\t,0.890936\n\t\t\t\t,0.321118\n\t\t\t\t,0.321118\n\t\t\t\t,0.99997\n\t\t\t\t,-0.00548183\n\t\t\t\t,0.00548198\n\t\t\t\t,1\n\t\t\t\t,-7.49223e-009\n\t\t\t\t,1.10887e-007\n\t\t\t\t,0.99997\n\t\t\t\t,-0.00775251\n\t\t\t\t,1.0489e-007\n\t\t\t\t,1\n\t\t\t\t,-7.49223e-009\n\t\t\t\t,1.10887e-007\n\t\t\t\t,0.890843\n\t\t\t\t,-0.187095\n\t\t\t\t,-0.413998\n\t\t\t\t,0.890936\n\t\t\t\t,0\n\t\t\t\t,-0.454129\n\t\t\t\t,0.99997\n\t\t\t\t,-0.00775251\n\t\t\t\t,1.0489e-007\n\t\t\t\t,0.890843\n\t\t\t\t,0.187095\n\t\t\t\t,0.413999\n\t\t\t\t,1\n\t\t\t\t,-7.49223e-009\n\t\t\t\t,1.10887e-007\n\t\t\t\t,0.890935\n\t\t\t\t,0\n\t\t\t\t,0.45413\n\t\t\t\t,0.890843\n\t\t\t\t,0.160445\n\t\t\t\t,-0.425036\n\t\t\t\t,0.99997\n\t\t\t\t,-0.00775251\n\t\t\t\t,1.0489e-007\n\t\t\t\t,0.890936\n\t\t\t\t,0\n\t\t\t\t,-0.454129\n\t\t\t\t,1\n\t\t\t\t,1.6483e-008\n\t\t\t\t,1.13884e-007\n\t\t\t\t,0.890843\n\t\t\t\t,-0.160446\n\t\t\t\t,0.425037\n\t\t\t\t,0.890935\n\t\t\t\t,0\n\t\t\t\t,0.45413\n\t\t\t\t,0.99997\n\t\t\t\t,-0.00775251\n\t\t\t\t,1.0489e-007\n\t\t\t\t,1\n\t\t\t\t,1.6483e-008\n\t\t\t\t,1.13884e-007\n\t\t\t\t,0.99997\n\t\t\t\t,-0.00548189\n\t\t\t\t,-0.00548174\n\t\t\t\t,1\n\t\t\t\t,1.6483e-008\n\t\t\t\t,1.13884e-007\n\t\t\t\t,0.890843\n\t\t\t\t,0.160445\n\t\t\t\t,-0.425036\n\t\t\t\t,0.890936\n\t\t\t\t,0.321118\n\t\t\t\t,-0.321117\n\t\t\t\t,0.99997\n\t\t\t\t,-0.00548189\n\t\t\t\t,-0.00548174\n\t\t\t\t,0.890843\n\t\t\t\t,-0.160446\n\t\t\t\t,0.425037\n\t\t\t\t,1\n\t\t\t\t,1.6483e-008\n\t\t\t\t,1.13884e-007\n\t\t\t\t,0.890935\n\t\t\t\t,-0.321119\n\t\t\t\t,0.321118\n\t\t\t\t,0.890844\n\t\t\t\t,0.413998\n\t\t\t\t,-0.187093\n\t\t\t\t,0.99997\n\t\t\t\t,-0.00548189\n\t\t\t\t,-0.00548174\n\t\t\t\t,0.890936\n\t\t\t\t,0.321118\n\t\t\t\t,-0.321117\n\t\t\t\t,1\n\t\t\t\t,1.19875e-008\n\t\t\t\t,2.99694e-007\n\t\t\t\t,0.890843\n\t\t\t\t,-0.413999\n\t\t\t\t,0.187094\n\t\t\t\t,0.890935\n\t\t\t\t,-0.321119\n\t\t\t\t,0.321118\n\t\t\t\t,0.99997\n\t\t\t\t,-0.00548189\n\t\t\t\t,-0.00548174\n\t\t\t\t,1\n\t\t\t\t,1.19875e-008\n\t\t\t\t,2.99694e-007\n\t\t\t\t,1\n\t\t\t\t,-1.04893e-007\n\t\t\t\t,-2.48621e-009\n\t\t\t\t,1\n\t\t\t\t,1.19875e-008\n\t\t\t\t,2.99694e-007\n\t\t\t\t,0.890844\n\t\t\t\t,0.413998\n\t\t\t\t,-0.187093\n\t\t\t\t,0.890936\n\t\t\t\t,0.454129\n\t\t\t\t,8.38242e-008\n\t\t\t\t,1\n\t\t\t\t,-1.04893e-007\n\t\t\t\t,-2.48621e-009\n\t\t\t\t,0.890843\n\t\t\t\t,-0.413999\n\t\t\t\t,0.187094\n\t\t\t\t,1\n\t\t\t\t,1.19875e-008\n\t\t\t\t,2.99694e-007\n\t\t\t\t,0.890935\n\t\t\t\t,-0.45413\n\t\t\t\t,-8.50053e-008\n\t\t\t\t,0.068379\n\t\t\t\t,0.419691\n\t\t\t\t,0.905088\n\t\t\t\t,0.0785872\n\t\t\t\t,0.368786\n\t\t\t\t,0.926187\n\t\t\t\t,0.068379\n\t\t\t\t,0.419691\n\t\t\t\t,0.905088\n\t\t\t\t,0.0785871\n\t\t\t\t,0.368785\n\t\t\t\t,0.926186\n\t\t\t\t,-0.0683789\n\t\t\t\t,0.419691\n\t\t\t\t,0.905088\n\t\t\t\t,-0.0785871\n\t\t\t\t,0.368786\n\t\t\t\t,0.926186\n\t\t\t\t,-0.0683789\n\t\t\t\t,0.419691\n\t\t\t\t,0.905088\n\t\t\t\t,-0.0785871\n\t\t\t\t,0.368786\n\t\t\t\t,0.926186\n\t\t\t\t,0.708743\n\t\t\t\t,0.61827\n\t\t\t\t,-0.339744\n\t\t\t\t,0.708743\n\t\t\t\t,0.61827\n\t\t\t\t,-0.339744\n\t\t\t\t,0.708743\n\t\t\t\t,-0.61827\n\t\t\t\t,0.339744\n\t\t\t\t,0.708743\n\t\t\t\t,-0.61827\n\t\t\t\t,0.339744\n\t\t\t\t,0.708743\n\t\t\t\t,-0.673878\n\t\t\t\t,0.20874\n\t\t\t\t,0.708743\n\t\t\t\t,-0.673878\n\t\t\t\t,0.20874\n\t\t\t\t,0.708743\n\t\t\t\t,0.673878\n\t\t\t\t,-0.20874\n\t\t\t\t,0.708743\n\t\t\t\t,0.673878\n\t\t\t\t,-0.20874\n\t\t\t\t,-0.983523\n\t\t\t\t,0.0233562\n\t\t\t\t,0.179268\n\t\t\t\t,-0.995293\n\t\t\t\t,-0.0298194\n\t\t\t\t,-0.0922077\n\t\t\t\t,-0.994145\n\t\t\t\t,0.0900013\n\t\t\t\t,-0.0597891\n\t\t\t\t,-0.996611\n\t\t\t\t,0.0423863\n\t\t\t\t,-0.0705022\n\t\t\t\t,0.216896\n\t\t\t\t,0.578988\n\t\t\t\t,-0.785958\n\t\t\t\t,0.43759\n\t\t\t\t,-0.2488\n\t\t\t\t,-0.864068\n\t\t\t\t,-0.431291\n\t\t\t\t,0.00373085\n\t\t\t\t,-0.902205\n\t\t\t\t,-0.429586\n\t\t\t\t,-0.0156904\n\t\t\t\t,-0.902889\n\t\t\t\t,-0.934945\n\t\t\t\t,0.0385318\n\t\t\t\t,-0.352694\n\t\t\t\t,-0.942772\n\t\t\t\t,-0.227459\n\t\t\t\t,-0.243811\n\t\t\t\t,-0.96488\n\t\t\t\t,-0.00433636\n\t\t\t\t,0.262655\n\t\t\t\t,-0.911581\n\t\t\t\t,0.199645\n\t\t\t\t,0.359391\n\t\t\t\t,-0.645829\n\t\t\t\t,0.0122937\n\t\t\t\t,0.763383\n\t\t\t\t,-0.100898\n\t\t\t\t,0.132003\n\t\t\t\t,0.986101\n\t\t\t\t,0.0277032\n\t\t\t\t,-0.0270709\n\t\t\t\t,0.99925\n\t\t\t\t,0.932465\n\t\t\t\t,0.17919\n\t\t\t\t,0.313689\n\t\t\t\t,-0.986883\n\t\t\t\t,0.0318893\n\t\t\t\t,0.158258\n\t\t\t\t,-0.945839\n\t\t\t\t,0.174521\n\t\t\t\t,-0.273736\n\t\t\t\t,-0.932061\n\t\t\t\t,0.356806\n\t\t\t\t,-0.0628648\n\t\t\t\t,-0.952544\n\t\t\t\t,-0.282994\n\t\t\t\t,-0.112136\n\t\t\t\t,-0.90796\n\t\t\t\t,0.41058\n\t\t\t\t,-0.0838608\n\t\t\t\t,-0.563761\n\t\t\t\t,-0.811726\n\t\t\t\t,0.152558\n\t\t\t\t,-0.767696\n\t\t\t\t,0.555687\n\t\t\t\t,-0.319148\n\t\t\t\t,-0.585053\n\t\t\t\t,-0.077485\n\t\t\t\t,0.807285\n\t\t\t\t,-0.641746\n\t\t\t\t,-0.462888\n\t\t\t\t,0.611471\n\t\t\t\t,-0.0954938\n\t\t\t\t,-0.701406\n\t\t\t\t,0.706336\n\t\t\t\t,-0.492704\n\t\t\t\t,-0.541968\n\t\t\t\t,0.680818\n\t\t\t\t,-0.298235\n\t\t\t\t,0.467344\n\t\t\t\t,-0.832253\n\t\t\t\t,-0.951336\n\t\t\t\t,0.0107866\n\t\t\t\t,-0.307967\n\t\t\t\t,-0.620755\n\t\t\t\t,-0.65882\n\t\t\t\t,0.424993\n\t\t\t\t,-0.068379\n\t\t\t\t,0.419691\n\t\t\t\t,0.905088\n\t\t\t\t,-0.0785871\n\t\t\t\t,0.368785\n\t\t\t\t,0.926186\n\t\t\t\t,-0.068379\n\t\t\t\t,0.419691\n\t\t\t\t,0.905088\n\t\t\t\t,-0.0785871\n\t\t\t\t,0.368785\n\t\t\t\t,0.926187\n\t\t\t\t,0.0683789\n\t\t\t\t,0.419691\n\t\t\t\t,0.905088\n\t\t\t\t,0.0785872\n\t\t\t\t,0.368786\n\t\t\t\t,0.926186\n\t\t\t\t,0.0683788\n\t\t\t\t,0.419691\n\t\t\t\t,0.905088\n\t\t\t\t,0.0785871\n\t\t\t\t,0.368786\n\t\t\t\t,0.926186\n\t\t\t\t,0.708743\n\t\t\t\t,0.61827\n\t\t\t\t,-0.339744\n\t\t\t\t,0.708743\n\t\t\t\t,-0.61827\n\t\t\t\t,0.339744\n\t\t\t\t,0.708743\n\t\t\t\t,-0.61827\n\t\t\t\t,0.339744\n\t\t\t\t,0.708743\n\t\t\t\t,0.61827\n\t\t\t\t,-0.339744\n\t\t\t\t,0.708743\n\t\t\t\t,-0.673878\n\t\t\t\t,0.20874\n\t\t\t\t,0.708743\n\t\t\t\t,0.673878\n\t\t\t\t,-0.20874\n\t\t\t\t,0.708743\n\t\t\t\t,0.673878\n\t\t\t\t,-0.20874\n\t\t\t\t,0.708743\n\t\t\t\t,-0.673878\n\t\t\t\t,0.20874\n\t\t\t\t,0.994145\n\t\t\t\t,0.0900013\n\t\t\t\t,-0.0597891\n\t\t\t\t,0.995293\n\t\t\t\t,-0.0298194\n\t\t\t\t,-0.0922077\n\t\t\t\t,0.983523\n\t\t\t\t,0.0233562\n\t\t\t\t,0.179268\n\t\t\t\t,0.996611\n\t\t\t\t,0.0423863\n\t\t\t\t,-0.0705022\n\t\t\t\t,-0.36245\n\t\t\t\t,0.16421\n\t\t\t\t,0.917423\n\t\t\t\t,0.504598\n\t\t\t\t,0.120196\n\t\t\t\t,0.854947\n\t\t\t\t,0.216896\n\t\t\t\t,-0.578988\n\t\t\t\t,0.785958\n\t\t\t\t,-0.189575\n\t\t\t\t,-0.382352\n\t\t\t\t,0.904361\n\t\t\t\t,0.96488\n\t\t\t\t,-0.00433636\n\t\t\t\t,0.262655\n\t\t\t\t,0.942772\n\t\t\t\t,-0.227459\n\t\t\t\t,-0.243811\n\t\t\t\t,0.934945\n\t\t\t\t,0.0385318\n\t\t\t\t,-0.352694\n\t\t\t\t,0.911581\n\t\t\t\t,0.199645\n\t\t\t\t,0.359391\n\t\t\t\t,0.0277032\n\t\t\t\t,0.0270709\n\t\t\t\t,-0.99925\n\t\t\t\t,0.118473\n\t\t\t\t,0.198878\n\t\t\t\t,-0.972837\n\t\t\t\t,-0.641801\n\t\t\t\t,-0.0622252\n\t\t\t\t,-0.764342\n\t\t\t\t,0.948483\n\t\t\t\t,-0.0585825\n\t\t\t\t,-0.311366\n\t\t\t\t,0.986883\n\t\t\t\t,0.0318893\n\t\t\t\t,0.158258\n\t\t\t\t,0.945839\n\t\t\t\t,0.174521\n\t\t\t\t,-0.273736\n\t\t\t\t,0.932061\n\t\t\t\t,0.356806\n\t\t\t\t,-0.0628648\n\t\t\t\t,0.952544\n\t\t\t\t,-0.282994\n\t\t\t\t,-0.112136\n\t\t\t\t,0.90796\n\t\t\t\t,0.41058\n\t\t\t\t,-0.0838608\n\t\t\t\t,0.563762\n\t\t\t\t,-0.811726\n\t\t\t\t,0.152558\n\t\t\t\t,0.484208\n\t\t\t\t,0.165841\n\t\t\t\t,-0.859092\n\t\t\t\t,0.767696\n\t\t\t\t,0.555687\n\t\t\t\t,-0.319148\n\t\t\t\t,0.641746\n\t\t\t\t,-0.462888\n\t\t\t\t,0.611471\n\t\t\t\t,0.518429\n\t\t\t\t,-0.221907\n\t\t\t\t,-0.825826\n\t\t\t\t,0.489005\n\t\t\t\t,0.182961\n\t\t\t\t,-0.852877\n\t\t\t\t,0.647626\n\t\t\t\t,-0.0212846\n\t\t\t\t,0.761661\n\t\t\t\t,0.357598\n\t\t\t\t,0.523894\n\t\t\t\t,0.773084\n\t\t\t\t,0.492704\n\t\t\t\t,-0.541968\n\t\t\t\t,0.680818\n\t\t\t\t,0.647591\n\t\t\t\t,-0.0204639\n\t\t\t\t,0.761714\n\t\t\t\t,0.620755\n\t\t\t\t,-0.65882\n\t\t\t\t,0.424993\n\t\t\t\t,0.376435\n\t\t\t\t,-0.326297\n\t\t\t\t,0.86708\n\t\t\t\t,0.475114\n\t\t\t\t,-0.75496\n\t\t\t\t,-0.451998\n\t\t\t\t,0.672894\n\t\t\t\t,-0.680767\n\t\t\t\t,0.289432\n\t\t\t\t,-0.0535424\n\t\t\t\t,-0.97545\n\t\t\t\t,-0.213612\n\t\t\t\t,0.672893\n\t\t\t\t,-0.680767\n\t\t\t\t,0.289432\n\t\t\t\t,-0.0535425\n\t\t\t\t,-0.97545\n\t\t\t\t,-0.213612\n\t\t\t\t,0.886408\n\t\t\t\t,-0.41067\n\t\t\t\t,-0.213612\n\t\t\t\t,0.285178\n\t\t\t\t,-0.91373\n\t\t\t\t,0.289432\n\t\t\t\t,0.886408\n\t\t\t\t,-0.41067\n\t\t\t\t,-0.213612\n\t\t\t\t,0.285178\n\t\t\t\t,-0.91373\n\t\t\t\t,0.289432\n\t\t\t\t,0.56188\n\t\t\t\t,-0.712689\n\t\t\t\t,-0.419959\n\t\t\t\t,0.285178\n\t\t\t\t,-0.91373\n\t\t\t\t,0.289432\n\t\t\t\t,-0.0972898\n\t\t\t\t,-0.632413\n\t\t\t\t,0.768497\n\t\t\t\t,-0.0369874\n\t\t\t\t,0.867758\n\t\t\t\t,0.495609\n\t\t\t\t,0.376435\n\t\t\t\t,-0.326297\n\t\t\t\t,0.86708\n\t\t\t\t,0.105228\n\t\t\t\t,0.274007\n\t\t\t\t,0.955953\n\t\t\t\t,-0.324995\n\t\t\t\t,-0.656888\n\t\t\t\t,0.68035\n\t\t\t\t,0.475114\n\t\t\t\t,-0.75496\n\t\t\t\t,-0.451998\n\t\t\t\t,-0.311712\n\t\t\t\t,0.302371\n\t\t\t\t,-0.900781\n\t\t\t\t,0.291336\n\t\t\t\t,-0.0357272\n\t\t\t\t,-0.955954\n\t\t\t\t,-0.732574\n\t\t\t\t,0.0214365\n\t\t\t\t,-0.68035\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,0.0434482\n\t\t\t\t,-0.941647\n\t\t\t\t,-0.333787\n\t\t\t\t,-0.179728\n\t\t\t\t,-0.678756\n\t\t\t\t,-0.712031\n\t\t\t\t,0.417039\n\t\t\t\t,-0.479392\n\t\t\t\t,-0.77218\n\t\t\t\t,0.179728\n\t\t\t\t,0.0472697\n\t\t\t\t,0.98258\n\t\t\t\t,-0.417039\n\t\t\t\t,0.22834\n\t\t\t\t,0.879738\n\t\t\t\t,-0.179265\n\t\t\t\t,-0.0690195\n\t\t\t\t,0.981377\n\t\t\t\t,0.384997\n\t\t\t\t,-0.0134101\n\t\t\t\t,0.922821\n\t\t\t\t,0.179266\n\t\t\t\t,-0.845334\n\t\t\t\t,-0.503263\n\t\t\t\t,-0.384994\n\t\t\t\t,-0.765518\n\t\t\t\t,-0.515521\n\t\t\t\t,-0.157142\n\t\t\t\t,-0.695438\n\t\t\t\t,-0.701194\n\t\t\t\t,0.444517\n\t\t\t\t,-0.336757\n\t\t\t\t,-0.83006\n\t\t\t\t,0.157139\n\t\t\t\t,0.108995\n\t\t\t\t,0.981543\n\t\t\t\t,-0.444524\n\t\t\t\t,0.434509\n\t\t\t\t,0.783327\n\t\t\t\t,0.190969\n\t\t\t\t,-0.447951\n\t\t\t\t,0.873425\n\t\t\t\t,-0.450923\n\t\t\t\t,-0.560668\n\t\t\t\t,0.694493\n\t\t\t\t,0.190969\n\t\t\t\t,-0.930799\n\t\t\t\t,0.311678\n\t\t\t\t,-0.450922\n\t\t\t\t,-0.770823\n\t\t\t\t,0.45\n\t\t\t\t,1.44839e-008\n\t\t\t\t,-0.995566\n\t\t\t\t,0.0940692\n\t\t\t\t,0\n\t\t\t\t,-0.995566\n\t\t\t\t,0.0940691\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,1.6396e-014\n\t\t\t\t,-1\n\t\t\t\t,7.85376e-007\n\t\t\t\t,0.0976033\n\t\t\t\t,-0.978464\n\t\t\t\t,0.181886\n\t\t\t\t,-4.7587e-007\n\t\t\t\t,-1\n\t\t\t\t,-2.86677e-006\n\t\t\t\t,-0.00678098\n\t\t\t\t,-0.998087\n\t\t\t\t,0.0614579\n\t\t\t\t,-0.00918274\n\t\t\t\t,-0.994446\n\t\t\t\t,-0.104849\n\t\t\t\t,-4.24361e-014\n\t\t\t\t,-1\n\t\t\t\t,-3.9269e-006\n\t\t\t\t,4.53467e-007\n\t\t\t\t,-1\n\t\t\t\t,-2.35651e-006\n\t\t\t\t,0.187402\n\t\t\t\t,-0.972376\n\t\t\t\t,-0.139159\n\t\t\t\t,4.53441e-007\n\t\t\t\t,-1\n\t\t\t\t,2.59386e-007\n\t\t\t\t,0.139256\n\t\t\t\t,-0.9587\n\t\t\t\t,0.247998\n\t\t\t\t,-0.00625237\n\t\t\t\t,-0.998849\n\t\t\t\t,0.0475553\n\t\t\t\t,2.0874e-009\n\t\t\t\t,-1\n\t\t\t\t,-7.86581e-007\n\t\t\t\t,2.25751e-008\n\t\t\t\t,-1\n\t\t\t\t,-5.10549e-007\n\t\t\t\t,-0.00744022\n\t\t\t\t,-0.990636\n\t\t\t\t,-0.136323\n\t\t\t\t,0.122105\n\t\t\t\t,-0.987541\n\t\t\t\t,-0.0992661\n\t\t\t\t,1.12098e-014\n\t\t\t\t,-1\n\t\t\t\t,7.84268e-007\n\t\t\t\t,-0.0412873\n\t\t\t\t,-0.971471\n\t\t\t\t,0.233535\n\t\t\t\t,0.338069\n\t\t\t\t,-0.710914\n\t\t\t\t,0.616693\n\t\t\t\t,-0.011539\n\t\t\t\t,-0.95932\n\t\t\t\t,-0.282085\n\t\t\t\t,0.367578\n\t\t\t\t,-0.733032\n\t\t\t\t,-0.572321\n\t\t\t\t,-0.0425017\n\t\t\t\t,-0.969178\n\t\t\t\t,0.242669\n\t\t\t\t,0.343711\n\t\t\t\t,-0.687496\n\t\t\t\t,0.639697\n\t\t\t\t,-0.0120422\n\t\t\t\t,-0.961368\n\t\t\t\t,-0.275004\n\t\t\t\t,0.359886\n\t\t\t\t,-0.75848\n\t\t\t\t,-0.543314\n\t\t\t\t,-0.0412248\n\t\t\t\t,-0.920523\n\t\t\t\t,0.388507\n\t\t\t\t,0.343402\n\t\t\t\t,-0.293444\n\t\t\t\t,0.892169\n\t\t\t\t,0.00672757\n\t\t\t\t,-0.908086\n\t\t\t\t,-0.418729\n\t\t\t\t,0.366398\n\t\t\t\t,-0.30837\n\t\t\t\t,-0.877873\n\t\t\t\t,-0.0411043\n\t\t\t\t,-0.919153\n\t\t\t\t,0.391751\n\t\t\t\t,0.340007\n\t\t\t\t,-0.290618\n\t\t\t\t,0.894392\n\t\t\t\t,0.00689869\n\t\t\t\t,-0.907531\n\t\t\t\t,-0.419927\n\t\t\t\t,0.372315\n\t\t\t\t,-0.313985\n\t\t\t\t,-0.873381\n\t\t\t\t,-0.015669\n\t\t\t\t,-0.877507\n\t\t\t\t,0.479308\n\t\t\t\t,0.154014\n\t\t\t\t,-0.0448485\n\t\t\t\t,0.98705\n\t\t\t\t,0.00758946\n\t\t\t\t,-0.873186\n\t\t\t\t,-0.487329\n\t\t\t\t,0.164712\n\t\t\t\t,-0.0474187\n\t\t\t\t,-0.985201\n\t\t\t\t,-0.0163089\n\t\t\t\t,-0.878398\n\t\t\t\t,0.477651\n\t\t\t\t,0.159387\n\t\t\t\t,-0.0474551\n\t\t\t\t,0.986075\n\t\t\t\t,0.00752302\n\t\t\t\t,-0.872874\n\t\t\t\t,-0.487887\n\t\t\t\t,0.158628\n\t\t\t\t,-0.0433993\n\t\t\t\t,-0.986384\n\t\t\t\t,-0.00924345\n\t\t\t\t,-0.866137\n\t\t\t\t,0.499722\n\t\t\t\t,0.0275777\n\t\t\t\t,-0.00162037\n\t\t\t\t,0.999618\n\t\t\t\t,0.00460346\n\t\t\t\t,-0.866251\n\t\t\t\t,-0.499588\n\t\t\t\t,0.027671\n\t\t\t\t,-0.000995395\n\t\t\t\t,-0.999617\n\t\t\t\t,-0.00924951\n\t\t\t\t,-0.866202\n\t\t\t\t,0.499609\n\t\t\t\t,0.027626\n\t\t\t\t,-0.00165926\n\t\t\t\t,0.999617\n\t\t\t\t,0.0046057\n\t\t\t\t,-0.866165\n\t\t\t\t,-0.499737\n\t\t\t\t,0.0276222\n\t\t\t\t,-0.00102645\n\t\t\t\t,-0.999618\n\t\t\t\t,-1\n\t\t\t\t,-1.36587e-006\n\t\t\t\t,5.10809e-006\n\t\t\t\t,-0.99949\n\t\t\t\t,0.0159522\n\t\t\t\t,0.0276739\n\t\t\t\t,-0.998852\n\t\t\t\t,0.0478939\n\t\t\t\t,2.2837e-005\n\t\t\t\t,-1\n\t\t\t\t,3.99381e-006\n\t\t\t\t,1.11241e-006\n\t\t\t\t,-1\n\t\t\t\t,1.5251e-007\n\t\t\t\t,-6.19201e-008\n\t\t\t\t,-0.999872\n\t\t\t\t,0.00798293\n\t\t\t\t,-0.0138362\n\t\t\t\t,-1\n\t\t\t\t,-3.22047e-006\n\t\t\t\t,9.02515e-006\n\t\t\t\t,-0.99885\n\t\t\t\t,0.0479518\n\t\t\t\t,2.95517e-005\n\t\t\t\t,-1\n\t\t\t\t,-8.69434e-007\n\t\t\t\t,-9.52667e-007\n\t\t\t\t,-0.999489\n\t\t\t\t,0.0159603\n\t\t\t\t,0.0276942\n\t\t\t\t,-0.99885\n\t\t\t\t,0.0479518\n\t\t\t\t,1.5975e-005\n\t\t\t\t,-1\n\t\t\t\t,-7.47727e-006\n\t\t\t\t,-1.30883e-005\n\t\t\t\t,-1\n\t\t\t\t,-3.16918e-007\n\t\t\t\t,-2.65759e-006\n\t\t\t\t,-0.999872\n\t\t\t\t,0.00798234\n\t\t\t\t,-0.0138372\n\t\t\t\t,-1\n\t\t\t\t,2.37553e-006\n\t\t\t\t,-7.30022e-006\n\t\t\t\t,-0.998852\n\t\t\t\t,0.0478939\n\t\t\t\t,1.14553e-005\n\t\t\t\t,3.04998e-011\n\t\t\t\t,-0.00416861\n\t\t\t\t,0.999991\n\t\t\t\t,-1.65891e-007\n\t\t\t\t,-0.00416854\n\t\t\t\t,0.999991\n\t\t\t\t,-4.21933e-008\n\t\t\t\t,-0.00416847\n\t\t\t\t,0.999991\n\t\t\t\t,1.80828e-010\n\t\t\t\t,-0.00416841\n\t\t\t\t,0.999991\n\t\t\t\t,1.39238e-008\n\t\t\t\t,-0.00416844\n\t\t\t\t,0.999991\n\t\t\t\t,0\n\t\t\t\t,-0.00416841\n\t\t\t\t,0.999991\n\t\t\t\t,-1.39238e-008\n\t\t\t\t,-0.00416844\n\t\t\t\t,0.999991\n\t\t\t\t,0\n\t\t\t\t,-0.00416841\n\t\t\t\t,0.999991\n\t\t\t\t,0\n\t\t\t\t,-0.00416841\n\t\t\t\t,0.999991\n\t\t\t\t,1.43457e-008\n\t\t\t\t,-0.00416846\n\t\t\t\t,0.999991\n\t\t\t\t,1.65891e-007\n\t\t\t\t,-0.00416848\n\t\t\t\t,0.999991\n\t\t\t\t,5.40133e-011\n\t\t\t\t,-0.00416861\n\t\t\t\t,0.999991\n\t\t\t\t,1.65891e-007\n\t\t\t\t,-0.00416893\n\t\t\t\t,0.999991\n\t\t\t\t,5.40147e-011\n\t\t\t\t,-0.00416861\n\t\t\t\t,0.999991\n\t\t\t\t,2.06686e-007\n\t\t\t\t,-0.00416929\n\t\t\t\t,0.999991\n\t\t\t\t,-1.80829e-010\n\t\t\t\t,-0.00416956\n\t\t\t\t,0.999991\n\t\t\t\t,-1.80829e-010\n\t\t\t\t,-0.00416956\n\t\t\t\t,0.999991\n\t\t\t\t,-6.88954e-008\n\t\t\t\t,-0.00416945\n\t\t\t\t,0.999991\n\t\t\t\t,6.88955e-008\n\t\t\t\t,-0.00416945\n\t\t\t\t,0.999991\n\t\t\t\t,0\n\t\t\t\t,-0.00416956\n\t\t\t\t,0.999991\n\t\t\t\t,-6.89558e-008\n\t\t\t\t,-0.00416937\n\t\t\t\t,0.999991\n\t\t\t\t,0\n\t\t\t\t,-0.00416956\n\t\t\t\t,0.999991\n\t\t\t\t,-1.6589e-007\n\t\t\t\t,-0.00416925\n\t\t\t\t,0.999991\n\t\t\t\t,3.05005e-011\n\t\t\t\t,-0.00416861\n\t\t\t\t,0.999991\n\t\t\t\t,-0.928935\n\t\t\t\t,0.0741801\n\t\t\t\t,-0.362737\n\t\t\t\t,-1\n\t\t\t\t,-9.40514e-007\n\t\t\t\t,4.36815e-014\n\t\t\t\t,-0.963109\n\t\t\t\t,-0.144553\n\t\t\t\t,-0.22699\n\t\t\t\t,-1\n\t\t\t\t,0\n\t\t\t\t,0\n\t\t\t\t,-1\n\t\t\t\t,0\n\t\t\t\t,0\n\t\t\t\t,-0.927586\n\t\t\t\t,-0.365025\n\t\t\t\t,-0.0796325\n\t\t\t\t,-0.963372\n\t\t\t\t,-0.223657\n\t\t\t\t,0.147957\n\t\t\t\t,-1\n\t\t\t\t,0\n\t\t\t\t,0\n\t\t\t\t,-1\n\t\t\t\t,0\n\t\t\t\t,0\n\t\t\t\t,-0.928935\n\t\t\t\t,-0.0741779\n\t\t\t\t,0.362736\n\t\t\t\t,-0.96311\n\t\t\t\t,0.144551\n\t\t\t\t,0.226991\n\t\t\t\t,-1\n\t\t\t\t,0\n\t\t\t\t,0\n\t\t\t\t,-0.96311\n\t\t\t\t,0.144551\n\t\t\t\t,0.226991\n\t\t\t\t,-1\n\t\t\t\t,0\n\t\t\t\t,0\n\t\t\t\t,-1\n\t\t\t\t,-2.56885e-013\n\t\t\t\t,-9.3155e-007\n\t\t\t\t,-0.927586\n\t\t\t\t,0.365025\n\t\t\t\t,0.0796344\n\t\t\t\t,-0.963372\n\t\t\t\t,0.223658\n\t\t\t\t,-0.147957\n\t\t\t\t,-1\n\t\t\t\t,-3.28621e-006\n\t\t\t\t,-3.32301e-006\n\t\t\t\t,-0.948254\n\t\t\t\t,-0.0596412\n\t\t\t\t,-0.311861\n\t\t\t\t,-0.948962\n\t\t\t\t,-0.259129\n\t\t\t\t,-0.179785\n\t\t\t\t,-0.949292\n\t\t\t\t,-0.308453\n\t\t\t\t,0.0608337\n\t\t\t\t,-0.948625\n\t\t\t\t,-0.173557\n\t\t\t\t,0.264553\n\t\t\t\t,-0.948255\n\t\t\t\t,0.0596406\n\t\t\t\t,0.311857\n\t\t\t\t,-0.948962\n\t\t\t\t,0.259129\n\t\t\t\t,0.179788\n\t\t\t\t,-0.948962\n\t\t\t\t,0.259129\n\t\t\t\t,0.179788\n\t\t\t\t,-0.949292\n\t\t\t\t,0.308453\n\t\t\t\t,-0.0608341\n\t\t\t\t,-0.948625\n\t\t\t\t,0.173558\n\t\t\t\t,-0.264552\n\t\t\t\t,-1\n\t\t\t\t,-2.81478e-007\n\t\t\t\t,1.45474e-006\n\t\t\t\t,-1\n\t\t\t\t,7.15951e-008\n\t\t\t\t,-7.76833e-007\n\t\t\t\t,-1\n\t\t\t\t,6.79536e-007\n\t\t\t\t,-3.93036e-007\n\t\t\t\t,-1\n\t\t\t\t,2.42972e-007\n\t\t\t\t,-7.40097e-007\n\t\t\t\t,-1\n\t\t\t\t,-2.89744e-007\n\t\t\t\t,-7.91474e-007\n\t\t\t\t,-1\n\t\t\t\t,-4.74714e-007\n\t\t\t\t,-7.31032e-007\n\t\t\t\t,-1\n\t\t\t\t,-4.74714e-007\n\t\t\t\t,-7.31032e-007\n\t\t\t\t,-0.948962\n\t\t\t\t,0.259129\n\t\t\t\t,0.179788\n\t\t\t\t,-0.949292\n\t\t\t\t,0.308453\n\t\t\t\t,-0.0608341\n\t\t\t\t,-1\n\t\t\t\t,-4.74714e-007\n\t\t\t\t,-7.31032e-007\n\t\t\t\t,-1\n\t\t\t\t,-2.76805e-007\n\t\t\t\t,6.86373e-008\n\t\t\t\t,-1\n\t\t\t\t,3.24191e-007\n\t\t\t\t,2.62185e-007\n\t\t\t\t,0\n\t\t\t\t,0.447214\n\t\t\t\t,0.894427\n\t\t\t\t,0\n\t\t\t\t,-0.707107\n\t\t\t\t,0.707107\n\t\t\t\t,0.045094\n\t\t\t\t,-0.739933\n\t\t\t\t,0.671168\n\t\t\t\t,-0.416604\n\t\t\t\t,0.496174\n\t\t\t\t,0.761743\n\t\t\t\t,0.477285\n\t\t\t\t,-0.420095\n\t\t\t\t,0.771828\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,0\n\t\t\t\t,-0.447214\n\t\t\t\t,-0.894427\n\t\t\t\t,-0.253724\n\t\t\t\t,-0.817725\n\t\t\t\t,-0.516671\n\t\t\t\t,-0.000377874\n\t\t\t\t,-1\n\t\t\t\t,0\n\t\t\t\t,-0.358208\n\t\t\t\t,-0.812176\n\t\t\t\t,-0.460497\n\t\t\t\t,0.014788\n\t\t\t\t,-0.999346\n\t\t\t\t,0.0329953\n\t\t\t\t,-0.298878\n\t\t\t\t,-0.949236\n\t\t\t\t,-0.098099\n\t\t\t\t,0.429968\n\t\t\t\t,-0.827063\n\t\t\t\t,0.362069\n\t\t\t\t,-0.201662\n\t\t\t\t,-0.954245\n\t\t\t\t,-0.220793\n\t\t\t\t,-0.389556\n\t\t\t\t,0.622092\n\t\t\t\t,0.679152\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,-0.64015\n\t\t\t\t,-0.573225\n\t\t\t\t,-0.511489\n\t\t\t\t,0.849538\n\t\t\t\t,0.0582332\n\t\t\t\t,-0.524303\n\t\t\t\t,-0.849538\n\t\t\t\t,-0.0582332\n\t\t\t\t,0.524303\n\t\t\t\t,0.64015\n\t\t\t\t,0.573225\n\t\t\t\t,0.511489\n\t\t\t\t,0.405257\n\t\t\t\t,-0.18912\n\t\t\t\t,0.894427\n\t\t\t\t,-0.640768\n\t\t\t\t,0.299025\n\t\t\t\t,0.707107\n\t\t\t\t,-0.000377879\n\t\t\t\t,-1\n\t\t\t\t,0\n\t\t\t\t,0.134769\n\t\t\t\t,-0.93998\n\t\t\t\t,-0.313489\n\t\t\t\t,-0.349667\n\t\t\t\t,-0.860175\n\t\t\t\t,0.371258\n\t\t\t\t,-0.595837\n\t\t\t\t,-0.7588\n\t\t\t\t,0.263061\n\t\t\t\t,-0.331554\n\t\t\t\t,-0.925707\n\t\t\t\t,0.182039\n\t\t\t\t,-0.000220765\n\t\t\t\t,-0.829085\n\t\t\t\t,-0.559123\n\t\t\t\t,2.07438e-007\n\t\t\t\t,-0.829012\n\t\t\t\t,-0.559231\n\t\t\t\t,-0.393391\n\t\t\t\t,-0.919077\n\t\t\t\t,0.0232479\n\t\t\t\t,0.807892\n\t\t\t\t,-0.556235\n\t\t\t\t,-0.194712\n\t\t\t\t,-8.81694e-007\n\t\t\t\t,-0.829012\n\t\t\t\t,-0.559231\n\t\t\t\t,-0.21912\n\t\t\t\t,-0.442516\n\t\t\t\t,-0.869578\n\t\t\t\t,0.110521\n\t\t\t\t,-0.555334\n\t\t\t\t,-0.82425\n\t\t\t\t,-4.41571e-008\n\t\t\t\t,-0.000739274\n\t\t\t\t,-1\n\t\t\t\t,-0.398332\n\t\t\t\t,-0.128825\n\t\t\t\t,-0.90815\n\t\t\t\t,-0.000593292\n\t\t\t\t,0.00383837\n\t\t\t\t,-0.999992\n\t\t\t\t,-0.781175\n\t\t\t\t,0.383447\n\t\t\t\t,-0.492681\n\t\t\t\t,0.362492\n\t\t\t\t,0.40771\n\t\t\t\t,-0.838076\n\t\t\t\t,0\n\t\t\t\t,0.00514831\n\t\t\t\t,-0.999987\n\t\t\t\t,0.00182102\n\t\t\t\t,0.0031858\n\t\t\t\t,-0.999993\n\t\t\t\t,0.527237\n\t\t\t\t,-0.347745\n\t\t\t\t,-0.775303\n\t\t\t\t,-0.00182102\n\t\t\t\t,0.00294379\n\t\t\t\t,0.999994\n\t\t\t\t,-0.527237\n\t\t\t\t,0.347745\n\t\t\t\t,0.775303\n\t\t\t\t,-0.13217\n\t\t\t\t,0.324215\n\t\t\t\t,0.936705\n\t\t\t\t,-1.48986e-009\n\t\t\t\t,0.00735275\n\t\t\t\t,0.999973\n\t\t\t\t,9.89475e-005\n\t\t\t\t,0.00620474\n\t\t\t\t,0.999981\n\t\t\t\t,0.154807\n\t\t\t\t,0.491034\n\t\t\t\t,0.857275\n\t\t\t\t,0.396257\n\t\t\t\t,0.135158\n\t\t\t\t,0.908137\n\t\t\t\t,4.41571e-008\n\t\t\t\t,0.000739282\n\t\t\t\t,1\n\t\t\t\t,0.591718\n\t\t\t\t,-0.747079\n\t\t\t\t,-0.302891\n\t\t\t\t,-0.18785\n\t\t\t\t,-0.911039\n\t\t\t\t,0.367044\n\t\t\t\t,-0.18466\n\t\t\t\t,-0.914467\n\t\t\t\t,-0.360072\n\t\t\t\t,0.602058\n\t\t\t\t,-0.743119\n\t\t\t\t,0.292061\n\t\t\t\t,0.707103\n\t\t\t\t,-0.707107\n\t\t\t\t,0.00245314\n\t\t\t\t,-0.709222\n\t\t\t\t,-0.704984\n\t\t\t\t,-0.0012206\n\t\t\t\t,0.593873\n\t\t\t\t,-0.747096\n\t\t\t\t,-0.2986\n\t\t\t\t,-0.194833\n\t\t\t\t,-0.910983\n\t\t\t\t,0.363524\n\t\t\t\t,-0.17072\n\t\t\t\t,-0.914411\n\t\t\t\t,-0.367025\n\t\t\t\t,0.601011\n\t\t\t\t,-0.74313\n\t\t\t\t,0.294184\n\t\t\t\t,-0.704997\n\t\t\t\t,-0.709209\n\t\t\t\t,0.00124256\n\t\t\t\t,0.707107\n\t\t\t\t,-0.707107\n\t\t\t\t,0\n\t\t\t\t,-0.578621\n\t\t\t\t,0.577727\n\t\t\t\t,0.575699\n\t\t\t\t,0.00144717\n\t\t\t\t,-0.00028907\n\t\t\t\t,0.999999\n\t\t\t\t,0.236912\n\t\t\t\t,0.23429\n\t\t\t\t,0.942858\n\t\t\t\t,-0.00346923\n\t\t\t\t,-3.01123e-008\n\t\t\t\t,0.999994\n\t\t\t\t,0\n\t\t\t\t,0\n\t\t\t\t,-1\n\t\t\t\t,0.233652\n\t\t\t\t,0.235057\n\t\t\t\t,-0.94348\n\t\t\t\t,0.000862149\n\t\t\t\t,-0.000867333\n\t\t\t\t,-0.999999\n\t\t\t\t,-0.572751\n\t\t\t\t,0.579636\n\t\t\t\t,-0.579636\n\t\t\t\t,0.00751858\n\t\t\t\t,-0.95304\n\t\t\t\t,0.302751\n\t\t\t\t,0\n\t\t\t\t,-0.873499\n\t\t\t\t,0.486826\n\t\t\t\t,0\n\t\t\t\t,-0.902319\n\t\t\t\t,-0.43107\n\t\t\t\t,-0.0714406\n\t\t\t\t,-0.836045\n\t\t\t\t,-0.543991\n\t\t\t\t,-0.0105074\n\t\t\t\t,-0.986739\n\t\t\t\t,0.161974\n\t\t\t\t,-0.0439428\n\t\t\t\t,-0.711914\n\t\t\t\t,-0.70089\n\t\t\t\t,0\n\t\t\t\t,0\n\t\t\t\t,1\n\t\t\t\t,0\n\t\t\t\t,0\n\t\t\t\t,1\n\t\t\t\t,0\n\t\t\t\t,0\n\t\t\t\t,1\n\t\t\t\t,0\n\t\t\t\t,0\n\t\t\t\t,1\n\t\t\t\t,0\n\t\t\t\t,0\n\t\t\t\t,1\n\t\t\t\t,0\n\t\t\t\t,0\n\t\t\t\t,1\n\t\t\t\t,-0.0541128\n\t\t\t\t,0.257088\n\t\t\t\t,0.964872\n\t\t\t\t,-1.40811e-007\n\t\t\t\t,0.460485\n\t\t\t\t,0.887667\n\t\t\t\t,0\n\t\t\t\t,0\n\t\t\t\t,1\n\t\t\t\t,0\n\t\t\t\t,0\n\t\t\t\t,1\n\t\t\t\t,0\n\t\t\t\t,0\n\t\t\t\t,1\n\t\t\t\t,0\n\t\t\t\t,0\n\t\t\t\t,1\n\t\t\t\t,0\n\t\t\t\t,0\n\t\t\t\t,1\n\t\t\t\t,0.112093\n\t\t\t\t,-0.0159927\n\t\t\t\t,0.993569\n\t\t\t\t,0.101435\n\t\t\t\t,0.109831\n\t\t\t\t,0.988761\n\t\t\t\t,0.179656\n\t\t\t\t,0.26862\n\t\t\t\t,0.946344\n\t\t\t\t,0.00928401\n\t\t\t\t,0.0285578\n\t\t\t\t,0.999549\n\t\t\t\t,0.34336\n\t\t\t\t,0.0792732\n\t\t\t\t,0.935852\n\t\t\t\t,0.0485403\n\t\t\t\t,0.47057\n\t\t\t\t,0.881027\n\t\t\t\t,-9.95781e-008\n\t\t\t\t,0.341028\n\t\t\t\t,0.940053\n\t\t\t\t,-0.0262054\n\t\t\t\t,0.331954\n\t\t\t\t,0.942932\n\t\t\t\t,-0.00144248\n\t\t\t\t,0.411131\n\t\t\t\t,0.911575\n\t\t\t\t,-0.0786219\n\t\t\t\t,0.821535\n\t\t\t\t,0.564712\n\t\t\t\t,0.000688533\n\t\t\t\t,0.902318\n\t\t\t\t,0.43107\n\t\t\t\t,-0.19477\n\t\t\t\t,-0.796505\n\t\t\t\t,0.572403\n\t\t\t\t,-0.0101894\n\t\t\t\t,-0.785117\n\t\t\t\t,0.619264\n\t\t\t\t,-0.0889155\n\t\t\t\t,-0.995997\n\t\t\t\t,-0.00913129\n\t\t\t\t,-0.265828\n\t\t\t\t,-0.901133\n\t\t\t\t,-0.342483\n\t\t\t\t,-0.221427\n\t\t\t\t,-0.305938\n\t\t\t\t,0.925944\n\t\t\t\t,-0.029743\n\t\t\t\t,0.0276108\n\t\t\t\t,0.999176\n\t\t\t\t,0.0487038\n\t\t\t\t,-0.111506\n\t\t\t\t,0.99257\n\t\t\t\t,0\n\t\t\t\t,1.97762e-007\n\t\t\t\t,1\n\t\t\t\t,0.027699\n\t\t\t\t,-0.084837\n\t\t\t\t,0.99601\n\t\t\t\t,0.00455985\n\t\t\t\t,-0.0146535\n\t\t\t\t,0.999882\n\t\t\t\t,-0.0131139\n\t\t\t\t,0.0312149\n\t\t\t\t,0.999427\n\t\t\t\t,0\n\t\t\t\t,-9.33754e-008\n\t\t\t\t,1\n\t\t\t\t,0.0378945\n\t\t\t\t,-0.0761685\n\t\t\t\t,0.996375\n\t\t\t\t,-0.019452\n\t\t\t\t,-0.00993628\n\t\t\t\t,0.999761\n\t\t\t\t,0.131703\n\t\t\t\t,0.0639368\n\t\t\t\t,0.989225\n\t\t\t\t,-0.138493\n\t\t\t\t,-0.0842195\n\t\t\t\t,0.986776\n\t\t\t\t,0.00349707\n\t\t\t\t,-0.0126157\n\t\t\t\t,0.999914\n\t\t\t\t,-0.00189662\n\t\t\t\t,-0.00115723\n\t\t\t\t,0.999998\n\t\t\t\t,-0.0932494\n\t\t\t\t,0.200658\n\t\t\t\t,0.975213\n\t\t\t\t,0.184911\n\t\t\t\t,0.0824887\n\t\t\t\t,0.979287\n\t\t\t\t,0.366999\n\t\t\t\t,-0.106443\n\t\t\t\t,0.924111\n\t\t\t\t,0.0298082\n\t\t\t\t,0.00967327\n\t\t\t\t,0.999509\n\t\t\t\t,-0.0585932\n\t\t\t\t,0.115214\n\t\t\t\t,0.991611\n\t\t\t\t,0.00940561\n\t\t\t\t,0.00285849\n\t\t\t\t,0.999952\n\t\t\t\t,-0.0166786\n\t\t\t\t,0.0457884\n\t\t\t\t,0.998812\n\t\t\t\t,-0.00160239\n\t\t\t\t,-0.000371486\n\t\t\t\t,0.999999\n\t\t\t\t,-0.105282\n\t\t\t\t,0.301973\n\t\t\t\t,0.947485\n\t\t\t\t,-0.761491\n\t\t\t\t,-0.0703961\n\t\t\t\t,0.644342\n\t\t\t\t,-0.165134\n\t\t\t\t,0.235988\n\t\t\t\t,0.957622\n\t\t\t\t,0.027699\n\t\t\t\t,-0.084837\n\t\t\t\t,0.99601\n\t\t\t\t,-0.000269095\n\t\t\t\t,-0.0109763\n\t\t\t\t,0.99994\n\t\t\t\t,-0.00262008\n\t\t\t\t,-0.0720116\n\t\t\t\t,0.9974\n\t\t\t\t,0.0487038\n\t\t\t\t,-0.111506\n\t\t\t\t,0.99257\n\t\t\t\t,0.00455985\n\t\t\t\t,-0.0146535\n\t\t\t\t,0.999882\n\t\t\t\t,-5.08837e-005\n\t\t\t\t,-0.00274336\n\t\t\t\t,0.999996\n\t\t\t\t,-0.0131139\n\t\t\t\t,0.0312149\n\t\t\t\t,0.999427\n\t\t\t\t,-0.0165575\n\t\t\t\t,0.163595\n\t\t\t\t,0.986389\n\t\t\t\t,-0.00241493\n\t\t\t\t,-0.0613622\n\t\t\t\t,0.998113\n\t\t\t\t,0.0378945\n\t\t\t\t,-0.0761685\n\t\t\t\t,0.996375\n\t\t\t\t,-0.00366731\n\t\t\t\t,-0.0408081\n\t\t\t\t,0.99916\n\t\t\t\t,0.00162364\n\t\t\t\t,-0.200309\n\t\t\t\t,0.979732\n\t\t\t\t,-0.000825477\n\t\t\t\t,0.411551\n\t\t\t\t,0.911386\n\t\t\t\t,0.0419145\n\t\t\t\t,0.24215\n\t\t\t\t,0.969333\n\t\t\t\t,0.0318434\n\t\t\t\t,-0.348515\n\t\t\t\t,0.936762\n\t\t\t\t,0.00302969\n\t\t\t\t,-0.402577\n\t\t\t\t,0.915381\n\t\t\t\t,-0.002882\n\t\t\t\t,-0.0500721\n\t\t\t\t,0.998741\n\t\t\t\t,0.00349707\n\t\t\t\t,-0.0126157\n\t\t\t\t,0.999914\n\t\t\t\t,0.0253632\n\t\t\t\t,-0.0458126\n\t\t\t\t,0.998628\n\t\t\t\t,0.00217587\n\t\t\t\t,0.0317617\n\t\t\t\t,0.999493\n\t\t\t\t,0.0478437\n\t\t\t\t,-0.0151964\n\t\t\t\t,0.998739\n\t\t\t\t,-0.0932494\n\t\t\t\t,0.200658\n\t\t\t\t,0.975213\n\t\t\t\t,0.00599234\n\t\t\t\t,0.236392\n\t\t\t\t,0.971639\n\t\t\t\t,0.0321798\n\t\t\t\t,0.394025\n\t\t\t\t,0.918536\n\t\t\t\t,0.0113091\n\t\t\t\t,0.651621\n\t\t\t\t,0.758461\n\t\t\t\t,-0.0248735\n\t\t\t\t,0.319871\n\t\t\t\t,0.947134\n\t\t\t\t,0.0866838\n\t\t\t\t,0.316656\n\t\t\t\t,0.944571\n\t\t\t\t,0.149011\n\t\t\t\t,0.778708\n\t\t\t\t,0.609434\n\t\t\t\t,0.742056\n\t\t\t\t,0.470408\n\t\t\t\t,0.477566\n\t\t\t\t,0.488554\n\t\t\t\t,0.839089\n\t\t\t\t,0.239261\n\t\t\t\t,0.0383749\n\t\t\t\t,0.258135\n\t\t\t\t,0.965346\n\t\t\t\t,0.393471\n\t\t\t\t,-0.173445\n\t\t\t\t,0.902828\n\t\t\t\t,-0.0131114\n\t\t\t\t,0.363612\n\t\t\t\t,0.931458\n\t\t\t\t,-0.0038073\n\t\t\t\t,0.112658\n\t\t\t\t,0.993627\n\t\t\t\t,-0.0585932\n\t\t\t\t,0.115214\n\t\t\t\t,0.991611\n\t\t\t\t,-0.0093968\n\t\t\t\t,0.249515\n\t\t\t\t,0.968325\n\t\t\t\t,-0.000537778\n\t\t\t\t,0.0752893\n\t\t\t\t,0.997162\n\t\t\t\t,-0.000500418\n\t\t\t\t,0.0354369\n\t\t\t\t,0.999372\n\t\t\t\t,-0.0166786\n\t\t\t\t,0.0457884\n\t\t\t\t,0.998812\n\t\t\t\t,-0.00957175\n\t\t\t\t,0.173568\n\t\t\t\t,0.984775\n\t\t\t\t,-0.0593207\n\t\t\t\t,-0.344523\n\t\t\t\t,0.936902\n\t\t\t\t,-0.00127604\n\t\t\t\t,-0.00177759\n\t\t\t\t,0.999998\n\t\t\t\t,0.00116785\n\t\t\t\t,0.336955\n\t\t\t\t,0.94152\n\t\t\t\t,-0.0114275\n\t\t\t\t,0.709425\n\t\t\t\t,0.704688\n\t\t\t\t,-0.390535\n\t\t\t\t,-0.832841\n\t\t\t\t,0.392249\n\t\t\t\t,-0.0105074\n\t\t\t\t,-0.986739\n\t\t\t\t,0.161974\n\t\t\t\t,-0.757397\n\t\t\t\t,-0.108563\n\t\t\t\t,0.643867\n\t\t\t\t,-0.31269\n\t\t\t\t,0.930625\n\t\t\t\t,0.190164\n\t\t\t\t,-0.0549957\n\t\t\t\t,0.986532\n\t\t\t\t,-0.154047\n\t\t\t\t,0.366999\n\t\t\t\t,-0.106443\n\t\t\t\t,0.924111\n\t\t\t\t,-0.165134\n\t\t\t\t,0.235988\n\t\t\t\t,0.957622\n\t\t\t\t,0.0052971\n\t\t\t\t,-0.00628658\n\t\t\t\t,0.999966\n\t\t\t\t,5.04432e-008\n\t\t\t\t,3.38268e-008\n\t\t\t\t,1\n\t\t\t\t,0\n\t\t\t\t,0\n\t\t\t\t,1\n\t\t\t\t,0.0347242\n\t\t\t\t,-0.0377523\n\t\t\t\t,0.998684\n\t\t\t\t,0.00131136\n\t\t\t\t,-0.00168028\n\t\t\t\t,0.999998\n\t\t\t\t,0\n\t\t\t\t,0\n\t\t\t\t,1\n\t\t\t\t,-0.113022\n\t\t\t\t,0.0936855\n\t\t\t\t,0.989166\n\t\t\t\t,-0.241869\n\t\t\t\t,0.130678\n\t\t\t\t,0.961469\n\t\t\t\t,0\n\t\t\t\t,0\n\t\t\t\t,1\n\t\t\t\t,0.0294955\n\t\t\t\t,-0.0293093\n\t\t\t\t,0.999135\n\t\t\t\t,0\n\t\t\t\t,0\n\t\t\t\t,1\n\t\t\t\t,0.0232234\n\t\t\t\t,-0.0204214\n\t\t\t\t,0.999522\n\t\t\t\t,0.112093\n\t\t\t\t,-0.0159927\n\t\t\t\t,0.993569\n\t\t\t\t,0.0839063\n\t\t\t\t,0.0198096\n\t\t\t\t,0.996277\n\t\t\t\t,0.0247243\n\t\t\t\t,0.186474\n\t\t\t\t,0.982149\n\t\t\t\t,-0.241754\n\t\t\t\t,0.190759\n\t\t\t\t,0.951402\n\t\t\t\t,0.868618\n\t\t\t\t,0.0299246\n\t\t\t\t,0.494578\n\t\t\t\t,0.869311\n\t\t\t\t,-0.0155158\n\t\t\t\t,0.494022\n\t\t\t\t,0.985306\n\t\t\t\t,0.0162614\n\t\t\t\t,0.170025\n\t\t\t\t,-0.221427\n\t\t\t\t,-0.305938\n\t\t\t\t,0.925944\n\t\t\t\t,-0.208408\n\t\t\t\t,0.163367\n\t\t\t\t,0.964302\n\t\t\t\t,0.293651\n\t\t\t\t,0.0420359\n\t\t\t\t,0.954988\n\t\t\t\t,-0.19477\n\t\t\t\t,-0.796505\n\t\t\t\t,0.572403\n\t\t\t\t,-0.111427\n\t\t\t\t,-0.993634\n\t\t\t\t,-0.016601\n\t\t\t\t,-0.319004\n\t\t\t\t,0.0821197\n\t\t\t\t,0.944189\n\t\t\t\t,-0.392216\n\t\t\t\t,0.203306\n\t\t\t\t,0.897125\n\t\t\t\t,-0.172058\n\t\t\t\t,0.11462\n\t\t\t\t,0.978396\n\t\t\t\t,-0.378857\n\t\t\t\t,0.158856\n\t\t\t\t,0.911719\n\t\t\t\t,-0.705755\n\t\t\t\t,0.461539\n\t\t\t\t,0.537486\n\t\t\t\t,-0.881763\n\t\t\t\t,0.289715\n\t\t\t\t,0.372236\n\t\t\t\t,0.127806\n\t\t\t\t,-0.598971\n\t\t\t\t,-0.790506\n\t\t\t\t,0.107136\n\t\t\t\t,-0.472548\n\t\t\t\t,-0.874769\n\t\t\t\t,1.912e-006\n\t\t\t\t,-0.850923\n\t\t\t\t,-0.52529\n\t\t\t\t,0\n\t\t\t\t,-0.697899\n\t\t\t\t,-0.716196\n\t\t\t\t,0.00197712\n\t\t\t\t,-0.0501494\n\t\t\t\t,0.99874\n\t\t\t\t,-0.00142623\n\t\t\t\t,-0.386953\n\t\t\t\t,0.922098\n\t\t\t\t,-0.00061527\n\t\t\t\t,-0.327821\n\t\t\t\t,0.94474\n\t\t\t\t,-0.00798393\n\t\t\t\t,-0.516969\n\t\t\t\t,0.855967\n\t\t\t\t,0.0617016\n\t\t\t\t,0.587756\n\t\t\t\t,0.806682\n\t\t\t\t,0\n\t\t\t\t,0.697899\n\t\t\t\t,0.716196\n\t\t\t\t,-2.12914e-007\n\t\t\t\t,-0.189077\n\t\t\t\t,0.981962\n\t\t\t\t,-0.00104704\n\t\t\t\t,0.054408\n\t\t\t\t,0.998518\n\t\t\t\t,0.00128561\n\t\t\t\t,0.619373\n\t\t\t\t,0.785096\n\t\t\t\t,0.00795702\n\t\t\t\t,0.665163\n\t\t\t\t,0.746656\n\t\t\t\t,0.000520645\n\t\t\t\t,0.850923\n\t\t\t\t,0.52529\n\t\t\t\t,0.00726214\n\t\t\t\t,0.469696\n\t\t\t\t,0.882798\n\t\t\t\t,0.0624906\n\t\t\t\t,0.944397\n\t\t\t\t,0.322816\n\t\t\t\t,0.0455381\n\t\t\t\t,0.998943\n\t\t\t\t,0.00629\n\t\t\t\t,0.00217587\n\t\t\t\t,0.0317617\n\t\t\t\t,0.999493\n\t\t\t\t,0.00302969\n\t\t\t\t,-0.402577\n\t\t\t\t,0.915381\n\t\t\t\t,0.00599234\n\t\t\t\t,0.236392\n\t\t\t\t,0.971639\n\t\t\t\t,0.0113091\n\t\t\t\t,0.651621\n\t\t\t\t,0.758461\n\t\t\t\t,0.488554\n\t\t\t\t,0.839089\n\t\t\t\t,0.239261\n\t\t\t\t,0.33508\n\t\t\t\t,0.930605\n\t\t\t\t,0.147293\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,0.0172031\n\t\t\t\t,-0.451674\n\t\t\t\t,0.892017\n\t\t\t\t,6.80049e-007\n\t\t\t\t,-0.679163\n\t\t\t\t,0.733988\n\t\t\t\t,2.9565e-008\n\t\t\t\t,0.282471\n\t\t\t\t,0.959276\n\t\t\t\t,-0.0404551\n\t\t\t\t,0.462009\n\t\t\t\t,0.885952\n\t\t\t\t,-0.00798393\n\t\t\t\t,-0.516969\n\t\t\t\t,0.855967\n\t\t\t\t,-0.00061527\n\t\t\t\t,-0.327821\n\t\t\t\t,0.94474\n\t\t\t\t,-7.94018e-008\n\t\t\t\t,0.632296\n\t\t\t\t,0.774727\n\t\t\t\t,0.00814254\n\t\t\t\t,0.490897\n\t\t\t\t,0.87118\n\t\t\t\t,0.00162364\n\t\t\t\t,-0.200309\n\t\t\t\t,0.979732\n\t\t\t\t,-0.000825477\n\t\t\t\t,0.411551\n\t\t\t\t,0.911386\n\t\t\t\t,0.00302969\n\t\t\t\t,-0.402577\n\t\t\t\t,0.915381\n\t\t\t\t,0.0401104\n\t\t\t\t,-0.412421\n\t\t\t\t,0.91011\n\t\t\t\t,-0.0131114\n\t\t\t\t,0.363612\n\t\t\t\t,0.931458\n\t\t\t\t,0.00814254\n\t\t\t\t,0.490897\n\t\t\t\t,0.87118\n\t\t\t\t,-7.94018e-008\n\t\t\t\t,0.632296\n\t\t\t\t,0.774727\n\t\t\t\t,0.000175404\n\t\t\t\t,0.143642\n\t\t\t\t,0.98963\n\t\t\t\t,-0.000194238\n\t\t\t\t,0.120108\n\t\t\t\t,0.992761\n\t\t\t\t,0.000361616\n\t\t\t\t,-0.15426\n\t\t\t\t,0.98803\n\t\t\t\t,-0.00918028\n\t\t\t\t,-0.344357\n\t\t\t\t,0.938794\n\t\t\t\t,0\n\t\t\t\t,-0.873499\n\t\t\t\t,0.486826\n\t\t\t\t,0.00751858\n\t\t\t\t,-0.95304\n\t\t\t\t,0.302751\n\t\t\t\t,-0.0131114\n\t\t\t\t,0.363612\n\t\t\t\t,0.931458\n\t\t\t\t,-0.000537778\n\t\t\t\t,0.0752893\n\t\t\t\t,0.997162\n\t\t\t\t,-0.0593207\n\t\t\t\t,-0.344523\n\t\t\t\t,0.936902\n\t\t\t\t,-0.0105074\n\t\t\t\t,-0.986739\n\t\t\t\t,0.161974\n\t\t\t\t,0.376435\n\t\t\t\t,-0.326297\n\t\t\t\t,0.86708\n\t\t\t\t,0.475114\n\t\t\t\t,-0.75496\n\t\t\t\t,-0.451998\n\t\t\t\t,0.672894\n\t\t\t\t,-0.680767\n\t\t\t\t,0.289432\n\t\t\t\t,-0.0535424\n\t\t\t\t,-0.97545\n\t\t\t\t,-0.213612\n\t\t\t\t,0.672893\n\t\t\t\t,-0.680767\n\t\t\t\t,0.289432\n\t\t\t\t,-0.0535425\n\t\t\t\t,-0.97545\n\t\t\t\t,-0.213612\n\t\t\t\t,0.886408\n\t\t\t\t,-0.41067\n\t\t\t\t,-0.213612\n\t\t\t\t,0.285178\n\t\t\t\t,-0.91373\n\t\t\t\t,0.289432\n\t\t\t\t,0.886408\n\t\t\t\t,-0.41067\n\t\t\t\t,-0.213612\n\t\t\t\t,0.285178\n\t\t\t\t,-0.91373\n\t\t\t\t,0.289432\n\t\t\t\t,0.56188\n\t\t\t\t,-0.712689\n\t\t\t\t,-0.419959\n\t\t\t\t,0.285178\n\t\t\t\t,-0.91373\n\t\t\t\t,0.289432\n\t\t\t\t,-0.0972898\n\t\t\t\t,-0.632413\n\t\t\t\t,0.768497\n\t\t\t\t,-0.0369874\n\t\t\t\t,0.867758\n\t\t\t\t,0.495609\n\t\t\t\t,0.376435\n\t\t\t\t,-0.326297\n\t\t\t\t,0.86708\n\t\t\t\t,0.105228\n\t\t\t\t,0.274007\n\t\t\t\t,0.955953\n\t\t\t\t,-0.324995\n\t\t\t\t,-0.656888\n\t\t\t\t,0.68035\n\t\t\t\t,0.475114\n\t\t\t\t,-0.75496\n\t\t\t\t,-0.451998\n\t\t\t\t,-0.311712\n\t\t\t\t,0.302371\n\t\t\t\t,-0.900781\n\t\t\t\t,0.291336\n\t\t\t\t,-0.0357272\n\t\t\t\t,-0.955954\n\t\t\t\t,-0.732574\n\t\t\t\t,0.0214365\n\t\t\t\t,-0.68035\n\t\t\t\t,-1.17824e-009\n\t\t\t\t,-0.890103\n\t\t\t\t,-0.45576\n\t\t\t\t,0.0863506\n\t\t\t\t,-0.951254\n\t\t\t\t,-0.296072\n\t\t\t\t,-3.25394e-007\n\t\t\t\t,-0.890102\n\t\t\t\t,-0.455762\n\t\t\t\t,-0.00690504\n\t\t\t\t,-0.914366\n\t\t\t\t,-0.404829\n\t\t\t\t,-0.0116145\n\t\t\t\t,-0.839481\n\t\t\t\t,-0.543265\n\t\t\t\t,0\n\t\t\t\t,-0.890101\n\t\t\t\t,-0.455762\n\t\t\t\t,2.75443e-007\n\t\t\t\t,-0.890102\n\t\t\t\t,-0.455762\n\t\t\t\t,0.168797\n\t\t\t\t,-0.804975\n\t\t\t\t,-0.568791\n\t\t\t\t,2.75427e-007\n\t\t\t\t,-0.890103\n\t\t\t\t,-0.45576\n\t\t\t\t,0.123315\n\t\t\t\t,-0.964391\n\t\t\t\t,-0.233972\n\t\t\t\t,-0.0062414\n\t\t\t\t,-0.909179\n\t\t\t\t,-0.41636\n\t\t\t\t,-1.01367e-008\n\t\t\t\t,-0.890102\n\t\t\t\t,-0.455761\n\t\t\t\t,1.82461e-008\n\t\t\t\t,-0.890102\n\t\t\t\t,-0.455761\n\t\t\t\t,-0.0104442\n\t\t\t\t,-0.822519\n\t\t\t\t,-0.568641\n\t\t\t\t,0.109447\n\t\t\t\t,-0.835271\n\t\t\t\t,-0.538835\n\t\t\t\t,-1.17824e-009\n\t\t\t\t,-0.890103\n\t\t\t\t,-0.45576\n\t\t\t\t,-0.040652\n\t\t\t\t,-0.966775\n\t\t\t\t,-0.252375\n\t\t\t\t,0.304925\n\t\t\t\t,-0.936453\n\t\t\t\t,0.173426\n\t\t\t\t,-0.0181537\n\t\t\t\t,-0.729273\n\t\t\t\t,-0.683981\n\t\t\t\t,0.3499\n\t\t\t\t,-0.414959\n\t\t\t\t,-0.839869\n\t\t\t\t,-0.04185\n\t\t\t\t,-0.96887\n\t\t\t\t,-0.244008\n\t\t\t\t,0.311185\n\t\t\t\t,-0.928639\n\t\t\t\t,0.201975\n\t\t\t\t,-0.0185824\n\t\t\t\t,-0.734402\n\t\t\t\t,-0.678461\n\t\t\t\t,0.34084\n\t\t\t\t,-0.450125\n\t\t\t\t,-0.825358\n\t\t\t\t,-0.0404774\n\t\t\t\t,-0.993827\n\t\t\t\t,-0.103298\n\t\t\t\t,0.344309\n\t\t\t\t,-0.728213\n\t\t\t\t,0.592586\n\t\t\t\t,0.00409827\n\t\t\t\t,-0.615558\n\t\t\t\t,-0.788081\n\t\t\t\t,0.387176\n\t\t\t\t,0.113164\n\t\t\t\t,-0.915035\n\t\t\t\t,-0.0404289\n\t\t\t\t,-0.994156\n\t\t\t\t,-0.1001\n\t\t\t\t,0.341395\n\t\t\t\t,-0.727121\n\t\t\t\t,0.595604\n\t\t\t\t,0.0044418\n\t\t\t\t,-0.614254\n\t\t\t\t,-0.789096\n\t\t\t\t,0.393499\n\t\t\t\t,0.105326\n\t\t\t\t,-0.913272\n\t\t\t\t,-0.015518\n\t\t\t\t,-0.999853\n\t\t\t\t,-0.00722333\n\t\t\t\t,0.17509\n\t\t\t\t,-0.542238\n\t\t\t\t,0.82178\n\t\t\t\t,0.00854592\n\t\t\t\t,-0.544748\n\t\t\t\t,-0.838556\n\t\t\t\t,0.190125\n\t\t\t\t,0.437889\n\t\t\t\t,-0.878696\n\t\t\t\t,-0.0161542\n\t\t\t\t,-0.999828\n\t\t\t\t,-0.00908857\n\t\t\t\t,0.180732\n\t\t\t\t,-0.544578\n\t\t\t\t,0.819006\n\t\t\t\t,0.00849429\n\t\t\t\t,-0.544115\n\t\t\t\t,-0.838967\n\t\t\t\t,0.18337\n\t\t\t\t,0.442853\n\t\t\t\t,-0.877643\n\t\t\t\t,-0.0090645\n\t\t\t\t,-0.999825\n\t\t\t\t,0.0163918\n\t\t\t\t,0.032635\n\t\t\t\t,-0.500829\n\t\t\t\t,0.864931\n\t\t\t\t,0.00552107\n\t\t\t\t,-0.530208\n\t\t\t\t,-0.84785\n\t\t\t\t,0.03277\n\t\t\t\t,0.497754\n\t\t\t\t,-0.866699\n\t\t\t\t,-0.0090701\n\t\t\t\t,-0.999827\n\t\t\t\t,0.0162688\n\t\t\t\t,0.0326919\n\t\t\t\t,-0.500851\n\t\t\t\t,0.864916\n\t\t\t\t,0.00552396\n\t\t\t\t,-0.530051\n\t\t\t\t,-0.847948\n\t\t\t\t,0.0327124\n\t\t\t\t,0.497741\n\t\t\t\t,-0.866709\n\t\t\t\t,-1\n\t\t\t\t,-3.47581e-006\n\t\t\t\t,3.9545e-006\n\t\t\t\t,-0.999425\n\t\t\t\t,0.000542307\n\t\t\t\t,0.0338938\n\t\t\t\t,-0.998516\n\t\t\t\t,0.0471658\n\t\t\t\t,0.0272091\n\t\t\t\t,-1\n\t\t\t\t,4.00754e-006\n\t\t\t\t,3.47623e-006\n\t\t\t\t,-1\n\t\t\t\t,4.1005e-007\n\t\t\t\t,-4.77067e-008\n\t\t\t\t,-0.999829\n\t\t\t\t,0.0156802\n\t\t\t\t,-0.00980156\n\t\t\t\t,-1\n\t\t\t\t,-8.26652e-006\n\t\t\t\t,6.81703e-006\n\t\t\t\t,-0.998513\n\t\t\t\t,0.0472193\n\t\t\t\t,0.0272484\n\t\t\t\t,-1\n\t\t\t\t,2.94654e-009\n\t\t\t\t,-1.44001e-006\n\t\t\t\t,-0.999425\n\t\t\t\t,0.000539843\n\t\t\t\t,0.0339153\n\t\t\t\t,-0.998513\n\t\t\t\t,0.0472269\n\t\t\t\t,0.0272353\n\t\t\t\t,-1\n\t\t\t\t,-5.76512e-007\n\t\t\t\t,-1.60298e-005\n\t\t\t\t,-1\n\t\t\t\t,2.13516e-006\n\t\t\t\t,-2.5418e-006\n\t\t\t\t,-0.999829\n\t\t\t\t,0.0156811\n\t\t\t\t,-0.00980176\n\t\t\t\t,-1\n\t\t\t\t,6.95161e-006\n\t\t\t\t,-5.26594e-006\n\t\t\t\t,-0.998516\n\t\t\t\t,0.0471719\n\t\t\t\t,0.0271987\n\t\t\t\t,-0.000220812\n\t\t\t\t,-0.829085\n\t\t\t\t,-0.559123\n\t\t\t\t,1.74899e-007\n\t\t\t\t,-0.829012\n\t\t\t\t,-0.559231\n\t\t\t\t,-0.393391\n\t\t\t\t,-0.919077\n\t\t\t\t,0.0232481\n\t\t\t\t,0.807892\n\t\t\t\t,-0.556235\n\t\t\t\t,-0.194712\n\t\t\t\t,-8.87842e-007\n\t\t\t\t,-0.829012\n\t\t\t\t,-0.559231\n\t\t\t\t,-0.21912\n\t\t\t\t,-0.442516\n\t\t\t\t,-0.869578\n\t\t\t\t,0.110521\n\t\t\t\t,-0.555334\n\t\t\t\t,-0.82425\n\t\t\t\t,1.41488e-012\n\t\t\t\t,-0.000739274\n\t\t\t\t,-1\n\t\t\t\t,-0.398332\n\t\t\t\t,-0.128825\n\t\t\t\t,-0.90815\n\t\t\t\t,-0.000593273\n\t\t\t\t,0.00383836\n\t\t\t\t,-0.999992\n\t\t\t\t,-0.781174\n\t\t\t\t,0.383447\n\t\t\t\t,-0.492681\n\t\t\t\t,0.362492\n\t\t\t\t,0.40771\n\t\t\t\t,-0.838076\n\t\t\t\t,0\n\t\t\t\t,0.00514831\n\t\t\t\t,-0.999987\n\t\t\t\t,0.001821\n\t\t\t\t,0.0031858\n\t\t\t\t,-0.999993\n\t\t\t\t,0.527237\n\t\t\t\t,-0.347746\n\t\t\t\t,-0.775303\n\t\t\t\t,-0.001821\n\t\t\t\t,0.00294379\n\t\t\t\t,0.999994\n\t\t\t\t,-0.527237\n\t\t\t\t,0.347746\n\t\t\t\t,0.775303\n\t\t\t\t,-0.13217\n\t\t\t\t,0.324216\n\t\t\t\t,0.936705\n\t\t\t\t,-1.09256e-009\n\t\t\t\t,0.00735275\n\t\t\t\t,0.999973\n\t\t\t\t,9.89354e-005\n\t\t\t\t,0.00620474\n\t\t\t\t,0.999981\n\t\t\t\t,0.154807\n\t\t\t\t,0.491034\n\t\t\t\t,0.857275\n\t\t\t\t,0.396257\n\t\t\t\t,0.135158\n\t\t\t\t,0.908137\n\t\t\t\t,-1.41659e-012\n\t\t\t\t,0.000739282\n\t\t\t\t,1\n\t\t\t\t,0.000417634\n\t\t\t\t,0.447214\n\t\t\t\t,0.894427\n\t\t\t\t,0.000468588\n\t\t\t\t,-0.603758\n\t\t\t\t,0.797167\n\t\t\t\t,0.0450911\n\t\t\t\t,-0.676704\n\t\t\t\t,0.734873\n\t\t\t\t,-0.418559\n\t\t\t\t,0.483629\n\t\t\t\t,0.768707\n\t\t\t\t,0.475755\n\t\t\t\t,-0.408176\n\t\t\t\t,0.779134\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,0.000685749\n\t\t\t\t,-0.447214\n\t\t\t\t,-0.894427\n\t\t\t\t,-0.253491\n\t\t\t\t,-0.817725\n\t\t\t\t,-0.516786\n\t\t\t\t,-0.000141237\n\t\t\t\t,-1\n\t\t\t\t,0\n\t\t\t\t,-0.366401\n\t\t\t\t,-0.81369\n\t\t\t\t,-0.451286\n\t\t\t\t,0.014956\n\t\t\t\t,-0.99932\n\t\t\t\t,0.0336964\n\t\t\t\t,-0.29731\n\t\t\t\t,-0.950083\n\t\t\t\t,-0.0945957\n\t\t\t\t,0.433887\n\t\t\t\t,-0.829404\n\t\t\t\t,0.351898\n\t\t\t\t,-0.201662\n\t\t\t\t,-0.954245\n\t\t\t\t,-0.220793\n\t\t\t\t,-0.389556\n\t\t\t\t,0.622092\n\t\t\t\t,0.679152\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,-0.738592\n\t\t\t\t,-0.346601\n\t\t\t\t,-0.578229\n\t\t\t\t,0.845857\n\t\t\t\t,0.0583779\n\t\t\t\t,-0.530205\n\t\t\t\t,-0.845857\n\t\t\t\t,-0.0583779\n\t\t\t\t,0.530205\n\t\t\t\t,0.738592\n\t\t\t\t,0.346601\n\t\t\t\t,0.578229\n\t\t\t\t,0.296538\n\t\t\t\t,-0.215382\n\t\t\t\t,0.930417\n\t\t\t\t,-0.640768\n\t\t\t\t,0.299025\n\t\t\t\t,0.707107\n\t\t\t\t,-0.00253074\n\t\t\t\t,-0.963808\n\t\t\t\t,0.266584\n\t\t\t\t,0.181859\n\t\t\t\t,-0.967686\n\t\t\t\t,-0.174673\n\t\t\t\t,-0.354936\n\t\t\t\t,-0.861714\n\t\t\t\t,0.362586\n\t\t\t\t,-0.595517\n\t\t\t\t,-0.762192\n\t\t\t\t,0.253815\n\t\t\t\t,-0.245964\n\t\t\t\t,-0.750116\n\t\t\t\t,0.613863\n\t\t\t\t,-0.928935\n\t\t\t\t,0.07418\n\t\t\t\t,-0.362737\n\t\t\t\t,-1\n\t\t\t\t,-9.40514e-007\n\t\t\t\t,4.36815e-014\n\t\t\t\t,-0.963109\n\t\t\t\t,-0.144553\n\t\t\t\t,-0.22699\n\t\t\t\t,-1\n\t\t\t\t,0\n\t\t\t\t,0\n\t\t\t\t,-1\n\t\t\t\t,0\n\t\t\t\t,0\n\t\t\t\t,-0.927586\n\t\t\t\t,-0.365025\n\t\t\t\t,-0.0796323\n\t\t\t\t,-0.963372\n\t\t\t\t,-0.223657\n\t\t\t\t,0.147957\n\t\t\t\t,-1\n\t\t\t\t,0\n\t\t\t\t,0\n\t\t\t\t,-1\n\t\t\t\t,0\n\t\t\t\t,0\n\t\t\t\t,-0.928935\n\t\t\t\t,-0.074178\n\t\t\t\t,0.362736\n\t\t\t\t,-0.96311\n\t\t\t\t,0.144551\n\t\t\t\t,0.226991\n\t\t\t\t,-1\n\t\t\t\t,0\n\t\t\t\t,0\n\t\t\t\t,-0.96311\n\t\t\t\t,0.144551\n\t\t\t\t,0.226991\n\t\t\t\t,-1\n\t\t\t\t,0\n\t\t\t\t,0\n\t\t\t\t,-1\n\t\t\t\t,0\n\t\t\t\t,-9.31549e-007\n\t\t\t\t,-0.927586\n\t\t\t\t,0.365025\n\t\t\t\t,0.0796346\n\t\t\t\t,-0.963372\n\t\t\t\t,0.223658\n\t\t\t\t,-0.147957\n\t\t\t\t,-1\n\t\t\t\t,-3.28621e-006\n\t\t\t\t,-3.32301e-006\n\t\t\t\t,-0.948254\n\t\t\t\t,-0.0596413\n\t\t\t\t,-0.311861\n\t\t\t\t,-0.948962\n\t\t\t\t,-0.25913\n\t\t\t\t,-0.179785\n\t\t\t\t,-0.949292\n\t\t\t\t,-0.308453\n\t\t\t\t,0.060834\n\t\t\t\t,-0.948625\n\t\t\t\t,-0.173557\n\t\t\t\t,0.264553\n\t\t\t\t,-0.948255\n\t\t\t\t,0.0596406\n\t\t\t\t,0.311857\n\t\t\t\t,-0.948962\n\t\t\t\t,0.259129\n\t\t\t\t,0.179788\n\t\t\t\t,-0.948962\n\t\t\t\t,0.259129\n\t\t\t\t,0.179788\n\t\t\t\t,-0.949292\n\t\t\t\t,0.308453\n\t\t\t\t,-0.0608337\n\t\t\t\t,-0.948625\n\t\t\t\t,0.173558\n\t\t\t\t,-0.264552\n\t\t\t\t,-1\n\t\t\t\t,-2.8854e-007\n\t\t\t\t,1.84129e-006\n\t\t\t\t,-1\n\t\t\t\t,6.69743e-008\n\t\t\t\t,-7.06787e-007\n\t\t\t\t,-1\n\t\t\t\t,7.07126e-007\n\t\t\t\t,-1.7757e-007\n\t\t\t\t,-1\n\t\t\t\t,2.1936e-007\n\t\t\t\t,-6.38166e-007\n\t\t\t\t,-1\n\t\t\t\t,-2.93299e-007\n\t\t\t\t,-5.98197e-007\n\t\t\t\t,-1\n\t\t\t\t,-4.78313e-007\n\t\t\t\t,-6.62415e-007\n\t\t\t\t,-1\n\t\t\t\t,-4.78313e-007\n\t\t\t\t,-6.62415e-007\n\t\t\t\t,-0.948962\n\t\t\t\t,0.259129\n\t\t\t\t,0.179788\n\t\t\t\t,-0.949292\n\t\t\t\t,0.308453\n\t\t\t\t,-0.0608337\n\t\t\t\t,-1\n\t\t\t\t,-4.78313e-007\n\t\t\t\t,-6.62415e-007\n\t\t\t\t,-1\n\t\t\t\t,-2.49759e-007\n\t\t\t\t,2.79847e-007\n\t\t\t\t,-1\n\t\t\t\t,2.76966e-007\n\t\t\t\t,4.66036e-007\n\t\t\t\t,-0.672894\n\t\t\t\t,-0.680767\n\t\t\t\t,0.289432\n\t\t\t\t,-0.475114\n\t\t\t\t,-0.75496\n\t\t\t\t,-0.451998\n\t\t\t\t,-0.376435\n\t\t\t\t,-0.326297\n\t\t\t\t,0.86708\n\t\t\t\t,0.0535425\n\t\t\t\t,-0.97545\n\t\t\t\t,-0.213612\n\t\t\t\t,-0.886408\n\t\t\t\t,-0.41067\n\t\t\t\t,-0.213612\n\t\t\t\t,0.0535425\n\t\t\t\t,-0.97545\n\t\t\t\t,-0.213612\n\t\t\t\t,-0.672893\n\t\t\t\t,-0.680767\n\t\t\t\t,0.289432\n\t\t\t\t,-0.285178\n\t\t\t\t,-0.91373\n\t\t\t\t,0.289432\n\t\t\t\t,-0.56188\n\t\t\t\t,-0.712689\n\t\t\t\t,-0.419959\n\t\t\t\t,-0.285178\n\t\t\t\t,-0.91373\n\t\t\t\t,0.289432\n\t\t\t\t,-0.886408\n\t\t\t\t,-0.41067\n\t\t\t\t,-0.213612\n\t\t\t\t,0.0972898\n\t\t\t\t,-0.632413\n\t\t\t\t,0.768497\n\t\t\t\t,-0.285178\n\t\t\t\t,-0.91373\n\t\t\t\t,0.289432\n\t\t\t\t,-0.105228\n\t\t\t\t,0.274007\n\t\t\t\t,0.955953\n\t\t\t\t,-0.376435\n\t\t\t\t,-0.326297\n\t\t\t\t,0.86708\n\t\t\t\t,0.0369874\n\t\t\t\t,0.867758\n\t\t\t\t,0.495609\n\t\t\t\t,0.324995\n\t\t\t\t,-0.656888\n\t\t\t\t,0.68035\n\t\t\t\t,-0.291336\n\t\t\t\t,-0.0357272\n\t\t\t\t,-0.955954\n\t\t\t\t,0.311712\n\t\t\t\t,0.302371\n\t\t\t\t,-0.900781\n\t\t\t\t,-0.475114\n\t\t\t\t,-0.75496\n\t\t\t\t,-0.451998\n\t\t\t\t,0.732574\n\t\t\t\t,0.0214365\n\t\t\t\t,-0.68035\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,0.0154838\n\t\t\t\t,-0.994405\n\t\t\t\t,-0.104497\n\t\t\t\t,-3.76609e-009\n\t\t\t\t,-0.992586\n\t\t\t\t,0.121541\n\t\t\t\t,-3.96372e-008\n\t\t\t\t,-0.992586\n\t\t\t\t,0.121541\n\t\t\t\t,-0.0434482\n\t\t\t\t,-0.941647\n\t\t\t\t,-0.333787\n\t\t\t\t,0.179728\n\t\t\t\t,-0.678756\n\t\t\t\t,-0.712031\n\t\t\t\t,-0.417039\n\t\t\t\t,-0.479392\n\t\t\t\t,-0.77218\n\t\t\t\t,0.179265\n\t\t\t\t,-0.0690195\n\t\t\t\t,0.981377\n\t\t\t\t,0.417039\n\t\t\t\t,0.22834\n\t\t\t\t,0.879738\n\t\t\t\t,-0.179728\n\t\t\t\t,0.0472697\n\t\t\t\t,0.98258\n\t\t\t\t,-0.384997\n\t\t\t\t,-0.0134101\n\t\t\t\t,0.922821\n\t\t\t\t,0.157142\n\t\t\t\t,-0.695438\n\t\t\t\t,-0.701194\n\t\t\t\t,0.384994\n\t\t\t\t,-0.765518\n\t\t\t\t,-0.515521\n\t\t\t\t,-0.179266\n\t\t\t\t,-0.845334\n\t\t\t\t,-0.503263\n\t\t\t\t,-0.444517\n\t\t\t\t,-0.336757\n\t\t\t\t,-0.83006\n\t\t\t\t,-0.190969\n\t\t\t\t,-0.447951\n\t\t\t\t,0.873425\n\t\t\t\t,0.444524\n\t\t\t\t,0.434509\n\t\t\t\t,0.783327\n\t\t\t\t,-0.157139\n\t\t\t\t,0.108995\n\t\t\t\t,0.981543\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,0.450922\n\t\t\t\t,-0.770823\n\t\t\t\t,0.45\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,4.75921e-007\n\t\t\t\t,-1\n\t\t\t\t,-2.86674e-006\n\t\t\t\t,-0.0976033\n\t\t\t\t,-0.978464\n\t\t\t\t,0.181886\n\t\t\t\t,-1.12101e-014\n\t\t\t\t,-1\n\t\t\t\t,7.84268e-007\n\t\t\t\t,0.00678098\n\t\t\t\t,-0.998087\n\t\t\t\t,0.0614579\n\t\t\t\t,0.00918275\n\t\t\t\t,-0.994446\n\t\t\t\t,-0.104849\n\t\t\t\t,4.01573e-010\n\t\t\t\t,-1\n\t\t\t\t,-3.92713e-006\n\t\t\t\t,-4.53467e-007\n\t\t\t\t,-1\n\t\t\t\t,-2.35799e-006\n\t\t\t\t,-0.187402\n\t\t\t\t,-0.972376\n\t\t\t\t,-0.139159\n\t\t\t\t,0.00625237\n\t\t\t\t,-0.998849\n\t\t\t\t,0.0475553\n\t\t\t\t,-0.139256\n\t\t\t\t,-0.9587\n\t\t\t\t,0.247998\n\t\t\t\t,-4.53441e-007\n\t\t\t\t,-1\n\t\t\t\t,2.61055e-007\n\t\t\t\t,2.12178e-014\n\t\t\t\t,-1\n\t\t\t\t,-7.85376e-007\n\t\t\t\t,-2.2767e-008\n\t\t\t\t,-1\n\t\t\t\t,-5.10438e-007\n\t\t\t\t,0.00744022\n\t\t\t\t,-0.990636\n\t\t\t\t,-0.136323\n\t\t\t\t,-0.122105\n\t\t\t\t,-0.987541\n\t\t\t\t,-0.0992661\n\t\t\t\t,-1.6396e-014\n\t\t\t\t,-1\n\t\t\t\t,7.85376e-007\n\t\t\t\t,0.0412873\n\t\t\t\t,-0.971472\n\t\t\t\t,0.233535\n\t\t\t\t,-0.338069\n\t\t\t\t,-0.710914\n\t\t\t\t,0.616693\n\t\t\t\t,0.0115391\n\t\t\t\t,-0.95932\n\t\t\t\t,-0.282085\n\t\t\t\t,-0.367578\n\t\t\t\t,-0.733032\n\t\t\t\t,-0.572321\n\t\t\t\t,0.0425017\n\t\t\t\t,-0.969178\n\t\t\t\t,0.242669\n\t\t\t\t,-0.343711\n\t\t\t\t,-0.687496\n\t\t\t\t,0.639697\n\t\t\t\t,0.0120422\n\t\t\t\t,-0.961368\n\t\t\t\t,-0.275003\n\t\t\t\t,-0.359886\n\t\t\t\t,-0.75848\n\t\t\t\t,-0.543314\n\t\t\t\t,0.0412248\n\t\t\t\t,-0.920523\n\t\t\t\t,0.388507\n\t\t\t\t,-0.343402\n\t\t\t\t,-0.293444\n\t\t\t\t,0.892169\n\t\t\t\t,-0.00672757\n\t\t\t\t,-0.908087\n\t\t\t\t,-0.418729\n\t\t\t\t,-0.366398\n\t\t\t\t,-0.30837\n\t\t\t\t,-0.877873\n\t\t\t\t,0.0411043\n\t\t\t\t,-0.919153\n\t\t\t\t,0.391751\n\t\t\t\t,-0.340007\n\t\t\t\t,-0.290618\n\t\t\t\t,0.894392\n\t\t\t\t,-0.00689869\n\t\t\t\t,-0.907531\n\t\t\t\t,-0.419927\n\t\t\t\t,-0.372315\n\t\t\t\t,-0.313985\n\t\t\t\t,-0.873381\n\t\t\t\t,0.015669\n\t\t\t\t,-0.877507\n\t\t\t\t,0.479308\n\t\t\t\t,-0.154014\n\t\t\t\t,-0.0448485\n\t\t\t\t,0.98705\n\t\t\t\t,-0.00758947\n\t\t\t\t,-0.873186\n\t\t\t\t,-0.487329\n\t\t\t\t,-0.164712\n\t\t\t\t,-0.0474187\n\t\t\t\t,-0.985201\n\t\t\t\t,0.0163089\n\t\t\t\t,-0.878398\n\t\t\t\t,0.477651\n\t\t\t\t,-0.159387\n\t\t\t\t,-0.0474551\n\t\t\t\t,0.986075\n\t\t\t\t,-0.00752302\n\t\t\t\t,-0.872874\n\t\t\t\t,-0.487887\n\t\t\t\t,-0.158628\n\t\t\t\t,-0.0433993\n\t\t\t\t,-0.986384\n\t\t\t\t,0.00924347\n\t\t\t\t,-0.866137\n\t\t\t\t,0.499722\n\t\t\t\t,-0.0275777\n\t\t\t\t,-0.00162037\n\t\t\t\t,0.999618\n\t\t\t\t,-0.00460349\n\t\t\t\t,-0.866251\n\t\t\t\t,-0.499588\n\t\t\t\t,-0.027671\n\t\t\t\t,-0.000995395\n\t\t\t\t,-0.999617\n\t\t\t\t,0.0092495\n\t\t\t\t,-0.866202\n\t\t\t\t,0.499609\n\t\t\t\t,-0.027626\n\t\t\t\t,-0.00165926\n\t\t\t\t,0.999617\n\t\t\t\t,-0.00460571\n\t\t\t\t,-0.866165\n\t\t\t\t,-0.499737\n\t\t\t\t,-0.0276221\n\t\t\t\t,-0.00102645\n\t\t\t\t,-0.999618\n\t\t\t\t,0.998852\n\t\t\t\t,0.0478939\n\t\t\t\t,2.28377e-005\n\t\t\t\t,0.99949\n\t\t\t\t,0.0159522\n\t\t\t\t,0.0276739\n\t\t\t\t,1\n\t\t\t\t,-1.36753e-006\n\t\t\t\t,5.10953e-006\n\t\t\t\t,1\n\t\t\t\t,3.99357e-006\n\t\t\t\t,1.11115e-006\n\t\t\t\t,0.999872\n\t\t\t\t,0.00798293\n\t\t\t\t,-0.0138362\n\t\t\t\t,1\n\t\t\t\t,1.54003e-007\n\t\t\t\t,-6.14032e-008\n\t\t\t\t,0.99885\n\t\t\t\t,0.0479518\n\t\t\t\t,2.95514e-005\n\t\t\t\t,1\n\t\t\t\t,-3.22047e-006\n\t\t\t\t,9.0251e-006\n\t\t\t\t,0.99885\n\t\t\t\t,0.0479518\n\t\t\t\t,1.59752e-005\n\t\t\t\t,0.999489\n\t\t\t\t,0.0159603\n\t\t\t\t,0.0276942\n\t\t\t\t,1\n\t\t\t\t,-8.70488e-007\n\t\t\t\t,-9.51755e-007\n\t\t\t\t,1\n\t\t\t\t,-7.47731e-006\n\t\t\t\t,-1.30885e-005\n\t\t\t\t,0.999872\n\t\t\t\t,0.00798234\n\t\t\t\t,-0.0138372\n\t\t\t\t,1\n\t\t\t\t,-3.15864e-007\n\t\t\t\t,-2.65722e-006\n\t\t\t\t,0.998852\n\t\t\t\t,0.0478939\n\t\t\t\t,1.14573e-005\n\t\t\t\t,1\n\t\t\t\t,2.37574e-006\n\t\t\t\t,-7.29914e-006\n\t\t\t\t,4.26152e-008\n\t\t\t\t,-0.00416847\n\t\t\t\t,0.999991\n\t\t\t\t,1.65891e-007\n\t\t\t\t,-0.00416855\n\t\t\t\t,0.999991\n\t\t\t\t,-3.04971e-011\n\t\t\t\t,-0.00416861\n\t\t\t\t,0.999991\n\t\t\t\t,0\n\t\t\t\t,-0.00416841\n\t\t\t\t,0.999991\n\t\t\t\t,1.39238e-008\n\t\t\t\t,-0.00416844\n\t\t\t\t,0.999991\n\t\t\t\t,0\n\t\t\t\t,-0.00416841\n\t\t\t\t,0.999991\n\t\t\t\t,-1.39238e-008\n\t\t\t\t,-0.00416844\n\t\t\t\t,0.999991\n\t\t\t\t,0\n\t\t\t\t,-0.00416841\n\t\t\t\t,0.999991\n\t\t\t\t,-1.65891e-007\n\t\t\t\t,-0.00416848\n\t\t\t\t,0.999991\n\t\t\t\t,-1.39841e-008\n\t\t\t\t,-0.00416846\n\t\t\t\t,0.999991\n\t\t\t\t,3.61656e-010\n\t\t\t\t,-0.00416841\n\t\t\t\t,0.999991\n\t\t\t\t,-5.40147e-011\n\t\t\t\t,-0.00416861\n\t\t\t\t,0.999991\n\t\t\t\t,-2.06807e-007\n\t\t\t\t,-0.00416929\n\t\t\t\t,0.999991\n\t\t\t\t,-5.4016e-011\n\t\t\t\t,-0.00416861\n\t\t\t\t,0.999991\n\t\t\t\t,-1.65891e-007\n\t\t\t\t,-0.00416893\n\t\t\t\t,0.999991\n\t\t\t\t,1.80829e-010\n\t\t\t\t,-0.00416956\n\t\t\t\t,0.999991\n\t\t\t\t,-6.88955e-008\n\t\t\t\t,-0.00416945\n\t\t\t\t,0.999991\n\t\t\t\t,6.88954e-008\n\t\t\t\t,-0.00416945\n\t\t\t\t,0.999991\n\t\t\t\t,1.80829e-010\n\t\t\t\t,-0.00416956\n\t\t\t\t,0.999991\n\t\t\t\t,0\n\t\t\t\t,-0.00416956\n\t\t\t\t,0.999991\n\t\t\t\t,1.6589e-007\n\t\t\t\t,-0.00416925\n\t\t\t\t,0.999991\n\t\t\t\t,0\n\t\t\t\t,-0.00416956\n\t\t\t\t,0.999991\n\t\t\t\t,6.88955e-008\n\t\t\t\t,-0.00416937\n\t\t\t\t,0.999991\n\t\t\t\t,-3.04998e-011\n\t\t\t\t,-0.00416861\n\t\t\t\t,0.999991\n\t\t\t\t,0.963109\n\t\t\t\t,-0.144553\n\t\t\t\t,-0.22699\n\t\t\t\t,1\n\t\t\t\t,-9.3897e-007\n\t\t\t\t,4.36815e-014\n\t\t\t\t,0.928935\n\t\t\t\t,0.0741801\n\t\t\t\t,-0.362737\n\t\t\t\t,1\n\t\t\t\t,0\n\t\t\t\t,0\n\t\t\t\t,1\n\t\t\t\t,0\n\t\t\t\t,0\n\t\t\t\t,0.927586\n\t\t\t\t,-0.365025\n\t\t\t\t,-0.0796325\n\t\t\t\t,0.963372\n\t\t\t\t,-0.223657\n\t\t\t\t,0.147957\n\t\t\t\t,1\n\t\t\t\t,0\n\t\t\t\t,0\n\t\t\t\t,1\n\t\t\t\t,0\n\t\t\t\t,0\n\t\t\t\t,0.928935\n\t\t\t\t,-0.0741779\n\t\t\t\t,0.362736\n\t\t\t\t,0.96311\n\t\t\t\t,0.144551\n\t\t\t\t,0.226991\n\t\t\t\t,1\n\t\t\t\t,0\n\t\t\t\t,0\n\t\t\t\t,1\n\t\t\t\t,-2.56885e-013\n\t\t\t\t,-9.36472e-007\n\t\t\t\t,1\n\t\t\t\t,0\n\t\t\t\t,0\n\t\t\t\t,0.96311\n\t\t\t\t,0.144551\n\t\t\t\t,0.226991\n\t\t\t\t,0.927586\n\t\t\t\t,0.365025\n\t\t\t\t,0.0796344\n\t\t\t\t,0.963372\n\t\t\t\t,0.223658\n\t\t\t\t,-0.147957\n\t\t\t\t,1\n\t\t\t\t,-3.29295e-006\n\t\t\t\t,-3.32983e-006\n\t\t\t\t,0.948254\n\t\t\t\t,-0.0596413\n\t\t\t\t,-0.311861\n\t\t\t\t,0.948962\n\t\t\t\t,-0.259129\n\t\t\t\t,-0.179785\n\t\t\t\t,0.949292\n\t\t\t\t,-0.308453\n\t\t\t\t,0.0608337\n\t\t\t\t,0.948625\n\t\t\t\t,-0.173557\n\t\t\t\t,0.264553\n\t\t\t\t,0.948255\n\t\t\t\t,0.0596406\n\t\t\t\t,0.311857\n\t\t\t\t,0.948962\n\t\t\t\t,0.25913\n\t\t\t\t,0.179788\n\t\t\t\t,0.948962\n\t\t\t\t,0.25913\n\t\t\t\t,0.179788\n\t\t\t\t,0.949292\n\t\t\t\t,0.308453\n\t\t\t\t,-0.0608341\n\t\t\t\t,0.948625\n\t\t\t\t,0.173558\n\t\t\t\t,-0.264552\n\t\t\t\t,1\n\t\t\t\t,-2.80179e-007\n\t\t\t\t,1.45455e-006\n\t\t\t\t,1\n\t\t\t\t,7.15551e-008\n\t\t\t\t,-7.76777e-007\n\t\t\t\t,1\n\t\t\t\t,6.79976e-007\n\t\t\t\t,-3.89599e-007\n\t\t\t\t,1\n\t\t\t\t,2.4414e-007\n\t\t\t\t,-7.39162e-007\n\t\t\t\t,1\n\t\t\t\t,-2.89895e-007\n\t\t\t\t,-7.91451e-007\n\t\t\t\t,1\n\t\t\t\t,-4.75189e-007\n\t\t\t\t,-7.30368e-007\n\t\t\t\t,0.949292\n\t\t\t\t,0.308453\n\t\t\t\t,-0.0608341\n\t\t\t\t,0.948962\n\t\t\t\t,0.25913\n\t\t\t\t,0.179788\n\t\t\t\t,1\n\t\t\t\t,-4.75189e-007\n\t\t\t\t,-7.30368e-007\n\t\t\t\t,1\n\t\t\t\t,-2.77171e-007\n\t\t\t\t,6.578e-008\n\t\t\t\t,1\n\t\t\t\t,-4.75189e-007\n\t\t\t\t,-7.30368e-007\n\t\t\t\t,1\n\t\t\t\t,3.2386e-007\n\t\t\t\t,2.61919e-007\n\t\t\t\t,0.194781\n\t\t\t\t,0.707682\n\t\t\t\t,-0.679151\n\t\t\t\t,0\n\t\t\t\t,0.707107\n\t\t\t\t,-0.707107\n\t\t\t\t,0\n\t\t\t\t,-0.447214\n\t\t\t\t,-0.894427\n\t\t\t\t,-0.223492\n\t\t\t\t,-0.209702\n\t\t\t\t,0.951881\n\t\t\t\t,-0.477285\n\t\t\t\t,-0.420096\n\t\t\t\t,0.771828\n\t\t\t\t,0.416604\n\t\t\t\t,0.496174\n\t\t\t\t,0.761743\n\t\t\t\t,0.000377879\n\t\t\t\t,-1\n\t\t\t\t,0\n\t\t\t\t,0.13015\n\t\t\t\t,-0.810231\n\t\t\t\t,-0.571478\n\t\t\t\t,-0.014788\n\t\t\t\t,-0.999346\n\t\t\t\t,0.0329953\n\t\t\t\t,0.358208\n\t\t\t\t,-0.812175\n\t\t\t\t,-0.460497\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,0.201662\n\t\t\t\t,-0.954245\n\t\t\t\t,-0.220793\n\t\t\t\t,0.477286\n\t\t\t\t,0.420094\n\t\t\t\t,-0.771828\n\t\t\t\t,-0.389556\n\t\t\t\t,-0.622092\n\t\t\t\t,-0.679152\n\t\t\t\t,0.389557\n\t\t\t\t,0.622091\n\t\t\t\t,0.679152\n\t\t\t\t,-0.279512\n\t\t\t\t,-0.0974885\n\t\t\t\t,-0.95518\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,-0.416603\n\t\t\t\t,-0.496174\n\t\t\t\t,-0.761743\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,-0.64015\n\t\t\t\t,0.573225\n\t\t\t\t,0.511489\n\t\t\t\t,0.390499\n\t\t\t\t,-0.34033\n\t\t\t\t,0.855387\n\t\t\t\t,0.849538\n\t\t\t\t,-0.0582332\n\t\t\t\t,0.524303\n\t\t\t\t,0.405257\n\t\t\t\t,0.18912\n\t\t\t\t,-0.894427\n\t\t\t\t,0.64015\n\t\t\t\t,-0.573225\n\t\t\t\t,-0.511489\n\t\t\t\t,-0.849538\n\t\t\t\t,0.0582332\n\t\t\t\t,-0.524303\n\t\t\t\t,-0.640768\n\t\t\t\t,-0.299025\n\t\t\t\t,-0.707107\n\t\t\t\t,0\n\t\t\t\t,-0.707107\n\t\t\t\t,0.707107\n\t\t\t\t,0.156142\n\t\t\t\t,-0.755801\n\t\t\t\t,0.635912\n\t\t\t\t,0.000377874\n\t\t\t\t,-1\n\t\t\t\t,0\n\t\t\t\t,0.349667\n\t\t\t\t,-0.860175\n\t\t\t\t,0.371258\n\t\t\t\t,-0.134769\n\t\t\t\t,-0.93998\n\t\t\t\t,-0.313489\n\t\t\t\t,0.595837\n\t\t\t\t,-0.7588\n\t\t\t\t,0.263061\n\t\t\t\t,-0.228496\n\t\t\t\t,-0.961624\n\t\t\t\t,-0.151883\n\t\t\t\t,0.331554\n\t\t\t\t,-0.925707\n\t\t\t\t,0.182039\n\t\t\t\t,0.393391\n\t\t\t\t,-0.919077\n\t\t\t\t,0.0232479\n\t\t\t\t,-2.15573e-007\n\t\t\t\t,-0.829012\n\t\t\t\t,-0.559231\n\t\t\t\t,0.000220765\n\t\t\t\t,-0.829085\n\t\t\t\t,-0.559123\n\t\t\t\t,-0.807892\n\t\t\t\t,-0.556235\n\t\t\t\t,-0.194712\n\t\t\t\t,8.71665e-007\n\t\t\t\t,-0.829012\n\t\t\t\t,-0.559231\n\t\t\t\t,0.0803752\n\t\t\t\t,-0.40223\n\t\t\t\t,-0.912004\n\t\t\t\t,-0.0445054\n\t\t\t\t,-0.543124\n\t\t\t\t,-0.838472\n\t\t\t\t,-0.000593291\n\t\t\t\t,-0.00383837\n\t\t\t\t,0.999992\n\t\t\t\t,-0.398332\n\t\t\t\t,0.128825\n\t\t\t\t,0.90815\n\t\t\t\t,-4.41571e-008\n\t\t\t\t,0.000739273\n\t\t\t\t,1\n\t\t\t\t,-0.781175\n\t\t\t\t,-0.383447\n\t\t\t\t,0.492681\n\t\t\t\t,0.362492\n\t\t\t\t,-0.40771\n\t\t\t\t,0.838076\n\t\t\t\t,3.53718e-010\n\t\t\t\t,-0.00514831\n\t\t\t\t,0.999987\n\t\t\t\t,0.00182102\n\t\t\t\t,-0.0031858\n\t\t\t\t,0.999993\n\t\t\t\t,0.527237\n\t\t\t\t,0.347745\n\t\t\t\t,0.775303\n\t\t\t\t,-0.132834\n\t\t\t\t,-0.323941\n\t\t\t\t,-0.936706\n\t\t\t\t,-0.527237\n\t\t\t\t,-0.347745\n\t\t\t\t,-0.775303\n\t\t\t\t,-0.00182102\n\t\t\t\t,-0.00294378\n\t\t\t\t,-0.999994\n\t\t\t\t,-2.97972e-010\n\t\t\t\t,-0.00735275\n\t\t\t\t,-0.999973\n\t\t\t\t,9.89478e-005\n\t\t\t\t,-0.00620474\n\t\t\t\t,-0.999981\n\t\t\t\t,0.0803752\n\t\t\t\t,-0.40223\n\t\t\t\t,-0.912004\n\t\t\t\t,-0.0445054\n\t\t\t\t,-0.543124\n\t\t\t\t,-0.838472\n\t\t\t\t,0.396257\n\t\t\t\t,-0.135158\n\t\t\t\t,-0.908137\n\t\t\t\t,0.154807\n\t\t\t\t,-0.491034\n\t\t\t\t,-0.857275\n\t\t\t\t,4.41571e-008\n\t\t\t\t,-0.000739274\n\t\t\t\t,-1\n\t\t\t\t,0.18466\n\t\t\t\t,-0.914467\n\t\t\t\t,-0.360072\n\t\t\t\t,0.187849\n\t\t\t\t,-0.911039\n\t\t\t\t,0.367044\n\t\t\t\t,-0.591718\n\t\t\t\t,-0.747079\n\t\t\t\t,-0.302891\n\t\t\t\t,-0.602058\n\t\t\t\t,-0.743119\n\t\t\t\t,0.292061\n\t\t\t\t,-0.593873\n\t\t\t\t,-0.747096\n\t\t\t\t,-0.2986\n\t\t\t\t,0.709222\n\t\t\t\t,-0.704984\n\t\t\t\t,-0.0012206\n\t\t\t\t,-0.707103\n\t\t\t\t,-0.707107\n\t\t\t\t,0.00245314\n\t\t\t\t,0.194833\n\t\t\t\t,-0.910983\n\t\t\t\t,0.363524\n\t\t\t\t,0.704997\n\t\t\t\t,-0.709209\n\t\t\t\t,0.00124256\n\t\t\t\t,-0.601011\n\t\t\t\t,-0.74313\n\t\t\t\t,0.294184\n\t\t\t\t,0.17072\n\t\t\t\t,-0.914411\n\t\t\t\t,-0.367025\n\t\t\t\t,-0.707107\n\t\t\t\t,-0.707107\n\t\t\t\t,0\n\t\t\t\t,-0.236912\n\t\t\t\t,0.23429\n\t\t\t\t,0.942858\n\t\t\t\t,-0.00144717\n\t\t\t\t,-0.000289069\n\t\t\t\t,0.999999\n\t\t\t\t,0.578621\n\t\t\t\t,0.577727\n\t\t\t\t,0.575699\n\t\t\t\t,0.00346926\n\t\t\t\t,0\n\t\t\t\t,0.999994\n\t\t\t\t,-0.000862149\n\t\t\t\t,-0.000867333\n\t\t\t\t,-0.999999\n\t\t\t\t,-0.233652\n\t\t\t\t,0.235057\n\t\t\t\t,-0.94348\n\t\t\t\t,0\n\t\t\t\t,0\n\t\t\t\t,-1\n\t\t\t\t,0.572751\n\t\t\t\t,0.579636\n\t\t\t\t,-0.579636\n\t\t\t\t,0\n\t\t\t\t,-0.902319\n\t\t\t\t,-0.43107\n\t\t\t\t,0\n\t\t\t\t,-0.873499\n\t\t\t\t,0.486826\n\t\t\t\t,-0.00751858\n\t\t\t\t,-0.95304\n\t\t\t\t,0.302751\n\t\t\t\t,0.0714406\n\t\t\t\t,-0.836045\n\t\t\t\t,-0.543991\n\t\t\t\t,0.0105074\n\t\t\t\t,-0.986739\n\t\t\t\t,0.161974\n\t\t\t\t,0.0439428\n\t\t\t\t,-0.711914\n\t\t\t\t,-0.70089\n\t\t\t\t,0\n\t\t\t\t,0\n\t\t\t\t,1\n\t\t\t\t,0\n\t\t\t\t,0\n\t\t\t\t,1\n\t\t\t\t,0\n\t\t\t\t,0\n\t\t\t\t,1\n\t\t\t\t,0\n\t\t\t\t,0\n\t\t\t\t,1\n\t\t\t\t,0\n\t\t\t\t,0\n\t\t\t\t,1\n\t\t\t\t,0\n\t\t\t\t,0\n\t\t\t\t,1\n\t\t\t\t,1.40811e-007\n\t\t\t\t,0.460485\n\t\t\t\t,0.887667\n\t\t\t\t,0.0541128\n\t\t\t\t,0.257088\n\t\t\t\t,0.964872\n\t\t\t\t,0\n\t\t\t\t,0\n\t\t\t\t,1\n\t\t\t\t,0\n\t\t\t\t,0\n\t\t\t\t,1\n\t\t\t\t,0\n\t\t\t\t,0\n\t\t\t\t,1\n\t\t\t\t,0\n\t\t\t\t,0\n\t\t\t\t,1\n\t\t\t\t,0\n\t\t\t\t,0\n\t\t\t\t,1\n\t\t\t\t,-0.112093\n\t\t\t\t,-0.0159927\n\t\t\t\t,0.993569\n\t\t\t\t,-0.101435\n\t\t\t\t,0.109831\n\t\t\t\t,0.988761\n\t\t\t\t,-0.179656\n\t\t\t\t,0.26862\n\t\t\t\t,0.946344\n\t\t\t\t,-0.00928401\n\t\t\t\t,0.0285578\n\t\t\t\t,0.999549\n\t\t\t\t,-0.34336\n\t\t\t\t,0.0792732\n\t\t\t\t,0.935852\n\t\t\t\t,9.95781e-008\n\t\t\t\t,0.341028\n\t\t\t\t,0.940053\n\t\t\t\t,-0.0485403\n\t\t\t\t,0.47057\n\t\t\t\t,0.881027\n\t\t\t\t,0.00144246\n\t\t\t\t,0.411131\n\t\t\t\t,0.911575\n\t\t\t\t,0.0262054\n\t\t\t\t,0.331954\n\t\t\t\t,0.942932\n\t\t\t\t,-0.000688597\n\t\t\t\t,0.902318\n\t\t\t\t,0.43107\n\t\t\t\t,0.0786219\n\t\t\t\t,0.821535\n\t\t\t\t,0.564712\n\t\t\t\t,0.0889155\n\t\t\t\t,-0.995997\n\t\t\t\t,-0.00913129\n\t\t\t\t,0.0101894\n\t\t\t\t,-0.785117\n\t\t\t\t,0.619264\n\t\t\t\t,0.19477\n\t\t\t\t,-0.796505\n\t\t\t\t,0.572403\n\t\t\t\t,0.265828\n\t\t\t\t,-0.901133\n\t\t\t\t,-0.342483\n\t\t\t\t,0.029743\n\t\t\t\t,0.0276108\n\t\t\t\t,0.999176\n\t\t\t\t,0.221427\n\t\t\t\t,-0.305938\n\t\t\t\t,0.925944\n\t\t\t\t,-0.027699\n\t\t\t\t,-0.084837\n\t\t\t\t,0.99601\n\t\t\t\t,0\n\t\t\t\t,1.98636e-007\n\t\t\t\t,1\n\t\t\t\t,-0.0487038\n\t\t\t\t,-0.111506\n\t\t\t\t,0.99257\n\t\t\t\t,-0.00455985\n\t\t\t\t,-0.0146535\n\t\t\t\t,0.999882\n\t\t\t\t,0.0131139\n\t\t\t\t,0.0312149\n\t\t\t\t,0.999427\n\t\t\t\t,0\n\t\t\t\t,-8.92106e-008\n\t\t\t\t,1\n\t\t\t\t,0.019452\n\t\t\t\t,-0.00993628\n\t\t\t\t,0.999761\n\t\t\t\t,-0.0378945\n\t\t\t\t,-0.0761685\n\t\t\t\t,0.996375\n\t\t\t\t,-0.131703\n\t\t\t\t,0.0639368\n\t\t\t\t,0.989225\n\t\t\t\t,0.138493\n\t\t\t\t,-0.0842195\n\t\t\t\t,0.986776\n\t\t\t\t,0.00189662\n\t\t\t\t,-0.00115724\n\t\t\t\t,0.999998\n\t\t\t\t,-0.00349707\n\t\t\t\t,-0.0126157\n\t\t\t\t,0.999914\n\t\t\t\t,-0.184911\n\t\t\t\t,0.0824887\n\t\t\t\t,0.979287\n\t\t\t\t,0.0932494\n\t\t\t\t,0.200658\n\t\t\t\t,0.975213\n\t\t\t\t,-0.366999\n\t\t\t\t,-0.106443\n\t\t\t\t,0.924111\n\t\t\t\t,-0.0298082\n\t\t\t\t,0.00967327\n\t\t\t\t,0.999509\n\t\t\t\t,0.0585932\n\t\t\t\t,0.115214\n\t\t\t\t,0.991611\n\t\t\t\t,-0.00940561\n\t\t\t\t,0.00285849\n\t\t\t\t,0.999952\n\t\t\t\t,0.0166786\n\t\t\t\t,0.0457884\n\t\t\t\t,0.998812\n\t\t\t\t,0.00160239\n\t\t\t\t,-0.000371487\n\t\t\t\t,0.999999\n\t\t\t\t,0.105282\n\t\t\t\t,0.301974\n\t\t\t\t,0.947485\n\t\t\t\t,0.761491\n\t\t\t\t,-0.0703961\n\t\t\t\t,0.644342\n\t\t\t\t,0.165134\n\t\t\t\t,0.235988\n\t\t\t\t,0.957622\n\t\t\t\t,0.00262008\n\t\t\t\t,-0.0720116\n\t\t\t\t,0.9974\n\t\t\t\t,0.000269095\n\t\t\t\t,-0.0109763\n\t\t\t\t,0.99994\n\t\t\t\t,-0.027699\n\t\t\t\t,-0.084837\n\t\t\t\t,0.99601\n\t\t\t\t,-0.0487038\n\t\t\t\t,-0.111506\n\t\t\t\t,0.99257\n\t\t\t\t,5.08836e-005\n\t\t\t\t,-0.00274336\n\t\t\t\t,0.999996\n\t\t\t\t,-0.00455985\n\t\t\t\t,-0.0146535\n\t\t\t\t,0.999882\n\t\t\t\t,0.0165575\n\t\t\t\t,0.163595\n\t\t\t\t,0.986389\n\t\t\t\t,0.0131139\n\t\t\t\t,0.0312149\n\t\t\t\t,0.999427\n\t\t\t\t,0.00241493\n\t\t\t\t,-0.0613622\n\t\t\t\t,0.998113\n\t\t\t\t,-0.0378945\n\t\t\t\t,-0.0761685\n\t\t\t\t,0.996375\n\t\t\t\t,0.000825477\n\t\t\t\t,0.411551\n\t\t\t\t,0.911386\n\t\t\t\t,-0.00162364\n\t\t\t\t,-0.200309\n\t\t\t\t,0.979732\n\t\t\t\t,0.00366731\n\t\t\t\t,-0.0408081\n\t\t\t\t,0.99916\n\t\t\t\t,-0.0419145\n\t\t\t\t,0.24215\n\t\t\t\t,0.969333\n\t\t\t\t,-0.00302969\n\t\t\t\t,-0.402577\n\t\t\t\t,0.915381\n\t\t\t\t,-0.0318434\n\t\t\t\t,-0.348515\n\t\t\t\t,0.936762\n\t\t\t\t,0.002882\n\t\t\t\t,-0.0500721\n\t\t\t\t,0.998741\n\t\t\t\t,-0.00349707\n\t\t\t\t,-0.0126157\n\t\t\t\t,0.999914\n\t\t\t\t,-0.0253632\n\t\t\t\t,-0.0458127\n\t\t\t\t,0.998628\n\t\t\t\t,-0.00217587\n\t\t\t\t,0.0317617\n\t\t\t\t,0.999493\n\t\t\t\t,-0.0478437\n\t\t\t\t,-0.0151964\n\t\t\t\t,0.998739\n\t\t\t\t,0.0932494\n\t\t\t\t,0.200658\n\t\t\t\t,0.975213\n\t\t\t\t,-0.00599234\n\t\t\t\t,0.236392\n\t\t\t\t,0.971639\n\t\t\t\t,-0.0321798\n\t\t\t\t,0.394025\n\t\t\t\t,0.918536\n\t\t\t\t,-0.0113092\n\t\t\t\t,0.651621\n\t\t\t\t,0.758461\n\t\t\t\t,0.0248735\n\t\t\t\t,0.319871\n\t\t\t\t,0.947135\n\t\t\t\t,-0.0866838\n\t\t\t\t,0.316656\n\t\t\t\t,0.944571\n\t\t\t\t,-0.149011\n\t\t\t\t,0.778708\n\t\t\t\t,0.609434\n\t\t\t\t,-0.488554\n\t\t\t\t,0.839089\n\t\t\t\t,0.239261\n\t\t\t\t,-0.742056\n\t\t\t\t,0.470408\n\t\t\t\t,0.477566\n\t\t\t\t,-0.0383749\n\t\t\t\t,0.258135\n\t\t\t\t,0.965346\n\t\t\t\t,-0.393471\n\t\t\t\t,-0.173445\n\t\t\t\t,0.902828\n\t\t\t\t,0.0131114\n\t\t\t\t,0.363612\n\t\t\t\t,0.931458\n\t\t\t\t,0.0038073\n\t\t\t\t,0.112658\n\t\t\t\t,0.993627\n\t\t\t\t,0.0093968\n\t\t\t\t,0.249515\n\t\t\t\t,0.968325\n\t\t\t\t,0.0585932\n\t\t\t\t,0.115214\n\t\t\t\t,0.991611\n\t\t\t\t,0.000537778\n\t\t\t\t,0.0752893\n\t\t\t\t,0.997162\n\t\t\t\t,0.000500418\n\t\t\t\t,0.0354369\n\t\t\t\t,0.999372\n\t\t\t\t,0.00957175\n\t\t\t\t,0.173568\n\t\t\t\t,0.984775\n\t\t\t\t,0.0166786\n\t\t\t\t,0.0457884\n\t\t\t\t,0.998812\n\t\t\t\t,0.0593207\n\t\t\t\t,-0.344523\n\t\t\t\t,0.936902\n\t\t\t\t,0.00127604\n\t\t\t\t,-0.00177759\n\t\t\t\t,0.999998\n\t\t\t\t,0.0114275\n\t\t\t\t,0.709425\n\t\t\t\t,0.704688\n\t\t\t\t,-0.00116785\n\t\t\t\t,0.336955\n\t\t\t\t,0.94152\n\t\t\t\t,0.0105074\n\t\t\t\t,-0.986739\n\t\t\t\t,0.161974\n\t\t\t\t,0.390535\n\t\t\t\t,-0.832841\n\t\t\t\t,0.392249\n\t\t\t\t,0.757397\n\t\t\t\t,-0.108563\n\t\t\t\t,0.643867\n\t\t\t\t,0.0549957\n\t\t\t\t,0.986532\n\t\t\t\t,-0.154047\n\t\t\t\t,0.31269\n\t\t\t\t,0.930625\n\t\t\t\t,0.190164\n\t\t\t\t,0.165134\n\t\t\t\t,0.235988\n\t\t\t\t,0.957622\n\t\t\t\t,-0.366999\n\t\t\t\t,-0.106443\n\t\t\t\t,0.924111\n\t\t\t\t,0\n\t\t\t\t,0\n\t\t\t\t,1\n\t\t\t\t,-5.04432e-008\n\t\t\t\t,3.38268e-008\n\t\t\t\t,1\n\t\t\t\t,-0.0052971\n\t\t\t\t,-0.00628658\n\t\t\t\t,0.999966\n\t\t\t\t,-0.0347242\n\t\t\t\t,-0.0377523\n\t\t\t\t,0.998684\n\t\t\t\t,0\n\t\t\t\t,0\n\t\t\t\t,1\n\t\t\t\t,-0.00131136\n\t\t\t\t,-0.00168028\n\t\t\t\t,0.999998\n\t\t\t\t,0.241869\n\t\t\t\t,0.130678\n\t\t\t\t,0.961469\n\t\t\t\t,0.113022\n\t\t\t\t,0.0936855\n\t\t\t\t,0.989166\n\t\t\t\t,0\n\t\t\t\t,0\n\t\t\t\t,1\n\t\t\t\t,-0.0294955\n\t\t\t\t,-0.0293093\n\t\t\t\t,0.999135\n\t\t\t\t,0\n\t\t\t\t,0\n\t\t\t\t,1\n\t\t\t\t,-0.0232234\n\t\t\t\t,-0.0204214\n\t\t\t\t,0.999522\n\t\t\t\t,-0.112093\n\t\t\t\t,-0.0159927\n\t\t\t\t,0.993569\n\t\t\t\t,-0.0839063\n\t\t\t\t,0.0198096\n\t\t\t\t,0.996277\n\t\t\t\t,-0.0247243\n\t\t\t\t,0.186474\n\t\t\t\t,0.982149\n\t\t\t\t,0.241754\n\t\t\t\t,0.190759\n\t\t\t\t,0.951402\n\t\t\t\t,-0.985306\n\t\t\t\t,0.0162614\n\t\t\t\t,0.170025\n\t\t\t\t,-0.869311\n\t\t\t\t,-0.0155158\n\t\t\t\t,0.494022\n\t\t\t\t,-0.868618\n\t\t\t\t,0.0299246\n\t\t\t\t,0.494578\n\t\t\t\t,0.221427\n\t\t\t\t,-0.305938\n\t\t\t\t,0.925944\n\t\t\t\t,0.208408\n\t\t\t\t,0.163367\n\t\t\t\t,0.964302\n\t\t\t\t,-0.293651\n\t\t\t\t,0.0420359\n\t\t\t\t,0.954988\n\t\t\t\t,0.111427\n\t\t\t\t,-0.993634\n\t\t\t\t,-0.016601\n\t\t\t\t,0.19477\n\t\t\t\t,-0.796505\n\t\t\t\t,0.572403\n\t\t\t\t,0.392216\n\t\t\t\t,0.203306\n\t\t\t\t,0.897125\n\t\t\t\t,0.319004\n\t\t\t\t,0.0821197\n\t\t\t\t,0.944189\n\t\t\t\t,0.378857\n\t\t\t\t,0.158856\n\t\t\t\t,0.911719\n\t\t\t\t,0.172058\n\t\t\t\t,0.11462\n\t\t\t\t,0.978396\n\t\t\t\t,0.881763\n\t\t\t\t,0.289715\n\t\t\t\t,0.372236\n\t\t\t\t,0.705755\n\t\t\t\t,0.461539\n\t\t\t\t,0.537486\n\t\t\t\t,-1.82096e-006\n\t\t\t\t,-0.850923\n\t\t\t\t,-0.52529\n\t\t\t\t,-0.107136\n\t\t\t\t,-0.472548\n\t\t\t\t,-0.874769\n\t\t\t\t,-0.127806\n\t\t\t\t,-0.598971\n\t\t\t\t,-0.790506\n\t\t\t\t,0\n\t\t\t\t,-0.697899\n\t\t\t\t,-0.716196\n\t\t\t\t,0.000615315\n\t\t\t\t,-0.327821\n\t\t\t\t,0.94474\n\t\t\t\t,0.00142632\n\t\t\t\t,-0.386953\n\t\t\t\t,0.922098\n\t\t\t\t,-0.0019771\n\t\t\t\t,-0.0501494\n\t\t\t\t,0.99874\n\t\t\t\t,0.00798393\n\t\t\t\t,-0.516969\n\t\t\t\t,0.855967\n\t\t\t\t,2.01085e-007\n\t\t\t\t,-0.189077\n\t\t\t\t,0.981962\n\t\t\t\t,0\n\t\t\t\t,0.697899\n\t\t\t\t,0.716196\n\t\t\t\t,-0.0617016\n\t\t\t\t,0.587756\n\t\t\t\t,0.806682\n\t\t\t\t,0.00104703\n\t\t\t\t,0.054408\n\t\t\t\t,0.998518\n\t\t\t\t,-0.000520678\n\t\t\t\t,0.850923\n\t\t\t\t,0.52529\n\t\t\t\t,-0.00795704\n\t\t\t\t,0.665163\n\t\t\t\t,0.746656\n\t\t\t\t,-0.00128562\n\t\t\t\t,0.619373\n\t\t\t\t,0.785096\n\t\t\t\t,-0.00726214\n\t\t\t\t,0.469696\n\t\t\t\t,0.882798\n\t\t\t\t,-0.0455381\n\t\t\t\t,0.998943\n\t\t\t\t,0.00629\n\t\t\t\t,-0.0624906\n\t\t\t\t,0.944397\n\t\t\t\t,0.322816\n\t\t\t\t,-0.00217587\n\t\t\t\t,0.0317617\n\t\t\t\t,0.999493\n\t\t\t\t,-0.00302969\n\t\t\t\t,-0.402577\n\t\t\t\t,0.915381\n\t\t\t\t,-0.00599234\n\t\t\t\t,0.236392\n\t\t\t\t,0.971639\n\t\t\t\t,-0.0113092\n\t\t\t\t,0.651621\n\t\t\t\t,0.758461\n\t\t\t\t,-0.488554\n\t\t\t\t,0.839089\n\t\t\t\t,0.239261\n\t\t\t\t,-0.33508\n\t\t\t\t,0.930605\n\t\t\t\t,0.147293\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,-2.9565e-008\n\t\t\t\t,0.282471\n\t\t\t\t,0.959276\n\t\t\t\t,-6.80049e-007\n\t\t\t\t,-0.679163\n\t\t\t\t,0.733988\n\t\t\t\t,-0.0172031\n\t\t\t\t,-0.451674\n\t\t\t\t,0.892017\n\t\t\t\t,0.0404551\n\t\t\t\t,0.462009\n\t\t\t\t,0.885952\n\t\t\t\t,0.000615315\n\t\t\t\t,-0.327821\n\t\t\t\t,0.94474\n\t\t\t\t,0.00798393\n\t\t\t\t,-0.516969\n\t\t\t\t,0.855967\n\t\t\t\t,7.94018e-008\n\t\t\t\t,0.632296\n\t\t\t\t,0.774727\n\t\t\t\t,-0.00814254\n\t\t\t\t,0.490897\n\t\t\t\t,0.87118\n\t\t\t\t,-0.00162364\n\t\t\t\t,-0.200309\n\t\t\t\t,0.979732\n\t\t\t\t,0.000825477\n\t\t\t\t,0.411551\n\t\t\t\t,0.911386\n\t\t\t\t,-0.00302969\n\t\t\t\t,-0.402577\n\t\t\t\t,0.915381\n\t\t\t\t,-0.0401104\n\t\t\t\t,-0.412421\n\t\t\t\t,0.91011\n\t\t\t\t,0.0131114\n\t\t\t\t,0.363612\n\t\t\t\t,0.931458\n\t\t\t\t,-0.000175412\n\t\t\t\t,0.143642\n\t\t\t\t,0.98963\n\t\t\t\t,7.94018e-008\n\t\t\t\t,0.632296\n\t\t\t\t,0.774727\n\t\t\t\t,-0.00814254\n\t\t\t\t,0.490897\n\t\t\t\t,0.87118\n\t\t\t\t,0.000194233\n\t\t\t\t,0.120108\n\t\t\t\t,0.992761\n\t\t\t\t,-0.000361633\n\t\t\t\t,-0.15426\n\t\t\t\t,0.98803\n\t\t\t\t,0.00918028\n\t\t\t\t,-0.344357\n\t\t\t\t,0.938794\n\t\t\t\t,0\n\t\t\t\t,-0.873499\n\t\t\t\t,0.486826\n\t\t\t\t,-0.00751858\n\t\t\t\t,-0.95304\n\t\t\t\t,0.302751\n\t\t\t\t,0.0131114\n\t\t\t\t,0.363612\n\t\t\t\t,0.931458\n\t\t\t\t,0.000537778\n\t\t\t\t,0.0752893\n\t\t\t\t,0.997162\n\t\t\t\t,0.0593207\n\t\t\t\t,-0.344523\n\t\t\t\t,0.936902\n\t\t\t\t,0.0105074\n\t\t\t\t,-0.986739\n\t\t\t\t,0.161974\n\t\t\t\t,-0.672894\n\t\t\t\t,-0.680767\n\t\t\t\t,0.289432\n\t\t\t\t,-0.475114\n\t\t\t\t,-0.754959\n\t\t\t\t,-0.451998\n\t\t\t\t,-0.376435\n\t\t\t\t,-0.326297\n\t\t\t\t,0.86708\n\t\t\t\t,0.0535425\n\t\t\t\t,-0.97545\n\t\t\t\t,-0.213612\n\t\t\t\t,-0.886408\n\t\t\t\t,-0.41067\n\t\t\t\t,-0.213612\n\t\t\t\t,0.0535425\n\t\t\t\t,-0.97545\n\t\t\t\t,-0.213612\n\t\t\t\t,-0.672893\n\t\t\t\t,-0.680767\n\t\t\t\t,0.289432\n\t\t\t\t,-0.285178\n\t\t\t\t,-0.91373\n\t\t\t\t,0.289432\n\t\t\t\t,-0.56188\n\t\t\t\t,-0.712689\n\t\t\t\t,-0.419959\n\t\t\t\t,-0.285178\n\t\t\t\t,-0.91373\n\t\t\t\t,0.289432\n\t\t\t\t,-0.886408\n\t\t\t\t,-0.41067\n\t\t\t\t,-0.213612\n\t\t\t\t,0.0972898\n\t\t\t\t,-0.632413\n\t\t\t\t,0.768497\n\t\t\t\t,-0.285178\n\t\t\t\t,-0.91373\n\t\t\t\t,0.289432\n\t\t\t\t,-0.105228\n\t\t\t\t,0.274007\n\t\t\t\t,0.955953\n\t\t\t\t,-0.376435\n\t\t\t\t,-0.326297\n\t\t\t\t,0.86708\n\t\t\t\t,0.0369874\n\t\t\t\t,0.867758\n\t\t\t\t,0.495609\n\t\t\t\t,0.324995\n\t\t\t\t,-0.656888\n\t\t\t\t,0.68035\n\t\t\t\t,-0.291336\n\t\t\t\t,-0.0357272\n\t\t\t\t,-0.955954\n\t\t\t\t,0.311712\n\t\t\t\t,0.302371\n\t\t\t\t,-0.900781\n\t\t\t\t,-0.475114\n\t\t\t\t,-0.754959\n\t\t\t\t,-0.451998\n\t\t\t\t,0.732574\n\t\t\t\t,0.0214365\n\t\t\t\t,-0.68035\n\t\t\t\t,3.25394e-007\n\t\t\t\t,-0.890102\n\t\t\t\t,-0.455762\n\t\t\t\t,-0.0863506\n\t\t\t\t,-0.951254\n\t\t\t\t,-0.296072\n\t\t\t\t,1.17824e-009\n\t\t\t\t,-0.890103\n\t\t\t\t,-0.45576\n\t\t\t\t,0.00690505\n\t\t\t\t,-0.914366\n\t\t\t\t,-0.404829\n\t\t\t\t,0.0116145\n\t\t\t\t,-0.839481\n\t\t\t\t,-0.543265\n\t\t\t\t,0\n\t\t\t\t,-0.890101\n\t\t\t\t,-0.455762\n\t\t\t\t,-2.75443e-007\n\t\t\t\t,-0.890102\n\t\t\t\t,-0.455762\n\t\t\t\t,-0.168797\n\t\t\t\t,-0.804975\n\t\t\t\t,-0.568791\n\t\t\t\t,0.00624141\n\t\t\t\t,-0.909178\n\t\t\t\t,-0.41636\n\t\t\t\t,-0.123315\n\t\t\t\t,-0.964391\n\t\t\t\t,-0.233972\n\t\t\t\t,-2.75427e-007\n\t\t\t\t,-0.890103\n\t\t\t\t,-0.45576\n\t\t\t\t,0\n\t\t\t\t,-0.890102\n\t\t\t\t,-0.455761\n\t\t\t\t,-1.82461e-008\n\t\t\t\t,-0.890102\n\t\t\t\t,-0.455761\n\t\t\t\t,0.0104442\n\t\t\t\t,-0.822519\n\t\t\t\t,-0.568641\n\t\t\t\t,-0.109447\n\t\t\t\t,-0.835271\n\t\t\t\t,-0.538835\n\t\t\t\t,1.17824e-009\n\t\t\t\t,-0.890103\n\t\t\t\t,-0.45576\n\t\t\t\t,0.040652\n\t\t\t\t,-0.966775\n\t\t\t\t,-0.252375\n\t\t\t\t,-0.304925\n\t\t\t\t,-0.936453\n\t\t\t\t,0.173426\n\t\t\t\t,0.0181537\n\t\t\t\t,-0.729273\n\t\t\t\t,-0.683981\n\t\t\t\t,-0.349899\n\t\t\t\t,-0.414959\n\t\t\t\t,-0.839869\n\t\t\t\t,0.04185\n\t\t\t\t,-0.96887\n\t\t\t\t,-0.244008\n\t\t\t\t,-0.311185\n\t\t\t\t,-0.928639\n\t\t\t\t,0.201975\n\t\t\t\t,0.0185824\n\t\t\t\t,-0.734402\n\t\t\t\t,-0.678461\n\t\t\t\t,-0.34084\n\t\t\t\t,-0.450125\n\t\t\t\t,-0.825358\n\t\t\t\t,0.0404774\n\t\t\t\t,-0.993827\n\t\t\t\t,-0.103298\n\t\t\t\t,-0.344309\n\t\t\t\t,-0.728213\n\t\t\t\t,0.592586\n\t\t\t\t,-0.00409827\n\t\t\t\t,-0.615558\n\t\t\t\t,-0.788081\n\t\t\t\t,-0.387176\n\t\t\t\t,0.113164\n\t\t\t\t,-0.915035\n\t\t\t\t,0.0404289\n\t\t\t\t,-0.994156\n\t\t\t\t,-0.1001\n\t\t\t\t,-0.341395\n\t\t\t\t,-0.727121\n\t\t\t\t,0.595604\n\t\t\t\t,-0.00444181\n\t\t\t\t,-0.614254\n\t\t\t\t,-0.789096\n\t\t\t\t,-0.393499\n\t\t\t\t,0.105326\n\t\t\t\t,-0.913272\n\t\t\t\t,0.015518\n\t\t\t\t,-0.999853\n\t\t\t\t,-0.00722333\n\t\t\t\t,-0.17509\n\t\t\t\t,-0.542238\n\t\t\t\t,0.82178\n\t\t\t\t,-0.00854593\n\t\t\t\t,-0.544748\n\t\t\t\t,-0.838556\n\t\t\t\t,-0.190125\n\t\t\t\t,0.437889\n\t\t\t\t,-0.878696\n\t\t\t\t,0.0161542\n\t\t\t\t,-0.999828\n\t\t\t\t,-0.00908857\n\t\t\t\t,-0.180732\n\t\t\t\t,-0.544578\n\t\t\t\t,0.819006\n\t\t\t\t,-0.00849429\n\t\t\t\t,-0.544115\n\t\t\t\t,-0.838967\n\t\t\t\t,-0.18337\n\t\t\t\t,0.442853\n\t\t\t\t,-0.877643\n\t\t\t\t,0.00906452\n\t\t\t\t,-0.999825\n\t\t\t\t,0.0163918\n\t\t\t\t,-0.032635\n\t\t\t\t,-0.500829\n\t\t\t\t,0.864931\n\t\t\t\t,-0.00552109\n\t\t\t\t,-0.530208\n\t\t\t\t,-0.84785\n\t\t\t\t,-0.03277\n\t\t\t\t,0.497754\n\t\t\t\t,-0.866699\n\t\t\t\t,0.0090701\n\t\t\t\t,-0.999827\n\t\t\t\t,0.0162688\n\t\t\t\t,-0.0326919\n\t\t\t\t,-0.500851\n\t\t\t\t,0.864916\n\t\t\t\t,-0.00552397\n\t\t\t\t,-0.530051\n\t\t\t\t,-0.847948\n\t\t\t\t,-0.0327124\n\t\t\t\t,0.497741\n\t\t\t\t,-0.866709\n\t\t\t\t,0.998516\n\t\t\t\t,0.0471658\n\t\t\t\t,0.0272091\n\t\t\t\t,0.999425\n\t\t\t\t,0.000542307\n\t\t\t\t,0.0338938\n\t\t\t\t,1\n\t\t\t\t,-3.47459e-006\n\t\t\t\t,3.95426e-006\n\t\t\t\t,1\n\t\t\t\t,4.00763e-006\n\t\t\t\t,3.47594e-006\n\t\t\t\t,0.999829\n\t\t\t\t,0.0156802\n\t\t\t\t,-0.00980156\n\t\t\t\t,1\n\t\t\t\t,4.09259e-007\n\t\t\t\t,-4.85469e-008\n\t\t\t\t,0.998513\n\t\t\t\t,0.0472193\n\t\t\t\t,0.0272484\n\t\t\t\t,1\n\t\t\t\t,-8.26804e-006\n\t\t\t\t,6.82152e-006\n\t\t\t\t,0.998513\n\t\t\t\t,0.0472269\n\t\t\t\t,0.0272353\n\t\t\t\t,0.999425\n\t\t\t\t,0.000539847\n\t\t\t\t,0.0339153\n\t\t\t\t,1\n\t\t\t\t,5.50938e-009\n\t\t\t\t,-1.44051e-006\n\t\t\t\t,1\n\t\t\t\t,-5.76883e-007\n\t\t\t\t,-1.60287e-005\n\t\t\t\t,0.999829\n\t\t\t\t,0.0156811\n\t\t\t\t,-0.00980176\n\t\t\t\t,1\n\t\t\t\t,2.13668e-006\n\t\t\t\t,-2.54018e-006\n\t\t\t\t,0.998516\n\t\t\t\t,0.0471719\n\t\t\t\t,0.0271987\n\t\t\t\t,1\n\t\t\t\t,6.95132e-006\n\t\t\t\t,-5.26506e-006\n\t\t\t\t,0.393391\n\t\t\t\t,-0.919077\n\t\t\t\t,0.0232481\n\t\t\t\t,-1.83034e-007\n\t\t\t\t,-0.829012\n\t\t\t\t,-0.559231\n\t\t\t\t,0.000220812\n\t\t\t\t,-0.829085\n\t\t\t\t,-0.559123\n\t\t\t\t,-0.807892\n\t\t\t\t,-0.556235\n\t\t\t\t,-0.194712\n\t\t\t\t,8.77812e-007\n\t\t\t\t,-0.829012\n\t\t\t\t,-0.559231\n\t\t\t\t,0.0803752\n\t\t\t\t,-0.40223\n\t\t\t\t,-0.912004\n\t\t\t\t,-0.0445055\n\t\t\t\t,-0.543124\n\t\t\t\t,-0.838472\n\t\t\t\t,-0.000593272\n\t\t\t\t,-0.00383836\n\t\t\t\t,0.999992\n\t\t\t\t,-0.398332\n\t\t\t\t,0.128825\n\t\t\t\t,0.90815\n\t\t\t\t,1.41473e-012\n\t\t\t\t,0.000739273\n\t\t\t\t,1\n\t\t\t\t,-0.781174\n\t\t\t\t,-0.383447\n\t\t\t\t,0.492681\n\t\t\t\t,0.362492\n\t\t\t\t,-0.40771\n\t\t\t\t,0.838076\n\t\t\t\t,2.65289e-010\n\t\t\t\t,-0.00514831\n\t\t\t\t,0.999987\n\t\t\t\t,0.001821\n\t\t\t\t,-0.0031858\n\t\t\t\t,0.999993\n\t\t\t\t,0.527237\n\t\t\t\t,0.347746\n\t\t\t\t,0.775303\n\t\t\t\t,-0.132834\n\t\t\t\t,-0.323941\n\t\t\t\t,-0.936706\n\t\t\t\t,-0.527237\n\t\t\t\t,-0.347746\n\t\t\t\t,-0.775303\n\t\t\t\t,-0.001821\n\t\t\t\t,-0.00294378\n\t\t\t\t,-0.999994\n\t\t\t\t,2.97972e-010\n\t\t\t\t,-0.00735275\n\t\t\t\t,-0.999973\n\t\t\t\t,9.89358e-005\n\t\t\t\t,-0.00620474\n\t\t\t\t,-0.999981\n\t\t\t\t,0.0803752\n\t\t\t\t,-0.40223\n\t\t\t\t,-0.912004\n\t\t\t\t,-0.0445055\n\t\t\t\t,-0.543124\n\t\t\t\t,-0.838472\n\t\t\t\t,0.396257\n\t\t\t\t,-0.135158\n\t\t\t\t,-0.908137\n\t\t\t\t,0.154807\n\t\t\t\t,-0.491034\n\t\t\t\t,-0.857275\n\t\t\t\t,-1.41488e-012\n\t\t\t\t,-0.000739274\n\t\t\t\t,-1\n\t\t\t\t,0.263692\n\t\t\t\t,0.600075\n\t\t\t\t,-0.755233\n\t\t\t\t,0.000702887\n\t\t\t\t,0.603758\n\t\t\t\t,-0.797167\n\t\t\t\t,-0.219571\n\t\t\t\t,-0.20272\n\t\t\t\t,0.954303\n\t\t\t\t,-0.475755\n\t\t\t\t,-0.408177\n\t\t\t\t,0.779134\n\t\t\t\t,0.418559\n\t\t\t\t,0.483629\n\t\t\t\t,0.768707\n\t\t\t\t,0.000141242\n\t\t\t\t,-1\n\t\t\t\t,0\n\t\t\t\t,0.129952\n\t\t\t\t,-0.810207\n\t\t\t\t,-0.571557\n\t\t\t\t,-0.00105827\n\t\t\t\t,-0.447213\n\t\t\t\t,-0.894427\n\t\t\t\t,-0.014956\n\t\t\t\t,-0.99932\n\t\t\t\t,0.0336964\n\t\t\t\t,0.366401\n\t\t\t\t,-0.81369\n\t\t\t\t,-0.451286\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,0.201662\n\t\t\t\t,-0.954245\n\t\t\t\t,-0.220793\n\t\t\t\t,0.475756\n\t\t\t\t,0.408175\n\t\t\t\t,-0.779134\n\t\t\t\t,-0.389556\n\t\t\t\t,-0.622092\n\t\t\t\t,-0.679152\n\t\t\t\t,0.389557\n\t\t\t\t,0.622091\n\t\t\t\t,0.679152\n\t\t\t\t,-0.272343\n\t\t\t\t,-0.093852\n\t\t\t\t,-0.957612\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,-0.418558\n\t\t\t\t,-0.48363\n\t\t\t\t,-0.768707\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,-0.738592\n\t\t\t\t,0.346601\n\t\t\t\t,0.578229\n\t\t\t\t,0.385401\n\t\t\t\t,-0.327366\n\t\t\t\t,0.862727\n\t\t\t\t,0.845857\n\t\t\t\t,-0.0583779\n\t\t\t\t,0.530205\n\t\t\t\t,0.296539\n\t\t\t\t,0.215382\n\t\t\t\t,-0.930417\n\t\t\t\t,0.738592\n\t\t\t\t,-0.346601\n\t\t\t\t,-0.578229\n\t\t\t\t,-0.845857\n\t\t\t\t,0.0583779\n\t\t\t\t,-0.530205\n\t\t\t\t,-0.640768\n\t\t\t\t,-0.299025\n\t\t\t\t,-0.707107\n\t\t\t\t,0\n\t\t\t\t,-0.603758\n\t\t\t\t,0.797167\n\t\t\t\t,0.230636\n\t\t\t\t,-0.720758\n\t\t\t\t,0.653694\n\t\t\t\t,0.00253074\n\t\t\t\t,-0.963808\n\t\t\t\t,0.266584\n\t\t\t\t,0.354936\n\t\t\t\t,-0.861714\n\t\t\t\t,0.362586\n\t\t\t\t,-0.181859\n\t\t\t\t,-0.967686\n\t\t\t\t,-0.174673\n\t\t\t\t,0.595518\n\t\t\t\t,-0.762192\n\t\t\t\t,0.253815\n\t\t\t\t,-0.22853\n\t\t\t\t,-0.962172\n\t\t\t\t,-0.148325\n\t\t\t\t,0.245964\n\t\t\t\t,-0.750116\n\t\t\t\t,0.613863\n\t\t\t\t,0.963109\n\t\t\t\t,-0.144553\n\t\t\t\t,-0.22699\n\t\t\t\t,1\n\t\t\t\t,-9.3897e-007\n\t\t\t\t,4.36815e-014\n\t\t\t\t,0.928935\n\t\t\t\t,0.07418\n\t\t\t\t,-0.362737\n\t\t\t\t,1\n\t\t\t\t,0\n\t\t\t\t,0\n\t\t\t\t,1\n\t\t\t\t,0\n\t\t\t\t,0\n\t\t\t\t,0.927586\n\t\t\t\t,-0.365025\n\t\t\t\t,-0.0796323\n\t\t\t\t,0.963372\n\t\t\t\t,-0.223657\n\t\t\t\t,0.147957\n\t\t\t\t,1\n\t\t\t\t,0\n\t\t\t\t,0\n\t\t\t\t,1\n\t\t\t\t,0\n\t\t\t\t,0\n\t\t\t\t,0.928935\n\t\t\t\t,-0.074178\n\t\t\t\t,0.362736\n\t\t\t\t,0.96311\n\t\t\t\t,0.144551\n\t\t\t\t,0.226991\n\t\t\t\t,1\n\t\t\t\t,0\n\t\t\t\t,0\n\t\t\t\t,1\n\t\t\t\t,0\n\t\t\t\t,-9.36472e-007\n\t\t\t\t,1\n\t\t\t\t,0\n\t\t\t\t,0\n\t\t\t\t,0.96311\n\t\t\t\t,0.144551\n\t\t\t\t,0.226991\n\t\t\t\t,0.927586\n\t\t\t\t,0.365025\n\t\t\t\t,0.0796346\n\t\t\t\t,0.963372\n\t\t\t\t,0.223658\n\t\t\t\t,-0.147957\n\t\t\t\t,1\n\t\t\t\t,-3.29295e-006\n\t\t\t\t,-3.32983e-006\n\t\t\t\t,0.948254\n\t\t\t\t,-0.0596413\n\t\t\t\t,-0.311861\n\t\t\t\t,0.948962\n\t\t\t\t,-0.25913\n\t\t\t\t,-0.179785\n\t\t\t\t,0.949292\n\t\t\t\t,-0.308453\n\t\t\t\t,0.060834\n\t\t\t\t,0.948625\n\t\t\t\t,-0.173557\n\t\t\t\t,0.264553\n\t\t\t\t,0.948255\n\t\t\t\t,0.0596406\n\t\t\t\t,0.311857\n\t\t\t\t,0.948962\n\t\t\t\t,0.259129\n\t\t\t\t,0.179788\n\t\t\t\t,0.948962\n\t\t\t\t,0.259129\n\t\t\t\t,0.179788\n\t\t\t\t,0.949292\n\t\t\t\t,0.308453\n\t\t\t\t,-0.0608337\n\t\t\t\t,0.948625\n\t\t\t\t,0.173558\n\t\t\t\t,-0.264552\n\t\t\t\t,1\n\t\t\t\t,-2.86939e-007\n\t\t\t\t,1.84105e-006\n\t\t\t\t,1\n\t\t\t\t,6.74446e-008\n\t\t\t\t,-7.07443e-007\n\t\t\t\t,1\n\t\t\t\t,7.07158e-007\n\t\t\t\t,-1.7732e-007\n\t\t\t\t,1\n\t\t\t\t,2.20451e-007\n\t\t\t\t,-6.37293e-007\n\t\t\t\t,1\n\t\t\t\t,-2.93254e-007\n\t\t\t\t,-5.98204e-007\n\t\t\t\t,1\n\t\t\t\t,-4.79302e-007\n\t\t\t\t,-6.61036e-007\n\t\t\t\t,0.949292\n\t\t\t\t,0.308453\n\t\t\t\t,-0.0608337\n\t\t\t\t,0.948962\n\t\t\t\t,0.259129\n\t\t\t\t,0.179788\n\t\t\t\t,1\n\t\t\t\t,-4.79302e-007\n\t\t\t\t,-6.61036e-007\n\t\t\t\t,1\n\t\t\t\t,-2.49716e-007\n\t\t\t\t,2.80182e-007\n\t\t\t\t,1\n\t\t\t\t,-4.79302e-007\n\t\t\t\t,-6.61036e-007\n\t\t\t\t,1\n\t\t\t\t,2.77065e-007\n\t\t\t\t,4.66115e-007\n\t\t\t\t,-0.596285\n\t\t\t\t,-0.745356\n\t\t\t\t,0.298142\n\t\t\t\t,0.182574\n\t\t\t\t,-0.912871\n\t\t\t\t,-0.365148\n\t\t\t\t,0.182574\n\t\t\t\t,-0.912871\n\t\t\t\t,0.365148\n\t\t\t\t,-0.596285\n\t\t\t\t,-0.745356\n\t\t\t\t,-0.298142\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,-0.182574\n\t\t\t\t,-0.912871\n\t\t\t\t,-0.365148\n\t\t\t\t,0.596285\n\t\t\t\t,-0.745356\n\t\t\t\t,0.298142\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,-0.596285\n\t\t\t\t,-0.745356\n\t\t\t\t,0.298142\n\t\t\t\t,0.182574\n\t\t\t\t,-0.912871\n\t\t\t\t,-0.365148\n\t\t\t\t,0.182574\n\t\t\t\t,-0.912871\n\t\t\t\t,0.365148\n\t\t\t\t,-0.596285\n\t\t\t\t,-0.745356\n\t\t\t\t,-0.298142\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,-0.182574\n\t\t\t\t,-0.912871\n\t\t\t\t,-0.365148\n\t\t\t\t,0.596285\n\t\t\t\t,-0.745356\n\t\t\t\t,0.298142\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,-0.182574\n\t\t\t\t,-0.912871\n\t\t\t\t,0.365148\n\t\t\t\t,-0.182574\n\t\t\t\t,-0.912871\n\t\t\t\t,-0.365148\n\t\t\t\t,0.596285\n\t\t\t\t,-0.745356\n\t\t\t\t,0.298142\n\t\t\t\t,0.596285\n\t\t\t\t,-0.745356\n\t\t\t\t,-0.298142\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,0.182574\n\t\t\t\t,-0.912871\n\t\t\t\t,-0.365148\n\t\t\t\t,-0.596285\n\t\t\t\t,-0.745356\n\t\t\t\t,0.298142\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,-0.182574\n\t\t\t\t,-0.912871\n\t\t\t\t,0.365148\n\t\t\t\t,-0.182574\n\t\t\t\t,-0.912871\n\t\t\t\t,-0.365148\n\t\t\t\t,0.596285\n\t\t\t\t,-0.745356\n\t\t\t\t,0.298142\n\t\t\t\t,0.596285\n\t\t\t\t,-0.745356\n\t\t\t\t,-0.298142\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,0.182574\n\t\t\t\t,-0.912871\n\t\t\t\t,-0.365148\n\t\t\t\t,-0.596285\n\t\t\t\t,-0.745356\n\t\t\t\t,0.298142\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,0.182574\n\t\t\t\t,-0.912871\n\t\t\t\t,-0.365148\n\t\t\t\t,0.182574\n\t\t\t\t,-0.912871\n\t\t\t\t,0.365148\n\t\t\t\t,-0.596285\n\t\t\t\t,-0.745356\n\t\t\t\t,-0.298142\n\t\t\t\t,-0.596285\n\t\t\t\t,-0.745356\n\t\t\t\t,0.298142\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,-0.182574\n\t\t\t\t,-0.912871\n\t\t\t\t,0.365148\n\t\t\t\t,0.596285\n\t\t\t\t,-0.745356\n\t\t\t\t,-0.298142\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,0.596285\n\t\t\t\t,-0.745356\n\t\t\t\t,-0.298142\n\t\t\t\t,-0.182574\n\t\t\t\t,-0.912871\n\t\t\t\t,0.365148\n\t\t\t\t,-0.182574\n\t\t\t\t,-0.912871\n\t\t\t\t,-0.365148\n\t\t\t\t,0.596285\n\t\t\t\t,-0.745356\n\t\t\t\t,0.298142\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,0.182574\n\t\t\t\t,-0.912871\n\t\t\t\t,0.365148\n\t\t\t\t,-0.596285\n\t\t\t\t,-0.745356\n\t\t\t\t,-0.298142\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,\"NaN\"\n\t\t\t\t,-0.520796\n\t\t\t\t,-0.853672\n\t\t\t\t,0.00404836\n\t\t\t\t,-0.476481\n\t\t\t\t,-0.878954\n\t\t\t\t,0.0201464\n\t\t\t\t,0\n\t\t\t\t,-1\n\t\t\t\t,1.14416e-009\n\t\t\t\t,-0.519065\n\t\t\t\t,-0.854735\n\t\t\t\t,2.56596e-007\n\t\t\t\t,0\n\t\t\t\t,-1\n\t\t\t\t,-4.62625e-009\n\t\t\t\t,-0.365282\n\t\t\t\t,-0.930839\n\t\t\t\t,0.0103676\n\t\t\t\t,0.116762\n\t\t\t\t,-0.993155\n\t\t\t\t,0.00323129\n\t\t\t\t,0.890936\n\t\t\t\t,-0.454129\n\t\t\t\t,0\n\t\t\t\t,0.854508\n\t\t\t\t,-0.510715\n\t\t\t\t,0.0948013\n\t\t\t\t,-0.266828\n\t\t\t\t,-0.963196\n\t\t\t\t,0.0325057\n\t\t\t\t,-0.890935\n\t\t\t\t,-0.45413\n\t\t\t\t,0\n\t\t\t\t,-0.854507\n\t\t\t\t,-0.510716\n\t\t\t\t,0.0948016\n\t\t\t\t,-0.368066\n\t\t\t\t,-0.929692\n\t\t\t\t,0.0141346\n\t\t\t\t,-0.388404\n\t\t\t\t,-0.921335\n\t\t\t\t,0.0168349\n\t\t\t\t,0.0592994\n\t\t\t\t,-0.998238\n\t\t\t\t,-0.00218043\n\t\t\t\t,0.731654\n\t\t\t\t,-0.667192\n\t\t\t\t,0.139776\n\t\t\t\t,-0.731652\n\t\t\t\t,-0.667193\n\t\t\t\t,0.139777\n\t\t\t\t,-0.191517\n\t\t\t\t,-0.981488\n\t\t\t\t,0.00173176\n\t\t\t\t,-0.159762\n\t\t\t\t,-0.987149\n\t\t\t\t,0.00365074\n\t\t\t\t,0.458106\n\t\t\t\t,-0.881751\n\t\t\t\t,0.112488\n\t\t\t\t,-0.143094\n\t\t\t\t,-0.989153\n\t\t\t\t,0.0331614\n\t\t\t\t,-0.458105\n\t\t\t\t,-0.881752\n\t\t\t\t,0.112488\n\t\t\t\t,0.040661\n\t\t\t\t,-0.999173\n\t\t\t\t,0.000383196\n\t\t\t\t,5.4999e-008\n\t\t\t\t,-1\n\t\t\t\t,9.1843e-008\n\t\t\t\t,-0.0335746\n\t\t\t\t,-0.99943\n\t\t\t\t,-0.00349338\n\t\t\t\t,0.0552981\n\t\t\t\t,-0.998072\n\t\t\t\t,-0.0281866\n\t\t\t\t,-0.0552977\n\t\t\t\t,-0.998072\n\t\t\t\t,-0.0281865\n\t\t\t\t,0.25881\n\t\t\t\t,-0.965914\n\t\t\t\t,-0.00523883\n\t\t\t\t,0.159762\n\t\t\t\t,-0.987149\n\t\t\t\t,-0.00365109\n\t\t\t\t,-0.414343\n\t\t\t\t,-0.898711\n\t\t\t\t,-0.143659\n\t\t\t\t,0.060247\n\t\t\t\t,-0.998136\n\t\t\t\t,-0.00976635\n\t\t\t\t,0.414342\n\t\t\t\t,-0.898712\n\t\t\t\t,-0.143659\n\t\t\t\t,0.411755\n\t\t\t\t,-0.911106\n\t\t\t\t,-0.0185516\n\t\t\t\t,0.388405\n\t\t\t\t,-0.921335\n\t\t\t\t,-0.016835\n\t\t\t\t,-0.106499\n\t\t\t\t,-0.99431\n\t\t\t\t,-0.00245046\n\t\t\t\t,-0.709307\n\t\t\t\t,-0.683536\n\t\t\t\t,-0.172229\n\t\t\t\t,0.709305\n\t\t\t\t,-0.683537\n\t\t\t\t,-0.17223\n\t\t\t\t,0.49868\n\t\t\t\t,-0.866619\n\t\t\t\t,-0.0170534\n\t\t\t\t,0.365281\n\t\t\t\t,-0.930839\n\t\t\t\t,-0.0103672\n\t\t\t\t,-0.879127\n\t\t\t\t,-0.4761\n\t\t\t\t,0.021558\n\t\t\t\t,0.226305\n\t\t\t\t,-0.972273\n\t\t\t\t,-0.0589092\n\t\t\t\t,0.852956\n\t\t\t\t,-0.512218\n\t\t\t\t,-0.100492\n\t\t\t\t,0.520794\n\t\t\t\t,-0.853673\n\t\t\t\t,0.00404818\n\t\t\t\t,0.519065\n\t\t\t\t,-0.854735\n\t\t\t\t,-2.48577e-007\n\t\t\t\t,-0.116763\n\t\t\t\t,-0.993155\n\t\t\t\t,0.00322929\n\t\t\t\t,-0.890936\n\t\t\t\t,-0.454128\n\t\t\t\t,0\n\t\t\t\t,0.890936\n\t\t\t\t,-0.45413\n\t\t\t\t,0\n\t\t\t\t,0.476495\n\t\t\t\t,-0.878946\n\t\t\t\t,0.0201482\n\t\t\t\t,0.365281\n\t\t\t\t,-0.930839\n\t\t\t\t,0.0103676\n\t\t\t\t,-0.879612\n\t\t\t\t,-0.475048\n\t\t\t\t,-0.0247439\n\t\t\t\t,0.266837\n\t\t\t\t,-0.963193\n\t\t\t\t,0.0325029\n\t\t\t\t,0.854507\n\t\t\t\t,-0.510716\n\t\t\t\t,0.0948013\n\t\t\t\t,0.368074\n\t\t\t\t,-0.929689\n\t\t\t\t,0.0141381\n\t\t\t\t,0.388404\n\t\t\t\t,-0.921335\n\t\t\t\t,0.0168355\n\t\t\t\t,-0.0592934\n\t\t\t\t,-0.998238\n\t\t\t\t,-0.00217865\n\t\t\t\t,-0.731654\n\t\t\t\t,-0.667192\n\t\t\t\t,0.139776\n\t\t\t\t,0.731653\n\t\t\t\t,-0.667193\n\t\t\t\t,0.139777\n\t\t\t\t,0.191517\n\t\t\t\t,-0.981488\n\t\t\t\t,0.00173255\n\t\t\t\t,0.159762\n\t\t\t\t,-0.987149\n\t\t\t\t,0.00365091\n\t\t\t\t,-0.458107\n\t\t\t\t,-0.881751\n\t\t\t\t,0.112488\n\t\t\t\t,0.143098\n\t\t\t\t,-0.989153\n\t\t\t\t,0.0331639\n\t\t\t\t,0.458106\n\t\t\t\t,-0.881751\n\t\t\t\t,0.112488\n\t\t\t\t,-0.0406632\n\t\t\t\t,-0.999173\n\t\t\t\t,0.000382581\n\t\t\t\t,-8.49014e-008\n\t\t\t\t,-1\n\t\t\t\t,1.38832e-007\n\t\t\t\t,0.0335735\n\t\t\t\t,-0.99943\n\t\t\t\t,-0.00349352\n\t\t\t\t,-0.0552983\n\t\t\t\t,-0.998072\n\t\t\t\t,-0.0281867\n\t\t\t\t,0.0552979\n\t\t\t\t,-0.998072\n\t\t\t\t,-0.0281866\n\t\t\t\t,-0.258806\n\t\t\t\t,-0.965915\n\t\t\t\t,-0.00524031\n\t\t\t\t,-0.159762\n\t\t\t\t,-0.987149\n\t\t\t\t,-0.00365109\n\t\t\t\t,0.414343\n\t\t\t\t,-0.898711\n\t\t\t\t,-0.143658\n\t\t\t\t,-0.0602461\n\t\t\t\t,-0.998136\n\t\t\t\t,-0.00976731\n\t\t\t\t,-0.414342\n\t\t\t\t,-0.898712\n\t\t\t\t,-0.143658\n\t\t\t\t,-0.411744\n\t\t\t\t,-0.911111\n\t\t\t\t,-0.0185533\n\t\t\t\t,-0.388404\n\t\t\t\t,-0.921335\n\t\t\t\t,-0.0168355\n\t\t\t\t,0.106503\n\t\t\t\t,-0.994309\n\t\t\t\t,-0.00245155\n\t\t\t\t,0.709306\n\t\t\t\t,-0.683536\n\t\t\t\t,-0.17223\n\t\t\t\t,-0.709305\n\t\t\t\t,-0.683538\n\t\t\t\t,-0.17223\n\t\t\t\t,-0.498675\n\t\t\t\t,-0.866621\n\t\t\t\t,-0.0170543\n\t\t\t\t,-0.365281\n\t\t\t\t,-0.930839\n\t\t\t\t,-0.0103677\n\t\t\t\t,0.852957\n\t\t\t\t,-0.512216\n\t\t\t\t,-0.100491\n\t\t\t\t,-0.22629\n\t\t\t\t,-0.972277\n\t\t\t\t,-0.0589033\n\t\t\t\t,-0.852956\n\t\t\t\t,-0.512218\n\t\t\t\t,-0.100491\n\t\t\t\t,-0.890936\n\t\t\t\t,0.454129\n\t\t\t\t,0\n\t\t\t\t,-1\n\t\t\t\t,-1.04893e-007\n\t\t\t\t,0\n\t\t\t\t,-0.890844\n\t\t\t\t,0.425036\n\t\t\t\t,0.160445\n\t\t\t\t,-1\n\t\t\t\t,-6.29359e-008\n\t\t\t\t,-1.06391e-007\n\t\t\t\t,-1\n\t\t\t\t,-1.04893e-007\n\t\t\t\t,0\n\t\t\t\t,-0.890935\n\t\t\t\t,-0.45413\n\t\t\t\t,0\n\t\t\t\t,-0.890843\n\t\t\t\t,-0.425037\n\t\t\t\t,-0.160445\n\t\t\t\t,-1\n\t\t\t\t,-6.29359e-008\n\t\t\t\t,-1.06391e-007\n\t\t\t\t,-0.890844\n\t\t\t\t,0.425036\n\t\t\t\t,0.160445\n\t\t\t\t,-1\n\t\t\t\t,-6.29359e-008\n\t\t\t\t,-1.06391e-007\n\t\t\t\t,-0.99997\n\t\t\t\t,0.0054818\n\t\t\t\t,-0.00548193\n\t\t\t\t,-0.890936\n\t\t\t\t,0.321118\n\t\t\t\t,0.321118\n\t\t\t\t,-1\n\t\t\t\t,-6.29359e-008\n\t\t\t\t,-1.06391e-007\n\t\t\t\t,-0.890843\n\t\t\t\t,-0.425037\n\t\t\t\t,-0.160445\n\t\t\t\t,-0.99997\n\t\t\t\t,0.0054818\n\t\t\t\t,-0.00548193\n\t\t\t\t,-0.890935\n\t\t\t\t,-0.321118\n\t\t\t\t,-0.321119\n\t\t\t\t,-0.890936\n\t\t\t\t,0.321118\n\t\t\t\t,0.321118\n\t\t\t\t,-0.99997\n\t\t\t\t,0.0054818\n\t\t\t\t,-0.00548193\n\t\t\t\t,-0.890844\n\t\t\t\t,0.187094\n\t\t\t\t,0.413997\n\t\t\t\t,-1\n\t\t\t\t,1.49846e-008\n\t\t\t\t,-1.16881e-007\n\t\t\t\t,-0.99997\n\t\t\t\t,0.0054818\n\t\t\t\t,-0.00548193\n\t\t\t\t,-0.890935\n\t\t\t\t,-0.321118\n\t\t\t\t,-0.321119\n\t\t\t\t,-0.890843\n\t\t\t\t,-0.187095\n\t\t\t\t,-0.413998\n\t\t\t\t,-1\n\t\t\t\t,1.49846e-008\n\t\t\t\t,-1.16881e-007\n\t\t\t\t,-0.890844\n\t\t\t\t,0.187094\n\t\t\t\t,0.413997\n\t\t\t\t,-1\n\t\t\t\t,1.49846e-008\n\t\t\t\t,-1.16881e-007\n\t\t\t\t,-0.99997\n\t\t\t\t,0.00775251\n\t\t\t\t,-1.0489e-007\n\t\t\t\t,-0.890936\n\t\t\t\t,0\n\t\t\t\t,0.454129\n\t\t\t\t,-1\n\t\t\t\t,1.49846e-008\n\t\t\t\t,-1.16881e-007\n\t\t\t\t,-0.890843\n\t\t\t\t,-0.187095\n\t\t\t\t,-0.413998\n\t\t\t\t,-0.99997\n\t\t\t\t,0.00775251\n\t\t\t\t,-1.0489e-007\n\t\t\t\t,-0.890935\n\t\t\t\t,0\n\t\t\t\t,-0.45413\n\t\t\t\t,-0.890936\n\t\t\t\t,0\n\t\t\t\t,0.454129\n\t\t\t\t,-0.99997\n\t\t\t\t,0.00775251\n\t\t\t\t,-1.0489e-007\n\t\t\t\t,-0.890844\n\t\t\t\t,-0.160445\n\t\t\t\t,0.425036\n\t\t\t\t,-1\n\t\t\t\t,2.27767e-007\n\t\t\t\t,-1.49849e-008\n\t\t\t\t,-0.99997\n\t\t\t\t,0.00775251\n\t\t\t\t,-1.0489e-007\n\t\t\t\t,-0.890935\n\t\t\t\t,0\n\t\t\t\t,-0.45413\n\t\t\t\t,-0.890843\n\t\t\t\t,0.160445\n\t\t\t\t,-0.425037\n\t\t\t\t,-1\n\t\t\t\t,2.27767e-007\n\t\t\t\t,-1.49849e-008\n\t\t\t\t,-0.890844\n\t\t\t\t,-0.160445\n\t\t\t\t,0.425036\n\t\t\t\t,-1\n\t\t\t\t,2.27767e-007\n\t\t\t\t,-1.49849e-008\n\t\t\t\t,-0.99997\n\t\t\t\t,0.00548196\n\t\t\t\t,0.00548181\n\t\t\t\t,-0.890936\n\t\t\t\t,-0.321117\n\t\t\t\t,0.321117\n\t\t\t\t,-1\n\t\t\t\t,2.27767e-007\n\t\t\t\t,-1.49849e-008\n\t\t\t\t,-0.890843\n\t\t\t\t,0.160445\n\t\t\t\t,-0.425037\n\t\t\t\t,-0.99997\n\t\t\t\t,0.00548196\n\t\t\t\t,0.00548181\n\t\t\t\t,-0.890936\n\t\t\t\t,0.321118\n\t\t\t\t,-0.321118\n\t\t\t\t,-0.890936\n\t\t\t\t,-0.321117\n\t\t\t\t,0.321117\n\t\t\t\t,-0.99997\n\t\t\t\t,0.00548196\n\t\t\t\t,0.00548181\n\t\t\t\t,-0.879127\n\t\t\t\t,-0.4761\n\t\t\t\t,0.021558\n\t\t\t\t,-1\n\t\t\t\t,7.49234e-008\n\t\t\t\t,-8.99079e-008\n\t\t\t\t,-0.99997\n\t\t\t\t,0.00548196\n\t\t\t\t,0.00548181\n\t\t\t\t,-0.890936\n\t\t\t\t,0.321118\n\t\t\t\t,-0.321118\n\t\t\t\t,-0.890843\n\t\t\t\t,0.413998\n\t\t\t\t,-0.187094\n\t\t\t\t,-1\n\t\t\t\t,7.49234e-008\n\t\t\t\t,-8.99079e-008\n\t\t\t\t,-0.879127\n\t\t\t\t,-0.4761\n\t\t\t\t,0.021558\n\t\t\t\t,-1\n\t\t\t\t,7.49234e-008\n\t\t\t\t,-8.99079e-008\n\t\t\t\t,-0.99997\n\t\t\t\t,1.0489e-007\n\t\t\t\t,0.00775245\n\t\t\t\t,-0.890936\n\t\t\t\t,-0.454128\n\t\t\t\t,0\n\t\t\t\t,-1\n\t\t\t\t,7.49234e-008\n\t\t\t\t,-8.99079e-008\n\t\t\t\t,-0.890843\n\t\t\t\t,0.413998\n\t\t\t\t,-0.187094\n\t\t\t\t,-0.99997\n\t\t\t\t,1.0489e-007\n\t\t\t\t,0.00775245\n\t\t\t\t,-0.890936\n\t\t\t\t,0.45413\n\t\t\t\t,0\n\t\t\t\t,-0.890936\n\t\t\t\t,-0.454128\n\t\t\t\t,0\n\t\t\t\t,-0.99997\n\t\t\t\t,1.0489e-007\n\t\t\t\t,0.00775245\n\t\t\t\t,-0.879612\n\t\t\t\t,-0.475048\n\t\t\t\t,-0.0247439\n\t\t\t\t,-1\n\t\t\t\t,7.19265e-008\n\t\t\t\t,9.29048e-008\n\t\t\t\t,-0.99997\n\t\t\t\t,1.0489e-007\n\t\t\t\t,0.00775245\n\t\t\t\t,-0.890936\n\t\t\t\t,0.45413\n\t\t\t\t,0\n\t\t\t\t,-0.890843\n\t\t\t\t,0.425037\n\t\t\t\t,0.160445\n\t\t\t\t,-1\n\t\t\t\t,7.19265e-008\n\t\t\t\t,9.29048e-008\n\t\t\t\t,-0.879612\n\t\t\t\t,-0.475048\n\t\t\t\t,-0.0247439\n\t\t\t\t,-1\n\t\t\t\t,7.19265e-008\n\t\t\t\t,9.29048e-008\n\t\t\t\t,-0.99997\n\t\t\t\t,-0.00548177\n\t\t\t\t,0.00548192\n\t\t\t\t,-0.890936\n\t\t\t\t,-0.321117\n\t\t\t\t,-0.321117\n\t\t\t\t,-1\n\t\t\t\t,7.19265e-008\n\t\t\t\t,9.29048e-008\n\t\t\t\t,-0.890843\n\t\t\t\t,0.425037\n\t\t\t\t,0.160445\n\t\t\t\t,-0.99997\n\t\t\t\t,-0.00548177\n\t\t\t\t,0.00548192\n\t\t\t\t,-0.890936\n\t\t\t\t,0.321118\n\t\t\t\t,0.321118\n\t\t\t\t,-0.890936\n\t\t\t\t,-0.321117\n\t\t\t\t,-0.321117\n\t\t\t\t,-0.99997\n\t\t\t\t,-0.00548177\n\t\t\t\t,0.00548192\n\t\t\t\t,-0.890844\n\t\t\t\t,-0.187094\n\t\t\t\t,-0.413997\n\t\t\t\t,-1\n\t\t\t\t,-8.9907e-009\n\t\t\t\t,1.10887e-007\n\t\t\t\t,-0.99997\n\t\t\t\t,-0.00548177\n\t\t\t\t,0.00548192\n\t\t\t\t,-0.890936\n\t\t\t\t,0.321118\n\t\t\t\t,0.321118\n\t\t\t\t,-0.890843\n\t\t\t\t,0.187095\n\t\t\t\t,0.413998\n\t\t\t\t,-1\n\t\t\t\t,-8.9907e-009\n\t\t\t\t,1.10887e-007\n\t\t\t\t,-0.890844\n\t\t\t\t,-0.187094\n\t\t\t\t,-0.413997\n\t\t\t\t,-1\n\t\t\t\t,-8.9907e-009\n\t\t\t\t,1.10887e-007\n\t\t\t\t,-0.99997\n\t\t\t\t,-0.00775251\n\t\t\t\t,1.0489e-007\n\t\t\t\t,-0.890936\n\t\t\t\t,0\n\t\t\t\t,-0.454129\n\t\t\t\t,-1\n\t\t\t\t,-8.9907e-009\n\t\t\t\t,1.10887e-007\n\t\t\t\t,-0.890843\n\t\t\t\t,0.187095\n\t\t\t\t,0.413998\n\t\t\t\t,-0.99997\n\t\t\t\t,-0.00775251\n\t\t\t\t,1.0489e-007\n\t\t\t\t,-0.890935\n\t\t\t\t,0\n\t\t\t\t,0.45413\n\t\t\t\t,-0.890936\n\t\t\t\t,0\n\t\t\t\t,-0.454129\n\t\t\t\t,-0.99997\n\t\t\t\t,-0.00775251\n\t\t\t\t,1.0489e-007\n\t\t\t\t,-0.890844\n\t\t\t\t,0.160445\n\t\t\t\t,-0.425036\n\t\t\t\t,-1\n\t\t\t\t,2.99681e-009\n\t\t\t\t,1.13884e-007\n\t\t\t\t,-0.99997\n\t\t\t\t,-0.00775251\n\t\t\t\t,1.0489e-007\n\t\t\t\t,-0.890935\n\t\t\t\t,0\n\t\t\t\t,0.45413\n\t\t\t\t,-0.890843\n\t\t\t\t,-0.160445\n\t\t\t\t,0.425037\n\t\t\t\t,-1\n\t\t\t\t,2.99681e-009\n\t\t\t\t,1.13884e-007\n\t\t\t\t,-0.890844\n\t\t\t\t,0.160445\n\t\t\t\t,-0.425036\n\t\t\t\t,-1\n\t\t\t\t,2.99681e-009\n\t\t\t\t,1.13884e-007\n\t\t\t\t,-0.99997\n\t\t\t\t,-0.00548188\n\t\t\t\t,-0.00548174\n\t\t\t\t,-0.890936\n\t\t\t\t,0.321118\n\t\t\t\t,-0.321118\n\t\t\t\t,-1\n\t\t\t\t,2.99681e-009\n\t\t\t\t,1.13884e-007\n\t\t\t\t,-0.890843\n\t\t\t\t,-0.160445\n\t\t\t\t,0.425037\n\t\t\t\t,-0.99997\n\t\t\t\t,-0.00548188\n\t\t\t\t,-0.00548174\n\t\t\t\t,-0.890935\n\t\t\t\t,-0.321118\n\t\t\t\t,0.321118\n\t\t\t\t,-0.890936\n\t\t\t\t,0.321118\n\t\t\t\t,-0.321118\n\t\t\t\t,-0.99997\n\t\t\t\t,-0.00548188\n\t\t\t\t,-0.00548174\n\t\t\t\t,-0.890844\n\t\t\t\t,0.413997\n\t\t\t\t,-0.187094\n\t\t\t\t,-1\n\t\t\t\t,-5.9939e-008\n\t\t\t\t,1.04893e-007\n\t\t\t\t,-0.99997\n\t\t\t\t,-0.00548188\n\t\t\t\t,-0.00548174\n\t\t\t\t,-0.890935\n\t\t\t\t,-0.321118\n\t\t\t\t,0.321118\n\t\t\t\t,-0.890843\n\t\t\t\t,-0.413998\n\t\t\t\t,0.187094\n\t\t\t\t,-1\n\t\t\t\t,-5.9939e-008\n\t\t\t\t,1.04893e-007\n\t\t\t\t,-0.890844\n\t\t\t\t,0.413997\n\t\t\t\t,-0.187094\n\t\t\t\t,-1\n\t\t\t\t,-5.9939e-008\n\t\t\t\t,1.04893e-007\n\t\t\t\t,-1\n\t\t\t\t,-1.04893e-007\n\t\t\t\t,0\n\t\t\t\t,-0.890936\n\t\t\t\t,0.454129\n\t\t\t\t,0\n\t\t\t\t,-1\n\t\t\t\t,-5.9939e-008\n\t\t\t\t,1.04893e-007\n\t\t\t\t,-0.890843\n\t\t\t\t,-0.413998\n\t\t\t\t,0.187094\n\t\t\t\t,-1\n\t\t\t\t,-1.04893e-007\n\t\t\t\t,0\n\t\t\t\t,-0.890935\n\t\t\t\t,-0.45413\n\t\t\t\t,0\n\t\t\t]\n\t\t\t,\"numuvcomponents\": [\n\t\t\t\t 2\n\t\t\t]\n\t\t\t,\"texturecoords\": [\n\t\t\t\t[\n\t\t\t\t\t 0.698905\n\t\t\t\t\t,0.252746\n\t\t\t\t\t,0.656802\n\t\t\t\t\t,0.244458\n\t\t\t\t\t,0.698905\n\t\t\t\t\t,0.143875\n\t\t\t\t\t,0.698905\n\t\t\t\t\t,0.264843\n\t\t\t\t\t,0.698905\n\t\t\t\t\t,0.143875\n\t\t\t\t\t,0.652123\n\t\t\t\t\t,0.255634\n\t\t\t\t\t,0.698905\n\t\t\t\t\t,0.264843\n\t\t\t\t\t,0.698905\n\t\t\t\t\t,0.289036\n\t\t\t\t\t,0.642766\n\t\t\t\t\t,0.277986\n\t\t\t\t\t,0.652123\n\t\t\t\t\t,0.255634\n\t\t\t\t\t,0.698905\n\t\t\t\t\t,0.289036\n\t\t\t\t\t,0.642766\n\t\t\t\t\t,0.277986\n\t\t\t\t\t,0.621107\n\t\t\t\t\t,0.220858\n\t\t\t\t\t,0.612463\n\t\t\t\t\t,0.229412\n\t\t\t\t\t,0.612463\n\t\t\t\t\t,0.229412\n\t\t\t\t\t,0.595174\n\t\t\t\t\t,0.246519\n\t\t\t\t\t,0.595174\n\t\t\t\t\t,0.246519\n\t\t\t\t\t,0.597257\n\t\t\t\t\t,0.185538\n\t\t\t\t\t,0.585963\n\t\t\t\t\t,0.190167\n\t\t\t\t\t,0.563374\n\t\t\t\t\t,0.199426\n\t\t\t\t\t,0.585963\n\t\t\t\t\t,0.190167\n\t\t\t\t\t,0.563374\n\t\t\t\t\t,0.199426\n\t\t\t\t\t,0.588882\n\t\t\t\t\t,0.143875\n\t\t\t\t\t,0.576657\n\t\t\t\t\t,0.143875\n\t\t\t\t\t,0.576657\n\t\t\t\t\t,0.143875\n\t\t\t\t\t,0.552208\n\t\t\t\t\t,0.143875\n\t\t\t\t\t,0.552208\n\t\t\t\t\t,0.143875\n\t\t\t\t\t,0.597257\n\t\t\t\t\t,0.102211\n\t\t\t\t\t,0.585963\n\t\t\t\t\t,0.0975826\n\t\t\t\t\t,0.563374\n\t\t\t\t\t,0.0883241\n\t\t\t\t\t,0.585963\n\t\t\t\t\t,0.0975826\n\t\t\t\t\t,0.563374\n\t\t\t\t\t,0.0883241\n\t\t\t\t\t,0.621107\n\t\t\t\t\t,0.0668908\n\t\t\t\t\t,0.612463\n\t\t\t\t\t,0.0583378\n\t\t\t\t\t,0.612463\n\t\t\t\t\t,0.0583378\n\t\t\t\t\t,0.595174\n\t\t\t\t\t,0.0412304\n\t\t\t\t\t,0.595174\n\t\t\t\t\t,0.0412304\n\t\t\t\t\t,0.656802\n\t\t\t\t\t,0.0432907\n\t\t\t\t\t,0.652123\n\t\t\t\t\t,0.0321153\n\t\t\t\t\t,0.642766\n\t\t\t\t\t,0.00976348\n\t\t\t\t\t,0.652123\n\t\t\t\t\t,0.0321153\n\t\t\t\t\t,0.642766\n\t\t\t\t\t,0.00976348\n\t\t\t\t\t,0.698905\n\t\t\t\t\t,0.0350043\n\t\t\t\t\t,0.698905\n\t\t\t\t\t,0.0229071\n\t\t\t\t\t,0.698905\n\t\t\t\t\t,0.0229071\n\t\t\t\t\t,0.698905\n\t\t\t\t\t,-0.00128639\n\t\t\t\t\t,0.698905\n\t\t\t\t\t,-0.00128639\n\t\t\t\t\t,0.741009\n\t\t\t\t\t,0.0432907\n\t\t\t\t\t,0.745687\n\t\t\t\t\t,0.0321153\n\t\t\t\t\t,0.755044\n\t\t\t\t\t,0.00976348\n\t\t\t\t\t,0.745687\n\t\t\t\t\t,0.0321153\n\t\t\t\t\t,0.755044\n\t\t\t\t\t,0.00976348\n\t\t\t\t\t,0.776703\n\t\t\t\t\t,0.0668908\n\t\t\t\t\t,0.785347\n\t\t\t\t\t,0.0583378\n\t\t\t\t\t,0.785347\n\t\t\t\t\t,0.0583378\n\t\t\t\t\t,0.802636\n\t\t\t\t\t,0.0412304\n\t\t\t\t\t,0.802636\n\t\t\t\t\t,0.0412304\n\t\t\t\t\t,0.800553\n\t\t\t\t\t,0.102211\n\t\t\t\t\t,0.811848\n\t\t\t\t\t,0.0975826\n\t\t\t\t\t,0.834436\n\t\t\t\t\t,0.0883241\n\t\t\t\t\t,0.811848\n\t\t\t\t\t,0.0975826\n\t\t\t\t\t,0.834436\n\t\t\t\t\t,0.0883241\n\t\t\t\t\t,0.808928\n\t\t\t\t\t,0.143875\n\t\t\t\t\t,0.821153\n\t\t\t\t\t,0.143875\n\t\t\t\t\t,0.821153\n\t\t\t\t\t,0.143875\n\t\t\t\t\t,0.845603\n\t\t\t\t\t,0.143875\n\t\t\t\t\t,0.845603\n\t\t\t\t\t,0.143875\n\t\t\t\t\t,0.800553\n\t\t\t\t\t,0.185538\n\t\t\t\t\t,0.811848\n\t\t\t\t\t,0.190167\n\t\t\t\t\t,0.834436\n\t\t\t\t\t,0.199426\n\t\t\t\t\t,0.811848\n\t\t\t\t\t,0.190167\n\t\t\t\t\t,0.834436\n\t\t\t\t\t,0.199426\n\t\t\t\t\t,0.776703\n\t\t\t\t\t,0.220858\n\t\t\t\t\t,0.785347\n\t\t\t\t\t,0.229412\n\t\t\t\t\t,0.785347\n\t\t\t\t\t,0.229412\n\t\t\t\t\t,0.802636\n\t\t\t\t\t,0.246519\n\t\t\t\t\t,0.802636\n\t\t\t\t\t,0.246519\n\t\t\t\t\t,0.741009\n\t\t\t\t\t,0.244458\n\t\t\t\t\t,0.745687\n\t\t\t\t\t,0.255634\n\t\t\t\t\t,0.755044\n\t\t\t\t\t,0.277986\n\t\t\t\t\t,0.745687\n\t\t\t\t\t,0.255634\n\t\t\t\t\t,0.755044\n\t\t\t\t\t,0.277986\n\t\t\t\t\t,0.443616\n\t\t\t\t\t,0.222924\n\t\t\t\t\t,0.443616\n\t\t\t\t\t,0.00341809\n\t\t\t\t\t,0.518311\n\t\t\t\t\t,0.222924\n\t\t\t\t\t,0.518311\n\t\t\t\t\t,0.00341809\n\t\t\t\t\t,0.443616\n\t\t\t\t\t,0.223044\n\t\t\t\t\t,0.443616\n\t\t\t\t\t,0.00353873\n\t\t\t\t\t,0.518311\n\t\t\t\t\t,0.00353873\n\t\t\t\t\t,0.518311\n\t\t\t\t\t,0.223044\n\t\t\t\t\t,0.443848\n\t\t\t\t\t,0.222924\n\t\t\t\t\t,0.443848\n\t\t\t\t\t,0.00341809\n\t\t\t\t\t,0.518543\n\t\t\t\t\t,0.00341809\n\t\t\t\t\t,0.518543\n\t\t\t\t\t,0.222924\n\t\t\t\t\t,0.443848\n\t\t\t\t\t,0.223044\n\t\t\t\t\t,0.443848\n\t\t\t\t\t,0.00353873\n\t\t\t\t\t,0.518543\n\t\t\t\t\t,0.223044\n\t\t\t\t\t,0.518543\n\t\t\t\t\t,0.00353873\n\t\t\t\t\t,0.442219\n\t\t\t\t\t,0.222924\n\t\t\t\t\t,0.442219\n\t\t\t\t\t,0.00341809\n\t\t\t\t\t,0.516915\n\t\t\t\t\t,0.222924\n\t\t\t\t\t,0.516915\n\t\t\t\t\t,0.00341809\n\t\t\t\t\t,0.442219\n\t\t\t\t\t,0.223044\n\t\t\t\t\t,0.442219\n\t\t\t\t\t,0.00353873\n\t\t\t\t\t,0.516915\n\t\t\t\t\t,0.00353873\n\t\t\t\t\t,0.516915\n\t\t\t\t\t,0.223044\n\t\t\t\t\t,0.442452\n\t\t\t\t\t,0.222924\n\t\t\t\t\t,0.442452\n\t\t\t\t\t,0.00341809\n\t\t\t\t\t,0.517147\n\t\t\t\t\t,0.00341809\n\t\t\t\t\t,0.517147\n\t\t\t\t\t,0.222924\n\t\t\t\t\t,0.442452\n\t\t\t\t\t,0.223044\n\t\t\t\t\t,0.442452\n\t\t\t\t\t,0.00353873\n\t\t\t\t\t,0.517147\n\t\t\t\t\t,0.223044\n\t\t\t\t\t,0.517147\n\t\t\t\t\t,0.00353873\n\t\t\t\t\t,0.442685\n\t\t\t\t\t,0.222924\n\t\t\t\t\t,0.442685\n\t\t\t\t\t,0.00341809\n\t\t\t\t\t,0.51738\n\t\t\t\t\t,0.222924\n\t\t\t\t\t,0.51738\n\t\t\t\t\t,0.00341809\n\t\t\t\t\t,0.442685\n\t\t\t\t\t,0.223044\n\t\t\t\t\t,0.442685\n\t\t\t\t\t,0.00353873\n\t\t\t\t\t,0.51738\n\t\t\t\t\t,0.00353873\n\t\t\t\t\t,0.51738\n\t\t\t\t\t,0.223044\n\t\t\t\t\t,0.442918\n\t\t\t\t\t,0.222924\n\t\t\t\t\t,0.442918\n\t\t\t\t\t,0.00341809\n\t\t\t\t\t,0.517613\n\t\t\t\t\t,0.00341809\n\t\t\t\t\t,0.517613\n\t\t\t\t\t,0.222924\n\t\t\t\t\t,0.442918\n\t\t\t\t\t,0.223044\n\t\t\t\t\t,0.442918\n\t\t\t\t\t,0.00353873\n\t\t\t\t\t,0.517613\n\t\t\t\t\t,0.223044\n\t\t\t\t\t,0.517613\n\t\t\t\t\t,0.00353873\n\t\t\t\t\t,0.44315\n\t\t\t\t\t,0.222924\n\t\t\t\t\t,0.44315\n\t\t\t\t\t,0.00341809\n\t\t\t\t\t,0.517846\n\t\t\t\t\t,0.222924\n\t\t\t\t\t,0.517846\n\t\t\t\t\t,0.00341809\n\t\t\t\t\t,0.44315\n\t\t\t\t\t,0.223044\n\t\t\t\t\t,0.44315\n\t\t\t\t\t,0.00353873\n\t\t\t\t\t,0.517846\n\t\t\t\t\t,0.00353873\n\t\t\t\t\t,0.517846\n\t\t\t\t\t,0.223044\n\t\t\t\t\t,0.443383\n\t\t\t\t\t,0.222924\n\t\t\t\t\t,0.443383\n\t\t\t\t\t,0.00341809\n\t\t\t\t\t,0.518078\n\t\t\t\t\t,0.00341809\n\t\t\t\t\t,0.518078\n\t\t\t\t\t,0.222924\n\t\t\t\t\t,0.443383\n\t\t\t\t\t,0.223044\n\t\t\t\t\t,0.443383\n\t\t\t\t\t,0.00353873\n\t\t\t\t\t,0.518078\n\t\t\t\t\t,0.223044\n\t\t\t\t\t,0.518078\n\t\t\t\t\t,0.00353873\n\t\t\t\t\t,0.443615\n\t\t\t\t\t,0.222924\n\t\t\t\t\t,0.443615\n\t\t\t\t\t,0.00341809\n\t\t\t\t\t,0.518311\n\t\t\t\t\t,0.222924\n\t\t\t\t\t,0.518311\n\t\t\t\t\t,0.00341809\n\t\t\t\t\t,0.443615\n\t\t\t\t\t,0.223044\n\t\t\t\t\t,0.443615\n\t\t\t\t\t,0.00353873\n\t\t\t\t\t,0.518311\n\t\t\t\t\t,0.00353873\n\t\t\t\t\t,0.518311\n\t\t\t\t\t,0.223044\n\t\t\t\t\t,0.443848\n\t\t\t\t\t,0.222924\n\t\t\t\t\t,0.443848\n\t\t\t\t\t,0.00341809\n\t\t\t\t\t,0.518543\n\t\t\t\t\t,0.00341809\n\t\t\t\t\t,0.518543\n\t\t\t\t\t,0.222924\n\t\t\t\t\t,0.443848\n\t\t\t\t\t,0.223044\n\t\t\t\t\t,0.443848\n\t\t\t\t\t,0.00353873\n\t\t\t\t\t,0.518543\n\t\t\t\t\t,0.223044\n\t\t\t\t\t,0.518543\n\t\t\t\t\t,0.00353873\n\t\t\t\t\t,0.442219\n\t\t\t\t\t,0.222924\n\t\t\t\t\t,0.442219\n\t\t\t\t\t,0.00341809\n\t\t\t\t\t,0.516915\n\t\t\t\t\t,0.222924\n\t\t\t\t\t,0.516915\n\t\t\t\t\t,0.00341809\n\t\t\t\t\t,0.442219\n\t\t\t\t\t,0.223044\n\t\t\t\t\t,0.442219\n\t\t\t\t\t,0.00353873\n\t\t\t\t\t,0.516915\n\t\t\t\t\t,0.00353873\n\t\t\t\t\t,0.516915\n\t\t\t\t\t,0.223044\n\t\t\t\t\t,0.442452\n\t\t\t\t\t,0.222924\n\t\t\t\t\t,0.442452\n\t\t\t\t\t,0.00341809\n\t\t\t\t\t,0.517147\n\t\t\t\t\t,0.00341809\n\t\t\t\t\t,0.517147\n\t\t\t\t\t,0.222924\n\t\t\t\t\t,0.442452\n\t\t\t\t\t,0.223044\n\t\t\t\t\t,0.442452\n\t\t\t\t\t,0.00353873\n\t\t\t\t\t,0.517147\n\t\t\t\t\t,0.223044\n\t\t\t\t\t,0.517147\n\t\t\t\t\t,0.00353873\n\t\t\t\t\t,0.442685\n\t\t\t\t\t,0.222924\n\t\t\t\t\t,0.442685\n\t\t\t\t\t,0.00341809\n\t\t\t\t\t,0.51738\n\t\t\t\t\t,0.222924\n\t\t\t\t\t,0.51738\n\t\t\t\t\t,0.00341809\n\t\t\t\t\t,0.442685\n\t\t\t\t\t,0.223044\n\t\t\t\t\t,0.442685\n\t\t\t\t\t,0.00353873\n\t\t\t\t\t,0.51738\n\t\t\t\t\t,0.00353873\n\t\t\t\t\t,0.51738\n\t\t\t\t\t,0.223044\n\t\t\t\t\t,0.442918\n\t\t\t\t\t,0.222924\n\t\t\t\t\t,0.442918\n\t\t\t\t\t,0.00341809\n\t\t\t\t\t,0.517613\n\t\t\t\t\t,0.00341809\n\t\t\t\t\t,0.517613\n\t\t\t\t\t,0.222924\n\t\t\t\t\t,0.442918\n\t\t\t\t\t,0.223044\n\t\t\t\t\t,0.442918\n\t\t\t\t\t,0.00353873\n\t\t\t\t\t,0.517613\n\t\t\t\t\t,0.223044\n\t\t\t\t\t,0.517613\n\t\t\t\t\t,0.00353873\n\t\t\t\t\t,0.44315\n\t\t\t\t\t,0.222924\n\t\t\t\t\t,0.44315\n\t\t\t\t\t,0.00341809\n\t\t\t\t\t,0.517845\n\t\t\t\t\t,0.222924\n\t\t\t\t\t,0.517845\n\t\t\t\t\t,0.00341809\n\t\t\t\t\t,0.44315\n\t\t\t\t\t,0.223044\n\t\t\t\t\t,0.44315\n\t\t\t\t\t,0.00353873\n\t\t\t\t\t,0.517845\n\t\t\t\t\t,0.00353873\n\t\t\t\t\t,0.517845\n\t\t\t\t\t,0.223044\n\t\t\t\t\t,0.443383\n\t\t\t\t\t,0.222924\n\t\t\t\t\t,0.443383\n\t\t\t\t\t,0.00341809\n\t\t\t\t\t,0.518078\n\t\t\t\t\t,0.00341809\n\t\t\t\t\t,0.518078\n\t\t\t\t\t,0.222924\n\t\t\t\t\t,0.443383\n\t\t\t\t\t,0.223044\n\t\t\t\t\t,0.443383\n\t\t\t\t\t,0.00353873\n\t\t\t\t\t,0.518078\n\t\t\t\t\t,0.223044\n\t\t\t\t\t,0.518078\n\t\t\t\t\t,0.00353873\n\t\t\t\t\t,0.698905\n\t\t\t\t\t,0.143875\n\t\t\t\t\t,0.656802\n\t\t\t\t\t,0.244458\n\t\t\t\t\t,0.698905\n\t\t\t\t\t,0.252746\n\t\t\t\t\t,0.652123\n\t\t\t\t\t,0.255634\n\t\t\t\t\t,0.698905\n\t\t\t\t\t,0.143875\n\t\t\t\t\t,0.698905\n\t\t\t\t\t,0.264843\n\t\t\t\t\t,0.642766\n\t\t\t\t\t,0.277986\n\t\t\t\t\t,0.698905\n\t\t\t\t\t,0.289036\n\t\t\t\t\t,0.698905\n\t\t\t\t\t,0.264843\n\t\t\t\t\t,0.652123\n\t\t\t\t\t,0.255634\n\t\t\t\t\t,0.642766\n\t\t\t\t\t,0.277986\n\t\t\t\t\t,0.698905\n\t\t\t\t\t,0.289036\n\t\t\t\t\t,0.621107\n\t\t\t\t\t,0.220858\n\t\t\t\t\t,0.612463\n\t\t\t\t\t,0.229412\n\t\t\t\t\t,0.612463\n\t\t\t\t\t,0.229412\n\t\t\t\t\t,0.595174\n\t\t\t\t\t,0.246519\n\t\t\t\t\t,0.595174\n\t\t\t\t\t,0.246519\n\t\t\t\t\t,0.597257\n\t\t\t\t\t,0.185538\n\t\t\t\t\t,0.585963\n\t\t\t\t\t,0.190167\n\t\t\t\t\t,0.563374\n\t\t\t\t\t,0.199426\n\t\t\t\t\t,0.585963\n\t\t\t\t\t,0.190167\n\t\t\t\t\t,0.563374\n\t\t\t\t\t,0.199426\n\t\t\t\t\t,0.588882\n\t\t\t\t\t,0.143875\n\t\t\t\t\t,0.576657\n\t\t\t\t\t,0.143875\n\t\t\t\t\t,0.576657\n\t\t\t\t\t,0.143875\n\t\t\t\t\t,0.552208\n\t\t\t\t\t,0.143875\n\t\t\t\t\t,0.552208\n\t\t\t\t\t,0.143875\n\t\t\t\t\t,0.597257\n\t\t\t\t\t,0.102211\n\t\t\t\t\t,0.585963\n\t\t\t\t\t,0.0975826\n\t\t\t\t\t,0.563374\n\t\t\t\t\t,0.0883241\n\t\t\t\t\t,0.585963\n\t\t\t\t\t,0.0975826\n\t\t\t\t\t,0.563374\n\t\t\t\t\t,0.0883241\n\t\t\t\t\t,0.621107\n\t\t\t\t\t,0.0668908\n\t\t\t\t\t,0.612463\n\t\t\t\t\t,0.0583378\n\t\t\t\t\t,0.612463\n\t\t\t\t\t,0.0583378\n\t\t\t\t\t,0.595174\n\t\t\t\t\t,0.0412304\n\t\t\t\t\t,0.595174\n\t\t\t\t\t,0.0412304\n\t\t\t\t\t,0.656802\n\t\t\t\t\t,0.0432907\n\t\t\t\t\t,0.652123\n\t\t\t\t\t,0.0321153\n\t\t\t\t\t,0.642766\n\t\t\t\t\t,0.00976348\n\t\t\t\t\t,0.652123\n\t\t\t\t\t,0.0321153\n\t\t\t\t\t,0.642766\n\t\t\t\t\t,0.00976348\n\t\t\t\t\t,0.698905\n\t\t\t\t\t,0.0350043\n\t\t\t\t\t,0.698905\n\t\t\t\t\t,0.0229071\n\t\t\t\t\t,0.698905\n\t\t\t\t\t,0.0229071\n\t\t\t\t\t,0.698905\n\t\t\t\t\t,-0.00128639\n\t\t\t\t\t,0.698905\n\t\t\t\t\t,-0.00128639\n\t\t\t\t\t,0.741009\n\t\t\t\t\t,0.0432907\n\t\t\t\t\t,0.745687\n\t\t\t\t\t,0.0321153\n\t\t\t\t\t,0.755044\n\t\t\t\t\t,0.00976348\n\t\t\t\t\t,0.745687\n\t\t\t\t\t,0.0321153\n\t\t\t\t\t,0.755044\n\t\t\t\t\t,0.00976348\n\t\t\t\t\t,0.776703\n\t\t\t\t\t,0.0668908\n\t\t\t\t\t,0.785347\n\t\t\t\t\t,0.0583378\n\t\t\t\t\t,0.785347\n\t\t\t\t\t,0.0583378\n\t\t\t\t\t,0.802636\n\t\t\t\t\t,0.0412304\n\t\t\t\t\t,0.802636\n\t\t\t\t\t,0.0412304\n\t\t\t\t\t,0.800553\n\t\t\t\t\t,0.102211\n\t\t\t\t\t,0.811848\n\t\t\t\t\t,0.0975826\n\t\t\t\t\t,0.834436\n\t\t\t\t\t,0.0883241\n\t\t\t\t\t,0.811848\n\t\t\t\t\t,0.0975826\n\t\t\t\t\t,0.834436\n\t\t\t\t\t,0.0883241\n\t\t\t\t\t,0.808928\n\t\t\t\t\t,0.143875\n\t\t\t\t\t,0.821153\n\t\t\t\t\t,0.143875\n\t\t\t\t\t,0.821153\n\t\t\t\t\t,0.143875\n\t\t\t\t\t,0.845603\n\t\t\t\t\t,0.143875\n\t\t\t\t\t,0.845603\n\t\t\t\t\t,0.143875\n\t\t\t\t\t,0.800553\n\t\t\t\t\t,0.185538\n\t\t\t\t\t,0.811848\n\t\t\t\t\t,0.190167\n\t\t\t\t\t,0.834436\n\t\t\t\t\t,0.199426\n\t\t\t\t\t,0.811848\n\t\t\t\t\t,0.190167\n\t\t\t\t\t,0.834436\n\t\t\t\t\t,0.199426\n\t\t\t\t\t,0.776703\n\t\t\t\t\t,0.220858\n\t\t\t\t\t,0.785347\n\t\t\t\t\t,0.229412\n\t\t\t\t\t,0.785347\n\t\t\t\t\t,0.229412\n\t\t\t\t\t,0.802636\n\t\t\t\t\t,0.246519\n\t\t\t\t\t,0.802636\n\t\t\t\t\t,0.246519\n\t\t\t\t\t,0.741009\n\t\t\t\t\t,0.244458\n\t\t\t\t\t,0.745687\n\t\t\t\t\t,0.255634\n\t\t\t\t\t,0.755044\n\t\t\t\t\t,0.277986\n\t\t\t\t\t,0.745687\n\t\t\t\t\t,0.255634\n\t\t\t\t\t,0.755044\n\t\t\t\t\t,0.277986\n\t\t\t\t\t,0.518311\n\t\t\t\t\t,0.222924\n\t\t\t\t\t,0.443616\n\t\t\t\t\t,0.00341809\n\t\t\t\t\t,0.443616\n\t\t\t\t\t,0.222924\n\t\t\t\t\t,0.518311\n\t\t\t\t\t,0.00341809\n\t\t\t\t\t,0.518311\n\t\t\t\t\t,0.00353873\n\t\t\t\t\t,0.443616\n\t\t\t\t\t,0.00353873\n\t\t\t\t\t,0.443616\n\t\t\t\t\t,0.223044\n\t\t\t\t\t,0.518311\n\t\t\t\t\t,0.223044\n\t\t\t\t\t,0.518543\n\t\t\t\t\t,0.00341809\n\t\t\t\t\t,0.443848\n\t\t\t\t\t,0.00341809\n\t\t\t\t\t,0.443848\n\t\t\t\t\t,0.222924\n\t\t\t\t\t,0.518543\n\t\t\t\t\t,0.222924\n\t\t\t\t\t,0.518543\n\t\t\t\t\t,0.223044\n\t\t\t\t\t,0.443848\n\t\t\t\t\t,0.00353873\n\t\t\t\t\t,0.443848\n\t\t\t\t\t,0.223044\n\t\t\t\t\t,0.518543\n\t\t\t\t\t,0.00353873\n\t\t\t\t\t,0.516915\n\t\t\t\t\t,0.222924\n\t\t\t\t\t,0.442219\n\t\t\t\t\t,0.00341809\n\t\t\t\t\t,0.442219\n\t\t\t\t\t,0.222924\n\t\t\t\t\t,0.516915\n\t\t\t\t\t,0.00341809\n\t\t\t\t\t,0.516915\n\t\t\t\t\t,0.00353873\n\t\t\t\t\t,0.442219\n\t\t\t\t\t,0.00353873\n\t\t\t\t\t,0.442219\n\t\t\t\t\t,0.223044\n\t\t\t\t\t,0.516915\n\t\t\t\t\t,0.223044\n\t\t\t\t\t,0.517147\n\t\t\t\t\t,0.00341809\n\t\t\t\t\t,0.442452\n\t\t\t\t\t,0.00341809\n\t\t\t\t\t,0.442452\n\t\t\t\t\t,0.222924\n\t\t\t\t\t,0.517147\n\t\t\t\t\t,0.222924\n\t\t\t\t\t,0.517147\n\t\t\t\t\t,0.223044\n\t\t\t\t\t,0.442452\n\t\t\t\t\t,0.00353873\n\t\t\t\t\t,0.442452\n\t\t\t\t\t,0.223044\n\t\t\t\t\t,0.517147\n\t\t\t\t\t,0.00353873\n\t\t\t\t\t,0.51738\n\t\t\t\t\t,0.222924\n\t\t\t\t\t,0.442685\n\t\t\t\t\t,0.00341809\n\t\t\t\t\t,0.442685\n\t\t\t\t\t,0.222924\n\t\t\t\t\t,0.51738\n\t\t\t\t\t,0.00341809\n\t\t\t\t\t,0.51738\n\t\t\t\t\t,0.00353873\n\t\t\t\t\t,0.442685\n\t\t\t\t\t,0.00353873\n\t\t\t\t\t,0.442685\n\t\t\t\t\t,0.223044\n\t\t\t\t\t,0.51738\n\t\t\t\t\t,0.223044\n\t\t\t\t\t,0.517613\n\t\t\t\t\t,0.00341809\n\t\t\t\t\t,0.442918\n\t\t\t\t\t,0.00341809\n\t\t\t\t\t,0.442918\n\t\t\t\t\t,0.222924\n\t\t\t\t\t,0.517613\n\t\t\t\t\t,0.222924\n\t\t\t\t\t,0.517613\n\t\t\t\t\t,0.223044\n\t\t\t\t\t,0.442918\n\t\t\t\t\t,0.00353873\n\t\t\t\t\t,0.442918\n\t\t\t\t\t,0.223044\n\t\t\t\t\t,0.517613\n\t\t\t\t\t,0.00353873\n\t\t\t\t\t,0.517846\n\t\t\t\t\t,0.222924\n\t\t\t\t\t,0.44315\n\t\t\t\t\t,0.00341809\n\t\t\t\t\t,0.44315\n\t\t\t\t\t,0.222924\n\t\t\t\t\t,0.517846\n\t\t\t\t\t,0.00341809\n\t\t\t\t\t,0.517846\n\t\t\t\t\t,0.00353873\n\t\t\t\t\t,0.44315\n\t\t\t\t\t,0.00353873\n\t\t\t\t\t,0.44315\n\t\t\t\t\t,0.223044\n\t\t\t\t\t,0.517846\n\t\t\t\t\t,0.223044\n\t\t\t\t\t,0.518078\n\t\t\t\t\t,0.00341809\n\t\t\t\t\t,0.443383\n\t\t\t\t\t,0.00341809\n\t\t\t\t\t,0.443383\n\t\t\t\t\t,0.222924\n\t\t\t\t\t,0.518078\n\t\t\t\t\t,0.222924\n\t\t\t\t\t,0.518078\n\t\t\t\t\t,0.223044\n\t\t\t\t\t,0.443383\n\t\t\t\t\t,0.00353873\n\t\t\t\t\t,0.443383\n\t\t\t\t\t,0.223044\n\t\t\t\t\t,0.518078\n\t\t\t\t\t,0.00353873\n\t\t\t\t\t,0.518311\n\t\t\t\t\t,0.222924\n\t\t\t\t\t,0.443615\n\t\t\t\t\t,0.00341809\n\t\t\t\t\t,0.443615\n\t\t\t\t\t,0.222924\n\t\t\t\t\t,0.518311\n\t\t\t\t\t,0.00341809\n\t\t\t\t\t,0.518311\n\t\t\t\t\t,0.00353873\n\t\t\t\t\t,0.443615\n\t\t\t\t\t,0.00353873\n\t\t\t\t\t,0.443615\n\t\t\t\t\t,0.223044\n\t\t\t\t\t,0.518311\n\t\t\t\t\t,0.223044\n\t\t\t\t\t,0.518543\n\t\t\t\t\t,0.00341809\n\t\t\t\t\t,0.443848\n\t\t\t\t\t,0.00341809\n\t\t\t\t\t,0.443848\n\t\t\t\t\t,0.222924\n\t\t\t\t\t,0.518543\n\t\t\t\t\t,0.222924\n\t\t\t\t\t,0.518543\n\t\t\t\t\t,0.223044\n\t\t\t\t\t,0.443848\n\t\t\t\t\t,0.00353873\n\t\t\t\t\t,0.443848\n\t\t\t\t\t,0.223044\n\t\t\t\t\t,0.518543\n\t\t\t\t\t,0.00353873\n\t\t\t\t\t,0.516915\n\t\t\t\t\t,0.222924\n\t\t\t\t\t,0.442219\n\t\t\t\t\t,0.00341809\n\t\t\t\t\t,0.442219\n\t\t\t\t\t,0.222924\n\t\t\t\t\t,0.516915\n\t\t\t\t\t,0.00341809\n\t\t\t\t\t,0.516915\n\t\t\t\t\t,0.00353873\n\t\t\t\t\t,0.442219\n\t\t\t\t\t,0.00353873\n\t\t\t\t\t,0.442219\n\t\t\t\t\t,0.223044\n\t\t\t\t\t,0.516915\n\t\t\t\t\t,0.223044\n\t\t\t\t\t,0.517147\n\t\t\t\t\t,0.00341809\n\t\t\t\t\t,0.442452\n\t\t\t\t\t,0.00341809\n\t\t\t\t\t,0.442452\n\t\t\t\t\t,0.222924\n\t\t\t\t\t,0.517147\n\t\t\t\t\t,0.222924\n\t\t\t\t\t,0.517147\n\t\t\t\t\t,0.223044\n\t\t\t\t\t,0.442452\n\t\t\t\t\t,0.00353873\n\t\t\t\t\t,0.442452\n\t\t\t\t\t,0.223044\n\t\t\t\t\t,0.517147\n\t\t\t\t\t,0.00353873\n\t\t\t\t\t,0.51738\n\t\t\t\t\t,0.222924\n\t\t\t\t\t,0.442685\n\t\t\t\t\t,0.00341809\n\t\t\t\t\t,0.442685\n\t\t\t\t\t,0.222924\n\t\t\t\t\t,0.51738\n\t\t\t\t\t,0.00341809\n\t\t\t\t\t,0.51738\n\t\t\t\t\t,0.00353873\n\t\t\t\t\t,0.442685\n\t\t\t\t\t,0.00353873\n\t\t\t\t\t,0.442685\n\t\t\t\t\t,0.223044\n\t\t\t\t\t,0.51738\n\t\t\t\t\t,0.223044\n\t\t\t\t\t,0.517613\n\t\t\t\t\t,0.00341809\n\t\t\t\t\t,0.442918\n\t\t\t\t\t,0.00341809\n\t\t\t\t\t,0.442918\n\t\t\t\t\t,0.222924\n\t\t\t\t\t,0.517613\n\t\t\t\t\t,0.222924\n\t\t\t\t\t,0.517613\n\t\t\t\t\t,0.223044\n\t\t\t\t\t,0.442918\n\t\t\t\t\t,0.00353873\n\t\t\t\t\t,0.442918\n\t\t\t\t\t,0.223044\n\t\t\t\t\t,0.517613\n\t\t\t\t\t,0.00353873\n\t\t\t\t\t,0.517845\n\t\t\t\t\t,0.222924\n\t\t\t\t\t,0.44315\n\t\t\t\t\t,0.00341809\n\t\t\t\t\t,0.44315\n\t\t\t\t\t,0.222924\n\t\t\t\t\t,0.517845\n\t\t\t\t\t,0.00341809\n\t\t\t\t\t,0.517845\n\t\t\t\t\t,0.00353873\n\t\t\t\t\t,0.44315\n\t\t\t\t\t,0.00353873\n\t\t\t\t\t,0.44315\n\t\t\t\t\t,0.223044\n\t\t\t\t\t,0.517845\n\t\t\t\t\t,0.223044\n\t\t\t\t\t,0.518078\n\t\t\t\t\t,0.00341809\n\t\t\t\t\t,0.443383\n\t\t\t\t\t,0.00341809\n\t\t\t\t\t,0.443383\n\t\t\t\t\t,0.222924\n\t\t\t\t\t,0.518078\n\t\t\t\t\t,0.222924\n\t\t\t\t\t,0.518078\n\t\t\t\t\t,0.223044\n\t\t\t\t\t,0.443383\n\t\t\t\t\t,0.00353873\n\t\t\t\t\t,0.443383\n\t\t\t\t\t,0.223044\n\t\t\t\t\t,0.518078\n\t\t\t\t\t,0.00353873\n\t\t\t\t\t,0.698905\n\t\t\t\t\t,0.143875\n\t\t\t\t\t,0.656802\n\t\t\t\t\t,0.244458\n\t\t\t\t\t,0.698905\n\t\t\t\t\t,0.252746\n\t\t\t\t\t,0.652123\n\t\t\t\t\t,0.255634\n\t\t\t\t\t,0.698905\n\t\t\t\t\t,0.143875\n\t\t\t\t\t,0.698905\n\t\t\t\t\t,0.264843\n\t\t\t\t\t,0.642766\n\t\t\t\t\t,0.277986\n\t\t\t\t\t,0.698905\n\t\t\t\t\t,0.289036\n\t\t\t\t\t,0.698905\n\t\t\t\t\t,0.264843\n\t\t\t\t\t,0.652123\n\t\t\t\t\t,0.255634\n\t\t\t\t\t,0.642766\n\t\t\t\t\t,0.277986\n\t\t\t\t\t,0.698905\n\t\t\t\t\t,0.289036\n\t\t\t\t\t,0.621107\n\t\t\t\t\t,0.220858\n\t\t\t\t\t,0.612463\n\t\t\t\t\t,0.229412\n\t\t\t\t\t,0.612463\n\t\t\t\t\t,0.229412\n\t\t\t\t\t,0.595174\n\t\t\t\t\t,0.246519\n\t\t\t\t\t,0.595174\n\t\t\t\t\t,0.246519\n\t\t\t\t\t,0.597257\n\t\t\t\t\t,0.185538\n\t\t\t\t\t,0.585963\n\t\t\t\t\t,0.190167\n\t\t\t\t\t,0.563374\n\t\t\t\t\t,0.199426\n\t\t\t\t\t,0.585963\n\t\t\t\t\t,0.190167\n\t\t\t\t\t,0.563374\n\t\t\t\t\t,0.199426\n\t\t\t\t\t,0.588882\n\t\t\t\t\t,0.143875\n\t\t\t\t\t,0.576657\n\t\t\t\t\t,0.143875\n\t\t\t\t\t,0.576657\n\t\t\t\t\t,0.143875\n\t\t\t\t\t,0.552208\n\t\t\t\t\t,0.143875\n\t\t\t\t\t,0.552208\n\t\t\t\t\t,0.143875\n\t\t\t\t\t,0.597257\n\t\t\t\t\t,0.102211\n\t\t\t\t\t,0.585963\n\t\t\t\t\t,0.0975826\n\t\t\t\t\t,0.563374\n\t\t\t\t\t,0.0883241\n\t\t\t\t\t,0.585963\n\t\t\t\t\t,0.0975826\n\t\t\t\t\t,0.563374\n\t\t\t\t\t,0.0883241\n\t\t\t\t\t,0.621107\n\t\t\t\t\t,0.0668908\n\t\t\t\t\t,0.612463\n\t\t\t\t\t,0.0583378\n\t\t\t\t\t,0.612463\n\t\t\t\t\t,0.0583378\n\t\t\t\t\t,0.595174\n\t\t\t\t\t,0.0412304\n\t\t\t\t\t,0.595174\n\t\t\t\t\t,0.0412304\n\t\t\t\t\t,0.656802\n\t\t\t\t\t,0.0432907\n\t\t\t\t\t,0.652123\n\t\t\t\t\t,0.0321153\n\t\t\t\t\t,0.642766\n\t\t\t\t\t,0.00976348\n\t\t\t\t\t,0.652123\n\t\t\t\t\t,0.0321153\n\t\t\t\t\t,0.642766\n\t\t\t\t\t,0.00976348\n\t\t\t\t\t,0.698905\n\t\t\t\t\t,0.0350043\n\t\t\t\t\t,0.698905\n\t\t\t\t\t,0.0229071\n\t\t\t\t\t,0.698905\n\t\t\t\t\t,0.0229071\n\t\t\t\t\t,0.698905\n\t\t\t\t\t,-0.00128639\n\t\t\t\t\t,0.698905\n\t\t\t\t\t,-0.00128639\n\t\t\t\t\t,0.741009\n\t\t\t\t\t,0.0432907\n\t\t\t\t\t,0.745687\n\t\t\t\t\t,0.0321153\n\t\t\t\t\t,0.755044\n\t\t\t\t\t,0.00976348\n\t\t\t\t\t,0.745687\n\t\t\t\t\t,0.0321153\n\t\t\t\t\t,0.755044\n\t\t\t\t\t,0.00976348\n\t\t\t\t\t,0.776703\n\t\t\t\t\t,0.0668908\n\t\t\t\t\t,0.785347\n\t\t\t\t\t,0.0583378\n\t\t\t\t\t,0.785347\n\t\t\t\t\t,0.0583378\n\t\t\t\t\t,0.802636\n\t\t\t\t\t,0.0412304\n\t\t\t\t\t,0.802636\n\t\t\t\t\t,0.0412304\n\t\t\t\t\t,0.800553\n\t\t\t\t\t,0.102211\n\t\t\t\t\t,0.811848\n\t\t\t\t\t,0.0975826\n\t\t\t\t\t,0.834436\n\t\t\t\t\t,0.0883241\n\t\t\t\t\t,0.811848\n\t\t\t\t\t,0.0975826\n\t\t\t\t\t,0.834436\n\t\t\t\t\t,0.0883241\n\t\t\t\t\t,0.808928\n\t\t\t\t\t,0.143875\n\t\t\t\t\t,0.821153\n\t\t\t\t\t,0.143875\n\t\t\t\t\t,0.821153\n\t\t\t\t\t,0.143875\n\t\t\t\t\t,0.845603\n\t\t\t\t\t,0.143875\n\t\t\t\t\t,0.845603\n\t\t\t\t\t,0.143875\n\t\t\t\t\t,0.800553\n\t\t\t\t\t,0.185538\n\t\t\t\t\t,0.811848\n\t\t\t\t\t,0.190167\n\t\t\t\t\t,0.834436\n\t\t\t\t\t,0.199426\n\t\t\t\t\t,0.811848\n\t\t\t\t\t,0.190167\n\t\t\t\t\t,0.834436\n\t\t\t\t\t,0.199426\n\t\t\t\t\t,0.776703\n\t\t\t\t\t,0.220858\n\t\t\t\t\t,0.785347\n\t\t\t\t\t,0.229412\n\t\t\t\t\t,0.785347\n\t\t\t\t\t,0.229412\n\t\t\t\t\t,0.802636\n\t\t\t\t\t,0.246519\n\t\t\t\t\t,0.802636\n\t\t\t\t\t,0.246519\n\t\t\t\t\t,0.741009\n\t\t\t\t\t,0.244458\n\t\t\t\t\t,0.745687\n\t\t\t\t\t,0.255634\n\t\t\t\t\t,0.755044\n\t\t\t\t\t,0.277986\n\t\t\t\t\t,0.745687\n\t\t\t\t\t,0.255634\n\t\t\t\t\t,0.755044\n\t\t\t\t\t,0.277986\n\t\t\t\t\t,0.518311\n\t\t\t\t\t,0.222924\n\t\t\t\t\t,0.443616\n\t\t\t\t\t,0.00341809\n\t\t\t\t\t,0.443616\n\t\t\t\t\t,0.222924\n\t\t\t\t\t,0.518311\n\t\t\t\t\t,0.00341809\n\t\t\t\t\t,0.518311\n\t\t\t\t\t,0.00353873\n\t\t\t\t\t,0.443616\n\t\t\t\t\t,0.00353873\n\t\t\t\t\t,0.443616\n\t\t\t\t\t,0.223044\n\t\t\t\t\t,0.518311\n\t\t\t\t\t,0.223044\n\t\t\t\t\t,0.518543\n\t\t\t\t\t,0.00341809\n\t\t\t\t\t,0.443848\n\t\t\t\t\t,0.00341809\n\t\t\t\t\t,0.443848\n\t\t\t\t\t,0.222924\n\t\t\t\t\t,0.518543\n\t\t\t\t\t,0.222924\n\t\t\t\t\t,0.518543\n\t\t\t\t\t,0.223044\n\t\t\t\t\t,0.443848\n\t\t\t\t\t,0.00353873\n\t\t\t\t\t,0.443848\n\t\t\t\t\t,0.223044\n\t\t\t\t\t,0.518543\n\t\t\t\t\t,0.00353873\n\t\t\t\t\t,0.516915\n\t\t\t\t\t,0.222924\n\t\t\t\t\t,0.442219\n\t\t\t\t\t,0.00341809\n\t\t\t\t\t,0.442219\n\t\t\t\t\t,0.222924\n\t\t\t\t\t,0.516915\n\t\t\t\t\t,0.00341809\n\t\t\t\t\t,0.516915\n\t\t\t\t\t,0.00353873\n\t\t\t\t\t,0.442219\n\t\t\t\t\t,0.00353873\n\t\t\t\t\t,0.442219\n\t\t\t\t\t,0.223044\n\t\t\t\t\t,0.516915\n\t\t\t\t\t,0.223044\n\t\t\t\t\t,0.517147\n\t\t\t\t\t,0.00341809\n\t\t\t\t\t,0.442452\n\t\t\t\t\t,0.00341809\n\t\t\t\t\t,0.442452\n\t\t\t\t\t,0.222924\n\t\t\t\t\t,0.517147\n\t\t\t\t\t,0.222924\n\t\t\t\t\t,0.517147\n\t\t\t\t\t,0.223044\n\t\t\t\t\t,0.442452\n\t\t\t\t\t,0.00353873\n\t\t\t\t\t,0.442452\n\t\t\t\t\t,0.223044\n\t\t\t\t\t,0.517147\n\t\t\t\t\t,0.00353873\n\t\t\t\t\t,0.51738\n\t\t\t\t\t,0.222924\n\t\t\t\t\t,0.442685\n\t\t\t\t\t,0.00341809\n\t\t\t\t\t,0.442685\n\t\t\t\t\t,0.222924\n\t\t\t\t\t,0.51738\n\t\t\t\t\t,0.00341809\n\t\t\t\t\t,0.51738\n\t\t\t\t\t,0.00353873\n\t\t\t\t\t,0.442685\n\t\t\t\t\t,0.00353873\n\t\t\t\t\t,0.442685\n\t\t\t\t\t,0.223044\n\t\t\t\t\t,0.51738\n\t\t\t\t\t,0.223044\n\t\t\t\t\t,0.517613\n\t\t\t\t\t,0.00341809\n\t\t\t\t\t,0.442918\n\t\t\t\t\t,0.00341809\n\t\t\t\t\t,0.442918\n\t\t\t\t\t,0.222924\n\t\t\t\t\t,0.517613\n\t\t\t\t\t,0.222924\n\t\t\t\t\t,0.517613\n\t\t\t\t\t,0.223044\n\t\t\t\t\t,0.442918\n\t\t\t\t\t,0.00353873\n\t\t\t\t\t,0.442918\n\t\t\t\t\t,0.223044\n\t\t\t\t\t,0.517613\n\t\t\t\t\t,0.00353873\n\t\t\t\t\t,0.517846\n\t\t\t\t\t,0.222924\n\t\t\t\t\t,0.44315\n\t\t\t\t\t,0.00341809\n\t\t\t\t\t,0.44315\n\t\t\t\t\t,0.222924\n\t\t\t\t\t,0.517846\n\t\t\t\t\t,0.00341809\n\t\t\t\t\t,0.517846\n\t\t\t\t\t,0.00353873\n\t\t\t\t\t,0.44315\n\t\t\t\t\t,0.00353873\n\t\t\t\t\t,0.44315\n\t\t\t\t\t,0.223044\n\t\t\t\t\t,0.517846\n\t\t\t\t\t,0.223044\n\t\t\t\t\t,0.518078\n\t\t\t\t\t,0.00341809\n\t\t\t\t\t,0.443383\n\t\t\t\t\t,0.00341809\n\t\t\t\t\t,0.443383\n\t\t\t\t\t,0.222924\n\t\t\t\t\t,0.518078\n\t\t\t\t\t,0.222924\n\t\t\t\t\t,0.518078\n\t\t\t\t\t,0.223044\n\t\t\t\t\t,0.443383\n\t\t\t\t\t,0.00353873\n\t\t\t\t\t,0.443383\n\t\t\t\t\t,0.223044\n\t\t\t\t\t,0.518078\n\t\t\t\t\t,0.00353873\n\t\t\t\t\t,0.518311\n\t\t\t\t\t,0.222924\n\t\t\t\t\t,0.443615\n\t\t\t\t\t,0.00341809\n\t\t\t\t\t,0.443615\n\t\t\t\t\t,0.222924\n\t\t\t\t\t,0.518311\n\t\t\t\t\t,0.00341809\n\t\t\t\t\t,0.518311\n\t\t\t\t\t,0.00353873\n\t\t\t\t\t,0.443615\n\t\t\t\t\t,0.00353873\n\t\t\t\t\t,0.443615\n\t\t\t\t\t,0.223044\n\t\t\t\t\t,0.518311\n\t\t\t\t\t,0.223044\n\t\t\t\t\t,0.518543\n\t\t\t\t\t,0.00341809\n\t\t\t\t\t,0.443848\n\t\t\t\t\t,0.00341809\n\t\t\t\t\t,0.443848\n\t\t\t\t\t,0.222924\n\t\t\t\t\t,0.518543\n\t\t\t\t\t,0.222924\n\t\t\t\t\t,0.518543\n\t\t\t\t\t,0.223044\n\t\t\t\t\t,0.443848\n\t\t\t\t\t,0.00353873\n\t\t\t\t\t,0.443848\n\t\t\t\t\t,0.223044\n\t\t\t\t\t,0.518543\n\t\t\t\t\t,0.00353873\n\t\t\t\t\t,0.516915\n\t\t\t\t\t,0.222924\n\t\t\t\t\t,0.442219\n\t\t\t\t\t,0.00341809\n\t\t\t\t\t,0.442219\n\t\t\t\t\t,0.222924\n\t\t\t\t\t,0.516915\n\t\t\t\t\t,0.00341809\n\t\t\t\t\t,0.516915\n\t\t\t\t\t,0.00353873\n\t\t\t\t\t,0.442219\n\t\t\t\t\t,0.00353873\n\t\t\t\t\t,0.442219\n\t\t\t\t\t,0.223044\n\t\t\t\t\t,0.516915\n\t\t\t\t\t,0.223044\n\t\t\t\t\t,0.517147\n\t\t\t\t\t,0.00341809\n\t\t\t\t\t,0.442452\n\t\t\t\t\t,0.00341809\n\t\t\t\t\t,0.442452\n\t\t\t\t\t,0.222924\n\t\t\t\t\t,0.517147\n\t\t\t\t\t,0.222924\n\t\t\t\t\t,0.517147\n\t\t\t\t\t,0.223044\n\t\t\t\t\t,0.442452\n\t\t\t\t\t,0.00353873\n\t\t\t\t\t,0.442452\n\t\t\t\t\t,0.223044\n\t\t\t\t\t,0.517147\n\t\t\t\t\t,0.00353873\n\t\t\t\t\t,0.51738\n\t\t\t\t\t,0.222924\n\t\t\t\t\t,0.442685\n\t\t\t\t\t,0.00341809\n\t\t\t\t\t,0.442685\n\t\t\t\t\t,0.222924\n\t\t\t\t\t,0.51738\n\t\t\t\t\t,0.00341809\n\t\t\t\t\t,0.51738\n\t\t\t\t\t,0.00353873\n\t\t\t\t\t,0.442685\n\t\t\t\t\t,0.00353873\n\t\t\t\t\t,0.442685\n\t\t\t\t\t,0.223044\n\t\t\t\t\t,0.51738\n\t\t\t\t\t,0.223044\n\t\t\t\t\t,0.517613\n\t\t\t\t\t,0.00341809\n\t\t\t\t\t,0.442918\n\t\t\t\t\t,0.00341809\n\t\t\t\t\t,0.442918\n\t\t\t\t\t,0.222924\n\t\t\t\t\t,0.517613\n\t\t\t\t\t,0.222924\n\t\t\t\t\t,0.517613\n\t\t\t\t\t,0.223044\n\t\t\t\t\t,0.442918\n\t\t\t\t\t,0.00353873\n\t\t\t\t\t,0.442918\n\t\t\t\t\t,0.223044\n\t\t\t\t\t,0.517613\n\t\t\t\t\t,0.00353873\n\t\t\t\t\t,0.517845\n\t\t\t\t\t,0.222924\n\t\t\t\t\t,0.44315\n\t\t\t\t\t,0.00341809\n\t\t\t\t\t,0.44315\n\t\t\t\t\t,0.222924\n\t\t\t\t\t,0.517845\n\t\t\t\t\t,0.00341809\n\t\t\t\t\t,0.517845\n\t\t\t\t\t,0.00353873\n\t\t\t\t\t,0.44315\n\t\t\t\t\t,0.00353873\n\t\t\t\t\t,0.44315\n\t\t\t\t\t,0.223044\n\t\t\t\t\t,0.517845\n\t\t\t\t\t,0.223044\n\t\t\t\t\t,0.518078\n\t\t\t\t\t,0.00341809\n\t\t\t\t\t,0.443383\n\t\t\t\t\t,0.00341809\n\t\t\t\t\t,0.443383\n\t\t\t\t\t,0.222924\n\t\t\t\t\t,0.518078\n\t\t\t\t\t,0.222924\n\t\t\t\t\t,0.518078\n\t\t\t\t\t,0.223044\n\t\t\t\t\t,0.443383\n\t\t\t\t\t,0.00353873\n\t\t\t\t\t,0.443383\n\t\t\t\t\t,0.223044\n\t\t\t\t\t,0.518078\n\t\t\t\t\t,0.00353873\n\t\t\t\t\t,0.881113\n\t\t\t\t\t,0.00552255\n\t\t\t\t\t,0.839638\n\t\t\t\t\t,0.00910175\n\t\t\t\t\t,0.868919\n\t\t\t\t\t,0.178103\n\t\t\t\t\t,0.857345\n\t\t\t\t\t,0.179102\n\t\t\t\t\t,0.868919\n\t\t\t\t\t,0.178103\n\t\t\t\t\t,0.857345\n\t\t\t\t\t,0.179102\n\t\t\t\t\t,0.881113\n\t\t\t\t\t,0.00552255\n\t\t\t\t\t,0.839638\n\t\t\t\t\t,0.00910175\n\t\t\t\t\t,0.868919\n\t\t\t\t\t,0.178103\n\t\t\t\t\t,0.881113\n\t\t\t\t\t,0.00552255\n\t\t\t\t\t,0.868919\n\t\t\t\t\t,0.178103\n\t\t\t\t\t,0.881113\n\t\t\t\t\t,0.00552255\n\t\t\t\t\t,0.839638\n\t\t\t\t\t,0.00910175\n\t\t\t\t\t,0.857345\n\t\t\t\t\t,0.179102\n\t\t\t\t\t,0.839638\n\t\t\t\t\t,0.00910175\n\t\t\t\t\t,0.857345\n\t\t\t\t\t,0.179102\n\t\t\t\t\t,0.882347\n\t\t\t\t\t,0.117749\n\t\t\t\t\t,0.940844\n\t\t\t\t\t,0.117749\n\t\t\t\t\t,0.882347\n\t\t\t\t\t,0.180999\n\t\t\t\t\t,0.940844\n\t\t\t\t\t,0.180999\n\t\t\t\t\t,0.889187\n\t\t\t\t\t,0.237412\n\t\t\t\t\t,0.917062\n\t\t\t\t\t,0.237412\n\t\t\t\t\t,0.895626\n\t\t\t\t\t,0.237412\n\t\t\t\t\t,0.923501\n\t\t\t\t\t,0.237412\n\t\t\t\t\t,0.89451\n\t\t\t\t\t,0.180999\n\t\t\t\t\t,0.953007\n\t\t\t\t\t,0.180999\n\t\t\t\t\t,0.89451\n\t\t\t\t\t,0.117749\n\t\t\t\t\t,0.953007\n\t\t\t\t\t,0.117749\n\t\t\t\t\t,0.894803\n\t\t\t\t\t,0.0530801\n\t\t\t\t\t,0.923672\n\t\t\t\t\t,0.0530801\n\t\t\t\t\t,0.888641\n\t\t\t\t\t,0.0530801\n\t\t\t\t\t,0.917509\n\t\t\t\t\t,0.0530801\n\t\t\t\t\t,0.882347\n\t\t\t\t\t,0.117749\n\t\t\t\t\t,0.882347\n\t\t\t\t\t,0.180999\n\t\t\t\t\t,0.953007\n\t\t\t\t\t,0.117749\n\t\t\t\t\t,0.953007\n\t\t\t\t\t,0.180999\n\t\t\t\t\t,0.889187\n\t\t\t\t\t,0.237412\n\t\t\t\t\t,0.917062\n\t\t\t\t\t,0.237412\n\t\t\t\t\t,0.889187\n\t\t\t\t\t,0.237412\n\t\t\t\t\t,0.917062\n\t\t\t\t\t,0.237412\n\t\t\t\t\t,0.953007\n\t\t\t\t\t,0.180999\n\t\t\t\t\t,0.923501\n\t\t\t\t\t,0.237412\n\t\t\t\t\t,0.888641\n\t\t\t\t\t,0.0530801\n\t\t\t\t\t,0.923672\n\t\t\t\t\t,0.0530801\n\t\t\t\t\t,0.917509\n\t\t\t\t\t,0.0530801\n\t\t\t\t\t,0.888641\n\t\t\t\t\t,0.0530801\n\t\t\t\t\t,0.868919\n\t\t\t\t\t,0.178103\n\t\t\t\t\t,0.839638\n\t\t\t\t\t,0.00910175\n\t\t\t\t\t,0.881113\n\t\t\t\t\t,0.00552255\n\t\t\t\t\t,0.857345\n\t\t\t\t\t,0.179102\n\t\t\t\t\t,0.881113\n\t\t\t\t\t,0.00552255\n\t\t\t\t\t,0.857345\n\t\t\t\t\t,0.179102\n\t\t\t\t\t,0.868919\n\t\t\t\t\t,0.178103\n\t\t\t\t\t,0.839638\n\t\t\t\t\t,0.00910175\n\t\t\t\t\t,0.868919\n\t\t\t\t\t,0.178103\n\t\t\t\t\t,0.881113\n\t\t\t\t\t,0.00552255\n\t\t\t\t\t,0.868919\n\t\t\t\t\t,0.178103\n\t\t\t\t\t,0.881113\n\t\t\t\t\t,0.00552255\n\t\t\t\t\t,0.839638\n\t\t\t\t\t,0.00910175\n\t\t\t\t\t,0.857345\n\t\t\t\t\t,0.179102\n\t\t\t\t\t,0.839638\n\t\t\t\t\t,0.00910175\n\t\t\t\t\t,0.857345\n\t\t\t\t\t,0.179102\n\t\t\t\t\t,0.882347\n\t\t\t\t\t,0.180999\n\t\t\t\t\t,0.940844\n\t\t\t\t\t,0.117749\n\t\t\t\t\t,0.882347\n\t\t\t\t\t,0.117749\n\t\t\t\t\t,0.940844\n\t\t\t\t\t,0.180999\n\t\t\t\t\t,0.895626\n\t\t\t\t\t,0.237412\n\t\t\t\t\t,0.917062\n\t\t\t\t\t,0.237412\n\t\t\t\t\t,0.889187\n\t\t\t\t\t,0.237412\n\t\t\t\t\t,0.923501\n\t\t\t\t\t,0.237412\n\t\t\t\t\t,0.89451\n\t\t\t\t\t,0.117749\n\t\t\t\t\t,0.953007\n\t\t\t\t\t,0.180999\n\t\t\t\t\t,0.89451\n\t\t\t\t\t,0.180999\n\t\t\t\t\t,0.953007\n\t\t\t\t\t,0.117749\n\t\t\t\t\t,0.888641\n\t\t\t\t\t,0.0530801\n\t\t\t\t\t,0.923672\n\t\t\t\t\t,0.0530801\n\t\t\t\t\t,0.894803\n\t\t\t\t\t,0.0530801\n\t\t\t\t\t,0.917509\n\t\t\t\t\t,0.0530801\n\t\t\t\t\t,0.882347\n\t\t\t\t\t,0.117749\n\t\t\t\t\t,0.882347\n\t\t\t\t\t,0.180999\n\t\t\t\t\t,0.953007\n\t\t\t\t\t,0.117749\n\t\t\t\t\t,0.953007\n\t\t\t\t\t,0.180999\n\t\t\t\t\t,0.889187\n\t\t\t\t\t,0.237412\n\t\t\t\t\t,0.917062\n\t\t\t\t\t,0.237412\n\t\t\t\t\t,0.895626\n\t\t\t\t\t,0.237412\n\t\t\t\t\t,0.889187\n\t\t\t\t\t,0.237412\n\t\t\t\t\t,0.953007\n\t\t\t\t\t,0.180999\n\t\t\t\t\t,0.923501\n\t\t\t\t\t,0.237412\n\t\t\t\t\t,0.895626\n\t\t\t\t\t,0.237412\n\t\t\t\t\t,0.894803\n\t\t\t\t\t,0.0530801\n\t\t\t\t\t,0.923672\n\t\t\t\t\t,0.0530801\n\t\t\t\t\t,0.888641\n\t\t\t\t\t,0.0530801\n\t\t\t\t\t,0.894803\n\t\t\t\t\t,0.0530801\n\t\t\t\t\t,0.888641\n\t\t\t\t\t,0.0530801\n\t\t\t\t\t,0.774877\n\t\t\t\t\t,0.949326\n\t\t\t\t\t,0.774877\n\t\t\t\t\t,0.771139\n\t\t\t\t\t,0.835329\n\t\t\t\t\t,0.949326\n\t\t\t\t\t,0.835329\n\t\t\t\t\t,0.771139\n\t\t\t\t\t,0.835329\n\t\t\t\t\t,0.949326\n\t\t\t\t\t,0.835329\n\t\t\t\t\t,0.771139\n\t\t\t\t\t,0.945384\n\t\t\t\t\t,0.949326\n\t\t\t\t\t,0.945384\n\t\t\t\t\t,0.771139\n\t\t\t\t\t,0.774877\n\t\t\t\t\t,0.949326\n\t\t\t\t\t,0.774877\n\t\t\t\t\t,0.771139\n\t\t\t\t\t,0.835329\n\t\t\t\t\t,0.949326\n\t\t\t\t\t,0.774877\n\t\t\t\t\t,0.771139\n\t\t\t\t\t,0.835329\n\t\t\t\t\t,0.771139\n\t\t\t\t\t,0.774877\n\t\t\t\t\t,0.949326\n\t\t\t\t\t,0.774877\n\t\t\t\t\t,0.771139\n\t\t\t\t\t,0.835329\n\t\t\t\t\t,0.949326\n\t\t\t\t\t,0.835329\n\t\t\t\t\t,0.771139\n\t\t\t\t\t,0.774877\n\t\t\t\t\t,0.949326\n\t\t\t\t\t,0.774877\n\t\t\t\t\t,0.771139\n\t\t\t\t\t,0.835329\n\t\t\t\t\t,0.949326\n\t\t\t\t\t,0.835329\n\t\t\t\t\t,0.771139\n\t\t\t\t\t,0.412102\n\t\t\t\t\t,0.00402963\n\t\t\t\t\t,0.412102\n\t\t\t\t\t,0.084874\n\t\t\t\t\t,0.412102\n\t\t\t\t\t,0.114572\n\t\t\t\t\t,0.412102\n\t\t\t\t\t,0.0914736\n\t\t\t\t\t,0.412102\n\t\t\t\t\t,0.00402963\n\t\t\t\t\t,0.412102\n\t\t\t\t\t,0.226764\n\t\t\t\t\t,0.412102\n\t\t\t\t\t,0.213565\n\t\t\t\t\t,0.260028\n\t\t\t\t\t,0.00402963\n\t\t\t\t\t,0.260028\n\t\t\t\t\t,0.0848737\n\t\t\t\t\t,0.412102\n\t\t\t\t\t,0.084874\n\t\t\t\t\t,0.260028\n\t\t\t\t\t,0.114572\n\t\t\t\t\t,0.412102\n\t\t\t\t\t,0.114572\n\t\t\t\t\t,0.412102\n\t\t\t\t\t,0.114572\n\t\t\t\t\t,0.260028\n\t\t\t\t\t,0.114572\n\t\t\t\t\t,0.260028\n\t\t\t\t\t,0.0914732\n\t\t\t\t\t,0.412102\n\t\t\t\t\t,0.0914736\n\t\t\t\t\t,0.412102\n\t\t\t\t\t,0.0914736\n\t\t\t\t\t,0.260028\n\t\t\t\t\t,0.0914732\n\t\t\t\t\t,0.260028\n\t\t\t\t\t,0.226763\n\t\t\t\t\t,0.412102\n\t\t\t\t\t,0.226764\n\t\t\t\t\t,0.412102\n\t\t\t\t\t,0.226764\n\t\t\t\t\t,0.260028\n\t\t\t\t\t,0.226763\n\t\t\t\t\t,0.260028\n\t\t\t\t\t,0.213564\n\t\t\t\t\t,0.412102\n\t\t\t\t\t,0.213565\n\t\t\t\t\t,0.412102\n\t\t\t\t\t,0.213565\n\t\t\t\t\t,0.260028\n\t\t\t\t\t,0.213564\n\t\t\t\t\t,0.260028\n\t\t\t\t\t,0.00402963\n\t\t\t\t\t,0.412102\n\t\t\t\t\t,0.00402963\n\t\t\t\t\t,0.260028\n\t\t\t\t\t,0.114572\n\t\t\t\t\t,0.260028\n\t\t\t\t\t,0.0914732\n\t\t\t\t\t,0.260028\n\t\t\t\t\t,0.00402963\n\t\t\t\t\t,0.260028\n\t\t\t\t\t,0.213564\n\t\t\t\t\t,0.260028\n\t\t\t\t\t,0.226763\n\t\t\t\t\t,0.934784\n\t\t\t\t\t,0.326831\n\t\t\t\t\t,0.934784\n\t\t\t\t\t,0.457182\n\t\t\t\t\t,0.923294\n\t\t\t\t\t,0.326831\n\t\t\t\t\t,0.923294\n\t\t\t\t\t,0.457181\n\t\t\t\t\t,0.900312\n\t\t\t\t\t,0.457181\n\t\t\t\t\t,0.900312\n\t\t\t\t\t,0.326831\n\t\t\t\t\t,0.888821\n\t\t\t\t\t,0.326831\n\t\t\t\t\t,0.888821\n\t\t\t\t\t,0.457182\n\t\t\t\t\t,0.888821\n\t\t\t\t\t,0.326831\n\t\t\t\t\t,0.888821\n\t\t\t\t\t,0.457182\n\t\t\t\t\t,0.900312\n\t\t\t\t\t,0.457181\n\t\t\t\t\t,0.900312\n\t\t\t\t\t,0.326831\n\t\t\t\t\t,0.923294\n\t\t\t\t\t,0.326831\n\t\t\t\t\t,0.923294\n\t\t\t\t\t,0.457181\n\t\t\t\t\t,0.934784\n\t\t\t\t\t,0.457182\n\t\t\t\t\t,0.934784\n\t\t\t\t\t,0.326831\n\t\t\t\t\t,0.904413\n\t\t\t\t\t,0.513888\n\t\t\t\t\t,0.915458\n\t\t\t\t\t,0.51653\n\t\t\t\t\t,0.882322\n\t\t\t\t\t,0.508605\n\t\t\t\t\t,0.871275\n\t\t\t\t\t,0.505963\n\t\t\t\t\t,0.882322\n\t\t\t\t\t,0.508605\n\t\t\t\t\t,0.871275\n\t\t\t\t\t,0.505963\n\t\t\t\t\t,0.904413\n\t\t\t\t\t,0.513889\n\t\t\t\t\t,0.915458\n\t\t\t\t\t,0.51653\n\t\t\t\t\t,0.876093\n\t\t\t\t\t,0.546958\n\t\t\t\t\t,0.883169\n\t\t\t\t\t,0.55451\n\t\t\t\t\t,0.861946\n\t\t\t\t\t,0.531853\n\t\t\t\t\t,0.854868\n\t\t\t\t\t,0.5243\n\t\t\t\t\t,0.861946\n\t\t\t\t\t,0.531853\n\t\t\t\t\t,0.854868\n\t\t\t\t\t,0.5243\n\t\t\t\t\t,0.876093\n\t\t\t\t\t,0.546958\n\t\t\t\t\t,0.883169\n\t\t\t\t\t,0.55451\n\t\t\t\t\t,0.841382\n\t\t\t\t\t,0.561143\n\t\t\t\t\t,0.843576\n\t\t\t\t\t,0.570551\n\t\t\t\t\t,0.836998\n\t\t\t\t\t,0.542327\n\t\t\t\t\t,0.834804\n\t\t\t\t\t,0.532916\n\t\t\t\t\t,0.836998\n\t\t\t\t\t,0.542327\n\t\t\t\t\t,0.834804\n\t\t\t\t\t,0.532916\n\t\t\t\t\t,0.841382\n\t\t\t\t\t,0.561143\n\t\t\t\t\t,0.843576\n\t\t\t\t\t,0.570551\n\t\t\t\t\t,0.802411\n\t\t\t\t\t,0.564268\n\t\t\t\t\t,0.802411\n\t\t\t\t\t,0.573848\n\t\t\t\t\t,0.802411\n\t\t\t\t\t,0.545101\n\t\t\t\t\t,0.802411\n\t\t\t\t\t,0.535515\n\t\t\t\t\t,0.802411\n\t\t\t\t\t,0.545101\n\t\t\t\t\t,0.802411\n\t\t\t\t\t,0.535515\n\t\t\t\t\t,0.802411\n\t\t\t\t\t,0.564268\n\t\t\t\t\t,0.802411\n\t\t\t\t\t,0.573848\n\t\t\t\t\t,0.90039\n\t\t\t\t\t,0.326536\n\t\t\t\t\t,0.900391\n\t\t\t\t\t,0.456899\n\t\t\t\t\t,0.888511\n\t\t\t\t\t,0.456899\n\t\t\t\t\t,0.88851\n\t\t\t\t\t,0.326536\n\t\t\t\t\t,0.92416\n\t\t\t\t\t,0.326536\n\t\t\t\t\t,0.92416\n\t\t\t\t\t,0.456899\n\t\t\t\t\t,0.936051\n\t\t\t\t\t,0.326536\n\t\t\t\t\t,0.936049\n\t\t\t\t\t,0.456899\n\t\t\t\t\t,0.92416\n\t\t\t\t\t,0.326536\n\t\t\t\t\t,0.924161\n\t\t\t\t\t,0.456899\n\t\t\t\t\t,0.936049\n\t\t\t\t\t,0.456899\n\t\t\t\t\t,0.936051\n\t\t\t\t\t,0.326536\n\t\t\t\t\t,0.900389\n\t\t\t\t\t,0.326536\n\t\t\t\t\t,0.900392\n\t\t\t\t\t,0.456899\n\t\t\t\t\t,0.88851\n\t\t\t\t\t,0.326536\n\t\t\t\t\t,0.888511\n\t\t\t\t\t,0.456899\n\t\t\t\t\t,0.850181\n\t\t\t\t\t,0.485973\n\t\t\t\t\t,0.850181\n\t\t\t\t\t,0.480371\n\t\t\t\t\t,0.834052\n\t\t\t\t\t,0.45498\n\t\t\t\t\t,0.834052\n\t\t\t\t\t,0.449378\n\t\t\t\t\t,0.834052\n\t\t\t\t\t,0.45498\n\t\t\t\t\t,0.834052\n\t\t\t\t\t,0.449378\n\t\t\t\t\t,0.801794\n\t\t\t\t\t,0.449378\n\t\t\t\t\t,0.801794\n\t\t\t\t\t,0.45498\n\t\t\t\t\t,0.801794\n\t\t\t\t\t,0.45498\n\t\t\t\t\t,0.801794\n\t\t\t\t\t,0.449378\n\t\t\t\t\t,0.785665\n\t\t\t\t\t,0.485973\n\t\t\t\t\t,0.785665\n\t\t\t\t\t,0.480371\n\t\t\t\t\t,0.785665\n\t\t\t\t\t,0.485973\n\t\t\t\t\t,0.785665\n\t\t\t\t\t,0.480371\n\t\t\t\t\t,0.801794\n\t\t\t\t\t,0.511362\n\t\t\t\t\t,0.801794\n\t\t\t\t\t,0.516966\n\t\t\t\t\t,0.801794\n\t\t\t\t\t,0.516966\n\t\t\t\t\t,0.801794\n\t\t\t\t\t,0.511362\n\t\t\t\t\t,0.834052\n\t\t\t\t\t,0.516966\n\t\t\t\t\t,0.834052\n\t\t\t\t\t,0.511362\n\t\t\t\t\t,0.834052\n\t\t\t\t\t,0.516966\n\t\t\t\t\t,0.834052\n\t\t\t\t\t,0.511362\n\t\t\t\t\t,0.850181\n\t\t\t\t\t,0.480371\n\t\t\t\t\t,0.850181\n\t\t\t\t\t,0.485973\n\t\t\t\t\t,0.897263\n\t\t\t\t\t,0.710387\n\t\t\t\t\t,0.897263\n\t\t\t\t\t,0.762724\n\t\t\t\t\t,0.88181\n\t\t\t\t\t,0.710387\n\t\t\t\t\t,0.88181\n\t\t\t\t\t,0.762724\n\t\t\t\t\t,0.866044\n\t\t\t\t\t,0.762724\n\t\t\t\t\t,0.866044\n\t\t\t\t\t,0.710387\n\t\t\t\t\t,0.850278\n\t\t\t\t\t,0.710387\n\t\t\t\t\t,0.850278\n\t\t\t\t\t,0.762724\n\t\t\t\t\t,0.834825\n\t\t\t\t\t,0.762724\n\t\t\t\t\t,0.834825\n\t\t\t\t\t,0.710387\n\t\t\t\t\t,0.819372\n\t\t\t\t\t,0.710387\n\t\t\t\t\t,0.819372\n\t\t\t\t\t,0.762724\n\t\t\t\t\t,0.944248\n\t\t\t\t\t,0.710387\n\t\t\t\t\t,0.944248\n\t\t\t\t\t,0.762724\n\t\t\t\t\t,0.928482\n\t\t\t\t\t,0.762724\n\t\t\t\t\t,0.928482\n\t\t\t\t\t,0.710387\n\t\t\t\t\t,0.912716\n\t\t\t\t\t,0.710387\n\t\t\t\t\t,0.912716\n\t\t\t\t\t,0.762724\n\t\t\t\t\t,0.897263\n\t\t\t\t\t,0.666883\n\t\t\t\t\t,0.882402\n\t\t\t\t\t,0.666883\n\t\t\t\t\t,0.866044\n\t\t\t\t\t,0.666883\n\t\t\t\t\t,0.849686\n\t\t\t\t\t,0.666883\n\t\t\t\t\t,0.834825\n\t\t\t\t\t,0.666883\n\t\t\t\t\t,0.819964\n\t\t\t\t\t,0.666883\n\t\t\t\t\t,0.94484\n\t\t\t\t\t,0.666883\n\t\t\t\t\t,0.928482\n\t\t\t\t\t,0.666883\n\t\t\t\t\t,0.912124\n\t\t\t\t\t,0.666883\n\t\t\t\t\t,0.897263\n\t\t\t\t\t,0.584536\n\t\t\t\t\t,0.882402\n\t\t\t\t\t,0.584536\n\t\t\t\t\t,0.866044\n\t\t\t\t\t,0.584536\n\t\t\t\t\t,0.849686\n\t\t\t\t\t,0.584536\n\t\t\t\t\t,0.834825\n\t\t\t\t\t,0.584536\n\t\t\t\t\t,0.819965\n\t\t\t\t\t,0.584536\n\t\t\t\t\t,0.944902\n\t\t\t\t\t,0.584536\n\t\t\t\t\t,0.944901\n\t\t\t\t\t,0.666883\n\t\t\t\t\t,0.928543\n\t\t\t\t\t,0.666883\n\t\t\t\t\t,0.944841\n\t\t\t\t\t,0.584536\n\t\t\t\t\t,0.928482\n\t\t\t\t\t,0.584536\n\t\t\t\t\t,0.912124\n\t\t\t\t\t,0.584536\n\t\t\t\t\t,0.740601\n\t\t\t\t\t,0.58462\n\t\t\t\t\t,0.740601\n\t\t\t\t\t,0.58462\n\t\t\t\t\t,0.786603\n\t\t\t\t\t,0.58462\n\t\t\t\t\t,0.791533\n\t\t\t\t\t,0.59326\n\t\t\t\t\t,0.791532\n\t\t\t\t\t,0.59326\n\t\t\t\t\t,0.809605\n\t\t\t\t\t,0.602334\n\t\t\t\t\t,0.740601\n\t\t\t\t\t,0.58462\n\t\t\t\t\t,0.786603\n\t\t\t\t\t,0.58462\n\t\t\t\t\t,0.740601\n\t\t\t\t\t,0.759979\n\t\t\t\t\t,0.791533\n\t\t\t\t\t,0.59326\n\t\t\t\t\t,0.786603\n\t\t\t\t\t,0.667429\n\t\t\t\t\t,0.809605\n\t\t\t\t\t,0.602334\n\t\t\t\t\t,0.809605\n\t\t\t\t\t,0.658483\n\t\t\t\t\t,0.813438\n\t\t\t\t\t,0.759979\n\t\t\t\t\t,0.786603\n\t\t\t\t\t,0.58462\n\t\t\t\t\t,0.809605\n\t\t\t\t\t,0.602334\n\t\t\t\t\t,0.809605\n\t\t\t\t\t,0.658483\n\t\t\t\t\t,0.809605\n\t\t\t\t\t,0.658483\n\t\t\t\t\t,0.786603\n\t\t\t\t\t,0.667429\n\t\t\t\t\t,0.786603\n\t\t\t\t\t,0.667429\n\t\t\t\t\t,0.786603\n\t\t\t\t\t,0.667429\n\t\t\t\t\t,0.786603\n\t\t\t\t\t,0.667429\n\t\t\t\t\t,0.813438\n\t\t\t\t\t,0.759979\n\t\t\t\t\t,0.813438\n\t\t\t\t\t,0.759979\n\t\t\t\t\t,0.740601\n\t\t\t\t\t,0.759979\n\t\t\t\t\t,0.786603\n\t\t\t\t\t,0.667429\n\t\t\t\t\t,0.791532\n\t\t\t\t\t,0.59326\n\t\t\t\t\t,0.809605\n\t\t\t\t\t,0.602334\n\t\t\t\t\t,0.813438\n\t\t\t\t\t,0.759979\n\t\t\t\t\t,0.88398\n\t\t\t\t\t,0.278045\n\t\t\t\t\t,0.913166\n\t\t\t\t\t,0.278045\n\t\t\t\t\t,0.898573\n\t\t\t\t\t,0.306463\n\t\t\t\t\t,0.927758\n\t\t\t\t\t,0.306463\n\t\t\t\t\t,0.942351\n\t\t\t\t\t,0.278045\n\t\t\t\t\t,0.927758\n\t\t\t\t\t,0.249627\n\t\t\t\t\t,0.898573\n\t\t\t\t\t,0.249627\n\t\t\t\t\t,0.802552\n\t\t\t\t\t,0.280318\n\t\t\t\t\t,0.802552\n\t\t\t\t\t,0.280318\n\t\t\t\t\t,0.821754\n\t\t\t\t\t,0.316417\n\t\t\t\t\t,0.821754\n\t\t\t\t\t,0.316417\n\t\t\t\t\t,0.860156\n\t\t\t\t\t,0.316417\n\t\t\t\t\t,0.860156\n\t\t\t\t\t,0.316417\n\t\t\t\t\t,0.879357\n\t\t\t\t\t,0.280318\n\t\t\t\t\t,0.879357\n\t\t\t\t\t,0.280318\n\t\t\t\t\t,0.879357\n\t\t\t\t\t,0.280318\n\t\t\t\t\t,0.879357\n\t\t\t\t\t,0.280318\n\t\t\t\t\t,0.860156\n\t\t\t\t\t,0.24422\n\t\t\t\t\t,0.860156\n\t\t\t\t\t,0.24422\n\t\t\t\t\t,0.821754\n\t\t\t\t\t,0.24422\n\t\t\t\t\t,0.821754\n\t\t\t\t\t,0.24422\n\t\t\t\t\t,0.802552\n\t\t\t\t\t,0.280318\n\t\t\t\t\t,0.802552\n\t\t\t\t\t,0.280318\n\t\t\t\t\t,0.690331\n\t\t\t\t\t,0.37869\n\t\t\t\t\t,0.690331\n\t\t\t\t\t,0.324926\n\t\t\t\t\t,0.879271\n\t\t\t\t\t,0.37869\n\t\t\t\t\t,0.879271\n\t\t\t\t\t,0.324926\n\t\t\t\t\t,0.689568\n\t\t\t\t\t,0.435519\n\t\t\t\t\t,0.689568\n\t\t\t\t\t,0.389436\n\t\t\t\t\t,0.880044\n\t\t\t\t\t,0.435519\n\t\t\t\t\t,0.880044\n\t\t\t\t\t,0.389436\n\t\t\t\t\t,0.689568\n\t\t\t\t\t,0.435519\n\t\t\t\t\t,0.689568\n\t\t\t\t\t,0.389436\n\t\t\t\t\t,0.880044\n\t\t\t\t\t,0.435519\n\t\t\t\t\t,0.880044\n\t\t\t\t\t,0.389436\n\t\t\t\t\t,0.689568\n\t\t\t\t\t,0.435519\n\t\t\t\t\t,0.689568\n\t\t\t\t\t,0.389436\n\t\t\t\t\t,0.880044\n\t\t\t\t\t,0.435519\n\t\t\t\t\t,0.880044\n\t\t\t\t\t,0.389436\n\t\t\t\t\t,0.689568\n\t\t\t\t\t,0.435519\n\t\t\t\t\t,0.689568\n\t\t\t\t\t,0.389436\n\t\t\t\t\t,0.880044\n\t\t\t\t\t,0.435519\n\t\t\t\t\t,0.880044\n\t\t\t\t\t,0.389436\n\t\t\t\t\t,0.200805\n\t\t\t\t\t,0.222353\n\t\t\t\t\t,0.000555187\n\t\t\t\t\t,0.222353\n\t\t\t\t\t,0.000555187\n\t\t\t\t\t,0.150136\n\t\t\t\t\t,0.200805\n\t\t\t\t\t,0.150137\n\t\t\t\t\t,0.251093\n\t\t\t\t\t,0.221904\n\t\t\t\t\t,0.251093\n\t\t\t\t\t,0.184906\n\t\t\t\t\t,0.430837\n\t\t\t\t\t,0.764583\n\t\t\t\t\t,0.252311\n\t\t\t\t\t,0.764583\n\t\t\t\t\t,0.252311\n\t\t\t\t\t,0.773707\n\t\t\t\t\t,0.430837\n\t\t\t\t\t,0.773707\n\t\t\t\t\t,0.430837\n\t\t\t\t\t,0.618906\n\t\t\t\t\t,0.252311\n\t\t\t\t\t,0.618906\n\t\t\t\t\t,0.430837\n\t\t\t\t\t,0.497254\n\t\t\t\t\t,0.252311\n\t\t\t\t\t,0.497255\n\t\t\t\t\t,0.252311\n\t\t\t\t\t,0.798037\n\t\t\t\t\t,0.430837\n\t\t\t\t\t,0.798037\n\t\t\t\t\t,0.252311\n\t\t\t\t\t,0.85278\n\t\t\t\t\t,0.430837\n\t\t\t\t\t,0.85278\n\t\t\t\t\t,0.252311\n\t\t\t\t\t,0.902961\n\t\t\t\t\t,0.430837\n\t\t\t\t\t,0.902961\n\t\t\t\t\t,0.252311\n\t\t\t\t\t,0.940977\n\t\t\t\t\t,0.430837\n\t\t\t\t\t,0.940977\n\t\t\t\t\t,0.252311\n\t\t\t\t\t,1.00302\n\t\t\t\t\t,0.430837\n\t\t\t\t\t,0.978689\n\t\t\t\t\t,0.430837\n\t\t\t\t\t,0.451078\n\t\t\t\t\t,0.252311\n\t\t\t\t\t,0.451078\n\t\t\t\t\t,0.430837\n\t\t\t\t\t,0.321949\n\t\t\t\t\t,0.252311\n\t\t\t\t\t,0.321948\n\t\t\t\t\t,0.430837\n\t\t\t\t\t,0.254156\n\t\t\t\t\t,0.252311\n\t\t\t\t\t,0.235907\n\t\t\t\t\t,-0.000121474\n\t\t\t\t\t,0.0662142\n\t\t\t\t\t,0.250417\n\t\t\t\t\t,0.0662137\n\t\t\t\t\t,0.250417\n\t\t\t\t\t,0.142609\n\t\t\t\t\t,-0.000121474\n\t\t\t\t\t,0.14261\n\t\t\t\t\t,-0.000121474\n\t\t\t\t\t,0.00445557\n\t\t\t\t\t,0.250417\n\t\t\t\t\t,0.00445557\n\t\t\t\t\t,0.958071\n\t\t\t\t\t,0.733892\n\t\t\t\t\t,0.955088\n\t\t\t\t\t,0.533297\n\t\t\t\t\t,0.953598\n\t\t\t\t\t,0.719772\n\t\t\t\t\t,0.944924\n\t\t\t\t\t,0.533379\n\t\t\t\t\t,0.942914\n\t\t\t\t\t,0.359587\n\t\t\t\t\t,0.947905\n\t\t\t\t\t,0.361242\n\t\t\t\t\t,0.972912\n\t\t\t\t\t,0.789288\n\t\t\t\t\t,0.958318\n\t\t\t\t\t,0.640138\n\t\t\t\t\t,0.957768\n\t\t\t\t\t,0.419173\n\t\t\t\t\t,0.969043\n\t\t\t\t\t,0.719585\n\t\t\t\t\t,0.981608\n\t\t\t\t\t,0.828875\n\t\t\t\t\t,0.998491\n\t\t\t\t\t,0.828826\n\t\t\t\t\t,0.9662\n\t\t\t\t\t,0.938129\n\t\t\t\t\t,0.982997\n\t\t\t\t\t,0.943179\n\t\t\t\t\t,0.919602\n\t\t\t\t\t,0.999998\n\t\t\t\t\t,0.966293\n\t\t\t\t\t,0.367036\n\t\t\t\t\t,0.953181\n\t\t\t\t\t,0.29362\n\t\t\t\t\t,0.972619\n\t\t\t\t\t,0.219828\n\t\t\t\t\t,0.95668\n\t\t\t\t\t,0.109144\n\t\t\t\t\t,0.973786\n\t\t\t\t\t,0.109144\n\t\t\t\t\t,0.964066\n\t\t\t\t\t,0.0122942\n\t\t\t\t\t,0.971064\n\t\t\t\t\t,0.00306976\n\t\t\t\t\t,0.910934\n\t\t\t\t\t,0.98652\n\t\t\t\t\t,0.526618\n\t\t\t\t\t,0.734238\n\t\t\t\t\t,0.436489\n\t\t\t\t\t,0.749387\n\t\t\t\t\t,0.436489\n\t\t\t\t\t,0.758476\n\t\t\t\t\t,0.526618\n\t\t\t\t\t,0.744085\n\t\t\t\t\t,0.526618\n\t\t\t\t\t,0.604265\n\t\t\t\t\t,0.436489\n\t\t\t\t\t,0.604265\n\t\t\t\t\t,0.526618\n\t\t\t\t\t,0.483078\n\t\t\t\t\t,0.436489\n\t\t\t\t\t,0.483078\n\t\t\t\t\t,0.436489\n\t\t\t\t\t,0.782713\n\t\t\t\t\t,0.526618\n\t\t\t\t\t,0.782713\n\t\t\t\t\t,0.526618\n\t\t\t\t\t,0.678709\n\t\t\t\t\t,0.436489\n\t\t\t\t\t,0.678709\n\t\t\t\t\t,0.436489\n\t\t\t\t\t,0.524628\n\t\t\t\t\t,0.526618\n\t\t\t\t\t,0.524628\n\t\t\t\t\t,0.526618\n\t\t\t\t\t,0.734108\n\t\t\t\t\t,0.436489\n\t\t\t\t\t,0.734108\n\t\t\t\t\t,0.436489\n\t\t\t\t\t,0.837247\n\t\t\t\t\t,0.526618\n\t\t\t\t\t,0.810317\n\t\t\t\t\t,0.526618\n\t\t\t\t\t,0.810282\n\t\t\t\t\t,0.436489\n\t\t\t\t\t,0.810282\n\t\t\t\t\t,0.436489\n\t\t\t\t\t,0.887236\n\t\t\t\t\t,0.526618\n\t\t\t\t\t,0.886501\n\t\t\t\t\t,0.436489\n\t\t\t\t\t,0.88992\n\t\t\t\t\t,0.526618\n\t\t\t\t\t,0.890022\n\t\t\t\t\t,0.436489\n\t\t\t\t\t,0.947051\n\t\t\t\t\t,0.436489\n\t\t\t\t\t,0.925107\n\t\t\t\t\t,0.526618\n\t\t\t\t\t,0.920244\n\t\t\t\t\t,0.526618\n\t\t\t\t\t,0.929642\n\t\t\t\t\t,0.481954\n\t\t\t\t\t,0.969777\n\t\t\t\t\t,0.441162\n\t\t\t\t\t,0.996667\n\t\t\t\t\t,0.436489\n\t\t\t\t\t,0.962675\n\t\t\t\t\t,0.481954\n\t\t\t\t\t,0.969777\n\t\t\t\t\t,0.436489\n\t\t\t\t\t,0.459995\n\t\t\t\t\t,0.526618\n\t\t\t\t\t,0.488272\n\t\t\t\t\t,0.526618\n\t\t\t\t\t,0.437079\n\t\t\t\t\t,0.436489\n\t\t\t\t\t,0.437079\n\t\t\t\t\t,0.436489\n\t\t\t\t\t,0.357346\n\t\t\t\t\t,0.526618\n\t\t\t\t\t,0.385623\n\t\t\t\t\t,0.526618\n\t\t\t\t\t,0.308442\n\t\t\t\t\t,0.436489\n\t\t\t\t\t,0.308442\n\t\t\t\t\t,0.436489\n\t\t\t\t\t,0.280165\n\t\t\t\t\t,0.526618\n\t\t\t\t\t,0.308442\n\t\t\t\t\t,0.526618\n\t\t\t\t\t,0.240908\n\t\t\t\t\t,0.436489\n\t\t\t\t\t,0.240908\n\t\t\t\t\t,0.526618\n\t\t\t\t\t,0.234476\n\t\t\t\t\t,0.436489\n\t\t\t\t\t,0.234476\n\t\t\t\t\t,0.526618\n\t\t\t\t\t,0.234476\n\t\t\t\t\t,0.526618\n\t\t\t\t\t,0.234476\n\t\t\t\t\t,0.436489\n\t\t\t\t\t,0.234476\n\t\t\t\t\t,0.526618\n\t\t\t\t\t,0.929642\n\t\t\t\t\t,0.526618\n\t\t\t\t\t,0.920244\n\t\t\t\t\t,0.621644\n\t\t\t\t\t,0.742645\n\t\t\t\t\t,0.733876\n\t\t\t\t\t,0.742645\n\t\t\t\t\t,0.733876\n\t\t\t\t\t,0.751677\n\t\t\t\t\t,0.621644\n\t\t\t\t\t,0.751677\n\t\t\t\t\t,0.621644\n\t\t\t\t\t,0.598429\n\t\t\t\t\t,0.733876\n\t\t\t\t\t,0.598429\n\t\t\t\t\t,0.621644\n\t\t\t\t\t,0.477999\n\t\t\t\t\t,0.733876\n\t\t\t\t\t,0.477999\n\t\t\t\t\t,0.733876\n\t\t\t\t\t,0.775763\n\t\t\t\t\t,0.621644\n\t\t\t\t\t,0.775763\n\t\t\t\t\t,0.733876\n\t\t\t\t\t,0.829957\n\t\t\t\t\t,0.621644\n\t\t\t\t\t,0.829957\n\t\t\t\t\t,0.733876\n\t\t\t\t\t,0.879635\n\t\t\t\t\t,0.621644\n\t\t\t\t\t,0.879635\n\t\t\t\t\t,0.733876\n\t\t\t\t\t,0.917269\n\t\t\t\t\t,0.621644\n\t\t\t\t\t,0.917269\n\t\t\t\t\t,0.673644\n\t\t\t\t\t,0.988334\n\t\t\t\t\t,0.733876\n\t\t\t\t\t,0.989226\n\t\t\t\t\t,0.66761\n\t\t\t\t\t,0.99523\n\t\t\t\t\t,0.766348\n\t\t\t\t\t,0.954602\n\t\t\t\t\t,0.638281\n\t\t\t\t\t,0.954602\n\t\t\t\t\t,0.766348\n\t\t\t\t\t,0.954602\n\t\t\t\t\t,0.733876\n\t\t\t\t\t,0.989226\n\t\t\t\t\t,0.673644\n\t\t\t\t\t,0.988334\n\t\t\t\t\t,0.590846\n\t\t\t\t\t,0.432286\n\t\t\t\t\t,0.673761\n\t\t\t\t\t,0.432286\n\t\t\t\t\t,0.573718\n\t\t\t\t\t,0.304453\n\t\t\t\t\t,0.64033\n\t\t\t\t\t,0.304453\n\t\t\t\t\t,0.537558\n\t\t\t\t\t,0.23734\n\t\t\t\t\t,0.56975\n\t\t\t\t\t,0.23734\n\t\t\t\t\t,0.854111\n\t\t\t\t\t,0.996865\n\t\t\t\t\t,0.937655\n\t\t\t\t\t,0.961534\n\t\t\t\t\t,0.784045\n\t\t\t\t\t,0.961535\n\t\t\t\t\t,0.784045\n\t\t\t\t\t,0.996865\n\t\t\t\t\t,0.191293\n\t\t\t\t\t,0.818675\n\t\t\t\t\t,0.000912905\n\t\t\t\t\t,0.788956\n\t\t\t\t\t,0.000912905\n\t\t\t\t\t,0.753128\n\t\t\t\t\t,0.191293\n\t\t\t\t\t,0.753128\n\t\t\t\t\t,0.0877513\n\t\t\t\t\t,0.912057\n\t\t\t\t\t,0.000912905\n\t\t\t\t\t,0.914115\n\t\t\t\t\t,0.000912905\n\t\t\t\t\t,0.791362\n\t\t\t\t\t,0.0877513\n\t\t\t\t\t,0.842487\n\t\t\t\t\t,0.191293\n\t\t\t\t\t,0.936363\n\t\t\t\t\t,0.000912905\n\t\t\t\t\t,0.959826\n\t\t\t\t\t,0.000912905\n\t\t\t\t\t,0.910666\n\t\t\t\t\t,0.191293\n\t\t\t\t\t,0.887203\n\t\t\t\t\t,0.191293\n\t\t\t\t\t,0.991731\n\t\t\t\t\t,0.000912905\n\t\t\t\t\t,0.998317\n\t\t\t\t\t,0.238369\n\t\t\t\t\t,0.818675\n\t\t\t\t\t,0.238369\n\t\t\t\t\t,0.753128\n\t\t\t\t\t,0.238369\n\t\t\t\t\t,0.887203\n\t\t\t\t\t,0.238369\n\t\t\t\t\t,0.936363\n\t\t\t\t\t,0.238369\n\t\t\t\t\t,0.98576\n\t\t\t\t\t,0.238369\n\t\t\t\t\t,0.98576\n\t\t\t\t\t,0.000912905\n\t\t\t\t\t,0.914115\n\t\t\t\t\t,0.000912905\n\t\t\t\t\t,0.910666\n\t\t\t\t\t,0.000912905\n\t\t\t\t\t,0.788956\n\t\t\t\t\t,0.000912905\n\t\t\t\t\t,0.791362\n\t\t\t\t\t,0.193801\n\t\t\t\t\t,0.715195\n\t\t\t\t\t,0.00120509\n\t\t\t\t\t,0.715195\n\t\t\t\t\t,0.00120509\n\t\t\t\t\t,0.536951\n\t\t\t\t\t,0.193801\n\t\t\t\t\t,0.536951\n\t\t\t\t\t,0.193801\n\t\t\t\t\t,0.751721\n\t\t\t\t\t,0.00120509\n\t\t\t\t\t,0.751722\n\t\t\t\t\t,0.00120509\n\t\t\t\t\t,0.470686\n\t\t\t\t\t,0.193801\n\t\t\t\t\t,0.470686\n\t\t\t\t\t,0.241908\n\t\t\t\t\t,0.694923\n\t\t\t\t\t,0.241908\n\t\t\t\t\t,0.536951\n\t\t\t\t\t,0.241908\n\t\t\t\t\t,0.751721\n\t\t\t\t\t,0.241908\n\t\t\t\t\t,0.751721\n\t\t\t\t\t,0.241908\n\t\t\t\t\t,0.470686\n\t\t\t\t\t,0.19682\n\t\t\t\t\t,0.468498\n\t\t\t\t\t,0.001445\n\t\t\t\t\t,0.468498\n\t\t\t\t\t,0.001445\n\t\t\t\t\t,0.368241\n\t\t\t\t\t,0.19682\n\t\t\t\t\t,0.36824\n\t\t\t\t\t,0.001445\n\t\t\t\t\t,0.292857\n\t\t\t\t\t,0.19682\n\t\t\t\t\t,0.292858\n\t\t\t\t\t,0.001445\n\t\t\t\t\t,0.230478\n\t\t\t\t\t,0.19682\n\t\t\t\t\t,0.248233\n\t\t\t\t\t,0.243662\n\t\t\t\t\t,0.466545\n\t\t\t\t\t,0.243662\n\t\t\t\t\t,0.366287\n\t\t\t\t\t,0.243662\n\t\t\t\t\t,0.290905\n\t\t\t\t\t,0.243662\n\t\t\t\t\t,0.24628\n\t\t\t\t\t,0.774877\n\t\t\t\t\t,0.949326\n\t\t\t\t\t,0.774877\n\t\t\t\t\t,0.771139\n\t\t\t\t\t,0.835329\n\t\t\t\t\t,0.949326\n\t\t\t\t\t,0.835329\n\t\t\t\t\t,0.771139\n\t\t\t\t\t,0.835329\n\t\t\t\t\t,0.949326\n\t\t\t\t\t,0.835329\n\t\t\t\t\t,0.771139\n\t\t\t\t\t,0.945384\n\t\t\t\t\t,0.949326\n\t\t\t\t\t,0.945384\n\t\t\t\t\t,0.771139\n\t\t\t\t\t,0.774877\n\t\t\t\t\t,0.949326\n\t\t\t\t\t,0.774877\n\t\t\t\t\t,0.771139\n\t\t\t\t\t,0.835329\n\t\t\t\t\t,0.949326\n\t\t\t\t\t,0.774877\n\t\t\t\t\t,0.771139\n\t\t\t\t\t,0.835329\n\t\t\t\t\t,0.771139\n\t\t\t\t\t,0.774877\n\t\t\t\t\t,0.949326\n\t\t\t\t\t,0.774877\n\t\t\t\t\t,0.771139\n\t\t\t\t\t,0.835329\n\t\t\t\t\t,0.949326\n\t\t\t\t\t,0.835329\n\t\t\t\t\t,0.771139\n\t\t\t\t\t,0.774877\n\t\t\t\t\t,0.949326\n\t\t\t\t\t,0.774877\n\t\t\t\t\t,0.771139\n\t\t\t\t\t,0.835329\n\t\t\t\t\t,0.949326\n\t\t\t\t\t,0.835329\n\t\t\t\t\t,0.771139\n\t\t\t\t\t,0.934784\n\t\t\t\t\t,0.326831\n\t\t\t\t\t,0.934784\n\t\t\t\t\t,0.457182\n\t\t\t\t\t,0.923294\n\t\t\t\t\t,0.326831\n\t\t\t\t\t,0.923294\n\t\t\t\t\t,0.457181\n\t\t\t\t\t,0.900312\n\t\t\t\t\t,0.457181\n\t\t\t\t\t,0.900312\n\t\t\t\t\t,0.326831\n\t\t\t\t\t,0.888821\n\t\t\t\t\t,0.326831\n\t\t\t\t\t,0.888821\n\t\t\t\t\t,0.457182\n\t\t\t\t\t,0.888821\n\t\t\t\t\t,0.326831\n\t\t\t\t\t,0.888821\n\t\t\t\t\t,0.457182\n\t\t\t\t\t,0.900312\n\t\t\t\t\t,0.457181\n\t\t\t\t\t,0.900312\n\t\t\t\t\t,0.326831\n\t\t\t\t\t,0.923294\n\t\t\t\t\t,0.326831\n\t\t\t\t\t,0.923294\n\t\t\t\t\t,0.457181\n\t\t\t\t\t,0.934784\n\t\t\t\t\t,0.457182\n\t\t\t\t\t,0.934784\n\t\t\t\t\t,0.326831\n\t\t\t\t\t,0.904413\n\t\t\t\t\t,0.513888\n\t\t\t\t\t,0.915458\n\t\t\t\t\t,0.51653\n\t\t\t\t\t,0.882322\n\t\t\t\t\t,0.508605\n\t\t\t\t\t,0.871275\n\t\t\t\t\t,0.505963\n\t\t\t\t\t,0.882322\n\t\t\t\t\t,0.508605\n\t\t\t\t\t,0.871275\n\t\t\t\t\t,0.505963\n\t\t\t\t\t,0.904413\n\t\t\t\t\t,0.513889\n\t\t\t\t\t,0.915458\n\t\t\t\t\t,0.51653\n\t\t\t\t\t,0.876093\n\t\t\t\t\t,0.546958\n\t\t\t\t\t,0.883169\n\t\t\t\t\t,0.55451\n\t\t\t\t\t,0.861946\n\t\t\t\t\t,0.531853\n\t\t\t\t\t,0.854868\n\t\t\t\t\t,0.5243\n\t\t\t\t\t,0.861946\n\t\t\t\t\t,0.531853\n\t\t\t\t\t,0.854868\n\t\t\t\t\t,0.5243\n\t\t\t\t\t,0.876093\n\t\t\t\t\t,0.546958\n\t\t\t\t\t,0.883169\n\t\t\t\t\t,0.55451\n\t\t\t\t\t,0.841382\n\t\t\t\t\t,0.561143\n\t\t\t\t\t,0.843576\n\t\t\t\t\t,0.570551\n\t\t\t\t\t,0.836998\n\t\t\t\t\t,0.542327\n\t\t\t\t\t,0.834804\n\t\t\t\t\t,0.532916\n\t\t\t\t\t,0.836998\n\t\t\t\t\t,0.542327\n\t\t\t\t\t,0.834804\n\t\t\t\t\t,0.532916\n\t\t\t\t\t,0.841382\n\t\t\t\t\t,0.561143\n\t\t\t\t\t,0.843576\n\t\t\t\t\t,0.570551\n\t\t\t\t\t,0.802411\n\t\t\t\t\t,0.564268\n\t\t\t\t\t,0.802411\n\t\t\t\t\t,0.573848\n\t\t\t\t\t,0.802411\n\t\t\t\t\t,0.545101\n\t\t\t\t\t,0.802411\n\t\t\t\t\t,0.535515\n\t\t\t\t\t,0.802411\n\t\t\t\t\t,0.545101\n\t\t\t\t\t,0.802411\n\t\t\t\t\t,0.535515\n\t\t\t\t\t,0.802411\n\t\t\t\t\t,0.564268\n\t\t\t\t\t,0.802411\n\t\t\t\t\t,0.573848\n\t\t\t\t\t,0.90039\n\t\t\t\t\t,0.326536\n\t\t\t\t\t,0.900391\n\t\t\t\t\t,0.456899\n\t\t\t\t\t,0.888511\n\t\t\t\t\t,0.456899\n\t\t\t\t\t,0.88851\n\t\t\t\t\t,0.326536\n\t\t\t\t\t,0.92416\n\t\t\t\t\t,0.326536\n\t\t\t\t\t,0.92416\n\t\t\t\t\t,0.456899\n\t\t\t\t\t,0.936051\n\t\t\t\t\t,0.326536\n\t\t\t\t\t,0.936049\n\t\t\t\t\t,0.456899\n\t\t\t\t\t,0.92416\n\t\t\t\t\t,0.326536\n\t\t\t\t\t,0.924161\n\t\t\t\t\t,0.456899\n\t\t\t\t\t,0.936049\n\t\t\t\t\t,0.456899\n\t\t\t\t\t,0.936051\n\t\t\t\t\t,0.326536\n\t\t\t\t\t,0.900389\n\t\t\t\t\t,0.326536\n\t\t\t\t\t,0.900392\n\t\t\t\t\t,0.456899\n\t\t\t\t\t,0.88851\n\t\t\t\t\t,0.326536\n\t\t\t\t\t,0.888511\n\t\t\t\t\t,0.456899\n\t\t\t\t\t,0.88398\n\t\t\t\t\t,0.278045\n\t\t\t\t\t,0.913166\n\t\t\t\t\t,0.278045\n\t\t\t\t\t,0.898573\n\t\t\t\t\t,0.306463\n\t\t\t\t\t,0.927758\n\t\t\t\t\t,0.306463\n\t\t\t\t\t,0.942351\n\t\t\t\t\t,0.278045\n\t\t\t\t\t,0.927758\n\t\t\t\t\t,0.249627\n\t\t\t\t\t,0.898573\n\t\t\t\t\t,0.249627\n\t\t\t\t\t,0.802552\n\t\t\t\t\t,0.280318\n\t\t\t\t\t,0.802552\n\t\t\t\t\t,0.280318\n\t\t\t\t\t,0.821754\n\t\t\t\t\t,0.316417\n\t\t\t\t\t,0.821754\n\t\t\t\t\t,0.316417\n\t\t\t\t\t,0.860156\n\t\t\t\t\t,0.316417\n\t\t\t\t\t,0.860156\n\t\t\t\t\t,0.316417\n\t\t\t\t\t,0.879357\n\t\t\t\t\t,0.280318\n\t\t\t\t\t,0.879357\n\t\t\t\t\t,0.280318\n\t\t\t\t\t,0.879357\n\t\t\t\t\t,0.280318\n\t\t\t\t\t,0.879357\n\t\t\t\t\t,0.280318\n\t\t\t\t\t,0.860156\n\t\t\t\t\t,0.24422\n\t\t\t\t\t,0.860156\n\t\t\t\t\t,0.24422\n\t\t\t\t\t,0.821754\n\t\t\t\t\t,0.24422\n\t\t\t\t\t,0.821754\n\t\t\t\t\t,0.24422\n\t\t\t\t\t,0.802552\n\t\t\t\t\t,0.280318\n\t\t\t\t\t,0.802552\n\t\t\t\t\t,0.280318\n\t\t\t\t\t,0.740601\n\t\t\t\t\t,0.58462\n\t\t\t\t\t,0.740601\n\t\t\t\t\t,0.58462\n\t\t\t\t\t,0.786603\n\t\t\t\t\t,0.58462\n\t\t\t\t\t,0.791533\n\t\t\t\t\t,0.59326\n\t\t\t\t\t,0.791532\n\t\t\t\t\t,0.59326\n\t\t\t\t\t,0.809605\n\t\t\t\t\t,0.602334\n\t\t\t\t\t,0.740601\n\t\t\t\t\t,0.58462\n\t\t\t\t\t,0.786603\n\t\t\t\t\t,0.58462\n\t\t\t\t\t,0.740601\n\t\t\t\t\t,0.759979\n\t\t\t\t\t,0.791533\n\t\t\t\t\t,0.59326\n\t\t\t\t\t,0.786603\n\t\t\t\t\t,0.667429\n\t\t\t\t\t,0.809605\n\t\t\t\t\t,0.602334\n\t\t\t\t\t,0.809605\n\t\t\t\t\t,0.658483\n\t\t\t\t\t,0.813438\n\t\t\t\t\t,0.759979\n\t\t\t\t\t,0.786603\n\t\t\t\t\t,0.58462\n\t\t\t\t\t,0.809605\n\t\t\t\t\t,0.602334\n\t\t\t\t\t,0.809605\n\t\t\t\t\t,0.658483\n\t\t\t\t\t,0.809605\n\t\t\t\t\t,0.658483\n\t\t\t\t\t,0.786603\n\t\t\t\t\t,0.667429\n\t\t\t\t\t,0.786603\n\t\t\t\t\t,0.667429\n\t\t\t\t\t,0.786603\n\t\t\t\t\t,0.667429\n\t\t\t\t\t,0.786603\n\t\t\t\t\t,0.667429\n\t\t\t\t\t,0.813438\n\t\t\t\t\t,0.759979\n\t\t\t\t\t,0.813438\n\t\t\t\t\t,0.759979\n\t\t\t\t\t,0.740601\n\t\t\t\t\t,0.759979\n\t\t\t\t\t,0.786603\n\t\t\t\t\t,0.667429\n\t\t\t\t\t,0.791532\n\t\t\t\t\t,0.59326\n\t\t\t\t\t,0.809605\n\t\t\t\t\t,0.602334\n\t\t\t\t\t,0.813438\n\t\t\t\t\t,0.759979\n\t\t\t\t\t,0.897263\n\t\t\t\t\t,0.710387\n\t\t\t\t\t,0.897263\n\t\t\t\t\t,0.762724\n\t\t\t\t\t,0.88181\n\t\t\t\t\t,0.710387\n\t\t\t\t\t,0.88181\n\t\t\t\t\t,0.762724\n\t\t\t\t\t,0.866044\n\t\t\t\t\t,0.762724\n\t\t\t\t\t,0.866044\n\t\t\t\t\t,0.710387\n\t\t\t\t\t,0.850278\n\t\t\t\t\t,0.710387\n\t\t\t\t\t,0.850278\n\t\t\t\t\t,0.762724\n\t\t\t\t\t,0.834825\n\t\t\t\t\t,0.762724\n\t\t\t\t\t,0.834825\n\t\t\t\t\t,0.710387\n\t\t\t\t\t,0.819372\n\t\t\t\t\t,0.710387\n\t\t\t\t\t,0.819372\n\t\t\t\t\t,0.762724\n\t\t\t\t\t,0.944248\n\t\t\t\t\t,0.710387\n\t\t\t\t\t,0.944248\n\t\t\t\t\t,0.762724\n\t\t\t\t\t,0.928482\n\t\t\t\t\t,0.762724\n\t\t\t\t\t,0.928482\n\t\t\t\t\t,0.710387\n\t\t\t\t\t,0.912716\n\t\t\t\t\t,0.710387\n\t\t\t\t\t,0.912716\n\t\t\t\t\t,0.762724\n\t\t\t\t\t,0.897263\n\t\t\t\t\t,0.666883\n\t\t\t\t\t,0.882402\n\t\t\t\t\t,0.666883\n\t\t\t\t\t,0.866044\n\t\t\t\t\t,0.666883\n\t\t\t\t\t,0.849686\n\t\t\t\t\t,0.666883\n\t\t\t\t\t,0.834825\n\t\t\t\t\t,0.666883\n\t\t\t\t\t,0.819964\n\t\t\t\t\t,0.666883\n\t\t\t\t\t,0.94484\n\t\t\t\t\t,0.666883\n\t\t\t\t\t,0.928482\n\t\t\t\t\t,0.666883\n\t\t\t\t\t,0.912124\n\t\t\t\t\t,0.666883\n\t\t\t\t\t,0.897263\n\t\t\t\t\t,0.584536\n\t\t\t\t\t,0.882402\n\t\t\t\t\t,0.584536\n\t\t\t\t\t,0.866044\n\t\t\t\t\t,0.584536\n\t\t\t\t\t,0.849686\n\t\t\t\t\t,0.584536\n\t\t\t\t\t,0.834825\n\t\t\t\t\t,0.584536\n\t\t\t\t\t,0.819965\n\t\t\t\t\t,0.584536\n\t\t\t\t\t,0.944902\n\t\t\t\t\t,0.584536\n\t\t\t\t\t,0.944901\n\t\t\t\t\t,0.666883\n\t\t\t\t\t,0.928543\n\t\t\t\t\t,0.666883\n\t\t\t\t\t,0.944841\n\t\t\t\t\t,0.584536\n\t\t\t\t\t,0.928482\n\t\t\t\t\t,0.584536\n\t\t\t\t\t,0.912124\n\t\t\t\t\t,0.584536\n\t\t\t\t\t,0.835329\n\t\t\t\t\t,0.949326\n\t\t\t\t\t,0.774877\n\t\t\t\t\t,0.771139\n\t\t\t\t\t,0.774877\n\t\t\t\t\t,0.949326\n\t\t\t\t\t,0.835329\n\t\t\t\t\t,0.771139\n\t\t\t\t\t,0.945384\n\t\t\t\t\t,0.949326\n\t\t\t\t\t,0.835329\n\t\t\t\t\t,0.771139\n\t\t\t\t\t,0.835329\n\t\t\t\t\t,0.949326\n\t\t\t\t\t,0.945384\n\t\t\t\t\t,0.771139\n\t\t\t\t\t,0.835329\n\t\t\t\t\t,0.949326\n\t\t\t\t\t,0.774877\n\t\t\t\t\t,0.771139\n\t\t\t\t\t,0.774877\n\t\t\t\t\t,0.949326\n\t\t\t\t\t,0.835329\n\t\t\t\t\t,0.771139\n\t\t\t\t\t,0.774877\n\t\t\t\t\t,0.771139\n\t\t\t\t\t,0.835329\n\t\t\t\t\t,0.949326\n\t\t\t\t\t,0.774877\n\t\t\t\t\t,0.771139\n\t\t\t\t\t,0.774877\n\t\t\t\t\t,0.949326\n\t\t\t\t\t,0.835329\n\t\t\t\t\t,0.771139\n\t\t\t\t\t,0.835329\n\t\t\t\t\t,0.949326\n\t\t\t\t\t,0.774877\n\t\t\t\t\t,0.771139\n\t\t\t\t\t,0.774877\n\t\t\t\t\t,0.949326\n\t\t\t\t\t,0.835329\n\t\t\t\t\t,0.771139\n\t\t\t\t\t,0.412102\n\t\t\t\t\t,0.114572\n\t\t\t\t\t,0.412102\n\t\t\t\t\t,0.084874\n\t\t\t\t\t,0.412102\n\t\t\t\t\t,0.00402963\n\t\t\t\t\t,0.412102\n\t\t\t\t\t,0.0914736\n\t\t\t\t\t,0.412102\n\t\t\t\t\t,0.00402963\n\t\t\t\t\t,0.412102\n\t\t\t\t\t,0.213565\n\t\t\t\t\t,0.412102\n\t\t\t\t\t,0.226764\n\t\t\t\t\t,0.260028\n\t\t\t\t\t,0.0848737\n\t\t\t\t\t,0.260028\n\t\t\t\t\t,0.00402963\n\t\t\t\t\t,0.412102\n\t\t\t\t\t,0.00402963\n\t\t\t\t\t,0.412102\n\t\t\t\t\t,0.084874\n\t\t\t\t\t,0.260028\n\t\t\t\t\t,0.114572\n\t\t\t\t\t,0.412102\n\t\t\t\t\t,0.114572\n\t\t\t\t\t,0.260028\n\t\t\t\t\t,0.0914732\n\t\t\t\t\t,0.260028\n\t\t\t\t\t,0.114572\n\t\t\t\t\t,0.412102\n\t\t\t\t\t,0.114572\n\t\t\t\t\t,0.412102\n\t\t\t\t\t,0.0914736\n\t\t\t\t\t,0.260028\n\t\t\t\t\t,0.226763\n\t\t\t\t\t,0.260028\n\t\t\t\t\t,0.0914732\n\t\t\t\t\t,0.412102\n\t\t\t\t\t,0.0914736\n\t\t\t\t\t,0.412102\n\t\t\t\t\t,0.226764\n\t\t\t\t\t,0.260028\n\t\t\t\t\t,0.213564\n\t\t\t\t\t,0.260028\n\t\t\t\t\t,0.226763\n\t\t\t\t\t,0.412102\n\t\t\t\t\t,0.226764\n\t\t\t\t\t,0.260028\n\t\t\t\t\t,0.00402963\n\t\t\t\t\t,0.260028\n\t\t\t\t\t,0.213564\n\t\t\t\t\t,0.260028\n\t\t\t\t\t,0.00402963\n\t\t\t\t\t,0.260028\n\t\t\t\t\t,0.0848737\n\t\t\t\t\t,0.260028\n\t\t\t\t\t,0.114572\n\t\t\t\t\t,0.260028\n\t\t\t\t\t,0.0914732\n\t\t\t\t\t,0.260028\n\t\t\t\t\t,0.226763\n\t\t\t\t\t,0.260028\n\t\t\t\t\t,0.213564\n\t\t\t\t\t,0.923294\n\t\t\t\t\t,0.326831\n\t\t\t\t\t,0.934784\n\t\t\t\t\t,0.457182\n\t\t\t\t\t,0.934784\n\t\t\t\t\t,0.326831\n\t\t\t\t\t,0.923294\n\t\t\t\t\t,0.457181\n\t\t\t\t\t,0.900312\n\t\t\t\t\t,0.457181\n\t\t\t\t\t,0.900312\n\t\t\t\t\t,0.326831\n\t\t\t\t\t,0.888821\n\t\t\t\t\t,0.326831\n\t\t\t\t\t,0.888821\n\t\t\t\t\t,0.457182\n\t\t\t\t\t,0.900312\n\t\t\t\t\t,0.457181\n\t\t\t\t\t,0.888821\n\t\t\t\t\t,0.457182\n\t\t\t\t\t,0.888821\n\t\t\t\t\t,0.326831\n\t\t\t\t\t,0.900312\n\t\t\t\t\t,0.326831\n\t\t\t\t\t,0.923294\n\t\t\t\t\t,0.326831\n\t\t\t\t\t,0.923294\n\t\t\t\t\t,0.457181\n\t\t\t\t\t,0.934784\n\t\t\t\t\t,0.457182\n\t\t\t\t\t,0.934784\n\t\t\t\t\t,0.326831\n\t\t\t\t\t,0.904413\n\t\t\t\t\t,0.513888\n\t\t\t\t\t,0.915458\n\t\t\t\t\t,0.51653\n\t\t\t\t\t,0.882322\n\t\t\t\t\t,0.508605\n\t\t\t\t\t,0.871275\n\t\t\t\t\t,0.505963\n\t\t\t\t\t,0.882322\n\t\t\t\t\t,0.508605\n\t\t\t\t\t,0.871275\n\t\t\t\t\t,0.505963\n\t\t\t\t\t,0.904413\n\t\t\t\t\t,0.513889\n\t\t\t\t\t,0.915458\n\t\t\t\t\t,0.51653\n\t\t\t\t\t,0.876093\n\t\t\t\t\t,0.546958\n\t\t\t\t\t,0.883169\n\t\t\t\t\t,0.55451\n\t\t\t\t\t,0.861946\n\t\t\t\t\t,0.531853\n\t\t\t\t\t,0.854868\n\t\t\t\t\t,0.5243\n\t\t\t\t\t,0.861946\n\t\t\t\t\t,0.531853\n\t\t\t\t\t,0.854868\n\t\t\t\t\t,0.5243\n\t\t\t\t\t,0.876093\n\t\t\t\t\t,0.546958\n\t\t\t\t\t,0.883169\n\t\t\t\t\t,0.55451\n\t\t\t\t\t,0.841382\n\t\t\t\t\t,0.561143\n\t\t\t\t\t,0.843576\n\t\t\t\t\t,0.570551\n\t\t\t\t\t,0.836998\n\t\t\t\t\t,0.542327\n\t\t\t\t\t,0.834804\n\t\t\t\t\t,0.532916\n\t\t\t\t\t,0.836998\n\t\t\t\t\t,0.542327\n\t\t\t\t\t,0.834804\n\t\t\t\t\t,0.532916\n\t\t\t\t\t,0.841382\n\t\t\t\t\t,0.561143\n\t\t\t\t\t,0.843576\n\t\t\t\t\t,0.570551\n\t\t\t\t\t,0.802411\n\t\t\t\t\t,0.564268\n\t\t\t\t\t,0.802411\n\t\t\t\t\t,0.573848\n\t\t\t\t\t,0.802411\n\t\t\t\t\t,0.545101\n\t\t\t\t\t,0.802411\n\t\t\t\t\t,0.535515\n\t\t\t\t\t,0.802411\n\t\t\t\t\t,0.545101\n\t\t\t\t\t,0.802411\n\t\t\t\t\t,0.535515\n\t\t\t\t\t,0.802411\n\t\t\t\t\t,0.564268\n\t\t\t\t\t,0.802411\n\t\t\t\t\t,0.573848\n\t\t\t\t\t,0.888511\n\t\t\t\t\t,0.456899\n\t\t\t\t\t,0.900391\n\t\t\t\t\t,0.456899\n\t\t\t\t\t,0.90039\n\t\t\t\t\t,0.326536\n\t\t\t\t\t,0.88851\n\t\t\t\t\t,0.326536\n\t\t\t\t\t,0.92416\n\t\t\t\t\t,0.456899\n\t\t\t\t\t,0.92416\n\t\t\t\t\t,0.326536\n\t\t\t\t\t,0.936049\n\t\t\t\t\t,0.456899\n\t\t\t\t\t,0.936051\n\t\t\t\t\t,0.326536\n\t\t\t\t\t,0.936049\n\t\t\t\t\t,0.456899\n\t\t\t\t\t,0.924161\n\t\t\t\t\t,0.456899\n\t\t\t\t\t,0.92416\n\t\t\t\t\t,0.326536\n\t\t\t\t\t,0.936051\n\t\t\t\t\t,0.326536\n\t\t\t\t\t,0.900392\n\t\t\t\t\t,0.456899\n\t\t\t\t\t,0.900389\n\t\t\t\t\t,0.326536\n\t\t\t\t\t,0.888511\n\t\t\t\t\t,0.456899\n\t\t\t\t\t,0.88851\n\t\t\t\t\t,0.326536\n\t\t\t\t\t,0.834052\n\t\t\t\t\t,0.45498\n\t\t\t\t\t,0.850181\n\t\t\t\t\t,0.480371\n\t\t\t\t\t,0.850181\n\t\t\t\t\t,0.485973\n\t\t\t\t\t,0.834052\n\t\t\t\t\t,0.449378\n\t\t\t\t\t,0.801794\n\t\t\t\t\t,0.449378\n\t\t\t\t\t,0.834052\n\t\t\t\t\t,0.449378\n\t\t\t\t\t,0.834052\n\t\t\t\t\t,0.45498\n\t\t\t\t\t,0.801794\n\t\t\t\t\t,0.45498\n\t\t\t\t\t,0.785665\n\t\t\t\t\t,0.485973\n\t\t\t\t\t,0.801794\n\t\t\t\t\t,0.449378\n\t\t\t\t\t,0.801794\n\t\t\t\t\t,0.45498\n\t\t\t\t\t,0.785665\n\t\t\t\t\t,0.480371\n\t\t\t\t\t,0.801794\n\t\t\t\t\t,0.511362\n\t\t\t\t\t,0.785665\n\t\t\t\t\t,0.480371\n\t\t\t\t\t,0.785665\n\t\t\t\t\t,0.485973\n\t\t\t\t\t,0.801794\n\t\t\t\t\t,0.516966\n\t\t\t\t\t,0.834052\n\t\t\t\t\t,0.516966\n\t\t\t\t\t,0.801794\n\t\t\t\t\t,0.511362\n\t\t\t\t\t,0.801794\n\t\t\t\t\t,0.516966\n\t\t\t\t\t,0.834052\n\t\t\t\t\t,0.511362\n\t\t\t\t\t,0.850181\n\t\t\t\t\t,0.480371\n\t\t\t\t\t,0.834052\n\t\t\t\t\t,0.511362\n\t\t\t\t\t,0.834052\n\t\t\t\t\t,0.516966\n\t\t\t\t\t,0.850181\n\t\t\t\t\t,0.485973\n\t\t\t\t\t,0.88181\n\t\t\t\t\t,0.710387\n\t\t\t\t\t,0.897263\n\t\t\t\t\t,0.762724\n\t\t\t\t\t,0.897263\n\t\t\t\t\t,0.710387\n\t\t\t\t\t,0.88181\n\t\t\t\t\t,0.762724\n\t\t\t\t\t,0.866044\n\t\t\t\t\t,0.762724\n\t\t\t\t\t,0.866044\n\t\t\t\t\t,0.710387\n\t\t\t\t\t,0.850278\n\t\t\t\t\t,0.710387\n\t\t\t\t\t,0.850278\n\t\t\t\t\t,0.762724\n\t\t\t\t\t,0.834825\n\t\t\t\t\t,0.762724\n\t\t\t\t\t,0.834825\n\t\t\t\t\t,0.710387\n\t\t\t\t\t,0.819372\n\t\t\t\t\t,0.710387\n\t\t\t\t\t,0.819372\n\t\t\t\t\t,0.762724\n\t\t\t\t\t,0.928482\n\t\t\t\t\t,0.762724\n\t\t\t\t\t,0.944248\n\t\t\t\t\t,0.762724\n\t\t\t\t\t,0.944248\n\t\t\t\t\t,0.710387\n\t\t\t\t\t,0.928482\n\t\t\t\t\t,0.710387\n\t\t\t\t\t,0.912716\n\t\t\t\t\t,0.710387\n\t\t\t\t\t,0.912716\n\t\t\t\t\t,0.762724\n\t\t\t\t\t,0.897263\n\t\t\t\t\t,0.666883\n\t\t\t\t\t,0.882402\n\t\t\t\t\t,0.666883\n\t\t\t\t\t,0.866044\n\t\t\t\t\t,0.666883\n\t\t\t\t\t,0.849686\n\t\t\t\t\t,0.666883\n\t\t\t\t\t,0.834825\n\t\t\t\t\t,0.666883\n\t\t\t\t\t,0.819964\n\t\t\t\t\t,0.666883\n\t\t\t\t\t,0.94484\n\t\t\t\t\t,0.666883\n\t\t\t\t\t,0.928482\n\t\t\t\t\t,0.666883\n\t\t\t\t\t,0.912124\n\t\t\t\t\t,0.666883\n\t\t\t\t\t,0.897263\n\t\t\t\t\t,0.584536\n\t\t\t\t\t,0.882402\n\t\t\t\t\t,0.584536\n\t\t\t\t\t,0.866044\n\t\t\t\t\t,0.584536\n\t\t\t\t\t,0.849686\n\t\t\t\t\t,0.584536\n\t\t\t\t\t,0.834825\n\t\t\t\t\t,0.584536\n\t\t\t\t\t,0.819965\n\t\t\t\t\t,0.584536\n\t\t\t\t\t,0.928543\n\t\t\t\t\t,0.666883\n\t\t\t\t\t,0.944901\n\t\t\t\t\t,0.666883\n\t\t\t\t\t,0.944902\n\t\t\t\t\t,0.584536\n\t\t\t\t\t,0.928482\n\t\t\t\t\t,0.584536\n\t\t\t\t\t,0.944841\n\t\t\t\t\t,0.584536\n\t\t\t\t\t,0.912124\n\t\t\t\t\t,0.584536\n\t\t\t\t\t,0.786603\n\t\t\t\t\t,0.58462\n\t\t\t\t\t,0.740601\n\t\t\t\t\t,0.58462\n\t\t\t\t\t,0.740601\n\t\t\t\t\t,0.58462\n\t\t\t\t\t,0.809605\n\t\t\t\t\t,0.602334\n\t\t\t\t\t,0.791532\n\t\t\t\t\t,0.59326\n\t\t\t\t\t,0.791533\n\t\t\t\t\t,0.59326\n\t\t\t\t\t,0.740601\n\t\t\t\t\t,0.759979\n\t\t\t\t\t,0.786603\n\t\t\t\t\t,0.58462\n\t\t\t\t\t,0.786603\n\t\t\t\t\t,0.667429\n\t\t\t\t\t,0.791533\n\t\t\t\t\t,0.59326\n\t\t\t\t\t,0.809605\n\t\t\t\t\t,0.658483\n\t\t\t\t\t,0.809605\n\t\t\t\t\t,0.602334\n\t\t\t\t\t,0.813438\n\t\t\t\t\t,0.759979\n\t\t\t\t\t,0.791532\n\t\t\t\t\t,0.59326\n\t\t\t\t\t,0.786603\n\t\t\t\t\t,0.58462\n\t\t\t\t\t,0.786603\n\t\t\t\t\t,0.58462\n\t\t\t\t\t,0.809605\n\t\t\t\t\t,0.602334\n\t\t\t\t\t,0.809605\n\t\t\t\t\t,0.602334\n\t\t\t\t\t,0.791533\n\t\t\t\t\t,0.59326\n\t\t\t\t\t,0.809605\n\t\t\t\t\t,0.658483\n\t\t\t\t\t,0.786603\n\t\t\t\t\t,0.667429\n\t\t\t\t\t,0.809605\n\t\t\t\t\t,0.658483\n\t\t\t\t\t,0.786603\n\t\t\t\t\t,0.667429\n\t\t\t\t\t,0.813438\n\t\t\t\t\t,0.759979\n\t\t\t\t\t,0.786603\n\t\t\t\t\t,0.667429\n\t\t\t\t\t,0.786603\n\t\t\t\t\t,0.667429\n\t\t\t\t\t,0.813438\n\t\t\t\t\t,0.759979\n\t\t\t\t\t,0.740601\n\t\t\t\t\t,0.58462\n\t\t\t\t\t,0.786603\n\t\t\t\t\t,0.58462\n\t\t\t\t\t,0.740601\n\t\t\t\t\t,0.759979\n\t\t\t\t\t,0.791532\n\t\t\t\t\t,0.59326\n\t\t\t\t\t,0.786603\n\t\t\t\t\t,0.667429\n\t\t\t\t\t,0.809605\n\t\t\t\t\t,0.602334\n\t\t\t\t\t,0.809605\n\t\t\t\t\t,0.658483\n\t\t\t\t\t,0.813438\n\t\t\t\t\t,0.759979\n\t\t\t\t\t,0.898573\n\t\t\t\t\t,0.306463\n\t\t\t\t\t,0.913166\n\t\t\t\t\t,0.278045\n\t\t\t\t\t,0.88398\n\t\t\t\t\t,0.278045\n\t\t\t\t\t,0.927758\n\t\t\t\t\t,0.306463\n\t\t\t\t\t,0.942351\n\t\t\t\t\t,0.278045\n\t\t\t\t\t,0.927758\n\t\t\t\t\t,0.249627\n\t\t\t\t\t,0.898573\n\t\t\t\t\t,0.249627\n\t\t\t\t\t,0.821754\n\t\t\t\t\t,0.316417\n\t\t\t\t\t,0.802552\n\t\t\t\t\t,0.280318\n\t\t\t\t\t,0.802552\n\t\t\t\t\t,0.280318\n\t\t\t\t\t,0.821754\n\t\t\t\t\t,0.316417\n\t\t\t\t\t,0.860156\n\t\t\t\t\t,0.316417\n\t\t\t\t\t,0.860156\n\t\t\t\t\t,0.316417\n\t\t\t\t\t,0.879357\n\t\t\t\t\t,0.280318\n\t\t\t\t\t,0.879357\n\t\t\t\t\t,0.280318\n\t\t\t\t\t,0.860156\n\t\t\t\t\t,0.24422\n\t\t\t\t\t,0.879357\n\t\t\t\t\t,0.280318\n\t\t\t\t\t,0.879357\n\t\t\t\t\t,0.280318\n\t\t\t\t\t,0.860156\n\t\t\t\t\t,0.24422\n\t\t\t\t\t,0.821754\n\t\t\t\t\t,0.24422\n\t\t\t\t\t,0.860156\n\t\t\t\t\t,0.24422\n\t\t\t\t\t,0.821754\n\t\t\t\t\t,0.24422\n\t\t\t\t\t,0.802552\n\t\t\t\t\t,0.280318\n\t\t\t\t\t,0.821754\n\t\t\t\t\t,0.24422\n\t\t\t\t\t,0.802552\n\t\t\t\t\t,0.280318\n\t\t\t\t\t,0.879271\n\t\t\t\t\t,0.37869\n\t\t\t\t\t,0.690331\n\t\t\t\t\t,0.324926\n\t\t\t\t\t,0.690331\n\t\t\t\t\t,0.37869\n\t\t\t\t\t,0.879271\n\t\t\t\t\t,0.324926\n\t\t\t\t\t,0.880044\n\t\t\t\t\t,0.435519\n\t\t\t\t\t,0.689568\n\t\t\t\t\t,0.389436\n\t\t\t\t\t,0.689568\n\t\t\t\t\t,0.435519\n\t\t\t\t\t,0.880044\n\t\t\t\t\t,0.389436\n\t\t\t\t\t,0.880044\n\t\t\t\t\t,0.435519\n\t\t\t\t\t,0.689568\n\t\t\t\t\t,0.389436\n\t\t\t\t\t,0.689568\n\t\t\t\t\t,0.435519\n\t\t\t\t\t,0.880044\n\t\t\t\t\t,0.389436\n\t\t\t\t\t,0.880044\n\t\t\t\t\t,0.435519\n\t\t\t\t\t,0.689568\n\t\t\t\t\t,0.389436\n\t\t\t\t\t,0.689568\n\t\t\t\t\t,0.435519\n\t\t\t\t\t,0.880044\n\t\t\t\t\t,0.389436\n\t\t\t\t\t,0.880044\n\t\t\t\t\t,0.435519\n\t\t\t\t\t,0.689568\n\t\t\t\t\t,0.389436\n\t\t\t\t\t,0.689568\n\t\t\t\t\t,0.435519\n\t\t\t\t\t,0.880044\n\t\t\t\t\t,0.389436\n\t\t\t\t\t,0.000555187\n\t\t\t\t\t,0.150136\n\t\t\t\t\t,0.000555187\n\t\t\t\t\t,0.222353\n\t\t\t\t\t,0.200805\n\t\t\t\t\t,0.222353\n\t\t\t\t\t,0.200805\n\t\t\t\t\t,0.150137\n\t\t\t\t\t,0.251093\n\t\t\t\t\t,0.221904\n\t\t\t\t\t,0.251093\n\t\t\t\t\t,0.184906\n\t\t\t\t\t,0.252311\n\t\t\t\t\t,0.773707\n\t\t\t\t\t,0.252311\n\t\t\t\t\t,0.764583\n\t\t\t\t\t,0.430837\n\t\t\t\t\t,0.764583\n\t\t\t\t\t,0.430837\n\t\t\t\t\t,0.773707\n\t\t\t\t\t,0.252311\n\t\t\t\t\t,0.618906\n\t\t\t\t\t,0.430837\n\t\t\t\t\t,0.618906\n\t\t\t\t\t,0.252311\n\t\t\t\t\t,0.497255\n\t\t\t\t\t,0.430837\n\t\t\t\t\t,0.497254\n\t\t\t\t\t,0.252311\n\t\t\t\t\t,0.798037\n\t\t\t\t\t,0.430837\n\t\t\t\t\t,0.798037\n\t\t\t\t\t,0.252311\n\t\t\t\t\t,0.85278\n\t\t\t\t\t,0.430837\n\t\t\t\t\t,0.85278\n\t\t\t\t\t,0.252311\n\t\t\t\t\t,0.902961\n\t\t\t\t\t,0.430837\n\t\t\t\t\t,0.902961\n\t\t\t\t\t,0.252311\n\t\t\t\t\t,0.940977\n\t\t\t\t\t,0.430837\n\t\t\t\t\t,0.940977\n\t\t\t\t\t,0.252311\n\t\t\t\t\t,1.00302\n\t\t\t\t\t,0.430837\n\t\t\t\t\t,0.978689\n\t\t\t\t\t,0.252311\n\t\t\t\t\t,0.451078\n\t\t\t\t\t,0.430837\n\t\t\t\t\t,0.451078\n\t\t\t\t\t,0.252311\n\t\t\t\t\t,0.321948\n\t\t\t\t\t,0.430837\n\t\t\t\t\t,0.321949\n\t\t\t\t\t,0.252311\n\t\t\t\t\t,0.235907\n\t\t\t\t\t,0.430837\n\t\t\t\t\t,0.254156\n\t\t\t\t\t,0.250417\n\t\t\t\t\t,0.142609\n\t\t\t\t\t,0.250417\n\t\t\t\t\t,0.0662137\n\t\t\t\t\t,-0.000121474\n\t\t\t\t\t,0.0662142\n\t\t\t\t\t,-0.000121474\n\t\t\t\t\t,0.14261\n\t\t\t\t\t,0.250417\n\t\t\t\t\t,0.00445557\n\t\t\t\t\t,-0.000121474\n\t\t\t\t\t,0.00445557\n\t\t\t\t\t,0.953598\n\t\t\t\t\t,0.719772\n\t\t\t\t\t,0.955088\n\t\t\t\t\t,0.533297\n\t\t\t\t\t,0.958071\n\t\t\t\t\t,0.733892\n\t\t\t\t\t,0.944924\n\t\t\t\t\t,0.533379\n\t\t\t\t\t,0.942914\n\t\t\t\t\t,0.359587\n\t\t\t\t\t,0.947905\n\t\t\t\t\t,0.361242\n\t\t\t\t\t,0.958318\n\t\t\t\t\t,0.640138\n\t\t\t\t\t,0.972912\n\t\t\t\t\t,0.789288\n\t\t\t\t\t,0.957768\n\t\t\t\t\t,0.419173\n\t\t\t\t\t,0.969043\n\t\t\t\t\t,0.719585\n\t\t\t\t\t,0.998491\n\t\t\t\t\t,0.828826\n\t\t\t\t\t,0.981608\n\t\t\t\t\t,0.828875\n\t\t\t\t\t,0.982997\n\t\t\t\t\t,0.943179\n\t\t\t\t\t,0.9662\n\t\t\t\t\t,0.938129\n\t\t\t\t\t,0.919602\n\t\t\t\t\t,0.999998\n\t\t\t\t\t,0.966293\n\t\t\t\t\t,0.367036\n\t\t\t\t\t,0.953181\n\t\t\t\t\t,0.29362\n\t\t\t\t\t,0.972619\n\t\t\t\t\t,0.219828\n\t\t\t\t\t,0.95668\n\t\t\t\t\t,0.109144\n\t\t\t\t\t,0.973786\n\t\t\t\t\t,0.109144\n\t\t\t\t\t,0.964066\n\t\t\t\t\t,0.0122942\n\t\t\t\t\t,0.971064\n\t\t\t\t\t,0.00306976\n\t\t\t\t\t,0.910934\n\t\t\t\t\t,0.98652\n\t\t\t\t\t,0.436489\n\t\t\t\t\t,0.758476\n\t\t\t\t\t,0.436489\n\t\t\t\t\t,0.749387\n\t\t\t\t\t,0.526618\n\t\t\t\t\t,0.734238\n\t\t\t\t\t,0.526618\n\t\t\t\t\t,0.744085\n\t\t\t\t\t,0.436489\n\t\t\t\t\t,0.604265\n\t\t\t\t\t,0.526618\n\t\t\t\t\t,0.604265\n\t\t\t\t\t,0.436489\n\t\t\t\t\t,0.483078\n\t\t\t\t\t,0.526618\n\t\t\t\t\t,0.483078\n\t\t\t\t\t,0.436489\n\t\t\t\t\t,0.782713\n\t\t\t\t\t,0.526618\n\t\t\t\t\t,0.782713\n\t\t\t\t\t,0.436489\n\t\t\t\t\t,0.524628\n\t\t\t\t\t,0.436489\n\t\t\t\t\t,0.678709\n\t\t\t\t\t,0.526618\n\t\t\t\t\t,0.678709\n\t\t\t\t\t,0.526618\n\t\t\t\t\t,0.524628\n\t\t\t\t\t,0.436489\n\t\t\t\t\t,0.734108\n\t\t\t\t\t,0.526618\n\t\t\t\t\t,0.734108\n\t\t\t\t\t,0.436489\n\t\t\t\t\t,0.837247\n\t\t\t\t\t,0.526618\n\t\t\t\t\t,0.810317\n\t\t\t\t\t,0.526618\n\t\t\t\t\t,0.810282\n\t\t\t\t\t,0.436489\n\t\t\t\t\t,0.810282\n\t\t\t\t\t,0.436489\n\t\t\t\t\t,0.887236\n\t\t\t\t\t,0.526618\n\t\t\t\t\t,0.886501\n\t\t\t\t\t,0.436489\n\t\t\t\t\t,0.88992\n\t\t\t\t\t,0.526618\n\t\t\t\t\t,0.890022\n\t\t\t\t\t,0.436489\n\t\t\t\t\t,0.947051\n\t\t\t\t\t,0.436489\n\t\t\t\t\t,0.925107\n\t\t\t\t\t,0.526618\n\t\t\t\t\t,0.920244\n\t\t\t\t\t,0.526618\n\t\t\t\t\t,0.929642\n\t\t\t\t\t,0.441162\n\t\t\t\t\t,0.996667\n\t\t\t\t\t,0.481954\n\t\t\t\t\t,0.969777\n\t\t\t\t\t,0.436489\n\t\t\t\t\t,0.962675\n\t\t\t\t\t,0.481954\n\t\t\t\t\t,0.969777\n\t\t\t\t\t,0.436489\n\t\t\t\t\t,0.459995\n\t\t\t\t\t,0.526618\n\t\t\t\t\t,0.488272\n\t\t\t\t\t,0.436489\n\t\t\t\t\t,0.437079\n\t\t\t\t\t,0.526618\n\t\t\t\t\t,0.437079\n\t\t\t\t\t,0.436489\n\t\t\t\t\t,0.357346\n\t\t\t\t\t,0.526618\n\t\t\t\t\t,0.385623\n\t\t\t\t\t,0.436489\n\t\t\t\t\t,0.308442\n\t\t\t\t\t,0.526618\n\t\t\t\t\t,0.308442\n\t\t\t\t\t,0.436489\n\t\t\t\t\t,0.280165\n\t\t\t\t\t,0.526618\n\t\t\t\t\t,0.308442\n\t\t\t\t\t,0.436489\n\t\t\t\t\t,0.240908\n\t\t\t\t\t,0.526618\n\t\t\t\t\t,0.240908\n\t\t\t\t\t,0.436489\n\t\t\t\t\t,0.234476\n\t\t\t\t\t,0.526618\n\t\t\t\t\t,0.234476\n\t\t\t\t\t,0.526618\n\t\t\t\t\t,0.234476\n\t\t\t\t\t,0.436489\n\t\t\t\t\t,0.234476\n\t\t\t\t\t,0.526618\n\t\t\t\t\t,0.234476\n\t\t\t\t\t,0.526618\n\t\t\t\t\t,0.920244\n\t\t\t\t\t,0.526618\n\t\t\t\t\t,0.929642\n\t\t\t\t\t,0.733876\n\t\t\t\t\t,0.751677\n\t\t\t\t\t,0.733876\n\t\t\t\t\t,0.742645\n\t\t\t\t\t,0.621644\n\t\t\t\t\t,0.742645\n\t\t\t\t\t,0.621644\n\t\t\t\t\t,0.751677\n\t\t\t\t\t,0.733876\n\t\t\t\t\t,0.598429\n\t\t\t\t\t,0.621644\n\t\t\t\t\t,0.598429\n\t\t\t\t\t,0.733876\n\t\t\t\t\t,0.477999\n\t\t\t\t\t,0.621644\n\t\t\t\t\t,0.477999\n\t\t\t\t\t,0.733876\n\t\t\t\t\t,0.775763\n\t\t\t\t\t,0.621644\n\t\t\t\t\t,0.775763\n\t\t\t\t\t,0.733876\n\t\t\t\t\t,0.829957\n\t\t\t\t\t,0.621644\n\t\t\t\t\t,0.829957\n\t\t\t\t\t,0.733876\n\t\t\t\t\t,0.879635\n\t\t\t\t\t,0.621644\n\t\t\t\t\t,0.879635\n\t\t\t\t\t,0.733876\n\t\t\t\t\t,0.917269\n\t\t\t\t\t,0.621644\n\t\t\t\t\t,0.917269\n\t\t\t\t\t,0.66761\n\t\t\t\t\t,0.99523\n\t\t\t\t\t,0.733876\n\t\t\t\t\t,0.989226\n\t\t\t\t\t,0.673644\n\t\t\t\t\t,0.988334\n\t\t\t\t\t,0.766348\n\t\t\t\t\t,0.954602\n\t\t\t\t\t,0.638281\n\t\t\t\t\t,0.954602\n\t\t\t\t\t,0.766348\n\t\t\t\t\t,0.954602\n\t\t\t\t\t,0.673644\n\t\t\t\t\t,0.988334\n\t\t\t\t\t,0.733876\n\t\t\t\t\t,0.989226\n\t\t\t\t\t,0.673761\n\t\t\t\t\t,0.432286\n\t\t\t\t\t,0.590846\n\t\t\t\t\t,0.432286\n\t\t\t\t\t,0.64033\n\t\t\t\t\t,0.304453\n\t\t\t\t\t,0.573718\n\t\t\t\t\t,0.304453\n\t\t\t\t\t,0.56975\n\t\t\t\t\t,0.23734\n\t\t\t\t\t,0.537558\n\t\t\t\t\t,0.23734\n\t\t\t\t\t,0.784045\n\t\t\t\t\t,0.961535\n\t\t\t\t\t,0.937655\n\t\t\t\t\t,0.961534\n\t\t\t\t\t,0.854111\n\t\t\t\t\t,0.996865\n\t\t\t\t\t,0.784045\n\t\t\t\t\t,0.996865\n\t\t\t\t\t,0.000912905\n\t\t\t\t\t,0.753128\n\t\t\t\t\t,0.000912905\n\t\t\t\t\t,0.788956\n\t\t\t\t\t,0.191293\n\t\t\t\t\t,0.818675\n\t\t\t\t\t,0.191293\n\t\t\t\t\t,0.753128\n\t\t\t\t\t,0.000912905\n\t\t\t\t\t,0.791362\n\t\t\t\t\t,0.000912905\n\t\t\t\t\t,0.914115\n\t\t\t\t\t,0.0877513\n\t\t\t\t\t,0.912057\n\t\t\t\t\t,0.0877513\n\t\t\t\t\t,0.842487\n\t\t\t\t\t,0.000912905\n\t\t\t\t\t,0.910666\n\t\t\t\t\t,0.000912905\n\t\t\t\t\t,0.959826\n\t\t\t\t\t,0.191293\n\t\t\t\t\t,0.936363\n\t\t\t\t\t,0.191293\n\t\t\t\t\t,0.887203\n\t\t\t\t\t,0.000912905\n\t\t\t\t\t,0.998317\n\t\t\t\t\t,0.191293\n\t\t\t\t\t,0.991731\n\t\t\t\t\t,0.238369\n\t\t\t\t\t,0.818675\n\t\t\t\t\t,0.238369\n\t\t\t\t\t,0.753128\n\t\t\t\t\t,0.238369\n\t\t\t\t\t,0.887203\n\t\t\t\t\t,0.238369\n\t\t\t\t\t,0.936363\n\t\t\t\t\t,0.238369\n\t\t\t\t\t,0.98576\n\t\t\t\t\t,0.238369\n\t\t\t\t\t,0.98576\n\t\t\t\t\t,0.000912905\n\t\t\t\t\t,0.788956\n\t\t\t\t\t,0.000912905\n\t\t\t\t\t,0.910666\n\t\t\t\t\t,0.000912905\n\t\t\t\t\t,0.914115\n\t\t\t\t\t,0.000912905\n\t\t\t\t\t,0.791362\n\t\t\t\t\t,0.00120509\n\t\t\t\t\t,0.536951\n\t\t\t\t\t,0.00120509\n\t\t\t\t\t,0.715195\n\t\t\t\t\t,0.193801\n\t\t\t\t\t,0.715195\n\t\t\t\t\t,0.193801\n\t\t\t\t\t,0.536951\n\t\t\t\t\t,0.00120509\n\t\t\t\t\t,0.751722\n\t\t\t\t\t,0.193801\n\t\t\t\t\t,0.751721\n\t\t\t\t\t,0.00120509\n\t\t\t\t\t,0.470686\n\t\t\t\t\t,0.193801\n\t\t\t\t\t,0.470686\n\t\t\t\t\t,0.241908\n\t\t\t\t\t,0.694923\n\t\t\t\t\t,0.241908\n\t\t\t\t\t,0.536951\n\t\t\t\t\t,0.241908\n\t\t\t\t\t,0.751721\n\t\t\t\t\t,0.241908\n\t\t\t\t\t,0.751721\n\t\t\t\t\t,0.241908\n\t\t\t\t\t,0.470686\n\t\t\t\t\t,0.001445\n\t\t\t\t\t,0.368241\n\t\t\t\t\t,0.001445\n\t\t\t\t\t,0.468498\n\t\t\t\t\t,0.19682\n\t\t\t\t\t,0.468498\n\t\t\t\t\t,0.19682\n\t\t\t\t\t,0.36824\n\t\t\t\t\t,0.001445\n\t\t\t\t\t,0.292857\n\t\t\t\t\t,0.19682\n\t\t\t\t\t,0.292858\n\t\t\t\t\t,0.001445\n\t\t\t\t\t,0.230478\n\t\t\t\t\t,0.19682\n\t\t\t\t\t,0.248233\n\t\t\t\t\t,0.243662\n\t\t\t\t\t,0.466545\n\t\t\t\t\t,0.243662\n\t\t\t\t\t,0.366287\n\t\t\t\t\t,0.243662\n\t\t\t\t\t,0.290905\n\t\t\t\t\t,0.243662\n\t\t\t\t\t,0.24628\n\t\t\t\t\t,0.835329\n\t\t\t\t\t,0.949326\n\t\t\t\t\t,0.774877\n\t\t\t\t\t,0.771139\n\t\t\t\t\t,0.774877\n\t\t\t\t\t,0.949326\n\t\t\t\t\t,0.835329\n\t\t\t\t\t,0.771139\n\t\t\t\t\t,0.945384\n\t\t\t\t\t,0.949326\n\t\t\t\t\t,0.835329\n\t\t\t\t\t,0.771139\n\t\t\t\t\t,0.835329\n\t\t\t\t\t,0.949326\n\t\t\t\t\t,0.945384\n\t\t\t\t\t,0.771139\n\t\t\t\t\t,0.835329\n\t\t\t\t\t,0.949326\n\t\t\t\t\t,0.774877\n\t\t\t\t\t,0.771139\n\t\t\t\t\t,0.774877\n\t\t\t\t\t,0.949326\n\t\t\t\t\t,0.835329\n\t\t\t\t\t,0.771139\n\t\t\t\t\t,0.774877\n\t\t\t\t\t,0.771139\n\t\t\t\t\t,0.835329\n\t\t\t\t\t,0.949326\n\t\t\t\t\t,0.774877\n\t\t\t\t\t,0.771139\n\t\t\t\t\t,0.774877\n\t\t\t\t\t,0.949326\n\t\t\t\t\t,0.835329\n\t\t\t\t\t,0.771139\n\t\t\t\t\t,0.835329\n\t\t\t\t\t,0.949326\n\t\t\t\t\t,0.774877\n\t\t\t\t\t,0.771139\n\t\t\t\t\t,0.774877\n\t\t\t\t\t,0.949326\n\t\t\t\t\t,0.835329\n\t\t\t\t\t,0.771139\n\t\t\t\t\t,0.923294\n\t\t\t\t\t,0.326831\n\t\t\t\t\t,0.934784\n\t\t\t\t\t,0.457182\n\t\t\t\t\t,0.934784\n\t\t\t\t\t,0.326831\n\t\t\t\t\t,0.923294\n\t\t\t\t\t,0.457181\n\t\t\t\t\t,0.900312\n\t\t\t\t\t,0.457181\n\t\t\t\t\t,0.900312\n\t\t\t\t\t,0.326831\n\t\t\t\t\t,0.888821\n\t\t\t\t\t,0.326831\n\t\t\t\t\t,0.888821\n\t\t\t\t\t,0.457182\n\t\t\t\t\t,0.900312\n\t\t\t\t\t,0.457181\n\t\t\t\t\t,0.888821\n\t\t\t\t\t,0.457182\n\t\t\t\t\t,0.888821\n\t\t\t\t\t,0.326831\n\t\t\t\t\t,0.900312\n\t\t\t\t\t,0.326831\n\t\t\t\t\t,0.923294\n\t\t\t\t\t,0.326831\n\t\t\t\t\t,0.923294\n\t\t\t\t\t,0.457181\n\t\t\t\t\t,0.934784\n\t\t\t\t\t,0.457182\n\t\t\t\t\t,0.934784\n\t\t\t\t\t,0.326831\n\t\t\t\t\t,0.904413\n\t\t\t\t\t,0.513888\n\t\t\t\t\t,0.915458\n\t\t\t\t\t,0.51653\n\t\t\t\t\t,0.882322\n\t\t\t\t\t,0.508605\n\t\t\t\t\t,0.871275\n\t\t\t\t\t,0.505963\n\t\t\t\t\t,0.882322\n\t\t\t\t\t,0.508605\n\t\t\t\t\t,0.871275\n\t\t\t\t\t,0.505963\n\t\t\t\t\t,0.904413\n\t\t\t\t\t,0.513889\n\t\t\t\t\t,0.915458\n\t\t\t\t\t,0.51653\n\t\t\t\t\t,0.876093\n\t\t\t\t\t,0.546958\n\t\t\t\t\t,0.883169\n\t\t\t\t\t,0.55451\n\t\t\t\t\t,0.861946\n\t\t\t\t\t,0.531853\n\t\t\t\t\t,0.854868\n\t\t\t\t\t,0.5243\n\t\t\t\t\t,0.861946\n\t\t\t\t\t,0.531853\n\t\t\t\t\t,0.854868\n\t\t\t\t\t,0.5243\n\t\t\t\t\t,0.876093\n\t\t\t\t\t,0.546958\n\t\t\t\t\t,0.883169\n\t\t\t\t\t,0.55451\n\t\t\t\t\t,0.841382\n\t\t\t\t\t,0.561143\n\t\t\t\t\t,0.843576\n\t\t\t\t\t,0.570551\n\t\t\t\t\t,0.836998\n\t\t\t\t\t,0.542327\n\t\t\t\t\t,0.834804\n\t\t\t\t\t,0.532916\n\t\t\t\t\t,0.836998\n\t\t\t\t\t,0.542327\n\t\t\t\t\t,0.834804\n\t\t\t\t\t,0.532916\n\t\t\t\t\t,0.841382\n\t\t\t\t\t,0.561143\n\t\t\t\t\t,0.843576\n\t\t\t\t\t,0.570551\n\t\t\t\t\t,0.802411\n\t\t\t\t\t,0.564268\n\t\t\t\t\t,0.802411\n\t\t\t\t\t,0.573848\n\t\t\t\t\t,0.802411\n\t\t\t\t\t,0.545101\n\t\t\t\t\t,0.802411\n\t\t\t\t\t,0.535515\n\t\t\t\t\t,0.802411\n\t\t\t\t\t,0.545101\n\t\t\t\t\t,0.802411\n\t\t\t\t\t,0.535515\n\t\t\t\t\t,0.802411\n\t\t\t\t\t,0.564268\n\t\t\t\t\t,0.802411\n\t\t\t\t\t,0.573848\n\t\t\t\t\t,0.888511\n\t\t\t\t\t,0.456899\n\t\t\t\t\t,0.900391\n\t\t\t\t\t,0.456899\n\t\t\t\t\t,0.90039\n\t\t\t\t\t,0.326536\n\t\t\t\t\t,0.88851\n\t\t\t\t\t,0.326536\n\t\t\t\t\t,0.92416\n\t\t\t\t\t,0.456899\n\t\t\t\t\t,0.92416\n\t\t\t\t\t,0.326536\n\t\t\t\t\t,0.936049\n\t\t\t\t\t,0.456899\n\t\t\t\t\t,0.936051\n\t\t\t\t\t,0.326536\n\t\t\t\t\t,0.936049\n\t\t\t\t\t,0.456899\n\t\t\t\t\t,0.924161\n\t\t\t\t\t,0.456899\n\t\t\t\t\t,0.92416\n\t\t\t\t\t,0.326536\n\t\t\t\t\t,0.936051\n\t\t\t\t\t,0.326536\n\t\t\t\t\t,0.900392\n\t\t\t\t\t,0.456899\n\t\t\t\t\t,0.900389\n\t\t\t\t\t,0.326536\n\t\t\t\t\t,0.888511\n\t\t\t\t\t,0.456899\n\t\t\t\t\t,0.88851\n\t\t\t\t\t,0.326536\n\t\t\t\t\t,0.898573\n\t\t\t\t\t,0.306463\n\t\t\t\t\t,0.913166\n\t\t\t\t\t,0.278045\n\t\t\t\t\t,0.88398\n\t\t\t\t\t,0.278045\n\t\t\t\t\t,0.927758\n\t\t\t\t\t,0.306463\n\t\t\t\t\t,0.942351\n\t\t\t\t\t,0.278045\n\t\t\t\t\t,0.927758\n\t\t\t\t\t,0.249627\n\t\t\t\t\t,0.898573\n\t\t\t\t\t,0.249627\n\t\t\t\t\t,0.821754\n\t\t\t\t\t,0.316417\n\t\t\t\t\t,0.802552\n\t\t\t\t\t,0.280318\n\t\t\t\t\t,0.802552\n\t\t\t\t\t,0.280318\n\t\t\t\t\t,0.821754\n\t\t\t\t\t,0.316417\n\t\t\t\t\t,0.860156\n\t\t\t\t\t,0.316417\n\t\t\t\t\t,0.860156\n\t\t\t\t\t,0.316417\n\t\t\t\t\t,0.879357\n\t\t\t\t\t,0.280318\n\t\t\t\t\t,0.879357\n\t\t\t\t\t,0.280318\n\t\t\t\t\t,0.860156\n\t\t\t\t\t,0.24422\n\t\t\t\t\t,0.879357\n\t\t\t\t\t,0.280318\n\t\t\t\t\t,0.879357\n\t\t\t\t\t,0.280318\n\t\t\t\t\t,0.860156\n\t\t\t\t\t,0.24422\n\t\t\t\t\t,0.821754\n\t\t\t\t\t,0.24422\n\t\t\t\t\t,0.860156\n\t\t\t\t\t,0.24422\n\t\t\t\t\t,0.821754\n\t\t\t\t\t,0.24422\n\t\t\t\t\t,0.802552\n\t\t\t\t\t,0.280318\n\t\t\t\t\t,0.821754\n\t\t\t\t\t,0.24422\n\t\t\t\t\t,0.802552\n\t\t\t\t\t,0.280318\n\t\t\t\t\t,0.786603\n\t\t\t\t\t,0.58462\n\t\t\t\t\t,0.740601\n\t\t\t\t\t,0.58462\n\t\t\t\t\t,0.809605\n\t\t\t\t\t,0.602334\n\t\t\t\t\t,0.791532\n\t\t\t\t\t,0.59326\n\t\t\t\t\t,0.791533\n\t\t\t\t\t,0.59326\n\t\t\t\t\t,0.740601\n\t\t\t\t\t,0.759979\n\t\t\t\t\t,0.786603\n\t\t\t\t\t,0.58462\n\t\t\t\t\t,0.740601\n\t\t\t\t\t,0.58462\n\t\t\t\t\t,0.786603\n\t\t\t\t\t,0.667429\n\t\t\t\t\t,0.791533\n\t\t\t\t\t,0.59326\n\t\t\t\t\t,0.809605\n\t\t\t\t\t,0.658483\n\t\t\t\t\t,0.809605\n\t\t\t\t\t,0.602334\n\t\t\t\t\t,0.813438\n\t\t\t\t\t,0.759979\n\t\t\t\t\t,0.791532\n\t\t\t\t\t,0.59326\n\t\t\t\t\t,0.786603\n\t\t\t\t\t,0.58462\n\t\t\t\t\t,0.786603\n\t\t\t\t\t,0.58462\n\t\t\t\t\t,0.809605\n\t\t\t\t\t,0.602334\n\t\t\t\t\t,0.809605\n\t\t\t\t\t,0.602334\n\t\t\t\t\t,0.791533\n\t\t\t\t\t,0.59326\n\t\t\t\t\t,0.809605\n\t\t\t\t\t,0.658483\n\t\t\t\t\t,0.786603\n\t\t\t\t\t,0.667429\n\t\t\t\t\t,0.809605\n\t\t\t\t\t,0.658483\n\t\t\t\t\t,0.786603\n\t\t\t\t\t,0.667429\n\t\t\t\t\t,0.813438\n\t\t\t\t\t,0.759979\n\t\t\t\t\t,0.786603\n\t\t\t\t\t,0.667429\n\t\t\t\t\t,0.786603\n\t\t\t\t\t,0.667429\n\t\t\t\t\t,0.813438\n\t\t\t\t\t,0.759979\n\t\t\t\t\t,0.740601\n\t\t\t\t\t,0.58462\n\t\t\t\t\t,0.786603\n\t\t\t\t\t,0.58462\n\t\t\t\t\t,0.740601\n\t\t\t\t\t,0.759979\n\t\t\t\t\t,0.791532\n\t\t\t\t\t,0.59326\n\t\t\t\t\t,0.786603\n\t\t\t\t\t,0.667429\n\t\t\t\t\t,0.809605\n\t\t\t\t\t,0.602334\n\t\t\t\t\t,0.809605\n\t\t\t\t\t,0.658483\n\t\t\t\t\t,0.813438\n\t\t\t\t\t,0.759979\n\t\t\t\t\t,0.88181\n\t\t\t\t\t,0.710387\n\t\t\t\t\t,0.897263\n\t\t\t\t\t,0.762724\n\t\t\t\t\t,0.897263\n\t\t\t\t\t,0.710387\n\t\t\t\t\t,0.88181\n\t\t\t\t\t,0.762724\n\t\t\t\t\t,0.866044\n\t\t\t\t\t,0.762724\n\t\t\t\t\t,0.866044\n\t\t\t\t\t,0.710387\n\t\t\t\t\t,0.850278\n\t\t\t\t\t,0.710387\n\t\t\t\t\t,0.850278\n\t\t\t\t\t,0.762724\n\t\t\t\t\t,0.834825\n\t\t\t\t\t,0.762724\n\t\t\t\t\t,0.834825\n\t\t\t\t\t,0.710387\n\t\t\t\t\t,0.819372\n\t\t\t\t\t,0.710387\n\t\t\t\t\t,0.819372\n\t\t\t\t\t,0.762724\n\t\t\t\t\t,0.928482\n\t\t\t\t\t,0.762724\n\t\t\t\t\t,0.944248\n\t\t\t\t\t,0.762724\n\t\t\t\t\t,0.944248\n\t\t\t\t\t,0.710387\n\t\t\t\t\t,0.928482\n\t\t\t\t\t,0.710387\n\t\t\t\t\t,0.912716\n\t\t\t\t\t,0.710387\n\t\t\t\t\t,0.912716\n\t\t\t\t\t,0.762724\n\t\t\t\t\t,0.897263\n\t\t\t\t\t,0.666883\n\t\t\t\t\t,0.882402\n\t\t\t\t\t,0.666883\n\t\t\t\t\t,0.866044\n\t\t\t\t\t,0.666883\n\t\t\t\t\t,0.849686\n\t\t\t\t\t,0.666883\n\t\t\t\t\t,0.834825\n\t\t\t\t\t,0.666883\n\t\t\t\t\t,0.819964\n\t\t\t\t\t,0.666883\n\t\t\t\t\t,0.94484\n\t\t\t\t\t,0.666883\n\t\t\t\t\t,0.928482\n\t\t\t\t\t,0.666883\n\t\t\t\t\t,0.912124\n\t\t\t\t\t,0.666883\n\t\t\t\t\t,0.897263\n\t\t\t\t\t,0.584536\n\t\t\t\t\t,0.882402\n\t\t\t\t\t,0.584536\n\t\t\t\t\t,0.866044\n\t\t\t\t\t,0.584536\n\t\t\t\t\t,0.849686\n\t\t\t\t\t,0.584536\n\t\t\t\t\t,0.834825\n\t\t\t\t\t,0.584536\n\t\t\t\t\t,0.819965\n\t\t\t\t\t,0.584536\n\t\t\t\t\t,0.928543\n\t\t\t\t\t,0.666883\n\t\t\t\t\t,0.944901\n\t\t\t\t\t,0.666883\n\t\t\t\t\t,0.944902\n\t\t\t\t\t,0.584536\n\t\t\t\t\t,0.928482\n\t\t\t\t\t,0.584536\n\t\t\t\t\t,0.944841\n\t\t\t\t\t,0.584536\n\t\t\t\t\t,0.912124\n\t\t\t\t\t,0.584536\n\t\t\t\t\t,0.528035\n\t\t\t\t\t,0.0748031\n\t\t\t\t\t,0.528035\n\t\t\t\t\t,0.049881\n\t\t\t\t\t,0.549842\n\t\t\t\t\t,0.0748031\n\t\t\t\t\t,0.549842\n\t\t\t\t\t,0.049881\n\t\t\t\t\t,0.588696\n\t\t\t\t\t,0.0374125\n\t\t\t\t\t,0.588696\n\t\t\t\t\t,0.00158685\n\t\t\t\t\t,0.588696\n\t\t\t\t\t,0.0374125\n\t\t\t\t\t,0.588696\n\t\t\t\t\t,0.00158685\n\t\t\t\t\t,0.52016\n\t\t\t\t\t,0.0374125\n\t\t\t\t\t,0.52016\n\t\t\t\t\t,0.00158685\n\t\t\t\t\t,0.52016\n\t\t\t\t\t,0.0374125\n\t\t\t\t\t,0.52016\n\t\t\t\t\t,0.00158685\n\t\t\t\t\t,0.528035\n\t\t\t\t\t,0.0748031\n\t\t\t\t\t,0.528035\n\t\t\t\t\t,0.049881\n\t\t\t\t\t,0.549842\n\t\t\t\t\t,0.0748031\n\t\t\t\t\t,0.549842\n\t\t\t\t\t,0.049881\n\t\t\t\t\t,0.588696\n\t\t\t\t\t,0.0374125\n\t\t\t\t\t,0.588696\n\t\t\t\t\t,0.00158685\n\t\t\t\t\t,0.588696\n\t\t\t\t\t,0.0374125\n\t\t\t\t\t,0.588696\n\t\t\t\t\t,0.00158685\n\t\t\t\t\t,0.52016\n\t\t\t\t\t,0.0374125\n\t\t\t\t\t,0.52016\n\t\t\t\t\t,0.00158685\n\t\t\t\t\t,0.52016\n\t\t\t\t\t,0.0374125\n\t\t\t\t\t,0.52016\n\t\t\t\t\t,0.00158685\n\t\t\t\t\t,0.549842\n\t\t\t\t\t,0.0748031\n\t\t\t\t\t,0.528035\n\t\t\t\t\t,0.049881\n\t\t\t\t\t,0.528035\n\t\t\t\t\t,0.0748031\n\t\t\t\t\t,0.549842\n\t\t\t\t\t,0.049881\n\t\t\t\t\t,0.588696\n\t\t\t\t\t,0.0374125\n\t\t\t\t\t,0.588696\n\t\t\t\t\t,0.00158685\n\t\t\t\t\t,0.588696\n\t\t\t\t\t,0.0374125\n\t\t\t\t\t,0.588696\n\t\t\t\t\t,0.00158685\n\t\t\t\t\t,0.52016\n\t\t\t\t\t,0.0374125\n\t\t\t\t\t,0.52016\n\t\t\t\t\t,0.00158685\n\t\t\t\t\t,0.52016\n\t\t\t\t\t,0.0374125\n\t\t\t\t\t,0.52016\n\t\t\t\t\t,0.00158685\n\t\t\t\t\t,0.549842\n\t\t\t\t\t,0.0748031\n\t\t\t\t\t,0.528035\n\t\t\t\t\t,0.049881\n\t\t\t\t\t,0.528035\n\t\t\t\t\t,0.0748031\n\t\t\t\t\t,0.549842\n\t\t\t\t\t,0.049881\n\t\t\t\t\t,0.588696\n\t\t\t\t\t,0.0374125\n\t\t\t\t\t,0.588696\n\t\t\t\t\t,0.00158685\n\t\t\t\t\t,0.588696\n\t\t\t\t\t,0.0374125\n\t\t\t\t\t,0.588696\n\t\t\t\t\t,0.00158685\n\t\t\t\t\t,0.52016\n\t\t\t\t\t,0.0374125\n\t\t\t\t\t,0.52016\n\t\t\t\t\t,0.00158685\n\t\t\t\t\t,0.52016\n\t\t\t\t\t,0.0374125\n\t\t\t\t\t,0.52016\n\t\t\t\t\t,0.00158685\n\t\t\t\t\t,0.549842\n\t\t\t\t\t,0.0748031\n\t\t\t\t\t,0.528035\n\t\t\t\t\t,0.049881\n\t\t\t\t\t,0.528035\n\t\t\t\t\t,0.0748031\n\t\t\t\t\t,0.549842\n\t\t\t\t\t,0.049881\n\t\t\t\t\t,0.588696\n\t\t\t\t\t,0.0374125\n\t\t\t\t\t,0.588696\n\t\t\t\t\t,0.00158685\n\t\t\t\t\t,0.588696\n\t\t\t\t\t,0.0374125\n\t\t\t\t\t,0.588696\n\t\t\t\t\t,0.00158685\n\t\t\t\t\t,0.52016\n\t\t\t\t\t,0.0374125\n\t\t\t\t\t,0.52016\n\t\t\t\t\t,0.00158685\n\t\t\t\t\t,0.52016\n\t\t\t\t\t,0.0374125\n\t\t\t\t\t,0.52016\n\t\t\t\t\t,0.00158685\n\t\t\t\t\t,0.528035\n\t\t\t\t\t,0.0748031\n\t\t\t\t\t,0.528035\n\t\t\t\t\t,0.049881\n\t\t\t\t\t,0.549842\n\t\t\t\t\t,0.0748031\n\t\t\t\t\t,0.549842\n\t\t\t\t\t,0.049881\n\t\t\t\t\t,0.588696\n\t\t\t\t\t,0.0374125\n\t\t\t\t\t,0.588696\n\t\t\t\t\t,0.00158685\n\t\t\t\t\t,0.588696\n\t\t\t\t\t,0.0374125\n\t\t\t\t\t,0.588696\n\t\t\t\t\t,0.00158685\n\t\t\t\t\t,0.52016\n\t\t\t\t\t,0.0374125\n\t\t\t\t\t,0.52016\n\t\t\t\t\t,0.00158685\n\t\t\t\t\t,0.52016\n\t\t\t\t\t,0.0374125\n\t\t\t\t\t,0.52016\n\t\t\t\t\t,0.00158685\n\t\t\t\t\t,0.698905\n\t\t\t\t\t,0.252746\n\t\t\t\t\t,0.656802\n\t\t\t\t\t,0.244458\n\t\t\t\t\t,0.698905\n\t\t\t\t\t,0.143875\n\t\t\t\t\t,0.698905\n\t\t\t\t\t,0.264843\n\t\t\t\t\t,0.698905\n\t\t\t\t\t,0.143875\n\t\t\t\t\t,0.652123\n\t\t\t\t\t,0.255634\n\t\t\t\t\t,0.698905\n\t\t\t\t\t,0.264843\n\t\t\t\t\t,0.698905\n\t\t\t\t\t,0.289036\n\t\t\t\t\t,0.642766\n\t\t\t\t\t,0.277986\n\t\t\t\t\t,0.652123\n\t\t\t\t\t,0.255634\n\t\t\t\t\t,0.698905\n\t\t\t\t\t,0.289036\n\t\t\t\t\t,0.642766\n\t\t\t\t\t,0.277986\n\t\t\t\t\t,0.621107\n\t\t\t\t\t,0.220858\n\t\t\t\t\t,0.612463\n\t\t\t\t\t,0.229412\n\t\t\t\t\t,0.612463\n\t\t\t\t\t,0.229412\n\t\t\t\t\t,0.595174\n\t\t\t\t\t,0.246519\n\t\t\t\t\t,0.595174\n\t\t\t\t\t,0.246519\n\t\t\t\t\t,0.597257\n\t\t\t\t\t,0.185538\n\t\t\t\t\t,0.585963\n\t\t\t\t\t,0.190167\n\t\t\t\t\t,0.563374\n\t\t\t\t\t,0.199426\n\t\t\t\t\t,0.585963\n\t\t\t\t\t,0.190167\n\t\t\t\t\t,0.563374\n\t\t\t\t\t,0.199426\n\t\t\t\t\t,0.588882\n\t\t\t\t\t,0.143875\n\t\t\t\t\t,0.576657\n\t\t\t\t\t,0.143875\n\t\t\t\t\t,0.576657\n\t\t\t\t\t,0.143875\n\t\t\t\t\t,0.552208\n\t\t\t\t\t,0.143875\n\t\t\t\t\t,0.552208\n\t\t\t\t\t,0.143875\n\t\t\t\t\t,0.597257\n\t\t\t\t\t,0.102211\n\t\t\t\t\t,0.585963\n\t\t\t\t\t,0.0975826\n\t\t\t\t\t,0.563374\n\t\t\t\t\t,0.0883241\n\t\t\t\t\t,0.585963\n\t\t\t\t\t,0.0975826\n\t\t\t\t\t,0.563374\n\t\t\t\t\t,0.0883241\n\t\t\t\t\t,0.621107\n\t\t\t\t\t,0.0668908\n\t\t\t\t\t,0.612463\n\t\t\t\t\t,0.0583378\n\t\t\t\t\t,0.612463\n\t\t\t\t\t,0.0583378\n\t\t\t\t\t,0.595174\n\t\t\t\t\t,0.0412304\n\t\t\t\t\t,0.595174\n\t\t\t\t\t,0.0412304\n\t\t\t\t\t,0.656802\n\t\t\t\t\t,0.0432907\n\t\t\t\t\t,0.652123\n\t\t\t\t\t,0.0321153\n\t\t\t\t\t,0.642766\n\t\t\t\t\t,0.00976348\n\t\t\t\t\t,0.652123\n\t\t\t\t\t,0.0321153\n\t\t\t\t\t,0.642766\n\t\t\t\t\t,0.00976348\n\t\t\t\t\t,0.698905\n\t\t\t\t\t,0.0350043\n\t\t\t\t\t,0.698905\n\t\t\t\t\t,0.0229071\n\t\t\t\t\t,0.698905\n\t\t\t\t\t,0.0229071\n\t\t\t\t\t,0.698905\n\t\t\t\t\t,-0.00128639\n\t\t\t\t\t,0.698905\n\t\t\t\t\t,-0.00128639\n\t\t\t\t\t,0.741009\n\t\t\t\t\t,0.0432907\n\t\t\t\t\t,0.745687\n\t\t\t\t\t,0.0321153\n\t\t\t\t\t,0.755044\n\t\t\t\t\t,0.00976348\n\t\t\t\t\t,0.745687\n\t\t\t\t\t,0.0321153\n\t\t\t\t\t,0.755044\n\t\t\t\t\t,0.00976348\n\t\t\t\t\t,0.776703\n\t\t\t\t\t,0.0668908\n\t\t\t\t\t,0.785347\n\t\t\t\t\t,0.0583378\n\t\t\t\t\t,0.785347\n\t\t\t\t\t,0.0583378\n\t\t\t\t\t,0.802636\n\t\t\t\t\t,0.0412304\n\t\t\t\t\t,0.802636\n\t\t\t\t\t,0.0412304\n\t\t\t\t\t,0.800553\n\t\t\t\t\t,0.102211\n\t\t\t\t\t,0.811848\n\t\t\t\t\t,0.0975826\n\t\t\t\t\t,0.834436\n\t\t\t\t\t,0.0883241\n\t\t\t\t\t,0.811848\n\t\t\t\t\t,0.0975826\n\t\t\t\t\t,0.834436\n\t\t\t\t\t,0.0883241\n\t\t\t\t\t,0.808928\n\t\t\t\t\t,0.143875\n\t\t\t\t\t,0.821153\n\t\t\t\t\t,0.143875\n\t\t\t\t\t,0.821153\n\t\t\t\t\t,0.143875\n\t\t\t\t\t,0.845603\n\t\t\t\t\t,0.143875\n\t\t\t\t\t,0.845603\n\t\t\t\t\t,0.143875\n\t\t\t\t\t,0.800553\n\t\t\t\t\t,0.185538\n\t\t\t\t\t,0.811848\n\t\t\t\t\t,0.190167\n\t\t\t\t\t,0.834436\n\t\t\t\t\t,0.199426\n\t\t\t\t\t,0.811848\n\t\t\t\t\t,0.190167\n\t\t\t\t\t,0.834436\n\t\t\t\t\t,0.199426\n\t\t\t\t\t,0.776703\n\t\t\t\t\t,0.220858\n\t\t\t\t\t,0.785347\n\t\t\t\t\t,0.229412\n\t\t\t\t\t,0.785347\n\t\t\t\t\t,0.229412\n\t\t\t\t\t,0.802636\n\t\t\t\t\t,0.246519\n\t\t\t\t\t,0.802636\n\t\t\t\t\t,0.246519\n\t\t\t\t\t,0.741009\n\t\t\t\t\t,0.244458\n\t\t\t\t\t,0.745687\n\t\t\t\t\t,0.255634\n\t\t\t\t\t,0.755044\n\t\t\t\t\t,0.277986\n\t\t\t\t\t,0.745687\n\t\t\t\t\t,0.255634\n\t\t\t\t\t,0.755044\n\t\t\t\t\t,0.277986\n\t\t\t\t\t,0.443616\n\t\t\t\t\t,0.222924\n\t\t\t\t\t,0.443616\n\t\t\t\t\t,0.00341809\n\t\t\t\t\t,0.518311\n\t\t\t\t\t,0.222924\n\t\t\t\t\t,0.518311\n\t\t\t\t\t,0.00341809\n\t\t\t\t\t,0.443616\n\t\t\t\t\t,0.223044\n\t\t\t\t\t,0.443616\n\t\t\t\t\t,0.00353873\n\t\t\t\t\t,0.518311\n\t\t\t\t\t,0.00353873\n\t\t\t\t\t,0.518311\n\t\t\t\t\t,0.223044\n\t\t\t\t\t,0.443848\n\t\t\t\t\t,0.222924\n\t\t\t\t\t,0.443848\n\t\t\t\t\t,0.00341809\n\t\t\t\t\t,0.518543\n\t\t\t\t\t,0.00341809\n\t\t\t\t\t,0.518543\n\t\t\t\t\t,0.222924\n\t\t\t\t\t,0.443848\n\t\t\t\t\t,0.223044\n\t\t\t\t\t,0.443848\n\t\t\t\t\t,0.00353873\n\t\t\t\t\t,0.518543\n\t\t\t\t\t,0.223044\n\t\t\t\t\t,0.518543\n\t\t\t\t\t,0.00353873\n\t\t\t\t\t,0.442219\n\t\t\t\t\t,0.222924\n\t\t\t\t\t,0.442219\n\t\t\t\t\t,0.00341809\n\t\t\t\t\t,0.516915\n\t\t\t\t\t,0.222924\n\t\t\t\t\t,0.516915\n\t\t\t\t\t,0.00341809\n\t\t\t\t\t,0.442219\n\t\t\t\t\t,0.223044\n\t\t\t\t\t,0.442219\n\t\t\t\t\t,0.00353873\n\t\t\t\t\t,0.516915\n\t\t\t\t\t,0.00353873\n\t\t\t\t\t,0.516915\n\t\t\t\t\t,0.223044\n\t\t\t\t\t,0.442452\n\t\t\t\t\t,0.222924\n\t\t\t\t\t,0.442452\n\t\t\t\t\t,0.00341809\n\t\t\t\t\t,0.517147\n\t\t\t\t\t,0.00341809\n\t\t\t\t\t,0.517147\n\t\t\t\t\t,0.222924\n\t\t\t\t\t,0.442452\n\t\t\t\t\t,0.223044\n\t\t\t\t\t,0.442452\n\t\t\t\t\t,0.00353873\n\t\t\t\t\t,0.517147\n\t\t\t\t\t,0.223044\n\t\t\t\t\t,0.517147\n\t\t\t\t\t,0.00353873\n\t\t\t\t\t,0.442685\n\t\t\t\t\t,0.222924\n\t\t\t\t\t,0.442685\n\t\t\t\t\t,0.00341809\n\t\t\t\t\t,0.51738\n\t\t\t\t\t,0.222924\n\t\t\t\t\t,0.51738\n\t\t\t\t\t,0.00341809\n\t\t\t\t\t,0.442685\n\t\t\t\t\t,0.223044\n\t\t\t\t\t,0.442685\n\t\t\t\t\t,0.00353873\n\t\t\t\t\t,0.51738\n\t\t\t\t\t,0.00353873\n\t\t\t\t\t,0.51738\n\t\t\t\t\t,0.223044\n\t\t\t\t\t,0.442918\n\t\t\t\t\t,0.222924\n\t\t\t\t\t,0.442918\n\t\t\t\t\t,0.00341809\n\t\t\t\t\t,0.517613\n\t\t\t\t\t,0.00341809\n\t\t\t\t\t,0.517613\n\t\t\t\t\t,0.222924\n\t\t\t\t\t,0.442918\n\t\t\t\t\t,0.223044\n\t\t\t\t\t,0.442918\n\t\t\t\t\t,0.00353873\n\t\t\t\t\t,0.517613\n\t\t\t\t\t,0.223044\n\t\t\t\t\t,0.517613\n\t\t\t\t\t,0.00353873\n\t\t\t\t\t,0.44315\n\t\t\t\t\t,0.222924\n\t\t\t\t\t,0.44315\n\t\t\t\t\t,0.00341809\n\t\t\t\t\t,0.517846\n\t\t\t\t\t,0.222924\n\t\t\t\t\t,0.517846\n\t\t\t\t\t,0.00341809\n\t\t\t\t\t,0.44315\n\t\t\t\t\t,0.223044\n\t\t\t\t\t,0.44315\n\t\t\t\t\t,0.00353873\n\t\t\t\t\t,0.517846\n\t\t\t\t\t,0.00353873\n\t\t\t\t\t,0.517846\n\t\t\t\t\t,0.223044\n\t\t\t\t\t,0.443383\n\t\t\t\t\t,0.222924\n\t\t\t\t\t,0.443383\n\t\t\t\t\t,0.00341809\n\t\t\t\t\t,0.518078\n\t\t\t\t\t,0.00341809\n\t\t\t\t\t,0.518078\n\t\t\t\t\t,0.222924\n\t\t\t\t\t,0.443383\n\t\t\t\t\t,0.223044\n\t\t\t\t\t,0.443383\n\t\t\t\t\t,0.00353873\n\t\t\t\t\t,0.518078\n\t\t\t\t\t,0.223044\n\t\t\t\t\t,0.518078\n\t\t\t\t\t,0.00353873\n\t\t\t\t\t,0.443615\n\t\t\t\t\t,0.222924\n\t\t\t\t\t,0.443615\n\t\t\t\t\t,0.00341809\n\t\t\t\t\t,0.518311\n\t\t\t\t\t,0.222924\n\t\t\t\t\t,0.518311\n\t\t\t\t\t,0.00341809\n\t\t\t\t\t,0.443615\n\t\t\t\t\t,0.223044\n\t\t\t\t\t,0.443615\n\t\t\t\t\t,0.00353873\n\t\t\t\t\t,0.518311\n\t\t\t\t\t,0.00353873\n\t\t\t\t\t,0.518311\n\t\t\t\t\t,0.223044\n\t\t\t\t\t,0.443848\n\t\t\t\t\t,0.222924\n\t\t\t\t\t,0.443848\n\t\t\t\t\t,0.00341809\n\t\t\t\t\t,0.518543\n\t\t\t\t\t,0.00341809\n\t\t\t\t\t,0.518543\n\t\t\t\t\t,0.222924\n\t\t\t\t\t,0.443848\n\t\t\t\t\t,0.223044\n\t\t\t\t\t,0.443848\n\t\t\t\t\t,0.00353873\n\t\t\t\t\t,0.518543\n\t\t\t\t\t,0.223044\n\t\t\t\t\t,0.518543\n\t\t\t\t\t,0.00353873\n\t\t\t\t\t,0.442219\n\t\t\t\t\t,0.222924\n\t\t\t\t\t,0.442219\n\t\t\t\t\t,0.00341809\n\t\t\t\t\t,0.516915\n\t\t\t\t\t,0.222924\n\t\t\t\t\t,0.516915\n\t\t\t\t\t,0.00341809\n\t\t\t\t\t,0.442219\n\t\t\t\t\t,0.223044\n\t\t\t\t\t,0.442219\n\t\t\t\t\t,0.00353873\n\t\t\t\t\t,0.516915\n\t\t\t\t\t,0.00353873\n\t\t\t\t\t,0.516915\n\t\t\t\t\t,0.223044\n\t\t\t\t\t,0.442452\n\t\t\t\t\t,0.222924\n\t\t\t\t\t,0.442452\n\t\t\t\t\t,0.00341809\n\t\t\t\t\t,0.517147\n\t\t\t\t\t,0.00341809\n\t\t\t\t\t,0.517147\n\t\t\t\t\t,0.222924\n\t\t\t\t\t,0.442452\n\t\t\t\t\t,0.223044\n\t\t\t\t\t,0.442452\n\t\t\t\t\t,0.00353873\n\t\t\t\t\t,0.517147\n\t\t\t\t\t,0.223044\n\t\t\t\t\t,0.517147\n\t\t\t\t\t,0.00353873\n\t\t\t\t\t,0.442685\n\t\t\t\t\t,0.222924\n\t\t\t\t\t,0.442685\n\t\t\t\t\t,0.00341809\n\t\t\t\t\t,0.51738\n\t\t\t\t\t,0.222924\n\t\t\t\t\t,0.51738\n\t\t\t\t\t,0.00341809\n\t\t\t\t\t,0.442685\n\t\t\t\t\t,0.223044\n\t\t\t\t\t,0.442685\n\t\t\t\t\t,0.00353873\n\t\t\t\t\t,0.51738\n\t\t\t\t\t,0.00353873\n\t\t\t\t\t,0.51738\n\t\t\t\t\t,0.223044\n\t\t\t\t\t,0.442918\n\t\t\t\t\t,0.222924\n\t\t\t\t\t,0.442918\n\t\t\t\t\t,0.00341809\n\t\t\t\t\t,0.517613\n\t\t\t\t\t,0.00341809\n\t\t\t\t\t,0.517613\n\t\t\t\t\t,0.222924\n\t\t\t\t\t,0.442918\n\t\t\t\t\t,0.223044\n\t\t\t\t\t,0.442918\n\t\t\t\t\t,0.00353873\n\t\t\t\t\t,0.517613\n\t\t\t\t\t,0.223044\n\t\t\t\t\t,0.517613\n\t\t\t\t\t,0.00353873\n\t\t\t\t\t,0.44315\n\t\t\t\t\t,0.222924\n\t\t\t\t\t,0.44315\n\t\t\t\t\t,0.00341809\n\t\t\t\t\t,0.517845\n\t\t\t\t\t,0.222924\n\t\t\t\t\t,0.517845\n\t\t\t\t\t,0.00341809\n\t\t\t\t\t,0.44315\n\t\t\t\t\t,0.223044\n\t\t\t\t\t,0.44315\n\t\t\t\t\t,0.00353873\n\t\t\t\t\t,0.517845\n\t\t\t\t\t,0.00353873\n\t\t\t\t\t,0.517845\n\t\t\t\t\t,0.223044\n\t\t\t\t\t,0.443383\n\t\t\t\t\t,0.222924\n\t\t\t\t\t,0.443383\n\t\t\t\t\t,0.00341809\n\t\t\t\t\t,0.518078\n\t\t\t\t\t,0.00341809\n\t\t\t\t\t,0.518078\n\t\t\t\t\t,0.222924\n\t\t\t\t\t,0.443383\n\t\t\t\t\t,0.223044\n\t\t\t\t\t,0.443383\n\t\t\t\t\t,0.00353873\n\t\t\t\t\t,0.518078\n\t\t\t\t\t,0.223044\n\t\t\t\t\t,0.518078\n\t\t\t\t\t,0.00353873\n\t\t\t\t]\n\t\t\t]\n\t\t\t,\"faces\": [\n\t\t\t\t[\n\t\t\t\t\t 0\n\t\t\t\t\t,1\n\t\t\t\t\t,2\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 77\n\t\t\t\t\t,0\n\t\t\t\t\t,2\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 0\n\t\t\t\t\t,6\n\t\t\t\t\t,9\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 0\n\t\t\t\t\t,9\n\t\t\t\t\t,1\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 77\n\t\t\t\t\t,6\n\t\t\t\t\t,0\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1\n\t\t\t\t\t,12\n\t\t\t\t\t,2\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1\n\t\t\t\t\t,9\n\t\t\t\t\t,14\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1\n\t\t\t\t\t,14\n\t\t\t\t\t,12\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 6\n\t\t\t\t\t,8\n\t\t\t\t\t,9\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 9\n\t\t\t\t\t,8\n\t\t\t\t\t,14\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 8\n\t\t\t\t\t,15\n\t\t\t\t\t,14\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 14\n\t\t\t\t\t,15\n\t\t\t\t\t,19\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 14\n\t\t\t\t\t,19\n\t\t\t\t\t,20\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 12\n\t\t\t\t\t,14\n\t\t\t\t\t,20\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 12\n\t\t\t\t\t,17\n\t\t\t\t\t,2\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 12\n\t\t\t\t\t,20\n\t\t\t\t\t,17\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 20\n\t\t\t\t\t,19\n\t\t\t\t\t,24\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 17\n\t\t\t\t\t,20\n\t\t\t\t\t,24\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 19\n\t\t\t\t\t,25\n\t\t\t\t\t,24\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 24\n\t\t\t\t\t,25\n\t\t\t\t\t,29\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 24\n\t\t\t\t\t,29\n\t\t\t\t\t,30\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 17\n\t\t\t\t\t,24\n\t\t\t\t\t,22\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 22\n\t\t\t\t\t,24\n\t\t\t\t\t,30\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 17\n\t\t\t\t\t,22\n\t\t\t\t\t,2\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 22\n\t\t\t\t\t,27\n\t\t\t\t\t,2\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 22\n\t\t\t\t\t,30\n\t\t\t\t\t,27\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 30\n\t\t\t\t\t,29\n\t\t\t\t\t,34\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 27\n\t\t\t\t\t,30\n\t\t\t\t\t,34\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 29\n\t\t\t\t\t,35\n\t\t\t\t\t,34\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 34\n\t\t\t\t\t,35\n\t\t\t\t\t,39\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 34\n\t\t\t\t\t,39\n\t\t\t\t\t,40\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 27\n\t\t\t\t\t,34\n\t\t\t\t\t,32\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 32\n\t\t\t\t\t,34\n\t\t\t\t\t,40\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 27\n\t\t\t\t\t,32\n\t\t\t\t\t,2\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 32\n\t\t\t\t\t,37\n\t\t\t\t\t,2\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 32\n\t\t\t\t\t,40\n\t\t\t\t\t,37\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 40\n\t\t\t\t\t,39\n\t\t\t\t\t,44\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 37\n\t\t\t\t\t,40\n\t\t\t\t\t,44\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 39\n\t\t\t\t\t,45\n\t\t\t\t\t,44\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 44\n\t\t\t\t\t,45\n\t\t\t\t\t,49\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 44\n\t\t\t\t\t,49\n\t\t\t\t\t,50\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 37\n\t\t\t\t\t,44\n\t\t\t\t\t,42\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 42\n\t\t\t\t\t,44\n\t\t\t\t\t,50\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 37\n\t\t\t\t\t,42\n\t\t\t\t\t,2\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 42\n\t\t\t\t\t,47\n\t\t\t\t\t,2\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 42\n\t\t\t\t\t,50\n\t\t\t\t\t,47\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 50\n\t\t\t\t\t,49\n\t\t\t\t\t,54\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 47\n\t\t\t\t\t,50\n\t\t\t\t\t,54\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 49\n\t\t\t\t\t,55\n\t\t\t\t\t,54\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 54\n\t\t\t\t\t,55\n\t\t\t\t\t,59\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 54\n\t\t\t\t\t,59\n\t\t\t\t\t,60\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 47\n\t\t\t\t\t,54\n\t\t\t\t\t,52\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 52\n\t\t\t\t\t,54\n\t\t\t\t\t,60\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 47\n\t\t\t\t\t,52\n\t\t\t\t\t,2\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 52\n\t\t\t\t\t,57\n\t\t\t\t\t,2\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 52\n\t\t\t\t\t,60\n\t\t\t\t\t,57\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 60\n\t\t\t\t\t,59\n\t\t\t\t\t,64\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 57\n\t\t\t\t\t,60\n\t\t\t\t\t,64\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 59\n\t\t\t\t\t,65\n\t\t\t\t\t,64\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 64\n\t\t\t\t\t,65\n\t\t\t\t\t,69\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 64\n\t\t\t\t\t,69\n\t\t\t\t\t,70\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 57\n\t\t\t\t\t,64\n\t\t\t\t\t,62\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 62\n\t\t\t\t\t,64\n\t\t\t\t\t,70\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 57\n\t\t\t\t\t,62\n\t\t\t\t\t,2\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 62\n\t\t\t\t\t,67\n\t\t\t\t\t,2\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 62\n\t\t\t\t\t,70\n\t\t\t\t\t,67\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 70\n\t\t\t\t\t,69\n\t\t\t\t\t,74\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 67\n\t\t\t\t\t,70\n\t\t\t\t\t,74\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 69\n\t\t\t\t\t,75\n\t\t\t\t\t,74\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 74\n\t\t\t\t\t,75\n\t\t\t\t\t,79\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 74\n\t\t\t\t\t,79\n\t\t\t\t\t,80\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 67\n\t\t\t\t\t,74\n\t\t\t\t\t,72\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 72\n\t\t\t\t\t,74\n\t\t\t\t\t,80\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 67\n\t\t\t\t\t,72\n\t\t\t\t\t,2\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 72\n\t\t\t\t\t,77\n\t\t\t\t\t,2\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 72\n\t\t\t\t\t,80\n\t\t\t\t\t,77\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 80\n\t\t\t\t\t,79\n\t\t\t\t\t,6\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 77\n\t\t\t\t\t,80\n\t\t\t\t\t,6\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 79\n\t\t\t\t\t,7\n\t\t\t\t\t,6\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 6\n\t\t\t\t\t,7\n\t\t\t\t\t,8\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 3\n\t\t\t\t\t,4\n\t\t\t\t\t,5\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 10\n\t\t\t\t\t,3\n\t\t\t\t\t,11\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 3\n\t\t\t\t\t,5\n\t\t\t\t\t,11\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 78\n\t\t\t\t\t,4\n\t\t\t\t\t,3\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 81\n\t\t\t\t\t,78\n\t\t\t\t\t,3\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 81\n\t\t\t\t\t,3\n\t\t\t\t\t,10\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 5\n\t\t\t\t\t,4\n\t\t\t\t\t,13\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 11\n\t\t\t\t\t,5\n\t\t\t\t\t,13\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 11\n\t\t\t\t\t,13\n\t\t\t\t\t,16\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 13\n\t\t\t\t\t,4\n\t\t\t\t\t,18\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 16\n\t\t\t\t\t,13\n\t\t\t\t\t,21\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 13\n\t\t\t\t\t,18\n\t\t\t\t\t,21\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 18\n\t\t\t\t\t,4\n\t\t\t\t\t,23\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 21\n\t\t\t\t\t,18\n\t\t\t\t\t,23\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 21\n\t\t\t\t\t,23\n\t\t\t\t\t,26\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 23\n\t\t\t\t\t,4\n\t\t\t\t\t,28\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 26\n\t\t\t\t\t,23\n\t\t\t\t\t,31\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 23\n\t\t\t\t\t,28\n\t\t\t\t\t,31\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 28\n\t\t\t\t\t,4\n\t\t\t\t\t,33\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 31\n\t\t\t\t\t,28\n\t\t\t\t\t,33\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 31\n\t\t\t\t\t,33\n\t\t\t\t\t,36\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 33\n\t\t\t\t\t,4\n\t\t\t\t\t,38\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 36\n\t\t\t\t\t,33\n\t\t\t\t\t,41\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 33\n\t\t\t\t\t,38\n\t\t\t\t\t,41\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 38\n\t\t\t\t\t,4\n\t\t\t\t\t,43\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 41\n\t\t\t\t\t,38\n\t\t\t\t\t,43\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 41\n\t\t\t\t\t,43\n\t\t\t\t\t,46\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 43\n\t\t\t\t\t,4\n\t\t\t\t\t,48\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 46\n\t\t\t\t\t,43\n\t\t\t\t\t,51\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 43\n\t\t\t\t\t,48\n\t\t\t\t\t,51\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 48\n\t\t\t\t\t,4\n\t\t\t\t\t,53\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 51\n\t\t\t\t\t,48\n\t\t\t\t\t,53\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 51\n\t\t\t\t\t,53\n\t\t\t\t\t,56\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 53\n\t\t\t\t\t,4\n\t\t\t\t\t,58\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 56\n\t\t\t\t\t,53\n\t\t\t\t\t,61\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 53\n\t\t\t\t\t,58\n\t\t\t\t\t,61\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 58\n\t\t\t\t\t,4\n\t\t\t\t\t,63\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 61\n\t\t\t\t\t,58\n\t\t\t\t\t,63\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 61\n\t\t\t\t\t,63\n\t\t\t\t\t,66\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 63\n\t\t\t\t\t,4\n\t\t\t\t\t,68\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 66\n\t\t\t\t\t,63\n\t\t\t\t\t,71\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 63\n\t\t\t\t\t,68\n\t\t\t\t\t,71\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 68\n\t\t\t\t\t,4\n\t\t\t\t\t,73\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 73\n\t\t\t\t\t,4\n\t\t\t\t\t,78\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 71\n\t\t\t\t\t,68\n\t\t\t\t\t,73\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 71\n\t\t\t\t\t,73\n\t\t\t\t\t,76\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 76\n\t\t\t\t\t,73\n\t\t\t\t\t,81\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 73\n\t\t\t\t\t,78\n\t\t\t\t\t,81\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 82\n\t\t\t\t\t,83\n\t\t\t\t\t,84\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 83\n\t\t\t\t\t,85\n\t\t\t\t\t,84\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 86\n\t\t\t\t\t,87\n\t\t\t\t\t,88\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 86\n\t\t\t\t\t,88\n\t\t\t\t\t,89\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 90\n\t\t\t\t\t,91\n\t\t\t\t\t,92\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 90\n\t\t\t\t\t,92\n\t\t\t\t\t,93\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 94\n\t\t\t\t\t,95\n\t\t\t\t\t,96\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 95\n\t\t\t\t\t,97\n\t\t\t\t\t,96\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 98\n\t\t\t\t\t,99\n\t\t\t\t\t,100\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 99\n\t\t\t\t\t,101\n\t\t\t\t\t,100\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 102\n\t\t\t\t\t,103\n\t\t\t\t\t,104\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 102\n\t\t\t\t\t,104\n\t\t\t\t\t,105\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 106\n\t\t\t\t\t,107\n\t\t\t\t\t,108\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 106\n\t\t\t\t\t,108\n\t\t\t\t\t,109\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 110\n\t\t\t\t\t,111\n\t\t\t\t\t,112\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 111\n\t\t\t\t\t,113\n\t\t\t\t\t,112\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 114\n\t\t\t\t\t,115\n\t\t\t\t\t,116\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 115\n\t\t\t\t\t,117\n\t\t\t\t\t,116\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 118\n\t\t\t\t\t,119\n\t\t\t\t\t,120\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 118\n\t\t\t\t\t,120\n\t\t\t\t\t,121\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 122\n\t\t\t\t\t,123\n\t\t\t\t\t,124\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 122\n\t\t\t\t\t,124\n\t\t\t\t\t,125\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 126\n\t\t\t\t\t,127\n\t\t\t\t\t,128\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 127\n\t\t\t\t\t,129\n\t\t\t\t\t,128\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 130\n\t\t\t\t\t,131\n\t\t\t\t\t,132\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 131\n\t\t\t\t\t,133\n\t\t\t\t\t,132\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 134\n\t\t\t\t\t,135\n\t\t\t\t\t,136\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 134\n\t\t\t\t\t,136\n\t\t\t\t\t,137\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 138\n\t\t\t\t\t,139\n\t\t\t\t\t,140\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 138\n\t\t\t\t\t,140\n\t\t\t\t\t,141\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 142\n\t\t\t\t\t,143\n\t\t\t\t\t,144\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 143\n\t\t\t\t\t,145\n\t\t\t\t\t,144\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 146\n\t\t\t\t\t,147\n\t\t\t\t\t,148\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 147\n\t\t\t\t\t,149\n\t\t\t\t\t,148\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 150\n\t\t\t\t\t,151\n\t\t\t\t\t,152\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 150\n\t\t\t\t\t,152\n\t\t\t\t\t,153\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 154\n\t\t\t\t\t,155\n\t\t\t\t\t,156\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 154\n\t\t\t\t\t,156\n\t\t\t\t\t,157\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 158\n\t\t\t\t\t,159\n\t\t\t\t\t,160\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 159\n\t\t\t\t\t,161\n\t\t\t\t\t,160\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 162\n\t\t\t\t\t,163\n\t\t\t\t\t,164\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 163\n\t\t\t\t\t,165\n\t\t\t\t\t,164\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 166\n\t\t\t\t\t,167\n\t\t\t\t\t,168\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 166\n\t\t\t\t\t,168\n\t\t\t\t\t,169\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 170\n\t\t\t\t\t,171\n\t\t\t\t\t,172\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 170\n\t\t\t\t\t,172\n\t\t\t\t\t,173\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 174\n\t\t\t\t\t,175\n\t\t\t\t\t,176\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 175\n\t\t\t\t\t,177\n\t\t\t\t\t,176\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 178\n\t\t\t\t\t,179\n\t\t\t\t\t,180\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 179\n\t\t\t\t\t,181\n\t\t\t\t\t,180\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 182\n\t\t\t\t\t,183\n\t\t\t\t\t,184\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 182\n\t\t\t\t\t,184\n\t\t\t\t\t,185\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 186\n\t\t\t\t\t,187\n\t\t\t\t\t,188\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 186\n\t\t\t\t\t,188\n\t\t\t\t\t,189\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 190\n\t\t\t\t\t,191\n\t\t\t\t\t,192\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 191\n\t\t\t\t\t,193\n\t\t\t\t\t,192\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 194\n\t\t\t\t\t,195\n\t\t\t\t\t,196\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 195\n\t\t\t\t\t,197\n\t\t\t\t\t,196\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 198\n\t\t\t\t\t,199\n\t\t\t\t\t,200\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 198\n\t\t\t\t\t,200\n\t\t\t\t\t,201\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 202\n\t\t\t\t\t,203\n\t\t\t\t\t,204\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 202\n\t\t\t\t\t,204\n\t\t\t\t\t,205\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 206\n\t\t\t\t\t,207\n\t\t\t\t\t,208\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 207\n\t\t\t\t\t,209\n\t\t\t\t\t,208\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 210\n\t\t\t\t\t,211\n\t\t\t\t\t,212\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 210\n\t\t\t\t\t,222\n\t\t\t\t\t,211\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 210\n\t\t\t\t\t,227\n\t\t\t\t\t,222\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 210\n\t\t\t\t\t,232\n\t\t\t\t\t,227\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 210\n\t\t\t\t\t,237\n\t\t\t\t\t,232\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 210\n\t\t\t\t\t,242\n\t\t\t\t\t,237\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 210\n\t\t\t\t\t,247\n\t\t\t\t\t,242\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 210\n\t\t\t\t\t,252\n\t\t\t\t\t,247\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 210\n\t\t\t\t\t,257\n\t\t\t\t\t,252\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 210\n\t\t\t\t\t,262\n\t\t\t\t\t,257\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 210\n\t\t\t\t\t,267\n\t\t\t\t\t,262\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 210\n\t\t\t\t\t,272\n\t\t\t\t\t,267\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 210\n\t\t\t\t\t,277\n\t\t\t\t\t,272\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 210\n\t\t\t\t\t,282\n\t\t\t\t\t,277\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 210\n\t\t\t\t\t,287\n\t\t\t\t\t,282\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 210\n\t\t\t\t\t,212\n\t\t\t\t\t,287\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 272\n\t\t\t\t\t,274\n\t\t\t\t\t,267\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 280\n\t\t\t\t\t,274\n\t\t\t\t\t,272\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 277\n\t\t\t\t\t,280\n\t\t\t\t\t,272\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 284\n\t\t\t\t\t,280\n\t\t\t\t\t,277\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 282\n\t\t\t\t\t,284\n\t\t\t\t\t,277\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 290\n\t\t\t\t\t,284\n\t\t\t\t\t,282\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 287\n\t\t\t\t\t,290\n\t\t\t\t\t,282\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 218\n\t\t\t\t\t,290\n\t\t\t\t\t,287\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 212\n\t\t\t\t\t,218\n\t\t\t\t\t,287\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 219\n\t\t\t\t\t,218\n\t\t\t\t\t,212\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 211\n\t\t\t\t\t,219\n\t\t\t\t\t,212\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 216\n\t\t\t\t\t,217\n\t\t\t\t\t,218\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 219\n\t\t\t\t\t,216\n\t\t\t\t\t,218\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 218\n\t\t\t\t\t,289\n\t\t\t\t\t,290\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 218\n\t\t\t\t\t,217\n\t\t\t\t\t,289\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 290\n\t\t\t\t\t,289\n\t\t\t\t\t,284\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 289\n\t\t\t\t\t,285\n\t\t\t\t\t,284\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 284\n\t\t\t\t\t,285\n\t\t\t\t\t,279\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 284\n\t\t\t\t\t,279\n\t\t\t\t\t,280\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 279\n\t\t\t\t\t,275\n\t\t\t\t\t,274\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 280\n\t\t\t\t\t,279\n\t\t\t\t\t,274\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 274\n\t\t\t\t\t,275\n\t\t\t\t\t,269\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 274\n\t\t\t\t\t,269\n\t\t\t\t\t,270\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 274\n\t\t\t\t\t,270\n\t\t\t\t\t,267\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 269\n\t\t\t\t\t,265\n\t\t\t\t\t,264\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 270\n\t\t\t\t\t,269\n\t\t\t\t\t,264\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 270\n\t\t\t\t\t,264\n\t\t\t\t\t,262\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 267\n\t\t\t\t\t,270\n\t\t\t\t\t,262\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 264\n\t\t\t\t\t,259\n\t\t\t\t\t,260\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 264\n\t\t\t\t\t,265\n\t\t\t\t\t,259\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 264\n\t\t\t\t\t,260\n\t\t\t\t\t,257\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 262\n\t\t\t\t\t,264\n\t\t\t\t\t,257\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 259\n\t\t\t\t\t,255\n\t\t\t\t\t,254\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 260\n\t\t\t\t\t,259\n\t\t\t\t\t,254\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 260\n\t\t\t\t\t,254\n\t\t\t\t\t,252\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 257\n\t\t\t\t\t,260\n\t\t\t\t\t,252\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 254\n\t\t\t\t\t,249\n\t\t\t\t\t,250\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 254\n\t\t\t\t\t,255\n\t\t\t\t\t,249\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 254\n\t\t\t\t\t,250\n\t\t\t\t\t,247\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 252\n\t\t\t\t\t,254\n\t\t\t\t\t,247\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 249\n\t\t\t\t\t,245\n\t\t\t\t\t,244\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 250\n\t\t\t\t\t,249\n\t\t\t\t\t,244\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 250\n\t\t\t\t\t,244\n\t\t\t\t\t,242\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 247\n\t\t\t\t\t,250\n\t\t\t\t\t,242\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 244\n\t\t\t\t\t,239\n\t\t\t\t\t,240\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 244\n\t\t\t\t\t,245\n\t\t\t\t\t,239\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 244\n\t\t\t\t\t,240\n\t\t\t\t\t,237\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 242\n\t\t\t\t\t,244\n\t\t\t\t\t,237\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 239\n\t\t\t\t\t,235\n\t\t\t\t\t,234\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 240\n\t\t\t\t\t,239\n\t\t\t\t\t,234\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 240\n\t\t\t\t\t,234\n\t\t\t\t\t,232\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 237\n\t\t\t\t\t,240\n\t\t\t\t\t,232\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 234\n\t\t\t\t\t,229\n\t\t\t\t\t,230\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 234\n\t\t\t\t\t,235\n\t\t\t\t\t,229\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 234\n\t\t\t\t\t,230\n\t\t\t\t\t,227\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 232\n\t\t\t\t\t,234\n\t\t\t\t\t,227\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 229\n\t\t\t\t\t,225\n\t\t\t\t\t,224\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 230\n\t\t\t\t\t,229\n\t\t\t\t\t,224\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 230\n\t\t\t\t\t,224\n\t\t\t\t\t,222\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 227\n\t\t\t\t\t,230\n\t\t\t\t\t,222\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 224\n\t\t\t\t\t,216\n\t\t\t\t\t,219\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 224\n\t\t\t\t\t,225\n\t\t\t\t\t,216\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 224\n\t\t\t\t\t,219\n\t\t\t\t\t,211\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 222\n\t\t\t\t\t,224\n\t\t\t\t\t,211\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 213\n\t\t\t\t\t,214\n\t\t\t\t\t,215\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 220\n\t\t\t\t\t,213\n\t\t\t\t\t,215\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 223\n\t\t\t\t\t,214\n\t\t\t\t\t,213\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 223\n\t\t\t\t\t,213\n\t\t\t\t\t,220\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 220\n\t\t\t\t\t,215\n\t\t\t\t\t,221\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 215\n\t\t\t\t\t,214\n\t\t\t\t\t,288\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 215\n\t\t\t\t\t,288\n\t\t\t\t\t,291\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 221\n\t\t\t\t\t,215\n\t\t\t\t\t,291\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 226\n\t\t\t\t\t,223\n\t\t\t\t\t,220\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 228\n\t\t\t\t\t,214\n\t\t\t\t\t,223\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 231\n\t\t\t\t\t,223\n\t\t\t\t\t,226\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 231\n\t\t\t\t\t,228\n\t\t\t\t\t,223\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 233\n\t\t\t\t\t,214\n\t\t\t\t\t,228\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 233\n\t\t\t\t\t,228\n\t\t\t\t\t,231\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 236\n\t\t\t\t\t,233\n\t\t\t\t\t,231\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 238\n\t\t\t\t\t,214\n\t\t\t\t\t,233\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 241\n\t\t\t\t\t,233\n\t\t\t\t\t,236\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 241\n\t\t\t\t\t,238\n\t\t\t\t\t,233\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 243\n\t\t\t\t\t,214\n\t\t\t\t\t,238\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 243\n\t\t\t\t\t,238\n\t\t\t\t\t,241\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 246\n\t\t\t\t\t,243\n\t\t\t\t\t,241\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 248\n\t\t\t\t\t,214\n\t\t\t\t\t,243\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 251\n\t\t\t\t\t,243\n\t\t\t\t\t,246\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 251\n\t\t\t\t\t,248\n\t\t\t\t\t,243\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 253\n\t\t\t\t\t,214\n\t\t\t\t\t,248\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 253\n\t\t\t\t\t,248\n\t\t\t\t\t,251\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 256\n\t\t\t\t\t,253\n\t\t\t\t\t,251\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 258\n\t\t\t\t\t,214\n\t\t\t\t\t,253\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 261\n\t\t\t\t\t,253\n\t\t\t\t\t,256\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 261\n\t\t\t\t\t,258\n\t\t\t\t\t,253\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 263\n\t\t\t\t\t,214\n\t\t\t\t\t,258\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 263\n\t\t\t\t\t,258\n\t\t\t\t\t,261\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 266\n\t\t\t\t\t,263\n\t\t\t\t\t,261\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 268\n\t\t\t\t\t,214\n\t\t\t\t\t,263\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 271\n\t\t\t\t\t,263\n\t\t\t\t\t,266\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 271\n\t\t\t\t\t,268\n\t\t\t\t\t,263\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 273\n\t\t\t\t\t,214\n\t\t\t\t\t,268\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 273\n\t\t\t\t\t,268\n\t\t\t\t\t,271\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 278\n\t\t\t\t\t,214\n\t\t\t\t\t,273\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 283\n\t\t\t\t\t,214\n\t\t\t\t\t,278\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 288\n\t\t\t\t\t,214\n\t\t\t\t\t,283\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 276\n\t\t\t\t\t,273\n\t\t\t\t\t,271\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 281\n\t\t\t\t\t,273\n\t\t\t\t\t,276\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 281\n\t\t\t\t\t,278\n\t\t\t\t\t,273\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 283\n\t\t\t\t\t,278\n\t\t\t\t\t,281\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 286\n\t\t\t\t\t,283\n\t\t\t\t\t,281\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 291\n\t\t\t\t\t,283\n\t\t\t\t\t,286\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 291\n\t\t\t\t\t,288\n\t\t\t\t\t,283\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 292\n\t\t\t\t\t,293\n\t\t\t\t\t,294\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 292\n\t\t\t\t\t,295\n\t\t\t\t\t,293\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 296\n\t\t\t\t\t,297\n\t\t\t\t\t,298\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 299\n\t\t\t\t\t,296\n\t\t\t\t\t,298\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 300\n\t\t\t\t\t,301\n\t\t\t\t\t,302\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 303\n\t\t\t\t\t,300\n\t\t\t\t\t,302\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 304\n\t\t\t\t\t,305\n\t\t\t\t\t,306\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 304\n\t\t\t\t\t,307\n\t\t\t\t\t,305\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 308\n\t\t\t\t\t,309\n\t\t\t\t\t,310\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 308\n\t\t\t\t\t,311\n\t\t\t\t\t,309\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 312\n\t\t\t\t\t,313\n\t\t\t\t\t,314\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 315\n\t\t\t\t\t,312\n\t\t\t\t\t,314\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 316\n\t\t\t\t\t,317\n\t\t\t\t\t,318\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 319\n\t\t\t\t\t,316\n\t\t\t\t\t,318\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 320\n\t\t\t\t\t,321\n\t\t\t\t\t,322\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 320\n\t\t\t\t\t,323\n\t\t\t\t\t,321\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 324\n\t\t\t\t\t,325\n\t\t\t\t\t,326\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 324\n\t\t\t\t\t,327\n\t\t\t\t\t,325\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 328\n\t\t\t\t\t,329\n\t\t\t\t\t,330\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 331\n\t\t\t\t\t,328\n\t\t\t\t\t,330\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 332\n\t\t\t\t\t,333\n\t\t\t\t\t,334\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 335\n\t\t\t\t\t,332\n\t\t\t\t\t,334\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 336\n\t\t\t\t\t,337\n\t\t\t\t\t,338\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 336\n\t\t\t\t\t,339\n\t\t\t\t\t,337\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 340\n\t\t\t\t\t,341\n\t\t\t\t\t,342\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 340\n\t\t\t\t\t,343\n\t\t\t\t\t,341\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 344\n\t\t\t\t\t,345\n\t\t\t\t\t,346\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 347\n\t\t\t\t\t,344\n\t\t\t\t\t,346\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 348\n\t\t\t\t\t,349\n\t\t\t\t\t,350\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 351\n\t\t\t\t\t,348\n\t\t\t\t\t,350\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 352\n\t\t\t\t\t,353\n\t\t\t\t\t,354\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 352\n\t\t\t\t\t,355\n\t\t\t\t\t,353\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 356\n\t\t\t\t\t,357\n\t\t\t\t\t,358\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 356\n\t\t\t\t\t,359\n\t\t\t\t\t,357\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 360\n\t\t\t\t\t,361\n\t\t\t\t\t,362\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 363\n\t\t\t\t\t,360\n\t\t\t\t\t,362\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 364\n\t\t\t\t\t,365\n\t\t\t\t\t,366\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 367\n\t\t\t\t\t,364\n\t\t\t\t\t,366\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 368\n\t\t\t\t\t,369\n\t\t\t\t\t,370\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 368\n\t\t\t\t\t,371\n\t\t\t\t\t,369\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 372\n\t\t\t\t\t,373\n\t\t\t\t\t,374\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 372\n\t\t\t\t\t,375\n\t\t\t\t\t,373\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 376\n\t\t\t\t\t,377\n\t\t\t\t\t,378\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 379\n\t\t\t\t\t,376\n\t\t\t\t\t,378\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 380\n\t\t\t\t\t,381\n\t\t\t\t\t,382\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 383\n\t\t\t\t\t,380\n\t\t\t\t\t,382\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 384\n\t\t\t\t\t,385\n\t\t\t\t\t,386\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 384\n\t\t\t\t\t,387\n\t\t\t\t\t,385\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 388\n\t\t\t\t\t,389\n\t\t\t\t\t,390\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 388\n\t\t\t\t\t,391\n\t\t\t\t\t,389\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 392\n\t\t\t\t\t,393\n\t\t\t\t\t,394\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 395\n\t\t\t\t\t,392\n\t\t\t\t\t,394\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 396\n\t\t\t\t\t,397\n\t\t\t\t\t,398\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 399\n\t\t\t\t\t,396\n\t\t\t\t\t,398\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 400\n\t\t\t\t\t,401\n\t\t\t\t\t,402\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 400\n\t\t\t\t\t,403\n\t\t\t\t\t,401\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 404\n\t\t\t\t\t,405\n\t\t\t\t\t,406\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 404\n\t\t\t\t\t,407\n\t\t\t\t\t,405\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 408\n\t\t\t\t\t,409\n\t\t\t\t\t,410\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 411\n\t\t\t\t\t,408\n\t\t\t\t\t,410\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 412\n\t\t\t\t\t,413\n\t\t\t\t\t,414\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 415\n\t\t\t\t\t,412\n\t\t\t\t\t,414\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 416\n\t\t\t\t\t,417\n\t\t\t\t\t,418\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 416\n\t\t\t\t\t,419\n\t\t\t\t\t,417\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 420\n\t\t\t\t\t,421\n\t\t\t\t\t,422\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 420\n\t\t\t\t\t,432\n\t\t\t\t\t,421\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 420\n\t\t\t\t\t,437\n\t\t\t\t\t,432\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 420\n\t\t\t\t\t,442\n\t\t\t\t\t,437\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 420\n\t\t\t\t\t,447\n\t\t\t\t\t,442\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 420\n\t\t\t\t\t,452\n\t\t\t\t\t,447\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 420\n\t\t\t\t\t,457\n\t\t\t\t\t,452\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 420\n\t\t\t\t\t,462\n\t\t\t\t\t,457\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 420\n\t\t\t\t\t,467\n\t\t\t\t\t,462\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 420\n\t\t\t\t\t,472\n\t\t\t\t\t,467\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 420\n\t\t\t\t\t,477\n\t\t\t\t\t,472\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 420\n\t\t\t\t\t,482\n\t\t\t\t\t,477\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 420\n\t\t\t\t\t,487\n\t\t\t\t\t,482\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 420\n\t\t\t\t\t,492\n\t\t\t\t\t,487\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 420\n\t\t\t\t\t,497\n\t\t\t\t\t,492\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 420\n\t\t\t\t\t,422\n\t\t\t\t\t,497\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 482\n\t\t\t\t\t,484\n\t\t\t\t\t,477\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 490\n\t\t\t\t\t,484\n\t\t\t\t\t,482\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 487\n\t\t\t\t\t,490\n\t\t\t\t\t,482\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 494\n\t\t\t\t\t,490\n\t\t\t\t\t,487\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 492\n\t\t\t\t\t,494\n\t\t\t\t\t,487\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 500\n\t\t\t\t\t,494\n\t\t\t\t\t,492\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 497\n\t\t\t\t\t,500\n\t\t\t\t\t,492\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 428\n\t\t\t\t\t,500\n\t\t\t\t\t,497\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 422\n\t\t\t\t\t,428\n\t\t\t\t\t,497\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 429\n\t\t\t\t\t,428\n\t\t\t\t\t,422\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 421\n\t\t\t\t\t,429\n\t\t\t\t\t,422\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 426\n\t\t\t\t\t,427\n\t\t\t\t\t,428\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 429\n\t\t\t\t\t,426\n\t\t\t\t\t,428\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 428\n\t\t\t\t\t,499\n\t\t\t\t\t,500\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 428\n\t\t\t\t\t,427\n\t\t\t\t\t,499\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 500\n\t\t\t\t\t,499\n\t\t\t\t\t,494\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 499\n\t\t\t\t\t,495\n\t\t\t\t\t,494\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 494\n\t\t\t\t\t,495\n\t\t\t\t\t,489\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 494\n\t\t\t\t\t,489\n\t\t\t\t\t,490\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 489\n\t\t\t\t\t,485\n\t\t\t\t\t,484\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 490\n\t\t\t\t\t,489\n\t\t\t\t\t,484\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 484\n\t\t\t\t\t,485\n\t\t\t\t\t,479\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 484\n\t\t\t\t\t,479\n\t\t\t\t\t,480\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 484\n\t\t\t\t\t,480\n\t\t\t\t\t,477\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 479\n\t\t\t\t\t,475\n\t\t\t\t\t,474\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 480\n\t\t\t\t\t,479\n\t\t\t\t\t,474\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 480\n\t\t\t\t\t,474\n\t\t\t\t\t,472\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 477\n\t\t\t\t\t,480\n\t\t\t\t\t,472\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 474\n\t\t\t\t\t,469\n\t\t\t\t\t,470\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 474\n\t\t\t\t\t,475\n\t\t\t\t\t,469\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 474\n\t\t\t\t\t,470\n\t\t\t\t\t,467\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 472\n\t\t\t\t\t,474\n\t\t\t\t\t,467\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 469\n\t\t\t\t\t,465\n\t\t\t\t\t,464\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 470\n\t\t\t\t\t,469\n\t\t\t\t\t,464\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 470\n\t\t\t\t\t,464\n\t\t\t\t\t,462\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 467\n\t\t\t\t\t,470\n\t\t\t\t\t,462\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 464\n\t\t\t\t\t,459\n\t\t\t\t\t,460\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 464\n\t\t\t\t\t,465\n\t\t\t\t\t,459\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 464\n\t\t\t\t\t,460\n\t\t\t\t\t,457\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 462\n\t\t\t\t\t,464\n\t\t\t\t\t,457\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 459\n\t\t\t\t\t,455\n\t\t\t\t\t,454\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 460\n\t\t\t\t\t,459\n\t\t\t\t\t,454\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 460\n\t\t\t\t\t,454\n\t\t\t\t\t,452\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 457\n\t\t\t\t\t,460\n\t\t\t\t\t,452\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 454\n\t\t\t\t\t,449\n\t\t\t\t\t,450\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 454\n\t\t\t\t\t,455\n\t\t\t\t\t,449\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 454\n\t\t\t\t\t,450\n\t\t\t\t\t,447\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 452\n\t\t\t\t\t,454\n\t\t\t\t\t,447\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 449\n\t\t\t\t\t,445\n\t\t\t\t\t,444\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 450\n\t\t\t\t\t,449\n\t\t\t\t\t,444\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 450\n\t\t\t\t\t,444\n\t\t\t\t\t,442\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 447\n\t\t\t\t\t,450\n\t\t\t\t\t,442\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 444\n\t\t\t\t\t,439\n\t\t\t\t\t,440\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 444\n\t\t\t\t\t,445\n\t\t\t\t\t,439\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 444\n\t\t\t\t\t,440\n\t\t\t\t\t,437\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 442\n\t\t\t\t\t,444\n\t\t\t\t\t,437\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 439\n\t\t\t\t\t,435\n\t\t\t\t\t,434\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 440\n\t\t\t\t\t,439\n\t\t\t\t\t,434\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 440\n\t\t\t\t\t,434\n\t\t\t\t\t,432\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 437\n\t\t\t\t\t,440\n\t\t\t\t\t,432\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 434\n\t\t\t\t\t,426\n\t\t\t\t\t,429\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 434\n\t\t\t\t\t,435\n\t\t\t\t\t,426\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 434\n\t\t\t\t\t,429\n\t\t\t\t\t,421\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 432\n\t\t\t\t\t,434\n\t\t\t\t\t,421\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 423\n\t\t\t\t\t,424\n\t\t\t\t\t,425\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 430\n\t\t\t\t\t,423\n\t\t\t\t\t,425\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 433\n\t\t\t\t\t,424\n\t\t\t\t\t,423\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 433\n\t\t\t\t\t,423\n\t\t\t\t\t,430\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 430\n\t\t\t\t\t,425\n\t\t\t\t\t,431\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 425\n\t\t\t\t\t,424\n\t\t\t\t\t,498\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 425\n\t\t\t\t\t,498\n\t\t\t\t\t,501\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 431\n\t\t\t\t\t,425\n\t\t\t\t\t,501\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 436\n\t\t\t\t\t,433\n\t\t\t\t\t,430\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 438\n\t\t\t\t\t,424\n\t\t\t\t\t,433\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 441\n\t\t\t\t\t,433\n\t\t\t\t\t,436\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 441\n\t\t\t\t\t,438\n\t\t\t\t\t,433\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 443\n\t\t\t\t\t,424\n\t\t\t\t\t,438\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 443\n\t\t\t\t\t,438\n\t\t\t\t\t,441\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 446\n\t\t\t\t\t,443\n\t\t\t\t\t,441\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 448\n\t\t\t\t\t,424\n\t\t\t\t\t,443\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 451\n\t\t\t\t\t,443\n\t\t\t\t\t,446\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 451\n\t\t\t\t\t,448\n\t\t\t\t\t,443\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 453\n\t\t\t\t\t,424\n\t\t\t\t\t,448\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 453\n\t\t\t\t\t,448\n\t\t\t\t\t,451\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 456\n\t\t\t\t\t,453\n\t\t\t\t\t,451\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 458\n\t\t\t\t\t,424\n\t\t\t\t\t,453\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 461\n\t\t\t\t\t,453\n\t\t\t\t\t,456\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 461\n\t\t\t\t\t,458\n\t\t\t\t\t,453\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 463\n\t\t\t\t\t,424\n\t\t\t\t\t,458\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 463\n\t\t\t\t\t,458\n\t\t\t\t\t,461\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 466\n\t\t\t\t\t,463\n\t\t\t\t\t,461\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 468\n\t\t\t\t\t,424\n\t\t\t\t\t,463\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 471\n\t\t\t\t\t,463\n\t\t\t\t\t,466\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 471\n\t\t\t\t\t,468\n\t\t\t\t\t,463\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 473\n\t\t\t\t\t,424\n\t\t\t\t\t,468\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 473\n\t\t\t\t\t,468\n\t\t\t\t\t,471\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 476\n\t\t\t\t\t,473\n\t\t\t\t\t,471\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 478\n\t\t\t\t\t,424\n\t\t\t\t\t,473\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 481\n\t\t\t\t\t,473\n\t\t\t\t\t,476\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 481\n\t\t\t\t\t,478\n\t\t\t\t\t,473\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 483\n\t\t\t\t\t,424\n\t\t\t\t\t,478\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 483\n\t\t\t\t\t,478\n\t\t\t\t\t,481\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 488\n\t\t\t\t\t,424\n\t\t\t\t\t,483\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 493\n\t\t\t\t\t,424\n\t\t\t\t\t,488\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 498\n\t\t\t\t\t,424\n\t\t\t\t\t,493\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 486\n\t\t\t\t\t,483\n\t\t\t\t\t,481\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 491\n\t\t\t\t\t,483\n\t\t\t\t\t,486\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 491\n\t\t\t\t\t,488\n\t\t\t\t\t,483\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 493\n\t\t\t\t\t,488\n\t\t\t\t\t,491\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 496\n\t\t\t\t\t,493\n\t\t\t\t\t,491\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 501\n\t\t\t\t\t,493\n\t\t\t\t\t,496\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 501\n\t\t\t\t\t,498\n\t\t\t\t\t,493\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 502\n\t\t\t\t\t,503\n\t\t\t\t\t,504\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 502\n\t\t\t\t\t,505\n\t\t\t\t\t,503\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 506\n\t\t\t\t\t,507\n\t\t\t\t\t,508\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 509\n\t\t\t\t\t,506\n\t\t\t\t\t,508\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 510\n\t\t\t\t\t,511\n\t\t\t\t\t,512\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 513\n\t\t\t\t\t,510\n\t\t\t\t\t,512\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 514\n\t\t\t\t\t,515\n\t\t\t\t\t,516\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 514\n\t\t\t\t\t,517\n\t\t\t\t\t,515\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 518\n\t\t\t\t\t,519\n\t\t\t\t\t,520\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 518\n\t\t\t\t\t,521\n\t\t\t\t\t,519\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 522\n\t\t\t\t\t,523\n\t\t\t\t\t,524\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 525\n\t\t\t\t\t,522\n\t\t\t\t\t,524\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 526\n\t\t\t\t\t,527\n\t\t\t\t\t,528\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 529\n\t\t\t\t\t,526\n\t\t\t\t\t,528\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 530\n\t\t\t\t\t,531\n\t\t\t\t\t,532\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 530\n\t\t\t\t\t,533\n\t\t\t\t\t,531\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 534\n\t\t\t\t\t,535\n\t\t\t\t\t,536\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 534\n\t\t\t\t\t,537\n\t\t\t\t\t,535\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 538\n\t\t\t\t\t,539\n\t\t\t\t\t,540\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 541\n\t\t\t\t\t,538\n\t\t\t\t\t,540\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 542\n\t\t\t\t\t,543\n\t\t\t\t\t,544\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 545\n\t\t\t\t\t,542\n\t\t\t\t\t,544\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 546\n\t\t\t\t\t,547\n\t\t\t\t\t,548\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 546\n\t\t\t\t\t,549\n\t\t\t\t\t,547\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 550\n\t\t\t\t\t,551\n\t\t\t\t\t,552\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 550\n\t\t\t\t\t,553\n\t\t\t\t\t,551\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 554\n\t\t\t\t\t,555\n\t\t\t\t\t,556\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 557\n\t\t\t\t\t,554\n\t\t\t\t\t,556\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 558\n\t\t\t\t\t,559\n\t\t\t\t\t,560\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 561\n\t\t\t\t\t,558\n\t\t\t\t\t,560\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 562\n\t\t\t\t\t,563\n\t\t\t\t\t,564\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 562\n\t\t\t\t\t,565\n\t\t\t\t\t,563\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 566\n\t\t\t\t\t,567\n\t\t\t\t\t,568\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 566\n\t\t\t\t\t,569\n\t\t\t\t\t,567\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 570\n\t\t\t\t\t,571\n\t\t\t\t\t,572\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 573\n\t\t\t\t\t,570\n\t\t\t\t\t,572\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 574\n\t\t\t\t\t,575\n\t\t\t\t\t,576\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 577\n\t\t\t\t\t,574\n\t\t\t\t\t,576\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 578\n\t\t\t\t\t,579\n\t\t\t\t\t,580\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 578\n\t\t\t\t\t,581\n\t\t\t\t\t,579\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 582\n\t\t\t\t\t,583\n\t\t\t\t\t,584\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 582\n\t\t\t\t\t,585\n\t\t\t\t\t,583\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 586\n\t\t\t\t\t,587\n\t\t\t\t\t,588\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 589\n\t\t\t\t\t,586\n\t\t\t\t\t,588\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 590\n\t\t\t\t\t,591\n\t\t\t\t\t,592\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 593\n\t\t\t\t\t,590\n\t\t\t\t\t,592\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 594\n\t\t\t\t\t,595\n\t\t\t\t\t,596\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 594\n\t\t\t\t\t,597\n\t\t\t\t\t,595\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 598\n\t\t\t\t\t,599\n\t\t\t\t\t,600\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 598\n\t\t\t\t\t,601\n\t\t\t\t\t,599\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 602\n\t\t\t\t\t,603\n\t\t\t\t\t,604\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 605\n\t\t\t\t\t,602\n\t\t\t\t\t,604\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 606\n\t\t\t\t\t,607\n\t\t\t\t\t,608\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 609\n\t\t\t\t\t,606\n\t\t\t\t\t,608\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 610\n\t\t\t\t\t,611\n\t\t\t\t\t,612\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 610\n\t\t\t\t\t,613\n\t\t\t\t\t,611\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 614\n\t\t\t\t\t,615\n\t\t\t\t\t,616\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 614\n\t\t\t\t\t,617\n\t\t\t\t\t,615\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 618\n\t\t\t\t\t,619\n\t\t\t\t\t,620\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 621\n\t\t\t\t\t,618\n\t\t\t\t\t,620\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 622\n\t\t\t\t\t,623\n\t\t\t\t\t,624\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 625\n\t\t\t\t\t,622\n\t\t\t\t\t,624\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 626\n\t\t\t\t\t,627\n\t\t\t\t\t,628\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 626\n\t\t\t\t\t,629\n\t\t\t\t\t,627\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 630\n\t\t\t\t\t,631\n\t\t\t\t\t,632\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 631\n\t\t\t\t\t,633\n\t\t\t\t\t,632\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 634\n\t\t\t\t\t,635\n\t\t\t\t\t,636\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 635\n\t\t\t\t\t,637\n\t\t\t\t\t,636\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 638\n\t\t\t\t\t,639\n\t\t\t\t\t,640\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 639\n\t\t\t\t\t,641\n\t\t\t\t\t,640\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 642\n\t\t\t\t\t,643\n\t\t\t\t\t,644\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 643\n\t\t\t\t\t,645\n\t\t\t\t\t,644\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 646\n\t\t\t\t\t,647\n\t\t\t\t\t,648\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 674\n\t\t\t\t\t,647\n\t\t\t\t\t,646\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 674\n\t\t\t\t\t,646\n\t\t\t\t\t,675\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 647\n\t\t\t\t\t,649\n\t\t\t\t\t,648\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 647\n\t\t\t\t\t,664\n\t\t\t\t\t,649\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 673\n\t\t\t\t\t,664\n\t\t\t\t\t,647\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 673\n\t\t\t\t\t,647\n\t\t\t\t\t,674\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 666\n\t\t\t\t\t,648\n\t\t\t\t\t,649\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 664\n\t\t\t\t\t,665\n\t\t\t\t\t,649\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 666\n\t\t\t\t\t,649\n\t\t\t\t\t,667\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 669\n\t\t\t\t\t,649\n\t\t\t\t\t,670\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 669\n\t\t\t\t\t,670\n\t\t\t\t\t,671\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 650\n\t\t\t\t\t,651\n\t\t\t\t\t,652\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 651\n\t\t\t\t\t,653\n\t\t\t\t\t,652\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 652\n\t\t\t\t\t,654\n\t\t\t\t\t,663\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 652\n\t\t\t\t\t,663\n\t\t\t\t\t,668\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 653\n\t\t\t\t\t,654\n\t\t\t\t\t,652\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 653\n\t\t\t\t\t,655\n\t\t\t\t\t,654\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 654\n\t\t\t\t\t,655\n\t\t\t\t\t,656\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 656\n\t\t\t\t\t,662\n\t\t\t\t\t,654\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 662\n\t\t\t\t\t,663\n\t\t\t\t\t,654\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 655\n\t\t\t\t\t,657\n\t\t\t\t\t,656\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 658\n\t\t\t\t\t,656\n\t\t\t\t\t,657\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 672\n\t\t\t\t\t,662\n\t\t\t\t\t,656\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 672\n\t\t\t\t\t,656\n\t\t\t\t\t,658\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 658\n\t\t\t\t\t,657\n\t\t\t\t\t,659\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 658\n\t\t\t\t\t,659\n\t\t\t\t\t,660\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 659\n\t\t\t\t\t,661\n\t\t\t\t\t,660\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 676\n\t\t\t\t\t,677\n\t\t\t\t\t,678\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 676\n\t\t\t\t\t,679\n\t\t\t\t\t,677\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 680\n\t\t\t\t\t,681\n\t\t\t\t\t,682\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 680\n\t\t\t\t\t,683\n\t\t\t\t\t,681\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 684\n\t\t\t\t\t,685\n\t\t\t\t\t,686\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 684\n\t\t\t\t\t,687\n\t\t\t\t\t,685\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 688\n\t\t\t\t\t,689\n\t\t\t\t\t,690\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 688\n\t\t\t\t\t,691\n\t\t\t\t\t,689\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 692\n\t\t\t\t\t,693\n\t\t\t\t\t,694\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 692\n\t\t\t\t\t,695\n\t\t\t\t\t,693\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 695\n\t\t\t\t\t,692\n\t\t\t\t\t,712\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 695\n\t\t\t\t\t,710\n\t\t\t\t\t,693\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 693\n\t\t\t\t\t,710\n\t\t\t\t\t,705\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 707\n\t\t\t\t\t,693\n\t\t\t\t\t,705\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 694\n\t\t\t\t\t,693\n\t\t\t\t\t,707\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 723\n\t\t\t\t\t,694\n\t\t\t\t\t,707\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 704\n\t\t\t\t\t,707\n\t\t\t\t\t,705\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 704\n\t\t\t\t\t,705\n\t\t\t\t\t,706\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 695\n\t\t\t\t\t,711\n\t\t\t\t\t,710\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 713\n\t\t\t\t\t,695\n\t\t\t\t\t,712\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 716\n\t\t\t\t\t,695\n\t\t\t\t\t,697\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 699\n\t\t\t\t\t,716\n\t\t\t\t\t,697\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 696\n\t\t\t\t\t,697\n\t\t\t\t\t,698\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 696\n\t\t\t\t\t,699\n\t\t\t\t\t,697\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 700\n\t\t\t\t\t,701\n\t\t\t\t\t,702\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 700\n\t\t\t\t\t,703\n\t\t\t\t\t,701\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 702\n\t\t\t\t\t,708\n\t\t\t\t\t,700\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 703\n\t\t\t\t\t,700\n\t\t\t\t\t,719\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 700\n\t\t\t\t\t,708\n\t\t\t\t\t,721\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 722\n\t\t\t\t\t,700\n\t\t\t\t\t,721\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 702\n\t\t\t\t\t,701\n\t\t\t\t\t,717\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 718\n\t\t\t\t\t,702\n\t\t\t\t\t,717\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 702\n\t\t\t\t\t,709\n\t\t\t\t\t,708\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 709\n\t\t\t\t\t,702\n\t\t\t\t\t,714\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 715\n\t\t\t\t\t,709\n\t\t\t\t\t,714\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 720\n\t\t\t\t\t,703\n\t\t\t\t\t,719\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 724\n\t\t\t\t\t,725\n\t\t\t\t\t,726\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 725\n\t\t\t\t\t,727\n\t\t\t\t\t,726\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 728\n\t\t\t\t\t,729\n\t\t\t\t\t,730\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 729\n\t\t\t\t\t,731\n\t\t\t\t\t,730\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 732\n\t\t\t\t\t,733\n\t\t\t\t\t,734\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 735\n\t\t\t\t\t,736\n\t\t\t\t\t,734\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 737\n\t\t\t\t\t,738\n\t\t\t\t\t,739\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 738\n\t\t\t\t\t,740\n\t\t\t\t\t,739\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 741\n\t\t\t\t\t,742\n\t\t\t\t\t,743\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 742\n\t\t\t\t\t,744\n\t\t\t\t\t,743\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 745\n\t\t\t\t\t,746\n\t\t\t\t\t,747\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 747\n\t\t\t\t\t,748\n\t\t\t\t\t,745\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 748\n\t\t\t\t\t,749\n\t\t\t\t\t,745\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 745\n\t\t\t\t\t,752\n\t\t\t\t\t,753\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 745\n\t\t\t\t\t,753\n\t\t\t\t\t,754\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 748\n\t\t\t\t\t,750\n\t\t\t\t\t,751\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 751\n\t\t\t\t\t,749\n\t\t\t\t\t,748\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 754\n\t\t\t\t\t,753\n\t\t\t\t\t,755\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 754\n\t\t\t\t\t,755\n\t\t\t\t\t,756\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 773\n\t\t\t\t\t,753\n\t\t\t\t\t,752\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 752\n\t\t\t\t\t,774\n\t\t\t\t\t,773\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 752\n\t\t\t\t\t,775\n\t\t\t\t\t,774\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 776\n\t\t\t\t\t,777\n\t\t\t\t\t,774\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 774\n\t\t\t\t\t,775\n\t\t\t\t\t,776\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 757\n\t\t\t\t\t,758\n\t\t\t\t\t,759\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 757\n\t\t\t\t\t,759\n\t\t\t\t\t,760\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 761\n\t\t\t\t\t,762\n\t\t\t\t\t,763\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 761\n\t\t\t\t\t,763\n\t\t\t\t\t,764\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 765\n\t\t\t\t\t,766\n\t\t\t\t\t,767\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 765\n\t\t\t\t\t,767\n\t\t\t\t\t,768\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 769\n\t\t\t\t\t,770\n\t\t\t\t\t,771\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 769\n\t\t\t\t\t,771\n\t\t\t\t\t,772\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 778\n\t\t\t\t\t,779\n\t\t\t\t\t,780\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 779\n\t\t\t\t\t,781\n\t\t\t\t\t,780\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 794\n\t\t\t\t\t,781\n\t\t\t\t\t,779\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 794\n\t\t\t\t\t,779\n\t\t\t\t\t,795\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 780\n\t\t\t\t\t,781\n\t\t\t\t\t,782\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 780\n\t\t\t\t\t,782\n\t\t\t\t\t,783\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 796\n\t\t\t\t\t,782\n\t\t\t\t\t,781\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 796\n\t\t\t\t\t,781\n\t\t\t\t\t,794\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 802\n\t\t\t\t\t,794\n\t\t\t\t\t,795\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 804\n\t\t\t\t\t,796\n\t\t\t\t\t,794\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 804\n\t\t\t\t\t,794\n\t\t\t\t\t,802\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 802\n\t\t\t\t\t,795\n\t\t\t\t\t,803\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 810\n\t\t\t\t\t,802\n\t\t\t\t\t,803\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 812\n\t\t\t\t\t,804\n\t\t\t\t\t,802\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 812\n\t\t\t\t\t,802\n\t\t\t\t\t,810\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 805\n\t\t\t\t\t,796\n\t\t\t\t\t,804\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 813\n\t\t\t\t\t,805\n\t\t\t\t\t,804\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 813\n\t\t\t\t\t,804\n\t\t\t\t\t,812\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 797\n\t\t\t\t\t,782\n\t\t\t\t\t,796\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 805\n\t\t\t\t\t,797\n\t\t\t\t\t,796\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 797\n\t\t\t\t\t,785\n\t\t\t\t\t,782\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 782\n\t\t\t\t\t,785\n\t\t\t\t\t,784\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 783\n\t\t\t\t\t,782\n\t\t\t\t\t,784\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 820\n\t\t\t\t\t,812\n\t\t\t\t\t,810\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 821\n\t\t\t\t\t,813\n\t\t\t\t\t,812\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 821\n\t\t\t\t\t,812\n\t\t\t\t\t,820\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 820\n\t\t\t\t\t,810\n\t\t\t\t\t,818\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 818\n\t\t\t\t\t,810\n\t\t\t\t\t,811\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 818\n\t\t\t\t\t,811\n\t\t\t\t\t,819\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 810\n\t\t\t\t\t,803\n\t\t\t\t\t,811\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 786\n\t\t\t\t\t,787\n\t\t\t\t\t,788\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 786\n\t\t\t\t\t,788\n\t\t\t\t\t,789\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 798\n\t\t\t\t\t,788\n\t\t\t\t\t,787\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 798\n\t\t\t\t\t,787\n\t\t\t\t\t,799\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 789\n\t\t\t\t\t,788\n\t\t\t\t\t,790\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 788\n\t\t\t\t\t,791\n\t\t\t\t\t,790\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 800\n\t\t\t\t\t,791\n\t\t\t\t\t,788\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 800\n\t\t\t\t\t,788\n\t\t\t\t\t,798\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 806\n\t\t\t\t\t,798\n\t\t\t\t\t,799\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 808\n\t\t\t\t\t,800\n\t\t\t\t\t,798\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 808\n\t\t\t\t\t,798\n\t\t\t\t\t,806\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 806\n\t\t\t\t\t,799\n\t\t\t\t\t,807\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 814\n\t\t\t\t\t,806\n\t\t\t\t\t,807\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 816\n\t\t\t\t\t,808\n\t\t\t\t\t,806\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 816\n\t\t\t\t\t,806\n\t\t\t\t\t,814\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 809\n\t\t\t\t\t,800\n\t\t\t\t\t,808\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 817\n\t\t\t\t\t,809\n\t\t\t\t\t,808\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 817\n\t\t\t\t\t,808\n\t\t\t\t\t,816\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 801\n\t\t\t\t\t,791\n\t\t\t\t\t,800\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 809\n\t\t\t\t\t,801\n\t\t\t\t\t,800\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 801\n\t\t\t\t\t,792\n\t\t\t\t\t,791\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 790\n\t\t\t\t\t,791\n\t\t\t\t\t,792\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 790\n\t\t\t\t\t,792\n\t\t\t\t\t,793\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 824\n\t\t\t\t\t,816\n\t\t\t\t\t,814\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 825\n\t\t\t\t\t,817\n\t\t\t\t\t,816\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 825\n\t\t\t\t\t,816\n\t\t\t\t\t,824\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 824\n\t\t\t\t\t,814\n\t\t\t\t\t,822\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 822\n\t\t\t\t\t,814\n\t\t\t\t\t,815\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 822\n\t\t\t\t\t,815\n\t\t\t\t\t,823\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 814\n\t\t\t\t\t,807\n\t\t\t\t\t,815\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 826\n\t\t\t\t\t,827\n\t\t\t\t\t,828\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 826\n\t\t\t\t\t,828\n\t\t\t\t\t,829\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 830\n\t\t\t\t\t,827\n\t\t\t\t\t,826\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 830\n\t\t\t\t\t,831\n\t\t\t\t\t,827\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 832\n\t\t\t\t\t,831\n\t\t\t\t\t,830\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 832\n\t\t\t\t\t,833\n\t\t\t\t\t,831\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 834\n\t\t\t\t\t,835\n\t\t\t\t\t,836\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 834\n\t\t\t\t\t,836\n\t\t\t\t\t,837\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 838\n\t\t\t\t\t,835\n\t\t\t\t\t,834\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 838\n\t\t\t\t\t,839\n\t\t\t\t\t,835\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 840\n\t\t\t\t\t,839\n\t\t\t\t\t,838\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 840\n\t\t\t\t\t,841\n\t\t\t\t\t,839\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 842\n\t\t\t\t\t,843\n\t\t\t\t\t,844\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 843\n\t\t\t\t\t,845\n\t\t\t\t\t,844\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 846\n\t\t\t\t\t,847\n\t\t\t\t\t,848\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 846\n\t\t\t\t\t,848\n\t\t\t\t\t,849\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 850\n\t\t\t\t\t,851\n\t\t\t\t\t,852\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 851\n\t\t\t\t\t,853\n\t\t\t\t\t,852\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 854\n\t\t\t\t\t,855\n\t\t\t\t\t,856\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 854\n\t\t\t\t\t,856\n\t\t\t\t\t,857\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 858\n\t\t\t\t\t,859\n\t\t\t\t\t,860\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 859\n\t\t\t\t\t,861\n\t\t\t\t\t,860\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 862\n\t\t\t\t\t,863\n\t\t\t\t\t,864\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 862\n\t\t\t\t\t,864\n\t\t\t\t\t,865\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 866\n\t\t\t\t\t,867\n\t\t\t\t\t,868\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 882\n\t\t\t\t\t,867\n\t\t\t\t\t,866\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 884\n\t\t\t\t\t,866\n\t\t\t\t\t,868\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 892\n\t\t\t\t\t,882\n\t\t\t\t\t,866\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 892\n\t\t\t\t\t,866\n\t\t\t\t\t,884\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 867\n\t\t\t\t\t,869\n\t\t\t\t\t,868\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 882\n\t\t\t\t\t,883\n\t\t\t\t\t,867\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 868\n\t\t\t\t\t,869\n\t\t\t\t\t,870\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 868\n\t\t\t\t\t,870\n\t\t\t\t\t,871\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 871\n\t\t\t\t\t,870\n\t\t\t\t\t,872\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 870\n\t\t\t\t\t,873\n\t\t\t\t\t,872\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 885\n\t\t\t\t\t,868\n\t\t\t\t\t,871\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 885\n\t\t\t\t\t,871\n\t\t\t\t\t,886\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 886\n\t\t\t\t\t,871\n\t\t\t\t\t,872\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 872\n\t\t\t\t\t,873\n\t\t\t\t\t,874\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 872\n\t\t\t\t\t,874\n\t\t\t\t\t,875\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 886\n\t\t\t\t\t,872\n\t\t\t\t\t,887\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 887\n\t\t\t\t\t,872\n\t\t\t\t\t,875\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 894\n\t\t\t\t\t,885\n\t\t\t\t\t,886\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 894\n\t\t\t\t\t,886\n\t\t\t\t\t,895\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 895\n\t\t\t\t\t,886\n\t\t\t\t\t,887\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 887\n\t\t\t\t\t,875\n\t\t\t\t\t,888\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 895\n\t\t\t\t\t,887\n\t\t\t\t\t,896\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 896\n\t\t\t\t\t,887\n\t\t\t\t\t,888\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 875\n\t\t\t\t\t,874\n\t\t\t\t\t,876\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 888\n\t\t\t\t\t,875\n\t\t\t\t\t,876\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 874\n\t\t\t\t\t,877\n\t\t\t\t\t,876\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 888\n\t\t\t\t\t,876\n\t\t\t\t\t,889\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 896\n\t\t\t\t\t,888\n\t\t\t\t\t,897\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 897\n\t\t\t\t\t,888\n\t\t\t\t\t,889\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 897\n\t\t\t\t\t,889\n\t\t\t\t\t,898\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 893\n\t\t\t\t\t,885\n\t\t\t\t\t,894\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 893\n\t\t\t\t\t,884\n\t\t\t\t\t,885\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 904\n\t\t\t\t\t,884\n\t\t\t\t\t,893\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 884\n\t\t\t\t\t,868\n\t\t\t\t\t,885\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 904\n\t\t\t\t\t,892\n\t\t\t\t\t,884\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 903\n\t\t\t\t\t,892\n\t\t\t\t\t,904\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 891\n\t\t\t\t\t,882\n\t\t\t\t\t,892\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 903\n\t\t\t\t\t,891\n\t\t\t\t\t,892\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 902\n\t\t\t\t\t,891\n\t\t\t\t\t,903\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 890\n\t\t\t\t\t,881\n\t\t\t\t\t,891\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 891\n\t\t\t\t\t,881\n\t\t\t\t\t,882\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 881\n\t\t\t\t\t,880\n\t\t\t\t\t,882\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 880\n\t\t\t\t\t,883\n\t\t\t\t\t,882\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 878\n\t\t\t\t\t,880\n\t\t\t\t\t,881\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 890\n\t\t\t\t\t,878\n\t\t\t\t\t,881\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 878\n\t\t\t\t\t,879\n\t\t\t\t\t,880\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 899\n\t\t\t\t\t,900\n\t\t\t\t\t,901\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 905\n\t\t\t\t\t,906\n\t\t\t\t\t,907\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 905\n\t\t\t\t\t,907\n\t\t\t\t\t,919\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 929\n\t\t\t\t\t,907\n\t\t\t\t\t,906\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 919\n\t\t\t\t\t,907\n\t\t\t\t\t,909\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 930\n\t\t\t\t\t,931\n\t\t\t\t\t,907\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 907\n\t\t\t\t\t,929\n\t\t\t\t\t,930\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 919\n\t\t\t\t\t,909\n\t\t\t\t\t,908\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 908\n\t\t\t\t\t,909\n\t\t\t\t\t,910\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 908\n\t\t\t\t\t,910\n\t\t\t\t\t,920\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 920\n\t\t\t\t\t,910\n\t\t\t\t\t,921\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 920\n\t\t\t\t\t,921\n\t\t\t\t\t,922\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 922\n\t\t\t\t\t,921\n\t\t\t\t\t,923\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 921\n\t\t\t\t\t,932\n\t\t\t\t\t,931\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 931\n\t\t\t\t\t,930\n\t\t\t\t\t,921\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 929\n\t\t\t\t\t,933\n\t\t\t\t\t,930\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 922\n\t\t\t\t\t,923\n\t\t\t\t\t,924\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 911\n\t\t\t\t\t,912\n\t\t\t\t\t,913\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 912\n\t\t\t\t\t,914\n\t\t\t\t\t,915\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 915\n\t\t\t\t\t,913\n\t\t\t\t\t,912\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 915\n\t\t\t\t\t,918\n\t\t\t\t\t,913\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 917\n\t\t\t\t\t,915\n\t\t\t\t\t,914\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 914\n\t\t\t\t\t,916\n\t\t\t\t\t,917\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 925\n\t\t\t\t\t,926\n\t\t\t\t\t,927\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 925\n\t\t\t\t\t,927\n\t\t\t\t\t,928\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 934\n\t\t\t\t\t,935\n\t\t\t\t\t,936\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 940\n\t\t\t\t\t,935\n\t\t\t\t\t,934\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 936\n\t\t\t\t\t,935\n\t\t\t\t\t,937\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 937\n\t\t\t\t\t,935\n\t\t\t\t\t,938\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 938\n\t\t\t\t\t,935\n\t\t\t\t\t,939\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 939\n\t\t\t\t\t,935\n\t\t\t\t\t,940\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 941\n\t\t\t\t\t,942\n\t\t\t\t\t,943\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 942\n\t\t\t\t\t,944\n\t\t\t\t\t,943\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 943\n\t\t\t\t\t,944\n\t\t\t\t\t,945\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 943\n\t\t\t\t\t,945\n\t\t\t\t\t,946\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 946\n\t\t\t\t\t,945\n\t\t\t\t\t,947\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 945\n\t\t\t\t\t,948\n\t\t\t\t\t,947\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 949\n\t\t\t\t\t,950\n\t\t\t\t\t,951\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 949\n\t\t\t\t\t,951\n\t\t\t\t\t,952\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 952\n\t\t\t\t\t,951\n\t\t\t\t\t,953\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 951\n\t\t\t\t\t,954\n\t\t\t\t\t,953\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 953\n\t\t\t\t\t,954\n\t\t\t\t\t,955\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 953\n\t\t\t\t\t,955\n\t\t\t\t\t,956\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 957\n\t\t\t\t\t,958\n\t\t\t\t\t,959\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 958\n\t\t\t\t\t,960\n\t\t\t\t\t,959\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 961\n\t\t\t\t\t,962\n\t\t\t\t\t,963\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 962\n\t\t\t\t\t,964\n\t\t\t\t\t,963\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 965\n\t\t\t\t\t,966\n\t\t\t\t\t,967\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 966\n\t\t\t\t\t,968\n\t\t\t\t\t,967\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 969\n\t\t\t\t\t,970\n\t\t\t\t\t,971\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 970\n\t\t\t\t\t,972\n\t\t\t\t\t,971\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 973\n\t\t\t\t\t,974\n\t\t\t\t\t,975\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 974\n\t\t\t\t\t,976\n\t\t\t\t\t,975\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 977\n\t\t\t\t\t,978\n\t\t\t\t\t,979\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 977\n\t\t\t\t\t,979\n\t\t\t\t\t,980\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 981\n\t\t\t\t\t,977\n\t\t\t\t\t,980\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 981\n\t\t\t\t\t,980\n\t\t\t\t\t,982\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 983\n\t\t\t\t\t,984\n\t\t\t\t\t,985\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 983\n\t\t\t\t\t,985\n\t\t\t\t\t,986\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 987\n\t\t\t\t\t,984\n\t\t\t\t\t,983\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 987\n\t\t\t\t\t,988\n\t\t\t\t\t,984\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 989\n\t\t\t\t\t,988\n\t\t\t\t\t,987\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 989\n\t\t\t\t\t,990\n\t\t\t\t\t,988\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1001\n\t\t\t\t\t,990\n\t\t\t\t\t,989\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1001\n\t\t\t\t\t,1002\n\t\t\t\t\t,990\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1003\n\t\t\t\t\t,1002\n\t\t\t\t\t,1001\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1003\n\t\t\t\t\t,1004\n\t\t\t\t\t,1002\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1005\n\t\t\t\t\t,1004\n\t\t\t\t\t,1003\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1005\n\t\t\t\t\t,1006\n\t\t\t\t\t,1004\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 986\n\t\t\t\t\t,985\n\t\t\t\t\t,991\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 986\n\t\t\t\t\t,991\n\t\t\t\t\t,992\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 992\n\t\t\t\t\t,991\n\t\t\t\t\t,993\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 992\n\t\t\t\t\t,993\n\t\t\t\t\t,994\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 994\n\t\t\t\t\t,993\n\t\t\t\t\t,995\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 994\n\t\t\t\t\t,995\n\t\t\t\t\t,996\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 996\n\t\t\t\t\t,995\n\t\t\t\t\t,997\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 996\n\t\t\t\t\t,997\n\t\t\t\t\t,998\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 998\n\t\t\t\t\t,997\n\t\t\t\t\t,999\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 998\n\t\t\t\t\t,999\n\t\t\t\t\t,1000\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1007\n\t\t\t\t\t,1008\n\t\t\t\t\t,1009\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1007\n\t\t\t\t\t,1009\n\t\t\t\t\t,1010\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1011\n\t\t\t\t\t,1008\n\t\t\t\t\t,1007\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1011\n\t\t\t\t\t,1012\n\t\t\t\t\t,1008\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1013\n\t\t\t\t\t,1014\n\t\t\t\t\t,1015\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1013\n\t\t\t\t\t,1019\n\t\t\t\t\t,1020\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1020\n\t\t\t\t\t,1014\n\t\t\t\t\t,1013\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1014\n\t\t\t\t\t,1016\n\t\t\t\t\t,1015\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1014\n\t\t\t\t\t,1017\n\t\t\t\t\t,1016\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1014\n\t\t\t\t\t,1018\n\t\t\t\t\t,1017\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1021\n\t\t\t\t\t,1014\n\t\t\t\t\t,1020\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1018\n\t\t\t\t\t,1014\n\t\t\t\t\t,1021\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1022\n\t\t\t\t\t,1020\n\t\t\t\t\t,1019\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1019\n\t\t\t\t\t,1023\n\t\t\t\t\t,1024\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1024\n\t\t\t\t\t,1022\n\t\t\t\t\t,1019\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1023\n\t\t\t\t\t,1025\n\t\t\t\t\t,1026\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1023\n\t\t\t\t\t,1026\n\t\t\t\t\t,1024\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1025\n\t\t\t\t\t,1027\n\t\t\t\t\t,1026\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1035\n\t\t\t\t\t,1027\n\t\t\t\t\t,1025\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1021\n\t\t\t\t\t,1028\n\t\t\t\t\t,1018\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1018\n\t\t\t\t\t,1028\n\t\t\t\t\t,1029\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1029\n\t\t\t\t\t,1028\n\t\t\t\t\t,1030\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1029\n\t\t\t\t\t,1017\n\t\t\t\t\t,1018\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1031\n\t\t\t\t\t,1029\n\t\t\t\t\t,1030\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1031\n\t\t\t\t\t,1030\n\t\t\t\t\t,1032\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1033\n\t\t\t\t\t,1031\n\t\t\t\t\t,1032\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1032\n\t\t\t\t\t,1034\n\t\t\t\t\t,1033\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1036\n\t\t\t\t\t,1037\n\t\t\t\t\t,1038\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1036\n\t\t\t\t\t,1038\n\t\t\t\t\t,1039\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1040\n\t\t\t\t\t,1037\n\t\t\t\t\t,1036\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1040\n\t\t\t\t\t,1041\n\t\t\t\t\t,1037\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1042\n\t\t\t\t\t,1041\n\t\t\t\t\t,1040\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1042\n\t\t\t\t\t,1043\n\t\t\t\t\t,1041\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1070\n\t\t\t\t\t,1043\n\t\t\t\t\t,1042\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1070\n\t\t\t\t\t,1071\n\t\t\t\t\t,1043\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1074\n\t\t\t\t\t,1071\n\t\t\t\t\t,1070\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1074\n\t\t\t\t\t,1075\n\t\t\t\t\t,1071\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1078\n\t\t\t\t\t,1075\n\t\t\t\t\t,1074\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1078\n\t\t\t\t\t,1079\n\t\t\t\t\t,1075\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1083\n\t\t\t\t\t,1079\n\t\t\t\t\t,1078\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1083\n\t\t\t\t\t,1084\n\t\t\t\t\t,1079\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1039\n\t\t\t\t\t,1038\n\t\t\t\t\t,1044\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1039\n\t\t\t\t\t,1044\n\t\t\t\t\t,1045\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1045\n\t\t\t\t\t,1044\n\t\t\t\t\t,1052\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1045\n\t\t\t\t\t,1052\n\t\t\t\t\t,1053\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1053\n\t\t\t\t\t,1052\n\t\t\t\t\t,1056\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1053\n\t\t\t\t\t,1056\n\t\t\t\t\t,1057\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1057\n\t\t\t\t\t,1056\n\t\t\t\t\t,1061\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1057\n\t\t\t\t\t,1061\n\t\t\t\t\t,1062\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1062\n\t\t\t\t\t,1061\n\t\t\t\t\t,1066\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1062\n\t\t\t\t\t,1066\n\t\t\t\t\t,1067\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1067\n\t\t\t\t\t,1066\n\t\t\t\t\t,1065\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1067\n\t\t\t\t\t,1085\n\t\t\t\t\t,1086\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1064\n\t\t\t\t\t,1065\n\t\t\t\t\t,1060\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1064\n\t\t\t\t\t,1060\n\t\t\t\t\t,1063\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1059\n\t\t\t\t\t,1060\n\t\t\t\t\t,1058\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1059\n\t\t\t\t\t,1063\n\t\t\t\t\t,1060\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1059\n\t\t\t\t\t,1058\n\t\t\t\t\t,1054\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1054\n\t\t\t\t\t,1058\n\t\t\t\t\t,1055\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1050\n\t\t\t\t\t,1054\n\t\t\t\t\t,1051\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1054\n\t\t\t\t\t,1055\n\t\t\t\t\t,1051\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1050\n\t\t\t\t\t,1051\n\t\t\t\t\t,1047\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1050\n\t\t\t\t\t,1047\n\t\t\t\t\t,1046\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1046\n\t\t\t\t\t,1047\n\t\t\t\t\t,1048\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1046\n\t\t\t\t\t,1048\n\t\t\t\t\t,1049\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1049\n\t\t\t\t\t,1048\n\t\t\t\t\t,1068\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1049\n\t\t\t\t\t,1068\n\t\t\t\t\t,1069\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1069\n\t\t\t\t\t,1068\n\t\t\t\t\t,1072\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1069\n\t\t\t\t\t,1072\n\t\t\t\t\t,1073\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1073\n\t\t\t\t\t,1072\n\t\t\t\t\t,1076\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1073\n\t\t\t\t\t,1076\n\t\t\t\t\t,1077\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1080\n\t\t\t\t\t,1076\n\t\t\t\t\t,1081\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1077\n\t\t\t\t\t,1076\n\t\t\t\t\t,1082\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1087\n\t\t\t\t\t,1088\n\t\t\t\t\t,1089\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1087\n\t\t\t\t\t,1089\n\t\t\t\t\t,1090\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1091\n\t\t\t\t\t,1088\n\t\t\t\t\t,1087\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1091\n\t\t\t\t\t,1092\n\t\t\t\t\t,1088\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1093\n\t\t\t\t\t,1092\n\t\t\t\t\t,1091\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1093\n\t\t\t\t\t,1094\n\t\t\t\t\t,1092\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1111\n\t\t\t\t\t,1094\n\t\t\t\t\t,1093\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1111\n\t\t\t\t\t,1112\n\t\t\t\t\t,1094\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1113\n\t\t\t\t\t,1112\n\t\t\t\t\t,1111\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1113\n\t\t\t\t\t,1114\n\t\t\t\t\t,1112\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1115\n\t\t\t\t\t,1114\n\t\t\t\t\t,1113\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1115\n\t\t\t\t\t,1116\n\t\t\t\t\t,1114\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1090\n\t\t\t\t\t,1089\n\t\t\t\t\t,1095\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1090\n\t\t\t\t\t,1095\n\t\t\t\t\t,1096\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1096\n\t\t\t\t\t,1095\n\t\t\t\t\t,1097\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1096\n\t\t\t\t\t,1097\n\t\t\t\t\t,1098\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1098\n\t\t\t\t\t,1097\n\t\t\t\t\t,1099\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1098\n\t\t\t\t\t,1099\n\t\t\t\t\t,1100\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1100\n\t\t\t\t\t,1099\n\t\t\t\t\t,1101\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1100\n\t\t\t\t\t,1101\n\t\t\t\t\t,1102\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1102\n\t\t\t\t\t,1101\n\t\t\t\t\t,1106\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1102\n\t\t\t\t\t,1106\n\t\t\t\t\t,1107\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1107\n\t\t\t\t\t,1108\n\t\t\t\t\t,1104\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1107\n\t\t\t\t\t,1109\n\t\t\t\t\t,1110\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1103\n\t\t\t\t\t,1104\n\t\t\t\t\t,1105\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1117\n\t\t\t\t\t,1118\n\t\t\t\t\t,1119\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1117\n\t\t\t\t\t,1119\n\t\t\t\t\t,1120\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1121\n\t\t\t\t\t,1122\n\t\t\t\t\t,1123\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1121\n\t\t\t\t\t,1123\n\t\t\t\t\t,1124\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1135\n\t\t\t\t\t,1121\n\t\t\t\t\t,1124\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1137\n\t\t\t\t\t,1132\n\t\t\t\t\t,1121\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1137\n\t\t\t\t\t,1121\n\t\t\t\t\t,1135\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1144\n\t\t\t\t\t,1143\n\t\t\t\t\t,1121\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1127\n\t\t\t\t\t,1121\n\t\t\t\t\t,1128\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1128\n\t\t\t\t\t,1121\n\t\t\t\t\t,1132\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1135\n\t\t\t\t\t,1124\n\t\t\t\t\t,1136\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1129\n\t\t\t\t\t,1131\n\t\t\t\t\t,1132\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1138\n\t\t\t\t\t,1129\n\t\t\t\t\t,1132\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1138\n\t\t\t\t\t,1132\n\t\t\t\t\t,1137\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1128\n\t\t\t\t\t,1132\n\t\t\t\t\t,1125\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1125\n\t\t\t\t\t,1127\n\t\t\t\t\t,1128\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1125\n\t\t\t\t\t,1126\n\t\t\t\t\t,1127\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1140\n\t\t\t\t\t,1129\n\t\t\t\t\t,1138\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1129\n\t\t\t\t\t,1130\n\t\t\t\t\t,1131\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1133\n\t\t\t\t\t,1130\n\t\t\t\t\t,1129\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1139\n\t\t\t\t\t,1133\n\t\t\t\t\t,1129\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1133\n\t\t\t\t\t,1134\n\t\t\t\t\t,1130\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1141\n\t\t\t\t\t,1142\n\t\t\t\t\t,1143\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1141\n\t\t\t\t\t,1143\n\t\t\t\t\t,1144\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1752\n\t\t\t\t\t,1143\n\t\t\t\t\t,1144\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1750\n\t\t\t\t\t,1751\n\t\t\t\t\t,1752\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1753\n\t\t\t\t\t,1750\n\t\t\t\t\t,1752\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1753\n\t\t\t\t\t,1752\n\t\t\t\t\t,1764\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1752\n\t\t\t\t\t,1761\n\t\t\t\t\t,1766\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1764\n\t\t\t\t\t,1752\n\t\t\t\t\t,1766\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1757\n\t\t\t\t\t,1752\n\t\t\t\t\t,1754\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1761\n\t\t\t\t\t,1752\n\t\t\t\t\t,1757\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1765\n\t\t\t\t\t,1753\n\t\t\t\t\t,1764\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1757\n\t\t\t\t\t,1754\n\t\t\t\t\t,1756\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1756\n\t\t\t\t\t,1761\n\t\t\t\t\t,1757\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1761\n\t\t\t\t\t,1758\n\t\t\t\t\t,1760\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1761\n\t\t\t\t\t,1760\n\t\t\t\t\t,1767\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1766\n\t\t\t\t\t,1761\n\t\t\t\t\t,1767\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1758\n\t\t\t\t\t,1759\n\t\t\t\t\t,1760\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1760\n\t\t\t\t\t,1759\n\t\t\t\t\t,1763\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1760\n\t\t\t\t\t,1763\n\t\t\t\t\t,1768\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1767\n\t\t\t\t\t,1760\n\t\t\t\t\t,1769\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1759\n\t\t\t\t\t,1762\n\t\t\t\t\t,1763\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1754\n\t\t\t\t\t,1755\n\t\t\t\t\t,1756\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1145\n\t\t\t\t\t,1146\n\t\t\t\t\t,1147\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1145\n\t\t\t\t\t,1147\n\t\t\t\t\t,1148\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1149\n\t\t\t\t\t,1146\n\t\t\t\t\t,1145\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1153\n\t\t\t\t\t,1145\n\t\t\t\t\t,1148\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1155\n\t\t\t\t\t,1149\n\t\t\t\t\t,1145\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1156\n\t\t\t\t\t,1145\n\t\t\t\t\t,1153\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1149\n\t\t\t\t\t,1150\n\t\t\t\t\t,1146\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1153\n\t\t\t\t\t,1148\n\t\t\t\t\t,1154\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1154\n\t\t\t\t\t,1148\n\t\t\t\t\t,1152\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1154\n\t\t\t\t\t,1152\n\t\t\t\t\t,1157\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1148\n\t\t\t\t\t,1151\n\t\t\t\t\t,1152\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1148\n\t\t\t\t\t,1147\n\t\t\t\t\t,1151\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1158\n\t\t\t\t\t,1159\n\t\t\t\t\t,1160\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1158\n\t\t\t\t\t,1160\n\t\t\t\t\t,1161\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1166\n\t\t\t\t\t,1158\n\t\t\t\t\t,1161\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1161\n\t\t\t\t\t,1160\n\t\t\t\t\t,1162\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1161\n\t\t\t\t\t,1162\n\t\t\t\t\t,1163\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1166\n\t\t\t\t\t,1161\n\t\t\t\t\t,1167\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1167\n\t\t\t\t\t,1161\n\t\t\t\t\t,1163\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1163\n\t\t\t\t\t,1162\n\t\t\t\t\t,1164\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1163\n\t\t\t\t\t,1164\n\t\t\t\t\t,1165\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1167\n\t\t\t\t\t,1163\n\t\t\t\t\t,1168\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1168\n\t\t\t\t\t,1163\n\t\t\t\t\t,1165\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1168\n\t\t\t\t\t,1165\n\t\t\t\t\t,1169\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1170\n\t\t\t\t\t,1171\n\t\t\t\t\t,1172\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1171\n\t\t\t\t\t,1173\n\t\t\t\t\t,1172\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1174\n\t\t\t\t\t,1175\n\t\t\t\t\t,1176\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1175\n\t\t\t\t\t,1177\n\t\t\t\t\t,1176\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1178\n\t\t\t\t\t,1179\n\t\t\t\t\t,1180\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1181\n\t\t\t\t\t,1182\n\t\t\t\t\t,1180\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1183\n\t\t\t\t\t,1184\n\t\t\t\t\t,1185\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1184\n\t\t\t\t\t,1186\n\t\t\t\t\t,1185\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1187\n\t\t\t\t\t,1188\n\t\t\t\t\t,1189\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1188\n\t\t\t\t\t,1190\n\t\t\t\t\t,1189\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1191\n\t\t\t\t\t,1192\n\t\t\t\t\t,1193\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1192\n\t\t\t\t\t,1194\n\t\t\t\t\t,1193\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1207\n\t\t\t\t\t,1194\n\t\t\t\t\t,1192\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1207\n\t\t\t\t\t,1192\n\t\t\t\t\t,1208\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1193\n\t\t\t\t\t,1194\n\t\t\t\t\t,1195\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1193\n\t\t\t\t\t,1195\n\t\t\t\t\t,1196\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1209\n\t\t\t\t\t,1195\n\t\t\t\t\t,1194\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1209\n\t\t\t\t\t,1194\n\t\t\t\t\t,1207\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1215\n\t\t\t\t\t,1207\n\t\t\t\t\t,1208\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1217\n\t\t\t\t\t,1209\n\t\t\t\t\t,1207\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1217\n\t\t\t\t\t,1207\n\t\t\t\t\t,1215\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1215\n\t\t\t\t\t,1208\n\t\t\t\t\t,1216\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1223\n\t\t\t\t\t,1215\n\t\t\t\t\t,1216\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1225\n\t\t\t\t\t,1217\n\t\t\t\t\t,1215\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1225\n\t\t\t\t\t,1215\n\t\t\t\t\t,1223\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1218\n\t\t\t\t\t,1209\n\t\t\t\t\t,1217\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1226\n\t\t\t\t\t,1218\n\t\t\t\t\t,1217\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1226\n\t\t\t\t\t,1217\n\t\t\t\t\t,1225\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1210\n\t\t\t\t\t,1195\n\t\t\t\t\t,1209\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1218\n\t\t\t\t\t,1210\n\t\t\t\t\t,1209\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1210\n\t\t\t\t\t,1198\n\t\t\t\t\t,1195\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1195\n\t\t\t\t\t,1198\n\t\t\t\t\t,1197\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1196\n\t\t\t\t\t,1195\n\t\t\t\t\t,1197\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1233\n\t\t\t\t\t,1225\n\t\t\t\t\t,1223\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1234\n\t\t\t\t\t,1226\n\t\t\t\t\t,1225\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1234\n\t\t\t\t\t,1225\n\t\t\t\t\t,1233\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1233\n\t\t\t\t\t,1223\n\t\t\t\t\t,1231\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1231\n\t\t\t\t\t,1223\n\t\t\t\t\t,1224\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1231\n\t\t\t\t\t,1224\n\t\t\t\t\t,1232\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1223\n\t\t\t\t\t,1216\n\t\t\t\t\t,1224\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1199\n\t\t\t\t\t,1200\n\t\t\t\t\t,1201\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1199\n\t\t\t\t\t,1201\n\t\t\t\t\t,1202\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1211\n\t\t\t\t\t,1201\n\t\t\t\t\t,1200\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1211\n\t\t\t\t\t,1200\n\t\t\t\t\t,1212\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1202\n\t\t\t\t\t,1201\n\t\t\t\t\t,1203\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1201\n\t\t\t\t\t,1204\n\t\t\t\t\t,1203\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1213\n\t\t\t\t\t,1204\n\t\t\t\t\t,1201\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1213\n\t\t\t\t\t,1201\n\t\t\t\t\t,1211\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1219\n\t\t\t\t\t,1211\n\t\t\t\t\t,1212\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1221\n\t\t\t\t\t,1213\n\t\t\t\t\t,1211\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1221\n\t\t\t\t\t,1211\n\t\t\t\t\t,1219\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1219\n\t\t\t\t\t,1212\n\t\t\t\t\t,1220\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1227\n\t\t\t\t\t,1219\n\t\t\t\t\t,1220\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1229\n\t\t\t\t\t,1221\n\t\t\t\t\t,1219\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1229\n\t\t\t\t\t,1219\n\t\t\t\t\t,1227\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1222\n\t\t\t\t\t,1213\n\t\t\t\t\t,1221\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1230\n\t\t\t\t\t,1222\n\t\t\t\t\t,1221\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1230\n\t\t\t\t\t,1221\n\t\t\t\t\t,1229\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1214\n\t\t\t\t\t,1204\n\t\t\t\t\t,1213\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1222\n\t\t\t\t\t,1214\n\t\t\t\t\t,1213\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1214\n\t\t\t\t\t,1205\n\t\t\t\t\t,1204\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1203\n\t\t\t\t\t,1204\n\t\t\t\t\t,1205\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1203\n\t\t\t\t\t,1205\n\t\t\t\t\t,1206\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1237\n\t\t\t\t\t,1229\n\t\t\t\t\t,1227\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1238\n\t\t\t\t\t,1230\n\t\t\t\t\t,1229\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1238\n\t\t\t\t\t,1229\n\t\t\t\t\t,1237\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1237\n\t\t\t\t\t,1227\n\t\t\t\t\t,1235\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1235\n\t\t\t\t\t,1227\n\t\t\t\t\t,1228\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1235\n\t\t\t\t\t,1228\n\t\t\t\t\t,1236\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1227\n\t\t\t\t\t,1220\n\t\t\t\t\t,1228\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1239\n\t\t\t\t\t,1240\n\t\t\t\t\t,1241\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1239\n\t\t\t\t\t,1241\n\t\t\t\t\t,1242\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1243\n\t\t\t\t\t,1240\n\t\t\t\t\t,1239\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1243\n\t\t\t\t\t,1244\n\t\t\t\t\t,1240\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1245\n\t\t\t\t\t,1244\n\t\t\t\t\t,1243\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1245\n\t\t\t\t\t,1246\n\t\t\t\t\t,1244\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1247\n\t\t\t\t\t,1248\n\t\t\t\t\t,1249\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1247\n\t\t\t\t\t,1249\n\t\t\t\t\t,1250\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1251\n\t\t\t\t\t,1248\n\t\t\t\t\t,1247\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1251\n\t\t\t\t\t,1252\n\t\t\t\t\t,1248\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1253\n\t\t\t\t\t,1252\n\t\t\t\t\t,1251\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1253\n\t\t\t\t\t,1254\n\t\t\t\t\t,1252\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1255\n\t\t\t\t\t,1256\n\t\t\t\t\t,1257\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1261\n\t\t\t\t\t,1256\n\t\t\t\t\t,1255\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1257\n\t\t\t\t\t,1256\n\t\t\t\t\t,1258\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1258\n\t\t\t\t\t,1256\n\t\t\t\t\t,1259\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1259\n\t\t\t\t\t,1256\n\t\t\t\t\t,1260\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1260\n\t\t\t\t\t,1256\n\t\t\t\t\t,1261\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1262\n\t\t\t\t\t,1263\n\t\t\t\t\t,1264\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1263\n\t\t\t\t\t,1265\n\t\t\t\t\t,1264\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1264\n\t\t\t\t\t,1265\n\t\t\t\t\t,1266\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1264\n\t\t\t\t\t,1266\n\t\t\t\t\t,1267\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1267\n\t\t\t\t\t,1266\n\t\t\t\t\t,1268\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1266\n\t\t\t\t\t,1269\n\t\t\t\t\t,1268\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1270\n\t\t\t\t\t,1271\n\t\t\t\t\t,1272\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1270\n\t\t\t\t\t,1272\n\t\t\t\t\t,1273\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1273\n\t\t\t\t\t,1272\n\t\t\t\t\t,1274\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1272\n\t\t\t\t\t,1275\n\t\t\t\t\t,1274\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1274\n\t\t\t\t\t,1275\n\t\t\t\t\t,1276\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1274\n\t\t\t\t\t,1276\n\t\t\t\t\t,1277\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1278\n\t\t\t\t\t,1279\n\t\t\t\t\t,1280\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1278\n\t\t\t\t\t,1280\n\t\t\t\t\t,1292\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1302\n\t\t\t\t\t,1280\n\t\t\t\t\t,1279\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1292\n\t\t\t\t\t,1280\n\t\t\t\t\t,1282\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1303\n\t\t\t\t\t,1304\n\t\t\t\t\t,1280\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1280\n\t\t\t\t\t,1302\n\t\t\t\t\t,1303\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1292\n\t\t\t\t\t,1282\n\t\t\t\t\t,1281\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1281\n\t\t\t\t\t,1282\n\t\t\t\t\t,1283\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1281\n\t\t\t\t\t,1283\n\t\t\t\t\t,1293\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1293\n\t\t\t\t\t,1283\n\t\t\t\t\t,1294\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1293\n\t\t\t\t\t,1294\n\t\t\t\t\t,1295\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1295\n\t\t\t\t\t,1294\n\t\t\t\t\t,1296\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1294\n\t\t\t\t\t,1305\n\t\t\t\t\t,1304\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1304\n\t\t\t\t\t,1303\n\t\t\t\t\t,1294\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1302\n\t\t\t\t\t,1306\n\t\t\t\t\t,1303\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1295\n\t\t\t\t\t,1296\n\t\t\t\t\t,1297\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1284\n\t\t\t\t\t,1285\n\t\t\t\t\t,1286\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1909\n\t\t\t\t\t,1910\n\t\t\t\t\t,1284\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1915\n\t\t\t\t\t,1909\n\t\t\t\t\t,1284\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1285\n\t\t\t\t\t,1287\n\t\t\t\t\t,1288\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1288\n\t\t\t\t\t,1286\n\t\t\t\t\t,1285\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1288\n\t\t\t\t\t,1291\n\t\t\t\t\t,1286\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1290\n\t\t\t\t\t,1288\n\t\t\t\t\t,1287\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1287\n\t\t\t\t\t,1289\n\t\t\t\t\t,1290\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1922\n\t\t\t\t\t,1909\n\t\t\t\t\t,1923\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1914\n\t\t\t\t\t,1915\n\t\t\t\t\t,1916\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1917\n\t\t\t\t\t,1918\n\t\t\t\t\t,1915\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1915\n\t\t\t\t\t,1914\n\t\t\t\t\t,1917\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1914\n\t\t\t\t\t,1921\n\t\t\t\t\t,1917\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1918\n\t\t\t\t\t,1917\n\t\t\t\t\t,1919\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1919\n\t\t\t\t\t,1920\n\t\t\t\t\t,1918\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1919\n\t\t\t\t\t,1928\n\t\t\t\t\t,1920\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1928\n\t\t\t\t\t,1926\n\t\t\t\t\t,1920\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1929\n\t\t\t\t\t,1928\n\t\t\t\t\t,1930\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1931\n\t\t\t\t\t,1929\n\t\t\t\t\t,1930\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1925\n\t\t\t\t\t,1926\n\t\t\t\t\t,1927\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1298\n\t\t\t\t\t,1299\n\t\t\t\t\t,1300\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1298\n\t\t\t\t\t,1300\n\t\t\t\t\t,1301\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1307\n\t\t\t\t\t,1308\n\t\t\t\t\t,1309\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1323\n\t\t\t\t\t,1308\n\t\t\t\t\t,1307\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1325\n\t\t\t\t\t,1307\n\t\t\t\t\t,1309\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1333\n\t\t\t\t\t,1323\n\t\t\t\t\t,1307\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1333\n\t\t\t\t\t,1307\n\t\t\t\t\t,1325\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1308\n\t\t\t\t\t,1310\n\t\t\t\t\t,1309\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1323\n\t\t\t\t\t,1324\n\t\t\t\t\t,1308\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1309\n\t\t\t\t\t,1310\n\t\t\t\t\t,1311\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1309\n\t\t\t\t\t,1311\n\t\t\t\t\t,1312\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1312\n\t\t\t\t\t,1311\n\t\t\t\t\t,1313\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1311\n\t\t\t\t\t,1314\n\t\t\t\t\t,1313\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1326\n\t\t\t\t\t,1309\n\t\t\t\t\t,1312\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1326\n\t\t\t\t\t,1312\n\t\t\t\t\t,1327\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1327\n\t\t\t\t\t,1312\n\t\t\t\t\t,1313\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1313\n\t\t\t\t\t,1314\n\t\t\t\t\t,1315\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1313\n\t\t\t\t\t,1315\n\t\t\t\t\t,1316\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1327\n\t\t\t\t\t,1313\n\t\t\t\t\t,1328\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1328\n\t\t\t\t\t,1313\n\t\t\t\t\t,1316\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1335\n\t\t\t\t\t,1326\n\t\t\t\t\t,1327\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1335\n\t\t\t\t\t,1327\n\t\t\t\t\t,1336\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1336\n\t\t\t\t\t,1327\n\t\t\t\t\t,1328\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1328\n\t\t\t\t\t,1316\n\t\t\t\t\t,1329\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1336\n\t\t\t\t\t,1328\n\t\t\t\t\t,1337\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1337\n\t\t\t\t\t,1328\n\t\t\t\t\t,1329\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1316\n\t\t\t\t\t,1315\n\t\t\t\t\t,1317\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1329\n\t\t\t\t\t,1316\n\t\t\t\t\t,1317\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1315\n\t\t\t\t\t,1318\n\t\t\t\t\t,1317\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1329\n\t\t\t\t\t,1317\n\t\t\t\t\t,1330\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1337\n\t\t\t\t\t,1329\n\t\t\t\t\t,1338\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1338\n\t\t\t\t\t,1329\n\t\t\t\t\t,1330\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1338\n\t\t\t\t\t,1330\n\t\t\t\t\t,1339\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1334\n\t\t\t\t\t,1326\n\t\t\t\t\t,1335\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1334\n\t\t\t\t\t,1325\n\t\t\t\t\t,1326\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1345\n\t\t\t\t\t,1325\n\t\t\t\t\t,1334\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1325\n\t\t\t\t\t,1309\n\t\t\t\t\t,1326\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1345\n\t\t\t\t\t,1333\n\t\t\t\t\t,1325\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1344\n\t\t\t\t\t,1333\n\t\t\t\t\t,1345\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1332\n\t\t\t\t\t,1323\n\t\t\t\t\t,1333\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1344\n\t\t\t\t\t,1332\n\t\t\t\t\t,1333\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1343\n\t\t\t\t\t,1332\n\t\t\t\t\t,1344\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1331\n\t\t\t\t\t,1322\n\t\t\t\t\t,1332\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1332\n\t\t\t\t\t,1322\n\t\t\t\t\t,1323\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1322\n\t\t\t\t\t,1321\n\t\t\t\t\t,1323\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1321\n\t\t\t\t\t,1324\n\t\t\t\t\t,1323\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1319\n\t\t\t\t\t,1321\n\t\t\t\t\t,1322\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1331\n\t\t\t\t\t,1319\n\t\t\t\t\t,1322\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1319\n\t\t\t\t\t,1320\n\t\t\t\t\t,1321\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1340\n\t\t\t\t\t,1341\n\t\t\t\t\t,1342\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1346\n\t\t\t\t\t,1347\n\t\t\t\t\t,1348\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1346\n\t\t\t\t\t,1349\n\t\t\t\t\t,1347\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1350\n\t\t\t\t\t,1351\n\t\t\t\t\t,1352\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1350\n\t\t\t\t\t,1353\n\t\t\t\t\t,1351\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1354\n\t\t\t\t\t,1355\n\t\t\t\t\t,1356\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1354\n\t\t\t\t\t,1357\n\t\t\t\t\t,1358\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1359\n\t\t\t\t\t,1360\n\t\t\t\t\t,1361\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1359\n\t\t\t\t\t,1362\n\t\t\t\t\t,1360\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1363\n\t\t\t\t\t,1364\n\t\t\t\t\t,1365\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1363\n\t\t\t\t\t,1366\n\t\t\t\t\t,1364\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1367\n\t\t\t\t\t,1368\n\t\t\t\t\t,1369\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1369\n\t\t\t\t\t,1370\n\t\t\t\t\t,1367\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1369\n\t\t\t\t\t,1371\n\t\t\t\t\t,1370\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1372\n\t\t\t\t\t,1373\n\t\t\t\t\t,1370\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1370\n\t\t\t\t\t,1371\n\t\t\t\t\t,1372\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1371\n\t\t\t\t\t,1391\n\t\t\t\t\t,1372\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1372\n\t\t\t\t\t,1388\n\t\t\t\t\t,1390\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1391\n\t\t\t\t\t,1392\n\t\t\t\t\t,1372\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1396\n\t\t\t\t\t,1391\n\t\t\t\t\t,1393\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1398\n\t\t\t\t\t,1391\n\t\t\t\t\t,1396\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1395\n\t\t\t\t\t,1396\n\t\t\t\t\t,1393\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1396\n\t\t\t\t\t,1397\n\t\t\t\t\t,1398\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1393\n\t\t\t\t\t,1394\n\t\t\t\t\t,1395\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1388\n\t\t\t\t\t,1389\n\t\t\t\t\t,1390\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1374\n\t\t\t\t\t,1375\n\t\t\t\t\t,1376\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1377\n\t\t\t\t\t,1374\n\t\t\t\t\t,1376\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1378\n\t\t\t\t\t,1374\n\t\t\t\t\t,1377\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1379\n\t\t\t\t\t,1378\n\t\t\t\t\t,1377\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1380\n\t\t\t\t\t,1381\n\t\t\t\t\t,1382\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1383\n\t\t\t\t\t,1380\n\t\t\t\t\t,1382\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1384\n\t\t\t\t\t,1385\n\t\t\t\t\t,1386\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1387\n\t\t\t\t\t,1384\n\t\t\t\t\t,1386\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1399\n\t\t\t\t\t,1400\n\t\t\t\t\t,1401\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1399\n\t\t\t\t\t,1402\n\t\t\t\t\t,1400\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1403\n\t\t\t\t\t,1402\n\t\t\t\t\t,1399\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1404\n\t\t\t\t\t,1403\n\t\t\t\t\t,1399\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1400\n\t\t\t\t\t,1402\n\t\t\t\t\t,1415\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1416\n\t\t\t\t\t,1400\n\t\t\t\t\t,1415\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1402\n\t\t\t\t\t,1403\n\t\t\t\t\t,1417\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1415\n\t\t\t\t\t,1402\n\t\t\t\t\t,1417\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1416\n\t\t\t\t\t,1415\n\t\t\t\t\t,1423\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1415\n\t\t\t\t\t,1417\n\t\t\t\t\t,1425\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1423\n\t\t\t\t\t,1415\n\t\t\t\t\t,1425\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1424\n\t\t\t\t\t,1416\n\t\t\t\t\t,1423\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1424\n\t\t\t\t\t,1423\n\t\t\t\t\t,1431\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1423\n\t\t\t\t\t,1425\n\t\t\t\t\t,1433\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1431\n\t\t\t\t\t,1423\n\t\t\t\t\t,1433\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1425\n\t\t\t\t\t,1417\n\t\t\t\t\t,1426\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1425\n\t\t\t\t\t,1426\n\t\t\t\t\t,1434\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1433\n\t\t\t\t\t,1425\n\t\t\t\t\t,1434\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1417\n\t\t\t\t\t,1403\n\t\t\t\t\t,1418\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1417\n\t\t\t\t\t,1418\n\t\t\t\t\t,1426\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1403\n\t\t\t\t\t,1406\n\t\t\t\t\t,1418\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1405\n\t\t\t\t\t,1403\n\t\t\t\t\t,1404\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1405\n\t\t\t\t\t,1406\n\t\t\t\t\t,1403\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1433\n\t\t\t\t\t,1434\n\t\t\t\t\t,1442\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1441\n\t\t\t\t\t,1433\n\t\t\t\t\t,1442\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1431\n\t\t\t\t\t,1433\n\t\t\t\t\t,1441\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1439\n\t\t\t\t\t,1431\n\t\t\t\t\t,1441\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1432\n\t\t\t\t\t,1431\n\t\t\t\t\t,1439\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1440\n\t\t\t\t\t,1432\n\t\t\t\t\t,1439\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1432\n\t\t\t\t\t,1424\n\t\t\t\t\t,1431\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1407\n\t\t\t\t\t,1408\n\t\t\t\t\t,1409\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1410\n\t\t\t\t\t,1407\n\t\t\t\t\t,1409\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1411\n\t\t\t\t\t,1407\n\t\t\t\t\t,1410\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1411\n\t\t\t\t\t,1412\n\t\t\t\t\t,1407\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1408\n\t\t\t\t\t,1407\n\t\t\t\t\t,1419\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1407\n\t\t\t\t\t,1412\n\t\t\t\t\t,1421\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1419\n\t\t\t\t\t,1407\n\t\t\t\t\t,1421\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1420\n\t\t\t\t\t,1408\n\t\t\t\t\t,1419\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1420\n\t\t\t\t\t,1419\n\t\t\t\t\t,1427\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1419\n\t\t\t\t\t,1421\n\t\t\t\t\t,1429\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1427\n\t\t\t\t\t,1419\n\t\t\t\t\t,1429\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1421\n\t\t\t\t\t,1412\n\t\t\t\t\t,1422\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1421\n\t\t\t\t\t,1422\n\t\t\t\t\t,1430\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1429\n\t\t\t\t\t,1421\n\t\t\t\t\t,1430\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1413\n\t\t\t\t\t,1412\n\t\t\t\t\t,1411\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1412\n\t\t\t\t\t,1413\n\t\t\t\t\t,1422\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1414\n\t\t\t\t\t,1413\n\t\t\t\t\t,1411\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1429\n\t\t\t\t\t,1430\n\t\t\t\t\t,1438\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1427\n\t\t\t\t\t,1429\n\t\t\t\t\t,1437\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1437\n\t\t\t\t\t,1429\n\t\t\t\t\t,1438\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1437\n\t\t\t\t\t,1438\n\t\t\t\t\t,1446\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1435\n\t\t\t\t\t,1427\n\t\t\t\t\t,1437\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1435\n\t\t\t\t\t,1437\n\t\t\t\t\t,1445\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1445\n\t\t\t\t\t,1437\n\t\t\t\t\t,1446\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1428\n\t\t\t\t\t,1427\n\t\t\t\t\t,1435\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1436\n\t\t\t\t\t,1428\n\t\t\t\t\t,1435\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1436\n\t\t\t\t\t,1435\n\t\t\t\t\t,1443\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1443\n\t\t\t\t\t,1435\n\t\t\t\t\t,1445\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1428\n\t\t\t\t\t,1420\n\t\t\t\t\t,1427\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1444\n\t\t\t\t\t,1436\n\t\t\t\t\t,1443\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1447\n\t\t\t\t\t,1448\n\t\t\t\t\t,1449\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1450\n\t\t\t\t\t,1447\n\t\t\t\t\t,1449\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1448\n\t\t\t\t\t,1451\n\t\t\t\t\t,1452\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1449\n\t\t\t\t\t,1448\n\t\t\t\t\t,1452\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1451\n\t\t\t\t\t,1453\n\t\t\t\t\t,1454\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1452\n\t\t\t\t\t,1451\n\t\t\t\t\t,1454\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1455\n\t\t\t\t\t,1456\n\t\t\t\t\t,1457\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1458\n\t\t\t\t\t,1455\n\t\t\t\t\t,1457\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1456\n\t\t\t\t\t,1459\n\t\t\t\t\t,1460\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1457\n\t\t\t\t\t,1456\n\t\t\t\t\t,1460\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1459\n\t\t\t\t\t,1461\n\t\t\t\t\t,1462\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1460\n\t\t\t\t\t,1459\n\t\t\t\t\t,1462\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1463\n\t\t\t\t\t,1464\n\t\t\t\t\t,1465\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1463\n\t\t\t\t\t,1466\n\t\t\t\t\t,1464\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1467\n\t\t\t\t\t,1468\n\t\t\t\t\t,1469\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1470\n\t\t\t\t\t,1467\n\t\t\t\t\t,1469\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1471\n\t\t\t\t\t,1472\n\t\t\t\t\t,1473\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1471\n\t\t\t\t\t,1474\n\t\t\t\t\t,1472\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1475\n\t\t\t\t\t,1476\n\t\t\t\t\t,1477\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1478\n\t\t\t\t\t,1475\n\t\t\t\t\t,1477\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1479\n\t\t\t\t\t,1480\n\t\t\t\t\t,1481\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1479\n\t\t\t\t\t,1482\n\t\t\t\t\t,1480\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1483\n\t\t\t\t\t,1484\n\t\t\t\t\t,1485\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1486\n\t\t\t\t\t,1483\n\t\t\t\t\t,1485\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1487\n\t\t\t\t\t,1488\n\t\t\t\t\t,1489\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1487\n\t\t\t\t\t,1490\n\t\t\t\t\t,1488\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1491\n\t\t\t\t\t,1490\n\t\t\t\t\t,1487\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1492\n\t\t\t\t\t,1491\n\t\t\t\t\t,1487\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1487\n\t\t\t\t\t,1489\n\t\t\t\t\t,1505\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1506\n\t\t\t\t\t,1487\n\t\t\t\t\t,1505\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1492\n\t\t\t\t\t,1487\n\t\t\t\t\t,1506\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1488\n\t\t\t\t\t,1504\n\t\t\t\t\t,1503\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1489\n\t\t\t\t\t,1488\n\t\t\t\t\t,1503\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1489\n\t\t\t\t\t,1503\n\t\t\t\t\t,1513\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1505\n\t\t\t\t\t,1489\n\t\t\t\t\t,1513\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1506\n\t\t\t\t\t,1505\n\t\t\t\t\t,1514\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1505\n\t\t\t\t\t,1513\n\t\t\t\t\t,1525\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1514\n\t\t\t\t\t,1505\n\t\t\t\t\t,1525\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1507\n\t\t\t\t\t,1492\n\t\t\t\t\t,1506\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1515\n\t\t\t\t\t,1506\n\t\t\t\t\t,1514\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1507\n\t\t\t\t\t,1506\n\t\t\t\t\t,1515\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1493\n\t\t\t\t\t,1492\n\t\t\t\t\t,1507\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1508\n\t\t\t\t\t,1493\n\t\t\t\t\t,1507\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1516\n\t\t\t\t\t,1507\n\t\t\t\t\t,1515\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1508\n\t\t\t\t\t,1507\n\t\t\t\t\t,1516\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1496\n\t\t\t\t\t,1493\n\t\t\t\t\t,1508\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1509\n\t\t\t\t\t,1496\n\t\t\t\t\t,1508\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1517\n\t\t\t\t\t,1508\n\t\t\t\t\t,1516\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1509\n\t\t\t\t\t,1508\n\t\t\t\t\t,1517\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1496\n\t\t\t\t\t,1495\n\t\t\t\t\t,1493\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1497\n\t\t\t\t\t,1495\n\t\t\t\t\t,1496\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1497\n\t\t\t\t\t,1496\n\t\t\t\t\t,1509\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1510\n\t\t\t\t\t,1497\n\t\t\t\t\t,1509\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1518\n\t\t\t\t\t,1509\n\t\t\t\t\t,1517\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1510\n\t\t\t\t\t,1509\n\t\t\t\t\t,1518\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1497\n\t\t\t\t\t,1498\n\t\t\t\t\t,1495\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1495\n\t\t\t\t\t,1494\n\t\t\t\t\t,1493\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1493\n\t\t\t\t\t,1494\n\t\t\t\t\t,1491\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1493\n\t\t\t\t\t,1491\n\t\t\t\t\t,1492\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1519\n\t\t\t\t\t,1510\n\t\t\t\t\t,1518\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1525\n\t\t\t\t\t,1513\n\t\t\t\t\t,1523\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1513\n\t\t\t\t\t,1503\n\t\t\t\t\t,1512\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1513\n\t\t\t\t\t,1512\n\t\t\t\t\t,1523\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1523\n\t\t\t\t\t,1512\n\t\t\t\t\t,1524\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1512\n\t\t\t\t\t,1502\n\t\t\t\t\t,1511\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1503\n\t\t\t\t\t,1502\n\t\t\t\t\t,1512\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1503\n\t\t\t\t\t,1499\n\t\t\t\t\t,1502\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1503\n\t\t\t\t\t,1504\n\t\t\t\t\t,1499\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1502\n\t\t\t\t\t,1499\n\t\t\t\t\t,1501\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1502\n\t\t\t\t\t,1501\n\t\t\t\t\t,1511\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1499\n\t\t\t\t\t,1500\n\t\t\t\t\t,1501\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1520\n\t\t\t\t\t,1521\n\t\t\t\t\t,1522\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1526\n\t\t\t\t\t,1527\n\t\t\t\t\t,1528\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1533\n\t\t\t\t\t,1526\n\t\t\t\t\t,1528\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1539\n\t\t\t\t\t,1526\n\t\t\t\t\t,1540\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1532\n\t\t\t\t\t,1533\n\t\t\t\t\t,1528\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1534\n\t\t\t\t\t,1535\n\t\t\t\t\t,1533\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1533\n\t\t\t\t\t,1532\n\t\t\t\t\t,1534\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1532\n\t\t\t\t\t,1538\n\t\t\t\t\t,1534\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1535\n\t\t\t\t\t,1534\n\t\t\t\t\t,1536\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1536\n\t\t\t\t\t,1537\n\t\t\t\t\t,1535\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1536\n\t\t\t\t\t,1545\n\t\t\t\t\t,1537\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1545\n\t\t\t\t\t,1543\n\t\t\t\t\t,1537\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1546\n\t\t\t\t\t,1545\n\t\t\t\t\t,1547\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1548\n\t\t\t\t\t,1546\n\t\t\t\t\t,1547\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1542\n\t\t\t\t\t,1543\n\t\t\t\t\t,1544\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1529\n\t\t\t\t\t,1530\n\t\t\t\t\t,1531\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1531\n\t\t\t\t\t,1530\n\t\t\t\t\t,1541\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1549\n\t\t\t\t\t,1550\n\t\t\t\t\t,1551\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1552\n\t\t\t\t\t,1549\n\t\t\t\t\t,1551\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1553\n\t\t\t\t\t,1554\n\t\t\t\t\t,1555\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1554\n\t\t\t\t\t,1556\n\t\t\t\t\t,1557\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1557\n\t\t\t\t\t,1555\n\t\t\t\t\t,1554\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1557\n\t\t\t\t\t,1560\n\t\t\t\t\t,1555\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1559\n\t\t\t\t\t,1557\n\t\t\t\t\t,1556\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1556\n\t\t\t\t\t,1558\n\t\t\t\t\t,1559\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1561\n\t\t\t\t\t,1562\n\t\t\t\t\t,1563\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1564\n\t\t\t\t\t,1562\n\t\t\t\t\t,1561\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1565\n\t\t\t\t\t,1562\n\t\t\t\t\t,1564\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1566\n\t\t\t\t\t,1562\n\t\t\t\t\t,1565\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1567\n\t\t\t\t\t,1562\n\t\t\t\t\t,1566\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1563\n\t\t\t\t\t,1562\n\t\t\t\t\t,1567\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1568\n\t\t\t\t\t,1569\n\t\t\t\t\t,1570\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1568\n\t\t\t\t\t,1571\n\t\t\t\t\t,1569\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1572\n\t\t\t\t\t,1571\n\t\t\t\t\t,1568\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1573\n\t\t\t\t\t,1572\n\t\t\t\t\t,1568\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1574\n\t\t\t\t\t,1572\n\t\t\t\t\t,1573\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1574\n\t\t\t\t\t,1575\n\t\t\t\t\t,1572\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1576\n\t\t\t\t\t,1577\n\t\t\t\t\t,1578\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1579\n\t\t\t\t\t,1576\n\t\t\t\t\t,1578\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1580\n\t\t\t\t\t,1581\n\t\t\t\t\t,1579\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1580\n\t\t\t\t\t,1582\n\t\t\t\t\t,1581\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1583\n\t\t\t\t\t,1584\n\t\t\t\t\t,1580\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1585\n\t\t\t\t\t,1583\n\t\t\t\t\t,1580\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1586\n\t\t\t\t\t,1587\n\t\t\t\t\t,1588\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1586\n\t\t\t\t\t,1589\n\t\t\t\t\t,1587\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1590\n\t\t\t\t\t,1591\n\t\t\t\t\t,1592\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1590\n\t\t\t\t\t,1593\n\t\t\t\t\t,1591\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1594\n\t\t\t\t\t,1595\n\t\t\t\t\t,1596\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1594\n\t\t\t\t\t,1597\n\t\t\t\t\t,1595\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1598\n\t\t\t\t\t,1599\n\t\t\t\t\t,1600\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1598\n\t\t\t\t\t,1601\n\t\t\t\t\t,1599\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1602\n\t\t\t\t\t,1603\n\t\t\t\t\t,1604\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1602\n\t\t\t\t\t,1605\n\t\t\t\t\t,1603\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1606\n\t\t\t\t\t,1607\n\t\t\t\t\t,1608\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1609\n\t\t\t\t\t,1606\n\t\t\t\t\t,1608\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1609\n\t\t\t\t\t,1608\n\t\t\t\t\t,1610\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1611\n\t\t\t\t\t,1609\n\t\t\t\t\t,1610\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1612\n\t\t\t\t\t,1613\n\t\t\t\t\t,1614\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1615\n\t\t\t\t\t,1612\n\t\t\t\t\t,1614\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1620\n\t\t\t\t\t,1612\n\t\t\t\t\t,1615\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1613\n\t\t\t\t\t,1616\n\t\t\t\t\t,1617\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1614\n\t\t\t\t\t,1613\n\t\t\t\t\t,1617\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1616\n\t\t\t\t\t,1618\n\t\t\t\t\t,1619\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1617\n\t\t\t\t\t,1616\n\t\t\t\t\t,1619\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1618\n\t\t\t\t\t,1630\n\t\t\t\t\t,1631\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1619\n\t\t\t\t\t,1618\n\t\t\t\t\t,1631\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1630\n\t\t\t\t\t,1632\n\t\t\t\t\t,1633\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1631\n\t\t\t\t\t,1630\n\t\t\t\t\t,1633\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1632\n\t\t\t\t\t,1634\n\t\t\t\t\t,1635\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1633\n\t\t\t\t\t,1632\n\t\t\t\t\t,1635\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1621\n\t\t\t\t\t,1620\n\t\t\t\t\t,1615\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1622\n\t\t\t\t\t,1620\n\t\t\t\t\t,1621\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1623\n\t\t\t\t\t,1622\n\t\t\t\t\t,1621\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1624\n\t\t\t\t\t,1622\n\t\t\t\t\t,1623\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1625\n\t\t\t\t\t,1624\n\t\t\t\t\t,1623\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1626\n\t\t\t\t\t,1624\n\t\t\t\t\t,1625\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1627\n\t\t\t\t\t,1626\n\t\t\t\t\t,1625\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1628\n\t\t\t\t\t,1626\n\t\t\t\t\t,1627\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1629\n\t\t\t\t\t,1628\n\t\t\t\t\t,1627\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1636\n\t\t\t\t\t,1637\n\t\t\t\t\t,1638\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1639\n\t\t\t\t\t,1636\n\t\t\t\t\t,1638\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1637\n\t\t\t\t\t,1640\n\t\t\t\t\t,1641\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1638\n\t\t\t\t\t,1637\n\t\t\t\t\t,1641\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1642\n\t\t\t\t\t,1643\n\t\t\t\t\t,1644\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1642\n\t\t\t\t\t,1645\n\t\t\t\t\t,1643\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1648\n\t\t\t\t\t,1649\n\t\t\t\t\t,1644\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1644\n\t\t\t\t\t,1643\n\t\t\t\t\t,1648\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1648\n\t\t\t\t\t,1643\n\t\t\t\t\t,1650\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1649\n\t\t\t\t\t,1648\n\t\t\t\t\t,1651\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1652\n\t\t\t\t\t,1653\n\t\t\t\t\t,1649\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1649\n\t\t\t\t\t,1651\n\t\t\t\t\t,1652\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1652\n\t\t\t\t\t,1654\n\t\t\t\t\t,1653\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1654\n\t\t\t\t\t,1655\n\t\t\t\t\t,1653\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1654\n\t\t\t\t\t,1656\n\t\t\t\t\t,1655\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1655\n\t\t\t\t\t,1656\n\t\t\t\t\t,1664\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1650\n\t\t\t\t\t,1643\n\t\t\t\t\t,1647\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1647\n\t\t\t\t\t,1657\n\t\t\t\t\t,1650\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1645\n\t\t\t\t\t,1646\n\t\t\t\t\t,1643\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1646\n\t\t\t\t\t,1647\n\t\t\t\t\t,1643\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1658\n\t\t\t\t\t,1657\n\t\t\t\t\t,1647\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1647\n\t\t\t\t\t,1646\n\t\t\t\t\t,1658\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1659\n\t\t\t\t\t,1657\n\t\t\t\t\t,1658\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1659\n\t\t\t\t\t,1658\n\t\t\t\t\t,1660\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1661\n\t\t\t\t\t,1659\n\t\t\t\t\t,1660\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1661\n\t\t\t\t\t,1660\n\t\t\t\t\t,1662\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1662\n\t\t\t\t\t,1663\n\t\t\t\t\t,1661\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1665\n\t\t\t\t\t,1666\n\t\t\t\t\t,1667\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1668\n\t\t\t\t\t,1665\n\t\t\t\t\t,1667\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1673\n\t\t\t\t\t,1665\n\t\t\t\t\t,1668\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1666\n\t\t\t\t\t,1669\n\t\t\t\t\t,1670\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1667\n\t\t\t\t\t,1666\n\t\t\t\t\t,1670\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1669\n\t\t\t\t\t,1671\n\t\t\t\t\t,1672\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1670\n\t\t\t\t\t,1669\n\t\t\t\t\t,1672\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1671\n\t\t\t\t\t,1699\n\t\t\t\t\t,1700\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1672\n\t\t\t\t\t,1671\n\t\t\t\t\t,1700\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1699\n\t\t\t\t\t,1703\n\t\t\t\t\t,1704\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1700\n\t\t\t\t\t,1699\n\t\t\t\t\t,1704\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1703\n\t\t\t\t\t,1707\n\t\t\t\t\t,1708\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1704\n\t\t\t\t\t,1703\n\t\t\t\t\t,1708\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1707\n\t\t\t\t\t,1712\n\t\t\t\t\t,1713\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1708\n\t\t\t\t\t,1707\n\t\t\t\t\t,1713\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1674\n\t\t\t\t\t,1673\n\t\t\t\t\t,1668\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1681\n\t\t\t\t\t,1673\n\t\t\t\t\t,1674\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1682\n\t\t\t\t\t,1681\n\t\t\t\t\t,1674\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1685\n\t\t\t\t\t,1681\n\t\t\t\t\t,1682\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1686\n\t\t\t\t\t,1685\n\t\t\t\t\t,1682\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1690\n\t\t\t\t\t,1685\n\t\t\t\t\t,1686\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1691\n\t\t\t\t\t,1690\n\t\t\t\t\t,1686\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1695\n\t\t\t\t\t,1690\n\t\t\t\t\t,1691\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1696\n\t\t\t\t\t,1695\n\t\t\t\t\t,1691\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1693\n\t\t\t\t\t,1695\n\t\t\t\t\t,1696\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1714\n\t\t\t\t\t,1715\n\t\t\t\t\t,1696\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1689\n\t\t\t\t\t,1693\n\t\t\t\t\t,1694\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1687\n\t\t\t\t\t,1689\n\t\t\t\t\t,1688\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1689\n\t\t\t\t\t,1692\n\t\t\t\t\t,1688\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1692\n\t\t\t\t\t,1689\n\t\t\t\t\t,1694\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1684\n\t\t\t\t\t,1687\n\t\t\t\t\t,1683\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1683\n\t\t\t\t\t,1687\n\t\t\t\t\t,1688\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1679\n\t\t\t\t\t,1684\n\t\t\t\t\t,1683\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1679\n\t\t\t\t\t,1683\n\t\t\t\t\t,1680\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1676\n\t\t\t\t\t,1679\n\t\t\t\t\t,1680\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1677\n\t\t\t\t\t,1676\n\t\t\t\t\t,1680\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1675\n\t\t\t\t\t,1676\n\t\t\t\t\t,1677\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1678\n\t\t\t\t\t,1675\n\t\t\t\t\t,1677\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1697\n\t\t\t\t\t,1675\n\t\t\t\t\t,1678\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1698\n\t\t\t\t\t,1697\n\t\t\t\t\t,1678\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1701\n\t\t\t\t\t,1697\n\t\t\t\t\t,1698\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1702\n\t\t\t\t\t,1701\n\t\t\t\t\t,1698\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1705\n\t\t\t\t\t,1701\n\t\t\t\t\t,1702\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1706\n\t\t\t\t\t,1705\n\t\t\t\t\t,1702\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1709\n\t\t\t\t\t,1705\n\t\t\t\t\t,1710\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1711\n\t\t\t\t\t,1705\n\t\t\t\t\t,1706\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1716\n\t\t\t\t\t,1717\n\t\t\t\t\t,1718\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1719\n\t\t\t\t\t,1716\n\t\t\t\t\t,1718\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1724\n\t\t\t\t\t,1716\n\t\t\t\t\t,1719\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1717\n\t\t\t\t\t,1720\n\t\t\t\t\t,1721\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1718\n\t\t\t\t\t,1717\n\t\t\t\t\t,1721\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1720\n\t\t\t\t\t,1722\n\t\t\t\t\t,1723\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1721\n\t\t\t\t\t,1720\n\t\t\t\t\t,1723\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1722\n\t\t\t\t\t,1740\n\t\t\t\t\t,1741\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1723\n\t\t\t\t\t,1722\n\t\t\t\t\t,1741\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1740\n\t\t\t\t\t,1742\n\t\t\t\t\t,1743\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1741\n\t\t\t\t\t,1740\n\t\t\t\t\t,1743\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1742\n\t\t\t\t\t,1744\n\t\t\t\t\t,1745\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1743\n\t\t\t\t\t,1742\n\t\t\t\t\t,1745\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1725\n\t\t\t\t\t,1724\n\t\t\t\t\t,1719\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1726\n\t\t\t\t\t,1724\n\t\t\t\t\t,1725\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1727\n\t\t\t\t\t,1726\n\t\t\t\t\t,1725\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1728\n\t\t\t\t\t,1726\n\t\t\t\t\t,1727\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1729\n\t\t\t\t\t,1728\n\t\t\t\t\t,1727\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1730\n\t\t\t\t\t,1728\n\t\t\t\t\t,1729\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1731\n\t\t\t\t\t,1730\n\t\t\t\t\t,1729\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1735\n\t\t\t\t\t,1730\n\t\t\t\t\t,1731\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1736\n\t\t\t\t\t,1735\n\t\t\t\t\t,1731\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1733\n\t\t\t\t\t,1737\n\t\t\t\t\t,1736\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1738\n\t\t\t\t\t,1739\n\t\t\t\t\t,1736\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1732\n\t\t\t\t\t,1733\n\t\t\t\t\t,1734\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1746\n\t\t\t\t\t,1747\n\t\t\t\t\t,1748\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1749\n\t\t\t\t\t,1746\n\t\t\t\t\t,1748\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1770\n\t\t\t\t\t,1771\n\t\t\t\t\t,1772\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1773\n\t\t\t\t\t,1770\n\t\t\t\t\t,1772\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1774\n\t\t\t\t\t,1775\n\t\t\t\t\t,1776\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1777\n\t\t\t\t\t,1774\n\t\t\t\t\t,1776\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1780\n\t\t\t\t\t,1774\n\t\t\t\t\t,1777\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1775\n\t\t\t\t\t,1778\n\t\t\t\t\t,1779\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1776\n\t\t\t\t\t,1775\n\t\t\t\t\t,1779\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1777\n\t\t\t\t\t,1776\n\t\t\t\t\t,1782\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1776\n\t\t\t\t\t,1779\n\t\t\t\t\t,1784\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1782\n\t\t\t\t\t,1776\n\t\t\t\t\t,1785\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1783\n\t\t\t\t\t,1777\n\t\t\t\t\t,1782\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1781\n\t\t\t\t\t,1780\n\t\t\t\t\t,1777\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1781\n\t\t\t\t\t,1777\n\t\t\t\t\t,1783\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1786\n\t\t\t\t\t,1781\n\t\t\t\t\t,1783\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1787\n\t\t\t\t\t,1788\n\t\t\t\t\t,1789\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1790\n\t\t\t\t\t,1787\n\t\t\t\t\t,1789\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1791\n\t\t\t\t\t,1787\n\t\t\t\t\t,1790\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1790\n\t\t\t\t\t,1789\n\t\t\t\t\t,1795\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1792\n\t\t\t\t\t,1791\n\t\t\t\t\t,1790\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1796\n\t\t\t\t\t,1790\n\t\t\t\t\t,1795\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1792\n\t\t\t\t\t,1790\n\t\t\t\t\t,1796\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1793\n\t\t\t\t\t,1791\n\t\t\t\t\t,1792\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1794\n\t\t\t\t\t,1793\n\t\t\t\t\t,1792\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1797\n\t\t\t\t\t,1792\n\t\t\t\t\t,1796\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1794\n\t\t\t\t\t,1792\n\t\t\t\t\t,1797\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1798\n\t\t\t\t\t,1794\n\t\t\t\t\t,1797\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1799\n\t\t\t\t\t,1800\n\t\t\t\t\t,1801\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1799\n\t\t\t\t\t,1802\n\t\t\t\t\t,1800\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1803\n\t\t\t\t\t,1804\n\t\t\t\t\t,1805\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1803\n\t\t\t\t\t,1806\n\t\t\t\t\t,1804\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1807\n\t\t\t\t\t,1808\n\t\t\t\t\t,1809\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1807\n\t\t\t\t\t,1810\n\t\t\t\t\t,1811\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1812\n\t\t\t\t\t,1813\n\t\t\t\t\t,1814\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1812\n\t\t\t\t\t,1815\n\t\t\t\t\t,1813\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1816\n\t\t\t\t\t,1817\n\t\t\t\t\t,1818\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1816\n\t\t\t\t\t,1819\n\t\t\t\t\t,1817\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1820\n\t\t\t\t\t,1821\n\t\t\t\t\t,1822\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1820\n\t\t\t\t\t,1823\n\t\t\t\t\t,1821\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1824\n\t\t\t\t\t,1823\n\t\t\t\t\t,1820\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1825\n\t\t\t\t\t,1824\n\t\t\t\t\t,1820\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1821\n\t\t\t\t\t,1823\n\t\t\t\t\t,1836\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1837\n\t\t\t\t\t,1821\n\t\t\t\t\t,1836\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1823\n\t\t\t\t\t,1824\n\t\t\t\t\t,1838\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1836\n\t\t\t\t\t,1823\n\t\t\t\t\t,1838\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1837\n\t\t\t\t\t,1836\n\t\t\t\t\t,1844\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1836\n\t\t\t\t\t,1838\n\t\t\t\t\t,1846\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1844\n\t\t\t\t\t,1836\n\t\t\t\t\t,1846\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1845\n\t\t\t\t\t,1837\n\t\t\t\t\t,1844\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1845\n\t\t\t\t\t,1844\n\t\t\t\t\t,1852\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1844\n\t\t\t\t\t,1846\n\t\t\t\t\t,1854\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1852\n\t\t\t\t\t,1844\n\t\t\t\t\t,1854\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1846\n\t\t\t\t\t,1838\n\t\t\t\t\t,1847\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1846\n\t\t\t\t\t,1847\n\t\t\t\t\t,1855\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1854\n\t\t\t\t\t,1846\n\t\t\t\t\t,1855\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1838\n\t\t\t\t\t,1824\n\t\t\t\t\t,1839\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1838\n\t\t\t\t\t,1839\n\t\t\t\t\t,1847\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1824\n\t\t\t\t\t,1827\n\t\t\t\t\t,1839\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1826\n\t\t\t\t\t,1824\n\t\t\t\t\t,1825\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1826\n\t\t\t\t\t,1827\n\t\t\t\t\t,1824\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1854\n\t\t\t\t\t,1855\n\t\t\t\t\t,1863\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1862\n\t\t\t\t\t,1854\n\t\t\t\t\t,1863\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1852\n\t\t\t\t\t,1854\n\t\t\t\t\t,1862\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1860\n\t\t\t\t\t,1852\n\t\t\t\t\t,1862\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1853\n\t\t\t\t\t,1852\n\t\t\t\t\t,1860\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1861\n\t\t\t\t\t,1853\n\t\t\t\t\t,1860\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1853\n\t\t\t\t\t,1845\n\t\t\t\t\t,1852\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1828\n\t\t\t\t\t,1829\n\t\t\t\t\t,1830\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1831\n\t\t\t\t\t,1828\n\t\t\t\t\t,1830\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1832\n\t\t\t\t\t,1828\n\t\t\t\t\t,1831\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1832\n\t\t\t\t\t,1833\n\t\t\t\t\t,1828\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1829\n\t\t\t\t\t,1828\n\t\t\t\t\t,1840\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1828\n\t\t\t\t\t,1833\n\t\t\t\t\t,1842\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1840\n\t\t\t\t\t,1828\n\t\t\t\t\t,1842\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1841\n\t\t\t\t\t,1829\n\t\t\t\t\t,1840\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1841\n\t\t\t\t\t,1840\n\t\t\t\t\t,1848\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1840\n\t\t\t\t\t,1842\n\t\t\t\t\t,1850\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1848\n\t\t\t\t\t,1840\n\t\t\t\t\t,1850\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1842\n\t\t\t\t\t,1833\n\t\t\t\t\t,1843\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1842\n\t\t\t\t\t,1843\n\t\t\t\t\t,1851\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1850\n\t\t\t\t\t,1842\n\t\t\t\t\t,1851\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1834\n\t\t\t\t\t,1833\n\t\t\t\t\t,1832\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1833\n\t\t\t\t\t,1834\n\t\t\t\t\t,1843\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1835\n\t\t\t\t\t,1834\n\t\t\t\t\t,1832\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1850\n\t\t\t\t\t,1851\n\t\t\t\t\t,1859\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1848\n\t\t\t\t\t,1850\n\t\t\t\t\t,1858\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1858\n\t\t\t\t\t,1850\n\t\t\t\t\t,1859\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1858\n\t\t\t\t\t,1859\n\t\t\t\t\t,1867\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1856\n\t\t\t\t\t,1848\n\t\t\t\t\t,1858\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1856\n\t\t\t\t\t,1858\n\t\t\t\t\t,1866\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1866\n\t\t\t\t\t,1858\n\t\t\t\t\t,1867\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1849\n\t\t\t\t\t,1848\n\t\t\t\t\t,1856\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1857\n\t\t\t\t\t,1849\n\t\t\t\t\t,1856\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1857\n\t\t\t\t\t,1856\n\t\t\t\t\t,1864\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1864\n\t\t\t\t\t,1856\n\t\t\t\t\t,1866\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1849\n\t\t\t\t\t,1841\n\t\t\t\t\t,1848\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1865\n\t\t\t\t\t,1857\n\t\t\t\t\t,1864\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1868\n\t\t\t\t\t,1869\n\t\t\t\t\t,1870\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1871\n\t\t\t\t\t,1868\n\t\t\t\t\t,1870\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1869\n\t\t\t\t\t,1872\n\t\t\t\t\t,1873\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1870\n\t\t\t\t\t,1869\n\t\t\t\t\t,1873\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1872\n\t\t\t\t\t,1874\n\t\t\t\t\t,1875\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1873\n\t\t\t\t\t,1872\n\t\t\t\t\t,1875\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1876\n\t\t\t\t\t,1877\n\t\t\t\t\t,1878\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1879\n\t\t\t\t\t,1876\n\t\t\t\t\t,1878\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1877\n\t\t\t\t\t,1880\n\t\t\t\t\t,1881\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1878\n\t\t\t\t\t,1877\n\t\t\t\t\t,1881\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1880\n\t\t\t\t\t,1882\n\t\t\t\t\t,1883\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1881\n\t\t\t\t\t,1880\n\t\t\t\t\t,1883\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1884\n\t\t\t\t\t,1885\n\t\t\t\t\t,1886\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1887\n\t\t\t\t\t,1885\n\t\t\t\t\t,1884\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1888\n\t\t\t\t\t,1885\n\t\t\t\t\t,1887\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1889\n\t\t\t\t\t,1885\n\t\t\t\t\t,1888\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1890\n\t\t\t\t\t,1885\n\t\t\t\t\t,1889\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1886\n\t\t\t\t\t,1885\n\t\t\t\t\t,1890\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1891\n\t\t\t\t\t,1892\n\t\t\t\t\t,1893\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1891\n\t\t\t\t\t,1894\n\t\t\t\t\t,1892\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1895\n\t\t\t\t\t,1894\n\t\t\t\t\t,1891\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1896\n\t\t\t\t\t,1895\n\t\t\t\t\t,1891\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1897\n\t\t\t\t\t,1895\n\t\t\t\t\t,1896\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1897\n\t\t\t\t\t,1898\n\t\t\t\t\t,1895\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1899\n\t\t\t\t\t,1900\n\t\t\t\t\t,1901\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1902\n\t\t\t\t\t,1899\n\t\t\t\t\t,1901\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1903\n\t\t\t\t\t,1904\n\t\t\t\t\t,1902\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1903\n\t\t\t\t\t,1905\n\t\t\t\t\t,1904\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1906\n\t\t\t\t\t,1907\n\t\t\t\t\t,1903\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1908\n\t\t\t\t\t,1906\n\t\t\t\t\t,1903\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1911\n\t\t\t\t\t,1912\n\t\t\t\t\t,1913\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1913\n\t\t\t\t\t,1912\n\t\t\t\t\t,1924\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1932\n\t\t\t\t\t,1933\n\t\t\t\t\t,1934\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1935\n\t\t\t\t\t,1932\n\t\t\t\t\t,1934\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1936\n\t\t\t\t\t,1937\n\t\t\t\t\t,1938\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1937\n\t\t\t\t\t,1939\n\t\t\t\t\t,1940\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1940\n\t\t\t\t\t,1938\n\t\t\t\t\t,1937\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1940\n\t\t\t\t\t,1943\n\t\t\t\t\t,1938\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1942\n\t\t\t\t\t,1940\n\t\t\t\t\t,1939\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1939\n\t\t\t\t\t,1941\n\t\t\t\t\t,1942\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1944\n\t\t\t\t\t,1945\n\t\t\t\t\t,1946\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1944\n\t\t\t\t\t,1947\n\t\t\t\t\t,1945\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1948\n\t\t\t\t\t,1947\n\t\t\t\t\t,1944\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1949\n\t\t\t\t\t,1948\n\t\t\t\t\t,1944\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1944\n\t\t\t\t\t,1946\n\t\t\t\t\t,1962\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1963\n\t\t\t\t\t,1944\n\t\t\t\t\t,1962\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1949\n\t\t\t\t\t,1944\n\t\t\t\t\t,1963\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1945\n\t\t\t\t\t,1961\n\t\t\t\t\t,1960\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1946\n\t\t\t\t\t,1945\n\t\t\t\t\t,1960\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1946\n\t\t\t\t\t,1960\n\t\t\t\t\t,1970\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1962\n\t\t\t\t\t,1946\n\t\t\t\t\t,1970\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1963\n\t\t\t\t\t,1962\n\t\t\t\t\t,1971\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1962\n\t\t\t\t\t,1970\n\t\t\t\t\t,1982\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1971\n\t\t\t\t\t,1962\n\t\t\t\t\t,1982\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1964\n\t\t\t\t\t,1949\n\t\t\t\t\t,1963\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1972\n\t\t\t\t\t,1963\n\t\t\t\t\t,1971\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1964\n\t\t\t\t\t,1963\n\t\t\t\t\t,1972\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1950\n\t\t\t\t\t,1949\n\t\t\t\t\t,1964\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1965\n\t\t\t\t\t,1950\n\t\t\t\t\t,1964\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1973\n\t\t\t\t\t,1964\n\t\t\t\t\t,1972\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1965\n\t\t\t\t\t,1964\n\t\t\t\t\t,1973\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1953\n\t\t\t\t\t,1950\n\t\t\t\t\t,1965\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1966\n\t\t\t\t\t,1953\n\t\t\t\t\t,1965\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1974\n\t\t\t\t\t,1965\n\t\t\t\t\t,1973\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1966\n\t\t\t\t\t,1965\n\t\t\t\t\t,1974\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1953\n\t\t\t\t\t,1952\n\t\t\t\t\t,1950\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1954\n\t\t\t\t\t,1952\n\t\t\t\t\t,1953\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1954\n\t\t\t\t\t,1953\n\t\t\t\t\t,1966\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1967\n\t\t\t\t\t,1954\n\t\t\t\t\t,1966\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1975\n\t\t\t\t\t,1966\n\t\t\t\t\t,1974\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1967\n\t\t\t\t\t,1966\n\t\t\t\t\t,1975\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1954\n\t\t\t\t\t,1955\n\t\t\t\t\t,1952\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1952\n\t\t\t\t\t,1951\n\t\t\t\t\t,1950\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1950\n\t\t\t\t\t,1951\n\t\t\t\t\t,1948\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1950\n\t\t\t\t\t,1948\n\t\t\t\t\t,1949\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1976\n\t\t\t\t\t,1967\n\t\t\t\t\t,1975\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1982\n\t\t\t\t\t,1970\n\t\t\t\t\t,1980\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1970\n\t\t\t\t\t,1960\n\t\t\t\t\t,1969\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1970\n\t\t\t\t\t,1969\n\t\t\t\t\t,1980\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1980\n\t\t\t\t\t,1969\n\t\t\t\t\t,1981\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1969\n\t\t\t\t\t,1959\n\t\t\t\t\t,1968\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1960\n\t\t\t\t\t,1959\n\t\t\t\t\t,1969\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1960\n\t\t\t\t\t,1956\n\t\t\t\t\t,1959\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1960\n\t\t\t\t\t,1961\n\t\t\t\t\t,1956\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1959\n\t\t\t\t\t,1956\n\t\t\t\t\t,1958\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1959\n\t\t\t\t\t,1958\n\t\t\t\t\t,1968\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1956\n\t\t\t\t\t,1957\n\t\t\t\t\t,1958\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1977\n\t\t\t\t\t,1978\n\t\t\t\t\t,1979\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1983\n\t\t\t\t\t,1984\n\t\t\t\t\t,1985\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1984\n\t\t\t\t\t,1986\n\t\t\t\t\t,1985\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1987\n\t\t\t\t\t,1988\n\t\t\t\t\t,1989\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1993\n\t\t\t\t\t,1987\n\t\t\t\t\t,1989\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1988\n\t\t\t\t\t,1990\n\t\t\t\t\t,1989\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1994\n\t\t\t\t\t,1992\n\t\t\t\t\t,1988\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1992\n\t\t\t\t\t,1990\n\t\t\t\t\t,1988\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1989\n\t\t\t\t\t,1990\n\t\t\t\t\t,1991\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1991\n\t\t\t\t\t,1993\n\t\t\t\t\t,1989\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1991\n\t\t\t\t\t,1992\n\t\t\t\t\t,1993\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1992\n\t\t\t\t\t,1994\n\t\t\t\t\t,1993\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1990\n\t\t\t\t\t,1992\n\t\t\t\t\t,1991\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1995\n\t\t\t\t\t,1996\n\t\t\t\t\t,1997\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1996\n\t\t\t\t\t,1998\n\t\t\t\t\t,1997\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 1999\n\t\t\t\t\t,2000\n\t\t\t\t\t,2001\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2005\n\t\t\t\t\t,1999\n\t\t\t\t\t,2001\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2000\n\t\t\t\t\t,2002\n\t\t\t\t\t,2001\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2006\n\t\t\t\t\t,2004\n\t\t\t\t\t,2000\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2004\n\t\t\t\t\t,2002\n\t\t\t\t\t,2000\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2001\n\t\t\t\t\t,2002\n\t\t\t\t\t,2003\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2003\n\t\t\t\t\t,2005\n\t\t\t\t\t,2001\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2003\n\t\t\t\t\t,2004\n\t\t\t\t\t,2005\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2004\n\t\t\t\t\t,2006\n\t\t\t\t\t,2005\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2002\n\t\t\t\t\t,2004\n\t\t\t\t\t,2003\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2007\n\t\t\t\t\t,2008\n\t\t\t\t\t,2009\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2007\n\t\t\t\t\t,2010\n\t\t\t\t\t,2008\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2011\n\t\t\t\t\t,2012\n\t\t\t\t\t,2013\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2011\n\t\t\t\t\t,2014\n\t\t\t\t\t,2012\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2015\n\t\t\t\t\t,2014\n\t\t\t\t\t,2011\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2011\n\t\t\t\t\t,2017\n\t\t\t\t\t,2015\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2011\n\t\t\t\t\t,2013\n\t\t\t\t\t,2017\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2012\n\t\t\t\t\t,2016\n\t\t\t\t\t,2018\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2012\n\t\t\t\t\t,2014\n\t\t\t\t\t,2016\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2015\n\t\t\t\t\t,2016\n\t\t\t\t\t,2014\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2017\n\t\t\t\t\t,2016\n\t\t\t\t\t,2015\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2017\n\t\t\t\t\t,2018\n\t\t\t\t\t,2016\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2019\n\t\t\t\t\t,2020\n\t\t\t\t\t,2021\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2019\n\t\t\t\t\t,2022\n\t\t\t\t\t,2020\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2023\n\t\t\t\t\t,2024\n\t\t\t\t\t,2025\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2023\n\t\t\t\t\t,2026\n\t\t\t\t\t,2024\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2027\n\t\t\t\t\t,2026\n\t\t\t\t\t,2023\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2023\n\t\t\t\t\t,2029\n\t\t\t\t\t,2027\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2023\n\t\t\t\t\t,2025\n\t\t\t\t\t,2029\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2024\n\t\t\t\t\t,2028\n\t\t\t\t\t,2030\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2024\n\t\t\t\t\t,2026\n\t\t\t\t\t,2028\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2027\n\t\t\t\t\t,2028\n\t\t\t\t\t,2026\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2029\n\t\t\t\t\t,2028\n\t\t\t\t\t,2027\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2029\n\t\t\t\t\t,2030\n\t\t\t\t\t,2028\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2031\n\t\t\t\t\t,2032\n\t\t\t\t\t,2033\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2031\n\t\t\t\t\t,2034\n\t\t\t\t\t,2032\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2035\n\t\t\t\t\t,2036\n\t\t\t\t\t,2037\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2035\n\t\t\t\t\t,2038\n\t\t\t\t\t,2036\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2039\n\t\t\t\t\t,2038\n\t\t\t\t\t,2035\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2035\n\t\t\t\t\t,2041\n\t\t\t\t\t,2039\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2035\n\t\t\t\t\t,2037\n\t\t\t\t\t,2041\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2036\n\t\t\t\t\t,2040\n\t\t\t\t\t,2042\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2036\n\t\t\t\t\t,2038\n\t\t\t\t\t,2040\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2039\n\t\t\t\t\t,2040\n\t\t\t\t\t,2038\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2041\n\t\t\t\t\t,2040\n\t\t\t\t\t,2039\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2041\n\t\t\t\t\t,2042\n\t\t\t\t\t,2040\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2043\n\t\t\t\t\t,2044\n\t\t\t\t\t,2045\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2044\n\t\t\t\t\t,2046\n\t\t\t\t\t,2045\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2047\n\t\t\t\t\t,2048\n\t\t\t\t\t,2049\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2053\n\t\t\t\t\t,2047\n\t\t\t\t\t,2049\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2048\n\t\t\t\t\t,2050\n\t\t\t\t\t,2049\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2054\n\t\t\t\t\t,2052\n\t\t\t\t\t,2048\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2052\n\t\t\t\t\t,2050\n\t\t\t\t\t,2048\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2049\n\t\t\t\t\t,2050\n\t\t\t\t\t,2051\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2051\n\t\t\t\t\t,2053\n\t\t\t\t\t,2049\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2051\n\t\t\t\t\t,2052\n\t\t\t\t\t,2053\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2052\n\t\t\t\t\t,2054\n\t\t\t\t\t,2053\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2050\n\t\t\t\t\t,2052\n\t\t\t\t\t,2051\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2055\n\t\t\t\t\t,2056\n\t\t\t\t\t,2057\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2132\n\t\t\t\t\t,2055\n\t\t\t\t\t,2057\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2055\n\t\t\t\t\t,2061\n\t\t\t\t\t,2064\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2055\n\t\t\t\t\t,2064\n\t\t\t\t\t,2056\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2132\n\t\t\t\t\t,2061\n\t\t\t\t\t,2055\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2056\n\t\t\t\t\t,2067\n\t\t\t\t\t,2057\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2056\n\t\t\t\t\t,2064\n\t\t\t\t\t,2069\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2056\n\t\t\t\t\t,2069\n\t\t\t\t\t,2067\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2061\n\t\t\t\t\t,2063\n\t\t\t\t\t,2064\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2064\n\t\t\t\t\t,2063\n\t\t\t\t\t,2069\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2063\n\t\t\t\t\t,2070\n\t\t\t\t\t,2069\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2069\n\t\t\t\t\t,2070\n\t\t\t\t\t,2074\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2069\n\t\t\t\t\t,2074\n\t\t\t\t\t,2075\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2067\n\t\t\t\t\t,2069\n\t\t\t\t\t,2075\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2067\n\t\t\t\t\t,2072\n\t\t\t\t\t,2057\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2067\n\t\t\t\t\t,2075\n\t\t\t\t\t,2072\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2075\n\t\t\t\t\t,2074\n\t\t\t\t\t,2079\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2072\n\t\t\t\t\t,2075\n\t\t\t\t\t,2079\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2074\n\t\t\t\t\t,2080\n\t\t\t\t\t,2079\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2079\n\t\t\t\t\t,2080\n\t\t\t\t\t,2084\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2079\n\t\t\t\t\t,2084\n\t\t\t\t\t,2085\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2072\n\t\t\t\t\t,2079\n\t\t\t\t\t,2077\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2077\n\t\t\t\t\t,2079\n\t\t\t\t\t,2085\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2072\n\t\t\t\t\t,2077\n\t\t\t\t\t,2057\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2077\n\t\t\t\t\t,2082\n\t\t\t\t\t,2057\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2077\n\t\t\t\t\t,2085\n\t\t\t\t\t,2082\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2085\n\t\t\t\t\t,2084\n\t\t\t\t\t,2089\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2082\n\t\t\t\t\t,2085\n\t\t\t\t\t,2089\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2084\n\t\t\t\t\t,2090\n\t\t\t\t\t,2089\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2089\n\t\t\t\t\t,2090\n\t\t\t\t\t,2094\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2089\n\t\t\t\t\t,2094\n\t\t\t\t\t,2095\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2082\n\t\t\t\t\t,2089\n\t\t\t\t\t,2087\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2087\n\t\t\t\t\t,2089\n\t\t\t\t\t,2095\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2082\n\t\t\t\t\t,2087\n\t\t\t\t\t,2057\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2087\n\t\t\t\t\t,2092\n\t\t\t\t\t,2057\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2087\n\t\t\t\t\t,2095\n\t\t\t\t\t,2092\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2095\n\t\t\t\t\t,2094\n\t\t\t\t\t,2099\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2092\n\t\t\t\t\t,2095\n\t\t\t\t\t,2099\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2094\n\t\t\t\t\t,2100\n\t\t\t\t\t,2099\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2099\n\t\t\t\t\t,2100\n\t\t\t\t\t,2104\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2099\n\t\t\t\t\t,2104\n\t\t\t\t\t,2105\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2092\n\t\t\t\t\t,2099\n\t\t\t\t\t,2097\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2097\n\t\t\t\t\t,2099\n\t\t\t\t\t,2105\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2092\n\t\t\t\t\t,2097\n\t\t\t\t\t,2057\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2097\n\t\t\t\t\t,2102\n\t\t\t\t\t,2057\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2097\n\t\t\t\t\t,2105\n\t\t\t\t\t,2102\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2105\n\t\t\t\t\t,2104\n\t\t\t\t\t,2109\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2102\n\t\t\t\t\t,2105\n\t\t\t\t\t,2109\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2104\n\t\t\t\t\t,2110\n\t\t\t\t\t,2109\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2109\n\t\t\t\t\t,2110\n\t\t\t\t\t,2114\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2109\n\t\t\t\t\t,2114\n\t\t\t\t\t,2115\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2102\n\t\t\t\t\t,2109\n\t\t\t\t\t,2107\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2107\n\t\t\t\t\t,2109\n\t\t\t\t\t,2115\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2102\n\t\t\t\t\t,2107\n\t\t\t\t\t,2057\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2107\n\t\t\t\t\t,2112\n\t\t\t\t\t,2057\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2107\n\t\t\t\t\t,2115\n\t\t\t\t\t,2112\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2115\n\t\t\t\t\t,2114\n\t\t\t\t\t,2119\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2112\n\t\t\t\t\t,2115\n\t\t\t\t\t,2119\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2114\n\t\t\t\t\t,2120\n\t\t\t\t\t,2119\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2119\n\t\t\t\t\t,2120\n\t\t\t\t\t,2124\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2119\n\t\t\t\t\t,2124\n\t\t\t\t\t,2125\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2112\n\t\t\t\t\t,2119\n\t\t\t\t\t,2117\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2117\n\t\t\t\t\t,2119\n\t\t\t\t\t,2125\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2112\n\t\t\t\t\t,2117\n\t\t\t\t\t,2057\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2117\n\t\t\t\t\t,2122\n\t\t\t\t\t,2057\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2117\n\t\t\t\t\t,2125\n\t\t\t\t\t,2122\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2125\n\t\t\t\t\t,2124\n\t\t\t\t\t,2129\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2122\n\t\t\t\t\t,2125\n\t\t\t\t\t,2129\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2124\n\t\t\t\t\t,2130\n\t\t\t\t\t,2129\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2129\n\t\t\t\t\t,2130\n\t\t\t\t\t,2134\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2129\n\t\t\t\t\t,2134\n\t\t\t\t\t,2135\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2122\n\t\t\t\t\t,2129\n\t\t\t\t\t,2127\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2127\n\t\t\t\t\t,2129\n\t\t\t\t\t,2135\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2122\n\t\t\t\t\t,2127\n\t\t\t\t\t,2057\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2127\n\t\t\t\t\t,2132\n\t\t\t\t\t,2057\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2127\n\t\t\t\t\t,2135\n\t\t\t\t\t,2132\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2135\n\t\t\t\t\t,2134\n\t\t\t\t\t,2061\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2132\n\t\t\t\t\t,2135\n\t\t\t\t\t,2061\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2134\n\t\t\t\t\t,2062\n\t\t\t\t\t,2061\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2061\n\t\t\t\t\t,2062\n\t\t\t\t\t,2063\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2058\n\t\t\t\t\t,2059\n\t\t\t\t\t,2060\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2065\n\t\t\t\t\t,2058\n\t\t\t\t\t,2066\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2058\n\t\t\t\t\t,2060\n\t\t\t\t\t,2066\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2133\n\t\t\t\t\t,2059\n\t\t\t\t\t,2058\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2136\n\t\t\t\t\t,2133\n\t\t\t\t\t,2058\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2136\n\t\t\t\t\t,2058\n\t\t\t\t\t,2065\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2060\n\t\t\t\t\t,2059\n\t\t\t\t\t,2068\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2066\n\t\t\t\t\t,2060\n\t\t\t\t\t,2068\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2066\n\t\t\t\t\t,2068\n\t\t\t\t\t,2071\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2068\n\t\t\t\t\t,2059\n\t\t\t\t\t,2073\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2071\n\t\t\t\t\t,2068\n\t\t\t\t\t,2076\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2068\n\t\t\t\t\t,2073\n\t\t\t\t\t,2076\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2073\n\t\t\t\t\t,2059\n\t\t\t\t\t,2078\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2076\n\t\t\t\t\t,2073\n\t\t\t\t\t,2078\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2076\n\t\t\t\t\t,2078\n\t\t\t\t\t,2081\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2078\n\t\t\t\t\t,2059\n\t\t\t\t\t,2083\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2081\n\t\t\t\t\t,2078\n\t\t\t\t\t,2086\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2078\n\t\t\t\t\t,2083\n\t\t\t\t\t,2086\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2083\n\t\t\t\t\t,2059\n\t\t\t\t\t,2088\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2086\n\t\t\t\t\t,2083\n\t\t\t\t\t,2088\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2086\n\t\t\t\t\t,2088\n\t\t\t\t\t,2091\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2088\n\t\t\t\t\t,2059\n\t\t\t\t\t,2093\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2091\n\t\t\t\t\t,2088\n\t\t\t\t\t,2096\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2088\n\t\t\t\t\t,2093\n\t\t\t\t\t,2096\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2093\n\t\t\t\t\t,2059\n\t\t\t\t\t,2098\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2096\n\t\t\t\t\t,2093\n\t\t\t\t\t,2098\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2096\n\t\t\t\t\t,2098\n\t\t\t\t\t,2101\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2098\n\t\t\t\t\t,2059\n\t\t\t\t\t,2103\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2101\n\t\t\t\t\t,2098\n\t\t\t\t\t,2106\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2098\n\t\t\t\t\t,2103\n\t\t\t\t\t,2106\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2103\n\t\t\t\t\t,2059\n\t\t\t\t\t,2108\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2106\n\t\t\t\t\t,2103\n\t\t\t\t\t,2108\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2106\n\t\t\t\t\t,2108\n\t\t\t\t\t,2111\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2108\n\t\t\t\t\t,2059\n\t\t\t\t\t,2113\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2111\n\t\t\t\t\t,2108\n\t\t\t\t\t,2116\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2108\n\t\t\t\t\t,2113\n\t\t\t\t\t,2116\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2113\n\t\t\t\t\t,2059\n\t\t\t\t\t,2118\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2116\n\t\t\t\t\t,2113\n\t\t\t\t\t,2118\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2116\n\t\t\t\t\t,2118\n\t\t\t\t\t,2121\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2118\n\t\t\t\t\t,2059\n\t\t\t\t\t,2123\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2121\n\t\t\t\t\t,2118\n\t\t\t\t\t,2126\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2118\n\t\t\t\t\t,2123\n\t\t\t\t\t,2126\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2123\n\t\t\t\t\t,2059\n\t\t\t\t\t,2128\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2128\n\t\t\t\t\t,2059\n\t\t\t\t\t,2133\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2126\n\t\t\t\t\t,2123\n\t\t\t\t\t,2128\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2126\n\t\t\t\t\t,2128\n\t\t\t\t\t,2131\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2131\n\t\t\t\t\t,2128\n\t\t\t\t\t,2136\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2128\n\t\t\t\t\t,2133\n\t\t\t\t\t,2136\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2137\n\t\t\t\t\t,2138\n\t\t\t\t\t,2139\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2138\n\t\t\t\t\t,2140\n\t\t\t\t\t,2139\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2141\n\t\t\t\t\t,2142\n\t\t\t\t\t,2143\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2141\n\t\t\t\t\t,2143\n\t\t\t\t\t,2144\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2145\n\t\t\t\t\t,2146\n\t\t\t\t\t,2147\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2145\n\t\t\t\t\t,2147\n\t\t\t\t\t,2148\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2149\n\t\t\t\t\t,2150\n\t\t\t\t\t,2151\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2150\n\t\t\t\t\t,2152\n\t\t\t\t\t,2151\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2153\n\t\t\t\t\t,2154\n\t\t\t\t\t,2155\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2154\n\t\t\t\t\t,2156\n\t\t\t\t\t,2155\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2157\n\t\t\t\t\t,2158\n\t\t\t\t\t,2159\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2157\n\t\t\t\t\t,2159\n\t\t\t\t\t,2160\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2161\n\t\t\t\t\t,2162\n\t\t\t\t\t,2163\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2161\n\t\t\t\t\t,2163\n\t\t\t\t\t,2164\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2165\n\t\t\t\t\t,2166\n\t\t\t\t\t,2167\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2166\n\t\t\t\t\t,2168\n\t\t\t\t\t,2167\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2169\n\t\t\t\t\t,2170\n\t\t\t\t\t,2171\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2170\n\t\t\t\t\t,2172\n\t\t\t\t\t,2171\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2173\n\t\t\t\t\t,2174\n\t\t\t\t\t,2175\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2173\n\t\t\t\t\t,2175\n\t\t\t\t\t,2176\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2177\n\t\t\t\t\t,2178\n\t\t\t\t\t,2179\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2177\n\t\t\t\t\t,2179\n\t\t\t\t\t,2180\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2181\n\t\t\t\t\t,2182\n\t\t\t\t\t,2183\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2182\n\t\t\t\t\t,2184\n\t\t\t\t\t,2183\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2185\n\t\t\t\t\t,2186\n\t\t\t\t\t,2187\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2186\n\t\t\t\t\t,2188\n\t\t\t\t\t,2187\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2189\n\t\t\t\t\t,2190\n\t\t\t\t\t,2191\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2189\n\t\t\t\t\t,2191\n\t\t\t\t\t,2192\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2193\n\t\t\t\t\t,2194\n\t\t\t\t\t,2195\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2193\n\t\t\t\t\t,2195\n\t\t\t\t\t,2196\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2197\n\t\t\t\t\t,2198\n\t\t\t\t\t,2199\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2198\n\t\t\t\t\t,2200\n\t\t\t\t\t,2199\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2201\n\t\t\t\t\t,2202\n\t\t\t\t\t,2203\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2202\n\t\t\t\t\t,2204\n\t\t\t\t\t,2203\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2205\n\t\t\t\t\t,2206\n\t\t\t\t\t,2207\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2205\n\t\t\t\t\t,2207\n\t\t\t\t\t,2208\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2209\n\t\t\t\t\t,2210\n\t\t\t\t\t,2211\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2209\n\t\t\t\t\t,2211\n\t\t\t\t\t,2212\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2213\n\t\t\t\t\t,2214\n\t\t\t\t\t,2215\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2214\n\t\t\t\t\t,2216\n\t\t\t\t\t,2215\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2217\n\t\t\t\t\t,2218\n\t\t\t\t\t,2219\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2218\n\t\t\t\t\t,2220\n\t\t\t\t\t,2219\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2221\n\t\t\t\t\t,2222\n\t\t\t\t\t,2223\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2221\n\t\t\t\t\t,2223\n\t\t\t\t\t,2224\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2225\n\t\t\t\t\t,2226\n\t\t\t\t\t,2227\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2225\n\t\t\t\t\t,2227\n\t\t\t\t\t,2228\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2229\n\t\t\t\t\t,2230\n\t\t\t\t\t,2231\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2230\n\t\t\t\t\t,2232\n\t\t\t\t\t,2231\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2233\n\t\t\t\t\t,2234\n\t\t\t\t\t,2235\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2234\n\t\t\t\t\t,2236\n\t\t\t\t\t,2235\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2237\n\t\t\t\t\t,2238\n\t\t\t\t\t,2239\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2237\n\t\t\t\t\t,2239\n\t\t\t\t\t,2240\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2241\n\t\t\t\t\t,2242\n\t\t\t\t\t,2243\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2241\n\t\t\t\t\t,2243\n\t\t\t\t\t,2244\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2245\n\t\t\t\t\t,2246\n\t\t\t\t\t,2247\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2246\n\t\t\t\t\t,2248\n\t\t\t\t\t,2247\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2249\n\t\t\t\t\t,2250\n\t\t\t\t\t,2251\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2250\n\t\t\t\t\t,2252\n\t\t\t\t\t,2251\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2253\n\t\t\t\t\t,2254\n\t\t\t\t\t,2255\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2253\n\t\t\t\t\t,2255\n\t\t\t\t\t,2256\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2257\n\t\t\t\t\t,2258\n\t\t\t\t\t,2259\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2257\n\t\t\t\t\t,2259\n\t\t\t\t\t,2260\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2261\n\t\t\t\t\t,2262\n\t\t\t\t\t,2263\n\t\t\t\t]\n\t\t\t\t,[\n\t\t\t\t\t 2262\n\t\t\t\t\t,2264\n\t\t\t\t\t,2263\n\t\t\t\t]\n\t\t\t]\n\t\t}\n\t]\n\t,\"materials\": [\n\t\t{\n\t\t\t \"properties\": [\n\t\t\t\t{\n\t\t\t\t\t \"key\": \"$tex.file\"\n\t\t\t\t\t,\"semantic\": 1\n\t\t\t\t\t,\"index\": 0\n\t\t\t\t\t,\"type\": 3\n\t\t\t\t\t,\"value\": \".\\\\jeep1.jpg\"\n\t\t\t\t}\n\t\t\t\t,{\n\t\t\t\t\t \"key\": \"?mat.name\"\n\t\t\t\t\t,\"semantic\": 0\n\t\t\t\t\t,\"index\": 0\n\t\t\t\t\t,\"type\": 3\n\t\t\t\t\t,\"value\": \"Material01\"\n\t\t\t\t}\n\t\t\t\t,{\n\t\t\t\t\t \"key\": \"$clr.ambient\"\n\t\t\t\t\t,\"semantic\": 0\n\t\t\t\t\t,\"index\": 0\n\t\t\t\t\t,\"type\": 1\n\t\t\t\t\t,\"value\": [\n\t\t\t\t\t\t 0.2\n\t\t\t\t\t\t,0.2\n\t\t\t\t\t\t,0.2\n\t\t\t\t\t\t,1\n\t\t\t\t\t]\n\t\t\t\t}\n\t\t\t\t,{\n\t\t\t\t\t \"key\": \"$clr.diffuse\"\n\t\t\t\t\t,\"semantic\": 0\n\t\t\t\t\t,\"index\": 0\n\t\t\t\t\t,\"type\": 1\n\t\t\t\t\t,\"value\": [\n\t\t\t\t\t\t 0.8\n\t\t\t\t\t\t,0.8\n\t\t\t\t\t\t,0.8\n\t\t\t\t\t\t,1\n\t\t\t\t\t]\n\t\t\t\t}\n\t\t\t\t,{\n\t\t\t\t\t \"key\": \"$clr.specular\"\n\t\t\t\t\t,\"semantic\": 0\n\t\t\t\t\t,\"index\": 0\n\t\t\t\t\t,\"type\": 1\n\t\t\t\t\t,\"value\": [\n\t\t\t\t\t\t 0\n\t\t\t\t\t\t,0\n\t\t\t\t\t\t,0\n\t\t\t\t\t\t,1\n\t\t\t\t\t]\n\t\t\t\t}\n\t\t\t\t,{\n\t\t\t\t\t \"key\": \"$mat.shininess\"\n\t\t\t\t\t,\"semantic\": 0\n\t\t\t\t\t,\"index\": 0\n\t\t\t\t\t,\"type\": 1\n\t\t\t\t\t,\"value\": 25\n\t\t\t\t}\n\t\t\t\t,{\n\t\t\t\t\t \"key\": \"$mat.opacity\"\n\t\t\t\t\t,\"semantic\": 0\n\t\t\t\t\t,\"index\": 0\n\t\t\t\t\t,\"type\": 1\n\t\t\t\t\t,\"value\": 1\n\t\t\t\t}\n\t\t\t\t,{\n\t\t\t\t\t \"key\": \"$mat.shadingm\"\n\t\t\t\t\t,\"semantic\": 0\n\t\t\t\t\t,\"index\": 0\n\t\t\t\t\t,\"type\": 4\n\t\t\t\t\t,\"value\": 3\n\t\t\t\t}\n\t\t\t]\n\t\t}\n\t]\n}\n"
  },
  {
    "path": "examples/resources/models/assimp/jeep/jeep1.readme.txt",
    "content": "Jeep designed, modelled and skinned by me, Psionic\n\nFREE for use however you like, credits are appreciated!!!\n\nIt was modelled in Milkshape 3D and includes the MS3D files oriented for X or B3D format (BlitzBasic 3D), its 2032 polys with a 512x512 jpg texture map. There are two skin variations plus a UV template to help out if you want to create your own skin variations.\n\nI'd love to see a few screenshots of it being used in-game so feel free to stop by my site and maybe drop by my forums and show us all what your doing with it!!!!!!!\n\nCheck out more of my work at:-\n\nhttp://xu1productions.com/3dstudio/index.html  -  3D Game Resources\n\nhttp://www.psionicdesign.com  -  My Main 2D/3D Digital Art site\n\nPsionic 2002"
  },
  {
    "path": "examples/resources/models/gltf/BotSkinned/glTF-MaterialsUnlit/Bot_Skinned.gltf",
    "content": "{\n    \"asset\": {\n        \"generator\": \"FBX2glTF\",\n        \"version\": \"2.0\"\n    },\n    \"scene\": 0,\n    \"extensionsUsed\": [\n        \"KHR_materials_unlit\"\n    ],\n    \"buffers\": [\n        {\n            \"byteLength\": 272844,\n            \"uri\": \"buffer.bin\"\n        }\n    ],\n    \"bufferViews\": [\n        {\n            \"buffer\": 0,\n            \"byteLength\": 644,\n            \"byteOffset\": 0\n        },\n        {\n            \"buffer\": 0,\n            \"byteLength\": 2576,\n            \"byteOffset\": 644\n        },\n        {\n            \"buffer\": 0,\n            \"byteLength\": 2576,\n            \"byteOffset\": 3220\n        },\n        {\n            \"buffer\": 0,\n            \"byteLength\": 2576,\n            \"byteOffset\": 5796\n        },\n        {\n            \"buffer\": 0,\n            \"byteLength\": 2576,\n            \"byteOffset\": 8372\n        },\n        {\n            \"buffer\": 0,\n            \"byteLength\": 2576,\n            \"byteOffset\": 10948\n        },\n        {\n            \"buffer\": 0,\n            \"byteLength\": 2576,\n            \"byteOffset\": 13524\n        },\n        {\n            \"buffer\": 0,\n            \"byteLength\": 2576,\n            \"byteOffset\": 16100\n        },\n        {\n            \"buffer\": 0,\n            \"byteLength\": 2576,\n            \"byteOffset\": 18676\n        },\n        {\n            \"buffer\": 0,\n            \"byteLength\": 2576,\n            \"byteOffset\": 21252\n        },\n        {\n            \"buffer\": 0,\n            \"byteLength\": 2576,\n            \"byteOffset\": 23828\n        },\n        {\n            \"buffer\": 0,\n            \"byteLength\": 2576,\n            \"byteOffset\": 26404\n        },\n        {\n            \"buffer\": 0,\n            \"byteLength\": 2576,\n            \"byteOffset\": 28980\n        },\n        {\n            \"buffer\": 0,\n            \"byteLength\": 2576,\n            \"byteOffset\": 31556\n        },\n        {\n            \"buffer\": 0,\n            \"byteLength\": 2576,\n            \"byteOffset\": 34132\n        },\n        {\n            \"buffer\": 0,\n            \"byteLength\": 2576,\n            \"byteOffset\": 36708\n        },\n        {\n            \"buffer\": 0,\n            \"byteLength\": 2576,\n            \"byteOffset\": 39284\n        },\n        {\n            \"buffer\": 0,\n            \"byteLength\": 2576,\n            \"byteOffset\": 41860\n        },\n        {\n            \"buffer\": 0,\n            \"byteLength\": 2576,\n            \"byteOffset\": 44436\n        },\n        {\n            \"buffer\": 0,\n            \"byteLength\": 2576,\n            \"byteOffset\": 47012\n        },\n        {\n            \"buffer\": 0,\n            \"byteLength\": 2576,\n            \"byteOffset\": 49588\n        },\n        {\n            \"buffer\": 0,\n            \"byteLength\": 2576,\n            \"byteOffset\": 52164\n        },\n        {\n            \"buffer\": 0,\n            \"byteLength\": 2576,\n            \"byteOffset\": 54740\n        },\n        {\n            \"buffer\": 0,\n            \"byteLength\": 2576,\n            \"byteOffset\": 57316\n        },\n        {\n            \"buffer\": 0,\n            \"byteLength\": 2576,\n            \"byteOffset\": 59892\n        },\n        {\n            \"buffer\": 0,\n            \"byteLength\": 2576,\n            \"byteOffset\": 62468\n        },\n        {\n            \"buffer\": 0,\n            \"byteLength\": 2576,\n            \"byteOffset\": 65044\n        },\n        {\n            \"buffer\": 0,\n            \"byteLength\": 2576,\n            \"byteOffset\": 67620\n        },\n        {\n            \"buffer\": 0,\n            \"byteLength\": 2576,\n            \"byteOffset\": 70196\n        },\n        {\n            \"buffer\": 0,\n            \"byteLength\": 1932,\n            \"byteOffset\": 72772\n        },\n        {\n            \"buffer\": 0,\n            \"byteLength\": 2576,\n            \"byteOffset\": 74704\n        },\n        {\n            \"buffer\": 0,\n            \"byteLength\": 1932,\n            \"byteOffset\": 77280\n        },\n        {\n            \"buffer\": 0,\n            \"byteLength\": 2576,\n            \"byteOffset\": 79212\n        },\n        {\n            \"buffer\": 0,\n            \"byteLength\": 12330,\n            \"byteOffset\": 81788,\n            \"target\": 34963\n        },\n        {\n            \"buffer\": 0,\n            \"byteLength\": 33108,\n            \"byteOffset\": 94120,\n            \"target\": 34962\n        },\n        {\n            \"buffer\": 0,\n            \"byteLength\": 33108,\n            \"byteOffset\": 127228,\n            \"target\": 34962\n        },\n        {\n            \"buffer\": 0,\n            \"byteLength\": 22072,\n            \"byteOffset\": 160336,\n            \"target\": 34962\n        },\n        {\n            \"buffer\": 0,\n            \"byteLength\": 22072,\n            \"byteOffset\": 182408,\n            \"target\": 34962\n        },\n        {\n            \"buffer\": 0,\n            \"byteLength\": 44144,\n            \"byteOffset\": 204480,\n            \"target\": 34962\n        },\n        {\n            \"buffer\": 0,\n            \"byteLength\": 2268,\n            \"byteOffset\": 248624,\n            \"target\": 34963\n        },\n        {\n            \"buffer\": 0,\n            \"byteLength\": 4032,\n            \"byteOffset\": 250892,\n            \"target\": 34962\n        },\n        {\n            \"buffer\": 0,\n            \"byteLength\": 4032,\n            \"byteOffset\": 254924,\n            \"target\": 34962\n        },\n        {\n            \"buffer\": 0,\n            \"byteLength\": 2688,\n            \"byteOffset\": 258956,\n            \"target\": 34962\n        },\n        {\n            \"buffer\": 0,\n            \"byteLength\": 2688,\n            \"byteOffset\": 261644,\n            \"target\": 34962\n        },\n        {\n            \"buffer\": 0,\n            \"byteLength\": 5376,\n            \"byteOffset\": 264332,\n            \"target\": 34962\n        },\n        {\n            \"buffer\": 0,\n            \"byteLength\": 3136,\n            \"byteOffset\": 269708\n        }\n    ],\n    \"scenes\": [\n        {\n            \"name\": \"Root Scene\",\n            \"nodes\": [\n                0\n            ]\n        }\n    ],\n    \"accessors\": [\n        {\n            \"componentType\": 5126,\n            \"type\": \"SCALAR\",\n            \"count\": 161,\n            \"bufferView\": 0,\n            \"byteOffset\": 0,\n            \"min\": [\n                0.0\n            ],\n            \"max\": [\n                6.66666650772095\n            ]\n        },\n        {\n            \"componentType\": 5126,\n            \"type\": \"VEC4\",\n            \"count\": 161,\n            \"bufferView\": 1,\n            \"byteOffset\": 0\n        },\n        {\n            \"componentType\": 5126,\n            \"type\": \"VEC4\",\n            \"count\": 161,\n            \"bufferView\": 2,\n            \"byteOffset\": 0\n        },\n        {\n            \"componentType\": 5126,\n            \"type\": \"VEC4\",\n            \"count\": 161,\n            \"bufferView\": 3,\n            \"byteOffset\": 0\n        },\n        {\n            \"componentType\": 5126,\n            \"type\": \"VEC4\",\n            \"count\": 161,\n            \"bufferView\": 4,\n            \"byteOffset\": 0\n        },\n        {\n            \"componentType\": 5126,\n            \"type\": \"VEC4\",\n            \"count\": 161,\n            \"bufferView\": 5,\n            \"byteOffset\": 0\n        },\n        {\n            \"componentType\": 5126,\n            \"type\": \"VEC4\",\n            \"count\": 161,\n            \"bufferView\": 6,\n            \"byteOffset\": 0\n        },\n        {\n            \"componentType\": 5126,\n            \"type\": \"VEC4\",\n            \"count\": 161,\n            \"bufferView\": 7,\n            \"byteOffset\": 0\n        },\n        {\n            \"componentType\": 5126,\n            \"type\": \"VEC4\",\n            \"count\": 161,\n            \"bufferView\": 8,\n            \"byteOffset\": 0\n        },\n        {\n            \"componentType\": 5126,\n            \"type\": \"VEC4\",\n            \"count\": 161,\n            \"bufferView\": 9,\n            \"byteOffset\": 0\n        },\n        {\n            \"componentType\": 5126,\n            \"type\": \"VEC4\",\n            \"count\": 161,\n            \"bufferView\": 10,\n            \"byteOffset\": 0\n        },\n        {\n            \"componentType\": 5126,\n            \"type\": \"VEC4\",\n            \"count\": 161,\n            \"bufferView\": 11,\n            \"byteOffset\": 0\n        },\n        {\n            \"componentType\": 5126,\n            \"type\": \"VEC4\",\n            \"count\": 161,\n            \"bufferView\": 12,\n            \"byteOffset\": 0\n        },\n        {\n            \"componentType\": 5126,\n            \"type\": \"VEC4\",\n            \"count\": 161,\n            \"bufferView\": 13,\n            \"byteOffset\": 0\n        },\n        {\n            \"componentType\": 5126,\n            \"type\": \"VEC4\",\n            \"count\": 161,\n            \"bufferView\": 14,\n            \"byteOffset\": 0\n        },\n        {\n            \"componentType\": 5126,\n            \"type\": \"VEC4\",\n            \"count\": 161,\n            \"bufferView\": 15,\n            \"byteOffset\": 0\n        },\n        {\n            \"componentType\": 5126,\n            \"type\": \"VEC4\",\n            \"count\": 161,\n            \"bufferView\": 16,\n            \"byteOffset\": 0\n        },\n        {\n            \"componentType\": 5126,\n            \"type\": \"VEC4\",\n            \"count\": 161,\n            \"bufferView\": 17,\n            \"byteOffset\": 0\n        },\n        {\n            \"componentType\": 5126,\n            \"type\": \"VEC4\",\n            \"count\": 161,\n            \"bufferView\": 18,\n            \"byteOffset\": 0\n        },\n        {\n            \"componentType\": 5126,\n            \"type\": \"VEC4\",\n            \"count\": 161,\n            \"bufferView\": 19,\n            \"byteOffset\": 0\n        },\n        {\n            \"componentType\": 5126,\n            \"type\": \"VEC4\",\n            \"count\": 161,\n            \"bufferView\": 20,\n            \"byteOffset\": 0\n        },\n        {\n            \"componentType\": 5126,\n            \"type\": \"VEC4\",\n            \"count\": 161,\n            \"bufferView\": 21,\n            \"byteOffset\": 0\n        },\n        {\n            \"componentType\": 5126,\n            \"type\": \"VEC4\",\n            \"count\": 161,\n            \"bufferView\": 22,\n            \"byteOffset\": 0\n        },\n        {\n            \"componentType\": 5126,\n            \"type\": \"VEC4\",\n            \"count\": 161,\n            \"bufferView\": 23,\n            \"byteOffset\": 0\n        },\n        {\n            \"componentType\": 5126,\n            \"type\": \"VEC4\",\n            \"count\": 161,\n            \"bufferView\": 24,\n            \"byteOffset\": 0\n        },\n        {\n            \"componentType\": 5126,\n            \"type\": \"VEC4\",\n            \"count\": 161,\n            \"bufferView\": 25,\n            \"byteOffset\": 0\n        },\n        {\n            \"componentType\": 5126,\n            \"type\": \"VEC4\",\n            \"count\": 161,\n            \"bufferView\": 26,\n            \"byteOffset\": 0\n        },\n        {\n            \"componentType\": 5126,\n            \"type\": \"VEC4\",\n            \"count\": 161,\n            \"bufferView\": 27,\n            \"byteOffset\": 0\n        },\n        {\n            \"componentType\": 5126,\n            \"type\": \"VEC4\",\n            \"count\": 161,\n            \"bufferView\": 28,\n            \"byteOffset\": 0\n        },\n        {\n            \"componentType\": 5126,\n            \"type\": \"VEC3\",\n            \"count\": 161,\n            \"bufferView\": 29,\n            \"byteOffset\": 0\n        },\n        {\n            \"componentType\": 5126,\n            \"type\": \"VEC4\",\n            \"count\": 161,\n            \"bufferView\": 30,\n            \"byteOffset\": 0\n        },\n        {\n            \"componentType\": 5126,\n            \"type\": \"VEC3\",\n            \"count\": 161,\n            \"bufferView\": 31,\n            \"byteOffset\": 0\n        },\n        {\n            \"componentType\": 5126,\n            \"type\": \"VEC4\",\n            \"count\": 161,\n            \"bufferView\": 32,\n            \"byteOffset\": 0\n        },\n        {\n            \"componentType\": 5123,\n            \"type\": \"SCALAR\",\n            \"count\": 6165,\n            \"bufferView\": 33,\n            \"byteOffset\": 0\n        },\n        {\n            \"componentType\": 5126,\n            \"type\": \"VEC3\",\n            \"count\": 2759,\n            \"bufferView\": 34,\n            \"byteOffset\": 0,\n            \"min\": [\n                -81.9805221557617,\n                86.7850799560547,\n                -18.6015281677246\n            ],\n            \"max\": [\n                81.9540557861328,\n                143.793167114258,\n                17.2828502655029\n            ]\n        },\n        {\n            \"componentType\": 5126,\n            \"type\": \"VEC3\",\n            \"count\": 2759,\n            \"bufferView\": 35,\n            \"byteOffset\": 0\n        },\n        {\n            \"componentType\": 5126,\n            \"type\": \"VEC2\",\n            \"count\": 2759,\n            \"bufferView\": 36,\n            \"byteOffset\": 0\n        },\n        {\n            \"componentType\": 5123,\n            \"type\": \"VEC4\",\n            \"count\": 2759,\n            \"bufferView\": 37,\n            \"byteOffset\": 0\n        },\n        {\n            \"componentType\": 5126,\n            \"type\": \"VEC4\",\n            \"count\": 2759,\n            \"bufferView\": 38,\n            \"byteOffset\": 0\n        },\n        {\n            \"componentType\": 5123,\n            \"type\": \"SCALAR\",\n            \"count\": 1134,\n            \"bufferView\": 39,\n            \"byteOffset\": 0\n        },\n        {\n            \"componentType\": 5126,\n            \"type\": \"VEC3\",\n            \"count\": 336,\n            \"bufferView\": 40,\n            \"byteOffset\": 0,\n            \"min\": [\n                -12.0123357772827,\n                151.862823486328,\n                -8.23231601715088\n            ],\n            \"max\": [\n                12.0123262405396,\n                174.369445800781,\n                16.5866527557373\n            ]\n        },\n        {\n            \"componentType\": 5126,\n            \"type\": \"VEC3\",\n            \"count\": 336,\n            \"bufferView\": 41,\n            \"byteOffset\": 0\n        },\n        {\n            \"componentType\": 5126,\n            \"type\": \"VEC2\",\n            \"count\": 336,\n            \"bufferView\": 42,\n            \"byteOffset\": 0\n        },\n        {\n            \"componentType\": 5123,\n            \"type\": \"VEC4\",\n            \"count\": 336,\n            \"bufferView\": 43,\n            \"byteOffset\": 0\n        },\n        {\n            \"componentType\": 5126,\n            \"type\": \"VEC4\",\n            \"count\": 336,\n            \"bufferView\": 44,\n            \"byteOffset\": 0\n        },\n        {\n            \"componentType\": 5126,\n            \"type\": \"MAT4\",\n            \"count\": 49,\n            \"bufferView\": 45,\n            \"byteOffset\": 0\n        }\n    ],\n    \"images\": [\n        {\n            \"name\": \"AvatarBotA_Tex_Combined.png\",\n            \"uri\": \"AvatarBotA_Tex_Combined.png\"\n        },\n        {\n            \"name\": \"AvatarBotA_Head_Tex_Combined.png\",\n            \"uri\": \"AvatarBotA_Head_Tex_Combined.png\"\n        }\n    ],\n    \"samplers\": [\n        {}\n    ],\n    \"textures\": [\n        {\n            \"name\": \"file5\",\n            \"sampler\": 0,\n            \"source\": 0\n        },\n        {\n            \"name\": \"file6\",\n            \"sampler\": 0,\n            \"source\": 1\n        }\n    ],\n    \"materials\": [\n        {\n            \"name\": \"Bot_BodyHands_mat\",\n            \"alphaMode\": \"OPAQUE\",\n            \"pbrMetallicRoughness\": {\n                \"baseColorTexture\": {\n                    \"index\": 0,\n                    \"texCoord\": 0\n                },\n                \"baseColorFactor\": [\n                    0.800000011920929,\n                    0.800000011920929,\n                    0.800000011920929,\n                    1.0\n                ],\n                \"metallicFactor\": 0.0,\n                \"roughnessFactor\": 1.0\n            },\n            \"extensions\": {\n                \"KHR_materials_unlit\": {}\n            }\n        },\n        {\n            \"name\": \"Bot_Head_mat\",\n            \"alphaMode\": \"OPAQUE\",\n            \"pbrMetallicRoughness\": {\n                \"baseColorTexture\": {\n                    \"index\": 1,\n                    \"texCoord\": 0\n                },\n                \"baseColorFactor\": [\n                    1.0,\n                    1.0,\n                    1.0,\n                    1.0\n                ],\n                \"metallicFactor\": 0.0,\n                \"roughnessFactor\": 1.0\n            },\n            \"extensions\": {\n                \"KHR_materials_unlit\": {}\n            }\n        }\n    ],\n    \"meshes\": [\n        {\n            \"name\": \"Bot_Skinned\",\n            \"primitives\": [\n                {\n                    \"material\": 0,\n                    \"mode\": 4,\n                    \"attributes\": {\n                        \"JOINTS_0\": 37,\n                        \"NORMAL\": 35,\n                        \"POSITION\": 34,\n                        \"TEXCOORD_0\": 36,\n                        \"WEIGHTS_0\": 38\n                    },\n                    \"indices\": 33\n                },\n                {\n                    \"material\": 1,\n                    \"mode\": 4,\n                    \"attributes\": {\n                        \"JOINTS_0\": 43,\n                        \"NORMAL\": 41,\n                        \"POSITION\": 40,\n                        \"TEXCOORD_0\": 42,\n                        \"WEIGHTS_0\": 44\n                    },\n                    \"indices\": 39\n                }\n            ]\n        }\n    ],\n    \"skins\": [\n        {\n            \"joints\": [\n                1,\n                2,\n                3,\n                4,\n                5,\n                6,\n                7,\n                8,\n                9,\n                10,\n                11,\n                12,\n                13,\n                14,\n                15,\n                16,\n                17,\n                18,\n                19,\n                20,\n                21,\n                22,\n                23,\n                24,\n                25,\n                26,\n                27,\n                28,\n                29,\n                30,\n                31,\n                32,\n                33,\n                34,\n                35,\n                36,\n                37,\n                38,\n                39,\n                40,\n                41,\n                42,\n                43,\n                44,\n                45,\n                46,\n                47,\n                48,\n                49\n            ],\n            \"inverseBindMatrices\": 45,\n            \"skeleton\": 1\n        }\n    ],\n    \"animations\": [\n        {\n            \"name\": \"Take 001\",\n            \"channels\": [\n                {\n                    \"sampler\": 0,\n                    \"target\": {\n                        \"node\": 5,\n                        \"path\": \"rotation\"\n                    }\n                },\n                {\n                    \"sampler\": 1,\n                    \"target\": {\n                        \"node\": 6,\n                        \"path\": \"rotation\"\n                    }\n                },\n                {\n                    \"sampler\": 2,\n                    \"target\": {\n                        \"node\": 8,\n                        \"path\": \"rotation\"\n                    }\n                },\n                {\n                    \"sampler\": 3,\n                    \"target\": {\n                        \"node\": 9,\n                        \"path\": \"rotation\"\n                    }\n                },\n                {\n                    \"sampler\": 4,\n                    \"target\": {\n                        \"node\": 10,\n                        \"path\": \"rotation\"\n                    }\n                },\n                {\n                    \"sampler\": 5,\n                    \"target\": {\n                        \"node\": 12,\n                        \"path\": \"rotation\"\n                    }\n                },\n                {\n                    \"sampler\": 6,\n                    \"target\": {\n                        \"node\": 13,\n                        \"path\": \"rotation\"\n                    }\n                },\n                {\n                    \"sampler\": 7,\n                    \"target\": {\n                        \"node\": 14,\n                        \"path\": \"rotation\"\n                    }\n                },\n                {\n                    \"sampler\": 8,\n                    \"target\": {\n                        \"node\": 16,\n                        \"path\": \"rotation\"\n                    }\n                },\n                {\n                    \"sampler\": 9,\n                    \"target\": {\n                        \"node\": 17,\n                        \"path\": \"rotation\"\n                    }\n                },\n                {\n                    \"sampler\": 10,\n                    \"target\": {\n                        \"node\": 18,\n                        \"path\": \"rotation\"\n                    }\n                },\n                {\n                    \"sampler\": 11,\n                    \"target\": {\n                        \"node\": 20,\n                        \"path\": \"rotation\"\n                    }\n                },\n                {\n                    \"sampler\": 12,\n                    \"target\": {\n                        \"node\": 21,\n                        \"path\": \"rotation\"\n                    }\n                },\n                {\n                    \"sampler\": 13,\n                    \"target\": {\n                        \"node\": 22,\n                        \"path\": \"rotation\"\n                    }\n                },\n                {\n                    \"sampler\": 14,\n                    \"target\": {\n                        \"node\": 26,\n                        \"path\": \"rotation\"\n                    }\n                },\n                {\n                    \"sampler\": 15,\n                    \"target\": {\n                        \"node\": 27,\n                        \"path\": \"rotation\"\n                    }\n                },\n                {\n                    \"sampler\": 16,\n                    \"target\": {\n                        \"node\": 29,\n                        \"path\": \"rotation\"\n                    }\n                },\n                {\n                    \"sampler\": 17,\n                    \"target\": {\n                        \"node\": 30,\n                        \"path\": \"rotation\"\n                    }\n                },\n                {\n                    \"sampler\": 18,\n                    \"target\": {\n                        \"node\": 31,\n                        \"path\": \"rotation\"\n                    }\n                },\n                {\n                    \"sampler\": 19,\n                    \"target\": {\n                        \"node\": 33,\n                        \"path\": \"rotation\"\n                    }\n                },\n                {\n                    \"sampler\": 20,\n                    \"target\": {\n                        \"node\": 34,\n                        \"path\": \"rotation\"\n                    }\n                },\n                {\n                    \"sampler\": 21,\n                    \"target\": {\n                        \"node\": 35,\n                        \"path\": \"rotation\"\n                    }\n                },\n                {\n                    \"sampler\": 22,\n                    \"target\": {\n                        \"node\": 37,\n                        \"path\": \"rotation\"\n                    }\n                },\n                {\n                    \"sampler\": 23,\n                    \"target\": {\n                        \"node\": 38,\n                        \"path\": \"rotation\"\n                    }\n                },\n                {\n                    \"sampler\": 24,\n                    \"target\": {\n                        \"node\": 39,\n                        \"path\": \"rotation\"\n                    }\n                },\n                {\n                    \"sampler\": 25,\n                    \"target\": {\n                        \"node\": 41,\n                        \"path\": \"rotation\"\n                    }\n                },\n                {\n                    \"sampler\": 26,\n                    \"target\": {\n                        \"node\": 42,\n                        \"path\": \"rotation\"\n                    }\n                },\n                {\n                    \"sampler\": 27,\n                    \"target\": {\n                        \"node\": 43,\n                        \"path\": \"rotation\"\n                    }\n                },\n                {\n                    \"sampler\": 28,\n                    \"target\": {\n                        \"node\": 48,\n                        \"path\": \"translation\"\n                    }\n                },\n                {\n                    \"sampler\": 29,\n                    \"target\": {\n                        \"node\": 48,\n                        \"path\": \"rotation\"\n                    }\n                },\n                {\n                    \"sampler\": 30,\n                    \"target\": {\n                        \"node\": 49,\n                        \"path\": \"translation\"\n                    }\n                },\n                {\n                    \"sampler\": 31,\n                    \"target\": {\n                        \"node\": 49,\n                        \"path\": \"rotation\"\n                    }\n                }\n            ],\n            \"samplers\": [\n                {\n                    \"input\": 0,\n                    \"interpolation\": \"LINEAR\",\n                    \"output\": 1\n                },\n                {\n                    \"input\": 0,\n                    \"interpolation\": \"LINEAR\",\n                    \"output\": 2\n                },\n                {\n                    \"input\": 0,\n                    \"interpolation\": \"LINEAR\",\n                    \"output\": 3\n                },\n                {\n                    \"input\": 0,\n                    \"interpolation\": \"LINEAR\",\n                    \"output\": 4\n                },\n                {\n                    \"input\": 0,\n                    \"interpolation\": \"LINEAR\",\n                    \"output\": 5\n                },\n                {\n                    \"input\": 0,\n                    \"interpolation\": \"LINEAR\",\n                    \"output\": 6\n                },\n                {\n                    \"input\": 0,\n                    \"interpolation\": \"LINEAR\",\n                    \"output\": 7\n                },\n                {\n                    \"input\": 0,\n                    \"interpolation\": \"LINEAR\",\n                    \"output\": 8\n                },\n                {\n                    \"input\": 0,\n                    \"interpolation\": \"LINEAR\",\n                    \"output\": 9\n                },\n                {\n                    \"input\": 0,\n                    \"interpolation\": \"LINEAR\",\n                    \"output\": 10\n                },\n                {\n                    \"input\": 0,\n                    \"interpolation\": \"LINEAR\",\n                    \"output\": 11\n                },\n                {\n                    \"input\": 0,\n                    \"interpolation\": \"LINEAR\",\n                    \"output\": 12\n                },\n                {\n                    \"input\": 0,\n                    \"interpolation\": \"LINEAR\",\n                    \"output\": 13\n                },\n                {\n                    \"input\": 0,\n                    \"interpolation\": \"LINEAR\",\n                    \"output\": 14\n                },\n                {\n                    \"input\": 0,\n                    \"interpolation\": \"LINEAR\",\n                    \"output\": 15\n                },\n                {\n                    \"input\": 0,\n                    \"interpolation\": \"LINEAR\",\n                    \"output\": 16\n                },\n                {\n                    \"input\": 0,\n                    \"interpolation\": \"LINEAR\",\n                    \"output\": 17\n                },\n                {\n                    \"input\": 0,\n                    \"interpolation\": \"LINEAR\",\n                    \"output\": 18\n                },\n                {\n                    \"input\": 0,\n                    \"interpolation\": \"LINEAR\",\n                    \"output\": 19\n                },\n                {\n                    \"input\": 0,\n                    \"interpolation\": \"LINEAR\",\n                    \"output\": 20\n                },\n                {\n                    \"input\": 0,\n                    \"interpolation\": \"LINEAR\",\n                    \"output\": 21\n                },\n                {\n                    \"input\": 0,\n                    \"interpolation\": \"LINEAR\",\n                    \"output\": 22\n                },\n                {\n                    \"input\": 0,\n                    \"interpolation\": \"LINEAR\",\n                    \"output\": 23\n                },\n                {\n                    \"input\": 0,\n                    \"interpolation\": \"LINEAR\",\n                    \"output\": 24\n                },\n                {\n                    \"input\": 0,\n                    \"interpolation\": \"LINEAR\",\n                    \"output\": 25\n                },\n                {\n                    \"input\": 0,\n                    \"interpolation\": \"LINEAR\",\n                    \"output\": 26\n                },\n                {\n                    \"input\": 0,\n                    \"interpolation\": \"LINEAR\",\n                    \"output\": 27\n                },\n                {\n                    \"input\": 0,\n                    \"interpolation\": \"LINEAR\",\n                    \"output\": 28\n                },\n                {\n                    \"input\": 0,\n                    \"interpolation\": \"LINEAR\",\n                    \"output\": 29\n                },\n                {\n                    \"input\": 0,\n                    \"interpolation\": \"LINEAR\",\n                    \"output\": 30\n                },\n                {\n                    \"input\": 0,\n                    \"interpolation\": \"LINEAR\",\n                    \"output\": 31\n                },\n                {\n                    \"input\": 0,\n                    \"interpolation\": \"LINEAR\",\n                    \"output\": 32\n                }\n            ]\n        }\n    ],\n    \"nodes\": [\n        {\n            \"name\": \"RootNode\",\n            \"translation\": [\n                0.0,\n                0.0,\n                0.0\n            ],\n            \"rotation\": [\n                0.0,\n                0.0,\n                0.0,\n                1.0\n            ],\n            \"scale\": [\n                1.0,\n                1.0,\n                1.0\n            ],\n            \"children\": [\n                1,\n                50\n            ]\n        },\n        {\n            \"name\": \"Hips\",\n            \"translation\": [\n                0.0,\n                1.0,\n                0.0\n            ],\n            \"rotation\": [\n                0.0,\n                0.0,\n                0.0,\n                1.0\n            ],\n            \"scale\": [\n                0.00999999977648258,\n                0.00999999977648258,\n                0.00999999977648258\n            ],\n            \"children\": [\n                2\n            ]\n        },\n        {\n            \"name\": \"Chest\",\n            \"translation\": [\n                0.0,\n                33.0,\n                0.0\n            ],\n            \"rotation\": [\n                0.0,\n                0.0,\n                0.0,\n                1.0\n            ],\n            \"scale\": [\n                1.0,\n                1.0,\n                1.0\n            ],\n            \"children\": [\n                3,\n                24,\n                45\n            ]\n        },\n        {\n            \"name\": \"RightHand\",\n            \"translation\": [\n                -65.8264923095703,\n                0.0,\n                2.53653403836651e-10\n            ],\n            \"rotation\": [\n                -0.52379697561264,\n                -0.475012362003326,\n                -0.475012362003326,\n                0.52379697561264\n            ],\n            \"scale\": [\n                1.0,\n                1.0,\n                1.0\n            ],\n            \"children\": [\n                4,\n                8,\n                12,\n                16,\n                20\n            ]\n        },\n        {\n            \"name\": \"RightHandThumb1\",\n            \"translation\": [\n                2.75763964653015,\n                -2.15007448196411,\n                0.0\n            ],\n            \"rotation\": [\n                -0.0845961794257164,\n                0.24460332095623,\n                0.315717250108719,\n                0.912872016429901\n            ],\n            \"scale\": [\n                1.0,\n                1.0,\n                1.0\n            ],\n            \"children\": [\n                5\n            ]\n        },\n        {\n            \"name\": \"RightHandThumb2\",\n            \"translation\": [\n                -0.193791568279266,\n                -3.45449066162109,\n                -0.111885614693165\n            ],\n            \"rotation\": [\n                0.259822696447372,\n                0.0406266376376152,\n                -0.0417451933026314,\n                0.963897824287415\n            ],\n            \"scale\": [\n                1.0,\n                1.0,\n                1.0\n            ],\n            \"children\": [\n                6\n            ]\n        },\n        {\n            \"name\": \"RightHandThumb3\",\n            \"translation\": [\n                0.0183828547596931,\n                -2.60901737213135,\n                0.604700565338135\n            ],\n            \"rotation\": [\n                0.130526185035706,\n                -3.11409512388451e-17,\n                -2.38952924416889e-17,\n                0.991444885730743\n            ],\n            \"scale\": [\n                1.0,\n                1.0,\n                1.0\n            ],\n            \"children\": [\n                7\n            ]\n        },\n        {\n            \"name\": \"RightHandThumb4\",\n            \"translation\": [\n                -0.00614145956933498,\n                -1.84276032447815,\n                0.275437027215958\n            ],\n            \"rotation\": [\n                -0.0143108321353793,\n                -0.00529135810211301,\n                -0.346111297607422,\n                0.938069403171539\n            ],\n            \"scale\": [\n                1.0,\n                1.0,\n                1.0\n            ]\n        },\n        {\n            \"name\": \"RightHandIndex1\",\n            \"translation\": [\n                2.1877007484436,\n                -8.50447845458984,\n                -0.00400000018998981\n            ],\n            \"rotation\": [\n                0.129879087209702,\n                0.00267119123600423,\n                0.0197229869663715,\n                0.991330087184906\n            ],\n            \"scale\": [\n                1.0,\n                1.0,\n                1.0\n            ],\n            \"children\": [\n                9\n            ]\n        },\n        {\n            \"name\": \"RightHandIndex2\",\n            \"translation\": [\n                1.10285200207727e-05,\n                -3.35957384109497,\n                -0.000199394213268533\n            ],\n            \"rotation\": [\n                0.131140783429146,\n                0.000969027169048786,\n                0.00806150026619434,\n                0.991330504417419\n            ],\n            \"scale\": [\n                1.0,\n                1.0,\n                1.0\n            ],\n            \"children\": [\n                10\n            ]\n        },\n        {\n            \"name\": \"RightHandIndex3\",\n            \"translation\": [\n                -2.62199250755657e-07,\n                -2.57685971260071,\n                1.63709046319127e-11\n            ],\n            \"rotation\": [\n                0.130491554737091,\n                -0.00300704198889434,\n                -0.02284075319767,\n                0.99118173122406\n            ],\n            \"scale\": [\n                1.0,\n                1.0,\n                1.0\n            ],\n            \"children\": [\n                11\n            ]\n        },\n        {\n            \"name\": \"RightHandIndex4\",\n            \"translation\": [\n                -6.4880941863521e-07,\n                -2.16984295845032,\n                1.45519152283669e-11\n            ],\n            \"rotation\": [\n                7.44831396559675e-09,\n                -1.83785861529451e-10,\n                -0.0246648676693439,\n                0.999695777893066\n            ],\n            \"scale\": [\n                1.0,\n                1.0,\n                1.0\n            ]\n        },\n        {\n            \"name\": \"RightHandMiddle1\",\n            \"translation\": [\n                -1.02776675703353e-06,\n                -8.89051723480225,\n                0.0\n            ],\n            \"rotation\": [\n                0.13047268986702,\n                -0.00373660982586443,\n                -0.0283823702484369,\n                0.991038501262665\n            ],\n            \"scale\": [\n                1.0,\n                1.0,\n                1.0\n            ],\n            \"children\": [\n                13\n            ]\n        },\n        {\n            \"name\": \"RightHandMiddle2\",\n            \"translation\": [\n                1.85175611022714e-06,\n                -3.40467071533203,\n                0.0\n            ],\n            \"rotation\": [\n                0.130523636937141,\n                -0.000818223459646106,\n                -0.00621502334252,\n                0.991425395011902\n            ],\n            \"scale\": [\n                1.0,\n                1.0,\n                1.0\n            ],\n            \"children\": [\n                14\n            ]\n        },\n        {\n            \"name\": \"RightHandMiddle3\",\n            \"translation\": [\n                1.05654953586054e-06,\n                -2.67793536186218,\n                -1.81898940354586e-12\n            ],\n            \"rotation\": [\n                0.130522698163986,\n                0.000956544012296945,\n                0.00726567255333066,\n                0.991418242454529\n            ],\n            \"scale\": [\n                1.0,\n                1.0,\n                1.0\n            ],\n            \"children\": [\n                15\n            ]\n        },\n        {\n            \"name\": \"RightHandMiddle4\",\n            \"translation\": [\n                -3.79802463612577e-06,\n                -2.63057136535645,\n                6.78955984767526e-08\n            ],\n            \"rotation\": [\n                1.82495529799098e-08,\n                3.47519013566e-10,\n                0.0078874584287405,\n                0.999968886375427\n            ],\n            \"scale\": [\n                1.0,\n                1.0,\n                1.0\n            ]\n        },\n        {\n            \"name\": \"RightHandRing1\",\n            \"translation\": [\n                -1.72323477268219,\n                -8.434814453125,\n                0.0\n            ],\n            \"rotation\": [\n                0.130034267902374,\n                -0.0113214813172817,\n                -0.085995189845562,\n                0.987708330154419\n            ],\n            \"scale\": [\n                1.0,\n                1.0,\n                1.0\n            ],\n            \"children\": [\n                17\n            ]\n        },\n        {\n            \"name\": \"RightHandRing2\",\n            \"translation\": [\n                4.97117707709549e-06,\n                -2.92135119438171,\n                0.0\n            ],\n            \"rotation\": [\n                0.130523890256882,\n                0.000776301021687686,\n                0.00589659111574292,\n                0.991427302360535\n            ],\n            \"scale\": [\n                1.0,\n                1.0,\n                1.0\n            ],\n            \"children\": [\n                18\n            ]\n        },\n        {\n            \"name\": \"RightHandRing3\",\n            \"translation\": [\n                -4.25719008489978e-06,\n                -2.7104823589325,\n                -1.81898940354586e-12\n            ],\n            \"rotation\": [\n                0.130523800849915,\n                -0.000789301353506744,\n                -0.0059953392483294,\n                0.991426706314087\n            ],\n            \"scale\": [\n                1.0,\n                1.0,\n                1.0\n            ],\n            \"children\": [\n                19\n            ]\n        },\n        {\n            \"name\": \"RightHandRing4\",\n            \"translation\": [\n                -1.67088660418813e-06,\n                -2.41632723808289,\n                0.0\n            ],\n            \"rotation\": [\n                -2.85607333715533e-17,\n                4.32810741164245e-17,\n                0.067211352288723,\n                0.997738778591156\n            ],\n            \"scale\": [\n                1.0,\n                1.0,\n                1.0\n            ]\n        },\n        {\n            \"name\": \"RightHandPinky1\",\n            \"translation\": [\n                -3.45131826400757,\n                -7.36873292922974,\n                0.0\n            ],\n            \"rotation\": [\n                0.128799960017204,\n                -0.0211579278111458,\n                -0.160710424184799,\n                0.978332817554474\n            ],\n            \"scale\": [\n                1.0,\n                1.0,\n                1.0\n            ],\n            \"children\": [\n                21\n            ]\n        },\n        {\n            \"name\": \"RightHandPinky2\",\n            \"translation\": [\n                7.14437692295178e-06,\n                -3.33492231369019,\n                -1.81898940354586e-12\n            ],\n            \"rotation\": [\n                0.130520552396774,\n                0.00121425895486027,\n                0.00922321155667305,\n                0.991401970386505\n            ],\n            \"scale\": [\n                1.0,\n                1.0,\n                1.0\n            ],\n            \"children\": [\n                22\n            ]\n        },\n        {\n            \"name\": \"RightHandPinky3\",\n            \"translation\": [\n                -6.04431488682167e-06,\n                -1.95470726490021,\n                5.04514900967479e-08\n            ],\n            \"rotation\": [\n                0.13052274286747,\n                -0.0009512152755633,\n                -0.00722519494593143,\n                0.991418540477753\n            ],\n            \"scale\": [\n                1.0,\n                1.0,\n                1.0\n            ],\n            \"children\": [\n                23\n            ]\n        },\n        {\n            \"name\": \"RightHandPinky4\",\n            \"translation\": [\n                7.62369018048048e-06,\n                -1.84980952739716,\n                1.02871126728132e-07\n            ],\n            \"rotation\": [\n                2.44651445768795e-08,\n                1.11148032999608e-08,\n                0.140648439526558,\n                0.990059614181519\n            ],\n            \"scale\": [\n                1.0,\n                1.0,\n                1.0\n            ]\n        },\n        {\n            \"name\": \"LeftHand\",\n            \"translation\": [\n                65.8000030517578,\n                0.0,\n                0.0\n            ],\n            \"rotation\": [\n                0.52379697561264,\n                0.475012362003326,\n                -0.475012362003326,\n                0.52379697561264\n            ],\n            \"scale\": [\n                1.0,\n                1.0,\n                1.0\n            ],\n            \"children\": [\n                25,\n                29,\n                33,\n                37,\n                41\n            ]\n        },\n        {\n            \"name\": \"LeftHandThumb1\",\n            \"translation\": [\n                -2.7576425075531,\n                2.15009140968323,\n                -1.09139364212751e-11\n            ],\n            \"rotation\": [\n                -0.0845961794257164,\n                0.24460332095623,\n                0.315717250108719,\n                0.912872016429901\n            ],\n            \"scale\": [\n                1.0,\n                1.0,\n                1.0\n            ],\n            \"children\": [\n                26\n            ]\n        },\n        {\n            \"name\": \"LeftHandThumb2\",\n            \"translation\": [\n                0.193819507956505,\n                3.45451331138611,\n                0.111901737749577\n            ],\n            \"rotation\": [\n                0.258741647005081,\n                0.0406734235584736,\n                -0.0416996106505394,\n                0.964188575744629\n            ],\n            \"scale\": [\n                1.0,\n                1.0,\n                1.0\n            ],\n            \"children\": [\n                27\n            ]\n        },\n        {\n            \"name\": \"LeftHandThumb3\",\n            \"translation\": [\n                -0.018382428213954,\n                2.60901665687561,\n                -0.604700148105621\n            ],\n            \"rotation\": [\n                0.130526185035706,\n                8.98000309354021e-17,\n                4.41677554847997e-17,\n                0.991444885730743\n            ],\n            \"scale\": [\n                1.0,\n                1.0,\n                1.0\n            ],\n            \"children\": [\n                28\n            ]\n        },\n        {\n            \"name\": \"LeftHandThumb4\",\n            \"translation\": [\n                0.00620248122140765,\n                1.84271383285522,\n                -0.275547921657562\n            ],\n            \"rotation\": [\n                -0.0143108321353793,\n                -0.00529135810211301,\n                -0.346111297607422,\n                0.938069403171539\n            ],\n            \"scale\": [\n                1.0,\n                1.0,\n                1.0\n            ]\n        },\n        {\n            \"name\": \"LeftHandIndex1\",\n            \"translation\": [\n                -2.18770694732666,\n                8.50446128845215,\n                0.00419948389753699\n            ],\n            \"rotation\": [\n                0.129879087209702,\n                0.00267119123600423,\n                0.0197229869663715,\n                0.991330087184906\n            ],\n            \"scale\": [\n                1.0,\n                1.0,\n                1.0\n            ],\n            \"children\": [\n                30\n            ]\n        },\n        {\n            \"name\": \"LeftHandIndex2\",\n            \"translation\": [\n                -1.13686837721616e-13,\n                3.35964441299438,\n                1.81898940354586e-12\n            ],\n            \"rotation\": [\n                0.131140783429146,\n                0.000969027169048786,\n                0.00806150026619434,\n                0.991330504417419\n            ],\n            \"scale\": [\n                1.0,\n                1.0,\n                1.0\n            ],\n            \"children\": [\n                31\n            ]\n        },\n        {\n            \"name\": \"LeftHandIndex3\",\n            \"translation\": [\n                0.0,\n                2.57680535316467,\n                0.0\n            ],\n            \"rotation\": [\n                0.130491554737091,\n                -0.00300704198889434,\n                -0.02284075319767,\n                0.99118173122406\n            ],\n            \"scale\": [\n                1.0,\n                1.0,\n                1.0\n            ],\n            \"children\": [\n                32\n            ]\n        },\n        {\n            \"name\": \"LeftHandIndex4\",\n            \"translation\": [\n                -1.13686837721616e-13,\n                2.16987800598145,\n                0.0\n            ],\n            \"rotation\": [\n                4.28986164068626e-18,\n                6.83516462791247e-18,\n                -0.0246648676693439,\n                0.999695777893066\n            ],\n            \"scale\": [\n                1.0,\n                1.0,\n                1.0\n            ]\n        },\n        {\n            \"name\": \"LeftHandMiddle1\",\n            \"translation\": [\n                0.0,\n                8.89050388336182,\n                4.54747350886464e-11\n            ],\n            \"rotation\": [\n                0.13047268986702,\n                -0.00373660982586443,\n                -0.0283823702484369,\n                0.991038501262665\n            ],\n            \"scale\": [\n                1.0,\n                1.0,\n                1.0\n            ],\n            \"children\": [\n                34\n            ]\n        },\n        {\n            \"name\": \"LeftHandMiddle2\",\n            \"translation\": [\n                -5.6843418860808e-14,\n                3.40468168258667,\n                2.36468622460961e-11\n            ],\n            \"rotation\": [\n                0.13052362203598,\n                -0.000818223343230784,\n                -0.00621502334252,\n                0.991425395011902\n            ],\n            \"scale\": [\n                1.0,\n                1.0,\n                1.0\n            ],\n            \"children\": [\n                35\n            ]\n        },\n        {\n            \"name\": \"LeftHandMiddle3\",\n            \"translation\": [\n                -2.8421709430404e-14,\n                2.67797994613647,\n                3.63797880709171e-12\n            ],\n            \"rotation\": [\n                0.130522683262825,\n                0.000956543954089284,\n                0.00726567255333066,\n                0.991418242454529\n            ],\n            \"scale\": [\n                1.0,\n                1.0,\n                1.0\n            ],\n            \"children\": [\n                36\n            ]\n        },\n        {\n            \"name\": \"LeftHandMiddle4\",\n            \"translation\": [\n                0.0,\n                2.63050961494446,\n                -1.81898940354586e-12\n            ],\n            \"rotation\": [\n                -6.30038723337714e-17,\n                1.23782160635548e-18,\n                0.0078874584287405,\n                0.999968886375427\n            ],\n            \"scale\": [\n                1.0,\n                1.0,\n                1.0\n            ]\n        },\n        {\n            \"name\": \"LeftHandRing1\",\n            \"translation\": [\n                1.72323560714722,\n                8.4348258972168,\n                6.00266503170133e-11\n            ],\n            \"rotation\": [\n                0.130034267902374,\n                -0.0113214813172817,\n                -0.085995189845562,\n                0.987708330154419\n            ],\n            \"scale\": [\n                1.0,\n                1.0,\n                1.0\n            ],\n            \"children\": [\n                38\n            ]\n        },\n        {\n            \"name\": \"LeftHandRing2\",\n            \"translation\": [\n                0.0,\n                2.92133402824402,\n                2.36468622460961e-11\n            ],\n            \"rotation\": [\n                0.130523890256882,\n                0.000776300963480026,\n                0.00589659111574292,\n                0.991427302360535\n            ],\n            \"scale\": [\n                1.0,\n                1.0,\n                1.0\n            ],\n            \"children\": [\n                39\n            ]\n        },\n        {\n            \"name\": \"LeftHandRing3\",\n            \"translation\": [\n                0.0,\n                2.71053099632263,\n                0.0\n            ],\n            \"rotation\": [\n                0.130523800849915,\n                -0.000789301353506744,\n                -0.0059953392483294,\n                0.991426706314087\n            ],\n            \"scale\": [\n                1.0,\n                1.0,\n                1.0\n            ],\n            \"children\": [\n                40\n            ]\n        },\n        {\n            \"name\": \"LeftHandRing4\",\n            \"translation\": [\n                0.0,\n                2.4163134098053,\n                1.81898940354586e-12\n            ],\n            \"rotation\": [\n                5.34889858011413e-17,\n                -6.82871510067639e-18,\n                0.067211352288723,\n                0.997738778591156\n            ],\n            \"scale\": [\n                1.0,\n                1.0,\n                1.0\n            ]\n        },\n        {\n            \"name\": \"LeftHandPinky1\",\n            \"translation\": [\n                3.45132112503052,\n                7.36876058578491,\n                6.54836185276508e-11\n            ],\n            \"rotation\": [\n                0.128799960017204,\n                -0.0211579278111458,\n                -0.160710424184799,\n                0.978332817554474\n            ],\n            \"scale\": [\n                1.0,\n                1.0,\n                1.0\n            ],\n            \"children\": [\n                42\n            ]\n        },\n        {\n            \"name\": \"LeftHandPinky2\",\n            \"translation\": [\n                0.0,\n                3.33487010002136,\n                3.09228198602796e-11\n            ],\n            \"rotation\": [\n                0.130520537495613,\n                0.00121425883844495,\n                0.00922321155667305,\n                0.991401970386505\n            ],\n            \"scale\": [\n                1.0,\n                1.0,\n                1.0\n            ],\n            \"children\": [\n                43\n            ]\n        },\n        {\n            \"name\": \"LeftHandPinky3\",\n            \"translation\": [\n                2.27373675443232e-13,\n                1.95477187633514,\n                1.81898940354586e-12\n            ],\n            \"rotation\": [\n                0.130522727966309,\n                -0.000951214926317334,\n                -0.00722519494593143,\n                0.991418540477753\n            ],\n            \"scale\": [\n                1.0,\n                1.0,\n                1.0\n            ],\n            \"children\": [\n                44\n            ]\n        },\n        {\n            \"name\": \"LeftHandPinky4\",\n            \"translation\": [\n                0.0,\n                1.84976482391357,\n                1.81898940354586e-12\n            ],\n            \"rotation\": [\n                8.82180761380352e-18,\n                -1.27638923328801e-17,\n                0.140648439526558,\n                0.990059614181519\n            ],\n            \"scale\": [\n                1.0,\n                1.0,\n                1.0\n            ]\n        },\n        {\n            \"name\": \"Neck\",\n            \"translation\": [\n                -2.09076530502568e-16,\n                14.3466949462891,\n                -3.28626015289046e-14\n            ],\n            \"rotation\": [\n                0.0,\n                0.0,\n                0.0,\n                1.0\n            ],\n            \"scale\": [\n                1.0,\n                1.0,\n                1.0\n            ],\n            \"children\": [\n                46\n            ]\n        },\n        {\n            \"name\": \"Head\",\n            \"translation\": [\n                -1.72115390890012e-17,\n                9.05494976043701,\n                2.07404236001782e-16\n            ],\n            \"rotation\": [\n                -6.93889390390723e-18,\n                1.27054942088145e-20,\n                1.0842021724855e-19,\n                1.0\n            ],\n            \"scale\": [\n                1.0,\n                1.0,\n                1.0\n            ],\n            \"children\": [\n                47,\n                48,\n                49\n            ]\n        },\n        {\n            \"name\": \"HeadTop_End\",\n            \"translation\": [\n                -2.66453525910038e-15,\n                17.8367767333984,\n                -4.03896783473158e-28\n            ],\n            \"rotation\": [\n                0.0,\n                0.0,\n                1.76324152623343e-37,\n                1.0\n            ],\n            \"scale\": [\n                1.0,\n                1.0,\n                1.0\n            ]\n        },\n        {\n            \"name\": \"RightEye\",\n            \"translation\": [\n                -6.14273977279663,\n                6.2331337928772,\n                13.0336484909058\n            ],\n            \"rotation\": [\n                -6.938892249546e-18,\n                -1.36491360355013e-20,\n                0.00379808945581317,\n                0.999992787837982\n            ],\n            \"scale\": [\n                1.0,\n                1.0,\n                1.0\n            ]\n        },\n        {\n            \"name\": \"LeftEye\",\n            \"translation\": [\n                6.14274263381958,\n                6.2331337928772,\n                13.0336484909058\n            ],\n            \"rotation\": [\n                -6.938892249546e-18,\n                -1.36491360355013e-20,\n                0.00379808945581317,\n                0.999992787837982\n            ],\n            \"scale\": [\n                1.0,\n                1.0,\n                1.0\n            ]\n        },\n        {\n            \"name\": \"Bot_Skinned\",\n            \"translation\": [\n                0.0,\n                0.0,\n                0.0\n            ],\n            \"rotation\": [\n                0.0,\n                0.0,\n                0.0,\n                1.0\n            ],\n            \"scale\": [\n                0.00999999977648258,\n                0.00999999977648258,\n                0.00999999977648258\n            ],\n            \"mesh\": 0,\n            \"skin\": 0\n        }\n    ]\n}"
  },
  {
    "path": "examples/resources/models/gltf/CesiumMan/README.md",
    "content": "# Cesium Man\n## Screenshot\n\n![screenshot](screenshot/screenshot.gif)\n\n## License Information\n\nDonated by Cesium for glTF testing.  Please follow the [Cesium Trademark Terms and Conditions](https://github.com/AnalyticalGraphicsInc/cesium/wiki/CesiumTrademark.pdf).\n"
  },
  {
    "path": "examples/resources/models/gltf/CesiumMan/glTF/CesiumMan.gltf",
    "content": "{\n    \"asset\": {\n        \"generator\": \"COLLADA2GLTF\",\n        \"version\": \"2.0\"\n    },\n    \"scene\": 0,\n    \"scenes\": [\n        {\n            \"nodes\": [\n                0\n            ]\n        }\n    ],\n    \"nodes\": [\n        {\n            \"children\": [\n                21,\n                1\n            ],\n            \"matrix\": [\n                1.0,\n                0.0,\n                0.0,\n                0.0,\n                0.0,\n                0.0,\n                -1.0,\n                0.0,\n                0.0,\n                1.0,\n                0.0,\n                0.0,\n                0.0,\n                0.0,\n                0.0,\n                1.0\n            ]\n        },\n        {\n            \"mesh\": 0,\n            \"skin\": 0\n        },\n        {\n            \"children\": [\n                11,\n                7,\n                3\n            ],\n            \"translation\": [\n                -3.352759847530251e-8,\n                0.00499989278614521,\n                0.6789997816085815\n            ],\n            \"rotation\": [\n                -0.02679471485316753,\n                -0.026732556521892549,\n                -0.7065614461898804,\n                -0.706638753414154\n            ],\n            \"scale\": [\n                0.9999999403953552,\n                0.9999998211860656,\n                0.9999999403953552\n            ]\n        },\n        {\n            \"children\": [\n                4\n            ],\n            \"translation\": [\n                -0.06804201006889343,\n                -0.02857022918760777,\n                -0.06294959783554077\n            ],\n            \"rotation\": [\n                -0.06642699986696243,\n                -0.6115013957023621,\n                0.7850273251533508,\n                0.073387511074543\n            ],\n            \"scale\": [\n                0.9999999403953552,\n                1.000000238418579,\n                1.0\n            ]\n        },\n        {\n            \"children\": [\n                5\n            ],\n            \"translation\": [\n                0.0,\n                0.2661114931106568,\n                0.0\n            ],\n            \"rotation\": [\n                0.2162912338972092,\n                0.12430649250745774,\n                0.0015752052422612906,\n                -0.9683818817138672\n            ],\n            \"scale\": [\n                1.0,\n                0.9999998807907105,\n                1.0\n            ]\n        },\n        {\n            \"children\": [\n                6\n            ],\n            \"translation\": [\n                0.0,\n                0.2758249044418335,\n                -1.1175900205273593e-8\n            ],\n            \"rotation\": [\n                0.8472740650177002,\n                -0.029564039781689645,\n                -0.020868001505732538,\n                -0.5299217700958252\n            ],\n            \"scale\": [\n                0.9999999403953552,\n                0.9999998807907105,\n                1.0\n            ]\n        },\n        {\n            \"translation\": [\n                -0.001458480954170227,\n                -0.06619883328676224,\n                0.027856720611453058\n            ],\n            \"rotation\": [\n                -0.03726436197757721,\n                -0.31931325793266299,\n                0.9460535645484924,\n                -0.040414959192276\n            ],\n            \"scale\": [\n                1.0,\n                1.0000003576278689,\n                1.0000005960464478\n            ]\n        },\n        {\n            \"children\": [\n                8\n            ],\n            \"translation\": [\n                0.06803668290376663,\n                -0.028518669307231904,\n                -0.06296277046203613\n            ],\n            \"rotation\": [\n                0.2475697100162506,\n                -0.5775680541992188,\n                0.7479144334793091,\n                -0.2138892114162445\n            ],\n            \"scale\": [\n                1.0,\n                1.000000238418579,\n                1.0000001192092896\n            ]\n        },\n        {\n            \"children\": [\n                9\n            ],\n            \"translation\": [\n                3.725289854372704e-9,\n                0.2661128044128418,\n                1.4901200273698124e-8\n            ],\n            \"rotation\": [\n                0.20902779698371888,\n                -0.32988959550857546,\n                -0.05559924244880676,\n                -0.9189064502716065\n            ],\n            \"scale\": [\n                1.0,\n                1.0000001192092896,\n                1.0000001192092896\n            ]\n        },\n        {\n            \"children\": [\n                10\n            ],\n            \"translation\": [\n                -7.450579708745408e-9,\n                0.2758241891860962,\n                5.5879398885849708e-9\n            ],\n            \"rotation\": [\n                0.8477396965026856,\n                -0.004254077095538378,\n                -0.009491981938481333,\n                -0.5303107500076294\n            ],\n            \"scale\": [\n                0.9999998807907105,\n                1.0000001192092896,\n                1.0000001192092896\n            ]\n        },\n        {\n            \"translation\": [\n                -0.002346522873267532,\n                -0.06617332994937897,\n                0.027856789529323576\n            ],\n            \"rotation\": [\n                0.026573536917567254,\n                -0.3201442956924439,\n                0.9445450901985169,\n                0.06808964908123017\n            ],\n            \"scale\": [\n                1.0,\n                1.000000238418579,\n                1.000000238418579\n            ]\n        },\n        {\n            \"children\": [\n                12\n            ],\n            \"translation\": [\n                -1.024449947095718e-8,\n                1.4901200273698124e-8,\n                0.14541690051555634\n            ],\n            \"rotation\": [\n                -0.6572523713111877,\n                -0.00017969288455788046,\n                -0.00010428009409224616,\n                -0.7536706328392029\n            ],\n            \"scale\": [\n                1.0,\n                1.0,\n                1.0000001192092896\n            ]\n        },\n        {\n            \"children\": [\n                19,\n                16,\n                13\n            ],\n            \"translation\": [\n                4.6566100975198307e-10,\n                0.250516802072525,\n                3.725289854372704e-9\n            ],\n            \"rotation\": [\n                0.6226037740707398,\n                0.00001678345142863691,\n                -0.0000031824047255213374,\n                -0.7825372219085693\n            ],\n            \"scale\": [\n                1.0,\n                1.0,\n                0.9999999403953552\n            ]\n        },\n        {\n            \"children\": [\n                14\n            ],\n            \"translation\": [\n                -0.09098775684833528,\n                0.00006259980000322685,\n                -0.00006532669794978574\n            ],\n            \"rotation\": [\n                0.2964428961277008,\n                0.031510334461927417,\n                -0.6522551774978638,\n                -0.6969160437583923\n            ],\n            \"scale\": [\n                1.0000001192092896,\n                0.9999999403953552,\n                1.0000001192092896\n            ]\n        },\n        {\n            \"children\": [\n                15\n            ],\n            \"translation\": [\n                0.0,\n                0.24200820922851566,\n                -5.96045985901128e-8\n            ],\n            \"rotation\": [\n                -0.1887933611869812,\n                0.9157071709632874,\n                -0.16780903935432438,\n                -0.3125341236591339\n            ],\n            \"scale\": [\n                0.9999999403953552,\n                0.9999999403953552,\n                0.9999998807907105\n            ]\n        },\n        {\n            \"translation\": [\n                0.0,\n                0.18779200315475465,\n                0.0\n            ],\n            \"rotation\": [\n                -0.058613914996385577,\n                0.2637767195701599,\n                0.05226854607462883,\n                -0.9613814353942872\n            ],\n            \"scale\": [\n                1.0,\n                1.0000001192092896,\n                0.9999999403953552\n            ]\n        },\n        {\n            \"children\": [\n                17\n            ],\n            \"translation\": [\n                0.0910135880112648,\n                0.000014185899999574758,\n                -0.000058054902183357629\n            ],\n            \"rotation\": [\n                0.6797328591346741,\n                0.689685583114624,\n                -0.2269716113805771,\n                -0.10383165627717972\n            ],\n            \"scale\": [\n                1.0000001192092896,\n                1.0000001192092896,\n                1.0\n            ]\n        },\n        {\n            \"children\": [\n                18\n            ],\n            \"translation\": [\n                1.1641500263781524e-10,\n                0.2420089989900589,\n                0.0\n            ],\n            \"rotation\": [\n                -0.013960935175418854,\n                -0.12937255203723908,\n                -0.2522056996822357,\n                -0.9588848352432252\n            ],\n            \"scale\": [\n                1.0,\n                0.9999999403953552,\n                1.0\n            ]\n        },\n        {\n            \"translation\": [\n                1.4901200273698124e-8,\n                0.18779149651527408,\n                5.96045985901128e-8\n            ],\n            \"rotation\": [\n                0.006119169760495424,\n                -0.042325541377067569,\n                -0.07877591997385025,\n                -0.9959746599197388\n            ],\n            \"scale\": [\n                0.9999998807907105,\n                1.000000238418579,\n                0.9999999403953552\n            ]\n        },\n        {\n            \"children\": [\n                20\n            ],\n            \"translation\": [\n                -8.847560017954948e-9,\n                5.96045985901128e-8,\n                0.06483662128448487\n            ],\n            \"rotation\": [\n                -0.6606296300888062,\n                0.00008344435627805069,\n                0.0000710925814928487,\n                -0.750711977481842\n            ]\n        },\n        {\n            \"translation\": [\n                0.0,\n                0.0520397387444973,\n                0.0\n            ],\n            \"rotation\": [\n                0.000002552607384131989,\n                0.9996904730796814,\n                -0.02487966977059841,\n                -4.329927776325349e-7\n            ],\n            \"scale\": [\n                1.0,\n                1.0000001192092896,\n                1.0\n            ]\n        },\n        {\n            \"children\": [\n                2\n            ]\n        }\n    ],\n    \"meshes\": [\n        {\n            \"primitives\": [\n                {\n                    \"attributes\": {\n                        \"JOINTS_0\": 1,\n                        \"NORMAL\": 2,\n                        \"POSITION\": 3,\n                        \"TEXCOORD_0\": 4,\n                        \"WEIGHTS_0\": 5\n                    },\n                    \"indices\": 0,\n                    \"mode\": 4,\n                    \"material\": 0\n                }\n            ],\n            \"name\": \"Cesium_Man\"\n        }\n    ],\n    \"animations\": [\n        {\n            \"channels\": [\n                {\n                    \"sampler\": 0,\n                    \"target\": {\n                        \"node\": 2,\n                        \"path\": \"translation\"\n                    }\n                },\n                {\n                    \"sampler\": 1,\n                    \"target\": {\n                        \"node\": 2,\n                        \"path\": \"rotation\"\n                    }\n                },\n                {\n                    \"sampler\": 2,\n                    \"target\": {\n                        \"node\": 2,\n                        \"path\": \"scale\"\n                    }\n                }\n            ],\n            \"samplers\": [\n                {\n                    \"input\": 6,\n                    \"interpolation\": \"LINEAR\",\n                    \"output\": 7\n                },\n                {\n                    \"input\": 6,\n                    \"interpolation\": \"LINEAR\",\n                    \"output\": 8\n                },\n                {\n                    \"input\": 6,\n                    \"interpolation\": \"LINEAR\",\n                    \"output\": 9\n                }\n            ]\n        },\n        {\n            \"channels\": [\n                {\n                    \"sampler\": 0,\n                    \"target\": {\n                        \"node\": 11,\n                        \"path\": \"translation\"\n                    }\n                },\n                {\n                    \"sampler\": 1,\n                    \"target\": {\n                        \"node\": 11,\n                        \"path\": \"rotation\"\n                    }\n                },\n                {\n                    \"sampler\": 2,\n                    \"target\": {\n                        \"node\": 11,\n                        \"path\": \"scale\"\n                    }\n                }\n            ],\n            \"samplers\": [\n                {\n                    \"input\": 10,\n                    \"interpolation\": \"LINEAR\",\n                    \"output\": 11\n                },\n                {\n                    \"input\": 10,\n                    \"interpolation\": \"LINEAR\",\n                    \"output\": 12\n                },\n                {\n                    \"input\": 10,\n                    \"interpolation\": \"LINEAR\",\n                    \"output\": 13\n                }\n            ]\n        },\n        {\n            \"channels\": [\n                {\n                    \"sampler\": 0,\n                    \"target\": {\n                        \"node\": 12,\n                        \"path\": \"translation\"\n                    }\n                },\n                {\n                    \"sampler\": 1,\n                    \"target\": {\n                        \"node\": 12,\n                        \"path\": \"rotation\"\n                    }\n                },\n                {\n                    \"sampler\": 2,\n                    \"target\": {\n                        \"node\": 12,\n                        \"path\": \"scale\"\n                    }\n                }\n            ],\n            \"samplers\": [\n                {\n                    \"input\": 14,\n                    \"interpolation\": \"LINEAR\",\n                    \"output\": 15\n                },\n                {\n                    \"input\": 14,\n                    \"interpolation\": \"LINEAR\",\n                    \"output\": 16\n                },\n                {\n                    \"input\": 14,\n                    \"interpolation\": \"LINEAR\",\n                    \"output\": 17\n                }\n            ]\n        },\n        {\n            \"channels\": [\n                {\n                    \"sampler\": 0,\n                    \"target\": {\n                        \"node\": 19,\n                        \"path\": \"translation\"\n                    }\n                },\n                {\n                    \"sampler\": 1,\n                    \"target\": {\n                        \"node\": 19,\n                        \"path\": \"rotation\"\n                    }\n                },\n                {\n                    \"sampler\": 2,\n                    \"target\": {\n                        \"node\": 19,\n                        \"path\": \"scale\"\n                    }\n                }\n            ],\n            \"samplers\": [\n                {\n                    \"input\": 18,\n                    \"interpolation\": \"LINEAR\",\n                    \"output\": 19\n                },\n                {\n                    \"input\": 18,\n                    \"interpolation\": \"LINEAR\",\n                    \"output\": 20\n                },\n                {\n                    \"input\": 18,\n                    \"interpolation\": \"LINEAR\",\n                    \"output\": 21\n                }\n            ]\n        },\n        {\n            \"channels\": [\n                {\n                    \"sampler\": 0,\n                    \"target\": {\n                        \"node\": 20,\n                        \"path\": \"translation\"\n                    }\n                },\n                {\n                    \"sampler\": 1,\n                    \"target\": {\n                        \"node\": 20,\n                        \"path\": \"rotation\"\n                    }\n                },\n                {\n                    \"sampler\": 2,\n                    \"target\": {\n                        \"node\": 20,\n                        \"path\": \"scale\"\n                    }\n                }\n            ],\n            \"samplers\": [\n                {\n                    \"input\": 22,\n                    \"interpolation\": \"LINEAR\",\n                    \"output\": 23\n                },\n                {\n                    \"input\": 22,\n                    \"interpolation\": \"LINEAR\",\n                    \"output\": 24\n                },\n                {\n                    \"input\": 22,\n                    \"interpolation\": \"LINEAR\",\n                    \"output\": 25\n                }\n            ]\n        },\n        {\n            \"channels\": [\n                {\n                    \"sampler\": 0,\n                    \"target\": {\n                        \"node\": 16,\n                        \"path\": \"translation\"\n                    }\n                },\n                {\n                    \"sampler\": 1,\n                    \"target\": {\n                        \"node\": 16,\n                        \"path\": \"rotation\"\n                    }\n                },\n                {\n                    \"sampler\": 2,\n                    \"target\": {\n                        \"node\": 16,\n                        \"path\": \"scale\"\n                    }\n                }\n            ],\n            \"samplers\": [\n                {\n                    \"input\": 26,\n                    \"interpolation\": \"LINEAR\",\n                    \"output\": 27\n                },\n                {\n                    \"input\": 26,\n                    \"interpolation\": \"LINEAR\",\n                    \"output\": 28\n                },\n                {\n                    \"input\": 26,\n                    \"interpolation\": \"LINEAR\",\n                    \"output\": 29\n                }\n            ]\n        },\n        {\n            \"channels\": [\n                {\n                    \"sampler\": 0,\n                    \"target\": {\n                        \"node\": 17,\n                        \"path\": \"translation\"\n                    }\n                },\n                {\n                    \"sampler\": 1,\n                    \"target\": {\n                        \"node\": 17,\n                        \"path\": \"rotation\"\n                    }\n                },\n                {\n                    \"sampler\": 2,\n                    \"target\": {\n                        \"node\": 17,\n                        \"path\": \"scale\"\n                    }\n                }\n            ],\n            \"samplers\": [\n                {\n                    \"input\": 30,\n                    \"interpolation\": \"LINEAR\",\n                    \"output\": 31\n                },\n                {\n                    \"input\": 30,\n                    \"interpolation\": \"LINEAR\",\n                    \"output\": 32\n                },\n                {\n                    \"input\": 30,\n                    \"interpolation\": \"LINEAR\",\n                    \"output\": 33\n                }\n            ]\n        },\n        {\n            \"channels\": [\n                {\n                    \"sampler\": 0,\n                    \"target\": {\n                        \"node\": 18,\n                        \"path\": \"translation\"\n                    }\n                },\n                {\n                    \"sampler\": 1,\n                    \"target\": {\n                        \"node\": 18,\n                        \"path\": \"rotation\"\n                    }\n                },\n                {\n                    \"sampler\": 2,\n                    \"target\": {\n                        \"node\": 18,\n                        \"path\": \"scale\"\n                    }\n                }\n            ],\n            \"samplers\": [\n                {\n                    \"input\": 34,\n                    \"interpolation\": \"LINEAR\",\n                    \"output\": 35\n                },\n                {\n                    \"input\": 34,\n                    \"interpolation\": \"LINEAR\",\n                    \"output\": 36\n                },\n                {\n                    \"input\": 34,\n                    \"interpolation\": \"LINEAR\",\n                    \"output\": 37\n                }\n            ]\n        },\n        {\n            \"channels\": [\n                {\n                    \"sampler\": 0,\n                    \"target\": {\n                        \"node\": 13,\n                        \"path\": \"translation\"\n                    }\n                },\n                {\n                    \"sampler\": 1,\n                    \"target\": {\n                        \"node\": 13,\n                        \"path\": \"rotation\"\n                    }\n                },\n                {\n                    \"sampler\": 2,\n                    \"target\": {\n                        \"node\": 13,\n                        \"path\": \"scale\"\n                    }\n                }\n            ],\n            \"samplers\": [\n                {\n                    \"input\": 38,\n                    \"interpolation\": \"LINEAR\",\n                    \"output\": 39\n                },\n                {\n                    \"input\": 38,\n                    \"interpolation\": \"LINEAR\",\n                    \"output\": 40\n                },\n                {\n                    \"input\": 38,\n                    \"interpolation\": \"LINEAR\",\n                    \"output\": 41\n                }\n            ]\n        },\n        {\n            \"channels\": [\n                {\n                    \"sampler\": 0,\n                    \"target\": {\n                        \"node\": 14,\n                        \"path\": \"translation\"\n                    }\n                },\n                {\n                    \"sampler\": 1,\n                    \"target\": {\n                        \"node\": 14,\n                        \"path\": \"rotation\"\n                    }\n                },\n                {\n                    \"sampler\": 2,\n                    \"target\": {\n                        \"node\": 14,\n                        \"path\": \"scale\"\n                    }\n                }\n            ],\n            \"samplers\": [\n                {\n                    \"input\": 42,\n                    \"interpolation\": \"LINEAR\",\n                    \"output\": 43\n                },\n                {\n                    \"input\": 42,\n                    \"interpolation\": \"LINEAR\",\n                    \"output\": 44\n                },\n                {\n                    \"input\": 42,\n                    \"interpolation\": \"LINEAR\",\n                    \"output\": 45\n                }\n            ]\n        },\n        {\n            \"channels\": [\n                {\n                    \"sampler\": 0,\n                    \"target\": {\n                        \"node\": 15,\n                        \"path\": \"translation\"\n                    }\n                },\n                {\n                    \"sampler\": 1,\n                    \"target\": {\n                        \"node\": 15,\n                        \"path\": \"rotation\"\n                    }\n                },\n                {\n                    \"sampler\": 2,\n                    \"target\": {\n                        \"node\": 15,\n                        \"path\": \"scale\"\n                    }\n                }\n            ],\n            \"samplers\": [\n                {\n                    \"input\": 46,\n                    \"interpolation\": \"LINEAR\",\n                    \"output\": 47\n                },\n                {\n                    \"input\": 46,\n                    \"interpolation\": \"LINEAR\",\n                    \"output\": 48\n                },\n                {\n                    \"input\": 46,\n                    \"interpolation\": \"LINEAR\",\n                    \"output\": 49\n                }\n            ]\n        },\n        {\n            \"channels\": [\n                {\n                    \"sampler\": 0,\n                    \"target\": {\n                        \"node\": 7,\n                        \"path\": \"translation\"\n                    }\n                },\n                {\n                    \"sampler\": 1,\n                    \"target\": {\n                        \"node\": 7,\n                        \"path\": \"rotation\"\n                    }\n                },\n                {\n                    \"sampler\": 2,\n                    \"target\": {\n                        \"node\": 7,\n                        \"path\": \"scale\"\n                    }\n                }\n            ],\n            \"samplers\": [\n                {\n                    \"input\": 50,\n                    \"interpolation\": \"LINEAR\",\n                    \"output\": 51\n                },\n                {\n                    \"input\": 50,\n                    \"interpolation\": \"LINEAR\",\n                    \"output\": 52\n                },\n                {\n                    \"input\": 50,\n                    \"interpolation\": \"LINEAR\",\n                    \"output\": 53\n                }\n            ]\n        },\n        {\n            \"channels\": [\n                {\n                    \"sampler\": 0,\n                    \"target\": {\n                        \"node\": 8,\n                        \"path\": \"translation\"\n                    }\n                },\n                {\n                    \"sampler\": 1,\n                    \"target\": {\n                        \"node\": 8,\n                        \"path\": \"rotation\"\n                    }\n                },\n                {\n                    \"sampler\": 2,\n                    \"target\": {\n                        \"node\": 8,\n                        \"path\": \"scale\"\n                    }\n                }\n            ],\n            \"samplers\": [\n                {\n                    \"input\": 54,\n                    \"interpolation\": \"LINEAR\",\n                    \"output\": 55\n                },\n                {\n                    \"input\": 54,\n                    \"interpolation\": \"LINEAR\",\n                    \"output\": 56\n                },\n                {\n                    \"input\": 54,\n                    \"interpolation\": \"LINEAR\",\n                    \"output\": 57\n                }\n            ]\n        },\n        {\n            \"channels\": [\n                {\n                    \"sampler\": 0,\n                    \"target\": {\n                        \"node\": 9,\n                        \"path\": \"translation\"\n                    }\n                },\n                {\n                    \"sampler\": 1,\n                    \"target\": {\n                        \"node\": 9,\n                        \"path\": \"rotation\"\n                    }\n                },\n                {\n                    \"sampler\": 2,\n                    \"target\": {\n                        \"node\": 9,\n                        \"path\": \"scale\"\n                    }\n                }\n            ],\n            \"samplers\": [\n                {\n                    \"input\": 58,\n                    \"interpolation\": \"LINEAR\",\n                    \"output\": 59\n                },\n                {\n                    \"input\": 58,\n                    \"interpolation\": \"LINEAR\",\n                    \"output\": 60\n                },\n                {\n                    \"input\": 58,\n                    \"interpolation\": \"LINEAR\",\n                    \"output\": 61\n                }\n            ]\n        },\n        {\n            \"channels\": [\n                {\n                    \"sampler\": 0,\n                    \"target\": {\n                        \"node\": 10,\n                        \"path\": \"translation\"\n                    }\n                },\n                {\n                    \"sampler\": 1,\n                    \"target\": {\n                        \"node\": 10,\n                        \"path\": \"rotation\"\n                    }\n                },\n                {\n                    \"sampler\": 2,\n                    \"target\": {\n                        \"node\": 10,\n                        \"path\": \"scale\"\n                    }\n                }\n            ],\n            \"samplers\": [\n                {\n                    \"input\": 62,\n                    \"interpolation\": \"LINEAR\",\n                    \"output\": 63\n                },\n                {\n                    \"input\": 62,\n                    \"interpolation\": \"LINEAR\",\n                    \"output\": 64\n                },\n                {\n                    \"input\": 62,\n                    \"interpolation\": \"LINEAR\",\n                    \"output\": 65\n                }\n            ]\n        },\n        {\n            \"channels\": [\n                {\n                    \"sampler\": 0,\n                    \"target\": {\n                        \"node\": 3,\n                        \"path\": \"translation\"\n                    }\n                },\n                {\n                    \"sampler\": 1,\n                    \"target\": {\n                        \"node\": 3,\n                        \"path\": \"rotation\"\n                    }\n                },\n                {\n                    \"sampler\": 2,\n                    \"target\": {\n                        \"node\": 3,\n                        \"path\": \"scale\"\n                    }\n                }\n            ],\n            \"samplers\": [\n                {\n                    \"input\": 66,\n                    \"interpolation\": \"LINEAR\",\n                    \"output\": 67\n                },\n                {\n                    \"input\": 66,\n                    \"interpolation\": \"LINEAR\",\n                    \"output\": 68\n                },\n                {\n                    \"input\": 66,\n                    \"interpolation\": \"LINEAR\",\n                    \"output\": 69\n                }\n            ]\n        },\n        {\n            \"channels\": [\n                {\n                    \"sampler\": 0,\n                    \"target\": {\n                        \"node\": 4,\n                        \"path\": \"translation\"\n                    }\n                },\n                {\n                    \"sampler\": 1,\n                    \"target\": {\n                        \"node\": 4,\n                        \"path\": \"rotation\"\n                    }\n                },\n                {\n                    \"sampler\": 2,\n                    \"target\": {\n                        \"node\": 4,\n                        \"path\": \"scale\"\n                    }\n                }\n            ],\n            \"samplers\": [\n                {\n                    \"input\": 70,\n                    \"interpolation\": \"LINEAR\",\n                    \"output\": 71\n                },\n                {\n                    \"input\": 70,\n                    \"interpolation\": \"LINEAR\",\n                    \"output\": 72\n                },\n                {\n                    \"input\": 70,\n                    \"interpolation\": \"LINEAR\",\n                    \"output\": 73\n                }\n            ]\n        },\n        {\n            \"channels\": [\n                {\n                    \"sampler\": 0,\n                    \"target\": {\n                        \"node\": 5,\n                        \"path\": \"translation\"\n                    }\n                },\n                {\n                    \"sampler\": 1,\n                    \"target\": {\n                        \"node\": 5,\n                        \"path\": \"rotation\"\n                    }\n                },\n                {\n                    \"sampler\": 2,\n                    \"target\": {\n                        \"node\": 5,\n                        \"path\": \"scale\"\n                    }\n                }\n            ],\n            \"samplers\": [\n                {\n                    \"input\": 74,\n                    \"interpolation\": \"LINEAR\",\n                    \"output\": 75\n                },\n                {\n                    \"input\": 74,\n                    \"interpolation\": \"LINEAR\",\n                    \"output\": 76\n                },\n                {\n                    \"input\": 74,\n                    \"interpolation\": \"LINEAR\",\n                    \"output\": 77\n                }\n            ]\n        },\n        {\n            \"channels\": [\n                {\n                    \"sampler\": 0,\n                    \"target\": {\n                        \"node\": 6,\n                        \"path\": \"translation\"\n                    }\n                },\n                {\n                    \"sampler\": 1,\n                    \"target\": {\n                        \"node\": 6,\n                        \"path\": \"rotation\"\n                    }\n                },\n                {\n                    \"sampler\": 2,\n                    \"target\": {\n                        \"node\": 6,\n                        \"path\": \"scale\"\n                    }\n                }\n            ],\n            \"samplers\": [\n                {\n                    \"input\": 78,\n                    \"interpolation\": \"LINEAR\",\n                    \"output\": 79\n                },\n                {\n                    \"input\": 78,\n                    \"interpolation\": \"LINEAR\",\n                    \"output\": 80\n                },\n                {\n                    \"input\": 78,\n                    \"interpolation\": \"LINEAR\",\n                    \"output\": 81\n                }\n            ]\n        }\n    ],\n    \"skins\": [\n        {\n            \"inverseBindMatrices\": 82,\n            \"skeleton\": 2,\n            \"joints\": [\n                2,\n                11,\n                12,\n                19,\n                20,\n                16,\n                13,\n                17,\n                14,\n                18,\n                15,\n                7,\n                3,\n                8,\n                4,\n                9,\n                5,\n                10,\n                6\n            ],\n            \"name\": \"Armature\"\n        }\n    ],\n    \"accessors\": [\n        {\n            \"bufferView\": 0,\n            \"byteOffset\": 0,\n            \"componentType\": 5123,\n            \"count\": 14016,\n            \"max\": [\n                3272\n            ],\n            \"min\": [\n                0\n            ],\n            \"type\": \"SCALAR\"\n        },\n        {\n            \"bufferView\": 1,\n            \"byteOffset\": 0,\n            \"componentType\": 5123,\n            \"count\": 3273,\n            \"max\": [\n                18,\n                18,\n                18,\n                18\n            ],\n            \"min\": [\n                0,\n                0,\n                0,\n                0\n            ],\n            \"type\": \"VEC4\"\n        },\n        {\n            \"bufferView\": 2,\n            \"byteOffset\": 0,\n            \"componentType\": 5126,\n            \"count\": 3273,\n            \"max\": [\n                1.0,\n                0.9999808073043824,\n                0.9944446086883544\n            ],\n            \"min\": [\n                -1.0,\n                -0.9999808073043824,\n                -1.0\n            ],\n            \"type\": \"VEC3\"\n        },\n        {\n            \"bufferView\": 2,\n            \"byteOffset\": 39276,\n            \"componentType\": 5126,\n            \"count\": 3273,\n            \"max\": [\n                0.1809539943933487,\n                0.569136917591095,\n                1.5065499544143677\n            ],\n            \"min\": [\n                -0.13100001215934754,\n                -0.5691370964050293,\n                0.0\n            ],\n            \"type\": \"VEC3\"\n        },\n        {\n            \"bufferView\": 1,\n            \"byteOffset\": 26184,\n            \"componentType\": 5126,\n            \"count\": 3273,\n            \"max\": [\n                0.990805983543396,\n                0.9880298972129822\n            ],\n            \"min\": [\n                0.014079390093684197,\n                0.008445978164672852\n            ],\n            \"type\": \"VEC2\"\n        },\n        {\n            \"bufferView\": 3,\n            \"byteOffset\": 0,\n            \"componentType\": 5126,\n            \"count\": 3273,\n            \"max\": [\n                1.0,\n                0.989919900894165,\n                0.951076328754425,\n                0.8741077184677124\n            ],\n            \"min\": [\n                0.010080150328576565,\n                0.0,\n                0.0,\n                0.0\n            ],\n            \"type\": \"VEC4\"\n        },\n        {\n            \"bufferView\": 4,\n            \"byteOffset\": 0,\n            \"componentType\": 5126,\n            \"count\": 49,\n            \"max\": [\n                2.0\n            ],\n            \"min\": [\n                0.0\n            ],\n            \"type\": \"SCALAR\"\n        },\n        {\n            \"bufferView\": 5,\n            \"byteOffset\": 0,\n            \"componentType\": 5126,\n            \"count\": 49,\n            \"max\": [\n                2.386510011831433e-8,\n                -0.02000010944902897,\n                0.7110069990158081\n            ],\n            \"min\": [\n                -7.101329746461715e-9,\n                -0.030000120401382448,\n                0.6399999856948853\n            ],\n            \"type\": \"VEC3\"\n        },\n        {\n            \"bufferView\": 6,\n            \"byteOffset\": 0,\n            \"componentType\": 5126,\n            \"count\": 49,\n            \"max\": [\n                -0.02314124070107937,\n                -0.006974140647798777,\n                -0.7065909504890442,\n                -0.7031946778297424\n            ],\n            \"min\": [\n                -0.05146743357181549,\n                -0.034400247037410739,\n                -0.7094300389289856,\n                -0.7066542506217957\n            ],\n            \"type\": \"VEC4\"\n        },\n        {\n            \"bufferView\": 5,\n            \"byteOffset\": 588,\n            \"componentType\": 5126,\n            \"count\": 49,\n            \"max\": [\n                1.0000001192092896,\n                1.0000003576278689,\n                1.0000001192092896\n            ],\n            \"min\": [\n                0.9999998211860656,\n                0.9999998807907105,\n                0.9999997615814208\n            ],\n            \"type\": \"VEC3\"\n        },\n        {\n            \"bufferView\": 4,\n            \"byteOffset\": 196,\n            \"componentType\": 5126,\n            \"count\": 49,\n            \"max\": [\n                2.0\n            ],\n            \"min\": [\n                0.0\n            ],\n            \"type\": \"SCALAR\"\n        },\n        {\n            \"bufferView\": 5,\n            \"byteOffset\": 1176,\n            \"componentType\": 5126,\n            \"count\": 49,\n            \"max\": [\n                0.0009999829344451428,\n                3.725289943190546e-8,\n                0.1454170048236847\n            ],\n            \"min\": [\n                0.0009999759495258332,\n                -4.470349779239769e-8,\n                0.14541690051555634\n            ],\n            \"type\": \"VEC3\"\n        },\n        {\n            \"bufferView\": 6,\n            \"byteOffset\": 784,\n            \"componentType\": 5126,\n            \"count\": 49,\n            \"max\": [\n                -0.7105135917663574,\n                0.008397356607019902,\n                0.000531485362444073,\n                -0.6789330840110779\n            ],\n            \"min\": [\n                -0.7337970733642578,\n                -0.011321297846734524,\n                -0.02596380189061165,\n                -0.703567624092102\n            ],\n            \"type\": \"VEC4\"\n        },\n        {\n            \"bufferView\": 5,\n            \"byteOffset\": 1764,\n            \"componentType\": 5126,\n            \"count\": 49,\n            \"max\": [\n                1.0000003576278689,\n                1.0000004768371585,\n                0.999999701976776\n            ],\n            \"min\": [\n                1.0,\n                1.0000001192092896,\n                0.9999992847442628\n            ],\n            \"type\": \"VEC3\"\n        },\n        {\n            \"bufferView\": 4,\n            \"byteOffset\": 392,\n            \"componentType\": 5126,\n            \"count\": 49,\n            \"max\": [\n                2.0\n            ],\n            \"min\": [\n                0.0\n            ],\n            \"type\": \"SCALAR\"\n        },\n        {\n            \"bufferView\": 5,\n            \"byteOffset\": 2352,\n            \"componentType\": 5126,\n            \"count\": 49,\n            \"max\": [\n                0.0,\n                0.25051671266555788,\n                0.0\n            ],\n            \"min\": [\n                0.0,\n                0.25051671266555788,\n                0.0\n            ],\n            \"type\": \"VEC3\"\n        },\n        {\n            \"bufferView\": 6,\n            \"byteOffset\": 1568,\n            \"componentType\": 5126,\n            \"count\": 49,\n            \"max\": [\n                0.6358352899551392,\n                0.06165437772870064,\n                -0.00338419945910573,\n                -0.7642753720283508\n            ],\n            \"min\": [\n                0.6224426627159119,\n                -0.1380288153886795,\n                -0.06534028053283692,\n                -0.782635509967804\n            ],\n            \"type\": \"VEC4\"\n        },\n        {\n            \"bufferView\": 5,\n            \"byteOffset\": 2940,\n            \"componentType\": 5126,\n            \"count\": 49,\n            \"max\": [\n                1.0000001192092896,\n                1.0000007152557374,\n                0.999999701976776\n            ],\n            \"min\": [\n                0.9999998211860656,\n                1.0000003576278689,\n                0.9999992847442628\n            ],\n            \"type\": \"VEC3\"\n        },\n        {\n            \"bufferView\": 4,\n            \"byteOffset\": 588,\n            \"componentType\": 5126,\n            \"count\": 49,\n            \"max\": [\n                2.0\n            ],\n            \"min\": [\n                0.0\n            ],\n            \"type\": \"SCALAR\"\n        },\n        {\n            \"bufferView\": 5,\n            \"byteOffset\": 3528,\n            \"componentType\": 5126,\n            \"count\": 49,\n            \"max\": [\n                2.1420399676230774e-8,\n                8.940700269022274e-8,\n                0.064838707447052\n            ],\n            \"min\": [\n                -1.5832499755674694e-8,\n                2.98022992950564e-8,\n                0.06483834981918335\n            ],\n            \"type\": \"VEC3\"\n        },\n        {\n            \"bufferView\": 6,\n            \"byteOffset\": 2352,\n            \"componentType\": 5126,\n            \"count\": 49,\n            \"max\": [\n                -0.6325308680534363,\n                0.024829493835568429,\n                0.04200226813554764,\n                -0.7498575448989868\n            ],\n            \"min\": [\n                -0.6592774987220764,\n                -0.03641732409596443,\n                -0.03000717982649803,\n                -0.7735550999641419\n            ],\n            \"type\": \"VEC4\"\n        },\n        {\n            \"bufferView\": 5,\n            \"byteOffset\": 4116,\n            \"componentType\": 5126,\n            \"count\": 49,\n            \"max\": [\n                1.000000238418579,\n                0.9999998807907105,\n                1.0\n            ],\n            \"min\": [\n                0.9999998211860656,\n                0.9999995231628418,\n                0.999999701976776\n            ],\n            \"type\": \"VEC3\"\n        },\n        {\n            \"bufferView\": 4,\n            \"byteOffset\": 784,\n            \"componentType\": 5126,\n            \"count\": 49,\n            \"max\": [\n                2.0\n            ],\n            \"min\": [\n                0.0\n            ],\n            \"type\": \"SCALAR\"\n        },\n        {\n            \"bufferView\": 5,\n            \"byteOffset\": 4704,\n            \"componentType\": 5126,\n            \"count\": 49,\n            \"max\": [\n                7.450579708745408e-9,\n                0.0520397387444973,\n                0.0\n            ],\n            \"min\": [\n                7.450579708745408e-9,\n                0.0520397387444973,\n                0.0\n            ],\n            \"type\": \"VEC3\"\n        },\n        {\n            \"bufferView\": 6,\n            \"byteOffset\": 3136,\n            \"componentType\": 5126,\n            \"count\": 49,\n            \"max\": [\n                0.04680429771542549,\n                0.9995073676109314,\n                -0.018450811505317689,\n                0.002033286727964878\n            ],\n            \"min\": [\n                -0.09362706542015076,\n                0.995067298412323,\n                -0.09058911353349686,\n                -0.0025854958221316339\n            ],\n            \"type\": \"VEC4\"\n        },\n        {\n            \"bufferView\": 5,\n            \"byteOffset\": 5292,\n            \"componentType\": 5126,\n            \"count\": 49,\n            \"max\": [\n                1.000000238418579,\n                1.0000001192092896,\n                1.0000004768371585\n            ],\n            \"min\": [\n                0.999999701976776,\n                0.9999998211860656,\n                1.0000001192092896\n            ],\n            \"type\": \"VEC3\"\n        },\n        {\n            \"bufferView\": 4,\n            \"byteOffset\": 980,\n            \"componentType\": 5126,\n            \"count\": 49,\n            \"max\": [\n                2.0\n            ],\n            \"min\": [\n                0.0\n            ],\n            \"type\": \"SCALAR\"\n        },\n        {\n            \"bufferView\": 5,\n            \"byteOffset\": 5880,\n            \"componentType\": 5126,\n            \"count\": 49,\n            \"max\": [\n                0.08800014853477478,\n                0.000014096500308369288,\n                -0.00005573029920924455\n            ],\n            \"min\": [\n                0.08799994736909867,\n                0.000013977300113765525,\n                -0.00005596880146185868\n            ],\n            \"type\": \"VEC3\"\n        },\n        {\n            \"bufferView\": 6,\n            \"byteOffset\": 3920,\n            \"componentType\": 5126,\n            \"count\": 49,\n            \"max\": [\n                0.7787204384803772,\n                0.6963526606559753,\n                -0.2913321256637573,\n                -0.12775331735610966\n            ],\n            \"min\": [\n                0.41440603137016299,\n                0.2682091891765595,\n                -0.6041955351829529,\n                -0.508333683013916\n            ],\n            \"type\": \"VEC4\"\n        },\n        {\n            \"bufferView\": 5,\n            \"byteOffset\": 6468,\n            \"componentType\": 5126,\n            \"count\": 49,\n            \"max\": [\n                1.0000005960464478,\n                1.0000001192092896,\n                1.0000004768371585\n            ],\n            \"min\": [\n                1.0,\n                0.9999995827674866,\n                1.0000001192092896\n            ],\n            \"type\": \"VEC3\"\n        },\n        {\n            \"bufferView\": 4,\n            \"byteOffset\": 1176,\n            \"componentType\": 5126,\n            \"count\": 49,\n            \"max\": [\n                2.0\n            ],\n            \"min\": [\n                0.0\n            ],\n            \"type\": \"SCALAR\"\n        },\n        {\n            \"bufferView\": 5,\n            \"byteOffset\": 7056,\n            \"componentType\": 5126,\n            \"count\": 49,\n            \"max\": [\n                0.0,\n                0.24200910329818729,\n                0.0\n            ],\n            \"min\": [\n                0.0,\n                0.24200910329818729,\n                0.0\n            ],\n            \"type\": \"VEC3\"\n        },\n        {\n            \"bufferView\": 6,\n            \"byteOffset\": 4704,\n            \"componentType\": 5126,\n            \"count\": 49,\n            \"max\": [\n                0.005276965908706188,\n                -0.10532382130622864,\n                -0.0563904233276844,\n                -0.9007523059844972\n            ],\n            \"min\": [\n                -0.08755125105381012,\n                -0.15304648876190186,\n                -0.4198120832443238,\n                -0.989989936351776\n            ],\n            \"type\": \"VEC4\"\n        },\n        {\n            \"bufferView\": 5,\n            \"byteOffset\": 7644,\n            \"componentType\": 5126,\n            \"count\": 49,\n            \"max\": [\n                0.9999999403953552,\n                0.9999998807907105,\n                0.9999998807907105\n            ],\n            \"min\": [\n                0.9999994039535524,\n                0.9999992847442628,\n                0.9999995231628418\n            ],\n            \"type\": \"VEC3\"\n        },\n        {\n            \"bufferView\": 4,\n            \"byteOffset\": 1372,\n            \"componentType\": 5126,\n            \"count\": 49,\n            \"max\": [\n                2.0\n            ],\n            \"min\": [\n                0.0\n            ],\n            \"type\": \"SCALAR\"\n        },\n        {\n            \"bufferView\": 5,\n            \"byteOffset\": 8232,\n            \"componentType\": 5126,\n            \"count\": 49,\n            \"max\": [\n                -2.98022992950564e-8,\n                0.18779130280017854,\n                0.0\n            ],\n            \"min\": [\n                -2.98022992950564e-8,\n                0.18779130280017854,\n                0.0\n            ],\n            \"type\": \"VEC3\"\n        },\n        {\n            \"bufferView\": 6,\n            \"byteOffset\": 5488,\n            \"componentType\": 5126,\n            \"count\": 49,\n            \"max\": [\n                0.04831664264202118,\n                -0.03682959079742432,\n                0.1515040546655655,\n                -0.9875762462615968\n            ],\n            \"min\": [\n                -0.01958325318992138,\n                -0.043389420956373218,\n                -0.0806758776307106,\n                -0.9989553689956664\n            ],\n            \"type\": \"VEC4\"\n        },\n        {\n            \"bufferView\": 5,\n            \"byteOffset\": 8820,\n            \"componentType\": 5126,\n            \"count\": 49,\n            \"max\": [\n                1.000000238418579,\n                1.0000009536743165,\n                1.0000005960464478\n            ],\n            \"min\": [\n                0.999999701976776,\n                1.0000005960464478,\n                1.000000238418579\n            ],\n            \"type\": \"VEC3\"\n        },\n        {\n            \"bufferView\": 4,\n            \"byteOffset\": 1568,\n            \"componentType\": 5126,\n            \"count\": 49,\n            \"max\": [\n                2.0\n            ],\n            \"min\": [\n                0.0\n            ],\n            \"type\": \"SCALAR\"\n        },\n        {\n            \"bufferView\": 5,\n            \"byteOffset\": 9408,\n            \"componentType\": 5126,\n            \"count\": 49,\n            \"max\": [\n                -0.0879998505115509,\n                0.00006264450348680839,\n                -0.00006240609945962206\n            ],\n            \"min\": [\n                -0.0880001038312912,\n                0.00006249549915082753,\n                -0.00006282330286921933\n            ],\n            \"type\": \"VEC3\"\n        },\n        {\n            \"bufferView\": 6,\n            \"byteOffset\": 6272,\n            \"componentType\": 5126,\n            \"count\": 49,\n            \"max\": [\n                0.6748494505882263,\n                0.3152157068252564,\n                -0.300369679927826,\n                -0.3483264744281769\n            ],\n            \"min\": [\n                0.3661315143108368,\n                0.09874838590621948,\n                -0.6449660658836365,\n                -0.8451733589172363\n            ],\n            \"type\": \"VEC4\"\n        },\n        {\n            \"bufferView\": 5,\n            \"byteOffset\": 9996,\n            \"componentType\": 5126,\n            \"count\": 49,\n            \"max\": [\n                1.0000001192092896,\n                1.0000001192092896,\n                1.0\n            ],\n            \"min\": [\n                0.9999997615814208,\n                0.9999996423721314,\n                0.999999701976776\n            ],\n            \"type\": \"VEC3\"\n        },\n        {\n            \"bufferView\": 4,\n            \"byteOffset\": 1764,\n            \"componentType\": 5126,\n            \"count\": 49,\n            \"max\": [\n                2.0\n            ],\n            \"min\": [\n                0.0\n            ],\n            \"type\": \"SCALAR\"\n        },\n        {\n            \"bufferView\": 5,\n            \"byteOffset\": 10584,\n            \"componentType\": 5126,\n            \"count\": 49,\n            \"max\": [\n                0.0,\n                0.24200810492038728,\n                0.0\n            ],\n            \"min\": [\n                0.0,\n                0.24200810492038728,\n                0.0\n            ],\n            \"type\": \"VEC3\"\n        },\n        {\n            \"bufferView\": 6,\n            \"byteOffset\": 7056,\n            \"componentType\": 5126,\n            \"count\": 49,\n            \"max\": [\n                -0.003387797623872757,\n                0.9475951790809633,\n                -0.0798693522810936,\n                -0.3012830018997193\n            ],\n            \"min\": [\n                -0.12710869312286378,\n                0.916045308113098,\n                -0.2270231395959854,\n                -0.3146948218345642\n            ],\n            \"type\": \"VEC4\"\n        },\n        {\n            \"bufferView\": 5,\n            \"byteOffset\": 11172,\n            \"componentType\": 5126,\n            \"count\": 49,\n            \"max\": [\n                1.0000003576278689,\n                0.9999998807907105,\n                1.0000001192092896\n            ],\n            \"min\": [\n                0.9999999403953552,\n                0.9999995827674866,\n                0.9999997615814208\n            ],\n            \"type\": \"VEC3\"\n        },\n        {\n            \"bufferView\": 4,\n            \"byteOffset\": 1960,\n            \"componentType\": 5126,\n            \"count\": 49,\n            \"max\": [\n                2.0\n            ],\n            \"min\": [\n                0.0\n            ],\n            \"type\": \"SCALAR\"\n        },\n        {\n            \"bufferView\": 5,\n            \"byteOffset\": 11760,\n            \"componentType\": 5126,\n            \"count\": 49,\n            \"max\": [\n                0.0,\n                0.187792107462883,\n                0.0\n            ],\n            \"min\": [\n                0.0,\n                0.187792107462883,\n                0.0\n            ],\n            \"type\": \"VEC3\"\n        },\n        {\n            \"bufferView\": 6,\n            \"byteOffset\": 7840,\n            \"componentType\": 5126,\n            \"count\": 49,\n            \"max\": [\n                0.15000686049461366,\n                0.26206517219543459,\n                0.06808223575353623,\n                -0.9487173557281494\n            ],\n            \"min\": [\n                -0.0010455237934365869,\n                0.25685790181159975,\n                -0.10152826458215714,\n                -0.9656248688697816\n            ],\n            \"type\": \"VEC4\"\n        },\n        {\n            \"bufferView\": 5,\n            \"byteOffset\": 12348,\n            \"componentType\": 5126,\n            \"count\": 49,\n            \"max\": [\n                1.0000001192092896,\n                1.0000009536743165,\n                1.0\n            ],\n            \"min\": [\n                0.9999996423721314,\n                1.0000003576278689,\n                0.9999995231628418\n            ],\n            \"type\": \"VEC3\"\n        },\n        {\n            \"bufferView\": 4,\n            \"byteOffset\": 2156,\n            \"componentType\": 5126,\n            \"count\": 49,\n            \"max\": [\n                2.0\n            ],\n            \"min\": [\n                0.0\n            ],\n            \"type\": \"SCALAR\"\n        },\n        {\n            \"bufferView\": 5,\n            \"byteOffset\": 12936,\n            \"componentType\": 5126,\n            \"count\": 49,\n            \"max\": [\n                0.06761906296014786,\n                -0.02851865068078041,\n                -0.06296355277299881\n            ],\n            \"min\": [\n                0.0676189586520195,\n                -0.028518760576844217,\n                -0.06296365708112717\n            ],\n            \"type\": \"VEC3\"\n        },\n        {\n            \"bufferView\": 6,\n            \"byteOffset\": 8624,\n            \"componentType\": 5126,\n            \"count\": 49,\n            \"max\": [\n                0.301033079624176,\n                -0.20796972513198853,\n                0.92630273103714,\n                -0.08994945138692856\n            ],\n            \"min\": [\n                0.1658332496881485,\n                -0.7997090816497803,\n                0.4959096908569336,\n                -0.3118112981319428\n            ],\n            \"type\": \"VEC4\"\n        },\n        {\n            \"bufferView\": 5,\n            \"byteOffset\": 13524,\n            \"componentType\": 5126,\n            \"count\": 49,\n            \"max\": [\n                1.0000008344650269,\n                1.0,\n                0.9999999403953552\n            ],\n            \"min\": [\n                1.0000003576278689,\n                0.9999995231628418,\n                0.9999996423721314\n            ],\n            \"type\": \"VEC3\"\n        },\n        {\n            \"bufferView\": 4,\n            \"byteOffset\": 2352,\n            \"componentType\": 5126,\n            \"count\": 49,\n            \"max\": [\n                2.0\n            ],\n            \"min\": [\n                0.0\n            ],\n            \"type\": \"SCALAR\"\n        },\n        {\n            \"bufferView\": 5,\n            \"byteOffset\": 14112,\n            \"componentType\": 5126,\n            \"count\": 49,\n            \"max\": [\n                -1.4901200273698124e-8,\n                0.26611289381980898,\n                0.0\n            ],\n            \"min\": [\n                -1.4901200273698124e-8,\n                0.26611289381980898,\n                0.0\n            ],\n            \"type\": \"VEC3\"\n        },\n        {\n            \"bufferView\": 6,\n            \"byteOffset\": 9408,\n            \"componentType\": 5126,\n            \"count\": 49,\n            \"max\": [\n                0.8112500905990601,\n                -0.1822210103273392,\n                0.032220568507909778,\n                -0.4743982553482056\n            ],\n            \"min\": [\n                -0.03036016784608364,\n                -0.3419179916381836,\n                -0.289162427186966,\n                -0.9452491998672484\n            ],\n            \"type\": \"VEC4\"\n        },\n        {\n            \"bufferView\": 5,\n            \"byteOffset\": 14700,\n            \"componentType\": 5126,\n            \"count\": 49,\n            \"max\": [\n                0.9999994039535524,\n                1.000000238418579,\n                1.000000238418579\n            ],\n            \"min\": [\n                0.9999989867210388,\n                0.9999996423721314,\n                0.9999994039535524\n            ],\n            \"type\": \"VEC3\"\n        },\n        {\n            \"bufferView\": 4,\n            \"byteOffset\": 2548,\n            \"componentType\": 5126,\n            \"count\": 49,\n            \"max\": [\n                2.0\n            ],\n            \"min\": [\n                0.0\n            ],\n            \"type\": \"SCALAR\"\n        },\n        {\n            \"bufferView\": 5,\n            \"byteOffset\": 15288,\n            \"componentType\": 5126,\n            \"count\": 49,\n            \"max\": [\n                0.0,\n                0.2758241891860962,\n                0.0\n            ],\n            \"min\": [\n                0.0,\n                0.2758241891860962,\n                0.0\n            ],\n            \"type\": \"VEC3\"\n        },\n        {\n            \"bufferView\": 6,\n            \"byteOffset\": 10192,\n            \"componentType\": 5126,\n            \"count\": 49,\n            \"max\": [\n                0.9907974004745485,\n                -0.0014961245469748974,\n                0.02489613927900791,\n                -0.13506969809532166\n            ],\n            \"min\": [\n                0.8542653918266296,\n                -0.05430477112531662,\n                -0.00011262076441198587,\n                -0.5192484259605408\n            ],\n            \"type\": \"VEC4\"\n        },\n        {\n            \"bufferView\": 5,\n            \"byteOffset\": 15876,\n            \"componentType\": 5126,\n            \"count\": 49,\n            \"max\": [\n                1.0000005960464478,\n                1.0000004768371585,\n                1.0000004768371585\n            ],\n            \"min\": [\n                1.000000238418579,\n                1.0,\n                1.0000001192092896\n            ],\n            \"type\": \"VEC3\"\n        },\n        {\n            \"bufferView\": 4,\n            \"byteOffset\": 2744,\n            \"componentType\": 5126,\n            \"count\": 49,\n            \"max\": [\n                2.0\n            ],\n            \"min\": [\n                0.0\n            ],\n            \"type\": \"SCALAR\"\n        },\n        {\n            \"bufferView\": 5,\n            \"byteOffset\": 16464,\n            \"componentType\": 5126,\n            \"count\": 49,\n            \"max\": [\n                -0.0023464488331228496,\n                -0.06617332249879837,\n                0.02785664983093739\n            ],\n            \"min\": [\n                -0.002346470952033997,\n                -0.06617333739995957,\n                0.02785659022629261\n            ],\n            \"type\": \"VEC3\"\n        },\n        {\n            \"bufferView\": 6,\n            \"byteOffset\": 10976,\n            \"componentType\": 5126,\n            \"count\": 49,\n            \"max\": [\n                0.02062430046498776,\n                -0.23465925455093385,\n                0.9716955423355104,\n                0.0638260766863823\n            ],\n            \"min\": [\n                0.003326366888359189,\n                -0.5406339168548584,\n                0.8410344123840332,\n                0.016216862946748738\n            ],\n            \"type\": \"VEC4\"\n        },\n        {\n            \"bufferView\": 5,\n            \"byteOffset\": 17052,\n            \"componentType\": 5126,\n            \"count\": 49,\n            \"max\": [\n                1.0000001192092896,\n                1.0000009536743165,\n                1.0000005960464478\n            ],\n            \"min\": [\n                0.9999998211860656,\n                1.000000238418579,\n                0.9999998211860656\n            ],\n            \"type\": \"VEC3\"\n        },\n        {\n            \"bufferView\": 4,\n            \"byteOffset\": 2940,\n            \"componentType\": 5126,\n            \"count\": 49,\n            \"max\": [\n                2.0\n            ],\n            \"min\": [\n                0.0\n            ],\n            \"type\": \"SCALAR\"\n        },\n        {\n            \"bufferView\": 5,\n            \"byteOffset\": 17640,\n            \"componentType\": 5126,\n            \"count\": 49,\n            \"max\": [\n                -0.06845708936452866,\n                -0.028570100665092469,\n                -0.062949538230896\n            ],\n            \"min\": [\n                -0.06845712661743164,\n                -0.02857035957276821,\n                -0.06294971704483032\n            ],\n            \"type\": \"VEC3\"\n        },\n        {\n            \"bufferView\": 6,\n            \"byteOffset\": 11760,\n            \"componentType\": 5126,\n            \"count\": 49,\n            \"max\": [\n                -0.018168065696954728,\n                -0.18232035636901856,\n                0.9812799096107484,\n                0.117560513317585\n            ],\n            \"min\": [\n                -0.07457219809293747,\n                -0.902503490447998,\n                0.413051187992096,\n                0.03284534439444542\n            ],\n            \"type\": \"VEC4\"\n        },\n        {\n            \"bufferView\": 5,\n            \"byteOffset\": 18228,\n            \"componentType\": 5126,\n            \"count\": 49,\n            \"max\": [\n                1.000000238418579,\n                1.000000238418579,\n                1.0000003576278689\n            ],\n            \"min\": [\n                0.9999998211860656,\n                0.9999995827674866,\n                0.9999996423721314\n            ],\n            \"type\": \"VEC3\"\n        },\n        {\n            \"bufferView\": 4,\n            \"byteOffset\": 3136,\n            \"componentType\": 5126,\n            \"count\": 49,\n            \"max\": [\n                2.0\n            ],\n            \"min\": [\n                0.0\n            ],\n            \"type\": \"SCALAR\"\n        },\n        {\n            \"bufferView\": 5,\n            \"byteOffset\": 18816,\n            \"componentType\": 5126,\n            \"count\": 49,\n            \"max\": [\n                -1.1175900205273593e-8,\n                0.2661114931106568,\n                0.0\n            ],\n            \"min\": [\n                -1.1175900205273593e-8,\n                0.2661114931106568,\n                0.0\n            ],\n            \"type\": \"VEC3\"\n        },\n        {\n            \"bufferView\": 6,\n            \"byteOffset\": 12544,\n            \"componentType\": 5126,\n            \"count\": 49,\n            \"max\": [\n                0.8507033586502075,\n                0.14946134388446809,\n                0.04984176158905029,\n                -0.5191445350646973\n            ],\n            \"min\": [\n                -0.06756377220153809,\n                0.06949601322412491,\n                -0.026268262416124345,\n                -0.9922308921813964\n            ],\n            \"type\": \"VEC4\"\n        },\n        {\n            \"bufferView\": 5,\n            \"byteOffset\": 19404,\n            \"componentType\": 5126,\n            \"count\": 49,\n            \"max\": [\n                1.0000005960464478,\n                1.0000003576278689,\n                1.0000005960464478\n            ],\n            \"min\": [\n                1.0000001192092896,\n                0.9999995231628418,\n                0.9999998211860656\n            ],\n            \"type\": \"VEC3\"\n        },\n        {\n            \"bufferView\": 4,\n            \"byteOffset\": 3332,\n            \"componentType\": 5126,\n            \"count\": 49,\n            \"max\": [\n                2.0\n            ],\n            \"min\": [\n                0.0\n            ],\n            \"type\": \"SCALAR\"\n        },\n        {\n            \"bufferView\": 5,\n            \"byteOffset\": 19992,\n            \"componentType\": 5126,\n            \"count\": 49,\n            \"max\": [\n                0.0,\n                0.2758249044418335,\n                0.0\n            ],\n            \"min\": [\n                0.0,\n                0.2758249044418335,\n                0.0\n            ],\n            \"type\": \"VEC3\"\n        },\n        {\n            \"bufferView\": 6,\n            \"byteOffset\": 13328,\n            \"componentType\": 5126,\n            \"count\": 49,\n            \"max\": [\n                0.99649316072464,\n                -0.01710231974720955,\n                -0.022676724940538408,\n                -0.07459255307912827\n            ],\n            \"min\": [\n                0.8792483806610107,\n                -0.04609288275241852,\n                -0.06820148974657059,\n                -0.4750169813632965\n            ],\n            \"type\": \"VEC4\"\n        },\n        {\n            \"bufferView\": 5,\n            \"byteOffset\": 20580,\n            \"componentType\": 5126,\n            \"count\": 49,\n            \"max\": [\n                0.9999995827674866,\n                1.0,\n                1.0000003576278689\n            ],\n            \"min\": [\n                0.999999225139618,\n                0.9999995231628418,\n                1.0\n            ],\n            \"type\": \"VEC3\"\n        },\n        {\n            \"bufferView\": 4,\n            \"byteOffset\": 3528,\n            \"componentType\": 5126,\n            \"count\": 49,\n            \"max\": [\n                2.0\n            ],\n            \"min\": [\n                0.0\n            ],\n            \"type\": \"SCALAR\"\n        },\n        {\n            \"bufferView\": 5,\n            \"byteOffset\": 21168,\n            \"componentType\": 5126,\n            \"count\": 49,\n            \"max\": [\n                -0.0014585109893232585,\n                -0.06619886308908463,\n                0.02785670943558216\n            ],\n            \"min\": [\n                -0.0014585329918190837,\n                -0.06619889289140701,\n                0.02785668894648552\n            ],\n            \"type\": \"VEC3\"\n        },\n        {\n            \"bufferView\": 6,\n            \"byteOffset\": 14112,\n            \"componentType\": 5126,\n            \"count\": 49,\n            \"max\": [\n                -0.00960757862776518,\n                -0.2635453343391419,\n                0.9620476961135864,\n                0.06995902955532074\n            ],\n            \"min\": [\n                -0.04577624797821045,\n                -0.4899238646030426,\n                0.8689604997634888,\n                -0.06424159556627274\n            ],\n            \"type\": \"VEC4\"\n        },\n        {\n            \"bufferView\": 5,\n            \"byteOffset\": 21756,\n            \"componentType\": 5126,\n            \"count\": 49,\n            \"max\": [\n                0.9999996423721314,\n                1.0000003576278689,\n                0.9999998807907105\n            ],\n            \"min\": [\n                0.9999991655349731,\n                0.9999997615814208,\n                0.9999994039535524\n            ],\n            \"type\": \"VEC3\"\n        },\n        {\n            \"bufferView\": 7,\n            \"byteOffset\": 0,\n            \"componentType\": 5126,\n            \"count\": 19,\n            \"max\": [\n                0.780990481376648,\n                0.9918341040611268,\n                0.9992613196372986,\n                0.0,\n                1.0,\n                0.8904604315757752,\n                0.6854007244110107,\n                0.0,\n                0.79917311668396,\n                0.9999359250068665,\n                0.997134804725647,\n                0.0,\n                0.20702040195465089,\n                0.5989438891410828,\n                1.001250982284546,\n                1.0\n            ],\n            \"min\": [\n                -0.9985063076019288,\n                -0.9971349835395812,\n                -0.9999359250068665,\n                0.0,\n                -1.0,\n                -0.8904621005058289,\n                -0.4517692029476166,\n                0.0,\n                -0.18484599888324736,\n                -0.9853218197822572,\n                -0.997802197933197,\n                0.0,\n                -0.811928927898407,\n                -1.18982994556427,\n                -1.058609962463379,\n                1.0\n            ],\n            \"type\": \"MAT4\"\n        }\n    ],\n    \"materials\": [\n        {\n            \"pbrMetallicRoughness\": {\n                \"baseColorTexture\": {\n                    \"index\": 0\n                },\n                \"metallicFactor\": 0.0\n            },\n            \"emissiveFactor\": [\n                0.0,\n                0.0,\n                0.0\n            ],\n            \"name\": \"Cesium_Man-effect\"\n        }\n    ],\n    \"textures\": [\n        {\n            \"sampler\": 0,\n            \"source\": 0\n        }\n    ],\n    \"images\": [\n        {\n            \"uri\": \"CesiumMan.jpg\"\n        }\n    ],\n    \"samplers\": [\n        {\n            \"magFilter\": 9729,\n            \"minFilter\": 9986,\n            \"wrapS\": 10497,\n            \"wrapT\": 10497\n        }\n    ],\n    \"bufferViews\": [\n        {\n            \"buffer\": 0,\n            \"byteOffset\": 225468,\n            \"byteLength\": 28032,\n            \"target\": 34963\n        },\n        {\n            \"buffer\": 0,\n            \"byteOffset\": 169376,\n            \"byteLength\": 52368,\n            \"byteStride\": 8,\n            \"target\": 34962\n        },\n        {\n            \"buffer\": 0,\n            \"byteOffset\": 90824,\n            \"byteLength\": 78552,\n            \"byteStride\": 12,\n            \"target\": 34962\n        },\n        {\n            \"buffer\": 0,\n            \"byteOffset\": 16112,\n            \"byteLength\": 52368,\n            \"byteStride\": 16,\n            \"target\": 34962\n        },\n        {\n            \"buffer\": 0,\n            \"byteOffset\": 221744,\n            \"byteLength\": 3724\n        },\n        {\n            \"buffer\": 0,\n            \"byteOffset\": 68480,\n            \"byteLength\": 22344\n        },\n        {\n            \"buffer\": 0,\n            \"byteOffset\": 1216,\n            \"byteLength\": 14896\n        },\n        {\n            \"buffer\": 0,\n            \"byteOffset\": 0,\n            \"byteLength\": 1216\n        }\n    ],\n    \"buffers\": [\n        {\n            \"byteLength\": 253500,\n            \"uri\": \"CesiumMan0.bin\"\n        }\n    ]\n}\n"
  },
  {
    "path": "examples/resources/models/gltf/CesiumMan/glTF-Draco/CesiumMan.gltf",
    "content": "{\n  \"asset\": {\n    \"generator\": \"COLLADA2GLTF\",\n    \"version\": \"2.0\"\n  },\n  \"scene\": 0,\n  \"scenes\": [\n    {\n      \"nodes\": [\n        0\n      ]\n    }\n  ],\n  \"nodes\": [\n    {\n      \"children\": [\n        21,\n        1\n      ],\n      \"matrix\": [\n        1,\n        0,\n        0,\n        0,\n        0,\n        0,\n        -1,\n        0,\n        0,\n        1,\n        0,\n        0,\n        0,\n        0,\n        0,\n        1\n      ]\n    },\n    {\n      \"mesh\": 0,\n      \"skin\": 0\n    },\n    {\n      \"children\": [\n        11,\n        7,\n        3\n      ],\n      \"translation\": [\n        -3.352759847530251e-8,\n        0.00499989278614521,\n        0.6789997816085815\n      ],\n      \"rotation\": [\n        -0.026794714853167537,\n        -0.026732556521892548,\n        -0.7065613865852356,\n        -0.706638753414154\n      ],\n      \"scale\": [\n        0.9999998807907104,\n        0.9999998211860656,\n        0.9999999403953552\n      ]\n    },\n    {\n      \"children\": [\n        4\n      ],\n      \"translation\": [\n        -0.06804201006889343,\n        -0.02857022918760777,\n        -0.06294959783554077\n      ],\n      \"rotation\": [\n        -0.06642699241638184,\n        -0.6115013957023621,\n        0.7850273251533508,\n        0.073387511074543\n      ],\n      \"scale\": [\n        0.9999999403953552,\n        1.000000238418579,\n        1\n      ]\n    },\n    {\n      \"children\": [\n        5\n      ],\n      \"translation\": [\n        0,\n        0.26611149311065674,\n        0\n      ],\n      \"rotation\": [\n        0.216291218996048,\n        0.12430648505687714,\n        0.0015752052422612906,\n        -0.9683818817138672\n      ],\n      \"scale\": [\n        1,\n        0.9999998211860656,\n        1\n      ]\n    },\n    {\n      \"children\": [\n        6\n      ],\n      \"translation\": [\n        0,\n        0.2758249044418335,\n        -1.1175900205273592e-8\n      ],\n      \"rotation\": [\n        0.8472740650177002,\n        -0.029564039781689644,\n        -0.020868001505732536,\n        -0.5299217700958252\n      ],\n      \"scale\": [\n        0.9999999403953552,\n        0.9999998807907104,\n        1\n      ]\n    },\n    {\n      \"translation\": [\n        -0.001458480954170227,\n        -0.06619883328676224,\n        0.027856720611453056\n      ],\n      \"rotation\": [\n        -0.03726436197757721,\n        -0.319313257932663,\n        0.9460535645484924,\n        -0.040414959192276\n      ],\n      \"scale\": [\n        1,\n        1.0000003576278689,\n        1.0000005960464478\n      ]\n    },\n    {\n      \"children\": [\n        8\n      ],\n      \"translation\": [\n        0.06803668290376663,\n        -0.028518669307231903,\n        -0.06296277046203613\n      ],\n      \"rotation\": [\n        0.2475697100162506,\n        -0.5775680541992188,\n        0.7479144334793091,\n        -0.2138892114162445\n      ],\n      \"scale\": [\n        1,\n        1.000000238418579,\n        1.0000001192092896\n      ]\n    },\n    {\n      \"children\": [\n        9\n      ],\n      \"translation\": [\n        3.725290076417309e-9,\n        0.2661128044128418,\n        1.4901200273698123e-8\n      ],\n      \"rotation\": [\n        0.2090278267860413,\n        -0.32988959550857544,\n        -0.05559924989938736,\n        -0.9189063906669616\n      ]\n    },\n    {\n      \"children\": [\n        10\n      ],\n      \"translation\": [\n        -7.450580152834618e-9,\n        0.2758241891860962,\n        5.5879398885849704e-9\n      ],\n      \"rotation\": [\n        0.8477396965026855,\n        -0.004254077095538378,\n        -0.009491981938481333,\n        -0.5303107500076294\n      ],\n      \"scale\": [\n        0.9999998807907104,\n        1.0000001192092896,\n        1.0000001192092896\n      ]\n    },\n    {\n      \"translation\": [\n        -0.002346523106098175,\n        -0.06617332994937897,\n        0.02785678952932358\n      ],\n      \"rotation\": [\n        0.026573536917567257,\n        -0.3201442956924439,\n        0.9445450901985168,\n        0.06808964908123016\n      ],\n      \"scale\": [\n        1,\n        1.000000238418579,\n        1.000000238418579\n      ]\n    },\n    {\n      \"children\": [\n        12\n      ],\n      \"translation\": [\n        -1.02445003591356e-8,\n        1.4901200273698123e-8,\n        0.14541690051555634\n      ],\n      \"rotation\": [\n        -0.6572523713111877,\n        -0.00017969288455788046,\n        -0.00010428010864416136,\n        -0.7536706328392029\n      ],\n      \"scale\": [\n        0.9999999403953552,\n        1,\n        1.0000001192092896\n      ]\n    },\n    {\n      \"children\": [\n        19,\n        16,\n        13\n      ],\n      \"translation\": [\n        4.6566100975198305e-10,\n        0.250516802072525,\n        3.725290076417309e-9\n      ],\n      \"rotation\": [\n        0.6226037740707397,\n        0.00001678345142863691,\n        -0.0000031824047255213377,\n        -0.7825372219085693\n      ],\n      \"scale\": [\n        1,\n        1,\n        0.9999999403953552\n      ]\n    },\n    {\n      \"children\": [\n        14\n      ],\n      \"translation\": [\n        -0.09098775684833528,\n        0.00006259980000322685,\n        -0.00006532669794978574\n      ],\n      \"rotation\": [\n        0.2964428961277008,\n        0.03151032328605652,\n        -0.652255117893219,\n        -0.6969160437583923\n      ],\n      \"scale\": [\n        1.0000001192092896,\n        0.9999999403953552,\n        1.0000001192092896\n      ]\n    },\n    {\n      \"children\": [\n        15\n      ],\n      \"translation\": [\n        0,\n        0.24200819432735443,\n        -5.96045985901128e-8\n      ],\n      \"rotation\": [\n        -0.1887933611869812,\n        0.9157071709632874,\n        -0.16780903935432437,\n        -0.3125341236591339\n      ],\n      \"scale\": [\n        0.9999999403953552,\n        0.9999999403953552,\n        0.9999998807907104\n      ]\n    },\n    {\n      \"translation\": [\n        0,\n        0.18779200315475464,\n        0\n      ],\n      \"rotation\": [\n        -0.058613914996385574,\n        0.2637767195701599,\n        0.05226854607462883,\n        -0.9613814353942872\n      ],\n      \"scale\": [\n        1,\n        1,\n        0.9999999403953552\n      ]\n    },\n    {\n      \"children\": [\n        17\n      ],\n      \"translation\": [\n        0.0910135880112648,\n        0.000014185899999574758,\n        -0.00005805489854537882\n      ],\n      \"rotation\": [\n        0.6797328591346741,\n        0.689685583114624,\n        -0.2269716113805771,\n        -0.10383165627717972\n      ],\n      \"scale\": [\n        1,\n        1.0000001192092896,\n        1\n      ]\n    },\n    {\n      \"children\": [\n        18\n      ],\n      \"translation\": [\n        1.1641500263781523e-10,\n        0.2420089989900589,\n        0\n      ],\n      \"rotation\": [\n        -0.013960935175418854,\n        -0.12937255203723907,\n        -0.2522056698799134,\n        -0.9588848352432252\n      ],\n      \"scale\": [\n        1,\n        0.9999999403953552,\n        1\n      ]\n    },\n    {\n      \"translation\": [\n        1.4901200273698123e-8,\n        0.18779149651527408,\n        5.96045985901128e-8\n      ],\n      \"rotation\": [\n        0.006119169760495424,\n        -0.042325541377067566,\n        -0.07877591997385025,\n        -0.9959746599197388\n      ],\n      \"scale\": [\n        0.9999998807907104,\n        1.000000238418579,\n        0.9999999403953552\n      ]\n    },\n    {\n      \"children\": [\n        20\n      ],\n      \"translation\": [\n        -8.847560017954947e-9,\n        5.96045985901128e-8,\n        0.06483662128448486\n      ],\n      \"rotation\": [\n        -0.6606296300888062,\n        0.00008344435627805069,\n        0.00007109258876880631,\n        -0.750711977481842\n      ]\n    },\n    {\n      \"translation\": [\n        0,\n        0.0520397387444973,\n        0\n      ],\n      \"rotation\": [\n        0.000002552607384131989,\n        0.9996904730796814,\n        -0.02487966977059841,\n        -4.329927776325349e-7\n      ]\n    },\n    {\n      \"children\": [\n        2\n      ]\n    }\n  ],\n  \"meshes\": [\n    {\n      \"primitives\": [\n        {\n          \"attributes\": {\n            \"JOINTS_0\": 78,\n            \"NORMAL\": 79,\n            \"POSITION\": 80,\n            \"TEXCOORD_0\": 81,\n            \"WEIGHTS_0\": 82\n          },\n          \"indices\": 77,\n          \"mode\": 4,\n          \"material\": 0,\n          \"extensions\": {\n            \"KHR_draco_mesh_compression\": {\n              \"bufferView\": 4,\n              \"attributes\": {\n                \"JOINTS_0\": 0,\n                \"NORMAL\": 1,\n                \"POSITION\": 2,\n                \"TEXCOORD_0\": 3,\n                \"WEIGHTS_0\": 4\n              }\n            }\n          }\n        }\n      ],\n      \"name\": \"Cesium_Man\"\n    }\n  ],\n  \"animations\": [\n    {\n      \"channels\": [\n        {\n          \"sampler\": 0,\n          \"target\": {\n            \"node\": 2,\n            \"path\": \"translation\"\n          }\n        },\n        {\n          \"sampler\": 1,\n          \"target\": {\n            \"node\": 2,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 2,\n          \"target\": {\n            \"node\": 2,\n            \"path\": \"scale\"\n          }\n        },\n        {\n          \"sampler\": 3,\n          \"target\": {\n            \"node\": 11,\n            \"path\": \"translation\"\n          }\n        },\n        {\n          \"sampler\": 4,\n          \"target\": {\n            \"node\": 11,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 5,\n          \"target\": {\n            \"node\": 11,\n            \"path\": \"scale\"\n          }\n        },\n        {\n          \"sampler\": 6,\n          \"target\": {\n            \"node\": 12,\n            \"path\": \"translation\"\n          }\n        },\n        {\n          \"sampler\": 7,\n          \"target\": {\n            \"node\": 12,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 8,\n          \"target\": {\n            \"node\": 12,\n            \"path\": \"scale\"\n          }\n        },\n        {\n          \"sampler\": 9,\n          \"target\": {\n            \"node\": 19,\n            \"path\": \"translation\"\n          }\n        },\n        {\n          \"sampler\": 10,\n          \"target\": {\n            \"node\": 19,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 11,\n          \"target\": {\n            \"node\": 19,\n            \"path\": \"scale\"\n          }\n        },\n        {\n          \"sampler\": 12,\n          \"target\": {\n            \"node\": 20,\n            \"path\": \"translation\"\n          }\n        },\n        {\n          \"sampler\": 13,\n          \"target\": {\n            \"node\": 20,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 14,\n          \"target\": {\n            \"node\": 20,\n            \"path\": \"scale\"\n          }\n        },\n        {\n          \"sampler\": 15,\n          \"target\": {\n            \"node\": 16,\n            \"path\": \"translation\"\n          }\n        },\n        {\n          \"sampler\": 16,\n          \"target\": {\n            \"node\": 16,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 17,\n          \"target\": {\n            \"node\": 16,\n            \"path\": \"scale\"\n          }\n        },\n        {\n          \"sampler\": 18,\n          \"target\": {\n            \"node\": 17,\n            \"path\": \"translation\"\n          }\n        },\n        {\n          \"sampler\": 19,\n          \"target\": {\n            \"node\": 17,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 20,\n          \"target\": {\n            \"node\": 17,\n            \"path\": \"scale\"\n          }\n        },\n        {\n          \"sampler\": 21,\n          \"target\": {\n            \"node\": 18,\n            \"path\": \"translation\"\n          }\n        },\n        {\n          \"sampler\": 22,\n          \"target\": {\n            \"node\": 18,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 23,\n          \"target\": {\n            \"node\": 18,\n            \"path\": \"scale\"\n          }\n        },\n        {\n          \"sampler\": 24,\n          \"target\": {\n            \"node\": 13,\n            \"path\": \"translation\"\n          }\n        },\n        {\n          \"sampler\": 25,\n          \"target\": {\n            \"node\": 13,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 26,\n          \"target\": {\n            \"node\": 13,\n            \"path\": \"scale\"\n          }\n        },\n        {\n          \"sampler\": 27,\n          \"target\": {\n            \"node\": 14,\n            \"path\": \"translation\"\n          }\n        },\n        {\n          \"sampler\": 28,\n          \"target\": {\n            \"node\": 14,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 29,\n          \"target\": {\n            \"node\": 14,\n            \"path\": \"scale\"\n          }\n        },\n        {\n          \"sampler\": 30,\n          \"target\": {\n            \"node\": 15,\n            \"path\": \"translation\"\n          }\n        },\n        {\n          \"sampler\": 31,\n          \"target\": {\n            \"node\": 15,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 32,\n          \"target\": {\n            \"node\": 15,\n            \"path\": \"scale\"\n          }\n        },\n        {\n          \"sampler\": 33,\n          \"target\": {\n            \"node\": 7,\n            \"path\": \"translation\"\n          }\n        },\n        {\n          \"sampler\": 34,\n          \"target\": {\n            \"node\": 7,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 35,\n          \"target\": {\n            \"node\": 7,\n            \"path\": \"scale\"\n          }\n        },\n        {\n          \"sampler\": 36,\n          \"target\": {\n            \"node\": 8,\n            \"path\": \"translation\"\n          }\n        },\n        {\n          \"sampler\": 37,\n          \"target\": {\n            \"node\": 8,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 38,\n          \"target\": {\n            \"node\": 8,\n            \"path\": \"scale\"\n          }\n        },\n        {\n          \"sampler\": 39,\n          \"target\": {\n            \"node\": 9,\n            \"path\": \"translation\"\n          }\n        },\n        {\n          \"sampler\": 40,\n          \"target\": {\n            \"node\": 9,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 41,\n          \"target\": {\n            \"node\": 9,\n            \"path\": \"scale\"\n          }\n        },\n        {\n          \"sampler\": 42,\n          \"target\": {\n            \"node\": 10,\n            \"path\": \"translation\"\n          }\n        },\n        {\n          \"sampler\": 43,\n          \"target\": {\n            \"node\": 10,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 44,\n          \"target\": {\n            \"node\": 10,\n            \"path\": \"scale\"\n          }\n        },\n        {\n          \"sampler\": 45,\n          \"target\": {\n            \"node\": 3,\n            \"path\": \"translation\"\n          }\n        },\n        {\n          \"sampler\": 46,\n          \"target\": {\n            \"node\": 3,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 47,\n          \"target\": {\n            \"node\": 3,\n            \"path\": \"scale\"\n          }\n        },\n        {\n          \"sampler\": 48,\n          \"target\": {\n            \"node\": 4,\n            \"path\": \"translation\"\n          }\n        },\n        {\n          \"sampler\": 49,\n          \"target\": {\n            \"node\": 4,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 50,\n          \"target\": {\n            \"node\": 4,\n            \"path\": \"scale\"\n          }\n        },\n        {\n          \"sampler\": 51,\n          \"target\": {\n            \"node\": 5,\n            \"path\": \"translation\"\n          }\n        },\n        {\n          \"sampler\": 52,\n          \"target\": {\n            \"node\": 5,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 53,\n          \"target\": {\n            \"node\": 5,\n            \"path\": \"scale\"\n          }\n        },\n        {\n          \"sampler\": 54,\n          \"target\": {\n            \"node\": 6,\n            \"path\": \"translation\"\n          }\n        },\n        {\n          \"sampler\": 55,\n          \"target\": {\n            \"node\": 6,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 56,\n          \"target\": {\n            \"node\": 6,\n            \"path\": \"scale\"\n          }\n        }\n      ],\n      \"samplers\": [\n        {\n          \"input\": 0,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 1\n        },\n        {\n          \"input\": 0,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 2\n        },\n        {\n          \"input\": 0,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 3\n        },\n        {\n          \"input\": 4,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 5\n        },\n        {\n          \"input\": 4,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 6\n        },\n        {\n          \"input\": 4,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 7\n        },\n        {\n          \"input\": 8,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 9\n        },\n        {\n          \"input\": 8,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 10\n        },\n        {\n          \"input\": 8,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 11\n        },\n        {\n          \"input\": 12,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 13\n        },\n        {\n          \"input\": 12,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 14\n        },\n        {\n          \"input\": 12,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 15\n        },\n        {\n          \"input\": 16,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 17\n        },\n        {\n          \"input\": 16,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 18\n        },\n        {\n          \"input\": 16,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 19\n        },\n        {\n          \"input\": 20,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 21\n        },\n        {\n          \"input\": 20,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 22\n        },\n        {\n          \"input\": 20,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 23\n        },\n        {\n          \"input\": 24,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 25\n        },\n        {\n          \"input\": 24,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 26\n        },\n        {\n          \"input\": 24,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 27\n        },\n        {\n          \"input\": 28,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 29\n        },\n        {\n          \"input\": 28,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 30\n        },\n        {\n          \"input\": 28,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 31\n        },\n        {\n          \"input\": 32,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 33\n        },\n        {\n          \"input\": 32,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 34\n        },\n        {\n          \"input\": 32,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 35\n        },\n        {\n          \"input\": 36,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 37\n        },\n        {\n          \"input\": 36,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 38\n        },\n        {\n          \"input\": 36,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 39\n        },\n        {\n          \"input\": 40,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 41\n        },\n        {\n          \"input\": 40,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 42\n        },\n        {\n          \"input\": 40,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 43\n        },\n        {\n          \"input\": 44,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 45\n        },\n        {\n          \"input\": 44,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 46\n        },\n        {\n          \"input\": 44,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 47\n        },\n        {\n          \"input\": 48,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 49\n        },\n        {\n          \"input\": 48,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 50\n        },\n        {\n          \"input\": 48,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 51\n        },\n        {\n          \"input\": 52,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 53\n        },\n        {\n          \"input\": 52,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 54\n        },\n        {\n          \"input\": 52,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 55\n        },\n        {\n          \"input\": 56,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 57\n        },\n        {\n          \"input\": 56,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 58\n        },\n        {\n          \"input\": 56,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 59\n        },\n        {\n          \"input\": 60,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 61\n        },\n        {\n          \"input\": 60,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 62\n        },\n        {\n          \"input\": 60,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 63\n        },\n        {\n          \"input\": 64,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 65\n        },\n        {\n          \"input\": 64,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 66\n        },\n        {\n          \"input\": 64,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 67\n        },\n        {\n          \"input\": 68,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 69\n        },\n        {\n          \"input\": 68,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 70\n        },\n        {\n          \"input\": 68,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 71\n        },\n        {\n          \"input\": 72,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 73\n        },\n        {\n          \"input\": 72,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 74\n        },\n        {\n          \"input\": 72,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 75\n        }\n      ]\n    }\n  ],\n  \"skins\": [\n    {\n      \"inverseBindMatrices\": 76,\n      \"skeleton\": 2,\n      \"joints\": [\n        2,\n        11,\n        12,\n        19,\n        20,\n        16,\n        13,\n        17,\n        14,\n        18,\n        15,\n        7,\n        3,\n        8,\n        4,\n        9,\n        5,\n        10,\n        6\n      ],\n      \"name\": \"Armature\"\n    }\n  ],\n  \"accessors\": [\n    {\n      \"bufferView\": 0,\n      \"byteOffset\": 0,\n      \"componentType\": 5126,\n      \"count\": 49,\n      \"max\": [\n        2\n      ],\n      \"min\": [\n        0\n      ],\n      \"type\": \"SCALAR\"\n    },\n    {\n      \"bufferView\": 1,\n      \"byteOffset\": 0,\n      \"componentType\": 5126,\n      \"count\": 49,\n      \"max\": [\n        2.386510011831433e-8,\n        -0.02000010944902897,\n        0.7110069990158081\n      ],\n      \"min\": [\n        -7.101330190550925e-9,\n        -0.030000120401382446,\n        0.6399999856948853\n      ],\n      \"type\": \"VEC3\"\n    },\n    {\n      \"bufferView\": 2,\n      \"byteOffset\": 0,\n      \"componentType\": 5126,\n      \"count\": 49,\n      \"max\": [\n        -0.02314124070107937,\n        -0.006974140647798777,\n        -0.7065909504890442,\n        -0.7031946778297424\n      ],\n      \"min\": [\n        -0.05146743357181549,\n        -0.03440024703741074,\n        -0.7094300389289856,\n        -0.7066542506217957\n      ],\n      \"type\": \"VEC4\"\n    },\n    {\n      \"bufferView\": 1,\n      \"byteOffset\": 588,\n      \"componentType\": 5126,\n      \"count\": 49,\n      \"max\": [\n        1.0000001192092896,\n        1.0000003576278689,\n        1.0000001192092896\n      ],\n      \"min\": [\n        0.9999998211860656,\n        0.9999998211860656,\n        0.9999997615814208\n      ],\n      \"type\": \"VEC3\"\n    },\n    {\n      \"bufferView\": 0,\n      \"byteOffset\": 196,\n      \"componentType\": 5126,\n      \"count\": 49,\n      \"max\": [\n        2\n      ],\n      \"min\": [\n        0\n      ],\n      \"type\": \"SCALAR\"\n    },\n    {\n      \"bufferView\": 1,\n      \"byteOffset\": 1176,\n      \"componentType\": 5126,\n      \"count\": 49,\n      \"max\": [\n        0.0009999830508604646,\n        3.725289943190546e-8,\n        0.1454170048236847\n      ],\n      \"min\": [\n        0.0009999759495258331,\n        -4.470350134511136e-8,\n        0.14541690051555634\n      ],\n      \"type\": \"VEC3\"\n    },\n    {\n      \"bufferView\": 2,\n      \"byteOffset\": 784,\n      \"componentType\": 5126,\n      \"count\": 49,\n      \"max\": [\n        -0.7105135917663574,\n        0.008397356607019901,\n        0.000531485362444073,\n        -0.6789330840110779\n      ],\n      \"min\": [\n        -0.733797013759613,\n        -0.0113212987780571,\n        -0.02596380189061165,\n        -0.703567624092102\n      ],\n      \"type\": \"VEC4\"\n    },\n    {\n      \"bufferView\": 1,\n      \"byteOffset\": 1764,\n      \"componentType\": 5126,\n      \"count\": 49,\n      \"max\": [\n        1.0000003576278689,\n        1.0000004768371584,\n        0.999999701976776\n      ],\n      \"min\": [\n        0.9999999403953552,\n        1.0000001192092896,\n        0.9999992847442628\n      ],\n      \"type\": \"VEC3\"\n    },\n    {\n      \"bufferView\": 0,\n      \"byteOffset\": 392,\n      \"componentType\": 5126,\n      \"count\": 49,\n      \"max\": [\n        2\n      ],\n      \"min\": [\n        0\n      ],\n      \"type\": \"SCALAR\"\n    },\n    {\n      \"bufferView\": 1,\n      \"byteOffset\": 2352,\n      \"componentType\": 5126,\n      \"count\": 49,\n      \"max\": [\n        0,\n        0.25051671266555786,\n        0\n      ],\n      \"min\": [\n        0,\n        0.25051671266555786,\n        0\n      ],\n      \"type\": \"VEC3\"\n    },\n    {\n      \"bufferView\": 2,\n      \"byteOffset\": 1568,\n      \"componentType\": 5126,\n      \"count\": 49,\n      \"max\": [\n        0.6358352899551392,\n        0.06165437772870064,\n        -0.00338419945910573,\n        -0.7642753720283508\n      ],\n      \"min\": [\n        0.6224426627159119,\n        -0.1380288153886795,\n        -0.06534027308225632,\n        -0.782635509967804\n      ],\n      \"type\": \"VEC4\"\n    },\n    {\n      \"bufferView\": 1,\n      \"byteOffset\": 2940,\n      \"componentType\": 5126,\n      \"count\": 49,\n      \"max\": [\n        1.0000001192092896,\n        1.0000007152557373,\n        0.9999996423721313\n      ],\n      \"min\": [\n        0.9999998211860656,\n        1.000000238418579,\n        0.999999225139618\n      ],\n      \"type\": \"VEC3\"\n    },\n    {\n      \"bufferView\": 0,\n      \"byteOffset\": 588,\n      \"componentType\": 5126,\n      \"count\": 49,\n      \"max\": [\n        2\n      ],\n      \"min\": [\n        0\n      ],\n      \"type\": \"SCALAR\"\n    },\n    {\n      \"bufferView\": 1,\n      \"byteOffset\": 3528,\n      \"componentType\": 5126,\n      \"count\": 49,\n      \"max\": [\n        2.1420399676230776e-8,\n        8.940700269022274e-8,\n        0.064838707447052\n      ],\n      \"min\": [\n        -1.5832499755674693e-8,\n        2.98022992950564e-8,\n        0.06483834981918335\n      ],\n      \"type\": \"VEC3\"\n    },\n    {\n      \"bufferView\": 2,\n      \"byteOffset\": 2352,\n      \"componentType\": 5126,\n      \"count\": 49,\n      \"max\": [\n        -0.632530927658081,\n        0.02482949569821358,\n        0.04200226813554764,\n        -0.749857485294342\n      ],\n      \"min\": [\n        -0.6592774987220764,\n        -0.03641732409596443,\n        -0.03000718355178833,\n        -0.7735550403594971\n      ],\n      \"type\": \"VEC4\"\n    },\n    {\n      \"bufferView\": 1,\n      \"byteOffset\": 4116,\n      \"componentType\": 5126,\n      \"count\": 49,\n      \"max\": [\n        1.000000238418579,\n        0.9999998807907104,\n        1\n      ],\n      \"min\": [\n        0.9999998211860656,\n        0.9999995231628418,\n        0.9999996423721313\n      ],\n      \"type\": \"VEC3\"\n    },\n    {\n      \"bufferView\": 0,\n      \"byteOffset\": 784,\n      \"componentType\": 5126,\n      \"count\": 49,\n      \"max\": [\n        2\n      ],\n      \"min\": [\n        0\n      ],\n      \"type\": \"SCALAR\"\n    },\n    {\n      \"bufferView\": 1,\n      \"byteOffset\": 4704,\n      \"componentType\": 5126,\n      \"count\": 49,\n      \"max\": [\n        7.450580152834618e-9,\n        0.0520397387444973,\n        0\n      ],\n      \"min\": [\n        7.450580152834618e-9,\n        0.0520397387444973,\n        0\n      ],\n      \"type\": \"VEC3\"\n    },\n    {\n      \"bufferView\": 2,\n      \"byteOffset\": 3136,\n      \"componentType\": 5126,\n      \"count\": 49,\n      \"max\": [\n        0.04680429771542549,\n        0.9995073676109314,\n        -0.018450811505317688,\n        0.002033286727964878\n      ],\n      \"min\": [\n        -0.09362706542015076,\n        0.995067298412323,\n        -0.09058911353349686,\n        -0.002585495822131634\n      ],\n      \"type\": \"VEC4\"\n    },\n    {\n      \"bufferView\": 1,\n      \"byteOffset\": 5292,\n      \"componentType\": 5126,\n      \"count\": 49,\n      \"max\": [\n        1.000000238418579,\n        1.0000001192092896,\n        1.0000004768371584\n      ],\n      \"min\": [\n        0.999999701976776,\n        0.9999998211860656,\n        1.0000001192092896\n      ],\n      \"type\": \"VEC3\"\n    },\n    {\n      \"bufferView\": 0,\n      \"byteOffset\": 980,\n      \"componentType\": 5126,\n      \"count\": 49,\n      \"max\": [\n        2\n      ],\n      \"min\": [\n        0\n      ],\n      \"type\": \"SCALAR\"\n    },\n    {\n      \"bufferView\": 1,\n      \"byteOffset\": 5880,\n      \"componentType\": 5126,\n      \"count\": 49,\n      \"max\": [\n        0.08800014853477478,\n        0.000014096500308369288,\n        -0.00005573029920924455\n      ],\n      \"min\": [\n        0.08799994736909866,\n        0.000013977300113765525,\n        -0.00005596880146185868\n      ],\n      \"type\": \"VEC3\"\n    },\n    {\n      \"bufferView\": 2,\n      \"byteOffset\": 3920,\n      \"componentType\": 5126,\n      \"count\": 49,\n      \"max\": [\n        0.7787204384803772,\n        0.6963526606559753,\n        -0.2913321256637573,\n        -0.12775331735610965\n      ],\n      \"min\": [\n        0.41440603137016296,\n        0.2682091891765595,\n        -0.6041955351829529,\n        -0.508333683013916\n      ],\n      \"type\": \"VEC4\"\n    },\n    {\n      \"bufferView\": 1,\n      \"byteOffset\": 6468,\n      \"componentType\": 5126,\n      \"count\": 49,\n      \"max\": [\n        1.0000005960464478,\n        1,\n        1.0000004768371584\n      ],\n      \"min\": [\n        1,\n        0.9999995827674866,\n        1.0000001192092896\n      ],\n      \"type\": \"VEC3\"\n    },\n    {\n      \"bufferView\": 0,\n      \"byteOffset\": 1176,\n      \"componentType\": 5126,\n      \"count\": 49,\n      \"max\": [\n        2\n      ],\n      \"min\": [\n        0\n      ],\n      \"type\": \"SCALAR\"\n    },\n    {\n      \"bufferView\": 1,\n      \"byteOffset\": 7056,\n      \"componentType\": 5126,\n      \"count\": 49,\n      \"max\": [\n        0,\n        0.24200910329818728,\n        0\n      ],\n      \"min\": [\n        0,\n        0.24200910329818728,\n        0\n      ],\n      \"type\": \"VEC3\"\n    },\n    {\n      \"bufferView\": 2,\n      \"byteOffset\": 4704,\n      \"componentType\": 5126,\n      \"count\": 49,\n      \"max\": [\n        0.005276965908706188,\n        -0.10532382130622864,\n        -0.0563904233276844,\n        -0.9007523059844972\n      ],\n      \"min\": [\n        -0.08755125850439072,\n        -0.15304648876190186,\n        -0.4198120832443238,\n        -0.989989936351776\n      ],\n      \"type\": \"VEC4\"\n    },\n    {\n      \"bufferView\": 1,\n      \"byteOffset\": 7644,\n      \"componentType\": 5126,\n      \"count\": 49,\n      \"max\": [\n        0.9999999403953552,\n        0.9999998807907104,\n        0.9999998807907104\n      ],\n      \"min\": [\n        0.9999994039535524,\n        0.9999992847442628,\n        0.9999995231628418\n      ],\n      \"type\": \"VEC3\"\n    },\n    {\n      \"bufferView\": 0,\n      \"byteOffset\": 1372,\n      \"componentType\": 5126,\n      \"count\": 49,\n      \"max\": [\n        2\n      ],\n      \"min\": [\n        0\n      ],\n      \"type\": \"SCALAR\"\n    },\n    {\n      \"bufferView\": 1,\n      \"byteOffset\": 8232,\n      \"componentType\": 5126,\n      \"count\": 49,\n      \"max\": [\n        -2.98022992950564e-8,\n        0.18779130280017856,\n        0\n      ],\n      \"min\": [\n        -2.98022992950564e-8,\n        0.18779130280017856,\n        0\n      ],\n      \"type\": \"VEC3\"\n    },\n    {\n      \"bufferView\": 2,\n      \"byteOffset\": 5488,\n      \"componentType\": 5126,\n      \"count\": 49,\n      \"max\": [\n        0.04831664264202118,\n        -0.03682959079742432,\n        0.1515040546655655,\n        -0.9875762462615968\n      ],\n      \"min\": [\n        -0.01958325318992138,\n        -0.043389420956373215,\n        -0.0806758776307106,\n        -0.9989553689956664\n      ],\n      \"type\": \"VEC4\"\n    },\n    {\n      \"bufferView\": 1,\n      \"byteOffset\": 8820,\n      \"componentType\": 5126,\n      \"count\": 49,\n      \"max\": [\n        1.000000238418579,\n        1.0000009536743164,\n        1.0000005960464478\n      ],\n      \"min\": [\n        0.9999997615814208,\n        1.0000005960464478,\n        1.000000238418579\n      ],\n      \"type\": \"VEC3\"\n    },\n    {\n      \"bufferView\": 0,\n      \"byteOffset\": 1568,\n      \"componentType\": 5126,\n      \"count\": 49,\n      \"max\": [\n        2\n      ],\n      \"min\": [\n        0\n      ],\n      \"type\": \"SCALAR\"\n    },\n    {\n      \"bufferView\": 1,\n      \"byteOffset\": 9408,\n      \"componentType\": 5126,\n      \"count\": 49,\n      \"max\": [\n        -0.0879998505115509,\n        0.00006264450348680839,\n        -0.00006240609945962206\n      ],\n      \"min\": [\n        -0.0880000963807106,\n        0.00006249549915082753,\n        -0.00006282330286921933\n      ],\n      \"type\": \"VEC3\"\n    },\n    {\n      \"bufferView\": 2,\n      \"byteOffset\": 6272,\n      \"componentType\": 5126,\n      \"count\": 49,\n      \"max\": [\n        0.6748494505882263,\n        0.31521570682525635,\n        -0.300369679927826,\n        -0.3483264744281769\n      ],\n      \"min\": [\n        0.3661315143108368,\n        0.09874838590621948,\n        -0.6449660062789917,\n        -0.8451733589172363\n      ],\n      \"type\": \"VEC4\"\n    },\n    {\n      \"bufferView\": 1,\n      \"byteOffset\": 9996,\n      \"componentType\": 5126,\n      \"count\": 49,\n      \"max\": [\n        1.0000001192092896,\n        1.0000001192092896,\n        1\n      ],\n      \"min\": [\n        0.9999997615814208,\n        0.9999996423721313,\n        0.9999996423721313\n      ],\n      \"type\": \"VEC3\"\n    },\n    {\n      \"bufferView\": 0,\n      \"byteOffset\": 1764,\n      \"componentType\": 5126,\n      \"count\": 49,\n      \"max\": [\n        2\n      ],\n      \"min\": [\n        0\n      ],\n      \"type\": \"SCALAR\"\n    },\n    {\n      \"bufferView\": 1,\n      \"byteOffset\": 10584,\n      \"componentType\": 5126,\n      \"count\": 49,\n      \"max\": [\n        0,\n        0.24200810492038727,\n        0\n      ],\n      \"min\": [\n        0,\n        0.24200810492038727,\n        0\n      ],\n      \"type\": \"VEC3\"\n    },\n    {\n      \"bufferView\": 2,\n      \"byteOffset\": 7056,\n      \"componentType\": 5126,\n      \"count\": 49,\n      \"max\": [\n        -0.003387797623872757,\n        0.9475951790809632,\n        -0.0798693522810936,\n        -0.3012830018997193\n      ],\n      \"min\": [\n        -0.12710869312286377,\n        0.916045308113098,\n        -0.2270231395959854,\n        -0.3146948218345642\n      ],\n      \"type\": \"VEC4\"\n    },\n    {\n      \"bufferView\": 1,\n      \"byteOffset\": 11172,\n      \"componentType\": 5126,\n      \"count\": 49,\n      \"max\": [\n        1.0000003576278689,\n        0.9999998807907104,\n        1.0000001192092896\n      ],\n      \"min\": [\n        0.9999999403953552,\n        0.9999995231628418,\n        0.999999701976776\n      ],\n      \"type\": \"VEC3\"\n    },\n    {\n      \"bufferView\": 0,\n      \"byteOffset\": 1960,\n      \"componentType\": 5126,\n      \"count\": 49,\n      \"max\": [\n        2\n      ],\n      \"min\": [\n        0\n      ],\n      \"type\": \"SCALAR\"\n    },\n    {\n      \"bufferView\": 1,\n      \"byteOffset\": 11760,\n      \"componentType\": 5126,\n      \"count\": 49,\n      \"max\": [\n        0,\n        0.1877920925617218,\n        0\n      ],\n      \"min\": [\n        0,\n        0.1877920925617218,\n        0\n      ],\n      \"type\": \"VEC3\"\n    },\n    {\n      \"bufferView\": 2,\n      \"byteOffset\": 7840,\n      \"componentType\": 5126,\n      \"count\": 49,\n      \"max\": [\n        0.15000686049461365,\n        0.2620651721954346,\n        0.06808223575353622,\n        -0.9487173557281494\n      ],\n      \"min\": [\n        -0.0010455237934365869,\n        0.2568579018115998,\n        -0.10152826458215714,\n        -0.9656248688697816\n      ],\n      \"type\": \"VEC4\"\n    },\n    {\n      \"bufferView\": 1,\n      \"byteOffset\": 12348,\n      \"componentType\": 5126,\n      \"count\": 49,\n      \"max\": [\n        1.0000001192092896,\n        1.0000009536743164,\n        1\n      ],\n      \"min\": [\n        0.9999996423721313,\n        1.0000003576278689,\n        0.999999463558197\n      ],\n      \"type\": \"VEC3\"\n    },\n    {\n      \"bufferView\": 0,\n      \"byteOffset\": 2156,\n      \"componentType\": 5126,\n      \"count\": 49,\n      \"max\": [\n        2\n      ],\n      \"min\": [\n        0\n      ],\n      \"type\": \"SCALAR\"\n    },\n    {\n      \"bufferView\": 1,\n      \"byteOffset\": 12936,\n      \"componentType\": 5126,\n      \"count\": 49,\n      \"max\": [\n        0.06761906296014786,\n        -0.02851865068078041,\n        -0.06296355277299881\n      ],\n      \"min\": [\n        0.0676189586520195,\n        -0.028518760576844215,\n        -0.06296365708112717\n      ],\n      \"type\": \"VEC3\"\n    },\n    {\n      \"bufferView\": 2,\n      \"byteOffset\": 8624,\n      \"componentType\": 5126,\n      \"count\": 49,\n      \"max\": [\n        0.301033079624176,\n        -0.20796972513198853,\n        0.92630273103714,\n        -0.08994945138692856\n      ],\n      \"min\": [\n        0.1658332496881485,\n        -0.7997090816497803,\n        0.4959096908569336,\n        -0.3118112683296204\n      ],\n      \"type\": \"VEC4\"\n    },\n    {\n      \"bufferView\": 1,\n      \"byteOffset\": 13524,\n      \"componentType\": 5126,\n      \"count\": 49,\n      \"max\": [\n        1.0000008344650269,\n        1,\n        0.9999999403953552\n      ],\n      \"min\": [\n        1.0000003576278689,\n        0.9999995231628418,\n        0.9999996423721313\n      ],\n      \"type\": \"VEC3\"\n    },\n    {\n      \"bufferView\": 0,\n      \"byteOffset\": 2352,\n      \"componentType\": 5126,\n      \"count\": 49,\n      \"max\": [\n        2\n      ],\n      \"min\": [\n        0\n      ],\n      \"type\": \"SCALAR\"\n    },\n    {\n      \"bufferView\": 1,\n      \"byteOffset\": 14112,\n      \"componentType\": 5126,\n      \"count\": 49,\n      \"max\": [\n        -1.4901200273698123e-8,\n        0.26611289381980896,\n        0\n      ],\n      \"min\": [\n        -1.4901200273698123e-8,\n        0.26611289381980896,\n        0\n      ],\n      \"type\": \"VEC3\"\n    },\n    {\n      \"bufferView\": 2,\n      \"byteOffset\": 9408,\n      \"componentType\": 5126,\n      \"count\": 49,\n      \"max\": [\n        0.8112500905990601,\n        -0.1822210103273392,\n        0.032220568507909775,\n        -0.4743982553482056\n      ],\n      \"min\": [\n        -0.03036016784608364,\n        -0.3419179916381836,\n        -0.28916242718696594,\n        -0.9452491998672484\n      ],\n      \"type\": \"VEC4\"\n    },\n    {\n      \"bufferView\": 1,\n      \"byteOffset\": 14700,\n      \"componentType\": 5126,\n      \"count\": 49,\n      \"max\": [\n        0.9999994039535524,\n        1.000000238418579,\n        1.000000238418579\n      ],\n      \"min\": [\n        0.9999989867210388,\n        0.9999996423721313,\n        0.9999994039535524\n      ],\n      \"type\": \"VEC3\"\n    },\n    {\n      \"bufferView\": 0,\n      \"byteOffset\": 2548,\n      \"componentType\": 5126,\n      \"count\": 49,\n      \"max\": [\n        2\n      ],\n      \"min\": [\n        0\n      ],\n      \"type\": \"SCALAR\"\n    },\n    {\n      \"bufferView\": 1,\n      \"byteOffset\": 15288,\n      \"componentType\": 5126,\n      \"count\": 49,\n      \"max\": [\n        0,\n        0.2758241891860962,\n        0\n      ],\n      \"min\": [\n        0,\n        0.2758241891860962,\n        0\n      ],\n      \"type\": \"VEC3\"\n    },\n    {\n      \"bufferView\": 2,\n      \"byteOffset\": 10192,\n      \"componentType\": 5126,\n      \"count\": 49,\n      \"max\": [\n        0.9907974004745485,\n        -0.0014961245469748974,\n        0.02489613927900791,\n        -0.13506969809532166\n      ],\n      \"min\": [\n        0.8542653322219849,\n        -0.05430477112531662,\n        -0.00011262076441198587,\n        -0.5192484259605408\n      ],\n      \"type\": \"VEC4\"\n    },\n    {\n      \"bufferView\": 1,\n      \"byteOffset\": 15876,\n      \"componentType\": 5126,\n      \"count\": 49,\n      \"max\": [\n        1.0000005960464478,\n        1.0000003576278689,\n        1.0000004768371584\n      ],\n      \"min\": [\n        1.0000001192092896,\n        0.9999999403953552,\n        1\n      ],\n      \"type\": \"VEC3\"\n    },\n    {\n      \"bufferView\": 0,\n      \"byteOffset\": 2744,\n      \"componentType\": 5126,\n      \"count\": 49,\n      \"max\": [\n        2\n      ],\n      \"min\": [\n        0\n      ],\n      \"type\": \"SCALAR\"\n    },\n    {\n      \"bufferView\": 1,\n      \"byteOffset\": 16464,\n      \"componentType\": 5126,\n      \"count\": 49,\n      \"max\": [\n        -0.002346449065953493,\n        -0.06617332249879837,\n        0.02785664983093739\n      ],\n      \"min\": [\n        -0.002346470952033997,\n        -0.06617333739995956,\n        0.02785659022629261\n      ],\n      \"type\": \"VEC3\"\n    },\n    {\n      \"bufferView\": 2,\n      \"byteOffset\": 10976,\n      \"componentType\": 5126,\n      \"count\": 49,\n      \"max\": [\n        0.020624300464987755,\n        -0.23465925455093384,\n        0.9716955423355104,\n        0.0638260766863823\n      ],\n      \"min\": [\n        0.003326366888359189,\n        -0.5406339168548584,\n        0.8410344123840332,\n        0.016216862946748737\n      ],\n      \"type\": \"VEC4\"\n    },\n    {\n      \"bufferView\": 1,\n      \"byteOffset\": 17052,\n      \"componentType\": 5126,\n      \"count\": 49,\n      \"max\": [\n        1.0000001192092896,\n        1.0000009536743164,\n        1.0000005960464478\n      ],\n      \"min\": [\n        0.9999997615814208,\n        1.000000238418579,\n        0.9999998211860656\n      ],\n      \"type\": \"VEC3\"\n    },\n    {\n      \"bufferView\": 0,\n      \"byteOffset\": 2940,\n      \"componentType\": 5126,\n      \"count\": 49,\n      \"max\": [\n        2\n      ],\n      \"min\": [\n        0\n      ],\n      \"type\": \"SCALAR\"\n    },\n    {\n      \"bufferView\": 1,\n      \"byteOffset\": 17640,\n      \"componentType\": 5126,\n      \"count\": 49,\n      \"max\": [\n        -0.06845708936452866,\n        -0.028570100665092468,\n        -0.062949538230896\n      ],\n      \"min\": [\n        -0.06845712661743164,\n        -0.02857035957276821,\n        -0.06294971704483032\n      ],\n      \"type\": \"VEC3\"\n    },\n    {\n      \"bufferView\": 2,\n      \"byteOffset\": 11760,\n      \"componentType\": 5126,\n      \"count\": 49,\n      \"max\": [\n        -0.018168065696954727,\n        -0.18232035636901855,\n        0.9812799096107484,\n        0.117560513317585\n      ],\n      \"min\": [\n        -0.07457219809293747,\n        -0.902503490447998,\n        0.4130511581897736,\n        0.03284534439444542\n      ],\n      \"type\": \"VEC4\"\n    },\n    {\n      \"bufferView\": 1,\n      \"byteOffset\": 18228,\n      \"componentType\": 5126,\n      \"count\": 49,\n      \"max\": [\n        1.000000238418579,\n        1.000000238418579,\n        1.0000003576278689\n      ],\n      \"min\": [\n        0.9999998211860656,\n        0.9999995231628418,\n        0.9999996423721313\n      ],\n      \"type\": \"VEC3\"\n    },\n    {\n      \"bufferView\": 0,\n      \"byteOffset\": 3136,\n      \"componentType\": 5126,\n      \"count\": 49,\n      \"max\": [\n        2\n      ],\n      \"min\": [\n        0\n      ],\n      \"type\": \"SCALAR\"\n    },\n    {\n      \"bufferView\": 1,\n      \"byteOffset\": 18816,\n      \"componentType\": 5126,\n      \"count\": 49,\n      \"max\": [\n        -1.1175900205273592e-8,\n        0.26611149311065674,\n        0\n      ],\n      \"min\": [\n        -1.1175900205273592e-8,\n        0.26611149311065674,\n        0\n      ],\n      \"type\": \"VEC3\"\n    },\n    {\n      \"bufferView\": 2,\n      \"byteOffset\": 12544,\n      \"componentType\": 5126,\n      \"count\": 49,\n      \"max\": [\n        0.8507033586502075,\n        0.14946134388446808,\n        0.04984175786376,\n        -0.5191445350646973\n      ],\n      \"min\": [\n        -0.06756377220153809,\n        0.06949601322412491,\n        -0.026268262416124344,\n        -0.9922308921813964\n      ],\n      \"type\": \"VEC4\"\n    },\n    {\n      \"bufferView\": 1,\n      \"byteOffset\": 19404,\n      \"componentType\": 5126,\n      \"count\": 49,\n      \"max\": [\n        1.0000005960464478,\n        1.000000238418579,\n        1.0000005960464478\n      ],\n      \"min\": [\n        1.0000001192092896,\n        0.9999995231628418,\n        0.9999998211860656\n      ],\n      \"type\": \"VEC3\"\n    },\n    {\n      \"bufferView\": 0,\n      \"byteOffset\": 3332,\n      \"componentType\": 5126,\n      \"count\": 49,\n      \"max\": [\n        2\n      ],\n      \"min\": [\n        0\n      ],\n      \"type\": \"SCALAR\"\n    },\n    {\n      \"bufferView\": 1,\n      \"byteOffset\": 19992,\n      \"componentType\": 5126,\n      \"count\": 49,\n      \"max\": [\n        0,\n        0.2758249044418335,\n        0\n      ],\n      \"min\": [\n        0,\n        0.2758249044418335,\n        0\n      ],\n      \"type\": \"VEC3\"\n    },\n    {\n      \"bufferView\": 2,\n      \"byteOffset\": 13328,\n      \"componentType\": 5126,\n      \"count\": 49,\n      \"max\": [\n        0.99649316072464,\n        -0.01710231974720955,\n        -0.022676724940538406,\n        -0.07459255307912827\n      ],\n      \"min\": [\n        0.8792483806610107,\n        -0.04609288275241852,\n        -0.06820148974657059,\n        -0.4750169813632965\n      ],\n      \"type\": \"VEC4\"\n    },\n    {\n      \"bufferView\": 1,\n      \"byteOffset\": 20580,\n      \"componentType\": 5126,\n      \"count\": 49,\n      \"max\": [\n        0.9999995827674866,\n        1,\n        1.0000003576278689\n      ],\n      \"min\": [\n        0.9999991655349731,\n        0.9999995231628418,\n        0.9999999403953552\n      ],\n      \"type\": \"VEC3\"\n    },\n    {\n      \"bufferView\": 0,\n      \"byteOffset\": 3528,\n      \"componentType\": 5126,\n      \"count\": 49,\n      \"max\": [\n        2\n      ],\n      \"min\": [\n        0\n      ],\n      \"type\": \"SCALAR\"\n    },\n    {\n      \"bufferView\": 1,\n      \"byteOffset\": 21168,\n      \"componentType\": 5126,\n      \"count\": 49,\n      \"max\": [\n        -0.0014585109893232584,\n        -0.06619886308908463,\n        0.02785670943558216\n      ],\n      \"min\": [\n        -0.0014585329918190837,\n        -0.06619889289140701,\n        0.02785669080913067\n      ],\n      \"type\": \"VEC3\"\n    },\n    {\n      \"bufferView\": 2,\n      \"byteOffset\": 14112,\n      \"componentType\": 5126,\n      \"count\": 49,\n      \"max\": [\n        -0.009607579559087753,\n        -0.2635453343391419,\n        0.9620476961135864,\n        0.06995902955532074\n      ],\n      \"min\": [\n        -0.04577624797821045,\n        -0.4899238646030426,\n        0.8689604997634888,\n        -0.06424159556627274\n      ],\n      \"type\": \"VEC4\"\n    },\n    {\n      \"bufferView\": 1,\n      \"byteOffset\": 21756,\n      \"componentType\": 5126,\n      \"count\": 49,\n      \"max\": [\n        0.9999996423721313,\n        1.0000003576278689,\n        0.9999998807907104\n      ],\n      \"min\": [\n        0.9999991655349731,\n        0.9999997615814208,\n        0.9999994039535524\n      ],\n      \"type\": \"VEC3\"\n    },\n    {\n      \"bufferView\": 3,\n      \"byteOffset\": 0,\n      \"componentType\": 5126,\n      \"count\": 19,\n      \"max\": [\n        0.780990481376648,\n        0.9918341040611268,\n        0.9992613196372986,\n        0,\n        1,\n        0.8904603719711304,\n        0.6854007244110107,\n        0,\n        0.79917311668396,\n        0.9999359250068665,\n        0.997134804725647,\n        0,\n        0.20702040195465088,\n        0.5989438891410828,\n        1.001250982284546,\n        1\n      ],\n      \"min\": [\n        -0.9985063076019288,\n        -0.9971349835395812,\n        -0.9999359250068665,\n        0,\n        -1,\n        -0.8904621005058289,\n        -0.4517692029476166,\n        0,\n        -0.18484599888324735,\n        -0.9853218197822572,\n        -0.997802197933197,\n        0,\n        -0.811928927898407,\n        -1.18982994556427,\n        -1.058609962463379,\n        1\n      ],\n      \"type\": \"MAT4\"\n    },\n    {\n      \"componentType\": 5123,\n      \"count\": 14016,\n      \"max\": [\n        3272\n      ],\n      \"min\": [\n        0\n      ],\n      \"type\": \"SCALAR\"\n    },\n    {\n      \"componentType\": 5123,\n      \"count\": 3273,\n      \"max\": [\n        18,\n        18,\n        18,\n        18\n      ],\n      \"min\": [\n        0,\n        0,\n        0,\n        0\n      ],\n      \"type\": \"VEC4\"\n    },\n    {\n      \"componentType\": 5126,\n      \"count\": 3273,\n      \"max\": [\n        1,\n        0.9999808073043824,\n        0.9944446086883544\n      ],\n      \"min\": [\n        -1,\n        -0.9999808073043824,\n        -1\n      ],\n      \"type\": \"VEC3\"\n    },\n    {\n      \"componentType\": 5126,\n      \"count\": 3273,\n      \"max\": [\n        0.1809539943933487,\n        0.569136917591095,\n        1.5065499544143677\n      ],\n      \"min\": [\n        -0.13099999725818637,\n        -0.5691370964050293,\n        0\n      ],\n      \"type\": \"VEC3\"\n    },\n    {\n      \"componentType\": 5126,\n      \"count\": 3273,\n      \"max\": [\n        0.990805983543396,\n        0.9880298972129822\n      ],\n      \"min\": [\n        0.014079390093684196,\n        0.008445978164672852\n      ],\n      \"type\": \"VEC2\"\n    },\n    {\n      \"componentType\": 5126,\n      \"count\": 3273,\n      \"max\": [\n        1,\n        0.989919900894165,\n        0.951076328754425,\n        0.8741077184677124\n      ],\n      \"min\": [\n        0.010080150328576565,\n        0,\n        0,\n        0\n      ],\n      \"type\": \"VEC4\"\n    }\n  ],\n  \"materials\": [\n    {\n      \"pbrMetallicRoughness\": {\n        \"baseColorTexture\": {\n          \"index\": 0\n        },\n        \"metallicFactor\": 0\n      },\n      \"emissiveFactor\": [\n        0,\n        0,\n        0\n      ],\n      \"name\": \"Cesium_Man-effect\"\n    }\n  ],\n  \"textures\": [\n    {\n      \"sampler\": 0,\n      \"source\": 0\n    }\n  ],\n  \"images\": [\n    {\n      \"uri\": \"CesiumMan.jpg\"\n    }\n  ],\n  \"samplers\": [\n    {\n      \"magFilter\": 9729,\n      \"minFilter\": 9986,\n      \"wrapS\": 10497,\n      \"wrapT\": 10497\n    }\n  ],\n  \"bufferViews\": [\n    {\n      \"buffer\": 0,\n      \"byteOffset\": 0,\n      \"byteLength\": 3724\n    },\n    {\n      \"buffer\": 0,\n      \"byteOffset\": 3724,\n      \"byteLength\": 22344\n    },\n    {\n      \"buffer\": 0,\n      \"byteOffset\": 26068,\n      \"byteLength\": 14896\n    },\n    {\n      \"buffer\": 0,\n      \"byteOffset\": 40964,\n      \"byteLength\": 1216\n    },\n    {\n      \"buffer\": 0,\n      \"byteOffset\": 42180,\n      \"byteLength\": 27757\n    }\n  ],\n  \"buffers\": [\n    {\n      \"byteLength\": 69937,\n      \"uri\": \"0.bin\"\n    }\n  ],\n  \"extensionsRequired\": [\n    \"KHR_draco_mesh_compression\"\n  ],\n  \"extensionsUsed\": [\n    \"KHR_draco_mesh_compression\"\n  ]\n}\n"
  },
  {
    "path": "examples/resources/models/gltf/CesiumMan/glTF-Embedded/CesiumMan.gltf",
    "content": "{\n    \"asset\": {\n        \"generator\": \"COLLADA2GLTF\",\n        \"version\": \"2.0\"\n    },\n    \"scene\": 0,\n    \"scenes\": [\n        {\n            \"nodes\": [\n                0\n            ]\n        }\n    ],\n    \"nodes\": [\n        {\n            \"children\": [\n                21,\n                1\n            ],\n            \"matrix\": [\n                1.0,\n                0.0,\n                0.0,\n                0.0,\n                0.0,\n                0.0,\n                -1.0,\n                0.0,\n                0.0,\n                1.0,\n                0.0,\n                0.0,\n                0.0,\n                0.0,\n                0.0,\n                1.0\n            ]\n        },\n        {\n            \"mesh\": 0,\n            \"skin\": 0\n        },\n        {\n            \"children\": [\n                11,\n                7,\n                3\n            ],\n            \"translation\": [\n                -3.352759847530251e-8,\n                0.00499989278614521,\n                0.6789997816085815\n            ],\n            \"rotation\": [\n                -0.02679471485316753,\n                -0.026732556521892549,\n                -0.7065614461898804,\n                -0.706638753414154\n            ],\n            \"scale\": [\n                0.9999999403953552,\n                0.9999998211860656,\n                0.9999999403953552\n            ]\n        },\n        {\n            \"children\": [\n                4\n            ],\n            \"translation\": [\n                -0.06804201006889343,\n                -0.02857022918760777,\n                -0.06294959783554077\n            ],\n            \"rotation\": [\n                -0.06642699986696243,\n                -0.6115013957023621,\n                0.7850273251533508,\n                0.073387511074543\n            ],\n            \"scale\": [\n                0.9999999403953552,\n                1.000000238418579,\n                1.0\n            ]\n        },\n        {\n            \"children\": [\n                5\n            ],\n            \"translation\": [\n                0.0,\n                0.2661114931106568,\n                0.0\n            ],\n            \"rotation\": [\n                0.2162912338972092,\n                0.12430649250745774,\n                0.0015752052422612906,\n                -0.9683818817138672\n            ],\n            \"scale\": [\n                1.0,\n                0.9999998807907105,\n                1.0\n            ]\n        },\n        {\n            \"children\": [\n                6\n            ],\n            \"translation\": [\n                0.0,\n                0.2758249044418335,\n                -1.1175900205273593e-8\n            ],\n            \"rotation\": [\n                0.8472740650177002,\n                -0.029564039781689645,\n                -0.020868001505732538,\n                -0.5299217700958252\n            ],\n            \"scale\": [\n                0.9999999403953552,\n                0.9999998807907105,\n                1.0\n            ]\n        },\n        {\n            \"translation\": [\n                -0.001458480954170227,\n                -0.06619883328676224,\n                0.027856720611453058\n            ],\n            \"rotation\": [\n                -0.03726436197757721,\n                -0.31931325793266299,\n                0.9460535645484924,\n                -0.040414959192276\n            ],\n            \"scale\": [\n                1.0,\n                1.0000003576278689,\n                1.0000005960464478\n            ]\n        },\n        {\n            \"children\": [\n                8\n            ],\n            \"translation\": [\n                0.06803668290376663,\n                -0.028518669307231904,\n                -0.06296277046203613\n            ],\n            \"rotation\": [\n                0.2475697100162506,\n                -0.5775680541992188,\n                0.7479144334793091,\n                -0.2138892114162445\n            ],\n            \"scale\": [\n                1.0,\n                1.000000238418579,\n                1.0000001192092896\n            ]\n        },\n        {\n            \"children\": [\n                9\n            ],\n            \"translation\": [\n                3.725289854372704e-9,\n                0.2661128044128418,\n                1.4901200273698124e-8\n            ],\n            \"rotation\": [\n                0.20902779698371888,\n                -0.32988959550857546,\n                -0.05559924244880676,\n                -0.9189064502716065\n            ],\n            \"scale\": [\n                1.0,\n                1.0000001192092896,\n                1.0000001192092896\n            ]\n        },\n        {\n            \"children\": [\n                10\n            ],\n            \"translation\": [\n                -7.450579708745408e-9,\n                0.2758241891860962,\n                5.5879398885849708e-9\n            ],\n            \"rotation\": [\n                0.8477396965026856,\n                -0.004254077095538378,\n                -0.009491981938481333,\n                -0.5303107500076294\n            ],\n            \"scale\": [\n                0.9999998807907105,\n                1.0000001192092896,\n                1.0000001192092896\n            ]\n        },\n        {\n            \"translation\": [\n                -0.002346522873267532,\n                -0.06617332994937897,\n                0.027856789529323576\n            ],\n            \"rotation\": [\n                0.026573536917567254,\n                -0.3201442956924439,\n                0.9445450901985169,\n                0.06808964908123017\n            ],\n            \"scale\": [\n                1.0,\n                1.000000238418579,\n                1.000000238418579\n            ]\n        },\n        {\n            \"children\": [\n                12\n            ],\n            \"translation\": [\n                -1.024449947095718e-8,\n                1.4901200273698124e-8,\n                0.14541690051555634\n            ],\n            \"rotation\": [\n                -0.6572523713111877,\n                -0.00017969288455788046,\n                -0.00010428009409224616,\n                -0.7536706328392029\n            ],\n            \"scale\": [\n                1.0,\n                1.0,\n                1.0000001192092896\n            ]\n        },\n        {\n            \"children\": [\n                19,\n                16,\n                13\n            ],\n            \"translation\": [\n                4.6566100975198307e-10,\n                0.250516802072525,\n                3.725289854372704e-9\n            ],\n            \"rotation\": [\n                0.6226037740707398,\n                0.00001678345142863691,\n                -0.0000031824047255213374,\n                -0.7825372219085693\n            ],\n            \"scale\": [\n                1.0,\n                1.0,\n                0.9999999403953552\n            ]\n        },\n        {\n            \"children\": [\n                14\n            ],\n            \"translation\": [\n                -0.09098775684833528,\n                0.00006259980000322685,\n                -0.00006532669794978574\n            ],\n            \"rotation\": [\n                0.2964428961277008,\n                0.031510334461927417,\n                -0.6522551774978638,\n                -0.6969160437583923\n            ],\n            \"scale\": [\n                1.0000001192092896,\n                0.9999999403953552,\n                1.0000001192092896\n            ]\n        },\n        {\n            \"children\": [\n                15\n            ],\n            \"translation\": [\n                0.0,\n                0.24200820922851566,\n                -5.96045985901128e-8\n            ],\n            \"rotation\": [\n                -0.1887933611869812,\n                0.9157071709632874,\n                -0.16780903935432438,\n                -0.3125341236591339\n            ],\n            \"scale\": [\n                0.9999999403953552,\n                0.9999999403953552,\n                0.9999998807907105\n            ]\n        },\n        {\n            \"translation\": [\n                0.0,\n                0.18779200315475465,\n                0.0\n            ],\n            \"rotation\": [\n                -0.058613914996385577,\n                0.2637767195701599,\n                0.05226854607462883,\n                -0.9613814353942872\n            ],\n            \"scale\": [\n                1.0,\n                1.0000001192092896,\n                0.9999999403953552\n            ]\n        },\n        {\n            \"children\": [\n                17\n            ],\n            \"translation\": [\n                0.0910135880112648,\n                0.000014185899999574758,\n                -0.000058054902183357629\n            ],\n            \"rotation\": [\n                0.6797328591346741,\n                0.689685583114624,\n                -0.2269716113805771,\n                -0.10383165627717972\n            ],\n            \"scale\": [\n                1.0000001192092896,\n                1.0000001192092896,\n                1.0\n            ]\n        },\n        {\n            \"children\": [\n                18\n            ],\n            \"translation\": [\n                1.1641500263781524e-10,\n                0.2420089989900589,\n                0.0\n            ],\n            \"rotation\": [\n                -0.013960935175418854,\n                -0.12937255203723908,\n                -0.2522056996822357,\n                -0.9588848352432252\n            ],\n            \"scale\": [\n                1.0,\n                0.9999999403953552,\n                1.0\n            ]\n        },\n        {\n            \"translation\": [\n                1.4901200273698124e-8,\n                0.18779149651527408,\n                5.96045985901128e-8\n            ],\n            \"rotation\": [\n                0.006119169760495424,\n                -0.042325541377067569,\n                -0.07877591997385025,\n                -0.9959746599197388\n            ],\n            \"scale\": [\n                0.9999998807907105,\n                1.000000238418579,\n                0.9999999403953552\n            ]\n        },\n        {\n            \"children\": [\n                20\n            ],\n            \"translation\": [\n                -8.847560017954948e-9,\n                5.96045985901128e-8,\n                0.06483662128448487\n            ],\n            \"rotation\": [\n                -0.6606296300888062,\n                0.00008344435627805069,\n                0.0000710925814928487,\n                -0.750711977481842\n            ]\n        },\n        {\n            \"translation\": [\n                0.0,\n                0.0520397387444973,\n                0.0\n            ],\n            \"rotation\": [\n                0.000002552607384131989,\n                0.9996904730796814,\n                -0.02487966977059841,\n                -4.329927776325349e-7\n            ],\n            \"scale\": [\n                1.0,\n                1.0000001192092896,\n                1.0\n            ]\n        },\n        {\n            \"children\": [\n                2\n            ]\n        }\n    ],\n    \"meshes\": [\n        {\n            \"primitives\": [\n                {\n                    \"attributes\": {\n                        \"JOINTS_0\": 1,\n                        \"NORMAL\": 2,\n                        \"POSITION\": 3,\n                        \"TEXCOORD_0\": 4,\n                        \"WEIGHTS_0\": 5\n                    },\n                    \"indices\": 0,\n                    \"mode\": 4,\n                    \"material\": 0\n                }\n            ],\n            \"name\": \"Cesium_Man\"\n        }\n    ],\n    \"animations\": [\n        {\n            \"channels\": [\n                {\n                    \"sampler\": 0,\n                    \"target\": {\n                        \"node\": 2,\n                        \"path\": \"translation\"\n                    }\n                },\n                {\n                    \"sampler\": 1,\n                    \"target\": {\n                        \"node\": 2,\n                        \"path\": \"rotation\"\n                    }\n                },\n                {\n                    \"sampler\": 2,\n                    \"target\": {\n                        \"node\": 2,\n                        \"path\": \"scale\"\n                    }\n                }\n            ],\n            \"samplers\": [\n                {\n                    \"input\": 6,\n                    \"interpolation\": \"LINEAR\",\n                    \"output\": 7\n                },\n                {\n                    \"input\": 6,\n                    \"interpolation\": \"LINEAR\",\n                    \"output\": 8\n                },\n                {\n                    \"input\": 6,\n                    \"interpolation\": \"LINEAR\",\n                    \"output\": 9\n                }\n            ]\n        },\n        {\n            \"channels\": [\n                {\n                    \"sampler\": 0,\n                    \"target\": {\n                        \"node\": 11,\n                        \"path\": \"translation\"\n                    }\n                },\n                {\n                    \"sampler\": 1,\n                    \"target\": {\n                        \"node\": 11,\n                        \"path\": \"rotation\"\n                    }\n                },\n                {\n                    \"sampler\": 2,\n                    \"target\": {\n                        \"node\": 11,\n                        \"path\": \"scale\"\n                    }\n                }\n            ],\n            \"samplers\": [\n                {\n                    \"input\": 10,\n                    \"interpolation\": \"LINEAR\",\n                    \"output\": 11\n                },\n                {\n                    \"input\": 10,\n                    \"interpolation\": \"LINEAR\",\n                    \"output\": 12\n                },\n                {\n                    \"input\": 10,\n                    \"interpolation\": \"LINEAR\",\n                    \"output\": 13\n                }\n            ]\n        },\n        {\n            \"channels\": [\n                {\n                    \"sampler\": 0,\n                    \"target\": {\n                        \"node\": 12,\n                        \"path\": \"translation\"\n                    }\n                },\n                {\n                    \"sampler\": 1,\n                    \"target\": {\n                        \"node\": 12,\n                        \"path\": \"rotation\"\n                    }\n                },\n                {\n                    \"sampler\": 2,\n                    \"target\": {\n                        \"node\": 12,\n                        \"path\": \"scale\"\n                    }\n                }\n            ],\n            \"samplers\": [\n                {\n                    \"input\": 14,\n                    \"interpolation\": \"LINEAR\",\n                    \"output\": 15\n                },\n                {\n                    \"input\": 14,\n                    \"interpolation\": \"LINEAR\",\n                    \"output\": 16\n                },\n                {\n                    \"input\": 14,\n                    \"interpolation\": \"LINEAR\",\n                    \"output\": 17\n                }\n            ]\n        },\n        {\n            \"channels\": [\n                {\n                    \"sampler\": 0,\n                    \"target\": {\n                        \"node\": 19,\n                        \"path\": \"translation\"\n                    }\n                },\n                {\n                    \"sampler\": 1,\n                    \"target\": {\n                        \"node\": 19,\n                        \"path\": \"rotation\"\n                    }\n                },\n                {\n                    \"sampler\": 2,\n                    \"target\": {\n                        \"node\": 19,\n                        \"path\": \"scale\"\n                    }\n                }\n            ],\n            \"samplers\": [\n                {\n                    \"input\": 18,\n                    \"interpolation\": \"LINEAR\",\n                    \"output\": 19\n                },\n                {\n                    \"input\": 18,\n                    \"interpolation\": \"LINEAR\",\n                    \"output\": 20\n                },\n                {\n                    \"input\": 18,\n                    \"interpolation\": \"LINEAR\",\n                    \"output\": 21\n                }\n            ]\n        },\n        {\n            \"channels\": [\n                {\n                    \"sampler\": 0,\n                    \"target\": {\n                        \"node\": 20,\n                        \"path\": \"translation\"\n                    }\n                },\n                {\n                    \"sampler\": 1,\n                    \"target\": {\n                        \"node\": 20,\n                        \"path\": \"rotation\"\n                    }\n                },\n                {\n                    \"sampler\": 2,\n                    \"target\": {\n                        \"node\": 20,\n                        \"path\": \"scale\"\n                    }\n                }\n            ],\n            \"samplers\": [\n                {\n                    \"input\": 22,\n                    \"interpolation\": \"LINEAR\",\n                    \"output\": 23\n                },\n                {\n                    \"input\": 22,\n                    \"interpolation\": \"LINEAR\",\n                    \"output\": 24\n                },\n                {\n                    \"input\": 22,\n                    \"interpolation\": \"LINEAR\",\n                    \"output\": 25\n                }\n            ]\n        },\n        {\n            \"channels\": [\n                {\n                    \"sampler\": 0,\n                    \"target\": {\n                        \"node\": 16,\n                        \"path\": \"translation\"\n                    }\n                },\n                {\n                    \"sampler\": 1,\n                    \"target\": {\n                        \"node\": 16,\n                        \"path\": \"rotation\"\n                    }\n                },\n                {\n                    \"sampler\": 2,\n                    \"target\": {\n                        \"node\": 16,\n                        \"path\": \"scale\"\n                    }\n                }\n            ],\n            \"samplers\": [\n                {\n                    \"input\": 26,\n                    \"interpolation\": \"LINEAR\",\n                    \"output\": 27\n                },\n                {\n                    \"input\": 26,\n                    \"interpolation\": \"LINEAR\",\n                    \"output\": 28\n                },\n                {\n                    \"input\": 26,\n                    \"interpolation\": \"LINEAR\",\n                    \"output\": 29\n                }\n            ]\n        },\n        {\n            \"channels\": [\n                {\n                    \"sampler\": 0,\n                    \"target\": {\n                        \"node\": 17,\n                        \"path\": \"translation\"\n                    }\n                },\n                {\n                    \"sampler\": 1,\n                    \"target\": {\n                        \"node\": 17,\n                        \"path\": \"rotation\"\n                    }\n                },\n                {\n                    \"sampler\": 2,\n                    \"target\": {\n                        \"node\": 17,\n                        \"path\": \"scale\"\n                    }\n                }\n            ],\n            \"samplers\": [\n                {\n                    \"input\": 30,\n                    \"interpolation\": \"LINEAR\",\n                    \"output\": 31\n                },\n                {\n                    \"input\": 30,\n                    \"interpolation\": \"LINEAR\",\n                    \"output\": 32\n                },\n                {\n                    \"input\": 30,\n                    \"interpolation\": \"LINEAR\",\n                    \"output\": 33\n                }\n            ]\n        },\n        {\n            \"channels\": [\n                {\n                    \"sampler\": 0,\n                    \"target\": {\n                        \"node\": 18,\n                        \"path\": \"translation\"\n                    }\n                },\n                {\n                    \"sampler\": 1,\n                    \"target\": {\n                        \"node\": 18,\n                        \"path\": \"rotation\"\n                    }\n                },\n                {\n                    \"sampler\": 2,\n                    \"target\": {\n                        \"node\": 18,\n                        \"path\": \"scale\"\n                    }\n                }\n            ],\n            \"samplers\": [\n                {\n                    \"input\": 34,\n                    \"interpolation\": \"LINEAR\",\n                    \"output\": 35\n                },\n                {\n                    \"input\": 34,\n                    \"interpolation\": \"LINEAR\",\n                    \"output\": 36\n                },\n                {\n                    \"input\": 34,\n                    \"interpolation\": \"LINEAR\",\n                    \"output\": 37\n                }\n            ]\n        },\n        {\n            \"channels\": [\n                {\n                    \"sampler\": 0,\n                    \"target\": {\n                        \"node\": 13,\n                        \"path\": \"translation\"\n                    }\n                },\n                {\n                    \"sampler\": 1,\n                    \"target\": {\n                        \"node\": 13,\n                        \"path\": \"rotation\"\n                    }\n                },\n                {\n                    \"sampler\": 2,\n                    \"target\": {\n                        \"node\": 13,\n                        \"path\": \"scale\"\n                    }\n                }\n            ],\n            \"samplers\": [\n                {\n                    \"input\": 38,\n                    \"interpolation\": \"LINEAR\",\n                    \"output\": 39\n                },\n                {\n                    \"input\": 38,\n                    \"interpolation\": \"LINEAR\",\n                    \"output\": 40\n                },\n                {\n                    \"input\": 38,\n                    \"interpolation\": \"LINEAR\",\n                    \"output\": 41\n                }\n            ]\n        },\n        {\n            \"channels\": [\n                {\n                    \"sampler\": 0,\n                    \"target\": {\n                        \"node\": 14,\n                        \"path\": \"translation\"\n                    }\n                },\n                {\n                    \"sampler\": 1,\n                    \"target\": {\n                        \"node\": 14,\n                        \"path\": \"rotation\"\n                    }\n                },\n                {\n                    \"sampler\": 2,\n                    \"target\": {\n                        \"node\": 14,\n                        \"path\": \"scale\"\n                    }\n                }\n            ],\n            \"samplers\": [\n                {\n                    \"input\": 42,\n                    \"interpolation\": \"LINEAR\",\n                    \"output\": 43\n                },\n                {\n                    \"input\": 42,\n                    \"interpolation\": \"LINEAR\",\n                    \"output\": 44\n                },\n                {\n                    \"input\": 42,\n                    \"interpolation\": \"LINEAR\",\n                    \"output\": 45\n                }\n            ]\n        },\n        {\n            \"channels\": [\n                {\n                    \"sampler\": 0,\n                    \"target\": {\n                        \"node\": 15,\n                        \"path\": \"translation\"\n                    }\n                },\n                {\n                    \"sampler\": 1,\n                    \"target\": {\n                        \"node\": 15,\n                        \"path\": \"rotation\"\n                    }\n                },\n                {\n                    \"sampler\": 2,\n                    \"target\": {\n                        \"node\": 15,\n                        \"path\": \"scale\"\n                    }\n                }\n            ],\n            \"samplers\": [\n                {\n                    \"input\": 46,\n                    \"interpolation\": \"LINEAR\",\n                    \"output\": 47\n                },\n                {\n                    \"input\": 46,\n                    \"interpolation\": \"LINEAR\",\n                    \"output\": 48\n                },\n                {\n                    \"input\": 46,\n                    \"interpolation\": \"LINEAR\",\n                    \"output\": 49\n                }\n            ]\n        },\n        {\n            \"channels\": [\n                {\n                    \"sampler\": 0,\n                    \"target\": {\n                        \"node\": 7,\n                        \"path\": \"translation\"\n                    }\n                },\n                {\n                    \"sampler\": 1,\n                    \"target\": {\n                        \"node\": 7,\n                        \"path\": \"rotation\"\n                    }\n                },\n                {\n                    \"sampler\": 2,\n                    \"target\": {\n                        \"node\": 7,\n                        \"path\": \"scale\"\n                    }\n                }\n            ],\n            \"samplers\": [\n                {\n                    \"input\": 50,\n                    \"interpolation\": \"LINEAR\",\n                    \"output\": 51\n                },\n                {\n                    \"input\": 50,\n                    \"interpolation\": \"LINEAR\",\n                    \"output\": 52\n                },\n                {\n                    \"input\": 50,\n                    \"interpolation\": \"LINEAR\",\n                    \"output\": 53\n                }\n            ]\n        },\n        {\n            \"channels\": [\n                {\n                    \"sampler\": 0,\n                    \"target\": {\n                        \"node\": 8,\n                        \"path\": \"translation\"\n                    }\n                },\n                {\n                    \"sampler\": 1,\n                    \"target\": {\n                        \"node\": 8,\n                        \"path\": \"rotation\"\n                    }\n                },\n                {\n                    \"sampler\": 2,\n                    \"target\": {\n                        \"node\": 8,\n                        \"path\": \"scale\"\n                    }\n                }\n            ],\n            \"samplers\": [\n                {\n                    \"input\": 54,\n                    \"interpolation\": \"LINEAR\",\n                    \"output\": 55\n                },\n                {\n                    \"input\": 54,\n                    \"interpolation\": \"LINEAR\",\n                    \"output\": 56\n                },\n                {\n                    \"input\": 54,\n                    \"interpolation\": \"LINEAR\",\n                    \"output\": 57\n                }\n            ]\n        },\n        {\n            \"channels\": [\n                {\n                    \"sampler\": 0,\n                    \"target\": {\n                        \"node\": 9,\n                        \"path\": \"translation\"\n                    }\n                },\n                {\n                    \"sampler\": 1,\n                    \"target\": {\n                        \"node\": 9,\n                        \"path\": \"rotation\"\n                    }\n                },\n                {\n                    \"sampler\": 2,\n                    \"target\": {\n                        \"node\": 9,\n                        \"path\": \"scale\"\n                    }\n                }\n            ],\n            \"samplers\": [\n                {\n                    \"input\": 58,\n                    \"interpolation\": \"LINEAR\",\n                    \"output\": 59\n                },\n                {\n                    \"input\": 58,\n                    \"interpolation\": \"LINEAR\",\n                    \"output\": 60\n                },\n                {\n                    \"input\": 58,\n                    \"interpolation\": \"LINEAR\",\n                    \"output\": 61\n                }\n            ]\n        },\n        {\n            \"channels\": [\n                {\n                    \"sampler\": 0,\n                    \"target\": {\n                        \"node\": 10,\n                        \"path\": \"translation\"\n                    }\n                },\n                {\n                    \"sampler\": 1,\n                    \"target\": {\n                        \"node\": 10,\n                        \"path\": \"rotation\"\n                    }\n                },\n                {\n                    \"sampler\": 2,\n                    \"target\": {\n                        \"node\": 10,\n                        \"path\": \"scale\"\n                    }\n                }\n            ],\n            \"samplers\": [\n                {\n                    \"input\": 62,\n                    \"interpolation\": \"LINEAR\",\n                    \"output\": 63\n                },\n                {\n                    \"input\": 62,\n                    \"interpolation\": \"LINEAR\",\n                    \"output\": 64\n                },\n                {\n                    \"input\": 62,\n                    \"interpolation\": \"LINEAR\",\n                    \"output\": 65\n                }\n            ]\n        },\n        {\n            \"channels\": [\n                {\n                    \"sampler\": 0,\n                    \"target\": {\n                        \"node\": 3,\n                        \"path\": \"translation\"\n                    }\n                },\n                {\n                    \"sampler\": 1,\n                    \"target\": {\n                        \"node\": 3,\n                        \"path\": \"rotation\"\n                    }\n                },\n                {\n                    \"sampler\": 2,\n                    \"target\": {\n                        \"node\": 3,\n                        \"path\": \"scale\"\n                    }\n                }\n            ],\n            \"samplers\": [\n                {\n                    \"input\": 66,\n                    \"interpolation\": \"LINEAR\",\n                    \"output\": 67\n                },\n                {\n                    \"input\": 66,\n                    \"interpolation\": \"LINEAR\",\n                    \"output\": 68\n                },\n                {\n                    \"input\": 66,\n                    \"interpolation\": \"LINEAR\",\n                    \"output\": 69\n                }\n            ]\n        },\n        {\n            \"channels\": [\n                {\n                    \"sampler\": 0,\n                    \"target\": {\n                        \"node\": 4,\n                        \"path\": \"translation\"\n                    }\n                },\n                {\n                    \"sampler\": 1,\n                    \"target\": {\n                        \"node\": 4,\n                        \"path\": \"rotation\"\n                    }\n                },\n                {\n                    \"sampler\": 2,\n                    \"target\": {\n                        \"node\": 4,\n                        \"path\": \"scale\"\n                    }\n                }\n            ],\n            \"samplers\": [\n                {\n                    \"input\": 70,\n                    \"interpolation\": \"LINEAR\",\n                    \"output\": 71\n                },\n                {\n                    \"input\": 70,\n                    \"interpolation\": \"LINEAR\",\n                    \"output\": 72\n                },\n                {\n                    \"input\": 70,\n                    \"interpolation\": \"LINEAR\",\n                    \"output\": 73\n                }\n            ]\n        },\n        {\n            \"channels\": [\n                {\n                    \"sampler\": 0,\n                    \"target\": {\n                        \"node\": 5,\n                        \"path\": \"translation\"\n                    }\n                },\n                {\n                    \"sampler\": 1,\n                    \"target\": {\n                        \"node\": 5,\n                        \"path\": \"rotation\"\n                    }\n                },\n                {\n                    \"sampler\": 2,\n                    \"target\": {\n                        \"node\": 5,\n                        \"path\": \"scale\"\n                    }\n                }\n            ],\n            \"samplers\": [\n                {\n                    \"input\": 74,\n                    \"interpolation\": \"LINEAR\",\n                    \"output\": 75\n                },\n                {\n                    \"input\": 74,\n                    \"interpolation\": \"LINEAR\",\n                    \"output\": 76\n                },\n                {\n                    \"input\": 74,\n                    \"interpolation\": \"LINEAR\",\n                    \"output\": 77\n                }\n            ]\n        },\n        {\n            \"channels\": [\n                {\n                    \"sampler\": 0,\n                    \"target\": {\n                        \"node\": 6,\n                        \"path\": \"translation\"\n                    }\n                },\n                {\n                    \"sampler\": 1,\n                    \"target\": {\n                        \"node\": 6,\n                        \"path\": \"rotation\"\n                    }\n                },\n                {\n                    \"sampler\": 2,\n                    \"target\": {\n                        \"node\": 6,\n                        \"path\": \"scale\"\n                    }\n                }\n            ],\n            \"samplers\": [\n                {\n                    \"input\": 78,\n                    \"interpolation\": \"LINEAR\",\n                    \"output\": 79\n                },\n                {\n                    \"input\": 78,\n                    \"interpolation\": \"LINEAR\",\n                    \"output\": 80\n                },\n                {\n                    \"input\": 78,\n                    \"interpolation\": \"LINEAR\",\n                    \"output\": 81\n                }\n            ]\n        }\n    ],\n    \"skins\": [\n        {\n            \"inverseBindMatrices\": 82,\n            \"skeleton\": 2,\n            \"joints\": [\n                2,\n                11,\n                12,\n                19,\n                20,\n                16,\n                13,\n                17,\n                14,\n                18,\n                15,\n                7,\n                3,\n                8,\n                4,\n                9,\n                5,\n                10,\n                6\n            ],\n            \"name\": \"Armature\"\n        }\n    ],\n    \"accessors\": [\n        {\n            \"bufferView\": 0,\n            \"byteOffset\": 0,\n            \"componentType\": 5123,\n            \"count\": 14016,\n            \"max\": [\n                3272\n            ],\n            \"min\": [\n                0\n            ],\n            \"type\": \"SCALAR\"\n        },\n        {\n            \"bufferView\": 1,\n            \"byteOffset\": 0,\n            \"componentType\": 5123,\n            \"count\": 3273,\n            \"max\": [\n                18,\n                18,\n                18,\n                18\n            ],\n            \"min\": [\n                0,\n                0,\n                0,\n                0\n            ],\n            \"type\": \"VEC4\"\n        },\n        {\n            \"bufferView\": 2,\n            \"byteOffset\": 0,\n            \"componentType\": 5126,\n            \"count\": 3273,\n            \"max\": [\n                1.0,\n                0.9999808073043824,\n                0.9944446086883544\n            ],\n            \"min\": [\n                -1.0,\n                -0.9999808073043824,\n                -1.0\n            ],\n            \"type\": \"VEC3\"\n        },\n        {\n            \"bufferView\": 2,\n            \"byteOffset\": 39276,\n            \"componentType\": 5126,\n            \"count\": 3273,\n            \"max\": [\n                0.1809539943933487,\n                0.569136917591095,\n                1.5065499544143677\n            ],\n            \"min\": [\n                -0.13100001215934754,\n                -0.5691370964050293,\n                0.0\n            ],\n            \"type\": \"VEC3\"\n        },\n        {\n            \"bufferView\": 1,\n            \"byteOffset\": 26184,\n            \"componentType\": 5126,\n            \"count\": 3273,\n            \"max\": [\n                0.990805983543396,\n                0.9880298972129822\n            ],\n            \"min\": [\n                0.014079390093684197,\n                0.008445978164672852\n            ],\n            \"type\": \"VEC2\"\n        },\n        {\n            \"bufferView\": 3,\n            \"byteOffset\": 0,\n            \"componentType\": 5126,\n            \"count\": 3273,\n            \"max\": [\n                1.0,\n                0.989919900894165,\n                0.951076328754425,\n                0.8741077184677124\n            ],\n            \"min\": [\n                0.010080150328576565,\n                0.0,\n                0.0,\n                0.0\n            ],\n            \"type\": \"VEC4\"\n        },\n        {\n            \"bufferView\": 4,\n            \"byteOffset\": 0,\n            \"componentType\": 5126,\n            \"count\": 49,\n            \"max\": [\n                2.0\n            ],\n            \"min\": [\n                0.0\n            ],\n            \"type\": \"SCALAR\"\n        },\n        {\n            \"bufferView\": 5,\n            \"byteOffset\": 0,\n            \"componentType\": 5126,\n            \"count\": 49,\n            \"max\": [\n                2.386510011831433e-8,\n                -0.02000010944902897,\n                0.7110069990158081\n            ],\n            \"min\": [\n                -7.101329746461715e-9,\n                -0.030000120401382448,\n                0.6399999856948853\n            ],\n            \"type\": \"VEC3\"\n        },\n        {\n            \"bufferView\": 6,\n            \"byteOffset\": 0,\n            \"componentType\": 5126,\n            \"count\": 49,\n            \"max\": [\n                -0.02314124070107937,\n                -0.006974140647798777,\n                -0.7065909504890442,\n                -0.7031946778297424\n            ],\n            \"min\": [\n                -0.05146743357181549,\n                -0.034400247037410739,\n                -0.7094300389289856,\n                -0.7066542506217957\n            ],\n            \"type\": \"VEC4\"\n        },\n        {\n            \"bufferView\": 5,\n            \"byteOffset\": 588,\n            \"componentType\": 5126,\n            \"count\": 49,\n            \"max\": [\n                1.0000001192092896,\n                1.0000003576278689,\n                1.0000001192092896\n            ],\n            \"min\": [\n                0.9999998211860656,\n                0.9999998807907105,\n                0.9999997615814208\n            ],\n            \"type\": \"VEC3\"\n        },\n        {\n            \"bufferView\": 4,\n            \"byteOffset\": 196,\n            \"componentType\": 5126,\n            \"count\": 49,\n            \"max\": [\n                2.0\n            ],\n            \"min\": [\n                0.0\n            ],\n            \"type\": \"SCALAR\"\n        },\n        {\n            \"bufferView\": 5,\n            \"byteOffset\": 1176,\n            \"componentType\": 5126,\n            \"count\": 49,\n            \"max\": [\n                0.0009999829344451428,\n                3.725289943190546e-8,\n                0.1454170048236847\n            ],\n            \"min\": [\n                0.0009999759495258332,\n                -4.470349779239769e-8,\n                0.14541690051555634\n            ],\n            \"type\": \"VEC3\"\n        },\n        {\n            \"bufferView\": 6,\n            \"byteOffset\": 784,\n            \"componentType\": 5126,\n            \"count\": 49,\n            \"max\": [\n                -0.7105135917663574,\n                0.008397356607019902,\n                0.000531485362444073,\n                -0.6789330840110779\n            ],\n            \"min\": [\n                -0.7337970733642578,\n                -0.011321297846734524,\n                -0.02596380189061165,\n                -0.703567624092102\n            ],\n            \"type\": \"VEC4\"\n        },\n        {\n            \"bufferView\": 5,\n            \"byteOffset\": 1764,\n            \"componentType\": 5126,\n            \"count\": 49,\n            \"max\": [\n                1.0000003576278689,\n                1.0000004768371585,\n                0.999999701976776\n            ],\n            \"min\": [\n                1.0,\n                1.0000001192092896,\n                0.9999992847442628\n            ],\n            \"type\": \"VEC3\"\n        },\n        {\n            \"bufferView\": 4,\n            \"byteOffset\": 392,\n            \"componentType\": 5126,\n            \"count\": 49,\n            \"max\": [\n                2.0\n            ],\n            \"min\": [\n                0.0\n            ],\n            \"type\": \"SCALAR\"\n        },\n        {\n            \"bufferView\": 5,\n            \"byteOffset\": 2352,\n            \"componentType\": 5126,\n            \"count\": 49,\n            \"max\": [\n                0.0,\n                0.25051671266555788,\n                0.0\n            ],\n            \"min\": [\n                0.0,\n                0.25051671266555788,\n                0.0\n            ],\n            \"type\": \"VEC3\"\n        },\n        {\n            \"bufferView\": 6,\n            \"byteOffset\": 1568,\n            \"componentType\": 5126,\n            \"count\": 49,\n            \"max\": [\n                0.6358352899551392,\n                0.06165437772870064,\n                -0.00338419945910573,\n                -0.7642753720283508\n            ],\n            \"min\": [\n                0.6224426627159119,\n                -0.1380288153886795,\n                -0.06534028053283692,\n                -0.782635509967804\n            ],\n            \"type\": \"VEC4\"\n        },\n        {\n            \"bufferView\": 5,\n            \"byteOffset\": 2940,\n            \"componentType\": 5126,\n            \"count\": 49,\n            \"max\": [\n                1.0000001192092896,\n                1.0000007152557374,\n                0.999999701976776\n            ],\n            \"min\": [\n                0.9999998211860656,\n                1.0000003576278689,\n                0.9999992847442628\n            ],\n            \"type\": \"VEC3\"\n        },\n        {\n            \"bufferView\": 4,\n            \"byteOffset\": 588,\n            \"componentType\": 5126,\n            \"count\": 49,\n            \"max\": [\n                2.0\n            ],\n            \"min\": [\n                0.0\n            ],\n            \"type\": \"SCALAR\"\n        },\n        {\n            \"bufferView\": 5,\n            \"byteOffset\": 3528,\n            \"componentType\": 5126,\n            \"count\": 49,\n            \"max\": [\n                2.1420399676230774e-8,\n                8.940700269022274e-8,\n                0.064838707447052\n            ],\n            \"min\": [\n                -1.5832499755674694e-8,\n                2.98022992950564e-8,\n                0.06483834981918335\n            ],\n            \"type\": \"VEC3\"\n        },\n        {\n            \"bufferView\": 6,\n            \"byteOffset\": 2352,\n            \"componentType\": 5126,\n            \"count\": 49,\n            \"max\": [\n                -0.6325308680534363,\n                0.024829493835568429,\n                0.04200226813554764,\n                -0.7498575448989868\n            ],\n            \"min\": [\n                -0.6592774987220764,\n                -0.03641732409596443,\n                -0.03000717982649803,\n                -0.7735550999641419\n            ],\n            \"type\": \"VEC4\"\n        },\n        {\n            \"bufferView\": 5,\n            \"byteOffset\": 4116,\n            \"componentType\": 5126,\n            \"count\": 49,\n            \"max\": [\n                1.000000238418579,\n                0.9999998807907105,\n                1.0\n            ],\n            \"min\": [\n                0.9999998211860656,\n                0.9999995231628418,\n                0.999999701976776\n            ],\n            \"type\": \"VEC3\"\n        },\n        {\n            \"bufferView\": 4,\n            \"byteOffset\": 784,\n            \"componentType\": 5126,\n            \"count\": 49,\n            \"max\": [\n                2.0\n            ],\n            \"min\": [\n                0.0\n            ],\n            \"type\": \"SCALAR\"\n        },\n        {\n            \"bufferView\": 5,\n            \"byteOffset\": 4704,\n            \"componentType\": 5126,\n            \"count\": 49,\n            \"max\": [\n                7.450579708745408e-9,\n                0.0520397387444973,\n                0.0\n            ],\n            \"min\": [\n                7.450579708745408e-9,\n                0.0520397387444973,\n                0.0\n            ],\n            \"type\": \"VEC3\"\n        },\n        {\n            \"bufferView\": 6,\n            \"byteOffset\": 3136,\n            \"componentType\": 5126,\n            \"count\": 49,\n            \"max\": [\n                0.04680429771542549,\n                0.9995073676109314,\n                -0.018450811505317689,\n                0.002033286727964878\n            ],\n            \"min\": [\n                -0.09362706542015076,\n                0.995067298412323,\n                -0.09058911353349686,\n                -0.0025854958221316339\n            ],\n            \"type\": \"VEC4\"\n        },\n        {\n            \"bufferView\": 5,\n            \"byteOffset\": 5292,\n            \"componentType\": 5126,\n            \"count\": 49,\n            \"max\": [\n                1.000000238418579,\n                1.0000001192092896,\n                1.0000004768371585\n            ],\n            \"min\": [\n                0.999999701976776,\n                0.9999998211860656,\n                1.0000001192092896\n            ],\n            \"type\": \"VEC3\"\n        },\n        {\n            \"bufferView\": 4,\n            \"byteOffset\": 980,\n            \"componentType\": 5126,\n            \"count\": 49,\n            \"max\": [\n                2.0\n            ],\n            \"min\": [\n                0.0\n            ],\n            \"type\": \"SCALAR\"\n        },\n        {\n            \"bufferView\": 5,\n            \"byteOffset\": 5880,\n            \"componentType\": 5126,\n            \"count\": 49,\n            \"max\": [\n                0.08800014853477478,\n                0.000014096500308369288,\n                -0.00005573029920924455\n            ],\n            \"min\": [\n                0.08799994736909867,\n                0.000013977300113765525,\n                -0.00005596880146185868\n            ],\n            \"type\": \"VEC3\"\n        },\n        {\n            \"bufferView\": 6,\n            \"byteOffset\": 3920,\n            \"componentType\": 5126,\n            \"count\": 49,\n            \"max\": [\n                0.7787204384803772,\n                0.6963526606559753,\n                -0.2913321256637573,\n                -0.12775331735610966\n            ],\n            \"min\": [\n                0.41440603137016299,\n                0.2682091891765595,\n                -0.6041955351829529,\n                -0.508333683013916\n            ],\n            \"type\": \"VEC4\"\n        },\n        {\n            \"bufferView\": 5,\n            \"byteOffset\": 6468,\n            \"componentType\": 5126,\n            \"count\": 49,\n            \"max\": [\n                1.0000005960464478,\n                1.0000001192092896,\n                1.0000004768371585\n            ],\n            \"min\": [\n                1.0,\n                0.9999995827674866,\n                1.0000001192092896\n            ],\n            \"type\": \"VEC3\"\n        },\n        {\n            \"bufferView\": 4,\n            \"byteOffset\": 1176,\n            \"componentType\": 5126,\n            \"count\": 49,\n            \"max\": [\n                2.0\n            ],\n            \"min\": [\n                0.0\n            ],\n            \"type\": \"SCALAR\"\n        },\n        {\n            \"bufferView\": 5,\n            \"byteOffset\": 7056,\n            \"componentType\": 5126,\n            \"count\": 49,\n            \"max\": [\n                0.0,\n                0.24200910329818729,\n                0.0\n            ],\n            \"min\": [\n                0.0,\n                0.24200910329818729,\n                0.0\n            ],\n            \"type\": \"VEC3\"\n        },\n        {\n            \"bufferView\": 6,\n            \"byteOffset\": 4704,\n            \"componentType\": 5126,\n            \"count\": 49,\n            \"max\": [\n                0.005276965908706188,\n                -0.10532382130622864,\n                -0.0563904233276844,\n                -0.9007523059844972\n            ],\n            \"min\": [\n                -0.08755125105381012,\n                -0.15304648876190186,\n                -0.4198120832443238,\n                -0.989989936351776\n            ],\n            \"type\": \"VEC4\"\n        },\n        {\n            \"bufferView\": 5,\n            \"byteOffset\": 7644,\n            \"componentType\": 5126,\n            \"count\": 49,\n            \"max\": [\n                0.9999999403953552,\n                0.9999998807907105,\n                0.9999998807907105\n            ],\n            \"min\": [\n                0.9999994039535524,\n                0.9999992847442628,\n                0.9999995231628418\n            ],\n            \"type\": \"VEC3\"\n        },\n        {\n            \"bufferView\": 4,\n            \"byteOffset\": 1372,\n            \"componentType\": 5126,\n            \"count\": 49,\n            \"max\": [\n                2.0\n            ],\n            \"min\": [\n                0.0\n            ],\n            \"type\": \"SCALAR\"\n        },\n        {\n            \"bufferView\": 5,\n            \"byteOffset\": 8232,\n            \"componentType\": 5126,\n            \"count\": 49,\n            \"max\": [\n                -2.98022992950564e-8,\n                0.18779130280017854,\n                0.0\n            ],\n            \"min\": [\n                -2.98022992950564e-8,\n                0.18779130280017854,\n                0.0\n            ],\n            \"type\": \"VEC3\"\n        },\n        {\n            \"bufferView\": 6,\n            \"byteOffset\": 5488,\n            \"componentType\": 5126,\n            \"count\": 49,\n            \"max\": [\n                0.04831664264202118,\n                -0.03682959079742432,\n                0.1515040546655655,\n                -0.9875762462615968\n            ],\n            \"min\": [\n                -0.01958325318992138,\n                -0.043389420956373218,\n                -0.0806758776307106,\n                -0.9989553689956664\n            ],\n            \"type\": \"VEC4\"\n        },\n        {\n            \"bufferView\": 5,\n            \"byteOffset\": 8820,\n            \"componentType\": 5126,\n            \"count\": 49,\n            \"max\": [\n                1.000000238418579,\n                1.0000009536743165,\n                1.0000005960464478\n            ],\n            \"min\": [\n                0.999999701976776,\n                1.0000005960464478,\n                1.000000238418579\n            ],\n            \"type\": \"VEC3\"\n        },\n        {\n            \"bufferView\": 4,\n            \"byteOffset\": 1568,\n            \"componentType\": 5126,\n            \"count\": 49,\n            \"max\": [\n                2.0\n            ],\n            \"min\": [\n                0.0\n            ],\n            \"type\": \"SCALAR\"\n        },\n        {\n            \"bufferView\": 5,\n            \"byteOffset\": 9408,\n            \"componentType\": 5126,\n            \"count\": 49,\n            \"max\": [\n                -0.0879998505115509,\n                0.00006264450348680839,\n                -0.00006240609945962206\n            ],\n            \"min\": [\n                -0.0880001038312912,\n                0.00006249549915082753,\n                -0.00006282330286921933\n            ],\n            \"type\": \"VEC3\"\n        },\n        {\n            \"bufferView\": 6,\n            \"byteOffset\": 6272,\n            \"componentType\": 5126,\n            \"count\": 49,\n            \"max\": [\n                0.6748494505882263,\n                0.3152157068252564,\n                -0.300369679927826,\n                -0.3483264744281769\n            ],\n            \"min\": [\n                0.3661315143108368,\n                0.09874838590621948,\n                -0.6449660658836365,\n                -0.8451733589172363\n            ],\n            \"type\": \"VEC4\"\n        },\n        {\n            \"bufferView\": 5,\n            \"byteOffset\": 9996,\n            \"componentType\": 5126,\n            \"count\": 49,\n            \"max\": [\n                1.0000001192092896,\n                1.0000001192092896,\n                1.0\n            ],\n            \"min\": [\n                0.9999997615814208,\n                0.9999996423721314,\n                0.999999701976776\n            ],\n            \"type\": \"VEC3\"\n        },\n        {\n            \"bufferView\": 4,\n            \"byteOffset\": 1764,\n            \"componentType\": 5126,\n            \"count\": 49,\n            \"max\": [\n                2.0\n            ],\n            \"min\": [\n                0.0\n            ],\n            \"type\": \"SCALAR\"\n        },\n        {\n            \"bufferView\": 5,\n            \"byteOffset\": 10584,\n            \"componentType\": 5126,\n            \"count\": 49,\n            \"max\": [\n                0.0,\n                0.24200810492038728,\n                0.0\n            ],\n            \"min\": [\n                0.0,\n                0.24200810492038728,\n                0.0\n            ],\n            \"type\": \"VEC3\"\n        },\n        {\n            \"bufferView\": 6,\n            \"byteOffset\": 7056,\n            \"componentType\": 5126,\n            \"count\": 49,\n            \"max\": [\n                -0.003387797623872757,\n                0.9475951790809633,\n                -0.0798693522810936,\n                -0.3012830018997193\n            ],\n            \"min\": [\n                -0.12710869312286378,\n                0.916045308113098,\n                -0.2270231395959854,\n                -0.3146948218345642\n            ],\n            \"type\": \"VEC4\"\n        },\n        {\n            \"bufferView\": 5,\n            \"byteOffset\": 11172,\n            \"componentType\": 5126,\n            \"count\": 49,\n            \"max\": [\n                1.0000003576278689,\n                0.9999998807907105,\n                1.0000001192092896\n            ],\n            \"min\": [\n                0.9999999403953552,\n                0.9999995827674866,\n                0.9999997615814208\n            ],\n            \"type\": \"VEC3\"\n        },\n        {\n            \"bufferView\": 4,\n            \"byteOffset\": 1960,\n            \"componentType\": 5126,\n            \"count\": 49,\n            \"max\": [\n                2.0\n            ],\n            \"min\": [\n                0.0\n            ],\n            \"type\": \"SCALAR\"\n        },\n        {\n            \"bufferView\": 5,\n            \"byteOffset\": 11760,\n            \"componentType\": 5126,\n            \"count\": 49,\n            \"max\": [\n                0.0,\n                0.187792107462883,\n                0.0\n            ],\n            \"min\": [\n                0.0,\n                0.187792107462883,\n                0.0\n            ],\n            \"type\": \"VEC3\"\n        },\n        {\n            \"bufferView\": 6,\n            \"byteOffset\": 7840,\n            \"componentType\": 5126,\n            \"count\": 49,\n            \"max\": [\n                0.15000686049461366,\n                0.26206517219543459,\n                0.06808223575353623,\n                -0.9487173557281494\n            ],\n            \"min\": [\n                -0.0010455237934365869,\n                0.25685790181159975,\n                -0.10152826458215714,\n                -0.9656248688697816\n            ],\n            \"type\": \"VEC4\"\n        },\n        {\n            \"bufferView\": 5,\n            \"byteOffset\": 12348,\n            \"componentType\": 5126,\n            \"count\": 49,\n            \"max\": [\n                1.0000001192092896,\n                1.0000009536743165,\n                1.0\n            ],\n            \"min\": [\n                0.9999996423721314,\n                1.0000003576278689,\n                0.9999995231628418\n            ],\n            \"type\": \"VEC3\"\n        },\n        {\n            \"bufferView\": 4,\n            \"byteOffset\": 2156,\n            \"componentType\": 5126,\n            \"count\": 49,\n            \"max\": [\n                2.0\n            ],\n            \"min\": [\n                0.0\n            ],\n            \"type\": \"SCALAR\"\n        },\n        {\n            \"bufferView\": 5,\n            \"byteOffset\": 12936,\n            \"componentType\": 5126,\n            \"count\": 49,\n            \"max\": [\n                0.06761906296014786,\n                -0.02851865068078041,\n                -0.06296355277299881\n            ],\n            \"min\": [\n                0.0676189586520195,\n                -0.028518760576844217,\n                -0.06296365708112717\n            ],\n            \"type\": \"VEC3\"\n        },\n        {\n            \"bufferView\": 6,\n            \"byteOffset\": 8624,\n            \"componentType\": 5126,\n            \"count\": 49,\n            \"max\": [\n                0.301033079624176,\n                -0.20796972513198853,\n                0.92630273103714,\n                -0.08994945138692856\n            ],\n            \"min\": [\n                0.1658332496881485,\n                -0.7997090816497803,\n                0.4959096908569336,\n                -0.3118112981319428\n            ],\n            \"type\": \"VEC4\"\n        },\n        {\n            \"bufferView\": 5,\n            \"byteOffset\": 13524,\n            \"componentType\": 5126,\n            \"count\": 49,\n            \"max\": [\n                1.0000008344650269,\n                1.0,\n                0.9999999403953552\n            ],\n            \"min\": [\n                1.0000003576278689,\n                0.9999995231628418,\n                0.9999996423721314\n            ],\n            \"type\": \"VEC3\"\n        },\n        {\n            \"bufferView\": 4,\n            \"byteOffset\": 2352,\n            \"componentType\": 5126,\n            \"count\": 49,\n            \"max\": [\n                2.0\n            ],\n            \"min\": [\n                0.0\n            ],\n            \"type\": \"SCALAR\"\n        },\n        {\n            \"bufferView\": 5,\n            \"byteOffset\": 14112,\n            \"componentType\": 5126,\n            \"count\": 49,\n            \"max\": [\n                -1.4901200273698124e-8,\n                0.26611289381980898,\n                0.0\n            ],\n            \"min\": [\n                -1.4901200273698124e-8,\n                0.26611289381980898,\n                0.0\n            ],\n            \"type\": \"VEC3\"\n        },\n        {\n            \"bufferView\": 6,\n            \"byteOffset\": 9408,\n            \"componentType\": 5126,\n            \"count\": 49,\n            \"max\": [\n                0.8112500905990601,\n                -0.1822210103273392,\n                0.032220568507909778,\n                -0.4743982553482056\n            ],\n            \"min\": [\n                -0.03036016784608364,\n                -0.3419179916381836,\n                -0.289162427186966,\n                -0.9452491998672484\n            ],\n            \"type\": \"VEC4\"\n        },\n        {\n            \"bufferView\": 5,\n            \"byteOffset\": 14700,\n            \"componentType\": 5126,\n            \"count\": 49,\n            \"max\": [\n                0.9999994039535524,\n                1.000000238418579,\n                1.000000238418579\n            ],\n            \"min\": [\n                0.9999989867210388,\n                0.9999996423721314,\n                0.9999994039535524\n            ],\n            \"type\": \"VEC3\"\n        },\n        {\n            \"bufferView\": 4,\n            \"byteOffset\": 2548,\n            \"componentType\": 5126,\n            \"count\": 49,\n            \"max\": [\n                2.0\n            ],\n            \"min\": [\n                0.0\n            ],\n            \"type\": \"SCALAR\"\n        },\n        {\n            \"bufferView\": 5,\n            \"byteOffset\": 15288,\n            \"componentType\": 5126,\n            \"count\": 49,\n            \"max\": [\n                0.0,\n                0.2758241891860962,\n                0.0\n            ],\n            \"min\": [\n                0.0,\n                0.2758241891860962,\n                0.0\n            ],\n            \"type\": \"VEC3\"\n        },\n        {\n            \"bufferView\": 6,\n            \"byteOffset\": 10192,\n            \"componentType\": 5126,\n            \"count\": 49,\n            \"max\": [\n                0.9907974004745485,\n                -0.0014961245469748974,\n                0.02489613927900791,\n                -0.13506969809532166\n            ],\n            \"min\": [\n                0.8542653918266296,\n                -0.05430477112531662,\n                -0.00011262076441198587,\n                -0.5192484259605408\n            ],\n            \"type\": \"VEC4\"\n        },\n        {\n            \"bufferView\": 5,\n            \"byteOffset\": 15876,\n            \"componentType\": 5126,\n            \"count\": 49,\n            \"max\": [\n                1.0000005960464478,\n                1.0000004768371585,\n                1.0000004768371585\n            ],\n            \"min\": [\n                1.000000238418579,\n                1.0,\n                1.0000001192092896\n            ],\n            \"type\": \"VEC3\"\n        },\n        {\n            \"bufferView\": 4,\n            \"byteOffset\": 2744,\n            \"componentType\": 5126,\n            \"count\": 49,\n            \"max\": [\n                2.0\n            ],\n            \"min\": [\n                0.0\n            ],\n            \"type\": \"SCALAR\"\n        },\n        {\n            \"bufferView\": 5,\n            \"byteOffset\": 16464,\n            \"componentType\": 5126,\n            \"count\": 49,\n            \"max\": [\n                -0.0023464488331228496,\n                -0.06617332249879837,\n                0.02785664983093739\n            ],\n            \"min\": [\n                -0.002346470952033997,\n                -0.06617333739995957,\n                0.02785659022629261\n            ],\n            \"type\": \"VEC3\"\n        },\n        {\n            \"bufferView\": 6,\n            \"byteOffset\": 10976,\n            \"componentType\": 5126,\n            \"count\": 49,\n            \"max\": [\n                0.02062430046498776,\n                -0.23465925455093385,\n                0.9716955423355104,\n                0.0638260766863823\n            ],\n            \"min\": [\n                0.003326366888359189,\n                -0.5406339168548584,\n                0.8410344123840332,\n                0.016216862946748738\n            ],\n            \"type\": \"VEC4\"\n        },\n        {\n            \"bufferView\": 5,\n            \"byteOffset\": 17052,\n            \"componentType\": 5126,\n            \"count\": 49,\n            \"max\": [\n                1.0000001192092896,\n                1.0000009536743165,\n                1.0000005960464478\n            ],\n            \"min\": [\n                0.9999998211860656,\n                1.000000238418579,\n                0.9999998211860656\n            ],\n            \"type\": \"VEC3\"\n        },\n        {\n            \"bufferView\": 4,\n            \"byteOffset\": 2940,\n            \"componentType\": 5126,\n            \"count\": 49,\n            \"max\": [\n                2.0\n            ],\n            \"min\": [\n                0.0\n            ],\n            \"type\": \"SCALAR\"\n        },\n        {\n            \"bufferView\": 5,\n            \"byteOffset\": 17640,\n            \"componentType\": 5126,\n            \"count\": 49,\n            \"max\": [\n                -0.06845708936452866,\n                -0.028570100665092469,\n                -0.062949538230896\n            ],\n            \"min\": [\n                -0.06845712661743164,\n                -0.02857035957276821,\n                -0.06294971704483032\n            ],\n            \"type\": \"VEC3\"\n        },\n        {\n            \"bufferView\": 6,\n            \"byteOffset\": 11760,\n            \"componentType\": 5126,\n            \"count\": 49,\n            \"max\": [\n                -0.018168065696954728,\n                -0.18232035636901856,\n                0.9812799096107484,\n                0.117560513317585\n            ],\n            \"min\": [\n                -0.07457219809293747,\n                -0.902503490447998,\n                0.413051187992096,\n                0.03284534439444542\n            ],\n            \"type\": \"VEC4\"\n        },\n        {\n            \"bufferView\": 5,\n            \"byteOffset\": 18228,\n            \"componentType\": 5126,\n            \"count\": 49,\n            \"max\": [\n                1.000000238418579,\n                1.000000238418579,\n                1.0000003576278689\n            ],\n            \"min\": [\n                0.9999998211860656,\n                0.9999995827674866,\n                0.9999996423721314\n            ],\n            \"type\": \"VEC3\"\n        },\n        {\n            \"bufferView\": 4,\n            \"byteOffset\": 3136,\n            \"componentType\": 5126,\n            \"count\": 49,\n            \"max\": [\n                2.0\n            ],\n            \"min\": [\n                0.0\n            ],\n            \"type\": \"SCALAR\"\n        },\n        {\n            \"bufferView\": 5,\n            \"byteOffset\": 18816,\n            \"componentType\": 5126,\n            \"count\": 49,\n            \"max\": [\n                -1.1175900205273593e-8,\n                0.2661114931106568,\n                0.0\n            ],\n            \"min\": [\n                -1.1175900205273593e-8,\n                0.2661114931106568,\n                0.0\n            ],\n            \"type\": \"VEC3\"\n        },\n        {\n            \"bufferView\": 6,\n            \"byteOffset\": 12544,\n            \"componentType\": 5126,\n            \"count\": 49,\n            \"max\": [\n                0.8507033586502075,\n                0.14946134388446809,\n                0.04984176158905029,\n                -0.5191445350646973\n            ],\n            \"min\": [\n                -0.06756377220153809,\n                0.06949601322412491,\n                -0.026268262416124345,\n                -0.9922308921813964\n            ],\n            \"type\": \"VEC4\"\n        },\n        {\n            \"bufferView\": 5,\n            \"byteOffset\": 19404,\n            \"componentType\": 5126,\n            \"count\": 49,\n            \"max\": [\n                1.0000005960464478,\n                1.0000003576278689,\n                1.0000005960464478\n            ],\n            \"min\": [\n                1.0000001192092896,\n                0.9999995231628418,\n                0.9999998211860656\n            ],\n            \"type\": \"VEC3\"\n        },\n        {\n            \"bufferView\": 4,\n            \"byteOffset\": 3332,\n            \"componentType\": 5126,\n            \"count\": 49,\n            \"max\": [\n                2.0\n            ],\n            \"min\": [\n                0.0\n            ],\n            \"type\": \"SCALAR\"\n        },\n        {\n            \"bufferView\": 5,\n            \"byteOffset\": 19992,\n            \"componentType\": 5126,\n            \"count\": 49,\n            \"max\": [\n                0.0,\n                0.2758249044418335,\n                0.0\n            ],\n            \"min\": [\n                0.0,\n                0.2758249044418335,\n                0.0\n            ],\n            \"type\": \"VEC3\"\n        },\n        {\n            \"bufferView\": 6,\n            \"byteOffset\": 13328,\n            \"componentType\": 5126,\n            \"count\": 49,\n            \"max\": [\n                0.99649316072464,\n                -0.01710231974720955,\n                -0.022676724940538408,\n                -0.07459255307912827\n            ],\n            \"min\": [\n                0.8792483806610107,\n                -0.04609288275241852,\n                -0.06820148974657059,\n                -0.4750169813632965\n            ],\n            \"type\": \"VEC4\"\n        },\n        {\n            \"bufferView\": 5,\n            \"byteOffset\": 20580,\n            \"componentType\": 5126,\n            \"count\": 49,\n            \"max\": [\n                0.9999995827674866,\n                1.0,\n                1.0000003576278689\n            ],\n            \"min\": [\n                0.999999225139618,\n                0.9999995231628418,\n                1.0\n            ],\n            \"type\": \"VEC3\"\n        },\n        {\n            \"bufferView\": 4,\n            \"byteOffset\": 3528,\n            \"componentType\": 5126,\n            \"count\": 49,\n            \"max\": [\n                2.0\n            ],\n            \"min\": [\n                0.0\n            ],\n            \"type\": \"SCALAR\"\n        },\n        {\n            \"bufferView\": 5,\n            \"byteOffset\": 21168,\n            \"componentType\": 5126,\n            \"count\": 49,\n            \"max\": [\n                -0.0014585109893232585,\n                -0.06619886308908463,\n                0.02785670943558216\n            ],\n            \"min\": [\n                -0.0014585329918190837,\n                -0.06619889289140701,\n                0.02785668894648552\n            ],\n            \"type\": \"VEC3\"\n        },\n        {\n            \"bufferView\": 6,\n            \"byteOffset\": 14112,\n            \"componentType\": 5126,\n            \"count\": 49,\n            \"max\": [\n                -0.00960757862776518,\n                -0.2635453343391419,\n                0.9620476961135864,\n                0.06995902955532074\n            ],\n            \"min\": [\n                -0.04577624797821045,\n                -0.4899238646030426,\n                0.8689604997634888,\n                -0.06424159556627274\n            ],\n            \"type\": \"VEC4\"\n        },\n        {\n            \"bufferView\": 5,\n            \"byteOffset\": 21756,\n            \"componentType\": 5126,\n            \"count\": 49,\n            \"max\": [\n                0.9999996423721314,\n                1.0000003576278689,\n                0.9999998807907105\n            ],\n            \"min\": [\n                0.9999991655349731,\n                0.9999997615814208,\n                0.9999994039535524\n            ],\n            \"type\": \"VEC3\"\n        },\n        {\n            \"bufferView\": 7,\n            \"byteOffset\": 0,\n            \"componentType\": 5126,\n            \"count\": 19,\n            \"max\": [\n                0.780990481376648,\n                0.9918341040611268,\n                0.9992613196372986,\n                0.0,\n                1.0,\n                0.8904604315757752,\n                0.6854007244110107,\n                0.0,\n                0.79917311668396,\n                0.9999359250068665,\n                0.997134804725647,\n                0.0,\n                0.20702040195465089,\n                0.5989438891410828,\n                1.001250982284546,\n                1.0\n            ],\n            \"min\": [\n                -0.9985063076019288,\n                -0.9971349835395812,\n                -0.9999359250068665,\n                0.0,\n                -1.0,\n                -0.8904621005058289,\n                -0.4517692029476166,\n                0.0,\n                -0.18484599888324736,\n                -0.9853218197822572,\n                -0.997802197933197,\n                0.0,\n                -0.811928927898407,\n                -1.18982994556427,\n                -1.058609962463379,\n                1.0\n            ],\n            \"type\": \"MAT4\"\n        }\n    ],\n    \"materials\": [\n        {\n            \"pbrMetallicRoughness\": {\n                \"baseColorTexture\": {\n                    \"index\": 0\n                },\n                \"metallicFactor\": 0.0\n            },\n            \"emissiveFactor\": [\n                0.0,\n                0.0,\n                0.0\n            ],\n            \"name\": \"Cesium_Man-effect\"\n        }\n    ],\n    \"textures\": [\n        {\n            \"sampler\": 0,\n            \"source\": 0\n        }\n    ],\n    \"images\": [\n        {\n            \"uri\": \"data:image/jpeg;base64,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AEdybiBkb3ViQG/gAAAAAAAAAAAAQmwgIGRvdWJAb+AAAAAAAAAAAABCcmRUVW50RiNSbHQAAAAAAAAAAAAAAABCbGQgVW50RiNSbHQAAAAAAAAAAAAAAABSc2x0VW50RiNQeGxAcsAAAAAAAAAAAAp2ZWN0b3JEYXRhYm9vbAEAAAAAUGdQc2VudW0AAAAAUGdQcwAAAABQZ1BDAAAAAExlZnRVbnRGI1JsdAAAAAAAAAAAAAAAAFRvcCBVbnRGI1JsdAAAAAAAAAAAAAAAAFNjbCBVbnRGI1ByY0BZAAAAAAAAOEJJTQPtAAAAAAAQASwAAAABAAEBLAAAAAEAAThCSU0EJgAAAAAADgAAAAAAAAAAAAA/gAAAOEJJTQPyAAAAAAAKAAD///////8AADhCSU0EDQAAAAAABAAAAB44QklNBBkAAAAAAAQAAAAeOEJJTQPzAAAAAAAJAAAAAAAAAAABADhCSU0nEAAAAAAACgABAAAAAAAAAAI4QklNA/UAAAAAAEgAL2ZmAAEAbGZmAAYAAAAAAAEAL2ZmAAEAoZmaAAYAAAAAAAEAMgAAAAEAWgAAAAYAAAAAAAEANQAAAAEALQAAAAYAAAAAAAE4QklNA/gAAAAAAHAAAP////////////////////////////8D6AAAAAD/////////////////////////////A+gAAAAA/////////////////////////////wPoAAAAAP////////////////////////////8D6AAAOEJJTQQAAAAAAAACAAE4QklNBAIAAAAAAAYAAAAAAAA4QklNBDAAAAAAAAMBAQEAOEJJTQQtAAAAAAAGAAEAAAAHOEJJTQQIAAAAAAAQAAAAAQAAAkAAAAJAAAAAADhCSU0EHgAAAAAABAAAAAA4QklNBBoAAAAAA0kAAAAGAAAAAAAAAAAAAAQAAAAEAAAAAAoAQwBlAHMAaQB1AG0AXwBNAGEAbgAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAQAAAAAAAG51bGwAAAACAAAABmJvdW5kc09iamMAAAABAAAAAAAAUmN0MQAAAAQAAAAAVG9wIGxvbmcAAAAAAAAA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IHhtbG5zOnN0RXZ0PSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VFdmVudCMiIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCBDUzUgV2luZG93cyIgeG1wOkNyZWF0ZURhdGU9IjIwMTQtMDItMThUMTc6MDI6MTEtMDU6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDE0LTAyLTE5VDE1OjE4OjEwLTA1OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDE0LTAyLTE5VDE1OjE4OjEwLTA1OjAwIiBkYzpmb3JtYXQ9ImltYWdlL2pwZWciIHBob3Rvc2hvcDpDb2xvck1vZGU9IjMiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MTcxQzBBRjRBMjk5RTMxMUJCQ0RDNzdBMkI5NjZCNkUiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6NjNDNDA2RDBFMTk4RTMxMUEzRTVENjc4RUNDRDhGQkQiIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDo2M0M0MDZEMEUxOThFMzExQTNFNUQ2NzhFQ0NEOEZCRCI+IDxwaG90b3Nob3A6RG9jdW1lbnRBbmNlc3RvcnM+IDxyZGY6QmFnPiA8cmRmOmxpPnhtcC5kaWQ6NjFDNDA2RDBFMTk4RTMxMUEzRTVENjc4RUNDRDhGQkQ8L3JkZjpsaT4gPC9yZGY6QmFnPiA8L3Bob3Rvc2hvcDpEb2N1bWVudEFuY2VzdG9ycz4gPHhtcE1NOkhpc3Rvcnk+IDxyZGY6U2VxPiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0iY3JlYXRlZCIgc3RFdnQ6aW5zdGFuY2VJRD0ieG1wLmlpZDo2M0M0MDZEMEUxOThFMzExQTNFNUQ2NzhFQ0NEOEZCRCIgc3RFdnQ6d2hlbj0iMjAxNC0wMi0xOFQxNzowMjoxMS0wNTowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIENTNSBXaW5kb3dzIi8+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJjb252ZXJ0ZWQiIHN0RXZ0OnBhcmFtZXRlcnM9ImZyb20gaW1hZ2UvcG5nIHRvIGFwcGxpY2F0aW9uL3ZuZC5hZG9iZS5waG90b3Nob3AiLz4gPHJkZjpsaSBzdEV2dDphY3Rpb249InNhdmVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOjY0QzQwNkQwRTE5OEUzMTFBM0U1RDY3OEVDQ0Q4RkJEIiBzdEV2dDp3aGVuPSIyMDE0LTAyLTE4VDE3OjA3OjU0LTA1OjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgQ1M1IFdpbmRvd3MiIHN0RXZ0OmNoYW5nZWQ9Ii8iLz4gPHJkZjpsaSBzdEV2dDphY3Rpb249InNhdmVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOjY1QzQwNkQwRTE5OEUzMTFBM0U1RDY3OEVDQ0Q4RkJEIiBzdEV2dDp3aGVuPSIyMDE0LTAyLTE4VDE3OjA5OjA3LTA1OjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgQ1M1IFdpbmRvd3MiIHN0RXZ0OmNoYW5nZWQ9Ii8iLz4gPHJkZjpsaSBzdEV2dDphY3Rpb249InNhdmVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOjY2QzQwNkQwRTE5OEUzMTFBM0U1RDY3OEVDQ0Q4RkJEIiBzdEV2dDp3aGVuPSIyMDE0LTAyLTE4VDE3OjIwOjA5LTA1OjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgQ1M1IFdpbmRvd3MiIHN0RXZ0OmNoYW5nZWQ9Ii8iLz4gPHJkZjpsaSBzdEV2dDphY3Rpb249InNhdmVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOjY3QzQwNkQwRTE5OEUzMTFBM0U1RDY3OEVDQ0Q4RkJEIiBzdEV2dDp3aGVuPSIyMDE0LTAyLTE4VDE3OjIwOjIzLTA1OjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgQ1M1IFdpbmRvd3MiIHN0RXZ0OmNoYW5nZWQ9Ii8iLz4gPHJkZjpsaSBzdEV2dDphY3Rpb249InNhdmVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOjE2MUMwQUY0QTI5OUUzMTFCQkNEQzc3QTJCOTY2QjZFIiBzdEV2dDp3aGVuPSIyMDE0LTAyLTE5VDE1OjE4OjEwLTA1OjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgQ1M1IFdpbmRvd3MiIHN0RXZ0OmNoYW5nZWQ9Ii8iLz4gPHJkZjpsaSBzdEV2dDphY3Rpb249ImNvbnZlcnRlZCIgc3RFdnQ6cGFyYW1ldGVycz0iZnJvbSBhcHBsaWNhdGlvbi92bmQuYWRvYmUucGhvdG9zaG9wIHRvIGltYWdlL2pwZWciLz4gPHJkZjpsaSBzdEV2dDphY3Rpb249ImRlcml2ZWQiIHN0RXZ0OnBhcmFtZXRlcnM9ImNvbnZlcnRlZCBmcm9tIGFwcGxpY2F0aW9uL3ZuZC5hZG9iZS5waG90b3Nob3AgdG8gaW1hZ2UvanBlZyIvPiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0ic2F2ZWQiIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6MTcxQzBBRjRBMjk5RTMxMUJCQ0RDNzdBMkI5NjZCNkUiIHN0RXZ0OndoZW49IjIwMTQtMDItMTlUMTU6MTg6MTAtMDU6MDAiIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCBDUzUgV2luZG93cyIgc3RFdnQ6Y2hhbmdlZD0iLyIvPiA8L3JkZjpTZXE+IDwveG1wTU06SGlzdG9yeT4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6MTYxQzBBRjRBMjk5RTMxMUJCQ0RDNzdBMkI5NjZCNkUiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6NjNDNDA2RDBFMTk4RTMxMUEzRTVENjc4RUNDRDhGQkQiIHN0UmVmOm9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDo2M0M0MDZEMEUxOThFMzExQTNFNUQ2NzhFQ0NEOEZCRCIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg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\"\n        }\n    ],\n    \"samplers\": [\n        {\n            \"magFilter\": 9729,\n            \"minFilter\": 9986,\n            \"wrapS\": 10497,\n            \"wrapT\": 10497\n        }\n    ],\n    \"bufferViews\": [\n        {\n            \"buffer\": 0,\n            \"byteOffset\": 225468,\n            \"byteLength\": 28032,\n            \"target\": 34963\n        },\n        {\n            \"buffer\": 0,\n            \"byteOffset\": 169376,\n            \"byteLength\": 52368,\n            \"byteStride\": 8,\n            \"target\": 34962\n        },\n        {\n            \"buffer\": 0,\n            \"byteOffset\": 90824,\n            \"byteLength\": 78552,\n            \"byteStride\": 12,\n            \"target\": 34962\n        },\n        {\n            \"buffer\": 0,\n            \"byteOffset\": 16112,\n            \"byteLength\": 52368,\n            \"byteStride\": 16,\n            \"target\": 34962\n        },\n        {\n            \"buffer\": 0,\n            \"byteOffset\": 221744,\n            \"byteLength\": 3724\n        },\n        {\n            \"buffer\": 0,\n            \"byteOffset\": 68480,\n            \"byteLength\": 22344\n        },\n        {\n            \"buffer\": 0,\n            \"byteOffset\": 1216,\n            \"byteLength\": 14896\n        },\n        {\n            \"buffer\": 0,\n            \"byteOffset\": 0,\n            \"byteLength\": 1216\n        }\n    ],\n    \"buffers\": [\n        {\n            \"byteLength\": 253500,\n            \"uri\": \"data:application/octet-stream;base64,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AQCAPwAAgD8AAIA/AACAPwAAgD8AAIA/AgCAP///fz///38/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAP/7/fz/9/38/AgCAPwAAgD8AAIA/AQCAP/3/fz8AAIA/AgCAP/z/fz8BAIA/AgCAP///fz8AAIA/AgCAP/7/fz8BAIA/AQCAP///fz/+/38/AACAPwEAgD8BAIA/AQCAP/3/fz8AAIA/AgCAP/3/fz8AAIA/AQCAP///fz8AAIA/AQCAP///fz8AAIA/AQCAP/7/fz8AAIA/AQCAPwAAgD8AAIA/AACAPwAAgD8AAIA/AQCAP/7/fz8AAIA/AQCAPwEAgD8AAIA/AwCAP///fz///38/AgCAP///fz8BAIA/AgCAP///fz8AAIA/AACAPwEAgD8AAIA/AACAPwAAgD8BAIA/AQCAPwEAgD8AAIA/AQCAPwAAgD///38/AQCAPwEAgD/DEYM68///MivoFD7DEYM66P+/MjLoFD7DEYM6AAAAACvoFD7DEYM66P+/sjLoFD7DEYM68///sivoFD7DEYM6/v//MTLoFD7DEYM6FgCAsivoFD7DEYM6/v//sTLoFD7DEYM68///sivoFD7DEYM6AAAAACvoFD7DEYM68///sivoFD7DEYM6FgCAsivoFD7DEYM6BABAsyvoFD7DEYM66P+/sivoFD7DEYM6AAAAACvoFD7DEYM6FgCAsivoFD7DEYM6/v//MTLoFD7DEYM6FgCAsivoFD7DEYM6/v//MTLoFD7DEYM6/v//MTLoFD7DEYM6/v//MTLoFD7DEYM6//8fsyvoFD7DEYM6FgCAsivoFD7DEYM6FgCAsivoFD7DEYM6//8fMzLoFD7DEYM6/v//MSvoFD7DEYM6AAAAACvoFD7DEYM6/v//MTLoFD7DEYM66P+/sjLoFD7DEYM68///sivoFD7DEYM6AAAAACvoFD7DEYM6/v//MTLoFD7DEYM6FgCAMivoFD7DEYM6AAAAACvoFD7DEYM66P+/sivoFD6gEYM68///MivoFD7cEYM6FgCAsivoFD7cEYM6//8fsyvoFD7DEYM6/v//MTLoFD7DEYM6GwCgMjLoFD7UEYM6AAAAACvoFD6xEYM6AAAAACvoFD6xEYM6AAAAACvoFD7DEYM66P+/sjLoFD7DEYM6//8fsyvoFD7DEYM66P+/MjLoFD7DEYM6/v//MTLoFD7DEYM66P+/sjLoFD7DEYM68///MivoFD4BAIA/AgCAP/b/fz8CAIA/AgCAP/j/fz8CAIA/AgCAP/X/fz8BAIA/AgCAP/f/fz8BAIA/AQCAP/f/fz8CAIA/AgCAP/f/fz8BAIA/AQCAP/f/fz8CAIA/AgCAP/f/fz8CAIA/AQCAP/X/fz8CAIA/AQCAP/b/fz8BAIA/AgCAP/f/fz8BAIA/AwCAP/f/fz8BAIA/AgCAP/j/fz8CAIA/AwCAP/r/fz8BAIA/AgCAP/b/fz8AAIA/AgCAP/b/fz8CAIA/AgCAP/f/fz8CAIA/AwCAP/j/fz8AAIA/AgCAP/T/fz8CAIA/AgCAP/b/fz8CAIA/AgCAP/n/fz8CAIA/AgCAP/f/fz8BAIA/AwCAP/f/fz8AAIA/AgCAP/j/fz8BAIA/AgCAP/T/fz8CAIA/AwCAP/f/fz8BAIA/AgCAP/b/fz8CAIA/AQCAP/X/fz8CAIA/AgCAP/v/fz8CAIA/AQCAP/X/fz8CAIA/AwCAP/f/fz8DAIA/AgCAP/j/fz8BAIA/AwCAP/b/fz8CAIA/BACAP/v/fz8CAIA/AQCAP/r/fz8CAIA/AgCAP/n/fz8BAIA/AgCAP/n/fz8CAIA/AgCAP/T/fz8CAIA/AQCAP/T/fz8AAIA/AgCAP/b/fz8AAIA/AgCAP/j/fz8BAIA/AQCAP/X/fz8AAIA/AQCAP/f/fz8BAIA/AgCAP/f/fz8BAIA/BACAP/X/fz8CAIA/AgCAP/T/fz8CAIA/AwCAP/f/fz8BAIA/AQCAP/b/fz8BAIA/AgCAP/b/fz8AAAAAukOAPgAAAAAAAAAAukOAPgAAAAAAAAAAukOAPgAAAAAAAAAAukOAPgAAAAAAAAAAukOAPgAAAAAAAAAAukOAPgAAAAAAAAAAukOAPgAAAAAAAAAAukOAPgAAAAAAAAAAukOAPgAAAAAAAAAAukOAPgAAAAAAAAAAukOAPgAAAAAAAAAAukOAPgAAAAAAAAAAukOAPgAAAAAAAAAAukOAPgAAAAAAAAAAukOAPgAAAAAAAAAAukOAPgAAAAAAAAAAukOAPgAAAAAAAAAAukOAPgAAAAAAAAAAukOAPgAAAAAAAAAAukOAPgAAAAAAAAAAukOAPgAAAAAAAAAAukOAPgAAAAAAAAAAukOAPgAAAAAAAAAAukOAPgAAAAAAAAAAukOAPgAAAAAAAAAAukOAPgAAAAAAAAAAukOAPgAAAAAAAAAAukOAPgAAAAAAAAAAukOAPgAAAAAAAAAAukOAPgAAAAAAAAAAukOAPgAAAAAAAAAAukOAPgAAAAAAAAAAukOAPgAAAAAAAAAAukOAPgAAAAAAAAAAukOAPgAAAAAAAAAAukOAPgAAAAAAAAAAukOAPgAAAAAAAAAAukOAPgAAAAAAAAAAukOAPgAAAAAAAAAAukOAPgAAAAAAAAAAukOAPgAAAAAAAAAAukOAPgAAAAAAAAAAukOAPgAAAAAAAAAAukOAPgAAAAAAAAAAukOAPgAAAAAAAAAAukOAPgAAAAAAAAAAukOAPgAAAAAAAAAAukOAPgAAAAAAAAAAukOAPgAAAAD//38/BACAP/n/fz8AAIA/BgCAP/b/fz///38/BACAP/f/fz///38/BQCAP/b/fz8AAIA/BACAP/b/fz///38/BACAP/f/fz///38/BACAP/b/fz/9/38/AwCAP/X/fz/9/38/BACAP/T/fz8AAIA/BACAP/j/fz8AAIA/BACAP/j/fz///38/BACAP/b/fz/+/38/BQCAP/f/fz8BAIA/BgCAP/X/fz8AAIA/AwCAP/X/fz/+/38/BACAP/j/fz8AAIA/BQCAP/f/fz///38/AwCAP/X/fz/+/38/BACAP/f/fz8BAIA/BACAP/n/fz8AAIA/BACAP/f/fz8AAIA/BACAP/X/fz///38/BQCAP/b/fz8BAIA/AwCAP/j/fz8BAIA/BQCAP/n/fz///38/BQCAP/r/fz/+/38/BQCAP/j/fz///38/BQCAP/f/fz///38/AwCAP/b/fz///38/BQCAP/X/fz8AAIA/AwCAP/n/fz/+/38/BQCAP/n/fz/9/38/BACAP/b/fz8AAIA/BQCAP/X/fz/+/38/BQCAP/j/fz///38/BQCAP/f/fz///38/BACAP/f/fz/+/38/BQCAP/T/fz///38/BQCAP/X/fz/9/38/BgCAP/f/fz///38/AwCAP/b/fz8AAIA/BACAP/j/fz/+/38/BQCAP/T/fz/+/38/BQCAP/n/fz///38/BQCAP/X/fz/+/38/BgCAP/j/fz8AAIA/BgCAP/j/fz/+/38/BACAP/v/fz///38/BACAP/n/fz8EAICw8///MhjKhD0JAIiy8/9/MxjKhD38/w+y8/9/MxjKhD0EAICw8/9/MxjKhD35/5+x8/9/MxjKhD0KAECx8///MhjKhD0EAIAw8///MvjJhD0EAICw8/9/MxjKhD0EAOAx8///MhjKhD3+//8x8/9/MwjKhD0EAICw8///MhjKhD31/7cy8/9/MxjKhD3+//8x8/9/MwjKhD0EAOAx8/9/MxjKhD3U/28y8/9/MxjKhD0EAICw8/9/MxjKhD0AAAAA8///MgjKhD0EAICw8/9/MxjKhD3+/3+x8///MgjKhD0WAAAxBQDAMyjKhD0EAIAw8/9/MxjKhD0AAAAA8///MgjKhD0AAAAA8///MgjKhD0WAACx8///MgjKhD0WAACx8///MgjKhD0EAICw8/9/MxjKhD0EAIAw8/9/MxjKhD0WAAAxBQDAMyjKhD3+//8x8///MgjKhD3+//8x8///MgjKhD0EAOAx8/9/MxjKhD0KAMAxBQDAMyjKhD0EAOAx8/9/MxjKhD3+//8x8///MgjKhD0WAACxBQDAMyjKhD0EAICw8///MhjKhD0EAICw8/9/MxjKhD0EAIAw8/9/MxjKhD0AAAAA8///MgjKhD0AAAAA8/9/MwjKhD3+/3+x8///MgjKhD35/5+x8/9/MxjKhD35/5+x8///MhjKhD3+//+x8///MgjKhD3+//+x8///MgjKhD0AAAAA8/9/MwjKhD3+//+x8/9/MwjKhD0EAICw8/9/MxjKhD0EAICw8///MhjKhD0AAIA/+/9/P/v/fz8BAIA/+/9/P/3/fz///38//P9/P///fz/+/38/+/9/P/7/fz///38//P9/P/7/fz8AAIA/+/9/P/7/fz8AAIA/+v9/P/z/fz///38//f9/P/3/fz///38/+/9/P/v/fz8AAIA//P9/P/3/fz///38//v9/P/7/fz8AAIA//v9/PwAAgD8AAIA/+/9/P///fz8BAIA/+v9/P/3/fz8AAIA//f9/P/3/fz8CAIA/+/9/P/7/fz8AAIA//f9/P/v/fz///38//P9/P///fz8AAIA/+v9/PwAAgD8AAIA/+/9/P///fz8AAIA//f9/P/z/fz///38//f9/P/7/fz8AAIA/+/9/P/3/fz8AAIA//v9/PwAAgD8AAIA/+f9/P/7/fz8AAIA//f9/P/3/fz8AAIA/+f9/P/3/fz8AAIA//f9/P/3/fz8AAIA/+/9/P///fz///38//P9/P/7/fz8AAIA//P9/P/7/fz8BAIA/+/9/P///fz///38//f9/P/7/fz8BAIA//v9/P/v/fz///38//f9/P/v/fz8AAIA//P9/P/3/fz///38//P9/P/7/fz/9/38//P9/P/v/fz/+/38//P9/P/3/fz///38/+/9/P/7/fz8AAIA//P9/P/z/fz8BAIA//P9/P/7/fz///38/+v9/P///fz8AAIA//v9/P/7/fz///38/+P9/P/7/fz8AAIA/+/9/P/z/fz8BAIA/+/9/P/7/fz8AAIA//P9/PwAAgD8AAIA/+/9/P/v/fz/+//8xnydVPQAAAAD+//8xnydVPQAAAAD+//8xnydVPQAAAAD+//8xnydVPQAAAAD+//8xnydVPQAAAAD+//8xnydVPQAAAAD+//8xnydVPQAAAAD+//8xnydVPQAAAAD+//8xnydVPQAAAAD+//8xnydVPQAAAAD+//8xnydVPQAAAAD+//8xnydVPQAAAAD+//8xnydVPQAAAAD+//8xnydVPQAAAAD+//8xnydVPQAAAAD+//8xnydVPQAAAAD+//8xnydVPQAAAAD+//8xnydVPQAAAAD+//8xnydVPQAAAAD+//8xnydVPQAAAAD+//8xnydVPQAAAAD+//8xnydVPQAAAAD+//8xnydVPQAAAAD+//8xnydVPQAAAAD+//8xnydVPQAAAAD+//8xnydVPQAAAAD+//8xnydVPQAAAAD+//8xnydVPQAAAAD+//8xnydVPQAAAAD+//8xnydVPQAAAAD+//8xnydVPQAAAAD+//8xnydVPQAAAAD+//8xnydVPQAAAAD+//8xnydVPQAAAAD+//8xnydVPQAAAAD+//8xnydVPQAAAAD+//8xnydVPQAAAAD+//8xnydVPQAAAAD+//8xnydVPQAAAAD+//8xnydVPQAAAAD+//8xnydVPQAAAAD+//8xnydVPQAAAAD+//8xnydVPQAAAAD+//8xnydVPQAAAAD+//8xnydVPQAAAAD+//8xnydVPQAAAAD+//8xnydVPQAAAAD+//8xnydVPQAAAAD+//8xnydVPQAAAAABAIA/AACAPwMAgD8AAIA/AACAPwMAgD/+/38//f9/PwMAgD/+/38///9/PwMAgD///38/AACAPwQAgD///38///9/PwMAgD8AAIA/AACAPwMAgD8AAIA//f9/PwMAgD8CAIA//v9/PwMAgD8AAIA//f9/PwMAgD///38//f9/PwMAgD8AAIA/AACAPwQAgD/9/38/AQCAPwMAgD8BAIA/AACAPwIAgD///38//v9/PwQAgD/7/38//f9/PwQAgD///38///9/PwMAgD/+/38/AACAPwIAgD/8/38/AACAPwIAgD/+/38///9/PwMAgD8AAIA/AACAPwIAgD8AAIA/AQCAPwIAgD8AAIA/AQCAPwMAgD8AAIA/AQCAPwQAgD8AAIA///9/PwQAgD8BAIA///9/PwIAgD8BAIA///9/PwMAgD8AAIA///9/PwMAgD///38/AACAPwMAgD8BAIA/AACAPwQAgD///38/AQCAPwMAgD///38///9/PwIAgD///38/AACAPwMAgD8AAIA//v9/PwIAgD/+/38/AQCAPwQAgD///38/AACAPwQAgD8BAIA/AACAPwMAgD///38///9/PwIAgD8CAIA/AACAPwQAgD///38//f9/PwQAgD8AAIA///9/PwMAgD///38/AQCAPwMAgD8BAIA/AACAPwMAgD8AAIA/AACAPwIAgD8BAIA/AACAPwIAgD8AAIA/AACAPwQAgD///38//f9/PwIAgD8AAIA//v9/PwEAgD8BAIA/AACAPwMAgD9dObQ9B4BrNw1AarhkObQ9CgBrNw1AarhdObQ9BABsNw1AarhVObQ9BABsNw1AarhkObQ9BABsNw1AarhkObQ9BABsNw1AarhdObQ9B4BrNw1AarhkObQ9BABsNw1AarhkObQ9B4BrNw1AarhhObQ9B4BrNw1AarhhObQ9B4BrNw1AarhVObQ9B4BrNw1AarhdObQ9B4BrNw1AarhoObQ9B4BrNw1AarhhObQ9CgBrNw1AarhVObQ9B4BrNw1AarhhObQ9CgBrNwvAarhhObQ9DIBqNwvAarhhObQ9BABsNw1AarhhObQ9BABsNw1AarhdObQ9B4BrNw1AarhhObQ9BABsNw1AarhkObQ9BABsNw1AarhdObQ9B4BrNw1AarhdObQ9B4BrNw1AarhdObQ9B4BrNw1AarhhObQ9B4BrNw1AarhhObQ9B4BrNw1AarhhObQ9B4BrNw1AarhVObQ9B4BrNw1AarhkObQ9BABsN/S/abhhObQ9B4BrNw1AarhRObQ9BABsNw1AarhoObQ9B4BrNw1AarhoObQ9CgBrNwvAarhRObQ9B4BrNw1AarhhObQ9B4BrNw1AarhsObQ9CgBrNwvAarhRObQ9BABsN/S/abhoObQ9BABsN/S/abhVObQ9BABsNw1AarhZObQ9AoBsN/S/abhhObQ9CgBrNwvAarhkObQ9BABsNw1AarhVObQ9BABsNw1AarhoObQ9BABsNw1AarhoObQ9AoBsNw1AarhkObQ9B4BrNw1AarhdObQ9B4BrNw1AargDAIA//P9/PwEAgD8EAIA//P9/PwEAgD8DAIA//f9/PwMAgD8DAIA//v9/PwIAgD8EAIA//f9/PwMAgD8DAIA//v9/PwIAgD8CAIA//f9/PwEAgD8DAIA//v9/PwIAgD8DAIA//f9/PwIAgD8AAIA/AACAPwIAgD8CAIA/AACAPwIAgD8BAIA//P9/PwIAgD8BAIA/AACAPwIAgD8BAIA//v9/PwMAgD8BAIA//v9/PwIAgD8CAIA/AACAPwIAgD8CAIA//v9/PwMAgD8BAIA/AQCAPwMAgD8DAIA/AACAPwMAgD8BAIA/AACAPwIAgD8CAIA//v9/PwIAgD8CAIA/AACAPwMAgD8CAIA//v9/PwIAgD8BAIA/AACAPwMAgD8BAIA/AACAPwIAgD8AAIA/AACAPwIAgD8CAIA/AACAPwEAgD8BAIA/AACAPwIAgD8CAIA///9/PwEAgD8CAIA//v9/PwMAgD8DAIA//v9/PwMAgD8EAIA//f9/PwIAgD8EAIA//P9/PwQAgD8DAIA//v9/PwIAgD8EAIA///9/PwMAgD8BAIA/+/9/PwEAgD8DAIA//f9/PwMAgD8DAIA//v9/PwEAgD8DAIA//P9/PwMAgD8FAIA/+/9/PwEAgD8DAIA//P9/PwIAgD8DAIA//f9/PwIAgD8EAIA/+/9/PwMAgD8EAIA/+/9/PwMAgD8EAIA/+f9/PwIAgD8FAIA//v9/PwEAgD8EAIA//f9/PwEAgD8DAIA//P9/PwMAgD8DAIA//P9/PwEAgD8AAAAAPNF3PgAAAAAAAAAAPNF3PgAAAAAAAAAAPNF3PgAAAAAAAAAAPNF3PgAAAAAAAAAAPNF3PgAAAAAAAAAAPNF3PgAAAAAAAAAAPNF3PgAAAAAAAAAAPNF3PgAAAAAAAAAAPNF3PgAAAAAAAAAAPNF3PgAAAAAAAAAAPNF3PgAAAAAAAAAAPNF3PgAAAAAAAAAAPNF3PgAAAAAAAAAAPNF3PgAAAAAAAAAAPNF3PgAAAAAAAAAAPNF3PgAAAAAAAAAAPNF3PgAAAAAAAAAAPNF3PgAAAAAAAAAAPNF3PgAAAAAAAAAAPNF3PgAAAAAAAAAAPNF3PgAAAAAAAAAAPNF3PgAAAAAAAAAAPNF3PgAAAAAAAAAAPNF3PgAAAAAAAAAAPNF3PgAAAAAAAAAAPNF3PgAAAAAAAAAAPNF3PgAAAAAAAAAAPNF3PgAAAAAAAAAAPNF3PgAAAAAAAAAAPNF3PgAAAAAAAAAAPNF3PgAAAAAAAAAAPNF3PgAAAAAAAAAAPNF3PgAAAAAAAAAAPNF3PgAAAAAAAAAAPNF3PgAAAAAAAAAAPNF3PgAAAAAAAAAAPNF3PgAAAAAAAAAAPNF3PgAAAAAAAAAAPNF3PgAAAAAAAAAAPNF3PgAAAAAAAAAAPNF3PgAAAAAAAAAAPNF3PgAAAAAAAAAAPNF3PgAAAAAAAAAAPNF3PgAAAAAAAAAAPNF3PgAAAAAAAAAAPNF3PgAAAAAAAAAAPNF3PgAAAAAAAAAAPNF3PgAAAAAAAAAAPNF3PgAAAAD2/38/+v9/P/z/fz/5/38//f9/P/7/fz/2/38/+v9/P/3/fz/5/38//f9/P/z/fz/7/38/+v9/P/3/fz/5/38/+v9/P/v/fz/6/38/+/9/P/3/fz/6/38/+P9/P/3/fz/7/38/+f9/P/z/fz/+/38/9f9/P/z/fz///38/+P9/P/r/fz///38/9v9/P/n/fz/+/38/9P9/P/v/fz/8/38/+P9/P/v/fz/9/38/9v9/P/v/fz/9/38/+P9/P/z/fz/9/38/+P9/P/v/fz/5/38/+f9/P/3/fz/9/38/+/9/P/z/fz/7/38/+P9/P/z/fz/7/38/+v9/P/r/fz/5/38/+v9/P/z/fz/3/38/9/9/P/v/fz/7/38/+/9/P/v/fz/6/38//P9/P/r/fz/5/38//v9/P/z/fz/5/38/+v9/P/z/fz/7/38//P9/P/v/fz/5/38//P9/P/7/fz/4/38//P9/P/v/fz/5/38/+/9/P/j/fz/6/38//P9/P/z/fz/5/38//P9/P/n/fz/6/38//v9/P/r/fz/4/38/+/9/P/r/fz/5/38//P9/P/3/fz/6/38/+v9/P/3/fz/6/38//f9/P/7/fz/8/38/+/9/P/3/fz/5/38//P9/P/v/fz/7/38/+/9/P/r/fz/6/38//P9/P/r/fz/5/38//v9/P/z/fz/4/38//P9/P/v/fz/7/38/+f9/P/3/fz/5/38/+/9/P/7/fz/5/38/+P9/P/z/fz/4/38/+v9/P/v/fz/2/38/+v9/P/z/fz/z//+yXUxAPgAAAADz//+yXUxAPgAAAADz//+yXUxAPgAAAADz//+yXUxAPgAAAADz//+yXUxAPgAAAADz//+yXUxAPgAAAADz//+yXUxAPgAAAADz//+yXUxAPgAAAADz//+yXUxAPgAAAADz//+yXUxAPgAAAADz//+yXUxAPgAAAADz//+yXUxAPgAAAADz//+yXUxAPgAAAADz//+yXUxAPgAAAADz//+yXUxAPgAAAADz//+yXUxAPgAAAADz//+yXUxAPgAAAADz//+yXUxAPgAAAADz//+yXUxAPgAAAADz//+yXUxAPgAAAADz//+yXUxAPgAAAADz//+yXUxAPgAAAADz//+yXUxAPgAAAADz//+yXUxAPgAAAADz//+yXUxAPgAAAADz//+yXUxAPgAAAADz//+yXUxAPgAAAADz//+yXUxAPgAAAADz//+yXUxAPgAAAADz//+yXUxAPgAAAADz//+yXUxAPgAAAADz//+yXUxAPgAAAADz//+yXUxAPgAAAADz//+yXUxAPgAAAADz//+yXUxAPgAAAADz//+yXUxAPgAAAADz//+yXUxAPgAAAADz//+yXUxAPgAAAADz//+yXUxAPgAAAADz//+yXUxAPgAAAADz//+yXUxAPgAAAADz//+yXUxAPgAAAADz//+yXUxAPgAAAADz//+yXUxAPgAAAADz//+yXUxAPgAAAADz//+yXUxAPgAAAADz//+yXUxAPgAAAADz//+yXUxAPgAAAADz//+yXUxAPgAAAAAAAIA/BgCAPwQAgD8AAIA/BgCAPwQAgD8AAIA/BgCAPwQAgD8AAIA/BgCAPwUAgD8AAIA/BgCAPwUAgD8AAIA/BgCAPwUAgD8AAIA/BgCAPwUAgD/8/38/BgCAPwMAgD8BAIA/BgCAPwMAgD///38/BgCAPwQAgD8BAIA/BwCAPwMAgD8BAIA/BwCAPwUAgD8AAIA/BgCAPwUAgD8AAIA/BgCAPwMAgD8CAIA/BwCAPwMAgD8AAIA/BwCAPwQAgD/8/38/BwCAPwQAgD/+/38/BwCAPwQAgD/+/38/BgCAPwMAgD/+/38/BgCAPwMAgD8AAIA/CACAPwMAgD8AAIA/CACAPwMAgD8AAIA/CACAPwMAgD8AAIA/CACAPwMAgD8AAIA/CACAPwMAgD8AAIA/CACAPwMAgD8AAIA/CACAPwMAgD8AAIA/CACAPwMAgD/9/38/CACAPwMAgD/9/38/CACAPwMAgD/9/38/CACAPwMAgD8BAIA/BwCAPwMAgD8AAIA/BwCAPwUAgD/+/38/CACAPwQAgD///38/BwCAPwUAgD/9/38/BwCAPwQAgD/7/38/BQCAPwQAgD/+/38/CACAPwUAgD8AAIA/BwCAPwMAgD///38/BwCAPwUAgD/+/38/BwCAPwMAgD///38/BwCAPwQAgD/8/38/BwCAPwUAgD/8/38/BgCAPwMAgD///38/BgCAPwQAgD8AAIA/BwCAPwQAgD8AAIA/BgCAPwUAgD8BAIA/BgCAPwIAgD8AAIA/BgCAPwQAgD9dObS9A1CDOANAg7hZObS9BDCDOAKAg7hcObS9A1CDOANAg7hQObS9BCCDOAGgg7hVObS9BDCDOANgg7hZObS9BDCDOANgg7hZObS9BDCDOAKAg7hZObS9A1CDOANAg7hRObS9BCCDOAGgg7hRObS9BCCDOAHAg7hVObS9BDCDOANgg7hZObS9A2CDOANAg7hZObS9BDCDOAKAg7hEObS9BCCDOANgg7hIObS9BBCDOAGgg7hcObS9A0CDOAKAg7hZObS9BDCDOAKAg7hQObS9A0CDOAQgg7hVObS9BDCDOANgg7hVObS9A1CDOANAg7hRObS9BDCDOANgg7hVObS9BCCDOANgg7hgObS9A1CDOANAg7hVObS9BCCDOAGgg7hdObS9BDCDOAKAg7hRObS9BBCDOAGgg7hRObS9BCCDOAGgg7hdObS9A1CDOAQgg7hPObS9BDCDOAKAg7hZObS9BDCDOAKAg7hQObS9BDCDOANgg7hRObS9BCCDOAGgg7hVObS9BCCDOAGgg7hVObS9BDCDOAKAg7hdObS9A1CDOAQgg7hdObS9A2CDOAXggrhZObS9A1CDOANAg7hRObS9BDCDOAKAg7hRObS9BCCDOAGgg7hkObS9A1CDOAKAg7hPObS9BDCDOANgg7hMObS9BDCDOANgg7hcObS9A0CDOAKAg7hVObS9BCCDOANgg7hcObS9A0CDOAKAg7hVObS9BDCDOANgg7hZObS9BDCDOAKAg7hmObS9A2CDOANAg7hdObS9A1CDOANAg7j//38/AACAP///fz8AAIA/AQCAP///fz8AAIA//f9/P/3/fz8AAIA//v9/P/3/fz///38//f9/P/z/fz///38//f9/P/3/fz/9/38//f9/P/v/fz///38//P9/P/v/fz///38//P9/P/v/fz///38//P9/P/7/fz/+/38///9/P/3/fz///38//P9/P/3/fz8AAIA/+v9/P/7/fz8AAIA/AACAP/7/fz///38//f9/P/z/fz8AAIA//v9/P///fz///38//P9/P/z/fz/9/38//f9/P/7/fz///38//P9/P/7/fz8BAIA///9/P/7/fz8BAIA/+/9/P/7/fz///38//v9/P/3/fz8AAIA/AQCAPwAAgD8AAIA//v9/P/7/fz/+/38//v9/P/3/fz8BAIA//v9/P///fz8BAIA//v9/PwAAgD/8/38//f9/P/3/fz///38///9/P///fz///38//f9/PwAAgD8AAIA///9/PwAAgD///38/AACAP/7/fz8AAIA//P9/P///fz///38//f9/P/7/fz8AAIA//v9/P/3/fz/+/38/AACAP/3/fz///38/AACAP/7/fz/9/38//f9/P/z/fz/+/38/AACAP/7/fz/+/38//v9/P/3/fz/8/38/AQCAP/z/fz/+/38///9/P/7/fz///38//v9/P/3/fz///38//v9/P/3/fz/+/38///9/PwAAgD/9/38//v9/PwAAgD8AAIA//f9/P/7/fz8AAIA//P9/P/7/fz///38/AACAP///fz8AAAAA+dB3PgAAAAAAAAAA+dB3PgAAAAAAAAAA+dB3PgAAAAAAAAAA+dB3PgAAAAAAAAAA+dB3PgAAAAAAAAAA+dB3PgAAAAAAAAAA+dB3PgAAAAAAAAAA+dB3PgAAAAAAAAAA+dB3PgAAAAAAAAAA+dB3PgAAAAAAAAAA+dB3PgAAAAAAAAAA+dB3PgAAAAAAAAAA+dB3PgAAAAAAAAAA+dB3PgAAAAAAAAAA+dB3PgAAAAAAAAAA+dB3PgAAAAAAAAAA+dB3PgAAAAAAAAAA+dB3PgAAAAAAAAAA+dB3PgAAAAAAAAAA+dB3PgAAAAAAAAAA+dB3PgAAAAAAAAAA+dB3PgAAAAAAAAAA+dB3PgAAAAAAAAAA+dB3PgAAAAAAAAAA+dB3PgAAAAAAAAAA+dB3PgAAAAAAAAAA+dB3PgAAAAAAAAAA+dB3PgAAAAAAAAAA+dB3PgAAAAAAAAAA+dB3PgAAAAAAAAAA+dB3PgAAAAAAAAAA+dB3PgAAAAAAAAAA+dB3PgAAAAAAAAAA+dB3PgAAAAAAAAAA+dB3PgAAAAAAAAAA+dB3PgAAAAAAAAAA+dB3PgAAAAAAAAAA+dB3PgAAAAAAAAAA+dB3PgAAAAAAAAAA+dB3PgAAAAAAAAAA+dB3PgAAAAAAAAAA+dB3PgAAAAAAAAAA+dB3PgAAAAAAAAAA+dB3PgAAAAAAAAAA+dB3PgAAAAAAAAAA+dB3PgAAAAAAAAAA+dB3PgAAAAAAAAAA+dB3PgAAAAAAAAAA+dB3PgAAAAACAIA//P9/P/7/fz8CAIA//v9/PwAAgD8AAIA/+/9/PwAAgD8BAIA/+/9/PwAAgD8BAIA/+/9/PwAAgD8CAIA/+/9/PwAAgD8CAIA//v9/PwEAgD8AAIA//P9/PwAAgD8BAIA//f9/P/7/fz8CAIA/+/9/P///fz8DAIA//P9/PwEAgD8CAIA//f9/P/7/fz8BAIA/+f9/PwAAgD8BAIA/+f9/PwAAgD8BAIA/+f9/PwAAgD8BAIA/+f9/PwAAgD8BAIA/+f9/PwAAgD8BAIA/+f9/PwAAgD8BAIA/+f9/PwAAgD8BAIA//P9/P/3/fz8CAIA/+/9/P/7/fz8CAIA/+v9/PwEAgD8CAIA//P9/PwAAgD8AAIA//P9/PwAAgD8BAIA//P9/PwEAgD8DAIA//f9/PwAAgD8CAIA/+/9/PwAAgD8CAIA/+/9/PwAAgD8BAIA/+/9/P///fz8CAIA/+/9/PwEAgD8BAIA/+/9/PwAAgD8CAIA//P9/P/3/fz8BAIA//v9/PwAAgD8BAIA//f9/PwAAgD8CAIA//P9/PwAAgD8BAIA//P9/P///fz8CAIA//v9/PwAAgD8CAIA/+/9/PwAAgD8BAIA//f9/PwAAgD8BAIA//f9/P/z/fz8CAIA/+v9/P///fz8BAIA//f9/PwAAgD///38//P9/PwAAgD8BAIA//P9/PwAAgD8AAIA//P9/P///fz8CAIA//v9/P///fz8CAIA//f9/PwAAgD8CAIA//P9/PwAAgD8CAIA//P9/P/7/fz8AAAAAk0xAPgAAAAAAAAAAk0xAPgAAAAAAAAAAk0xAPgAAAAAAAAAAk0xAPgAAAAAAAAAAk0xAPgAAAAAAAAAAk0xAPgAAAAAAAAAAk0xAPgAAAAAAAAAAk0xAPgAAAAAAAAAAk0xAPgAAAAAAAAAAk0xAPgAAAAAAAAAAk0xAPgAAAAAAAAAAk0xAPgAAAAAAAAAAk0xAPgAAAAAAAAAAk0xAPgAAAAAAAAAAk0xAPgAAAAAAAAAAk0xAPgAAAAAAAAAAk0xAPgAAAAAAAAAAk0xAPgAAAAAAAAAAk0xAPgAAAAAAAAAAk0xAPgAAAAAAAAAAk0xAPgAAAAAAAAAAk0xAPgAAAAAAAAAAk0xAPgAAAAAAAAAAk0xAPgAAAAAAAAAAk0xAPgAAAAAAAAAAk0xAPgAAAAAAAAAAk0xAPgAAAAAAAAAAk0xAPgAAAAAAAAAAk0xAPgAAAAAAAAAAk0xAPgAAAAAAAAAAk0xAPgAAAAAAAAAAk0xAPgAAAAAAAAAAk0xAPgAAAAAAAAAAk0xAPgAAAAAAAAAAk0xAPgAAAAAAAAAAk0xAPgAAAAAAAAAAk0xAPgAAAAAAAAAAk0xAPgAAAAAAAAAAk0xAPgAAAAAAAAAAk0xAPgAAAAAAAAAAk0xAPgAAAAAAAAAAk0xAPgAAAAAAAAAAk0xAPgAAAAAAAAAAk0xAPgAAAAAAAAAAk0xAPgAAAAAAAAAAk0xAPgAAAAAAAAAAk0xAPgAAAAAAAAAAk0xAPgAAAAAAAAAAk0xAPgAAAAD6/38/BwCAP/z/fz/+/38/BgCAP/v/fz/6/38/BwCAP/z/fz/+/38/CACAPwAAgD/9/38/BgCAP/z/fz/+/38/BwCAP/z/fz/8/38/BgCAP/7/fz/8/38/BgCAP/7/fz/8/38/BgCAP/7/fz/8/38/BgCAP/7/fz/8/38/BgCAP/7/fz/8/38/BgCAP/7/fz/8/38/BgCAP/7/fz/8/38/BQCAP/z/fz///38/BACAP/3/fz/+/38/BwCAP///fz/9/38/BgCAP/z/fz/8/38/BQCAP/r/fz/+/38/BgCAP/r/fz/9/38/BQCAP/r/fz/8/38/BACAP/3/fz8BAIA/BACAP///fz/9/38/BQCAP/j/fz///38/BQCAP/z/fz///38/BACAP/r/fz///38/BACAP/r/fz///38/BACAP/r/fz///38/BACAP/r/fz/+/38/BACAP/v/fz/+/38/AwCAP/v/fz/+/38/AwCAP/v/fz/9/38/BQCAP/z/fz/8/38/BgCAP/z/fz8AAIA/BACAP/n/fz/8/38/BACAP/r/fz/+/38/BQCAP/3/fz8AAIA/BACAP/v/fz8BAIA/BQCAP/z/fz/+/38/BQCAP///fz/+/38/BgCAP/v/fz/+/38/BACAP/3/fz///38/BgCAP/3/fz///38/BQCAP/v/fz/8/38/BQCAP/z/fz/7/38/BQCAP/v/fz/9/38/BgCAP/n/fz/6/38/BQCAP/3/fz///38/BwCAP/n/fz/6/38/BwCAP/z/fz/Ve4o9HKDpvA/zgL3We4o9/J/pvAnzgL3de4o9LaDpvA/zgL3Xe4o9EqDpvA/zgL3be4o9HKDpvA/zgL3Ze4o9EqDpvA/zgL3Ze4o9DaDpvAnzgL3We4o9DaDpvA/zgL3Ve4o9F6DpvA/zgL3Ve4o9IqDpvBfzgL3Te4o98p/pvAnzgL3Ze4o9DaDpvAnzgL3Ve4o9EqDpvAnzgL3Se4o98p/pvA/zgL3Xe4o9B6DpvA/zgL3Ve4o9DaDpvA/zgL3Ve4o9DaDpvA/zgL3Ze4o9DaDpvAnzgL3Xe4o9AqDpvA/zgL3We4o9DaDpvA/zgL3We4o9DaDpvA/zgL3Xe4o9AqDpvAnzgL3Xe4o9HKDpvBfzgL3Ve4o9DaDpvA/zgL3Ve4o9B6DpvAnzgL3We4o9EqDpvA/zgL3Xe4o9DaDpvA/zgL3Xe4o9B6DpvA/zgL3Ze4o9B6DpvAnzgL3Xe4o9IqDpvA/zgL3Xe4o9EqDpvA/zgL3Se4o9/J/pvA/zgL3Se4o9/J/pvA/zgL3Ve4o9HKDpvA/zgL3We4o9B6DpvA/zgL3We4o9AqDpvA/zgL3We4o9/J/pvAnzgL3We4o9DaDpvBfzgL3Ve4o9F6DpvA/zgL3Se4o9B6DpvAnzgL3Ze4o9IqDpvA/zgL3Pe4o9B6DpvA/zgL3Xe4o9EqDpvA/zgL3Ve4o9B6DpvA/zgL3Ze4o9DaDpvA/zgL3Ze4o9DaDpvAnzgL3We4o9AqDpvA/zgL3Te4o9DaDpvA/zgL3Ve4o9HKDpvA/zgL0DAIA//v9/P/z/fz8EAIA//v9/P/z/fz8FAIA///9/P/3/fz8FAIA/+/9/P/3/fz8GAIA/+P9/P/7/fz8EAIA/+/9/P/7/fz8GAIA//P9/P/z/fz8FAIA/+v9/P/v/fz8GAIA/+/9/P/z/fz8FAIA/+/9/P/z/fz8GAIA//v9/P/v/fz8EAIA//v9/P/v/fz8EAIA///9/P/r/fz8EAIA//P9/P/v/fz8FAIA/AACAP/v/fz8FAIA//P9/P/z/fz8FAIA//f9/P/3/fz8GAIA/+/9/P/3/fz8HAIA/+/9/P/3/fz8FAIA//f9/P/z/fz8FAIA/+v9/P/v/fz8GAIA/+v9/P/3/fz8EAIA/+v9/P/3/fz8GAIA//f9/P/7/fz8EAIA/+/9/P/3/fz8FAIA/+/9/P/3/fz8GAIA/+/9/P/z/fz8FAIA/+/9/P///fz8FAIA/+/9/P/v/fz8EAIA/+f9/P/r/fz8FAIA/+f9/P/v/fz8GAIA/+/9/P/3/fz8FAIA//P9/P/z/fz8EAIA//f9/P/v/fz8FAIA/+v9/P/v/fz8EAIA//f9/P/v/fz8HAIA//P9/P/3/fz8EAIA//f9/P/z/fz8GAIA/+f9/P/v/fz8GAIA//v9/P/7/fz8EAIA/+f9/P/v/fz8GAIA//P9/P/r/fz8EAIA//v9/P/3/fz8FAIA///9/P/7/fz8HAIA///9/P/3/fz8FAIA/AACAP/z/fz8FAIA//P9/P/v/fz8FAIA//f9/P/r/fz8DAIA//v9/P/z/fz8WAICy8z+IPgAAAAAWAICy8z+IPgAAAAAWAICy8z+IPgAAAAAWAICy8z+IPgAAAAAWAICy8z+IPgAAAAAWAICy8z+IPgAAAAAWAICy8z+IPgAAAAAWAICy8z+IPgAAAAAWAICy8z+IPgAAAAAWAICy8z+IPgAAAAAWAICy8z+IPgAAAAAWAICy8z+IPgAAAAAWAICy8z+IPgAAAAAWAICy8z+IPgAAAAAWAICy8z+IPgAAAAAWAICy8z+IPgAAAAAWAICy8z+IPgAAAAAWAICy8z+IPgAAAAAWAICy8z+IPgAAAAAWAICy8z+IPgAAAAAWAICy8z+IPgAAAAAWAICy8z+IPgAAAAAWAICy8z+IPgAAAAAWAICy8z+IPgAAAAAWAICy8z+IPgAAAAAWAICy8z+IPgAAAAAWAICy8z+IPgAAAAAWAICy8z+IPgAAAAAWAICy8z+IPgAAAAAWAICy8z+IPgAAAAAWAICy8z+IPgAAAAAWAICy8z+IPgAAAAAWAICy8z+IPgAAAAAWAICy8z+IPgAAAAAWAICy8z+IPgAAAAAWAICy8z+IPgAAAAAWAICy8z+IPgAAAAAWAICy8z+IPgAAAAAWAICy8z+IPgAAAAAWAICy8z+IPgAAAAAWAICy8z+IPgAAAAAWAICy8z+IPgAAAAAWAICy8z+IPgAAAAAWAICy8z+IPgAAAAAWAICy8z+IPgAAAAAWAICy8z+IPgAAAAAWAICy8z+IPgAAAAAWAICy8z+IPgAAAAAWAICy8z+IPgAAAADx/38//v9/PwAAgD/y/38/+/9/PwAAgD/z/38//v9/P/7/fz/0/38//v9/PwIAgD/y/38///9/P/z/fz/z/38/AACAP/z/fz/x/38/AACAP/3/fz/z/38/AACAP/v/fz/x/38/AQCAP/b/fz/0/38/AgCAP/v/fz/y/38/AQCAP/3/fz/y/38/AACAP/v/fz/0/38/AACAP/3/fz/y/38/AACAP///fz/0/38///9/PwAAgD/0/38//v9/P///fz/y/38//v9/P///fz/1/38/+/9/PwAAgD/2/38///9/P///fz/1/38///9/P/v/fz/0/38/AACAPwAAgD/z/38///9/PwAAgD/1/38//f9/PwEAgD/y/38/+/9/PwEAgD/0/38//P9/P///fz/1/38//P9/PwEAgD/0/38/+/9/P/7/fz/0/38/+/9/PwAAgD/0/38//P9/PwEAgD/0/38//v9/PwAAgD/y/38//v9/P/3/fz/v/38//P9/P///fz/z/38///9/PwEAgD/z/38//f9/PwAAgD/y/38//v9/P/7/fz/1/38//v9/PwAAgD/z/38//v9/PwAAgD/0/38//P9/PwAAgD/y/38/+v9/PwIAgD/z/38//v9/P///fz/z/38//f9/PwAAgD/z/38//P9/PwAAgD/1/38///9/PwEAgD/0/38//P9/PwEAgD/2/38//v9/PwEAgD/2/38///9/P///fz/z/38//f9/PwEAgD/2/38//P9/PwAAgD/x/38//v9/PwAAgD8AAAAA1DiNPgAAAAAAAAAA1DiNPgAAAAAAAAAA1DiNPgAAAAAAAAAA1DiNPgAAAAAAAAAA1DiNPgAAAAAAAAAA1DiNPgAAAAAAAAAA1DiNPgAAAAAAAAAA1DiNPgAAAAAAAAAA1DiNPgAAAAAAAAAA1DiNPgAAAAAAAAAA1DiNPgAAAAAAAAAA1DiNPgAAAAAAAAAA1DiNPgAAAAAAAAAA1DiNPgAAAAAAAAAA1DiNPgAAAAAAAAAA1DiNPgAAAAAAAAAA1DiNPgAAAAAAAAAA1DiNPgAAAAAAAAAA1DiNPgAAAAAAAAAA1DiNPgAAAAAAAAAA1DiNPgAAAAAAAAAA1DiNPgAAAAAAAAAA1DiNPgAAAAAAAAAA1DiNPgAAAAAAAAAA1DiNPgAAAAAAAAAA1DiNPgAAAAAAAAAA1DiNPgAAAAAAAAAA1DiNPgAAAAAAAAAA1DiNPgAAAAAAAAAA1DiNPgAAAAAAAAAA1DiNPgAAAAAAAAAA1DiNPgAAAAAAAAAA1DiNPgAAAAAAAAAA1DiNPgAAAAAAAAAA1DiNPgAAAAAAAAAA1DiNPgAAAAAAAAAA1DiNPgAAAAAAAAAA1DiNPgAAAAAAAAAA1DiNPgAAAAAAAAAA1DiNPgAAAAAAAAAA1DiNPgAAAAAAAAAA1DiNPgAAAAAAAAAA1DiNPgAAAAAAAAAA1DiNPgAAAAAAAAAA1DiNPgAAAAAAAAAA1DiNPgAAAAAAAAAA1DiNPgAAAAAAAAAA1DiNPgAAAAAAAAAA1DiNPgAAAAADAIA/AgCAPwIAgD8DAIA/AQCAPwIAgD8DAIA/AgCAPwMAgD8FAIA/AQCAPwMAgD8EAIA/AQCAPwMAgD8EAIA/AQCAPwMAgD8EAIA/AACAPwMAgD8DAIA/AgCAPwMAgD8EAIA/AQCAPwIAgD8DAIA/AgCAPwIAgD8DAIA/AQCAPwMAgD8EAIA/AQCAPwQAgD8EAIA/AQCAPwMAgD8FAIA/AQCAPwMAgD8EAIA/AACAPwEAgD8FAIA/AQCAPwIAgD8EAIA/AwCAPwEAgD8DAIA/AwCAPwIAgD8DAIA/AQCAPwMAgD8DAIA/BACAPwEAgD8FAIA/AwCAPwEAgD8FAIA/AQCAPwIAgD8DAIA/AQCAPwEAgD8CAIA/AwCAPwEAgD8FAIA/AwCAPwMAgD8DAIA/AwCAPwMAgD8CAIA/AgCAPwMAgD8CAIA/AwCAPwEAgD8DAIA/AQCAPwIAgD8EAIA/AgCAPwIAgD8EAIA/AwCAPwIAgD8EAIA/AwCAPwIAgD8EAIA/AwCAPwEAgD8EAIA/AACAPwIAgD8DAIA/AgCAPwEAgD8EAIA/AACAPwMAgD8EAIA/AgCAPwMAgD8EAIA/AgCAPwMAgD8EAIA/AACAPwIAgD8DAIA/AgCAPwMAgD8FAIA/AgCAPwQAgD8EAIA/AQCAPwIAgD8EAIA/AwCAPwQAgD8CAIA/AQCAPwMAgD8CAIA/AQCAPwIAgD8EAIA/AQCAPwMAgD8EAIA/AgCAPwMAgD8EAIA/AwCAPwEAgD8DAIA/AgCAPwIAgD8ixxm74oWHvZEz5Dwixxm74YWHvaEz5Dwixxm74YWHvaEz5Dz/xhm74YWHvaEz5Dwixxm74YWHvaEz5Dz/xhm74YWHvaEz5Dz/xhm74YWHvaEz5Dz/xhm744WHvaEz5Dwixxm744WHvaEz5Dzhxhm744WHvaEz5Dzhxhm744WHvaEz5Dz/xhm744WHvaEz5Dzhxhm744WHvaEz5Dz/xhm744WHvaEz5Dz/xhm744WHvaEz5Dz/xhm744WHvaEz5Dwixxm74YWHvaEz5Dwixxm74YWHvaEz5Dwixxm74YWHvaEz5Dwixxm74YWHvaEz5Dz/xhm74YWHvaEz5Dwixxm74YWHvaEz5Dz/xhm744WHvaEz5Dzhxhm744WHvaEz5Dzhxhm744WHvaEz5Dwixxm744WHvaEz5Dzhxhm744WHvaEz5Dz/xhm744WHvaEz5Dwixxm744WHvaEz5Dwixxm744WHvaEz5Dz/xhm74YWHvaEz5Dzhxhm74YWHvaEz5Dz/xhm74YWHvaEz5Dz/xhm74oWHvZEz5Dwixxm74oWHvZEz5Dz/xhm74oWHvZEz5Dwixxm74oWHvZEz5Dwixxm74oWHvYEz5Dz/xhm744WHvYEz5Dz/xhm744WHvYEz5Dz/xhm744WHvYEz5Dz/xhm74oWHvYEz5Dz/xhm744WHvYEz5Dz/xhm74oWHvZEz5Dz/xhm74oWHvZEz5Dz/xhm74oWHvZEz5DxAxxm74YWHvaEz5DxAxxm74YWHvaEz5Dwixxm74oWHvZEz5DwBAIA/BgCAPwAAgD/+/38/BgCAPwEAgD8AAIA/BgCAPwEAgD///38/BQCAPwAAgD/+/38/BQCAPwIAgD8AAIA/BgCAPwEAgD/+/38/BQCAPwIAgD8AAIA/BgCAPwEAgD/9/38/BACAPwMAgD///38/BACAPwMAgD8AAIA/AgCAPwMAgD8BAIA/BQCAPwQAgD///38/AgCAPwMAgD/+/38/BACAPwQAgD8AAIA/BACAPwUAgD///38/BgCAPwEAgD8AAIA/BACAPwIAgD8AAIA/BgCAPwAAgD///38/BQCAPwAAgD8AAIA/BgCAPwEAgD8AAIA/BwCAPwIAgD8AAIA/BgCAPwMAgD/9/38/BwCAPwEAgD8BAIA/BQCAPwIAgD///38/BQCAPwQAgD///38/BQCAPwIAgD///38/BACAPwQAgD8BAIA/BgCAPwEAgD8AAIA/BQCAPwMAgD8BAIA/BgCAPwMAgD8AAIA/BgCAPwQAgD8BAIA/BQCAPwEAgD8AAIA/BgCAPwEAgD///38/BwCAPwEAgD8AAIA/BwCAPwAAgD///38/BwCAPwAAgD8AAIA/BwCAP///fz///38/BwCAP/3/fz/+/38/CACAPwAAgD8AAIA/BwCAPwAAgD8BAIA/BwCAP///fz///38/BgCAPwEAgD8BAIA/CACAPwEAgD/+/38/BwCAP/7/fz///38/BgCAPwEAgD/+/38/BwCAPwEAgD8BAIA/BgCAPwEAgD8AAIA/BgCAPwAAgD8BAIA/BgCAPwAAgD89M4y9CAzqvLDrgL0/M4y9CAzqvMDrgL0+M4y9CAzqvLjrgL0+M4y9HQzqvMDrgL09M4y9HQzqvMDrgL0+M4y9KAzqvLjrgL09M4y9HQzqvMDrgL0+M4y9LQzqvLjrgL09M4y9PgzqvLjrgL09M4y9LQzqvLjrgL0+M4y9PgzqvLjrgL1AM4y9WAzqvLjrgL1AM4y9XgzqvLjrgL0+M4y9PgzqvLjrgL09M4y9PgzqvLjrgL0/M4y9OAzqvLjrgL09M4y9PgzqvLjrgL09M4y9PgzqvLjrgL0/M4y9YwzqvMDrgL09M4y9PgzqvLjrgL09M4y9PgzqvLjrgL0+M4y9XgzqvLjrgL0+M4y9YwzqvMDrgL09M4y9PgzqvLjrgL1AM4y9WAzqvLjrgL0/M4y9QwzqvMDrgL09M4y9LQzqvLjrgL0+M4y9IwzqvLDrgL09M4y9GAzqvLjrgL09M4y9HQzqvMDrgL09M4y9GAzqvMDrgL0/M4y9EwzqvMDrgL0+M4y9CAzqvMDrgL0/M4y9CAzqvMDrgL0/M4y9CAzqvMDrgL0/M4y9CAzqvMDrgL0+M4y92AvqvMDrgL07M4y97QvqvMDrgL0/M4y9CAzqvMDrgL09M4y93QvqvMDrgL09M4y9/QvqvMjrgL0+M4y9AgzqvLDrgL09M4y9EwzqvMDrgL09M4y9EwzqvMDrgL09M4y9CAzqvLjrgL0+M4y9AgzqvLjrgL0/M4y9EwzqvMDrgL0/M4y9AgzqvLjrgL09M4y9CAzqvLDrgL0AAIA/AACAPwAAgD8BAIA///9/P///fz///38/AACAPwEAgD///38/AACAPwEAgD8BAIA/+/9/PwEAgD///38//P9/PwAAgD8AAIA/+/9/PwIAgD/+/38//P9/PwEAgD///38/+f9/PwMAgD8AAIA//f9/PwEAgD///38//v9/PwAAgD8AAIA//v9/PwIAgD8AAIA//f9/PwIAgD8AAIA//P9/PwEAgD8AAIA/AACAPwIAgD///38/AACAPwEAgD8BAIA/+v9/PwEAgD8AAIA//P9/PwEAgD8BAIA//P9/PwIAgD8AAIA/+/9/PwEAgD///38//f9/PwIAgD/9/38///9/PwIAgD8CAIA///9/PwEAgD8BAIA//f9/PwEAgD8AAIA/AACAPwIAgD8AAIA//P9/PwIAgD/9/38//f9/PwEAgD/+/38//P9/PwMAgD8AAIA//f9/PwEAgD8AAIA/AACAP/7/fz8AAIA/AACAPwAAgD/+/38/AACAP///fz8AAIA/AACAP///fz8AAIA/AACAP/z/fz8AAIA/AACAPwAAgD8AAIA/AQCAP/r/fz8AAIA/AACAP/7/fz8AAIA/AQCAPwAAgD///38/AQCAP/z/fz8AAIA/AACAP/z/fz///38/AACAP/z/fz8BAIA/AgCAP/3/fz8AAIA/AACAPwEAgD///38//f9/PwAAgD8AAIA/AACAPwAAgD///38/AACAP/3/fz///38/AACAP/7/fz///38///9/PwAAgD8AAIA/AACAPwAAgD8hAECyxD+IPgAAAAAhAECyxD+IPgAAAAAhAECyxD+IPgAAAAAhAECyxD+IPgAAAAAhAECyxD+IPgAAAAAhAECyxD+IPgAAAAAhAECyxD+IPgAAAAAhAECyxD+IPgAAAAAhAECyxD+IPgAAAAAhAECyxD+IPgAAAAAhAECyxD+IPgAAAAAhAECyxD+IPgAAAAAhAECyxD+IPgAAAAAhAECyxD+IPgAAAAAhAECyxD+IPgAAAAAhAECyxD+IPgAAAAAhAECyxD+IPgAAAAAhAECyxD+IPgAAAAAhAECyxD+IPgAAAAAhAECyxD+IPgAAAAAhAECyxD+IPgAAAAAhAECyxD+IPgAAAAAhAECyxD+IPgAAAAAhAECyxD+IPgAAAAAhAECyxD+IPgAAAAAhAECyxD+IPgAAAAAhAECyxD+IPgAAAAAhAECyxD+IPgAAAAAhAECyxD+IPgAAAAAhAECyxD+IPgAAAAAhAECyxD+IPgAAAAAhAECyxD+IPgAAAAAhAECyxD+IPgAAAAAhAECyxD+IPgAAAAAhAECyxD+IPgAAAAAhAECyxD+IPgAAAAAhAECyxD+IPgAAAAAhAECyxD+IPgAAAAAhAECyxD+IPgAAAAAhAECyxD+IPgAAAAAhAECyxD+IPgAAAAAhAECyxD+IPgAAAAAhAECyxD+IPgAAAAAhAECyxD+IPgAAAAAhAECyxD+IPgAAAAAhAECyxD+IPgAAAAAhAECyxD+IPgAAAAAhAECyxD+IPgAAAAAhAECyxD+IPgAAAAAFAIA/AACAP/7/fz8CAIA/AwCAP/7/fz8DAIA/AQCAPwEAgD8DAIA/AQCAPwAAgD8EAIA///9/PwAAgD8CAIA//v9/PwEAgD8EAIA//v9/PwIAgD8EAIA/+/9/PwIAgD8EAIA//v9/PwEAgD8FAIA/AACAPwEAgD8EAIA///9/P///fz8EAIA/AQCAP///fz8DAIA///9/PwEAgD8FAIA///9/PwAAgD8EAIA///9/P///fz8EAIA/AQCAPwAAgD8DAIA/AQCAP///fz8EAIA/AQCAP/7/fz8DAIA/AACAPwEAgD8EAIA/AQCAPwEAgD8DAIA/AQCAPwAAgD8EAIA/AQCAPwEAgD8FAIA/AQCAPwAAgD8DAIA/AACAPwAAgD8DAIA/AQCAPwAAgD8EAIA/AQCAP/7/fz8DAIA/AACAP/7/fz8EAIA/AACAPwEAgD8DAIA/AACAPwEAgD8DAIA/+v9/PwEAgD8CAIA//P9/PwQAgD8BAIA//f9/PwIAgD8FAIA//P9/PwQAgD8CAIA/+/9/PwIAgD8EAIA//P9/PwUAgD8EAIA//v9/PwMAgD8EAIA/+P9/PwMAgD8EAIA//f9/PwIAgD8EAIA/AACAPwAAgD8FAIA/AgCAPwAAgD8FAIA/AQCAPwAAgD8FAIA//v9/PwAAgD8DAIA/AQCAP///fz8FAIA///9/PwAAgD8EAIA//v9/PwEAgD8DAIA//P9/P/3/fz8FAIA/AACAP///fz8CAIA/AQCAP///fz8FAIA/AACAP/7/fz8AAAAA7DiNPgAAAAAAAAAA7DiNPgAAAAAAAAAA7DiNPgAAAAAAAAAA7DiNPgAAAAAAAAAA7DiNPgAAAAAAAAAA7DiNPgAAAAAAAAAA7DiNPgAAAAAAAAAA7DiNPgAAAAAAAAAA7DiNPgAAAAAAAAAA7DiNPgAAAAAAAAAA7DiNPgAAAAAAAAAA7DiNPgAAAAAAAAAA7DiNPgAAAAAAAAAA7DiNPgAAAAAAAAAA7DiNPgAAAAAAAAAA7DiNPgAAAAAAAAAA7DiNPgAAAAAAAAAA7DiNPgAAAAAAAAAA7DiNPgAAAAAAAAAA7DiNPgAAAAAAAAAA7DiNPgAAAAAAAAAA7DiNPgAAAAAAAAAA7DiNPgAAAAAAAAAA7DiNPgAAAAAAAAAA7DiNPgAAAAAAAAAA7DiNPgAAAAAAAAAA7DiNPgAAAAAAAAAA7DiNPgAAAAAAAAAA7DiNPgAAAAAAAAAA7DiNPgAAAAAAAAAA7DiNPgAAAAAAAAAA7DiNPgAAAAAAAAAA7DiNPgAAAAAAAAAA7DiNPgAAAAAAAAAA7DiNPgAAAAAAAAAA7DiNPgAAAAAAAAAA7DiNPgAAAAAAAAAA7DiNPgAAAAAAAAAA7DiNPgAAAAAAAAAA7DiNPgAAAAAAAAAA7DiNPgAAAAAAAAAA7DiNPgAAAAAAAAAA7DiNPgAAAAAAAAAA7DiNPgAAAAAAAAAA7DiNPgAAAAAAAAAA7DiNPgAAAAAAAAAA7DiNPgAAAAAAAAAA7DiNPgAAAAAAAAAA7DiNPgAAAAD2/38//f9/PwEAgD/4/38//v9/PwIAgD/2/38/+/9/PwIAgD/1/38//P9/PwIAgD/3/38//v9/PwEAgD/3/38//P9/PwAAgD/3/38//f9/PwIAgD/2/38//v9/PwEAgD/5/38/+v9/PwEAgD/3/38//v9/PwAAgD/4/38///9/PwAAgD/2/38///9/PwEAgD/3/38//P9/PwEAgD/3/38//f9/PwIAgD/5/38//P9/PwAAgD/3/38//f9/PwIAgD/0/38//P9/PwEAgD/3/38//v9/PwIAgD/3/38//P9/PwIAgD/3/38/+v9/PwIAgD/4/38//f9/PwIAgD/2/38/+v9/PwMAgD/2/38//f9/PwMAgD/1/38//P9/PwIAgD/4/38/+/9/PwMAgD/3/38/+P9/PwAAgD/3/38/+/9/PwIAgD/4/38//P9/PwMAgD/2/38//f9/PwEAgD/4/38///9/PwIAgD/4/38//v9/PwIAgD/4/38//f9/PwEAgD/2/38/+f9/PwAAgD/3/38/+/9/PwEAgD/4/38/AACAPwEAgD/3/38//f9/PwAAgD/4/38//v9/PwAAgD/5/38//v9/PwEAgD/4/38//P9/PwEAgD/5/38/+/9/PwEAgD/3/38//P9/PwIAgD/2/38/+v9/PwEAgD/3/38//v9/PwIAgD/2/38//P9/PwEAgD/2/38//f9/PwIAgD/3/38///9/PwIAgD/z/38/+v9/PwAAgD/1/38/+/9/PwAAgD/2/38//f9/PwEAgD+CK7+6SZOHvbYz5Dw/LL+6SZOHvbYz5DwDLL+6SZOHvbYz5DwDLL+6SZOHvbYz5Dy+K7+6SZOHvbYz5DwDLL+6SZOHvbYz5DwDLL+6SZOHvbYz5DwDLL+6SZOHvbYz5Dy+K7+6RpOHvcEz5Dy+K7+6RpOHvcEz5DwDLL+6RpOHvcEz5DyCK7+6RpOHvcEz5Dy+K7+6RpOHvcEz5Dy+K7+6RpOHvcEz5Dy+K7+6RZOHvbYz5Dy+K7+6RpOHvcEz5Dy+K7+6RpOHvcEz5Dw/LL+6RZOHvbYz5DwDLL+6RZOHvbYz5DwDLL+6RZOHvcEz5DyCK7+6RpOHvcEz5Dy+K7+6RpOHvcEz5Dy+K7+6RpOHvcEz5DwDLL+6RpOHvcEz5Dw/LL+6SZOHvbYz5DwDLL+6SZOHvbYz5DwDLL+6SZOHvbYz5Dw/LL+6SZOHvbYz5Dy+K7+6SZOHvbYz5DwDLL+6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AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/B34WtgAAAAAAAIA/B34WtgAAAAAAAIA/B34WtgAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIC/HXWvNQAAAAAAAIC/HXWvNQAAAAAAAIC/HXWvNQAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/SK+qNQAAAAAAAIC/SK+qNQAAAAAAAIC/SK+qNQAAAAAAAIC/WVantQAAAAAAAIC/WVantQAAAAAAAIC/WVantQAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/ppmYtQAAAAAAAIC/ppmYtQAAAAAAAIC/ppmYtQAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/4+edtQAAAAAAAIC/4+edtQAAAAAAAIC/4+edtQAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/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AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/noFtNQAAAAAAAIA/noFtNQAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/XWOpNQAAAAAAAIA/XWOpNQAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/Fyy4tQAAAAAAAIA/Fyy4tQAAAAAAAIA/Fyy4tQAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/Kp/cNQAAAAAAAIC/Kp/cNQAAAAAAAIC/Kp/cNQAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/WZ+fNQAAAAAAAIC/WZ+fNQAAAAAAAIC/WZ+fNQAAAAAAAIC/UtuntQAAAAAAAIC/UtuntQAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/w5KqtQAAAAAAAIC/w5KqtQAAAAAAAIC/w5KqtQAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC//dYPNgAAAAAAAIC//dYPNgAAAAAAAIC//dYPNgAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/wKiqtQAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/E+qoNQAAAAAAAIC/E+qoNQAAAAAAAIC/n72MNQAAAAAAAIC/n72MNQAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/V26qtQAAAAAAAIC/V26qtQAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/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BAAAAAIAAwAEAAAAAgADAAQAAAACAAMABAAAAAIAAwAEAAAAAgADAAQAAAACAAMABAAAAAIAAwAEAAYAAgADAAQAAAACAAMABAAAAAIAAwAEAAAAAgADAAQABQADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAAEAAAAAAAAAAMABAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAQAAAAAAAAABAAAAAAAAAADAAQAAAAAAAMABAAAAAAABAAAAAAAAAADAAQAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAMABAAAAAAAAwAEAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAADAAQAAAAAAAMABAAAAAAAAgADAAQABgACAAMABAAGAAIAAwAEAAYAAgADAAQABgACAAMABAAFAAIAAwAEAAUAAgADAAQABQACAAMABAAFAAIAAwAEAAUAAgADAAQABQACAAMABAAFAAIAAwAEAAUAAgADAAQABQACAAMABAAFAAIAAwAEAAYAAgADAAQABgACAAMABAAFAAIAAwAEAAUAAgADAAQABQACAAMABAAFAAIAAwAEAAUAAgADAAQABQACAAMABAAFAAIAAwAEAAUAAgADAAQABQACAAMABAAFAAIAAwAEAAUAAgADAAQABQAAAAsADQAAAAAACwANAAAAAAALAA0ADwAAAAsADQAAAAsADQAPAAAACwANAA8AAAAAAAsADQAPAAAACwANAA8AAAALAA0AAAAAAAsADQAAAAAACwANAAAAAAALAA0AAAALAA0ADwAAAAsADQAPAAAAAAALAA0ADwALAA0ADwAAAAAADAAOAAAAAAAMAA4AAAAAAAwADgAAAAAADAAOAAAAAAAMAA4AAAAAAAwADgAQAAAADAAOAAAADAAOAAAAAAAAAAsADQAAAAAACwANAAAAAAALAA0AAAAAAAsADQAAAAAACwAMAA0AAAALAAwADQAAAAsADAANAAAACwAMAA0AAAALAAwADgAAAAsADAAAAAAACwAMAA4AAAALAAwAAAAAAAsADAAOAAAADAAOAAAAAAALAAwADgAAAAwADgAAAAAACwANAAAAAAALAA0AAAAAAAsADQAAAAAACwANAAAAAAAMAA4AAAAAAAwADgAAAAAACwAMAA4AAAALAAwADgAAAAwADgAAAAAACwAMAA4AAAAMAA4AAAAAAAwADgAAAAAADAAOAAAAAAAMAA4AAAAAAAsADAAOAAAACwAMAA0AAAALAAwAAAAAAAsADAANAAAACwAMAAAAAAALAAwAAAAAAAsADAANAAAACwAMAA0AAAALAAwAAAAAAAsADAAAAAAACwAMAAAAAAALAAwAAAAAAAwAAAAAAAAADAAAAAAAAAALAAwAAAAAAAsADAAAAAAAAQAGAAwAAAABAAYADAAAAAEABgAMAAAAAQAGAAsAAAABAAUACwAAAAEACwAMAAAAAQAFAAsAAAABAAUACwABAAIAAwAGAAAAAQACAAMAAQACAAMABQAAAAEAAgADAAAAAQALAAwAAAABAAYACwAAAAsADAAAAAAADAAAAAAAAgADAAYACAACAAMABgAIAAIAAwAGAAgAAgADAAYACAAAAAEAAgAGAAAAAQACAAYAAAABAAIABQAAAAEAAgAFAAEAAgAFAAcAAgADAAUABwAAAAEAAgADAAIAAwAFAAcAAAABAAIABgACAAYACAAAAAAAAQACAAMAAgADAAYACAAGAAgACgAAAAYACAAKAAAABgAIAAoAAAAGAAgACgAAAAUABwAJAAAABQAHAAkAAAAFAAcACQAAAAUABwAJAAAAAgAFAAcAAAACAAUABwAAAAIABQAHAAAAAgAFAAcAAAAGAAgAAAAAAAYACAAKAAAABgAIAAAAAAAGAAgACgAAAAIABQAHAAAAAgAFAAcAAAACAAUABwAAAAIABQAHAAAABgAIAAoAAAAGAAgACgAAAAYACAAKAAAABgAIAAoAAAACAAYACAAAAAYACAAAAAAAAgAGAAgAAAAGAAgACgAAAAIABQAHAAAABQAHAAAAAAACAAUABwAJAAUABwAJAAAAAgAGAAgAAAACAAYACAAAAAAAAQACAAYAAQACAAYACAAAAAEAAgAGAAIABQAHAAAAAgAFAAcAAAABAAIABgAIAAYACAAKAAAABgAIAAoAAAAIAAoAAAAAAAgACgAAAAAACAAKAAAAAAAIAAoAAAAAAAgACgAAAAAACAAKAAAAAAAHAAkAAAAAAAcACQAAAAAABwAJAAAAAAAHAAkAAAAAAAUABwAJAAAABQAHAAkAAAAFAAcACQAAAAcACQAAAAAABgAIAAoAAAAGAAgACgAAAAYACAAKAAAABgAIAAoAAAAHAAkAAAAAAAcACQAAAAAABwAJAAAAAAAHAAkAAAAAAAgACgAAAAAACAAKAAAAAAAIAAoAAAAAAAgACgAAAAAABQAHAAkAAAAFAAcACQAAAAcACQAAAAAABQAHAAkAAAAHAAkAAAAAAAcACQAAAAAABwAJAAAAAAAHAAkAAAAAAAcACQAAAAAABwAJAAAAAAAIAAoAAAAAAAgACgAAAAAACAAKAAAAAAAIAAoAAAAAAAgACgAAAAAACAAKAAAAAAAFAAcACQAAAAUABwAJAAAABQAHAAkAAAAFAAcACQAAAAUABwAJAAAABQAHAAkAAAAFAAcACQAAAAUABwAJAAAABgAIAAoAAAAIAAoAAAAAAAYACAAKAAAACAAKAAAAAAAGAAgACgAAAAYACAAKAAAABgAIAAoAAAAGAAgACgAAAAIAAwAEAAYAAgADAAQABgABAAIAAwAGAAIAAwAEAAYAAgADAAQABQACAAMABAAFAAIAAwAEAAUAAgADAAQABQABAAIAAwAEAAEAAgADAAUAAgADAAQABQACAAMABQAAAAEAAgADAAQAAQACAAMABAABAAIAAwAFAAEAAgADAAUAAQACAAMABAABAAIAAwAEAAEAAgADAAQAAQACAAMABAABAAIAAwAEAAIAAwAEAAYAAQACAAMABAACAAMABAAFAAAADAAOAAAADAAOAAAAAAAAAAwADgAAAAwADgAAAAAADAAOAAAAAAAMAA4AEAAAAAsADQAPABEACwANAA8AAAALAA0AAAAAAAsADQAPABEACwANAAAAAAALAA0ADwARAAsADQAPABEACwANAA8AEQALAA0ADwARAAsADQAPABEACwANAA8AAAALAA0ADwAAAAsADQAPAAAACwANAA8AEQAMAA4AEAASAAwADgAQAAAADAAOABAAEgAMAA4AEAASAAwADgAQABIADAAOABAAEgAMAA4AEAASAAwADgAQABIADAAOABAAEgAMAA4AEAASAA4AEAASAAAADgAQABIAAAAMAA4AEAASAA4AEAASAAAADAAOABAAEgAOABAAEgAAAA4AEAASAAAADgAQABIAAAAOABAAEgAAAA4AEAASAAAADQAPABEAAAAPABEAAAAAAA0ADwARAAAADwARAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAAEAAAAAAAAAAQAAAAAAAAAAwAEAAAAAAADAAQAAAAAAAAAAQACAAMAAAABAAIABQAAAAEAAgADAAAAAQACAAUAAgADAAUAAAACAAMABQAAAAIAAwAFAAAAAgADAAUAAAACAAMABgAAAAIAAwAGAAAAAAABAAIAAwAAAAEAAgADAAAAAQACAAUAAAABAAIABQAAAAEAAgADAAAAAQACAAMAAAABAAIABQAAAAEAAgAFAAAAAQACAAUAAAABAAIABQAAAAEAAgAGAAAAAQACAAYAAAABAAIABQAAAAEAAgAFAAAAAQACAAUAAAABAAIABQAAAAEAAgAFAAAAAQACAAUAAAABAAIABgAAAAEAAgAGAAAAAQACAAUAAAABAAIABQAAAAEAAgAFAAAAAQACAAUAAAABAAIABQAAAAEAAgAFAAAAAQACAAUAAAABAAIABQAAAAEAAgAFAAAAAQACAAMAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAACAAMABAAAAAIAAwAEAAAAAgADAAQAAAADAAQAAAAAAAIAAwAEAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAACAAMABAAAAAMABAAAAAAAAgADAAQAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAgADAAQAAAACAAMABAAAAAIAAwAEAAAAAgADAAQAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAIAAwAEAAAAAgADAAQAAAACAAMABAAAAAIAAwAEAAAAAwAEAAAAAAAEAAAAAAAAAAMABAAAAAAABAAAAAAAAAACAAMABAAAAAIAAwAEAAAAAgADAAQAAAACAAMABAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAACAAMABAAAAAIAAwAEAAAAAgADAAQAAAACAAMABAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAACAAMABAAAAAIAAwAEAAAAAgADAAQAAAACAAMABAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAAEAAAAAAAAAAMABAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAgADAAQAAAACAAMABAAAAAIAAwAEAAAAAgADAAQAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAIAAwAEAAAAAgADAAQAAAACAAMABAAAAAIAAwAEAAAAAgADAAQAAAACAAMABAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAgADAAQAAAACAAMABAAAAAIAAwAEAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAIAAwAEAAAAAgADAAQAAAACAAMABAAAAAIAAwAEAAAAAgADAAQAAAACAAMABAAAAAIAAwAEAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAAAgADAAQAAAACAAMABAAAAAIAAwAEAAAAAgADAAQAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAACAAMABAAAAAIAAwAEAAAAAgADAAQAAAACAAMABAAAAAIAAwAEAAAAAgADAAQAAAACAAMABAAAAAIAAwAEAAAAAgADAAQAAAACAAMABAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAgADAAQAAAADAAQAAAAAAAMABAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAAEAASAAAAAAAQABIAAAAAAA4AEAASAAAAEAASAAAAAAAOABAAEgAAAA4AEAASAAAADgAQABIAAAAOABAAEgAAABAAEgAAAAAAEAASAAAAAAAOABAAEgAAABAAEgAAAAAAEgAAAAAAAAASAAAAAAAAABIAAAAAAAAAEgAAAAAAAAANAA8AEQAAAA8AEQAAAAAADQAPABEAAAAPABEAAAAAAA4AEAASAAAAEAASAAAAAAAQABIAAAAAABAAEgAAAAAADQAPABEAAAANAA8AEQAAAA0ADwARAAAADQAPABEAAAANAA8AEQAAAA0ADwARAAAADQAPABEAAAANAA8AEQAAAA0ADwARAAAADQAPABEAAAANAA8AEQAAAA0ADwARAAAADwARAAAAAAAPABEAAAAAAA8AEQAAAAAADwARAAAAAAAPABEAAAAAAA8AEQAAAAAADQAPABEAAAAPABEAAAAAAA0ADwARAAAADQAPABEAAAANAA8AEQAAAA0ADwARAAAADgAQABIAAAAOABAAEgAAAA4AEAASAAAADgAQABIAAAAOABAAEgAAAA4AEAASAAAAEAASAAAAAAAOABAAEgAAAA4AEAASAAAADgAQABIAAAAOABAAEgAAAA4AEAASAAAAEQAAAAAAAAARAAAAAAAAABEAAAAAAAAAEQAAAAAAAAANAA8AEQAAAA0ADwARAAAADQAPABEAAAANAA8AEQAAAA8AEQAAAAAADwARAAAAAAAPABEAAAAAAA4AEAASAAAADgAQABIAAAAOABAAEgAAAA4AEAASAAAADgAQABIAAAAQABIAAAAAABAAEgAAAAAADgAQABIAAAAOABAAEgAAAA4AEAASAAAADQAPABEAAAANAA8AEQAAAA0ADwARAAAAEAASAAAAAAAQABIAAAAAAA8AEQAAAAAADwARAAAAAAAOABAAEgAAAA4AEAASAAAADgAQABIAAAANAA8AEQAAAA0ADwARAAAADQAPABEAAAAQABIAAAAAABAAEgAAAAAAEgAAAAAAAAAQABIAAAAAAAAAAQACAAMAAAABAAIAAwAHAAkAAAAAAAkAAAAAAAAABwAJAAAAAAAJAAAAAAAAAAgACgAAAAAACgAAAAAAAAAIAAoAAAAAAAoAAAAAAAAACgAAAAAAAAAKAAAAAAAAAA0ADwARAAAADQAPABEAAAANAA8AEQAAAA4AEAASAAAADgAQABIAAAAOABAAEgAAAAMABAAAAAAAAgADAAQAAAACAAMABAAAAAIAAwAEAAAAAgADAAQAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAIAAwAEAAAAAgADAAQAAAACAAMABAAGAAIAAwAEAAUAAgADAAQAAAACAAMABAAFAAMABAAAAAAAAgADAAQAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAQAAAAAAAAABAAAAAAAAAADAAQAAAAAAAMABAAAAAAABAAAAAAAAAACAAMABAAAAAIAAwAEAAUAAgADAAQABQACAAMABAAGAAIAAwAEAAYAAgADAAQABQACAAMABAAFAAIAAwAEAAUAAgADAAQABQACAAMABAAGAAIAAwAEAAYAAQACAAMABAACAAMABAAFAAAACwANAAAAAAALAA0AAAALAA0AAAAAAAAADAAOABAAAAAMAA4AEAAAAAsADQAAAAAACwANAAAAAAALAAwADQAAAAsADAAOAAAACwAMAA4AAAALAAwADgAAAAsADQAAAAAACwAMAA4AAAALAAwADgAAAAsADAAAAAAADAAOAAAAAAALAAwADgAAAAsADAAAAAAACwAMAAAAAAALAAAAAAAAAAsAAAAAAAAADAAOAAAAAAALAAwAAAAAAAEABgALAAAAAQALAAwAAAABAAsADAAAAAEAAgADAAAAAQAGAAsAAAABAAIABgAAAAEAAgAFAAAAAQACAAUAAAABAAIABQAAAAEAAgAGAAUABwAJAAAABQAHAAkAAAAGAAgAAAAAAAYACAAKAAAABQAHAAkAAAAFAAcAAAAAAAYACAAKAAAABgAIAAoAAAACAAYACAAAAAIABgAIAAAAAgAGAAgAAAAAAAEAAgAGAAYACAAKAAAABgAIAAoAAAAHAAkAAAAAAAcACQAAAAAABgAIAAoAAAAHAAkAAAAAAAcACQAAAAAACAAKAAAAAAAFAAcACQAAAAUABwAJAAAABwAJAAAAAAAHAAkAAAAAAAcACQAAAAAABwAJAAAAAAAIAAoAAAAAAAgACgAAAAAACAAKAAAAAAAIAAoAAAAAAAIAAwAGAAAAAgADAAUAAAACAAMABQAAAAEAAgADAAUAAQACAAMABQABAAIAAwAEAAAAAQACAAMAAQACAAMABQAMAA4AAAAAAAwADgAAAAAADAAOABAAAAAMAA4AAAAAAAsADQAPABEADQAPABEAAAALAA0ADwARAAsADQAPABEACwANAA8AAAALAA0ADwAAAA4AEAASAAAADgAQABIAAAAOABAAEgAAAA4AEAASAAAAEAASAAAAAAANAA8AEQAAAA8AEQAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAQAAAAAAAAABAAAAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAQAAAAAAAAABAAAAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAIAAwAFAAAAAgADAAUAAAACAAMABgAAAAAAAQACAAMAAAABAAIABQAAAAEAAgADAAAAAQAFAAsAAAABAAYACwAAAAEABQALAAAAAQAFAAsAAAABAAsADAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAIAAwAEAAAAAgADAAQAAAACAAMABAAAAAQAAAAAAAAAAgADAAQAAAACAAMABAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAABAAAAAAAAAAEAAAAAAAAAAIAAwAEAAAAAwAEAAAAAAADAAQAAAAAAAQAAAAAAAAABAAAAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAgADAAQAAAACAAMABAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAQAAAAAAAAABAAAAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAACAAMABAAAAAIAAwAEAAAAAgADAAQAAAACAAMABAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAACAAMABAAAAAIAAwAEAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAABAAAAAAAAAAEAAAAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAgADAAQAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAOABAAEgAAAA4AEAASAAAADgAQABIAAAASAAAAAAAAABIAAAAAAAAADQAPABEAAAAPABEAAAAAAA0ADwARAAAADQAPABEAAAANAA8AEQAAABEAAAAAAAAAEQAAAAAAAAANAA8AEQAAAA0ADwARAAAAEgAAAAAAAAASAAAAAAAAAA4AEAASAAAAEQAAAAAAAAARAAAAAAAAAA8AEQAAAAAAEAASAAAAAAAOABAAEgAAAA0ADwARAAAAEAASAAAAAAAOABAAEgAAAA0ADwARAAAAEAASAAAAAAAHAAkAAAAAAAcACQAAAAAACAAKAAAAAAAIAAoAAAAAAAoAAAAAAAAACgAAAAAAAAALAA0ADwARAAsADQAPABEADQAPABEAAAANAA8AEQAAAA4AEAASAAAAAwAEAAAAAAACAAMABAAAAAIAAwAEAAYAAgADAAQAAAACAAMABAAFAAIAAwAEAAAAAwAEAAAAAAADAAQAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAACAAMABAAAAAIAAwAEAAAAAgADAAQABgACAAMABAAGAAIAAwAEAAUAAgADAAQABQACAAMABAAAAAIAAwAEAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAADAAQAAAAAAAMABAAAAAAABAAAAAAAAAADAAQAAAAAAAQAAAAAAAAAAgADAAQABgACAAMABAAFAAIAAwAEAAUAAgADAAQABgACAAMABAAGAAIAAwAEAAYAAgADAAQAAAAAAAsADQAPAAAACwANAAAAAAALAA0ADwAAAAsADQAPAAAACwANAAAACwANAAAAAAAAAAsADQAPAAAADAAOAAAAAAAMAA4AAAAAAAsADQAAAAAACwAMAA0AAAALAAwADgAAAAwADgAAAAAADAAOAAAAAAALAAwAAAAAAAsADAAAAAAACwAAAAAAAAALAAwAAAAAAAsADAAAAAAACwAMAAAAAAAMAAAAAAAAAAsADAAAAAAACwAMAAAAAAABAAIAAwAAAAEACwAMAAIAAwAGAAAAAgADAAYAAAAAAAEAAgADAAAAAQACAAMAAAABAAIAAwAAAAEAAgADAAAAAQACAAMAAAABAAIABQACAAYACAAKAAYACAAKAAAABQAHAAkAAAAFAAcACQAAAAIABQAHAAkAAgAFAAcACQAGAAgACgAAAAYACAAKAAAABQAHAAkAAAAFAAcACQAAAAIABgAIAAoAAgAGAAgACgAGAAgACgAAAAIABQAHAAkABQAHAAkAAAACAAYACAAAAAIABgAIAAAAAQACAAUABwAAAAEAAgAGAAgACgAAAAAACAAKAAAAAAAIAAoAAAAAAAgACgAAAAAABwAJAAAAAAAHAAkAAAAAAAcACQAAAAAABwAJAAAAAAAIAAoAAAAAAAgACgAAAAAABwAJAAAAAAAHAAkAAAAAAAgACgAAAAAABwAJAAAAAAAHAAkAAAAAAAcACQAAAAAACAAKAAAAAAAIAAoAAAAAAAgACgAAAAAACAAKAAAAAAAFAAcACQAAAAUABwAJAAAABgAIAAoAAAAAAAEAAgADAAEAAgADAAQAAAAMAA4AEAAMAA4AEAAAAAsADQAPAAAACwANAA8AAAAMAA4AEAASAAwADgAQABIADAAOABAAEgAMAA4AEAASAA4AEAASAAAADQAPABEAAAANAA8AEQAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAABAAAAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAAEAAAAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAAAAEAAgADAAAAAQACAAMAAAABAAIAAwAAAAEACwAMAAAAAQACAAUAAwAEAAAAAAADAAQAAAAAAAQAAAAAAAAABAAAAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAIAAwAEAAAAAgADAAQAAAADAAQAAAAAAAIAAwAEAAAAAgADAAQAAAACAAMABAAAAAMABAAAAAAAAwAEAAAAAAAEAAAAAAAAAAQAAAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAgADAAQAAAACAAMABAAAAAMABAAAAAAAAwAEAAAAAAACAAMABAAAAAIAAwAEAAAABAAAAAAAAAADAAQAAAAAAAIAAwAEAAAAAgADAAQAAAAEAAAAAAAAAAQAAAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAAEAAAAAAAAAAQAAAAAAAAAAwAEAAAAAAADAAQAAAAAAAIAAwAEAAAAAgADAAQAAAACAAMABAAAAAIAAwAEAAAAAwAEAAAAAAAEAAAAAAAAAAMABAAAAAAAAwAEAAAAAAAEAAAAAAAAAAQAAAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAAEAAAAAAAAAAQAAAAAAAAAAwAEAAAAAAADAAQAAAAAAAIAAwAEAAAAAgADAAQAAAADAAQAAAAAAAMABAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAADAAQAAAAAAAMABAAAAAAAAgADAAQAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAABAAAAAAAAAAEAAAAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAIAAwAEAAAAAgADAAQAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAgADAAQAAAADAAQAAAAAAAIAAwAEAAAAAgADAAQAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAMABAAAAAAABAAAAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAIAAwAEAAAAAgADAAQAAAAEAAAAAAAAAAQAAAAAAAAAAwAEAAAAAAADAAQAAAAAAAIAAwAEAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAAEAAAAAAAAAAQAAAAAAAAADgAQABIAAAAOABAAEgAAAA4AEAASAAAADgAQABIAAAAOABAAEgAAABIAAAAAAAAAEgAAAAAAAAANAA8AEQAAAA0ADwARAAAADgAQABIAAAASAAAAAAAAAA0ADwARAAAAEQAAAAAAAAAPABEAAAAAAA8AEQAAAAAADQAPABEAAAANAA8AEQAAAA8AEQAAAAAAEQAAAAAAAAANAA8AEQAAAA0ADwARAAAADQAPABEAAAAQABIAAAAAABAAEgAAAAAAEAASAAAAAAAOABAAEgAAAA4AEAASAAAAEQAAAAAAAAANAA8AEQAAAA8AEQAAAAAADwARAAAAAAAOABAAEgAAABAAEgAAAAAAEAASAAAAAAAOABAAEgAAAA4AEAASAAAADQAPABEAAAANAA8AEQAAABAAEgAAAAAADwARAAAAAAAOABAAEgAAAA0ADwARAAAAEgAAAAAAAAASAAAAAAAAAAgACgAAAAAADQAPABEAAAANAA8AEQAAAAMABAAAAAAAAgADAAQAAAACAAMABAAFAAIAAwAEAAAAAwAEAAAAAAADAAQAAAAAAAIAAwAEAAAAAgADAAQAAAACAAMABAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAQAAAAAAAAAAwAEAAAAAAADAAQAAAAAAAIAAwAEAAUAAgADAAQABQACAAMABAAGAAAACwANAA8AAAALAA0ADwAAAAsADAANAAAACwAMAAAAAAABAAsADAAAAAsADAAAAAAACwAMAAAAAAAMAAAAAAAAAAsAAAAAAAAAAQACAAMAAAABAAsADAACAAMABgAAAAAAAQACAAUAAgADAAUAAAAGAAgACgAAAAUABwAJAAAABgAIAAoAAAAIAAoAAAAAAAcACQAAAAAACAAKAAAAAAAHAAkAAAAAAAgACgAAAAAABQAHAAkAAAAFAAcACQAAAAEAAgADAAQACwANAAAAAAAMAA4AEAASAAwADgAQAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAABAAAAAAAAAADAAQAAAAAAAMABAAAAAAAAAABAAIABQAAAAEAAgAFAAIAAwAEAAAABAAAAAAAAAADAAQAAAAAAAIAAwAEAAAAAwAEAAAAAAACAAMABAAAAAMABAAAAAAAAgADAAQAAAADAAQAAAAAAAQAAAAAAAAABAAAAAAAAAADAAQAAAAAAAMABAAAAAAABAAAAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAIAAwAEAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAQAAAAAAAAABAAAAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAACAAMABAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAgADAAQAAAACAAMABAAAAAIAAwAEAAAAAgADAAQAAAADAAQAAAAAAAIAAwAEAAAAAwAEAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAABAAEgAAAAAADgAQABIAAAANAA8AEQAAAA4AEAASAAAADQAPABEAAAAPABEAAAAAAA0ADwARAAAADwARAAAAAAAOABAAEgAAAA0ADwARAAAAAAABAAIAAwAHAAkAAAAAAAkAAAAAAAAABwAJAAAAAAAJAAAAAAAAAAkAAAAAAAAACQAAAAAAAAAIAAoAAAAAAAoAAAAAAAAACAAKAAAAAAAKAAAAAAAAAA0ADwARAAAADQAPABEAAAANAA8AEQAAAA4AEAASAAAADgAQABIAAAAOABAAEgAAAA4AEAASAAAADgAQABIAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAIAAwAEAAAAAgADAAQABQACAAMABAAAAAIAAwAEAAAAAgADAAQAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAIAAwAEAAAAAgADAAQABgACAAMABAAFAAIAAwAEAAAAAgADAAQAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAADAAQAAAAAAAQAAAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAACAAMABAAAAAMABAAAAAAAAgADAAQAAAACAAMABAAAAAMABAAAAAAAAgADAAQAAAACAAMABAAAAAMABAAAAAAAAwAEAAAAAAACAAMABAAAAAIAAwAEAAUAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAABAAAAAAAAAACAAMABAAFAAIAAwAEAAUAAgADAAQABQACAAMABAAFAAIAAwAEAAUAAgADAAQABQACAAMABAAGAAIAAwAEAAYAAgADAAQABQABAAIAAwAEAAIAAwAEAAUAAgADAAQABQACAAMABAAFAAIAAwAEAAUAAgADAAQABQACAAMABAAFAAAACwANAA8AAAALAA0ADwAAAAsADQAPAAAACwANAA8ACwANAAAAAAALAA0AAAAAAAAACwANAA8AAAALAA0AAAAAAAwADgAQAAAADAAOABAAAAAMAA4AAAAAAAwADgAQAAAACwAMAAAAAAALAAwADQAAAAsADAAAAAAACwAMAAAAAAALAAwAAAAAAAwADgAAAAAADAAOAAAAAAAMAA4AAAAAAAsADAANAAAACwAMAA0AAAAMAA4AAAAAAAsADQAAAAAACwANAAAAAAALAAwADQAAAAsADQAAAAAACwAMAA0AAAALAAwADgAAAAsADAAOAAAADAAAAAAAAAAMAAAAAAAAAAwADgAAAAAADAAAAAAAAAALAAAAAAAAAAsADAAAAAAACwAMAAAAAAALAAwAAAAAAAsADAAAAAAAAQAFAAsAAAABAAUACwAAAAEAAgADAAAAAQACAAMAAAABAAsADAAAAAEACwAMAAAAAQALAAwAAgADAAUABwACAAMABQAHAAIAAwAFAAcAAgADAAUABwAAAAEAAgAFAAAAAQACAAUAAAABAAIAAwAAAAEAAgADAAAAAQACAAUAAAABAAIABQAAAAEAAgADAAAAAQACAAMAAgAGAAgAAAAFAAcACQAAAAUABwAJAAAABQAHAAkAAAAGAAgACgAAAAUABwAJAAAABQAHAAkAAAACAAYACAAAAAIABgAIAAAABgAIAAoAAAAGAAgACgAAAAUABwAJAAAAAgAFAAcAAAAAAAEAAgAFAAAAAQACAAUAAAABAAIABQABAAIABQAHAAAAAQACAAUAAgAFAAcAAAACAAYACAAAAAEAAgADAAYACAAKAAAAAAAIAAoAAAAAAAUABwAJAAAABwAJAAAAAAAIAAoAAAAAAAgACgAAAAAABQAHAAkAAAAFAAcACQAAAAYACAAKAAAACAAKAAAAAAAHAAkAAAAAAAcACQAAAAAABwAJAAAAAAAHAAkAAAAAAAcACQAAAAAACAAKAAAAAAAIAAoAAAAAAAgACgAAAAAACAAKAAAAAAAIAAoAAAAAAAUABwAJAAAABQAHAAkAAAAFAAcACQAAAAUABwAJAAAABQAHAAkAAAAGAAgACgAAAAYACAAKAAAABgAIAAoAAAAGAAgACgAAAAYACAAKAAAABgAIAAoAAAACAAMABAAGAAIAAwAEAAUAAgADAAQABQACAAMABAAFAAIAAwAEAAUAAQACAAMABAABAAIAAwAEAAEAAgADAAQAAQACAAMABAABAAIAAwAEAAEAAgADAAQAAgADAAQABQAMAA4AEAAAAAAADAAOABAAAAAMAA4AEAAMAA4AEAAAAAAADAAOABAADAAOABAAAAANAA8AEQAAAAsADQAPABEACwANAA8AEQALAA0ADwARAAsADQAPABEACwANAA8AEQANAA8AEQAAAAsADQAPABEACwANAA8AEQAMAA4AEAASAAwADgAQAAAADAAOABAAEgAMAA4AEAASAAwADgAQABIADAAOABAAEgAMAA4AEAAAAAwADgAQAAAADgAQABIAAAANAA8AEQAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAAAAQACAAMAAAABAAIAAwAAAAEAAgADAAAAAQACAAMAAAABAAIAAwAAAAEAAgADAAAAAQACAAMAAAABAAIAAwACAAMABgAAAAIAAwAGAAAAAAABAAIABQAAAAEAAgAFAAAAAQACAAMAAAABAAIAAwAAAAEAAgAFAAAAAQACAAUAAAABAAIABQAAAAEAAgAFAAAAAQACAAUAAAABAAIABQAAAAEAAgAFAAAAAQACAAUAAAABAAIAAwAAAAEAAgADAAAAAQACAAMAAAABAAIAAwADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAIAAwAEAAAAAgADAAQAAAACAAMABAAAAAIAAwAEAAAAAgADAAQAAAACAAMABAAAAAIAAwAEAAAAAgADAAQAAAACAAMABAAAAAMABAAAAAAAAgADAAQAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAABAAAAAAAAAAEAAAAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAgADAAQAAAACAAMABAAAAAMABAAAAAAAAwAEAAAAAAACAAMABAAAAAIAAwAEAAAAAgADAAQAAAACAAMABAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAgADAAQAAAACAAMABAAAAAIAAwAEAAAAAgADAAQAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAMABAAAAAAAAwAEAAAAAAACAAMABAAAAAIAAwAEAAAAAgADAAQAAAACAAMABAAAAAIAAwAEAAAAAwAEAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAAEAAAAAAAAAAQAAAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAACAAMABAAAAAIAAwAEAAAAAgADAAQAAAACAAMABAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAAEAAAAAAAAAAMABAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAACAAMABAAAAAIAAwAEAAAAAgADAAQAAAACAAMABAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAgADAAQAAAACAAMABAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAABAAAAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAIAAwAEAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAACAAMABAAAAAIAAwAEAAAAAgADAAQAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAgADAAQAAAACAAMABAAAAAIAAwAEAAAAAgADAAQAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAMABAAAAAAAAwAEAAAAAAAEAAAAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAACAAMABAAAAAIAAwAEAAAABAAAAAAAAAAEAAAAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAgADAAQAAAACAAMABAAAAAIAAwAEAAAAAgADAAQAAAACAAMABAAAAAIAAwAEAAAABAAAAAAAAAAEAAAAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAADgAQABIAAAAOABAAEgAAABAAEgAAAAAAEAASAAAAAAAOABAAEgAAABAAEgAAAAAADgAQABIAAAASAAAAAAAAABIAAAAAAAAAEgAAAAAAAAASAAAAAAAAAA0ADwARAAAADQAPABEAAAAOABAAEgAAAA4AEAASAAAADwARAAAAAAANAA8AEQAAAA8AEQAAAAAADQAPABEAAAANAA8AEQAAAA0ADwARAAAADQAPABEAAAANAA8AEQAAAA8AEQAAAAAAEAASAAAAAAAQABIAAAAAAA4AEAASAAAADgAQABIAAAARAAAAAAAAABEAAAAAAAAAEQAAAAAAAAARAAAAAAAAAA0ADwARAAAADQAPABEAAAANAA8AEQAAAA0ADwARAAAADgAQABIAAAAOABAAEgAAAA4AEAASAAAADwARAAAAAAAPABEAAAAAAA4AEAASAAAADQAPABEAAAANAA8AEQAAABAAEgAAAAAAEAASAAAAAAAPABEAAAAAAA4AEAASAAAADgAQABIAAAANAA8AEQAAAAAAAQACAAMABwAJAAAAAAAJAAAAAAAAAAkAAAAAAAAACQAAAAAAAAAIAAoAAAAAAAoAAAAAAAAADQAPABEAAAACAAMABAAAAAIAAwAEAAUAAgADAAQAAAADAAQAAAAAAAMABAAAAAAAAgADAAQABQAAAAwADgAQAAAADAAOABAAAAAMAA4AEAAAAAwADgAQAAAACwAMAAAAAAALAAwADQAAAAsADAAAAAAADAAOAAAAAAALAAwADQAAAAEAAgAFAAAAAQACAAUABQAHAAkAAAAGAAgACgAAAAUABwAJAAAAAAABAAIABQAIAAoAAAAAAAUABwAJAAAABwAJAAAAAAAHAAkAAAAAAAUABwAJAAAABQAHAAkAAAAGAAgACgAAAAYACAAKAAAAAAAMAA4AEAAMAA4AEAAAAA0ADwARAAAACwANAA8AEQANAA8AEQAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAAEAAAAAAAAAAMABAAAAAAABAAAAAAAAAADAAQAAAAAAAQAAAAAAAAAAwAEAAAAAAAEAAAAAAAAAAQAAAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAABAAAAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAIAAwAGAAAAAgADAAYAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAIAAwAEAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAAAgADAAQAAAADAAQAAAAAAAIAAwAEAAAAAgADAAQAAAADAAQAAAAAAAQAAAAAAAAABAAAAAAAAAANAA8AEQAAAA4AEAASAAAADgAQABIAAAARAAAAAAAAAA8AEQAAAAAABwAJAAAAAAAJAAAAAAAAAAkAAAAAAAAAAgADAAQAAAACAAMABAAAAAIAAwAEAAUAAgADAAQABQACAAMABAAFAAIAAwAEAAYAAAALAAwADQAAAAsADAAAAAAACwAMAAAAAAALAAAAAAAAAAsAAAAAAAAACwAMAAAAAAALAAwAAAAAAAsADAAAAAIAAwAFAAAAAAABAAIABQAAAAEAAgADAAIABgAIAAAABQAHAAAAAAAFAAcAAAAAAAcACQAAAAAAAQACAAMABAAMAA4AEAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAABAAAAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAAEAAAAAAAAAAQAAAAAAAAAAwAEAAAAAAAEAAAAAAAAAAMABAAAAAAAAAABAAIABQAEAAAAAAAAAAIAAwAEAAAAAgADAAQAAAACAAMABAAAAAMABAAAAAAAAwAEAAAAAAACAAMABAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAAAwAEAAAAAAACAAMABAAAAAQAAAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAACAAMABAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAACAAMABAAAAAMABAAAAAAABAAAAAAAAAARAAAAAAAAABEAAAAAAAAADgAQABIAAAACAAMABAAAAAIAAwAEAAAAAAABAAsADAAAAAEAAgAFAAAACwAMAAAAAgADAAUAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAACAAMA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jgCPAEIAQwBCAI8AkACRAE4ATwBOAJEAkgCTAJQAlQCUAJMAlgCXAJgAmQCYAJcAmgCbAD4APwA+AJsAnACdAEoASwBKAJ0AngCfAKAAoQCgAJ8AogCjAFIAUwBSAKMApAClAKYApwCmAKUAqACpAKoAqwCqAKkArACtAK4ArwCuAK0AsACxALIAswCyALEAtAC1ALYAtwC2ALUAuAC5ALoAuwC6ALkAvAC9AL4AvwC+AL0AwADBAMIAwwDCAMEAxADFAMYAxwDGAMUAyADJAMoAywDKAMkAzADNAM4AzwDOAM0A0ADRANIA0wDSANEA1ADVANYA1wDWANUA2ADZANoA2wDaANkA3ADdAN4A3wDeAN0A4ADhAOIA4wDiAOEA5ADlAOYA5wDmAOUA6ADpAOoA6wDqAOkA7ADtAO4A7wDuAO0A8ADxAPIA8wDyAPEA9AD1APYA0gD2APUA9wD4APkA+gD5APgA+wD8AP0A3AD9APwA/gD/AAABAQEAAf8AAgEDAQQBBQEEAQMBBgEHAQgBCQEIAQcBCgELAQwBDQEMAQsBDgEPARABEQEQAQ8BEgETARQBFQEUARMBFgEXARgBGQEYARcBGgEbARwBHQEcARsBHgEfASABIQEgAR8BIgEjASQBJQEkASMBJgEnASgBKQEoAScBKgErASwBLQEsASsBLgEvATABMQEwAS8BMgEzATQBNQE0ATMBNgE3ATgBOQE4ATcBOgE7ATwBPQE8ATsBPgE/AUABQQFAAT8BQgFDAUQBRQFEAUMBFwEjAUYBRwFGASMBSAFJARoBSgEaAUkBSwFMAR4BHwEeAUwBTQFHASIBIwEiAUcBTgFPAVABUQFQAU8BUgFTAVQBVQFUAVMBVgFXAVgBWQFYAVcBWgFbAVwBXQFcAVsBXgFfAWABYQFgAV8BYgFjAWQBZQFkAWMBZgFnAWgBaQFoAWcBagFrAWwBbQFsAWsBbgFvAXABcQFwAW8BcgFzAWIBYwFiAXMBdAF1AXYBdwF2AXUBeAF5AVIBUwFSAXkBegF7AXwBfQF8AXsBfgF/AYABgQGAAX8BggGDAYQBhQGEAYMBhgGHAYgBiQGIAYcBigGLAYwBjQGMAYsBjgGPAZABkQGQAY8BkgGTAZQBlQGUAZMBlgGXAZgBmQGYAZcBmgGbAZwBnQGcAZsBngGfAaABoQGgAZ8BogGjAaQBpQGkAaMB1wDVAKYBpwGmAdUAzQCoAc8AqQHPAKgBqgGrAawBrQGsAasBrgGvAbABsQGwAa8BsgGzAbQBtQG0AbMBtgG3AbgBuQG4AbcBugG7AbwBvQG8AbsBvgG/AcABwQHAAb8BwgHDAcQBxQHEAcMBxgHHAcgByQHIAccBygHLAcwBzQHMAcsBzgHPAdAB0QHQAc8B0gHTAdQB1QHWAdcB2AHZAdoB2wHaAdkB3AHdAd4B3wHgAeEB4gHjAeQB5QHkAeMB5gHnAegB6QHoAecB6gHrAewB7QHsAesB7gHvAfAB8QHwAe8B8gHzAfQB9QH0AfMB9gH3AfgB+QH4AfcB+gH7AfwB/QH8AfsB/gH/AQACAQICAgMCBAIFAgYCBwIIAgkCCgILAgwCDQIMAgsCDgIPAhACEQIQAg8CEgITAhQCFQIUAhMCFgIXAhgCGQIYAhcCGgIbAhwCHQIeAh8CIAIhAiICIwIkAiUCJgInAigCKQIoAicCKgIrAiwCLQIsAisCLgIvAjACMQIyAjMCNAI1AjYCNwI2AjUCOAI5AjoCOwI6AjkCPAI9Aj4CPwI+Aj0CQAJBAkICQwJCAkECRAJFAkYCRwJIAkkCSgJLAkwCTQJMAksCTgJPAlACUQJQAk8CUgJTAlQCVQJWAlcCWAJZAloCWwJaAlkCXAJdAl4CXwJeAl0CYAJhAmICYwJiAmECZAJlAmYCZwJoAmkCagJrAmwCbQJuAm8CcAJxAnICcwJyAnECdAJ1AnYCdwJ2AnUCeAJ5AnoCewJ6AnkCfAJ9An4CfwJ+An0CgAKBAoICgwKCAoEChAKFAoYChwKGAoUCiAKJAooCiwKKAokCjAKNAo4CjwKOAo0CkAKRApICkwKSApEClAKVApYClwKWApUCmAKZApoCmwKaApkCnAKdAp4CnwKeAp0CoAKhAqICowKiAqECpAKlAqYCpwKmAqUCqAKpAqoCqwKqAqkCrAKtAq4CrwKuAq0CsAKxArICswKyArECtAK1ArYCtwK2ArUCuAK5AroCuwK6ArkCvAK9Ar4CvwK+Ar0CwALBAsICwwLCAsECxALFAsYCxwLGAsUCyALJAsoCywLKAskCzALNAs4CzwLOAs0C0ALRAtIC0wLSAtEC1ALVAtYC1wLWAtUC2ALZAtoC2wLaAtkC3ALdAt4C3wLeAt0C4ALhAuIC4wLiAuEC5ALlAuYC5wLmAuUC6ALpAuoC6wLqAukC7ALtAu4C7wLuAu0C8ALxAvIC8wLyAvEC9AL1AvYC9wL2AvUC+AL5AvoC+wL6AvkC/AL9Av4C/wL+Av0CAAMBAwIDAwMCAwEDBAMFAwYDBwMGAwUDCAMJAwoDCwMKAwkDDAMNAw4DDwMOAw0DEAMRAxIDEwMSAxEDFAMVAxYDFwMWAxUDGAMZAxoDGwMaAxkDHAMdAx4DHwMeAx0DIAMhAyIDIwMiAyEDJAMlAyYDJwMmAyUDKAMpAyoDKwMqAykDLAMtAy4DLwMuAy0DMAMxAzIDMwMyAzEDNAM1AzYDNwM2AzUDOAM5AzoDOwM6AzkDPAM9Az4DPwM+Az0DQANBA0IDQwNCA0EDRANFA0YDRwNGA0UDSANJA0oDSwNKA0kDTANNA04DTwNOA00DUANRA1IDUwNSA1EDVANVA1YDVwNWA1UDWANZA1oDWwNaA1kD6gJcA6cCXQOnAlwDSgNeAy8DXwMvA14DYANhA9cCYgPXAmEDtgJjA1sDZANbA2MDNgNlA8sCZgPLAmUDDgNnA/MCaAPzAmcDaQNqA2sDbANrA2oDbQNuA9sCbwPbAm4DxgJwA58CcQOfAnADQgNyA3MDdANzA3IDdQN2A3cDeAN3A3YDeQPDAnoDwQJ6A8MCewN8A30DfgN9A3wDfwOAA4EDggODA4QDhQOGA4cDiAOrAokDigOLA4wDjQOMA4sDjgOPA5ADkQOSA5MDlAOVA5YDlwOWA5UDmAOZA5oDmwOaA5kDnAOdA54DnwOeA50DoAOhA6IDowOiA6EDpAOlA6YDpwOmA6UDqAOpA6oDqwOqA6kDrAOtA64DrwOuA60DsAOxA7IDswOyA7EDtAO1A7YDtwO2A7UDuAO5A7oDuwO6A7kDvAO9A74DvwO+A70DwAPBA8IDwwPCA8EDxAPFA8YDxwPGA8UDyAPJAz8DPgM/A8kDygPLA8wDzQPOA88D0APRA9ID0wPUA9UD1gPXA7MCsgKzAtcDFQPYAxcD2QMXA9gD2gPbA0cDRgNHA9sD3APdA94DuQLfA7sC4APhA+ID4wPkA+UD5gPnA6MCogKjAucDBQPoAwcD6QPqA+sD7APtA+4D7wPuA+0DvgLwA/ED8gPxA/AD8wP0A/UD9gP3A/gD+QP6A/sD/AP9A/4D/wMABAEEAgQBBAAEAwQEBAUEBgQFBAQEBwQIBAkECgQLBAwEDQQOBA8EEAQRBBIEEwQUBBUEFgQVBBQEFwQYBBkEGgQZBBgEGwQcBB0EHgQdBBwEHwQgBCEEIgQhBCAEIwQkBCUEJgQlBCQEJwQoBCkEKgQpBCgEKwQsBC0ELgQtBCwELwQwBDEEMgQxBDAEMwQ0BDUENgQ1BDQENwQ4BDkEOgQ5BDgEOwQ8BD0EPgQ9BDwEPwRABEEEQgRBBEAEQwREBEUERgRFBEQERwRIBEkESgRJBEgESwRMBE0ETgRNBEwETwRQBFEEUgRRBFAEUwRUBFUEVgRVBFQEVwRYBDsEWQQ7BFgEWgRbBFwEXQRcBFsEXgRfBBMEYAQTBF8EYQRiBFsEYwRbBGIEZARlBDMEZgQzBGUEGwRnBGgEXwRoBGcEaQRqBFcEWARXBGoEawRsBEsEbQRLBGwEbgRvBFQEcARUBG8EcQRyBHMEdARzBHIEAAACAHUEdgR1BAIAdwR4BAUABwAFAHgEeQR6BAkACwAJAHoEewR8BA0ADwANAHwEfQR+BBEAEwARAH4EFAB/BBUAgAQVAH8EVgQYAIEEGQCBBBgAggSDBBwAGgAcAIMEXQQgAIQEIQCEBCAAhQSGBCMAJQAjAIYEKQCiAygAhwQoAKIDLQCmAywAiAQsAKYDMQCJBDAAigQwAIkENQCqAzQAiwQ0AKoDOQCuAzgAjAQ4AK4DPQCyAzwAjQQ8ALIDQQC2A0AAjgRAALYDRQC6A0QAjwREALoDSQCQBEgAAwRIAJAETQC+A0wAkQRMAL4DUQDCA1AAkgRQAMIDVQDGA1QAkwRUAMYDWABZAJQElQSUBFkAXABdAJYElwSWBF0AYQCYBGAAmQRgAJgEZABlAJoEmwSaBGUAaABpAJwEnQScBGkAbABtAJ4EnwSeBG0AcABxAKAEoQSgBHEAdAB1AKIEowSiBHUAeAB5AKQEpQSkBHkAfAB9AKYEpwSmBH0AgACBAKgEqQSoBIEAhACFAKoEqwSqBIUAjgBCAIcAiQCHAEIAjACNAKwErQSsBI0AkgCUAI8AQwCPAJQAmACuBJEATwCRAK4EmgA+AJMAlQCTAD4AmACZAK4ErwSuBJkAsASxBJsAPwCbALEEngCgAJ0ASwCdAKAAsgRGAJ8AoQCfAEYAjACsBKMAUwCjAKwEswQqAKcApgCnACoAqQC0BKsAtQSrALQEtgS3BKwArQCsALcEuASxALkEsAC5BLEAtgC3ALoEuwS6BLcAvAS4AL0EugC9BLgAvgC/AL4EvwS+BL8AygDLAMAAwQDAAMsAzgDPAMYAxADGAM8AwATJAMEEyADBBMkAwgSsAcwAzQDMAKwB0QDQAKQBogGkAdAAwwTEBNQA1QDUAMQE2gDFBNgAxgTYAMUE3gDfAMcExQTHBN8A4gDIBOAAyQTgAMgEygTkAMgE5gDIBOQA6QDLBOsAwATrAMsE7gDMBOwA0wDsAMwEzQTOBPAA8QDwAM4EzwT0ANAE9gDQBPQAxwT3AN4A+QDeAPcA0QTSBPsA/AD7ANIE0wQBAdQE/wDUBAEB1QQCAdYEBAHWBAIBBwETAQkB1wQJARMBCwHYBA0B2QQNAdgEEQF2BBAB2gQQAXYEEwESAdcE2wTXBBIBFgElARcBIwEXASUB3ARIARwBGgEcAUgBIAHdBB4B3gQeAd0EJAHfBCIB4AQiAd8EPAE9ASgBJgEoAT0B4QTiBCoBKwEqAeIENgEuATcBMAE3AS4B4wQ0AeQENQHkBDQB5QTmBDkBOAE5AeYE5wToBDoBOwE6AegE6QQ+AeoEQAHqBD4BLwFCATEBRAExAUIBFwFGARkB6wQZAUYBGwEaAewESgHsBBoBTAFLAS8BQgEvAUsBRwFNAekEPgHpBE0B7QTuBE4BTwFOAe4EUgFUAWkBaAFpAVQBVgHvBFcB8ARXAe8EbQFcAWwBXQFsAVwBhwFeAfEEYAHxBF4BYgFkAfIE8wTyBGQBZgH0BGcBdwFnAfQE9QT2BGoBawFqAfYE9wT4BG4BbwFuAfgEcgH5BHMB+gRzAfkE+wT8BHQBdQF0AfwEeAH9BHkB/gR5Af0EegF/AXsB9gR7AX8BfwF+AfYEawH2BH4BPQGCASYBhAEmAYIBiAE7AYYB6ASGATsBDgGMAf8EjQH/BIwBAAWRAQEFjwEBBZEBAgWVAQMFkwEDBZUBEAHaBJkBmAGZAdoEBAUFBZoBmwGaAQUFBgV9Ap4BnwGeAX0CowEHBaUBCAWlAQcFCQUKBacBpgGnAQoFqAELBakBDAWpAQsFqwENBa0BDgWtAQ0FrwEPBbEBEAWxAQ8FqQEMBbMBtQGzAQwFuAERBbYBEgW2AREFvQG+AbwBwAG8Ab4BvwHDAcEBEwXBAcMBwwHCARMFFAUTBcIByAHJARUFcgQVBckBFgUXBcoBywHKARcFGAUZBc4BzwHOARkF0wEaBRsFHAUbBRoFHQUeBR8FIAXYASEFIgUjBSQF4QElBSYF4wEnBeUBKAXlAScFKQUqBSsF6AEsBeYB7AHtAS0FLgUtBe0B8AEvBe4BMAXuAS8FMQUyBTMF9AE0BfIB9wE1BfkBNgX5ATUFNwU4BfoB+wH6ATgFOQU6BTsFAwI7BToFPAU9BT4FPwUJAkAFDAINAkEFQgVBBQ0CQwVEBQ4CRQVGBUcFSAUSAkkFFAJJBRICSgVLBUwFTQVOBRkCTwVQBVEFUgUfAlMFVAVVBSACVgVXBVgFJwJZBSkCWgUpAlkFLAJbBSoCXAVdBV4FXwVgBWEFYgVhBWAFNQJjBTcCZAU3AmMFZQU4AmYFOgJmBTgCPgI/AmcFaAVpBWoFQgJrBUACbAVtBW4FbwVEAnAFcQVyBXMFdAV1BXYFdwVNAngFeQV6BU4CTwJOAnoFewV8BX0FUwJSAn4FfwWABYEFggWDBYQFXgJfAoUFhgWHBYgFiQWKBWACYQJgAooFiwWMBY0FaAKOBY8FkAWRBZIFkwWUBZUFlgWXBZgFmQVxApoFeAJ0AnkCdgJ5AnQCegJ7ApsFnAWbBXsCnQV8Ap4FfgKeBXwCnwWAAqAFggKgBYAChgKhBYQCDAGEAqEFCQHXBIgCiQKIAtcEDQHZBIwCjQKMAtkECAGQAqIFkgKiBZACowWUAqQFlgKkBZQC2wSlBZgCmQKYAqUFxALGAp0CnwKdAsYCoQLgAqMC4gKjAuAC6ALqAqUCpwKlAuoCpgWnBagCqQKoAqcFrQKwAq8CsgKvArACsQJUA7MCVgOzAlQD1ALWArUCtwK1AtYCAAMCA7gCuQK4AgIDTANOA70CvwK9Ak4DqAWpBcACwQLAAqkF2ALaAsUCxwLFAtoCNAM2A8kCywLJAjYDqgXOAqsFzwKrBc4C0QKqAtMCqwLTAqoCrAVgA9UC1wLVAmADrQVtA9kC2wLZAm0D3QKuBd8CrwXfAq4F4QL+AuMC/wLjAv4CsAXmArEF5wKxBeYCsgWzBekC6wLpArMFtAW1BewC7QLsArUFDAMOA/EC8wLxAg4DGAMaA/UC9wL1AhoDtgW3BfgC+QL4ArcFOgM7A/wC/QL8AjsDAQNEAwMDRgMDA0QD7gLvAgQDBQMEA+8C5AIKA+UCCwPlAgoDyALKAg0DDwMNA8oCEQOgAhMDogITA6AC+gL7AhQDFQMUA/sCLAMuAxkDGwMZAy4DuAXPAxwDHQMcA88DIQMGAyMDBwMjAwYDuQUmA7oFJwO6BSYDKQMWAysDFwMrAxYDSANKAy0DLwMtA0oDHgMfAzADMQMwAx8DWANaAzUDNwM1A1oDugK7AjgDOQM4A7sCPQMgAz8DIgM/AyADnAKeAkEDQwNBA54CRQMoA0cDKgNHAygDpAKmAkkDSwNJA6YCuwW8BU0DTwNNA7wFUQO9BVMDvgVTA70FVQMyA1cDMwNXAzIDtAK2AlkDWwNZA7YCpgKnAr8FXQO/BacCLgMvA8AFXwPABS8D1gLXAsEFYgPBBdcCWgNbA8IFZAPCBVsDygLLAsMFZgPDBcsC8gLzAsQFaAPEBfMCvAVrA8UFbAPFBWsD2gLbAsYFbwPGBdsCngKfAscFcQPHBZ8CswVzA8gFdAPIBXMDdgN1A8kFygXLBcwFegPNBXkDzgV5A80FfAPPBX4D0AV+A88FgwPRBdIF0wXUBdUF1gXXBdgF2QWIA9oFiwOKA0gF2wXcBd0FkgMYAt4FTgXeBRgC3wXgBeEFUgWXAx8CmgPiBZgD4wXkBeUF5gXnBegF6QWfAyEFhwSiA+oFowPqBaIDiASmA+sFpwPrBaYDiwSqA+wFqwPsBaoDjASuA+0FrwPtBa4DjQSyA+4FswPuBbIDjgS2A+8FtwPvBbYDjwS6A/AFuwPwBboDkQS+A/EFvwPxBb4DkgTCA/IFwwPyBcIDkwTGA/MFxwPzBcYD9AX1BfYF9wX4BcgDzgP5BfoF+wX6BfkF/AX9Bf4F/wX+Bf0FAAYBBgIGAwYEBtYD2AMFBtkDBgYHBggG2wPaA4sFjAWLBdoD3wNsAgkGlAUJBmwCCgZxAgsGmQULBnECDAYNBg4GiQV+BeYD6ANbBQ8GEAYRBhIGYAPuA2ED7wNhA+4DbQPxA24D8gNuA/EDEwYUBhUGFgYVBhQG/QM0BRcGGAYXBjQFqAMBBKkDAgSpAwEEvAMFBL0DBgS9AwUECwQZBhoGGwYcBh0GEQQeBh8GZQUgBnAFIQZeBBUEEwQVBF4EGQQiBhcEYQQXBCIGHQQjBhsEZwQbBCMGHwQkBiAEJQYgBCQGIwQmBiQEJwYkBCYGKgQoBCIEIQQiBCgELQQuBE8EUARPBC4ELwQoBjAEKQYwBCgGKgZkBDUEMwQ1BGQEOQQ6BCsGLAYrBjoELQZXBD0EOwQ9BFcEbgQ/BC4GQQQuBj8ERQRGBC8GMAYvBkYERwQaBEgEGARIBBoEMQZrBE0ESwRNBGsEMgYzBlIEUQRSBDMGPwRuBFMEVARTBG4EOwRZBDwENAY8BFkEFwRhBFoEWwRaBGEEEwRgBBQENQYUBGAEYwQ2BlsEXQRbBDYGZgQ3BjMENAQzBDcGHAQbBDgGaAQ4BhsEJAQnBmoEWARqBCcGbQQ5BksETARLBDkGcAQ6BlQEVgRUBDoGcQQ7BnIEFQVyBDsGAgADBXYE2gR2BAMF9wQ8BgUAdwQFADwGPQZ5BPkECQD5BHkE/AR7BD4GDQA+BnsE/gR9BD8GEQA/Bn0EFABABn8EQQZ/BEAGgQQZAEIGQwZCBhkAHABEBoIERQaCBEQGhAQhAMABvAHAASEAIwAUBYUERgaFBBQFKQBHBqIDoAOiA0cGLQBIBqYDpAOmA0gGMQBJBokESgaJBEkGNQBLBqoDqAOqA0sGOQBMBq4DrAOuA0wGPQBNBrIDsAOyA00GQQBOBrYDtAO2A04GRQBPBroDuAO6A08GSQBQBpAEUQaQBFAGTQBSBr4DvAO+A1IGUQBTBsIDwAPCA1MGVQBUBsYDxAPGA1QGVQZWBlkAlQRZAFYGVwZYBl0AlwRdAFgGWQZaBmEAmARhAFoGmwRlAFsGXAZbBmUAXQZeBmkAnQRpAF4GXwZgBm0AnwRtAGAGYQZiBnEAoQRxAGIGYwZkBnUAowR1AGQGZQZmBnkApQR5AGYGZwZoBn0ApwR9AGgGaQaWAIEAqQSBAJYAagaKAIUAqwSFAIoAogSOAGsGhwBrBo4AkABOAI0ArQSNAE4AZAaSAKMEjwCjBJIAlgCYAKkEkQCpBJgAoASaAGwGkwBsBpoAnABKAJkArwSZAEoAYgawBKEEmwChBLAEaAaeAKcEnQCnBJ4ApASyBG0GnwBtBrIEigCMAKsEowCrBIwAlgSzBG4GpwBuBrMEbwa0BHAGqQBwBrQEcQa2BHIGrAByBrYEsABzBrkEdAa5BHMGqwC1BLcAuwS3ALUEtwS9BK0AugCtAL0EvwCxAL8EuAS/BLEAwAB1BsoAdgbKAHUGdwbOAHgGxgB4Bs4AyAB5BsEEegbBBHkGegbCBHsGzAB7BsIE0ADWAKIB1wCiAdYA1AB8BsMEfQbDBHwGfgbHBNoAxQTaAMcExQTfAMYEfwbGBN8AyATiAMoEgAbKBOIA0ATJBOYAyATmAMkE2ADGBOkAywTpAMYE4ADJBO4AzATuAMkEzQTwAIEGggaBBvAAyQTQBMwE9gDMBNAE/QDcAPkA3gD5ANwAgwbRBIQG+wCEBtEE1AT/AIUGhgaFBv8AhwaIBgQB1gQEAYgGEwEHARUBiQYVAQcBigbYBIsGCwGLBtgEjAZ1BBEBdgQRAXUEEgGNBtsEpQXbBI0GjgaPBhYBJQEWAY8GHAGQBtwEkQbcBJAG3QQgAZIGkwaSBiABlAaVBiQB3wQkAZUGlgY8AZcGKAGXBjwBKgGYBuEEmQbhBJgGNwEwAZoGmwaaBjAB5AQ1AZwGnQacBjUBOQGeBuUEnwblBJ4GOgGgBucEoQbnBKAGQAGiBuoEoQbqBKIGMQFEAaMGpAajBkQBRgGlBusEpgbrBKUG7ARKAeMENAHjBEoBSwGnBkIBQwFCAacGTQGoBj4BPwE+AagGqQbtBKoGTgGqBu0EVAGrBmgBrAZoAasG7wRWAa0GrgatBlYBbAFdAa8GsAavBl0B8QRgAbEGsgaxBmABZAGzBvMEtAbzBLMG9ARmAbEGtQaxBmYBtAb1BLYGagG2BvUEbgG3BvcEPAb3BLcGuAY9BnIB+QRyAT0GdAG5BvsEugb7BLkGuwa8BngB/QR4AbwGvQaBAXoBfwF6AYEBfgG+BmsBbQFrAb4GJwEmAb8GhAG/BiYBggE9AYgBOwGIAT0BfQL/BJ8BjQGfAf8EAgUBBZUBjwGVAQEFAwWTAdoEmAHaBJMBDgEQAYwBmQGMARABkQEABZoBBAWaAQAFBgWeAcAGwQbABp4BowGmAQcFCgUHBaYBpwHCBgkFwwYJBcIGrQEOBagBCwWoAQ4FqwGuAQ0FsAENBa4BxAbFBq8BDwWvAcUGzwCpAcQAswHEAKkBuwG6AbgBEQW4AboBxgbHBr0BvgG9AccGyAbFAb8BwwG/AcUByQZGBsIBFAXCAUYGyQHKBnIEdARyBMoGywYWBcwGygHMBhYFzgUYBc0GzgHNBhgFzgbPBtAGGgXTAckF0QbSBucF6QUhBdMG3AHUBtUGGQUiBc8BGwUcBeMBJwXjARwF1gbXBtgGLAXoASAF7QHZBi4FIwUuBdkG5QEoBfABLwXwASgFNAX0ARgG5gEYBvQB7AEtBfcBNQX3AS0F+gHuATcFMAU3Be4B2gbbBtwGOwXyATkF3QbeBgQCQAXfBjYFDQL7AUIFOAVCBfsB4AbhBuIGDgIDAkMFSQUUAj8FCQI/BRQCGQIMAk0FQQVNBQwC4wbkBuUGRAVTBQ8C+wXmBucGVwXoBukG6gbrBuwGWQUnAvgF7QbuBu8G8AZbBfEG8gZWBfMGVQX0BiECKQJaBTUC9Qb2BvcGKgL4BjoCZgU6AvgG+QYzAvoGYAX7BmIFNwJkBUICawVCAmQFHgZIAvwGOAJlBUYCPgJnBUsC/Qb+Bv8GTgJAAnkFAAcBBwIHbwUDB0QCBAcFBwYHTQJ3BVgCBwdYAncFXwJPAggHegUIB08CfgWJBVMCYAJTAokFCQdmAoIFgQUKB2gClQVeApMFhQWTBV4CcAJhApoFCwcMBw0HeQJ2AgAFDgcABXYCAgWcBQEFewIBBZwFngV+Ap8FgAKfBX4CoAWCAg8HEAcPB4ICoQWGAqMFlAKjBYYCiAKQAgkBCAEJAZACDAENAYQCjAKEAg0BogWSAhEHEgcRB5ICpQWkBZkClgKZAqQF1wTbBIkCmAKJAtsEnQITB8QCFAfEAhMH4AKhAhUHFgcVB6EC6AKlAhcHGAcXB6UCqAIZB6YFGgemBRkHGwccB60CsAKtAhwHVAOxAh0HHgcdB7EC1AK1Ah8HIAcfB7UCIQcAAyIHuAIiBwADvQIjB0wDJAdMAyMHJQeoBSYHwAImB6gF2ALFAicHKAcnB8UCyQIpBzQDKgc0AykHzwIrB6sFLAerBSsHLQcuB9ECqgLRAi4HrAXVAi8HMAcvB9UCrQXZAjEHMgcxB9kCMwc0B90CrgXdAjQHNQc2B+EC/gLhAjYH5wI3B7EFOAexBTcHsgXpAjkHOgc5B+kCOwe0BTwH7AI8B7QFDAPxAj0HPgc9B/EC9QI/BxgDQAcYAz8HQQe2BUIH+AJCB7YFQwc6A0QH/AJEBzoDRQdGBwEDRAMBA0YHRwfuAkgHBANIB+4C5QILA0kHSgdJBwsDyAINA0sHTAdLBw0DTQdOBxEDoAIRA04HTwf6AlAHFANQB/oCGQNRBywDUgcsA1EHUwe4BVQHHANUB7gFVQdWByEDBgMhA1YHJwNXB7oFWAe6BVcHWQdaBykDFgMpA1oHLQNbB0gDXAdIA1sHXQceA14HMANeBx4DNQNfB1gDYAdYA18HYQe6AmIHOANiB7oCIAM9A2MHZAdjBz0DQQNlB5wCZgecAmUHKANFA2cHaAdnB0UDpAJJA2kHagdpB0kDTQNrB7sFbAe7BWsHbQduB1EDvQVRA24HbwdwB1UDMgNVA3AHWQNxB7QCcge0AnEHvwVdA1YAVwBWAF0DwAVfA1oAWwBaAF8DwQViA2IAYwBiAGIDwgVkA2YAZwBmAGQDwwVmA2oAawBqAGYDxAVoA24AbwBuAGgDxQVsA3IAcwByAGwDxgVvA3oAewB6AG8DxwVxA34AfwB+AHEDyAV0A4IAgwCCAHQDdQNzB3QHdQd2B3cHegN4B80FeQfNBXgHegd7B3wDzwV8A3sH1QV8B30Hfgd/B4MDgAeBB9YFggeGA4MHigOEBxIChQeGB4cHkgOIBxgCFgIYAogHiQcdApUDHwKVAx0CigeLB+AGQwU6BZoDjAfXBuYFHgWNB44H6gWjA48HkAePB6MD6wWnA5EHkgeRB6cD7AWrA5MHlAeTB6sD7QWvA5UHlgeVB68D7gWzA5cHmAeXB7MD7wW3A5kHmgeZB7cD8AW7A5sHnAebB7sD8QW/A50HngedB78D8gXDA58HoAefB8MD8wXHA+QCCgPkAscDyAOhB/cFogf3BaEHzgOjB/kFpAf5BaMHpQemB/wF/QX8BaYH1gOnBwMGqAcDBqcHqQeqB9gDqwesB60H2gOuB4wFrweMBa4H3wOwB2wCagJsArAHsQdzAgoGcQIKBnMC5gOyB4kFigWJBbIHswf4BugDtAe1B7YHYQPvA7cHuAe3B+8DbgPyA7kHuge5B/IDEwa7BxQGvAcUBrsH/QO9BzQFvgc0Bb0HqQMCBKoFzgKqBQIEvQMGBLkFJgO5BQYEvwfABx0GwQcdBsAHwgfDB3AFbwVwBcMHxAchBsUHFQTFByEGIgYZBMYHxwfGBxkEyAfGBx0EIwYdBMYHyQckBsoHHwTKByQGywfMByMEJgYjBMwHKATNByEEzgchBM0HzwfQBy4EUAQuBNAHKAYvBNEH0gfRBy8E0wcqBtQHNQTUByoGOgTVBywG1gcsBtUH0wctBtcHPQTXBy0GLgZBBNgH2QfYB0EE2gfJB0YEMAZGBMkHGgRHBNsH3AfbB0cE3QcxBt4HTQTeBzEGUgTfBzIG1gcyBt8HUwTgBz8EQAQ/BOAH4QfiB1kENAZZBOIHWgTjBxcEGAQXBOMH5AflB2AENQZgBOUH5gfnB2MENgZjBOcH6AfpB2YENwZmBOkHOAZoBCkE6gcpBGgE6wcmBGoEJARqBCYE7AfGAW0EOQZtBMYB7QfLBnAEOgZwBMsGOwZxBO4H7wfuB3EEAgUDBQMAAgADAAMF+AT3BAQABQAEAPcE+QQJAPoECAD6BAkAvAY+BgwADQAMAD4G8Ac/BhAAEQAQAD8GFAAPAEAGfARABg8AFwDxBxkAQwYZAPEHHAAdAEQG8gdEBh0AHwC6ASEAvAEhALoBIwAiABQFEwUUBSIA8wdHBicAKQAnAEcG9AdIBisALQArAEgGpABJBi8AMQAvAEkGMwD1BzUASwY1APUH9gdMBjcAOQA3AEwG9wdNBjsAPQA7AE0GsQROBj8AQQA/AE4GlABPBkMARQBDAE8GiABQBkcASQBHAFAGoABSBksATQBLAFIGrgRTBk8AUQBPAFMGrARUBlMAVQBTAFQGVwD4B1kAVQZZAPgHWwD5B10AVwZdAPkHXwD6B2EAWQZhAPoHYwC3B2UAXAZlALcHZwD7B2kAXQZpAPsHawD8B20AXwZtAPwHbwD9B3EAYQZxAP0HcwD+B3UAYwZ1AP4HdwD/B3kAZQZ5AP8HewC5B30AZwZ9ALkHfwAACIEAaQaBAAAIgwABCIUAagaFAAEIZgZrBoYAhwCGAGsGqASQAIsAjQCLAJAAogSjBI4AjwCOAKMEqASpBJAAkQCQAKkEZAZsBpIAkwCSAGwGpgScAJcAmQCXAJwAoAShBJoAmwCaAKEEpgSnBJwAnQCcAKcEaAZtBp4AnwCeAG0GqgSrBKIAowCiAKsEWgZuBqUApwClAG4GAghwBqgAqQCoAHAGcgasAAMIrgADCKwAsgAECLAAcwawAAQIqgCrALUAtwC1AKsArQC6AK8AuwCvALoAvQCzAL8AsQC/ALMAwgAFCMAAdQbAAAUIBgh4BscAxgDHAHgGygB2BsgAeQbIAHYGewbMAHcGzgB3BswA0gD1ANAA1gDQAPUA1gD1ANQAfAbUAPUA2gDbAH4G0wR+BtsA3QAHCN8AfwbfAAcI4gDjAIAGCAiABuMA5wDPBOYA0ATmAM8E6QDoANgA2QDYAOgA7gDvAOAA4QDgAO8A8ADyAIIGfQaCBvIAzAT2ANMA0gDTAPYACQj9APoA+QD6AP0ACQiEBv0A+wD9AIQGCgiGBv4A/wD+AIYGCwiHBgUBBAEFAYcGBgEMCAcBiQYHAQwICwEKAYsGDQiLBgoBjAYRAQ4IDwEOCBEBDwiNBhQBEgEUAY0GFgEYAY4GEAiOBhgBHQERCBwBkAYcAREIkwYgARIIIQESCCABjwaUBiUBJAElAZQGEwiXBikBKAEpAZcGLAEUCCoBmAYqARQIMAExAZsGowabBjEBNQEzAZ0GEwidBjMBOQE3AZ4GmgaeBjcBPAGWBjoBoAY6AZYGQAFBAaIGFQiiBkEBRQEUCEQBpAZEARQIRgFHAaUG6QSlBkcBSQEyAUoBNAFKATIBpwZLAd4EHgHeBEsBqAZNAeAEIgHgBE0BFgiqBlABTgFQAaoGVAFVAasGFgirBlUBWAEXCFYBrgZWARcIWwEXCF0BsAZdARcIYQEYCGABsgZgARgIZAFlAbMGGQizBmUBaAGsBmYBtQZmAawGtgZqAa8GbAGvBmoBbgFwAbcGWQG3BnABcgFiAbgG8gS4BmIBdAF2AbkGGgi5BnYBeAFSAbsGaQG7BlIBvQZ6ARsIfAEbCHoBgAEcCH4BvgZ+ARwIvwaEAVEBhQFRAYQBiAGJAYIBgwGCAYkBiwGhAY0BnwGNAaEBlAGVAY4BjwGOAZUBlgGYAZIBkwGSAZgBlwGKAZkBjAGZAYoBmgGcAZEBkAGRAZwBngGgAcEGHQjBBqABogHXAKMBpgGjAdcA1QDEBKcBwganAcQErAGtAc0AqAHNAK0BqgEeCKsBrgGrAR4IHgjEBq4BrwGuAcQGxQDEALIBswGyAcQAuAG5AbsBHwi7AbkBuwEfCL0Bxga9AR8IvwG+AcgGxwbIBr4BwgHEAckGIAjJBsQBxwHnB8kBygbJAecHzAHpB8oBzAbKAekH0AF7B84BzQbOAXsHeQchCNIB0wHSASEIIggjCCQIJQjTBtsBJQXgASYI0QHPAScI1AEbBeIB4wHiARsF6AHpAdgB2QHYAekB6wEoCO0B2QbtASgI8AHxAeUB5AHlAfEBKQgqCCsI5wHmAfUB6gHsAfYB9wH2AewB/AHvAfoB7gH6Ae8B8gE7BfMBAgLzATsFPAUsCC0ILgjdBgYCCwL9AQ0C+wENAv0BAwIOAgECEAIBAg4CFAIVAgkCBwIJAhUCFwIKAhkCLwgwCDEIHgIRAjIIDwIyCBECMwg0CFcFNQggAjYIpAc3CCYCOAg5CDoILAItAvEGogfxBi0CYQU7CCUCIwIlAjsIKAIpAjQCNQI0AikCOgI7AioCKwIqAjsCPQI8CD8CYgU/AjwIQgJDAjcCNgI3AkMCRgI9CDgCPgg/CEAIPAI+AkoCSwJKAj4CUAJBAk4CQAJOAkECRAJSAkUCQQhCCH0FQwhECEUIRgh2BUcIXQJRAl8CTwJfAlECUwJgAkgIYgJICGACZgJJCIMFWwJZAkoIawJcApUFXgKVBVwCcgJjAnACYQJwAmMCdgJ3Ag4HSwgOB3cCeQIABXsCAQV7AgAFfgJ/AoACgQKAAn8CDggQB4MCggKDAhAHhgKHApQClQKUAocCkAKIApECigKRAogChAKMAoUCjgKFAowCkgKTAhIHTAgSB5MClgKXApkCmwKZApcCiQKYAosCmgKLApgCnAJmB50CEwedAmYHTgcWB6ACoQKgAhYHpQKkAhgHaQcYB6QCGQeoAi4HqgIuB6gCTQgbB6wCrQKsAhsHHAceB7ACsQKwAh4HtQK0AiAHcgcgB7QCIge4AmEHugJhB7gCvAJOCL0CIwe9Ak4IJgfAAk8IwgJPCMACxQLEAigHFAcoB8QCyAJLB8kCKQfJAksHzQJQCM8CKwfPAlAI0QLQAi0HUQgtB9AC1QLUAjAHHwcwB9QC2QLYAjIHJwcyB9gCUggzB9wC3QLcAjMHFQc1B+AC4QLgAjUH5QJJB+cCNwfnAkkH6QLoAjoHFwc6B+gC7gJHB+wCPAfsAkcH8QLwAj4HUwg+B/AC9AJUCPUCPwf1AlQI+gJPB/gCQgf4Ak8HRAf8AjYH/gI2B/wCIQdFBwADAQMAA0UHSAcEA1YHBgNWBwQDCwMJA0oHVQhKBwkDDQMMA0wHPQdMBwwDVghNBxADEQMQA00HUAcUA1oHFgNaBxQDGANABxkDUQcZA0AHHgNdBxwDVAccA10HYwdVByADIQMgA1UHJQNXCCcDVwcnA1cIZwdZBygDKQMoA1kHLANSBy0DWwctA1IHXgcwA3AHMgNwBzADNAMqBzUDXwc1AyoHOgNDBzgDYgc4A0MHWAhkBzwDPQM8A2QHQANZCEEDZQdBA1kIRgdoB0QDRQNEA2gHSQNIA2oHXAdqB0gDTAMkB00DawdNAyQHWghtB1ADUQNQA20HHQdvB1QDVQNUA28HWANgB1kDcQdZA2AHXAP4B10DVwBdA/gHXgP5B18DWwBfA/kHYQO3B2IDYwBiA7cHYwP7B2QDZwBkA/sHZQP8B2YDawBmA/wHZwP9B2gDbwBoA/0HagP+B2wDcwBsA/4HbgO5B28DewBvA7kHcAMACHEDfwBxAwAIcgMBCHQDgwB0AwEIWwhcCF0Icwd1A14IqQV4B8ECXwhgCGEIYghjCGQIfAN7A3oHZQhmCGcIaAh+B4IDaQhqCGsIiQOpAmwIjAPSAooDbQhuCG8IcAiIB5EDcQhyCHMIdAh1CHYIlQOUA4kHmgObA0MFRAVDBZsDdwh4CJwDnQOcA3gIoQOwBaMDkAejA7AFpQN5CKcDkgenA3kIqQOqBasDlAerA6oFrQN6CK8DlgevA3oIsQN7CLMDmAezA3sItQN8CLcDmge3A3wIuQN9CLsDnAe7A30IvQO5Bb8Dnge/A7kFwQN+CMMDoAfDA34IxQMIA8cDCgPHAwgDPwMiA8gDoQfIAyIDfwijB80DzgPNA6MHHwOlBzED/AUxA6UHgAiBCAEGpwfWA1YD+wKpBxUDrAeCCIMIRwMqA9oDrgfaAyoDAgOwB7kC3wO5ArAHOwOxB/0CCgb9ArEHhAiFCA0GsgfmA+IChgiHCIgItQeJCIoI7QOLCO8DuAfvA4sI8AN2APIDugfyA3YAjAiNCI4IEwaPCLsHkAiRCJII/QP8A70HAATMAgIEzgICBMwCBAQkAwYEJgMGBCQDkwiUCAoECQSVCJYIlwiYCBAEDwSZCJoIFQQWBMUHmwjFBxYEGQQaBMcH2wfHBxoEHQQeBMgHnAjIBx4EIQTOBx8EygcfBM4HywcjBJ0IJQSdCCMEJwSeCCgEzQcoBJ4ILgQsBM8HnwjPBywEMQSgCC8E0gcvBKAI1Ac1BKEINgShCDUEOAShCDoE1Qc6BKEIPQQ+BNcHoAjXBz4EQQRCBNkHogjZB0IEnAjaB0QERgREBNoHSQSbCEcE3AdHBJsITQROBN4HowjeB04EUgRQBN8H0AffB1AEVQSkCFME4AdTBKQIJwbhB1gEWQRYBOEHXAQkAFoE4wdaBCQAZwTkB18EYARfBOQHYwRiBOYHQwTmB2IEZgRlBOgHFgDoB2UE6gdoBF4EXwReBGgENwTrB2kEagRpBOsHbQRsBOwHHgDsB2wEcARvBO0HKwTtB28EcwQvBnEE7wdxBC8GAAUOBwQFpQgEBQ4HeQSmCHoEpwh6BKYIdwSoCHgEqQh4BKgIqgirCKcIegSnCKsIewSsCHwErQh8BKwIfQSuCH4Erwh+BK4IgwSCBLAIsQiwCIIEVQRWBLIIgQSyCFYEswi0CLUItgi1CLQIXARdBLcIhAS3CF0E8we4CEcGuQhHBrgI9Ae6CEgGuwhIBroIpgC8CKQASQakALwI9Qe9CEsGvghLBr0I9ge/CEwGwAhMBr8I9wfBCE0GwghNBsEIsQTDCE4GxAhOBsMIlACVAE8GxQhPBpUAiACJAFAGxghQBokAoAChAFIGxwhSBqEArgSvBFMGyAhTBq8ErAStBFQGyQhUBq0E+AfKCFUGywhVBsoI+QfMCFcGzQhXBswI+gfOCFkGzwhZBs4Itwe4B1wG0AhcBrgH+wfRCF0G0ghdBtEI/AfTCF8G1AhfBtMI/QfVCGEG1ghhBtUI/gfXCGMG2AhjBtcI/wfZCGUG2ghlBtkIuQe6B2cG2whnBroHAAjcCGkG3QhpBtwIAQjeCGoG3whqBt4I4AjhCPcHwQj3B+EIswTiCCoAKwAqAOII4wjkCDYANwA2AOQI5QjmCPQHugj0B+YI5wjoCPYHvwj2B+gI6QjqCCYAJwAmAOoI6wjsCDIAMwAyAOwIVgbtCO4I7wjuCO0IsATwCLEEwwixBPAI8QjyCDoAOwA6APIIsgTzCEYARwBGAPMI9Aj1CPYI9wj2CPUItAT4CLUE+Qi1BPgI+gj7CLYEtwS2BPsI/Aj9CP4I/wj+CP0IugS7BAAJAQkACbsEAgm8BAMJvQQDCbwEdQYFCAQJBQkECQUIBgl4BgcJBggHCXgGeQZ2BggJCQkICXYGCgkLCXcGewZ3BgsJDAkNCcMExATDBA0JDgkPCewA7QDsAA8J2wAQCdMEAQHTBBAJEQn8ABIJ0gQSCfwA1gSIBhMJFAkTCYgGFQkWCRcJ1QQXCRYJGAnDABkJwQAZCcMAggZ9BhoJfAYaCX0GGwkcCR0JHgkdCRwJywQfCcAEyQDABB8JIAkhCcoE5ADKBCEJIgkjCSQJJQkkCSMJfgbTBCYJ1AQmCdMEJwkoCSkJKgkpCSgJKwmhBSwJowUsCaEFLQkGBS4JwAYuCQYFLwmiBTAJEQcwCaIFMQmkBY0GpQWNBqQFMgkzCTQJNQk0CTMJNgneBDcJ3QQ3Cd4EOAk5CToJOwk6CTkJ3ASRBjwJPQk8CZEGMwE+CRMIlwYTCD4JPwmYBkUBFAhFAZgGQAlBCaMGmwajBkEJKQFCCRMInQYTCEIJngaaBkMJRAlDCZoGRQmgBkYJlgZGCaAGogYVCEcJSAlHCRUIFAgsAaQGSQmkBiwBMwkfAUoJTAFKCR8BSwlMCTYJTQk2CUwJTglPCVAJNQlQCU8JUQlSCesEGQHrBFIJVQFTCRYIqgYWCFMJUAFUCRYIqwYWCFQJFwhbAa4GVQmuBlsBVgmwBlgBFwhYAbAGVwmyBlgJGAhYCbIGWQlaCRkIswYZCFoJtQasBlsJXAlbCawGXQleCa8GtgavBl4JXwlgCfIEuAbyBGAJVwFhCVkBtwZZAWEJZwFiCWkBuwZpAWIJYwlkCWUJZgllCWQJZwloCWkJWgFpCWgJHAhqCb4Gawm+BmoJbAknAW0JvwZtCScBbglvCXAJcQlwCW8Jcgm8BHMJAglzCbwEtgB0CbQAdQm0AHQJdgm6BHcJAAl3CboEeAl5CbgAuQC4AHkJegl7CfwI/Qj8CHsJfAl9Cb4AvAC+AH0JfgnDBn8JwgZ/CcMGgAmBCYIJgwmCCYEJhAkMBYUJCwWFCQwFhgkOBYcJDQWHCQ4FiAmJCUIGiglCBokJiwmMCfIHRAbyB4wJgQmNCYMJjgmDCY0JjwnGBpAJHwiQCcYGkQmSCccGyAbHBpIJwwZ+CZMJlAmTCX4JHgAgAOwHlQnsByAAlgnMBugH6QfoB8wGlwmYCZkJaAiaCZsJnAmdCRgFGQUYBZ0JGgWeCRwFnwkcBZ4JfQegCaEJogmjCX4HpAmlCSIFIwUiBaUJpgmnCagJJwWpCSgFqgmrCawJrQmuCa8JsAmxCS4FLQUuBbEJsgkwBbMJLwWzCTAFFAa0CRYGtQkWBrQJtgk2BbcJNQW3CTYFuAm5CTcFOAU3BbkJugmBB7sJvAm9Cb4Jvwk/BcAJQAXACT8FwQnCCUIFQQVCBcIJwwnECdcF2QXaBcUJxglIBccJyAnJCcoJTgVNBcsJzAnLCU0FzQnOCc8J0AnRCdIJ0wnUCeYG1QnmBtQJ1gnXCdgJ2Qn3BtoJBAYDBtsJ3AnbCQMG3QneCV8FYAVfBd4J3wngCeEJYwXiCWQFwQfjCeQJ5QnmCecJ6AnpCfsG/wb6BuoJ6wnsCe0J7gnvCQAHGQbwCfEJ8gkbBvMJ9Al3BfUJ/Qb2CfcJ+An5CXkFegV5BfkJ+gmqB/sJ/An7CaoH/Qn+Cf8JgAUACgoHAQoCCggHAwoECgUKBgoHCggKCQoFBgoKCwqLBQwKjQUMCosFDQoOCg8KEAoRCpMFEgoTChQKFQoUChMKmwWcBRYKFwoWCpwFEAcYCg8HGQoPBxgKDgH/BBoKGwoaCv8EHAodCh4KSwgeCh0KDgiDAh8KIAofCoMCIQoiCiMKJAojCiIKJQqBAiYKJwomCoECAQAAACgKKQooCgAAKgorCowGdQSMBisKLAotCi4KLwouCi0KMAoxCjIKMwoyCjEKNAo1CjYKNwo2CjUKOAo5CjoKOwo6CjkKPAo9Cj4KPwo+Cj0KQApBCkIKQwpCCkEKRApFCkYKRwpGCkUKSApJCkoKSwpKCkkKWghQA0wKTQpMClADTgpPCkADWQhAA08KUApRClIKUwpSClEKVApVClYKVwpWClUKTQisAlgKWQpYCqwC8AJaClMIWwpTCFoKXApdCl4KXwpeCl0KYAphCmIKYwpiCmEKZAplCmYKZwpmCmUKaAppCmoKawpqCmkKbAptCm4KbwpuCm0KcApxCnIKcwpyCnEKdAp1CnYKdwp2CnUK0AJ4ClEIeQpRCHgKUgjcAnoKewp6CtwCfAp9Cn4Kfwp+Cn0KgAqBCoIKgwqCCoEKhAqFCoYKhwqGCoUKiAqJCooKiwqKCokKjApYCI0KPAONClgIjgqPCpAKkQqQCo8KJQOSClcIkwpXCJIKlAqVCpYKlwqWCpUKmAqZCpoKmwqaCpkKnAqdCp4KnwqeCp0KoAqhCqIKowqiCqEKVggQA6QKpQqkChADpgqnCqgKqQqoCqcKqgqrCqwKrQqsCqsKrgqvCrAKsQqwCq8KsgqzCrQKtQq0CrMKtgq3CrgKuQq4CrcKCQO6ClUIuwpVCLoKvAq9CsICTwjCAr0Kvgq/CsAKwQrACr8KwgrDCsQKxQrECsMKxgrHCsgKyQrICscKvALKCk4IywpOCMoKzArNCs4KzwrOCs0K0ArRCtIK0wrSCtEKswXIBesC1ArrAsgFpgK/BUsD1QpLA78FLgPABRsD1gobA8AF1gLBBbcC1wq3AsEFWgPCBTcD2Ao3A8IFygLDBQ8D2QoPA8MF8gLEBdoK2wraCsQFvAXFBU8D3ApPA8UF2gLGBccC3QrHAsYFngLHBUMD3gpDA8cFXAjfCncH4ApzB+EKqQXiCngH4wphCOQK5QrmCucK6ArpCuoKhAPrCoID7AqCA+sK7QruCqcFbAinBe4K7wrwCocH8QqEB9MCcAjyCogH8wpzCPQK9Qr2CnQIiQf3CvgK+Qr6CvsK/AqbA/0K/gr/CgALAQsAC/8KkwTzBQILAwsCC/MFhwTqBQQLBQsEC+oFiATrBQYLBwsGC+sFiwTsBQgLCQsIC+wFjATtBQoLCwsKC+0FjQTuBQwLDQsMC+4FjgTvBQ4LDwsOC+8FjwTwBRALEQsQC/AFkQTxBRILEwsSC/EFkgTyBRQLFQsUC/IFIgMjA6EHFguhByMDfwgXC6MHGAujBxcLHQMZCx8DpQcfAxkLGgsbCxwLHQseCx8LIAshCyILqQf7AiMLKgMrA64HJAuuBysDAgMDA7AHJQuwBwMDOQMmCzsDsQc7AyYL4gLjArIHJwsoCykLKgsrCywLswfvAi0LGgMuC/cCLwv3Ai4LTgMwC78CMQu/AjALMgszCzQLNQu7B1MDNgs3CzgLOQu9B98CSgY6C4kEOwuJBDoLUQY8C5AEPQuQBDwLPgs/C0ALAAZBC0ILQwtEC0ULDAZGC0cLSAtJC0oLSwtKC0kLTAvHB00L2wdNC8cHyAecCE4LRAROC5wITwtQC1ELUgtRC1ALUwtUCywEnwgsBFQLVQtWC04EowhOBFYLJQRXC50IWAudCFcLPgRZC6AI0gegCFkLWgvUBzgEoQg4BNQHoQg2BNUHWwvVBzYEXAvXBzEEoAgxBNcHXQteC18L0QdfC14LHgRgC5wI2gecCGALFgRhC5sI3AebCGELYgueCGMLJwRjC54IZAtlC2YLZwtmC2ULaAuDBGkLsAhpC4MEagtrCxoAGwAaAGsLbAu2CG0LtAhtC7YIbgvjByUAJAAlAOMHbwvLAXALFwVwC8sB5gdDBHELRQRxC0MENwZyCzQEcws0BHILdAscBHULOAZ1CxwEOQR2CzcE6wc3BHYLOQZ3C0wEeAtMBHcL7QcrBHkLLQR5CysEpQh6CwQFBQUEBXoLBAAGAKYIpwimCAYAewt8C6gIqQioCHwLqgh9C6sIfgurCH0LfwuAC6wIrQisCIALDAAOAK4IrwiuCA4AsAixCBYAFwAWALEIsgiBC1UEpAhVBIELtAizCB4AHwAeALMIJABcBCIAtwgiAFwEuQgCC0cGoANHBgILuwgEC0gGpANIBgQLvAgGC0kGSgZJBgYLvggBBEsGqANLBgEEwAgIC0wGrANMBggLwggKC00GsANNBgoLxAgMC04GtANOBgwLxQgOC08GuANPBg4LxggQC1AGUQZQBhALxwgFBFIGvANSBgUEyAgSC1MGwANTBhILyQgUC1QGxANUBhQLVQbLCFYG7QhWBssIVwbNCFgGggtYBs0IbgZaBs8IWQbPCFoGWwZcBoML0AiDC1wGXQbSCF4GhAteBtIIXwbUCGAGhQtgBtQIYQbWCGIGhgtiBtYIYwbYCGQGbAZkBtgIZQbaCGYGawZmBtoIZwbbCGgGbQZoBtsIaQbdCJYAlwCWAN0IagbfCIoAiwCKAN8I4wg2AOEIwQjhCDYA5Qj0B+IIKwDiCPQH5wj2B+QINwDkCPYH6QgmAOYIugjmCCYA6wgyAOgIvwjoCDIA7gjzB+oIJwDqCPMH9QczAIcL7AiHCzMA7gjvCPMHuAjzB+8I8Qg6APAIwwjwCDoA4Aj3B/IIOwDyCPcHhgCIAPMIRwDzCIgA9wioAPYIqgD2CKgA+AiuAPkIrwD5CK4AsgCzAPoI+wj6CLMAtAD8CLUA/gi1APwIAAkBCbkAuwC5AAEJvAACCb0AAwm9AAIJdgZ1BgkJBAkJCXUGBgkKCXgGdwZ4BgoJeQYICXoGwgR6BggJCwnBBHsGegZ7BsEEDAmICw0JiQsNCYgLDwkOCYoLiwuKCw4JAQEQCQABjAsAARAJ3QDcABEJ/AARCdwAFwnVBBMJ1gQTCdUEFgkVCeUA5wDlABUJGQmNCxgJjgsYCY0LGgmPC4IGgQaCBo8LGwnoABwJ6gAcCegAkAvLAB8JyQAfCcsA5QDkACQJIQkkCeQAJAklCeUAFgnlACUJ9wDHBCYJfgYmCccEKQkqCQgIgAYICCoJCgEMASsJoQUrCQwBfQIGBX8CLQl/AgYFBgEIAS8JogUvCQgBLAmjBTEJpAUxCaMFMgkhATMJHwEzCSEBkQtLCTcJNgk3CUsJOQlPCTsJkgs7CU8JPAlSCdwESAHcBFIJRgmWBj4JlwY+CZYGkwuZBj8JmAY/CZkGQQlECZsGmgabBkQJQgmUC50GnAadBpQLngZDCZ8GlQufBkMJ6gShBkUJoAZFCaEGogZHCaEG5wShBkcJowakBkAJSQlACaQGMwlKCTUJUAk1CUoJ3gQ2CacGTQmnBjYJlguSC04JTwlOCZILSQFIAVEJUglRCUgBlwupBlMJqgZTCakGXAmsBlQJqwZUCawGrQauBpgLVQmYC64GVgldCbAGrwawBl0JVwn0BLIGsQayBvQE9QS0BloJswZaCbQGsQa1BvEEWwnxBLUG8wS0Bl4JtgZeCbQGYAmZC7gGPQa4BpkLPAa3BpoLYQmaC7cGYgk+BrsGvAa7Bj4G8AdmCT8GZAk/BmYJmwucC2cJaAlnCZwLvgZrCW0BXAFtAWsJbQmdC2wJngtsCZ0LbglwCegEhgHoBHAJigFyCYsBcwmLAXIJdAmOAXUJkAF1CY4BlAF2CZIBdwmSAXYJlwGWAXgJeQl4CZYBnAGdAXoJewl6CZ0BoAGhAXwJfQl8CaEBnwugC38Jfgl/CaALpQEIBYAJgQmACQgFhQmhC4QJRQaECaELhwlDBoYJ8QeGCUMGiQmiC4oJowuKCaILhAlFBowJRAaMCUUGjQm5AY4JtwGOCbkBjwmRCcYGxwbGBpEJkgmTCcgGxQHIBpMJkwmUCcUBxAHFAZQJxwHGAZUJ7AeVCcYBOgbLBpYJzAaWCcsG0AHRAaQLmwmkC9EB0gHUAZwJpQumC9YBngnbAZ8J2QGfCdsBowmiCSgIJwgoCKIJ4gHkAaQJpQmkCeQBqQnpAacL5wGnC+kBrAmoC6kL6wHqAaoL8QHvAbAJsQmwCe8B8wGyCfUBqwusC60LrguvC7AL+AG1CfYBtwn8AbYJ/QG2CfwBAAKxC7ILuQm4CQECswssCLQLBwK1CwgCCgK/CQsCwAkLAr8JwQkQAsIJEQLCCRACtgu3C7gLEwLFCRUCFgLGCRcCxwkXAsYJHgIdAswJywnMCR0CJAIjAs0JzgnNCSMCJgIoAtMJ1AnTCSgCuQstAroLuwu8C70L2wncCTwIOwg8CNwJNAI2At0J3gndCTYCvgu/C8ALwQvfCcIL5AnDCzwCxAvFC8YLQwJBAugJ6QnoCUECRQLrCT0I7Qk9COsJ8AnHC8gLTALyCUoC9QlQAvQJUQL0CVACQQjJC8oLywvMC1UC+wlaAvoJWwL6CVoCXAL9CV0C/wldAv0JAQpiAgIKYwICCmICzQtKCAoKzgvPC9ALagILCmsCDAprAgsK0QvSC9ML1AvVC9YLdQISCncCFAp3AhIKFQoTChcKFgoXChMK1wsZChoKGAoaChkK2AvXCxsKGgobCtcLhwKFAhwKHQocCoUCIAqKAh8KiwIfCooCjgKPAiEKIgohCo8CkQIlCpMCJgqTAiUKlQIoCpcCKQqXAigKmgKbAioKKwoqCpsCLQosClEKUwpRCiwKMQpoCjMKagozCmgKNQpzCjcKcQo3CnMKuwVsBzgKOQo4CmwHPQpACj8KQgo/CkAKQQrMCkMKzgpDCswKRgpcCkQKXgpEClwKhAqGCkgKSQpICoYKTApNCskKyArJCk0KsgU5B04KTwpOCjkHUgpgClAKYgpQCmAKVgpXCrUKtAq1ClcKWApZCkEHtgVBB1kKWgo6ClsKOwpbCjoKXQquBV8KNAdfCq4FYQq9BWMKbgdjCr0FZQqsBWcKLwdnCqwFaQqCCmsKgwprCoIKbgpvClMHuAVTB28KJQdwCqgFcgqoBXAKugVYB3QKdQp0ClgHeAqRCnkKjwp5CpEKegp7CpsKmgqbCnsKqwUsB3wKfQp8CiwHuAq5CoAKgQqACrkKhQq+CocKwAqHCr4Kdgp3CogKiQqICncKbAqMCm0KjQptCowKVAqOClUKkApVCo4KkgowCpMKMgqTCjAKfgp/CpQKlQqUCn8KrAqtCpgKmQqYCq0KsQU4B5wKnQqcCjgHoQqKCqMKiwqjCooKpAqlCjsHtAU7B6UKpwqWCqkKlwqpCpYKqwqqCsMKxQrDCqoKngqfCq4KrwquCp8K0grTCrIKswqyCtMKSgpLCrYKtwq2CksKugqgCrsKogq7CqAKLgovCrwKvQq8Ci8KvwqmCsEKqArBCqYKxAo0CsIKNgrCCjQKpgUaB8YKxwrGChoHygqtBcsKMQfLCq0FzQqwCs8KsQrPCrAK0QrQCkUKRwpFCtAK6gLrAlwD1ApcA+sCSgNLA14D1QpeA0sDGgMbAy4L1gouCxsDtgK3AmMD1wpjA7cCNgM3A2UD2AplAzcDDgMPA2cD2QpnAw8DaQPaCmoD2wpqA9oKTgNPAzAL3AowC08DxgLHAnAD3QpwA8cCQgNDA3ID3gpyA0MDcwfgCiUI0wYlCOAK2QshCHgHeQd4ByEI5grNBnoH2gtjCNsLZgjcC90LmQneC98L4AvhC4AHvglsCLwJhAfxChMCxQkTAvEK4gvGCYgHFgKIB8YJ+ArLCYkH4wt1COQL5QvmC0cF5QbnC+gL6QssBXgIIAV4CCwFoAMCC6EDAwuhAwILpAMEC6UDBQulAwQLSgYGCzoLBws6CwYLrAMIC60DCQutAwgLsAMKC7EDCwuxAwoLtAMMC7UDDQu1AwwLuAMOC7kDDwu5Aw4LUQYQCzwLEQs8CxALwAMSC8EDEwvBAxILxAMUC8UDFQvFAxQLoQcWC6IH8QaiBxYLGAs3CKMHpAejBzcIGQvnBqUHpgelB+cGpwfqC6gH6wvsCx0LIwv8CakHqgepB/wJrgckC68HCgqvByQLJQsLCrAHagKwBwsKJgsRCrEHcwKxBxEKsgftC4oF7gvvCycLLQtmBbMH+AazB2YF9gL3AvALLwvwC/cCvgK/AvADMQvwA78CNQvxC7sHvAe7B/ELOQs5Bb0Hvge9BzkFigSJBPILOwvyC4kEAwSQBAQEPQsEBJAE8ws+C5YIQQuUCPQL9QtDC5oIRguYCPYLMQbdB0gLSQtIC90HxgfHByMGTAsjBscHxgfIByIGTgsiBsgHTwswBlALyQdQCzAG2AdUCy4GUwsuBlQLVgtVC1ILUQtSC1ULVwtkC1gLZgtYC2QLXwvRB1kL0gdZC9EH1AdaC9MHLQbTB1oL1QdbC9YHMgbWB1sLKgbTB1wL1wdcC9MHzAdeCyYGXQsmBl4LYAskBtoHyQfaByQGTQvbB2EL3AdhC9sHYgtjC8QHIQbEB2ML1gdnCywGZQssBmcLaQv3C2gLMgRoC/cLMAQpBmoLawtqCykGbQv4C2wL+QtsC/gLSAQYBG4L4wduCxgEbwv6C8sBzQHLAfoL5wfmB8oGcQvKBuYHcgv6C3MLMwZzC/oLdQsgBHQLJQZ0CyAEJgTrB/sLdgv7C+sHdws7BngL7gd4CzsGywbtBxYFeQsWBe0HIwokCqUIegulCCQK+AQEAJkLpgiZCwQA/At7C5oLqAiaC3sLqgj9C30L/gt9C/0L+wS6BqwIfwusCLoGvAYMAP0Ergj9BAwAsQihCxcA8QcXAKELigmjC7IIgQuyCKMLswgRBR8AugEfABEFwQETBbcIIgC3CBMFuQhUAAILkwQCC1QAuwgoAAQLhwQECygAvAgsAAYLiAQGCywAvgj/CwEE/wMBBP8LwAg0AAgLiwQICzQAwgg4AAoLjAQKCzgAxAg8AAwLjQQMCzwAxQhAAA4LjgQOC0AAxghEABALjwQQC0QAxwhIAAUEAwQFBEgAyAhMABILkQQSC0wAyQhQABQLkgQUC1AAhACqBMsI7QjLCKoEWACUBM0IggvNCJQEXACWBM8IbgbPCJYE0AgADIMLAQyDCwAMZACaBNIIhAvSCJoEaACcBNQIhQvUCJwEbACeBNYIhgvWCJ4EcACgBNgIbAbYCKAEdACiBNoIawbaCKIEeACkBNsIbQbbCKQEfACmBN0IlwDdCKYEgACoBN8IiwDfCKgEnATjCIUL4QiFC+MIWAblCJcE4giXBOUIXgbnCJ0E5AidBOcIlATpCIIL5giCC+kImgTrCIQL6AiEC+sIVgbuCJUE6giVBO4IWwaHC5sE7AibBIcLogBSAO8IuAjvCFIAngTxCIYL8AiGC/EIYAbgCJ8E8gifBOAIZgaGAKUE8wilBIYAAgioAAIM9wgCDKgAAwwDCPgIrgD4CAMIBAiyAAQM+ggEDLIAtQD+CKoA9giqAP4I+QivAAEJuwABCa8AswC9APsIAwn7CL0AxAYeCAQJCQkECR4IHAnqAAYJCgkGCeoACAmqAcIErAHCBKoB6wDABAsJwQQLCcAE8gDzAAwJiAsMCfMADgnRAIsLpAGLC9EAEAkFDIwLBgyMCwUMEQmNC90ABwjdAI0LEwnNBBcJgQYXCc0EFQmPC+cAzwTnAI8LkAsHCBkJjQsZCQcI9ADPBBoJjwsaCc8EBQzZABsJ6AAbCdkABwiQC38GHwl/BpALJAkhCSIJBwwiCSEJFgklCdUEAgHVBCUJ+AD3AAgMJgkIDPcAKgkgCYAGygSABiAJCgErCQ0ICQwNCCsJgQJ/AicKLQknCn8CLwkKDAYBDAgGAQoMMQkLDCwJDAwsCQsMMgkNDCEBEgghAQ0MkQs3CQ4MDwwODDcJNAk1CTkJTwk5CTUJGAEZATwJUgk8CRkBpgZGCRAMPgkQDEYJEQyTCxIMPwkSDJMLgAGBAUEJRAlBCYEBbAmeC0IJlAtCCZ4LQwm9BpULGwiVC70GpQbpBEUJ6gRFCekERwluCecE6ATnBG4JagkcCEkJQAlJCRwISgkuAVAJNgFQCS4BpwZNCUMBEgxDAU0JTgk4AZYL5gSWCzgBUQkQDEkBMgFJARAMUwljCZcLZQmXC2MJgwFcCYUBVAmFAVwJnAuYC2gJVQloCZgLcAFxAVYJXQlWCXEBdgF3AVcJ9ARXCXcBewH2BFoJ9QRaCfYEhwHxBIkBWwmJAfEEXglfCfME8gTzBF8JYAlvAZkL+ASZC28B/AuaCxMMYQkTDJoLYgl1AT4G/AQ+BnUB/gQ/BnkBZAl5AT8GZwkrAZsL4gSbCysBaQlaAWsJXAFrCVoBnQttCe4ETwHuBG0JcAleAYYBhwGGAV4Bcwl9CYsBoQGLAX0JlAGOAXYJdAl2CY4BkgF3CZYBeQmWAXcJigGXAXIJeAlyCZcBnAF6CZABdQmQAXoJoAF8CR0IFAwdCHwJiQufCw0JfwkNCZ8LpAGlAYsLgAmLC6UBhgnxB4UJoQuFCfEHQgZDBogJhwmICUMGsQEQBYkJoguJCRAFjAm1AYQJDAWECbUBkAkfCI0JuQGNCR8IBwUKBY8JkQmPCQoFCQXDBpIJkwmSCcMGFQwgCJQJxAGUCSAIlQk2BscB5wfHATYGVgQ6BhgAlgkYADoGFgwXDBgMewfQAc8FeQfSAc0FnAnNBdIBdAclCJ4J2wGeCSUIGQwaDN4B0QEnCJsJ1AHiAZ0JpAmdCeIBqQmfCekB2QHpAZ8JrQkbDBwMKAjrAaMJsAmlCfEB5AHxAaUJKggdDB4MpwvnAbMJrgkfDCAM9gG0CeoBsQnvAbcJ/AG3Ce8B8wECArIJIQwiDCMMtQn4Ab0JCAK9CfgBCwLACf0Btgn9AcAJwQm5CRACAQIQArkJtQsHAiQMFQIkDAcCFwLHCQoCJQwxCCYMzAnCCR4CEQIeAsIJzQn9BSQCJwwoDCkMpAcmAvkF0wn5BSYCKgwrDNcJLAzaCS0M3AnOCTsIIwI7CM4JKAI0AtQJ3QnUCTQC4gm6CzsCKwI7AroLLgwvDDAMPAg9AtsJ6AneCUMCNgJDAt4JRwIxDMELwAs+CO8J5Ak8AvMJMgwzDDQM6QlBAvUJUAL1CUECRQJUAusJ+AnrCVQC8glMAvsJWgL7CUwCXQL/CVEC9AlRAv8JNQzLCzYMyQs3DDgM+glbAs0LSgjNC1sCawIMClwC/QlcAgwKEAoCCnICOQw6DAUKdwIUCksIHgpLCBQKAQAVCgMAFwoDABUKGgoYCg4BDwEOARgKnQXYC3wCGwp8AtgLHAooCocClQKHAigKJQqRAiAKigIgCpEChQKOAh0KIQodCo4CkwImCkwIOwxMCCYKlwIpCpsCKwqbAikKiwKaAh8KKgofCpoCLAp7A1MKfQNTCnsDmwdoCjwMMQo8DGgKcwo1CngDdwN4AzUKuwU4CrwFawO8BTgKPQxACj4MPQo+DEAKkQfMCj8MQQo/DMwKXApGCpkD/QqZA0YKlweECkAMSApADIQKTQqPCMgKQQzICo8IsgVOCrMFcwOzBU4KYApSCoQD6wqEA1IKVwqRA7QKkwO0CpEDWQpCDLYFtwW2BUIMOgpaCmkD2gppA1oKrgVdCq8FmAOvBV0KvQVhCr4F0gW+BWEKrAVlCmAD7gNgA2UKfQiCCpwHaQqcB4IKbwrNA7gFzwO4Bc0DqAVyCqkF4gqpBXIKuQW6BZ4HdAqeB7oFkQp4Co0DjAONA3gKewr8A5oK/gOaCvwDqgWrBZQHfAqUB6sFmQe4CkMMgApDDLgKewi+CpgHhQqYB74KnQd2CkQMiApEDHYKbQqNCn8IFwt/CI0KVQqQCnAI8gpwCJAKRQwwCkYMkgpGDDAKkwd+CkcMlApHDH4KmApIDKwKdwisCkgMsAWxBZAHnAqQB7EFfgiKCqAHoQqgB4oKpQpJDLQFtQW0BUkMegiWCpYHpwqWB5YKqgqcA8UKngPFCpwDjweeCkoMrgpKDJ4KsgpLDNIK9wrSCksMfAhKCpoHtgqaB0oKnwegCkwMugpMDKAKvArlCi4K5wouCuUKlQemCk0MvwpNDKYKNArECl4I4QpeCMQKxgrtCqYFpwWmBe0KrQXKCm0D8QNtA8oKeQiwCpIHzQqSB7AK0AqUA0cKlgNHCpQDXAPUCvgHygj4B9QKXgPVCvkHzAj5B9UKLgvWCvoHzgj6B9YKYwPXCvsH0Qj7B9cKZQPYCvwH0wj8B9gKZwPZCv0H1Qj9B9kKagPbCv4H1wj+B9sKMAvcCv8H2Qj/B9wKcAPdCgAI3AgACN0KcgPeCgEI3ggBCN4KTgxPDFAM6QXTBp8D2Qt2AyEIyQUhCHYDeQPOBeYKUQxSDFMM3AtUDFUM0AWaCX4DVgxXDFgMvAnuChYG8QqIA8UJ2QXFCYgD4guLA8YJSAXGCYsD3gVOBfgKWQxaDFsM5gtcDFAFUgVTBZcD+QMpBV0MLAXpCxgGoQMDC7AF5gKwBQMLpQMFC3kISgx5CAULOgsHCz0MPww9DAcLrQMJC3oIRwx6CAkLsQMLC3sITQx7CAsLtQMNC3wIQAx8CA0LuQMPC30IQwx9CA8LPAsRC0UMPAxFDBELwQMTC34IRAx+CBMLxQMVCwgDTAwIAxULFgsPBvEG8AbxBg8GGAvJAzcI+AU3CMkD+gX7BRkL5wYZC/sF6gv+Bc8JXgxfDGAMBwRhDCEL/AkjCxsGJAvZAwoKCQoKCtkDJQvbAwsKiwULCtsDYgxjDGQMEQomC5QF7QsLBpoFZQxmDGcMDQRoDCsLZgUtC2UF8AsvC14AXwBeAC8L8AMxC3YAdwB2ADELNQvRBfELfwfxC9EFOQviBTkFOgU5BeIF8gs7C2kMPgxpDDsLBAQ9CyQDRgwkAz0LagzjCcAHwQfAB+MJawwDB8MHbwXDBwMHawQxBvgLSAv4CzEGIwZMC2cE5AdnBEwLIgZOC2EEYgRhBE4LMAZPCy8G7wcvBk8LLgZTC24EbwRuBFMLeAvuB1ULUQtVC+4H+wtsDFcLZAtXC2wMWQs0Bl8L4gdfCzQGWgtpBC0GVwQtBmkEcwszBlsLMgZbCzMGXAv3CyoGZAQqBvcLJgZdCycG4QcnBl0LdAslBmALJAZgCyUGYQs1Bk0L5QdNCzUGYwvqByEGXgQhBuoHZQttDCwGKwYsBm0M9wtpC2QEZQRkBGkLaAsyBGoLMARqCzIE+AttC2sEbARrBG0LbgxKBG4LSARuC0oE+gtvCzMGUQQzBm8LygZxC3QEcwR0BHELzAHNAXIL+gtyC80BKgQiBHULIAR1CyIE+wt2C2wMbQxsDHYLyAEVBXcLOwZ3CxUFFgV5CxcFcAsXBXkLSwgjCg4HpQgOByMKPQaZC3kEpgh5BJkLPAaaC3cEqAh3BJoLqginCP0LBgD9C6cI/AT7BHsErAh7BPsE/QSuCP4EfQT+BK4IoQuxCEUGggRFBrEIsgiBBIoJQgaKCYEEEQWzCBIFtQgSBbMItwiEBMEBwAHBAYQEUgBUALgIuQi4CFQAJgAoALoIuwi6CCgAKgAsAKYAvAimACwAvQhvDL4I/wu+CG8MMgA0AL8IwAi/CDQANgA4AMEIwgjBCDgAOgA8AMMIxAjDCDwAPgBAAJUAxQiVAEAAQgBEAIkAxgiJAEQARgBIAKEAxwihAEgASgBMAK8EyAivBEwATgBQAK0EyQitBFAAygiCAMsIhADLCIIAzAhWAM0IWADNCFYAzghaAM8IXADPCFoAuAeLCNAIAAzQCIsI0QhiANIIZADSCGIA0whmANQIaADUCGYA1QhqANYIbADWCGoA1whuANgIcADYCG4A2QhyANoIdADaCHIAugd2ANsIeADbCHYA3Ah6AN0IfADdCHoA3gh+AN8IgADfCH4AYAaFC+AI4QjgCIULlgSXBLME4gizBJcEnASdBOMI5AjjCJ0EWAaCC+UI5gjlCIILXgaEC+cI6AjnCIQLlASVBOkI6gjpCJUEmgSbBOsI7AjrCJsEqgSiAO0I7wjtCKIAYgaGC7AE8AiwBIYLngSfBPEI8gjxCJ8EpASlBLIE8wiyBKUE9wj1CAIMcAwCDPUIbwYDDLQE+Ai0BAMMcQYEDLYE+gi2BAQM/gj/CPYI9Aj2CP8ItQT5CLsEAQm7BPkI+wgDCbcEvQS3BAMJBAkFCcQGxQbEBgUJBwkeCQYJHAkGCR4JCAkJCaoBHgiqAQkJCwkKCesA6gDrAAoJwwR9BgwJ8gAMCX0G7ADTAA4J0QAOCdMAEAnbAAUM2QAFDNsAjQsRCY4LEgmOCxEJEwkUCc0EzgTNBBQJjwsVCYEGFwmBBhUJGQnBAJALywCQC8EAGgl8BvQA9QD0AHwGBQwbCQYMHQkGDBsJxgR/BssEHwnLBH8GcQwHDCAJIQkgCQcMAwECASMJJQkjCQIBhQYIDNQEJgnUBAgMcQwgCSgJKgkoCSAJLAkMDCsJCQwrCQwMJwotCXIMLglyDC0JcwwKDDAJLwkwCQoMDwgLDI0GMQmNBgsMDQwyCXQMNAl0DDIJNwndBA8MkgYPDN0EdAw0CTgJOQk4CTQJPQkQCDwJGAE8CRAIMwEyAT4JEAw+CTIBQwESDEUBPwlFARIMQQlACYABHAiAAUAJQgkpAWwJJwFsCSkBQwlECb0GgQG9BkQJpgalBkYJRQlGCaUGRwlICW4JbwluCUgJLAEtAUkJaglJCS0BSglMAS4BLwEuAUwBTAkRDE0JEgxNCREMUAk2AU4JOAFOCTYB6wSmBlEJEAxRCaYGUwlVAWMJUwFjCVUBUQGFAVABVAlQAYUBVQlbAWgJWgFoCVsBcAFWCVkBWAFZAVYJdgFXCRoIWAkaCFcJewFaCX0BWQl9AVoJWwlcCYkBgwGJAVwJXgldCV8JcQFfCV0JXwlxAWAJbwFgCXEBVwHwBGEJEwxhCfAEZwF3AWIJdQFiCXcBYwlTAWQJeQFkCVMBaQktAWcJKwFnCS0BLQFpCWoJawlqCWkJbQm/Bk8BUQFPAb8GcAlxCV4BXwFeAXEJAgm8AHMJfQlzCbwAdgl0CboEtgC6BHQJdwkACXkJuQB5CQAJcgl4CbwEuAC8BHgJegn8CHUJtAB1CfwIfAm+ABQMvgQUDL4AxAQNCcIGfwnCBg0JiwuACYoLggmKC4AJhQkLBYYJDgWGCQsFDQWwAYcJiAmHCbABiQmICbEBsAGxAYgJjAmLCbUBtAG1AYsJCAWQCYEJjQmBCZAJBwWPCQgFkAkIBY8JCgUJBZEJkgmRCQkFoAsVDH4JlAl+CRUMXQQ2BiAAlQkgADYGFgAYAOgHlgnoBxgAdQxVDHYM0AXPBZoJzQWcCc4Fdwx4DHkMyQV0BxoFngkaBXQHfgdoCKIJegx7DN0LnQmkCRkFIgUZBaQJqQknBZ8JHAWfCScF8Qt/B6oLowmqC38HLgUjBbAJpQmwCSMFswkvBacLKAWnCy8FfAyuCX0Mrgt+DKwJtwk1BbEJLQWxCTUFsgm4CTAFNwUwBbgJVwx/DIAMvQm8CbUJwAlABbYJNgW2CUAFQgU4BcEJgQyCDIMMhAyCB4UMvgm1C9oFxwlJBb8JPwW/CUkFTQVBBcwJwgnMCUEFhgyHDIgM/wX9Bc8J+QXTCfsF5gb7BdMJiQyKDIsMuQtZBfcFAwaoB9wJzgncCagH1AndCdUJ8wZYBYwM4gljBboL2Am8C40MjgyPDC4M2wnDCwQGaAWQDJEM3gnoCWAF7QlrBZIMZAWSDGsFwQfkCR0GkwyUDJUM9Ql4BekJaQWWDHUF6wn4CewJlwxsBcwLGwbyCfwJ+wn8CfIJ/wkHB/QJdwX0CQcHCAd6BQEKOAyYDJkMzQsFBvoJmgybDJwMDAqNBf0J/gn9CY0FnQwDCtULngzTC4cFAQAeChUKFAoVCh4KnAUCBRcKAwAXCgIFDggPARAHGAoQBw8BfAIbCn0C/wR9AhsKAQAoCh4KHAoeCigKIAqDAiUKgQIlCoMCHQohCksIIwpLCCEKJgonCjsMcgw7DCcKKQoAACsKdQQrCgAADggfCowGKgqMBh8KLgrnCiwKewMsCucKRQw8DDAKMQowCjwMNQo0CncDXgh3AzQKOgppAzgKawM4CmkDaQw+DDwKPQo8Cj4MPQw/DEAKQQpACj8MRgpHCv0KlgP9CkcKfAhADEoKSApKCkAMUANSA00KjwhNClIDQANCA04KcwNOCkIDUgpTCusKfQPrClMKVQpwCFcKkQNXCnAIrAKuAlkKQgxZCq4C8ALyAloK2gpaCvICXQpcCpgDmQOYA1wKYQpgCtIFhAPSBWAKZArsA2UK7gNlCuwDmwecB2gKaQpoCpwHbQp/CG8KzQNvCn8IcgpzCuIKeAPiCnMKnQeeB3YKdAp2Cp4HeArQAowD0gKMA9AC3ALeAnsK/AN7Ct4CkweUB34KfAp+CpQHfQhDDIIKgAqCCkMMlweYB4QKhQqECpgHfghEDIoKiAqKCkQMjQo8AxcLPgMXCzwDkAqRCvIKjQPyCpEKJANGDCUDkgolA0YMeghHDJYKlAqWCkcMmgr+A5gKSAyYCv4DjweQB54KnAqeCpAHnwegB6AKoQqgCqAHEAMSA6UKSQylChIDlQeWB6YKpwqmCpYHrAp3CKoKnAOqCncIeQhKDLAKrgqwCkoMtAqTA7IKSwyyCpMDmQeaB7gKtgq4CpoHCANMDAkDugoJA0wMwgLDArwK5Qq8CsMCewhNDL4Kvwq+Ck0MxArFCuEKngPhCsUKyApBDMYK7QrGCkEMvAK+AsoK8QPKCr4CkQeSB8wKzQrMCpIH0gr3CtAKlAPQCvcKyAWCANQKygjUCoIAvwVWANUKzAjVClYAwAVaANYKzgjWCloAwQViANcK0QjXCmIAwgVmANgK0wjYCmYAwwVqANkK1QjZCmoAxAVuANsK1wjbCm4AxQVyANwK2QjcCnIAxgV6AN0K3AjdCnoAxwV+AN4K3gjeCn4A4QqeA+AKnwPgCp4D4gp4A9kLnwygDKEM5grlCnkDwwJ5A+UKogyjDN8LfgPsCn0D7grtChUG+ANWDKQM0wKrAvEKiAPxCqsC8gqNA+ILiwPiC40D+ApLDN4FkwPeBUsM+gqlDKYMpwymDKUM6QtIDBcGqAypDKoM8wXkAgML5gIDC+QC6gWPBwULSgwFC48H6wWRBwcLPwwHC5EH7AWTBwkLRwwJC5MH7QWVBwsLTQwLC5UH7gWXBw0LQAwNC5cH7wWZBw8LQwwPC5kH8AWbBxELPAwRC5sH8QWdBxMLRAwTC50H8gWfBxULTAwVC58HqwysDK0MrgyvDLAMFws+AxgLsQyyDLMMGQsdA/oFzwP6BR0DVwMzA+oL/gXqCzMDIwv5AhwGtwUcBvkCtAy1DLYMtwy4DLkMAwNGAyULugy7DLwMJgs5AwkGuwIJBjkDvQy+DL8MCwbtC/8CLQvtAiAGtQUgBu0CLgv6By8LXwAvC/oHMAv/BzELdwAxC/8HwAzTBcEMwgzDDMQM3wKvBTkLigfFDMYMOgs9DDsLPgw7Cz0MPAtFDD0LRgw9C0UMQAvHDI4MBAbjCdcDRQvIDHsFfgUDB+cD+AtIC/kLSgv5C0gL5AdMC+UHTQvlB0wLYgROC0MERARDBE4L7gfvB1ELTwtRC+8HbwRTCysELAQrBFMLTAR4C04EVQtOBHgLJQQmBFcL+wtXCyYEWQs+BDQGPAQ0Bj4EaQRaCzcEOAQ3BFoLNARzCzYEWws2BHML9wtcCzIEMQQyBFwL4QddC+IHXwviB10LHAR0Cx4EYAseBHQLYQsWBDUGFAQ1BhYEYwsnBOoHKQTqBycEZQtkC20MbAxtDGQLaQuwCGUEFgBlBLAIagsaAGgLgwRoCxoAbQu0CGwEHgBsBLQIbgslAG4MhgRuDCUAcAtPBG8LUQRvC08EcQtFBHMELwZzBEUE6QfMATcGcgs3BswBKQQqBDgGdQs4BioEdgs5BG0MKwZtDDkExgHIATkGdws5BsgBeQstBHALTwRwCy0E\"\n        }\n    ]\n}\n"
  },
  {
    "path": "examples/resources/models/gltf/DamagedHelmet/README.md",
    "content": "# Damaged Helmet\n\nhttps://github.com/KhronosGroup/glTF-Sample-Models/tree/master/2.0/DamagedHelmet\n\n## License Information\n\nBattle Damaged Sci-fi Helmet - PBR by [theblueturtle_](https://sketchfab.com/theblueturtle_), published under a Creative Commons Attribution-NonCommercial license\n\nhttps://sketchfab.com/models/b81008d513954189a063ff901f7abfe4\n\n## Modifications\n\nThe original model was built on an early draft of glTF 2.0 that did not become final.  This new model has been imported and re-exported from Blender to bring it into alignment with the final release glTF 2.0 specification.\n"
  },
  {
    "path": "examples/resources/models/gltf/DamagedHelmet/glTF/DamagedHelmet.gltf",
    "content": "{\n    \"accessors\" : [\n        {\n            \"bufferView\" : 0,\n            \"componentType\" : 5123,\n            \"count\" : 46356,\n            \"max\" : [\n                14555\n            ],\n            \"min\" : [\n                0\n            ],\n            \"type\" : \"SCALAR\"\n        },\n        {\n            \"bufferView\" : 1,\n            \"componentType\" : 5126,\n            \"count\" : 14556,\n            \"max\" : [\n                0.9424954056739807,\n                0.8128451108932495,\n                0.900973916053772\n            ],\n            \"min\" : [\n                -0.9474585652351379,\n                -1.18715500831604,\n                -0.9009949564933777\n            ],\n            \"type\" : \"VEC3\"\n        },\n        {\n            \"bufferView\" : 2,\n            \"componentType\" : 5126,\n            \"count\" : 14556,\n            \"max\" : [\n                1.0,\n                1.0,\n                1.0\n            ],\n            \"min\" : [\n                -1.0,\n                -1.0,\n                -1.0\n            ],\n            \"type\" : \"VEC3\"\n        },\n        {\n            \"bufferView\" : 3,\n            \"componentType\" : 5126,\n            \"count\" : 14556,\n            \"max\" : [\n                0.9999759793281555,\n                1.998665988445282\n            ],\n            \"min\" : [\n                0.002448640065267682,\n                1.0005531199858524\n            ],\n            \"type\" : \"VEC2\"\n        }\n    ],\n    \"asset\" : {\n        \"generator\" : \"Khronos Blender glTF 2.0 exporter\",\n        \"version\" : \"2.0\"\n    },\n    \"bufferViews\" : [\n        {\n            \"buffer\" : 0,\n            \"byteLength\" : 92712,\n            \"byteOffset\" : 0,\n            \"target\" : 34963\n        },\n        {\n            \"buffer\" : 0,\n            \"byteLength\" : 174672,\n            \"byteOffset\" : 92712,\n            \"target\" : 34962\n        },\n        {\n            \"buffer\" : 0,\n            \"byteLength\" : 174672,\n            \"byteOffset\" : 267384,\n            \"target\" : 34962\n        },\n        {\n            \"buffer\" : 0,\n            \"byteLength\" : 116448,\n            \"byteOffset\" : 442056,\n            \"target\" : 34962\n        }\n    ],\n    \"buffers\" : [\n        {\n            \"byteLength\" : 558504,\n            \"uri\" : \"DamagedHelmet.bin\"\n        }\n    ],\n    \"images\" : [\n        {\n            \"uri\" : \"Default_albedo.jpg\"\n        },\n        {\n            \"uri\" : \"Default_metalRoughness.jpg\"\n        },\n        {\n            \"uri\" : \"Default_emissive.jpg\"\n        },\n        {\n            \"uri\" : \"Default_AO.jpg\"\n        },\n        {\n            \"uri\" : \"Default_normal.jpg\"\n        }\n    ],\n    \"materials\" : [\n        {\n            \"emissiveFactor\" : [\n                1.0,\n                1.0,\n                1.0\n            ],\n            \"emissiveTexture\" : {\n                \"index\" : 2\n            },\n            \"name\" : \"Material_MR\",\n            \"normalTexture\" : {\n                \"index\" : 4\n            },\n            \"occlusionTexture\" : {\n                \"index\" : 3\n            },\n            \"pbrMetallicRoughness\" : {\n                \"baseColorTexture\" : {\n                    \"index\" : 0\n                },\n                \"metallicRoughnessTexture\" : {\n                    \"index\" : 1\n                }\n            }\n        }\n    ],\n    \"meshes\" : [\n        {\n            \"name\" : \"mesh_helmet_LP_13930damagedHelmet\",\n            \"primitives\" : [\n                {\n                    \"attributes\" : {\n                        \"NORMAL\" : 2,\n                        \"POSITION\" : 1,\n                        \"TEXCOORD_0\" : 3\n                    },\n                    \"indices\" : 0,\n                    \"material\" : 0\n                }\n            ]\n        }\n    ],\n    \"nodes\" : [\n        {\n            \"mesh\" : 0,\n            \"name\" : \"node_damagedHelmet_-6514\",\n            \"rotation\" : [\n                0.7071068286895752,\n                0.0,\n                -0.0,\n                0.7071068286895752\n            ]\n        }\n    ],\n    \"samplers\" : [\n        {}\n    ],\n    \"scene\" : 0,\n    \"scenes\" : [\n        {\n            \"name\" : \"Scene\",\n            \"nodes\" : [\n                0\n            ]\n        }\n    ],\n    \"textures\" : [\n        {\n            \"sampler\" : 0,\n            \"source\" : 0\n        },\n        {\n            \"sampler\" : 0,\n            \"source\" : 1\n        },\n        {\n            \"sampler\" : 0,\n            \"source\" : 2\n        },\n        {\n            \"sampler\" : 0,\n            \"source\" : 3\n        },\n        {\n            \"sampler\" : 0,\n            \"source\" : 4\n        }\n    ]\n}\n"
  },
  {
    "path": "examples/resources/models/gltf/DragonAttenuation/DragonAttenuation.gltf",
    "content": "{\n\t\"asset\":{\n\t\t\"generator\":\"Khronos glTF Blender I/O v3.6.28\",\n\t\t\"version\":\"2.0\"\n\t},\n\t\"extensionsUsed\":[\n\t\t\"KHR_materials_transmission\",\n\t\t\"KHR_materials_volume\",\n\t\t\"KHR_materials_variants\"\n\t],\n\t\"extensionsRequired\":[\n\t\t\"KHR_materials_variants\"\n\t],\n\t\"extensions\":{\n\t\t\"KHR_materials_variants\":{\n\t\t\t\"variants\":[\n\t\t\t\t{\n\t\t\t\t\t\"name\":\"Attenuation\"\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t\"name\":\"Surface Color\"\n\t\t\t\t}\n\t\t\t]\n\t\t}\n\t},\n\t\"scene\":0,\n\t\"scenes\":[\n\t\t{\n\t\t\t\"name\":\"Scene\",\n\t\t\t\"nodes\":[\n\t\t\t\t0,\n\t\t\t\t1\n\t\t\t]\n\t\t}\n\t],\n\t\"nodes\":[\n\t\t{\n\t\t\t\"mesh\":0,\n\t\t\t\"name\":\"Cloth Backdrop\",\n\t\t\t\"scale\":[\n\t\t\t\t3.5,\n\t\t\t\t3.5,\n\t\t\t\t3.5\n\t\t\t],\n\t\t\t\"translation\":[\n\t\t\t\t-0.15470129251480103,\n\t\t\t\t-0.841584324836731,\n\t\t\t\t-0.1703687310218811\n\t\t\t]\n\t\t},\n\t\t{\n\t\t\t\"mesh\":1,\n\t\t\t\"name\":\"Dragon\",\n\t\t\t\"rotation\":[\n\t\t\t\t0.70710688829422,\n\t\t\t\t0,\n\t\t\t\t0,\n\t\t\t\t0.7071066498756409\n\t\t\t],\n\t\t\t\"scale\":[\n\t\t\t\t0.25,\n\t\t\t\t0.2500000298023224,\n\t\t\t\t0.2500000298023224\n\t\t\t],\n\t\t\t\"translation\":[\n\t\t\t\t0,\n\t\t\t\t-0.7306479811668396,\n\t\t\t\t0\n\t\t\t]\n\t\t}\n\t],\n\t\"materials\":[\n\t\t{\n\t\t\t\"name\":\"Cloth Backdrop\",\n\t\t\t\"pbrMetallicRoughness\":{\n\t\t\t\t\"baseColorTexture\":{\n\t\t\t\t\t\"index\":0\n\t\t\t\t},\n\t\t\t\t\"metallicFactor\":0,\n\t\t\t\t\"roughnessFactor\":0.4934999942779541\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t\"doubleSided\":false,\n\t\t\t\"extensions\":{\n\t\t\t\t\"KHR_materials_transmission\":{\n\t\t\t\t\t\"transmissionFactor\":1\n\t\t\t\t},\n\t\t\t\t\"KHR_materials_volume\":{\n\t\t\t\t\t\"attenuationColor\":[\n\t\t\t\t\t\t0.9210000038146973,\n\t\t\t\t\t\t0.6399999856948853,\n\t\t\t\t\t\t0.06400000303983688\n\t\t\t\t\t],\n\t\t\t\t\t\"attenuationDistance\":0.1549999988913536,\n\t\t\t\t\t\"thicknessFactor\":2.2699999809265137,\n\t\t\t\t\t\"thicknessTexture\":{\n\t\t\t\t\t\t\"index\":1\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\t\t\t\"name\":\"Dragon with Attenuation\",\n\t\t\t\"pbrMetallicRoughness\":{\n\t\t\t\t\"metallicFactor\":0,\n\t\t\t\t\"roughnessFactor\":0\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t\"doubleSided\":false,\n\t\t\t\"extensions\":{\n\t\t\t\t\"KHR_materials_transmission\":{\n\t\t\t\t\t\"transmissionFactor\":1\n\t\t\t\t},\n\t\t\t\t\"KHR_materials_volume\":{\n\t\t\t\t\t\"attenuationColor\":[\n\t\t\t\t\t\t1,\n\t\t\t\t\t\t1,\n\t\t\t\t\t\t1\n\t\t\t\t\t],\n\t\t\t\t\t\"thicknessFactor\":2.2699999809265137,\n\t\t\t\t\t\"thicknessTexture\":{\n\t\t\t\t\t\t\"index\":2\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\t\t\t\"name\":\"Dragon with Surface Coloring Only\",\n\t\t\t\"pbrMetallicRoughness\":{\n\t\t\t\t\"baseColorFactor\":[\n\t\t\t\t\t0.9210000038146973,\n\t\t\t\t\t0.6399999856948853,\n\t\t\t\t\t0.06400000303983688,\n\t\t\t\t\t1\n\t\t\t\t],\n\t\t\t\t\"metallicFactor\":0,\n\t\t\t\t\"roughnessFactor\":0\n\t\t\t}\n\t\t}\n\t],\n\t\"meshes\":[\n\t\t{\n\t\t\t\"name\":\"Cloth Backdrop\",\n\t\t\t\"primitives\":[\n\t\t\t\t{\n\t\t\t\t\t\"attributes\":{\n\t\t\t\t\t\t\"POSITION\":0,\n\t\t\t\t\t\t\"NORMAL\":1,\n\t\t\t\t\t\t\"TEXCOORD_0\":2\n\t\t\t\t\t},\n\t\t\t\t\t\"indices\":3,\n\t\t\t\t\t\"material\":0\n\t\t\t\t}\n\t\t\t]\n\t\t},\n\t\t{\n\t\t\t\"name\":\"Dragon\",\n\t\t\t\"primitives\":[\n\t\t\t\t{\n\t\t\t\t\t\"attributes\":{\n\t\t\t\t\t\t\"POSITION\":4,\n\t\t\t\t\t\t\"NORMAL\":5,\n\t\t\t\t\t\t\"TEXCOORD_0\":6\n\t\t\t\t\t},\n\t\t\t\t\t\"extensions\":{\n\t\t\t\t\t\t\"KHR_materials_variants\":{\n\t\t\t\t\t\t\t\"mappings\":[\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"material\":1,\n\t\t\t\t\t\t\t\t\t\"variants\":[\n\t\t\t\t\t\t\t\t\t\t0\n\t\t\t\t\t\t\t\t\t]\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"material\":2,\n\t\t\t\t\t\t\t\t\t\"variants\":[\n\t\t\t\t\t\t\t\t\t\t1\n\t\t\t\t\t\t\t\t\t]\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t]\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\t\"indices\":7,\n\t\t\t\t\t\"material\":1\n\t\t\t\t}\n\t\t\t]\n\t\t}\n\t],\n\t\"textures\":[\n\t\t{\n\t\t\t\"sampler\":0,\n\t\t\t\"source\":0\n\t\t},\n\t\t{\n\t\t\t\"sampler\":0,\n\t\t\t\"source\":1\n\t\t},\n\t\t{\n\t\t\t\"sampler\":0,\n\t\t\t\"source\":1\n\t\t}\n\t],\n\t\"images\":[\n\t\t{\n\t\t\t\"mimeType\":\"image/jpeg\",\n\t\t\t\"name\":\"Image_0\",\n\t\t\t\"uri\":\"Image_0.jpg\"\n\t\t},\n\t\t{\n\t\t\t\"mimeType\":\"image/jpeg\",\n\t\t\t\"name\":\"Image_1\",\n\t\t\t\"uri\":\"Image_1.jpg\"\n\t\t}\n\t],\n\t\"accessors\":[\n\t\t{\n\t\t\t\"bufferView\":0,\n\t\t\t\"componentType\":5126,\n\t\t\t\"count\":62640,\n\t\t\t\"max\":[\n\t\t\t\t0.9809443354606628,\n\t\t\t\t1.0221298933029175,\n\t\t\t\t1.4283748865127563\n\t\t\t],\n\t\t\t\"min\":[\n\t\t\t\t-0.8216659426689148,\n\t\t\t\t0.0015843699220567942,\n\t\t\t\t-0.46063709259033203\n\t\t\t],\n\t\t\t\"type\":\"VEC3\"\n\t\t},\n\t\t{\n\t\t\t\"bufferView\":1,\n\t\t\t\"componentType\":5126,\n\t\t\t\"count\":62640,\n\t\t\t\"type\":\"VEC3\"\n\t\t},\n\t\t{\n\t\t\t\"bufferView\":2,\n\t\t\t\"componentType\":5126,\n\t\t\t\"count\":62640,\n\t\t\t\"type\":\"VEC2\"\n\t\t},\n\t\t{\n\t\t\t\"bufferView\":3,\n\t\t\t\"componentType\":5123,\n\t\t\t\"count\":131337,\n\t\t\t\"type\":\"SCALAR\"\n\t\t},\n\t\t{\n\t\t\t\"bufferView\":4,\n\t\t\t\"componentType\":5126,\n\t\t\t\"count\":76809,\n\t\t\t\"max\":[\n\t\t\t\t7.0467000007629395,\n\t\t\t\t3.1512999534606934,\n\t\t\t\t0\n\t\t\t],\n\t\t\t\"min\":[\n\t\t\t\t-7.0467000007629395,\n\t\t\t\t-3.1512999534606934,\n\t\t\t\t-9.939900398254395\n\t\t\t],\n\t\t\t\"type\":\"VEC3\"\n\t\t},\n\t\t{\n\t\t\t\"bufferView\":5,\n\t\t\t\"componentType\":5126,\n\t\t\t\"count\":76809,\n\t\t\t\"type\":\"VEC3\"\n\t\t},\n\t\t{\n\t\t\t\"bufferView\":6,\n\t\t\t\"componentType\":5126,\n\t\t\t\"count\":76809,\n\t\t\t\"type\":\"VEC2\"\n\t\t},\n\t\t{\n\t\t\t\"bufferView\":7,\n\t\t\t\"componentType\":5125,\n\t\t\t\"count\":273648,\n\t\t\t\"type\":\"SCALAR\"\n\t\t}\n\t],\n\t\"bufferViews\":[\n\t\t{\n\t\t\t\"buffer\":0,\n\t\t\t\"byteLength\":751680,\n\t\t\t\"byteOffset\":0,\n\t\t\t\"target\":34962\n\t\t},\n\t\t{\n\t\t\t\"buffer\":0,\n\t\t\t\"byteLength\":751680,\n\t\t\t\"byteOffset\":751680,\n\t\t\t\"target\":34962\n\t\t},\n\t\t{\n\t\t\t\"buffer\":0,\n\t\t\t\"byteLength\":501120,\n\t\t\t\"byteOffset\":1503360,\n\t\t\t\"target\":34962\n\t\t},\n\t\t{\n\t\t\t\"buffer\":0,\n\t\t\t\"byteLength\":262674,\n\t\t\t\"byteOffset\":2004480,\n\t\t\t\"target\":34963\n\t\t},\n\t\t{\n\t\t\t\"buffer\":0,\n\t\t\t\"byteLength\":921708,\n\t\t\t\"byteOffset\":2267156,\n\t\t\t\"target\":34962\n\t\t},\n\t\t{\n\t\t\t\"buffer\":0,\n\t\t\t\"byteLength\":921708,\n\t\t\t\"byteOffset\":3188864,\n\t\t\t\"target\":34962\n\t\t},\n\t\t{\n\t\t\t\"buffer\":0,\n\t\t\t\"byteLength\":614472,\n\t\t\t\"byteOffset\":4110572,\n\t\t\t\"target\":34962\n\t\t},\n\t\t{\n\t\t\t\"buffer\":0,\n\t\t\t\"byteLength\":1094592,\n\t\t\t\"byteOffset\":4725044,\n\t\t\t\"target\":34963\n\t\t}\n\t],\n\t\"samplers\":[\n\t\t{\n\t\t\t\"magFilter\":9729,\n\t\t\t\"minFilter\":9987\n\t\t}\n\t],\n\t\"buffers\":[\n\t\t{\n\t\t\t\"byteLength\":5819636,\n\t\t\t\"uri\":\"DragonAttenuation.bin\"\n\t\t}\n\t]\n}\n"
  },
  {
    "path": "examples/resources/models/gltf/Duck/README.md",
    "content": "# Duck\n## Screenshot\n\n![screenshot](screenshot/screenshot.png)\n\n## License Information\n\nCopyright 2006 Sony Computer Entertainment Inc.\n\nLicensed under the SCEA Shared Source License, Version 1.0 (the \"License\"); you may not use this file except in compliance with the License. You may obtain a copy of the License at:\n\nhttp://research.scea.com/scea_shared_source_license.html\n\nUnless required by applicable law or agreed to in writing, software distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License."
  },
  {
    "path": "examples/resources/models/gltf/Duck/glTF/Duck.gltf",
    "content": "{\n    \"asset\": {\n        \"generator\": \"COLLADA2GLTF\",\n        \"version\": \"2.0\"\n    },\n    \"scene\": 0,\n    \"scenes\": [\n        {\n            \"nodes\": [\n                0\n            ]\n        }\n    ],\n    \"nodes\": [\n        {\n            \"children\": [\n                2,\n                1\n            ],\n            \"matrix\": [\n                0.009999999776482582,\n                0.0,\n                0.0,\n                0.0,\n                0.0,\n                0.009999999776482582,\n                0.0,\n                0.0,\n                0.0,\n                0.0,\n                0.009999999776482582,\n                0.0,\n                0.0,\n                0.0,\n                0.0,\n                1.0\n            ]\n        },\n        {\n            \"matrix\": [\n                -0.7289686799049377,\n                0.0,\n                -0.6845470666885376,\n                0.0,\n                -0.4252049028873444,\n                0.7836934328079224,\n                0.4527972936630249,\n                0.0,\n                0.5364750623703003,\n                0.6211478114128113,\n                -0.571287989616394,\n                0.0,\n                400.1130065917969,\n                463.2640075683594,\n                -431.0780334472656,\n                1.0\n            ],\n            \"camera\": 0\n        },\n        {\n            \"mesh\": 0\n        }\n    ],\n    \"cameras\": [\n        {\n            \"perspective\": {\n                \"aspectRatio\": 1.5,\n                \"yfov\": 0.6605925559997559,\n                \"zfar\": 10000.0,\n                \"znear\": 1.0\n            },\n            \"type\": \"perspective\"\n        }\n    ],\n    \"meshes\": [\n        {\n            \"primitives\": [\n                {\n                    \"attributes\": {\n                        \"NORMAL\": 1,\n                        \"POSITION\": 2,\n                        \"TEXCOORD_0\": 3\n                    },\n                    \"indices\": 0,\n                    \"mode\": 4,\n                    \"material\": 0\n                }\n            ],\n            \"name\": \"LOD3spShape\"\n        }\n    ],\n    \"accessors\": [\n        {\n            \"bufferView\": 0,\n            \"byteOffset\": 0,\n            \"componentType\": 5123,\n            \"count\": 12636,\n            \"max\": [\n                2398\n            ],\n            \"min\": [\n                0\n            ],\n            \"type\": \"SCALAR\"\n        },\n        {\n            \"bufferView\": 1,\n            \"byteOffset\": 0,\n            \"componentType\": 5126,\n            \"count\": 2399,\n            \"max\": [\n                0.9995989799499512,\n                0.999580979347229,\n                0.9984359741210938\n            ],\n            \"min\": [\n                -0.9990839958190918,\n                -1.0,\n                -0.9998319745063782\n            ],\n            \"type\": \"VEC3\"\n        },\n        {\n            \"bufferView\": 1,\n            \"byteOffset\": 28788,\n            \"componentType\": 5126,\n            \"count\": 2399,\n            \"max\": [\n                96.17990112304688,\n                163.97000122070313,\n                53.92519760131836\n            ],\n            \"min\": [\n                -69.29850006103516,\n                9.929369926452637,\n                -61.32819747924805\n            ],\n            \"type\": \"VEC3\"\n        },\n        {\n            \"bufferView\": 2,\n            \"byteOffset\": 0,\n            \"componentType\": 5126,\n            \"count\": 2399,\n            \"max\": [\n                0.9833459854125976,\n                0.9800369739532472\n            ],\n            \"min\": [\n                0.026409000158309938,\n                0.01996302604675293\n            ],\n            \"type\": \"VEC2\"\n        }\n    ],\n    \"materials\": [\n        {\n            \"pbrMetallicRoughness\": {\n                \"baseColorTexture\": {\n                    \"index\": 0\n                },\n                \"metallicFactor\": 0.0\n            },\n            \"emissiveFactor\": [\n                0.0,\n                0.0,\n                0.0\n            ],\n            \"name\": \"blinn3-fx\"\n        }\n    ],\n    \"textures\": [\n        {\n            \"sampler\": 0,\n            \"source\": 0\n        }\n    ],\n    \"images\": [\n        {\n            \"uri\": \"DuckCM.png\"\n        }\n    ],\n    \"samplers\": [\n        {\n            \"magFilter\": 9729,\n            \"minFilter\": 9986,\n            \"wrapS\": 10497,\n            \"wrapT\": 10497\n        }\n    ],\n    \"bufferViews\": [\n        {\n            \"buffer\": 0,\n            \"byteOffset\": 76768,\n            \"byteLength\": 25272,\n            \"target\": 34963\n        },\n        {\n            \"buffer\": 0,\n            \"byteOffset\": 0,\n            \"byteLength\": 57576,\n            \"byteStride\": 12,\n            \"target\": 34962\n        },\n        {\n            \"buffer\": 0,\n            \"byteOffset\": 57576,\n            \"byteLength\": 19192,\n            \"byteStride\": 8,\n            \"target\": 34962\n        }\n    ],\n    \"buffers\": [\n        {\n            \"byteLength\": 102040,\n            \"uri\": \"Duck0.bin\"\n        }\n    ]\n}\n"
  },
  {
    "path": "examples/resources/models/gltf/Duck/glTF-Draco/Duck.gltf",
    "content": "{\n  \"asset\": {\n    \"generator\": \"COLLADA2GLTF\",\n    \"version\": \"2.0\"\n  },\n  \"scene\": 0,\n  \"scenes\": [\n    {\n      \"nodes\": [\n        0\n      ]\n    }\n  ],\n  \"nodes\": [\n    {\n      \"children\": [\n        2,\n        1\n      ],\n      \"matrix\": [\n        0.009999999776482582,\n        0,\n        0,\n        0,\n        0,\n        0.009999999776482582,\n        0,\n        0,\n        0,\n        0,\n        0.009999999776482582,\n        0,\n        0,\n        0,\n        0,\n        1\n      ]\n    },\n    {\n      \"matrix\": [\n        -0.7289686799049377,\n        0,\n        -0.6845470666885376,\n        0,\n        -0.4252049028873444,\n        0.7836934328079224,\n        0.4527972936630249,\n        0,\n        0.5364750623703003,\n        0.6211478114128113,\n        -0.571287989616394,\n        0,\n        400.1130065917969,\n        463.2640075683594,\n        -431.0780334472656,\n        1\n      ],\n      \"camera\": 0\n    },\n    {\n      \"mesh\": 0\n    }\n  ],\n  \"cameras\": [\n    {\n      \"perspective\": {\n        \"aspectRatio\": 1.5,\n        \"yfov\": 0.6605925559997559,\n        \"zfar\": 10000,\n        \"znear\": 1\n      },\n      \"type\": \"perspective\"\n    }\n  ],\n  \"meshes\": [\n    {\n      \"primitives\": [\n        {\n          \"attributes\": {\n            \"NORMAL\": 1,\n            \"POSITION\": 2,\n            \"TEXCOORD_0\": 3\n          },\n          \"indices\": 0,\n          \"mode\": 4,\n          \"material\": 0,\n          \"extensions\": {\n            \"KHR_draco_mesh_compression\": {\n              \"bufferView\": 0,\n              \"attributes\": {\n                \"NORMAL\": 0,\n                \"POSITION\": 1,\n                \"TEXCOORD_0\": 2\n              }\n            }\n          }\n        }\n      ],\n      \"name\": \"LOD3spShape\"\n    }\n  ],\n  \"accessors\": [\n    {\n      \"componentType\": 5123,\n      \"count\": 12636,\n      \"max\": [\n        2398\n      ],\n      \"min\": [\n        0\n      ],\n      \"type\": \"SCALAR\"\n    },\n    {\n      \"componentType\": 5126,\n      \"count\": 2399,\n      \"max\": [\n        0.9995989799499512,\n        0.999580979347229,\n        0.9984359741210938\n      ],\n      \"min\": [\n        -0.9990839958190918,\n        -1,\n        -0.9998319745063782\n      ],\n      \"type\": \"VEC3\"\n    },\n    {\n      \"componentType\": 5126,\n      \"count\": 2399,\n      \"max\": [\n        96.17990112304688,\n        163.97000122070312,\n        53.92519760131836\n      ],\n      \"min\": [\n        -69.29850006103516,\n        9.929369926452637,\n        -61.32819747924805\n      ],\n      \"type\": \"VEC3\"\n    },\n    {\n      \"componentType\": 5126,\n      \"count\": 2399,\n      \"max\": [\n        0.9833459854125975,\n        0.9800369739532472\n      ],\n      \"min\": [\n        0.026409000158309937,\n        0.01996302604675293\n      ],\n      \"type\": \"VEC2\"\n    }\n  ],\n  \"materials\": [\n    {\n      \"pbrMetallicRoughness\": {\n        \"baseColorTexture\": {\n          \"index\": 0\n        },\n        \"metallicFactor\": 0\n      },\n      \"emissiveFactor\": [\n        0,\n        0,\n        0\n      ],\n      \"name\": \"blinn3-fx\"\n    }\n  ],\n  \"textures\": [\n    {\n      \"sampler\": 0,\n      \"source\": 0\n    }\n  ],\n  \"images\": [\n    {\n      \"uri\": \"DuckCM.png\"\n    }\n  ],\n  \"samplers\": [\n    {\n      \"magFilter\": 9729,\n      \"minFilter\": 9986,\n      \"wrapS\": 10497,\n      \"wrapT\": 10497\n    }\n  ],\n  \"bufferViews\": [\n    {\n      \"buffer\": 0,\n      \"byteOffset\": 0,\n      \"byteLength\": 18884\n    }\n  ],\n  \"buffers\": [\n    {\n      \"byteLength\": 18884,\n      \"uri\": \"0.bin\"\n    }\n  ],\n  \"extensionsRequired\": [\n    \"KHR_draco_mesh_compression\"\n  ],\n  \"extensionsUsed\": [\n    \"KHR_draco_mesh_compression\"\n  ]\n}\n"
  },
  {
    "path": "examples/resources/models/gltf/Duck/glTF-Embedded/Duck.gltf",
    "content": "{\n    \"asset\": {\n        \"generator\": \"COLLADA2GLTF\",\n        \"version\": \"2.0\"\n    },\n    \"scene\": 0,\n    \"scenes\": [\n        {\n            \"nodes\": [\n                0\n            ]\n        }\n    ],\n    \"nodes\": [\n        {\n            \"children\": [\n                2,\n                1\n            ],\n            \"matrix\": [\n                0.009999999776482582,\n                0.0,\n                0.0,\n                0.0,\n                0.0,\n                0.009999999776482582,\n                0.0,\n                0.0,\n                0.0,\n                0.0,\n                0.009999999776482582,\n                0.0,\n                0.0,\n                0.0,\n                0.0,\n                1.0\n            ]\n        },\n        {\n            \"matrix\": [\n                -0.7289686799049377,\n                0.0,\n                -0.6845470666885376,\n                0.0,\n                -0.4252049028873444,\n                0.7836934328079224,\n                0.4527972936630249,\n                0.0,\n                0.5364750623703003,\n                0.6211478114128113,\n                -0.571287989616394,\n                0.0,\n                400.1130065917969,\n                463.2640075683594,\n                -431.0780334472656,\n                1.0\n            ],\n            \"camera\": 0\n        },\n        {\n            \"mesh\": 0\n        }\n    ],\n    \"cameras\": [\n        {\n            \"perspective\": {\n                \"aspectRatio\": 1.5,\n                \"yfov\": 0.6605925559997559,\n                \"zfar\": 10000.0,\n                \"znear\": 1.0\n            },\n            \"type\": \"perspective\"\n        }\n    ],\n    \"meshes\": [\n        {\n            \"primitives\": [\n                {\n                    \"attributes\": {\n                        \"NORMAL\": 1,\n                        \"POSITION\": 2,\n                        \"TEXCOORD_0\": 3\n                    },\n                    \"indices\": 0,\n                    \"mode\": 4,\n                    \"material\": 0\n                }\n            ],\n            \"name\": \"LOD3spShape\"\n        }\n    ],\n    \"accessors\": [\n        {\n            \"bufferView\": 0,\n            \"byteOffset\": 0,\n            \"componentType\": 5123,\n            \"count\": 12636,\n            \"max\": [\n                2398\n            ],\n            \"min\": [\n                0\n            ],\n            \"type\": \"SCALAR\"\n        },\n        {\n            \"bufferView\": 1,\n            \"byteOffset\": 0,\n            \"componentType\": 5126,\n            \"count\": 2399,\n            \"max\": [\n                0.9995989799499512,\n                0.999580979347229,\n                0.9984359741210938\n            ],\n            \"min\": [\n                -0.9990839958190918,\n                -1.0,\n                -0.9998319745063782\n            ],\n            \"type\": \"VEC3\"\n        },\n        {\n            \"bufferView\": 1,\n            \"byteOffset\": 28788,\n            \"componentType\": 5126,\n            \"count\": 2399,\n            \"max\": [\n                96.17990112304688,\n                163.97000122070313,\n                53.92519760131836\n            ],\n            \"min\": [\n                -69.29850006103516,\n                9.929369926452637,\n                -61.32819747924805\n            ],\n            \"type\": \"VEC3\"\n        },\n        {\n            \"bufferView\": 2,\n            \"byteOffset\": 0,\n            \"componentType\": 5126,\n            \"count\": 2399,\n            \"max\": [\n                0.9833459854125976,\n                0.9800369739532472\n            ],\n            \"min\": [\n                0.026409000158309938,\n                0.01996302604675293\n            ],\n            \"type\": \"VEC2\"\n        }\n    ],\n    \"materials\": [\n        {\n            \"pbrMetallicRoughness\": {\n                \"baseColorTexture\": {\n                    \"index\": 0\n                },\n                \"metallicFactor\": 0.0\n            },\n            \"emissiveFactor\": [\n                0.0,\n                0.0,\n                0.0\n            ],\n            \"name\": \"blinn3-fx\"\n        }\n    ],\n    \"textures\": [\n        {\n            \"sampler\": 0,\n            \"source\": 0\n        }\n    ],\n    \"images\": [\n        {\n            \"uri\": \"data:image/png;base64,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\"\n        }\n    ],\n    \"samplers\": [\n        {\n            \"magFilter\": 9729,\n            \"minFilter\": 9986,\n            \"wrapS\": 10497,\n            \"wrapT\": 10497\n        }\n    ],\n    \"bufferViews\": [\n        {\n            \"buffer\": 0,\n            \"byteOffset\": 76768,\n            \"byteLength\": 25272,\n            \"target\": 34963\n        },\n        {\n            \"buffer\": 0,\n            \"byteOffset\": 0,\n            \"byteLength\": 57576,\n            \"byteStride\": 12,\n            \"target\": 34962\n        },\n        {\n            \"buffer\": 0,\n            \"byteOffset\": 57576,\n            \"byteLength\": 19192,\n            \"byteStride\": 8,\n            \"target\": 34962\n        }\n    ],\n    \"buffers\": [\n        {\n            \"byteLength\": 102040,\n            \"uri\": \"data:application/octet-stream;base64,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WwBcAFQAUwBdAF0AUwBeAF8AYABhAGEAYABiAGAAUwBiAGIAUwBVAFMAYABeAF4AYABjAGAAXwBjAGMAXwBkAGUAZgBkAGQAZgBjAGYAZwBjAGMAZwBeAGcAZgBoAGgAZgBpAGYAZQBpAGkAZQBqAGsAbABtAG0AbABuAG4AbABvAG8AbABwAGwAZQBwAHAAZQBkAGwAawBlAGUAawBqAHEAGAAjACMAGAAUABgAcQAZABkAcQByAHEAcwByAHIAcwB0AHMAcQAlACUAcQAjAHUAdgB3AHcAdgB4AHYAeQB4AHgAeQB6ACQAewAlACUAewB8AHsAfQB8AHwAfQB+AH0AewB/AH8AewCAAHsAJACAAIAAJAAmAHMAgQB0AHQAgQCCAIEAgwCCAIIAgwCEAIMAgQB+AH4AgQB8AIEAcwB8AHwAcwAlAIUAhgCHAIcAhgCIAHkAhQB6AHoAhQCHAIkAigCLAIsAigCMAI0AjgBNAE0AjgBMAI4AjwBMAEwAjwBBAJAAkQCSAJIAkQCTAJEAlACTAJMAlACVAJYAlwCYAJgAlwCZAJcAOwCZAJkAOwA9AJoAmwBJAEkAmwBHAJsAnABHAEcAnABIAJwAmwCWAJYAmwCXAJsAmgCXAJcAmgA7AEAAnQA9AD0AnQCZAJ0AngCZAJkAngCYAJ8AUgBGAEYAUgBFAEYASACfAJ8ASACgAKEAogBcAFwAogBaAKIAowBaAFoAowBZAKMAogCVAJUAogCTAKIAoQCTAJMAoQCSAKQApQCmAKYApQCnAKUAqACnAKcAqACpAKgApQBvAG8ApQBuAKUApABuAG4ApABtAKoAqwChAKEAqwCSAKwArQBoAGgArQBnAK0AXQBnAGcAXQBeAFsAqgBcAFwAqgChAHAArgBvAG8ArgCoAKgArgCpAKkArgCvAK4AXwCvAK8AXwBhAF8ArgBkAGQArgBwAJ4AsACYAJgAsACxALAAsgCxALEAsgCzALQAtQC2ALYAtQCgALUAtAC3ALcAtAC4ALQAuQC4ALgAuQC6ALkAtACWAJYAtAC2ALoAuQCzALMAuQCxALEAuQCYAJgAuQCWALUAuwCgAKAAuwCfALsAvACfAJ8AvABSALwAuwC9AL0AuwC+ALsAtQC+AL4AtQC3AL8AwAAPAA8AwAAOAMEAwgDDAMMAwgDEAMIAvwDEAMQAvwAPAMUAxgADAAMAxgACAMAAxwAOAA4AxwAbAMgAyQDEAMQAyQDDAMkAyADKAMoAyADLAMgACgDLAMsACgAMAAoAyAAPAA8AyADEAMYAzAACAAIAzAARAMwAzQARABEAzQAVAM4AzwDQANAAzwDRAM8A0gDRANEA0gDTANQA1QDWANYA1QDXANUA1ADYANgA1ADZANIA2gDTANMA2gDbANsA2gDcANwA2gDdAN4A3wDgAOAA3wDhAN8A1gDhAOEA1gDXAOIA4wDdAN0A4wDcAOMA4gDkAOQA4gDlAOYA5wDoAOgA5wDpAOcA3gDpAOkA3gDgAOoAmgDrAOsAmgBJAJoA6gA7ADsA6gA8AOoA7AA8ADwA7AA1AJwAtgBIAEgAtgCgALYAnACWAOwA7QA1ADUA7QA2AO0A7gA2ADYA7gAvAO4A7wAvAC8A7wAwADAA7wArACsA7wDwAPEAKgDwAPAAKgArACoA8QAfAB8A8QDyAPMA9ADLAMsA9ADKAPMAHQDyAPIAHQAfAB0A8wAMAAwA8wDLAM0A9QAVABUA9QAiAPUA9gAiACIA9gAmAPYA9wAmACYA9wCAAPcA+ACAAIAA+AB/APkA+gD7APsA+gD8APgA+QB/AH8A+QD7AP0A/gD6APoA/gD8AP4A/QD/AP8A/QCJAAABAQGGAIYAAQGIAAIBAwEAAQABAwEBAYsAjwCJAIkAjwD/AAQBQgCLAEIAQQCLAIsAQQCPAAUBBgH3APcABgH4AAcBCAEJAQkBCAEKAQsBBwEMAQwBBwEJAQ0BBQH2APYABQH3AA4BDwH5APkADwH6ABABEQESARIBEQETAQgBEAEKAQoBEAESAQYBDgH4APgADgH5APMAFAH0APQAFAEVARYBFwEYARgBFwEZARoBGwEcARwBGwEdARQB8wAeAR4B8wDyAB8BDQH1APUADQH2ACABCwEhASEBCwEMAfEAIgHyAPIAIgEeARwBHQEjASMBHQEkASMBJAElASUBJAEmASIB8QAnAScB8QDwAO8AKAHwAPAAKAEnASUBJgEpASkBJgEqASsBKQEsASwBKQEqAS0BKAHuAO4AKAHvAC4BLwHqAOoALwHsADABMQEyATIBMQEzATQBNQE2ATYBNQE3ATgBLgHrAOsALgHqADkBLQHtAO0ALQHuADoBKwE7ATsBKwEsATEBOgEzATMBOgE7AS8BOQHsAOwAOQHtAP0APAGJAIkAPAGKAD0BPgE/AT8BPgFAAT8BQAERAREBQAETATwB/QAPAQ8B/QD6AEEBQgE9AT0BQgE+AUMBRAFBAUEBRAFCAUUBRgF6AHoARgF4AHcAeABHAUcBeABGAUgBSQGIAIgASQGHAHoAhwBFAUUBhwBJAUoBzgBLAUsBzgDQANkATAHYANgATAFNAUcBTgF3AHcATgF1ANgATQHVANUATQFPAdUATwHXANcATwFQAdcAUAHhAOEAUAFRAeAA4QBSAVIB4QBRAVMBVAHoAOgAVAHmAOQA5QBVAVUB5QBWAVIBVwHgAOAAVwHpAOgA6QBTAVMB6QBXAVgBAQFZAVkBAQEDAUgBiABYAVgBiAABAVkBAwFaAVoBAwECAVoBAgFbAVsBAgFcAVwB5ABbAVsB5ABVAQABXQECAQIBXQFcAeMAXQHcANwAXQFeAV8BXgGFAIUAXgGGAF8BYAHbANsAYAHTAGEBYAF2AHYAYAF5AGEBYgHRANEAYgHQAGIBdQBjAWMBdQBOAWIBYwHQANAAYwFLAWQBIAFlAWUBIAEhAWYBZwEVARUBZwH0AGcBaAH0APQAaAHKAGkBaAHMAMwAaAHNAMkAaQHDAMMAaQFqAWsBagHFAMUAagHGABABCAFJAUkBCAFFAREBEAFIAUgBEAFJAQsBIAFHAUcBIAFOAQgBBwFFAUUBBwFGAQcBCwFGAUYBCwFHAVgBPwFIAUgBPwERAT8BWAE9AT0BWAFZASABZAFOAU4BZAFjARcBFgFlAWUBFgFkAU8BIwFQAVABIwElASMBTwEcARwBTwFNARgBSgEWARYBSgFLAUwBGgFNAU0BGgEcASkBUQElASUBUQFQASkBKwFRAVEBKwFSASsBOgFSAVIBOgFXAToBMQFXAVcBMQFTAUMBNAFEAUQBNAE2ATQBQwFVAVUBQwFbATEBMAFTAVMBMAFUATUBNAFWAVYBNAFVAVoBQQFZAVkBQQE9ARoAbAEcABwAbAFtAWwBGgBuAW4BGgAbACcAbwEoACgAbwFwAW8BJwBtAW0BJwAcAC0AcQEuAC4AcQFyAXEBLQBwAXABLQAoAHMBdAEzADMAdAE0AHIBcwEuAC4AcwEzAHUBdgE5ADkAdgE6AHQBdQE0ADQAdQE5AHcBeAE/AD8AeAFAAHYBdwE6ADoAdwE/AHkBegGdAJ0AegGeAJ0AQAB5AXkBQAB4AXsBfAGwALAAfAGyALAAngB7AXsBngB6AccAfQEbABsAfQFuAX4BUAC8ALwAUABSAFAAfgFRAFEAfgF/AX4BgAF/AX8BgAGBAX4BvACAAYABvAC9AIIBgwG9AL0AgwGAAYMBhAGAAYABhAGBAYQBgwGFAYUBgwGGAYMBggGGAYYBggGHAYgBiQG3ALcAiQG+AIkBggG+AL4AggG9AIIBiQGHAYcBiQGKAYkBiAGKAYoBiAGLAYwBiAG4ALgAiAG3AIgBjAGLAYsBjAGNAY0BjAGOAY4BjAGPAYwBuACPAY8BuAC6AI4BjwGQAZABjwGRAY8BugCRAZEBugCzALIAkgGzALMAkgGRAZEBkgGQAZABkgGTAXwBlAGyALIAlAGSAZQBlQGSAZIBlQGTAYsAjAAEAQQBjACWAQQB6wBCAEIA6wBJAJYBOAEEAQQBOAHrAGoBawHDAMMAawHBAGoBaQHGAMYAaQHMAMoAaAHJAMkAaAFpAWgBZwHNAM0AZwH1APUAZwEfAR8BZwFmAWMBZAFLAUsBZAEWAWIBYQF1AHUAYQF2AGABYQHTANMAYQHRAGABXwF5AHkAXwGFANwAXgHbANsAXgFfAYYAXgEAAQABXgFdAeQAXAHjAOMAXAFdAVsBQwFaAVoBQwFBAQgACQCXAZcBCQCYAQkAFwCYAZgBFwCZARcAGQCZAZkBGQCaAWwBmwFtAW0BmwGcAW4BnQFsAWwBnQGbAW8BngFwAXABngGfAW8BbQGeAZ4BbQGcAXEBoAFyAXIBoAGhAXABnwFxAXEBnwGgAXMBogF0AXQBogGjAXIBoQFzAXMBoQGiAXUBpAF2AXYBpAGlAXQBowF1AXUBowGkAXgBdwGmAaYBdwGnAXYBpQF3AXcBpQGnAagBqQGqAaoBqQGrAawBrQGoAagBrQGpAa4BrwGsAawBrwGtAVUAVgCwAbABVgCxAbIBswG0AbQBswG1AWEAYgC2AbYBYgC3AWIAVQC3AbcBVQCwARkAcgCaAZoBcgC4AbkBugG7AbsBugG8Ab0BvgG/Ab8BvgHAAaoBqwHBAcEBqwHCAXkBwwF6AXoBwwHEAXgBpgF5AXkBpgHDAcUBxgG1AbUBxgG0Ab8BwAHFAcUBwAHGAaYApwDHAccBpwDIAacAqQDIAcgBqQDJAakArwDJAckBrwDKAa8AYQDKAcoBYQC2AXsBywF8AXwBywHMAXoBxAF7AXsBxAHLAc0BzgGuAa4BzgGvAc8B0AHNAc0B0AHOAX0B0QFuAW4B0QGdAdIB0wHPAc8B0wHQAdQB1QHSAdIB1QHTAZUBlAHWAdYBlAHXAZQBfAHXAdcBfAHMAdgB2QHaAdoB2QHbAdwB2AHdAd0B2AHaAd4B3AHfAd8B3AHdAeAB3gHhAeEB3gHfAeIB4wHkAeQB4wHlAeMB5gHlAeUB5gHnAdkB2AHoAegB2AHpAdgB3AHpAekB3AHqAesB7AHqAeoB7AHpAewB7QHpAekB7QHoAdwB3gHqAeoB3gHuAd4B4AHuAe4B4AHvAfAB8QHvAe8B8QHuAfEB6wHuAe4B6wHqAeYB4wHyAfIB4wHzAeMB4gHzAfMB4gH0AfUB9gH3AfcB9gH4AfYB4gH4AfgB4gHkAe0B7AH5AfkB7AH6AewB6wH6AfoB6wH7AfwB/QH7AfsB/QH6Af0B/gH6AfoB/gH5AeIB9gH0AfQB9gH/AfYB9QH/Af8B9QEAAgEC9QECAgIC9QH3AQMCAQIEAgQCAQICAvUBAQIAAgACAQIFAgECAwIFAgUCAwIGAgcCCAIJAgkCCAIKAgoCAwIJAgkCAwIEAgMCCgIGAgYCCgILAggCDAIKAgoCDAILAg0CDgIPAg8CDgIQAggCBwIQAhACBwIPAgwCCAIRAhECCAIQAg4CEgIQAhACEgIRAhMCFAIVAhUCFAIWAg4CDQIWAhYCDQIVAhICDgIXAhcCDgIWAhQCGAIWAhYCGAIXAhkCGgIbAhsCGgIcAhoCHQIcAhwCHQIeAh8CIAIeAh4CIAIcAiACIQIcAhwCIQIbAiICIwIkAiQCIwIlAiMCJgIlAiUCJgInAh0CGgInAicCGgIlAhoCGQIlAiUCGQIkAicCJgIoAigCJgIpAicCKAIdAh0CKAIqAisCLAItAi0CLAIuAi8CMAIxAjECMAIyAjMCNAIyAjICNAIxAjUCKwI2AjYCKwItAjcCOAI5AjkCOAI6AiwCKwI6AjoCKwI5AisCNQI5AjkCNQI7AjwCNwI7AjsCNwI5Aj0CPAI+Aj4CPAI7AjUCPwI7AjsCPwI+Aj8CQAI+Aj4CQAJBAkICPQJBAkECPQI+AkMCRAJFAkUCRAJGAkYCRwJFAkUCRwJIAjwCPQJIAkgCPQJFAkICQwI9Aj0CQwJFAusB8QH7AfsB8QFJAvEB8AFJAkkC8AFKAksCTAJKAkoCTAJJAkwC/AFJAkkC/AH7AU0CTgJPAk8CTgJQAlECUgJQAlACUgJPAv0B/AFTAlMC/AFUAlUCVgJUAlQCVgJTAlYCVwJTAlMCVwJYAv4B/QFYAlgC/QFTAkwCSwJZAlkCSwJaAlsCXAJaAloCXAJZAlwCVQJZAlkCVQJUAvwBTAJUAlQCTAJZAl0CXgJfAl8CXgJgAlICUQJgAmACUQJfAmECYgJjAmMCYgJkAmUCIgJmAmYCIgIkAhkCZwIkAiQCZwJmAmgCaQJqAmoCaQJrAmwCbQJrAmsCbQJqAm4CbwJwAnACbwJxAhQCEwJxAnECEwJwAnICIQJzAnMCIQIgAh8CdAIgAiACdAJzAnQCbgJzAnMCbgJwAhMCcgJwAnACcgJzAhgCFAJ1AnUCFAJxAm8CdgJxAnECdgJ1AncCHgIqAioCHgIdAngCHwJ3AncCHwIeAnkCMwJ6AnoCMwIyAjACewIyAjICewJ6AnsCbAJ6AnoCbAJrAmkCeQJrAmsCeQJ6AnwCfQJ+An4CfQJ/AoACgQJ/An8CgQJ+AoECRwJ+An4CRwJGAkQCfAJGAkYCfAJ+AnkCaQKCAoICaQKDAkACPwKEAoQCPwKFAjUCNgI/Aj8CNgKFAjQCMwKCAoICMwJ5AkcCgQJIAkgCgQKGAoECgAKGAoYCgAKHAjgCNwKHAocCNwKGAjcCPAKGAoYCPAJIAnYCbwKIAogCbwKJAooCiwKJAokCiwKIAngCjAKNAo0CjAKOAowCjwKOAo4CjwKQApACkQKOAo4CkQKSApICbgKOAo4CbgKNApECigKSApICigKJAm8CbgKJAokCbgKSAowCeAKTApMCeAJ3AioClAJ3AncClAKTApQClQKTApMClQKWAo8CjAKWApYCjAKTAuYBlwLnAecBlwKYApkCmgKbApsCmgKcAucBmAKcApwCmAKbAtkBnQLbAdsBnQKeApcC5gGfAp8C5gHyAZoCoAKcApwCoAKhAqACogKhAqECogKjAuQB5QGjAqMC5QGhAuUB5wGhAqEC5wGcAp0C2QGkAqQC2QHoAe0BpQLoAegBpQKkAqYCpwKoAqgCpwKpAqoCqwKpAqkCqwKoAqwCrQKuAq4CrQKvAq0CsAKvAq8CsAKxAqsCqgKyArICqgKzArQCtQKzArMCtQKyArYCtwK4ArgCtwK5ArkCrAK4ArgCrAKuArUCtAK6AroCtAK7ArsCvAK6AroCvAK9Ar4CvwLAAsACvwLBArcCtgLBAsECtgLAAiECcgLCAsICcgLDAnICEwLDAsMCEwIVAg0CxAIVAhUCxALDAh8CeAJ0AnQCeAKNAo0CbgJ0AsQCDQLFAsUCDQIPAgcCxgIPAg8CxgLFAsYCBwLHAscCBwIJAgkCBALHAscCBALIAgQCAgLIAsgCAgLJAgIC9wHJAskC9wHKAqICywKjAqMCywLMAvcB+AHKAsoC+AHMAvgB5AHMAswC5AGjAqUC7QHNAs0C7QH5Af4BzgL5AfkBzgLNAs4C/gHPAs8C/gFYAlcC0AJYAlgC0ALPAtEC0gLTAtMC0gLUAtACVwLUAtQCVwLTAtEC1QLSAtIC1QLWAtUC1wLWAtYC1wJkAl0C2AJeAl4C2ALZAtoC2QLbAtsC2QLYAtcCZwJkAmQCZwJjAtwCYwIbAmMCZwIbAmcCGQIbAtAC3QLPAs8C3QLeAt8C4ALhAuEC4ALiAuMC5ALfAt8C5ALgAuUCzgLeAt4CzgLPAtIC5gLUAtQC5gLnAugC6QLqAuoC6QLrAuEC4gLoAugC4gLpAt0C0ALnAucC0ALUAswCywLsAuwCywLtAu4C7wLwAvAC7wLxAvIC8wL0AvQC8wL1AsoCzAL2AvYCzALsAs4C5QLNAs0C5QL3AvgC+QLjAuMC+QLkAskCygL6AvoCygL2AvMC+wL1AvUC+wL8AvsC/QL8AvwC/QL+AsgCyQL/Av8CyQL6AscCyAIAAwADyAL/Av0CAQP+Av4CAQMCAwMDBAMBAwEDBAMCAwUDxgIAAwADxgLHAsQCBgPDAsMCBgMHAwgDCQMKAwoDCQMLAwwDDQMOAw4DDQMPAxADwgIHAwcDwgLDAsYCBQPFAsUCBQMRAxIDEwMDAwMDEwMEAwoDCwMSAxIDCwMTAwYDxAIRAxEDxALFAtYCZAIUAxQDZAJiAhUDFgMXAxcDFgMYAxYD6gIYAxgD6gLrAtIC1gLmAuYC1gIUAxkDFQMaAxoDFQMXAxsDGQMcAxwDGQMaAx0DUQIeAx4DUQJQAh4DUAIfAx8DUAJOAiADXQIhAyEDXQJfAiEDXwIdAx0DXwJRAiIDIwOmAqYCIwOnArECsAIkAyQDsAIlAx8DTgImAyYDTgJNAicDJQOtAq0CJQOwAq0CrAInAycDrAIoAykDKAO5ArkCKAOsAikDuQIqAyoDuQK3AisDvwIsAywDvwK+Ai0DvQIuAy4DvQK8AioDtwIvAy8DtwLBAi8DwQIrAysDwQK/AjADMQPYAtgCMQPbAtgCXQIwAzADXQIgAzEDMgPbAtsCMgPaAjIDMwPaAtoCMwM0Ay4DvAIzAzMDvAI0A9kC2gI1AzUD2gI0A7QCNgO7ArsCNgM1A14CNgNgAmACNgM3A6oCOAOzArMCOAM3A1ICOANPAk8COAM5A6cCOgOpAqkCOgM5AyYDTQI7AzsDTQI6AyMDOwOnAqcCOwM6A/kC+AI8AzwD+AI9A8sCPgPtAu0CPgM/A6ICQAPLAssCQAM+A6UCQAOkAqQCQANBA6ACmgJBA0EDmgJCA50CQgOeAp4CQgNDAx0D4QIhAyED4QLoAuoCIAPoAugCIAMhA+MCHwP4AvgCHwMmA+ECHQPfAt8CHQMeAx8D4wIeAx4D4wLfAjADIAMWAxYDIAPqAjEDMAMVAxUDMAMWA/gCJgM9Az0DJgM7Az0D7gI8AzwD7gLwAicDKAP7AvsCKAP9AiUDJwPzAvMCJwP7AiMDIgPuAu4CIgPvAiQDJQPyAvICJQPzAigDKQP9Av0CKQMBAyoDAwMpAykDAwMBAwMDKgMSAxIDKgMvAysDCgMvAy8DCgMSAxsDHAMMAwwDHAMNAwwDLgMbAxsDLgMzAwoDKwMIAwgDKwMsAy4DDAMtAy0DDAMOAzIDMQMZAxkDMQMVA0QD4AFFA0UD4AHhAeABRAPvAe8BRANGA0cD8AFGA0YD8AHvAfMB9AGbAZsB9AGcAfIB8wGdAZ0B8wGbAf8BAAKeAZ4BAAKfAfQB/wGcAZwB/wGeAQYCoQEFAgUCoQGgAQACBQKfAZ8BBQKgAQwCowELAgsCowGiAaEBBgKiAaIBBgILAhICpQERAhECpQGkAaMBDAKkAaQBDAIRAhgCpgEXAhcCpgGnAaUBEgKnAacBEgIXAiMCIgKpAakBIgKrASYCIwKtAa0BIwKpASYCrQEpAikCrQGvASwCSAMuAi4CSANJA7QBMAKyAbIBMAIvAjgCSgM6AjoCSgNLA0gDLAJLA0sDLAI6AvABRwNKAkoCRwNMA7kBSwJMA0wDSwJKAksCuQFaAloCuQG7AU0DWwK7AbsBWwJaAmwCwAFtAm0CwAG+AasBIgLCAcIBIgJlAnYCxAF1AnUCxAHDAXUCwwEYAhgCwwGmAXsCMALGAcYBMAK0AWwCewLAAcABewLGAX0CTgN/An8CTgNPA1ADgAJPA08DgAJ/AoACUAOHAocCUANRA0oDOAJRA1EDOAKHAosCzAGIAogCzAHLAYgCywF2AnYCywHEASkCrwFSA1IDrwHOAdABUwPOAc4BUwNSA58C8gHRAdEB8gGdASoCKAKUApQCKAJUAygCKQJUA1QDKQJSA1MDVQNSA1IDVQNUA1UDlQJUA1QDlQKUAlMD0AFWA1YD0AHTAVcDVgPVAdUBVgPTAZUCVQNYA1gDVQNZA1UDUwNZA1kDUwNWA1cDWgNWA1YDWgNZA1sDWANaA1oDWANZA1wDjwJdA10DjwKWApYClQJdA10DlQJYA1sDXgNYA1gDXgNdA14DXwNdA10DXwNcA5ACjwJgA2ADjwJcA18DYQNcA1wDYQNgA2EDYgNgA2ADYgNjA5ECkAJjA2MDkAJgA2IDZANjA2MDZANlA4oCkQJlA2UDkQJjA4sCigJmA2YDigJlA2QDZwNlA2UDZwNmA8wBiwLXAdcBiwJmA2cD1gFmA2YD1gHXAWgDaQNqA2oDaQNrA2wDbQNoA2gDbQNpA24DbwNsA2wDbwNtA3ADcQNuA24DcQNvA3IDcwNwA3ADcwNxA3QDdQNyA3IDdQNzA3YDdwN0A3QDdwN1A3gDeQN2A3YDeQN3A3gDegN5A3kDegN7A3oDfAN7A3sDfAN9A34DfwN8A3wDfwN9A4ADgQN+A34DgQN/A4IDgwOEA4QDgwOFA2kDhgNrA2sDhgOHA20DiANpA2kDiAOGA28DiQNtA20DiQOIA3EDigNvA28DigOJA3MDiwNxA3EDiwOKA3UDjANzA3MDjAOLA3cDjQN1A3UDjQOMA3kDjgN3A3cDjgONA3kDewOOA44DewOPA3sDfQOPA48DfQOQA38DkQN9A30DkQOQA5IDgQOTA5MDgQOFA4YDlAOHA4cDlAOVA4gDlgOGA4YDlgOUA4kDlwOIA4gDlwOWA4oDmAOJA4kDmAOXA4sDmQOKA4oDmQOYA4wDmgOLA4sDmgOZA40DmwOMA4wDmwOaA44DnAONA40DnAObA44DjwOcA5wDjwOdA5ADngOPA48DngOdA5EDnwOQA5ADnwOeA6ADkgOhA6EDkgOTA5UDlAOiA6IDlAOjA5YDpAOUA5QDpAOjA5cDpQOWA5YDpQOkA5gDpgOXA5cDpgOlA5kDpwOYA5gDpwOmA5oDqAOZA5kDqAOnA5sDqQOaA5oDqQOoA5wDqgObA5sDqgOpA5wDnQOqA6oDnQOrA54DrAOdA50DrAOrA58DrQOeA54DrQOsA64DoAOvA68DoAOhA6IDowOwA7ADowOxA6QDsgOjA6MDsgOxA6UDswOkA6QDswOyA6YDtAOlA6UDtAOzA6cDtQOmA6YDtQO0A6gDtgOnA6cDtgO1A6kDtwOoA6gDtwO2A6oDuAOpA6kDuAO3A6oDqwO4A7gDqwO5A6wDugOrA6sDugO5A60DuwOsA6wDuwO6A7wDrgO9A70DrgOvA7ADsQO+A74DsQO/A7IDwAOxA7EDwAO/A7MDwQOyA7IDwQPAA7QDwgOzA7MDwgPBA7UDwwO0A7QDwwPCA7YDxAO1A7UDxAPDA7cDxQO2A7YDxQPEA7gDxgO3A7cDxgPFA7gDuQPGA8YDuQPHA7kDugPHA8cDugPIA7sDyQO6A7oDyQPIA4cBvAOGAYYBvAO9A74DvwPKA8oDvwPLA8ADzAO/A78DzAPLA8EDzQPAA8ADzQPMA8IDzgPBA8EDzgPNA8MDzwPCA8IDzwPOA8QD0APDA8MD0APPA8UD0QPEA8QD0QPQA8YD0gPFA8UD0gPRA8YDxwPSA9IDxwPTA8cDyAPTA9MDyAPUA8kD1QPIA8gD1QPUA8oDywPWA9YDywPXA8wD2APLA8sD2APXA80D2QPMA8wD2QPYA84D2gPNA80D2gPZA88D2wPOA84D2wPaA9AD3APPA88D3APbA9ED3QPQA9AD3QPcA9ID3gPRA9ED3gPdA9ID0wPeA94D0wPfA9MD1APfA98D1APgA9UD4QPUA9QD4QPgA9YD1wPiA+ID1wPjA9gD5APXA9cD5APjA9kD5QPYA9gD5QPkA9oD5gPZA9kD5gPlA9sD5wPaA9oD5wPmA9wD6APbA9sD6APnA90D6QPcA9wD6QPoA94D6gPdA90D6gPpA94D3wPqA+oD3wPrA98D4APrA+sD4APsA+ED7QPgA+AD7QPsA+ID4wPuA+4D4wPvA+QD8APjA+MD8APvA+UD8QPkA+QD8QPwA+YD8gPlA+UD8gPxA+cD8wPmA+YD8wPyA+gD9APnA+cD9APzA+kD9QPoA+gD9QP0A+kD6gP1A/UD6gP2A+oD6wP2A/YD6wP3A+sD7AP3A/cD7AP4A+wD7QP4A/gD7QP5A+4D7wP6A/oD7wP7A/AD/APvA+8D/AP7A/ED/QPwA/AD/QP8A/ID/gPxA/ED/gP9A/MD/wPyA/ID/wP+A/QDAATzA/MDAAT/A/UDAQT0A/QDAQQABPUD9gMBBAEE9gMCBPYD9wMCBAIE9wMDBPgDBAT3A/cDBAQDBPgD+QMEBAQE+QMFBPoD+wMGBAYE+wMHBPsD/AMHBAcE/AMIBPwD/QMIBAgE/QMJBP0D/gMJBAkE/gMKBP8DCwT+A/4DCwQKBAAEDAT/A/8DDAQLBAEEDQQABAAEDQQMBAEEAgQNBA0EAgQOBAMEDwQCBAIEDwQOBAQEEAQDBAMEEAQPBAUEEQQEBAQEEQQQBAYEBwQSBBIEBwQTBAcECAQTBBMECAQUBAgECQQUBBQECQQVBAwEDQQWBA4EFwQNBA0EFwQWBA8EGAQOBA4EGAQXBBAEGQQPBA8EGQQYBBEEGgQQBBAEGgQZBBIEEwQbBBsEEwQcBBMEFAQcBBwEFAQdBBsEHAQeBB4EHAQfBB0EIAQcBBwEIAQfBCEEIgQYBBgEIgQXBBkEIwQYBBgEIwQhBBoEJAQZBBkEJAQjBB4EHwQlBCUEHwQmBCAEJwQfBB8EJwQmBCgEIgQpBCkEIgQhBCEEIwQpBCkEIwQqBCQEKwQjBCMEKwQqBCUEJgQsBCwEJgQtBCYEJwQtBC0EJwQuBC8EMAQpBCkEMAQoBCkEKgQvBC8EKgQxBCsEMgQqBCoEMgQxBCwELQQzBDMELQQ0BC0ELgQ0BDQELgQ1BDAELwQ2BDYELwQ3BC8EMQQ3BDcEMQQ4BDEEMgQ4BDgEMgQ5BDIEOgQ5BDkEOgQ7BDwEOgQ9BD0EOgQ+BDMENAQ/BD8ENARABDQENQRABEAENQRBBEIEQwREBEQEQwRFBGgDagNGBGwDaANGBG4DbANGBHADbgNGBHIDcANGBHQDcgNGBHYDdANGBHgDdgNGBHoDeANGBHwDegNGBH4DfANGBH4DRgSAA4IDhANGBEcESARJBEkESARKBEkESwRHBEcESwRMBE0ETgRJBEkETgRLBEkESgRNBE0ESgRPBFAEUQRSBFIEUQRTBFIEVARQBFAEVARVBEcETARSBFIETARUBFIEUwRHBEcEUwRIBFYEVwRYBFgEVwRZBFgEWgRWBFYEWgRbBFAEVQRYBFgEVQRaBFgEWQRQBFAEWQRRBFwEXQReBF4EXQRfBF8EYAReBF4EYARhBFYEWwRfBF8EWwRgBF8EXQRWBFYEXQRXBGIEYwRkBGQEYwRlBGEEYgReBF4EYgRkBGQEZQRmBGYEZQRnBGgEaQRqBGoEaQRrBGwEbQRrBGsEbQRqBGMEbARlBGUEbARrBGkEZwRrBGsEZwRlBG4EbwRwBHAEbwRxBHIEcwRxBHEEcwRwBG0EcgRqBGoEcgRxBG8EaARxBHEEaARqBHQEdQR2BHYEdQR3BHgEeQR3BHcEeQR2BHMEeARwBHAEeAR3BHUEbgR3BHcEbgRwBHoEewR8BHwEewR9BH4EfwR9BH0EfwR8BHkEfgR2BHYEfgR9BHsEdAR9BH0EdAR2BE0ETwSABIAETwSBBIAEggRNBE0EggROBHwEfwSABIAEfwSCBIAEgQR8BHwEgQR6BHUEdARKBEoEdARPBIMEhASFBIUEhASGBIcEiASJBIkEiASGBIoEiwSMBIwEiwSNBI4EjwSQBJAEjwSNBJEEkgSQBJAEkgSTBJQElQSFBIUElQSTBJYElwSYBJgElwSJBJkEmgSbBJsEmgSXBJwEnQSbBJsEnQSeBJ8EngSgBKAEngShBKIEowSkBKQEowSlBKYEowSnBKcEowShBKgEqQSqBKoEqQSlBKsEqQSsBKwEqQStBK4ErwSwBLAErwStBLEErwSyBLIErwSzBLQEtQS2BLYEtQSzBLcEtQS4BLgEtQS5BLoEuwS8BLwEuwS5BL0EuwS+BL4EuwSMBFoEvwRbBFsEvwTABMEEWgTCBMIEWgRVBEsEwwRMBEwEwwTEBMUESwTGBMYESwROBFQExwRVBFUExwTIBMkEVATKBMoEVARMBGAEywRhBGEEywTMBM0EYATOBM4EYARbBIIEzwROBE4EzwTQBNEEggTSBNIEggR/BGMEYgTTBNMEYgTUBGIEYQTVBNUEYQTWBH8EfgTXBNcEfgTYBH4EeQTZBNkEeQTaBG0EbATbBNsEbATcBGwEYwTdBN0EYwTeBHkEeATfBN8EeATgBHgEcwThBOEEcwTiBHMEcgTjBOMEcgTkBHIEbQTlBOUEbQTmBOcEmgToBOgEmgSZBJoE6QSHBIcE6QTqBOsElQTsBOwElQSUBI4ElQTtBO0ElQTuBIcE7wSIBIgE7wTwBPEElATyBPIElASIBPMEnwT0BPQEnwSgBPUEmQT2BPYEmQSfBPcE+ASOBI4E+ASPBL4EjwT5BPkEjwT6BPsEogT8BPwEogSkBP0EoAT+BP4EoASiBP8EAAW+BL4EAAW9BLgEvQQBBQEFvQQCBQMFqwQEBQQFqwSsBAUFpAQGBQYFpASrBAcFCAW4BLgECAW3BLIEtwQJBQkFtwQKBbIECwWxBLEECwUMBQ0FrAQOBQ4FrASxBKYEDwWqBKoEDwUQBaYEpwQPBQ8FpwQRBagEEgWwBLAEEgUTBRIFqAQQBRAFqASqBJgEhAQUBRQFhAQVBYQEgwQVBRUFgwQWBbQEFwW8BLwEFwUYBRcFtAQZBRkFtAS2BJEEiwQaBRoFiwQbBRsFiwQcBRwFiwSKBIMEkgQWBRYFkgQdBZIEkQQdBR0FkQQaBZwElgQeBR4FlgQfBZYEmAQfBR8FmAQUBacEnQQRBREFnQQgBZ0EnAQgBSAFnAQeBa4EIQW2BLYEIQUZBSEFrgQTBRMFrgSwBLoEIgWKBIoEIgUcBSIFugQYBRgFugS8BCMFJAUPBQ8FJAUQBSUFIwURBREFIwUPBRIFJgUTBRMFJgUnBSYFEgUkBSQFEgUQBSgFKQUVBRUFKQUUBSoFKAUWBRYFKAUVBRcFKwUYBRgFKwUsBSsFFwUtBS0FFwUZBRsFLgUaBRoFLgUvBS4FGwUwBTAFGwUcBTEFKgUdBR0FKgUWBS8FMQUaBRoFMQUdBTIFMwUfBR8FMwUeBSkFMgUUBRQFMgUfBTQFJQUgBSAFJQURBTMFNAUeBR4FNAUgBSEFNQUZBRkFNQUtBTUFIQUnBScFIQUTBSIFNgUcBRwFNgUwBTYFIgUsBSwFIgUYBXsEegR0BHQEegRPBHoEgQRPBEgEUwRuBG4EUwRvBEoESAR1BHUESARuBFMEUQRvBG8EUQRoBF0EXARXBGcEVwRmBFcEXARmBFkEaQRRBFEEaQRoBGYEXARkBGQEXAReBFcEZwRZBFkEZwRpBCQFIwU3BTcFIwU4BSMFJQU4BTgFJQU2BCYFOQUnBScFOQU6BSgFFgQpBSkFFgQXBCgFKgUWBBYEKgUMBCsFLgQsBSwFLgQnBC0FNQQrBSsFNQQuBC8FLgUKBAoELgUVBC4FMAUVBBUEMAUdBDEFCwQqBSoFCwQMBDEFLwULBAsELwUKBDMFMgUoBCgEMgUiBDIFKQUiBCIEKQUXBDQFMwUwBDAEMwUoBC0FNQU1BDUENQVBBCcFOgU1BTUFOgVBBDAFNgUdBB0ENgUgBDYFLAUgBCAELAUnBCQFNwUmBSYFNwU5BR0EFAQVBBUECQQKBDQFMAQlBSUFMAQ2BDsFPAU9BTwFPgU/BT8FPgU9BUAFQQVCBUIFQQVDBUEFQAVEBUQFQAVFBUYFRwVABUAFRwVFBUgFSQVKBUoFSQVGBUYFQAVKBUoFQAVCBUsFTAVNBU0FTAVOBU8FTgVQBVAFTgVMBVEFUgVTBVMFUgVUBVUFVAVWBVYFVAVXBUwFWAVZBVkFWAVaBVgFWwVcBVwFWwVdBVsFWAVeBV4FWAVfBVgFTAVfBV8FTAVLBWAFYQViBWIFYQVjBU0FYwVLBUsFYwVhBWQFZQVmBWYFZQVnBWUFaAVnBWcFaAVpBWgFZQVqBWoFZQVrBWsFZQVkBWwFbQVTBVMFbQVuBW0FbAVvBW8FbAVwBWwFcQVwBXAFcQVyBXEFcwVyBXIFcwV0BXMFcQVVBVUFcQVUBXEFbAVUBVQFbAVTBXUFdgV3BXcFdgV4BXgFdgVgBWAFdgVhBXYFXwVhBWEFXwVLBXYFdQVfBV8FdQVeBWkFaAV5BXkFaAV6BXoFaAV7BXwFfQV+BX4FfQV/BX0FfAWABYAFfAWBBYIFgwWEBYQFgwWFBYUFgwWGBYYFgwWHBYMFfQWHBYcFfQWABYMFggV9BX0FggV/BYgFiQWKBYoFiQWLBYkFjAWLBYsFjAWNBY4FjwWQBZAFjwWRBY4FPAWPBY8FPAU7BZIFkwWQBZAFkwWOBY4FlAU8BTwFlAU+BZQFjgWVBZUFjgWTBZYFlwWYBZgFlwWZBZcFQQWZBZkFQQVEBUEFlwVDBUMFlwWaBZcFlgWaBZoFlgWbBWIFnAVgBWAFnAWdBZ4FnQWfBZ8FnQWcBaAFoQWiBaIFoQWjBaEFpAWjBaMFpAWlBaQFoQWRBZEFoQWQBaYFoAWnBacFoAWiBZMFkgWoBakFqAWSBakFpgV5BXkFpgWqBaYFpwWqBaoFpwWrBawFpAWtBa0FpAWRBaQFrAWlBaUFrAWuBawFrwWuBa4FrwWwBa8FrAWxBbEFrAWtBbIFswW0BbQFswW1BbYFtQW3BbcFtQWzBbgFuQW6BboFuQW7BbkFvAW7BbsFvAW9BbwFuQW+Bb4FuQW/BbkFuAW/Bb8FuAXABcEFwgXDBcMFwgXEBcIFxQXEBcQFxQWNBcIFuAXFBcUFuAW6BbgFwgXABcAFwgXBBcYFxwXIBcgFxwXJBccFygXJBckFygXLBcoFxwW2BbYFxwW1BccFxgW1BbUFxgW0BcwFvAXNBc0FvAW+BbwFzAW9Bb0FzAXOBcwFzwXOBc4FzwXQBc8FzAXRBdEFzAXNBbcF0gW2BbYF0gXKBdMFywXSBdIFywXKBdQF1QXWBdYF1QXXBdUF1AXQBdAF1AXOBc4F1AW9Bb0F1AW7BdQF1gW7BbsF1gW6BdgF2QVwBXAF2QVvBdkF2AXaBdoF2AXbBdwF3QXeBd4F3QXfBZMF4AWVBZUF4AXhBeIF4wXkBeQF4wXhBdgF5QXbBdsF5QXmBeUF5wXmBeYF5wXoBecF5QV0BXQF5QVyBeUF2AVyBXIF2AVwBekFlgXjBeMFlgWYBZYF6QWbBZsF6QXqBekF6wXqBeoF6wXsBesF6QXiBeIF6QXjBe0F7gXbBdsF7gXaBd0F7wXfBd8F7wXwBfEF4gXyBfIF4gXkBfMF9AXoBegF9AXmBfQF7QXmBeYF7QXbBesF9QXsBewF9QX2BfUF6wXxBfEF6wXiBe8FfAXwBfAFfAV+BYYFhwXzBfMFhwX0BYcFgAX0BfQFgAXtBfcF+AX5BfkF+AX6BfgF9wWeBZ4F9wWdBfcFeAWdBZ0FeAVgBXgF9wV3BXcF9wX5BfsF/AWwBbAF/AWuBfwF/QWuBa4F/QWlBf0F/AW+Bb4F/AXNBfwF+wXNBc0F+wXRBf4F/wXDBcMF/wUABv8FAQYABgAGAQarBZ8FAgaeBZ4FAgYDBrQFAwayBbIFAwYCBgQGBQbABcAFBQa/BQUG/QW/Bb8F/QW+Bf0FBQalBaUFBQajBQUGBAajBaMFBAaiBdMF0gWIBYgF0gWJBdIFtwWJBYkFtwWMBbcFswWMBYwFswUGBrMFsgUGBgYGsgX+BZ8FnAUBBgEGnAUHBpwFYgUHBgcGYgVpBWIFYwVpBWkFYwVnBWMFTQVnBWcFTQVmBQgGZAUJBgkGZAVmBQoGagVrBdwF2QXdBd0F2QXaBe4F7wXaBdoF7wXdBYEFfAXuBe4FfAXvBQsGWwUMBgwGWwUNBg0GWwUOBg4GWwVeBXUFDwZeBV4FDwYOBg8GdQUQBhAGdQV3BfkFEQZ3BXcFEQYQBvkF+gURBhEG+gUSBvoFEwYSBhIGEwYUBhMGyAUUBhQGyAUVBsgFyQUVBhUGyQUWBskFywUWBhYGywUXBssF0wUXBhcG0wUYBtMFiAUYBhgGiAUZBhoGGwaKBYoFGwYcBhsGGgYdBh0GGgbXBR4G1QUfBh8G1QXQBdUFHgbXBdcFHgYdBs8FIAbQBdAFIAYfBiAGzwUhBiEGzwXRBSIG+wUjBiMG+wWwBfsFIgbRBdEFIgYhBq8FJAawBbAFJAYjBiQGrwUlBiUGrwWxBUkFSAWxBbEFSAUlBoIFJgZ/BX8FJgYnBiYG9QUnBicG9QXxBfUFJgb2BfYFJgYoBiYGggUoBigGggWEBRkGiAUcBhwGiAWKBSkGqAXeBd4FqAUqBqgFKQaTBZMFKQbgBSkGKwbgBeAFKwYsBisGKQbfBd8FKQbeBQEGBwarBasFBwaqBaoFBwZ5BXkFBwZpBS0GKwbwBfAFKwbfBSsGLQYsBiwGLQYuBgQGLwaiBaIFLwanBacFLwarBasFLwYABi8GwQUABgAGwQXDBS8GBAbBBcEFBAbABTAGLQZ+BX4FLQbwBS0GMAYuBi4GMAbyBYwFBgaNBY0FBgbEBQYG/gXEBcQF/gXDBScGMAZ/BX8FMAZ+BRoGMQbXBdcFMQbWBTEGxQXWBdYFxQW6BcUFMQaNBY0FMQaLBTEGGgaLBYsFGgaKBYAFgQXtBe0FgQXuBU0FTgVmBWYFTgUyBnkFegWpBXoFKgapBagFqQUqBjMGSQWtBa0FSQWxBUkFMwZGBUYFMwZHBY8FMwaRBZEFMwatBfgFNAb6BfoFNAYTBjQGxgUTBhMGxgXIBcYFNAa0BbQFNAYDBjQG+AUDBgMG+AWeBbIFAgb+Bf4FAgb/BQIGnwX/Bf8FnwUBBpIFoAWpBakFoAWmBaEFoAWQBZAFoAWSBSwGLgbkBeQFLgbyBeAFLAbhBeEFLAbkBfIFMAbxBfEFMAYnBuMFmAXhBeEFmAWVBZkFlAWYBZgFlAWVBZQFmQU+BT4FmQVEBUQFRQU+BT4FRQU9BUcFOwVFBUUFOwU9BTMGjwVHBUcFjwU7BTUGNgY3BjcGNgY4BjkGNgY5BTkFNgZFBDkFRQQ6BToFRQRDBEAEQQRDBEMEQQQ6BT8EQARCBEIEQARDBDoGOwY8BjwGOwY9Bj4GOwY2BDYEOwY4BT8GQAZBBkEGQAZCBkMGRAZFBkUGRAY7BDoGOQY3BTcFOQY5BT8GPgY3BDcEPgY2BEYGRwZkBWQFRwZrBVMFbgVIBkgGbgVJBkoGQAY5BDkEQAY4BG4FawVLBksGawVMBjYGNQZFBEUENQZEBEQGQwZNBk0GQwZOBk8GNgZQBlAGNgY5BlEGOQZSBlIGOQY6BjgFOwY3BTcFOwY6BjsGPgZTBlMGPgZUBj4GPwZVBlUGPwZWBkAGPwY4BDgEPwY3BEAGSgZXBlcGSgZYBkoGRAZZBlkGRAZaBlsG3AUqBioG3AXeBdkF3AVvBW8F3AVbBm0FbwVcBlwGbwVbBlsGKgZ7BXsFKgZ6BVwGWwYKBgoGWwZ7BVwGCgZuBW4FCgZrBW4FbQVcBgoGewVqBWoFewVoBTkEOwRKBkoGOwREBoEDkgN/A38DkgORA5IDoAORA5EDoAOfA6ADrgOfA58DrgOtA64DvAOtA60DvAO7A7sDvAPJA8kDvAOHAYcBigHJA8kDigHVAysEPgQyBDIEPgQ6BGsDXQZqA2oDXQZeBl0GXwZeBl4GXwZgBl8GYQZgBmAGYQZiBmEGYwZiBmIGYwZkBmMGZQZkBmQGZQZmBmUGZwZmBmYGZwZoBmcGaQZoBmgGaQZqBmkGawZqBmoGawZsBmwGawZtBm0GawZuBm0GbgZvBm8GbgZwBnAGcQZvBm8GcQZyBnEGcwZyBnIGcwZ0BnMGdQZ0BnQGdQZ2BocDdwZrA2sDdwZdBncGeAZdBl0GeAZfBngGeQZfBl8GeQZhBnkGegZhBmEGegZjBnoGewZjBmMGewZlBnsGfAZlBmUGfAZnBnwGfQZnBmcGfQZpBn0GfgZpBmkGfgZrBmsGfgZuBm4GfgZ/Bm4GfwZwBnAGfwaABoAGgQZwBnAGgQZxBoIGgwZzBnMGgwZ1BpUDhAaHA4cDhAZ3BoQGhQZ3BncGhQZ4BoUGhgZ4BngGhgZ5BoYGhwZ5BnkGhwZ6BocGiAZ6BnoGiAZ7BogGiQZ7BnsGiQZ8BokGigZ8BnwGigZ9BooGiwZ9Bn0GiwZ+Bn4GiwZ/Bn8GiwaMBn8GjAaABoAGjAaNBoAGjQaBBoEGjQaOBo8GkAaCBoIGkAaDBpUDogOEBoQGogORBpEGkgaEBoQGkgaFBpIGkwaFBoUGkwaGBpMGlAaGBoYGlAaHBpQGlQaHBocGlQaIBpUGlgaIBogGlgaJBpYGlwaJBokGlwaKBpcGmAaKBooGmAaLBosGmAaMBowGmAaZBpkGmgaMBowGmgaNBo0GmgaOBo4GmgabBpwGnQaPBo8GnQaQBqIDsAORBpEGsAOeBp4GnwaRBpEGnwaSBp8GoAaSBpIGoAaTBqAGoQaTBpMGoQaUBqEGogaUBpQGogaVBqIGowaVBpUGowaWBqMGpAaWBpYGpAaXBqQGpQaXBpcGpQaYBpgGpQaZBpkGpQamBqYGpwaZBpkGpwaaBqcGqAaaBpoGqAabBqkGqgacBpwGqgadBrADvgOeBp4GvgOrBqsGrAaeBp4GrAafBqwGrQafBp8GrQagBq0GrgagBqAGrgahBq4GrwahBqEGrwaiBq8GsAaiBqIGsAajBrAGsQajBqMGsQakBrEGsgakBqQGsgalBqUGsgamBqYGsgazBrMGtAamBqYGtAanBrQGtQanBqcGtQaoBrYGqgbUAdQBqgbVAb4DygOrBqsGygO3BrcGuAarBqsGuAasBrgGuQasBqwGuQatBrkGugatBq0GugauBroGuwauBq4GuwavBrsGvAavBq8GvAawBrwGvQawBrAGvQaxBr0GvgaxBrEGvgayBrIGvgazBrMGvga/BrMGvwa0BrQGvwbABsAGwQa0BrQGwQa1BsoD1gO3BrcG1gPCBsIGwwa3BrcGwwa4BsMGxAa4BrgGxAa5BsQGxQa5BrkGxQa6BsUGxga6BroGxga7BsYGxwa7BrsGxwa8BscGyAa8BrwGyAa9BsgGyQa9Br0GyQa+Br4GyQa/Br8GyQbKBsoGywa/Br8GywbABssGzAbABsAGzAbBBtYD4gPCBsIG4gPNBs0GzgbCBsIGzgbDBs4GzwbDBsMGzwbEBs8G0AbEBsQG0AbFBtAG0QbFBsUG0QbGBtEG0gbGBsYG0gbHBtIG0wbHBscG0wbIBtMG1AbIBsgG1AbJBskG1AbKBsoG1AbVBtUG1gbKBsoG1gbLBtYG1wbLBssG1wbMBuID7gPNBs0G7gPYBtgG2QbNBs0G2QbOBtkG2gbOBs4G2gbPBtoG2wbPBs8G2wbQBtsG3AbQBtAG3AbRBtwG3QbRBtEG3QbSBt0G3gbSBtIG3gbTBt4G3wbTBtMG3wbUBtQG3wbVBtUG3wbgBtUG4AbWBtYG4AbhBtYG4QbXBtcG4QbiBu4D+gPYBtgG+gPjBuMG5AbYBtgG5AbZBuQG5QbZBtkG5QbaBuUG5gbaBtoG5gbbBuYG5wbbBtsG5wbcBucG6AbcBtwG6AbdBugG6QbdBt0G6QbeBt4G6QbfBt8G6QbqBt8G6gbgBuAG6gbrBuAG6wbhBuEG6wbsBuEG7AbiBuIG7AbtBvoDBgTjBuMGBgTuBuMG7gbkBuQG7gbvBuQG7wblBuUG7wbwBuUG8AbmBuYG8AbxBvEG8gbmBuYG8gbnBvIG8wbnBucG8wboBvMG9AboBugG9AbpBukG9AbqBuoG9Ab1BuoG9QbrBusG9Qb2BusG9gbsBuwG9gb3BuwG9wbtBu0G9wb4BgYEEgTuBu4GEgT5Bu4G+QbvBu8G+Qb6Bu8G+gbwBvAG+gb7BvMG/Ab0BvwG/Qb0BvQG/Qb1Bv0G/gb1BvUG/gb2Bv4G/wb2BvYG/wb3BvcG/wb4BvgG/wYABxIEGwT5BvkGGwQBB/kGAQf6BvoGAQcCBxsEHgQBBwEHHgQDBwMHBAcBBwEHBAcCBwUH/gYGBwYH/gb9BgUHBwf+Bv4GBwf/Bv8GBwcABwAHBwcIBx4EJQQDBwMHJQQJBwkHCgcDBwMHCgcEBwUHBgcLBwsHBgcMBwUHCwcHBwcHCwcNBwcHDQcIBwgHDQcOByUELAQJBwkHLAQPBwkHDwcKBwoHDwcQBxEHCwcSBxIHCwcMBwsHEQcNBw0HEQcTBw0HEwcOBw4HEwcUBywEMwQPBw8HMwQVBw8HFQcQBxAHFQcWBxcHEQcYBxgHEQcSBxEHFwcTBxMHFwcZBxMHGQcUBxQHGQcaBxQHGgcbBxsHGgccBxsHPAQdBx0HPAQ9BDMEPwQVBxUHPwQeBxUHHgcWBxYHHgcfB0IERAQgByAHRAQhB14GRgRqA2AGRgReBmIGRgRgBmQGRgRiBmYGRgRkBmgGRgRmBmoGRgRoBmwGRgRqBm0GRgRsBm8GRgRtBnIGRgRvBnIGdAZGBHYGRgR0BiIHIwckByQHIwclByMHIgcmByYHIgcnBygHIwcpBykHIwcmByMHKAclByUHKAcqBysHLActBy0HLAcuBywHKwcvBy8HKwcwByIHLAcnBycHLAcvBywHIgcuBy4HIgckBzEHMgczBzMHMgc0BzIHMQc1BzUHMQc2BysHMgcwBzAHMgc1BzIHKwc0BzQHKwctBzcHOAc5BzkHOAc6BzcHOQc7BzsHOQc8BzEHNwc2BzYHNwc7BzcHMQc4BzgHMQczBz0HPgc/Bz8HPgdABz8HQAc5BzkHQAc8Bz8HQQc9Bz0HQQdCB0MHRAdFB0UHRAdGB0UHRwdDB0MHRwdIB0MHSAc9Bz0HSAc+Bz0HQgdDB0MHQgdEB0kHSgdLB0sHSgdMB0sHTQdJB0kHTQdOB0kHTgdFB0UHTgdHB0UHRgdJB0kHRgdKB08HUAdRB1EHUAdSB1EHUwdPB08HUwdUB08HVAdLB0sHVAdNB0sHTAdPB08HTAdQB1UHVgdXB1cHVgdYB1cHWQdVB1UHWQdaB1UHWgdRB1EHWgdTB1EHUgdVB1UHUgdWBygHWwcqByoHWwdcB1sHKAddB10HKAcpB1cHWwdZB1kHWwddB1sHVwdcB1wHVwdYByoHUgclByUHUgdQB14HXwdgB2AHXwdhB2IHYwdkB2QHYwdhB2UHZgdnB2cHZgdoB2kHagdrB2sHagdoB2wHagdtB20HagduB28HXwdwB3AHXwduB3EHcgdzB3MHcgdjB3QHdQd2B3YHdQdzB3cHdQd4B3gHdQd5B3oHewd5B3kHewd8B30Hfgd/B38HfgeAB4EHggd/B38Hggd8B4MHhAeFB4UHhAeAB4YHhweFB4UHhweIB4kHigeLB4sHigeIB4wHjQeLB4sHjQeOB48HkAeRB5EHkAeOB5IHkweRB5EHkweUB5UHlgeXB5cHlgeUB5gHmQeXB5cHmQdmB5oHmwc2BzYHmwc1B5wHnQc1BzUHnQcwB54HnwcnBycHnwcmB6AHoQcmByYHoQcpB6IHowcwBzAHowcvB6QHpQcvBy8HpQcnB6YHpwc8BzwHpwc7B6gHqQc7BzsHqQc2B6oHqwcpBykHqwddB6wHrQddB10HrQdZBz4HrgdAB0AHrgevB7AHPAexB7EHPAdAB1kHsgdaB1oHsgezB7QHUwe1B7UHUwdaB0cHtgdIB0gHtge3B7gHPge5B7kHPgdIB1MHugdUB1QHuge7B7wHTQe9B70HTQdUB00HvgdOB04Hvge/B8AHRwfBB8EHRwdOB8IHwwd2B3YHwwd0B3YHYgfEB8QHYgfFB8YHxwdwB3AHxwdvB8gHcAfJB8kHcAdpB8oHywdkB2QHywdiB2QHbwfMB8wHbwfNB84Hzwd6B3oHzwd7B3oHdAfQB9AHdAfRB9IHaQfTB9MHaQdrB9QHawfVB9UHaweZB9YH1wd9B30H1wd+B30HewfYB9gHewfZB9oHmQfbB9sHmQeYB9wHmAfdB90HmAeTB94H3weGB4YH3weHB4YHfgfgB+AHfgfhB+IHkwfjB+MHkweSB+QHkgflB+UHkgeNB+YH5weMB4wH5weNB4wHhwfoB+gHhwfpB+oH6weEB4QH6weBB+wHggfrB+sHggeBB+0H7geKB4oH7geDB+4H6geDB4MH6geEB3IH7wdgB2AH7wfwB/EHXgfwB/AHXgdgB/IH8weWB5YH8wePB/MH9AePB48H9AeQB2wH9QdnB2cH9Qf2B/YH9wdnB2cH9wdlB14H8QdtB20H8Qf4B/UHbAf4B/gHbAdtB3cH+QdxB3EH+Qf6B+8Hcgf6B/oHcgdxB4IH7Ad4B3gH7Af7B/kHdwf7B/sHdwd4B/QH/AeQB5AH/AeJB/wH7QeJB4kH7QeKB/cH/QdlB2UH/QeVB/0H8geVB5UH8geWB+oH/gfrB+sH/gf/BwAI7Af/B/8H7AfrB+4H7QcBCAEI7QcCCOoH7gf+B/4H7gcBCO8HAwjwB/AHAwgECAUI8QcECAQI8QfwB/MH8gcGCAYI8gcHCPQH8wcICAgI8wcGCPYH9QcJCAkI9QcKCPcH9gcLCAsI9gcJCPEHBQj4B/gHBQgMCAoI9QcMCAwI9Qf4B/kHDQj6B/oHDQgOCAMI7wcOCA4I7wf6B+wHAAj7B/sHAAgPCA0I+QcPCA8I+Qf7B/wH9AcQCBAI9AcICO0H/AcCCAII/AcQCP0H9wcRCBEI9wcLCPIH/QcHCAcI/QcRCFYHUgdYB1IHKgdYByoHXAdYByQHTAcuBy4HTAdKByUHUAckByQHUAdMBy4HSgctBy0HSgdGBzgHMwc6B0IHQQczBzMHQQc6B0YHRActBy0HRAc0BzkHOgc/Bz8HOgdBBzMHNAdCB0IHNAdEB/4HEgj/B/8HEggTCP8HEwgACAAIEwgYBxQIFQgCCAIIFQgBCP0G/AYDCAMI/AYECAQI/AYFCAUI/AbzBgoHEAcHCAcIEAcGCBAHFgcGCAYIFgcICAoI8QYJCAkI8Qb7BgkI+wYLCAsI+wYCB/MG8gYFCAUI8gYMCAwI8gYKCAoI8gbxBg0IDAcOCA4IDAcGBw4IBgcDCAMIBgf9Bg8IEgcNCA0IEgcMBwgIFgcQCBAIFgcfBx8HFAgQCBAIFAgCCAsIAgcRCBEIAgcEBxEIBAcHCAcIBAcKBxUIEggBCAEIEgj+BwIH+wb6BvsG8QbwBg8IAAgSBxIHAAgYBxYIFwgYCBcIGQgYCBgIGQgWCBoIQgUbCBsIQgVDBRwIGggdCB0IGggbCBoIHAgeCB4IHAgfCEoFHghIBUgFHgggCEIFGghKBUoFGggeCCEIIggjCCMIIggkCCIIIQglCCUIIQgmCCcIKAgpCCkIKAgqCFUFKwgnCCcIKwgsCCIILQguCC4ILQgvCDAIMQgyCDIIMQguCDEIMwguCC4IMwg0CCQIIgg0CDQIIgguCDUINgg3CDcINgg4CCMIJAg1CDUIJAg2CDkIOgg7CDsIOgg8CD0IPgg8CDwIPgg7CD4IPwg7CD8IQAg7CDsIQAg5CEEIKQhCCEIIKQhDCEQIQQhFCEUIQQhCCEEIRAhGCEYIRAhHCHQFcwVHCEcIcwVGCHMFVQVGCEYIVQUnCCkIQQgnCCcIQQhGCEgISQhKCEoISQhLCEsIOAhKCEoIOAg2CCQINAg2CDYINAhKCDMISAg0CDQISAhKCD0ITAg+CD4ITAhNCE0ITgg+CE8IUAhRCFEIUAhSCFAIUwhSCFIIUwhUCFUIhAVWCFYIhAWFBYUFhgVWCFYIhgVXCFMIUAhXCFcIUAhWCE8IVQhQCFAIVQhWCFgIWQhaCFoIWQhbCFwIXQhbCFsIXQhaCF4IXwhgCGAIXwhhCGIIFghfCF8IFghhCGEIYwhgCGAIYwhkCBkIZQgWCBYIZQhhCGUIZghhCGEIZghjCGcIaAhpCGkIaAhqCGgIHQhqCGoIHQgbCBsIQwVqCGoIQwWaBZsFaQiaBZoFaQhqCDcIOAhrCGsIOAhsCGsIbAhtCG0IbAhuCG8IcAhxCHEIcAhyCHMIdAhyCHIIdAhxCHQIXghxCHEIXghgCHAIbwh1CHUIbwh2CGMIdwhkCHgIZAh3CHgITAh2CHYITAh5CHoIdQh5CHkIdQh2CF4IdAh7CHsIdAh8CHQIcwh8CHwIcwh9CH4Ifwh9CH0Ifwh8CH8IgAh8CHwIgAh7CIEIggiDCIMIggiECIIIgQiFCIUIgQiGCIcIiAiJCIkIiAiKCIsIjAiKCIoIjAiJCIwIjQiJCIkIjQiOCI8IhwiOCI4IhwiJCJAIkQiSCJIIkQiTCFwIlAiTCJMIlAiSCIgIhwiUCJQIhwiSCIcIjwiSCJIIjwiQCJUIlgiXCJcIlgiYCJkImgiYCJgImgiXCJoIhgiXCJcIhgiBCIMIlQiBCIEIlQiXCI0IjAibCJsIjAicCIwIiwicCJwIiwidCJ4InwidCJ0InwicCJ8IoAicCJwIoAibCIUIhgihCKEIhgiaCKIIoQiZCJkIoQiaCKMIpAilCKUIpAimCKQIngimCKYIngidCJ0IiwimCKYIiwiKCIgIpQiKCIoIpQimCKcIRAioCKgIRAhFCKkIpwiqCKoIpwioCKsIrAitCK0IrAiuCGMIZgivCK8IZgiwCLAIsQiyCLIIsQizCKcIqQi0CLQIqQi1COgF5wW1CLUI5wW0COcFdAW0CLQIdAVHCEQIpwhHCEcIpwi0CGcIaQixCLEIaQi2CGkImwW2CLYImwXqBewFtwjqBeoFtwi2CLcIswi2CLYIswixCLgIqQi5CLkIqQiqCKwIqwi6CLoIqwi7CLIIswi8CLwIswi9CPMF6AW+CL4I6AW1CKkIuAi1CLUIuAi+CLcI7AW/CL8I7AX2BbMItwi9CL0Itwi/CLoIuwhSCFIIuwhRCIYF8wVXCFcI8wW+CLgIUwi+CL4IUwhXCMAIwQjCCMIIwQjDCMEIbgjDCMMIbghsCDgISwhsCGwISwjDCEsISQjDCMMISQjCCMQIfgjFCMUIfgh9CHMIxgh9CH0IxgjFCMYIjQjFCMUIjQibCKAIxAibCJsIxAjFCMcIkQjICMgIkQjJCHoIygjJCMkIygjICG0IbgjLCMsIbgjMCIMIhAjMCMwIhAjLCM0IjwjOCM4IjwiOCI0IxgiOCI4IxgjOCMYIcwjOCM4IcwhyCHAIzQhyCHIIzQjOCKIIWAihCKEIWAhaCF0IhQhaCFoIhQihCIUIXQiCCIIIXQjPCMcIhAjPCM8IhAiCCG0IyghrCGsIygjQCD0INwjQCNAINwhrCDcIPQg1CDUIPQg8CDoIIwg8CDwIIwg1CDoIOQjRCNEIOQjSCNMIQAg/CK4IrAioCKgIrAiqCKwIugiqCKoIugi5CLoIUgi5CLkIUghUCNQIDQbVCNUIDQYxCA0GDgYxCDEIDgYzCA4GDwYzCDMIDwZICA8GEAZICEgIEAZJCBAGEQZJCEkIEQbCCBIGwAgRBhEGwAjCCMAIEgbWCNYIEgYUBhUGlggUBhQGlgjWCJYIFQaYCJgIFQYWBhcGmQgWBhYGmQiYCBgGoggXBhcGogiZCBkGWAgYBhgGWAiiCBwGGwZZCFkIGwbXCBsGHQbXCNcIHQajCB4GHwakCKQIHwaeCB0GHgajCKMIHgakCB8GIAaeCJ4IIAafCCAGIQafCJ8IIQagCCIGIwbECMQIIwZ+CCEGIgagCKAIIgbECCMGJAZ+CH4IJAZ/CCQGJQZ/CH8IJQaACCUGSAWACIAISAUgCFUITwjYCNgITwjZCL0IvwjZCNkIvwjYCL8I9gXYCNgI9gUoBoQFVQgoBigGVQjYCBkGHAZYCFgIHAZZCNoIdwitCK0IdwjbCHcIYwjbCNsIYwivCNwI3QivCK8I3QjbCN0IqwjbCNsIqwitCMoIegjQCNAIegh5CD0I0AhMCEwI0Ah5CKsI3Qi7CLsI3QjeCN0I3AjeCN4I3AjfCM0IcAjgCOAIcAh1CHUIegjgCOAIegjJCJEIkAjJCMkIkAjgCI8IzQiQCJAIzQjgCLsI3ghRCFEI3gjhCN8IvAjeCN4IvAjhCF0IXAjPCM8IXAiTCJEIxwiTCJMIxwjPCNkITwjhCOEITwhRCNcIowjiCOIIowilCIgIlAilCKUIlAjiCJQIXAjiCOIIXAhbCFkI1whbCFsI1wjiCFMIuAhUCFQIuAi5CCMIOgghCCEIOgjjCEwIeAhNCE0IeAjaCHcI2gh4CIAIIAh7CHsIIAjkCCAIHgjkCB4IHwjkCF8IXgjkCOQIXgh7CMEIwAjlCOUIwAjWCJYIlQjWCNYIlQjlCJUIgwjlCOUIgwjMCG4IwQjMCMwIwQjlCIQIxwjLCMsIxwjICMoIbQjICMgIbQjLCGQIeAhvCG8IeAh2CGQIbwhgCGAIbwhxCNwIsgjfCN8Isgi8CLII3AiwCLAI3AivCLwIvQjhCOEIvQjZCGYIZwiwCLAIZwixCGgIZwhlCGUIZwhmCGUIGQhoCGgIGQgdCBcIHAgZCBkIHAgdCB8IHAhiCGIIHAgXCOQIHwhfCF8IHwhiCOYI5wjoCOgI5wg1BiEH5wgVCBUI5wjpCBUIFAghByEHFAggBxQIHwcgByAHHwceBz8EQgQeBx4HQgQgB+oI6wjsCOwI6wjtCBgHEwjuCO4IEwjtCO8I8AjxCPEI8AjyCBwH8whFBkUG8whDBhUI6QgSCBII6QjsCBgH7ggXBxcH7gjyCDkIQAj0CPQIQAj1CCkI9ghDCEMI9gj3CBkH8AgaBxoH8Aj4CPkIQAj6CPoIQAhDCEQENQYhByEHNQbnCPsIQwb8CPwIQwbzCP0I/gjnCOcI/gjpCP8IAAnpCOkIAAnsCBMIEgjtCO0IEgjsCAEJ7ggCCQIJ7gjtCAMJ8ggECQQJ8gjuCBcH8ggZBxkH8gjwCAUJ+AgGCQYJ+AjwCAcJ8wgICQgJ8wj4CAkJ2giuCK4I2gitCAkJrghFCEUIrgioCAkJRQgKCQoJRQhCCE0I2ghOCE4I2ggJCU4ICQnTCNMICQkKCUAI0whDCEMI0wgKCUMICglCCD4ITgg/CD8ITgjTCBoH+AgcBxwH+AjzCIEGggZxBnEGggZzBo4GjwaBBoEGjwaCBpsGnAaOBo4GnAaPBqgGqQabBpsGqQacBqgGtQapBqkGtQZXA8EGWgO1BrUGWgNXAwgHHQdnAw4HFAcdBx0HFAcbB5IEgwSTBJMEgwSFBIQEmASGBIYEmASJBIgElASGBIYElASFBJUEjgSTBJMEjgSQBJoEhwSXBJcEhwSJBIsEkQSNBI0EkQSQBJYEnASXBJcEnASbBI8EvgSNBI0EvgSMBJ8EmQSeBJ4EmQSbBIoEjAS6BLoEjAS7BKcEoQSdBJ0EoQSeBLgEuQS9BL0EuQS7BKAEoQSiBKIEoQSjBLwEuQS0BLQEuQS1BKoEpQSmBKYEpQSjBLIEswS3BLcEswS1BKQEpQSrBKsEpQSpBLYEswSuBK4EswSvBLAErQSoBKgErQSpBKwErQSxBLEErQSvBGAHYQdyB3IHYQdjB20HbgdeB14HbgdfB2QHYQdvB28HYQdfB3YHcwdiB2IHcwdjB3AHbgdpB2kHbgdqB3EHcwd3B3cHcwd1B2cHaAdsB2wHaAdqB3oHeQd0B3QHeQd1B2sHaAeZB5kHaAdmB4IHeAd8B3wHeAd5B2UHlQdmB2YHlQeXB3sHfQd8B3wHfQd/B5MHmAeUB5QHmAeXB4QHgQeAB4AHgQd/B5YHjweUB5QHjweRB34HhgeAB4AHhgeFB40HkgeOB44HkgeRB4oHgweIB4gHgweFB5AHiQeOB44HiQeLB4cHjAeIB4gHjAeLB2MC3AJhAmEC3AILCSECwgIbAhsCwgLcAgsJ3AIQAxAD3ALCApoCmQJCA0IDmQJDA6QCQQOdAp0CQQNCA6ICoAJAA0ADoAJBA80CPgOlAqUCPgNAA80C9wI+Az4D9wI/A+4CPQMjAyMDPQM7A08COQNNAk0COQM6A6kCOQOqAqoCOQM4A2ACNwNSAlICNwM4A7MCNwO0ArQCNwM2A14C2QI2AzYD2QI1A7wCuwI0AzQDuwI1AxkDGwMyAzIDGwMzA+0G+AZhA2ED+AZiA+IG7QZfA18D7QZhA9cG4gZeA14D4gZfA8wG1wZbA1sD1wZeA2QDYgMABwAHYgP4BmcDZAMIBwgHZAMAB2cDHQfWAdYBHQc9BNYBPQSVAZUBPQQ+BFoDwQZbA1sDwQbMBgwJdgYNCQ0JdgZ1BlcD1QGpBqkG1QGqBg4JDQmDBoMGDQl1Bg8JDgmQBpAGDgmDBg8JkAYQCRAJkAadBrYGEAmqBqoGEAmdBrsBvAFNA00DvAERCXIAdAC4AbgBdAC6AREEkAEaBBoEkAGTAREEBQSQAZABBQSOAYEDgAOFA4UDgAOEA4UBhgESCRIJhgG9AxMJkwODA4MDkwOFAxQJoQMTCRMJoQOTAxUJrwMUCRQJrwOhAxIJvQMVCRUJvQOvA+ED1QOLAYsB1QOKAYsBjQHhA+EDjQHtA+0DjQH5A/kDjQGOAQUE+QOOAZUBPgQWCRYJkwGVARwHRQYbBxsHRQY8BDoEPAQ7BDsEPARFBgEAFwkDAAMAFwkYCQQAGQkBAAEAGQkXCQcAGgkEAAQAGgkZCQgAGwkHAAcAGwkaCcAAvwAcCRwJvwAdCcIAwQAeCR4JwQAfCb8AwgAdCR0JwgAeCQMAGAnFAMUAGAkgCccAwAAhCSEJwAAcCcUAIAlrAWsBIAkiCX0BxwAjCSMJxwAhCWsBIgnBAMEAIgkfCRsJCAAkCSQJCACXAX0BIwnRAdEBIwklCdoB2wEmCSYJ2wEnCd0B2gEoCSgJ2gEmCd8B3QEpCSkJ3QEoCd8BKQnhAeEBKQkqCZcCKwmYApgCKwksCZsCLQmZApkCLQkuCZgCLAmbApsCLAktCdsBngInCScJngIvCZ8CMAmXApcCMAkrCZ4CQwMvCS8JQwMxCeEBKglFA0UDKgkyCdEBJQmfAp8CJQkwCUMDmQIxCTEJmQIuCRgJFwkzCRcJGQkzCRkJGgkzCRoJGwkzCRwJHQkzCR4JHwkzCR0JHgkzCSAJGAkzCSEJHAkzCSIJIAkzCSMJIQkzCR8JIgkzCRsJJAkzCSQJMgkzCSUJIwkzCSYJJwkzCSgJJgkzCSkJKAkzCSoJKQkzCSwJKwkzCS4JLQkzCS0JLAkzCScJLwkzCSsJMAkzCS8JMQkzCTIJKgkzCTAJJQkzCTEJLgkzCT4EKwQWCRYJKwQkBBoEkwEkBCQEkwEWCQgHDgcdBzIJJAlFA0UDJAmXAVkANAlXAFcANAk1CUYDRAOZAZkBRAOYAUQDRQOYAZgBRQOXAUcDRgOaAZoBRgOZAUcDmgFMA0wDmgG4AUwDuAG5AbkBuAG6AXQAggC6AboBggC8AYIAhAC8AbwBhAARCU4DNglPA08DNgk3CU8DNwlQA1ADNwk4CVADOAlRA1EDOAk5CVEDOQlKA0oDOQk6CUsDSgM7CTsJSgM6CUgDSwM8CTwJSwM7CUgDPAlJA0kDPAk9CTQJWQA+CT4JWQCjAJUAPwmjAKMAPwk+CZQAQAmVAJUAQAk/CY0ATQDBAcEBTQCqAUsAqAFNAE0AqAGqAU4ArAFLAEsArAGoAU4AUQCsAawBUQCuAVEAfwGuAa4BfwHNAX8BgQHNAc0BgQHPAYQB0gGBAYEB0gHPAYUB1AGEAYQB1AHSARIJtgaFAYUBtgbUARUJEAkSCRIJEAm2BhUJFAkQCRAJFAkPCRQJEwkPCQ8JEwkOCRMJgwMOCQ4JgwMNCYMDggMNCQ0JggMMCUYEDAmCA3YGDAlGBEYEhAOAAz4BQQlAAUABQQlCCUQBQwlCAUIBQwlECUIBRAk+AT4BRAlBCQwBCQFFCUUJCQFGCQoBEgFHCUcJEgFICQkBCgFGCUYJCgFHCSEBDAFJCUkJDAFFCUABQgkTARMBQglKCRIBEwFICUgJEwFKCRsBFAEdAR0BFAEeAWUBSwkXARcBSwlMCRcBTAkZARkBTAlNCR0BHgEkASQBHgEiAWUBIQFLCUsJIQFJCSQBIgEmASYBIgEnASYBJwEqASoBJwEoASwBKgEtAS0BKgEoATsBLAE5ATkBLAEtATYBNwFOCU4JNwFPCTMBOwEvAS8BOwE5ATIBMwEuAS4BMwEvAUQBNgFDCUMJNgFOCRwDGgNQCVAJGgNRCRcDGANSCVIJGANTCRoDFwNRCVEJFwNSCeICVAnpAukCVAlVCeQCVgngAuACVglXCeACVwniAuICVwlUCfkCWAnkAuQCWAlWCRgD6wJTCVMJ6wJZCekCVQnrAusCVQlZCTwD8AJaCVoJ8AJbCfQC9QLsAuwC9QL2AvAC8QJbCVsJ8QJcCfUC/AL2AvYC/AL6AjwDWgn5AvkCWglYCfwC/gL6AvoC/gL/Av4CAgP/Av8CAgMAAwQDBQMCAwIDBQMAAxMDEQMEAwQDEQMFAwsDBgMTAxMDBgMRAw0DXQkPAw8DXQleCQkDBwMLAwsDBwMGAxwDUAkNAw0DUAldCWIIFwgWCD0FPAU/BQ==\"\n        }\n    ]\n}\n"
  },
  {
    "path": "examples/resources/models/gltf/Duck/glTF-pbrSpecularGlossiness/Duck.gltf",
    "content": "{\n    \"asset\": {\n        \"generator\": \"COLLADA2GLTF\",\n        \"version\": \"2.0\"\n    },\n    \"scene\": 0,\n    \"scenes\": [\n        {\n            \"nodes\": [\n                0\n            ]\n        }\n    ],\n    \"nodes\": [\n        {\n            \"children\": [\n                2,\n                1\n            ],\n            \"matrix\": [\n                0.009999999776482582,\n                0.0,\n                0.0,\n                0.0,\n                0.0,\n                0.009999999776482582,\n                0.0,\n                0.0,\n                0.0,\n                0.0,\n                0.009999999776482582,\n                0.0,\n                0.0,\n                0.0,\n                0.0,\n                1.0\n            ]\n        },\n        {\n            \"matrix\": [\n                -0.7289686799049377,\n                0.0,\n                -0.6845470666885376,\n                0.0,\n                -0.4252049028873444,\n                0.7836934328079224,\n                0.4527972936630249,\n                0.0,\n                0.5364750623703003,\n                0.6211478114128113,\n                -0.571287989616394,\n                0.0,\n                400.1130065917969,\n                463.2640075683594,\n                -431.0780334472656,\n                1.0\n            ],\n            \"camera\": 0\n        },\n        {\n            \"mesh\": 0\n        }\n    ],\n    \"cameras\": [\n        {\n            \"perspective\": {\n                \"aspectRatio\": 1.5,\n                \"yfov\": 0.6605925559997559,\n                \"zfar\": 10000.0,\n                \"znear\": 1.0\n            },\n            \"type\": \"perspective\"\n        }\n    ],\n    \"meshes\": [\n        {\n            \"primitives\": [\n                {\n                    \"attributes\": {\n                        \"NORMAL\": 1,\n                        \"POSITION\": 2,\n                        \"TEXCOORD_0\": 3\n                    },\n                    \"indices\": 0,\n                    \"mode\": 4,\n                    \"material\": 0\n                }\n            ],\n            \"name\": \"LOD3spShape\"\n        }\n    ],\n    \"accessors\": [\n        {\n            \"bufferView\": 0,\n            \"byteOffset\": 0,\n            \"componentType\": 5123,\n            \"count\": 12636,\n            \"max\": [\n                2398\n            ],\n            \"min\": [\n                0\n            ],\n            \"type\": \"SCALAR\"\n        },\n        {\n            \"bufferView\": 1,\n            \"byteOffset\": 0,\n            \"componentType\": 5126,\n            \"count\": 2399,\n            \"max\": [\n                0.9995989799499512,\n                0.999580979347229,\n                0.9984359741210938\n            ],\n            \"min\": [\n                -0.9990839958190918,\n                -1.0,\n                -0.9998319745063782\n            ],\n            \"type\": \"VEC3\"\n        },\n        {\n            \"bufferView\": 1,\n            \"byteOffset\": 28788,\n            \"componentType\": 5126,\n            \"count\": 2399,\n            \"max\": [\n                96.17990112304688,\n                163.97000122070313,\n                53.92519760131836\n            ],\n            \"min\": [\n                -69.29850006103516,\n                9.929369926452637,\n                -61.32819747924805\n            ],\n            \"type\": \"VEC3\"\n        },\n        {\n            \"bufferView\": 2,\n            \"byteOffset\": 0,\n            \"componentType\": 5126,\n            \"count\": 2399,\n            \"max\": [\n                0.9833459854125976,\n                0.9800369739532472\n            ],\n            \"min\": [\n                0.026409000158309938,\n                0.01996302604675293\n            ],\n            \"type\": \"VEC2\"\n        }\n    ],\n    \"materials\": [\n        {\n            \"pbrMetallicRoughness\": {\n                \"baseColorTexture\": {\n                    \"index\": 0\n                },\n                \"metallicFactor\": 0.0\n            },\n            \"emissiveFactor\": [\n                0.0,\n                0.0,\n                0.0\n            ],\n            \"extensions\": {\n                \"KHR_materials_pbrSpecularGlossiness\": {\n                    \"diffuseTexture\": {\n                        \"index\": 0\n                    },\n                    \"specularFactor\": [\n                        0.0,\n                        0.0,\n                        0.0\n                    ],\n                    \"glossinessFactor\": 0.30000001192092898\n                }\n            },\n            \"name\": \"blinn3-fx\"\n        }\n    ],\n    \"textures\": [\n        {\n            \"sampler\": 0,\n            \"source\": 0\n        }\n    ],\n    \"images\": [\n        {\n            \"uri\": \"DuckCM.png\"\n        }\n    ],\n    \"samplers\": [\n        {\n            \"magFilter\": 9729,\n            \"minFilter\": 9986,\n            \"wrapS\": 10497,\n            \"wrapT\": 10497\n        }\n    ],\n    \"bufferViews\": [\n        {\n            \"buffer\": 0,\n            \"byteOffset\": 76768,\n            \"byteLength\": 25272,\n            \"target\": 34963\n        },\n        {\n            \"buffer\": 0,\n            \"byteOffset\": 0,\n            \"byteLength\": 57576,\n            \"byteStride\": 12,\n            \"target\": 34962\n        },\n        {\n            \"buffer\": 0,\n            \"byteOffset\": 57576,\n            \"byteLength\": 19192,\n            \"byteStride\": 8,\n            \"target\": 34962\n        }\n    ],\n    \"buffers\": [\n        {\n            \"byteLength\": 102040,\n            \"uri\": \"Duck0.bin\"\n        }\n    ],\n    \"extensionsUsed\": [\n        \"KHR_materials_pbrSpecularGlossiness\"\n    ]\n}\n"
  },
  {
    "path": "examples/resources/models/gltf/GlamVelvetSofa/README.md",
    "content": "# GlamVelvetSofa\n\n## Screenshot\n\n![screenshot](screenshot/screenshot_large.jpg)\n\nAbove: screenshot from the [Babylon.js Sandbox](https://sandbox.babylonjs.com/).\n\n## Description\n\nThis model represents a real product, a velvet sofa bed being sold [on the Wayfair website](https://www.wayfair.com/furniture/pdp/mercer41-frankie-velvet-86-recessed-arm-sofa-bed-mcrf6337.html). \n\nThe model is made of three parts, each with their own materials. Two 1024x1024 PNG textures are used for the whole model, an ambient occlusion map and a normal bump map. All UVs are arranged between 0 and 1, and `KHR_texture_transform` is used to repeat the normal map for the fabric. The model uses 4319 triangles and 3204 vertices.\n\nThe model uses several extensions: \n* [KHR_lights_punctual](https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_lights_punctual) to provide a key light for better velvet illumination. Sheen seems to respond better to punctual lights than with image-based lighting alone.\n* [KHR_materials_sheen](https://github.com/KhronosGroup/glTF/blob/master/extensions/2.0/Khronos/KHR_materials_sheen) for velvet sheen.\n* [KHR_materials_specular](https://github.com/KhronosGroup/glTF/pull/1719) to colorize facing-angle reflections, which occurs with some fabrics (satins, silks, velvets, etc.).\n* [KHR_materials_variants](https://github.com/KhronosGroup/glTF/blob/master/extensions/2.0/Khronos/KHR_materials_variants/README.md) to represent the five fabric color options on this product.\n* [KHR_texture_transform](https://github.com/KhronosGroup/glTF/blob/master/extensions/2.0/Khronos/KHR_texture_transform/README.md) to scale the normal bump texture separately from the ambient occlusion texture.\n\n## Reference Photos\n\nThe use of real-world photographic reference is meant to help glTF developers with calibrating material features and renderer behavior, so we can more accurately represent e-commerce products. Additional photo reference is available [on the Wayfair website](https://www.wayfair.com/furniture/pdp/mercer41-frankie-velvet-86-recessed-arm-sofa-bed-mcrf6337.html).\n\nThe official photos of the product have been retouched to emphasize materials and finishes, a common practice in retail photography. This can make the materials difficult to reproduce in a 3D model, as it's tricky to isolate accurate base colors, roughness, specular color, etc. Sometimes a physical sample of the surface is difficult to obtain, and prescribing controlled photography can be onerous for manufacturers.\n\nFortunately, we can rely on customer review photos to provide additional material reference. Although lighting can be poor, customer photos are often unretouched which can offer a less-biased view of the surface materials. The ground truth is usually somewhere in the middle, since the official photography provides higher resolution and controlled lighting, while the customer imagery provides little or no retouching.\n\n![photo references](screenshot/photoreference_vs_customer.jpg)\n\nPhoto references of the product. Top row: official product photography, bottom row: customer review photography\n\n## KHR_materials_variants\n\nThe model uses the extension [KHR_materials_variants](https://github.com/KhronosGroup/glTF/blob/master/extensions/2.0/Khronos/KHR_materials_variants/README.md) to add five fabric variants. Each uses slightly different UV offsets via `KHR_texture_transform` to add variety.\n* Black\n* Champagne\n* Gray\n* Navy\n* Pale Pink\n\n![screenshots of the five variants](screenshot/screenshot_variants.jpg)\n\n## KHR_materials_sheen and KHR_materials_specular\n\nThe extension [KHR_materials_sheen](https://github.com/KhronosGroup/glTF/blob/master/extensions/2.0/Khronos/KHR_materials_sheen) is used for the main fabric color; it best represents how velvet microfibers interact with lighting at glancing angles.\n\n[KHR_materials_specular](https://github.com/KhronosGroup/glTF/pull/1719) is used to colorize reflections on dielectric (non-metal) surfaces. Velvet, satin, silk, and similar fabrics can colorize reflections which makes them difficult to replicate in a traditional PBR metal-rough material. \n\n![screenshots of how the various material layers combine together](screenshot/screenshot_layers.jpg)\n\nTop to bottom: base color alone, sheen color added, specular color added.\n\nA normalTexture simulates the bending of velvet microfibers from human touches, by bending the surface normals to point at different areas of the image-based lighting. The texture is a combination of tiled \"grunge\" patterns. The red channel was rotated 90 degrees to create variation, the blue channel was filled with white, and a cotton-weave normal map was overlaid. Then the texture was re-normalized. \n\n![the fabric normalTexture](screenshot/normalTexture.jpg)\n\nThe normal map, enlarged and cropped to show detail.\n\n## KHR_lights_punctual\n\nThe extension [KHR_lights_punctual](https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_lights_punctual) is used to add a directional light to the model, with its Intensity set to 3. This provides better velvet illumination, as sheen responds better to punctual lights than to image-based lighting (IBL) alone. \n\nThis is highly dependent on the exposure range in each IBL, however most IBLs do not capture strong exposure values for the lights unless the sun or a suitably bright light source are present. In these examples, the \"studio\" IBL from Babylon.js was used, which uses +2.40 stops for each light. \n\nAugmented reality IBLs typically contain a low value range, as they're often created by transforming the view from the mobile device's front camera. It is hoped the addition of a punctual light can restore the benefits of strong key light to improve the sheen response. \n\n![screenshots with punctual enabled and disabled](screenshot/screenshot_punctual.jpg)\n\nTop: Punctual light improves sheen. Bottom: Disabling the punctual light.\n\n## Authoring Details ##\n\nThe model was created with [3ds Max](https://www.autodesk.com/products/3ds-max/) and exported to glTF via the [Max2Babylon](https://github.com/BabylonJS/Exporters/tree/master/3ds%20Max) exporter. The glTF file was then edited manually in [Visual Studio Code](https://code.visualstudio.com) with the [glTF Tools](https://github.com/AnalyticalGraphicsInc/gltf-vscode) extension to add KHR extensions and fine-tune material values.\n\n## License Information\n\n(C) 2021, Wayfair LLC. CC-BY 4.0 International https://creativecommons.org/licenses/by/4.0/. \n"
  },
  {
    "path": "examples/resources/models/gltf/GlamVelvetSofa/glTF/GlamVelvetSofa.gltf",
    "content": "{\n    \"asset\": {\n        \"version\": \"2.0\",\n        \"copyright\": \"(c) 2021 Wayfair, CC BY 4.0.\",\n        \"generator\": \"Created in 3ds Max, exported with babylon.js glTF exporter, and hand-edited in VSCode with glTF Tools\"\n    },\n    \"extensionsUsed\": [\n        \"KHR_texture_transform\",\n        \"KHR_materials_sheen\",\n        \"KHR_materials_specular\",\n        \"KHR_materials_variants\",\n        \"KHR_lights_punctual\"\n    ],\n    \"extensionsRequired\": [\n        \"KHR_texture_transform\"\n    ],\n    \"extensions\": {\n        \"KHR_lights_punctual\": {\n            \"lights\": [\n                {\n                    \"type\": \"directional\",\n                    \"intensity\": 3\n                }\n            ]\n        },\n        \"KHR_materials_variants\": {\n            \"variants\": [\n                {\n                    \"name\": \"Champagne\"\n                },\n                {\n                    \"name\": \"Navy\"\n                },\n                {\n                    \"name\": \"Gray\"\n                },\n                {\n                    \"name\": \"Black\"\n                },\n                {\n                    \"name\": \"Pale Pink\"\n                }\n            ]\n        }\n    },\n    \"scene\": 0,\n    \"scenes\": [\n        {\n            \"nodes\": [\n                0,\n                1,\n                2,\n                3\n            ]\n        }\n    ],\n    \"nodes\": [\n        {\n            \"mesh\": 0,\n            \"name\": \"GlamVelvetSofa_legs\"\n        },\n        {\n            \"mesh\": 1,\n            \"name\": \"GlamVelvetSofa_fabric\"\n        },\n        {\n            \"mesh\": 2,\n            \"name\": \"GlamVelvetSofa_feet\"\n        },\n        {\n            \"translation\": [\n                0,\n                0,\n                0\n            ],\n            \"rotation\": [\n                -0.13959079166529637,\n                -0.6590063691119785,\n                -0.12632793024247307,\n                0.7281938412213848\n            ],\n            \"scale\": [\n                1,\n                1,\n                1\n            ],\n            \"name\": \"Key Light\",\n            \"extensions\": {\n                \"KHR_lights_punctual\": {\n                    \"light\": 0\n                }\n            }\n        }\n    ],\n    \"meshes\": [\n        {\n            \"primitives\": [\n                {\n                    \"attributes\": {\n                        \"POSITION\": 1,\n                        \"NORMAL\": 2,\n                        \"TEXCOORD_0\": 3\n                    },\n                    \"indices\": 0,\n                    \"material\": 0\n                }\n            ],\n            \"name\": \"GlamVelvetSofa_legs\"\n        },\n        {\n            \"primitives\": [\n                {\n                    \"attributes\": {\n                        \"POSITION\": 5,\n                        \"NORMAL\": 6,\n                        \"TEXCOORD_0\": 7\n                    },\n                    \"extensions\": {\n                        \"KHR_materials_variants\": {\n                            \"mappings\": [\n                                {\n                                    \"material\": 2,\n                                    \"variants\": [\n                                        0\n                                    ]\n                                },\n                                {\n                                    \"material\": 3,\n                                    \"variants\": [\n                                        1\n                                    ]\n                                },\n                                {\n                                    \"material\": 4,\n                                    \"variants\": [\n                                        2\n                                    ]\n                                },\n                                {\n                                    \"material\": 5,\n                                    \"variants\": [\n                                        3\n                                    ]\n                                },\n                                {\n                                    \"material\": 6,\n                                    \"variants\": [\n                                        4\n                                    ]\n                                }\n                            ]\n                        }\n                    },\n                    \"indices\": 4,\n                    \"material\": 3\n                }\n            ],\n            \"name\": \"GlamVelvetSofa_fabric\"\n        },\n        {\n            \"primitives\": [\n                {\n                    \"attributes\": {\n                        \"POSITION\": 9,\n                        \"NORMAL\": 10,\n                        \"TEXCOORD_0\": 11\n                    },\n                    \"indices\": 8,\n                    \"material\": 1\n                }\n            ],\n            \"name\": \"GlamVelvetSofa_feet\"\n        }\n    ],\n    \"accessors\": [\n        {\n            \"bufferView\": 0,\n            \"componentType\": 5123,\n            \"count\": 918,\n            \"type\": \"SCALAR\",\n            \"name\": \"accessorIndices\"\n        },\n        {\n            \"bufferView\": 1,\n            \"componentType\": 5126,\n            \"count\": 342,\n            \"max\": [\n                0.967309833,\n                0.228355348,\n                0.392912269\n            ],\n            \"min\": [\n                -1.07995892,\n                4.544779E-05,\n                -0.62551266\n            ],\n            \"type\": \"VEC3\",\n            \"name\": \"accessorPositions\"\n        },\n        {\n            \"bufferView\": 1,\n            \"byteOffset\": 4104,\n            \"componentType\": 5126,\n            \"count\": 342,\n            \"type\": \"VEC3\",\n            \"name\": \"accessorNormals\"\n        },\n        {\n            \"bufferView\": 2,\n            \"componentType\": 5126,\n            \"count\": 342,\n            \"type\": \"VEC2\",\n            \"name\": \"accessorUVs\"\n        },\n        {\n            \"bufferView\": 0,\n            \"byteOffset\": 1836,\n            \"componentType\": 5123,\n            \"count\": 9726,\n            \"type\": \"SCALAR\",\n            \"name\": \"accessorIndices\"\n        },\n        {\n            \"bufferView\": 1,\n            \"byteOffset\": 8208,\n            \"componentType\": 5126,\n            \"count\": 2092,\n            \"max\": [\n                1.07446992,\n                0.7875869,\n                0.382825553\n            ],\n            \"min\": [\n                -1.11397314,\n                0.211583689,\n                -0.6070921\n            ],\n            \"type\": \"VEC3\",\n            \"name\": \"accessorPositions\"\n        },\n        {\n            \"bufferView\": 1,\n            \"byteOffset\": 33312,\n            \"componentType\": 5126,\n            \"count\": 2092,\n            \"type\": \"VEC3\",\n            \"name\": \"accessorNormals\"\n        },\n        {\n            \"bufferView\": 2,\n            \"byteOffset\": 2736,\n            \"componentType\": 5126,\n            \"count\": 2092,\n            \"type\": \"VEC2\",\n            \"name\": \"accessorUVs\"\n        },\n        {\n            \"bufferView\": 0,\n            \"byteOffset\": 21288,\n            \"componentType\": 5123,\n            \"count\": 1944,\n            \"type\": \"SCALAR\",\n            \"name\": \"accessorIndices\"\n        },\n        {\n            \"bufferView\": 1,\n            \"byteOffset\": 58416,\n            \"componentType\": 5126,\n            \"count\": 684,\n            \"max\": [\n                0.969506,\n                0.0342675373,\n                0.3951283\n            ],\n            \"min\": [\n                -1.08214879,\n                4.544779E-05,\n                -0.627700269\n            ],\n            \"type\": \"VEC3\",\n            \"name\": \"accessorPositions\"\n        },\n        {\n            \"bufferView\": 1,\n            \"byteOffset\": 66624,\n            \"componentType\": 5126,\n            \"count\": 684,\n            \"type\": \"VEC3\",\n            \"name\": \"accessorNormals\"\n        },\n        {\n            \"bufferView\": 2,\n            \"byteOffset\": 19472,\n            \"componentType\": 5126,\n            \"count\": 684,\n            \"type\": \"VEC2\",\n            \"name\": \"accessorUVs\"\n        }\n    ],\n    \"bufferViews\": [\n        {\n            \"buffer\": 0,\n            \"byteLength\": 25176,\n            \"name\": \"bufferViewScalar\"\n        },\n        {\n            \"buffer\": 0,\n            \"byteOffset\": 25176,\n            \"byteLength\": 74832,\n            \"byteStride\": 12,\n            \"name\": \"bufferViewFloatVec3\"\n        },\n        {\n            \"buffer\": 0,\n            \"byteOffset\": 100008,\n            \"byteLength\": 24944,\n            \"byteStride\": 8,\n            \"name\": \"bufferViewFloatVec2\"\n        }\n    ],\n    \"buffers\": [\n        {\n            \"uri\": \"GlamVelvetSofa.bin\",\n            \"byteLength\": 124952\n        }\n    ],\n    \"materials\": [\n        {\n            \"name\": \"GlamVelvetSofa_legs\",\n            \"pbrMetallicRoughness\": {\n                \"baseColorFactor\": [\n                    0.02,\n                    0.02,\n                    0.02,\n                    1.0\n                ],\n                \"metallicFactor\": 0.0,\n                \"roughnessFactor\": 0.4\n            },\n            \"occlusionTexture\": {\n                \"index\": 0\n            }\n        },\n        {\n            \"name\": \"GlamVelvetSofa_feet\",\n            \"pbrMetallicRoughness\": {\n                \"baseColorFactor\": [\n                    1.0,\n                    0.8,\n                    0.7,\n                    1.0\n                ],\n                \"roughnessFactor\": 0.4\n            },\n            \"occlusionTexture\": {\n                \"index\": 0\n            }\n        },\n        {\n            \"name\": \"GlamVelvetSofa_fabric_champagne\",\n            \"pbrMetallicRoughness\": {\n                \"baseColorFactor\": [\n                    0.075,\n                    0.06,\n                    0.04,\n                    1\n                ],\n                \"metallicFactor\": 0,\n                \"roughnessFactor\": 0.7\n            },\n            \"normalTexture\": {\n                \"index\": 1,\n                \"scale\": 0.5,\n                \"extensions\": {\n                    \"KHR_texture_transform\": {\n                        \"rotation\": 0,\n                        \"scale\": [\n                            5,\n                            5\n                        ],\n                        \"texCoord\": 0\n                    }\n                }\n            },\n            \"occlusionTexture\": {\n                \"index\": 0\n            },\n            \"extensions\": {\n                \"KHR_materials_specular\": {\n                    \"specularColorFactor\": [\n                        0,\n                        0,\n                        0\n                    ]\n                },\n                \"KHR_materials_sheen\": {\n                    \"sheenColorFactor\": [\n                        0.9,\n                        0.7,\n                        0.6\n                    ],\n                    \"sheenRoughnessFactor\": 0.6\n                }\n            }\n        },\n        {\n            \"name\": \"GlamVelvetSofa_fabric_navy\",\n            \"pbrMetallicRoughness\": {\n                \"baseColorFactor\": [\n                    0.01,\n                    0.01,\n                    0.01,\n                    1\n                ],\n                \"metallicFactor\": 0,\n                \"roughnessFactor\": 0.7\n            },\n            \"normalTexture\": {\n                \"index\": 1,\n                \"scale\": 0.75,\n                \"extensions\": {\n                    \"KHR_texture_transform\": {\n                        \"rotation\": 0.36,\n                        \"scale\": [\n                            5,\n                            5\n                        ],\n                        \"texCoord\": 0\n                    }\n                }\n            },\n            \"occlusionTexture\": {\n                \"index\": 0\n            },\n            \"extensions\": {\n                \"KHR_materials_specular\": {\n                    \"specularColorFactor\": [\n                        0.1,\n                        0.34,\n                        1\n                    ]\n                },\n                \"KHR_materials_sheen\": {\n                    \"sheenColorFactor\": [\n                        0.05,\n                        0.17,\n                        0.5\n                    ],\n                    \"sheenRoughnessFactor\": 0.6\n                }\n            }\n        },\n        {\n            \"name\": \"GlamVelvetSofa_fabric_gray\",\n            \"pbrMetallicRoughness\": {\n                \"baseColorFactor\": [\n                    0.25,\n                    0.25,\n                    0.225,\n                    1\n                ],\n                \"metallicFactor\": 0,\n                \"roughnessFactor\": 1\n            },\n            \"normalTexture\": {\n                \"index\": 1,\n                \"scale\": 0.3,\n                \"extensions\": {\n                    \"KHR_texture_transform\": {\n                        \"rotation\": 1.5,\n                        \"scale\": [\n                            5,\n                            5\n                        ],\n                        \"texCoord\": 0\n                    }\n                }\n            },\n            \"occlusionTexture\": {\n                \"index\": 0\n            },\n            \"extensions\": {\n                \"KHR_materials_specular\": {\n                    \"specularColorFactor\": [\n                        0,\n                        0,\n                        0\n                    ]\n                },\n                \"KHR_materials_sheen\": {\n                    \"sheenColorFactor\": [\n                        0.85,\n                        0.9,\n                        1\n                    ],\n                    \"sheenRoughnessFactor\": 1\n                }\n            }\n        },\n        {\n            \"name\": \"GlamVelvetSofa_fabric_black\",\n            \"pbrMetallicRoughness\": {\n                \"baseColorFactor\": [\n                    0.01,\n                    0.01,\n                    0.01,\n                    1\n                ],\n                \"metallicFactor\": 0,\n                \"roughnessFactor\": 0.5\n            },\n            \"normalTexture\": {\n                \"index\": 1,\n                \"scale\": 0.4,\n                \"extensions\": {\n                    \"KHR_texture_transform\": {\n                        \"rotation\": 2,\n                        \"scale\": [\n                            5,\n                            5\n                        ],\n                        \"texCoord\": 0\n                    }\n                }\n            },\n            \"occlusionTexture\": {\n                \"index\": 0\n            },\n            \"extensions\": {\n                \"KHR_materials_specular\": {\n                    \"specularColorFactor\": [\n                        0.12,\n                        0.12,\n                        0.13\n                    ]\n                },\n                \"KHR_materials_sheen\": {\n                    \"sheenColorFactor\": [\n                        0.12,\n                        0.12,\n                        0.13\n                    ],\n                    \"sheenRoughnessFactor\": 0.3\n                }\n            }\n        },\n        {\n            \"name\": \"GlamVelvetSofa_fabric_palepink\",\n            \"pbrMetallicRoughness\": {\n                \"baseColorFactor\": [\n                    0.76,\n                    0.53,\n                    0.54,\n                    1\n                ],\n                \"metallicFactor\": 0,\n                \"roughnessFactor\": 0.75\n            },\n            \"normalTexture\": {\n                \"index\": 1,\n                \"scale\": 0.2,\n                \"extensions\": {\n                    \"KHR_texture_transform\": {\n                        \"rotation\": 2.5,\n                        \"scale\": [\n                            5,\n                            5\n                        ],\n                        \"texCoord\": 0\n                    }\n                }\n            },\n            \"occlusionTexture\": {\n                \"index\": 0\n            },\n            \"extensions\": {\n                \"KHR_materials_specular\": {\n                    \"specularColorFactor\": [\n                        1,\n                        0.9,\n                        0.9\n                    ]\n                },\n                \"KHR_materials_sheen\": {\n                    \"sheenColorFactor\": [\n                        1,\n                        0.9,\n                        0.9\n                    ],\n                    \"sheenRoughnessFactor\": 0.85\n                }\n            }\n        }\n    ],\n    \"textures\": [\n        {\n            \"sampler\": 0,\n            \"source\": 0,\n            \"name\": \"GlamVelvetSofa_occlusion.png\"\n        },\n        {\n            \"sampler\": 0,\n            \"source\": 1,\n            \"name\": \"GlamVelvetSofa_normal.png\"\n        }\n    ],\n    \"images\": [\n        {\n            \"uri\": \"GlamVelvetSofa_occlusion.png\"\n        },\n        {\n            \"uri\": \"GlamVelvetSofa_normal.png\"\n        }\n    ],\n    \"samplers\": [\n        {\n            \"magFilter\": 9729,\n            \"minFilter\": 9987\n        }\n    ]\n}"
  },
  {
    "path": "examples/resources/models/gltf/LeePerrySmith/LeePerrySmith_License.txt",
    "content": "Creative Commons Licence\nInfinite, 3D Head Scan by Lee Perry-Smith is licensed under a Creative Commons Attribution 3.0 Unported License.\nBased on a work at www.triplegangers.com.\nPermissions beyond the scope of this license may be available at http://www.ir-ltd.net/\nPlease remember: Do what you want with the files, but always mention where you got them from...\n"
  },
  {
    "path": "examples/resources/models/gltf/NormalTangentMirrorTest/README.md",
    "content": "# Normal-Tangent Mirror Test\n\n## Screenshot\n\n![screenshot](screenshot/screenshot-larger.png)\n\n## Description\n\nThis model compares normal maps of various orientations to actual geometry, to test if the model's supplied tangent vectors are being imported and used correctly.  Note that this model (`NormalTangentMirrorTest`) supplies tangent vectors, and specifically tests a rendering engine's ability to use the supplied vectors as opposed to generating them automatically.  To test automatic generation of tangent vectors, see [`NormalTangentTest`](../NormalTangentTest/README.md).\n\nThis test is best performed with an environment map that contains a clear horizon line, so it is easy to spot if the reflection of the horizon is level.  The screenshot above shows a successful render of this model from the front.  All of the test blocks show similar reflections.\n\n## Top Down\n\n![Top-down View](screenshot/top-down.png)\n\nViewing off-axis, such as top-down in this case, breaks the illusion provided by normal-mapping.  From this angle, the viewer can see the difference between real geometry on the left test cells, and normal-mapped quads on the rest.  Normal-mapping works best when viewed face-on.\n\n## Back Side\n\n![Back-side View](screenshot/back-side.png)\n\nThe back of the model shows concave geometry and normal maps, like looking into a set of mirror-bowls.  It is expected to see the sky below the ground in the reflections.  Above is a correct rendering of the back.\n\n## Problem: Supplied Tangent Vectors Not Used\n\n![Supplied Tangents Ignored](screenshot/supplied-tangents-ignored.png)\n\nThe above image was taken in a different rendering engine with a different environment map, but the results should still be clear.  A red border has been added for emphasis on the incorrect results.  Here, the horizon line appears level in all the test blocks, but the two \"Mirror\" sets of tests show inverted reflections, as if seen from the back instead of the front.\n\nThis problem is typically caused by a rendering engine that ignores the supplied tangent vectors and calculates its own.  Without the supplied tangent vectors, the engine does not know that the geometry has been mirrored from the original normal-mapped column, and it calculates an inverted set of axes for the reflection vectors.\n\n## Problem: Flipped Y Axis (or flipped green channel)\n\n![Incorrect flipped Y](screenshot/incorrect-flipped-y.png)\n\nIn the above image, note the test cells on the right three blocks of each set.  A red border has been added for emphasis on the incorrect results.  Here, the real geometry reflects level horizon lines, but the normal-mapped geometry appears to reflect several different orientations.\n\nThis is a common problem, that often indicates the rendering engine has mis-interpreted the direction of the normal Y vector, supplied by the green channel of the normal map.  Some systems intentionally use or expect left-handed normal maps, however, glTF [specifies](https://github.com/KhronosGroup/glTF/tree/065a01206014cd5f198085de6b4ce6f565ae79c6/specification/2.0#materialnormaltexture) that its own normal maps should use the OpenGL convention with right-handed coordinates.  This issue can often be fixed by flipping the normal Y vector, or inverting the intensity of the green channel of the normal map.  Fixes should be applied such that glTF models contain only the specified OpenGL normal convention, and rendering engines automatically adapt this to their own internal convention as needed.\n\n## License Information\n\nCopyright 2017-2018 Analytical Graphics, Inc.\nCC-BY 4.0 https://creativecommons.org/licenses/by/4.0/\nModel and textures by Ed Mackey.\n"
  },
  {
    "path": "examples/resources/models/gltf/NormalTangentMirrorTest/glTF/NormalTangentMirrorTest.gltf",
    "content": "{\n    \"accessors\" : [\n        {\n            \"bufferView\" : 0, \n            \"componentType\" : 5123, \n            \"count\" : 15720, \n            \"max\" : [\n                2769\n            ], \n            \"min\" : [\n                0\n            ], \n            \"type\" : \"SCALAR\"\n        }, \n        {\n            \"bufferView\" : 1, \n            \"componentType\" : 5126, \n            \"count\" : 2770, \n            \"max\" : [\n                1.4138822555541992, \n                1.0467524528503418, \n                0.08050008118152618\n            ], \n            \"min\" : [\n                -1.4246257543563843, \n                -1.2000000476837158, \n                -0.009999947622418404\n            ], \n            \"type\" : \"VEC3\"\n        }, \n        {\n            \"bufferView\" : 2, \n            \"componentType\" : 5126, \n            \"count\" : 2770, \n            \"max\" : [\n                0.9247413277626038, \n                0.9247413277626038, \n                1.0\n            ], \n            \"min\" : [\n                -0.9247413277626038, \n                -0.9247413277626038, \n                -1.0\n            ], \n            \"type\" : \"VEC3\"\n        }, \n        {\n            \"bufferView\" : 3, \n            \"componentType\" : 5126, \n            \"count\" : 2770, \n            \"max\" : [\n                1.0, \n                0.8718903064727783, \n                0.9247627258300781, \n                1.0\n            ], \n            \"min\" : [\n                -1.0, \n                -0.8827678561210632, \n                -0.9247735142707825, \n                -1.0\n            ], \n            \"type\" : \"VEC4\"\n        }, \n        {\n            \"bufferView\" : 4, \n            \"componentType\" : 5126, \n            \"count\" : 2770, \n            \"max\" : [\n                0.9821357727050781, \n                0.9877346605062485\n            ], \n            \"min\" : [\n                0.1472877860069275, \n                0.03816509246826172\n            ], \n            \"type\" : \"VEC2\"\n        }\n    ], \n    \"asset\" : {\n        \"copyright\" : \"Copyright 2017-2018 Analytical Graphics, Inc., CC-BY 4.0 https://creativecommons.org/licenses/by/4.0/ - Mesh and textures by Ed Mackey.\", \n        \"generator\" : \"Khronos Blender glTF 2.0 exporter\", \n        \"version\" : \"2.0\"\n    }, \n    \"bufferViews\" : [\n        {\n            \"buffer\" : 0, \n            \"byteLength\" : 31440, \n            \"byteOffset\" : 0, \n            \"target\" : 34963\n        }, \n        {\n            \"buffer\" : 0, \n            \"byteLength\" : 33240, \n            \"byteOffset\" : 31440, \n            \"target\" : 34962\n        }, \n        {\n            \"buffer\" : 0, \n            \"byteLength\" : 33240, \n            \"byteOffset\" : 64680, \n            \"target\" : 34962\n        }, \n        {\n            \"buffer\" : 0, \n            \"byteLength\" : 44320, \n            \"byteOffset\" : 97920, \n            \"target\" : 34962\n        }, \n        {\n            \"buffer\" : 0, \n            \"byteLength\" : 22160, \n            \"byteOffset\" : 142240, \n            \"target\" : 34962\n        }\n    ], \n    \"buffers\" : [\n        {\n            \"byteLength\" : 164400, \n            \"uri\" : \"NormalTangentMirrorTest.bin\"\n        }\n    ], \n    \"images\" : [\n        {\n            \"uri\" : \"NormalTangentMirrorTest_OcclusionRoughnessMetallic.png\"\n        }, \n        {\n            \"uri\" : \"NormalTangentTest_Normal.png\"\n        }, \n        {\n            \"uri\" : \"NormalTangentMirrorTest_BaseColor.png\"\n        }\n    ], \n    \"materials\" : [\n        {\n            \"doubleSided\" : true, \n            \"name\" : \"Material\", \n            \"normalTexture\" : {\n                \"index\" : 1\n            }, \n            \"occlusionTexture\" : {\n                \"index\" : 0\n            }, \n            \"pbrMetallicRoughness\" : {\n                \"baseColorTexture\" : {\n                    \"index\" : 2\n                }, \n                \"metallicRoughnessTexture\" : {\n                    \"index\" : 0\n                }\n            }\n        }\n    ], \n    \"meshes\" : [\n        {\n            \"name\" : \"NormalTangentTest_low\", \n            \"primitives\" : [\n                {\n                    \"attributes\" : {\n                        \"NORMAL\" : 2, \n                        \"POSITION\" : 1, \n                        \"TANGENT\" : 3, \n                        \"TEXCOORD_0\" : 4\n                    }, \n                    \"indices\" : 0, \n                    \"material\" : 0\n                }\n            ]\n        }\n    ], \n    \"nodes\" : [\n        {\n            \"mesh\" : 0, \n            \"name\" : \"NormalTangentTest_low\"\n        }\n    ], \n    \"samplers\" : [\n        {}\n    ], \n    \"scene\" : 0, \n    \"scenes\" : [\n        {\n            \"name\" : \"Scene\", \n            \"nodes\" : [\n                0\n            ]\n        }\n    ], \n    \"textures\" : [\n        {\n            \"sampler\" : 0, \n            \"source\" : 0\n        }, \n        {\n            \"sampler\" : 0, \n            \"source\" : 1\n        }, \n        {\n            \"sampler\" : 0, \n            \"source\" : 2\n        }\n    ]\n}\n"
  },
  {
    "path": "examples/resources/models/gltf/NormalTangentTest/README.md",
    "content": "# Normal-Tangent Test\n\n## Screenshot\n\n![screenshot](screenshot/screenshot-larger.png)\n\n## Description\n\nThis model compares normal maps of various orientations to actual geometry, to test if tangent vectors are being calculated and handled correctly.  Note that this model (`NormalTangentTest`) does not supply tangent vectors, and specifically tests a rendering engine's ability to generate the tangent vectors at runtime.  To test supplied tangent vectors, see [`NormalTangentMirrorTest`](../NormalTangentMirrorTest/README.md).\n\nThis test is best performed with an environment map that contains a clear horizon line, so it is easy to spot if the reflection of the horizon is level.  The screenshot above shows a successful render of this model from the front.  All of the test blocks show similar reflections.\n\n## Top down\n\n![Top-down View](screenshot/top-down.png)\n\nViewing off-axis, such as top-down in this case, breaks the illusion provided by normal-mapping.  From this angle, the viewer can see the difference between real geometry on the left test cells, and normal-mapped quads on the right.  Normal-mapping works best when viewed face-on.\n\n## Back Side\n\n![Back-side View](screenshot/back-side.png)\n\nThe back of the model shows concave geometry and normal maps, like looking into a set of mirror-bowls.  It is expected to see the sky below the ground in the reflections.  Above is a correct rendering of the back.\n\n## Problem: Flipped Y Axis (or flipped green channel)\n\n![Incorrect flipped Y](screenshot/incorrect-flipped-y.png)\n\nIn the above image, note the test cells on the right half of each pair.  A red border has been added for emphasis on the incorrect results.  Here, the real geometry reflects level horizon lines, but the normal-mapped geometry appears to reflect several different orientations.\n\nThis is a common problem, that often indicates the rendering engine has mis-interpreted the direction of the normal Y vector, supplied by the green channel of the normal map.  Some systems intentionally use or expect left-handed normal maps, however, glTF [specifies](https://github.com/KhronosGroup/glTF/tree/065a01206014cd5f198085de6b4ce6f565ae79c6/specification/2.0#materialnormaltexture) that its own normal maps should use the OpenGL convention with right-handed coordinates.  This issue can often be fixed by flipping the normal Y vector, or inverting the intensity of the green channel of the normal map.  Fixes should be applied such that glTF models contain only the specified OpenGL normal convention, and rendering engines automatically adapt this to their own internal convention as needed.\n\n## License Information\n\nCopyright 2017-2018 Analytical Graphics, Inc.\nCC-BY 4.0 https://creativecommons.org/licenses/by/4.0/\nModel and textures by Ed Mackey.\n"
  },
  {
    "path": "examples/resources/models/gltf/NormalTangentTest/glTF/NormalTangentTest.gltf",
    "content": "{\n    \"asset\": {\n        \"copyright\": \"Copyright 2017 Analytical Graphics, Inc., CC-BY 4.0 https://creativecommons.org/licenses/by/4.0/ - Mesh and textures by Ed Mackey, see: https://emackey.github.io/testing-pbr/normal-tangent-readme.html\",\n        \"generator\": \"COLLADA2GLTF with hand-edits\",\n        \"version\": \"2.0\"\n    },\n    \"scene\": 0,\n    \"scenes\": [\n        {\n            \"nodes\": [\n                0\n            ]\n        }\n    ],\n    \"nodes\": [\n        {\n            \"children\": [\n                1\n            ]\n        },\n        {\n            \"mesh\": 0\n        }\n    ],\n    \"meshes\": [\n        {\n            \"primitives\": [\n                {\n                    \"attributes\": {\n                        \"NORMAL\": 1,\n                        \"POSITION\": 2,\n                        \"TEXCOORD_0\": 3\n                    },\n                    \"indices\": 0,\n                    \"mode\": 4,\n                    \"material\": 0\n                }\n            ],\n            \"name\": \"NormalTangentTest_low\"\n        }\n    ],\n    \"accessors\": [\n        {\n            \"bufferView\": 0,\n            \"byteOffset\": 0,\n            \"componentType\": 5123,\n            \"count\": 23322,\n            \"max\": [\n                3982\n            ],\n            \"min\": [\n                0\n            ],\n            \"type\": \"SCALAR\"\n        },\n        {\n            \"bufferView\": 1,\n            \"byteOffset\": 0,\n            \"componentType\": 5126,\n            \"count\": 3983,\n            \"max\": [\n                0.9247629046440125,\n                0.9247735142707824,\n                1.0\n            ],\n            \"min\": [\n                -0.9247629046440125,\n                -0.9247629046440125,\n                -1.0\n            ],\n            \"type\": \"VEC3\"\n        },\n        {\n            \"bufferView\": 1,\n            \"byteOffset\": 47796,\n            \"componentType\": 5126,\n            \"count\": 3983,\n            \"max\": [\n                1.1100000143051148,\n                0.9500001072883606,\n                0.08049999922513962\n            ],\n            \"min\": [\n                -1.1100000143051148,\n                -1.200000047683716,\n                -0.009999989531934262\n            ],\n            \"type\": \"VEC3\"\n        },\n        {\n            \"bufferView\": 2,\n            \"byteOffset\": 0,\n            \"componentType\": 5126,\n            \"count\": 3983,\n            \"max\": [\n                0.9821358323097228,\n                0.9877346754074096\n            ],\n            \"min\": [\n                0.0106734000146389,\n                0.03816509246826172\n            ],\n            \"type\": \"VEC2\"\n        }\n    ],\n    \"materials\": [\n        {\n            \"pbrMetallicRoughness\": {\n                \"baseColorTexture\": {\n                    \"index\": 0\n                },\n                \"metallicRoughnessTexture\": {\n                    \"index\": 1\n                }\n            },\n            \"occlusionTexture\": {\n                \"index\": 1\n            },\n            \"normalTexture\": {\n                \"index\": 2\n            },\n            \"doubleSided\": true,\n            \"emissiveFactor\": [\n                0.0,\n                0.0,\n                0.0\n            ]\n        }\n    ],\n    \"textures\": [\n        {\n            \"sampler\": 0,\n            \"source\": 0\n        },\n        {\n            \"sampler\": 0,\n            \"source\": 1\n        },\n        {\n            \"sampler\": 0,\n            \"source\": 2\n        }\n    ],\n    \"images\": [\n        {\n            \"uri\": \"NormalTangentTest_BaseColor.png\"\n        },\n        {\n            \"uri\": \"NormalTangentTest_OcclusionRoughnessMetallic.png\"\n        },\n        {\n            \"uri\": \"NormalTangentTest_Normal.png\"\n        }\n    ],\n    \"samplers\": [\n        {\n            \"magFilter\": 9729,\n            \"minFilter\": 9986,\n            \"wrapS\": 10497,\n            \"wrapT\": 10497\n        }\n    ],\n    \"bufferViews\": [\n        {\n            \"buffer\": 0,\n            \"byteOffset\": 127456,\n            \"byteLength\": 46644,\n            \"target\": 34963\n        },\n        {\n            \"buffer\": 0,\n            \"byteOffset\": 0,\n            \"byteLength\": 95592,\n            \"byteStride\": 12,\n            \"target\": 34962\n        },\n        {\n            \"buffer\": 0,\n            \"byteOffset\": 95592,\n            \"byteLength\": 31864,\n            \"byteStride\": 8,\n            \"target\": 34962\n        }\n    ],\n    \"buffers\": [\n        {\n            \"byteLength\": 174100,\n            \"uri\": \"NormalTangentTest0.bin\"\n        }\n    ]\n}\n"
  },
  {
    "path": "examples/resources/models/gltf/Spheres/Spheres.gltf",
    "content": "{\n  \"materials\": [\n    {\n      \"name\": \"(color 177 88 27)dimi.bmp\",\n      \"occlusionTexture\": {\n        \"index\": 0,\n        \"texCoord\": 1\n      },\n      \"pbrMetallicRoughness\": {\n        \"baseColorFactor\": [\n          0.694117665,\n          0.345098048,\n          0.105882354,\n          1.0\n        ],\n        \"metallicFactor\": 0.1,\n        \"roughnessFactor\": 0.5\n      }\n    },\n    {\n      \"name\": \"01_-_Defaultqiuqiu2.bmp\",\n      \"occlusionTexture\": {\n        \"index\": 1,\n        \"texCoord\": 1\n      },\n      \"pbrMetallicRoughness\": {\n        \"baseColorTexture\": {\n          \"index\": 2,\n          \"texCoord\": 0\n        },\n        \"baseColorFactor\": [\n          1.0,\n          1.0,\n          1.0,\n          1.0\n        ],\n        \"metallicFactor\": 0.0,\n        \"roughnessFactor\": 1\n      },\n      \"alphaMode\": \"OPAQUE\"\n    },\n    {\n      \"name\": \"02_-_Defaultqiuqiu2.bmp\",\n      \"occlusionTexture\": {\n        \"index\": 1,\n        \"texCoord\": 1\n      },\n      \"pbrMetallicRoughness\": {\n        \"baseColorFactor\": [\n          0.5882353,\n          0.5882353,\n          0.5882353,\n          1.0\n        ],\n        \"metallicFactor\": 0.0,\n        \"roughnessFactor\": 0.0\n      },\n      \"alphaMode\": \"OPAQUE\"\n    },\n    {\n      \"name\": \"03_-_Defaultqiuqiu2.bmp\",\n      \"occlusionTexture\": {\n        \"index\": 1,\n        \"texCoord\": 1\n      },\n      \"pbrMetallicRoughness\": {\n        \"baseColorTexture\": {\n          \"index\": 2,\n          \"texCoord\": 0\n        },\n        \"baseColorFactor\": [\n          1.0,\n          1.0,\n          1.0,\n          1.0\n        ],\n        \"metallicFactor\": 1.0,\n        \"roughnessFactor\": 0.0\n      },\n      \"alphaMode\": \"OPAQUE\"\n    },\n    {\n      \"name\": \"04_-_Defaultqiuqiu2.bmp\",\n      \"occlusionTexture\": {\n        \"index\": 1,\n        \"texCoord\": 1\n      },\n      \"pbrMetallicRoughness\": {\n        \"baseColorFactor\": [\n          0.5882353,\n          0.5882353,\n          0.5882353,\n          1.0\n        ],\n        \"metallicFactor\": 1.0,\n        \"roughnessFactor\": 0.6\n      },\n      \"alphaMode\": \"OPAQUE\"\n    },\n    {\n      \"name\": \"05_-_Defaultqiuqiu2.bmp\",\n      \"occlusionTexture\": {\n        \"index\": 1,\n        \"texCoord\": 1\n      },\n      \"pbrMetallicRoughness\": {\n        \"baseColorFactor\": [\n          0.5882353,\n          0.5882353,\n          0.5882353,\n          1.0\n        ],\n        \"metallicFactor\": 0.099999994,\n        \"roughnessFactor\": 1\n      },\n      \"alphaMode\": \"OPAQUE\",\n      \"emissiveFactor\": [\n        0.9882353,\n        0.6745098,\n        0.0,\n        1.0\n      ]\n    },\n    {\n      \"name\": \"06_-_Default\",\n      \"pbrMetallicRoughness\": {\n        \"baseColorTexture\": {\n          \"index\": 2,\n          \"texCoord\": 0\n        },\n        \"baseColorFactor\": [\n          1.0,\n          1.0,\n          1.0,\n          1.0\n        ],\n        \"metallicFactor\": 0.88,\n        \"roughnessFactor\": 0.0\n      },\n      \"alphaMode\": \"OPAQUE\",\n      \"normalTexture\": {\n        \"index\": 3,\n        \"texCoord\": 0,\n        \"scale\": 1.00000012\n      }\n    }\n  ],\n  \"images\": [\n    {\n      \"uri\": \"CC639F155DFE5CE150FF23C3D8F8C459.jpg\"\n    },\n    {\n      \"uri\": \"CC171C0A6CDE0AB24354127556E42957.jpg\"\n    },\n    {\n      \"uri\": \"417DB8B5D7E6316249EF1FB59148873A.jpg\"\n    },\n    {\n      \"uri\": \"8BB764BB7B4C3C1FAFA13B969D4F9CF1.jpg\"\n    }\n  ],\n  \"textures\": [\n    {\n      \"name\": \"dimi_f_bmp.jpg\",\n      \"sampler\": 0,\n      \"source\": 0\n    },\n    {\n      \"name\": \"qiuqiu2_f_bmp.jpg\",\n      \"sampler\": 0,\n      \"source\": 1\n    },\n    {\n      \"name\": \"楼顶2.jpg\",\n      \"sampler\": 0,\n      \"source\": 2\n    },\n    {\n      \"name\": \"水.jpg\",\n      \"sampler\": 0,\n      \"source\": 3\n    }\n  ],\n  \"meshes\": [\n    {\n      \"name\": \"Plane001\",\n      \"primitives\": [\n        {\n          \"material\": 0,\n          \"mode\": 4,\n          \"indices\": 0,\n          \"attributes\": {\n            \"COLOR_0\": 3,\n            \"NORMAL\": 2,\n            \"POSITION\": 1,\n            \"TEXCOORD_0\": 4,\n            \"TEXCOORD_1\": 5\n          }\n        }\n      ]\n    },\n    {\n      \"name\": \"Sphere001\",\n      \"primitives\": [\n        {\n          \"material\": 1,\n          \"mode\": 4,\n          \"indices\": 6,\n          \"attributes\": {\n            \"COLOR_0\": 9,\n            \"NORMAL\": 8,\n            \"POSITION\": 7,\n            \"TEXCOORD_0\": 10,\n            \"TEXCOORD_1\": 11\n          }\n        }\n      ]\n    },\n    {\n      \"name\": \"Sphere002\",\n      \"primitives\": [\n        {\n          \"material\": 2,\n          \"mode\": 4,\n          \"indices\": 12,\n          \"attributes\": {\n            \"COLOR_0\": 15,\n            \"NORMAL\": 14,\n            \"POSITION\": 13,\n            \"TEXCOORD_0\": 16,\n            \"TEXCOORD_1\": 17\n          }\n        }\n      ]\n    },\n    {\n      \"name\": \"Sphere003\",\n      \"primitives\": [\n        {\n          \"material\": 3,\n          \"mode\": 4,\n          \"indices\": 18,\n          \"attributes\": {\n            \"COLOR_0\": 21,\n            \"NORMAL\": 20,\n            \"POSITION\": 19,\n            \"TEXCOORD_0\": 22,\n            \"TEXCOORD_1\": 23\n          }\n        }\n      ]\n    },\n    {\n      \"name\": \"Sphere004\",\n      \"primitives\": [\n        {\n          \"material\": 4,\n          \"mode\": 4,\n          \"indices\": 24,\n          \"attributes\": {\n            \"COLOR_0\": 27,\n            \"NORMAL\": 26,\n            \"POSITION\": 25,\n            \"TEXCOORD_0\": 28,\n            \"TEXCOORD_1\": 29\n          }\n        }\n      ]\n    },\n    {\n      \"name\": \"Sphere005\",\n      \"primitives\": [\n        {\n          \"material\": 5,\n          \"mode\": 4,\n          \"indices\": 30,\n          \"attributes\": {\n            \"COLOR_0\": 33,\n            \"NORMAL\": 32,\n            \"POSITION\": 31,\n            \"TEXCOORD_0\": 34,\n            \"TEXCOORD_1\": 35\n          }\n        }\n      ]\n    },\n    {\n      \"name\": \"Sphere006\",\n      \"primitives\": [\n        {\n          \"material\": 6,\n          \"mode\": 4,\n          \"indices\": 36,\n          \"attributes\": {\n            \"COLOR_0\": 39,\n            \"NORMAL\": 38,\n            \"POSITION\": 37,\n            \"TEXCOORD_0\": 40,\n            \"TEXCOORD_1\": 41\n          }\n        }\n      ]\n    }\n  ],\n  \"buffers\": [\n    {\n      \"byteLength\": 277736,\n      \"uri\": \"713E7264A7E5E61FD13590171F47525F.bin\"\n    }\n  ],\n  \"bufferViews\": [\n    {\n      \"buffer\": 0,\n      \"target\": 34963,\n      \"byteLength\": 192,\n      \"byteOffset\": 0\n    },\n    {\n      \"buffer\": 0,\n      \"target\": 34962,\n      \"byteLength\": 300,\n      \"byteOffset\": 192\n    },\n    {\n      \"buffer\": 0,\n      \"target\": 34962,\n      \"byteLength\": 300,\n      \"byteOffset\": 492\n    },\n    {\n      \"buffer\": 0,\n      \"target\": 34962,\n      \"byteLength\": 400,\n      \"byteOffset\": 792\n    },\n    {\n      \"buffer\": 0,\n      \"target\": 34962,\n      \"byteLength\": 200,\n      \"byteOffset\": 1192\n    },\n    {\n      \"buffer\": 0,\n      \"target\": 34962,\n      \"byteLength\": 200,\n      \"byteOffset\": 1392\n    },\n    {\n      \"buffer\": 0,\n      \"target\": 34963,\n      \"byteLength\": 5760,\n      \"byteOffset\": 1592\n    },\n    {\n      \"buffer\": 0,\n      \"target\": 34962,\n      \"byteLength\": 8628,\n      \"byteOffset\": 7352\n    },\n    {\n      \"buffer\": 0,\n      \"target\": 34962,\n      \"byteLength\": 8628,\n      \"byteOffset\": 15980\n    },\n    {\n      \"buffer\": 0,\n      \"target\": 34962,\n      \"byteLength\": 11504,\n      \"byteOffset\": 24608\n    },\n    {\n      \"buffer\": 0,\n      \"target\": 34962,\n      \"byteLength\": 5752,\n      \"byteOffset\": 36112\n    },\n    {\n      \"buffer\": 0,\n      \"target\": 34962,\n      \"byteLength\": 5752,\n      \"byteOffset\": 41864\n    },\n    {\n      \"buffer\": 0,\n      \"target\": 34963,\n      \"byteLength\": 5760,\n      \"byteOffset\": 47616\n    },\n    {\n      \"buffer\": 0,\n      \"target\": 34962,\n      \"byteLength\": 8628,\n      \"byteOffset\": 53376\n    },\n    {\n      \"buffer\": 0,\n      \"target\": 34962,\n      \"byteLength\": 8628,\n      \"byteOffset\": 62004\n    },\n    {\n      \"buffer\": 0,\n      \"target\": 34962,\n      \"byteLength\": 11504,\n      \"byteOffset\": 70632\n    },\n    {\n      \"buffer\": 0,\n      \"target\": 34962,\n      \"byteLength\": 5752,\n      \"byteOffset\": 82136\n    },\n    {\n      \"buffer\": 0,\n      \"target\": 34962,\n      \"byteLength\": 5752,\n      \"byteOffset\": 87888\n    },\n    {\n      \"buffer\": 0,\n      \"target\": 34963,\n      \"byteLength\": 5760,\n      \"byteOffset\": 93640\n    },\n    {\n      \"buffer\": 0,\n      \"target\": 34962,\n      \"byteLength\": 8628,\n      \"byteOffset\": 99400\n    },\n    {\n      \"buffer\": 0,\n      \"target\": 34962,\n      \"byteLength\": 8628,\n      \"byteOffset\": 108028\n    },\n    {\n      \"buffer\": 0,\n      \"target\": 34962,\n      \"byteLength\": 11504,\n      \"byteOffset\": 116656\n    },\n    {\n      \"buffer\": 0,\n      \"target\": 34962,\n      \"byteLength\": 5752,\n      \"byteOffset\": 128160\n    },\n    {\n      \"buffer\": 0,\n      \"target\": 34962,\n      \"byteLength\": 5752,\n      \"byteOffset\": 133912\n    },\n    {\n      \"buffer\": 0,\n      \"target\": 34963,\n      \"byteLength\": 5760,\n      \"byteOffset\": 139664\n    },\n    {\n      \"buffer\": 0,\n      \"target\": 34962,\n      \"byteLength\": 8628,\n      \"byteOffset\": 145424\n    },\n    {\n      \"buffer\": 0,\n      \"target\": 34962,\n      \"byteLength\": 8628,\n      \"byteOffset\": 154052\n    },\n    {\n      \"buffer\": 0,\n      \"target\": 34962,\n      \"byteLength\": 11504,\n      \"byteOffset\": 162680\n    },\n    {\n      \"buffer\": 0,\n      \"target\": 34962,\n      \"byteLength\": 5752,\n      \"byteOffset\": 174184\n    },\n    {\n      \"buffer\": 0,\n      \"target\": 34962,\n      \"byteLength\": 5752,\n      \"byteOffset\": 179936\n    },\n    {\n      \"buffer\": 0,\n      \"target\": 34963,\n      \"byteLength\": 5760,\n      \"byteOffset\": 185688\n    },\n    {\n      \"buffer\": 0,\n      \"target\": 34962,\n      \"byteLength\": 8628,\n      \"byteOffset\": 191448\n    },\n    {\n      \"buffer\": 0,\n      \"target\": 34962,\n      \"byteLength\": 8628,\n      \"byteOffset\": 200076\n    },\n    {\n      \"buffer\": 0,\n      \"target\": 34962,\n      \"byteLength\": 11504,\n      \"byteOffset\": 208704\n    },\n    {\n      \"buffer\": 0,\n      \"target\": 34962,\n      \"byteLength\": 5752,\n      \"byteOffset\": 220208\n    },\n    {\n      \"buffer\": 0,\n      \"target\": 34962,\n      \"byteLength\": 5752,\n      \"byteOffset\": 225960\n    },\n    {\n      \"buffer\": 0,\n      \"target\": 34963,\n      \"byteLength\": 5760,\n      \"byteOffset\": 231712\n    },\n    {\n      \"buffer\": 0,\n      \"target\": 34962,\n      \"byteLength\": 8628,\n      \"byteOffset\": 237472\n    },\n    {\n      \"buffer\": 0,\n      \"target\": 34962,\n      \"byteLength\": 8628,\n      \"byteOffset\": 246100\n    },\n    {\n      \"buffer\": 0,\n      \"target\": 34962,\n      \"byteLength\": 11504,\n      \"byteOffset\": 254728\n    },\n    {\n      \"buffer\": 0,\n      \"target\": 34962,\n      \"byteLength\": 5752,\n      \"byteOffset\": 266232\n    },\n    {\n      \"buffer\": 0,\n      \"target\": 34962,\n      \"byteLength\": 5752,\n      \"byteOffset\": 271984\n    }\n  ],\n  \"accessors\": [\n    {\n      \"componentType\": 5123,\n      \"type\": \"SCALAR\",\n      \"bufferView\": 0,\n      \"byteOffset\": 0,\n      \"count\": 96\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC3\",\n      \"bufferView\": 1,\n      \"byteOffset\": 0,\n      \"count\": 25,\n      \"min\": [\n        -19.6646308898926,\n        -19.430233001709,\n        0.0\n      ],\n      \"max\": [\n        19.6646308898926,\n        19.430233001709,\n        0.0\n      ]\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC3\",\n      \"bufferView\": 2,\n      \"byteOffset\": 0,\n      \"count\": 25\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 3,\n      \"byteOffset\": 0,\n      \"count\": 25\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC2\",\n      \"bufferView\": 4,\n      \"byteOffset\": 0,\n      \"count\": 25\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC2\",\n      \"bufferView\": 5,\n      \"byteOffset\": 0,\n      \"count\": 25\n    },\n    {\n      \"componentType\": 5123,\n      \"type\": \"SCALAR\",\n      \"bufferView\": 6,\n      \"byteOffset\": 0,\n      \"count\": 2880\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC3\",\n      \"bufferView\": 7,\n      \"byteOffset\": 0,\n      \"count\": 719,\n      \"min\": [\n        -4.53262519836426,\n        -4.53262519836426,\n        -4.53262519836426\n      ],\n      \"max\": [\n        4.53262519836426,\n        4.53262519836426,\n        4.53262519836426\n      ]\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC3\",\n      \"bufferView\": 8,\n      \"byteOffset\": 0,\n      \"count\": 719\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 9,\n      \"byteOffset\": 0,\n      \"count\": 719\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC2\",\n      \"bufferView\": 10,\n      \"byteOffset\": 0,\n      \"count\": 719\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC2\",\n      \"bufferView\": 11,\n      \"byteOffset\": 0,\n      \"count\": 719\n    },\n    {\n      \"componentType\": 5123,\n      \"type\": \"SCALAR\",\n      \"bufferView\": 12,\n      \"byteOffset\": 0,\n      \"count\": 2880\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC3\",\n      \"bufferView\": 13,\n      \"byteOffset\": 0,\n      \"count\": 719,\n      \"min\": [\n        -4.53262519836426,\n        -4.53262519836426,\n        -4.53262519836426\n      ],\n      \"max\": [\n        4.53262519836426,\n        4.53262519836426,\n        4.53262519836426\n      ]\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC3\",\n      \"bufferView\": 14,\n      \"byteOffset\": 0,\n      \"count\": 719\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 15,\n      \"byteOffset\": 0,\n      \"count\": 719\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC2\",\n      \"bufferView\": 16,\n      \"byteOffset\": 0,\n      \"count\": 719\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC2\",\n      \"bufferView\": 17,\n      \"byteOffset\": 0,\n      \"count\": 719\n    },\n    {\n      \"componentType\": 5123,\n      \"type\": \"SCALAR\",\n      \"bufferView\": 18,\n      \"byteOffset\": 0,\n      \"count\": 2880\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC3\",\n      \"bufferView\": 19,\n      \"byteOffset\": 0,\n      \"count\": 719,\n      \"min\": [\n        -4.53262519836426,\n        -4.53262519836426,\n        -4.53262519836426\n      ],\n      \"max\": [\n        4.53262519836426,\n        4.53262519836426,\n        4.53262519836426\n      ]\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC3\",\n      \"bufferView\": 20,\n      \"byteOffset\": 0,\n      \"count\": 719\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 21,\n      \"byteOffset\": 0,\n      \"count\": 719\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC2\",\n      \"bufferView\": 22,\n      \"byteOffset\": 0,\n      \"count\": 719\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC2\",\n      \"bufferView\": 23,\n      \"byteOffset\": 0,\n      \"count\": 719\n    },\n    {\n      \"componentType\": 5123,\n      \"type\": \"SCALAR\",\n      \"bufferView\": 24,\n      \"byteOffset\": 0,\n      \"count\": 2880\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC3\",\n      \"bufferView\": 25,\n      \"byteOffset\": 0,\n      \"count\": 719,\n      \"min\": [\n        -4.53262519836426,\n        -4.53262519836426,\n        -4.53262519836426\n      ],\n      \"max\": [\n        4.53262519836426,\n        4.53262519836426,\n        4.53262519836426\n      ]\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC3\",\n      \"bufferView\": 26,\n      \"byteOffset\": 0,\n      \"count\": 719\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 27,\n      \"byteOffset\": 0,\n      \"count\": 719\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC2\",\n      \"bufferView\": 28,\n      \"byteOffset\": 0,\n      \"count\": 719\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC2\",\n      \"bufferView\": 29,\n      \"byteOffset\": 0,\n      \"count\": 719\n    },\n    {\n      \"componentType\": 5123,\n      \"type\": \"SCALAR\",\n      \"bufferView\": 30,\n      \"byteOffset\": 0,\n      \"count\": 2880\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC3\",\n      \"bufferView\": 31,\n      \"byteOffset\": 0,\n      \"count\": 719,\n      \"min\": [\n        -4.53262519836426,\n        -4.53262519836426,\n        -4.53262519836426\n      ],\n      \"max\": [\n        4.53262519836426,\n        4.53262519836426,\n        4.53262519836426\n      ]\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC3\",\n      \"bufferView\": 32,\n      \"byteOffset\": 0,\n      \"count\": 719\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 33,\n      \"byteOffset\": 0,\n      \"count\": 719\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC2\",\n      \"bufferView\": 34,\n      \"byteOffset\": 0,\n      \"count\": 719\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC2\",\n      \"bufferView\": 35,\n      \"byteOffset\": 0,\n      \"count\": 719\n    },\n    {\n      \"componentType\": 5123,\n      \"type\": \"SCALAR\",\n      \"bufferView\": 36,\n      \"byteOffset\": 0,\n      \"count\": 2880\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC3\",\n      \"bufferView\": 37,\n      \"byteOffset\": 0,\n      \"count\": 719,\n      \"min\": [\n        -4.53262519836426,\n        -4.53262519836426,\n        -4.53262519836426\n      ],\n      \"max\": [\n        4.53262519836426,\n        4.53262519836426,\n        4.53262519836426\n      ]\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC3\",\n      \"bufferView\": 38,\n      \"byteOffset\": 0,\n      \"count\": 719\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 39,\n      \"byteOffset\": 0,\n      \"count\": 719\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC2\",\n      \"bufferView\": 40,\n      \"byteOffset\": 0,\n      \"count\": 719\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC2\",\n      \"bufferView\": 41,\n      \"byteOffset\": 0,\n      \"count\": 719\n    }\n  ],\n  \"nodes\": [\n    {\n      \"name\": \"RootNode\",\n      \"translation\": [\n        0.0,\n        0.0,\n        0.0\n      ],\n      \"rotation\": [\n        0.0,\n        0.0,\n        0.0,\n        1.0\n      ],\n      \"scale\": [\n        1.0,\n        1.0,\n        1.0\n      ],\n      \"children\": [\n        1,\n        2,\n        3,\n        4,\n        5,\n        6,\n        7,\n        8\n      ]\n    },\n    {\n      \"name\": \"Plane001\",\n      \"translation\": [\n        0.0,\n        0.0,\n        0.0\n      ],\n      \"rotation\": [\n        -0.70710676908493,\n        0.0,\n        0.0,\n        0.70710676908493\n      ],\n      \"scale\": [\n        1.0,\n        1.0,\n        1.0\n      ],\n      \"mesh\": 0\n    },\n    {\n      \"name\": \"Sphere001\",\n      \"translation\": [\n        9.90610790252686,\n        4.59714460372925,\n        -12.4250316619873\n      ],\n      \"rotation\": [\n        -0.70710676908493,\n        0.0,\n        0.0,\n        0.70710676908493\n      ],\n      \"scale\": [\n        1.0,\n        1.0,\n        1.0\n      ],\n      \"mesh\": 1\n    },\n    {\n      \"name\": \"Sky001\",\n      \"translation\": [\n        6.99357748031616,\n        0.0,\n        8.95987319946289\n      ],\n      \"rotation\": [\n        0.0,\n        0.0,\n        0.0,\n        1.0\n      ],\n      \"scale\": [\n        1.0,\n        1.0,\n        1.0\n      ]\n    },\n    {\n      \"name\": \"Sphere002\",\n      \"translation\": [\n        -8.55751132965088,\n        4.59714460372925,\n        -12.4250316619873\n      ],\n      \"rotation\": [\n        -0.70710676908493,\n        0.0,\n        0.0,\n        0.70710676908493\n      ],\n      \"scale\": [\n        1.0,\n        1.0,\n        1.0\n      ],\n      \"mesh\": 2\n    },\n    {\n      \"name\": \"Sphere003\",\n      \"translation\": [\n        9.90610790252686,\n        4.59714460372925,\n        -0.347654342651367\n      ],\n      \"rotation\": [\n        -0.70710676908493,\n        0.0,\n        0.0,\n        0.70710676908493\n      ],\n      \"scale\": [\n        1.0,\n        1.0,\n        1.0\n      ],\n      \"mesh\": 3\n    },\n    {\n      \"name\": \"Sphere004\",\n      \"translation\": [\n        -8.55751132965088,\n        4.59714460372925,\n        -0.347654342651367\n      ],\n      \"rotation\": [\n        -0.70710676908493,\n        0.0,\n        0.0,\n        0.70710676908493\n      ],\n      \"scale\": [\n        1.0,\n        1.0,\n        1.0\n      ],\n      \"mesh\": 4\n    },\n    {\n      \"name\": \"Sphere005\",\n      \"translation\": [\n        9.90610790252686,\n        4.59714460372925,\n        11.7297229766846\n      ],\n      \"rotation\": [\n        -0.70710676908493,\n        0.0,\n        0.0,\n        0.70710676908493\n      ],\n      \"scale\": [\n        1.0,\n        1.0,\n        1.0\n      ],\n      \"mesh\": 5\n    },\n    {\n      \"name\": \"Sphere006\",\n      \"translation\": [\n        -8.55751132965088,\n        4.59714460372925,\n        11.7297229766846\n      ],\n      \"rotation\": [\n        -0.70710676908493,\n        0.0,\n        0.0,\n        0.70710676908493\n      ],\n      \"scale\": [\n        1.0,\n        1.0,\n        1.0\n      ],\n      \"mesh\": 6\n    }\n  ],\n  \"asset\": {\n    \"generator\": \"FBX2glTF\",\n    \"version\": \"2.0\"\n  },\n  \"scene\": 0,\n  \"scenes\": [\n    {\n      \"name\": \"Root Scene\",\n      \"nodes\": [\n        0\n      ]\n    }\n  ],\n  \"samplers\": [\n    {}\n  ]\n}\n"
  },
  {
    "path": "examples/resources/models/gltf/TextureTransformTest/README.md",
    "content": "# Texture Transform Test\n\n## Screenshot\n\n![screenshot](screenshot/screenshot.jpg)\n\n## Description\n\nThis model demonstrates the usage of the KHR_texture_transform extension. There are six quads in this model using two main textures.\n\nUV  \n<img src=\"glTF/UV.png\" height=\"172\" height=\"172\" />\n\nArrow  \n<img src=\"glTF/Arrow.png\" height=\"86\" height=\"86\" />\n\nNote: Both textures have a gray border and use a sampler that clamps and disables mipmapping.\n\n### Offsets\n\nThe top row tests different combinations of the offset parameter with UV coordinates of `(0.0, 0.0)` to `(0.5, 0.5)` and offsets of `(0.5, 0.0)`, `(0.0, 0.5)`, and `(0.5, 0.5)` respectively from left to right, using the UV texture. A yellow image indicates that offset was not applied.\n\n### Rotation\n\nThe bottom left quad tests the rotation parameter with UV coordinates of `(0.0, 0.0)` to `(1.0, 1.0)` and a rotation angle of `‪0.392699‬` radians or `22.5` degrees, using the arrow texture. The green marker indicates the correct rotation. The yellow marker indicates the rotation was not applied. The red marker indicates the rotation was applied in the opposite direction.\n\n### Scale\n\nThe bottom middle quad tests the scale parameter with UV coordinates of `(0.0, 0.0)` to `(1.0, 1.0)` and a scale of `1.5`, using the arrow texture. The green marker indicates the correct scale. The yellow marker indicates the scale was not applied.\n\n### All\n\nThe bottom right quad tests offset, rotation, and scale at the same time. If everything is supported correctly, the arrow should point to the green marker.\n\n## License Information\n\nDonated by Microsoft for glTF testing\n"
  },
  {
    "path": "examples/resources/models/gltf/TextureTransformTest/glTF/TextureTransformTest.gltf",
    "content": "{\n  \"accessors\": [\n    {\n      \"bufferView\": 0,\n      \"componentType\": 5126,\n      \"count\": 4,\n      \"type\": \"VEC3\",\n      \"max\": [\n        0.5,\n        0.5,\n        0.0\n      ],\n      \"min\": [\n        -0.5,\n        -0.5,\n        0.0\n      ],\n      \"name\": \"Positions\"\n    },\n    {\n      \"bufferView\": 1,\n      \"componentType\": 5126,\n      \"count\": 4,\n      \"type\": \"VEC2\",\n      \"name\": \"UV0\"\n    },\n    {\n      \"bufferView\": 2,\n      \"componentType\": 5126,\n      \"count\": 4,\n      \"type\": \"VEC2\",\n      \"name\": \"UV1\"\n    },\n    {\n      \"bufferView\": 3,\n      \"componentType\": 5125,\n      \"count\": 6,\n      \"type\": \"SCALAR\",\n      \"name\": \"Indices\"\n    }\n  ],\n  \"asset\": {\n    \"version\": \"2.0\"\n  },\n  \"buffers\": [\n    {\n      \"uri\": \"TextureTransformTest.bin\",\n      \"byteLength\": 136\n    }\n  ],\n  \"bufferViews\": [\n    {\n      \"buffer\": 0,\n      \"byteLength\": 48,\n      \"name\": \"Positions\"\n    },\n    {\n      \"buffer\": 0,\n      \"byteOffset\": 48,\n      \"byteLength\": 32,\n      \"name\": \"UV0\"\n    },\n    {\n      \"buffer\": 0,\n      \"byteOffset\": 80,\n      \"byteLength\": 32,\n      \"name\": \"UV1\"\n    },\n    {\n      \"buffer\": 0,\n      \"byteOffset\": 112,\n      \"byteLength\": 24,\n      \"name\": \"Indices\"\n    }\n  ],\n  \"extensionsUsed\": [\n    \"KHR_texture_transform\"\n  ],\n  \"images\": [\n    {\n      \"uri\": \"UV.png\"\n    },\n    {\n      \"uri\": \"Arrow.png\"\n    },\n    {\n      \"uri\": \"Correct.png\"\n    },\n    {\n      \"uri\": \"NotSupported.png\"\n    },\n    {\n      \"uri\": \"Error.png\"\n    }\n  ],\n  \"materials\": [\n    {\n      \"name\": \"Offset U\",\n      \"pbrMetallicRoughness\": {\n        \"baseColorTexture\": {\n          \"index\": 0,\n          \"extensions\": {\n            \"KHR_texture_transform\": {\n              \"offset\": [\n                0.5,\n                0.0\n              ]\n            }\n          }\n        },\n        \"metallicFactor\": 0\n      }\n    },\n    {\n      \"name\": \"Offset V\",\n      \"pbrMetallicRoughness\": {\n        \"baseColorTexture\": {\n          \"index\": 0,\n          \"extensions\": {\n            \"KHR_texture_transform\": {\n              \"offset\": [\n                0.0,\n                0.5\n              ]\n            }\n          }\n        },\n        \"metallicFactor\": 0\n      }\n    },\n    {\n      \"name\": \"Offset UV\",\n      \"pbrMetallicRoughness\": {\n        \"baseColorTexture\": {\n          \"index\": 0,\n          \"extensions\": {\n            \"KHR_texture_transform\": {\n              \"offset\": [\n                0.5,\n                0.5\n              ]\n            }\n          }\n        },\n        \"metallicFactor\": 0\n      }\n    },\n    {\n      \"name\": \"Rotation\",\n      \"pbrMetallicRoughness\": {\n        \"baseColorTexture\": {\n          \"index\": 1,\n          \"extensions\": {\n            \"KHR_texture_transform\": {\n              \"rotation\": 0.39269908169872415480783042290994\n            }\n          }\n        },\n        \"metallicFactor\": 0\n      }\n    },\n    {\n      \"name\": \"Scale\",\n      \"pbrMetallicRoughness\": {\n        \"baseColorTexture\": {\n          \"index\": 1,\n          \"extensions\": {\n            \"KHR_texture_transform\": {\n              \"scale\": [\n                1.5,\n                1.5\n              ]\n            }\n          }\n        },\n        \"metallicFactor\": 0\n      }\n    },\n    {\n      \"name\": \"All\",\n      \"pbrMetallicRoughness\": {\n        \"baseColorTexture\": {\n          \"index\": 1,\n          \"extensions\": {\n            \"KHR_texture_transform\": {\n              \"offset\": [\n                -0.2,\n                -0.1\n              ],\n              \"rotation\": 0.3,\n              \"scale\": [\n                1.5,\n                1.5\n              ]\n            }\n          }\n        },\n        \"metallicFactor\": 0\n      }\n    },\n    {\n      \"name\": \"Correct\",\n      \"pbrMetallicRoughness\": {\n        \"baseColorTexture\": {\n          \"index\": 2\n        },\n        \"metallicFactor\": 0\n      }\n    },\n    {\n      \"name\": \"NotSupported\",\n      \"pbrMetallicRoughness\": {\n        \"baseColorTexture\": {\n          \"index\": 3\n        },\n        \"metallicFactor\": 0\n      }\n    },\n    {\n      \"name\": \"Error\",\n      \"pbrMetallicRoughness\": {\n        \"baseColorTexture\": {\n          \"index\": 4\n        },\n        \"metallicFactor\": 0\n      }\n    }\n  ],\n  \"meshes\": [\n    {\n      \"name\": \"Offset U\",\n      \"primitives\": [\n        {\n          \"attributes\": {\n            \"POSITION\": 0,\n            \"TEXCOORD_0\": 2\n          },\n          \"indices\": 3,\n          \"material\": 0\n        }\n      ]\n    },\n    {\n      \"name\": \"Offset V\",\n      \"primitives\": [\n        {\n          \"attributes\": {\n            \"POSITION\": 0,\n            \"TEXCOORD_0\": 2\n          },\n          \"indices\": 3,\n          \"material\": 1\n        }\n      ]\n    },\n    {\n      \"name\": \"Offset UV\",\n      \"primitives\": [\n        {\n          \"attributes\": {\n            \"POSITION\": 0,\n            \"TEXCOORD_0\": 2\n          },\n          \"indices\": 3,\n          \"material\": 2\n        }\n      ]\n    },\n    {\n      \"name\": \"Rotation\",\n      \"primitives\": [\n        {\n          \"attributes\": {\n            \"POSITION\": 0,\n            \"TEXCOORD_0\": 1\n          },\n          \"indices\": 3,\n          \"material\": 3\n        }\n      ]\n    },\n    {\n      \"name\": \"Scale\",\n      \"primitives\": [\n        {\n          \"attributes\": {\n            \"POSITION\": 0,\n            \"TEXCOORD_0\": 1\n          },\n          \"indices\": 3,\n          \"material\": 4\n        }\n      ]\n    },\n    {\n      \"name\": \"All\",\n      \"primitives\": [\n        {\n          \"attributes\": {\n            \"POSITION\": 0,\n            \"TEXCOORD_0\": 1\n          },\n          \"indices\": 3,\n          \"material\": 5\n        }\n      ]\n    },\n    {\n      \"name\": \"Correct Marker\",\n      \"primitives\": [\n        {\n          \"attributes\": {\n            \"POSITION\": 0,\n            \"TEXCOORD_0\": 1\n          },\n          \"indices\": 3,\n          \"material\": 6\n        }\n      ]\n    },\n    {\n      \"name\": \"Not Supported Marker\",\n      \"primitives\": [\n        {\n          \"attributes\": {\n            \"POSITION\": 0,\n            \"TEXCOORD_0\": 1\n          },\n          \"indices\": 3,\n          \"material\": 7\n        }\n      ]\n    },\n    {\n      \"name\": \"Error Marker\",\n      \"primitives\": [\n        {\n          \"attributes\": {\n            \"POSITION\": 0,\n            \"TEXCOORD_0\": 1\n          },\n          \"indices\": 3,\n          \"material\": 8\n        }\n      ]\n    }\n  ],\n  \"nodes\": [\n    {\n      \"name\": \"Offset U\",\n      \"mesh\": 0,\n      \"translation\": [\n        -1.1,\n        0.55,\n        0\n      ]\n    },\n    {\n      \"name\": \"Offset V\",\n      \"mesh\": 1,\n      \"translation\": [\n        0,\n        0.55,\n        0\n      ]\n    },\n    {\n      \"name\": \"Offset UV\",\n      \"mesh\": 2,\n      \"translation\": [\n        1.1,\n        0.55,\n        0\n      ]\n    },\n    {\n      \"name\": \"Rotation\",\n      \"mesh\": 3,\n      \"translation\": [\n        -1.1,\n        -0.55,\n        0\n      ],\n      \"children\": [\n        4,\n        5,\n        6\n      ]\n    },\n    {\n      \"name\": \"Rotation - Correct\",\n      \"mesh\": 6,\n      \"translation\": [\n        -0.07904822439840125109869401756656,\n        -0.51626748576241543174100150833647,\n        0.01\n      ],\n      \"scale\": [\n        0.15,\n        0.15,\n        0.15\n      ]\n    },\n    {\n      \"name\": \"Rotation - Not Supported\",\n      \"mesh\": 7,\n      \"translation\": [\n        0.27781745930520227684092879831533,\n        -0.27781745930520227684092879831533,\n        0.01\n      ],\n      \"scale\": [\n        0.15,\n        0.15,\n        0.15\n      ]\n    },\n    {\n      \"name\": \"Rotation - Error\",\n      \"mesh\": 8,\n      \"translation\": [\n        0.51626748576241543174100150833647,\n        0.07904822439840125109869401756656,\n        0.01\n      ],\n      \"scale\": [\n        0.15,\n        0.15,\n        0.15\n      ]\n    },\n    {\n      \"name\": \"Scale\",\n      \"mesh\": 4,\n      \"translation\": [\n        0,\n        -0.55,\n        0\n      ],\n      \"children\": [\n        8,\n        9\n      ]\n    },\n    {\n      \"name\": \"Scale - Correct\",\n      \"mesh\": 6,\n      \"translation\": [\n        0.01854497287013485122728586554355,\n        -0.01854497287013485122728586554355,\n        0.01\n      ],\n      \"scale\": [\n        0.1,\n        0.1,\n        0.1\n      ]\n    },\n    {\n      \"name\": \"Scale - Not Supported\",\n      \"mesh\": 7,\n      \"translation\": [\n        0.27781745930520227684092879831533,\n        -0.27781745930520227684092879831533,\n        0.01\n      ],\n      \"scale\": [\n        0.15,\n        0.15,\n        0.15\n      ]\n    },\n    {\n      \"name\": \"All\",\n      \"mesh\": 5,\n      \"translation\": [\n        1.1,\n        -0.55,\n        0\n      ],\n      \"children\": [\n        11\n      ]\n    },\n    {\n      \"name\": \"All - Correct\",\n      \"mesh\": 6,\n      \"translation\": [\n        -0.07,\n        -0.25,\n        0.01\n      ],\n      \"scale\": [\n        0.1,\n        0.1,\n        0.1\n      ]\n    }\n  ],\n  \"scene\": 0,\n  \"scenes\": [\n    {\n      \"nodes\": [\n        0,\n        1,\n        2,\n        3,\n        7,\n        10\n      ]\n    }\n  ],\n  \"textures\": [\n    {\n      \"source\": 0,\n      \"sampler\": 0\n    },\n    {\n      \"source\": 1,\n      \"sampler\": 0\n    },\n    {\n      \"source\": 2\n    },\n    {\n      \"source\": 3\n    },\n    {\n      \"source\": 4\n    }\n  ],\n  \"samplers\": [\n    {\n      \"wrapS\": 33071,\n      \"wrapT\": 33071,\n      \"magFilter\": 9729,\n      \"minFilter\": 9729\n    }\n  ]\n}"
  },
  {
    "path": "examples/resources/models/gltf/UinoDog/README.md",
    "content": "# UINO Dog\n\n## License Information\n\nDonated by UINO for glTF testing.\n"
  },
  {
    "path": "examples/resources/models/gltf/UinoDog/glTF/robot.gltf",
    "content": "{\n    \"asset\" : {\n        \"generator\" : \"Khronos glTF Blender I/O v1.7.33\",\n        \"version\" : \"2.0\"\n    },\n    \"scene\" : 0,\n    \"scenes\" : [\n        {\n            \"name\" : \"Scene\",\n            \"nodes\" : [\n                43\n            ]\n        }\n    ],\n    \"nodes\" : [\n        {\n            \"name\" : \"eye\",\n            \"rotation\" : [\n                1.0308056898290438e-13,\n                2.2795231302552565e-07,\n                -4.546038212538406e-07,\n                1\n            ],\n            \"translation\" : [\n                8.70398721986021e-08,\n                -0.0648142397403717,\n                0.3108687698841095\n            ]\n        },\n        {\n            \"name\" : \"Leg_B_L_Link1\",\n            \"rotation\" : [\n                -0.6296749114990234,\n                0.3217291533946991,\n                -0.32172930240631104,\n                0.6296746730804443\n            ],\n            \"scale\" : [\n                1,\n                1.0000001192092896,\n                1\n            ],\n            \"translation\" : [\n                0.441219300031662,\n                0.04513220489025116,\n                0.05038616061210632\n            ]\n        },\n        {\n            \"name\" : \"Leg_B_L_Link3\",\n            \"rotation\" : [\n                -0.3798401355743408,\n                0.5964224338531494,\n                -0.5964247584342957,\n                0.3798412084579468\n            ],\n            \"scale\" : [\n                1,\n                1.0000001192092896,\n                1.0000001192092896\n            ],\n            \"translation\" : [\n                0.4443120062351227,\n                -0.0605289489030838,\n                0.05038616061210632\n            ]\n        },\n        {\n            \"name\" : \"Leg_B_L_Link2\",\n            \"rotation\" : [\n                -0.45005878806114197,\n                -0.8929097652435303,\n                -0.011286498047411442,\n                0.005648559890687466\n            ],\n            \"scale\" : [\n                0.9999994039535522,\n                0.9999996423721313,\n                0.9999997615814209\n            ],\n            \"translation\" : [\n                0.046388328075408936,\n                0.0007264270097948611,\n                0.0020529215689748526\n            ]\n        },\n        {\n            \"name\" : \"Leg_B_L_Link4\",\n            \"rotation\" : [\n                -0.8404396176338196,\n                -0.5417584180831909,\n                -0.006868395954370499,\n                0.010589773766696453\n            ],\n            \"translation\" : [\n                0.0051451437175273895,\n                0.454822838306427,\n                0.013515406288206577\n            ]\n        },\n        {\n            \"name\" : \"Leg_B_L_Down\",\n            \"rotation\" : [\n                0.29947230219841003,\n                -6.203210432431661e-06,\n                0.004826804623007774,\n                0.954092800617218\n            ],\n            \"scale\" : [\n                1.0000003576278687,\n                0.9999998211860657,\n                0.9999999403953552\n            ],\n            \"translation\" : [\n                -2.6339895953242376e-07,\n                0.6127797961235046,\n                4.17618792880603e-08\n            ]\n        },\n        {\n            \"children\" : [\n                3,\n                4,\n                5\n            ],\n            \"name\" : \"Leg_B_L_Up\",\n            \"rotation\" : [\n                -0.00010586287680780515,\n                -0.012619905173778534,\n                0.9999052882194519,\n                0.005493273492902517\n            ],\n            \"scale\" : [\n                1,\n                0.9999990463256836,\n                1.0000003576278687\n            ],\n            \"translation\" : [\n                0.7679466605186462,\n                0.24811120331287384,\n                0.04835561290383339\n            ]\n        },\n        {\n            \"name\" : \"Leg_B_R_Link1\",\n            \"rotation\" : [\n                -0.62967449426651,\n                -0.3217299282550812,\n                0.32173025608062744,\n                0.6296742558479309\n            ],\n            \"scale\" : [\n                0.9999999403953552,\n                1,\n                0.9999999403953552\n            ],\n            \"translation\" : [\n                -0.4414442777633667,\n                0.045131124556064606,\n                0.050386156886816025\n            ]\n        },\n        {\n            \"name\" : \"Leg_B_R_Link3\",\n            \"rotation\" : [\n                -0.3798385262489319,\n                -0.5964243412017822,\n                0.5964241623878479,\n                0.3798406720161438\n            ],\n            \"scale\" : [\n                0.9999998807907104,\n                1,\n                0.9999998807907104\n            ],\n            \"translation\" : [\n                -0.4445367455482483,\n                -0.060530126094818115,\n                0.050386156886816025\n            ]\n        },\n        {\n            \"name\" : \"Leg_B_R_Link2\",\n            \"rotation\" : [\n                -0.4500632584095001,\n                0.892907440662384,\n                0.011128860525786877,\n                0.005960808601230383\n            ],\n            \"scale\" : [\n                0.9999999403953552,\n                0.9999996423721313,\n                0.9999998807907104\n            ],\n            \"translation\" : [\n                -0.04638973996043205,\n                0.0007261708960868418,\n                0.0020204083994030952\n            ]\n        },\n        {\n            \"name\" : \"Leg_B_R_Link4\",\n            \"rotation\" : [\n                -0.8404421806335449,\n                0.5417541265487671,\n                0.006575463339686394,\n                0.010779684409499168\n            ],\n            \"scale\" : [\n                0.9999997019767761,\n                0.9999995827674866,\n                1\n            ],\n            \"translation\" : [\n                -0.005154602695256472,\n                0.45482316613197327,\n                0.013511735014617443\n            ]\n        },\n        {\n            \"name\" : \"Leg_B_R_Down\",\n            \"rotation\" : [\n                0.29945918917655945,\n                -0.003295654896646738,\n                -0.005653269123286009,\n                0.9540867209434509\n            ],\n            \"scale\" : [\n                1.0000003576278687,\n                0.9999997615814209,\n                1.000000238418579\n            ],\n            \"translation\" : [\n                3.6483228882389085e-07,\n                0.6127797365188599,\n                -1.927717008243235e-08\n            ]\n        },\n        {\n            \"children\" : [\n                9,\n                10,\n                11\n            ],\n            \"name\" : \"Leg_B_R_Up\",\n            \"rotation\" : [\n                0.00024454703088849783,\n                0.012622637674212456,\n                -0.9999052286148071,\n                0.005490147043019533\n            ],\n            \"scale\" : [\n                1,\n                0.9999997615814209,\n                1.0000004768371582\n            ],\n            \"translation\" : [\n                -0.7681720852851868,\n                0.2481093853712082,\n                0.04835561662912369\n            ]\n        },\n        {\n            \"name\" : \"Leg_A_L_Down_end\",\n            \"rotation\" : [\n                -2.1551676354647498e-07,\n                3.0046066967770457e-07,\n                -2.686984998945263e-07,\n                1\n            ],\n            \"scale\" : [\n                1.0000001192092896,\n                1,\n                1\n            ],\n            \"translation\" : [\n                8.85920599102974e-08,\n                0.27570343017578125,\n                4.337918824148801e-08\n            ]\n        },\n        {\n            \"children\" : [\n                13\n            ],\n            \"name\" : \"Leg_A_L_Down\",\n            \"rotation\" : [\n                -0.0008819869835861027,\n                0.0009771108161658049,\n                0.7443721890449524,\n                0.6677637696266174\n            ],\n            \"scale\" : [\n                1,\n                1.000000238418579,\n                0.9999999403953552\n            ],\n            \"translation\" : [\n                7.795063794446833e-08,\n                0.2757039964199066,\n                3.4930611292338654e-08\n            ]\n        },\n        {\n            \"children\" : [\n                14\n            ],\n            \"name\" : \"Leg_A_L_Middle\",\n            \"rotation\" : [\n                0.2969473600387573,\n                0.21951113641262054,\n                -0.616892397403717,\n                0.695040225982666\n            ],\n            \"scale\" : [\n                0.9999996423721313,\n                0.9999998807907104,\n                1.000001072883606\n            ],\n            \"translation\" : [\n                -4.584470758572934e-08,\n                0.38095247745513916,\n                2.3436843576973843e-08\n            ]\n        },\n        {\n            \"children\" : [\n                15\n            ],\n            \"name\" : \"Leg_A_L_Up\",\n            \"rotation\" : [\n                0.9282538294792175,\n                -0.04346515238285065,\n                0.015678953379392624,\n                0.3690660893917084\n            ],\n            \"scale\" : [\n                0.9999998211860657,\n                0.9999999403953552,\n                1\n            ],\n            \"translation\" : [\n                -3.894461144682282e-07,\n                0.10024332255125046,\n                0.18828915059566498\n            ]\n        },\n        {\n            \"name\" : \"Leg_A_R_Down_end\",\n            \"rotation\" : [\n                2.701376047298254e-07,\n                -3.71146626321206e-07,\n                5.271398606510047e-08,\n                1\n            ],\n            \"scale\" : [\n                1,\n                0.9999999403953552,\n                0.9999999403953552\n            ],\n            \"translation\" : [\n                -8.38190601371025e-08,\n                0.275703102350235,\n                -2.8522335604463933e-09\n            ]\n        },\n        {\n            \"children\" : [\n                17\n            ],\n            \"name\" : \"Leg_A_R_Down\",\n            \"rotation\" : [\n                -0.0008820351795293391,\n                0.0009770785691216588,\n                0.744371771812439,\n                0.6677641868591309\n            ],\n            \"scale\" : [\n                1.000000238418579,\n                0.9999995231628418,\n                1\n            ],\n            \"translation\" : [\n                1.4117754743026012e-09,\n                0.2757038176059723,\n                -1.5192098246075147e-08\n            ]\n        },\n        {\n            \"children\" : [\n                18\n            ],\n            \"name\" : \"Leg_A_R_Middle\",\n            \"rotation\" : [\n                -0.24434509873390198,\n                -0.27721354365348816,\n                -0.6395540237426758,\n                0.6741058826446533\n            ],\n            \"scale\" : [\n                0.9999989867210388,\n                0.9999992847442627,\n                1.000000238418579\n            ],\n            \"translation\" : [\n                7.271583335466403e-09,\n                0.3809526860713959,\n                4.090584937443964e-08\n            ]\n        },\n        {\n            \"children\" : [\n                19\n            ],\n            \"name\" : \"Leg_A_R_Up\",\n            \"rotation\" : [\n                -0.9262985587120056,\n                0.07426314055919647,\n                -0.062222350388765335,\n                0.36412161588668823\n            ],\n            \"scale\" : [\n                0.9999999403953552,\n                1,\n                0.9999991655349731\n            ],\n            \"translation\" : [\n                -2.3118383296605316e-07,\n                0.10024376958608627,\n                -0.18813546001911163\n            ]\n        },\n        {\n            \"children\" : [\n                16,\n                20\n            ],\n            \"name\" : \"HIP\",\n            \"rotation\" : [\n                0.7071070671081543,\n                -4.045504624627938e-07,\n                0.7071065902709961,\n                1.1858617909865643e-07\n            ],\n            \"scale\" : [\n                1.0000001192092896,\n                1,\n                1.000000238418579\n            ],\n            \"translation\" : [\n                8.891195071858427e-14,\n                0.020288586616516113,\n                2.0145551005157358e-08\n            ]\n        },\n        {\n            \"children\" : [\n                21\n            ],\n            \"name\" : \"ROOT\",\n            \"rotation\" : [\n                -0.5861675143241882,\n                9.95548035120919e-08,\n                7.202726948207783e-08,\n                0.8101899027824402\n            ],\n            \"scale\" : [\n                0.9999998807907104,\n                0.9999999403953552,\n                0.9999997615814209\n            ],\n            \"translation\" : [\n                -1.8099596488241332e-08,\n                0.40599846839904785,\n                -0.07364848256111145\n            ]\n        },\n        {\n            \"children\" : [\n                22\n            ],\n            \"name\" : \"Link3\",\n            \"rotation\" : [\n                -0.009425217285752296,\n                2.8262139850632195e-10,\n                6.880784830798348e-09,\n                0.9999555945396423\n            ],\n            \"scale\" : [\n                1.0000001192092896,\n                0.9999999403953552,\n                1\n            ],\n            \"translation\" : [\n                2.4287780377922445e-14,\n                0.2067003846168518,\n                -8.711758425761218e-08\n            ]\n        },\n        {\n            \"children\" : [\n                23\n            ],\n            \"name\" : \"Link2\",\n            \"rotation\" : [\n                0.011704010888934135,\n                -7.68776223236678e-11,\n                1.2174924179930713e-08,\n                0.9999315142631531\n            ],\n            \"scale\" : [\n                0.9999998807907104,\n                0.9999996423721313,\n                0.9999995827674866\n            ],\n            \"translation\" : [\n                2.986810289113545e-14,\n                0.2237572818994522,\n                -4.517870877407404e-07\n            ]\n        },\n        {\n            \"children\" : [\n                24\n            ],\n            \"name\" : \"Link1\",\n            \"rotation\" : [\n                -0.8115238547325134,\n                -6.138199637462094e-07,\n                5.00432633998571e-07,\n                0.5843193531036377\n            ],\n            \"scale\" : [\n                1,\n                0.9999998211860657,\n                1.0000004768371582\n            ],\n            \"translation\" : [\n                6.952578956997968e-09,\n                -0.00516811478883028,\n                -0.3183101713657379\n            ]\n        },\n        {\n            \"name\" : \"doorLink\",\n            \"rotation\" : [\n                -0.9496852159500122,\n                6.584051337986396e-13,\n                1.525633706478402e-06,\n                0.31320610642433167\n            ],\n            \"scale\" : [\n                1,\n                0.9999998211860657,\n                0.9999994039535522\n            ],\n            \"translation\" : [\n                -7.833469339857402e-08,\n                0.3991953134536743,\n                -0.04876171052455902\n            ]\n        },\n        {\n            \"children\" : [\n                26\n            ],\n            \"name\" : \"door\",\n            \"rotation\" : [\n                -0.7074362635612488,\n                -1.0429287158331135e-06,\n                1.0426371090943576e-06,\n                0.7067772150039673\n            ],\n            \"scale\" : [\n                1,\n                1.0000001192092896,\n                1.000000238418579\n            ],\n            \"translation\" : [\n                -5.693180469279469e-07,\n                0.4238869845867157,\n                0.2092338502407074\n            ]\n        },\n        {\n            \"children\" : [\n                0,\n                1,\n                2,\n                6,\n                7,\n                8,\n                12,\n                25,\n                27\n            ],\n            \"name\" : \"Bone\",\n            \"rotation\" : [\n                -9.942360179593379e-08,\n                1.798178272949258e-11,\n                -6.726625088049332e-07,\n                1\n            ],\n            \"translation\" : [\n                -2.274414651840667e-13,\n                1.0302940607070923,\n                0.4585784375667572\n            ]\n        },\n        {\n            \"name\" : \"Foor_B_L_Up\",\n            \"rotation\" : [\n                0.505608320236206,\n                0.0015724850818514824,\n                5.2286672769241704e-09,\n                0.8627618551254272\n            ],\n            \"scale\" : [\n                0.9999998211860657,\n                0.9999997615814209,\n                0.9999999403953552\n            ],\n            \"translation\" : [\n                0.00020509983005467802,\n                -0.065970279276371,\n                0.08358170092105865\n            ]\n        },\n        {\n            \"name\" : \"Foor_B_L_Down\",\n            \"rotation\" : [\n                -0.5269593596458435,\n                -0.0016388531075790524,\n                2.7703617178076456e-08,\n                0.8498889207839966\n            ],\n            \"scale\" : [\n                0.9999999403953552,\n                0.9999996423721313,\n                0.9999997019767761\n            ],\n            \"translation\" : [\n                -0.0001929824211401865,\n                0.062028367072343826,\n                0.08038971573114395\n            ]\n        },\n        {\n            \"children\" : [\n                29,\n                30\n            ],\n            \"name\" : \"Foor_B_L\",\n            \"rotation\" : [\n                0.0010857508750632405,\n                -0.6982361674308777,\n                0.7158657908439636,\n                0.0011132085928693414\n            ],\n            \"scale\" : [\n                1,\n                1.0000003576278687,\n                1.0000004768371582\n            ],\n            \"translation\" : [\n                0.7612166404724121,\n                0.16786102950572968,\n                0.8199025988578796\n            ]\n        },\n        {\n            \"name\" : \"Foot_B_R_Up\",\n            \"rotation\" : [\n                0.5056081414222717,\n                0.0015727386344224215,\n                -4.945306741888089e-08,\n                0.8627619743347168\n            ],\n            \"scale\" : [\n                0.9999999403953552,\n                1.0000001192092896,\n                1.000000238418579\n            ],\n            \"translation\" : [\n                0.0006378455436788499,\n                -0.06596884876489639,\n                0.08358174562454224\n            ]\n        },\n        {\n            \"name\" : \"Foot_B_R_Down\",\n            \"rotation\" : [\n                -0.5269593000411987,\n                -0.0016390724340453744,\n                -2.7395419266440513e-10,\n                0.8498889803886414\n            ],\n            \"scale\" : [\n                1,\n                1.0000001192092896,\n                0.9999999403953552\n            ],\n            \"translation\" : [\n                0.00023975693329703063,\n                0.06202973052859306,\n                0.08038969337940216\n            ]\n        },\n        {\n            \"children\" : [\n                32,\n                33\n            ],\n            \"name\" : \"Foot_B_R\",\n            \"rotation\" : [\n                0.0010858702007681131,\n                -0.6982361674308777,\n                0.7158657908439636,\n                0.0011134578380733728\n            ],\n            \"scale\" : [\n                1.0000001192092896,\n                0.9999999403953552,\n                0.9999997019767761\n            ],\n            \"translation\" : [\n                -0.7614412903785706,\n                0.16786102950572968,\n                0.8199025392532349\n            ]\n        },\n        {\n            \"name\" : \"Foot_A_L\",\n            \"rotation\" : [\n                -0.5028163194656372,\n                0.5050809979438782,\n                -0.49486684799194336,\n                0.49716776609420776\n            ],\n            \"scale\" : [\n                1.0000001192092896,\n                0.9999998807907104,\n                1\n            ],\n            \"translation\" : [\n                0.44878876209259033,\n                0.1091223955154419,\n                -0.7555992007255554\n            ]\n        },\n        {\n            \"name\" : \"Foot_A_R\",\n            \"rotation\" : [\n                -0.5028164386749268,\n                0.5050811171531677,\n                -0.49486684799194336,\n                0.49716758728027344\n            ],\n            \"scale\" : [\n                1,\n                0.9999998807907104,\n                0.9999998211860657\n            ],\n            \"translation\" : [\n                -0.4486347734928131,\n                0.10912244766950607,\n                -0.7555995583534241\n            ]\n        },\n        {\n            \"children\" : [\n                28,\n                31,\n                34,\n                35,\n                36\n            ],\n            \"name\" : \"root\",\n            \"rotation\" : [\n                1.1634129748472333e-07,\n                0,\n                0,\n                1\n            ],\n            \"translation\" : [\n                0,\n                8.239450721703179e-08,\n                -0.5057339072227478\n            ]\n        },\n        {\n            \"mesh\" : 0,\n            \"name\" : \"body.002\",\n            \"skin\" : 0\n        },\n        {\n            \"mesh\" : 1,\n            \"name\" : \"body.003\",\n            \"skin\" : 0\n        },\n        {\n            \"mesh\" : 2,\n            \"name\" : \"body.004\",\n            \"skin\" : 0\n        },\n        {\n            \"mesh\" : 3,\n            \"name\" : \"body.005\",\n            \"skin\" : 0\n        },\n        {\n            \"mesh\" : 4,\n            \"name\" : \"body.007\",\n            \"skin\" : 0\n        },\n        {\n            \"children\" : [\n                38,\n                39,\n                40,\n                41,\n                42,\n                37\n            ],\n            \"name\" : \"\\u9aa8\\u67b6.004\",\n            \"translation\" : [\n                0,\n                0,\n                0.5057339072227478\n            ]\n        }\n    ],\n    \"animations\" : [\n        {\n            \"channels\" : [\n                {\n                    \"sampler\" : 0,\n                    \"target\" : {\n                        \"node\" : 28,\n                        \"path\" : \"translation\"\n                    }\n                },\n                {\n                    \"sampler\" : 1,\n                    \"target\" : {\n                        \"node\" : 28,\n                        \"path\" : \"rotation\"\n                    }\n                },\n                {\n                    \"sampler\" : 2,\n                    \"target\" : {\n                        \"node\" : 28,\n                        \"path\" : \"scale\"\n                    }\n                },\n                {\n                    \"sampler\" : 3,\n                    \"target\" : {\n                        \"node\" : 0,\n                        \"path\" : \"translation\"\n                    }\n                },\n                {\n                    \"sampler\" : 4,\n                    \"target\" : {\n                        \"node\" : 0,\n                        \"path\" : \"rotation\"\n                    }\n                },\n                {\n                    \"sampler\" : 5,\n                    \"target\" : {\n                        \"node\" : 0,\n                        \"path\" : \"scale\"\n                    }\n                },\n                {\n                    \"sampler\" : 6,\n                    \"target\" : {\n                        \"node\" : 1,\n                        \"path\" : \"translation\"\n                    }\n                },\n                {\n                    \"sampler\" : 7,\n                    \"target\" : {\n                        \"node\" : 1,\n                        \"path\" : \"rotation\"\n                    }\n                },\n                {\n                    \"sampler\" : 8,\n                    \"target\" : {\n                        \"node\" : 1,\n                        \"path\" : \"scale\"\n                    }\n                },\n                {\n                    \"sampler\" : 9,\n                    \"target\" : {\n                        \"node\" : 2,\n                        \"path\" : \"translation\"\n                    }\n                },\n                {\n                    \"sampler\" : 10,\n                    \"target\" : {\n                        \"node\" : 2,\n                        \"path\" : \"rotation\"\n                    }\n                },\n                {\n                    \"sampler\" : 11,\n                    \"target\" : {\n                        \"node\" : 2,\n                        \"path\" : \"scale\"\n                    }\n                },\n                {\n                    \"sampler\" : 12,\n                    \"target\" : {\n                        \"node\" : 6,\n                        \"path\" : \"translation\"\n                    }\n                },\n                {\n                    \"sampler\" : 13,\n                    \"target\" : {\n                        \"node\" : 6,\n                        \"path\" : \"rotation\"\n                    }\n                },\n                {\n                    \"sampler\" : 14,\n                    \"target\" : {\n                        \"node\" : 6,\n                        \"path\" : \"scale\"\n                    }\n                },\n                {\n                    \"sampler\" : 15,\n                    \"target\" : {\n                        \"node\" : 3,\n                        \"path\" : \"translation\"\n                    }\n                },\n                {\n                    \"sampler\" : 16,\n                    \"target\" : {\n                        \"node\" : 3,\n                        \"path\" : \"rotation\"\n                    }\n                },\n                {\n                    \"sampler\" : 17,\n                    \"target\" : {\n                        \"node\" : 3,\n                        \"path\" : \"scale\"\n                    }\n                },\n                {\n                    \"sampler\" : 18,\n                    \"target\" : {\n                        \"node\" : 4,\n                        \"path\" : \"translation\"\n                    }\n                },\n                {\n                    \"sampler\" : 19,\n                    \"target\" : {\n                        \"node\" : 4,\n                        \"path\" : \"rotation\"\n                    }\n                },\n                {\n                    \"sampler\" : 20,\n                    \"target\" : {\n                        \"node\" : 4,\n                        \"path\" : \"scale\"\n                    }\n                },\n                {\n                    \"sampler\" : 21,\n                    \"target\" : {\n                        \"node\" : 5,\n                        \"path\" : \"translation\"\n                    }\n                },\n                {\n                    \"sampler\" : 22,\n                    \"target\" : {\n                        \"node\" : 5,\n                        \"path\" : \"rotation\"\n                    }\n                },\n                {\n                    \"sampler\" : 23,\n                    \"target\" : {\n                        \"node\" : 5,\n                        \"path\" : \"scale\"\n                    }\n                },\n                {\n                    \"sampler\" : 24,\n                    \"target\" : {\n                        \"node\" : 7,\n                        \"path\" : \"translation\"\n                    }\n                },\n                {\n                    \"sampler\" : 25,\n                    \"target\" : {\n                        \"node\" : 7,\n                        \"path\" : \"rotation\"\n                    }\n                },\n                {\n                    \"sampler\" : 26,\n                    \"target\" : {\n                        \"node\" : 7,\n                        \"path\" : \"scale\"\n                    }\n                },\n                {\n                    \"sampler\" : 27,\n                    \"target\" : {\n                        \"node\" : 8,\n                        \"path\" : \"translation\"\n                    }\n                },\n                {\n                    \"sampler\" : 28,\n                    \"target\" : {\n                        \"node\" : 8,\n                        \"path\" : \"rotation\"\n                    }\n                },\n                {\n                    \"sampler\" : 29,\n                    \"target\" : {\n                        \"node\" : 8,\n                        \"path\" : \"scale\"\n                    }\n                },\n                {\n                    \"sampler\" : 30,\n                    \"target\" : {\n                        \"node\" : 12,\n                        \"path\" : \"translation\"\n                    }\n                },\n                {\n                    \"sampler\" : 31,\n                    \"target\" : {\n                        \"node\" : 12,\n                        \"path\" : \"rotation\"\n                    }\n                },\n                {\n                    \"sampler\" : 32,\n                    \"target\" : {\n                        \"node\" : 12,\n                        \"path\" : \"scale\"\n                    }\n                },\n                {\n                    \"sampler\" : 33,\n                    \"target\" : {\n                        \"node\" : 9,\n                        \"path\" : \"translation\"\n                    }\n                },\n                {\n                    \"sampler\" : 34,\n                    \"target\" : {\n                        \"node\" : 9,\n                        \"path\" : \"rotation\"\n                    }\n                },\n                {\n                    \"sampler\" : 35,\n                    \"target\" : {\n                        \"node\" : 9,\n                        \"path\" : \"scale\"\n                    }\n                },\n                {\n                    \"sampler\" : 36,\n                    \"target\" : {\n                        \"node\" : 10,\n                        \"path\" : \"translation\"\n                    }\n                },\n                {\n                    \"sampler\" : 37,\n                    \"target\" : {\n                        \"node\" : 10,\n                        \"path\" : \"rotation\"\n                    }\n                },\n                {\n                    \"sampler\" : 38,\n                    \"target\" : {\n                        \"node\" : 10,\n                        \"path\" : \"scale\"\n                    }\n                },\n                {\n                    \"sampler\" : 39,\n                    \"target\" : {\n                        \"node\" : 11,\n                        \"path\" : \"translation\"\n                    }\n                },\n                {\n                    \"sampler\" : 40,\n                    \"target\" : {\n                        \"node\" : 11,\n                        \"path\" : \"rotation\"\n                    }\n                },\n                {\n                    \"sampler\" : 41,\n                    \"target\" : {\n                        \"node\" : 11,\n                        \"path\" : \"scale\"\n                    }\n                },\n                {\n                    \"sampler\" : 42,\n                    \"target\" : {\n                        \"node\" : 25,\n                        \"path\" : \"translation\"\n                    }\n                },\n                {\n                    \"sampler\" : 43,\n                    \"target\" : {\n                        \"node\" : 25,\n                        \"path\" : \"rotation\"\n                    }\n                },\n                {\n                    \"sampler\" : 44,\n                    \"target\" : {\n                        \"node\" : 25,\n                        \"path\" : \"scale\"\n                    }\n                },\n                {\n                    \"sampler\" : 45,\n                    \"target\" : {\n                        \"node\" : 24,\n                        \"path\" : \"translation\"\n                    }\n                },\n                {\n                    \"sampler\" : 46,\n                    \"target\" : {\n                        \"node\" : 24,\n                        \"path\" : \"rotation\"\n                    }\n                },\n                {\n                    \"sampler\" : 47,\n                    \"target\" : {\n                        \"node\" : 24,\n                        \"path\" : \"scale\"\n                    }\n                },\n                {\n                    \"sampler\" : 48,\n                    \"target\" : {\n                        \"node\" : 23,\n                        \"path\" : \"translation\"\n                    }\n                },\n                {\n                    \"sampler\" : 49,\n                    \"target\" : {\n                        \"node\" : 23,\n                        \"path\" : \"rotation\"\n                    }\n                },\n                {\n                    \"sampler\" : 50,\n                    \"target\" : {\n                        \"node\" : 23,\n                        \"path\" : \"scale\"\n                    }\n                },\n                {\n                    \"sampler\" : 51,\n                    \"target\" : {\n                        \"node\" : 22,\n                        \"path\" : \"translation\"\n                    }\n                },\n                {\n                    \"sampler\" : 52,\n                    \"target\" : {\n                        \"node\" : 22,\n                        \"path\" : \"rotation\"\n                    }\n                },\n                {\n                    \"sampler\" : 53,\n                    \"target\" : {\n                        \"node\" : 22,\n                        \"path\" : \"scale\"\n                    }\n                },\n                {\n                    \"sampler\" : 54,\n                    \"target\" : {\n                        \"node\" : 21,\n                        \"path\" : \"translation\"\n                    }\n                },\n                {\n                    \"sampler\" : 55,\n                    \"target\" : {\n                        \"node\" : 21,\n                        \"path\" : \"rotation\"\n                    }\n                },\n                {\n                    \"sampler\" : 56,\n                    \"target\" : {\n                        \"node\" : 21,\n                        \"path\" : \"scale\"\n                    }\n                },\n                {\n                    \"sampler\" : 57,\n                    \"target\" : {\n                        \"node\" : 16,\n                        \"path\" : \"translation\"\n                    }\n                },\n                {\n                    \"sampler\" : 58,\n                    \"target\" : {\n                        \"node\" : 16,\n                        \"path\" : \"rotation\"\n                    }\n                },\n                {\n                    \"sampler\" : 59,\n                    \"target\" : {\n                        \"node\" : 16,\n                        \"path\" : \"scale\"\n                    }\n                },\n                {\n                    \"sampler\" : 60,\n                    \"target\" : {\n                        \"node\" : 15,\n                        \"path\" : \"translation\"\n                    }\n                },\n                {\n                    \"sampler\" : 61,\n                    \"target\" : {\n                        \"node\" : 15,\n                        \"path\" : \"rotation\"\n                    }\n                },\n                {\n                    \"sampler\" : 62,\n                    \"target\" : {\n                        \"node\" : 15,\n                        \"path\" : \"scale\"\n                    }\n                },\n                {\n                    \"sampler\" : 63,\n                    \"target\" : {\n                        \"node\" : 14,\n                        \"path\" : \"translation\"\n                    }\n                },\n                {\n                    \"sampler\" : 64,\n                    \"target\" : {\n                        \"node\" : 14,\n                        \"path\" : \"rotation\"\n                    }\n                },\n                {\n                    \"sampler\" : 65,\n                    \"target\" : {\n                        \"node\" : 14,\n                        \"path\" : \"scale\"\n                    }\n                },\n                {\n                    \"sampler\" : 66,\n                    \"target\" : {\n                        \"node\" : 20,\n                        \"path\" : \"translation\"\n                    }\n                },\n                {\n                    \"sampler\" : 67,\n                    \"target\" : {\n                        \"node\" : 20,\n                        \"path\" : \"rotation\"\n                    }\n                },\n                {\n                    \"sampler\" : 68,\n                    \"target\" : {\n                        \"node\" : 20,\n                        \"path\" : \"scale\"\n                    }\n                },\n                {\n                    \"sampler\" : 69,\n                    \"target\" : {\n                        \"node\" : 19,\n                        \"path\" : \"translation\"\n                    }\n                },\n                {\n                    \"sampler\" : 70,\n                    \"target\" : {\n                        \"node\" : 19,\n                        \"path\" : \"rotation\"\n                    }\n                },\n                {\n                    \"sampler\" : 71,\n                    \"target\" : {\n                        \"node\" : 19,\n                        \"path\" : \"scale\"\n                    }\n                },\n                {\n                    \"sampler\" : 72,\n                    \"target\" : {\n                        \"node\" : 18,\n                        \"path\" : \"translation\"\n                    }\n                },\n                {\n                    \"sampler\" : 73,\n                    \"target\" : {\n                        \"node\" : 18,\n                        \"path\" : \"rotation\"\n                    }\n                },\n                {\n                    \"sampler\" : 74,\n                    \"target\" : {\n                        \"node\" : 18,\n                        \"path\" : \"scale\"\n                    }\n                },\n                {\n                    \"sampler\" : 75,\n                    \"target\" : {\n                        \"node\" : 27,\n                        \"path\" : \"translation\"\n                    }\n                },\n                {\n                    \"sampler\" : 76,\n                    \"target\" : {\n                        \"node\" : 27,\n                        \"path\" : \"rotation\"\n                    }\n                },\n                {\n                    \"sampler\" : 77,\n                    \"target\" : {\n                        \"node\" : 27,\n                        \"path\" : \"scale\"\n                    }\n                },\n                {\n                    \"sampler\" : 78,\n                    \"target\" : {\n                        \"node\" : 26,\n                        \"path\" : \"translation\"\n                    }\n                },\n                {\n                    \"sampler\" : 79,\n                    \"target\" : {\n                        \"node\" : 26,\n                        \"path\" : \"rotation\"\n                    }\n                },\n                {\n                    \"sampler\" : 80,\n                    \"target\" : {\n                        \"node\" : 26,\n                        \"path\" : \"scale\"\n                    }\n                },\n                {\n                    \"sampler\" : 81,\n                    \"target\" : {\n                        \"node\" : 31,\n                        \"path\" : \"translation\"\n                    }\n                },\n                {\n                    \"sampler\" : 82,\n                    \"target\" : {\n                        \"node\" : 31,\n                        \"path\" : \"rotation\"\n                    }\n                },\n                {\n                    \"sampler\" : 83,\n                    \"target\" : {\n                        \"node\" : 31,\n                        \"path\" : \"scale\"\n                    }\n                },\n                {\n                    \"sampler\" : 84,\n                    \"target\" : {\n                        \"node\" : 29,\n                        \"path\" : \"translation\"\n                    }\n                },\n                {\n                    \"sampler\" : 85,\n                    \"target\" : {\n                        \"node\" : 29,\n                        \"path\" : \"rotation\"\n                    }\n                },\n                {\n                    \"sampler\" : 86,\n                    \"target\" : {\n                        \"node\" : 29,\n                        \"path\" : \"scale\"\n                    }\n                },\n                {\n                    \"sampler\" : 87,\n                    \"target\" : {\n                        \"node\" : 30,\n                        \"path\" : \"translation\"\n                    }\n                },\n                {\n                    \"sampler\" : 88,\n                    \"target\" : {\n                        \"node\" : 30,\n                        \"path\" : \"rotation\"\n                    }\n                },\n                {\n                    \"sampler\" : 89,\n                    \"target\" : {\n                        \"node\" : 30,\n                        \"path\" : \"scale\"\n                    }\n                },\n                {\n                    \"sampler\" : 90,\n                    \"target\" : {\n                        \"node\" : 34,\n                        \"path\" : \"translation\"\n                    }\n                },\n                {\n                    \"sampler\" : 91,\n                    \"target\" : {\n                        \"node\" : 34,\n                        \"path\" : \"rotation\"\n                    }\n                },\n                {\n                    \"sampler\" : 92,\n                    \"target\" : {\n                        \"node\" : 34,\n                        \"path\" : \"scale\"\n                    }\n                },\n                {\n                    \"sampler\" : 93,\n                    \"target\" : {\n                        \"node\" : 32,\n                        \"path\" : \"translation\"\n                    }\n                },\n                {\n                    \"sampler\" : 94,\n                    \"target\" : {\n                        \"node\" : 32,\n                        \"path\" : \"rotation\"\n                    }\n                },\n                {\n                    \"sampler\" : 95,\n                    \"target\" : {\n                        \"node\" : 32,\n                        \"path\" : \"scale\"\n                    }\n                },\n                {\n                    \"sampler\" : 96,\n                    \"target\" : {\n                        \"node\" : 33,\n                        \"path\" : \"translation\"\n                    }\n                },\n                {\n                    \"sampler\" : 97,\n                    \"target\" : {\n                        \"node\" : 33,\n                        \"path\" : \"rotation\"\n                    }\n                },\n                {\n                    \"sampler\" : 98,\n                    \"target\" : {\n                        \"node\" : 33,\n                        \"path\" : \"scale\"\n                    }\n                },\n                {\n                    \"sampler\" : 99,\n                    \"target\" : {\n                        \"node\" : 35,\n                        \"path\" : \"translation\"\n                    }\n                },\n                {\n                    \"sampler\" : 100,\n                    \"target\" : {\n                        \"node\" : 35,\n                        \"path\" : \"rotation\"\n                    }\n                },\n                {\n                    \"sampler\" : 101,\n                    \"target\" : {\n                        \"node\" : 35,\n                        \"path\" : \"scale\"\n                    }\n                },\n                {\n                    \"sampler\" : 102,\n                    \"target\" : {\n                        \"node\" : 36,\n                        \"path\" : \"translation\"\n                    }\n                },\n                {\n                    \"sampler\" : 103,\n                    \"target\" : {\n                        \"node\" : 36,\n                        \"path\" : \"rotation\"\n                    }\n                },\n                {\n                    \"sampler\" : 104,\n                    \"target\" : {\n                        \"node\" : 36,\n                        \"path\" : \"scale\"\n                    }\n                }\n            ],\n            \"name\" : \"run\",\n            \"samplers\" : [\n                {\n                    \"input\" : 35,\n                    \"interpolation\" : \"LINEAR\",\n                    \"output\" : 36\n                },\n                {\n                    \"input\" : 35,\n                    \"interpolation\" : \"LINEAR\",\n                    \"output\" : 37\n                },\n                {\n                    \"input\" : 38,\n                    \"interpolation\" : \"LINEAR\",\n                    \"output\" : 39\n                },\n                {\n                    \"input\" : 38,\n                    \"interpolation\" : \"LINEAR\",\n                    \"output\" : 40\n                },\n                {\n                    \"input\" : 35,\n                    \"interpolation\" : \"LINEAR\",\n                    \"output\" : 41\n                },\n                {\n                    \"input\" : 38,\n                    \"interpolation\" : \"LINEAR\",\n                    \"output\" : 42\n                },\n                {\n                    \"input\" : 38,\n                    \"interpolation\" : \"LINEAR\",\n                    \"output\" : 43\n                },\n                {\n                    \"input\" : 35,\n                    \"interpolation\" : \"LINEAR\",\n                    \"output\" : 44\n                },\n                {\n                    \"input\" : 38,\n                    \"interpolation\" : \"LINEAR\",\n                    \"output\" : 45\n                },\n                {\n                    \"input\" : 38,\n                    \"interpolation\" : \"LINEAR\",\n                    \"output\" : 46\n                },\n                {\n                    \"input\" : 35,\n                    \"interpolation\" : \"LINEAR\",\n                    \"output\" : 47\n                },\n                {\n                    \"input\" : 38,\n                    \"interpolation\" : \"LINEAR\",\n                    \"output\" : 48\n                },\n                {\n                    \"input\" : 38,\n                    \"interpolation\" : \"LINEAR\",\n                    \"output\" : 49\n                },\n                {\n                    \"input\" : 35,\n                    \"interpolation\" : \"LINEAR\",\n                    \"output\" : 50\n                },\n                {\n                    \"input\" : 38,\n                    \"interpolation\" : \"LINEAR\",\n                    \"output\" : 51\n                },\n                {\n                    \"input\" : 38,\n                    \"interpolation\" : \"LINEAR\",\n                    \"output\" : 52\n                },\n                {\n                    \"input\" : 35,\n                    \"interpolation\" : \"LINEAR\",\n                    \"output\" : 53\n                },\n                {\n                    \"input\" : 38,\n                    \"interpolation\" : \"LINEAR\",\n                    \"output\" : 54\n                },\n                {\n                    \"input\" : 38,\n                    \"interpolation\" : \"LINEAR\",\n                    \"output\" : 55\n                },\n                {\n                    \"input\" : 35,\n                    \"interpolation\" : \"LINEAR\",\n                    \"output\" : 56\n                },\n                {\n                    \"input\" : 38,\n                    \"interpolation\" : \"LINEAR\",\n                    \"output\" : 57\n                },\n                {\n                    \"input\" : 38,\n                    \"interpolation\" : \"LINEAR\",\n                    \"output\" : 58\n                },\n                {\n                    \"input\" : 35,\n                    \"interpolation\" : \"LINEAR\",\n                    \"output\" : 59\n                },\n                {\n                    \"input\" : 38,\n                    \"interpolation\" : \"LINEAR\",\n                    \"output\" : 60\n                },\n                {\n                    \"input\" : 38,\n                    \"interpolation\" : \"LINEAR\",\n                    \"output\" : 61\n                },\n                {\n                    \"input\" : 35,\n                    \"interpolation\" : \"LINEAR\",\n                    \"output\" : 62\n                },\n                {\n                    \"input\" : 38,\n                    \"interpolation\" : \"LINEAR\",\n                    \"output\" : 63\n                },\n                {\n                    \"input\" : 38,\n                    \"interpolation\" : \"LINEAR\",\n                    \"output\" : 64\n                },\n                {\n                    \"input\" : 35,\n                    \"interpolation\" : \"LINEAR\",\n                    \"output\" : 65\n                },\n                {\n                    \"input\" : 38,\n                    \"interpolation\" : \"LINEAR\",\n                    \"output\" : 66\n                },\n                {\n                    \"input\" : 38,\n                    \"interpolation\" : \"LINEAR\",\n                    \"output\" : 67\n                },\n                {\n                    \"input\" : 35,\n                    \"interpolation\" : \"LINEAR\",\n                    \"output\" : 68\n                },\n                {\n                    \"input\" : 38,\n                    \"interpolation\" : \"LINEAR\",\n                    \"output\" : 69\n                },\n                {\n                    \"input\" : 38,\n                    \"interpolation\" : \"LINEAR\",\n                    \"output\" : 70\n                },\n                {\n                    \"input\" : 35,\n                    \"interpolation\" : \"LINEAR\",\n                    \"output\" : 71\n                },\n                {\n                    \"input\" : 38,\n                    \"interpolation\" : \"LINEAR\",\n                    \"output\" : 72\n                },\n                {\n                    \"input\" : 38,\n                    \"interpolation\" : \"LINEAR\",\n                    \"output\" : 73\n                },\n                {\n                    \"input\" : 35,\n                    \"interpolation\" : \"LINEAR\",\n                    \"output\" : 74\n                },\n                {\n                    \"input\" : 38,\n                    \"interpolation\" : \"LINEAR\",\n                    \"output\" : 75\n                },\n                {\n                    \"input\" : 38,\n                    \"interpolation\" : \"LINEAR\",\n                    \"output\" : 76\n                },\n                {\n                    \"input\" : 35,\n                    \"interpolation\" : \"LINEAR\",\n                    \"output\" : 77\n                },\n                {\n                    \"input\" : 38,\n                    \"interpolation\" : \"LINEAR\",\n                    \"output\" : 78\n                },\n                {\n                    \"input\" : 38,\n                    \"interpolation\" : \"LINEAR\",\n                    \"output\" : 79\n                },\n                {\n                    \"input\" : 35,\n                    \"interpolation\" : \"LINEAR\",\n                    \"output\" : 80\n                },\n                {\n                    \"input\" : 38,\n                    \"interpolation\" : \"LINEAR\",\n                    \"output\" : 81\n                },\n                {\n                    \"input\" : 38,\n                    \"interpolation\" : \"LINEAR\",\n                    \"output\" : 82\n                },\n                {\n                    \"input\" : 35,\n                    \"interpolation\" : \"LINEAR\",\n                    \"output\" : 83\n                },\n                {\n                    \"input\" : 38,\n                    \"interpolation\" : \"LINEAR\",\n                    \"output\" : 84\n                },\n                {\n                    \"input\" : 38,\n                    \"interpolation\" : \"LINEAR\",\n                    \"output\" : 85\n                },\n                {\n                    \"input\" : 35,\n                    \"interpolation\" : \"LINEAR\",\n                    \"output\" : 86\n                },\n                {\n                    \"input\" : 38,\n                    \"interpolation\" : \"LINEAR\",\n                    \"output\" : 87\n                },\n                {\n                    \"input\" : 38,\n                    \"interpolation\" : \"LINEAR\",\n                    \"output\" : 88\n                },\n                {\n                    \"input\" : 38,\n                    \"interpolation\" : \"LINEAR\",\n                    \"output\" : 89\n                },\n                {\n                    \"input\" : 38,\n                    \"interpolation\" : \"LINEAR\",\n                    \"output\" : 90\n                },\n                {\n                    \"input\" : 38,\n                    \"interpolation\" : \"LINEAR\",\n                    \"output\" : 91\n                },\n                {\n                    \"input\" : 38,\n                    \"interpolation\" : \"LINEAR\",\n                    \"output\" : 92\n                },\n                {\n                    \"input\" : 38,\n                    \"interpolation\" : \"LINEAR\",\n                    \"output\" : 93\n                },\n                {\n                    \"input\" : 38,\n                    \"interpolation\" : \"LINEAR\",\n                    \"output\" : 94\n                },\n                {\n                    \"input\" : 35,\n                    \"interpolation\" : \"LINEAR\",\n                    \"output\" : 95\n                },\n                {\n                    \"input\" : 38,\n                    \"interpolation\" : \"LINEAR\",\n                    \"output\" : 96\n                },\n                {\n                    \"input\" : 38,\n                    \"interpolation\" : \"LINEAR\",\n                    \"output\" : 97\n                },\n                {\n                    \"input\" : 35,\n                    \"interpolation\" : \"LINEAR\",\n                    \"output\" : 98\n                },\n                {\n                    \"input\" : 38,\n                    \"interpolation\" : \"LINEAR\",\n                    \"output\" : 99\n                },\n                {\n                    \"input\" : 38,\n                    \"interpolation\" : \"LINEAR\",\n                    \"output\" : 100\n                },\n                {\n                    \"input\" : 35,\n                    \"interpolation\" : \"LINEAR\",\n                    \"output\" : 101\n                },\n                {\n                    \"input\" : 38,\n                    \"interpolation\" : \"LINEAR\",\n                    \"output\" : 102\n                },\n                {\n                    \"input\" : 38,\n                    \"interpolation\" : \"LINEAR\",\n                    \"output\" : 103\n                },\n                {\n                    \"input\" : 35,\n                    \"interpolation\" : \"LINEAR\",\n                    \"output\" : 104\n                },\n                {\n                    \"input\" : 38,\n                    \"interpolation\" : \"LINEAR\",\n                    \"output\" : 105\n                },\n                {\n                    \"input\" : 38,\n                    \"interpolation\" : \"LINEAR\",\n                    \"output\" : 106\n                },\n                {\n                    \"input\" : 35,\n                    \"interpolation\" : \"LINEAR\",\n                    \"output\" : 107\n                },\n                {\n                    \"input\" : 38,\n                    \"interpolation\" : \"LINEAR\",\n                    \"output\" : 108\n                },\n                {\n                    \"input\" : 38,\n                    \"interpolation\" : \"LINEAR\",\n                    \"output\" : 109\n                },\n                {\n                    \"input\" : 35,\n                    \"interpolation\" : \"LINEAR\",\n                    \"output\" : 110\n                },\n                {\n                    \"input\" : 38,\n                    \"interpolation\" : \"LINEAR\",\n                    \"output\" : 111\n                },\n                {\n                    \"input\" : 38,\n                    \"interpolation\" : \"LINEAR\",\n                    \"output\" : 112\n                },\n                {\n                    \"input\" : 38,\n                    \"interpolation\" : \"LINEAR\",\n                    \"output\" : 113\n                },\n                {\n                    \"input\" : 38,\n                    \"interpolation\" : \"LINEAR\",\n                    \"output\" : 114\n                },\n                {\n                    \"input\" : 38,\n                    \"interpolation\" : \"LINEAR\",\n                    \"output\" : 115\n                },\n                {\n                    \"input\" : 38,\n                    \"interpolation\" : \"LINEAR\",\n                    \"output\" : 116\n                },\n                {\n                    \"input\" : 38,\n                    \"interpolation\" : \"LINEAR\",\n                    \"output\" : 117\n                },\n                {\n                    \"input\" : 35,\n                    \"interpolation\" : \"LINEAR\",\n                    \"output\" : 118\n                },\n                {\n                    \"input\" : 35,\n                    \"interpolation\" : \"LINEAR\",\n                    \"output\" : 119\n                },\n                {\n                    \"input\" : 38,\n                    \"interpolation\" : \"LINEAR\",\n                    \"output\" : 120\n                },\n                {\n                    \"input\" : 38,\n                    \"interpolation\" : \"LINEAR\",\n                    \"output\" : 121\n                },\n                {\n                    \"input\" : 38,\n                    \"interpolation\" : \"LINEAR\",\n                    \"output\" : 122\n                },\n                {\n                    \"input\" : 38,\n                    \"interpolation\" : \"LINEAR\",\n                    \"output\" : 123\n                },\n                {\n                    \"input\" : 38,\n                    \"interpolation\" : \"LINEAR\",\n                    \"output\" : 124\n                },\n                {\n                    \"input\" : 38,\n                    \"interpolation\" : \"LINEAR\",\n                    \"output\" : 125\n                },\n                {\n                    \"input\" : 38,\n                    \"interpolation\" : \"LINEAR\",\n                    \"output\" : 126\n                },\n                {\n                    \"input\" : 35,\n                    \"interpolation\" : \"LINEAR\",\n                    \"output\" : 127\n                },\n                {\n                    \"input\" : 35,\n                    \"interpolation\" : \"LINEAR\",\n                    \"output\" : 128\n                },\n                {\n                    \"input\" : 38,\n                    \"interpolation\" : \"LINEAR\",\n                    \"output\" : 129\n                },\n                {\n                    \"input\" : 38,\n                    \"interpolation\" : \"LINEAR\",\n                    \"output\" : 130\n                },\n                {\n                    \"input\" : 35,\n                    \"interpolation\" : \"LINEAR\",\n                    \"output\" : 131\n                },\n                {\n                    \"input\" : 38,\n                    \"interpolation\" : \"LINEAR\",\n                    \"output\" : 132\n                },\n                {\n                    \"input\" : 38,\n                    \"interpolation\" : \"LINEAR\",\n                    \"output\" : 133\n                },\n                {\n                    \"input\" : 35,\n                    \"interpolation\" : \"LINEAR\",\n                    \"output\" : 134\n                },\n                {\n                    \"input\" : 38,\n                    \"interpolation\" : \"LINEAR\",\n                    \"output\" : 135\n                },\n                {\n                    \"input\" : 35,\n                    \"interpolation\" : \"LINEAR\",\n                    \"output\" : 136\n                },\n                {\n                    \"input\" : 35,\n                    \"interpolation\" : \"LINEAR\",\n                    \"output\" : 137\n                },\n                {\n                    \"input\" : 38,\n                    \"interpolation\" : \"LINEAR\",\n                    \"output\" : 138\n                },\n                {\n                    \"input\" : 35,\n                    \"interpolation\" : \"LINEAR\",\n                    \"output\" : 139\n                },\n                {\n                    \"input\" : 35,\n                    \"interpolation\" : \"LINEAR\",\n                    \"output\" : 140\n                },\n                {\n                    \"input\" : 38,\n                    \"interpolation\" : \"LINEAR\",\n                    \"output\" : 141\n                }\n            ]\n        }\n    ],\n    \"materials\" : [\n        {\n            \"doubleSided\" : true,\n            \"name\" : \"PBRLegB\",\n            \"normalTexture\" : {\n                \"index\" : 0,\n                \"scale\" : 0.4000000059604645\n            },\n            \"pbrMetallicRoughness\" : {\n                \"baseColorTexture\" : {\n                    \"index\" : 1\n                },\n                \"metallicRoughnessTexture\" : {\n                    \"index\" : 2\n                }\n            }\n        },\n        {\n            \"doubleSided\" : true,\n            \"name\" : \"PBRBody\",\n            \"normalTexture\" : {\n                \"index\" : 3,\n                \"scale\" : 0.4000000059604645\n            },\n            \"pbrMetallicRoughness\" : {\n                \"baseColorTexture\" : {\n                    \"index\" : 4\n                },\n                \"metallicRoughnessTexture\" : {\n                    \"index\" : 5\n                }\n            }\n        },\n        {\n            \"doubleSided\" : true,\n            \"emissiveFactor\" : [\n                1,\n                1,\n                1\n            ],\n            \"emissiveTexture\" : {\n                \"index\" : 6\n            },\n            \"name\" : \"light.006\",\n            \"pbrMetallicRoughness\" : {\n                \"baseColorTexture\" : {\n                    \"index\" : 7\n                },\n                \"metallicFactor\" : 0\n            }\n        },\n        {\n            \"alphaMode\" : \"BLEND\",\n            \"doubleSided\" : true,\n            \"name\" : \"glass.005\",\n            \"pbrMetallicRoughness\" : {\n                \"baseColorFactor\" : [\n                    0.32209986448287964,\n                    0.6948907971382141,\n                    0.8000000715255737,\n                    0.40979379415512085\n                ],\n                \"metallicFactor\" : 0,\n                \"roughnessFactor\" : 0.20360827445983887\n            }\n        },\n        {\n            \"doubleSided\" : true,\n            \"name\" : \"PBRLegA\",\n            \"normalTexture\" : {\n                \"index\" : 8,\n                \"scale\" : 0.4000000059604645\n            },\n            \"pbrMetallicRoughness\" : {\n                \"baseColorTexture\" : {\n                    \"index\" : 9\n                },\n                \"metallicRoughnessTexture\" : {\n                    \"index\" : 10\n                }\n            }\n        }\n    ],\n    \"meshes\" : [\n        {\n            \"name\" : \"\\u7403\\u4f53.001\",\n            \"primitives\" : [\n                {\n                    \"attributes\" : {\n                        \"POSITION\" : 0,\n                        \"NORMAL\" : 1,\n                        \"TEXCOORD_0\" : 2,\n                        \"TEXCOORD_1\" : 3,\n                        \"JOINTS_0\" : 4,\n                        \"WEIGHTS_0\" : 5\n                    },\n                    \"indices\" : 6,\n                    \"material\" : 0\n                }\n            ]\n        },\n        {\n            \"name\" : \"\\u7403\\u4f53.004\",\n            \"primitives\" : [\n                {\n                    \"attributes\" : {\n                        \"POSITION\" : 8,\n                        \"NORMAL\" : 9,\n                        \"TEXCOORD_0\" : 10,\n                        \"TEXCOORD_1\" : 11,\n                        \"JOINTS_0\" : 12,\n                        \"WEIGHTS_0\" : 13\n                    },\n                    \"indices\" : 14,\n                    \"material\" : 1\n                }\n            ]\n        },\n        {\n            \"name\" : \"\\u7403\\u4f53.005\",\n            \"primitives\" : [\n                {\n                    \"attributes\" : {\n                        \"POSITION\" : 15,\n                        \"NORMAL\" : 16,\n                        \"TEXCOORD_0\" : 17,\n                        \"TEXCOORD_1\" : 18,\n                        \"JOINTS_0\" : 19,\n                        \"WEIGHTS_0\" : 20\n                    },\n                    \"indices\" : 21,\n                    \"material\" : 2\n                }\n            ]\n        },\n        {\n            \"name\" : \"\\u7403\\u4f53.015\",\n            \"primitives\" : [\n                {\n                    \"attributes\" : {\n                        \"POSITION\" : 22,\n                        \"NORMAL\" : 23,\n                        \"TEXCOORD_0\" : 24,\n                        \"JOINTS_0\" : 25,\n                        \"WEIGHTS_0\" : 26\n                    },\n                    \"indices\" : 27,\n                    \"material\" : 3\n                }\n            ]\n        },\n        {\n            \"name\" : \"\\u7403\\u4f53.017\",\n            \"primitives\" : [\n                {\n                    \"attributes\" : {\n                        \"POSITION\" : 28,\n                        \"NORMAL\" : 29,\n                        \"TEXCOORD_0\" : 30,\n                        \"TEXCOORD_1\" : 31,\n                        \"JOINTS_0\" : 32,\n                        \"WEIGHTS_0\" : 33\n                    },\n                    \"indices\" : 34,\n                    \"material\" : 4\n                }\n            ]\n        }\n    ],\n    \"textures\" : [\n        {\n            \"sampler\" : 0,\n            \"source\" : 0\n        },\n        {\n            \"sampler\" : 0,\n            \"source\" : 1\n        },\n        {\n            \"sampler\" : 0,\n            \"source\" : 2\n        },\n        {\n            \"sampler\" : 0,\n            \"source\" : 3\n        },\n        {\n            \"sampler\" : 0,\n            \"source\" : 4\n        },\n        {\n            \"sampler\" : 0,\n            \"source\" : 5\n        },\n        {\n            \"sampler\" : 0,\n            \"source\" : 6\n        },\n        {\n            \"sampler\" : 0,\n            \"source\" : 6\n        },\n        {\n            \"sampler\" : 0,\n            \"source\" : 7\n        },\n        {\n            \"sampler\" : 0,\n            \"source\" : 8\n        },\n        {\n            \"sampler\" : 0,\n            \"source\" : 9\n        }\n    ],\n    \"images\" : [\n        {\n            \"mimeType\" : \"image/jpeg\",\n            \"name\" : \"legBNormal\",\n            \"uri\" : \"texture/legBNormal.jpg\"\n        },\n        {\n            \"mimeType\" : \"image/jpeg\",\n            \"name\" : \"LegBColorAo\",\n            \"uri\" : \"texture/LegBColorAo.jpg\"\n        },\n        {\n            \"mimeType\" : \"image/jpeg\",\n            \"name\" : \"legBMetallic-Roughness\",\n            \"uri\" : \"texture/legBMetallic-Roughness.jpg\"\n        },\n        {\n            \"mimeType\" : \"image/jpeg\",\n            \"name\" : \"bodyNormal\",\n            \"uri\" : \"texture/bodyNormal.jpg\"\n        },\n        {\n            \"mimeType\" : \"image/jpeg\",\n            \"name\" : \"bodyColorAo\",\n            \"uri\" : \"texture/bodyColorAo.jpg\"\n        },\n        {\n            \"mimeType\" : \"image/jpeg\",\n            \"name\" : \"bodyM\",\n            \"uri\" : \"texture/bodyM.jpg\"\n        },\n        {\n            \"mimeType\" : \"image/jpeg\",\n            \"name\" : \"lightColor\",\n            \"uri\" : \"texture/lightColor.jpg\"\n        },\n        {\n            \"mimeType\" : \"image/jpeg\",\n            \"name\" : \"legANormal\",\n            \"uri\" : \"texture/legANormal.jpg\"\n        },\n        {\n            \"mimeType\" : \"image/jpeg\",\n            \"name\" : \"LegAColorAo\",\n            \"uri\" : \"texture/LegAColorAo.jpg\"\n        },\n        {\n            \"mimeType\" : \"image/jpeg\",\n            \"name\" : \"legAMetallic-Roughness\",\n            \"uri\" : \"texture/legAMetallic-Roughness.jpg\"\n        }\n    ],\n    \"skins\" : [\n        {\n            \"inverseBindMatrices\" : 7,\n            \"joints\" : [\n                37,\n                28,\n                0,\n                1,\n                2,\n                6,\n                3,\n                4,\n                5,\n                7,\n                8,\n                12,\n                9,\n                10,\n                11,\n                25,\n                24,\n                23,\n                22,\n                21,\n                16,\n                15,\n                14,\n                13,\n                20,\n                19,\n                18,\n                17,\n                27,\n                26,\n                31,\n                29,\n                30,\n                34,\n                32,\n                33,\n                35,\n                36\n            ],\n            \"name\" : \"\\u9aa8\\u67b6.004\"\n        }\n    ],\n    \"accessors\" : [\n        {\n            \"bufferView\" : 0,\n            \"componentType\" : 5126,\n            \"count\" : 21384,\n            \"max\" : [\n                0.510848343372345,\n                1.1013883352279663,\n                0.21214276552200317\n            ],\n            \"min\" : [\n                -0.510848343372345,\n                0.00034224559203721583,\n                -0.9314292073249817\n            ],\n            \"type\" : \"VEC3\"\n        },\n        {\n            \"bufferView\" : 1,\n            \"componentType\" : 5126,\n            \"count\" : 21384,\n            \"type\" : \"VEC3\"\n        },\n        {\n            \"bufferView\" : 2,\n            \"componentType\" : 5126,\n            \"count\" : 21384,\n            \"type\" : \"VEC2\"\n        },\n        {\n            \"bufferView\" : 3,\n            \"componentType\" : 5126,\n            \"count\" : 21384,\n            \"type\" : \"VEC2\"\n        },\n        {\n            \"bufferView\" : 4,\n            \"componentType\" : 5121,\n            \"count\" : 21384,\n            \"type\" : \"VEC4\"\n        },\n        {\n            \"bufferView\" : 5,\n            \"componentType\" : 5126,\n            \"count\" : 21384,\n            \"type\" : \"VEC4\"\n        },\n        {\n            \"bufferView\" : 6,\n            \"componentType\" : 5123,\n            \"count\" : 65304,\n            \"type\" : \"SCALAR\"\n        },\n        {\n            \"bufferView\" : 7,\n            \"componentType\" : 5126,\n            \"count\" : 38,\n            \"type\" : \"MAT4\"\n        },\n        {\n            \"bufferView\" : 8,\n            \"componentType\" : 5126,\n            \"count\" : 14608,\n            \"max\" : [\n                0.4723866581916809,\n                1.6941920518875122,\n                1.0888464450836182\n            ],\n            \"min\" : [\n                -0.46661391854286194,\n                0.5273327231407166,\n                0.006076717283576727\n            ],\n            \"type\" : \"VEC3\"\n        },\n        {\n            \"bufferView\" : 9,\n            \"componentType\" : 5126,\n            \"count\" : 14608,\n            \"type\" : \"VEC3\"\n        },\n        {\n            \"bufferView\" : 10,\n            \"componentType\" : 5126,\n            \"count\" : 14608,\n            \"type\" : \"VEC2\"\n        },\n        {\n            \"bufferView\" : 11,\n            \"componentType\" : 5126,\n            \"count\" : 14608,\n            \"type\" : \"VEC2\"\n        },\n        {\n            \"bufferView\" : 12,\n            \"componentType\" : 5121,\n            \"count\" : 14608,\n            \"type\" : \"VEC4\"\n        },\n        {\n            \"bufferView\" : 13,\n            \"componentType\" : 5126,\n            \"count\" : 14608,\n            \"type\" : \"VEC4\"\n        },\n        {\n            \"bufferView\" : 14,\n            \"componentType\" : 5123,\n            \"count\" : 39447,\n            \"type\" : \"SCALAR\"\n        },\n        {\n            \"bufferView\" : 15,\n            \"componentType\" : 5126,\n            \"count\" : 352,\n            \"max\" : [\n                0.04665682464838028,\n                1.1574490070343018,\n                1.0764967203140259\n            ],\n            \"min\" : [\n                -0.046663861721754074,\n                0.8331701755523682,\n                1.048673391342163\n            ],\n            \"type\" : \"VEC3\"\n        },\n        {\n            \"bufferView\" : 16,\n            \"componentType\" : 5126,\n            \"count\" : 352,\n            \"type\" : \"VEC3\"\n        },\n        {\n            \"bufferView\" : 17,\n            \"componentType\" : 5126,\n            \"count\" : 352,\n            \"type\" : \"VEC2\"\n        },\n        {\n            \"bufferView\" : 18,\n            \"componentType\" : 5126,\n            \"count\" : 352,\n            \"type\" : \"VEC2\"\n        },\n        {\n            \"bufferView\" : 19,\n            \"componentType\" : 5121,\n            \"count\" : 352,\n            \"type\" : \"VEC4\"\n        },\n        {\n            \"bufferView\" : 20,\n            \"componentType\" : 5126,\n            \"count\" : 352,\n            \"type\" : \"VEC4\"\n        },\n        {\n            \"bufferView\" : 21,\n            \"componentType\" : 5123,\n            \"count\" : 1728,\n            \"type\" : \"SCALAR\"\n        },\n        {\n            \"bufferView\" : 22,\n            \"componentType\" : 5126,\n            \"count\" : 178,\n            \"max\" : [\n                0.044646505266427994,\n                1.1556379795074463,\n                1.0931721925735474\n            ],\n            \"min\" : [\n                -0.04465353861451149,\n                0.8349812030792236,\n                1.0728838443756104\n            ],\n            \"type\" : \"VEC3\"\n        },\n        {\n            \"bufferView\" : 23,\n            \"componentType\" : 5126,\n            \"count\" : 178,\n            \"type\" : \"VEC3\"\n        },\n        {\n            \"bufferView\" : 24,\n            \"componentType\" : 5126,\n            \"count\" : 178,\n            \"type\" : \"VEC2\"\n        },\n        {\n            \"bufferView\" : 25,\n            \"componentType\" : 5121,\n            \"count\" : 178,\n            \"type\" : \"VEC4\"\n        },\n        {\n            \"bufferView\" : 26,\n            \"componentType\" : 5126,\n            \"count\" : 178,\n            \"type\" : \"VEC4\"\n        },\n        {\n            \"bufferView\" : 27,\n            \"componentType\" : 5123,\n            \"count\" : 660,\n            \"type\" : \"SCALAR\"\n        },\n        {\n            \"bufferView\" : 28,\n            \"componentType\" : 5126,\n            \"count\" : 13169,\n            \"max\" : [\n                0.8473179340362549,\n                1.4347223043441772,\n                1.049629807472229\n            ],\n            \"min\" : [\n                -0.8473178744316101,\n                0.0007248258334584534,\n                0.3242524564266205\n            ],\n            \"type\" : \"VEC3\"\n        },\n        {\n            \"bufferView\" : 29,\n            \"componentType\" : 5126,\n            \"count\" : 13169,\n            \"type\" : \"VEC3\"\n        },\n        {\n            \"bufferView\" : 30,\n            \"componentType\" : 5126,\n            \"count\" : 13169,\n            \"type\" : \"VEC2\"\n        },\n        {\n            \"bufferView\" : 31,\n            \"componentType\" : 5126,\n            \"count\" : 13169,\n            \"type\" : \"VEC2\"\n        },\n        {\n            \"bufferView\" : 32,\n            \"componentType\" : 5121,\n            \"count\" : 13169,\n            \"type\" : \"VEC4\"\n        },\n        {\n            \"bufferView\" : 33,\n            \"componentType\" : 5126,\n            \"count\" : 13169,\n            \"type\" : \"VEC4\"\n        },\n        {\n            \"bufferView\" : 34,\n            \"componentType\" : 5123,\n            \"count\" : 43260,\n            \"type\" : \"SCALAR\"\n        },\n        {\n            \"bufferView\" : 35,\n            \"componentType\" : 5126,\n            \"count\" : 140,\n            \"max\" : [\n                5.833333333333333\n            ],\n            \"min\" : [\n                0.041666666666666664\n            ],\n            \"type\" : \"SCALAR\"\n        },\n        {\n            \"bufferView\" : 36,\n            \"componentType\" : 5126,\n            \"count\" : 140,\n            \"type\" : \"VEC3\"\n        },\n        {\n            \"bufferView\" : 37,\n            \"componentType\" : 5126,\n            \"count\" : 140,\n            \"type\" : \"VEC4\"\n        },\n        {\n            \"bufferView\" : 38,\n            \"componentType\" : 5126,\n            \"count\" : 2,\n            \"max\" : [\n                5.833333333333333\n            ],\n            \"min\" : [\n                0.041666666666666664\n            ],\n            \"type\" : \"SCALAR\"\n        },\n        {\n            \"bufferView\" : 39,\n            \"componentType\" : 5126,\n            \"count\" : 2,\n            \"type\" : \"VEC3\"\n        },\n        {\n            \"bufferView\" : 40,\n            \"componentType\" : 5126,\n            \"count\" : 2,\n            \"type\" : \"VEC3\"\n        },\n        {\n            \"bufferView\" : 41,\n            \"componentType\" : 5126,\n            \"count\" : 140,\n            \"type\" : \"VEC4\"\n        },\n        {\n            \"bufferView\" : 42,\n            \"componentType\" : 5126,\n            \"count\" : 2,\n            \"type\" : \"VEC3\"\n        },\n        {\n            \"bufferView\" : 43,\n            \"componentType\" : 5126,\n            \"count\" : 2,\n            \"type\" : \"VEC3\"\n        },\n        {\n            \"bufferView\" : 44,\n            \"componentType\" : 5126,\n            \"count\" : 140,\n            \"type\" : \"VEC4\"\n        },\n        {\n            \"bufferView\" : 45,\n            \"componentType\" : 5126,\n            \"count\" : 2,\n            \"type\" : \"VEC3\"\n        },\n        {\n            \"bufferView\" : 46,\n            \"componentType\" : 5126,\n            \"count\" : 2,\n            \"type\" : \"VEC3\"\n        },\n        {\n            \"bufferView\" : 47,\n            \"componentType\" : 5126,\n            \"count\" : 140,\n            \"type\" : \"VEC4\"\n        },\n        {\n            \"bufferView\" : 48,\n            \"componentType\" : 5126,\n            \"count\" : 2,\n            \"type\" : \"VEC3\"\n        },\n        {\n            \"bufferView\" : 49,\n            \"componentType\" : 5126,\n            \"count\" : 2,\n            \"type\" : \"VEC3\"\n        },\n        {\n            \"bufferView\" : 50,\n            \"componentType\" : 5126,\n            \"count\" : 140,\n            \"type\" : \"VEC4\"\n        },\n        {\n            \"bufferView\" : 51,\n            \"componentType\" : 5126,\n            \"count\" : 2,\n            \"type\" : \"VEC3\"\n        },\n        {\n            \"bufferView\" : 52,\n            \"componentType\" : 5126,\n            \"count\" : 2,\n            \"type\" : \"VEC3\"\n        },\n        {\n            \"bufferView\" : 53,\n            \"componentType\" : 5126,\n            \"count\" : 140,\n            \"type\" : \"VEC4\"\n        },\n        {\n            \"bufferView\" : 54,\n            \"componentType\" : 5126,\n            \"count\" : 2,\n            \"type\" : \"VEC3\"\n        },\n        {\n            \"bufferView\" : 55,\n            \"componentType\" : 5126,\n            \"count\" : 2,\n            \"type\" : \"VEC3\"\n        },\n        {\n            \"bufferView\" : 56,\n            \"componentType\" : 5126,\n            \"count\" : 140,\n            \"type\" : \"VEC4\"\n        },\n        {\n            \"bufferView\" : 57,\n            \"componentType\" : 5126,\n            \"count\" : 2,\n            \"type\" : \"VEC3\"\n        },\n        {\n            \"bufferView\" : 58,\n            \"componentType\" : 5126,\n            \"count\" : 2,\n            \"type\" : \"VEC3\"\n        },\n        {\n            \"bufferView\" : 59,\n            \"componentType\" : 5126,\n            \"count\" : 140,\n            \"type\" : \"VEC4\"\n        },\n        {\n            \"bufferView\" : 60,\n            \"componentType\" : 5126,\n            \"count\" : 2,\n            \"type\" : \"VEC3\"\n        },\n        {\n            \"bufferView\" : 61,\n            \"componentType\" : 5126,\n            \"count\" : 2,\n            \"type\" : \"VEC3\"\n        },\n        {\n            \"bufferView\" : 62,\n            \"componentType\" : 5126,\n            \"count\" : 140,\n            \"type\" : \"VEC4\"\n        },\n        {\n            \"bufferView\" : 63,\n            \"componentType\" : 5126,\n            \"count\" : 2,\n            \"type\" : \"VEC3\"\n        },\n        {\n            \"bufferView\" : 64,\n            \"componentType\" : 5126,\n            \"count\" : 2,\n            \"type\" : \"VEC3\"\n        },\n        {\n            \"bufferView\" : 65,\n            \"componentType\" : 5126,\n            \"count\" : 140,\n            \"type\" : \"VEC4\"\n        },\n        {\n            \"bufferView\" : 66,\n            \"componentType\" : 5126,\n            \"count\" : 2,\n            \"type\" : \"VEC3\"\n        },\n        {\n            \"bufferView\" : 67,\n            \"componentType\" : 5126,\n            \"count\" : 2,\n            \"type\" : \"VEC3\"\n        },\n        {\n            \"bufferView\" : 68,\n            \"componentType\" : 5126,\n            \"count\" : 140,\n            \"type\" : \"VEC4\"\n        },\n        {\n            \"bufferView\" : 69,\n            \"componentType\" : 5126,\n            \"count\" : 2,\n            \"type\" : \"VEC3\"\n        },\n        {\n            \"bufferView\" : 70,\n            \"componentType\" : 5126,\n            \"count\" : 2,\n            \"type\" : \"VEC3\"\n        },\n        {\n            \"bufferView\" : 71,\n            \"componentType\" : 5126,\n            \"count\" : 140,\n            \"type\" : \"VEC4\"\n        },\n        {\n            \"bufferView\" : 72,\n            \"componentType\" : 5126,\n            \"count\" : 2,\n            \"type\" : \"VEC3\"\n        },\n        {\n            \"bufferView\" : 73,\n            \"componentType\" : 5126,\n            \"count\" : 2,\n            \"type\" : \"VEC3\"\n        },\n        {\n            \"bufferView\" : 74,\n            \"componentType\" : 5126,\n            \"count\" : 140,\n            \"type\" : \"VEC4\"\n        },\n        {\n            \"bufferView\" : 75,\n            \"componentType\" : 5126,\n            \"count\" : 2,\n            \"type\" : \"VEC3\"\n        },\n        {\n            \"bufferView\" : 76,\n            \"componentType\" : 5126,\n            \"count\" : 2,\n            \"type\" : \"VEC3\"\n        },\n        {\n            \"bufferView\" : 77,\n            \"componentType\" : 5126,\n            \"count\" : 140,\n            \"type\" : \"VEC4\"\n        },\n        {\n            \"bufferView\" : 78,\n            \"componentType\" : 5126,\n            \"count\" : 2,\n            \"type\" : \"VEC3\"\n        },\n        {\n            \"bufferView\" : 79,\n            \"componentType\" : 5126,\n            \"count\" : 2,\n            \"type\" : \"VEC3\"\n        },\n        {\n            \"bufferView\" : 80,\n            \"componentType\" : 5126,\n            \"count\" : 140,\n            \"type\" : \"VEC4\"\n        },\n        {\n            \"bufferView\" : 81,\n            \"componentType\" : 5126,\n            \"count\" : 2,\n            \"type\" : \"VEC3\"\n        },\n        {\n            \"bufferView\" : 82,\n            \"componentType\" : 5126,\n            \"count\" : 2,\n            \"type\" : \"VEC3\"\n        },\n        {\n            \"bufferView\" : 83,\n            \"componentType\" : 5126,\n            \"count\" : 140,\n            \"type\" : \"VEC4\"\n        },\n        {\n            \"bufferView\" : 84,\n            \"componentType\" : 5126,\n            \"count\" : 2,\n            \"type\" : \"VEC3\"\n        },\n        {\n            \"bufferView\" : 85,\n            \"componentType\" : 5126,\n            \"count\" : 2,\n            \"type\" : \"VEC3\"\n        },\n        {\n            \"bufferView\" : 86,\n            \"componentType\" : 5126,\n            \"count\" : 140,\n            \"type\" : \"VEC4\"\n        },\n        {\n            \"bufferView\" : 87,\n            \"componentType\" : 5126,\n            \"count\" : 2,\n            \"type\" : \"VEC3\"\n        },\n        {\n            \"bufferView\" : 88,\n            \"componentType\" : 5126,\n            \"count\" : 2,\n            \"type\" : \"VEC3\"\n        },\n        {\n            \"bufferView\" : 89,\n            \"componentType\" : 5126,\n            \"count\" : 2,\n            \"type\" : \"VEC4\"\n        },\n        {\n            \"bufferView\" : 90,\n            \"componentType\" : 5126,\n            \"count\" : 2,\n            \"type\" : \"VEC3\"\n        },\n        {\n            \"bufferView\" : 91,\n            \"componentType\" : 5126,\n            \"count\" : 2,\n            \"type\" : \"VEC3\"\n        },\n        {\n            \"bufferView\" : 92,\n            \"componentType\" : 5126,\n            \"count\" : 2,\n            \"type\" : \"VEC4\"\n        },\n        {\n            \"bufferView\" : 93,\n            \"componentType\" : 5126,\n            \"count\" : 2,\n            \"type\" : \"VEC3\"\n        },\n        {\n            \"bufferView\" : 94,\n            \"componentType\" : 5126,\n            \"count\" : 2,\n            \"type\" : \"VEC3\"\n        },\n        {\n            \"bufferView\" : 95,\n            \"componentType\" : 5126,\n            \"count\" : 140,\n            \"type\" : \"VEC4\"\n        },\n        {\n            \"bufferView\" : 96,\n            \"componentType\" : 5126,\n            \"count\" : 2,\n            \"type\" : \"VEC3\"\n        },\n        {\n            \"bufferView\" : 97,\n            \"componentType\" : 5126,\n            \"count\" : 2,\n            \"type\" : \"VEC3\"\n        },\n        {\n            \"bufferView\" : 98,\n            \"componentType\" : 5126,\n            \"count\" : 140,\n            \"type\" : \"VEC4\"\n        },\n        {\n            \"bufferView\" : 99,\n            \"componentType\" : 5126,\n            \"count\" : 2,\n            \"type\" : \"VEC3\"\n        },\n        {\n            \"bufferView\" : 100,\n            \"componentType\" : 5126,\n            \"count\" : 2,\n            \"type\" : \"VEC3\"\n        },\n        {\n            \"bufferView\" : 101,\n            \"componentType\" : 5126,\n            \"count\" : 140,\n            \"type\" : \"VEC4\"\n        },\n        {\n            \"bufferView\" : 102,\n            \"componentType\" : 5126,\n            \"count\" : 2,\n            \"type\" : \"VEC3\"\n        },\n        {\n            \"bufferView\" : 103,\n            \"componentType\" : 5126,\n            \"count\" : 2,\n            \"type\" : \"VEC3\"\n        },\n        {\n            \"bufferView\" : 104,\n            \"componentType\" : 5126,\n            \"count\" : 140,\n            \"type\" : \"VEC4\"\n        },\n        {\n            \"bufferView\" : 105,\n            \"componentType\" : 5126,\n            \"count\" : 2,\n            \"type\" : \"VEC3\"\n        },\n        {\n            \"bufferView\" : 106,\n            \"componentType\" : 5126,\n            \"count\" : 2,\n            \"type\" : \"VEC3\"\n        },\n        {\n            \"bufferView\" : 107,\n            \"componentType\" : 5126,\n            \"count\" : 140,\n            \"type\" : \"VEC4\"\n        },\n        {\n            \"bufferView\" : 108,\n            \"componentType\" : 5126,\n            \"count\" : 2,\n            \"type\" : \"VEC3\"\n        },\n        {\n            \"bufferView\" : 109,\n            \"componentType\" : 5126,\n            \"count\" : 2,\n            \"type\" : \"VEC3\"\n        },\n        {\n            \"bufferView\" : 110,\n            \"componentType\" : 5126,\n            \"count\" : 140,\n            \"type\" : \"VEC4\"\n        },\n        {\n            \"bufferView\" : 111,\n            \"componentType\" : 5126,\n            \"count\" : 2,\n            \"type\" : \"VEC3\"\n        },\n        {\n            \"bufferView\" : 112,\n            \"componentType\" : 5126,\n            \"count\" : 2,\n            \"type\" : \"VEC3\"\n        },\n        {\n            \"bufferView\" : 113,\n            \"componentType\" : 5126,\n            \"count\" : 2,\n            \"type\" : \"VEC4\"\n        },\n        {\n            \"bufferView\" : 114,\n            \"componentType\" : 5126,\n            \"count\" : 2,\n            \"type\" : \"VEC3\"\n        },\n        {\n            \"bufferView\" : 115,\n            \"componentType\" : 5126,\n            \"count\" : 2,\n            \"type\" : \"VEC3\"\n        },\n        {\n            \"bufferView\" : 116,\n            \"componentType\" : 5126,\n            \"count\" : 2,\n            \"type\" : \"VEC4\"\n        },\n        {\n            \"bufferView\" : 117,\n            \"componentType\" : 5126,\n            \"count\" : 2,\n            \"type\" : \"VEC3\"\n        },\n        {\n            \"bufferView\" : 118,\n            \"componentType\" : 5126,\n            \"count\" : 140,\n            \"type\" : \"VEC3\"\n        },\n        {\n            \"bufferView\" : 119,\n            \"componentType\" : 5126,\n            \"count\" : 140,\n            \"type\" : \"VEC4\"\n        },\n        {\n            \"bufferView\" : 120,\n            \"componentType\" : 5126,\n            \"count\" : 2,\n            \"type\" : \"VEC3\"\n        },\n        {\n            \"bufferView\" : 121,\n            \"componentType\" : 5126,\n            \"count\" : 2,\n            \"type\" : \"VEC3\"\n        },\n        {\n            \"bufferView\" : 122,\n            \"componentType\" : 5126,\n            \"count\" : 2,\n            \"type\" : \"VEC4\"\n        },\n        {\n            \"bufferView\" : 123,\n            \"componentType\" : 5126,\n            \"count\" : 2,\n            \"type\" : \"VEC3\"\n        },\n        {\n            \"bufferView\" : 124,\n            \"componentType\" : 5126,\n            \"count\" : 2,\n            \"type\" : \"VEC3\"\n        },\n        {\n            \"bufferView\" : 125,\n            \"componentType\" : 5126,\n            \"count\" : 2,\n            \"type\" : \"VEC4\"\n        },\n        {\n            \"bufferView\" : 126,\n            \"componentType\" : 5126,\n            \"count\" : 2,\n            \"type\" : \"VEC3\"\n        },\n        {\n            \"bufferView\" : 127,\n            \"componentType\" : 5126,\n            \"count\" : 140,\n            \"type\" : \"VEC3\"\n        },\n        {\n            \"bufferView\" : 128,\n            \"componentType\" : 5126,\n            \"count\" : 140,\n            \"type\" : \"VEC4\"\n        },\n        {\n            \"bufferView\" : 129,\n            \"componentType\" : 5126,\n            \"count\" : 2,\n            \"type\" : \"VEC3\"\n        },\n        {\n            \"bufferView\" : 130,\n            \"componentType\" : 5126,\n            \"count\" : 2,\n            \"type\" : \"VEC3\"\n        },\n        {\n            \"bufferView\" : 131,\n            \"componentType\" : 5126,\n            \"count\" : 140,\n            \"type\" : \"VEC4\"\n        },\n        {\n            \"bufferView\" : 132,\n            \"componentType\" : 5126,\n            \"count\" : 2,\n            \"type\" : \"VEC3\"\n        },\n        {\n            \"bufferView\" : 133,\n            \"componentType\" : 5126,\n            \"count\" : 2,\n            \"type\" : \"VEC3\"\n        },\n        {\n            \"bufferView\" : 134,\n            \"componentType\" : 5126,\n            \"count\" : 140,\n            \"type\" : \"VEC4\"\n        },\n        {\n            \"bufferView\" : 135,\n            \"componentType\" : 5126,\n            \"count\" : 2,\n            \"type\" : \"VEC3\"\n        },\n        {\n            \"bufferView\" : 136,\n            \"componentType\" : 5126,\n            \"count\" : 140,\n            \"type\" : \"VEC3\"\n        },\n        {\n            \"bufferView\" : 137,\n            \"componentType\" : 5126,\n            \"count\" : 140,\n            \"type\" : \"VEC4\"\n        },\n        {\n            \"bufferView\" : 138,\n            \"componentType\" : 5126,\n            \"count\" : 2,\n            \"type\" : \"VEC3\"\n        },\n        {\n            \"bufferView\" : 139,\n            \"componentType\" : 5126,\n            \"count\" : 140,\n            \"type\" : \"VEC3\"\n        },\n        {\n            \"bufferView\" : 140,\n            \"componentType\" : 5126,\n            \"count\" : 140,\n            \"type\" : \"VEC4\"\n        },\n        {\n            \"bufferView\" : 141,\n            \"componentType\" : 5126,\n            \"count\" : 2,\n            \"type\" : \"VEC3\"\n        }\n    ],\n    \"bufferViews\" : [\n        {\n            \"buffer\" : 0,\n            \"byteLength\" : 256608,\n            \"byteOffset\" : 0\n        },\n        {\n            \"buffer\" : 0,\n            \"byteLength\" : 256608,\n            \"byteOffset\" : 256608\n        },\n        {\n            \"buffer\" : 0,\n            \"byteLength\" : 171072,\n            \"byteOffset\" : 513216\n        },\n        {\n            \"buffer\" : 0,\n            \"byteLength\" : 171072,\n            \"byteOffset\" : 684288\n        },\n        {\n            \"buffer\" : 0,\n            \"byteLength\" : 85536,\n            \"byteOffset\" : 855360\n        },\n        {\n            \"buffer\" : 0,\n            \"byteLength\" : 342144,\n            \"byteOffset\" : 940896\n        },\n        {\n            \"buffer\" : 0,\n            \"byteLength\" : 130608,\n            \"byteOffset\" : 1283040\n        },\n        {\n            \"buffer\" : 0,\n            \"byteLength\" : 2432,\n            \"byteOffset\" : 1413648\n        },\n        {\n            \"buffer\" : 0,\n            \"byteLength\" : 175296,\n            \"byteOffset\" : 1416080\n        },\n        {\n            \"buffer\" : 0,\n            \"byteLength\" : 175296,\n            \"byteOffset\" : 1591376\n        },\n        {\n            \"buffer\" : 0,\n            \"byteLength\" : 116864,\n            \"byteOffset\" : 1766672\n        },\n        {\n            \"buffer\" : 0,\n            \"byteLength\" : 116864,\n            \"byteOffset\" : 1883536\n        },\n        {\n            \"buffer\" : 0,\n            \"byteLength\" : 58432,\n            \"byteOffset\" : 2000400\n        },\n        {\n            \"buffer\" : 0,\n            \"byteLength\" : 233728,\n            \"byteOffset\" : 2058832\n        },\n        {\n            \"buffer\" : 0,\n            \"byteLength\" : 78894,\n            \"byteOffset\" : 2292560\n        },\n        {\n            \"buffer\" : 0,\n            \"byteLength\" : 4224,\n            \"byteOffset\" : 2371456\n        },\n        {\n            \"buffer\" : 0,\n            \"byteLength\" : 4224,\n            \"byteOffset\" : 2375680\n        },\n        {\n            \"buffer\" : 0,\n            \"byteLength\" : 2816,\n            \"byteOffset\" : 2379904\n        },\n        {\n            \"buffer\" : 0,\n            \"byteLength\" : 2816,\n            \"byteOffset\" : 2382720\n        },\n        {\n            \"buffer\" : 0,\n            \"byteLength\" : 1408,\n            \"byteOffset\" : 2385536\n        },\n        {\n            \"buffer\" : 0,\n            \"byteLength\" : 5632,\n            \"byteOffset\" : 2386944\n        },\n        {\n            \"buffer\" : 0,\n            \"byteLength\" : 3456,\n            \"byteOffset\" : 2392576\n        },\n        {\n            \"buffer\" : 0,\n            \"byteLength\" : 2136,\n            \"byteOffset\" : 2396032\n        },\n        {\n            \"buffer\" : 0,\n            \"byteLength\" : 2136,\n            \"byteOffset\" : 2398168\n        },\n        {\n            \"buffer\" : 0,\n            \"byteLength\" : 1424,\n            \"byteOffset\" : 2400304\n        },\n        {\n            \"buffer\" : 0,\n            \"byteLength\" : 712,\n            \"byteOffset\" : 2401728\n        },\n        {\n            \"buffer\" : 0,\n            \"byteLength\" : 2848,\n            \"byteOffset\" : 2402440\n        },\n        {\n            \"buffer\" : 0,\n            \"byteLength\" : 1320,\n            \"byteOffset\" : 2405288\n        },\n        {\n            \"buffer\" : 0,\n            \"byteLength\" : 158028,\n            \"byteOffset\" : 2406608\n        },\n        {\n            \"buffer\" : 0,\n            \"byteLength\" : 158028,\n            \"byteOffset\" : 2564636\n        },\n        {\n            \"buffer\" : 0,\n            \"byteLength\" : 105352,\n            \"byteOffset\" : 2722664\n        },\n        {\n            \"buffer\" : 0,\n            \"byteLength\" : 105352,\n            \"byteOffset\" : 2828016\n        },\n        {\n            \"buffer\" : 0,\n            \"byteLength\" : 52676,\n            \"byteOffset\" : 2933368\n        },\n        {\n            \"buffer\" : 0,\n            \"byteLength\" : 210704,\n            \"byteOffset\" : 2986044\n        },\n        {\n            \"buffer\" : 0,\n            \"byteLength\" : 86520,\n            \"byteOffset\" : 3196748\n        },\n        {\n            \"buffer\" : 0,\n            \"byteLength\" : 560,\n            \"byteOffset\" : 3283268\n        },\n        {\n            \"buffer\" : 0,\n            \"byteLength\" : 1680,\n            \"byteOffset\" : 3283828\n        },\n        {\n            \"buffer\" : 0,\n            \"byteLength\" : 2240,\n            \"byteOffset\" : 3285508\n        },\n        {\n            \"buffer\" : 0,\n            \"byteLength\" : 8,\n            \"byteOffset\" : 3287748\n        },\n        {\n            \"buffer\" : 0,\n            \"byteLength\" : 24,\n            \"byteOffset\" : 3287756\n        },\n        {\n            \"buffer\" : 0,\n            \"byteLength\" : 24,\n            \"byteOffset\" : 3287780\n        },\n        {\n            \"buffer\" : 0,\n            \"byteLength\" : 2240,\n            \"byteOffset\" : 3287804\n        },\n        {\n            \"buffer\" : 0,\n            \"byteLength\" : 24,\n            \"byteOffset\" : 3290044\n        },\n        {\n            \"buffer\" : 0,\n            \"byteLength\" : 24,\n            \"byteOffset\" : 3290068\n        },\n        {\n            \"buffer\" : 0,\n            \"byteLength\" : 2240,\n            \"byteOffset\" : 3290092\n        },\n        {\n            \"buffer\" : 0,\n            \"byteLength\" : 24,\n            \"byteOffset\" : 3292332\n        },\n        {\n            \"buffer\" : 0,\n            \"byteLength\" : 24,\n            \"byteOffset\" : 3292356\n        },\n        {\n            \"buffer\" : 0,\n            \"byteLength\" : 2240,\n            \"byteOffset\" : 3292380\n        },\n        {\n            \"buffer\" : 0,\n            \"byteLength\" : 24,\n            \"byteOffset\" : 3294620\n        },\n        {\n            \"buffer\" : 0,\n            \"byteLength\" : 24,\n            \"byteOffset\" : 3294644\n        },\n        {\n            \"buffer\" : 0,\n            \"byteLength\" : 2240,\n            \"byteOffset\" : 3294668\n        },\n        {\n            \"buffer\" : 0,\n            \"byteLength\" : 24,\n            \"byteOffset\" : 3296908\n        },\n        {\n            \"buffer\" : 0,\n            \"byteLength\" : 24,\n            \"byteOffset\" : 3296932\n        },\n        {\n            \"buffer\" : 0,\n            \"byteLength\" : 2240,\n            \"byteOffset\" : 3296956\n        },\n        {\n            \"buffer\" : 0,\n            \"byteLength\" : 24,\n            \"byteOffset\" : 3299196\n        },\n        {\n            \"buffer\" : 0,\n            \"byteLength\" : 24,\n            \"byteOffset\" : 3299220\n        },\n        {\n            \"buffer\" : 0,\n            \"byteLength\" : 2240,\n            \"byteOffset\" : 3299244\n        },\n        {\n            \"buffer\" : 0,\n            \"byteLength\" : 24,\n            \"byteOffset\" : 3301484\n        },\n        {\n            \"buffer\" : 0,\n            \"byteLength\" : 24,\n            \"byteOffset\" : 3301508\n        },\n        {\n            \"buffer\" : 0,\n            \"byteLength\" : 2240,\n            \"byteOffset\" : 3301532\n        },\n        {\n            \"buffer\" : 0,\n            \"byteLength\" : 24,\n            \"byteOffset\" : 3303772\n        },\n        {\n            \"buffer\" : 0,\n            \"byteLength\" : 24,\n            \"byteOffset\" : 3303796\n        },\n        {\n            \"buffer\" : 0,\n            \"byteLength\" : 2240,\n            \"byteOffset\" : 3303820\n        },\n        {\n            \"buffer\" : 0,\n            \"byteLength\" : 24,\n            \"byteOffset\" : 3306060\n        },\n        {\n            \"buffer\" : 0,\n            \"byteLength\" : 24,\n            \"byteOffset\" : 3306084\n        },\n        {\n            \"buffer\" : 0,\n            \"byteLength\" : 2240,\n            \"byteOffset\" : 3306108\n        },\n        {\n            \"buffer\" : 0,\n            \"byteLength\" : 24,\n            \"byteOffset\" : 3308348\n        },\n        {\n            \"buffer\" : 0,\n            \"byteLength\" : 24,\n            \"byteOffset\" : 3308372\n        },\n        {\n            \"buffer\" : 0,\n            \"byteLength\" : 2240,\n            \"byteOffset\" : 3308396\n        },\n        {\n            \"buffer\" : 0,\n            \"byteLength\" : 24,\n            \"byteOffset\" : 3310636\n        },\n        {\n            \"buffer\" : 0,\n            \"byteLength\" : 24,\n            \"byteOffset\" : 3310660\n        },\n        {\n            \"buffer\" : 0,\n            \"byteLength\" : 2240,\n            \"byteOffset\" : 3310684\n        },\n        {\n            \"buffer\" : 0,\n            \"byteLength\" : 24,\n            \"byteOffset\" : 3312924\n        },\n        {\n            \"buffer\" : 0,\n            \"byteLength\" : 24,\n            \"byteOffset\" : 3312948\n        },\n        {\n            \"buffer\" : 0,\n            \"byteLength\" : 2240,\n            \"byteOffset\" : 3312972\n        },\n        {\n            \"buffer\" : 0,\n            \"byteLength\" : 24,\n            \"byteOffset\" : 3315212\n        },\n        {\n            \"buffer\" : 0,\n            \"byteLength\" : 24,\n            \"byteOffset\" : 3315236\n        },\n        {\n            \"buffer\" : 0,\n            \"byteLength\" : 2240,\n            \"byteOffset\" : 3315260\n        },\n        {\n            \"buffer\" : 0,\n            \"byteLength\" : 24,\n            \"byteOffset\" : 3317500\n        },\n        {\n            \"buffer\" : 0,\n            \"byteLength\" : 24,\n            \"byteOffset\" : 3317524\n        },\n        {\n            \"buffer\" : 0,\n            \"byteLength\" : 2240,\n            \"byteOffset\" : 3317548\n        },\n        {\n            \"buffer\" : 0,\n            \"byteLength\" : 24,\n            \"byteOffset\" : 3319788\n        },\n        {\n            \"buffer\" : 0,\n            \"byteLength\" : 24,\n            \"byteOffset\" : 3319812\n        },\n        {\n            \"buffer\" : 0,\n            \"byteLength\" : 2240,\n            \"byteOffset\" : 3319836\n        },\n        {\n            \"buffer\" : 0,\n            \"byteLength\" : 24,\n            \"byteOffset\" : 3322076\n        },\n        {\n            \"buffer\" : 0,\n            \"byteLength\" : 24,\n            \"byteOffset\" : 3322100\n        },\n        {\n            \"buffer\" : 0,\n            \"byteLength\" : 2240,\n            \"byteOffset\" : 3322124\n        },\n        {\n            \"buffer\" : 0,\n            \"byteLength\" : 24,\n            \"byteOffset\" : 3324364\n        },\n        {\n            \"buffer\" : 0,\n            \"byteLength\" : 24,\n            \"byteOffset\" : 3324388\n        },\n        {\n            \"buffer\" : 0,\n            \"byteLength\" : 32,\n            \"byteOffset\" : 3324412\n        },\n        {\n            \"buffer\" : 0,\n            \"byteLength\" : 24,\n            \"byteOffset\" : 3324444\n        },\n        {\n            \"buffer\" : 0,\n            \"byteLength\" : 24,\n            \"byteOffset\" : 3324468\n        },\n        {\n            \"buffer\" : 0,\n            \"byteLength\" : 32,\n            \"byteOffset\" : 3324492\n        },\n        {\n            \"buffer\" : 0,\n            \"byteLength\" : 24,\n            \"byteOffset\" : 3324524\n        },\n        {\n            \"buffer\" : 0,\n            \"byteLength\" : 24,\n            \"byteOffset\" : 3324548\n        },\n        {\n            \"buffer\" : 0,\n            \"byteLength\" : 2240,\n            \"byteOffset\" : 3324572\n        },\n        {\n            \"buffer\" : 0,\n            \"byteLength\" : 24,\n            \"byteOffset\" : 3326812\n        },\n        {\n            \"buffer\" : 0,\n            \"byteLength\" : 24,\n            \"byteOffset\" : 3326836\n        },\n        {\n            \"buffer\" : 0,\n            \"byteLength\" : 2240,\n            \"byteOffset\" : 3326860\n        },\n        {\n            \"buffer\" : 0,\n            \"byteLength\" : 24,\n            \"byteOffset\" : 3329100\n        },\n        {\n            \"buffer\" : 0,\n            \"byteLength\" : 24,\n            \"byteOffset\" : 3329124\n        },\n        {\n            \"buffer\" : 0,\n            \"byteLength\" : 2240,\n            \"byteOffset\" : 3329148\n        },\n        {\n            \"buffer\" : 0,\n            \"byteLength\" : 24,\n            \"byteOffset\" : 3331388\n        },\n        {\n            \"buffer\" : 0,\n            \"byteLength\" : 24,\n            \"byteOffset\" : 3331412\n        },\n        {\n            \"buffer\" : 0,\n            \"byteLength\" : 2240,\n            \"byteOffset\" : 3331436\n        },\n        {\n            \"buffer\" : 0,\n            \"byteLength\" : 24,\n            \"byteOffset\" : 3333676\n        },\n        {\n            \"buffer\" : 0,\n            \"byteLength\" : 24,\n            \"byteOffset\" : 3333700\n        },\n        {\n            \"buffer\" : 0,\n            \"byteLength\" : 2240,\n            \"byteOffset\" : 3333724\n        },\n        {\n            \"buffer\" : 0,\n            \"byteLength\" : 24,\n            \"byteOffset\" : 3335964\n        },\n        {\n            \"buffer\" : 0,\n            \"byteLength\" : 24,\n            \"byteOffset\" : 3335988\n        },\n        {\n            \"buffer\" : 0,\n            \"byteLength\" : 2240,\n            \"byteOffset\" : 3336012\n        },\n        {\n            \"buffer\" : 0,\n            \"byteLength\" : 24,\n            \"byteOffset\" : 3338252\n        },\n        {\n            \"buffer\" : 0,\n            \"byteLength\" : 24,\n            \"byteOffset\" : 3338276\n        },\n        {\n            \"buffer\" : 0,\n            \"byteLength\" : 32,\n            \"byteOffset\" : 3338300\n        },\n        {\n            \"buffer\" : 0,\n            \"byteLength\" : 24,\n            \"byteOffset\" : 3338332\n        },\n        {\n            \"buffer\" : 0,\n            \"byteLength\" : 24,\n            \"byteOffset\" : 3338356\n        },\n        {\n            \"buffer\" : 0,\n            \"byteLength\" : 32,\n            \"byteOffset\" : 3338380\n        },\n        {\n            \"buffer\" : 0,\n            \"byteLength\" : 24,\n            \"byteOffset\" : 3338412\n        },\n        {\n            \"buffer\" : 0,\n            \"byteLength\" : 1680,\n            \"byteOffset\" : 3338436\n        },\n        {\n            \"buffer\" : 0,\n            \"byteLength\" : 2240,\n            \"byteOffset\" : 3340116\n        },\n        {\n            \"buffer\" : 0,\n            \"byteLength\" : 24,\n            \"byteOffset\" : 3342356\n        },\n        {\n            \"buffer\" : 0,\n            \"byteLength\" : 24,\n            \"byteOffset\" : 3342380\n        },\n        {\n            \"buffer\" : 0,\n            \"byteLength\" : 32,\n            \"byteOffset\" : 3342404\n        },\n        {\n            \"buffer\" : 0,\n            \"byteLength\" : 24,\n            \"byteOffset\" : 3342436\n        },\n        {\n            \"buffer\" : 0,\n            \"byteLength\" : 24,\n            \"byteOffset\" : 3342460\n        },\n        {\n            \"buffer\" : 0,\n            \"byteLength\" : 32,\n            \"byteOffset\" : 3342484\n        },\n        {\n            \"buffer\" : 0,\n            \"byteLength\" : 24,\n            \"byteOffset\" : 3342516\n        },\n        {\n            \"buffer\" : 0,\n            \"byteLength\" : 1680,\n            \"byteOffset\" : 3342540\n        },\n        {\n            \"buffer\" : 0,\n            \"byteLength\" : 2240,\n            \"byteOffset\" : 3344220\n        },\n        {\n            \"buffer\" : 0,\n            \"byteLength\" : 24,\n            \"byteOffset\" : 3346460\n        },\n        {\n            \"buffer\" : 0,\n            \"byteLength\" : 24,\n            \"byteOffset\" : 3346484\n        },\n        {\n            \"buffer\" : 0,\n            \"byteLength\" : 2240,\n            \"byteOffset\" : 3346508\n        },\n        {\n            \"buffer\" : 0,\n            \"byteLength\" : 24,\n            \"byteOffset\" : 3348748\n        },\n        {\n            \"buffer\" : 0,\n            \"byteLength\" : 24,\n            \"byteOffset\" : 3348772\n        },\n        {\n            \"buffer\" : 0,\n            \"byteLength\" : 2240,\n            \"byteOffset\" : 3348796\n        },\n        {\n            \"buffer\" : 0,\n            \"byteLength\" : 24,\n            \"byteOffset\" : 3351036\n        },\n        {\n            \"buffer\" : 0,\n            \"byteLength\" : 1680,\n            \"byteOffset\" : 3351060\n        },\n        {\n            \"buffer\" : 0,\n            \"byteLength\" : 2240,\n            \"byteOffset\" : 3352740\n        },\n        {\n            \"buffer\" : 0,\n            \"byteLength\" : 24,\n            \"byteOffset\" : 3354980\n        },\n        {\n            \"buffer\" : 0,\n            \"byteLength\" : 1680,\n            \"byteOffset\" : 3355004\n        },\n        {\n            \"buffer\" : 0,\n            \"byteLength\" : 2240,\n            \"byteOffset\" : 3356684\n        },\n        {\n            \"buffer\" : 0,\n            \"byteLength\" : 24,\n            \"byteOffset\" : 3358924\n        }\n    ],\n    \"samplers\" : [\n        {\n            \"magFilter\" : 9729,\n            \"minFilter\" : 9987\n        }\n    ],\n    \"buffers\" : [\n        {\n            \"byteLength\" : 3358948,\n            \"uri\" : \"robot.bin\"\n        }\n    ]\n}\n"
  },
  {
    "path": "examples/resources/models/gltf/UinoHelmet/README.md",
    "content": "# UINO Helmet\n\n## License Information\n\nDonated by UINO for glTF testing.\n"
  },
  {
    "path": "examples/resources/models/gltf/UinoHelmet/glTF/UinoHelmet.gltf",
    "content": "{\n\t\"asset\":\n\t{\n\t\t\"version\": \"2.0\",\n\t\t\"generator\": \"Unreal Engine 4.27.0 glTF Exporter 1.0.6\"\n\t},\n\t\"scene\": 0,\n\t\"accessors\": [\n\t\t{\n\t\t\t\"bufferView\": 0,\n\t\t\t\"count\": 16890,\n\t\t\t\"type\": \"SCALAR\",\n\t\t\t\"componentType\": 5123\n\t\t},\n\t\t{\n\t\t\t\"bufferView\": 1,\n\t\t\t\"count\": 4087,\n\t\t\t\"type\": \"VEC3\",\n\t\t\t\"componentType\": 5126,\n\t\t\t\"min\": [ -0.315339983,\n\t\t\t\t0.840499163,\n\t\t\t\t-0.253357053\n\t\t\t],\n\t\t\t\"max\": [ 0.293061942,\n\t\t\t\t1.51543701,\n\t\t\t\t0.295733541\n\t\t\t]\n\t\t},\n\t\t{\n\t\t\t\"bufferView\": 2,\n\t\t\t\"count\": 4087,\n\t\t\t\"type\": \"VEC3\",\n\t\t\t\"componentType\": 5126\n\t\t},\n\t\t{\n\t\t\t\"bufferView\": 3,\n\t\t\t\"count\": 4087,\n\t\t\t\"type\": \"VEC4\",\n\t\t\t\"componentType\": 5126\n\t\t},\n\t\t{\n\t\t\t\"bufferView\": 4,\n\t\t\t\"count\": 4087,\n\t\t\t\"type\": \"VEC2\",\n\t\t\t\"componentType\": 5126\n\t\t}\n\t],\n\t\"buffers\": [\n\t\t{\n\t\t\t\"uri\": \"a01.bin\",\n\t\t\t\"byteLength\": 229956\n\t\t}\n\t],\n\t\"bufferViews\": [\n\t\t{\n\t\t\t\"buffer\": 0,\n\t\t\t\"byteLength\": 33780,\n\t\t\t\"target\": 34963\n\t\t},\n\t\t{\n\t\t\t\"buffer\": 0,\n\t\t\t\"byteLength\": 49044,\n\t\t\t\"byteOffset\": 33780,\n\t\t\t\"target\": 34962\n\t\t},\n\t\t{\n\t\t\t\"buffer\": 0,\n\t\t\t\"byteLength\": 49044,\n\t\t\t\"byteOffset\": 82824,\n\t\t\t\"target\": 34962\n\t\t},\n\t\t{\n\t\t\t\"buffer\": 0,\n\t\t\t\"byteLength\": 65392,\n\t\t\t\"byteOffset\": 131868,\n\t\t\t\"target\": 34962\n\t\t},\n\t\t{\n\t\t\t\"buffer\": 0,\n\t\t\t\"byteLength\": 32696,\n\t\t\t\"byteOffset\": 197260,\n\t\t\t\"target\": 34962\n\t\t}\n\t],\n\t\"images\": [\n\t\t{\n\t\t\t\"uri\": \"lambert9_MetallicRoughness.jpg\"\n\t\t},\n\t\t{\n\t\t\t\"uri\": \"lambert9_Occlusion.jpg\"\n\t\t},\n\t\t{\n\t\t\t\"uri\": \"lambert9_Base_Color.jpg\"\n\t\t},\n\t\t{\n\t\t\t\"uri\": \"lambert9_Normal_OpenGL.jpg\"\n\t\t}\n\t],\n\t\"materials\": [\n\t\t{\n\t\t\t\"name\": \"lambert9\",\n\t\t\t\"pbrMetallicRoughness\":\n\t\t\t{\n\t\t\t\t\"baseColorTexture\":\n\t\t\t\t{\n\t\t\t\t\t\"index\": 0\n\t\t\t\t},\n\t\t\t\t\"metallicRoughnessTexture\":\n\t\t\t\t{\n\t\t\t\t\t\"index\": 1\n\t\t\t\t}\n\t\t\t},\n\t\t\t\"normalTexture\":\n\t\t\t{\n\t\t\t\t\"index\": 2\n\t\t\t},\n\t\t\t\"occlusionTexture\":\n\t\t\t{\n\t\t\t\t\"index\": 3\n\t\t\t}\n\t\t}\n\t],\n\t\"meshes\": [\n\t\t{\n\t\t\t\"name\": \"a01\",\n\t\t\t\"primitives\": [\n\t\t\t\t{\n\t\t\t\t\t\"attributes\":\n\t\t\t\t\t{\n\t\t\t\t\t\t\"POSITION\": 1,\n\t\t\t\t\t\t\"NORMAL\": 2,\n\t\t\t\t\t\t\"TANGENT\": 3,\n\t\t\t\t\t\t\"TEXCOORD_0\": 4\n\t\t\t\t\t},\n\t\t\t\t\t\"indices\": 0,\n\t\t\t\t\t\"material\": 0\n\t\t\t\t}\n\t\t\t]\n\t\t}\n\t],\n\t\"nodes\": [\n\t\t{\n\t\t\t\"mesh\": 0\n\t\t}\n\t],\n\t\"samplers\": [\n\t\t{\n\t\t\t\"name\": \"lambert9_MetallicRoughness\",\n\t\t\t\"minFilter\": 9987,\n\t\t\t\"magFilter\": 9729\n\t\t},\n\t\t{\n\t\t\t\"name\": \"lambert9_Occlusion\",\n\t\t\t\"minFilter\": 9987,\n\t\t\t\"magFilter\": 9729\n\t\t},\n\t\t{\n\t\t\t\"name\": \"lambert9_Base_Color\",\n\t\t\t\"minFilter\": 9987,\n\t\t\t\"magFilter\": 9729\n\t\t},\n\t\t{\n\t\t\t\"name\": \"lambert9_Normal_OpenGL\",\n\t\t\t\"minFilter\": 9987,\n\t\t\t\"magFilter\": 9729\n\t\t}\n\t],\n\t\"scenes\": [\n\t\t{\n\t\t\t\"nodes\": [ 0 ]\n\t\t}\n\t],\n\t\"textures\": [\n\t\t{\n\t\t\t\"name\": \"lambert9_Base_Color\",\n\t\t\t\"sampler\": 2,\n\t\t\t\"source\": 2\n\t\t},\n\t\t{\n\t\t\t\"name\": \"lambert9_MetallicRoughness\",\n\t\t\t\"sampler\": 0,\n\t\t\t\"source\": 0\n\t\t},\n\t\t{\n\t\t\t\"name\": \"lambert9_Normal_OpenGL\",\n\t\t\t\"sampler\": 3,\n\t\t\t\"source\": 3\n\t\t},\n\t\t{\n\t\t\t\"name\": \"lambert9_Occlusion\",\n\t\t\t\"sampler\": 1,\n\t\t\t\"source\": 1\n\t\t}\n\t]\n}"
  },
  {
    "path": "examples/resources/models/gltf/UinoMan/README.md",
    "content": "# UINO Man\n\n## License Information\n\nDonated by UINO for glTF testing.\n"
  },
  {
    "path": "examples/resources/models/gltf/UinoMan/glTF/UinoMan.gltf",
    "content": "{\n  \"materials\": [\n    {\n      \"name\": \"mia_material1\",\n      \"pbrMetallicRoughness\": {\n        \"baseColorTexture\": {\n          \"index\": 0,\n          \"texCoord\": 0\n        },\n        \"baseColorFactor\": [\n          0.943137348,\n          0.943137348,\n          0.943137348,\n          1.0\n        ],\n        \"metallicFactor\": 0.199999988,\n        \"roughnessFactor\": 0.0\n      },\n      \"alphaMode\": \"OPAQUE\"\n    },\n    {\n      \"name\": \"07_-_Default\",\n      \"pbrMetallicRoughness\": {\n        \"baseColorFactor\": [\n          1.0,\n          0.164705887,\n          0.0,\n          1.0\n        ],\n        \"metallicFactor\": 0.099999994,\n        \"roughnessFactor\": 0.0\n      },\n      \"alphaMode\": \"OPAQUE\"\n    }\n  ],\n  \"images\": [\n    {\n      \"uri\": \"C442714FA64B64623E0A9800E728ACB5.jpg\"\n    }\n  ],\n  \"textures\": [\n    {\n      \"name\": \"bai01.jpg\",\n      \"sampler\": 0,\n      \"source\": 0\n    }\n  ],\n  \"meshes\": [\n    {\n      \"name\": \"Rectangle001\",\n      \"primitives\": [\n        {\n          \"material\": 0,\n          \"mode\": 4,\n          \"indices\": 256,\n          \"attributes\": {\n            \"JOINTS_0\": 259,\n            \"NORMAL\": 258,\n            \"POSITION\": 257,\n            \"WEIGHTS_0\": 260\n          }\n        },\n        {\n          \"material\": 1,\n          \"mode\": 4,\n          \"indices\": 261,\n          \"attributes\": {\n            \"JOINTS_0\": 264,\n            \"NORMAL\": 263,\n            \"POSITION\": 262,\n            \"WEIGHTS_0\": 265\n          }\n        }\n      ]\n    }\n  ],\n  \"buffers\": [\n    {\n      \"byteLength\": 433512,\n      \"uri\": \"420D26C5E2ECE7CBA6AA2E6A000BEF4D.bin\"\n    }\n  ],\n  \"bufferViews\": [\n    {\n      \"buffer\": 0,\n      \"byteLength\": 136,\n      \"byteOffset\": 0\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 408,\n      \"byteOffset\": 136\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 544,\n      \"byteOffset\": 544\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 408,\n      \"byteOffset\": 1088\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 544,\n      \"byteOffset\": 1496\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 408,\n      \"byteOffset\": 2040\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 544,\n      \"byteOffset\": 2448\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 408,\n      \"byteOffset\": 2992\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 544,\n      \"byteOffset\": 3400\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 408,\n      \"byteOffset\": 3944\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 544,\n      \"byteOffset\": 4352\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 408,\n      \"byteOffset\": 4896\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 544,\n      \"byteOffset\": 5304\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 408,\n      \"byteOffset\": 5848\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 544,\n      \"byteOffset\": 6256\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 544,\n      \"byteOffset\": 6800\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 544,\n      \"byteOffset\": 7344\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 544,\n      \"byteOffset\": 7888\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 544,\n      \"byteOffset\": 8432\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 544,\n      \"byteOffset\": 8976\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 544,\n      \"byteOffset\": 9520\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 544,\n      \"byteOffset\": 10064\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 544,\n      \"byteOffset\": 10608\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 544,\n      \"byteOffset\": 11152\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 408,\n      \"byteOffset\": 11696\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 544,\n      \"byteOffset\": 12104\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 544,\n      \"byteOffset\": 12648\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 544,\n      \"byteOffset\": 13192\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 408,\n      \"byteOffset\": 13736\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 544,\n      \"byteOffset\": 14144\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 544,\n      \"byteOffset\": 14688\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 544,\n      \"byteOffset\": 15232\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 88,\n      \"byteOffset\": 15776\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 264,\n      \"byteOffset\": 15864\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 352,\n      \"byteOffset\": 16128\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 264,\n      \"byteOffset\": 16480\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 352,\n      \"byteOffset\": 16744\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 264,\n      \"byteOffset\": 17096\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 352,\n      \"byteOffset\": 17360\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 264,\n      \"byteOffset\": 17712\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 352,\n      \"byteOffset\": 17976\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 264,\n      \"byteOffset\": 18328\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 352,\n      \"byteOffset\": 18592\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 264,\n      \"byteOffset\": 18944\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 352,\n      \"byteOffset\": 19208\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 264,\n      \"byteOffset\": 19560\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 352,\n      \"byteOffset\": 19824\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 352,\n      \"byteOffset\": 20176\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 352,\n      \"byteOffset\": 20528\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 352,\n      \"byteOffset\": 20880\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 352,\n      \"byteOffset\": 21232\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 352,\n      \"byteOffset\": 21584\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 352,\n      \"byteOffset\": 21936\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 352,\n      \"byteOffset\": 22288\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 352,\n      \"byteOffset\": 22640\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 352,\n      \"byteOffset\": 22992\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 264,\n      \"byteOffset\": 23344\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 352,\n      \"byteOffset\": 23608\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 352,\n      \"byteOffset\": 23960\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 352,\n      \"byteOffset\": 24312\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 264,\n      \"byteOffset\": 24664\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 352,\n      \"byteOffset\": 24928\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 352,\n      \"byteOffset\": 25280\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 352,\n      \"byteOffset\": 25632\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 56,\n      \"byteOffset\": 25984\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 168,\n      \"byteOffset\": 26040\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 224,\n      \"byteOffset\": 26208\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 168,\n      \"byteOffset\": 26432\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 224,\n      \"byteOffset\": 26600\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 168,\n      \"byteOffset\": 26824\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 224,\n      \"byteOffset\": 26992\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 168,\n      \"byteOffset\": 27216\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 224,\n      \"byteOffset\": 27384\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 168,\n      \"byteOffset\": 27608\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 224,\n      \"byteOffset\": 27776\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 168,\n      \"byteOffset\": 28000\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 224,\n      \"byteOffset\": 28168\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 168,\n      \"byteOffset\": 28392\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 224,\n      \"byteOffset\": 28560\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 224,\n      \"byteOffset\": 28784\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 224,\n      \"byteOffset\": 29008\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 224,\n      \"byteOffset\": 29232\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 224,\n      \"byteOffset\": 29456\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 224,\n      \"byteOffset\": 29680\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 224,\n      \"byteOffset\": 29904\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 224,\n      \"byteOffset\": 30128\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 224,\n      \"byteOffset\": 30352\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 224,\n      \"byteOffset\": 30576\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 168,\n      \"byteOffset\": 30800\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 224,\n      \"byteOffset\": 30968\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 224,\n      \"byteOffset\": 31192\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 224,\n      \"byteOffset\": 31416\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 168,\n      \"byteOffset\": 31640\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 224,\n      \"byteOffset\": 31808\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 224,\n      \"byteOffset\": 32032\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 224,\n      \"byteOffset\": 32256\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 148,\n      \"byteOffset\": 32480\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 444,\n      \"byteOffset\": 32628\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 592,\n      \"byteOffset\": 33072\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 444,\n      \"byteOffset\": 33664\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 592,\n      \"byteOffset\": 34108\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 444,\n      \"byteOffset\": 34700\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 592,\n      \"byteOffset\": 35144\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 444,\n      \"byteOffset\": 35736\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 592,\n      \"byteOffset\": 36180\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 444,\n      \"byteOffset\": 36772\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 592,\n      \"byteOffset\": 37216\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 444,\n      \"byteOffset\": 37808\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 592,\n      \"byteOffset\": 38252\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 444,\n      \"byteOffset\": 38844\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 592,\n      \"byteOffset\": 39288\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 592,\n      \"byteOffset\": 39880\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 592,\n      \"byteOffset\": 40472\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 592,\n      \"byteOffset\": 41064\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 592,\n      \"byteOffset\": 41656\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 592,\n      \"byteOffset\": 42248\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 592,\n      \"byteOffset\": 42840\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 592,\n      \"byteOffset\": 43432\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 592,\n      \"byteOffset\": 44024\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 592,\n      \"byteOffset\": 44616\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 444,\n      \"byteOffset\": 45208\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 592,\n      \"byteOffset\": 45652\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 592,\n      \"byteOffset\": 46244\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 592,\n      \"byteOffset\": 46836\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 444,\n      \"byteOffset\": 47428\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 592,\n      \"byteOffset\": 47872\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 592,\n      \"byteOffset\": 48464\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 592,\n      \"byteOffset\": 49056\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 436,\n      \"byteOffset\": 49648\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 1308,\n      \"byteOffset\": 50084\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 1744,\n      \"byteOffset\": 51392\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 1308,\n      \"byteOffset\": 53136\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 1744,\n      \"byteOffset\": 54444\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 1308,\n      \"byteOffset\": 56188\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 1744,\n      \"byteOffset\": 57496\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 1308,\n      \"byteOffset\": 59240\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 1744,\n      \"byteOffset\": 60548\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 1308,\n      \"byteOffset\": 62292\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 1744,\n      \"byteOffset\": 63600\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 1308,\n      \"byteOffset\": 65344\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 1744,\n      \"byteOffset\": 66652\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 1308,\n      \"byteOffset\": 68396\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 1744,\n      \"byteOffset\": 69704\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 1744,\n      \"byteOffset\": 71448\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 1744,\n      \"byteOffset\": 73192\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 1744,\n      \"byteOffset\": 74936\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 1744,\n      \"byteOffset\": 76680\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 1744,\n      \"byteOffset\": 78424\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 1744,\n      \"byteOffset\": 80168\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 1744,\n      \"byteOffset\": 81912\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 1744,\n      \"byteOffset\": 83656\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 1744,\n      \"byteOffset\": 85400\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 1308,\n      \"byteOffset\": 87144\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 1744,\n      \"byteOffset\": 88452\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 1744,\n      \"byteOffset\": 90196\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 1744,\n      \"byteOffset\": 91940\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 1308,\n      \"byteOffset\": 93684\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 1744,\n      \"byteOffset\": 94992\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 1744,\n      \"byteOffset\": 96736\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 1744,\n      \"byteOffset\": 98480\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 308,\n      \"byteOffset\": 100224\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 924,\n      \"byteOffset\": 100532\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 1232,\n      \"byteOffset\": 101456\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 924,\n      \"byteOffset\": 102688\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 1232,\n      \"byteOffset\": 103612\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 924,\n      \"byteOffset\": 104844\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 1232,\n      \"byteOffset\": 105768\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 924,\n      \"byteOffset\": 107000\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 1232,\n      \"byteOffset\": 107924\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 924,\n      \"byteOffset\": 109156\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 1232,\n      \"byteOffset\": 110080\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 924,\n      \"byteOffset\": 111312\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 1232,\n      \"byteOffset\": 112236\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 924,\n      \"byteOffset\": 113468\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 1232,\n      \"byteOffset\": 114392\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 1232,\n      \"byteOffset\": 115624\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 1232,\n      \"byteOffset\": 116856\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 1232,\n      \"byteOffset\": 118088\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 1232,\n      \"byteOffset\": 119320\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 1232,\n      \"byteOffset\": 120552\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 1232,\n      \"byteOffset\": 121784\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 1232,\n      \"byteOffset\": 123016\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 1232,\n      \"byteOffset\": 124248\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 1232,\n      \"byteOffset\": 125480\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 924,\n      \"byteOffset\": 126712\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 1232,\n      \"byteOffset\": 127636\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 1232,\n      \"byteOffset\": 128868\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 1232,\n      \"byteOffset\": 130100\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 924,\n      \"byteOffset\": 131332\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 1232,\n      \"byteOffset\": 132256\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 1232,\n      \"byteOffset\": 133488\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 1232,\n      \"byteOffset\": 134720\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 296,\n      \"byteOffset\": 135952\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 888,\n      \"byteOffset\": 136248\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 1184,\n      \"byteOffset\": 137136\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 888,\n      \"byteOffset\": 138320\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 1184,\n      \"byteOffset\": 139208\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 888,\n      \"byteOffset\": 140392\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 1184,\n      \"byteOffset\": 141280\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 888,\n      \"byteOffset\": 142464\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 1184,\n      \"byteOffset\": 143352\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 888,\n      \"byteOffset\": 144536\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 1184,\n      \"byteOffset\": 145424\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 888,\n      \"byteOffset\": 146608\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 1184,\n      \"byteOffset\": 147496\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 888,\n      \"byteOffset\": 148680\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 1184,\n      \"byteOffset\": 149568\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 1184,\n      \"byteOffset\": 150752\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 1184,\n      \"byteOffset\": 151936\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 1184,\n      \"byteOffset\": 153120\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 1184,\n      \"byteOffset\": 154304\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 1184,\n      \"byteOffset\": 155488\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 1184,\n      \"byteOffset\": 156672\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 1184,\n      \"byteOffset\": 157856\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 1184,\n      \"byteOffset\": 159040\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 1184,\n      \"byteOffset\": 160224\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 888,\n      \"byteOffset\": 161408\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 1184,\n      \"byteOffset\": 162296\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 1184,\n      \"byteOffset\": 163480\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 1184,\n      \"byteOffset\": 164664\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 888,\n      \"byteOffset\": 165848\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 1184,\n      \"byteOffset\": 166736\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 1184,\n      \"byteOffset\": 167920\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 1184,\n      \"byteOffset\": 169104\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 100,\n      \"byteOffset\": 170288\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 300,\n      \"byteOffset\": 170388\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 400,\n      \"byteOffset\": 170688\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 300,\n      \"byteOffset\": 171088\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 400,\n      \"byteOffset\": 171388\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 300,\n      \"byteOffset\": 171788\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 400,\n      \"byteOffset\": 172088\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 300,\n      \"byteOffset\": 172488\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 400,\n      \"byteOffset\": 172788\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 300,\n      \"byteOffset\": 173188\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 400,\n      \"byteOffset\": 173488\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 300,\n      \"byteOffset\": 173888\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 400,\n      \"byteOffset\": 174188\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 300,\n      \"byteOffset\": 174588\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 400,\n      \"byteOffset\": 174888\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 400,\n      \"byteOffset\": 175288\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 400,\n      \"byteOffset\": 175688\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 400,\n      \"byteOffset\": 176088\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 400,\n      \"byteOffset\": 176488\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 400,\n      \"byteOffset\": 176888\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 400,\n      \"byteOffset\": 177288\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 400,\n      \"byteOffset\": 177688\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 400,\n      \"byteOffset\": 178088\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 400,\n      \"byteOffset\": 178488\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 300,\n      \"byteOffset\": 178888\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 400,\n      \"byteOffset\": 179188\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 400,\n      \"byteOffset\": 179588\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 400,\n      \"byteOffset\": 179988\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 300,\n      \"byteOffset\": 180388\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 400,\n      \"byteOffset\": 180688\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 400,\n      \"byteOffset\": 181088\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 400,\n      \"byteOffset\": 181488\n    },\n    {\n      \"buffer\": 0,\n      \"target\": 34963,\n      \"byteLength\": 7944,\n      \"byteOffset\": 181888\n    },\n    {\n      \"buffer\": 0,\n      \"target\": 34962,\n      \"byteLength\": 15852,\n      \"byteOffset\": 189832\n    },\n    {\n      \"buffer\": 0,\n      \"target\": 34962,\n      \"byteLength\": 15852,\n      \"byteOffset\": 205684\n    },\n    {\n      \"buffer\": 0,\n      \"target\": 34962,\n      \"byteLength\": 10568,\n      \"byteOffset\": 221536\n    },\n    {\n      \"buffer\": 0,\n      \"target\": 34962,\n      \"byteLength\": 21136,\n      \"byteOffset\": 232104\n    },\n    {\n      \"buffer\": 0,\n      \"target\": 34963,\n      \"byteLength\": 20208,\n      \"byteOffset\": 253240\n    },\n    {\n      \"buffer\": 0,\n      \"target\": 34962,\n      \"byteLength\": 39648,\n      \"byteOffset\": 273448\n    },\n    {\n      \"buffer\": 0,\n      \"target\": 34962,\n      \"byteLength\": 39648,\n      \"byteOffset\": 313096\n    },\n    {\n      \"buffer\": 0,\n      \"target\": 34962,\n      \"byteLength\": 26432,\n      \"byteOffset\": 352744\n    },\n    {\n      \"buffer\": 0,\n      \"target\": 34962,\n      \"byteLength\": 52864,\n      \"byteOffset\": 379176\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 1472,\n      \"byteOffset\": 432040\n    }\n  ],\n  \"accessors\": [\n    {\n      \"componentType\": 5126,\n      \"type\": \"SCALAR\",\n      \"bufferView\": 0,\n      \"byteOffset\": 0,\n      \"count\": 34,\n      \"min\": [\n        -0.0416663289070129\n      ],\n      \"max\": [\n        1.33333361148834\n      ]\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC3\",\n      \"bufferView\": 1,\n      \"byteOffset\": 0,\n      \"count\": 34\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 2,\n      \"byteOffset\": 0,\n      \"count\": 34\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC3\",\n      \"bufferView\": 3,\n      \"byteOffset\": 0,\n      \"count\": 34\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 4,\n      \"byteOffset\": 0,\n      \"count\": 34\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC3\",\n      \"bufferView\": 5,\n      \"byteOffset\": 0,\n      \"count\": 34\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 6,\n      \"byteOffset\": 0,\n      \"count\": 34\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC3\",\n      \"bufferView\": 7,\n      \"byteOffset\": 0,\n      \"count\": 34\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 8,\n      \"byteOffset\": 0,\n      \"count\": 34\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC3\",\n      \"bufferView\": 9,\n      \"byteOffset\": 0,\n      \"count\": 34\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 10,\n      \"byteOffset\": 0,\n      \"count\": 34\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC3\",\n      \"bufferView\": 11,\n      \"byteOffset\": 0,\n      \"count\": 34\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 12,\n      \"byteOffset\": 0,\n      \"count\": 34\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC3\",\n      \"bufferView\": 13,\n      \"byteOffset\": 0,\n      \"count\": 34\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 14,\n      \"byteOffset\": 0,\n      \"count\": 34\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 15,\n      \"byteOffset\": 0,\n      \"count\": 34\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 16,\n      \"byteOffset\": 0,\n      \"count\": 34\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 17,\n      \"byteOffset\": 0,\n      \"count\": 34\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 18,\n      \"byteOffset\": 0,\n      \"count\": 34\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 19,\n      \"byteOffset\": 0,\n      \"count\": 34\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 20,\n      \"byteOffset\": 0,\n      \"count\": 34\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 21,\n      \"byteOffset\": 0,\n      \"count\": 34\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 22,\n      \"byteOffset\": 0,\n      \"count\": 34\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 23,\n      \"byteOffset\": 0,\n      \"count\": 34\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC3\",\n      \"bufferView\": 24,\n      \"byteOffset\": 0,\n      \"count\": 34\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 25,\n      \"byteOffset\": 0,\n      \"count\": 34\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 26,\n      \"byteOffset\": 0,\n      \"count\": 34\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 27,\n      \"byteOffset\": 0,\n      \"count\": 34\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC3\",\n      \"bufferView\": 28,\n      \"byteOffset\": 0,\n      \"count\": 34\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 29,\n      \"byteOffset\": 0,\n      \"count\": 34\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 30,\n      \"byteOffset\": 0,\n      \"count\": 34\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 31,\n      \"byteOffset\": 0,\n      \"count\": 34\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"SCALAR\",\n      \"bufferView\": 32,\n      \"byteOffset\": 0,\n      \"count\": 22,\n      \"min\": [\n        -0.0416634082794189\n      ],\n      \"max\": [\n        0.833336710929871\n      ]\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC3\",\n      \"bufferView\": 33,\n      \"byteOffset\": 0,\n      \"count\": 22\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 34,\n      \"byteOffset\": 0,\n      \"count\": 22\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC3\",\n      \"bufferView\": 35,\n      \"byteOffset\": 0,\n      \"count\": 22\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 36,\n      \"byteOffset\": 0,\n      \"count\": 22\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC3\",\n      \"bufferView\": 37,\n      \"byteOffset\": 0,\n      \"count\": 22\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 38,\n      \"byteOffset\": 0,\n      \"count\": 22\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC3\",\n      \"bufferView\": 39,\n      \"byteOffset\": 0,\n      \"count\": 22\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 40,\n      \"byteOffset\": 0,\n      \"count\": 22\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC3\",\n      \"bufferView\": 41,\n      \"byteOffset\": 0,\n      \"count\": 22\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 42,\n      \"byteOffset\": 0,\n      \"count\": 22\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC3\",\n      \"bufferView\": 43,\n      \"byteOffset\": 0,\n      \"count\": 22\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 44,\n      \"byteOffset\": 0,\n      \"count\": 22\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC3\",\n      \"bufferView\": 45,\n      \"byteOffset\": 0,\n      \"count\": 22\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 46,\n      \"byteOffset\": 0,\n      \"count\": 22\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 47,\n      \"byteOffset\": 0,\n      \"count\": 22\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 48,\n      \"byteOffset\": 0,\n      \"count\": 22\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 49,\n      \"byteOffset\": 0,\n      \"count\": 22\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 50,\n      \"byteOffset\": 0,\n      \"count\": 22\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 51,\n      \"byteOffset\": 0,\n      \"count\": 22\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 52,\n      \"byteOffset\": 0,\n      \"count\": 22\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 53,\n      \"byteOffset\": 0,\n      \"count\": 22\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 54,\n      \"byteOffset\": 0,\n      \"count\": 22\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 55,\n      \"byteOffset\": 0,\n      \"count\": 22\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC3\",\n      \"bufferView\": 56,\n      \"byteOffset\": 0,\n      \"count\": 22\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 57,\n      \"byteOffset\": 0,\n      \"count\": 22\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 58,\n      \"byteOffset\": 0,\n      \"count\": 22\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 59,\n      \"byteOffset\": 0,\n      \"count\": 22\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC3\",\n      \"bufferView\": 60,\n      \"byteOffset\": 0,\n      \"count\": 22\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 61,\n      \"byteOffset\": 0,\n      \"count\": 22\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 62,\n      \"byteOffset\": 0,\n      \"count\": 22\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 63,\n      \"byteOffset\": 0,\n      \"count\": 22\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"SCALAR\",\n      \"bufferView\": 64,\n      \"byteOffset\": 0,\n      \"count\": 14,\n      \"min\": [\n        0.0\n      ],\n      \"max\": [\n        0.541666746139526\n      ]\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC3\",\n      \"bufferView\": 65,\n      \"byteOffset\": 0,\n      \"count\": 14\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 66,\n      \"byteOffset\": 0,\n      \"count\": 14\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC3\",\n      \"bufferView\": 67,\n      \"byteOffset\": 0,\n      \"count\": 14\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 68,\n      \"byteOffset\": 0,\n      \"count\": 14\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC3\",\n      \"bufferView\": 69,\n      \"byteOffset\": 0,\n      \"count\": 14\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 70,\n      \"byteOffset\": 0,\n      \"count\": 14\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC3\",\n      \"bufferView\": 71,\n      \"byteOffset\": 0,\n      \"count\": 14\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 72,\n      \"byteOffset\": 0,\n      \"count\": 14\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC3\",\n      \"bufferView\": 73,\n      \"byteOffset\": 0,\n      \"count\": 14\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 74,\n      \"byteOffset\": 0,\n      \"count\": 14\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC3\",\n      \"bufferView\": 75,\n      \"byteOffset\": 0,\n      \"count\": 14\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 76,\n      \"byteOffset\": 0,\n      \"count\": 14\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC3\",\n      \"bufferView\": 77,\n      \"byteOffset\": 0,\n      \"count\": 14\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 78,\n      \"byteOffset\": 0,\n      \"count\": 14\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 79,\n      \"byteOffset\": 0,\n      \"count\": 14\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 80,\n      \"byteOffset\": 0,\n      \"count\": 14\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 81,\n      \"byteOffset\": 0,\n      \"count\": 14\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 82,\n      \"byteOffset\": 0,\n      \"count\": 14\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 83,\n      \"byteOffset\": 0,\n      \"count\": 14\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 84,\n      \"byteOffset\": 0,\n      \"count\": 14\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 85,\n      \"byteOffset\": 0,\n      \"count\": 14\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 86,\n      \"byteOffset\": 0,\n      \"count\": 14\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 87,\n      \"byteOffset\": 0,\n      \"count\": 14\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC3\",\n      \"bufferView\": 88,\n      \"byteOffset\": 0,\n      \"count\": 14\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 89,\n      \"byteOffset\": 0,\n      \"count\": 14\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 90,\n      \"byteOffset\": 0,\n      \"count\": 14\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 91,\n      \"byteOffset\": 0,\n      \"count\": 14\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC3\",\n      \"bufferView\": 92,\n      \"byteOffset\": 0,\n      \"count\": 14\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 93,\n      \"byteOffset\": 0,\n      \"count\": 14\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 94,\n      \"byteOffset\": 0,\n      \"count\": 14\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 95,\n      \"byteOffset\": 0,\n      \"count\": 14\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"SCALAR\",\n      \"bufferView\": 96,\n      \"byteOffset\": 0,\n      \"count\": 37,\n      \"min\": [\n        -0.0250000953674316\n      ],\n      \"max\": [\n        1.47499990463257\n      ]\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC3\",\n      \"bufferView\": 97,\n      \"byteOffset\": 0,\n      \"count\": 37\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 98,\n      \"byteOffset\": 0,\n      \"count\": 37\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC3\",\n      \"bufferView\": 99,\n      \"byteOffset\": 0,\n      \"count\": 37\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 100,\n      \"byteOffset\": 0,\n      \"count\": 37\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC3\",\n      \"bufferView\": 101,\n      \"byteOffset\": 0,\n      \"count\": 37\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 102,\n      \"byteOffset\": 0,\n      \"count\": 37\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC3\",\n      \"bufferView\": 103,\n      \"byteOffset\": 0,\n      \"count\": 37\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 104,\n      \"byteOffset\": 0,\n      \"count\": 37\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC3\",\n      \"bufferView\": 105,\n      \"byteOffset\": 0,\n      \"count\": 37\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 106,\n      \"byteOffset\": 0,\n      \"count\": 37\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC3\",\n      \"bufferView\": 107,\n      \"byteOffset\": 0,\n      \"count\": 37\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 108,\n      \"byteOffset\": 0,\n      \"count\": 37\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC3\",\n      \"bufferView\": 109,\n      \"byteOffset\": 0,\n      \"count\": 37\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 110,\n      \"byteOffset\": 0,\n      \"count\": 37\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 111,\n      \"byteOffset\": 0,\n      \"count\": 37\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 112,\n      \"byteOffset\": 0,\n      \"count\": 37\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 113,\n      \"byteOffset\": 0,\n      \"count\": 37\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 114,\n      \"byteOffset\": 0,\n      \"count\": 37\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 115,\n      \"byteOffset\": 0,\n      \"count\": 37\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 116,\n      \"byteOffset\": 0,\n      \"count\": 37\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 117,\n      \"byteOffset\": 0,\n      \"count\": 37\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 118,\n      \"byteOffset\": 0,\n      \"count\": 37\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 119,\n      \"byteOffset\": 0,\n      \"count\": 37\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC3\",\n      \"bufferView\": 120,\n      \"byteOffset\": 0,\n      \"count\": 37\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 121,\n      \"byteOffset\": 0,\n      \"count\": 37\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 122,\n      \"byteOffset\": 0,\n      \"count\": 37\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 123,\n      \"byteOffset\": 0,\n      \"count\": 37\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC3\",\n      \"bufferView\": 124,\n      \"byteOffset\": 0,\n      \"count\": 37\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 125,\n      \"byteOffset\": 0,\n      \"count\": 37\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 126,\n      \"byteOffset\": 0,\n      \"count\": 37\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 127,\n      \"byteOffset\": 0,\n      \"count\": 37\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"SCALAR\",\n      \"bufferView\": 128,\n      \"byteOffset\": 0,\n      \"count\": 109,\n      \"min\": [\n        -0.0250034332275391\n      ],\n      \"max\": [\n        4.47499704360962\n      ]\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC3\",\n      \"bufferView\": 129,\n      \"byteOffset\": 0,\n      \"count\": 109\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 130,\n      \"byteOffset\": 0,\n      \"count\": 109\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC3\",\n      \"bufferView\": 131,\n      \"byteOffset\": 0,\n      \"count\": 109\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 132,\n      \"byteOffset\": 0,\n      \"count\": 109\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC3\",\n      \"bufferView\": 133,\n      \"byteOffset\": 0,\n      \"count\": 109\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 134,\n      \"byteOffset\": 0,\n      \"count\": 109\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC3\",\n      \"bufferView\": 135,\n      \"byteOffset\": 0,\n      \"count\": 109\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 136,\n      \"byteOffset\": 0,\n      \"count\": 109\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC3\",\n      \"bufferView\": 137,\n      \"byteOffset\": 0,\n      \"count\": 109\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 138,\n      \"byteOffset\": 0,\n      \"count\": 109\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC3\",\n      \"bufferView\": 139,\n      \"byteOffset\": 0,\n      \"count\": 109\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 140,\n      \"byteOffset\": 0,\n      \"count\": 109\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC3\",\n      \"bufferView\": 141,\n      \"byteOffset\": 0,\n      \"count\": 109\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 142,\n      \"byteOffset\": 0,\n      \"count\": 109\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 143,\n      \"byteOffset\": 0,\n      \"count\": 109\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 144,\n      \"byteOffset\": 0,\n      \"count\": 109\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 145,\n      \"byteOffset\": 0,\n      \"count\": 109\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 146,\n      \"byteOffset\": 0,\n      \"count\": 109\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 147,\n      \"byteOffset\": 0,\n      \"count\": 109\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 148,\n      \"byteOffset\": 0,\n      \"count\": 109\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 149,\n      \"byteOffset\": 0,\n      \"count\": 109\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 150,\n      \"byteOffset\": 0,\n      \"count\": 109\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 151,\n      \"byteOffset\": 0,\n      \"count\": 109\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC3\",\n      \"bufferView\": 152,\n      \"byteOffset\": 0,\n      \"count\": 109\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 153,\n      \"byteOffset\": 0,\n      \"count\": 109\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 154,\n      \"byteOffset\": 0,\n      \"count\": 109\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 155,\n      \"byteOffset\": 0,\n      \"count\": 109\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC3\",\n      \"bufferView\": 156,\n      \"byteOffset\": 0,\n      \"count\": 109\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 157,\n      \"byteOffset\": 0,\n      \"count\": 109\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 158,\n      \"byteOffset\": 0,\n      \"count\": 109\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 159,\n      \"byteOffset\": 0,\n      \"count\": 109\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"SCALAR\",\n      \"bufferView\": 160,\n      \"byteOffset\": 0,\n      \"count\": 77,\n      \"min\": [\n        -0.0249671936035156\n      ],\n      \"max\": [\n        3.14169979095459\n      ]\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC3\",\n      \"bufferView\": 161,\n      \"byteOffset\": 0,\n      \"count\": 77\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 162,\n      \"byteOffset\": 0,\n      \"count\": 77\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC3\",\n      \"bufferView\": 163,\n      \"byteOffset\": 0,\n      \"count\": 77\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 164,\n      \"byteOffset\": 0,\n      \"count\": 77\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC3\",\n      \"bufferView\": 165,\n      \"byteOffset\": 0,\n      \"count\": 77\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 166,\n      \"byteOffset\": 0,\n      \"count\": 77\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC3\",\n      \"bufferView\": 167,\n      \"byteOffset\": 0,\n      \"count\": 77\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 168,\n      \"byteOffset\": 0,\n      \"count\": 77\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC3\",\n      \"bufferView\": 169,\n      \"byteOffset\": 0,\n      \"count\": 77\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 170,\n      \"byteOffset\": 0,\n      \"count\": 77\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC3\",\n      \"bufferView\": 171,\n      \"byteOffset\": 0,\n      \"count\": 77\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 172,\n      \"byteOffset\": 0,\n      \"count\": 77\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC3\",\n      \"bufferView\": 173,\n      \"byteOffset\": 0,\n      \"count\": 77\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 174,\n      \"byteOffset\": 0,\n      \"count\": 77\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 175,\n      \"byteOffset\": 0,\n      \"count\": 77\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 176,\n      \"byteOffset\": 0,\n      \"count\": 77\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 177,\n      \"byteOffset\": 0,\n      \"count\": 77\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 178,\n      \"byteOffset\": 0,\n      \"count\": 77\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 179,\n      \"byteOffset\": 0,\n      \"count\": 77\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 180,\n      \"byteOffset\": 0,\n      \"count\": 77\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 181,\n      \"byteOffset\": 0,\n      \"count\": 77\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 182,\n      \"byteOffset\": 0,\n      \"count\": 77\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 183,\n      \"byteOffset\": 0,\n      \"count\": 77\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC3\",\n      \"bufferView\": 184,\n      \"byteOffset\": 0,\n      \"count\": 77\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 185,\n      \"byteOffset\": 0,\n      \"count\": 77\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 186,\n      \"byteOffset\": 0,\n      \"count\": 77\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 187,\n      \"byteOffset\": 0,\n      \"count\": 77\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC3\",\n      \"bufferView\": 188,\n      \"byteOffset\": 0,\n      \"count\": 77\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 189,\n      \"byteOffset\": 0,\n      \"count\": 77\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 190,\n      \"byteOffset\": 0,\n      \"count\": 77\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 191,\n      \"byteOffset\": 0,\n      \"count\": 77\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"SCALAR\",\n      \"bufferView\": 192,\n      \"byteOffset\": 0,\n      \"count\": 74,\n      \"min\": [\n        -0.0250329971313477\n      ],\n      \"max\": [\n        3.01663398742676\n      ]\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC3\",\n      \"bufferView\": 193,\n      \"byteOffset\": 0,\n      \"count\": 74\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 194,\n      \"byteOffset\": 0,\n      \"count\": 74\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC3\",\n      \"bufferView\": 195,\n      \"byteOffset\": 0,\n      \"count\": 74\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 196,\n      \"byteOffset\": 0,\n      \"count\": 74\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC3\",\n      \"bufferView\": 197,\n      \"byteOffset\": 0,\n      \"count\": 74\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 198,\n      \"byteOffset\": 0,\n      \"count\": 74\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC3\",\n      \"bufferView\": 199,\n      \"byteOffset\": 0,\n      \"count\": 74\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 200,\n      \"byteOffset\": 0,\n      \"count\": 74\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC3\",\n      \"bufferView\": 201,\n      \"byteOffset\": 0,\n      \"count\": 74\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 202,\n      \"byteOffset\": 0,\n      \"count\": 74\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC3\",\n      \"bufferView\": 203,\n      \"byteOffset\": 0,\n      \"count\": 74\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 204,\n      \"byteOffset\": 0,\n      \"count\": 74\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC3\",\n      \"bufferView\": 205,\n      \"byteOffset\": 0,\n      \"count\": 74\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 206,\n      \"byteOffset\": 0,\n      \"count\": 74\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 207,\n      \"byteOffset\": 0,\n      \"count\": 74\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 208,\n      \"byteOffset\": 0,\n      \"count\": 74\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 209,\n      \"byteOffset\": 0,\n      \"count\": 74\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 210,\n      \"byteOffset\": 0,\n      \"count\": 74\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 211,\n      \"byteOffset\": 0,\n      \"count\": 74\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 212,\n      \"byteOffset\": 0,\n      \"count\": 74\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 213,\n      \"byteOffset\": 0,\n      \"count\": 74\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 214,\n      \"byteOffset\": 0,\n      \"count\": 74\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 215,\n      \"byteOffset\": 0,\n      \"count\": 74\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC3\",\n      \"bufferView\": 216,\n      \"byteOffset\": 0,\n      \"count\": 74\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 217,\n      \"byteOffset\": 0,\n      \"count\": 74\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 218,\n      \"byteOffset\": 0,\n      \"count\": 74\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 219,\n      \"byteOffset\": 0,\n      \"count\": 74\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC3\",\n      \"bufferView\": 220,\n      \"byteOffset\": 0,\n      \"count\": 74\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 221,\n      \"byteOffset\": 0,\n      \"count\": 74\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 222,\n      \"byteOffset\": 0,\n      \"count\": 74\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 223,\n      \"byteOffset\": 0,\n      \"count\": 74\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"SCALAR\",\n      \"bufferView\": 224,\n      \"byteOffset\": 0,\n      \"count\": 25,\n      \"min\": [\n        -0.0167007446289063\n      ],\n      \"max\": [\n        0.983299255371094\n      ]\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC3\",\n      \"bufferView\": 225,\n      \"byteOffset\": 0,\n      \"count\": 25\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 226,\n      \"byteOffset\": 0,\n      \"count\": 25\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC3\",\n      \"bufferView\": 227,\n      \"byteOffset\": 0,\n      \"count\": 25\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 228,\n      \"byteOffset\": 0,\n      \"count\": 25\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC3\",\n      \"bufferView\": 229,\n      \"byteOffset\": 0,\n      \"count\": 25\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 230,\n      \"byteOffset\": 0,\n      \"count\": 25\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC3\",\n      \"bufferView\": 231,\n      \"byteOffset\": 0,\n      \"count\": 25\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 232,\n      \"byteOffset\": 0,\n      \"count\": 25\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC3\",\n      \"bufferView\": 233,\n      \"byteOffset\": 0,\n      \"count\": 25\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 234,\n      \"byteOffset\": 0,\n      \"count\": 25\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC3\",\n      \"bufferView\": 235,\n      \"byteOffset\": 0,\n      \"count\": 25\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 236,\n      \"byteOffset\": 0,\n      \"count\": 25\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC3\",\n      \"bufferView\": 237,\n      \"byteOffset\": 0,\n      \"count\": 25\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 238,\n      \"byteOffset\": 0,\n      \"count\": 25\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 239,\n      \"byteOffset\": 0,\n      \"count\": 25\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 240,\n      \"byteOffset\": 0,\n      \"count\": 25\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 241,\n      \"byteOffset\": 0,\n      \"count\": 25\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 242,\n      \"byteOffset\": 0,\n      \"count\": 25\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 243,\n      \"byteOffset\": 0,\n      \"count\": 25\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 244,\n      \"byteOffset\": 0,\n      \"count\": 25\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 245,\n      \"byteOffset\": 0,\n      \"count\": 25\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 246,\n      \"byteOffset\": 0,\n      \"count\": 25\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 247,\n      \"byteOffset\": 0,\n      \"count\": 25\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC3\",\n      \"bufferView\": 248,\n      \"byteOffset\": 0,\n      \"count\": 25\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 249,\n      \"byteOffset\": 0,\n      \"count\": 25\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 250,\n      \"byteOffset\": 0,\n      \"count\": 25\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 251,\n      \"byteOffset\": 0,\n      \"count\": 25\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC3\",\n      \"bufferView\": 252,\n      \"byteOffset\": 0,\n      \"count\": 25\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 253,\n      \"byteOffset\": 0,\n      \"count\": 25\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 254,\n      \"byteOffset\": 0,\n      \"count\": 25\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 255,\n      \"byteOffset\": 0,\n      \"count\": 25\n    },\n    {\n      \"componentType\": 5123,\n      \"type\": \"SCALAR\",\n      \"bufferView\": 256,\n      \"byteOffset\": 0,\n      \"count\": 3972\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC3\",\n      \"bufferView\": 257,\n      \"byteOffset\": 0,\n      \"count\": 1321,\n      \"min\": [\n        -0.631720960140228,\n        -0.987726211547852,\n        -0.00609945505857468\n      ],\n      \"max\": [\n        0.635584473609924,\n        0.743749380111694,\n        0.115580216050148\n      ]\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC3\",\n      \"bufferView\": 258,\n      \"byteOffset\": 0,\n      \"count\": 1321\n    },\n    {\n      \"componentType\": 5123,\n      \"type\": \"VEC4\",\n      \"bufferView\": 259,\n      \"byteOffset\": 0,\n      \"count\": 1321\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 260,\n      \"byteOffset\": 0,\n      \"count\": 1321\n    },\n    {\n      \"componentType\": 5123,\n      \"type\": \"SCALAR\",\n      \"bufferView\": 261,\n      \"byteOffset\": 0,\n      \"count\": 10104\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC3\",\n      \"bufferView\": 262,\n      \"byteOffset\": 0,\n      \"count\": 3304,\n      \"min\": [\n        -0.694011926651001,\n        -1.05007696151733,\n        9.20049175734405E-11\n      ],\n      \"max\": [\n        0.694011926651001,\n        0.905986249446869,\n        0.161730408668518\n      ]\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC3\",\n      \"bufferView\": 263,\n      \"byteOffset\": 0,\n      \"count\": 3304\n    },\n    {\n      \"componentType\": 5123,\n      \"type\": \"VEC4\",\n      \"bufferView\": 264,\n      \"byteOffset\": 0,\n      \"count\": 3304\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 265,\n      \"byteOffset\": 0,\n      \"count\": 3304\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"MAT4\",\n      \"bufferView\": 266,\n      \"byteOffset\": 0,\n      \"count\": 23\n    }\n  ],\n  \"nodes\": [\n    {\n      \"name\": \"RootNode\",\n      \"translation\": [\n        0.0,\n        0.0,\n        0.0\n      ],\n      \"rotation\": [\n        0.0,\n        0.0,\n        0.0,\n        1.0\n      ],\n      \"scale\": [\n        1.0,\n        1.0,\n        1.0\n      ],\n      \"children\": [\n        1,\n        37\n      ]\n    },\n    {\n      \"name\": \"Bip001\",\n      \"translation\": [\n        0.0,\n        0.556053459644318,\n        0.0\n      ],\n      \"rotation\": [\n        -0.500000536441803,\n        -0.499999463558197,\n        -0.499999463558197,\n        0.500000536441803\n      ],\n      \"scale\": [\n        1.0,\n        1.0,\n        1.0\n      ],\n      \"children\": [\n        2,\n        3\n      ]\n    },\n    {\n      \"name\": \"Bip001_Footsteps\",\n      \"translation\": [\n        0.0,\n        -1.17549435082229E-38,\n        -0.575027167797089\n      ],\n      \"rotation\": [\n        4.56519357454961E-33,\n        4.15056990104971E-33,\n        0.707105994224548,\n        0.707107543945313\n      ],\n      \"scale\": [\n        1.0,\n        1.0,\n        1.0\n      ]\n    },\n    {\n      \"name\": \"Bip001_Pelvis\",\n      \"translation\": [\n        0.0,\n        0.0,\n        0.0\n      ],\n      \"rotation\": [\n        -0.5,\n        -0.5,\n        -0.499999314546585,\n        0.500000715255737\n      ],\n      \"scale\": [\n        1.0,\n        1.0,\n        1.0\n      ],\n      \"children\": [\n        4\n      ]\n    },\n    {\n      \"name\": \"Bip001_Spine\",\n      \"translation\": [\n        0.14355856180191,\n        -7.53745043766685E-05,\n        1.99191504179907E-07\n      ],\n      \"rotation\": [\n        -2.08047595151584E-06,\n        -6.93675929142046E-07,\n        0.000398158997995779,\n        0.999999940395355\n      ],\n      \"scale\": [\n        1.0,\n        1.0,\n        1.0\n      ],\n      \"children\": [\n        5,\n        23,\n        30\n      ]\n    },\n    {\n      \"name\": \"Bip001_Spine1\",\n      \"translation\": [\n        0.0946972966194153,\n        -7.54050561226904E-05,\n        -2.09143591334282E-10\n      ],\n      \"rotation\": [\n        -1.70940724937015E-15,\n        2.82792371916566E-23,\n        1.62630325872826E-19,\n        1.0\n      ],\n      \"scale\": [\n        1.0,\n        1.0,\n        1.0\n      ],\n      \"children\": [\n        6\n      ]\n    },\n    {\n      \"name\": \"Bip001_Spine2\",\n      \"translation\": [\n        0.0946973562240601,\n        -7.54050561226904E-05,\n        -2.09143591334282E-10\n      ],\n      \"rotation\": [\n        -1.70940735524927E-15,\n        -6.22970398828999E-23,\n        1.0842021724855E-19,\n        1.0\n      ],\n      \"scale\": [\n        1.0,\n        1.0,\n        1.0\n      ],\n      \"children\": [\n        7\n      ]\n    },\n    {\n      \"name\": \"Bip001_Spine3\",\n      \"translation\": [\n        0.0946973562240601,\n        -6.75612245686352E-05,\n        -1.87387882988332E-10\n      ],\n      \"rotation\": [\n        -1.70940735524927E-15,\n        -4.7097596127238E-23,\n        1.62630325872826E-19,\n        1.0\n      ],\n      \"scale\": [\n        1.0,\n        1.0,\n        1.0\n      ],\n      \"children\": [\n        8\n      ]\n    },\n    {\n      \"name\": \"Bip001_Neck\",\n      \"translation\": [\n        0.0848507285118103,\n        -0.000102765450719744,\n        -2.57675214498931E-10\n      ],\n      \"rotation\": [\n        -1.32319925683078E-07,\n        -9.07349786416489E-08,\n        0.0202760715037584,\n        0.99979442358017\n      ],\n      \"scale\": [\n        1.0,\n        1.0,\n        1.0\n      ],\n      \"children\": [\n        9,\n        15,\n        21\n      ]\n    },\n    {\n      \"name\": \"Bip001_L_Clavicle\",\n      \"translation\": [\n        1.19209289550781E-07,\n        0.000102777034044266,\n        0.0228433422744274\n      ],\n      \"rotation\": [\n        0.614420592784882,\n        -0.012706539593637,\n        0.788707733154297,\n        0.0163084100931883\n      ],\n      \"scale\": [\n        1.0,\n        1.0,\n        1.0\n      ],\n      \"children\": [\n        10\n      ]\n    },\n    {\n      \"name\": \"Bip001_L_UpperArm\",\n      \"translation\": [\n        0.168243989348412,\n        4.61852778244065E-14,\n        1.19209289550781E-07\n      ],\n      \"rotation\": [\n        -0.059801634401083,\n        0.413152545690536,\n        0.0394934490323067,\n        0.907837569713593\n      ],\n      \"scale\": [\n        1.0,\n        1.0,\n        1.0\n      ],\n      \"children\": [\n        11\n      ]\n    },\n    {\n      \"name\": \"Bip001_L_Forearm\",\n      \"translation\": [\n        0.180058240890503,\n        1.38777878078145E-17,\n        0.0\n      ],\n      \"rotation\": [\n        1.18579674347345E-17,\n        -1.26615626464818E-17,\n        -0.17377233505249,\n        0.984785854816437\n      ],\n      \"scale\": [\n        1.0,\n        1.0,\n        1.0\n      ],\n      \"children\": [\n        12\n      ]\n    },\n    {\n      \"name\": \"Bip001_L_Hand\",\n      \"translation\": [\n        0.218532353639603,\n        0.0,\n        5.96046447753906E-08\n      ],\n      \"rotation\": [\n        -0.678476691246033,\n        0.198327571153641,\n        0.198169693350792,\n        0.679017186164856\n      ],\n      \"scale\": [\n        1.0,\n        1.0,\n        1.0\n      ],\n      \"children\": [\n        13\n      ]\n    },\n    {\n      \"name\": \"Bip001_L_Finger0\",\n      \"translation\": [\n        0.0910552144050598,\n        0.0,\n        5.55111512312578E-17\n      ],\n      \"rotation\": [\n        -0.00039816094795242,\n        -1.49019019346497E-08,\n        1.85671200636506E-09,\n        0.999999940395355\n      ],\n      \"scale\": [\n        1.0,\n        1.0,\n        1.0\n      ],\n      \"children\": [\n        14\n      ]\n    },\n    {\n      \"name\": \"Bip001_L_Finger0Nub\",\n      \"translation\": [\n        0.0227637887001038,\n        2.98023223876953E-08,\n        2.98023223876953E-08\n      ],\n      \"rotation\": [\n        3.1225025876305E-17,\n        -1.49011611938477E-08,\n        1.86264514923096E-09,\n        1.0\n      ],\n      \"scale\": [\n        1.0,\n        1.0,\n        1.0\n      ]\n    },\n    {\n      \"name\": \"Bip001_R_Clavicle\",\n      \"translation\": [\n        1.19209289550781E-07,\n        0.000102914869785309,\n        -0.0228433422744274\n      ],\n      \"rotation\": [\n        -0.623302102088928,\n        0.0128878122195601,\n        0.781707763671875,\n        0.016165541484952\n      ],\n      \"scale\": [\n        1.0,\n        1.0,\n        1.0\n      ],\n      \"children\": [\n        16\n      ]\n    },\n    {\n      \"name\": \"Bip001_R_UpperArm\",\n      \"translation\": [\n        0.221783712506294,\n        -5.32907051820075E-14,\n        -1.19209289550781E-07\n      ],\n      \"rotation\": [\n        -0.123283706605434,\n        -0.422829777002335,\n        -0.000592334545217454,\n        0.897783815860748\n      ],\n      \"scale\": [\n        1.0,\n        1.0,\n        1.0\n      ],\n      \"children\": [\n        17\n      ]\n    },\n    {\n      \"name\": \"Bip001_R_Forearm\",\n      \"translation\": [\n        0.13731324672699,\n        -1.49011611938477E-08,\n        0.0\n      ],\n      \"rotation\": [\n        -7.33295943900504E-18,\n        1.82047712464406E-17,\n        -0.39169830083847,\n        0.920093715190887\n      ],\n      \"scale\": [\n        1.0,\n        1.0,\n        1.0\n      ],\n      \"children\": [\n        18\n      ]\n    },\n    {\n      \"name\": \"Bip001_R_Hand\",\n      \"translation\": [\n        0.21853244304657,\n        -2.98023223876953E-08,\n        0.0\n      ],\n      \"rotation\": [\n        0.687779307365417,\n        -0.163106694817543,\n        0.162976816296577,\n        0.688327252864838\n      ],\n      \"scale\": [\n        1.0,\n        1.0,\n        1.0\n      ],\n      \"children\": [\n        19\n      ]\n    },\n    {\n      \"name\": \"Bip001_R_Finger0\",\n      \"translation\": [\n        0.091055154800415,\n        -5.55111512312578E-17,\n        2.98023223876953E-08\n      ],\n      \"rotation\": [\n        0.000398149742977694,\n        -5.55166701803048E-17,\n        -1.38556847146664E-17,\n        0.999999940395355\n      ],\n      \"scale\": [\n        1.0,\n        1.0,\n        1.0\n      ],\n      \"children\": [\n        20\n      ]\n    },\n    {\n      \"name\": \"Bip001_R_Finger0Nub\",\n      \"translation\": [\n        0.022763729095459,\n        0.0,\n        0.0\n      ],\n      \"rotation\": [\n        1.49011611938477E-08,\n        -1.86264514923096E-09,\n        1.0,\n        1.86264503820865E-09\n      ],\n      \"scale\": [\n        -1.0,\n        -1.0,\n        -1.0\n      ]\n    },\n    {\n      \"name\": \"Bip001_Head\",\n      \"translation\": [\n        0.129162311553955,\n        -6.93889390390723E-18,\n        -2.11758236813575E-22\n      ],\n      \"rotation\": [\n        1.94586377233463E-07,\n        -5.19076309046795E-07,\n        0.108859837055206,\n        0.99405711889267\n      ],\n      \"scale\": [\n        1.0,\n        1.0,\n        1.0\n      ],\n      \"children\": [\n        22\n      ]\n    },\n    {\n      \"name\": \"Bip001_HeadNub\",\n      \"translation\": [\n        0.60014009475708,\n        2.98023223876953E-08,\n        2.27373675443232E-13\n      ],\n      \"rotation\": [\n        1.4210854715202E-14,\n        5.68434256370716E-14,\n        7.45058059692383E-09,\n        1.0\n      ],\n      \"scale\": [\n        1.0,\n        1.0,\n        1.0\n      ]\n    },\n    {\n      \"name\": \"Bip001_L_Thigh\",\n      \"translation\": [\n        -0.143558502197266,\n        0.000189370854059234,\n        0.124833516776562\n      ],\n      \"rotation\": [\n        0.0017798823537305,\n        0.999618232250214,\n        -0.000209213278139941,\n        -0.0275716409087181\n      ],\n      \"scale\": [\n        1.0,\n        1.0,\n        1.0\n      ],\n      \"children\": [\n        24\n      ]\n    },\n    {\n      \"name\": \"Bip001_L_Calf\",\n      \"translation\": [\n        0.220977544784546,\n        1.16415321826935E-10,\n        -2.77555756156289E-17\n      ],\n      \"rotation\": [\n        -2.11358944453434E-20,\n        4.14737357631941E-18,\n        -0.007974898442626,\n        0.99996817111969\n      ],\n      \"scale\": [\n        1.0,\n        1.0,\n        1.0\n      ],\n      \"children\": [\n        25\n      ]\n    },\n    {\n      \"name\": \"Bip001_L_Foot\",\n      \"translation\": [\n        0.252047121524811,\n        4.65661287307739E-10,\n        -1.49011611938477E-08\n      ],\n      \"rotation\": [\n        -1.68952419699053E-06,\n        -0.0275724455714226,\n        0.00658996682614088,\n        0.99959808588028\n      ],\n      \"scale\": [\n        1.0,\n        1.0,\n        1.0\n      ],\n      \"children\": [\n        26\n      ]\n    },\n    {\n      \"name\": \"Bip001_L_Toe0\",\n      \"translation\": [\n        0.0837707594037056,\n        0.107809320092201,\n        -1.49011611938477E-08\n      ],\n      \"rotation\": [\n        -1.54543080554959E-08,\n        -1.54543080554959E-08,\n        0.70710676908493,\n        0.70710676908493\n      ],\n      \"scale\": [\n        1.0,\n        1.0,\n        1.0\n      ],\n      \"children\": [\n        27\n      ]\n    },\n    {\n      \"name\": \"Bip001_L_Toe01\",\n      \"translation\": [\n        0.0109266191720963,\n        2.64697796016969E-23,\n        1.49011611938477E-08\n      ],\n      \"rotation\": [\n        -2.98949656894235E-22,\n        9.55340720879103E-16,\n        -1.77635726291672E-15,\n        1.0\n      ],\n      \"scale\": [\n        1.0,\n        1.0,\n        1.0\n      ],\n      \"children\": [\n        28\n      ]\n    },\n    {\n      \"name\": \"Bip001_L_Toe02\",\n      \"translation\": [\n        0.0109266266226768,\n        2.64697796016969E-23,\n        -1.49011611938477E-08\n      ],\n      \"rotation\": [\n        -3.06865831901917E-22,\n        9.55340720879103E-16,\n        -1.77635726291672E-15,\n        1.0\n      ],\n      \"scale\": [\n        1.0,\n        1.0,\n        1.0\n      ],\n      \"children\": [\n        29\n      ]\n    },\n    {\n      \"name\": \"Bip001_L_Toe0Nub\",\n      \"translation\": [\n        0.0109266191720963,\n        8.88178313821007E-16,\n        0.0\n      ],\n      \"rotation\": [\n        9.5534093263734E-16,\n        1.83377621529267E-22,\n        1.0,\n        1.83758927467374E-15\n      ],\n      \"scale\": [\n        -1.0,\n        -1.0,\n        -1.0\n      ]\n    },\n    {\n      \"name\": \"Bip001_R_Thigh\",\n      \"translation\": [\n        -0.143558502197266,\n        0.000190063350601122,\n        -0.124833516776562\n      ],\n      \"rotation\": [\n        0.00195688824169338,\n        0.999578893184662,\n        0.000242012785747647,\n        0.0289512798190117\n      ],\n      \"scale\": [\n        1.0,\n        1.0,\n        1.0\n      ],\n      \"children\": [\n        31\n      ]\n    },\n    {\n      \"name\": \"Bip001_R_Calf\",\n      \"translation\": [\n        0.215908050537109,\n        1.16415321826935E-10,\n        2.77555756156289E-17\n      ],\n      \"rotation\": [\n        -4.16264232230077E-20,\n        -8.52490436781741E-18,\n        -0.00806227512657642,\n        0.999967515468597\n      ],\n      \"scale\": [\n        1.0,\n        1.0,\n        1.0\n      ],\n      \"children\": [\n        32\n      ]\n    },\n    {\n      \"name\": \"Bip001_R_Foot\",\n      \"translation\": [\n        0.248086482286453,\n        -8.67361737988404E-19,\n        1.49011611938477E-08\n      ],\n      \"rotation\": [\n        1.87325349543244E-05,\n        0.0289522744715214,\n        0.00650005834177136,\n        0.999559640884399\n      ],\n      \"scale\": [\n        1.0,\n        1.0,\n        1.0\n      ],\n      \"children\": [\n        33\n      ]\n    },\n    {\n      \"name\": \"Bip001_R_Toe0\",\n      \"translation\": [\n        0.0837707594037056,\n        0.107809312641621,\n        -1.49011611938477E-08\n      ],\n      \"rotation\": [\n        -1.54543080554959E-08,\n        -1.54543080554959E-08,\n        0.70710676908493,\n        0.70710676908493\n      ],\n      \"scale\": [\n        1.0,\n        1.0,\n        1.0\n      ],\n      \"children\": [\n        34\n      ]\n    },\n    {\n      \"name\": \"Bip001_R_Toe01\",\n      \"translation\": [\n        0.0109266117215157,\n        -1.73472347597681E-18,\n        1.49011611938477E-08\n      ],\n      \"rotation\": [\n        -1.0659340986836E-22,\n        9.5534093263734E-16,\n        -1.77635683940025E-15,\n        1.0\n      ],\n      \"scale\": [\n        1.0,\n        1.0,\n        1.0\n      ],\n      \"children\": [\n        35\n      ]\n    },\n    {\n      \"name\": \"Bip001_R_Toe02\",\n      \"translation\": [\n        0.0109266340732574,\n        1.73472347597681E-18,\n        -1.49011611938477E-08\n      ],\n      \"rotation\": [\n        -1.17816085893945E-22,\n        9.5534093263734E-16,\n        -1.77635705115849E-15,\n        1.0\n      ],\n      \"scale\": [\n        1.0,\n        1.0,\n        1.0\n      ],\n      \"children\": [\n        36\n      ]\n    },\n    {\n      \"name\": \"Bip001_R_Toe0Nub\",\n      \"translation\": [\n        0.0109266191720963,\n        0.0,\n        0.0\n      ],\n      \"rotation\": [\n        -1.29039165816314E-22,\n        9.55341144395576E-16,\n        -1.77635683940025E-15,\n        1.0\n      ],\n      \"scale\": [\n        1.0,\n        1.0,\n        1.0\n      ]\n    },\n    {\n      \"name\": \"Rectangle001\",\n      \"translation\": [\n        -0.00846058130264282,\n        1.0601464509964,\n        -0.054740384221077\n      ],\n      \"rotation\": [\n        8.14603424714733E-08,\n        0.0,\n        0.0,\n        1.0\n      ],\n      \"scale\": [\n        1.0,\n        1.0,\n        1.0\n      ],\n      \"mesh\": 0,\n      \"skin\": 0\n    }\n  ],\n  \"animations\": [\n    {\n      \"name\": \"_defaultAnim_\",\n      \"channels\": [\n        {\n          \"sampler\": 0,\n          \"target\": {\n            \"node\": 1,\n            \"path\": \"translation\"\n          }\n        },\n        {\n          \"sampler\": 1,\n          \"target\": {\n            \"node\": 1,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 2,\n          \"target\": {\n            \"node\": 2,\n            \"path\": \"translation\"\n          }\n        },\n        {\n          \"sampler\": 3,\n          \"target\": {\n            \"node\": 2,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 4,\n          \"target\": {\n            \"node\": 3,\n            \"path\": \"translation\"\n          }\n        },\n        {\n          \"sampler\": 5,\n          \"target\": {\n            \"node\": 3,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 6,\n          \"target\": {\n            \"node\": 4,\n            \"path\": \"translation\"\n          }\n        },\n        {\n          \"sampler\": 7,\n          \"target\": {\n            \"node\": 4,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 8,\n          \"target\": {\n            \"node\": 5,\n            \"path\": \"translation\"\n          }\n        },\n        {\n          \"sampler\": 9,\n          \"target\": {\n            \"node\": 5,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 10,\n          \"target\": {\n            \"node\": 6,\n            \"path\": \"translation\"\n          }\n        },\n        {\n          \"sampler\": 11,\n          \"target\": {\n            \"node\": 6,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 12,\n          \"target\": {\n            \"node\": 7,\n            \"path\": \"translation\"\n          }\n        },\n        {\n          \"sampler\": 13,\n          \"target\": {\n            \"node\": 7,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 14,\n          \"target\": {\n            \"node\": 9,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 15,\n          \"target\": {\n            \"node\": 10,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 16,\n          \"target\": {\n            \"node\": 11,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 17,\n          \"target\": {\n            \"node\": 12,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 18,\n          \"target\": {\n            \"node\": 15,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 19,\n          \"target\": {\n            \"node\": 16,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 20,\n          \"target\": {\n            \"node\": 17,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 21,\n          \"target\": {\n            \"node\": 18,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 22,\n          \"target\": {\n            \"node\": 21,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 23,\n          \"target\": {\n            \"node\": 23,\n            \"path\": \"translation\"\n          }\n        },\n        {\n          \"sampler\": 24,\n          \"target\": {\n            \"node\": 23,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 25,\n          \"target\": {\n            \"node\": 24,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 26,\n          \"target\": {\n            \"node\": 25,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 27,\n          \"target\": {\n            \"node\": 30,\n            \"path\": \"translation\"\n          }\n        },\n        {\n          \"sampler\": 28,\n          \"target\": {\n            \"node\": 30,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 29,\n          \"target\": {\n            \"node\": 31,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 30,\n          \"target\": {\n            \"node\": 32,\n            \"path\": \"rotation\"\n          }\n        }\n      ],\n      \"samplers\": [\n        {\n          \"input\": 0,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 1\n        },\n        {\n          \"input\": 0,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 2\n        },\n        {\n          \"input\": 0,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 3\n        },\n        {\n          \"input\": 0,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 4\n        },\n        {\n          \"input\": 0,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 5\n        },\n        {\n          \"input\": 0,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 6\n        },\n        {\n          \"input\": 0,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 7\n        },\n        {\n          \"input\": 0,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 8\n        },\n        {\n          \"input\": 0,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 9\n        },\n        {\n          \"input\": 0,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 10\n        },\n        {\n          \"input\": 0,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 11\n        },\n        {\n          \"input\": 0,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 12\n        },\n        {\n          \"input\": 0,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 13\n        },\n        {\n          \"input\": 0,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 14\n        },\n        {\n          \"input\": 0,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 15\n        },\n        {\n          \"input\": 0,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 16\n        },\n        {\n          \"input\": 0,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 17\n        },\n        {\n          \"input\": 0,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 18\n        },\n        {\n          \"input\": 0,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 19\n        },\n        {\n          \"input\": 0,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 20\n        },\n        {\n          \"input\": 0,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 21\n        },\n        {\n          \"input\": 0,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 22\n        },\n        {\n          \"input\": 0,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 23\n        },\n        {\n          \"input\": 0,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 24\n        },\n        {\n          \"input\": 0,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 25\n        },\n        {\n          \"input\": 0,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 26\n        },\n        {\n          \"input\": 0,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 27\n        },\n        {\n          \"input\": 0,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 28\n        },\n        {\n          \"input\": 0,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 29\n        },\n        {\n          \"input\": 0,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 30\n        },\n        {\n          \"input\": 0,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 31\n        }\n      ]\n    },\n    {\n      \"name\": \"蹲下\",\n      \"channels\": [\n        {\n          \"sampler\": 0,\n          \"target\": {\n            \"node\": 1,\n            \"path\": \"translation\"\n          }\n        },\n        {\n          \"sampler\": 1,\n          \"target\": {\n            \"node\": 1,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 2,\n          \"target\": {\n            \"node\": 2,\n            \"path\": \"translation\"\n          }\n        },\n        {\n          \"sampler\": 3,\n          \"target\": {\n            \"node\": 2,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 4,\n          \"target\": {\n            \"node\": 3,\n            \"path\": \"translation\"\n          }\n        },\n        {\n          \"sampler\": 5,\n          \"target\": {\n            \"node\": 3,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 6,\n          \"target\": {\n            \"node\": 4,\n            \"path\": \"translation\"\n          }\n        },\n        {\n          \"sampler\": 7,\n          \"target\": {\n            \"node\": 4,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 8,\n          \"target\": {\n            \"node\": 5,\n            \"path\": \"translation\"\n          }\n        },\n        {\n          \"sampler\": 9,\n          \"target\": {\n            \"node\": 5,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 10,\n          \"target\": {\n            \"node\": 6,\n            \"path\": \"translation\"\n          }\n        },\n        {\n          \"sampler\": 11,\n          \"target\": {\n            \"node\": 6,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 12,\n          \"target\": {\n            \"node\": 7,\n            \"path\": \"translation\"\n          }\n        },\n        {\n          \"sampler\": 13,\n          \"target\": {\n            \"node\": 7,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 14,\n          \"target\": {\n            \"node\": 9,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 15,\n          \"target\": {\n            \"node\": 10,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 16,\n          \"target\": {\n            \"node\": 11,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 17,\n          \"target\": {\n            \"node\": 12,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 18,\n          \"target\": {\n            \"node\": 15,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 19,\n          \"target\": {\n            \"node\": 16,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 20,\n          \"target\": {\n            \"node\": 17,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 21,\n          \"target\": {\n            \"node\": 18,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 22,\n          \"target\": {\n            \"node\": 21,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 23,\n          \"target\": {\n            \"node\": 23,\n            \"path\": \"translation\"\n          }\n        },\n        {\n          \"sampler\": 24,\n          \"target\": {\n            \"node\": 23,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 25,\n          \"target\": {\n            \"node\": 24,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 26,\n          \"target\": {\n            \"node\": 25,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 27,\n          \"target\": {\n            \"node\": 30,\n            \"path\": \"translation\"\n          }\n        },\n        {\n          \"sampler\": 28,\n          \"target\": {\n            \"node\": 30,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 29,\n          \"target\": {\n            \"node\": 31,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 30,\n          \"target\": {\n            \"node\": 32,\n            \"path\": \"rotation\"\n          }\n        }\n      ],\n      \"samplers\": [\n        {\n          \"input\": 32,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 33\n        },\n        {\n          \"input\": 32,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 34\n        },\n        {\n          \"input\": 32,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 35\n        },\n        {\n          \"input\": 32,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 36\n        },\n        {\n          \"input\": 32,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 37\n        },\n        {\n          \"input\": 32,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 38\n        },\n        {\n          \"input\": 32,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 39\n        },\n        {\n          \"input\": 32,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 40\n        },\n        {\n          \"input\": 32,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 41\n        },\n        {\n          \"input\": 32,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 42\n        },\n        {\n          \"input\": 32,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 43\n        },\n        {\n          \"input\": 32,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 44\n        },\n        {\n          \"input\": 32,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 45\n        },\n        {\n          \"input\": 32,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 46\n        },\n        {\n          \"input\": 32,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 47\n        },\n        {\n          \"input\": 32,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 48\n        },\n        {\n          \"input\": 32,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 49\n        },\n        {\n          \"input\": 32,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 50\n        },\n        {\n          \"input\": 32,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 51\n        },\n        {\n          \"input\": 32,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 52\n        },\n        {\n          \"input\": 32,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 53\n        },\n        {\n          \"input\": 32,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 54\n        },\n        {\n          \"input\": 32,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 55\n        },\n        {\n          \"input\": 32,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 56\n        },\n        {\n          \"input\": 32,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 57\n        },\n        {\n          \"input\": 32,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 58\n        },\n        {\n          \"input\": 32,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 59\n        },\n        {\n          \"input\": 32,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 60\n        },\n        {\n          \"input\": 32,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 61\n        },\n        {\n          \"input\": 32,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 62\n        },\n        {\n          \"input\": 32,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 63\n        }\n      ]\n    },\n    {\n      \"name\": \"跑步\",\n      \"channels\": [\n        {\n          \"sampler\": 0,\n          \"target\": {\n            \"node\": 1,\n            \"path\": \"translation\"\n          }\n        },\n        {\n          \"sampler\": 1,\n          \"target\": {\n            \"node\": 1,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 2,\n          \"target\": {\n            \"node\": 2,\n            \"path\": \"translation\"\n          }\n        },\n        {\n          \"sampler\": 3,\n          \"target\": {\n            \"node\": 2,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 4,\n          \"target\": {\n            \"node\": 3,\n            \"path\": \"translation\"\n          }\n        },\n        {\n          \"sampler\": 5,\n          \"target\": {\n            \"node\": 3,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 6,\n          \"target\": {\n            \"node\": 4,\n            \"path\": \"translation\"\n          }\n        },\n        {\n          \"sampler\": 7,\n          \"target\": {\n            \"node\": 4,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 8,\n          \"target\": {\n            \"node\": 5,\n            \"path\": \"translation\"\n          }\n        },\n        {\n          \"sampler\": 9,\n          \"target\": {\n            \"node\": 5,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 10,\n          \"target\": {\n            \"node\": 6,\n            \"path\": \"translation\"\n          }\n        },\n        {\n          \"sampler\": 11,\n          \"target\": {\n            \"node\": 6,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 12,\n          \"target\": {\n            \"node\": 7,\n            \"path\": \"translation\"\n          }\n        },\n        {\n          \"sampler\": 13,\n          \"target\": {\n            \"node\": 7,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 14,\n          \"target\": {\n            \"node\": 9,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 15,\n          \"target\": {\n            \"node\": 10,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 16,\n          \"target\": {\n            \"node\": 11,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 17,\n          \"target\": {\n            \"node\": 12,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 18,\n          \"target\": {\n            \"node\": 15,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 19,\n          \"target\": {\n            \"node\": 16,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 20,\n          \"target\": {\n            \"node\": 17,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 21,\n          \"target\": {\n            \"node\": 18,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 22,\n          \"target\": {\n            \"node\": 21,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 23,\n          \"target\": {\n            \"node\": 23,\n            \"path\": \"translation\"\n          }\n        },\n        {\n          \"sampler\": 24,\n          \"target\": {\n            \"node\": 23,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 25,\n          \"target\": {\n            \"node\": 24,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 26,\n          \"target\": {\n            \"node\": 25,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 27,\n          \"target\": {\n            \"node\": 30,\n            \"path\": \"translation\"\n          }\n        },\n        {\n          \"sampler\": 28,\n          \"target\": {\n            \"node\": 30,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 29,\n          \"target\": {\n            \"node\": 31,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 30,\n          \"target\": {\n            \"node\": 32,\n            \"path\": \"rotation\"\n          }\n        }\n      ],\n      \"samplers\": [\n        {\n          \"input\": 64,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 65\n        },\n        {\n          \"input\": 64,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 66\n        },\n        {\n          \"input\": 64,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 67\n        },\n        {\n          \"input\": 64,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 68\n        },\n        {\n          \"input\": 64,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 69\n        },\n        {\n          \"input\": 64,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 70\n        },\n        {\n          \"input\": 64,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 71\n        },\n        {\n          \"input\": 64,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 72\n        },\n        {\n          \"input\": 64,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 73\n        },\n        {\n          \"input\": 64,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 74\n        },\n        {\n          \"input\": 64,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 75\n        },\n        {\n          \"input\": 64,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 76\n        },\n        {\n          \"input\": 64,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 77\n        },\n        {\n          \"input\": 64,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 78\n        },\n        {\n          \"input\": 64,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 79\n        },\n        {\n          \"input\": 64,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 80\n        },\n        {\n          \"input\": 64,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 81\n        },\n        {\n          \"input\": 64,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 82\n        },\n        {\n          \"input\": 64,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 83\n        },\n        {\n          \"input\": 64,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 84\n        },\n        {\n          \"input\": 64,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 85\n        },\n        {\n          \"input\": 64,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 86\n        },\n        {\n          \"input\": 64,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 87\n        },\n        {\n          \"input\": 64,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 88\n        },\n        {\n          \"input\": 64,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 89\n        },\n        {\n          \"input\": 64,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 90\n        },\n        {\n          \"input\": 64,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 91\n        },\n        {\n          \"input\": 64,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 92\n        },\n        {\n          \"input\": 64,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 93\n        },\n        {\n          \"input\": 64,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 94\n        },\n        {\n          \"input\": 64,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 95\n        }\n      ]\n    },\n    {\n      \"name\": \"奔跑\",\n      \"channels\": [\n        {\n          \"sampler\": 0,\n          \"target\": {\n            \"node\": 1,\n            \"path\": \"translation\"\n          }\n        },\n        {\n          \"sampler\": 1,\n          \"target\": {\n            \"node\": 1,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 2,\n          \"target\": {\n            \"node\": 2,\n            \"path\": \"translation\"\n          }\n        },\n        {\n          \"sampler\": 3,\n          \"target\": {\n            \"node\": 2,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 4,\n          \"target\": {\n            \"node\": 3,\n            \"path\": \"translation\"\n          }\n        },\n        {\n          \"sampler\": 5,\n          \"target\": {\n            \"node\": 3,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 6,\n          \"target\": {\n            \"node\": 4,\n            \"path\": \"translation\"\n          }\n        },\n        {\n          \"sampler\": 7,\n          \"target\": {\n            \"node\": 4,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 8,\n          \"target\": {\n            \"node\": 5,\n            \"path\": \"translation\"\n          }\n        },\n        {\n          \"sampler\": 9,\n          \"target\": {\n            \"node\": 5,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 10,\n          \"target\": {\n            \"node\": 6,\n            \"path\": \"translation\"\n          }\n        },\n        {\n          \"sampler\": 11,\n          \"target\": {\n            \"node\": 6,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 12,\n          \"target\": {\n            \"node\": 7,\n            \"path\": \"translation\"\n          }\n        },\n        {\n          \"sampler\": 13,\n          \"target\": {\n            \"node\": 7,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 14,\n          \"target\": {\n            \"node\": 9,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 15,\n          \"target\": {\n            \"node\": 10,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 16,\n          \"target\": {\n            \"node\": 11,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 17,\n          \"target\": {\n            \"node\": 12,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 18,\n          \"target\": {\n            \"node\": 15,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 19,\n          \"target\": {\n            \"node\": 16,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 20,\n          \"target\": {\n            \"node\": 17,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 21,\n          \"target\": {\n            \"node\": 18,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 22,\n          \"target\": {\n            \"node\": 21,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 23,\n          \"target\": {\n            \"node\": 23,\n            \"path\": \"translation\"\n          }\n        },\n        {\n          \"sampler\": 24,\n          \"target\": {\n            \"node\": 23,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 25,\n          \"target\": {\n            \"node\": 24,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 26,\n          \"target\": {\n            \"node\": 25,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 27,\n          \"target\": {\n            \"node\": 30,\n            \"path\": \"translation\"\n          }\n        },\n        {\n          \"sampler\": 28,\n          \"target\": {\n            \"node\": 30,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 29,\n          \"target\": {\n            \"node\": 31,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 30,\n          \"target\": {\n            \"node\": 32,\n            \"path\": \"rotation\"\n          }\n        }\n      ],\n      \"samplers\": [\n        {\n          \"input\": 96,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 97\n        },\n        {\n          \"input\": 96,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 98\n        },\n        {\n          \"input\": 96,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 99\n        },\n        {\n          \"input\": 96,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 100\n        },\n        {\n          \"input\": 96,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 101\n        },\n        {\n          \"input\": 96,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 102\n        },\n        {\n          \"input\": 96,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 103\n        },\n        {\n          \"input\": 96,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 104\n        },\n        {\n          \"input\": 96,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 105\n        },\n        {\n          \"input\": 96,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 106\n        },\n        {\n          \"input\": 96,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 107\n        },\n        {\n          \"input\": 96,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 108\n        },\n        {\n          \"input\": 96,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 109\n        },\n        {\n          \"input\": 96,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 110\n        },\n        {\n          \"input\": 96,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 111\n        },\n        {\n          \"input\": 96,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 112\n        },\n        {\n          \"input\": 96,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 113\n        },\n        {\n          \"input\": 96,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 114\n        },\n        {\n          \"input\": 96,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 115\n        },\n        {\n          \"input\": 96,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 116\n        },\n        {\n          \"input\": 96,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 117\n        },\n        {\n          \"input\": 96,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 118\n        },\n        {\n          \"input\": 96,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 119\n        },\n        {\n          \"input\": 96,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 120\n        },\n        {\n          \"input\": 96,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 121\n        },\n        {\n          \"input\": 96,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 122\n        },\n        {\n          \"input\": 96,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 123\n        },\n        {\n          \"input\": 96,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 124\n        },\n        {\n          \"input\": 96,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 125\n        },\n        {\n          \"input\": 96,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 126\n        },\n        {\n          \"input\": 96,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 127\n        }\n      ]\n    },\n    {\n      \"name\": \"招手\",\n      \"channels\": [\n        {\n          \"sampler\": 0,\n          \"target\": {\n            \"node\": 1,\n            \"path\": \"translation\"\n          }\n        },\n        {\n          \"sampler\": 1,\n          \"target\": {\n            \"node\": 1,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 2,\n          \"target\": {\n            \"node\": 2,\n            \"path\": \"translation\"\n          }\n        },\n        {\n          \"sampler\": 3,\n          \"target\": {\n            \"node\": 2,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 4,\n          \"target\": {\n            \"node\": 3,\n            \"path\": \"translation\"\n          }\n        },\n        {\n          \"sampler\": 5,\n          \"target\": {\n            \"node\": 3,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 6,\n          \"target\": {\n            \"node\": 4,\n            \"path\": \"translation\"\n          }\n        },\n        {\n          \"sampler\": 7,\n          \"target\": {\n            \"node\": 4,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 8,\n          \"target\": {\n            \"node\": 5,\n            \"path\": \"translation\"\n          }\n        },\n        {\n          \"sampler\": 9,\n          \"target\": {\n            \"node\": 5,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 10,\n          \"target\": {\n            \"node\": 6,\n            \"path\": \"translation\"\n          }\n        },\n        {\n          \"sampler\": 11,\n          \"target\": {\n            \"node\": 6,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 12,\n          \"target\": {\n            \"node\": 7,\n            \"path\": \"translation\"\n          }\n        },\n        {\n          \"sampler\": 13,\n          \"target\": {\n            \"node\": 7,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 14,\n          \"target\": {\n            \"node\": 9,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 15,\n          \"target\": {\n            \"node\": 10,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 16,\n          \"target\": {\n            \"node\": 11,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 17,\n          \"target\": {\n            \"node\": 12,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 18,\n          \"target\": {\n            \"node\": 15,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 19,\n          \"target\": {\n            \"node\": 16,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 20,\n          \"target\": {\n            \"node\": 17,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 21,\n          \"target\": {\n            \"node\": 18,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 22,\n          \"target\": {\n            \"node\": 21,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 23,\n          \"target\": {\n            \"node\": 23,\n            \"path\": \"translation\"\n          }\n        },\n        {\n          \"sampler\": 24,\n          \"target\": {\n            \"node\": 23,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 25,\n          \"target\": {\n            \"node\": 24,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 26,\n          \"target\": {\n            \"node\": 25,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 27,\n          \"target\": {\n            \"node\": 30,\n            \"path\": \"translation\"\n          }\n        },\n        {\n          \"sampler\": 28,\n          \"target\": {\n            \"node\": 30,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 29,\n          \"target\": {\n            \"node\": 31,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 30,\n          \"target\": {\n            \"node\": 32,\n            \"path\": \"rotation\"\n          }\n        }\n      ],\n      \"samplers\": [\n        {\n          \"input\": 128,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 129\n        },\n        {\n          \"input\": 128,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 130\n        },\n        {\n          \"input\": 128,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 131\n        },\n        {\n          \"input\": 128,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 132\n        },\n        {\n          \"input\": 128,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 133\n        },\n        {\n          \"input\": 128,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 134\n        },\n        {\n          \"input\": 128,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 135\n        },\n        {\n          \"input\": 128,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 136\n        },\n        {\n          \"input\": 128,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 137\n        },\n        {\n          \"input\": 128,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 138\n        },\n        {\n          \"input\": 128,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 139\n        },\n        {\n          \"input\": 128,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 140\n        },\n        {\n          \"input\": 128,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 141\n        },\n        {\n          \"input\": 128,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 142\n        },\n        {\n          \"input\": 128,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 143\n        },\n        {\n          \"input\": 128,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 144\n        },\n        {\n          \"input\": 128,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 145\n        },\n        {\n          \"input\": 128,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 146\n        },\n        {\n          \"input\": 128,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 147\n        },\n        {\n          \"input\": 128,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 148\n        },\n        {\n          \"input\": 128,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 149\n        },\n        {\n          \"input\": 128,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 150\n        },\n        {\n          \"input\": 128,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 151\n        },\n        {\n          \"input\": 128,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 152\n        },\n        {\n          \"input\": 128,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 153\n        },\n        {\n          \"input\": 128,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 154\n        },\n        {\n          \"input\": 128,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 155\n        },\n        {\n          \"input\": 128,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 156\n        },\n        {\n          \"input\": 128,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 157\n        },\n        {\n          \"input\": 128,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 158\n        },\n        {\n          \"input\": 128,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 159\n        }\n      ]\n    },\n    {\n      \"name\": \"扑到\",\n      \"channels\": [\n        {\n          \"sampler\": 0,\n          \"target\": {\n            \"node\": 1,\n            \"path\": \"translation\"\n          }\n        },\n        {\n          \"sampler\": 1,\n          \"target\": {\n            \"node\": 1,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 2,\n          \"target\": {\n            \"node\": 2,\n            \"path\": \"translation\"\n          }\n        },\n        {\n          \"sampler\": 3,\n          \"target\": {\n            \"node\": 2,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 4,\n          \"target\": {\n            \"node\": 3,\n            \"path\": \"translation\"\n          }\n        },\n        {\n          \"sampler\": 5,\n          \"target\": {\n            \"node\": 3,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 6,\n          \"target\": {\n            \"node\": 4,\n            \"path\": \"translation\"\n          }\n        },\n        {\n          \"sampler\": 7,\n          \"target\": {\n            \"node\": 4,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 8,\n          \"target\": {\n            \"node\": 5,\n            \"path\": \"translation\"\n          }\n        },\n        {\n          \"sampler\": 9,\n          \"target\": {\n            \"node\": 5,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 10,\n          \"target\": {\n            \"node\": 6,\n            \"path\": \"translation\"\n          }\n        },\n        {\n          \"sampler\": 11,\n          \"target\": {\n            \"node\": 6,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 12,\n          \"target\": {\n            \"node\": 7,\n            \"path\": \"translation\"\n          }\n        },\n        {\n          \"sampler\": 13,\n          \"target\": {\n            \"node\": 7,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 14,\n          \"target\": {\n            \"node\": 9,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 15,\n          \"target\": {\n            \"node\": 10,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 16,\n          \"target\": {\n            \"node\": 11,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 17,\n          \"target\": {\n            \"node\": 12,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 18,\n          \"target\": {\n            \"node\": 15,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 19,\n          \"target\": {\n            \"node\": 16,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 20,\n          \"target\": {\n            \"node\": 17,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 21,\n          \"target\": {\n            \"node\": 18,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 22,\n          \"target\": {\n            \"node\": 21,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 23,\n          \"target\": {\n            \"node\": 23,\n            \"path\": \"translation\"\n          }\n        },\n        {\n          \"sampler\": 24,\n          \"target\": {\n            \"node\": 23,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 25,\n          \"target\": {\n            \"node\": 24,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 26,\n          \"target\": {\n            \"node\": 25,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 27,\n          \"target\": {\n            \"node\": 30,\n            \"path\": \"translation\"\n          }\n        },\n        {\n          \"sampler\": 28,\n          \"target\": {\n            \"node\": 30,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 29,\n          \"target\": {\n            \"node\": 31,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 30,\n          \"target\": {\n            \"node\": 32,\n            \"path\": \"rotation\"\n          }\n        }\n      ],\n      \"samplers\": [\n        {\n          \"input\": 160,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 161\n        },\n        {\n          \"input\": 160,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 162\n        },\n        {\n          \"input\": 160,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 163\n        },\n        {\n          \"input\": 160,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 164\n        },\n        {\n          \"input\": 160,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 165\n        },\n        {\n          \"input\": 160,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 166\n        },\n        {\n          \"input\": 160,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 167\n        },\n        {\n          \"input\": 160,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 168\n        },\n        {\n          \"input\": 160,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 169\n        },\n        {\n          \"input\": 160,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 170\n        },\n        {\n          \"input\": 160,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 171\n        },\n        {\n          \"input\": 160,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 172\n        },\n        {\n          \"input\": 160,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 173\n        },\n        {\n          \"input\": 160,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 174\n        },\n        {\n          \"input\": 160,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 175\n        },\n        {\n          \"input\": 160,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 176\n        },\n        {\n          \"input\": 160,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 177\n        },\n        {\n          \"input\": 160,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 178\n        },\n        {\n          \"input\": 160,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 179\n        },\n        {\n          \"input\": 160,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 180\n        },\n        {\n          \"input\": 160,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 181\n        },\n        {\n          \"input\": 160,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 182\n        },\n        {\n          \"input\": 160,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 183\n        },\n        {\n          \"input\": 160,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 184\n        },\n        {\n          \"input\": 160,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 185\n        },\n        {\n          \"input\": 160,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 186\n        },\n        {\n          \"input\": 160,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 187\n        },\n        {\n          \"input\": 160,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 188\n        },\n        {\n          \"input\": 160,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 189\n        },\n        {\n          \"input\": 160,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 190\n        },\n        {\n          \"input\": 160,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 191\n        }\n      ]\n    },\n    {\n      \"name\": \"翻跟头\",\n      \"channels\": [\n        {\n          \"sampler\": 0,\n          \"target\": {\n            \"node\": 1,\n            \"path\": \"translation\"\n          }\n        },\n        {\n          \"sampler\": 1,\n          \"target\": {\n            \"node\": 1,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 2,\n          \"target\": {\n            \"node\": 2,\n            \"path\": \"translation\"\n          }\n        },\n        {\n          \"sampler\": 3,\n          \"target\": {\n            \"node\": 2,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 4,\n          \"target\": {\n            \"node\": 3,\n            \"path\": \"translation\"\n          }\n        },\n        {\n          \"sampler\": 5,\n          \"target\": {\n            \"node\": 3,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 6,\n          \"target\": {\n            \"node\": 4,\n            \"path\": \"translation\"\n          }\n        },\n        {\n          \"sampler\": 7,\n          \"target\": {\n            \"node\": 4,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 8,\n          \"target\": {\n            \"node\": 5,\n            \"path\": \"translation\"\n          }\n        },\n        {\n          \"sampler\": 9,\n          \"target\": {\n            \"node\": 5,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 10,\n          \"target\": {\n            \"node\": 6,\n            \"path\": \"translation\"\n          }\n        },\n        {\n          \"sampler\": 11,\n          \"target\": {\n            \"node\": 6,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 12,\n          \"target\": {\n            \"node\": 7,\n            \"path\": \"translation\"\n          }\n        },\n        {\n          \"sampler\": 13,\n          \"target\": {\n            \"node\": 7,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 14,\n          \"target\": {\n            \"node\": 9,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 15,\n          \"target\": {\n            \"node\": 10,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 16,\n          \"target\": {\n            \"node\": 11,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 17,\n          \"target\": {\n            \"node\": 12,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 18,\n          \"target\": {\n            \"node\": 15,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 19,\n          \"target\": {\n            \"node\": 16,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 20,\n          \"target\": {\n            \"node\": 17,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 21,\n          \"target\": {\n            \"node\": 18,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 22,\n          \"target\": {\n            \"node\": 21,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 23,\n          \"target\": {\n            \"node\": 23,\n            \"path\": \"translation\"\n          }\n        },\n        {\n          \"sampler\": 24,\n          \"target\": {\n            \"node\": 23,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 25,\n          \"target\": {\n            \"node\": 24,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 26,\n          \"target\": {\n            \"node\": 25,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 27,\n          \"target\": {\n            \"node\": 30,\n            \"path\": \"translation\"\n          }\n        },\n        {\n          \"sampler\": 28,\n          \"target\": {\n            \"node\": 30,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 29,\n          \"target\": {\n            \"node\": 31,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 30,\n          \"target\": {\n            \"node\": 32,\n            \"path\": \"rotation\"\n          }\n        }\n      ],\n      \"samplers\": [\n        {\n          \"input\": 192,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 193\n        },\n        {\n          \"input\": 192,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 194\n        },\n        {\n          \"input\": 192,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 195\n        },\n        {\n          \"input\": 192,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 196\n        },\n        {\n          \"input\": 192,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 197\n        },\n        {\n          \"input\": 192,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 198\n        },\n        {\n          \"input\": 192,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 199\n        },\n        {\n          \"input\": 192,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 200\n        },\n        {\n          \"input\": 192,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 201\n        },\n        {\n          \"input\": 192,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 202\n        },\n        {\n          \"input\": 192,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 203\n        },\n        {\n          \"input\": 192,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 204\n        },\n        {\n          \"input\": 192,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 205\n        },\n        {\n          \"input\": 192,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 206\n        },\n        {\n          \"input\": 192,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 207\n        },\n        {\n          \"input\": 192,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 208\n        },\n        {\n          \"input\": 192,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 209\n        },\n        {\n          \"input\": 192,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 210\n        },\n        {\n          \"input\": 192,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 211\n        },\n        {\n          \"input\": 192,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 212\n        },\n        {\n          \"input\": 192,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 213\n        },\n        {\n          \"input\": 192,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 214\n        },\n        {\n          \"input\": 192,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 215\n        },\n        {\n          \"input\": 192,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 216\n        },\n        {\n          \"input\": 192,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 217\n        },\n        {\n          \"input\": 192,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 218\n        },\n        {\n          \"input\": 192,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 219\n        },\n        {\n          \"input\": 192,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 220\n        },\n        {\n          \"input\": 192,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 221\n        },\n        {\n          \"input\": 192,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 222\n        },\n        {\n          \"input\": 192,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 223\n        }\n      ]\n    },\n    {\n      \"name\": \"行走\",\n      \"channels\": [\n        {\n          \"sampler\": 0,\n          \"target\": {\n            \"node\": 1,\n            \"path\": \"translation\"\n          }\n        },\n        {\n          \"sampler\": 1,\n          \"target\": {\n            \"node\": 1,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 2,\n          \"target\": {\n            \"node\": 2,\n            \"path\": \"translation\"\n          }\n        },\n        {\n          \"sampler\": 3,\n          \"target\": {\n            \"node\": 2,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 4,\n          \"target\": {\n            \"node\": 3,\n            \"path\": \"translation\"\n          }\n        },\n        {\n          \"sampler\": 5,\n          \"target\": {\n            \"node\": 3,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 6,\n          \"target\": {\n            \"node\": 4,\n            \"path\": \"translation\"\n          }\n        },\n        {\n          \"sampler\": 7,\n          \"target\": {\n            \"node\": 4,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 8,\n          \"target\": {\n            \"node\": 5,\n            \"path\": \"translation\"\n          }\n        },\n        {\n          \"sampler\": 9,\n          \"target\": {\n            \"node\": 5,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 10,\n          \"target\": {\n            \"node\": 6,\n            \"path\": \"translation\"\n          }\n        },\n        {\n          \"sampler\": 11,\n          \"target\": {\n            \"node\": 6,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 12,\n          \"target\": {\n            \"node\": 7,\n            \"path\": \"translation\"\n          }\n        },\n        {\n          \"sampler\": 13,\n          \"target\": {\n            \"node\": 7,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 14,\n          \"target\": {\n            \"node\": 9,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 15,\n          \"target\": {\n            \"node\": 10,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 16,\n          \"target\": {\n            \"node\": 11,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 17,\n          \"target\": {\n            \"node\": 12,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 18,\n          \"target\": {\n            \"node\": 15,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 19,\n          \"target\": {\n            \"node\": 16,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 20,\n          \"target\": {\n            \"node\": 17,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 21,\n          \"target\": {\n            \"node\": 18,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 22,\n          \"target\": {\n            \"node\": 21,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 23,\n          \"target\": {\n            \"node\": 23,\n            \"path\": \"translation\"\n          }\n        },\n        {\n          \"sampler\": 24,\n          \"target\": {\n            \"node\": 23,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 25,\n          \"target\": {\n            \"node\": 24,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 26,\n          \"target\": {\n            \"node\": 25,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 27,\n          \"target\": {\n            \"node\": 30,\n            \"path\": \"translation\"\n          }\n        },\n        {\n          \"sampler\": 28,\n          \"target\": {\n            \"node\": 30,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 29,\n          \"target\": {\n            \"node\": 31,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 30,\n          \"target\": {\n            \"node\": 32,\n            \"path\": \"rotation\"\n          }\n        }\n      ],\n      \"samplers\": [\n        {\n          \"input\": 224,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 225\n        },\n        {\n          \"input\": 224,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 226\n        },\n        {\n          \"input\": 224,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 227\n        },\n        {\n          \"input\": 224,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 228\n        },\n        {\n          \"input\": 224,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 229\n        },\n        {\n          \"input\": 224,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 230\n        },\n        {\n          \"input\": 224,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 231\n        },\n        {\n          \"input\": 224,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 232\n        },\n        {\n          \"input\": 224,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 233\n        },\n        {\n          \"input\": 224,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 234\n        },\n        {\n          \"input\": 224,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 235\n        },\n        {\n          \"input\": 224,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 236\n        },\n        {\n          \"input\": 224,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 237\n        },\n        {\n          \"input\": 224,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 238\n        },\n        {\n          \"input\": 224,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 239\n        },\n        {\n          \"input\": 224,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 240\n        },\n        {\n          \"input\": 224,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 241\n        },\n        {\n          \"input\": 224,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 242\n        },\n        {\n          \"input\": 224,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 243\n        },\n        {\n          \"input\": 224,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 244\n        },\n        {\n          \"input\": 224,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 245\n        },\n        {\n          \"input\": 224,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 246\n        },\n        {\n          \"input\": 224,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 247\n        },\n        {\n          \"input\": 224,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 248\n        },\n        {\n          \"input\": 224,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 249\n        },\n        {\n          \"input\": 224,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 250\n        },\n        {\n          \"input\": 224,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 251\n        },\n        {\n          \"input\": 224,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 252\n        },\n        {\n          \"input\": 224,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 253\n        },\n        {\n          \"input\": 224,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 254\n        },\n        {\n          \"input\": 224,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 255\n        }\n      ]\n    }\n  ],\n  \"asset\": {\n    \"generator\": \"FBX2glTF\",\n    \"version\": \"2.0\"\n  },\n  \"scene\": 0,\n  \"scenes\": [\n    {\n      \"name\": \"Root Scene\",\n      \"nodes\": [\n        0\n      ]\n    }\n  ],\n  \"samplers\": [\n    {}\n  ],\n  \"skins\": [\n    {\n      \"joints\": [\n        12,\n        21,\n        9,\n        7,\n        8,\n        15,\n        16,\n        18,\n        6,\n        5,\n        4,\n        3,\n        1,\n        23,\n        30,\n        32,\n        24,\n        25,\n        31,\n        10,\n        11,\n        17,\n        22\n      ],\n      \"inverseBindMatrices\": 266,\n      \"skeleton\": 1\n    }\n  ]\n}\n"
  },
  {
    "path": "examples/resources/models/gltf/UinoSpaceman/README.md",
    "content": "# UINO Spaceman\n\n## License Information\n\nDonated by UINO for glTF testing.\n"
  },
  {
    "path": "examples/resources/models/gltf/UinoSpaceman/glTF/UinoSpaceman.gltf",
    "content": "{\n  \"materials\": [\n    {\n      \"name\": \"Material__0\",\n      \"pbrMetallicRoughness\": {\n        \"baseColorTexture\": {\n          \"index\": 0,\n          \"texCoord\": 0\n        },\n        \"metallicRoughnessTexture\": {\n          \"index\": 1,\n          \"texCoord\": 0\n        },\n        \"baseColorFactor\": [\n          1.0,\n          1.0,\n          1.0,\n          1.0\n        ],\n        \"metallicFactor\": 1.0,\n        \"roughnessFactor\": 1\n      },\n      \"alphaMode\": \"OPAQUE\",\n      \"normalTexture\": {\n        \"index\": 2,\n        \"texCoord\": 0,\n        \"scale\": 3.33333325\n      }\n    },\n    {\n      \"name\": \"pasted__blinn2\",\n      \"pbrMetallicRoughness\": {\n        \"baseColorTexture\": {\n          \"index\": 3,\n          \"texCoord\": 0\n        },\n        \"metallicRoughnessTexture\": {\n          \"index\": 4,\n          \"texCoord\": 0\n        },\n        \"baseColorFactor\": [\n          1.0,\n          1.0,\n          1.0,\n          1.0\n        ],\n        \"metallicFactor\": 1.0,\n        \"roughnessFactor\": 1\n      },\n      \"alphaMode\": \"OPAQUE\",\n      \"normalTexture\": {\n        \"index\": 5,\n        \"texCoord\": 0,\n        \"scale\": 3.33333325\n      }\n    },\n    {\n      \"name\": \"blinn2\",\n      \"pbrMetallicRoughness\": {\n        \"baseColorTexture\": {\n          \"index\": 6,\n          \"texCoord\": 0\n        },\n        \"metallicRoughnessTexture\": {\n          \"index\": 7,\n          \"texCoord\": 0\n        },\n        \"baseColorFactor\": [\n          1.0,\n          1.0,\n          1.0,\n          1.0\n        ],\n        \"metallicFactor\": 1.0,\n        \"roughnessFactor\": 1\n      },\n      \"alphaMode\": \"OPAQUE\",\n      \"normalTexture\": {\n        \"index\": 8,\n        \"texCoord\": 0,\n        \"scale\": 1.00000012\n      }\n    },\n    {\n      \"name\": \"pasted__blinn3\",\n      \"pbrMetallicRoughness\": {\n        \"baseColorTexture\": {\n          \"index\": 9,\n          \"texCoord\": 0\n        },\n        \"metallicRoughnessTexture\": {\n          \"index\": 10,\n          \"texCoord\": 0\n        },\n        \"baseColorFactor\": [\n          1.0,\n          1.0,\n          1.0,\n          1.0\n        ],\n        \"metallicFactor\": 1.0,\n        \"roughnessFactor\": 1\n      },\n      \"alphaMode\": \"OPAQUE\",\n      \"normalTexture\": {\n        \"index\": 11,\n        \"texCoord\": 0,\n        \"scale\": 3.33333325\n      }\n    },\n    {\n      \"name\": \"phong2\",\n      \"pbrMetallicRoughness\": {\n        \"baseColorFactor\": [\n          1.0,\n          1.0,\n          1.0,\n          1.0\n        ],\n        \"metallicFactor\": 0.432192773,\n        \"roughnessFactor\": 1\n      },\n      \"alphaMode\": \"OPAQUE\"\n    },\n    {\n      \"name\": \"phong1\",\n      \"pbrMetallicRoughness\": {\n        \"baseColorFactor\": [\n          1.0,\n          1.0,\n          1.0,\n          1.0\n        ],\n        \"metallicFactor\": 0.432192773,\n        \"roughnessFactor\": 1\n      },\n      \"alphaMode\": \"OPAQUE\"\n    },\n    {\n      \"name\": \"14_-_Default\",\n      \"pbrMetallicRoughness\": {\n        \"baseColorFactor\": [\n          1.0,\n          0.235294119,\n          0.0,\n          1.0\n        ],\n        \"metallicFactor\": 0.099999994,\n        \"roughnessFactor\": 1\n      },\n      \"alphaMode\": \"OPAQUE\"\n    },\n    {\n      \"name\": \"13_-_Default\",\n      \"pbrMetallicRoughness\": {\n        \"baseColorFactor\": [\n          0.458823532,\n          0.458823532,\n          0.458823532,\n          1.0\n        ],\n        \"metallicFactor\": 0.099999994,\n        \"roughnessFactor\": 1\n      },\n      \"alphaMode\": \"OPAQUE\",\n      \"emissiveFactor\": [\n        0.0,\n        0.0,\n        0.0,\n        1.0\n      ]\n    }\n  ],\n  \"images\": [\n    {\n      \"uri\": \"0605F879518358A23C3A7BD61E0DCE5D.jpg\"\n    },\n    {\n      \"uri\": \"9F4C460B2286137594802E0D6DC56CCF.jpg\"\n    },\n    {\n      \"uri\": \"FFDABEEA4B7D1A4658AD85BF905A1277.jpg\"\n    },\n    {\n      \"uri\": \"1916F27F123E47B55837AE5B5168E305.jpg\"\n    },\n    {\n      \"uri\": \"77467CC5AD8C9483B1C972DACC46050C.jpg\"\n    },\n    {\n      \"uri\": \"DC2CC8C40955EA55A3EC4B751E652C87.jpg\"\n    },\n    {\n      \"uri\": \"BEE58ADC6115F4C8416BC072E498185E.jpg\"\n    },\n    {\n      \"uri\": \"8BA17DF047BB36FBCA7200AB32A67B14.jpg\"\n    },\n    {\n      \"uri\": \"9FCD436A3C76F5CE2A75D78F213B5C53.jpg\"\n    },\n    {\n      \"uri\": \"AA91BD633E318F9EEDAE9812A3A801CE.jpg\"\n    },\n    {\n      \"uri\": \"61576C484F56D84C580E9D1A44FF688F.jpg\"\n    },\n    {\n      \"uri\": \"1D8523D0BE883390D0DE359432371C62.jpg\"\n    }\n  ],\n  \"textures\": [\n    {\n      \"name\": \"smd_10.jpg\",\n      \"sampler\": 0,\n      \"source\": 0\n    },\n    {\n      \"name\": \"smd_11.jpg\",\n      \"sampler\": 0,\n      \"source\": 1\n    },\n    {\n      \"name\": \"smd_12.jpg\",\n      \"sampler\": 0,\n      \"source\": 2\n    },\n    {\n      \"name\": \"smd_1.jpg\",\n      \"sampler\": 0,\n      \"source\": 3\n    },\n    {\n      \"name\": \"smd_2.jpg\",\n      \"sampler\": 0,\n      \"source\": 4\n    },\n    {\n      \"name\": \"smd_3.jpg\",\n      \"sampler\": 0,\n      \"source\": 5\n    },\n    {\n      \"name\": \"smd_4.jpg\",\n      \"sampler\": 0,\n      \"source\": 6\n    },\n    {\n      \"name\": \"smd_5.jpg\",\n      \"sampler\": 0,\n      \"source\": 7\n    },\n    {\n      \"name\": \"smd_6.jpg\",\n      \"sampler\": 0,\n      \"source\": 8\n    },\n    {\n      \"name\": \"smd_7.jpg\",\n      \"sampler\": 0,\n      \"source\": 9\n    },\n    {\n      \"name\": \"smd_8.jpg\",\n      \"sampler\": 0,\n      \"source\": 10\n    },\n    {\n      \"name\": \"smd_9.jpg\",\n      \"sampler\": 0,\n      \"source\": 11\n    }\n  ],\n  \"meshes\": [\n    {\n      \"name\": \"pasted__head\",\n      \"primitives\": [\n        {\n          \"material\": 0,\n          \"mode\": 4,\n          \"indices\": 162,\n          \"attributes\": {\n            \"JOINTS_0\": 166,\n            \"NORMAL\": 164,\n            \"POSITION\": 163,\n            \"TEXCOORD_0\": 165,\n            \"WEIGHTS_0\": 167\n          }\n        }\n      ]\n    },\n    {\n      \"name\": \"low\",\n      \"primitives\": [\n        {\n          \"material\": 1,\n          \"mode\": 4,\n          \"indices\": 168,\n          \"attributes\": {\n            \"JOINTS_0\": 172,\n            \"NORMAL\": 170,\n            \"POSITION\": 169,\n            \"TEXCOORD_0\": 171,\n            \"WEIGHTS_0\": 173\n          }\n        },\n        {\n          \"material\": 2,\n          \"mode\": 4,\n          \"indices\": 174,\n          \"attributes\": {\n            \"JOINTS_0\": 178,\n            \"NORMAL\": 176,\n            \"POSITION\": 175,\n            \"TEXCOORD_0\": 177,\n            \"WEIGHTS_0\": 179\n          }\n        },\n        {\n          \"material\": 3,\n          \"mode\": 4,\n          \"indices\": 180,\n          \"attributes\": {\n            \"JOINTS_0\": 184,\n            \"NORMAL\": 182,\n            \"POSITION\": 181,\n            \"TEXCOORD_0\": 183,\n            \"WEIGHTS_0\": 185\n          }\n        },\n        {\n          \"material\": 4,\n          \"mode\": 4,\n          \"indices\": 186,\n          \"attributes\": {\n            \"JOINTS_0\": 190,\n            \"NORMAL\": 188,\n            \"POSITION\": 187,\n            \"TEXCOORD_0\": 189,\n            \"WEIGHTS_0\": 191\n          }\n        },\n        {\n          \"material\": 5,\n          \"mode\": 4,\n          \"indices\": 192,\n          \"attributes\": {\n            \"JOINTS_0\": 196,\n            \"NORMAL\": 194,\n            \"POSITION\": 193,\n            \"TEXCOORD_0\": 195,\n            \"WEIGHTS_0\": 197\n          }\n        }\n      ]\n    },\n    {\n      \"name\": \"Object\",\n      \"primitives\": [\n        {\n          \"material\": 6,\n          \"mode\": 4,\n          \"indices\": 198,\n          \"attributes\": {\n            \"NORMAL\": 200,\n            \"POSITION\": 199,\n            \"TEXCOORD_0\": 201\n          }\n        },\n        {\n          \"material\": 7,\n          \"mode\": 4,\n          \"indices\": 202,\n          \"attributes\": {\n            \"NORMAL\": 204,\n            \"POSITION\": 203,\n            \"TEXCOORD_0\": 205\n          }\n        }\n      ]\n    }\n  ],\n  \"buffers\": [\n    {\n      \"byteLength\": 1667988,\n      \"uri\": \"8BEF09AA5C4E08AE56A3C325C2EB3610.bin\"\n    }\n  ],\n  \"bufferViews\": [\n    {\n      \"buffer\": 0,\n      \"byteLength\": 104,\n      \"byteOffset\": 0\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 312,\n      \"byteOffset\": 104\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 416,\n      \"byteOffset\": 416\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 416,\n      \"byteOffset\": 832\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 416,\n      \"byteOffset\": 1248\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 416,\n      \"byteOffset\": 1664\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 416,\n      \"byteOffset\": 2080\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 416,\n      \"byteOffset\": 2496\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 416,\n      \"byteOffset\": 2912\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 416,\n      \"byteOffset\": 3328\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 416,\n      \"byteOffset\": 3744\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 416,\n      \"byteOffset\": 4160\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 416,\n      \"byteOffset\": 4576\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 416,\n      \"byteOffset\": 4992\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 416,\n      \"byteOffset\": 5408\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 416,\n      \"byteOffset\": 5824\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 416,\n      \"byteOffset\": 6240\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 416,\n      \"byteOffset\": 6656\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 416,\n      \"byteOffset\": 7072\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 416,\n      \"byteOffset\": 7488\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 416,\n      \"byteOffset\": 7904\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 416,\n      \"byteOffset\": 8320\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 416,\n      \"byteOffset\": 8736\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 416,\n      \"byteOffset\": 9152\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 416,\n      \"byteOffset\": 9568\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 416,\n      \"byteOffset\": 9984\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 416,\n      \"byteOffset\": 10400\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 416,\n      \"byteOffset\": 10816\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 416,\n      \"byteOffset\": 11232\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 416,\n      \"byteOffset\": 11648\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 416,\n      \"byteOffset\": 12064\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 416,\n      \"byteOffset\": 12480\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 416,\n      \"byteOffset\": 12896\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 416,\n      \"byteOffset\": 13312\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 416,\n      \"byteOffset\": 13728\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 416,\n      \"byteOffset\": 14144\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 416,\n      \"byteOffset\": 14560\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 416,\n      \"byteOffset\": 14976\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 416,\n      \"byteOffset\": 15392\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 416,\n      \"byteOffset\": 15808\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 416,\n      \"byteOffset\": 16224\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 416,\n      \"byteOffset\": 16640\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 416,\n      \"byteOffset\": 17056\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 416,\n      \"byteOffset\": 17472\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 416,\n      \"byteOffset\": 17888\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 416,\n      \"byteOffset\": 18304\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 416,\n      \"byteOffset\": 18720\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 416,\n      \"byteOffset\": 19136\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 416,\n      \"byteOffset\": 19552\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 416,\n      \"byteOffset\": 19968\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 416,\n      \"byteOffset\": 20384\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 416,\n      \"byteOffset\": 20800\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 416,\n      \"byteOffset\": 21216\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 416,\n      \"byteOffset\": 21632\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 144,\n      \"byteOffset\": 22048\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 432,\n      \"byteOffset\": 22192\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 576,\n      \"byteOffset\": 22624\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 576,\n      \"byteOffset\": 23200\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 576,\n      \"byteOffset\": 23776\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 576,\n      \"byteOffset\": 24352\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 576,\n      \"byteOffset\": 24928\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 576,\n      \"byteOffset\": 25504\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 576,\n      \"byteOffset\": 26080\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 576,\n      \"byteOffset\": 26656\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 576,\n      \"byteOffset\": 27232\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 576,\n      \"byteOffset\": 27808\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 576,\n      \"byteOffset\": 28384\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 576,\n      \"byteOffset\": 28960\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 576,\n      \"byteOffset\": 29536\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 576,\n      \"byteOffset\": 30112\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 576,\n      \"byteOffset\": 30688\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 576,\n      \"byteOffset\": 31264\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 576,\n      \"byteOffset\": 31840\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 576,\n      \"byteOffset\": 32416\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 576,\n      \"byteOffset\": 32992\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 576,\n      \"byteOffset\": 33568\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 576,\n      \"byteOffset\": 34144\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 576,\n      \"byteOffset\": 34720\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 576,\n      \"byteOffset\": 35296\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 576,\n      \"byteOffset\": 35872\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 576,\n      \"byteOffset\": 36448\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 576,\n      \"byteOffset\": 37024\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 576,\n      \"byteOffset\": 37600\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 576,\n      \"byteOffset\": 38176\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 576,\n      \"byteOffset\": 38752\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 576,\n      \"byteOffset\": 39328\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 576,\n      \"byteOffset\": 39904\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 576,\n      \"byteOffset\": 40480\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 576,\n      \"byteOffset\": 41056\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 576,\n      \"byteOffset\": 41632\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 576,\n      \"byteOffset\": 42208\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 576,\n      \"byteOffset\": 42784\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 576,\n      \"byteOffset\": 43360\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 576,\n      \"byteOffset\": 43936\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 576,\n      \"byteOffset\": 44512\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 576,\n      \"byteOffset\": 45088\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 576,\n      \"byteOffset\": 45664\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 576,\n      \"byteOffset\": 46240\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 576,\n      \"byteOffset\": 46816\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 576,\n      \"byteOffset\": 47392\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 576,\n      \"byteOffset\": 47968\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 576,\n      \"byteOffset\": 48544\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 576,\n      \"byteOffset\": 49120\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 576,\n      \"byteOffset\": 49696\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 576,\n      \"byteOffset\": 50272\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 576,\n      \"byteOffset\": 50848\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 576,\n      \"byteOffset\": 51424\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 576,\n      \"byteOffset\": 52000\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 388,\n      \"byteOffset\": 52576\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 1164,\n      \"byteOffset\": 52964\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 1552,\n      \"byteOffset\": 54128\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 1552,\n      \"byteOffset\": 55680\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 1552,\n      \"byteOffset\": 57232\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 1552,\n      \"byteOffset\": 58784\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 1552,\n      \"byteOffset\": 60336\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 1552,\n      \"byteOffset\": 61888\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 1552,\n      \"byteOffset\": 63440\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 1552,\n      \"byteOffset\": 64992\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 1552,\n      \"byteOffset\": 66544\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 1552,\n      \"byteOffset\": 68096\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 1552,\n      \"byteOffset\": 69648\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 1552,\n      \"byteOffset\": 71200\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 1552,\n      \"byteOffset\": 72752\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 1552,\n      \"byteOffset\": 74304\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 1552,\n      \"byteOffset\": 75856\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 1552,\n      \"byteOffset\": 77408\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 1552,\n      \"byteOffset\": 78960\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 1552,\n      \"byteOffset\": 80512\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 1552,\n      \"byteOffset\": 82064\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 1552,\n      \"byteOffset\": 83616\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 1552,\n      \"byteOffset\": 85168\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 1552,\n      \"byteOffset\": 86720\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 1552,\n      \"byteOffset\": 88272\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 1552,\n      \"byteOffset\": 89824\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 1552,\n      \"byteOffset\": 91376\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 1552,\n      \"byteOffset\": 92928\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 1552,\n      \"byteOffset\": 94480\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 1552,\n      \"byteOffset\": 96032\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 1552,\n      \"byteOffset\": 97584\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 1552,\n      \"byteOffset\": 99136\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 1552,\n      \"byteOffset\": 100688\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 1552,\n      \"byteOffset\": 102240\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 1552,\n      \"byteOffset\": 103792\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 1552,\n      \"byteOffset\": 105344\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 1552,\n      \"byteOffset\": 106896\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 1552,\n      \"byteOffset\": 108448\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 1552,\n      \"byteOffset\": 110000\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 1552,\n      \"byteOffset\": 111552\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 1552,\n      \"byteOffset\": 113104\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 1552,\n      \"byteOffset\": 114656\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 1552,\n      \"byteOffset\": 116208\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 1552,\n      \"byteOffset\": 117760\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 1552,\n      \"byteOffset\": 119312\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 1552,\n      \"byteOffset\": 120864\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 1552,\n      \"byteOffset\": 122416\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 1552,\n      \"byteOffset\": 123968\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 1552,\n      \"byteOffset\": 125520\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 1552,\n      \"byteOffset\": 127072\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 1552,\n      \"byteOffset\": 128624\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 1552,\n      \"byteOffset\": 130176\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 1552,\n      \"byteOffset\": 131728\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 1552,\n      \"byteOffset\": 133280\n    },\n    {\n      \"buffer\": 0,\n      \"target\": 34963,\n      \"byteLength\": 33168,\n      \"byteOffset\": 134832\n    },\n    {\n      \"buffer\": 0,\n      \"target\": 34962,\n      \"byteLength\": 48096,\n      \"byteOffset\": 168000\n    },\n    {\n      \"buffer\": 0,\n      \"target\": 34962,\n      \"byteLength\": 48096,\n      \"byteOffset\": 216096\n    },\n    {\n      \"buffer\": 0,\n      \"target\": 34962,\n      \"byteLength\": 32064,\n      \"byteOffset\": 264192\n    },\n    {\n      \"buffer\": 0,\n      \"target\": 34962,\n      \"byteLength\": 32064,\n      \"byteOffset\": 296256\n    },\n    {\n      \"buffer\": 0,\n      \"target\": 34962,\n      \"byteLength\": 64128,\n      \"byteOffset\": 328320\n    },\n    {\n      \"buffer\": 0,\n      \"target\": 34963,\n      \"byteLength\": 84480,\n      \"byteOffset\": 392448\n    },\n    {\n      \"buffer\": 0,\n      \"target\": 34962,\n      \"byteLength\": 159588,\n      \"byteOffset\": 476928\n    },\n    {\n      \"buffer\": 0,\n      \"target\": 34962,\n      \"byteLength\": 159588,\n      \"byteOffset\": 636516\n    },\n    {\n      \"buffer\": 0,\n      \"target\": 34962,\n      \"byteLength\": 106392,\n      \"byteOffset\": 796104\n    },\n    {\n      \"buffer\": 0,\n      \"target\": 34962,\n      \"byteLength\": 106392,\n      \"byteOffset\": 902496\n    },\n    {\n      \"buffer\": 0,\n      \"target\": 34962,\n      \"byteLength\": 212784,\n      \"byteOffset\": 1008888\n    },\n    {\n      \"buffer\": 0,\n      \"target\": 34963,\n      \"byteLength\": 42408,\n      \"byteOffset\": 1221672\n    },\n    {\n      \"buffer\": 0,\n      \"target\": 34962,\n      \"byteLength\": 52584,\n      \"byteOffset\": 1264080\n    },\n    {\n      \"buffer\": 0,\n      \"target\": 34962,\n      \"byteLength\": 52584,\n      \"byteOffset\": 1316664\n    },\n    {\n      \"buffer\": 0,\n      \"target\": 34962,\n      \"byteLength\": 35056,\n      \"byteOffset\": 1369248\n    },\n    {\n      \"buffer\": 0,\n      \"target\": 34962,\n      \"byteLength\": 35056,\n      \"byteOffset\": 1404304\n    },\n    {\n      \"buffer\": 0,\n      \"target\": 34962,\n      \"byteLength\": 70112,\n      \"byteOffset\": 1439360\n    },\n    {\n      \"buffer\": 0,\n      \"target\": 34963,\n      \"byteLength\": 9252,\n      \"byteOffset\": 1509472\n    },\n    {\n      \"buffer\": 0,\n      \"target\": 34962,\n      \"byteLength\": 21264,\n      \"byteOffset\": 1518724\n    },\n    {\n      \"buffer\": 0,\n      \"target\": 34962,\n      \"byteLength\": 21264,\n      \"byteOffset\": 1539988\n    },\n    {\n      \"buffer\": 0,\n      \"target\": 34962,\n      \"byteLength\": 14176,\n      \"byteOffset\": 1561252\n    },\n    {\n      \"buffer\": 0,\n      \"target\": 34962,\n      \"byteLength\": 14176,\n      \"byteOffset\": 1575428\n    },\n    {\n      \"buffer\": 0,\n      \"target\": 34962,\n      \"byteLength\": 28352,\n      \"byteOffset\": 1589604\n    },\n    {\n      \"buffer\": 0,\n      \"target\": 34963,\n      \"byteLength\": 1056,\n      \"byteOffset\": 1617956\n    },\n    {\n      \"buffer\": 0,\n      \"target\": 34962,\n      \"byteLength\": 2352,\n      \"byteOffset\": 1619012\n    },\n    {\n      \"buffer\": 0,\n      \"target\": 34962,\n      \"byteLength\": 2352,\n      \"byteOffset\": 1621364\n    },\n    {\n      \"buffer\": 0,\n      \"target\": 34962,\n      \"byteLength\": 1568,\n      \"byteOffset\": 1623716\n    },\n    {\n      \"buffer\": 0,\n      \"target\": 34962,\n      \"byteLength\": 1568,\n      \"byteOffset\": 1625284\n    },\n    {\n      \"buffer\": 0,\n      \"target\": 34962,\n      \"byteLength\": 3136,\n      \"byteOffset\": 1626852\n    },\n    {\n      \"buffer\": 0,\n      \"target\": 34963,\n      \"byteLength\": 1440,\n      \"byteOffset\": 1629988\n    },\n    {\n      \"buffer\": 0,\n      \"target\": 34962,\n      \"byteLength\": 3432,\n      \"byteOffset\": 1631428\n    },\n    {\n      \"buffer\": 0,\n      \"target\": 34962,\n      \"byteLength\": 3432,\n      \"byteOffset\": 1634860\n    },\n    {\n      \"buffer\": 0,\n      \"target\": 34962,\n      \"byteLength\": 2288,\n      \"byteOffset\": 1638292\n    },\n    {\n      \"buffer\": 0,\n      \"target\": 34962,\n      \"byteLength\": 2288,\n      \"byteOffset\": 1640580\n    },\n    {\n      \"buffer\": 0,\n      \"target\": 34962,\n      \"byteLength\": 4576,\n      \"byteOffset\": 1642868\n    },\n    {\n      \"buffer\": 0,\n      \"target\": 34963,\n      \"byteLength\": 1056,\n      \"byteOffset\": 1647444\n    },\n    {\n      \"buffer\": 0,\n      \"target\": 34962,\n      \"byteLength\": 2352,\n      \"byteOffset\": 1648500\n    },\n    {\n      \"buffer\": 0,\n      \"target\": 34962,\n      \"byteLength\": 2352,\n      \"byteOffset\": 1650852\n    },\n    {\n      \"buffer\": 0,\n      \"target\": 34962,\n      \"byteLength\": 1568,\n      \"byteOffset\": 1653204\n    },\n    {\n      \"buffer\": 0,\n      \"target\": 34963,\n      \"byteLength\": 1440,\n      \"byteOffset\": 1654772\n    },\n    {\n      \"buffer\": 0,\n      \"target\": 34962,\n      \"byteLength\": 3072,\n      \"byteOffset\": 1656212\n    },\n    {\n      \"buffer\": 0,\n      \"target\": 34962,\n      \"byteLength\": 3072,\n      \"byteOffset\": 1659284\n    },\n    {\n      \"buffer\": 0,\n      \"target\": 34962,\n      \"byteLength\": 2048,\n      \"byteOffset\": 1662356\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 256,\n      \"byteOffset\": 1664404\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 3328,\n      \"byteOffset\": 1664660\n    }\n  ],\n  \"accessors\": [\n    {\n      \"componentType\": 5126,\n      \"type\": \"SCALAR\",\n      \"bufferView\": 0,\n      \"byteOffset\": 0,\n      \"count\": 26,\n      \"min\": [\n        0.0\n      ],\n      \"max\": [\n        1.04166662693024\n      ]\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC3\",\n      \"bufferView\": 1,\n      \"byteOffset\": 0,\n      \"count\": 26\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 2,\n      \"byteOffset\": 0,\n      \"count\": 26\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 3,\n      \"byteOffset\": 0,\n      \"count\": 26\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 4,\n      \"byteOffset\": 0,\n      \"count\": 26\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 5,\n      \"byteOffset\": 0,\n      \"count\": 26\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 6,\n      \"byteOffset\": 0,\n      \"count\": 26\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 7,\n      \"byteOffset\": 0,\n      \"count\": 26\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 8,\n      \"byteOffset\": 0,\n      \"count\": 26\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 9,\n      \"byteOffset\": 0,\n      \"count\": 26\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 10,\n      \"byteOffset\": 0,\n      \"count\": 26\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 11,\n      \"byteOffset\": 0,\n      \"count\": 26\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 12,\n      \"byteOffset\": 0,\n      \"count\": 26\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 13,\n      \"byteOffset\": 0,\n      \"count\": 26\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 14,\n      \"byteOffset\": 0,\n      \"count\": 26\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 15,\n      \"byteOffset\": 0,\n      \"count\": 26\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 16,\n      \"byteOffset\": 0,\n      \"count\": 26\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 17,\n      \"byteOffset\": 0,\n      \"count\": 26\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 18,\n      \"byteOffset\": 0,\n      \"count\": 26\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 19,\n      \"byteOffset\": 0,\n      \"count\": 26\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 20,\n      \"byteOffset\": 0,\n      \"count\": 26\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 21,\n      \"byteOffset\": 0,\n      \"count\": 26\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 22,\n      \"byteOffset\": 0,\n      \"count\": 26\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 23,\n      \"byteOffset\": 0,\n      \"count\": 26\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 24,\n      \"byteOffset\": 0,\n      \"count\": 26\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 25,\n      \"byteOffset\": 0,\n      \"count\": 26\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 26,\n      \"byteOffset\": 0,\n      \"count\": 26\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 27,\n      \"byteOffset\": 0,\n      \"count\": 26\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 28,\n      \"byteOffset\": 0,\n      \"count\": 26\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 29,\n      \"byteOffset\": 0,\n      \"count\": 26\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 30,\n      \"byteOffset\": 0,\n      \"count\": 26\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 31,\n      \"byteOffset\": 0,\n      \"count\": 26\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 32,\n      \"byteOffset\": 0,\n      \"count\": 26\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 33,\n      \"byteOffset\": 0,\n      \"count\": 26\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 34,\n      \"byteOffset\": 0,\n      \"count\": 26\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 35,\n      \"byteOffset\": 0,\n      \"count\": 26\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 36,\n      \"byteOffset\": 0,\n      \"count\": 26\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 37,\n      \"byteOffset\": 0,\n      \"count\": 26\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 38,\n      \"byteOffset\": 0,\n      \"count\": 26\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 39,\n      \"byteOffset\": 0,\n      \"count\": 26\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 40,\n      \"byteOffset\": 0,\n      \"count\": 26\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 41,\n      \"byteOffset\": 0,\n      \"count\": 26\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 42,\n      \"byteOffset\": 0,\n      \"count\": 26\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 43,\n      \"byteOffset\": 0,\n      \"count\": 26\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 44,\n      \"byteOffset\": 0,\n      \"count\": 26\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 45,\n      \"byteOffset\": 0,\n      \"count\": 26\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 46,\n      \"byteOffset\": 0,\n      \"count\": 26\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 47,\n      \"byteOffset\": 0,\n      \"count\": 26\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 48,\n      \"byteOffset\": 0,\n      \"count\": 26\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 49,\n      \"byteOffset\": 0,\n      \"count\": 26\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 50,\n      \"byteOffset\": 0,\n      \"count\": 26\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 51,\n      \"byteOffset\": 0,\n      \"count\": 26\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 52,\n      \"byteOffset\": 0,\n      \"count\": 26\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 53,\n      \"byteOffset\": 0,\n      \"count\": 26\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"SCALAR\",\n      \"bufferView\": 54,\n      \"byteOffset\": 0,\n      \"count\": 36,\n      \"min\": [\n        -0.02500319480896\n      ],\n      \"max\": [\n        1.43333005905151\n      ]\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC3\",\n      \"bufferView\": 55,\n      \"byteOffset\": 0,\n      \"count\": 36\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 56,\n      \"byteOffset\": 0,\n      \"count\": 36\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 57,\n      \"byteOffset\": 0,\n      \"count\": 36\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 58,\n      \"byteOffset\": 0,\n      \"count\": 36\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 59,\n      \"byteOffset\": 0,\n      \"count\": 36\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 60,\n      \"byteOffset\": 0,\n      \"count\": 36\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 61,\n      \"byteOffset\": 0,\n      \"count\": 36\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 62,\n      \"byteOffset\": 0,\n      \"count\": 36\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 63,\n      \"byteOffset\": 0,\n      \"count\": 36\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 64,\n      \"byteOffset\": 0,\n      \"count\": 36\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 65,\n      \"byteOffset\": 0,\n      \"count\": 36\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 66,\n      \"byteOffset\": 0,\n      \"count\": 36\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 67,\n      \"byteOffset\": 0,\n      \"count\": 36\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 68,\n      \"byteOffset\": 0,\n      \"count\": 36\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 69,\n      \"byteOffset\": 0,\n      \"count\": 36\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 70,\n      \"byteOffset\": 0,\n      \"count\": 36\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 71,\n      \"byteOffset\": 0,\n      \"count\": 36\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 72,\n      \"byteOffset\": 0,\n      \"count\": 36\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 73,\n      \"byteOffset\": 0,\n      \"count\": 36\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 74,\n      \"byteOffset\": 0,\n      \"count\": 36\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 75,\n      \"byteOffset\": 0,\n      \"count\": 36\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 76,\n      \"byteOffset\": 0,\n      \"count\": 36\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 77,\n      \"byteOffset\": 0,\n      \"count\": 36\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 78,\n      \"byteOffset\": 0,\n      \"count\": 36\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 79,\n      \"byteOffset\": 0,\n      \"count\": 36\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 80,\n      \"byteOffset\": 0,\n      \"count\": 36\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 81,\n      \"byteOffset\": 0,\n      \"count\": 36\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 82,\n      \"byteOffset\": 0,\n      \"count\": 36\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 83,\n      \"byteOffset\": 0,\n      \"count\": 36\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 84,\n      \"byteOffset\": 0,\n      \"count\": 36\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 85,\n      \"byteOffset\": 0,\n      \"count\": 36\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 86,\n      \"byteOffset\": 0,\n      \"count\": 36\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 87,\n      \"byteOffset\": 0,\n      \"count\": 36\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 88,\n      \"byteOffset\": 0,\n      \"count\": 36\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 89,\n      \"byteOffset\": 0,\n      \"count\": 36\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 90,\n      \"byteOffset\": 0,\n      \"count\": 36\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 91,\n      \"byteOffset\": 0,\n      \"count\": 36\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 92,\n      \"byteOffset\": 0,\n      \"count\": 36\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 93,\n      \"byteOffset\": 0,\n      \"count\": 36\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 94,\n      \"byteOffset\": 0,\n      \"count\": 36\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 95,\n      \"byteOffset\": 0,\n      \"count\": 36\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 96,\n      \"byteOffset\": 0,\n      \"count\": 36\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 97,\n      \"byteOffset\": 0,\n      \"count\": 36\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 98,\n      \"byteOffset\": 0,\n      \"count\": 36\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 99,\n      \"byteOffset\": 0,\n      \"count\": 36\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 100,\n      \"byteOffset\": 0,\n      \"count\": 36\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 101,\n      \"byteOffset\": 0,\n      \"count\": 36\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 102,\n      \"byteOffset\": 0,\n      \"count\": 36\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 103,\n      \"byteOffset\": 0,\n      \"count\": 36\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 104,\n      \"byteOffset\": 0,\n      \"count\": 36\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 105,\n      \"byteOffset\": 0,\n      \"count\": 36\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 106,\n      \"byteOffset\": 0,\n      \"count\": 36\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 107,\n      \"byteOffset\": 0,\n      \"count\": 36\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"SCALAR\",\n      \"bufferView\": 108,\n      \"byteOffset\": 0,\n      \"count\": 97,\n      \"min\": [\n        -0.00833368301391602\n      ],\n      \"max\": [\n        3.99166679382324\n      ]\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC3\",\n      \"bufferView\": 109,\n      \"byteOffset\": 0,\n      \"count\": 97\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 110,\n      \"byteOffset\": 0,\n      \"count\": 97\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 111,\n      \"byteOffset\": 0,\n      \"count\": 97\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 112,\n      \"byteOffset\": 0,\n      \"count\": 97\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 113,\n      \"byteOffset\": 0,\n      \"count\": 97\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 114,\n      \"byteOffset\": 0,\n      \"count\": 97\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 115,\n      \"byteOffset\": 0,\n      \"count\": 97\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 116,\n      \"byteOffset\": 0,\n      \"count\": 97\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 117,\n      \"byteOffset\": 0,\n      \"count\": 97\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 118,\n      \"byteOffset\": 0,\n      \"count\": 97\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 119,\n      \"byteOffset\": 0,\n      \"count\": 97\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 120,\n      \"byteOffset\": 0,\n      \"count\": 97\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 121,\n      \"byteOffset\": 0,\n      \"count\": 97\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 122,\n      \"byteOffset\": 0,\n      \"count\": 97\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 123,\n      \"byteOffset\": 0,\n      \"count\": 97\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 124,\n      \"byteOffset\": 0,\n      \"count\": 97\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 125,\n      \"byteOffset\": 0,\n      \"count\": 97\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 126,\n      \"byteOffset\": 0,\n      \"count\": 97\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 127,\n      \"byteOffset\": 0,\n      \"count\": 97\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 128,\n      \"byteOffset\": 0,\n      \"count\": 97\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 129,\n      \"byteOffset\": 0,\n      \"count\": 97\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 130,\n      \"byteOffset\": 0,\n      \"count\": 97\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 131,\n      \"byteOffset\": 0,\n      \"count\": 97\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 132,\n      \"byteOffset\": 0,\n      \"count\": 97\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 133,\n      \"byteOffset\": 0,\n      \"count\": 97\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 134,\n      \"byteOffset\": 0,\n      \"count\": 97\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 135,\n      \"byteOffset\": 0,\n      \"count\": 97\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 136,\n      \"byteOffset\": 0,\n      \"count\": 97\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 137,\n      \"byteOffset\": 0,\n      \"count\": 97\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 138,\n      \"byteOffset\": 0,\n      \"count\": 97\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 139,\n      \"byteOffset\": 0,\n      \"count\": 97\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 140,\n      \"byteOffset\": 0,\n      \"count\": 97\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 141,\n      \"byteOffset\": 0,\n      \"count\": 97\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 142,\n      \"byteOffset\": 0,\n      \"count\": 97\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 143,\n      \"byteOffset\": 0,\n      \"count\": 97\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 144,\n      \"byteOffset\": 0,\n      \"count\": 97\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 145,\n      \"byteOffset\": 0,\n      \"count\": 97\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 146,\n      \"byteOffset\": 0,\n      \"count\": 97\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 147,\n      \"byteOffset\": 0,\n      \"count\": 97\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 148,\n      \"byteOffset\": 0,\n      \"count\": 97\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 149,\n      \"byteOffset\": 0,\n      \"count\": 97\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 150,\n      \"byteOffset\": 0,\n      \"count\": 97\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 151,\n      \"byteOffset\": 0,\n      \"count\": 97\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 152,\n      \"byteOffset\": 0,\n      \"count\": 97\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 153,\n      \"byteOffset\": 0,\n      \"count\": 97\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 154,\n      \"byteOffset\": 0,\n      \"count\": 97\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 155,\n      \"byteOffset\": 0,\n      \"count\": 97\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 156,\n      \"byteOffset\": 0,\n      \"count\": 97\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 157,\n      \"byteOffset\": 0,\n      \"count\": 97\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 158,\n      \"byteOffset\": 0,\n      \"count\": 97\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 159,\n      \"byteOffset\": 0,\n      \"count\": 97\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 160,\n      \"byteOffset\": 0,\n      \"count\": 97\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 161,\n      \"byteOffset\": 0,\n      \"count\": 97\n    },\n    {\n      \"componentType\": 5123,\n      \"type\": \"SCALAR\",\n      \"bufferView\": 162,\n      \"byteOffset\": 0,\n      \"count\": 16584\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC3\",\n      \"bufferView\": 163,\n      \"byteOffset\": 0,\n      \"count\": 4008,\n      \"min\": [\n        -31.4961032867432,\n        84.049919128418,\n        -25.3357048034668\n      ],\n      \"max\": [\n        29.3061943054199,\n        151.543701171875,\n        29.5733547210693\n      ]\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC3\",\n      \"bufferView\": 164,\n      \"byteOffset\": 0,\n      \"count\": 4008\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC2\",\n      \"bufferView\": 165,\n      \"byteOffset\": 0,\n      \"count\": 4008\n    },\n    {\n      \"componentType\": 5123,\n      \"type\": \"VEC4\",\n      \"bufferView\": 166,\n      \"byteOffset\": 0,\n      \"count\": 4008\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 167,\n      \"byteOffset\": 0,\n      \"count\": 4008\n    },\n    {\n      \"componentType\": 5123,\n      \"type\": \"SCALAR\",\n      \"bufferView\": 168,\n      \"byteOffset\": 0,\n      \"count\": 42240\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC3\",\n      \"bufferView\": 169,\n      \"byteOffset\": 0,\n      \"count\": 13299,\n      \"min\": [\n        -109.253967285156,\n        -50.0867004394531,\n        -53.347770690918\n      ],\n      \"max\": [\n        109.253967285156,\n        102.821922302246,\n        45.3497695922852\n      ]\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC3\",\n      \"bufferView\": 170,\n      \"byteOffset\": 0,\n      \"count\": 13299\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC2\",\n      \"bufferView\": 171,\n      \"byteOffset\": 0,\n      \"count\": 13299\n    },\n    {\n      \"componentType\": 5123,\n      \"type\": \"VEC4\",\n      \"bufferView\": 172,\n      \"byteOffset\": 0,\n      \"count\": 13299\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 173,\n      \"byteOffset\": 0,\n      \"count\": 13299\n    },\n    {\n      \"componentType\": 5123,\n      \"type\": \"SCALAR\",\n      \"bufferView\": 174,\n      \"byteOffset\": 0,\n      \"count\": 21204\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC3\",\n      \"bufferView\": 175,\n      \"byteOffset\": 0,\n      \"count\": 4382,\n      \"min\": [\n        -109.888336181641,\n        -172.572296142578,\n        -26.7215366363525\n      ],\n      \"max\": [\n        109.888336181641,\n        91.2343368530273,\n        24.635103225708\n      ]\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC3\",\n      \"bufferView\": 176,\n      \"byteOffset\": 0,\n      \"count\": 4382\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC2\",\n      \"bufferView\": 177,\n      \"byteOffset\": 0,\n      \"count\": 4382\n    },\n    {\n      \"componentType\": 5123,\n      \"type\": \"VEC4\",\n      \"bufferView\": 178,\n      \"byteOffset\": 0,\n      \"count\": 4382\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 179,\n      \"byteOffset\": 0,\n      \"count\": 4382\n    },\n    {\n      \"componentType\": 5123,\n      \"type\": \"SCALAR\",\n      \"bufferView\": 180,\n      \"byteOffset\": 0,\n      \"count\": 4626\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC3\",\n      \"bufferView\": 181,\n      \"byteOffset\": 0,\n      \"count\": 1772,\n      \"min\": [\n        -47.3228912353516,\n        -20.2738227844238,\n        -57.0333862304688\n      ],\n      \"max\": [\n        47.3228912353516,\n        107.502044677734,\n        -15.4966373443604\n      ]\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC3\",\n      \"bufferView\": 182,\n      \"byteOffset\": 0,\n      \"count\": 1772\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC2\",\n      \"bufferView\": 183,\n      \"byteOffset\": 0,\n      \"count\": 1772\n    },\n    {\n      \"componentType\": 5123,\n      \"type\": \"VEC4\",\n      \"bufferView\": 184,\n      \"byteOffset\": 0,\n      \"count\": 1772\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 185,\n      \"byteOffset\": 0,\n      \"count\": 1772\n    },\n    {\n      \"componentType\": 5123,\n      \"type\": \"SCALAR\",\n      \"bufferView\": 186,\n      \"byteOffset\": 0,\n      \"count\": 528\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC3\",\n      \"bufferView\": 187,\n      \"byteOffset\": 0,\n      \"count\": 196,\n      \"min\": [\n        -9.11502838134766,\n        48.9572410583496,\n        -52.668571472168\n      ],\n      \"max\": [\n        9.20424652099609,\n        54.1539268493652,\n        -51.3487129211426\n      ]\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC3\",\n      \"bufferView\": 188,\n      \"byteOffset\": 0,\n      \"count\": 196\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC2\",\n      \"bufferView\": 189,\n      \"byteOffset\": 0,\n      \"count\": 196\n    },\n    {\n      \"componentType\": 5123,\n      \"type\": \"VEC4\",\n      \"bufferView\": 190,\n      \"byteOffset\": 0,\n      \"count\": 196\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 191,\n      \"byteOffset\": 0,\n      \"count\": 196\n    },\n    {\n      \"componentType\": 5123,\n      \"type\": \"SCALAR\",\n      \"bufferView\": 192,\n      \"byteOffset\": 0,\n      \"count\": 720\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC3\",\n      \"bufferView\": 193,\n      \"byteOffset\": 0,\n      \"count\": 286,\n      \"min\": [\n        -10.0765247344971,\n        29.3010082244873,\n        -52.668571472168\n      ],\n      \"max\": [\n        10.0765266418457,\n        49.4540672302246,\n        -51.3487091064453\n      ]\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC3\",\n      \"bufferView\": 194,\n      \"byteOffset\": 0,\n      \"count\": 286\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC2\",\n      \"bufferView\": 195,\n      \"byteOffset\": 0,\n      \"count\": 286\n    },\n    {\n      \"componentType\": 5123,\n      \"type\": \"VEC4\",\n      \"bufferView\": 196,\n      \"byteOffset\": 0,\n      \"count\": 286\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC4\",\n      \"bufferView\": 197,\n      \"byteOffset\": 0,\n      \"count\": 286\n    },\n    {\n      \"componentType\": 5123,\n      \"type\": \"SCALAR\",\n      \"bufferView\": 198,\n      \"byteOffset\": 0,\n      \"count\": 528\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC3\",\n      \"bufferView\": 199,\n      \"byteOffset\": 0,\n      \"count\": 196,\n      \"min\": [\n        -10.1690511703491,\n        67.3666610717773,\n        -54.4268188476563\n      ],\n      \"max\": [\n        8.18783092498779,\n        72.8659057617188,\n        -50.9455146789551\n      ]\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC3\",\n      \"bufferView\": 200,\n      \"byteOffset\": 0,\n      \"count\": 196\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC2\",\n      \"bufferView\": 201,\n      \"byteOffset\": 0,\n      \"count\": 196\n    },\n    {\n      \"componentType\": 5123,\n      \"type\": \"SCALAR\",\n      \"bufferView\": 202,\n      \"byteOffset\": 0,\n      \"count\": 720\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC3\",\n      \"bufferView\": 203,\n      \"byteOffset\": 0,\n      \"count\": 256,\n      \"min\": [\n        -11.4010210037231,\n        47.8448944091797,\n        -54.7154273986816\n      ],\n      \"max\": [\n        8.78729820251465,\n        68.0142364501953,\n        -51.098316192627\n      ]\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC3\",\n      \"bufferView\": 204,\n      \"byteOffset\": 0,\n      \"count\": 256\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"VEC2\",\n      \"bufferView\": 205,\n      \"byteOffset\": 0,\n      \"count\": 256\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"MAT4\",\n      \"bufferView\": 206,\n      \"byteOffset\": 0,\n      \"count\": 4\n    },\n    {\n      \"componentType\": 5126,\n      \"type\": \"MAT4\",\n      \"bufferView\": 207,\n      \"byteOffset\": 0,\n      \"count\": 52\n    }\n  ],\n  \"nodes\": [\n    {\n      \"name\": \"RootNode\",\n      \"translation\": [\n        0.0,\n        0.0,\n        0.0\n      ],\n      \"rotation\": [\n        0.0,\n        0.0,\n        0.0,\n        1.0\n      ],\n      \"scale\": [\n        1.0,\n        1.0,\n        1.0\n      ],\n      \"children\": [\n        1,\n        2,\n        3,\n        4,\n        5,\n        71,\n        72\n      ]\n    },\n    {\n      \"name\": \"cryExporterSettingsNode\",\n      \"translation\": [\n        0.0,\n        0.0,\n        0.0\n      ],\n      \"rotation\": [\n        -0.70710676908493,\n        0.0,\n        0.0,\n        0.70710676908493\n      ],\n      \"scale\": [\n        0.00100000004749745,\n        0.00100000004749745,\n        0.00100000004749745\n      ]\n    },\n    {\n      \"name\": \"cryAnimationExportNode\",\n      \"translation\": [\n        0.0,\n        0.0,\n        0.0\n      ],\n      \"rotation\": [\n        -0.70710676908493,\n        0.0,\n        0.0,\n        0.70710676908493\n      ],\n      \"scale\": [\n        0.00100000004749745,\n        0.00100000004749745,\n        0.00100000004749745\n      ]\n    },\n    {\n      \"name\": \"pasted__head\",\n      \"translation\": [\n        -0.0778043791651726,\n        1.53551316261292,\n        0.0861874967813492\n      ],\n      \"rotation\": [\n        8.14603424714733E-08,\n        0.0,\n        0.0,\n        1.0\n      ],\n      \"scale\": [\n        0.00999999977648258,\n        0.00999999977648258,\n        0.00999999977648258\n      ],\n      \"mesh\": 0,\n      \"skin\": 0\n    },\n    {\n      \"name\": \"low\",\n      \"translation\": [\n        -0.0778043791651726,\n        1.53551316261292,\n        0.0861874967813492\n      ],\n      \"rotation\": [\n        8.14603424714733E-08,\n        0.0,\n        0.0,\n        1.0\n      ],\n      \"scale\": [\n        0.00999999977648258,\n        0.00999999977648258,\n        0.00999999977648258\n      ],\n      \"mesh\": 1,\n      \"skin\": 1\n    },\n    {\n      \"name\": \"mixamorig_Hips\",\n      \"translation\": [\n        -0.0780411958694458,\n        1.55584228038788,\n        0.0741503313183784\n      ],\n      \"rotation\": [\n        0.00858990103006363,\n        0.0231941305100918,\n        -0.00999393500387669,\n        0.999644100666046\n      ],\n      \"scale\": [\n        0.00999999977648258,\n        0.0100000025704503,\n        0.0100000025704503\n      ],\n      \"children\": [\n        6,\n        60,\n        65,\n        70\n      ]\n    },\n    {\n      \"name\": \"mixamorig_Spine\",\n      \"translation\": [\n        -4.76837158203125E-06,\n        20.0980072021484,\n        -1.10401082038879\n      ],\n      \"rotation\": [\n        -0.0256792064756155,\n        0.00346903689205647,\n        -0.000803391274530441,\n        0.999663889408112\n      ],\n      \"scale\": [\n        1.0,\n        1.0,\n        1.0\n      ],\n      \"children\": [\n        7\n      ]\n    },\n    {\n      \"name\": \"mixamorig_Spine1\",\n      \"translation\": [\n        -1.9073486328125E-06,\n        23.4830932617188,\n        -3.814697265625E-06\n      ],\n      \"rotation\": [\n        0.00338568934239447,\n        0.00577971758320928,\n        0.00468070758506656,\n        0.999966621398926\n      ],\n      \"scale\": [\n        1.0,\n        1.0,\n        1.0\n      ],\n      \"children\": [\n        8\n      ]\n    },\n    {\n      \"name\": \"mixamorig_Spine2\",\n      \"translation\": [\n        0.0,\n        26.8378295898438,\n        -1.77635683940025E-15\n      ],\n      \"rotation\": [\n        0.00338569236919284,\n        0.00577974785119295,\n        0.0046807024627924,\n        0.999966621398926\n      ],\n      \"scale\": [\n        1.0,\n        1.0,\n        1.0\n      ],\n      \"children\": [\n        9,\n        12,\n        36\n      ]\n    },\n    {\n      \"name\": \"mixamorig_Neck\",\n      \"translation\": [\n        -4.76837158203125E-07,\n        30.1925048828125,\n        7.62939453125E-06\n      ],\n      \"rotation\": [\n        0.0274373479187489,\n        -0.0036887195892632,\n        -0.0106473453342915,\n        0.999559998512268\n      ],\n      \"scale\": [\n        1.0,\n        1.0,\n        1.0\n      ],\n      \"children\": [\n        10\n      ]\n    },\n    {\n      \"name\": \"mixamorig_Head\",\n      \"translation\": [\n        1.77635683940025E-15,\n        10.6904144287109,\n        1.09310865402222\n      ],\n      \"rotation\": [\n        0.0235005505383015,\n        -0.0268053039908409,\n        0.0160073470324278,\n        0.999236166477203\n      ],\n      \"scale\": [\n        1.0,\n        1.0,\n        1.0\n      ],\n      \"children\": [\n        11\n      ]\n    },\n    {\n      \"name\": \"mixamorig_HeadTop_End\",\n      \"translation\": [\n        -4.76837158203125E-07,\n        51.9999389648438,\n        5.3170690536499\n      ],\n      \"rotation\": [\n        -3.72529029846191E-09,\n        -6.11180495102559E-10,\n        2.32830671409445E-10,\n        1.0\n      ],\n      \"scale\": [\n        1.0,\n        1.0,\n        1.0\n      ]\n    },\n    {\n      \"name\": \"mixamorig_LeftShoulder\",\n      \"translation\": [\n        13.0577793121338,\n        23.2421722412109,\n        -0.3502197265625\n      ],\n      \"rotation\": [\n        0.701449275016785,\n        0.282089680433273,\n        -0.556536138057709,\n        0.344473361968994\n      ],\n      \"scale\": [\n        1.0,\n        1.0,\n        1.0\n      ],\n      \"children\": [\n        13\n      ]\n    },\n    {\n      \"name\": \"mixamorig_LeftArm\",\n      \"translation\": [\n        -9.5367431640625E-07,\n        29.6032409667969,\n        1.52587890625E-05\n      ],\n      \"rotation\": [\n        0.268739372491837,\n        -0.0745446681976318,\n        -0.0327057205140591,\n        0.959766924381256\n      ],\n      \"scale\": [\n        1.0,\n        1.0,\n        1.0\n      ],\n      \"children\": [\n        14\n      ]\n    },\n    {\n      \"name\": \"mixamorig_LeftForeArm\",\n      \"translation\": [\n        -3.814697265625E-06,\n        26.2665405273438,\n        -1.4210854715202E-14\n      ],\n      \"rotation\": [\n        0.101996399462223,\n        0.158388122916222,\n        0.258760213851929,\n        0.947392761707306\n      ],\n      \"scale\": [\n        1.0,\n        1.0,\n        1.0\n      ],\n      \"children\": [\n        15\n      ]\n    },\n    {\n      \"name\": \"mixamorig_LeftHand\",\n      \"translation\": [\n        -7.62939453125E-06,\n        44.8494415283203,\n        -2.288818359375E-05\n      ],\n      \"rotation\": [\n        -0.0773848071694374,\n        0.158544167876244,\n        0.0612231679260731,\n        0.982408821582794\n      ],\n      \"scale\": [\n        1.0,\n        1.0,\n        1.0\n      ],\n      \"children\": [\n        16,\n        20,\n        24,\n        28,\n        32\n      ]\n    },\n    {\n      \"name\": \"mixamorig_LeftHandThumb1\",\n      \"translation\": [\n        -3.60839080810547,\n        7.37313079833984,\n        2.35345458984375\n      ],\n      \"rotation\": [\n        0.276571691036224,\n        -0.0327966585755348,\n        0.15356083214283,\n        0.948077797889709\n      ],\n      \"scale\": [\n        1.0,\n        1.0,\n        1.0\n      ],\n      \"children\": [\n        17\n      ]\n    },\n    {\n      \"name\": \"mixamorig_LeftHandThumb2\",\n      \"translation\": [\n        -0.602554321289063,\n        6.804931640625,\n        -1.9073486328125E-05\n      ],\n      \"rotation\": [\n        -0.015937926247716,\n        -0.0184175167232752,\n        -0.0836632400751114,\n        0.996196389198303\n      ],\n      \"scale\": [\n        1.0,\n        1.0,\n        1.0\n      ],\n      \"children\": [\n        18\n      ]\n    },\n    {\n      \"name\": \"mixamorig_LeftHandThumb3\",\n      \"translation\": [\n        -0.769996643066406,\n        5.86551666259766,\n        -3.814697265625E-06\n      ],\n      \"rotation\": [\n        -0.00063543685246259,\n        -0.00866128411144018,\n        0.202381789684296,\n        0.979268193244934\n      ],\n      \"scale\": [\n        1.0,\n        1.0,\n        1.0\n      ],\n      \"children\": [\n        19\n      ]\n    },\n    {\n      \"name\": \"mixamorig_LeftHandThumb4\",\n      \"translation\": [\n        1.37254333496094,\n        4.82631683349609,\n        -7.62939453125E-06\n      ],\n      \"rotation\": [\n        4.84287738800049E-08,\n        1.49011611938477E-08,\n        -8.04911745792798E-16,\n        1.0\n      ],\n      \"scale\": [\n        1.0,\n        1.0,\n        1.0\n      ]\n    },\n    {\n      \"name\": \"mixamorig_LeftHandIndex1\",\n      \"translation\": [\n        -6.47254943847656,\n        23.4429702758789,\n        -0.19500732421875\n      ],\n      \"rotation\": [\n        0.341717272996902,\n        -0.00357847264967859,\n        0.0426864363253117,\n        0.938826084136963\n      ],\n      \"scale\": [\n        1.0,\n        1.0,\n        1.0\n      ],\n      \"children\": [\n        21\n      ]\n    },\n    {\n      \"name\": \"mixamorig_LeftHandIndex2\",\n      \"translation\": [\n        0.0068206787109375,\n        4.31729125976563,\n        3.814697265625E-06\n      ],\n      \"rotation\": [\n        0.658300995826721,\n        -0.00674140267074108,\n        -0.0186324138194323,\n        0.752493977546692\n      ],\n      \"scale\": [\n        1.0,\n        1.0,\n        1.0\n      ],\n      \"children\": [\n        22\n      ]\n    },\n    {\n      \"name\": \"mixamorig_LeftHandIndex3\",\n      \"translation\": [\n        -0.0999526977539063,\n        4.03782653808594,\n        1.52587890625E-05\n      ],\n      \"rotation\": [\n        5.23713310940366E-07,\n        -0.00035063482937403,\n        0.027121813967824,\n        0.999632060527802\n      ],\n      \"scale\": [\n        1.0,\n        1.0,\n        1.0\n      ],\n      \"children\": [\n        23\n      ]\n    },\n    {\n      \"name\": \"mixamorig_LeftHandIndex4\",\n      \"translation\": [\n        0.0931243896484375,\n        3.15346145629883,\n        1.52587890625E-05\n      ],\n      \"rotation\": [\n        -1.86264514923096E-09,\n        1.99493199737333E-17,\n        -3.25962923319878E-09,\n        1.0\n      ],\n      \"scale\": [\n        1.0,\n        1.0,\n        1.0\n      ]\n    },\n    {\n      \"name\": \"mixamorig_LeftHandMiddle1\",\n      \"translation\": [\n        -1.72256851196289,\n        21.9356994628906,\n        -1.29385375976563\n      ],\n      \"rotation\": [\n        0.503296911716461,\n        -0.0341310128569603,\n        0.0727194026112556,\n        0.860371530056\n      ],\n      \"scale\": [\n        1.0,\n        1.0,\n        1.0\n      ],\n      \"children\": [\n        25\n      ]\n    },\n    {\n      \"name\": \"mixamorig_LeftHandMiddle2\",\n      \"translation\": [\n        0.0718994140625,\n        5.13180541992188,\n        -3.814697265625E-06\n      ],\n      \"rotation\": [\n        0.780757069587708,\n        -0.00516836252063513,\n        -0.0142697729170322,\n        0.624650359153748\n      ],\n      \"scale\": [\n        1.0,\n        1.0,\n        1.0\n      ],\n      \"children\": [\n        26\n      ]\n    },\n    {\n      \"name\": \"mixamorig_LeftHandMiddle3\",\n      \"translation\": [\n        -0.0765838623046875,\n        5.09765625,\n        2.8421709430404E-14\n      ],\n      \"rotation\": [\n        -1.93891355593223E-06,\n        0.000325019122101367,\n        0.00812015030533075,\n        0.999966979026794\n      ],\n      \"scale\": [\n        1.0,\n        1.0,\n        1.0\n      ],\n      \"children\": [\n        27\n      ]\n    },\n    {\n      \"name\": \"mixamorig_LeftHandMiddle4\",\n      \"translation\": [\n        0.004669189453125,\n        3.86862182617188,\n        -3.0517578125E-05\n      ],\n      \"rotation\": [\n        1.49011611938477E-08,\n        1.49011594174908E-08,\n        -1.49011594174908E-08,\n        1.0\n      ],\n      \"scale\": [\n        1.0,\n        1.0,\n        1.0\n      ]\n    },\n    {\n      \"name\": \"mixamorig_LeftHandRing1\",\n      \"translation\": [\n        2.23248291015625,\n        20.6041641235352,\n        -0.98486328125\n      ],\n      \"rotation\": [\n        0.511155009269714,\n        -0.122393362224102,\n        0.0143185341730714,\n        0.850608825683594\n      ],\n      \"scale\": [\n        1.0,\n        1.0,\n        1.0\n      ],\n      \"children\": [\n        29\n      ]\n    },\n    {\n      \"name\": \"mixamorig_LeftHandRing2\",\n      \"translation\": [\n        0.0888442993164063,\n        5.16531372070313,\n        -7.62939453125E-06\n      ],\n      \"rotation\": [\n        0.79233318567276,\n        -0.00271370331756771,\n        -0.0721675083041191,\n        0.605799198150635\n      ],\n      \"scale\": [\n        1.0,\n        1.0,\n        1.0\n      ],\n      \"children\": [\n        30\n      ]\n    },\n    {\n      \"name\": \"mixamorig_LeftHandRing3\",\n      \"translation\": [\n        0.02703857421875,\n        4.86283874511719,\n        0.0\n      ],\n      \"rotation\": [\n        1.70235089171911E-05,\n        -0.00156306964345276,\n        -0.0166997294872999,\n        0.99985933303833\n      ],\n      \"scale\": [\n        1.0,\n        1.0,\n        1.0\n      ],\n      \"children\": [\n        31\n      ]\n    },\n    {\n      \"name\": \"mixamorig_LeftHandRing4\",\n      \"translation\": [\n        -0.115890502929688,\n        4.16069793701172,\n        0.0\n      ],\n      \"rotation\": [\n        -2.08166896526556E-16,\n        -1.49011629702045E-08,\n        -1.49011647465613E-08,\n        1.0\n      ],\n      \"scale\": [\n        1.0,\n        1.0,\n        1.0\n      ]\n    },\n    {\n      \"name\": \"mixamorig_LeftHandPinky1\",\n      \"translation\": [\n        5.96266937255859,\n        18.7975387573242,\n        -0.90228271484375\n      ],\n      \"rotation\": [\n        0.582997977733612,\n        -0.199826896190643,\n        -0.0379013642668724,\n        0.786604106426239\n      ],\n      \"scale\": [\n        1.0,\n        1.0,\n        1.0\n      ],\n      \"children\": [\n        33\n      ]\n    },\n    {\n      \"name\": \"mixamorig_LeftHandPinky2\",\n      \"translation\": [\n        -0.0107269287109375,\n        4.08926391601563,\n        -7.105427357601E-15\n      ],\n      \"rotation\": [\n        0.729269921779633,\n        0.028753899037838,\n        -0.144257292151451,\n        0.668227851390839\n      ],\n      \"scale\": [\n        1.0,\n        1.0,\n        1.0\n      ],\n      \"children\": [\n        34\n      ]\n    },\n    {\n      \"name\": \"mixamorig_LeftHandPinky3\",\n      \"translation\": [\n        0.0215301513671875,\n        3.39088821411133,\n        -1.52587890625E-05\n      ],\n      \"rotation\": [\n        -1.7562278742389E-07,\n        -0.000155539702973329,\n        -0.00553603656589985,\n        0.999984681606293\n      ],\n      \"scale\": [\n        1.0,\n        1.0,\n        1.0\n      ],\n      \"children\": [\n        35\n      ]\n    },\n    {\n      \"name\": \"mixamorig_LeftHandPinky4\",\n      \"translation\": [\n        -0.0108299255371094,\n        2.28256225585938,\n        1.52587890625E-05\n      ],\n      \"rotation\": [\n        -1.49011611938477E-08,\n        -1.49011611938477E-08,\n        1.49011611938477E-08,\n        1.0\n      ],\n      \"scale\": [\n        1.0,\n        1.0,\n        1.0\n      ]\n    },\n    {\n      \"name\": \"mixamorig_RightShoulder\",\n      \"translation\": [\n        -13.0577869415283,\n        23.2456359863281,\n        -0.413176536560059\n      ],\n      \"rotation\": [\n        0.666995644569397,\n        -0.307142376899719,\n        0.600895643234253,\n        0.315760672092438\n      ],\n      \"scale\": [\n        1.0,\n        1.0,\n        1.0\n      ],\n      \"children\": [\n        37\n      ]\n    },\n    {\n      \"name\": \"mixamorig_RightArm\",\n      \"translation\": [\n        8.10623168945313E-06,\n        29.6032180786133,\n        -1.52587890625E-05\n      ],\n      \"rotation\": [\n        0.29125851392746,\n        0.092711441218853,\n        0.152578696608543,\n        0.93983656167984\n      ],\n      \"scale\": [\n        1.0,\n        1.0,\n        1.0\n      ],\n      \"children\": [\n        38\n      ]\n    },\n    {\n      \"name\": \"mixamorig_RightForeArm\",\n      \"translation\": [\n        -3.814697265625E-06,\n        26.2828674316406,\n        -1.52587890625E-05\n      ],\n      \"rotation\": [\n        0.125037610530853,\n        -0.114294819533825,\n        -0.196367219090462,\n        0.965785801410675\n      ],\n      \"scale\": [\n        1.0,\n        1.0,\n        1.0\n      ],\n      \"children\": [\n        39\n      ]\n    },\n    {\n      \"name\": \"mixamorig_RightHand\",\n      \"translation\": [\n        -3.814697265625E-06,\n        44.7671813964844,\n        0.0\n      ],\n      \"rotation\": [\n        -0.030215673148632,\n        -0.199038341641426,\n        0.00341757154092193,\n        0.979519844055176\n      ],\n      \"scale\": [\n        1.0,\n        1.0,\n        1.0\n      ],\n      \"children\": [\n        40,\n        44,\n        48,\n        52,\n        56\n      ]\n    },\n    {\n      \"name\": \"mixamorig_RightHandThumb1\",\n      \"translation\": [\n        3.61030101776123,\n        7.41763305664063,\n        2.34453582763672\n      ],\n      \"rotation\": [\n        0.170410796999931,\n        0.0504509843885899,\n        -0.209833353757858,\n        0.961449325084686\n      ],\n      \"scale\": [\n        1.0,\n        1.0,\n        1.0\n      ],\n      \"children\": [\n        41\n      ]\n    },\n    {\n      \"name\": \"mixamorig_RightHandThumb2\",\n      \"translation\": [\n        0.295150756835938,\n        6.85467529296875,\n        1.1444091796875E-05\n      ],\n      \"rotation\": [\n        0.0794776082038879,\n        -0.186261773109436,\n        0.147058352828026,\n        0.96817547082901\n      ],\n      \"scale\": [\n        1.0,\n        1.0,\n        1.0\n      ],\n      \"children\": [\n        42\n      ]\n    },\n    {\n      \"name\": \"mixamorig_RightHandThumb3\",\n      \"translation\": [\n        0.328197479248047,\n        6.10063171386719,\n        -3.814697265625E-06\n      ],\n      \"rotation\": [\n        -0.000274145335424691,\n        0.00670120632275939,\n        -0.0945486351847649,\n        0.995497643947601\n      ],\n      \"scale\": [\n        1.0,\n        1.0,\n        1.0\n      ],\n      \"children\": [\n        43\n      ]\n    },\n    {\n      \"name\": \"mixamorig_RightHandThumb4\",\n      \"translation\": [\n        -0.623348236083984,\n        4.56706237792969,\n        -9.5367431640625E-06\n      ],\n      \"rotation\": [\n        -7.45058148510225E-09,\n        -5.55111512312578E-17,\n        -2.77555756156289E-17,\n        1.0\n      ],\n      \"scale\": [\n        1.0,\n        1.0,\n        1.0\n      ]\n    },\n    {\n      \"name\": \"mixamorig_RightHandIndex1\",\n      \"translation\": [\n        6.32326316833496,\n        22.1758346557617,\n        -0.0350570678710938\n      ],\n      \"rotation\": [\n        0.308014512062073,\n        0.0190459731966257,\n        -0.0321906022727489,\n        0.950646162033081\n      ],\n      \"scale\": [\n        1.0,\n        1.0,\n        1.0\n      ],\n      \"children\": [\n        45\n      ]\n    },\n    {\n      \"name\": \"mixamorig_RightHandIndex2\",\n      \"translation\": [\n        -0.126022338867188,\n        4.72535705566406,\n        3.5527136788005E-15\n      ],\n      \"rotation\": [\n        0.552379190921783,\n        0.0296952817589045,\n        0.0169027559459209,\n        0.83289235830307\n      ],\n      \"scale\": [\n        1.0,\n        1.0,\n        1.0\n      ],\n      \"children\": [\n        46\n      ]\n    },\n    {\n      \"name\": \"mixamorig_RightHandIndex3\",\n      \"translation\": [\n        0.0701007843017578,\n        4.39042663574219,\n        -1.52587890625E-05\n      ],\n      \"rotation\": [\n        8.22923666987663E-08,\n        -5.83010023547104E-06,\n        -0.000261857261648402,\n        0.999999940395355\n      ],\n      \"scale\": [\n        1.0,\n        1.0,\n        1.0\n      ],\n      \"children\": [\n        47\n      ]\n    },\n    {\n      \"name\": \"mixamorig_RightHandIndex4\",\n      \"translation\": [\n        0.0559272766113281,\n        3.61975479125977,\n        -1.52587890625E-05\n      ],\n      \"rotation\": [\n        9.31322796660083E-10,\n        1.11758717835642E-08,\n        2.79396794589104E-09,\n        1.0\n      ],\n      \"scale\": [\n        1.0,\n        1.0,\n        1.0\n      ]\n    },\n    {\n      \"name\": \"mixamorig_RightHandMiddle1\",\n      \"translation\": [\n        1.88641166687012,\n        22.1183776855469,\n        -1.45953369140625\n      ],\n      \"rotation\": [\n        0.387795507907867,\n        0.0569556765258312,\n        -0.020181629806757,\n        0.919762670993805\n      ],\n      \"scale\": [\n        1.0,\n        1.0,\n        1.0\n      ],\n      \"children\": [\n        49\n      ]\n    },\n    {\n      \"name\": \"mixamorig_RightHandMiddle2\",\n      \"translation\": [\n        -0.019317626953125,\n        5.23527526855469,\n        7.62939453125E-06\n      ],\n      \"rotation\": [\n        0.596116542816162,\n        0.0365558490157127,\n        0.0259225554764271,\n        0.801646292209625\n      ],\n      \"scale\": [\n        1.0,\n        1.0,\n        1.0\n      ],\n      \"children\": [\n        50\n      ]\n    },\n    {\n      \"name\": \"mixamorig_RightHandMiddle3\",\n      \"translation\": [\n        -0.018610954284668,\n        5.082763671875,\n        0.0\n      ],\n      \"rotation\": [\n        -5.12359576987365E-08,\n        0.000129199092043564,\n        0.00639397231861949,\n        0.999979555606842\n      ],\n      \"scale\": [\n        1.0,\n        1.0,\n        1.0\n      ],\n      \"children\": [\n        51\n      ]\n    },\n    {\n      \"name\": \"mixamorig_RightHandMiddle4\",\n      \"translation\": [\n        0.0379300117492676,\n        4.15168380737305,\n        -1.52587890625E-05\n      ],\n      \"rotation\": [\n        -1.49011594174908E-08,\n        5.58793500360366E-09,\n        -2.23517382380578E-08,\n        1.0\n      ],\n      \"scale\": [\n        1.0,\n        1.0,\n        1.0\n      ]\n    },\n    {\n      \"name\": \"mixamorig_RightHandRing1\",\n      \"translation\": [\n        -2.29168319702148,\n        20.9904022216797,\n        -0.538551330566406\n      ],\n      \"rotation\": [\n        0.38022392988205,\n        0.0287463273853064,\n        -0.0538149625062943,\n        0.922879934310913\n      ],\n      \"scale\": [\n        1.0,\n        1.0,\n        1.0\n      ],\n      \"children\": [\n        53\n      ]\n    },\n    {\n      \"name\": \"mixamorig_RightHandRing2\",\n      \"translation\": [\n        -0.101470947265625,\n        4.92262268066406,\n        3.814697265625E-06\n      ],\n      \"rotation\": [\n        0.647808432579041,\n        -0.0126825859770179,\n        0.0207728482782841,\n        0.761414349079132\n      ],\n      \"scale\": [\n        1.0,\n        1.0,\n        1.0\n      ],\n      \"children\": [\n        54\n      ]\n    },\n    {\n      \"name\": \"mixamorig_RightHandRing3\",\n      \"translation\": [\n        0.0193042755126953,\n        4.73216247558594,\n        0.0\n      ],\n      \"rotation\": [\n        1.42236767715076E-05,\n        0.0011907946318388,\n        0.00809002481400967,\n        0.999966561794281\n      ],\n      \"scale\": [\n        1.0,\n        1.0,\n        1.0\n      ],\n      \"children\": [\n        55\n      ]\n    },\n    {\n      \"name\": \"mixamorig_RightHandRing4\",\n      \"translation\": [\n        0.0821628570556641,\n        4.05702209472656,\n        -3.0517578125E-05\n      ],\n      \"rotation\": [\n        1.56125112837913E-17,\n        4.33680827635171E-18,\n        -3.72529100900465E-08,\n        1.0\n      ],\n      \"scale\": [\n        1.0,\n        1.0,\n        1.0\n      ]\n    },\n    {\n      \"name\": \"mixamorig_RightHandPinky1\",\n      \"translation\": [\n        -5.91796684265137,\n        18.9087066650391,\n        -0.817703247070313\n      ],\n      \"rotation\": [\n        0.355771571397781,\n        0.0667038783431053,\n        -0.0497678406536579,\n        0.930859982967377\n      ],\n      \"scale\": [\n        1.0,\n        1.0,\n        1.0\n      ],\n      \"children\": [\n        57\n      ]\n    },\n    {\n      \"name\": \"mixamorig_RightHandPinky2\",\n      \"translation\": [\n        0.0285511016845703,\n        3.89680480957031,\n        -7.62939453125E-06\n      ],\n      \"rotation\": [\n        0.687846004962921,\n        -0.0430763177573681,\n        0.0637564659118652,\n        0.721766889095306\n      ],\n      \"scale\": [\n        1.0,\n        1.0,\n        1.0\n      ],\n      \"children\": [\n        58\n      ]\n    },\n    {\n      \"name\": \"mixamorig_RightHandPinky3\",\n      \"translation\": [\n        -0.0183124542236328,\n        3.27626800537109,\n        -1.52587890625E-05\n      ],\n      \"rotation\": [\n        -9.05223416225454E-08,\n        3.43918072758242E-05,\n        0.000898983504157513,\n        0.999999582767487\n      ],\n      \"scale\": [\n        1.0,\n        1.0,\n        1.0\n      ],\n      \"children\": [\n        59\n      ]\n    },\n    {\n      \"name\": \"mixamorig_RightHandPinky4\",\n      \"translation\": [\n        -0.0102348327636719,\n        2.69295883178711,\n        -3.0517578125E-05\n      ],\n      \"rotation\": [\n        1.49011629702045E-08,\n        -7.45058148510225E-09,\n        1.49011647465613E-08,\n        1.0\n      ],\n      \"scale\": [\n        1.0,\n        1.0,\n        1.0\n      ]\n    },\n    {\n      \"name\": \"mixamorig_LeftUpLeg\",\n      \"translation\": [\n        17.3406925201416,\n        -11.1701202392578,\n        -2.82427215576172\n      ],\n      \"rotation\": [\n        0.0632223263382912,\n        0.19430148601532,\n        0.977621793746948,\n        -0.0500544272363186\n      ],\n      \"scale\": [\n        1.0,\n        1.0,\n        1.0\n      ],\n      \"children\": [\n        61\n      ]\n    },\n    {\n      \"name\": \"mixamorig_LeftLeg\",\n      \"translation\": [\n        1.9073486328125E-06,\n        68.798225402832,\n        -1.1444091796875E-05\n      ],\n      \"rotation\": [\n        -0.542776346206665,\n        0.00966412108391523,\n        -0.0181848555803299,\n        0.839624762535095\n      ],\n      \"scale\": [\n        1.0,\n        1.0,\n        1.0\n      ],\n      \"children\": [\n        62\n      ]\n    },\n    {\n      \"name\": \"mixamorig_LeftFoot\",\n      \"translation\": [\n        1.52587890625E-05,\n        56.1653099060059,\n        0.0\n      ],\n      \"rotation\": [\n        0.448129504919052,\n        -0.0609910152852535,\n        0.0576151199638844,\n        0.890022754669189\n      ],\n      \"scale\": [\n        1.0,\n        1.0,\n        1.0\n      ],\n      \"children\": [\n        63\n      ]\n    },\n    {\n      \"name\": \"mixamorig_LeftToeBase\",\n      \"translation\": [\n        -1.71661376953125E-05,\n        30.944938659668,\n        3.45706939697266E-06\n      ],\n      \"rotation\": [\n        0.390491783618927,\n        -0.0149825718253851,\n        -0.00321882800199091,\n        0.920478880405426\n      ],\n      \"scale\": [\n        1.0,\n        1.0,\n        1.0\n      ],\n      \"children\": [\n        64\n      ]\n    },\n    {\n      \"name\": \"mixamorig_LeftToe_End\",\n      \"translation\": [\n        -1.9073486328125E-06,\n        11.8308887481689,\n        -4.29153442382813E-06\n      ],\n      \"rotation\": [\n        -1.4901157641134E-08,\n        -2.22044551985472E-16,\n        1.49011611938477E-08,\n        1.0\n      ],\n      \"scale\": [\n        1.0,\n        1.0,\n        1.0\n      ]\n    },\n    {\n      \"name\": \"mixamorig_RightUpLeg\",\n      \"translation\": [\n        -17.3406982421875,\n        -11.1701202392578,\n        -3.41980719566345\n      ],\n      \"rotation\": [\n        -0.0704485028982162,\n        0.0765243247151375,\n        0.994312763214111,\n        -0.0228715427219868\n      ],\n      \"scale\": [\n        1.0,\n        1.0,\n        1.0\n      ],\n      \"children\": [\n        66\n      ]\n    },\n    {\n      \"name\": \"mixamorig_RightLeg\",\n      \"translation\": [\n        0.0,\n        68.7107849121094,\n        -9.5367431640625E-06\n      ],\n      \"rotation\": [\n        -0.164243295788765,\n        -0.0687382966279984,\n        0.027061378583312,\n        0.983649790287018\n      ],\n      \"scale\": [\n        1.0,\n        1.0,\n        1.0\n      ],\n      \"children\": [\n        67\n      ]\n    },\n    {\n      \"name\": \"mixamorig_RightFoot\",\n      \"translation\": [\n        -3.814697265625E-06,\n        56.1737403869629,\n        1.19209289550781E-06\n      ],\n      \"rotation\": [\n        0.481625467538834,\n        0.0393618158996105,\n        -0.101585015654564,\n        0.869579255580902\n      ],\n      \"scale\": [\n        1.0,\n        1.0,\n        1.0\n      ],\n      \"children\": [\n        68\n      ]\n    },\n    {\n      \"name\": \"mixamorig_RightToeBase\",\n      \"translation\": [\n        -1.9073486328125E-06,\n        30.6320095062256,\n        -3.814697265625E-06\n      ],\n      \"rotation\": [\n        0.403990715742111,\n        0.0372881665825844,\n        -0.0117762573063374,\n        0.913926899433136\n      ],\n      \"scale\": [\n        1.0,\n        1.0,\n        1.0\n      ],\n      \"children\": [\n        69\n      ]\n    },\n    {\n      \"name\": \"mixamorig_RightToe_End\",\n      \"translation\": [\n        -3.814697265625E-06,\n        11.631763458252,\n        -1.19209289550781E-07\n      ],\n      \"rotation\": [\n        3.52365731907183E-19,\n        -1.39698386192322E-09,\n        -4.71482053399086E-09,\n        1.0\n      ],\n      \"scale\": [\n        1.0,\n        1.0,\n        1.0\n      ]\n    },\n    {\n      \"name\": \"Object\",\n      \"translation\": [\n        0.00743770599365234,\n        -2.01158142089844,\n        1.239013671875\n      ],\n      \"rotation\": [\n        -0.00858977343887091,\n        -0.0231941137462854,\n        0.00999393407255411,\n        0.999644100666046\n      ],\n      \"scale\": [\n        1.0,\n        1.0,\n        1.0\n      ],\n      \"mesh\": 2,\n      \"extensions\": {\n        \"0\": \"0.1\",\n        \"effects\": {\n          \"glow\": 1.0,\n          \"bloom\": true\n        }\n      }\n    },\n    {\n      \"name\": \"cryExporterSettingsNode70\",\n      \"translation\": [\n        -0.0778043791651726,\n        -7.70371977754894E-34,\n        0.0861874967813492\n      ],\n      \"rotation\": [\n        -0.70710676908493,\n        0.0,\n        0.0,\n        0.70710676908493\n      ],\n      \"scale\": [\n        0.00100000004749745,\n        0.00100000004749745,\n        0.00100000004749745\n      ]\n    },\n    {\n      \"name\": \"cryAnimationExportNode71\",\n      \"translation\": [\n        -0.0778043791651726,\n        -7.70371977754894E-34,\n        0.0861874967813492\n      ],\n      \"rotation\": [\n        -0.70710676908493,\n        0.0,\n        0.0,\n        0.70710676908493\n      ],\n      \"scale\": [\n        0.00100000004749745,\n        0.00100000004749745,\n        0.00100000004749745\n      ]\n    }\n  ],\n  \"animations\": [\n    {\n      \"name\": \"Walk\",\n      \"channels\": [\n        {\n          \"sampler\": 0,\n          \"target\": {\n            \"node\": 5,\n            \"path\": \"translation\"\n          }\n        },\n        {\n          \"sampler\": 1,\n          \"target\": {\n            \"node\": 5,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 2,\n          \"target\": {\n            \"node\": 6,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 3,\n          \"target\": {\n            \"node\": 7,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 4,\n          \"target\": {\n            \"node\": 8,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 5,\n          \"target\": {\n            \"node\": 9,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 6,\n          \"target\": {\n            \"node\": 10,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 7,\n          \"target\": {\n            \"node\": 12,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 8,\n          \"target\": {\n            \"node\": 13,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 9,\n          \"target\": {\n            \"node\": 14,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 10,\n          \"target\": {\n            \"node\": 15,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 11,\n          \"target\": {\n            \"node\": 16,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 12,\n          \"target\": {\n            \"node\": 17,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 13,\n          \"target\": {\n            \"node\": 18,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 14,\n          \"target\": {\n            \"node\": 20,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 15,\n          \"target\": {\n            \"node\": 21,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 16,\n          \"target\": {\n            \"node\": 22,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 17,\n          \"target\": {\n            \"node\": 24,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 18,\n          \"target\": {\n            \"node\": 25,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 19,\n          \"target\": {\n            \"node\": 26,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 20,\n          \"target\": {\n            \"node\": 28,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 21,\n          \"target\": {\n            \"node\": 29,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 22,\n          \"target\": {\n            \"node\": 30,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 23,\n          \"target\": {\n            \"node\": 32,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 24,\n          \"target\": {\n            \"node\": 33,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 25,\n          \"target\": {\n            \"node\": 34,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 26,\n          \"target\": {\n            \"node\": 36,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 27,\n          \"target\": {\n            \"node\": 37,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 28,\n          \"target\": {\n            \"node\": 38,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 29,\n          \"target\": {\n            \"node\": 39,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 30,\n          \"target\": {\n            \"node\": 40,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 31,\n          \"target\": {\n            \"node\": 41,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 32,\n          \"target\": {\n            \"node\": 42,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 33,\n          \"target\": {\n            \"node\": 44,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 34,\n          \"target\": {\n            \"node\": 45,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 35,\n          \"target\": {\n            \"node\": 46,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 36,\n          \"target\": {\n            \"node\": 48,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 37,\n          \"target\": {\n            \"node\": 49,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 38,\n          \"target\": {\n            \"node\": 50,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 39,\n          \"target\": {\n            \"node\": 52,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 40,\n          \"target\": {\n            \"node\": 53,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 41,\n          \"target\": {\n            \"node\": 54,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 42,\n          \"target\": {\n            \"node\": 56,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 43,\n          \"target\": {\n            \"node\": 57,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 44,\n          \"target\": {\n            \"node\": 58,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 45,\n          \"target\": {\n            \"node\": 60,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 46,\n          \"target\": {\n            \"node\": 61,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 47,\n          \"target\": {\n            \"node\": 62,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 48,\n          \"target\": {\n            \"node\": 63,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 49,\n          \"target\": {\n            \"node\": 65,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 50,\n          \"target\": {\n            \"node\": 66,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 51,\n          \"target\": {\n            \"node\": 67,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 52,\n          \"target\": {\n            \"node\": 68,\n            \"path\": \"rotation\"\n          }\n        }\n      ],\n      \"samplers\": [\n        {\n          \"input\": 0,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 1\n        },\n        {\n          \"input\": 0,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 2\n        },\n        {\n          \"input\": 0,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 3\n        },\n        {\n          \"input\": 0,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 4\n        },\n        {\n          \"input\": 0,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 5\n        },\n        {\n          \"input\": 0,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 6\n        },\n        {\n          \"input\": 0,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 7\n        },\n        {\n          \"input\": 0,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 8\n        },\n        {\n          \"input\": 0,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 9\n        },\n        {\n          \"input\": 0,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 10\n        },\n        {\n          \"input\": 0,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 11\n        },\n        {\n          \"input\": 0,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 12\n        },\n        {\n          \"input\": 0,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 13\n        },\n        {\n          \"input\": 0,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 14\n        },\n        {\n          \"input\": 0,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 15\n        },\n        {\n          \"input\": 0,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 16\n        },\n        {\n          \"input\": 0,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 17\n        },\n        {\n          \"input\": 0,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 18\n        },\n        {\n          \"input\": 0,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 19\n        },\n        {\n          \"input\": 0,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 20\n        },\n        {\n          \"input\": 0,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 21\n        },\n        {\n          \"input\": 0,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 22\n        },\n        {\n          \"input\": 0,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 23\n        },\n        {\n          \"input\": 0,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 24\n        },\n        {\n          \"input\": 0,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 25\n        },\n        {\n          \"input\": 0,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 26\n        },\n        {\n          \"input\": 0,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 27\n        },\n        {\n          \"input\": 0,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 28\n        },\n        {\n          \"input\": 0,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 29\n        },\n        {\n          \"input\": 0,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 30\n        },\n        {\n          \"input\": 0,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 31\n        },\n        {\n          \"input\": 0,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 32\n        },\n        {\n          \"input\": 0,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 33\n        },\n        {\n          \"input\": 0,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 34\n        },\n        {\n          \"input\": 0,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 35\n        },\n        {\n          \"input\": 0,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 36\n        },\n        {\n          \"input\": 0,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 37\n        },\n        {\n          \"input\": 0,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 38\n        },\n        {\n          \"input\": 0,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 39\n        },\n        {\n          \"input\": 0,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 40\n        },\n        {\n          \"input\": 0,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 41\n        },\n        {\n          \"input\": 0,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 42\n        },\n        {\n          \"input\": 0,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 43\n        },\n        {\n          \"input\": 0,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 44\n        },\n        {\n          \"input\": 0,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 45\n        },\n        {\n          \"input\": 0,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 46\n        },\n        {\n          \"input\": 0,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 47\n        },\n        {\n          \"input\": 0,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 48\n        },\n        {\n          \"input\": 0,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 49\n        },\n        {\n          \"input\": 0,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 50\n        },\n        {\n          \"input\": 0,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 51\n        },\n        {\n          \"input\": 0,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 52\n        },\n        {\n          \"input\": 0,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 53\n        }\n      ]\n    },\n    {\n      \"name\": \"Waving\",\n      \"channels\": [\n        {\n          \"sampler\": 0,\n          \"target\": {\n            \"node\": 5,\n            \"path\": \"translation\"\n          }\n        },\n        {\n          \"sampler\": 1,\n          \"target\": {\n            \"node\": 5,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 2,\n          \"target\": {\n            \"node\": 6,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 3,\n          \"target\": {\n            \"node\": 7,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 4,\n          \"target\": {\n            \"node\": 8,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 5,\n          \"target\": {\n            \"node\": 9,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 6,\n          \"target\": {\n            \"node\": 10,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 7,\n          \"target\": {\n            \"node\": 12,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 8,\n          \"target\": {\n            \"node\": 13,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 9,\n          \"target\": {\n            \"node\": 14,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 10,\n          \"target\": {\n            \"node\": 15,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 11,\n          \"target\": {\n            \"node\": 16,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 12,\n          \"target\": {\n            \"node\": 17,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 13,\n          \"target\": {\n            \"node\": 18,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 14,\n          \"target\": {\n            \"node\": 20,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 15,\n          \"target\": {\n            \"node\": 21,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 16,\n          \"target\": {\n            \"node\": 22,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 17,\n          \"target\": {\n            \"node\": 24,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 18,\n          \"target\": {\n            \"node\": 25,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 19,\n          \"target\": {\n            \"node\": 26,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 20,\n          \"target\": {\n            \"node\": 28,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 21,\n          \"target\": {\n            \"node\": 29,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 22,\n          \"target\": {\n            \"node\": 30,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 23,\n          \"target\": {\n            \"node\": 32,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 24,\n          \"target\": {\n            \"node\": 33,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 25,\n          \"target\": {\n            \"node\": 34,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 26,\n          \"target\": {\n            \"node\": 36,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 27,\n          \"target\": {\n            \"node\": 37,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 28,\n          \"target\": {\n            \"node\": 38,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 29,\n          \"target\": {\n            \"node\": 39,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 30,\n          \"target\": {\n            \"node\": 40,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 31,\n          \"target\": {\n            \"node\": 41,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 32,\n          \"target\": {\n            \"node\": 42,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 33,\n          \"target\": {\n            \"node\": 44,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 34,\n          \"target\": {\n            \"node\": 45,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 35,\n          \"target\": {\n            \"node\": 46,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 36,\n          \"target\": {\n            \"node\": 48,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 37,\n          \"target\": {\n            \"node\": 49,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 38,\n          \"target\": {\n            \"node\": 50,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 39,\n          \"target\": {\n            \"node\": 52,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 40,\n          \"target\": {\n            \"node\": 53,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 41,\n          \"target\": {\n            \"node\": 54,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 42,\n          \"target\": {\n            \"node\": 56,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 43,\n          \"target\": {\n            \"node\": 57,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 44,\n          \"target\": {\n            \"node\": 58,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 45,\n          \"target\": {\n            \"node\": 60,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 46,\n          \"target\": {\n            \"node\": 61,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 47,\n          \"target\": {\n            \"node\": 62,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 48,\n          \"target\": {\n            \"node\": 63,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 49,\n          \"target\": {\n            \"node\": 65,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 50,\n          \"target\": {\n            \"node\": 66,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 51,\n          \"target\": {\n            \"node\": 67,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 52,\n          \"target\": {\n            \"node\": 68,\n            \"path\": \"rotation\"\n          }\n        }\n      ],\n      \"samplers\": [\n        {\n          \"input\": 54,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 55\n        },\n        {\n          \"input\": 54,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 56\n        },\n        {\n          \"input\": 54,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 57\n        },\n        {\n          \"input\": 54,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 58\n        },\n        {\n          \"input\": 54,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 59\n        },\n        {\n          \"input\": 54,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 60\n        },\n        {\n          \"input\": 54,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 61\n        },\n        {\n          \"input\": 54,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 62\n        },\n        {\n          \"input\": 54,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 63\n        },\n        {\n          \"input\": 54,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 64\n        },\n        {\n          \"input\": 54,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 65\n        },\n        {\n          \"input\": 54,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 66\n        },\n        {\n          \"input\": 54,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 67\n        },\n        {\n          \"input\": 54,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 68\n        },\n        {\n          \"input\": 54,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 69\n        },\n        {\n          \"input\": 54,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 70\n        },\n        {\n          \"input\": 54,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 71\n        },\n        {\n          \"input\": 54,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 72\n        },\n        {\n          \"input\": 54,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 73\n        },\n        {\n          \"input\": 54,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 74\n        },\n        {\n          \"input\": 54,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 75\n        },\n        {\n          \"input\": 54,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 76\n        },\n        {\n          \"input\": 54,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 77\n        },\n        {\n          \"input\": 54,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 78\n        },\n        {\n          \"input\": 54,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 79\n        },\n        {\n          \"input\": 54,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 80\n        },\n        {\n          \"input\": 54,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 81\n        },\n        {\n          \"input\": 54,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 82\n        },\n        {\n          \"input\": 54,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 83\n        },\n        {\n          \"input\": 54,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 84\n        },\n        {\n          \"input\": 54,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 85\n        },\n        {\n          \"input\": 54,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 86\n        },\n        {\n          \"input\": 54,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 87\n        },\n        {\n          \"input\": 54,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 88\n        },\n        {\n          \"input\": 54,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 89\n        },\n        {\n          \"input\": 54,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 90\n        },\n        {\n          \"input\": 54,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 91\n        },\n        {\n          \"input\": 54,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 92\n        },\n        {\n          \"input\": 54,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 93\n        },\n        {\n          \"input\": 54,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 94\n        },\n        {\n          \"input\": 54,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 95\n        },\n        {\n          \"input\": 54,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 96\n        },\n        {\n          \"input\": 54,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 97\n        },\n        {\n          \"input\": 54,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 98\n        },\n        {\n          \"input\": 54,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 99\n        },\n        {\n          \"input\": 54,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 100\n        },\n        {\n          \"input\": 54,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 101\n        },\n        {\n          \"input\": 54,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 102\n        },\n        {\n          \"input\": 54,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 103\n        },\n        {\n          \"input\": 54,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 104\n        },\n        {\n          \"input\": 54,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 105\n        },\n        {\n          \"input\": 54,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 106\n        },\n        {\n          \"input\": 54,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 107\n        }\n      ]\n    },\n    {\n      \"name\": \"Jump\",\n      \"channels\": [\n        {\n          \"sampler\": 0,\n          \"target\": {\n            \"node\": 5,\n            \"path\": \"translation\"\n          }\n        },\n        {\n          \"sampler\": 1,\n          \"target\": {\n            \"node\": 5,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 2,\n          \"target\": {\n            \"node\": 6,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 3,\n          \"target\": {\n            \"node\": 7,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 4,\n          \"target\": {\n            \"node\": 8,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 5,\n          \"target\": {\n            \"node\": 9,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 6,\n          \"target\": {\n            \"node\": 10,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 7,\n          \"target\": {\n            \"node\": 12,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 8,\n          \"target\": {\n            \"node\": 13,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 9,\n          \"target\": {\n            \"node\": 14,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 10,\n          \"target\": {\n            \"node\": 15,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 11,\n          \"target\": {\n            \"node\": 16,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 12,\n          \"target\": {\n            \"node\": 17,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 13,\n          \"target\": {\n            \"node\": 18,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 14,\n          \"target\": {\n            \"node\": 20,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 15,\n          \"target\": {\n            \"node\": 21,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 16,\n          \"target\": {\n            \"node\": 22,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 17,\n          \"target\": {\n            \"node\": 24,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 18,\n          \"target\": {\n            \"node\": 25,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 19,\n          \"target\": {\n            \"node\": 26,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 20,\n          \"target\": {\n            \"node\": 28,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 21,\n          \"target\": {\n            \"node\": 29,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 22,\n          \"target\": {\n            \"node\": 30,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 23,\n          \"target\": {\n            \"node\": 32,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 24,\n          \"target\": {\n            \"node\": 33,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 25,\n          \"target\": {\n            \"node\": 34,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 26,\n          \"target\": {\n            \"node\": 36,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 27,\n          \"target\": {\n            \"node\": 37,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 28,\n          \"target\": {\n            \"node\": 38,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 29,\n          \"target\": {\n            \"node\": 39,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 30,\n          \"target\": {\n            \"node\": 40,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 31,\n          \"target\": {\n            \"node\": 41,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 32,\n          \"target\": {\n            \"node\": 42,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 33,\n          \"target\": {\n            \"node\": 44,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 34,\n          \"target\": {\n            \"node\": 45,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 35,\n          \"target\": {\n            \"node\": 46,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 36,\n          \"target\": {\n            \"node\": 48,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 37,\n          \"target\": {\n            \"node\": 49,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 38,\n          \"target\": {\n            \"node\": 50,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 39,\n          \"target\": {\n            \"node\": 52,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 40,\n          \"target\": {\n            \"node\": 53,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 41,\n          \"target\": {\n            \"node\": 54,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 42,\n          \"target\": {\n            \"node\": 56,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 43,\n          \"target\": {\n            \"node\": 57,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 44,\n          \"target\": {\n            \"node\": 58,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 45,\n          \"target\": {\n            \"node\": 60,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 46,\n          \"target\": {\n            \"node\": 61,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 47,\n          \"target\": {\n            \"node\": 62,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 48,\n          \"target\": {\n            \"node\": 63,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 49,\n          \"target\": {\n            \"node\": 65,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 50,\n          \"target\": {\n            \"node\": 66,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 51,\n          \"target\": {\n            \"node\": 67,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 52,\n          \"target\": {\n            \"node\": 68,\n            \"path\": \"rotation\"\n          }\n        }\n      ],\n      \"samplers\": [\n        {\n          \"input\": 108,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 109\n        },\n        {\n          \"input\": 108,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 110\n        },\n        {\n          \"input\": 108,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 111\n        },\n        {\n          \"input\": 108,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 112\n        },\n        {\n          \"input\": 108,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 113\n        },\n        {\n          \"input\": 108,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 114\n        },\n        {\n          \"input\": 108,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 115\n        },\n        {\n          \"input\": 108,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 116\n        },\n        {\n          \"input\": 108,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 117\n        },\n        {\n          \"input\": 108,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 118\n        },\n        {\n          \"input\": 108,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 119\n        },\n        {\n          \"input\": 108,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 120\n        },\n        {\n          \"input\": 108,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 121\n        },\n        {\n          \"input\": 108,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 122\n        },\n        {\n          \"input\": 108,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 123\n        },\n        {\n          \"input\": 108,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 124\n        },\n        {\n          \"input\": 108,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 125\n        },\n        {\n          \"input\": 108,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 126\n        },\n        {\n          \"input\": 108,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 127\n        },\n        {\n          \"input\": 108,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 128\n        },\n        {\n          \"input\": 108,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 129\n        },\n        {\n          \"input\": 108,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 130\n        },\n        {\n          \"input\": 108,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 131\n        },\n        {\n          \"input\": 108,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 132\n        },\n        {\n          \"input\": 108,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 133\n        },\n        {\n          \"input\": 108,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 134\n        },\n        {\n          \"input\": 108,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 135\n        },\n        {\n          \"input\": 108,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 136\n        },\n        {\n          \"input\": 108,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 137\n        },\n        {\n          \"input\": 108,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 138\n        },\n        {\n          \"input\": 108,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 139\n        },\n        {\n          \"input\": 108,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 140\n        },\n        {\n          \"input\": 108,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 141\n        },\n        {\n          \"input\": 108,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 142\n        },\n        {\n          \"input\": 108,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 143\n        },\n        {\n          \"input\": 108,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 144\n        },\n        {\n          \"input\": 108,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 145\n        },\n        {\n          \"input\": 108,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 146\n        },\n        {\n          \"input\": 108,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 147\n        },\n        {\n          \"input\": 108,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 148\n        },\n        {\n          \"input\": 108,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 149\n        },\n        {\n          \"input\": 108,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 150\n        },\n        {\n          \"input\": 108,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 151\n        },\n        {\n          \"input\": 108,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 152\n        },\n        {\n          \"input\": 108,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 153\n        },\n        {\n          \"input\": 108,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 154\n        },\n        {\n          \"input\": 108,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 155\n        },\n        {\n          \"input\": 108,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 156\n        },\n        {\n          \"input\": 108,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 157\n        },\n        {\n          \"input\": 108,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 158\n        },\n        {\n          \"input\": 108,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 159\n        },\n        {\n          \"input\": 108,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 160\n        },\n        {\n          \"input\": 108,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 161\n        }\n      ]\n    }\n  ],\n  \"asset\": {\n    \"generator\": \"FBX2glTF\",\n    \"version\": \"2.0\"\n  },\n  \"scene\": 0,\n  \"scenes\": [\n    {\n      \"name\": \"Root Scene\",\n      \"nodes\": [\n        0\n      ]\n    }\n  ],\n  \"samplers\": [\n    {}\n  ],\n  \"skins\": [\n    {\n      \"joints\": [\n        9,\n        10,\n        8,\n        36\n      ],\n      \"inverseBindMatrices\": 206,\n      \"skeleton\": 8\n    },\n    {\n      \"joints\": [\n        39,\n        56,\n        52,\n        48,\n        44,\n        8,\n        5,\n        36,\n        37,\n        38,\n        15,\n        32,\n        16,\n        17,\n        20,\n        28,\n        24,\n        7,\n        12,\n        6,\n        9,\n        10,\n        13,\n        60,\n        61,\n        65,\n        66,\n        14,\n        62,\n        63,\n        40,\n        67,\n        68,\n        45,\n        46,\n        49,\n        53,\n        41,\n        57,\n        58,\n        50,\n        54,\n        42,\n        22,\n        21,\n        25,\n        29,\n        33,\n        34,\n        26,\n        30,\n        18\n      ],\n      \"inverseBindMatrices\": 207,\n      \"skeleton\": 5\n    }\n  ]\n}\n"
  },
  {
    "path": "examples/resources/models/gltf/bust_of_woman/glTF/bust_of_woman.gltf",
    "content": "{\n    \"asset\" : {\n        \"generator\" : \"Khronos glTF Blender I/O v1.7.33\",\n        \"version\" : \"2.0\"\n    },\n    \"scene\" : 0,\n    \"scenes\" : [\n        {\n            \"name\" : \"Scene\",\n            \"nodes\" : [\n                0\n            ]\n        }\n    ],\n    \"nodes\" : [\n        {\n            \"mesh\" : 0,\n            \"name\" : \"Model\",\n            \"rotation\" : [\n                -0.7071068286895752,\n                0,\n                0,\n                0.7071068286895752\n            ],\n            \"scale\" : [\n                0.10000002384185791,\n                0.10000002384185791,\n                0.10000002384185791\n            ]\n        }\n    ],\n    \"materials\" : [\n        {\n            \"doubleSided\" : true,\n            \"name\" : \"default_mat\",\n            \"pbrMetallicRoughness\" : {\n                \"baseColorFactor\" : [\n                    0.800000011920929,\n                    0.800000011920929,\n                    0.800000011920929,\n                    1\n                ],\n                \"metallicFactor\" : 0.20000000298023224,\n                \"roughnessFactor\" : 0.800000011920929\n            }\n        }\n    ],\n    \"meshes\" : [\n        {\n            \"name\" : \"model\",\n            \"primitives\" : [\n                {\n                    \"attributes\" : {\n                        \"POSITION\" : 0,\n                        \"NORMAL\" : 1,\n                        \"TEXCOORD_0\" : 2\n                    },\n                    \"indices\" : 3,\n                    \"material\" : 0\n                }\n            ]\n        }\n    ],\n    \"accessors\" : [\n        {\n            \"bufferView\" : 0,\n            \"componentType\" : 5126,\n            \"count\" : 32953,\n            \"max\" : [\n                177.9490966796875,\n                111.3333969116211,\n                532.2510375976562\n            ],\n            \"min\" : [\n                -172.76531982421875,\n                -104.85065460205078,\n                -1.408761181664886e-05\n            ],\n            \"type\" : \"VEC3\"\n        },\n        {\n            \"bufferView\" : 1,\n            \"componentType\" : 5126,\n            \"count\" : 32953,\n            \"type\" : \"VEC3\"\n        },\n        {\n            \"bufferView\" : 2,\n            \"componentType\" : 5126,\n            \"count\" : 32953,\n            \"type\" : \"VEC2\"\n        },\n        {\n            \"bufferView\" : 3,\n            \"componentType\" : 5123,\n            \"count\" : 182364,\n            \"type\" : \"SCALAR\"\n        }\n    ],\n    \"bufferViews\" : [\n        {\n            \"buffer\" : 0,\n            \"byteLength\" : 395436,\n            \"byteOffset\" : 0\n        },\n        {\n            \"buffer\" : 0,\n            \"byteLength\" : 395436,\n            \"byteOffset\" : 395436\n        },\n        {\n            \"buffer\" : 0,\n            \"byteLength\" : 263624,\n            \"byteOffset\" : 790872\n        },\n        {\n            \"buffer\" : 0,\n            \"byteLength\" : 364728,\n            \"byteOffset\" : 1054496\n        }\n    ],\n    \"buffers\" : [\n        {\n            \"byteLength\" : 1419224,\n            \"uri\" : \"bust_of_woman.bin\"\n        }\n    ]\n}\n"
  },
  {
    "path": "examples/resources/models/gltf/grass/grass.gltf",
    "content": "{\n  \"asset\": {\n    \"generator\": \"Khronos glTF Blender I/O v1.1.46\",\n    \"version\": \"2.0\"\n  },\n  \"scene\": 0,\n  \"scenes\": [\n    {\n      \"name\": \"Scene\",\n      \"nodes\": [\n        0\n      ]\n    }\n  ],\n  \"nodes\": [\n    {\n      \"mesh\": 0,\n      \"name\": \"Plane\"\n    }\n  ],\n  \"meshes\": [\n    {\n      \"name\": \"Plane\",\n      \"primitives\": [\n        {\n          \"attributes\": {\n            \"POSITION\": 0,\n            \"NORMAL\": 1,\n            \"TEXCOORD_0\": 2\n          },\n          \"indices\": 3\n        }\n      ]\n    }\n  ],\n  \"accessors\": [\n    {\n      \"bufferView\": 0,\n      \"componentType\": 5126,\n      \"count\": 162,\n      \"max\": [\n        0.3105661869049072,\n        0.43607327342033386,\n        0.30094847083091736\n      ],\n      \"min\": [\n        -0.3133178949356079,\n        -0.011662454344332218,\n        -0.35548436641693115\n      ],\n      \"type\": \"VEC3\"\n    },\n    {\n      \"bufferView\": 1,\n      \"componentType\": 5126,\n      \"count\": 162,\n      \"type\": \"VEC3\"\n    },\n    {\n      \"bufferView\": 2,\n      \"componentType\": 5126,\n      \"count\": 162,\n      \"type\": \"VEC2\"\n    },\n    {\n      \"bufferView\": 3,\n      \"componentType\": 5123,\n      \"count\": 576,\n      \"type\": \"SCALAR\"\n    }\n  ],\n  \"bufferViews\": [\n    {\n      \"buffer\": 0,\n      \"byteLength\": 1944,\n      \"byteOffset\": 0\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 1944,\n      \"byteOffset\": 1944\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 1296,\n      \"byteOffset\": 3888\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 1152,\n      \"byteOffset\": 5184\n    }\n  ],\n  \"buffers\": [\n    {\n      \"uri\": \"grass.bin\",\n      \"byteLength\": 6336\n    }\n  ]\n}"
  },
  {
    "path": "examples/resources/models/gltf/robot_arm/glTF/license.txt",
    "content": "Model Information:\n* title:\tGilberto A Robot Arm\n* source:\thttps://sketchfab.com/3d-models/gilberto-a-robot-arm-362d32e0b32945ae8174ebf71dae97f0\n* author:\tGilbertoA (https://sketchfab.com/GilbertoA)\n\nModel License:\n* license type:\tCC-BY-4.0 (http://creativecommons.org/licenses/by/4.0/)\n* requirements:\tAuthor must be credited. Commercial use is allowed.\n\nIf you use this 3D model in your project be sure to copy paste this credit wherever you share it:\nThis work is based on \"Gilberto A Robot Arm\" (https://sketchfab.com/3d-models/gilberto-a-robot-arm-362d32e0b32945ae8174ebf71dae97f0) by GilbertoA (https://sketchfab.com/GilbertoA) licensed under CC-BY-4.0 (http://creativecommons.org/licenses/by/4.0/)"
  },
  {
    "path": "examples/resources/models/gltf/robot_arm/glTF/scene.gltf",
    "content": "{\n  \"accessors\": [\n    {\n      \"bufferView\": 3,\n      \"componentType\": 5126,\n      \"count\": 6125,\n      \"max\": [\n        202.12489318847656,\n        508.0434265136719,\n        355.9891357421875\n      ],\n      \"min\": [\n        -202.12496948242188,\n        -1.1920940323761897e-06,\n        -202.12493896484375\n      ],\n      \"type\": \"VEC3\"\n    },\n    {\n      \"bufferView\": 3,\n      \"byteOffset\": 73500,\n      \"componentType\": 5126,\n      \"count\": 6125,\n      \"max\": [\n        1.0,\n        1.0,\n        1.0\n      ],\n      \"min\": [\n        -1.0,\n        -1.0,\n        -1.0\n      ],\n      \"type\": \"VEC3\"\n    },\n    {\n      \"bufferView\": 4,\n      \"componentType\": 5126,\n      \"count\": 6125,\n      \"max\": [\n        1.0,\n        1.0,\n        1.0,\n        1.0\n      ],\n      \"min\": [\n        -1.0,\n        -0.999963104724884,\n        -1.0,\n        -1.0\n      ],\n      \"type\": \"VEC4\"\n    },\n    {\n      \"bufferView\": 2,\n      \"componentType\": 5126,\n      \"count\": 6125,\n      \"max\": [\n        1.0,\n        0.997261643409729\n      ],\n      \"min\": [\n        -0.7044410109519958,\n        0.0\n      ],\n      \"type\": \"VEC2\"\n    },\n    {\n      \"bufferView\": 1,\n      \"componentType\": 5125,\n      \"count\": 29208,\n      \"type\": \"SCALAR\"\n    },\n    {\n      \"bufferView\": 3,\n      \"byteOffset\": 147000,\n      \"componentType\": 5126,\n      \"count\": 24,\n      \"max\": [\n        0.5,\n        1.0,\n        0.5\n      ],\n      \"min\": [\n        -0.5,\n        -1.0228283997548715e-08,\n        -0.5\n      ],\n      \"type\": \"VEC3\"\n    },\n    {\n      \"bufferView\": 3,\n      \"byteOffset\": 147288,\n      \"componentType\": 5126,\n      \"count\": 24,\n      \"max\": [\n        1.0,\n        1.0,\n        1.0\n      ],\n      \"min\": [\n        -1.0,\n        -1.0,\n        -1.0\n      ],\n      \"type\": \"VEC3\"\n    },\n    {\n      \"bufferView\": 2,\n      \"byteOffset\": 49000,\n      \"componentType\": 5126,\n      \"count\": 24,\n      \"max\": [\n        0.875,\n        1.0\n      ],\n      \"min\": [\n        0.125,\n        0.0\n      ],\n      \"type\": \"VEC2\"\n    },\n    {\n      \"bufferView\": 1,\n      \"byteOffset\": 116832,\n      \"componentType\": 5125,\n      \"count\": 36,\n      \"type\": \"SCALAR\"\n    },\n    {\n      \"bufferView\": 3,\n      \"byteOffset\": 147576,\n      \"componentType\": 5126,\n      \"count\": 24,\n      \"max\": [\n        0.5,\n        1.0,\n        0.5\n      ],\n      \"min\": [\n        -0.5,\n        -1.0228283997548715e-08,\n        -0.5\n      ],\n      \"type\": \"VEC3\"\n    },\n    {\n      \"bufferView\": 3,\n      \"byteOffset\": 147864,\n      \"componentType\": 5126,\n      \"count\": 24,\n      \"max\": [\n        1.0,\n        1.0,\n        1.0\n      ],\n      \"min\": [\n        -1.0,\n        -1.0,\n        -1.0\n      ],\n      \"type\": \"VEC3\"\n    },\n    {\n      \"bufferView\": 2,\n      \"byteOffset\": 49192,\n      \"componentType\": 5126,\n      \"count\": 24,\n      \"max\": [\n        0.875,\n        1.0\n      ],\n      \"min\": [\n        0.125,\n        0.0\n      ],\n      \"type\": \"VEC2\"\n    },\n    {\n      \"bufferView\": 1,\n      \"byteOffset\": 116976,\n      \"componentType\": 5125,\n      \"count\": 36,\n      \"type\": \"SCALAR\"\n    },\n    {\n      \"bufferView\": 5,\n      \"componentType\": 5126,\n      \"count\": 23,\n      \"max\": [\n        1.0,\n        0.002771326806396246,\n        0.9999961853027344,\n        0.0,\n        1.0,\n        1.0,\n        2.746702604944362e-13,\n        0.0,\n        0.9999976754188538,\n        2.6009152520600765e-07,\n        1.0,\n        0.0,\n        248.5543975830078,\n        328.1393127441406,\n        328.73565673828125,\n        1.0\n      ],\n      \"min\": [\n        -0.7515499591827393,\n        -1.0,\n        -0.9999990463256836,\n        0.0,\n        -0.999999463558197,\n        -0.7515499591827393,\n        -0.009517377242445946,\n        0.0,\n        -0.008283392526209354,\n        -0.9999955892562866,\n        -1.0,\n        0.0,\n        -285.9608459472656,\n        -475.56512451171875,\n        -328.7359924316406,\n        1.0\n      ],\n      \"type\": \"MAT4\"\n    },\n    {\n      \"bufferView\": 0,\n      \"componentType\": 5123,\n      \"count\": 6125,\n      \"type\": \"VEC4\"\n    },\n    {\n      \"bufferView\": 4,\n      \"byteOffset\": 98000,\n      \"componentType\": 5126,\n      \"count\": 6125,\n      \"max\": [\n        1.0,\n        0.0,\n        0.0,\n        0.0\n      ],\n      \"min\": [\n        1.0,\n        0.0,\n        0.0,\n        0.0\n      ],\n      \"type\": \"VEC4\"\n    },\n    {\n      \"bufferView\": 6,\n      \"componentType\": 5126,\n      \"count\": 142,\n      \"max\": [\n        8.541666984558105\n      ],\n      \"min\": [\n        1.2417634698280722e-09\n      ],\n      \"type\": \"SCALAR\"\n    },\n    {\n      \"bufferView\": 7,\n      \"componentType\": 5126,\n      \"count\": 142,\n      \"max\": [\n        313.05010986328125,\n        9.734435479913373e-13,\n        -9.556799795973347e-13\n      ],\n      \"min\": [\n        313.05010986328125,\n        9.663381206337363e-13,\n        -9.663381206337363e-13\n      ],\n      \"type\": \"VEC3\"\n    },\n    {\n      \"bufferView\": 6,\n      \"byteOffset\": 568,\n      \"componentType\": 5126,\n      \"count\": 140,\n      \"max\": [\n        8.541666984558105\n      ],\n      \"min\": [\n        1.2417634698280722e-09\n      ],\n      \"type\": \"SCALAR\"\n    },\n    {\n      \"bufferView\": 8,\n      \"componentType\": 5126,\n      \"count\": 140,\n      \"max\": [\n        -0.5074944496154785,\n        -0.4930981993675232,\n        -0.49240514636039734,\n        0.5067945718765259\n      ],\n      \"min\": [\n        -0.5074944496154785,\n        -0.4930981993675232,\n        -0.49240514636039734,\n        0.5067945718765259\n      ],\n      \"type\": \"VEC4\"\n    },\n    {\n      \"bufferView\": 6,\n      \"byteOffset\": 1128,\n      \"componentType\": 5126,\n      \"count\": 142,\n      \"max\": [\n        8.541666984558105\n      ],\n      \"min\": [\n        1.2417634698280722e-09\n      ],\n      \"type\": \"SCALAR\"\n    },\n    {\n      \"bufferView\": 8,\n      \"byteOffset\": 2240,\n      \"componentType\": 5126,\n      \"count\": 142,\n      \"max\": [\n        1.110136931667002e-16,\n        -0.004758742637932301,\n        7.77115919568562e-18,\n        0.9999886751174927\n      ],\n      \"min\": [\n        -1.387908482701494e-16,\n        -0.004758742637932301,\n        -9.791173129028903e-18,\n        0.9999886751174927\n      ],\n      \"type\": \"VEC4\"\n    },\n    {\n      \"bufferView\": 6,\n      \"byteOffset\": 1696,\n      \"componentType\": 5126,\n      \"count\": 185,\n      \"max\": [\n        8.041666984558105\n      ],\n      \"min\": [\n        0.0416666679084301\n      ],\n      \"type\": \"SCALAR\"\n    },\n    {\n      \"bufferView\": 7,\n      \"byteOffset\": 1704,\n      \"componentType\": 5126,\n      \"count\": 185,\n      \"max\": [\n        -28.952293395996094,\n        175.68385314941406,\n        -67.44589233398438\n      ],\n      \"min\": [\n        -202.48196411132813,\n        -79.14119720458984,\n        -266.7228088378906\n      ],\n      \"type\": \"VEC3\"\n    },\n    {\n      \"bufferView\": 6,\n      \"byteOffset\": 2436,\n      \"componentType\": 5126,\n      \"count\": 139,\n      \"max\": [\n        8.041666984558105\n      ],\n      \"min\": [\n        0.0416666679084301\n      ],\n      \"type\": \"SCALAR\"\n    },\n    {\n      \"bufferView\": 8,\n      \"byteOffset\": 4512,\n      \"componentType\": 5126,\n      \"count\": 139,\n      \"max\": [\n        7.806255641895632e-18,\n        8.326672684688674e-17,\n        5.421010862427522e-18,\n        1.0\n      ],\n      \"min\": [\n        -6.749158523722265e-18,\n        -8.326672684688674e-17,\n        -9.513874063560301e-18,\n        1.0\n      ],\n      \"type\": \"VEC4\"\n    },\n    {\n      \"bufferView\": 6,\n      \"byteOffset\": 2992,\n      \"componentType\": 5126,\n      \"count\": 140,\n      \"max\": [\n        8.541666984558105\n      ],\n      \"min\": [\n        1.2417634698280722e-09\n      ],\n      \"type\": \"SCALAR\"\n    },\n    {\n      \"bufferView\": 8,\n      \"byteOffset\": 6736,\n      \"componentType\": 5126,\n      \"count\": 140,\n      \"max\": [\n        -0.5051454305648804,\n        -0.49550431966781616,\n        -0.49481460452079773,\n        0.5044423341751099\n      ],\n      \"min\": [\n        -0.5051454305648804,\n        -0.49550431966781616,\n        -0.49481460452079773,\n        0.5044423341751099\n      ],\n      \"type\": \"VEC4\"\n    },\n    {\n      \"bufferView\": 6,\n      \"byteOffset\": 3552,\n      \"componentType\": 5126,\n      \"count\": 137,\n      \"max\": [\n        7.041666507720947\n      ],\n      \"min\": [\n        0.0416666679084301\n      ],\n      \"type\": \"SCALAR\"\n    },\n    {\n      \"bufferView\": 7,\n      \"byteOffset\": 3924,\n      \"componentType\": 5126,\n      \"count\": 137,\n      \"max\": [\n        0.0,\n        8.79539107154605e-16,\n        5.702295596430804e-14\n      ],\n      \"min\": [\n        0.0,\n        -5.222353175989361e-14,\n        -5.4320277117526905e-14\n      ],\n      \"type\": \"VEC3\"\n    },\n    {\n      \"bufferView\": 6,\n      \"byteOffset\": 4100,\n      \"componentType\": 5126,\n      \"count\": 137,\n      \"max\": [\n        7.041666507720947\n      ],\n      \"min\": [\n        0.0416666679084301\n      ],\n      \"type\": \"SCALAR\"\n    },\n    {\n      \"bufferView\": 8,\n      \"byteOffset\": 8976,\n      \"componentType\": 5126,\n      \"count\": 137,\n      \"max\": [\n        0.683461606502533,\n        0.0070043583400547504,\n        0.01686592400074005,\n        0.9998577833175659\n      ],\n      \"min\": [\n        -0.6013435125350952,\n        -0.013909111730754375,\n        0.009539208374917507,\n        0.7297916412353516\n      ],\n      \"type\": \"VEC4\"\n    },\n    {\n      \"bufferView\": 6,\n      \"byteOffset\": 4648,\n      \"componentType\": 5126,\n      \"count\": 84,\n      \"max\": [\n        8.041666984558105\n      ],\n      \"min\": [\n        0.0416666679084301\n      ],\n      \"type\": \"SCALAR\"\n    },\n    {\n      \"bufferView\": 7,\n      \"byteOffset\": 5568,\n      \"componentType\": 5126,\n      \"count\": 84,\n      \"max\": [\n        -1.1038569027732592e-06,\n        1.128343569689605e-06,\n        -4.977417120244354e-06\n      ],\n      \"min\": [\n        -1.1038571301469347e-06,\n        1.1283433423159295e-06,\n        -4.977417120244354e-06\n      ],\n      \"type\": \"VEC3\"\n    },\n    {\n      \"bufferView\": 6,\n      \"byteOffset\": 4984,\n      \"componentType\": 5126,\n      \"count\": 233,\n      \"max\": [\n        8.041666984558105\n      ],\n      \"min\": [\n        0.0416666679084301\n      ],\n      \"type\": \"SCALAR\"\n    },\n    {\n      \"bufferView\": 8,\n      \"byteOffset\": 11168,\n      \"componentType\": 5126,\n      \"count\": 233,\n      \"max\": [\n        1.1484186518926091e-16,\n        1.1071140828364882e-16,\n        0.258819043636322,\n        1.0\n      ],\n      \"min\": [\n        -1.1102230246251565e-16,\n        -1.160303847631567e-16,\n        -1.3877787807814457e-16,\n        0.9659258127212524\n      ],\n      \"type\": \"VEC4\"\n    },\n    {\n      \"bufferView\": 6,\n      \"byteOffset\": 5916,\n      \"componentType\": 5126,\n      \"count\": 5,\n      \"max\": [\n        8.041666984558105\n      ],\n      \"min\": [\n        0.0416666679084301\n      ],\n      \"type\": \"SCALAR\"\n    },\n    {\n      \"bufferView\": 7,\n      \"byteOffset\": 6576,\n      \"componentType\": 5126,\n      \"count\": 5,\n      \"max\": [\n        -4.237911525706295e-06,\n        4.726242877950426e-06,\n        -7.568358341814019e-06\n      ],\n      \"min\": [\n        -4.237911525706295e-06,\n        4.726242877950426e-06,\n        -7.56835879656137e-06\n      ],\n      \"type\": \"VEC3\"\n    },\n    {\n      \"bufferView\": 6,\n      \"byteOffset\": 5936,\n      \"componentType\": 5126,\n      \"count\": 233,\n      \"max\": [\n        8.041666984558105\n      ],\n      \"min\": [\n        0.0416666679084301\n      ],\n      \"type\": \"SCALAR\"\n    },\n    {\n      \"bufferView\": 8,\n      \"byteOffset\": 14896,\n      \"componentType\": 5126,\n      \"count\": 233,\n      \"max\": [\n        1.3659664912495654e-16,\n        1.1137439023588763e-16,\n        0.258819043636322,\n        1.0\n      ],\n      \"min\": [\n        -1.250292363250068e-16,\n        -1.1345159295524099e-16,\n        -1.249000902703301e-16,\n        0.9659258127212524\n      ],\n      \"type\": \"VEC4\"\n    },\n    {\n      \"bufferView\": 6,\n      \"byteOffset\": 6868,\n      \"componentType\": 5126,\n      \"count\": 200,\n      \"max\": [\n        7.541666507720947\n      ],\n      \"min\": [\n        0.0416666679084301\n      ],\n      \"type\": \"SCALAR\"\n    },\n    {\n      \"bufferView\": 8,\n      \"byteOffset\": 18624,\n      \"componentType\": 5126,\n      \"count\": 200,\n      \"max\": [\n        1.0,\n        1.115658990913059e-16,\n        1.3877787807814457e-16,\n        1.0\n      ],\n      \"min\": [\n        -0.8476265072822571,\n        -5.844287122804787e-17,\n        -1.1102230246251565e-16,\n        -0.48012101650238037\n      ],\n      \"type\": \"VEC4\"\n    },\n    {\n      \"bufferView\": 6,\n      \"byteOffset\": 7668,\n      \"componentType\": 5126,\n      \"count\": 197,\n      \"max\": [\n        7.541666507720947\n      ],\n      \"min\": [\n        0.0416666679084301\n      ],\n      \"type\": \"SCALAR\"\n    },\n    {\n      \"bufferView\": 7,\n      \"byteOffset\": 6636,\n      \"componentType\": 5126,\n      \"count\": 197,\n      \"max\": [\n        -7.676888344576582e-06,\n        -2.404088661478454e-07,\n        1.9511787741066655e-08\n      ],\n      \"min\": [\n        -7.676888344576582e-06,\n        -2.404090650998114e-07,\n        1.9511674054228934e-08\n      ],\n      \"type\": \"VEC3\"\n    },\n    {\n      \"bufferView\": 6,\n      \"byteOffset\": 8456,\n      \"componentType\": 5126,\n      \"count\": 200,\n      \"max\": [\n        7.541666507720947\n      ],\n      \"min\": [\n        0.0416666679084301\n      ],\n      \"type\": \"SCALAR\"\n    },\n    {\n      \"bufferView\": 8,\n      \"byteOffset\": 21824,\n      \"componentType\": 5126,\n      \"count\": 200,\n      \"max\": [\n        5.551115123125783e-17,\n        1.1102230246251565e-16,\n        1.1102230246251565e-16,\n        1.0\n      ],\n      \"min\": [\n        -8.326672684688674e-17,\n        -8.326672684688674e-17,\n        -1.1102230246251565e-16,\n        1.0\n      ],\n      \"type\": \"VEC4\"\n    },\n    {\n      \"bufferView\": 6,\n      \"byteOffset\": 9256,\n      \"componentType\": 5126,\n      \"count\": 229,\n      \"max\": [\n        8.541666984558105\n      ],\n      \"min\": [\n        0.0416666679084301\n      ],\n      \"type\": \"SCALAR\"\n    },\n    {\n      \"bufferView\": 7,\n      \"byteOffset\": 9000,\n      \"componentType\": 5126,\n      \"count\": 229,\n      \"max\": [\n        -4.547473508864641e-13,\n        1.054615950124571e-09,\n        2.842170943040401e-14\n      ],\n      \"min\": [\n        -1.684099970589159e-09,\n        -4.915534645988373e-09,\n        -2.842170943040401e-14\n      ],\n      \"type\": \"VEC3\"\n    },\n    {\n      \"bufferView\": 6,\n      \"byteOffset\": 10172,\n      \"componentType\": 5126,\n      \"count\": 231,\n      \"max\": [\n        8.541666984558105\n      ],\n      \"min\": [\n        0.0416666679084301\n      ],\n      \"type\": \"SCALAR\"\n    },\n    {\n      \"bufferView\": 8,\n      \"byteOffset\": 25024,\n      \"componentType\": 5126,\n      \"count\": 231,\n      \"max\": [\n        -2.6206410257743677e-17,\n        9.837974677214908e-17,\n        0.0660829097032547,\n        0.9999938607215881\n      ],\n      \"min\": [\n        -2.3705127589329893e-16,\n        -5.137215451300174e-17,\n        -0.32484546303749084,\n        0.9457671046257019\n      ],\n      \"type\": \"VEC4\"\n    },\n    {\n      \"bufferView\": 6,\n      \"byteOffset\": 11096,\n      \"componentType\": 5126,\n      \"count\": 337,\n      \"max\": [\n        8.541666984558105\n      ],\n      \"min\": [\n        1.2417634698280722e-09\n      ],\n      \"type\": \"SCALAR\"\n    },\n    {\n      \"bufferView\": 7,\n      \"byteOffset\": 11748,\n      \"componentType\": 5126,\n      \"count\": 337,\n      \"max\": [\n        318.54022216796875,\n        630.33740234375,\n        237.40353393554688\n      ],\n      \"min\": [\n        -12.112994194030762,\n        386.9071350097656,\n        -248.53347778320313\n      ],\n      \"type\": \"VEC3\"\n    },\n    {\n      \"bufferView\": 6,\n      \"byteOffset\": 12444,\n      \"componentType\": 5126,\n      \"count\": 337,\n      \"max\": [\n        8.541666984558105\n      ],\n      \"min\": [\n        1.2417634698280722e-09\n      ],\n      \"type\": \"SCALAR\"\n    },\n    {\n      \"bufferView\": 8,\n      \"byteOffset\": 28720,\n      \"componentType\": 5126,\n      \"count\": 337,\n      \"max\": [\n        0.04600140079855919,\n        0.42464447021484375,\n        0.3964240849018097,\n        0.9999402165412903\n      ],\n      \"min\": [\n        -0.23962785303592682,\n        -0.7070702910423279,\n        -0.10814829170703888,\n        0.6947174072265625\n      ],\n      \"type\": \"VEC4\"\n    },\n    {\n      \"bufferView\": 6,\n      \"byteOffset\": 13792,\n      \"componentType\": 5126,\n      \"count\": 387,\n      \"max\": [\n        8.541666984558105\n      ],\n      \"min\": [\n        1.2417634698280722e-09\n      ],\n      \"type\": \"SCALAR\"\n    },\n    {\n      \"bufferView\": 8,\n      \"byteOffset\": 34112,\n      \"componentType\": 5126,\n      \"count\": 387,\n      \"max\": [\n        -0.5472221970558167,\n        0.4493703544139862,\n        0.4475567936897278,\n        0.6436712145805359\n      ],\n      \"min\": [\n        -0.6451535820960999,\n        0.291826456785202,\n        0.290347158908844,\n        0.546174943447113\n      ],\n      \"type\": \"VEC4\"\n    },\n    {\n      \"bufferView\": 6,\n      \"byteOffset\": 15340,\n      \"componentType\": 5126,\n      \"count\": 383,\n      \"max\": [\n        8.541666984558105\n      ],\n      \"min\": [\n        1.2417634698280722e-09\n      ],\n      \"type\": \"SCALAR\"\n    },\n    {\n      \"bufferView\": 8,\n      \"byteOffset\": 40304,\n      \"componentType\": 5126,\n      \"count\": 383,\n      \"max\": [\n        -0.2910188138484955,\n        -0.5457077622413635,\n        0.6454575657844543,\n        -0.2911529242992401\n      ],\n      \"min\": [\n        -0.4481267035007477,\n        -0.643368124961853,\n        0.5476906299591064,\n        -0.44879886507987976\n      ],\n      \"type\": \"VEC4\"\n    },\n    {\n      \"bufferView\": 6,\n      \"byteOffset\": 16872,\n      \"componentType\": 5126,\n      \"count\": 348,\n      \"max\": [\n        8.541666984558105\n      ],\n      \"min\": [\n        1.2417634698280722e-09\n      ],\n      \"type\": \"SCALAR\"\n    },\n    {\n      \"bufferView\": 7,\n      \"byteOffset\": 15792,\n      \"componentType\": 5126,\n      \"count\": 348,\n      \"max\": [\n        45.730587005615234,\n        2.2737367544323206e-13,\n        5.684341886080802e-14\n      ],\n      \"min\": [\n        45.730587005615234,\n        -1.1368683772161603e-13,\n        -5.684341886080802e-14\n      ],\n      \"type\": \"VEC3\"\n    },\n    {\n      \"bufferView\": 6,\n      \"byteOffset\": 18264,\n      \"componentType\": 5126,\n      \"count\": 357,\n      \"max\": [\n        8.541666984558105\n      ],\n      \"min\": [\n        1.2417634698280722e-09\n      ],\n      \"type\": \"SCALAR\"\n    },\n    {\n      \"bufferView\": 8,\n      \"byteOffset\": 46432,\n      \"componentType\": 5126,\n      \"count\": 357,\n      \"max\": [\n        0.9999813437461853,\n        0.0031017654109746218,\n        0.0017947877058759332,\n        0.9999909400939941\n      ],\n      \"min\": [\n        -0.8575454950332642,\n        -0.003620013128966093,\n        -0.0036200748290866613,\n        -0.4945509731769562\n      ],\n      \"type\": \"VEC4\"\n    },\n    {\n      \"bufferView\": 6,\n      \"byteOffset\": 19692,\n      \"componentType\": 5126,\n      \"count\": 357,\n      \"max\": [\n        8.541666984558105\n      ],\n      \"min\": [\n        1.2417634698280722e-09\n      ],\n      \"type\": \"SCALAR\"\n    },\n    {\n      \"bufferView\": 7,\n      \"byteOffset\": 19968,\n      \"componentType\": 5126,\n      \"count\": 357,\n      \"max\": [\n        220.04998779296875,\n        1.0231815394945443e-12,\n        -3.010669047398551e-09\n      ],\n      \"min\": [\n        220.04998779296875,\n        4.547473508864641e-13,\n        -3.0109390536381397e-09\n      ],\n      \"type\": \"VEC3\"\n    },\n    {\n      \"bufferView\": 6,\n      \"byteOffset\": 21120,\n      \"componentType\": 5126,\n      \"count\": 357,\n      \"max\": [\n        8.541666984558105\n      ],\n      \"min\": [\n        1.2417634698280722e-09\n      ],\n      \"type\": \"SCALAR\"\n    },\n    {\n      \"bufferView\": 8,\n      \"byteOffset\": 52144,\n      \"componentType\": 5126,\n      \"count\": 357,\n      \"max\": [\n        -0.65187007188797,\n        0.7582981586456299,\n        -0.004577083513140678,\n        -0.005324366502463818\n      ],\n      \"min\": [\n        -0.65187007188797,\n        0.7582981586456299,\n        -0.004577083513140678,\n        -0.005324366502463818\n      ],\n      \"type\": \"VEC4\"\n    },\n    {\n      \"bufferView\": 6,\n      \"byteOffset\": 22548,\n      \"componentType\": 5126,\n      \"count\": 166,\n      \"max\": [\n        8.541666984558105\n      ],\n      \"min\": [\n        1.2417634698280722e-09\n      ],\n      \"type\": \"SCALAR\"\n    },\n    {\n      \"bufferView\": 7,\n      \"byteOffset\": 24252,\n      \"componentType\": 5126,\n      \"count\": 166,\n      \"max\": [\n        98.12543487548828,\n        12.167859077453613,\n        0.013729646801948547\n      ],\n      \"min\": [\n        88.89757537841797,\n        10.043222427368164,\n        -0.0029429341666400433\n      ],\n      \"type\": \"VEC3\"\n    },\n    {\n      \"bufferView\": 6,\n      \"byteOffset\": 23212,\n      \"componentType\": 5126,\n      \"count\": 357,\n      \"max\": [\n        8.541666984558105\n      ],\n      \"min\": [\n        1.2417634698280722e-09\n      ],\n      \"type\": \"SCALAR\"\n    },\n    {\n      \"bufferView\": 8,\n      \"byteOffset\": 57856,\n      \"componentType\": 5126,\n      \"count\": 357,\n      \"max\": [\n        0.06891659647226334,\n        0.7087311148643494,\n        0.2088788002729416,\n        0.705477237701416\n      ],\n      \"min\": [\n        -0.2089976817369461,\n        0.6770735383033752,\n        -0.0687708631157875,\n        0.673988938331604\n      ],\n      \"type\": \"VEC4\"\n    },\n    {\n      \"bufferView\": 6,\n      \"byteOffset\": 24640,\n      \"componentType\": 5126,\n      \"count\": 337,\n      \"max\": [\n        8.541666984558105\n      ],\n      \"min\": [\n        1.2417634698280722e-09\n      ],\n      \"type\": \"SCALAR\"\n    },\n    {\n      \"bufferView\": 8,\n      \"byteOffset\": 63568,\n      \"componentType\": 5126,\n      \"count\": 337,\n      \"max\": [\n        -6.586460949620232e-05,\n        -0.0016048576217144728,\n        0.02174687571823597,\n        0.999762237071991\n      ],\n      \"min\": [\n        -6.586460949620232e-05,\n        -0.0016048576217144728,\n        0.02174687571823597,\n        0.999762237071991\n      ],\n      \"type\": \"VEC4\"\n    },\n    {\n      \"bufferView\": 6,\n      \"byteOffset\": 25988,\n      \"componentType\": 5126,\n      \"count\": 337,\n      \"max\": [\n        8.541666984558105\n      ],\n      \"min\": [\n        1.2417634698280722e-09\n      ],\n      \"type\": \"SCALAR\"\n    },\n    {\n      \"bufferView\": 7,\n      \"byteOffset\": 26244,\n      \"componentType\": 5126,\n      \"count\": 337,\n      \"max\": [\n        313.05010986328125,\n        1.0118572646433677e-12,\n        -7.887024366937112e-13\n      ],\n      \"min\": [\n        313.05010986328125,\n        8.8662410746565e-13,\n        -1.0871303857129533e-12\n      ],\n      \"type\": \"VEC3\"\n    },\n    {\n      \"bufferView\": 6,\n      \"byteOffset\": 27336,\n      \"componentType\": 5126,\n      \"count\": 337,\n      \"max\": [\n        8.541666984558105\n      ],\n      \"min\": [\n        1.2417634698280722e-09\n      ],\n      \"type\": \"SCALAR\"\n    },\n    {\n      \"bufferView\": 8,\n      \"byteOffset\": 68960,\n      \"componentType\": 5126,\n      \"count\": 337,\n      \"max\": [\n        0.4998927116394043,\n        0.6076653003692627,\n        0.6070996522903442,\n        0.68681401014328\n      ],\n      \"min\": [\n        -0.6869204044342041,\n        -0.4991248846054077,\n        -0.4984317123889923,\n        -0.4991729259490967\n      ],\n      \"type\": \"VEC4\"\n    },\n    {\n      \"bufferView\": 6,\n      \"byteOffset\": 28684,\n      \"componentType\": 5126,\n      \"count\": 337,\n      \"max\": [\n        8.541666984558105\n      ],\n      \"min\": [\n        1.2417634698280722e-09\n      ],\n      \"type\": \"SCALAR\"\n    },\n    {\n      \"bufferView\": 8,\n      \"byteOffset\": 74352,\n      \"componentType\": 5126,\n      \"count\": 337,\n      \"max\": [\n        0.9408049583435059,\n        0.23972687125205994,\n        0.20430870354175568,\n        0.9997484683990479\n      ],\n      \"min\": [\n        -0.004368336405605078,\n        -0.1358264684677124,\n        -0.16257184743881226,\n        0.3319318890571594\n      ],\n      \"type\": \"VEC4\"\n    },\n    {\n      \"bufferView\": 6,\n      \"byteOffset\": 30032,\n      \"componentType\": 5126,\n      \"count\": 230,\n      \"max\": [\n        8.541666984558105\n      ],\n      \"min\": [\n        1.2417634698280722e-09\n      ],\n      \"type\": \"SCALAR\"\n    },\n    {\n      \"bufferView\": 7,\n      \"byteOffset\": 30288,\n      \"componentType\": 5126,\n      \"count\": 230,\n      \"max\": [\n        313.05010986328125,\n        9.627854069549358e-13,\n        -9.556799795973347e-13\n      ],\n      \"min\": [\n        313.05010986328125,\n        9.543477119677846e-13,\n        -9.654499422140361e-13\n      ],\n      \"type\": \"VEC3\"\n    },\n    {\n      \"bufferView\": 6,\n      \"byteOffset\": 30952,\n      \"componentType\": 5126,\n      \"count\": 228,\n      \"max\": [\n        8.541666984558105\n      ],\n      \"min\": [\n        1.2417634698280722e-09\n      ],\n      \"type\": \"SCALAR\"\n    },\n    {\n      \"bufferView\": 8,\n      \"byteOffset\": 79744,\n      \"componentType\": 5126,\n      \"count\": 228,\n      \"max\": [\n        -0.5074944496154785,\n        -0.4930981993675232,\n        -0.49240514636039734,\n        0.5067945718765259\n      ],\n      \"min\": [\n        -0.5074944496154785,\n        -0.4930981993675232,\n        -0.49240514636039734,\n        0.5067945718765259\n      ],\n      \"type\": \"VEC4\"\n    },\n    {\n      \"bufferView\": 6,\n      \"byteOffset\": 31864,\n      \"componentType\": 5126,\n      \"count\": 232,\n      \"max\": [\n        8.541666984558105\n      ],\n      \"min\": [\n        1.2417634698280722e-09\n      ],\n      \"type\": \"SCALAR\"\n    },\n    {\n      \"bufferView\": 8,\n      \"byteOffset\": 83392,\n      \"componentType\": 5126,\n      \"count\": 232,\n      \"max\": [\n        0.6840468049049377,\n        0.007014197297394276,\n        0.016513004899024963,\n        0.9998577833175659\n      ],\n      \"min\": [\n        -0.6018123626708984,\n        -0.013916215859353542,\n        0.008828219957649708,\n        0.7293509840965271\n      ],\n      \"type\": \"VEC4\"\n    },\n    {\n      \"bufferView\": 6,\n      \"byteOffset\": 32792,\n      \"componentType\": 5126,\n      \"count\": 337,\n      \"max\": [\n        8.541666984558105\n      ],\n      \"min\": [\n        1.2417634698280722e-09\n      ],\n      \"type\": \"SCALAR\"\n    },\n    {\n      \"bufferView\": 8,\n      \"byteOffset\": 87104,\n      \"componentType\": 5126,\n      \"count\": 337,\n      \"max\": [\n        8.326672684688674e-17,\n        1.3877787807814457e-16,\n        1.1102230246251565e-16,\n        1.0\n      ],\n      \"min\": [\n        -8.326672684688674e-17,\n        -1.3877787807814457e-16,\n        -1.1102230246251565e-16,\n        1.0\n      ],\n      \"type\": \"VEC4\"\n    },\n    {\n      \"bufferView\": 6,\n      \"byteOffset\": 34140,\n      \"componentType\": 5126,\n      \"count\": 337,\n      \"max\": [\n        8.541666984558105\n      ],\n      \"min\": [\n        1.2417634698280722e-09\n      ],\n      \"type\": \"SCALAR\"\n    },\n    {\n      \"bufferView\": 7,\n      \"byteOffset\": 33048,\n      \"componentType\": 5126,\n      \"count\": 337,\n      \"max\": [\n        313.05010986328125,\n        9.796607969292381e-13,\n        -9.166001291305292e-13\n      ],\n      \"min\": [\n        313.05010986328125,\n        9.29034627006331e-13,\n        -1.0231815394945443e-12\n      ],\n      \"type\": \"VEC3\"\n    },\n    {\n      \"bufferView\": 6,\n      \"byteOffset\": 35488,\n      \"componentType\": 5126,\n      \"count\": 337,\n      \"max\": [\n        8.541666984558105\n      ],\n      \"min\": [\n        1.2417634698280722e-09\n      ],\n      \"type\": \"SCALAR\"\n    },\n    {\n      \"bufferView\": 8,\n      \"byteOffset\": 92496,\n      \"componentType\": 5126,\n      \"count\": 337,\n      \"max\": [\n        0.4998927116394043,\n        0.6076653003692627,\n        0.6070996522903442,\n        0.68681401014328\n      ],\n      \"min\": [\n        -0.6869204044342041,\n        -0.4991248846054077,\n        -0.4984317123889923,\n        -0.4991729259490967\n      ],\n      \"type\": \"VEC4\"\n    },\n    {\n      \"bufferView\": 6,\n      \"byteOffset\": 36836,\n      \"componentType\": 5126,\n      \"count\": 337,\n      \"max\": [\n        8.541666984558105\n      ],\n      \"min\": [\n        1.2417634698280722e-09\n      ],\n      \"type\": \"SCALAR\"\n    },\n    {\n      \"bufferView\": 8,\n      \"byteOffset\": 97888,\n      \"componentType\": 5126,\n      \"count\": 337,\n      \"max\": [\n        0.9407076239585876,\n        0.2443431168794632,\n        0.1999777853488922,\n        0.999740481376648\n      ],\n      \"min\": [\n        -0.004273300990462303,\n        -0.13228261470794678,\n        -0.16697582602500916,\n        0.33217671513557434\n      ],\n      \"type\": \"VEC4\"\n    },\n    {\n      \"bufferView\": 6,\n      \"byteOffset\": 38184,\n      \"componentType\": 5126,\n      \"count\": 111,\n      \"max\": [\n        8.541666984558105\n      ],\n      \"min\": [\n        1.2417634698280722e-09\n      ],\n      \"type\": \"SCALAR\"\n    },\n    {\n      \"bufferView\": 7,\n      \"byteOffset\": 37092,\n      \"componentType\": 5126,\n      \"count\": 111,\n      \"max\": [\n        335.1918640136719,\n        407.3770446777344,\n        611.0030517578125\n      ],\n      \"min\": [\n        -0.025772370398044586,\n        -7.046273231506348,\n        249.3863525390625\n      ],\n      \"type\": \"VEC3\"\n    },\n    {\n      \"bufferView\": 6,\n      \"byteOffset\": 38628,\n      \"componentType\": 5126,\n      \"count\": 111,\n      \"max\": [\n        8.541666984558105\n      ],\n      \"min\": [\n        1.2417634698280722e-09\n      ],\n      \"type\": \"SCALAR\"\n    },\n    {\n      \"bufferView\": 8,\n      \"byteOffset\": 103280,\n      \"componentType\": 5126,\n      \"count\": 111,\n      \"max\": [\n        0.14067663252353668,\n        0.4137909412384033,\n        0.04096294194459915,\n        1.0\n      ],\n      \"min\": [\n        -0.16367553174495697,\n        -3.627369005698711e-05,\n        -0.04674958065152168,\n        0.9055138826370239\n      ],\n      \"type\": \"VEC4\"\n    },\n    {\n      \"bufferView\": 6,\n      \"byteOffset\": 39072,\n      \"componentType\": 5126,\n      \"count\": 55,\n      \"max\": [\n        8.541666984558105\n      ],\n      \"min\": [\n        1.2417634698280722e-09\n      ],\n      \"type\": \"SCALAR\"\n    },\n    {\n      \"bufferView\": 7,\n      \"byteOffset\": 38424,\n      \"componentType\": 5126,\n      \"count\": 55,\n      \"max\": [\n        690.0953979492188,\n        175.10842895507813,\n        97.23301696777344\n      ],\n      \"min\": [\n        359.1990051269531,\n        -0.18982672691345215,\n        -425.05828857421875\n      ],\n      \"type\": \"VEC3\"\n    },\n    {\n      \"bufferView\": 6,\n      \"byteOffset\": 39292,\n      \"componentType\": 5126,\n      \"count\": 55,\n      \"max\": [\n        8.541666984558105\n      ],\n      \"min\": [\n        1.2417634698280722e-09\n      ],\n      \"type\": \"SCALAR\"\n    },\n    {\n      \"bufferView\": 8,\n      \"byteOffset\": 105056,\n      \"componentType\": 5126,\n      \"count\": 55,\n      \"max\": [\n        0.06280556321144104,\n        0.9526336193084717,\n        0.37870773673057556,\n        0.962663471698761\n      ],\n      \"min\": [\n        -0.40558043122291565,\n        -0.8528416752815247,\n        -0.03827761113643646,\n        -0.48484617471694946\n      ],\n      \"type\": \"VEC4\"\n    }\n  ],\n  \"animations\": [\n    {\n      \"channels\": [\n        {\n          \"sampler\": 0,\n          \"target\": {\n            \"node\": 12,\n            \"path\": \"translation\"\n          }\n        },\n        {\n          \"sampler\": 1,\n          \"target\": {\n            \"node\": 12,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 2,\n          \"target\": {\n            \"node\": 10,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 3,\n          \"target\": {\n            \"node\": 16,\n            \"path\": \"translation\"\n          }\n        },\n        {\n          \"sampler\": 4,\n          \"target\": {\n            \"node\": 16,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 5,\n          \"target\": {\n            \"node\": 15,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 6,\n          \"target\": {\n            \"node\": 9,\n            \"path\": \"translation\"\n          }\n        },\n        {\n          \"sampler\": 7,\n          \"target\": {\n            \"node\": 9,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 8,\n          \"target\": {\n            \"node\": 26,\n            \"path\": \"translation\"\n          }\n        },\n        {\n          \"sampler\": 9,\n          \"target\": {\n            \"node\": 26,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 10,\n          \"target\": {\n            \"node\": 28,\n            \"path\": \"translation\"\n          }\n        },\n        {\n          \"sampler\": 11,\n          \"target\": {\n            \"node\": 28,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 12,\n          \"target\": {\n            \"node\": 24,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 13,\n          \"target\": {\n            \"node\": 22,\n            \"path\": \"translation\"\n          }\n        },\n        {\n          \"sampler\": 14,\n          \"target\": {\n            \"node\": 22,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 15,\n          \"target\": {\n            \"node\": 20,\n            \"path\": \"translation\"\n          }\n        },\n        {\n          \"sampler\": 16,\n          \"target\": {\n            \"node\": 20,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 17,\n          \"target\": {\n            \"node\": 18,\n            \"path\": \"translation\"\n          }\n        },\n        {\n          \"sampler\": 18,\n          \"target\": {\n            \"node\": 18,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 19,\n          \"target\": {\n            \"node\": 45,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 20,\n          \"target\": {\n            \"node\": 47,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 21,\n          \"target\": {\n            \"node\": 43,\n            \"path\": \"translation\"\n          }\n        },\n        {\n          \"sampler\": 22,\n          \"target\": {\n            \"node\": 43,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 23,\n          \"target\": {\n            \"node\": 41,\n            \"path\": \"translation\"\n          }\n        },\n        {\n          \"sampler\": 24,\n          \"target\": {\n            \"node\": 41,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 25,\n          \"target\": {\n            \"node\": 39,\n            \"path\": \"translation\"\n          }\n        },\n        {\n          \"sampler\": 26,\n          \"target\": {\n            \"node\": 39,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 27,\n          \"target\": {\n            \"node\": 38,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 28,\n          \"target\": {\n            \"node\": 37,\n            \"path\": \"translation\"\n          }\n        },\n        {\n          \"sampler\": 29,\n          \"target\": {\n            \"node\": 37,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 30,\n          \"target\": {\n            \"node\": 36,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 31,\n          \"target\": {\n            \"node\": 51,\n            \"path\": \"translation\"\n          }\n        },\n        {\n          \"sampler\": 32,\n          \"target\": {\n            \"node\": 51,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 33,\n          \"target\": {\n            \"node\": 50,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 34,\n          \"target\": {\n            \"node\": 55,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 35,\n          \"target\": {\n            \"node\": 54,\n            \"path\": \"translation\"\n          }\n        },\n        {\n          \"sampler\": 36,\n          \"target\": {\n            \"node\": 54,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 37,\n          \"target\": {\n            \"node\": 53,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 38,\n          \"target\": {\n            \"node\": 59,\n            \"path\": \"translation\"\n          }\n        },\n        {\n          \"sampler\": 39,\n          \"target\": {\n            \"node\": 59,\n            \"path\": \"rotation\"\n          }\n        },\n        {\n          \"sampler\": 40,\n          \"target\": {\n            \"node\": 61,\n            \"path\": \"translation\"\n          }\n        },\n        {\n          \"sampler\": 41,\n          \"target\": {\n            \"node\": 61,\n            \"path\": \"rotation\"\n          }\n        }\n      ],\n      \"name\": \"Take 001\",\n      \"samplers\": [\n        {\n          \"input\": 16,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 17\n        },\n        {\n          \"input\": 18,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 19\n        },\n        {\n          \"input\": 20,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 21\n        },\n        {\n          \"input\": 22,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 23\n        },\n        {\n          \"input\": 24,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 25\n        },\n        {\n          \"input\": 26,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 27\n        },\n        {\n          \"input\": 28,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 29\n        },\n        {\n          \"input\": 30,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 31\n        },\n        {\n          \"input\": 32,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 33\n        },\n        {\n          \"input\": 34,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 35\n        },\n        {\n          \"input\": 36,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 37\n        },\n        {\n          \"input\": 38,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 39\n        },\n        {\n          \"input\": 40,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 41\n        },\n        {\n          \"input\": 42,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 43\n        },\n        {\n          \"input\": 44,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 45\n        },\n        {\n          \"input\": 46,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 47\n        },\n        {\n          \"input\": 48,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 49\n        },\n        {\n          \"input\": 50,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 51\n        },\n        {\n          \"input\": 52,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 53\n        },\n        {\n          \"input\": 54,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 55\n        },\n        {\n          \"input\": 56,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 57\n        },\n        {\n          \"input\": 58,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 59\n        },\n        {\n          \"input\": 60,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 61\n        },\n        {\n          \"input\": 62,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 63\n        },\n        {\n          \"input\": 64,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 65\n        },\n        {\n          \"input\": 66,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 67\n        },\n        {\n          \"input\": 68,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 69\n        },\n        {\n          \"input\": 70,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 71\n        },\n        {\n          \"input\": 72,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 73\n        },\n        {\n          \"input\": 74,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 75\n        },\n        {\n          \"input\": 76,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 77\n        },\n        {\n          \"input\": 78,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 79\n        },\n        {\n          \"input\": 80,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 81\n        },\n        {\n          \"input\": 82,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 83\n        },\n        {\n          \"input\": 84,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 85\n        },\n        {\n          \"input\": 86,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 87\n        },\n        {\n          \"input\": 88,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 89\n        },\n        {\n          \"input\": 90,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 91\n        },\n        {\n          \"input\": 92,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 93\n        },\n        {\n          \"input\": 94,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 95\n        },\n        {\n          \"input\": 96,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 97\n        },\n        {\n          \"input\": 98,\n          \"interpolation\": \"LINEAR\",\n          \"output\": 99\n        }\n      ]\n    }\n  ],\n  \"asset\": {\n    \"extras\": {\n      \"author\": \"GilbertoA (https://sketchfab.com/GilbertoA)\",\n      \"license\": \"CC-BY-4.0 (http://creativecommons.org/licenses/by/4.0/)\",\n      \"source\": \"https://sketchfab.com/3d-models/gilberto-a-robot-arm-362d32e0b32945ae8174ebf71dae97f0\",\n      \"title\": \"Gilberto A Robot Arm\"\n    },\n    \"generator\": \"Sketchfab-12.68.0\",\n    \"version\": \"2.0\"\n  },\n  \"bufferViews\": [\n    {\n      \"buffer\": 0,\n      \"byteLength\": 49000,\n      \"byteStride\": 8,\n      \"name\": \"shortBufferViews\",\n      \"target\": 34962\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 117120,\n      \"byteOffset\": 49000,\n      \"name\": \"floatBufferViews\",\n      \"target\": 34963\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 49384,\n      \"byteOffset\": 166120,\n      \"byteStride\": 8,\n      \"name\": \"floatBufferViews\",\n      \"target\": 34962\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 148152,\n      \"byteOffset\": 215504,\n      \"byteStride\": 12,\n      \"name\": \"floatBufferViews\",\n      \"target\": 34962\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 196000,\n      \"byteOffset\": 363656,\n      \"byteStride\": 16,\n      \"name\": \"floatBufferViews\",\n      \"target\": 34962\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 1472,\n      \"byteOffset\": 559656,\n      \"name\": \"floatBufferViews\"\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 39512,\n      \"byteOffset\": 561128,\n      \"name\": \"floatBufferViews\"\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 39084,\n      \"byteOffset\": 600640,\n      \"byteStride\": 12,\n      \"name\": \"floatBufferViews\"\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 105936,\n      \"byteOffset\": 639724,\n      \"byteStride\": 16,\n      \"name\": \"floatBufferViews\"\n    }\n  ],\n  \"buffers\": [\n    {\n      \"byteLength\": 745660,\n      \"uri\": \"scene.bin\"\n    }\n  ],\n  \"images\": [\n    {\n      \"uri\": \"textures/Robot_Armstrong_baseColor.png\"\n    },\n    {\n      \"uri\": \"textures/Robot_Armstrong_metallicRoughness.png\"\n    },\n    {\n      \"uri\": \"textures/Robot_Armstrong_normal.png\"\n    }\n  ],\n  \"materials\": [\n    {\n      \"doubleSided\": true,\n      \"name\": \"Robot_Armstrong\",\n      \"normalTexture\": {\n        \"index\": 2\n      },\n      \"pbrMetallicRoughness\": {\n        \"baseColorTexture\": {\n          \"index\": 0\n        },\n        \"metallicRoughnessTexture\": {\n          \"index\": 1\n        }\n      }\n    },\n    {\n      \"doubleSided\": true,\n      \"name\": \"lambert3\",\n      \"pbrMetallicRoughness\": {\n        \"baseColorFactor\": [\n          0.5,\n          0.0,\n          0.0961499,\n          1.0\n        ],\n        \"metallicFactor\": 0.0,\n        \"roughnessFactor\": 0.6\n      }\n    },\n    {\n      \"doubleSided\": true,\n      \"name\": \"lambert2\",\n      \"pbrMetallicRoughness\": {\n        \"baseColorFactor\": [\n          0.0,\n          0.0769167,\n          1.0,\n          1.0\n        ],\n        \"metallicFactor\": 0.0,\n        \"roughnessFactor\": 0.6\n      }\n    }\n  ],\n  \"meshes\": [\n    {\n      \"name\": \"Arm_Geo_Robot_Armstrong_0\",\n      \"primitives\": [\n        {\n          \"attributes\": {\n            \"JOINTS_0\": 14,\n            \"NORMAL\": 1,\n            \"POSITION\": 0,\n            \"TANGENT\": 2,\n            \"TEXCOORD_0\": 3,\n            \"TEXCOORD_1\": 3,\n            \"TEXCOORD_2\": 3,\n            \"TEXCOORD_3\": 3,\n            \"TEXCOORD_4\": 3,\n            \"WEIGHTS_0\": 15\n          },\n          \"indices\": 4,\n          \"material\": 0,\n          \"mode\": 4\n        }\n      ]\n    },\n    {\n      \"name\": \"Heavy_Boi_lambert3_0\",\n      \"primitives\": [\n        {\n          \"attributes\": {\n            \"NORMAL\": 6,\n            \"POSITION\": 5,\n            \"TEXCOORD_0\": 7\n          },\n          \"indices\": 8,\n          \"material\": 1,\n          \"mode\": 4\n        }\n      ]\n    },\n    {\n      \"name\": \"Light_Boi_lambert2_0\",\n      \"primitives\": [\n        {\n          \"attributes\": {\n            \"NORMAL\": 10,\n            \"POSITION\": 9,\n            \"TEXCOORD_0\": 11\n          },\n          \"indices\": 12,\n          \"material\": 2,\n          \"mode\": 4\n        }\n      ]\n    }\n  ],\n  \"nodes\": [\n    {\n      \"children\": [\n        1\n      ],\n      \"matrix\": [\n        0.2859538793563843,\n        0.0,\n        0.0,\n        0.0,\n        0.0,\n        6.349451616846841e-17,\n        -0.2859538793563843,\n        0.0,\n        0.0,\n        0.2859538793563843,\n        6.349451616846841e-17,\n        0.0,\n        0.0,\n        0.0,\n        0.0,\n        1.0\n      ],\n      \"name\": \"Sketchfab_model\"\n    },\n    {\n      \"children\": [\n        2\n      ],\n      \"matrix\": [\n        0.009999999776482582,\n        0.0,\n        0.0,\n        0.0,\n        0.0,\n        0.0,\n        0.009999999776482582,\n        0.0,\n        0.0,\n        -0.009999999776482582,\n        0.0,\n        0.0,\n        0.0,\n        0.0,\n        0.0,\n        1.0\n      ],\n      \"name\": \"d751c7eea7b444fa9fab6aeb279a28ad.fbx\"\n    },\n    {\n      \"children\": [\n        3\n      ],\n      \"name\": \"Object_2\"\n    },\n    {\n      \"children\": [\n        4,\n        5,\n        59,\n        61\n      ],\n      \"name\": \"RootNode\"\n    },\n    {\n      \"name\": \"transform1\"\n    },\n    {\n      \"children\": [\n        6,\n        30\n      ],\n      \"name\": \"Robot_Arm_Strong_Rig\"\n    },\n    {\n      \"children\": [\n        7\n      ],\n      \"name\": \"Controls\"\n    },\n    {\n      \"children\": [\n        8,\n        18,\n        29\n      ],\n      \"name\": \"Ctrl_Global_Move_Scale\"\n    },\n    {\n      \"children\": [\n        9\n      ],\n      \"name\": \"CTRL_Base_Rotate_os_GRP\",\n      \"rotation\": [\n        0.0,\n        0.0,\n        0.7071068286895752,\n        0.7071068286895752\n      ],\n      \"translation\": [\n        -1.466250978410244e-06,\n        80.76246643066406,\n        5.289912223815918e-07\n      ]\n    },\n    {\n      \"children\": [\n        10,\n        14\n      ],\n      \"name\": \"CTRL_Base_Rotate\",\n      \"rotation\": [\n        -0.5907620787620544,\n        -0.013782167807221413,\n        0.009721717797219753,\n        0.8066696524620056\n      ],\n      \"translation\": [\n        0.0,\n        -3.877882850987849e-14,\n        -5.388716545467326e-14\n      ]\n    },\n    {\n      \"children\": [\n        11\n      ],\n      \"name\": \"CTRL_FK_Base_Pivot_os_GRP\",\n      \"rotation\": [\n        5.552128915684528e-17,\n        -0.004758742637932301,\n        1.99895763726044e-18,\n        0.9999886751174927\n      ],\n      \"translation\": [\n        63.50892639160156,\n        -2.6192622044618474e-06,\n        -5.289912223815918e-07\n      ]\n    },\n    {\n      \"children\": [\n        12\n      ],\n      \"name\": \"CTRL_FK_Base_Pivot\",\n      \"rotation\": [\n        0.0,\n        8.673617379884035e-19,\n        0.0,\n        1.0\n      ]\n    },\n    {\n      \"children\": [\n        13\n      ],\n      \"name\": \"CTRL_FK_Elboq_os_GRP\",\n      \"rotation\": [\n        -0.5074944496154785,\n        -0.4930981993675232,\n        -0.49240514636039734,\n        0.5067945718765259\n      ],\n      \"translation\": [\n        313.05010986328125,\n        9.688916335903741e-13,\n        -9.610090501155355e-13\n      ]\n    },\n    {\n      \"name\": \"CTRL_FK_Elboq\",\n      \"rotation\": [\n        -2.1064858766735392e-35,\n        2.7755575615628914e-17,\n        7.589415207398531e-19,\n        1.0\n      ]\n    },\n    {\n      \"children\": [\n        15\n      ],\n      \"name\": \"IK_Controls_Base_Offset\",\n      \"rotation\": [\n        5.551115123125783e-17,\n        6.288372600415926e-18,\n        -3.490748024201865e-34,\n        1.0\n      ],\n      \"translation\": [\n        -2.842170943040401e-14,\n        -5.684341886080802e-14,\n        -4.440892098500626e-16\n      ]\n    },\n    {\n      \"children\": [\n        16\n      ],\n      \"name\": \"CTRL_IK_Translate_os_GRP\",\n      \"rotation\": [\n        -0.5051454901695251,\n        -0.49550437927246094,\n        -0.4948146641254425,\n        0.5044423937797546\n      ],\n      \"translation\": [\n        376.6277160644531,\n        -8.195183909265324e-06,\n        223.40667724609375\n      ]\n    },\n    {\n      \"children\": [\n        17\n      ],\n      \"name\": \"CTRL_IK_Translate\",\n      \"rotation\": [\n        -1.504632769052528e-35,\n        2.7755575615628914e-17,\n        5.421010862427522e-19,\n        1.0\n      ],\n      \"translation\": [\n        -199.87384033203125,\n        -33.0147705078125,\n        -76.0296401977539\n      ]\n    },\n    {\n      \"name\": \"ikHandle1\",\n      \"rotation\": [\n        0.006817307323217392,\n        0.7075662612915039,\n        -0.006807818077504635,\n        0.7065813541412354\n      ],\n      \"translation\": [\n        -2.842170943040401e-14,\n        -5.684341886080802e-14,\n        0.0\n      ]\n    },\n    {\n      \"children\": [\n        19\n      ],\n      \"name\": \"Ctrls_Upper\",\n      \"rotation\": [\n        0.017764955759048462,\n        -0.7060953974723816,\n        0.011095577850937843,\n        0.7078068852424622\n      ],\n      \"translation\": [\n        -10.996893882751465,\n        419.47149658203125,\n        83.73381805419922\n      ]\n    },\n    {\n      \"children\": [\n        20\n      ],\n      \"name\": \"CTRL_FK_Upper_os_GRP\",\n      \"rotation\": [\n        -0.6998886466026306,\n        0.7142516374588013,\n        -0.0004917712649330497,\n        0.0004828870005439967\n      ],\n      \"translation\": [\n        95.67628479003906,\n        4.164312839508057,\n        0.3070385456085205\n      ]\n    },\n    {\n      \"children\": [\n        21\n      ],\n      \"name\": \"CTRL_FK_Upper\",\n      \"rotation\": [\n        -1.0378402211642343e-16,\n        3.600520668329787e-17,\n        -0.3085783123970032,\n        0.951198935508728\n      ],\n      \"translation\": [\n        -1.5194245861493982e-09,\n        -4.696062205766793e-09,\n        -8.881784197001252e-16\n      ]\n    },\n    {\n      \"children\": [\n        22\n      ],\n      \"name\": \"CTRL_Claw_Main_Rotate_os_GRP\",\n      \"rotation\": [\n        -0.7067376971244812,\n        0.7074756026268005,\n        -0.00022029303363524377,\n        -0.00022052304120734334\n      ],\n      \"translation\": [\n        217.5917205810547,\n        32.79703140258789,\n        0.4431872069835663\n      ]\n    },\n    {\n      \"children\": [\n        23\n      ],\n      \"name\": \"CTRL_Claw_Main_Rotate\",\n      \"rotation\": [\n        -5.963111948670274e-19,\n        -4.553649124439119e-18,\n        -2.7755575615628914e-17,\n        1.0\n      ],\n      \"translation\": [\n        -7.676888344576582e-06,\n        -2.40409036678102e-07,\n        1.9511730897647794e-08\n      ]\n    },\n    {\n      \"children\": [\n        24\n      ],\n      \"name\": \"CTRL_Claw_Ball_Rotate_os_GRP\",\n      \"rotation\": [\n        -0.7067376971244812,\n        0.7074756026268005,\n        -0.00022029303363524377,\n        0.00022052304120734334\n      ],\n      \"translation\": [\n        42.38798522949219,\n        -45.72901916503906,\n        0.0034909327514469624\n      ]\n    },\n    {\n      \"children\": [\n        25,\n        27\n      ],\n      \"name\": \"CTRL_Claw_Ball_Rotate\",\n      \"rotation\": [\n        -6.505213034913027e-19,\n        7.589415207398531e-19,\n        4.9370762734536075e-37,\n        1.0\n      ]\n    },\n    {\n      \"children\": [\n        26\n      ],\n      \"name\": \"CTRL_Claw_R_os_GRP\",\n      \"rotation\": [\n        -0.6448816657066345,\n        0.2924268841743469,\n        0.29094618558883667,\n        0.6434006690979004\n      ],\n      \"translation\": [\n        -0.34568727016448975,\n        -0.39553704857826233,\n        -3.544440984725952\n      ]\n    },\n    {\n      \"name\": \"CTRL_Claw_R\",\n      \"rotation\": [\n        -2.7677852070912206e-17,\n        -2.075696423457903e-18,\n        0.07478484511375427,\n        0.9971997141838074\n      ],\n      \"translation\": [\n        -1.103857016460097e-06,\n        1.1283434560027672e-06,\n        -4.977417120244354e-06\n      ]\n    },\n    {\n      \"children\": [\n        28\n      ],\n      \"name\": \"CTRL_Claw_L_os_GRP\",\n      \"rotation\": [\n        -0.29161757230758667,\n        -0.6430969834327698,\n        0.6451862454414368,\n        -0.2917536199092865\n      ],\n      \"translation\": [\n        -0.3455682694911957,\n        -0.3762337863445282,\n        3.5465784072875977\n      ]\n    },\n    {\n      \"name\": \"CTRL_Claw_R1\",\n      \"rotation\": [\n        -1.259625260121769e-18,\n        1.382050555039516e-17,\n        0.0907655656337738,\n        0.9958723783493042\n      ],\n      \"translation\": [\n        -4.237911525706295e-06,\n        4.726242877950426e-06,\n        -7.56835879656137e-06\n      ]\n    },\n    {\n      \"name\": \"CTRL_IK_FK_Switch\"\n    },\n    {\n      \"children\": [\n        31,\n        57\n      ],\n      \"name\": \"DO_NOT_TOUCH\"\n    },\n    {\n      \"children\": [\n        32\n      ],\n      \"name\": \"Skeleton\"\n    },\n    {\n      \"children\": [\n        33,\n        56\n      ],\n      \"name\": \"Object_32\"\n    },\n    {\n      \"children\": [\n        34\n      ],\n      \"name\": \"_rootJoint\"\n    },\n    {\n      \"children\": [\n        35\n      ],\n      \"name\": \"Mech_Root_00\",\n      \"rotation\": [\n        0.0,\n        0.0,\n        0.7071068286895752,\n        0.7071068286895752\n      ]\n    },\n    {\n      \"children\": [\n        36,\n        49\n      ],\n      \"name\": \"J_Base_Rot_01\",\n      \"translation\": [\n        80.76246643066406,\n        1.1991035470332659e-14,\n        5.289912223815918e-07\n      ]\n    },\n    {\n      \"children\": [\n        37\n      ],\n      \"name\": \"J_Base_Pivot_Rot_02\",\n      \"rotation\": [\n        -0.0026823505759239197,\n        0.22385600209236145,\n        0.020366698503494263,\n        0.9744057059288025\n      ],\n      \"translation\": [\n        63.50892639160156,\n        -2.6192622044618474e-06,\n        -5.289912223815918e-07\n      ]\n    },\n    {\n      \"children\": [\n        38\n      ],\n      \"name\": \"J_Elbow_03\",\n      \"rotation\": [\n        0.37304437160491943,\n        0.6013069748878479,\n        0.6007223725318909,\n        -0.37202218174934387\n      ],\n      \"translation\": [\n        313.05010986328125,\n        9.530154443382344e-13,\n        -9.237055564881302e-13\n      ]\n    },\n    {\n      \"children\": [\n        39\n      ],\n      \"name\": \"joint9_04\",\n      \"rotation\": [\n        -6.586461677215993e-05,\n        -0.0016048576217144728,\n        0.021746881306171417,\n        0.999762237071991\n      ],\n      \"translation\": [\n        220.38771057128906,\n        -4.164312839508057,\n        -0.3070385456085205\n      ]\n    },\n    {\n      \"children\": [\n        40\n      ],\n      \"name\": \"J_Upper_Pivot_05\",\n      \"rotation\": [\n        -0.1970391720533371,\n        0.6806640625,\n        0.19693194329738617,\n        0.6775616407394409\n      ],\n      \"translation\": [\n        89.25628662109375,\n        10.27928638458252,\n        0.01310022547841072\n      ]\n    },\n    {\n      \"children\": [\n        41\n      ],\n      \"name\": \"J_Upper_Rot_06\",\n      \"rotation\": [\n        -0.4572065472602844,\n        0.5318527221679688,\n        -0.4646695852279663,\n        0.5405341982841492\n      ],\n      \"translation\": [\n        8.896137160263606e-09,\n        -12.167906761169434,\n        3.751665644813329e-12\n      ]\n    },\n    {\n      \"children\": [\n        42\n      ],\n      \"name\": \"J_Claw_Base_Rot_07\",\n      \"rotation\": [\n        -0.6518701314926147,\n        0.7582982778549194,\n        -0.004577083978801966,\n        -0.005324366968125105\n      ],\n      \"translation\": [\n        220.04998779296875,\n        8.526512829121202e-13,\n        -3.0108360249414545e-09\n      ]\n    },\n    {\n      \"children\": [\n        43\n      ],\n      \"name\": \"J_Helper_01_08\",\n      \"rotation\": [\n        -0.7041645050048828,\n        0.7100219130516052,\n        0.003244806081056595,\n        -0.0032717972062528133\n      ],\n      \"translation\": [\n        42.76677322387695,\n        0.0,\n        5.1514348342607263e-14\n      ]\n    },\n    {\n      \"children\": [\n        44,\n        45,\n        47\n      ],\n      \"name\": \"J_Claw_Both_Rot_09\",\n      \"rotation\": [\n        0.00491962069645524,\n        -2.2941925635677762e-05,\n        -0.003620013128966093,\n        0.9999813437461853\n      ],\n      \"translation\": [\n        45.730587005615234,\n        5.684341886080802e-14,\n        4.440892098500626e-16\n      ]\n    },\n    {\n      \"name\": \"J_Claw_Both_Rot_end_010\",\n      \"rotation\": [\n        3.63207727782644e-18,\n        -2.087089182034596e-18,\n        8.326672684688674e-17,\n        1.0\n      ],\n      \"translation\": [\n        39.738319396972656,\n        -0.04146943241357803,\n        7.216686412903073e-07\n      ]\n    },\n    {\n      \"children\": [\n        46\n      ],\n      \"name\": \"Claw_Pivot_R_011\",\n      \"rotation\": [\n        -0.6212067008018494,\n        0.33983537554740906,\n        0.338248074054718,\n        0.6198406219482422\n      ],\n      \"translation\": [\n        -0.34568727016448975,\n        -0.39553704857826233,\n        -3.544440984725952\n      ]\n    },\n    {\n      \"name\": \"Claw_Pivot_R_end_012\",\n      \"rotation\": [\n        0.06940634548664093,\n        -0.0808509960770607,\n        0.010946989059448242,\n        0.9942464828491211\n      ],\n      \"translation\": [\n        16.797748565673828,\n        2.842170943040401e-14,\n        -1.1368683772161603e-13\n      ]\n    },\n    {\n      \"children\": [\n        48\n      ],\n      \"name\": \"Claw_Pivot_L_013\",\n      \"rotation\": [\n        -0.3487849235534668,\n        -0.6139736175537109,\n        0.616041898727417,\n        -0.34911003708839417\n      ],\n      \"translation\": [\n        -0.3455682694911957,\n        -0.3762337863445282,\n        3.5465784072875977\n      ]\n    },\n    {\n      \"name\": \"Claw_Pivot_L_end_014\",\n      \"rotation\": [\n        0.06940634548664093,\n        -0.0808509960770607,\n        0.010946989059448242,\n        0.9942464828491211\n      ],\n      \"translation\": [\n        -16.7977237701416,\n        -7.804499182384461e-05,\n        -4.977429398422828e-06\n      ]\n    },\n    {\n      \"children\": [\n        50,\n        53\n      ],\n      \"name\": \"IKFKSkel_015\",\n      \"rotation\": [\n        -7.873035982679803e-27,\n        -0.004758742637932301,\n        -1.6544174314455523e-24,\n        0.9999886751174927\n      ],\n      \"translation\": [\n        63.50892639160156,\n        -2.6192622044618474e-06,\n        -5.289912223815918e-07\n      ]\n    },\n    {\n      \"children\": [\n        51\n      ],\n      \"name\": \"J_FK1_016\",\n      \"rotation\": [\n        -0.5906427502632141,\n        -0.013782165944576263,\n        0.015343781560659409,\n        0.8066695332527161\n      ],\n      \"translation\": [\n        0.0,\n        8.470329472543003e-22,\n        0.0\n      ]\n    },\n    {\n      \"children\": [\n        52\n      ],\n      \"name\": \"J_FK2_017\",\n      \"rotation\": [\n        -0.5074944496154785,\n        -0.4930981993675232,\n        -0.49240514636039734,\n        0.5067945718765259\n      ],\n      \"translation\": [\n        313.05010986328125,\n        9.575673587391975e-13,\n        -9.618972285352356e-13\n      ]\n    },\n    {\n      \"name\": \"J_FK3_018\",\n      \"rotation\": [\n        -1.3010426069826053e-18,\n        2.7755575615628914e-17,\n        -5.421010862427522e-19,\n        1.0\n      ],\n      \"translation\": [\n        220.38771057128906,\n        -4.164312839508057,\n        -0.3070385456085205\n      ]\n    },\n    {\n      \"children\": [\n        54\n      ],\n      \"name\": \"J_Base_Pivot_Rot1_IK_019\",\n      \"rotation\": [\n        -0.0025854003615677357,\n        0.22849041223526,\n        0.020379232242703438,\n        0.9733294248580933\n      ]\n    },\n    {\n      \"children\": [\n        55\n      ],\n      \"name\": \"J_IK1_020\",\n      \"rotation\": [\n        0.37304437160491943,\n        0.6013069748878479,\n        0.6007223725318909,\n        -0.37202218174934387\n      ],\n      \"translation\": [\n        313.05010986328125,\n        9.565681580170349e-13,\n        -9.663381206337363e-13\n      ]\n    },\n    {\n      \"name\": \"J_IK2_021\",\n      \"rotation\": [\n        4.199589352486821e-18,\n        -2.168404344971009e-19,\n        -8.673617379884035e-19,\n        1.0\n      ],\n      \"translation\": [\n        220.38771057128906,\n        -4.164312839508057,\n        -0.3070385456085205\n      ]\n    },\n    {\n      \"mesh\": 0,\n      \"name\": \"Object_56\",\n      \"skin\": 0\n    },\n    {\n      \"children\": [\n        58\n      ],\n      \"name\": \"Geo\"\n    },\n    {\n      \"name\": \"Arm_Geo\"\n    },\n    {\n      \"children\": [\n        60\n      ],\n      \"name\": \"Heavy_Boi\",\n      \"rotation\": [\n        0.016099955886602402,\n        0.002024458721280098,\n        3.91020075767301e-05,\n        0.9998683333396912\n      ],\n      \"scale\": [\n        89.95779418945313,\n        155.5825958251953,\n        155.5825958251953\n      ],\n      \"translation\": [\n        1.3999370336532593,\n        -3.4926185607910156,\n        441.70330810546875\n      ]\n    },\n    {\n      \"mesh\": 1,\n      \"name\": \"Heavy_Boi_lambert3_0\"\n    },\n    {\n      \"children\": [\n        62\n      ],\n      \"name\": \"Light_Boi\",\n      \"rotation\": [\n        -1.1102231569740545e-16,\n        -0.3814648687839508,\n        2.000136698702739e-32,\n        0.9243834614753723\n      ],\n      \"scale\": [\n        76.03485870361328,\n        64.671630859375,\n        118.6207504272461\n      ],\n      \"translation\": [\n        359.965576171875,\n        1.0228262681266642e-08,\n        -424.65753173828125\n      ]\n    },\n    {\n      \"mesh\": 2,\n      \"name\": \"Light_Boi_lambert2_0\"\n    }\n  ],\n  \"samplers\": [\n    {\n      \"magFilter\": 9729,\n      \"minFilter\": 9987,\n      \"wrapS\": 10497,\n      \"wrapT\": 10497\n    }\n  ],\n  \"scene\": 0,\n  \"scenes\": [\n    {\n      \"name\": \"Sketchfab_Scene\",\n      \"nodes\": [\n        0\n      ]\n    }\n  ],\n  \"skins\": [\n    {\n      \"inverseBindMatrices\": 13,\n      \"joints\": [\n        33,\n        34,\n        35,\n        36,\n        37,\n        38,\n        39,\n        40,\n        41,\n        42,\n        43,\n        44,\n        45,\n        46,\n        47,\n        48,\n        49,\n        50,\n        51,\n        52,\n        53,\n        54,\n        55\n      ],\n      \"skeleton\": 33\n    }\n  ],\n  \"textures\": [\n    {\n      \"sampler\": 0,\n      \"source\": 0\n    },\n    {\n      \"sampler\": 0,\n      \"source\": 1\n    },\n    {\n      \"sampler\": 0,\n      \"source\": 2\n    }\n  ]\n}\n"
  },
  {
    "path": "examples/resources/models/gltf/suzanne/suzanne.gltf",
    "content": "{\n  \"accessors\": [\n    {\n      \"bufferView\": 0,\n      \"byteOffset\": 0,\n      \"componentType\": 5126,\n      \"count\": 3034,\n      \"max\": [\n        1.307556,\n        0.9131775,\n        0.8170619\n      ],\n      \"min\": [\n        -1.307556,\n        -0.9631042999999999,\n        -0.7441406\n      ],\n      \"type\": \"VEC3\"\n    },\n    {\n      \"bufferView\": 0,\n      \"byteOffset\": 36408,\n      \"componentType\": 5126,\n      \"count\": 3034,\n      \"max\": [\n        0.9970338,\n        0.9999959999999999,\n        0.9999014999999999\n      ],\n      \"min\": [\n        -0.9970338,\n        -0.998828,\n        -0.9994199\n      ],\n      \"type\": \"VEC3\"\n    },\n    {\n      \"bufferView\": 0,\n      \"byteOffset\": 72816,\n      \"componentType\": 5126,\n      \"count\": 3034,\n      \"max\": [\n        1.0,\n        1.0\n      ],\n      \"min\": [\n        0.0,\n        0.0\n      ],\n      \"type\": \"VEC2\"\n    },\n    {\n      \"bufferView\": 1,\n      \"byteOffset\": 0,\n      \"componentType\": 5123,\n      \"count\": 11808,\n      \"max\": [\n        3033\n      ],\n      \"min\": [\n        0\n      ],\n      \"type\": \"SCALAR\"\n    }\n  ],\n  \"asset\": {\n    \"generator\": \"clay fbx2gltf\",\n    \"version\": \"2.0\"\n  },\n  \"bufferViews\": [\n    {\n      \"buffer\": 0,\n      \"byteLength\": 97088,\n      \"byteOffset\": 0,\n      \"target\": 34962\n    },\n    {\n      \"buffer\": 0,\n      \"byteLength\": 23616,\n      \"byteOffset\": 97088,\n      \"target\": 34963\n    }\n  ],\n  \"buffers\": [\n    {\n      \"byteLength\": 120704,\n      \"uri\": \"suzanne.bin\"\n    }\n  ],\n  \"extensionsUsed\": [\n    \"KHR_materials_common\"\n  ],\n  \"materials\": [\n    {\n      \"emissiveFactor\": [\n        0.0,\n        0.0,\n        0.0\n      ],\n      \"name\": \"Material_001\",\n      \"pbrMetallicRoughness\": {\n        \"baseColorFactor\": [\n          0.64,\n          0.64,\n          0.64,\n          1\n        ],\n        \"metallicFactor\": 0,\n        \"roughnessFactor\": 0.565857216171175\n      }\n    }\n  ],\n  \"meshes\": [\n    {\n      \"name\": \"Suzanne\",\n      \"primitives\": [\n        {\n          \"attributes\": {\n            \"NORMAL\": 1,\n            \"POSITION\": 0,\n            \"TEXCOORD_0\": 2\n          },\n          \"indices\": 3,\n          \"material\": 0\n        }\n      ]\n    }\n  ],\n  \"nodes\": [\n    {\n      \"matrix\": [\n        1.0,\n        0.0,\n        0.0,\n        0.0,\n        0.0,\n        1.0,\n        0.0,\n        0.0,\n        0.0,\n        0.0,\n        1.0,\n        0.0,\n        0.0,\n        0.0,\n        0.0,\n        1.0\n      ],\n      \"mesh\": 0,\n      \"name\": \"Suzanne\"\n    }\n  ],\n  \"scene\": 0,\n  \"scenes\": [\n    {\n      \"nodes\": [\n        0\n      ]\n    }\n  ]\n}"
  },
  {
    "path": "examples/resources/models/gltf/teapots_galore/teapots_galore.gltf",
    "content": "{\n    \"accessors\": [\n        {\n            \"bufferView\": 0,\n            \"componentType\": 5126,\n            \"count\": 2204,\n            \"extras\": {\n                \"arrayIndex\": 0\n            },\n            \"max\": [\n                3.433150053024292,\n                3.1500000953674316,\n                2.0\n            ],\n            \"min\": [\n                -3.0,\n                0.0,\n                -2.0\n            ],\n            \"type\": \"VEC3\"\n        },\n        {\n            \"bufferView\": 1,\n            \"componentType\": 5126,\n            \"count\": 2204,\n            \"extras\": {\n                \"arrayIndex\": 1\n            },\n            \"type\": \"VEC3\"\n        },\n        {\n            \"bufferView\": 2,\n            \"componentType\": 5125,\n            \"count\": 12096,\n            \"extras\": {\n                \"arrayIndex\": 2\n            },\n            \"type\": \"SCALAR\"\n        },\n        {\n            \"bufferView\": 3,\n            \"componentType\": 5126,\n            \"count\": 958,\n            \"extras\": {\n                \"arrayIndex\": 3\n            },\n            \"type\": \"VEC3\"\n        },\n        {\n            \"bufferView\": 4,\n            \"componentType\": 5126,\n            \"count\": 958,\n            \"extras\": {\n                \"arrayIndex\": 4\n            },\n            \"type\": \"VEC4\"\n        },\n        {\n            \"bufferView\": 5,\n            \"componentType\": 5126,\n            \"count\": 958,\n            \"extras\": {\n                \"arrayIndex\": 5\n            },\n            \"type\": \"VEC3\"\n        },\n        {\n            \"bufferView\": 6,\n            \"componentType\": 5126,\n            \"count\": 941,\n            \"extras\": {\n                \"arrayIndex\": 6\n            },\n            \"type\": \"VEC3\"\n        },\n        {\n            \"bufferView\": 7,\n            \"componentType\": 5126,\n            \"count\": 941,\n            \"extras\": {\n                \"arrayIndex\": 7\n            },\n            \"type\": \"VEC4\"\n        },\n        {\n            \"bufferView\": 8,\n            \"componentType\": 5126,\n            \"count\": 941,\n            \"extras\": {\n                \"arrayIndex\": 8\n            },\n            \"type\": \"VEC3\"\n        },\n        {\n            \"bufferView\": 9,\n            \"componentType\": 5126,\n            \"count\": 4,\n            \"extras\": {\n                \"arrayIndex\": 9\n            },\n            \"max\": [\n                1.0,\n                0.0,\n                1.0\n            ],\n            \"min\": [\n                -1.0,\n                0.0,\n                -1.0\n            ],\n            \"type\": \"VEC3\"\n        },\n        {\n            \"bufferView\": 10,\n            \"componentType\": 5126,\n            \"count\": 4,\n            \"extras\": {\n                \"arrayIndex\": 10\n            },\n            \"type\": \"VEC3\"\n        },\n        {\n            \"bufferView\": 11,\n            \"componentType\": 5126,\n            \"count\": 4,\n            \"extras\": {\n                \"arrayIndex\": 11\n            },\n            \"type\": \"VEC2\"\n        },\n        {\n            \"bufferView\": 12,\n            \"componentType\": 5125,\n            \"count\": 6,\n            \"extras\": {\n                \"arrayIndex\": 12\n            },\n            \"type\": \"SCALAR\"\n        }\n    ],\n    \"asset\": {\n        \"generator\": \"OctaneGltfExporter Version:2.2\",\n        \"version\": \"2.0\"\n    },\n    \"bufferViews\": [\n        {\n            \"buffer\": 0,\n            \"byteLength\": 26448,\n            \"extras\": {\n                \"arrayIndex\": 0\n            }\n        },\n        {\n            \"buffer\": 0,\n            \"byteLength\": 26448,\n            \"byteOffset\": 26448,\n            \"extras\": {\n                \"arrayIndex\": 1\n            }\n        },\n        {\n            \"buffer\": 0,\n            \"byteLength\": 48384,\n            \"byteOffset\": 52896,\n            \"extras\": {\n                \"arrayIndex\": 2\n            }\n        },\n        {\n            \"buffer\": 1,\n            \"byteLength\": 11496,\n            \"extras\": {\n                \"arrayIndex\": 3\n            }\n        },\n        {\n            \"buffer\": 1,\n            \"byteLength\": 15328,\n            \"byteOffset\": 11496,\n            \"extras\": {\n                \"arrayIndex\": 4\n            }\n        },\n        {\n            \"buffer\": 1,\n            \"byteLength\": 11496,\n            \"byteOffset\": 26824,\n            \"extras\": {\n                \"arrayIndex\": 5\n            }\n        },\n        {\n            \"buffer\": 1,\n            \"byteLength\": 11292,\n            \"byteOffset\": 38320,\n            \"extras\": {\n                \"arrayIndex\": 6\n            }\n        },\n        {\n            \"buffer\": 1,\n            \"byteLength\": 15056,\n            \"byteOffset\": 49612,\n            \"extras\": {\n                \"arrayIndex\": 7\n            }\n        },\n        {\n            \"buffer\": 1,\n            \"byteLength\": 11292,\n            \"byteOffset\": 64668,\n            \"extras\": {\n                \"arrayIndex\": 8\n            }\n        },\n        {\n            \"buffer\": 2,\n            \"byteLength\": 48,\n            \"extras\": {\n                \"arrayIndex\": 9\n            }\n        },\n        {\n            \"buffer\": 2,\n            \"byteLength\": 48,\n            \"byteOffset\": 48,\n            \"extras\": {\n                \"arrayIndex\": 10\n            }\n        },\n        {\n            \"buffer\": 2,\n            \"byteLength\": 32,\n            \"byteOffset\": 96,\n            \"extras\": {\n                \"arrayIndex\": 11\n            }\n        },\n        {\n            \"buffer\": 2,\n            \"byteLength\": 24,\n            \"byteOffset\": 128,\n            \"extras\": {\n                \"arrayIndex\": 12\n            }\n        }\n    ],\n    \"buffers\": [\n        {\n            \"byteLength\": 101280,\n            \"extras\": {\n                \"arrayIndex\": 0\n            },\n            \"uri\": \"mesh.bin\"\n        },\n        {\n            \"byteLength\": 75960,\n            \"extras\": {\n                \"arrayIndex\": 1\n            },\n            \"uri\": \"transforms.bin\"\n        },\n        {\n            \"byteLength\": 152,\n            \"extras\": {\n                \"arrayIndex\": 2\n            },\n            \"uri\": \"mesh_2.bin\"\n        }\n    ],\n    \"cameras\": [\n        {\n            \"extras\": {\n                \"arrayIndex\": 0\n            },\n            \"name\": \"Thin lens camera\",\n            \"perspective\": {\n                \"aspectRatio\": 1.3333333730697632,\n                \"yfov\": 0.8172757029533386,\n                \"zfar\": 10000000000.0,\n                \"znear\": 9.999999747378752e-05\n            },\n            \"type\": \"perspective\"\n        }\n    ],\n    \"extensionsUsed\": [\n        \"EXT_mesh_gpu_instancing\"\n    ],\n    \"materials\": [\n        {\n            \"extras\": {\n                \"arrayIndex\": 0\n            },\n            \"name\": \"cube\",\n            \"pbrMetallicRoughness\": {\n                \"baseColorFactor\": [\n                    0.699999988079071,\n                    0.699999988079071,\n                    0.699999988079071,\n                    1.0\n                ],\n                \"roughnessFactor\": 0.06319999694824219\n            }\n        },\n        {\n            \"extras\": {\n                \"arrayIndex\": 1\n            },\n            \"name\": \"cube_1\",\n            \"pbrMetallicRoughness\": {\n                \"baseColorFactor\": [\n                    0.7000000476837158,\n                    0.0006436262046918273,\n                    0.03353740647435188,\n                    1.0\n                ],\n                \"roughnessFactor\": 0.06319999694824219\n            }\n        },\n        {\n            \"extras\": {\n                \"arrayIndex\": 2\n            },\n            \"name\": \"cube_2\",\n            \"pbrMetallicRoughness\": {\n                \"baseColorFactor\": [\n                    0.15800000727176666,\n                    0.10700000077486038,\n                    0.09399999678134918,\n                    1.0\n                ],\n                \"metallicFactor\": 0.11500000208616257,\n                \"roughnessFactor\": 0.13469399511814117\n            }\n        }\n    ],\n    \"meshes\": [\n        {\n            \"extras\": {\n                \"arrayIndex\": 0\n            },\n            \"name\": \"teapot\",\n            \"primitives\": [\n                {\n                    \"attributes\": {\n                        \"NORMAL\": 1,\n                        \"POSITION\": 0\n                    },\n                    \"indices\": 2,\n                    \"material\": 0,\n                    \"mode\": 4\n                }\n            ]\n        },\n        {\n            \"extras\": {\n                \"arrayIndex\": 1\n            },\n            \"name\": \"plane\",\n            \"primitives\": [\n                {\n                    \"attributes\": {\n                        \"NORMAL\": 10,\n                        \"POSITION\": 9,\n                        \"TEXCOORD_0\": 11\n                    },\n                    \"indices\": 12,\n                    \"material\": 2,\n                    \"mode\": 4\n                }\n            ]\n        }\n    ],\n    \"nodes\": [\n        {\n            \"children\": [\n                1,\n                2,\n                3,\n                4\n            ],\n            \"extras\": {\n                \"arrayIndex\": 0\n            },\n            \"name\": \"teapots_galore\"\n        },\n        {\n            \"camera\": 0,\n            \"extras\": {\n                \"arrayIndex\": 1\n            },\n            \"matrix\": [\n                1.0,\n                -0.0,\n                0.0,\n                -0.0,\n                -0.0,\n                0.9578263163566589,\n                -0.2873478829860687,\n                0.0,\n                -0.0,\n                0.2873478829860687,\n                0.9578263163566589,\n                -0.0,\n                -0.0,\n                20.000001907348633,\n                -0.0,\n                1.0\n            ],\n            \"name\": \"Thin lens camera\"\n        },\n        {\n            \"children\": [\n                5\n            ],\n            \"extras\": {\n                \"arrayIndex\": 2\n            },\n            \"matrix\": [\n                0.7071068286895752,\n                0.0,\n                -0.7071067690849304,\n                0.0,\n                0.0,\n                1.0,\n                0.0,\n                0.0,\n                0.7071067690849304,\n                0.0,\n                0.7071068286895752,\n                0.0,\n                0.0,\n                0.0,\n                0.0,\n                1.0\n            ],\n            \"name\": \"Placement\"\n        },\n        {\n            \"extensions\": {\n                \"EXT_mesh_gpu_instancing\": {\n                    \"attributes\": {\n                        \"ROTATION\": 4,\n                        \"SCALE\": 5,\n                        \"TRANSLATION\": 3\n                    }\n                }\n            },\n            \"extras\": {\n                \"arrayIndex\": 3\n            },\n            \"matrix\": [\n                1.0,\n                0.0,\n                0.0,\n                0.0,\n                0.0,\n                1.2999999523162842,\n                0.0,\n                0.0,\n                0.0,\n                0.0,\n                1.0,\n                0.0,\n                0.0,\n                0.0,\n                0.0,\n                1.0\n            ],\n            \"mesh\": 0,\n            \"name\": \"teapot\"\n        },\n        {\n            \"extensions\": {\n                \"EXT_mesh_gpu_instancing\": {\n                    \"attributes\": {\n                        \"ROTATION\": 7,\n                        \"SCALE\": 8,\n                        \"TRANSLATION\": 6\n                    }\n                }\n            },\n            \"extras\": {\n                \"arrayIndex\": 4\n            },\n            \"matrix\": [\n                1.0,\n                0.0,\n                0.0,\n                0.0,\n                0.0,\n                1.0,\n                0.0,\n                0.0,\n                0.0,\n                0.0,\n                1.0,\n                0.0,\n                0.0,\n                0.0,\n                0.0,\n                1.0\n            ],\n            \"mesh\": 0,\n            \"name\": \"teapot0\"\n        },\n        {\n            \"children\": [\n                6\n            ],\n            \"extras\": {\n                \"arrayIndex\": 5\n            },\n            \"matrix\": [\n                240.0,\n                0.0,\n                0.0,\n                0.0,\n                0.0,\n                240.0,\n                0.0,\n                0.0,\n                0.0,\n                0.0,\n                240.0,\n                0.0,\n                0.0,\n                0.0,\n                0.0,\n                1.0\n            ],\n            \"name\": \"Placement_3\"\n        },\n        {\n            \"extras\": {\n                \"arrayIndex\": 6\n            },\n            \"mesh\": 1,\n            \"name\": \"plane\"\n        }\n    ],\n    \"scene\": 0,\n    \"scenes\": [\n        {\n            \"extras\": {\n                \"arrayIndex\": 0\n            },\n            \"name\": \"teapots_galore\",\n            \"nodes\": [\n                0\n            ]\n        }\n    ]\n}"
  },
  {
    "path": "examples/resources/skybox/Bridge2/readme.txt",
    "content": "Author\n======\n\nThis is the work of Emil Persson, aka Humus.\nhttp://www.humus.name\nhumus@comhem.se\n\n\n\nLegal stuff\n===========\n\nThis work is free and may be used by anyone for any purpose\nand may be distributed freely to anyone using any distribution\nmedia or distribution method as long as this file is included.\nDistribution without this file is allowed if it's distributed\nwith free non-commercial software; however, fair credit of the\noriginal author is expected.\nAny commercial distribution of this software requires the written\napproval of Emil Persson.\n"
  },
  {
    "path": "examples/resources/skybox/Park2/readme.txt",
    "content": "Author\n======\n\nThis is the work of Emil Persson, aka Humus.\nhttp://www.humus.name\nhumus@comhem.se\n\n\n\nLegal stuff\n===========\n\nThis work is free and may be used by anyone for any purpose\nand may be distributed freely to anyone using any distribution\nmedia or distribution method as long as this file is included.\nDistribution without this file is allowed if it's distributed\nwith free non-commercial software; however, fair credit of the\noriginal author is expected.\nAny commercial distribution of this software requires the written\napproval of Emil Persson.\n"
  },
  {
    "path": "examples/resources/skybox/mp_cloud9/Cloud 9.nfo",
    "content": "                                                                                  \n                                    .oOOOo.   o                   o              \n                                   .O     o  O                   O        .oOOo. \n                                   o         o                   o        O    o \n                                   o         O                   o        o    O \n                                   o         o  .oOo. O   o  .oOoO        `OooOo \n                                   O         O  O   o o   O  o   O             O \n                                   `o     .o o  o   O O   o  O   o             o \n                                    `OoooO'  Oo `OoO' `OoO'o `OoO'o       `OooO' \n                                               \n   \n                                                  \n                       \n                                        From the Mind of the Mighty Pete !\n\n\n                                                    Enjoy !\n            \n                                     http://www.geocities.com/petes-oasis/\n\n                                  \n\n\n                                                   $,  $,     ,            \n                                                   \"ss.$ss. .s'     \n                                           ,     .ss$$$$$$$$$$s,              \n                                           $. s$$$$$$$$$$$$$$`$$Ss       \n                                           \"$$$$$$$$$$$$$$$$$$o$$$       ,       \n                                          s$$$$$$$$$$$$$$$$$$$$$$$$s,  ,s  \n                                         s$$$$$$$$$\"$$$$$$\"\"\"\"$$$$$$\"$$$$$,     \n                                         s$$$$$$$$$$s\"\"$$$$ssssss\"$$$$$$$$\"   \n                                        s$$$$$$$$$$'         `\"\"\"ss\"$\"$s\"\"      \n                                        s$$$$$$$$$$,              `\"\"\"\"\"$  .s$$s\n                                        s$$$$$$$$$$$$s,...               `s$$'  `\n                                    `ssss$$$$$$$$$$$$$$$$$$$$####s.     .$$\"$.   , s-\n                                      `\"\"\"\"$$$$$$$$$$$$$$$$$$$$#####$$$$$$\"     $.$'\n                                            \"$$$$$$$$$$$$$$$$$$$$$####s\"\"     .$$$|\n                                             \"$$$$$$$$$$$$$$$$$$$$$$$$##s    .$$\" $ \n                                              $$\"\"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$\"   `\n                                             $$\"  \"$\"$$$$$$$$$$$$$$$$$$$$S\"\"\"\"' \n                                        ,   ,\"     '  $$$$$$$$$$$$$$$$####s  \n                                        $.          .s$$$$$$$$$$$$$$$$$####\"\n                            ,           \"$s.   ..ssS$$$$$$$$$$$$$$$$$$$####\"\n                            $           .$$$S$$$$$$$$$$$$$$$$$$$$$$$$#####\"\n                            Ss     ..sS$$$$$$$$$$$$$$$$$$$$$$$$$$$######\"\"\n                             \"$$sS$$$$$$$$$$$$$$$$$$$$$$$$$$$########\"\n                      ,      s$$$$$$$$$$$$$$$$$$$$$$$$#########\"\"'\n                      $    s$$$$$$$$$$$$$$$$$$$$$#######\"\"'      s'         ,\n                      $$..$$$$$$$$$$$$$$$$$$######\"'       ....,$$....    ,$\n                       \"$$$$$$$$$$$$$$$######\"' ,     .sS$$$$$$$$$$$$$$$$s$$\n                         $$$$$$$$$$$$#####\"     $, .s$$$$$$$$$$$$$$$$$$$$$$$$s.\n              )          $$$$$$$$$$$#####'      `$$$$$$$$$###########$$$$$$$$$$$.\n             ((          $$$$$$$$$$$#####       $$$$$$$$###\"       \"####$$$$$$$$$$ \n             ) \\         $$$$$$$$$$$$####.     $$$$$$###\"            \"###$$$$$$$$$   s'\n            (   )        $$$$$$$$$$$$$####.   $$$$$###\"  The Mighty    ####$$$$$$$$s$$'\n            )  ( (       $$\"$$$$$$$$$$$#####.$$$$$###'      Pete      .###$$$$$$$$$$\"\n            (  )  )   _,$\"   $$$$$$$$$$$$######.$$##'              .###$$$$$$$$$$\n            ) (  ( \\.         \"$$$$$$$$$$$$$#######,,,.          ..####$$$$$$$$$$$\"\n           (   )$ )  )        ,$$$$$$$$$$$$$$$$$$####################$$$$$$$$$$$\"        \n           (   ($$  ( \\     _sS\"  `\"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$S$$,       \n            )  )$$$s ) )  .      .   `$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$\"'  `$$   \n             (   $$$Ss/  .$,    .$,,s$$$$$$##S$$$$$$$$$$$$$$$$$$$$$$$$S\"\"        ' \n               \\)_$$$$$$$$$$$$$$$$$$$$$$$##\"  $$        `$$.        `$$.\n                   `\"S$$$$$$$$$$$$$$$$$#\"      $          `$          `$\n                       `\"\"\"\"\"\"\"\"\"\"\"\"\"'         '           '           '\n\n\n\n\n\n\n\n\n\n\n\n\n"
  },
  {
    "path": "examples/resources/skybox/mp_cloud9/license.txt",
    "content": "This skybox has been created by 'The Mighty Pete'. He can be reached\nat the following WEB site:\n\nhttp://www.petesoasis.com\n\nThe author grants you the right to freely use this sky box in your projects\nand distribute it under the GNU General Public License version 2.\n"
  },
  {
    "path": "examples/resources/skybox/mp_cloud9/mp_cloud9.shader",
    "content": "textures/skies/mp_cloud9\n{\n\tqer_editorimage env/mp_cloud9/cloud9_ft.tga\n\tsurfaceparm noimpact\n\tsurfaceparm nolightmap\n\tq3map_globaltexture\n\tq3map_lightsubdivide 256\n\tq3map_surfacelight 100\n\tsurfaceparm sky\n\tq3map_sun 1 1 1 100 0 90\n\tskyparms env/mp_cloud9/cloud9 - -\n}\n"
  },
  {
    "path": "examples/resources/skybox/skyboxsun25deg/skyboxsun25degtest.txt",
    "content": "http://reije081.home.xs4all.nl/skyboxes/\n"
  },
  {
    "path": "examples/scene_anchor.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>t3d - anchor matrix</title>\n\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n\t<link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n</head>\n<body>\n    <div id=\"info\">\n        <a href=\"\" target=\"_blank\">t3d</a> - anchor matrix\n    </div>\n\n\t<script src=\"./libs/nanobar.js\"></script>\n\n\t<!-- Import maps polyfill -->\n    <!-- Remove this when import maps will be widely supported -->\n    <script async src=\"./libs/es-module-shims.js\"></script>\n\n    <script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n    <script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { Timer } from 't3d/addons/misc/Timer.js';\n\t\timport { GLTFLoader } from 't3d/addons/loaders/glTF/GLTFLoader.js';\n\t\timport { TextureCubeLoader } from 't3d/addons/loaders/TextureCubeLoader.js';\n\t\timport { ForwardRenderer } from 't3d/addons/render/ForwardRenderer.js';\n\t\timport { SkyBox } from 't3d/addons/objects/SkyBox.js';\n\t\timport { GUI } from './libs/lil-gui.esm.min.js';\n\n\t\tlet width = window.innerWidth || 2;\n\t\tlet height = window.innerHeight || 2;\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = width * window.devicePixelRatio;\n\t\tcanvas.height = height * window.devicePixelRatio;\n\t\tcanvas.style.width = width + 'px';\n\t\tcanvas.style.height = height + 'px';\n\t\tdocument.body.appendChild(canvas);\n\n\t\tconst forwardRenderer = new ForwardRenderer(canvas);\n\n\t\tconst cubeTexturePath = './resources/skybox/Bridge2/';\n\t\tconst cubeTexture = new TextureCubeLoader().load([\n\t\t\tcubeTexturePath + 'posx.jpg',\n\t\t\tcubeTexturePath + 'negx.jpg',\n\t\t\tcubeTexturePath + 'posy.jpg',\n\t\t\tcubeTexturePath + 'negy.jpg',\n\t\t\tcubeTexturePath + 'posz.jpg',\n\t\t\tcubeTexturePath + 'negz.jpg'\n\t\t]);\n\t\tcubeTexture.encoding = t3d.TEXEL_ENCODING_TYPE.SRGB;\n\n\t\tconst scene = new t3d.Scene();\n\t\tscene.environment = cubeTexture;\n\n\t\tconst skyBox = new SkyBox(cubeTexture);\n\t\tskyBox.level = 0;\n\t\tskyBox.gamma = true;\n\t\tscene.add(skyBox);\n\n\t\tlet animation;\n\n\t\tconst nanobar = new Nanobar();\n\t\tnanobar.el.style.background = 'gray';\n\n\t\tconst loadingManager = new t3d.LoadingManager(function() {\n\t\t\tnanobar.go(100);\n\t\t\tnanobar.el.style.background = 'transparent';\n\t\t}, function(url, itemsLoaded, itemsTotal) {\n\t\t\tif (itemsLoaded < itemsTotal) {\n\t\t\t\tnanobar.go(itemsLoaded / itemsTotal * 100);\n\t\t\t}\n\t\t});\n\n\t\tconst loader = new GLTFLoader(loadingManager);\n\t\tloader.load(\n\t\t\t'./resources/models/gltf/UinoMan/glTF/UinoMan.gltf'\n\t\t).then(function(result) {\n\t\t\tconst object = result.root;\n\n\t\t\tobject.traverse(function(node) {\n\t\t\t\tif (node.material) {\n\t\t\t\t\tnode.castShadow = true;\n\t\t\t\t\tnode.frustumCulled = false;\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tanimation = new t3d.AnimationMixer();\n\t\t\tconst action = new t3d.AnimationAction(result.animations[2]);\n\t\t\taction.weight = 1;\n\t\t\tanimation.addAction(action);\n\n\t\t\tscene.add(object);\n\n\t\t\tconst gui = new GUI();\n\t\t\tgui.add(params, 'anchor').onChange(updateAnchor);\n\t\t\tgui.add(params, 'offset', 0, 10000000, 1000).onChange(updateAnchor);\n\t\t\tgui.add(params, 'rotation', 0, 180, 0.1).onChange(updateAnchor);\n\t\t}).catch(e => console.error(e));\n\n\t\tconst plane_geometry = new t3d.PlaneGeometry(10, 10);\n\t\tconst plane_material = new t3d.PBRMaterial();\n\t\tplane_material.roughness = 0.8;\n\t\tplane_material.metalness = 0.2;\n\t\tplane_material.diffuse.setHex(0x888888);\n\t\tconst plane = new t3d.Mesh(plane_geometry, plane_material);\n\t\tplane.receiveShadow = true;\n\t\tscene.add(plane);\n\n\t\tconst ambientLight = new t3d.AmbientLight(0xffffff, 0.4);\n\t\tscene.add(ambientLight);\n\n\t\tconst directionalLight = new t3d.DirectionalLight(0xffffff, 0.7);\n\t\tdirectionalLight.position.set(0, 5, 5);\n\t\tdirectionalLight.lookAt(new t3d.Vector3(), new t3d.Vector3(0, 1, 0));\n\t\tdirectionalLight.shadow.windowSize = 5;\n\t\tdirectionalLight.castShadow = true;\n\t\tscene.add(directionalLight);\n\n\t\tconst camera = new t3d.Camera();\n\t\tcamera.outputEncoding = t3d.TEXEL_ENCODING_TYPE.SRGB;\n\t\tcamera.position.set(4, 2, 4);\n\t\tcamera.lookAt(new t3d.Vector3(0, 1, 0), new t3d.Vector3(0, 1, 0));\n\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 1000);\n\t\tscene.add(camera);\n\n\t\tconst anchorOffset = new t3d.Vector3();\n\t\tconst anchorRotation = new t3d.Euler();\n\t\tconst anchorQuaternion = new t3d.Quaternion();\n\t\tconst anchorScale = new t3d.Vector3(1, 1, 1);\n\n\t\tconst params = { anchor: true, offset: 880000, rotation: 0 };\n\n\t\tfunction updateAnchor() {\n\t\t\tanchorOffset.set(1, 1, 1).multiplyScalar(params.offset);\n\t\t\tanchorRotation.y = params.rotation / 180 * Math.PI;\n\t\t\tanchorQuaternion.setFromEuler(anchorRotation);\n\n\t\t\tscene.position.copy(anchorOffset);\n\n\t\t\tif (params.anchor) {\n\t\t\t\tscene.anchorMatrix.compose(anchorOffset, anchorQuaternion, anchorScale);\n\t\t\t} else {\n\t\t\t\tscene.anchorMatrix.identity();\n\t\t\t}\n\t\t}\n\n\t\tupdateAnchor();\n\t\t\n\t\tconst timer = new Timer();\n\n\t\tfunction loop(timestamp) {\n\t\t\trequestAnimationFrame(loop);\n\n\t\t\ttimer.update(timestamp);\n\n\t\t\tif (animation) {\n\t\t\t\tanimation.update(timer.getDelta());\n\t\t\t}\n\n\t\t\t// rotate camera\n\t\t\tcamera.position.x = 4 * Math.sin(timer.getElapsed() * .2);\n\t\t\tcamera.position.z = 4 * Math.cos(timer.getElapsed() * .2);\n\t\t\tcamera.lookAt(new t3d.Vector3(0, 1, 0), new t3d.Vector3(0, 1, 0));\n\n\t\t\tforwardRenderer.render(scene, camera);\n\t\t}\n\t\trequestAnimationFrame(loop);\n\n\t\tfunction onWindowResize() {\n\t\t\twidth = window.innerWidth || 2;\n\t\t\theight = window.innerHeight || 2;\n\n\t\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 1000);\n\n\t\t\tforwardRenderer.screenRenderTarget.resize(width * window.devicePixelRatio, height * window.devicePixelRatio);\n\n\t\t\tcanvas.style.width = width + 'px';\n\t\t\tcanvas.style.height = height + 'px';\n\t\t}\n\t\twindow.addEventListener('resize', onWindowResize, false);\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "examples/scene_clippingplanes.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>t3d - scene clipping planes</title>\n\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n\t<link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n</head>\n<body>\n    <div id=\"info\">\n        <a href=\"\" target=\"_blank\">t3d</a> - scene clipping planes\n    </div>\n\n\t<!-- Import maps polyfill -->\n    <!-- Remove this when import maps will be widely supported -->\n    <script async src=\"./libs/es-module-shims.js\"></script>\n\n    <script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n    <script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { ForwardRenderer } from 't3d/addons/render/ForwardRenderer.js';\n\n\t\tlet width = window.innerWidth || 2;\n\t\tlet height = window.innerHeight || 2;\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = width;\n\t\tcanvas.height = height;\n\t\tdocument.body.appendChild(canvas);\n\n\t\tconst forwardRenderer = new ForwardRenderer(canvas);\n\n\t\tconst scene = new t3d.Scene();\n\t\tscene.clippingPlanes = [new t3d.Plane(new t3d.Vector3(-1, 0, 0), 4), new t3d.Plane(new t3d.Vector3(1, 0, 0), 4)];\n\n\t\tconst sphere_geometry = new t3d.SphereGeometry(10, 20, 20);\n\t\tconst phong = new t3d.PhongMaterial();\n\t\tphong.diffuse.setHex(0xffffff);\n\t\tphong.side = t3d.DRAW_SIDE.DOUBLE;\n\t\tconst sphere = new t3d.Mesh(sphere_geometry, phong);\n\t\tsphere.castShadow = true;\n\t\tscene.add(sphere);\n\n\t\tconst plane_geometry = new t3d.PlaneGeometry(100, 100);\n\t\tconst lambert = new t3d.LambertMaterial();\n\t\tlambert.diffuse.setHex(0xffffff);\n\t\tconst plane = new t3d.Mesh(plane_geometry, lambert);\n\t\tplane.position.y = -10;\n\t\tplane.receiveShadow = true;\n\t\tscene.add(plane);\n\n\t\tconst ambientLight = new t3d.AmbientLight(0xffffff, 0.3);\n\t\tscene.add(ambientLight);\n\n\t\tconst directionalLight = new t3d.DirectionalLight(0xffffff, 0.7);\n\t\tdirectionalLight.position.set(-40, 40, 0);\n\t\tdirectionalLight.lookAt(new t3d.Vector3(), new t3d.Vector3(0, 1, 0));\n\t\tdirectionalLight.shadow.windowSize = 100;\n\t\tdirectionalLight.castShadow = true;\n\t\tscene.add(directionalLight);\n\n\t\tconst camera = new t3d.Camera();\n\t\tcamera.position.set(0, 80, 100);\n\t\tcamera.lookAt(new t3d.Vector3(0, 0, 0), new t3d.Vector3(0, 1, 0));\n\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 1000);\n\t\tscene.add(camera);\n\n\t\tfunction loop(count) {\n\t\t\trequestAnimationFrame(loop);\n\n\t\t\t// rotate camera\n\t\t\tcamera.position.x = 100 * Math.sin(count / 1000 * .5);\n\t\t\tcamera.position.z = 100 * Math.cos(count / 1000 * .5);\n\t\t\tcamera.lookAt(new t3d.Vector3(0, 0, 0), new t3d.Vector3(0, 1, 0));\n\n\t\t\tforwardRenderer.render(scene, camera);\n\t\t}\n\t\trequestAnimationFrame(loop);\n\n\t\tfunction onWindowResize() {\n\t\t\twidth = window.innerWidth || 2;\n\t\t\theight = window.innerHeight || 2;\n\n\t\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 1000);\n\n\t\t\tforwardRenderer.screenRenderTarget.resize(width, height);\n\t\t}\n\t\twindow.addEventListener('resize', onWindowResize, false);\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "examples/scene_fog.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>t3d - fog</title>\n\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n\t<link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n</head>\n<body>\n    <div id=\"info\" class=\"dark\">\n        <a href=\"\" target=\"_blank\">t3d</a> - fog\n    </div>\n\n\t<!-- Import maps polyfill -->\n    <!-- Remove this when import maps will be widely supported -->\n    <script async src=\"./libs/es-module-shims.js\"></script>\n\n    <script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n    <script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { ForwardRenderer } from 't3d/addons/render/ForwardRenderer.js';\n\t\timport { OrbitControls } from 't3d/addons/controls/OrbitControls.js';\n\t\timport { SkyBox } from 't3d/addons/objects/SkyBox.js';\n\t\timport { TextureCubeLoader } from 't3d/addons/loaders/TextureCubeLoader.js';\n\t\timport { GUI } from './libs/lil-gui.esm.min.js';\n\n\t\tlet width = window.innerWidth || 2;\n\t\tlet height = window.innerHeight || 2;\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = width;\n\t\tcanvas.height = height;\n\t\tdocument.body.appendChild(canvas);\n\n\t\tconst forwardRenderer = new ForwardRenderer(canvas);\n\n\t\tconst cubeTexturePath = './resources/skybox/sunset/';\n\t\tconst cubeTexture = new TextureCubeLoader().load([\n\t\t\tcubeTexturePath + 'px.jpg',\n\t\t\tcubeTexturePath + 'nx.jpg',\n\t\t\tcubeTexturePath + 'py.jpg',\n\t\t\tcubeTexturePath + 'ny.jpg',\n\t\t\tcubeTexturePath + 'pz.jpg',\n\t\t\tcubeTexturePath + 'nz.jpg'\n\t\t]);\n\t\tcubeTexture.encoding = t3d.TEXEL_ENCODING_TYPE.SRGB;\n\n\t\tconst scene = new t3d.Scene();\n\t\tscene.environment = cubeTexture;\n\n\t\tconst fogColor = 0xffe1b8;\n\n\t\tconst fog = new t3d.Fog(fogColor, 1, 1000);\n\t\tconst fogExp2 = new t3d.FogExp2(fogColor, 0.002);\n\t\tscene.fog = fogExp2;\n\n\t\tconst skyBox = new SkyBox(cubeTexture);\n\t\tskyBox.gamma = true;\n\t\tskyBox.fog = true;\n\t\tfog.color.toArray(skyBox.material.uniforms.fogColor);\n\t\tscene.add(skyBox);\n\n\t\tconst ambientLight = new t3d.AmbientLight(0xffffff, 0.1);\n\t\tambientLight.color.setRGB(0.6, 0.7, 0.8);\n\t\tscene.add(ambientLight);\n\n\t\tconst directionalLight = new t3d.DirectionalLight(0xffffff, 0.7);\n\t\tdirectionalLight.position.set(-40, 40, -40);\n\t\tdirectionalLight.lookAt(new t3d.Vector3(), new t3d.Vector3(0, 1, 0));\n\t\tscene.add(directionalLight);\n\n\t\tconst camera = new t3d.Camera();\n\t\tcamera.outputEncoding = t3d.TEXEL_ENCODING_TYPE.SRGB;\n\t\tcamera.position.set(500, 80, 350);\n\t\tcamera.lookAt(new t3d.Vector3(0, 0, 0), new t3d.Vector3(0, 1, 0));\n\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 8000);\n\t\tscene.add(camera);\n\n\t\tconst controller = new OrbitControls(camera, canvas);\n\t\tcontroller.target.set(0, 0, 0);\n\t\tcontroller.maxDistance = 1000;\n\t\tcontroller.maxPolarAngle = Math.PI / 2;\n\n\t\tconst baisc = new t3d.BasicMaterial();\n\t\tconst lambert = new t3d.LambertMaterial();\n\t\tconst phong = new t3d.PhongMaterial();\n\t\tconst pbr = new t3d.PBRMaterial();\n\n\t\tconst boxGeometry = new t3d.BoxGeometry(20, 20, 20);\n\t\tconst boxMaterials = [baisc, lambert, phong, pbr];\n\n\t\tfor (let i = 0; i < 90; i++) {\n\t\t\tconst box = new t3d.Mesh(boxGeometry, boxMaterials[i % 4]);\n\t\t\tbox.position.x = Math.random() * 500 - 250;\n\t\t\tbox.position.z = Math.random() * 500 - 250;\n\t\t\tbox.scale.y = Math.random() * 7 + 1;\n\t\t\tscene.add(box);\n\t\t}\n\n\t\tconst planeGeometry = new t3d.PlaneGeometry(10000, 10000);\n\t\tconst planeMaterial = new t3d.PBRMaterial();\n\t\tplaneMaterial.roughness = 1;\n\t\tplaneMaterial.dithering = true;\n\t\tconst plane = new t3d.Mesh(planeGeometry, planeMaterial);\n\t\tplane.position.y -= 10;\n\t\tscene.add(plane);\n\n\t\t// gui\n\n\t\tconst gui = new GUI();\n\n\t\tgui.add({ type: 'exp' }, 'type', ['linear', 'exp', 'none']).onChange(value => {\n\t\t\tswitch (value) {\n\t\t\t\tcase 'linear':\n\t\t\t\t\tscene.fog = fog;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'exp':\n\t\t\t\t\tscene.fog = fogExp2;\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tscene.fog = null;\n\t\t\t}\n\n\t\t\tdensityControl.disable(value !== 'exp');\n\t\t\tnearControl.disable(value !== 'linear');\n\t\t\tfarControl.disable(value !== 'linear');\n\t\t});\n\t\tgui.addColor(skyBox.material.uniforms, 'fogColor').onChange(value => {\n\t\t\tfog.color.fromArray(value);\n\t\t\tfogExp2.color.fromArray(value);\n\t\t});\n\t\tconst densityControl = gui.add(fogExp2, 'density', 0, 0.005, 0.0001);\n\t\tconst nearControl = gui.add(fog, 'near', 1, 200, 0.1).disable();\n\t\tconst farControl = gui.add(fog, 'far', 200, 5000, 1).disable();\n\n\t\tconst skyFolder = gui.addFolder('sky').close();\n\t\tskyFolder.add(skyBox, 'fog');\n\t\tskyFolder.add(skyBox.material.uniforms, 'fogStart', -0.5, 0.5, 0.01);\n\t\tskyFolder.add(skyBox.material.uniforms, 'fogHeight', 0.0, 1.0, 0.01);\n\n\t\tfunction loop(count) {\n\t\t\trequestAnimationFrame(loop);\n\n\t\t\tcontroller.update();\n\n\t\t\tforwardRenderer.render(scene, camera);\n\t\t}\n\t\trequestAnimationFrame(loop);\n\n\t\tfunction onWindowResize() {\n\t\t\twidth = window.innerWidth || 2;\n\t\t\theight = window.innerHeight || 2;\n\n\t\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 8000);\n\n\t\t\tforwardRenderer.screenRenderTarget.resize(width, height);\n\t\t}\n\t\twindow.addEventListener('resize', onWindowResize, false);\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "examples/scene_gamma_correction.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>t3d - gamma correction</title>\n\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n\t<link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n</head>\n<body>\n    <div id=\"info\">\n        <a href=\"\" target=\"_blank\">t3d</a> - gamma correction\n    </div>\n\n\t<!-- Import maps polyfill -->\n    <!-- Remove this when import maps will be widely supported -->\n    <script async src=\"./libs/es-module-shims.js\"></script>\n\n    <script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n    <script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { ForwardRenderer } from 't3d/addons/render/ForwardRenderer.js';\n\t\timport { Texture2DLoader } from 't3d/addons/loaders/Texture2DLoader.js';\n\t\timport { GUI } from './libs/lil-gui.esm.min.js';\n\n\t\tlet width = window.innerWidth || 2;\n\t\tlet height = window.innerHeight || 2;\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = width;\n\t\tcanvas.height = height;\n\t\tdocument.body.appendChild(canvas);\n\n\t\tconst forwardRenderer = new ForwardRenderer(canvas);\n\n\t\tconst scene = new t3d.Scene();\n\n\t\tconst texture = new Texture2DLoader().load('./resources/hardwood2_diffuse.jpg');\n\n\t\tconst cube_geometry = new t3d.BoxGeometry(16, 16, 16);\n\t\tconst phong = new t3d.PhongMaterial();\n\t\tphong.diffuseMap = texture;\n\t\tconst cube = new t3d.Mesh(cube_geometry, phong);\n\t\tcube.castShadow = true;\n\t\tscene.add(cube);\n\n\t\tconst plane_geometry = new t3d.PlaneGeometry(100, 100);\n\t\tconst lambert = new t3d.LambertMaterial();\n\t\tlambert.diffuse.setHex(0xffffff);\n\t\tconst plane = new t3d.Mesh(plane_geometry, lambert);\n\t\tplane.position.y = -8;\n\t\tscene.add(plane);\n\n\t\tconst ambientLight = new t3d.AmbientLight(0xffffff, 0.2);\n\t\tscene.add(ambientLight);\n\n\t\tconst pointLight = new t3d.PointLight(0x00ff00, 1, 100);\n\t\tpointLight.position.set(20, 10, -20);\n\t\tscene.add(pointLight);\n\n\t\tconst lightBall_geometry = new t3d.SphereGeometry(4, 30, 30);\n\t\tconst basic = new t3d.BasicMaterial();\n\t\tbasic.diffuse.setHex(0x00ff00);\n\t\tconst lightBall = new t3d.Mesh(lightBall_geometry, basic);\n\t\tlightBall.position.set(20, 10, -20);\n\t\tscene.add(lightBall);\n\n\t\tconst camera = new t3d.Camera();\n\t\tcamera.gammaFactor = 1.5;\n\t\tcamera.outputEncoding = t3d.TEXEL_ENCODING_TYPE.GAMMA;\n\t\tcamera.position.set(0, 80, 100);\n\t\tcamera.lookAt(new t3d.Vector3(0, 0, 0), new t3d.Vector3(0, 1, 0));\n\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 1000);\n\t\tscene.add(camera);\n\n\t\tplane.receiveShadow = true;\n\t\tpointLight.castShadow = true;\n\n\t\tconst encodingOptions = {\n\t\t\t'Linear': t3d.TEXEL_ENCODING_TYPE.LINEAR,\n\t\t\t'Gamma': t3d.TEXEL_ENCODING_TYPE.GAMMA,\n\t\t\t'SRGB': t3d.TEXEL_ENCODING_TYPE.SRGB\n\t\t};\n\n\t\tconst gui = new GUI();\n\t\tgui.add(camera, 'outputEncoding', encodingOptions);\n\t\tgui.add(camera, 'gammaFactor', 0, 2, 0.1);\n\n\t\tfunction loop(count) {\n\t\t\trequestAnimationFrame(loop);\n\n\t\t\t// rotate camera\n\t\t\tcamera.position.x = 100 * Math.sin(count / 1000 * .5);\n\t\t\tcamera.position.z = 100 * Math.cos(count / 1000 * .5);\n\t\t\tcamera.lookAt(new t3d.Vector3(0, 0, 0), new t3d.Vector3(0, 1, 0));\n\n\t\t\tforwardRenderer.render(scene, camera);\n\t\t}\n\t\trequestAnimationFrame(loop);\n\n\t\tfunction onWindowResize() {\n\t\t\twidth = window.innerWidth || 2;\n\t\t\theight = window.innerHeight || 2;\n\n\t\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 1000);\n\n\t\t\tforwardRenderer.screenRenderTarget.resize(width, height);\n\t\t}\n\t\twindow.addEventListener('resize', onWindowResize, false);\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "examples/sprite_sprites.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>t3d - sprites</title>\n\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n\t<link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n</head>\n<body>\n    <div id=\"info\">\n        <a href=\"\" target=\"_blank\">t3d</a> - sprites\n    </div>\n\n\t<!-- Import maps polyfill -->\n    <!-- Remove this when import maps will be widely supported -->\n    <script async src=\"./libs/es-module-shims.js\"></script>\n\n    <script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n    <script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { Sprite } from 't3d/addons/objects/Sprite.js';\n\t\timport { OrbitControls } from 't3d/addons/controls/OrbitControls.js';\n\t\timport { ForwardRenderer } from 't3d/addons/render/ForwardRenderer.js';\n\t\timport { Texture2DLoader } from 't3d/addons/loaders/Texture2DLoader.js';\n\n\t\tlet width = window.innerWidth || 2;\n\t\tlet height = window.innerHeight || 2;\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = width;\n\t\tcanvas.height = height;\n\t\tdocument.body.appendChild(canvas);\n\n\t\tconst forwardRenderer = new ForwardRenderer(canvas);\n\n\t\tconst scene = new t3d.Scene();\n\t\tscene.fog = new t3d.Fog(0x000000, 1, 40);\n\n\t\tconst loader = new Texture2DLoader();\n\n\t\tconst texture1 = loader.load('./resources/sprites/snowflake1.png');\n\t\tconst texture2 = loader.load('./resources/sprites/snowflake2.png');\n\t\tconst texture3 = loader.load('./resources/sprites/snowflake3.png');\n\t\tconst texture4 = loader.load('./resources/sprites/snowflake4.png');\n\t\tconst texture5 = loader.load('./resources/sprites/snowflake5.png');\n\n\t\tconst texs = [texture1, texture2, texture3, texture4, texture5];\n\n\t\tconst sprites = [];\n\t\tfor (let i = 0; i < 300; i++) {\n\t\t\tconst sprite = new Sprite();\n\t\t\tsprite.material.diffuseMap = texs[Math.round(Math.random() * 4)];\n\t\t\tsprite.material.diffuse.setHSL(Math.random(), Math.random(), Math.random());\n\t\t\tsprite.material.transparent = true;\n\t\t\tsprite.material.blending = t3d.BLEND_TYPE.ADD;\n\n\t\t\tsprite.position.x = (Math.random() - 0.5) * 10;\n\t\t\tsprite.position.y = (Math.random() - 0.5) * 10;\n\t\t\tsprite.position.z = (Math.random() - 0.5) * 10;\n\t\t\tsprite.scale.set(2, 2, 1);\n\n\t\t\tscene.add(sprite);\n\t\t\tsprites.push(sprite);\n\t\t}\n\n\t\tconst sphere_geometry = new t3d.SphereGeometry(0.5, 4, 2);\n\t\tconst basic = new t3d.BasicMaterial();\n\t\tbasic.diffuse.setHex(0x00cccc);\n\t\tconst sphere = new t3d.Mesh(sphere_geometry, basic);\n\t\tscene.add(sphere);\n\n\t\tconst camera = new t3d.Camera();\n\t\tcamera.position.set(0, 0, 10);\n\t\tcamera.lookAt(new t3d.Vector3(0, 0, 0), new t3d.Vector3(0, 1, 0));\n\t\tcamera.setPerspective(75 / 180 * Math.PI, width / height, 1, 2000);\n\t\tscene.add(camera);\n\t\t\n\t\tconst controller = new OrbitControls(camera, canvas);\n\n\t\tfunction loop(count) {\n\t\t\trequestAnimationFrame(loop);\n\n\t\t\t// rotate camera\n\t\t\t// camera.position.x = 10 * Math.sin(count / 8000);\n\t\t\t// camera.position.z = 10 * Math.cos(count / 8000);\n\t\t\t// camera.lookAt(new t3d.Vector3(0, 0, 0), new t3d.Vector3(0, 1, 0));\n\n\t\t\tcontroller.update();\n\n\t\t\tfor (let i = 0; i < sprites.length; i++) {\n\t\t\t\tsprites[i].rotation = count / 1000 * 2;\n\n\t\t\t\tconst scale = Math.cos(count / 100 + i * 10) * 0.5 + 0.7;\n\t\t\t\tsprites[i].scale.set(scale, scale, 1);\n\n\t\t\t\t// const key = count / (i % 15 * 100);\n\t\t\t\t// const h = Math.cos(key) * 0.5 + 0.5;\n\t\t\t\t// const s = Math.sin(key) * 0.5 + 0.5;\n\t\t\t\t// const l = Math.cos(key) * 0.5 + 0.5;\n\t\t\t\t// sprites[i].material.diffuse.setHSL(h, s, l);\n\t\t\t}\n\n\t\t\tforwardRenderer.render(scene, camera);\n\t\t}\n\t\trequestAnimationFrame(loop);\n\n\t\tfunction onWindowResize() {\n\t\t\twidth = window.innerWidth || 2;\n\t\t\theight = window.innerHeight || 2;\n\n\t\t\tcamera.setPerspective(75 / 180 * Math.PI, width / height, 1, 2000);\n\n\t\t\tforwardRenderer.screenRenderTarget.resize(width, height);\n\t\t}\n\t\twindow.addEventListener('resize', onWindowResize, false);\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "examples/stereo_anaglyph.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>t3d - anaglyph</title>\n\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n\t<link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n</head>\n<body>\n    <div id=\"info\">\n        <a href=\"\" target=\"_blank\">t3d</a> - anaglyph\n    </div>\n\n\t<!-- Import maps polyfill -->\n    <!-- Remove this when import maps will be widely supported -->\n    <script async src=\"./libs/es-module-shims.js\"></script>\n\n    <script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n    <script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { SkyBox } from 't3d/addons/objects/SkyBox.js';\n\t\timport { StereoCamera } from 't3d/addons/stereo/StereoCamera.js';\n\t\timport { AnaglyphRenderer } from 't3d/addons/stereo/AnaglyphRenderer.js';\n\t\timport { TextureCubeLoader } from 't3d/addons/loaders/TextureCubeLoader.js';\n\t\timport { OrbitControls } from 't3d/addons/controls/OrbitControls.js';\n\t\timport { GUI } from './libs/lil-gui.esm.min.js';\n\n\t\tlet width = window.innerWidth || 2;\n\t\tlet height = window.innerHeight || 2;\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = width;\n\t\tcanvas.height = height;\n\t\tdocument.body.appendChild(canvas);\n\n\t\tconst anaglyphRenderer = new AnaglyphRenderer(canvas);\n\t\tanaglyphRenderer.shadowAutoUpdate = false;\n\t\tanaglyphRenderer._renderTargetL.texture.encoding = t3d.TEXEL_ENCODING_TYPE.SRGB;\n\t\tanaglyphRenderer._renderTargetR.texture.encoding = t3d.TEXEL_ENCODING_TYPE.SRGB;\n\n\t\tconst cubeTexturePath = './resources/skybox/pisa/';\n\t\tconst cubeTexture = new TextureCubeLoader().load([\n\t\t\tcubeTexturePath + 'px.png',\n\t\t\tcubeTexturePath + 'nx.png',\n\t\t\tcubeTexturePath + 'py.png',\n\t\t\tcubeTexturePath + 'ny.png',\n\t\t\tcubeTexturePath + 'pz.png',\n\t\t\tcubeTexturePath + 'nz.png'\n\t\t]);\n\t\tcubeTexture.encoding = t3d.TEXEL_ENCODING_TYPE.SRGB;\n\n\t\tconst scene = new t3d.Scene();\n\t\tscene.environment = cubeTexture;\n\n\t\tconst skyBox = new SkyBox(cubeTexture);\n\t\tskyBox.gamma = true;\n\t\tscene.add(skyBox);\n\n\t\tconst spheres = [];\n\n\t\tconst geometry = new t3d.SphereGeometry(0.1, 32, 16);\n\t\tconst material = new t3d.BasicMaterial();\n\n\t\tfor (let i = 0; i < 200; i++) {\n\t\t\tconst mesh = new t3d.Mesh(geometry, material);\n\t\t\tmesh.position.x = Math.random() * 10 - 5;\n\t\t\tmesh.position.y = Math.random() * 10 - 5;\n\t\t\tmesh.position.z = Math.random() * 10 - 5;\n\t\t\tmesh.scale.x = mesh.scale.y = mesh.scale.z = Math.random() * 3 + 1;\n\n\t\t\tscene.add(mesh);\n\t\t\tspheres.push(mesh);\n\t\t}\n\n\t\tconst camera = new t3d.Camera();\n\t\tcamera.position.set(0, 0, 3);\n\t\tcamera.lookAt(new t3d.Vector3(0, 0, 0), new t3d.Vector3(0, 1, 0));\n\t\tcamera.setPerspective(60 / 180 * Math.PI, width / height, 0.1, 100);\n\t\tscene.add(camera);\n\t\t\n\t\tconst stereoCamera = new StereoCamera();\n\t\tscene.add(stereoCamera);\n\n\t\tconst controller = new OrbitControls(camera, canvas);\n\t\tcontroller.target.set(0, 1, 0);\n\n\t\tconst gui = new GUI();\n\t\tgui.add(anaglyphRenderer, 'eyeSep', 0.06, 0.075, 0.001);\n\t\tgui.add(anaglyphRenderer, 'focus', 5, 100, 0.01);\n\t\t\n\t\trequestAnimationFrame(loop);\n\t\t\n\t\tfunction loop(timestamp) {\n\t\t\trequestAnimationFrame(loop);\n\t\t\n\t\t\tcontroller.update();\n\n\t\t\tconst timer = 0.0001 * timestamp;\n\t\t\tfor (let i = 0, il = spheres.length; i < il; i++) {\n\t\t\t\tconst sphere = spheres[i];\n\n\t\t\t\tsphere.position.x = 5 * Math.cos(timer + i);\n\t\t\t\tsphere.position.y = 5 * Math.sin(timer + i * 1.1);\n\t\t\t}\n\n\t\t\tanaglyphRenderer.render(scene, camera, stereoCamera);\n\t\t}\n\n\t\tfunction onWindowResize() {\n\t\t\twidth = window.innerWidth || 2;\n\t\t\theight = window.innerHeight || 2;\n\n\t\t\tcamera.setPerspective(60 / 180 * Math.PI, width / height, 0.1, 100);\n\t\t\tcamera.aspect = width / height;\n\n\t\t\tanaglyphRenderer.screenRenderTarget.resize(width, height);\n\t\t\tanaglyphRenderer.resize(width, height);\n\t\t}\n\n\t\twindow.addEventListener('resize', onWindowResize, false);\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "examples/stereo_webvr_car.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>t3d - car</title>\n\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n\t<link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n</head>\n<body>\n    <div id=\"info\">\n        <a href=\"\" target=\"_blank\">t3d</a> - car\n\t\t<br/>\n\t\tit's a webvr demo\n    </div>\n\n\t<script src=\"./libs/webvr-polyfill.min.js\"></script>\n\n\t<!-- Import maps polyfill -->\n    <!-- Remove this when import maps will be widely supported -->\n    <script async src=\"./libs/es-module-shims.js\"></script>\n\n    <script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n    <script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { StereoCamera } from 't3d/addons/stereo/StereoCamera.js';\n\t\timport { StereoRenderer } from 't3d/addons/stereo/StereoRenderer.js';\n\t\timport { AssimpJsonLoader } from 't3d/addons/loaders/AssimpJsonLoader.js';\n\t\timport { WebVRControl } from 't3d/addons/stereo/WebVRControls.js';\n\n\t\tlet width = window.innerWidth || 2;\n\t\tlet height = window.innerHeight || 2;\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = width;\n\t\tcanvas.height = height;\n\t\tdocument.body.appendChild(canvas);\n\n\t\tconst stereoRenderer = new StereoRenderer(canvas);\n\t\tstereoRenderer.shadowAutoUpdate = false;\n\n\t\tconst scene = new t3d.Scene();\n\n\t\tconst jeep = 'resources/models/assimp/jeep/jeep.assimp.json';\n\t\tconst interior = 'resources/models/assimp/interior/interior.assimp.json';\n\n\t\tconst loader1 = new AssimpJsonLoader();\n\t\tloader1.load(jeep, function(object) {\n\t\t\tobject.scale.set(0.4, 0.4, 0.4);\n\n\t\t\tobject.traverse(function(obj) {\n\t\t\t\tif (obj.isMesh) {\n\t\t\t\t\tobj.castShadow = true;\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tscene.add(object);\n\n\t\t\tstereoRenderer.shadowNeedsUpdate = true;\n\t\t});\n\n\t\tconst loader2 = new AssimpJsonLoader();\n\t\tloader2.load(interior, function(object) {\n\t\t\tobject.traverse(function(obj) {\n\t\t\t\tif (obj.isMesh) {\n\t\t\t\t\tobj.receiveShadow = true;\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tscene.add(object);\n\t\t});\n\n\t\tconst ambientLight = new t3d.AmbientLight(0xffffff, 0.5);\n\t\tscene.add(ambientLight);\n\n\t\tconst spotLight = new t3d.SpotLight(0xffffff, 0.4, 30, Math.PI / 5, 0.3);\n\t\tspotLight.position.set(0, 10, 0);\n\t\tspotLight.lookAt(new t3d.Vector3(0, 0, 0), new t3d.Vector3(0, 1, 0));\n\t\tspotLight.castShadow = true;\n\t\tscene.add(spotLight);\n\n\t\tconst camera = new StereoCamera();\n\t\tcamera.position.set(3.0, 2.3, 1.0);\n\t\tcamera.near = 1;\n\t\tcamera.far = 1000;\n\t\tscene.add(camera);\n\t\t\n\t\tconst webvrControl = new WebVRControl(camera);\n\t\twebvrControl.enter().then(function(context) {\n\t\t\tcontext.requestAnimationFrame(loop);\n\t\t}).catch(function(e) {\n\t\t\tconsole.error(e);\n\t\t});\n\n\t\tfunction loop(count) {\n\t\t\t// request AnimationFrame by webvr display\n\t\t\twebvrControl.getContext().requestAnimationFrame(loop);\n\n\t\t\twebvrControl.update();\n\n\t\t\tstereoRenderer.render(scene, camera);\n\n\t\t\twebvrControl.submit();\n\t\t}\n\n\t\tfunction onWindowResize() {\n\t\t\twidth = window.innerWidth || 2;\n\t\t\theight = window.innerHeight || 2;\n\n\t\t\tstereoRenderer.screenRenderTarget.resize(width, height);\n\t\t}\n\t\twindow.addEventListener('resize', onWindowResize, false);\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "examples/stereo_webxr_vr_car.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>t3d - car</title>\n\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n\t<link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n</head>\n<body>\n    <div id=\"info\">\n        <a href=\"\" target=\"_blank\">t3d</a> - car\n\t\t<br/>\n\t\t<div id=\"notSupported\" style=\"display:none\">Sorry, your graphics card + browser does not support WebXR</div>\n    </div>\n\n\t<!-- Import maps polyfill -->\n    <!-- Remove this when import maps will be widely supported -->\n    <script async src=\"./libs/es-module-shims.js\"></script>\n\n    <script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n    <script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { WebXRControl } from 't3d/addons/stereo/WebXRControls.js';\n\t\timport { StereoCamera } from 't3d/addons/stereo/StereoCamera.js';\n\t\timport { StereoRenderer } from 't3d/addons/stereo/StereoRenderer.js';\n\t\timport { AssimpJsonLoader } from 't3d/addons/loaders/AssimpJsonLoader.js';\n\n\t\tlet width = window.innerWidth || 2;\n\t\tlet height = window.innerHeight || 2;\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = width;\n\t\tcanvas.height = height;\n\t\tdocument.body.appendChild(canvas);\n\n\t\tconst stereoRenderer = new StereoRenderer(canvas, {\n\t\t\tantialias: true,\n\t\t\talpha: false,\n\t\t\tstencil: true,\n\t\t\txrCompatible: true\n\t\t});\n\t\tstereoRenderer.shadowAutoUpdate = false;\n\n\t\tconst scene = new t3d.Scene();\n\n\t\tconst jeep = 'resources/models/assimp/jeep/jeep.assimp.json';\n\t\tconst interior = 'resources/models/assimp/interior/interior.assimp.json';\n\n\t\tconst loader1 = new AssimpJsonLoader();\n\t\tloader1.load(jeep, function(object) {\n\t\t\tobject.scale.set(0.4, 0.4, 0.4);\n\n\t\t\tobject.traverse(function(obj) {\n\t\t\t\tif (obj.isMesh) {\n\t\t\t\t\tobj.castShadow = true;\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tscene.add(object);\n\n\t\t\tstereoRenderer.shadowNeedsUpdate = true;\n\t\t});\n\n\t\tconst loader2 = new AssimpJsonLoader();\n\t\tloader2.load(interior, function(object) {\n\t\t\tobject.traverse(function(obj) {\n\t\t\t\tif (obj.isMesh) {\n\t\t\t\t\tobj.receiveShadow = true;\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tscene.add(object);\n\t\t});\n\n\t\tconst ambientLight = new t3d.AmbientLight(0xffffff, 0.5);\n\t\tscene.add(ambientLight);\n\n\t\tconst spotLight = new t3d.SpotLight(0xffffff, 0.4, 30, Math.PI / 5, 0.3);\n\t\tspotLight.position.set(0, 10, 0);\n\t\tspotLight.lookAt(new t3d.Vector3(0, 0, 0), new t3d.Vector3(0, 1, 0));\n\t\tspotLight.castShadow = true;\n\t\tscene.add(spotLight);\n\n\t\tconst camera = new StereoCamera();\n\t\tcamera.position.set(3.0, 2.3, 1.0);\n\t\tcamera.near = 1;\n\t\tcamera.far = 1000;\n\t\tscene.add(camera);\n\n\t\tlet webxrRenderTarget;\n\t\t\n\t\tconst webxrControl = new WebXRControl(camera);\n\t\twebxrControl.enter(stereoRenderer.context).then(function(context) {\n\t\t\tcontext.requestAnimationFrame(loop);\n\t\t}).catch(function(e) {\n\t\t\tdocument.getElementById('notSupported').style.display = '';\n\t\t\tconsole.error(e);\n\t\t});\n\n\t\tfunction loop(count, frame) {\n\t\t\twebxrControl.getContext().requestAnimationFrame(loop);\n\n\t\t\twebxrControl.update(frame, width, height);\n\n\t\t\tif (!webxrRenderTarget) {\n\t\t\t\twebxrRenderTarget = t3d.OffscreenRenderTarget.create2D(width, height);\n\t\t\t\tstereoRenderer.setFramebufferExternal(webxrRenderTarget, webxrControl.getFramebuffer());\n\t\t\t}\n\n\t\t\tstereoRenderer.render(scene, camera, webxrRenderTarget);\n\t\t}\n\n\t\tfunction onWindowResize() {\n\t\t\twidth = window.innerWidth || 2;\n\t\t\theight = window.innerHeight || 2;\n\n\t\t\tstereoRenderer.screenRenderTarget.resize(width, height);\n\t\t\n\t\t\tif (webxrRenderTarget) {\n\t\t\t\twebxrRenderTarget.resize(width, height);\n\t\t\t\t// resize will lose the binding of external framebuffer, so we need to set it again.\n\t\t\t\tstereoRenderer.setFramebufferExternal(webxrRenderTarget, webxrControl.getFramebuffer());\n\t\t\t}\n\t\t}\n\t\twindow.addEventListener('resize', onWindowResize, false);\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "examples/text_bitmap.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>t3d - bitmap text</title>\n\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n\t<link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n</head>\n<body>\n    <div id=\"info\">\n        <a href=\"\" target=\"_blank\">t3d</a> - bitmap text<br/>\n\t\tReference to <a href=\"https://github.com/leochocolat/three-msdf-text-utils\" target=\"_blank\">three-msdf-text-utils</a>\n    </div>\n\n\t<!-- Import maps polyfill -->\n    <!-- Remove this when import maps will be widely supported -->\n    <script async src=\"./libs/es-module-shims.js\"></script>\n\n    <script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n    <script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { OrbitControls } from 't3d/addons/controls/OrbitControls.js';\n\t\timport { ForwardRenderer } from 't3d/addons/render/ForwardRenderer.js';\n\t\timport { Texture2DLoader } from 't3d/addons/loaders/Texture2DLoader.js';\n\t\timport { BitmapTextGeometry } from 't3d/addons/geometries/BitmapTextGeometry.js';\n\t\timport { BitmapTextMaterial } from 't3d/addons/materials/BitmapTextMaterial.js';\n\t\timport { GUI } from './libs/lil-gui.esm.min.js';\n\n\t\tlet width = window.innerWidth || 2;\n\t\tlet height = window.innerHeight || 2;\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = width * window.devicePixelRatio;\n\t\tcanvas.height = height * window.devicePixelRatio;\n\t\tcanvas.style.width = width + 'px';\n\t\tcanvas.style.height = height + 'px';\n\t\tdocument.body.appendChild(canvas);\n\n\t\tconst forwardRenderer = new ForwardRenderer(canvas);\n\n\t\tconst scene = new t3d.Scene();\n\n\t\tconst camera = new t3d.Camera();\n\t\tcamera.position.set(0, 0, 100);\n\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 1000);\n\t\tscene.add(camera);\n\n\t\tconst controller = new OrbitControls(camera, canvas);\n\n\t\tconst fileLoader = new t3d.FileLoader();\n\t\tfileLoader.setResponseType('json');\n\t\tconst textureLoader = new Texture2DLoader();\n\t\t\n\t\tPromise.all([\n\t\t\ttextureLoader.loadAsync('./resources/fonts/msdf/roboto-regular.png'),\n\t\t\tfileLoader.loadAsync('./resources/fonts/msdf/roboto-regular.fnt')\n\t\t]).then(([atlas, font]) => {\n\t\t\tconst params = {\n\t\t\t\ttext: 'Hello world! Hello world! Hello world! Hello world! Hello world! ',\n\t\t\t\tfont: font,\n\t\t\t\twidth: 1000,\n\t\t\t\tmode: 'word-wrapper',\n\t\t\t\talign: 'center',\n\t\t\t\tletterSpacing: 0,\n\t\t\t\tlineHeight: 100,\n\t\t\t\ttabSize: 1,\n\t\t\t\tcenterX: 0,\n\t\t\t\tcenterY: 0\n\t\t\t};\n\t\t\n\t\t\tconst geometry = new BitmapTextGeometry(params);\n\t\t\tconst material = new BitmapTextMaterial();\n\t\t\tmaterial.defines.BITMAP_TYPE = 2;\n\t\t\tmaterial.transparent = true;\n\t\t\tmaterial.side = t3d.DRAW_SIDE.DOUBLE;\n\t\t\tmaterial.diffuseMap = atlas;\n\t\t\tmaterial.uniforms.halo = 0.6;\n\t\t\tmaterial.uniforms.gamma = 5.0;\n\t\t\tmaterial.uniforms.shadowColor = [1, 0, 0];\n\t\t\tmaterial.uniforms.shadowOffset = [0.005, -0.005];\n\t\t\tmaterial.uniforms.shadowGamma = 2.0;\n\t\t\tmaterial.uniforms.outlineColor = [0, 0.75, 1];\n\t\t\tmaterial.uniforms.outlineWidth = 0.37;\n\t\t\tmaterial.uniforms.outlineGamma = 3.0;\n\n\t\t\tconst meshScalar = 0.08;\n\t\t\n\t\t\tconst mesh = new t3d.Mesh(geometry, material);\n\t\t\tmesh.scale.set(1, 1, 1).multiplyScalar(meshScalar);\n\t\t\tmesh.position.x = -geometry.layout.width / 2 * meshScalar;\n\t\t\tmesh.position.y = geometry.layout.height / 2 * meshScalar;\n\t\t\tscene.add(mesh);\n\n\t\t\tfunction updateTexts() {\n\t\t\t\tgeometry.update(params);\n\t\t\t\tmesh.position.x = -geometry.layout.width / 2 * meshScalar;\n\t\t\t\tmesh.position.y = geometry.layout.height / 2 * meshScalar;\n\t\t\t}\n\n\t\t\t// gui\n\n\t\t\tconst gui = new GUI();\n\t\t\n\t\t\tconst geometryFolder = gui.addFolder('geometry').onChange(updateTexts);\n\t\t\tgeometryFolder.add(params, 'text');\n\t\t\tgeometryFolder.add(params, 'width', 0, 1000, 1);\n\t\t\tgeometryFolder.add(params, 'mode', ['nowrap', 'pre', 'word-wrapper']);\n\t\t\tgeometryFolder.add(params, 'align', ['center', 'right', 'left']);\n\t\t\tgeometryFolder.add(params, 'letterSpacing', 0, 100, 1);\n\t\t\tgeometryFolder.add(params, 'lineHeight', 0, 100, 1);\n\t\t\tgeometryFolder.add(params, 'tabSize', 0, 100, 1);\n\n\t\t\tconst materialFolder = gui.addFolder('material').close();\n\t\t\tmaterialFolder.addColor(material, 'diffuse').name('color');\n\t\t\tmaterialFolder.add(material, 'opacity', 0, 1, 0.1);\n\t\t\tmaterialFolder.add(material.uniforms, 'halo', 0, 1, 0.01);\n\t\t\tmaterialFolder.add(material.uniforms, 'gamma', 0, 20, 0.01);\n\n\t\t\tconst shadowFolder = materialFolder.addFolder('shadow');\n\t\t\tshadowFolder.add(material.defines, 'SHADOW').name('enable').onChange(value => {\n\t\t\t\tmaterial.needsUpdate = true;\n\t\t\t});\n\t\t\tshadowFolder.addColor(material.uniforms, 'shadowColor');\n\t\t\tshadowFolder.add(material.uniforms.shadowOffset, '0', -0.02, 0.02, 0.001).name('offectX');\n\t\t\tshadowFolder.add(material.uniforms.shadowOffset, '1', -0.02, 0.02, 0.001).name('offectY');\n\t\t\tshadowFolder.add(material.uniforms, 'shadowGamma', 0, 5, 0.001);\n\n\t\t\tconst outlineFolder = materialFolder.addFolder('outline');\n\t\t\toutlineFolder.add(material.defines, 'OUTLINE').name('enable').onChange(value => {\n\t\t\t\tmaterial.needsUpdate = true;\n\t\t\t});\n\t\t\toutlineFolder.addColor(material.uniforms, 'outlineColor');\n\t\t\toutlineFolder.add(material.uniforms, 'outlineWidth', 0, 0.5, 0.001);\n\t\t\toutlineFolder.add(material.uniforms, 'outlineGamma', 0, 5, 0.001);\n\n\t\t\tconst debugFolder = gui.addFolder('debug').close();\n\t\t\tdebugFolder.add({ debug: false }, 'debug').onChange(value => {\n\t\t\t\tmesh.material.defines.BITMAP_TYPE = value ? 0 : 2;\n\t\t\t\tmesh.material.needsUpdate = true;\n\t\t\t});\n\t\t});\n\n\t\t//\n\n\t\tfunction loop(count) {\n\t\t\trequestAnimationFrame(loop);\n\n\t\t\tcontroller.update();\n\n\t\t\tforwardRenderer.render(scene, camera);\n\t\t}\n\t\trequestAnimationFrame(loop);\n\n\t\tfunction onWindowResize() {\n\t\t\twidth = window.innerWidth || 2;\n\t\t\theight = window.innerHeight || 2;\n\n\t\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 1000);\n\n\t\t\tforwardRenderer.screenRenderTarget.resize(width * window.devicePixelRatio, height * window.devicePixelRatio);\n\n\t\t\tcanvas.style.width = width + 'px';\n\t\t\tcanvas.style.height = height + 'px';\n\t\t}\n\t\twindow.addEventListener('resize', onWindowResize, false);\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "examples/text_bitmap_dynamic.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>t3d - bitmap dynamic text</title>\n\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n\t<link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n\t<style>\n\t\t.atlas {\n\t\t\tposition: fixed;\n\t\t\tleft: 0;\n\t\t\ttop: 0;\n\t\t\tz-index: 1000;\n\t\t\tbackground: #eeeeee;\n\t\t\twidth: 200px;\n\t\t\theight: 200px;\n\t\t}\n\t</style>\n</head>\n<body>\n    <div id=\"info\">\n        <a href=\"\" target=\"_blank\">t3d</a> - bitmap dynamic text\n    </div>\n\n\t<!-- Import maps polyfill -->\n    <!-- Remove this when import maps will be widely supported -->\n    <script async src=\"./libs/es-module-shims.js\"></script>\n\n    <script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n    <script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { OrbitControls } from 't3d/addons/controls/OrbitControls.js';\n\t\timport { ForwardRenderer } from 't3d/addons/render/ForwardRenderer.js';\n\t\timport { DynamicFont } from 't3d/addons/DynamicFont.js';\n\t\timport { BitmapTextGeometry } from 't3d/addons/geometries/BitmapTextGeometry.js';\n\t\timport { BitmapTextMaterial } from 't3d/addons/materials/BitmapTextMaterial.js';\n\t\timport { GUI } from './libs/lil-gui.esm.min.js';\n\n\t\tlet width = window.innerWidth || 2;\n\t\tlet height = window.innerHeight || 2;\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = width * window.devicePixelRatio;\n\t\tcanvas.height = height * window.devicePixelRatio;\n\t\tcanvas.style.width = width + 'px';\n\t\tcanvas.style.height = height + 'px';\n\t\tdocument.body.appendChild(canvas);\n\n\t\tconst forwardRenderer = new ForwardRenderer(canvas);\n\n\t\tconst scene = new t3d.Scene();\n\n\t\tconst camera = new t3d.Camera();\n\t\tcamera.position.set(0, -60, 100);\n\t\tcamera.lookAt(new t3d.Vector3(0, 0, 0), new t3d.Vector3(0, 0, 1));\n\t\tcamera.setPerspective(60 / 180 * Math.PI, width / height, 1, 5000);\n\t\tscene.add(camera);\n\n\t\tconst controller = new OrbitControls(camera, canvas);\n\n\t\t// Create DynamicFont\n\n\t\tconst text = '   道可道，非常道；名可名，非常名。无，名天地之始；有，名万物之母。故常无，欲以观其妙；常有，欲以观其徼。此两者，同出而异名，同谓之玄。玄之又玄，众妙之门。天下皆知美之为美，斯恶已；皆知善之为善，斯不善已。有无相生，难易相成，长短相形，高下相盈，音声相和，前后相随，恒也。是以圣人处无为之事，行不言之教；万物作而弗始，生而弗有，为而弗恃,功成而弗居。夫唯弗居，是以不去。';\n\n\t\tconst params = {\n\t\t\ttext,\n\t\t\tmode: 'word-wrapper',\n\t\t\talign: 'left',\n\t\t\tletterSpacing: 3,\n\t\t\tlineHeight: 100,\n\t\t\tbaseline: 60\n\t\t};\n\n\t\tconst dynamicFont = new DynamicFont({ sdf: true, width: 2048, height: 2048 });\n\t\tdynamicFont.addChars(text);\n\n\t\t// Create text mesh\n\n\t\tparams.font = dynamicFont.fontData;\n\t\tparams.width = 1000;\n\t\tconst geometry = new BitmapTextGeometry(params);\n\n\t\tconst imageTexture = new t3d.Texture2D();\n\t\timageTexture.image = { data: dynamicFont.atlasBuffer, width: 2048, height: 2048 };\n\t\timageTexture.format = t3d.PIXEL_FORMAT.RED;\n\t\timageTexture.magFilter = t3d.TEXTURE_FILTER.LINEAR;\n\t\timageTexture.minFilter = t3d.TEXTURE_FILTER.LINEAR;\n\t\timageTexture.unpackAlignment = 1;\n\t\timageTexture.generateMipmaps = false;\n\n\t\tconst material = new BitmapTextMaterial();\n\t\tmaterial.diffuseMap = imageTexture;\n\t\tmaterial.uniforms.shadowColor = [1, 0, 0];\n\t\tmaterial.uniforms.shadowOffset = [0.001, -0.001];\n\t\tmaterial.defines.OUTLINE = true;\n\t\tmaterial.uniforms.outlineColor = [0, 0.75, 1];\n\t\tmaterial.uniforms.outlineWidth = 0.06;\n\t\tmaterial.side = t3d.DRAW_SIDE.DOUBLE;\n\n\t\tconst meshScalar = 0.08;\n\t\tconst mesh = new t3d.Mesh(geometry, material);\n\t\tmesh.scale.set(1, 1, 1).multiplyScalar(meshScalar);\n\t\tscene.add(mesh);\n\n\t\t// Create debug scene\n\n\t\tconst debugScene = new t3d.Scene();\n\t\tconst basicMaterial = new t3d.BasicMaterial();\n\t\tbasicMaterial.diffuseMap = imageTexture;\n\t\tconst basicGeometry = new t3d.PlaneGeometry(2, 2);\n\t\tconst debugMesh = new t3d.Mesh(basicGeometry, basicMaterial);\n\t\tdebugMesh.euler.x = Math.PI / 2;\n\t\tdebugScene.add(debugMesh);\n\t\tconst debugCamera = new t3d.Camera();\n\t\tdebugCamera.position.set(0, 0, 1);\n\t\tdebugCamera.lookAt(new t3d.Vector3(0, 0, 0), new t3d.Vector3(0, 1, 0));\n\t\tdebugCamera.setOrtho(-1, 1, -1, 1, 0.1, 2);\n\t\tdebugScene.add(debugCamera);\n\n\t\t// GUI\n\t\t\n\t\tfunction updateTexts() {\n\t\t\tconst atlasChanged = dynamicFont.addChars(params.text);\n\n\t\t\tif (atlasChanged) {\n\t\t\t\timageTexture.version++;\n\t\t\t}\n\t\t\n\t\t\tgeometry.update(params);\n\t\t}\n\n\t\tfunction updateBillboard() {\n\t\t\tif (material.defines.BILLBOARD && !material.defines.SIZEATTENUATION) {\n\t\t\t\tmesh.scale.set(1, 1, 1).multiplyScalar(0.0005);\n\t\t\t} else {\n\t\t\t\tmesh.scale.set(1, 1, 1).multiplyScalar(meshScalar);\n\t\t\t}\n\t\t\tmaterial.needsUpdate = true;\n\t\t}\n\n\t\tconst gui = new GUI();\n\n\t\tconst geometryFolder = gui.addFolder('geometry').onChange(updateTexts);\n\t\tgeometryFolder.add(params, 'text');\n\t\tgeometryFolder.add(params, 'mode', ['nowrap', 'pre', 'word-wrapper']);\n\t\tgeometryFolder.add(params, 'align', ['center', 'right', 'left']);\n\t\tgeometryFolder.add(params, 'letterSpacing', -100, 100, 1);\n\t\tgeometryFolder.add(params, 'lineHeight', 0, 100, 1);\n\t\tgeometryFolder.add(params, 'baseline', 0, 100, 1);\n\n\t\tconst materialFolder = gui.addFolder('material').close();\n\t\tmaterialFolder.addColor(material, 'diffuse').name('color');\n\t\tmaterialFolder.add(material, 'opacity', 0, 1, 0.1);\n\t\tmaterialFolder.add(material.uniforms, 'halo', 0, 1, 0.01);\n\t\tmaterialFolder.add(material.uniforms, 'gamma', 0, 20, 0.01);\n\t\t\n\t\tconst shadowFolder = materialFolder.addFolder('shadow');\n\t\tshadowFolder.add(material.defines, 'SHADOW').name('enable').onChange(value => {\n\t\t\tmaterial.needsUpdate = true;\n\t\t});\n\t\tshadowFolder.addColor(material.uniforms, 'shadowColor');\n\t\tshadowFolder.add(material.uniforms.shadowOffset, '0', -0.02, 0.02, 0.001).name('offectX');\n\t\tshadowFolder.add(material.uniforms.shadowOffset, '1', -0.02, 0.02, 0.001).name('offectY');\n\t\tshadowFolder.add(material.uniforms, 'shadowGamma', 0, 10, 0.001);\n\n\t\tconst outlineFolder = materialFolder.addFolder('outline');\n\t\toutlineFolder.add(material.defines, 'OUTLINE').name('enable').onChange(value => {\n\t\t\tmaterial.needsUpdate = true;\n\t\t});\n\t\toutlineFolder.addColor(material.uniforms, 'outlineColor');\n\t\toutlineFolder.add(material.uniforms, 'outlineWidth', 0, 0.1, 0.001);\n\t\toutlineFolder.add(material.uniforms, 'outlineGamma', 0, 10, 0.001);\n\n\t\tconst billboardFolder = materialFolder.addFolder('billboard').onChange(updateBillboard);\n\t\tbillboardFolder.add(material.defines, 'BILLBOARD');\n\t\tbillboardFolder.add(material.defines, 'SIZEATTENUATION');\n\n\t\tconst debugParams = { atlas: true, atlasScale: 0.2 };\n\n\t\tconst debugFolder = gui.addFolder('debug').close();\n\t\tdebugFolder.add(debugParams, 'atlas');\n\t\tdebugFolder.add(debugParams, 'atlasScale', 0.01, 1, 0.01);\n\t\tdebugFolder.add({ SDF: false }, 'SDF').onChange(function(value) {\n\t\t\tmaterial.defines['BITMAP_TYPE'] = value ? 0 : 1;\n\t\t\tmaterial.needsUpdate = true;\n\t\t});\n\n\t\tfunction loop(count) {\n\t\t\trequestAnimationFrame(loop);\n\n\t\t\tcontroller.update();\n\n\t\t\tforwardRenderer.screenRenderTarget.setClear(true, true, true);\n\t\t\tforwardRenderer.render(scene, camera);\n\n\t\t\tif (debugParams.atlas) {\n\t\t\t\tdebugCamera.rect.set(0, 0, debugParams.atlasScale, debugParams.atlasScale * width / height);\n\t\t\t\tforwardRenderer.screenRenderTarget.setClear(false, false, false);\n\t\t\t\tforwardRenderer.render(debugScene, debugCamera);\n\t\t\t}\n\t\t}\n\t\trequestAnimationFrame(loop);\n\n\t\tfunction onWindowResize() {\n\t\t\twidth = window.innerWidth || 2;\n\t\t\theight = window.innerHeight || 2;\n\n\t\t\tcamera.setPerspective(60 / 180 * Math.PI, width / height, 1, 5000);\n\n\t\t\tforwardRenderer.screenRenderTarget.resize(width * window.devicePixelRatio, height * window.devicePixelRatio);\n\n\t\t\tcanvas.style.width = width + 'px';\n\t\t\tcanvas.style.height = height + 'px';\n\t\t}\n\t\twindow.addEventListener('resize', onWindowResize, false);\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "examples/text_sdf.html",
    "content": "<!DOCTYPE html>\n<html>\n\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>t3d - text sdf</title>\n\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n\t<link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n</head>\n\n<body>\n\t<div id=\"info\" class=\"dark\">\n\t\t<a href=\"\" target=\"_blank\">t3d</a> - text sdf\n\t\t<br/>generate sdf font from <a href=\"https://github.com/mapbox/tiny-sdf\" target=\"_blank\">tiny-sdf</a>\n\t\t<br/>generate msdf font from <a href=\"https://github.com/leochocolat/three-msdf-text\" target=\"_blank\">three-msdf-text</a>\n\t</div>\n\n\t<!-- Import maps polyfill -->\n    <!-- Remove this when import maps will be widely supported -->\n    <script async src=\"./libs/es-module-shims.js\"></script>\n\n\t<script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n\t<script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { OrbitControls } from 't3d/addons/controls/OrbitControls.js';\n\t\timport { ForwardRenderer } from 't3d/addons/render/ForwardRenderer.js';\n\t\timport { Texture2DLoader } from 't3d/addons/loaders/Texture2DLoader.js';\n\t\timport { SDFTextShader } from 't3d/addons/shaders/SDFTextShader.js';\n\t\timport { GUI } from './libs/lil-gui.esm.min.js';\n\t\timport Stats from './libs/stats.module.js';\n\n\t\t// Font Shaders\n\t\t// SDF https://github.com/mapbox/tiny-sdf\n\t\t// MSDF https://github.com/leochocolat/three-msdf-text\n\t\t\n\t\tconst MSDFShader = {\n\t\t\tname: 'msdf_text',\n\n\t\t\tdefines: { DEBUG: false },\n\t\t\n\t\t\tuniforms: {},\n\n\t\t\tvertexShader: `\n\t\t\t\t#include <common_vert>\n\n\t\t\t\tattribute vec2 a_Uv;\n\t\t\t\tvarying vec2 v_Uv;\n\n\t\t\t\tuniform mat3 uvTransform;\n\n\t\t\t\tvoid main() {\n\t\t\t\t\tgl_Position = u_ProjectionView * u_Model * vec4(a_Position, 1.0);\n\t\t\t\t\tv_Uv = (uvTransform * vec3(a_Uv, 1.)).xy;\n\t\t\t\t}\n\t\t\t`,\n\n\t\t\tfragmentShader: `\n\t\t\t\tuniform vec3 u_Color;\n\t\t\t\tuniform float u_Opacity;\n\n\t\t\t\tuniform sampler2D diffuseMap;\n\n\t\t\t\tvarying vec2 v_Uv;\n\n\t\t\t\tfloat median(float r, float g, float b) {\n\t\t\t\t\treturn max(min(r, g), min(max(r, g), b));\n\t\t\t\t}\n\n\t\t\t\tvoid main() {\n\t\t\t\t\tvec3 msd = texture2D(diffuseMap, v_Uv).rgb;\n\t\t\t\t\tfloat sd = median(msd.r, msd.g, msd.b) - 0.5;\n\t\t\t\t\tfloat alpha = clamp(sd / fwidth(sd) + 0.5, 0.0, 1.0);\n\t\t\t\t\tgl_FragColor = vec4(u_Color, alpha * u_Opacity);\n\n\t\t\t\t\t#ifdef DEBUG\n\t\t\t\t\t\tgl_FragColor = texture2D(diffuseMap, v_Uv);\n\t\t\t\t\t#endif\n\t\t\t\t}\n\t\t\t`\n\t\t};\n\n\t\t// Init Scene\n\n\t\tlet width = window.innerWidth || 2;\n\t\tlet height = window.innerHeight || 2;\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = width;\n\t\tcanvas.height = height;\n\t\tdocument.body.appendChild(canvas);\n\n\t\tconst forwardRenderer = new ForwardRenderer(canvas);\n\t\tforwardRenderer.screenRenderTarget.setColorClearValue(0.9, 0.9, 0.9, 1);\n\n\t\tconst scene = new t3d.Scene();\n\n\t\tconst camera = new t3d.Camera();\n\t\tcamera.position.set(0, 0, 200);\n\t\tcamera.lookAt(new t3d.Vector3(0, 0, 0), new t3d.Vector3(0, 1, 0));\n\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 0.1, 10000);\n\t\tscene.add(camera);\n\n\t\tconst controller = new OrbitControls(camera, canvas);\n\t\tcontroller.maxDistance = 9000;\n\n\t\t// Add texts.\n\n\t\tfunction generateLabel(text, x, y, z) {\n\t\t\tconst width = 80;\n\t\t\tconst height = 20;\n\t\t\tconst fontSize = 16;\n\n\t\t\tconst canvas = document.createElement('canvas');\n\t\t\tconst ctx = canvas.getContext('2d');\n\n\t\t\tcanvas.width = width;\n\t\t\tcanvas.height = height;\n\n\t\t\tctx.fillStyle = 'rgb(0.9, 0.9, 0.9)';\n\t\t\tctx.fillRect(0, 0, width, height);\n\n\t\t\tctx.font = fontSize + 'px Arial';\n\t\t\tctx.fillStyle = 'white';\n\t\t\tctx.textAlign = 'center';\n\t\t\tctx.fillText(text, width * 0.5, fontSize);\n\n\t\t\tconst texture = new t3d.Texture2D();\n\t\t\ttexture.image = canvas;\n\t\t\ttexture.version++;\n\n\t\t\tconst material = new t3d.BasicMaterial();\n\t\t\tmaterial.diffuseMap = texture;\n\t\t\tmaterial.transparent = true;\n\t\t\tmaterial.side = t3d.DRAW_SIDE.DOUBLE;\n\n\t\t\tconst geo = new t3d.PlaneGeometry(width * 0.5 * 0.6, 9 * 0.6);\n\n\t\t\tconst mesh = new t3d.Mesh(geo, material);\n\t\t\tmesh.position.set(x, y - 18, z);\n\t\t\tmesh.euler.x = Math.PI / 2;\n\n\t\t\treturn mesh;\n\t\t}\n\n\t\tfunction createCanvasTexture(text, size = 50, padding = 2) {\n\t\t\tconst canvas = document.createElement('canvas');\n\t\t\tconst ctx = canvas.getContext('2d');\n\n\t\t\tconst fontSize = size - padding * 2;\n\n\t\t\tctx.font = fontSize + 'px Arial';\n\t\t\tctx.textAlign = 'center';\n\t\t\tctx.textBaseline = 'middle';\n\n\t\t\tconst metrics = ctx.measureText(text);\n\t\t\tconst width = metrics.width;\n\t\t\tconst height = getFontHeight(metrics, fontSize);\n\t\t\tcanvas.width = width + padding * 2;\n\t\t\tcanvas.height = width + padding * 2;\n\n\t\t\tctx.fillStyle = 'black';\n\t\t\tctx.font = fontSize + 'px Arial';\n\t\t\tctx.textAlign = 'center';\n\t\t\tctx.textBaseline = 'middle';\n\t\t\tctx.fillText(text, canvas.width / 2, padding + height / 2);\n\n\t\t\tconst texture = new t3d.Texture2D();\n\t\t\ttexture.image = canvas;\n\t\t\ttexture.version++;\n\n\t\t\treturn texture;\n\t\t}\n\n\t\tfunction getFontHeight(metrics, size) {\n\t\t\tif (metrics.fontBoundingBoxAscent !== undefined && metrics.fontBoundingBoxDescent !== undefined) {\n\t\t\t\treturn metrics.fontBoundingBoxAscent + metrics.fontBoundingBoxDescent;\n\t\t\t} else if (metrics.actualBoundingBoxAscent !== undefined && metrics.actualBoundingBoxDescent !== undefined) {\n\t\t\t\treturn metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent;\n\t\t\t} else {\n\t\t\t\treturn size;\n\t\t\t}\n\t\t}\n\n\t\tconst loader = new Texture2DLoader();\n\t\tconst canvas_texture = createCanvasTexture('材');\n\t\tconst raw_texture = loader.load('./resources/fonts/text_raw.png');\n\t\tconst sdf_texture = loader.load('./resources/fonts/text_sdf.png');\n\t\tconst msdf_texture = loader.load('./resources/fonts/text_msdf.png');\n\n\t\tconst canvasMaterial = new t3d.BasicMaterial();\n\t\tcanvasMaterial.transparent = true;\n\t\tcanvasMaterial.diffuseMap = canvas_texture;\n\t\tcanvasMaterial.side = t3d.DRAW_SIDE.DOUBLE;\n\n\t\tconst imageMaterial = new t3d.BasicMaterial();\n\t\timageMaterial.transparent = true;\n\t\timageMaterial.diffuseMap = raw_texture;\n\t\timageMaterial.side = t3d.DRAW_SIDE.DOUBLE;\n\n\t\tconst sdfMaterial = new t3d.ShaderMaterial(SDFTextShader);\n\t\tsdfMaterial.transparent = true;\n\t\tsdfMaterial.diffuse.setRGB(0, 0, 0);\n\t\tsdfMaterial.diffuseMap = sdf_texture;\n\t\tsdfMaterial.side = t3d.DRAW_SIDE.DOUBLE;\n\n\t\tconst msdfMaterial = new t3d.ShaderMaterial(MSDFShader);\n\t\tmsdfMaterial.transparent = true;\n\t\tmsdfMaterial.diffuse.setRGB(0, 0, 0);\n\t\tmsdfMaterial.diffuseMap = msdf_texture;\n\t\tmsdfMaterial.side = t3d.DRAW_SIDE.DOUBLE;\n\n\t\tconst materialInfos = [\n\t\t\t{ type: 'CANVAS', material: canvasMaterial, x: -22, y: 25 },\n\t\t\t{ type: 'IMAGE', material: imageMaterial, x: -22, y: -18 },\n\t\t\t{ type: 'SDF', material: sdfMaterial, x: 22, y: 25 },\n\t\t\t{ type: 'MSDF', material: msdfMaterial, x: 22, y: -18 }\n\t\t];\n\n\t\tconst geometry = new t3d.PlaneGeometry(30, 30);\n\n\t\tfor (let i = 0; i < materialInfos.length; i++) {\n\t\t\tconst info = materialInfos[i];\n\t\t\tconst textMesh = new t3d.Mesh(geometry, info.material);\n\t\t\ttextMesh.euler.x = Math.PI * 0.5;\n\t\t\tscene.add(textMesh);\n\n\t\t\ttextMesh.position.set(info.x, info.y, 0);\n\t\t\tscene.add(generateLabel(info.type, info.x, info.y, 0));\n\t\t}\n\n\t\t// GUI\n\n\t\tconst minFilters = ['LINEAR', 'NEAREST', 'NEAREST_MIPMAP_NEAREST', 'LINEAR_MIPMAP_LINEAR', 'LINEAR_MIPMAP_NEAREST', 'NEAREST_MIPMAP_LINEAR'];\n\t\tconst magFilters = ['LINEAR', 'NEAREST'];\n\t\tconst maxAnisotropy = forwardRenderer.capabilities.maxAnisotropy;\n\t\tconst params = { alpha: 1, anisotropy: 1, minFilter: 'LINEAR_MIPMAP_LINEAR', magFilter: 'LINEAR', debug: false };\n\t\tconst gui = new GUI();\n\t\tgui.add(params, 'alpha', 0, 1, 0.01).onChange(function(value) {\n\t\t\tfor (let i = 0; i < materialInfos.length; i++) {\n\t\t\t\tmaterialInfos[i].material.opacity = value;\n\t\t\t}\n\t\t});\n\t\tgui.add(params, 'anisotropy', 1, maxAnisotropy, 1).onChange(function(value) {\n\t\t\tfor (let i = 0; i < materialInfos.length; i++) {\n\t\t\t\tmaterialInfos[i].material.diffuseMap.anisotropy = value;\n\t\t\t\tmaterialInfos[i].material.diffuseMap.version++;\n\t\t\t}\n\t\t});\n\t\tgui.add(params, 'minFilter', minFilters).onChange(function(value) {\n\t\t\tfor (let i = 0; i < materialInfos.length; i++) {\n\t\t\t\tmaterialInfos[i].material.diffuseMap.minFilter = t3d.TEXTURE_FILTER[value];\n\t\t\t\tmaterialInfos[i].material.diffuseMap.version++;\n\t\t\t}\n\t\t});\n\t\tgui.add(params, 'magFilter', magFilters).onChange(function(value) {\n\t\t\tfor (let i = 0; i < materialInfos.length; i++) {\n\t\t\t\tmaterialInfos[i].material.diffuseMap.magFilter = t3d.TEXTURE_FILTER[value];\n\t\t\t\tmaterialInfos[i].material.diffuseMap.version++;\n\t\t\t}\n\t\t});\n\t\tgui.add(params, 'debug').onChange(function(value) {\n\t\t\tmaterialInfos[2].material.defines['DEBUG'] = value;\n\t\t\tmaterialInfos[3].material.defines['DEBUG'] = value;\n\t\t\tmaterialInfos[2].material.needsUpdate = true;\n\t\t\tmaterialInfos[3].material.needsUpdate = true;\n\t\t});\n\n\t\t// Stats\n\n\t\tconst stats = new Stats();\n\t\tstats.showPanel(0);\n\t\tdocument.body.appendChild(stats.dom);\n\n\t\t// Main loop\n\n\t\tfunction loop(count) {\n\t\t\trequestAnimationFrame(loop);\n\n\t\t\tstats.begin();\n\n\t\t\tcontroller.update();\n\n\t\t\tforwardRenderer.render(scene, camera);\n\n\t\t\tstats.end();\n\t\t}\n\t\trequestAnimationFrame(loop);\n\n\t\tfunction onWindowResize() {\n\t\t\twidth = window.innerWidth || 2;\n\t\t\theight = window.innerHeight || 2;\n\n\t\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 0.1, 10000);\n\n\t\t\tforwardRenderer.screenRenderTarget.resize(width, height);\n\t\t}\n\t\twindow.addEventListener('resize', onWindowResize, false);\n\t</script>\n</body>\n\n</html>"
  },
  {
    "path": "examples/text_sdf_dynamic.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta charset=\"utf-8\" />\n\t<title>t3d - text sdf dynamic</title>\n\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\" />\n\t<link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\" />\n</head>\n<body>\n\t<div id=\"info\" class=\"dark\">\n\t\t<a href=\"\" target=\"_blank\">t3d</a> - dynamic sdf text<br/>\n\t</div>\n\n\t<!-- Import maps polyfill -->\n\t<!-- Remove this when import maps will be widely supported -->\n\t<script async src=\"./libs/es-module-shims.js\"></script>\n\n\t<script type=\"importmap\">\n\t\t{\n\t\t\t\"imports\": {\n\t\t\t\t\"t3d\": \"../build/t3d.module.js\",\n\t\t\t\t\"t3d/addons/\": \"./jsm/\"\n\t\t\t}\n\t\t}\n\t</script>\n\n\t<script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { OrbitControls } from 't3d/addons/controls/OrbitControls.js';\n\t\timport { ForwardRenderer } from 't3d/addons/render/ForwardRenderer.js';\n\t\timport { DistanceTransform } from 't3d/addons/math/DistanceTransform.js';\n\t\timport { SDFTextShader } from 't3d/addons/shaders/SDFTextShader.js';\n\t\timport { GUI } from './libs/lil-gui.esm.min.js';\n\t\timport Stats from './libs/stats.module.js';\n\n\t\tlet width = window.innerWidth || 2;\n\t\tlet height = window.innerHeight || 2;\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = width;\n\t\tcanvas.height = height;\n\t\tdocument.body.appendChild(canvas);\n\n\t\tconst forwardRenderer = new ForwardRenderer(canvas);\n\t\tforwardRenderer.screenRenderTarget.setColorClearValue(0.9, 0.9, 0.9, 1);\n\n\t\tconst scene = new t3d.Scene();\n\n\t\tconst camera = new t3d.Camera();\n\t\tcamera.position.set(0, 0, 400);\n\t\tcamera.lookAt(new t3d.Vector3(0, 0, 0), new t3d.Vector3(0, 1, 0));\n\t\tcamera.setPerspective((45 / 180) * Math.PI, width / height, 10, 10000);\n\t\tscene.add(camera);\n\n\t\tconst controller = new OrbitControls(camera, canvas);\n\t\tcontroller.maxDistance = 9000;\n\n\t\t// A Canvas to draw the text and generate the grayscale image data\n\t\tclass TextCanvas {\n\n\t\t\tconstructor(width, height) {\n\t\t\t\tthis.canvas = document.createElement('canvas');\n\t\t\t\tthis.canvas.width = width;\n\t\t\t\tthis.canvas.height = height;\n\t\t\t\tthis.ctx = this.canvas.getContext('2d', { willReadFrequently: true });\n\t\t\t\tthis.ctx.fillStyle = 'black';\n\t\t\t\tthis.ctx.textAlign = 'center';\n\t\t\t\tthis.ctx.textBaseline = 'middle';\n\t\t\t}\n\n\t\t\tdraw(text, size = 64, padding = 8) {\n\t\t\t\tconst canvas = this.canvas;\n\t\t\t\tconst ctx = this.ctx;\n\n\t\t\t\tctx.font = size + 'px Arial';\n\t\t\t\tconst metrics = ctx.measureText(text);\n\n\t\t\t\tconst textAreaWidth = metrics.width + padding * 2;\n\t\t\t\tconst textAreaHeight = this._getFontHeight(metrics, size) + padding * 2;\n\n\t\t\t\tctx.clearRect(0, 0, canvas.width, canvas.height);\n\t\t\t\tctx.fillText(text, textAreaWidth / 2, textAreaHeight / 2);\n\n\t\t\t\tconst dataWidth = Math.min(textAreaWidth, canvas.width);\n\t\t\t\tconst dataHeight = Math.min(textAreaHeight, canvas.height);\n\n\t\t\t\treturn ctx.getImageData(0, 0, dataWidth, dataHeight);\n\t\t\t}\n\n\t\t\t_getFontHeight(metrics, size) {\n\t\t\t\tif (metrics.actualBoundingBoxAscent !== undefined && metrics.actualBoundingBoxDescent !== undefined) {\n\t\t\t\t\treturn metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent;\n\t\t\t\t} else {\n\t\t\t\t\treturn size;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\n\t\tconst imageTexture = new t3d.Texture2D();\n\n\t\tconst sdfTexture = new t3d.Texture2D();\n\t\tsdfTexture.magFilter = t3d.TEXTURE_FILTER.LINEAR;\n\t\tsdfTexture.minFilter = t3d.TEXTURE_FILTER.LINEAR;\n\t\tsdfTexture.format = t3d.PIXEL_FORMAT.RED;\n\t\tsdfTexture.generateMipmaps = false;\n\t\tsdfTexture.unpackAlignment = 1;\n\n\t\tconst geometry = new t3d.PlaneGeometry(1, 1);\n\n\t\tconst imageMaterial = new t3d.BasicMaterial();\n\t\timageMaterial.transparent = true;\n\t\timageMaterial.diffuseMap = imageTexture;\n\t\timageMaterial.side = t3d.DRAW_SIDE.DOUBLE;\n\n\t\tconst sdfMaterial = new t3d.ShaderMaterial(SDFTextShader);\n\t\tsdfMaterial.transparent = true;\n\t\tsdfMaterial.diffuseMap = sdfTexture;\n\t\tsdfMaterial.diffuse.setRGB(0, 0, 0);\n\t\tsdfMaterial.side = t3d.DRAW_SIDE.DOUBLE;\n\n\t\tconst imageMesh = new t3d.Mesh(geometry, imageMaterial);\n\t\timageMesh.euler.x = Math.PI * 0.5;\n\t\timageMesh.position.set(0, 40, 0);\n\t\tscene.add(imageMesh);\n\n\t\tconst sdfMesh = new t3d.Mesh(geometry, sdfMaterial);\n\t\tsdfMesh.euler.x = Math.PI * 0.5;\n\t\tsdfMesh.position.set(0, -40, 0);\n\t\tscene.add(sdfMesh);\n\n\t\tconst textCanvas = new TextCanvas(1024, 128);\n\t\tconst distanceTransform = new DistanceTransform(1024 * 128, 1024);\n\t\tconst fontSize = 64;\n\t\tfunction updateText(text) {\n\t\t\tconsole.time('process text');\n\t\t\n\t\t\tconst imageData = textCanvas.draw(text, fontSize);\n\n\t\t\timageTexture.image = imageData;\n\t\t\timageTexture.version++;\n\t\t\tsdfTexture.image = {\n\t\t\t\tdata: distanceTransform.transform(imageData, {\n\t\t\t\t\tradius: fontSize / 24 * 8\n\t\t\t\t}),\n\t\t\t\twidth: imageData.width,\n\t\t\t\theight: imageData.height\n\t\t\t};\n\t\t\tsdfTexture.version++;\n\n\t\t\tconsole.timeEnd('process text');\n\n\t\t\timageMesh.scale.set(imageData.width, 1, imageData.height);\n\t\t\tsdfMesh.scale.set(imageData.width, 1, imageData.height);\n\t\t}\n\n\t\tconst params = { chars: '你好', debug: false };\n\n\t\tupdateText(params.chars);\n\n\t\tconst gui = new GUI();\n\t\tgui.add(params, 'chars').onChange(function(value) {\n\t\t\tupdateText(value.slice(-10)); // show lastest 10 characters\n\t\t});\n\t\tgui.addColor(sdfMaterial, 'diffuse').name('fontColor');\n\t\tgui.add(sdfMaterial.uniforms, 'gamma', 0, 10, 0.01);\n\t\tgui.add(sdfMaterial.uniforms, 'halo', 0.4, 0.9, 0.01);\n\n\t\tconst shadowFolder = gui.addFolder('shadow').close();\n\t\tshadowFolder.add(sdfMaterial.defines, 'SHADOW').name('enable').onChange(value => {\n\t\t\tsdfMaterial.needsUpdate = true;\n\t\t});\n\t\tshadowFolder.addColor(sdfMaterial.uniforms, 'shadowColor');\n\t\tshadowFolder.add(sdfMaterial.uniforms.shadowOffset, '0', -0.1, 0.1, 0.001).name('offectX');\n\t\tshadowFolder.add(sdfMaterial.uniforms.shadowOffset, '1', -0.1, 0.1, 0.001).name('offectY');\n\t\tshadowFolder.add(sdfMaterial.uniforms, 'shadowGamma', 0, 10, 0.001);\n\t\t\n\t\tconst outLineFolder = gui.addFolder('outLine').close();\n\t\toutLineFolder.add(sdfMaterial.defines, 'OUTLINE').name('enable').onChange(value => {\n\t\t\tsdfMaterial.needsUpdate = true;\n\t\t});\n\t\toutLineFolder.addColor(sdfMaterial.uniforms, 'outlineColor');\n\t\toutLineFolder.add(sdfMaterial.uniforms, 'outlineWidth', 0, 0.1, 0.001);\n\t\toutLineFolder.add(sdfMaterial.uniforms, 'outlineGamma', 0, 10, 0.001);\n\n\t\tgui.add(params, 'debug').onChange(function(value) {\n\t\t\tsdfMaterial.defines['DEBUG'] = value;\n\t\t\tsdfMaterial.needsUpdate = true;\n\t\t});\n\n\t\tconst stats = new Stats();\n\t\tstats.showPanel(0);\n\t\tdocument.body.appendChild(stats.dom);\n\n\t\tfunction loop(count) {\n\t\t\trequestAnimationFrame(loop);\n\n\t\t\tstats.begin();\n\n\t\t\tcontroller.update();\n\n\t\t\tforwardRenderer.render(scene, camera);\n\n\t\t\tstats.end();\n\t\t}\n\t\trequestAnimationFrame(loop);\n\n\t\tfunction onWindowResize() {\n\t\t\twidth = window.innerWidth || 2;\n\t\t\theight = window.innerHeight || 2;\n\n\t\t\tcamera.setPerspective((45 / 180) * Math.PI, width / height, 10, 10000);\n\n\t\t\tforwardRenderer.screenRenderTarget.resize(width, height);\n\t\t}\n\t\twindow.addEventListener('resize', onWindowResize, false);\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "examples/text_typeface.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n    <meta charset=\"utf-8\">\n    <title>t3d - text typeface</title>\n    <meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n    <link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n</head>\n<body>\n    <div id=\"info\">\n        <a href=\"\" target=\"_blank\">t3d</a> - text typeface\n        <br/>Use <a href=\"https://gero3.github.io/facetype.js/\" target=\"_blank\">Facetype.js</a> to generate typeface.json fonts.\n        <br/><a href=\"https://github.com/components-ai/typefaces\" target=\"_blank\">Collection of Google fonts as typeface data.</a>\n    </div>\n\n    <!-- Import maps polyfill -->\n    <!-- Remove this when import maps will be widely supported -->\n    <script async src=\"./libs/es-module-shims.js\"></script>\n\n    <script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n    <script type=\"module\">\n        import * as t3d from 't3d';\n        import { ExtrudeShapeBuilder } from 't3d/addons/geometries/builders/ExtrudeShapeBuilder.js';\n        import { GeometryUtils } from 't3d/addons/geometries/GeometryUtils.js';\n        import { ForwardRenderer } from 't3d/addons/render/ForwardRenderer.js';\n        import { Font } from 't3d/addons/geometries/builders/Font.js';\n        import { GUI } from './libs/lil-gui.esm.min.js';\n\n        let width = window.innerWidth || 2;\n        let height = window.innerHeight || 2;\n\n        const canvas = document.createElement('canvas');\n        canvas.width = width;\n        canvas.height = height;\n        document.body.appendChild(canvas);\n\n        const forwardRenderer = new ForwardRenderer(canvas);\n\n        const scene = new t3d.Scene();\n\n        scene.fog = new t3d.FogExp2(0x000000, 0.0023);\n\n        const planeGeo = new t3d.PlaneGeometry(10000, 10000);\n        const planeMaterial = new t3d.BasicMaterial();\n        planeMaterial.transparent = true;\n        planeMaterial.opacity = 0.5;\n\n        const plane = new t3d.Mesh(planeGeo, planeMaterial);\n        scene.add(plane);\n\n        const ambientLight = new t3d.AmbientLight(0xffffff, 1.2);\n        scene.add(ambientLight);\n\n        const directionalLight = new t3d.DirectionalLight(0xffffff, 0.7);\n        directionalLight.position.set(0, 0.2, 1);\n        directionalLight.lookAt(new t3d.Vector3(0, 0, 0), new t3d.Vector3(0, 1, 0));\n        scene.add(directionalLight);\n\n        const camera = new t3d.Camera();\n        camera.position.set(0, 80, 300);\n        camera.lookAt(new t3d.Vector3(0, 20, 0), new t3d.Vector3(0, 1, 0));\n        camera.setPerspective(45 / 180 * Math.PI, width / height, 1, 2000);\n        scene.add(camera);\n\n        const group1 = new t3d.Object3D();\n        const group2 = new t3d.Object3D();\n        const group3 = new t3d.Object3D();\n\n        group3.add(group1);\n        group3.add(group2);\n        scene.add(group3);\n\n        const pbrMaterial = new t3d.PBRMaterial();\n        pbrMaterial.diffuse.setHex(0xFF9900);\n        pbrMaterial.roughness = 0.6;\n        pbrMaterial.metalness = 0.4;\n\n        const loader = new t3d.FileLoader();\n        loader.setResponseType('json');\n\n        const message = 'T3D';\n\n        let geometries = [];\n\n        function createText(fontType) {\n        \tloader.loadAsync('./resources/fonts/typeface/' + fontType + '.typeface.json')\n        \t\t.then(json => new Font(json))\n        \t\t.then(font => {\n        \t\t\t// Clear\n        \n        \t\t\tfor (let i = group1.children.length; i >= 0; i--) {\n        \t\t\t\tgroup1.remove(group1.children[i]);\n        \t\t\t}\n\n        \t\t\tfor (let i = group2.children.length; i >= 0; i--) {\n        \t\t\t\tgroup2.remove(group2.children[i]);\n        \t\t\t}\n\n        \t\t\tgeometries.forEach(geometry => geometry.dispose());\n        \t\t\tgeometries = [];\n\n        \t\t\t// Create\n\n        \t\t\tconst shapes = font.generateShapes(message, 70);\n\n        \t\t\tfor (let i = 0; i < shapes.length; i++) {\n        \t\t\t\tconst geometryData1 = ExtrudeShapeBuilder.getGeometryData({\n        \t\t\t\t\tcontour: shapes[i].contour,\n        \t\t\t\t\tholes: shapes[i].holes,\n        \t\t\t\t\tdepth: 25\n        \t\t\t\t});\n        \n        \t\t\t\tconst geometry = new t3d.Geometry();\n        \t\t\t\tgeometry.addAttribute('a_Position', new t3d.Attribute(new t3d.Buffer(new Float32Array(geometryData1.positions), 3)));\n        \t\t\t\tgeometry.addAttribute('a_Uv', new t3d.Attribute(new t3d.Buffer(new Float32Array(geometryData1.uvs), 2)));\n        \t\t\t\tgeometry.setIndex(new t3d.Attribute(new t3d.Buffer(\n        \t\t\t\t\t(geometryData1.positions.length / 3) > 65536 ? new Uint32Array(geometryData1.indices) : new Uint16Array(geometryData1.indices),\n        \t\t\t\t\t1\n        \t\t\t\t)));\n\n        \t\t\t\tGeometryUtils.computeNormals(geometry);\n        \t\t\t\tgeometry.computeBoundingBox();\n        \t\t\t\tgeometry.computeBoundingSphere();\n\n        \t\t\t\tgeometries.push(geometry);\n\n        \t\t\t\tconst extrudeShape1 = new t3d.Mesh(geometry, pbrMaterial);\n        \t\t\t\tgroup1.add(extrudeShape1);\n\n        \t\t\t\tconst extrudeShape2 = new t3d.Mesh(geometry, pbrMaterial);\n        \t\t\t\tgroup2.add(extrudeShape2);\n        \t\t\t}\n\n        \t\t\tgroup1.position.set(-85, 10, 0);\n        \t\t\tgroup1.euler.set(0, Math.PI * 2, 0);\n\n        \t\t\tgroup2.position.set(-85, -10, -25);\n        \t\t\tgroup2.euler.set(Math.PI, Math.PI * 2, 0);\n        \t\t});\n        }\n\n        createText('optimer_bold');\n\n        const fontParam = {\n        \ttype: 'optimer_bold'\n        };\n\n        const types = ['optimer_regular', 'optimer_bold', 'helvetiker_regular', 'helvetiker_bold'];\n\n        const gui = new GUI();\n        gui.add(fontParam, 'type', types).onChange(createText);\n\n        function loop(count) {\n        \trequestAnimationFrame(loop);\n        \n        \tgroup3.euler.y = count / 2000;\n\n        \tforwardRenderer.render(scene, camera);\n        }\n\n        requestAnimationFrame(loop);\n\n        function onWindowResize() {\n        \twidth = window.innerWidth || 2;\n        \theight = window.innerHeight || 2;\n\n        \tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 2000);\n\n        \tforwardRenderer.screenRenderTarget.resize(width, height);\n        }\n        window.addEventListener('resize', onWindowResize, false);\n    </script>\n</body>\n</html>"
  },
  {
    "path": "examples/texture_2darray.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>t3d - texture2d array</title>\n\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n\t<link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n</head>\n<body>\n    <div id=\"info\">\n\t\t<a href=\"\" target=\"_blank\">t3d</a> - texture2d array<br />\n\t\tScanned head data by\n\t\t<a href=\"https://www.codeproject.com/Articles/352270/Getting-started-with-Volume-Rendering\" target=\"_blank\" rel=\"noopener\">Divine Augustine</a><br />\n\t\tlicensed under\n\t\t<a href=\"https://www.codeproject.com/info/cpol10.aspx\" target=\"_blank\" rel=\"noopener\">CPOL</a>\n\t</div>\n\n\t<!-- Import maps polyfill -->\n    <!-- Remove this when import maps will be widely supported -->\n    <script async src=\"./libs/es-module-shims.js\"></script>\n\n    <script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n    <script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { Clock } from 't3d/addons/Clock.js';\n\t\timport { ForwardRenderer } from 't3d/addons/render/ForwardRenderer.js';\n\t\timport { unzipSync } from './libs/fflate.module.js';\n\n\t\tlet width = window.innerWidth || 2;\n\t\tlet height = window.innerHeight || 2;\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = width;\n\t\tcanvas.height = height;\n\t\tdocument.body.appendChild(canvas);\n\n\t\tconst forwardRenderer = new ForwardRenderer(canvas);\n\n\t\tconst scene = new t3d.Scene();\n\n\t\tconst camera = new t3d.Camera();\n\t\tcamera.position.set(0, 0, 70);\n\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 0.1, 500);\n\t\tscene.add(camera);\n\n\t\t// Create plane to render texture array\n\n\t\tconst shader = {\n\t\t\tuniforms: {\n\t\t\t\tdiffuse: null,\n\t\t\t\tdepth: 0\n\t\t\t},\n\t\t\tvertexShader: `\n\t\t\tattribute vec3 a_Position;\n\t\t\tattribute vec2 a_Uv;\n\t\t\tuniform mat4 u_ProjectionView;\n\t\t\tuniform mat4 u_Model;\n\t\t\tvarying vec2 v_Uv;\n\t\t\tvoid main() {\n\t\t\t\tgl_Position = u_ProjectionView * u_Model * vec4( a_Position, 1.0 );\n\t\t\t\tv_Uv = a_Uv;\n\t\t\t}\n\t\t\t`,\n\t\t\tfragmentShader: `\n\t\t\tprecision highp sampler2DArray;\n\n\t\t\tuniform sampler2DArray diffuse;\n\t\t\tuniform int depth;\n\n\t\t\tvarying vec2 v_Uv;\n\t\t\t\n\t\t\tvoid main() {\n\t\t\t\tvec4 color = texture(diffuse, vec3(v_Uv.x, 1. - v_Uv.y, depth));\n\t\t\t\tgl_FragColor = vec4(color.rrr * 1.5, 1.0); // lighten a bit\n\t\t\t}\n\t\t\t`\n\t\t};\n\n\t\tconst plane = new t3d.Mesh(new t3d.PlaneGeometry(50, 50), new t3d.ShaderMaterial(shader));\n\t\tplane.euler.x = Math.PI / 2;\n\t\tplane.frustumCulled = false;\n\t\tscene.add(plane);\n\n\t\tnew t3d.FileLoader()\n\t\t\t.setResponseType('arraybuffer')\n\t\t\t.loadAsync('./resources/3d/head256x256x109.zip').then(data => {\n\t\t\t\tconst zip = unzipSync(new Uint8Array(data));\n\t\t\t\tconst array = new Uint8Array(zip['head256x256x109'].buffer);\n\n\t\t\t\tconst textureArray = new t3d.Texture2DArray();\n\t\t\t\ttextureArray.image = { data: array, width: 256, height: 256, depth: 109 };\n\n\t\t\t\tplane.material.uniforms['diffuse'] = textureArray;\n\t\t\t});\n\n\t\t//\n\t\t\n\t\tconst clock = new Clock();\n\t\tconst speed = 30;\n\t\tfunction loop(count) {\n\t\t\trequestAnimationFrame(loop);\n\t\t\n\t\t\tplane.material.uniforms['depth'] = (clock.getElapsedTime() * speed) % 109;\n\n\t\t\tforwardRenderer.render(scene, camera);\n\t\t}\n\t\trequestAnimationFrame(loop);\n\n\t\tfunction onWindowResize() {\n\t\t\twidth = window.innerWidth || 2;\n\t\t\theight = window.innerHeight || 2;\n\n\t\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 0.1, 500);\n\n\t\t\tforwardRenderer.screenRenderTarget.resize(width, height);\n\t\t}\n\t\twindow.addEventListener('resize', onWindowResize, false);\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "examples/texture_3d.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>t3d - texture3d</title>\n\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n\t<link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n</head>\n<body>\n    <div id=\"info\">\n\t\t<a href=\"\" target=\"_blank\">t3d</a> - texture3d\n\t\t<br/>reference: <a href=\"http://medium.ixviii.io/texture3d.html\" target=\"_blank\">http://medium.ixviii.io/texture3d.html</a>\n\t</div>\n\t\n\t<script id=\"vertexShader\" type=\"x-shader/x-vertex\">\n\t\tattribute vec3 a_Position;\n\t\tattribute vec2 a_Uv;\n\t\tuniform mat4 u_ProjectionView;\n\t\tuniform mat4 u_Model;\n\t\t\n\t\tattribute float a_UvZ;\n\n\t\tuniform float u_Uvz;\n\t\tuniform float uFogDensity;\n\t\tuniform float uTime;\n\t\tuniform float uSpeed;\n\n\t\tvarying vec2 vUv;\n\t\tvarying vec3 vUv3;\n\t\tvarying float vFogAmount;\n\n\t\tfloat fogExp2(const float dist, const float density) {\n\t\t\tconst float LOG2 = -1.442695;\n\t\t\tfloat d = density * dist;\n\t\t\treturn 1.0 - clamp(exp2(d * d * LOG2), 0.0, 1.0);\n\t\t}\n\n\t\tvoid main(){\n\n\t\t\tvec3 transformed = vec3(0.0);\n\t\t\ttransformed.y = (-u_Uvz * 0.5) + (a_UvZ * u_Uvz);\n\n\t\t\tgl_Position = u_ProjectionView * u_Model * vec4(a_Position.xyz + transformed, 1.0 );\n\n\t\t\tvUv = a_Uv;\n\t\t\tvUv3.x = vUv.x;\n\t\t\tvUv3.y = vUv.y;\n\t\t\tvUv3.z = a_UvZ + uTime * uSpeed;\n\n\t\t\tfloat fogDistance = length(gl_Position.xyz);\n\t\t\tvFogAmount = fogExp2(fogDistance, uFogDensity);\n\t\t\t\n\t\t}\n\t</script>\n\n\t<script id=\"fragmentShader\" type=\"x-shader/x-fragment\">\n\t\tprecision highp sampler3D;\n\n\t\tvarying vec2 vUv;\n\t\tvarying vec3 vUv3;\n\t\tvarying float vFogAmount;\n\n\t\tuniform sampler3D uTexture;\n\n\t\tvoid main() {\n\t\t\tvec3 fogColor = vec3(0.0);\n\n\t\t\tvec3 color = mix(vec3(1.0), fogColor, vFogAmount);\n\t\t\tvec4 color2 = texture(uTexture, vUv3);\n\t\t\tgl_FragColor = vec4(color * color2.r, 1.0 - color2.r);\n\t\t}\n\t</script>\n\n\t<script src=\"./libs/simplex-noise.js\"></script>\n\n\t<!-- Import maps polyfill -->\n    <!-- Remove this when import maps will be widely supported -->\n    <script async src=\"./libs/es-module-shims.js\"></script>\n\n    <script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n    <script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { OrbitControls } from 't3d/addons/controls/OrbitControls.js';\n\t\timport { Clock } from 't3d/addons/Clock.js';\n\t\timport { ForwardRenderer } from 't3d/addons/render/ForwardRenderer.js';\n\t\timport { GUI } from './libs/lil-gui.esm.min.js';\n\n\t\tlet width = window.innerWidth || 2;\n\t\tlet height = window.innerHeight || 2;\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = width;\n\t\tcanvas.height = height;\n\t\tdocument.body.appendChild(canvas);\n\n\t\tconst forwardRenderer = new ForwardRenderer(canvas);\n\n\t\tconst scene = new t3d.Scene();\n\t\t\n\t\tconst SIZE = 64;\n\t\tconst simplex = new SimplexNoise(Math.random);\n\t\tconst scale = 0.035;\n\n\t\tconst src = new Uint8Array(SIZE * SIZE * SIZE);\n\t\tfor (let k = 0; k < SIZE; k += 1) {\n\t\t\tfor (let j = 0; j < SIZE; j += 1) {\n\t\t\t\tfor (let i = 0; i < SIZE; i += 1) {\n\t\t\t\t\tsrc[i + j * SIZE + k * SIZE * SIZE] = Math.abs(simplex.noise3D(i * scale, j * scale, k * scale)) * 256;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst data = new Float32Array(SIZE);\n\t\tfor (let _i = 0; _i < SIZE; _i += 1) {\n\t\t\tdata[_i] = _i / SIZE;\n\t\t}\n\n\t\tconst texture3d = new t3d.Texture3D();\n\t\ttexture3d.image = {\n\t\t\tdata: src,\n\t\t\twidth: SIZE,\n\t\t\theight: SIZE,\n\t\t\tdepth: SIZE\n\t\t};\n\t\ttexture3d.wrapR = t3d.TEXTURE_WRAP.REPEAT;\n\n\t\tfunction createInstancedGeoemtry(geometry) {\n\t\t\tconst instancedGeometry = geometry.clone();\n\n\t\t\tinstancedGeometry.addAttribute('a_UvZ', new t3d.Attribute(new t3d.Buffer(data, 1)));\n\t\t\tinstancedGeometry.getAttribute('a_UvZ').divisor = 1;\n\n\t\t\treturn instancedGeometry;\n\t\t}\n\n\t\tconst PLANE_SIZE = 20;\n\t\tconst geometry = new t3d.PlaneGeometry(PLANE_SIZE, PLANE_SIZE, 1, 1);\n\t\tconst instancedGeometry = createInstancedGeoemtry(geometry);\n\t\tinstancedGeometry.instanceCount = SIZE;\n\n\t\tconst shaderMaterial = new t3d.ShaderMaterial({\n\t\t\tvertexShader: document.getElementById('vertexShader').textContent,\n\t\t\tfragmentShader: document.getElementById('fragmentShader').textContent,\n\t\t\tuniforms: {\n\t\t\t\tuTexture: texture3d,\n\t\t\t\tuSpeed: 0.38,\n\t\t\t\tuTime: 0,\n\t\t\t\tu_Uvz: PLANE_SIZE,\n\t\t\t\tuFogDensity: 0.022\n\t\t\t}\n\t\t});\n\t\t\n\t\tshaderMaterial.transparent = true;\n\t\tshaderMaterial.premultipliedAlpha = true;\n\t\tshaderMaterial.blending = t3d.BLEND_TYPE.CUSTOM;\n\t\tshaderMaterial.blendSrc = t3d.BLEND_FACTOR.ONE;\n\t\tshaderMaterial.blendDst = t3d.BLEND_FACTOR.SRC_ALPHA;\n\t\tshaderMaterial.side = t3d.DRAW_SIDE.DOUBLE;\n\n\t\tconst plane = new t3d.Mesh(instancedGeometry, shaderMaterial);\n\t\tplane.euler.x = Math.PI / 2;\n\t\tplane.frustumCulled = false;\n\t\tscene.add(plane);\n\n\t\tconst camera = new t3d.Camera();\n\t\tcamera.position.set(35, 20, 35);\n\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 0.1, 100);\n\t\tscene.add(camera);\n\t\t\n\t\tconst controller = new OrbitControls(camera, canvas);\n\t\tcontroller.target.set(0, 2, 0);\n\t\tcontroller.enablePan = false;\n\t\tcontroller.rotateSpeed = 0.2;\n\n\t\tconst clock = new Clock();\n\n\t\t// gui\n\t\tconst gui = new GUI();\n\t\tgui.add({ version: 'WebGL ' + forwardRenderer.capabilities.version }, 'version').disable();\n\t\tgui.add(shaderMaterial.uniforms, 'u_Uvz', 0, 64, 0.01).name('depth');\n\t\tgui.add(shaderMaterial.uniforms, 'uFogDensity', 0, 0.1, 0.001).name('fog density');\n\t\tgui.add(shaderMaterial.uniforms, 'uSpeed', 0, 5, 0.01).name('speed');\n\n\t\tfunction loop(count) {\n\t\t\trequestAnimationFrame(loop);\n\t\t\n\t\t\tcontroller.update();\n\n\t\t\tshaderMaterial.uniforms.uTime = clock.getElapsedTime();\n\n\t\t\tforwardRenderer.render(scene, camera);\n\t\t}\n\t\trequestAnimationFrame(loop);\n\n\t\tfunction onWindowResize() {\n\t\t\twidth = window.innerWidth || 2;\n\t\t\theight = window.innerHeight || 2;\n\n\t\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 0.1, 100);\n\n\t\t\tforwardRenderer.screenRenderTarget.resize(width, height);\n\t\t}\n\t\twindow.addEventListener('resize', onWindowResize, false);\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "examples/texture_anisotropic.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>t3d - anisotropic</title>\n\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n\t<link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n</head>\n<body>\n    <div id=\"info\">\n        <a href=\"\" target=\"_blank\">t3d</a> - anisotropic\n    </div>\n\n\t<!-- Import maps polyfill -->\n    <!-- Remove this when import maps will be widely supported -->\n    <script async src=\"./libs/es-module-shims.js\"></script>\n\n    <script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n    <script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { ForwardRenderer } from 't3d/addons/render/ForwardRenderer.js';\n\t\timport { Texture2DLoader } from 't3d/addons/loaders/Texture2DLoader.js';\n\t\timport { GUI } from './libs/lil-gui.esm.min.js';\n\n\t\tlet width = window.innerWidth || 2;\n\t\tlet height = window.innerHeight || 2;\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = width;\n\t\tcanvas.height = height;\n\t\tdocument.body.appendChild(canvas);\n\n\t\tconst forwardRenderer = new ForwardRenderer(canvas);\n\n\t\tconst scene = new t3d.Scene();\n\n\t\tconst texture = new Texture2DLoader().load('./resources/hardwood2_diffuse.jpg');\n\t\t// texture.minFilter = texture.magFilter = t3d.TEXTURE_FILTER.NEAREST;\n\t\ttexture.wrapT = texture.wrapS = t3d.TEXTURE_WRAP.REPEAT;\n\t\ttexture.anisotropy = forwardRenderer.capabilities.maxAnisotropy;\n\t\ttexture.encoding = t3d.TEXEL_ENCODING_TYPE.SRGB;\n\n\t\tconst plane_geometry = new t3d.PlaneGeometry(1000, 1000);\n\t\tconst lambert = new t3d.BasicMaterial();\n\t\tlambert.diffuse.setHex(0xffffff);\n\t\tlambert.diffuseMap = texture;\n\t\tlambert.diffuseMapTransform.setUvTransform(0, 0, 20, 20, 0, 0.5, 0.5);\n\t\tconst plane = new t3d.Mesh(plane_geometry, lambert);\n\t\tplane.position.y = -10;\n\t\tscene.add(plane);\n\n\t\tconst camera = new t3d.Camera();\n\t\tcamera.outputEncoding = t3d.TEXEL_ENCODING_TYPE.SRGB;\n\t\tcamera.position.set(0, 25, 100);\n\t\tcamera.lookAt(new t3d.Vector3(0, 0, 0), new t3d.Vector3(0, 1, 0));\n\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 1000);\n\t\tscene.add(camera);\n\n\t\t// input\n\n\t\tconst gui = new GUI();\n\t\tgui.add({ version: 'WebGL ' + forwardRenderer.capabilities.version }, 'version').disable();\n\t\tgui.add(forwardRenderer.capabilities, 'maxAnisotropy').disable();\n\t\tgui.add(texture, 'anisotropy', 1, forwardRenderer.capabilities.maxAnisotropy, 1).onChange(() => {\n\t\t\ttexture.version++;\n\t\t});\n\n\t\tfunction loop(count) {\n\t\t\trequestAnimationFrame(loop);\n\n\t\t\t// rotate camera\n\t\t\tcamera.position.x = 100 * Math.sin(count / 1000 * .2);\n\t\t\tcamera.position.z = 100 * Math.cos(count / 1000 * .2);\n\t\t\tcamera.lookAt(new t3d.Vector3(0, 0, 0), new t3d.Vector3(0, 1, 0));\n\n\t\t\tforwardRenderer.render(scene, camera);\n\t\t}\n\t\trequestAnimationFrame(loop);\n\n\t\tfunction onWindowResize() {\n\t\t\twidth = window.innerWidth || 2;\n\t\t\theight = window.innerHeight || 2;\n\n\t\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 1000);\n\n\t\t\tforwardRenderer.screenRenderTarget.resize(width, height);\n\t\t}\n\t\twindow.addEventListener('resize', onWindowResize, false);\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "examples/texture_depth.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>t3d - depth texture</title>\n\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n\t<link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n</head>\n<body>\n    <div id=\"info\">\n        <a href=\"\" target=\"_blank\">t3d</a> - depth texture\n    </div>\n\n\t<!-- Import maps polyfill -->\n    <!-- Remove this when import maps will be widely supported -->\n    <script async src=\"./libs/es-module-shims.js\"></script>\n\n    <script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n    <script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { OrbitControls } from 't3d/addons/controls/OrbitControls.js';\n\t\timport { DepthLinearShader } from 't3d/addons/shaders/DepthLinearShader.js';\n\n\t\tlet width = window.innerWidth || 2;\n\t\tlet height = window.innerHeight || 2;\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = width;\n\t\tcanvas.height = height;\n\t\tdocument.body.appendChild(canvas);\n\n\t\tconst screenRenderTarget = new t3d.ScreenRenderTarget(canvas);\n\t\tscreenRenderTarget.setColorClearValue(0, 0, 0, 1);\n\n\t\tconst gl = canvas.getContext('webgl', { antialias: false, alpha: false });\n\t\tconst renderer = new t3d.WebGLRenderer(gl);\n\n\t\tconst scene = new t3d.Scene();\n\n\t\tconst sphere_geometry = new t3d.SphereGeometry(10, 20, 20);\n\t\tconst phong = new t3d.PhongMaterial();\n\t\tphong.diffuse.setHex(0xffffff);\n\t\tconst sphere = new t3d.Mesh(sphere_geometry, phong);\n\t\tscene.add(sphere);\n\n\t\tconst plane_geometry = new t3d.PlaneGeometry(100, 100);\n\t\tconst lambert = new t3d.LambertMaterial();\n\t\tlambert.diffuse.setHex(0xffffff);\n\t\tconst plane = new t3d.Mesh(plane_geometry, lambert);\n\t\tplane.position.y = -10;\n\t\tscene.add(plane);\n\n\t\tconst camera = new t3d.Camera();\n\t\tcamera.position.set(50, 40, 100);\n\t\tcamera.lookAt(new t3d.Vector3(0, 0, 0), new t3d.Vector3(0, 1, 0));\n\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 2, 300);\n\t\t// camera.setOrtho(- width / 4 / 2, width / 4 / 2, - height / 4 / 2, height / 4 / 2, 2, 300);\n\t\tscene.add(camera);\n\n\t\tconst controller = new OrbitControls(camera, canvas);\n\n\t\tconst tempRenderTarget = t3d.OffscreenRenderTarget.create2D(width, height);\n\t\ttempRenderTarget.texture.minFilter = t3d.TEXTURE_FILTER.NEAREST;\n\t\ttempRenderTarget.texture.magFilter = t3d.TEXTURE_FILTER.NEAREST;\n\t\ttempRenderTarget.texture.generateMipmaps = false;\n\n\t\tconst depthTexture = new t3d.Texture2D();\n\t\tdepthTexture.image = { data: null, width: 4, height: 4 };\n\t\tdepthTexture.type = t3d.PIXEL_TYPE.UNSIGNED_SHORT; // UNSIGNED_SHORT, UNSIGNED_INT\n\t\tdepthTexture.format = t3d.PIXEL_FORMAT.DEPTH_COMPONENT;\n\t\tdepthTexture.magFilter = t3d.TEXTURE_FILTER.NEAREST;\n\t\tdepthTexture.minFilter = t3d.TEXTURE_FILTER.NEAREST;\n\t\tdepthTexture.generateMipmaps = false;\n\t\tdepthTexture.flipY = false;\n\t\ttempRenderTarget.detach(t3d.ATTACHMENT.DEPTH_STENCIL_ATTACHMENT);\n\t\ttempRenderTarget.attach(\n\t\t\tdepthTexture,\n\t\t\tt3d.ATTACHMENT.DEPTH_ATTACHMENT\n\t\t);\n\n\t\tconst depthLinearPass = new t3d.ShaderPostPass(DepthLinearShader);\n\t\tdepthLinearPass.uniforms['depthTex'] = depthTexture;\n\t\tdepthLinearPass.uniforms['cameraNear'] = 2;\n\t\tdepthLinearPass.uniforms['cameraFar'] = 300;\n\n\t\tfunction loop(count) {\n\t\t\trequestAnimationFrame(loop);\n\n\t\t\tcontroller.update();\n\n\t\t\tscene.updateMatrix();\n\t\t\tscene.updateRenderStates(camera);\n\t\t\tscene.updateRenderQueue(camera);\n\n\t\t\trenderer.renderScene(scene, camera, tempRenderTarget);\n\n\t\t\tdepthLinearPass.render(renderer, screenRenderTarget);\n\t\t}\n\n\t\trequestAnimationFrame(loop);\n\n\t\tfunction onWindowResize() {\n\t\t\twidth = window.innerWidth || 2;\n\t\t\theight = window.innerHeight || 2;\n\n\t\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 2, 300);\n\t\t\t// camera.setOrtho(- width / 4 / 2, width / 4 / 2, - height / 4 / 2, height / 4 / 2, 2, 300);\n\n\t\t\tscreenRenderTarget.resize(width, height);\n\t\t\ttempRenderTarget.resize(width, height);\n\t\t}\n\t\twindow.addEventListener('resize', onWindowResize, false);\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "examples/texture_generator_heatmap.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>t3d - texture heatmap</title>\n\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n\t<link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n</head>\n<body>\n    <div id=\"info\" class=\"dark\">\n        <a href=\"\" target=\"_blank\">t3d</a> - texture heatmap\n    </div>\n\n\t<!-- Import maps polyfill -->\n    <!-- Remove this when import maps will be widely supported -->\n    <script async src=\"./libs/es-module-shims.js\"></script>\n\n    <script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n    <script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { ColorGradient } from 't3d/addons/math/ColorGradient.js';\n\t\timport { HeatmapGenerator } from 't3d/addons/textures/HeatmapGenerator.js';\n\t\timport { GradientTextureGenerator } from 't3d/addons/textures/GradientTextureGenerator.js';\n\t\timport { Texture2DLoader } from 't3d/addons/loaders/Texture2DLoader.js';\n\t\timport { OrbitControls } from 't3d/addons/controls/OrbitControls.js';\n\t\timport { GUI } from './libs/lil-gui.esm.min.js';\n\n\t\tlet width = window.innerWidth || 2;\n\t\tlet height = window.innerHeight || 2;\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = width;\n\t\tcanvas.height = height;\n\t\tdocument.body.appendChild(canvas);\n\n\t\tconst contextParams = { antialias: true, alpha: false };\n\t\tconst gl = canvas.getContext('webgl2', contextParams) || canvas.getContext('webgl', contextParams);\n\t\tconst renderer = new t3d.WebGLRenderer(gl);\n\t\tconst screenRenderTarget = new t3d.ScreenRenderTarget(canvas);\n\t\tscreenRenderTarget.setColorClearValue(0.6, 0.6, 0.6, 1);\n\n\t\tconst scene = new t3d.Scene();\n\n\t\tconst camera = new t3d.Camera();\n\t\tcamera.position.set(0, 120, 120);\n\t\tcamera.lookAt(new t3d.Vector3(0, 0, 0), new t3d.Vector3(0, 1, 0));\n\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 0.1, 1000);\n\t\tscene.add(camera);\n\n\t\tconst controller = new OrbitControls(camera, canvas);\n\n\t\tconst gui = new GUI();\n\t\tgui.close();\n\n\t\t// heatmap\n\n\t\tconst generator = new HeatmapGenerator(1024, 1024);\n\n\t\tconst colorGradient = new ColorGradient()\n\t\t\t.addColorStop(0.1, new t3d.Color3(0x0000ff))\n\t\t\t.addColorStop(0.4, new t3d.Color3(0x00ffff))\n\t\t\t.addColorStop(0.6, new t3d.Color3(0x00ff00))\n\t\t\t.addColorStop(0.8, new t3d.Color3(0xffff00))\n\t\t\t.addColorStop(1.0, new t3d.Color3(0xff0000));\n\n\t\tconst gradientTexture = new GradientTextureGenerator()\n\t\t\t.gradient(colorGradient)\n\t\t\t.getTexture();\n\n\t\tconst planeGeometry = new t3d.PlaneGeometry(50, 50);\n\n\t\tconst material = new t3d.BasicMaterial();\n\t\tmaterial.diffuseMap = generator.getGrayTexture();\n\t\tmaterial.transparent = true;\n\t\tconst mesh = new t3d.Mesh(planeGeometry, material);\n\t\tmesh.position.set(30, 0, 30);\n\t\tscene.add(mesh);\n\n\t\tconst material2 = new t3d.BasicMaterial();\n\t\tmaterial2.diffuseMap = generator.getTexture();\n\t\tmaterial2.transparent = true;\n\t\tconst mesh2 = new t3d.Mesh(planeGeometry, material2);\n\t\tmesh2.position.set(-30, 0, 30);\n\t\tscene.add(mesh2);\n\n\t\tconst params = { radius: 30, interpolation: 'gaussian', gaussianSigma: 0.158, alpha: false, gradientTexture: 0 };\n\n\t\tfunction updateTextures() {\n\t\t\tgenerator.render(renderer, [\n\t\t\t\t[15, -15, 38],\n\t\t\t\t[15, 15, 39],\n\t\t\t\t[-15, 15, 40],\n\t\t\t\t[-15, -15, 41]\n\t\t\t], {\n\t\t\t\tsize: [60, 60],\n\t\t\t\tradius: params.radius,\n\t\t\t\tinterpolation: params.interpolation,\n\t\t\t\tgaussianSigma: params.gaussianSigma,\n\t\t\t\trange: [35, 41]\n\t\t\t}).colorize(renderer, gradientTexture, {\n\t\t\t\talpha: params.alpha\n\t\t\t});\n\t\t}\n\n\t\tupdateTextures();\n\n\t\tconst debugFolder = gui.addFolder('debug');\n\t\tdebugFolder.add(params, 'radius', 1, 30, 0.1).onChange(updateTextures);\n\t\tdebugFolder.add(params, 'interpolation', ['gaussian', 'linear', 'cos']).onChange(updateTextures);\n\t\tdebugFolder.add(params, 'gaussianSigma', 0, 0.5, 0.001).onChange(updateTextures);\n\t\tdebugFolder.add(params, 'alpha').onChange(updateTextures);\n\n\t\t// heatmap with hightmap\n\n\t\tconst heatmapHeightShader = {\n\t\t\tname: 'hm_s',\n\t\t\tuniforms: {\n\t\t\t\thightMap: null,\n\t\t\t\tcolorMap: null,\n\t\t\t\theightFactor: 20\n\t\t\t},\n\t\t\tvertexShader: `\n\t\t\t\tattribute vec3 a_Position;\n\t\t\t\tattribute vec2 a_Uv;\n\t\t\t\tuniform mat4 u_ProjectionView;\n\t\t\t\tuniform mat4 u_Model;\n\t\t\t\tuniform sampler2D hightMap;\n\t\t\t\tuniform float heightFactor;\n\t\t\t\tvarying vec2 v_Uv;\n\t\t\t\tvoid main() {\n\t\t\t\t\tv_Uv = a_Uv;\n\n\t\t\t\t\tvec4 texel = texture2D(hightMap, v_Uv);\n\t\t\t\t\tvec3 position = a_Position;\n\t\t\t\t\tposition.y += texel.r * heightFactor;\n\t\t\t\t\t\n\t\t\t\t\tgl_Position = u_ProjectionView * u_Model * vec4(position, 1.0);\n\t\t\t\t}\n\t\t\t`,\n\t\t\tfragmentShader: `\n\t\t\t\tuniform sampler2D colorMap;\n\t\t\t\tvarying vec2 v_Uv;\n\t\t\t\tvoid main() {\n\t\t\t\t\tvec4 texel = texture2D(colorMap, v_Uv);\n\t\t\t\t\tgl_FragColor = texel;\n\t\t\t\t}\n\t\t\t`\n\t\t};\n\n\t\tconst supportVertexTextures = renderer.capabilities.maxVertexTextures > 0;\n\n\t\tif (supportVertexTextures) {\n\t\t\tnew Texture2DLoader().load('./resources/platte.png', function(texture) {\n\t\t\t\tconst generator2 = new HeatmapGenerator(2048, 1024);\n\t\t\t\tconst data = [];\n\t\t\t\tfor (let i = 0; i < 50; i++) {\n\t\t\t\t\tdata[i] = [Math.random() * 120 - 60, Math.random() * 60 - 30, Math.random() * 0.6];\n\t\t\t\t}\n\t\t\t\tgenerator2.render(renderer, data, {\n\t\t\t\t\tsize: [120, 60],\n\t\t\t\t\tradius: 15\n\t\t\t\t}).colorize(renderer, texture, {\n\t\t\t\t\talpha: false\n\t\t\t\t});\n\n\t\t\t\tconst hightMaterial = new t3d.ShaderMaterial(heatmapHeightShader);\n\t\t\t\thightMaterial.uniforms.hightMap = generator2.getGrayTexture();\n\t\t\t\thightMaterial.uniforms.colorMap = generator2.getTexture();\n\t\t\t\thightMaterial.transparent = true;\n\n\t\t\t\tconst hightGeometry = new t3d.PlaneGeometry(100, 50, 100, 50);\n\t\t\n\t\t\t\tconst hightMesh = new t3d.Mesh(hightGeometry, hightMaterial);\n\t\t\t\thightMesh.position.z = -30;\n\t\t\t\tscene.add(hightMesh);\n\t\t\t});\n\t\t}\n\n\t\tfunction loop(count) {\n\t\t\trequestAnimationFrame(loop);\n\n\t\t\tcontroller.update();\n\t\t\n\t\t\tscene.updateMatrix();\n\t\t\tscene.updateRenderStates(camera);\n\t\t\tscene.updateRenderQueue(camera);\n\n\t\t\trenderer.renderScene(scene, camera, screenRenderTarget);\n\t\t}\n\n\t\trequestAnimationFrame(loop);\n\n\t\tfunction onWindowResize() {\n\t\t\twidth = window.innerWidth || 2;\n\t\t\theight = window.innerHeight || 2;\n\n\t\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 0.1, 1000);\n\n\t\t\tscreenRenderTarget.resize(width, height);\n\t\t}\n\t\twindow.addEventListener('resize', onWindowResize, false);\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "examples/texture_generator_idwmap.html",
    "content": "<!DOCTYPE html>\n<html>\n\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>t3d - texture idwmap</title>\n\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n\t<link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n</head>\n\n<body>\n\t<div id=\"info\" class=\"dark\">\n\t\t<a href=\"\" target=\"_blank\">t3d</a> - texture idwmap\n\t</div>\n\n\t<!-- Import maps polyfill -->\n\t<!-- Remove this when import maps will be widely supported -->\n\t<script async src=\"./libs/es-module-shims.js\"></script>\n\n\t<script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n\t<script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { ColorGradient } from 't3d/addons/math/ColorGradient.js';\n\t\timport { IDWMapGenerator } from 't3d/addons/textures/IDWMapGenerator.js';\n\t\timport { GradientTextureGenerator } from 't3d/addons/textures/GradientTextureGenerator.js';\n\t\timport { OrbitControls } from 't3d/addons/controls/OrbitControls.js';\n\t\timport { GUI } from './libs/lil-gui.esm.min.js';\n\n\t\tlet width = window.innerWidth || 2;\n\t\tlet height = window.innerHeight || 2;\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = width;\n\t\tcanvas.height = height;\n\t\tdocument.body.appendChild(canvas);\n\n\t\tconst contextParams = { antialias: true, alpha: false };\n\t\tconst gl = canvas.getContext('webgl2', contextParams) || canvas.getContext('webgl', contextParams);\n\t\tconst renderer = new t3d.WebGLRenderer(gl);\n\t\tconst screenRenderTarget = new t3d.ScreenRenderTarget(canvas);\n\t\tscreenRenderTarget.setColorClearValue(0.6, 0.6, 0.6, 1);\n\n\t\tconst scene = new t3d.Scene();\n\n\t\tconst camera = new t3d.Camera();\n\t\tcamera.position.set(0, 120, 120);\n\t\tcamera.lookAt(new t3d.Vector3(0, 0, 0), new t3d.Vector3(0, 1, 0));\n\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 0.1, 1000);\n\t\tscene.add(camera);\n\n\t\tconst controller = new OrbitControls(camera, canvas);\n\n\t\tconst generator = new IDWMapGenerator(1024, 1024);\n\n\t\tconst colorGradient = new ColorGradient()\n\t\t\t.addColorStop(0.1, new t3d.Color3(0x0000ff))\n\t\t\t.addColorStop(0.4, new t3d.Color3(0x00ffff))\n\t\t\t.addColorStop(0.6, new t3d.Color3(0x00ff00))\n\t\t\t.addColorStop(0.8, new t3d.Color3(0xffff00))\n\t\t\t.addColorStop(1.0, new t3d.Color3(0xff0000));\n\n\t\tconst gradientTexture = new GradientTextureGenerator()\n\t\t\t.gradient(colorGradient)\n\t\t\t.getTexture();\n\n\t\tconst planeGeometry = new t3d.PlaneGeometry(50, 50);\n\n\t\tconst material = new t3d.BasicMaterial();\n\t\tmaterial.diffuseMap = generator.getGrayTexture();\n\t\tconst mesh = new t3d.Mesh(planeGeometry, material);\n\t\tmesh.position.set(30, 0, 0);\n\t\tscene.add(mesh);\n\n\t\tconst material2 = new t3d.BasicMaterial();\n\t\tmaterial2.diffuseMap = generator.getTexture();\n\t\tconst mesh2 = new t3d.Mesh(planeGeometry, material2);\n\t\tmesh2.position.set(-30, 0, 0);\n\t\tscene.add(mesh2);\n\n\t\tconst size = [60, 60];\n\t\tconst params = { exponent: 2, gradientTexture: 0, isoline: true };\n\n\t\tfunction updateTextures() {\n\t\t\tgenerator.render(renderer, [\n\t\t\t\t[-30, 15, 10],\n\t\t\t\t[-15, -15, 5],\n\t\t\t\t[30, 15, 25],\n\t\t\t\t[30, -15, 14]\n\t\t\t], {\n\t\t\t\tsize: size,\n\t\t\t\trange: [1, 28],\n\t\t\t\texponent: params.exponent\n\t\t\t}).colorize(renderer, gradientTexture, {\n\t\t\t\tisoline: params.isoline\n\t\t\t});\n\t\t}\n\n\t\tupdateTextures();\n\n\t\tconst gui = new GUI();\n\t\tgui.add(params, 'exponent', [1, 2, 3]).onChange(updateTextures);\n\t\tgui.add(params, 'isoline').onChange(updateTextures);\n\t\tgui.close();\n\n\t\tfunction loop(count) {\n\t\t\trequestAnimationFrame(loop);\n\n\t\t\tcontroller.update();\n\n\t\t\tscene.updateMatrix();\n\t\t\tscene.updateRenderStates(camera);\n\t\t\tscene.updateRenderQueue(camera);\n\n\t\t\trenderer.renderScene(scene, camera, screenRenderTarget);\n\t\t}\n\n\t\trequestAnimationFrame(loop);\n\n\t\tfunction onWindowResize() {\n\t\t\twidth = window.innerWidth || 2;\n\t\t\theight = window.innerHeight || 2;\n\n\t\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 0.1, 1000);\n\n\t\t\tscreenRenderTarget.resize(width, height);\n\t\t}\n\t\twindow.addEventListener('resize', onWindowResize, false);\n\t</script>\n</body>\n\n</html>"
  },
  {
    "path": "examples/texture_integer.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>t3d - integer texture</title>\n\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n\t<link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n</head>\n<body>\n    <div id=\"info\">\n        <a href=\"\" target=\"_blank\">t3d</a> - integer texture\n\t\t<br/> This is a texture of signed integer. The upper and lower parts represent the positive part and the negative part respectively.\n\t\t<br/> Available only for WebGL 2.0\n\t\t<div id=\"notSupported\" style=\"display:none\">Sorry, your graphics card + browser does not support WebGL2</div>\n    </div>\n\n\t<script id=\"vertexShader\" type=\"x-shader/x-vertex\">\n\t\tattribute vec3 a_Position;\n\n\t\tattribute vec2 a_Uv;\n\t\tvarying vec2 v_Uv;\n\n\t\tuniform mat4 u_ProjectionView;\n\t\tuniform mat4 u_Model;\n\n\t\tvoid main() {\n\t\t\tgl_Position = u_ProjectionView * u_Model * vec4(a_Position, 1.0);\n\t\t\tv_Uv = a_Uv;\n\t\t}\n\t</script>\n\n\t<script id=\"fragmentShader\" type=\"x-shader/x-fragment\">\n\t\tvarying vec2 v_Uv;\n\n\t\tuniform isampler2D map;\n\n\t\tvoid main() {\n\t\t\tivec4 texColor = texture2D(map, v_Uv);\n\t\t\tgl_FragColor = vec4(0.0, abs(float(texColor.r % 128)) / 128., 0.0, 1.0);\n\t\t}\n\t</script>\n\n\t<!-- Import maps polyfill -->\n    <!-- Remove this when import maps will be widely supported -->\n    <script async src=\"./libs/es-module-shims.js\"></script>\n\n    <script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n    <script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { ForwardRenderer } from 't3d/addons/render/ForwardRenderer.js';\n\n\t\tlet width = window.innerWidth || 2;\n\t\tlet height = window.innerHeight || 2;\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = width;\n\t\tcanvas.height = height;\n\t\tdocument.body.appendChild(canvas);\n\n\t\tconst forwardRenderer = new ForwardRenderer(canvas);\n\n\t\tconst scene = new t3d.Scene();\n\n\t\tconst size = 128;\n\t\tconst pixelCount = size * size;\n\t\tconst halfPixelCount = pixelCount / 2;\n\t\tconst imageData = new Int16Array(pixelCount * 4);\n\t\tfor (let i = 0; i < pixelCount; i++) {\n\t\t\timageData[i * 4] = i - halfPixelCount;\n\t\t\timageData[i * 4 + 1] = 0;\n\t\t\timageData[i * 4 + 2] = 0;\n\t\t\timageData[i * 4 + 3] = 1;\n\t\t}\n\n\t\tconst dataTexture = new t3d.Texture2D();\n\t\tdataTexture.image = { data: imageData, width: size, height: size };\n\t\tdataTexture.format = t3d.PIXEL_FORMAT.RGBA_INTEGER;\n\t\tdataTexture.internalformat = 'RGBA16I';\n\t\tdataTexture.type = t3d.PIXEL_TYPE.SHORT;\n\t\tdataTexture.magFilter = t3d.TEXTURE_FILTER.NEAREST;\n\t\tdataTexture.minFilter = t3d.TEXTURE_FILTER.NEAREST;\n\t\tdataTexture.generateMipmaps = false;\n\t\tdataTexture.flipY = false;\n\n\t\tconst vertexShader = document.getElementById('vertexShader').textContent;\n\t\tconst fragmentShader = document.getElementById('fragmentShader').textContent;\n\t\tconst shader = {\n\t\t\tvertexShader: vertexShader,\n\t\t\tfragmentShader: fragmentShader,\n\t\t\tuniforms: { map: dataTexture }\n\t\t};\n\n\t\tconst geometry = new t3d.PlaneGeometry(100, 100);\n\t\tconst material = new t3d.ShaderMaterial(shader);\n\n\t\tconst plane = new t3d.Mesh(geometry, material);\n\t\tscene.add(plane);\n\n\t\tconst camera = new t3d.Camera();\n\t\tcamera.position.set(0, 220, 0);\n\t\tcamera.lookAt(new t3d.Vector3(0, 0, 0), new t3d.Vector3(0, 1, 0));\n\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 1000);\n\t\tscene.add(camera);\n\n\t\tfunction loop(count) {\n\t\t\trequestAnimationFrame(loop);\n\n\t\t\tforwardRenderer.render(scene, camera);\n\t\t}\n\t\t\n\t\tif (forwardRenderer.capabilities.version < 2) {\n\t\t\tdocument.getElementById('notSupported').style.display = '';\n\t\t} else {\n\t\t\trequestAnimationFrame(loop);\n\t\t}\n\n\t\tfunction onWindowResize() {\n\t\t\twidth = window.innerWidth || 2;\n\t\t\theight = window.innerHeight || 2;\n\n\t\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 1000);\n\n\t\t\tforwardRenderer.screenRenderTarget.resize(width, height);\n\t\t}\n\t\twindow.addEventListener('resize', onWindowResize, false);\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "examples/texture_loader_compressed_dds.html",
    "content": "<!DOCTYPE html>\n<html>\n\n<head>\n    <meta charset=\"utf-8\">\n    <title>t3d - compressed texture dds loader</title>\n    <meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n    <link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n</head>\n\n<body>\n    <div id=\"info\">\n        <a href=\"\" target=\"_blank\">t3d</a> - compressed texture dds\n        <br />\n        <div id=\"notSupported\" style=\"display:none\">Sorry, your graphics card + browser does not support dds</div>\n    </div>\n\n    <!-- Import maps polyfill -->\n    <!-- Remove this when import maps will be widely supported -->\n    <script async src=\"./libs/es-module-shims.js\"></script>\n\n    <script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n\t<script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { ForwardRenderer } from 't3d/addons/render/ForwardRenderer.js';\n\t\timport { DDSTextureLoader } from 't3d/addons/loaders/DDSLoader.js';\n\n\t\tlet width = window.innerWidth || 2;\n\t\tlet height = window.innerHeight || 2;\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = width;\n\t\tcanvas.height = height;\n\t\tdocument.body.appendChild(canvas);\n\n\t\tconst forwardRenderer = new ForwardRenderer(canvas);\n\n\t\tconst scene = new t3d.Scene();\n\n\t\tconst camera = new t3d.Camera();\n\t\tcamera.position.set(0, 0, 15);\n\t\tcamera.lookAt(new t3d.Vector3(0, 0, 0), new t3d.Vector3(0, 1, 0));\n\t\tcamera.setPerspective(60 / 180 * Math.PI, width / height, 1, 1000);\n\t\tscene.add(camera);\n\n\t\tconst capabilities = forwardRenderer.capabilities;\n\t\tif ((!capabilities.getExtension('WEBGL_compressed_texture_s3tc'))) {\n\t\t\tdocument.getElementById('notSupported').style.display = '';\n\t\t\tconsole.error('Not supported dds!');\n\t\t}\n\n\t\tconst loader = new DDSTextureLoader();\n\n\t\tconst mapUrls = [\n\t\t\t'resources/compressed/disturb_dxt1_mip.dds',\n\t\t\t'resources/compressed/disturb_dxt1_nomip.dds',\n\t\t\t'resources/compressed/hepatica_dxt3_mip.dds',\n\t\t\t'resources/compressed/explosion_dxt5_mip.dds',\n\t\t\t'resources/compressed/disturb_argb_nomip.dds',\n\t\t\t'resources/compressed/disturb_argb_mip.dds',\n\t\t\t'resources/compressed/Mountains_argb_mip.dds',\n\t\t\t'resources/compressed/Mountains_argb_nomip.dds'\n\t\t];\n\n\t\tconst meshes = [];\n\n\t\tconst boxGeometry = new t3d.BoxGeometry(2, 2, 2);\n\t\tconst sphereGeometry = new t3d.SphereGeometry(1.5, 32, 32);\n\n\t\tconst promises = mapUrls.map(url => loader.loadAsync(url));\n\n\t\tPromise.all(promises).then(textures => {\n\t\t\ttextures.forEach((texture, index) => {\n\t\t\t\tconst isCube = index >= 6;\n\n\t\t\t\ttexture.anisotropy = isCube ? 1 : 4;\n\n\t\t\t\tconst material = new t3d.BasicMaterial();\n\t\t\t\tmaterial.transparent = !isCube;\n\t\t\t\tmaterial.side = t3d.DRAW_SIDE.DOUBLE;\n\t\t\t\tmaterial[isCube ? 'envMap' : 'diffuseMap'] = texture;\n\n\t\t\t\tconst geometry = isCube ? sphereGeometry : boxGeometry;\n\n\t\t\t\tconst mesh = new t3d.Mesh(geometry, material);\n\t\t\t\tmesh.position.set(-8 + Math.floor(index / 2) * 5, index % 2 === 0 ? 3 : -3, 0);\n\n\t\t\t\tscene.add(mesh);\n\t\t\t\tmeshes.push(mesh);\n\t\t\t});\n\t\t});\n\n\t\tfunction loop(count) {\n\t\t\trequestAnimationFrame(loop);\n\n\t\t\tfor (let i = 0; i < meshes.length; i++) {\n\t\t\t\tconst mesh = meshes[i];\n\t\t\t\tmesh.euler.x = -count / 1000;\n\t\t\t\tmesh.euler.y = -count / 1000;\n\t\t\t}\n\n\t\t\tforwardRenderer.render(scene, camera);\n\t\t}\n\n\t\trequestAnimationFrame(loop);\n\n\t\tfunction onWindowResize() {\n\t\t\twidth = window.innerWidth || 2;\n\t\t\theight = window.innerHeight || 2;\n\n\t\t\tcamera.setPerspective(60 / 180 * Math.PI, width / height, 1, 1000);\n\n\t\t\tforwardRenderer.screenRenderTarget.resize(width, height);\n\t\t}\n\t\twindow.addEventListener('resize', onWindowResize, false);\n\t</script>\n</body>\n\n</html>"
  },
  {
    "path": "examples/texture_loader_compressed_pvr.html",
    "content": "<!DOCTYPE html>\n<html>\n\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>t3d - compressed texture pvr loader</title>\n\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n\t<link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n</head>\n\n<body>\n\t<div id=\"info\">\n\t\t<a href=\"\" target=\"_blank\">t3d</a> - compressed texture pvr\n\t\t<br />\n\t\t<div id=\"notSupported\" style=\"display:none\">Sorry, your graphics card + browser does not support pvr</div>\n\t</div>\n\n\t<!-- Import maps polyfill -->\n\t<!-- Remove this when import maps will be widely supported -->\n\t<script async src=\"./libs/es-module-shims.js\"></script>\n\n\t<script type=\"importmap\">\n\t\t{\n\t\t\t\"imports\": {\n\t\t\t\t\"t3d\": \"../build/t3d.module.js\",\n\t\t\t\t\"t3d/addons/\": \"./jsm/\"\n\t\t\t}\n\t\t}\n\t</script>\n\n\t<script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { ForwardRenderer } from 't3d/addons/render/ForwardRenderer.js';\n\t\timport { PVRTextureLoader } from 't3d/addons/loaders/PVRLoader.js';\n\n\t\tlet width = window.innerWidth || 2;\n\t\tlet height = window.innerHeight || 2;\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = width;\n\t\tcanvas.height = height;\n\t\tdocument.body.appendChild(canvas);\n\n\t\tconst forwardRenderer = new ForwardRenderer(canvas);\n\n\t\tconst scene = new t3d.Scene();\n\n\t\tconst camera = new t3d.Camera();\n\t\tcamera.position.set(0, 0, 15);\n\t\tcamera.lookAt(new t3d.Vector3(0, 0, 0), new t3d.Vector3(0, 1, 0));\n\t\tcamera.setPerspective(60 / 180 * Math.PI, width / height, 1, 1000);\n\t\tscene.add(camera);\n\n\t\tconst capabilities = forwardRenderer.capabilities;\n\t\tif ((!capabilities.getExtension('WEBGL_compressed_texture_pvrtc'))) {\n\t\t\tdocument.getElementById('notSupported').style.display = '';\n\t\t\tconsole.error('Not supported pvr!');\n\t\t}\n\n\t\tconst loader = new PVRTextureLoader();\n\n\t\tconst mapUrls = [\n\t\t\t'./resources/compressed/disturb_4bpp_rgb.pvr',\n\t\t\t'./resources/compressed/disturb_4bpp_rgb_v3.pvr',\n\t\t\t'./resources/compressed/disturb_4bpp_rgb_mips.pvr',\n\t\t\t'./resources/compressed/disturb_2bpp_rgb.pvr',\n\t\t\t'./resources/compressed/flare_4bpp_rgba.pvr',\n\t\t\t'./resources/compressed/flare_2bpp_rgba.pvr',\n\t\t\t'./resources/compressed/park3_cube_nomip_4bpp_rgb.pvr',\n\t\t\t'./resources/compressed/park3_cube_mip_2bpp_rgb_v3.pvr'\n\t\t];\n\n\t\tconst meshes = [];\n\n\t\tconst boxGeometry = new t3d.BoxGeometry(2, 2, 2);\n\t\tconst sphereGeometry = new t3d.SphereGeometry(1.5, 32, 32);\n\n\t\tconst promises = mapUrls.map(url => loader.loadAsync(url));\n\n\t\tPromise.all(promises).then(textures => {\n\t\t\ttextures.forEach((texture, index) => {\n\t\t\t\tconst isCube = index >= 6;\n\n\t\t\t\ttexture.anisotropy = isCube ? 1 : 4;\n\n\t\t\t\tconst material = new t3d.BasicMaterial();\n\t\t\t\tmaterial.transparent = !isCube;\n\t\t\t\tmaterial.side = t3d.DRAW_SIDE.DOUBLE;\n\t\t\t\tmaterial[isCube ? 'envMap' : 'diffuseMap'] = texture;\n\n\t\t\t\tconst geometry = isCube ? sphereGeometry : boxGeometry;\n\n\t\t\t\tconst mesh = new t3d.Mesh(geometry, material);\n\t\t\t\tmesh.position.set(-8 + Math.floor(index / 2) * 5, index % 2 === 0 ? 3 : -3, 0);\n\n\t\t\t\tscene.add(mesh);\n\t\t\t\tmeshes.push(mesh);\n\t\t\t});\n\t\t});\n\n\t\tfunction loop(count) {\n\t\t\trequestAnimationFrame(loop);\n\n\t\t\tfor (let i = 0; i < meshes.length; i++) {\n\t\t\t\tconst mesh = meshes[i];\n\t\t\t\tmesh.euler.x = -count / 1000;\n\t\t\t\tmesh.euler.y = -count / 1000;\n\t\t\t}\n\n\t\t\tforwardRenderer.render(scene, camera);\n\t\t}\n\n\t\trequestAnimationFrame(loop);\n\n\t\tfunction onWindowResize() {\n\t\t\twidth = window.innerWidth || 2;\n\t\t\theight = window.innerHeight || 2;\n\n\t\t\tcamera.setPerspective(60 / 180 * Math.PI, width / height, 1, 1000);\n\n\t\t\tforwardRenderer.screenRenderTarget.resize(width, height);\n\t\t}\n\t\twindow.addEventListener('resize', onWindowResize, false);\n\t</script>\n</body>\n\n</html>"
  },
  {
    "path": "examples/texture_loader_env.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>t3d - env loader</title>\n\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n\t<link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n</head>\n<body>\n    <div id=\"info\">\n        <a href=\"\" target=\"_blank\">t3d</a> - env cube texture loader<br/>\n\t\tIBL map is generated by <a href=\"https://github.com/uinosoft/t3d-ibl-baker\" target=\"_blank\">t3d-ibl-baker</a>\n    </div>\n\n\t<!-- Import maps polyfill -->\n    <!-- Remove this when import maps will be widely supported -->\n    <script async src=\"./libs/es-module-shims.js\"></script>\n\n    <script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n    <script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { ForwardRenderer } from 't3d/addons/render/ForwardRenderer.js';\n\t\timport { OrbitControls } from 't3d/addons/controls/OrbitControls.js';\n\t\timport { EnvTextureCubeLoader } from 't3d/addons/loaders/EnvLoader.js';\n\t\timport { SkyBox } from 't3d/addons/objects/SkyBox.js';\n\t\timport { GUI } from './libs/lil-gui.esm.min.js';\n\n\t\tlet width = window.innerWidth || 2;\n\t\tlet height = window.innerHeight || 2;\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = width;\n\t\tcanvas.height = height;\n\t\tdocument.body.appendChild(canvas);\n\n\t\tconst forwardRenderer = new ForwardRenderer(canvas);\n\n\t\tconst scene = new t3d.Scene();\n\n\t\tconst camera = new t3d.Camera();\n\t\tcamera.outputEncoding = t3d.TEXEL_ENCODING_TYPE.SRGB;\n\t\tcamera.position.set(0, 0, 130);\n\t\tcamera.setPerspective(70 / 180 * Math.PI, width / height, 1, 10000);\n\t\tscene.add(camera);\n\n\t\tconst controller = new OrbitControls(camera, canvas);\n\n\t\tconst stepSize = 1.0 / 6;\n\t\tconst colors = [[1, 1, 1], [0.6, 0.44, 0.01]];\n\t\tconst sphereGeometry = new t3d.SphereGeometry(5, 32, 16);\n\t\tfor (let colorIndex = 0; colorIndex < 2; colorIndex += 1) {\n\t\t\tfor (let metalness = 0; metalness <= 1.0; metalness += stepSize) {\n\t\t\t\tfor (let roughness = 0; roughness <= 1.0; roughness += stepSize) {\n\t\t\t\t\tconst material = new t3d.PBRMaterial();\n\t\t\t\t\tmaterial.diffuse.fromArray(colors[colorIndex]);\n\t\t\t\t\tmaterial.metalness = metalness;\n\t\t\t\t\tmaterial.roughness = roughness;\n\n\t\t\t\t\tconst sphere = new t3d.Mesh(sphereGeometry, material);\n\t\t\t\t\tsphere.position.x = roughness * 100 - 50;\n\t\t\t\t\tsphere.position.y = metalness * 100 - 50;\n\t\t\t\t\tsphere.position.z = -colorIndex * 15;\n\t\t\n\t\t\t\t\tscene.add(sphere);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst directionalLight = new t3d.DirectionalLight(0xffffff, 0.5);\n\t\tdirectionalLight.position.set(-30, 30, 30);\n\t\tdirectionalLight.lookAt(new t3d.Vector3(), new t3d.Vector3(0, 1, 0));\n\t\tscene.add(directionalLight);\n\n\t\tconst envTextureLoader = new EnvTextureCubeLoader();\n\t\tenvTextureLoader.setRenderer(forwardRenderer);\n\t\tenvTextureLoader.loadAsync('./resources/hdr/Grand_Canyon_C.env').then(cubeTexture => {\n\t\t\tconsole.info(cubeTexture.userData);\n\n\t\t\tscene.environment = cubeTexture;\n\n\t\t\tconst skyBox = new SkyBox(cubeTexture);\n\t\t\tskyBox.gamma = true;\n\t\t\tscene.add(skyBox);\n\n\t\t\tconst gui = new GUI();\n\t\t\tgui.add(skyBox, 'level', 0, 8, 0.1).name('Sky Roughness');\n\t\t\tgui.add(scene, 'envDiffuseIntensity', 0, 1, 0.1).name('Env Diffuse');\n\t\t\tgui.add(scene, 'envSpecularIntensity', 0, 1, 0.1).name('Env Specular');\n\t\t});\n\n\t\tfunction loop(count) {\n\t\t\trequestAnimationFrame(loop);\n\n\t\t\tcontroller.update();\n\n\t\t\tforwardRenderer.render(scene, camera);\n\t\t}\n\t\trequestAnimationFrame(loop);\n\n\t\tfunction onWindowResize() {\n\t\t\twidth = window.innerWidth || 2;\n\t\t\theight = window.innerHeight || 2;\n\n\t\t\tcamera.setPerspective(70 / 180 * Math.PI, width / height, 1, 10000);\n\n\t\t\tforwardRenderer.screenRenderTarget.resize(width, height);\n\t\t}\n\t\twindow.addEventListener('resize', onWindowResize, false);\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "examples/texture_loader_exr.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>t3d - exr loader</title>\n\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n\t<link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n</head>\n<body>\n    <div id=\"info\">\n        <a href=\"\" target=\"_blank\">t3d</a> - exr texture loader example<br/>\n\t\tImage courtesy of <a href=\"http://www.pauldebevec.com/Research/HDR/\" target=\"_blank\" rel=\"noopener\">Paul Debevec</a>.\n    </div>\n\n\t<!-- Import maps polyfill -->\n    <!-- Remove this when import maps will be widely supported -->\n    <script async src=\"./libs/es-module-shims.js\"></script>\n\n    <script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n    <script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { EXRTexture2DLoader } from 't3d/addons/loaders/EXRLoader.js';\n\t\timport { OutputShader } from 't3d/addons/shaders/OutputShader.js';\n\t\timport { GUI } from './libs/lil-gui.esm.min.js';\n\t\timport * as fflate from './libs/fflate.module.js';\n\n\t\tlet width = window.innerWidth || 2;\n\t\tlet height = window.innerHeight || 2;\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = width;\n\t\tcanvas.height = height;\n\t\tdocument.body.appendChild(canvas);\n\n\t\tconst screenRenderTarget = new t3d.ScreenRenderTarget(canvas);\n\n\t\tconst contextParams = { antialias: false, alpha: false };\n\t\tconst gl = canvas.getContext('webgl2', contextParams) || canvas.getContext('webgl', contextParams);\n\t\tconst renderer = new t3d.WebGLRenderer(gl);\n\n\t\tconst outputPass = new t3d.ShaderPostPass(OutputShader);\n\t\toutputPass.material.defines.SRGB_COLOR_SPACE = true;\n\t\toutputPass.material.defines.REINHARD_TONE_MAPPING = true;\n\n\t\tconst renderTarget = t3d.OffscreenRenderTarget.create2D(width, height);\n\t\trenderTarget.texture.type = t3d.PIXEL_TYPE.HALF_FLOAT;\n\t\trenderTarget.texture.minFilter = t3d.TEXTURE_FILTER.LINEAR;\n\t\trenderTarget.texture.generateMipmaps = false;\n\t\trenderTarget.setColorClearValue(0, 0, 0, 1);\n\n\t\tconst scene = new t3d.Scene();\n\n\t\tlet aspect = width / height;\n\t\t\n\t\tconst camera = new t3d.Camera();\n\t\tcamera.setOrtho(-aspect, aspect, -1, 1, 0, 1);\n\t\tscene.add(camera);\n\t\t\n\t\tEXRTexture2DLoader.setfflate(fflate);\n\t\tconst loader = new EXRTexture2DLoader();\n\t\t\n\t\tconst capabilities = renderer.capabilities;\n\t\tif ((capabilities.version > 1 || !!capabilities.getExtension('OES_texture_float')) &&\n\t\t\t!!capabilities.getExtension('OES_texture_float_linear')) {\n\t\t\tloader.type = t3d.PIXEL_TYPE.FLOAT;\n\t\t}\n\n\t\tif (capabilities.version > 1) {\n\t\t\tcapabilities.getExtension('EXT_color_buffer_float');\n\t\t} else {\n\t\t\tcapabilities.getExtension('OES_texture_half_float');\n\t\t\tcapabilities.getExtension('OES_texture_half_float_linear');\n\t\t}\n\n\t\tcapabilities.getExtension('OES_texture_float_linear');\n\t\tcapabilities.getExtension('EXT_color_buffer_half_float');\n\n\t\tloader.load('./resources/hdr/memorial.exr', function(texture) {\n\t\t\tconst plane_geometry = new t3d.PlaneGeometry(texture.image.width / texture.image.height * 1.5, 1.5);\n\t\t\tconst plane_material = new t3d.BasicMaterial();\n\t\t\tplane_material.diffuseMap = texture;\n\t\t\tconst mesh = new t3d.Mesh(plane_geometry, plane_material);\n\t\t\tmesh.euler.x = Math.PI / 2;\n\n\t\t\tscene.add(mesh);\n\t\t});\n\n\t\tconst gui = new GUI();\n\t\tgui.add(outputPass.uniforms, 'toneMappingExposure', 0, 4, 0.01);\n\n\t\tfunction loop(count) {\n\t\t\trequestAnimationFrame(loop);\n\n\t\t\tscene.updateMatrix();\n\t\t\tscene.updateRenderStates(camera);\n\t\t\tscene.updateRenderQueue(camera);\n\n\t\t\trenderer.renderScene(scene, camera, renderTarget);\n\n\t\t\toutputPass.uniforms.tDiffuse = renderTarget.texture;\n\t\t\toutputPass.render(renderer, screenRenderTarget);\n\t\t}\n\t\trequestAnimationFrame(loop);\n\n\t\tfunction onWindowResize() {\n\t\t\twidth = window.innerWidth || 2;\n\t\t\theight = window.innerHeight || 2;\n\n\t\t\taspect = width / height;\n\n\t\t\tcamera.setOrtho(-aspect, aspect, -1, 1, 0, 1);\n\n\t\t\tscreenRenderTarget.resize(width, height);\n\t\t\trenderTarget.resize(width, height);\n\t\t}\n\t\twindow.addEventListener('resize', onWindowResize, false);\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "examples/texture_loader_hdr.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>t3d - hdr loader</title>\n\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n\t<link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n</head>\n<body>\n    <div id=\"info\">\n        <a href=\"\" target=\"_blank\">t3d</a> - hdr texture loader example<br/>\n\t\tImage courtesy of <a href=\"http://www.pauldebevec.com/Research/HDR/\" target=\"_blank\" rel=\"noopener\">Paul Debevec</a>.\n    </div>\n\n\t<!-- Import maps polyfill -->\n    <!-- Remove this when import maps will be widely supported -->\n    <script async src=\"./libs/es-module-shims.js\"></script>\n\n    <script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n    <script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { RGBETexture2DLoader } from 't3d/addons/loaders/RGBELoader.js';\n\t\timport { OutputShader } from 't3d/addons/shaders/OutputShader.js';\n\t\timport { GUI } from './libs/lil-gui.esm.min.js';\n\n\t\tlet width = window.innerWidth || 2;\n\t\tlet height = window.innerHeight || 2;\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = width;\n\t\tcanvas.height = height;\n\t\tdocument.body.appendChild(canvas);\n\n\t\tconst screenRenderTarget = new t3d.ScreenRenderTarget(canvas);\n\n\t\tconst contextParams = { antialias: false, alpha: false };\n\t\tconst gl = canvas.getContext('webgl2', contextParams) || canvas.getContext('webgl', contextParams);\n\t\tconst renderer = new t3d.WebGLRenderer(gl);\n\n\t\tconst outputPass = new t3d.ShaderPostPass(OutputShader);\n\t\toutputPass.material.defines.SRGB_COLOR_SPACE = true;\n\t\toutputPass.material.defines.REINHARD_TONE_MAPPING = true;\n\n\t\tconst renderTarget = t3d.OffscreenRenderTarget.create2D(width, height);\n\t\trenderTarget.texture.type = t3d.PIXEL_TYPE.HALF_FLOAT;\n\t\trenderTarget.texture.minFilter = t3d.TEXTURE_FILTER.LINEAR;\n\t\trenderTarget.texture.generateMipmaps = false;\n\t\trenderTarget.setColorClearValue(0, 0, 0, 1);\n\n\t\tconst scene = new t3d.Scene();\n\n\t\tlet aspect = width / height;\n\t\t\n\t\tconst camera = new t3d.Camera();\n\t\tcamera.setOrtho(-aspect, aspect, -1, 1, 0, 1);\n\t\tscene.add(camera);\n\t\t\n\t\tconst loader = new RGBETexture2DLoader();\n\t\tconst capabilities = renderer.capabilities;\n\t\tif ((capabilities.version > 1 || !!capabilities.getExtension('OES_texture_float')) &&\n\t\t\t!!capabilities.getExtension('OES_texture_float_linear')) {\n\t\t\tloader.type = t3d.PIXEL_TYPE.FLOAT;\n\t\t}\n\n\t\tif (capabilities.version > 1) {\n\t\t\tcapabilities.getExtension('EXT_color_buffer_float');\n\t\t} else {\n\t\t\tcapabilities.getExtension('OES_texture_half_float');\n\t\t\tcapabilities.getExtension('OES_texture_half_float_linear');\n\t\t}\n\n\t\tcapabilities.getExtension('OES_texture_float_linear');\n\t\tcapabilities.getExtension('EXT_color_buffer_half_float');\n\n\t\tloader.load('./resources/hdr/memorial.hdr', function(texture) {\n\t\t\tconst plane_geometry = new t3d.PlaneGeometry(texture.image.width / texture.image.height * 1.5, 1.5);\n\t\t\tconst plane_material = new t3d.BasicMaterial();\n\t\t\tplane_material.diffuseMap = texture;\n\t\t\n\t\t\tconst mesh = new t3d.Mesh(plane_geometry, plane_material);\n\t\t\tmesh.euler.x = Math.PI / 2;\n\n\t\t\tscene.add(mesh);\n\t\t});\n\n\t\tconst gui = new GUI();\n\t\tgui.add(outputPass.uniforms, 'toneMappingExposure', 0, 4, 0.01);\n\n\t\tfunction loop(count) {\n\t\t\trequestAnimationFrame(loop);\n\n\t\t\tscene.updateMatrix();\n\t\t\tscene.updateRenderStates(camera);\n\t\t\tscene.updateRenderQueue(camera);\n\n\t\t\trenderer.renderScene(scene, camera, renderTarget);\n\n\t\t\toutputPass.uniforms.tDiffuse = renderTarget.texture;\n\t\t\toutputPass.render(renderer, screenRenderTarget);\n\t\t}\n\t\trequestAnimationFrame(loop);\n\n\t\tfunction onWindowResize() {\n\t\t\twidth = window.innerWidth || 2;\n\t\t\theight = window.innerHeight || 2;\n\n\t\t\taspect = width / height;\n\n\t\t\tcamera.setOrtho(-aspect, aspect, -1, 1, 0, 1);\n\n\t\t\tscreenRenderTarget.resize(width, height);\n\t\t\trenderTarget.resize(width, height);\n\t\t}\n\t\twindow.addEventListener('resize', onWindowResize, false);\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "examples/texture_loader_hdr_cube.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>t3d - hdr loader</title>\n\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n\t<link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n</head>\n<body>\n    <div id=\"info\">\n        <a href=\"\" target=\"_blank\">t3d</a> - hdr loader for cube\n    </div>\n\n\t<!-- Import maps polyfill -->\n    <!-- Remove this when import maps will be widely supported -->\n    <script async src=\"./libs/es-module-shims.js\"></script>\n\n    <script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n    <script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { SkyBox } from 't3d/addons/objects/SkyBox.js';\n\t\timport { RGBETextureCubeLoader } from 't3d/addons/loaders/RGBELoader.js';\n\t\timport { PMREMGenerator } from 't3d/addons/textures/PMREMGenerator.js';\n\t\timport { OrbitControls } from 't3d/addons/controls/OrbitControls.js';\n\t\timport { ForwardRenderer } from 't3d/addons/render/ForwardRenderer.js';\n\t\timport { GUI } from './libs/lil-gui.esm.min.js';\n\n\t\tlet width = window.innerWidth || 2;\n\t\tlet height = window.innerHeight || 2;\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = width;\n\t\tcanvas.height = height;\n\t\tdocument.body.appendChild(canvas);\n\n\t\tconst forwardRenderer = new ForwardRenderer(canvas);\n\n\t\tconst scene = new t3d.Scene();\n\n\t\tconst loader = new RGBETextureCubeLoader();\n\n\t\tconst capabilities = forwardRenderer.capabilities;\n\t\tif ((capabilities.version > 1 || !!capabilities.getExtension('OES_texture_float')) &&\n\t\t\t!!capabilities.getExtension('OES_texture_float_linear')) {\n\t\t\tloader.type = t3d.PIXEL_TYPE.FLOAT;\n\t\t}\n\n\t\tconst imageUrls = [\n\t\t\t'./resources/hdr/pisaHDR/px.hdr',\n\t\t\t'./resources/hdr/pisaHDR/nx.hdr',\n\t\t\t'./resources/hdr/pisaHDR/py.hdr',\n\t\t\t'./resources/hdr/pisaHDR/ny.hdr',\n\t\t\t'./resources/hdr/pisaHDR/pz.hdr',\n\t\t\t'./resources/hdr/pisaHDR/nz.hdr'\n\t\t];\n\n\t\tloader.loadAsync(imageUrls).then(texture => {\n\t\t\ttexture = (new PMREMGenerator()).prefilter(forwardRenderer, texture);\n\t\t\n\t\t\tconst skyBox = new SkyBox(texture);\n\t\t\tskyBox.gamma = true;\n\t\t\tscene.add(skyBox);\n\n\t\t\tconst stepSize = 1.0 / 6;\n\t\t\tconst colors = [[1, 1, 1], [0.6, 0.44, 0.01]];\n\t\t\tconst sphere_geometry = new t3d.SphereGeometry(5, 32, 16);\n\t\t\tfor (let colorIndex = 0; colorIndex < 2; colorIndex += 1) {\n\t\t\t\tfor (let metalness = 0; metalness <= 1.0; metalness += stepSize) {\n\t\t\t\t\tfor (let roughness = 0; roughness <= 1.0; roughness += stepSize) {\n\t\t\t\t\t\tconst pbr_mat = new t3d.PBRMaterial();\n\t\t\t\t\t\tpbr_mat.diffuse.fromArray(colors[colorIndex]);\n\t\t\t\t\t\tpbr_mat.metalness = metalness;\n\t\t\t\t\t\tpbr_mat.roughness = roughness;\n\t\t\t\t\t\tpbr_mat.envMap = texture;\n\n\t\t\t\t\t\tconst sphere = new t3d.Mesh(sphere_geometry, pbr_mat);\n\t\t\t\t\t\tsphere.position.x = roughness * 100 - 50;\n\t\t\t\t\t\tsphere.position.y = metalness * 100 - 50;\n\t\t\t\t\t\tsphere.position.z = -colorIndex * 15;\n\t\t\t\t\t\tscene.add(sphere);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst gui = new GUI();\n\t\t\tgui.add(skyBox, 'level', 0, 8, 1);\n\t\t\tgui.add(camera, 'gammaFactor', 0, 3, 0.01);\n\t\t});\n\n\t\tconst ambientLight = new t3d.AmbientLight(0xffffff, 0.1);\n\t\tscene.add(ambientLight);\n\n\t\tconst directionalLight = new t3d.DirectionalLight(0xffffff, 0.1);\n\t\tdirectionalLight.position.set(-30, 30, 30);\n\t\tdirectionalLight.lookAt(new t3d.Vector3(), new t3d.Vector3(0, 1, 0));\n\t\tscene.add(directionalLight);\n\n\t\tconst camera = new t3d.Camera();\n\t\tcamera.position.set(0, 0, 150);\n\t\tcamera.outputEncoding = t3d.TEXEL_ENCODING_TYPE.GAMMA;\n\t\tcamera.setPerspective(60 / 180 * Math.PI, width / height, 1, 1000);\n\t\tscene.add(camera);\n\n\t\tconst controller = new OrbitControls(camera, canvas);\n\n\t\tfunction loop(count) {\n\t\t\trequestAnimationFrame(loop);\n\n\t\t\tcontroller.update();\n\n\t\t\tforwardRenderer.render(scene, camera);\n\t\t}\n\t\trequestAnimationFrame(loop);\n\n\t\tfunction onWindowResize() {\n\t\t\twidth = window.innerWidth || 2;\n\t\t\theight = window.innerHeight || 2;\n\n\t\t\tcamera.setPerspective(60 / 180 * Math.PI, width / height, 1, 1000);\n\n\t\t\tforwardRenderer.screenRenderTarget.resize(width, height);\n\t\t}\n\t\twindow.addEventListener('resize', onWindowResize, false);\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "examples/texture_loader_hdr_panorama.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>t3d - hdr loader</title>\n\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n\t<link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n</head>\n<body>\n    <div id=\"info\">\n        <a href=\"\" target=\"_blank\">t3d</a> - hdr loader for panorama\n    </div>\n\n\t<!-- Import maps polyfill -->\n    <!-- Remove this when import maps will be widely supported -->\n    <script async src=\"./libs/es-module-shims.js\"></script>\n\n    <script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n    <script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { SkyBox } from 't3d/addons/objects/SkyBox.js';\n\t\timport { RGBETexture2DLoader } from 't3d/addons/loaders/RGBELoader.js';\n\t\timport { PMREMGenerator } from 't3d/addons/textures/PMREMGenerator.js';\n\t\timport { OrbitControls } from 't3d/addons/controls/OrbitControls.js';\n\t\timport { ForwardRenderer } from 't3d/addons/render/ForwardRenderer.js';\n\t\timport { GUI } from './libs/lil-gui.esm.min.js';\n\n\t\tlet width = window.innerWidth || 2;\n\t\tlet height = window.innerHeight || 2;\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = width;\n\t\tcanvas.height = height;\n\t\tdocument.body.appendChild(canvas);\n\n\t\tconst forwardRenderer = new ForwardRenderer(canvas);\n\n\t\tconst scene = new t3d.Scene();\n\n\t\tconst loader = new RGBETexture2DLoader();\n\n\t\tconst capabilities = forwardRenderer.capabilities;\n\t\tif ((capabilities.version > 1 || !!capabilities.getExtension('OES_texture_float')) &&\n\t\t\t!!capabilities.getExtension('OES_texture_float_linear')) {\n\t\t\tloader.type = t3d.PIXEL_TYPE.FLOAT;\n\t\t}\n\n\t\tloader.load('resources/hdr/pisa.hdr', function(texture) {\n\t\t\ttexture = (new PMREMGenerator()).prefilter(forwardRenderer, texture);\n\t\t\n\t\t\tconst skyBox = new SkyBox(texture);\n\t\t\tskyBox.gamma = true;\n\t\t\tscene.add(skyBox);\n\n\t\t\tconst stepSize = 1.0 / 6;\n\t\t\tconst colors = [[1, 1, 1], [0.6, 0.44, 0.01]];\n\t\t\tconst sphere_geometry = new t3d.SphereGeometry(5, 32, 16);\n\t\t\tfor (let colorIndex = 0; colorIndex < 2; colorIndex += 1) {\n\t\t\t\tfor (let metalness = 0; metalness <= 1.0; metalness += stepSize) {\n\t\t\t\t\tfor (let roughness = 0; roughness <= 1.0; roughness += stepSize) {\n\t\t\t\t\t\tconst pbr_mat = new t3d.PBRMaterial();\n\t\t\t\t\t\tpbr_mat.diffuse.fromArray(colors[colorIndex]);\n\t\t\t\t\t\tpbr_mat.metalness = metalness;\n\t\t\t\t\t\tpbr_mat.roughness = roughness;\n\t\t\t\t\t\tpbr_mat.envMap = texture;\n\n\t\t\t\t\t\tconst sphere = new t3d.Mesh(sphere_geometry, pbr_mat);\n\t\t\t\t\t\tsphere.position.x = roughness * 100 - 50;\n\t\t\t\t\t\tsphere.position.y = metalness * 100 - 50;\n\t\t\t\t\t\tsphere.position.z = -colorIndex * 15;\n\t\t\t\t\t\tscene.add(sphere);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst gui = new GUI();\n\t\t\tgui.add(skyBox, 'level', 0, 8, 1);\n\t\t\tgui.add(camera, 'gammaFactor', 0, 3, 0.01);\n\t\t});\n\n\t\tconst ambientLight = new t3d.AmbientLight(0xffffff, 0.1);\n\t\tscene.add(ambientLight);\n\n\t\tconst directionalLight = new t3d.DirectionalLight(0xffffff, 0.1);\n\t\tdirectionalLight.position.set(-30, 30, 30);\n\t\tdirectionalLight.lookAt(new t3d.Vector3(), new t3d.Vector3(0, 1, 0));\n\t\tscene.add(directionalLight);\n\n\t\tconst camera = new t3d.Camera();\n\t\tcamera.position.set(0, 0, 150);\n\t\tcamera.outputEncoding = t3d.TEXEL_ENCODING_TYPE.GAMMA;\n\t\tcamera.setPerspective(60 / 180 * Math.PI, width / height, 1, 1000);\n\t\tscene.add(camera);\n\n\t\tconst controller = new OrbitControls(camera, canvas);\n\n\t\tfunction loop(count) {\n\t\t\trequestAnimationFrame(loop);\n\n\t\t\tcontroller.update();\n\n\t\t\tforwardRenderer.render(scene, camera);\n\t\t}\n\t\trequestAnimationFrame(loop);\n\n\t\tfunction onWindowResize() {\n\t\t\twidth = window.innerWidth || 2;\n\t\t\theight = window.innerHeight || 2;\n\n\t\t\tcamera.setPerspective(60 / 180 * Math.PI, width / height, 1, 1000);\n\n\t\t\tforwardRenderer.screenRenderTarget.resize(width, height);\n\t\t}\n\t\twindow.addEventListener('resize', onWindowResize, false);\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "examples/texture_loader_imagebitmap.html",
    "content": "<!DOCTYPE html>\n<html>\n\n<head>\n    <meta charset=\"utf-8\">\n    <title>t3d - image bitmap loader</title>\n    <meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n    <link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n</head>\n\n<body>\n    <div id=\"info\">\n        <a href=\"\" target=\"_blank\">t3d</a> - image bitmap loader\n    </div>\n\n    <!-- Import maps polyfill -->\n    <!-- Remove this when import maps will be widely supported -->\n    <script async src=\"./libs/es-module-shims.js\"></script>\n\n    <script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n    <script type=\"module\">\n        import * as t3d from 't3d';\n        import { ForwardRenderer } from 't3d/addons/render/ForwardRenderer.js';\n        import { ImageBitmapLoader } from 't3d/addons/loaders/ImageBitmapLoader.js';\n\n        let width = window.innerWidth || 2;\n        let height = window.innerHeight || 2;\n\n        const canvas = document.createElement('canvas');\n        canvas.width = width;\n        canvas.height = height;\n        document.body.appendChild(canvas);\n\n        const forwardRenderer = new ForwardRenderer(canvas);\n\n        const scene = new t3d.Scene();\n\n        const camera = new t3d.Camera();\n        camera.position.set(0, 0, 8);\n        camera.lookAt(new t3d.Vector3(0, 0, 0), new t3d.Vector3(0, 1, 0));\n        camera.setPerspective(45 / 180 * Math.PI, width / height, 1, 1000);\n        scene.add(camera);\n\n        const cubes = [];\n\n        const geometry = new t3d.BoxGeometry(1.2, 1.2, 1.2);\n\n        function addImageBitMapTextureCube(url, options, position) {\n        \tnew ImageBitmapLoader().\n        \t\tsetOptions(options).\n        \t\tload(url,\n        \t\t\timageBitmap => {\n        \t\t\t\tconst texture = new t3d.Texture2D();\n        \t\t\t\ttexture.image = imageBitmap;\n        \t\t\t\ttexture.version++;\n\n        \t\t\t\tconst material = new t3d.BasicMaterial();\n        \t\t\t\tmaterial.diffuseMap = texture;\n\n        \t\t\t\tif (url.indexOf('png') > -1) {\n        \t\t\t\t\tmaterial.transparent = true;\n        \t\t\t\t\tmaterial.side = t3d.DRAW_SIDE.DOUBLE;\n        \t\t\t\t\tmaterial.depthWrite = false;\n        \t\t\t\t}\n\n        \t\t\t\tconst cube = new t3d.Mesh(geometry, material);\n        \t\t\t\tcube.position.fromArray(position);\n        \t\t\t\tscene.add(cube);\n        \t\t\t\tcubes.push(cube);\n        \t\t\t},\n        \t\t\tp => {\n        \t\t\t\tconsole.log(p);\n        \t\t\t},\n        \t\t\te => {\n        \t\t\t\tconsole.error(e);\n        \t\t\t}\n        \t\t);\n        }\n\n        addImageBitMapTextureCube('./resources/logo.jpg', { imageOrientation: 'none' }, [-1, 1, 0]);\n        addImageBitMapTextureCube('./resources/logo.jpg', { imageOrientation: 'flipY' }, [-1, -1, 0]);\n        addImageBitMapTextureCube('./resources/sprites/circle.png', { premultiplyAlpha: 'premultiply' }, [1, 1, 0]);\n        addImageBitMapTextureCube('./resources/sprites/circle.png', { premultiplyAlpha: 'none' }, [1, -1, 0]);\n\n        function loop(count) {\n        \trequestAnimationFrame(loop);\n\n        \tfor (let i = 0; i < cubes.length; i++) {\n        \t\tconst cube = cubes[i];\n        \t\tcube.euler.y = -count / 1000;\n        \t}\n\n        \tforwardRenderer.render(scene, camera);\n        }\n        requestAnimationFrame(loop);\n\n        function onWindowResize() {\n        \twidth = window.innerWidth || 2;\n        \theight = window.innerHeight || 2;\n\n        \tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 1000);\n\n        \tforwardRenderer.screenRenderTarget.resize(width, height);\n        }\n        window.addEventListener('resize', onWindowResize, false);\n    </script>\n</body>\n\n</html>"
  },
  {
    "path": "examples/texture_loader_ktx2.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>t3d - ktx2 loader</title>\n\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n\t<link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n</head>\n<body>\n    <div id=\"info\">\n        <a href=\"\" target=\"_blank\">t3d</a> - ktx2 texture loader\n    </div>\n\n\t<!-- Import maps polyfill -->\n    <!-- Remove this when import maps will be widely supported -->\n    <script async src=\"./libs/es-module-shims.js\"></script>\n\n    <script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n    <script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { ForwardRenderer } from 't3d/addons/render/ForwardRenderer.js';\n\t\timport { OrbitControls } from 't3d/addons/controls/OrbitControls.js';\n\t\timport { KTX2TextureLoader } from 't3d/addons/loaders/KTX2Loader.js';\n\t\timport * as KTXParse from './libs/ktx-parse.module.js';\n\t\timport { ZSTDDecoder } from './libs/zstddec.module.js';\n\t\timport { GUI } from './libs/lil-gui.esm.min.js';\n\n\t\tlet width = window.innerWidth || 2;\n\t\tlet height = window.innerHeight || 2;\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = width;\n\t\tcanvas.height = height;\n\t\tdocument.body.appendChild(canvas);\n\n\t\tconst forwardRenderer = new ForwardRenderer(canvas);\n\t\tforwardRenderer.screenRenderTarget.setColorClearValue(0.13, 0.13, 0.13, 1);\n\n\t\tconst scene = new t3d.Scene();\n\t\t\n\t\tconst camera = new t3d.Camera();\n\t\tcamera.outputEncoding = t3d.TEXEL_ENCODING_TYPE.SRGB;\n\t\tcamera.position.set(0, 0, 2.5);\n\t\tcamera.lookAt(new t3d.Vector3(0, 0, 0), new t3d.Vector3(0, 1, 0));\n\t\tcamera.setPerspective(60 / 180 * Math.PI, width / height, 0.1, 100);\n\t\tscene.add(camera);\n\n\t\tconst controller = new OrbitControls(camera, canvas);\n\n\t\tconst geometry = flipY(new t3d.PlaneGeometry(1, 1));\n\t\tconst material = new t3d.BasicMaterial();\n\t\tconst mesh = new t3d.Mesh(geometry, material);\n\t\tmesh.euler.x = Math.PI / 2;\n\t\tscene.add(mesh);\n\n\t\tfunction flipY(geometry) {\n\t\t\tconst uvArray = geometry.attributes.a_Uv.buffer.array;\n\t\t\tfor (let i = 0; i < uvArray.length; i += 2) {\n\t\t\t\tuvArray[i + 1] = 1 - uvArray[i + 1];\n\t\t\t}\n\t\t\treturn geometry;\n\t\t}\n\n\t\tconst SROUCES = {\n\t\t\t'BasisU ETC1S': '2d_etc1s.ktx2',\n\t\t\t'BasisU UASTC': '2d_uastc.ktx2',\n\t\t\t'RGBA8 sRGB': '2d_rgba8.ktx2',\n\t\t\t'RGBA8 Linear': '2d_rgba8_linear.ktx2',\n\t\t\t// 'RGBA8 Display P3': '2d_rgba8_displayp3.ktx2',\n\t\t\t'RGBA16 Linear': '2d_rgba16_linear.ktx2',\n\t\t\t'RGBA32 Linear': '2d_rgba32_linear.ktx2'\n\t\t\t// 'ASTC 6x6 (mobile)': '2d_astc_6x6.ktx2'\n\t\t};\n\n\t\tconst params = { source: Object.values(SROUCES)[0] };\n\n\t\tconst capabilities = forwardRenderer.capabilities;\n\t\tconst isWebGL2 = capabilities.version > 1;\n\t\tif (!isWebGL2) {\n\t\t\tcapabilities.getExtension('OES_texture_half_float');\n\t\t\tcapabilities.getExtension('OES_texture_half_float_linear');\n\t\t}\n\t\tcapabilities.getExtension('OES_texture_float_linear');\n\n\t\tKTX2TextureLoader.setKTXParser(KTXParse).setZSTDDecoder(ZSTDDecoder);\n\t\tconst ktx2TextureLoader = new KTX2TextureLoader()\n\t\t\t.setTranscoderPath('./libs/basis/')\n\t\t\t.detectSupport(forwardRenderer);\n\n\t\tasync function loadTexture(path) {\n\t\t\tmaterial.diffuseMap = await ktx2TextureLoader\n\t\t\t\t.loadAsync(`./resources/compressed/${path}`);\n\t\t\tmaterial.needsUpdate = true;\n\t\t}\n\n\t\t(async function() {\n\t\t\tawait loadTexture(params.source);\n\n\t\t\tconst gui = new GUI();\n\t\t\tgui.add(params, 'source', SROUCES).onChange(loadTexture);\n\n\t\t\trequestAnimationFrame(loop);\n\t\t})();\n\n\t\tfunction loop(count) {\n\t\t\trequestAnimationFrame(loop);\n\n\t\t\tcontroller.update();\n\n\t\t\tforwardRenderer.render(scene, camera);\n\t\t}\n\t\t\n\t\tfunction onWindowResize() {\n\t\t\twidth = window.innerWidth || 2;\n\t\t\theight = window.innerHeight || 2;\n\n\t\t\tcamera.setPerspective(60 / 180 * Math.PI, width / height, 0.1, 100);\n\n\t\t\tforwardRenderer.screenRenderTarget.resize(width, height);\n\t\t}\n\t\twindow.addEventListener('resize', onWindowResize, false);\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "examples/texture_loader_tga.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>t3d - tga texture loader</title>\n\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n\t<link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n</head>\n<body>\n    <div id=\"info\">\n        <a href=\"\" target=\"_blank\">t3d</a> - tga texture loader\n    </div>\n\n\t<!-- Import maps polyfill -->\n    <!-- Remove this when import maps will be widely supported -->\n    <script async src=\"./libs/es-module-shims.js\"></script>\n\n    <script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n    <script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { SkyBox } from 't3d/addons/objects/SkyBox.js';\n\t\timport { TGATextureCubeLoader } from 't3d/addons/loaders/TGALoader.js';\n\t\timport { ForwardRenderer } from 't3d/addons/render/ForwardRenderer.js';\n\t\timport { GUI } from './libs/lil-gui.esm.min.js';\n\n\t\tlet width = window.innerWidth || 2;\n\t\tlet height = window.innerHeight || 2;\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = width;\n\t\tcanvas.height = height;\n\t\tdocument.body.appendChild(canvas);\n\n\t\tconst forwardRenderer = new ForwardRenderer(canvas);\n\n\t\tconst scene = new t3d.Scene();\n\n\t\tconst camera = new t3d.Camera();\n\t\tcamera.setPerspective(60 / 180 * Math.PI, width / height, 1, 1000);\n\t\tscene.add(camera);\n\n\t\tconst cubeTexturePath = './resources/skybox/mp_cloud9/';\n\t\tconst imageUrls = [\n\t\t\tcubeTexturePath + 'cloud9_rt.tga',\n\t\t\tcubeTexturePath + 'cloud9_lf.tga',\n\t\t\tcubeTexturePath + 'cloud9_up.tga',\n\t\t\tcubeTexturePath + 'cloud9_dn.tga',\n\t\t\tcubeTexturePath + 'cloud9_bk.tga',\n\t\t\tcubeTexturePath + 'cloud9_ft.tga'\n\t\t];\n\t\tconst tgaLoader = new TGATextureCubeLoader();\n\t\ttgaLoader.loadAsync(imageUrls).then(function(texture) {\n\t\t\tconst skyBox = new SkyBox(texture);\n\t\t\tscene.add(skyBox);\n\n\t\t\tconst gui = new GUI();\n\t\t\tgui.add(skyBox, 'level', 0, 8, 1);\n\t\t});\n\n\t\tfunction loop(count) {\n\t\t\trequestAnimationFrame(loop);\n\n\t\t\t// rotate camera\n\t\t\tcamera.euler.y = -count / 1000 * 0.2;\n\n\t\t\tforwardRenderer.render(scene, camera);\n\t\t}\n\t\trequestAnimationFrame(loop);\n\n\t\tfunction onWindowResize() {\n\t\t\twidth = window.innerWidth || 2;\n\t\t\theight = window.innerHeight || 2;\n\n\t\t\tcamera.setPerspective(60 / 180 * Math.PI, width / height, 1, 1000);\n\n\t\t\tforwardRenderer.screenRenderTarget.resize(width, height);\n\t\t}\n\t\twindow.addEventListener('resize', onWindowResize, false);\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "examples/texture_mipmap.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>t3d - mipmap</title>\n\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n\t<link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n</head>\n<body>\n    <div id=\"info\">\n        <a href=\"\" target=\"_blank\">t3d</a> - mipmap\n    </div>\n\n\t<!-- Import maps polyfill -->\n    <!-- Remove this when import maps will be widely supported -->\n    <script async src=\"./libs/es-module-shims.js\"></script>\n\n    <script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n    <script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { ForwardRenderer } from 't3d/addons/render/ForwardRenderer.js';\n\t\timport { Texture2DLoader } from 't3d/addons/loaders/Texture2DLoader.js';\n\t\timport { GUI } from './libs/lil-gui.esm.min.js';\n\n\t\tlet width = window.innerWidth || 2;\n\t\tlet height = window.innerHeight || 2;\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = width;\n\t\tcanvas.height = height;\n\t\tdocument.body.appendChild(canvas);\n\n\t\tconst forwardRenderer = new ForwardRenderer(canvas);\n\n\t\tconst scene = new t3d.Scene();\n\n\t\tconst texture = new Texture2DLoader().load('./resources/hardwood2_diffuse.jpg');\n\t\ttexture.encoding = t3d.TEXEL_ENCODING_TYPE.SRGB;\n\t\ttexture.anisotropy = forwardRenderer.capabilities.maxAnisotropy;\n\n\t\tconst cube_geometry = new t3d.BoxGeometry(8, 8, 8);\n\t\tconst material = new t3d.BasicMaterial();\n\t\tmaterial.diffuseMap = texture;\n\t\tconst cube = new t3d.Mesh(cube_geometry, material);\n\t\tscene.add(cube);\n\n\t\tconst camera = new t3d.Camera();\n\t\tcamera.outputEncoding = t3d.TEXEL_ENCODING_TYPE.SRGB;\n\t\tcamera.position.set(0, 10, 30);\n\t\tcamera.lookAt(new t3d.Vector3(0, 0, 0), new t3d.Vector3(0, 1, 0));\n\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 1000);\n\t\tscene.add(camera);\n\n\t\t// gui\n\t\tconst params = { minFilter: 'LINEAR' };\n\t\tconst gui = new GUI();\n\t\tgui.add(params, 'minFilter', ['LINEAR', 'NEAREST', 'LINEAR_MIPMAP_LINEAR', 'NEAREST_MIPMAP_NEAREST']).onChange(value => {\n\t\t\tswitch (value) {\n\t\t\t\tcase 'LINEAR':\n\t\t\t\t\ttexture.generateMipMaps = false;\n\t\t\t\t\ttexture.minFilter = t3d.TEXTURE_FILTER.LINEAR;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'NEAREST':\n\t\t\t\t\ttexture.generateMipMaps = false;\n\t\t\t\t\ttexture.minFilter = t3d.TEXTURE_FILTER.NEAREST;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'LINEAR_MIPMAP_LINEAR':\n\t\t\t\t\ttexture.generateMipMaps = true;\n\t\t\t\t\ttexture.minFilter = t3d.TEXTURE_FILTER.LINEAR_MIPMAP_LINEAR;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'NEAREST_MIPMAP_NEAREST':\n\t\t\t\t\ttexture.generateMipMaps = true;\n\t\t\t\t\ttexture.minFilter = t3d.TEXTURE_FILTER.NEAREST_MIPMAP_NEAREST;\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t\ttexture.version++;\n\t\t});\n\n\t\tfunction loop(count) {\n\t\t\trequestAnimationFrame(loop);\n\n\t\t\t// rotate camera\n\t\t\tcamera.position.x = 30 * Math.sin(count / 1000 * .5);\n\t\t\tcamera.position.z = 30 * Math.cos(count / 1000 * .5);\n\t\t\tcamera.lookAt(new t3d.Vector3(0, 0, 0), new t3d.Vector3(0, 1, 0));\n\n\t\t\tforwardRenderer.render(scene, camera);\n\t\t}\n\t\trequestAnimationFrame(loop);\n\n\t\tfunction onWindowResize() {\n\t\t\twidth = window.innerWidth || 2;\n\t\t\theight = window.innerHeight || 2;\n\n\t\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 1000);\n\n\t\t\tforwardRenderer.screenRenderTarget.resize(width, height);\n\t\t}\n\t\twindow.addEventListener('resize', onWindowResize, false);\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "examples/texture_video.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>t3d - video texture</title>\n\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n\t<link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n\t<style>\n\t\t#overlay {\n\t\t\tposition: absolute;\n\t\t\tfont-size: 16px;\n\t\t\tz-index: 2;\n\t\t\ttop: 0;\n\t\t\tleft: 0;\n\t\t\twidth: 100%;\n\t\t\theight: 100%;\n\t\t\tdisplay: flex;\n\t\t\talign-items: center;\n\t\t\tjustify-content: center;\n\t\t\tflex-direction: column;\n\t\t\tbackground: rgba(0,0,0,0.7);\n\t\t}\n\n\t\t#overlay button {\n\t\t\tbackground: transparent;\n\t\t\tborder: 0;\n\t\t\tborder: 1px solid rgb(255, 255, 255);\n\t\t\tborder-radius: 4px;\n\t\t\tcolor: #ffffff;\n\t\t\tpadding: 12px 18px;\n\t\t\ttext-transform: uppercase;\n\t\t\tcursor: pointer;\n\t\t}\n\t</style>\n</head>\n<body>\n    <div id=\"info\" class=\"dark\">\n        <a href=\"\" target=\"_blank\">t3d</a> - video texture\n\t\t<br/>\n\t\tplaying <a href=\"http://durian.blender.org/\" target=\"_blank\" rel=\"noopener\">sintel</a> trailer\n    </div>\n\n\t<div id=\"overlay\" style=\"display:none\">\n\t\t<button id=\"startButton\">Play</button>\n\t</div>\n\n\t<video id=\"video\" loop muted crossOrigin=\"anonymous\" playsinline style=\"display:none\">\n\t\t<source src=\"./resources/sintel.ogv\" type='video/ogg; codecs=\"theora, vorbis\"'>\n\t\t<source src=\"./resources/sintel.mp4\" type='video/mp4; codecs=\"avc1.42E01E, mp4a.40.2\"'>\n\t</video>\n\n\t<!-- Import maps polyfill -->\n    <!-- Remove this when import maps will be widely supported -->\n    <script async src=\"./libs/es-module-shims.js\"></script>\n\n    <script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n    <script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { OrbitControls } from 't3d/addons/controls/OrbitControls.js';\n\t\timport { ForwardRenderer } from 't3d/addons/render/ForwardRenderer.js';\n\n\t\tlet width = window.innerWidth || 2;\n\t\tlet height = window.innerHeight || 2;\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = width;\n\t\tcanvas.height = height;\n\t\tdocument.body.appendChild(canvas);\n\n\t\tconst forwardRenderer = new ForwardRenderer(canvas);\n\t\tforwardRenderer.screenRenderTarget.setColorClearValue(0.9, 0.9, 0.9, 1);\n\n\t\tconst scene = new t3d.Scene();\n\t\tscene.fog = new t3d.Fog(undefined, 180, 300);\n\t\tscene.fog.color.setRGB(0.9, 0.9, 0.9);\n\n\t\tconst texture = new t3d.Texture2D();\n\t\ttexture.magFilter = t3d.TEXTURE_FILTER.LINEAR;\n\t\ttexture.minFilter = t3d.TEXTURE_FILTER.LINEAR;\n\t\ttexture.generateMipmaps = false;\n\n\t\tlet updateVideoTexture = function() {};\n\n\t\tconst video = document.getElementById('video');\n\t\tconst overlay = document.getElementById('overlay');\n\t\tconst startButton = document.getElementById('startButton');\n\t\tconst promise = video.play();\n\n\t\tif (promise) {\n\t\t\tpromise.catch(error => {\n\t\t\t\toverlay.style.display = 'flex';\n\t\t\t\tstartButton.addEventListener('click', function() {\n\t\t\t\t\toverlay.style.display = 'none';\n\t\t\t\t\tvideo.play();\n\t\t\t\t\tvideoPlayCallback();\n\t\t\t\t});\n\t\t\t}).then(() => {\n\t\t\t\tvideoPlayCallback();\n\t\t\t});\n\t\t} else {\n\t\t\toverlay.style.display = 'flex';\n\t\t\tstartButton.addEventListener('click', function() {\n\t\t\t\toverlay.style.display = 'none';\n\t\t\t\tvideo.play();\n\t\t\t\tvideoPlayCallback();\n\t\t\t});\n\t\t}\n\n\t\tfunction videoPlayCallback() {\n\t\t\tvideo.addEventListener('play', function() {\n\t\t\t\tthis.currentTime = 3;\n\t\t\t});\n\n\t\t\tupdateVideoTexture = function() {\n\t\t\t\tif (video.readyState >= video.HAVE_CURRENT_DATA) {\n\t\t\t\t\tif (!texture.image) {\n\t\t\t\t\t\ttexture.image = video;\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttexture.version++;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\n\t\tconst plane_geometry = new t3d.PlaneGeometry(64, 36);\n\t\tconst plane_material = new t3d.BasicMaterial();\n\t\tplane_material.diffuseMap = texture;\n\t\tplane_material.side = t3d.DRAW_SIDE.DOUBLE;\n\t\tconst mesh = new t3d.Mesh(plane_geometry, plane_material);\n\t\tmesh.euler.x = Math.PI / 2;\n\t\tscene.add(mesh);\n\n\t\tconst ground_geometry = new t3d.PlaneGeometry(1000, 1000);\n\t\tconst ground_material = new t3d.BasicMaterial();\n\t\tground_material.diffuse.setHex(0xcccccc);\n\t\tconst ground = new t3d.Mesh(ground_geometry, ground_material);\n\t\tground.position.y -= 36 / 2;\n\t\tscene.add(ground);\n\n\t\tconst camera = new t3d.Camera();\n\t\tcamera.position.set(0, 0, 80);\n\t\tcamera.lookAt(new t3d.Vector3(0, 0, 0), new t3d.Vector3(0, 1, 0));\n\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 1000);\n\t\tscene.add(camera);\n\n\t\tconst controller = new OrbitControls(camera, canvas);\n\n\t\tfunction loop(count) {\n\t\t\trequestAnimationFrame(loop);\n\n\t\t\tupdateVideoTexture();\n\n\t\t\tcontroller.update();\n\n\t\t\tforwardRenderer.render(scene, camera);\n\t\t}\n\t\trequestAnimationFrame(loop);\n\n\t\tfunction onWindowResize() {\n\t\t\twidth = window.innerWidth || 2;\n\t\t\theight = window.innerHeight || 2;\n\n\t\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 1000);\n\n\t\t\tforwardRenderer.screenRenderTarget.resize(width, height);\n\t\t}\n\t\twindow.addEventListener('resize', onWindowResize, false);\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "examples/webgl_canvas_transparent.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>t3d - canvas transparent</title>\n\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n\t<link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n</head>\n<body>\n    <div id=\"info\">\n        <a href=\"\" target=\"_blank\">t3d</a> - canvas transparent\n    </div>\n\n\t<!-- Import maps polyfill -->\n    <!-- Remove this when import maps will be widely supported -->\n    <script async src=\"./libs/es-module-shims.js\"></script>\n\n    <script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n    <script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { ForwardRenderer } from 't3d/addons/render/ForwardRenderer.js';\n\n\t\tlet width = window.innerWidth || 2;\n\t\tlet height = window.innerHeight || 2;\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = width;\n\t\tcanvas.height = height;\n\t\tcanvas.style.backgroundColor = 'green';\n\t\tdocument.body.appendChild(canvas);\n\n\t\tconst forwardRenderer = new ForwardRenderer(canvas, { antialias: true, alpha: true });\n\t\tforwardRenderer.screenRenderTarget.setColorClearValue(0, 0, 0, 0);\n\n\t\tconst scene = new t3d.Scene();\n\n\t\tconst sphere_geometry = new t3d.SphereGeometry(10, 20, 20);\n\t\tconst phong = new t3d.PhongMaterial();\n\t\tphong.diffuse.setHex(0xffffff);\n\t\tphong.side = t3d.DRAW_SIDE.DOUBLE;\n\t\tconst sphere = new t3d.Mesh(sphere_geometry, phong);\n\t\tsphere.castShadow = true;\n\t\tscene.add(sphere);\n\n\t\tconst plane_geometry = new t3d.PlaneGeometry(100, 100);\n\t\tconst lambert = new t3d.LambertMaterial();\n\t\tlambert.diffuse.setHex(0xffffff);\n\t\tconst plane = new t3d.Mesh(plane_geometry, lambert);\n\t\tplane.position.y = -10;\n\t\tplane.receiveShadow = true;\n\t\tscene.add(plane);\n\n\t\tconst ambientLight = new t3d.AmbientLight(0xffffff, 0.3);\n\t\tscene.add(ambientLight);\n\n\t\tconst directionalLight = new t3d.DirectionalLight(0xffffff, 0.6);\n\t\tdirectionalLight.position.set(-40, 40, 0);\n\t\tdirectionalLight.lookAt(new t3d.Vector3(), new t3d.Vector3(0, 1, 0));\n\t\tdirectionalLight.shadow.windowSize = 100;\n\t\tdirectionalLight.castShadow = true;\n\t\tscene.add(directionalLight);\n\n\t\tconst camera = new t3d.Camera();\n\t\tcamera.position.set(0, 80, 100);\n\t\tcamera.lookAt(new t3d.Vector3(0, 0, 0), new t3d.Vector3(0, 1, 0));\n\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 1000);\n\t\tscene.add(camera);\n\n\t\tfunction loop(count) {\n\t\t\trequestAnimationFrame(loop);\n\n\t\t\t// rotate camera\n\t\t\tcamera.position.x = 100 * Math.sin(count / 1000 * .5);\n\t\t\tcamera.position.z = 100 * Math.cos(count / 1000 * .5);\n\t\t\tcamera.lookAt(new t3d.Vector3(0, 0, 0), new t3d.Vector3(0, 1, 0));\n\n\t\t\tforwardRenderer.render(scene, camera);\n\t\t}\n\t\trequestAnimationFrame(loop);\n\n\t\tfunction onWindowResize() {\n\t\t\twidth = window.innerWidth || 2;\n\t\t\theight = window.innerHeight || 2;\n\n\t\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 1000);\n\n\t\t\tforwardRenderer.screenRenderTarget.resize(width, height);\n\t\t}\n\t\twindow.addEventListener('resize', onWindowResize, false);\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "examples/webgl_clipculldistance.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>t3d - webgl clip cull distance</title>\n\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n\t<link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n</head>\n<body>\n    <div id=\"info\">\n        <a href=\"\" target=\"_blank\">t3d</a> - vertex shader clipping <br/>\n\t\tvia <a href=\"https://registry.khronos.org/webgl/extensions/WEBGL_clip_cull_distance/\" target=\"_blank\" rel=\"noopener\" >WEBGL_clip_cull_distance</a>\n\t\t<div id=\"notSupported\" style=\"display:none\">WEBGL_clip_cull_distance not supported</div>\n    </div>\n\n\t<!-- Import maps polyfill -->\n    <!-- Remove this when import maps will be widely supported -->\n    <script async src=\"./libs/es-module-shims.js\"></script>\n\n    <script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n    <script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { ForwardRenderer } from 't3d/addons/render/ForwardRenderer.js';\n\t\timport { OrbitControls } from 't3d/addons/controls/OrbitControls.js';\n\t\timport { GeometryUtils } from 't3d/addons/geometries/GeometryUtils.js';\n\t\timport { Texture2DLoader } from 't3d/addons/loaders/Texture2DLoader.js';\n\t\timport { GUI } from './libs/lil-gui.esm.min.js';\n\n\t\tlet width = window.innerWidth || 2;\n\t\tlet height = window.innerHeight || 2;\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = width;\n\t\tcanvas.height = height;\n\t\tdocument.body.appendChild(canvas);\n\n\t\tconst forwardRenderer = new ForwardRenderer(canvas);\n\n\t\tconst scene = new t3d.Scene();\n\n\t\tconst camera = new t3d.Camera();\n\t\tcamera.position.set(-1, 0, 3.9);\n\t\tcamera.lookAt(new t3d.Vector3(0, 0, 0), new t3d.Vector3(0, 1, 0));\n\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 0.1, 1000);\n\t\tscene.add(camera);\n\n\t\tconst controller = new OrbitControls(camera, canvas);\n\t\tcontroller.screenSpacePanning = true;\n\n\t\t// Create box\n\n\t\tconst shader = {\n\t\t\tname: 'clip_cull_distance',\n\t\t\tuniforms: {\n\t\t\t\tu_ClipPlane: [0, 1, 0, 0], // normal, constant\n\t\t\t\tu_CullPlane: [0, 1, 0, 0],\n\t\t\t\tu_Texture: new Texture2DLoader().load('./resources/logo.jpg')\n\t\t\t},\n\t\t\tvertexShader: `\n\t\t\t\t#extension GL_ANGLE_clip_cull_distance: enable\n\t\t\t\t#include <common_vert>\n\t\t\t\tuniform vec4 u_ClipPlane;\n\t\t\t\tuniform vec4 u_CullPlane;\n\t\t\t\tattribute vec2 a_Uv;\n\t\t\t\tvarying vec2 v_Uv;\n\t\t\t\tvoid main() {\n\t\t\t\t\tvec4 worldPosition = u_Model * vec4(a_Position, 1.0);\n\t\t\t\t\tgl_ClipDistance[0] = dot(worldPosition.xyz, normalize(u_ClipPlane.xyz)) + u_ClipPlane.w;\n\t\t\t\t\tgl_CullDistance[0] = dot(worldPosition.xyz, normalize(u_CullPlane.xyz)) + u_CullPlane.w;\n\t\t\t\t\tv_Uv = a_Uv;\n\t\t\t\t\tgl_Position = u_ProjectionView * worldPosition;\n\t\t\t\t}\n\t\t\t`,\n\t\t\tfragmentShader: `\n\t\t\t\tuniform sampler2D u_Texture;\n\t\t\t\tvarying vec2 v_Uv;\n\t\t\t\tvoid main() {\n\t\t\t\t\tgl_FragColor = texture2D(u_Texture, v_Uv);\n\t\t\t\t}\n\t\t\t`\n\t\t};\n\n\t\tconst geometry = new t3d.BoxGeometry(1, 1, 1);\n\t\tconst material = new t3d.ShaderMaterial(shader);\n\t\tmaterial.polygonOffset = true;\n\t\tmaterial.polygonOffsetFactor = 0.5;\n\t\tmaterial.polygonOffsetUnits = 0.5;\n\t\tmaterial.side = t3d.DRAW_SIDE.DOUBLE;\n\t\tconst mesh = new t3d.Mesh(geometry, material);\n\t\tscene.add(mesh);\n\n\t\tconst wireFrameGeometry = geometry.clone();\n\t\twireFrameGeometry.index = GeometryUtils.getWireframeAttribute(wireFrameGeometry);\n\t\twireFrameGeometry.computeBoundingBox();\n\t\twireFrameGeometry.computeBoundingSphere();\n\t\tconst wireFrameMaterial = new t3d.BasicMaterial();\n\t\twireFrameMaterial.diffuse.setHex(0xff0000);\n\t\twireFrameMaterial.drawMode = t3d.DRAW_MODE.LINES;\n\t\tscene.add(new t3d.Mesh(wireFrameGeometry, wireFrameMaterial));\n\n\t\t// Create planes and helpers\n\n\t\tconst planeNormal = new t3d.Vector3(1, 1, 0).normalize();\n\n\t\tconst clipPlane = new t3d.Plane(planeNormal, 0.3);\n\t\tconst cullPlane = new t3d.Plane(planeNormal, 0.8);\n\n\t\tconst planeGeometry = new t3d.PlaneGeometry(2, 2);\n\n\t\tconst clipPlaneHelper = createPlaneHelper(0x00ff00);\n\t\tscene.add(clipPlaneHelper);\n\n\t\tconst cullPlaneHelper = createPlaneHelper(0xffff00);\n\t\tscene.add(cullPlaneHelper);\n\n\t\tfunction createPlaneHelper(color) {\n\t\t\tconst material = new t3d.BasicMaterial();\n\t\t\tmaterial.diffuse.setHex(color);\n\t\t\tmaterial.transparent = true;\n\t\t\tmaterial.opacity = 0.3;\n\t\t\tmaterial.side = t3d.DRAW_SIDE.DOUBLE;\n\t\t\tconst mesh = new t3d.Mesh(planeGeometry, material);\n\t\t\tmesh.euler.z = -Math.PI / 4;\n\t\t\treturn mesh;\n\t\t}\n\n\t\tfunction syncPlane() {\n\t\t\tclipPlane.normal.toArray(material.uniforms.u_ClipPlane);\n\t\t\tmaterial.uniforms.u_ClipPlane[3] = clipPlane.constant;\n\t\t\tclipPlaneHelper.position.copy(planeNormal).multiplyScalar(clipPlane.constant).negate();\n\t\t\n\t\t\tcullPlane.normal.toArray(material.uniforms.u_CullPlane);\n\t\t\tmaterial.uniforms.u_CullPlane[3] = cullPlane.constant;\n\t\t\tcullPlaneHelper.position.copy(planeNormal).multiplyScalar(cullPlane.constant).negate();\n\t\t}\n\n\t\tsyncPlane();\n\n\t\t// GUI\n\n\t\tconst gui = new GUI();\n\t\tgui.add(clipPlane, 'constant', -0.8, 0.8, 0.01).name('clipDistance').onChange(syncPlane);\n\t\tgui.add(cullPlane, 'constant', -0.8, 0.8, 0.01).name('cullDistance').onChange(syncPlane);\n\n\t\tfunction loop(count) {\n\t\t\trequestAnimationFrame(loop);\n\n\t\t\tcontroller.update();\n\n\t\t\tforwardRenderer.render(scene, camera);\n\t\t}\n\n\t\tconst capabilities = forwardRenderer.capabilities;\n\t\tif (capabilities.version < 2 || !capabilities.getExtension('WEBGL_clip_cull_distance')) {\n\t\t\tdocument.getElementById('notSupported').style.display = '';\n\t\t} else {\n\t\t\tforwardRenderer.context.enable(capabilities.getExtension('WEBGL_clip_cull_distance').CLIP_DISTANCE0_WEBGL);\n\t\t\trequestAnimationFrame(loop);\n\t\t}\n\n\t\tfunction onWindowResize() {\n\t\t\twidth = window.innerWidth || 2;\n\t\t\theight = window.innerHeight || 2;\n\n\t\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 0.1, 1000);\n\n\t\t\tforwardRenderer.screenRenderTarget.resize(width, height);\n\t\t}\n\t\twindow.addEventListener('resize', onWindowResize, false);\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "examples/webgl_contextlost.html",
    "content": "<!DOCTYPE html>\n<html>\n\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>t3d - contextlost</title>\n\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n\t<link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n</head>\n\n<body>\n\t<div id=\"info\">\n\t\t<a href=\"\" target=\"_blank\">t3d</a> - contextlost\n\t\t<br/>\n\t\t<div id=\"notSupported\" style=\"display:none\">\n\t\t\tYour browser does not support extension WEBGL_lose_context.\n\t\t</div>\n\t</div>\n\n\t<script src=\"./libs/nanobar.js\"></script>\n\n\t<!-- Import maps polyfill -->\n\t<!-- Remove this when import maps will be widely supported -->\n\t<script async src=\"./libs/es-module-shims.js\"></script>\n\n\t<script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n\t<script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { GLTFLoader } from 't3d/addons/loaders/glTF/GLTFLoader.js';\n\t\timport { ForwardRenderer } from 't3d/addons/render/ForwardRenderer.js';\n\t\timport { OrbitControls } from 't3d/addons/controls/OrbitControls.js';\n\t\timport { GUI } from './libs/lil-gui.esm.min.js';\n\n\t\tlet width = window.innerWidth || 2;\n\t\tlet height = window.innerHeight || 2;\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = width;\n\t\tcanvas.height = height;\n\t\tdocument.body.appendChild(canvas);\n\n\t\tconst forwardRenderer = new ForwardRenderer(canvas);\n\n\t\tconst scene = new t3d.Scene();\n\n\t\tconst nanobar = new Nanobar();\n\t\tnanobar.el.style.background = 'gray';\n\n\t\tconst loadingManager = new t3d.LoadingManager(function() {\n\t\t\tnanobar.go(100);\n\t\t\tnanobar.el.style.background = 'transparent';\n\t\t}, function(url, itemsLoaded, itemsTotal) {\n\t\t\tif (itemsLoaded < itemsTotal) {\n\t\t\t\tnanobar.go(itemsLoaded / itemsTotal * 100);\n\t\t\t}\n\t\t});\n\n\t\tlet model;\n\n\t\tconsole.time('Load glTF');\n\t\tconst gltfUri = './resources/models/gltf/bust_of_woman/glTF-Binary/bust_of_woman.glb';\n\t\tnew GLTFLoader(loadingManager).load(gltfUri).then(function(result) {\n\t\t\tconsole.timeEnd('Load glTF');\n\n\t\t\tmodel = result.root;\n\n\t\t\tmodel.traverse(node => {\n\t\t\t\tif (node.isMesh) {\n\t\t\t\t\tnode.castShadow = true;\n\t\t\t\t\tnode.receiveShadow = true;\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tscene.add(model);\n\t\t}).catch(function(e) { console.error(e) });\n\n\t\tconst directionalLight = new t3d.DirectionalLight(0xffffff, 0.9);\n\t\tdirectionalLight.castShadow = true;\n\t\tdirectionalLight.shadow.windowSize = 150;\n\t\tdirectionalLight.shadow.mapSize.set(1024, 1024);\n\t\tdirectionalLight.shadow.bias = -0.001;\n\t\tdirectionalLight.shadow.normalBias = 0.2;\n\t\tdirectionalLight.shadow.cameraNear = 10;\n\t\tscene.add(directionalLight);\n\n\t\tconst camera = new t3d.Camera();\n\t\tcamera.position.set(0, 26, 100);\n\t\tcamera.lookAt(new t3d.Vector3(0, 26, 0), new t3d.Vector3(0, 1, 0));\n\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 1000);\n\t\tscene.add(camera);\n\n\t\tconst controller = new OrbitControls(camera, canvas);\n\t\tcontroller.target.set(0, 26, 0);\n\n\t\tconst gui = new GUI();\n\t\tgui.add({ version: 'WebGL ' + forwardRenderer.capabilities.version }, 'version').disable();\n\n\t\tconst loseContextExtension = forwardRenderer.capabilities.getExtension('WEBGL_lose_context');\n\n\t\tif (!loseContextExtension) {\n\t\t\tdocument.getElementById('notSupported').style.display = '';\n\t\t\tconsole.warn('WEBGL_lose_context is not supported.');\n\t\t} else {\n\t\t\tconst params = {\n\t\t\t\tforceContextLoss: function() {\n\t\t\t\t\tloseContextExtension.loseContext();\n\t\t\t\t},\n\t\t\t\tforceContextRestore: function() {\n\t\t\t\t\tloseContextExtension.restoreContext();\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tgui.add(params, 'forceContextLoss');\n\t\t\tgui.add(params, 'forceContextRestore');\n\t\t}\n\n\t\tlet isContextLost = false;\n\n\t\tconst onContextLost = function() {\n\t\t\tevent.preventDefault();\n\t\t\tconsole.log('Context lost');\n\t\t\tisContextLost = true;\n\t\t};\n\n\t\tconst onContextRestored = function() {\n\t\t\tconsole.log('Context restored');\n\t\t\tforwardRenderer.init(forwardRenderer.context);\n\t\t\tisContextLost = false;\n\t\t};\n\n\t\tcanvas.addEventListener('webglcontextlost', onContextLost, false);\n\t\tcanvas.addEventListener('webglcontextrestored', onContextRestored, false);\n\n\t\tfunction loop(count) {\n\t\t\trequestAnimationFrame(loop);\n\t\t\n\t\t\tif (isContextLost) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\n\t\t\tcontroller.update();\n\n\t\t\tforwardRenderer.render(scene, camera);\n\t\t}\n\t\trequestAnimationFrame(loop);\n\n\t\tfunction onWindowResize() {\n\t\t\twidth = window.innerWidth || 2;\n\t\t\theight = window.innerHeight || 2;\n\n\t\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 1000);\n\n\t\t\tforwardRenderer.screenRenderTarget.resize(width, height);\n\t\t}\n\t\twindow.addEventListener('resize', onWindowResize, false);\n\t</script>\n</body>\n\n</html>"
  },
  {
    "path": "examples/webgl_depthfunc.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>t3d - depth func</title>\n\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n\t<link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n</head>\n<body>\n    <div id=\"info\">\n        <a href=\"\" target=\"_blank\">t3d</a> - depth func\n    </div>\n\n\t<!-- Import maps polyfill -->\n    <!-- Remove this when import maps will be widely supported -->\n    <script async src=\"./libs/es-module-shims.js\"></script>\n\n    <script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n    <script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { ForwardRenderer } from 't3d/addons/render/ForwardRenderer.js';\n\t\timport { TransformControls } from 't3d/addons/controls/TransformControls.js';\n\n\t\tlet width = window.innerWidth || 2;\n\t\tlet height = window.innerHeight || 2;\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = width;\n\t\tcanvas.height = height;\n\t\tdocument.body.appendChild(canvas);\n\n\t\tconst forwardRenderer = new ForwardRenderer(canvas);\n\n\t\tconst scene = new t3d.Scene();\n\n\t\tconst spheresRoot = new t3d.Object3D();\n\t\tspheresRoot.position.set(0, 8, 8);\n\t\tscene.add(spheresRoot);\n\n\t\tconst sphereGeometry = new t3d.SphereGeometry(1, 20, 20);\n\t\tfor (let i = 0; i < 4; i++) {\n\t\t\tconst material = new t3d.BasicMaterial();\n\t\t\tmaterial.diffuse.setHex(0xffffcc);\n\t\t\tmaterial.side = t3d.DRAW_SIDE.BACK;\n\t\t\tmaterial.depthFunc = t3d.COMPARE_FUNC.GREATER;\n\t\t\tmaterial.depthWrite = false;\n\t\t\tmaterial.transparent = true;\n\t\t\tmaterial.opacity = 0.3 - i / 4 * 0.3;\n\t\t\n\t\t\tconst sphere = new t3d.Mesh(sphereGeometry, material);\n\t\t\tsphere.scale.setScalar(i * 5 + 10);\n\t\t\tsphere.renderOrder = 1;\n\t\t\tspheresRoot.add(sphere);\n\t\t}\n\n\t\tconst planeGeometry = new t3d.PlaneGeometry(70, 70);\n\t\tconst planeMaterial = new t3d.BasicMaterial();\n\t\tplaneMaterial.diffuse.setHex(0x888888);\n\t\tplaneMaterial.side = t3d.DRAW_SIDE.DOUBLE;\n\t\t\n\t\tconst plane1 = new t3d.Mesh(planeGeometry, planeMaterial);\n\t\tscene.add(plane1);\n\t\t\n\t\tconst plane2 = new t3d.Mesh(planeGeometry, planeMaterial);\n\t\tplane2.euler.x = Math.PI / 2;\n\t\tscene.add(plane2);\n\n\t\tconst camera = new t3d.Camera();\n\t\tcamera.position.set(0, 80, 100);\n\t\tcamera.lookAt(new t3d.Vector3(0, 0, 0), new t3d.Vector3(0, 1, 0));\n\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 1000);\n\t\tscene.add(camera);\n\n\t\tconst transformControls = new TransformControls(camera, canvas);\n\t\tscene.add(transformControls);\n\n\t\tspheresRoot.updateMatrix();\n\t\ttransformControls.group.addObject(spheresRoot);\n\n\t\tfunction loop(count) {\n\t\t\trequestAnimationFrame(loop);\n\n\t\t\tcamera.updateMatrix();\n\t\t\ttransformControls.update();\n\n\t\t\tforwardRenderer.render(scene, camera);\n\t\t}\n\t\trequestAnimationFrame(loop);\n\n\t\tfunction onWindowResize() {\n\t\t\twidth = window.innerWidth || 2;\n\t\t\theight = window.innerHeight || 2;\n\n\t\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 1000);\n\n\t\t\tforwardRenderer.screenRenderTarget.resize(width, height);\n\t\t}\n\t\twindow.addEventListener('resize', onWindowResize, false);\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "examples/webgl_external_buffer.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>t3d - external buffer</title>\n\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n\t<link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n</head>\n<body>\n    <div id=\"info\">\n        <a href=\"\" target=\"_blank\">t3d</a> - external buffer\n\t\t<br/>\n\t\tSetting external glBuffer for t3d buffer.\n    </div>\n\n\t<!-- Import maps polyfill -->\n    <!-- Remove this when import maps will be widely supported -->\n    <script async src=\"./libs/es-module-shims.js\"></script>\n\n    <script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n    <script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { ForwardRenderer } from 't3d/addons/render/ForwardRenderer.js';\n\t\timport { GUI } from './libs/lil-gui.esm.min.js';\n\n\t\tlet width = window.innerWidth || 2;\n\t\tlet height = window.innerHeight || 2;\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = width;\n\t\tcanvas.height = height;\n\t\tdocument.body.appendChild(canvas);\n\n\t\tconst forwardRenderer = new ForwardRenderer(canvas);\n\t\tforwardRenderer.screenRenderTarget.setColorClearValue(0.1, 0.1, 0.1, 1);\n\n\t\tconst scene = new t3d.Scene();\n\t\tscene.fog = new t3d.Fog(0x050505, 2000, 3500);\n\n\t\tconst array = [];\n\t\tconst array2 = [];\n\n\t\tconst particles = 100000;\n\n\t\tconst n = 1000, n2 = n / 2;\n\n\t\tfor (let i = 0; i < particles; i++) {\n\t\t\t// positions\n\t\t\tconst x = Math.random() * n - n2;\n\t\t\tconst y = Math.random() * n - n2;\n\t\t\tconst z = Math.random() * n - n2;\n\n\t\t\t// colors\n\t\t\tconst r = (x / n) + 0.5;\n\t\t\tconst g = (y / n) + 0.5;\n\t\t\tconst b = (z / n) + 0.5;\n\n\t\t\tarray.push(x, y, z, r, g, b);\n\t\t\tarray2.push(z * 0.3, x * 0.3, y * 0.3);\n\t\t}\n\n\t\tconst gl = forwardRenderer.context;\n\n\t\tconst glBuffer = gl.createBuffer();\n\t\tgl.bindBuffer(gl.ARRAY_BUFFER, glBuffer);\n\t\tgl.bufferData(gl.ARRAY_BUFFER, new Float32Array(array), gl.STATIC_DRAW);\n\n\t\tconst buffer = new t3d.Buffer(new Float32Array(array2), 6);\n\n\t\tconst geometry = new t3d.Geometry();\n\t\tgeometry.addAttribute('a_Position', new t3d.Attribute(buffer, 3, 0));\n\t\tgeometry.addAttribute('a_Color', new t3d.Attribute(buffer, 3, 3));\n\n\t\tconst material = new t3d.PointsMaterial();\n\t\tmaterial.size = 15;\n\t\tmaterial.vertexColors = t3d.VERTEX_COLOR.RGB;\n\n\t\tconst points = new t3d.Mesh(geometry, material);\n\t\tpoints.frustumCulled = false;\n\n\t\tscene.add(points);\n\n\t\tconst camera = new t3d.Camera();\n\t\tcamera.position.set(0, 0, 2750);\n\t\tcamera.lookAt(new t3d.Vector3(0, 0, 0), new t3d.Vector3(0, 1, 0));\n\t\tcamera.setPerspective(27 / 180 * Math.PI, width / height, 5, 3500);\n\t\tscene.add(camera);\n\n\t\tconst funcs = {\n\t\t\trestoreBuffer: function() {\n\t\t\t\tbuffer.version++;\n\t\t\t\tgeometry.version++; // refresh vao\n\t\t\t},\n\t\t\tsetExternalBuffer: function() {\n\t\t\t\tforwardRenderer.setBufferExternal(buffer, glBuffer);\n\t\t\t\tgeometry.version++; // refresh vao\n\t\t\t}\n\t\t};\n\n\t\tfuncs.setExternalBuffer();\n\n\t\tconst gui = new GUI();\n\t\tgui.add(funcs, 'restoreBuffer').name('Restore buffer');\n\t\tgui.add(funcs, 'setExternalBuffer').name('Set external glBuffer');\n\n\t\tfunction loop(timestamp) {\n\t\t\trequestAnimationFrame(loop);\n\n\t\t\tconst time = timestamp * 0.001;\n\n\t\t\tpoints.euler.x = time * 0.1;\n\t\t\tpoints.euler.y = time * 0.2;\n\n\t\t\tforwardRenderer.render(scene, camera);\n\t\t}\n\t\trequestAnimationFrame(loop);\n\n\t\tfunction onWindowResize() {\n\t\t\twidth = window.innerWidth || 2;\n\t\t\theight = window.innerHeight || 2;\n\n\t\t\tcamera.setPerspective(27 / 180 * Math.PI, width / height, 5, 3500);\n\n\t\t\tforwardRenderer.screenRenderTarget.resize(width, height);\n\t\t}\n\t\twindow.addEventListener('resize', onWindowResize, false);\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "examples/webgl_external_texture.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>t3d - external texture</title>\n\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n\t<link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n</head>\n<body>\n    <div id=\"info\">\n        <a href=\"\" target=\"_blank\">t3d</a> - external texture\n\t\t<br/>\n\t\tSetting external glTexture for t3d texture.\n    </div>\n\n\t<!-- Import maps polyfill -->\n    <!-- Remove this when import maps will be widely supported -->\n    <script async src=\"./libs/es-module-shims.js\"></script>\n\n    <script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n    <script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { ForwardRenderer } from 't3d/addons/render/ForwardRenderer.js';\n\t\timport { GUI } from './libs/lil-gui.esm.min.js';\n\n\t\tlet width = window.innerWidth || 2;\n\t\tlet height = window.innerHeight || 2;\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = width;\n\t\tcanvas.height = height;\n\t\tdocument.body.appendChild(canvas);\n\n\t\tconst forwardRenderer = new ForwardRenderer(canvas);\n\t\tforwardRenderer.screenRenderTarget.setColorClearValue(0.4, 0.4, 0.4, 1);\n\n\t\tconst scene = new t3d.Scene();\n\n\t\tfunction createTexture(gl, type, target, count) {\n\t\t\tconst data = new Uint8Array([\n\t\t\t\t255, 255, 255, 255,\n\t\t\t\t0, 0, 0, 255,\n\t\t\t\t0, 0, 0, 255,\n\t\t\t\t255, 255, 255, 255\n\t\t\t]);\n\t\t\tconst texture = gl.createTexture();\n\n\t\t\tgl.bindTexture(type, texture);\n\t\t\tgl.texParameteri(type, gl.TEXTURE_MIN_FILTER, gl.NEAREST);\n\t\t\tgl.texParameteri(type, gl.TEXTURE_MAG_FILTER, gl.NEAREST);\n\n\t\t\tfor (let i = 0; i < count; i++) {\n\t\t\t\tgl.texImage2D(target + i, 0, gl.RGBA, 2, 2, 0, gl.RGBA, gl.UNSIGNED_BYTE, data);\n\t\t\t}\n\n\t\t\treturn texture;\n\t\t}\n\n\t\tconst image = new Image();\n\t\timage.src = './resources/logo.jpg';\n\n\t\tconst gl = forwardRenderer.context;\n\t\tconst glTexture = createTexture(gl, gl.TEXTURE_2D, gl.TEXTURE_2D, 1);\n\n\t\tconst texture = new t3d.Texture2D();\n\t\ttexture.magFilter = t3d.TEXTURE_FILTER.NEAREST;\n\t\ttexture.minFilter = t3d.TEXTURE_FILTER.NEAREST;\n\t\ttexture.generateMipmaps = false;\n\t\ttexture.flipY = false;\n\n\t\timage.onload = function() {\n\t\t\ttexture.image = image;\n\t\t\ttexture.flipY = true;\n\t\t\ttexture.version++;\n\t\t};\n\n\t\tconst geometry = new t3d.PlaneGeometry(1, 1);\n\t\tconst material = new t3d.BasicMaterial();\n\t\tmaterial.diffuseMap = texture;\n\t\tconst plane = new t3d.Mesh(geometry, material);\n\t\tplane.euler.x = Math.PI / 2;\n\t\tscene.add(plane);\n\n\t\tlet aspect = width / height;\n\t\t\n\t\tconst camera = new t3d.Camera();\n\t\tcamera.setOrtho(-aspect, aspect, -1, 1, 0, 1);\n\t\tscene.add(camera);\n\n\t\tconst funcs = {\n\t\t\tdisposeTexture: function() {\n\t\t\t\ttexture.flipY = true;\n\t\t\t\ttexture.dispose();\n\t\t\t},\n\t\t\tsetExternal: function() {\n\t\t\t\ttexture.flipY = false;\n\t\t\t\tforwardRenderer.setTextureExternal(texture, glTexture);\n\t\t\t}\n\t\t};\n\n\t\tfuncs.setExternal();\n\n\t\tconst gui = new GUI();\n\t\tgui.add(funcs, 'disposeTexture').name('Dispose texture');\n\t\tgui.add(funcs, 'setExternal').name('Set external glTexture');\n\n\t\tfunction loop(count) {\n\t\t\trequestAnimationFrame(loop);\n\n\t\t\tforwardRenderer.render(scene, camera);\n\t\t}\n\t\trequestAnimationFrame(loop);\n\n\t\tfunction onWindowResize() {\n\t\t\twidth = window.innerWidth || 2;\n\t\t\theight = window.innerHeight || 2;\n\n\t\t\taspect = width / height;\n\n\t\t\tcamera.setOrtho(-aspect, aspect, -1, 1, 0, 1);\n\n\t\t\tforwardRenderer.screenRenderTarget.resize(width, height);\n\t\t}\n\t\twindow.addEventListener('resize', onWindowResize, false);\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "examples/webgl_helpers.html",
    "content": "<!DOCTYPE html>\n<html>\n\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>t3d - webgl helpers</title>\n\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n\t<link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n</head>\n\n<body>\n\t<div id=\"info\">\n\t\t<a href=\"\" target=\"_blank\">t3d</a> - webgl helpers\n\t</div>\n\n\t<script src=\"./libs/nanobar.js\"></script>\n\n\t<!-- Import maps polyfill -->\n\t<!-- Remove this when import maps will be widely supported -->\n\t<script async src=\"./libs/es-module-shims.js\"></script>\n\n\t<script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n\t<script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { OrbitControls } from 't3d/addons/controls/OrbitControls.js';\n\t\timport { GLTFLoader } from 't3d/addons/loaders/glTF/GLTFLoader.js';\n\t\timport { TextureCubeLoader } from 't3d/addons/loaders/TextureCubeLoader.js';\n\t\timport { GridHelper } from 't3d/addons/objects/GridHelper.js';\n\t\timport { PolarGridHelper } from 't3d/addons/objects/PolarGridHelper.js';\n\t\timport { VertexNormalsHelper } from 't3d/addons/objects/VertexNormalsHelper.js';\n\t\timport { VertexTangentsHelper } from 't3d/addons/objects/VertexTangentsHelper.js';\n\t\timport { BoxHelper } from 't3d/addons/objects/BoxHelper.js';\n\t\timport { Box3Helper } from 't3d/addons/objects/Box3Helper.js';\n\t\timport { SphereHelper } from 't3d/addons/objects/SphereHelper.js';\n\t\timport { AxisHelper } from 't3d/addons/objects/AxisHelper.js';\n\n\t\tlet width = window.innerWidth || 2;\n\t\tlet height = window.innerHeight || 2;\n\t\t\n\t\tlet vnh = null;\n\t\tlet vth = null;\n\t\tlet box = null;\n\t\tlet root = null;\n\t\tconst box3 = new t3d.Box3(new t3d.Vector3(20, -10, -10), new t3d.Vector3(40, 10, 10));\n\t\tconst sphere = new t3d.Sphere();\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = width;\n\t\tcanvas.height = height;\n\t\tdocument.body.appendChild(canvas);\n\n\t\tconst contextParams = { antialias: true, alpha: false };\n\t\tconst gl = canvas.getContext('webgl2', contextParams) || canvas.getContext('webgl', contextParams);\n\t\tconst renderer = new t3d.WebGLRenderer(gl);\n\n\t\tconst cubeTexturePath = './resources/skybox/Bridge2/';\n\t\tconst cubeTexture = new TextureCubeLoader().load([\n\t\t\tcubeTexturePath + 'posx.jpg',\n\t\t\tcubeTexturePath + 'negx.jpg',\n\t\t\tcubeTexturePath + 'posy.jpg',\n\t\t\tcubeTexturePath + 'negy.jpg',\n\t\t\tcubeTexturePath + 'posz.jpg',\n\t\t\tcubeTexturePath + 'negz.jpg'\n\t\t]);\n\t\tcubeTexture.encoding = t3d.TEXEL_ENCODING_TYPE.SRGB;\n\n\t\tconst scene = new t3d.Scene();\n\n\t\tconst nanobar = new Nanobar();\n\t\tnanobar.el.style.background = 'gray';\n\n\t\tconst loadingManager = new t3d.LoadingManager(function() {\n\t\t\tnanobar.go(100);\n\t\t\tnanobar.el.style.background = 'transparent';\n\t\t}, function(url, itemsLoaded, itemsTotal) {\n\t\t\tif (itemsLoaded < itemsTotal) {\n\t\t\t\tnanobar.go(itemsLoaded / itemsTotal * 100);\n\t\t\t}\n\t\t});\n\n\t\tconst loader = new GLTFLoader(loadingManager);\n\t\tloader.load(\n\t\t\t'./resources/models/gltf/NormalTangentMirrorTest/glTF/NormalTangentMirrorTest.gltf'\n\t\t).then(function(result) {\n\t\t\troot = result.root;\n\t\t\troot.children[0].material.envMap = cubeTexture;\n\n\t\t\troot.scale.set(20, 20, 20);\n\t\t\troot.position.set(-20, 0, 0);\n\n\t\t\tvnh = new VertexNormalsHelper(root.children[0], 0.5);\n\t\t\tscene.add(vnh);\n\n\t\t\tbox = new BoxHelper(root);\n\t\t\tscene.add(box);\n\n\t\t\tvth = new VertexTangentsHelper(root.children[0], 0.5);\n\t\t\tscene.add(vth);\n\n\t\t\tscene.add(root);\n\t\t}).catch(e => console.error(e));\n\n\t\tconst grid = new GridHelper(50, 20, 0xff0000, 0xffffff);\n\t\tgrid.position.set(30, -30, 0);\n\t\tscene.add(grid);\n\n\t\tconst polargrid = new PolarGridHelper(30, 16, 8, 64, 0x0000ff, 0x808080);\n\t\tpolargrid.position.set(-30, -30, 0);\n\t\tscene.add(polargrid);\n\n\t\tconst axis = new AxisHelper(100);\n\t\tscene.add(axis);\n\n\t\tconst _boxHelper = new Box3Helper(box3);\n\t\tscene.add(_boxHelper);\n\n\t\tconst _sphereHelper = new SphereHelper(sphere, 0x00ffff);\n\t\tscene.add(_sphereHelper);\n\n\t\tconst directionalLight = new t3d.DirectionalLight(0xbbbbff, 0.5);\n\t\tdirectionalLight.position.set(0, 30, 100);\n\t\tdirectionalLight.lookAt(new t3d.Vector3(), new t3d.Vector3(0, 1, 0));\n\t\tscene.add(directionalLight);\n\n\t\tconst camera = new t3d.Camera();\n\t\tcamera.outputEncoding = t3d.TEXEL_ENCODING_TYPE.SRGB;\n\t\tcamera.position.set(10, 10, 80);\n\t\tcamera.lookAt(new t3d.Vector3(0, 0, 0), new t3d.Vector3(0, 1, 0));\n\t\tcamera.setPerspective(60 / 180 * Math.PI, width / height, 1, 1000);\n\t\tscene.add(camera);\n\n\t\tconst controller = new OrbitControls(camera, canvas);\n\n\t\tconst screenRenderTarget = new t3d.ScreenRenderTarget(canvas);\n\t\tscreenRenderTarget\n\t\t\t.setColorClearValue(0.1, 0.1, 0.1, 1)\n\t\t\t.setClear(true, true, false);\n\n\t\tfunction loop(count) {\n\t\t\trequestAnimationFrame(loop);\n\n\t\t\tcontroller.update();\n\n\t\t\tbox3.max.y = Math.sin(count * 0.001) * 5 + 5;\n\t\t\tbox3.getBoundingSphere(sphere);\n\t\t\troot && (root.euler.y = count * 0.001);\n\t\t\tvnh && vnh.update();\n\t\t\tvth && vth.update();\n\n\t\t\tscene.updateMatrix();\n\t\t\tscene.updateRenderStates(camera);\n\t\t\tscene.updateRenderQueue(camera);\n\n\t\t\trenderer.renderScene(scene, camera, screenRenderTarget);\n\t\t}\n\t\trequestAnimationFrame(loop);\n\n\t\tfunction onWindowResize() {\n\t\t\twidth = window.innerWidth || 2;\n\t\t\theight = window.innerHeight || 2;\n\n\t\t\tcamera.setPerspective(60 / 180 * Math.PI, width / height, 1, 1000);\n\n\t\t\tscreenRenderTarget.resize(width, height);\n\t\t}\n\t\twindow.addEventListener('resize', onWindowResize, false);\n\t</script>\n</body>\n\n</html>"
  },
  {
    "path": "examples/webgl_instanced_draw.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>t3d - webgl instanced draw</title>\n\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n\t<link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n</head>\n<body>\n    <div id=\"info\">\n        <a href=\"\" target=\"_blank\">t3d</a> - instanced draw\n\t\t<br/>Model from <a href=\"https://sketchfab.com/3d-models/asteroid-aa26af77e2cb40c48e0dc19f16115f72\"  target=\"_blank\">\"asteroid\"</a> \n\t\tby <a href=\"https://sketchfab.com/shawn0326\"  target=\"_blank\">shawn0326</a>\n\t</div>\n\n\t<script src=\"./libs/nanobar.js\"></script>\n\n\t<!-- Import maps polyfill -->\n    <!-- Remove this when import maps will be widely supported -->\n    <script async src=\"./libs/es-module-shims.js\"></script>\n\n    <script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n    <script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { ForwardRenderer } from 't3d/addons/render/ForwardRenderer.js';\n\t\timport { GLTFLoader } from 't3d/addons/loaders/glTF/GLTFLoader.js';\n\t\timport { OrbitControls } from 't3d/addons/controls/OrbitControls.js';\n\t\timport { InstancedPBRMaterial } from 't3d/addons/materials/InstancedMaterial.js';\n\t\timport { GUI } from './libs/lil-gui.esm.min.js';\n\n\t\tlet width = window.innerWidth || 2;\n\t\tlet height = window.innerHeight || 2;\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = width;\n\t\tcanvas.height = height;\n\t\tdocument.body.appendChild(canvas);\n\n\t\tconst forwardRenderer = new ForwardRenderer(canvas);\n\n\t\tconst scene = new t3d.Scene();\n\n\t\tconst nanobar = new Nanobar();\n\t\tnanobar.el.style.background = 'gray';\n\n\t\tconst loadingManager = new t3d.LoadingManager(function() {\n\t\t\tnanobar.go(100);\n\t\t\tnanobar.el.style.background = 'transparent';\n\t\t}, function(url, itemsLoaded, itemsTotal) {\n\t\t\tif (itemsLoaded < itemsTotal) {\n\t\t\t\tnanobar.go(itemsLoaded / itemsTotal * 100);\n\t\t\t}\n\t\t});\n\n\t\tlet instancedGeometry;\n\n\t\tconst loader = new GLTFLoader(loadingManager);\n\t\tloader.load('./resources/models/gltf/asteroid.glb').then(function(result) {\n\t\t\tresult.root.traverse(function(node) {\n\t\t\t\tif (node.isMesh) {\n\t\t\t\t\tnode.material = new InstancedPBRMaterial(node.material);\n\n\t\t\t\t\tinstancedGeometry = createInstancedGeoemtry(node.geometry);\n\t\t\t\t\tnode.geometry = instancedGeometry;\n\t\t\n\t\t\t\t\tnode.frustumCulled = false;\n\n\t\t\t\t\tconst gui = new GUI();\n\t\t\t\t\tgui.add(node.geometry, 'instanceCount', 0, instances, 1);\n\t\t\t\t\tconst directionalLightFolder = gui.addFolder('Directional Light');\n\t\t\t\t\tdirectionalLightFolder.close();\n\t\t\t\t\tdirectionalLightFolder.addColor(directionalLight, 'color');\n\t\t\t\t\tconst pointLightFolder = gui.addFolder('Point Light');\n\t\t\t\t\tpointLightFolder.close();\n\t\t\t\t\tpointLightFolder.addColor(pointLight, 'color');\n\t\t\t\t\tpointLightFolder.add(pointLight, 'decay', 0, 2, 0.01);\n\t\t\t\t}\n\t\t\t});\n\t\t\tscene.add(result.root);\n\t\t}).catch(e => console.error(e));\n\n\t\tconst directionalLight = new t3d.DirectionalLight(0xffffff, 2);\n\t\tdirectionalLight.position.set(50, 20, 0);\n\t\tdirectionalLight.lookAt(new t3d.Vector3(), new t3d.Vector3(0, 1, 0));\n\t\tscene.add(directionalLight);\n\n\t\tconst pointLight = new t3d.PointLight(0x00d5ff, 2, 150, 1);\n\t\tscene.add(pointLight);\n\n\t\t// instanced geometry\n\n\t\tconst instances = 5000;\n\t\t\n\t\tfunction createInstancedGeoemtry(geometry) {\n\t\t\tconst matrices = [];\n\n\t\t\tfor (let i = 0; i < instances; i++) {\n\t\t\t\trandomTransform(matrices, i);\n\t\t\t}\n\n\t\t\tconst instancedGeometry = geometry.clone();\n\t\t\tconst instanceMatrixAttribute = new t3d.Attribute(new t3d.Buffer(new Float32Array(matrices), 16));\n\t\t\tinstanceMatrixAttribute.divisor = 1;\n\t\t\tinstancedGeometry.addAttribute('instanceMatrix', instanceMatrixAttribute);\n\n\t\t\tinstancedGeometry.instanceCount = instances;\n\n\t\t\treturn instancedGeometry;\n\t\t}\n\n\t\tconst _position = new t3d.Vector3();\n\t\tconst _orientation = new t3d.Quaternion();\n\t\tconst _scale = new t3d.Vector3();\n\t\tconst _matrix = new t3d.Matrix4();\n\n\t\tfunction randomTransform(matrices, index) {\n\t\t\tconst ratio = Math.random();\n\t\t\tconst radiusX = 110 * ratio;\n\t\t\tconst rangeY = (Math.random() > 0.5 ? 1 : -1) * (Math.cos(radiusX / 80 * Math.PI / 2) * 30 + Math.random() * 20 - 10);\n\t\t\tconst theta = Math.random() * Math.PI * 2;\n\n\t\t\t_position.x = radiusX * Math.cos(theta);\n\t\t\t_position.z = radiusX * Math.sin(theta);\n\t\t\t_position.y = rangeY * Math.random();\n\n\t\t\t_orientation.x = Math.random() * 2 - 1;\n\t\t\t_orientation.y = Math.random() * 2 - 1;\n\t\t\t_orientation.z = Math.random() * 2 - 1;\n\t\t\t_orientation.w = Math.random() * 2 - 1;\n\t\t\t_orientation.normalize();\n\n\t\t\tconst mainScale = Math.random() * 1.9 + 0.1;\n\n\t\t\t_scale.x = (Math.random() * 0.5 + 0.5) * mainScale;\n\t\t\t_scale.y = (Math.random() * 0.5 + 0.5) * mainScale;\n\t\t\t_scale.z = (Math.random() * 0.5 + 0.5) * mainScale;\n\n\t\t\t_matrix.compose(_position, _orientation, _scale);\n\t\t\t_matrix.toArray(matrices, index * 16);\n\t\t}\n\n\t\t//\n\n\t\tconst camera = new t3d.Camera();\n\t\tcamera.outputEncoding = t3d.TEXEL_ENCODING_TYPE.SRGB;\n\t\tcamera.position.set(80, 10, 80);\n\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 0.1, 1000);\n\t\tscene.add(camera);\n\n\t\tconst controller = new OrbitControls(camera, canvas);\n\t\tcontroller.enablePan = false;\n\t\tcontroller.maxDistance = 200;\n\t\tcontroller.autoRotate = true;\n\t\tcontroller.autoRotateSpeed = 0.3;\n\n\t\tlet lastTime = 0;\n\n\t\tconst moveQ = new t3d.Quaternion(0.5, 0.5, 0.5, 0.0).normalize();\n\t\tconst tmpQ = new t3d.Quaternion();\n\t\tconst matrix = new t3d.Matrix4();\n\t\tconst rotationMatrix = new t3d.Matrix4();\n\n\t\tfunction loop(count) {\n\t\t\trequestAnimationFrame(loop);\n\n\t\t\tcontroller.update();\n\n\t\t\tconst time = performance.now();\n\n\t\t\tpointLight.intensity = Math.abs(Math.sin(time / 2000)) * 2.5;\n\n\t\t\tconst delta = (time - lastTime) / 2000;\n\t\t\ttmpQ.set(moveQ.x * delta, moveQ.y * delta, moveQ.z * delta, 1).normalize();\n\t\t\ttmpQ.toMatrix4(rotationMatrix);\n\n\t\t\tif (instancedGeometry) {\n\t\t\t\tconst matricesAttribute = instancedGeometry.getAttribute('instanceMatrix');\n\n\t\t\t\tfor (let i = 0, il = matricesAttribute.buffer.count; i < il; i++) {\n\t\t\t\t\tconst offset = i * 16;\n\t\t\t\t\tmatrix.fromArray(matricesAttribute.buffer.array, offset);\n\t\t\t\t\tmatrix.multiply(rotationMatrix);\n\t\t\t\t\tmatrix.toArray(matricesAttribute.buffer.array, offset);\n\t\t\t\t}\n\n\t\t\t\tmatricesAttribute.buffer.version++;\n\t\t\t}\n\t\t\n\t\t\tlastTime = time;\n\n\t\t\tforwardRenderer.render(scene, camera);\n\t\t}\n\t\trequestAnimationFrame(loop);\n\n\t\tfunction onWindowResize() {\n\t\t\twidth = window.innerWidth || 2;\n\t\t\theight = window.innerHeight || 2;\n\n\t\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 0.1, 1000);\n\n\t\t\tforwardRenderer.screenRenderTarget.resize(width, height);\n\t\t}\n\t\twindow.addEventListener('resize', onWindowResize, false);\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "examples/webgl_logarithmicDepthBuffer.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>t3d - logarithmic depth buffer</title>\n\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n\t<link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n</head>\n<body>\n    <div id=\"info\">\n        <a href=\"\" target=\"_blank\">t3d</a> - logarithmic depth buffer\n    </div>\n\n\t<!-- Import maps polyfill -->\n    <!-- Remove this when import maps will be widely supported -->\n    <script async src=\"./libs/es-module-shims.js\"></script>\n\n    <script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n    <script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { ForwardRenderer } from 't3d/addons/render/ForwardRenderer.js';\n\t\timport { OrbitControls } from 't3d/addons/controls/OrbitControls.js';\n\t\timport { GUI } from './libs/lil-gui.esm.min.js';\n\n\t\tlet width = window.innerWidth || 2;\n\t\tlet height = window.innerHeight || 2;\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = width;\n\t\tcanvas.height = height;\n\t\tdocument.body.appendChild(canvas);\n\n\t\tconst forwardRenderer = new ForwardRenderer(canvas);\n\n\t\tconst scene = new t3d.Scene();\n\n\t\tconst redPlane_geometry = new t3d.PlaneGeometry(100, 100);\n\t\tconst red_material = new t3d.BasicMaterial();\n\t\tred_material.diffuse.setHex(0xff0000);\n\t\tconst red_plane = new t3d.Mesh(redPlane_geometry, red_material);\n\t\tscene.add(red_plane);\n\t\t\n\t\tconst bluePlane_geometry = new t3d.PlaneGeometry(50, 50);\n\t\tconst blue_material = new t3d.BasicMaterial();\n\t\tblue_material.diffuse.setHex(0x0000ff);\n\t\tconst blue_plane = new t3d.Mesh(bluePlane_geometry, blue_material);\n\t\tblue_plane.position.y = 0.001;\n\t\tscene.add(blue_plane);\n\t\t\n\t\tscene.logarithmicDepthBuffer = true;\n\n\t\tconst camera = new t3d.Camera();\n\t\tcamera.position.set(10, 500, 200);\n\t\tcamera.lookAt(new t3d.Vector3(0, 0, 0), new t3d.Vector3(0, 1, 0));\n\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 5000);\n\t\tscene.add(camera);\n\n\t\tconst controller = new OrbitControls(camera, canvas);\n\t\t\n\t\tconst gui = new GUI();\n\t\tgui.add({ version: 'WebGL ' + forwardRenderer.capabilities.version }, 'version').disable();\n\t\tgui.add(scene, 'logarithmicDepthBuffer');\n\n\t\tfunction loop(count) {\n\t\t\trequestAnimationFrame(loop);\n\n\t\t\tcontroller.update();\n\n\t\t\tforwardRenderer.render(scene, camera);\n\t\t}\n\t\trequestAnimationFrame(loop);\n\n\t\tfunction onWindowResize() {\n\t\t\twidth = window.innerWidth || 2;\n\t\t\theight = window.innerHeight || 2;\n\n\t\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 5000);\n\n\t\t\tforwardRenderer.screenRenderTarget.resize(width, height);\n\t\t}\n\t\twindow.addEventListener('resize', onWindowResize, false);\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "examples/webgl_mesh_batch.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>t3d - webgl batched mesh</title>\n\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n\t<link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n</head>\n<body>\n\t<div id=\"info\">\n        <a href=\"\" target=\"_blank\">t3d</a> - batched mesh<br/>\n\t\t<div id=\"notSupported\" style=\"display:none\">Sorry, your graphics card + browser does not support WEBGL_multi_draw</div>\n\t</div>\n\n\t<!-- Import maps polyfill -->\n    <!-- Remove this when import maps will be widely supported -->\n    <script async src=\"./libs/es-module-shims.js\"></script>\n\n    <script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n\t<script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { ForwardRenderer } from 't3d/addons/render/ForwardRenderer.js';\n\t\timport { OrbitControls } from 't3d/addons/controls/OrbitControls.js';\n\t\timport { BatchedPBRMaterial } from 't3d/addons/materials/BatchedMaterial.js';\n\t\timport { BatchedMesh } from 't3d/addons/objects/BatchedMesh.js';\n\t\timport { SphereHelper } from 't3d/addons/objects/SphereHelper.js';\n\t\timport { Box3Helper } from 't3d/addons/objects/Box3Helper.js';\n\t\timport { GUI } from './libs/lil-gui.esm.min.js';\n\t\timport Stats from './libs/stats.module.js';\n\n\t\tlet width = window.innerWidth;\n\t\tlet height = window.innerHeight;\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = width;\n\t\tcanvas.height = height;\n\t\tdocument.body.appendChild(canvas);\n\n\t\tconst renderer = new ForwardRenderer(canvas);\n\t\trenderer.screenRenderTarget.setColorClearValue(0.1, 0.1, 0.1, 1);\n\t\trenderer.matrixAutoUpdate = false;\n\n\t\tconst capabilities = renderer.capabilities;\n\t\tif (!capabilities.getExtension('WEBGL_multi_draw')) {\n\t\t\tdocument.getElementById('notSupported').style.display = '';\n\t\t\tthrow new Error('Not supported WEBGL_multi_draw!');\n\t\t}\n\n\t\tconst scene = new t3d.Scene();\n\n\t\tconst camera = new t3d.Camera();\n\t\tcamera.outputEncoding = t3d.TEXEL_ENCODING_TYPE.SRGB;\n\t\tcamera.position.set(0, 0, 80);\n\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 1000);\n\t\tscene.add(camera);\n\n\t\tconst controls = new OrbitControls(camera, canvas);\n\t\tcontrols.maxDistance = 200;\n\t\tcontrols.autoRotate = true;\n\t\tcontrols.autoRotateSpeed = 0.3;\n\n\t\tconst ambientLight = new t3d.AmbientLight(0xffffff, 0.2);\n\t\tscene.add(ambientLight);\n\n\t\tconst directionalLight = new t3d.DirectionalLight(0xffffff, 1.8);\n\t\tdirectionalLight.lookAt(new t3d.Vector3(0, -25, -25), new t3d.Vector3(0, 1, 0));\n\t\tscene.add(directionalLight);\n\n\t\t// meshes\n\n\t\tconst MAX_INSTANCE_COUNT = 10000;\n\n\t\tconst _tempColor4 = new t3d.Color4();\n\n\t\tconst geometries = [\n\t\t\tnew t3d.BoxGeometry(2, 2, 2),\n\t\t\tnew t3d.SphereGeometry(1, 16, 8),\n\t\t\tnew t3d.CylinderGeometry(1, 1, 2, 16)\n\t\t];\n\n\t\tconst batchedMaterial = new BatchedPBRMaterial();\n\t\tbatchedMaterial.metalness = 0.4;\n\t\tbatchedMaterial.roughness = 1;\n\t\tbatchedMaterial.transparent = true;\n\t\tconst batchedMesh = new BatchedMesh(MAX_INSTANCE_COUNT, 512, 1024, batchedMaterial);\n\t\tbatchedMesh.frustumCulled = false;\n\t\tscene.add(batchedMesh);\n\n\t\tfor (let i = 0; i < geometries.length; i++) {\n\t\t\tbatchedMesh.addGeometry(geometries[i]);\n\t\t}\n\n\t\tconst regularMeshes = new t3d.Object3D();\n\t\tscene.add(regularMeshes);\n\n\t\tfunction updateMeshes(count) {\n\t\t\twhile (regularMeshes.children.length > count) {\n\t\t\t\tconst mesh = regularMeshes.children[regularMeshes.children.length - 1];\n\t\t\t\tmesh.material.dispose();\n\n\t\t\t\tregularMeshes.remove(mesh);\n\n\t\t\t\tbatchedMesh.deleteInstance(mesh.userData.batchId);\n\n\t\t\t\tif (mesh === targetMesh) {\n\t\t\t\t\tunselect();\n\t\t\t\t}\n\t\t\t}\n\n\t\t\twhile (regularMeshes.children.length < count) {\n\t\t\t\tconst mesh = createMesh();\n\t\t\n\t\t\t\tregularMeshes.add(mesh);\n\n\t\t\t\tconst batchId = batchedMesh.addInstance(mesh.userData.geometryId);\n\n\t\t\t\t_tempColor4.copy(mesh.material.diffuse);\n\t\t\t\t_tempColor4.a = mesh.material.opacity;\n\t\t\t\tbatchedMesh.setColorAt(batchId, _tempColor4);\n\t\t\t\tbatchedMesh.setMatrixAt(batchId, mesh.matrix);\n\n\t\t\t\tmesh.userData.batchId = batchId;\n\t\t\t}\n\t\t}\n\n\t\tfunction createMesh() {\n\t\t\tconst geometryId = Math.floor(Math.random() * geometries.length);\n\t\t\n\t\t\tconst geometry = geometries[geometryId];\n\n\t\t\tconst material = new t3d.PBRMaterial();\n\t\t\tmaterial.metalness = 0.4;\n\t\t\tmaterial.roughness = 1;\n\t\t\tmaterial.transparent = true;\n\n\t\t\tmaterial.diffuse.setRGB(Math.random(), Math.random(), Math.random());\n\t\t\tmaterial.opacity = 0.2 + Math.random() * 0.8;\n\n\t\t\tconst mesh = new t3d.Mesh(geometry, material);\n\t\t\tmesh.position.set(\n\t\t\t\tMath.random() * 40 - 20,\n\t\t\t\tMath.random() * 40 - 20,\n\t\t\t\tMath.random() * 40 - 20\n\t\t\t);\n\t\t\tmesh.euler.set(\n\t\t\t\tMath.random() * Math.PI * 2,\n\t\t\t\tMath.random() * Math.PI * 2,\n\t\t\t\tMath.random() * Math.PI * 2\n\t\t\t);\n\t\t\tmesh.scale.setScalar(0.5 + Math.random() * 0.5);\n\t\t\tmesh.updateMatrix();\n\n\t\t\tmesh.userData.geometryId = geometryId;\n\t\t\tmesh.userData.batchId = 0;\n\t\t\tmesh.userData.rotationSpeed = new t3d.Euler(\n\t\t\t\tMath.random() * 0.05,\n\t\t\t\tMath.random() * 0.05,\n\t\t\t\tMath.random() * 0.05\n\t\t\t);\n\t\t\n\t\t\treturn mesh;\n\t\t}\n\n\t\tfunction toggleRenderingMethod(method) {\n\t\t\tconst isBatched = method === 'Batched';\n\t\t\tbatchedMesh.visible = isBatched;\n\t\t\tregularMeshes.visible = !isBatched;\n\t\t}\n\t\t\n\t\tconst API = {\n\t\t\tmethod: 'Batched', // 'Batched' or 'Regular' rendering method\n\t\t\tcount: 512, // Number of instances to create\n\t\t\tdynamic: MAX_INSTANCE_COUNT, // Number of instances to animate\n\n\t\t\tselected: {\n\t\t\t\tcolor: new t3d.Color3(1, 1, 1),\n\t\t\t\topacity: 1,\n\t\t\t\tboundings: 'Box' // 'None', 'Box' or 'Sphere'\n\t\t\t},\n\n\t\t\tstats: {\n\t\t\t\trender: 0\n\t\t\t}\n\t\t};\n\n\t\tupdateMeshes(API.count);\n\t\ttoggleRenderingMethod(API.method);\n\n\t\t// gui\n\n\t\tconst gui = new GUI();\n\t\tgui.add(API, 'method', ['Batched', 'Regular']).onChange(toggleRenderingMethod);\n\t\tgui.add(API, 'count', 1, MAX_INSTANCE_COUNT, 1).onChange(updateMeshes);\n\t\tgui.add(API, 'dynamic', 0, MAX_INSTANCE_COUNT, 1);\n\t\tgui.add(batchedMesh, 'sortObjects');\n\t\tgui.add(batchedMesh, 'perObjectFrustumCulled');\n\n\t\tconst selectedFolder = gui.addFolder('Selected');\n\t\tselectedFolder.addColor(API.selected, 'color').onChange(value => {\n\t\t\tif (!targetMesh) return;\n\t\t\ttargetMesh.material.diffuse.copy(value);\n\t\t\tsyncInstanceColor(targetMesh);\n\t\t}).listen().disable();\n\t\tselectedFolder.add(API.selected, 'opacity', 0, 1, 0.01).onChange(value => {\n\t\t\tif (!targetMesh) return;\n\t\t\ttargetMesh.material.opacity = value;\n\t\t\tsyncInstanceColor(targetMesh);\n\t\t}).listen().disable();\n\t\tselectedFolder.add(API.selected, 'boundings', ['None', 'Box', 'Sphere']);\n\n\t\tconst statsFolder = gui.addFolder('Stats');\n\t\tstatsFolder.add(API.stats, 'render').listen().disable();\n\n\t\tfunction syncInstanceColor(mesh) {\n\t\t\t_tempColor4.copy(mesh.material.diffuse);\n\t\t\t_tempColor4.a = mesh.material.opacity;\n\t\t\tbatchedMesh.setColorAt(mesh.userData.batchId, _tempColor4);\n\t\t}\n\n\t\t// click\n\n\t\tlet isDragging = false;\n\t\tconst mouseDownPos = new t3d.Vector2();\n\t\tconst mouse = new t3d.Vector2();\n\n\t\tconst raycaster = new t3d.Raycaster();\n\n\t\tfunction onCanvasMouseDown(event) {\n\t\t\tconst rect = canvas.getBoundingClientRect();\n\t\t\tmouseDownPos.x = event.clientX - rect.left;\n\t\t\tmouseDownPos.y = event.clientY - rect.top;\n\t\t\tisDragging = false;\n\t\t}\n\n\t\tfunction onCanvasMouseMove(event) {\n\t\t\tif (event.buttons > 0) {\n\t\t\t\tconst rect = canvas.getBoundingClientRect();\n\t\t\t\tconst dx = Math.abs(event.clientX - rect.left - mouseDownPos.x);\n\t\t\t\tconst dy = Math.abs(event.clientY - rect.top - mouseDownPos.y);\n\t\t\n\t\t\t\t// Consider it a drag if mouse moved more than 3 pixels in any direction\n\t\t\t\tif (dx > 3 || dy > 3) {\n\t\t\t\t\tisDragging = true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfunction onCanvasClick(event) {\n\t\t\tevent.preventDefault();\n\t\t\n\t\t\tif (isDragging) return;\n\t\t\n\t\t\tconst rect = canvas.getBoundingClientRect();\n\t\t\tmouse.x = ((event.clientX - rect.left) / canvas.width) * 2 - 1;\n\t\t\tmouse.y = -((event.clientY - rect.top) / canvas.height) * 2 + 1;\n\n\t\t\traycaster.setFromCamera(mouse, camera);\n\n\t\t\tconst pickList = API.method === 'Batched' ? [batchedMesh] : regularMeshes.children;\n\t\t\tconst intersects = raycaster.intersectObjects(pickList);\n\n\t\t\tif (intersects.length > 0) {\n\t\t\t\tlet mesh = intersects[0].object;\n\t\t\t\tif (mesh === batchedMesh) {\n\t\t\t\t\tmesh = findMeshByBatchId(intersects[0].batchId);\n\t\t\t\t}\n\n\t\t\t\tselect(mesh);\n\t\t\t} else {\n\t\t\t\tunselect();\n\t\t\t}\n\t\t}\n\n\t\tcanvas.addEventListener('mousedown', onCanvasMouseDown);\n\t\tcanvas.addEventListener('mousemove', onCanvasMouseMove);\n\t\tcanvas.addEventListener('click', onCanvasClick);\n\n\t\tlet targetMesh = null;\n\n\t\tfunction findMeshByBatchId(batchId) {\n\t\t\tconst children = regularMeshes.children;\n\t\t\tfor (let i = 0, l = children.length; i < l; i++) {\n\t\t\t\tif (children[i].userData.batchId === batchId) {\n\t\t\t\t\treturn children[i];\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn null;\n\t\t}\n\n\t\tfunction select(mesh) {\n\t\t\ttargetMesh = mesh;\n\n\t\t\tAPI.selected.color.copy(mesh.material.diffuse);\n\t\t\tAPI.selected.opacity = mesh.material.opacity;\n\t\t\tselectedFolder.children[0].enable();\n\t\t\tselectedFolder.children[1].enable();\n\t\t}\n\n\t\tfunction unselect() {\n\t\t\ttargetMesh = null;\n\t\t\tAPI.selected.color.setRGB(1, 1, 1);\n\t\t\tAPI.selected.opacity = 1;\n\t\t\tselectedFolder.children[0].disable();\n\t\t\tselectedFolder.children[1].disable();\n\t\t}\n\n\t\tconst targetBoundingBox = new t3d.Box3();\n\t\tconst targetBoundingSphere = new t3d.Sphere();\n\n\t\tconst boundingBoxHelper = new Box3Helper(targetBoundingBox);\n\t\tboundingBoxHelper.visible = false;\n\t\tscene.add(boundingBoxHelper);\n\t\tconst boundingSphereHelper = new SphereHelper(targetBoundingSphere);\n\t\tboundingSphereHelper.visible = false;\n\t\tscene.add(boundingSphereHelper);\n\n\t\t//\n\n\t\tconst stats = new Stats();\n\t\tstats.domElement.style.position = 'absolute';\n\t\tstats.domElement.style.top = '0px';\n\t\tcanvas.parentElement.appendChild(stats.domElement);\n\n\t\tfunction loop() {\n\t\t\trequestAnimationFrame(loop);\n\n\t\t\tstats.begin();\n\n\t\t\tcontrols.update();\n\n\t\t\t// animate\n\t\t\tfor (let i = 0; i < API.dynamic; i++) {\n\t\t\t\tconst mesh = regularMeshes.children[i];\n\t\t\n\t\t\t\tif (!mesh) break;\n\t\t\n\t\t\t\tconst rotationSpeed = mesh.userData.rotationSpeed;\n\t\t\t\tmesh.euler.set(\n\t\t\t\t\tmesh.euler.x + rotationSpeed.x,\n\t\t\t\t\tmesh.euler.y + rotationSpeed.y,\n\t\t\t\t\tmesh.euler.z + rotationSpeed.z\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tscene.updateMatrix();\n\n\t\t\t// sync animations to batched mesh\n\t\t\tfor (let i = 0; i < API.dynamic; i++) {\n\t\t\t\tconst mesh = regularMeshes.children[i];\n\t\t\n\t\t\t\tif (!mesh) break;\n\t\t\n\t\t\t\tbatchedMesh.setMatrixAt(mesh.userData.batchId, mesh.matrix);\n\t\t\t}\n\n\t\t\t// update boundings for selected mesh\n\t\t\tif (targetMesh && API.selected.boundings !== 'None') {\n\t\t\t\tconst targetId = targetMesh.userData.batchId;\n\n\t\t\t\tif (API.selected.boundings === 'Box') {\n\t\t\t\t\tbatchedMesh.getBoundingBoxAt(targetId, targetBoundingBox);\n\t\t\t\t\tboundingBoxHelper.visible = true;\n\t\t\t\t\tboundingSphereHelper.visible = false;\n\t\t\t\t} else if (API.selected.boundings === 'Sphere') {\n\t\t\t\t\tbatchedMesh.getBoundingSphereAt(targetId, targetBoundingSphere);\n\t\t\t\t\tboundingBoxHelper.visible = false;\n\t\t\t\t\tboundingSphereHelper.visible = true;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tboundingBoxHelper.visible = false;\n\t\t\t\tboundingSphereHelper.visible = false;\n\t\t\t}\n\n\t\t\t// update batched mesh\n\t\t\tif (API.method === 'Batched') {\n\t\t\t\tbatchedMesh.update(camera);\n\n\t\t\t\tAPI.stats.render = batchedMesh.geometry.groups[0].multiDrawCount;\n\t\t\t} else {\n\t\t\t\tAPI.stats.render = API.count;\n\t\t\t}\n\n\t\t\trenderer.render(scene, camera);\n\n\t\t\tstats.end();\n\t\t}\n\t\trequestAnimationFrame(loop);\n\n\t\tfunction onWindowResize() {\n\t\t\twidth = window.innerWidth;\n\t\t\theight = window.innerHeight;\n\n\t\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 1000);\n\t\t\n\t\t\trenderer.screenRenderTarget.resize(width, height);\n\t\t}\n\t\twindow.addEventListener('resize', onWindowResize);\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "examples/webgl_multi_draw.html",
    "content": "<!DOCTYPE html>\n<html>\n\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>t3d - multi draw</title>\n\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n\t<link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n</head>\n\n<body>\n\t<div id=\"info\">\n\t\t<a href=\"\" target=\"_blank\">t3d</a> - multi draw<br/>\n\t\tDraw 30k planes using WEBGL_multi_draw.<br/>\n\t\tSetting multiDrawCount will have no effect if useMultiDraw is set to false.\n        <div id=\"notSupported\" style=\"display:none\">Sorry, your graphics card + browser does not support WEBGL_multi_draw</div>\n\t</div>\n\n\t<!-- Import maps polyfill -->\n    <!-- Remove this when import maps will be widely supported -->\n    <script async src=\"./libs/es-module-shims.js\"></script>\n\n    <script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n\t<script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { GeometryUtils } from 't3d/addons/geometries/GeometryUtils.js';\n\t\timport { ForwardRenderer } from 't3d/addons/render/ForwardRenderer.js';\n\t\timport { Texture2DLoader } from 't3d/addons/loaders/Texture2DLoader.js';\n\t\timport { OrbitControls } from 't3d/addons/controls/OrbitControls.js';\n\t\timport { GUI } from './libs/lil-gui.esm.min.js';\n\t\timport Stats from './libs/stats.module.js';\n\n\t\tlet width = window.innerWidth || 2;\n\t\tlet height = window.innerHeight || 2;\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = width;\n\t\tcanvas.height = height;\n\t\tdocument.body.appendChild(canvas);\n\n\t\tconst forwardRenderer = new ForwardRenderer(canvas);\n\n\t\tconst capabilities = forwardRenderer.capabilities;\n\t\tif ((!capabilities.getExtension('WEBGL_multi_draw'))) {\n\t\t\tdocument.getElementById('notSupported').style.display = '';\n\t\t\tconsole.error('Not supported WEBGL_multi_draw!');\n\t\t}\n\n\t\tconst scene = new t3d.Scene();\n\n\t\tconst ambientLight = new t3d.AmbientLight(0xffffff, 1);\n\t\tscene.add(ambientLight);\n\n\t\tconst directionalLight = new t3d.DirectionalLight(0xffffff, 1);\n\t\tdirectionalLight.lookAt(new t3d.Vector3(0, -25, -25), new t3d.Vector3(0, 1, 0));\n\t\tscene.add(directionalLight);\n\n\t\tconst material = new t3d.PBRMaterial();\n\t\tmaterial.metalness = 0.4;\n\t\tmaterial.roughness = 1;\n\t\tmaterial.diffuseMap = new Texture2DLoader().load('./resources/UV_Grid_Sm.jpg');\n\t\tmaterial.diffuseMap.encoding = t3d.TEXEL_ENCODING_TYPE.SRGB;\n\t\tmaterial.side = t3d.DRAW_SIDE.DOUBLE;\n\n\t\tconst planeGeometry = new t3d.PlaneGeometry(1, 1);\n\n\t\tconst maxNumber = 30000;\n\n\t\t// prepare two groups, one for multi draw, one for single draw\n\t\tconst multiDrawGroup = { multiDrawStarts: new Int32Array(maxNumber), multiDrawCounts: new Int32Array(maxNumber), multiDrawCount: 0, materialIndex: 0 };\n\t\tconst geometryGroup = { start: 0, count: 0, materialIndex: 0 };\n\n\t\t// prepare merged geometry\n\t\tconsole.time('merge geometry');\n\n\t\tconst cubeGeometries = [];\n\t\tconst mat = new t3d.Matrix4(), qua = new t3d.Quaternion(), euler = new t3d.Euler(), pos = new t3d.Vector3(), scale = new t3d.Vector3(1, 1, 1);\n\t\tlet start = 0, count = 0;\n\t\tfor (let i = 0; i < maxNumber; i++) {\n\t\t\t// random mat4\n\t\t\teuler.set(Math.random() * Math.PI, Math.random() * Math.PI, Math.random() * Math.PI);\n\t\t\tqua.setFromEuler(euler);\n\t\t\tpos.set(Math.random() * 50 - 25, Math.random() * 50 - 25, Math.random() * 50 - 25);\n\t\t\tscale.x = scale.z = Math.random() * 2;\n\t\t\tmat.compose(pos, qua, scale);\n\n\t\t\tconst clonedGeometry = planeGeometry.clone();\n\t\t\tGeometryUtils.applyMatrix4(clonedGeometry, mat);\n\t\t\tcubeGeometries.push(clonedGeometry);\n\n\t\t\tmultiDrawGroup.multiDrawStarts[i] = start * 2;\n\t\t\tcount = clonedGeometry.index.buffer.count;\n\t\t\tmultiDrawGroup.multiDrawCounts[i] = count;\n\t\t\tstart += count;\n\t\t}\n\t\tmultiDrawGroup.multiDrawCount = multiDrawGroup.multiDrawCounts.length;\n\t\tgeometryGroup.count = start;\n\t\t\n\t\tconst mergedGeometry = GeometryUtils.mergeGeometries(cubeGeometries);\n\t\tmergedGeometry.groups = [multiDrawGroup];\n\n\t\t// fix byte length for Uint32Array\n\t\tif (mergedGeometry.index.buffer.array instanceof Uint32Array) {\n\t\t\tconst multiDrawStarts = multiDrawGroup.multiDrawStarts;\n\t\t\tfor (let i = 0, l = multiDrawStarts.length; i < l; i++) {\n\t\t\t\tmultiDrawStarts[i] *= 2;\n\t\t\t}\n\t\t}\n\n\t\tconsole.timeEnd('merge geometry');\n\n\t\tconst mesh = new t3d.Mesh(mergedGeometry, [material]);\n\t\tscene.add(mesh);\n\n\t\tconst camera = new t3d.Camera();\n\t\tcamera.outputEncoding = t3d.TEXEL_ENCODING_TYPE.SRGB;\n\t\tcamera.position.set(50, 50, 100);\n\t\tcamera.lookAt(new t3d.Vector3(0, 0, 0), new t3d.Vector3(0, 1, 0));\n\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 1000);\n\t\tscene.add(camera);\n\n\t\tconst controller = new OrbitControls(camera, canvas);\n\n\t\tconst gui = new GUI();\n\t\tgui.add({ useMultiDraw: true }, 'useMultiDraw').onChange(value => {\n\t\t\tmergedGeometry.groups[0] = value ? multiDrawGroup : geometryGroup;\n\t\t});\n\t\tgui.add(multiDrawGroup, 'multiDrawCount', 0, multiDrawGroup.multiDrawCount, 1);\n\n\t\tconst stats = new Stats();\n\t\tstats.domElement.style.position = 'absolute';\n\t\tstats.domElement.style.top = '0px';\n\t\tcanvas.parentElement.appendChild(stats.domElement);\n\n\t\tfunction loop(count) {\n\t\t\trequestAnimationFrame(loop);\n\n\t\t\tstats.begin();\n\n\t\t\tcontroller.update();\n\n\t\t\tforwardRenderer.render(scene, camera);\n\n\t\t\tstats.end();\n\t\t}\n\n\t\trequestAnimationFrame(loop);\n\n\t\tfunction onWindowResize() {\n\t\t\twidth = window.innerWidth || 2;\n\t\t\theight = window.innerHeight || 2;\n\n\t\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 1000);\n\n\t\t\tforwardRenderer.screenRenderTarget.resize(width, height);\n\t\t}\n\t\twindow.addEventListener('resize', onWindowResize, false);\n\t</script>\n</body>\n\n</html>"
  },
  {
    "path": "examples/webgl_polygonoffset.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>t3d - polygon offset</title>\n\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n\t<link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n</head>\n<body>\n    <div id=\"info\">\n        <a href=\"\" target=\"_blank\">t3d</a> - polygon offset\n    </div>\n\n\t<!-- Import maps polyfill -->\n    <!-- Remove this when import maps will be widely supported -->\n    <script async src=\"./libs/es-module-shims.js\"></script>\n\n    <script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n    <script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { ForwardRenderer } from 't3d/addons/render/ForwardRenderer.js';\n\t\timport { OrbitControls } from 't3d/addons/controls/OrbitControls.js';\n\t\timport { GUI } from './libs/lil-gui.esm.min.js';\n\n\t\tlet width = window.innerWidth || 2;\n\t\tlet height = window.innerHeight || 2;\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = width;\n\t\tcanvas.height = height;\n\t\tdocument.body.appendChild(canvas);\n\n\t\tconst forwardRenderer = new ForwardRenderer(canvas);\n\n\t\tconst scene = new t3d.Scene();\n\n\t\tconst redPlane_geometry = new t3d.PlaneGeometry(100, 100);\n\t\tconst red_material = new t3d.BasicMaterial();\n\t\tred_material.diffuse.setHex(0xff0000);\n\t\tconst red_plane = new t3d.Mesh(redPlane_geometry, red_material);\n\t\tscene.add(red_plane);\n\t\t\n\t\tconst bluePlane_geometry = new t3d.PlaneGeometry(50, 50);\n\t\tconst blue_material = new t3d.BasicMaterial();\n\t\tblue_material.diffuse.setHex(0x0000ff);\n\t\tconst blue_plane = new t3d.Mesh(bluePlane_geometry, blue_material);\n\t\tscene.add(blue_plane);\n\t\t\n\t\tblue_material.polygonOffset = true;\n\t\tblue_material.polygonOffsetFactor = -1;\n\t\tblue_material.polygonOffsetUnits = -1;\n\n\t\tconst camera = new t3d.Camera();\n\t\tcamera.position.set(0, 80, 100);\n\t\tcamera.lookAt(new t3d.Vector3(0, 0, 0), new t3d.Vector3(0, 1, 0));\n\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 5000);\n\t\tscene.add(camera);\n\n\t\tconst controller = new OrbitControls(camera, canvas);\n\t\t\n\t\tconst gui = new GUI();\n\t\tgui.add({ version: 'WebGL ' + forwardRenderer.capabilities.version }, 'version').disable();\n\t\tgui.add(blue_material, 'polygonOffset');\n\t\tgui.add(blue_material, 'polygonOffsetFactor', -10, 10, 0.01);\n\t\tgui.add(blue_material, 'polygonOffsetUnits', -10, 10, 0.01);\n\n\t\tfunction loop(count) {\n\t\t\trequestAnimationFrame(loop);\n\n\t\t\tcontroller.update();\n\n\t\t\tforwardRenderer.render(scene, camera);\n\t\t}\n\t\trequestAnimationFrame(loop);\n\n\t\tfunction onWindowResize() {\n\t\t\twidth = window.innerWidth || 2;\n\t\t\theight = window.innerHeight || 2;\n\n\t\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 5000);\n\n\t\t\tforwardRenderer.screenRenderTarget.resize(width, height);\n\t\t}\n\t\twindow.addEventListener('resize', onWindowResize, false);\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "examples/webgl_primitive_restart.html",
    "content": "<!DOCTYPE html>\n<html>\n\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>t3d - primitive restart</title>\n\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n\t<link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n</head>\n\n<body>\n\t<div id=\"info\">\n\t\t<a href=\"\" target=\"_blank\">t3d</a> - primitive restart\n\t\t<br />\n        <div id=\"notSupported\" style=\"display:none\">\n\t\t\tYour browser does not support WebGL2.0,\n\t\t\tbut the primitive restart feature can only be used in WebGL2.0\n\t\t</div>\n\t</div>\n\n\t<!-- Import maps polyfill -->\n    <!-- Remove this when import maps will be widely supported -->\n    <script async src=\"./libs/es-module-shims.js\"></script>\n\n    <script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n    <script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { ForwardRenderer } from 't3d/addons/render/ForwardRenderer.js';\n\t\timport { OrbitControls } from 't3d/addons/controls/OrbitControls.js';\n\n\t\tlet width = window.innerWidth || 2;\n\t\tlet height = window.innerHeight || 2;\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = width;\n\t\tcanvas.height = height;\n\t\tdocument.body.appendChild(canvas);\n\n\t\tconst forwardRenderer = new ForwardRenderer(canvas);\n\t\tforwardRenderer.screenRenderTarget.setColorClearValue(0.1, 0.1, 0.1, 1);\n\n\t\tconst capabilities = forwardRenderer.capabilities;\n\t\tif (capabilities.version < 2) {\n\t\t\tdocument.getElementById('notSupported').style.display = '';\n\t\t}\n\n\t\tconst scene = new t3d.Scene();\n\n\t\tconst positionAttribute = new t3d.Attribute(new t3d.Buffer(new Float32Array([\n\t\t\t-5, -5, 0,\n\t\t\t-5, 5, 0,\n\t\t\t0, -5, 0,\n\t\t\t0, 5, 0,\n\t\t\t5, -5, 0,\n\t\t\t5, 5, 0\n\t\t]), 3));\n\n\t\tconst MAX_UNSIGNED_SHORT = 65535;\n\t\tconst indexAttribute = new t3d.Attribute(new t3d.Buffer(new Uint16Array([\n\t\t\t0, 1, 2, 3, 4, 5\n\t\t]), 1));\n\n\t\tconst index2Attribute = new t3d.Attribute(new t3d.Buffer(new Uint16Array([\n\t\t\t0, 1, 2, MAX_UNSIGNED_SHORT, 3, 4, 5\n\t\t]), 1));\n\n\t\tconst drawModes = [t3d.DRAW_MODE.LINE_STRIP, t3d.DRAW_MODE.LINE_LOOP, t3d.DRAW_MODE.TRIANGLE_STRIP];\n\t\tconst drawModeLength = drawModes.length;\n\t\tconst xStep = 8, yStep = 15;\n\t\tfor (let i = 0; i < drawModeLength; i++) {\n\t\t\tconst geometry = new t3d.Geometry();\n\t\t\tgeometry.addAttribute('a_Position', positionAttribute);\n\t\t\tgeometry.setIndex(indexAttribute);\n\t\t\tconst material = new t3d.BasicMaterial();\n\t\t\tmaterial.drawMode = drawModes[i];\n\t\t\tmaterial.side = t3d.DRAW_SIDE.DOUBLE;\n\t\t\tconst mesh = new t3d.Mesh(geometry, material);\n\t\t\tmesh.position.x = -xStep;\n\t\t\tmesh.position.y = (drawModeLength - 1) * yStep / 2 - i * yStep;\n\t\t\tscene.add(mesh);\n\n\t\t\tconst geometry2 = new t3d.Geometry();\n\t\t\tgeometry2.addAttribute('a_Position', positionAttribute);\n\t\t\tgeometry2.setIndex(index2Attribute);\n\t\t\tconst material2 = new t3d.BasicMaterial();\n\t\t\tmaterial2.drawMode = drawModes[i];\n\t\t\tmaterial2.side = t3d.DRAW_SIDE.DOUBLE;\n\t\t\tconst mesh2 = new t3d.Mesh(geometry2, material2);\n\t\t\tmesh2.position.x = xStep;\n\t\t\tmesh2.position.y = (drawModeLength - 1) * yStep / 2 - i * yStep;\n\t\t\tscene.add(mesh2);\n\t\t}\n\n\t\tconst camera = new t3d.Camera();\n\t\tcamera.position.set(0, 0, 70);\n\t\tcamera.lookAt(new t3d.Vector3(0, 0, 0), new t3d.Vector3(0, 1, 0));\n\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 1000);\n\t\tscene.add(camera);\n\n\t\tconst controller = new OrbitControls(camera, canvas);\n\t\tcontroller.target.set(0, 0, 0);\n\n\t\tfunction loop(count) {\n\t\t\trequestAnimationFrame(loop);\n\n\t\t\tcontroller.update();\n\n\t\t\tforwardRenderer.render(scene, camera);\n\t\t}\n\t\trequestAnimationFrame(loop);\n\n\t\tfunction onWindowResize() {\n\t\t\twidth = window.innerWidth || 2;\n\t\t\theight = window.innerHeight || 2;\n\n\t\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 1000);\n\n\t\t\tforwardRenderer.screenRenderTarget.resize(width, height);\n\t\t}\n\t\twindow.addEventListener('resize', onWindowResize, false);\n\t</script>\n</body>\n\n</html>"
  },
  {
    "path": "examples/webgl_query_occlusion.html",
    "content": "<!DOCTYPE html>\n<html>\n\n<head>\n    <meta charset=\"utf-8\">\n    <title>t3d - query occlusion</title>\n    <meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n    <link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n</head>\n\n<body>\n    <div id=\"info\">\n        <a href=\"\" target=\"_blank\">t3d</a> - query occlusion\n        <br/>\n        The light turns red when the ball is occluded.\n        <br/>\n\t\t<div id=\"notSupported\" style=\"display:none\">\n\t\t\tYour browser does not support WebGL2.0,\n\t\t\tbut the occlusion query feature can only be used in WebGL2.0\n\t\t</div>\n    </div>\n\n    <!-- Import maps polyfill -->\n    <!-- Remove this when import maps will be widely supported -->\n    <script async src=\"./libs/es-module-shims.js\"></script>\n\n    <script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n    <script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { OrbitControls } from 't3d/addons/controls/OrbitControls.js';\n\t\timport { Timer } from 't3d/addons/misc/Timer.js';\n\n\t\tlet width = window.innerWidth || 2;\n\t\tlet height = window.innerHeight || 2;\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = width;\n\t\tcanvas.height = height;\n\t\tdocument.body.appendChild(canvas);\n\n\t\tconst contextParams = { antialias: true, alpha: false };\n\t\tconst gl = canvas.getContext('webgl2', contextParams);\n\n\t\tif (!gl) {\n\t\t\tdocument.getElementById('notSupported').style.display = '';\n\t\t\tthrow new Error('Not supported webgl2 !');\n\t\t}\n\n\t\tconst renderer = new t3d.WebGLRenderer(gl);\n\t\tconst screenRenderTarget = new t3d.ScreenRenderTarget(canvas);\n\t\tscreenRenderTarget\n\t\t\t.setColorClearValue(0.1, 0.1, 0.1, 1)\n\t\t\t.setClear(true, true, false);\n\n\t\tconst scene = new t3d.Scene();\n\n\t\tconst camera = new t3d.Camera();\n\t\tcamera.position.set(-359, 80, 251);\n\t\tcamera.setPerspective(30 / 180 * Math.PI, width / height, 1, 1000);\n\t\tscene.add(camera);\n\n\t\tconst directionalLight = new t3d.DirectionalLight(0xffffff, 0.2);\n\t\tcamera.add(directionalLight);\n\n\t\tconst mainLight = new t3d.PointLight(0xffffff, 1, 250, 0.1);\n\t\tmainLight.position.y = 60;\n\t\tscene.add(mainLight);\n\n\t\tconst controller = new OrbitControls(camera, canvas);\n\t\tcontroller.target.set(0, 50, 0);\n\n\t\t// planes\n\n\t\tconst planeGeometry = new t3d.PlaneGeometry(100, 100);\n\n\t\tconst planeTopMaterial = new t3d.PhongMaterial();\n\t\tplaneTopMaterial.diffuse.setHex(0xffffff);\n\n\t\tconst floorMaterial = new t3d.PhongMaterial();\n\t\tfloorMaterial.diffuse.setHex(0x8F8F8F);\n\n\t\tconst wallMaterial = new t3d.PhongMaterial();\n\t\twallMaterial.diffuse.setHex(0x989898);\n\n\t\tconst planeTop = new t3d.Mesh(planeGeometry, planeTopMaterial);\n\t\tplaneTop.euler.set(Math.PI, 0, 0);\n\t\tplaneTop.position.y = 100;\n\t\tscene.add(planeTop);\n\n\t\tconst planeBottom = new t3d.Mesh(planeGeometry, floorMaterial);\n\t\tscene.add(planeBottom);\n\n\t\tconst planeBack = new t3d.Mesh(planeGeometry, wallMaterial);\n\t\tplaneBack.euler.set(90 / 180 * Math.PI, 0, 0);\n\t\tplaneBack.position.z = -50;\n\t\tplaneBack.position.y = 50;\n\t\tscene.add(planeBack);\n\n\t\tconst planeFront = new t3d.Mesh(planeGeometry, wallMaterial);\n\t\tplaneFront.euler.set(-90 / 180 * Math.PI, 0, 0);\n\t\tplaneFront.position.z = 50;\n\t\tplaneFront.position.y = 50;\n\t\tscene.add(planeFront);\n\n\t\tconst planeRight = new t3d.Mesh(planeGeometry, wallMaterial);\n\t\tplaneRight.position.x = 50;\n\t\tplaneRight.position.y = 50;\n\t\tplaneRight.euler.set(0, 0, 90 / 180 * Math.PI);\n\t\tscene.add(planeRight);\n\n\t\tconst planeLeft = new t3d.Mesh(planeGeometry, wallMaterial);\n\t\tplaneLeft.position.x = -50;\n\t\tplaneLeft.position.y = 50;\n\t\tplaneLeft.euler.set(0, 0, -90 / 180 * Math.PI);\n\t\tscene.add(planeLeft);\n\n\t\tconst phong = new t3d.PhongMaterial();\n\n\t\tconst boxGeometry = new t3d.BoxGeometry(10, 50, 30);\n\n\t\tconst cube = new t3d.Mesh(boxGeometry, phong);\n\t\tcube.position.y = 25.1;\n\t\tscene.add(cube);\n\n\t\tconst sphereGeometry = new t3d.SphereGeometry(4, 32, 32);\n\n\t\tconst sphere = new t3d.Mesh(sphereGeometry, phong);\n\t\tsphere.position.set(-20, 30, 0);\n\t\tsphere.userData.isSphere = true;\n\t\tsphere.renderOrder = 1; // Make sure the sphere render after the cube\n\t\tscene.add(sphere);\n\n\t\t// create occlusion query set\n\t\tconst querySet = new t3d.QuerySet(t3d.QUERYSET_TYPE.OCCLUSION, 1);\n\t\tscreenRenderTarget.setOcclusionQuerySet(querySet);\n\n\t\tconst renderOption = {\n\t\t\tbeforeRender: renderable => {\n\t\t\t\tif (renderable.object.userData.isSphere) {\n\t\t\t\t\trenderer.beginOcclusionQuery(0);\n\t\t\t\t}\n\t\t\t},\n\t\t\tafterRender: renderable => {\n\t\t\t\tif (renderable.object.userData.isSphere) {\n\t\t\t\t\trenderer.endOcclusionQuery();\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\tconst dstBuffer = new Array(1);\n\t\tlet reading = false;\n\n\t\tconst timer = new Timer();\n\n\t\tfunction loop(timestamp) {\n\t\t\trequestAnimationFrame(loop);\n\n\t\t\ttimer.update(timestamp);\n\n\t\t\tconst elapsedTime = timer.getElapsed();\n\t\t\tsphere.position.set(Math.cos(elapsedTime * 2) * 30, Math.abs(Math.cos(elapsedTime * 4)) * 20 + 5, Math.sin(elapsedTime * 2) * 30);\n\n\t\t\tcontroller.update();\n\n\t\t\tscene.updateMatrix();\n\t\t\tscene.updateRenderStates(camera);\n\t\t\tscene.updateRenderQueue(camera);\n\n\t\t\trenderer.renderScene(scene, camera, screenRenderTarget, renderOption);\n\n\t\t\tif (!reading) {\n\t\t\t\trenderer.readQuerySetResults(querySet, dstBuffer)\n\t\t\t\t\t.then(buffer => {\n\t\t\t\t\t\tmainLight.color.setHex(buffer[0] === 0 ? 0xFF9898 : 0x98FB98);\n\t\t\t\t\t\treading = false;\n\t\t\t\t\t});\n\t\t\t\treading = true;\n\t\t\t}\n\t\t}\n\t\trequestAnimationFrame(loop);\n\n\t\tfunction onWindowResize() {\n\t\t\twidth = window.innerWidth || 2;\n\t\t\theight = window.innerHeight || 2;\n\n\t\t\tcamera.setPerspective(30 / 180 * Math.PI, width / height, 1, 1000);\n\n\t\t\tscreenRenderTarget.resize(width, height);\n\t\t}\n\t\twindow.addEventListener('resize', onWindowResize, false);\n    </script>\n</body>\n\n</html>"
  },
  {
    "path": "examples/webgl_query_occlusion_proxy.html",
    "content": "<!DOCTYPE html>\n<html>\n\n<head>\n    <meta charset=\"utf-8\">\n    <title>t3d - occlusion query proxy</title>\n    <meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n    <link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n</head>\n\n<body>\n    <div id=\"info\">\n        <a href=\"\" target=\"_blank\">t3d</a> - occlusion query proxy<br />  \n        The sprite becomes translucent when it is occluded.<br />\n\t\tOnly available in WebGL2.0.<br />\n        <div id=\"notSupported\" style=\"display:none\">\n            Your browser does not support WebGL2.0,\n            but the occlusion query feature can only be used in WebGL2.0\n        </div>\n    </div>\n\n    <!-- Import maps polyfill -->\n    <!-- Remove this when import maps will be widely supported -->\n    <script async src=\"./libs/es-module-shims.js\"></script>\n\n    <script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n\t<script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { OrbitControls } from 't3d/addons/controls/OrbitControls.js';\n\t\timport { Texture2DLoader } from 't3d/addons/loaders/Texture2DLoader.js';\n\t\timport { Sprite } from 't3d/addons/objects/Sprite.js';\n\t\timport { PolyhedronBuilder } from 't3d/addons/geometries/builders/PolyhedronBuilder.js';\n\t\timport { OcclusionProxyManager, OcclusionProxy, OcclusionRenderOptions } from 't3d/addons/misc/OcclusionProxyManager.js';\n\t\timport TWEEN from './libs/tween.module.js';\n\t\timport { GUI } from './libs/lil-gui.esm.min.js';\n\n\t\tlet width = window.innerWidth || 2;\n\t\tlet height = window.innerHeight || 2;\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = width;\n\t\tcanvas.height = height;\n\t\tdocument.body.appendChild(canvas);\n\n\t\tconst contextParams = { antialias: true, alpha: false };\n\t\tconst gl = canvas.getContext('webgl2', contextParams);\n\n\t\tif (!gl) {\n\t\t\tdocument.getElementById('notSupported').style.display = '';\n\t\t}\n\n\t\tconst renderer = new t3d.WebGLRenderer(gl);\n\t\tconst screenRenderTarget = new t3d.ScreenRenderTarget(canvas);\n\t\tscreenRenderTarget.setColorClearValue(0.1, 0.1, 0.1, 1);\n\n\t\tconst scene = new t3d.Scene();\n\n\t\t// camera\n\n\t\tconst camera = new t3d.Camera();\n\t\tcamera.outputEncoding = t3d.TEXEL_ENCODING_TYPE.SRGB;\n\t\tcamera.position.set(-15, 10, -15);\n\t\tcamera.lookAt(new t3d.Vector3(0, 0, 0), new t3d.Vector3(0, 1, 0));\n\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 800);\n\t\tscene.add(camera);\n\n\t\tconst controller = new OrbitControls(camera, canvas);\n\n\t\t// lights\n\n\t\tconst ambientLight = new t3d.AmbientLight(0x88aaff, 0.4);\n\t\tscene.add(ambientLight);\n\n\t\tconst directionalLight = new t3d.DirectionalLight(0xffffff, 1);\n\t\tdirectionalLight.position.set(-3, 4, 5);\n\t\tdirectionalLight.lookAt(new t3d.Vector3(), new t3d.Vector3(0, 1, 0));\n\t\tscene.add(directionalLight);\n\n\t\t// sphere\n\n\t\tconst sphereGeometry = new t3d.SphereGeometry(5, 32, 32);\n\t\tconst sphereMaterial = new t3d.PBRMaterial();\n\t\tsphereMaterial.roughness = 1;\n\t\tconst sphere = new t3d.Mesh(sphereGeometry, sphereMaterial);\n\t\tscene.add(sphere);\n\n\t\t// create sprites with occlusion proxies\n\n\t\tconst proxyGeometryData = PolyhedronBuilder.getTetrahedronGeometryData(1);\n\t\tconst tetrahedronGeometry = new t3d.Geometry();\n\t\ttetrahedronGeometry.addAttribute('a_Position', new t3d.Attribute(new t3d.Buffer(new Float32Array(proxyGeometryData.positions), 3)));\n\t\ttetrahedronGeometry.computeBoundingSphere();\n\n\t\tconst proxyMaterial = new t3d.BasicMaterial();\n\t\tproxyMaterial.depthWrite = false;\n\t\tproxyMaterial.colorWrite = false;\n\t\tproxyMaterial.diffuse.setHex(0xff00ff);\n\n\t\tconst spriteTexture = new Texture2DLoader().load('./resources/sprites/sprite0.png');\n\n\t\tconst sprites = new t3d.Object3D();\n\t\tscene.add(sprites);\n\n\t\tconst tweenGroup = new TWEEN.Group();\n\n\t\tconst occlusionManager = new OcclusionProxyManager(150);\n\n\t\tfor (let i = 0; i < 150; i++) {\n\t\t\tconst radius = 5 + Math.random() * 5;\n\t\t\tconst theta = Math.random() * Math.PI;\n\t\t\tconst phi = Math.random() * Math.PI * 2;\n\n\t\t\tconst sprite = createSprite(\n\t\t\t\tradius * Math.sin(theta) * Math.cos(phi),\n\t\t\t\tradius * Math.sin(theta) * Math.sin(phi),\n\t\t\t\tradius * Math.cos(theta)\n\t\t\t);\n\t\t\tsprite.add(createProxy(sprite));\n\t\t\tsprites.add(sprite);\n\t\t}\n\n\t\tfunction createSprite(x, y, z) {\n\t\t\tconst sprite = new Sprite();\n\t\t\tsprite.position.set(x, y, z);\n\n\t\t\tsprite.renderLayer = 2;\n\t\t\tsprite.__occluded = false;\n\t\t\n\t\t\tsprite.material.diffuseMap = spriteTexture;\n\t\t\tsprite.material.transparent = true;\n\n\t\t\treturn sprite;\n\t\t}\n\n\t\tfunction createProxy(sprite) {\n\t\t\tconst proxy = new OcclusionProxy(tetrahedronGeometry, proxyMaterial);\n\t\t\tproxy.scale.setScalar(0.5); // fit the sprite size\n\t\t\tproxy.onOcclusionChange = function(occluded) {\n\t\t\t\tstyleChange(sprite, occluded);\n\t\t\t};\n\t\t\tocclusionManager.addProxy(proxy);\n\t\t\treturn proxy;\n\t\t}\n\n\t\tfunction styleChange(sprite, occluded) {\n\t\t\tif (sprite.__occluded === occluded) return;\n\t\t\tsprite.__occluded = occluded;\n\n\t\t\tif (sprite.__tween && sprite.__tween.isPlaying) {\n\t\t\t\tsprite.__tween.stop();\n\t\t\t}\n\n\t\t\tsprite.__tween = new TWEEN.Tween(sprite, tweenGroup)\n\t\t\t\t.to({ rotation: occluded ? Math.PI : 0 }, 200)\n\t\t\t\t.easing(TWEEN.Easing.Quadratic.Out)\n\t\t\t\t.start();\n\n\t\t\tsprite.material.diffuse.setHex(occluded ? 0x4D99FF : 0xFFFFFF);\n\t\t\tsprite.material.opacity = occluded ? 0.3 : 1;\n\t\t}\n\n\t\t// gui\n\n\t\tconst params = { enableOcclusionQuery: true, debug: false };\n\t\tconst gui = new GUI();\n\t\tgui.add(params, 'enableOcclusionQuery').name('Occlusion Enabled').onChange(function(value) {\n\t\t\t// reset all sprites to front style\n\t\t\tsprites.children.forEach(sprite => {\n\t\t\t\tif (value) {\n\t\t\t\t\tocclusionManager.addProxy(sprite.children[0]);\n\t\t\t\t} else {\n\t\t\t\t\tocclusionManager.removeProxy(sprite.children[0]);\n\t\t\t\t\tstyleChange(sprite, false);\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t\tgui.add(params, 'debug').name('Proxy Debug').onChange(function(value) {\n\t\t\t// show or hide occlusion proxy\n\t\t\tproxyMaterial.colorWrite = value;\n\n\t\t\t// show or hide sprites\n\t\t\tsprites.children.forEach(sprite => {\n\t\t\t\tsprite.renderable = !value;\n\t\t\t});\n\t\t});\n\n\t\t//\n\n\t\tconst renderOption = {};\n\n\t\tfunction loop(count) {\n\t\t\trequestAnimationFrame(loop);\n\n\t\t\tcontroller.update();\n\t\t\ttweenGroup.update();\n\n\t\t\tscene.updateMatrix();\n\t\t\tconst renderStates = scene.updateRenderStates(camera);\n\t\t\tconst renderQueue = scene.updateRenderQueue(camera);\n\n\t\t\t// Main layer\n\t\t\n\t\t\tconst mainLayer = renderQueue.getLayer(0);\n\n\t\t\tscreenRenderTarget.setClear(true, true, false);\n\t\t\trenderer.beginRender(screenRenderTarget);\n\t\t\trenderer.renderRenderableList(mainLayer.opaque, renderStates, renderOption);\n\t\t\trenderer.renderRenderableList(mainLayer.transparent, renderStates, renderOption);\n\t\t\trenderer.endRender();\n\n\t\t\t// Occlusion layer\n\n\t\t\tconst occlusionLayer = renderQueue.getLayer(1);\n\t\t\tif (occlusionLayer && occlusionLayer.opaqueCount > 0) {\n\t\t\t\tscreenRenderTarget.setClear(false, false, false);\n\t\t\t\tif (params.enableOcclusionQuery) {\n\t\t\t\t\tscreenRenderTarget.setOcclusionQuerySet(occlusionManager.querySet);\n\t\t\t\t}\n\t\t\n\t\t\t\trenderer.beginRender(screenRenderTarget);\n\t\t\t\trenderer.renderRenderableList(occlusionLayer.opaque, renderStates, OcclusionRenderOptions);\n\t\t\t\trenderer.endRender();\n\t\t\n\t\t\t\tscreenRenderTarget.setOcclusionQuerySet(null);\n\t\t\t}\n\n\t\t\t// Overlay layer\n\n\t\t\tconst overlayLayer = renderQueue.getLayer(2);\n\t\t\tif (overlayLayer && (overlayLayer.opaqueCount + overlayLayer.transparentCount) > 0) {\n\t\t\t\tscreenRenderTarget.setClear(false, true, false);\n\t\t\t\trenderer.beginRender(screenRenderTarget);\n\t\t\t\trenderer.renderRenderableList(overlayLayer.opaque, renderStates, renderOption);\n\t\t\t\trenderer.renderRenderableList(overlayLayer.transparent, renderStates, renderOption);\n\t\t\t\trenderer.endRender();\n\t\t\t}\n\n\t\t\t// Occlusion result sync\n\n\t\t\tif (params.enableOcclusionQuery) {\n\t\t\t\tocclusionManager.update(renderer);\n\t\t\t}\n\t\t}\n\t\trequestAnimationFrame(loop);\n\n\t\tfunction onWindowResize() {\n\t\t\twidth = window.innerWidth || 2;\n\t\t\theight = window.innerHeight || 2;\n\n\t\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 800);\n\n\t\t\tscreenRenderTarget.resize(width, height);\n\t\t}\n\t\twindow.addEventListener('resize', onWindowResize, false);\n\t</script>\n</body>\n\n</html>"
  },
  {
    "path": "examples/webgl_query_timer.html",
    "content": "<!DOCTYPE html>\n<html>\n\n<head>\n    <meta charset=\"utf-8\">\n    <title>t3d - query timer</title>\n    <meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n    <link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n</head>\n\n<body>\n    <div id=\"info\">\n        <a href=\"\" target=\"_blank\">t3d</a> - query timer\n        <br/>\n\t\t<div id=\"notSupported\" style=\"display:none\">\n\t\t\tYour browser does not support timer query.\n\t\t</div>\n    </div>\n\n    <!-- Import maps polyfill -->\n    <!-- Remove this when import maps will be widely supported -->\n    <script async src=\"./libs/es-module-shims.js\"></script>\n\n    <script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n    <script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { OrbitControls } from 't3d/addons/controls/OrbitControls.js';\n\t\timport { GUI } from './libs/lil-gui.esm.min.js';\n\n\t\tlet width = window.innerWidth || 2;\n\t\tlet height = window.innerHeight || 2;\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = width;\n\t\tcanvas.height = height;\n\t\tdocument.body.appendChild(canvas);\n\n\t\tconst contextParams = { antialias: true, alpha: false };\n\t\tconst gl = canvas.getContext('webgl2', contextParams) || canvas.getContext('webgl', contextParams);\n\n\t\tconst renderer = new t3d.WebGLRenderer(gl);\n\t\tconst screenRenderTarget = new t3d.ScreenRenderTarget(canvas);\n\t\tscreenRenderTarget\n\t\t\t.setColorClearValue(0.1, 0.1, 0.1, 1)\n\t\t\t.setClear(true, true, false);\n\n\t\tif (!renderer.capabilities.timerQuery) {\n\t\t\tdocument.getElementById('notSupported').style.display = '';\n\t\t\tthrow new Error('Your browser does not support timer query !');\n\t\t}\n\n\t\tconst scene = new t3d.Scene();\n\n\t\tconst camera = new t3d.Camera();\n\t\tcamera.position.set(1000, 500, 1000);\n\t\tcamera.lookAt(new t3d.Vector3(0, 0, 0), new t3d.Vector3(0, 1, 0));\n\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 2000);\n\t\tscene.add(camera);\n\n\t\tconst controller = new OrbitControls(camera, canvas);\n\t\tcontroller.target.set(0, 0, 0);\n\n\t\tconst ambientLight = new t3d.AmbientLight(0xffffff, 0.4);\n\t\tscene.add(ambientLight);\n\n\t\tconst directLight = new t3d.DirectionalLight(0xffffff);\n\t\tdirectLight.intensity = 0.6;\n\t\tdirectLight.position.set(40, 40, 0);\n\t\tdirectLight.lookAt(new t3d.Vector3(), new t3d.Vector3(0, 1, 0));\n\t\tscene.add(directLight);\n\n\t\t// meshes\n\n\t\tconst sphere_geometry = new t3d.SphereGeometry(20, 20, 20);\n\n\t\tfor (let i = 0; i < 2000; i++) {\n\t\t\tconst phong = new t3d.PhongMaterial();\n\t\t\tphong.diffuse.setHex(0xF9E3B1);\n\t\t\tconst sphere = new t3d.Mesh(sphere_geometry, phong);\n\t\t\tsphere.position.x = Math.random() * 500 - 250;\n\t\t\tsphere.position.y = Math.random() * 500 - 250;\n\t\t\tsphere.position.z = Math.random() * 500 - 250;\n\t\t\tscene.add(sphere);\n\t\t}\n\n\t\t// gui params\n\n\t\tconst params = { timer: 0 };\n\n\t\tconst gui = new GUI();\n\n\t\tconst capabilities = renderer.capabilities;\n\t\tgui.add({ version: 'WebGL ' + capabilities.version }, 'version').name('WebGL Version').disable();\n\t\tgui.add(capabilities, 'canUseTimestamp').name('Support Timestamp').disable();\n\t\tgui.add(params, 'timer').name('GPU Frame Time (ms)').disable().listen();\n\n\t\tconst querySet = new t3d.QuerySet(t3d.QUERYSET_TYPE.TIMESTAMP, 2);\n\t\tscreenRenderTarget.setTimestampWrites(querySet, 0, 1);\n\n\t\tlet reading = false;\n\t\tconst dstBuffer = new Array(2);\n\n\t\tfunction loop(count) {\n\t\t\trequestAnimationFrame(loop);\n\n\t\t\tcontroller.update();\n\n\t\t\tscene.updateMatrix();\n\t\t\tscene.updateRenderStates(camera);\n\t\t\tscene.updateRenderQueue(camera);\n\n\t\t\trenderer.renderScene(scene, camera, screenRenderTarget);\n\n\t\t\tif (!reading) {\n\t\t\t\trenderer.readQuerySetResults(querySet, dstBuffer)\n\t\t\t\t\t.then(buffer => {\n\t\t\t\t\t\tparams.timer = ((buffer[1] - buffer[0]) / 1e6).toFixed(4);\n\t\t\t\t\t\tsetTimeout(() => { reading = false }, 150);\n\t\t\t\t\t});\n\t\t\t\treading = true;\n\t\t\t}\n\t\t}\n\t\trequestAnimationFrame(loop);\n\n\t\tfunction onWindowResize() {\n\t\t\twidth = window.innerWidth || 2;\n\t\t\theight = window.innerHeight || 2;\n\n\t\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 2000);\n\n\t\t\tscreenRenderTarget.resize(width, height);\n\t\t}\n\t\twindow.addEventListener('resize', onWindowResize, false);\n    </script>\n</body>\n\n</html>"
  },
  {
    "path": "examples/webgl_renderinfo.html",
    "content": "<!DOCTYPE html>\n<html>\n\n<head>\n    <meta charset=\"utf-8\">\n    <title>t3d - render info</title>\n    <meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n    <link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n</head>\n\n<body>\n    <div id=\"info\">\n        <a href=\"\" target=\"_blank\">t3d</a> - render info\n    </div>\n\n    <!-- Import maps polyfill -->\n    <!-- Remove this when import maps will be widely supported -->\n    <script async src=\"./libs/es-module-shims.js\"></script>\n\n    <script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n    <script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { OrbitControls } from 't3d/addons/controls/OrbitControls.js';\n\t\timport { GUI } from './libs/lil-gui.esm.min.js';\n\n\t\tlet width = window.innerWidth || 2;\n\t\tlet height = window.innerHeight || 2;\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = width;\n\t\tcanvas.height = height;\n\t\tdocument.body.appendChild(canvas);\n\n\t\tconst gl = canvas.getContext('webgl2', {\n\t\t\tantialias: true\n\t\t});\n\n\t\tconst renderer = new t3d.WebGLRenderer(gl);\n\t\tconst screenRenderTarget = new t3d.ScreenRenderTarget(canvas);\n\t\tscreenRenderTarget\n\t\t\t.setColorClearValue(0.1, 0.1, 0.1, 1)\n\t\t\t.setClear(true, true, false);\n\n\t\tconst scene = new t3d.Scene();\n\n\t\tconst positionAttribute = new t3d.Attribute(new t3d.Buffer(new Float32Array([\n\t\t\t-5, -5, 0,\n\t\t\t-5, 5, 0,\n\t\t\t0, -5, 0,\n\t\t\t0, 5, 0,\n\t\t\t5, -5, 0,\n\t\t\t5, 5, 0\n\t\t]), 3));\n\n\t\tconst drawModes = ['LINES', 'LINE_STRIP', 'LINE_LOOP', 'TRIANGLES', 'TRIANGLE_STRIP', 'TRIANGLE_FAN', 'POINTS'];\n\n\t\tconst type = {\n\t\t\tdrawMode: 'LINES'\n\t\t};\n\n\t\tconst geometry = new t3d.Geometry();\n\t\tgeometry.addAttribute('a_Position', positionAttribute);\n\t\tconst material = new t3d.BasicMaterial();\n\t\tmaterial.side = t3d.DRAW_SIDE.DOUBLE;\n\t\tmaterial.drawMode = t3d.DRAW_MODE.LINES;\n\t\tconst mesh = new t3d.Mesh(geometry, material);\n\t\tscene.add(mesh);\n\n\t\tconst pointsMaterial = new t3d.PointsMaterial();\n\n\t\tconst camera = new t3d.Camera();\n\t\tcamera.position.set(0, 10, 30);\n\t\tcamera.lookAt(new t3d.Vector3(0, 0, 0), new t3d.Vector3(0, 1, 0));\n\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 1000);\n\t\tscene.add(camera);\n\n\t\tconst controller = new OrbitControls(camera, canvas);\n\n\t\tconst renderInfo = new t3d.RenderInfo();\n\n\t\tconst gui = new GUI();\n\t\tgui.add({ RenderInfo: 'Render' }, 'RenderInfo').disable();\n\n\t\tgui.add(type, 'drawMode', drawModes).onChange(value => {\n\t\t\tif (value == 'POINTS') {\n\t\t\t\tmesh.material = pointsMaterial;\n\t\t\t} else {\n\t\t\t\tmesh.material == pointsMaterial ? mesh.material = material : null;\n\t\t\t\tmaterial.drawMode = t3d.DRAW_MODE[value];\n\t\t\t}\n\t\t});\n\n\t\tgui.add(renderInfo.render, 'calls').disable().listen();\n\t\tgui.add(renderInfo.render, 'triangles').disable().listen();\n\t\tgui.add(renderInfo.render, 'lines').disable().listen();\n\t\tgui.add(renderInfo.render, 'points').disable().listen();\n\n\t\tfunction loop(count) {\n\t\t\trequestAnimationFrame(loop);\n\n\t\t\tcontroller.update();\n\n\t\t\tscene.updateMatrix();\n\t\t\tconst renderStates = scene.updateRenderStates(camera);\n\t\t\tconst mainLayer = scene.updateRenderQueue(camera).getLayer(0);\n\n\t\t\trenderInfo.reset();\n\n\t\t\trenderer.beginRender(screenRenderTarget);\n\t\t\trenderer.renderRenderableList(mainLayer.opaque, renderStates, { renderInfo: renderInfo });\n\t\t\trenderer.renderRenderableList(mainLayer.transparent, renderStates, { renderInfo: renderInfo });\n\t\t\trenderer.endRender();\n\t\t}\n\t\trequestAnimationFrame(loop);\n\n\t\tfunction onWindowResize() {\n\t\t\twidth = window.innerWidth || 2;\n\t\t\theight = window.innerHeight || 2;\n\n\t\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 1000);\n\n\t\t\tscreenRenderTarget.resize(width, height);\n\t\t}\n\t\twindow.addEventListener('resize', onWindowResize, false);\n    </script>\n</body>\n\n</html>"
  },
  {
    "path": "examples/webgl_shader_compile.html",
    "content": "<!DOCTYPE html>\n<html>\n\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>t3d - shader compile async</title>\n\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n\t<link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n\t<style>\n        @keyframes move {\n            0% { left: 0%; }\n            50% { left: calc(100% - 64px); }\n            100% { left: 0%; }\n        }\n        #block {\n            position: fixed;\n            top: 30%;\n            left: 0%;\n            width: 32px;\n            height: 32px;\n            background-color: #ff8002;\n\n            animation-name: move;\n            animation-duration: 2000ms;\n            animation-iteration-count: infinite;\n        }\n    </style>\n</head>\n\n<body>\n\t<div id=\"info\">\n\t\t<a href=\"\" target=\"_blank\">t3d</a> - compile shaders asynchronously\n\t\t<br/>\n\t\tTo facilitate testing, the material defines for each mesh is different.\n\t\t<br/>\n\t\t<!-- The smoothness of the block's moving indicates whether the main thread is too busy. -->\n\t\t<div id='block'></div>\n\t</div>\n\n\t<!-- Import maps polyfill -->\n\t<!-- Remove this when import maps will be widely supported -->\n\t<script async src=\"./libs/es-module-shims.js\"></script>\n\n\t<script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n\t<script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { OrbitControls } from 't3d/addons/controls/OrbitControls.js';\n\t\timport { GUI } from './libs/lil-gui.esm.min.js';\n\n\t\tlet width = window.innerWidth || 2;\n\t\tlet height = window.innerHeight || 2;\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = width;\n\t\tcanvas.height = height;\n\t\tdocument.body.appendChild(canvas);\n\n\t\tconst contextParams = { antialias: true, alpha: false };\n\t\tconst gl = canvas.getContext('webgl2', contextParams) || canvas.getContext('webgl', contextParams);\n\n\t\tconst renderer = new t3d.WebGLRenderer(gl);\n\t\tconst screenRenderTarget = new t3d.ScreenRenderTarget(canvas);\n\t\tscreenRenderTarget\n\t\t\t.setColorClearValue(0.1, 0.1, 0.1, 1)\n\t\t\t.setClear(true, true, false);\n\n\t\tconst scene = new t3d.Scene();\n\n\t\t// meshes\n\n\t\tconst meshes = [];\n\t\tconst sphere_geometry = new t3d.SphereGeometry(30, 16, 12);\n\n\t\tfor (let i = 0; i < 60; i++) {\n\t\t\tconst material = new t3d.PBRMaterial();\n\t\t\tmaterial.diffuse.setHex(0xF9E3B1);\n\t\t\tmaterial.defines.time = 0;\n\t\t\tconst sphere = new t3d.Mesh(sphere_geometry, material);\n\t\t\tsphere.position.x = Math.random() * 500 - 250;\n\t\t\tsphere.position.y = Math.random() * 500 - 250;\n\t\t\tsphere.position.z = Math.random() * 500 - 250;\n\t\t\tscene.add(sphere);\n\t\t\tmeshes.push(sphere);\n\t\t}\n\n\t\t// camera\n\n\t\tconst camera = new t3d.Camera();\n\t\tcamera.position.set(1000, 500, 1000);\n\t\tcamera.lookAt(new t3d.Vector3(0, 0, 0), new t3d.Vector3(0, 1, 0));\n\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 2000);\n\t\tscene.add(camera);\n\n\t\t// lights\n\n\t\tconst ambientLight = new t3d.AmbientLight(0xffffff, 0.4);\n\t\tscene.add(ambientLight);\n\n\t\tconst directLight = new t3d.DirectionalLight(0xffffff);\n\t\tdirectLight.intensity = 0.6;\n\t\tdirectLight.position.set(40, 40, 0);\n\t\tdirectLight.lookAt(new t3d.Vector3(), new t3d.Vector3(0, 1, 0));\n\t\tscene.add(directLight);\n\n\t\tconst controller = new OrbitControls(camera, canvas);\n\t\tcontroller.target.set(0, 0, 0);\n\n\t\tconst particleLight = new t3d.Object3D();\n\t\tscene.add(particleLight);\n\n\t\tconst pointLight = new t3d.PointLight(0xffffff, 2, 800);\n\t\tparticleLight.add(pointLight);\n\n\t\tconst lightBall_geometry = new t3d.SphereGeometry(4, 10, 10);\n\t\tconst basic = new t3d.BasicMaterial();\n\t\tbasic.diffuse.setHex(0xffffff);\n\t\tconst lightBall = new t3d.Mesh(lightBall_geometry, basic);\n\t\tparticleLight.add(lightBall);\n\n\t\tconst renderOption = {};\n\n\t\t// gui\n\t\tconst supportParallelCompile = !!renderer.capabilities.parallelShaderCompileExt;\n\n\t\tlet counter = 0, compling = false;\n\t\tconst color = new t3d.Color3();\n\t\tfunction compileShader(compileAsynchronously) {\n\t\t\trenderer.shaderCompileOptions.compileAsynchronously = compileAsynchronously;\n\n\t\t\tcolor.setHSL(Math.random(), Math.random(), 0.5);\n\t\t\n\t\t\tfor (let i = 0; i < meshes.length; i++) {\n\t\t\t\tconst mesh = meshes[i];\n\t\t\t\tconst material = mesh.material;\n\t\t\t\tmaterial.diffuse.copy(color);\n\t\t\t\tmaterial.defines['CUSTOM'] = counter++; // force recompile\n\t\t\t\tmaterial.needsUpdate = true;\n\t\t\t}\n\n\t\t\tcompling = true;\n\t\t}\n\n\t\tconst uiFunctions = {\n\t\t\tcompile: function() {\n\t\t\t\tcompileShader(false);\n\t\t\t},\n\t\t\tcompileAsync: function() {\n\t\t\t\tcompileShader(true);\n\t\t\t}\n\t\t};\n\t\t\n\t\tconst gui = new GUI();\n\t\tgui.add({ supportParallelCompile: supportParallelCompile }, 'supportParallelCompile').disable();\n\t\tgui.add(uiFunctions, 'compile');\n\t\tgui.add(uiFunctions, 'compileAsync');\n\n\t\tfunction loop(timestamp) {\n\t\t\trequestAnimationFrame(loop);\n\n\t\t\tconst timer = timestamp * 0.00025;\n\n\t\t\tparticleLight.position.x = Math.sin(timer * 7) * 300;\n\t\t\tparticleLight.position.y = Math.cos(timer * 5) * 400;\n\t\t\tparticleLight.position.z = Math.cos(timer * 3) * 300;\n\n\t\t\tcontroller.update();\n\n\t\t\tscene.updateMatrix();\n\t\t\tconst renderStates = scene.updateRenderStates(camera);\n\t\t\tconst mainLayer = scene.updateRenderQueue(camera).getLayer(0);\n\n\t\t\tif (compling) {\n\t\t\t\tconsole.time('cost');\n\t\t\t}\n\n\t\t\trenderer.beginRender(screenRenderTarget);\n\t\t\trenderer.renderRenderableList(mainLayer.opaque, renderStates, renderOption);\n\t\t\trenderer.endRender();\n\n\t\t\tif (compling) {\n\t\t\t\tconsole.log('---first frame cost after shaders changed---');\n\t\t\t\tconsole.timeEnd('cost');\n\t\t\t\tcompling = false;\n\t\t\t}\n\t\t}\n\t\trequestAnimationFrame(loop);\n\n\t\tfunction onWindowResize() {\n\t\t\twidth = window.innerWidth || 2;\n\t\t\theight = window.innerHeight || 2;\n\n\t\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 2000);\n\n\t\t\tscreenRenderTarget.resize(width, height);\n\t\t}\n\t\twindow.addEventListener('resize', onWindowResize, false);\n\t</script>\n</body>\n\n</html>"
  },
  {
    "path": "examples/webgl_shader_precompile.html",
    "content": "<!DOCTYPE html>\n<html>\n\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>t3d - shader precompile</title>\n\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n\t<link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n\t<style>\n        @keyframes move {\n            0% { left: 0%; }\n            50% { left: calc(100% - 64px); }\n            100% { left: 0%; }\n        }\n        #block {\n            position: fixed;\n            top: 30%;\n            left: 0%;\n            width: 32px;\n            height: 32px;\n            background-color: #ff8002;\n\n            animation-name: move;\n            animation-duration: 2000ms;\n            animation-iteration-count: infinite;\n        }\n    </style>\n</head>\n\n<body>\n\t<div id=\"info\">\n\t\t<a href=\"\" target=\"_blank\">t3d</a> - precompile shaders\n\t\t<br/>\n\t\tDisplayed immediately after creation VS Wait 10ms after precompile\n\t\t<br/>\n\t\tTo facilitate testing, the material defines for each mesh is different.\n\t\t<!-- The smoothness of the block's moving indicates whether the main thread is too busy. -->\n\t\t<div id='block'></div>\n\t</div>\n\n\t<!-- Import maps polyfill -->\n\t<!-- Remove this when import maps will be widely supported -->\n\t<script async src=\"./libs/es-module-shims.js\"></script>\n\n\t<script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n\t<script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { OrbitControls } from 't3d/addons/controls/OrbitControls.js';\n\t\timport { GUI } from './libs/lil-gui.esm.min.js';\n\n\t\tlet width = window.innerWidth || 2;\n\t\tlet height = window.innerHeight || 2;\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = width;\n\t\tcanvas.height = height;\n\t\tdocument.body.appendChild(canvas);\n\n\t\tconst contextParams = { antialias: true, alpha: false };\n\t\tconst gl = canvas.getContext('webgl2', contextParams) || canvas.getContext('webgl', contextParams);\n\n\t\tconst renderer = new t3d.WebGLRenderer(gl);\n\t\tconst screenRenderTarget = new t3d.ScreenRenderTarget(canvas);\n\t\tscreenRenderTarget\n\t\t\t.setColorClearValue(0.1, 0.1, 0.1, 1)\n\t\t\t.setClear(true, true, false);\n\n\t\tconst scene = new t3d.Scene();\n\n\t\t// camera\n\n\t\tconst camera = new t3d.Camera();\n\t\tcamera.position.set(1000, 500, 1000);\n\t\tcamera.lookAt(new t3d.Vector3(0, 0, 0), new t3d.Vector3(0, 1, 0));\n\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 5000);\n\t\tscene.add(camera);\n\n\t\t// lights\n\n\t\tconst ambientLight = new t3d.AmbientLight(0xffffff, 0.4);\n\t\tscene.add(ambientLight);\n\n\t\tconst directLight = new t3d.DirectionalLight(0xffffff);\n\t\tdirectLight.intensity = 0.6;\n\t\tdirectLight.position.set(40, 40, 0);\n\t\tdirectLight.lookAt(new t3d.Vector3(), new t3d.Vector3(0, 1, 0));\n\t\tscene.add(directLight);\n\n\t\tconst controller = new OrbitControls(camera, canvas);\n\t\tcontroller.target.set(0, 0, 0);\n\n\t\tconst particleLight = new t3d.Object3D();\n\t\tscene.add(particleLight);\n\n\t\tconst pointLight = new t3d.PointLight(0xffffff, 2, 800);\n\t\tparticleLight.add(pointLight);\n\n\t\tconst lightBall_geometry = new t3d.SphereGeometry(4, 10, 10);\n\t\tconst basic = new t3d.BasicMaterial();\n\t\tbasic.diffuse.setHex(0xffffff);\n\t\tconst lightBall = new t3d.Mesh(lightBall_geometry, basic);\n\t\tparticleLight.add(lightBall);\n\n\t\tconst compileList = new t3d.RenderQueueLayer(0);\n\n\t\tconst renderOption = {};\n\t\tconst compileOption = { onlyCompile: true };\n\n\t\t// gui\n\n\t\tconst supportParallelCompile = !!renderer.capabilities.parallelShaderCompileExt;\n\n\t\tlet meshes = [], watchingCreateShow = false, watchingCreatePrecompileShow = false;\n\n\t\tlet defineCount = 1;\n\t\tconst color = new t3d.Color3();\n\t\tconst sphere_geometry = new t3d.SphereGeometry(30, 16, 12);\n\n\t\tfunction createNewMeshes(first) {\n\t\t\tmeshes = [];\n\t\t\tcolor.setHSL(Math.random(), Math.random(), 0.5);\n\t\t\tfor (let i = 0; i < 60; i++) {\n\t\t\t\tconst material = new t3d.PBRMaterial();\n\t\t\t\tmaterial.diffuse.copy(color);\n\t\t\t\tmaterial.defines.time = first ? 0 : defineCount++;\n\t\t\t\tconst sphere = new t3d.Mesh(sphere_geometry, material);\n\t\t\t\tsphere.position.x = Math.random() * 500 - 250;\n\t\t\t\tsphere.position.y = Math.random() * 500 - 250;\n\t\t\t\tsphere.position.z = Math.random() * 500 - 250;\n\t\t\t\tmeshes.push(sphere);\n\t\t\t}\n\t\t\treturn meshes;\n\t\t}\n\n\t\tfunction showCreatedMeshes() {\n\t\t\tmeshes.forEach(mesh => scene.add(mesh));\n\t\t}\n\n\t\tfunction precompileCreatedMeshes() {\n\t\t\tcompileList.begin();\n\t\t\tmeshes.forEach(function(mesh) {\n\t\t\t\tcompileList.addRenderable(mesh, mesh.geometry, mesh.material, 0);\n\t\t\t});\n\t\t\tcompileList.end();\n\n\t\t\tconst renderStates = scene.updateRenderStates(camera);\n\n\t\t\trenderer.beginRender(screenRenderTarget);\n\t\t\trenderer.renderRenderableList(compileList.opaque, renderStates, compileOption);\n\t\t\trenderer.endRender();\n\t\t}\n\n\t\tcreateNewMeshes(true);\n\t\tshowCreatedMeshes();\n\n\t\tconst uiFunctions = {\n\t\t\tcreate_show: function() {\n\t\t\t\tconsole.time('show1');\n\t\t\t\tcreateNewMeshes();\n\t\t\t\tshowCreatedMeshes();\n\t\t\t\twatchingCreateShow = true;\n\t\t\t},\n\t\t\tcreate_precompile_wait_show: function() {\n\t\t\t\tconsole.time('show2');\n\t\t\t\tcreateNewMeshes();\n\t\t\t\tprecompileCreatedMeshes();\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tshowCreatedMeshes();\n\t\t\t\t\twatchingCreatePrecompileShow = true;\n\t\t\t\t}, 10);\n\t\t\t},\n\t\t\tdestroy: function() {\n\t\t\t\tconst destroyedMeshes = [];\n\t\t\t\tscene.children.forEach(node => {\n\t\t\t\t\tif (node.isMesh) {\n\t\t\t\t\t\tdestroyedMeshes.push(node);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\tdestroyedMeshes.forEach(mesh => {\n\t\t\t\t\tscene.remove(mesh);\n\t\t\t\t\tmesh.material.dispose();\n\t\t\t\t});\n\t\t\t}\n\t\t};\n\t\t\n\t\tconst gui = new GUI();\n\t\tif (supportParallelCompile) {\n\t\t\tgui.add(renderer.shaderCompileOptions, 'compileAsynchronously');\n\t\t} else {\n\t\t\tgui.add(renderer.shaderCompileOptions, 'compileAsynchronously').disable();\n\t\t}\n\t\tgui.add(uiFunctions, 'create_show');\n\t\tgui.add(uiFunctions, 'create_precompile_wait_show');\n\t\tgui.add(uiFunctions, 'destroy');\n\n\t\tfunction loop(timestamp) {\n\t\t\trequestAnimationFrame(loop);\n\n\t\t\tconst timer = timestamp * 0.00025;\n\n\t\t\tparticleLight.position.x = Math.sin(timer * 7) * 300;\n\t\t\tparticleLight.position.y = Math.cos(timer * 5) * 400;\n\t\t\tparticleLight.position.z = Math.cos(timer * 3) * 300;\n\n\t\t\tcontroller.update();\n\n\t\t\tscene.updateMatrix();\n\t\t\tconst renderStates = scene.updateRenderStates(camera);\n\t\t\tconst mainLayer = scene.updateRenderQueue(camera).getLayer(0);\n\n\t\t\trenderer.beginRender(screenRenderTarget);\n\t\t\trenderer.renderRenderableList(mainLayer.opaque, renderStates, renderOption);\n\t\t\trenderer.endRender();\n\n\t\t\tif (watchingCreateShow) {\n\t\t\t\tconsole.timeEnd('show1');\n\t\t\t\twatchingCreateShow = false;\n\t\t\t}\n\n\t\t\tif (watchingCreatePrecompileShow) {\n\t\t\t\tconsole.timeEnd('show2');\n\t\t\t\twatchingCreatePrecompileShow = false;\n\t\t\t}\n\t\t}\n\t\trequestAnimationFrame(loop);\n\n\t\tfunction onWindowResize() {\n\t\t\twidth = window.innerWidth || 2;\n\t\t\theight = window.innerHeight || 2;\n\n\t\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 5000);\n\n\t\t\tscreenRenderTarget.resize(width, height);\n\t\t}\n\t\twindow.addEventListener('resize', onWindowResize, false);\n\t</script>\n</body>\n\n</html>"
  },
  {
    "path": "examples/webgl_stencil.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>t3d - stencil</title>\n\t<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0\">\n\t<link type=\"text/css\" rel=\"stylesheet\" href=\"main.css\">\n</head>\n<body>\n    <div id=\"info\">\n        <a href=\"\" target=\"_blank\">t3d</a> - stencil\n    </div>\n\n\t<!-- Import maps polyfill -->\n    <!-- Remove this when import maps will be widely supported -->\n    <script async src=\"./libs/es-module-shims.js\"></script>\n\n    <script type=\"importmap\">\n        {\n            \"imports\": {\n                \"t3d\": \"../build/t3d.module.js\",\n                \"t3d/addons/\": \"./jsm/\"\n            }\n        }\n    </script>\n\n    <script type=\"module\">\n\t\timport * as t3d from 't3d';\n\t\timport { DirectionalLightHelper } from 't3d/addons/objects/DirectionalLightHelper.js';\n\t\timport { ForwardRenderer } from 't3d/addons/render/ForwardRenderer.js';\n\t\timport { Texture2DLoader } from 't3d/addons/loaders/Texture2DLoader.js';\n\n\t\tlet width = window.innerWidth || 2;\n\t\tlet height = window.innerHeight || 2;\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = width;\n\t\tcanvas.height = height;\n\t\tdocument.body.appendChild(canvas);\n\n\t\tconst forwardRenderer = new ForwardRenderer(canvas);\n\n\t\tconst floorTexture = new Texture2DLoader().load('./resources/hardwood2_diffuse.jpg');\n\n\t\tconst scene = new t3d.Scene();\n\t\tconst stencilScene = new t3d.Scene();\n\n\t\tconst sphere = new t3d.Mesh(new t3d.SphereGeometry(10, 20, 20), new t3d.PhongMaterial());\n\t\tsphere.castShadow = true;\n\t\tsphere.material.diffuse.setHex(0xffffff);\n\t\tscene.add(sphere);\n\n\t\tconst cube = new t3d.Mesh(new t3d.BoxGeometry(15, 15, 15), new t3d.PhongMaterial());\n\t\tcube.castShadow = true;\n\t\tcube.material.diffuse.setHex(0xffffff);\n\t\tcube.material.diffuseMap = floorTexture;\n\t\tcube.material.stencilTest = true;\n\t\tcube.material.stencilFunc = t3d.COMPARE_FUNC.LEQUAL;\n\t\tcube.material.stencilRef = 1;\n\t\tcube.material.stencilFuncMask = 1;\n\t\tcube.material.stencilFail = t3d.OPERATION.KEEP;\n\t\tcube.material.stencilZFail = t3d.OPERATION.KEEP;\n\t\tcube.material.stencilZPass = t3d.OPERATION.KEEP;\n\t\tscene.add(cube);\n\n\t\tconst plane_geometry = new t3d.PlaneGeometry(100, 100);\n\t\tconst lambert = new t3d.LambertMaterial();\n\t\tlambert.diffuse.setHex(0xffffff);\n\t\tlambert.stencilTest = true;\n\t\tlambert.stencilFunc = t3d.COMPARE_FUNC.LEQUAL;\n\t\tlambert.stencilRef = 1;\n\t\tlambert.stencilFuncMask = 1;\n\t\tlambert.stencilFail = t3d.OPERATION.KEEP;\n\t\tlambert.stencilZFail = t3d.OPERATION.KEEP;\n\t\tlambert.stencilZPass = t3d.OPERATION.KEEP;\n\t\tconst plane = new t3d.Mesh(plane_geometry, lambert);\n\t\tplane.position.y = -10;\n\t\tplane.receiveShadow = true;\n\t\tscene.add(plane);\n\n\t\tconst mask = new t3d.Mesh(new t3d.SphereGeometry(20, 20, 20), new t3d.BasicMaterial());\n\t\tmask.material.diffuse.setHex(0x000000);\n\t\tmask.material.depthWrite = false;\n\t\tmask.material.stencilTest = true;\n\t\tmask.material.stencilFunc = t3d.COMPARE_FUNC.ALWAYS;\n\t\tmask.material.stencilRef = 1;\n\t\tmask.material.stencilFuncMask = 1;\n\t\tmask.material.stencilFail = t3d.OPERATION.KEEP;\n\t\tmask.material.stencilZFail = t3d.OPERATION.KEEP;\n\t\tmask.material.stencilZPass = t3d.OPERATION.REPLACE;\n\t\tstencilScene.add(mask);\n\n\t\tconst ambientLight = new t3d.AmbientLight(0xffffff, 0.3);\n\t\tscene.add(ambientLight);\n\n\t\tconst directionalLight = new t3d.DirectionalLight(0xffffff, 0.7);\n\t\tdirectionalLight.position.set(-40, 40, 0);\n\t\tdirectionalLight.lookAt(new t3d.Vector3(), new t3d.Vector3(0, 1, 0));\n\t\tdirectionalLight.shadow.windowSize = 100;\n\t\tdirectionalLight.castShadow = true;\n\t\tscene.add(directionalLight);\n\t\t\n\t\tconst directionalLightHelper = new DirectionalLightHelper(directionalLight, 3);\n\t\tdirectionalLight.add(directionalLightHelper);\n\n\t\tconst camera = new t3d.Camera();\n\t\tcamera.position.set(0, 80, 100);\n\t\tcamera.lookAt(new t3d.Vector3(0, 0, 0), new t3d.Vector3(0, 1, 0));\n\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 1000);\n\n\t\tfunction loop(count) {\n\t\t\trequestAnimationFrame(loop);\n\n\t\t\t// rotate camera\n\t\t\tcamera.position.x = 100 * Math.sin(count / 1000 * .5);\n\t\t\tcamera.position.z = 100 * Math.cos(count / 1000 * .5);\n\t\t\tcamera.lookAt(new t3d.Vector3(0, 0, 0), new t3d.Vector3(0, 1, 0));\n\t\t\tcamera.updateMatrix();\n\n\t\t\tmask.position.z = 30 * Math.cos(count / 1000);\n\n\t\t\tdirectionalLight.color.setHex(0xffffff);\n\t\t\tdirectionalLightHelper.update();\n\t\t\tdirectionalLightHelper.visible = true;\n\t\t\tsphere.scale.set(1, 1, 1);\n\t\t\tplane.scale.set(1, 1, 1);\n\t\t\tlambert.diffuseMap = null;\n\t\t\tlambert.stencilTest = false;\n\t\t\tcube.visible = false;\n\t\t\tsphere.visible = true;\n\n\t\t\tforwardRenderer.screenRenderTarget.setClear(true, true, true);\n\t\t\tforwardRenderer.render(scene, camera);\n\t\t\n\t\t\tforwardRenderer.screenRenderTarget.setClear(false, true, false);\n\t\t\tforwardRenderer.render(stencilScene, camera);\n\n\t\t\tdirectionalLight.color.setHex(0xffaaaa);\n\t\t\tdirectionalLightHelper.visible = false;\n\t\t\tsphere.scale.set(1.1, 1.1, 1.1);\n\t\t\tplane.scale.set(1.1, 1.1, 1.1);\n\t\t\tlambert.diffuseMap = floorTexture;\n\t\t\tlambert.stencilTest = true;\n\t\t\tcube.visible = true;\n\t\t\tsphere.visible = false;\n\n\t\t\tforwardRenderer.screenRenderTarget.setClear(false, true, false);\n\t\t\tforwardRenderer.render(scene, camera);\n\t\t}\n\t\trequestAnimationFrame(loop);\n\n\t\tfunction onWindowResize() {\n\t\t\twidth = window.innerWidth || 2;\n\t\t\theight = window.innerHeight || 2;\n\n\t\t\tcamera.setPerspective(45 / 180 * Math.PI, width / height, 1, 1000);\n\n\t\t\tforwardRenderer.screenRenderTarget.resize(width, height);\n\t\t}\n\t\twindow.addEventListener('resize', onWindowResize, false);\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "package.json",
    "content": "{\n  \"name\": \"t3d\",\n  \"version\": \"0.5.3\",\n  \"description\": \"t3d.js is a lightweight, web-first, and extendable 3D rendering library.\",\n  \"type\": \"module\",\n  \"main\": \"./build/t3d.js\",\n  \"module\": \"./build/t3d.module.js\",\n  \"exports\": {\n    \".\": \"./build/t3d.module.js\",\n    \"./src/*\": \"./src/*\",\n    \"./examples/jsm/*\": \"./examples/jsm/*\",\n    \"./addons/*\": \"./examples/jsm/*\"\n  },\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/uinosoft/t3d.js\"\n  },\n  \"files\": [\n    \"build\",\n    \"examples/*.html\",\n    \"examples/jsm\",\n    \"LICENSE\",\n    \"package.json\",\n    \"README.md\",\n    \"src\"\n  ],\n  \"keywords\": [\n    \"t3d\",\n    \"t3d.js\",\n    \"javascript\",\n    \"3d\",\n    \"virtual-reality\",\n    \"augmented-reality\",\n    \"webgl\",\n    \"webgl2\",\n    \"webxr\",\n    \"canvas\",\n    \"html5\"\n  ],\n  \"author\": \"uino\",\n  \"license\": \"BSD-3-Clause\",\n  \"bugs\": {\n    \"url\": \"https://github.com/uinosoft/t3d.js/issues\"\n  },\n  \"devDependencies\": {\n    \"@babel/core\": \"^7.19.1\",\n    \"@babel/preset-env\": \"^7.19.1\",\n    \"@rollup/plugin-babel\": \"^6.0.3\",\n    \"@rollup/plugin-terser\": \"^0.4.0\",\n    \"clean-jsdoc-theme\": \"^4.2.13\",\n    \"eslint\": \"^9.25.1\",\n    \"eslint-plugin-html\": \"^8.0.0\",\n    \"eslint-plugin-import\": \"^2.28.1\",\n    \"eslint-plugin-jsdoc\": \"^61.5.0\",\n    \"globals\": \"^17.0.0\",\n    \"jsdoc\": \"^4.0.2\",\n    \"qunit\": \"^2.24.1\",\n    \"rollup\": \"^4.9.1\",\n    \"servez\": \"^2.1.1\"\n  },\n  \"scripts\": {\n    \"start\": \"npm run dev\",\n    \"test\": \"npm run lint && npm run test-unit\",\n    \"b\": \"npm run build\",\n    \"build\": \"rollup -c\",\n    \"build-module\": \"rollup -c --configOnlyModule\",\n    \"dev\": \"rollup -c -w\",\n    \"server\": \"servez -p 8080 --ssl\",\n    \"doc\": \"jsdoc -c ./tools/doc.config.json\",\n    \"lint\": \"eslint src\",\n    \"lint-fix\": \"eslint src --fix\",\n    \"lint-addons\": \"eslint examples/jsm\",\n    \"lint-addons-fix\": \"eslint examples/jsm --fix\",\n    \"lint-examples\": \"eslint \\\"examples/**/*.html\\\"\",\n    \"lint-examples-fix\": \"eslint \\\"examples/**/*.html\\\" --fix\",\n    \"lint-tests\": \"eslint tests\",\n    \"test-unit\": \"qunit tests/unit/source.unit.js\"\n  }\n}\n"
  },
  {
    "path": "rollup.config.js",
    "content": "import { babel } from '@rollup/plugin-babel';\nimport terser from '@rollup/plugin-terser';\n\nconst babelrc = {\n\tpresets: [\n\t\t[\n\t\t\t'@babel/preset-env',\n\t\t\t{\n\t\t\t\tmodules: false,\n\t\t\t\ttargets: '>0.3%, not dead',\n\t\t\t\tloose: true,\n\t\t\t\tbugfixes: true\n\t\t\t}\n\t\t]\n\t]\n};\n\nfunction glsl() {\n\treturn {\n\t\ttransform(code, id) {\n\t\t\tif (/\\.glsl$/.test(id) === false) return;\n\n\t\t\tconst transformedCode = 'export default ' + JSON.stringify(\n\t\t\t\tcode\n\t\t\t\t\t.trim()\n\t\t\t\t\t.replace(/\\r/g, '')\n\t\t\t\t\t.replace(/[ \\t]*\\/\\/.*\\n/g, '') // remove //\n\t\t\t\t\t.replace(/[ \\t]*\\/\\*[\\s\\S]*?\\*\\//g, '') // remove /* */\n\t\t\t\t\t.replace(/\\n{2,}/g, '\\n') // # \\n+ to \\n\n\t\t\t) + ';';\n\n\t\t\treturn {\n\t\t\t\tcode: transformedCode,\n\t\t\t\tmap: { mappings: '' }\n\t\t\t};\n\t\t}\n\t};\n}\n\nfunction babelCleanup() {\n\tconst doubleSpaces = / {2}/g;\n\treturn {\n\t\ttransform(code) {\n\t\t\tcode = code.replace(doubleSpaces, '\\t');\n\t\t\treturn {\n\t\t\t\tcode: code,\n\t\t\t\tmap: null\n\t\t\t};\n\t\t}\n\t};\n}\n\nconst headerString = `/**\n * @license\n * Copyright 2021-present uino\n * SPDX-License-Identifier: BSD-3-Clause\n */\\n`;\n\nfunction header() {\n\treturn {\n\t\trenderChunk(code) {\n\t\t\treturn headerString + code;\n\t\t}\n\t};\n}\n\nconst builds = [\n\t{\n\t\tinput: 'src/main.js',\n\t\tplugins: [\n\t\t\tglsl(),\n\t\t\theader()\n\t\t],\n\t\toutput: [\n\t\t\t{\n\t\t\t\tformat: 'esm',\n\t\t\t\tfile: 'build/t3d.module.js'\n\t\t\t}\n\t\t]\n\t},\n\t{\n\t\tinput: 'src/main.js',\n\t\tplugins: [\n\t\t\tglsl(),\n\t\t\tbabel({\n\t\t\t\tbabelHelpers: 'bundled',\n\t\t\t\tcompact: false,\n\t\t\t\tbabelrc: false,\n\t\t\t\t...babelrc\n\t\t\t}),\n\t\t\tbabelCleanup(),\n\t\t\theader()\n\t\t],\n\t\toutput: [\n\t\t\t{\n\t\t\t\tformat: 'umd',\n\t\t\t\tname: 't3d',\n\t\t\t\tfile: 'build/t3d.js',\n\t\t\t\tindent: '\\t'\n\t\t\t}\n\t\t]\n\t},\n\t{\n\t\tinput: 'src/main.js',\n\t\tplugins: [\n\t\t\tglsl(),\n\t\t\tbabel({\n\t\t\t\tbabelHelpers: 'bundled',\n\t\t\t\tbabelrc: false,\n\t\t\t\t...babelrc\n\t\t\t}),\n\t\t\tbabelCleanup(),\n\t\t\tterser(),\n\t\t\theader()\n\t\t],\n\t\toutput: [\n\t\t\t{\n\t\t\t\tformat: 'umd',\n\t\t\t\tname: 't3d',\n\t\t\t\tfile: 'build/t3d.min.js'\n\t\t\t}\n\t\t]\n\t}\n];\n\nexport default args => args.configOnlyModule ? builds[0] : builds;"
  },
  {
    "path": "src/EventDispatcher.js",
    "content": "/**\n * JavaScript events for custom objects.\n */\nclass EventDispatcher {\n\n\t/**\n\t * Adds a listener to an event type.\n\t * @param {string} type - The type of event to listen to.\n\t * @param {Function} listener - The function that gets called when the event is fired.\n\t */\n\taddEventListener(type, listener) {\n\t\tif (this._listeners === undefined) this._listeners = {};\n\n\t\tconst listeners = this._listeners;\n\n\t\tif (listeners[type] === undefined) {\n\t\t\tlisteners[type] = [];\n\t\t}\n\n\t\tif (listeners[type].indexOf(listener) === -1) {\n\t\t\tlisteners[type].push(listener);\n\t\t}\n\t}\n\n\t/**\n\t * Removes a listener from an event type.\n\t * @param {string} type - The type of the listener that gets removed.\n\t * @param {Function} listener - The listener function that gets removed.\n\t */\n\tremoveEventListener(type, listener) {\n\t\tconst listeners = this._listeners;\n\n\t\tif (listeners === undefined) return;\n\n\t\tconst listenerArray = listeners[type];\n\n\t\tif (listenerArray !== undefined) {\n\t\t\tconst index = listenerArray.indexOf(listener);\n\n\t\t\tif (index !== -1) {\n\t\t\t\tlistenerArray.splice(index, 1);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Fire an event.\n\t * @param {object} event - The event that gets fired.\n\t */\n\tdispatchEvent(event) {\n\t\tconst listeners = this._listeners;\n\n\t\tif (listeners === undefined) return;\n\n\t\tconst listenerArray = listeners[event.type];\n\n\t\tif (listenerArray !== undefined) {\n\t\t\tevent.target = this;\n\n\t\t\t// Make a copy, in case listeners are removed while iterating.\n\t\t\tconst array = listenerArray.slice(0);\n\n\t\t\tfor (let i = 0, l = array.length; i < l; i++) {\n\t\t\t\tarray[i].call(this, event);\n\t\t\t}\n\n\t\t\tevent.target = null;\n\t\t}\n\t}\n\n}\n\nexport { EventDispatcher };"
  },
  {
    "path": "src/animation/AnimationAction.js",
    "content": "import { BLEND_TYPE } from '../const.js';\nimport { EventDispatcher } from '../EventDispatcher.js';\n\n/**\n * AnimationAction wraps AnimationClip and is mainly responsible for the update logic of time.\n * You can extend other functions by inheriting this class, such as repeat playback, pingpang, etc.\n * And since this class inherits from EventDispatcher, animation events can also be extended.\n * @extends EventDispatcher\n */\nclass AnimationAction extends EventDispatcher {\n\n\t/**\n\t * @param {KeyframeClip} clip - The keyframe clip for this action.\n\t */\n\tconstructor(clip) {\n\t\tsuper();\n\n\t\t/**\n\t\t * The keyframe clip for this action.\n\t\t * @type {KeyframeClip}\n\t\t */\n\t\tthis.clip = clip;\n\n\t\t/**\n\t\t * The degree of influence of this action (in the interval [0, 1]).\n\t\t * Values can be used to blend between several actions.\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.weight = 0;\n\n\t\t/**\n\t\t * The local time of this action (in seconds).\n\t\t * @type {number}\n\t\t */\n\t\tthis.time = 0;\n\n\t\t/**\n\t\t * The blend mode for this action, currently only two values BLEND_TYPE.NORMAL and BLEND_TYPE.ADD are available.\n\t\t * @type {BLEND_TYPE}\n\t\t * @default {BLEND_TYPE.NORMAL}\n\t\t */\n\t\tthis.blendMode = BLEND_TYPE.NORMAL;\n\t}\n\n\t/**\n\t * Update time.\n\t * @param {number} deltaTime - The delta time in seconds.\n\t */\n\tupdate(deltaTime) {\n\t\tthis.time += deltaTime;\n\n\t\tconst endTime = this.clip.duration;\n\n\t\tif (endTime === 0) {\n\t\t\tthis.time = 0;\n\t\t\treturn;\n\t\t}\n\n\t\tif (this.time > endTime) {\n\t\t\tthis.time = this.time % endTime;\n\t\t}\n\n\t\tif (this.time < 0) {\n\t\t\tthis.time = this.time % endTime + endTime;\n\t\t}\n\t}\n\n}\n\nexport { AnimationAction };"
  },
  {
    "path": "src/animation/AnimationMixer.js",
    "content": "import { PropertyBindingMixer } from './PropertyBindingMixer.js';\nimport { BLEND_TYPE } from '../const.js';\n\n/**\n * The AnimationMixer is a player for animations on a particular object in the scene.\n * When multiple objects in the scene are animated independently, one AnimationMixer may be used for each object.\n */\nclass AnimationMixer {\n\n\tconstructor() {\n\t\tthis._actions = [];\n\t\tthis._bindings = {};\n\t}\n\n\t/**\n\t * Add an action to this mixer.\n\t * @param {AnimationAction} action - The action to add.\n\t */\n\taddAction(action) {\n\t\tif (this._actions.indexOf(action) !== -1) {\n\t\t\tconsole.warn('AnimationMixer.addAction(): already has the action, clip name is <' + action.clip.name + '>.');\n\t\t\treturn;\n\t\t}\n\n\t\tthis._actions.push(action);\n\n\t\tconst tracks = action.clip.tracks;\n\n\t\tfor (let i = 0; i < tracks.length; i++) {\n\t\t\tconst track = tracks[i];\n\t\t\tconst trackName = track.name;\n\n\t\t\tif (!this._bindings[trackName]) {\n\t\t\t\tconst binding = new PropertyBindingMixer(track.target, track.propertyPath, track.valueTypeName, track.valueSize);\n\t\t\t\tthis._bindings[trackName] = { binding, referenceCount: 0, active: false, cachedActive: false };\n\t\t\t}\n\n\t\t\tthis._bindings[trackName].referenceCount++;\n\t\t}\n\t}\n\n\t/**\n\t * Remove an action from this mixer.\n\t * @param {AnimationAction} action - The action to be removed.\n\t */\n\tremoveAction(action) {\n\t\tconst index = this._actions.indexOf(action);\n\n\t\tif (index === -1) {\n\t\t\tconsole.warn('AnimationMixer.removeAction(): action not found in this mixer, clip name is <' + action.clip.name + '>.');\n\t\t\treturn;\n\t\t}\n\n\t\tif (action.weight > 0) {\n\t\t\tconsole.warn('AnimationMixer.removeAction(): make sure action\\'s weight is zero before removing it.');\n\t\t\treturn;\n\t\t}\n\n\t\tthis._actions.splice(index, 1);\n\n\t\tconst tracks = action.clip.tracks;\n\n\t\tfor (let i = 0; i < tracks.length; i++) {\n\t\t\tconst trackName = tracks[i].name;\n\t\t\tconst bindingInfo = this._bindings[trackName];\n\n\t\t\tif (bindingInfo) {\n\t\t\t\tif (--bindingInfo.referenceCount <= 0) {\n\t\t\t\t\tif (bindingInfo.cachedActive) {\n\t\t\t\t\t\tbindingInfo.binding.restoreOriginalState();\n\t\t\t\t\t}\n\t\t\t\t\tdelete this._bindings[trackName];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Whether has this action.\n\t * @param {AnimationAction} action - The action.\n\t * @returns {boolean}\n\t */\n\thasAction(action) {\n\t\treturn this._actions.indexOf(action) > -1;\n\t}\n\n\t/**\n\t * Get all actions.\n\t * @returns {AnimationAction[]}\n\t */\n\tgetActions() {\n\t\treturn this._actions;\n\t}\n\n\t/**\n\t * Advances the global mixer time and updates the animation.\n\t * @param {number} deltaTime - The delta time in seconds.\n\t */\n\tupdate(deltaTime) {\n\t\t// Mark active to false for all bindings.\n\n\t\tfor (const bindingName in this._bindings) {\n\t\t\tthis._bindings[bindingName].active = false;\n\t\t}\n\n\t\t// Update the time of actions with a weight greater than 1\n\t\t// And accumulate those bindings\n\n\t\tfor (let i = 0, l = this._actions.length; i < l; i++) {\n\t\t\tconst action = this._actions[i];\n\t\t\tif (action.weight > 0) {\n\t\t\t\taction.update(deltaTime);\n\n\t\t\t\tconst tracks = action.clip.tracks;\n\n\t\t\t\tfor (let j = 0, tl = tracks.length; j < tl; j++) {\n\t\t\t\t\tconst track = tracks[j];\n\t\t\t\t\tconst bindingInfo = this._bindings[track.name];\n\t\t\t\t\tconst binding = bindingInfo.binding;\n\n\t\t\t\t\tbindingInfo.active = true;\n\n\t\t\t\t\tif (!bindingInfo.cachedActive) {\n\t\t\t\t\t\tbindingInfo.binding.saveOriginalState();\n\t\t\t\t\t\tbindingInfo.cachedActive = true;\n\t\t\t\t\t}\n\n\t\t\t\t\ttrack.getValue(action.time, binding.buffer);\n\n\t\t\t\t\tif (action.blendMode === BLEND_TYPE.ADD) {\n\t\t\t\t\t\tbinding.accumulateAdditive(action.weight);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tbinding.accumulate(action.weight);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Apply all bindings.\n\n\t\tfor (const bindingName in this._bindings) {\n\t\t\tconst bindingInfo = this._bindings[bindingName];\n\t\t\tif (bindingInfo.active) {\n\t\t\t\tbindingInfo.binding.apply();\n\t\t\t} else {\n\t\t\t\tif (bindingInfo.cachedActive) {\n\t\t\t\t\tbindingInfo.binding.restoreOriginalState();\n\t\t\t\t\tbindingInfo.cachedActive = false;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n}\n\nexport { AnimationMixer };"
  },
  {
    "path": "src/animation/KeyframeClip.js",
    "content": "/**\n * An KeyframeClip is a reusable set of keyframe tracks which represent an animation.\n */\nclass KeyframeClip {\n\n\t/**\n\t * @param {string} [name=''] - A name for this clip.\n\t * @param {KeyframeTrack[]} [tracks=[]] - An array of KeyframeTracks.\n\t * @param {number} [duration] - The duration of this clip (in seconds). If not passed, the duration will be calculated from the passed tracks array.\n\t */\n\tconstructor(name = '', tracks = [], duration = -1) {\n\t\t/**\n\t\t * A name for this clip.\n\t\t * @type {string}\n\t\t */\n\t\tthis.name = name;\n\n\t\t/**\n\t\t * An array of KeyframeTracks.\n\t\t * @type {KeyframeTrack[]}\n\t\t */\n\t\tthis.tracks = tracks;\n\n\t\t/**\n\t\t * The duration of this clip (in seconds).\n\t\t * If a negative value is passed, the duration will be calculated from the passed tracks array.\n\t\t * @type {number}\n\t\t */\n\t\tthis.duration = duration;\n\n\t\tif (this.duration < 0) {\n\t\t\tthis.resetDuration();\n\t\t}\n\t}\n\n\t/**\n\t * Sets the duration of the clip to the duration of its longest KeyframeTrack.\n\t * @returns {KeyframeClip}\n\t */\n\tresetDuration() {\n\t\tconst tracks = this.tracks;\n\t\tlet duration = 0;\n\n\t\tfor (let i = 0, l = tracks.length; i < l; i++) {\n\t\t\tconst track = tracks[i];\n\t\t\tduration = Math.max(duration, track.times[track.times.length - 1]);\n\t\t}\n\n\t\tthis.duration = duration;\n\n\t\treturn this;\n\t}\n\n}\n\nexport { KeyframeClip };"
  },
  {
    "path": "src/animation/KeyframeInterpolants.js",
    "content": "import { Quaternion } from '../math/Quaternion.js';\n\n/**\n * Interpolant serves as the base class for all interpolation algorithms.\n * It defines a set of static methods that are intended to be invoked by a keyframe track for the purpose of interpolation.\n * @abstract\n */\nclass KeyframeInterpolant {\n\n\t/**\n\t * Get the value size for keyframe values.\n\t * @returns {number} - the value size.\n\t */\n\tstatic getValueSize() {\n\t\treturn this.values.length / this.times.length;\n\t}\n\n\t/**\n\t * Interpolate the value for the specified time.\n\t * @param {number} index0 - the index of the first keyframe.\n\t * @param {number} ratio - the ratio (0-1) of the time passed between the first keyframe and the next keyframe.\n\t * @param {number} duration - the duration time between the first keyframe and the next keyframe.\n\t * @param {Array} outBuffer - the output buffer to store the interpolated value.\n\t * @returns {Array} - the output buffer to store the interpolated value.\n\t */\n\tstatic interpolate(index0, ratio, duration, outBuffer) {\n\t\tthrow new Error('Interpolant: call to abstract method');\n\t}\n\n\t/**\n\t * Copy the value for the specified index.\n\t * @param {number} index - the index of the keyframe.\n\t * @param {Array} outBuffer - the output buffer to store the copied value.\n\t * @returns {Array} - the output buffer to store the copied value.\n\t */\n\tstatic copyValue(index, outBuffer) {\n\t\tconst values = this.values,\n\t\t\tvalueSize = this.valueSize,\n\t\t\toffset = valueSize * index;\n\n\t\tfor (let i = 0; i < valueSize; i++) {\n\t\t\toutBuffer[i] = values[offset + i];\n\t\t}\n\n\t\treturn outBuffer;\n\t}\n\n}\n\n/**\n * Step (Discrete) interpolation of keyframe values.\n * @extends KeyframeInterpolant\n */\nclass StepInterpolant extends KeyframeInterpolant {\n\n\tstatic interpolate(index0, ratio, duration, outBuffer) {\n\t\tconst values = this.values,\n\t\t\tvalueSize = this.valueSize,\n\t\t\toffset = valueSize * index0;\n\n\t\tfor (let i = 0; i < valueSize; i++) {\n\t\t\toutBuffer[i] = values[offset + i];\n\t\t}\n\n\t\treturn outBuffer;\n\t}\n\n}\n\n/**\n * Linear interpolation of keyframe values.\n * @extends KeyframeInterpolant\n */\nclass LinearInterpolant extends KeyframeInterpolant {\n\n\tstatic interpolate(index0, ratio, duration, outBuffer) {\n\t\tconst values = this.values,\n\t\t\tvalueSize = this.valueSize,\n\n\t\t\toffset0 = index0 * valueSize,\n\t\t\toffset1 = (index0 + 1) * valueSize;\n\n\t\tlet value1, value2;\n\n\t\tfor (let i = 0; i < valueSize; i++) {\n\t\t\tvalue1 = values[offset0 + i];\n\t\t\tvalue2 = values[offset1 + i];\n\n\t\t\tif (value1 !== undefined && value2 !== undefined) {\n\t\t\t\toutBuffer[i] = value1 * (1 - ratio) + value2 * ratio;\n\t\t\t} else {\n\t\t\t\toutBuffer[i] = value1;\n\t\t\t}\n\t\t}\n\n\t\treturn outBuffer;\n\t}\n\n}\n\n/**\n * Quaternion Linear interpolation of keyframe values.\n * @extends KeyframeInterpolant\n */\nclass QuaternionLinearInterpolant extends KeyframeInterpolant {\n\n\tstatic interpolate(index0, ratio, duration, outBuffer) {\n\t\tconst values = this.values,\n\t\t\tvalueSize = this.valueSize;\n\n\t\tQuaternion.slerpFlat(outBuffer, 0, values, index0 * valueSize, values, (index0 + 1) * valueSize, ratio);\n\n\t\treturn outBuffer;\n\t}\n\n}\n\n/**\n * Cubic spline interpolation of keyframe values.\n * @extends KeyframeInterpolant\n */\nclass CubicSplineInterpolant extends KeyframeInterpolant {\n\n\tstatic getValueSize() {\n\t\treturn this.values.length / this.times.length / 3;\n\t}\n\n\tstatic interpolate(index0, ratio, duration, outBuffer) {\n\t\tconst values = this.values,\n\t\t\tvalueSize = this.valueSize,\n\n\t\t\tvalueSize2 = valueSize * 2,\n\t\t\tvalueSize3 = valueSize * 3,\n\n\t\t\trr = ratio * ratio,\n\t\t\trrr = rr * ratio,\n\n\t\t\toffset0 = index0 * valueSize3,\n\t\t\toffset1 = offset0 + valueSize3,\n\n\t\t\ts2 = -2 * rrr + 3 * rr,\n\t\t\ts3 = rrr - rr,\n\t\t\ts0 = 1 - s2,\n\t\t\ts1 = s3 - rr + ratio;\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 < valueSize; i++) {\n\t\t\tconst p0 = values[offset0 + i + valueSize], // splineVertex_k\n\t\t\t\tm0 = values[offset0 + i + valueSize2] * duration, // outTangent_k * (t_k+1 - t_k)\n\t\t\t\tp1 = values[offset1 + i + valueSize], // splineVertex_k+1\n\t\t\t\tm1 = values[offset1 + i] * duration; // inTangent_k+1 * (t_k+1 - t_k)\n\n\t\t\toutBuffer[i] = s0 * p0 + s1 * m0 + s2 * p1 + s3 * m1;\n\t\t}\n\n\t\treturn outBuffer;\n\t}\n\n\tstatic copyValue(index, outBuffer) {\n\t\tconst values = this.values,\n\t\t\tvalueSize = this.valueSize,\n\t\t\toffset = valueSize * index * 3 + valueSize;\n\n\t\tfor (let i = 0; i < valueSize; i++) {\n\t\t\toutBuffer[i] = values[offset + i];\n\t\t}\n\n\t\treturn outBuffer;\n\t}\n\n}\n\n/**\n * Quaternion Cubic spline interpolation of keyframe values.\n * @extends CubicSplineInterpolant\n */\nclass QuaternionCubicSplineInterpolant extends CubicSplineInterpolant {\n\n\tstatic interpolate(index0, ratio, duration, outBuffer) {\n\t\tconst result = super.interpolate(index0, ratio, duration, outBuffer);\n\n\t\t_q.fromArray(result).normalize().toArray(result);\n\n\t\treturn result;\n\t}\n\n}\n\nconst _q = new Quaternion();\n\nexport { KeyframeInterpolant, StepInterpolant, LinearInterpolant, QuaternionLinearInterpolant, CubicSplineInterpolant, QuaternionCubicSplineInterpolant };"
  },
  {
    "path": "src/animation/KeyframeTrack.js",
    "content": "import { LinearInterpolant, StepInterpolant } from './KeyframeInterpolants.js';\n\n/**\n * Base class for property track.\n * @abstract\n */\nclass KeyframeTrack {\n\n\t/**\n\t * @param {Object3D|Material} target\n\t * @param {string} propertyPath\n\t * @param {Array} times\n\t * @param {Array} values\n\t * @param {KeyframeInterpolant.constructor} [interpolant=LinearInterpolant]\n\t */\n\tconstructor(target, propertyPath, times, values, interpolant = LinearInterpolant) {\n\t\tthis.target = target;\n\t\tthis.propertyPath = propertyPath;\n\n\t\tthis.name = this.target.uuid + '.' + propertyPath;\n\n\t\tthis.times = times;\n\t\tthis.values = values;\n\n\t\tthis.valueSize = 0;\n\t\tthis.interpolant = null;\n\n\t\t// since 0.2.2, remove this after few versions later\n\t\tif (interpolant === true) {\n\t\t\tinterpolant = LinearInterpolant;\n\t\t} else if (interpolant === false) {\n\t\t\tinterpolant = StepInterpolant;\n\t\t}\n\n\t\tthis.setInterpolant(interpolant);\n\t}\n\n\t/**\n\t * Set interpolant for this keyframe track.\n\t * @param {KeyframeInterpolant.constructor} interpolant\n\t * @returns {KeyframeTrack}\n\t */\n\tsetInterpolant(interpolant) {\n\t\tthis.valueSize = interpolant.getValueSize.call(this);\n\t\tthis.interpolant = interpolant;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Get value at time.\n\t * The value will be interpolated by interpolant if time is between keyframes.\n\t * @param {number} t - time\n\t * @param {Array} outBuffer - output buffer\n\t * @returns {Array} output buffer\n\t */\n\tgetValue(t, outBuffer) {\n\t\tconst interpolant = this.interpolant,\n\t\t\ttimes = this.times,\n\t\t\ttl = times.length;\n\n\t\tif (t <= times[0]) {\n\t\t\treturn interpolant.copyValue.call(this, 0, outBuffer);\n\t\t} else if (t >= times[tl - 1]) {\n\t\t\treturn interpolant.copyValue.call(this, tl - 1, outBuffer);\n\t\t}\n\n\t\t// TODO use index cache for better performance\n\t\t// https://github.com/mrdoob/three.js/blob/dev/src/math/Interpolant.js\n\t\tlet i0 = tl - 1;\n\t\twhile (t < times[i0] && i0 > 0) {\n\t\t\ti0--;\n\t\t}\n\n\t\tconst duration = times[i0 + 1] - times[i0];\n\t\tconst ratio = (t - times[i0]) / duration;\n\t\treturn interpolant.interpolate.call(this, i0, ratio, duration, outBuffer);\n\t}\n\n}\n\nexport { KeyframeTrack };"
  },
  {
    "path": "src/animation/PropertyBindingMixer.js",
    "content": "import { Quaternion } from '../math/Quaternion.js';\n\n/**\n * This holds a reference to a real property in the scene graph; used internally.\n * Binding property and value, mixer for multiple values.\n */\nclass PropertyBindingMixer {\n\n\t/**\n\t * @param {Object3D|Material} target\n\t * @param {string} propertyPath\n\t * @param {string} typeName - vector/bool/string/quaternion/number/color\n\t * @param {number} valueSize\n\t */\n\tconstructor(target, propertyPath, typeName, valueSize) {\n\t\tthis.target = null;\n\n\t\tthis.property = '';\n\n\t\tthis.parseBinding(target, propertyPath);\n\n\t\tthis.valueSize = valueSize;\n\n\t\tlet BufferType = Float64Array;\n\t\tlet mixFunction, mixFunctionAdditive, setIdentity;\n\n\t\tswitch (typeName) {\n\t\t\tcase 'quaternion':\n\t\t\t\tmixFunction = slerp;\n\t\t\t\tmixFunctionAdditive = slerpAdditive;\n\t\t\t\tsetIdentity = setIdentityQuaternion;\n\t\t\t\tbreak;\n\t\t\tcase 'string':\n\t\t\tcase 'bool':\n\t\t\t\tBufferType = Array;\n\t\t\t\tmixFunction = select;\n\t\t\t\tmixFunctionAdditive = select;\n\t\t\t\tsetIdentity = setIdentityOther;\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tmixFunction = lerp;\n\t\t\t\tmixFunctionAdditive = lerpAdditive;\n\t\t\t\tsetIdentity = setIdentityNumeric;\n\t\t}\n\n\t\t// [ incoming | accu | orig | addAccu ]\n\t\tthis.buffer = new BufferType(valueSize * 4);\n\n\t\tthis._mixBufferFunction = mixFunction;\n\t\tthis._mixBufferFunctionAdditive = mixFunctionAdditive;\n\t\tthis._setIdentity = setIdentity;\n\n\t\tthis.cumulativeWeight = 0;\n\t\tthis.cumulativeWeightAdditive = 0;\n\n\t\t// cache whether the bound property should be treated as an array-like value\n\t\t// (treat existing arrays or types with toArray/fromArray as array bindings,\n\t\t//  or when valueSize > 1)\n\t\tconst boundValue = this.target && this.target[this.property];\n\t\tthis._isArrayProperty = this.valueSize > 1 ||\n\t\t\tArray.isArray(boundValue) ||\n\t\t\t(boundValue && (typeof boundValue.toArray === 'function' || typeof boundValue.fromArray === 'function'));\n\t}\n\n\tparseBinding(target, propertyPath) {\n\t\tpropertyPath = propertyPath.split('.');\n\n\t\tif (propertyPath.length > 1) {\n\t\t\tlet property = target[propertyPath[0]];\n\n\t\t\tfor (let index = 1; index < propertyPath.length - 1; index++) {\n\t\t\t\tproperty = property[propertyPath[index]];\n\t\t\t}\n\n\t\t\tthis.property = propertyPath[propertyPath.length - 1];\n\t\t\tthis.target = property;\n\t\t} else {\n\t\t\tthis.property = propertyPath[0];\n\t\t\tthis.target = target;\n\t\t}\n\t}\n\n\t/**\n\t * Remember the state of the bound property and copy it to both accus.\n\t */\n\tsaveOriginalState() {\n\t\tconst buffer = this.buffer,\n\t\t\tstride = this.valueSize,\n\t\t\toriginalValueOffset = stride * 2;\n\n\t\t// get value\n\t\tif (this._isArrayProperty) {\n\t\t\tif (this.target[this.property].toArray) {\n\t\t\t\tthis.target[this.property].toArray(buffer, originalValueOffset);\n\t\t\t} else {\n\t\t\t\tsetArray(buffer, this.target[this.property], originalValueOffset, stride);\n\t\t\t}\n\t\t} else {\n\t\t\tthis.target[this.property] = buffer[originalValueOffset];\n\t\t}\n\n\t\t// accu[0..1] := orig -- initially detect changes against the original\n\t\tfor (let i = stride, e = originalValueOffset; i !== e; ++i) {\n\t\t\tbuffer[i] = buffer[originalValueOffset + (i % stride)];\n\t\t}\n\n\t\t// Add to identify for additive\n\t\tthis._setIdentity(buffer, stride * 3, stride, originalValueOffset);\n\n\t\tthis.cumulativeWeight = 0;\n\t\tthis.cumulativeWeightAdditive = 0;\n\t}\n\n\t/**\n\t * Apply the state previously taken via 'saveOriginalState' to the binding.\n\t */\n\trestoreOriginalState() {\n\t\tconst buffer = this.buffer,\n\t\t\tstride = this.valueSize,\n\t\t\toriginalValueOffset = stride * 2;\n\n\t\t// accu[0..1] := orig -- initially detect changes against the original\n\t\tfor (let i = stride, e = originalValueOffset; i !== e; ++i) {\n\t\t\tbuffer[i] = buffer[originalValueOffset + (i % stride)];\n\t\t}\n\n\t\tthis.apply();\n\t}\n\n\t/**\n\t * Accumulate value.\n\t * @param {number} weight\n\t */\n\taccumulate(weight) {\n\t\tconst buffer = this.buffer,\n\t\t\tstride = this.valueSize,\n\t\t\toffset = stride;\n\n\t\tlet currentWeight = this.cumulativeWeight;\n\n\t\tif (currentWeight === 0) {\n\t\t\tfor (let i = 0; i !== stride; ++i) {\n\t\t\t\tbuffer[offset + i] = buffer[i];\n\t\t\t}\n\n\t\t\tcurrentWeight = weight;\n\t\t} else {\n\t\t\tcurrentWeight += weight;\n\t\t\tconst mix = weight / currentWeight;\n\t\t\tthis._mixBufferFunction(buffer, offset, 0, mix, stride);\n\t\t}\n\n\t\tthis.cumulativeWeight = currentWeight;\n\t}\n\n\t/**\n\t * Additive Accumulate value.\n\t * @param {number} weight\n\t */\n\taccumulateAdditive(weight) {\n\t\tconst buffer = this.buffer,\n\t\t\tstride = this.valueSize,\n\t\t\toffset = stride * 3;\n\n\t\tif (this.cumulativeWeightAdditive === 0) {\n\t\t\tthis._setIdentity(buffer, offset, stride, stride * 2);\n\t\t}\n\n\t\tthis._mixBufferFunctionAdditive(buffer, offset, 0, weight, stride);\n\n\t\tthis.cumulativeWeightAdditive += weight;\n\t}\n\n\t/**\n\t * Apply to scene graph.\n\t */\n\tapply() {\n\t\tconst buffer = this.buffer,\n\t\t\tstride = this.valueSize,\n\t\t\tweight = this.cumulativeWeight,\n\t\t\tweightAdditive = this.cumulativeWeightAdditive;\n\n\t\tthis.cumulativeWeight = 0;\n\t\tthis.cumulativeWeightAdditive = 0;\n\n\t\tif (weight < 1) {\n\t\t\t// accuN := accuN + original * ( 1 - cumulativeWeight )\n\t\t\tconst originalValueOffset = stride * 2;\n\t\t\tthis._mixBufferFunction(buffer, stride, originalValueOffset, 1 - weight, stride);\n\t\t}\n\n\t\tif (weightAdditive > 0) {\n\t\t\t// accuN := accuN + additive accuN\n\t\t\tthis._mixBufferFunctionAdditive(buffer, stride, 3 * stride, 1, stride);\n\t\t}\n\n\t\t// set value\n\t\tif (this._isArrayProperty) {\n\t\t\tif (this.target[this.property].fromArray) {\n\t\t\t\tthis.target[this.property].fromArray(buffer, stride);\n\t\t\t} else {\n\t\t\t\tgetArray(this.target[this.property], buffer, stride, stride);\n\t\t\t}\n\t\t} else {\n\t\t\tthis.target[this.property] = buffer[stride];\n\t\t}\n\n\t\tif (this.target.isTransformUV) {\n\t\t\tthis.target.needsUpdate = true;\n\t\t}\n\t}\n\n}\n\n// Mix functions\n\nfunction select(buffer, dstOffset, srcOffset, t, stride) {\n\tif (t >= 0.5) {\n\t\tfor (let i = 0; i !== stride; ++i) {\n\t\t\tbuffer[dstOffset + i] = buffer[srcOffset + i];\n\t\t}\n\t}\n}\n\nfunction slerp(buffer, dstOffset, srcOffset, t) {\n\tQuaternion.slerpFlat(buffer, dstOffset, buffer, dstOffset, buffer, srcOffset, t);\n}\n\nconst tempQuternionBuffer = new Float64Array(4);\nfunction slerpAdditive(buffer, dstOffset, srcOffset, t) {\n\t// Store result in tempQuternionBuffer\n\tQuaternion.multiplyQuaternionsFlat(tempQuternionBuffer, 0, buffer, dstOffset, buffer, srcOffset);\n\t// Slerp to the result\n\tQuaternion.slerpFlat(buffer, dstOffset, buffer, dstOffset, tempQuternionBuffer, 0, t);\n}\n\nfunction lerp(buffer, dstOffset, srcOffset, t, stride) {\n\tconst s = 1 - t;\n\n\tfor (let i = 0; i !== stride; ++i) {\n\t\tconst j = dstOffset + i;\n\n\t\tbuffer[j] = buffer[j] * s + buffer[srcOffset + i] * t;\n\t}\n}\n\nfunction lerpAdditive(buffer, dstOffset, srcOffset, t, stride) {\n\tfor (let i = 0; i !== stride; ++i) {\n\t\tconst j = dstOffset + i;\n\n\t\tbuffer[j] = buffer[j] + buffer[srcOffset + i] * t;\n\t}\n}\n\n// identity\nfunction setIdentityNumeric(buffer, offset, stride) {\n\tfor (let i = 0; i < stride; i++) {\n\t\tbuffer[offset + i] = 0;\n\t}\n}\n\nfunction setIdentityQuaternion(buffer, offset) {\n\tsetIdentityNumeric(buffer, offset, 3);\n\tbuffer[offset + 3] = 1;\n}\n\nfunction setIdentityOther(buffer, offset, stride, copyOffset) {\n\tfor (let i = 0; i < stride; i++) {\n\t\tbuffer[offset + i] = buffer[copyOffset + i];\n\t}\n}\n\n// get array\nfunction getArray(target, source, stride, count) {\n\tfor (let i = 0; i < count; i++) {\n\t\ttarget[i] = source[stride + i];\n\t}\n}\n\nfunction setArray(target, source, stride, count) {\n\tfor (let i = 0; i < count; i++) {\n\t\ttarget[stride + i] = source[i];\n\t}\n}\n\nexport { PropertyBindingMixer };"
  },
  {
    "path": "src/animation/tracks/BooleanKeyframeTrack.js",
    "content": "import { KeyframeTrack } from '../KeyframeTrack.js';\nimport { StepInterpolant } from '../KeyframeInterpolants.js';\n\n/**\n * Used for boolean property track.\n * @extends KeyframeTrack\n */\nclass BooleanKeyframeTrack extends KeyframeTrack {\n\n\t/**\n\t * @param {Object3D} target\n\t * @param {string} propertyPath\n\t * @param {Array} times\n\t * @param {Array} values\n\t * @param {KeyframeInterpolant.constructor} [interpolant=StepInterpolant]\n\t */\n\tconstructor(target, propertyPath, times, values, interpolant = StepInterpolant) {\n\t\t// since 0.2.2, remove this after few versions later\n\t\tif (interpolant === true) {\n\t\t\tinterpolant = StepInterpolant;\n\t\t}\n\n\t\tsuper(target, propertyPath, times, values, interpolant);\n\t}\n\n}\n\n/**\n * @readonly\n * @type {string}\n * @default 'bool'\n */\nBooleanKeyframeTrack.prototype.valueTypeName = 'bool';\n\nexport { BooleanKeyframeTrack };"
  },
  {
    "path": "src/animation/tracks/ColorKeyframeTrack.js",
    "content": "import { KeyframeTrack } from '../KeyframeTrack.js';\n\n/**\n * Used for color property track.\n * @extends KeyframeTrack\n */\nclass ColorKeyframeTrack extends KeyframeTrack {\n\n\t/**\n\t * @param {Object3D} target\n\t * @param {string} propertyPath\n\t * @param {Array} times\n\t * @param {Array} values\n\t * @param {KeyframeInterpolant.constructor} [interpolant=LinearInterpolant]\n\t */\n\tconstructor(target, propertyPath, times, values, interpolant) {\n\t\tsuper(target, propertyPath, times, values, interpolant);\n\t}\n\n}\n\n/**\n * @readonly\n * @type {string}\n * @default 'color'\n */\nColorKeyframeTrack.prototype.valueTypeName = 'color';\n\nexport { ColorKeyframeTrack };"
  },
  {
    "path": "src/animation/tracks/NumberKeyframeTrack.js",
    "content": "import { KeyframeTrack } from '../KeyframeTrack.js';\n\n/**\n * Used for number property track.\n * @extends KeyframeTrack\n */\nclass NumberKeyframeTrack extends KeyframeTrack {\n\n\t/**\n\t * @param {Object3D} target\n\t * @param {string} propertyPath\n\t * @param {Array} times\n\t * @param {Array} values\n\t * @param {KeyframeInterpolant.constructor} [interpolant=LinearInterpolant]\n\t */\n\tconstructor(target, propertyPath, times, values, interpolant) {\n\t\tsuper(target, propertyPath, times, values, interpolant);\n\t}\n\n}\n\n/**\n * @readonly\n * @type {string}\n * @default 'number'\n */\nNumberKeyframeTrack.prototype.valueTypeName = 'number';\n\nexport { NumberKeyframeTrack };"
  },
  {
    "path": "src/animation/tracks/QuaternionKeyframeTrack.js",
    "content": "import { KeyframeTrack } from '../KeyframeTrack.js';\nimport { QuaternionLinearInterpolant } from '../KeyframeInterpolants.js';\n\n/**\n * Used for quaternion property track.\n * @extends KeyframeTrack\n */\nclass QuaternionKeyframeTrack extends KeyframeTrack {\n\n\t/**\n\t * @param {Object3D} target\n\t * @param {string} propertyPath\n\t * @param {Array} times\n\t * @param {Array} values\n\t * @param {KeyframeInterpolant.constructor} [interpolant=QuaternionLinearInterpolant]\n\t */\n\tconstructor(target, propertyPath, times, values, interpolant = QuaternionLinearInterpolant) {\n\t\t// since 0.2.2, remove this after few versions later\n\t\tif (interpolant === true) {\n\t\t\tinterpolant = QuaternionLinearInterpolant;\n\t\t}\n\n\t\tsuper(target, propertyPath, times, values, interpolant);\n\t}\n\n}\n\n/**\n * @readonly\n * @type {string}\n * @default 'quaternion'\n */\nQuaternionKeyframeTrack.prototype.valueTypeName = 'quaternion';\n\nexport { QuaternionKeyframeTrack };"
  },
  {
    "path": "src/animation/tracks/StringKeyframeTrack.js",
    "content": "import { KeyframeTrack } from '../KeyframeTrack.js';\nimport { StepInterpolant } from '../KeyframeInterpolants.js';\n\n/**\n * Used for string property track.\n * @extends KeyframeTrack\n */\nclass StringKeyframeTrack extends KeyframeTrack {\n\n\t/**\n\t * @param {Object3D} target\n\t * @param {string} propertyPath\n\t * @param {Array} times\n\t * @param {Array} values\n\t * @param {KeyframeInterpolant.constructor} [interpolant=StepInterpolant]\n\t */\n\tconstructor(target, propertyPath, times, values, interpolant = StepInterpolant) {\n\t\t// since 0.2.2, remove this after few versions later\n\t\tif (interpolant === true) {\n\t\t\tinterpolant = StepInterpolant;\n\t\t}\n\n\t\tsuper(target, propertyPath, times, values, interpolant);\n\t}\n\n}\n\n/**\n * @readonly\n * @type {string}\n * @default 'string'\n */\nStringKeyframeTrack.prototype.valueTypeName = 'string';\n\nexport { StringKeyframeTrack };"
  },
  {
    "path": "src/animation/tracks/VectorKeyframeTrack.js",
    "content": "import { KeyframeTrack } from '../KeyframeTrack.js';\n\n/**\n * Used for vector property track.\n * @extends KeyframeTrack\n */\nclass VectorKeyframeTrack extends KeyframeTrack {\n\n\t/**\n\t * @param {Object3D} target\n\t * @param {string} propertyPath\n\t * @param {Array} times\n\t * @param {Array} values\n\t * @param {KeyframeInterpolant.constructor} [interpolant=LinearInterpolant]\n\t */\n\tconstructor(target, propertyPath, times, values, interpolant) {\n\t\tsuper(target, propertyPath, times, values, interpolant);\n\t}\n\n}\n\n/**\n * @readonly\n * @type {string}\n * @default 'vector'\n */\nVectorKeyframeTrack.prototype.valueTypeName = 'vector';\n\nexport { VectorKeyframeTrack };"
  },
  {
    "path": "src/base.js",
    "content": "/**\n * Clone uniforms.\n * @function\n * @name cloneUniforms\n * @param {object} uniforms_src - The input uniforms.\n * @returns {object} - The output uniforms.\n */\nexport function cloneUniforms(uniforms_src) {\n\tconst uniforms_dst = {};\n\n\tfor (const name in uniforms_src) {\n\t\tconst uniform_src = uniforms_src[name];\n\t\tif (Array.isArray(uniform_src) || ArrayBuffer.isView(uniform_src)) {\n\t\t\tuniforms_dst[name] = uniform_src.slice();\n\t\t} else {\n\t\t\tuniforms_dst[name] = uniform_src;\n\t\t}\n\t}\n\n\treturn uniforms_dst;\n}\n\n/**\n * Clone json.\n * This is faster than JSON.parse(JSON.stringify()).\n * @function\n * @name cloneJson\n * @param {object} obj - The input json.\n * @returns {object} - The output json.\n */\nexport function cloneJson(obj) {\n\tconst newObj = Array.isArray(obj) ? [] : {};\n\n\tif (obj && typeof obj === 'object') {\n\t\tfor (const key in obj) {\n\t\t\tif (obj.hasOwnProperty(key)) {\n\t\t\t\tnewObj[key] = (obj[key] && typeof obj[key] === 'object') ? cloneJson(obj[key]) : obj[key];\n\t\t\t}\n\t\t}\n\t}\n\n\treturn newObj;\n}"
  },
  {
    "path": "src/const.js",
    "content": "/**\n * Enum for material Type.\n * @readonly\n * @enum {string}\n */\nconst MATERIAL_TYPE = {\n\tBASIC: 'basic',\n\tLAMBERT: 'lambert',\n\tPHONG: 'phong',\n\tPBR: 'pbr',\n\tPBR2: 'pbr2',\n\tPOINT: 'point',\n\tLINE: 'line',\n\tSHADER: 'shader',\n\tDEPTH: 'depth',\n\tDISTANCE: 'distance'\n};\n\nexport { MATERIAL_TYPE };\n\n/**\n * Enum for blend Type.\n * @readonly\n * @enum {string}\n */\nconst BLEND_TYPE = {\n\tNONE: 'none',\n\tNORMAL: 'normal',\n\tADD: 'add',\n\tSUB: 'sub',\n\tMUL: 'mul',\n\tCUSTOM: 'custom'\n};\n\nexport { BLEND_TYPE };\n\n/**\n * Enum for blend equation.\n * @readonly\n * @enum {number}\n */\nconst BLEND_EQUATION = {\n\tADD: 100,\n\tSUBTRACT: 101,\n\tREVERSE_SUBTRACT: 102,\n\t/** Only webgl2 */\n\tMIN: 103,\n\tMAX: 104\n};\n\nexport { BLEND_EQUATION };\n\n/**\n * Enum for blend factor.\n * @readonly\n * @enum {number}\n */\nconst BLEND_FACTOR = {\n\tZERO: 200,\n\tONE: 201,\n\tSRC_COLOR: 202,\n\tSRC_ALPHA: 203,\n\tSRC_ALPHA_SATURATE: 204,\n\tDST_COLOR: 205,\n\tDST_ALPHA: 206,\n\tONE_MINUS_SRC_COLOR: 207,\n\tONE_MINUS_SRC_ALPHA: 208,\n\tONE_MINUS_DST_COLOR: 209,\n\tONE_MINUS_DST_ALPHA: 210\n};\n\nexport { BLEND_FACTOR };\n\n/**\n * Enum for cull face Type.\n * @readonly\n * @enum {string}\n */\nconst CULL_FACE_TYPE = {\n\tNONE: 'none',\n\tFRONT: 'front',\n\tBACK: 'back',\n\tFRONT_AND_BACK: 'front_and_back'\n};\n\nexport { CULL_FACE_TYPE };\n\n/**\n * Enum for draw side.\n * @readonly\n * @enum {string}\n */\nconst DRAW_SIDE = {\n\tFRONT: 'front',\n\tBACK: 'back',\n\tDOUBLE: 'double'\n};\n\nexport { DRAW_SIDE };\n\n/**\n * Enum for shading side.\n * @readonly\n * @enum {string}\n */\nconst SHADING_TYPE = {\n\tSMOOTH_SHADING: 'smooth_shading',\n\tFLAT_SHADING: 'flat_shading'\n};\n\nexport { SHADING_TYPE };\n\n/**\n * Enum for pixel format.\n * @readonly\n * @enum {number}\n */\nconst PIXEL_FORMAT = {\n\tDEPTH_COMPONENT: 1000,\n\tDEPTH_STENCIL: 1001,\n\tSTENCIL_INDEX8: 1002,\n\tALPHA: 1003,\n\tRED: 1004,\n\tRGB: 1005,\n\tRGBA: 1006,\n\tLUMINANCE: 1007,\n\tLUMINANCE_ALPHA: 1008,\n\t/** Only webgl2 */\n\tRED_INTEGER: 1010,\n\tRG: 1011,\n\tRG_INTEGER: 1012,\n\tRGB_INTEGER: 1013,\n\tRGBA_INTEGER: 1014,\n\t/** Only internal formats and webgl2 */\n\tR32F: 1100,\n\tR16F: 1101,\n\tR8: 1102,\n\tRG32F: 1103,\n\tRG16F: 1104,\n\tRG8: 1105,\n\tRGB32F: 1106,\n\tRGB16F: 1107,\n\tRGB8: 1108,\n\tRGBA32F: 1109,\n\tRGBA16F: 1110,\n\tRGBA8: 1111,\n\tRGBA4: 1112,\n\tRGB5_A1: 1113,\n\tDEPTH_COMPONENT32F: 1114,\n\tDEPTH_COMPONENT24: 1115,\n\tDEPTH_COMPONENT16: 1116,\n\tDEPTH24_STENCIL8: 1117,\n\tDEPTH32F_STENCIL8: 1118,\n\tR11F_G11F_B10F: 1119,\n\t/** For compressed texture formats */\n\tRGB_S3TC_DXT1: 1200,\n\tRGBA_S3TC_DXT1: 1201,\n\tRGBA_S3TC_DXT3: 1202,\n\tRGBA_S3TC_DXT5: 1203,\n\tRGB_PVRTC_4BPPV1: 1204,\n\tRGB_PVRTC_2BPPV1: 1205,\n\tRGBA_PVRTC_4BPPV1: 1206,\n\tRGBA_PVRTC_2BPPV1: 1207,\n\tRGB_ETC1: 1208,\n\tRGBA_ASTC_4x4: 1209,\n\tRGBA_BPTC: 1210,\n\tRGB_BPTC_SIGNED_FORMAT: 1211,\n\tRGB_BPTC_UNSIGNED_FORMAT: 1212\n};\n\nexport { PIXEL_FORMAT };\n\n/**\n * Enum for pixel Type.\n * @readonly\n * @enum {number}\n */\nconst PIXEL_TYPE = {\n\tUNSIGNED_BYTE: 1500,\n\tUNSIGNED_SHORT_5_6_5: 1501,\n\tUNSIGNED_SHORT_4_4_4_4:\t1502,\n\tUNSIGNED_SHORT_5_5_5_1: 1503,\n\tUNSIGNED_SHORT: 1504,\n\tUNSIGNED_INT: 1505,\n\tUNSIGNED_INT_24_8: 1506,\n\tFLOAT: 1507,\n\tHALF_FLOAT: 1508,\n\tFLOAT_32_UNSIGNED_INT_24_8_REV: 1509,\n\tBYTE: 1510,\n\tSHORT: 1511,\n\tINT: 1512\n};\n\nexport { PIXEL_TYPE };\n\n/**\n * Enum for texture filter.\n * @readonly\n * @enum {number}\n */\nconst TEXTURE_FILTER = {\n\tNEAREST: 1600,\n\tLINEAR: 1601,\n\tNEAREST_MIPMAP_NEAREST: 1602,\n\tLINEAR_MIPMAP_NEAREST: 1603,\n\tNEAREST_MIPMAP_LINEAR: 1604,\n\tLINEAR_MIPMAP_LINEAR: 1605\n};\n\nexport { TEXTURE_FILTER };\n\n/**\n * Enum for texture wrap.\n * @readonly\n * @enum {number}\n */\nconst TEXTURE_WRAP = {\n\tREPEAT:\t1700,\n\tCLAMP_TO_EDGE: 1701,\n\tMIRRORED_REPEAT: 1702\n};\n\nexport { TEXTURE_WRAP };\n\n/**\n * Enum for compare function.\n * @readonly\n * @enum {number}\n */\nconst COMPARE_FUNC = {\n\tLEQUAL: 0x0203,\n\tGEQUAL: 0x0206,\n\tLESS: 0x0201,\n\tGREATER: 0x0204,\n\tEQUAL: 0x0202,\n\tNOTEQUAL: 0x0205,\n\tALWAYS: 0x0207,\n\tNEVER: 0x0200\n};\n\nexport { COMPARE_FUNC };\n\n/**\n * Enum for operation.\n * @readonly\n * @enum {number}\n */\nconst OPERATION = {\n\tKEEP: 0x1E00,\n\tREPLACE: 0x1E01,\n\tINCR: 0x1E02,\n\tDECR: 0x1E03,\n\tINVERT: 0x150A,\n\tINCR_WRAP: 0x8507,\n\tDECR_WRAP: 0x8508\n};\n\nexport { OPERATION };\n\n/**\n * Enum for Shadow Type.\n * @readonly\n * @enum {string}\n */\nconst SHADOW_TYPE = {\n\tHARD: 'hard',\n\tPOISSON_SOFT: 'poisson_soft',\n\tVOGEL5_SOFT: 'vogel5_soft',\n\tPCF3_SOFT: 'pcf3_soft',\n\tPCF5_SOFT: 'pcf5_soft',\n\t/** Only webgl2 */\n\tPCSS16_SOFT: 'pcss16_soft',\n\tPCSS32_SOFT: 'pcss32_soft',\n\tPCSS64_SOFT: 'pcss64_soft'\n};\n\nexport { SHADOW_TYPE };\n\n/**\n * Enum for Texel Encoding Type.\n * @readonly\n * @enum {string}\n */\nconst TEXEL_ENCODING_TYPE = {\n\tLINEAR: 'linear',\n\tSRGB: 'sRGB',\n\tGAMMA: 'Gamma'\n};\n\nexport { TEXEL_ENCODING_TYPE };\n\n/**\n * Enum for Envmap Combine Type.\n * @readonly\n * @enum {string}\n */\nconst ENVMAP_COMBINE_TYPE = {\n\tMULTIPLY: 'ENVMAP_BLENDING_MULTIPLY',\n\tMIX: 'ENVMAP_BLENDING_MIX',\n\tADD: 'ENVMAP_BLENDING_ADD'\n};\n\nexport { ENVMAP_COMBINE_TYPE };\n\n/**\n * Enum for Draw Mode.\n * @readonly\n * @enum {number}\n */\nconst DRAW_MODE = {\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};\n\nexport { DRAW_MODE };\n\n/**\n * Enum for Vertex Color.\n * @readonly\n * @enum {number}\n */\nconst VERTEX_COLOR = {\n\tNONE: 0,\n\tRGB: 1,\n\tRGBA: 2\n};\n\nexport { VERTEX_COLOR };\n\n/**\n * Enum for ATTACHMENT\n * @readonly\n * @enum {number}\n */\nconst ATTACHMENT = {\n\tCOLOR_ATTACHMENT0: 2000,\n\tCOLOR_ATTACHMENT1: 2001,\n\tCOLOR_ATTACHMENT2: 2002,\n\tCOLOR_ATTACHMENT3: 2003,\n\tCOLOR_ATTACHMENT4: 2004,\n\tCOLOR_ATTACHMENT5: 2005,\n\tCOLOR_ATTACHMENT6: 2006,\n\tCOLOR_ATTACHMENT7: 2007,\n\tCOLOR_ATTACHMENT8: 2008,\n\tCOLOR_ATTACHMENT9: 2009,\n\tCOLOR_ATTACHMENT10: 2010,\n\tCOLOR_ATTACHMENT11: 2011,\n\tCOLOR_ATTACHMENT12: 2012,\n\tCOLOR_ATTACHMENT13: 2013,\n\tCOLOR_ATTACHMENT14: 2014,\n\tCOLOR_ATTACHMENT15: 2015,\n\tDEPTH_ATTACHMENT: 2020,\n\tSTENCIL_ATTACHMENT: 2021,\n\tDEPTH_STENCIL_ATTACHMENT: 2030\n};\n\nexport { ATTACHMENT };\n\n/**\n * Enum for BUFFER_USAGE\n * @readonly\n * @enum {number}\n */\nconst BUFFER_USAGE = {\n\tSTREAM_DRAW: 35040,\n\tSTREAM_READ: 35041,\n\tSTREAM_COPY: 35042,\n\tSTATIC_DRAW: 35044,\n\tSTATIC_READ: 35045,\n\tSTATIC_COPY: 35046,\n\tDYNAMIC_DRAW: 35048,\n\tDYNAMIC_READ: 35049,\n\tDYNAMIC_COPY: 35050\n};\n\nexport { BUFFER_USAGE };\n\n/**\n * Enum for QUERYSET_TYPE\n * @readonly\n * @enum {number}\n */\nconst QUERYSET_TYPE = {\n\tOCCLUSION: 8000,\n\tTIMESTAMP: 8001\n};\n\nexport { QUERYSET_TYPE };"
  },
  {
    "path": "src/legacy.js",
    "content": "import { WebGLRenderer } from './webgl/WebGLRenderer.js';\nimport { WebGLTextures } from './webgl/WebGLTextures.js';\nimport { Scene } from './scenes/Scene.js';\nimport { MathUtils } from './math/MathUtils.js';\nimport { RenderStates } from './render/RenderStates.js';\nimport { Matrix4 } from './math/Matrix4.js';\nimport { Matrix3 } from './math/Matrix3.js';\nimport { Vector3 } from './math/Vector3.js';\nimport { EventDispatcher } from './EventDispatcher.js';\nimport { PropertyMap } from './render/PropertyMap.js';\nimport { ScreenRenderTarget } from './resources/targets/ScreenRenderTarget.js';\nimport { OffscreenRenderTarget } from './resources/targets/OffscreenRenderTarget.js';\nimport { RenderBuffer } from './resources/RenderBuffer.js';\nimport { Texture2D } from './resources/textures/Texture2D.js';\nimport { TextureCube } from './resources/textures/TextureCube.js';\nimport { Texture3D } from './resources/textures/Texture3D.js';\nimport { Texture2DArray } from './resources/textures/Texture2DArray.js';\nimport { ATTACHMENT, PIXEL_FORMAT } from './const.js';\n\nObject.defineProperties(WebGLRenderer.prototype, {\n\t// deprecated since 0.4.5\n\tasyncReadPixel: {\n\t\tconfigurable: true,\n\t\tget: function() {\n\t\t\tif (this._asyncReadPixel === undefined) {\n\t\t\t\tthis._asyncReadPixel = false;\n\t\t\t}\n\t\t\treturn this._asyncReadPixel;\n\t\t},\n\t\tset: function(value) {\n\t\t\tthis._asyncReadPixel = value;\n\t\t}\n\t}\n});\n\n// deprecated since 0.4.5, use readTexturePixels instead\nWebGLRenderer.prototype.readRenderTargetPixels = function(x, y, width, height, buffer) {\n\tconst state = this._state;\n\tconst renderTarget = state.currentRenderTarget;\n\n\tconst zIndex = renderTarget.activeLayer || renderTarget.activeLayer || 0;\n\tconst mipLevel = renderTarget.activeMipmapLevel || 0;\n\n\tif (renderTarget && renderTarget.texture) {\n\t\tif ((x >= 0 && x <= (renderTarget.width - width)) && (y >= 0 && y <= (renderTarget.height - height))) {\n\t\t\tif (this.asyncReadPixel) {\n\t\t\t\treturn this.readTexturePixels(renderTarget.texture, x, y, width, height, buffer, zIndex, mipLevel);\n\t\t\t} else {\n\t\t\t\tthis.readTexturePixelsSync(renderTarget.texture, x, y, width, height, buffer, zIndex, mipLevel);\n\t\t\t\treturn Promise.resolve(buffer);\n\t\t\t}\n\t\t}\n\t}\n\n\tconsole.warn('WebGLRenderer.readRenderTargetPixels: readPixels from renderTarget failed.');\n\treturn Promise.reject();\n};\n\n// deprecated since 0.5.1\nWebGLTextures.prototype.setTexture2D = function(texture, slot) {\n\t// console.warn('WebGLTextures: .setTexture2D() has been deprecated, use .setTexture() instead.');\n\treturn this.setTexture(texture, slot);\n};\nWebGLTextures.prototype.setTextureCube = function(texture, slot) {\n\t// console.warn('WebGLTextures: .setTextureCube() has been deprecated, use .setTexture() instead.');\n\treturn this.setTexture(texture, slot);\n};\nWebGLTextures.prototype.setTexture3D = function(texture, slot) {\n\t// console.warn('WebGLTextures: .setTexture3D() has been deprecated, use .setTexture() instead.');\n\treturn this.setTexture(texture, slot);\n};\nWebGLTextures.prototype.setTexture2DArray = function(texture, slot) {\n\t// console.warn('WebGLTextures: .setTexture2DArray() has been deprecated, use .setTexture() instead.');\n\treturn this.setTexture(texture, slot);\n};\n\nObject.defineProperties(Scene.prototype, {\n\t// deprecated since 0.2.7, add warning since 0.4.0\n\tenvironmentLightIntensity: {\n\t\tconfigurable: true,\n\t\tget: function() {\n\t\t\tconsole.warn('Scene: .environmentLightIntensity has been deprecated, use .envDiffuseIntensity instead.');\n\t\t\treturn this.envDiffuseIntensity;\n\t\t},\n\t\tset: function(value) {\n\t\t\tconsole.warn('Scene: .environmentLightIntensity has been deprecated, use .envDiffuseIntensity instead.');\n\t\t\tthis.envDiffuseIntensity = value;\n\t\t}\n\t},\n\t// deprecated since 0.4.0\n\t_lightData: {\n\t\tconfigurable: true,\n\t\tget: function() {\n\t\t\tconsole.warn('Scene: ._lightData has been deprecated since v0.4.0, use .collector.lightingData.getGroup(0) instead.');\n\t\t\treturn this.collector.lightingData.getGroup(0);\n\t\t}\n\t},\n\t// deprecated since 0.4.4\n\t_sceneData: {\n\t\tconfigurable: true,\n\t\tget: function() {\n\t\t\tconsole.warn('Scene: ._sceneData has been deprecated since v0.4.4, use .collector.sceneData instead.');\n\t\t\treturn this.collector.sceneData;\n\t\t}\n\t},\n\t// deprecated since 0.4.4\n\t_lightingData: {\n\t\tconfigurable: true,\n\t\tget: function() {\n\t\t\tconsole.warn('Scene: ._lightingData has been deprecated since v0.4.4, use .collector.lightingData instead.');\n\t\t\treturn this.collector.lightingData;\n\t\t}\n\t}\n});\n\nObject.defineProperties(RenderStates.prototype, {\n\t// deprecated since 0.4.0\n\tlights: {\n\t\tconfigurable: true,\n\t\tget: function() {\n\t\t\tconsole.warn('RenderStates: .lights has been deprecated since v0.4.0, use .lighting.getGroup(0) instead.');\n\t\t\treturn this.lighting.getGroup(0);\n\t\t}\n\t}\n});\n\n// deprecated since 0.2.8\n\nexport const generateUUID = MathUtils.generateUUID;\nexport const isPowerOfTwo = MathUtils.isPowerOfTwo;\nexport const nearestPowerOfTwo = MathUtils.nearestPowerOfTwo;\nexport const nextPowerOfTwo = MathUtils.nextPowerOfTwo;\n\n// deprecated since 0.4.3\nMatrix4.prototype.inverse = function() {\n\treturn this.invert();\n};\n\n// deprecated since 0.4.3\nMatrix4.prototype.getInverse = function(m) {\n\treturn this.copy(m).invert();\n};\n\n// deprecated since 0.4.3\nMatrix4.prototype.transform = function(position, scale, quaternion) {\n\treturn this.compose(position, quaternion, scale);\n};\n\n// deprecated since 0.4.3\nMatrix3.prototype.inverse = function() {\n\treturn this.invert();\n};\n\n// deprecated since 0.4.3\nMatrix3.prototype.getInverse = function(m) {\n\treturn this.copy(m).invert();\n};\n\n// deprecated since 0.4.3\nVector3.prototype.subtract = function(a, target = new Vector3()) {\n\treturn target.set(this.x - a.x, this.y - a.y, this.z - a.z);\n};\n\n// The old version of Query API has been deprecated since 0.4.4\n\nexport const QUERY_TYPE = {\n\tANY_SAMPLES_PASSED: 7000,\n\tANY_SAMPLES_PASSED_CONSERVATIVE: 7001,\n\tTIME_ELAPSED: 7002\n};\n\nlet _queryId = 0;\nexport class Query extends EventDispatcher {\n\n\tconstructor() {\n\t\tsuper();\n\t\tthis.id = _queryId++;\n\t}\n\n\tdispose() {\n\t\tthis.dispatchEvent({ type: 'dispose' });\n\t}\n\n}\n\nWebGLRenderer.prototype.beginQuery = function(query, target) {\n\tthis._queries.begin(query, target);\n};\n\nWebGLRenderer.prototype.endQuery = function(query) {\n\tthis._queries.end(query);\n};\n\nWebGLRenderer.prototype.queryCounter = function(query) {\n\tthis._queries.counter(query);\n};\n\nWebGLRenderer.prototype.isTimerQueryDisjoint = function(query) {\n\treturn this._queries.isTimerDisjoint(query);\n};\n\nWebGLRenderer.prototype.isQueryResultAvailable = function(query) {\n\treturn this._queries.isResultAvailable(query);\n};\n\nWebGLRenderer.prototype.getQueryResult = function(query) {\n\treturn this._queries.getResult(query);\n};\n\nObject.defineProperties(WebGLRenderer.prototype, {\n\t_queries: {\n\t\tconfigurable: true,\n\t\tget: function() {\n\t\t\tif (this.__queries === undefined) {\n\t\t\t\tthis.__queries = new WebGLQueries(`_gl${this.id}`, this.context, this.capabilities);\n\t\t\t}\n\t\t\treturn this.__queries;\n\t\t}\n\t}\n});\n\nexport class WebGLQueries extends PropertyMap {\n\n\tconstructor(prefix, gl, capabilities) {\n\t\tsuper(prefix);\n\n\t\tthis._gl = gl;\n\t\tthis._capabilities = capabilities;\n\n\t\tconst timerQuery = capabilities.timerQuery;\n\t\tconst that = this;\n\n\t\tconst onQueryDispose = event => {\n\t\t\tconst query = event.target;\n\t\t\tconst queryProperties = that.get(query);\n\n\t\t\tquery.removeEventListener('dispose', onQueryDispose);\n\n\t\t\tif (queryProperties._webglQuery) {\n\t\t\t\tif (capabilities.version > 1) {\n\t\t\t\t\tgl.deleteQuery(queryProperties._webglQuery);\n\t\t\t\t} else {\n\t\t\t\t\ttimerQuery.deleteQueryEXT(queryProperties._webglQuery);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthat.delete(query);\n\t\t};\n\n\t\tthis._onQueryDispose = onQueryDispose;\n\n\t\tthis._typeToGL = {\n\t\t\t[QUERY_TYPE.ANY_SAMPLES_PASSED]: 0x8C2F,\n\t\t\t[QUERY_TYPE.ANY_SAMPLES_PASSED_CONSERVATIVE]: 0x8D6A,\n\t\t\t[QUERY_TYPE.TIME_ELAPSED]: 0x88BF\n\t\t};\n\t}\n\n\t_get(query) {\n\t\tconst capabilities = this._capabilities;\n\n\t\tconst queryProperties = this.get(query);\n\n\t\tif (queryProperties._webglQuery === undefined) {\n\t\t\tquery.addEventListener('dispose', this._onQueryDispose);\n\n\t\t\tqueryProperties._webglQuery = capabilities.version > 1 ? this._gl.createQuery() : capabilities.timerQuery.createQueryEXT();\n\t\t\tqueryProperties._target = null;\n\t\t\tqueryProperties._result = null;\n\t\t}\n\n\t\treturn queryProperties;\n\t}\n\n\tbegin(query, target) {\n\t\tconst capabilities = this._capabilities;\n\t\tconst typeToGL = this._typeToGL;\n\n\t\tconst queryProperties = this._get(query);\n\n\t\tif (capabilities.version > 1) {\n\t\t\tthis._gl.beginQuery(typeToGL[target], queryProperties._webglQuery);\n\t\t} else {\n\t\t\tcapabilities.timerQuery.beginQueryEXT(typeToGL[target], queryProperties._webglQuery);\n\t\t}\n\n\t\tqueryProperties._target = target;\n\t\tqueryProperties._result = null; // clear the last result.\n\t}\n\n\tend(query) {\n\t\tconst capabilities = this._capabilities;\n\t\tconst typeToGL = this._typeToGL;\n\n\t\tconst queryProperties = this._get(query);\n\n\t\tif (capabilities.version > 1) {\n\t\t\tthis._gl.endQuery(typeToGL[queryProperties._target]);\n\t\t} else {\n\t\t\tcapabilities.timerQuery.endQueryEXT(typeToGL[queryProperties._target]);\n\t\t}\n\t}\n\n\tcounter(query) {\n\t\tconst timerQuery = this._capabilities.timerQuery;\n\n\t\tconst queryProperties = this._get(query);\n\n\t\ttimerQuery.queryCounterEXT(queryProperties._webglQuery, timerQuery.TIMESTAMP_EXT);\n\n\t\tqueryProperties._target = timerQuery.TIMESTAMP_EXT;\n\t\tqueryProperties._result = null; // clear the last result.\n\t}\n\n\tisResultAvailable(query) {\n\t\tconst gl = this._gl;\n\t\tconst capabilities = this._capabilities;\n\t\tconst timerQuery = capabilities.timerQuery;\n\n\t\tconst queryProperties = this._get(query);\n\n\t\tlet available;\n\t\tif (capabilities.version > 1) {\n\t\t\tavailable = gl.getQueryParameter(queryProperties._webglQuery, gl.QUERY_RESULT_AVAILABLE);\n\t\t} else {\n\t\t\tavailable = timerQuery.getQueryObjectEXT(queryProperties._webglQuery, timerQuery.QUERY_RESULT_AVAILABLE);\n\t\t}\n\n\t\treturn available;\n\t}\n\n\tisTimerDisjoint() {\n\t\treturn this._gl.getParameter(this._capabilities.timerQuery.GPU_DISJOINT_EXT);\n\t}\n\n\tgetResult(query) {\n\t\tconst gl = this._gl;\n\t\tconst capabilities = this._capabilities;\n\t\tconst timerQuery = capabilities.timerQuery;\n\n\t\tconst queryProperties = this._get(query);\n\n\t\tif (queryProperties._result === null) {\n\t\t\tif (capabilities.version > 1) {\n\t\t\t\tqueryProperties._result = gl.getQueryParameter(queryProperties._webglQuery, gl.QUERY_RESULT);\n\t\t\t} else {\n\t\t\t\tqueryProperties._result = timerQuery.getQueryObjectEXT(queryProperties._webglQuery, timerQuery.QUERY_RESULT_EXT);\n\t\t\t}\n\t\t}\n\n\t\treturn queryProperties._result;\n\t}\n\n}\n\n// deprecated since 0.5.0\nWebGLRenderer.prototype.clear = function(color, depth, stencil) {\n\tconst gl = this.context;\n\n\tlet bits = 0;\n\n\tif (color === undefined || color) bits |= gl.COLOR_BUFFER_BIT;\n\tif (depth === undefined || depth) bits |= gl.DEPTH_BUFFER_BIT;\n\tif (stencil === undefined || stencil) bits |= gl.STENCIL_BUFFER_BIT;\n\n\tif (bits > 0) { // Prevent warning when bits is equal to zero\n\t\tgl.clear(bits);\n\t}\n};\n\n// deprecated since 0.5.0\nWebGLRenderer.prototype.setClearColor = function(r, g, b, a, premultipliedAlpha) {\n\tthis._state.colorBuffer.setClear(r, g, b, a, premultipliedAlpha);\n};\n\n// deprecated since 0.5.0\nWebGLRenderer.prototype.getClearColor = function() {\n\treturn this._state.colorBuffer.getClear();\n};\n\n// deprecated since 0.5.0\nWebGLRenderer.prototype.setRenderTarget = function(renderTarget) {\n\tthis._renderTargets.setRenderTarget(renderTarget);\n};\n\n// deprecated since 0.5.0\nWebGLRenderer.prototype.getRenderTarget = function() {\n\treturn this._state.currentRenderTarget;\n};\n\n// deprecated since 0.5.0\nWebGLRenderer.prototype.setOcclusionQuerySet = function(querySet) {\n\tthis._currentOcclusionQuerySet = querySet;\n};\n\n// deprecated since 0.5.0\nWebGLRenderer.prototype.setTimestampWrites = function(querySet, beginIndex = 0, endIndex = 1) {\n\tthis._currentTimestampWrites.querySet = querySet;\n\tthis._currentTimestampWrites.beginningOfPassWriteIndex = beginIndex;\n\tthis._currentTimestampWrites.endOfPassWriteIndex = endIndex;\n};\n\n// deprecated since 0.5.0\nWebGLRenderer.prototype.updateRenderTargetMipmap = function(renderTarget) {\n\tif (renderTarget.texture) {\n\t\tthis.generateMipmaps(renderTarget.texture);\n\t}\n};\n\nObject.defineProperties(OffscreenRenderTarget.prototype, {\n\t// deprecated since 0.5.0\n\tdepth: {\n\t\tconfigurable: true,\n\t\tget: function() {\n\t\t\tconsole.warn('OffscreenRenderTarget: .depth property is deprecated.');\n\t\t\treturn 1;\n\t\t}\n\t}\n});\n\n// deprecated since 0.5.0\nexport class RenderTarget2D extends OffscreenRenderTarget {\n\n\tconstructor(width, height) {\n\t\tsuper(width, height);\n\n\t\tthis.attach(new Texture2D(), ATTACHMENT.COLOR_ATTACHMENT0);\n\t\tthis.attach(new RenderBuffer(width, height, PIXEL_FORMAT.DEPTH_STENCIL), ATTACHMENT.DEPTH_STENCIL_ATTACHMENT);\n\t}\n\n}\nRenderTarget2D.prototype.isRenderTarget2D = true;\n\n// deprecated since 0.5.0\nexport class RenderTargetCube extends OffscreenRenderTarget {\n\n\tconstructor(width, height) {\n\t\tsuper(width, height);\n\n\t\tthis.attach(new TextureCube(), ATTACHMENT.COLOR_ATTACHMENT0);\n\t\tthis.attach(new RenderBuffer(width, height, PIXEL_FORMAT.DEPTH_STENCIL), ATTACHMENT.DEPTH_STENCIL_ATTACHMENT);\n\t}\n\n}\nRenderTargetCube.prototype.isRenderTargetCube = true;\n\n// deprecated since 0.5.0\nexport class RenderTarget3D extends OffscreenRenderTarget {\n\n\tconstructor(width, height, depth) {\n\t\tsuper(width, height);\n\n\t\tconst texture = new Texture3D();\n\t\ttexture.resizeAsAttachment(width, height, depth);\n\t\tthis.attach(texture, ATTACHMENT.COLOR_ATTACHMENT0);\n\t}\n\n}\nRenderTarget3D.prototype.isRenderTarget3D = true;\n\n// deprecated since 0.5.0\nexport class RenderTarget2DArray extends OffscreenRenderTarget {\n\n\tconstructor(width, height, depth) {\n\t\tsuper(width, height);\n\n\t\tconst texture = new Texture2DArray();\n\t\ttexture.resizeAsAttachment(width, height, depth);\n\t\tthis.attach(texture, ATTACHMENT.COLOR_ATTACHMENT0);\n\t}\n\n}\nRenderTarget2DArray.prototype.isRenderTarget2DArray = true;\n\n// deprecated since 0.5.0\nScreenRenderTarget.prototype.isRenderTargetBack = true;\nexport { ScreenRenderTarget as RenderTargetBack };"
  },
  {
    "path": "src/loaders/FileLoader.js",
    "content": "import { Loader } from './Loader.js';\n\n/**\n * A low level class for loading resources with the Fetch API, used internally by\n * most loaders. It can also be used directly to load any file type that does\n * not have a loader.\n * ```js\n * const loader = new FileLoader();\n * const data = await loader.loadAsync('example.txt');\n * ```\n * @extends Loader\n */\nclass FileLoader extends Loader {\n\n\t/**\n\t * Constructs a new file loader.\n\t * @param {LoadingManager} [manager] - The loading manager.\n\t */\n\tconstructor(manager) {\n\t\tsuper(manager);\n\n\t\t/**\n\t\t * The expected response type. See {@link FileLoader.setResponseType}.\n\t\t * @type {'arraybuffer'|'blob'|'document'|'json'|''}\n\t\t * @default ''\n\t\t */\n\t\tthis.responseType = '';\n\n\t\t/**\n\t\t * The expected mimeType. See {@link FileLoader.setMimeType}.\n\t\t * @type {string}\n\t\t * @default ''\n\t\t */\n\t\tthis.mimeType = '';\n\t}\n\n\t/**\n\t * Starts loading from the given URL and pass the loaded response to the `onLoad()` callback.\n\t * @param {string} url — The path/URL of the file to be loaded. This can also be a data URI.\n\t * @param {Function} [onLoad] — Executed when the loading process has been finished. The argument is the loaded data.\n\t * @param {onProgressCallback} [onProgress] — Executed while the loading is in progress.\n\t * @param {onErrorCallback} [onError] — Executed when errors occur.\n\t */\n\tload(url, onLoad, onProgress, onError) {\n\t\tif (url === undefined) url = '';\n\t\tif (this.path != undefined) url = this.path + url;\n\n\t\turl = this.manager.resolveURL(url);\n\n\t\t// create request\n\t\tconst req = new Request(url, {\n\t\t\theaders: new Headers(this.requestHeader),\n\t\t\tcredentials: this.withCredentials ? 'include' : 'same-origin'\n\t\t\t// An abort controller could be added within a future PR\n\t\t});\n\n\t\t// record states ( avoid data race )\n\t\tconst mimeType = this.mimeType;\n\t\tconst responseType = this.responseType;\n\n\t\t// start the fetch\n\t\tfetch(req)\n\t\t\t.then(response => {\n\t\t\t\tif (response.status === 200 || response.status === 0) {\n\t\t\t\t\t// Some browsers return HTTP Status 0 when using non-http protocol\n\t\t\t\t\t// e.g. 'file://' or 'data://'. Handle as success.\n\n\t\t\t\t\tif (response.status === 0) {\n\t\t\t\t\t\tconsole.warn('FileLoader: HTTP Status 0 received.');\n\t\t\t\t\t}\n\n\t\t\t\t\t// Workaround: Checking if response.body === undefined for Alipay browser #23548\n\n\t\t\t\t\tif (typeof ReadableStream === 'undefined' || response.body === undefined || response.body.getReader === undefined) {\n\t\t\t\t\t\treturn response;\n\t\t\t\t\t}\n\n\t\t\t\t\tconst reader = response.body.getReader();\n\n\t\t\t\t\t// Nginx needs X-File-Size check\n\t\t\t\t\t// https://serverfault.com/questions/482875/why-does-nginx-remove-content-length-header-for-chunked-content\n\t\t\t\t\tconst contentLength = response.headers.get('X-File-Size') || response.headers.get('Content-Length');\n\t\t\t\t\tconst total = contentLength ? parseInt(contentLength) : 0;\n\t\t\t\t\tconst lengthComputable = total !== 0;\n\t\t\t\t\tlet loaded = 0;\n\n\t\t\t\t\t// periodically read data into the new stream tracking while download progress\n\t\t\t\t\tconst stream = new ReadableStream({\n\t\t\t\t\t\tstart(controller) {\n\t\t\t\t\t\t\treadData();\n\n\t\t\t\t\t\t\tfunction readData() {\n\t\t\t\t\t\t\t\treader.read().then(({ done, value }) => {\n\t\t\t\t\t\t\t\t\tif (done) {\n\t\t\t\t\t\t\t\t\t\tcontroller.close();\n\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\tloaded += value.byteLength;\n\n\t\t\t\t\t\t\t\t\t\tconst event = new ProgressEvent('progress', { lengthComputable, loaded, total });\n\t\t\t\t\t\t\t\t\t\tif (onProgress) onProgress(event);\n\n\t\t\t\t\t\t\t\t\t\tcontroller.enqueue(value);\n\t\t\t\t\t\t\t\t\t\treadData();\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}, error => {\n\t\t\t\t\t\t\t\t\tcontroller.error(error);\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t});\n\n\t\t\t\t\treturn new Response(stream);\n\t\t\t\t} else {\n\t\t\t\t\tthrow new HttpError(`fetch for \"${response.url}\" responded with ${response.status}: ${response.statusText}`, response);\n\t\t\t\t}\n\t\t\t})\n\t\t\t.then(response => {\n\t\t\t\tswitch (responseType) {\n\t\t\t\t\tcase 'arraybuffer':\n\t\t\t\t\t\treturn response.arrayBuffer();\n\t\t\t\t\tcase 'blob':\n\t\t\t\t\t\treturn response.blob();\n\t\t\t\t\tcase 'document':\n\t\t\t\t\t\treturn response.text()\n\t\t\t\t\t\t\t.then(text => {\n\t\t\t\t\t\t\t\tconst parser = new DOMParser();\n\t\t\t\t\t\t\t\treturn parser.parseFromString(text, mimeType);\n\t\t\t\t\t\t\t});\n\t\t\t\t\tcase 'json':\n\t\t\t\t\t\treturn response.json();\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tif (mimeType === '') {\n\t\t\t\t\t\t\treturn response.text();\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// sniff encoding\n\t\t\t\t\t\t\tconst re = /charset=\"?([^;\"\\s]*)\"?/i;\n\t\t\t\t\t\t\tconst exec = re.exec(mimeType);\n\t\t\t\t\t\t\tconst label = exec && exec[1] ? exec[1].toLowerCase() : undefined;\n\t\t\t\t\t\t\tconst decoder = new TextDecoder(label);\n\t\t\t\t\t\t\treturn response.arrayBuffer().then(ab => decoder.decode(ab));\n\t\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t})\n\t\t\t.then(data => {\n\t\t\t\tif (onLoad) onLoad(data);\n\t\t\t})\n\t\t\t.catch(err => {\n\t\t\t\tonError && onError(err);\n\n\t\t\t\tthis.manager.itemError(url);\n\t\t\t})\n\t\t\t.finally(() => {\n\t\t\t\tthis.manager.itemEnd(url);\n\t\t\t});\n\n\t\tthis.manager.itemStart(url);\n\t}\n\n\t/**\n\t * Sets the expected response type.\n\t * @param {'arraybuffer'|'blob'|'document'|'json'|''} value - The response type.\n\t * @returns {FileLoader} A reference to this file loader.\n\t */\n\tsetResponseType(value) {\n\t\tthis.responseType = value;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the expected mime type of the loaded file.\n\t * @param {string} value - The mime type.\n\t * @returns {FileLoader} A reference to this file loader.\n\t */\n\tsetMimeType(value) {\n\t\tthis.mimeType = value;\n\t\treturn this;\n\t}\n\n}\n\nclass HttpError extends Error {\n\n\tconstructor(message, response) {\n\t\tsuper(message);\n\t\tthis.response = response;\n\t}\n\n}\n\nexport { FileLoader };"
  },
  {
    "path": "src/loaders/ImageLoader.js",
    "content": "import { Loader } from './Loader.js';\n\n/**\n * A loader for loading images. The class loads images with the HTML `Image` API.\n * Please note that 'ImageLoader' not support progress events.\n * ```js\n * const loader = new ImageLoader();\n * const image = await loader.loadAsync('image.png');\n * ```\n * @extends Loader\n */\nclass ImageLoader extends Loader {\n\n\t/**\n\t * Constructs a new image loader.\n\t * @param {LoadingManager} [manager] - The loading manager.\n\t */\n\tconstructor(manager) {\n\t\tsuper(manager);\n\t}\n\n\t/**\n\t * Starts loading from the given URL and passes the loaded image\n\t * to the `onLoad()` callback. The method also returns a new `Image` object which can\n\t * directly be used for texture creation. If you do it this way, the texture\n\t * may pop up in your scene once the respective loading process is finished.\n\t * @param {string} url - The path/URL of the file to be loaded. This can also be a data URI.\n\t * @param {Function} [onLoad] - Executed when the loading process has been finished. The argument is an `HTMLImageElement`.\n\t * @param {onProgressCallback} [onProgress] - Unsupported in this loader.\n\t * @param {onErrorCallback} [onError] - Executed when errors occur.\n\t * @returns {HTMLImageElement} The image.\n\t */\n\tload(url, onLoad, onProgress, onError) {\n\t\tif (url === undefined) url = '';\n\t\tif (this.path !== undefined) url = this.path + url;\n\n\t\turl = this.manager.resolveURL(url);\n\n\t\tconst scope = this;\n\n\t\tconst image = document.createElementNS('http://www.w3.org/1999/xhtml', 'img');\n\n\t\tfunction onImageLoad() {\n\t\t\tremoveEventListeners();\n\n\t\t\tif (onLoad) onLoad(this);\n\n\t\t\tscope.manager.itemEnd(url);\n\t\t}\n\n\t\tfunction onImageError(event) {\n\t\t\tremoveEventListeners();\n\n\t\t\tif (onError) onError(event);\n\n\t\t\tscope.manager.itemError(url);\n\t\t\tscope.manager.itemEnd(url);\n\t\t}\n\n\t\tfunction removeEventListeners() {\n\t\t\timage.removeEventListener('load', onImageLoad, false);\n\t\t\timage.removeEventListener('error', onImageError, false);\n\t\t}\n\n\t\timage.addEventListener('load', onImageLoad, false);\n\t\timage.addEventListener('error', onImageError, false);\n\n\t\tif (url.slice(0, 5) !== 'data:') {\n\t\t\tif (this.crossOrigin !== undefined) image.crossOrigin = this.crossOrigin;\n\t\t}\n\n\t\tscope.manager.itemStart(url);\n\n\t\timage.src = url;\n\n\t\treturn image;\n\t}\n\n}\n\nexport { ImageLoader };"
  },
  {
    "path": "src/loaders/Loader.js",
    "content": "import { DefaultLoadingManager } from './LoadingManager.js';\n\n/**\n * Abstract base class for loaders.\n * @abstract\n */\nclass Loader {\n\n\t/**\n\t * Constructs a new Loader.\n\t * @param {LoadingManager} [manager=DefaultLoadingManager] - The loading manager.\n\t */\n\tconstructor(manager) {\n\t\t/**\n\t\t * The loading manager.\n\t\t * @type {LoadingManager}\n\t\t * @default DefaultLoadingManager\n\t\t */\n\t\tthis.manager = (manager !== undefined) ? manager : DefaultLoadingManager;\n\n\t\t/**\n\t\t * The crossOrigin string to implement CORS for loading the url from a\n\t\t * different domain that allows CORS.\n\t\t * @type {string}\n\t\t * @default 'anonymous'\n\t\t */\n\t\tthis.crossOrigin = 'anonymous';\n\n\t\t/**\n\t\t * Whether the XMLHttpRequest uses credentials.\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.withCredentials = false;\n\n\t\t/**\n\t\t * The base path from which the asset will be loaded.\n\t\t * @type {string}\n\t\t * @default ''\n\t\t */\n\t\tthis.path = '';\n\n\t\t/**\n\t\t * The [request header]{@link https://developer.mozilla.org/en-US/docs/Glossary/Request_header}\n\t\t * used in HTTP request.\n\t\t * @type {object}\n\t\t * @default {}\n\t\t */\n\t\tthis.requestHeader = {};\n\t}\n\n\t/**\n\t * This method needs to be implement by all concrete loaders.\n\t * It holds the logic for loading the asset from the backend.\n\t * @param {string} url - The path/URL of the file to be loaded.\n\t * @param {Function} onLoad - Executed when the loading process has been finished.\n\t * @param {onProgressCallback} [onProgress] - Executed while the loading is in progress.\n\t * @param {onErrorCallback} [onError] - Executed when errors occur.\n\t */\n\tload(url, onLoad, onProgress, onError) {}\n\n\t/**\n\t * A async version of {@link Loader#load}.\n\t * @param {string} url - The path/URL of the file to be loaded.\n\t * @param {Function} [onProgress] - Executed while the loading is in progress.\n\t * @returns {Promise} A Promise that resolves when the asset has been loaded.\n\t */\n\tloadAsync(url, onProgress) {\n\t\tconst scope = this;\n\t\treturn new Promise(function(resolve, reject) {\n\t\t\tscope.load(url, resolve, onProgress, reject);\n\t\t});\n\t}\n\n\t/**\n\t * Sets the `crossOrigin` String to implement CORS for loading the URL\n\t * from a different domain that allows CORS.\n\t * @param {string} crossOrigin - The `crossOrigin` value.\n\t * @returns {Loader} A reference to this instance.\n\t */\n\tsetCrossOrigin(crossOrigin) {\n\t\tthis.crossOrigin = crossOrigin;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Whether the XMLHttpRequest uses credentials such as cookies, authorization\n\t * headers or TLS client certificates, see [XMLHttpRequest.withCredentials]{@link https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/withCredentials}.\n\t * Note: This setting has no effect if you are loading files locally or from the same domain.\n\t * @param {boolean} value - The `withCredentials` value.\n\t * @returns {Loader} A reference to this instance.\n\t */\n\tsetWithCredentials(value) {\n\t\tthis.withCredentials = value;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the base path for the asset.\n\t * @param {string} path - The base path.\n\t * @returns {Loader} A reference to this instance.\n\t */\n\tsetPath(path) {\n\t\tthis.path = path;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the given request header.\n\t * @param {object} requestHeader - A [request header]{@link https://developer.mozilla.org/en-US/docs/Glossary/Request_header}\n\t * for configuring the HTTP request.\n\t * @returns {Loader} A reference to this instance.\n\t */\n\tsetRequestHeader(requestHeader) {\n\t\tthis.requestHeader = requestHeader;\n\t\treturn this;\n\t}\n\n}\n\n/**\n * Callback for onProgress in loaders.\n * @callback onProgressCallback\n * @param {ProgressEvent} event - An instance of `ProgressEvent` that represents the current loading status.\n */\n\n/**\n * Callback for onError in loaders.\n * @callback onErrorCallback\n * @param {Error} error - The error which occurred during the loading process.\n */\n\nexport { Loader };"
  },
  {
    "path": "src/loaders/LoadingManager.js",
    "content": "/**\n * Handles and keeps track of loaded and pending data. A default global\n * instance of this class is created and used by loaders if not supplied\n * manually.\n * In general that should be sufficient, however there are times when it can\n * be useful to have separate loaders - for example if you want to show\n * separate loading bars for objects and textures.\n * ```js\n * const manager = new LoadingManager(\n *   () => console.log('All items loaded!'),\n *   (url, itemsLoaded, itemsTotal) => {\n *     console.log(`Loaded ${itemsLoaded} of ${itemsTotal} items`);\n *   },\n *   url => console.error(`Error loading ${url}`)\n * );\n * ```\n */\nclass LoadingManager {\n\n\t/**\n\t * Constructs a new loading manager.\n\t * @param {Function} [onLoad] - Executes when all items have been loaded.\n\t * @param {Function} [onProgress] - Executes when single items have been loaded.\n\t * @param {Function} [onError] - Executes when an error occurs.\n\t */\n\tconstructor(onLoad, onProgress, onError) {\n\t\tthis.isLoading = false;\n\t\tthis.itemsLoaded = 0;\n\t\tthis.itemsTotal = 0;\n\t\tthis.urlModifier = undefined;\n\n\t\t/**\n\t\t * Executes when an item starts loading.\n\t\t * @type {Function|undefined}\n\t\t * @default undefined\n\t\t */\n\t\tthis.onStart = undefined;\n\n\t\t/**\n\t\t * Executes when all items have been loaded.\n\t\t * @type {Function|undefined}\n\t\t * @default undefined\n\t\t */\n\t\tthis.onLoad = onLoad;\n\n\t\t/**\n\t\t * Executes when single items have been loaded.\n\t\t * @type {Function|undefined}\n\t\t * @default undefined\n\t\t */\n\t\tthis.onProgress = onProgress;\n\n\t\t/**\n\t\t * Executes when an error occurs.\n\t\t * @type {Function|undefined}\n\t\t * @default undefined\n\t\t */\n\t\tthis.onError = onError;\n\t}\n\n\t/**\n\t * This should be called by any loader using the manager when the loader\n\t * starts loading an item.\n\t * @param {string} url - The URL to load.\n\t */\n\titemStart(url) {\n\t\tthis.itemsTotal++;\n\n\t\tif (this.isLoading === false) {\n\t\t\tif (this.onStart !== undefined) {\n\t\t\t\tthis.onStart(url, this.itemsLoaded, this.itemsTotal);\n\t\t\t}\n\t\t}\n\n\t\tthis.isLoading = true;\n\t}\n\n\t/**\n\t * This should be called by any loader using the manager when the loader\n\t * ended loading an item.\n\t * @param {string} url - The URL of the loaded item.\n\t */\n\titemEnd(url) {\n\t\tthis.itemsLoaded++;\n\n\t\tif (this.onProgress !== undefined) {\n\t\t\tthis.onProgress(url, this.itemsLoaded, this.itemsTotal);\n\t\t}\n\n\t\tif (this.itemsLoaded === this.itemsTotal) {\n\t\t\tthis.isLoading = false;\n\n\t\t\tif (this.onLoad !== undefined) {\n\t\t\t\tthis.onLoad();\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * This should be called by any loader using the manager when the loader\n\t * encounters an error when loading an item.\n\t * @param {string} url - The URL of the item that produces an error.\n\t */\n\titemError(url) {\n\t\tif (this.onError !== undefined) {\n\t\t\tthis.onError(url);\n\t\t}\n\t}\n\n\t/**\n\t * Given a URL, uses the URL modifier callback (if any) and returns a\n\t * resolved URL. If no URL modifier is set, returns the original URL.\n\t * @param {string} url - The URL to load.\n\t * @returns {string} The resolved URL.\n\t */\n\tresolveURL(url) {\n\t\tif (this.urlModifier) {\n\t\t\treturn this.urlModifier(url);\n\t\t}\n\n\t\treturn url;\n\t}\n\n\t/**\n\t * If provided, the callback will be passed each resource URL before a\n\t * request is sent. The callback may return the original URL, or a new URL to\n\t * override loading behavior. This behavior can be used to load assets from\n\t * .ZIP files, drag-and-drop APIs, and Data URIs.\n\t * @param {Function} transform - URL modifier callback. Called with an URL and must return a resolved URL.\n\t * @returns {LoadingManager} A reference to this loading manager.\n\t * @example\n\t * const blobs = { 'fish.gltf': blob1, 'diffuse.png': blob2, 'normal.png': blob3 };\n\t *\n\t * const manager = new LoadingManager();\n\t *\n\t * // Initialize loading manager with URL callback.\n\t * const objectURLs = [];\n\t * manager.setURLModifier(url => {\n\t * \t url = URL.createObjectURL(blobs[url]);\n\t * \t objectURLs.push(url);\n\t * \t return url;\n\t * });\n\t *\n\t * // Load as usual, then revoke the blob URLs.\n\t * const loader = new GLTFLoader(manager);\n\t * loader.load('fish.gltf', gltf => {\n\t * \t scene.add(gltf.scene);\n\t * \t objectURLs.forEach(url => URL.revokeObjectURL(url));\n\t * });\n\t */\n\tsetURLModifier(transform) {\n\t\tthis.urlModifier = transform;\n\t\treturn this;\n\t}\n\n}\n\n/**\n * The global default loading manager.\n * @type {LoadingManager}\n */\nconst DefaultLoadingManager = new LoadingManager();\n\nexport { DefaultLoadingManager, LoadingManager };"
  },
  {
    "path": "src/main.js",
    "content": "export { BooleanKeyframeTrack } from './animation/tracks/BooleanKeyframeTrack.js';\nexport { ColorKeyframeTrack } from './animation/tracks/ColorKeyframeTrack.js';\nexport { NumberKeyframeTrack } from './animation/tracks/NumberKeyframeTrack.js';\nexport { QuaternionKeyframeTrack } from './animation/tracks/QuaternionKeyframeTrack.js';\nexport { StringKeyframeTrack } from './animation/tracks/StringKeyframeTrack.js';\nexport { VectorKeyframeTrack } from './animation/tracks/VectorKeyframeTrack.js';\nexport { AnimationAction } from './animation/AnimationAction.js';\nexport { AnimationMixer } from './animation/AnimationMixer.js';\nexport { KeyframeClip } from './animation/KeyframeClip.js';\nexport * from './animation/KeyframeInterpolants.js';\nexport { KeyframeTrack } from './animation/KeyframeTrack.js';\nexport { PropertyBindingMixer } from './animation/PropertyBindingMixer.js';\n\nexport { FileLoader } from './loaders/FileLoader.js';\nexport { ImageLoader } from './loaders/ImageLoader.js';\nexport { Loader } from './loaders/Loader.js';\nexport { DefaultLoadingManager, LoadingManager } from './loaders/LoadingManager.js';\n\nexport { Box2 } from './math/Box2.js';\nexport { Box3 } from './math/Box3.js';\nexport { Color3 } from './math/Color3.js';\nexport { Color4 } from './math/Color4.js';\nexport { Euler } from './math/Euler.js';\nexport { Frustum } from './math/Frustum.js';\nexport { MathUtils } from './math/MathUtils.js';\nexport { Matrix3 } from './math/Matrix3.js';\nexport { Matrix4 } from './math/Matrix4.js';\nexport { Plane } from './math/Plane.js';\nexport { Quaternion } from './math/Quaternion.js';\nexport { Ray } from './math/Ray.js';\nexport { Sphere } from './math/Sphere.js';\nexport { Spherical } from './math/Spherical.js';\nexport { SphericalHarmonics3 } from './math/SphericalHarmonics3.js';\nexport { Triangle } from './math/Triangle.js';\nexport { Vector2 } from './math/Vector2.js';\nexport { Vector3 } from './math/Vector3.js';\nexport { Vector4 } from './math/Vector4.js';\n\nexport { ShaderPostPass } from './render/passes/ShaderPostPass.js';\nexport { ShadowMapPass } from './render/passes/ShadowMapPass.js';\n\nexport { PropertyMap } from './render/PropertyMap.js';\nexport { RenderInfo } from './render/RenderInfo.js';\nexport { RenderQueue } from './render/RenderQueue.js';\nexport { RenderQueueLayer } from './render/RenderQueueLayer.js';\nexport { RenderStates } from './render/RenderStates.js';\nexport { SceneData } from './render/SceneData.js';\nexport { ThinRenderer } from './render/ThinRenderer.js';\n\nexport { Fog } from './resources/fogs/Fog.js';\nexport { FogExp2 } from './resources/fogs/FogExp2.js';\n\nexport { Attribute } from './resources/geometries/Attribute.js';\nexport { BoxGeometry } from './resources/geometries/BoxGeometry.js';\nexport { Buffer } from './resources/geometries/Buffer.js';\nexport { CylinderGeometry } from './resources/geometries/CylinderGeometry.js';\nexport { Geometry } from './resources/geometries/Geometry.js';\nexport { PlaneGeometry } from './resources/geometries/PlaneGeometry.js';\nexport { SphereGeometry } from './resources/geometries/SphereGeometry.js';\nexport { TorusKnotGeometry } from './resources/geometries/TorusKnotGeometry.js';\n\nexport { BasicMaterial } from './resources/materials/BasicMaterial.js';\nexport { DepthMaterial } from './resources/materials/DepthMaterial.js';\nexport { DistanceMaterial } from './resources/materials/DistanceMaterial.js';\nexport { LambertMaterial } from './resources/materials/LambertMaterial.js';\nexport { LineMaterial } from './resources/materials/LineMaterial.js';\nexport { Material } from './resources/materials/Material.js';\nexport { PBR2Material } from './resources/materials/PBR2Material.js';\nexport { PBRMaterial } from './resources/materials/PBRMaterial.js';\nexport { PhongMaterial } from './resources/materials/PhongMaterial.js';\nexport { PointsMaterial } from './resources/materials/PointsMaterial.js';\nexport { ShaderMaterial } from './resources/materials/ShaderMaterial.js';\n\nexport { CameraProjection } from './resources/projections/CameraProjection.js';\nexport { OrthographicProjection } from './resources/projections/OrthographicProjection.js';\nexport { PerspectiveProjection } from './resources/projections/PerspectiveProjection.js';\n\nexport { OffscreenRenderTarget } from './resources/targets/OffscreenRenderTarget.js';\nexport { ScreenRenderTarget } from './resources/targets/ScreenRenderTarget.js';\nexport { RenderTargetBase } from './resources/targets/RenderTargetBase.js';\n\nexport { Texture2D } from './resources/textures/Texture2D.js';\nexport { Texture2DArray } from './resources/textures/Texture2DArray.js';\nexport { Texture3D } from './resources/textures/Texture3D.js';\nexport { TextureBase } from './resources/textures/TextureBase.js';\nexport { TextureCube } from './resources/textures/TextureCube.js';\n\nexport { QuerySet } from './resources/QuerySet.js';\nexport { Raycaster } from './resources/Raycaster.js';\nexport { RenderBuffer } from './resources/RenderBuffer.js';\nexport { Skeleton } from './resources/Skeleton.js';\nexport { TransformUV } from './resources/TransformUV.js';\n\nexport { AmbientLight } from './scenes/lights/AmbientLight.js';\nexport { DirectionalLight } from './scenes/lights/DirectionalLight.js';\nexport { DirectionalLightShadow } from './scenes/lights/DirectionalLightShadow.js';\nexport { HemisphereLight } from './scenes/lights/HemisphereLight.js';\nexport { LightShadow } from './scenes/lights/LightShadow.js';\nexport { PointLight } from './scenes/lights/PointLight.js';\nexport { PointLightShadow } from './scenes/lights/PointLightShadow.js';\nexport { RectAreaLight } from './scenes/lights/RectAreaLight.js';\nexport { SphericalHarmonicsLight } from './scenes/lights/SphericalHarmonicsLight.js';\nexport { SpotLight } from './scenes/lights/SpotLight.js';\nexport { SpotLightShadow } from './scenes/lights/SpotLightShadow.js';\n\nexport { Bone } from './scenes/Bone.js';\nexport { Camera } from './scenes/Camera.js';\nexport { Light } from './scenes/Light.js';\nexport { Mesh } from './scenes/Mesh.js';\nexport { Object3D } from './scenes/Object3D.js';\nexport { Scene } from './scenes/Scene.js';\nexport { SkinnedMesh } from './scenes/SkinnedMesh.js';\n\nexport { ShaderChunk } from './shaders/ShaderChunk.js';\nexport { ShaderLib } from './shaders/ShaderLib.js';\n\nexport { WebGLAttribute } from './webgl/WebGLAttribute.js';\nexport { WebGLCapabilities } from './webgl/WebGLCapabilities.js';\nexport { WebGLGeometries } from './webgl/WebGLGeometries.js';\nexport { WebGLProgram } from './webgl/WebGLProgram.js';\nexport { WebGLPrograms } from './webgl/WebGLPrograms.js';\nexport { WebGLQuerySets } from './webgl/WebGLQuerySets.js';\nexport { WebGLRenderer } from './webgl/WebGLRenderer.js';\nexport { WebGLState } from './webgl/WebGLState.js';\nexport { WebGLTextures } from './webgl/WebGLTextures.js';\nexport { WebGLRenderBuffers } from './webgl/WebGLRenderBuffers.js';\nexport { WebGLUniforms } from './webgl/WebGLUniforms.js';\n\nexport * from './base.js';\nexport * from './const.js';\nexport { EventDispatcher } from './EventDispatcher.js';\nexport * from './legacy.js';"
  },
  {
    "path": "src/math/Box2.js",
    "content": "import { Vector2 } from './Vector2.js';\n\n/**\n * Represents an axis-aligned bounding box (AABB) in 2D space.\n */\nclass Box2 {\n\n\t/**\n\t * @param {Vector2} min - (optional) Vector2 representing the lower (x, y) boundary of the box.\n\t * \t\t\t\t\t\t\t\tDefault is ( + Infinity, + Infinity ).\n\t * @param {Vector2} max - (optional) Vector2 representing the upper (x, y) boundary of the box.\n\t * \t\t\t\t\t\t\t\tDefault is ( - Infinity, - Infinity ).\n\t */\n\tconstructor(min, max) {\n\t\tthis.min = (min !== undefined) ? min : new Vector2(+Infinity, +Infinity);\n\t\tthis.max = (max !== undefined) ? max : new Vector2(-Infinity, -Infinity);\n\t}\n\n\t/**\n\t * @param {number} x1\n\t * @param {number} y1\n\t * @param {number} x2\n\t * @param {number} y2\n\t */\n\tset(x1, y1, x2, y2) {\n\t\tthis.min.set(x1, y1);\n\t\tthis.max.set(x2, y2);\n\t}\n\n\t/**\n\t * Returns a new Box2 with the same min and max as this one.\n\t * @returns {Box2}\n\t */\n\tclone() {\n\t\treturn new Box2().copy(this);\n\t}\n\n\t/**\n\t * Copies the min and max from box to this box.\n\t * @param {Box2} box\n\t * @returns {Box2}\n\t */\n\tcopy(box) {\n\t\tthis.min.copy(box.min);\n\t\tthis.max.copy(box.max);\n\n\t\treturn this;\n\t}\n\n}\n\n/**\n * This flag can be used for type testing.\n * @readonly\n * @type {boolean}\n * @default true\n */\nBox2.prototype.isBox2 = true;\n\nexport { Box2 };"
  },
  {
    "path": "src/math/Box3.js",
    "content": "import { Vector3 } from './Vector3.js';\nimport { MathUtils } from './MathUtils.js';\n\n/**\n * Represents an axis-aligned bounding box (AABB) in 3D space.\n */\nclass Box3 {\n\n\t/**\n\t * @param {Vector3} min - (optional) Vector3 representing the lower (x, y, z) boundary of the box.\n\t * \t\t\t\t\t\t\t\tDefault is ( + Infinity, + Infinity, + Infinity ).\n\t * @param {Vector3} max - (optional) Vector3 representing the upper (x, y, z) boundary of the box.\n\t * \t\t\t\t\t\t\t\tDefault is ( - Infinity, - Infinity, - Infinity ).\n\t */\n\tconstructor(min, max) {\n\t\tthis.min = (min !== undefined) ? min : new Vector3(+Infinity, +Infinity, +Infinity);\n\t\tthis.max = (max !== undefined) ? max : new Vector3(-Infinity, -Infinity, -Infinity);\n\t}\n\n\t/**\n\t * Sets the lower and upper (x, y, z) boundaries of this box.\n\t * @param {Vector3} min - Vector3 representing the lower (x, y, z) boundary of the box.\n\t * @param {Vector3} max - Vector3 representing the lower upper (x, y, z) boundary of the box.\n\t */\n\tset(min, max) {\n\t\tthis.min.copy(min);\n\t\tthis.max.copy(max);\n\t}\n\n\t/**\n\t * Sets the upper and lower bounds of this box to include all of the points in points.\n\t * @param {Vector3[]} points - Array of Vector3s that the resulting box will contain.\n\t * @returns {Box3}\n\t */\n\tsetFromPoints(points) {\n\t\tthis.makeEmpty();\n\n\t\tfor (let i = 0, il = points.length; i < il; i++) {\n\t\t\tthis.expandByPoint(points[i]);\n\t\t}\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Makes this box empty.\n\t * @returns {Box3}\n\t */\n\tmakeEmpty() {\n\t\tthis.min.x = this.min.y = this.min.z = +Infinity;\n\t\tthis.max.x = this.max.y = this.max.z = -Infinity;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Expands the boundaries of this box to include point.\n\t * @param {Vector3} point - Vector3 that should be included in the box.\n\t * @returns {Box3}\n\t */\n\texpandByPoint(point) {\n\t\tthis.min.min(point);\n\t\tthis.max.max(point);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Expands each dimension of the box by scalar. If negative, the dimensions of the box will be contracted.\n\t * @param {number} scalar - Distance to expand the box by.\n\t * @returns {Box3}\n\t */\n\texpandByScalar(scalar) {\n\t\tthis.min.addScalar(-scalar);\n\t\tthis.max.addScalar(scalar);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Expands the boundaries of this box to include box3.\n\t * @param {Box3} box3 - Box that will be unioned with this box.\n\t * @returns {Box3}\n\t */\n\texpandByBox3(box3) {\n\t\tthis.min.min(box3.min);\n\t\tthis.max.max(box3.max);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the upper and lower bounds of this box to include all of the data in array.\n\t * @param {number[]} array - An array of position data that the resulting box will envelop.\n\t * @param {number} [gap=3] - The number of elements between the start of each position in the array.\n\t * @param {number} [offset=0] - The offset in each gap where the position data starts.\n\t * @param {boolean} [denormalize=false] - Whether to denormalize the values in the array.\n\t * @returns {Box3} A reference to this box.\n\t */\n\tsetFromArray(array, gap = 3, offset = 0, denormalize = false) {\n\t\tlet minX = +Infinity;\n\t\tlet minY = +Infinity;\n\t\tlet minZ = +Infinity;\n\n\t\tlet maxX = -Infinity;\n\t\tlet maxY = -Infinity;\n\t\tlet maxZ = -Infinity;\n\n\t\tfor (let i = 0, l = array.length; i < l; i += gap) {\n\t\t\tlet x = array[i + offset];\n\t\t\tlet y = array[i + offset + 1];\n\t\t\tlet z = array[i + offset + 2];\n\n\t\t\tif (denormalize) {\n\t\t\t\tx = MathUtils.denormalize(x, array);\n\t\t\t\ty = MathUtils.denormalize(y, array);\n\t\t\t\tz = MathUtils.denormalize(z, array);\n\t\t\t}\n\n\t\t\tif (x < minX) minX = x;\n\t\t\tif (y < minY) minY = y;\n\t\t\tif (z < minZ) minZ = z;\n\n\t\t\tif (x > maxX) maxX = x;\n\t\t\tif (y > maxY) maxY = y;\n\t\t\tif (z > maxZ) maxZ = z;\n\t\t}\n\n\t\tthis.min.set(minX, minY, minZ);\n\t\tthis.max.set(maxX, maxY, maxZ);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Clamps the point within the bounds of this box.\n\t * @param {Vector3} point - Vector3 to clamp.\n\t * @param {Vector3} target - Vector3 to store the result in.\n\t * @returns {Vector3}\n\t */\n\tclampPoint(point, target) {\n\t\treturn target.copy(point).min(this.max).max(this.min);\n\t}\n\n\t/**\n\t * Returns the distance from any edge of this box to the specified point.\n\t * If the point lies inside of this box, the distance will be 0.\n\t * @param {Vector3} point - Vector3 to measure the distance to.\n\t * @returns {number}\n\t */\n\tdistanceToPoint(point) {\n\t\treturn this.clampPoint(point, _vec3_1).distanceTo(point);\n\t}\n\n\t/**\n\t * Returns aMinimum Bounding Sphere for the box.\n\t * @param {Sphere} target — the result will be copied into this Sphere.\n\t * @returns {Sphere}\n\t */\n\tgetBoundingSphere(target) {\n\t\tif (this.isEmpty()) {\n\t\t\ttarget.makeEmpty();\n\t\t} else {\n\t\t\tthis.getCenter(target.center);\n\t\t\ttarget.radius = this.getSize(_vec3_1).getLength() * 0.5;\n\t\t}\n\n\t\treturn target;\n\t}\n\n\t/**\n\t * Returns true if this box includes zero points within its bounds.\n\t * @returns {boolean}\n\t */\n\tisEmpty() {\n\t\t// this is a more robust check for empty than ( volume <= 0 ) because volume can get positive with two negative axes\n\t\treturn (this.max.x < this.min.x) || (this.max.y < this.min.y) || (this.max.z < this.min.z);\n\t}\n\n\t/**\n\t * Returns true if this box and box share the same lower and upper bounds.\n\t * @param {Box3} box - Box to compare with this one.\n\t * @returns {boolean}\n\t */\n\tequals(box) {\n\t\treturn box.min.equals(this.min) && box.max.equals(this.max);\n\t}\n\n\t/**\n\t * Returns the center point of the box as a Vector3.\n\t * @param {Vector3} target - the result will be copied into this Vector3.\n\t * @returns {Vector3}\n\t */\n\tgetCenter(target = new Vector3()) {\n\t\treturn this.isEmpty() ? target.set(0, 0, 0) : target.addVectors(this.min, this.max).multiplyScalar(0.5);\n\t}\n\n\t/**\n\t * Returns the width, height and depth of this box.\n\t * @param {Vector3} target - the result will be copied into this Vector3.\n\t * @returns {Vector3}\n\t */\n\tgetSize(target = new Vector3()) {\n\t\treturn this.isEmpty() ? target.set(0, 0, 0) : target.subVectors(this.max, this.min);\n\t}\n\n\t/**\n\t * Get the 8 corner points of the bounding box, the order is as follows:\n\t *   7-------3\n\t *  /|      /|\n\t * 4-------0 |\n\t * | |     | |\n\t * | 6-----|-2\n\t * |/      |/\n\t * 5-------1\n\t * @param {Vector3[]} points - The array to store the points.\n\t * @returns {Vector3[]} The array of points.\n\t */\n\tgetPoints(points) {\n\t\tconst minX = this.min.x, minY = this.min.y, minZ = this.min.z;\n\t\tconst maxX = this.max.x, maxY = this.max.y, maxZ = this.max.z;\n\n\t\tpoints[0].set(maxX, maxY, maxZ);\n\t\tpoints[1].set(maxX, minY, maxZ);\n\t\tpoints[2].set(maxX, minY, minZ);\n\t\tpoints[3].set(maxX, maxY, minZ);\n\t\tpoints[4].set(minX, maxY, maxZ);\n\t\tpoints[5].set(minX, minY, maxZ);\n\t\tpoints[6].set(minX, minY, minZ);\n\t\tpoints[7].set(minX, maxY, minZ);\n\n\t\treturn points;\n\t}\n\n\t/**\n\t * Computes the union of this box and box,\n\t * setting the upper bound of this box to the greater of the two boxes' upper bounds and the lower bound of this box to the lesser of the two boxes' lower bounds.\n\t * @param {Box3} box - Box that will be unioned with this box.\n\t * @returns {Box3}\n\t */\n\tunion(box) {\n\t\tthis.min.min(box.min);\n\t\tthis.max.max(box.max);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Transforms this Box3 with the supplied matrix.\n\t * @param {Matrix4} matrix - The Matrix4 to apply\n\t * @returns {Box3}\n\t */\n\tapplyMatrix4(matrix) {\n\t\t// transform of empty box is an empty box.\n\t\tif (this.isEmpty()) return this;\n\n\t\t// NOTE: I am using a binary pattern to specify all 2^3 combinations below\n\t\t_points[0].set(this.min.x, this.min.y, this.min.z).applyMatrix4(matrix); // 000\n\t\t_points[1].set(this.min.x, this.min.y, this.max.z).applyMatrix4(matrix); // 001\n\t\t_points[2].set(this.min.x, this.max.y, this.min.z).applyMatrix4(matrix); // 010\n\t\t_points[3].set(this.min.x, this.max.y, this.max.z).applyMatrix4(matrix); // 011\n\t\t_points[4].set(this.max.x, this.min.y, this.min.z).applyMatrix4(matrix); // 100\n\t\t_points[5].set(this.max.x, this.min.y, this.max.z).applyMatrix4(matrix); // 101\n\t\t_points[6].set(this.max.x, this.max.y, this.min.z).applyMatrix4(matrix); // 110\n\t\t_points[7].set(this.max.x, this.max.y, this.max.z).applyMatrix4(matrix); // 111\n\n\t\tthis.setFromPoints(_points);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Returns true if the specified point lies within or on the boundaries of this box.\n\t * @param {Vector3} point - Vector3 to check for inclusion.\n\t * @returns {boolean}\n\t */\n\tcontainsPoint(point) {\n\t\treturn point.x < this.min.x || point.x > this.max.x ||\n\t\t\tpoint.y < this.min.y || point.y > this.max.y ||\n\t\t\tpoint.z < this.min.z || point.z > this.max.z ? false : true;\n\t}\n\n\t/**\n\t * Determines whether or not this box intersects triangle.\n\t * @param {Triangle} triangle - Triangle to check for intersection against.\n\t * @returns {boolean}\n\t */\n\tintersectsTriangle(triangle) {\n\t\tif (this.isEmpty()) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// compute box center and extents\n\t\tthis.getCenter(_center);\n\t\t_extents.subVectors(this.max, _center);\n\n\t\t// translate triangle to aabb origin\n\t\t_v0.subVectors(triangle.a, _center);\n\t\t_v1.subVectors(triangle.b, _center);\n\t\t_v2.subVectors(triangle.c, _center);\n\n\t\t// compute edge vectors for triangle\n\t\t_f0.subVectors(_v1, _v0);\n\t\t_f1.subVectors(_v2, _v1);\n\t\t_f2.subVectors(_v0, _v2);\n\n\t\t// test against axes that are given by cross product combinations of the edges of the triangle and the edges of the aabb\n\t\t// make an axis testing of each of the 3 sides of the aabb against each of the 3 sides of the triangle = 9 axis of separation\n\t\t// axis_ij = u_i x f_j (u0, u1, u2 = face normals of aabb = x,y,z axes vectors since aabb is axis aligned)\n\t\tlet axes = [\n\t\t\t0, -_f0.z, _f0.y, 0, -_f1.z, _f1.y, 0, -_f2.z, _f2.y,\n\t\t\t_f0.z, 0, -_f0.x, _f1.z, 0, -_f1.x, _f2.z, 0, -_f2.x,\n\t\t\t-_f0.y, _f0.x, 0, -_f1.y, _f1.x, 0, -_f2.y, _f2.x, 0\n\t\t];\n\t\tif (!satForAxes(axes, _v0, _v1, _v2, _extents)) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// test 3 face normals from the aabb\n\t\taxes = [1, 0, 0, 0, 1, 0, 0, 0, 1];\n\t\tif (!satForAxes(axes, _v0, _v1, _v2, _extents)) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// finally testing the face normal of the triangle\n\t\t// use already existing triangle edge vectors here\n\t\t_triangleNormal.crossVectors(_f0, _f1);\n\t\taxes = [_triangleNormal.x, _triangleNormal.y, _triangleNormal.z];\n\n\t\treturn satForAxes(axes, _v0, _v1, _v2, _extents);\n\t}\n\n\t/**\n\t * Returns a new Box3 with the same min and max as this one.\n\t * @returns {Box3}\n\t */\n\tclone() {\n\t\treturn new Box3().copy(this);\n\t}\n\n\t/**\n\t * Copies the min and max from box to this box.\n\t * @param {Box3} box - Box3 to copy.\n\t * @returns {Box3}\n\t */\n\tcopy(box) {\n\t\tthis.min.copy(box.min);\n\t\tthis.max.copy(box.max);\n\n\t\treturn this;\n\t}\n\n}\n\n/**\n * This flag can be used for type testing.\n * @readonly\n * @type {boolean}\n * @default true\n */\nBox3.prototype.isBox3 = true;\n\nconst _points = [\n\tnew Vector3(),\n\tnew Vector3(),\n\tnew Vector3(),\n\tnew Vector3(),\n\tnew Vector3(),\n\tnew Vector3(),\n\tnew Vector3(),\n\tnew Vector3()\n];\n\nconst _vec3_1 = new Vector3();\n\n// triangle centered vertices\n\nconst _v0 = new Vector3();\nconst _v1 = new Vector3();\nconst _v2 = new Vector3();\n\n// triangle edge vectors\n\nconst _f0 = new Vector3();\nconst _f1 = new Vector3();\nconst _f2 = new Vector3();\n\nconst _center = new Vector3();\nconst _extents = new Vector3();\nconst _triangleNormal = new Vector3();\nconst _testAxis = new Vector3();\n\nfunction satForAxes(axes, v0, v1, v2, extents) {\n\tfor (let i = 0, j = axes.length - 3; i <= j; i += 3) {\n\t\t_testAxis.fromArray(axes, i);\n\t\t// project the aabb onto the separating axis\n\t\tconst r = extents.x * Math.abs(_testAxis.x) + extents.y * Math.abs(_testAxis.y) + extents.z * Math.abs(_testAxis.z);\n\t\t// project all 3 vertices of the triangle onto the separating axis\n\t\tconst p0 = v0.dot(_testAxis);\n\t\tconst p1 = v1.dot(_testAxis);\n\t\tconst p2 = v2.dot(_testAxis);\n\t\t// actual test, basically see if either of the most extreme of the triangle points intersects r\n\t\tif (Math.max(-Math.max(p0, p1, p2), Math.min(p0, p1, p2)) > r) {\n\t\t\t// points of the projected triangle are outside the projected half-length of the aabb\n\t\t\t// the axis is separating and we can exit\n\t\t\treturn false;\n\t\t}\n\t}\n\n\treturn true;\n}\n\nexport { Box3 };"
  },
  {
    "path": "src/math/Color3.js",
    "content": "import { MathUtils } from './MathUtils.js';\n\n/**\n * A Color3 instance is represented by RGB components.\n */\nclass Color3 {\n\n\t/**\n\t * Constructs a new three-component color.\n\t * @param {number} [r] - The red component of the color. If `g` and `b` are not provided, it can be a hexadecimal triplet.\n\t * @param {number} [g] - The green component.\n\t * @param {number} [b] - The blue component.\n\t */\n\tconstructor(r, g, b) {\n\t\t/**\n\t\t * The red component.\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.r = 0;\n\n\t\t/**\n\t\t * The green component.\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.g = 0;\n\n\t\t/**\n\t\t * The blue component.\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.b = 0;\n\n\t\tif (g === undefined && b === undefined) {\n\t\t\tthis.setHex(r);\n\t\t} else {\n\t\t\tthis.setRGB(r, g, b);\n\t\t}\n\t}\n\n\t/**\n\t * Sets this color from a hexadecimal value.\n\t * @param {number} hex - The hexadecimal value.\n\t * @returns {Color3} A reference to this color.\n\t */\n\tsetHex(hex) {\n\t\thex = Math.floor(hex);\n\n\t\tthis.r = (hex >> 16 & 255) / 255;\n\t\tthis.g = (hex >> 8 & 255) / 255;\n\t\tthis.b = (hex & 255) / 255;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets this color from RGB values.\n\t * @param {number} r - Red channel value between 0.0 and 1.0.\n\t * @param {number} g - Green channel value between 0.0 and 1.0.\n\t * @param {number} b - Blue channel value between 0.0 and 1.0.\n\t * @returns {Color3} A reference to this color.\n\t */\n\tsetRGB(r, g, b) {\n\t\tthis.r = r;\n\t\tthis.g = g;\n\t\tthis.b = b;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Set this color from HSL values.\n\t * @param {number} h - Hue value between 0.0 and 1.0.\n\t * @param {number} s - Saturation value between 0.0 and 1.0.\n\t * @param {number} l - Lightness value between 0.0 and 1.0.\n\t * @returns {Color3} A reference to this color.\n\t */\n\tsetHSL(h, s, l) {\n\t\t// h,s,l ranges are in 0.0 - 1.0\n\t\th = MathUtils.euclideanModulo(h, 1);\n\t\ts = MathUtils.clamp(s, 0, 1);\n\t\tl = MathUtils.clamp(l, 0, 1);\n\n\t\tif (s === 0) {\n\t\t\tthis.r = this.g = this.b = l;\n\t\t} else {\n\t\t\tconst p = l <= 0.5 ? l * (1 + s) : l + s - (l * s);\n\t\t\tconst q = (2 * l) - p;\n\n\t\t\tthis.r = hue2rgb(q, p, h + 1 / 3);\n\t\t\tthis.g = hue2rgb(q, p, h);\n\t\t\tthis.b = hue2rgb(q, p, h - 1 / 3);\n\t\t}\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Returns a new color with copied values from this instance.\n\t * @returns {Color3} A clone of this instance.\n\t */\n\tclone() {\n\t\treturn new this.constructor(this.r, this.g, this.b);\n\t}\n\n\t/**\n\t * Copies the values of the given color to this instance.\n\t * @param {Color3} color - The color to copy.\n\t * @returns {Color3} A reference to this color.\n\t */\n\tcopy(color) {\n\t\tthis.r = color.r;\n\t\tthis.g = color.g;\n\t\tthis.b = color.b;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Converts this color from sRGB space to linear space.\n\t * @returns {Color3} A reference to this color.\n\t */\n\tconvertSRGBToLinear() {\n\t\tthis.r = SRGBToLinear(this.r);\n\t\tthis.g = SRGBToLinear(this.g);\n\t\tthis.b = SRGBToLinear(this.b);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Converts this color from linear space to sRGB space.\n\t * @returns {Color3} A reference to this color.\n\t */\n\tconvertLinearToSRGB() {\n\t\tthis.r = LinearToSRGB(this.r);\n\t\tthis.g = LinearToSRGB(this.g);\n\t\tthis.b = LinearToSRGB(this.b);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Returns the hexadecimal value of this color.\n\t * @returns {number} The hexadecimal value.\n\t */\n\tgetHex() {\n\t\treturn MathUtils.clamp(this.r * 255, 0, 255) << 16 ^ MathUtils.clamp(this.g * 255, 0, 255) << 8 ^ MathUtils.clamp(this.b * 255, 0, 255) << 0;\n\t}\n\n\t/**\n\t * Linearly interpolates this color's RGB values toward the RGB values of the\n\t * given color. The alpha argument can be thought of as the ratio between\n\t * the two colors, where 0.0 is this color and 1.0 is the first argument.\n\t * @param {Color3} color - The color to converge on.\n\t * @param {number} alpha - The interpolation factor in the closed interval [0,1].\n\t * @returns {Color3} A reference to this color.\n\t */\n\tlerp(color, alpha) {\n\t\treturn this.lerpColors(this, color, alpha);\n\t}\n\n\t/**\n\t * Linearly interpolates between the given colors and stores the result in this instance.\n\t * The alpha argument can be thought of as the ratio between the two colors, where 0.0\n\t * is the first and 1.0 is the second color.\n\t * @param {Color3} color1 - The first color.\n\t * @param {Color3} color2 - The second color.\n\t * @param {number} alpha - The interpolation factor in the closed interval [0,1].\n\t * @returns {Color3} A reference to this color.\n\t */\n\tlerpColors(color1, color2, alpha) {\n\t\tthis.r = MathUtils.lerp(color1.r, color2.r, alpha);\n\t\tthis.g = MathUtils.lerp(color1.g, color2.g, alpha);\n\t\tthis.b = MathUtils.lerp(color1.b, color2.b, alpha);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets this color's RGB components from the given array.\n\t * @param {number[]} array - An array holding the RGB values.\n\t * @param {number} [offset=0] - The offset into the array.\n\t * @param {boolean} [denormalize=false] - If true, denormalize the values, and array should be a typed array.\n\t * @returns {Color3} A reference to this color.\n\t */\n\tfromArray(array, offset = 0, denormalize = false) {\n\t\tlet r = array[offset], g = array[offset + 1], b = array[offset + 2];\n\n\t\tif (denormalize) {\n\t\t\tr = MathUtils.denormalize(r, array);\n\t\t\tg = MathUtils.denormalize(g, array);\n\t\t\tb = MathUtils.denormalize(b, array);\n\t\t}\n\n\t\tthis.r = r;\n\t\tthis.g = g;\n\t\tthis.b = b;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Writes the RGB components of this color to the given array. If no array is provided,\n\t * the method returns a new instance.\n\t * @param {number[]} [array=[]] - The target array holding the color components.\n\t * @param {number} [offset=0] - Index of the first element in the array.\n\t * @param {boolean} [normalize=false] - If true, normalize the values, and array should be a typed array.\n\t * @returns {number[]} The color components.\n\t */\n\ttoArray(array = [], offset = 0, normalize = false) {\n\t\tlet r = this.r, g = this.g, b = this.b;\n\n\t\tif (normalize) {\n\t\t\tr = MathUtils.normalize(r, array);\n\t\t\tg = MathUtils.normalize(g, array);\n\t\t\tb = MathUtils.normalize(b, array);\n\t\t}\n\n\t\tarray[offset] = r;\n\t\tarray[offset + 1] = g;\n\t\tarray[offset + 2] = b;\n\n\t\treturn array;\n\t}\n\n\t* [Symbol.iterator]() {\n\t\tyield this.r;\n\t\tyield this.g;\n\t\tyield this.b;\n\t}\n\n}\n\n/**\n * This flag can be used for type testing.\n * @readonly\n * @type {boolean}\n * @default true\n */\nColor3.prototype.isColor3 = true;\n\nfunction hue2rgb(p, q, t) {\n\tif (t < 0) t += 1;\n\tif (t > 1) t -= 1;\n\tif (t < 1 / 6) return p + (q - p) * 6 * t;\n\tif (t < 1 / 2) return q;\n\tif (t < 2 / 3) return p + (q - p) * 6 * (2 / 3 - t);\n\treturn p;\n}\n\nfunction SRGBToLinear(c) {\n\treturn (c < 0.04045) ? c * 0.0773993808 : Math.pow(c * 0.9478672986 + 0.0521327014, 2.4);\n}\n\nfunction LinearToSRGB(c) {\n\treturn (c < 0.0031308) ? c * 12.92 : 1.055 * (Math.pow(c, 0.41666)) - 0.055;\n}\n\nexport { Color3 };"
  },
  {
    "path": "src/math/Color4.js",
    "content": "import { MathUtils } from './MathUtils.js';\n\n/**\n * A Color4 instance is represented by RGBA components.\n */\nclass Color4 {\n\n\t/**\n\t * Constructs a new four-component color.\n\t * @param {number} [r=0] - The red value.\n\t * @param {number} [g=0] - The green value.\n\t * @param {number} [b=0] - The blue value.\n\t * @param {number} [a=1] - The alpha value.\n\t */\n\tconstructor(r = 0, g = 0, b = 0, a = 1) {\n\t\t/**\n\t\t * The red component.\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.r = r;\n\n\t\t/**\n\t\t * The green component.\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.g = g;\n\n\t\t/**\n\t\t * The blue component.\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.b = b;\n\n\t\t/**\n\t\t * The alpha component.\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.a = a;\n\t}\n\n\t/**\n\t * Sets this color from RGBA values.\n\t * @param {number} r - Red channel value between 0.0 and 1.0.\n\t * @param {number} g - Green channel value between 0.0 and 1.0.\n\t * @param {number} b - Blue channel value between 0.0 and 1.0.\n\t * @param {number} a - Alpha channel value between 0.0 and 1.0.\n\t * @returns {Color4} A reference to this color.\n\t */\n\tsetRGBA(r, g, b, a) {\n\t\tthis.r = r;\n\t\tthis.g = g;\n\t\tthis.b = b;\n\t\tthis.a = a;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Returns a new color with copied values from this instance.\n\t * @returns {Color4} A clone of this instance.\n\t */\n\tclone() {\n\t\treturn new Color4(this.r, this.g, this.b, this.a);\n\t}\n\n\t/**\n\t * Copies the values of the given color to this instance.\n\t * @param {Color4} color - The color to copy.\n\t * @returns {Color4} A clone of this instance.\n\t */\n\tcopy(color) {\n\t\tthis.r = color.r;\n\t\tthis.g = color.g;\n\t\tthis.b = color.b;\n\t\tthis.a = color.a;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets this color's RGBA components from the given array.\n\t * @param {number[]} array - An array holding the RGBA values.\n\t * @param {number} [offset=0] - The offset into the array.\n\t * @param {boolean} [denormalize=false] - If true, denormalize the values, and array should be a typed array.\n\t * @returns {Color4} A reference to this color.\n\t */\n\tfromArray(array, offset = 0, denormalize = false) {\n\t\tlet r = array[offset], g = array[offset + 1], b = array[offset + 2], a = array[offset + 3];\n\n\t\tif (denormalize) {\n\t\t\tr = MathUtils.denormalize(r, array);\n\t\t\tg = MathUtils.denormalize(g, array);\n\t\t\tb = MathUtils.denormalize(b, array);\n\t\t\ta = MathUtils.denormalize(a, array);\n\t\t}\n\n\t\tthis.r = r;\n\t\tthis.g = g;\n\t\tthis.b = b;\n\t\tthis.a = a;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Writes the RGBA components of this color to the given array. If no array is provided,\n\t * the method returns a new instance.\n\t * @param {number[]} [array=[]] - The target array holding the color components.\n\t * @param {number} [offset=0] - Index of the first element in the array.\n\t * @param {boolean} [normalize=false] - If true, normalize the values, and array should be a typed array.\n\t * @returns {number[]} The color components.\n\t */\n\ttoArray(array = [], offset = 0, normalize = false) {\n\t\tlet r = this.r, g = this.g, b = this.b, a = this.a;\n\n\t\tif (normalize) {\n\t\t\tr = MathUtils.normalize(r, array);\n\t\t\tg = MathUtils.normalize(g, array);\n\t\t\tb = MathUtils.normalize(b, array);\n\t\t\ta = MathUtils.normalize(a, array);\n\t\t}\n\n\t\tarray[offset] = r;\n\t\tarray[offset + 1] = g;\n\t\tarray[offset + 2] = b;\n\t\tarray[offset + 3] = a;\n\n\t\treturn array;\n\t}\n\n\t* [Symbol.iterator]() {\n\t\tyield this.r;\n\t\tyield this.g;\n\t\tyield this.b;\n\t\tyield this.a;\n\t}\n\n}\n\n/**\n * This flag can be used for type testing.\n * @readonly\n * @type {boolean}\n * @default true\n */\nColor4.prototype.isColor4 = true;\n\nexport { Color4 };"
  },
  {
    "path": "src/math/Euler.js",
    "content": "import { Matrix4 } from './Matrix4.js';\nimport { MathUtils } from './MathUtils.js';\n\nconst _matrix = new Matrix4();\n\n/**\n * Euler class.\n */\nclass Euler {\n\n\t/**\n\t * @param {number} [x=0]\n\t * @param {number} [y=0]\n\t * @param {number} [z=0]\n\t * @param {string} [order=Euler.DefaultOrder]\n\t */\n\tconstructor(x = 0, y = 0, z = 0, order = Euler.DefaultOrder) {\n\t\tthis._x = x;\n\t\tthis._y = y;\n\t\tthis._z = z;\n\t\tthis._order = order;\n\t}\n\n\t/**\n\t * @type {number}\n\t */\n\tget x() {\n\t\treturn this._x;\n\t}\n\n\t/**\n\t * @type {number}\n\t */\n\tset x(value) {\n\t\tthis._x = value;\n\t\tthis.onChangeCallback();\n\t}\n\n\t/**\n\t * @type {number}\n\t */\n\tget y() {\n\t\treturn this._y;\n\t}\n\n\t/**\n\t * @type {number}\n\t */\n\tset y(value) {\n\t\tthis._y = value;\n\t\tthis.onChangeCallback();\n\t}\n\n\t/**\n\t * @type {number}\n\t */\n\tget z() {\n\t\treturn this._z;\n\t}\n\n\t/**\n\t * @type {number}\n\t */\n\tset z(value) {\n\t\tthis._z = value;\n\t\tthis.onChangeCallback();\n\t}\n\n\t/**\n\t * @type {string}\n\t */\n\tget order() {\n\t\treturn this._order;\n\t}\n\n\t/**\n\t * @type {string}\n\t */\n\tset order(value) {\n\t\tthis._order = value;\n\t\tthis.onChangeCallback();\n\t}\n\n\t/**\n\t * Returns a new Euler with the same parameters as this one.\n\t * @returns {Euler}\n\t */\n\tclone() {\n\t\treturn new Euler(this._x, this._y, this._z, this._order);\n\t}\n\n\t/**\n\t * Copies value of euler to this euler.\n\t * @param {Euler} euler\n\t * @returns {Euler}\n\t */\n\tcopy(euler) {\n\t\tthis._x = euler._x;\n\t\tthis._y = euler._y;\n\t\tthis._z = euler._z;\n\t\tthis._order = euler._order;\n\n\t\tthis.onChangeCallback();\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * @param {number} x - the angle of the x axis in radians.\n\t * @param {number} y - the angle of the y axis in radians.\n\t * @param {number} z - the angle of the z axis in radians.\n\t * @param {string} order - (optional) a string representing the order that the rotations are applied.\n\t * @returns {Euler}\n\t */\n\tset(x = 0, y = 0, z = 0, order = this._order) {\n\t\tthis._x = x;\n\t\tthis._y = y;\n\t\tthis._z = z;\n\t\tthis._order = order;\n\n\t\tthis.onChangeCallback();\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the angles of this euler transform from a pure rotation matrix based on the orientation specified by order.\n\t * @param {Matrix4} m - a Matrix4 of which the upper 3x3 of matrix is a pure rotation matrix\n\t * @param {string} order - (optional) a string representing the order that the rotations are applied.\n\t * @param {boolean} [update=true] - Whether to notify Euler angle has changed\n\t * @returns {Euler}\n\t */\n\tsetFromRotationMatrix(m, order = this._order, update = true) {\n\t\t// assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)\n\n\t\tconst te = m.elements;\n\t\tconst m11 = te[0], m12 = te[4], m13 = te[8];\n\t\tconst m21 = te[1], m22 = te[5], m23 = te[9];\n\t\tconst m31 = te[2], m32 = te[6], m33 = te[10];\n\n\t\tif (order === 'XYZ') {\n\t\t\tthis._y = Math.asin(MathUtils.clamp(m13, -1, 1));\n\n\t\t\tif (Math.abs(m13) < 0.99999) {\n\t\t\t\tthis._x = Math.atan2(-m23, m33);\n\t\t\t\tthis._z = Math.atan2(-m12, m11);\n\t\t\t} else {\n\t\t\t\tthis._x = Math.atan2(m32, m22);\n\t\t\t\tthis._z = 0;\n\t\t\t}\n\t\t} else if (order === 'YXZ') {\n\t\t\tthis._x = Math.asin(-MathUtils.clamp(m23, -1, 1));\n\n\t\t\tif (Math.abs(m23) < 0.99999) {\n\t\t\t\tthis._y = Math.atan2(m13, m33);\n\t\t\t\tthis._z = Math.atan2(m21, m22);\n\t\t\t} else {\n\t\t\t\tthis._y = Math.atan2(-m31, m11);\n\t\t\t\tthis._z = 0;\n\t\t\t}\n\t\t} else if (order === 'ZXY') {\n\t\t\tthis._x = Math.asin(MathUtils.clamp(m32, -1, 1));\n\n\t\t\tif (Math.abs(m32) < 0.99999) {\n\t\t\t\tthis._y = Math.atan2(-m31, m33);\n\t\t\t\tthis._z = Math.atan2(-m12, m22);\n\t\t\t} else {\n\t\t\t\tthis._y = 0;\n\t\t\t\tthis._z = Math.atan2(m21, m11);\n\t\t\t}\n\t\t} else if (order === 'ZYX') {\n\t\t\tthis._y = Math.asin(-MathUtils.clamp(m31, -1, 1));\n\n\t\t\tif (Math.abs(m31) < 0.99999) {\n\t\t\t\tthis._x = Math.atan2(m32, m33);\n\t\t\t\tthis._z = Math.atan2(m21, m11);\n\t\t\t} else {\n\t\t\t\tthis._x = 0;\n\t\t\t\tthis._z = Math.atan2(-m12, m22);\n\t\t\t}\n\t\t} else if (order === 'YZX') {\n\t\t\tthis._z = Math.asin(MathUtils.clamp(m21, -1, 1));\n\n\t\t\tif (Math.abs(m21) < 0.99999) {\n\t\t\t\tthis._x = Math.atan2(-m23, m22);\n\t\t\t\tthis._y = Math.atan2(-m31, m11);\n\t\t\t} else {\n\t\t\t\tthis._x = 0;\n\t\t\t\tthis._y = Math.atan2(m13, m33);\n\t\t\t}\n\t\t} else if (order === 'XZY') {\n\t\t\tthis._z = Math.asin(-MathUtils.clamp(m12, -1, 1));\n\n\t\t\tif (Math.abs(m12) < 0.99999) {\n\t\t\t\tthis._x = Math.atan2(m32, m22);\n\t\t\t\tthis._y = Math.atan2(m13, m11);\n\t\t\t} else {\n\t\t\t\tthis._x = Math.atan2(-m23, m33);\n\t\t\t\tthis._y = 0;\n\t\t\t}\n\t\t} else {\n\t\t\tconsole.warn('given unsupported order: ' + order);\n\t\t}\n\n\t\tthis._order = order;\n\n\t\tif (update === true) this.onChangeCallback();\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the angles of this euler transform from a normalized quaternion based on the orientation specified by order.\n\t * @param {Quaternion} q - a normalized quaternion.\n\t * @param {string} order - (optional) a string representing the order that the rotations are applied.\n\t * @param {boolean} [update=true] - Whether to notify Euler angle has changed\n\t * @returns {Euler}\n\t */\n\tsetFromQuaternion(q, order, update) {\n\t\tq.toMatrix4(_matrix);\n\t\treturn this.setFromRotationMatrix(_matrix, order, update);\n\t}\n\n\t/**\n\t * @param {Function} callback - When the Euler angle value changes, the callback method is triggered\n\t * @returns {Euler}\n\t */\n\tonChange(callback) {\n\t\tthis.onChangeCallback = callback;\n\t\treturn this;\n\t}\n\n\tonChangeCallback() {}\n\n\t* [Symbol.iterator]() {\n\t\tyield this._x;\n\t\tyield this._y;\n\t\tyield this._z;\n\t\tyield this._order;\n\t}\n\n}\n\n/**\n * This flag can be used for type testing.\n * @readonly\n * @type {boolean}\n * @default true\n */\nEuler.prototype.isEuler = true;\n\n/**\n * The order in which to apply rotations.\n * @readonly\n */\nEuler.RotationOrders = ['XYZ', 'YZX', 'ZXY', 'XZY', 'YXZ', 'ZYX'];\n\n/**\n * The default order in which to apply rotations.\n * @readonly\n */\nEuler.DefaultOrder = 'XYZ';\n\nexport { Euler };"
  },
  {
    "path": "src/math/Frustum.js",
    "content": "import { Matrix3 } from './Matrix3.js';\nimport { Plane } from './Plane.js';\nimport { Vector3 } from './Vector3.js';\n\nconst _vec3_1 = new Vector3();\nconst _mat3_1 = new Matrix3();\n\n/**\n * Frustums are used to determine what is inside the camera's field of view.\n * They help speed up the rendering process - objects which lie outside a camera's frustum can safely be excluded from rendering.\n */\nclass Frustum {\n\n\t/**\n\t * @param {Plane} p0 - (optional) defaults to a new Plane.\n\t * @param {Plane} p1 - (optional) defaults to a new Plane.\n\t * @param {Plane} p2 - (optional) defaults to a new Plane.\n\t * @param {Plane} p3 - (optional) defaults to a new Plane.\n\t * @param {Plane} p4 - (optional) defaults to a new Plane.\n\t * @param {Plane} p5 - (optional) defaults to a new Plane.\n\t */\n\tconstructor(p0 = new Plane(), p1 = new Plane(), p2 = new Plane(), p3 = new Plane(), p4 = new Plane(), p5 = new Plane()) {\n\t\tthis.planes = [p0, p1, p2, p3, p4, p5];\n\t}\n\n\t/**\n\t * Sets the frustum from the passed planes. No plane order is implied.\n\t * @param {Plane} p0 - (optional) defaults to a new Plane.\n\t * @param {Plane} p1 - (optional) defaults to a new Plane.\n\t * @param {Plane} p2 - (optional) defaults to a new Plane.\n\t * @param {Plane} p3 - (optional) defaults to a new Plane.\n\t * @param {Plane} p4 - (optional) defaults to a new Plane.\n\t * @param {Plane} p5 - (optional) defaults to a new Plane.\n\t * @returns {Frustum}\n\t */\n\tset(p0, p1, p2, p3, p4, p5) {\n\t\tconst planes = this.planes;\n\n\t\tplanes[0].copy(p0);\n\t\tplanes[1].copy(p1);\n\t\tplanes[2].copy(p2);\n\t\tplanes[3].copy(p3);\n\t\tplanes[4].copy(p4);\n\t\tplanes[5].copy(p5);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the frustum planes from the matrix.\n\t * @param {Matrix4} m - a Matrix4 used to set the planes\n\t * @returns {Frustum}\n\t */\n\tsetFromMatrix(m) {\n\t\tconst planes = this.planes;\n\t\tconst me = m.elements;\n\t\tconst me0 = me[0],\n\t\t\tme1 = me[1],\n\t\t\tme2 = me[2],\n\t\t\tme3 = me[3];\n\t\tconst me4 = me[4],\n\t\t\tme5 = me[5],\n\t\t\tme6 = me[6],\n\t\t\tme7 = me[7];\n\t\tconst me8 = me[8],\n\t\t\tme9 = me[9],\n\t\t\tme10 = me[10],\n\t\t\tme11 = me[11];\n\t\tconst me12 = me[12],\n\t\t\tme13 = me[13],\n\t\t\tme14 = me[14],\n\t\t\tme15 = me[15];\n\n\t\tplanes[0].setComponents(me3 - me0, me7 - me4, me11 - me8, me15 - me12).normalize();\n\t\tplanes[1].setComponents(me3 + me0, me7 + me4, me11 + me8, me15 + me12).normalize();\n\t\tplanes[2].setComponents(me3 + me1, me7 + me5, me11 + me9, me15 + me13).normalize();\n\t\tplanes[3].setComponents(me3 - me1, me7 - me5, me11 - me9, me15 - me13).normalize();\n\t\tplanes[4].setComponents(me3 - me2, me7 - me6, me11 - me10, me15 - me14).normalize();\n\t\tplanes[5].setComponents(me3 + me2, me7 + me6, me11 + me10, me15 + me14).normalize();\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Return true if sphere intersects with this frustum.\n\t * @param {Sphere} sphere - Sphere to check for intersection.\n\t * @returns {boolean}\n\t */\n\tintersectsSphere(sphere) {\n\t\tconst planes = this.planes;\n\t\tconst center = sphere.center;\n\t\tconst negRadius = -sphere.radius;\n\n\t\tfor (let i = 0; i < 6; i++) {\n\t\t\tconst distance = planes[i].distanceToPoint(center);\n\n\t\t\tif (distance < negRadius) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\treturn true;\n\t}\n\n\t/**\n\t * Return true if box intersects with this frustum.\n\t * @param {Box3} box - Box3 to check for intersection.\n\t * @returns {boolean}\n\t */\n\tintersectsBox(box) {\n\t\tconst planes = this.planes;\n\n\t\tfor (let i = 0; i < 6; i++) {\n\t\t\tconst plane = planes[i];\n\n\t\t\t// corner at max distance\n\n\t\t\t_vec3_1.x = plane.normal.x > 0 ? box.max.x : box.min.x;\n\t\t\t_vec3_1.y = plane.normal.y > 0 ? box.max.y : box.min.y;\n\t\t\t_vec3_1.z = plane.normal.z > 0 ? box.max.z : box.min.z;\n\n\t\t\t// if both outside plane, no intersection\n\n\t\t\tif (plane.distanceToPoint(_vec3_1) < 0) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\treturn true;\n\t}\n\n\t/**\n\t * Apply a matrix4x4 to the frustum.\n\t * @param {Matrix4} matrix - Matrix4 to apply to the frustum.\n\t * @returns {Frustum}\n\t */\n\tapplyMatrix4(matrix) {\n\t\tconst planes = this.planes;\n\n\t\tconst normalMatrix = _mat3_1.setFromMatrix4(matrix).invert().transpose();\n\n\t\tfor (let i = 0; i < 6; i++) {\n\t\t\tplanes[i].applyMatrix4(matrix, normalMatrix);\n\t\t}\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Return a new Frustum with the same parameters as this one.\n\t * @returns {Frustum}\n\t */\n\tclone() {\n\t\treturn new this.constructor().copy(this);\n\t}\n\n\t/**\n\t * Copies the properties of the passed frustum into this one.\n\t * @param {Frustum} frustum - The frustum to copy\n\t * @returns {Frustum}\n\t */\n\tcopy(frustum) {\n\t\tconst planes = this.planes;\n\n\t\tfor (let i = 0; i < 6; i++) {\n\t\t\tplanes[i].copy(frustum.planes[i]);\n\t\t}\n\n\t\treturn this;\n\t}\n\n}\n\n/**\n * This flag can be used for type testing.\n * @readonly\n * @type {boolean}\n * @default true\n */\nFrustum.prototype.isFrustum = true;\n\nexport { Frustum };"
  },
  {
    "path": "src/math/MathUtils.js",
    "content": "/**\n * An utility class for mathematical operations.\n */\nclass MathUtils {\n\n\t/**\n\t * Method for generate uuid.\n\t * http://stackoverflow.com/questions/105034/how-to-create-a-guid-uuid-in-javascript/21963136#21963136\n\t * @returns {string} - The uuid.\n\t */\n\tstatic generateUUID() {\n\t\tconst d0 = Math.random() * 0xffffffff | 0;\n\t\tconst d1 = Math.random() * 0xffffffff | 0;\n\t\tconst d2 = Math.random() * 0xffffffff | 0;\n\t\tconst d3 = Math.random() * 0xffffffff | 0;\n\t\tconst uuid = _lut[d0 & 0xff] + _lut[d0 >> 8 & 0xff] + _lut[d0 >> 16 & 0xff] + _lut[d0 >> 24 & 0xff] + '-' +\n\t\t\t_lut[d1 & 0xff] + _lut[d1 >> 8 & 0xff] + '-' + _lut[d1 >> 16 & 0x0f | 0x40] + _lut[d1 >> 24 & 0xff] + '-' +\n\t\t\t_lut[d2 & 0x3f | 0x80] + _lut[d2 >> 8 & 0xff] + '-' + _lut[d2 >> 16 & 0xff] + _lut[d2 >> 24 & 0xff] +\n\t\t\t_lut[d3 & 0xff] + _lut[d3 >> 8 & 0xff] + _lut[d3 >> 16 & 0xff] + _lut[d3 >> 24 & 0xff];\n\n\t\t// .toUpperCase() here flattens concatenated strings to save heap memory space.\n\t\treturn uuid.toUpperCase();\n\t}\n\n\t/**\n\t * Returns a value linearly interpolated from two known points based on the given interval - t = 0 will return x and t = 1 will return y.\n\t * @param {number} x - The first value.\n\t * @param {number} y - The second value.\n\t * @param {number} t - The interpolation factor.\n\t * @returns {number} - The interpolated value.\n\t */\n\tstatic lerp(x, y, t) {\n\t\treturn x + (y - x) * t;\n\t}\n\n\t/**\n\t * Clamps the value to be between min and max.\n\t * @param {number} value - Value to be clamped.\n\t * @param {number} min - The minimum value.\n\t * @param {number} max - The maximum value.\n\t * @returns {number} - The clamped value.\n\t */\n\tstatic clamp(value, min, max) {\n\t\treturn Math.max(min, Math.min(max, value));\n\t}\n\n\t/**\n\t * Compute euclidean modulo of m % n.\n\t * Refer to: https://en.wikipedia.org/wiki/Modulo_operation\n\t * @param {number} n - The dividend.\n\t * @param {number} m - The divisor.\n\t * @returns {number} - The result of the modulo operation.\n\t */\n\tstatic euclideanModulo(n, m) {\n\t\treturn ((n % m) + m) % m;\n\t}\n\n\t/**\n\t * Performs a linear mapping from range `<a1, a2>` to range `<b1, b2>`\n\t * for the given value.\n\t * @param {number} x - The value to be mapped.\n\t * @param {number} a1 - Minimum value for range A.\n\t * @param {number} a2 - Maximum value for range A.\n\t * @param {number} b1 - Minimum value for range B.\n\t * @param {number} b2 - Maximum value for range B.\n\t * @returns {number} The mapped value.\n\t */\n\tstatic mapLinear(x, a1, a2, b1, b2) {\n\t\treturn b1 + (x - a1) * (b2 - b1) / (a2 - a1);\n\t}\n\n\t/**\n\t * Is this number a power of two.\n\t * @param {number} value - The input number.\n\t * @returns {boolean} - Is this number a power of two.\n\t */\n\tstatic isPowerOfTwo(value) {\n\t\treturn (value & (value - 1)) === 0 && value !== 0;\n\t}\n\n\t/**\n\t * Return the nearest power of two number of this number.\n\t * @param {number} value - The input number.\n\t * @returns {number} - The result number.\n\t */\n\tstatic nearestPowerOfTwo(value) {\n\t\treturn Math.pow(2, Math.round(Math.log(value) / Math.LN2));\n\t}\n\n\t/**\n\t * Return the next power of two number of this number.\n\t * @param {number} value - The input number.\n\t * @returns {number} - The result number.\n\t */\n\tstatic nextPowerOfTwo(value) {\n\t\tvalue--;\n\t\tvalue |= value >> 1;\n\t\tvalue |= value >> 2;\n\t\tvalue |= value >> 4;\n\t\tvalue |= value >> 8;\n\t\tvalue |= value >> 16;\n\t\tvalue++;\n\n\t\treturn value;\n\t}\n\n\t/**\n\t * Return the next power of two square size of this number.\n\t * This method is usually used to calculate the minimum 2d texture size based on the pixel length.\n\t * @param {number} value - The input number.\n\t * @returns {number} - The result size.\n\t */\n\tstatic nextPowerOfTwoSquareSize(value) {\n\t\treturn this.nextPowerOfTwo(Math.ceil(Math.sqrt(value)));\n\t}\n\n\t/**\n\t * Denormalizes a value based on the type of the provided array.\n\t * @param {number} value - The value to be denormalized.\n\t * @param {TypedArray} array - The typed array to determine the normalization factor.\n\t * @returns {number} - The denormalized value.\n\t * @throws {Error} - Throws an error if the array type is invalid.\n\t */\n\tstatic denormalize(value, array) {\n\t\tswitch (array.constructor) {\n\t\t\tcase Float32Array:\n\t\t\t\treturn value;\n\t\t\tcase Uint32Array:\n\t\t\t\treturn value / 4294967295.0;\n\t\t\tcase Uint16Array:\n\t\t\t\treturn value / 65535.0;\n\t\t\tcase Uint8Array:\n\t\t\t\treturn value / 255.0;\n\t\t\tcase Int32Array:\n\t\t\t\treturn Math.max(value / 2147483647.0, -1.0);\n\t\t\tcase Int16Array:\n\t\t\t\treturn Math.max(value / 32767.0, -1.0);\n\t\t\tcase Int8Array:\n\t\t\t\treturn Math.max(value / 127.0, -1.0);\n\t\t\tdefault:\n\t\t\t\tthrow new Error('Invalid component type.');\n\t\t}\n\t}\n\n\t/**\n\t * Normalizes a value based on the type of the provided array.\n\t * @param {number} value - The value to be normalized.\n\t * @param {TypedArray} array - The typed array to determine the normalization factor.\n\t * @returns {number} - The normalized value.\n\t * @throws {Error} - Throws an error if the array type is invalid.\n\t */\n\tstatic normalize(value, array) {\n\t\tswitch (array.constructor) {\n\t\t\tcase Float32Array:\n\t\t\t\treturn value;\n\t\t\tcase Uint32Array:\n\t\t\t\treturn Math.round(value * 4294967295.0);\n\t\t\tcase Uint16Array:\n\t\t\t\treturn Math.round(value * 65535.0);\n\t\t\tcase Uint8Array:\n\t\t\t\treturn Math.round(value * 255.0);\n\t\t\tcase Int32Array:\n\t\t\t\treturn Math.round(value * 2147483647.0);\n\t\t\tcase Int16Array:\n\t\t\t\treturn Math.round(value * 32767.0);\n\t\t\tcase Int8Array:\n\t\t\t\treturn Math.round(value * 127.0);\n\t\t\tdefault:\n\t\t\t\tthrow new Error('Invalid component type.');\n\t\t}\n\t}\n\n\t/**\n\t * Converts float to half float.\n\t * @param {number} val - The float value.\n\t * @returns {number} - The half float value.\n\t */\n\tstatic toHalfFloat(val) {\n\t\tif (Math.abs(val) > 65504) {\n\t\t\tconsole.warn('MathUtils.toHalfFloat(): Value out of range.');\n\t\t\tval = this.clamp(val, -65504, 65504);\n\t\t}\n\n\t\t_tables.floatView[0] = val;\n\t\tconst f = _tables.uint32View[0];\n\t\tconst e = (f >> 23) & 0x1ff;\n\t\treturn _tables.baseTable[e] + ((f & 0x007fffff) >> _tables.shiftTable[e]);\n\t}\n\n\t/**\n\t * Converts half float to float.\n\t * @param {number} val - The half float value.\n\t * @returns {number} - The float value.\n\t */\n\tstatic fromHalfFloat(val) {\n\t\tconst m = val >> 10;\n\t\t_tables.uint32View[0] = _tables.mantissaTable[_tables.offsetTable[m] + (val & 0x3ff)] + _tables.exponentTable[m];\n\t\treturn _tables.floatView[0];\n\t}\n\n}\n\nconst _lut = [];\nfor (let i = 0; i < 256; i++) {\n\t_lut[i] = (i < 16 ? '0' : '') + (i).toString(16);\n}\n\n// Fast Half Float Conversions, http://www.fox-toolkit.org/ftp/fasthalffloatconversion.pdf\n\nconst _tables = _generateTables();\n\nfunction _generateTables() {\n\t// float32 to float16 helpers\n\n\tconst buffer = new ArrayBuffer(4);\n\tconst floatView = new Float32Array(buffer);\n\tconst uint32View = new Uint32Array(buffer);\n\n\tconst baseTable = new Uint32Array(512);\n\tconst shiftTable = new Uint32Array(512);\n\n\tfor (let i = 0; i < 256; ++i) {\n\t\tconst e = i - 127;\n\n\t\tif (e < -27) { // very small number (0, -0)\n\t\t\tbaseTable[i] = 0x0000;\n\t\t\tbaseTable[i | 0x100] = 0x8000;\n\t\t\tshiftTable[i] = 24;\n\t\t\tshiftTable[i | 0x100] = 24;\n\t\t} else if (e < -14) { // small number (denorm)\n\t\t\tbaseTable[i] = 0x0400 >> (-e - 14);\n\t\t\tbaseTable[i | 0x100] = (0x0400 >> (-e - 14)) | 0x8000;\n\t\t\tshiftTable[i] = -e - 1;\n\t\t\tshiftTable[i | 0x100] = -e - 1;\n\t\t} else if (e <= 15) { // normal number\n\t\t\tbaseTable[i] = (e + 15) << 10;\n\t\t\tbaseTable[i | 0x100] = ((e + 15) << 10) | 0x8000;\n\t\t\tshiftTable[i] = 13;\n\t\t\tshiftTable[i | 0x100] = 13;\n\t\t} else if (e < 128) { // large number (Infinity, -Infinity)\n\t\t\tbaseTable[i] = 0x7c00;\n\t\t\tbaseTable[i | 0x100] = 0xfc00;\n\t\t\tshiftTable[i] = 24;\n\t\t\tshiftTable[i | 0x100] = 24;\n\t\t} else { // stay (NaN, Infinity, -Infinity)\n\t\t\tbaseTable[i] = 0x7c00;\n\t\t\tbaseTable[i | 0x100] = 0xfc00;\n\t\t\tshiftTable[i] = 13;\n\t\t\tshiftTable[i | 0x100] = 13;\n\t\t}\n\t}\n\n\t// float16 to float32 helpers\n\n\tconst mantissaTable = new Uint32Array(2048);\n\tconst exponentTable = new Uint32Array(64);\n\tconst offsetTable = new Uint32Array(64);\n\n\tfor (let i = 1; i < 1024; ++i) {\n\t\tlet m = i << 13; // zero pad mantissa bits\n\t\tlet e = 0; // zero exponent\n\n\t\t// normalized\n\t\twhile ((m & 0x00800000) === 0) {\n\t\t\tm <<= 1;\n\t\t\te -= 0x00800000; // decrement exponent\n\t\t}\n\n\t\tm &= ~0x00800000; // clear leading 1 bit\n\t\te += 0x38800000; // adjust bias\n\n\t\tmantissaTable[i] = m | e;\n\t}\n\n\tfor (let i = 1024; i < 2048; ++i) {\n\t\tmantissaTable[i] = 0x38000000 + ((i - 1024) << 13);\n\t}\n\n\tfor (let i = 1; i < 31; ++i) {\n\t\texponentTable[i] = i << 23;\n\t}\n\n\texponentTable[31] = 0x47800000;\n\texponentTable[32] = 0x80000000;\n\n\tfor (let i = 33; i < 63; ++i) {\n\t\texponentTable[i] = 0x80000000 + ((i - 32) << 23);\n\t}\n\n\texponentTable[63] = 0xc7800000;\n\n\tfor (let i = 1; i < 64; ++i) {\n\t\tif (i !== 32) {\n\t\t\toffsetTable[i] = 1024;\n\t\t}\n\t}\n\n\treturn {\n\t\tfloatView: floatView,\n\t\tuint32View: uint32View,\n\t\tbaseTable: baseTable,\n\t\tshiftTable: shiftTable,\n\t\tmantissaTable: mantissaTable,\n\t\texponentTable: exponentTable,\n\t\toffsetTable: offsetTable\n\t};\n}\n\nexport { MathUtils };"
  },
  {
    "path": "src/math/Matrix3.js",
    "content": "/**\n * The 3x3 matrix class.\n */\nclass Matrix3 {\n\n\t/**\n\t * Create a 3x3 matrix.\n\t */\n\tconstructor() {\n\t\tthis.elements = [\n\t\t\t1, 0, 0,\n\t\t\t0, 1, 0,\n\t\t\t0, 0, 1\n\t\t];\n\t}\n\n\t/**\n\t * Sets the 3x3 matrix values to the given row-major sequence of values.\n\t * @param {number} n11 - value to put in row 1, col 1.\n\t * @param {number} n12 - value to put in row 1, col 2.\n\t * @param {number} n13 - value to put in row 1, col 3.\n\t * @param {number} n21 - value to put in row 2, col 1.\n\t * @param {number} n22 - value to put in row 2, col 2.\n\t * @param {number} n23 - value to put in row 2, col 3.\n\t * @param {number} n31 - value to put in row 3, col 1.\n\t * @param {number} n32 - value to put in row 3, col 2.\n\t * @param {number} n33 - value to put in row 3, col 3.\n\t * @returns {Matrix3}\n\t */\n\tset(n11, n12, n13,\n\t\tn21, n22, n23,\n\t\tn31, n32, n33) {\n\t\tconst ele = this.elements;\n\n\t\tele[0] = n11;\n\t\tele[3] = n12;\n\t\tele[6] = n13;\n\n\t\tele[1] = n21;\n\t\tele[4] = n22;\n\t\tele[7] = n23;\n\n\t\tele[2] = n31;\n\t\tele[5] = n32;\n\t\tele[8] = n33;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Resets this matrix to the 3x3 identity matrix\n\t * @returns {Matrix3}\n\t */\n\tidentity() {\n\t\treturn this.set(\n\t\t\t1, 0, 0,\n\t\t\t0, 1, 0,\n\t\t\t0, 0, 1\n\t\t);\n\t}\n\n\t/**\n\t * Checks if the matrix is an identity matrix.\n\t * @returns {boolean} - True if the matrix is an identity matrix, false otherwise.\n\t */\n\tisIdentity() {\n\t\tconst te = this.elements;\n\t\treturn te[0] === 1 && te[3] === 0 && te[6] === 0\n\t\t\t&& te[1] === 0 && te[4] === 1 && te[7] === 0\n\t\t\t&& te[2] === 0 && te[5] === 0 && te[8] === 1;\n\t}\n\n\t/**\n\t * Computes and returns the determinant of this matrix.\n\t * @returns {number} The determinant.\n\t */\n\tdeterminant() {\n\t\tconst te = this.elements;\n\n\t\tconst a = te[0], b = te[1], c = te[2],\n\t\t\td = te[3], e = te[4], f = te[5],\n\t\t\tg = te[6], h = te[7], i = te[8];\n\n\t\treturn a * e * i - a * f * h - b * d * i + b * f * g + c * d * h - c * e * g;\n\t}\n\n\t/**\n\t * Inverts this matrix, using the [analytic method]{@link https://en.wikipedia.org/wiki/Invertible_matrix#Analytic_solution}.\n\t * You can not invert with a determinant of zero. If you attempt this, the method produces\n\t * a zero matrix instead.\n\t * @returns {Matrix3} A reference to this matrix.\n\t */\n\tinvert() {\n\t\tconst te = this.elements,\n\n\t\t\tn11 = te[0], n21 = te[1], n31 = te[2],\n\t\t\tn12 = te[3], n22 = te[4], n32 = te[5],\n\t\t\tn13 = te[6], n23 = te[7], n33 = te[8],\n\n\t\t\tt11 = n33 * n22 - n32 * n23,\n\t\t\tt12 = n32 * n13 - n33 * n12,\n\t\t\tt13 = n23 * n12 - n22 * n13,\n\n\t\t\tdet = n11 * t11 + n21 * t12 + n31 * t13;\n\n\t\tif (det === 0) return this.set(0, 0, 0, 0, 0, 0, 0, 0, 0);\n\n\t\tconst detInv = 1 / det;\n\n\t\tte[0] = t11 * detInv;\n\t\tte[1] = (n31 * n23 - n33 * n21) * detInv;\n\t\tte[2] = (n32 * n21 - n31 * n22) * detInv;\n\n\t\tte[3] = t12 * detInv;\n\t\tte[4] = (n33 * n11 - n31 * n13) * detInv;\n\t\tte[5] = (n31 * n12 - n32 * n11) * detInv;\n\n\t\tte[6] = t13 * detInv;\n\t\tte[7] = (n21 * n13 - n23 * n11) * detInv;\n\t\tte[8] = (n22 * n11 - n21 * n12) * detInv;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Transposes this matrix in place.\n\t * @returns {Matrix3}\n\t */\n\ttranspose() {\n\t\tlet tmp;\n\t\tconst m = this.elements;\n\n\t\ttmp = m[1]; m[1] = m[3]; m[3] = tmp;\n\t\ttmp = m[2]; m[2] = m[6]; m[6] = tmp;\n\t\ttmp = m[5]; m[5] = m[7]; m[7] = tmp;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Return true if this matrix and m are equal.\n\t * @param {Matrix3} matrix\n\t * @returns {boolean}\n\t */\n\tequals(matrix) {\n\t\tconst te = this.elements;\n\t\tconst me = matrix.elements;\n\n\t\tfor (let i = 0; i < 9; i++) {\n\t\t\tif (te[i] !== me[i]) return false;\n\t\t}\n\n\t\treturn true;\n\t}\n\n\t/**\n\t * Sets the elements of this matrix based on an array in column-major format.\n\t * @param {number[]} array\n\t * @param {number} [offset=0]\n\t * @returns {Matrix3}\n\t */\n\tfromArray(array, offset = 0) {\n\t\tfor (let i = 0; i < 9; i++) {\n\t\t\tthis.elements[i] = array[i + offset];\n\t\t}\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Writes the elements of this matrix to an array in column-major format.\n\t * @param {number[]} [array]\n\t * @param {number} [offset=0]\n\t * @returns {number[]}\n\t */\n\ttoArray(array = [], offset = 0) {\n\t\tconst te = this.elements;\n\n\t\tarray[offset] = te[0];\n\t\tarray[offset + 1] = te[1];\n\t\tarray[offset + 2] = te[2];\n\n\t\tarray[offset + 3] = te[3];\n\t\tarray[offset + 4] = te[4];\n\t\tarray[offset + 5] = te[5];\n\n\t\tarray[offset + 6] = te[6];\n\t\tarray[offset + 7] = te[7];\n\t\tarray[offset + 8] = te[8];\n\n\t\treturn array;\n\t}\n\n\t/**\n\t * Creates a new Matrix3 and with identical elements to this one.\n\t * @returns {Matrix3}\n\t */\n\tclone() {\n\t\treturn new Matrix3().fromArray(this.elements);\n\t}\n\n\t/**\n\t * Copies the elements of matrix m into this matrix.\n\t * @param {Matrix3} m\n\t * @returns {Matrix3}\n\t */\n\tcopy(m) {\n\t\tconst te = this.elements;\n\t\tconst me = m.elements;\n\n\t\tte[0] = me[0]; te[1] = me[1]; te[2] = me[2];\n\t\tte[3] = me[3]; te[4] = me[4]; te[5] = me[5];\n\t\tte[6] = me[6]; te[7] = me[7]; te[8] = me[8];\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Post-multiplies this matrix by m.\n\t * @param {Matrix3} m\n\t * @returns {Matrix3}\n\t */\n\tmultiply(m) {\n\t\treturn this.multiplyMatrices(this, m);\n\t}\n\n\t/**\n\t * Pre-multiplies this matrix by m.\n\t * @param {Matrix3} m\n\t * @returns {Matrix3}\n\t */\n\tpremultiply(m) {\n\t\treturn this.multiplyMatrices(m, this);\n\t}\n\n\t/**\n\t * Sets this matrix to a x b.\n\t * @param {Matrix3} a\n\t * @param {Matrix3} b\n\t * @returns {Matrix3}\n\t */\n\tmultiplyMatrices(a, b) {\n\t\tconst ae = a.elements;\n\t\tconst be = b.elements;\n\t\tconst te = this.elements;\n\n\t\tconst a11 = ae[0], a12 = ae[3], a13 = ae[6];\n\t\tconst a21 = ae[1], a22 = ae[4], a23 = ae[7];\n\t\tconst a31 = ae[2], a32 = ae[5], a33 = ae[8];\n\n\t\tconst b11 = be[0], b12 = be[3], b13 = be[6];\n\t\tconst b21 = be[1], b22 = be[4], b23 = be[7];\n\t\tconst b31 = be[2], b32 = be[5], b33 = be[8];\n\n\t\tte[0] = a11 * b11 + a12 * b21 + a13 * b31;\n\t\tte[3] = a11 * b12 + a12 * b22 + a13 * b32;\n\t\tte[6] = a11 * b13 + a12 * b23 + a13 * b33;\n\n\t\tte[1] = a21 * b11 + a22 * b21 + a23 * b31;\n\t\tte[4] = a21 * b12 + a22 * b22 + a23 * b32;\n\t\tte[7] = a21 * b13 + a22 * b23 + a23 * b33;\n\n\t\tte[2] = a31 * b11 + a32 * b21 + a33 * b31;\n\t\tte[5] = a31 * b12 + a32 * b22 + a33 * b32;\n\t\tte[8] = a31 * b13 + a32 * b23 + a33 * b33;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Transform 2D\n\t * @param {number} x - position.x\n\t * @param {number} y - position.y\n\t * @param {number} scaleX - scale.x\n\t * @param {number} scaleY - scale.y\n\t * @param {number} rotation - rotation\n\t * @param {number} anchorX - anchor.x\n\t * @param {number} anchorY - anchor.y\n\t * @returns {Matrix3}\n\t */\n\ttransform(x, y, scaleX, scaleY, rotation, anchorX, anchorY) {\n\t\tconst te = this.elements;\n\n\t\tconst cr = Math.cos(rotation);\n\t\tconst sr = Math.sin(rotation);\n\n\t\tte[0] = cr * scaleX;\n\t\tte[3] = -sr * scaleY;\n\t\tte[6] = x;\n\n\t\tte[1] = sr * scaleX;\n\t\tte[4] = cr * scaleY;\n\t\tte[7] = y;\n\n\t\tte[2] = 0;\n\t\tte[5] = 0;\n\t\tte[8] = 1;\n\n\t\tif (anchorX || anchorY) {\n\t\t\t// prepend the anchor offset:\n\t\t\tte[6] -= anchorX * te[0] + anchorY * te[3];\n\t\t\tte[7] -= anchorX * te[1] + anchorY * te[4];\n\t\t}\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Set the transformation matrix of uv coordinates\n\t * @param {number} tx\n\t * @param {number} ty\n\t * @param {number} sx\n\t * @param {number} sy\n\t * @param {number} rotation\n\t * @param {number} cx\n\t * @param {number} cy\n\t * @returns {Matrix3}\n\t */\n\tsetUvTransform(tx, ty, sx, sy, rotation, cx, cy) {\n\t\tconst c = Math.cos(rotation);\n\t\tconst s = Math.sin(rotation);\n\n\t\treturn this.set(\n\t\t\tsx * c, sx * s, -sx * (c * cx + s * cy) + cx + tx,\n\t\t\t-sy * s, sy * c, -sy * (-s * cx + c * cy) + cy + ty,\n\t\t\t0, 0, 1\n\t\t);\n\t}\n\n\t/**\n\t * Sets the matri3 planes from the matrix4.\n\t * @param {Matrix4} m\n\t * @returns {Matrix3}\n\t */\n\tsetFromMatrix4(m) {\n\t\tconst me = m.elements;\n\n\t\treturn this.set(\n\t\t\tme[0], me[4], me[8],\n\t\t\tme[1], me[5], me[9],\n\t\t\tme[2], me[6], me[10]\n\t\t);\n\t}\n\n\t/**\n\t * Extracts the basis vectors from the matrix.\n\t * @param {Vector3} xAxis\n\t * @param {Vector3} yAxis\n\t * @param {Vector3} zAxis\n\t * @returns {Matrix3}\n\t */\n\textractBasis(xAxis, yAxis, zAxis) {\n\t\tconst te = this.elements;\n\n\t\txAxis.fromArray(te);\n\t\tyAxis.fromArray(te, 3);\n\t\tzAxis.fromArray(te, 6);\n\n\t\treturn this;\n\t}\n\n}\n\n/**\n * This flag can be used for type testing.\n * @readonly\n * @type {boolean}\n * @default true\n */\nMatrix3.prototype.isMatrix3 = true;\n\nexport { Matrix3 };"
  },
  {
    "path": "src/math/Matrix4.js",
    "content": "import { Vector3 } from './Vector3.js';\n\n/**\n * Represents a 4x4 matrix.\n */\nclass Matrix4 {\n\n\t/**\n\t * Constructs a new 4x4 matrix.\n\t */\n\tconstructor() {\n\t\t/**\n\t\t * A column-major list of matrix values.\n\t\t * @type {Array<number>}\n\t\t */\n\t\tthis.elements = [\n\t\t\t1, 0, 0, 0,\n\t\t\t0, 1, 0, 0,\n\t\t\t0, 0, 1, 0,\n\t\t\t0, 0, 0, 1\n\t\t];\n\t}\n\n\t/**\n\t * Sets the elements of the matrix.The arguments are supposed to be\n\t * in row-major order.\n\t * @param {number} [n11] - 1-1 matrix element.\n\t * @param {number} [n12] - 1-2 matrix element.\n\t * @param {number} [n13] - 1-3 matrix element.\n\t * @param {number} [n14] - 1-4 matrix element.\n\t * @param {number} [n21] - 2-1 matrix element.\n\t * @param {number} [n22] - 2-2 matrix element.\n\t * @param {number} [n23] - 2-3 matrix element.\n\t * @param {number} [n24] - 2-4 matrix element.\n\t * @param {number} [n31] - 3-1 matrix element.\n\t * @param {number} [n32] - 3-2 matrix element.\n\t * @param {number} [n33] - 3-3 matrix element.\n\t * @param {number} [n34] - 3-4 matrix element.\n\t * @param {number} [n41] - 4-1 matrix element.\n\t * @param {number} [n42] - 4-2 matrix element.\n\t * @param {number} [n43] - 4-3 matrix element.\n\t * @param {number} [n44] - 4-4 matrix element.\n\t * @returns {Matrix4} A reference to this matrix.\n\t */\n\tset(n11, n12, n13, n14, n21, n22, n23, n24, n31, n32, n33, n34, n41, n42, n43, n44) {\n\t\tconst ele = this.elements;\n\n\t\tele[0] = n11; ele[4] = n12; ele[8] = n13; ele[12] = n14;\n\t\tele[1] = n21; ele[5] = n22; ele[9] = n23; ele[13] = n24;\n\t\tele[2] = n31; ele[6] = n32; ele[10] = n33; ele[14] = n34;\n\t\tele[3] = n41; ele[7] = n42; ele[11] = n43; ele[15] = n44;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets this matrix to the 4x4 identity matrix.\n\t * @returns {Matrix4} A reference to this matrix.\n\t */\n\tidentity() {\n\t\treturn this.set(\n\t\t\t1, 0, 0, 0,\n\t\t\t0, 1, 0, 0,\n\t\t\t0, 0, 1, 0,\n\t\t\t0, 0, 0, 1\n\t\t);\n\t}\n\n\t/**\n\t * Checks if the matrix is an identity matrix.\n\t * @returns {boolean} - True if the matrix is an identity matrix, false otherwise.\n\t */\n\tisIdentity() {\n\t\tconst te = this.elements;\n\t\treturn te[0] === 1 && te[4] === 0 && te[8] === 0 && te[12] === 0\n\t\t\t&& te[1] === 0 && te[5] === 1 && te[9] === 0 && te[13] === 0\n\t\t\t&& te[2] === 0 && te[6] === 0 && te[10] === 1 && te[14] === 0\n\t\t\t&& te[3] === 0 && te[7] === 0 && te[11] === 0 && te[15] === 1;\n\t}\n\n\t/**\n\t * Returns a matrix with copied values from this instance.\n\t * @returns {Matrix4} A clone of this instance.\n\t */\n\tclone() {\n\t\treturn new Matrix4().fromArray(this.elements);\n\t}\n\n\t/**\n\t * Copies the values of the given matrix to this instance.\n\t * @param {Matrix4} m - The matrix to copy.\n\t * @returns {Matrix4} A reference to this matrix.\n\t */\n\tcopy(m) {\n\t\tconst te = this.elements;\n\t\tconst me = m.elements;\n\n\t\tte[0] = me[0]; te[1] = me[1]; te[2] = me[2]; te[3] = me[3];\n\t\tte[4] = me[4]; te[5] = me[5]; te[6] = me[6]; te[7] = me[7];\n\t\tte[8] = me[8]; te[9] = me[9]; te[10] = me[10]; te[11] = me[11];\n\t\tte[12] = me[12]; te[13] = me[13]; te[14] = me[14]; te[15] = me[15];\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Set the upper 3x3 elements of this matrix to the values of given 3x3 matrix.\n\t * @param {Matrix3} m - The 3x3 matrix.\n\t * @returns {Matrix4} A reference to this matrix.\n\t */\n\tsetFromMatrix3(m) {\n\t\tconst me = m.elements;\n\n\t\treturn this.set(\n\t\t\tme[0], me[3], me[6], 0,\n\t\t\tme[1], me[4], me[7], 0,\n\t\t\tme[2], me[5], me[8], 0,\n\t\t\t0, 0, 0, 1\n\t\t);\n\t}\n\n\t/**\n\t * Extracts the basis of this matrix into the three axis vectors provided.\n\t * @param {Vector3} xAxis - The basis's x axis.\n\t * @param {Vector3} yAxis - The basis's y axis.\n\t * @param {Vector3} zAxis - The basis's z axis.\n\t * @returns {Matrix4} A reference to this matrix.\n\t */\n\textractBasis(xAxis, yAxis, zAxis) {\n\t\txAxis.setFromMatrixColumn(this, 0);\n\t\tyAxis.setFromMatrixColumn(this, 1);\n\t\tzAxis.setFromMatrixColumn(this, 2);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the given basis vectors to this matrix.\n\t * @param {Vector3} xAxis - The basis's x axis.\n\t * @param {Vector3} yAxis - The basis's y axis.\n\t * @param {Vector3} zAxis - The basis's z axis.\n\t * @returns {Matrix4} A reference to this matrix.\n\t */\n\tmakeBasis(xAxis, yAxis, zAxis) {\n\t\tthis.set(\n\t\t\txAxis.x, yAxis.x, zAxis.x, 0,\n\t\t\txAxis.y, yAxis.y, zAxis.y, 0,\n\t\t\txAxis.z, yAxis.z, zAxis.z, 0,\n\t\t\t0, 0, 0, 1\n\t\t);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Extracts the rotation component of the given matrix\n\t * into this matrix's rotation component.\n\t *\n\t * Note: This method does not support reflection matrices.\n\t * @param {Matrix4} m - The matrix.\n\t * @returns {Matrix4} A reference to this matrix.\n\t */\n\textractRotation(m) {\n\t\tconst te = this.elements;\n\t\tconst me = m.elements;\n\n\t\tconst scaleX = 1 / _vec3_1.setFromMatrixColumn(m, 0).getLength();\n\t\tconst scaleY = 1 / _vec3_1.setFromMatrixColumn(m, 1).getLength();\n\t\tconst scaleZ = 1 / _vec3_1.setFromMatrixColumn(m, 2).getLength();\n\n\t\tte[0] = me[0] * scaleX;\n\t\tte[1] = me[1] * scaleX;\n\t\tte[2] = me[2] * scaleX;\n\t\tte[3] = 0;\n\n\t\tte[4] = me[4] * scaleY;\n\t\tte[5] = me[5] * scaleY;\n\t\tte[6] = me[6] * scaleY;\n\t\tte[7] = 0;\n\n\t\tte[8] = me[8] * scaleZ;\n\t\tte[9] = me[9] * scaleZ;\n\t\tte[10] = me[10] * scaleZ;\n\t\tte[11] = 0;\n\n\t\tte[12] = 0;\n\t\tte[13] = 0;\n\t\tte[14] = 0;\n\t\tte[15] = 1;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the rotation component (the upper left 3x3 matrix) of this matrix to\n\t * the rotation specified by the given Euler angles. The rest of\n\t * the matrix is set to the identity. Depending on the {@link Euler#order},\n\t * there are six possible outcomes. See [this page]{@link https://en.wikipedia.org/wiki/Euler_angles#Rotation_matrix}\n\t * for a complete list.\n\t * @param {Euler} euler - The Euler angles.\n\t * @returns {Matrix4} A reference to this matrix.\n\t */\n\tmakeRotationFromEuler(euler) {\n\t\tconst te = this.elements;\n\n\t\tconst x = euler.x, y = euler.y, z = euler.z;\n\t\tconst a = Math.cos(x), b = Math.sin(x);\n\t\tconst c = Math.cos(y), d = Math.sin(y);\n\t\tconst e = Math.cos(z), f = Math.sin(z);\n\n\t\tif (euler.order === 'XYZ') {\n\t\t\tconst ae = a * e, af = a * f, be = b * e, bf = b * f;\n\n\t\t\tte[0] = c * e;\n\t\t\tte[4] = -c * f;\n\t\t\tte[8] = d;\n\n\t\t\tte[1] = af + be * d;\n\t\t\tte[5] = ae - bf * d;\n\t\t\tte[9] = -b * c;\n\n\t\t\tte[2] = bf - ae * d;\n\t\t\tte[6] = be + af * d;\n\t\t\tte[10] = a * c;\n\t\t} else if (euler.order === 'YXZ') {\n\t\t\tconst ce = c * e, cf = c * f, de = d * e, df = d * f;\n\n\t\t\tte[0] = ce + df * b;\n\t\t\tte[4] = de * b - cf;\n\t\t\tte[8] = a * d;\n\n\t\t\tte[1] = a * f;\n\t\t\tte[5] = a * e;\n\t\t\tte[9] = -b;\n\n\t\t\tte[2] = cf * b - de;\n\t\t\tte[6] = df + ce * b;\n\t\t\tte[10] = a * c;\n\t\t} else if (euler.order === 'ZXY') {\n\t\t\tconst ce = c * e, cf = c * f, de = d * e, df = d * f;\n\n\t\t\tte[0] = ce - df * b;\n\t\t\tte[4] = -a * f;\n\t\t\tte[8] = de + cf * b;\n\n\t\t\tte[1] = cf + de * b;\n\t\t\tte[5] = a * e;\n\t\t\tte[9] = df - ce * b;\n\n\t\t\tte[2] = -a * d;\n\t\t\tte[6] = b;\n\t\t\tte[10] = a * c;\n\t\t} else if (euler.order === 'ZYX') {\n\t\t\tconst ae = a * e, af = a * f, be = b * e, bf = b * f;\n\n\t\t\tte[0] = c * e;\n\t\t\tte[4] = be * d - af;\n\t\t\tte[8] = ae * d + bf;\n\n\t\t\tte[1] = c * f;\n\t\t\tte[5] = bf * d + ae;\n\t\t\tte[9] = af * d - be;\n\n\t\t\tte[2] = -d;\n\t\t\tte[6] = b * c;\n\t\t\tte[10] = a * c;\n\t\t} else if (euler.order === 'YZX') {\n\t\t\tconst ac = a * c, ad = a * d, bc = b * c, bd = b * d;\n\n\t\t\tte[0] = c * e;\n\t\t\tte[4] = bd - ac * f;\n\t\t\tte[8] = bc * f + ad;\n\n\t\t\tte[1] = f;\n\t\t\tte[5] = a * e;\n\t\t\tte[9] = -b * e;\n\n\t\t\tte[2] = -d * e;\n\t\t\tte[6] = ad * f + bc;\n\t\t\tte[10] = ac - bd * f;\n\t\t} else if (euler.order === 'XZY') {\n\t\t\tconst ac = a * c, ad = a * d, bc = b * c, bd = b * d;\n\n\t\t\tte[0] = c * e;\n\t\t\tte[4] = -f;\n\t\t\tte[8] = d * e;\n\n\t\t\tte[1] = ac * f + bd;\n\t\t\tte[5] = a * e;\n\t\t\tte[9] = ad * f - bc;\n\n\t\t\tte[2] = bc * f - ad;\n\t\t\tte[6] = b * e;\n\t\t\tte[10] = bd * f + ac;\n\t\t}\n\n\t\t// bottom row\n\t\tte[3] = 0;\n\t\tte[7] = 0;\n\t\tte[11] = 0;\n\n\t\t// last column\n\t\tte[12] = 0;\n\t\tte[13] = 0;\n\t\tte[14] = 0;\n\t\tte[15] = 1;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the rotation component of this matrix to the rotation specified by q, as outlined here.\n\t * @param {Quaternion} q\n\t * @returns {Matrix4}\n\t */\n\tmakeRotationFromQuaternion(q) {\n\t\treturn this.compose(_zero, q, _one);\n\t}\n\n\t/**\n\t * Constructs a rotation matrix, looking from eye towards center oriented by the up vector.\n\t * @param {Vector3} eye - The eye vector.\n\t * @param {Vector3} target - The target vector.\n\t * @param {Vector3} up - The up vector.\n\t * @returns {Matrix4} A reference to this matrix.\n\t */\n\tlookAtRH(eye, target, up) {\n\t\tconst te = this.elements;\n\n\t\t_z.subVectors(eye, target);\n\n\t\tif (_z.getLengthSquared() === 0) {\n\t\t\t// eye and target are in the same position\n\t\t\t_z.z = 1;\n\t\t}\n\n\t\t_z.normalize();\n\t\t_x.crossVectors(up, _z);\n\n\t\tif (_x.getLengthSquared() === 0) {\n\t\t\t// up and z are parallel\n\n\t\t\tif (Math.abs(up.z) === 1) {\n\t\t\t\t_z.x += 0.0001;\n\t\t\t} else {\n\t\t\t\t_z.z += 0.0001;\n\t\t\t}\n\n\t\t\t_z.normalize();\n\t\t\t_x.crossVectors(up, _z);\n\t\t}\n\n\t\t_x.normalize();\n\t\t_y.crossVectors(_z, _x);\n\n\t\tte[0] = _x.x; te[4] = _y.x; te[8] = _z.x;\n\t\tte[1] = _x.y; te[5] = _y.y; te[9] = _z.y;\n\t\tte[2] = _x.z; te[6] = _y.z; te[10] = _z.z;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Post-multiplies this matrix by the given 4x4 matrix.\n\t * @param {Matrix4} m - The matrix to multiply with.\n\t * @returns {Matrix4} A reference to this matrix.\n\t */\n\tmultiply(m) {\n\t\treturn this.multiplyMatrices(this, m);\n\t}\n\n\t/**\n\t * Pre-multiplies this matrix by the given 4x4 matrix.\n\t * @param {Matrix4} m - The matrix to multiply with.\n\t * @returns {Matrix4} A reference to this matrix.\n\t */\n\tpremultiply(m) {\n\t\treturn this.multiplyMatrices(m, this);\n\t}\n\n\t/**\n\t * Multiples the given 4x4 matrices and stores the result\n\t * in this matrix.\n\t * @param {Matrix4} a - The first matrix.\n\t * @param {Matrix4} b - The second matrix.\n\t * @returns {Matrix4} A reference to this matrix.\n\t */\n\tmultiplyMatrices(a, b) {\n\t\tconst ae = a.elements;\n\t\tconst be = b.elements;\n\t\tconst te = this.elements;\n\n\t\tconst a11 = ae[0], a12 = ae[4], a13 = ae[8], a14 = ae[12];\n\t\tconst a21 = ae[1], a22 = ae[5], a23 = ae[9], a24 = ae[13];\n\t\tconst a31 = ae[2], a32 = ae[6], a33 = ae[10], a34 = ae[14];\n\t\tconst a41 = ae[3], a42 = ae[7], a43 = ae[11], a44 = ae[15];\n\n\t\tconst b11 = be[0], b12 = be[4], b13 = be[8], b14 = be[12];\n\t\tconst b21 = be[1], b22 = be[5], b23 = be[9], b24 = be[13];\n\t\tconst b31 = be[2], b32 = be[6], b33 = be[10], b34 = be[14];\n\t\tconst b41 = be[3], b42 = be[7], b43 = be[11], b44 = be[15];\n\n\t\tte[0] = a11 * b11 + a12 * b21 + a13 * b31 + a14 * b41;\n\t\tte[4] = a11 * b12 + a12 * b22 + a13 * b32 + a14 * b42;\n\t\tte[8] = a11 * b13 + a12 * b23 + a13 * b33 + a14 * b43;\n\t\tte[12] = a11 * b14 + a12 * b24 + a13 * b34 + a14 * b44;\n\n\t\tte[1] = a21 * b11 + a22 * b21 + a23 * b31 + a24 * b41;\n\t\tte[5] = a21 * b12 + a22 * b22 + a23 * b32 + a24 * b42;\n\t\tte[9] = a21 * b13 + a22 * b23 + a23 * b33 + a24 * b43;\n\t\tte[13] = a21 * b14 + a22 * b24 + a23 * b34 + a24 * b44;\n\n\t\tte[2] = a31 * b11 + a32 * b21 + a33 * b31 + a34 * b41;\n\t\tte[6] = a31 * b12 + a32 * b22 + a33 * b32 + a34 * b42;\n\t\tte[10] = a31 * b13 + a32 * b23 + a33 * b33 + a34 * b43;\n\t\tte[14] = a31 * b14 + a32 * b24 + a33 * b34 + a34 * b44;\n\n\t\tte[3] = a41 * b11 + a42 * b21 + a43 * b31 + a44 * b41;\n\t\tte[7] = a41 * b12 + a42 * b22 + a43 * b32 + a44 * b42;\n\t\tte[11] = a41 * b13 + a42 * b23 + a43 * b33 + a44 * b43;\n\t\tte[15] = a41 * b14 + a42 * b24 + a43 * b34 + a44 * b44;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Computes and returns the determinant of this matrix.\n\t * Based on the method outlined [here]{@link http://www.euclideanspace.com/maths/algebra/matrix/functions/inverse/fourD/index.html}.\n\t * @returns {number} The determinant.\n\t */\n\tdeterminant() {\n\t\tconst te = this.elements;\n\n\t\tconst n11 = te[0], n12 = te[4], n13 = te[8], n14 = te[12];\n\t\tconst n21 = te[1], n22 = te[5], n23 = te[9], n24 = te[13];\n\t\tconst n31 = te[2], n32 = te[6], n33 = te[10], n34 = te[14];\n\t\tconst n41 = te[3], n42 = te[7], n43 = te[11], n44 = te[15];\n\n\t\t// TODO: make this more efficient\n\n\t\treturn (\n\t\t\tn41 * (\n\t\t\t\t+n14 * n23 * n32\n\t\t\t\t- n13 * n24 * n32\n\t\t\t\t- n14 * n22 * n33\n\t\t\t\t+ n12 * n24 * n33\n\t\t\t\t+ n13 * n22 * n34\n\t\t\t\t- n12 * n23 * n34\n\t\t\t) +\n\t\t\tn42 * (\n\t\t\t\t+n11 * n23 * n34\n\t\t\t\t - n11 * n24 * n33\n\t\t\t\t + n14 * n21 * n33\n\t\t\t\t - n13 * n21 * n34\n\t\t\t\t + n13 * n24 * n31\n\t\t\t\t - n14 * n23 * n31\n\t\t\t) +\n\t\t\tn43 * (\n\t\t\t\t+n11 * n24 * n32\n\t\t\t\t - n11 * n22 * n34\n\t\t\t\t - n14 * n21 * n32\n\t\t\t\t + n12 * n21 * n34\n\t\t\t\t + n14 * n22 * n31\n\t\t\t\t - n12 * n24 * n31\n\t\t\t) +\n\t\t\tn44 * (\n\t\t\t\t-n13 * n22 * n31\n\t\t\t\t - n11 * n23 * n32\n\t\t\t\t + n11 * n22 * n33\n\t\t\t\t + n13 * n21 * n32\n\t\t\t\t - n12 * n21 * n33\n\t\t\t\t + n12 * n23 * n31\n\t\t\t)\n\t\t);\n\t}\n\n\t/**\n\t * Transposes this matrix in place.\n\t * @returns {Matrix4} A reference to this matrix.\n\t */\n\ttranspose() {\n\t\tconst te = this.elements;\n\t\tlet tmp;\n\n\t\ttmp = te[1]; te[1] = te[4]; te[4] = tmp;\n\t\ttmp = te[2]; te[2] = te[8]; te[8] = tmp;\n\t\ttmp = te[6]; te[6] = te[9]; te[9] = tmp;\n\n\t\ttmp = te[3]; te[3] = te[12]; te[12] = tmp;\n\t\ttmp = te[7]; te[7] = te[13]; te[13] = tmp;\n\t\ttmp = te[11]; te[11] = te[14]; te[14] = tmp;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the position component for this matrix from the given vector,\n\t * without affecting the rest of the matrix.\n\t * @param {number|Vector3} x - The x component of the vector or alternatively the vector object.\n\t * @param {number} y - The y component of the vector.\n\t * @param {number} z - The z component of the vector.\n\t * @returns {Matrix4} A reference to this matrix.\n\t */\n\tsetPosition(x, y, z) {\n\t\tconst te = this.elements;\n\n\t\tif (x.isVector3) {\n\t\t\tte[12] = x.x;\n\t\t\tte[13] = x.y;\n\t\t\tte[14] = x.z;\n\t\t} else {\n\t\t\tte[12] = x;\n\t\t\tte[13] = y;\n\t\t\tte[14] = z;\n\t\t}\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Inverts this matrix, using the [analytic method]{@link https://en.wikipedia.org/wiki/Invertible_matrix#Analytic_solution}.\n\t * You can not invert with a determinant of zero. If you attempt this, the method produces\n\t * a zero matrix instead.\n\t * @returns {Matrix4} A reference to this matrix.\n\t */\n\tinvert() {\n\t\t// based on http://www.euclideanspace.com/maths/algebra/matrix/functions/inverse/fourD/index.htm\n\t\tconst te = this.elements,\n\n\t\t\tn11 = te[0], n21 = te[1], n31 = te[2], n41 = te[3],\n\t\t\tn12 = te[4], n22 = te[5], n32 = te[6], n42 = te[7],\n\t\t\tn13 = te[8], n23 = te[9], n33 = te[10], n43 = te[11],\n\t\t\tn14 = te[12], n24 = te[13], n34 = te[14], n44 = te[15],\n\n\t\t\tt11 = n23 * n34 * n42 - n24 * n33 * n42 + n24 * n32 * n43 - n22 * n34 * n43 - n23 * n32 * n44 + n22 * n33 * n44,\n\t\t\tt12 = n14 * n33 * n42 - n13 * n34 * n42 - n14 * n32 * n43 + n12 * n34 * n43 + n13 * n32 * n44 - n12 * n33 * n44,\n\t\t\tt13 = n13 * n24 * n42 - n14 * n23 * n42 + n14 * n22 * n43 - n12 * n24 * n43 - n13 * n22 * n44 + n12 * n23 * n44,\n\t\t\tt14 = n14 * n23 * n32 - n13 * n24 * n32 - n14 * n22 * n33 + n12 * n24 * n33 + n13 * n22 * n34 - n12 * n23 * n34;\n\n\t\tconst det = n11 * t11 + n21 * t12 + n31 * t13 + n41 * t14;\n\n\t\tif (det === 0) return this.set(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);\n\n\t\tconst detInv = 1 / det;\n\n\t\tte[0] = t11 * detInv;\n\t\tte[1] = (n24 * n33 * n41 - n23 * n34 * n41 - n24 * n31 * n43 + n21 * n34 * n43 + n23 * n31 * n44 - n21 * n33 * n44) * detInv;\n\t\tte[2] = (n22 * n34 * n41 - n24 * n32 * n41 + n24 * n31 * n42 - n21 * n34 * n42 - n22 * n31 * n44 + n21 * n32 * n44) * detInv;\n\t\tte[3] = (n23 * n32 * n41 - n22 * n33 * n41 - n23 * n31 * n42 + n21 * n33 * n42 + n22 * n31 * n43 - n21 * n32 * n43) * detInv;\n\n\t\tte[4] = t12 * detInv;\n\t\tte[5] = (n13 * n34 * n41 - n14 * n33 * n41 + n14 * n31 * n43 - n11 * n34 * n43 - n13 * n31 * n44 + n11 * n33 * n44) * detInv;\n\t\tte[6] = (n14 * n32 * n41 - n12 * n34 * n41 - n14 * n31 * n42 + n11 * n34 * n42 + n12 * n31 * n44 - n11 * n32 * n44) * detInv;\n\t\tte[7] = (n12 * n33 * n41 - n13 * n32 * n41 + n13 * n31 * n42 - n11 * n33 * n42 - n12 * n31 * n43 + n11 * n32 * n43) * detInv;\n\n\t\tte[8] = t13 * detInv;\n\t\tte[9] = (n14 * n23 * n41 - n13 * n24 * n41 - n14 * n21 * n43 + n11 * n24 * n43 + n13 * n21 * n44 - n11 * n23 * n44) * detInv;\n\t\tte[10] = (n12 * n24 * n41 - n14 * n22 * n41 + n14 * n21 * n42 - n11 * n24 * n42 - n12 * n21 * n44 + n11 * n22 * n44) * detInv;\n\t\tte[11] = (n13 * n22 * n41 - n12 * n23 * n41 - n13 * n21 * n42 + n11 * n23 * n42 + n12 * n21 * n43 - n11 * n22 * n43) * detInv;\n\n\t\tte[12] = t14 * detInv;\n\t\tte[13] = (n13 * n24 * n31 - n14 * n23 * n31 + n14 * n21 * n33 - n11 * n24 * n33 - n13 * n21 * n34 + n11 * n23 * n34) * detInv;\n\t\tte[14] = (n14 * n22 * n31 - n12 * n24 * n31 - n14 * n21 * n32 + n11 * n24 * n32 + n12 * n21 * n34 - n11 * n22 * n34) * detInv;\n\t\tte[15] = (n12 * n23 * n31 - n13 * n22 * n31 + n13 * n21 * n32 - n11 * n23 * n32 - n12 * n21 * n33 + n11 * n22 * n33) * detInv;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Gets the maximum scale value of the three axes.\n\t * @returns {number} The maximum scale.\n\t */\n\tgetMaxScaleOnAxis() {\n\t\tconst te = this.elements;\n\n\t\tconst scaleXSq = te[0] * te[0] + te[1] * te[1] + te[2] * te[2];\n\t\tconst scaleYSq = te[4] * te[4] + te[5] * te[5] + te[6] * te[6];\n\t\tconst scaleZSq = te[8] * te[8] + te[9] * te[9] + te[10] * te[10];\n\n\t\treturn Math.sqrt(Math.max(scaleXSq, scaleYSq, scaleZSq));\n\t}\n\n\t/**\n\t * Sets this matrix as a translation transform from the given vector.\n\t * @param {number|Vector3} x - The amount to translate in the X axis or alternatively a translation vector.\n\t * @param {number} y - The amount to translate in the Y axis.\n\t * @param {number} z - The amount to translate in the z axis.\n\t * @returns {Matrix4} A reference to this matrix.\n\t */\n\tmakeTranslation(x, y, z) {\n\t\tif (x.isVector3) {\n\t\t\tthis.set(\n\n\t\t\t\t1, 0, 0, x.x,\n\t\t\t\t0, 1, 0, x.y,\n\t\t\t\t0, 0, 1, x.z,\n\t\t\t\t0, 0, 0, 1\n\n\t\t\t);\n\t\t} else {\n\t\t\tthis.set(\n\n\t\t\t\t1, 0, 0, x,\n\t\t\t\t0, 1, 0, y,\n\t\t\t\t0, 0, 1, z,\n\t\t\t\t0, 0, 0, 1\n\n\t\t\t);\n\t\t}\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets this matrix as a rotational transformation around the given axis by\n\t * the given angle.\n\t * This is a somewhat controversial but mathematically sound alternative to\n\t * rotating via Quaternions. See the discussion [here]{@link https://www.gamedev.net/articles/programming/math-and-physics/do-we-really-need-quaternions-r1199}.\n\t * @param {Vector3} axis - The normalized rotation axis.\n\t * @param {number} angle - The rotation in radians.\n\t * @returns {Matrix4} A reference to this matrix.\n\t */\n\tmakeRotationAxis(axis, angle) {\n\t\t// Based on http://www.gamedev.net/reference/articles/article1199.asp\n\n\t\tconst c = Math.cos(angle);\n\t\tconst s = Math.sin(angle);\n\t\tconst t = 1 - c;\n\t\tconst x = axis.x, y = axis.y, z = axis.z;\n\t\tconst tx = t * x, ty = t * y;\n\n\t\treturn this.set(\n\t\t\ttx * x + c, tx * y - s * z, tx * z + s * y, 0,\n\t\t\ttx * y + s * z, ty * y + c, ty * z - s * x, 0,\n\t\t\ttx * z - s * y, ty * z + s * x, t * z * z + c, 0,\n\t\t\t0, 0, 0, 1\n\t\t);\n\t}\n\n\t/**\n\t * Sets this matrix as a scale transformation.\n\t * @param {number} x - The amount to scale in the X axis.\n\t * @param {number} y - The amount to scale in the Y axis.\n\t * @param {number} z - The amount to scale in the Z axis.\n\t * @returns {Matrix4} A reference to this matrix.\n\t */\n\tmakeScale(x, y, z) {\n\t\treturn this.set(\n\t\t\tx, 0, 0, 0,\n\t\t\t0, y, 0, 0,\n\t\t\t0, 0, z, 0,\n\t\t\t0, 0, 0, 1\n\t\t);\n\t}\n\n\t/**\n\t * Sets this matrix to the transformation composed of the given position,\n\t * rotation (Quaternion) and scale.\n\t * @param {Vector3} position - The position vector.\n\t * @param {Quaternion} quaternion - The rotation as a Quaternion.\n\t * @param {Vector3} scale - The scale vector.\n\t * @returns {Matrix4} A reference to this matrix.\n\t */\n\tcompose(position, quaternion, scale) {\n\t\tconst te = this.elements;\n\n\t\tconst x = quaternion._x, y = quaternion._y, z = quaternion._z, w = quaternion._w;\n\t\tconst x2 = x + x,\ty2 = y + y, z2 = z + z;\n\t\tconst xx = x * x2, xy = x * y2, xz = x * z2;\n\t\tconst yy = y * y2, yz = y * z2, zz = z * z2;\n\t\tconst wx = w * x2, wy = w * y2, wz = w * z2;\n\n\t\tconst sx = scale.x, sy = scale.y, sz = scale.z;\n\n\t\tte[0] = (1 - (yy + zz)) * sx;\n\t\tte[1] = (xy + wz) * sx;\n\t\tte[2] = (xz - wy) * sx;\n\t\tte[3] = 0;\n\n\t\tte[4] = (xy - wz) * sy;\n\t\tte[5] = (1 - (xx + zz)) * sy;\n\t\tte[6] = (yz + wx) * sy;\n\t\tte[7] = 0;\n\n\t\tte[8] = (xz + wy) * sz;\n\t\tte[9] = (yz - wx) * sz;\n\t\tte[10] = (1 - (xx + yy)) * sz;\n\t\tte[11] = 0;\n\n\t\tte[12] = position.x;\n\t\tte[13] = position.y;\n\t\tte[14] = position.z;\n\t\tte[15] = 1;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Decomposes this matrix into its position, rotation and scale components\n\t * and provides the result in the given objects.\n\t * Note: Not all matrices are decomposable in this way. For example, if an\n\t * object has a non-uniformly scaled parent, then the object's world matrix\n\t * may not be decomposable, and this method may not be appropriate.\n\t * @param {Vector3} position - The position vector.\n\t * @param {Quaternion} quaternion - The rotation as a Quaternion.\n\t * @param {Vector3} scale - The scale vector.\n\t * @returns {Matrix4} A reference to this matrix.\n\t */\n\tdecompose(position, quaternion, scale) {\n\t\tconst te = this.elements;\n\n\t\tlet sx = _vec3_1.set(te[0], te[1], te[2]).getLength();\n\t\tconst sy = _vec3_1.set(te[4], te[5], te[6]).getLength();\n\t\tconst sz = _vec3_1.set(te[8], te[9], te[10]).getLength();\n\n\t\t// if determine is negative, we need to invert one scale\n\t\tconst det = this.determinant();\n\t\tif (det < 0) {\n\t\t\tsx = -sx;\n\t\t}\n\n\t\tposition.x = te[12];\n\t\tposition.y = te[13];\n\t\tposition.z = te[14];\n\n\t\t// scale the rotation part\n\t\t_mat4_1.copy(this);\n\n\t\tconst invSX = 1 / sx;\n\t\tconst invSY = 1 / sy;\n\t\tconst invSZ = 1 / sz;\n\n\t\t_mat4_1.elements[0] *= invSX;\n\t\t_mat4_1.elements[1] *= invSX;\n\t\t_mat4_1.elements[2] *= invSX;\n\n\t\t_mat4_1.elements[4] *= invSY;\n\t\t_mat4_1.elements[5] *= invSY;\n\t\t_mat4_1.elements[6] *= invSY;\n\n\t\t_mat4_1.elements[8] *= invSZ;\n\t\t_mat4_1.elements[9] *= invSZ;\n\t\t_mat4_1.elements[10] *= invSZ;\n\n\t\tquaternion.setFromRotationMatrix(_mat4_1);\n\n\t\tscale.x = sx;\n\t\tscale.y = sy;\n\t\tscale.z = sz;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Returns `true` if this matrix is equal with the given one.\n\t * @param {Matrix4} matrix - The matrix to test for equality.\n\t * @returns {boolean} Whether this matrix is equal with the given one.\n\t */\n\tequals(matrix) {\n\t\tconst te = this.elements;\n\t\tconst me = matrix.elements;\n\n\t\tfor (let i = 0; i < 16; i++) {\n\t\t\tif (te[i] !== me[i]) return false;\n\t\t}\n\n\t\treturn true;\n\t}\n\n\t/**\n\t * Sets the elements of the matrix from the given array.\n\t * @param {Array<number>} array - The matrix elements in column-major order.\n\t * @param {number} [offset=0] - Index of the first element in the array.\n\t * @returns {Matrix4} A reference to this matrix.\n\t */\n\tfromArray(array, offset = 0) {\n\t\tfor (let i = 0; i < 16; i++) {\n\t\t\tthis.elements[i] = array[i + offset];\n\t\t}\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Writes the elements of this matrix to the given array. If no array is provided,\n\t * the method returns a new instance.\n\t * @param {Array<number>} [array=[]] - The target array holding the matrix elements in column-major order.\n\t * @param {number} [offset=0] - Index of the first element in the array.\n\t * @returns {Array<number>} The matrix elements in column-major order.\n\t */\n\ttoArray(array = [], offset = 0) {\n\t\tconst te = this.elements;\n\n\t\tarray[offset] = te[0];\n\t\tarray[offset + 1] = te[1];\n\t\tarray[offset + 2] = te[2];\n\t\tarray[offset + 3] = te[3];\n\n\t\tarray[offset + 4] = te[4];\n\t\tarray[offset + 5] = te[5];\n\t\tarray[offset + 6] = te[6];\n\t\tarray[offset + 7] = te[7];\n\n\t\tarray[offset + 8] = te[8];\n\t\tarray[offset + 9] = te[9];\n\t\tarray[offset + 10] = te[10];\n\t\tarray[offset + 11] = te[11];\n\n\t\tarray[offset + 12] = te[12];\n\t\tarray[offset + 13] = te[13];\n\t\tarray[offset + 14] = te[14];\n\t\tarray[offset + 15] = te[15];\n\n\t\treturn array;\n\t}\n\n\t/**\n\t * Linearly interpolates between two matrix4.\n\t * @param {Matrix4} m1\n\t * @param {Matrix4} m2\n\t * @param {number} ratio\n\t * @returns {Matrix4}\n\t */\n\tlerpMatrices(m1, m2, ratio) {\n\t\tif (ratio === 0) return this.copy(m1);\n\t\tif (ratio === 1) return this.copy(m2);\n\n\t\tconst te = this.elements,\n\t\t\tte1 = m1.elements,\n\t\t\tte2 = m2.elements;\n\n\t\tfor (let i = 0; i < 16; i++) {\n\t\t\tte[i] = te1[i] * (1 - ratio) + te2[i] * ratio;\n\t\t}\n\n\t\treturn this;\n\t}\n\n}\n\n/**\n * This flag can be used for type testing.\n * @readonly\n * @type {boolean}\n * @default true\n */\nMatrix4.prototype.isMatrix4 = true;\n\nconst _vec3_1 = new Vector3();\nconst _mat4_1 = new Matrix4();\nconst _zero = new Vector3(0, 0, 0);\nconst _one = new Vector3(1, 1, 1);\nconst _x = new Vector3();\nconst _y = new Vector3();\nconst _z = new Vector3();\n\nexport { Matrix4 };"
  },
  {
    "path": "src/math/Plane.js",
    "content": "import { Vector3 } from './Vector3.js';\nimport { Matrix3 } from './Matrix3.js';\n\nconst _vec3_1 = new Vector3();\nconst _vec3_2 = new Vector3();\nconst _mat3_1 = new Matrix3();\n\n/**\n * A two dimensional surface that extends infinitely in 3d space,\n * represented in Hessian normal form by a unit length normal vector and a constant.\n */\nclass Plane {\n\n\t/**\n\t * Constructs a new Plane.\n\t * @param {Vector3} [normal=Vector3(1, 0, 0)] - A unit length Vector3 defining the normal of the plane.\n\t * @param {number} [constant=0] - The signed distance from the origin to the plane.\n\t */\n\tconstructor(normal = new Vector3(1, 0, 0), constant = 0) {\n\t\tthis.normal = normal;\n\t\tthis.constant = constant;\n\t}\n\n\t/**\n\t * Solve a system of equations to find the point where the three planes intersect.\n\t * @param {Plane} p1 - The first plane.\n\t * @param {Plane} p2 - The second plane.\n\t * @param {Plane} p3 - The third plane.\n\t * @param {Vector3} target - The result will be copied into this Vector3.\n\t * @returns {Vector3}\n\t */\n\tstatic intersectPlanes(p1, p2, p3, target) {\n\t\t// Create the matrix using the normals of the planes as rows\n\t\t_mat3_1.set(\n\t\t\tp1.normal.x, p1.normal.y, p1.normal.z,\n\t\t\tp2.normal.x, p2.normal.y, p2.normal.z,\n\t\t\tp3.normal.x, p3.normal.y, p3.normal.z\n\t\t);\n\n\t\t// Create the vector using the constants of the planes\n\t\ttarget.set(-p1.constant, -p2.constant, -p3.constant);\n\n\t\t// Solve for X by applying the inverse matrix to vector\n\t\ttarget.applyMatrix3(_mat3_1.invert());\n\n\t\treturn target;\n\t}\n\n\t/**\n\t * Sets this plane's normal and constant properties by copying the values from the given normal.\n\t * @param {Vector3} normal - a unit length Vector3 defining the normal of the plane.\n\t * @param {number} constant - the signed distance from the origin to the plane. Default is 0.\n\t * @returns {Plane}\n\t */\n\tset(normal, constant) {\n\t\tthis.normal.copy(normal);\n\t\tthis.constant = constant;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Set the individual components that define the plane.\n\t * @param {number} x - x value of the unit length normal vector.\n\t * @param {number} y - y value of the unit length normal vector.\n\t * @param {number} z - z value of the unit length normal vector.\n\t * @param {number} w - the value of the plane's constant property.\n\t * @returns {Plane}\n\t */\n\tsetComponents(x, y, z, w) {\n\t\tthis.normal.set(x, y, z);\n\t\tthis.constant = w;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the plane's properties as defined by a normal and an arbitrary coplanar point.\n\t * @param {Vector3} normal - a unit length Vector3 defining the normal of the plane.\n\t * @param {Vector3} point - Vector3\n\t * @returns {Plane}\n\t */\n\tsetFromNormalAndCoplanarPoint(normal, point) {\n\t\tthis.normal.copy(normal);\n\t\tthis.constant = -point.dot(this.normal);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Defines the plane based on the 3 provided points.\n\t * The winding order is assumed to be counter-clockwise, and determines the direction of the normal.\n\t * @param {Vector3} a - first point on the plane.\n\t * @param {Vector3} b - second point on the plane.\n\t * @param {Vector3} c - third point on the plane.\n\t * @returns {Plane}\n\t */\n\tsetFromCoplanarPoints(a, b, c) {\n\t\tconst normal = _vec3_1.subVectors(c, b).cross(_vec3_2.subVectors(a, b)).normalize();\n\t\t// Q: should an error be thrown if normal is zero (e.g. degenerate plane)?\n\t\tthis.setFromNormalAndCoplanarPoint(normal, a);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Normalizes the normal vector, and adjusts the constant value accordingly.\n\t * @returns {Plane}\n\t */\n\tnormalize() {\n\t\t// Note: will lead to a divide by zero if the plane is invalid.\n\n\t\tconst inverseNormalLength = 1.0 / this.normal.getLength();\n\t\tthis.normal.multiplyScalar(inverseNormalLength);\n\t\tthis.constant *= inverseNormalLength;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Returns the signed distance from the point to the plane.\n\t * @param {Vector3} point\n\t * @returns {number}\n\t */\n\tdistanceToPoint(point) {\n\t\treturn this.normal.dot(point) + this.constant;\n\t}\n\n\t/**\n\t * Projects a point onto the plane.\n\t * @param {Vector3} point - the Vector3 to project onto the plane.\n\t * @param {Vector3} [target] - the result will be copied into this Vector3.\n\t * @returns {Vector3}\n\t */\n\tprojectPoint(point, target = new Vector3()) {\n\t\treturn target.copy(point).addScaledVector(this.normal, -this.distanceToPoint(point));\n\t}\n\n\t/**\n\t * Reflects a point through the plane.\n\t * @param {Vector3} point - the Vector3 to reflect through the plane.\n\t * @param {Vector3} [target] - the result will be copied into this Vector3.\n\t * @returns {Vector3}\n\t */\n\tmirrorPoint(point, target = new Vector3()) {\n\t\tconst distance = this.distanceToPoint(point);\n\t\treturn target.copy(point).addScaledVector(this.normal, -2 * distance);\n\t}\n\n\t/**\n\t * Returns a Vector3 coplanar to the plane, by calculating the projection of the normal vector at the origin onto the plane.\n\t * @param {Vector3} [target]\n\t * @returns {Vector3}\n\t */\n\tcoplanarPoint(target = new Vector3()) {\n\t\treturn target.copy(this.normal).multiplyScalar(-this.constant);\n\t}\n\n\t/**\n\t * Returns a new plane with the same normal and constant as this one.\n\t * @returns {Plane}\n\t */\n\tclone() {\n\t\treturn new Plane().copy(this);\n\t}\n\n\t/**\n\t * Copies the values of the passed plane's normal and constant properties to this plane.\n\t * @param {Plane} plane\n\t * @returns {Plane}\n\t */\n\tcopy(plane) {\n\t\tthis.normal.copy(plane.normal);\n\t\tthis.constant = plane.constant;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Apply a Matrix4 to the plane. The matrix must be an affine, homogeneous transform.\n\t * @param {Matrix4} matrix - the Matrix4 to apply.\n\t * @param {Matrix3} [optionalNormalMatrix] - (optional) pre-computed normal Matrix3 of the Matrix4 being applied.\n\t * @returns {Plane}\n\t */\n\tapplyMatrix4(matrix, optionalNormalMatrix) {\n\t\tconst normalMatrix = optionalNormalMatrix || _mat3_1.setFromMatrix4(matrix).invert().transpose();\n\n\t\tconst referencePoint = this.coplanarPoint(_vec3_1).applyMatrix4(matrix);\n\n\t\tconst normal = this.normal.applyMatrix3(normalMatrix).normalize();\n\n\t\tthis.constant = -referencePoint.dot(normal);\n\n\t\treturn this;\n\t}\n\n}\n\n/**\n * This flag can be used for type testing.\n * @readonly\n * @type {boolean}\n * @default true\n */\nPlane.prototype.isPlane = true;\n\nexport { Plane };"
  },
  {
    "path": "src/math/Quaternion.js",
    "content": "import { MathUtils } from './MathUtils.js';\nimport { Matrix4 } from './Matrix4.js';\n\n/**\n * Class for representing a Quaternion.\n */\nclass Quaternion {\n\n\t/**\n\t * Constructs a new quaternion.\n\t * @param {number} [x=0] - The x value of this quaternion.\n\t * @param {number} [y=0] - The y value of this quaternion.\n\t * @param {number} [z=0] - The z value of this quaternion.\n\t * @param {number} [w=1] - The w value of this quaternion.\n\t */\n\tconstructor(x = 0, y = 0, z = 0, w = 1) {\n\t\tthis._x = x;\n\t\tthis._y = y;\n\t\tthis._z = z;\n\t\tthis._w = w;\n\t}\n\n\t/**\n\t * Interpolates between two quaternions via SLERP. This implementation assumes the\n\t * quaternion data are managed in flat arrays.\n\t * @param {Array<number>} dst - The destination array.\n\t * @param {number} dstOffset - An offset into the destination array.\n\t * @param {Array<number>} src0 - The source array of the first quaternion.\n\t * @param {number} srcOffset0 - An offset into the first source array.\n\t * @param {Array<number>} src1 -  The source array of the second quaternion.\n\t * @param {number} srcOffset1 - An offset into the second source array.\n\t * @param {number} t - The interpolation factor in the range `[0,1]`.\n\t * @see {@link Quaternion#slerp}\n\t */\n\tstatic slerpFlat(dst, dstOffset, src0, srcOffset0, src1, srcOffset1, t) {\n\t\tlet x0 = src0[srcOffset0 + 0],\n\t\t\ty0 = src0[srcOffset0 + 1],\n\t\t\tz0 = src0[srcOffset0 + 2],\n\t\t\tw0 = src0[srcOffset0 + 3];\n\n\t\tlet x1 = src1[srcOffset1 + 0],\n\t\t\ty1 = src1[srcOffset1 + 1],\n\t\t\tz1 = src1[srcOffset1 + 2],\n\t\t\tw1 = src1[srcOffset1 + 3];\n\n\t\tif (t <= 0) {\n\t\t\tdst[dstOffset + 0] = x0;\n\t\t\tdst[dstOffset + 1] = y0;\n\t\t\tdst[dstOffset + 2] = z0;\n\t\t\tdst[dstOffset + 3] = w0;\n\n\t\t\treturn;\n\t\t}\n\n\t\tif (t >= 1) {\n\t\t\tdst[dstOffset + 0] = x1;\n\t\t\tdst[dstOffset + 1] = y1;\n\t\t\tdst[dstOffset + 2] = z1;\n\t\t\tdst[dstOffset + 3] = w1;\n\n\t\t\treturn;\n\t\t}\n\n\t\tif (w0 !== w1 || x0 !== x1 || y0 !== y1 || z0 !== z1) {\n\t\t\tlet dot = x0 * x1 + y0 * y1 + z0 * z1 + w0 * w1;\n\n\t\t\tif (dot < 0) {\n\t\t\t\tx1 = -x1;\n\t\t\t\ty1 = -y1;\n\t\t\t\tz1 = -z1;\n\t\t\t\tw1 = -w1;\n\n\t\t\t\tdot = -dot;\n\t\t\t}\n\n\t\t\tlet s = 1 - t;\n\n\t\t\tif (dot < 0.9995) {\n\t\t\t\t// slerp\n\n\t\t\t\tconst theta = Math.acos(dot);\n\t\t\t\tconst sin = Math.sin(theta);\n\n\t\t\t\ts = Math.sin(s * theta) / sin;\n\t\t\t\tt = Math.sin(t * theta) / sin;\n\n\t\t\t\tx0 = x0 * s + x1 * t;\n\t\t\t\ty0 = y0 * s + y1 * t;\n\t\t\t\tz0 = z0 * s + z1 * t;\n\t\t\t\tw0 = w0 * s + w1 * t;\n\t\t\t} else {\n\t\t\t\t// for small angles, lerp then normalize\n\n\t\t\t\tx0 = x0 * s + x1 * t;\n\t\t\t\ty0 = y0 * s + y1 * t;\n\t\t\t\tz0 = z0 * s + z1 * t;\n\t\t\t\tw0 = w0 * s + w1 * t;\n\n\t\t\t\tconst f = 1 / Math.sqrt(x0 * x0 + y0 * y0 + z0 * z0 + w0 * w0);\n\n\t\t\t\tx0 *= f;\n\t\t\t\ty0 *= f;\n\t\t\t\tz0 *= f;\n\t\t\t\tw0 *= f;\n\t\t\t}\n\t\t}\n\n\t\tdst[dstOffset] = x0;\n\t\tdst[dstOffset + 1] = y0;\n\t\tdst[dstOffset + 2] = z0;\n\t\tdst[dstOffset + 3] = w0;\n\t}\n\n\t/**\n\t * Multiplies two quaternions. This implementation assumes the quaternion data are managed\n\t * in flat arrays.\n\t * @param {Array<number>} dst - The destination array.\n\t * @param {number} dstOffset - An offset into the destination array.\n\t * @param {Array<number>} src0 - The source array of the first quaternion.\n\t * @param {number} srcOffset0 - An offset into the first source array.\n\t * @param {Array<number>} src1 -  The source array of the second quaternion.\n\t * @param {number} srcOffset1 - An offset into the second source array.\n\t * @returns {Array<number>} The destination array.\n\t * @see {@link Quaternion#multiplyQuaternions}\n\t */\n\tstatic multiplyQuaternionsFlat(dst, dstOffset, src0, srcOffset0, src1, srcOffset1) {\n\t\tconst x0 = src0[srcOffset0];\n\t\tconst y0 = src0[srcOffset0 + 1];\n\t\tconst z0 = src0[srcOffset0 + 2];\n\t\tconst w0 = src0[srcOffset0 + 3];\n\n\t\tconst x1 = src1[srcOffset1];\n\t\tconst y1 = src1[srcOffset1 + 1];\n\t\tconst z1 = src1[srcOffset1 + 2];\n\t\tconst w1 = src1[srcOffset1 + 3];\n\n\t\tdst[dstOffset] = x0 * w1 + w0 * x1 + y0 * z1 - z0 * y1;\n\t\tdst[dstOffset + 1] = y0 * w1 + w0 * y1 + z0 * x1 - x0 * z1;\n\t\tdst[dstOffset + 2] = z0 * w1 + w0 * z1 + x0 * y1 - y0 * x1;\n\t\tdst[dstOffset + 3] = w0 * w1 - x0 * x1 - y0 * y1 - z0 * z1;\n\n\t\treturn dst;\n\t}\n\n\t/**\n\t * The x value of this quaternion.\n\t * @type {number}\n\t * @default 0\n\t */\n\tget x() {\n\t\treturn this._x;\n\t}\n\n\tset x(value) {\n\t\tthis._x = value;\n\t\tthis.onChangeCallback();\n\t}\n\n\t/**\n\t * The y value of this quaternion.\n\t * @type {number}\n\t * @default 0\n\t */\n\tget y() {\n\t\treturn this._y;\n\t}\n\n\tset y(value) {\n\t\tthis._y = value;\n\t\tthis.onChangeCallback();\n\t}\n\n\t/**\n\t * The z value of this quaternion.\n\t * @type {number}\n\t * @default 0\n\t */\n\tget z() {\n\t\treturn this._z;\n\t}\n\n\tset z(value) {\n\t\tthis._z = value;\n\t\tthis.onChangeCallback();\n\t}\n\n\t/**\n\t * The w value of this quaternion.\n\t * @type {number}\n\t * @default 1\n\t */\n\tget w() {\n\t\treturn this._w;\n\t}\n\n\tset w(value) {\n\t\tthis._w = value;\n\t\tthis.onChangeCallback();\n\t}\n\n\t/**\n\t * Sets the quaternion components.\n\t * @param {number} x - The x value of this quaternion.\n\t * @param {number} y - The y value of this quaternion.\n\t * @param {number} z - The z value of this quaternion.\n\t * @param {number} w - The w value of this quaternion.\n\t * @returns {Quaternion} A reference to this quaternion.\n\t */\n\tset(x, y, z, w) {\n\t\tthis._x = x;\n\t\tthis._y = y;\n\t\tthis._z = z;\n\t\tthis._w = w;\n\n\t\tthis.onChangeCallback();\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Returns a new quaternion with copied values from this instance.\n\t * @returns {Quaternion} A clone of this instance.\n\t */\n\tclone() {\n\t\treturn new Quaternion(this._x, this._y, this._z, this._w);\n\t}\n\n\t/**\n\t * Copies the values of the given quaternion to this instance.\n\t * @param {Quaternion} quaternion - The quaternion to copy.\n\t * @returns {Quaternion} A reference to this quaternion.\n\t */\n\tcopy(quaternion) {\n\t\tthis._x = quaternion.x;\n\t\tthis._y = quaternion.y;\n\t\tthis._z = quaternion.z;\n\t\tthis._w = quaternion.w;\n\n\t\tthis.onChangeCallback();\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets this quaternion from the rotation specified by the given\n\t * Euler angles.\n\t * @param {Euler} euler - The Euler angles.\n\t * @param {boolean} [update=true] - Whether the internal `onChange` callback should be executed or not.\n\t * @returns {Quaternion} A reference to this quaternion.\n\t */\n\tsetFromEuler(euler, update = true) {\n\t\tconst c1 = Math.cos(euler._x / 2);\n\t\tconst c2 = Math.cos(euler._y / 2);\n\t\tconst c3 = Math.cos(euler._z / 2);\n\t\tconst s1 = Math.sin(euler._x / 2);\n\t\tconst s2 = Math.sin(euler._y / 2);\n\t\tconst s3 = Math.sin(euler._z / 2);\n\n\t\tconst order = euler._order;\n\n\t\tif (order === 'XYZ') {\n\t\t\tthis._x = s1 * c2 * c3 + c1 * s2 * s3;\n\t\t\tthis._y = c1 * s2 * c3 - s1 * c2 * s3;\n\t\t\tthis._z = c1 * c2 * s3 + s1 * s2 * c3;\n\t\t\tthis._w = c1 * c2 * c3 - s1 * s2 * s3;\n\t\t} else if (order === 'YXZ') {\n\t\t\tthis._x = s1 * c2 * c3 + c1 * s2 * s3;\n\t\t\tthis._y = c1 * s2 * c3 - s1 * c2 * s3;\n\t\t\tthis._z = c1 * c2 * s3 - s1 * s2 * c3;\n\t\t\tthis._w = c1 * c2 * c3 + s1 * s2 * s3;\n\t\t} else if (order === 'ZXY') {\n\t\t\tthis._x = s1 * c2 * c3 - c1 * s2 * s3;\n\t\t\tthis._y = c1 * s2 * c3 + s1 * c2 * s3;\n\t\t\tthis._z = c1 * c2 * s3 + s1 * s2 * c3;\n\t\t\tthis._w = c1 * c2 * c3 - s1 * s2 * s3;\n\t\t} else if (order === 'ZYX') {\n\t\t\tthis._x = s1 * c2 * c3 - c1 * s2 * s3;\n\t\t\tthis._y = c1 * s2 * c3 + s1 * c2 * s3;\n\t\t\tthis._z = c1 * c2 * s3 - s1 * s2 * c3;\n\t\t\tthis._w = c1 * c2 * c3 + s1 * s2 * s3;\n\t\t} else if (order === 'YZX') {\n\t\t\tthis._x = s1 * c2 * c3 + c1 * s2 * s3;\n\t\t\tthis._y = c1 * s2 * c3 + s1 * c2 * s3;\n\t\t\tthis._z = c1 * c2 * s3 - s1 * s2 * c3;\n\t\t\tthis._w = c1 * c2 * c3 - s1 * s2 * s3;\n\t\t} else if (order === 'XZY') {\n\t\t\tthis._x = s1 * c2 * c3 - c1 * s2 * s3;\n\t\t\tthis._y = c1 * s2 * c3 - s1 * c2 * s3;\n\t\t\tthis._z = c1 * c2 * s3 + s1 * s2 * c3;\n\t\t\tthis._w = c1 * c2 * c3 + s1 * s2 * s3;\n\t\t}\n\n\t\tif (update === true) this.onChangeCallback();\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets this quaternion from the given axis and angle.\n\t * @param {Vector3} axis - The normalized axis.\n\t * @param {number} angle - The angle in radians.\n\t * @returns {Quaternion} A reference to this quaternion.\n\t */\n\tsetFromAxisAngle(axis, angle) {\n\t\t// http://www.euclideanspace.com/maths/geometry/rotations/conversions/angleToQuaternion/index.htm\n\n\t\tconst halfAngle = angle / 2, s = Math.sin(halfAngle);\n\n\t\tthis._x = axis.x * s;\n\t\tthis._y = axis.y * s;\n\t\tthis._z = axis.z * s;\n\t\tthis._w = Math.cos(halfAngle);\n\n\t\tthis.onChangeCallback();\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets this quaternion from the given rotation matrix.\n\t * @param {Matrix4} m - A 4x4 matrix of which the upper 3x3 of matrix is a pure rotation matrix (i.e. unscaled).\n\t * @returns {Quaternion} A reference to this quaternion.\n\t */\n\tsetFromRotationMatrix(m) {\n\t\t// http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToQuaternion/index.htm\n\n\t\t// assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)\n\n\t\tconst te = m.elements,\n\n\t\t\tm11 = te[0], m12 = te[4], m13 = te[8],\n\t\t\tm21 = te[1], m22 = te[5], m23 = te[9],\n\t\t\tm31 = te[2], m32 = te[6], m33 = te[10],\n\n\t\t\ttrace = m11 + m22 + m33;\n\n\t\tlet\ts;\n\n\t\tif (trace > 0) {\n\t\t\ts = 0.5 / Math.sqrt(trace + 1.0);\n\n\t\t\tthis._w = 0.25 / s;\n\t\t\tthis._x = (m32 - m23) * s;\n\t\t\tthis._y = (m13 - m31) * s;\n\t\t\tthis._z = (m21 - m12) * s;\n\t\t} else if (m11 > m22 && m11 > m33) {\n\t\t\ts = 2.0 * Math.sqrt(1.0 + m11 - m22 - m33);\n\n\t\t\tthis._w = (m32 - m23) / s;\n\t\t\tthis._x = 0.25 * s;\n\t\t\tthis._y = (m12 + m21) / s;\n\t\t\tthis._z = (m13 + m31) / s;\n\t\t} else if (m22 > m33) {\n\t\t\ts = 2.0 * Math.sqrt(1.0 + m22 - m11 - m33);\n\n\t\t\tthis._w = (m13 - m31) / s;\n\t\t\tthis._x = (m12 + m21) / s;\n\t\t\tthis._y = 0.25 * s;\n\t\t\tthis._z = (m23 + m32) / s;\n\t\t} else {\n\t\t\ts = 2.0 * Math.sqrt(1.0 + m33 - m11 - m22);\n\n\t\t\tthis._w = (m21 - m12) / s;\n\t\t\tthis._x = (m13 + m31) / s;\n\t\t\tthis._y = (m23 + m32) / s;\n\t\t\tthis._z = 0.25 * s;\n\t\t}\n\n\t\tthis.onChangeCallback();\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets this quaternion to the rotation required to rotate the direction vector\n\t * `vFrom` to the direction vector `vTo`.\n\t * @param {Vector3} vFrom - The first (normalized) direction vector.\n\t * @param {Vector3} vTo - The second (normalized) direction vector.\n\t * @returns {Quaternion} A reference to this quaternion.\n\t */\n\tsetFromUnitVectors(vFrom, vTo) {\n\t\t// assumes direction vectors vFrom and vTo are normalized\n\n\t\tlet r = vFrom.dot(vTo) + 1;\n\n\t\tif (r < 1e-8) {\n\t\t\t// vFrom and vTo point in opposite directions\n\n\t\t\tr = 0;\n\n\t\t\tif (Math.abs(vFrom.x) > Math.abs(vFrom.z)) {\n\t\t\t\tthis._x = -vFrom.y;\n\t\t\t\tthis._y = vFrom.x;\n\t\t\t\tthis._z = 0;\n\t\t\t\tthis._w = r;\n\t\t\t} else {\n\t\t\t\tthis._x = 0;\n\t\t\t\tthis._y = -vFrom.z;\n\t\t\t\tthis._z = vFrom.y;\n\t\t\t\tthis._w = r;\n\t\t\t}\n\t\t} else {\n\t\t\t// crossVectors(vFrom, vTo); // inlined to avoid cyclic dependency on Vector3\n\n\t\t\tthis._x = vFrom.y * vTo.z - vFrom.z * vTo.y;\n\t\t\tthis._y = vFrom.z * vTo.x - vFrom.x * vTo.z;\n\t\t\tthis._z = vFrom.x * vTo.y - vFrom.y * vTo.x;\n\t\t\tthis._w = r;\n\t\t}\n\n\t\treturn this.normalize();\n\t}\n\n\t/**\n\t * Returns the angle between this quaternion and the given one in radians.\n\t * @param {Quaternion} q - The quaternion to compute the angle with.\n\t * @returns {number} The angle in radians.\n\t */\n\tangleTo(q) {\n\t\treturn 2 * Math.acos(Math.abs(MathUtils.clamp(this.dot(q), -1, 1)));\n\t}\n\n\t/**\n\t * Sets this quaternion to the identity quaternion; that is, to the\n\t * quaternion that represents \"no rotation\".\n\t * @returns {Quaternion} A reference to this quaternion.\n\t */\n\tidentity() {\n\t\treturn this.set(0, 0, 0, 1);\n\t}\n\n\t/**\n\t * Returns the rotational conjugate of this quaternion. The conjugate of a\n\t * quaternion represents the same rotation in the opposite direction about\n\t * the rotational axis.\n\t * @returns {Quaternion} A reference to this quaternion.\n\t */\n\tconjugate() {\n\t\tthis._x *= -1;\n\t\tthis._y *= -1;\n\t\tthis._z *= -1;\n\n\t\tthis.onChangeCallback();\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Calculates the dot product of this quaternion and the given one.\n\t * @param {Quaternion} v - The quaternion to compute the dot product with.\n\t * @returns {number} The result of the dot product.\n\t */\n\tdot(v) {\n\t\treturn this._x * v._x + this._y * v._y + this._z * v._z + this._w * v._w;\n\t}\n\n\t/**\n\t * Computes the squared Euclidean length (straight-line length) of this quaternion,\n\t * considered as a 4 dimensional vector. This can be useful if you are comparing the\n\t * lengths of two quaternions, as this is a slightly more efficient calculation than\n\t * {@link Quaternion#length}.\n\t * @returns {number} The squared Euclidean length.\n\t */\n\tlengthSq() {\n\t\treturn this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w;\n\t}\n\n\t/**\n\t * Computes the Euclidean length (straight-line length) of this quaternion,\n\t * considered as a 4 dimensional vector.\n\t * @returns {number} The Euclidean length.\n\t */\n\tlength() {\n\t\treturn Math.sqrt(this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w);\n\t}\n\n\t/**\n\t * Normalizes this quaternion - that is, calculated the quaternion that performs\n\t * the same rotation as this one, but has a length equal to `1`.\n\t * @returns {Quaternion} A reference to this quaternion.\n\t */\n\tnormalize() {\n\t\tlet l = this.length();\n\n\t\tif (l === 0) {\n\t\t\tthis._x = 0;\n\t\t\tthis._y = 0;\n\t\t\tthis._z = 0;\n\t\t\tthis._w = 1;\n\t\t} else {\n\t\t\tl = 1 / l;\n\n\t\t\tthis._x = this._x * l;\n\t\t\tthis._y = this._y * l;\n\t\t\tthis._z = this._z * l;\n\t\t\tthis._w = this._w * l;\n\t\t}\n\n\t\tthis.onChangeCallback();\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Multiplies this quaternion by the given one.\n\t * @param {Quaternion} q - The quaternion.\n\t * @returns {Quaternion} A reference to this quaternion.\n\t */\n\tmultiply(q) {\n\t\treturn this.multiplyQuaternions(this, q);\n\t}\n\n\t/**\n\t * Pre-multiplies this quaternion by the given one.\n\t * @param {Quaternion} q - The quaternion.\n\t * @returns {Quaternion} A reference to this quaternion.\n\t */\n\tpremultiply(q) {\n\t\treturn this.multiplyQuaternions(q, this);\n\t}\n\n\t/**\n\t * Multiplies the given quaternions and stores the result in this instance.\n\t * @param {Quaternion} a - The first quaternion.\n\t * @param {Quaternion} b - The second quaternion.\n\t * @returns {Quaternion} A reference to this quaternion.\n\t */\n\tmultiplyQuaternions(a, b) {\n\t\t// from http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/code/index.htm\n\n\t\tconst qax = a._x, qay = a._y, qaz = a._z, qaw = a._w;\n\t\tconst qbx = b._x, qby = b._y, qbz = b._z, qbw = b._w;\n\n\t\tthis._x = qax * qbw + qaw * qbx + qay * qbz - qaz * qby;\n\t\tthis._y = qay * qbw + qaw * qby + qaz * qbx - qax * qbz;\n\t\tthis._z = qaz * qbw + qaw * qbz + qax * qby - qay * qbx;\n\t\tthis._w = qaw * qbw - qax * qbx - qay * qby - qaz * qbz;\n\n\t\tthis.onChangeCallback();\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Linearly interpolates between two quaternions.\n\t * @param {Quaternion} q1\n\t * @param {Quaternion} q2\n\t * @param {number} ratio\n\t * @returns {Quaternion}\n\t */\n\tlerpQuaternions(q1, q2, ratio) {\n\t\tif (ratio === 0) return this.copy(q1);\n\t\tif (ratio === 1) return this.copy(q2);\n\n\t\tconst w1 = q1._w, x1 = q1._x, y1 = q1._y, z1 = q1._z;\n\t\tlet w2 = q2._w, x2 = q2._x, y2 = q2._y, z2 = q2._z;\n\n\t\tconst dot = w1 * w2 + x1 * x2 + y1 * y2 + z1 * z2;\n\n\t\t// shortest direction\n\t\tif (dot < 0) {\n\t\t\tw2 = -w2;\n\t\t\tx2 = -x2;\n\t\t\ty2 = -y2;\n\t\t\tz2 = -z2;\n\t\t}\n\n\t\tthis._w = w1 + ratio * (w2 - w1);\n\t\tthis._x = x1 + ratio * (x2 - x1);\n\t\tthis._y = y1 + ratio * (y2 - y1);\n\t\tthis._z = z1 + ratio * (z2 - z1);\n\n\t\tconst len = 1.0 / Math.sqrt(this._w * this._w + this._x * this._x + this._y * this._y + this._z * this._z);\n\n\t\tthis._w *= len;\n\t\tthis._x *= len;\n\t\tthis._y *= len;\n\t\tthis._z *= len;\n\n\t\tthis.onChangeCallback();\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Performs a spherical linear interpolation between quaternions.\n\t * @param {Quaternion} qb - The target quaternion.\n\t * @param {number} t - The interpolation factor in the closed interval `[0, 1]`.\n\t * @returns {Quaternion} A reference to this quaternion.\n\t */\n\tslerp(qb, t) {\n\t\tif (t <= 0) return this;\n\n\t\tif (t >= 1) return this.copy(qb); // copy calls onChangeCallback()\n\n\t\tlet x = qb._x, y = qb._y, z = qb._z, w = qb._w;\n\n\t\tlet dot = this.dot(qb);\n\n\t\tif (dot < 0) {\n\t\t\tx = -x;\n\t\t\ty = -y;\n\t\t\tz = -z;\n\t\t\tw = -w;\n\n\t\t\tdot = -dot;\n\t\t}\n\n\t\tlet s = 1 - t;\n\n\t\tif (dot < 0.9995) {\n\t\t\t// slerp\n\n\t\t\tconst theta = Math.acos(dot);\n\t\t\tconst sin = Math.sin(theta);\n\n\t\t\ts = Math.sin(s * theta) / sin;\n\t\t\tt = Math.sin(t * theta) / sin;\n\n\t\t\tthis._x = this._x * s + x * t;\n\t\t\tthis._y = this._y * s + y * t;\n\t\t\tthis._z = this._z * s + z * t;\n\t\t\tthis._w = this._w * s + w * t;\n\n\t\t\tthis.onChangeCallback();\n\t\t} else {\n\t\t\t// for small angles, lerp then normalize\n\n\t\t\tthis._x = this._x * s + x * t;\n\t\t\tthis._y = this._y * s + y * t;\n\t\t\tthis._z = this._z * s + z * t;\n\t\t\tthis._w = this._w * s + w * t;\n\n\t\t\tthis.normalize(); // normalize calls onChangeCallback()\n\t\t}\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Performs a spherical linear interpolation between the given quaternions\n\t * and stores the result in this quaternion.\n\t * @param {Quaternion} qa - The source quaternion.\n\t * @param {Quaternion} qb - The target quaternion.\n\t * @param {number} t - The interpolation factor in the closed interval `[0, 1]`.\n\t * @returns {Quaternion} A reference to this quaternion.\n\t */\n\tslerpQuaternions(qa, qb, t) {\n\t\treturn this.copy(qa).slerp(qb, t);\n\t}\n\n\t/**\n\t * Returns `true` if this quaternion is equal with the given one.\n\t * @param {Quaternion} quaternion - The quaternion to test for equality.\n\t * @returns {boolean} Whether this quaternion is equal with the given one.\n\t */\n\tequals(quaternion) {\n\t\treturn (quaternion._x === this._x) && (quaternion._y === this._y) && (quaternion._z === this._z) && (quaternion._w === this._w);\n\t}\n\n\t/**\n\t * Sets this quaternion's components from the given array.\n\t * @param {Array<number>} array - An array holding the quaternion component values.\n\t * @param {number} [offset=0] - The offset into the array.\n\t * @param {boolean} [denormalize=false] - If true, denormalize the values, and array should be a typed array.\n\t * @returns {Quaternion} A reference to this quaternion.\n\t */\n\tfromArray(array, offset = 0, denormalize = false) {\n\t\tlet x = array[offset], y = array[offset + 1],\n\t\t\tz = array[offset + 2], w = array[offset + 3];\n\n\t\tif (denormalize) {\n\t\t\tx = MathUtils.denormalize(x, array);\n\t\t\ty = MathUtils.denormalize(y, array);\n\t\t\tz = MathUtils.denormalize(z, array);\n\t\t\tw = MathUtils.denormalize(w, array);\n\t\t}\n\n\t\tthis._x = x;\n\t\tthis._y = y;\n\t\tthis._z = z;\n\t\tthis._w = w;\n\n\t\tthis.onChangeCallback();\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Writes the components of this quaternion to the given array. If no array is provided,\n\t * the method returns a new instance.\n\t * @param {Array<number>} [array=[]] - The target array holding the quaternion components.\n\t * @param {number} [offset=0] - Index of the first element in the array.\n\t * @param {boolean} [normalize=false] - If true, normalize the values, and array should be a typed array.\n\t * @returns {Quaternion} The quaternion components.\n\t */\n\ttoArray(array = [], offset = 0, normalize = false) {\n\t\tlet x = this._x, y = this._y,\n\t\t\tz = this._z, w = this._w;\n\n\t\tif (normalize) {\n\t\t\tx = MathUtils.normalize(x, array);\n\t\t\ty = MathUtils.normalize(y, array);\n\t\t\tz = MathUtils.normalize(z, array);\n\t\t\tw = MathUtils.normalize(w, array);\n\t\t}\n\n\t\tarray[offset] = x;\n\t\tarray[offset + 1] = y;\n\t\tarray[offset + 2] = z;\n\t\tarray[offset + 3] = w;\n\n\t\treturn array;\n\t}\n\n\t/**\n\t * Convert the current quaternion to a matrix4.\n\t * @param {Matrix4} target - The target matrix to write the quaternion data to.\n\t * @returns {Matrix4} The target matrix with the quaternion data written to it.\n\t */\n\ttoMatrix4(target = new Matrix4()) {\n\t\tconst ele = target.elements;\n\n\t\tconst xy2 = 2.0 * this._x * this._y, xz2 = 2.0 * this._x * this._z, xw2 = 2.0 * this._x * this._w;\n\t\tconst yz2 = 2.0 * this._y * this._z, yw2 = 2.0 * this._y * this._w, zw2 = 2.0 * this._z * this._w;\n\t\tconst xx = this._x * this._x, yy = this._y * this._y, zz = this._z * this._z, ww = this._w * this._w;\n\n\t\tele[0] = xx - yy - zz + ww;\n\t\tele[4] = xy2 - zw2;\n\t\tele[8] = xz2 + yw2;\n\t\tele[12] = 0;\n\t\tele[1] = xy2 + zw2;\n\t\tele[5] = -xx + yy - zz + ww;\n\t\tele[9] = yz2 - xw2;\n\t\tele[13] = 0;\n\t\tele[2] = xz2 - yw2;\n\t\tele[6] = yz2 + xw2;\n\t\tele[10] = -xx - yy + zz + ww;\n\t\tele[14] = 0;\n\t\tele[3] = 0.0;\n\t\tele[7] = 0.0;\n\t\tele[11] = 0;\n\t\tele[15] = 1;\n\n\t\treturn target;\n\t}\n\n\t/**\n\t * Registers a callback that is called whenever the quaternion's\n\t * angle value changes.\n\t * @param {Function} callback - When the Quaternion angle value changes, the callback method is triggered\n\t * @returns {Quaternion} A reference to this quaternion.\n\t */\n\tonChange(callback) {\n\t\tthis.onChangeCallback = callback;\n\t\treturn this;\n\t}\n\n\tonChangeCallback() {}\n\n\t* [Symbol.iterator]() {\n\t\tyield this._x;\n\t\tyield this._y;\n\t\tyield this._z;\n\t\tyield this._w;\n\t}\n\n}\n\n/**\n * This flag can be used for type testing.\n * @readonly\n * @type {boolean}\n * @default true\n */\nQuaternion.prototype.isQuaternion = true;\n\nexport { Quaternion };"
  },
  {
    "path": "src/math/Ray.js",
    "content": "import { Vector3 } from './Vector3.js';\n\nconst _vec3_1 = new Vector3();\n\nconst _diff = new Vector3();\nconst _edge1 = new Vector3();\nconst _edge2 = new Vector3();\nconst _normal = new Vector3();\n\n/**\n * A ray that emits from an origin in a certain direction. This is used by\n * {@link Raycaster} to assist with raycasting. Raycasting is used for\n * mouse picking (working out what objects in the 3D space the mouse is over)\n * amongst other things.\n */\nclass Ray {\n\n\t/**\n\t * Constructs a new ray.\n\t * @param {Vector3} [origin=(0,0,0)] - The origin of the ray.\n\t * @param {Vector3} [direction=(0,0,-1)] - The (normalized) direction of the ray.\n\t */\n\tconstructor(origin = new Vector3(), direction = new Vector3(0, 0, -1)) {\n\t\t/**\n\t\t * The origin of the ray.\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.origin = origin;\n\n\t\t/**\n\t\t * The (normalized) direction of the ray.\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.direction = direction;\n\t}\n\n\t/**\n\t * Sets the ray's components by copying the given values.\n\t * @param {Vector3} origin - The origin.\n\t * @param {Vector3} direction - The direction.\n\t * @returns {Ray} A reference to this ray.\n\t */\n\tset(origin, direction) {\n\t\tthis.origin.copy(origin);\n\t\tthis.direction.copy(direction);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Copies the values of the given ray to this instance.\n\t * @param {Ray} ray - The ray to copy.\n\t * @returns {Ray} A reference to this ray.\n\t */\n\tcopy(ray) {\n\t\tthis.origin.copy(ray.origin);\n\t\tthis.direction.copy(ray.direction);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Returns a vector that is located at a given distance along this ray.\n\t * @param {number} t - The distance along the ray to retrieve a position for.\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @returns {Vector3} A position on the ray.\n\t */\n\tat(t, target = new Vector3()) {\n\t\treturn target.copy(this.origin).addScaledVector(this.direction, t);\n\t}\n\n\t/**\n\t * Shift the origin of this ray along its direction by the given distance.\n\t * @param {number} t - The distance along the ray to interpolate.\n\t * @returns {Ray} A reference to this ray.\n\t */\n\trecast(t) {\n\t\tthis.origin.copy(this.at(t, _vec3_1));\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Returns the point along this ray that is closest to the given point.\n\t * @param {Vector3} point - A point in 3D space to get the closet location on the ray for.\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @returns {Vector3} The closest point on this ray.\n\t */\n\tclosestPointToPoint(point, target) {\n\t\ttarget.subVectors(point, this.origin);\n\n\t\tconst directionDistance = target.dot(this.direction);\n\n\t\tif (directionDistance < 0) {\n\t\t\treturn target.copy(this.origin);\n\t\t}\n\n\t\treturn target.copy(this.origin).addScaledVector(this.direction, directionDistance);\n\t}\n\n\t/**\n\t * Returns the distance of the closest approach between this ray and the given point.\n\t * @param {Vector3} point - A point in 3D space to compute the distance to.\n\t * @returns {number} The distance.\n\t */\n\tdistanceToPoint(point) {\n\t\treturn Math.sqrt(this.distanceSqToPoint(point));\n\t}\n\n\t/**\n\t * Returns the squared distance of the closest approach between this ray and the given point.\n\t * @param {Vector3} point - A point in 3D space to compute the distance to.\n\t * @returns {number} The squared distance.\n\t */\n\tdistanceSqToPoint(point) {\n\t\tconst directionDistance = _vec3_1.subVectors(point, this.origin).dot(this.direction);\n\n\t\tif (directionDistance < 0) {\n\t\t\treturn this.origin.distanceToSquared(point);\n\t\t}\n\n\t\t_vec3_1.copy(this.direction).multiplyScalar(directionDistance).add(this.origin);\n\n\t\treturn _vec3_1.distanceToSquared(point);\n\t}\n\n\t/**\n\t * Intersects this ray with the given sphere, returning the intersection\n\t * point or `null` if there is no intersection.\n\t * @param {Sphere} sphere - The sphere to intersect.\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @returns {?Vector3} The intersection point.\n\t */\n\tintersectSphere(sphere, target) {\n\t\t_vec3_1.subVectors(sphere.center, this.origin);\n\t\tconst tca = _vec3_1.dot(this.direction);\n\t\tconst d2 = _vec3_1.dot(_vec3_1) - tca * tca;\n\t\tconst radius2 = sphere.radius * sphere.radius;\n\n\t\tif (d2 > radius2) {\n\t\t\treturn null;\n\t\t}\n\n\t\tconst thc = Math.sqrt(radius2 - d2);\n\n\t\t// t0 = first intersect point - entrance on front of sphere\n\t\tconst t0 = tca - thc;\n\n\t\t// t1 = second intersect point - exit point on back of sphere\n\t\tconst t1 = tca + thc;\n\n\t\t// test to see if both t0 and t1 are behind the ray - if so, return null\n\t\tif (t0 < 0 && t1 < 0) {\n\t\t\treturn null;\n\t\t}\n\n\t\t// test to see if t0 is behind the ray:\n\t\t// if it is, the ray is inside the sphere, so return the second exit point scaled by t1,\n\t\t// in order to always return an intersect point that is in front of the ray.\n\t\tif (t0 < 0) {\n\t\t\treturn this.at(t1, target);\n\t\t}\n\n\t\t// else t0 is in front of the ray, so return the first collision point scaled by t0\n\t\treturn this.at(t0, target);\n\t}\n\n\t/**\n\t * Returns `true` if this ray intersects with the given sphere.\n\t * @param {Sphere} sphere - The sphere to intersect.\n\t * @returns {boolean} Whether this ray intersects with the given sphere or not.\n\t */\n\tintersectsSphere(sphere) {\n\t\tif (sphere.radius < 0) return false; // handle empty spheres\n\t\treturn this.distanceSqToPoint(sphere.center) <= (sphere.radius * sphere.radius);\n\t}\n\n\t/**\n\t * Computes the distance from the ray's origin to the given plane. Returns `null` if the ray\n\t * does not intersect with the plane.\n\t * @param {Plane} plane - The plane to compute the distance to.\n\t * @returns {?number} Whether this ray intersects with the given sphere or not.\n\t */\n\tdistanceToPlane(plane) {\n\t\tconst denominator = plane.normal.dot(this.direction);\n\n\t\tif (denominator === 0) {\n\t\t\t// line is coplanar, return origin\n\t\t\tif (plane.distanceToPoint(this.origin) === 0) {\n\t\t\t\treturn 0;\n\t\t\t}\n\n\t\t\t// Null is preferable to undefined since undefined means.... it is undefined\n\t\t\treturn null;\n\t\t}\n\n\t\tconst t = -(this.origin.dot(plane.normal) + plane.constant) / denominator;\n\n\t\t// Return if the ray never intersects the plane\n\t\treturn t >= 0 ? t : null;\n\t}\n\n\t/**\n\t * Intersects this ray with the given plane, returning the intersection\n\t * point or `null` if there is no intersection.\n\t * @param {Plane} plane - The plane to intersect.\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @returns {?Vector3} The intersection point.\n\t */\n\tintersectPlane(plane, target) {\n\t\tconst t = this.distanceToPlane(plane);\n\n\t\tif (t === null) {\n\t\t\treturn null;\n\t\t}\n\n\t\treturn this.at(t, target);\n\t}\n\n\t/**\n\t * Returns `true` if this ray intersects with the given plane.\n\t * @param {Plane} plane - The plane to intersect.\n\t * @returns {boolean} Whether this ray intersects with the given plane or not.\n\t */\n\tintersectsPlane(plane) {\n\t\t// check if the ray lies on the plane first\n\t\tconst distToPoint = plane.distanceToPoint(this.origin);\n\n\t\tif (distToPoint === 0) {\n\t\t\treturn true;\n\t\t}\n\n\t\tconst denominator = plane.normal.dot(this.direction);\n\n\t\tif (denominator * distToPoint < 0) {\n\t\t\treturn true;\n\t\t}\n\n\t\t// ray origin is behind the plane (and is pointing behind it)\n\t\treturn false;\n\t}\n\n\t/**\n\t * Intersects this ray with the given bounding box, returning the intersection\n\t * point or `null` if there is no intersection.\n\t * @param {Box3} box - The box to intersect.\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @returns {?Vector3} The intersection point.\n\t */\n\tintersectBox(box, target) {\n\t\tlet tmin, tmax, tymin, tymax, tzmin, tzmax;\n\n\t\tconst invdirx = 1 / this.direction.x,\n\t\t\tinvdiry = 1 / this.direction.y,\n\t\t\tinvdirz = 1 / this.direction.z;\n\n\t\tconst origin = this.origin;\n\n\t\tif (invdirx >= 0) {\n\t\t\ttmin = (box.min.x - origin.x) * invdirx;\n\t\t\ttmax = (box.max.x - origin.x) * invdirx;\n\t\t} else {\n\t\t\ttmin = (box.max.x - origin.x) * invdirx;\n\t\t\ttmax = (box.min.x - origin.x) * invdirx;\n\t\t}\n\n\t\tif (invdiry >= 0) {\n\t\t\ttymin = (box.min.y - origin.y) * invdiry;\n\t\t\ttymax = (box.max.y - origin.y) * invdiry;\n\t\t} else {\n\t\t\ttymin = (box.max.y - origin.y) * invdiry;\n\t\t\ttymax = (box.min.y - origin.y) * invdiry;\n\t\t}\n\n\t\tif ((tmin > tymax) || (tymin > tmax)) return null;\n\n\t\t// These lines also handle the case where tmin or tmax is NaN\n\t\t// (result of 0 * Infinity). x !== x returns true if x is NaN\n\n\t\tif (tymin > tmin || tmin !== tmin) tmin = tymin;\n\n\t\tif (tymax < tmax || tmax !== tmax) tmax = tymax;\n\n\t\tif (invdirz >= 0) {\n\t\t\ttzmin = (box.min.z - origin.z) * invdirz;\n\t\t\ttzmax = (box.max.z - origin.z) * invdirz;\n\t\t} else {\n\t\t\ttzmin = (box.max.z - origin.z) * invdirz;\n\t\t\ttzmax = (box.min.z - origin.z) * invdirz;\n\t\t}\n\n\t\tif ((tmin > tzmax) || (tzmin > tmax)) return null;\n\n\t\tif (tzmin > tmin || tmin !== tmin) tmin = tzmin;\n\n\t\tif (tzmax < tmax || tmax !== tmax) tmax = tzmax;\n\n\t\t// return point closest to the ray (positive side)\n\n\t\tif (tmax < 0) return null;\n\n\t\treturn this.at(tmin >= 0 ? tmin : tmax, target);\n\t}\n\n\t/**\n\t * Returns `true` if this ray intersects with the given box.\n\t * @param {Box3} box - The box to intersect.\n\t * @returns {boolean} Whether this ray intersects with the given box or not.\n\t */\n\tintersectsBox(box) {\n\t\treturn this.intersectBox(box, _vec3_1) !== null;\n\t}\n\n\t/**\n\t * Intersects this ray with the given triangle, returning the intersection\n\t * point or `null` if there is no intersection.\n\t * @param {Vector3} a - The first vertex of the triangle.\n\t * @param {Vector3} b - The second vertex of the triangle.\n\t * @param {Vector3} c - The third vertex of the triangle.\n\t * @param {boolean} backfaceCulling - Whether to use backface culling or not.\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @returns {?Vector3} The intersection point.\n\t */\n\tintersectTriangle(a, b, c, backfaceCulling, target) {\n\t\t// Compute the offset origin, edges, and normal.\n\n\t\t// from https://github.com/pmjoniak/GeometricTools/blob/master/GTEngine/Include/Mathematics/GteIntrRay3Triangle3.h\n\n\t\t_edge1.subVectors(b, a);\n\t\t_edge2.subVectors(c, a);\n\t\t_normal.crossVectors(_edge1, _edge2);\n\n\t\t// Solve Q + t*D = b1*E1 + b2*E2 (Q = kDiff, D = ray direction,\n\t\t// E1 = kEdge1, E2 = kEdge2, N = Cross(E1,E2)) by\n\t\t//   |Dot(D,N)|*b1 = sign(Dot(D,N))*Dot(D,Cross(Q,E2))\n\t\t//   |Dot(D,N)|*b2 = sign(Dot(D,N))*Dot(D,Cross(E1,Q))\n\t\t//   |Dot(D,N)|*t = -sign(Dot(D,N))*Dot(Q,N)\n\t\tlet DdN = this.direction.dot(_normal);\n\t\tlet sign;\n\n\t\tif (DdN > 0) {\n\t\t\tif (backfaceCulling) return null;\n\t\t\tsign = 1;\n\t\t} else if (DdN < 0) {\n\t\t\tsign = -1;\n\t\t\tDdN = -DdN;\n\t\t} else {\n\t\t\treturn null;\n\t\t}\n\n\t\t_diff.subVectors(this.origin, a);\n\t\tconst DdQxE2 = sign * this.direction.dot(_edge2.crossVectors(_diff, _edge2));\n\n\t\t// b1 < 0, no intersection\n\t\tif (DdQxE2 < 0) {\n\t\t\treturn null;\n\t\t}\n\n\t\tconst DdE1xQ = sign * this.direction.dot(_edge1.cross(_diff));\n\n\t\t// b2 < 0, no intersection\n\t\tif (DdE1xQ < 0) {\n\t\t\treturn null;\n\t\t}\n\n\t\t// b1+b2 > 1, no intersection\n\t\tif (DdQxE2 + DdE1xQ > DdN) {\n\t\t\treturn null;\n\t\t}\n\n\t\t// Line intersects triangle, check if ray does.\n\t\tconst QdN = -sign * _diff.dot(_normal);\n\n\t\t// t < 0, no intersection\n\t\tif (QdN < 0) {\n\t\t\treturn null;\n\t\t}\n\n\t\t// Ray intersects triangle.\n\t\treturn this.at(QdN / DdN, target);\n\t}\n\n\t/**\n\t * Transforms this ray with the given 4x4 transformation matrix.\n\t * @param {Matrix4} matrix4 - The transformation matrix.\n\t * @returns {Ray} A reference to this ray.\n\t */\n\tapplyMatrix4(matrix4) {\n\t\tthis.origin.applyMatrix4(matrix4);\n\t\tthis.direction.transformDirection(matrix4);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Returns `true` if this ray is equal with the given one.\n\t * @param {Ray} ray - The ray to test for equality.\n\t * @returns {boolean} Whether this ray is equal with the given one.\n\t */\n\tequals(ray) {\n\t\treturn ray.origin.equals(this.origin) && ray.direction.equals(this.direction);\n\t}\n\n\t/**\n\t * Returns a new ray with copied values from this instance.\n\t * @returns {Ray} A clone of this instance.\n\t */\n\tclone() {\n\t\treturn new this.constructor().copy(this);\n\t}\n\n}\n\n/**\n * This flag can be used for type testing.\n * @readonly\n * @type {boolean}\n * @default true\n */\nRay.prototype.isRay = true;\n\nexport { Ray };"
  },
  {
    "path": "src/math/Sphere.js",
    "content": "import { Vector3 } from './Vector3.js';\nimport { Box3 } from './Box3.js';\n\nconst _box3_1 = new Box3();\nconst _vec3_1 = new Vector3();\nconst _vec3_2 = new Vector3();\n\n/**\n * A sphere defined by a center and radius.\n */\nclass Sphere {\n\n\t/**\n\t * @param {Vector3} [center=Vector3(0, 0, 0)] - center of the sphere.\n\t * @param {number} [radius=-1] - radius of the sphere.\n\t */\n\tconstructor(center = new Vector3(), radius = -1) {\n\t\tthis.center = center;\n\t\tthis.radius = radius;\n\t}\n\n\t/**\n\t * Sets the center and radius properties of this sphere.\n\t * @param {Vector3} center - center of the sphere.\n\t * @param {number} radius - radius of the sphere.\n\t * @returns {Sphere}\n\t */\n\tset(center, radius) {\n\t\tthis.center.copy(center);\n\t\tthis.radius = radius;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Computes the minimum bounding sphere for an array of points.\n\t * If optionalCenteris given, it is used as the sphere's center.\n\t * Otherwise, the center of the axis-aligned bounding box encompassing points is calculated.\n\t * @param {Vector3[]} points - an Array of Vector3 positions.\n\t * @param {Vector3} [optionalCenter] - the center of the sphere.\n\t * @returns {Sphere}\n\t */\n\tsetFromPoints(points, optionalCenter) {\n\t\tconst center = this.center;\n\n\t\tif (optionalCenter !== undefined) {\n\t\t\tcenter.copy(optionalCenter);\n\t\t} else {\n\t\t\t_box3_1.setFromPoints(points).getCenter(center);\n\t\t}\n\n\t\tlet maxRadiusSq = 0;\n\n\t\tfor (let i = 0, il = points.length; i < il; i++) {\n\t\t\tmaxRadiusSq = Math.max(maxRadiusSq, center.distanceToSquared(points[i]));\n\t\t}\n\n\t\tthis.radius = Math.sqrt(maxRadiusSq);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Computes the minimum bounding sphere for an array of points.\n\t * @param {number[]} array - An Array of position data that the resulting sphere will envelop.\n\t * @param {number} [gap=3] - The number of elements between the start of each position in the array.\n\t * @param {number} [offset=0] - The offset in each gap where the position data starts.\n\t * @param {boolean} [denormalize=false] - whether to denormalize the values in the array.\n\t * @returns {Sphere} A reference to this sphere.\n\t */\n\tsetFromArray(array, gap = 3, offset = 0, denormalize = false) {\n\t\tconst center = this.center;\n\n\t\t_box3_1.setFromArray(array, gap, offset, denormalize).getCenter(center);\n\n\t\tlet maxRadiusSq = 0;\n\t\tfor (let i = 0, l = array.length; i < l; i += gap) {\n\t\t\t_vec3_1.fromArray(array, i + offset, denormalize);\n\t\t\tmaxRadiusSq = Math.max(maxRadiusSq, center.distanceToSquared(_vec3_1));\n\t\t}\n\t\tthis.radius = Math.sqrt(maxRadiusSq);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Transforms this sphere with the provided Matrix4.\n\t * @param {Matrix4} matrix - the Matrix4 to apply\n\t * @returns {Matrix4}\n\t */\n\tapplyMatrix4(matrix) {\n\t\tthis.center.applyMatrix4(matrix);\n\t\tthis.radius = this.radius * matrix.getMaxScaleOnAxis();\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Returns aMinimum Bounding Box for the sphere.\n\t * @param {Box3} target — the result will be copied into this Box3.\n\t * @returns {Box3}\n\t */\n\tgetBoundingBox(target) {\n\t\tif (this.isEmpty()) {\n\t\t\t// Empty sphere produces empty bounding box\n\t\t\ttarget.makeEmpty();\n\t\t\treturn target;\n\t\t}\n\n\t\ttarget.set(this.center, this.center);\n\t\ttarget.expandByScalar(this.radius);\n\n\t\treturn target;\n\t}\n\n\t/**\n\t * Checks to see if the sphere is empty (the radius set to a negative number).\n\t * Spheres with a radius of 0 contain only their center point and are not considered to be empty.\n\t * @returns {boolean}\n\t */\n\tisEmpty() {\n\t\treturn this.radius < 0;\n\t}\n\n\t/**\n\t * Makes the sphere empty by setting center to (0, 0, 0) and radius to -1.\n\t * @returns {Sphere}\n\t */\n\tmakeEmpty() {\n\t\tthis.center.set(0, 0, 0);\n\t\tthis.radius = -1;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Checks to see if the sphere contains the provided point inclusive of the surface of the sphere.\n\t * @param {Vector3} point - The point to check for containment.\n\t * @returns {boolean}\n\t */\n\tcontainsPoint(point) {\n\t\treturn (point.distanceToSquared(this.center) <= (this.radius * this.radius));\n\t}\n\n\t/**\n\t * Returns the closest distance from the boundary of the sphere to the point.\n\t * If the sphere contains the point, the distance will be negative.\n\t * @param {Vector3} point - The point to calculate the distance to.\n\t * @returns {number}\n\t */\n\tdistanceToPoint(point) {\n\t\treturn (point.distanceTo(this.center) - this.radius);\n\t}\n\n\t/**\n\t * Expands the boundaries of this sphere to include point.\n\t * @param {Vector3} point - The vector3 that should be included in the sphere.\n\t * @returns {Sphere}\n\t */\n\texpandByPoint(point) {\n\t\tif (this.isEmpty()) {\n\t\t\tthis.center.copy(point);\n\t\t\tthis.radius = 0;\n\t\t\treturn this;\n\t\t}\n\n\t\t_vec3_1.subVectors(point, this.center);\n\n\t\tconst lengthSq = _vec3_1.getLengthSquared();\n\n\t\tif (lengthSq > (this.radius * this.radius)) {\n\t\t\t// calculate the minimal sphere\n\t\t\tconst length = Math.sqrt(lengthSq);\n\t\t\tconst delta = (length - this.radius) * 0.5;\n\t\t\tthis.center.addScaledVector(_vec3_1, delta / length);\n\t\t\tthis.radius += delta;\n\t\t}\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Expands this sphere to enclose both the original sphere and the given sphere.\n\t * @param {Sphere} sphere - The sphere to include.\n\t * @returns {Sphere} A reference to this sphere.\n\t */\n\tunion(sphere) {\n\t\tif (sphere.isEmpty()) {\n\t\t\treturn this;\n\t\t}\n\n\t\tif (this.isEmpty()) {\n\t\t\tthis.copy(sphere);\n\n\t\t\treturn this;\n\t\t}\n\n\t\tif (this.center.equals(sphere.center)) {\n\t\t\tthis.radius = Math.max(this.radius, sphere.radius);\n\t\t} else {\n\t\t\t_vec3_2.subVectors(sphere.center, this.center).normalize().multiplyScalar(sphere.radius);\n\n\t\t\tthis.expandByPoint(_vec3_1.addVectors(sphere.center, _vec3_2));\n\n\t\t\tthis.expandByPoint(_vec3_1.addVectors(sphere.center, _vec3_2));\n\t\t}\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Returns a new sphere with the same center and radius as this one.\n\t * @returns {Sphere}\n\t */\n\tclone() {\n\t\treturn new Sphere().copy(this);\n\t}\n\n\t/**\n\t * Copies the values of the passed sphere's center and radius properties to this sphere.\n\t * @param {Sphere} sphere\n\t * @returns {Sphere}\n\t */\n\tcopy(sphere) {\n\t\tthis.center.copy(sphere.center);\n\t\tthis.radius = sphere.radius;\n\n\t\treturn this;\n\t}\n\n}\n\n/**\n * This flag can be used for type testing.\n * @readonly\n * @type {boolean}\n * @default true\n */\nSphere.prototype.isSphere = true;\n\nexport { Sphere };"
  },
  {
    "path": "src/math/Spherical.js",
    "content": "import { MathUtils } from './MathUtils.js';\n\n/**\n * Ref: https://en.wikipedia.org/wiki/Spherical_coordinate_system\n *\n * The poles (phi) are at the positive and negative y axis.\n * The equator starts at positive z.\n */\nclass Spherical {\n\n\t/**\n\t * @param {number} [radius=1] - the radius, or the Euclidean distance (straight-line distance) from the point to the origin. Default is 1.0.\n\t * @param {number} [phi=0] - - polar angle in radians from the y (up) axis. Default is 0.\n\t * @param {number} [theta=0] - - equator angle in radians around the y (up) axis. Default is 0.\n\t */\n\tconstructor(radius = 1, phi = 0, theta = 0) {\n\t\tthis.radius = radius;\n\t\tthis.phi = phi; // up / down towards top and bottom pole\n\t\tthis.theta = theta; // around the equator of the sphere\n\t}\n\n\t/**\n\t * Sets values of this spherical's radius, phi and theta properties.\n\t * @param {number} radius\n\t * @param {number} phi\n\t * @param {number} theta\n\t * @returns {Spherical}\n\t */\n\tset(radius, phi, theta) {\n\t\tthis.radius = radius;\n\t\tthis.phi = phi;\n\t\tthis.theta = theta;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Copies the values of the passed Spherical's radius, phi and theta properties to this spherical.\n\t * @param {Spherical} other\n\t * @returns {Spherical}\n\t */\n\tcopy(other) {\n\t\tthis.radius = other.radius;\n\t\tthis.phi = other.phi;\n\t\tthis.theta = other.theta;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Returns a new spherical with the same radius, phi and theta properties as this one.\n\t * @returns {Spherical}\n\t */\n\tclone() {\n\t\treturn new Spherical().copy(this);\n\t}\n\n\t/**\n\t * Restrict phi to be betwee EPS and PI-EPS.\n\t * @returns {Spherical}\n\t */\n\tmakeSafe() {\n\t\tconst EPS = 0.000001;\n\t\tthis.phi = MathUtils.clamp(this.phi, EPS, Math.PI - EPS);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets values of this spherical's radius, phi and theta properties from the Vector3.\n\t * @param {Vector3} vec3\n\t * @returns {Spherical}\n\t */\n\tsetFromVector3(vec3) {\n\t\tthis.radius = vec3.getLength();\n\n\t\tif (this.radius === 0) {\n\t\t\tthis.theta = 0;\n\t\t\tthis.phi = 0;\n\t\t} else {\n\t\t\tthis.theta = Math.atan2(vec3.x, vec3.z); // equator angle around y-up axis\n\t\t\tthis.phi = Math.acos(MathUtils.clamp(vec3.y / this.radius, -1, 1)); // polar angle\n\t\t}\n\n\t\treturn this;\n\t}\n\n}\n\n/**\n * This flag can be used for type testing.\n * @readonly\n * @type {boolean}\n * @default true\n */\nSpherical.prototype.isSpherical = true;\n\nexport { Spherical };"
  },
  {
    "path": "src/math/SphericalHarmonics3.js",
    "content": "import { Vector3 } from './Vector3.js';\n\n/**\n * Primary reference: https://graphics.stanford.edu/papers/envmap/envmap.pdf\n * Secondary reference: https://www.ppsloan.org/publications/StupidSH36.pdf\n * 3-band SH defined by 9 coefficients.\n */\nclass SphericalHarmonics3 {\n\n\t/**\n\t * Creates a new instance of SphericalHarmonics3.\n\t */\n\tconstructor() {\n\t\t/**\n\t\t * An array holding the (9) SH coefficients.\n\t\t * A single coefficient is represented as an instance of Vector3.\n\t\t * @type {Array}\n\t\t */\n\t\tthis.coefficients = [];\n\n\t\tfor (let i = 0; i < 9; i++) {\n\t\t\tthis.coefficients.push(new Vector3());\n\t\t}\n\t}\n\n\t/**\n\t * Set this sphericalHarmonics3 value.\n\t * @param {Vector3[]} coefficients An array of SH coefficients.\n\t * @returns {SphericalHarmonics3}\n\t */\n\tset(coefficients) {\n\t\tfor (let i = 0; i < 9; i++) {\n\t\t\tthis.coefficients[i].copy(coefficients[i]);\n\t\t}\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets all SH coefficients to 0.\n\t * @returns {SphericalHarmonics3}\n\t */\n\tzero() {\n\t\tfor (let i = 0; i < 9; i++) {\n\t\t\tthis.coefficients[i].set(0, 0, 0);\n\t\t}\n\t\treturn this;\n\t}\n\n\t/**\n\t * Returns the radiance in the direction of the given normal.\n\t * @param {Vector3} normal - The normal vector (assumed to be unit length).\n\t * @param {Vector3} target - The result vector.\n\t * @returns {Vector3}\n\t */\n\tgetAt(normal, target) {\n\t\t// normal is assumed to be unit length\n\n\t\tconst x = normal.x, y = normal.y, z = normal.z;\n\n\t\tconst coeff = this.coefficients;\n\n\t\t// band 0\n\t\ttarget.copy(coeff[0]).multiplyScalar(0.282095);\n\n\t\t// band 1\n\t\ttarget.addScaledVector(coeff[1], 0.488603 * y);\n\t\ttarget.addScaledVector(coeff[2], 0.488603 * z);\n\t\ttarget.addScaledVector(coeff[3], 0.488603 * x);\n\n\t\t// band 2\n\t\ttarget.addScaledVector(coeff[4], 1.092548 * (x * y));\n\t\ttarget.addScaledVector(coeff[5], 1.092548 * (y * z));\n\t\ttarget.addScaledVector(coeff[6], 0.315392 * (3.0 * z * z - 1.0));\n\t\ttarget.addScaledVector(coeff[7], 1.092548 * (x * z));\n\t\ttarget.addScaledVector(coeff[8], 0.546274 * (x * x - y * y));\n\n\t\treturn target;\n\t}\n\n\t/**\n\t * Reference: https://graphics.stanford.edu/papers/envmap/envmap.pdf\n\t * Returns the irradiance (radiance convolved with cosine lobe) in the direction of the given normal.\n\t * @param {Vector3} normal - The normal vector (assumed to be unit length).\n\t * @param {Vector3} target - The result vector.\n\t * @returns {Vector3}\n\t */\n\tgetIrradianceAt(normal, target) {\n\t\t// normal is assumed to be unit length\n\n\t\tconst x = normal.x, y = normal.y, z = normal.z;\n\n\t\tconst coeff = this.coefficients;\n\n\t\t// band 0\n\t\ttarget.copy(coeff[0]).multiplyScalar(0.886227); // π * 0.282095\n\n\t\t// band 1\n\t\ttarget.addScaledVector(coeff[1], 2.0 * 0.511664 * y); // ( 2 * π / 3 ) * 0.488603\n\t\ttarget.addScaledVector(coeff[2], 2.0 * 0.511664 * z);\n\t\ttarget.addScaledVector(coeff[3], 2.0 * 0.511664 * x);\n\n\t\t// band 2\n\t\ttarget.addScaledVector(coeff[4], 2.0 * 0.429043 * x * y); // ( π / 4 ) * 1.092548\n\t\ttarget.addScaledVector(coeff[5], 2.0 * 0.429043 * y * z);\n\t\ttarget.addScaledVector(coeff[6], 0.743125 * z * z - 0.247708); // ( π / 4 ) * 0.315392 * 3\n\t\ttarget.addScaledVector(coeff[7], 2.0 * 0.429043 * x * z);\n\t\ttarget.addScaledVector(coeff[8], 0.429043 * (x * x - y * y)); // ( π / 4 ) * 0.546274\n\n\t\treturn target;\n\t}\n\n\t/**\n\t * Adds the given SH to this instance.\n\t * @param {SphericalHarmonics3} sh - The SH to add.\n\t * @returns {SphericalHarmonics3}\n\t */\n\tadd(sh) {\n\t\tfor (let i = 0; i < 9; i++) {\n\t\t\tthis.coefficients[i].add(sh.coefficients[i]);\n\t\t}\n\t\treturn this;\n\t}\n\n\t/**\n\t * A convenience method for performing .add() and .scale() at once.\n\t * @param {SphericalHarmonics3} sh - The SH to add.\n\t * @param {Vector3} s - The scale factor.\n\t * @returns {SphericalHarmonics3}\n\t */\n\taddScaledSH(sh, s) {\n\t\tfor (let i = 0; i < 9; i++) {\n\t\t\tthis.coefficients[i].addScaledVector(sh.coefficients[i], s);\n\t\t}\n\t\treturn this;\n\t}\n\n\t/**\n\t * Multiply the s to this SphericalHarmonics3.\n\t * @param {number} s - The scale factor.\n\t * @returns {SphericalHarmonics3}\n\t */\n\tscale(s) {\n\t\tfor (let i = 0; i < 9; i++) {\n\t\t\tthis.coefficients[i].multiplyScalar(s);\n\t\t}\n\t\treturn this;\n\t}\n\n\t/**\n\t * Linear interpolates between the given SH and this instance by the given alpha factor.\n\t * Sets this coefficients vector to be the vector linearly interpolated between v1 and v2\n\t * where alpha is the percent distance along the line connecting the two vectors\n\t * - alpha = 0 will be v1, and alpha = 1 will be v2.\n\t * @param {SphericalHarmonics3} sh - The SH to interpolate with.\n\t * @param {number} alpha - The alpha factor.\n\t * @returns {SphericalHarmonics3}\n\t */\n\tlerp(sh, alpha) {\n\t\tfor (let i = 0; i < 9; i++) {\n\t\t\tthis.coefficients[i].lerpVectors(this.coefficients[i], sh.coefficients[i], alpha);\n\t\t}\n\t\treturn this;\n\t}\n\n\t/**\n\t * Returns true if the given SH and this instance have equal coefficients.\n\t * @param {SphericalHarmonics3} sh - The SH to compare with.\n\t * @returns {boolean}\n\t */\n\tequals(sh) {\n\t\tfor (let i = 0; i < 9; i++) {\n\t\t\tif (!this.coefficients[i].equals(sh.coefficients[i])) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t\treturn true;\n\t}\n\n\t/**\n\t * Copies the given SH to this instance.\n\t * @param {SphericalHarmonics3} sh - The SH to compare with.\n\t * @returns {SphericalHarmonics3}\n\t */\n\tcopy(sh) {\n\t\treturn this.set(sh.coefficients);\n\t}\n\n\t/**\n\t * Returns a new instance of SphericalHarmonics3 with equal coefficients.\n\t * @returns {SphericalHarmonics3}\n\t */\n\tclone() {\n\t\treturn new this.constructor().copy(this);\n\t}\n\n\t/**\n\t * Sets the coefficients of this instance from the given array.\n\t * @param {number[]} array - The array holding the numbers of the SH coefficients.\n\t * @param {number} [offset=0] - The array offset.\n\t * @returns {SphericalHarmonics3}\n\t */\n\tfromArray(array, offset = 0) {\n\t\tconst coefficients = this.coefficients;\n\n\t\tfor (let i = 0; i < 9; i++) {\n\t\t\tcoefficients[i].fromArray(array, offset + (i * 3));\n\t\t}\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Returns an array with the coefficients, or copies them into the provided array.\n\t * The coefficients are represented as numbers.\n\t * @param {number[]} [array] - The target array.\n\t * @param {number} [offset=0] - The array offset.\n\t * @returns {number[]}\n\t */\n\ttoArray(array = [], offset = 0) {\n\t\tconst coefficients = this.coefficients;\n\n\t\tfor (let i = 0; i < 9; i++) {\n\t\t\tcoefficients[i].toArray(array, offset + (i * 3));\n\t\t}\n\n\t\treturn array;\n\t}\n\n\t/**\n\t * Computes the SH basis for the given normal vector.\n\t * @param {Vector3} normal - The normal vector (assumed to be unit length).\n\t * @param {number[]} shBasis - The resulting SH basis.\n\t */\n\tstatic getBasisAt(normal, shBasis) {\n\t\t// normal is assumed to be unit length\n\n\t\tconst x = normal.x, y = normal.y, z = normal.z;\n\n\t\t// band 0\n\t\tshBasis[0] = 0.282095;\n\n\t\t// band 1\n\t\tshBasis[1] = 0.488603 * y;\n\t\tshBasis[2] = 0.488603 * z;\n\t\tshBasis[3] = 0.488603 * x;\n\n\t\t// band 2\n\t\tshBasis[4] = 1.092548 * x * y;\n\t\tshBasis[5] = 1.092548 * y * z;\n\t\tshBasis[6] = 0.315392 * (3 * z * z - 1);\n\t\tshBasis[7] = 1.092548 * x * z;\n\t\tshBasis[8] = 0.546274 * (x * x - y * y);\n\t}\n\n}\n\n/**\n * This flag can be used for type testing.\n * @readonly\n * @type {boolean}\n * @default true\n */\nSphericalHarmonics3.prototype.isSphericalHarmonics3 = true;\n\nexport { SphericalHarmonics3 };\n"
  },
  {
    "path": "src/math/Triangle.js",
    "content": "import { Vector3 } from './Vector3.js';\n\nconst _v0 = new Vector3();\nconst _v1 = new Vector3();\nconst _v2 = new Vector3();\nconst _v3 = new Vector3();\n\n/**\n * A geometric triangle as defined by three Vector3s representing its three corners.\n */\nclass Triangle {\n\n\t/**\n\t * @param {Vector3} [a] - the first corner of the triangle. Default is a Vector3 at (0, 0, 0).\n\t * @param {Vector3} [b] - the second corner of the triangle. Default is a Vector3 at (0, 0, 0).\n\t * @param {Vector3} [c] - the final corner of the triangle. Default is a Vector3 at (0, 0, 0).\n\t */\n\tconstructor(a = new Vector3(), b = new Vector3(), c = new Vector3()) {\n\t\tthis.a = a;\n\t\tthis.b = b;\n\t\tthis.c = c;\n\t}\n\n\t/**\n\t * Calculate the normal vector of the triangle.\n\t * @param {Vector3} a\n\t * @param {Vector3} b\n\t * @param {Vector3} c\n\t * @param {Vector3} [optionalTarget]\n\t * @returns {Vector3}\n\t */\n\tstatic normal(a, b, c, optionalTarget) {\n\t\tconst result = optionalTarget || new Vector3();\n\n\t\tresult.subVectors(c, b);\n\t\t_v0.subVectors(a, b);\n\t\tresult.cross(_v0);\n\n\t\tconst resultLengthSq = result.getLengthSquared();\n\t\tif (resultLengthSq > 0) {\n\t\t\treturn result.multiplyScalar(1 / Math.sqrt(resultLengthSq));\n\t\t}\n\n\t\treturn result.set(0, 0, 0);\n\t}\n\n\t/**\n\t * static/instance method to calculate barycentric coordinates.\n\t * based on: http://www.blackpawn.com/texts/pointinpoly/default.html\n\t * @param {Vector3} point - Vector3\n\t * @param {Vector3} a\n\t * @param {Vector3} b\n\t * @param {Vector3} c\n\t * @param {Vector3} [target] - the result will be copied into this Vector3.\n\t * @returns {Vector3}\n\t */\n\tstatic barycoordFromPoint(point, a, b, c, target) {\n\t\t_v0.subVectors(c, a);\n\t\t_v1.subVectors(b, a);\n\t\t_v2.subVectors(point, a);\n\n\t\tconst dot00 = _v0.dot(_v0);\n\t\tconst dot01 = _v0.dot(_v1);\n\t\tconst dot02 = _v0.dot(_v2);\n\t\tconst dot11 = _v1.dot(_v1);\n\t\tconst dot12 = _v1.dot(_v2);\n\n\t\tconst denom = (dot00 * dot11 - dot01 * dot01);\n\n\t\tconst result = target || new Vector3();\n\n\t\t// collinear or singular triangle\n\t\tif (denom === 0) {\n\t\t\t// arbitrary location outside of triangle?\n\t\t\t// not sure if this is the best idea, maybe should be returning undefined\n\t\t\treturn result.set(-2, -1, -1);\n\t\t}\n\n\t\tconst invDenom = 1 / denom;\n\t\tconst u = (dot11 * dot02 - dot01 * dot12) * invDenom;\n\t\tconst v = (dot00 * dot12 - dot01 * dot02) * invDenom;\n\n\t\t// barycentric coordinates must always sum to 1\n\t\treturn result.set(1 - u - v, v, u);\n\t}\n\n\t/**\n\t * Returns true if the passed point, when projected onto the plane of the triangle, lies within the triangle.\n\t * @param {Vector3} point\n\t * @param {Vector3} a\n\t * @param {Vector3} b\n\t * @param {Vector3} c\n\t * @returns {Vector3}\n\t */\n\tstatic containsPoint(point, a, b, c) {\n\t\tthis.barycoordFromPoint(point, a, b, c, _v3);\n\t\treturn (_v3.x >= 0) && (_v3.y >= 0) && ((_v3.x + _v3.y) <= 1);\n\t}\n\n\t/**\n\t * Sets the triangle's a, b and c properties to the passed vector3s.\n\t * @param {Vector3} a\n\t * @param {Vector3} b\n\t * @param {Vector3} c\n\t * @returns {Triangle}\n\t */\n\tset(a, b, c) {\n\t\tthis.a.copy(a);\n\t\tthis.b.copy(b);\n\t\tthis.c.copy(c);\n\n\t\treturn this;\n\t}\n\n}\n\n/**\n * This flag can be used for type testing.\n * @readonly\n * @type {boolean}\n * @default true\n */\nTriangle.prototype.isTriangle = true;\n\nexport { Triangle };"
  },
  {
    "path": "src/math/Vector2.js",
    "content": "import { MathUtils } from './MathUtils.js';\n\n/**\n * The vector 2 class\n */\nclass Vector2 {\n\n\t/**\n\t * @param {number} [x=0] - the x value of this vector.\n\t * @param {number} [y=0] - the y value of this vector.\n\t */\n\tconstructor(x = 0, y = 0) {\n\t\tthis.x = x;\n\t\tthis.y = y;\n\t}\n\n\t/**\n\t * Sets the x and y components of this vector.\n\t * @param {number} x\n\t * @param {number} y\n\t * @returns {Vector2}\n\t */\n\tset(x = 0, y = 0) {\n\t\tthis.x = x;\n\t\tthis.y = y;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets this vector to be the vector linearly interpolated between v1 and v2\n\t * where ratio is the percent distance along the line connecting the two vectors\n\t * - ratio = 0 will be v1, and ratio = 1 will be v2.\n\t * @param {Vector2} v1 - the starting Vector2.\n\t * @param {Vector2} v2 - Vector2 to interpolate towards.\n\t * @param {number} ratio - interpolation factor, typically in the closed interval [0, 1].\n\t * @returns {Vector2}\n\t */\n\tlerpVectors(v1, v2, ratio) {\n\t\treturn this.subVectors(v2, v1).multiplyScalar(ratio).add(v1);\n\t}\n\n\t/**\n\t * If this vector's x or y value is greater than v's x or y value, replace that value with the corresponding min value.\n\t * @param {Vector2} v\n\t * @returns {Vector2}\n\t */\n\tmin(v) {\n\t\tthis.x = Math.min(this.x, v.x);\n\t\tthis.y = Math.min(this.y, v.y);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * If this vector's x or y value is less than v's x or y value, replace that value with the corresponding max value.\n\t * @param {Vector2} v\n\t * @returns {Vector2}\n\t */\n\tmax(v) {\n\t\tthis.x = Math.max(this.x, v.x);\n\t\tthis.y = Math.max(this.y, v.y);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Computes the Euclidean length (straight-line length) from (0, 0) to (x, y).\n\t * @returns {number}\n\t */\n\tgetLength() {\n\t\treturn Math.sqrt(this.getLengthSquared());\n\t}\n\n\t/**\n\t * Computes the square of the Euclidean length (straight-line length) from (0, 0) to (x, y).\n\t * If you are comparing the lengths of vectors, you should compare the length squared instead\n\t * as it is slightly more efficient to calculate.\n\t * @returns {number}\n\t */\n\tgetLengthSquared() {\n\t\treturn this.x * this.x + this.y * this.y;\n\t}\n\n\t/**\n\t * Converts this vector to a unit vector - that is, sets it equal to a vector with the same direction as this one, but length 1.\n\t * @param {number} [thickness=1]\n\t * @returns {Vector2}\n\t */\n\tnormalize(thickness = 1) {\n\t\tconst length = this.getLength() || 1;\n\t\tconst invLength = thickness / length;\n\n\t\tthis.x *= invLength;\n\t\tthis.y *= invLength;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Subtracts v from the vector.\n\t * @param {Vector2} a\n\t * @param {Vector2} target - the result vector2\n\t * @returns {Vector2}\n\t */\n\tsubtract(a, target = new Vector2()) {\n\t\treturn target.set(this.x - a.x, this.y - a.y);\n\t}\n\n\t/**\n\t * Subtracts v from this vector.\n\t * @param {Vector2} v\n\t * @returns {Vector2}\n\t */\n\tsub(v) {\n\t\tthis.x -= v.x;\n\t\tthis.y -= v.y;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Copies the values of the passed Vector2's x and y properties to this Vector2.\n\t * @param {Vector2} v\n\t * @returns {Vector2}\n\t */\n\tcopy(v) {\n\t\tthis.x = v.x;\n\t\tthis.y = v.y;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets this vector to a + b.\n\t * @param {Vector2} a\n\t * @param {Vector2} b\n\t * @returns {Vector2}\n\t */\n\taddVectors(a, b) {\n\t\tthis.x = a.x + b.x;\n\t\tthis.y = a.y + b.y;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets this vector to a - b.\n\t * @param {Vector2} a\n\t * @param {Vector2} b\n\t * @returns {Vector2}\n\t */\n\tsubVectors(a, b) {\n\t\tthis.x = a.x - b.x;\n\t\tthis.y = a.y - b.y;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Multiplies this vector by scalar.\n\t * @param {number} scalar\n\t * @returns {Vector2}\n\t */\n\tmultiplyScalar(scalar) {\n\t\tthis.x *= scalar;\n\t\tthis.y *= scalar;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Computes the squared distance from this vector to v. If you are just comparing the distance with\n\t * another distance, you should compare the distance squared instead as it is slightly more efficient to calculate.\n\t * @param {Vector2} v\n\t * @returns {number}\n\t */\n\tdistanceToSquared(v) {\n\t\tconst dx = this.x - v.x,\n\t\t\tdy = this.y - v.y;\n\n\t\treturn dx * dx + dy * dy;\n\t}\n\n\t/**\n\t * Computes the distance from this vector to v.\n\t * @param {Vector2} v\n\t * @returns {number}\n\t */\n\tdistanceTo(v) {\n\t\treturn Math.sqrt(this.distanceToSquared(v));\n\t}\n\n\t/**\n\t * Sets this vector's x value to be array[ offset ] and y value to be array[ offset + 1 ].\n\t * @param {number[]} array - the source array.\n\t * @param {number} [offset=0] - offset into the array.\n\t * @param {boolean} [denormalize=false] - if true, denormalize the values, and array should be a typed array.\n\t * @returns {Vector2}\n\t */\n\tfromArray(array, offset = 0, denormalize = false) {\n\t\tlet x = array[offset], y = array[offset + 1];\n\n\t\tif (denormalize) {\n\t\t\tx = MathUtils.denormalize(x, array);\n\t\t\ty = MathUtils.denormalize(y, array);\n\t\t}\n\n\t\tthis.x = x;\n\t\tthis.y = y;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets this array[ offset ] value to be vector's x and array[ offset + 1 ] to be vector's y.\n\t * @param {number[]} [array] - the target array.\n\t * @param {number} [offset=0] - offset into the array.\n\t * @param {boolean} [normalize=false] - if true, normalize the values, and array should be a typed array.\n\t * @returns {number[]}\n\t */\n\ttoArray(array = [], offset = 0, normalize = false) {\n\t\tlet x = this.x, y = this.y;\n\n\t\tif (normalize) {\n\t\t\tx = MathUtils.normalize(x, array);\n\t\t\ty = MathUtils.normalize(y, array);\n\t\t}\n\n\t\tarray[offset] = x;\n\t\tarray[offset + 1] = y;\n\n\t\treturn array;\n\t}\n\n\t/**\n\t * Adds v to this vector.\n\t * @param {Vector2} v\n\t * @returns {Vector2}\n\t */\n\tadd(v) {\n\t\tthis.x += v.x;\n\t\tthis.y += v.y;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Computes the angle in radians of this vector with respect to the positive x-axis.\n\t * @returns {number}\n\t */\n\tangle() {\n\t\t// computes the angle in radians with respect to the positive x-axis\n\n\t\t// let angle = Math.atan2(this.y, this.x);\n\t\t// if (angle < 0) angle += 2 * Math.PI;\n\t\t// return angle;\n\n\t\treturn Math.atan2(-this.y, -this.x) + Math.PI;\n\t}\n\n\t/**\n\t * Inverts this vector - i.e. sets x = -x, y = -y.\n\t * @returns {Vector2}\n\t */\n\tnegate() {\n\t\tthis.x = -this.x;\n\t\tthis.y = -this.y;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Calculate the dot product of this vector and v.\n\t * @param {Vector2} a\n\t * @returns {number}\n\t */\n\tdot(a) {\n\t\treturn this.x * a.x + this.y * a.y;\n\t}\n\n\t/**\n\t * Checks for strict equality of this vector and v.\n\t * @param {Vector2} v\n\t * @returns {boolean}\n\t */\n\tequals(v) {\n\t\treturn ((v.x === this.x) && (v.y === this.y));\n\t}\n\n\t/**\n\t * Returns a new Vector2 with the same x and y values as this one.\n\t * @returns {Vector2}\n\t */\n\tclone() {\n\t\treturn new Vector2(this.x, this.y);\n\t}\n\n\t* [Symbol.iterator]() {\n\t\tyield this.x;\n\t\tyield this.y;\n\t}\n\n}\n\n/**\n * This flag can be used for type testing.\n * @readonly\n * @type {boolean}\n * @default true\n */\nVector2.prototype.isVector2 = true;\n\nexport { Vector2 };"
  },
  {
    "path": "src/math/Vector3.js",
    "content": "import { MathUtils } from './MathUtils.js';\n\n/**\n * Class representing a 3D vector.\n */\nclass Vector3 {\n\n\t/**\n\t * Constructs a new 3D vector.\n\t * @param {number} [x=0] - The x value of this vector.\n\t * @param {number} [y=0] - The y value of this vector.\n\t * @param {number} [z=0] - The z value of this vector.\n\t */\n\tconstructor(x = 0, y = 0, z = 0) {\n\t\t/**\n\t\t * The x value of this vector.\n\t\t * @type {number}\n\t\t */\n\t\tthis.x = x;\n\n\t\t/**\n\t\t * The y value of this vector.\n\t\t * @type {number}\n\t\t */\n\t\tthis.y = y;\n\n\t\t/**\n\t\t * The z value of this vector.\n\t\t * @type {number}\n\t\t */\n\t\tthis.z = z;\n\t}\n\n\t/**\n\t * Sets the vector components.\n\t * @param {number} x - The value of the x component.\n\t * @param {number} y - The value of the y component.\n\t * @param {number} z - The value of the z component.\n\t * @returns {Vector3} A reference to this vector.\n\t */\n\tset(x = 0, y = 0, z = 0) {\n\t\tthis.x = x;\n\t\tthis.y = y;\n\t\tthis.z = z;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the vector components to the same value.\n\t * @param {number} scalar - The value to set for all vector components.\n\t * @returns {Vector3} A reference to this vector.\n\t */\n\tsetScalar(scalar) {\n\t\tthis.x = scalar;\n\t\tthis.y = scalar;\n\t\tthis.z = scalar;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Returns a new vector with copied values from this instance.\n\t * @returns {Vector3} A clone of this instance.\n\t */\n\tclone() {\n\t\treturn new Vector3(this.x, this.y, this.z);\n\t}\n\n\t/**\n\t * Copies the values of the given vector to this instance.\n\t * @param {Vector3} v - The vector to copy.\n\t * @returns {Vector3} A reference to this vector.\n\t */\n\tcopy(v) {\n\t\tthis.x = v.x;\n\t\tthis.y = v.y;\n\t\tthis.z = v.z;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Adds the given vector to this instance.\n\t * @param {Vector3} v - The vector to add.\n\t * @returns {Vector3} A reference to this vector.\n\t */\n\tadd(v) {\n\t\tthis.x += v.x;\n\t\tthis.y += v.y;\n\t\tthis.z += v.z;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Adds the given scalar value to all components of this instance.\n\t * @param {number} s - The scalar to add.\n\t * @returns {Vector3} A reference to this vector.\n\t */\n\taddScalar(s) {\n\t\tthis.x += s;\n\t\tthis.y += s;\n\t\tthis.z += s;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Adds the given vectors and stores the result in this instance.\n\t * @param {Vector3} a - The first vector.\n\t * @param {Vector3} b - The second vector.\n\t * @returns {Vector3} A reference to this vector.\n\t */\n\taddVectors(a, b) {\n\t\tthis.x = a.x + b.x;\n\t\tthis.y = a.y + b.y;\n\t\tthis.z = a.z + b.z;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Adds the given vector scaled by the given factor to this instance.\n\t * @param {Vector3|Vector4} v - The vector.\n\t * @param {number} s - The factor that scales `v`.\n\t * @returns {Vector3} A reference to this vector.\n\t */\n\taddScaledVector(v, s) {\n\t\tthis.x += v.x * s;\n\t\tthis.y += v.y * s;\n\t\tthis.z += v.z * s;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Subtracts the given vector from this instance.\n\t * @param {Vector3} v - The vector to subtract.\n\t * @returns {Vector3} A reference to this vector.\n\t */\n\tsub(v) {\n\t\tthis.x -= v.x;\n\t\tthis.y -= v.y;\n\t\tthis.z -= v.z;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Subtracts the given vectors and stores the result in this instance.\n\t * @param {Vector3} a - The first vector.\n\t * @param {Vector3} b - The second vector.\n\t * @returns {Vector3} A reference to this vector.\n\t */\n\tsubVectors(a, b) {\n\t\tthis.x = a.x - b.x;\n\t\tthis.y = a.y - b.y;\n\t\tthis.z = a.z - b.z;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Multiplies the given vector with this instance.\n\t * @param {Vector3} v - The vector to multiply.\n\t * @returns {Vector3} A reference to this vector.\n\t */\n\tmultiply(v) {\n\t\tthis.x *= v.x;\n\t\tthis.y *= v.y;\n\t\tthis.z *= v.z;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Multiplies the given scalar value with all components of this instance.\n\t * @param {number} scalar - The scalar to multiply.\n\t * @returns {Vector3} A reference to this vector.\n\t */\n\tmultiplyScalar(scalar) {\n\t\tthis.x *= scalar;\n\t\tthis.y *= scalar;\n\t\tthis.z *= scalar;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Multiplies this vector with the given 3x3 matrix.\n\t * @param {Matrix3} m - The 3x3 matrix.\n\t * @returns {Vector3} A reference to this vector.\n\t */\n\tapplyMatrix3(m) {\n\t\tconst x = this.x, y = this.y, z = this.z;\n\t\tconst e = m.elements;\n\n\t\tthis.x = e[0] * x + e[3] * y + e[6] * z;\n\t\tthis.y = e[1] * x + e[4] * y + e[7] * z;\n\t\tthis.z = e[2] * x + e[5] * y + e[8] * z;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Multiplies this vector (with an implicit 1 in the 4th dimension) by m, and\n\t * divides by perspective.\n\t * @param {Matrix4} m - The matrix to apply.\n\t * @returns {Vector3} A reference to this vector.\n\t */\n\tapplyMatrix4(m) {\n\t\tconst x = this.x, y = this.y, z = this.z;\n\t\tconst e = m.elements;\n\n\t\tconst w = 1 / (e[3] * x + e[7] * y + e[11] * z + e[15]);\n\n\t\tthis.x = (e[0] * x + e[4] * y + e[8] * z + e[12]) * w;\n\t\tthis.y = (e[1] * x + e[5] * y + e[9] * z + e[13]) * w;\n\t\tthis.z = (e[2] * x + e[6] * y + e[10] * z + e[14]) * w;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Applies the given Quaternion to this vector.\n\t * @param {Quaternion} q - The Quaternion.\n\t * @returns {Vector3} A reference to this vector.\n\t */\n\tapplyQuaternion(q) {\n\t\tconst x = this.x, y = this.y, z = this.z;\n\t\tconst qx = q._x, qy = q._y, qz = q._z, qw = q._w;\n\n\t\t// calculate quat * vector\n\n\t\tconst ix = qw * x + qy * z - qz * y;\n\t\tconst iy = qw * y + qz * x - qx * z;\n\t\tconst iz = qw * z + qx * y - qy * x;\n\t\tconst iw = -qx * x - qy * y - qz * z;\n\n\t\t// calculate result * inverse quat\n\n\t\tthis.x = ix * qw + iw * -qx + iy * -qz - iz * -qy;\n\t\tthis.y = iy * qw + iw * -qy + iz * -qx - ix * -qz;\n\t\tthis.z = iz * qw + iw * -qz + ix * -qy - iy * -qx;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Projects this vector from world space into the camera's normalized\n\t * device coordinate (NDC) space.\n\t * @param {Camera} camera - The camera.\n\t * @returns {Vector3} A reference to this vector.\n\t */\n\tproject(camera) {\n\t\treturn this.applyMatrix4(camera.projectionViewMatrix);\n\t}\n\n\t/**\n\t * Unprojects this vector from the camera's normalized device coordinate (NDC)\n\t * space into world space.\n\t * @param {Camera} camera - The camera.\n\t * @returns {Vector3} A reference to this vector.\n\t */\n\tunproject(camera) {\n\t\treturn this.applyMatrix4(camera.projectionMatrixInverse).applyMatrix4(camera.worldMatrix);\n\t}\n\n\t/**\n\t * Transforms the direction of this vector by a matrix (the upper left 3 x 3\n\t * subset of the given 4x4 matrix and then normalizes the result.\n\t * @param {Matrix4} m - The matrix.\n\t * @returns {Vector3} A reference to this vector.\n\t */\n\ttransformDirection(m) {\n\t\t// input: Matrix4 affine matrix\n\t\t// vector interpreted as a direction\n\n\t\tconst x = this.x, y = this.y, z = this.z;\n\t\tconst e = m.elements;\n\n\t\tthis.x = e[0] * x + e[4] * y + e[8] * z;\n\t\tthis.y = e[1] * x + e[5] * y + e[9] * z;\n\t\tthis.z = e[2] * x + e[6] * y + e[10] * z;\n\n\t\treturn this.normalize();\n\t}\n\n\t/**\n\t * If this vector's x, y or z value is greater than the given vector's x, y or z\n\t * value, replace that value with the corresponding min value.\n\t * @param {Vector3} v - The vector.\n\t * @returns {Vector3} A reference to this vector.\n\t */\n\tmin(v) {\n\t\tthis.x = Math.min(this.x, v.x);\n\t\tthis.y = Math.min(this.y, v.y);\n\t\tthis.z = Math.min(this.z, v.z);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * If this vector's x, y or z value is less than the given vector's x, y or z\n\t * value, replace that value with the corresponding max value.\n\t * @param {Vector3} v - The vector.\n\t * @returns {Vector3} A reference to this vector.\n\t */\n\tmax(v) {\n\t\tthis.x = Math.max(this.x, v.x);\n\t\tthis.y = Math.max(this.y, v.y);\n\t\tthis.z = Math.max(this.z, v.z);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Inverts this vector - i.e. sets x = -x, y = -y and z = -z.\n\t * @returns {Vector3} A reference to this vector.\n\t */\n\tnegate() {\n\t\tthis.x = -this.x;\n\t\tthis.y = -this.y;\n\t\tthis.z = -this.z;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Calculates the dot product of the given vector with this instance.\n\t * @param {Vector3} v - The vector to compute the dot product with.\n\t * @returns {number} The result of the dot product.\n\t */\n\tdot(v) {\n\t\treturn this.x * v.x + this.y * v.y + this.z * v.z;\n\t}\n\n\t/**\n\t * Computes the square of the Euclidean length (straight-line length) from\n\t * (0, 0, 0) to (x, y, z). If you are comparing the lengths of vectors, you should\n\t * compare the length squared instead as it is slightly more efficient to calculate.\n\t * @returns {number} The square length of this vector.\n\t */\n\tgetLengthSquared() {\n\t\treturn this.x * this.x + this.y * this.y + this.z * this.z;\n\t}\n\n\t/**\n\t * Computes the  Euclidean length (straight-line length) from (0, 0, 0) to (x, y, z).\n\t * @returns {number} The length of this vector.\n\t */\n\tgetLength() {\n\t\treturn Math.sqrt(this.getLengthSquared());\n\t}\n\n\t/**\n\t * Converts this vector to a unit vector - that is, sets it equal to a vector\n\t * with the same direction as this one, but with a vector length of `1`.\n\t * @param {number} [thickness=1]\n\t * @returns {Vector3} A reference to this vector.\n\t */\n\tnormalize(thickness = 1) {\n\t\tconst length = this.getLength() || 1;\n\t\tconst invLength = thickness / length;\n\n\t\tthis.x *= invLength;\n\t\tthis.y *= invLength;\n\t\tthis.z *= invLength;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Linearly interpolates between the given vector and this instance, where\n\t * alpha is the percent distance along the line - alpha = 0 will be this\n\t * vector, and alpha = 1 will be the given one.\n\t * @param {Vector3} v - The vector to interpolate towards.\n\t * @param {number} alpha - The interpolation factor, typically in the closed interval `[0, 1]`.\n\t * @returns {Vector3} A reference to this vector.\n\t */\n\tlerp(v, alpha) {\n\t\tthis.x += (v.x - this.x) * alpha;\n\t\tthis.y += (v.y - this.y) * alpha;\n\t\tthis.z += (v.z - this.z) * alpha;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Linearly interpolates between the given vectors, where alpha is the percent\n\t * distance along the line - alpha = 0 will be first vector, and alpha = 1 will\n\t * be the second one. The result is stored in this instance.\n\t * @param {Vector3} v1 - The first vector.\n\t * @param {Vector3} v2 - The second vector.\n\t * @param {number} alpha - The interpolation factor, typically in the closed interval `[0, 1]`.\n\t * @returns {Vector3} A reference to this vector.\n\t */\n\tlerpVectors(v1, v2, alpha) {\n\t\tthis.x = v1.x + (v2.x - v1.x) * alpha;\n\t\tthis.y = v1.y + (v2.y - v1.y) * alpha;\n\t\tthis.z = v1.z + (v2.z - v1.z) * alpha;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Calculates the cross product of the given vector with this instance.\n\t * @param {Vector3} v - The vector to compute the cross product with.\n\t * @returns {Vector3} The result of the cross product.\n\t */\n\tcross(v) {\n\t\treturn this.crossVectors(this, v);\n\t}\n\n\t/**\n\t * Calculates the cross product of the given vectors and stores the result\n\t * in this instance.\n\t * @param {Vector3} a - The first vector.\n\t * @param {Vector3} b - The second vector.\n\t * @returns {Vector3} A reference to this vector.\n\t */\n\tcrossVectors(a, b) {\n\t\tconst ax = a.x, ay = a.y, az = a.z;\n\t\tconst bx = b.x, by = b.y, bz = b.z;\n\n\t\tthis.x = ay * bz - az * by;\n\t\tthis.y = az * bx - ax * bz;\n\t\tthis.z = ax * by - ay * bx;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Reflects this vector off a plane orthogonal to the given normal vector.\n\t * @param {Vector3} normal - The (normalized) normal vector.\n\t * @returns {Vector3} A reference to this vector.\n\t */\n\treflect(normal) {\n\t\treturn this.sub(_vector.copy(normal).multiplyScalar(2 * this.dot(normal)));\n\t}\n\n\t/**\n\t * Scales this vector along the given direction vector by the given scale factor.\n\t * @param {Vector3} direction - The (normalized) direction vector to scale along.\n\t * @param {number} scale - The scale factor.\n\t * @returns {Vector3} A reference to this vector.\n\t */\n\tscaleAlong(direction, scale) {\n\t\t_vector.copy(direction).multiplyScalar(this.dot(direction));\n\t\treturn this.sub(_vector).addScaledVector(_vector, scale);\n\t}\n\n\t/**\n\t * Returns the angle between the given vector and this instance in radians.\n\t * @param {Vector3} v - The vector to compute the angle with.\n\t * @returns {number} The angle in radians.\n\t */\n\tangleTo(v) {\n\t\tconst denominator = Math.sqrt(this.getLengthSquared() * v.getLengthSquared());\n\n\t\tif (denominator === 0) return Math.PI / 2;\n\n\t\tconst theta = this.dot(v) / denominator;\n\n\t\t// clamp, to handle numerical problems\n\n\t\treturn Math.acos(MathUtils.clamp(theta, -1, 1));\n\t}\n\n\t/**\n\t * Computes the distance from the given vector to this instance.\n\t * @param {Vector3} v - The vector to compute the distance to.\n\t * @returns {number} The distance.\n\t */\n\tdistanceTo(v) {\n\t\treturn Math.sqrt(this.distanceToSquared(v));\n\t}\n\n\t/**\n\t * Computes the squared distance from the given vector to this instance.\n\t * If you are just comparing the distance with another distance, you should compare\n\t * the distance squared instead as it is slightly more efficient to calculate.\n\t * @param {Vector3} v - The vector to compute the squared distance to.\n\t * @returns {number} The squared distance.\n\t */\n\tdistanceToSquared(v) {\n\t\tconst dx = this.x - v.x, dy = this.y - v.y, dz = this.z - v.z;\n\t\treturn dx * dx + dy * dy + dz * dz;\n\t}\n\n\t/**\n\t * Sets the vector components from the given spherical coordinates.\n\t * @param {Spherical} s - The spherical coordinates.\n\t * @returns {Vector3} A reference to this vector.\n\t */\n\tsetFromSpherical(s) {\n\t\tconst sinPhiRadius = Math.sin(s.phi) * s.radius;\n\n\t\tthis.x = sinPhiRadius * Math.sin(s.theta);\n\t\tthis.y = Math.cos(s.phi) * s.radius;\n\t\tthis.z = sinPhiRadius * Math.cos(s.theta);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the vector components to the position elements of the\n\t * given transformation matrix.\n\t * @param {Matrix4} m - The 4x4 matrix.\n\t * @returns {Vector3} A reference to this vector.\n\t */\n\tsetFromMatrixPosition(m) {\n\t\tconst e = m.elements;\n\n\t\tthis.x = e[12];\n\t\tthis.y = e[13];\n\t\tthis.z = e[14];\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the vector components to the scale elements of the\n\t * given transformation matrix.\n\t * @param {Matrix4} m - The 4x4 matrix.\n\t * @returns {Vector3} A reference to this vector.\n\t */\n\tsetFromMatrixScale(m) {\n\t\tconst sx = this.setFromMatrixColumn(m, 0).getLength();\n\t\tconst sy = this.setFromMatrixColumn(m, 1).getLength();\n\t\tconst sz = this.setFromMatrixColumn(m, 2).getLength();\n\t\treturn this.set(sx, sy, sz);\n\t}\n\n\t/**\n\t * Sets the vector components from the specified matrix column.\n\t * @param {Matrix4} m - The 4x4 matrix.\n\t * @param {number} index - The column index.\n\t * @returns {Vector3} A reference to this vector.\n\t */\n\tsetFromMatrixColumn(m, index) {\n\t\treturn this.fromArray(m.elements, index * 4);\n\t}\n\n\t/**\n\t * Returns `true` if this vector is equal with the given one.\n\t * @param {Vector3} v - The vector to test for equality.\n\t * @returns {boolean} Whether this vector is equal with the given one.\n\t */\n\tequals(v) {\n\t\treturn ((v.x === this.x) && (v.y === this.y) && (v.z === this.z));\n\t}\n\n\t/**\n\t * Sets this vector's x value to be `array[ offset ]`, y value to be `array[ offset + 1 ]`\n\t * and z value to be `array[ offset + 2 ]`.\n\t * @param {Array<number>} array - An array holding the vector component values.\n\t * @param {number} [offset=0] - The offset into the array.\n\t * @param {boolean} [denormalize=false] - If true, denormalize the values, and array should be a typed array.\n\t * @returns {Vector3} A reference to this vector.\n\t */\n\tfromArray(array, offset = 0, denormalize = false) {\n\t\tlet x = array[offset], y = array[offset + 1], z = array[offset + 2];\n\n\t\tif (denormalize) {\n\t\t\tx = MathUtils.denormalize(x, array);\n\t\t\ty = MathUtils.denormalize(y, array);\n\t\t\tz = MathUtils.denormalize(z, array);\n\t\t}\n\n\t\tthis.x = x;\n\t\tthis.y = y;\n\t\tthis.z = z;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Writes the components of this vector to the given array. If no array is provided,\n\t * the method returns a new instance.\n\t * @param {Array<number>} [array=[]] - The target array holding the vector components.\n\t * @param {number} [offset=0] - Index of the first element in the array.\n\t * @param {boolean} [normalize=false] - if true, normalize the values, and array should be a typed array.\n\t * @returns {Array<number>} The vector components.\n\t */\n\ttoArray(array = [], offset = 0, normalize = false) {\n\t\tlet x = this.x, y = this.y, z = this.z;\n\n\t\tif (normalize) {\n\t\t\tx = MathUtils.normalize(x, array);\n\t\t\ty = MathUtils.normalize(y, array);\n\t\t\tz = MathUtils.normalize(z, array);\n\t\t}\n\n\t\tarray[offset] = x;\n\t\tarray[offset + 1] = y;\n\t\tarray[offset + 2] = z;\n\n\t\treturn array;\n\t}\n\n\t* [Symbol.iterator]() {\n\t\tyield this.x;\n\t\tyield this.y;\n\t\tyield this.z;\n\t}\n\n}\n\n/**\n * This flag can be used for type testing.\n * @readonly\n * @type {boolean}\n * @default true\n */\nVector3.prototype.isVector3 = true;\n\nconst _vector = new Vector3();\n\nexport { Vector3 };"
  },
  {
    "path": "src/math/Vector4.js",
    "content": "import { MathUtils } from './MathUtils.js';\n\n/**\n * The vector 4 class\n */\nclass Vector4 {\n\n\t/**\n\t * @param {number} [x=0] - the x value of this vector.\n\t * @param {number} [y=0] - the y value of this vector.\n\t * @param {number} [z=0] - the z value of this vector.\n\t * @param {number} [w=1] - the w value of this vector.\n\t */\n\tconstructor(x = 0, y = 0, z = 0, w = 1) {\n\t\tthis.x = x;\n\t\tthis.y = y;\n\t\tthis.z = z;\n\t\tthis.w = w;\n\t}\n\n\t/**\n\t * Sets this vector to be the vector linearly interpolated between v1 and v2\n\t * where ratio is the percent distance along the line connecting the two vectors\n\t * - ratio = 0 will be v1, and ratio = 1 will be v2.\n\t * @param {Vector4} v1 - the starting Vector4.\n\t * @param {Vector4} v2 - Vector4 to interpolate towards.\n\t * @param {number} ratio - interpolation factor, typically in the closed interval [0, 1].\n\t * @returns {Vector4}\n\t */\n\tlerpVectors(v1, v2, ratio) {\n\t\treturn this.subVectors(v2, v1).multiplyScalar(ratio).add(v1);\n\t}\n\n\t/**\n\t * Sets the x, y, z and w components of this vector.\n\t * @param {number} x\n\t * @param {number} y\n\t * @param {number} z\n\t * @param {number} w\n\t * @returns {Vector4}\n\t */\n\tset(x = 0, y = 0, z = 0, w = 1) {\n\t\tthis.x = x;\n\t\tthis.y = y;\n\t\tthis.z = z;\n\t\tthis.w = w;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Converts this vector to a unit vector - that is, sets it equal to a vector with the same direction as this one, but length 1.\n\t * @returns {Vector4}\n\t */\n\tnormalize() {\n\t\treturn this.multiplyScalar(1 / (this.getLength() || 1));\n\t}\n\n\t/**\n\t * Multiplies this vector by scalar s.\n\t * @param {number} scalar\n\t * @returns {Vector4}\n\t */\n\tmultiplyScalar(scalar) {\n\t\tthis.x *= scalar;\n\t\tthis.y *= scalar;\n\t\tthis.z *= scalar;\n\t\tthis.w *= scalar;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Calculates the dot product of this vector and v.\n\t * @param {Vector4} v\n\t * @returns {Vector4}\n\t */\n\tdot(v) {\n\t\treturn this.x * v.x + this.y * v.y + this.z * v.z + this.w * v.w;\n\t}\n\n\t/**\n\t * Computes the square of the Euclidean length (straight-line length) from (0, 0, 0, 0) to (x, y, z, w).\n\t * If you are comparing the lengths of vectors, you should compare the length squared instead\n\t * as it is slightly more efficient to calculate.\n\t * @returns {number}\n\t */\n\tgetLengthSquared() {\n\t\treturn this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w;\n\t}\n\n\t/**\n\t * Computes the Euclidean length (straight-line length) from (0, 0, 0, 0) to (x, y, z, w).\n\t * @returns {number}\n\t */\n\tgetLength() {\n\t\treturn Math.sqrt(this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w);\n\t}\n\n\t/**\n\t * Computes the {@link https://en.wikipedia.org/wiki/Taxicab_geometry|Manhattan length}  from (0, 0, 0, 0) to (x, y, z, w).\n\t * @returns {number}\n\t */\n\tgetManhattanLength() {\n\t\treturn Math.abs(this.x) + Math.abs(this.y) + Math.abs(this.z) + Math.abs(this.w);\n\t}\n\n\t/**\n\t * Multiplies this vector by 4 x 4 m.\n\t * @param {Matrix4} m\n\t * @returns {Vector4}\n\t */\n\tapplyMatrix4(m) {\n\t\tconst x = this.x, y = this.y, z = this.z, w = this.w;\n\t\tconst e = m.elements;\n\n\t\tthis.x = e[0] * x + e[4] * y + e[8] * z + e[12] * w;\n\t\tthis.y = e[1] * x + e[5] * y + e[9] * z + e[13] * w;\n\t\tthis.z = e[2] * x + e[6] * y + e[10] * z + e[14] * w;\n\t\tthis.w = e[3] * x + e[7] * y + e[11] * z + e[15] * w;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets this vector to the position represented by the matrix m.\n\t * @param {Matrix4} m\n\t * @returns {Vector4}\n\t */\n\tsetFromMatrixPosition(m) {\n\t\tconst e = m.elements;\n\n\t\tthis.x = e[12];\n\t\tthis.y = e[13];\n\t\tthis.z = e[14];\n\t\tthis.w = e[15];\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Checks for strict equality of this vector and v.\n\t * @param {Vector4} v\n\t * @returns {boolean}\n\t */\n\tequals(v) {\n\t\treturn ((v.x === this.x) && (v.y === this.y) && (v.z === this.z) && (v.w === this.w));\n\t}\n\n\t/**\n\t * Adds v to this vector.\n\t * @param {Vector4} v\n\t * @returns {Vector4}\n\t */\n\tadd(v) {\n\t\tthis.x += v.x;\n\t\tthis.y += v.y;\n\t\tthis.z += v.z;\n\t\tthis.w += v.w;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Multiplies this vector by v.\n\t * @param {Vector4} v\n\t * @returns {Vector4}\n\t */\n\tmultiply(v) {\n\t\tthis.x *= v.x;\n\t\tthis.y *= v.y;\n\t\tthis.z *= v.z;\n\t\tthis.w *= v.w;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets this vector to a - b.\n\t * @param {Vector4} a\n\t * @param {Vector4} b\n\t * @returns {Vector4}\n\t */\n\tsubVectors(a, b) {\n\t\tthis.x = a.x - b.x;\n\t\tthis.y = a.y - b.y;\n\t\tthis.z = a.z - b.z;\n\t\tthis.w = a.w - b.w;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets this vector's x value to be array[ offset + 0 ],\n\t * y value to be array[ offset + 1 ] z value to be array[ offset + 2 ]\n\t * and w value to be array[ offset + 3 ].\n\t * @param {number[]} array - the source array.\n\t * @param {number} [offset=0] - offset into the array.\n\t * @param {boolean} [denormalize=false] - if true, denormalize the values, and array should be a typed array.\n\t * @returns {Vector4}\n\t */\n\tfromArray(array, offset = 0, denormalize = false) {\n\t\tlet x = array[offset], y = array[offset + 1],\n\t\t\tz = array[offset + 2], w = array[offset + 3];\n\n\t\tif (denormalize) {\n\t\t\tx = MathUtils.denormalize(x, array);\n\t\t\ty = MathUtils.denormalize(y, array);\n\t\t\tz = MathUtils.denormalize(z, array);\n\t\t\tw = MathUtils.denormalize(w, array);\n\t\t}\n\n\t\tthis.x = x;\n\t\tthis.y = y;\n\t\tthis.z = z;\n\t\tthis.w = w;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Returns an array [x, y, z, w], or copies x, y, z and w into the provided array.\n\t * @param {number[]} [array] - array to store this vector to. If this is not provided, a new array will be created.\n\t * @param {number} [offset=0] - offset into the array.\n\t * @param {boolean} [normalize=false] - if true, normalize the values, and array should be a typed array.\n\t * @returns {number[]}\n\t */\n\ttoArray(array = [], offset = 0, normalize = false) {\n\t\tlet x = this.x, y = this.y,\n\t\t\tz = this.z, w = this.w;\n\n\t\tif (normalize) {\n\t\t\tx = MathUtils.normalize(x, array);\n\t\t\ty = MathUtils.normalize(y, array);\n\t\t\tz = MathUtils.normalize(z, array);\n\t\t\tw = MathUtils.normalize(w, array);\n\t\t}\n\n\t\tarray[offset] = x;\n\t\tarray[offset + 1] = y;\n\t\tarray[offset + 2] = z;\n\t\tarray[offset + 3] = w;\n\n\t\treturn array;\n\t}\n\n\t/**\n\t * Rounds the x, y, z and w values of this vector to the nearest integer value.\n\t * @returns {Vector4}\n\t */\n\tround() {\n\t\tthis.x = Math.round(this.x);\n\t\tthis.y = Math.round(this.y);\n\t\tthis.z = Math.round(this.z);\n\t\tthis.w = Math.round(this.w);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Returns a new Vector4 with the same x, y, z and w values as this one.\n\t * @returns {Vector4}\n\t */\n\tclone() {\n\t\treturn new Vector4(this.x, this.y, this.z, this.w);\n\t}\n\n\t/**\n\t * Copies the values of the passed Vector4's x, y, z and w properties to this Vector4.\n\t * @param {Vector4} v\n\t * @returns {Vector4}\n\t */\n\tcopy(v) {\n\t\tthis.x = v.x;\n\t\tthis.y = v.y;\n\t\tthis.z = v.z;\n\t\tthis.w = (v.w !== undefined) ? v.w : 1;\n\n\t\treturn this;\n\t}\n\n\t* [Symbol.iterator]() {\n\t\tyield this.x;\n\t\tyield this.y;\n\t\tyield this.z;\n\t\tyield this.w;\n\t}\n\n}\n\n/**\n * This flag can be used for type testing.\n * @readonly\n * @type {boolean}\n * @default true\n */\nVector4.prototype.isVector4 = true;\n\nexport { Vector4 };"
  },
  {
    "path": "src/render/LightingData.js",
    "content": "import { LightingGroup } from './LightingGroup.js';\n\nclass LightingData {\n\n\tconstructor() {\n\t\tthis.lightsArray = [];\n\t\tthis.shadowsNum = 0;\n\n\t\tthis.groupList = [];\n\t\tthis.groupList.push(new LightingGroup()); // create default group 0\n\n\t\tthis._locked = true;\n\t}\n\n\tgetGroup(id) {\n\t\treturn this.groupList[id];\n\t}\n\n\tsetMaxGroupCount(max) {\n\t\tmax = Math.max(1, max); // at least one group\n\n\t\tconst groupList = this.groupList;\n\t\tconst oldMax = groupList.length;\n\n\t\tif (max < oldMax) {\n\t\t\tfor (let i = max; i < oldMax; i++) {\n\t\t\t\tgroupList[i].dispose();\n\t\t\t}\n\t\t\tgroupList.length = max;\n\t\t} else if (max > oldMax) {\n\t\t\tfor (let i = oldMax; i < max; i++) {\n\t\t\t\tgroupList.push(new LightingGroup());\n\t\t\t}\n\t\t}\n\t}\n\n\tbegin() {\n\t\tif (!this._locked) {\n\t\t\tconsole.warn('LightingData: begin() called without end().');\n\t\t}\n\n\t\tthis.lightsArray.length = 0;\n\t\tthis.shadowsNum = 0;\n\n\t\tthis._locked = false;\n\t}\n\n\tcollect(light) {\n\t\tif (this._locked) return;\n\n\t\tthis.lightsArray.push(light);\n\n\t\tif (castShadow(light)) {\n\t\t\tthis.shadowsNum++;\n\t\t}\n\t}\n\n\tend(sceneData) {\n\t\tconst lightsArray = this.lightsArray;\n\t\tconst shadowsNum = this.shadowsNum;\n\t\tconst groupList = this.groupList;\n\n\t\tlightsArray.sort(shadowCastingLightsFirst);\n\n\t\tlet i, l;\n\n\t\tfor (i = 0, l = groupList.length; i < l; i++) {\n\t\t\tgroupList[i].begin();\n\t\t}\n\n\t\tfor (i = 0, l = lightsArray.length; i < l; i++) {\n\t\t\tthis._distribute(lightsArray[i], i < shadowsNum);\n\t\t}\n\n\t\tfor (i = 0, l = groupList.length; i < l; i++) {\n\t\t\tgroupList[i].end(sceneData);\n\t\t}\n\n\t\tthis._locked = true;\n\t}\n\n\t_distribute(light, shadow) {\n\t\tconst groupMask = light.groupMask;\n\t\tconst groupList = this.groupList;\n\n\t\t// optimize for single group\n\t\tif (groupList.length === 1 && (groupMask & 1)) {\n\t\t\tgroupList[0].push(light, shadow);\n\t\t\treturn;\n\t\t}\n\n\t\tfor (let i = 0, l = groupList.length; i < l; i++) {\n\t\t\tconst mask = 1 << i;\n\n\t\t\tif (groupMask < mask) break;\n\n\t\t\tif (groupMask & mask) {\n\t\t\t\tgroupList[i].push(light, shadow);\n\t\t\t}\n\t\t}\n\t}\n\n}\n\nfunction shadowCastingLightsFirst(lightA, lightB) {\n\tconst a = castShadow(lightA) ? 1 : 0;\n\tconst b = castShadow(lightB) ? 1 : 0;\n\treturn b - a;\n}\n\nfunction castShadow(light) {\n\treturn light.shadow && light.castShadow;\n}\n\nexport { LightingData };"
  },
  {
    "path": "src/render/LightingGroup.js",
    "content": "import { Vector3 } from '../math/Vector3.js';\nimport { Matrix4 } from '../math/Matrix4.js';\nimport { RectAreaLight } from '../scenes/lights/RectAreaLight.js';\nimport { EventDispatcher } from '../EventDispatcher.js';\n\nclass LightingGroup extends EventDispatcher {\n\n\tconstructor() {\n\t\tsuper();\n\n\t\tthis.id = _lightingGroupId++;\n\n\t\t// Light collection array\n\n\t\tthis.lights = [];\n\n\t\t// Data caches\n\n\t\tthis.ambient = new Float32Array([0, 0, 0]);\n\n\t\tthis.sh = new Float32Array(27);\n\n\t\tthis.hemisphere = [];\n\n\t\tthis.directional = [];\n\t\tthis.directionalShadow = [];\n\t\tthis.directionalShadowMap = [];\n\t\tthis.directionalShadowDepthMap = [];\n\t\tthis.directionalShadowMatrix = new Float32Array(0);\n\n\t\tthis.point = [];\n\t\tthis.pointShadow = [];\n\t\tthis.pointShadowMap = [];\n\t\tthis.pointShadowMatrix = new Float32Array(0);\n\n\t\tthis.spot = [];\n\t\tthis.spotShadow = [];\n\t\tthis.spotShadowMap = [];\n\t\tthis.spotShadowDepthMap = [];\n\t\tthis.spotShadowMatrix = new Float32Array(0);\n\n\t\tthis.rectArea = [];\n\t\tthis.LTC1 = null;\n\t\tthis.LTC2 = null;\n\n\t\t// Status\n\n\t\tthis.useAmbient = false;\n\t\tthis.useSphericalHarmonics = false;\n\t\tthis.hemisNum = 0;\n\t\tthis.directsNum = 0;\n\t\tthis.pointsNum = 0;\n\t\tthis.spotsNum = 0;\n\t\tthis.rectAreaNum = 0;\n\t\tthis.directShadowNum = 0;\n\t\tthis.pointShadowNum = 0;\n\t\tthis.spotShadowNum = 0;\n\n\t\tthis.totalNum = 0;\n\t\tthis.shadowsNum = 0;\n\n\t\t// Version\n\n\t\tthis.version = 0;\n\t}\n\n\tbegin() {\n\t\tthis.totalNum = 0;\n\t\tthis.shadowsNum = 0;\n\t}\n\n\tpush(light, shadow) {\n\t\tthis.lights[this.totalNum++] = light;\n\n\t\tif (shadow) {\n\t\t\tthis.shadowsNum++;\n\t\t}\n\t}\n\n\tend(sceneData) {\n\t\tthis.lights.length = this.totalNum;\n\n\t\tthis._setupCache(sceneData);\n\n\t\tthis.version++;\n\t}\n\n\tdispose() {\n\t\tthis.dispatchEvent({ type: 'dispose' });\n\t}\n\n\t_setupCache(sceneData) {\n\t\tfor (let i = 0; i < 3; i++) {\n\t\t\tthis.ambient[i] = 0;\n\t\t}\n\t\tfor (let i = 0; i < this.sh.length; i++) {\n\t\t\tthis.sh[i] = 0;\n\t\t}\n\t\tthis.useAmbient = false;\n\t\tthis.useSphericalHarmonics = false;\n\t\tthis.hemisNum = 0;\n\t\tthis.directsNum = 0;\n\t\tthis.pointsNum = 0;\n\t\tthis.spotsNum = 0;\n\t\tthis.rectAreaNum = 0;\n\t\tthis.directShadowNum = 0;\n\t\tthis.pointShadowNum = 0;\n\t\tthis.spotShadowNum = 0;\n\n\t\tthis.LTC1 = null;\n\t\tthis.LTC2 = null;\n\n\t\t// Setup Uniforms\n\n\t\tfor (let i = 0, l = this.lights.length; i < l; i++) {\n\t\t\tconst light = this.lights[i];\n\t\t\tif (light.isAmbientLight) {\n\t\t\t\tthis._doAddAmbientLight(light);\n\t\t\t} else if (light.isHemisphereLight) {\n\t\t\t\tthis._doAddHemisphereLight(light, sceneData);\n\t\t\t} else if (light.isDirectionalLight) {\n\t\t\t\tthis._doAddDirectLight(light, sceneData);\n\t\t\t} else if (light.isPointLight) {\n\t\t\t\tthis._doAddPointLight(light, sceneData);\n\t\t\t} else if (light.isSpotLight) {\n\t\t\t\tthis._doAddSpotLight(light, sceneData);\n\t\t\t} else if (light.isSphericalHarmonicsLight) {\n\t\t\t\tthis._doAddSphericalHarmonicsLight(light);\n\t\t\t} else if (light.isRectAreaLight) {\n\t\t\t\tthis._doAddRectAreaLight(light, sceneData);\n\t\t\t}\n\t\t}\n\n\t\tconst directShadowNum = this.directShadowNum;\n\t\tif (directShadowNum > 0) {\n\t\t\tthis.directionalShadowMap.length = directShadowNum;\n\t\t\tthis.directionalShadowDepthMap.length = directShadowNum;\n\t\t\ttempDirectionalShadowMatrices.length = directShadowNum;\n\t\t\tif (this.directionalShadowMatrix.length !== directShadowNum * 16) {\n\t\t\t\tthis.directionalShadowMatrix = new Float32Array(directShadowNum * 16);\n\t\t\t}\n\t\t\tfor (let i = 0; i < directShadowNum; i++) {\n\t\t\t\ttempDirectionalShadowMatrices[i].toArray(this.directionalShadowMatrix, i * 16);\n\t\t\t}\n\t\t}\n\n\t\tconst pointShadowNum = this.pointShadowNum;\n\t\tif (pointShadowNum > 0) {\n\t\t\tthis.pointShadowMap.length = pointShadowNum;\n\t\t\ttempPointShadowMatrices.length = pointShadowNum;\n\t\t\tif (this.pointShadowMatrix.length !== pointShadowNum * 16) {\n\t\t\t\tthis.pointShadowMatrix = new Float32Array(pointShadowNum * 16);\n\t\t\t}\n\t\t\tfor (let i = 0; i < pointShadowNum; i++) {\n\t\t\t\ttempPointShadowMatrices[i].toArray(this.pointShadowMatrix, i * 16);\n\t\t\t}\n\t\t}\n\n\t\tconst spotShadowNum = this.spotShadowNum;\n\t\tif (spotShadowNum > 0) {\n\t\t\tthis.spotShadowMap.length = spotShadowNum;\n\t\t\tthis.spotShadowDepthMap.length = spotShadowNum;\n\t\t\ttempSpotShadowMatrices.length = spotShadowNum;\n\t\t\tif (this.spotShadowMatrix.length !== spotShadowNum * 16) {\n\t\t\t\tthis.spotShadowMatrix = new Float32Array(spotShadowNum * 16);\n\t\t\t}\n\t\t\tfor (let i = 0; i < spotShadowNum; i++) {\n\t\t\t\ttempSpotShadowMatrices[i].toArray(this.spotShadowMatrix, i * 16);\n\t\t\t}\n\t\t}\n\n\t\tif (this.rectAreaNum > 0) {\n\t\t\tthis.LTC1 = RectAreaLight.LTC1;\n\t\t\tthis.LTC2 = RectAreaLight.LTC2;\n\t\t}\n\t}\n\n\t_doAddAmbientLight(object) {\n\t\tconst intensity = object.intensity;\n\t\tconst color = object.color;\n\n\t\tthis.ambient[0] += color.r * intensity;\n\t\tthis.ambient[1] += color.g * intensity;\n\t\tthis.ambient[2] += color.b * intensity;\n\n\t\tthis.useAmbient = true;\n\t}\n\n\t_doAddSphericalHarmonicsLight(object) {\n\t\tconst intensity = object.intensity;\n\t\tconst sh = object.sh.coefficients;\n\t\tfor (let i = 0; i < sh.length; i += 1) {\n\t\t\tthis.sh[i * 3] += sh[i].x * intensity;\n\t\t\tthis.sh[i * 3 + 1] += sh[i].y * intensity;\n\t\t\tthis.sh[i * 3 + 2] += sh[i].z * intensity;\n\t\t}\n\n\t\tthis.useSphericalHarmonics = true;\n\t}\n\n\t_doAddHemisphereLight(object, sceneData) {\n\t\tconst intensity = object.intensity;\n\t\tconst skyColor = object.color;\n\t\tconst groundColor = object.groundColor;\n\n\t\tconst useAnchorMatrix = sceneData.useAnchorMatrix;\n\n\t\tconst cache = getLightCache(object);\n\n\t\tcache.skyColor[0] = skyColor.r * intensity;\n\t\tcache.skyColor[1] = skyColor.g * intensity;\n\t\tcache.skyColor[2] = skyColor.b * intensity;\n\n\t\tcache.groundColor[0] = groundColor.r * intensity;\n\t\tcache.groundColor[1] = groundColor.g * intensity;\n\t\tcache.groundColor[2] = groundColor.b * intensity;\n\n\t\tconst e = object.worldMatrix.elements;\n\t\tconst direction = helpVector3.set(e[4], e[5], e[6]).normalize();\n\t\tif (useAnchorMatrix) {\n\t\t\tdirection.transformDirection(sceneData.anchorMatrixInverse);\n\t\t}\n\n\t\tdirection.toArray(cache.direction);\n\n\t\tthis.hemisphere[this.hemisNum++] = cache;\n\t}\n\n\t_doAddDirectLight(object, sceneData) {\n\t\tconst intensity = object.intensity;\n\t\tconst color = object.color;\n\n\t\tconst useAnchorMatrix = sceneData.useAnchorMatrix;\n\n\t\tconst cache = getLightCache(object);\n\n\t\tcache.color[0] = color.r * intensity;\n\t\tcache.color[1] = color.g * intensity;\n\t\tcache.color[2] = color.b * intensity;\n\n\t\tconst direction = object.getWorldDirection(helpVector3);\n\t\tif (useAnchorMatrix) {\n\t\t\tdirection.transformDirection(sceneData.anchorMatrixInverse);\n\t\t}\n\n\t\tdirection.multiplyScalar(-1).toArray(cache.direction);\n\n\t\tif (object.castShadow) {\n\t\t\tconst shadow = object.shadow;\n\t\t\tconst shadowCache = getShadowCache(object);\n\n\t\t\tshadowCache.shadowBias[0] = shadow.bias;\n\t\t\tshadowCache.shadowBias[1] = shadow.normalBias;\n\t\t\tshadowCache.shadowMapSize[0] = shadow.mapSize.x;\n\t\t\tshadowCache.shadowMapSize[1] = shadow.mapSize.y;\n\t\t\tshadowCache.shadowParams[0] = shadow.radius;\n\t\t\tshadowCache.shadowParams[1] = shadow.frustumEdgeFalloff;\n\n\t\t\tthis.directionalShadow[this.directShadowNum++] = shadowCache;\n\n\t\t\tshadow.update(object);\n\t\t\tshadow.updateMatrix();\n\t\t\tif (useAnchorMatrix) {\n\t\t\t\tshadow.matrix.multiply(sceneData.anchorMatrix);\n\t\t\t}\n\n\t\t\tthis.directionalShadowMap[this.directsNum] = shadow.map;\n\t\t\tthis.directionalShadowDepthMap[this.directsNum] = shadow.depthMap;\n\t\t\ttempDirectionalShadowMatrices[this.directsNum] = shadow.matrix;\n\t\t}\n\n\t\tthis.directional[this.directsNum++] = cache;\n\t}\n\n\t_doAddPointLight(object, sceneData) {\n\t\tconst intensity = object.intensity;\n\t\tconst color = object.color;\n\t\tconst distance = object.distance;\n\t\tconst decay = object.decay;\n\n\t\tconst useAnchorMatrix = sceneData.useAnchorMatrix;\n\n\t\tconst cache = getLightCache(object);\n\n\t\tcache.color[0] = color.r * intensity;\n\t\tcache.color[1] = color.g * intensity;\n\t\tcache.color[2] = color.b * intensity;\n\n\t\tcache.distance = distance;\n\t\tcache.decay = decay;\n\n\t\tconst position = helpVector3.setFromMatrixPosition(object.worldMatrix);\n\t\tif (useAnchorMatrix) {\n\t\t\tposition.applyMatrix4(sceneData.anchorMatrixInverse);\n\t\t}\n\n\t\tcache.position[0] = position.x;\n\t\tcache.position[1] = position.y;\n\t\tcache.position[2] = position.z;\n\n\t\tif (object.castShadow) {\n\t\t\tconst shadow = object.shadow;\n\t\t\tconst shadowCache = getShadowCache(object);\n\n\t\t\tshadowCache.shadowBias[0] = shadow.bias;\n\t\t\tshadowCache.shadowBias[1] = shadow.normalBias;\n\t\t\tshadowCache.shadowMapSize[0] = shadow.mapSize.x;\n\t\t\tshadowCache.shadowMapSize[1] = shadow.mapSize.y;\n\t\t\tshadowCache.shadowParams[0] = shadow.radius;\n\t\t\tshadowCache.shadowParams[1] = 0;\n\t\t\tshadowCache.shadowCameraRange[0] = shadow.cameraNear;\n\t\t\tshadowCache.shadowCameraRange[1] = shadow.cameraFar;\n\n\t\t\tthis.pointShadow[this.pointShadowNum++] = shadowCache;\n\n\t\t\tshadow.update(object, 0);\n\t\t\tshadow.matrix.makeTranslation(-position.x, -position.y, -position.z); // for point light\n\n\t\t\tthis.pointShadowMap[this.pointsNum] = shadow.map;\n\t\t\ttempPointShadowMatrices[this.pointsNum] = shadow.matrix;\n\t\t}\n\n\t\tthis.point[this.pointsNum++] = cache;\n\t}\n\n\t_doAddSpotLight(object, sceneData) {\n\t\tconst intensity = object.intensity;\n\t\tconst color = object.color;\n\t\tconst distance = object.distance;\n\t\tconst decay = object.decay;\n\n\t\tconst useAnchorMatrix = sceneData.useAnchorMatrix;\n\n\t\tconst cache = getLightCache(object);\n\n\t\tcache.color[0] = color.r * intensity;\n\t\tcache.color[1] = color.g * intensity;\n\t\tcache.color[2] = color.b * intensity;\n\n\t\tcache.distance = distance;\n\t\tcache.decay = decay;\n\n\t\tconst position = helpVector3.setFromMatrixPosition(object.worldMatrix);\n\t\tif (useAnchorMatrix) {\n\t\t\tposition.applyMatrix4(sceneData.anchorMatrixInverse);\n\t\t}\n\n\t\tcache.position[0] = position.x;\n\t\tcache.position[1] = position.y;\n\t\tcache.position[2] = position.z;\n\n\t\tconst direction = object.getWorldDirection(helpVector3);\n\t\tif (useAnchorMatrix) {\n\t\t\tdirection.transformDirection(sceneData.anchorMatrixInverse);\n\t\t}\n\n\t\tdirection.multiplyScalar(-1).toArray(cache.direction);\n\n\t\tconst coneCos = Math.cos(object.angle);\n\t\tconst penumbraCos = Math.cos(object.angle * (1 - object.penumbra));\n\n\t\tcache.coneCos = coneCos;\n\t\tcache.penumbraCos = penumbraCos;\n\n\t\tif (object.castShadow) {\n\t\t\tconst shadow = object.shadow;\n\t\t\tconst shadowCache = getShadowCache(object);\n\n\t\t\tshadowCache.shadowBias[0] = shadow.bias;\n\t\t\tshadowCache.shadowBias[1] = shadow.normalBias;\n\t\t\tshadowCache.shadowMapSize[0] = shadow.mapSize.x;\n\t\t\tshadowCache.shadowMapSize[1] = shadow.mapSize.y;\n\t\t\tshadowCache.shadowParams[0] = shadow.radius;\n\t\t\tshadowCache.shadowParams[1] = shadow.frustumEdgeFalloff;\n\n\t\t\tthis.spotShadow[this.spotShadowNum++] = shadowCache;\n\n\t\t\tshadow.update(object);\n\t\t\tshadow.updateMatrix();\n\t\t\tif (useAnchorMatrix) {\n\t\t\t\tshadow.matrix.multiply(sceneData.anchorMatrix);\n\t\t\t}\n\n\t\t\tthis.spotShadowMap[this.spotsNum] = shadow.map;\n\t\t\tthis.spotShadowDepthMap[this.spotsNum] = shadow.depthMap;\n\t\t\ttempSpotShadowMatrices[this.spotsNum] = shadow.matrix;\n\t\t}\n\n\t\tthis.spot[this.spotsNum++] = cache;\n\t}\n\n\t_doAddRectAreaLight(object, sceneData) {\n\t\tconst intensity = object.intensity;\n\t\tconst color = object.color;\n\t\tconst halfHeight = object.height;\n\t\tconst halfWidth = object.width;\n\n\t\tconst useAnchorMatrix = sceneData.useAnchorMatrix;\n\n\t\tconst cache = getLightCache(object);\n\n\t\tcache.color[0] = color.r * intensity;\n\t\tcache.color[1] = color.g * intensity;\n\t\tcache.color[2] = color.b * intensity;\n\n\t\tconst position = helpVector3.setFromMatrixPosition(object.worldMatrix);\n\t\tif (useAnchorMatrix) {\n\t\t\tposition.applyMatrix4(sceneData.anchorMatrixInverse);\n\t\t}\n\n\t\tcache.position[0] = position.x;\n\t\tcache.position[1] = position.y;\n\t\tcache.position[2] = position.z;\n\n\t\t// extract rotation of light to derive width/height half vectors\n\t\thelpMatrix4.copy(object.worldMatrix);\n\t\tif (useAnchorMatrix) {\n\t\t\thelpMatrix4.premultiply(sceneData.anchorMatrixInverse);\n\t\t}\n\t\thelpMatrix4.extractRotation(helpMatrix4);\n\n\t\tconst halfWidthPos = helpVector3.set(halfWidth * 0.5, 0.0, 0.0);\n\t\thalfWidthPos.applyMatrix4(helpMatrix4);\n\t\tcache.halfWidth[0] = halfWidthPos.x;\n\t\tcache.halfWidth[1] = halfWidthPos.y;\n\t\tcache.halfWidth[2] = halfWidthPos.z;\n\n\t\tconst halfHeightPos = helpVector3.set(0.0, halfHeight * 0.5, 0.0);\n\t\thalfHeightPos.applyMatrix4(helpMatrix4);\n\t\tcache.halfHeight[0] = halfHeightPos.x;\n\t\tcache.halfHeight[1] = halfHeightPos.y;\n\t\tcache.halfHeight[2] = halfHeightPos.z;\n\n\t\tthis.rectArea[this.rectAreaNum++] = cache;\n\t}\n\n}\n\n// Variables\n\nlet _lightingGroupId = 0;\n\nconst helpVector3 = new Vector3();\nconst helpMatrix4 = new Matrix4();\n\nconst tempDirectionalShadowMatrices = [];\nconst tempPointShadowMatrices = [];\nconst tempSpotShadowMatrices = [];\n\n// Light caches\n\nconst lightCaches = new WeakMap();\n\nfunction getLightCache(light) {\n\tif (lightCaches.has(light)) {\n\t\treturn lightCaches.get(light);\n\t}\n\n\tlet cache;\n\n\tif (light.isHemisphereLight) {\n\t\tcache = {\n\t\t\tdirection: new Float32Array(3),\n\t\t\tskyColor: new Float32Array([0, 0, 0]),\n\t\t\tgroundColor: new Float32Array([0, 0, 0])\n\t\t};\n\t} else if (light.isDirectionalLight) {\n\t\tcache = {\n\t\t\tdirection: new Float32Array(3),\n\t\t\tcolor: new Float32Array([0, 0, 0])\n\t\t};\n\t} else if (light.isPointLight) {\n\t\tcache = {\n\t\t\tposition: new Float32Array(3),\n\t\t\tcolor: new Float32Array([0, 0, 0]),\n\t\t\tdistance: 0,\n\t\t\tdecay: 0\n\t\t};\n\t} else if (light.isSpotLight) {\n\t\tcache = {\n\t\t\tposition: new Float32Array(3),\n\t\t\tdirection: new Float32Array(3),\n\t\t\tcolor: new Float32Array([0, 0, 0]),\n\t\t\tdistance: 0,\n\t\t\tconeCos: 0,\n\t\t\tpenumbraCos: 0,\n\t\t\tdecay: 0\n\t\t};\n\t} else if (light.isRectAreaLight) {\n\t\tcache = {\n\t\t\tposition: new Float32Array(3),\n\t\t\tcolor: new Float32Array([0, 0, 0]),\n\t\t\thalfWidth: new Float32Array(3),\n\t\t\thalfHeight: new Float32Array(3)\n\t\t};\n\t}\n\n\n\tlightCaches.set(light, cache);\n\n\treturn cache;\n}\n\n// Shadow caches\n\nconst shadowCaches = new WeakMap();\n\nfunction getShadowCache(light) {\n\tif (shadowCaches.has(light)) {\n\t\treturn shadowCaches.get(light);\n\t}\n\n\tlet cache;\n\n\tif (light.isDirectionalLight) {\n\t\tcache = {\n\t\t\tshadowBias: new Float32Array(2), // [bias, normalBias]\n\t\t\tshadowMapSize: new Float32Array(2), // [width, height]\n\t\t\tshadowParams: new Float32Array(2) // [radius, frustumEdgeFalloff]\n\t\t};\n\t} else if (light.isPointLight) {\n\t\tcache = {\n\t\t\tshadowBias: new Float32Array(2), // [bias, normalBias]\n\t\t\tshadowMapSize: new Float32Array(2), // [width, height]\n\t\t\tshadowParams: new Float32Array(2), // [radius, 0]\n\t\t\tshadowCameraRange: new Float32Array(2) // [cameraNear, cameraFar]\n\t\t};\n\t} else if (light.isSpotLight) {\n\t\tcache = {\n\t\t\tshadowBias: new Float32Array(2), // [bias, normalBias]\n\t\t\tshadowMapSize: new Float32Array(2), // [width, height]\n\t\t\tshadowParams: new Float32Array(2) // [radius, frustumEdgeFalloff]\n\t\t};\n\t}\n\n\tshadowCaches.set(light, cache);\n\n\treturn cache;\n}\n\nexport { LightingGroup };"
  },
  {
    "path": "src/render/PropertyMap.js",
    "content": "/**\n * PropertyMap is a helper class for storing properties on objects.\n * Instead of using a Map, we store the property map directly on the object itself,\n * which provides better lookup performance.\n * This is generally used to store the gpu resources corresponding to objects.\n */\nclass PropertyMap {\n\n\t/**\n\t * Create a new PropertyMap.\n\t * @param {string} prefix - The prefix of the properties name.\n\t */\n\tconstructor(prefix) {\n\t\tthis._key = prefix + '$';\n\t\tthis._count = 0;\n\t}\n\n\t/**\n\t * Get the properties of the object.\n\t * If the object does not have properties, create a new one.\n\t * @param {object} object - The object to get properties.\n\t * @returns {object} - The properties of the object.\n\t */\n\tget(object) {\n\t\tconst key = this._key;\n\t\tlet properties = object[key];\n\t\tif (properties === undefined) {\n\t\t\tproperties = {};\n\t\t\tobject[key] = properties;\n\t\t\tthis._count++;\n\t\t}\n\t\treturn properties;\n\t}\n\n\t/**\n\t * Delete the properties of the object.\n\t * @param {object} object - The object to delete properties.\n\t */\n\tdelete(object) {\n\t\tconst key = this._key;\n\t\tconst properties = object[key];\n\t\tif (properties) {\n\t\t\tthis._count--;\n\t\t\tdelete object[key];\n\t\t}\n\t}\n\n\t/**\n\t * Get the number of objects that have properties.\n\t * @returns {number} - The number of objects that have properties.\n\t */\n\tsize() {\n\t\treturn this._count;\n\t}\n\n}\n\nexport { PropertyMap };"
  },
  {
    "path": "src/render/RenderCollector.js",
    "content": "import { SceneData } from './SceneData.js';\nimport { LightingData } from './LightingData.js';\nimport { RenderStates } from './RenderStates.js';\nimport { RenderQueue } from './RenderQueue.js';\nimport { Sphere } from '../math/Sphere.js';\n\n/**\n * RenderCollector traverses the scene graph and collects all necessary rendering information.\n * It manages scene data, lighting data, and per-camera render states/queues.\n */\nclass RenderCollector {\n\n\t/**\n\t * Creates a new RenderCollector instance.\n\t * In most cases, RenderCollector does not need to be created manually,\n\t * as Scene will automatically create one. See {@link Scene#collector}.\n\t */\n\tconstructor() {\n\t\t// collects scene and lighting data for single scene\n\n\t\tthis.sceneData = new SceneData();\n\t\tthis.lightingData = new LightingData();\n\n\t\t// collects render states and render queues for each camera\n\n\t\tthis._renderStatesMap = new WeakMap();\n\t\tthis._renderQueueMap = new WeakMap();\n\n\t\t// internal states\n\n\t\tthis._lightingNeedsUpdate = true;\n\t\tthis._skeletonVersion = 1;\n\n\t\tconst _boundingSphere = new Sphere();\n\n\t\t/**\n\t\t * Visibility checking function called during scene traversal.\n\t\t * Determines whether an object should be included in the render queue.\n\t\t * Can be overridden to implement custom culling logic (LOD, distance, etc.).\n\t\t * @param {Object3D} object - The object to test for visibility.\n\t\t * @param {Camera} camera - The camera to test against.\n\t\t * @returns {boolean} True if the object should be rendered, false to cull it.\n\t\t * @type {Function}\n\t\t * @example\n\t\t * // Custom visibility check that always returns true\n\t\t * collector.checkVisibility = function(object, camera) {\n\t\t *     return true;\n\t\t * };\n\t\t */\n\t\tthis.checkVisibility = function(object, camera) {\n\t\t\tif (!object.renderable) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tif (!object.frustumCulled || !camera.frustumCulled) {\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\t_boundingSphere.copy(object.geometry.boundingSphere).applyMatrix4(object.worldMatrix);\n\n\t\t\treturn camera.frustum.intersectsSphere(_boundingSphere);\n\t\t};\n\t}\n\n\t/**\n\t * Setting this property to `true` indicates the lighting data needs to be updated.\n\t * Lighting data updates are triggered by the {@link RenderCollector#traverseAndCollect} method.\n\t * @type {boolean}\n\t * @default false\n\t * @param {boolean} value\n\t */\n\tset lightingNeedsUpdate(value) {\n\t\tif (value) {\n\t\t\tthis._lightingNeedsUpdate = true;\n\t\t}\n\t}\n\n\t/**\n\t * Setting this property to `true` indicates all skeletons in the scene should be updated.\n\t * Skeleton updates are triggered by the {@link RenderCollector#traverseAndCollect} method.\n\t * @type {boolean}\n\t * @default false\n\t * @param {boolean} value\n\t */\n\tset skeletonNeedsUpdate(value) {\n\t\tif (value) {\n\t\t\tthis._skeletonVersion++;\n\t\t}\n\t}\n\n\t/**\n\t * Get the RenderStates for the scene and camera.\n\t * If the RenderStates for the camera does not exist, it will be created.\n\t * @param {Camera} camera - The render camera.\n\t * @returns {RenderStates} The target render states.\n\t */\n\tgetRenderStates(camera) {\n\t\tlet renderStates = this._renderStatesMap.get(camera);\n\t\tif (!renderStates) {\n\t\t\t// every camera has its own RenderStates\n\t\t\t// but they share the same scene and lighting data\n\t\t\trenderStates = new RenderStates(this.sceneData, this.lightingData);\n\t\t\tthis._renderStatesMap.set(camera, renderStates);\n\t\t}\n\t\treturn renderStates;\n\t}\n\n\t/**\n\t * Get the RenderQueue for the scene and camera.\n\t * If the RenderQueue for the camera does not exist, it will be created.\n\t * @param {Camera} camera - The render camera.\n\t * @returns {RenderQueue} The target render queue.\n\t */\n\tgetRenderQueue(camera) {\n\t\tlet renderQueue = this._renderQueueMap.get(camera);\n\t\tif (!renderQueue) {\n\t\t\trenderQueue = new RenderQueue();\n\t\t\tthis._renderQueueMap.set(camera, renderQueue);\n\t\t}\n\t\treturn renderQueue;\n\t}\n\n\t/**\n\t * Traverse the scene and collect all renderable objects, lights and skeletons.\n\t * This method will update the RenderQueue and RenderStates for the camera.\n\t * @param {Scene} scene - The scene to traverse.\n\t * @param {Camera} camera - The camera to collect renderable objects for.\n\t * @returns {RenderQueue} The collected render queue.\n\t */\n\ttraverseAndCollect(scene, camera) {\n\t\tconst sceneData = this.sceneData;\n\t\tconst lightingData = this.lightingData;\n\n\t\tconst lightingNeedsUpdate = this._lightingNeedsUpdate;\n\n\t\tconst renderQueue = this.getRenderQueue(camera);\n\n\t\tif (lightingNeedsUpdate) {\n\t\t\tlightingData.begin();\n\t\t}\n\n\t\trenderQueue.begin();\n\n\t\tthis._traverseAndCollect(scene, camera, renderQueue);\n\n\t\trenderQueue.end();\n\n\t\tif (lightingNeedsUpdate) {\n\t\t\tlightingData.end(sceneData);\n\t\t\tthis._lightingNeedsUpdate = false;\n\t\t}\n\n\t\t// Since skeletons may be referenced by different mesh,\n\t\t// it is necessary to collect skeletons in the scene in order to avoid repeated updates.\n\t\t// For IOS platform, we should try to avoid repeated texture updates within one frame,\n\t\t// otherwise the performance will be seriously degraded.\n\t\tconst skeletonVersion = this._skeletonVersion;\n\t\tfor (const skeleton of _skeletons) {\n\t\t\t// Skeleton version ensures uncollected skeletons will be updated in subsequent frames\n\t\t\tif (skeleton._version !== skeletonVersion) {\n\t\t\t\tskeleton.updateBones(sceneData);\n\t\t\t\tskeleton._version = skeletonVersion;\n\t\t\t}\n\t\t}\n\t\t_skeletons.clear();\n\n\t\treturn renderQueue;\n\t}\n\n\t_traverseAndCollect(object, camera, renderQueue) {\n\t\tif (!object.visible) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (object.isMesh) {\n\t\t\tif (this.checkVisibility(object, camera)) {\n\t\t\t\trenderQueue.push(object, camera);\n\t\t\t\tif (object.skeleton) {\n\t\t\t\t\t_skeletons.add(object.skeleton);\n\t\t\t\t}\n\t\t\t}\n\t\t} else if (object.isLight) {\n\t\t\tthis.lightingData.collect(object);\n\t\t}\n\n\t\tconst children = object.children;\n\t\tfor (let i = 0, l = children.length; i < l; i++) {\n\t\t\tthis._traverseAndCollect(children[i], camera, renderQueue);\n\t\t}\n\t}\n\n}\n\nconst _skeletons = new Set();\n\nexport { RenderCollector };"
  },
  {
    "path": "src/render/RenderInfo.js",
    "content": "/**\n * Render info collector.\n * If you want to collect information about the rendering of this frame,\n * pass an instance of RenderInfo to RenderOption when calling renderRenderableList.\n */\nclass RenderInfo {\n\n\tconstructor() {\n\t\tconst render = {\n\t\t\tcalls: 0,\n\t\t\ttriangles: 0,\n\t\t\tlines: 0,\n\t\t\tpoints: 0\n\t\t};\n\n\t\t// A series of function use for collect information.\n\t\tconst updateFuncs = [\n\t\t\tfunction updatePoints(instanceCount, count) {\n\t\t\t\trender.points += instanceCount * count;\n\t\t\t},\n\t\t\tfunction updateLines(instanceCount, count) {\n\t\t\t\trender.lines += instanceCount * (count / 2);\n\t\t\t},\n\t\t\tfunction updateLineLoop(instanceCount, count) {\n\t\t\t\trender.lines += instanceCount * count;\n\t\t\t},\n\t\t\tfunction updateLineStrip(instanceCount, count) {\n\t\t\t\trender.lines += instanceCount * (count - 1);\n\t\t\t},\n\t\t\tfunction updateTriangles(instanceCount, count) {\n\t\t\t\trender.triangles += instanceCount * (count / 3);\n\t\t\t},\n\t\t\tfunction updateTriangleStrip(instanceCount, count) {\n\t\t\t\trender.triangles += instanceCount * (count - 2);\n\t\t\t},\n\t\t\tfunction updateTriangleFan(instanceCount, count) {\n\t\t\t\trender.triangles += instanceCount * (count - 2);\n\t\t\t}\n\t\t];\n\n\t\t/**\n\t\t * Method of update render info.\n\t\t * This method will be executed after each draw.\n\t\t * @private\n\t\t * @param {number} count\n\t\t * @param {DRAW_MODE} mode\n\t\t * @param {number} instanceCount\n\t\t */\n\t\tthis.update = function(count, mode, instanceCount) {\n\t\t\trender.calls++;\n\t\t\tupdateFuncs[mode](instanceCount, count);\n\t\t};\n\n\t\t/**\n\t\t * Reset the render info.\n\t\t * Call this method whenever you have finished to render a single frame.\n\t\t */\n\t\tthis.reset = function() {\n\t\t\trender.calls = 0;\n\t\t\trender.triangles = 0;\n\t\t\trender.lines = 0;\n\t\t\trender.points = 0;\n\t\t};\n\n\t\t/**\n\t\t * A series of statistical information of rendering process, include calls, triangles, lines and points.\n\t\t * @type {object}\n\t\t */\n\t\tthis.render = render;\n\t}\n\n}\n\nexport { RenderInfo };"
  },
  {
    "path": "src/render/RenderQueue.js",
    "content": "import { RenderQueueLayer } from './RenderQueueLayer.js';\nimport { Vector4 } from '../math/Vector4.js';\n\n/**\n * RenderQueue is used to collect all renderable items, lights and skeletons from the scene.\n * Renderable items will be dispatched to the corresponding RenderQueueLayer according to the object's renderLayer property.\n */\nclass RenderQueue {\n\n\tconstructor() {\n\t\tthis.layerMap = new Map();\n\t\tthis.layerList = [];\n\n\t\tthis.skeletons = new Set();\n\n\t\t// to optimize the performance of the next push, cache the last layer used\n\t\tthis._lastLayer = this.createLayer(0);\n\t}\n\n\tbegin() {\n\t\tfor (let i = 0, l = this.layerList.length; i < l; i++) {\n\t\t\tthis.layerList[i].begin();\n\t\t}\n\n\t\tthis.skeletons.clear();\n\t}\n\n\tend() {\n\t\tfor (let i = 0, l = this.layerList.length; i < l; i++) {\n\t\t\tthis.layerList[i].end();\n\t\t\tthis.layerList[i].sort();\n\t\t}\n\t}\n\n\tpush(object, camera) {\n\t\t// collect skeleton if exists\n\t\tif (object.skeleton) {\n\t\t\tthis.skeletons.add(object.skeleton);\n\t\t}\n\n\t\t_vec4.setFromMatrixPosition(object.worldMatrix)\n\t\t\t.applyMatrix4(camera.projectionViewMatrix);\n\n\t\tconst clipZ = _vec4.z;\n\n\t\tconst layerId = object.renderLayer || 0;\n\n\t\tlet layer = this._lastLayer;\n\t\tif (layer.id !== layerId) {\n\t\t\tlayer = this.layerMap.get(layerId);\n\t\t\tif (!layer) {\n\t\t\t\tlayer = this.createLayer(layerId);\n\t\t\t}\n\t\t\tthis._lastLayer = layer;\n\t\t}\n\n\t\tif (Array.isArray(object.material)) {\n\t\t\tconst groups = object.geometry.groups;\n\n\t\t\tfor (let i = 0; i < groups.length; i++) {\n\t\t\t\tconst group = groups[i];\n\t\t\t\tconst groupMaterial = object.material[group.materialIndex];\n\t\t\t\tif (groupMaterial) {\n\t\t\t\t\tlayer.addRenderable(object, object.geometry, groupMaterial, clipZ, group);\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tlayer.addRenderable(object, object.geometry, object.material, clipZ);\n\t\t}\n\t}\n\n\t/**\n\t * Set a render queue layer.\n\t * @param {number} id - The layer id.\n\t * @param {RenderQueueLayer} layer - The layer to set.\n\t */\n\tsetLayer(id, layer) {\n\t\tthis.layerMap.set(id, layer);\n\t\tthis.layerList.push(layer);\n\t\tthis.layerList.sort(sortLayer);\n\t}\n\n\t/**\n\t * Create and set a render queue layer.\n\t * @param {number} id - The layer id.\n\t * @returns {RenderQueueLayer}\n\t */\n\tcreateLayer(id) {\n\t\tconst layer = new RenderQueueLayer(id);\n\t\tthis.setLayer(id, layer);\n\t\treturn layer;\n\t}\n\n\t/**\n\t * Get the render queue layer.\n\t * @param {number} id - The layer id.\n\t * @returns {RenderQueueLayer}\n\t */\n\tgetLayer(id) {\n\t\treturn this.layerMap.get(id);\n\t}\n\n\t/**\n\t * Remove the render queue layer.\n\t * @param {number} id - The layer id.\n\t */\n\tremoveLayer(id) {\n\t\tconst layer = this.layerMap.get(id);\n\n\t\tif (layer) {\n\t\t\tthis.layerMap.delete(id);\n\n\t\t\tconst index = this.layerList.indexOf(layer);\n\t\t\tif (index !== -1) {\n\t\t\t\tthis.layerList.splice(index, 1);\n\t\t\t}\n\n\t\t\tif (this._lastLayer === id) {\n\t\t\t\tthis._lastLayer = null;\n\t\t\t}\n\t\t}\n\t}\n\n}\n\nconst _vec4 = new Vector4();\n\nfunction sortLayer(a, b) {\n\treturn a.id - b.id;\n}\n\nexport { RenderQueue };"
  },
  {
    "path": "src/render/RenderQueueLayer.js",
    "content": "/**\n * RenderQueueLayer holds all the renderable objects.\n * Now has an opaque list and a transparent list.\n */\nclass RenderQueueLayer {\n\n\t/**\n\t * @param {number} id - layer id.\n\t */\n\tconstructor(id) {\n\t\tthis.id = id;\n\n\t\tthis.opaque = [];\n\t\tthis.opaqueCount = 0;\n\n\t\tthis.transparent = [];\n\t\tthis.transparentCount = 0;\n\n\t\tthis._cache = [];\n\t\tthis._cacheIndex = 0;\n\t\tthis._lastCacheIndex = 0;\n\n\t\tthis.opaqueSortCompareFn = defaultOpaqueSortCompare;\n\t\tthis.transparentSortCompareFn = defaultTransparentSortCompare;\n\t}\n\n\tbegin() {\n\t\tthis._cacheIndex = 0;\n\n\t\tthis.opaqueCount = 0;\n\t\tthis.transparentCount = 0;\n\t}\n\n\tend() {\n\t\tthis.opaque.length = this.opaqueCount;\n\t\tthis.transparent.length = this.transparentCount;\n\n\t\t// Clear references from inactive renderables in the list\n\t\tconst cacheIndex = this._cacheIndex,\n\t\t\tlastCacheIndex = this._lastCacheIndex;\n\t\tif (lastCacheIndex > cacheIndex) {\n\t\t\tconst cache = this._cache;\n\t\t\tfor (let i = cacheIndex; i < lastCacheIndex; i++) {\n\t\t\t\tconst renderable = cache[i];\n\t\t\t\trenderable.object = null;\n\t\t\t\trenderable.geometry = null;\n\t\t\t\trenderable.material = null;\n\t\t\t\trenderable.group = null;\n\t\t\t}\n\t\t}\n\t\tthis._lastCacheIndex = cacheIndex;\n\t}\n\n\taddRenderable(object, geometry, material, z, group) {\n\t\tconst cache = this._cache;\n\n\t\tlet renderable = cache[this._cacheIndex];\n\n\t\tif (renderable === undefined) {\n\t\t\trenderable = {\n\t\t\t\tobject: object,\n\t\t\t\tgeometry: geometry,\n\t\t\t\tmaterial: material,\n\t\t\t\tz: z,\n\t\t\t\trenderOrder: object.renderOrder,\n\t\t\t\tgroup: group\n\t\t\t};\n\t\t\tcache[this._cacheIndex] = renderable;\n\t\t} else {\n\t\t\trenderable.object = object;\n\t\t\trenderable.geometry = geometry;\n\t\t\trenderable.material = material;\n\t\t\trenderable.z = z;\n\t\t\trenderable.renderOrder = object.renderOrder;\n\t\t\trenderable.group = group;\n\t\t}\n\n\t\tif (material.transparent) {\n\t\t\tthis.transparent[this.transparentCount] = renderable;\n\t\t\tthis.transparentCount++;\n\t\t} else {\n\t\t\tthis.opaque[this.opaqueCount] = renderable;\n\t\t\tthis.opaqueCount++;\n\t\t}\n\n\t\tthis._cacheIndex++;\n\t}\n\n\tsort() {\n\t\tthis.opaque.sort(this.opaqueSortCompareFn);\n\t\tquickSort(this.transparent, 0, this.transparent.length, this.transparentSortCompareFn);\n\t}\n\n}\n\nfunction defaultOpaqueSortCompare(a, b) {\n\tif (a.renderOrder !== b.renderOrder) {\n\t\treturn a.renderOrder - b.renderOrder;\n\t} else if (a.material.id !== b.material.id) {\n\t\treturn a.material.id - b.material.id;\n\t} else {\n\t\treturn a.id - b.id;\n\t}\n}\n\nfunction defaultTransparentSortCompare(a, b) {\n\tif (a.renderOrder !== b.renderOrder) {\n\t\treturn a.renderOrder - b.renderOrder;\n\t} else if (a.z !== b.z) {\n\t\treturn b.z - a.z;\n\t} else if (a.material.id !== b.material.id) {\n\t\t// fix Unstable sort below chrome version 7.0\n\t\t// if render same object with different materials\n\t\treturn a.material.id - b.material.id;\n\t} else {\n\t\treturn a.id - b.id;\n\t}\n}\n\n// Reference github.com/ant-galaxy/oasis-engine/blob/main/packages/core/src/RenderPipeline/RenderQueue.ts\n// quickSort is faster when sorting highly randomized arrays,\n// but for sorting lowly randomized arrays, Array.prototype.sort is faster,\n// so quickSort is more suitable for transparent list sorting.\n\nfunction quickSort(a, from, to, compareFunc) {\n\twhile (true) {\n\t\t// Insertion sort is faster for short arrays.\n\t\tif (to - from <= 10) {\n\t\t\tinsertionSort(a, from, to, compareFunc);\n\t\t\treturn;\n\t\t}\n\t\tconst third_index = (from + to) >> 1;\n\t\t// Find a pivot as the median of first, last and middle element.\n\t\tlet v0 = a[from];\n\t\tlet v1 = a[to - 1];\n\t\tlet v2 = a[third_index];\n\t\tconst c01 = compareFunc(v0, v1);\n\t\tif (c01 > 0) {\n\t\t\tconst tmp = v0;\n\t\t\tv0 = v1;\n\t\t\tv1 = tmp;\n\t\t}\n\t\tconst c02 = compareFunc(v0, v2);\n\t\tif (c02 >= 0) {\n\t\t\tconst tmp = v0;\n\t\t\tv0 = v2;\n\t\t\tv2 = v1;\n\t\t\tv1 = tmp;\n\t\t} else {\n\t\t\tconst c12 = compareFunc(v1, v2);\n\t\t\tif (c12 > 0) {\n\t\t\t\tconst tmp = v1;\n\t\t\t\tv1 = v2;\n\t\t\t\tv2 = tmp;\n\t\t\t}\n\t\t}\n\t\ta[from] = v0;\n\t\ta[to - 1] = v2;\n\t\tconst pivot = v1;\n\t\tlet low_end = from + 1; // Upper bound of elements lower than pivot.\n\t\tlet high_start = to - 1; // Lower bound of elements greater than pivot.\n\t\ta[third_index] = a[low_end];\n\t\ta[low_end] = pivot;\n\n\t\t// From low_end to i are elements equal to pivot.\n\t\t// From i to high_start are elements that haven't been compared yet.\n\t\tpartition: for (let i = low_end + 1; i < high_start; i++) {\n\t\t\tlet element = a[i];\n\t\t\tlet order = compareFunc(element, pivot);\n\t\t\tif (order < 0) {\n\t\t\t\ta[i] = a[low_end];\n\t\t\t\ta[low_end] = element;\n\t\t\t\tlow_end++;\n\t\t\t} else if (order > 0) {\n\t\t\t\tdo {\n\t\t\t\t\thigh_start--;\n\t\t\t\t\tif (high_start == i) break partition;\n\t\t\t\t\tconst top_elem = a[high_start];\n\t\t\t\t\torder = compareFunc(top_elem, pivot);\n\t\t\t\t} while (order > 0);\n\t\t\t\ta[i] = a[high_start];\n\t\t\t\ta[high_start] = element;\n\t\t\t\tif (order < 0) {\n\t\t\t\t\telement = a[i];\n\t\t\t\t\ta[i] = a[low_end];\n\t\t\t\t\ta[low_end] = element;\n\t\t\t\t\tlow_end++;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (to - high_start < low_end - from) {\n\t\t\tquickSort(a, high_start, to, compareFunc);\n\t\t\tto = low_end;\n\t\t} else {\n\t\t\tquickSort(a, from, low_end, compareFunc);\n\t\t\tfrom = high_start;\n\t\t}\n\t}\n}\n\nfunction insertionSort(a, from, to, compareFunc) {\n\tfor (let i = from + 1; i < to; i++) {\n\t\tlet j;\n\t\tconst element = a[i];\n\t\tfor (j = i - 1; j >= from; j--) {\n\t\t\tconst tmp = a[j];\n\t\t\tconst order = compareFunc(tmp, element);\n\t\t\tif (order > 0) {\n\t\t\t\ta[j + 1] = tmp;\n\t\t\t} else {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\ta[j + 1] = element;\n\t}\n}\n\nexport { RenderQueueLayer };"
  },
  {
    "path": "src/render/RenderStates.js",
    "content": "import { TEXEL_ENCODING_TYPE } from '../const.js';\nimport { Matrix4 } from '../math/Matrix4.js';\nimport { Vector3 } from '../math/Vector3.js';\nimport { Vector4 } from '../math/Vector4.js';\n\nfunction _isPerspectiveMatrix(m) {\n\treturn m.elements[11] === -1.0;\n}\n\nlet _cameraDataId = 0;\n\n/**\n * RenderStates collect all render states about scene and camera.\n */\nclass RenderStates {\n\n\tconstructor(sceneData, lightingData) {\n\t\tthis.scene = sceneData;\n\t\tthis.lighting = lightingData;\n\n\t\tthis.camera = {\n\t\t\tid: _cameraDataId++,\n\t\t\tversion: 0,\n\t\t\tnear: 0,\n\t\t\tfar: 0,\n\t\t\tposition: new Vector3(),\n\t\t\tlogDepthCameraNear: 0,\n\t\t\tlogDepthBufFC: 0,\n\t\t\tviewMatrix: new Matrix4(),\n\t\t\tprojectionMatrix: new Matrix4(),\n\t\t\tprojectionViewMatrix: new Matrix4(),\n\t\t\trect: new Vector4(0, 0, 1, 1)\n\t\t};\n\n\t\tthis.gammaFactor = 2.0;\n\t\tthis.outputEncoding = TEXEL_ENCODING_TYPE.LINEAR;\n\t}\n\n\t/**\n\t * Update render states about camera.\n\t * @param {Camera} camera\n\t */\n\tupdateCamera(camera) {\n\t\tconst sceneData = this.scene;\n\t\tconst cameraData = this.camera;\n\t\tconst projectionMatrix = camera.projectionMatrix;\n\n\t\tlet cameraNear = 0, cameraFar = 0;\n\t\tif (_isPerspectiveMatrix(projectionMatrix)) {\n\t\t\tcameraNear = projectionMatrix.elements[14] / (projectionMatrix.elements[10] - 1);\n\t\t\tcameraFar = projectionMatrix.elements[14] / (projectionMatrix.elements[10] + 1);\n\t\t} else {\n\t\t\tcameraNear = (projectionMatrix.elements[14] + 1) / projectionMatrix.elements[10];\n\t\t\tcameraFar = (projectionMatrix.elements[14] - 1) / projectionMatrix.elements[10];\n\t\t}\n\n\t\tcameraData.near = cameraNear;\n\t\tcameraData.far = cameraFar;\n\n\t\tif (sceneData.logarithmicDepthBuffer) {\n\t\t\tcameraData.logDepthCameraNear = cameraNear;\n\t\t\tcameraData.logDepthBufFC = 2.0 / (Math.log(cameraFar - cameraNear + 1.0) * Math.LOG2E);\n\t\t} else {\n\t\t\tcameraData.logDepthCameraNear = 0;\n\t\t\tcameraData.logDepthBufFC = 0;\n\t\t}\n\n\t\tcameraData.position.setFromMatrixPosition(camera.worldMatrix);\n\t\tif (sceneData.useAnchorMatrix) {\n\t\t\tcameraData.position.applyMatrix4(sceneData.anchorMatrixInverse);\n\t\t}\n\n\t\tcameraData.viewMatrix.copy(camera.viewMatrix);\n\t\tif (sceneData.useAnchorMatrix) {\n\t\t\tcameraData.viewMatrix.multiply(sceneData.anchorMatrix);\n\t\t}\n\n\t\tcameraData.projectionMatrix.copy(projectionMatrix);\n\t\tcameraData.projectionViewMatrix.copy(projectionMatrix).multiply(cameraData.viewMatrix);\n\n\t\tcameraData.rect.copy(camera.rect);\n\n\t\tcameraData.version++;\n\n\t\tthis.gammaFactor = camera.gammaFactor;\n\t\tthis.outputEncoding = camera.outputEncoding;\n\t}\n\n}\n\nexport { RenderStates };"
  },
  {
    "path": "src/render/SceneData.js",
    "content": "import { Matrix4 } from '../math/Matrix4.js';\nimport { Plane } from '../math/Plane.js';\n\nconst _plane_1 = new Plane();\n\nlet _sceneDataId = 0;\n\n/**\n * SceneData collect all render states about scene, Including lights.\n */\nclass SceneData {\n\n\tconstructor() {\n\t\tthis.id = _sceneDataId++;\n\t\tthis.version = 0;\n\n\t\tthis.useAnchorMatrix = false;\n\t\tthis.anchorMatrix = new Matrix4();\n\t\tthis.anchorMatrixInverse = new Matrix4();\n\n\t\tthis.disableShadowSampler = false;\n\n\t\tthis.logarithmicDepthBuffer = false;\n\n\t\tthis.fog = null;\n\t\tthis.environment = null;\n\t\tthis.envDiffuseIntensity = 1;\n\t\tthis.envSpecularIntensity = 1;\n\t\tthis.clippingPlanesData = new Float32Array([]);\n\t\tthis.numClippingPlanes = 0;\n\t}\n\n\t/**\n\t * Update scene data.\n\t * @param {Scene} scene\n\t */\n\tupdate(scene) {\n\t\tthis.useAnchorMatrix = !scene.anchorMatrix.isIdentity();\n\t\tthis.anchorMatrix.copy(scene.anchorMatrix);\n\t\tthis.anchorMatrixInverse.copy(scene.anchorMatrix).invert();\n\n\t\tthis.disableShadowSampler = scene.disableShadowSampler;\n\n\t\tthis.logarithmicDepthBuffer = scene.logarithmicDepthBuffer;\n\n\t\tthis.fog = scene.fog;\n\n\t\tthis.environment = scene.environment;\n\t\tthis.envDiffuseIntensity = scene.envDiffuseIntensity;\n\t\tthis.envSpecularIntensity = scene.envSpecularIntensity;\n\n\t\tif (this.clippingPlanesData.length < scene.clippingPlanes.length * 4) {\n\t\t\tthis.clippingPlanesData = new Float32Array(scene.clippingPlanes.length * 4);\n\t\t}\n\t\tthis.setClippingPlanesData(scene.clippingPlanes, this.clippingPlanesData);\n\t\tthis.numClippingPlanes = scene.clippingPlanes.length;\n\n\t\tthis.version++;\n\t}\n\n\tsetClippingPlanesData(clippingPlanes, clippingPlanesData) {\n\t\tfor (let i = 0; i < clippingPlanes.length; i++) {\n\t\t\t_plane_1.copy(clippingPlanes[i]);\n\t\t\tif (this.useAnchorMatrix) {\n\t\t\t\t_plane_1.applyMatrix4(this.anchorMatrixInverse);\n\t\t\t}\n\t\t\tclippingPlanesData[i * 4 + 0] = _plane_1.normal.x;\n\t\t\tclippingPlanesData[i * 4 + 1] = _plane_1.normal.y;\n\t\t\tclippingPlanesData[i * 4 + 2] = _plane_1.normal.z;\n\t\t\tclippingPlanesData[i * 4 + 3] = _plane_1.constant;\n\t\t}\n\n\t\treturn clippingPlanesData;\n\t}\n\n}\n\nexport { SceneData };"
  },
  {
    "path": "src/render/ThinRenderer.js",
    "content": "import { Vector3 } from '../math/Vector3.js';\nimport { Vector2 } from '../math/Vector2.js';\n\nlet _rendererId = 0;\n\n/**\n * Base class for WebGL and WebGPU renderers.\n */\nclass ThinRenderer {\n\n\tconstructor() {\n\t\t/**\n\t\t * The unique id of this renderer.\n\t\t * This will be incremented when the context is lost and restored.\n\t\t * @readonly\n\t\t * @type {number}\n\t\t */\n\t\tthis.id = 0; // assigned in init method\n\n\t\t/**\n\t\t * The Rendering Context privided by canvas.\n\t\t * @type {WebGLRenderingContext|WebGPURenderingContext}\n\t\t */\n\t\tthis.context = null; // assigned in init method\n\n\t\t/**\n\t\t * An object containing details about the capabilities of the current RenderingContext.\n\t\t * @type {object}\n\t\t */\n\t\tthis.capabilities = {};\n\n\t\t/**\n\t\t * The shader compiler options.\n\t\t * @type {object}\n\t\t * @property {boolean} checkErrors - Whether to use error checking when compiling shaders, defaults to true.\n\t\t * @property {boolean} compileAsynchronously - Whether to compile shaders asynchronously, defaults to false.\n\t\t * @property {number} maxMaterialPrograms - The maximum number of programs that one material can cache, defaults to 5.\n\t\t */\n\t\tthis.shaderCompileOptions = {\n\t\t\tcheckErrors: true,\n\t\t\tcompileAsynchronously: false,\n\t\t\tmaxMaterialPrograms: 5\n\t\t};\n\n\t\t/**\n\t\t * The lighting options.\n\t\t * @type {object}\n\t\t * @property {object} clustered - The clustered lighting options.\n\t\t * @property {boolean} clustered.enabled - Whether to use clustered lighting, defaults to false.\n\t\t * @property {number} clustered.maxClusterLights - The maximum number of lights, defaults to 1024.\n\t\t * @property {boolean} clustered.useFloatPrecision - Whether the lights are stored as floats, defaults to false (half floats).\n\t\t * @property {Vector3} clustered.gridDimensions - The number of cells in each dimension, defaults to Vector3(16, 8, 32).\n\t\t * @property {number} clustered.maxLightsPerCell - The maximum number of lights per cell, defaults to 256.\n\t\t * @property {Vector2} clustered.zClip - The near and far clipping planes for the cells, defaults to Vector2(-1, -1) (clip based on camera near and far planes).\n\t\t * @property {number} clustered.version - The version of the clustered lighting options. If the options change, the version should be incremented, defaults to 0.\n\t\t */\n\t\tthis.lightingOptions = {\n\t\t\tclustered: {\n\t\t\t\tenabled: false,\n\t\t\t\tmaxClusterLights: 1024,\n\t\t\t\tuseFloatPrecision: false,\n\t\t\t\tgridDimensions: new Vector3(16, 8, 32),\n\t\t\t\tmaxLightsPerCell: 256,\n\t\t\t\tzClip: new Vector2(-1, -1),\n\t\t\t\tversion: 0\n\t\t\t}\n\t\t};\n\n\t\tthis._passInfo = {\n\t\t\t// Whether the renderer is in the process of pass rendering.\n\t\t\t// If true, means that the beginRender method has been called but the endRender method has not been called.\n\t\t\tenabled: false,\n\t\t\t// The pass rendering count\n\t\t\tcount: 0\n\t\t};\n\t}\n\n\t/**\n\t * Initialize this renderer with a rendering context.\n\t * This method is called automatically by {@link WebGLRenderer} constructor when a context is provided.\n\t * For WebGPURenderer, you must call this method manually and wait for the promise to resolve.\n\t * @param {WebGLRenderingContext|WebGPURenderingContext} context - The rendering context.\n\t * @param {object} [options] - The options for initializing this renderer.\n\t * @returns {Promise<ThinRenderer>} A promise that resolves when initialization completes.\n\t */\n\tinit(context, options = {}) {}\n\n\t/**\n\t * Begin rendering.\n\t * @param {RenderTargetBase} renderTarget - The render target to render to.\n\t */\n\tbeginRender(renderTarget) {\n\t\tthis._passInfo.enabled = true;\n\t}\n\n\t/**\n\t * End rendering.\n\t */\n\tendRender() {\n\t\tthis._passInfo.enabled = false;\n\t\tthis._passInfo.count++;\n\t}\n\n\t/**\n\t * @typedef {object} RenderOptions - The render options for renderRenderableItem and renderRenderableList methods.\n\t * @property {Function} getGeometry - (Optional) Get renderable geometry.\n\t * @property {Function} getMaterial - (Optional) Get renderable material.\n\t * @property {Function} beforeRender - (Optional) Before render each renderable item.\n\t * @property {Function} afterRender - (Optional) After render each renderable item.\n\t * @property {Function} ifRender - (Optional) If render the renderable item.\n\t * @property {RenderInfo} renderInfo - (Optional) Render info for collect information.\n\t * @property {boolean} onlyCompile - (Optional) Only compile shader, do not render.\n\t */\n\n\t/**\n\t * Render a single renderable item with render states.\n\t * @param {object} renderable - The renderable item.\n\t * @param {RenderStates} renderStates - The render states.\n\t * @param {RenderOptions} [options] - The render options for this render task.\n\t */\n\trenderRenderableItem(renderable, renderStates, options) {}\n\n\t/**\n\t * Render a single renderable list with render states.\n\t * @param {Array} renderables - Array of renderable.\n\t * @param {RenderStates} renderStates - Render states.\n\t * @param {RenderOptions} [options] - The render options for this render task.\n\t */\n\trenderRenderableList(renderables, renderStates, options = {}) {\n\t\tfor (let i = 0, l = renderables.length; i < l; i++) {\n\t\t\tthis.renderRenderableItem(renderables[i], renderStates, options);\n\t\t}\n\t}\n\n\t/**\n\t * Render a scene with a particular camera.\n\t * This method will render all layers in scene's RenderQueue by default.\n\t * If you need a customized rendering process, it is recommended to use renderRenderableList method.\n\t * @param {Scene} scene - The scene to render.\n\t * @param {Camera} camera - The camera used to render the scene.\n\t * @param {RenderTargetBase} renderTarget - The render target to render to.\n\t * @param {RenderOptions} [options] - The render options for this scene render task.\n\t */\n\trenderScene(scene, camera, renderTarget, options = {}) {\n\t\t// Compatibility handling: if there are only 3 arguments,\n\t\t// and the third is not a RenderTarget, treat it as options.\n\t\tif (arguments.length === 3 && (!renderTarget || !renderTarget.isRenderTarget)) {\n\t\t\toptions = renderTarget;\n\t\t\trenderTarget = null;\n\t\t}\n\n\t\tconst renderStates = scene.getRenderStates(camera);\n\t\tconst renderQueue = scene.getRenderQueue(camera);\n\n\t\tthis.beginRender(renderTarget);\n\n\t\tlet renderQueueLayer;\n\t\tfor (let i = 0, l = renderQueue.layerList.length; i < l; i++) {\n\t\t\trenderQueueLayer = renderQueue.layerList[i];\n\t\t\tthis.renderRenderableList(renderQueueLayer.opaque, renderStates, options);\n\t\t\tthis.renderRenderableList(renderQueueLayer.transparent, renderStates, options);\n\t\t}\n\n\t\tthis.endRender();\n\t}\n\n\t/**\n\t * Copy a frame buffer to another.\n\t * This copy process can be used to perform multi-sampling (MSAA).\n\t * @param {RenderTargetBase} read - The source renderTarget.\n\t * @param {RenderTargetBase} draw - The destination renderTarget.\n\t * @param {boolean} [color=true] - Copy color buffer.\n\t * @param {boolean} [depth=true] - Copy depth buffer.\n\t * @param {boolean} [stencil=true] - Copy stencil buffer.\n\t */\n\tblitRenderTarget(read, draw, color = true, depth = true, stencil = true) {}\n\n\t/**\n\t * Generate mipmaps for the texture you pass in.\n\t * @param {TextureBase} texture - The texture to update.\n\t */\n\tgenerateMipmaps(texture) {}\n\n\t/**\n\t * Read pixels from a texture.\n\t * This is an asynchronous operation. See {@link ThinRenderer#readTexturePixelsSync} for the synchronous version.\n\t * @param {TextureBase} texture - The texture to read from.\n\t * @param {number} x - The x coordinate of the rectangle to read from.\n\t * @param {number} y - The y coordinate of the rectangle to read from.\n\t * @param {number} width - The width of the rectangle to read from.\n\t * @param {number} height - The height of the rectangle to read from.\n\t * @param {TypedArray} buffer - The buffer to store the pixel data.\n\t * @param {number} [zIndex=0] - For CubeTexture, the face index; for Texture3D/TextureArray, the layer/slice index.\n\t * @param {number} [mipLevel=0] - The mip level to read.\n\t * @returns {Promise<TypedArray>} A promise that resolves with the passed in buffer after it has been filled with the pixel data.\n\t */\n\treadTexturePixels(texture, x, y, width, height, buffer, zIndex = 0, mipLevel = 0) {}\n\n\t/**\n\t * Read pixels from a texture.\n\t * This is a synchronous operation. See {@link ThinRenderer#readTexturePixels} for the asynchronous version.\n\t * @param {TextureBase} texture - The texture to read from.\n\t * @param {number} x - The x coordinate of the rectangle to read from.\n\t * @param {number} y - The y coordinate of the rectangle to read from.\n\t * @param {number} width - The width of the rectangle to read from.\n\t * @param {number} height - The height of the rectangle to read from.\n\t * @param {TypedArray} buffer - The buffer to store the pixel data.\n\t * @param {number} [zIndex=0] - For CubeTexture, the face index; for Texture3D/TextureArray, the layer/slice index.\n\t * @param {number} [mipLevel=0] - The mip level to read.\n\t * @returns {TypedArray} The passed in buffer after it has been filled with the pixel data.\n\t */\n\treadTexturePixelsSync(texture, x, y, width, height, buffer, zIndex = 0, mipLevel = 0) {}\n\n\t/**\n\t * Reset vertex array object bindings.\n\t * @param {boolean} [force=false] - Whether clear the current vertex array object.\n\t */\n\tresetVertexArrayBindings(force) {}\n\n\t/**\n\t * Reset all render states cached in this renderer.\n\t * This is useful when you use multiple renderers in one application.\n\t */\n\tresetState() {}\n\n\t/**\n\t * Begin an occlusion query.\n\t * @param {number} index - The query index in the current occlusion query set.\n\t */\n\tbeginOcclusionQuery(index) {}\n\n\t/**\n\t * End the current occlusion query.\n\t */\n\tendOcclusionQuery() {}\n\n\t/**\n\t * Read back the results of a query set.\n\t * This is an asynchronous operation.\n\t * @param {QuerySet} querySet - The query set to read from.\n\t * @param {Array|TypedArray} dstBuffer - The buffer to store the results.\n\t * @param {number} [firstQuery=0] - The first query index to read.\n\t * @param {number} [queryCount=querySet.count] - The number of queries to read.\n\t * @returns {Promise<Array|TypedArray>} A promise that resolves with the passed in buffer after it has been filled with the results.\n\t */\n\treadQuerySetResults(querySet, dstBuffer, firstQuery = 0, queryCount = querySet.count) {}\n\n\t/**\n\t * Used for context lost and restored.\n\t * @protected\n\t * @returns {number}\n\t */\n\tincreaseId() {\n\t\tthis.id = _rendererId++;\n\t\treturn this.id;\n\t}\n\n}\n\nexport { ThinRenderer };"
  },
  {
    "path": "src/render/passes/ShaderPostPass.js",
    "content": "import { Scene } from '../../scenes/Scene.js';\nimport { Camera } from '../../scenes/Camera.js';\nimport { Mesh } from '../../scenes/Mesh.js';\nimport { Vector3 } from '../../math/Vector3.js';\nimport { Geometry } from '../../resources/geometries/Geometry.js';\nimport { Attribute } from '../../resources/geometries/Attribute.js';\nimport { Buffer } from '../../resources/geometries/Buffer.js';\nimport { ShaderMaterial } from '../../resources/materials/ShaderMaterial.js';\n\n/**\n * Shader post pass.\n */\nclass ShaderPostPass {\n\n\t/**\n\t * @param {object} shader - Shader object for the shader material.\n\t * @param {string} shader.name - Name of the shader.\n\t * @param {object} shader.defines - Defines of the shader.\n\t * @param {object} shader.uniforms - Uniforms of the shader.\n\t * @param {string} shader.vertexShader - Vertex shader GLSL code.\n\t * @param {string} shader.fragmentShader - Fragment shader GLSL code.\n\t */\n\tconstructor(shader) {\n\t\tconst scene = new Scene();\n\n\t\tconst camera = this.camera = new Camera();\n\t\tcamera.frustumCulled = false;\n\t\tcamera.position.set(0, 0, 1);\n\t\tcamera.lookAt(new Vector3(0, 0, 0), new Vector3(0, 1, 0));\n\t\tcamera.setOrtho(-1, 1, -1, 1, 0.1, 2);\n\t\tscene.add(camera);\n\n\t\tconst geometry = this.geometry = new Geometry(); // fullscreen triangle\n\t\tgeometry.addAttribute('a_Position', new Attribute(new Buffer(new Float32Array([-1, 3, 0, -1, -1, 0, 3, -1, 0]), 3)));\n\t\tgeometry.addAttribute('a_Uv', new Attribute(new Buffer(new Float32Array([0, 2, 0, 0, 2, 0]), 2)));\n\n\t\tconst material = this.material = new ShaderMaterial(shader);\n\t\tthis.uniforms = material.uniforms;\n\n\t\tconst plane = new Mesh(geometry, material);\n\t\tplane.frustumCulled = false;\n\t\tscene.add(plane);\n\n\t\t// static scene\n\n\t\tscene.updateMatrix();\n\n\t\tthis.renderStates = scene.updateRenderStates(camera);\n\n\t\tconst renderQueue = scene.updateRenderQueue(camera, false, false);\n\t\tthis.renderQueueLayer = renderQueue.layerList[0];\n\n\t\tthis.renderConfig = {};\n\t}\n\n\t/**\n\t * Render the post pass.\n\t * @param {ThinRenderer} renderer - The renderer.\n\t * @param {RenderTarget} renderTarget - The render target.\n\t */\n\trender(renderer, renderTarget) {\n\t\trenderer.beginRender(renderTarget);\n\t\trenderer.renderRenderableList(this.renderQueueLayer.opaque, this.renderStates, this.renderConfig);\n\t\trenderer.endRender();\n\t}\n\n\t/**\n\t * Dispose the post pass.\n\t */\n\tdispose() {\n\t\tthis.geometry.dispose();\n\t\tthis.material.dispose();\n\t}\n\n}\n\nexport { ShaderPostPass };"
  },
  {
    "path": "src/render/passes/ShadowMapPass.js",
    "content": "import { DRAW_SIDE } from '../../const.js';\nimport { DepthMaterial } from '../../resources/materials/DepthMaterial.js';\nimport { DistanceMaterial } from '../../resources/materials/DistanceMaterial.js';\nimport { Vector4 } from '../../math/Vector4.js';\n\n/**\n * Shadow map pass.\n */\nclass ShadowMapPass {\n\n\tconstructor() {\n\t\t/**\n\t\t * Get depth material function.\n\t\t * Override this to use custom depth material.\n\t\t * @type {Function}\n\t\t */\n\t\tthis.getDepthMaterial = _getDepthMaterial;\n\n\t\t/**\n\t\t * Get distance material function.\n\t\t * Override this to use custom distance material.\n\t\t * @type {Function}\n\t\t */\n\t\tthis.getDistanceMaterial = _getDistanceMaterial;\n\n\t\t/**\n\t\t * Define which render layers will produce shadows.\n\t\t * If the value is Null, it means that all render layers will produce shadows.\n\t\t * @type {null | Array}\n\t\t * @default null\n\t\t */\n\t\tthis.shadowLayers = null;\n\n\t\t/**\n\t\t * Whether transparent objects can cast shadows.\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.transparentShadow = false;\n\n\t\tconst state = { isPointLight: false, light: null };\n\t\tthis._state = state;\n\n\t\tconst that = this;\n\t\tthis._renderOptions = {\n\t\t\tgetGeometry: null,\n\t\t\tgetMaterial: function(renderable) {\n\t\t\t\treturn state.isPointLight ? that.getDistanceMaterial(renderable, state.light) : that.getDepthMaterial(renderable, state.light);\n\t\t\t},\n\t\t\tifRender: function(renderable) {\n\t\t\t\treturn (state.light.groupMask & (1 << renderable.material.lightingGroup)) && renderable.object.castShadow;\n\t\t\t}\n\t\t};\n\t}\n\n\t/**\n\t * Get geometry function for shadow render options.\n\t * @type {null | Function}\n\t */\n\tset getGeometry(func) {\n\t\tif (func) {\n\t\t\tthis._renderOptions.getGeometry = func;\n\t\t} else {\n\t\t\tdelete this._renderOptions.getGeometry;\n\t\t}\n\t}\n\tget getGeometry() {\n\t\treturn this._renderOptions.getGeometry;\n\t}\n\n\t/**\n\t * The if render function for shadow render options.\n\t * @type {Function}\n\t */\n\tset ifRender(func) {\n\t\tif (func) {\n\t\t\tthis._renderOptions.ifRender = func;\n\t\t} else {\n\t\t\tdelete this._renderOptions.ifRender;\n\t\t}\n\t}\n\tget ifRender() {\n\t\treturn this._renderOptions.ifRender;\n\t}\n\n\t/**\n\t * Render shadow map.\n\t * @param {ThinRenderer} renderer\n\t * @param {Scene} scene\n\t */\n\trender(renderer, scene) {\n\t\t// @deprecated\n\t\t// This can be deleted when renderer.setClearColor is completely removed.\n\t\toldClearColor.copy(renderer.getClearColor());\n\n\t\tconst lightingData = scene.collector.lightingData;\n\t\tconst lightsArray = lightingData.lightsArray;\n\t\tconst shadowsNum = lightingData.shadowsNum;\n\n\t\tfor (let i = 0; i < shadowsNum; i++) {\n\t\t\tconst light = lightsArray[i];\n\t\t\tconst shadow = light.shadow;\n\n\t\t\tif (shadow.autoUpdate === false && shadow.needsUpdate === false) continue;\n\n\t\t\tconst camera = shadow.camera;\n\t\t\tconst shadowTarget = shadow.renderTarget;\n\t\t\tconst isPointLight = light.isPointLight;\n\t\t\tconst faces = isPointLight ? 6 : 1;\n\n\t\t\tthis._state.isPointLight = isPointLight;\n\t\t\tthis._state.light = light;\n\t\t\tconst renderOptions = this._renderOptions;\n\n\t\t\tshadow.prepareDepthMap(!scene.disableShadowSampler, renderer.capabilities);\n\n\t\t\tfor (let j = 0; j < faces; j++) {\n\t\t\t\tif (isPointLight) {\n\t\t\t\t\tshadow.update(light, j);\n\t\t\t\t\tshadowTarget.activeLayer = j;\n\t\t\t\t}\n\n\t\t\t\tshadowTarget\n\t\t\t\t\t.setColorClearValue(1, 1, 1, 1)\n\t\t\t\t\t.setClear(true, true, false);\n\n\t\t\t\tconst renderStates = scene.updateRenderStates(camera, j === 0);\n\t\t\t\tconst renderQueue = scene.updateRenderQueue(camera, false, false);\n\n\t\t\t\trenderer.beginRender(shadowTarget);\n\n\t\t\t\tfor (let k = 0; k < renderQueue.layerList.length; k++) {\n\t\t\t\t\tconst renderQueueLayer = renderQueue.layerList[k];\n\n\t\t\t\t\tif (this.shadowLayers !== null && this.shadowLayers.indexOf(renderQueueLayer.id) === -1) continue;\n\n\t\t\t\t\trenderer.renderRenderableList(renderQueueLayer.opaque, renderStates, renderOptions);\n\n\t\t\t\t\tif (this.transparentShadow) {\n\t\t\t\t\t\trenderer.renderRenderableList(renderQueueLayer.transparent, renderStates, renderOptions);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\trenderer.endRender();\n\t\t\t}\n\n\t\t\tshadow.needsUpdate = false;\n\t\t}\n\n\t\t// @deprecated\n\t\t// This can be deleted when renderer.setClearColor is completely removed.\n\t\trenderer.setClearColor(oldClearColor.x, oldClearColor.y, oldClearColor.z, oldClearColor.w);\n\t}\n\n}\n\nconst oldClearColor = new Vector4();\n\nconst shadowSide = { 'front': DRAW_SIDE.BACK, 'back': DRAW_SIDE.FRONT, 'double': DRAW_SIDE.DOUBLE };\n\nconst depthMaterials = {};\nconst distanceMaterials = {};\n\nfunction _getDepthMaterial(renderable, light) {\n\tconst useSkinning = !!renderable.object.skeleton;\n\tconst useMorphing = renderable.geometry.morphAttributes.position && renderable.geometry.morphAttributes.position.length > 0;\n\n\tconst clippingPlanes = renderable.material.clippingPlanes;\n\tconst numClippingPlanes = (clippingPlanes && clippingPlanes.length > 0) ? clippingPlanes.length : 0;\n\n\tconst index = useMorphing << 0 | useSkinning << 1;\n\n\tlet materials = depthMaterials[index];\n\n\tif (materials === undefined) {\n\t\tmaterials = {};\n\t\tdepthMaterials[index] = materials;\n\t}\n\n\tlet material = materials[numClippingPlanes];\n\n\tif (material === undefined) {\n\t\tmaterial = new DepthMaterial();\n\t\tmaterial.packToRGBA = true;\n\n\t\tmaterials[numClippingPlanes] = material;\n\t}\n\n\tmaterial.side = shadowSide[renderable.material.side];\n\tmaterial.clippingPlanes = renderable.material.clippingPlanes;\n\tmaterial.drawMode = renderable.material.drawMode;\n\n\treturn material;\n}\n\nfunction _getDistanceMaterial(renderable, light) {\n\tconst useSkinning = !!renderable.object.skeleton;\n\tconst useMorphing = renderable.geometry.morphAttributes.position && renderable.geometry.morphAttributes.position.length > 0;\n\n\tconst clippingPlanes = renderable.material.clippingPlanes;\n\tconst numClippingPlanes = (clippingPlanes && clippingPlanes.length > 0) ? clippingPlanes.length : 0;\n\n\tconst index = useMorphing << 0 | useSkinning << 1;\n\n\tlet materials = distanceMaterials[index];\n\n\tif (materials === undefined) {\n\t\tmaterials = {};\n\t\tdistanceMaterials[index] = materials;\n\t}\n\n\tlet material = materials[numClippingPlanes];\n\n\tif (material === undefined) {\n\t\tmaterial = new DistanceMaterial();\n\n\t\tmaterials[numClippingPlanes] = material;\n\t}\n\n\tmaterial.side = shadowSide[renderable.material.side];\n\tmaterial.uniforms['nearDistance'] = light.shadow.cameraNear;\n\tmaterial.uniforms['farDistance'] = light.shadow.cameraFar;\n\n\tmaterial.clippingPlanes = renderable.material.clippingPlanes;\n\tmaterial.drawMode = renderable.material.drawMode;\n\n\treturn material;\n}\n\nexport { ShadowMapPass };"
  },
  {
    "path": "src/resources/QuerySet.js",
    "content": "import { EventDispatcher } from '../EventDispatcher.js';\n\nlet _querySetId = 0;\n\n/**\n * A QuerySet holds a set of queries of a particular type.\n * @extends EventDispatcher\n */\nclass QuerySet extends EventDispatcher {\n\n\t/**\n\t * Creates a new QuerySet.\n\t * @param {QUERYSET_TYPE} type - The type of the query set.\n\t * @param {number} count - The number of queries in the set.\n\t */\n\tconstructor(type, count) {\n\t\tsuper();\n\n\t\t/**\n\t\t * Unique number for this query set instance.\n\t\t * @readonly\n\t\t * @type {number}\n\t\t */\n\t\tthis.id = _querySetId++;\n\n\t\t/**\n\t\t * The name of the query set.\n\t\t * @type {string}\n\t\t * @default \"\"\n\t\t */\n\t\tthis.name = '';\n\n\t\t/**\n\t\t * The type of the query set.\n\t\t * @readonly\n\t\t * @type {QUERYSET_TYPE}\n\t\t */\n\t\tthis.type = type;\n\n\t\t/**\n\t\t * The max number of queries in the set.\n\t\t * @readonly\n\t\t * @type {number}\n\t\t */\n\t\tthis.count = count;\n\n\t\t/**\n\t\t * Indicates whether the query set operates in conservative mode.\n\t\t * This property only applies to occlusion query sets in WebGL renderer.\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.conservative = true;\n\t}\n\n\t/**\n\t * Dispose this query set.\n\t */\n\tdispose() {\n\t\tthis.dispatchEvent({ type: 'dispose' });\n\t}\n\n}\n\nexport { QuerySet };"
  },
  {
    "path": "src/resources/Raycaster.js",
    "content": "import { Ray } from '../math/Ray.js';\n\n/**\n * This class is designed to assist with raycasting. Raycasting is used for\n * mouse picking (working out what objects in the 3d space the mouse is over)\n * amongst other things.\n */\nclass Raycaster {\n\n\t/**\n\t * Constructs a new raycaster.\n\t * @param {Vector3} origin — The origin vector where the ray casts from.\n\t * @param {Vector3} direction — The (normalized) direction vector that gives direction to the ray.\n\t */\n\tconstructor(origin, direction) {\n\t\t/**\n\t\t * The ray used for raycasting.\n\t\t * @type {Ray}\n\t\t */\n\t\tthis.ray = new Ray(origin, direction);\n\t}\n\n\t/**\n\t * Updates the ray with a new origin and direction by copying the values from the arguments.\n\t * @param {Vector3} origin — The origin vector where the ray casts from.\n\t * @param {Vector3} direction — The (normalized) direction vector that gives direction to the ray.\n\t */\n\tset(origin, direction) {\n\t\t// direction is assumed to be normalized (for accurate distance calculations)\n\t\tthis.ray.set(origin, direction);\n\t}\n\n\t/**\n\t * Uses the given coordinates and camera to compute a new origin and direction for the internal ray.\n\t * @param {Vector2} coords — 2D coordinates of the mouse, in normalized device coordinates (NDC).\n\t * X and Y components should be between `-1` and `1`.\n\t * @param {Camera} camera — The camera from which the ray should originate.\n\t */\n\tsetFromCamera(coords, camera) {\n\t\tif (camera.projectionMatrix.elements[11] === -1.0) { // perspective\n\t\t\tthis.ray.origin.setFromMatrixPosition(camera.worldMatrix);\n\t\t\tthis.ray.direction.set(coords.x, coords.y, 0.5).unproject(camera).sub(this.ray.origin).normalize();\n\t\t} else { // orthographic\n\t\t\t// set origin in plane of camera\n\t\t\t// projectionMatrix.elements[14] = (near + far) / (near - far)\n\t\t\tthis.ray.origin.set(coords.x, coords.y, camera.projectionMatrix.elements[14]).unproject(camera);\n\n\t\t\tthis.ray.direction.set(0, 0, -1).transformDirection(camera.worldMatrix);\n\t\t}\n\t}\n\n\t/**\n\t * Checks all intersection between the ray and the object with or without the\n\t * descendants. Intersections are returned sorted by distance, closest first.\n\t * An array of intersections is returned: [ { distance, point, face, faceIndex, object, uv }, ... ]\n\t * @param {Object3D} object — The 3D object to check for intersection with the ray.\n\t * @param {boolean} [recursive=false] — If set to `true`, it also checks all descendants.\n\t * Otherwise it only checks intersection with the object.\n\t * @param {object[]} [intersects=[]] - The target array that holds the result of the method.\n\t * @returns {object[]} An array holding the intersection points.\n\t */\n\tintersectObject(object, recursive = false, intersects = []) {\n\t\tintersect(object, this, intersects, recursive);\n\n\t\tintersects.sort(ascSort);\n\n\t\treturn intersects;\n\t}\n\n\t/**\n\t * Checks all intersection between the ray and the objects with or without\n\t * the descendants. Intersections are returned sorted by distance, closest first.\n\t * An array of intersections is returned: [ { distance, point, face, faceIndex, object, uv }, ... ]\n\t * @param {Object3D[]} objects — The 3D objects to check for intersection with the ray.\n\t * @param {boolean} [recursive=false] — If set to `true`, it also checks all descendants.\n\t * Otherwise it only checks intersection with the object.\n\t * @param {object[]} [intersects=[]] - The target array that holds the result of the method.\n\t * @returns {object[]} An array holding the intersection points.\n\t */\n\tintersectObjects(objects, recursive = false, intersects = []) {\n\t\tfor (let i = 0, l = objects.length; i < l; i++) {\n\t\t\tintersect(objects[i], this, intersects, recursive);\n\t\t}\n\n\t\tintersects.sort(ascSort);\n\n\t\treturn intersects;\n\t}\n\n}\n\nfunction ascSort(a, b) {\n\treturn a.distance - b.distance;\n}\n\nfunction intersect(object, raycaster, intersects, recursive) {\n\tlet propagate = true;\n\n\tconst result = object.raycast(raycaster.ray, intersects);\n\n\tif (result === false) propagate = false;\n\n\tif (propagate === true && recursive === true) {\n\t\tconst children = object.children;\n\n\t\tfor (let i = 0, l = children.length; i < l; i++) {\n\t\t\tintersect(children[i], raycaster, intersects, true);\n\t\t}\n\t}\n}\n\nexport { Raycaster };"
  },
  {
    "path": "src/resources/RenderBuffer.js",
    "content": "import { PIXEL_FORMAT } from '../const.js';\nimport { EventDispatcher } from '../EventDispatcher.js';\n\n/**\n * Render Buffer can be attached to RenderTarget.\n * @extends EventDispatcher\n */\nclass RenderBuffer extends EventDispatcher {\n\n\t/**\n\t * @param {number} width - The width of the render buffer.\n\t * @param {number} height - The height of the render buffer.\n\t * @param {PIXEL_FORMAT} [format=PIXEL_FORMAT.RGBA8] - The internal format of the render buffer.\n\t * @param {number} [multipleSampling=0] - If bigger than zero, this renderBuffer will support multipleSampling. (Only usable in WebGL 2.0)\n\t */\n\tconstructor(width, height, format = PIXEL_FORMAT.RGBA8, multipleSampling = 0) {\n\t\tsuper();\n\n\t\t/**\n\t\t * The width of the render buffer.\n\t\t * @type {number}\n\t\t */\n\t\tthis.width = width;\n\n\t\t/**\n\t\t * The height of the render buffer.\n\t\t * @type {number}\n\t\t */\n\t\tthis.height = height;\n\n\t\t/**\n\t\t * Render buffer texel storage data format.\n\t\t * DEPTH_COMPONENT16: for depth attachments.\n\t\t * DEPTH_STENCIL: for depth stencil attachments.\n\t\t * RGBA8：for multiple sampled color attachments.\n\t\t * DEPTH_COMPONENT16: for multiple sampled depth attachments.\n\t\t * DEPTH24_STENCIL8: for multiple sampled depth stencil attachments.\n\t\t * @type {PIXEL_FORMAT}\n\t\t * @default PIXEL_FORMAT.RGBA8\n\t\t */\n\t\tthis.format = format;\n\n\t\t/**\n\t\t * If bigger than zero, this renderBuffer will support multipleSampling. (Only usable in WebGL 2.0)\n\t\t * A Render Target's attachments must have the same multipleSampling value.\n\t\t * Texture can't be attached to the same render target with a multiple sampled render buffer.\n\t\t * Max support 8.\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.multipleSampling = multipleSampling;\n\t}\n\n\t/**\n\t * Resize the render buffer.\n\t * @param {number} width - The width of the render buffer.\n\t * @param {number} height - The height of the render buffer.\n\t * @returns {boolean} - If size changed.\n\t */\n\tresize(width, height) {\n\t\tif (this.width !== width || this.height !== height) {\n\t\t\tthis.dispose();\n\t\t\tthis.width = width;\n\t\t\tthis.height = height;\n\n\t\t\treturn true;\n\t\t}\n\n\t\treturn false;\n\t}\n\n\t/**\n\t * Returns a clone of this render buffer.\n\t * @returns {RenderBuffer}\n\t */\n\tclone() {\n\t\treturn new this.constructor().copy(this);\n\t}\n\n\t/**\n\t * Copy the given render buffer into this render buffer.\n\t * @param {RenderBuffer} source - The render buffer to be copied.\n\t * @returns {RenderBuffer}\n\t */\n\tcopy(source) {\n\t\tthis.format = source.format;\n\t\tthis.multipleSampling = source.multipleSampling;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Dispatches a dispose event.\n\t */\n\tdispose() {\n\t\tthis.dispatchEvent({ type: 'dispose' });\n\t}\n\n}\n\n/**\n * This flag can be used for type testing.\n * @readonly\n * @type {boolean}\n * @default true\n */\nRenderBuffer.prototype.isRenderBuffer = true;\n\nexport { RenderBuffer };"
  },
  {
    "path": "src/resources/Skeleton.js",
    "content": "import { Texture2D } from './textures/Texture2D.js';\nimport { PIXEL_FORMAT, PIXEL_TYPE, TEXTURE_FILTER } from '../const.js';\nimport { Matrix4 } from '../math/Matrix4.js';\nimport { MathUtils } from '../math/MathUtils.js';\n\nconst _offsetMatrix = new Matrix4();\n\n/**\n * Use an array of bones to create a skeleton that can be used by a {@link SkinnedMesh}.\n */\nclass Skeleton {\n\n\t/**\n\t * @param {Bone[]} bones\n\t * @param {Matrix4[]} boneInverses\n\t */\n\tconstructor(bones, boneInverses) {\n\t\t/**\n\t\t * The array of bones.\n\t\t * @type {Bone[]}\n\t\t */\n\t\tthis.bones = bones.slice(0);\n\n\t\t/**\n\t\t * An array of Matrix4s that represent the inverse of the worldMatrix of the individual bones.\n\t\t * @type {Matrix4[]}\n\t\t */\n\t\tthis.boneInverses = boneInverses;\n\n\t\t/**\n\t\t * The array buffer holding the bone data.\n\t\t * @type {Float32Array}\n\t\t */\n\t\tthis.boneMatrices = new Float32Array(16 * this.bones.length);\n\n\t\t/**\n\t\t * The {@link Texture2D} holding the bone data when using a vertex texture.\n\t\t * Use vertex texture to update boneMatrices, by that way, we can use more bones on phone.\n\t\t * @type {Texture2D|undefined}\n\t\t * @default undefined\n\t\t */\n\t\tthis.boneTexture = undefined;\n\n\t\tthis._version = 0;\n\t}\n\n\t/**\n\t * Returns the skeleton to the base pose.\n\t */\n\tpose() {\n\t\tconst boneInverses = this.boneInverses;\n\n\t\tfor (let i = 0; i < this.bones.length; i++) {\n\t\t\tconst bone = this.bones[i];\n\t\t\tbone.worldMatrix.copy(boneInverses[i]).invert();\n\t\t}\n\n\t\tfor (let i = 0; i < this.bones.length; i++) {\n\t\t\tconst bone = this.bones[i];\n\t\t\tif (bone.parent && bone.parent.isBone) {\n\t\t\t\tbone.matrix.copy(bone.parent.worldMatrix).invert();\n\t\t\t\tbone.matrix.multiply(bone.worldMatrix);\n\t\t\t} else {\n\t\t\t\tbone.matrix.copy(bone.worldMatrix);\n\t\t\t}\n\n\t\t\tbone.matrix.decompose(bone.position, bone.quaternion, bone.scale);\n\t\t}\n\t}\n\n\t/**\n\t * Clone skeleton.\n\t * @returns {Skeleton}\n\t */\n\tclone() {\n\t\treturn new Skeleton(this.bones, this.boneInverses);\n\t}\n\n\t/**\n\t * Updates the boneMatrices and boneTexture after changing the bones.\n\t * This is called automatically if the skeleton is used with a SkinnedMesh.\n\t * @ignore\n\t */\n\tupdateBones(sceneData) {\n\t\tconst useAnchorMatrix = sceneData.useAnchorMatrix;\n\t\tconst anchorMatrixInverse = sceneData.anchorMatrixInverse;\n\t\tconst boneInverses = this.boneInverses;\n\n\t\tfor (let i = 0; i < this.bones.length; i++) {\n\t\t\tconst bone = this.bones[i];\n\t\t\t_offsetMatrix.multiplyMatrices(bone.worldMatrix, boneInverses[i]);\n\t\t\tif (useAnchorMatrix) {\n\t\t\t\t_offsetMatrix.premultiply(anchorMatrixInverse);\n\t\t\t}\n\t\t\t_offsetMatrix.toArray(this.boneMatrices, i * 16);\n\t\t}\n\n\t\tif (this.boneTexture !== undefined) {\n\t\t\tthis.boneTexture.version++;\n\t\t}\n\t}\n\n\tgenerateBoneTexture() {\n\t\tlet size = MathUtils.nextPowerOfTwoSquareSize(this.bones.length * 4);\n\t\tsize = Math.max(size, 4);\n\n\t\tconst boneMatrices = new Float32Array(size * size * 4);\n\t\tboneMatrices.set(this.boneMatrices);\n\n\t\tconst boneTexture = new Texture2D();\n\t\tboneTexture.image = { data: boneMatrices, width: size, height: size };\n\t\tboneTexture.format = PIXEL_FORMAT.RGBA;\n\t\tboneTexture.type = PIXEL_TYPE.FLOAT;\n\t\tboneTexture.magFilter = TEXTURE_FILTER.NEAREST;\n\t\tboneTexture.minFilter = TEXTURE_FILTER.NEAREST;\n\t\tboneTexture.generateMipmaps = false;\n\t\tboneTexture.flipY = false;\n\n\t\tthis.boneMatrices = boneMatrices;\n\t\tthis.boneTexture = boneTexture;\n\t}\n\n}\n\nexport { Skeleton };"
  },
  {
    "path": "src/resources/TransformUV.js",
    "content": "import { Matrix3 } from '../math/Matrix3.js';\nimport { Vector2 } from '../math/Vector2.js';\n\n/**\n * A transform object for UV coordinates.\n * @extends Matrix3\n */\nclass TransformUV extends Matrix3 {\n\n\t/**\n\t * Create a new TransformUV object.\n\t */\n\tconstructor() {\n\t\tsuper();\n\n\t\tthis.offset = new Vector2(0, 0);\n\t\tthis.scale = new Vector2(1, 1);\n\t\tthis.center = new Vector2(0, 0);\n\t\tthis.rotation = 0;\n\n\t\tthis.needsUpdate = false;\n\t}\n\n\t/**\n\t * Update the matrix for UV transformation based on the offset, scale, rotation and center.\n\t * If needsUpdate is false, this method will do nothing.\n\t * @returns {TransformUV} This object.\n\t */\n\tupdate() {\n\t\tif (!this.needsUpdate) return this;\n\n\t\tthis.needsUpdate = false;\n\n\t\tthis.updateMatrix();\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Update the matrix for UV transformation based on the offset, scale, rotation and center.\n\t * This method will always update the matrix regardless of the needsUpdate flag.\n\t * @returns {TransformUV} This object.\n\t */\n\tupdateMatrix() {\n\t\treturn this.setUvTransform(\n\t\t\tthis.offset.x, this.offset.y,\n\t\t\tthis.scale.x, this.scale.y,\n\t\t\tthis.rotation,\n\t\t\tthis.center.x, this.center.y\n\t\t);\n\t}\n\n\t/**\n\t * Copy the properties of another TransformUV object.\n\t * @param {TransformUV|Matrix3} source - The object to copy the properties from.\n\t * @returns {TransformUV} This object.\n\t */\n\tcopy(source) {\n\t\tsuper.copy(source);\n\n\t\t// in case source is only a Matrix3 object (without additional properties)\n\t\tif (!source.isTransformUV) return this;\n\n\t\tthis.offset.copy(source.offset);\n\t\tthis.scale.copy(source.scale);\n\t\tthis.center.copy(source.center);\n\t\tthis.rotation = source.rotation;\n\n\t\tthis.needsUpdate = source.needsUpdate;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Clone this TransformUV object.\n\t * @returns {TransformUV} The cloned object.\n\t */\n\tclone() {\n\t\treturn new this.constructor().copy(this);\n\t}\n\n}\n\n/**\n * This flag can be used for type testing.\n * @readonly\n * @type {boolean}\n * @default true\n */\nTransformUV.prototype.isTransformUV = true;\n\nexport { TransformUV };"
  },
  {
    "path": "src/resources/fogs/Fog.js",
    "content": "import { Color3 } from '../../math/Color3.js';\n\n/**\n * Linear fog.\n */\nclass Fog {\n\n\t/**\n\t * @param {number} [color=0x000000] - The color of the fog.\n\t * @param {number} [near=1] - The near clip of the fog.\n\t * @param {number} [far=1000] - The far clip of the fog.\n\t */\n\tconstructor(color = 0x000000, near = 1, far = 1000) {\n\t\t/**\n\t\t * The color of the fog.\n\t\t * @type {Color3}\n\t\t * @default Color3(0x000000)\n\t\t */\n\t\tthis.color = new Color3(color);\n\n\t\t/**\n\t\t * The near clip of the fog.\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.near = near;\n\n\t\t/**\n\t\t * The far clip of the fog.\n\t\t * @type {number}\n\t\t * @default 1000\n\t\t */\n\t\tthis.far = far;\n\t}\n\n}\n\n/**\n * This flag can be used for type testing.\n * @readonly\n * @type {boolean}\n * @default true\n */\nFog.prototype.isFog = true;\n\nexport { Fog };"
  },
  {
    "path": "src/resources/fogs/FogExp2.js",
    "content": "import { Color3 } from '../../math/Color3.js';\n\n/**\n * Exp2 fog.\n */\nclass FogExp2 {\n\n\t/**\n\t * @param {number} [color=0x000000] - The color of the fog.\n\t * @param {number} [density=0.00025] - The density of the exp2 fog.\n\t */\n\tconstructor(color = 0x000000, density = 0.00025) {\n\t\t/**\n\t\t * The color of the fog.\n\t\t * @type {Color3}\n\t\t * @default Color3(0x000000)\n\t\t */\n\t\tthis.color = new Color3(color);\n\n\t\t/**\n\t\t * The density of the exp2 fog.\n\t\t * @type {number}\n\t\t * @default 0.00025\n\t\t */\n\t\tthis.density = density;\n\t}\n\n}\n\n/**\n * This flag can be used for type testing.\n * @readonly\n * @type {boolean}\n * @default true\n */\nFogExp2.prototype.isFogExp2 = true;\n\nexport { FogExp2 };"
  },
  {
    "path": "src/resources/geometries/Attribute.js",
    "content": "/**\n * The Attribute add structural information to Buffer.\n * This class stores data for an attribute (such as vertex positions, face indices, normals, colors, UVs, and any custom attributes ) associated with a Geometry, which allows for more efficient passing of data to the GPU.\n * Data is stored as vectors of any length (defined by size).\n */\nclass Attribute {\n\n\t/**\n\t * @param {Buffer} buffer - The Buffer instance passed in the constructor.\n\t * @param {number} [size=buffer.stride] - The number of values of the array that should be associated with a particular vertex. For instance, if this attribute is storing a 3-component vector (such as a position, normal, or color), then size should be 3.\n\t * @param {number} [offset=0] - The offset in the underlying array buffer where an item starts.\n\t * @param {boolean} [normalized=false] - Indicates how the underlying data in the buffer maps to the values in the GLSL shader code.\n\t */\n\tconstructor(buffer, size = buffer.stride, offset = 0, normalized = false) {\n\t\t/**\n\t\t * The Buffer instance passed in the constructor.\n\t\t * @type {Buffer}\n\t\t */\n\t\tthis.buffer = buffer;\n\n\t\t/**\n\t\t * The number of values of the buffer that should be associated with the attribute.\n\t\t * @type {number}\n\t\t * @default buffer.stride\n\t\t */\n\t\tthis.size = size;\n\n\t\t/**\n\t\t * The offset in the underlying buffer where an item starts.\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.offset = offset;\n\n\t\t/**\n\t\t * Indicates how the underlying data in the buffer maps to the values in the GLSL shader code.\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.normalized = normalized;\n\n\t\t/**\n\t\t * Instance cadence, the number of instances drawn for each vertex in the buffer, non-instance attributes must be 0.\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.divisor = 0;\n\t}\n\n\t/**\n\t * Copy the parameters from the passed attribute.\n\t * @param {Attribute} source - The attribute to be copied.\n\t * @returns {Attribute}\n\t */\n\tcopy(source) {\n\t\tthis.buffer = source.buffer;\n\t\tthis.size = source.size;\n\t\tthis.offset = source.offset;\n\t\tthis.normalized = source.normalized;\n\t\tthis.divisor = source.divisor;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Return a new attribute with the same parameters as this attribute.\n\t * @param {object} buffers - A WeakMap to save shared buffers.\n\t * @returns {Attribute}\n\t */\n\tclone(buffers) {\n\t\tlet attribute;\n\n\t\tif (!buffers) {\n\t\t\tconsole.warn('Attribute.clone(): now requires a WeakMap as an argument to save shared buffers.');\n\n\t\t\tattribute = new Attribute(this.buffer.clone(), this.size, this.offset, this.normalized);\n\t\t\tattribute.divisor = this.divisor;\n\t\t\treturn attribute;\n\t\t}\n\n\t\tif (!buffers.has(this.buffer)) {\n\t\t\tbuffers.set(this.buffer, this.buffer.clone());\n\t\t}\n\n\t\tattribute = new Attribute(buffers.get(this.buffer), this.size, this.offset, this.normalized);\n\t\tattribute.divisor = this.divisor;\n\t\treturn attribute;\n\t}\n\n}\n\nexport { Attribute };"
  },
  {
    "path": "src/resources/geometries/BoxGeometry.js",
    "content": "import { Geometry } from './Geometry.js';\nimport { Buffer } from './Buffer.js';\nimport { Attribute } from './Attribute.js';\nimport { Vector3 } from '../../math/Vector3.js';\n\n/**\n * BoxGeometry is the quadrilateral primitive geometry class.\n * It is typically used for creating a cube or irregular quadrilateral of the dimensions provided with the 'width', 'height', and 'depth' constructor arguments.\n * @extends Geometry\n */\nclass BoxGeometry extends Geometry {\n\n\t/**\n\t * @param {number} [width=1] - Width of the sides on the X axis.\n\t * @param {number} [height=1] - Height of the sides on the Y axis.\n\t * @param {number} [depth=1] - Depth of the sides on the Z axis.\n\t * @param {number} [widthSegments=1] - Number of segmented faces along the width of the sides.\n\t * @param {number} [heightSegments=1] - Number of segmented faces along the height of the sides.\n\t * @param {number} [depthSegments=1] - Number of segmented faces along the depth of the sides.\n\t */\n\tconstructor(width = 1, height = 1, depth = 1, widthSegments = 1, heightSegments = 1, depthSegments = 1) {\n\t\tsuper();\n\n\t\tconst scope = this;\n\n\t\t// segments\n\n\t\twidthSegments = Math.floor(widthSegments);\n\t\theightSegments = Math.floor(heightSegments);\n\t\tdepthSegments = Math.floor(depthSegments);\n\n\t\t// buffers\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\t// helper variables\n\n\t\tlet numberOfVertices = 0;\n\t\tlet groupStart = 0;\n\n\t\t// build each side of the box geometry\n\n\t\tbuildPlane('z', 'y', 'x', -1, -1, depth, height, width, depthSegments, heightSegments, 0); // px\n\t\tbuildPlane('z', 'y', 'x', 1, -1, depth, height, -width, depthSegments, heightSegments, 1); // nx\n\t\tbuildPlane('x', 'z', 'y', 1, 1, width, depth, height, widthSegments, depthSegments, 2); // py\n\t\tbuildPlane('x', 'z', 'y', 1, -1, width, depth, -height, widthSegments, depthSegments, 3); // ny\n\t\tbuildPlane('x', 'y', 'z', 1, -1, width, height, depth, widthSegments, heightSegments, 4); // pz\n\t\tbuildPlane('x', 'y', 'z', -1, -1, width, height, -depth, widthSegments, heightSegments, 5); // nz\n\n\t\t// build geometry\n\n\t\tthis.setIndex(new Attribute(new Buffer(\n\t\t\t(vertices.length / 3) > 65536 ? new Uint32Array(indices) : new Uint16Array(indices),\n\t\t\t1\n\t\t)));\n\t\tthis.addAttribute('a_Position', new Attribute(new Buffer(new Float32Array(vertices), 3)));\n\t\tthis.addAttribute('a_Normal', new Attribute(new Buffer(new Float32Array(normals), 3)));\n\t\tthis.addAttribute('a_Uv', new Attribute(new Buffer(new Float32Array(uvs), 2)));\n\n\t\tfunction buildPlane(u, v, w, udir, vdir, width, height, depth, gridX, gridY, materialIndex) {\n\t\t\tconst segmentWidth = width / gridX;\n\t\t\tconst segmentHeight = height / gridY;\n\n\t\t\tconst widthHalf = width / 2;\n\t\t\tconst heightHalf = height / 2;\n\t\t\tconst depthHalf = depth / 2;\n\n\t\t\tconst gridX1 = gridX + 1;\n\t\t\tconst gridY1 = gridY + 1;\n\n\t\t\tlet vertexCounter = 0;\n\t\t\tlet groupCount = 0;\n\n\t\t\tconst vector = new Vector3();\n\n\t\t\t// generate vertices, normals and uvs\n\n\t\t\tfor (let iy = 0; iy < gridY1; iy++) {\n\t\t\t\tconst y = iy * segmentHeight - heightHalf;\n\n\t\t\t\tfor (let ix = 0; ix < gridX1; ix++) {\n\t\t\t\t\tconst x = ix * segmentWidth - widthHalf;\n\n\t\t\t\t\t// set values to correct vector component\n\n\t\t\t\t\tvector[u] = x * udir;\n\t\t\t\t\tvector[v] = y * vdir;\n\t\t\t\t\tvector[w] = depthHalf;\n\n\t\t\t\t\t// now apply vector to vertex buffer\n\n\t\t\t\t\tvertices.push(vector.x, vector.y, vector.z);\n\n\t\t\t\t\t// set values to correct vector component\n\n\t\t\t\t\tvector[u] = 0;\n\t\t\t\t\tvector[v] = 0;\n\t\t\t\t\tvector[w] = depth > 0 ? 1 : -1;\n\n\t\t\t\t\t// now apply vector to normal buffer\n\n\t\t\t\t\tnormals.push(vector.x, vector.y, vector.z);\n\n\t\t\t\t\t// uvs\n\n\t\t\t\t\tuvs.push(ix / gridX);\n\t\t\t\t\tuvs.push(1 - (iy / gridY));\n\n\t\t\t\t\t// counters\n\n\t\t\t\t\tvertexCounter += 1;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// indices\n\n\t\t\t// 1. you need three indices to draw a single face\n\t\t\t// 2. a single segment consists of two faces\n\t\t\t// 3. so we need to generate six (2*3) indices per segment\n\n\t\t\tfor (let iy = 0; iy < gridY; iy++) {\n\t\t\t\tfor (let ix = 0; ix < gridX; ix++) {\n\t\t\t\t\tconst a = numberOfVertices + ix + gridX1 * iy;\n\t\t\t\t\tconst b = numberOfVertices + ix + gridX1 * (iy + 1);\n\t\t\t\t\tconst c = numberOfVertices + (ix + 1) + gridX1 * (iy + 1);\n\t\t\t\t\tconst d = numberOfVertices + (ix + 1) + gridX1 * iy;\n\n\t\t\t\t\t// faces\n\n\t\t\t\t\tindices.push(a, b, d);\n\t\t\t\t\tindices.push(b, c, d);\n\n\t\t\t\t\t// increase counter\n\n\t\t\t\t\tgroupCount += 6;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// add a group to the geometry. this will ensure multi material support\n\n\t\t\tscope.addGroup(groupStart, groupCount, materialIndex);\n\n\t\t\t// calculate new start value for groups\n\n\t\t\tgroupStart += groupCount;\n\n\t\t\t// update total number of vertices\n\n\t\t\tnumberOfVertices += vertexCounter;\n\t\t}\n\n\t\tthis.computeBoundingBox();\n\t\tthis.computeBoundingSphere();\n\t}\n\n}\n\nexport { BoxGeometry };"
  },
  {
    "path": "src/resources/geometries/Buffer.js",
    "content": "import { BUFFER_USAGE } from '../../const.js';\n\n/**\n * The Buffer contain the data that is used for the geometry of 3D models, animations, and skinning.\n */\nclass Buffer {\n\n\t/**\n\t * @param {TypedArray} array -- A typed array with a shared buffer. Stores the geometry data.\n\t * @param {number} stride -- The number of typed-array elements per vertex.\n\t */\n\tconstructor(array, stride) {\n\t\t/**\n\t\t * A typed array with a shared buffer.\n\t\t * Stores the geometry data.\n\t\t * @type {TypedArray}\n\t\t */\n\t\tthis.array = array;\n\n\t\t/**\n\t\t * The number of typed-array elements per vertex.\n\t\t * @type {number}\n\t\t */\n\t\tthis.stride = stride;\n\n\t\t/**\n\t\t * Gives the total number of elements in the array.\n\t\t * @type {number}\n\t\t */\n\t\tthis.count = array !== undefined ? array.length / stride : 0;\n\n\t\t/**\n\t\t * Defines the intended usage pattern of the data store for optimization purposes.\n\t\t * Corresponds to the usage parameter of WebGLRenderingContext.bufferData().\n\t\t * @type {BUFFER_USAGE}\n\t\t * @default BUFFER_USAGE.STATIC_DRAW\n\t\t */\n\t\tthis.usage = BUFFER_USAGE.STATIC_DRAW;\n\n\t\t/**\n\t\t * Object containing offset and count.\n\t\t * @type {object}\n\t\t * @default { offset: 0, count: - 1 }\n\t\t */\n\t\tthis.updateRange = { offset: 0, count: -1 };\n\n\t\t/**\n\t\t * A version number, incremented every time the data is changed.\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.version = 0;\n\t}\n\n\t/**\n\t * A callback function that is executed after the Renderer has transferred the attribute array data to the GPU.\n\t */\n\tonUploadCallback() {}\n\n\t/**\n\t * Copies another Buffer to this Buffer.\n\t * @param {Buffer} source - The buffer to be copied.\n\t * @returns {Buffer}\n\t */\n\tcopy(source) {\n\t\tthis.array = new source.array.constructor(source.array);\n\t\tthis.stride = source.stride;\n\t\tthis.count = source.array.length / this.stride;\n\t\tthis.usage = source.usage;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Return a copy of this buffer.\n\t * @returns {Buffer}\n\t */\n\tclone() {\n\t\tconst array = new this.array.constructor(this.array);\n\t\tconst ib = new Buffer(array, this.stride);\n\t\tib.usage = this.usage;\n\t\treturn ib;\n\t}\n\n}\n\nexport { Buffer };"
  },
  {
    "path": "src/resources/geometries/CylinderGeometry.js",
    "content": "import { Geometry } from './Geometry.js';\nimport { Attribute } from './Attribute.js';\nimport { Buffer } from './Buffer.js';\nimport { Vector2 } from '../../math/Vector2.js';\nimport { Vector3 } from '../../math/Vector3.js';\n\n/**\n * A class for generating cylinder geometries.\n * @extends Geometry\n */\nclass CylinderGeometry extends Geometry {\n\n\t/**\n\t * @param {number} [radiusTop=1] — Radius of the cylinder at the top.\n\t * @param {number} [radiusBottom=1] — Radius of the cylinder at the bottom.\n\t * @param {number} [height=1] — Height of the cylinder.\n\t * @param {number} [radialSegments=8] — Number of segmented faces around the circumference of the cylinder.\n\t * @param {number} [heightSegments=1] — Number of rows of faces along the height of the cylinder.\n\t * @param {number} [openEnded=false] — A Boolean indicating whether the ends of the cylinder are open or capped. Default is false, meaning capped.\n\t * @param {number} [thetaStart=0] — Start angle for first segment, default = 0 (three o'clock position).\n\t * @param {number} [thetaLength=2*Pi] — The central angle, often called theta, of the circular sector. The default is 2*Pi, which makes for a complete cylinder.\n\t */\n\tconstructor(radiusTop = 1, radiusBottom = 1, height = 1, radialSegments = 8, heightSegments = 1, openEnded = false, thetaStart = 0, thetaLength = Math.PI * 2) {\n\t\tsuper();\n\n\t\tconst scope = this;\n\n\t\tradialSegments = Math.floor(radialSegments);\n\t\theightSegments = Math.floor(heightSegments);\n\n\t\t// buffers\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\t// helper variables\n\n\t\tlet index = 0;\n\t\tconst indexArray = [];\n\t\tconst halfHeight = height / 2;\n\t\tlet groupStart = 0;\n\n\t\t// generate geometry\n\n\t\tgenerateTorso();\n\n\t\tif (openEnded === false) {\n\t\t\tif (radiusTop > 0) generateCap(true);\n\t\t\tif (radiusBottom > 0) generateCap(false);\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex(new Attribute(new Buffer(\n\t\t\t(vertices.length / 3) > 65536 ? new Uint32Array(indices) : new Uint16Array(indices),\n\t\t\t1\n\t\t)));\n\t\tthis.addAttribute('a_Position', new Attribute(new Buffer(new Float32Array(vertices), 3)));\n\t\tthis.addAttribute('a_Normal', new Attribute(new Buffer(new Float32Array(normals), 3)));\n\t\tthis.addAttribute('a_Uv', new Attribute(new Buffer(new Float32Array(uvs), 2)));\n\n\t\tfunction generateTorso() {\n\t\t\tconst normal = new Vector3();\n\t\t\tconst vertex = new Vector3();\n\n\t\t\tlet groupCount = 0;\n\t\t\tlet x, y;\n\n\t\t\t// this will be used to calculate the normal\n\t\t\tconst slope = (radiusBottom - radiusTop) / height;\n\n\t\t\t// generate vertices, normals and uvs\n\n\t\t\tfor (y = 0; y <= heightSegments; y++) {\n\t\t\t\tconst indexRow = [];\n\n\t\t\t\tconst v = y / heightSegments;\n\n\t\t\t\t// calculate the radius of the current row\n\n\t\t\t\tconst radius = v * (radiusBottom - radiusTop) + radiusTop;\n\n\t\t\t\tfor (x = 0; x <= radialSegments; x++) {\n\t\t\t\t\tconst u = x / radialSegments;\n\n\t\t\t\t\tconst theta = u * thetaLength + thetaStart;\n\n\t\t\t\t\tconst sinTheta = Math.sin(theta);\n\t\t\t\t\tconst cosTheta = Math.cos(theta);\n\n\t\t\t\t\t// vertex\n\n\t\t\t\t\tvertex.x = radius * sinTheta;\n\t\t\t\t\tvertex.y = -v * height + halfHeight;\n\t\t\t\t\tvertex.z = radius * cosTheta;\n\t\t\t\t\tvertices.push(vertex.x, vertex.y, vertex.z);\n\n\t\t\t\t\t// normal\n\n\t\t\t\t\tnormal.set(sinTheta, slope, cosTheta).normalize();\n\t\t\t\t\tnormals.push(normal.x, normal.y, normal.z);\n\n\t\t\t\t\t// uv\n\n\t\t\t\t\tuvs.push(u, 1 - v);\n\n\t\t\t\t\t// save index of vertex in respective row\n\n\t\t\t\t\tindexRow.push(index++);\n\t\t\t\t}\n\n\t\t\t\t// now save vertices of the row in our index array\n\n\t\t\t\tindexArray.push(indexRow);\n\t\t\t}\n\n\t\t\t// generate indices\n\n\t\t\tfor (x = 0; x < radialSegments; x++) {\n\t\t\t\tfor (y = 0; y < heightSegments; y++) {\n\t\t\t\t\t// we use the index array to access the correct indices\n\n\t\t\t\t\tconst a = indexArray[y][x];\n\t\t\t\t\tconst b = indexArray[y + 1][x];\n\t\t\t\t\tconst c = indexArray[y + 1][x + 1];\n\t\t\t\t\tconst d = indexArray[y][x + 1];\n\n\t\t\t\t\t// faces\n\n\t\t\t\t\tif (radiusTop > 0 || y !== 0) {\n\t\t\t\t\t\tindices.push(a, b, d);\n\t\t\t\t\t\tgroupCount += 3;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (radiusBottom > 0 || y !== heightSegments - 1) {\n\t\t\t\t\t\tindices.push(b, c, d);\n\t\t\t\t\t\tgroupCount += 3;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// add a group to the geometry. this will ensure multi material support\n\n\t\t\tscope.addGroup(groupStart, groupCount, 0);\n\n\t\t\t// calculate new start value for groups\n\n\t\t\tgroupStart += groupCount;\n\t\t}\n\n\t\tfunction generateCap(top) {\n\t\t\t// save the index of the first center vertex\n\t\t\tconst centerIndexStart = index;\n\n\t\t\tconst uv = new Vector2();\n\t\t\tconst vertex = new Vector3();\n\n\t\t\tlet groupCount = 0;\n\t\t\tlet x;\n\n\t\t\tconst radius = (top === true) ? radiusTop : radiusBottom;\n\t\t\tconst sign = (top === true) ? 1 : -1;\n\n\t\t\t// first we generate the center vertex data of the cap.\n\t\t\t// because the geometry needs one set of uvs per face,\n\t\t\t// we must generate a center vertex per face/segment\n\n\t\t\tfor (x = 1; x <= radialSegments; x++) {\n\t\t\t\t// vertex\n\n\t\t\t\tvertices.push(0, halfHeight * sign, 0);\n\n\t\t\t\t// normal\n\n\t\t\t\tnormals.push(0, sign, 0);\n\n\t\t\t\t// uv\n\n\t\t\t\tuvs.push(0.5, 0.5);\n\n\t\t\t\t// increase index\n\n\t\t\t\tindex++;\n\t\t\t}\n\n\t\t\t// save the index of the last center vertex\n\t\t\tconst centerIndexEnd = index;\n\n\t\t\t// now we generate the surrounding vertices, normals and uvs\n\n\t\t\tfor (x = 0; x <= radialSegments; x++) {\n\t\t\t\tconst u = x / radialSegments;\n\t\t\t\tconst theta = u * thetaLength + thetaStart;\n\n\t\t\t\tconst cosTheta = Math.cos(theta);\n\t\t\t\tconst sinTheta = Math.sin(theta);\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertex.x = radius * sinTheta;\n\t\t\t\tvertex.y = halfHeight * sign;\n\t\t\t\tvertex.z = radius * cosTheta;\n\t\t\t\tvertices.push(vertex.x, vertex.y, vertex.z);\n\n\t\t\t\t// normal\n\n\t\t\t\tnormals.push(0, sign, 0);\n\n\t\t\t\t// uv\n\n\t\t\t\tuv.x = (cosTheta * 0.5) + 0.5;\n\t\t\t\tuv.y = (sinTheta * 0.5 * sign) + 0.5;\n\t\t\t\tuvs.push(uv.x, uv.y);\n\n\t\t\t\t// increase index\n\n\t\t\t\tindex++;\n\t\t\t}\n\n\t\t\t// generate indices\n\n\t\t\tfor (x = 0; x < radialSegments; x++) {\n\t\t\t\tconst c = centerIndexStart + x;\n\t\t\t\tconst i = centerIndexEnd + x;\n\n\t\t\t\tif (top === true) {\n\t\t\t\t\t// face top\n\t\t\t\t\tindices.push(i, i + 1, c);\n\t\t\t\t} else {\n\t\t\t\t\t// face bottom\n\t\t\t\t\tindices.push(i + 1, i, c);\n\t\t\t\t}\n\n\t\t\t\tgroupCount += 3;\n\t\t\t}\n\n\t\t\t// add a group to the geometry. this will ensure multi material support\n\n\t\t\tscope.addGroup(groupStart, groupCount, top === true ? 1 : 2);\n\n\t\t\t// calculate new start value for groups\n\n\t\t\tgroupStart += groupCount;\n\t\t}\n\n\t\tthis.computeBoundingBox();\n\t\tthis.computeBoundingSphere();\n\t}\n\n}\n\nexport { CylinderGeometry };"
  },
  {
    "path": "src/resources/geometries/Geometry.js",
    "content": "import { Attribute } from './Attribute.js';\nimport { Buffer } from './Buffer.js';\nimport { EventDispatcher } from '../../EventDispatcher.js';\nimport { MathUtils } from '../../math/MathUtils.js';\nimport { Box3 } from '../../math/Box3.js';\nimport { Sphere } from '../../math/Sphere.js';\nimport { Vector3 } from '../../math/Vector3.js';\n\nlet _geometryId = 0;\n\nconst _vector = new Vector3();\nconst _offset = new Vector3();\nconst _sum = new Vector3();\nconst _box3 = new Box3();\nconst _boxMorphTargets = new Box3();\n\n/**\n * An efficient representation of mesh, line, or point geometry.\n * Includes vertex positions, face indices, normals, colors, UVs, and custom attributes within buffers, reducing the cost of passing all this data to the GPU.\n * To read and edit data in {@link Geometry#attributes}.\n * @extends EventDispatcher\n */\nclass Geometry extends EventDispatcher {\n\n\t/**\n\t * Create a geometry.\n\t */\n\tconstructor() {\n\t\tsuper();\n\n\t\t/**\n\t\t * Unique number for this geometry instance.\n\t\t * @readonly\n\t\t * @type {number}\n\t\t */\n\t\tthis.id = _geometryId++;\n\n\t\t/**\n\t\t * UUID of this geometry instance.\n\t\t * This gets automatically assigned, so this shouldn't be edited.\n\t\t * @readonly\n\t\t * @type {string}\n\t\t */\n\t\tthis.uuid = MathUtils.generateUUID();\n\n\t\t/**\n\t\t * This hashmap has as id the name of the attribute to be set and as value the buffer to set it to.\n\t\t * Rather than accessing this property directly, use {@link Geometry#addAttribute} and {@link Geometry#getAttribute} to access attributes of this geometry.\n\t\t * @type {object}\n\t\t */\n\t\tthis.attributes = {};\n\n\t\t/**\n\t\t * Hashmap of Attributes Array for morph targets.\n\t\t * @type {object}\n\t\t */\n\t\tthis.morphAttributes = {};\n\n\t\t/**\n\t\t * Allows for vertices to be re-used across multiple triangles; this is called using \"indexed triangles\" and each triangle is associated with the indices of three vertices.\n\t\t * This attribute therefore stores the index of each vertex for each triangular face.\n\t\t * If this attribute is not set, the renderer assumes that each three contiguous positions represent a single triangle.\n\t\t * @type {Attribute | null}\n\t\t */\n\t\tthis.index = null;\n\n\t\t/**\n\t\t * Bounding box for the bufferGeometry, which can be calculated with {@link Geometry#computeBoundingBox}.\n\t\t * @type {Box3}\n\t\t * @default Box3()\n\t\t */\n\t\tthis.boundingBox = new Box3();\n\n\t\t/**\n\t\t * Bounding sphere for the bufferGeometry, which can be calculated with {@link Geometry#computeBoundingSphere}.\n\t\t * @type {Sphere}\n\t\t * @default Sphere()\n\t\t */\n\t\tthis.boundingSphere = new Sphere();\n\n\t\t/**\n\t\t * Split the geometry into groups, each of which will be rendered in a separate WebGL draw call. This allows an array of materials to be used with the geometry.\n\t\t * Each group is an object of the form: { start: Integer, count: Integer, materialIndex: Integer },\n\t\t * or { multiDrawStarts: Integer[], multiDrawCounts: Integer[], multiDrawCount: Integer, materialIndex: Integer } if multiDraw is available.\n\t\t * @type {Array}\n\t\t * @default []\n\t\t */\n\t\tthis.groups = [];\n\n\t\t/**\n\t\t * The number of instances to be rendered. If set to -1 (default), instanced rendering is disabled.\n\t\t * This property is used for instanced rendering, where multiple copies of the geometry\n\t\t * are drawn with a single draw call.\n\t\t * @type {number}\n\t\t * @default -1\n\t\t */\n\t\tthis.instanceCount = -1;\n\n\t\t/**\n\t\t * A version number, incremented every time the attribute object or index object changes to mark VAO drity.\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.version = 0;\n\t}\n\n\t/**\n\t * Adds an attribute to this geometry.\n\t * Use this rather than the attributes property.\n\t * @param {string} name\n\t * @param {Attribute} attribute\n\t */\n\taddAttribute(name, attribute) {\n\t\tthis.attributes[name] = attribute;\n\t}\n\n\t/**\n\t * Returns the attribute with the specified name.\n\t * @param {string} name\n\t * @returns {Attribute}\n\t */\n\tgetAttribute(name) {\n\t\treturn this.attributes[name];\n\t}\n\n\t/**\n\t * Removes the attribute with the specified name.\n\t * @param {string} name\n\t */\n\tremoveAttribute(name) {\n\t\tdelete this.attributes[name];\n\t}\n\n\t/**\n\t * Set the {@link Geometry#index} buffer.\n\t * @param {Array | Attribute | null} index\n\t */\n\tsetIndex(index) {\n\t\tif (Array.isArray(index)) {\n\t\t\tconst typedArray = new (arrayMax(index) > 65535 ? Uint32Array : Uint16Array)(index);\n\t\t\tthis.index = new Attribute(new Buffer(typedArray, 1));\n\t\t} else {\n\t\t\tthis.index = index;\n\t\t}\n\t}\n\n\t/**\n\t * Adds a group to this geometry; see the {@link Geometry#groups} for details.\n\t * @param {number} start\n\t * @param {number} count\n\t * @param {number} [materialIndex=0]\n\t */\n\taddGroup(start, count, materialIndex = 0) {\n\t\tthis.groups.push({\n\t\t\tstart: start,\n\t\t\tcount: count,\n\t\t\tmaterialIndex: materialIndex\n\t\t});\n\t}\n\n\t/**\n\t * Clears all groups.\n\t */\n\tclearGroups() {\n\t\tthis.groups = [];\n\t}\n\n\t/**\n\t * Computes bounding box of the geometry, updating {@link Geometry#boundingBox}.\n\t * Bounding boxes aren't computed by default. They need to be explicitly computed.\n\t */\n\tcomputeBoundingBox() {\n\t\tconst position = this.attributes['a_Position'] || this.attributes['position'];\n\n\t\tif (position) {\n\t\t\tthis.boundingBox.setFromArray(position.buffer.array, position.buffer.stride, position.offset, position.normalized);\n\t\t}\n\n\t\tconst morphAttributesPosition = this.morphAttributes.position;\n\n\t\tif (morphAttributesPosition) {\n\t\t\tfor (let i = 0; i < morphAttributesPosition.length; i++) {\n\t\t\t\tconst morphAttribute = morphAttributesPosition[i];\n\n\t\t\t\t_box3.setFromArray(morphAttribute.buffer.array, morphAttribute.buffer.stride, morphAttribute.offset, morphAttribute.normalized);\n\n\t\t\t\t_vector.addVectors(this.boundingBox.min, _box3.min);\n\t\t\t\tthis.boundingBox.expandByPoint(_vector);\n\n\t\t\t\t_vector.addVectors(this.boundingBox.max, _box3.max);\n\t\t\t\tthis.boundingBox.expandByPoint(_vector);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Computes bounding sphere of the geometry, updating {@link Geometry#boundingSphere}.\n\t * Bounding spheres aren't computed by default. They need to be explicitly computed.\n\t */\n\tcomputeBoundingSphere() {\n\t\tconst position = this.attributes['a_Position'] || this.attributes['position'];\n\t\tconst morphAttributesPosition = this.morphAttributes.position;\n\n\t\tif (!position) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst bufferStride = position.buffer.stride;\n\t\tconst positionOffset = position.offset;\n\n\t\tif (morphAttributesPosition) {\n\t\t\t_box3.setFromArray(position.buffer.array, bufferStride, positionOffset, position.normalized);\n\n\t\t\tfor (let i = 0; i < morphAttributesPosition.length; i++) {\n\t\t\t\tconst morphAttribute = morphAttributesPosition[i];\n\n\t\t\t\t_boxMorphTargets.setFromArray(morphAttribute.buffer.array, morphAttribute.buffer.stride, morphAttribute.offset, morphAttribute.normalized);\n\n\t\t\t\t_vector.addVectors(_box3.min, _boxMorphTargets.min);\n\t\t\t\t_box3.expandByPoint(_vector);\n\n\t\t\t\t_vector.addVectors(_box3.max, _boxMorphTargets.max);\n\t\t\t\t_box3.expandByPoint(_vector);\n\t\t\t}\n\n\t\t\tconst center = this.boundingSphere.center;\n\t\t\t_box3.getCenter(center);\n\n\t\t\tlet maxRadiusSq = 0;\n\n\t\t\tfor (let i = 0; i < position.buffer.count; i++) {\n\t\t\t\t_offset.fromArray(position.buffer.array, i * bufferStride + positionOffset);\n\n\t\t\t\tmaxRadiusSq = center.distanceToSquared(_offset);\n\n\t\t\t\tfor (let j = 0; j < morphAttributesPosition.length; j++) {\n\t\t\t\t\tconst morphAttribute = morphAttributesPosition[j];\n\n\t\t\t\t\t_vector.fromArray(morphAttribute.buffer.array, i * morphAttribute.buffer.stride + morphAttribute.offset);\n\n\t\t\t\t\t_sum.addVectors(_offset, _vector);\n\n\t\t\t\t\tconst offsetLengthSq = center.distanceToSquared(_sum);\n\n\t\t\t\t\t// TODO The maximum radius cannot be obtained here\n\t\t\t\t\tif (offsetLengthSq > maxRadiusSq) {\n\t\t\t\t\t\tmaxRadiusSq = offsetLengthSq;\n\t\t\t\t\t\t_offset.add(_vector);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis.boundingSphere.radius = Math.sqrt(maxRadiusSq);\n\t\t} else {\n\t\t\tthis.boundingSphere.setFromArray(position.buffer.array, bufferStride, positionOffset, position.normalized);\n\t\t}\n\t}\n\n\t/**\n\t * Disposes the object from memory.\n\t * You need to call this when you want the BufferGeometry removed while the application is running.\n\t */\n\tdispose() {\n\t\tthis.dispatchEvent({ type: 'dispose' });\n\t}\n\n\t/**\n\t * Copies another Geometry to this Geometry.\n\t * @param {Geometry} source - The geometry to be copied.\n\t * @returns {Geometry}\n\t */\n\tcopy(source) {\n\t\tlet name, i, l;\n\n\t\t// reset\n\n\t\tthis.index = null;\n\t\tthis.attributes = {};\n\t\tthis.morphAttributes = {};\n\t\tthis.groups = [];\n\t\tconst buffers = new WeakMap(); // used for storing cloned, shared buffers\n\n\t\t// index\n\n\t\tconst index = source.index;\n\n\t\tif (index !== null) {\n\t\t\tthis.setIndex(index.clone(buffers));\n\t\t}\n\n\t\t// attributes\n\n\t\tconst attributes = source.attributes;\n\n\t\tfor (name in attributes) {\n\t\t\tconst attribute = attributes[name];\n\t\t\tthis.addAttribute(name, attribute.clone(buffers));\n\t\t}\n\n\t\t// morph attributes\n\n\t\tconst morphAttributes = source.morphAttributes;\n\n\t\tfor (name in morphAttributes) {\n\t\t\tconst array = [];\n\t\t\tconst morphAttribute = morphAttributes[name]; // morphAttribute: array of Float32BufferAttributes\n\n\t\t\tfor (i = 0, l = morphAttribute.length; i < l; i++) {\n\t\t\t\tarray.push(morphAttribute[i].clone(buffers));\n\t\t\t}\n\n\t\t\tthis.morphAttributes[name] = array;\n\t\t}\n\n\t\t// groups\n\n\t\tconst groups = source.groups;\n\n\t\tfor (i = 0, l = groups.length; i < l; i++) {\n\t\t\tconst group = groups[i];\n\t\t\tthis.addGroup(group.start, group.count, group.materialIndex);\n\t\t}\n\n\t\t// boundings\n\t\tthis.boundingBox.copy(source.boundingBox);\n\t\tthis.boundingSphere.copy(source.boundingSphere);\n\n\t\t// instance count\n\t\tthis.instanceCount = source.instanceCount;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Creates a clone of this Geometry.\n\t * @returns {Geometry}\n\t */\n\tclone() {\n\t\treturn new Geometry().copy(this);\n\t}\n\n}\n\nfunction arrayMax(array) {\n\tif (array.length === 0) return -Infinity;\n\n\tlet max = array[0];\n\n\tfor (let i = 1, l = array.length; i < l; ++i) {\n\t\tif (array[i] > max) max = array[i];\n\t}\n\n\treturn max;\n}\n\nexport { Geometry };"
  },
  {
    "path": "src/resources/geometries/PlaneGeometry.js",
    "content": "import { Geometry } from './Geometry.js';\nimport { Attribute } from './Attribute.js';\nimport { Buffer } from './Buffer.js';\n\n/**\n * A class for generating plane geometries.\n * @extends Geometry\n */\nclass PlaneGeometry extends Geometry {\n\n\t/**\n\t * @param {number} [width=1] — Width along the X axis.\n\t * @param {number} [height=1] — Height along the Y axis.\n\t * @param {number} [widthSegments=1]\n\t * @param {number} [heightSegments=1]\n\t */\n\tconstructor(width = 1, height = 1, widthSegments = 1, heightSegments = 1) {\n\t\tsuper();\n\n\t\tconst width_half = width / 2;\n\t\tconst height_half = height / 2;\n\n\t\tconst gridX = Math.floor(widthSegments);\n\t\tconst gridY = Math.floor(heightSegments);\n\n\t\tconst gridX1 = gridX + 1;\n\t\tconst gridY1 = gridY + 1;\n\n\t\tconst segment_width = width / gridX;\n\t\tconst segment_height = height / gridY;\n\n\t\tlet ix, iy;\n\n\t\t// buffers\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\t// generate vertices, normals and uvs\n\n\t\tfor (iy = 0; iy < gridY1; iy++) {\n\t\t\tconst y = iy * segment_height - height_half;\n\n\t\t\tfor (ix = 0; ix < gridX1; ix++) {\n\t\t\t\tconst x = ix * segment_width - width_half;\n\n\t\t\t\tvertices.push(x, 0, y);\n\n\t\t\t\tnormals.push(0, 1, 0);\n\n\t\t\t\tuvs.push(ix / gridX);\n\t\t\t\tuvs.push(1 - (iy / gridY));\n\t\t\t}\n\t\t}\n\n\t\t// indices\n\n\t\tfor (iy = 0; iy < gridY; iy++) {\n\t\t\tfor (ix = 0; ix < gridX; ix++) {\n\t\t\t\tconst a = ix + gridX1 * iy;\n\t\t\t\tconst b = ix + gridX1 * (iy + 1);\n\t\t\t\tconst c = (ix + 1) + gridX1 * (iy + 1);\n\t\t\t\tconst d = (ix + 1) + gridX1 * iy;\n\n\t\t\t\t// faces\n\n\t\t\t\tindices.push(a, b, d);\n\t\t\t\tindices.push(b, c, d);\n\t\t\t}\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex(new Attribute(new Buffer(\n\t\t\t(vertices.length / 3) > 65536 ? new Uint32Array(indices) : new Uint16Array(indices),\n\t\t\t1\n\t\t)));\n\t\tthis.addAttribute('a_Position', new Attribute(new Buffer(new Float32Array(vertices), 3)));\n\t\tthis.addAttribute('a_Normal', new Attribute(new Buffer(new Float32Array(normals), 3)));\n\t\tthis.addAttribute('a_Uv', new Attribute(new Buffer(new Float32Array(uvs), 2)));\n\n\t\tthis.computeBoundingBox();\n\t\tthis.computeBoundingSphere();\n\t}\n\n}\n\nexport { PlaneGeometry };\n"
  },
  {
    "path": "src/resources/geometries/SphereGeometry.js",
    "content": "import { Geometry } from './Geometry.js';\nimport { Attribute } from './Attribute.js';\nimport { Buffer } from './Buffer.js';\nimport { Vector3 } from '../../math/Vector3.js';\n\n/**\n * A class for generating sphere geometries.\n * The geometry is created by sweeping and calculating vertexes around the Y axis (horizontal sweep) and the Z axis (vertical sweep).\n * Thus, incomplete spheres (akin to 'sphere slices') can be created through the use of different values of phiStart, phiLength, thetaStart and thetaLength, in order to define the points in which we start (or end) calculating those vertices.\n * @extends Geometry\n */\nclass SphereGeometry extends Geometry {\n\n\t/**\n\t * @param {number} [radius=1] — sphere radius. Default is 1.\n\t * @param {number} [widthSegments=8] — number of horizontal segments. Minimum value is 3, and the default is 8.\n\t * @param {number} [heightSegments=6] — number of vertical segments. Minimum value is 2, and the default is 6.\n\t * @param {number} [phiStart=0] — specify horizontal starting angle. Default is 0.\n\t * @param {number} [phiLength=Math.PI*2] — specify horizontal sweep angle size. Default is Math.PI * 2.\n\t * @param {number} [thetaStart=0] — specify vertical starting angle. Default is 0.\n\t * @param {number} [thetaLength=Math.PI] — specify vertical sweep angle size. Default is Math.PI.\n\t */\n\tconstructor(radius = 1, widthSegments = 8, heightSegments = 6, phiStart = 0, phiLength = Math.PI * 2, thetaStart = 0, thetaLength = Math.PI) {\n\t\tsuper();\n\n\t\twidthSegments = Math.max(3, Math.floor(widthSegments));\n\t\theightSegments = Math.max(2, Math.floor(heightSegments));\n\n\t\tconst thetaEnd = thetaStart + thetaLength;\n\n\t\tlet ix, iy;\n\n\t\tlet index = 0;\n\t\tconst grid = [];\n\n\t\tconst vertex = new Vector3();\n\t\tconst normal = new Vector3();\n\n\t\t// buffers\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\t// generate vertices, normals and uvs\n\n\t\tfor (iy = 0; iy <= heightSegments; iy++) {\n\t\t\tconst verticesRow = [];\n\n\t\t\tconst v = iy / heightSegments;\n\n\t\t\t// special case for the poles\n\t\t\t// https://github.com/mrdoob/three.js/pull/16043\n\n\t\t\tlet uOffset = 0;\n\n\t\t\tif (iy == 0 && thetaStart == 0) {\n\t\t\t\tuOffset = 0.5 / widthSegments;\n\t\t\t} else if (iy == heightSegments && thetaEnd == Math.PI) {\n\t\t\t\tuOffset = -0.5 / widthSegments;\n\t\t\t}\n\n\t\t\tfor (ix = 0; ix <= widthSegments; ix++) {\n\t\t\t\tconst u = ix / widthSegments;\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertex.x = -radius * Math.cos(phiStart + u * phiLength) * Math.sin(thetaStart + v * thetaLength);\n\t\t\t\tvertex.y = radius * Math.cos(thetaStart + v * thetaLength);\n\t\t\t\tvertex.z = radius * Math.sin(phiStart + u * phiLength) * Math.sin(thetaStart + v * thetaLength);\n\n\t\t\t\tvertices.push(vertex.x, vertex.y, vertex.z);\n\n\t\t\t\t// normal\n\n\t\t\t\tnormal.copy(vertex).normalize();\n\t\t\t\tnormals.push(normal.x, normal.y, normal.z);\n\n\t\t\t\t// uv\n\n\t\t\t\tuvs.push(u + uOffset, 1 - v);\n\n\t\t\t\tverticesRow.push(index++);\n\t\t\t}\n\n\t\t\tgrid.push(verticesRow);\n\t\t}\n\n\t\t// indices\n\n\t\tfor (iy = 0; iy < heightSegments; iy++) {\n\t\t\tfor (ix = 0; ix < widthSegments; ix++) {\n\t\t\t\tconst a = grid[iy][ix + 1];\n\t\t\t\tconst b = grid[iy][ix];\n\t\t\t\tconst c = grid[iy + 1][ix];\n\t\t\t\tconst d = grid[iy + 1][ix + 1];\n\n\t\t\t\tif (iy !== 0 || thetaStart > 0) indices.push(a, b, d);\n\t\t\t\tif (iy !== heightSegments - 1 || thetaEnd < Math.PI) indices.push(b, c, d);\n\t\t\t}\n\t\t}\n\n\t\tthis.setIndex(new Attribute(new Buffer(\n\t\t\t(vertices.length / 3) > 65536 ? new Uint32Array(indices) : new Uint16Array(indices),\n\t\t\t1\n\t\t)));\n\t\tthis.addAttribute('a_Position', new Attribute(new Buffer(new Float32Array(vertices), 3)));\n\t\tthis.addAttribute('a_Normal', new Attribute(new Buffer(new Float32Array(normals), 3)));\n\t\tthis.addAttribute('a_Uv', new Attribute(new Buffer(new Float32Array(uvs), 2)));\n\n\t\tthis.computeBoundingBox();\n\t\tthis.computeBoundingSphere();\n\t}\n\n}\n\nexport { SphereGeometry };"
  },
  {
    "path": "src/resources/geometries/TorusKnotGeometry.js",
    "content": "import { Geometry } from './Geometry.js';\nimport { Attribute } from './Attribute.js';\nimport { Buffer } from './Buffer.js';\nimport { Vector3 } from '../../math/Vector3.js';\n\n/**\n * Creates a torus knot, the particular shape of which is defined by a pair of coprime integers, p and q.\n * If p and q are not coprime, the result will be a torus link.\n * @extends Geometry\n */\nclass TorusKnotGeometry extends Geometry {\n\n\t/**\n\t * @param {number} [radius=1] — Radius of the torus. Default is 1.\n\t * @param {number} [tube=0.4] — Radius of the tube. Default is 0.4.\n\t * @param {number} [tubularSegments=64] — Default is 64.\n\t * @param {number} [radialSegments=8] — Default is 8.\n\t * @param {number} [p=2] — This value determines, how many times the geometry winds around its axis of rotational symmetry. Default is 2.\n\t * @param {number} [q=3] — This value determines, how many times the geometry winds around a circle in the interior of the torus. Default is 3.\n\t */\n\tconstructor(radius = 1, tube = 0.4, tubularSegments = 64, radialSegments = 8, p = 2, q = 3) {\n\t\tsuper();\n\n\t\ttubularSegments = Math.floor(tubularSegments);\n\t\tradialSegments = Math.floor(radialSegments);\n\n\t\t// buffers\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\t// helper variables\n\n\t\tlet i, j;\n\n\t\tconst vertex = new Vector3();\n\t\tconst normal = new Vector3();\n\n\t\tconst P1 = new Vector3();\n\t\tconst P2 = new Vector3();\n\n\t\tconst B = new Vector3();\n\t\tconst T = new Vector3();\n\t\tconst N = new Vector3();\n\n\t\t// generate vertices, normals and uvs\n\n\t\tfor (i = 0; i <= tubularSegments; ++i) {\n\t\t\t// the radian \"u\" is used to calculate the position on the torus curve of the current tubular segement\n\n\t\t\tconst u = i / tubularSegments * p * Math.PI * 2;\n\n\t\t\t// now we calculate two points. P1 is our current position on the curve, P2 is a little farther ahead.\n\t\t\t// these points are used to create a special \"coordinate space\", which is necessary to calculate the correct vertex positions\n\n\t\t\tcalculatePositionOnCurve(u, p, q, radius, P1);\n\t\t\tcalculatePositionOnCurve(u + 0.01, p, q, radius, P2);\n\n\t\t\t// calculate orthonormal basis\n\n\t\t\tT.subVectors(P2, P1);\n\t\t\tN.addVectors(P2, P1);\n\t\t\tB.crossVectors(T, N);\n\t\t\tN.crossVectors(B, T);\n\n\t\t\t// normalize B, N. T can be ignored, we don't use it\n\n\t\t\tB.normalize();\n\t\t\tN.normalize();\n\n\t\t\tfor (j = 0; j <= radialSegments; ++j) {\n\t\t\t\t// now calculate the vertices. they are nothing more than an extrusion of the torus curve.\n\t\t\t\t// because we extrude a shape in the xy-plane, there is no need to calculate a z-value.\n\n\t\t\t\tconst v = j / radialSegments * Math.PI * 2;\n\t\t\t\tconst cx = -tube * Math.cos(v);\n\t\t\t\tconst cy = tube * Math.sin(v);\n\n\t\t\t\t// now calculate the final vertex position.\n\t\t\t\t// first we orient the extrusion with our basis vectos, then we add it to the current position on the curve\n\n\t\t\t\tvertex.x = P1.x + (cx * N.x + cy * B.x);\n\t\t\t\tvertex.y = P1.y + (cx * N.y + cy * B.y);\n\t\t\t\tvertex.z = P1.z + (cx * N.z + cy * B.z);\n\n\t\t\t\tvertices.push(vertex.x, vertex.y, vertex.z);\n\n\t\t\t\t// normal (P1 is always the center/origin of the extrusion, thus we can use it to calculate the normal)\n\n\t\t\t\tnormal.subVectors(vertex, P1).normalize();\n\n\t\t\t\tnormals.push(normal.x, normal.y, normal.z);\n\n\t\t\t\t// uv\n\n\t\t\t\tuvs.push(i / tubularSegments);\n\t\t\t\tuvs.push(j / radialSegments);\n\t\t\t}\n\t\t}\n\n\t\t// generate indices\n\n\t\tfor (j = 1; j <= tubularSegments; j++) {\n\t\t\tfor (i = 1; i <= radialSegments; i++) {\n\t\t\t\t// indices\n\n\t\t\t\tconst a = (radialSegments + 1) * (j - 1) + (i - 1);\n\t\t\t\tconst b = (radialSegments + 1) * j + (i - 1);\n\t\t\t\tconst c = (radialSegments + 1) * j + i;\n\t\t\t\tconst d = (radialSegments + 1) * (j - 1) + i;\n\n\t\t\t\t// faces\n\n\t\t\t\tindices.push(a, b, d);\n\t\t\t\tindices.push(b, c, d);\n\t\t\t}\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex(new Attribute(new Buffer(\n\t\t\t(vertices.length / 3) > 65536 ? new Uint32Array(indices) : new Uint16Array(indices),\n\t\t\t1\n\t\t)));\n\t\tthis.addAttribute('a_Position', new Attribute(new Buffer(new Float32Array(vertices), 3)));\n\t\tthis.addAttribute('a_Normal', new Attribute(new Buffer(new Float32Array(normals), 3)));\n\t\tthis.addAttribute('a_Uv', new Attribute(new Buffer(new Float32Array(uvs), 2)));\n\n\t\tthis.computeBoundingBox();\n\t\tthis.computeBoundingSphere();\n\n\t\t// this function calculates the current position on the torus curve\n\n\t\tfunction calculatePositionOnCurve(u, p, q, radius, position) {\n\t\t\tconst cu = Math.cos(u);\n\t\t\tconst su = Math.sin(u);\n\t\t\tconst quOverP = q / p * u;\n\t\t\tconst cs = Math.cos(quOverP);\n\n\t\t\tposition.x = radius * (2 + cs) * 0.5 * cu;\n\t\t\tposition.y = radius * (2 + cs) * su * 0.5;\n\t\t\tposition.z = radius * Math.sin(quOverP) * 0.5;\n\t\t}\n\t}\n\n}\n\nexport { TorusKnotGeometry };"
  },
  {
    "path": "src/resources/materials/BasicMaterial.js",
    "content": "import { Material } from './Material.js';\nimport { MATERIAL_TYPE } from '../../const.js';\n\n/**\n * A material for drawing geometries in a simple shaded (flat or wireframe) way.\n * This material is not affected by lights.\n * @extends Material\n */\nclass BasicMaterial extends Material {\n\n\t/**\n\t * Create a BasicMaterial.\n\t */\n\tconstructor() {\n\t\tsuper();\n\n\t\tthis.type = MATERIAL_TYPE.BASIC;\n\t}\n\n}\n\nexport { BasicMaterial };"
  },
  {
    "path": "src/resources/materials/DepthMaterial.js",
    "content": "import { Material } from './Material.js';\nimport { MATERIAL_TYPE } from '../../const.js';\n\n/**\n * A material for drawing geometry by depth.\n * Depth is based off of the camera near and far plane. White is nearest, black is farthest.\n * @extends Material\n */\nclass DepthMaterial extends Material {\n\n\t/**\n\t * Create a DepthMaterial.\n\t */\n\tconstructor() {\n\t\tsuper();\n\n\t\tthis.type = MATERIAL_TYPE.DEPTH;\n\n\t\t/**\n\t\t * Encoding for depth packing.\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.packToRGBA = false;\n\t}\n\n}\n\nexport { DepthMaterial };"
  },
  {
    "path": "src/resources/materials/DistanceMaterial.js",
    "content": "import { Material } from './Material.js';\nimport { MATERIAL_TYPE } from '../../const.js';\n\n/**\n * A material for drawing geometry by distance.\n * @extends Material\n */\nclass DistanceMaterial extends Material {\n\n\t/**\n\t * Create a DistanceMaterial.\n\t */\n\tconstructor() {\n\t\tsuper();\n\n\t\tthis.type = MATERIAL_TYPE.DISTANCE;\n\t}\n\n}\n\nexport { DistanceMaterial };"
  },
  {
    "path": "src/resources/materials/LambertMaterial.js",
    "content": "import { Material } from './Material.js';\nimport { MATERIAL_TYPE } from '../../const.js';\n\n/**\n * A material for non-shiny surfaces, without specular highlights.\n * The material uses a non-physically based Lambertian model for calculating reflectance.\n * This can simulate some surfaces (such as untreated wood or stone) well, but cannot simulate shiny surfaces with specular highlights (such as varnished wood).\n * @extends Material\n */\nclass LambertMaterial extends Material {\n\n\t/**\n\t * Create a LambertMaterial.\n\t */\n\tconstructor() {\n\t\tsuper();\n\n\t\tthis.type = MATERIAL_TYPE.LAMBERT;\n\n\t\t/**\n\t\t * @default true\n\t\t */\n\t\tthis.acceptLight = true;\n\t}\n\n}\n\nexport { LambertMaterial };"
  },
  {
    "path": "src/resources/materials/LineMaterial.js",
    "content": "import { Material } from './Material.js';\nimport { MATERIAL_TYPE, DRAW_MODE } from '../../const.js';\n\n/**\n * A material for drawing wireframe-style geometries.\n * @extends Material\n */\nclass LineMaterial extends Material {\n\n\t/**\n\t * Create a LineMaterial.\n\t */\n\tconstructor() {\n\t\tsuper();\n\n\t\tthis.type = MATERIAL_TYPE.LINE;\n\n\t\t/**\n\t\t * Controls line thickness.\n\t\t * Due to limitations of the OpenGL Core Profile with the WebGL renderer on most platforms linewidth will always be 1 regardless of the set value.\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.lineWidth = 1;\n\n\t\t/**\n\t\t * Set draw mode to LINES / LINE_LOOP / LINE_STRIP\n\t\t * @type {DRAW_MODE}\n\t\t * @default DRAW_MODE.LINES\n\t\t */\n\t\tthis.drawMode = DRAW_MODE.LINES;\n\t}\n\n\tcopy(source) {\n\t\tsuper.copy(source);\n\n\t\tthis.lineWidth = source.lineWidth;\n\n\t\treturn this;\n\t}\n\n}\n\nexport { LineMaterial };"
  },
  {
    "path": "src/resources/materials/Material.js",
    "content": "import { BLEND_TYPE, BLEND_EQUATION, BLEND_FACTOR, ENVMAP_COMBINE_TYPE, DRAW_SIDE, SHADING_TYPE, DRAW_MODE, COMPARE_FUNC, OPERATION, VERTEX_COLOR, MATERIAL_TYPE } from '../../const.js';\nimport { cloneUniforms } from '../../base.js';\nimport { EventDispatcher } from '../../EventDispatcher.js';\nimport { Color3 } from '../../math/Color3.js';\nimport { Vector2 } from '../../math/Vector2.js';\nimport { TransformUV } from '../TransformUV.js';\nimport { MathUtils } from '../../math/MathUtils.js';\n\nlet _materialId = 0;\n\n/**\n * Abstract base class for materials.\n * Materials describe the appearance of {@link Object3D}.\n * They are defined in a (mostly) renderer-independent way, so you don't have to rewrite materials if you decide to use a different renderer.\n * The following properties and methods are inherited by all other material types (although they may have different defaults).\n * @abstract\n * @extends EventDispatcher\n */\nclass Material extends EventDispatcher {\n\n\tconstructor() {\n\t\tsuper();\n\n\t\t/**\n\t\t * Unique number for this material instance.\n\t\t * @readonly\n\t\t * @type {number}\n\t\t */\n\t\tthis.id = _materialId++;\n\n\t\t/**\n\t\t * UUID of this material instance.\n\t\t * This gets automatically assigned, so this shouldn't be edited.\n\t\t * @type {string}\n\t\t */\n\t\tthis.uuid = MathUtils.generateUUID();\n\n\t\t/**\n\t\t * Type of the material.\n\t\t * @type {MATERIAL_TYPE}\n\t\t * @default MATERIAL_TYPE.SHADER\n\t\t */\n\t\tthis.type = MATERIAL_TYPE.SHADER;\n\n\t\t/**\n\t\t * Custom shader name. This naming can help ShaderMaterial to optimize the length of the index hash string.\n\t\t * It is valid only when the material type is MATERIAL_TYPE.SHADER.\n\t\t * Otherwise, if the material is a built-in type, the name of the shader will always be equal to the material type.\n\t\t * @type {string}\n\t\t * @default \"\"\n\t\t */\n\t\tthis.shaderName = '';\n\n\t\t/**\n\t\t * Custom defines of the shader.\n\t\t * Only valid when the material type is MATERIAL_TYPE.SHADER.\n\t\t * @type {object}\n\t\t * @default {}\n\t\t */\n\t\tthis.defines = {};\n\n\t\t/**\n\t\t * Custom uniforms of the shader.\n\t\t * Only valid when the material type is MATERIAL_TYPE.SHADER.\n\t\t * @type {object}\n\t\t * @default {}\n\t\t */\n\t\tthis.uniforms = {};\n\n\t\t/**\n\t\t * Custom GLSL code for vertex shader.\n\t\t * Only valid when the material type is MATERIAL_TYPE.SHADER.\n\t\t * @type {string}\n\t\t * @default \"\"\n\t\t */\n\t\tthis.vertexShader = '';\n\n\t\t/**\n\t\t * Custom GLSL code for fragment shader.\n\t\t * Only valid when the material type is MATERIAL_TYPE.SHADER.\n\t\t * @type {string}\n\t\t * @default \"\"\n\t\t */\n\t\tthis.fragmentShader = '';\n\n\t\t/**\n\t\t * Override the renderer's default precision for this material.\n\t\t * Can be \"highp\", \"mediump\" or \"lowp\".\n\t\t * @type {string}\n\t\t * @default null\n\t\t */\n\t\tthis.precision = null;\n\n\t\t/**\n\t\t * The bitmask of UV coordinate channels to use for the external texture.\n\t\t * This will be combined with the internal UV coordinate mask collected from the renderer by default.\n\t\t * Finally, it will be used to determine which UV coordinate attribute to use and to generate the shader code.\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.extUvCoordMask = 0;\n\n\t\t/**\n\t\t * Defines whether this material is transparent.\n\t\t * This has an effect on rendering as transparent objects need special treatment and are rendered after non-transparent objects.\n\t\t * When set to true, the extent to which the material is transparent is controlled by setting it's blending property.\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.transparent = false;\n\n\t\t/**\n\t\t * Which blending to use when displaying objects with this material.\n\t\t * This must be set to BLEND_TYPE.CUSTOM to use custom blendSrc, blendDst or blendEquation.\n\t\t * @type {BLEND_TYPE}\n\t\t * @default BLEND_TYPE.NORMAL\n\t\t */\n\t\tthis.blending = BLEND_TYPE.NORMAL;\n\n\t\t/**\n\t\t * Blending source.\n\t\t * The {@link Material#blending} must be set to BLEND_TYPE.CUSTOM for this to have any effect.\n\t\t * @type {BLEND_FACTOR}\n\t\t * @default BLEND_FACTOR.SRC_ALPHA\n\t\t */\n\t\tthis.blendSrc = BLEND_FACTOR.SRC_ALPHA;\n\n\t\t/**\n\t\t * Blending destination.\n\t\t * The {@link Material#blending} must be set to BLEND_TYPE.CUSTOM for this to have any effect.\n\t\t * @type {BLEND_FACTOR}\n\t\t * @default BLEND_FACTOR.ONE_MINUS_SRC_ALPHA\n\t\t */\n\t\tthis.blendDst = BLEND_FACTOR.ONE_MINUS_SRC_ALPHA;\n\n\t\t/**\n\t\t * Blending equation to use when applying blending.\n\t\t * The {@link Material#blending} must be set to BLEND_TYPE.CUSTOM for this to have any effect.\n\t\t * @type {BLEND_EQUATION}\n\t\t * @default BLEND_EQUATION.ADD\n\t\t */\n\t\tthis.blendEquation = BLEND_EQUATION.ADD;\n\n\t\t/**\n\t\t * The transparency of the {@link Material#blendSrc}.\n\t\t * The {@link Material#blending} must be set to BLEND_TYPE.CUSTOM for this to have any effect.\n\t\t * @type {BLEND_FACTOR}\n\t\t * @default null\n\t\t */\n\t\tthis.blendSrcAlpha = null;\n\n\t\t/**\n\t\t * The transparency of the {@link Material#blendDst}.\n\t\t * The {@link Material#blending} must be set to BLEND_TYPE.CUSTOM for this to have any effect.\n\t\t * @type {BLEND_FACTOR}\n\t\t * @default null\n\t\t */\n\t\tthis.blendDstAlpha = null;\n\n\t\t/**\n\t\t * The tranparency of the {@link Material#blendEquation}.\n\t\t * The {@link Material#blending} must be set to BLEND_TYPE.CUSTOM for this to have any effect.\n\t\t * @type {BLEND_EQUATION}\n\t\t * @default null\n\t\t */\n\t\tthis.blendEquationAlpha = null;\n\n\t\t/**\n\t\t * Whether to premultiply the alpha (transparency) value.\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.premultipliedAlpha = false;\n\n\t\t/**\n\t\t * Defines whether vertex coloring is used.\n\t\t * @type {VERTEX_COLOR}\n\t\t * @default VERTEX_COLOR.NONE\n\t\t */\n\t\tthis.vertexColors = VERTEX_COLOR.NONE;\n\n\t\t/**\n\t\t * Defines whether precomputed vertex tangents, which must be provided in a vec4 \"tangent\" attribute, are used.\n\t\t * When disabled, tangents are derived automatically.\n\t\t * Using precomputed tangents will give more accurate normal map details in some cases, such as with mirrored UVs.\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.vertexTangents = false;\n\n\t\t/**\n\t\t * Float in the range of 0.0 - 1.0 indicating how transparent the material is.\n\t\t * A value of 0.0 indicates fully transparent, 1.0 is fully opaque.\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.opacity = 1;\n\n\t\t/**\n\t\t * The diffuse color.\n\t\t * @type {Color3}\n\t\t * @default Color3(0xffffff)\n\t\t */\n\t\tthis.diffuse = new Color3(0xffffff);\n\n\t\t/**\n\t\t * The diffuse map.\n\t\t * @type {Texture2D}\n\t\t * @default null\n\t\t */\n\t\tthis.diffuseMap = null;\n\n\t\t/**\n\t\t * Define the UV chanel for the diffuse map to use starting from 0 and defaulting to 0.\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.diffuseMapCoord = 0;\n\n\t\t/**\n\t\t * The uv-transform matrix of diffuse map.\n\t\t * This will also affect other maps that cannot be individually specified uv transform, such as normalMap, bumpMap, etc.\n\t\t * @type {TransformUV}\n\t\t * @default TransformUV()\n\t\t */\n\t\tthis.diffuseMapTransform = new TransformUV();\n\n\t\t/**\n\t\t * The alpha map.\n\t\t * @type {Texture2D}\n\t\t * @default null\n\t\t */\n\t\tthis.alphaMap = null;\n\n\t\t/**\n\t\t * Define the UV chanel for the alpha map to use starting from 0 and defaulting to 0.\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.alphaMapCoord = 0;\n\n\t\t/**\n\t\t * The uv-transform matrix of alpha map.\n\t\t * @type {TransformUV}\n\t\t * @default TransformUV()\n\t\t */\n\t\tthis.alphaMapTransform = new TransformUV();\n\n\t\t/**\n\t\t * Emissive (light) color of the material, essentially a solid color unaffected by other lighting.\n\t\t * @type {Color3}\n\t\t * @default Color3(0x000000)\n\t\t */\n\t\tthis.emissive = new Color3(0x000000);\n\n\t\t/**\n\t\t * Set emissive (glow) map.\n\t\t * The emissive map color is modulated by the emissive color.\n\t\t * If you have an emissive map, be sure to set the emissive color to something other than black.\n\t\t * @type {Texture2D}\n\t\t * @default null\n\t\t */\n\t\tthis.emissiveMap = null;\n\n\t\t/**\n\t\t * Define the UV chanel for the emissive map to use starting from 0 and defaulting to 0.\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.emissiveMapCoord = 0;\n\n\t\t/**\n\t\t * The uv-transform matrix of emissive map.\n\t\t * @type {TransformUV}\n\t\t * @default TransformUV()\n\t\t */\n\t\tthis.emissiveMapTransform = new TransformUV();\n\n\t\t/**\n\t\t * The red channel of this texture is used as the ambient occlusion map.\n\t\t * @type {Texture2D}\n\t\t * @default null\n\t\t */\n\t\tthis.aoMap = null;\n\n\t\t/**\n\t\t * Intensity of the ambient occlusion effect.\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.aoMapIntensity = 1.0;\n\n\t\t/**\n\t\t * Define the UV chanel for the ao map to use starting from 0 and defaulting to 0.\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.aoMapCoord = 0;\n\n\t\t/**\n\t\t * The uv-transform matrix of ao map.\n\t\t * @type {TransformUV}\n\t\t * @default TransformUV()\n\t\t */\n\t\tthis.aoMapTransform = new TransformUV();\n\n\t\t/**\n\t\t * The normal map.\n\t\t * @type {Texture2D}\n\t\t * @default null\n\t\t */\n\t\tthis.normalMap = null;\n\n\t\t/**\n\t\t * How much the normal map affects the material. Typical ranges are 0-1.\n\t\t * @type {Vector2}\n\t\t * @default Vector2(1,1)\n\t\t */\n\t\tthis.normalScale = new Vector2(1, 1);\n\n\t\t/**\n\t\t * The texture to create a bump map.\n\t\t * The black and white values map to the perceived depth in relation to the lights. Bump doesn't actually affect the geometry of the object, only the lighting.\n\t\t * @type {Texture2D}\n\t\t * @default null\n\t\t */\n\t\tthis.bumpMap = null;\n\n\t\t/**\n\t\t * How much the bump map affects the material.\n\t\t * Typical ranges are 0-1.\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.bumpScale = 1;\n\n\t\t/**\n\t\t * The environment map.\n\t\t * If set to undefined, then the material will not inherit envMap from scene.environment.\n\t\t * @type {TextureCube|null|undefined}\n\t\t * @default null\n\t\t */\n\t\tthis.envMap = null;\n\n\t\t/**\n\t\t * Scales the effect of the environment map by multiplying its color.\n\t\t * This can effect both the diffuse and specular components of environment map.\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.envMapIntensity = 1;\n\n\t\t/**\n\t\t * How to combine the result of the surface's color with the environment map, if any.\n\t\t * This has no effect in a {@link PBRMaterial}.\n\t\t * @type {ENVMAP_COMBINE_TYPE}\n\t\t * @default ENVMAP_COMBINE_TYPE.MULTIPLY\n\t\t */\n\t\tthis.envMapCombine = ENVMAP_COMBINE_TYPE.MULTIPLY;\n\n\t\t/**\n\t\t * Which depth function to use. See the {@link COMPARE_FUNC} constants for all possible values.\n\t\t * @type {COMPARE_FUNC}\n\t\t * @default COMPARE_FUNC.LEQUAL\n\t\t */\n\t\tthis.depthFunc = COMPARE_FUNC.LEQUAL;\n\n\t\t/**\n\t\t * Whether to have depth test enabled when rendering this material.\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.depthTest = true;\n\n\t\t/**\n\t\t * Whether rendering this material has any effect on the depth buffer.\n\t\t * When drawing 2D overlays it can be useful to disable the depth writing in order to layer several things together without creating z-index artifacts.\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.depthWrite = true;\n\n\t\t/**\n\t\t * Whether to render the material's color.\n\t\t * This can be used in conjunction with a mesh's renderOrder property to create invisible objects that occlude other objects.\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.colorWrite = true;\n\n\t\t/**\n\t\t * Whether stencil operations are performed against the stencil buffer.\n\t\t * In order to perform writes or comparisons against the stencil buffer this value must be true.\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.stencilTest = false;\n\n\t\t/**\n\t\t * The bit mask to use when writing to the stencil buffer.\n\t\t * @type {number}\n\t\t * @default 0xFF\n\t\t */\n\t\tthis.stencilWriteMask = 0xff;\n\n\t\t/**\n\t\t * The stencil comparison function to use.\n\t\t * See the {@link COMPARE_FUNC} constants for all possible values.\n\t\t * @type {COMPARE_FUNC}\n\t\t * @default COMPARE_FUNC.ALWAYS\n\t\t */\n\t\tthis.stencilFunc = COMPARE_FUNC.ALWAYS;\n\n\t\t/**\n\t\t * The value to use when performing stencil comparisons or stencil operations.\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.stencilRef = 0;\n\n\t\t/**\n\t\t * The bit mask to use when comparing against the stencil buffer.\n\t\t * @type {number}\n\t\t * @default 0xFF\n\t\t */\n\t\tthis.stencilFuncMask = 0xff;\n\n\t\t/**\n\t\t * Which stencil operation to perform when the comparison function returns false.\n\t\t * See the {@link OPERATION} constants for all possible values.\n\t\t * @type {OPERATION}\n\t\t * @default OPERATION.KEEP\n\t\t */\n\t\tthis.stencilFail = OPERATION.KEEP;\n\n\t\t/**\n\t\t * Which stencil operation to perform when the comparison function returns true but the depth test fails.\n\t\t * See the {@link OPERATION} constants for all possible values.\n\t\t * @type {OPERATION}\n\t\t * @default OPERATION.KEEP\n\t\t */\n\t\tthis.stencilZFail = OPERATION.KEEP;\n\n\t\t/**\n\t\t * Which stencil operation to perform when the comparison function returns true and the depth test passes.\n\t\t * See the {@link OPERATION} constants for all possible values.\n\t\t * @type {OPERATION}\n\t\t * @default OPERATION.KEEP\n\t\t */\n\t\tthis.stencilZPass = OPERATION.KEEP;\n\n\t\t/**\n\t\t * The stencil comparison function to use.\n\t\t * See the {@link COMPARE_FUNC} constants for all possible values.\n\t\t * You can explicitly specify the two-sided stencil function state by defining stencilFuncBack, stencilRefBack and stencilFuncMaskBack.\n\t\t * @type {COMPARE_FUNC|null}\n\t\t * @default null\n\t\t */\n\t\tthis.stencilFuncBack = null;\n\n\t\t/**\n\t\t * The value to use when performing stencil comparisons or stencil operations.\n\t\t * You can explicitly specify the two-sided stencil function state by defining stencilFuncBack, stencilRefBack and stencilFuncMaskBack.\n\t\t * @type {number | null}\n\t\t * @default null\n\t\t */\n\t\tthis.stencilRefBack = null;\n\n\t\t/**\n\t\t * The bit mask to use when comparing against the stencil buffer.\n\t\t * You can explicitly specify the two-sided stencil function state by defining stencilFuncBack, stencilRefBack and stencilFuncMaskBack.\n\t\t * @type {number | null}\n\t\t * @default null\n\t\t */\n\t\tthis.stencilFuncMaskBack = null;\n\n\t\t/**\n\t\t * Which stencil operation to perform when the comparison function returns false.\n\t\t * See the {@link OPERATION} constants for all possible values.\n\t\t * You can explicitly specify the two-sided stencil op state by defining stencilFailBack, stencilZFailBack and stencilZPassBack.\n\t\t * @type {OPERATION|null}\n\t\t * @default null\n\t\t */\n\t\tthis.stencilFailBack = null;\n\n\t\t/**\n\t\t * Which stencil operation to perform when the comparison function returns true but the depth test fails.\n\t\t * See the {@link OPERATION} constants for all possible values.\n\t\t * You can explicitly specify the two-sided stencil op state by defining stencilFailBack, stencilZFailBack and stencilZPassBack.\n\t\t * @type {OPERATION|null}\n\t\t * @default null\n\t\t */\n\t\tthis.stencilZFailBack = null;\n\n\t\t/**\n\t\t * Which stencil operation to perform when the comparison function returns true and the depth test passes.\n\t\t * See the {@link OPERATION} constants for all possible values.\n\t\t * You can explicitly specify the two-sided stencil op state by defining stencilFailBack, stencilZFailBack and stencilZPassBack.\n\t\t * @type {OPERATION|null}\n\t\t * @default null\n\t\t */\n\t\tthis.stencilZPassBack = null;\n\n\t\t/**\n\t\t * User-defined clipping planes specified as Plane objects in world space.\n\t\t * These planes apply to the objects this material is attached to.\n\t\t * Points in space whose signed distance to the plane is negative are clipped (not rendered).\n\t\t * @type {Plane[]}\n\t\t * @default null\n\t\t */\n\t\tthis.clippingPlanes = null;\n\n\t\t/**\n\t\t * Sets the alpha value to be used when running an alpha test.\n\t\t * The material will not be renderered if the opacity is lower than this value.\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.alphaTest = 0;\n\n\t\t/**\n\t\t * Enables alpha to coverage.\n\t\t * Can only be used when MSAA is enabled.\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.alphaToCoverage = false;\n\n\t\t/**\n\t\t * Defines which side of faces will be rendered - front, back or double.\n\t\t * @type {DRAW_SIDE}\n\t\t * @default DRAW_SIDE.FRONT\n\t\t */\n\t\tthis.side = DRAW_SIDE.FRONT;\n\n\t\t/**\n\t\t * Whether to use polygon offset.\n\t\t * This corresponds to the GL_POLYGON_OFFSET_FILL WebGL feature.\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.polygonOffset = false;\n\n\t\t/**\n\t\t * Sets the polygon offset factor.\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.polygonOffsetFactor = 0;\n\n\t\t/**\n\t\t * Sets the polygon offset units.\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.polygonOffsetUnits = 0;\n\n\t\t/**\n\t\t * Define whether the material is rendered with flat shading or smooth shading.\n\t\t * @type {SHADING_TYPE}\n\t\t * @default SHADING_TYPE.SMOOTH_SHADING\n\t\t */\n\t\tthis.shading = SHADING_TYPE.SMOOTH_SHADING;\n\n\t\t/**\n\t\t * Whether to apply dithering to the color to remove the appearance of banding.\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.dithering = false;\n\n\t\t/**\n\t\t * Whether the material is affected by lights.\n\t\t * If set true, renderer will try to upload light uniforms.\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.acceptLight = false;\n\n\t\t/**\n\t\t * The lighting group of the material.\n\t\t * Used in conjunction with {@link Light#groupMask}.\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.lightingGroup = 0;\n\n\t\t/**\n\t\t * Whether the material is affected by fog.\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.fog = true;\n\n\t\t/**\n\t\t * Determines how the mesh triangles are constructed from the vertices.\n\t\t * @type {DRAW_MODE}\n\t\t * @default DRAW_MODE.TRIANGLES\n\t\t */\n\t\tthis.drawMode = DRAW_MODE.TRIANGLES;\n\n\t\t/**\n\t\t * Whether the material uniforms need to be updated every draw call.\n\t\t * If set false, the material uniforms are only updated once per frame , this can help optimize performance.\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.forceUpdateUniforms = true;\n\n\t\t/**\n\t\t * Specifies that the material needs to be recompiled.\n\t\t * This property is automatically set to true when instancing a new material.\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.needsUpdate = true;\n\t}\n\n\t/**\n\t * Copy the parameters from the passed material into this material.\n\t * @param {Material} source - The material to be copied.\n\t * @returns {Material}\n\t */\n\tcopy(source) {\n\t\tthis.shaderName = source.shaderName;\n\t\tthis.defines = Object.assign({}, source.defines);\n\t\tthis.uniforms = cloneUniforms(source.uniforms);\n\t\tthis.vertexShader = source.vertexShader;\n\t\tthis.fragmentShader = source.fragmentShader;\n\n\t\tthis.precision = source.precision;\n\t\tthis.extUvCoordMask = source.extUvCoordMask;\n\n\t\tthis.transparent = source.transparent;\n\t\tthis.blending = source.blending;\n\t\tthis.blendSrc = source.blendSrc;\n\t\tthis.blendDst = source.blendDst;\n\t\tthis.blendEquation = source.blendEquation;\n\t\tthis.blendSrcAlpha = source.blendSrcAlpha;\n\t\tthis.blendDstAlpha = source.blendDstAlpha;\n\t\tthis.blendEquationAlpha = source.blendEquationAlpha;\n\t\tthis.premultipliedAlpha = source.premultipliedAlpha;\n\t\tthis.vertexColors = source.vertexColors;\n\t\tthis.vertexTangents = source.vertexTangents;\n\n\t\tthis.opacity = source.opacity;\n\t\tthis.diffuse.copy(source.diffuse);\n\t\tthis.diffuseMap = source.diffuseMap;\n\t\tthis.diffuseMapCoord = source.diffuseMapCoord;\n\t\tthis.diffuseMapTransform.copy(source.diffuseMapTransform);\n\t\tthis.alphaMap = source.alphaMap;\n\t\tthis.alphaMapCoord = source.alphaMapCoord;\n\t\tthis.alphaMapTransform.copy(source.alphaMapTransform);\n\t\tthis.emissive.copy(source.emissive);\n\t\tthis.emissiveMap = source.emissiveMap;\n\t\tthis.emissiveMapCoord = source.emissiveMapCoord;\n\t\tthis.emissiveMapTransform.copy(source.emissiveMapTransform);\n\t\tthis.aoMap = source.aoMap;\n\t\tthis.aoMapIntensity = source.aoMapIntensity;\n\t\tthis.aoMapCoord = source.aoMapCoord;\n\t\tthis.aoMapTransform.copy(source.aoMapTransform);\n\t\tthis.normalMap = source.normalMap;\n\t\tthis.normalScale.copy(source.normalScale);\n\t\tthis.bumpMap = source.bumpMap;\n\t\tthis.bumpScale = source.bumpScale;\n\t\tthis.envMap = source.envMap;\n\t\tthis.envMapIntensity = source.envMapIntensity;\n\t\tthis.envMapCombine = source.envMapCombine;\n\n\t\tthis.depthFunc = source.depthFunc;\n\t\tthis.depthTest = source.depthTest;\n\t\tthis.depthWrite = source.depthWrite;\n\t\tthis.colorWrite = source.colorWrite;\n\n\t\tthis.stencilTest = source.stencilTest;\n\t\tthis.stencilWriteMask = source.stencilWriteMask;\n\n\t\tthis.stencilFunc = source.stencilFunc;\n\t\tthis.stencilRef = source.stencilRef;\n\t\tthis.stencilFuncMask = source.stencilFuncMask;\n\t\tthis.stencilFail = source.stencilFail;\n\t\tthis.stencilZFail = source.stencilZFail;\n\t\tthis.stencilZPass = source.stencilZPass;\n\n\t\tthis.stencilFuncBack = source.stencilFuncBack;\n\t\tthis.stencilRefBack = source.stencilRefBack;\n\t\tthis.stencilFuncMaskBack = source.stencilFuncMaskBack;\n\t\tthis.stencilFailBack = source.stencilFailBack;\n\t\tthis.stencilZFailBack = source.stencilZFailBack;\n\t\tthis.stencilZPassBack = source.stencilZPassBack;\n\n\t\tthis.clippingPlanes = source.clippingPlanes;\n\n\t\tthis.alphaTest = source.alphaTest;\n\t\tthis.alphaToCoverage = source.alphaToCoverage;\n\t\tthis.side = source.side;\n\t\tthis.polygonOffset = source.polygonOffset;\n\t\tthis.polygonOffsetFactor = source.polygonOffsetFactor;\n\t\tthis.polygonOffsetUnits = source.polygonOffsetUnits;\n\t\tthis.shading = source.shading;\n\t\tthis.dithering = source.dithering;\n\t\tthis.acceptLight = source.acceptLight;\n\t\tthis.lightingGroup = source.lightingGroup;\n\t\tthis.fog = source.fog;\n\t\tthis.drawMode = source.drawMode;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Return a new material with the same parameters as this material.\n\t * @returns {Material}\n\t */\n\tclone() {\n\t\treturn new this.constructor().copy(this);\n\t}\n\n\t/**\n\t * This disposes the material.\n\t * Textures of a material don't get disposed. These needs to be disposed by Texture.\n\t */\n\tdispose() {\n\t\tthis.dispatchEvent({ type: 'dispose' });\n\t}\n\n}\n\nexport { Material };"
  },
  {
    "path": "src/resources/materials/PBR2Material.js",
    "content": "import { Material } from './Material.js';\nimport { MATERIAL_TYPE } from '../../const.js';\nimport { Color3 } from '../../math/Color3.js';\n\n/**\n * A standard physically based material, using Specular-Glossiness workflow.\n * Physically based rendering (PBR) has recently become the standard in many 3D applications, such as Unity, Unreal and 3D Studio Max.\n * This approach differs from older approaches in that instead of using approximations for the way in which light interacts with a surface, a physically correct model is used.\n * The idea is that, instead of tweaking materials to look good under specific lighting, a material can\tbe created that will react 'correctly' under all lighting scenarios.\n * @extends Material\n */\nclass PBR2Material extends Material {\n\n\t/**\n\t * Create a PBR2Material.\n\t */\n\tconstructor() {\n\t\tsuper();\n\n\t\tthis.type = MATERIAL_TYPE.PBR2;\n\n\t\t/**\n\t\t * Specular color of the material.\n\t\t * @type {number}\n\t\t * @default 0.5\n\t\t */\n\t\tthis.specular = new Color3(0x111111);\n\n\t\t/**\n\t\t * Glossiness of the material.\n\t\t * @type {number}\n\t\t * @default 0.5\n\t\t */\n\t\tthis.glossiness = 0.5;\n\n\t\t/**\n\t\t * The RGB channel of this texture is used to alter the specular of the material.\n\t\t * @type {Texture2D}\n\t\t * @default null\n\t\t */\n\t\tthis.specularMap = null;\n\n\t\t/**\n\t\t * The A channel of this texture is used to alter the glossiness of the material.\n\t\t * @type {Texture2D}\n\t\t * @default null\n\t\t */\n\t\tthis.glossinessMap = null;\n\n\t\t/**\n\t\t * @default true\n\t\t */\n\t\tthis.acceptLight = true;\n\t}\n\n\tcopy(source) {\n\t\tsuper.copy(source);\n\n\t\tthis.specular = source.specular;\n\t\tthis.glossiness = source.glossiness;\n\t\tthis.specularMap = source.specularMap;\n\t\tthis.glossinessMap = source.glossinessMap;\n\n\t\treturn this;\n\t}\n\n}\n\nexport { PBR2Material };"
  },
  {
    "path": "src/resources/materials/PBRMaterial.js",
    "content": "import { Material } from './Material.js';\nimport { MATERIAL_TYPE } from '../../const.js';\nimport { Vector2 } from '../../math/Vector2.js';\n\n/**\n * A standard physically based material, using Metallic-Roughness workflow.\n * Physically based rendering (PBR) has recently become the standard in many 3D applications, such as Unity, Unreal and 3D Studio Max.\n * This approach differs from older approaches in that instead of using approximations for the way in which light interacts with a surface, a physically correct model is used.\n * The idea is that, instead of tweaking materials to look good under specific lighting, a material can\tbe created that will react 'correctly' under all lighting scenarios.\n * @extends Material\n */\nclass PBRMaterial extends Material {\n\n\t/**\n\t * Create a PBRMaterial.\n\t */\n\tconstructor() {\n\t\tsuper();\n\n\t\tthis.type = MATERIAL_TYPE.PBR;\n\n\t\t/**\n\t\t * How rough the material appears. 0.0 means a smooth mirror reflection, 1.0 means fully diffuse.\n\t\t * If roughnessMap is also provided, both values are multiplied.\n\t\t * @type {number}\n\t\t * @default 0.5\n\t\t */\n\t\tthis.roughness = 0.5;\n\n\t\t/**\n\t\t * How much the material is like a metal.\n\t\t * Non-metallic materials such as wood or stone use 0.0, metallic use 1.0, with nothing (usually) in between.\n\t\t * A value between 0.0 and 1.0 could be used for a rusty metal look. If metalnessMap is also provided, both values are multiplied.\n\t\t * @type {number}\n\t\t * @default 0.5\n\t\t */\n\t\tthis.metalness = 0.5;\n\n\t\t/**\n\t\t * The green channel of this texture is used to alter the roughness of the material.\n\t\t * @type {Texture2D}\n\t\t * @default null\n\t\t */\n\t\tthis.roughnessMap = null;\n\n\t\t/**\n\t\t * The blue channel of this texture is used to alter the metalness of the material.\n\t\t * @type {Texture2D}\n\t\t * @default null\n\t\t */\n\t\tthis.metalnessMap = null;\n\n\t\t/**\n\t\t * The strength of a clearcoat layer on a material surface.\n\t\t * When clearcoatFactor is set to 0.0, it indicates that there is no clearcoat present.\n\t\t * When it is set to 1.0, it indicates a very strong clearcoat that-\n\t\t * will cause the reflection and refraction effects on the surface of the object to become more prominent.\n\t\t * @type {number}\n\t\t * @default 0.0\n\t\t */\n\t\tthis.clearcoat = 0.0;\n\n\t\t/**\n\t\t * A texture property that allows for the modulation of the strength or roughness of the clearcoat layer.\n\t\t * @type {Texture2D}\n\t\t * @default null\n\t\t */\n\t\tthis.clearcoatMap = null;\n\n\t\t/**\n\t\t * The roughness of a clearcoat layer on a material surface.\n\t\t * When clearcoatRoughness is set to 0.0, the clearcoat layer will appear perfectly smooth and reflective-\n\t\t * and 0.0 represents a rough, textured clearcoat layer.\n\t\t * Adjusting the clearcoatRoughness can achieve a wide range of effects and create more realistic materials.\n\t\t * @type {number}\n\t\t * @default 0.0\n\t\t */\n\t\tthis.clearcoatRoughness = 0.0;\n\n\t\t/**\n\t\t * A texture that will be applied to the clearcoat layer of a material to simulate the roughness of the surface.\n\t\t * @type {Texture2D}\n\t\t * @default null\n\t\t */\n\t\tthis.clearcoatRoughnessMap = null;\n\n\t\t/**\n\t\t * Adjust the normal map's strength or intensity.\n\t\t * Affect the amount of bumpiness or surface detail that is visible on the clearcoat layer.\n\t\t * Typical ranges are 0-1.\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.clearcoatNormalScale = new Vector2(1, 1);\n\n\t\t/**\n\t\t * The texture that modulates the clearcoat layer's surface normal.\n\t\t * @type {Texture2D}\n\t\t * @default null\n\t\t */\n\t\tthis.clearcoatNormalMap = null;\n\n\t\t/**\n\t\t * @default true\n\t\t */\n\t\tthis.acceptLight = true;\n\t}\n\n\tcopy(source) {\n\t\tsuper.copy(source);\n\n\t\tthis.roughness = source.roughness;\n\t\tthis.metalness = source.metalness;\n\t\tthis.roughnessMap = source.roughnessMap;\n\t\tthis.metalnessMap = source.metalnessMap;\n\n\t\tthis.clearcoat = source.clearcoat;\n\t\tthis.clearcoatMap = source.clearcoatMap;\n\t\tthis.clearcoatRoughness = source.clearcoatRoughness;\n\t\tthis.clearcoatRoughnessMap = source.clearcoatRoughnessMap;\n\t\tthis.clearcoatNormalScale.copy(source.clearcoatNormalScale);\n\n\t\treturn this;\n\t}\n\n}\n\nexport { PBRMaterial };"
  },
  {
    "path": "src/resources/materials/PhongMaterial.js",
    "content": "import { Material } from './Material.js';\nimport { MATERIAL_TYPE } from '../../const.js';\nimport { Color3 } from '../../math/Color3.js';\n\n/**\n * A material for shiny surfaces with specular highlights.\n * The material uses a non-physically based Blinn-Phong model for calculating reflectance.\n * Unlike the Lambertian model used in the {@link LambertMaterial} this can simulate shiny surfaces with specular highlights (such as varnished wood).\n * @extends Material\n */\nclass PhongMaterial extends Material {\n\n\t/**\n\t * Create a PhongMaterial.\n\t */\n\tconstructor() {\n\t\tsuper();\n\n\t\tthis.type = MATERIAL_TYPE.PHONG;\n\n\t\t/**\n\t\t * How shiny the {@link PhongMaterial#specular} highlight is; a higher value gives a sharper highlight.\n\t\t * @type {number}\n\t\t * @default 30\n\t\t */\n\t\tthis.shininess = 30;\n\n\t\t/**\n\t\t * Specular color of the material.\n\t\t * This defines how shiny the material is and the color of its shine.\n\t\t * @type {Color3}\n\t\t * @default Color(0x111111)\n\t\t */\n\t\tthis.specular = new Color3(0x111111);\n\n\t\t/**\n\t\t * The specular map value affects both how much the specular surface highlight contributes and how much of the environment map affects the surface.\n\t\t * @type {Texture2D}\n\t\t * @default null\n\t\t */\n\t\tthis.specularMap = null;\n\n\t\t/**\n\t\t * @default true\n\t\t */\n\t\tthis.acceptLight = true;\n\t}\n\n\tcopy(source) {\n\t\tsuper.copy(source);\n\n\t\tthis.shininess = source.shininess;\n\t\tthis.specular.copy(source.specular);\n\t\tthis.specularMap = source.specularMap;\n\n\t\treturn this;\n\t}\n\n}\n\nexport { PhongMaterial };"
  },
  {
    "path": "src/resources/materials/PointsMaterial.js",
    "content": "import { Material } from './Material.js';\nimport { MATERIAL_TYPE, DRAW_MODE } from '../../const.js';\n\n/**\n * The default material used by Points.\n * @extends Material\n */\nclass PointsMaterial extends Material {\n\n\t/**\n\t * Create a PointsMaterial.\n\t */\n\tconstructor() {\n\t\tsuper();\n\n\t\tthis.type = MATERIAL_TYPE.POINT;\n\n\t\t/**\n\t\t * Sets the size of the points.\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.size = 1;\n\n\t\t/**\n\t\t * Specify whether points' size is attenuated by the camera depth. (Perspective camera only.)\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.sizeAttenuation = true;\n\n\t\t/**\n\t\t * Set draw mode to POINTS.\n\t\t * @type {DRAW_MODE}\n\t\t * @default DRAW_MODE.POINTS\n\t\t */\n\t\tthis.drawMode = DRAW_MODE.POINTS;\n\t}\n\n\tcopy(source) {\n\t\tsuper.copy(source);\n\n\t\tthis.size = source.size;\n\t\tthis.sizeAttenuation = source.sizeAttenuation;\n\n\t\treturn this;\n\t}\n\n}\n\nexport { PointsMaterial };"
  },
  {
    "path": "src/resources/materials/ShaderMaterial.js",
    "content": "import { Material } from './Material.js';\nimport { cloneUniforms } from '../../base.js';\n\n/**\n * A material rendered with custom shaders.\n * A shader is a small program written in GLSL that runs on the GPU.\n * @extends Material\n */\nclass ShaderMaterial extends Material {\n\n\t/**\n\t * @param {object} shader - Shader object for the shader material.\n\t * @param {string} shader.name - Name of the shader.\n\t * @param {object} shader.defines - Defines of the shader.\n\t * @param {object} shader.uniforms - Uniforms of the shader.\n\t * @param {string} shader.vertexShader - Vertex shader GLSL code.\n\t * @param {string} shader.fragmentShader - Fragment shader GLSL code.\n\t */\n\tconstructor(shader) {\n\t\tsuper();\n\n\t\t// Set values\n\t\tif (shader) {\n\t\t\tthis.shaderName = shader.name;\n\t\t\tObject.assign(this.defines, shader.defines);\n\t\t\tthis.uniforms = cloneUniforms(shader.uniforms);\n\t\t\tthis.vertexShader = shader.vertexShader;\n\t\t\tthis.fragmentShader = shader.fragmentShader;\n\t\t}\n\t}\n\n}\n\nexport { ShaderMaterial };"
  },
  {
    "path": "src/resources/projections/CameraProjection.js",
    "content": "import { Matrix4 } from '../../math/Matrix4.js';\n\n/**\n * Base camera projection class. All projection types should inherit from this.\n * Should not be instantiated directly; subclasses must implement matrix calculation.\n * @abstract\n */\nclass CameraProjection {\n\n\t/**\n\t * Creates a CameraProjection instance.\n\t */\n\tconstructor() {\n\t\tthis._matrix = new Matrix4();\n\t\tthis._dirty = true;\n\t}\n\n\t/**\n\t * Get the current projection matrix.\n\t * @returns {Matrix4} The projection matrix.\n\t */\n\tget matrix() {\n\t\tif (this._dirty) {\n\t\t\tthis._updateMatrix();\n\t\t}\n\n\t\treturn this._matrix;\n\t}\n\n\t/**\n\t * Copy parameters from another CameraProjection. Should be implemented by subclasses.\n\t * @param {CameraProjection} source The source projection object.\n\t * @returns {CameraProjection} this\n\t */\n\tcopy(source) {\n\t\tconsole.warn('CameraProjection: copy() must be implemented in subclass.');\n\t\treturn this;\n\t}\n\n\t/**\n\t * Clone this projection object.\n\t * @returns {CameraProjection} A new projection object.\n\t */\n\tclone() {\n\t\treturn new this.constructor().copy(this);\n\t}\n\n\t/**\n\t * Update the projection matrix. Should be implemented by subclasses.\n\t * @protected\n\t */\n\t_updateMatrix() {\n\t\tconsole.warn('CameraProjection: _updateMatrix() must be implemented in subclass.');\n\t\tthis._dirty = false;\n\t}\n\n}\n\nexport { CameraProjection };"
  },
  {
    "path": "src/resources/projections/OrthographicProjection.js",
    "content": "import { CameraProjection } from './CameraProjection.js';\n\n/**\n * Orthographic projection camera class.\n * Generates an orthographic projection matrix based on left, right, top, bottom, near, and far planes.\n */\nclass OrthographicProjection extends CameraProjection {\n\n\t/**\n\t * Creates an OrthographicProjection instance.\n\t * @param {number} [left=-1] Left plane of the orthographic box.\n\t * @param {number} [right=1] Right plane of the orthographic box.\n\t * @param {number} [top=1] Top plane of the orthographic box.\n\t * @param {number} [bottom=-1] Bottom plane of the orthographic box.\n\t * @param {number} [near=0.1] Near clipping plane.\n\t * @param {number} [far=2000] Far clipping plane.\n\t */\n\tconstructor(left = -1, right = 1, top = 1, bottom = -1, near = 0.1, far = 2000) {\n\t\tsuper();\n\n\t\tthis._left = left;\n\t\tthis._right = right;\n\t\tthis._top = top;\n\t\tthis._bottom = bottom;\n\t\tthis._near = near;\n\t\tthis._far = far;\n\t}\n\n\t/**\n\t * The left plane of the orthographic box.\n\t * @type {number}\n\t * @default -1\n\t */\n\tset left(value) {\n\t\tthis._left = value;\n\t\tthis._dirty = true;\n\t}\n\n\tget left() {\n\t\treturn this._left;\n\t}\n\n\t/**\n\t * The right plane of the orthographic box.\n\t * @type {number}\n\t * @default 1\n\t */\n\tset right(value) {\n\t\tthis._right = value;\n\t\tthis._dirty = true;\n\t}\n\n\tget right() {\n\t\treturn this._right;\n\t}\n\n\t/**\n\t * The top plane of the orthographic box.\n\t * @type {number}\n\t * @default 1\n\t */\n\tset top(value) {\n\t\tthis._top = value;\n\t\tthis._dirty = true;\n\t}\n\n\tget top() {\n\t\treturn this._top;\n\t}\n\n\t/**\n\t * The bottom plane of the orthographic box.\n\t * @type {number}\n\t * @default -1\n\t */\n\tset bottom(value) {\n\t\tthis._bottom = value;\n\t\tthis._dirty = true;\n\t}\n\n\tget bottom() {\n\t\treturn this._bottom;\n\t}\n\n\t/**\n\t * The near clipping plane.\n\t * @type {number}\n\t * @default 0.1\n\t */\n\tset near(value) {\n\t\tthis._near = value;\n\t\tthis._dirty = true;\n\t}\n\n\tget near() {\n\t\treturn this._near;\n\t}\n\n\t/**\n\t * The far clipping plane.\n\t * @type {number}\n\t * @default 2000\n\t */\n\tset far(value) {\n\t\tthis._far = value;\n\t\tthis._dirty = true;\n\t}\n\n\tget far() {\n\t\treturn this._far;\n\t}\n\n\t/**\n\t * Sets all orthographic parameters at once.\n\t * @param {number} left The left plane of the orthographic box.\n\t * @param {number} right The right plane of the orthographic box.\n\t * @param {number} top The top plane of the orthographic box.\n\t * @param {number} bottom The bottom plane of the orthographic box.\n\t * @param {number} near The near clipping plane.\n\t * @param {number} far The far clipping plane.\n\t * @returns {OrthographicProjection} this\n\t */\n\tset(left, right, top, bottom, near, far) {\n\t\tthis._left = left;\n\t\tthis._right = right;\n\t\tthis._top = top;\n\t\tthis._bottom = bottom;\n\t\tthis._near = near;\n\t\tthis._far = far;\n\t\tthis._dirty = true;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the orthographic box size by width and height, centered at (0, 0).\n\t * @param {number} width The width of the orthographic box.\n\t * @param {number} height The height of the orthographic box.\n\t * @returns {OrthographicProjection} this\n\t */\n\tsetSize(width, height) {\n\t\tthis._left = -width / 2;\n\t\tthis._right = width / 2;\n\t\tthis._top = height / 2;\n\t\tthis._bottom = -height / 2;\n\t\tthis._dirty = true;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Copies the parameters from another OrthographicProjection.\n\t * @param {OrthographicProjection} source\n\t * @returns {OrthographicProjection} this\n\t */\n\tcopy(source) {\n\t\tthis._left = source._left;\n\t\tthis._right = source._right;\n\t\tthis._top = source._top;\n\t\tthis._bottom = source._bottom;\n\t\tthis._near = source._near;\n\t\tthis._far = source._far;\n\t\tthis._dirty = true;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Updates the orthographic projection matrix.\n\t * @protected\n\t */\n\t_updateMatrix() {\n\t\tconst left = this._left, right = this._right, bottom = this._bottom, top = this._top, near = this._near, far = this._far;\n\t\tthis._matrix.set(\n\t\t\t2 / (right - left), 0, 0, -(right + left) / (right - left),\n\t\t\t0, 2 / (top - bottom), 0, -(top + bottom) / (top - bottom),\n\t\t\t0, 0, -2 / (far - near), -(far + near) / (far - near),\n\t\t\t0, 0, 0, 1\n\t\t);\n\t\tthis._dirty = false;\n\t}\n\n}\n\nexport { OrthographicProjection };"
  },
  {
    "path": "src/resources/projections/PerspectiveProjection.js",
    "content": "import { CameraProjection } from './CameraProjection.js';\n\n/**\n * Perspective projection camera class.\n * Generates a perspective projection matrix based on field of view, aspect ratio, near and far planes.\n * Field of view is specified in degrees.\n */\nclass PerspectiveProjection extends CameraProjection {\n\n\t/**\n\t * Creates a PerspectiveProjection instance.\n\t * @param {number} [fov=50] Vertical field of view in degrees.\n\t * @param {number} [aspect=1] Aspect ratio (width / height).\n\t * @param {number} [near=0.1] Near clipping plane.\n\t * @param {number} [far=2000] Far clipping plane.\n\t */\n\tconstructor(fov = 50, aspect = 1, near = 0.1, far = 2000) {\n\t\tsuper();\n\n\t\tthis._fov = fov;\n\t\tthis._aspect = aspect;\n\t\tthis._near = near;\n\t\tthis._far = far;\n\t}\n\n\t/**\n\t * The vertical field of view in degrees.\n\t * @type {number}\n\t * @default 50\n\t */\n\tset fov(value) {\n\t\tthis._fov = value;\n\t\tthis._dirty = true;\n\t}\n\n\tget fov() {\n\t\treturn this._fov;\n\t}\n\n\t/**\n\t * The aspect ratio (width / height).\n\t * @type {number}\n\t * @default 1\n\t */\n\tset aspect(value) {\n\t\tthis._aspect = value;\n\t\tthis._dirty = true;\n\t}\n\n\tget aspect() {\n\t\treturn this._aspect;\n\t}\n\n\t/**\n\t * The near clipping plane.\n\t * @type {number}\n\t * @default 0.1\n\t */\n\tset near(value) {\n\t\tthis._near = value;\n\t\tthis._dirty = true;\n\t}\n\n\tget near() {\n\t\treturn this._near;\n\t}\n\n\t/**\n\t * The far clipping plane.\n\t * @type {number}\n\t * @default 2000\n\t */\n\tset far(value) {\n\t\tthis._far = value;\n\t\tthis._dirty = true;\n\t}\n\n\tget far() {\n\t\treturn this._far;\n\t}\n\n\t/**\n\t * Sets all perspective parameters at once.\n\t * @param {number} fov Vertical field of view in degrees.\n\t * @param {number} aspect Aspect ratio (width / height).\n\t * @param {number} near Near clipping plane.\n\t * @param {number} far Far clipping plane.\n\t * @returns {PerspectiveProjection} this\n\t */\n\tset(fov, aspect, near, far) {\n\t\tthis._fov = fov;\n\t\tthis._aspect = aspect;\n\t\tthis._near = near;\n\t\tthis._far = far;\n\t\tthis._dirty = true;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Copies the parameters from another PerspectiveProjection.\n\t * @param {PerspectiveProjection} source\n\t * @returns {PerspectiveProjection} this\n\t */\n\tcopy(source) {\n\t\tthis._fov = source._fov;\n\t\tthis._aspect = source._aspect;\n\t\tthis._near = source._near;\n\t\tthis._far = source._far;\n\t\tthis._dirty = true;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Updates the perspective projection matrix.\n\t * @protected\n\t */\n\t_updateMatrix() {\n\t\tconst fov = this._fov * Math.PI / 180, aspect = this._aspect, near = this._near, far = this._far;\n\t\tconst f = 1 / Math.tan(fov / 2);\n\t\tthis._matrix.set(\n\t\t\tf / aspect, 0, 0, 0,\n\t\t\t0, f, 0, 0,\n\t\t\t0, 0, (far + near) / (near - far), (2 * far * near) / (near - far),\n\t\t\t0, 0, -1, 0\n\t\t);\n\t\tthis._dirty = false;\n\t}\n\n}\n\nexport { PerspectiveProjection };"
  },
  {
    "path": "src/resources/targets/OffscreenRenderTarget.js",
    "content": "import { RenderTargetBase } from './RenderTargetBase.js';\nimport { RenderBuffer } from '../RenderBuffer.js';\nimport { Texture2D } from '../textures/Texture2D.js';\nimport { TextureCube } from '../textures/TextureCube.js';\nimport { Texture3D } from '../textures/Texture3D.js';\nimport { Texture2DArray } from '../textures/Texture2DArray.js';\nimport { ATTACHMENT, PIXEL_FORMAT } from '../../const.js';\n\n/**\n * Render Target that render to offscreen textures or renderbuffers.\n * @extends RenderTargetBase\n */\nclass OffscreenRenderTarget extends RenderTargetBase {\n\n\t/**\n\t * Create a new OffscreenRenderTarget.\n\t * @param {number} width - The width of the render target.\n\t * @param {number} height - The height of the render target.\n\t */\n\tconstructor(width, height) {\n\t\tsuper(width, height);\n\n\t\t/**\n\t\t * The active layer index for rendering.\n\t\t * For cube render targets, this represents the active cube face.\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.activeLayer = 0;\n\n\t\t/**\n\t\t * The active mipmap level for rendering.\n\t\t * Not supported in WebGL1.\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.activeMipmapLevel = 0;\n\n\t\tthis._attachments = {};\n\t}\n\n\t/**\n\t * Resize the render target to the specified dimensions.\n\t * This will resize all attached attachments.\n\t * @param {number} width - The new width of the render target.\n\t * @param {number} height - The new height of the render target.\n\t * @param {number} [depth] - **DEPRECATED**: Depth parameter is no longer used.\n\t * Individual textures manage their own depth dimensions.\n\t */\n\tresize(width, height, depth) {\n\t\tif (arguments.length > 2) {\n\t\t\tconsole.warn('OffscreenRenderTarget.resize(): The depth parameter is deprecated. ' +\n\t\t\t\t'RenderTarget no longer manages texture depth as it is not required by the rendering backend. ' +\n\t\t\t\t'Use texture.resizeAsAttachment() directly to control texture dimensions.');\n\t\t}\n\n\t\tif (this.width === width && this.height === height) return;\n\n\t\tthis.width = width;\n\t\tthis.height = height;\n\n\t\tthis.dispose(false);\n\n\t\tfor (const attachment in this._attachments) {\n\t\t\tconst target = this._attachments[attachment];\n\n\t\t\tif (target.isTexture) {\n\t\t\t\ttarget.resizeAsAttachment(width, height);\n\t\t\t} else {\n\t\t\t\ttarget.resize(width, height);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Dispose the render target.\n\t * @param {boolean} [disposeAttachments=true] - Whether to dispose attachments as well.\n\t */\n\tdispose(disposeAttachments = true) {\n\t\tthis.dispatchEvent({ type: 'dispose' });\n\n\t\tif (disposeAttachments) {\n\t\t\tfor (const attachment in this._attachments) {\n\t\t\t\tthis._attachments[attachment].dispose();\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Attach a texture(RTT) or renderbuffer to the framebuffer.\n\t * Notice: For now, dynamic Attachment during rendering is not supported.\n\t * @param  {TextureBase|RenderBuffer} target - The texture or renderbuffer to attach.\n\t * @param  {ATTACHMENT} [attachment=ATTACHMENT.COLOR_ATTACHMENT0] - The attachment point.\n\t * @returns {OffscreenRenderTarget} Self for chaining.\n\t */\n\tattach(target, attachment = ATTACHMENT.COLOR_ATTACHMENT0) {\n\t\tif (target.isTexture) {\n\t\t\ttarget.resizeAsAttachment(this.width, this.height);\n\t\t} else {\n\t\t\ttarget.resize(this.width, this.height);\n\t\t}\n\n\t\tthis._attachments[attachment] = target;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Detach a texture(RTT) or renderbuffer.\n\t * @param  {ATTACHMENT} [attachment=ATTACHMENT.COLOR_ATTACHMENT0] - The attachment point to detach.\n\t * @returns {OffscreenRenderTarget} Self for chaining.\n\t */\n\tdetach(attachment = ATTACHMENT.COLOR_ATTACHMENT0) {\n\t\tdelete this._attachments[attachment];\n\t\treturn this;\n\t}\n\n\t/**\n\t * Get the attached attachment at the specified attachment point.\n\t * @param  {ATTACHMENT} [attachment=ATTACHMENT.COLOR_ATTACHMENT0] - The attachment point.\n\t * @returns {TextureBase|RenderBuffer|null} The attached texture or renderbuffer.\n\t */\n\tgetAttachment(attachment = ATTACHMENT.COLOR_ATTACHMENT0) {\n\t\treturn this._attachments[attachment] || null;\n\t}\n\n\t/**\n\t * The main texture attachment which is the first color attachment.\n\t * @type {TextureBase|null}\n\t */\n\tset texture(texture) {\n\t\tif (texture && texture.isTexture) {\n\t\t\tthis.attach(texture, ATTACHMENT.COLOR_ATTACHMENT0);\n\t\t} else {\n\t\t\tthis.detach(ATTACHMENT.COLOR_ATTACHMENT0);\n\t\t}\n\t}\n\n\tget texture() {\n\t\tconst target = this._attachments[ATTACHMENT.COLOR_ATTACHMENT0];\n\t\treturn target && target.isTexture ? target : null;\n\t}\n\n\t/**\n\t * An alias for {@link OffscreenRenderTarget#activeLayer}. Specifically represents\n\t * the currently rendered cube face (0-5) when using cube textures.\n\t * @type {number}\n\t */\n\tset activeCubeFace(value) {\n\t\tthis.activeLayer = value;\n\t}\n\n\tget activeCubeFace() {\n\t\treturn this.activeLayer;\n\t}\n\n\t/**\n\t * Create a simple offscreen render target with a color texture and\n\t * a depth-stencil renderbuffer.\n\t * @param {number} width - The width of the render target.\n\t * @param {number} height - The height of the render target.\n\t * @returns {OffscreenRenderTarget} The created offscreen render target.\n\t */\n\tstatic create2D(width, height) {\n\t\tconst renderTarget = new OffscreenRenderTarget(width, height);\n\t\trenderTarget.attach(new Texture2D(), ATTACHMENT.COLOR_ATTACHMENT0);\n\t\trenderTarget.attach(new RenderBuffer(width, height, PIXEL_FORMAT.DEPTH_STENCIL), ATTACHMENT.DEPTH_STENCIL_ATTACHMENT);\n\t\treturn renderTarget;\n\t}\n\n\t/**\n\t * Create a simple offscreen render target with a cube color texture and\n\t * a depth-stencil renderbuffer.\n\t * @param {number} width - The width of the render target.\n\t * @param {number} height - The height of the render target.\n\t * @returns {OffscreenRenderTarget} The created offscreen render target.\n\t */\n\tstatic createCube(width, height) {\n\t\tconst renderTarget = new OffscreenRenderTarget(width, height);\n\t\trenderTarget.attach(new TextureCube(), ATTACHMENT.COLOR_ATTACHMENT0);\n\t\trenderTarget.attach(new RenderBuffer(width, height, PIXEL_FORMAT.DEPTH_STENCIL), ATTACHMENT.DEPTH_STENCIL_ATTACHMENT);\n\t\treturn renderTarget;\n\t}\n\n\t/**\n\t * Create a simple offscreen render target with a 3D color texture.\n\t * Note: No depth-stencil attachment is created by default.\n\t * @param {number} width - The width of the render target.\n\t * @param {number} height - The height of the render target.\n\t * @param {number} depth - The depth of the 3D texture.\n\t * @returns {OffscreenRenderTarget} The created offscreen render target.\n\t */\n\tstatic create3D(width, height, depth) {\n\t\tconst renderTarget = new OffscreenRenderTarget(width, height);\n\t\tconst texture = new Texture3D();\n\t\ttexture.resizeAsAttachment(width, height, depth);\n\t\trenderTarget.attach(texture, ATTACHMENT.COLOR_ATTACHMENT0);\n\t\treturn renderTarget;\n\t}\n\n\t/**\n\t * Create a simple offscreen render target with a 2D array color texture.\n\t * Note: No depth-stencil attachment is created by default.\n\t * @param {number} width - The width of the render target.\n\t * @param {number} height - The height of the render target.\n\t * @param {number} depth - The depth of the 2D array texture (number of layers).\n\t * @returns {OffscreenRenderTarget} The created offscreen render target.\n\t */\n\tstatic create2DArray(width, height, depth) {\n\t\tconst renderTarget = new OffscreenRenderTarget(width, height);\n\t\tconst texture = new Texture2DArray();\n\t\ttexture.resizeAsAttachment(width, height, depth);\n\t\trenderTarget.attach(texture, ATTACHMENT.COLOR_ATTACHMENT0);\n\t\treturn renderTarget;\n\t}\n\n}\n\n/**\n * This flag can be used for type testing.\n * @readonly\n * @type {boolean}\n * @default true\n */\nOffscreenRenderTarget.prototype.isOffscreenRenderTarget = true;\n\nexport { OffscreenRenderTarget };"
  },
  {
    "path": "src/resources/targets/RenderTargetBase.js",
    "content": "import { EventDispatcher } from '../../EventDispatcher.js';\nimport { Color4 } from '../../math/Color4.js';\n\n/**\n * RenderTargetBase is an abstract class representing a rendering target,\n * which encapsulates the configuration for a render pass,\n * including clear states, attachments, and other rendering parameters.\n * @extends EventDispatcher\n * @abstract\n */\nclass RenderTargetBase extends EventDispatcher {\n\n\tconstructor(width, height) {\n\t\tsuper();\n\n\t\t/**\n\t\t * The width of the render target.\n\t\t * @type {number}\n\t\t */\n\t\tthis.width = width;\n\n\t\t/**\n\t\t * The height of the render target.\n\t\t * @type {number}\n\t\t */\n\t\tthis.height = height;\n\n\t\t/**\n\t\t * Whether to clear the color buffer before rendering to this render target.\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.clearColor = true;\n\n\t\t/**\n\t\t * Whether to clear the depth buffer before rendering to this render target.\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.clearDepth = true;\n\n\t\t/**\n\t\t * Whether to clear the stencil buffer before rendering to this render target.\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.clearStencil = true;\n\n\t\t/**\n\t\t * Clear color value.\n\t\t * @type {Color4}\n\t\t */\n\t\tthis.colorClearValue = new Color4(0, 0, 0, 0);\n\n\t\t/**\n\t\t * Clear depth value.\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.depthClearValue = 1;\n\n\t\t/**\n\t\t * Clear stencil value.\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.stencilClearValue = 0;\n\n\t\t/**\n\t\t * A querySet that will store the occlusion query results. If null, occlusion queries are disabled.\n\t\t * @type {QuerySet|null}\n\t\t * @default null\n\t\t */\n\t\tthis.occlusionQuerySet = null;\n\n\t\t/**\n\t\t * An array of objects defining where and when timestamp query values will be written.\n\t\t * @type {object}\n\t\t * @property {QuerySet|null} querySet - A timestamp querySet. If null, timestamp queries are disabled.\n\t\t * @property {number} beginningOfPassWriteIndex - A number specifying the query index in querySet where the timestamp at the beginning of the render pass will be written.\n\t\t * @property {number} endOfPassWriteIndex - A number specifying the query index in querySet where the timestamp at the end of the render pass will be written.\n\t\t */\n\t\tthis.timestampWrites = {\n\t\t\tquerySet: null,\n\t\t\tbeginningOfPassWriteIndex: 0,\n\t\t\tendOfPassWriteIndex: 1\n\t\t};\n\t}\n\n\t/**\n\t * Resize the render target to the specified dimensions.\n\t * @abstract\n\t */\n\tresize() {\n\t\tthrow new Error('RenderTargetBase: resize method must be implemented by subclass');\n\t}\n\n\t/**\n\t * Dispose the render target.\n\t * @abstract\n\t */\n\tdispose() {\n\t\tthrow new Error('RenderTargetBase: dispose method must be implemented by subclass');\n\t}\n\n\t/**\n\t * Sets the clear state.\n\t * @param {boolean} [color] - Whether to clear the color buffer.\n\t * @param {boolean} [depth] - Whether to clear the depth buffer.\n\t * @param {boolean} [stencil] - Whether to clear the stencil buffer.\n\t * @returns {RenderTargetBase} A reference to this render target.\n\t */\n\tsetClear(color, depth, stencil) {\n\t\tthis.clearColor = color !== undefined ? color : this.clearColor;\n\t\tthis.clearDepth = depth !== undefined ? depth : this.clearDepth;\n\t\tthis.clearStencil = stencil !== undefined ? stencil : this.clearStencil;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the clear values.\n\t * @param {number} r - Red channel value between 0.0 and 1.0.\n\t * @param {number} g - Green channel value between 0.0 and 1.0.\n\t * @param {number} b - Blue channel value between 0.0 and 1.0.\n\t * @param {number} a - Alpha channel value between 0.0 and 1.0.\n\t * @returns {RenderTargetBase} A reference to this render target.\n\t */\n\tsetColorClearValue(r, g, b, a) {\n\t\tthis.colorClearValue.setRGBA(r, g, b, a);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the clear depth value.\n\t * @param {number} depth - The depth value.\n\t * @returns {RenderTargetBase} A reference to this render target.\n\t */\n\tsetDepthClearValue(depth) {\n\t\tthis.depthClearValue = depth;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the clear stencil value.\n\t * @param {number} stencil - The stencil value.\n\t * @returns {RenderTargetBase} A reference to this render target.\n\t */\n\tsetStencilClearValue(stencil) {\n\t\tthis.stencilClearValue = stencil;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the occlusion query set.\n\t * @param {QuerySet|null} querySet - The occlusion query set. If null, occlusion queries are disabled.\n\t * @returns {RenderTargetBase} A reference to this render target.\n\t */\n\tsetOcclusionQuerySet(querySet) {\n\t\tthis.occlusionQuerySet = querySet;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the timestamp query set and the query indices.\n\t * @param {QuerySet|null} querySet - The timestamp query set. If null, timestamp queries are disabled.\n\t * @param {number} [beginIndex=0] - The query index in querySet where the timestamp at the beginning of the render pass will be written.\n\t * @param {number} [endIndex=1] - The query index in querySet where the timestamp at the end of the render pass will be written.\n\t * @returns {RenderTargetBase} A reference to this render target.\n\t */\n\tsetTimestampWrites(querySet, beginIndex = 0, endIndex = 1) {\n\t\tthis.timestampWrites.querySet = querySet;\n\t\tthis.timestampWrites.beginningOfPassWriteIndex = beginIndex;\n\t\tthis.timestampWrites.endOfPassWriteIndex = endIndex;\n\t\treturn this;\n\t}\n\n}\n\n/**\n * This flag can be used for type testing.\n * @readonly\n * @type {boolean}\n * @default true\n */\nRenderTargetBase.prototype.isRenderTarget = true;\n\nexport { RenderTargetBase };"
  },
  {
    "path": "src/resources/targets/ScreenRenderTarget.js",
    "content": "import { RenderTargetBase } from './RenderTargetBase.js';\n\n/**\n * Render Target that render to screen (canvas).\n * @extends RenderTargetBase\n */\nclass ScreenRenderTarget extends RenderTargetBase {\n\n\t/**\n\t * Create a new ScreenRenderTarget.\n\t * @param {HTMLCanvasElement} view - The canvas element which the Render Target rendered to.\n\t */\n\tconstructor(view) {\n\t\tsuper(view.width, view.height);\n\n\t\t/**\n\t\t * The canvas element which the Render Target rendered to.\n\t\t * @type {HTMLCanvasElement}\n\t\t */\n\t\tthis.view = view;\n\t}\n\n\t/**\n\t * Resizes the render target to the specified dimensions.\n\t * This method will set the width and height properties of the canvas.\n\t * @param {number} width - The width of the render target.\n\t * @param {number} height - The height of the render target.\n\t */\n\tresize(width, height) {\n\t\tthis.view.width = width;\n\t\tthis.view.height = height;\n\n\t\tthis.width = width;\n\t\tthis.height = height;\n\t}\n\n\t/**\n\t * Dispatches a dispose event.\n\t */\n\tdispose() {\n\t\tthis.dispatchEvent({ type: 'dispose' });\n\t}\n\n}\n\n/**\n * This flag can be used for type testing.\n * @readonly\n * @type {boolean}\n * @default true\n */\nScreenRenderTarget.prototype.isScreenRenderTarget = true;\n\nexport { ScreenRenderTarget };"
  },
  {
    "path": "src/resources/textures/Texture2D.js",
    "content": "import { TextureBase } from './TextureBase.js';\n\n/**\n * Creates a 2d texture.\n * @extends TextureBase\n */\nclass Texture2D extends TextureBase {\n\n\tconstructor() {\n\t\tsuper();\n\n\t\t/**\n\t\t * Image data for this texture.\n\t\t * @type {null | HTMLImageElement | HTMLCanvasElement | HTMLVideoElement | ImageBitmap | object}\n\t\t * @default null\n\t\t */\n\t\tthis.image = null;\n\t}\n\n\t/**\n\t * Copy the given 2d texture into this texture.\n\t * @param {Texture2D} source - The 2d texture to be copied.\n\t * @returns {Texture2D}\n\t */\n\tcopy(source) {\n\t\tsuper.copy(source);\n\n\t\tthis.image = source.image;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * @override\n\t */\n\tresizeAsAttachment(width, height) {\n\t\tif (this.image && this.image.rtt) {\n\t\t\tif (this.image.width !== width || this.image.height !== height) {\n\t\t\t\tthis.version++;\n\t\t\t\tthis.image.width = width;\n\t\t\t\tthis.image.height = height;\n\t\t\t}\n\t\t} else {\n\t\t\tthis.version++;\n\t\t\tthis.image = { rtt: true, data: null, width, height };\n\t\t}\n\t}\n\n}\n\n/**\n * This flag can be used for type testing.\n * @readonly\n * @type {boolean}\n * @default true\n */\nTexture2D.prototype.isTexture2D = true;\n\nexport { Texture2D };"
  },
  {
    "path": "src/resources/textures/Texture2DArray.js",
    "content": "import { TextureBase } from './TextureBase.js';\nimport { TEXTURE_FILTER, PIXEL_FORMAT } from '../../const.js';\n\n/**\n * Creates a 2d texture. (WebGL 2.0)\n * @extends TextureBase\n */\nclass Texture2DArray extends TextureBase {\n\n\tconstructor() {\n\t\tsuper();\n\n\t\t/**\n\t\t * Image data for this texture.\n\t\t * @type {object}\n\t\t * @default null\n\t\t */\n\t\tthis.image = { data: new Uint8Array([255, 255, 255, 255, 255, 255, 255, 255]), width: 2, height: 2, depth: 2 };\n\n\t\t/**\n\t\t * @default PIXEL_FORMAT.RED\n\t\t */\n\t\tthis.format = PIXEL_FORMAT.RED;\n\n\t\t/**\n\t\t * @default TEXTURE_FILTER.NEAREST\n\t\t */\n\t\tthis.magFilter = TEXTURE_FILTER.NEAREST;\n\n\t\t/**\n\t\t * @default TEXTURE_FILTER.NEAREST\n\t\t */\n\t\tthis.minFilter = TEXTURE_FILTER.NEAREST;\n\n\t\t/**\n\t\t * @default false\n\t\t */\n\t\tthis.generateMipmaps = false;\n\n\t\t/**\n\t\t * @default false\n\t\t */\n\t\tthis.flipY = false;\n\n\t\t/**\n\t\t * @default 1\n\t\t */\n\t\tthis.unpackAlignment = 1;\n\n\t\t/**\n\t\t * A set of all layers which need to be updated in the texture.\n\t\t * @type {Set}\n\t\t */\n\t\tthis.layerUpdates = new Set();\n\t}\n\n\t/**\n\t * Copy the given 2d texture into this texture.\n\t * @param {Texture2DArray} source - The 2d texture to be copied.\n\t * @returns {Texture2DArray}\n\t */\n\tcopy(source) {\n\t\tsuper.copy(source);\n\n\t\tthis.image = source.image;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * @override\n\t */\n\tresizeAsAttachment(width, height, depth) {\n\t\tconst resizeDepth = depth !== undefined;\n\n\t\tif (this.image && this.image.rtt) {\n\t\t\tif (\n\t\t\t\tthis.image.width !== width\n\t\t\t\t|| this.image.height !== height\n\t\t\t\t|| (resizeDepth && this.image.depth !== depth)\n\t\t\t) {\n\t\t\t\tthis.version++;\n\t\t\t\tthis.image.width = width;\n\t\t\t\tthis.image.height = height;\n\t\t\t\tif (resizeDepth) this.image.depth = depth;\n\t\t\t}\n\t\t} else {\n\t\t\tthis.version++;\n\t\t\tconst oldDepth = (this.image && this.image.depth) ? this.image.depth : 1;\n\t\t\tthis.image = {\n\t\t\t\trtt: true, data: null, width, height,\n\t\t\t\tdepth: resizeDepth ? depth : oldDepth\n\t\t\t};\n\t\t}\n\t}\n\n}\n\n/**\n * This flag can be used for type testing.\n * @readonly\n * @type {boolean}\n * @default true\n */\nTexture2DArray.prototype.isTexture2DArray = true;\n\nexport { Texture2DArray };"
  },
  {
    "path": "src/resources/textures/Texture3D.js",
    "content": "import { TextureBase } from './TextureBase.js';\nimport { PIXEL_FORMAT, PIXEL_TYPE, TEXTURE_WRAP, TEXTURE_FILTER } from '../../const.js';\n\n/**\n * Creates a 3D texture. (WebGL 2.0)\n * @extends TextureBase\n */\nclass Texture3D extends TextureBase {\n\n\tconstructor() {\n\t\tsuper();\n\n\t\t/**\n\t\t * Image data for this texture.\n\t\t * @type {object}\n\t\t */\n\t\tthis.image = { data: new Uint8Array([255, 255, 255, 255, 255, 255, 255, 255]), width: 2, height: 2, depth: 2 };\n\n\t\t/**\n\t\t * This defines how the texture is wrapped in the depth direction.\n\t\t * @type {TEXTURE_WRAP}\n\t\t * @default TEXTURE_WRAP.CLAMP_TO_EDGE\n\t\t */\n\t\tthis.wrapR = TEXTURE_WRAP.CLAMP_TO_EDGE;\n\n\t\t/**\n\t\t * @default PIXEL_FORMAT.RED\n\t\t */\n\t\tthis.format = PIXEL_FORMAT.RED;\n\n\t\t/**\n\t\t * @default PIXEL_TYPE.UNSIGNED_BYTE\n\t\t */\n\t\tthis.type = PIXEL_TYPE.UNSIGNED_BYTE;\n\n\t\t/**\n\t\t * @default TEXTURE_FILTER.NEAREST\n\t\t */\n\t\tthis.magFilter = TEXTURE_FILTER.NEAREST;\n\n\t\t/**\n\t\t * @default TEXTURE_FILTER.NEAREST\n\t\t */\n\t\tthis.minFilter = TEXTURE_FILTER.NEAREST;\n\n\t\t/**\n\t\t * @default false\n\t\t */\n\t\tthis.generateMipmaps = false;\n\n\t\t/**\n\t\t * @default false\n\t\t */\n\t\tthis.flipY = false;\n\n\t\t/**\n\t\t * @default 1\n\t\t */\n\t\tthis.unpackAlignment = 1;\n\t}\n\n\t/**\n\t * Copy the given 3d texture into this texture.\n\t * @param {Texture3D} source - The 3d texture to be copied.\n\t * @returns {Texture3D}\n\t */\n\tcopy(source) {\n\t\tsuper.copy(source);\n\n\t\tthis.image = source.image;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * @override\n\t */\n\tresizeAsAttachment(width, height, depth) {\n\t\tconst resizeDepth = depth !== undefined;\n\n\t\tif (this.image && this.image.rtt) {\n\t\t\tif (\n\t\t\t\tthis.image.width !== width\n\t\t\t\t|| this.image.height !== height\n\t\t\t\t|| (resizeDepth && this.image.depth !== depth)\n\t\t\t) {\n\t\t\t\tthis.version++;\n\t\t\t\tthis.image.width = width;\n\t\t\t\tthis.image.height = height;\n\t\t\t\tif (resizeDepth) this.image.depth = depth;\n\t\t\t}\n\t\t} else {\n\t\t\tthis.version++;\n\t\t\tconst oldDepth = (this.image && this.image.depth) ? this.image.depth : 1;\n\t\t\tthis.image = {\n\t\t\t\trtt: true, data: null, width, height,\n\t\t\t\tdepth: resizeDepth ? depth : oldDepth\n\t\t\t};\n\t\t}\n\t}\n\n}\n\n/**\n * This flag can be used for type testing.\n * @readonly\n * @type {boolean}\n * @default true\n */\nTexture3D.prototype.isTexture3D = true;\n\nexport { Texture3D };"
  },
  {
    "path": "src/resources/textures/TextureBase.js",
    "content": "import { cloneJson } from '../../base.js';\nimport { PIXEL_FORMAT, PIXEL_TYPE, TEXTURE_FILTER, TEXTURE_WRAP, TEXEL_ENCODING_TYPE } from '../../const.js';\nimport { EventDispatcher } from '../../EventDispatcher.js';\n\nlet _textureId = 0;\n\n/**\n * Create a texture to apply to a surface or as a reflection or refraction map.\n * @abstract\n * @extends EventDispatcher\n */\nclass TextureBase extends EventDispatcher {\n\n\tconstructor() {\n\t\tsuper();\n\n\t\t/**\n\t\t * Unique number for this texture instance.\n\t\t * @readonly\n\t\t * @type {number}\n\t\t */\n\t\tthis.id = _textureId++;\n\n\t\t/**\n\t\t * An object that can be used to store custom data about the {@link TextureBase}.\n\t\t * It should not hold references to functions as these will not be cloned.\n\t\t * @type {object}\n\t\t * @default {}\n\t\t */\n\t\tthis.userData = {};\n\n\t\t/**\n\t\t * Array of user-specified mipmaps (optional).\n\t\t * @type {HTMLImageElement[] | object[]}\n\t\t * @default []\n\t\t */\n\t\tthis.mipmaps = [];\n\n\t\t/**\n\t\t * WebGLTexture border.\n\t\t * See {@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/texImage2D WebGLTexture texImage2D()}.\n\t\t * Must be zero.\n\t\t * @type {number}\n\t\t */\n\t\tthis.border = 0;\n\n\t\t/**\n\t\t * WebGLTexture texel data format.\n\t\t * @type {PIXEL_FORMAT}\n\t\t * @default PIXEL_FORMAT.RGBA\n\t\t */\n\t\tthis.format = PIXEL_FORMAT.RGBA;\n\n\t\t/**\n\t\t * The default value is null, the texture's internal format will be obtained using a combination of .format and .type.\n\t\t * Users can also specify a specific internalFormat.\n\t\t * @type {null | PIXEL_FORMAT}\n\t\t * @default null\n\t\t */\n\t\tthis.internalformat = null;\n\n\t\t/**\n\t\t * WebGLTexture texel data type.\n\t\t * @type {PIXEL_TYPE}\n\t\t * @default PIXEL_TYPE.UNSIGNED_BYTE\n\t\t */\n\t\tthis.type = PIXEL_TYPE.UNSIGNED_BYTE;\n\n\t\t/**\n\t\t * How the texture is sampled when a texel covers more than one pixel.\n\t\t * @type {TEXTURE_FILTER}\n\t\t * @default TEXTURE_FILTER.LINEAR\n\t\t */\n\t\tthis.magFilter = TEXTURE_FILTER.LINEAR;\n\n\t\t/**\n\t\t * How the texture is sampled when a texel covers less than one pixel.\n\t\t * @type {TEXTURE_FILTER}\n\t\t * @default TEXTURE_FILTER.LINEAR_MIPMAP_LINEAR\n\t\t */\n\t\tthis.minFilter = TEXTURE_FILTER.LINEAR_MIPMAP_LINEAR;\n\n\t\t/**\n\t\t * This defines how the texture is wrapped horizontally and corresponds to U in UV mapping.\n\t\t * @type {TEXTURE_WRAP}\n\t\t * @default TEXTURE_WRAP.CLAMP_TO_EDGE\n\t\t */\n\t\tthis.wrapS = TEXTURE_WRAP.CLAMP_TO_EDGE;\n\n\t\t/**\n\t\t * This defines how the texture is wrapped vertically and corresponds to V in UV mapping.\n\t\t * @type {TEXTURE_WRAP}\n\t\t * @default TEXTURE_WRAP.CLAMP_TO_EDGE\n\t\t */\n\t\tthis.wrapT = TEXTURE_WRAP.CLAMP_TO_EDGE;\n\n\t\t/**\n\t\t * The number of samples taken along the axis through the pixel that has the highest density of texels.\n\t\t * A higher value gives a less blurry result than a basic mipmap, at the cost of more texture samples being used.\n\t\t * Use {@link WebGLcapabilities#maxAnisotropy} to find the maximum valid anisotropy value for the GPU; this value is usually a power of 2.\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.anisotropy = 1;\n\n\t\t/**\n\t\t * Use for shadow sampler (WebGL 2.0 Only).\n\t\t * @type {COMPARE_FUNC | undefined}\n\t\t * @default undefined\n\t\t */\n\t\tthis.compare = undefined;\n\n\t\t/**\n\t\t * Whether to generate mipmaps (if possible) for a texture.\n\t\t * Set this to false if you are creating mipmaps manually.\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.generateMipmaps = true;\n\n\t\t/**\n\t\t * texture pixel encoding.\n\t\t * @type {TEXEL_ENCODING_TYPE}\n\t\t * @default TEXEL_ENCODING_TYPE.LINEAR\n\t\t */\n\t\tthis.encoding = TEXEL_ENCODING_TYPE.LINEAR;\n\n\t\t/**\n\t\t * If set to true, the texture is flipped along the vertical axis when uploaded to the GPU.\n\t\t * Default is true to flips the image's Y axis to match the WebGL texture coordinate space.\n\t\t * Note that this property has no effect for ImageBitmap. You need to configure on bitmap creation instead.\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.flipY = true;\n\n\t\t/**\n\t\t * If set to true, the alpha channel, if present, is multiplied into the color channels when the texture is uploaded to the GPU.\n\t\t * Note that this property has no effect for ImageBitmap. You need to configure on bitmap creation instead.\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.premultiplyAlpha = false;\n\n\t\t/**\n\t\t * Specifies the alignment requirements for the start of each pixel row in memory.\n\t\t * The allowable values are 1 (byte-alignment), 2 (rows aligned to even-numbered bytes), 4 (word-alignment), and 8 (rows start on double-word boundaries).\n\t\t * @type {number}\n\t\t * @default 4\n\t\t */\n\t\tthis.unpackAlignment = 4;\n\n\t\t/**\n\t\t * version code increse if texture changed.\n\t\t * if version is still 0, this texture will be skiped.\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.version = 0;\n\t}\n\n\t/**\n\t * Returns a clone of this texture.\n\t * @returns {TextureBase}\n\t */\n\tclone() {\n\t\treturn new this.constructor().copy(this);\n\t}\n\n\t/**\n\t * Copy the given texture into this texture.\n\t * @param {TextureBase} source - The texture to be copied.\n\t * @returns {TextureBase}\n\t */\n\tcopy(source) {\n\t\tthis.userData = cloneJson(source.userData);\n\n\t\tthis.mipmaps = source.mipmaps.slice(0);\n\n\t\tthis.border = source.border;\n\t\tthis.format = source.format;\n\t\tthis.internalformat = source.internalformat;\n\t\tthis.type = source.type;\n\t\tthis.magFilter = source.magFilter;\n\t\tthis.minFilter = source.minFilter;\n\t\tthis.wrapS = source.wrapS;\n\t\tthis.wrapT = source.wrapT;\n\t\tthis.anisotropy = source.anisotropy;\n\t\tthis.compare = source.compare;\n\t\tthis.generateMipmaps = source.generateMipmaps;\n\t\tthis.encoding = source.encoding;\n\t\tthis.flipY = source.flipY;\n\t\tthis.premultiplyAlpha = source.premultiplyAlpha;\n\t\tthis.unpackAlignment = source.unpackAlignment;\n\n\t\tthis.version = source.version;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Dispatches a dispose event.\n\t */\n\tdispose() {\n\t\tthis.dispatchEvent({ type: 'dispose' });\n\n\t\tthis.version = 0;\n\t}\n\n\t/**\n\t * Resize the texture for use as a render target attachment.\n\t * @param {number} width - The new width of the texture.\n\t * @param {number} height - The new height of the texture.\n\t * @param {number} [depth] - The new depth of the texture.\n\t * Only {@link Texture3D} and {@link Texture2DArray} will use this parameter.\n\t * If not specified, the depth will not be changed.\n\t */\n\tresizeAsAttachment(width, height, depth) {}\n\n}\n\n/**\n * This flag can be used for type testing.\n * @readonly\n * @type {boolean}\n * @default true\n */\nTextureBase.prototype.isTexture = true;\n\nexport { TextureBase };"
  },
  {
    "path": "src/resources/textures/TextureCube.js",
    "content": "import { TextureBase } from './TextureBase.js';\n\n/**\n * Creates a cube texture.\n * @extends TextureBase\n */\nclass TextureCube extends TextureBase {\n\n\tconstructor() {\n\t\tsuper();\n\n\t\t/**\n\t\t * Images data for this texture.\n\t\t * @type {HTMLImageElement[]}\n\t\t * @default []\n\t\t */\n\t\tthis.images = [];\n\n\t\t/**\n\t\t * @default false\n\t\t */\n\t\tthis.flipY = false;\n\t}\n\n\t/**\n\t * Copy the given cube texture into this texture.\n\t * @param {TextureCube} source - The cube texture to be copied.\n\t * @returns {TextureCube}\n\t */\n\tcopy(source) {\n\t\tsuper.copy(source);\n\n\t\tthis.images = source.images.slice(0);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * @override\n\t */\n\tresizeAsAttachment(width, height) {\n\t\tlet changed = false;\n\n\t\tfor (let i = 0; i < 6; i++) {\n\t\t\tif (this.images[i] && this.images[i].rtt) {\n\t\t\t\tif (this.images[i].width !== width || this.images[i].height !== height) {\n\t\t\t\t\tthis.images[i].width = width;\n\t\t\t\t\tthis.images[i].height = height;\n\t\t\t\t\tchanged = true;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tthis.images[i] = { rtt: true, data: null, width, height };\n\t\t\t\tchanged = true;\n\t\t\t}\n\t\t}\n\n\t\tif (changed) {\n\t\t\tthis.version++;\n\t\t}\n\t}\n\n}\n\n/**\n * This flag can be used for type testing.\n * @readonly\n * @type {boolean}\n * @default true\n */\nTextureCube.prototype.isTextureCube = true;\n\nexport { TextureCube };"
  },
  {
    "path": "src/scenes/Bone.js",
    "content": "import { Object3D } from './Object3D.js';\n\n/**\n * A bone which is part of a Skeleton.\n * The skeleton in turn is used by the SkinnedMesh.\n * Bones are almost identical to a blank Object3D.\n * Bone acturely is a joint.\n * The position means joint position.\n * Mesh transform is based this joint space.\n * @extends Object3D\n */\nclass Bone extends Object3D {\n\n\tconstructor() {\n\t\tsuper();\n\t}\n\n}\n\n/**\n * This flag can be used for type testing.\n * @readonly\n * @type {boolean}\n * @default true\n */\nBone.prototype.isBone = true;\n\nexport { Bone };"
  },
  {
    "path": "src/scenes/Camera.js",
    "content": "import { Object3D } from './Object3D.js';\nimport { TEXEL_ENCODING_TYPE } from '../const.js';\nimport { Matrix4 } from '../math/Matrix4.js';\nimport { Frustum } from '../math/Frustum.js';\nimport { Vector4 } from '../math/Vector4.js';\nimport { Vector3 } from '../math/Vector3.js';\nimport { PerspectiveProjection } from '../resources/projections/PerspectiveProjection.js';\nimport { OrthographicProjection } from '../resources/projections/OrthographicProjection.js';\n\n/**\n * The camera used for rendering a 3D scene.\n * The camera's direction is defined as the 3-vector (0.0, 0,0, -1.0), that is, an untransformed camera points down the -Z axis.\n * @extends Object3D\n */\nclass Camera extends Object3D {\n\n\t/**\n\t * Create a camera.\n\t */\n\tconstructor() {\n\t\tsuper();\n\n\t\t/**\n\t\t * This is the inverse of worldMatrix.\n\t\t * The matrix may be different from the value passed in the shader, scene.anchorMatrix is not considered here.\n\t\t * @type {Matrix4}\n\t\t */\n\t\tthis.viewMatrix = new Matrix4();\n\n\t\t/**\n\t\t * This is the matrix which contains the projection.\n\t\t * @type {Matrix4}\n\t\t */\n\t\tthis.projectionMatrix = new Matrix4();\n\n\t\t/**\n\t\t * This is the matrix which contains the projection.\n\t\t * @type {Matrix4}\n\t\t */\n\t\tthis.projectionMatrixInverse = new Matrix4();\n\n\t\t/**\n\t\t * This is the matrix which contains the projection and view matrix.\n\t\t * The matrix may be different from the value passed in the shader, scene.anchorMatrix is not considered here.\n\t\t * @type {Matrix4}\n\t\t */\n\t\tthis.projectionViewMatrix = new Matrix4();\n\n\t\t/**\n\t\t * The frustum of the camera.\n\t\t * @type {Frustum}\n\t\t */\n\t\tthis.frustum = new Frustum();\n\n\t\t/**\n\t\t * The factor of gamma.\n\t\t * @type {number}\n\t\t * @default 2.0\n\t\t */\n\t\tthis.gammaFactor = 2.0;\n\n\t\t/**\n\t\t * Output pixel encoding.\n\t\t * @type {TEXEL_ENCODING_TYPE}\n\t\t * @default TEXEL_ENCODING_TYPE.LINEAR\n\t\t */\n\t\tthis.outputEncoding = TEXEL_ENCODING_TYPE.LINEAR;\n\n\t\t/**\n\t\t * Where on the screen is the camera rendered in normalized coordinates.\n\t\t * The values in rect range from zero (left/bottom) to one (right/top).\n\t\t * @type {Vector4}\n\t\t * @default Vector4(0, 0, 1, 1)\n\t\t */\n\t\tthis.rect = new Vector4(0, 0, 1, 1);\n\n\t\t/**\n\t\t * When this is set, it checks every frame if objects are in the frustum of the camera before rendering objects.\n\t\t * Otherwise objects gets rendered every frame even if it isn't visible.\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.frustumCulled = true;\n\t}\n\n\t/**\n\t * Set view by look at, this func will set quaternion of this camera.\n\t * @param {Vector3} target - The target that the camera look at.\n\t * @param {Vector3} up - The up direction of the camera.\n\t */\n\tlookAt(target, up) {\n\t\t_mat4_1.lookAtRH(this.position, target, up);\n\t\tthis.quaternion.setFromRotationMatrix(_mat4_1);\n\t}\n\n\t/**\n\t * Set orthographic projection matrix.\n\t * @param {number} left Camera frustum left plane.\n\t * @param {number} right Camera frustum right plane.\n\t * @param {number} bottom Camera frustum bottom plane.\n\t * @param {number} top Camera frustum top plane.\n\t * @param {number} near Camera frustum near plane.\n\t * @param {number} far Camera frustum far plane.\n\t * @deprecated Use OrthographicProjection instead.\n\t */\n\tsetOrtho(left, right, bottom, top, near, far) {\n\t\t_orthographicProjection.set(left, right, top, bottom, near, far);\n\t\tthis.setProjectionMatrix(_orthographicProjection.matrix);\n\t}\n\n\t/**\n\t * Set perspective projection matrix.\n\t * @param {number} fov Camera frustum vertical field of view.\n\t * @param {number} aspect Camera frustum aspect ratio.\n\t * @param {number} near Camera frustum near plane.\n\t * @param {number} far Camera frustum far plane.\n\t * @deprecated Use PerspectiveProjection instead.\n\t */\n\tsetPerspective(fov, aspect, near, far) {\n\t\t_perspectiveProjection.set(fov * 180 / Math.PI, aspect, near, far);\n\t\tthis.setProjectionMatrix(_perspectiveProjection.matrix);\n\t}\n\n\t/**\n\t * Set the projection matrix.\n\t * @param {Matrix4} matrix The projection matrix.\n\t */\n\tsetProjectionMatrix(matrix) {\n\t\tthis.projectionMatrix.copy(matrix);\n\t\tthis.projectionMatrixInverse.copy(this.projectionMatrix).invert();\n\t}\n\n\tgetWorldDirection(optionalTarget = new Vector3()) {\n\t\treturn super.getWorldDirection(optionalTarget).negate();\n\t}\n\n\tupdateMatrix(force) {\n\t\tObject3D.prototype.updateMatrix.call(this, force);\n\n\t\tthis.viewMatrix.copy(this.worldMatrix).invert(); // update view matrix\n\n\t\tthis.projectionViewMatrix.multiplyMatrices(this.projectionMatrix, this.viewMatrix); // get PV matrix\n\t\tthis.frustum.setFromMatrix(this.projectionViewMatrix); // update frustum\n\t}\n\n\tcopy(source, recursive) {\n\t\tObject3D.prototype.copy.call(this, source, recursive);\n\n\t\tthis.viewMatrix.copy(source.viewMatrix);\n\t\tthis.projectionMatrix.copy(source.projectionMatrix);\n\t\tthis.projectionMatrixInverse.copy(source.projectionMatrixInverse);\n\n\t\tthis.frustum.copy(source.frustum);\n\t\tthis.gammaFactor = source.gammaFactor;\n\t\tthis.outputEncoding = source.outputEncoding;\n\t\tthis.rect.copy(source.rect);\n\t\tthis.frustumCulled = source.frustumCulled;\n\n\t\treturn this;\n\t}\n\n}\n\n/**\n * This flag can be used for type testing.\n * @readonly\n * @type {boolean}\n * @default true\n */\nCamera.prototype.isCamera = true;\n\nconst _mat4_1 = new Matrix4();\nconst _perspectiveProjection = new PerspectiveProjection();\nconst _orthographicProjection = new OrthographicProjection();\n\nexport { Camera };"
  },
  {
    "path": "src/scenes/Light.js",
    "content": "import { Object3D } from './Object3D.js';\nimport { Color3 } from '../math/Color3.js';\nimport { Matrix4 } from '../math/Matrix4.js';\n\n/**\n * Abstract base class for lights\n * - The light's direction is defined as the 3-vector (0.0, 0,0, -1.0), that is, an untransformed light points down the -Z axis.\n * - all other light types inherit the properties and methods described here.\n * @abstract\n * @extends Object3D\n */\nclass Light extends Object3D {\n\n\t/**\n\t * @param {number} [color=0xffffff]\n\t * @param {number} [intensity=1]\n\t */\n\tconstructor(color = 0xffffff, intensity = 1) {\n\t\tsuper();\n\n\t\t/**\n\t\t * Color of the light.\n\t\t * @type {Color3}\n\t\t * @default Color3(0xffffff)\n\t\t */\n\t\tthis.color = new Color3(color);\n\n\t\t/**\n\t\t * The light's intensity, or strength.\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.intensity = intensity;\n\n\t\t/**\n\t\t * Group mask of the light, indicating which lighting group the light belongs to. Default is 1 (binary 0001), meaning the light belongs to lighting group 0.\n\t\t * For example, to make the light effective in both lighting group 0 and lighting group 1, set groupMask to 3 (binary 0011).\n\t\t * Used in conjunction with {@link Material#lightingGroup}.\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.groupMask = 1;\n\t}\n\n\t/**\n\t * Set light direction, this func will set quaternion of this light.\n\t * @param {Vector3} target - The target that the light look at.\n\t * @param {Vector3} up - The up direction of the light.\n\t */\n\tlookAt(target, up) {\n\t\t_mat4_1.lookAtRH(this.position, target, up);\n\t\tthis.quaternion.setFromRotationMatrix(_mat4_1);\n\t}\n\n\t/**\n\t * Copies properties from the source light into this one.\n\t * @param {Light} source - The source light.\n\t * @returns {Light} - This light.\n\t */\n\tcopy(source) {\n\t\tsuper.copy(source);\n\n\t\tthis.color.copy(source.color);\n\t\tthis.intensity = source.intensity;\n\t\tthis.groupMask = source.groupMask;\n\n\t\treturn this;\n\t}\n\n}\n\n/**\n * This flag can be used for type testing.\n * @readonly\n * @type {boolean}\n * @default true\n */\nLight.prototype.isLight = true;\n\nconst _mat4_1 = new Matrix4();\n\nexport { Light };\n"
  },
  {
    "path": "src/scenes/Mesh.js",
    "content": "import { Object3D } from './Object3D.js';\nimport { DRAW_SIDE } from '../const.js';\nimport { Sphere } from '../math/Sphere.js';\nimport { Matrix4 } from '../math/Matrix4.js';\nimport { Ray } from '../math/Ray.js';\nimport { Vector3 } from '../math/Vector3.js';\nimport { Vector2 } from '../math/Vector2.js';\nimport { Triangle } from '../math/Triangle.js';\n\nconst _sphere = new Sphere();\nconst _inverseMatrix = new Matrix4();\nconst _ray = new Ray();\n\nconst _barycoord = new Vector3();\n\nconst _vA = new Vector3();\nconst _vB = new Vector3();\nconst _vC = new Vector3();\n\nconst _tempA = new Vector3();\nconst _morphA = new Vector3();\n\nconst _uvA = new Vector2();\nconst _uvB = new Vector2();\nconst _uvC = new Vector2();\n\nconst _intersectionPoint = new Vector3();\nconst _intersectionPointWorld = new Vector3();\n\n/**\n * Class representing triangular polygon mesh based objects.\n * Also serves as a base for other classes such as {@link SkinnedMesh}.\n * @extends Object3D\n */\nclass Mesh extends Object3D {\n\n\t/**\n\t * @param {Geometry} geometry — an instance of {@link Geometry}.\n\t * @param {Material} material - a single or an array of {@link Material}.\n\t */\n\tconstructor(geometry, material) {\n\t\tsuper();\n\n\t\t/**\n\t\t * an instance of {@link Geometry}.\n\t\t * @type {Geometry}\n\t\t */\n\t\tthis.geometry = geometry;\n\n\t\t/**\n\t\t * a single or an array of {@link Material}.\n\t\t * @type {Material|Material[]}\n\t\t */\n\t\tthis.material = material;\n\n\t\t/**\n\t\t * An array of weights typically from 0-1 that specify how much of the morph is applied.\n\t\t * @type {number[] | null}\n\t\t * @default null\n\t\t */\n\t\tthis.morphTargetInfluences = null;\n\t}\n\n\t/**\n\t * Get the local-space position of the vertex at the given index,\n\t * taking into account the current animation state of both morph targets and skinning.\n\t * @param {number} index - The index of the vertex.\n\t * @param {Vector3} target - The target vector.\n\t * @returns {Vector3} The target vector.\n\t */\n\tgetVertexPosition(index, target) {\n\t\tconst geometry = this.geometry;\n\t\tconst position = geometry.getAttribute('a_Position');\n\t\tconst morphPosition = geometry.morphAttributes.position;\n\n\t\ttarget.fromArray(position.buffer.array, index * position.buffer.stride + position.offset);\n\n\t\tconst morphInfluences = this.morphTargetInfluences;\n\n\t\tif (morphPosition && morphInfluences) {\n\t\t\t_morphA.set(0, 0, 0);\n\n\t\t\tfor (let i = 0, il = morphPosition.length; i < il; i++) {\n\t\t\t\tconst influence = morphInfluences[i];\n\t\t\t\tconst morphAttribute = morphPosition[i];\n\n\t\t\t\tif (influence === 0) continue;\n\n\t\t\t\t_tempA.fromArray(morphAttribute.buffer.array, index * morphAttribute.buffer.stride + morphAttribute.offset);\n\n\t\t\t\t_morphA.addScaledVector(_tempA, influence);\n\t\t\t}\n\n\t\t\ttarget.add(_morphA);\n\t\t}\n\n\t\treturn target;\n\t}\n\n\traycast(ray, intersects) {\n\t\tconst geometry = this.geometry;\n\t\tconst material = this.material;\n\t\tconst worldMatrix = this.worldMatrix;\n\n\t\t_sphere.copy(geometry.boundingSphere);\n\t\t_sphere.applyMatrix4(worldMatrix);\n\t\tif (!ray.intersectsSphere(_sphere)) {\n\t\t\treturn;\n\t\t}\n\n\t\t_inverseMatrix.copy(worldMatrix).invert();\n\t\t_ray.copy(ray).applyMatrix4(_inverseMatrix);\n\n\t\tif (!_ray.intersectsBox(geometry.boundingBox)) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst position = geometry.getAttribute('a_Position');\n\n\t\tif (!position) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst uv = geometry.getAttribute('a_Uv');\n\t\tconst groups = geometry.groups;\n\n\t\tlet intersection;\n\n\t\tif (geometry.index) {\n\t\t\tconst index = geometry.index.buffer.array;\n\n\t\t\tif (Array.isArray(material)) {\n\t\t\t\tfor (let i = 0, il = groups.length; i < il; i++) {\n\t\t\t\t\tconst group = groups[i];\n\t\t\t\t\tconst groupMaterial = material[group.materialIndex];\n\n\t\t\t\t\tconst start = group.start;\n\t\t\t\t\tconst end = Math.min(index.length, group.start + group.count);\n\n\t\t\t\t\tfor (let j = start, jl = end; j < jl; j += 3) {\n\t\t\t\t\t\tconst a = index[j];\n\t\t\t\t\t\tconst b = index[j + 1];\n\t\t\t\t\t\tconst c = index[j + 2];\n\n\t\t\t\t\t\tintersection = checkGeometryIntersection(this, groupMaterial, ray, _ray, uv, a, b, c);\n\n\t\t\t\t\t\tif (intersection) {\n\t\t\t\t\t\t\tintersection.faceIndex = Math.floor(i / 3);\n\t\t\t\t\t\t\tintersection.face.materialIndex = group.materialIndex;\n\t\t\t\t\t\t\tintersects.push(intersection);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tfor (let i = 0, il = index.length; i < il; i += 3) {\n\t\t\t\t\tconst a = index[i];\n\t\t\t\t\tconst b = index[i + 1];\n\t\t\t\t\tconst c = index[i + 2];\n\n\t\t\t\t\tintersection = checkGeometryIntersection(this, material, ray, _ray, uv, a, b, c);\n\n\t\t\t\t\tif (intersection) {\n\t\t\t\t\t\tintersection.faceIndex = Math.floor(i / 3);\n\t\t\t\t\t\tintersects.push(intersection);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tif (Array.isArray(material)) {\n\t\t\t\tfor (let i = 0, il = groups.length; i < il; i++) {\n\t\t\t\t\tconst group = groups[i];\n\t\t\t\t\tconst groupMaterial = material[group.materialIndex];\n\n\t\t\t\t\tconst start = group.start;\n\t\t\t\t\tconst end = Math.min(position.buffer.count, group.start + group.count);\n\n\t\t\t\t\tfor (let j = start, jl = end; j < jl; j += 3) {\n\t\t\t\t\t\tconst a = j;\n\t\t\t\t\t\tconst b = j + 1;\n\t\t\t\t\t\tconst c = j + 2;\n\n\t\t\t\t\t\tintersection = checkGeometryIntersection(this, groupMaterial, ray, _ray, uv, a, b, c);\n\n\t\t\t\t\t\tif (intersection) {\n\t\t\t\t\t\t\tintersection.faceIndex = Math.floor(i / 3);\n\t\t\t\t\t\t\tintersection.face.materialIndex = group.materialIndex;\n\t\t\t\t\t\t\tintersects.push(intersection);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tfor (let i = 0, il = position.buffer.count; i < il; i += 3) {\n\t\t\t\t\tconst a = i;\n\t\t\t\t\tconst b = i + 1;\n\t\t\t\t\tconst c = i + 2;\n\n\t\t\t\t\tintersection = checkGeometryIntersection(this, material, ray, _ray, uv, a, b, c);\n\n\t\t\t\t\tif (intersection) {\n\t\t\t\t\t\tintersection.faceIndex = Math.floor(i / 3);\n\t\t\t\t\t\tintersects.push(intersection);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tcopy(source) {\n\t\tsuper.copy(source);\n\t\tif (source.morphTargetInfluences) {\n\t\t\tthis.morphTargetInfluences = source.morphTargetInfluences.slice();\n\t\t}\n\t\treturn this;\n\t}\n\n\tclone() {\n\t\treturn new this.constructor(this.geometry, this.material).copy(this);\n\t}\n\n}\n\n/**\n * This flag can be used for type testing.\n * @readonly\n * @type {boolean}\n * @default true\n */\nMesh.prototype.isMesh = true;\n\nfunction checkGeometryIntersection(object, material, ray, _ray, uv, a, b, c) {\n\tobject.getVertexPosition(a, _vA);\n\tobject.getVertexPosition(b, _vB);\n\tobject.getVertexPosition(c, _vC);\n\n\tconst intersection = checkIntersection(object, material, ray, _ray, _vA, _vB, _vC, _intersectionPoint);\n\n\tif (intersection) {\n\t\tlet array;\n\t\tlet bufferStride;\n\t\tlet attributeOffset;\n\n\t\tif (uv) {\n\t\t\tarray = uv.buffer.array;\n\t\t\tbufferStride = uv.buffer.stride;\n\t\t\tattributeOffset = uv.offset;\n\t\t\t_uvA.fromArray(array, a * bufferStride + attributeOffset);\n\t\t\t_uvB.fromArray(array, b * bufferStride + attributeOffset);\n\t\t\t_uvC.fromArray(array, c * bufferStride + attributeOffset);\n\n\t\t\tintersection.uv = uvIntersection(_intersectionPoint, _vA, _vB, _vC, _uvA, _uvB, _uvC);\n\t\t}\n\n\t\tconst face = {\n\t\t\ta: a,\n\t\t\tb: b,\n\t\t\tc: c,\n\t\t\tnormal: new Vector3()\n\t\t};\n\n\t\tTriangle.normal(_vA, _vB, _vC, face.normal);\n\n\t\tintersection.face = face;\n\t}\n\n\treturn intersection;\n}\n\nfunction uvIntersection(point, p1, p2, p3, uv1, uv2, uv3) {\n\tTriangle.barycoordFromPoint(point, p1, p2, p3, _barycoord);\n\n\tuv1.multiplyScalar(_barycoord.x);\n\tuv2.multiplyScalar(_barycoord.y);\n\tuv3.multiplyScalar(_barycoord.z);\n\n\tuv1.add(uv2).add(uv3);\n\n\treturn uv1.clone();\n}\n\nfunction checkIntersection(object, material, ray, localRay, pA, pB, pC, point) {\n\tlet intersect;\n\n\tif (material.side === DRAW_SIDE.BACK) {\n\t\tintersect = localRay.intersectTriangle(pC, pB, pA, true, point);\n\t} else {\n\t\tintersect = localRay.intersectTriangle(pA, pB, pC, material.side !== DRAW_SIDE.DOUBLE, point);\n\t}\n\n\tif (intersect === null) return null;\n\n\t_intersectionPointWorld.copy(point);\n\t_intersectionPointWorld.applyMatrix4(object.worldMatrix);\n\n\tconst distance = ray.origin.distanceTo(_intersectionPointWorld);\n\n\treturn {\n\t\tdistance: distance,\n\t\tpoint: _intersectionPointWorld.clone(),\n\t\tobject: object\n\t};\n}\n\nexport { Mesh };"
  },
  {
    "path": "src/scenes/Object3D.js",
    "content": "import { cloneJson } from '../base.js';\nimport { SHADOW_TYPE } from '../const.js';\nimport { Vector3 } from '../math/Vector3.js';\nimport { Euler } from '../math/Euler.js';\nimport { Quaternion } from '../math/Quaternion.js';\nimport { Matrix4 } from '../math/Matrix4.js';\nimport { MathUtils } from '../math/MathUtils.js';\n\nlet _object3DId = 0;\n\nconst _mat4_1 = new Matrix4();\n\n/**\n * This is the base class for most objects,\n * and provides a set of properties and methods for manipulating objects in 3D space.\n */\nclass Object3D {\n\n\tconstructor() {\n\t\t/**\n\t\t * Unique number for this object instance.\n\t\t * @readonly\n\t\t * @type {number}\n\t\t */\n\t\tthis.id = _object3DId++;\n\n\t\t/**\n\t\t * UUID of this object instance.\n\t\t * This gets automatically assigned, so this shouldn't be edited.\n\t\t * @type {string}\n\t\t */\n\t\tthis.uuid = MathUtils.generateUUID();\n\n\t\t/**\n\t\t * Optional name of the object (doesn't need to be unique).\n\t\t * @type {string}\n\t\t * @default \"\"\n\t\t */\n\t\tthis.name = '';\n\n\t\t/**\n\t\t * A Vector3 representing the object's local position.\n\t\t * @type {Vector3}\n\t\t * @default Vector3(0, 0, 0)\n\t\t */\n\t\tthis.position = new Vector3();\n\n\t\t/**\n\t\t * The object's local scale.\n\t\t * @type {Vector3}\n\t\t * @default Vector3(1, 1, 1)\n\t\t */\n\t\tthis.scale = new Vector3(1, 1, 1);\n\n\t\t/**\n\t\t * Object's local rotation as an {@link Euler}, in radians.\n\t\t * @type {Euler}\n\t\t * @default Euler(0, 0, 0)\n\t\t */\n\t\tthis.euler = new Euler();\n\n\t\t/**\n\t\t * Object's local rotation as a {@link Quaternion}.\n\t\t * @type {Quaternion}\n\t\t * @default Quaternion(0, 0, 0, 1)\n\t\t */\n\t\tthis.quaternion = new Quaternion();\n\n\t\t// bind euler and quaternion\n\t\tconst euler = this.euler, quaternion = this.quaternion;\n\t\teuler.onChange(function() {\n\t\t\tquaternion.setFromEuler(euler, false);\n\t\t});\n\t\tquaternion.onChange(function() {\n\t\t\teuler.setFromQuaternion(quaternion, undefined, false);\n\t\t});\n\n\t\t/**\n\t\t * The local transform matrix.\n\t\t * @type {Matrix4}\n\t\t */\n\t\tthis.matrix = new Matrix4();\n\n\t\t/**\n\t\t * The global transform of the object.\n\t\t * If the Object3D has no parent, then it's identical to the local transform {@link Object3D#matrix}.\n\t\t * @type {Matrix4}\n\t\t */\n\t\tthis.worldMatrix = new Matrix4();\n\n\t\t/**\n\t\t * Object's parent in the scene graph.\n\t\t * An object can have at most one parent.\n\t\t * @type {Object3D[]}\n\t\t */\n\t\tthis.children = new Array();\n\n\t\t/**\n\t\t * Object's parent in the scene graph.\n\t\t * An object can have at most one parent.\n\t\t * @type {Object3D}\n\t\t */\n\t\tthis.parent = null;\n\n\t\t/**\n\t\t * Whether the object gets rendered into shadow map.\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.castShadow = false;\n\n\t\t/**\n\t\t * Whether the material receives shadows.\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.receiveShadow = false;\n\n\t\t/**\n\t\t * Defines shadow map type.\n\t\t * Note: In webgl1 or {@link Scene#disableShadowSampler} is true, soft shadow types will fallback to POISSON_SOFT without warning.\n\t\t * Note: Point light only support POISSON_SOFT for now.\n\t\t * @type {SHADOW_TYPE}\n\t\t * @default SHADOW_TYPE.PCF3_SOFT\n\t\t */\n\t\tthis.shadowType = SHADOW_TYPE.PCF3_SOFT;\n\n\t\t/**\n\t\t * When this is set, it checks every frame if the object is in the frustum of the camera before rendering the object.\n\t\t * Otherwise the object gets rendered every frame even if it isn't visible.\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.frustumCulled = true;\n\n\t\t/**\n\t\t * Object gets rendered if true.\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.visible = true;\n\n\t\t/**\n\t\t * This value allows the default rendering order of scene graph objects to be overridden although opaque and transparent objects remain sorted independently.\n\t\t * Sorting is from lowest to highest renderOrder.\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.renderOrder = 0;\n\n\t\t/**\n\t\t * Render layer of this object.\n\t\t * RenderQueue will dispatch all renderable objects to the corresponding RenderQueueLayer according to object.renderLayer.\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.renderLayer = 0;\n\n\t\t/**\n\t\t * Whether it can be collected into the Render Queue.\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.renderable = true;\n\n\t\t/**\n\t\t * An object that can be used to store custom data about the {@link Object3D}.\n\t\t * It should not hold references to functions as these will not be cloned.\n\t\t * @type {object}\n\t\t * @default {}\n\t\t */\n\t\tthis.userData = {};\n\n\t\t/**\n\t\t * When this is set, it calculates the matrix of position, (rotation or quaternion) and scale every frame and also recalculates the worldMatrix property.\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.matrixAutoUpdate = true;\n\n\t\t/**\n\t\t * When this is set, it calculates the matrix in that frame and resets this property to false.\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.matrixNeedsUpdate = true;\n\n\t\t/**\n\t\t * When this is set, it calculates the world matrix in that frame and resets this property to false.\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.worldMatrixNeedsUpdate = true;\n\t}\n\n\t/**\n\t * An optional callback that is executed immediately before the Object3D is rendered.\n\t */\n\tonBeforeRender() {}\n\n\t/**\n\t * An optional callback that is executed immediately after the Object3D is rendered.\n\t */\n\tonAfterRender() {}\n\n\t/**\n\t * Add object as child of this object.\n\t * @param {Object3D} object\n\t */\n\tadd(object) {\n\t\tif (object === this) {\n\t\t\tconsole.error('Object3D.add: object can\\'t be added as a child of itself.', object);\n\t\t\treturn;\n\t\t}\n\n\t\tif (object.parent !== null) {\n\t\t\tobject.parent.remove(object);\n\t\t}\n\n\t\tobject.parent = this;\n\t\tthis.children.push(object);\n\n\t\tobject.worldMatrixNeedsUpdate = true;\n\t}\n\n\t/**\n\t * Remove object as child of this object.\n\t * @param {Object3D} object\n\t */\n\tremove(object) {\n\t\tconst index = this.children.indexOf(object);\n\t\tif (index !== -1) {\n\t\t\tobject.parent = null;\n\t\t\tthis.children.splice(index, 1);\n\n\t\t\tobject.worldMatrixNeedsUpdate = true;\n\t\t}\n\t}\n\n\t/**\n\t * Searches through the object's children and returns the first with a matching name.\n\t * Note that for most objects the name is an empty string by default.\n\t * You will have to set it manually to make use of this method.\n\t * @param {string} name - String to match to the children's {@link Object3D#name} property.\n\t * @returns {Object3D}\n\t */\n\tgetObjectByName(name) {\n\t\treturn this.getObjectByProperty('name', name);\n\t}\n\n\t/**\n\t * Searches through the object's children and returns the first with a property that matches the value given.\n\t * @param {string} name - the property name to search for.\n\t * @param {number} value - value of the given property.\n\t * @returns {Object3D}\n\t */\n\tgetObjectByProperty(name, value) {\n\t\tif (this[name] === value) return this;\n\n\t\tfor (let i = 0, l = this.children.length; i < l; i++) {\n\t\t\tconst child = this.children[i];\n\t\t\tconst object = child.getObjectByProperty(name, value);\n\n\t\t\tif (object !== undefined) {\n\t\t\t\treturn object;\n\t\t\t}\n\t\t}\n\n\t\treturn undefined;\n\t}\n\n\t/**\n\t * Update the local transform.\n\t * @param {boolean} force\n\t */\n\tupdateMatrix(force) {\n\t\tif (this.matrixAutoUpdate || this.matrixNeedsUpdate) {\n\t\t\tthis.matrix.compose(this.position, this.quaternion, this.scale);\n\n\t\t\tthis.matrixNeedsUpdate = false;\n\t\t\tthis.worldMatrixNeedsUpdate = true;\n\t\t}\n\n\t\tif (this.worldMatrixNeedsUpdate || force) {\n\t\t\tthis.worldMatrix.copy(this.matrix);\n\n\t\t\tif (this.parent) {\n\t\t\t\tconst parentMatrix = this.parent.worldMatrix;\n\t\t\t\tthis.worldMatrix.premultiply(parentMatrix);\n\t\t\t}\n\n\t\t\tthis.worldMatrixNeedsUpdate = false;\n\t\t\tforce = true;\n\t\t}\n\n\t\tconst children = this.children;\n\t\tfor (let i = 0, l = children.length; i < l; i++) {\n\t\t\tchildren[i].updateMatrix(force);\n\t\t}\n\t}\n\n\t/**\n\t * Returns a vector representing the direction of object's positive z-axis in world space.\n\t * This call must be after {@link Object3D#updateMatrix}.\n\t * @param {Vector3} [optionalTarget] — the result will be copied into this Vector3.\n\t * @returns {Vector3} - the result.\n\t */\n\tgetWorldDirection(optionalTarget = new Vector3()) {\n\t\tconst e = this.worldMatrix.elements;\n\t\treturn optionalTarget.set(e[8], e[9], e[10]).normalize();\n\t}\n\n\t/**\n\t * Rotates the object to face a point in local space.\n\t * @param {Vector3} target - A vector representing a position in local space.\n\t * @param {Vector3} up — A vector representing the up direction in local space.\n\t */\n\tlookAt(target, up) {\n\t\t_mat4_1.lookAtRH(target, this.position, up);\n\t\tthis.quaternion.setFromRotationMatrix(_mat4_1);\n\t}\n\n\t/**\n\t * Method to get intersections between a casted ray and this object.\n\t * @abstract\n\t * @param {Ray} ray - The {@link Ray} instance.\n\t * @param {Array} intersects - output intersects array.\n\t */\n\traycast(ray, intersects) {\n\n\t}\n\n\t/**\n\t * Executes the callback on this object and all descendants.\n\t * @param {Function} callback - A function with as first argument an object3D object.\n\t */\n\ttraverse(callback) {\n\t\tcallback(this);\n\n\t\tconst children = this.children;\n\t\tfor (let i = 0, l = children.length; i < l; i++) {\n\t\t\tchildren[i].traverse(callback);\n\t\t}\n\t}\n\n\t/**\n\t * Returns a clone of this object and optionally all descendants.\n\t * @param {Function} [recursive=true] - if true, descendants of the object are also cloned.\n\t * @returns {Object3D}\n\t */\n\tclone(recursive) {\n\t\treturn new this.constructor().copy(this, recursive);\n\t}\n\n\t/**\n\t * Copy the given object into this object.\n\t * @param {Object3D} source - The object to be copied.\n\t * @param {boolean} [recursive=true] - if true, descendants of the object are also copied.\n\t * @returns {Object3D}\n\t */\n\tcopy(source, recursive = true) {\n\t\tthis.name = source.name;\n\n\t\tthis.position.copy(source.position);\n\t\tthis.quaternion.copy(source.quaternion);\n\t\tthis.scale.copy(source.scale);\n\n\t\tthis.matrix.copy(source.matrix);\n\t\tthis.worldMatrix.copy(source.worldMatrix);\n\n\t\tthis.castShadow = source.castShadow;\n\t\tthis.receiveShadow = source.receiveShadow;\n\t\tthis.shadowType = source.shadowType;\n\n\t\tthis.frustumCulled = source.frustumCulled;\n\t\tthis.visible = source.visible;\n\t\tthis.renderOrder = source.renderOrder;\n\t\tthis.renderLayer = source.renderLayer;\n\t\tthis.renderable = source.renderable;\n\n\t\tthis.userData = cloneJson(source.userData);\n\n\t\tif (recursive === true) {\n\t\t\tfor (let i = 0; i < source.children.length; i++) {\n\t\t\t\tconst child = source.children[i];\n\t\t\t\tthis.add(child.clone());\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t}\n\n}\n\n/**\n * This flag can be used for type testing.\n * @readonly\n * @type {boolean}\n * @default true\n */\nObject3D.prototype.isObject3D = true;\n\nexport { Object3D };"
  },
  {
    "path": "src/scenes/Scene.js",
    "content": "import { Object3D } from './Object3D.js';\nimport { Matrix4 } from '../math/Matrix4.js';\nimport { RenderCollector } from '../render/RenderCollector.js';\n\n/**\n * Scenes allow you to set up what and where is to be rendered,\n * this is where you place objects, lights and cameras.\n * @extends Object3D\n */\nclass Scene extends Object3D {\n\n\t/**\n\t * Create a scene.\n\t */\n\tconstructor() {\n\t\tsuper();\n\n\t\t/**\n\t\t * A {@link Fog} instance defining the type of fog that affects everything rendered in the scene.\n\t\t * @type {Fog}\n\t\t * @default null\n\t\t */\n\t\tthis.fog = null;\n\n\t\t/**\n\t\t * Sets the environment map for all materials in the scene.\n\t\t * However, it's not possible to overwrite an existing texture assigned to Material.envMap.\n\t\t * @type {TextureCube | null}\n\t\t * @default null\n\t\t */\n\t\tthis.environment = null;\n\n\t\t/**\n\t\t * The diffuse intensity of the environment map.\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.envDiffuseIntensity = 1;\n\n\t\t/**\n\t\t * The specular intensity of the environment map.\n\t\t * This value is multiplied with the envMapIntensity of the material to get the final intensity.\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.envSpecularIntensity = 1;\n\n\t\t/**\n\t\t * User-defined clipping planes specified as {@link Plane} objects in world space.\n\t\t * These planes apply to the scene.\n\t\t * Points in space whose dot product with the plane is negative are cut away.\n\t\t * @type {Plane[]}\n\t\t * @default []\n\t\t */\n\t\tthis.clippingPlanes = [];\n\n\t\t/**\n\t\t * Defines whether disable shadow sampler feature.\n\t\t * Shader with sampler2DShadow uniforms may cause unknown error on some android phones, set disableShadowSampler to true to avoid these bugs.\n\t\t * When this property is set to true, soft shadow types will fallback to POISSON_SOFT without warning.\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.disableShadowSampler = false;\n\n\t\t/**\n\t\t * whether to use a logarithmic depth buffer. It may be neccesary to use this if dealing with huge differences in scale in a single scene.\n\t\t * Note that this setting uses gl_FragDepth if available which disables the Early Fragment Test optimization and can cause a decrease in performance.\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.logarithmicDepthBuffer = false;\n\n\t\t/**\n\t\t * The anchor matrix of the world coordinate system.\n\t\t * If it is not an identity matrix, the actual lighting calculating and the world position in the shader, will be in the anchor coordinate system.\n\t\t * By setting this property, you can solve the floating point precision problem caused by the rendering object far away from the origin of the world coordinate system.\n\t\t * In addition, by setting the rotation, it can also repair the direction of the reflection.\n\t\t * @type {Matrix4}\n\t\t */\n\t\tthis.anchorMatrix = new Matrix4();\n\n\t\t/**\n\t\t * A {@link RenderCollector} instance for this scene.\n\t\t * @type {RenderCollector}\n\t\t */\n\t\tthis.collector = new RenderCollector();\n\t}\n\n\t/**\n\t * The maximum number of lighting groups.\n\t * @type {number}\n\t * @default 1\n\t */\n\tset maxLightingGroups(value) {\n\t\tthis.collector.lightingData.setMaxGroupCount(value);\n\t}\n\tget maxLightingGroups() {\n\t\treturn this.collector.lightingData.groupList.length;\n\t}\n\n\t/**\n\t * Get {@link RenderStates} for the scene and camera.\n\t * The RenderStates will be updated by calling {@link Scene#updateRenderStates}.\n\t * The light data in RenderStates will be empty unless calling {@link Scene#updateRenderQueue}.\n\t * @param {Camera} camera - The camera.\n\t * @returns {RenderQueue} - The target render queue.\n\t */\n\tgetRenderStates(camera) {\n\t\treturn this.collector.getRenderStates(camera);\n\t}\n\n\t/**\n\t * Get {@link RenderQueue} for the scene and camera.\n\t * The RenderQueue will be updated by calling {@link Scene#updateRenderQueue}.\n\t * @param {Camera} camera - The camera.\n\t * @returns {RenderQueue} - The target render queue.\n\t */\n\tgetRenderQueue(camera) {\n\t\treturn this.collector.getRenderQueue(camera);\n\t}\n\n\t/**\n\t * Update {@link RenderStates} for the scene and camera.\n\t * The lighting data in RenderStates will be empty unless calling {@link Scene#updateRenderQueue}.\n\t * @param {Camera} camera - The camera.\n\t * @param {boolean} [updateScene=true] - Whether to update scene data.\n\t * @returns {RenderStates} - The result render states.\n\t */\n\tupdateRenderStates(camera, updateScene = true) {\n\t\tconst collector = this.collector;\n\n\t\tif (updateScene) {\n\t\t\tcollector.sceneData.update(this);\n\t\t}\n\n\t\tconst renderStates = collector.getRenderStates(camera);\n\n\t\trenderStates.updateCamera(camera);\n\n\t\treturn renderStates;\n\t}\n\n\t/**\n\t * Update {@link RenderQueue} for the scene and camera.\n\t * Collect all visible meshes (and lights) from scene graph, and push meshes to render queue.\n\t * Light data will be stored in RenderStates.\n\t * @param {Camera} camera - The camera.\n\t * @param {boolean} [collectLights=true] - Whether to collect light data.\n\t * @param {boolean} [updateSkeletons=true] - Whether to update skeletons.\n\t * @returns {RenderQueue} - The result render queue.\n\t */\n\tupdateRenderQueue(camera, collectLights = true, updateSkeletons = true) {\n\t\tconst collector = this.collector;\n\n\t\tcollector.lightingNeedsUpdate = collectLights;\n\t\tcollector.skeletonNeedsUpdate = updateSkeletons;\n\n\t\treturn collector.traverseAndCollect(this, camera);\n\t}\n\n}\n\n/**\n * This flag can be used for type testing.\n * @readonly\n * @type {boolean}\n * @default true\n */\nScene.prototype.isScene = true;\n\nexport { Scene };"
  },
  {
    "path": "src/scenes/SkinnedMesh.js",
    "content": "import { Mesh } from './Mesh.js';\nimport { Matrix4 } from '../math/Matrix4.js';\nimport { Vector3 } from '../math/Vector3.js';\nimport { Vector4 } from '../math/Vector4.js';\n\n/**\n * A mesh that has a {@link Skeleton} with bones that can then be used to animate the vertices of the geometry.\n * The material must support skinning.\n * @extends Mesh\n */\nclass SkinnedMesh extends Mesh {\n\n\tconstructor(geometry, material) {\n\t\tsuper(geometry, material);\n\n\t\t/**\n\t\t * Skeleton created from the bones of the Geometry.\n\t\t * @type {Skeleton}\n\t\t */\n\t\tthis.skeleton = undefined;\n\n\t\t/**\n\t\t * Either \"attached\" or \"detached\".\n\t\t * \"attached\" uses the {@link SkinnedMesh#worldMatrix} property for the base transform matrix of the bones.\n\t\t * \"detached\" uses the {@link SkinnedMesh#bindMatrix}.\n\t\t * @type {string}\n\t\t * @default \"attached\"\n\t\t */\n\t\tthis.bindMode = 'attached';\n\n\t\t/**\n\t\t * The base matrix that is used for the bound bone transforms.\n\t\t * @type {Matrix4}\n\t\t */\n\t\tthis.bindMatrix = new Matrix4();\n\n\t\t/**\n\t\t * The base matrix that is used for resetting the bound bone transforms.\n\t\t * @type {Matrix4}\n\t\t */\n\t\tthis.bindMatrixInverse = new Matrix4();\n\t}\n\n\t/**\n\t * Bind a skeleton to the skinned mesh.\n\t * The bindMatrix gets saved to .bindMatrix property and the .bindMatrixInverse gets calculated.\n\t * @param {Skeleton} skeleton - Skeleton created from a Bones tree.\n\t * @param {Matrix4} [bindMatrix] - Matrix4 that represents the base transform of the skeleton.\n\t */\n\tbind(skeleton, bindMatrix) {\n\t\tthis.skeleton = skeleton;\n\n\t\tif (bindMatrix === undefined) {\n\t\t\tthis.updateMatrix();\n\n\t\t\tbindMatrix = this.worldMatrix;\n\t\t}\n\n\t\tthis.bindMatrix.copy(bindMatrix);\n\t\tthis.bindMatrixInverse.copy(bindMatrix).invert();\n\t}\n\n\tupdateMatrix(force) {\n\t\tsuper.updateMatrix(force);\n\n\t\tif (this.bindMode === 'attached') {\n\t\t\tthis.bindMatrixInverse.copy(this.worldMatrix).invert();\n\t\t} else if (this.bindMode === 'detached') {\n\t\t\tthis.bindMatrixInverse.copy(this.bindMatrix).invert();\n\t\t} else {\n\t\t\tconsole.warn('SkinnedMesh: Unrecognized bindMode: ' + this.bindMode);\n\t\t}\n\t}\n\n\tcopy(source) {\n\t\tsuper.copy(source);\n\n\t\tthis.bindMode = source.bindMode;\n\t\tthis.bindMatrix.copy(source.bindMatrix);\n\t\tthis.bindMatrixInverse.copy(source.bindMatrixInverse);\n\n\t\tthis.skeleton = source.skeleton;\n\n\t\treturn this;\n\t}\n\n\tgetVertexPosition(index, target) {\n\t\tsuper.getVertexPosition(index, target);\n\n\t\tthis.applyBoneTransform(index, target);\n\n\t\treturn target;\n\t}\n\n\t/**\n\t * Applies the bone transform associated with the given index to the given position vector.\n\t * Returns the updated vector.\n\t * @param {number} index - The index of the vertex.\n\t * @param {Vector3} target - The target vector.\n\t * @returns {Vector3} The target vector.\n\t */\n\tapplyBoneTransform(index, target) {\n\t\tconst skeleton = this.skeleton;\n\t\tconst geometry = this.geometry;\n\n\t\tconst skinIndex = geometry.attributes.skinIndex;\n\t\tconst skinWeight = geometry.attributes.skinWeight;\n\n\t\t_skinIndex.fromArray(skinIndex.buffer.array, index * skinIndex.size);\n\t\t_skinWeight.fromArray(skinWeight.buffer.array, index * skinWeight.size);\n\n\t\t_basePosition.copy(target).applyMatrix4(this.bindMatrix);\n\n\t\ttarget.set(0, 0, 0);\n\n\t\tfor (let i = 0; i < 4; i++) {\n\t\t\tconst weight = getComponent(_skinWeight, i);\n\n\t\t\tif (weight < Number.EPSILON) continue;\n\n\t\t\tconst boneIndex = getComponent(_skinIndex, i);\n\n\t\t\tif (!skeleton.bones[boneIndex]) continue;\n\n\t\t\t_matrix.multiplyMatrices(skeleton.bones[boneIndex].worldMatrix, skeleton.boneInverses[boneIndex]);\n\t\t\ttarget.addScaledVector(_vector.copy(_basePosition).applyMatrix4(_matrix), weight);\n\t\t}\n\n\t\treturn target.applyMatrix4(this.bindMatrixInverse);\n\t}\n\n}\n\n/**\n * This flag can be used for type testing.\n * @readonly\n * @type {boolean}\n * @default true\n */\nSkinnedMesh.prototype.isSkinnedMesh = true;\n\nconst _basePosition = new Vector3();\nconst _skinIndex = new Vector4();\nconst _skinWeight = new Vector4();\n\nconst _vector = new Vector3();\nconst _matrix = new Matrix4();\n\nfunction getComponent(vec, index) {\n\tswitch (index) {\n\t\tcase 0: return vec.x;\n\t\tcase 1: return vec.y;\n\t\tcase 2: return vec.z;\n\t\tcase 3: return vec.w;\n\t\tdefault: throw new Error('index is out of range: ' + index);\n\t}\n}\n\nexport { SkinnedMesh };"
  },
  {
    "path": "src/scenes/lights/AmbientLight.js",
    "content": "import { Light } from '../Light.js';\n\n/**\n * This light globally illuminates all objects in the scene equally.\n * This light cannot be used to cast shadows as it does not have a direction.\n * @extends Light\n */\nclass AmbientLight extends Light {\n\n\t/**\n\t * @param {number} [color=0xffffff]\n\t * @param {number} [intensity=1]\n\t */\n\tconstructor(color, intensity) {\n\t\tsuper(color, intensity);\n\t}\n\n}\n\n/**\n * This flag can be used for type testing.\n * @readonly\n * @type {boolean}\n * @default true\n */\nAmbientLight.prototype.isAmbientLight = true;\n\nexport { AmbientLight };\n"
  },
  {
    "path": "src/scenes/lights/DirectionalLight.js",
    "content": "import { DirectionalLightShadow } from './DirectionalLightShadow.js';\nimport { Light } from '../Light.js';\n\n/**\n * A light that gets emitted in a specific direction.\n * This light will behave as though it is infinitely far away and the rays produced from it are all parallel.\n * The common use case for this is to simulate daylight; the sun is far enough away that its position can be considered to be infinite, and all light rays coming from it are parallel.\n * This light can cast shadows - see the {@link DirectionalLightShadow} page for details.\n * @extends Light\n */\nclass DirectionalLight extends Light {\n\n\t/**\n\t * @param {number} [color=0xffffff]\n\t * @param {number} [intensity=1]\n\t */\n\tconstructor(color, intensity) {\n\t\tsuper(color, intensity);\n\n\t\t/**\n\t\t * A {@link DirectionalLightShadow} used to calculate shadows for this light.\n\t\t * @type {DirectionalLightShadow}\n\t\t * @default DirectionalLightShadow()\n\t\t */\n\t\tthis.shadow = new DirectionalLightShadow();\n\t}\n\n\tcopy(source) {\n\t\tsuper.copy(source);\n\n\t\tthis.shadow.copy(source.shadow);\n\n\t\treturn this;\n\t}\n\n}\n\n/**\n * This flag can be used for type testing.\n * @readonly\n * @type {boolean}\n * @default true\n */\nDirectionalLight.prototype.isDirectionalLight = true;\n\nexport { DirectionalLight };"
  },
  {
    "path": "src/scenes/lights/DirectionalLightShadow.js",
    "content": "import { LightShadow } from './LightShadow.js';\nimport { TEXTURE_FILTER, PIXEL_FORMAT, PIXEL_TYPE, ATTACHMENT, COMPARE_FUNC } from '../../const.js';\nimport { Texture2D } from '../../resources/textures/Texture2D.js';\nimport { OffscreenRenderTarget } from '../../resources/targets/OffscreenRenderTarget.js';\nimport { RenderBuffer } from '../../resources/RenderBuffer.js';\n\n/**\n * This is used internally by DirectionalLights for calculating shadows.\n * @extends LightShadow\n */\nclass DirectionalLightShadow extends LightShadow {\n\n\tconstructor() {\n\t\tsuper();\n\n\t\t/**\n\t\t * The cast shadow window size.\n\t\t * @type {number}\n\t\t * @default 500\n\t\t */\n\t\tthis.windowSize = 500;\n\n\t\t/**\n\t\t * Controls the extent to which the shadows fade out at the edge of the frustum.\n\t\t * If the value is greater than 0, the shadow fades out from center to all sides of shadow texture (radial fade out),\n\t\t * if the value is less than 0, the shadow will fade out from the y+ direction (vertical fade out).\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.frustumEdgeFalloff = 0.0;\n\n\t\tthis.renderTarget = OffscreenRenderTarget.create2D(this.mapSize.x, this.mapSize.y);\n\n\t\tconst map = this.renderTarget.texture;\n\t\tmap.generateMipmaps = false;\n\t\tmap.minFilter = TEXTURE_FILTER.NEAREST;\n\t\tmap.magFilter = TEXTURE_FILTER.NEAREST;\n\n\t\tconst depthTexture = new Texture2D();\n\t\tdepthTexture.type = PIXEL_TYPE.UNSIGNED_INT;\n\t\tdepthTexture.format = PIXEL_FORMAT.DEPTH_COMPONENT;\n\t\tdepthTexture.magFilter = TEXTURE_FILTER.LINEAR;\n\t\tdepthTexture.minFilter = TEXTURE_FILTER.LINEAR;\n\t\tdepthTexture.compare = COMPARE_FUNC.LESS;\n\t\tdepthTexture.generateMipmaps = false;\n\n\t\tconst depthBuffer = new RenderBuffer(this.mapSize.x, this.mapSize.y, PIXEL_FORMAT.DEPTH_COMPONENT16);\n\n\t\tthis.renderTarget.detach(ATTACHMENT.DEPTH_STENCIL_ATTACHMENT);\n\t\tthis.renderTarget.attach(depthBuffer, ATTACHMENT.DEPTH_ATTACHMENT);\n\n\t\tthis.map = map;\n\t\tthis.depthMap = depthTexture;\n\n\t\tthis._depthBuffer = depthBuffer;\n\t}\n\n\tupdate(light) {\n\t\tthis._updateCamera(light);\n\n\t\tif (this.mapSize.x !== this.renderTarget.width || this.mapSize.y !== this.renderTarget.height) {\n\t\t\tthis.renderTarget.resize(this.mapSize.x, this.mapSize.y);\n\t\t}\n\t}\n\n\t_updateCamera(light) {\n\t\tconst camera = this.camera;\n\n\t\tcamera.matrix.copy(light.worldMatrix);\n\t\tcamera.matrix.decompose(camera.position, camera.quaternion, camera.scale);\n\t\tcamera.updateMatrix();\n\n\t\tconst halfWindowSize = this.windowSize / 2;\n\t\tcamera.setOrtho(-halfWindowSize, halfWindowSize, -halfWindowSize, halfWindowSize, this.cameraNear, this.cameraFar);\n\t}\n\n\tcopy(source) {\n\t\tsuper.copy(source);\n\n\t\tthis.windowSize = source.windowSize;\n\t\tthis.frustumEdgeFalloff = source.frustumEdgeFalloff;\n\n\t\treturn this;\n\t}\n\n\tprepareDepthMap(enable, capabilities) {\n\t\tconst useDepthMap = enable && capabilities.version >= 2;\n\t\tconst renderTarget = this.renderTarget;\n\t\tconst attachments = renderTarget._attachments;\n\t\tconst depthMapAttached = attachments[ATTACHMENT.DEPTH_ATTACHMENT] === this.depthMap;\n\n\t\tif (useDepthMap === depthMapAttached) return;\n\n\t\tif (useDepthMap) {\n\t\t\tif (capabilities.getExtension('OES_texture_float_linear')) {\n\t\t\t\tthis.depthMap.type = PIXEL_TYPE.FLOAT;\n\t\t\t}\n\n\t\t\trenderTarget.dispose();\n\t\t\trenderTarget.attach(this.depthMap, ATTACHMENT.DEPTH_ATTACHMENT);\n\t\t} else {\n\t\t\trenderTarget.dispose();\n\t\t\trenderTarget.attach(this._depthBuffer, ATTACHMENT.DEPTH_ATTACHMENT);\n\t\t}\n\t}\n\n}\n\nexport { DirectionalLightShadow };"
  },
  {
    "path": "src/scenes/lights/HemisphereLight.js",
    "content": "import { Light } from '../Light.js';\nimport { Color3 } from '../../math/Color3.js';\n\n/**\n * A light source positioned directly above the scene, with color fading from the sky color to the ground color.\n * This light cannot be used to cast shadows.\n * @extends Light\n */\nclass HemisphereLight extends Light {\n\n\t/**\n\t * @param {number} [skyColor=0xffffff] - Hexadecimal color of the sky.\n\t * @param {number} [groundColor=0xffffff] - Hexadecimal color of the ground.\n\t * @param {number} [intensity=1] - numeric value of the light's strength/intensity.\n\t */\n\tconstructor(skyColor, groundColor, intensity) {\n\t\tsuper(skyColor, intensity);\n\n\t\t/**\n\t\t * Color of the ground.\n\t\t * @type {Color3}\n\t\t * @default Color3(0xffffff)\n\t\t */\n\t\tthis.groundColor = new Color3(groundColor !== undefined ? groundColor : 0xffffff);\n\t}\n\n\tcopy(source) {\n\t\tsuper.copy(source);\n\n\t\tthis.groundColor.copy(source.groundColor);\n\t}\n\n}\n\n/**\n * This flag can be used for type testing.\n * @readonly\n * @type {boolean}\n * @default true\n */\nHemisphereLight.prototype.isHemisphereLight = true;\n\nexport { HemisphereLight };"
  },
  {
    "path": "src/scenes/lights/LightShadow.js",
    "content": "import { Camera } from '../Camera.js';\nimport { Matrix4 } from '../../math/Matrix4.js';\nimport { Vector2 } from '../../math/Vector2.js';\n\n/**\n * Serves as a base class for the other shadow classes.\n * @abstract\n */\nclass LightShadow {\n\n\tconstructor() {\n\t\t/**\n\t\t * The light's view of the world.\n\t\t * This is used to generate a depth map of the scene; objects behind other objects from the light's perspective will be in shadow.\n\t\t * @type {Camera}\n\t\t */\n\t\tthis.camera = new Camera();\n\n\t\t/**\n\t\t * Model to shadow camera space, to compute location and depth in shadow map. Stored in a {@link Matrix4}.\n\t\t * This is computed internally during rendering.\n\t\t * @type {Matrix4}\n\t\t */\n\t\tthis.matrix = new Matrix4();\n\n\t\t/**\n\t\t * Shadow map bias, how much to add or subtract from the normalized depth when deciding whether a surface is in shadow.\n\t\t * Very tiny adjustments here (in the order of 0.0001) may help reduce artefacts in shadows.\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.bias = 0;\n\n\t\t/**\n\t\t * Defines how much the position used to query the shadow map is offset along the object normal.\n\t\t * Increasing this value can be used to reduce shadow acne especially in large scenes where light shines onto geometry at a shallow angle.\n\t\t * The cost is that shadows may appear distorted.\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.normalBias = 0;\n\n\t\t/**\n\t\t * Setting this to values greater than 1 will blur the edges of the shadow.\n\t\t * High values will cause unwanted banding effects in the shadows - a greater mapSize will allow for a higher value to be used here before these effects become visible.\n\t\t * Note that this has no effect if the {@link Object3D#shadowType} is set to PCF or PCSS.\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.radius = 1;\n\n\t\t/**\n\t\t * Shadow camera near.\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.cameraNear = 1;\n\n\t\t/**\n\t\t * Shadow camera far.\n\t\t * @type {number}\n\t\t * @default 500\n\t\t */\n\t\tthis.cameraFar = 500;\n\n\t\t/**\n\t\t * A {@link Vector2} defining the width and height of the shadow map.\n\t\t * Higher values give better quality shadows at the cost of computation time.\n\t\t * Values must be powers of 2.\n\t\t * @type {Vector2}\n\t\t * @default Vector2(512, 512)\n\t\t */\n\t\tthis.mapSize = new Vector2(512, 512);\n\n\t\t/**\n\t\t * Enables automatic updates of the light's shadow.\n\t\t * If you do not require dynamic lighting / shadows, you may set this to false.\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.autoUpdate = true;\n\n\t\t/**\n\t\t * When set to true, shadow maps will be updated in the next ShadowMapPass.render call.\n\t\t * If you have set .autoUpdate to false, you will need to set this property to true and then make a ShadowMapPass.render call to update the light's shadow.\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.needsUpdate = false;\n\n\t\tthis.renderTarget = null;\n\t\tthis.map = null;\n\t\tthis.depthMap = null;\n\t}\n\n\tupdate(light, face) {}\n\n\tupdateMatrix() {\n\t\tconst matrix = this.matrix;\n\t\tconst camera = this.camera;\n\n\t\t// matrix * 0.5 + 0.5, after identity, range is 0 ~ 1 instead of -1 ~ 1\n\t\tmatrix.set(\n\t\t\t0.5, 0.0, 0.0, 0.5,\n\t\t\t0.0, 0.5, 0.0, 0.5,\n\t\t\t0.0, 0.0, 0.5, 0.5,\n\t\t\t0.0, 0.0, 0.0, 1.0\n\t\t);\n\n\t\tmatrix.multiply(camera.projectionMatrix);\n\t\tmatrix.multiply(camera.viewMatrix);\n\t}\n\n\tcopy(source) {\n\t\tthis.camera.copy(source.camera);\n\t\tthis.matrix.copy(source.matrix);\n\n\t\tthis.bias = source.bias;\n\t\tthis.normalBias = source.normalBias;\n\t\tthis.radius = source.radius;\n\n\t\tthis.cameraNear = source.cameraNear;\n\t\tthis.cameraFar = source.cameraFar;\n\n\t\tthis.mapSize.copy(source.mapSize);\n\n\t\treturn this;\n\t}\n\n\tclone() {\n\t\treturn new this.constructor().copy(this);\n\t}\n\n\tprepareDepthMap(_enable, _capabilities) {}\n\n}\n\nexport { LightShadow };"
  },
  {
    "path": "src/scenes/lights/PointLight.js",
    "content": "import { PointLightShadow } from './PointLightShadow.js';\nimport { Light } from '../Light.js';\n\n/**\n * A light that gets emitted from a single point in all directions.\n * A common use case for this is to replicate the light emitted from a bare lightbulb.\n * This light can cast shadows - see {@link PointLightShadow} page for details.\n * @extends Light\n */\nclass PointLight extends Light {\n\n\t/**\n\t * @param {number} [color=0xffffff]\n\t * @param {number} [intensity=1]\n\t * @param {number} [distance=200]\n\t * @param {number} [decay=1]\n\t */\n\tconstructor(color, intensity, distance, decay) {\n\t\tsuper(color, intensity);\n\n\t\t/**\n\t\t * The amount the light dims along the distance of the light.\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.decay = (decay !== undefined) ? decay : 1;\n\n\t\t/**\n\t\t * The distance from the light where the intensity is 0.\n\t\t * @type {number}\n\t\t * @default 200\n\t\t */\n\t\tthis.distance = (distance !== undefined) ? distance : 200;\n\n\t\t/**\n\t\t * A {@link PointLightShadow} used to calculate shadows for this light.\n\t\t * @type {PointLightShadow}\n\t\t * @default PointLightShadow()\n\t\t */\n\t\tthis.shadow = new PointLightShadow();\n\t}\n\n\tcopy(source) {\n\t\tsuper.copy(source);\n\n\t\tthis.shadow.copy(source.shadow);\n\n\t\treturn this;\n\t}\n\n}\n\n/**\n * This flag can be used for type testing.\n * @readonly\n * @type {boolean}\n * @default true\n */\nPointLight.prototype.isPointLight = true;\n\nexport { PointLight };"
  },
  {
    "path": "src/scenes/lights/PointLightShadow.js",
    "content": "import { LightShadow } from './LightShadow.js';\nimport { TEXTURE_FILTER } from '../../const.js';\nimport { OffscreenRenderTarget } from '../../resources/targets/OffscreenRenderTarget.js';\nimport { Vector3 } from '../../math/Vector3.js';\n\n/**\n * This is used internally by PointLights for calculating shadows.\n * @extends LightShadow\n */\nclass PointLightShadow extends LightShadow {\n\n\tconstructor() {\n\t\tsuper();\n\n\t\tthis.renderTarget = OffscreenRenderTarget.createCube(this.mapSize.x, this.mapSize.y);\n\n\t\tconst map = this.renderTarget.texture;\n\t\tmap.generateMipmaps = false;\n\t\tmap.minFilter = TEXTURE_FILTER.NEAREST;\n\t\tmap.magFilter = TEXTURE_FILTER.NEAREST;\n\t\tthis.map = map;\n\n\t\tthis._targets = [\n\t\t\tnew Vector3(1, 0, 0), new Vector3(-1, 0, 0), new Vector3(0, 1, 0),\n\t\t\tnew Vector3(0, -1, 0), new Vector3(0, 0, 1), new Vector3(0, 0, -1)\n\t\t];\n\n\t\tthis._ups = [\n\t\t\tnew Vector3(0, -1, 0), new Vector3(0, -1, 0), new Vector3(0, 0, 1),\n\t\t\tnew Vector3(0, 0, -1), new Vector3(0, -1, 0), new Vector3(0, -1, 0)\n\t\t];\n\n\t\tthis._lookTarget = new Vector3();\n\t}\n\n\tupdate(light, face) {\n\t\tthis._updateCamera(light, face);\n\n\t\tif (this.mapSize.x !== this.renderTarget.width || this.mapSize.y !== this.renderTarget.height) {\n\t\t\tthis.renderTarget.resize(this.mapSize.x, this.mapSize.y);\n\t\t}\n\t}\n\n\t_updateCamera(light, face) {\n\t\tconst camera = this.camera;\n\t\tconst lookTarget = this._lookTarget;\n\t\tconst targets = this._targets;\n\t\tconst ups = this._ups;\n\n\t\t// set camera position and lookAt(rotation)\n\t\tcamera.position.setFromMatrixPosition(light.worldMatrix);\n\t\tlookTarget.set(targets[face].x + camera.position.x, targets[face].y + camera.position.y, targets[face].z + camera.position.z);\n\t\tcamera.lookAt(lookTarget, ups[face]);\n\n\t\t// update view matrix\n\t\tcamera.updateMatrix();\n\n\t\t// update projection\n\t\tcamera.setPerspective(90 / 180 * Math.PI, 1, this.cameraNear, this.cameraFar);\n\t}\n\n}\n\nexport { PointLightShadow };"
  },
  {
    "path": "src/scenes/lights/RectAreaLight.js",
    "content": "import { Light } from '../Light.js';\n\n/**\n * RectAreaLight emits light uniformly across the face a rectangular plane.\n * This light can be used to simulate light sources such as bright windows or strip lighting.\n * Important Notes:\n * - There is no shadow support.\n * - Only PBRMaterial are supported.\n * - You have to set LTC1 and LTC2 in RectAreaLight before using it.\n * @extends Light\n */\nclass RectAreaLight extends Light {\n\n\t/**\n\t * @param {number} [color=0xffffff]\n\t * @param {number} [intensity=1]\n\t * @param {number} [width=10]\n\t * @param {number} [height=10]\n\t */\n\tconstructor(color, intensity, width = 10, height = 10) {\n\t\tsuper(color, intensity);\n\n\t\t/**\n\t\t * The width of the light.\n\t\t * @type {number}\n\t\t * @default 10\n\t\t */\n\t\tthis.width = width;\n\n\t\t/**\n\t\t * The height of the light.\n\t\t * @type {number}\n\t\t * @default 10\n\t\t */\n\t\tthis.height = height;\n\t}\n\n\t/**\n\t * The light's power.\n\t * Power is the luminous power of the light measured in lumens (lm).\n\t * Changing the power will also change the light's intensity.\n\t * @type {number}\n\t */\n\tget power() {\n\t\t// compute the light's luminous power (in lumens) from its intensity (in nits)\n\t\treturn this.intensity * this.width * this.height * Math.PI;\n\t}\n\n\tset power(power) {\n\t\t// set the light's intensity (in nits) from the desired luminous power (in lumens)\n\t\tthis.intensity = power / (this.width * this.height * Math.PI);\n\t}\n\n\tcopy(source) {\n\t\tsuper.copy(source);\n\n\t\tthis.width = source.width;\n\t\tthis.height = source.height;\n\n\t\treturn this;\n\t}\n\n}\n\n/**\n * This flag can be used for type testing.\n * @readonly\n * @type {boolean}\n * @default true\n */\nRectAreaLight.prototype.isRectAreaLight = true;\n\n/**\n * The first LTC (Linearly Transformed Cosines).\n * If you want to use RectAreaLight, you have to set this before using it.\n * @type {null | Texture2D}\n */\nRectAreaLight.LTC1 = null;\n\n/**\n * The second LTC (Linearly Transformed Cosines).\n * If you want to use RectAreaLight, you have to set this before using it.\n * @type {null | Texture2D}\n */\nRectAreaLight.LTC2 = null;\n\nexport { RectAreaLight };"
  },
  {
    "path": "src/scenes/lights/SphericalHarmonicsLight.js",
    "content": "import { Light } from '../Light.js';\nimport { SphericalHarmonics3 } from '../../math/SphericalHarmonics3.js';\n\n/**\n * This light globally all objects in the scene equally.\n * This light depends on spherical harmonics.\n * @extends Light\n */\nclass SphericalHarmonicsLight extends Light {\n\n\t/**\n\t * Creates a new SphericalHarmonicsLight.\n\t * @param {SphericalHarmonics3} [sh = new SphericalHarmonics3()]\n\t * @param {number} [intensity = 1]\n\t */\n\tconstructor(sh = new SphericalHarmonics3(), intensity = 1) {\n\t\tsuper(undefined, intensity);\n\n\t\t/**\n\t\t * An instance of SphericalHarmonics3.\n\t\t * @type {SphericalHarmonics3}\n\t\t */\n\t\tthis.sh = sh;\n\t}\n\n\tcopy(source) {\n\t\tsuper.copy(source);\n\n\t\tthis.sh.copy(source.sh);\n\n\t\treturn this;\n\t}\n\n}\n\n/**\n * This flag can be used for type testing.\n * @readonly\n * @type {boolean}\n * @default true\n */\nSphericalHarmonicsLight.prototype.isSphericalHarmonicsLight = true;\n\nexport { SphericalHarmonicsLight };\n"
  },
  {
    "path": "src/scenes/lights/SpotLight.js",
    "content": "import { SpotLightShadow } from './SpotLightShadow.js';\nimport { Light } from '../Light.js';\n\n/**\n * This light gets emitted from a single point in one direction, along a cone that increases in size the further from the light it gets.\n * This light can cast shadows - see the {@link SpotLightShadow} page for details.\n * @extends Light\n */\nclass SpotLight extends Light {\n\n\t/**\n\t * @param {number} [color=0xffffff]\n\t * @param {number} [intensity=1]\n\t * @param {number} [distance=200]\n\t * @param {number} [angle=Math.PI/6]\n\t * @param {number} [penumbra=0]\n\t * @param {number} [decay=1]\n\t */\n\tconstructor(color, intensity, distance, angle, penumbra, decay) {\n\t\tsuper(color, intensity);\n\n\t\t/**\n\t\t * The amount the light dims along the distance of the light.\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.decay = (decay !== undefined) ? decay : 1;\n\n\t\t/**\n\t\t * The distance from the light where the intensity is 0.\n\t\t * @type {number}\n\t\t * @default 200\n\t\t */\n\t\tthis.distance = (distance !== undefined) ? distance : 200;\n\n\t\t/**\n\t\t * Percent of the spotlight cone that is attenuated due to penumbra.\n\t\t * Takes values between zero and 1.\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.penumbra = (penumbra !== undefined) ? penumbra : 0;\n\n\t\t/**\n\t\t * Maximum extent of the spotlight, in radians, from its direction.\n\t\t * Should be no more than Math.PI/2.\n\t\t * @type {number}\n\t\t * @default Math.PI/6\n\t\t */\n\t\tthis.angle = (angle !== undefined) ? angle : Math.PI / 6;\n\n\t\t/**\n\t\t * A {@link SpotLightShadow} used to calculate shadows for this light.\n\t\t * @type {SpotLightShadow}\n\t\t * @default SpotLightShadow()\n\t\t */\n\t\tthis.shadow = new SpotLightShadow();\n\t}\n\n\tcopy(source) {\n\t\tsuper.copy(source);\n\n\t\tthis.shadow.copy(source.shadow);\n\n\t\treturn this;\n\t}\n\n}\n\n/**\n * This flag can be used for type testing.\n * @readonly\n * @type {boolean}\n * @default true\n */\nSpotLight.prototype.isSpotLight = true;\n\nexport { SpotLight };"
  },
  {
    "path": "src/scenes/lights/SpotLightShadow.js",
    "content": "import { LightShadow } from './LightShadow.js';\nimport { TEXTURE_FILTER, PIXEL_FORMAT, PIXEL_TYPE, ATTACHMENT, COMPARE_FUNC } from '../../const.js';\nimport { Texture2D } from '../../resources/textures/Texture2D.js';\nimport { OffscreenRenderTarget } from '../../resources/targets/OffscreenRenderTarget.js';\nimport { RenderBuffer } from '../../resources/RenderBuffer.js';\n\n/**\n * This is used internally by SpotLights for calculating shadows.\n * @extends LightShadow\n */\nclass SpotLightShadow extends LightShadow {\n\n\tconstructor() {\n\t\tsuper();\n\n\t\t/**\n\t\t * Controls the extent to which the shadows fade out at the edge of the frustum.\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.frustumEdgeFalloff = 0.0;\n\n\t\tthis.renderTarget = OffscreenRenderTarget.create2D(this.mapSize.x, this.mapSize.y);\n\n\t\tconst map = this.renderTarget.texture;\n\t\tmap.generateMipmaps = false;\n\t\tmap.minFilter = TEXTURE_FILTER.NEAREST;\n\t\tmap.magFilter = TEXTURE_FILTER.NEAREST;\n\n\t\tconst depthTexture = new Texture2D();\n\t\tdepthTexture.type = PIXEL_TYPE.UNSIGNED_INT;\n\t\tdepthTexture.format = PIXEL_FORMAT.DEPTH_COMPONENT;\n\t\tdepthTexture.magFilter = TEXTURE_FILTER.LINEAR;\n\t\tdepthTexture.minFilter = TEXTURE_FILTER.LINEAR;\n\t\tdepthTexture.compare = COMPARE_FUNC.LESS;\n\t\tdepthTexture.generateMipmaps = false;\n\n\t\tconst depthBuffer = new RenderBuffer(this.mapSize.x, this.mapSize.y, PIXEL_FORMAT.DEPTH_COMPONENT16);\n\n\t\tthis.renderTarget.detach(ATTACHMENT.DEPTH_STENCIL_ATTACHMENT);\n\t\tthis.renderTarget.attach(depthBuffer, ATTACHMENT.DEPTH_ATTACHMENT);\n\n\t\tthis.map = map;\n\t\tthis.depthMap = depthTexture;\n\n\t\tthis._depthBuffer = depthBuffer;\n\t}\n\n\tupdate(light) {\n\t\tthis._updateCamera(light);\n\n\t\tif (this.mapSize.x !== this.renderTarget.width || this.mapSize.y !== this.renderTarget.height) {\n\t\t\tthis.renderTarget.resize(this.mapSize.x, this.mapSize.y);\n\t\t}\n\t}\n\n\t_updateCamera(light) {\n\t\tconst camera = this.camera;\n\n\t\tcamera.matrix.copy(light.worldMatrix);\n\t\tcamera.matrix.decompose(camera.position, camera.quaternion, camera.scale);\n\t\tcamera.updateMatrix();\n\n\t\tcamera.setPerspective(light.angle * 2, 1, this.cameraNear, this.cameraFar);\n\t}\n\n\tcopy(source) {\n\t\tsuper.copy(source);\n\n\t\tthis.frustumEdgeFalloff = source.frustumEdgeFalloff;\n\n\t\treturn this;\n\t}\n\n\tprepareDepthMap(enable, capabilities) {\n\t\tconst useDepthMap = enable && capabilities.version >= 2;\n\t\tconst renderTarget = this.renderTarget;\n\t\tconst attachments = renderTarget._attachments;\n\t\tconst depthMapAttached = attachments[ATTACHMENT.DEPTH_ATTACHMENT] === this.depthMap;\n\n\t\tif (useDepthMap === depthMapAttached) return;\n\n\t\tif (useDepthMap) {\n\t\t\tif (capabilities.getExtension('OES_texture_float_linear')) {\n\t\t\t\tthis.depthMap.type = PIXEL_TYPE.FLOAT;\n\t\t\t}\n\n\t\t\trenderTarget.dispose();\n\t\t\trenderTarget.attach(this.depthMap, ATTACHMENT.DEPTH_ATTACHMENT);\n\t\t} else {\n\t\t\trenderTarget.dispose();\n\t\t\trenderTarget.attach(this._depthBuffer, ATTACHMENT.DEPTH_ATTACHMENT);\n\t\t}\n\t}\n\n}\n\nexport { SpotLightShadow };"
  },
  {
    "path": "src/shaders/ShaderChunk.js",
    "content": "import alphaTest_frag from './shaderChunk/alphaTest_frag.glsl';\nimport alphaTest_pars_frag from './shaderChunk/alphaTest_pars_frag.glsl';\nimport aoMap_pars_frag from './shaderChunk/aoMap_pars_frag.glsl';\nimport aoMap_pars_vert from './shaderChunk/aoMap_pars_vert.glsl';\nimport aoMap_vert from './shaderChunk/aoMap_vert.glsl';\nimport aoMap_frag from './shaderChunk/aoMap_frag.glsl';\nimport begin_frag from './shaderChunk/begin_frag.glsl';\nimport begin_vert from './shaderChunk/begin_vert.glsl';\nimport bsdfs from './shaderChunk/bsdfs.glsl';\nimport bumpMap_pars_frag from './shaderChunk/bumpMap_pars_frag.glsl';\nimport clippingPlanes_frag from './shaderChunk/clippingPlanes_frag.glsl';\nimport clippingPlanes_pars_frag from './shaderChunk/clippingPlanes_pars_frag.glsl';\nimport color_frag from './shaderChunk/color_frag.glsl';\nimport color_pars_frag from './shaderChunk/color_pars_frag.glsl';\nimport color_pars_vert from './shaderChunk/color_pars_vert.glsl';\nimport color_vert from './shaderChunk/color_vert.glsl';\nimport common_frag from './shaderChunk/common_frag.glsl';\nimport common_vert from './shaderChunk/common_vert.glsl';\nimport diffuseMap_frag from './shaderChunk/diffuseMap_frag.glsl';\nimport diffuseMap_pars_frag from './shaderChunk/diffuseMap_pars_frag.glsl';\nimport diffuseMap_vert from './shaderChunk/diffuseMap_vert.glsl';\nimport diffuseMap_pars_vert from './shaderChunk/diffuseMap_pars_vert.glsl';\nimport emissiveMap_frag from './shaderChunk/emissiveMap_frag.glsl';\nimport emissiveMap_pars_frag from './shaderChunk/emissiveMap_pars_frag.glsl';\nimport emissiveMap_vert from './shaderChunk/emissiveMap_vert.glsl';\nimport emissiveMap_pars_vert from './shaderChunk/emissiveMap_pars_vert.glsl';\nimport encodings_frag from './shaderChunk/encodings_frag.glsl';\nimport encodings_pars_frag from './shaderChunk/encodings_pars_frag.glsl';\nimport end_frag from './shaderChunk/end_frag.glsl';\nimport envMap_frag from './shaderChunk/envMap_frag.glsl';\nimport envMap_pars_frag from './shaderChunk/envMap_pars_frag.glsl';\nimport envMap_pars_vert from './shaderChunk/envMap_pars_vert.glsl';\nimport envMap_vert from './shaderChunk/envMap_vert.glsl';\nimport fog_frag from './shaderChunk/fog_frag.glsl';\nimport fog_pars_frag from './shaderChunk/fog_pars_frag.glsl';\nimport inverse from './shaderChunk/inverse.glsl';\nimport light_frag from './shaderChunk/light_frag.glsl';\nimport light_pars_frag from './shaderChunk/light_pars_frag.glsl';\nimport alphamap_pars_frag from './shaderChunk/alphamap_pars_frag.glsl';\nimport alphamap_frag from './shaderChunk/alphamap_frag.glsl';\nimport alphamap_pars_vert from './shaderChunk/alphamap_pars_vert.glsl';\nimport alphamap_vert from './shaderChunk/alphamap_vert.glsl';\nimport normalMap_pars_frag from './shaderChunk/normalMap_pars_frag.glsl';\nimport normal_frag from './shaderChunk/normal_frag.glsl';\nimport normal_pars_frag from './shaderChunk/normal_pars_frag.glsl';\nimport normal_pars_vert from './shaderChunk/normal_pars_vert.glsl';\nimport normal_vert from './shaderChunk/normal_vert.glsl';\nimport packing from './shaderChunk/packing.glsl';\nimport premultipliedAlpha_frag from './shaderChunk/premultipliedAlpha_frag.glsl';\nimport pvm_vert from './shaderChunk/pvm_vert.glsl';\nimport dithering_frag from './shaderChunk/dithering_frag.glsl';\nimport dithering_pars_frag from './shaderChunk/dithering_pars_frag.glsl';\nimport shadow from './shaderChunk/shadow.glsl';\nimport shadowMap_frag from './shaderChunk/shadowMap_frag.glsl';\nimport shadowMap_pars_frag from './shaderChunk/shadowMap_pars_frag.glsl';\nimport shadowMap_pars_vert from './shaderChunk/shadowMap_pars_vert.glsl';\nimport shadowMap_vert from './shaderChunk/shadowMap_vert.glsl';\nimport morphnormal_vert from './shaderChunk/morphnormal_vert.glsl';\nimport morphtarget_pars_vert from './shaderChunk/morphtarget_pars_vert.glsl';\nimport morphtarget_vert from './shaderChunk/morphtarget_vert.glsl';\nimport skinning_pars_vert from './shaderChunk/skinning_pars_vert.glsl';\nimport skinning_vert from './shaderChunk/skinning_vert.glsl';\nimport skinnormal_vert from './shaderChunk/skinnormal_vert.glsl';\nimport specularMap_frag from './shaderChunk/specularMap_frag.glsl';\nimport specularMap_pars_frag from './shaderChunk/specularMap_pars_frag.glsl';\nimport transpose from './shaderChunk/transpose.glsl';\nimport tsn from './shaderChunk/tsn.glsl';\nimport uv_pars_frag from './shaderChunk/uv_pars_frag.glsl';\nimport uv_pars_vert from './shaderChunk/uv_pars_vert.glsl';\nimport uv_vert from './shaderChunk/uv_vert.glsl';\nimport modelPos_pars_frag from './shaderChunk/modelPos_pars_frag.glsl';\nimport modelPos_pars_vert from './shaderChunk/modelPos_pars_vert.glsl';\nimport modelPos_vert from './shaderChunk/modelPos_vert.glsl';\nimport logdepthbuf_frag from './shaderChunk/logdepthbuf_frag.glsl';\nimport logdepthbuf_pars_frag from './shaderChunk/logdepthbuf_pars_frag.glsl';\nimport logdepthbuf_pars_vert from './shaderChunk/logdepthbuf_pars_vert.glsl';\nimport logdepthbuf_vert from './shaderChunk/logdepthbuf_vert.glsl';\nimport clearcoat_pars_frag from './shaderChunk/clearcoat_pars_frag.glsl';\n\nexport const ShaderChunk = {\n\talphaTest_frag: alphaTest_frag,\n\talphaTest_pars_frag: alphaTest_pars_frag,\n\taoMap_pars_frag: aoMap_pars_frag,\n\taoMap_pars_vert: aoMap_pars_vert,\n\taoMap_vert: aoMap_vert,\n\taoMap_frag: aoMap_frag,\n\tbegin_frag: begin_frag,\n\tbegin_vert: begin_vert,\n\tbsdfs: bsdfs,\n\tbumpMap_pars_frag: bumpMap_pars_frag,\n\tclippingPlanes_frag: clippingPlanes_frag,\n\tclippingPlanes_pars_frag: clippingPlanes_pars_frag,\n\tcolor_frag: color_frag,\n\tcolor_pars_frag: color_pars_frag,\n\tcolor_pars_vert: color_pars_vert,\n\tcolor_vert: color_vert,\n\tcommon_frag: common_frag,\n\tcommon_vert: common_vert,\n\tdiffuseMap_frag: diffuseMap_frag,\n\tdiffuseMap_pars_frag: diffuseMap_pars_frag,\n\tdiffuseMap_vert: diffuseMap_vert,\n\tdiffuseMap_pars_vert: diffuseMap_pars_vert,\n\temissiveMap_frag: emissiveMap_frag,\n\temissiveMap_pars_frag: emissiveMap_pars_frag,\n\temissiveMap_vert: emissiveMap_vert,\n\temissiveMap_pars_vert: emissiveMap_pars_vert,\n\tencodings_frag: encodings_frag,\n\tencodings_pars_frag: encodings_pars_frag,\n\tend_frag: end_frag,\n\tenvMap_frag: envMap_frag,\n\tenvMap_pars_frag: envMap_pars_frag,\n\tenvMap_pars_vert: envMap_pars_vert,\n\tenvMap_vert: envMap_vert,\n\tfog_frag: fog_frag,\n\tfog_pars_frag: fog_pars_frag,\n\tinverse: inverse,\n\tlight_frag: light_frag,\n\tlight_pars_frag: light_pars_frag,\n\talphamap_pars_frag: alphamap_pars_frag,\n\talphamap_frag: alphamap_frag,\n\talphamap_pars_vert: alphamap_pars_vert,\n\talphamap_vert: alphamap_vert,\n\tnormalMap_pars_frag: normalMap_pars_frag,\n\tnormal_frag: normal_frag,\n\tnormal_pars_frag: normal_pars_frag,\n\tnormal_pars_vert: normal_pars_vert,\n\tnormal_vert: normal_vert,\n\tpacking: packing,\n\tpremultipliedAlpha_frag: premultipliedAlpha_frag,\n\tpvm_vert: pvm_vert,\n\tdithering_frag: dithering_frag,\n\tdithering_pars_frag: dithering_pars_frag,\n\tshadow: shadow,\n\tshadowMap_frag: shadowMap_frag,\n\tshadowMap_pars_frag: shadowMap_pars_frag,\n\tshadowMap_pars_vert: shadowMap_pars_vert,\n\tshadowMap_vert: shadowMap_vert,\n\tmorphnormal_vert: morphnormal_vert,\n\tmorphtarget_pars_vert: morphtarget_pars_vert,\n\tmorphtarget_vert: morphtarget_vert,\n\tskinning_pars_vert: skinning_pars_vert,\n\tskinning_vert: skinning_vert,\n\tskinnormal_vert: skinnormal_vert,\n\tspecularMap_frag: specularMap_frag,\n\tspecularMap_pars_frag: specularMap_pars_frag,\n\ttranspose: transpose,\n\ttsn: tsn,\n\tuv_pars_frag: uv_pars_frag,\n\tuv_pars_vert: uv_pars_vert,\n\tuv_vert: uv_vert,\n\tmodelPos_pars_frag: modelPos_pars_frag,\n\tmodelPos_pars_vert: modelPos_pars_vert,\n\tmodelPos_vert: modelPos_vert,\n\tlogdepthbuf_frag: logdepthbuf_frag,\n\tlogdepthbuf_pars_frag: logdepthbuf_pars_frag,\n\tlogdepthbuf_pars_vert: logdepthbuf_pars_vert,\n\tlogdepthbuf_vert: logdepthbuf_vert,\n\tclearcoat_pars_frag: clearcoat_pars_frag\n};\n"
  },
  {
    "path": "src/shaders/ShaderLib.js",
    "content": "import basic_frag from './shaderLib/basic_frag.glsl';\nimport basic_vert from './shaderLib/basic_vert.glsl';\nimport depth_frag from './shaderLib/depth_frag.glsl';\nimport depth_vert from './shaderLib/depth_vert.glsl';\nimport distance_frag from './shaderLib/distance_frag.glsl';\nimport distance_vert from './shaderLib/distance_vert.glsl';\nimport lambert_frag from './shaderLib/lambert_frag.glsl';\nimport lambert_vert from './shaderLib/lambert_vert.glsl';\nimport normaldepth_frag from './shaderLib/normaldepth_frag.glsl';\nimport normaldepth_vert from './shaderLib/normaldepth_vert.glsl';\nimport pbr_frag from './shaderLib/pbr_frag.glsl';\nimport pbr2_frag from './shaderLib/pbr2_frag.glsl';\nimport pbr_vert from './shaderLib/pbr_vert.glsl';\nimport phong_frag from './shaderLib/phong_frag.glsl';\nimport phong_vert from './shaderLib/phong_vert.glsl';\nimport point_frag from './shaderLib/point_frag.glsl';\nimport point_vert from './shaderLib/point_vert.glsl';\n\nexport const ShaderLib = {\n\tbasic_frag: basic_frag,\n\tbasic_vert: basic_vert,\n\tdepth_frag: depth_frag,\n\tdepth_vert: depth_vert,\n\tdistance_frag: distance_frag,\n\tdistance_vert: distance_vert,\n\tlambert_frag: lambert_frag,\n\tlambert_vert: lambert_vert,\n\tnormaldepth_frag: normaldepth_frag,\n\tnormaldepth_vert: normaldepth_vert,\n\tpbr_frag: pbr_frag,\n\tpbr_vert: pbr_vert,\n\tpbr2_frag: pbr2_frag,\n\tpbr2_vert: pbr_vert,\n\tphong_frag: phong_frag,\n\tphong_vert: phong_vert,\n\tpoint_frag: point_frag,\n\tpoint_vert: point_vert\n};"
  },
  {
    "path": "src/shaders/shaderChunk/alphaTest_frag.glsl",
    "content": "#ifdef ALPHATEST\n\tif (outColor.a < u_AlphaTest) discard;\n\n\t// prevent alpha test edge gradient\n\toutColor.a = u_Opacity;\n#endif"
  },
  {
    "path": "src/shaders/shaderChunk/alphaTest_pars_frag.glsl",
    "content": "#ifdef ALPHATEST\n\tuniform float u_AlphaTest;\n#endif"
  },
  {
    "path": "src/shaders/shaderChunk/alphamap_frag.glsl",
    "content": "#ifdef USE_ALPHA_MAP\n\toutColor.a *= texture2D(alphaMap, vAlphaMapUV).g;\n#endif"
  },
  {
    "path": "src/shaders/shaderChunk/alphamap_pars_frag.glsl",
    "content": "#ifdef USE_ALPHA_MAP\n\tuniform sampler2D alphaMap;\n\tvarying vec2 vAlphaMapUV;\n#endif"
  },
  {
    "path": "src/shaders/shaderChunk/alphamap_pars_vert.glsl",
    "content": "#ifdef USE_ALPHA_MAP\n    uniform mat3 alphaMapUVTransform;\n\tvarying vec2 vAlphaMapUV;\n#endif"
  },
  {
    "path": "src/shaders/shaderChunk/alphamap_vert.glsl",
    "content": "#ifdef USE_ALPHA_MAP\n\tvAlphaMapUV = (alphaMapUVTransform * vec3(ALPHAMAP_UV, 1.)).xy;\n#endif"
  },
  {
    "path": "src/shaders/shaderChunk/aoMap_frag.glsl",
    "content": "// Use V, roughness from light_frag\n// Use N from normal_frag\n\n#ifdef USE_AOMAP\n    // reads channel R, compatible with a combined OcclusionRoughnessMetallic (RGB) texture\n    float ambientOcclusion = (texture2D(aoMap, vAOMapUV).r - 1.0) * aoMapIntensity + 1.0;\n    \n    reflectedLight.indirectDiffuse *= ambientOcclusion;\n\n    #if defined(USE_ENV_MAP) && defined(USE_PBR)\n        float dotNV = saturate(dot(N, V));\n        reflectedLight.indirectSpecular *= computeSpecularOcclusion(dotNV, ambientOcclusion, roughness);\n    #endif\n#endif"
  },
  {
    "path": "src/shaders/shaderChunk/aoMap_pars_frag.glsl",
    "content": "#ifdef USE_AOMAP\n\tuniform sampler2D aoMap;\n\tuniform float aoMapIntensity;\n\tvarying vec2 vAOMapUV;\n#endif"
  },
  {
    "path": "src/shaders/shaderChunk/aoMap_pars_vert.glsl",
    "content": "#ifdef USE_AOMAP\n\tuniform mat3 aoMapUVTransform;\n\tvarying vec2 vAOMapUV;\n#endif"
  },
  {
    "path": "src/shaders/shaderChunk/aoMap_vert.glsl",
    "content": "#ifdef USE_AOMAP\n\tvAOMapUV = (aoMapUVTransform * vec3(AOMAP_UV, 1.)).xy;\n#endif"
  },
  {
    "path": "src/shaders/shaderChunk/begin_frag.glsl",
    "content": "vec4 outColor = vec4(u_Color, u_Opacity);"
  },
  {
    "path": "src/shaders/shaderChunk/begin_vert.glsl",
    "content": "vec3 transformed = vec3(a_Position);\nvec3 objectNormal = vec3(a_Normal);\n#ifdef USE_TANGENT\n    vec3 objectTangent = vec3(a_Tangent.xyz);\n#endif"
  },
  {
    "path": "src/shaders/shaderChunk/bsdfs.glsl",
    "content": "// About Cook-Torrance microfacet model, referenced to: https://en.wikipedia.org/wiki/Specular_highlight#Cook–Torrance_model\n\nvec3 BRDF_Diffuse_Lambert(vec3 diffuseColor) {\n    return RECIPROCAL_PI * diffuseColor;\n}\n\nvec3 F_Schlick(const in vec3 specularColor, const in float dotLH) {\n\t// Original approximation by Christophe Schlick '94\n\t// float fresnel = pow( 1.0 - dotLH, 5.0 );\n\n\t// Optimized variant (presented by Epic at SIGGRAPH '13)\n\t// https://cdn2.unrealengine.com/Resources/files/2013SiggraphPresentationsNotes-26915738.pdf\n\tfloat fresnel = exp2((-5.55473 * dotLH - 6.98316) * dotLH);\n\n\treturn (1.0 - specularColor) * fresnel + specularColor;\n}\n\nfloat D_BlinnPhong(const in float shininess, const in float dotNH) {\n    // normalized Blinn-Phong\n\treturn RECIPROCAL_PI * (shininess * 0.5 + 1.0) * pow(dotNH, shininess);\n}\n\nfloat G_BlinnPhong_Implicit(/* const in float dotNL, const in float dotNV */) {\n\t// geometry term is (n dot l)(n dot v) / 4(n dot l)(n dot v)\n\treturn 0.25;\n}\n\nvec3 BRDF_Specular_BlinnPhong(vec3 specularColor, vec3 N, vec3 L, vec3 V, float shininess) {\n    vec3 H = normalize(L + V);\n\n    float dotNH = saturate(dot(N, H));\n    float dotLH = saturate(dot(L, H));\n\n    vec3 F = F_Schlick(specularColor, dotLH);\n\n    float G = G_BlinnPhong_Implicit(/* dotNL, dotNV */);\n\n    float D = D_BlinnPhong(shininess, dotNH);\n\n    return F * G * D;\n}\n\n// Microfacet Models for Refraction through Rough Surfaces - equation (33)\n// http://graphicrants.blogspot.com/2013/08/specular-brdf-reference.html\n// alpha is \"roughness squared\" in Disney’s reparameterization\nfloat D_GGX(const in float alpha, const in float dotNH) {\n\tfloat a2 = pow2(alpha);\n\tfloat denom = pow2(dotNH) * (a2 - 1.0) + 1.0; // avoid alpha = 0 with dotNH = 1\n\treturn RECIPROCAL_PI * a2 / pow2(denom);\n}\n\n// Moving Frostbite to Physically Based Rendering 3.0 - page 12, listing 2\n// https://seblagarde.files.wordpress.com/2015/07/course_notes_moving_frostbite_to_pbr_v32.pdf\nfloat G_GGX_SmithCorrelated(const in float alpha, const in float dotNL, const in float dotNV) {\n\tfloat a2 = pow2(alpha);\n\n\t// dotNL and dotNV are explicitly swapped. This is not a mistake.\n\tfloat gv = dotNL * sqrt(a2 + (1.0 - a2) * pow2(dotNV));\n\tfloat gl = dotNV * sqrt(a2 + (1.0 - a2) * pow2(dotNL));\n\n\treturn 0.5 / max(gv + gl, EPSILON);\n}\n\n// GGX Distribution, Schlick Fresnel, GGX-Smith Visibility\nvec3 BRDF_Specular_GGX(vec3 specularColor, vec3 N, vec3 L, vec3 V, float roughness) {\n\tfloat alpha = pow2(roughness); // UE4's roughness\n\n\tvec3 H = normalize(L + V);\n\n\tfloat dotNL = saturate(dot(N, L));\n\tfloat dotNV = saturate(dot(N, V));\n\tfloat dotNH = saturate(dot(N, H));\n\tfloat dotLH = saturate(dot(L, H));\n\n\tvec3 F = F_Schlick(specularColor, dotLH);\n\n\tfloat G = G_GGX_SmithCorrelated(alpha, dotNL, dotNV);\n\n\tfloat D = D_GGX(alpha, dotNH);\n\n\treturn F * G * D;\n}\n\n// Analytical approximation of the DFG LUT, one half of the\n// split-sum approximation used in indirect specular lighting.\n// via 'environmentBRDF' from \"Physically Based Shading on Mobile\"\n// https://www.unrealengine.com/blog/physically-based-shading-on-mobile - environmentBRDF for GGX on mobile\nvec2 integrateSpecularBRDF(const in float dotNV, const in float roughness) {\n\tconst vec4 c0 = vec4(-1, -0.0275, -0.572, 0.022);\n\n\tconst vec4 c1 = vec4(1, 0.0425, 1.04, -0.04);\n\n\tvec4 r = roughness * c0 + c1;\n\n\tfloat a004 = min(r.x * r.x, exp2(-9.28 * dotNV)) * r.x + r.y;\n\n\treturn vec2(-1.04, 1.04) * a004 + r.zw;\n}\n\nvec3 F_Schlick_RoughnessDependent(const in vec3 F0, const in float dotNV, const in float roughness) {\n\t// See F_Schlick\n\tfloat fresnel = exp2((-5.55473 * dotNV - 6.98316) * dotNV);\n\tvec3 Fr = max(vec3(1.0 - roughness), F0) - F0;\n\n\treturn Fr * fresnel + F0;\n}\n\n// ref: https://www.unrealengine.com/blog/physically-based-shading-on-mobile - environmentBRDF for GGX on mobile\nvec3 BRDF_Specular_GGX_Environment(const in vec3 N, const in vec3 V, const in vec3 specularColor, const in float roughness) {\n\tfloat dotNV = saturate(dot(N, V));\n\tvec2 brdf = integrateSpecularBRDF(dotNV, roughness);\n\treturn specularColor * brdf.x + brdf.y;\n}\n\n// Fdez-Agüera's \"Multiple-Scattering Microfacet Model for Real-Time Image Based Lighting\"\n// Approximates multiscattering in order to preserve energy.\n// http://www.jcgt.org/published/0008/01/03/\nvoid BRDF_Specular_Multiscattering_Environment(const in vec3 N, const in vec3 V, const in vec3 specularColor, const in float roughness, inout vec3 singleScatter, inout vec3 multiScatter) {\n\tfloat dotNV = saturate(dot(N, V));\n\n\tvec3 F = F_Schlick_RoughnessDependent(specularColor, dotNV, roughness);\n\tvec2 brdf = integrateSpecularBRDF(dotNV, roughness);\n\tvec3 FssEss = F * brdf.x + brdf.y;\n\n\tfloat Ess = brdf.x + brdf.y;\n\tfloat Ems = 1.0 - Ess;\n\n\tvec3 Favg = specularColor + (1.0 - specularColor) * 0.047619; // 1/21\n\tvec3 Fms = FssEss * Favg / (1.0 - Ems * Favg);\n\n\tsingleScatter += FssEss;\n\tmultiScatter += Fms * Ems;\n}"
  },
  {
    "path": "src/shaders/shaderChunk/bumpMap_pars_frag.glsl",
    "content": "#ifdef USE_BUMPMAP\n\n\tuniform sampler2D bumpMap;\n\tuniform float bumpScale;\n\n\t// Derivative maps - bump mapping unparametrized surfaces by Morten Mikkelsen\n\t// http://mmikkelsen3d.blogspot.sk/2011/07/derivative-maps.html\n\n\t// Evaluate the derivative of the height w.r.t. screen-space using forward differencing (listing 2)\n\n\tvec2 dHdxy_fwd(vec2 uv) {\n\n\t\tvec2 dSTdx = dFdx( uv );\n\t\tvec2 dSTdy = dFdy( uv );\n\n\t\tfloat Hll = bumpScale * texture2D( bumpMap, uv ).x;\n\t\tfloat dBx = bumpScale * texture2D( bumpMap, uv + dSTdx ).x - Hll;\n\t\tfloat dBy = bumpScale * texture2D( bumpMap, uv + dSTdy ).x - Hll;\n\n\t\treturn vec2( dBx, dBy );\n\n\t}\n\n\tvec3 perturbNormalArb( vec3 surf_pos, vec3 surf_norm, vec2 dHdxy) {\n\n\t\tvec3 vSigmaX = vec3( dFdx( surf_pos.x ), dFdx( surf_pos.y ), dFdx( surf_pos.z ) );\n\t\tvec3 vSigmaY = vec3( dFdy( surf_pos.x ), dFdy( surf_pos.y ), dFdy( surf_pos.z ) );\n\t\tvec3 vN = surf_norm;\t\t// normalized\n\n\t\tvec3 R1 = cross( vSigmaY, vN );\n\t\tvec3 R2 = cross( vN, vSigmaX );\n\n\t\tfloat fDet = dot( vSigmaX, R1 );\n\n\t\tfDet *= ( float( gl_FrontFacing ) * 2.0 - 1.0 );\n\n\t\tvec3 vGrad = sign( fDet ) * ( dHdxy.x * R1 + dHdxy.y * R2 );\n\t\treturn normalize( abs( fDet ) * surf_norm - vGrad );\n\n\t}\n\n#endif\n"
  },
  {
    "path": "src/shaders/shaderChunk/clearcoat_pars_frag.glsl",
    "content": "#ifdef USE_CLEARCOAT\n\tuniform float u_Clearcoat;\n\tuniform float u_ClearcoatRoughness;\n#endif\n\n#ifdef USE_CLEARCOATMAP\n\tuniform sampler2D clearcoatMap;\n#endif\n\n#ifdef USE_CLEARCOAT_ROUGHNESSMAP\n\tuniform sampler2D clearcoatRoughnessMap;\n#endif\n\n#ifdef USE_CLEARCOAT_NORMALMAP\n\tuniform sampler2D clearcoatNormalMap;\n\tuniform vec2 clearcoatNormalScale;\n#endif"
  },
  {
    "path": "src/shaders/shaderChunk/clippingPlanes_frag.glsl",
    "content": "// Use v_modelPos from modelPos_pars_frag\n\n#if NUM_CLIPPING_PLANES > 0\n\n    vec4 plane;\n\n    #pragma unroll_loop_start\n    for (int i = 0; i < NUM_CLIPPING_PLANES; i++) {\n\n        plane = clippingPlanes[i];\n        if ( dot( -v_modelPos, plane.xyz ) > plane.w ) discard;\n\n    }\n    #pragma unroll_loop_end\n\n#endif"
  },
  {
    "path": "src/shaders/shaderChunk/clippingPlanes_pars_frag.glsl",
    "content": "#if NUM_CLIPPING_PLANES > 0\n    uniform vec4 clippingPlanes[ NUM_CLIPPING_PLANES ];\n#endif"
  },
  {
    "path": "src/shaders/shaderChunk/color_frag.glsl",
    "content": "#ifdef USE_VCOLOR_RGB\n    outColor.rgb *= v_Color;\n#endif\n#ifdef USE_VCOLOR_RGBA\n    outColor *= v_Color;\n#endif"
  },
  {
    "path": "src/shaders/shaderChunk/color_pars_frag.glsl",
    "content": "#ifdef USE_VCOLOR_RGB\n    varying vec3 v_Color;\n#endif\n#ifdef USE_VCOLOR_RGBA\n    varying vec4 v_Color;\n#endif"
  },
  {
    "path": "src/shaders/shaderChunk/color_pars_vert.glsl",
    "content": "#ifdef USE_VCOLOR_RGB\n    attribute vec3 a_Color;\n    varying vec3 v_Color;\n#endif\n#ifdef USE_VCOLOR_RGBA\n    attribute vec4 a_Color;\n    varying vec4 v_Color;\n#endif"
  },
  {
    "path": "src/shaders/shaderChunk/color_vert.glsl",
    "content": "#if defined(USE_VCOLOR_RGB) || defined(USE_VCOLOR_RGBA)\n    v_Color = a_Color;\n#endif"
  },
  {
    "path": "src/shaders/shaderChunk/common_frag.glsl",
    "content": "uniform mat4 u_View;\n\nuniform float u_Opacity;\nuniform vec3 u_Color;\n\nuniform vec3 u_CameraPosition;\n\nbool isPerspectiveMatrix( mat4 m ) {\n\n\treturn m[ 2 ][ 3 ] == - 1.0;\n\n}\n\nstruct ReflectedLight {\n\tvec3 directDiffuse;\n\tvec3 directSpecular;\n\tvec3 indirectDiffuse;\n\tvec3 indirectSpecular;\n};"
  },
  {
    "path": "src/shaders/shaderChunk/common_vert.glsl",
    "content": "attribute vec3 a_Position;\nattribute vec3 a_Normal;\n#ifdef USE_TANGENT\n\tattribute vec4 a_Tangent;\n#endif\n\n#include <transpose>\n#include <inverse>\n\nuniform mat4 u_Projection;\nuniform mat4 u_View;\nuniform mat4 u_Model;\nuniform mat4 u_ProjectionView;\n\nuniform vec3 u_CameraPosition;\n\n#define EPSILON 1e-6\n\n#ifdef USE_MORPHTARGETS\n\n    attribute vec3 morphTarget0;\n    attribute vec3 morphTarget1;\n    attribute vec3 morphTarget2;\n    attribute vec3 morphTarget3;\n\n    #ifdef USE_MORPHNORMALS\n\n    \tattribute vec3 morphNormal0;\n    \tattribute vec3 morphNormal1;\n    \tattribute vec3 morphNormal2;\n    \tattribute vec3 morphNormal3;\n\n    #else\n\n    \tattribute vec3 morphTarget4;\n    \tattribute vec3 morphTarget5;\n    \tattribute vec3 morphTarget6;\n    \tattribute vec3 morphTarget7;\n\n    #endif\n\n#endif\n\nbool isPerspectiveMatrix( mat4 m ) {\n\n\treturn m[ 2 ][ 3 ] == - 1.0;\n\n}"
  },
  {
    "path": "src/shaders/shaderChunk/diffuseMap_frag.glsl",
    "content": "#ifdef USE_DIFFUSE_MAP\n    outColor *= mapTexelToLinear(texture2D(diffuseMap, vDiffuseMapUV));\n#endif"
  },
  {
    "path": "src/shaders/shaderChunk/diffuseMap_pars_frag.glsl",
    "content": "#ifdef USE_DIFFUSE_MAP\n    uniform sampler2D diffuseMap;\n    varying vec2 vDiffuseMapUV;\n#endif"
  },
  {
    "path": "src/shaders/shaderChunk/diffuseMap_pars_vert.glsl",
    "content": "#ifdef USE_DIFFUSE_MAP\n    varying vec2 vDiffuseMapUV;\n#endif"
  },
  {
    "path": "src/shaders/shaderChunk/diffuseMap_vert.glsl",
    "content": "#ifdef USE_DIFFUSE_MAP\n    vDiffuseMapUV = (uvTransform * vec3(DIFFUSEMAP_UV, 1.)).xy;\n#endif"
  },
  {
    "path": "src/shaders/shaderChunk/dithering_frag.glsl",
    "content": "#if defined( DITHERING )\n\n\tgl_FragColor.rgb = dithering( gl_FragColor.rgb );\n\n#endif"
  },
  {
    "path": "src/shaders/shaderChunk/dithering_pars_frag.glsl",
    "content": "#if defined( DITHERING )\n\n\t// based on http://loopit.dk/banding_in_games.pdf\n\tvec3 dithering( vec3 color ) {\n\t\t//Calculate grid position\n\t\tfloat grid_position = rand( gl_FragCoord.xy );\n\n\t\t//Shift the individual colors differently, thus making it even harder to see the dithering pattern\n\t\tvec3 dither_shift_RGB = vec3( 0.25 / 255.0, -0.25 / 255.0, 0.25 / 255.0 );\n\n\t\t//modify shift acording to grid position.\n\t\tdither_shift_RGB = mix( 2.0 * dither_shift_RGB, -2.0 * dither_shift_RGB, grid_position );\n\n\t\t//shift the color by dither_shift\n\t\treturn color + dither_shift_RGB;\n\t}\n\n#endif"
  },
  {
    "path": "src/shaders/shaderChunk/emissiveMap_frag.glsl",
    "content": "#ifdef USE_EMISSIVEMAP\n\tvec4 emissiveColor = emissiveMapTexelToLinear(texture2D(emissiveMap, vEmissiveMapUV));\n\ttotalEmissiveRadiance *= emissiveColor.rgb;\n#endif"
  },
  {
    "path": "src/shaders/shaderChunk/emissiveMap_pars_frag.glsl",
    "content": "#ifdef USE_EMISSIVEMAP\n\tuniform sampler2D emissiveMap;\n\tvarying vec2 vEmissiveMapUV;\n#endif"
  },
  {
    "path": "src/shaders/shaderChunk/emissiveMap_pars_vert.glsl",
    "content": "#ifdef USE_EMISSIVEMAP\n\tuniform mat3 emissiveMapUVTransform;\n\tvarying vec2 vEmissiveMapUV;\n#endif"
  },
  {
    "path": "src/shaders/shaderChunk/emissiveMap_vert.glsl",
    "content": "#ifdef USE_EMISSIVEMAP\n\tvEmissiveMapUV = (emissiveMapUVTransform * vec3(EMISSIVEMAP_UV, 1.)).xy;\n#endif"
  },
  {
    "path": "src/shaders/shaderChunk/encodings_frag.glsl",
    "content": "gl_FragColor = linearToOutputTexel(gl_FragColor);"
  },
  {
    "path": "src/shaders/shaderChunk/encodings_pars_frag.glsl",
    "content": "vec4 LinearToLinear(in vec4 value) {\n\treturn value;\n}\n\nvec4 GammaToLinear(in vec4 value, in float gammaFactor) {\n\treturn vec4(pow(value.xyz, vec3(gammaFactor)), value.w);\n}\n\nvec4 LinearToGamma(in vec4 value, in float gammaFactor) {\n\treturn vec4(pow(value.xyz, vec3(1.0 / gammaFactor)), value.w);\n}\n\nvec4 sRGBToLinear(in vec4 value) {\n\treturn vec4(mix(pow(value.rgb * 0.9478672986 + vec3(0.0521327014), vec3(2.4)), value.rgb * 0.0773993808, vec3(lessThanEqual(value.rgb, vec3(0.04045)))), value.w);\n}\n\nvec4 LinearTosRGB(in vec4 value) {\n\treturn vec4(mix(pow(value.rgb, vec3(0.41666)) * 1.055 - vec3(0.055), value.rgb * 12.92, vec3(lessThanEqual(value.rgb, vec3(0.0031308)))), value.w);\n}"
  },
  {
    "path": "src/shaders/shaderChunk/end_frag.glsl",
    "content": "gl_FragColor = outColor;"
  },
  {
    "path": "src/shaders/shaderChunk/envMap_frag.glsl",
    "content": "#ifdef USE_ENV_MAP\n    vec3 envDir;\n    #ifdef USE_VERTEX_ENVDIR\n        envDir = v_EnvDir;\n    #else\n        // Use v_modelPos from modelPos_pars_frag\n        // Use N from normal_frag\n        envDir = reflect(normalize(v_modelPos - u_CameraPosition), N);\n    #endif\n\n    vec4 envColor = textureCube(envMap, vec3(envMapParams.z * envDir.x, envDir.yz));\n\n    envColor = envMapTexelToLinear( envColor );\n\n    #ifdef ENVMAP_BLENDING_MULTIPLY\n\t\toutColor = mix(outColor, envColor * outColor, envMapParams.y);\n\t#elif defined( ENVMAP_BLENDING_MIX )\n\t\toutColor = mix(outColor, envColor, envMapParams.y);\n\t#elif defined( ENVMAP_BLENDING_ADD )\n\t\toutColor += envColor * envMapParams.y;\n\t#endif\n#endif"
  },
  {
    "path": "src/shaders/shaderChunk/envMap_pars_frag.glsl",
    "content": "#ifdef USE_ENV_MAP\n    #ifdef USE_VERTEX_ENVDIR\n        varying vec3 v_EnvDir;\n    #endif\n\n    uniform samplerCube envMap;\n    uniform vec3 envMapParams;\n    uniform int maxMipLevel;\n#endif"
  },
  {
    "path": "src/shaders/shaderChunk/envMap_pars_vert.glsl",
    "content": "#ifdef USE_ENV_MAP\n    #ifdef USE_VERTEX_ENVDIR\n        varying vec3 v_EnvDir;\n    #endif\n#endif"
  },
  {
    "path": "src/shaders/shaderChunk/envMap_vert.glsl",
    "content": "// Use worldPosition from pvm_vert\n\n#ifdef USE_ENV_MAP\n    #ifdef USE_VERTEX_ENVDIR\n        vec3 transformedNormal = (transposeMat4(inverseMat4(u_Model)) * vec4(objectNormal, 0.0)).xyz;\n        transformedNormal = normalize(transformedNormal);\n        v_EnvDir = reflect(normalize(worldPosition.xyz - u_CameraPosition), transformedNormal);\n    #endif\n#endif"
  },
  {
    "path": "src/shaders/shaderChunk/fog_frag.glsl",
    "content": "#ifdef USE_FOG\n    float depth = gl_FragCoord.z / gl_FragCoord.w;\n\n    #ifdef USE_EXP2_FOG\n        float fogFactor = 1.0 - exp(-u_FogDensity * u_FogDensity * depth * depth);\n    #else\n        float fogFactor = smoothstep(u_FogNear, u_FogFar, depth);\n    #endif\n\n    gl_FragColor.rgb = mix(gl_FragColor.rgb, u_FogColor, fogFactor);\n#endif"
  },
  {
    "path": "src/shaders/shaderChunk/fog_pars_frag.glsl",
    "content": "#ifdef USE_FOG\n\n    uniform vec3 u_FogColor;\n\n    #ifdef USE_EXP2_FOG\n\n        uniform float u_FogDensity;\n\n    #else\n\n        uniform float u_FogNear;\n        uniform float u_FogFar;\n    #endif\n\n#endif"
  },
  {
    "path": "src/shaders/shaderChunk/inverse.glsl",
    "content": "mat4 inverseMat4(mat4 m) {\n    float\n    a00 = m[0][0], a01 = m[0][1], a02 = m[0][2], a03 = m[0][3],\n    a10 = m[1][0], a11 = m[1][1], a12 = m[1][2], a13 = m[1][3],\n    a20 = m[2][0], a21 = m[2][1], a22 = m[2][2], a23 = m[2][3],\n    a30 = m[3][0], a31 = m[3][1], a32 = m[3][2], a33 = m[3][3],\n    b00 = a00 * a11 - a01 * a10,\n    b01 = a00 * a12 - a02 * a10,\n    b02 = a00 * a13 - a03 * a10,\n    b03 = a01 * a12 - a02 * a11,\n    b04 = a01 * a13 - a03 * a11,\n    b05 = a02 * a13 - a03 * a12,\n    b06 = a20 * a31 - a21 * a30,\n    b07 = a20 * a32 - a22 * a30,\n    b08 = a20 * a33 - a23 * a30,\n    b09 = a21 * a32 - a22 * a31,\n    b10 = a21 * a33 - a23 * a31,\n    b11 = a22 * a33 - a23 * a32,\n    det = b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06;\n    return mat4(\n        a11 * b11 - a12 * b10 + a13 * b09,\n        a02 * b10 - a01 * b11 - a03 * b09,\n        a31 * b05 - a32 * b04 + a33 * b03,\n        a22 * b04 - a21 * b05 - a23 * b03,\n        a12 * b08 - a10 * b11 - a13 * b07,\n        a00 * b11 - a02 * b08 + a03 * b07,\n        a32 * b02 - a30 * b05 - a33 * b01,\n        a20 * b05 - a22 * b02 + a23 * b01,\n        a10 * b10 - a11 * b08 + a13 * b06,\n        a01 * b08 - a00 * b10 - a03 * b06,\n        a30 * b04 - a31 * b02 + a33 * b00,\n        a21 * b02 - a20 * b04 - a23 * b00,\n        a11 * b07 - a10 * b09 - a12 * b06,\n        a00 * b09 - a01 * b07 + a02 * b06,\n        a31 * b01 - a30 * b03 - a32 * b00,\n        a20 * b03 - a21 * b01 + a22 * b00) / det;\n}"
  },
  {
    "path": "src/shaders/shaderChunk/light_frag.glsl",
    "content": "// Use v_modelPos from modelPos_pars_frag\n// Use geometryNormal, N from normal_frag\n\n#if (defined(USE_PHONG) || defined(USE_PBR))\n    vec3 V = normalize(u_CameraPosition - v_modelPos);\n#endif\n\n#ifdef USE_PBR\n    #ifdef USE_PBR2\n        vec3 diffuseColor = outColor.xyz;\n        vec3 specularColor = specularFactor.xyz;\n        float roughness = max(1.0 - glossinessFactor, 0.0525);\n    #else\n        vec3 diffuseColor = outColor.xyz * (1.0 - metalnessFactor);\n        vec3 specularColor = mix(vec3(0.04), outColor.xyz, metalnessFactor);\n        float roughness = max(roughnessFactor, 0.0525);\n    #endif\n\n    vec3 dxy = max(abs(dFdx(geometryNormal)), abs(dFdy(geometryNormal)));\n    float geometryRoughness = max(max(dxy.x, dxy.y), dxy.z);\n    roughness += geometryRoughness;\n\n    roughness = min(roughness, 1.0);\n\n    #ifdef USE_CLEARCOAT\n        float clearcoat = u_Clearcoat;\n        float clearcoatRoughness = u_ClearcoatRoughness;\n        #ifdef USE_CLEARCOATMAP\n\t\t    clearcoat *= texture2D(clearcoatMap, v_Uv).x;\n        #endif\n        #ifdef USE_CLEARCOAT_ROUGHNESSMAP\n\t\t    clearcoatRoughness *= texture2D(clearcoatRoughnessMap, v_Uv).y;\n\t    #endif\n        clearcoat = saturate(clearcoat);\n        clearcoatRoughness = max(clearcoatRoughness, 0.0525);\n\t    clearcoatRoughness += geometryRoughness;\n\t    clearcoatRoughness = min(clearcoatRoughness, 1.0);\n    #endif\n#else\n    vec3 diffuseColor = outColor.xyz;\n    #ifdef USE_PHONG\n        vec3 specularColor = u_SpecularColor.xyz;\n        float shininess = u_Specular;\n    #endif\n#endif\n\nvec3 L;\nfloat falloff;\nfloat dotNL;\nvec3 irradiance;\n\nfloat clearcoatDHR;\n\n#ifdef USE_CLEARCOAT\n    float ccDotNL;\n    vec3 ccIrradiance;\n#endif\n\n#if NUM_DIR_LIGHTS > 0\n\n    #pragma unroll_loop_start\n    for (int i = 0; i < NUM_DIR_LIGHTS; i++) {\n        L = normalize(-u_Directional[i].direction);\n        falloff = 1.0;\n\n        #if defined(USE_SHADOW) && (UNROLLED_LOOP_INDEX < NUM_DIR_SHADOWS)\n            #ifdef USE_PCSS_SOFT_SHADOW\n                falloff *= getShadowWithPCSS(directionalDepthMap[i], directionalShadowMap[i], vDirectionalShadowCoord[i], u_DirectionalShadow[i].shadowMapSize, u_DirectionalShadow[i].shadowBias, u_DirectionalShadow[i].shadowParams);\n            #else\n                falloff *= getShadow(directionalShadowMap[i], vDirectionalShadowCoord[i], u_DirectionalShadow[i].shadowMapSize, u_DirectionalShadow[i].shadowBias, u_DirectionalShadow[i].shadowParams);\n            #endif\n        #endif\n\n        dotNL = saturate(dot(N, L));\n        irradiance = u_Directional[i].color * falloff * dotNL * PI;\n\n        #ifdef USE_CLEARCOAT        \n            ccDotNL = saturate(dot(clearcoatNormal, L));\n            ccIrradiance = ccDotNL * u_Directional[i].color * falloff  * PI;\n            clearcoatDHR = clearcoat * clearcoatDHRApprox(clearcoatRoughness, ccDotNL);\n            reflectedLight.directSpecular += ccIrradiance * clearcoat * BRDF_Specular_GGX(specularColor, clearcoatNormal, L, V, clearcoatRoughness);\n        #else\n            clearcoatDHR = 0.0;\n        #endif\n\n        reflectedLight.directDiffuse += (1.0 - clearcoatDHR) * irradiance * BRDF_Diffuse_Lambert(diffuseColor);\n\n        #ifdef USE_PHONG\n            reflectedLight.directSpecular += irradiance * BRDF_Specular_BlinnPhong(specularColor, N, L, V, shininess) * specularStrength;\n        #endif\n\n        #ifdef USE_PBR\n            reflectedLight.directSpecular += (1.0 - clearcoatDHR) * irradiance * BRDF_Specular_GGX(specularColor, N, L, V, roughness);\n        #endif\n    }\n    #pragma unroll_loop_end\n#endif\n\n#if NUM_POINT_LIGHTS > 0\n    vec3 worldV;\n\n    #pragma unroll_loop_start\n    for (int i = 0; i < NUM_POINT_LIGHTS; i++) {\n        worldV = v_modelPos - u_Point[i].position;\n\n        L = -worldV;\n        falloff = pow(clamp(1. - length(L) / u_Point[i].distance, 0.0, 1.0), u_Point[i].decay);\n        L = normalize(L);\n\n        #if defined(USE_SHADOW) && (UNROLLED_LOOP_INDEX < NUM_POINT_SHADOWS)\n            falloff *= getPointShadow(pointShadowMap[i], vPointShadowCoord[i], u_PointShadow[i].shadowMapSize, u_PointShadow[i].shadowBias, u_PointShadow[i].shadowParams, u_PointShadow[i].shadowCameraRange);\n        #endif\n\n        dotNL = saturate(dot(N, L));\n        irradiance = u_Point[i].color * falloff * dotNL * PI;\n\n        #ifdef USE_CLEARCOAT        \n            ccDotNL = saturate(dot(clearcoatNormal, L));\n            ccIrradiance = ccDotNL *  u_Point[i].color * falloff  * PI;\n            clearcoatDHR = clearcoat * clearcoatDHRApprox(clearcoatRoughness, ccDotNL);\n            reflectedLight.directSpecular += ccIrradiance * clearcoat * BRDF_Specular_GGX(specularColor, clearcoatNormal, L, V, clearcoatRoughness);\n        #else\n            clearcoatDHR = 0.0;\n        #endif\n\n        reflectedLight.directDiffuse += (1.0 - clearcoatDHR) * irradiance * BRDF_Diffuse_Lambert(diffuseColor);\n\n        #ifdef USE_PHONG\n            reflectedLight.directSpecular += irradiance * BRDF_Specular_BlinnPhong(specularColor, N, L, V, shininess) * specularStrength;\n        #endif\n\n        #ifdef USE_PBR\n            reflectedLight.directSpecular += (1.0 - clearcoatDHR) * irradiance * BRDF_Specular_GGX(specularColor, N, L, V, roughness);\n        #endif\n    }\n    #pragma unroll_loop_end\n#endif\n\n#if NUM_SPOT_LIGHTS > 0\n    float lightDistance;\n    float angleCos;\n\n    #pragma unroll_loop_start\n    for (int i = 0; i < NUM_SPOT_LIGHTS; i++) {\n        L = u_Spot[i].position - v_modelPos;\n        lightDistance = length(L);\n        L = normalize(L);\n        angleCos = dot(L, -normalize(u_Spot[i].direction));\n\n        falloff = smoothstep(u_Spot[i].coneCos, u_Spot[i].penumbraCos, angleCos);\n        falloff *= pow(clamp(1. - lightDistance / u_Spot[i].distance, 0.0, 1.0), u_Spot[i].decay);\n\n        #if defined(USE_SHADOW) && (UNROLLED_LOOP_INDEX < NUM_SPOT_SHADOWS)\n            #ifdef USE_PCSS_SOFT_SHADOW\n                falloff *= getShadowWithPCSS(spotDepthMap[i], spotShadowMap[i], vSpotShadowCoord[i], u_SpotShadow[i].shadowMapSize, u_SpotShadow[i].shadowBias, u_SpotShadow[i].shadowParams);\n            #else\n                falloff *= getShadow(spotShadowMap[i], vSpotShadowCoord[i], u_SpotShadow[i].shadowMapSize, u_SpotShadow[i].shadowBias, u_SpotShadow[i].shadowParams);\n            #endif\n        #endif\n\n        dotNL = saturate(dot(N, L));\n        irradiance = u_Spot[i].color * falloff * dotNL * PI;\n\n        #ifdef USE_CLEARCOAT        \n            ccDotNL = saturate(dot(clearcoatNormal, L));\n            ccIrradiance = ccDotNL *  u_Spot[i].color * falloff  * PI;\n            clearcoatDHR = clearcoat * clearcoatDHRApprox(clearcoatRoughness, ccDotNL);\n            reflectedLight.directSpecular += ccIrradiance * clearcoat * BRDF_Specular_GGX(specularColor, clearcoatNormal, L, V, clearcoatRoughness);\n        #else\n            clearcoatDHR = 0.0;\n        #endif\n\n        reflectedLight.directDiffuse += (1.0 - clearcoatDHR) * irradiance * BRDF_Diffuse_Lambert(diffuseColor);\n\n        #ifdef USE_PHONG\n            reflectedLight.directSpecular += irradiance * BRDF_Specular_BlinnPhong(specularColor, N, L, V, shininess) * specularStrength;\n        #endif\n\n        #ifdef USE_PBR\n            reflectedLight.directSpecular += (1.0 - clearcoatDHR) * irradiance * BRDF_Specular_GGX(specularColor, N, L, V, roughness);\n        #endif\n    }\n    #pragma unroll_loop_end\n#endif\n\n#if NUM_RECT_AREA_LIGHTS > 0\n    vec3 RectAreaLightDirectSpecular;\n    vec3 RectAreaLightDirectDiffuse;\n    vec3 rectCoords[4];\n\n    #pragma unroll_loop_start\n    for (int i = 0; i < NUM_RECT_AREA_LIGHTS; i++) {\n        LTC_RectCoords(u_RectArea[i].position, u_RectArea[i].halfWidth, u_RectArea[i].halfHeight, rectCoords);\n\n        reflectedLight.directDiffuse += u_RectArea[i].color * LTC_Diffuse(diffuseColor, N, V, v_modelPos, rectCoords);\n\n        #ifdef USE_PBR\n            reflectedLight.directSpecular += u_RectArea[i].color * LTC_Specular(specularColor, N, V, v_modelPos, rectCoords, roughness);\n        #endif\n    }\n    #pragma unroll_loop_end\n#endif\n\n#ifdef USE_CLUSTERED_LIGHTS\n    vec4 positionView = u_View * vec4(v_modelPos, 1.0);\n\n    float perspectiveFactor = step(0.0, cellsTransformFactors.z);\n    float halfFrustumHeight = -cellsTransformFactors.z * mix(1.0, positionView.z, perspectiveFactor);\n    float halfFrustumWidth = halfFrustumHeight * cellsTransformFactors.w;\n\n    vec3 cellCoords;\n    cellCoords.z = floor(log(-positionView.z) * cellsTransformFactors.x + cellsTransformFactors.y);\n    cellCoords.y = floor((positionView.y / (2.0 * halfFrustumHeight) + 0.5) * cells.y);\n    cellCoords.x = floor((positionView.x / (2.0 * halfFrustumWidth) + 0.5) * cells.x);\n\n    if(!(any(lessThan(cellCoords, vec3(0.0))) || any(greaterThanEqual(cellCoords, cells)))) {\n        float cellIndex = dot(cellsDotData, cellCoords);\n        float clusterV = floor(cellIndex * cellsTextureSize.y);\n        float clusterU = cellIndex - (clusterV * cellsTextureSize.x);\n\n        int size = textureSize(lightsTexture, 0).x;\n\n        ClusteredPointLight clusteredPointLight;\n        ClusteredSpotLight clusteredSpotLight;\n\n        vec3 clusteredLightColor;\n        float clusteredLightDistance;\n        float clusteredAngleCos;\n\n        for (int lightCellIndex = 0; lightCellIndex < maxLightsPerCell; lightCellIndex++) {\n            float lightIndex = texelFetch(cellsTexture, ivec2(int(clusterU) + lightCellIndex, clusterV), 0).x;\n\n            if (lightIndex <= 0.0) break;\n\n            int lightOffset = int(lightIndex - 1.) * 4;\n            ivec2 lightDataCoords = ivec2(lightOffset % size, lightOffset / size);\n\n            vec4 lightData0 = texelFetch(lightsTexture, lightDataCoords, 0);\n\n            if (lightData0.x == 1.0) {\n                getPointLightFromTexture(lightDataCoords, lightData0, clusteredPointLight);\n                L = clusteredPointLight.position - v_modelPos;\n                clusteredLightDistance = length(L);\n                L = normalize(L);\n\n                falloff = pow(clamp(1. - clusteredLightDistance / clusteredPointLight.distance, 0.0, 1.0), clusteredPointLight.decay);\n\n                clusteredLightColor = clusteredPointLight.color;\n            } else if (lightData0.x == 2.0) {\n                getSpotLightFromTexture(lightDataCoords, lightData0, clusteredSpotLight);\n                L = clusteredSpotLight.position - v_modelPos;\n                clusteredLightDistance = length(L);\n                L = normalize(L);\n\n                clusteredAngleCos = dot(L, -normalize(clusteredSpotLight.direction));\n                falloff = smoothstep(clusteredSpotLight.coneCos, clusteredSpotLight.penumbraCos, clusteredAngleCos);\n                falloff *= pow(clamp(1. - clusteredLightDistance / clusteredSpotLight.distance, 0.0, 1.0), clusteredSpotLight.decay);\n\n                clusteredLightColor = clusteredSpotLight.color;\n            }\n\n            dotNL = saturate(dot(N, L));\n            irradiance = clusteredLightColor * falloff * dotNL * PI;\n\n            #ifdef USE_CLEARCOAT\n                ccDotNL = saturate(dot(clearcoatNormal, L));\n                ccIrradiance = ccDotNL * clusteredLightColor * falloff * PI;\n                clearcoatDHR = clearcoat * clearcoatDHRApprox(clearcoatRoughness, ccDotNL);\n                reflectedLight.directSpecular += ccIrradiance * clearcoat * BRDF_Specular_GGX(specularColor, clearcoatNormal, L, V, clearcoatRoughness);\n            #else\n                clearcoatDHR = 0.0;\n            #endif\n\n            reflectedLight.directDiffuse += (1.0 - clearcoatDHR) * irradiance * BRDF_Diffuse_Lambert(diffuseColor);\n\n            #ifdef USE_PHONG\n                reflectedLight.directSpecular += irradiance * BRDF_Specular_BlinnPhong(specularColor, N, L, V, shininess) * specularStrength;\n            #endif\n\n            #ifdef USE_PBR\n                reflectedLight.directSpecular += (1.0 - clearcoatDHR) * irradiance * BRDF_Specular_GGX(specularColor, N, L, V, roughness);\n            #endif\n        }\n    }\n#endif\n\nvec3 indirectIrradiance = vec3(0., 0., 0.);   \n\n#ifdef USE_AMBIENT_LIGHT\n    indirectIrradiance += u_AmbientLightColor * PI;\n#endif\n\n#ifdef USE_SPHERICALHARMONICS_LIGHT\n    indirectIrradiance += getLightProbeIrradiance(u_SphericalHarmonicsLightData, N);\n#endif\n\n#if NUM_HEMI_LIGHTS > 0\n    float hemiDiffuseWeight;\n\n    #pragma unroll_loop_start\n    for (int i = 0; i < NUM_HEMI_LIGHTS; i++) {\n        L = normalize(u_Hemi[i].direction);\n\n        dotNL = dot(N, L);\n        hemiDiffuseWeight = 0.5 * dotNL + 0.5;\n\n        indirectIrradiance += mix(u_Hemi[i].groundColor, u_Hemi[i].skyColor, hemiDiffuseWeight) * PI;\n    }\n    #pragma unroll_loop_end\n#endif\n\nreflectedLight.indirectDiffuse += indirectIrradiance * BRDF_Diffuse_Lambert(diffuseColor);\n\n// TODO light map\n\n#if defined(USE_ENV_MAP) && defined(USE_PBR)\n    vec3 iblIrradiance = vec3(0., 0., 0.);\n    vec3 indirectRadiance = vec3(0., 0., 0.);\n    vec3 clearcoatRadiance = vec3(0., 0., 0.);\n\n    vec3 envDir;\n    #ifdef USE_VERTEX_ENVDIR\n        envDir = v_EnvDir;\n    #else\n        envDir = reflect(normalize(v_modelPos - u_CameraPosition), N);\n    #endif\n    iblIrradiance += getLightProbeIndirectIrradiance(maxMipLevel, N);\n    indirectRadiance += getLightProbeIndirectRadiance(roughness, maxMipLevel, N, envDir);\n\n    #ifdef USE_CLEARCOAT\n        vec3 clearcoatDir = reflect(normalize(v_modelPos - u_CameraPosition), clearcoatNormal);\n        clearcoatRadiance += getLightProbeIndirectRadiance(clearcoatRoughness, maxMipLevel, clearcoatNormal, clearcoatDir);\n    #endif\n\n    // reflectedLight.indirectSpecular += indirectRadiance * BRDF_Specular_GGX_Environment(N, V, specularColor, roughness);\n\n    #ifdef USE_CLEARCOAT\n        float ccDotNV = saturate(dot(clearcoatNormal, V));\n        reflectedLight.indirectSpecular += clearcoatRadiance * clearcoat * BRDF_Specular_GGX_Environment(clearcoatNormal, V, specularColor, clearcoatRoughness);\n        ccDotNL = ccDotNV;\n        clearcoatDHR = clearcoat * clearcoatDHRApprox(clearcoatRoughness, ccDotNL);\n    #else\n        clearcoatDHR = 0.0;\n    #endif\n\n    float clearcoatInv = 1.0 - clearcoatDHR;\n\n    // Both indirect specular and indirect diffuse light accumulate here\n\n    vec3 singleScattering = vec3(0.0);\n    vec3 multiScattering = vec3(0.0);\n\n    vec3 cosineWeightedIrradiance = iblIrradiance * RECIPROCAL_PI;\n\n    BRDF_Specular_Multiscattering_Environment(N, V, specularColor, roughness, singleScattering, multiScattering);\n\n    vec3 diffuse = diffuseColor * (1.0 - (singleScattering + multiScattering));\n\n    reflectedLight.indirectSpecular += clearcoatInv * indirectRadiance * singleScattering;\n    reflectedLight.indirectSpecular += multiScattering * cosineWeightedIrradiance;\n\n    reflectedLight.indirectDiffuse += diffuse * cosineWeightedIrradiance;\n#endif"
  },
  {
    "path": "src/shaders/shaderChunk/light_pars_frag.glsl",
    "content": "#ifdef USE_AMBIENT_LIGHT\n    uniform vec3 u_AmbientLightColor;\n#endif\n\n#ifdef USE_SPHERICALHARMONICS_LIGHT\n    uniform vec3 u_SphericalHarmonicsLightData[9];\n#endif\n\n#ifdef USE_CLEARCOAT\n    // Clear coat directional hemishperical reflectance (this approximation should be improved)\n    float clearcoatDHRApprox(const in float roughness, const in float dotNL) {\n        return 0.04 + (1.0 - 0.16) * (pow(1.0 - dotNL, 5.0) * pow(1.0 - roughness, 2.0));\n    }\n#endif\n\n#if NUM_HEMI_LIGHTS > 0\n    struct HemisphereLight {\n        vec3 direction;\n        vec3 skyColor;\n\t\tvec3 groundColor;\n    };\n    uniform HemisphereLight u_Hemi[NUM_HEMI_LIGHTS];\n#endif\n\n#if NUM_DIR_LIGHTS > 0\n    struct DirectLight {\n        vec3 direction;\n        vec3 color;\n    };\n    uniform DirectLight u_Directional[NUM_DIR_LIGHTS];\n#endif\n\n#if NUM_POINT_LIGHTS > 0\n    struct PointLight {\n        vec3 position;\n        vec3 color;\n        float distance;\n        float decay;\n    };\n    uniform PointLight u_Point[NUM_POINT_LIGHTS];\n#endif\n\n#if NUM_SPOT_LIGHTS > 0\n    struct SpotLight {\n        vec3 position;\n        vec3 color;\n        float distance;\n        float decay;\n        float coneCos;\n        float penumbraCos;\n        vec3 direction;\n    };\n    uniform SpotLight u_Spot[NUM_SPOT_LIGHTS];\n#endif\n\n#if NUM_RECT_AREA_LIGHTS > 0\n    struct RectAreaLight {\n        vec3 position;\n        vec3 color;\n\t\tvec3 halfWidth;\n\t\tvec3 halfHeight;\n    };\n    uniform RectAreaLight u_RectArea[NUM_RECT_AREA_LIGHTS];\n\n    // Pre-computed values of LinearTransformedCosine approximation of BRDF\n\t// BRDF approximation Texture is 64x64\n\tuniform sampler2D ltc_1; // RGBA Float\n\tuniform sampler2D ltc_2; // RGBA Float\n\n    void LTC_RectCoords(const in vec3 lightPos, const in vec3 halfWidth, const in vec3 halfHeight, inout vec3 rectCoords[4]) {\n        rectCoords[0] = lightPos + halfWidth - halfHeight; // counterclockwise; light shines in local neg z direction\n        rectCoords[1] = lightPos - halfWidth - halfHeight;\n        rectCoords[2] = lightPos - halfWidth + halfHeight;\n        rectCoords[3] = lightPos + halfWidth + halfHeight;\n    }\n\n    vec2 LTC_Uv(const in vec3 N, const in vec3 V, const in float roughness) {\n        const float LUT_SIZE = 64.0; \n        const float LUT_SCALE = (LUT_SIZE - 1.0) / LUT_SIZE;\n        const float LUT_BIAS = 0.5 / LUT_SIZE;\n\n        float dotNV = saturate(dot(N, V));\n\n        // texture parameterized by sqrt( GGX alpha ) and sqrt( 1 - cos( theta ) )\n        vec2 uv = vec2(roughness, sqrt(1.0 - dotNV));\n\n        uv = uv * LUT_SCALE + LUT_BIAS;\n\n        return uv;\n    }\n\n    vec3 LTC_EdgeVectorFormFactor(const in vec3 v1, const in vec3 v2) {\n        float x = dot(v1, v2);\n\n        float y = abs(x);\n\n        // rational polynomial approximation to theta / sin( theta ) / 2PI\n        float a = 0.8543985 + (0.4965155 + 0.0145206 * y) * y;\n        float b = 3.4175940 + (4.1616724 + y) * y;\n        float v = a / b;\n\n        float theta_sintheta = (x > 0.0) ? v : 0.5 * inversesqrt(max(1.0 - x * x, 1e-7)) - v;\n\n        return cross(v1, v2) * theta_sintheta;\n    }\n\n    float LTC_ClippedSphereFormFactor(const in vec3 f) {\n        // Real-Time Area Lighting: a Journey from Research to Production (p.102)\n        // An approximation of the form factor of a horizon-clipped rectangle.\n\n        float l = length(f);\n\n        return max((l * l + f.z) / (l + 1.0), 0.0);\n    }\n\n    vec3 LTC_Evaluate(const in vec3 N, const in vec3 V, const in vec3 P, const in mat3 mInv, const in vec3 rectCoords[4]) {\n        // bail if point is on back side of plane of light\n        // assumes ccw winding order of light vertices\n        vec3 v1 = rectCoords[1] - rectCoords[0];\n        vec3 v2 = rectCoords[3] - rectCoords[0];\n        vec3 lightNormal = cross(v1, v2);\n\n        if(dot(lightNormal, P - rectCoords[0]) < 0.0) return vec3(0.0);\n\n        // construct orthonormal basis around N\n        vec3 T1, T2;\n        T1 = normalize(V - N * dot(V, N));\n        T2 = - cross(N, T1); // negated from paper; possibly due to a different handedness of world coordinate system\n\n        // compute transform\n        mat3 mat = mInv * mat3(\n            T1.x, T2.x, N.x,\n            T1.y, T2.y, N.y,\n            T1.z, T2.z, N.z\n        );\n\n        // transform rect\n        vec3 coords[4];\n        coords[0] = mat * (rectCoords[0] - P);\n        coords[1] = mat * (rectCoords[1] - P);\n        coords[2] = mat * (rectCoords[2] - P);\n        coords[3] = mat * (rectCoords[3] - P);\n\n        // project rect onto sphere\n        coords[0] = normalize(coords[0]);\n        coords[1] = normalize(coords[1]);\n        coords[2] = normalize(coords[2]);\n        coords[3] = normalize(coords[3]);\n\n        // calculate vector form factor\n        vec3 vectorFormFactor = vec3(0.0);\n        vectorFormFactor += LTC_EdgeVectorFormFactor(coords[0], coords[1]);\n        vectorFormFactor += LTC_EdgeVectorFormFactor(coords[1], coords[2]);\n        vectorFormFactor += LTC_EdgeVectorFormFactor(coords[2], coords[3]);\n        vectorFormFactor += LTC_EdgeVectorFormFactor(coords[3], coords[0]);\n\n        // adjust for horizon clipping\n        float result = LTC_ClippedSphereFormFactor(vectorFormFactor);\n\n        return vec3(result);\n    }\n\n    vec3 LTC_Diffuse(const in vec3 diffuseColor, const in vec3 N, const in vec3 V, const in vec3 P, const in vec3 rectCoords[4]) {\n        return diffuseColor * LTC_Evaluate(N, V, P, mat3(1.0), rectCoords);\n    }\n\n    vec3 LTC_Specular(const in vec3 specularColor, const in vec3 N, const in vec3 V, const in vec3 P, const in vec3 rectCoords[4], const in float roughness) {\n        vec2 ltc_uv = LTC_Uv(N, V, roughness);\n\n        vec4 t1 = texture2D(ltc_1, ltc_uv);\n        vec4 t2 = texture2D(ltc_2, ltc_uv);\n\n        mat3 mInv = mat3(\n            vec3(t1.x, 0, t1.y),\n            vec3(0, 1, 0),\n            vec3(t1.z, 0, t1.w)\n        );\n\n        // LTC Fresnel Approximation by Stephen Hill\n        // http://blog.selfshadow.com/publications/s2016-advances/s2016_ltc_fresnel.pdf\n        vec3 fresnel = (specularColor * t2.x + (vec3(1.0) - specularColor) * t2.y);\n\n        return fresnel * LTC_Evaluate(N, V, P, mInv, rectCoords);\n    }\n#endif\n\n#if defined(USE_PBR) && defined(USE_ENV_MAP)\n    vec3 getLightProbeIndirectIrradiance(const in int maxMIPLevel, const in vec3 N) {\n        // TODO: replace with properly filtered cubemaps and access the irradiance LOD level, be it the last LOD level\n    \t// of a specular cubemap, or just the default level of a specially created irradiance cubemap.\n\n        vec3 coordVec = vec3(envMapParams.z * N.x, N.yz);\n\n    \t#ifdef TEXTURE_LOD_EXT\n    \t\tvec4 envMapColor = textureCubeLodEXT(envMap, coordVec, float(maxMIPLevel));\n    \t#else\n    \t\t// force the bias high to get the last LOD level as it is the most blurred.\n    \t\tvec4 envMapColor = textureCube(envMap, coordVec, float(maxMIPLevel));\n    \t#endif\n\n        envMapColor = envMapTexelToLinear(envMapColor);\n\n        return PI * envMapColor.rgb * envMapParams.x;\n    }\n\n    // Trowbridge-Reitz distribution to Mip level, following the logic of http://casual-effects.blogspot.ca/2011/08/plausible-environment-lighting-in-two.html\n    float getSpecularMIPLevel(const in float roughness, const in int maxMIPLevel) {\n    \tfloat maxMIPLevelScalar = float(maxMIPLevel);\n\n        float sigma = PI * roughness * roughness / (1.0 + roughness);\n        float desiredMIPLevel = maxMIPLevelScalar + log2(sigma);\n\n    \t// clamp to allowable LOD ranges.\n    \treturn clamp(desiredMIPLevel, 0.0, maxMIPLevelScalar);\n    }\n\n    vec3 getLightProbeIndirectRadiance(const in float roughness, const in int maxMIPLevel, const in vec3 normal, const in vec3 envDir) {\n        float specularMIPLevel = getSpecularMIPLevel(roughness, maxMIPLevel);\n\n        // Mixing the reflection with the normal is more accurate and keeps rough objects from gathering light from behind their tangent plane.\n        vec3 coordVec = normalize(mix(envDir, normal, roughness * roughness));\n\n        coordVec.x *= envMapParams.z;\n\n        #ifdef TEXTURE_LOD_EXT\n    \t\tvec4 envMapColor = textureCubeLodEXT(envMap, coordVec, specularMIPLevel);\n    \t#else\n    \t\tvec4 envMapColor = textureCube(envMap, coordVec, specularMIPLevel);\n    \t#endif\n\n        envMapColor = envMapTexelToLinear(envMapColor);\n\n        return envMapColor.rgb * envMapParams.y;\n    }\n\n    // ref: https://seblagarde.files.wordpress.com/2015/07/course_notes_moving_frostbite_to_pbr_v32.pdf\n    float computeSpecularOcclusion(const in float dotNV, const in float ambientOcclusion, const in float roughness) {\n    \treturn saturate(pow(dotNV + ambientOcclusion, exp2(-16.0 * roughness - 1.0)) - 1.0 + ambientOcclusion);\n    }\n#endif\n\n#ifdef USE_SPHERICALHARMONICS_LIGHT\n    vec3 shGetIrradianceAt(in vec3 normal, in vec3 shCoefficients[9]) {\n        float x = normal.x, y = normal.y, z = normal.z;\n        vec3 result = shCoefficients[0] * 0.886227;\n        result += shCoefficients[1] * 2.0 * 0.511664 * y;\n        result += shCoefficients[2] * 2.0 * 0.511664 * z;\n        result += shCoefficients[3] * 2.0 * 0.511664 * x;\n        result += shCoefficients[4] * 2.0 * 0.429043 * x * y;\n        result += shCoefficients[5] * 2.0 * 0.429043 * y * z;\n        result += shCoefficients[6] * (0.743125 * z * z - 0.247708);\n        result += shCoefficients[7] * 2.0 * 0.429043 * x * z;\n        result += shCoefficients[8] * 0.429043 * (x * x - y * y);\n        return result;\n    }\n\n    vec3 getLightProbeIrradiance(const in vec3 lightProbe[9], const in vec3 normal) {\n        vec3 irradiance = shGetIrradianceAt(normal, lightProbe);\n        return irradiance;\n    }\n#endif\n\n#ifdef USE_CLUSTERED_LIGHTS\n    uniform vec3 cells;\n    uniform int maxLightsPerCell;\n    uniform vec3 cellsDotData;\n    uniform vec3 cellsTextureSize;\n    uniform vec4 cellsTransformFactors;\n\n    uniform sampler2D cellsTexture;\n    uniform sampler2D lightsTexture;\n\n    struct ClusteredPointLight {\n        vec3 position;\n        vec3 color;\n        float distance;\n        float decay;\n    };\n\n    struct ClusteredSpotLight {\n        vec3 position;\n        vec3 color;\n        float distance;\n        float decay;\n        vec3 direction;\n        float coneCos;\n        float penumbraCos;\n    };\n\n    void getPointLightFromTexture(ivec2 lightDataCoords, vec4 lightData0, inout ClusteredPointLight pointLight) {\n        vec4 lightData1 = texelFetch(lightsTexture, lightDataCoords + ivec2(1, 0), 0);\n        vec4 lightData2 = texelFetch(lightsTexture, lightDataCoords + ivec2(2, 0), 0);\n        pointLight.color = lightData1.xyz;\n        pointLight.decay = lightData1.w;\n        pointLight.position = lightData2.xyz;\n        pointLight.distance = lightData2.w;\n    }\n\n    void getSpotLightFromTexture(ivec2 lightDataCoords, vec4 lightData0, inout ClusteredSpotLight spotLight) {\n        vec4 lightData1 = texelFetch(lightsTexture, lightDataCoords + ivec2(1, 0), 0);\n        vec4 lightData2 = texelFetch(lightsTexture, lightDataCoords + ivec2(2, 0), 0);\n        vec4 lightData3 = texelFetch(lightsTexture, lightDataCoords + ivec2(3, 0), 0);\n        spotLight.color = lightData1.xyz;\n        spotLight.decay = lightData1.w;\n        spotLight.position = lightData2.xyz;\n        spotLight.distance = lightData2.w;\n        spotLight.direction = lightData3.xyz;\n        spotLight.coneCos = lightData3.w;\n        spotLight.penumbraCos = lightData0.y;\n    }\n#endif"
  },
  {
    "path": "src/shaders/shaderChunk/logdepthbuf_frag.glsl",
    "content": "#if defined( USE_LOGDEPTHBUF ) && defined( USE_LOGDEPTHBUF_EXT )\n\t// Doing a strict comparison with == 1.0 can cause noise artifacts\n\t// on some platforms.\n\tgl_FragDepthEXT = vIsPerspective == 0.0 ? gl_FragCoord.z : log2( vFragDepth ) * logDepthBufFC * 0.5;\n#endif\n"
  },
  {
    "path": "src/shaders/shaderChunk/logdepthbuf_pars_frag.glsl",
    "content": "#if defined( USE_LOGDEPTHBUF ) && defined( USE_LOGDEPTHBUF_EXT )\n\tuniform float logDepthBufFC;\n\tvarying float vFragDepth;\n\tvarying float vIsPerspective;\n#endif\n"
  },
  {
    "path": "src/shaders/shaderChunk/logdepthbuf_pars_vert.glsl",
    "content": "#ifdef USE_LOGDEPTHBUF\n\t#ifdef USE_LOGDEPTHBUF_EXT\n\t\tuniform float logDepthCameraNear;\n\t\tvarying float vFragDepth;\n\t\tvarying float vIsPerspective;\n\t#else\n\t\tuniform float logDepthBufFC;\n\t\tuniform float logDepthCameraNear;\n\t#endif\n#endif\n"
  },
  {
    "path": "src/shaders/shaderChunk/logdepthbuf_vert.glsl",
    "content": "#ifdef USE_LOGDEPTHBUF\n\t#ifdef USE_LOGDEPTHBUF_EXT\n\t\tvFragDepth = 1.0 + gl_Position.w - logDepthCameraNear;\n\t\tvIsPerspective = float( isPerspectiveMatrix( u_Projection ) );\n\t#else\n\t\tif ( isPerspectiveMatrix( u_Projection ) ) {\n\t\t\tgl_Position.z = log2( max( EPSILON, gl_Position.w - logDepthCameraNear + 1.0 ) ) * logDepthBufFC - 1.0;\n\t\t\tgl_Position.z *= gl_Position.w;\n\t\t}\n\t#endif\n#endif\n"
  },
  {
    "path": "src/shaders/shaderChunk/modelPos_pars_frag.glsl",
    "content": "varying vec3 v_modelPos;"
  },
  {
    "path": "src/shaders/shaderChunk/modelPos_pars_vert.glsl",
    "content": "varying vec3 v_modelPos;"
  },
  {
    "path": "src/shaders/shaderChunk/modelPos_vert.glsl",
    "content": "// Use worldPosition from pvm_vert\n\nv_modelPos = worldPosition.xyz;"
  },
  {
    "path": "src/shaders/shaderChunk/morphnormal_vert.glsl",
    "content": "#ifdef USE_MORPHNORMALS\n\n\tobjectNormal += morphNormal0 * morphTargetInfluences[ 0 ];\n\tobjectNormal += morphNormal1 * morphTargetInfluences[ 1 ];\n\tobjectNormal += morphNormal2 * morphTargetInfluences[ 2 ];\n\tobjectNormal += morphNormal3 * morphTargetInfluences[ 3 ];\n\n#endif"
  },
  {
    "path": "src/shaders/shaderChunk/morphtarget_pars_vert.glsl",
    "content": "#ifdef USE_MORPHTARGETS\n\n\t#ifndef USE_MORPHNORMALS\n\n\tuniform float morphTargetInfluences[ 8 ];\n\n\t#else\n\n\tuniform float morphTargetInfluences[ 4 ];\n\n\t#endif\n\n#endif"
  },
  {
    "path": "src/shaders/shaderChunk/morphtarget_vert.glsl",
    "content": "#ifdef USE_MORPHTARGETS\n\n\ttransformed += morphTarget0 * morphTargetInfluences[ 0 ];\n\ttransformed += morphTarget1 * morphTargetInfluences[ 1 ];\n\ttransformed += morphTarget2 * morphTargetInfluences[ 2 ];\n\ttransformed += morphTarget3 * morphTargetInfluences[ 3 ];\n\n\t#ifndef USE_MORPHNORMALS\n\n        transformed += morphTarget4 * morphTargetInfluences[ 4 ];\n        transformed += morphTarget5 * morphTargetInfluences[ 5 ];\n        transformed += morphTarget6 * morphTargetInfluences[ 6 ];\n        transformed += morphTarget7 * morphTargetInfluences[ 7 ];\n\n\t#endif\n\n#endif"
  },
  {
    "path": "src/shaders/shaderChunk/normalMap_pars_frag.glsl",
    "content": "#ifdef USE_NORMAL_MAP\n    uniform sampler2D normalMap;\n    uniform vec2 normalScale;\n#endif\n\n#if defined(USE_NORMAL_MAP) || defined(USE_CLEARCOAT_NORMALMAP)\n    #if defined(USE_TANGENT) && !defined(FLAT_SHADED)\n        #define USE_TBN\n    #else\n        #include <tsn>\n    #endif\n#endif"
  },
  {
    "path": "src/shaders/shaderChunk/normal_frag.glsl",
    "content": "// Use v_modelPos from modelPos_pars_frag\n\n#ifdef FLAT_SHADED\n    vec3 fdx = dFdx(v_modelPos);\n    vec3 fdy = dFdy(v_modelPos);\n    vec3 N = normalize(cross(fdx, fdy));\n#else\n    vec3 N = normalize(v_Normal);\n    #ifdef DOUBLE_SIDED\n        N = N * (float(gl_FrontFacing) * 2.0 - 1.0);\n    #endif\n#endif\n\n#ifdef USE_TBN\n\tvec3 tangent = normalize(v_Tangent);\n\tvec3 bitangent = normalize(v_Bitangent);\n\t#ifdef DOUBLE_SIDED\n\t\ttangent = tangent * (float(gl_FrontFacing) * 2.0 - 1.0);\n\t\tbitangent = bitangent * (float(gl_FrontFacing) * 2.0 - 1.0);\n\t#endif\n\tmat3 tspace = mat3(tangent, bitangent, N);\n#endif\n\n// non perturbed normal\nvec3 geometryNormal = N;\n\n#ifdef USE_NORMAL_MAP\n    vec3 mapN = texture2D(normalMap, v_Uv).rgb * 2.0 - 1.0;\n    mapN.xy *= normalScale;\n    #ifdef USE_TBN\n        N = normalize(tspace * mapN);\n    #else\n        mapN.xy *= (float(gl_FrontFacing) * 2.0 - 1.0);\n        N = normalize(tsn(N, v_modelPos, v_Uv) * mapN);\n    #endif\n#elif defined(USE_BUMPMAP)\n    N = perturbNormalArb(v_modelPos, N, dHdxy_fwd(v_Uv));\n#endif\n\n#ifdef USE_CLEARCOAT\n\tvec3 clearcoatNormal = geometryNormal;\n#endif\n\n#ifdef USE_CLEARCOAT_NORMALMAP\n\tvec3 clearcoatMapN = texture2D(clearcoatNormalMap, v_Uv).xyz * 2.0 - 1.0;\n\tclearcoatMapN.xy *= clearcoatNormalScale;\n\n\t#ifdef USE_TBN\n\t\tclearcoatNormal = normalize(tspace * clearcoatMapN);\n\t#else\n\t\tclearcoatMapN.xy *= (float(gl_FrontFacing) * 2.0 - 1.0);\n\t\tclearcoatNormal = normalize(tsn(clearcoatNormal, v_modelPos, v_Uv) * clearcoatMapN);\n\t#endif\n#endif"
  },
  {
    "path": "src/shaders/shaderChunk/normal_pars_frag.glsl",
    "content": "#ifndef FLAT_SHADED\n    varying vec3 v_Normal;\n    #ifdef USE_TANGENT\n        varying vec3 v_Tangent;\n\t\tvarying vec3 v_Bitangent;\n    #endif\n#endif"
  },
  {
    "path": "src/shaders/shaderChunk/normal_pars_vert.glsl",
    "content": "#ifndef FLAT_SHADED\n    varying vec3 v_Normal;\n    #ifdef USE_TANGENT\n        varying vec3 v_Tangent;\n\t\tvarying vec3 v_Bitangent;\n    #endif\n#endif"
  },
  {
    "path": "src/shaders/shaderChunk/normal_vert.glsl",
    "content": "#ifndef FLAT_SHADED\n    v_Normal = (transposeMat4(inverseMat4(u_Model)) * vec4(objectNormal, 0.0)).xyz;\n\n    #ifdef FLIP_SIDED\n    \tv_Normal = - v_Normal;\n    #endif\n\n    #ifdef USE_TANGENT\n        v_Tangent = (transposeMat4(inverseMat4(u_Model)) * vec4(objectTangent, 0.0)).xyz;\n\n        #ifdef FLIP_SIDED\n            v_Tangent = - v_Tangent;\n        #endif\n\n        v_Bitangent = normalize(cross(v_Normal, v_Tangent) * a_Tangent.w);\n    #endif\n#endif\n"
  },
  {
    "path": "src/shaders/shaderChunk/packing.glsl",
    "content": "const float PackUpscale = 256. / 255.; // fraction -> 0..1 (including 1)\nconst float UnpackDownscale = 255. / 256.; // 0..1 -> fraction (excluding 1)\n\nconst vec3 PackFactors = vec3( 256. * 256. * 256., 256. * 256.,  256. );\nconst vec4 UnpackFactors = UnpackDownscale / vec4( PackFactors, 1. );\n\nconst float ShiftRight8 = 1. / 256.;\n\nvec4 packDepthToRGBA( const in float v ) {\n\n    vec4 r = vec4( fract( v * PackFactors ), v );\n    r.yzw -= r.xyz * ShiftRight8; // tidy overflow\n    return r * PackUpscale;\n\n}\n\nfloat unpackRGBAToDepth( const in vec4 v ) {\n\n    return dot( v, UnpackFactors );\n\n}"
  },
  {
    "path": "src/shaders/shaderChunk/premultipliedAlpha_frag.glsl",
    "content": "#ifdef USE_PREMULTIPLIED_ALPHA\n    gl_FragColor.rgb = gl_FragColor.rgb * gl_FragColor.a;\n#endif"
  },
  {
    "path": "src/shaders/shaderChunk/pvm_vert.glsl",
    "content": "vec4 worldPosition = u_Model * vec4(transformed, 1.0);\ngl_Position = u_ProjectionView * worldPosition;"
  },
  {
    "path": "src/shaders/shaderChunk/shadow.glsl",
    "content": "#ifdef USE_SHADOW_SAMPLER\n    float computeShadow(sampler2DShadow shadowMap, vec3 shadowCoord) {\n        return texture2D( shadowMap, shadowCoord );\n    }\n#else\n    float computeShadow(sampler2D shadowMap, vec3 shadowCoord) {\n        return step(shadowCoord.z, unpackRGBAToDepth(texture2D(shadowMap, shadowCoord.xy)));\n    }\n#endif\n\n#ifdef USE_POISSON_SOFT_SHADOW\n    float computeShadowWithPCF(sampler2DShadow shadowMap, vec3 shadowCoord, vec2 shadowMapSizeAndInverse, vec2 shadowParams) {\n        float texelSize = shadowParams.x * 0.5 * shadowMapSizeAndInverse.y;\n\n        vec3 poissonDisk[4];\n        poissonDisk[0] = vec3(-0.94201624, -0.39906216, 0);\n        poissonDisk[1] = vec3(0.94558609, -0.76890725, 0);\n        poissonDisk[2] = vec3(-0.094184101, -0.92938870, 0);\n        poissonDisk[3] = vec3(0.34495938, 0.29387760, 0);\n\n        return computeShadow(shadowMap, shadowCoord + poissonDisk[0] * texelSize) * 0.25 +\n            computeShadow(shadowMap, shadowCoord + poissonDisk[1] * texelSize) * 0.25 +\n            computeShadow(shadowMap, shadowCoord + poissonDisk[2] * texelSize) * 0.25 +\n            computeShadow(shadowMap, shadowCoord + poissonDisk[3] * texelSize) * 0.25;\n    }\n#elif defined(USE_VOGEL5_SOFT_SHADOW)\n    float interleavedGradientNoise(vec2 position) {\n        return fract(52.9829189 * fract(dot(position, vec2(0.06711056, 0.00583715))));\n    }\n\n    vec2 vogelDiskSample(int sampleIndex, int samplesCount, float phi) {\n        const float goldenAngle = 2.399963229728653;\n        float r = sqrt((float(sampleIndex) + 0.5) / float(samplesCount));\n        float theta = float(sampleIndex) * goldenAngle + phi;\n        return vec2(cos(theta), sin(theta)) * r;\n    }\n\n    float computeShadowWithPCF(sampler2DShadow shadowMap, vec3 shadowCoord, vec2 shadowMapSizeAndInverse, vec2 shadowParams) {\n        float radius = shadowParams.x * shadowMapSizeAndInverse.y;\n        float phi = interleavedGradientNoise(gl_FragCoord.xy) * 6.28318530718;\n\n        float shadow = 0.0;\n        shadow += computeShadow(shadowMap, vec3(shadowCoord.xy + vogelDiskSample(0, 5, phi) * radius, shadowCoord.z));\n        shadow += computeShadow(shadowMap, vec3(shadowCoord.xy + vogelDiskSample(1, 5, phi) * radius, shadowCoord.z));\n        shadow += computeShadow(shadowMap, vec3(shadowCoord.xy + vogelDiskSample(2, 5, phi) * radius, shadowCoord.z));\n        shadow += computeShadow(shadowMap, vec3(shadowCoord.xy + vogelDiskSample(3, 5, phi) * radius, shadowCoord.z));\n        shadow += computeShadow(shadowMap, vec3(shadowCoord.xy + vogelDiskSample(4, 5, phi) * radius, shadowCoord.z));\n\n        return shadow * 0.2;\n    }\n#elif defined(USE_PCF3_SOFT_SHADOW)\n    // Shadow PCF kernel 3*3 in only 4 taps (medium quality)\n    // This uses a well distributed taps to allow a gaussian distribution covering a 3*3 kernel\n    // https://mynameismjp.wordpress.com/2013/09/10/shadow-maps/\n    float computeShadowWithPCF(sampler2DShadow shadowSampler, vec3 shadowCoord, vec2 shadowMapSizeAndInverse, vec2 shadowParams) {\n        vec2 uv = shadowCoord.xy * shadowMapSizeAndInverse.x;\t// uv in texel units\n        uv += 0.5;\t\t\t\t\t\t\t\t\t\t\t// offset of half to be in the center of the texel\n        vec2 st = fract(uv);\t\t\t\t\t\t\t\t// how far from the center\n        vec2 base_uv = floor(uv) - 0.5;\t\t\t\t\t\t// texel coord\n        base_uv *= shadowMapSizeAndInverse.y;\t\t\t\t// move back to uv coords\n\n        // Equation resolved to fit in a 3*3 distribution like \n        // 1 2 1\n        // 2 4 2 \n        // 1 2 1\n        vec2 uvw0 = 3. - 2. * st;\n        vec2 uvw1 = 1. + 2. * st;\n        vec2 u = vec2((2. - st.x) / uvw0.x - 1., st.x / uvw1.x + 1.) * shadowMapSizeAndInverse.y;\n        vec2 v = vec2((2. - st.y) / uvw0.y - 1., st.y / uvw1.y + 1.) * shadowMapSizeAndInverse.y;\n\n        float shadow = 0.;\n        shadow += uvw0.x * uvw0.y * computeShadow(shadowSampler, vec3(base_uv.xy + vec2(u[0], v[0]), shadowCoord.z));\n        shadow += uvw1.x * uvw0.y * computeShadow(shadowSampler, vec3(base_uv.xy + vec2(u[1], v[0]), shadowCoord.z));\n        shadow += uvw0.x * uvw1.y * computeShadow(shadowSampler, vec3(base_uv.xy + vec2(u[0], v[1]), shadowCoord.z));\n        shadow += uvw1.x * uvw1.y * computeShadow(shadowSampler, vec3(base_uv.xy + vec2(u[1], v[1]), shadowCoord.z));\n        shadow = shadow / 16.;\n\n        return shadow;\n    }\n#elif defined(USE_PCF5_SOFT_SHADOW)\n    // Shadow PCF kernel 5*5 in only 9 taps (high quality)\n    // This uses a well distributed taps to allow a gaussian distribution covering a 5*5 kernel\n    // https://mynameismjp.wordpress.com/2013/09/10/shadow-maps/\n    float computeShadowWithPCF(sampler2DShadow shadowSampler, vec3 shadowCoord, vec2 shadowMapSizeAndInverse, vec2 shadowParams) {\n        vec2 uv = shadowCoord.xy * shadowMapSizeAndInverse.x;\t// uv in texel units\n        uv += 0.5;\t\t\t\t\t\t\t\t\t\t\t// offset of half to be in the center of the texel\n        vec2 st = fract(uv);\t\t\t\t\t\t\t\t// how far from the center\n        vec2 base_uv = floor(uv) - 0.5;\t\t\t\t\t\t// texel coord\n        base_uv *= shadowMapSizeAndInverse.y;\t\t\t\t// move back to uv coords\n\n        // Equation resolved to fit in a 5*5 distribution like \n        // 1 2 4 2 1\n        vec2 uvw0 = 4. - 3. * st;\n        vec2 uvw1 = vec2(7.);\n        vec2 uvw2 = 1. + 3. * st;\n\n        vec3 u = vec3((3. - 2. * st.x) / uvw0.x - 2., (3. + st.x) / uvw1.x, st.x / uvw2.x + 2.) * shadowMapSizeAndInverse.y;\n        vec3 v = vec3((3. - 2. * st.y) / uvw0.y - 2., (3. + st.y) / uvw1.y, st.y / uvw2.y + 2.) * shadowMapSizeAndInverse.y;\n\n        float shadow = 0.;\n        shadow += uvw0.x * uvw0.y * computeShadow(shadowSampler, vec3(base_uv.xy + vec2(u[0], v[0]), shadowCoord.z));\n        shadow += uvw1.x * uvw0.y * computeShadow(shadowSampler, vec3(base_uv.xy + vec2(u[1], v[0]), shadowCoord.z));\n        shadow += uvw2.x * uvw0.y * computeShadow(shadowSampler, vec3(base_uv.xy + vec2(u[2], v[0]), shadowCoord.z));\n        shadow += uvw0.x * uvw1.y * computeShadow(shadowSampler, vec3(base_uv.xy + vec2(u[0], v[1]), shadowCoord.z));\n        shadow += uvw1.x * uvw1.y * computeShadow(shadowSampler, vec3(base_uv.xy + vec2(u[1], v[1]), shadowCoord.z));\n        shadow += uvw2.x * uvw1.y * computeShadow(shadowSampler, vec3(base_uv.xy + vec2(u[2], v[1]), shadowCoord.z));\n        shadow += uvw0.x * uvw2.y * computeShadow(shadowSampler, vec3(base_uv.xy + vec2(u[0], v[2]), shadowCoord.z));\n        shadow += uvw1.x * uvw2.y * computeShadow(shadowSampler, vec3(base_uv.xy + vec2(u[1], v[2]), shadowCoord.z));\n        shadow += uvw2.x * uvw2.y * computeShadow(shadowSampler, vec3(base_uv.xy + vec2(u[2], v[2]), shadowCoord.z));\n        shadow = shadow / 144.;\n\n        return shadow;\n    }\n#else\n    // Shadow PCF kernel size 1 with a single tap (lowest quality)\n    float computeShadowWithPCF(sampler2DShadow shadowSampler, vec3 shadowCoord,  vec2 shadowMapSizeAndInverse, vec2 shadowParams) {\n        return computeShadow(shadowSampler, shadowCoord);\n    }\n#endif\n\nfloat computeFallOff(float value, vec2 clipSpace, float frustumEdgeFalloff) {\n    float factor = mix(clipSpace.y * abs(clipSpace.y), dot(clipSpace, clipSpace), step(0., frustumEdgeFalloff));\n    float mask = smoothstep(1.0 - abs(frustumEdgeFalloff), 1.00000012, clamp(factor, 0., 1.));\n    return mix(value, 1.0, mask);\n}\n\nfloat getShadow(sampler2DShadow shadowMap, vec4 shadowCoord, vec2 shadowMapSize, vec2 shadowBias, vec2 shadowParams) {\n    shadowCoord.xyz /= shadowCoord.w;\n    shadowCoord.z += shadowBias.x;\n\n    bvec4 inFrustumVec = bvec4 (shadowCoord.x >= 0.0, shadowCoord.x <= 1.0, shadowCoord.y >= 0.0, shadowCoord.y <= 1.0);\n    bool inFrustum = all(inFrustumVec);\n\n    bvec2 frustumTestVec = bvec2(inFrustum, shadowCoord.z <= 1.0);\n\n    bool frustumTest = all(frustumTestVec);\n\n    float shadow = 1.0;\n\n    if (frustumTest) {\n        vec2 shadowMapSizeAndInverse = vec2(shadowMapSize.x, 1. / shadowMapSize.x);\n        shadow = computeShadowWithPCF(shadowMap, shadowCoord.xyz, shadowMapSizeAndInverse, shadowParams);\n        shadow = computeFallOff(shadow, shadowCoord.xy * 2. - 1., shadowParams.y);\n    }\n\n    return shadow;\n\n}\n\nfloat textureCubeCompare(samplerCube depths, vec3 uv, float compare) {\n    return step(compare, unpackRGBAToDepth(textureCube(depths, uv)));\n}\n\nfloat getPointShadow(samplerCube shadowMap, vec4 shadowCoord, vec2 shadowMapSize, vec2 shadowBias, vec2 shadowParams, vec2 shadowCameraRange) {\n    float shadow = 1.0;\n\n    vec3 lightToPosition = shadowCoord.xyz;\n    float lightToPositionLength = length(lightToPosition);\n\n    if (lightToPositionLength - shadowCameraRange.y <= 0.0 && lightToPositionLength - shadowCameraRange.x >= 0.0) {\n        // dp = normalized distance from light to fragment position\n        float dp = (lightToPositionLength - shadowCameraRange.x) / (shadowCameraRange.y - shadowCameraRange.x);\n        dp += shadowBias.x;\n\n        // bd3D = base direction 3D\n\t\tvec3 bd3D = normalize(lightToPosition);\n\n        #ifdef USE_HARD_SHADOW\n            shadow = textureCubeCompare(shadowMap, bd3D, dp);\n        #else\n            float texelSize = shadowParams.x * 0.5 / shadowMapSize.x;\n            vec2 offset = vec2(-1.0, 1.0) * texelSize;\n\n            shadow = (\n                textureCubeCompare(shadowMap, bd3D + offset.xyy, dp) +\n                textureCubeCompare(shadowMap, bd3D + offset.yyy, dp) +\n                textureCubeCompare(shadowMap, bd3D + offset.xyx, dp) +\n                textureCubeCompare(shadowMap, bd3D + offset.yyx, dp) +\n                textureCubeCompare(shadowMap, bd3D, dp) +\n                textureCubeCompare(shadowMap, bd3D + offset.xxy, dp) +\n                textureCubeCompare(shadowMap, bd3D + offset.yxy, dp) +\n                textureCubeCompare(shadowMap, bd3D + offset.xxx, dp) +\n                textureCubeCompare(shadowMap, bd3D + offset.yxx, dp)\n            ) * (1.0 / 9.0);\n        #endif\n    }\n\n    return shadow;\n}\n\n#ifdef USE_PCSS_SOFT_SHADOW\n    const vec3 PoissonSamplers32[64] = vec3[64](\n        vec3(0.06407013, 0.05409927, 0.),\n        vec3(0.7366577, 0.5789394, 0.),\n        vec3(-0.6270542, -0.5320278, 0.),\n        vec3(-0.4096107, 0.8411095, 0.),\n        vec3(0.6849564, -0.4990818, 0.),\n        vec3(-0.874181, -0.04579735, 0.),\n        vec3(0.9989998, 0.0009880066, 0.),\n        vec3(-0.004920578, -0.9151649, 0.),\n        vec3(0.1805763, 0.9747483, 0.),\n        vec3(-0.2138451, 0.2635818, 0.),\n        vec3(0.109845, 0.3884785, 0.),\n        vec3(0.06876755, -0.3581074, 0.),\n        vec3(0.374073, -0.7661266, 0.),\n        vec3(0.3079132, -0.1216763, 0.),\n        vec3(-0.3794335, -0.8271583, 0.),\n        vec3(-0.203878, -0.07715034, 0.),\n        vec3(0.5912697, 0.1469799, 0.),\n        vec3(-0.88069, 0.3031784, 0.),\n        vec3(0.5040108, 0.8283722, 0.),\n        vec3(-0.5844124, 0.5494877, 0.),\n        vec3(0.6017799, -0.1726654, 0.),\n        vec3(-0.5554981, 0.1559997, 0.),\n        vec3(-0.3016369, -0.3900928, 0.),\n        vec3(-0.5550632, -0.1723762, 0.),\n        vec3(0.925029, 0.2995041, 0.),\n        vec3(-0.2473137, 0.5538505, 0.),\n        vec3(0.9183037, -0.2862392, 0.),\n        vec3(0.2469421, 0.6718712, 0.),\n        vec3(0.3916397, -0.4328209, 0.),\n        vec3(-0.03576927, -0.6220032, 0.),\n        vec3(-0.04661255, 0.7995201, 0.),\n        vec3(0.4402924, 0.3640312, 0.),\n\n        vec3(0., 0., 0.),\n        vec3(0., 0., 0.),\n        vec3(0., 0., 0.),\n        vec3(0., 0., 0.),\n        vec3(0., 0., 0.),\n        vec3(0., 0., 0.),\n        vec3(0., 0., 0.),\n        vec3(0., 0., 0.),\n        vec3(0., 0., 0.),\n        vec3(0., 0., 0.),\n        vec3(0., 0., 0.),\n        vec3(0., 0., 0.),\n        vec3(0., 0., 0.),\n        vec3(0., 0., 0.),\n        vec3(0., 0., 0.),\n        vec3(0., 0., 0.),\n        vec3(0., 0., 0.),\n        vec3(0., 0., 0.),\n        vec3(0., 0., 0.),\n        vec3(0., 0., 0.),\n        vec3(0., 0., 0.),\n        vec3(0., 0., 0.),\n        vec3(0., 0., 0.),\n        vec3(0., 0., 0.),\n        vec3(0., 0., 0.),\n        vec3(0., 0., 0.),\n        vec3(0., 0., 0.),\n        vec3(0., 0., 0.),\n        vec3(0., 0., 0.),\n        vec3(0., 0., 0.),\n        vec3(0., 0., 0.),\n        vec3(0., 0., 0.)\n    );\n\n    const vec3 PoissonSamplers64[64] = vec3[64](\n        vec3(-0.613392, 0.617481, 0.),\n        vec3(0.170019, -0.040254, 0.),\n        vec3(-0.299417, 0.791925, 0.),\n        vec3(0.645680, 0.493210, 0.),\n        vec3(-0.651784, 0.717887, 0.),\n        vec3(0.421003, 0.027070, 0.),\n        vec3(-0.817194, -0.271096, 0.),\n        vec3(-0.705374, -0.668203, 0.),\n        vec3(0.977050, -0.108615, 0.),\n        vec3(0.063326, 0.142369, 0.),\n        vec3(0.203528, 0.214331, 0.),\n        vec3(-0.667531, 0.326090, 0.),\n        vec3(-0.098422, -0.295755, 0.),\n        vec3(-0.885922, 0.215369, 0.),\n        vec3(0.566637, 0.605213, 0.),\n        vec3(0.039766, -0.396100, 0.),\n        vec3(0.751946, 0.453352, 0.),\n        vec3(0.078707, -0.715323, 0.),\n        vec3(-0.075838, -0.529344, 0.),\n        vec3(0.724479, -0.580798, 0.),\n        vec3(0.222999, -0.215125, 0.),\n        vec3(-0.467574, -0.405438, 0.),\n        vec3(-0.248268, -0.814753, 0.),\n        vec3(0.354411, -0.887570, 0.),\n        vec3(0.175817, 0.382366, 0.),\n        vec3(0.487472, -0.063082, 0.),\n        vec3(-0.084078, 0.898312, 0.),\n        vec3(0.488876, -0.783441, 0.),\n        vec3(0.470016, 0.217933, 0.),\n        vec3(-0.696890, -0.549791, 0.),\n        vec3(-0.149693, 0.605762, 0.),\n        vec3(0.034211, 0.979980, 0.),\n        vec3(0.503098, -0.308878, 0.),\n        vec3(-0.016205, -0.872921, 0.),\n        vec3(0.385784, -0.393902, 0.),\n        vec3(-0.146886, -0.859249, 0.),\n        vec3(0.643361, 0.164098, 0.),\n        vec3(0.634388, -0.049471, 0.),\n        vec3(-0.688894, 0.007843, 0.),\n        vec3(0.464034, -0.188818, 0.),\n        vec3(-0.440840, 0.137486, 0.),\n        vec3(0.364483, 0.511704, 0.),\n        vec3(0.034028, 0.325968, 0.),\n        vec3(0.099094, -0.308023, 0.),\n        vec3(0.693960, -0.366253, 0.),\n        vec3(0.678884, -0.204688, 0.),\n        vec3(0.001801, 0.780328, 0.),\n        vec3(0.145177, -0.898984, 0.),\n        vec3(0.062655, -0.611866, 0.),\n        vec3(0.315226, -0.604297, 0.),\n        vec3(-0.780145, 0.486251, 0.),\n        vec3(-0.371868, 0.882138, 0.),\n        vec3(0.200476, 0.494430, 0.),\n        vec3(-0.494552, -0.711051, 0.),\n        vec3(0.612476, 0.705252, 0.),\n        vec3(-0.578845, -0.768792, 0.),\n        vec3(-0.772454, -0.090976, 0.),\n        vec3(0.504440, 0.372295, 0.),\n        vec3(0.155736, 0.065157, 0.),\n        vec3(0.391522, 0.849605, 0.),\n        vec3(-0.620106, -0.328104, 0.),\n        vec3(0.789239, -0.419965, 0.),\n        vec3(-0.545396, 0.538133, 0.),\n        vec3(-0.178564, -0.596057, 0.)\n    );\n\n    // https://stackoverflow.com/questions/4200224/random-noise-functions-for-glsl\n    float getRand(vec2 seed) {\n        return fract(sin(dot(seed.xy ,vec2(12.9898,78.233))) * 43758.5453);\n    }\n\n    // PCSS\n    // This helps to achieve a contact hardening effect on the shadow\n    // It uses 16 Taps for search and a 32 PCF taps in a randomly rotating poisson sampling disc.\n    // This is heavily inspired from http://developer.download.nvidia.com/shaderlibrary/docs/shadow_PCSS.pdf\n    // and http://developer.download.nvidia.com/whitepapers/2008/PCSS_Integration.pdf\n    float computeShadowWithPCSS(sampler2D depthSampler, sampler2DShadow shadowSampler, vec3 shadowCoord, float shadowMapSizeInverse, float lightSizeUV, int searchTapCount, int pcfTapCount, vec3[64] poissonSamplers) {\n        float depthMetric = shadowCoord.z;\n\n        float blockerDepth = 0.0;\n        float sumBlockerDepth = 0.0;\n        float numBlocker = 0.0;\n        for (int i = 0; i < searchTapCount; i++) {\n            blockerDepth = unpackRGBAToDepth(texture(depthSampler, shadowCoord.xy + (lightSizeUV * shadowMapSizeInverse * PoissonSamplers32[i].xy)));\n            if (blockerDepth < depthMetric) {\n                sumBlockerDepth += blockerDepth;\n                numBlocker++;\n            }\n        }\n\n        if (numBlocker < 1.0) {\n            return 1.0;\n        }\n        float avgBlockerDepth = sumBlockerDepth / numBlocker;\n\n        // Offset preventing aliasing on contact.\n        float AAOffset = shadowMapSizeInverse * 10.;\n        // Do not dividing by z despite being physically incorrect looks better due to the limited kernel size.\n        // float penumbraRatio = (depthMetric - avgBlockerDepth) / avgBlockerDepth;\n        float penumbraRatio = ((depthMetric - avgBlockerDepth) + AAOffset);\n        float filterRadius = penumbraRatio * lightSizeUV * shadowMapSizeInverse;\n\n        float random = getRand(shadowCoord.xy);//getRand(vPositionFromLight.xy);\n        float rotationAngle = random * 3.1415926;\n        vec2 rotationVector = vec2(cos(rotationAngle), sin(rotationAngle));\n\n        float shadow = 0.;\n        for (int i = 0; i < pcfTapCount; i++) {\n            vec3 offset = poissonSamplers[i];\n            // Rotated offset.\n            offset = vec3(offset.x * rotationVector.x - offset.y * rotationVector.y, offset.y * rotationVector.x + offset.x * rotationVector.y, 0.);\n            shadow += texture(shadowSampler, shadowCoord + offset * filterRadius);\n        }\n        shadow /= float(pcfTapCount);\n\n        // Blocker distance falloff\n        shadow = mix(shadow, 1., depthMetric - avgBlockerDepth);\n\n        return shadow;\n    }\n\n    float getShadowWithPCSS(sampler2D depthSampler, sampler2DShadow shadowMap, vec4 shadowCoord, vec2 shadowMapSize, vec2 shadowBias, vec2 shadowParams) {\n        shadowCoord.xyz /= shadowCoord.w;\n        shadowCoord.z += shadowBias.x;\n\n        bvec4 inFrustumVec = bvec4 (shadowCoord.x >= 0.0, shadowCoord.x <= 1.0, shadowCoord.y >= 0.0, shadowCoord.y <= 1.0);\n        bool inFrustum = all(inFrustumVec);\n\n        bvec2 frustumTestVec = bvec2(inFrustum, shadowCoord.z <= 1.0);\n\n        bool frustumTest = all(frustumTestVec);\n\n        float shadow = 1.0;\n\n        if (frustumTest) {\n            #ifdef USE_PCSS16_SOFT_SHADOW\n                shadow = computeShadowWithPCSS(depthSampler, shadowMap, shadowCoord.xyz, 1. / shadowMapSize.x, 0.1 * shadowMapSize.x, 16, 16, PoissonSamplers32);\n            #else\n                #ifdef USE_PCSS32_SOFT_SHADOW\n                    shadow = computeShadowWithPCSS(depthSampler, shadowMap, shadowCoord.xyz, 1. / shadowMapSize.x, 0.1 * shadowMapSize.x, 16, 32, PoissonSamplers32);\n                #else\n                    shadow = computeShadowWithPCSS(depthSampler, shadowMap, shadowCoord.xyz, 1. / shadowMapSize.x, 0.1 * shadowMapSize.x, 32, 64, PoissonSamplers64);\n                #endif\n            #endif\n\n            shadow = computeFallOff(shadow, shadowCoord.xy * 2. - 1., shadowParams.y);\n        }\n\n        return shadow;\n    }\n#endif"
  },
  {
    "path": "src/shaders/shaderChunk/shadowMap_frag.glsl",
    "content": "#ifdef USE_SHADOW\n    // outColor *= getShadowMask();\n#endif"
  },
  {
    "path": "src/shaders/shaderChunk/shadowMap_pars_frag.glsl",
    "content": "#ifdef USE_SHADOW\n\t#if NUM_DIR_SHADOWS > 0\n\t\tuniform sampler2DShadow directionalShadowMap[NUM_DIR_SHADOWS];\n\t\tvarying vec4 vDirectionalShadowCoord[NUM_DIR_SHADOWS];\n\n\t\t#ifdef USE_PCSS_SOFT_SHADOW\n\t\t\tuniform sampler2D directionalDepthMap[NUM_DIR_SHADOWS];\n\t\t#endif\n\n\t\tstruct DirectLightShadow {\n\t\t\tvec2 shadowBias;\n\t\t\tvec2 shadowMapSize;\n\t\t\tvec2 shadowParams;\n\t\t};\n\t\tuniform DirectLightShadow u_DirectionalShadow[NUM_DIR_SHADOWS];\n\t#endif\n\n\t#if NUM_POINT_SHADOWS > 0\n\t\tuniform samplerCube pointShadowMap[NUM_POINT_SHADOWS];\n\t\tvarying vec4 vPointShadowCoord[NUM_POINT_SHADOWS];\n\n\t\tstruct PointLightShadow {\n\t\t\tvec2 shadowBias;\n\t\t\tvec2 shadowMapSize;\n\t\t\tvec2 shadowParams;\n\t\t\tvec2 shadowCameraRange;\n\t\t\tfloat shadowCameraNear;\n\t\t\tfloat shadowCameraFar;\n\t\t};\n\t\tuniform PointLightShadow u_PointShadow[NUM_POINT_SHADOWS];\n\t#endif\n\n\t#if NUM_SPOT_SHADOWS > 0\n\t\tuniform sampler2DShadow spotShadowMap[NUM_SPOT_SHADOWS];\n\t\tvarying vec4 vSpotShadowCoord[NUM_SPOT_SHADOWS];\n\n\t\t#ifdef USE_PCSS_SOFT_SHADOW\n\t\t\tuniform sampler2D spotDepthMap[NUM_SPOT_SHADOWS];\n\t\t#endif\n\n\t\tstruct SpotLightShadow {\n\t\t\tvec2 shadowBias;\n\t\t\tvec2 shadowMapSize;\n\t\t\tvec2 shadowParams;\n\t\t};\n\t\tuniform SpotLightShadow u_SpotShadow[NUM_SPOT_SHADOWS];\n\t#endif\n\n\t#include <packing>\n\t#include <shadow>\n#endif"
  },
  {
    "path": "src/shaders/shaderChunk/shadowMap_pars_vert.glsl",
    "content": "#ifdef USE_SHADOW\n\t#if NUM_DIR_SHADOWS > 0\n\t\tuniform mat4 directionalShadowMatrix[NUM_DIR_SHADOWS];\n\t\tvarying vec4 vDirectionalShadowCoord[NUM_DIR_SHADOWS];\n\n\t\tstruct DirectLightShadow {\n\t\t\tvec2 shadowBias;\n\t\t\tvec2 shadowMapSize;\n\t\t\tvec2 shadowParams;\n\t\t};\n\t\tuniform DirectLightShadow u_DirectionalShadow[NUM_DIR_SHADOWS];\n\t#endif\n\n\t#if NUM_POINT_SHADOWS > 0\n\t\tuniform mat4 pointShadowMatrix[NUM_POINT_SHADOWS];\n\t\tvarying vec4 vPointShadowCoord[NUM_POINT_SHADOWS];\n\n\t\tstruct PointLightShadow {\n\t\t\tvec2 shadowBias;\n\t\t\tvec2 shadowMapSize;\n\t\t\tvec2 shadowParams;\n\t\t\tvec2 shadowCameraRange;\n\t\t\tfloat shadowCameraNear;\n\t\t\tfloat shadowCameraFar;\n\t\t};\n\t\tuniform PointLightShadow u_PointShadow[NUM_POINT_SHADOWS];\n\t#endif\n\n\t#if NUM_SPOT_SHADOWS > 0\n\t\tuniform mat4 spotShadowMatrix[NUM_SPOT_SHADOWS];\n\t\tvarying vec4 vSpotShadowCoord[NUM_SPOT_SHADOWS];\n\n\t\tstruct SpotLightShadow {\n\t\t\tvec2 shadowBias;\n\t\t\tvec2 shadowMapSize;\n\t\t\tvec2 shadowParams;\n\t\t};\n\t\tuniform SpotLightShadow u_SpotShadow[NUM_SPOT_SHADOWS];\n\t#endif\n#endif"
  },
  {
    "path": "src/shaders/shaderChunk/shadowMap_vert.glsl",
    "content": "// Use worldPosition from pvm_vert\n\n#ifdef USE_SHADOW\n\tvec3 shadowWorldNormal = (transposeMat4(inverseMat4(u_Model)) * vec4(objectNormal, 0.0)).xyz;\n\tshadowWorldNormal = normalize(shadowWorldNormal);\n\t#ifdef FLIP_SIDED\n\t\tshadowWorldNormal = -shadowWorldNormal;\n\t#endif\n\tvec4 shadowWorldPosition;\n\n\t#if NUM_DIR_SHADOWS > 0\n\t\t#pragma unroll_loop_start\n\t\tfor (int i = 0; i < NUM_DIR_SHADOWS; i++) {\n\t\t\tshadowWorldPosition = worldPosition + vec4(shadowWorldNormal * u_DirectionalShadow[i].shadowBias[1], 0);\n\t\t\tvDirectionalShadowCoord[i] = directionalShadowMatrix[i] * shadowWorldPosition;\n\t\t}\n\t\t#pragma unroll_loop_end\n\t#endif\n\n\t#if NUM_POINT_SHADOWS > 0\n\t\t#pragma unroll_loop_start\n\t\tfor (int i = 0; i < NUM_POINT_SHADOWS; i++) {\n\t\t\tshadowWorldPosition = worldPosition + vec4(shadowWorldNormal * u_PointShadow[i].shadowBias[1], 0);\n\t\t\tvPointShadowCoord[i] = pointShadowMatrix[i] * shadowWorldPosition;\n\t\t}\n\t\t#pragma unroll_loop_end\n\t#endif\n\n\t#if NUM_SPOT_SHADOWS > 0\n\t\t#pragma unroll_loop_start\n\t\tfor (int i = 0; i < NUM_SPOT_SHADOWS; i++) {\n\t\t\tshadowWorldPosition = worldPosition + vec4(shadowWorldNormal * u_SpotShadow[i].shadowBias[1], 0);\n\t\t\tvSpotShadowCoord[i] = spotShadowMatrix[i] * shadowWorldPosition;\n\t\t}\n\t\t#pragma unroll_loop_end\n\t#endif\n#endif"
  },
  {
    "path": "src/shaders/shaderChunk/skinning_pars_vert.glsl",
    "content": "#ifdef USE_SKINNING\n\n    attribute vec4 skinIndex;\n\tattribute vec4 skinWeight;\n\n    uniform mat4 bindMatrix;\n\tuniform mat4 bindMatrixInverse;\n\n    #ifdef BONE_TEXTURE\n        uniform sampler2D boneTexture;\n        uniform int boneTextureSize;\n\n        mat4 getBoneMatrix( const in float i ) {\n            float j = i * 4.0;\n            float x = mod( j, float( boneTextureSize ) );\n            float y = floor( j / float( boneTextureSize ) );\n\n            float dx = 1.0 / float( boneTextureSize );\n            float dy = 1.0 / float( boneTextureSize );\n\n            y = dy * ( y + 0.5 );\n\n            vec4 v1 = texture2D( boneTexture, vec2( dx * ( x + 0.5 ), y ) );\n            vec4 v2 = texture2D( boneTexture, vec2( dx * ( x + 1.5 ), y ) );\n            vec4 v3 = texture2D( boneTexture, vec2( dx * ( x + 2.5 ), y ) );\n            vec4 v4 = texture2D( boneTexture, vec2( dx * ( x + 3.5 ), y ) );\n\n            mat4 bone = mat4( v1, v2, v3, v4 );\n\n            return bone;\n        }\n    #else\n        uniform mat4 boneMatrices[MAX_BONES];\n\n        mat4 getBoneMatrix(const in float i) {\n            mat4 bone = boneMatrices[int(i)];\n            return bone;\n        }\n    #endif\n\n#endif"
  },
  {
    "path": "src/shaders/shaderChunk/skinning_vert.glsl",
    "content": "#ifdef USE_SKINNING\n\n    mat4 boneMatX = getBoneMatrix( skinIndex.x );\n    mat4 boneMatY = getBoneMatrix( skinIndex.y );\n    mat4 boneMatZ = getBoneMatrix( skinIndex.z );\n    mat4 boneMatW = getBoneMatrix( skinIndex.w );\n\n    vec4 skinVertex = bindMatrix * vec4(transformed, 1.0);\n\n    vec4 skinned = vec4( 0.0 );\n\tskinned += boneMatX * skinVertex * skinWeight.x;\n\tskinned += boneMatY * skinVertex * skinWeight.y;\n\tskinned += boneMatZ * skinVertex * skinWeight.z;\n\tskinned += boneMatW * skinVertex * skinWeight.w;\n\tskinned = bindMatrixInverse * skinned;\n\n    transformed = skinned.xyz / skinned.w;\n\n#endif"
  },
  {
    "path": "src/shaders/shaderChunk/skinnormal_vert.glsl",
    "content": "#ifdef USE_SKINNING\n\n    mat4 skinMatrix = mat4( 0.0 );\n    skinMatrix += skinWeight.x * boneMatX;\n    skinMatrix += skinWeight.y * boneMatY;\n    skinMatrix += skinWeight.z * boneMatZ;\n    skinMatrix += skinWeight.w * boneMatW;\n    skinMatrix = bindMatrixInverse * skinMatrix * bindMatrix;\n\n    objectNormal = vec4( skinMatrix * vec4( objectNormal, 0.0 ) ).xyz;\n\n    #ifdef USE_TANGENT\n\n\t\tobjectTangent = vec4( skinMatrix * vec4( objectTangent, 0.0 ) ).xyz;\n\n\t#endif\n\n#endif"
  },
  {
    "path": "src/shaders/shaderChunk/specularMap_frag.glsl",
    "content": "float specularStrength;\n\n#ifdef USE_SPECULARMAP\n\n\tvec4 texelSpecular = texture2D( specularMap, v_Uv );\n\tspecularStrength = texelSpecular.r;\n\n#else\n\n\tspecularStrength = 1.0;\n\n#endif"
  },
  {
    "path": "src/shaders/shaderChunk/specularMap_pars_frag.glsl",
    "content": "#ifdef USE_SPECULARMAP\n\n\tuniform sampler2D specularMap;\n\n#endif"
  },
  {
    "path": "src/shaders/shaderChunk/transpose.glsl",
    "content": "mat4 transposeMat4(mat4 inMatrix) {\n    vec4 i0 = inMatrix[0];\n    vec4 i1 = inMatrix[1];\n    vec4 i2 = inMatrix[2];\n    vec4 i3 = inMatrix[3];\n    mat4 outMatrix = mat4(\n        vec4(i0.x, i1.x, i2.x, i3.x),\n        vec4(i0.y, i1.y, i2.y, i3.y),\n        vec4(i0.z, i1.z, i2.z, i3.z),\n        vec4(i0.w, i1.w, i2.w, i3.w)\n    );\n    return outMatrix;\n}"
  },
  {
    "path": "src/shaders/shaderChunk/tsn.glsl",
    "content": "// Per-Pixel Tangent Space Normal Mapping\n// http://hacksoflife.blogspot.ch/2009/11/per-pixel-tangent-space-normal-mapping.html\nmat3 tsn(vec3 N, vec3 V, vec2 uv) {\n    vec3 q0 = dFdx(V.xyz);\n    vec3 q1 = dFdy(V.xyz);\n    vec2 st0 = dFdx(uv.xy);\n    vec2 st1 = dFdy(uv.xy);\n\n    float scale = sign(st1.y * st0.x - st0.y * st1.x);\n\n    vec3 S = normalize((q0 * st1.y - q1 * st0.y) * scale);\n    vec3 T = normalize((-q0 * st1.x + q1 * st0.x) * scale);\n    // N has been normalized\n\n    return mat3(S, T, N);\n}"
  },
  {
    "path": "src/shaders/shaderChunk/uv_pars_frag.glsl",
    "content": "#ifdef USE_UV1\n    varying vec2 v_Uv;\n#endif"
  },
  {
    "path": "src/shaders/shaderChunk/uv_pars_vert.glsl",
    "content": "#if defined(USE_UV) || defined(USE_UV1)\n    uniform mat3 uvTransform;\n#endif\n\n#ifdef USE_UV1\n    attribute vec2 a_Uv;\n    varying vec2 v_Uv;\n#endif"
  },
  {
    "path": "src/shaders/shaderChunk/uv_vert.glsl",
    "content": "#ifdef USE_UV1\n    v_Uv = (uvTransform * vec3(a_Uv, 1.)).xy;\n#endif"
  },
  {
    "path": "src/shaders/shaderLib/basic_frag.glsl",
    "content": "#include <common_frag>\n#include <uv_pars_frag>\n#include <color_pars_frag>\n#include <diffuseMap_pars_frag>\n#include <alphamap_pars_frag>\n#include <alphaTest_pars_frag>\n#include <modelPos_pars_frag>\n\n#if defined(USE_ENV_MAP) && !defined(USE_VERTEX_ENVDIR)\n    #include <normalMap_pars_frag>\n    #include <normal_pars_frag>    \n#endif\n\n#include <envMap_pars_frag>\n#include <aoMap_pars_frag>\n#include <fog_pars_frag>\n#include <logdepthbuf_pars_frag>\n#include <clippingPlanes_pars_frag>\nvoid main() {\n    #include <clippingPlanes_frag>\n    #include <logdepthbuf_frag>\n    #include <begin_frag>\n    #include <color_frag>\n    #include <diffuseMap_frag>\n    #include <alphamap_frag>\n    #include <alphaTest_frag>\n\n    ReflectedLight reflectedLight = ReflectedLight(vec3(0.0), vec3(0.0), vec3(0.0), vec3(0.0));\n    reflectedLight.indirectDiffuse += vec3(1.0);\n    #include <aoMap_frag>\n    reflectedLight.indirectDiffuse *= outColor.xyz;\n    outColor.xyz = reflectedLight.indirectDiffuse;\n\n    #if defined(USE_ENV_MAP) && !defined(USE_VERTEX_ENVDIR)\n        #include <normal_frag>\n    #endif\n\n    #include <envMap_frag>\n    #include <end_frag>\n    #include <encodings_frag>\n    #include <premultipliedAlpha_frag>\n    #include <fog_frag>\n}"
  },
  {
    "path": "src/shaders/shaderLib/basic_vert.glsl",
    "content": "#include <common_vert>\n#include <uv_pars_vert>\n#include <color_pars_vert>\n#include <diffuseMap_pars_vert>\n#include <modelPos_pars_vert>\n\n#if defined(USE_ENV_MAP) && !defined(USE_VERTEX_ENVDIR)\n    #include <normal_pars_vert>\n#endif\n\n#include <envMap_pars_vert>\n#include <aoMap_pars_vert>\n#include <alphamap_pars_vert>\n#include <morphtarget_pars_vert>\n#include <skinning_pars_vert>\n#include <logdepthbuf_pars_vert>\nvoid main() {\n    #include <begin_vert>\n    #include <morphtarget_vert>\n    #include <skinning_vert>\n    #include <pvm_vert>\n    #include <logdepthbuf_vert>\n    #include <uv_vert>\n    #include <color_vert>\n    #include <diffuseMap_vert>\n    #include <modelPos_vert>\n\n    #ifdef USE_ENV_MAP\n        #include <morphnormal_vert>\n        #include <skinnormal_vert>\n\n        #ifndef USE_VERTEX_ENVDIR\n            #include <normal_vert>\n        #endif  \n    #endif\n\n    #include <envMap_vert>\n    #include <aoMap_vert>\n    #include <alphamap_vert>\n}"
  },
  {
    "path": "src/shaders/shaderLib/depth_frag.glsl",
    "content": "#include <common_frag>\n#include <diffuseMap_pars_frag>\n#include <alphaTest_pars_frag>\n\n#include <modelPos_pars_frag>\n#include <uv_pars_frag>\n\n#include <packing>\n\n#include <logdepthbuf_pars_frag>\n#include <clippingPlanes_pars_frag>\n\nvoid main() {\n    #include <clippingPlanes_frag>\n\n    #if defined(USE_DIFFUSE_MAP) && defined(ALPHATEST)\n        vec4 texelColor = texture2D( diffuseMap, v_Uv );\n\n        float alpha = texelColor.a * u_Opacity;\n        if(alpha < u_AlphaTest) discard;\n    #endif\n\n    #include <logdepthbuf_frag>\n    \n    #ifdef DEPTH_PACKING_RGBA\n        gl_FragColor = packDepthToRGBA(gl_FragCoord.z);\n    #else\n        gl_FragColor = vec4( vec3( 1.0 - gl_FragCoord.z ), u_Opacity );\n    #endif\n}"
  },
  {
    "path": "src/shaders/shaderLib/depth_vert.glsl",
    "content": "#include <common_vert>\n#include <morphtarget_pars_vert>\n#include <skinning_pars_vert>\n#include <uv_pars_vert>\n#include <modelPos_pars_vert>\n#include <logdepthbuf_pars_vert>\nvoid main() {\n    #include <uv_vert>\n    #include <begin_vert>\n    #include <morphtarget_vert>\n    #include <skinning_vert>\n    #include <pvm_vert>\n    #include <logdepthbuf_vert>\n    #include <modelPos_vert>\n}"
  },
  {
    "path": "src/shaders/shaderLib/distance_frag.glsl",
    "content": "#include <common_frag>\nuniform float nearDistance;\nuniform float farDistance;\n#include <modelPos_pars_frag>\n#include <packing>\n#include <clippingPlanes_pars_frag>\nvoid main() {\n    #include <clippingPlanes_frag>\n    \n    float dist = length( v_modelPos - u_CameraPosition );\n\tdist = ( dist - nearDistance ) / ( farDistance - nearDistance );\n\tdist = saturate( dist ); // clamp to [ 0, 1 ]\n\n    gl_FragColor = packDepthToRGBA(dist);\n}"
  },
  {
    "path": "src/shaders/shaderLib/distance_vert.glsl",
    "content": "#include <common_vert>\n#include <modelPos_pars_vert>\n#include <morphtarget_pars_vert>\n#include <skinning_pars_vert>\nvoid main() {\n    #include <begin_vert>\n    #include <morphtarget_vert>\n    #include <skinning_vert>\n    #include <pvm_vert>\n    #include <modelPos_vert>\n}"
  },
  {
    "path": "src/shaders/shaderLib/lambert_frag.glsl",
    "content": "#define USE_LAMBERT\n\n#include <common_frag>\n#include <dithering_pars_frag>\n\nuniform vec3 emissive;\n\n#include <uv_pars_frag>\n#include <color_pars_frag>\n#include <diffuseMap_pars_frag>\n#include <normalMap_pars_frag>\n#include <alphamap_pars_frag>\n#include <alphaTest_pars_frag>\n#include <bumpMap_pars_frag>\n#include <light_pars_frag>\n#include <normal_pars_frag>\n#include <modelPos_pars_frag>\n#include <bsdfs>\n#include <envMap_pars_frag>\n#include <aoMap_pars_frag>\n#include <shadowMap_pars_frag>\n#include <fog_pars_frag>\n#include <emissiveMap_pars_frag>\n#include <logdepthbuf_pars_frag>\n#include <clippingPlanes_pars_frag>\nvoid main() {\n    #include <clippingPlanes_frag>\n    #include <logdepthbuf_frag>\n    #include <begin_frag>\n    #include <color_frag>\n    #include <diffuseMap_frag>\n    #include <alphamap_frag>\n    #include <alphaTest_frag>\n    #include <normal_frag>\n\n    ReflectedLight reflectedLight = ReflectedLight(vec3(0.0), vec3(0.0), vec3(0.0), vec3(0.0));\n    #include <light_frag>\n    #include <aoMap_frag>\n    outColor.xyz = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse;\n\n    #include <envMap_frag>\n    #include <shadowMap_frag>\n\n    vec3 totalEmissiveRadiance = emissive;\n    #include <emissiveMap_frag>\n    outColor.xyz += totalEmissiveRadiance;\n\n    #include <end_frag>\n    #include <encodings_frag>\n    #include <premultipliedAlpha_frag>\n    #include <fog_frag>\n    #include <dithering_frag>\n}"
  },
  {
    "path": "src/shaders/shaderLib/lambert_vert.glsl",
    "content": "#define USE_LAMBERT\n\n#include <common_vert>\n#include <normal_pars_vert>\n#include <uv_pars_vert>\n#include <color_pars_vert>\n#include <diffuseMap_pars_vert>\n#include <modelPos_pars_vert>\n#include <envMap_pars_vert>\n#include <aoMap_pars_vert>\n#include <alphamap_pars_vert>\n#include <emissiveMap_pars_vert>\n#include <shadowMap_pars_vert>\n#include <morphtarget_pars_vert>\n#include <skinning_pars_vert>\n#include <logdepthbuf_pars_vert>\nvoid main() {\n    #include <begin_vert>\n    #include <morphtarget_vert>\n    #include <morphnormal_vert>\n    #include <skinning_vert>\n    #include <skinnormal_vert>\n    #include <pvm_vert>\n    #include <normal_vert>\n    #include <logdepthbuf_vert>\n    #include <uv_vert>\n    #include <color_vert>\n    #include <diffuseMap_vert>\n    #include <modelPos_vert>\n    #include <envMap_vert>\n    #include <aoMap_vert>\n    #include <alphamap_vert>\n    #include <emissiveMap_vert>\n    #include <shadowMap_vert>\n}"
  },
  {
    "path": "src/shaders/shaderLib/normaldepth_frag.glsl",
    "content": "#include <common_frag>\n#include <diffuseMap_pars_frag>\n#include <alphaTest_pars_frag>\n\n#include <uv_pars_frag>\n\n#include <packing>\n#include <normal_pars_frag>\n\n#include <logdepthbuf_pars_frag>\n\nvoid main() {\n    #if defined(USE_DIFFUSE_MAP) && defined(ALPHATEST)\n        vec4 texelColor = texture2D( diffuseMap, v_Uv );\n\n        float alpha = texelColor.a * u_Opacity;\n        if(alpha < u_AlphaTest) discard;\n    #endif\n\n    #include <logdepthbuf_frag>\n\n    vec4 packedNormalDepth;\n    packedNormalDepth.xyz = normalize(v_Normal) * 0.5 + 0.5;\n    packedNormalDepth.w = gl_FragCoord.z;\n    gl_FragColor = packedNormalDepth;\n}"
  },
  {
    "path": "src/shaders/shaderLib/normaldepth_vert.glsl",
    "content": "#include <common_vert>\n\n#include <morphtarget_pars_vert>\n#include <skinning_pars_vert>\n#include <normal_pars_vert>\n#include <uv_pars_vert>\n#include <logdepthbuf_pars_vert>\nvoid main() {\n    #include <uv_vert>\n    #include <begin_vert>\n    #include <morphtarget_vert>\n    #include <morphnormal_vert>\n    #include <skinning_vert>\n    #include <skinnormal_vert>\n    #include <normal_vert>\n    #include <pvm_vert>\n    #include <logdepthbuf_vert>\n}"
  },
  {
    "path": "src/shaders/shaderLib/pbr2_frag.glsl",
    "content": "#define USE_PBR\n#define USE_PBR2\n\n#include <common_frag>\n#include <dithering_pars_frag>\n\n// if no light> this will not active\nuniform vec3 u_SpecularColor;\n#ifdef USE_SPECULARMAP\n\tuniform sampler2D specularMap;\n#endif\n\nuniform float glossiness;\n#ifdef USE_GLOSSINESSMAP\n\tuniform sampler2D glossinessMap;\n#endif\n\nuniform vec3 emissive;\n\n#include <uv_pars_frag>\n#include <color_pars_frag>\n#include <diffuseMap_pars_frag>\n#include <alphamap_pars_frag>\n#include <alphaTest_pars_frag>\n#include <normalMap_pars_frag>\n#include <bumpMap_pars_frag>\n#include <envMap_pars_frag>\n#include <aoMap_pars_frag>\n#include <light_pars_frag>\n#include <normal_pars_frag>\n#include <modelPos_pars_frag>\n#include <bsdfs>\n#include <shadowMap_pars_frag>\n#include <fog_pars_frag>\n#include <emissiveMap_pars_frag>\n#include <logdepthbuf_pars_frag>\n#include <clippingPlanes_pars_frag>\nvoid main() {\n    #include <clippingPlanes_frag>\n    #include <logdepthbuf_frag>\n    #include <begin_frag>\n    #include <color_frag>\n    #include <diffuseMap_frag>\n    #include <alphamap_frag>\n    #include <alphaTest_frag>\n    #include <normal_frag>\n\n    vec3 specularFactor = u_SpecularColor;\n    #ifdef USE_SPECULARMAP\n        vec4 texelSpecular = texture2D(specularMap, v_Uv);\n        texelSpecular = sRGBToLinear(texelSpecular);\n        // reads channel RGB, compatible with a glTF Specular-Glossiness (RGBA) texture\n        specularFactor *= texelSpecular.rgb;\n    #endif\n\n    float glossinessFactor = glossiness;\n    #ifdef USE_GLOSSINESSMAP\n        vec4 texelGlossiness = texture2D(glossinessMap, v_Uv);\n        // reads channel A, compatible with a glTF Specular-Glossiness (RGBA) texture\n        glossinessFactor *= texelGlossiness.a;\n    #endif\n\n    ReflectedLight reflectedLight = ReflectedLight(vec3(0.0), vec3(0.0), vec3(0.0), vec3(0.0));\n    #include <light_frag>\n    #include <aoMap_frag>\n    outColor.xyz = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular;\n\n    #include <shadowMap_frag>\n\n    vec3 totalEmissiveRadiance = emissive;\n    #include <emissiveMap_frag>\n    outColor.xyz += totalEmissiveRadiance;\n\n    #include <end_frag>\n    #include <encodings_frag>\n    #include <premultipliedAlpha_frag>\n    #include <fog_frag>\n    #include <dithering_frag>\n}"
  },
  {
    "path": "src/shaders/shaderLib/pbr_frag.glsl",
    "content": "#define USE_PBR\n\n#include <common_frag>\n#include <dithering_pars_frag>\n\n// if no light> this will not active\nuniform float u_Metalness;\n#ifdef USE_METALNESSMAP\n\tuniform sampler2D metalnessMap;\n#endif\n\nuniform float u_Roughness;\n#ifdef USE_ROUGHNESSMAP\n\tuniform sampler2D roughnessMap;\n#endif\n\nuniform vec3 emissive;\n\n#include <uv_pars_frag>\n#include <color_pars_frag>\n#include <diffuseMap_pars_frag>\n#include <alphamap_pars_frag>\n#include <alphaTest_pars_frag>\n#include <normalMap_pars_frag>\n#include <bumpMap_pars_frag>\n#include <envMap_pars_frag>\n#include <aoMap_pars_frag>\n#include <light_pars_frag>\n#include <normal_pars_frag>\n#include <clearcoat_pars_frag>\n#include <modelPos_pars_frag>\n#include <bsdfs>\n#include <shadowMap_pars_frag>\n#include <fog_pars_frag>\n#include <emissiveMap_pars_frag>\n#include <logdepthbuf_pars_frag>\n#include <clippingPlanes_pars_frag>\nvoid main() {\n    #include <clippingPlanes_frag>\n    #include <logdepthbuf_frag>\n    #include <begin_frag>\n    #include <color_frag>\n    #include <diffuseMap_frag>\n    #include <alphamap_frag>\n    #include <alphaTest_frag>\n    #include <normal_frag>\n\n    float roughnessFactor = u_Roughness;\n    #ifdef USE_ROUGHNESSMAP\n    \tvec4 texelRoughness = texture2D( roughnessMap, v_Uv );\n    \t// reads channel G, compatible with a combined OcclusionRoughnessMetallic (RGB) texture\n    \troughnessFactor *= texelRoughness.g;\n    #endif\n\n    float metalnessFactor = u_Metalness;\n    #ifdef USE_METALNESSMAP\n    \tvec4 texelMetalness = texture2D( metalnessMap, v_Uv );\n    \t// reads channel B, compatible with a combined OcclusionRoughnessMetallic (RGB) texture\n    \tmetalnessFactor *= texelMetalness.b;\n    #endif\n\n    ReflectedLight reflectedLight = ReflectedLight(vec3(0.0), vec3(0.0), vec3(0.0), vec3(0.0));\n    #include <light_frag>\n    #include <aoMap_frag>\n    outColor.xyz = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular;\n\n    #include <shadowMap_frag>\n\n    vec3 totalEmissiveRadiance = emissive;\n    #include <emissiveMap_frag>\n    outColor.xyz += totalEmissiveRadiance;\n\n    #include <end_frag>\n    #include <encodings_frag>\n    #include <premultipliedAlpha_frag>\n    #include <fog_frag>\n    #include <dithering_frag>\n}"
  },
  {
    "path": "src/shaders/shaderLib/pbr_vert.glsl",
    "content": "#define USE_PBR\n\n#include <common_vert>\n#include <normal_pars_vert>\n#include <uv_pars_vert>\n#include <color_pars_vert>\n#include <diffuseMap_pars_vert>\n#include <modelPos_pars_vert>\n#include <envMap_pars_vert>\n#include <aoMap_pars_vert>\n#include <alphamap_pars_vert>\n#include <emissiveMap_pars_vert>\n#include <shadowMap_pars_vert>\n#include <morphtarget_pars_vert>\n#include <skinning_pars_vert>\n#include <logdepthbuf_pars_vert>\nvoid main() {\n    #include <begin_vert>\n    #include <morphtarget_vert>\n    #include <morphnormal_vert>\n    #include <skinning_vert>\n    #include <skinnormal_vert>\n    #include <pvm_vert>\n    #include <normal_vert>\n    #include <logdepthbuf_vert>\n    #include <uv_vert>\n    #include <color_vert>\n    #include <diffuseMap_vert>\n    #include <modelPos_vert>\n    #include <envMap_vert>\n    #include <aoMap_vert>\n    #include <alphamap_vert>\n    #include <emissiveMap_vert>\n    #include <shadowMap_vert>\n}"
  },
  {
    "path": "src/shaders/shaderLib/phong_frag.glsl",
    "content": "#define USE_PHONG\n\n#include <common_frag>\n#include <dithering_pars_frag>\n\n// if no light> this will not active\nuniform float u_Specular;\nuniform vec3 u_SpecularColor;\n#include <specularMap_pars_frag>\n\nuniform vec3 emissive;\n\n#include <uv_pars_frag>\n#include <color_pars_frag>\n#include <diffuseMap_pars_frag>\n#include <alphamap_pars_frag>\n#include <alphaTest_pars_frag>\n#include <normalMap_pars_frag>\n#include <bumpMap_pars_frag>\n#include <light_pars_frag>\n#include <normal_pars_frag>\n#include <modelPos_pars_frag>\n#include <bsdfs>\n#include <envMap_pars_frag>\n#include <aoMap_pars_frag>\n#include <shadowMap_pars_frag>\n#include <fog_pars_frag>\n#include <emissiveMap_pars_frag>\n#include <logdepthbuf_pars_frag>\n#include <clippingPlanes_pars_frag>\nvoid main() {\n    #include <clippingPlanes_frag>\n    #include <logdepthbuf_frag>\n    #include <begin_frag>\n    #include <color_frag>\n    #include <diffuseMap_frag>\n    #include <alphamap_frag>\n    #include <alphaTest_frag>\n    #include <normal_frag>\n    #include <specularMap_frag>\n\n    ReflectedLight reflectedLight = ReflectedLight(vec3(0.0), vec3(0.0), vec3(0.0), vec3(0.0));\n    #include <light_frag>\n    #include <aoMap_frag>\n    outColor.xyz = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular;\n\n    #include <envMap_frag>\n    #include <shadowMap_frag>\n\n    vec3 totalEmissiveRadiance = emissive;\n    #include <emissiveMap_frag>\n    outColor.xyz += totalEmissiveRadiance;\n\n    #include <end_frag>\n    #include <encodings_frag>\n    #include <premultipliedAlpha_frag>\n    #include <fog_frag>\n    #include <dithering_frag>\n}"
  },
  {
    "path": "src/shaders/shaderLib/phong_vert.glsl",
    "content": "#define USE_PHONG\n\n#include <common_vert>\n#include <normal_pars_vert>\n#include <uv_pars_vert>\n#include <color_pars_vert>\n#include <diffuseMap_pars_vert>\n#include <modelPos_pars_vert>\n#include <envMap_pars_vert>\n#include <aoMap_pars_vert>\n#include <alphamap_pars_vert>\n#include <emissiveMap_pars_vert>\n#include <shadowMap_pars_vert>\n#include <morphtarget_pars_vert>\n#include <skinning_pars_vert>\n#include <logdepthbuf_pars_vert>\nvoid main() {\n    #include <begin_vert>\n    #include <morphtarget_vert>\n    #include <morphnormal_vert>\n    #include <skinning_vert>\n    #include <skinnormal_vert>\n    #include <pvm_vert>\n    #include <normal_vert>\n    #include <logdepthbuf_vert>\n    #include <uv_vert>\n    #include <color_vert>\n    #include <diffuseMap_vert>\n    #include <modelPos_vert>\n    #include <envMap_vert>\n    #include <aoMap_vert>\n    #include <alphamap_vert>\n    #include <emissiveMap_vert>\n    #include <shadowMap_vert>\n}"
  },
  {
    "path": "src/shaders/shaderLib/point_frag.glsl",
    "content": "#include <common_frag>\n#include <color_pars_frag>\n#include <diffuseMap_pars_frag>\n#include <fog_pars_frag>\n#include <logdepthbuf_pars_frag>\nvoid main() {\n    #include <begin_frag>\n    #include <color_frag>\n    #include <logdepthbuf_frag>\n    #ifdef USE_DIFFUSE_MAP\n        outColor *= texture2D(diffuseMap, vec2(gl_PointCoord.x, 1.0 - gl_PointCoord.y));\n    #endif\n    #include <end_frag>\n    #include <encodings_frag>\n    #include <premultipliedAlpha_frag>\n    #include <fog_frag>\n}"
  },
  {
    "path": "src/shaders/shaderLib/point_vert.glsl",
    "content": "#include <common_vert>\n#include <color_pars_vert>\n#include <logdepthbuf_pars_vert>\nuniform float u_PointSize;\nuniform vec2 u_RenderTargetSize;\nvoid main() {\n    #include <begin_vert>\n    #include <pvm_vert>\n    #include <color_vert>\n    vec4 mvPosition = u_View * u_Model * vec4(transformed, 1.0);\n    #ifdef USE_SIZEATTENUATION\n        gl_PointSize = u_PointSize * (u_RenderTargetSize.y * 0.5 / -mvPosition.z);\n    #else\n        gl_PointSize = u_PointSize;\n    #endif\n\n    #include <logdepthbuf_vert>\n}"
  },
  {
    "path": "src/webgl/WebGLAttribute.js",
    "content": "class WebGLAttribute {\n\n\tconstructor(gl, program, attributeData) {\n\t\tthis.gl = gl;\n\n\t\tthis.name = attributeData.name;\n\n\t\tthis.type = attributeData.type;\n\n\t\tthis.size = attributeData.size;\n\n\t\tthis.location = gl.getAttribLocation(program, this.name);\n\n\t\tthis.count = getAttributeCount(gl, this.type);\n\n\t\tthis.format = getAttributeFormat(gl, this.type);\n\n\t\tthis.locationSize = 1;\n\t\tif (this.type === gl.FLOAT_MAT2) this.locationSize = 2;\n\t\tif (this.type === gl.FLOAT_MAT3) this.locationSize = 3;\n\t\tif (this.type === gl.FLOAT_MAT4) this.locationSize = 4;\n\t}\n\n}\n\nfunction getAttributeCount(gl, type) {\n\tswitch (type) {\n\t\tcase gl.FLOAT:\n\t\tcase gl.INT:\n\t\tcase gl.UNSIGNED_INT:\n\t\t\treturn 1;\n\t\tcase gl.FLOAT_VEC2:\n\t\tcase gl.INT_VEC2:\n\t\t\treturn 2;\n\t\tcase gl.FLOAT_VEC3:\n\t\tcase gl.INT_VEC3:\n\t\t\treturn 3;\n\t\tcase gl.FLOAT_VEC4:\n\t\tcase gl.INT_VEC4:\n\t\t\treturn 4;\n\t\tcase gl.FLOAT_MAT2:\n\t\t\treturn 4;\n\t\tcase gl.FLOAT_MAT3:\n\t\t\treturn 9;\n\t\tcase gl.FLOAT_MAT4:\n\t\t\treturn 16;\n\t\tdefault:\n\t\t\treturn 0;\n\t}\n}\n\nfunction getAttributeFormat(gl, type) {\n\tswitch (type) {\n\t\tcase gl.FLOAT:\n\t\tcase gl.FLOAT_VEC2:\n\t\tcase gl.FLOAT_VEC3:\n\t\tcase gl.FLOAT_VEC4:\n\t\tcase gl.FLOAT_MAT2:\n\t\tcase gl.FLOAT_MAT3:\n\t\tcase gl.FLOAT_MAT4:\n\t\t\treturn gl.FLOAT;\n\t\tcase gl.INT:\n\t\tcase gl.INT_VEC2:\n\t\tcase gl.INT_VEC3:\n\t\tcase gl.INT_VEC4:\n\t\t\treturn gl.INT;\n\t\tcase gl.UNSIGNED_INT:\n\t\t\treturn gl.UNSIGNED_INT;\n\t\tdefault:\n\t\t\treturn gl.FLOAT;\n\t}\n}\n\nexport { WebGLAttribute };"
  },
  {
    "path": "src/webgl/WebGLBuffers.js",
    "content": "import { PropertyMap } from '../render/PropertyMap.js';\n\nclass WebGLBuffers extends PropertyMap {\n\n\tconstructor(prefix, gl, capabilities) {\n\t\tsuper(prefix);\n\n\t\tthis._gl = gl;\n\t\tthis._capabilities = capabilities;\n\t}\n\n\tsetBuffer(buffer, bufferType, vertexArrayBindings) {\n\t\tconst bufferProperties = this.get(buffer);\n\n\t\tconst needCreate = bufferProperties.glBuffer === undefined;\n\n\t\tif (!needCreate && bufferProperties.version === buffer.version) return;\n\n\t\t// Avoid polluting the binding state\n\t\tif (vertexArrayBindings) {\n\t\t\tvertexArrayBindings.reset();\n\t\t}\n\n\t\tif (needCreate || bufferProperties.__external) {\n\t\t\t// Because Buffer does not have a dispose interface at present,\n\t\t\t// when the version increases, the external is automatically closed\n\t\t\tthis._createGLBuffer(bufferProperties, buffer, bufferType);\n\t\t} else {\n\t\t\tthis._updateGLBuffer(bufferProperties.glBuffer, buffer, bufferType);\n\t\t\tbufferProperties.version = buffer.version;\n\t\t}\n\t}\n\n\tremoveBuffer(buffer) {\n\t\tconst gl = this._gl;\n\n\t\tconst bufferProperties = this.get(buffer);\n\n\t\tif (bufferProperties.glBuffer && !bufferProperties.__external) {\n\t\t\tgl.deleteBuffer(bufferProperties.glBuffer);\n\t\t}\n\n\t\tthis.delete(buffer);\n\t}\n\n\tsetBufferExternal(buffer, webglBuffer) {\n\t\tconst gl = this._gl;\n\n\t\tconst bufferProperties = this.get(buffer);\n\n\t\tif (!bufferProperties.__external) {\n\t\t\tif (bufferProperties.glBuffer) {\n\t\t\t\tgl.deleteBuffer(bufferProperties.glBuffer);\n\t\t\t}\n\t\t}\n\n\t\tconst type = getBufferType(gl, buffer.array);\n\n\t\tbufferProperties.glBuffer = webglBuffer;\n\t\tbufferProperties.type = type;\n\t\tbufferProperties.bytesPerElement = buffer.array.BYTES_PER_ELEMENT;\n\t\tbufferProperties.version = buffer.version;\n\n\t\tbufferProperties.__external = true;\n\t}\n\n\t_createGLBuffer(bufferProperties, buffer, bufferType) {\n\t\tconst gl = this._gl;\n\n\t\tconst array = buffer.array;\n\t\tconst usage = buffer.usage;\n\n\t\tconst glBuffer = gl.createBuffer();\n\n\t\tgl.bindBuffer(bufferType, glBuffer);\n\t\tgl.bufferData(bufferType, array, usage);\n\n\t\tbuffer.onUploadCallback();\n\n\t\tconst type = getBufferType(gl, array);\n\n\t\tbufferProperties.glBuffer = glBuffer;\n\t\tbufferProperties.type = type;\n\t\tbufferProperties.bytesPerElement = array.BYTES_PER_ELEMENT;\n\t\tbufferProperties.version = buffer.version;\n\n\t\tbufferProperties.__external = false;\n\n\t\tbuffer.updateRange.count = -1; // reset range\n\t}\n\n\t_updateGLBuffer(glBuffer, buffer, bufferType) {\n\t\tconst gl = this._gl;\n\t\tconst capabilities = this._capabilities;\n\n\t\tconst array = buffer.array;\n\t\tconst updateRange = buffer.updateRange;\n\n\t\tgl.bindBuffer(bufferType, glBuffer);\n\n\t\tif (updateRange.count === -1) {\n\t\t\t// Not using update ranges\n\t\t\tgl.bufferSubData(bufferType, 0, array);\n\t\t} else {\n\t\t\tif (capabilities.version >= 2) {\n\t\t\t\tgl.bufferSubData(bufferType, updateRange.offset * array.BYTES_PER_ELEMENT,\n\t\t\t\t\tarray, updateRange.offset, updateRange.count);\n\t\t\t} else {\n\t\t\t\tgl.bufferSubData(bufferType, updateRange.offset * array.BYTES_PER_ELEMENT,\n\t\t\t\t\tarray.subarray(updateRange.offset, updateRange.offset + updateRange.count));\n\t\t\t}\n\n\t\t\tupdateRange.count = -1; // reset range\n\t\t}\n\t}\n\n}\n\nfunction getBufferType(gl, array) {\n\tlet type;\n\n\tif (array instanceof Float32Array) {\n\t\ttype = gl.FLOAT;\n\t} else if (array instanceof Float64Array) {\n\t\tconsole.warn('Unsupported data buffer format: Float64Array.');\n\t} else if (array instanceof Uint16Array) {\n\t\ttype = gl.UNSIGNED_SHORT;\n\t} else if (array instanceof Int16Array) {\n\t\ttype = gl.SHORT;\n\t} else if (array instanceof Uint32Array) {\n\t\ttype = gl.UNSIGNED_INT;\n\t} else if (array instanceof Int32Array) {\n\t\ttype = gl.INT;\n\t} else if (array instanceof Int8Array) {\n\t\ttype = gl.BYTE;\n\t} else if (array instanceof Uint8Array) {\n\t\ttype = gl.UNSIGNED_BYTE;\n\t} else {\n\t\ttype = gl.FLOAT;\n\t}\n\n\treturn type;\n}\n\nexport { WebGLBuffers };"
  },
  {
    "path": "src/webgl/WebGLCapabilities.js",
    "content": "class WebGLCapabilities {\n\n\tconstructor(gl) {\n\t\tthis._gl = gl;\n\t\tthis._extensions = {};\n\n\t\t// webgl version\n\n\t\tthis.version = parseFloat(/^WebGL (\\d)/.exec(gl.getParameter(gl.VERSION))[1]);\n\n\t\t// texture filter anisotropic extension\n\t\t// this extension is available to both, WebGL1 and WebGL2 contexts.\n\n\t\tconst anisotropyExt = this.getExtension('EXT_texture_filter_anisotropic');\n\t\tthis.anisotropyExt = anisotropyExt;\n\t\tthis.maxAnisotropy = (anisotropyExt !== null) ? gl.getParameter(anisotropyExt.MAX_TEXTURE_MAX_ANISOTROPY_EXT) : 1;\n\n\t\t// query extension\n\n\t\tlet timerQuery = null, canUseTimestamp = false;\n\t\ttry {\n\t\t\tif (this.version > 1) {\n\t\t\t\ttimerQuery = this.getExtension('EXT_disjoint_timer_query_webgl2');\n\t\t\t\tif (timerQuery) {\n\t\t\t\t\tcanUseTimestamp = !!gl.getQuery(timerQuery.TIMESTAMP_EXT, timerQuery.QUERY_COUNTER_BITS_EXT);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\ttimerQuery = this.getExtension('EXT_disjoint_timer_query');\n\t\t\t\tif (timerQuery) {\n\t\t\t\t\tcanUseTimestamp = !!timerQuery.getQueryEXT(timerQuery.TIMESTAMP_EXT, timerQuery.QUERY_COUNTER_BITS_EXT);\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (err) {\n\t\t\tconsole.warn(err);\n\t\t}\n\t\tthis.timerQuery = timerQuery;\n\t\tthis.canUseTimestamp = canUseTimestamp;\n\n\t\t// parallel_shader_compile\n\n\t\tthis.parallelShaderCompileExt = this.getExtension('KHR_parallel_shader_compile');\n\n\t\t// others\n\n\t\tthis.maxPrecision = getMaxPrecision(gl, 'highp');\n\t\tthis.maxTextures = gl.getParameter(gl.MAX_TEXTURE_IMAGE_UNITS);\n\t\tthis.maxVertexTextures = gl.getParameter(gl.MAX_VERTEX_TEXTURE_IMAGE_UNITS);\n\t\tthis.maxTextureSize = gl.getParameter(gl.MAX_TEXTURE_SIZE);\n\t\tthis.maxCubemapSize = gl.getParameter(gl.MAX_CUBE_MAP_TEXTURE_SIZE);\n\t\tthis.maxVertexUniformVectors = gl.getParameter(gl.MAX_VERTEX_UNIFORM_VECTORS);\n\t\tthis.maxSamples = this.version > 1 ? gl.getParameter(gl.MAX_SAMPLES) : 1;\n\t\tthis.lineWidthRange = gl.getParameter(gl.ALIASED_LINE_WIDTH_RANGE);\n\t}\n\n\tgetExtension(name) {\n\t\tconst gl = this._gl;\n\t\tconst extensions = this._extensions;\n\n\t\tif (extensions[name] !== undefined) {\n\t\t\treturn extensions[name];\n\t\t}\n\n\t\tlet ext = null;\n\t\tfor (const prefix of vendorPrefixes) {\n\t\t\text = gl.getExtension(prefix + name);\n\t\t\tif (ext) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\textensions[name] = ext;\n\n\t\treturn ext;\n\t}\n\n}\n\nconst vendorPrefixes = ['', 'WEBKIT_', 'MOZ_'];\n\nfunction getMaxPrecision(gl, precision) {\n\tif (precision === 'highp') {\n\t\tif (gl.getShaderPrecisionFormat(gl.VERTEX_SHADER, gl.HIGH_FLOAT).precision > 0 &&\n\t\t\tgl.getShaderPrecisionFormat(gl.FRAGMENT_SHADER, gl.HIGH_FLOAT).precision > 0) {\n\t\t\treturn 'highp';\n\t\t}\n\t\tprecision = 'mediump';\n\t}\n\tif (precision === 'mediump') {\n\t\tif (gl.getShaderPrecisionFormat(gl.VERTEX_SHADER, gl.MEDIUM_FLOAT).precision > 0 &&\n\t\t\tgl.getShaderPrecisionFormat(gl.FRAGMENT_SHADER, gl.MEDIUM_FLOAT).precision > 0) {\n\t\t\treturn 'mediump';\n\t\t}\n\t}\n\treturn 'lowp';\n}\n\nexport { WebGLCapabilities };"
  },
  {
    "path": "src/webgl/WebGLClusteredLighting.js",
    "content": "import { PIXEL_TYPE, PIXEL_FORMAT, TEXTURE_FILTER } from '../const.js';\nimport { Texture2D } from '../resources/textures/Texture2D.js';\nimport { MathUtils } from '../math/MathUtils.js';\nimport { Sphere } from '../math/Sphere.js';\nimport { Box3 } from '../math/Box3.js';\nimport { Vector3 } from '../math/Vector3.js';\n\nclass WebGLClusteredLighting {\n\n\tconstructor(options) {\n\t\tthis.lightsTexture = new LightsTexture();\n\t\tthis.lightsTexture.initLights(options.maxClusterLights, options.useFloatPrecision ? PIXEL_TYPE.FLOAT : PIXEL_TYPE.HALF_FLOAT);\n\n\t\tthis.cellsTexture = new CellsTexture();\n\t\tthis.cellsTexture.initCells(options.gridDimensions, options.maxLightsPerCell);\n\n\t\tthis._zClip = options.zClip.clone();\n\n\t\tthis._cellsTextureEmpty = false;\n\n\t\tthis.cellsTransform = {\n\t\t\tclips: [0, 0], // near, far\n\t\t\tfactors: [0, 0, 0, 0], // logFactor1, logFactor2, persp:tan(fov/2)|ortho:-height/2, aspect\n\t\t\tperspective: true\n\t\t};\n\t}\n\n\tdispose() {\n\t\tthis._cellsTextureEmpty = false;\n\t\tthis.cellsTexture.dispose();\n\t\tthis.lightsTexture.dispose();\n\t}\n\n\tsetOptions(options) {\n\t\tthis.lightsTexture.updateLights(options.maxClusterLights, options.useFloatPrecision ? PIXEL_TYPE.FLOAT : PIXEL_TYPE.HALF_FLOAT);\n\t\tthis.cellsTexture.updateCells(options.gridDimensions, options.maxLightsPerCell);\n\t\tthis._zClip.copy(options.zClip);\n\t}\n\n\tupdate(lightingGroup, cameraData, lightsNeedsUpdate = true) {\n\t\tthis._updateCellsTransform(cameraData);\n\n\t\tthis.cellsTexture.resetLightIndices();\n\n\t\tconst cellsTable = this.cellsTexture.cellsInfo.table;\n\t\tconst cellsTransform = this.cellsTransform;\n\n\t\tlet lightIndicesWritten = false;\n\n\t\tfor (let i = 0; i < lightingGroup.pointsNum; i++) {\n\t\t\tconst pointLight = lightingGroup.point[i];\n\n\t\t\tgetPointLightBoundingSphere(pointLight, _lightSphere);\n\t\t\t_lightSphere.center.applyMatrix4(cameraData.viewMatrix);\n\t\t\t_lightSphere.center.z *= -1;\n\n\t\t\tif (getCellsRange(_lightSphere, cellsTable, cellsTransform, _cellsRange)) {\n\t\t\t\tlightIndicesWritten = this.cellsTexture.setLightIndex(_cellsRange, i) || lightIndicesWritten;\n\t\t\t\tlightsNeedsUpdate && this.lightsTexture.setPointLight(i, pointLight);\n\t\t\t}\n\t\t}\n\n\t\tfor (let i = 0; i < lightingGroup.spotsNum; i++) {\n\t\t\tconst spotLight = lightingGroup.spot[i];\n\n\t\t\tgetSpotLightBoundingSphere(spotLight, _lightSphere);\n\t\t\t_lightSphere.center.applyMatrix4(cameraData.viewMatrix);\n\t\t\t_lightSphere.center.z *= -1;\n\n\t\t\tif (getCellsRange(_lightSphere, cellsTable, cellsTransform, _cellsRange)) {\n\t\t\t\tlightIndicesWritten = this.cellsTexture.setLightIndex(_cellsRange, i + lightingGroup.pointsNum) || lightIndicesWritten;\n\t\t\t\tlightsNeedsUpdate && this.lightsTexture.setSpotLight(i + lightingGroup.pointsNum, spotLight);\n\t\t\t}\n\t\t}\n\n\t\t(lightIndicesWritten && lightsNeedsUpdate) && this.lightsTexture.version++;\n\n\t\t(lightIndicesWritten || !this._cellsTextureEmpty) && this.cellsTexture.version++;\n\t\tthis._cellsTextureEmpty = !lightIndicesWritten;\n\t}\n\n\t_updateCellsTransform(cameraData) {\n\t\tconst { clips, factors } = this.cellsTransform;\n\n\t\tthis._zClip.toArray(clips);\n\t\tclips[0] = clips[0] > 0 ? clips[0] : cameraData.near;\n\t\tclips[1] = clips[1] > 0 ? clips[1] : cameraData.far;\n\n\t\tconst cz = this.cellsTexture.cellsInfo.table[2];\n\n\t\tconst _logFarNear = Math.log(clips[1] / clips[0]);\n\t\tfactors[0] = cz / _logFarNear;\n\t\tfactors[1] = -cz * Math.log(clips[0]) / _logFarNear;\n\n\t\tconst perspective = _isPerspectiveMatrix(cameraData.projectionMatrix);\n\t\tconst elements = cameraData.projectionMatrix.elements;\n\n\t\tfactors[2] = (perspective ? 1 : -1) / elements[5]; // persp: tan(fov / 2), ortho: -height / 2\n\t\tfactors[3] = elements[5] / elements[0]; // aspect: (width / height)\n\n\t\tthis.cellsTransform.perspective = perspective;\n\t}\n\n}\n\nclass CellsTexture extends Texture2D {\n\n\tconstructor() {\n\t\tsuper();\n\n\t\tthis.format = PIXEL_FORMAT.RED;\n\t\tthis.type = PIXEL_TYPE.HALF_FLOAT;\n\t\tthis.magFilter = TEXTURE_FILTER.NEAREST;\n\t\tthis.minFilter = TEXTURE_FILTER.NEAREST;\n\t\tthis.generateMipmaps = false;\n\t\tthis.flipY = false;\n\n\t\tthis.unpackAlignment = 1;\n\n\t\tthis.cellsInfo = {\n\t\t\ttable: [],\n\t\t\tmaxLightsPerCell: 0,\n\t\t\ttextureSize: [],\n\t\t\tdotData: []\n\t\t};\n\n\t\tthis._counts = null;\n\t}\n\n\tinitCells(cellTable, maxLightsPerCell) {\n\t\tconst numCells = cellTable.x * cellTable.y * cellTable.z;\n\t\tconst numPixels = numCells * maxLightsPerCell;\n\n\t\t// TODO - better texture size calculation\n\t\tlet width = Math.ceil(Math.sqrt(numPixels));\n\t\twidth = Math.ceil(width / maxLightsPerCell) * maxLightsPerCell;\n\t\tconst height = Math.ceil(numPixels / width);\n\n\t\tconst data = new Uint16Array(width * height);\n\n\t\tthis.image = { data, width, height };\n\n\t\tcellTable.toArray(this.cellsInfo.table);\n\n\t\tthis.cellsInfo.maxLightsPerCell = maxLightsPerCell;\n\n\t\tthis.cellsInfo.textureSize[0] = width;\n\t\tthis.cellsInfo.textureSize[1] = 1 / width;\n\t\tthis.cellsInfo.textureSize[2] = 1 / height;\n\n\t\tthis.cellsInfo.dotData[0] = maxLightsPerCell;\n\t\tthis.cellsInfo.dotData[1] = cellTable.x * cellTable.z * maxLightsPerCell;\n\t\tthis.cellsInfo.dotData[2] = cellTable.x * maxLightsPerCell;\n\n\t\tthis._counts = new Int32Array(numCells);\n\t}\n\n\tupdateCells(cellTable, maxLightsPerCell) {\n\t\tconst cellsInfo = this.cellsInfo;\n\t\tif (_vec3_1.fromArray(cellsInfo.table).equals(cellTable) && cellsInfo.maxLightsPerCell === maxLightsPerCell) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.dispose();\n\t\tthis.initCells(cellTable, maxLightsPerCell);\n\t\tthis.version++;\n\t}\n\n\tresetLightIndices() {\n\t\tthis.image.data.fill(0);\n\t\tthis._counts.fill(0);\n\t}\n\n\tsetLightIndex(cellsRange, index) {\n\t\tconst data = this.image.data;\n\t\tconst counts = this._counts;\n\t\tconst { table, maxLightsPerCell } = this.cellsInfo;\n\t\tconst { min, max } = cellsRange;\n\n\t\tlet needsUpdate = false;\n\n\t\tfor (let x = min.x; x <= max.x; x++) {\n\t\t\tfor (let z = min.z; z <= max.z; z++) {\n\t\t\t\tfor (let y = min.y; y <= max.y; y++) {\n\t\t\t\t\tconst idx = x + table[0] * (z + y * table[2]);\n\t\t\t\t\tconst count = counts[idx];\n\t\t\t\t\tif (count < maxLightsPerCell) {\n\t\t\t\t\t\tconst offset = idx * maxLightsPerCell + count;\n\t\t\t\t\t\tdata[offset] = MathUtils.toHalfFloat(index + 1); // 0 is reserved for empty cell, so we offset by 1\n\t\t\t\t\t\tcounts[idx]++;\n\t\t\t\t\t\tneedsUpdate = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn needsUpdate;\n\t}\n\n}\n\nclass LightsTexture extends Texture2D {\n\n\tconstructor() {\n\t\tsuper();\n\n\t\tthis.format = PIXEL_FORMAT.RGBA;\n\t\tthis.magFilter = TEXTURE_FILTER.NEAREST;\n\t\tthis.minFilter = TEXTURE_FILTER.NEAREST;\n\t\tthis.generateMipmaps = false;\n\t\tthis.flipY = false;\n\t}\n\n\tinitLights(maxLights, type) {\n\t\tconst size = lightsTextureSize(maxLights);\n\t\tconst arrayType = type === PIXEL_TYPE.FLOAT ? Float32Array : Uint16Array;\n\t\tconst data = new arrayType(size * size * 4); // eslint-disable-line new-cap\n\n\t\tthis.image = { data, width: size, height: size };\n\t\tthis.type = type;\n\t}\n\n\tupdateLights(maxLights, type) {\n\t\tconst size = lightsTextureSize(maxLights);\n\t\tif (size === this.image.width && type === this.type) return;\n\n\t\tthis.dispose();\n\t\tthis.initLights(maxLights, type);\n\t\tthis.version++;\n\t}\n\n\tsetPointLight(index, lightInfo) {\n\t\tconst data = this.image.data;\n\t\tconst halfFloat = this.type === PIXEL_TYPE.HALF_FLOAT;\n\n\t\tconst start = index * LIGHT_STRIDE * 4;\n\t\tconst { color, decay, position, distance } = lightInfo;\n\n\t\t// pixel 0 - R: lightType, G: -, B: -, A: -\n\n\t\tdata[start + 0 * 4 + 0] = halfFloat ? MathUtils.toHalfFloat(1) : 1;\n\n\t\t// pixel 1 - R: color.r, G: color.g, B: color.b, A: decay\n\n\t\tdata[start + 1 * 4 + 0] = halfFloat ? MathUtils.toHalfFloat(color[0]) : color[0];\n\t\tdata[start + 1 * 4 + 1] = halfFloat ? MathUtils.toHalfFloat(color[1]) : color[1];\n\t\tdata[start + 1 * 4 + 2] = halfFloat ? MathUtils.toHalfFloat(color[2]) : color[2];\n\t\tdata[start + 1 * 4 + 3] = halfFloat ? MathUtils.toHalfFloat(decay) : decay;\n\n\t\t// pixel 2 - R: position.x, G: position.y, B: position.z, A: distance\n\n\t\tdata[start + 2 * 4 + 0] = halfFloat ? MathUtils.toHalfFloat(position[0]) : position[0];\n\t\tdata[start + 2 * 4 + 1] = halfFloat ? MathUtils.toHalfFloat(position[1]) : position[1];\n\t\tdata[start + 2 * 4 + 2] = halfFloat ? MathUtils.toHalfFloat(position[2]) : position[2];\n\t\tdata[start + 2 * 4 + 3] = halfFloat ? MathUtils.toHalfFloat(distance) : distance;\n\n\t\t// pixel 3 - R: -, G: -, B: -, A: -\n\t}\n\n\tsetSpotLight(index, lightInfo) {\n\t\tconst data = this.image.data;\n\t\tconst halfFloat = this.type === PIXEL_TYPE.HALF_FLOAT;\n\n\t\tconst start = index * LIGHT_STRIDE * 4;\n\t\tconst { color, decay, position, distance, direction, coneCos, penumbraCos } = lightInfo;\n\n\t\t// pixel 0 - R: lightType, G: penumbraCos, B: -, A: -\n\n\t\tdata[start + 0 * 4 + 0] = halfFloat ? MathUtils.toHalfFloat(2) : 2;\n\t\tdata[start + 0 * 4 + 1] = halfFloat ? MathUtils.toHalfFloat(penumbraCos) : penumbraCos;\n\n\t\t// pixel 1 - R: color.r, G: color.g, B: color.b, A: decay\n\n\t\tdata[start + 1 * 4 + 0] = halfFloat ? MathUtils.toHalfFloat(color[0]) : color[0];\n\t\tdata[start + 1 * 4 + 1] = halfFloat ? MathUtils.toHalfFloat(color[1]) : color[1];\n\t\tdata[start + 1 * 4 + 2] = halfFloat ? MathUtils.toHalfFloat(color[2]) : color[2];\n\t\tdata[start + 1 * 4 + 3] = halfFloat ? MathUtils.toHalfFloat(decay) : decay;\n\n\t\t// pixel 2 - R: position.x, G: position.y, B: position.z, A: distance\n\n\t\tdata[start + 2 * 4 + 0] = halfFloat ? MathUtils.toHalfFloat(position[0]) : position[0];\n\t\tdata[start + 2 * 4 + 1] = halfFloat ? MathUtils.toHalfFloat(position[1]) : position[1];\n\t\tdata[start + 2 * 4 + 2] = halfFloat ? MathUtils.toHalfFloat(position[2]) : position[2];\n\t\tdata[start + 2 * 4 + 3] = halfFloat ? MathUtils.toHalfFloat(distance) : distance;\n\n\t\t// pixel 3 - R: direction.x, G: direction.y, B: direction.z, A: coneCos\n\n\t\tdata[start + 3 * 4 + 0] = halfFloat ? MathUtils.toHalfFloat(direction[0]) : direction[0];\n\t\tdata[start + 3 * 4 + 1] = halfFloat ? MathUtils.toHalfFloat(direction[1]) : direction[1];\n\t\tdata[start + 3 * 4 + 2] = halfFloat ? MathUtils.toHalfFloat(direction[2]) : direction[2];\n\t\tdata[start + 3 * 4 + 3] = halfFloat ? MathUtils.toHalfFloat(coneCos) : coneCos;\n\t}\n\n}\n\nconst LIGHT_STRIDE = 4;\n\nconst _lightSphere = new Sphere();\nconst _cellsRange = new Box3();\nconst _vec3_1 = new Vector3();\n\nfunction getPointLightBoundingSphere(light, sphere) {\n\tsphere.center.fromArray(light.position);\n\tsphere.radius = light.distance;\n}\n\nfunction getSpotLightBoundingSphere(light, sphere) {\n\tif (light.coneCos < 0.70710678118) { // obtuse angle\n\t\t_vec3_1.fromArray(light.direction).multiplyScalar(light.distance * light.coneCos);\n\t\tsphere.center.fromArray(light.position).add(_vec3_1);\n\t\tsphere.radius = light.distance * Math.sqrt(1 - light.coneCos * light.coneCos);\n\t} else {\n\t\t_vec3_1.fromArray(light.direction).multiplyScalar(light.distance / (light.coneCos * 2));\n\t\tsphere.center.fromArray(light.position).add(_vec3_1);\n\t\tsphere.radius = light.distance / (light.coneCos * 2);\n\t}\n}\n\nfunction lightsTextureSize(maxLights) {\n\treturn Math.max(MathUtils.nextPowerOfTwo(Math.ceil(Math.sqrt(maxLights * LIGHT_STRIDE))), LIGHT_STRIDE);\n}\n\nfunction _isPerspectiveMatrix(m) {\n\treturn m.elements[11] === -1.0;\n}\n\nfunction getCellsRange(lightSphere, cellsTable, cellsTransform, cellsRange) {\n\tconst { center, radius } = lightSphere;\n\n\tconst { clips, factors, perspective } = cellsTransform;\n\n\tlet zMin = center.z - radius;\n\tconst zMax = center.z + radius;\n\n\tif (zMin > clips[1] || zMax < clips[0]) {\n\t\treturn false;\n\t}\n\n\tzMin = Math.max(zMin, clips[0]);\n\tconst zStart = Math.floor(Math.log(zMin) * factors[0] + factors[1]);\n\tconst zEnd = Math.min(Math.floor(Math.log(zMax) * factors[0] + factors[1]), cellsTable[2] - 1);\n\n\tconst halfFrustumHeight = (perspective ? Math.abs(center.z) : -1) * factors[2];\n\tconst invH = 1 / (2 * halfFrustumHeight);\n\n\tconst yMin = (center.y - radius) * invH + 0.5;\n\tconst yMax = (center.y + radius) * invH + 0.5;\n\tif (yMin > 1 || yMax < 0) {\n\t\treturn false;\n\t}\n\n\tconst yStart = Math.max(Math.floor(yMin * cellsTable[1]), 0);\n\tconst yEnd = Math.min(Math.floor(yMax * cellsTable[1]), cellsTable[1] - 1);\n\n\tconst halfFrustumWidth = halfFrustumHeight * factors[3];\n\tconst invW = 1 / (2 * halfFrustumWidth);\n\n\tconst xMin = (center.x - radius) * invW + 0.5;\n\tconst xMax = (center.x + radius) * invW + 0.5;\n\tif (xMin > 1 || xMax < 0) {\n\t\treturn false;\n\t}\n\n\tconst xStart = Math.max(Math.floor(xMin * cellsTable[0]), 0);\n\tconst xEnd = Math.min(Math.floor(xMax * cellsTable[0]), cellsTable[0] - 1);\n\n\tcellsRange.min.set(xStart, yStart, zStart);\n\tcellsRange.max.set(xEnd, yEnd, zEnd);\n\n\treturn true;\n}\n\nexport { WebGLClusteredLighting };"
  },
  {
    "path": "src/webgl/WebGLConstants.js",
    "content": "import { PIXEL_TYPE, PIXEL_FORMAT } from '../const.js';\n\nclass WebGLConstants {\n\n\tconstructor(gl, capabilities) {\n\t\tthis._gl = gl;\n\t\tthis._capabilities = capabilities;\n\t}\n\n\tgetGLType(type) {\n\t\tconst gl = this._gl;\n\t\tconst capabilities = this._capabilities;\n\t\tconst isWebGL2 = capabilities.version >= 2;\n\n\t\tif (type === PIXEL_TYPE.UNSIGNED_BYTE) return gl.UNSIGNED_BYTE;\n\t\tif (type === PIXEL_TYPE.UNSIGNED_SHORT_5_6_5) return gl.UNSIGNED_SHORT_5_6_5;\n\t\tif (type === PIXEL_TYPE.UNSIGNED_SHORT_4_4_4_4) return gl.UNSIGNED_SHORT_4_4_4_4;\n\t\tif (type === PIXEL_TYPE.UNSIGNED_SHORT_5_5_5_1) return gl.UNSIGNED_SHORT_5_5_5_1;\n\n\t\tlet extension;\n\n\t\tif (!isWebGL2) {\n\t\t\tif (type === PIXEL_TYPE.UNSIGNED_SHORT || type === PIXEL_TYPE.UNSIGNED_INT ||\n\t\t\t\ttype === PIXEL_TYPE.UNSIGNED_INT_24_8) {\n\t\t\t\textension = capabilities.getExtension('WEBGL_depth_texture');\n\t\t\t\tif (extension) {\n\t\t\t\t\tif (type === PIXEL_TYPE.UNSIGNED_SHORT) return gl.UNSIGNED_SHORT;\n\t\t\t\t\tif (type === PIXEL_TYPE.UNSIGNED_INT) return gl.UNSIGNED_INT;\n\t\t\t\t\tif (type === PIXEL_TYPE.UNSIGNED_INT_24_8) return extension.UNSIGNED_INT_24_8_WEBGL;\n\t\t\t\t} else {\n\t\t\t\t\tconsole.warn('extension WEBGL_depth_texture is not support.');\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (type === PIXEL_TYPE.FLOAT) {\n\t\t\t\textension = capabilities.getExtension('OES_texture_float');\n\t\t\t\tif (extension) {\n\t\t\t\t\treturn gl.FLOAT;\n\t\t\t\t} else {\n\t\t\t\t\tconsole.warn('extension OES_texture_float is not support.');\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (type === PIXEL_TYPE.HALF_FLOAT) {\n\t\t\t\textension = capabilities.getExtension('OES_texture_half_float');\n\t\t\t\tif (extension) {\n\t\t\t\t\treturn extension.HALF_FLOAT_OES;\n\t\t\t\t} else {\n\t\t\t\t\tconsole.warn('extension OES_texture_half_float is not support.');\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tif (type === PIXEL_TYPE.UNSIGNED_SHORT) return gl.UNSIGNED_SHORT;\n\t\t\tif (type === PIXEL_TYPE.UNSIGNED_INT) return gl.UNSIGNED_INT;\n\t\t\tif (type === PIXEL_TYPE.UNSIGNED_INT_24_8) return gl.UNSIGNED_INT_24_8;\n\t\t\tif (type === PIXEL_TYPE.FLOAT) return gl.FLOAT;\n\t\t\tif (type === PIXEL_TYPE.HALF_FLOAT) return gl.HALF_FLOAT;\n\t\t\tif (type === PIXEL_TYPE.FLOAT_32_UNSIGNED_INT_24_8_REV) return gl.FLOAT_32_UNSIGNED_INT_24_8_REV;\n\n\t\t\tif (type === PIXEL_TYPE.BYTE) return gl.BYTE;\n\t\t\tif (type === PIXEL_TYPE.SHORT) return gl.SHORT;\n\t\t\tif (type === PIXEL_TYPE.INT) return gl.INT;\n\n\t\t\t// does not include:\n\t\t\t// UNSIGNED_INT_2_10_10_10_REV\n\t\t\t// UNSIGNED_INT_10F_11F_11F_REV\n\t\t\t// UNSIGNED_INT_5_9_9_9_REV\n\t\t}\n\n\t\treturn (gl[type] !== undefined) ? gl[type] : type;\n\t}\n\n\tgetGLFormat(format) {\n\t\tconst gl = this._gl;\n\t\tconst capabilities = this._capabilities;\n\n\t\tif (format === PIXEL_FORMAT.RGB) return gl.RGB;\n\t\tif (format === PIXEL_FORMAT.RGBA) return gl.RGBA;\n\t\tif (format === PIXEL_FORMAT.ALPHA) return gl.ALPHA;\n\t\tif (format === PIXEL_FORMAT.LUMINANCE) return gl.LUMINANCE;\n\t\tif (format === PIXEL_FORMAT.LUMINANCE_ALPHA) return gl.LUMINANCE_ALPHA;\n\t\tif (format === PIXEL_FORMAT.DEPTH_COMPONENT) return gl.DEPTH_COMPONENT;\n\t\tif (format === PIXEL_FORMAT.DEPTH_STENCIL) return gl.DEPTH_STENCIL;\n\t\tif (format === PIXEL_FORMAT.RED) return gl.RED;\n\n\t\tif (format === PIXEL_FORMAT.RED_INTEGER) return gl.RED_INTEGER;\n\t\tif (format === PIXEL_FORMAT.RG) return gl.RG;\n\t\tif (format === PIXEL_FORMAT.RG_INTEGER) return gl.RG_INTEGER;\n\t\tif (format === PIXEL_FORMAT.RGB_INTEGER) return gl.RGB_INTEGER;\n\t\tif (format === PIXEL_FORMAT.RGBA_INTEGER) return gl.RGBA_INTEGER;\n\n\t\tlet extension;\n\n\t\t// S3TC\n\t\tif (format === PIXEL_FORMAT.RGB_S3TC_DXT1 || format === PIXEL_FORMAT.RGBA_S3TC_DXT1 ||\n            format === PIXEL_FORMAT.RGBA_S3TC_DXT3 || format === PIXEL_FORMAT.RGBA_S3TC_DXT5) {\n\t\t\textension = capabilities.getExtension('WEBGL_compressed_texture_s3tc');\n\t\t\tif (extension) {\n\t\t\t\tif (format === PIXEL_FORMAT.RGB_S3TC_DXT1) return extension.COMPRESSED_RGB_S3TC_DXT1_EXT;\n\t\t\t\tif (format === PIXEL_FORMAT.RGBA_S3TC_DXT1) return extension.COMPRESSED_RGBA_S3TC_DXT1_EXT;\n\t\t\t\tif (format === PIXEL_FORMAT.RGBA_S3TC_DXT3) return extension.COMPRESSED_RGBA_S3TC_DXT3_EXT;\n\t\t\t\tif (format === PIXEL_FORMAT.RGBA_S3TC_DXT5) return extension.COMPRESSED_RGBA_S3TC_DXT5_EXT;\n\t\t\t} else {\n\t\t\t\tconsole.warn('extension WEBGL_compressed_texture_s3tc is not support.');\n\t\t\t\treturn null;\n\t\t\t}\n\t\t}\n\n\t\t// PVRTC\n\t\tif (format === PIXEL_FORMAT.RGB_PVRTC_4BPPV1 || format === PIXEL_FORMAT.RGB_PVRTC_2BPPV1 ||\n            format === PIXEL_FORMAT.RGBA_PVRTC_4BPPV1 || format === PIXEL_FORMAT.RGBA_PVRTC_2BPPV1) {\n\t\t\textension = capabilities.getExtension('WEBGL_compressed_texture_pvrtc');\n\t\t\tif (extension) {\n\t\t\t\tif (format === PIXEL_FORMAT.RGB_PVRTC_4BPPV1) return extension.COMPRESSED_RGB_PVRTC_4BPPV1_IMG;\n\t\t\t\tif (format === PIXEL_FORMAT.RGB_PVRTC_2BPPV1) return extension.COMPRESSED_RGB_PVRTC_2BPPV1_IMG;\n\t\t\t\tif (format === PIXEL_FORMAT.RGBA_PVRTC_4BPPV1) return extension.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG;\n\t\t\t\tif (format === PIXEL_FORMAT.RGBA_PVRTC_2BPPV1) return extension.COMPRESSED_RGBA_PVRTC_2BPPV1_IMG;\n\t\t\t} else {\n\t\t\t\tconsole.warn('extension WEBGL_compressed_texture_pvrtc is not support.');\n\t\t\t\treturn null;\n\t\t\t}\n\t\t}\n\n\t\t// ETC1\n\t\tif (format === PIXEL_FORMAT.RGB_ETC1) {\n\t\t\textension = capabilities.getExtension('WEBGL_compressed_texture_etc1');\n\t\t\tif (extension) {\n\t\t\t\treturn extension.COMPRESSED_RGB_ETC1_WEBGL;\n\t\t\t} else {\n\t\t\t\tconsole.warn('extension WEBGL_compressed_texture_etc1 is not support.');\n\t\t\t\treturn null;\n\t\t\t}\n\t\t}\n\n\t\t// ASTC\n\t\tif (format === PIXEL_FORMAT.RGBA_ASTC_4x4) {\n\t\t\textension = capabilities.getExtension('WEBGL_compressed_texture_astc');\n\t\t\tif (extension) {\n\t\t\t\treturn extension.COMPRESSED_RGBA_ASTC_4x4_KHR;\n\t\t\t} else {\n\t\t\t\tconsole.warn('extension WEBGL_compressed_texture_astc is not support.');\n\t\t\t\treturn null;\n\t\t\t}\n\t\t}\n\n\t\t// BPTC\n\t\tif (format === PIXEL_FORMAT.RGBA_BPTC || format === PIXEL_FORMAT.RGB_BPTC_SIGNED_FORMAT || format === PIXEL_FORMAT.RGB_BPTC_UNSIGNED_FORMAT) {\n\t\t\textension = capabilities.getExtension('EXT_texture_compression_bptc');\n\t\t\tif (extension) {\n\t\t\t\tif (format === PIXEL_FORMAT.RGBA_BPTC) return extension.COMPRESSED_RGBA_BPTC_UNORM_EXT;\n\t\t\t\tif (format === PIXEL_FORMAT.RGB_BPTC_SIGNED_FORMAT) return extension.COMPRESSED_RGB_BPTC_SIGNED_FLOAT_EXT;\n\t\t\t\tif (format === PIXEL_FORMAT.RGB_BPTC_UNSIGNED_FORMAT) return extension.COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_EXT;\n\t\t\t} else {\n\t\t\t\tconsole.warn('extension EXT_texture_compression_bptc is not support.');\n\t\t\t\treturn null;\n\t\t\t}\n\t\t}\n\n\t\treturn (gl[format] !== undefined) ? gl[format] : format;\n\t}\n\n\tgetGLInternalFormat(internalFormat) {\n\t\tconst gl = this._gl;\n\t\tconst capabilities = this._capabilities;\n\n\t\tconst isWebGL2 = capabilities.version >= 2;\n\n\t\tif (internalFormat === PIXEL_FORMAT.RGBA4) return gl.RGBA4;\n\t\tif (internalFormat === PIXEL_FORMAT.RGB5_A1) return gl.RGB5_A1;\n\t\tif (internalFormat === PIXEL_FORMAT.DEPTH_COMPONENT16) return gl.DEPTH_COMPONENT16;\n\t\tif (internalFormat === PIXEL_FORMAT.STENCIL_INDEX8) return gl.STENCIL_INDEX8;\n\t\tif (internalFormat === PIXEL_FORMAT.DEPTH_STENCIL) return gl.DEPTH_STENCIL;\n\n\t\t// does not include:\n\t\t// RGB565\n\n\t\tlet extension;\n\n\t\tif (!isWebGL2) {\n\t\t\tif (internalFormat === PIXEL_FORMAT.RGBA32F || internalFormat === PIXEL_FORMAT.RGB32F) {\n\t\t\t\textension = capabilities.getExtension('WEBGL_color_buffer_float');\n\t\t\t\tif (extension) {\n\t\t\t\t\tif (internalFormat === PIXEL_FORMAT.RGBA32F) return extension.RGBA32F_EXT;\n\t\t\t\t\tif (internalFormat === PIXEL_FORMAT.RGB32F) return extension.RGB32F_EXT;\n\t\t\t\t} else {\n\t\t\t\t\tconsole.warn('extension WEBGL_color_buffer_float is not support.');\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tif (internalFormat === PIXEL_FORMAT.R8) return gl.R8;\n\t\t\tif (internalFormat === PIXEL_FORMAT.RG8) return gl.RG8;\n\t\t\tif (internalFormat === PIXEL_FORMAT.RGB8) return gl.RGB8;\n\t\t\tif (internalFormat === PIXEL_FORMAT.RGBA8) return gl.RGBA8;\n\t\t\tif (internalFormat === PIXEL_FORMAT.DEPTH_COMPONENT24) return gl.DEPTH_COMPONENT24;\n\t\t\tif (internalFormat === PIXEL_FORMAT.DEPTH_COMPONENT32F) return gl.DEPTH_COMPONENT32F;\n\t\t\tif (internalFormat === PIXEL_FORMAT.DEPTH24_STENCIL8) return gl.DEPTH24_STENCIL8;\n\t\t\tif (internalFormat === PIXEL_FORMAT.DEPTH32F_STENCIL8) return gl.DEPTH32F_STENCIL8;\n\n\t\t\t// does not include:\n\t\t\t// R8UI R8I R16UI R16I R32UI R32I RG8UI RG8I RG16UI RG16I RG32UI RG32I SRGB8_ALPHA8\n\t\t\t// RGB10_A2 RGBA8UI RGBA8I RGB10_A2UI RGBA16UI RGBA16I RGBA32I RGBA32UI\n\n\t\t\tif (internalFormat === PIXEL_FORMAT.R16F || internalFormat === PIXEL_FORMAT.RG16F ||\n\t\t\t\tinternalFormat === PIXEL_FORMAT.RGB16F || internalFormat === PIXEL_FORMAT.RGBA16F ||\n\t\t\t\tinternalFormat === PIXEL_FORMAT.R32F || internalFormat === PIXEL_FORMAT.RG32F ||\n\t\t\t\tinternalFormat === PIXEL_FORMAT.RGB32F || internalFormat === PIXEL_FORMAT.RGBA32F ||\n\t\t\t\tinternalFormat === PIXEL_FORMAT.R11F_G11F_B10F\n\t\t\t) {\n\t\t\t\textension = capabilities.getExtension('EXT_color_buffer_float');\n\t\t\t\tif (extension) {\n\t\t\t\t\tif (internalFormat === PIXEL_FORMAT.R16F) return gl.R16F;\n\t\t\t\t\tif (internalFormat === PIXEL_FORMAT.RG16F) return gl.RG16F;\n\t\t\t\t\tif (internalFormat === PIXEL_FORMAT.RGB16F) return gl.RGB16F;\n\t\t\t\t\tif (internalFormat === PIXEL_FORMAT.RGBA16F) return gl.RGBA16F;\n\t\t\t\t\tif (internalFormat === PIXEL_FORMAT.R32F) return gl.R32F;\n\t\t\t\t\tif (internalFormat === PIXEL_FORMAT.RG32F) return gl.RG32F;\n\t\t\t\t\tif (internalFormat === PIXEL_FORMAT.RGB32F) return gl.RGB32F;\n\t\t\t\t\tif (internalFormat === PIXEL_FORMAT.RGBA32F) return gl.RGBA32F;\n\t\t\t\t\tif (internalFormat === PIXEL_FORMAT.R11F_G11F_B10F) return gl.R11F_G11F_B10F;\n\t\t\t\t} else {\n\t\t\t\t\tconsole.warn('extension EXT_color_buffer_float is not support.');\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn (gl[internalFormat] !== undefined) ? gl[internalFormat] : internalFormat;\n\t}\n\n}\n\nexport { WebGLConstants };"
  },
  {
    "path": "src/webgl/WebGLGeometries.js",
    "content": "import { PropertyMap } from '../render/PropertyMap.js';\n\n// This class handles buffer creation and updating for geometries.\nclass WebGLGeometries extends PropertyMap {\n\n\tconstructor(prefix, gl, buffers, vertexArrayBindings) {\n\t\tsuper(prefix);\n\n\t\tthis._gl = gl;\n\t\tthis._buffers = buffers;\n\t\tthis._vertexArrayBindings = vertexArrayBindings;\n\n\t\tconst that = this;\n\n\t\tfunction onGeometryDispose(event) {\n\t\t\tconst geometry = event.target;\n\t\t\tconst geometryProperties = that.get(geometry);\n\n\t\t\tgeometry.removeEventListener('dispose', onGeometryDispose);\n\n\t\t\tif (geometry.index !== null) {\n\t\t\t\tbuffers.removeBuffer(geometry.index.buffer);\n\t\t\t}\n\n\t\t\tfor (const name in geometry.attributes) {\n\t\t\t\tbuffers.removeBuffer(geometry.attributes[name].buffer);\n\t\t\t}\n\n\t\t\tfor (const name in geometry.morphAttributes) {\n\t\t\t\tconst array = geometry.morphAttributes[name];\n\t\t\t\tfor (let i = 0, l = array.length; i < l; i++) {\n\t\t\t\t\tbuffers.removeBuffer(array[i].buffer);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tvertexArrayBindings.releaseByGeometry(geometry);\n\n\t\t\tgeometryProperties.created = false;\n\n\t\t\tthat.delete(geometry);\n\t\t}\n\n\t\tthis._onGeometryDispose = onGeometryDispose;\n\t}\n\n\tsetGeometry(geometry, passInfo) {\n\t\tconst gl = this._gl;\n\t\tconst buffers = this._buffers;\n\n\t\tconst geometryProperties = this.get(geometry);\n\n\t\t// If in pass rendering, skip the geometry if it has been set in this pass.\n\t\tif (geometryProperties.pass === passInfo.count) {\n\t\t\treturn;\n\t\t}\n\t\tgeometryProperties.pass = passInfo.count;\n\n\t\tif (!geometryProperties.created) {\n\t\t\tgeometry.addEventListener('dispose', this._onGeometryDispose);\n\t\t\tgeometryProperties.created = true;\n\t\t}\n\n\t\tif (geometry.index !== null) {\n\t\t\tbuffers.setBuffer(geometry.index.buffer, gl.ELEMENT_ARRAY_BUFFER, this._vertexArrayBindings);\n\t\t}\n\n\t\tfor (const name in geometry.attributes) {\n\t\t\tbuffers.setBuffer(geometry.attributes[name].buffer, gl.ARRAY_BUFFER);\n\t\t}\n\n\t\tfor (const name in geometry.morphAttributes) {\n\t\t\tconst array = geometry.morphAttributes[name];\n\t\t\tfor (let i = 0, l = array.length; i < l; i++) {\n\t\t\t\tbuffers.setBuffer(array[i].buffer, gl.ARRAY_BUFFER);\n\t\t\t}\n\t\t}\n\n\t\treturn geometryProperties;\n\t}\n\n}\n\nexport { WebGLGeometries };"
  },
  {
    "path": "src/webgl/WebGLLights.js",
    "content": "import { PropertyMap } from '../render/PropertyMap.js';\nimport { WebGLClusteredLighting } from './WebGLClusteredLighting.js';\n\nclass WebGLLights extends PropertyMap {\n\n\tconstructor(prefix, capabilities, textures) {\n\t\tsuper(prefix);\n\n\t\tconst that = this;\n\n\t\tfunction onLightingGroupDispose(event) {\n\t\t\tconst lightingGroup = event.target;\n\t\t\tconst lightingProperties = that.get(lightingGroup);\n\n\t\t\tlightingGroup.removeEventListener('dispose', onLightingGroupDispose);\n\n\t\t\tif (lightingProperties.clustered) {\n\t\t\t\tlightingProperties.clustered.dispose();\n\t\t\t}\n\n\t\t\tthat.delete(lightingGroup);\n\t\t}\n\n\t\tthis._onLightingGroupDispose = onLightingGroupDispose;\n\n\t\tthis._capabilities = capabilities;\n\t\tthis._textures = textures;\n\t}\n\n\tsetLightingGroup(lightingGroup, passInfo, options, cameraData) {\n\t\tconst lightingProperties = this.get(lightingGroup);\n\n\t\t// Skip early if this lighting group has been set in this pass.\n\t\tif (lightingProperties.pass === passInfo.count) {\n\t\t\treturn lightingProperties;\n\t\t}\n\t\tlightingProperties.pass = passInfo.count;\n\n\t\tif (lightingProperties.state === undefined) {\n\t\t\tlightingGroup.addEventListener('dispose', this._onLightingGroupDispose);\n\t\t\tlightingProperties.state = new LightingState();\n\t\t\tlightingProperties.uploadVersion = 0;\n\t\t}\n\n\t\t// Skip early if this lighting group is empty\n\t\tif (lightingGroup.totalNum === 0) {\n\t\t\treturn lightingProperties;\n\t\t}\n\n\t\tconst clusteredOptions = options.clustered;\n\t\tconst clusteredEnabled = clusteredOptions.enabled;\n\n\t\tlet clusteredLightsChanged = false;\n\n\t\tif (lightingProperties.lightingVersion !== lightingGroup.version || lightingProperties.clusteredEnabled !== clusteredEnabled) {\n\t\t\tlightingProperties.state.update(lightingGroup, clusteredEnabled);\n\t\t\tlightingProperties.uploadVersion++;\n\n\t\t\tconst hasClusteredLights = lightingProperties.state._factor[10] > 0;\n\n\t\t\tlightingProperties.lightingVersion = lightingGroup.version;\n\t\t\tlightingProperties.clusteredEnabled = clusteredEnabled;\n\t\t\tlightingProperties.hasClusteredLights = hasClusteredLights;\n\n\t\t\tclusteredLightsChanged = hasClusteredLights;\n\n\t\t\t// prepare clustered lighting\n\n\t\t\tif (hasClusteredLights && !lightingProperties.clustered) {\n\t\t\t\tlightingProperties.clustered = new WebGLClusteredLighting(clusteredOptions);\n\t\t\t\tlightingProperties.clusteredOptionVersion = clusteredOptions.version;\n\t\t\t} else if (!clusteredEnabled && lightingProperties.clustered) {\n\t\t\t\tlightingProperties.clustered.dispose();\n\t\t\t\tdelete lightingProperties.clustered;\n\t\t\t}\n\t\t}\n\n\t\tif (lightingProperties.hasClusteredLights) {\n\t\t\tif (lightingProperties.clusteredOptionVersion !== clusteredOptions.version) {\n\t\t\t\tlightingProperties.clustered.setOptions(clusteredOptions);\n\t\t\t\tlightingProperties.clusteredOptionVersion = clusteredOptions.version;\n\n\t\t\t\tclusteredLightsChanged = true;\n\t\t\t}\n\n\t\t\tlet cameraChanged = false;\n\n\t\t\tif (lightingProperties.cameraId !== cameraData.id || lightingProperties.cameraVersion !== cameraData.version) {\n\t\t\t\tlightingProperties.cameraId = cameraData.id;\n\t\t\t\tlightingProperties.cameraVersion = cameraData.version;\n\n\t\t\t\tcameraChanged = true;\n\t\t\t}\n\n\t\t\tif (clusteredLightsChanged || cameraChanged) {\n\t\t\t\tlightingProperties.clustered.update(lightingGroup, cameraData, clusteredLightsChanged);\n\t\t\t}\n\t\t}\n\n\t\treturn lightingProperties;\n\t}\n\n\tuploadUniforms(program, lightingGroup, disableShadowSampler) {\n\t\tconst lightingGroupProperties = this.get(lightingGroup);\n\n\t\tlet refresh = false;\n\t\tif (program.lightId !== lightingGroup.id || program.lightVersion !== lightingGroupProperties.uploadVersion) {\n\t\t\trefresh = true;\n\t\t\tprogram.lightId = lightingGroup.id;\n\t\t\tprogram.lightVersion = lightingGroupProperties.uploadVersion;\n\t\t}\n\n\t\tconst uniforms = program.getUniforms();\n\t\tconst capabilities = this._capabilities;\n\t\tconst textures = this._textures;\n\n\t\tconst lightingFactor = lightingGroupProperties.state._factor;\n\n\t\tif (lightingFactor[0] && refresh) {\n\t\t\tuniforms.set('u_AmbientLightColor', lightingGroup.ambient);\n\t\t}\n\t\tif (lightingFactor[1] && refresh) {\n\t\t\tuniforms.set('u_SphericalHarmonicsLightData', lightingGroup.sh);\n\t\t}\n\t\tif (lightingFactor[2] > 0 && refresh) {\n\t\t\tuniforms.set('u_Hemi', lightingGroup.hemisphere);\n\t\t}\n\n\t\tif (lightingFactor[3] > 0) {\n\t\t\tif (refresh) uniforms.set('u_Directional', lightingGroup.directional);\n\n\t\t\tif (lightingFactor[7] > 0) {\n\t\t\t\tif (refresh) uniforms.set('u_DirectionalShadow', lightingGroup.directionalShadow);\n\n\t\t\t\tif (uniforms.has('directionalShadowMap')) {\n\t\t\t\t\tif (capabilities.version >= 2 && !disableShadowSampler) {\n\t\t\t\t\t\tuniforms.set('directionalShadowMap', lightingGroup.directionalShadowDepthMap, textures);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tuniforms.set('directionalShadowMap', lightingGroup.directionalShadowMap, textures);\n\t\t\t\t\t}\n\t\t\t\t\tuniforms.set('directionalShadowMatrix', lightingGroup.directionalShadowMatrix);\n\t\t\t\t}\n\n\t\t\t\tif (uniforms.has('directionalDepthMap')) {\n\t\t\t\t\tuniforms.set('directionalDepthMap', lightingGroup.directionalShadowMap, textures);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (lightingFactor[4] > 0) {\n\t\t\tif (refresh) uniforms.set('u_Point', lightingGroup.point);\n\n\t\t\tif (lightingFactor[8] > 0) {\n\t\t\t\tif (refresh) uniforms.set('u_PointShadow', lightingGroup.pointShadow);\n\n\t\t\t\tif (uniforms.has('pointShadowMap')) {\n\t\t\t\t\tuniforms.set('pointShadowMap', lightingGroup.pointShadowMap, textures);\n\t\t\t\t\tuniforms.set('pointShadowMatrix', lightingGroup.pointShadowMatrix);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (lightingFactor[5] > 0) {\n\t\t\tif (refresh) uniforms.set('u_Spot', lightingGroup.spot);\n\n\t\t\tif (lightingFactor[9] > 0) {\n\t\t\t\tif (refresh) uniforms.set('u_SpotShadow', lightingGroup.spotShadow);\n\n\t\t\t\tif (uniforms.has('spotShadowMap')) {\n\t\t\t\t\tif (capabilities.version >= 2 && !disableShadowSampler) {\n\t\t\t\t\t\tuniforms.set('spotShadowMap', lightingGroup.spotShadowDepthMap, textures);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tuniforms.set('spotShadowMap', lightingGroup.spotShadowMap, textures);\n\t\t\t\t\t}\n\t\t\t\t\tuniforms.set('spotShadowMatrix', lightingGroup.spotShadowMatrix);\n\t\t\t\t}\n\n\t\t\t\tif (uniforms.has('spotDepthMap')) {\n\t\t\t\t\tuniforms.set('spotDepthMap', lightingGroup.spotShadowMap, textures);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (lightingFactor[6] > 0) {\n\t\t\tif (refresh) uniforms.set('u_RectArea', lightingGroup.rectArea);\n\n\t\t\tif (lightingGroup.LTC1 && lightingGroup.LTC2) {\n\t\t\t\tuniforms.set('ltc_1', lightingGroup.LTC1, textures);\n\t\t\t\tuniforms.set('ltc_2', lightingGroup.LTC2, textures);\n\t\t\t} else {\n\t\t\t\tconsole.warn('WebGLRenderer: RectAreaLight.LTC1 and LTC2 need to be set before use.');\n\t\t\t}\n\t\t}\n\n\t\tif (lightingFactor[10] > 0) {\n\t\t\tconst clusteredLighting = lightingGroupProperties.clustered;\n\t\t\tconst cellsInfo = clusteredLighting.cellsTexture.cellsInfo;\n\n\t\t\tuniforms.set('maxLightsPerCell', cellsInfo.maxLightsPerCell);\n\n\t\t\tuniforms.set('cells', cellsInfo.table);\n\t\t\tuniforms.set('cellsDotData', cellsInfo.dotData);\n\t\t\tuniforms.set('cellsTextureSize', cellsInfo.textureSize);\n\t\t\tuniforms.set('cellsTransformFactors', clusteredLighting.cellsTransform.factors);\n\n\t\t\tuniforms.set('lightsTexture', clusteredLighting.lightsTexture, textures);\n\t\t\tuniforms.set('cellsTexture', clusteredLighting.cellsTexture, textures);\n\t\t}\n\t}\n\n}\n\nclass LightingState {\n\n\tconstructor() {\n\t\tthis._factor = new Uint16Array(11);\n\n\t\tthis._totalNum = 0;\n\t\tthis._shadowsNum = 0;\n\t}\n\n\tupdate(lightingGroup, clusteredEnabled) {\n\t\tconst selfFactor = this._factor;\n\n\t\tselfFactor[0] = lightingGroup.useAmbient ? 1 : 0;\n\t\tselfFactor[1] = lightingGroup.useSphericalHarmonics ? 1 : 0;\n\t\tselfFactor[2] = lightingGroup.hemisNum;\n\t\tselfFactor[3] = lightingGroup.directsNum;\n\t\tselfFactor[4] = lightingGroup.pointsNum;\n\t\tselfFactor[5] = lightingGroup.spotsNum;\n\t\tselfFactor[6] = lightingGroup.rectAreaNum;\n\t\tselfFactor[7] = lightingGroup.directShadowNum;\n\t\tselfFactor[8] = lightingGroup.pointShadowNum;\n\t\tselfFactor[9] = lightingGroup.spotShadowNum;\n\t\tselfFactor[10] = 0;\n\n\t\tthis._totalNum = lightingGroup.totalNum;\n\t\tthis._shadowsNum = lightingGroup.shadowsNum;\n\n\t\tif (clusteredEnabled) {\n\t\t\tconst clusteredPointsNum = selfFactor[4] - selfFactor[8];\n\t\t\tconst clusteredSpotsNum = selfFactor[5] - selfFactor[9];\n\n\t\t\tselfFactor[4] = selfFactor[8];\n\t\t\tselfFactor[5] = selfFactor[9];\n\n\t\t\tselfFactor[10] = (clusteredPointsNum + clusteredSpotsNum) > 0 ? 1 : 0;\n\t\t}\n\t}\n\n\tcompare(factor) {\n\t\tif (!factor) {\n\t\t\treturn false;\n\t\t}\n\n\t\tconst selfFactor = this._factor;\n\t\tfor (let i = 0, l = factor.length; i < l; i++) {\n\t\t\tif (selfFactor[i] !== factor[i]) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\treturn true;\n\t}\n\n\tcopyTo(factor) {\n\t\tconst selfFactor = this._factor;\n\t\tif (!factor) {\n\t\t\tfactor = new selfFactor.constructor(this._factor.length);\n\t\t}\n\t\tfactor.set(selfFactor);\n\t\treturn factor;\n\t}\n\n\thasLight() {\n\t\treturn this._totalNum > 0;\n\t}\n\n\thasShadow() {\n\t\treturn this._shadowsNum > 0;\n\t}\n\n\tsetProgramProps(props, receiveShadow) {\n\t\tconst selfFactor = this._factor;\n\n\t\tprops.useAmbientLight = selfFactor[0];\n\t\tprops.useSphericalHarmonicsLight = selfFactor[1];\n\t\tprops.hemisphereLightNum = selfFactor[2];\n\t\tprops.directLightNum = selfFactor[3];\n\t\tprops.pointLightNum = selfFactor[4];\n\t\tprops.spotLightNum = selfFactor[5];\n\t\tprops.rectAreaLightNum = selfFactor[6];\n\t\tprops.directShadowNum = receiveShadow ? selfFactor[7] : 0;\n\t\tprops.pointShadowNum = receiveShadow ? selfFactor[8] : 0;\n\t\tprops.spotShadowNum = receiveShadow ? selfFactor[9] : 0;\n\n\t\tprops.useClusteredLights = selfFactor[10];\n\n\t\tprops.useShadow = this._shadowsNum > 0 && receiveShadow;\n\t}\n\n}\n\nexport { WebGLLights };"
  },
  {
    "path": "src/webgl/WebGLMaterials.js",
    "content": "import { PropertyMap } from '../render/PropertyMap.js';\n\nclass WebGLMaterials extends PropertyMap {\n\n\tconstructor(prefix, programs, vertexArrayBindings) {\n\t\tsuper(prefix);\n\n\t\tconst that = this;\n\n\t\tfunction onMaterialDispose(event) {\n\t\t\tconst material = event.target;\n\t\t\tconst materialProperties = that.get(material);\n\n\t\t\tmaterial.removeEventListener('dispose', onMaterialDispose);\n\n\t\t\tconst programList = materialProperties.programList;\n\n\t\t\tif (programList !== undefined) {\n\t\t\t\tfor (let i = 0, l = programList.length; i < l; i++) {\n\t\t\t\t\tconst program = programList[i];\n\n\t\t\t\t\tvertexArrayBindings.releaseByProgram(program);\n\t\t\t\t\tprograms.releaseProgram(program);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthat.delete(material);\n\t\t}\n\n\t\tthis._onMaterialDispose = onMaterialDispose;\n\n\t\tthis._programs = programs;\n\t\tthis._vertexArrayBindings = vertexArrayBindings;\n\t}\n\n\tsetMaterial(material) {\n\t\tconst materialProperties = this.get(material);\n\n\t\tif (materialProperties.programList === undefined) {\n\t\t\tmaterial.addEventListener('dispose', this._onMaterialDispose);\n\n\t\t\tmaterialProperties.programList = [];\n\t\t}\n\n\t\t// Set other material properties in renderer\n\n\t\treturn materialProperties;\n\t}\n\n\tupdateProgram(material, object, lightingState, renderStates, shaderCompileOptions) {\n\t\tconst programs = this._programs;\n\t\tconst vertexArrayBindings = this._vertexArrayBindings;\n\n\t\tconst materialProperties = this.get(material);\n\n\t\tconst props = programs.generateProps(material, object, lightingState, renderStates);\n\t\tconst programCode = programs.generateProgramCode(props, material);\n\n\t\tconst programList = materialProperties.programList;\n\n\t\tlet targetProgram = findProgram(programList, programCode);\n\n\t\tif (targetProgram === null) {\n\t\t\ttargetProgram = programs.getProgram(material, props, programCode, shaderCompileOptions);\n\t\t\tprogramList.unshift(targetProgram);\n\n\t\t\tif (programList.length > shaderCompileOptions.maxMaterialPrograms) {\n\t\t\t\t// release the last program\n\t\t\t\tconst lastProgram = programList.pop();\n\t\t\t\tvertexArrayBindings.releaseByProgram(lastProgram);\n\t\t\t\tprograms.releaseProgram(lastProgram);\n\t\t\t}\n\t\t}\n\n\t\tmaterialProperties.currentProgram = targetProgram;\n\t}\n\n}\n\nfunction findProgram(list, code) {\n\tlet index = 0, target = null;\n\n\tfor (let l = list.length; index < l; index++) {\n\t\tconst program = list[index];\n\n\t\tif (program.code === code) {\n\t\t\ttarget = program;\n\t\t\tbreak;\n\t\t}\n\t}\n\n\t// move to the first\n\tif (target !== null && index > 0) {\n\t\tfor (let i = index; i > 0; i--) {\n\t\t\tlist[i] = list[i - 1];\n\t\t}\n\t\tlist[0] = target;\n\t}\n\n\treturn target;\n}\n\nexport { WebGLMaterials };"
  },
  {
    "path": "src/webgl/WebGLProgram.js",
    "content": "import { WebGLUniforms } from './WebGLUniforms.js';\nimport { WebGLAttribute } from './WebGLAttribute.js';\n\nlet programIdCount = 0;\n\nclass WebGLProgram {\n\n\tconstructor(gl, vshader, fshader) {\n\t\tthis.gl = gl;\n\t\tthis.vshaderSource = vshader;\n\t\tthis.fshaderSource = fshader;\n\n\t\tthis.id = programIdCount++;\n\t\tthis.usedTimes = 1;\n\n\t\tthis.code = '';\n\t\tthis.name = '';\n\n\t\tthis.lightId = -1;\n\t\tthis.lightVersion = -1;\n\t\tthis.cameraId = -1;\n\t\tthis.cameraVersion = -1;\n\t\tthis.sceneId = -1;\n\t\tthis.sceneVersion = -1;\n\n\t\tthis.program;\n\n\t\tthis._checkErrors = true;\n\t\tthis._compileAsynchronously = false;\n\t\tthis._status = 0;\n\n\t\tlet program, vertexShader, fragmentShader;\n\n\t\t// compile program\n\t\tthis.compile = function(options) {\n\t\t\t// create shaders\n\n\t\t\tvertexShader = loadShader(gl, gl.VERTEX_SHADER, vshader);\n\t\t\tfragmentShader = loadShader(gl, gl.FRAGMENT_SHADER, fshader);\n\n\t\t\t// create a program object\n\n\t\t\tprogram = gl.createProgram();\n\t\t\tgl.attachShader(program, vertexShader);\n\t\t\tgl.attachShader(program, fragmentShader);\n\t\t\tgl.linkProgram(program);\n\n\t\t\tthis.program = program;\n\n\t\t\t// set properties\n\n\t\t\tthis._checkErrors = options.checkErrors;\n\t\t\tthis._compileAsynchronously = options.compileAsynchronously;\n\t\t\tthis._status = 1;\n\n\t\t\t// here we can delete shaders,\n\t\t\t// according to the documentation: https://www.opengl.org/sdk/docs/man/html/glLinkProgram.xhtml\n\n\t\t\tgl.deleteShader(vertexShader);\n\t\t\tgl.deleteShader(fragmentShader);\n\t\t};\n\n\t\t// check if program is ready to be used\n\t\tthis.isReady = function(parallelShaderCompileExt) {\n\t\t\tif (this._status === 1) {\n\t\t\t\tif (this._compileAsynchronously && parallelShaderCompileExt) {\n\t\t\t\t\tif (gl.getProgramParameter(program, parallelShaderCompileExt.COMPLETION_STATUS_KHR)) {\n\t\t\t\t\t\tthis._status = 2;\n\t\t\t\t\t\tthis._tryCheckErrors();\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tthis._status = 2;\n\t\t\t\t\tthis._tryCheckErrors();\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn this._status === 2;\n\t\t};\n\n\t\tthis._tryCheckErrors = function() {\n\t\t\tif (!this._checkErrors) return;\n\n\t\t\tif (gl.getProgramParameter(program, gl.LINK_STATUS) === false) {\n\t\t\t\tconst programLog = gl.getProgramInfoLog(program).trim();\n\n\t\t\t\tconst vertexErrors = getShaderErrors(gl, vertexShader, 'VERTEX');\n\t\t\t\tconst fragmentErrors = getShaderErrors(gl, fragmentShader, 'FRAGMENT');\n\n\t\t\t\tthis.program = undefined;\n\t\t\t\tthis._status = 0;\n\n\t\t\t\tconsole.error(\n\t\t\t\t\t'Shader Error ' + gl.getError() + ' - ' +\n\t\t\t\t\t'VALIDATE_STATUS ' + gl.getProgramParameter(program, gl.VALIDATE_STATUS) + '\\n\\n' +\n\t\t\t\t\t'Shader Name: ' + this.name + '\\n' +\n\t\t\t\t\t'Program Info Log: ' + programLog + '\\n' +\n\t\t\t\t\tvertexErrors + '\\n' +\n\t\t\t\t\tfragmentErrors\n\t\t\t\t);\n\t\t\t}\n\t\t};\n\n\t\t// set up caching for uniforms\n\n\t\tlet cachedUniforms;\n\n\t\tthis.getUniforms = function() {\n\t\t\tif (cachedUniforms === undefined) {\n\t\t\t\tcachedUniforms = new WebGLUniforms(gl, program);\n\t\t\t}\n\t\t\treturn cachedUniforms;\n\t\t};\n\n\t\t// set up caching for attributes\n\n\t\tlet cachedAttributes;\n\n\t\tthis.getAttributes = function() {\n\t\t\tif (cachedAttributes === undefined) {\n\t\t\t\tcachedAttributes = extractAttributes(gl, program);\n\t\t\t}\n\t\t\treturn cachedAttributes;\n\t\t};\n\n\t\t// free program\n\n\t\tthis.dispose = function() {\n\t\t\tgl.deleteProgram(program);\n\t\t\tthis.program = undefined;\n\t\t\tthis._status = 0;\n\t\t};\n\t}\n\n}\n\nfunction handleSource(string, errorLine) {\n\tconst lines = string.split('\\n');\n\tconst lines2 = [];\n\n\tconst from = Math.max(errorLine - 6, 0);\n\tconst to = Math.min(errorLine + 6, lines.length);\n\n\tfor (let i = from; i < to; i++) {\n\t\tconst line = i + 1;\n\t\tlines2.push(`${line === errorLine ? '>' : ' '} ${line}: ${lines[i]}`);\n\t}\n\n\treturn lines2.join('\\n');\n}\n\nfunction loadShader(gl, type, source) {\n\tconst shader = gl.createShader(type);\n\tgl.shaderSource(shader, source);\n\tgl.compileShader(shader);\n\treturn shader;\n}\n\nfunction getShaderErrors(gl, shader, type) {\n\tconst status = gl.getShaderParameter(shader, gl.COMPILE_STATUS);\n\tconst errors = gl.getShaderInfoLog(shader).trim();\n\n\tif (status && errors === '') return '';\n\n\tconst errorMatches = /ERROR: 0:(\\d+)/.exec(errors);\n\n\tif (errorMatches) {\n\t\t// --enable-privileged-webgl-extension\n\t\t// console.log( '**' + type + '**', gl.getExtension( 'WEBGL_debug_shaders' ).getTranslatedShaderSource( shader ) );\n\n\t\tconst errorLine = parseInt(errorMatches[1]);\n\t\treturn type + '\\n\\n' + errors + '\\n\\n' + handleSource(gl.getShaderSource(shader), errorLine);\n\t} else {\n\t\treturn errors;\n\t}\n}\n\n// extract attributes\nfunction extractAttributes(gl, program) {\n\tconst attributes = {};\n\n\tconst totalAttributes = gl.getProgramParameter(program, gl.ACTIVE_ATTRIBUTES);\n\n\tfor (let i = 0; i < totalAttributes; i++) {\n\t\tconst attribData = gl.getActiveAttrib(program, i);\n\t\tattributes[attribData.name] = new WebGLAttribute(gl, program, attribData);\n\t}\n\n\treturn attributes;\n}\n\nexport { WebGLProgram };"
  },
  {
    "path": "src/webgl/WebGLPrograms.js",
    "content": "import { WebGLProgram } from './WebGLProgram.js';\nimport { MATERIAL_TYPE, TEXEL_ENCODING_TYPE, SHADOW_TYPE, SHADING_TYPE, VERTEX_COLOR, DRAW_SIDE } from '../const.js';\nimport { ShaderChunk } from '../shaders/ShaderChunk.js';\nimport { ShaderLib } from '../shaders/ShaderLib.js';\n\nclass WebGLPrograms {\n\n\tconstructor(gl, state, capabilities) {\n\t\tthis._gl = gl;\n\t\tthis._state = state;\n\t\tthis._capabilities = capabilities;\n\n\t\tthis._programs = [];\n\t}\n\n\tgetProgram(material, props, programCode, compileOptions) {\n\t\tconst programs = this._programs;\n\n\t\tlet program;\n\n\t\tfor (let p = 0, pl = programs.length; p < pl; p++) {\n\t\t\tconst programInfo = programs[p];\n\t\t\tif (programInfo.code === programCode) {\n\t\t\t\tprogram = programInfo;\n\t\t\t\t++program.usedTimes;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tif (program === undefined) {\n\t\t\tconst customDefines = generateDefines(material.defines);\n\n\t\t\tconst vertexShader = ShaderLib[material.type + '_vert'] || material.vertexShader || ShaderLib.basic_vert;\n\t\t\tconst fragmentShader = ShaderLib[material.type + '_frag'] || material.fragmentShader || ShaderLib.basic_frag;\n\n\t\t\tprogram = createProgram(this._gl, customDefines, props, vertexShader, fragmentShader);\n\t\t\tprogram.name = props.shaderName;\n\t\t\tprogram.compile(compileOptions);\n\t\t\tprogram.code = programCode;\n\n\t\t\tprograms.push(program);\n\t\t}\n\n\t\treturn program;\n\t}\n\n\treleaseProgram(program) {\n\t\tif (--program.usedTimes === 0) {\n\t\t\tconst programs = this._programs;\n\n\t\t\t// Remove from unordered set\n\t\t\tconst index = programs.indexOf(program);\n\t\t\tprograms[index] = programs[programs.length - 1];\n\t\t\tprograms.pop();\n\n\t\t\t// Free WebGL resources\n\t\t\tprogram.dispose(this._gl);\n\t\t}\n\t}\n\n\tgenerateProps(material, object, lightingState, renderStates) {\n\t\tconst state = this._state;\n\t\tconst capabilities = this._capabilities;\n\n\t\tconst fog = material.fog ? renderStates.scene.fog : null;\n\t\tconst envMap = material.envMap !== undefined ? (material.envMap || renderStates.scene.environment) : null;\n\t\tconst logarithmicDepthBuffer = renderStates.scene.logarithmicDepthBuffer;\n\t\tconst disableShadowSampler = renderStates.scene.disableShadowSampler;\n\t\tconst numClippingPlanes = (material.clippingPlanes && material.clippingPlanes.length > 0) ? material.clippingPlanes.length : renderStates.scene.numClippingPlanes;\n\n\t\tconst HAS_CLEARCOAT = material.clearcoat > 0;\n\n\t\tconst HAS_DIFFUSEMAP = !!material.diffuseMap;\n\t\tconst HAS_ALPHAMAP = !!material.alphaMap;\n\t\tconst HAS_EMISSIVEMAP = !!material.emissiveMap;\n\t\tconst HAS_AOMAP = !!material.aoMap;\n\t\tconst HAS_NORMALMAP = !!material.normalMap;\n\t\tconst HAS_BUMPMAP = !!material.bumpMap;\n\t\tconst HAS_SPECULARMAP = !!material.specularMap;\n\t\tconst HAS_ROUGHNESSMAP = !!material.roughnessMap;\n\t\tconst HAS_METALNESSMAP = !!material.metalnessMap;\n\t\tconst HAS_GLOSSINESSMAP = !!material.glossinessMap;\n\n\t\tconst HAS_ENVMAP = !!envMap;\n\n\t\tconst HAS_CLEARCOATMAP = HAS_CLEARCOAT && !!material.clearcoatMap;\n\t\tconst HAS_CLEARCOAT_ROUGHNESSMAP = HAS_CLEARCOAT && !!material.clearcoatRoughnessMap;\n\t\tconst HAS_CLEARCOAT_NORMALMAP = HAS_CLEARCOAT && !!material.clearcoatNormalMap;\n\n\t\t_activeMapCoords = material.extUvCoordMask; // reset\n\n\t\tconst props = {}; // cache this props?\n\n\t\tprops.shaderName = (material.type === MATERIAL_TYPE.SHADER && material.shaderName) ? material.shaderName : material.type;\n\n\t\t// capabilities\n\n\t\tprops.version = capabilities.version;\n\t\tprops.precision = material.precision || capabilities.maxPrecision;\n\t\tprops.useStandardDerivatives = capabilities.version >= 2 || !!capabilities.getExtension('OES_standard_derivatives') || !!capabilities.getExtension('GL_OES_standard_derivatives');\n\t\tprops.useShaderTextureLOD = capabilities.version >= 2 || !!capabilities.getExtension('EXT_shader_texture_lod');\n\n\t\t// maps\n\n\t\tprops.useDiffuseMap = HAS_DIFFUSEMAP;\n\t\tprops.useAlphaMap = HAS_ALPHAMAP;\n\t\tprops.useEmissiveMap = HAS_EMISSIVEMAP;\n\t\tprops.useAOMap = HAS_AOMAP;\n\t\tprops.useNormalMap = HAS_NORMALMAP;\n\t\tprops.useBumpMap = HAS_BUMPMAP;\n\t\tprops.useSpecularMap = HAS_SPECULARMAP;\n\t\tprops.useRoughnessMap = HAS_ROUGHNESSMAP;\n\t\tprops.useMetalnessMap = HAS_METALNESSMAP;\n\t\tprops.useGlossinessMap = HAS_GLOSSINESSMAP;\n\n\t\tprops.useEnvMap = HAS_ENVMAP;\n\t\tprops.envMapCombine = HAS_ENVMAP && material.envMapCombine;\n\n\t\tprops.useClearcoat = HAS_CLEARCOAT;\n\t\tprops.useClearcoatMap = HAS_CLEARCOATMAP;\n\t\tprops.useClearcoatRoughnessMap = HAS_CLEARCOAT_ROUGHNESSMAP;\n\t\tprops.useClearcoatNormalMap = HAS_CLEARCOAT_NORMALMAP;\n\n\t\tprops.diffuseMapUv = HAS_DIFFUSEMAP && getUVChannel(material.diffuseMapCoord);\n\t\tprops.alphaMapUv = HAS_ALPHAMAP && getUVChannel(material.alphaMapCoord);\n\t\tprops.emissiveMapUv = HAS_EMISSIVEMAP && getUVChannel(material.emissiveMapCoord);\n\t\tprops.aoMapUv = HAS_AOMAP && getUVChannel(material.aoMapCoord);\n\n\t\tif (HAS_NORMALMAP || HAS_BUMPMAP || HAS_SPECULARMAP || HAS_ROUGHNESSMAP || HAS_METALNESSMAP || HAS_GLOSSINESSMAP || HAS_CLEARCOATMAP || HAS_CLEARCOAT_ROUGHNESSMAP || HAS_CLEARCOAT_NORMALMAP) {\n\t\t\t_activeMapCoords |= 1 << 0; // these maps use uv coord 0 by default\n\t\t}\n\n\t\tprops.activeMapCoords = _activeMapCoords;\n\n\t\t// lights\n\n\t\tlightingState.setProgramProps(props, object.receiveShadow);\n\n\t\tprops.useShadowSampler = capabilities.version >= 2 && !disableShadowSampler;\n\t\tprops.shadowType = object.shadowType;\n\t\tif (!props.useShadowSampler &&\n\t\t\t(\n\t\t\t\tprops.shadowType == SHADOW_TYPE.PCF3_SOFT ||\n\t\t\t\tprops.shadowType == SHADOW_TYPE.PCF5_SOFT ||\n\t\t\t\tprops.shadowType == SHADOW_TYPE.PCSS16_SOFT ||\n\t\t\t\tprops.shadowType == SHADOW_TYPE.PCSS32_SOFT ||\n\t\t\t\tprops.shadowType == SHADOW_TYPE.PCSS64_SOFT\n\t\t\t)\n\t\t) {\n\t\t\tprops.shadowType = SHADOW_TYPE.VOGEL5_SOFT;\n\n\t\t\tif (props.useShadow) {\n\t\t\t\tconsole.warn('WebGLPrograms: PCF and PCSS shadow type need shadow sampler support, falling back to VOGEL5_SOFT.');\n\t\t\t}\n\t\t}\n\n\t\tprops.dithering = material.dithering;\n\n\t\t// encoding\n\n\t\tconst currentRenderTarget = state.currentRenderTarget;\n\t\tprops.gammaFactor = renderStates.gammaFactor;\n\t\tprops.outputEncoding = currentRenderTarget.texture ? getTextureEncodingFromMap(currentRenderTarget.texture) : renderStates.outputEncoding;\n\t\tprops.diffuseMapEncoding = getTextureEncodingFromMap(material.diffuseMap || material.cubeMap);\n\t\tprops.envMapEncoding = getTextureEncodingFromMap(envMap);\n\t\tprops.emissiveMapEncoding = getTextureEncodingFromMap(material.emissiveMap);\n\n\t\t// other\n\n\t\tprops.alphaTest = material.alphaTest > 0;\n\t\tprops.premultipliedAlpha = material.premultipliedAlpha;\n\t\tprops.useVertexColors = material.vertexColors;\n\t\tprops.useVertexTangents = !!material.normalMap && material.vertexTangents;\n\t\tprops.numClippingPlanes = numClippingPlanes;\n\t\tprops.flatShading = material.shading === SHADING_TYPE.FLAT_SHADING;\n\t\tprops.fog = !!fog;\n\t\tprops.fogExp2 = !!fog && fog.isFogExp2;\n\t\tprops.sizeAttenuation = material.sizeAttenuation;\n\t\tprops.doubleSided = material.side === DRAW_SIDE.DOUBLE;\n\t\tprops.flipSided = material.side === DRAW_SIDE.BACK;\n\t\tprops.packDepthToRGBA = material.packToRGBA;\n\t\tprops.logarithmicDepthBuffer = !!logarithmicDepthBuffer;\n\t\tprops.rendererExtensionFragDepth = capabilities.version >= 2 || !!capabilities.getExtension('EXT_frag_depth');\n\n\t\t// morph targets\n\n\t\tprops.morphTargets = !!object.morphTargetInfluences;\n\t\tprops.morphNormals = !!object.morphTargetInfluences && object.geometry.morphAttributes.normal;\n\n\t\t// skinned mesh\n\n\t\tconst useSkinning = object.isSkinnedMesh && object.skeleton;\n\t\tconst maxVertexUniformVectors = capabilities.maxVertexUniformVectors;\n\t\tconst useVertexTexture = capabilities.maxVertexTextures > 0 && (!!capabilities.getExtension('OES_texture_float') || capabilities.version >= 2);\n\t\tlet maxBones = 0;\n\t\tif (useVertexTexture) {\n\t\t\tmaxBones = 1024;\n\t\t} else {\n\t\t\tmaxBones = object.skeleton ? object.skeleton.bones.length : 0;\n\t\t\tif (maxBones * 16 > maxVertexUniformVectors) {\n\t\t\t\tconsole.warn('Program: too many bones (' + maxBones + '), current cpu only support ' + Math.floor(maxVertexUniformVectors / 16) + ' bones!!');\n\t\t\t\tmaxBones = Math.floor(maxVertexUniformVectors / 16);\n\t\t\t}\n\t\t}\n\t\tprops.useSkinning = useSkinning;\n\t\tprops.bonesNum = maxBones;\n\t\tprops.useVertexTexture = useVertexTexture;\n\n\t\treturn props;\n\t}\n\n\tgenerateProgramCode(props, material) {\n\t\tlet code = '';\n\n\t\tfor (const key in props) {\n\t\t\tcode += props[key] + '_';\n\t\t}\n\n\t\tfor (const name in material.defines) {\n\t\t\tcode += name + '_' + material.defines[name] + '_';\n\t\t}\n\n\t\t// If the material type is SHADER and there is no shader Name,\n\t\t// use the entire shader code as part of the signature\n\t\tif (material.type === MATERIAL_TYPE.SHADER && !material.shaderName) {\n\t\t\tcode += material.vertexShader;\n\t\t\tcode += material.fragmentShader;\n\t\t}\n\n\t\treturn code;\n\t}\n\n}\n\n// Helper functions\n\nfunction generateDefines(defines) {\n\tconst chunks = [];\n\n\tfor (const name in defines) {\n\t\tconst value = defines[name];\n\t\tif (value === false) continue;\n\t\tchunks.push('#define ' + name + ' ' + value);\n\t}\n\n\treturn chunks.join('\\n');\n}\n\nlet _activeMapCoords = 0; // bit mask\n\nfunction getUVChannel(coord) {\n\t_activeMapCoords |= (1 << coord);\n\n\tif (coord === 0) return 'a_Uv';\n\n\treturn `a_Uv${coord + 1}`; // a_Uv2, a_Uv3, a_Uv4, ...\n}\n\nfunction getTextureEncodingFromMap(map) {\n\tlet encoding;\n\n\tif (!map) {\n\t\tencoding = TEXEL_ENCODING_TYPE.LINEAR;\n\t} else if (map.encoding) {\n\t\tencoding = map.encoding;\n\t}\n\n\treturn encoding;\n}\n\nfunction getEncodingComponents(encoding) {\n\tswitch (encoding) {\n\t\tcase TEXEL_ENCODING_TYPE.LINEAR:\n\t\t\treturn ['Linear', '(value)'];\n\t\tcase TEXEL_ENCODING_TYPE.SRGB:\n\t\t\treturn ['sRGB', '(value)'];\n\t\tcase TEXEL_ENCODING_TYPE.GAMMA:\n\t\t\treturn ['Gamma', '(value, float(GAMMA_FACTOR))'];\n\t\tdefault:\n\t\t\tconsole.error('unsupported encoding: ' + encoding);\n\t}\n}\n\nfunction getTexelDecodingFunction(functionName, encoding) {\n\tconst components = getEncodingComponents(encoding);\n\treturn 'vec4 ' + functionName + '(vec4 value) { return ' + components[0] + 'ToLinear' + components[1] + '; }';\n}\n\nfunction getTexelEncodingFunction(functionName, encoding) {\n\tconst components = getEncodingComponents(encoding);\n\treturn 'vec4 ' + functionName + '(vec4 value) { return LinearTo' + components[0] + components[1] + '; }';\n}\n\nfunction uvAttributes(activeMapCoords) {\n\tlet str = '';\n\tfor (let i = 1; i < 8; i++) { // skip uv0\n\t\tif (activeMapCoords & (1 << i)) {\n\t\t\tstr += 'attribute vec2 a_Uv' + (i + 1) + ';';\n\t\t\tif (i !== 7) str += '\\n';\n\t\t}\n\t}\n\treturn str;\n}\n\nconst shadowDefines = {\n\t[SHADOW_TYPE.HARD]: '#define USE_HARD_SHADOW',\n\t[SHADOW_TYPE.POISSON_SOFT]: '#define USE_POISSON_SOFT_SHADOW',\n\t[SHADOW_TYPE.VOGEL5_SOFT]: '#define USE_VOGEL5_SOFT_SHADOW',\n\t[SHADOW_TYPE.PCF3_SOFT]: '#define USE_PCF3_SOFT_SHADOW',\n\t[SHADOW_TYPE.PCF5_SOFT]: '#define USE_PCF5_SOFT_SHADOW',\n\t[SHADOW_TYPE.PCSS16_SOFT]: [\n\t\t'#define USE_PCSS16_SOFT_SHADOW',\n\t\t'#define USE_PCSS_SOFT_SHADOW'\n\t].join('\\n'),\n\t[SHADOW_TYPE.PCSS32_SOFT]: [\n\t\t'#define USE_PCSS32_SOFT_SHADOW',\n\t\t'#define USE_PCSS_SOFT_SHADOW'\n\t].join('\\n'),\n\t[SHADOW_TYPE.PCSS64_SOFT]: [\n\t\t'#define USE_PCSS64_SOFT_SHADOW',\n\t\t'#define USE_PCSS_SOFT_SHADOW'\n\t].join('\\n')\n};\n\nfunction getShadowTypeDefines(shadowType) {\n\tif (shadowDefines[shadowType]) {\n\t\treturn shadowDefines[shadowType];\n\t} else {\n\t\tconsole.warn('unsupported shadow type: ' + shadowType);\n\t\treturn shadowDefines[SHADOW_TYPE.HARD];\n\t}\n}\n\nfunction createProgram(gl, defines, props, vertex, fragment) {\n\tlet prefixVertex = [\n\t\t'precision ' + props.precision + ' float;',\n\t\t'precision ' + props.precision + ' int;',\n\t\t// depth texture may have precision problem on iOS device.\n\t\t'precision ' + props.precision + ' sampler2D;',\n\t\t(props.version >= 2) ? 'precision ' + props.precision + ' isampler2D;' : '',\n\t\t(props.version >= 2) ? 'precision ' + props.precision + ' usampler2D;' : '',\n\n\t\t'#define SHADER_NAME ' + props.shaderName,\n\n\t\tdefines,\n\n\t\t(props.version >= 2) ? '#define WEBGL2' : '',\n\n\t\t// maps\n\n\t\tprops.useDiffuseMap ? '#define USE_DIFFUSE_MAP' : '',\n\t\tprops.useAlphaMap ? '#define USE_ALPHA_MAP' : '',\n\t\tprops.useEmissiveMap ? '#define USE_EMISSIVEMAP' : '',\n\t\tprops.useAOMap ? '#define USE_AOMAP' : '',\n\t\tprops.useNormalMap ? '#define USE_NORMAL_MAP' : '',\n\t\tprops.useBumpMap ? '#define USE_BUMPMAP' : '',\n\t\tprops.useSpecularMap ? '#define USE_SPECULARMAP' : '',\n\t\tprops.useRoughnessMap ? '#define USE_ROUGHNESSMAP' : '',\n\t\tprops.useMetalnessMap ? '#define USE_METALNESSMAP' : '',\n\t\tprops.useGlossinessMap ? '#define USE_GLOSSINESSMAP' : '',\n\n\t\tprops.useEnvMap ? '#define USE_ENV_MAP' : '',\n\n\t\tprops.diffuseMapUv ? '#define DIFFUSEMAP_UV ' + props.diffuseMapUv : '',\n\t\tprops.alphaMapUv ? '#define ALPHAMAP_UV ' + props.alphaMapUv : '',\n\t\tprops.emissiveMapUv ? '#define EMISSIVEMAP_UV ' + props.emissiveMapUv : '',\n\t\tprops.aoMapUv ? '#define AOMAP_UV ' + props.aoMapUv : '',\n\n\t\tprops.activeMapCoords > 0 ? '#define USE_UV' : '',\n\t\tprops.activeMapCoords & 1 ? '#define USE_UV1' : '',\n\n\t\tuvAttributes(props.activeMapCoords),\n\n\t\t// lights\n\n\t\tprops.useAmbientLight ? '#define USE_AMBIENT_LIGHT' : '',\n\t\tprops.useSphericalHarmonicsLight ? '#define USE_SPHERICALHARMONICS_LIGHT' : '',\n\t\tprops.useShadow ? '#define USE_SHADOW' : '',\n\n\t\t// other\n\n\t\tprops.useVertexColors == VERTEX_COLOR.RGB ? '#define USE_VCOLOR_RGB' : '',\n\t\tprops.useVertexColors == VERTEX_COLOR.RGBA ? '#define USE_VCOLOR_RGBA' : '',\n\t\tprops.useVertexTangents ? '#define USE_TANGENT' : '',\n\t\tprops.flatShading ? '#define FLAT_SHADED' : '',\n\t\tprops.fog ? '#define USE_FOG' : '',\n\t\tprops.sizeAttenuation ? '#define USE_SIZEATTENUATION' : '',\n\t\tprops.flipSided ? '#define FLIP_SIDED' : '',\n\t\tprops.logarithmicDepthBuffer ? '#define USE_LOGDEPTHBUF' : '',\n\t\t(props.logarithmicDepthBuffer && props.rendererExtensionFragDepth) ? '#define USE_LOGDEPTHBUF_EXT' : '',\n\n\t\t// morph targets\n\n\t\tprops.morphTargets ? '#define USE_MORPHTARGETS' : '',\n\t\tprops.morphNormals && props.flatShading === false ? '#define USE_MORPHNORMALS' : '',\n\n\t\t// skinned mesh\n\n\t\tprops.useSkinning ? '#define USE_SKINNING' : '',\n\t\t(props.bonesNum > 0) ? ('#define MAX_BONES ' + props.bonesNum) : '',\n\t\tprops.useVertexTexture ? '#define BONE_TEXTURE' : '',\n\t\t'\\n'\n\t].filter(filterEmptyLine).join('\\n');\n\n\tlet prefixFragment = [\n\t\t// use dfdx and dfdy must enable OES_standard_derivatives\n\t\t(props.useStandardDerivatives && props.version < 2) ? '#extension GL_OES_standard_derivatives : enable' : '',\n\t\t(props.useShaderTextureLOD && props.version < 2) ? '#extension GL_EXT_shader_texture_lod : enable' : '',\n\t\t(props.logarithmicDepthBuffer && props.rendererExtensionFragDepth && props.version < 2) ? '#extension GL_EXT_frag_depth : enable' : '',\n\n\t\t'precision ' + props.precision + ' float;',\n\t\t'precision ' + props.precision + ' int;',\n\t\t// depth texture may have precision problem on iOS device.\n\t\t'precision ' + props.precision + ' sampler2D;',\n\t\t(props.version >= 2) ? 'precision ' + props.precision + ' isampler2D;' : '',\n\t\t(props.version >= 2) ? 'precision ' + props.precision + ' usampler2D;' : '',\n\t\t(props.version >= 2) ? 'precision ' + props.precision + ' sampler2DShadow;' : '',\n\t\t(props.version >= 2) ? 'precision ' + props.precision + ' samplerCubeShadow;' : '',\n\n\t\t'#define SHADER_NAME ' + props.shaderName,\n\n\t\t'#define PI 3.14159265359',\n\t\t'#define EPSILON 1e-6',\n\t\t'float pow2(const in float x) { return x * x; }',\n\t\t'#define LOG2 1.442695',\n\t\t'#define RECIPROCAL_PI 0.31830988618',\n\t\t'#define saturate(a) clamp(a, 0.0, 1.0)',\n\t\t'#define whiteCompliment(a) (1.0 - saturate(a))',\n\n\t\t// expects values in the range of [0,1] x [0,1], returns values in the [0,1] range.\n\t\t// do not collapse into a single function per: http://byteblacksmith.com/improvements-to-the-canonical-one-liner-glsl-rand-for-opengl-es-2-0/\n\t\t'highp float rand(const in vec2 uv) {',\n\t\t'\tconst highp float a = 12.9898, b = 78.233, c = 43758.5453;',\n\t\t'\thighp float dt = dot(uv.xy, vec2(a, b)), sn = mod(dt, PI);',\n\t\t'\treturn fract(sin(sn) * c);',\n\t\t'}',\n\n\t\tdefines,\n\n\t\t(props.version >= 2) ? '#define WEBGL2' : '',\n\t\tprops.useShadowSampler ? '#define USE_SHADOW_SAMPLER' : '#define sampler2DShadow sampler2D',\n\t\tprops.useShaderTextureLOD ? '#define TEXTURE_LOD_EXT' : '',\n\n\t\t// maps\n\n\t\tprops.useDiffuseMap ? '#define USE_DIFFUSE_MAP' : '',\n\t\tprops.useAlphaMap ? '#define USE_ALPHA_MAP' : '',\n\t\tprops.useEmissiveMap ? '#define USE_EMISSIVEMAP' : '',\n\t\tprops.useAOMap ? '#define USE_AOMAP' : '',\n\t\tprops.useNormalMap ? '#define USE_NORMAL_MAP' : '',\n\t\tprops.useBumpMap ? '#define USE_BUMPMAP' : '',\n\t\tprops.useSpecularMap ? '#define USE_SPECULARMAP' : '',\n\t\tprops.useRoughnessMap ? '#define USE_ROUGHNESSMAP' : '',\n\t\tprops.useMetalnessMap ? '#define USE_METALNESSMAP' : '',\n\t\tprops.useGlossinessMap ? '#define USE_GLOSSINESSMAP' : '',\n\n\t\tprops.useEnvMap ? '#define USE_ENV_MAP' : '',\n\t\tprops.envMapCombine ? '#define ' + props.envMapCombine : '',\n\n\t\tprops.useClearcoat ? '#define USE_CLEARCOAT' : '',\n\t\tprops.useClearcoatMap ? '#define USE_CLEARCOATMAP' : '',\n\t\tprops.useClearcoatRoughnessMap ? '#define USE_CLEARCOAT_ROUGHNESSMAP' : '',\n\t\tprops.useClearcoatNormalMap ? '#define USE_CLEARCOAT_NORMALMAP' : '',\n\n\t\tprops.activeMapCoords & 1 ? '#define USE_UV1' : '',\n\n\t\t// lights\n\n\t\tprops.useAmbientLight ? '#define USE_AMBIENT_LIGHT' : '',\n\t\tprops.useSphericalHarmonicsLight ? '#define USE_SPHERICALHARMONICS_LIGHT' : '',\n\t\tprops.useClusteredLights ? '#define USE_CLUSTERED_LIGHTS' : '',\n\t\tprops.useShadow ? '#define USE_SHADOW' : '',\n\t\tgetShadowTypeDefines(props.shadowType),\n\n\t\tprops.dithering ? '#define DITHERING' : '',\n\n\t\t// encoding\n\n\t\tShaderChunk['encodings_pars_frag'],\n\t\t'#define GAMMA_FACTOR ' + props.gammaFactor,\n\t\tgetTexelEncodingFunction('linearToOutputTexel', props.outputEncoding),\n\t\tgetTexelDecodingFunction('mapTexelToLinear', props.diffuseMapEncoding),\n\t\tprops.useEnvMap ? getTexelDecodingFunction('envMapTexelToLinear', props.envMapEncoding) : '',\n\t\tprops.useEmissiveMap ? getTexelDecodingFunction('emissiveMapTexelToLinear', props.emissiveMapEncoding) : '',\n\n\t\t// other\n\n\t\tprops.alphaTest ? '#define ALPHATEST' : '',\n\t\tprops.premultipliedAlpha ? '#define USE_PREMULTIPLIED_ALPHA' : '',\n\t\tprops.useVertexColors == VERTEX_COLOR.RGB ? '#define USE_VCOLOR_RGB' : '',\n\t\tprops.useVertexColors == VERTEX_COLOR.RGBA ? '#define USE_VCOLOR_RGBA' : '',\n\t\tprops.useVertexTangents ? '#define USE_TANGENT' : '',\n\t\tprops.flatShading ? '#define FLAT_SHADED' : '',\n\t\tprops.fog ? '#define USE_FOG' : '',\n\t\tprops.fogExp2 ? '#define USE_EXP2_FOG' : '',\n\t\tprops.doubleSided ? '#define DOUBLE_SIDED' : '',\n\t\tprops.packDepthToRGBA ? '#define DEPTH_PACKING_RGBA' : '',\n\t\tprops.logarithmicDepthBuffer ? '#define USE_LOGDEPTHBUF' : '',\n\t\t(props.logarithmicDepthBuffer && props.rendererExtensionFragDepth) ? '#define USE_LOGDEPTHBUF_EXT' : '',\n\t\t'\\n'\n\t].filter(filterEmptyLine).join('\\n');\n\n\tlet vshader = vertex;\n\tlet fshader = fragment;\n\n\tvshader = parseIncludes(vshader);\n\tfshader = parseIncludes(fshader);\n\n\tvshader = replaceLightNums(vshader, props);\n\tfshader = replaceLightNums(fshader, props);\n\n\tvshader = replaceClippingPlaneNums(vshader, props);\n\tfshader = replaceClippingPlaneNums(fshader, props);\n\n\tvshader = unrollLoops(vshader);\n\tfshader = unrollLoops(fshader);\n\n\t// enable glsl version 300 es for webgl ^2.0\n\tif (props.version > 1) {\n\t\t// extract vertex extensions and insert after version strings later\n\t\t// because it must be at the top of the shader\n\t\tconst vertexExtensions = vshader.match(extensionPattern);\n\t\tif (vertexExtensions) {\n\t\t\tvshader = vshader.replace(extensionPattern, '');\n\t\t}\n\n\t\tprefixVertex = [\n\t\t\t'#version 300 es',\n\t\t\tvertexExtensions ? vertexExtensions.join('\\n') : '',\n\t\t\t'#define attribute in',\n\t\t\t'#define varying out',\n\t\t\t'#define texture2D texture'\n\t\t].join('\\n') + '\\n' + prefixVertex;\n\n\t\tfshader = fshader.replace('#extension GL_EXT_draw_buffers : require', '');\n\n\t\t// replace gl_FragData by layout\n\t\tlet i = 0;\n\t\tconst layout = [];\n\t\twhile (fshader.indexOf('gl_FragData[' + i + ']') > -1) {\n\t\t\tfshader = fshader.replace('gl_FragData[' + i + ']', 'pc_fragData' + i);\n\t\t\tlayout.push('layout(location = ' + i + ') out highp vec4 pc_fragData' + i + ';');\n\t\t\ti++;\n\t\t}\n\n\t\tprefixFragment = [\n\t\t\t'#version 300 es',\n\t\t\t'#define varying in',\n\t\t\t(fshader.indexOf('layout') > -1 || layout.length > 0) ? '' : 'out highp vec4 pc_fragColor;',\n\t\t\t'#define gl_FragColor pc_fragColor',\n\t\t\t'#define gl_FragDepthEXT gl_FragDepth',\n\t\t\t'#define texture2D texture',\n\t\t\t'#define textureCube texture',\n\t\t\t'#define texture2DProj textureProj',\n\t\t\t'#define texture2DLodEXT textureLod',\n\t\t\t'#define texture2DProjLodEXT textureProjLod',\n\t\t\t'#define textureCubeLodEXT textureLod',\n\t\t\t'#define texture2DGradEXT textureGrad',\n\t\t\t'#define texture2DProjGradEXT textureProjGrad',\n\t\t\t'#define textureCubeGradEXT textureGrad',\n\t\t\tlayout.join('\\n')\n\t\t].join('\\n') + '\\n' + prefixFragment;\n\t}\n\n\tvshader = prefixVertex + vshader;\n\tfshader = prefixFragment + fshader;\n\n\treturn new WebGLProgram(gl, vshader, fshader);\n}\n\nconst parseIncludes = function(string) {\n\tconst pattern = /#include +<([\\w\\d.]+)>/g;\n\n\tfunction replace(match, include) {\n\t\tconst replace = ShaderChunk[include];\n\n\t\tif (replace === undefined) {\n\t\t\tthrow new Error('Can not resolve #include <' + include + '>');\n\t\t}\n\n\t\treturn parseIncludes(replace);\n\t}\n\n\treturn string.replace(pattern, replace);\n};\n\nfunction filterEmptyLine(string) {\n\treturn string !== '';\n}\n\nfunction replaceLightNums(string, parameters) {\n\treturn string\n\t\t.replace(/NUM_HEMI_LIGHTS/g, parameters.hemisphereLightNum)\n\t\t.replace(/NUM_DIR_LIGHTS/g, parameters.directLightNum)\n\t\t.replace(/NUM_SPOT_LIGHTS/g, parameters.spotLightNum)\n\t\t.replace(/NUM_POINT_LIGHTS/g, parameters.pointLightNum)\n\t\t.replace(/NUM_RECT_AREA_LIGHTS/g, parameters.rectAreaLightNum)\n\t\t.replace(/NUM_DIR_SHADOWS/g, parameters.directShadowNum)\n\t\t.replace(/NUM_SPOT_SHADOWS/g, parameters.spotShadowNum)\n\t\t.replace(/NUM_POINT_SHADOWS/g, parameters.pointShadowNum);\n}\n\nfunction replaceClippingPlaneNums(string, parameters) {\n\treturn string\n\t\t.replace(/NUM_CLIPPING_PLANES/g, parameters.numClippingPlanes);\n}\n\nconst unrollLoopPattern = /#pragma unroll_loop_start\\s+for\\s*\\(\\s*int\\s+i\\s*=\\s*(\\d+)\\s*;\\s*i\\s*<\\s*(\\d+)\\s*;\\s*i\\s*\\+\\+\\s*\\)\\s*{([\\s\\S]+?)}\\s+#pragma unroll_loop_end/g;\n\nfunction loopReplacer(match, start, end, snippet) {\n\tlet string = '';\n\n\tfor (let i = parseInt(start); i < parseInt(end); i++) {\n\t\tstring += snippet\n\t\t\t.replace(/\\[\\s*i\\s*\\]/g, '[' + i + ']')\n\t\t\t.replace(/UNROLLED_LOOP_INDEX/g, i);\n\t}\n\n\treturn string;\n}\n\nfunction unrollLoops(string) {\n\treturn string\n\t\t.replace(unrollLoopPattern, loopReplacer);\n}\n\nconst extensionPattern = /#extension .*/g;\n\nexport { WebGLPrograms };"
  },
  {
    "path": "src/webgl/WebGLQuerySets.js",
    "content": "import { QUERYSET_TYPE } from '../const.js';\nimport { PropertyMap } from '../render/PropertyMap.js';\n\nclass WebGLQuerySets extends PropertyMap {\n\n\tconstructor(prefix, gl, capabilities) {\n\t\tsuper(prefix);\n\n\t\tthis._gl = gl;\n\t\tthis._capabilities = capabilities;\n\n\t\tconst timerQuery = capabilities.timerQuery;\n\t\tconst that = this;\n\n\t\tfunction onQuerySetDispose(event) {\n\t\t\tconst querySet = event.target;\n\t\t\tconst querySetProperties = that.get(querySet);\n\n\t\t\tquerySet.removeEventListener('dispose', onQuerySetDispose);\n\n\t\t\tif (querySetProperties._queriesGL) {\n\t\t\t\tconst queriesGL = querySetProperties._queriesGL;\n\t\t\t\tqueriesGL.forEach(queryGL => {\n\t\t\t\t\tif (queryGL) {\n\t\t\t\t\t\tif (capabilities.version > 1) {\n\t\t\t\t\t\t\tgl.deleteQuery(queryGL);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\ttimerQuery.deleteQueryEXT(queryGL);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tquerySetProperties._isDisposed = true;\n\n\t\t\tthat.delete(querySet);\n\t\t}\n\n\t\tthis._onQuerySetDispose = onQuerySetDispose;\n\n\t\tthis._checkResultAvailable = capabilities.version > 1\n\t\t\t? queryGL => gl.getQueryParameter(queryGL, gl.QUERY_RESULT_AVAILABLE)\n\t\t\t: queryGL => timerQuery.getQueryObjectEXT(queryGL, timerQuery.QUERY_RESULT_AVAILABLE_EXT);\n\n\t\tthis._getQueryResult = capabilities.version > 1\n\t\t\t? queryGL => gl.getQueryParameter(queryGL, gl.QUERY_RESULT)\n\t\t\t: queryGL => timerQuery.getQueryObjectEXT(queryGL, timerQuery.QUERY_RESULT_EXT);\n\t}\n\n\tsetQuerySet(querySet) {\n\t\tconst querySetProperties = this.get(querySet);\n\n\t\tif (querySetProperties._queriesGL === undefined) {\n\t\t\tquerySet.addEventListener('dispose', this._onQuerySetDispose);\n\n\t\t\tquerySetProperties._queriesGL = new Array(querySet.count).fill(null);\n\t\t\tquerySetProperties._valueCache = new Array(querySet.count).fill(0);\n\t\t\tquerySetProperties._valueCacheValid = new Array(querySet.count).fill(true);\n\n\t\t\tconst gl = this._gl;\n\t\t\tconst capabilities = this._capabilities;\n\n\t\t\tif (querySet.type === QUERYSET_TYPE.OCCLUSION) {\n\t\t\t\tquerySetProperties._targetGL = querySet.conservative\n\t\t\t\t\t? gl.ANY_SAMPLES_PASSED_CONSERVATIVE\n\t\t\t\t\t: gl.ANY_SAMPLES_PASSED;\n\t\t\t} else {\n\t\t\t\t// If timestamp is supported, this variable will not be used,\n\t\t\t\t// so it is okay to set it to TIME_ELAPSED_EXT here.\n\t\t\t\tquerySetProperties._targetGL = capabilities.timerQuery.TIME_ELAPSED_EXT;\n\t\t\t}\n\n\t\t\tquerySetProperties._activeIndex = -1;\n\t\t\tquerySetProperties._reading = false;\n\t\t}\n\t}\n\n\tbeginQuery(querySet, index) {\n\t\tconst gl = this._gl;\n\n\t\tconst querySetProperties = this.get(querySet);\n\n\t\tif (querySetProperties._reading) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst queryGL = this._getQueryGLByIndex(querySetProperties._queriesGL, index);\n\n\t\tif (this._capabilities.version > 1) {\n\t\t\tgl.beginQuery(querySetProperties._targetGL, queryGL);\n\t\t} else {\n\t\t\tthis._capabilities.timerQuery.beginQueryEXT(querySetProperties._targetGL, queryGL);\n\t\t}\n\n\t\tquerySetProperties._activeIndex = index;\n\t}\n\n\tendQuery(querySet) {\n\t\tconst querySetProperties = this.get(querySet);\n\n\t\tif (querySetProperties._reading || querySetProperties._activeIndex < 0) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (this._capabilities.version > 1) {\n\t\t\tthis._gl.endQuery(querySetProperties._targetGL);\n\t\t} else {\n\t\t\tthis._capabilities.timerQuery.endQueryEXT(querySetProperties._targetGL);\n\t\t}\n\n\t\tquerySetProperties._valueCacheValid[querySetProperties._activeIndex] = false;\n\t\tquerySetProperties._activeIndex = -1;\n\t}\n\n\tqueryCounter(querySet, index) {\n\t\tconst capabilities = this._capabilities;\n\t\tconst timerQuery = capabilities.timerQuery;\n\n\t\tconst querySetProperties = this.get(querySet);\n\n\t\tif (querySetProperties._reading) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst queryGL = this._getQueryGLByIndex(querySetProperties._queriesGL, index);\n\t\ttimerQuery.queryCounterEXT(queryGL, timerQuery.TIMESTAMP_EXT);\n\n\t\tquerySetProperties._valueCacheValid[index] = false;\n\t}\n\n\treadQuerySetResults(querySet, dstBuffer, firstQuery, queryCount) {\n\t\tconst querySetProperties = this.get(querySet);\n\n\t\tquerySetProperties._reading = true;\n\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tconst checkQueries = () => {\n\t\t\t\tif (querySetProperties._isDisposed) {\n\t\t\t\t\treject(new Error('QuerySet has been disposed'));\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tlet completed = true;\n\n\t\t\t\ttry {\n\t\t\t\t\tfor (let i = firstQuery; i < queryCount; i++) {\n\t\t\t\t\t\tconst queryGL = querySetProperties._queriesGL[i];\n\t\t\t\t\t\tconst valueCacheValid = querySetProperties._valueCacheValid[i];\n\t\t\t\t\t\tif (!valueCacheValid) {\n\t\t\t\t\t\t\tif (this._checkResultAvailable(queryGL)) {\n\t\t\t\t\t\t\t\tconst result = this._getQueryResult(queryGL);\n\t\t\t\t\t\t\t\tquerySetProperties._valueCache[i] = result;\n\t\t\t\t\t\t\t\tquerySetProperties._valueCacheValid[i] = true;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tcompleted = false;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} catch (e) {\n\t\t\t\t\tfor (let i = firstQuery; i < queryCount; i++) {\n\t\t\t\t\t\tquerySetProperties._valueCacheValid[i] = true;\n\t\t\t\t\t}\n\t\t\t\t\tquerySetProperties._reading = false;\n\t\t\t\t\treject(e);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (completed) {\n\t\t\t\t\tfor (let i = firstQuery; i < queryCount; i++) {\n\t\t\t\t\t\tdstBuffer[i - firstQuery] = querySetProperties._valueCache[i];\n\t\t\t\t\t}\n\n\t\t\t\t\tquerySetProperties._reading = false;\n\t\t\t\t\tresolve(dstBuffer);\n\t\t\t\t} else {\n\t\t\t\t\trequestAnimationFrame(checkQueries);\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tcheckQueries();\n\t\t});\n\t}\n\n\t_getQueryGLByIndex(queriesGL, index) {\n\t\tlet queryGL = queriesGL[index];\n\t\tif (!queryGL) {\n\t\t\tconst gl = this._gl;\n\t\t\tconst capabilities = this._capabilities;\n\n\t\t\tqueryGL = capabilities.version > 1\n\t\t\t\t? gl.createQuery()\n\t\t\t\t: capabilities.timerQuery.createQueryEXT();\n\t\t\tqueriesGL[index] = queryGL;\n\t\t}\n\t\treturn queryGL;\n\t}\n\n}\n\nexport { WebGLQuerySets };"
  },
  {
    "path": "src/webgl/WebGLRenderBuffers.js",
    "content": "import { PropertyMap } from '../render/PropertyMap.js';\n\nclass WebGLRenderBuffers extends PropertyMap {\n\n\tconstructor(prefix, gl, capabilities, constants) {\n\t\tsuper(prefix);\n\n\t\tthis._gl = gl;\n\t\tthis._capabilities = capabilities;\n\t\tthis._constants = constants;\n\n\t\tconst that = this;\n\n\t\tfunction onRenderBufferDispose(event) {\n\t\t\tconst renderBuffer = event.target;\n\n\t\t\trenderBuffer.removeEventListener('dispose', onRenderBufferDispose);\n\n\t\t\tconst renderBufferProperties = that.get(renderBuffer);\n\n\t\t\tif (renderBufferProperties.__webglRenderbuffer && !renderBufferProperties.__external) {\n\t\t\t\tgl.deleteRenderbuffer(renderBufferProperties.__webglRenderbuffer);\n\t\t\t}\n\n\t\t\tthat.delete(renderBuffer);\n\t\t}\n\n\t\tthis._onRenderBufferDispose = onRenderBufferDispose;\n\t}\n\n\tsetRenderBuffer(renderBuffer) {\n\t\tconst gl = this._gl;\n\t\tconst capabilities = this._capabilities;\n\t\tconst constants = this._constants;\n\n\t\tconst renderBufferProperties = this.get(renderBuffer);\n\n\t\tif (renderBufferProperties.__webglRenderbuffer === undefined) {\n\t\t\trenderBuffer.addEventListener('dispose', this._onRenderBufferDispose);\n\n\t\t\trenderBufferProperties.__webglRenderbuffer = gl.createRenderbuffer();\n\n\t\t\tgl.bindRenderbuffer(gl.RENDERBUFFER, renderBufferProperties.__webglRenderbuffer);\n\n\t\t\tconst glFormat = constants.getGLInternalFormat(renderBuffer.format);\n\n\t\t\tif (renderBuffer.multipleSampling > 0) {\n\t\t\t\tif (capabilities.version < 2) {\n\t\t\t\t\tconsole.error('render buffer multipleSampling is not support in webgl 1.0.');\n\t\t\t\t}\n\t\t\t\tgl.renderbufferStorageMultisample(gl.RENDERBUFFER, Math.min(renderBuffer.multipleSampling, capabilities.maxSamples), glFormat, renderBuffer.width, renderBuffer.height);\n\t\t\t} else {\n\t\t\t\tgl.renderbufferStorage(gl.RENDERBUFFER, glFormat, renderBuffer.width, renderBuffer.height);\n\t\t\t}\n\t\t} else {\n\t\t\tgl.bindRenderbuffer(gl.RENDERBUFFER, renderBufferProperties.__webglRenderbuffer);\n\t\t}\n\n\t\treturn renderBufferProperties;\n\t}\n\n\tsetRenderBufferExternal(renderBuffer, webglRenderbuffer) {\n\t\tconst gl = this._gl;\n\n\t\tconst renderBufferProperties = this.get(renderBuffer);\n\n\t\tif (!renderBufferProperties.__external) {\n\t\t\tif (renderBufferProperties.__webglRenderbuffer) {\n\t\t\t\tgl.deleteRenderbuffer(renderBufferProperties.__webglRenderbuffer);\n\t\t\t} else {\n\t\t\t\trenderBuffer.addEventListener('dispose', this._onRenderBufferDispose);\n\t\t\t}\n\t\t}\n\n\t\trenderBufferProperties.__webglRenderbuffer = webglRenderbuffer;\n\t\trenderBufferProperties.__external = true;\n\t}\n\n}\n\nexport { WebGLRenderBuffers };"
  },
  {
    "path": "src/webgl/WebGLRenderTargets.js",
    "content": "import { ATTACHMENT } from '../const.js';\nimport { PropertyMap } from '../render/PropertyMap.js';\n\nclass WebGLRenderTargets extends PropertyMap {\n\n\tconstructor(prefix, gl, state, capabilities, textures, renderBuffers, constants) {\n\t\tsuper(prefix);\n\n\t\tthis._gl = gl;\n\t\tthis._state = state;\n\t\tthis._capabilities = capabilities;\n\t\tthis._textures = textures;\n\t\tthis._renderBuffers = renderBuffers;\n\t\tthis._constants = constants;\n\n\t\tconst that = this;\n\n\t\tfunction onRenderTargetDispose(event) {\n\t\t\tconst renderTarget = event.target;\n\n\t\t\trenderTarget.removeEventListener('dispose', onRenderTargetDispose);\n\n\t\t\tconst renderTargetProperties = that.get(renderTarget);\n\n\t\t\tif (renderTargetProperties.__webglFramebuffer && !renderTargetProperties.__external) {\n\t\t\t\tgl.deleteFramebuffer(renderTargetProperties.__webglFramebuffer);\n\t\t\t}\n\n\t\t\tthat.delete(renderTarget);\n\n\t\t\tif (state.currentRenderTarget === renderTarget) {\n\t\t\t\tstate.currentRenderTarget = null;\n\t\t\t}\n\t\t}\n\n\t\tthis._onRenderTargetDispose = onRenderTargetDispose;\n\t}\n\n\t_setupRenderTarget(renderTarget) {\n\t\tconst gl = this._gl;\n\t\tconst state = this._state;\n\t\tconst textures = this._textures;\n\t\tconst renderBuffers = this._renderBuffers;\n\t\tconst capabilities = this._capabilities;\n\n\t\tconst renderTargetProperties = this.get(renderTarget);\n\n\t\trenderTarget.addEventListener('dispose', this._onRenderTargetDispose);\n\n\t\tconst glFrameBuffer = gl.createFramebuffer();\n\t\tconst drawBuffers = [];\n\n\t\trenderTargetProperties.__webglFramebuffer = glFrameBuffer;\n\t\trenderTargetProperties.__drawBuffers = drawBuffers;\n\t\trenderTargetProperties.__currentActiveMipmapLevel = renderTarget.activeMipmapLevel;\n\t\trenderTargetProperties.__currentActiveLayer = renderTarget.activeLayer;\n\n\t\tgl.bindFramebuffer(gl.FRAMEBUFFER, glFrameBuffer);\n\n\t\tfor (const attachTarget in renderTarget._attachments) {\n\t\t\tconst glAttachTarget = attachTargetToGL[attachTarget];\n\n\t\t\tif (glAttachTarget === gl.DEPTH_ATTACHMENT || glAttachTarget === gl.DEPTH_STENCIL_ATTACHMENT) {\n\t\t\t\tif (capabilities.version < 2 && !capabilities.getExtension('WEBGL_depth_texture')) {\n\t\t\t\t\tconsole.warn('WebGLRenderTargets: extension WEBGL_depth_texture is not support.');\n\t\t\t\t}\n\t\t\t} else if (glAttachTarget !== gl.STENCIL_ATTACHMENT) {\n\t\t\t\tdrawBuffers.push(glAttachTarget);\n\t\t\t}\n\n\t\t\tconst attachment = renderTarget._attachments[attachTarget];\n\n\t\t\tif (attachment.isTexture) {\n\t\t\t\tconst textureProperties = textures.setTexture(attachment);\n\t\t\t\tif (attachment.isTexture2D) {\n\t\t\t\t\tgl.framebufferTexture2D(gl.FRAMEBUFFER, glAttachTarget, gl.TEXTURE_2D, textureProperties.__webglTexture, renderTarget.activeMipmapLevel);\n\t\t\t\t} else if (attachment.isTextureCube) {\n\t\t\t\t\tgl.framebufferTexture2D(gl.FRAMEBUFFER, glAttachTarget, gl.TEXTURE_CUBE_MAP_POSITIVE_X + renderTarget.activeLayer, textureProperties.__webglTexture, renderTarget.activeMipmapLevel);\n\t\t\t\t} else if (attachment.isTexture3D || attachment.isTexture2DArray) {\n\t\t\t\t\tgl.framebufferTextureLayer(gl.FRAMEBUFFER, glAttachTarget, textureProperties.__webglTexture, renderTarget.activeMipmapLevel, renderTarget.activeLayer);\n\t\t\t\t}\n\t\t\t\tstate.bindTexture(textureProperties.__webglTarget, null);\n\t\t\t} else {\n\t\t\t\tconst renderBufferProperties = renderBuffers.setRenderBuffer(attachment);\n\t\t\t\tgl.framebufferRenderbuffer(gl.FRAMEBUFFER, glAttachTarget, gl.RENDERBUFFER, renderBufferProperties.__webglRenderbuffer);\n\t\t\t}\n\t\t}\n\n\t\tdrawBuffers.sort(drawBufferSort);\n\n\t\tif (capabilities.version >= 2) {\n\t\t\tgl.drawBuffers(drawBuffers);\n\t\t} else if (capabilities.getExtension('WEBGL_draw_buffers')) {\n\t\t\tcapabilities.getExtension('WEBGL_draw_buffers').drawBuffersWEBGL(drawBuffers);\n\t\t}\n\t}\n\n\tsetRenderTarget(renderTarget) {\n\t\tconst gl = this._gl;\n\t\tconst state = this._state;\n\t\tconst textures = this._textures;\n\n\t\tlet renderTargetProperties;\n\n\t\tif (state.currentRenderTarget !== renderTarget) {\n\t\t\tif (renderTarget.isScreenRenderTarget) {\n\t\t\t\tgl.bindFramebuffer(gl.FRAMEBUFFER, null);\n\t\t\t} else {\n\t\t\t\trenderTargetProperties = this.get(renderTarget);\n\n\t\t\t\tif (renderTargetProperties.__webglFramebuffer === undefined) {\n\t\t\t\t\tthis._setupRenderTarget(renderTarget);\n\t\t\t\t} else {\n\t\t\t\t\tgl.bindFramebuffer(gl.FRAMEBUFFER, renderTargetProperties.__webglFramebuffer);\n\t\t\t\t}\n\t\t\t}\n\t\t\tstate.currentRenderTarget = renderTarget;\n\t\t}\n\n\t\trenderTargetProperties = this.get(renderTarget);\n\n\t\tif (renderTargetProperties.__external) return;\n\n\t\tconst activeLayer = renderTarget.activeLayer;\n\t\tconst activeMipmapLevel = renderTarget.activeMipmapLevel;\n\t\tif (renderTargetProperties.__currentActiveLayer !== activeLayer || renderTargetProperties.__currentActiveMipmapLevel !== activeMipmapLevel) {\n\t\t\tfor (const attachTarget in renderTarget._attachments) {\n\t\t\t\tconst attachment = renderTarget._attachments[attachTarget];\n\n\t\t\t\tif (!attachment.isTexture) continue;\n\n\t\t\t\tconst textureProperties = textures.get(attachment);\n\n\t\t\t\tif (attachment.isTexture2D) {\n\t\t\t\t\tgl.framebufferTexture2D(gl.FRAMEBUFFER, attachTargetToGL[attachTarget], gl.TEXTURE_2D, textureProperties.__webglTexture, activeMipmapLevel);\n\t\t\t\t} else if (attachment.isTextureCube) {\n\t\t\t\t\tgl.framebufferTexture2D(gl.FRAMEBUFFER, attachTargetToGL[attachTarget], gl.TEXTURE_CUBE_MAP_POSITIVE_X + activeLayer, textureProperties.__webglTexture, activeMipmapLevel);\n\t\t\t\t} else if (attachment.isTexture3D || attachment.isTexture2DArray) {\n\t\t\t\t\tgl.framebufferTextureLayer(gl.FRAMEBUFFER, attachTargetToGL[attachTarget], textureProperties.__webglTexture, activeMipmapLevel, activeLayer);\n\t\t\t\t}\n\t\t\t}\n\t\t\trenderTargetProperties.__currentActiveLayer = activeLayer;\n\t\t\trenderTargetProperties.__currentActiveMipmapLevel = activeMipmapLevel;\n\t\t}\n\t}\n\n\tblitRenderTarget(read, draw, color = true, depth = true, stencil = true) {\n\t\tconst gl = this._gl;\n\t\tconst state = this._state;\n\t\tconst capabilities = this._capabilities;\n\n\t\tif (capabilities.version < 2) {\n\t\t\tconsole.warn('WebGLRenderTargets: blitFramebuffer not support by WebGL' + capabilities.version);\n\t\t\treturn;\n\t\t}\n\n\t\tlet needRestoreFramebuffer = false;\n\n\t\tlet readBuffer = this.get(read).__webglFramebuffer;\n\t\tif (!readBuffer) {\n\t\t\tthis._setupRenderTarget(read);\n\t\t\treadBuffer = this.get(read).__webglFramebuffer;\n\t\t\tneedRestoreFramebuffer = true;\n\t\t}\n\n\t\tlet drawBuffer = this.get(draw).__webglFramebuffer;\n\t\tif (!drawBuffer) {\n\t\t\tthis._setupRenderTarget(draw);\n\t\t\tdrawBuffer = this.get(draw).__webglFramebuffer;\n\t\t\tneedRestoreFramebuffer = true;\n\t\t}\n\n\t\tif (needRestoreFramebuffer) { // restore framebuffer binding\n\t\t\tconst framebuffer = (state.currentRenderTarget && !state.currentRenderTarget.isScreenRenderTarget) ?\n\t\t\t\tthis.get(state.currentRenderTarget).__webglFramebuffer : null;\n\t\t\tgl.bindFramebuffer(gl.FRAMEBUFFER, framebuffer);\n\t\t}\n\n\t\tgl.bindFramebuffer(gl.READ_FRAMEBUFFER, readBuffer);\n\t\tgl.bindFramebuffer(gl.DRAW_FRAMEBUFFER, drawBuffer);\n\n\t\tlet mask = 0;\n\t\tif (color) mask |= gl.COLOR_BUFFER_BIT;\n\t\tif (depth) mask |= gl.DEPTH_BUFFER_BIT;\n\t\tif (stencil) mask |= gl.STENCIL_BUFFER_BIT;\n\n\t\t// gl.clearBufferfv(gl.COLOR, 0, [0.0, 0.0, 0.0, 0.0]);\n\n\t\tgl.blitFramebuffer(\n\t\t\t0, 0, read.width, read.height,\n\t\t\t0, 0, draw.width, draw.height,\n\t\t\tmask, gl.NEAREST\n\t\t);\n\t}\n\n\tsetFramebufferExternal(renderTarget, webglFramebuffer) {\n\t\tconst renderTargetProperties = this.get(renderTarget);\n\n\t\tif (!renderTargetProperties.__external) {\n\t\t\tif (renderTargetProperties.__webglFramebuffer) {\n\t\t\t\tthis._gl.deleteFramebuffer(renderTargetProperties.__webglFramebuffer);\n\t\t\t} else {\n\t\t\t\trenderTarget.addEventListener('dispose', this._onRenderTargetDispose);\n\t\t\t}\n\t\t}\n\n\t\trenderTargetProperties.__webglFramebuffer = webglFramebuffer;\n\t\trenderTargetProperties.__external = true;\n\t}\n\n}\n\nconst attachTargetToGL = {\n\t[ATTACHMENT.COLOR_ATTACHMENT0]: 0x8CE0,\n\t[ATTACHMENT.COLOR_ATTACHMENT1]: 0x8CE1,\n\t[ATTACHMENT.COLOR_ATTACHMENT2]: 0x8CE2,\n\t[ATTACHMENT.COLOR_ATTACHMENT3]: 0x8CE3,\n\t[ATTACHMENT.COLOR_ATTACHMENT4]: 0x8CE4,\n\t[ATTACHMENT.COLOR_ATTACHMENT5]: 0x8CE5,\n\t[ATTACHMENT.COLOR_ATTACHMENT6]: 0x8CE6,\n\t[ATTACHMENT.COLOR_ATTACHMENT7]: 0x8CE7,\n\t[ATTACHMENT.COLOR_ATTACHMENT8]: 0x8CE8,\n\t[ATTACHMENT.COLOR_ATTACHMENT9]: 0x8CE9,\n\t[ATTACHMENT.COLOR_ATTACHMENT10]: 0x8CEA,\n\t[ATTACHMENT.COLOR_ATTACHMENT11]: 0x8CEB,\n\t[ATTACHMENT.COLOR_ATTACHMENT12]: 0x8CEC,\n\t[ATTACHMENT.COLOR_ATTACHMENT13]: 0x8CED,\n\t[ATTACHMENT.COLOR_ATTACHMENT14]: 0x8CEE,\n\t[ATTACHMENT.COLOR_ATTACHMENT15]: 0x8CEF,\n\t[ATTACHMENT.DEPTH_ATTACHMENT]: 0x8D00,\n\t[ATTACHMENT.STENCIL_ATTACHMENT]: 0x8D20,\n\t[ATTACHMENT.DEPTH_STENCIL_ATTACHMENT]: 0x821A\n};\n\nfunction drawBufferSort(a, b) {\n\treturn a - b;\n}\n\nexport { WebGLRenderTargets };"
  },
  {
    "path": "src/webgl/WebGLRenderer.js",
    "content": "import { WebGLPrograms } from './WebGLPrograms.js';\nimport { WebGLCapabilities } from './WebGLCapabilities.js';\nimport { WebGLConstants } from './WebGLConstants.js';\nimport { WebGLState } from './WebGLState.js';\nimport { WebGLTextures } from './WebGLTextures.js';\nimport { WebGLRenderBuffers } from './WebGLRenderBuffers.js';\nimport { WebGLRenderTargets } from './WebGLRenderTargets.js';\nimport { WebGLBuffers } from './WebGLBuffers.js';\nimport { WebGLGeometries } from './WebGLGeometries.js';\nimport { WebGLMaterials } from './WebGLMaterials.js';\nimport { WebGLVertexArrayBindings } from './WebGLVertexArrayBindings.js';\nimport { WebGLQuerySets } from './WebGLQuerySets.js';\nimport { WebGLLights } from './WebGLLights.js';\nimport { Vector4 } from '../math/Vector4.js';\nimport { Matrix4 } from '../math/Matrix4.js';\nimport { Matrix3 } from '../math/Matrix3.js';\nimport { MathUtils } from '../math/MathUtils.js';\nimport { ThinRenderer } from '../render/ThinRenderer.js';\nimport { LightingGroup } from '../render/LightingGroup.js';\nimport { TEXTURE_FILTER } from '../const.js';\n\nconst helpVector4 = new Vector4();\nconst helpMatrix3 = new Matrix3();\nconst helpMatrix4 = new Matrix4();\n\nconst influencesList = new WeakMap();\nconst morphInfluences = new Float32Array(8);\n\nconst _envData = { map: null, diffuse: 1, specular: 1 };\nlet _clippingPlanesData = new Float32Array([]);\n\nfunction defaultGetGeometry(renderable) {\n\treturn renderable.geometry;\n}\n\nfunction defaultGetMaterial(renderable) {\n\treturn renderable.material;\n}\n\nfunction defaultIfRender(renderable) {\n\treturn true;\n}\n\nconst _emptyLightingGroup = new LightingGroup();\n\nfunction getLightingGroup(lighting, material) {\n\tif (!material.acceptLight) {\n\t\treturn _emptyLightingGroup;\n\t}\n\n\tconst lightingGroup = lighting.getGroup(material.lightingGroup);\n\tif (lightingGroup && lightingGroup.totalNum > 0) {\n\t\treturn lightingGroup;\n\t}\n\n\treturn _emptyLightingGroup;\n}\n\nfunction clientWaitAsync(gl) {\n\tconst sync = gl.fenceSync(gl.SYNC_GPU_COMMANDS_COMPLETE, 0);\n\n\tgl.flush();\n\n\treturn new Promise(function(resolve, reject) {\n\t\tfunction test() {\n\t\t\tconst res = gl.clientWaitSync(sync, gl.SYNC_FLUSH_COMMANDS_BIT, 0);\n\n\t\t\tif (res === gl.WAIT_FAILED) {\n\t\t\t\tgl.deleteSync(sync);\n\t\t\t\treject();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (res === gl.TIMEOUT_EXPIRED) {\n\t\t\t\trequestAnimationFrame(test);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tgl.deleteSync(sync);\n\n\t\t\tresolve();\n\t\t}\n\n\t\ttest();\n\t});\n}\n\n/**\n * The WebGL renderer.\n * @extends ThinRenderer\n */\nclass WebGLRenderer extends ThinRenderer {\n\n\t/**\n\t * Create a WebGLRenderer.\n\t * @param {WebGLRenderingContext} [context] - The WebGL Rendering Context privided by canvas.\n\t * If not provided, you must call {@link WebGLRenderer.init} method with a valid context\n\t * before using this renderer.\n\t */\n\tconstructor(context) {\n\t\tsuper();\n\n\t\t/**\n\t\t * An object containing details about the capabilities of the current RenderingContext.\n\t\t * @type {WebGLCapabilities}\n\t\t */\n\t\tthis.capabilities = {};\n\n\t\tthis._textures = null;\n\t\tthis._renderBuffers = null;\n\t\tthis._renderTargets = null;\n\t\tthis._buffers = null;\n\t\tthis._geometries = null;\n\t\tthis._lights = null;\n\t\tthis._programs = null;\n\t\tthis._materials = null;\n\t\tthis._state = null;\n\t\tthis._vertexArrayBindings = null;\n\n\t\tif (context) {\n\t\t\tthis.init(context);\n\t\t}\n\n\t\t// Cache current material if beginRender is called.\n\t\tthis._currentMaterial = null;\n\n\t\tthis._currentOcclusionQuerySet = null;\n\n\t\tthis._currentTimestampWrites = {\n\t\t\tquerySet: null,\n\t\t\tbeginningOfPassWriteIndex: -1,\n\t\t\tendOfPassWriteIndex: -1\n\t\t};\n\t}\n\n\tinit(context, options = {}) {\n\t\tif (!context) {\n\t\t\tcontext = this.context;\n\t\t}\n\n\t\tif (!context) {\n\t\t\tthrow new Error('WebGLRenderer.init: context must be provided.');\n\t\t}\n\n\t\tthis.context = context;\n\n\t\tconst prefix = `_gl${this.increaseId()}`;\n\n\t\tconst capabilities = new WebGLCapabilities(context);\n\t\tconst constants = new WebGLConstants(context, capabilities);\n\t\tconst state = new WebGLState(context, capabilities);\n\t\tconst textures = new WebGLTextures(prefix, context, state, capabilities, constants);\n\t\tconst renderBuffers = new WebGLRenderBuffers(prefix, context, capabilities, constants);\n\t\tconst renderTargets = new WebGLRenderTargets(prefix, context, state, capabilities, textures, renderBuffers, constants);\n\t\tconst buffers = new WebGLBuffers(prefix, context, capabilities);\n\t\tconst vertexArrayBindings = new WebGLVertexArrayBindings(prefix, context, capabilities, buffers);\n\t\tconst geometries = new WebGLGeometries(prefix, context, buffers, vertexArrayBindings);\n\t\tconst lights = new WebGLLights(prefix, capabilities, textures);\n\t\tconst programs = new WebGLPrograms(context, state, capabilities);\n\t\tconst materials = new WebGLMaterials(prefix, programs, vertexArrayBindings);\n\t\tconst querySets = new WebGLQuerySets(prefix, context, capabilities);\n\n\t\tthis.capabilities = capabilities;\n\n\t\tthis._constants = constants;\n\t\tthis._textures = textures;\n\t\tthis._renderBuffers = renderBuffers;\n\t\tthis._renderTargets = renderTargets;\n\t\tthis._buffers = buffers;\n\t\tthis._geometries = geometries;\n\t\tthis._lights = lights;\n\t\tthis._programs = programs;\n\t\tthis._materials = materials;\n\t\tthis._state = state;\n\t\tthis._vertexArrayBindings = vertexArrayBindings;\n\t\tthis._querySets = querySets;\n\n\t\treturn Promise.resolve(this);\n\t}\n\n\tbeginRender(renderTarget) {\n\t\tsuper.beginRender(renderTarget);\n\n\t\tif (renderTarget) {\n\t\t\tthis._renderTargets.setRenderTarget(renderTarget);\n\n\t\t\tconst gl = this.context;\n\t\t\tconst state = this._state;\n\n\t\t\tlet clearBits = 0;\n\n\t\t\tif (renderTarget.clearColor) {\n\t\t\t\tstate.colorBuffer.setClear(\n\t\t\t\t\trenderTarget.colorClearValue.r,\n\t\t\t\t\trenderTarget.colorClearValue.g,\n\t\t\t\t\trenderTarget.colorClearValue.b,\n\t\t\t\t\trenderTarget.colorClearValue.a\n\t\t\t\t);\n\t\t\t\tclearBits |= gl.COLOR_BUFFER_BIT;\n\t\t\t}\n\n\t\t\tif (renderTarget.clearDepth) {\n\t\t\t\tstate.depthBuffer.setClear(renderTarget.depthClearValue);\n\t\t\t\tclearBits |= gl.DEPTH_BUFFER_BIT;\n\t\t\t}\n\n\t\t\tif (renderTarget.clearStencil) {\n\t\t\t\tstate.stencilBuffer.setClear(renderTarget.stencilClearValue);\n\t\t\t\tclearBits |= gl.STENCIL_BUFFER_BIT;\n\t\t\t}\n\n\t\t\tif (clearBits > 0) { // Prevent warning when bits is equal to zero\n\t\t\t\tgl.clear(clearBits);\n\t\t\t}\n\n\t\t\tthis._currentOcclusionQuerySet = renderTarget.occlusionQuerySet;\n\t\t\tthis._currentTimestampWrites.querySet = renderTarget.timestampWrites.querySet;\n\t\t\tthis._currentTimestampWrites.beginningOfPassWriteIndex = renderTarget.timestampWrites.beginningOfPassWriteIndex;\n\t\t\tthis._currentTimestampWrites.endOfPassWriteIndex = renderTarget.timestampWrites.endOfPassWriteIndex;\n\t\t}\n\n\t\tif (this._currentOcclusionQuerySet) {\n\t\t\tthis._querySets.setQuerySet(this._currentOcclusionQuerySet);\n\t\t}\n\n\t\tif (this._currentTimestampWrites.querySet) {\n\t\t\tthis._querySets.setQuerySet(this._currentTimestampWrites.querySet);\n\n\t\t\tif (this.capabilities.canUseTimestamp) {\n\t\t\t\tthis._querySets.queryCounter(\n\t\t\t\t\tthis._currentTimestampWrites.querySet,\n\t\t\t\t\tthis._currentTimestampWrites.beginningOfPassWriteIndex\n\t\t\t\t);\n\t\t\t} else { // fallback to use TIME_ELAPSED_EXT\n\t\t\t\tthis._querySets.beginQuery(\n\t\t\t\t\tthis._currentTimestampWrites.querySet,\n\t\t\t\t\tthis._currentTimestampWrites.endOfPassWriteIndex\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\n\tendRender() {\n\t\tif (this._currentTimestampWrites.querySet) {\n\t\t\tif (this.capabilities.canUseTimestamp) {\n\t\t\t\tthis._querySets.queryCounter(\n\t\t\t\t\tthis._currentTimestampWrites.querySet,\n\t\t\t\t\tthis._currentTimestampWrites.endOfPassWriteIndex\n\t\t\t\t);\n\t\t\t} else { // fallback to use TIME_ELAPSED_EXT\n\t\t\t\tthis._querySets.endQuery(this._currentTimestampWrites.querySet);\n\t\t\t}\n\t\t}\n\n\t\t// Ensure depth buffer writing is enabled so it can be cleared on next render\n\t\tconst state = this._state;\n\t\tstate.depthBuffer.setTest(true);\n\t\tstate.depthBuffer.setMask(true);\n\t\tstate.colorBuffer.setMask(true);\n\n\t\tthis._currentMaterial = null;\n\n\t\t// Automatically clear the occlusion query set and timestamp writes\n\t\tthis._currentOcclusionQuerySet = null;\n\t\tthis._currentTimestampWrites.querySet = null;\n\n\t\tsuper.endRender();\n\t}\n\n\trenderRenderableItem(renderable, renderStates, options) {\n\t\tconst state = this._state;\n\t\tconst capabilities = this.capabilities;\n\t\tconst vertexArrayBindings = this._vertexArrayBindings;\n\t\tconst textures = this._textures;\n\t\tconst passInfo = this._passInfo;\n\n\t\tconst getGeometry = options.getGeometry || defaultGetGeometry;\n\t\tconst getMaterial = options.getMaterial || defaultGetMaterial;\n\t\tconst beforeRender = options.beforeRender;\n\t\tconst afterRender = options.afterRender;\n\t\tconst ifRender = options.ifRender || defaultIfRender;\n\t\tconst renderInfo = options.renderInfo;\n\n\t\tconst sceneData = renderStates.scene;\n\t\tconst cameraData = renderStates.camera;\n\n\t\tconst currentRenderTarget = state.currentRenderTarget;\n\n\t\tif (!ifRender(renderable)) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (!passInfo.enabled) {\n\t\t\tconsole.warn('WebGLRenderer: beginRender must be called before renderRenderableItem.');\n\t\t\treturn;\n\t\t}\n\n\t\tconst object = renderable.object;\n\t\tconst material = getMaterial.call(this, renderable);\n\t\tconst geometry = getGeometry.call(this, renderable);\n\t\tconst group = renderable.group;\n\t\tconst fog = material.fog ? sceneData.fog : null;\n\n\t\tconst lightingGroup = getLightingGroup(renderStates.lighting, material);\n\t\tconst lightingState = this._lights.setLightingGroup(lightingGroup, passInfo, this.lightingOptions, cameraData).state;\n\t\tconst hasLighting = lightingState.hasLight();\n\t\tconst hasShadow = lightingState.hasShadow() && object.receiveShadow;\n\n\t\t_envData.map = material.envMap !== undefined ? (material.envMap || sceneData.environment) : null;\n\t\t_envData.diffuse = sceneData.envDiffuseIntensity * material.envMapIntensity;\n\t\t_envData.specular = sceneData.envSpecularIntensity * material.envMapIntensity;\n\n\t\tlet clippingPlanesData = sceneData.clippingPlanesData;\n\t\tlet numClippingPlanes = sceneData.numClippingPlanes;\n\t\tif (material.clippingPlanes && material.clippingPlanes.length > 0) {\n\t\t\tif (_clippingPlanesData.length < material.clippingPlanes.length * 4) {\n\t\t\t\t_clippingPlanesData = new Float32Array(material.clippingPlanes.length * 4);\n\t\t\t}\n\t\t\tclippingPlanesData = sceneData.setClippingPlanesData(material.clippingPlanes, _clippingPlanesData);\n\t\t\tnumClippingPlanes = material.clippingPlanes.length;\n\t\t}\n\n\t\tobject.onBeforeRender(renderable, material);\n\t\tbeforeRender && beforeRender.call(this, renderable, material);\n\n\t\t// Check material version\n\n\t\tconst materialProperties = this._materials.setMaterial(material);\n\n\t\tif (material.needsUpdate === false) {\n\t\t\tif (materialProperties.currentProgram === undefined) {\n\t\t\t\tmaterial.needsUpdate = true;\n\t\t\t} else if (materialProperties.fog !== fog) {\n\t\t\t\tmaterial.needsUpdate = true;\n\t\t\t} else if (materialProperties.envMap !== _envData.map) {\n\t\t\t\tmaterial.needsUpdate = true;\n\t\t\t} else if (materialProperties.numClippingPlanes !== numClippingPlanes) {\n\t\t\t\tmaterial.needsUpdate = true;\n\t\t\t} else if (materialProperties.logarithmicDepthBuffer !== sceneData.logarithmicDepthBuffer) {\n\t\t\t\tmaterial.needsUpdate = true;\n\t\t\t} else if (renderStates.outputEncoding !== materialProperties.outputEncoding ||\n\t\t\t\trenderStates.gammaFactor !== materialProperties.gammaFactor) {\n\t\t\t\tmaterial.needsUpdate = true;\n\t\t\t} else if (capabilities.version > 1 && sceneData.disableShadowSampler !== materialProperties.disableShadowSampler) {\n\t\t\t\tmaterial.needsUpdate = true;\n\t\t\t} else {\n\t\t\t\tif (hasLighting !== materialProperties.hasLighting) {\n\t\t\t\t\tmaterial.needsUpdate = true;\n\t\t\t\t} else if (hasLighting) {\n\t\t\t\t\tif (!lightingState.compare(materialProperties.lightingFactors)) {\n\t\t\t\t\t\tmaterial.needsUpdate = true;\n\t\t\t\t\t} else if (hasShadow !== materialProperties.hasShadow) {\n\t\t\t\t\t\tmaterial.needsUpdate = true;\n\t\t\t\t\t} else if (hasShadow) {\n\t\t\t\t\t\tmaterial.needsUpdate = materialProperties.shadowType !== object.shadowType;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Update program if needed.\n\n\t\tif (material.needsUpdate) {\n\t\t\tthis._materials.updateProgram(material, object, lightingState, renderStates, this.shaderCompileOptions);\n\n\t\t\tmaterialProperties.fog = fog;\n\t\t\tmaterialProperties.envMap = _envData.map;\n\t\t\tmaterialProperties.logarithmicDepthBuffer = sceneData.logarithmicDepthBuffer;\n\n\t\t\tmaterialProperties.hasLighting = hasLighting;\n\t\t\tmaterialProperties.lightingFactors = lightingState.copyTo(materialProperties.lightingFactors);\n\t\t\tmaterialProperties.hasShadow = hasShadow;\n\t\t\tmaterialProperties.shadowType = object.shadowType;\n\n\t\t\tmaterialProperties.numClippingPlanes = numClippingPlanes;\n\t\t\tmaterialProperties.outputEncoding = renderStates.outputEncoding;\n\t\t\tmaterialProperties.gammaFactor = renderStates.gammaFactor;\n\t\t\tmaterialProperties.disableShadowSampler = sceneData.disableShadowSampler;\n\n\t\t\tmaterial.needsUpdate = false;\n\t\t}\n\n\t\tconst program = materialProperties.currentProgram;\n\n\t\tif (options.onlyCompile || !program.isReady(capabilities.parallelShaderCompileExt)) return;\n\n\t\tstate.setProgram(program);\n\n\t\tthis._geometries.setGeometry(geometry, passInfo);\n\n\t\t// update morph targets\n\t\tif (object.morphTargetInfluences) {\n\t\t\tthis._updateMorphtargets(object, geometry, program);\n\t\t}\n\n\t\tvertexArrayBindings.setup(object, geometry, program);\n\n\t\tlet refreshCamera = false;\n\t\tif (program.cameraId !== cameraData.id || program.cameraVersion !== cameraData.version) {\n\t\t\trefreshCamera = true;\n\t\t\tprogram.cameraId = cameraData.id;\n\t\t\tprogram.cameraVersion = cameraData.version;\n\t\t}\n\n\t\tlet refreshScene = false;\n\t\tif (program.sceneId !== sceneData.id || program.sceneVersion !== sceneData.version) {\n\t\t\trefreshScene = true;\n\t\t\tprogram.sceneId = sceneData.id;\n\t\t\tprogram.sceneVersion = sceneData.version;\n\t\t}\n\n\t\tlet refreshMaterial = true;\n\t\tif (!material.forceUpdateUniforms) {\n\t\t\tif (materialProperties.pass !== passInfo.count) {\n\t\t\t\tmaterialProperties.pass = passInfo.count;\n\t\t\t} else {\n\t\t\t\trefreshMaterial = this._currentMaterial !== material;\n\t\t\t}\n\t\t}\n\t\tthis._currentMaterial = material;\n\n\t\tconst uniforms = program.getUniforms();\n\n\t\t// upload light uniforms\n\t\tif (hasLighting) {\n\t\t\tthis._lights.uploadUniforms(program, lightingGroup, sceneData.disableShadowSampler);\n\t\t}\n\n\t\t// upload bone matrices\n\t\tif (object.isSkinnedMesh) {\n\t\t\tthis._uploadSkeleton(uniforms, object, sceneData);\n\t\t}\n\n\t\t// upload other uniforms\n\t\tfor (let n = 0, ll = uniforms.seq.length; n < ll; n++) {\n\t\t\tconst uniform = uniforms.seq[n];\n\t\t\tconst key = uniform.id;\n\t\t\tconst internalGroup = uniform.internalGroup;\n\n\t\t\t// upload custom uniforms\n\t\t\tif (material.uniforms && material.uniforms[key] !== undefined) {\n\t\t\t\tuniform.set(material.uniforms[key], textures);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// u_Model: always upload this matrix\n\t\t\tif (internalGroup === 1) {\n\t\t\t\tlet modelMatrix = object.worldMatrix;\n\t\t\t\tif (sceneData.useAnchorMatrix) {\n\t\t\t\t\tmodelMatrix = helpMatrix4.copy(modelMatrix).premultiply(sceneData.anchorMatrixInverse);\n\t\t\t\t}\n\t\t\t\tuniform.set(modelMatrix.elements);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// uniforms about camera data\n\t\t\tif (internalGroup === 2 && refreshCamera) {\n\t\t\t\tuniform.internalFun(cameraData);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// uniforms about scene data\n\t\t\tif (internalGroup === 3 && refreshScene) {\n\t\t\t\tuniform.internalFun(sceneData);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// uniforms about material\n\t\t\tif (internalGroup === 4 && refreshMaterial) {\n\t\t\t\tuniform.internalFun(material, textures);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// uniforms about environment map\n\t\t\tif (internalGroup === 5) {\n\t\t\t\tuniform.internalFun(_envData, textures);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// other internal uniforms\n\t\t\tif (key === 'clippingPlanes') {\n\t\t\t\tuniform.set(clippingPlanesData);\n\t\t\t} else if (key === 'u_RenderTargetSize') {\n\t\t\t\tuniform.setValue(currentRenderTarget.width, currentRenderTarget.height);\n\t\t\t}\n\t\t}\n\n\t\tconst frontFaceCW = helpMatrix3.setFromMatrix4(object.worldMatrix).determinant() < 0;\n\t\tstate.setMaterial(material, frontFaceCW);\n\n\t\tconst viewport = helpVector4.set(\n\t\t\tcurrentRenderTarget.width,\n\t\t\tcurrentRenderTarget.height,\n\t\t\tcurrentRenderTarget.width,\n\t\t\tcurrentRenderTarget.height\n\t\t).multiply(cameraData.rect);\n\n\t\tviewport.z -= viewport.x;\n\t\tviewport.w -= viewport.y;\n\n\t\tstate.viewport(viewport.round());\n\n\t\tthis._draw(geometry, material, group, renderInfo);\n\n\t\ttextures.resetTextureUnits();\n\n\t\tafterRender && afterRender.call(this, renderable);\n\t\tobject.onAfterRender(renderable);\n\t}\n\n\tblitRenderTarget(read, draw, color = true, depth = true, stencil = true) {\n\t\tthis._renderTargets.blitRenderTarget(read, draw, color, depth, stencil);\n\t}\n\n\tgenerateMipmaps(texture) {\n\t\tconst state = this._state;\n\t\tconst capabilities = this.capabilities;\n\t\tconst textures = this._textures;\n\n\t\tconst textureProperties = textures.get(texture);\n\n\t\tif (!textureProperties.__webglTexture) return;\n\n\t\tconst powerOfTwo = MathUtils.isPowerOfTwo(textureProperties.__width)\n\t\t\t&& MathUtils.isPowerOfTwo(textureProperties.__height);\n\n\t\tif (\n\t\t\ttexture.generateMipmaps\n\t\t\t&& texture.minFilter !== TEXTURE_FILTER.NEAREST\n\t\t\t&& texture.minFilter !== TEXTURE_FILTER.LINEAR\n\t\t\t&& (powerOfTwo || capabilities.version >= 2)\n\t\t) {\n\t\t\tconst target = textureProperties.__webglTarget;\n\t\t\tstate.bindTexture(target, textureProperties.__webglTexture);\n\t\t\ttextures.generateMipmaps(texture);\n\t\t\tstate.bindTexture(target, null);\n\t\t}\n\t}\n\n\treadTexturePixels(texture, x, y, width, height, buffer, zIndex = 0, mipLevel = 0) {\n\t\tconst gl = this.context;\n\t\tconst constants = this._constants;\n\t\tconst state = this._state;\n\t\tconst renderTargets = this._renderTargets;\n\t\tconst textures = this._textures;\n\n\t\tif (!this._bindTextureToDummyFrameBuffer(texture, zIndex, mipLevel)) {\n\t\t\treturn Promise.reject('WebGLRenderer.readTexturePixels: Unsupported texture.');\n\t\t}\n\n\t\tconst glType = constants.getGLType(texture.type);\n\t\tconst glFormat = constants.getGLFormat(texture.format);\n\n\t\tconst textureProperties = textures.get(texture);\n\t\tif (textureProperties.__readBuffer === undefined) {\n\t\t\ttextureProperties.__readBuffer = gl.createBuffer();\n\t\t}\n\t\tgl.bindBuffer(gl.PIXEL_PACK_BUFFER, textureProperties.__readBuffer);\n\t\tgl.bufferData(gl.PIXEL_PACK_BUFFER, buffer.byteLength, gl.STREAM_READ);\n\n\t\tgl.readPixels(x, y, width, height, glFormat, glType, 0);\n\n\t\t// restore framebuffer binding\n\t\tconst framebuffer = (state.currentRenderTarget && !state.currentRenderTarget.isScreenRenderTarget) ?\n\t\t\trenderTargets.get(state.currentRenderTarget).__webglFramebuffer : null;\n\t\tgl.bindFramebuffer(gl.FRAMEBUFFER, framebuffer);\n\n\t\treturn clientWaitAsync(gl).then(() => {\n\t\t\tif (!textureProperties.__readBuffer) {\n\t\t\t\tthrow new Error('WebGLRenderer.readTexturePixels: Texture has been disposed.');\n\t\t\t}\n\n\t\t\tgl.bindBuffer(gl.PIXEL_PACK_BUFFER, textureProperties.__readBuffer);\n\t\t\tgl.getBufferSubData(gl.PIXEL_PACK_BUFFER, 0, buffer);\n\t\t\tgl.bindBuffer(gl.PIXEL_PACK_BUFFER, null);\n\n\t\t\treturn buffer;\n\t\t});\n\t}\n\n\treadTexturePixelsSync(texture, x, y, width, height, buffer, zIndex = 0, mipLevel = 0) {\n\t\tconst gl = this.context;\n\t\tconst constants = this._constants;\n\t\tconst state = this._state;\n\t\tconst renderTargets = this._renderTargets;\n\n\t\tif (!this._bindTextureToDummyFrameBuffer(texture, zIndex, mipLevel)) {\n\t\t\tconsole.warn('WebGLRenderer.readTexturePixels: Unsupported texture.');\n\t\t\treturn buffer;\n\t\t}\n\n\t\tconst glType = constants.getGLType(texture.type);\n\t\tconst glFormat = constants.getGLFormat(texture.format);\n\n\t\tgl.readPixels(x, y, width, height, glFormat, glType, buffer);\n\n\t\t// restore framebuffer binding\n\t\tconst framebuffer = (state.currentRenderTarget && !state.currentRenderTarget.isScreenRenderTarget) ?\n\t\t\trenderTargets.get(state.currentRenderTarget).__webglFramebuffer : null;\n\t\tgl.bindFramebuffer(gl.FRAMEBUFFER, framebuffer);\n\n\t\treturn buffer;\n\t}\n\n\tresetVertexArrayBindings(force) {\n\t\tthis._vertexArrayBindings.reset(force);\n\t}\n\n\tresetState() {\n\t\tthis._state.reset();\n\t}\n\n\tbeginOcclusionQuery(index) {\n\t\tconst querySet = this._currentOcclusionQuerySet;\n\t\tif (!querySet) return;\n\t\tthis._querySets.beginQuery(querySet, index);\n\t}\n\n\tendOcclusionQuery() {\n\t\tconst querySet = this._currentOcclusionQuerySet;\n\t\tif (!querySet) return;\n\t\tthis._querySets.endQuery(querySet);\n\t}\n\n\tasync readQuerySetResults(querySet, dstBuffer, firstQuery = 0, queryCount = querySet.count) {\n\t\treturn this._querySets.readQuerySetResults(querySet, dstBuffer, firstQuery, queryCount);\n\t}\n\n\t/**\n\t * Bind webglTexture to Texture.\n\t * @param {TextureBase} texture\n\t * @param {WebGLTexture} webglTexture\n\t */\n\tsetTextureExternal(texture, webglTexture) {\n\t\tthis._textures.setTextureExternal(texture, webglTexture);\n\t}\n\n\t/**\n\t * Bind webglRenderbuffer to RenderBuffer.\n\t * @param {RenderBuffer} renderBuffer\n\t * @param {WebGLRenderbuffer} webglRenderbuffer\n\t */\n\tsetRenderBufferExternal(renderBuffer, webglRenderbuffer) {\n\t\tthis._renderBuffers.setRenderBufferExternal(renderBuffer, webglRenderbuffer);\n\t}\n\n\t/**\n\t * Bind webglBuffer to Buffer.\n\t * @param {Buffer} buffer\n\t * @param {WebGLBuffer} webglBuffer\n\t */\n\tsetBufferExternal(buffer, webglBuffer) {\n\t\tthis._buffers.setBufferExternal(buffer, webglBuffer);\n\t}\n\n\t/**\n\t * Bind webglFramebuffer to RenderTarget.\n\t * @param {RenderTarget} renderTarget\n\t * @param {WebGLFramebuffer} webglFramebuffer\n\t */\n\tsetFramebufferExternal(renderTarget, webglFramebuffer) {\n\t\tthis._renderTargets.setFramebufferExternal(renderTarget, webglFramebuffer);\n\t}\n\n\t_uploadSkeleton(uniforms, object, sceneData) {\n\t\tif (object.skeleton && object.skeleton.bones.length > 0) {\n\t\t\tconst skeleton = object.skeleton;\n\t\t\tconst capabilities = this.capabilities;\n\n\t\t\tif (capabilities.maxVertexTextures > 0 && (!!capabilities.getExtension('OES_texture_float') || capabilities.version >= 2)) {\n\t\t\t\tif (skeleton.boneTexture === undefined) {\n\t\t\t\t\tskeleton.generateBoneTexture(capabilities.version >= 2);\n\t\t\t\t}\n\n\t\t\t\tuniforms.set('boneTexture', skeleton.boneTexture, this._textures);\n\t\t\t\tuniforms.set('boneTextureSize', skeleton.boneTexture.image.width);\n\t\t\t} else {\n\t\t\t\tuniforms.set('boneMatrices', skeleton.boneMatrices);\n\t\t\t}\n\n\t\t\tuniforms.set('bindMatrix', object.bindMatrix.elements);\n\n\t\t\thelpMatrix4.copy(object.bindMatrixInverse);\n\t\t\tif (sceneData.useAnchorMatrix) {\n\t\t\t\thelpMatrix4.multiply(sceneData.anchorMatrix); // convert to anchor space\n\t\t\t}\n\t\t\tuniforms.set('bindMatrixInverse', helpMatrix4.elements);\n\t\t}\n\t}\n\n\t_updateMorphtargets(object, geometry, program) {\n\t\tconst objectInfluences = object.morphTargetInfluences;\n\n\t\tif (!influencesList.has(geometry)) {\n\t\t\tinfluencesList.set(geometry, objectInfluences.slice(0));\n\t\t}\n\n\t\tconst morphTargets = geometry.morphAttributes.position;\n\t\tconst morphNormals = geometry.morphAttributes.normal;\n\n\t\t// Remove current morphAttributes\n\n\t\tconst influences = influencesList.get(geometry);\n\n\t\tfor (let i = 0; i < influences.length; i++) {\n\t\t\tconst influence = influences[i];\n\n\t\t\tif (influence !== 0) {\n\t\t\t\tif (morphTargets) geometry.removeAttribute('morphTarget' + i);\n\t\t\t\tif (morphNormals) geometry.removeAttribute('morphNormal' + i);\n\t\t\t}\n\t\t}\n\n\t\t// Collect influences\n\n\t\tfor (let i = 0; i < objectInfluences.length; i++) {\n\t\t\tinfluences[i] = objectInfluences[i];\n\t\t}\n\n\t\tinfluences.length = objectInfluences.length;\n\n\t\t// Add morphAttributes\n\n\t\tlet count = 0;\n\n\t\tfor (let i = 0; i < influences.length; i++) {\n\t\t\tconst influence = influences[i];\n\n\t\t\tif (influence > 0) {\n\t\t\t\tif (morphTargets) geometry.addAttribute('morphTarget' + count, morphTargets[i]);\n\t\t\t\tif (morphNormals) geometry.addAttribute('morphNormal' + count, morphNormals[i]);\n\n\t\t\t\tmorphInfluences[count] = influence;\n\n\t\t\t\tcount++;\n\t\t\t}\n\t\t}\n\n\t\tfor (; count < 8; count++) {\n\t\t\tmorphInfluences[count] = 0;\n\t\t}\n\n\t\tprogram.getUniforms().set('morphTargetInfluences', morphInfluences);\n\t}\n\n\t_draw(geometry, material, group, renderInfo) {\n\t\tconst gl = this.context;\n\t\tconst capabilities = this.capabilities;\n\t\tconst buffers = this._buffers;\n\n\t\tconst instanceCount = geometry.instanceCount;\n\t\tconst useInstancing = instanceCount >= 0;\n\t\tconst useGroup = !!group;\n\t\tconst useMultiDraw = useGroup && group.multiDrawCount !== undefined;\n\t\tconst useIndexBuffer = geometry.index !== null;\n\n\t\tlet drawStart = 0;\n\t\tlet drawCount = Infinity;\n\n\t\tif (!useMultiDraw) {\n\t\t\tconst position = geometry.getAttribute('a_Position');\n\n\t\t\tif (useIndexBuffer) {\n\t\t\t\tdrawCount = geometry.index.buffer.count;\n\t\t\t} else if (position) {\n\t\t\t\tdrawCount = position.buffer.count;\n\t\t\t}\n\n\t\t\tif (useGroup) {\n\t\t\t\tdrawStart = Math.max(drawStart, group.start);\n\t\t\t\tdrawCount = Math.min(drawCount, group.count);\n\t\t\t}\n\n\t\t\tif (drawCount < 0 || drawCount === Infinity) return;\n\t\t}\n\n\t\tif (useIndexBuffer) {\n\t\t\tconst indexBufferProperties = buffers.get(geometry.index.buffer);\n\t\t\tconst bytesPerElement = indexBufferProperties.bytesPerElement;\n\t\t\tconst type = indexBufferProperties.type;\n\n\t\t\tif (type === gl.UNSIGNED_INT) {\n\t\t\t\tif (capabilities.version < 2 && !capabilities.getExtension('OES_element_index_uint')) {\n\t\t\t\t\tconsole.warn('WebGLRenderer: draw elements type not support UNSIGNED_INT!');\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (useInstancing) {\n\t\t\t\tif (instanceCount <= 0) return;\n\n\t\t\t\tif (capabilities.version >= 2) {\n\t\t\t\t\tgl.drawElementsInstanced(material.drawMode, drawCount, type, drawStart * bytesPerElement, instanceCount);\n\t\t\t\t} else if (capabilities.getExtension('ANGLE_instanced_arrays')) {\n\t\t\t\t\tcapabilities.getExtension('ANGLE_instanced_arrays').drawElementsInstancedANGLE(material.drawMode, drawCount, type, drawStart * bytesPerElement, instanceCount);\n\t\t\t\t} else {\n\t\t\t\t\tconsole.warn('WebGLRenderer: using instanced draw but hardware does not support.');\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t} else if (useMultiDraw) {\n\t\t\t\tif (group.multiDrawCount <= 0) return;\n\n\t\t\t\tconst extension = capabilities.getExtension('WEBGL_multi_draw');\n\n\t\t\t\tif (!extension) {\n\t\t\t\t\tconsole.warn('WebGLRenderer: using multi draw but hardware does not support extension WEBGL_multi_draw.');\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\textension.multiDrawElementsWEBGL(material.drawMode, group.multiDrawCounts, 0, type, group.multiDrawStarts, 0, group.multiDrawCount);\n\t\t\t} else {\n\t\t\t\tgl.drawElements(material.drawMode, drawCount, type, drawStart * bytesPerElement);\n\t\t\t}\n\t\t} else {\n\t\t\tif (useInstancing) {\n\t\t\t\tif (instanceCount <= 0) return;\n\n\t\t\t\tif (capabilities.version >= 2) {\n\t\t\t\t\tgl.drawArraysInstanced(material.drawMode, drawStart, drawCount, instanceCount);\n\t\t\t\t} else if (capabilities.getExtension('ANGLE_instanced_arrays')) {\n\t\t\t\t\tcapabilities.getExtension('ANGLE_instanced_arrays').drawArraysInstancedANGLE(material.drawMode, drawStart, drawCount, instanceCount);\n\t\t\t\t} else {\n\t\t\t\t\tconsole.warn('WebGLRenderer: using instanced draw but hardware does not support.');\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t} else if (useMultiDraw) {\n\t\t\t\tif (group.multiDrawCount <= 0) return;\n\n\t\t\t\tconst extension = capabilities.getExtension('WEBGL_multi_draw');\n\n\t\t\t\tif (!extension) {\n\t\t\t\t\tconsole.warn('WebGLRenderer: using multi draw but hardware does not support extension WEBGL_multi_draw.');\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\textension.multiDrawArraysWEBGL(material.drawMode, group.multiDrawStarts, 0, group.multiDrawCounts, 0, group.multiDrawCount);\n\t\t\t} else {\n\t\t\t\tgl.drawArrays(material.drawMode, drawStart, drawCount);\n\t\t\t}\n\t\t}\n\n\t\tif (renderInfo) {\n\t\t\tif (useMultiDraw) {\n\t\t\t\tdrawCount = 0;\n\t\t\t\tfor (let i = 0; i < group.multiDrawCount; i++) {\n\t\t\t\t\tdrawCount += group.multiDrawCounts[i];\n\t\t\t\t}\n\t\t\t}\n\t\t\trenderInfo.update(drawCount, material.drawMode, instanceCount < 0 ? 1 : instanceCount);\n\t\t}\n\t}\n\n\t_bindTextureToDummyFrameBuffer(texture, zIndex, mipLevel) {\n\t\tif (!texture.isTexture) return false;\n\n\t\tconst gl = this.context;\n\t\tconst textures = this._textures;\n\t\tconst state = this._state;\n\n\t\tif (!this._dummyFrameBuffer) {\n\t\t\tthis._dummyFrameBuffer = gl.createFramebuffer();\n\t\t}\n\n\t\tgl.bindFramebuffer(gl.FRAMEBUFFER, this._dummyFrameBuffer);\n\n\t\tconst textureProperties = textures.setTexture(texture);\n\t\tif (texture.isTexture2D) {\n\t\t\tgl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, textureProperties.__webglTexture, mipLevel);\n\t\t} else if (texture.isTextureCube) {\n\t\t\tgl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_CUBE_MAP_POSITIVE_X + zIndex, textureProperties.__webglTexture, mipLevel);\n\t\t} else if (texture.isTexture3D || texture.isTexture2DArray) {\n\t\t\tgl.framebufferTextureLayer(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, textureProperties.__webglTexture, mipLevel, zIndex);\n\t\t}\n\t\tstate.bindTexture(textureProperties.__webglTarget, null);\n\n\t\treturn true;\n\t}\n\n}\n\nexport { WebGLRenderer };"
  },
  {
    "path": "src/webgl/WebGLState.js",
    "content": "import { BLEND_TYPE, CULL_FACE_TYPE, DRAW_SIDE, COMPARE_FUNC, BLEND_EQUATION, BLEND_FACTOR } from '../const.js';\nimport { Vector4 } from '../math/Vector4.js';\n\nfunction createTexture(gl, type, target, count) {\n\tconst data = new Uint8Array(4); // 4 is required to match default unpack alignment of 4.\n\tconst texture = gl.createTexture();\n\n\tgl.bindTexture(type, texture);\n\tgl.texParameteri(type, gl.TEXTURE_MIN_FILTER, gl.NEAREST);\n\tgl.texParameteri(type, gl.TEXTURE_MAG_FILTER, gl.NEAREST);\n\n\tfor (let i = 0; i < count; i++) {\n\t\tgl.texImage2D(target + i, 0, gl.RGBA, 1, 1, 0, gl.RGBA, gl.UNSIGNED_BYTE, data);\n\t}\n\n\treturn texture;\n}\n\nfunction ColorBuffer(gl) {\n\tlet locked = false;\n\n\tconst color = new Vector4();\n\tlet currentColorMask = null;\n\tconst currentColorClear = new Vector4(0, 0, 0, 0);\n\n\treturn {\n\n\t\tsetMask: function(colorMask) {\n\t\t\tif (currentColorMask !== colorMask && !locked) {\n\t\t\t\tgl.colorMask(colorMask, colorMask, colorMask, colorMask);\n\t\t\t\tcurrentColorMask = colorMask;\n\t\t\t}\n\t\t},\n\n\t\tsetLocked: function(lock) {\n\t\t\tlocked = lock;\n\t\t},\n\n\t\tsetClear: function(r, g, b, a, premultipliedAlpha) {\n\t\t\tif (premultipliedAlpha === true) {\n\t\t\t\tr *= a; g *= a; b *= a;\n\t\t\t}\n\n\t\t\tcolor.set(r, g, b, a);\n\n\t\t\tif (currentColorClear.equals(color) === false) {\n\t\t\t\tgl.clearColor(r, g, b, a);\n\t\t\t\tcurrentColorClear.copy(color);\n\t\t\t}\n\t\t},\n\n\t\tgetClear: function() {\n\t\t\treturn currentColorClear;\n\t\t},\n\n\t\treset: function() {\n\t\t\tlocked = false;\n\n\t\t\tcurrentColorMask = null;\n\t\t\tcurrentColorClear.set(-1, 0, 0, 0); // set to invalid state\n\t\t}\n\n\t};\n}\n\nfunction DepthBuffer(gl, state) {\n\tlet locked = false;\n\n\tlet currentDepthMask = null;\n\tlet currentDepthFunc = null;\n\tlet currentDepthClear = null;\n\n\treturn {\n\n\t\tsetTest: function(depthTest) {\n\t\t\tif (depthTest) {\n\t\t\t\tstate.enable(gl.DEPTH_TEST);\n\t\t\t} else {\n\t\t\t\tstate.disable(gl.DEPTH_TEST);\n\t\t\t}\n\t\t},\n\n\t\tsetMask: function(depthMask) {\n\t\t\tif (currentDepthMask !== depthMask && !locked) {\n\t\t\t\tgl.depthMask(depthMask);\n\t\t\t\tcurrentDepthMask = depthMask;\n\t\t\t}\n\t\t},\n\n\t\tsetFunc: function(depthFunc) {\n\t\t\tif (currentDepthFunc !== depthFunc) {\n\t\t\t\tgl.depthFunc(depthFunc);\n\t\t\t\tcurrentDepthFunc = depthFunc;\n\t\t\t}\n\t\t},\n\n\t\tsetLocked: function(lock) {\n\t\t\tlocked = lock;\n\t\t},\n\n\t\tsetClear: function(depth) {\n\t\t\tif (currentDepthClear !== depth) {\n\t\t\t\tgl.clearDepth(depth);\n\t\t\t\tcurrentDepthClear = depth;\n\t\t\t}\n\t\t},\n\n\t\treset: function() {\n\t\t\tlocked = false;\n\n\t\t\tcurrentDepthMask = null;\n\t\t\tcurrentDepthFunc = null;\n\t\t\tcurrentDepthClear = null;\n\t\t}\n\n\t};\n}\n\nfunction StencilBuffer(gl, state) {\n\tlet locked = false;\n\n\tlet currentStencilMask = null;\n\tlet currentStencilFunc = null;\n\tlet currentStencilRef = null;\n\tlet currentStencilFuncMask = null;\n\tlet currentStencilFail = null;\n\tlet currentStencilZFail = null;\n\tlet currentStencilZPass = null;\n\tlet currentStencilFuncBack = null;\n\tlet currentStencilRefBack = null;\n\tlet currentStencilFuncMaskBack = null;\n\tlet currentStencilFailBack = null;\n\tlet currentStencilZFailBack = null;\n\tlet currentStencilZPassBack = null;\n\tlet currentStencilClear = null;\n\n\treturn {\n\n\t\tsetTest: function(stencilTest) {\n\t\t\tif (stencilTest) {\n\t\t\t\tstate.enable(gl.STENCIL_TEST);\n\t\t\t} else {\n\t\t\t\tstate.disable(gl.STENCIL_TEST);\n\t\t\t}\n\t\t},\n\n\t\tsetMask: function(stencilMask) {\n\t\t\tif (currentStencilMask !== stencilMask && !locked) {\n\t\t\t\tgl.stencilMask(stencilMask);\n\t\t\t\tcurrentStencilMask = stencilMask;\n\t\t\t}\n\t\t},\n\n\t\tsetFunc: function(stencilFunc, stencilRef, stencilMask, stencilFuncBack, stencilRefBack, stencilMaskBack) {\n\t\t\tif (currentStencilFunc !== stencilFunc ||\n\t\t\t\tcurrentStencilRef !== stencilRef ||\n\t\t\t\tcurrentStencilFuncMask !== stencilMask ||\n\t\t\t\tcurrentStencilFuncBack !== stencilFuncBack ||\n\t\t\t\tcurrentStencilRefBack !== stencilRefBack ||\n\t\t\t\tcurrentStencilFuncMaskBack !== stencilMaskBack) {\n\t\t\t\tif (stencilFuncBack === null || stencilRefBack === null || stencilMaskBack === null) {\n\t\t\t\t\tgl.stencilFunc(stencilFunc, stencilRef, stencilMask);\n\t\t\t\t} else {\n\t\t\t\t\tgl.stencilFuncSeparate(gl.FRONT, stencilFunc, stencilRef, stencilMask);\n\t\t\t\t\tgl.stencilFuncSeparate(gl.BACK, stencilFuncBack, stencilRefBack, stencilMaskBack);\n\t\t\t\t}\n\n\t\t\t\tcurrentStencilFunc = stencilFunc;\n\t\t\t\tcurrentStencilRef = stencilRef;\n\t\t\t\tcurrentStencilFuncMask = stencilMask;\n\t\t\t\tcurrentStencilFuncBack = stencilFuncBack;\n\t\t\t\tcurrentStencilRefBack = stencilRefBack;\n\t\t\t\tcurrentStencilFuncMaskBack = stencilMaskBack;\n\t\t\t}\n\t\t},\n\n\t\tsetOp: function(stencilFail, stencilZFail, stencilZPass, stencilFailBack, stencilZFailBack, stencilZPassBack) {\n\t\t\tif (currentStencilFail\t !== stencilFail \t||\n\t\t\t\tcurrentStencilZFail !== stencilZFail ||\n\t\t\t\tcurrentStencilZPass !== stencilZPass ||\n\t\t\t\tcurrentStencilFailBack\t !== stencilFailBack ||\n\t\t\t\tcurrentStencilZFailBack !== stencilZFailBack ||\n\t\t\t\tcurrentStencilZPassBack !== stencilZPassBack) {\n\t\t\t\tif (stencilFailBack === null || stencilZFailBack === null || stencilZPassBack === null) {\n\t\t\t\t\tgl.stencilOp(stencilFail, stencilZFail, stencilZPass);\n\t\t\t\t} else {\n\t\t\t\t\tgl.stencilOpSeparate(gl.FRONT, stencilFail, stencilZFail, stencilZPass);\n\t\t\t\t\tgl.stencilOpSeparate(gl.BACK, stencilFailBack, stencilZFailBack, stencilZPassBack);\n\t\t\t\t}\n\n\t\t\t\tcurrentStencilFail = stencilFail;\n\t\t\t\tcurrentStencilZFail = stencilZFail;\n\t\t\t\tcurrentStencilZPass = stencilZPass;\n\t\t\t\tcurrentStencilFailBack = stencilFailBack;\n\t\t\t\tcurrentStencilZFailBack = stencilZFailBack;\n\t\t\t\tcurrentStencilZPassBack = stencilZPassBack;\n\t\t\t}\n\t\t},\n\n\t\tsetLocked: function(lock) {\n\t\t\tlocked = lock;\n\t\t},\n\n\t\tsetClear: function(stencil) {\n\t\t\tif (currentStencilClear !== stencil) {\n\t\t\t\tgl.clearStencil(stencil);\n\t\t\t\tcurrentStencilClear = stencil;\n\t\t\t}\n\t\t},\n\n\t\treset: function() {\n\t\t\tlocked = false;\n\n\t\t\tcurrentStencilMask = null;\n\t\t\tcurrentStencilFunc = null;\n\t\t\tcurrentStencilRef = null;\n\t\t\tcurrentStencilFuncMask = null;\n\t\t\tcurrentStencilFail = null;\n\t\t\tcurrentStencilZFail = null;\n\t\t\tcurrentStencilZPass = null;\n\t\t\tcurrentStencilFuncBack = null;\n\t\t\tcurrentStencilRefBack = null;\n\t\t\tcurrentStencilFuncMaskBack = null;\n\t\t\tcurrentStencilFailBack = null;\n\t\t\tcurrentStencilZFailBack = null;\n\t\t\tcurrentStencilZPassBack = null;\n\t\t\tcurrentStencilClear = null;\n\t\t}\n\n\t};\n}\n\nclass WebGLState {\n\n\tconstructor(gl, capabilities) {\n\t\tthis.gl = gl;\n\t\tthis.capabilities = capabilities;\n\n\t\tthis.colorBuffer = new ColorBuffer(gl);\n\t\tthis.depthBuffer = new DepthBuffer(gl, this);\n\t\tthis.stencilBuffer = new StencilBuffer(gl, this);\n\n\t\tthis.states = {};\n\n\t\tthis.currentBlending = null;\n\t\tthis.currentBlendEquation = null;\n\t\tthis.currentBlendSrc = null;\n\t\tthis.currentBlendDst = null;\n\t\tthis.currentBlendEquationAlpha = null;\n\t\tthis.currentBlendSrcAlpha = null;\n\t\tthis.currentBlendDstAlpha = null;\n\t\tthis.currentPremultipliedAlpha = null;\n\n\t\tthis.currentFlipSided = false;\n\t\tthis.currentCullFace = null;\n\n\t\tconst viewportParam = gl.getParameter(gl.VIEWPORT);\n\t\tthis.currentViewport = new Vector4().fromArray(viewportParam);\n\n\t\tthis.currentLineWidth = null;\n\n\t\tthis.currentPolygonOffsetFactor = null;\n\t\tthis.currentPolygonOffsetUnits = null;\n\n\t\tthis.currentProgram = null;\n\n\t\tthis.currentBoundBuffers = {};\n\n\t\tthis.currentRenderTarget = null; // used in WebGLRenderTargets\n\n\t\tthis.currentTextureSlot = null;\n\t\tthis.currentBoundTextures = {};\n\n\t\tthis.emptyTextures = {};\n\t\tthis.emptyTextures[gl.TEXTURE_2D] = createTexture(gl, gl.TEXTURE_2D, gl.TEXTURE_2D, 1);\n\t\tthis.emptyTextures[gl.TEXTURE_CUBE_MAP] = createTexture(gl, gl.TEXTURE_CUBE_MAP, gl.TEXTURE_CUBE_MAP_POSITIVE_X, 6);\n\n\t\tthis.blendEquationToGL = {\n\t\t\t[BLEND_EQUATION.ADD]: gl.FUNC_ADD,\n\t\t\t[BLEND_EQUATION.SUBTRACT]: gl.FUNC_SUBTRACT,\n\t\t\t[BLEND_EQUATION.REVERSE_SUBTRACT]: gl.FUNC_REVERSE_SUBTRACT,\n\t\t\t[BLEND_EQUATION.MIN]: gl.MIN,\n\t\t\t[BLEND_EQUATION.MAX]: gl.MAX\n\t\t};\n\n\t\tthis.blendFactorToGL = {\n\t\t\t[BLEND_FACTOR.ZERO]: gl.ZERO,\n\t\t\t[BLEND_FACTOR.ONE]: gl.ONE,\n\t\t\t[BLEND_FACTOR.SRC_COLOR]: gl.SRC_COLOR,\n\t\t\t[BLEND_FACTOR.SRC_ALPHA]: gl.SRC_ALPHA,\n\t\t\t[BLEND_FACTOR.SRC_ALPHA_SATURATE]: gl.SRC_ALPHA_SATURATE,\n\t\t\t[BLEND_FACTOR.DST_COLOR]: gl.DST_COLOR,\n\t\t\t[BLEND_FACTOR.DST_ALPHA]: gl.DST_ALPHA,\n\t\t\t[BLEND_FACTOR.ONE_MINUS_SRC_COLOR]: gl.ONE_MINUS_SRC_COLOR,\n\t\t\t[BLEND_FACTOR.ONE_MINUS_SRC_ALPHA]: gl.ONE_MINUS_SRC_ALPHA,\n\t\t\t[BLEND_FACTOR.ONE_MINUS_DST_COLOR]: gl.ONE_MINUS_DST_COLOR,\n\t\t\t[BLEND_FACTOR.ONE_MINUS_DST_ALPHA]: gl.ONE_MINUS_DST_ALPHA\n\t\t};\n\n\t\t// init\n\n\t\tthis.colorBuffer.setClear(0, 0, 0, 1);\n\t\tthis.depthBuffer.setClear(1);\n\t\tthis.stencilBuffer.setClear(0);\n\n\t\tthis.depthBuffer.setTest(true);\n\t\tthis.depthBuffer.setFunc(COMPARE_FUNC.LEQUAL);\n\n\t\tthis.setFlipSided(false);\n\t\tthis.setCullFace(CULL_FACE_TYPE.BACK);\n\t}\n\n\tenable(id) {\n\t\tif (this.states[id] !== true) {\n\t\t\tthis.gl.enable(id);\n\t\t\tthis.states[id] = true;\n\t\t}\n\t}\n\n\tdisable(id) {\n\t\tif (this.states[id] !== false) {\n\t\t\tthis.gl.disable(id);\n\t\t\tthis.states[id] = false;\n\t\t}\n\t}\n\n\tsetBlending(blend, blendEquation, blendSrc, blendDst, blendEquationAlpha, blendSrcAlpha, blendDstAlpha, premultipliedAlpha) {\n\t\tconst gl = this.gl;\n\n\t\tif (blend === BLEND_TYPE.NONE) {\n\t\t\tthis.disable(gl.BLEND);\n\t\t\treturn;\n\t\t}\n\n\t\tthis.enable(gl.BLEND);\n\n\t\tif (blend !== BLEND_TYPE.CUSTOM) {\n\t\t\tif (blend !== this.currentBlending || premultipliedAlpha !== this.currentPremultipliedAlpha) {\n\t\t\t\tif (this.currentBlendEquation !== BLEND_EQUATION.ADD || this.currentBlendEquationAlpha !== BLEND_EQUATION.ADD) {\n\t\t\t\t\tgl.blendEquation(gl.FUNC_ADD);\n\t\t\t\t\tthis.currentBlendEquation = BLEND_EQUATION.ADD;\n\t\t\t\t\tthis.currentBlendEquationAlpha = BLEND_EQUATION.ADD;\n\t\t\t\t}\n\n\t\t\t\tif (blend === BLEND_TYPE.NORMAL) {\n\t\t\t\t\tif (premultipliedAlpha) {\n\t\t\t\t\t\tgl.blendFuncSeparate(gl.ONE, gl.ONE_MINUS_SRC_ALPHA, gl.ONE, gl.ONE_MINUS_SRC_ALPHA);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tgl.blendFuncSeparate(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA, gl.ONE, gl.ONE_MINUS_SRC_ALPHA);\n\t\t\t\t\t}\n\t\t\t\t} else if (blend === BLEND_TYPE.ADD) {\n\t\t\t\t\tif (premultipliedAlpha) {\n\t\t\t\t\t\tgl.blendFunc(gl.ONE, gl.ONE);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tgl.blendFunc(gl.SRC_ALPHA, gl.ONE);\n\t\t\t\t\t}\n\t\t\t\t} else if (blend === BLEND_TYPE.SUB) {\n\t\t\t\t\tgl.blendFuncSeparate(gl.ZERO, gl.ONE_MINUS_SRC_COLOR, gl.ZERO, gl.ONE);\n\t\t\t\t} else if (blend === BLEND_TYPE.MUL) {\n\t\t\t\t\tif (premultipliedAlpha) {\n\t\t\t\t\t\tgl.blendFuncSeparate(gl.ZERO, gl.SRC_COLOR, gl.ZERO, gl.SRC_ALPHA);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tgl.blendFunc(gl.ZERO, gl.SRC_COLOR);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tconsole.error('WebGLState: Invalid blending: ', blend);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis.currentBlendSrc = null;\n\t\t\tthis.currentBlendDst = null;\n\t\t\tthis.currentBlendSrcAlpha = null;\n\t\t\tthis.currentBlendDstAlpha = null;\n\t\t} else {\n\t\t\tblendEquationAlpha = blendEquationAlpha || blendEquation;\n\t\t\tblendSrcAlpha = blendSrcAlpha || blendSrc;\n\t\t\tblendDstAlpha = blendDstAlpha || blendDst;\n\n\t\t\tconst equationToGL = this.blendEquationToGL;\n\t\t\tconst factorToGL = this.blendFactorToGL;\n\n\t\t\tif (blendEquation !== this.currentBlendEquation || blendEquationAlpha !== this.currentBlendEquationAlpha) {\n\t\t\t\tgl.blendEquationSeparate(equationToGL[blendEquation], equationToGL[blendEquationAlpha]);\n\n\t\t\t\tthis.currentBlendEquation = blendEquation;\n\t\t\t\tthis.currentBlendEquationAlpha = blendEquationAlpha;\n\t\t\t}\n\n\t\t\tif (blendSrc !== this.currentBlendSrc || blendDst !== this.currentBlendDst || blendSrcAlpha !== this.currentBlendSrcAlpha || blendDstAlpha !== this.currentBlendDstAlpha) {\n\t\t\t\tgl.blendFuncSeparate(factorToGL[blendSrc], factorToGL[blendDst], factorToGL[blendSrcAlpha], factorToGL[blendDstAlpha]);\n\n\t\t\t\tthis.currentBlendSrc = blendSrc;\n\t\t\t\tthis.currentBlendDst = blendDst;\n\t\t\t\tthis.currentBlendSrcAlpha = blendSrcAlpha;\n\t\t\t\tthis.currentBlendDstAlpha = blendDstAlpha;\n\t\t\t}\n\t\t}\n\n\t\tthis.currentBlending = blend;\n\t\tthis.currentPremultipliedAlpha = premultipliedAlpha;\n\t}\n\n\tsetFlipSided(flipSided) {\n\t\tconst gl = this.gl;\n\n\t\tif (this.currentFlipSided !== flipSided) {\n\t\t\tif (flipSided) {\n\t\t\t\tgl.frontFace(gl.CW);\n\t\t\t} else {\n\t\t\t\tgl.frontFace(gl.CCW);\n\t\t\t}\n\n\t\t\tthis.currentFlipSided = flipSided;\n\t\t}\n\t}\n\n\tsetCullFace(cullFace) {\n\t\tconst gl = this.gl;\n\n\t\tif (cullFace !== CULL_FACE_TYPE.NONE) {\n\t\t\tthis.enable(gl.CULL_FACE);\n\n\t\t\tif (cullFace !== this.currentCullFace) {\n\t\t\t\tif (cullFace === CULL_FACE_TYPE.BACK) {\n\t\t\t\t\tgl.cullFace(gl.BACK);\n\t\t\t\t} else if (cullFace === CULL_FACE_TYPE.FRONT) {\n\t\t\t\t\tgl.cullFace(gl.FRONT);\n\t\t\t\t} else {\n\t\t\t\t\tgl.cullFace(gl.FRONT_AND_BACK);\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tthis.disable(gl.CULL_FACE);\n\t\t}\n\n\t\tthis.currentCullFace = cullFace;\n\t}\n\n\tviewport(viewport) {\n\t\tconst currentViewport = this.currentViewport;\n\n\t\tif (currentViewport.equals(viewport)) return;\n\n\t\tthis.gl.viewport(viewport.x, viewport.y, viewport.z, viewport.w);\n\t\tcurrentViewport.copy(viewport);\n\t}\n\n\tsetLineWidth(width) {\n\t\tif (width !== this.currentLineWidth) {\n\t\t\tconst lineWidthRange = this.capabilities.lineWidthRange;\n\t\t\tif (lineWidthRange[0] <= width && width <= lineWidthRange[1]) {\n\t\t\t\tthis.gl.lineWidth(width);\n\t\t\t} else {\n\t\t\t\tconsole.warn('GL_ALIASED_LINE_WIDTH_RANGE is [' + lineWidthRange[0] + ',' + lineWidthRange[1] + '], but set to ' + width + '.');\n\t\t\t}\n\t\t\tthis.currentLineWidth = width;\n\t\t}\n\t}\n\n\tsetPolygonOffset(polygonOffset, factor, units) {\n\t\tconst gl = this.gl;\n\n\t\tif (polygonOffset) {\n\t\t\tthis.enable(gl.POLYGON_OFFSET_FILL);\n\n\t\t\tif (this.currentPolygonOffsetFactor !== factor || this.currentPolygonOffsetUnits !== units) {\n\t\t\t\tgl.polygonOffset(factor, units);\n\n\t\t\t\tthis.currentPolygonOffsetFactor = factor;\n\t\t\t\tthis.currentPolygonOffsetUnits = units;\n\t\t\t}\n\t\t} else {\n\t\t\tthis.disable(gl.POLYGON_OFFSET_FILL);\n\t\t}\n\t}\n\n\tsetProgram(program) {\n\t\tif (this.currentProgram !== program) {\n\t\t\tthis.gl.useProgram(program.program);\n\t\t\tthis.currentProgram = program;\n\t\t}\n\t}\n\n\tbindBuffer(type, buffer) {\n\t\tconst gl = this.gl;\n\n\t\tconst boundBuffer = this.currentBoundBuffers[type];\n\n\t\tif (boundBuffer !== buffer) {\n\t\t\tgl.bindBuffer(type, buffer);\n\t\t\tthis.currentBoundBuffers[type] = buffer;\n\t\t}\n\t}\n\n\tactiveTexture(slot) {\n\t\tconst gl = this.gl;\n\n\t\tif (slot === undefined) {\n\t\t\tslot = gl.TEXTURE0 + this.capabilities.maxTextures - 1;\n\t\t}\n\n\t\tif (this.currentTextureSlot !== slot) {\n\t\t\tgl.activeTexture(slot);\n\t\t\tthis.currentTextureSlot = slot;\n\t\t}\n\t}\n\n\tbindTexture(type, texture) {\n\t\tconst gl = this.gl;\n\n\t\tif (this.currentTextureSlot === null) {\n\t\t\tthis.activeTexture();\n\t\t}\n\n\t\tlet boundTexture = this.currentBoundTextures[this.currentTextureSlot];\n\n\t\tif (boundTexture === undefined) {\n\t\t\tboundTexture = {\n\t\t\t\ttype: undefined,\n\t\t\t\ttexture: undefined\n\t\t\t};\n\t\t\tthis.currentBoundTextures[this.currentTextureSlot] = boundTexture;\n\t\t}\n\n\t\tif (boundTexture.type !== type || boundTexture.texture !== texture) {\n\t\t\tgl.bindTexture(type, texture || this.emptyTextures[type]);\n\t\t\tboundTexture.type = type;\n\t\t\tboundTexture.texture = texture;\n\t\t}\n\t}\n\n\treset() {\n\t\tconst gl = this.gl;\n\n\t\tgl.colorMask(true, true, true, true);\n\t\tgl.clearColor(0, 0, 0, 0);\n\n\t\tgl.depthMask(true);\n\t\tgl.depthFunc(gl.LESS);\n\t\tgl.clearDepth(1);\n\n\t\tgl.stencilMask(0xffffffff);\n\t\tgl.stencilFunc(gl.ALWAYS, 0, 0xffffffff);\n\t\tgl.stencilOp(gl.KEEP, gl.KEEP, gl.KEEP);\n\t\tgl.clearStencil(0);\n\n\t\tgl.disable(gl.BLEND);\n\t\tgl.disable(gl.CULL_FACE);\n\t\tgl.disable(gl.DEPTH_TEST);\n\t\tgl.disable(gl.POLYGON_OFFSET_FILL);\n\t\tgl.disable(gl.SCISSOR_TEST);\n\t\tgl.disable(gl.STENCIL_TEST);\n\t\tgl.disable(gl.SAMPLE_ALPHA_TO_COVERAGE);\n\n\t\tgl.blendEquation(gl.FUNC_ADD);\n\t\tgl.blendFunc(gl.ONE, gl.ZERO);\n\t\tgl.blendFuncSeparate(gl.ONE, gl.ZERO, gl.ONE, gl.ZERO);\n\n\t\tgl.cullFace(gl.BACK);\n\t\tgl.frontFace(gl.CCW);\n\n\t\t// gl.scissor(0, 0, gl.canvas.width, gl.canvas.height);\n\t\tgl.viewport(0, 0, gl.canvas.width, gl.canvas.height);\n\n\t\tgl.lineWidth(1);\n\n\t\tgl.polygonOffset(0, 0);\n\n\t\tgl.useProgram(null);\n\n\t\tgl.bindFramebuffer(gl.FRAMEBUFFER, null);\n\n\t\tgl.activeTexture(gl.TEXTURE0);\n\n\t\tthis.colorBuffer.reset();\n\t\tthis.depthBuffer.reset();\n\t\tthis.stencilBuffer.reset();\n\n\t\tthis.states = {};\n\n\t\tthis.currentBlending = null;\n\t\tthis.currentBlendEquation = null;\n\t\tthis.currentBlendSrc = null;\n\t\tthis.currentBlendDst = null;\n\t\tthis.currentBlendEquationAlpha = null;\n\t\tthis.currentBlendSrcAlpha = null;\n\t\tthis.currentBlendDstAlpha = null;\n\t\tthis.currentPremultipliedAlpha = null;\n\n\t\tthis.currentFlipSided = false;\n\t\tthis.currentCullFace = null;\n\n\t\tthis.currentViewport.set(0, 0, gl.canvas.width, gl.canvas.height);\n\n\t\tthis.currentLineWidth = null;\n\n\t\tthis.currentPolygonOffsetFactor = null;\n\t\tthis.currentPolygonOffsetUnits = null;\n\n\t\tthis.currentProgram = null;\n\n\t\tthis.currentBoundBuffers = {};\n\n\t\tthis.currentRenderTarget = null; // used in WebGLRenderTargets\n\n\t\tthis.currentTextureSlot = null;\n\t\tthis.currentBoundTextures = {};\n\t}\n\n\tsetMaterial(material, frontFaceCW) {\n\t\tthis.setCullFace(\n\t\t\t(material.side === DRAW_SIDE.DOUBLE) ? CULL_FACE_TYPE.NONE : CULL_FACE_TYPE.BACK\n\t\t);\n\n\t\tlet flipSided = (material.side === DRAW_SIDE.BACK);\n\t\tif (frontFaceCW) flipSided = !flipSided;\n\n\t\tthis.setFlipSided(flipSided);\n\n\t\tif (material.blending === BLEND_TYPE.NORMAL && material.transparent === false) {\n\t\t\tthis.setBlending(BLEND_TYPE.NONE);\n\t\t} else {\n\t\t\tthis.setBlending(material.blending, material.blendEquation, material.blendSrc, material.blendDst, material.blendEquationAlpha, material.blendSrcAlpha, material.blendDstAlpha, material.premultipliedAlpha);\n\t\t}\n\n\t\tthis.depthBuffer.setFunc(material.depthFunc);\n\t\tthis.depthBuffer.setTest(material.depthTest);\n\t\tthis.depthBuffer.setMask(material.depthWrite);\n\t\tthis.colorBuffer.setMask(material.colorWrite);\n\n\t\tconst stencilTest = material.stencilTest;\n\t\tthis.stencilBuffer.setTest(stencilTest);\n\t\tif (stencilTest) {\n\t\t\tthis.stencilBuffer.setMask(material.stencilWriteMask);\n\t\t\tthis.stencilBuffer.setFunc(material.stencilFunc, material.stencilRef, material.stencilFuncMask, material.stencilFuncBack, material.stencilRefBack, material.stencilFuncMaskBack);\n\t\t\tthis.stencilBuffer.setOp(material.stencilFail, material.stencilZFail, material.stencilZPass, material.stencilFailBack, material.stencilZFailBack, material.stencilZPassBack);\n\t\t}\n\n\t\tthis.setPolygonOffset(material.polygonOffset, material.polygonOffsetFactor, material.polygonOffsetUnits);\n\n\t\tif (material.lineWidth !== undefined) {\n\t\t\tthis.setLineWidth(material.lineWidth);\n\t\t}\n\n\t\tmaterial.alphaToCoverage === true\n\t\t\t? this.enable(this.gl.SAMPLE_ALPHA_TO_COVERAGE)\n\t\t\t: this.disable(this.gl.SAMPLE_ALPHA_TO_COVERAGE);\n\t}\n\n}\n\nexport { WebGLState };"
  },
  {
    "path": "src/webgl/WebGLTextures.js",
    "content": "import { TEXTURE_FILTER, TEXTURE_WRAP, PIXEL_FORMAT, PIXEL_TYPE } from '../const.js';\nimport { PropertyMap } from '../render/PropertyMap.js';\nimport { MathUtils } from '../math/MathUtils.js';\n\nclass WebGLTextures extends PropertyMap {\n\n\tconstructor(prefix, gl, state, capabilities, constants) {\n\t\tsuper(prefix);\n\n\t\tthis._gl = gl;\n\t\tthis._state = state;\n\t\tthis._capabilities = capabilities;\n\t\tthis._constants = constants;\n\n\t\tthis._usedTextureUnits = 0;\n\n\t\tconst that = this;\n\n\t\tfunction onTextureDispose(event) {\n\t\t\tconst texture = event.target;\n\t\t\tconst textureProperties = that.get(texture);\n\n\t\t\ttexture.removeEventListener('dispose', onTextureDispose);\n\n\t\t\tif (textureProperties.__webglTexture && !textureProperties.__external) {\n\t\t\t\tgl.deleteTexture(textureProperties.__webglTexture);\n\t\t\t}\n\n\t\t\tif (textureProperties.__readBuffer) {\n\t\t\t\tgl.deleteBuffer(textureProperties.__readBuffer);\n\t\t\t}\n\n\t\t\tthat.delete(texture);\n\t\t}\n\n\t\tthis._onTextureDispose = onTextureDispose;\n\n\t\tthis._wrappingToGL = {\n\t\t\t[TEXTURE_WRAP.REPEAT]: gl.REPEAT,\n\t\t\t[TEXTURE_WRAP.CLAMP_TO_EDGE]: gl.CLAMP_TO_EDGE,\n\t\t\t[TEXTURE_WRAP.MIRRORED_REPEAT]: gl.MIRRORED_REPEAT\n\t\t};\n\n\t\tthis._filterToGL = {\n\t\t\t[TEXTURE_FILTER.NEAREST]: gl.NEAREST,\n\t\t\t[TEXTURE_FILTER.LINEAR]: gl.LINEAR,\n\t\t\t[TEXTURE_FILTER.NEAREST_MIPMAP_NEAREST]: gl.NEAREST_MIPMAP_NEAREST,\n\t\t\t[TEXTURE_FILTER.LINEAR_MIPMAP_NEAREST]: gl.LINEAR_MIPMAP_NEAREST,\n\t\t\t[TEXTURE_FILTER.NEAREST_MIPMAP_LINEAR]: gl.NEAREST_MIPMAP_LINEAR,\n\t\t\t[TEXTURE_FILTER.LINEAR_MIPMAP_LINEAR]: gl.LINEAR_MIPMAP_LINEAR\n\t\t};\n\t}\n\n\tallocTexUnit() {\n\t\tconst textureUnit = this._usedTextureUnits++;\n\n\t\tif (textureUnit >= this._capabilities.maxTextures) {\n\t\t\tconsole.warn('trying to use ' + textureUnit + ' texture units while this GPU supports only ' + this._capabilities.maxTextures);\n\t\t}\n\n\t\treturn textureUnit;\n\t}\n\n\tresetTextureUnits() {\n\t\tthis._usedTextureUnits = 0;\n\t}\n\n\tsetTexture(texture, slot) {\n\t\tconst gl = this._gl;\n\t\tconst capabilities = this._capabilities;\n\t\tconst constants = this._constants;\n\t\tconst state = this._state;\n\n\t\tif ((texture.isTexture3D || texture.isTexture2DArray) && capabilities.version < 2) {\n\t\t\tconsole.warn('WebGLTextures: Texture3D/Texture2DArray is not supported in WebGL1.0.');\n\t\t\treturn;\n\t\t}\n\n\t\tif (slot !== undefined) {\n\t\t\tslot = gl.TEXTURE0 + slot;\n\t\t}\n\n\t\tconst textureProperties = this.get(texture);\n\n\t\tconst textureTarget = getTextureTarget(gl, texture);\n\n\t\tconst hasImage = texture.isTextureCube ? texture.images.length === 6 : !!texture.image;\n\t\tlet singleImage = texture.isTextureCube ? texture.images[0] : texture.image;\n\n\t\tif (\n\t\t\thasImage\n\t\t\t&& textureProperties.__version !== texture.version\n\t\t\t// Do not initialize rtt texture, unless slot is undefined,\n\t\t\t// which means the caller just wants to bind the texture to the framebuffer, not use it for sampling.\n\t\t\t&& (!singleImage.rtt || slot === undefined)\n\t\t\t// Do not initialize external texture\n\t\t\t&& !textureProperties.__external\n\t\t) {\n\t\t\tif (textureProperties.__webglTexture === undefined) {\n\t\t\t\ttexture.addEventListener('dispose', this._onTextureDispose);\n\t\t\t\ttextureProperties.__webglTexture = gl.createTexture();\n\t\t\t\ttextureProperties.__webglTarget = textureTarget;\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\tcapabilities.version < 2 && texture.isTexture2D\n\t\t\t\t&& !_isPowerOfTwo(singleImage) && textureNeedsPowerOfTwo(texture)\n\t\t\t\t&& domCheck(singleImage)\n\t\t\t) {\n\t\t\t\tsingleImage = makePowerOf2(singleImage);\n\t\t\t}\n\n\t\t\tconst needFallback = capabilities.version < 2 && !_isPowerOfTwo(singleImage);\n\t\t\tconst uploadMipmaps = texture.mipmaps.length > 0 && !needFallback;\n\n\t\t\tconst glFormat = constants.getGLFormat(texture.format),\n\t\t\t\tglType = constants.getGLType(texture.type),\n\t\t\t\tglInternalFormat = (texture.internalformat !== null) ? constants.getGLInternalFormat(texture.internalformat) :\n\t\t\t\t\tgetGLInternalFormat(gl, capabilities, glFormat, glType);\n\n\t\t\ttextureProperties.__glFormat = glFormat;\n\t\t\ttextureProperties.__glType = glType;\n\t\t\ttextureProperties.__glInternalFormat = glInternalFormat;\n\t\t\ttextureProperties.__width = singleImage.width;\n\t\t\ttextureProperties.__height = singleImage.height;\n\t\t\ttextureProperties.__maxMipLevel = uploadMipmaps ? texture.mipmaps.length - 1 : 0;\n\n\t\t\tstate.activeTexture(slot);\n\t\t\tstate.bindTexture(textureTarget, textureProperties.__webglTexture);\n\n\t\t\tgl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, texture.flipY);\n\t\t\tgl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, texture.premultiplyAlpha);\n\t\t\tgl.pixelStorei(gl.UNPACK_ALIGNMENT, texture.unpackAlignment);\n\t\t\tgl.pixelStorei(gl.UNPACK_COLORSPACE_CONVERSION_WEBGL, gl.NONE);\n\n\t\t\tthis._setTextureParameters(texture, textureTarget, needFallback);\n\n\t\t\tif (texture.isTexture2D) {\n\t\t\t\tthis._upload2DImage(texture, textureProperties, uploadMipmaps, singleImage);\n\t\t\t} else if (texture.isTextureCube) {\n\t\t\t\tthis._uploadCubeImages(texture, textureProperties, uploadMipmaps);\n\t\t\t} else if (texture.isTexture3D) {\n\t\t\t\tthis._upload3DImage(texture, textureProperties);\n\t\t\t} else if (texture.isTexture2DArray) {\n\t\t\t\tthis._upload2DArrayImage(texture, textureProperties);\n\t\t\t}\n\n\t\t\tif (texture.generateMipmaps && !uploadMipmaps && !needFallback) {\n\t\t\t\tthis.generateMipmaps(texture);\n\t\t\t}\n\n\t\t\ttextureProperties.__version = texture.version;\n\n\t\t\treturn textureProperties;\n\t\t}\n\n\t\tstate.activeTexture(slot);\n\t\tstate.bindTexture(textureTarget, textureProperties.__webglTexture);\n\n\t\treturn textureProperties;\n\t}\n\n\tgenerateMipmaps(texture) {\n\t\tconst gl = this._gl;\n\n\t\tconst textureProperties = this.get(texture);\n\n\t\tgl.generateMipmap(textureProperties.__webglTarget);\n\n\t\tconst width = textureProperties.__width, height = textureProperties.__height;\n\t\t// Note: Math.log( x ) * Math.LOG2E used instead of Math.log2( x ) which is not supported by IE11\n\t\ttextureProperties.__maxMipLevel = Math.log(Math.max(width, height)) * Math.LOG2E;\n\t}\n\n\tsetTextureExternal(texture, webglTexture) {\n\t\tconst gl = this._gl;\n\n\t\tconst textureProperties = this.get(texture);\n\n\t\tif (!textureProperties.__external) {\n\t\t\tif (textureProperties.__webglTexture) {\n\t\t\t\tgl.deleteTexture(textureProperties.__webglTexture);\n\t\t\t} else {\n\t\t\t\ttexture.addEventListener('dispose', this._onTextureDispose);\n\t\t\t}\n\t\t}\n\n\t\ttextureProperties.__webglTexture = webglTexture;\n\t\ttextureProperties.__external = true;\n\t}\n\n\t_setTextureParameters(texture, textureType, needFallback) {\n\t\tconst gl = this._gl;\n\t\tconst capabilities = this._capabilities;\n\n\t\tconst wrappingToGL = this._wrappingToGL;\n\t\tconst filterToGL = this._filterToGL;\n\n\t\tlet wrapS = texture.wrapS,\n\t\t\twrapT = texture.wrapT,\n\t\t\twrapR = texture.wrapR,\n\t\t\tmagFilter = texture.magFilter,\n\t\t\tminFilter = texture.minFilter;\n\n\t\t// fix for non power of 2 image in WebGL 1.0\n\t\tif (needFallback) {\n\t\t\twrapS = TEXTURE_WRAP.CLAMP_TO_EDGE;\n\t\t\twrapT = TEXTURE_WRAP.CLAMP_TO_EDGE;\n\n\t\t\tif (texture.isTexture3D) {\n\t\t\t\twrapR = TEXTURE_WRAP.CLAMP_TO_EDGE;\n\t\t\t}\n\n\t\t\tif (texture.wrapS !== TEXTURE_WRAP.CLAMP_TO_EDGE || texture.wrapT !== TEXTURE_WRAP.CLAMP_TO_EDGE) {\n\t\t\t\tconsole.warn('Texture is not power of two. Texture.wrapS and Texture.wrapT should be set to TEXTURE_WRAP.CLAMP_TO_EDGE.', texture);\n\t\t\t}\n\n\t\t\tmagFilter = filterFallback(texture.magFilter);\n\t\t\tminFilter = filterFallback(texture.minFilter);\n\n\t\t\tif (\n\t\t\t\t(texture.minFilter !== TEXTURE_FILTER.NEAREST && texture.minFilter !== TEXTURE_FILTER.LINEAR) ||\n\t\t\t\t(texture.magFilter !== TEXTURE_FILTER.NEAREST && texture.magFilter !== TEXTURE_FILTER.LINEAR)\n\t\t\t) {\n\t\t\t\tconsole.warn('Texture is not power of two. Texture.minFilter and Texture.magFilter should be set to TEXTURE_FILTER.NEAREST or TEXTURE_FILTER.LINEAR.', texture);\n\t\t\t}\n\t\t}\n\n\t\tgl.texParameteri(textureType, gl.TEXTURE_WRAP_S, wrappingToGL[wrapS]);\n\t\tgl.texParameteri(textureType, gl.TEXTURE_WRAP_T, wrappingToGL[wrapT]);\n\n\t\tif (texture.isTexture3D) {\n\t\t\tgl.texParameteri(textureType, gl.TEXTURE_WRAP_R, wrappingToGL[wrapR]);\n\t\t}\n\n\t\tgl.texParameteri(textureType, gl.TEXTURE_MAG_FILTER, filterToGL[magFilter]);\n\t\tgl.texParameteri(textureType, gl.TEXTURE_MIN_FILTER, filterToGL[minFilter]);\n\n\t\t// anisotropy if EXT_texture_filter_anisotropic exist\n\t\tconst extension = capabilities.anisotropyExt;\n\t\tif (extension) {\n\t\t\tgl.texParameterf(textureType, extension.TEXTURE_MAX_ANISOTROPY_EXT, Math.min(texture.anisotropy, capabilities.maxAnisotropy));\n\t\t}\n\n\t\tif (capabilities.version >= 2) {\n\t\t\tif (texture.compare !== undefined) {\n\t\t\t\tgl.texParameteri(textureType, gl.TEXTURE_COMPARE_MODE, gl.COMPARE_REF_TO_TEXTURE);\n\t\t\t\tgl.texParameteri(textureType, gl.TEXTURE_COMPARE_FUNC, texture.compare);\n\t\t\t} else {\n\t\t\t\tgl.texParameteri(textureType, gl.TEXTURE_COMPARE_MODE, gl.NONE);\n\t\t\t}\n\t\t}\n\t}\n\n\t_upload2DImage(texture, textureProperties, uploadMipmaps, image) {\n\t\tconst gl = this._gl;\n\n\t\tconst glTarget = textureProperties.__webglTarget,\n\t\t\tglFormat = textureProperties.__glFormat,\n\t\t\tglType = textureProperties.__glType,\n\t\t\tglInternalFormat = textureProperties.__glInternalFormat;\n\n\t\tif (domCheck(image)) {\n\t\t\tif (uploadMipmaps) {\n\t\t\t\tconst mipmaps = texture.mipmaps;\n\t\t\t\tfor (let level = 0, l = mipmaps.length; level < l; level++) {\n\t\t\t\t\tgl.texImage2D(glTarget, level, glInternalFormat, glFormat, glType, mipmaps[level]);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tgl.texImage2D(glTarget, 0, glInternalFormat, glFormat, glType, image);\n\t\t\t}\n\t\t} else {\n\t\t\tif (uploadMipmaps) {\n\t\t\t\tconst isCompressed = image.isCompressed;\n\t\t\t\tconst mipmaps = texture.mipmaps;\n\t\t\t\tlet mipmap;\n\t\t\t\tfor (let level = 0, l = mipmaps.length; level < l; level++) {\n\t\t\t\t\tmipmap = mipmaps[level];\n\t\t\t\t\tif (isCompressed) {\n\t\t\t\t\t\tgl.compressedTexImage2D(glTarget, level, glInternalFormat, mipmap.width, mipmap.height, 0, mipmap.data);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tgl.texImage2D(glTarget, level, glInternalFormat, mipmap.width, mipmap.height, texture.border, glFormat, glType, mipmap.data);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tgl.texImage2D(glTarget, 0, glInternalFormat, image.width, image.height, texture.border, glFormat, glType, image.data);\n\t\t\t}\n\t\t}\n\t}\n\n\t_uploadCubeImages(texture, textureProperties, uploadMipmaps) {\n\t\tconst gl = this._gl;\n\n\t\tconst glFormat = textureProperties.__glFormat,\n\t\t\tglType = textureProperties.__glType,\n\t\t\tglInternalFormat = textureProperties.__glInternalFormat;\n\n\t\tconst images = texture.images;\n\t\tfor (let face = 0; face < 6; face++) {\n\t\t\tconst image = images[face];\n\t\t\tconst glTarget = gl.TEXTURE_CUBE_MAP_POSITIVE_X + face;\n\t\t\tif (domCheck(image)) {\n\t\t\t\tif (uploadMipmaps) {\n\t\t\t\t\tconst mipmaps = texture.mipmaps;\n\t\t\t\t\tfor (let level = 0, l = mipmaps.length; level < l; level++) {\n\t\t\t\t\t\tgl.texImage2D(glTarget, level, glInternalFormat, glFormat, glType, mipmaps[level][face]);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tgl.texImage2D(glTarget, 0, glInternalFormat, glFormat, glType, image);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (uploadMipmaps) {\n\t\t\t\t\tconst isCompressed = image.isCompressed;\n\t\t\t\t\tconst mipmaps = texture.mipmaps;\n\t\t\t\t\tlet mipmap;\n\t\t\t\t\tfor (let level = 0, l = mipmaps.length; level < l; level++) {\n\t\t\t\t\t\tmipmap = mipmaps[level][face];\n\t\t\t\t\t\tif (isCompressed) {\n\t\t\t\t\t\t\tgl.compressedTexImage2D(glTarget, level, glInternalFormat, mipmap.width, mipmap.height, 0, mipmap.data);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tgl.texImage2D(glTarget, level, glInternalFormat, mipmap.width, mipmap.height, texture.border, glFormat, glType, mipmap.data);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tgl.texImage2D(glTarget, 0, glInternalFormat, image.width, image.height, texture.border, glFormat, glType, image.data);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t_upload3DImage(texture, textureProperties) {\n\t\tconst gl = this._gl;\n\n\t\tconst glTarget = textureProperties.__webglTarget,\n\t\t\tglFormat = textureProperties.__glFormat,\n\t\t\tglType = textureProperties.__glType,\n\t\t\tglInternalFormat = textureProperties.__glInternalFormat;\n\n\t\tconst image = texture.image;\n\n\t\tgl.texImage3D(glTarget, 0, glInternalFormat, image.width, image.height, image.depth, texture.border, glFormat, glType, image.data);\n\t}\n\n\t_upload2DArrayImage(texture, textureProperties) {\n\t\tconst gl = this._gl;\n\n\t\tconst glTarget = textureProperties.__webglTarget,\n\t\t\tglFormat = textureProperties.__glFormat,\n\t\t\tglType = textureProperties.__glType,\n\t\t\tglInternalFormat = textureProperties.__glInternalFormat;\n\n\t\tconst image = texture.image;\n\n\t\tif (texture.layerUpdates.size > 0) {\n\t\t\tfor (const layerIndex of texture.layerUpdates) {\n\t\t\t\tconst layerByteLength = getByteLength(image.width, image.height, texture.format, texture.type);\n\t\t\t\tconst layerData = image.data.subarray(\n\t\t\t\t\tlayerIndex * layerByteLength / image.data.BYTES_PER_ELEMENT,\n\t\t\t\t\t(layerIndex + 1) * layerByteLength / image.data.BYTES_PER_ELEMENT\n\t\t\t\t);\n\t\t\t\tgl.texSubImage3D(glTarget, 0, 0, 0, layerIndex, image.width, image.height, 1, glFormat, glType, layerData);\n\t\t\t}\n\t\t\ttexture.layerUpdates.clear();\n\t\t} else {\n\t\t\tgl.texImage3D(glTarget, 0, glInternalFormat, image.width, image.height, image.depth, texture.border, glFormat, glType, image.data);\n\t\t}\n\t}\n\n}\n\nfunction textureNeedsPowerOfTwo(texture) {\n\treturn (texture.wrapS !== TEXTURE_WRAP.CLAMP_TO_EDGE || texture.wrapT !== TEXTURE_WRAP.CLAMP_TO_EDGE) ||\n\t\t(texture.minFilter !== TEXTURE_FILTER.NEAREST && texture.minFilter !== TEXTURE_FILTER.LINEAR);\n}\n\nfunction filterFallback(filter) {\n\tif (filter === TEXTURE_FILTER.NEAREST || filter === TEXTURE_FILTER.NEAREST_MIPMAP_LINEAR || filter === TEXTURE_FILTER.NEAREST_MIPMAP_NEAREST) {\n\t\treturn TEXTURE_FILTER.NEAREST;\n\t}\n\n\treturn TEXTURE_FILTER.LINEAR;\n}\n\nfunction _isPowerOfTwo(image) {\n\treturn MathUtils.isPowerOfTwo(image.width) && MathUtils.isPowerOfTwo(image.height);\n}\n\nlet _canvas;\nfunction makePowerOf2(image) {\n\tif (_canvas === undefined) _canvas = document.createElementNS('http://www.w3.org/1999/xhtml', 'canvas');\n\n\t_canvas.width = MathUtils.nearestPowerOfTwo(image.width);\n\t_canvas.height = MathUtils.nearestPowerOfTwo(image.height);\n\n\tconst context = _canvas.getContext('2d');\n\tcontext.drawImage(image, 0, 0, _canvas.width, _canvas.height);\n\n\tconsole.warn('image is not power of two (' + image.width + 'x' + image.height + '). Resized to ' + _canvas.width + 'x' + _canvas.height, image);\n\n\treturn _canvas;\n}\n\nfunction getGLInternalFormat(gl, capabilities, glFormat, glType) {\n\tconst isWebGL2 = capabilities.version >= 2;\n\n\tif (isWebGL2 === false) return glFormat;\n\n\tlet glInternalFormat = glFormat;\n\n\tif (glFormat === gl.RED) {\n\t\tif (glType === gl.FLOAT) glInternalFormat = gl.R32F;\n\t\tif (glType === gl.HALF_FLOAT) glInternalFormat = gl.R16F;\n\t\tif (glType === gl.UNSIGNED_BYTE) glInternalFormat = gl.R8;\n\t}\n\n\tif (glFormat === gl.RG) {\n\t\tif (glType === gl.FLOAT) glInternalFormat = gl.RG32F;\n\t\tif (glType === gl.HALF_FLOAT) glInternalFormat = gl.RG16F;\n\t\tif (glType === gl.UNSIGNED_BYTE) glInternalFormat = gl.RG8;\n\t}\n\n\tif (glFormat === gl.RGB) {\n\t\tif (glType === gl.FLOAT) glInternalFormat = gl.RGB32F;\n\t\tif (glType === gl.HALF_FLOAT) glInternalFormat = gl.RGB16F;\n\t\tif (glType === gl.UNSIGNED_BYTE) glInternalFormat = gl.RGB8;\n\t}\n\n\tif (glFormat === gl.RGBA) {\n\t\tif (glType === gl.FLOAT) glInternalFormat = gl.RGBA32F;\n\t\tif (glType === gl.HALF_FLOAT) glInternalFormat = gl.RGBA16F;\n\t\tif (glType === gl.UNSIGNED_BYTE) glInternalFormat = gl.RGBA8;\n\t\tif (glType === gl.UNSIGNED_SHORT_4_4_4_4) glInternalFormat = gl.RGBA4;\n\t\tif (glType === gl.UNSIGNED_SHORT_5_5_5_1) glInternalFormat = gl.RGB5_A1;\n\t}\n\n\tif (glFormat === gl.DEPTH_COMPONENT || glFormat === gl.DEPTH_STENCIL) {\n\t\tglInternalFormat = gl.DEPTH_COMPONENT16;\n\t\tif (glType === gl.FLOAT) glInternalFormat = gl.DEPTH_COMPONENT32F;\n\t\tif (glType === gl.UNSIGNED_INT) glInternalFormat = gl.DEPTH_COMPONENT24;\n\t\tif (glType === gl.UNSIGNED_INT_24_8) glInternalFormat = gl.DEPTH24_STENCIL8;\n\t\tif (glType === gl.FLOAT_32_UNSIGNED_INT_24_8_REV) glInternalFormat = gl.DEPTH32F_STENCIL8;\n\t}\n\n\tif (glInternalFormat === gl.R16F || glInternalFormat === gl.R32F ||\n\t\tglInternalFormat === gl.RG16F || glInternalFormat === gl.RG32F ||\n\t\tglInternalFormat === gl.RGB16F || glInternalFormat === gl.RGB32F ||\n\t\tglInternalFormat === gl.RGBA16F || glInternalFormat === gl.RGBA32F) {\n\t\tcapabilities.getExtension('EXT_color_buffer_float');\n\t}\n\n\treturn glInternalFormat;\n}\n\nfunction domCheck(image) {\n\treturn (typeof HTMLImageElement !== 'undefined' && image instanceof HTMLImageElement)\n\t\t|| (typeof HTMLCanvasElement !== 'undefined' && image instanceof HTMLCanvasElement)\n\t\t|| (typeof HTMLVideoElement !== 'undefined' && image instanceof HTMLVideoElement)\n\t\t|| (typeof ImageBitmap !== 'undefined' && image instanceof ImageBitmap);\n}\n\nfunction getByteLength(width, height, format, type) {\n\tconst typeByteLength = getTextureTypeByteLength(type);\n\n\tswitch (format) {\n\t\t// https://registry.khronos.org/OpenGL-Refpages/es3.0/html/glTexImage2D.xhtml\n\t\tcase PIXEL_FORMAT.ALPHA:\n\t\t\treturn width * height;\n\t\tcase PIXEL_FORMAT.LUMINANCE:\n\t\t\treturn width * height;\n\t\tcase PIXEL_FORMAT.LUMINANCE_ALPHA:\n\t\t\treturn width * height * 2;\n\t\tcase PIXEL_FORMAT.RED:\n\t\t\treturn ((width * height) / typeByteLength.components) * typeByteLength.byteLength;\n\t\tcase PIXEL_FORMAT.RED_INTEGER:\n\t\t\treturn ((width * height) / typeByteLength.components) * typeByteLength.byteLength;\n\t\tcase PIXEL_FORMAT.RG:\n\t\t\treturn ((width * height * 2) / typeByteLength.components) * typeByteLength.byteLength;\n\t\tcase PIXEL_FORMAT.RG_INTEGER:\n\t\t\treturn ((width * height * 2) / typeByteLength.components) * typeByteLength.byteLength;\n\t\tcase PIXEL_FORMAT.RGB:\n\t\t\treturn ((width * height * 3) / typeByteLength.components) * typeByteLength.byteLength;\n\t\tcase PIXEL_FORMAT.RGBA:\n\t\t\treturn ((width * height * 4) / typeByteLength.components) * typeByteLength.byteLength;\n\t\tcase PIXEL_FORMAT.RGBA_INTEGER:\n\t\t\treturn ((width * height * 4) / typeByteLength.components) * typeByteLength.byteLength;\n\n\t\t// https://registry.khronos.org/webgl/extensions/WEBGL_compressed_texture_s3tc_srgb/\n\t\tcase PIXEL_FORMAT.RGB_S3TC_DXT1:\n\t\tcase PIXEL_FORMAT.RGBA_S3TC_DXT1:\n\t\t\treturn Math.floor((width + 3) / 4) * Math.floor((height + 3) / 4) * 8;\n\t\tcase PIXEL_FORMAT.RGBA_S3TC_DXT3:\n\t\tcase PIXEL_FORMAT.RGBA_S3TC_DXT5:\n\t\t\treturn Math.floor((width + 3) / 4) * Math.floor((height + 3) / 4) * 16;\n\n\t\t// https://registry.khronos.org/webgl/extensions/WEBGL_compressed_texture_pvrtc/\n\t\tcase PIXEL_FORMAT.RGB_PVRTC_2BPPV1:\n\t\tcase PIXEL_FORMAT.RGBA_PVRTC_2BPPV1:\n\t\t\treturn (Math.max(width, 16) * Math.max(height, 8)) / 4;\n\t\tcase PIXEL_FORMAT.RGB_PVRTC_4BPPV1:\n\t\tcase PIXEL_FORMAT.RGBA_PVRTC_4BPPV1:\n\t\t\treturn (Math.max(width, 8) * Math.max(height, 8)) / 2;\n\n\t\t// https://registry.khronos.org/webgl/extensions/WEBGL_compressed_texture_etc/\n\t\tcase PIXEL_FORMAT.RGB_ETC1:\n\t\t\treturn Math.floor((width + 3) / 4) * Math.floor((height + 3) / 4) * 8;\n\t\t// https://registry.khronos.org/webgl/extensions/WEBGL_compressed_texture_astc/\n\t\tcase PIXEL_FORMAT.RGBA_ASTC_4x4:\n\t\t\treturn Math.floor((width + 3) / 4) * Math.floor((height + 3) / 4) * 16;\n\t\t// https://registry.khronos.org/webgl/extensions/EXT_texture_compression_bptc/\n\t\tcase PIXEL_FORMAT.RGBA_BPTC:\n\t\t\treturn Math.ceil(width / 4) * Math.ceil(height / 4) * 16;\n\t}\n\n\tthrow new Error(\n\t\t`Unable to determine texture byte length for ${format} format.`\n\t);\n}\n\nconst _tempTypeByteLength = { byteLength: 0, components: 0 };\nfunction getTextureTypeByteLength(type) {\n\tswitch (type) {\n\t\tcase PIXEL_TYPE.UNSIGNED_BYTE:\n\t\tcase PIXEL_TYPE.ByteType:\n\t\t\t_tempTypeByteLength.byteLength = 1;\n\t\t\t_tempTypeByteLength.components = 1;\n\t\t\treturn _tempTypeByteLength;\n\t\tcase PIXEL_TYPE.UNSIGNED_SHORT:\n\t\tcase PIXEL_TYPE.SHORT:\n\t\tcase PIXEL_TYPE.HALF_FLOAT:\n\t\t\t_tempTypeByteLength.byteLength = 2;\n\t\t\t_tempTypeByteLength.components = 1;\n\t\t\treturn _tempTypeByteLength;\n\t\tcase PIXEL_TYPE.UNSIGNED_SHORT_4_4_4_4:\n\t\tcase PIXEL_TYPE.UNSIGNED_SHORT_5_5_5_1:\n\t\t\t_tempTypeByteLength.byteLength = 2;\n\t\t\t_tempTypeByteLength.components = 4;\n\t\t\treturn _tempTypeByteLength;\n\t\tcase PIXEL_TYPE.UNSIGNED_INT:\n\t\tcase PIXEL_TYPE.INT:\n\t\tcase PIXEL_TYPE.FLOAT:\n\t\t\t_tempTypeByteLength.byteLength = 4;\n\t\t\t_tempTypeByteLength.components = 1;\n\t\t\treturn _tempTypeByteLength;\n\t}\n\tthrow new Error(`Unknown texture type ${type}.`);\n}\n\nfunction getTextureTarget(gl, texture) {\n\tif (texture.isTexture2D) {\n\t\treturn gl.TEXTURE_2D;\n\t} else if (texture.isTextureCube) {\n\t\treturn gl.TEXTURE_CUBE_MAP;\n\t} else if (texture.isTexture3D) {\n\t\treturn gl.TEXTURE_3D;\n\t} else if (texture.isTexture2DArray) {\n\t\treturn gl.TEXTURE_2D_ARRAY;\n\t} else {\n\t\treturn gl.TEXTURE_2D;\n\t}\n}\n\nexport { WebGLTextures };"
  },
  {
    "path": "src/webgl/WebGLUniforms.js",
    "content": "import { PIXEL_TYPE, PIXEL_FORMAT, TEXTURE_FILTER, COMPARE_FUNC } from '../const.js';\nimport { Texture2D } from '../resources/textures/Texture2D.js';\nimport { Texture2DArray } from '../resources/textures/Texture2DArray.js';\nimport { TextureCube } from '../resources/textures/TextureCube.js';\nimport { Texture3D } from '../resources/textures/Texture3D.js';\n\n// Build-in uniforms\n\nconst internalUniforms = {\n\t'u_Model': [1, null],\n\t'u_Projection': [2, function(cameraData) { this.set(cameraData.projectionMatrix.elements) }],\n\t'u_View': [2, function(cameraData) { this.set(cameraData.viewMatrix.elements) }],\n\t'u_ProjectionView': [2, function(cameraData) { this.set(cameraData.projectionViewMatrix.elements) }],\n\t'u_CameraPosition': [2, function(cameraData) { this.setValue(cameraData.position.x, cameraData.position.y, cameraData.position.z) }],\n\t'logDepthBufFC': [2, function(cameraData) { this.set(cameraData.logDepthBufFC) }],\n\t'logDepthCameraNear': [2, function(cameraData) { this.set(cameraData.logDepthCameraNear) }],\n\t'u_FogColor': [3, function(sceneData) { const color = sceneData.fog.color; this.setValue(color.r, color.g, color.b) }],\n\t'u_FogDensity': [3, function(sceneData) { this.set(sceneData.fog.density) }],\n\t'u_FogNear': [3, function(sceneData) { this.set(sceneData.fog.near) }],\n\t'u_FogFar': [3, function(sceneData) { this.set(sceneData.fog.far) }],\n\t'u_Color': [4, function(material, textures) { const color = material.diffuse; this.setValue(color.r, color.g, color.b) }],\n\t'u_Opacity': [4, function(material, textures) { this.set(material.opacity) }],\n\t'u_AlphaTest': [4, function(material, textures) { this.set(material.alphaTest) }],\n\t'diffuseMap': [4, function(material, textures) { this.set(material.diffuseMap, textures) }],\n\t'alphaMap': [4, function(material, textures) { this.set(material.alphaMap, textures) }],\n\t'alphaMapUVTransform': [4, function(material, textures) { const transform = material.alphaMapTransform; transform.isTransformUV && transform.update(); this.set(transform.elements) }],\n\t'normalMap': [4, function(material, textures) { this.set(material.normalMap, textures) }],\n\t'normalScale': [4, function(material, textures) { this.setValue(material.normalScale.x, material.normalScale.y) }],\n\t'bumpMap': [4, function(material, textures) { this.set(material.bumpMap, textures) }],\n\t'bumpScale': [4, function(material, textures) { this.set(material.bumpScale) }],\n\t'cubeMap': [4, function(material, textures) { this.set(material.cubeMap, textures) }],\n\t'u_Specular': [4, function(material, textures) { this.set(material.shininess) }],\n\t'u_SpecularColor': [4, function(material, textures) { const color = material.specular; this.setValue(color.r, color.g, color.b) }],\n\t'specularMap': [4, function(material, textures) { this.set(material.specularMap, textures) }],\n\t'aoMap': [4, function(material, textures) { this.set(material.aoMap, textures) }],\n\t'aoMapIntensity': [4, function(material, textures) { this.set(material.aoMapIntensity) }],\n\t'aoMapUVTransform': [4, function(material, textures) { const transform = material.aoMapTransform; transform.isTransformUV && transform.update(); this.set(transform.elements) }],\n\t'u_Roughness': [4, function(material, textures) { this.set(material.roughness) }],\n\t'roughnessMap': [4, function(material, textures) { this.set(material.roughnessMap, textures) }],\n\t'u_Metalness': [4, function(material, textures) { this.set(material.metalness) }],\n\t'metalnessMap': [4, function(material, textures) { this.set(material.metalnessMap, textures) }],\n\t'u_Clearcoat': [4, function(material, textures) { this.set(material.clearcoat) }],\n\t'u_ClearcoatRoughness': [4, function(material, textures) { this.set(material.clearcoatRoughness) }],\n\t'clearcoatMap': [4, function(material, textures) { this.set(material.clearcoatMap, textures) }],\n\t'clearcoatRoughnessMap': [4, function(material, textures) { this.set(material.clearcoatRoughnessMap, textures) }],\n\t'clearcoatNormalMap': [4, function(material, textures) { this.set(material.clearcoatNormalMap, textures) }],\n\t'clearcoatNormalScale': [4, function(material, textures) { this.setValue(material.clearcoatNormalScale.x, material.clearcoatNormalScale.y) }],\n\t'glossiness': [4, function(material, textures) { this.set(material.glossiness) }],\n\t'glossinessMap': [4, function(material, textures) { this.set(material.glossinessMap, textures) }],\n\t'emissive': [4, function(material, textures) { const color = material.emissive; this.setValue(color.r, color.g, color.b) }],\n\t'emissiveMap': [4, function(material, textures) { this.set(material.emissiveMap, textures) }],\n\t'emissiveMapUVTransform': [4, function(material, textures) { const transform = material.emissiveMapTransform; transform.isTransformUV && transform.update(); this.set(transform.elements) }],\n\t'uvTransform': [4, function(material, textures) { const transform = material.diffuseMapTransform; transform.isTransformUV && transform.update(); this.set(transform.elements) }],\n\t'u_PointSize': [4, function(material, textures) { this.set(material.size) }],\n\t'envMap': [5, function(envData, textures) { this.set(envData.map, textures) }],\n\t'envMapParams': [5, function(envData, textures) { this.setValue(envData.diffuse, envData.specular, (envData.map.images[0] && envData.map.images[0].rtt) ? 1 : -1) }],\n\t'maxMipLevel': [5, function(envData, textures) { this.set(textures.get(envData.map).__maxMipLevel || 8) }]\n};\n\n// Empty textures\n\nconst emptyTexture = new Texture2D();\nemptyTexture.image = { data: new Uint8Array([1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1]), width: 2, height: 2 };\nemptyTexture.magFilter = TEXTURE_FILTER.NEAREST;\nemptyTexture.minFilter = TEXTURE_FILTER.NEAREST;\nemptyTexture.generateMipmaps = false;\nemptyTexture.version++;\nconst emptyShadowTexture = new Texture2D();\nemptyShadowTexture.image = { data: null, width: 2, height: 2 };\nemptyShadowTexture.version++;\nemptyShadowTexture.type = PIXEL_TYPE.FLOAT_32_UNSIGNED_INT_24_8_REV;\nemptyShadowTexture.format = PIXEL_FORMAT.DEPTH_STENCIL;\nemptyShadowTexture.magFilter = TEXTURE_FILTER.NEAREST;\nemptyShadowTexture.minFilter = TEXTURE_FILTER.NEAREST;\nemptyShadowTexture.compare = COMPARE_FUNC.LESS;\nemptyShadowTexture.generateMipmaps = false;\nemptyShadowTexture.version++;\nconst emptyTexture3d = new Texture3D();\nconst emptyTexture2dArray = new Texture2DArray();\nconst emptyCubeTexture = new TextureCube();\n\n// Array helpers\n\nfunction arraysEqual(a, b) {\n\tif (a.length !== b.length) return false;\n\n\tfor (let i = 0, l = a.length; i < l; i++) {\n\t\tif (a[i] !== b[i]) return false;\n\t}\n\n\treturn true;\n}\n\nfunction copyArray(a, b) {\n\tfor (let i = 0, l = b.length; i < l; i++) {\n\t\ta[i] = b[i];\n\t}\n}\n\n// Texture unit allocation\n\nconst arrayCacheI32 = [];\n\nfunction allocTexUnits(textures, n) {\n\tlet r = arrayCacheI32[n];\n\n\tif (r === undefined) {\n\t\tr = new Int32Array(n);\n\t\tarrayCacheI32[n] = r;\n\t}\n\n\tfor (let i = 0; i !== n; ++i) {\n\t\tr[i] = textures.allocTexUnit();\n\t}\n\n\treturn r;\n}\n\n// Helper to pick the right setter for uniform\n\nfunction generateSetter(uniform, pureArray) {\n\tconst gl = uniform.gl;\n\tconst type = uniform.type;\n\tconst location = uniform.location;\n\tconst cache = uniform.cache;\n\n\tswitch (type) {\n\t\tcase gl.FLOAT:\n\t\t\tuniform.setValue = function(value) {\n\t\t\t\tif (cache[0] === value) return;\n\t\t\t\tgl.uniform1f(location, value);\n\t\t\t\tcache[0] = value;\n\t\t\t};\n\t\t\tif (pureArray) {\n\t\t\t\tuniform.set = function(value) {\n\t\t\t\t\tif (arraysEqual(cache, value)) return;\n\t\t\t\t\tgl.uniform1fv(location, value);\n\t\t\t\t\tcopyArray(cache, value);\n\t\t\t\t};\n\t\t\t} else {\n\t\t\t\tuniform.set = uniform.setValue;\n\t\t\t}\n\t\t\tbreak;\n\t\tcase gl.SAMPLER_2D:\n\t\tcase gl.SAMPLER_2D_SHADOW:\n\t\tcase gl.INT_SAMPLER_2D:\n\t\tcase gl.UNSIGNED_INT_SAMPLER_2D:\n\t\t\tuniform.setValue = function(value, textures) {\n\t\t\t\tconst unit = textures.allocTexUnit();\n\t\t\t\ttextures.setTexture(value || (type === gl.SAMPLER_2D_SHADOW ? emptyShadowTexture : emptyTexture), unit);\n\t\t\t\tif (cache[0] === unit) return;\n\t\t\t\tgl.uniform1i(location, unit);\n\t\t\t\tcache[0] = unit;\n\t\t\t};\n\t\t\tif (pureArray) {\n\t\t\t\tuniform.set = function(value, textures) {\n\t\t\t\t\tconst n = value.length;\n\t\t\t\t\tconst units = allocTexUnits(textures, n);\n\t\t\t\t\tfor (let i = 0; i !== n; ++i) {\n\t\t\t\t\t\ttextures.setTexture(value[i] || (type === gl.SAMPLER_2D_SHADOW ? emptyShadowTexture : emptyTexture), units[i]);\n\t\t\t\t\t}\n\t\t\t\t\tif (arraysEqual(cache, units)) return;\n\t\t\t\t\tgl.uniform1iv(location, units);\n\t\t\t\t\tcopyArray(cache, units);\n\t\t\t\t};\n\t\t\t} else {\n\t\t\t\tuniform.set = uniform.setValue;\n\t\t\t}\n\t\t\tbreak;\n\t\tcase gl.SAMPLER_2D_ARRAY:\n\t\tcase gl.SAMPLER_2D_ARRAY_SHADOW:\n\t\tcase gl.INT_SAMPLER_2D_ARRAY:\n\t\tcase gl.UNSIGNED_INT_SAMPLER_2D_ARRAY:\n\t\t\tuniform.setValue = function(value, textures) {\n\t\t\t\tconst unit = textures.allocTexUnit();\n\t\t\t\ttextures.setTexture(value || emptyTexture2dArray, unit);\n\t\t\t\tif (cache[0] === unit) return;\n\t\t\t\tgl.uniform1i(location, unit);\n\t\t\t\tcache[0] = unit;\n\t\t\t};\n\t\t\tif (pureArray) {\n\t\t\t\tuniform.set = function(value, textures) {\n\t\t\t\t\tconst n = value.length;\n\t\t\t\t\tconst units = allocTexUnits(textures, n);\n\t\t\t\t\tfor (let i = 0; i !== n; ++i) {\n\t\t\t\t\t\ttextures.setTexture(value[i] || emptyTexture2dArray, units[i]);\n\t\t\t\t\t}\n\t\t\t\t\tif (arraysEqual(cache, units)) return;\n\t\t\t\t\tgl.uniform1iv(location, units);\n\t\t\t\t\tcopyArray(cache, units);\n\t\t\t\t};\n\t\t\t} else {\n\t\t\t\tuniform.set = uniform.setValue;\n\t\t\t}\n\t\t\tbreak;\n\t\tcase gl.SAMPLER_CUBE:\n\t\tcase gl.SAMPLER_CUBE_SHADOW:\n\t\t\tuniform.setValue = function(value, textures) {\n\t\t\t\tconst unit = textures.allocTexUnit();\n\t\t\t\ttextures.setTexture(value || emptyCubeTexture, unit);\n\t\t\t\tif (cache[0] === unit) return;\n\t\t\t\tgl.uniform1i(location, unit);\n\t\t\t\tcache[0] = unit;\n\t\t\t};\n\t\t\tif (pureArray) {\n\t\t\t\tuniform.set = function(value, textures) {\n\t\t\t\t\tconst n = value.length;\n\t\t\t\t\tconst units = allocTexUnits(textures, n);\n\t\t\t\t\tfor (let i = 0; i !== n; ++i) {\n\t\t\t\t\t\ttextures.setTexture(value[i] || emptyCubeTexture, units[i]);\n\t\t\t\t\t}\n\t\t\t\t\tif (arraysEqual(cache, units)) return;\n\t\t\t\t\tgl.uniform1iv(location, units);\n\t\t\t\t\tcopyArray(cache, units);\n\t\t\t\t};\n\t\t\t} else {\n\t\t\t\tuniform.set = uniform.setValue;\n\t\t\t}\n\t\t\tbreak;\n\t\tcase gl.SAMPLER_3D:\n\t\t\tuniform.setValue = function(value, textures) {\n\t\t\t\tconst unit = textures.allocTexUnit();\n\t\t\t\ttextures.setTexture(value || emptyTexture3d, unit);\n\t\t\t\tif (cache[0] === unit) return;\n\t\t\t\tgl.uniform1i(location, unit);\n\t\t\t\tcache[0] = unit;\n\t\t\t};\n\t\t\tif (pureArray) {\n\t\t\t\tuniform.set = function(value, textures) {\n\t\t\t\t\tconst n = value.length;\n\t\t\t\t\tconst units = allocTexUnits(textures, n);\n\t\t\t\t\tfor (let i = 0; i !== n; ++i) {\n\t\t\t\t\t\ttextures.setTexture(value[i] || emptyTexture3d, units[i]);\n\t\t\t\t\t}\n\t\t\t\t\tif (arraysEqual(cache, units)) return;\n\t\t\t\t\tgl.uniform1iv(location, units);\n\t\t\t\t\tcopyArray(cache, units);\n\t\t\t\t};\n\t\t\t} else {\n\t\t\t\tuniform.set = uniform.setValue;\n\t\t\t}\n\t\t\tbreak;\n\t\tcase gl.BOOL:\n\t\tcase gl.INT:\n\t\t\tuniform.setValue = function(value) {\n\t\t\t\tif (cache[0] === value) return;\n\t\t\t\tgl.uniform1i(location, value);\n\t\t\t\tcache[0] = value;\n\t\t\t};\n\t\t\tif (pureArray) {\n\t\t\t\tuniform.set = function(value) {\n\t\t\t\t\tif (arraysEqual(cache, value)) return;\n\t\t\t\t\tgl.uniform1iv(location, value);\n\t\t\t\t\tcopyArray(cache, value);\n\t\t\t\t};\n\t\t\t} else {\n\t\t\t\tuniform.set = uniform.setValue;\n\t\t\t}\n\t\t\tbreak;\n\t\tcase gl.FLOAT_VEC2:\n\t\t\tuniform.setValue = function(p1, p2) {\n\t\t\t\tif (cache[0] !== p1 || cache[1] !== p2) {\n\t\t\t\t\tgl.uniform2f(location, p1, p2);\n\t\t\t\t\tcache[0] = p1;\n\t\t\t\t\tcache[1] = p2;\n\t\t\t\t}\n\t\t\t};\n\t\t\tuniform.set = function(value) {\n\t\t\t\tif (arraysEqual(cache, value)) return;\n\t\t\t\tgl.uniform2fv(location, value);\n\t\t\t\tcopyArray(cache, value);\n\t\t\t};\n\t\t\tbreak;\n\t\tcase gl.BOOL_VEC2:\n\t\tcase gl.INT_VEC2:\n\t\t\tuniform.setValue = function(p1, p2) {\n\t\t\t\tif (cache[0] !== p1 || cache[1] !== p2) {\n\t\t\t\t\tgl.uniform2i(location, p1, p2);\n\t\t\t\t\tcache[0] = p1;\n\t\t\t\t\tcache[1] = p2;\n\t\t\t\t}\n\t\t\t};\n\t\t\tuniform.set = function(value) {\n\t\t\t\tif (arraysEqual(cache, value)) return;\n\t\t\t\tgl.uniform2iv(location, value);\n\t\t\t\tcopyArray(cache, value);\n\t\t\t};\n\t\t\tbreak;\n\t\tcase gl.FLOAT_VEC3:\n\t\t\tuniform.setValue = function(p1, p2, p3) {\n\t\t\t\tif (cache[0] !== p1 || cache[1] !== p2 || cache[2] !== p3) {\n\t\t\t\t\tgl.uniform3f(location, p1, p2, p3);\n\t\t\t\t\tcache[0] = p1;\n\t\t\t\t\tcache[1] = p2;\n\t\t\t\t\tcache[2] = p3;\n\t\t\t\t}\n\t\t\t};\n\t\t\tuniform.set = function(value) {\n\t\t\t\tif (arraysEqual(cache, value)) return;\n\t\t\t\tgl.uniform3fv(location, value);\n\t\t\t\tcopyArray(cache, value);\n\t\t\t};\n\t\t\tbreak;\n\t\tcase gl.BOOL_VEC3:\n\t\tcase gl.INT_VEC3:\n\t\t\tuniform.setValue = function(p1, p2, p3) {\n\t\t\t\tif (cache[0] !== p1 || cache[1] !== p2 || cache[2] !== p3) {\n\t\t\t\t\tgl.uniform3i(location, p1, p2, p3);\n\t\t\t\t\tcache[0] = p1;\n\t\t\t\t\tcache[1] = p2;\n\t\t\t\t\tcache[2] = p3;\n\t\t\t\t}\n\t\t\t};\n\t\t\tuniform.set = function(value) {\n\t\t\t\tif (arraysEqual(cache, value)) return;\n\t\t\t\tgl.uniform3iv(location, value);\n\t\t\t\tcopyArray(cache, value);\n\t\t\t};\n\t\t\tbreak;\n\t\tcase gl.FLOAT_VEC4:\n\t\t\tuniform.setValue = function(p1, p2, p3, p4) {\n\t\t\t\tif (cache[0] !== p1 || cache[1] !== p2 || cache[2] !== p3 || cache[3] !== p4) {\n\t\t\t\t\tgl.uniform4f(location, p1, p2, p3, p4);\n\t\t\t\t\tcache[0] = p1;\n\t\t\t\t\tcache[1] = p2;\n\t\t\t\t\tcache[2] = p3;\n\t\t\t\t\tcache[3] = p4;\n\t\t\t\t}\n\t\t\t};\n\t\t\tuniform.set = function(value) {\n\t\t\t\tif (arraysEqual(cache, value)) return;\n\t\t\t\tgl.uniform4fv(location, value);\n\t\t\t\tcopyArray(cache, value);\n\t\t\t};\n\t\t\tbreak;\n\t\tcase gl.BOOL_VEC4:\n\t\tcase gl.INT_VEC4:\n\t\t\tuniform.setValue = function(p1, p2, p3, p4) {\n\t\t\t\tif (cache[0] !== p1 || cache[1] !== p2 || cache[2] !== p3 || cache[3] !== p4) {\n\t\t\t\t\tgl.uniform4i(location, p1, p2, p3, p4);\n\t\t\t\t\tcache[0] = p1;\n\t\t\t\t\tcache[1] = p2;\n\t\t\t\t\tcache[2] = p3;\n\t\t\t\t\tcache[3] = p4;\n\t\t\t\t}\n\t\t\t};\n\t\t\tuniform.set = function(value) {\n\t\t\t\tif (arraysEqual(cache, value)) return;\n\t\t\t\tgl.uniform4iv(location, value);\n\t\t\t\tcopyArray(cache, value);\n\t\t\t};\n\t\t\tbreak;\n\n\t\tcase gl.FLOAT_MAT2:\n\t\t\tif (pureArray) {\n\t\t\t\tuniform.setValue = uniform.set = function(value) {\n\t\t\t\t\tif (arraysEqual(cache, value)) return;\n\t\t\t\t\tgl.uniformMatrix2fv(location, false, value);\n\t\t\t\t\tcopyArray(cache, value);\n\t\t\t\t};\n\t\t\t} else {\n\t\t\t\tuniform.setValue = uniform.set = function(value) {\n\t\t\t\t\tif (cache[0] !== value[0] || cache[1] !== value[1] || cache[2] !== value[2] || cache[3] !== value[3]) {\n\t\t\t\t\t\tgl.uniformMatrix2fv(location, false, value);\n\t\t\t\t\t\tcache[0] = value[0];\n\t\t\t\t\t\tcache[1] = value[1];\n\t\t\t\t\t\tcache[2] = value[2];\n\t\t\t\t\t\tcache[3] = value[3];\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t}\n\t\t\tbreak;\n\t\tcase gl.FLOAT_MAT3:\n\t\t\tif (pureArray) {\n\t\t\t\tuniform.setValue = uniform.set = function(value) {\n\t\t\t\t\tif (arraysEqual(cache, value)) return;\n\t\t\t\t\tgl.uniformMatrix3fv(location, false, value);\n\t\t\t\t\tcopyArray(cache, value);\n\t\t\t\t};\n\t\t\t} else {\n\t\t\t\tuniform.setValue = uniform.set = function(value) {\n\t\t\t\t\tif (cache[0] !== value[0] || cache[1] !== value[1] || cache[2] !== value[2]\n\t\t\t\t\t\t|| cache[3] !== value[3] || cache[4] !== value[4] || cache[5] !== value[5]\n\t\t\t\t\t\t|| cache[6] !== value[6] || cache[7] !== value[7] || cache[8] !== value[8]) {\n\t\t\t\t\t\tgl.uniformMatrix3fv(location, false, value);\n\t\t\t\t\t\tcache[0] = value[0];\n\t\t\t\t\t\tcache[1] = value[1];\n\t\t\t\t\t\tcache[2] = value[2];\n\t\t\t\t\t\tcache[3] = value[3];\n\t\t\t\t\t\tcache[4] = value[4];\n\t\t\t\t\t\tcache[5] = value[5];\n\t\t\t\t\t\tcache[6] = value[6];\n\t\t\t\t\t\tcache[7] = value[7];\n\t\t\t\t\t\tcache[8] = value[8];\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t}\n\t\t\tbreak;\n\t\tcase gl.FLOAT_MAT4:\n\t\t\tif (pureArray) {\n\t\t\t\tuniform.setValue = uniform.set = function(value) {\n\t\t\t\t\tif (arraysEqual(cache, value)) return;\n\t\t\t\t\tgl.uniformMatrix4fv(location, false, value);\n\t\t\t\t\tcopyArray(cache, value);\n\t\t\t\t};\n\t\t\t} else {\n\t\t\t\tuniform.setValue = uniform.set = function(value) {\n\t\t\t\t\tif (cache[0] !== value[0] || cache[1] !== value[1] || cache[2] !== value[2] || cache[3] !== value[3]\n\t\t\t\t\t\t|| cache[4] !== value[4] || cache[5] !== value[5] || cache[6] !== value[6] || cache[7] !== value[7]\n\t\t\t\t\t\t|| cache[8] !== value[8] || cache[9] !== value[9] || cache[10] !== value[10] || cache[11] !== value[11]\n\t\t\t\t\t\t|| cache[12] !== value[12] || cache[13] !== value[13] || cache[14] !== value[14] || cache[15] !== value[15]) {\n\t\t\t\t\t\tgl.uniformMatrix4fv(location, false, value);\n\t\t\t\t\t\tcache[0] = value[0];\n\t\t\t\t\t\tcache[1] = value[1];\n\t\t\t\t\t\tcache[2] = value[2];\n\t\t\t\t\t\tcache[3] = value[3];\n\t\t\t\t\t\tcache[4] = value[4];\n\t\t\t\t\t\tcache[5] = value[5];\n\t\t\t\t\t\tcache[6] = value[6];\n\t\t\t\t\t\tcache[7] = value[7];\n\t\t\t\t\t\tcache[8] = value[8];\n\t\t\t\t\t\tcache[9] = value[9];\n\t\t\t\t\t\tcache[10] = value[10];\n\t\t\t\t\t\tcache[11] = value[11];\n\t\t\t\t\t\tcache[12] = value[12];\n\t\t\t\t\t\tcache[13] = value[13];\n\t\t\t\t\t\tcache[14] = value[14];\n\t\t\t\t\t\tcache[15] = value[15];\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t}\n\t\t\tbreak;\n\t}\n}\n\n// --- Uniform Classes ---\n\nclass SingleUniform {\n\n\tconstructor(gl, id, activeInfo, location) {\n\t\tthis.gl = gl;\n\n\t\tthis.id = id;\n\n\t\tthis.type = activeInfo.type;\n\n\t\t// this.size = activeInfo.size; // always be 1\n\n\t\tthis.location = location;\n\n\t\tthis.setValue = undefined;\n\t\tthis.set = undefined;\n\t\tthis.cache = [];\n\n\t\tgenerateSetter(this);\n\n\t\t// internal\n\n\t\tthis.internalGroup = 0;\n\t\tthis.internalFun = null;\n\n\t\tconst internal = internalUniforms[id];\n\t\tif (internal) {\n\t\t\tthis.internalGroup = internal[0];\n\t\t\tthis.internalFun = internal[1];\n\t\t}\n\t}\n\n}\n\nclass PureArrayUniform {\n\n\tconstructor(gl, id, activeInfo, location) {\n\t\tthis.gl = gl;\n\n\t\tthis.id = id;\n\n\t\tthis.type = activeInfo.type;\n\n\t\tthis.size = activeInfo.size;\n\n\t\tthis.location = location;\n\n\t\tthis.setValue = undefined;\n\t\tthis.set = undefined;\n\t\tthis.cache = [];\n\n\t\tgenerateSetter(this, true);\n\t}\n\n}\n\nclass UniformContainer {\n\n\tconstructor() {\n\t\tthis.seq = [];\n\t\tthis.map = {};\n\t}\n\n}\n\nclass StructuredUniform extends UniformContainer {\n\n\tconstructor(id) {\n\t\tsuper();\n\t\tthis.id = id;\n\t}\n\n\tset(value, textures) {\n\t\tconst seq = this.seq;\n\n\t\tfor (let i = 0, n = seq.length; i !== n; ++i) {\n\t\t\tconst u = seq[i];\n\t\t\tu.set(value[u.id], textures);\n\t\t}\n\t}\n\n}\n\n// --- Top-level ---\n\n// Parser - builds up the property tree from the path strings\n\nconst RePathPart = /(\\w+)(\\])?(\\[|\\.)?/g;\n\n// extracts\n// \t- the identifier (member name or array index)\n//  - followed by an optional right bracket (found when array index)\n//  - followed by an optional left bracket or dot (type of subscript)\n//\n// Note: These portions can be read in a non-overlapping fashion and\n// allow straightforward parsing of the hierarchy that WebGL encodes\n// in the uniform names.\n\nfunction addUniform(container, uniformObject) {\n\tcontainer.seq.push(uniformObject);\n\tcontainer.map[uniformObject.id] = uniformObject;\n}\n\n// https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/getActiveUniform\nfunction parseUniform(gl, activeInfo, location, container) {\n\tconst path = activeInfo.name,\n\t\tpathLength = path.length;\n\n\t// reset RegExp object, because of the early exit of a previous run\n\tRePathPart.lastIndex = 0;\n\n\twhile (true) {\n\t\tconst match = RePathPart.exec(path),\n\t\t\tmatchEnd = RePathPart.lastIndex;\n\n\t\tlet id = match[1];\n\t\tconst idIsIndex = match[2] === ']',\n\t\t\tsubscript = match[3];\n\n\t\tif (idIsIndex) id = id | 0; // convert to integer\n\n\t\tif (subscript === undefined || subscript === '[' && matchEnd + 2 === pathLength) {\n\t\t\t// bare name or \"pure\" bottom-level array \"[0]\" suffix\n\t\t\taddUniform(container, subscript === undefined ?\n\t\t\t\tnew SingleUniform(gl, id, activeInfo, location) :\n\t\t\t\tnew PureArrayUniform(gl, id, activeInfo, location));\n\t\t\tbreak;\n\t\t} else {\n\t\t\t// step into inner node / create it in case it doesn't exist\n\t\t\tconst map = container.map;\n\t\t\tlet next = map[id];\n\t\t\tif (next === undefined) {\n\t\t\t\tnext = new StructuredUniform(id);\n\t\t\t\taddUniform(container, next);\n\t\t\t}\n\t\t\tcontainer = next;\n\t\t}\n\t}\n}\n\n// Root Container\n\nclass WebGLUniforms extends UniformContainer {\n\n\tconstructor(gl, program) {\n\t\tsuper();\n\n\t\tconst n = gl.getProgramParameter(program, gl.ACTIVE_UNIFORMS);\n\n\t\tfor (let i = 0; i < n; ++i) {\n\t\t\tconst info = gl.getActiveUniform(program, i),\n\t\t\t\taddr = gl.getUniformLocation(program, info.name);\n\n\t\t\tparseUniform(gl, info, addr, this);\n\t\t}\n\t}\n\n\tset(name, value, textures) {\n\t\tconst u = this.map[name];\n\t\tif (u !== undefined) u.set(value, textures);\n\t}\n\n\thas(name) {\n\t\treturn !!this.map[name];\n\t}\n\n}\n\nexport { WebGLUniforms };"
  },
  {
    "path": "src/webgl/WebGLVertexArrayBindings.js",
    "content": "import { PropertyMap } from '../render/PropertyMap.js';\n\nconst emptyString = '';\n\nexport class WebGLVertexArrayBindings extends PropertyMap {\n\n\tconstructor(prefix, gl, capabilities, buffers) {\n\t\tsuper(prefix);\n\n\t\tthis._gl = gl;\n\t\tthis._capabilities = capabilities;\n\t\tthis._buffers = buffers;\n\n\t\tthis._isWebGL2 = capabilities.version >= 2;\n\t\tthis._vaoExt = capabilities.getExtension('OES_vertex_array_object');\n\n\t\tthis._vaoCache = {}; // save vao cache here for releaseByProgram() method\n\t\tthis._currentGeometryProgram = '';\n\t\tthis._currentVAO = null;\n\t}\n\n\tsetup(object, geometry, program) {\n\t\tif (object.morphTargetInfluences) {\n\t\t\tthis.reset();\n\t\t\tthis._setupVertexAttributes(program, geometry);\n\t\t\tthis._currentGeometryProgram = emptyString;\n\t\t} else if (this._isWebGL2 || this._vaoExt) { // use VAO\n\t\t\tconst geometryProperties = this.get(geometry);\n\n\t\t\tif (geometryProperties._vaos === undefined) {\n\t\t\t\tgeometryProperties._vaos = {};\n\t\t\t\tthis._vaoCache[geometry.id] = geometryProperties._vaos;\n\t\t\t}\n\n\t\t\tlet vao = geometryProperties._vaos[program.id];\n\t\t\tif (!vao) {\n\t\t\t\tvao = geometryProperties._vaos[program.id] = { version: -1, object: this._createVAO() };\n\t\t\t}\n\n\t\t\tthis._bindVAO(vao.object);\n\n\t\t\tif (vao.version !== geometry.version) {\n\t\t\t\tthis._setupVertexAttributes(program, geometry);\n\t\t\t\tvao.version = geometry.version;\n\t\t\t}\n\t\t} else {\n\t\t\tconst geometryProgram = program.id + '_' + geometry.id + '_' + geometry.version;\n\t\t\tif (geometryProgram !== this._currentGeometryProgram) {\n\t\t\t\tthis._setupVertexAttributes(program, geometry);\n\t\t\t\tthis._currentGeometryProgram = geometryProgram;\n\t\t\t}\n\t\t}\n\t}\n\n\treleaseByGeometry(geometry) {\n\t\tconst geometryProperties = this.get(geometry);\n\n\t\tconst vaos = geometryProperties._vaos;\n\t\tif (vaos) {\n\t\t\tfor (const programId in vaos) {\n\t\t\t\tconst vao = vaos[programId];\n\t\t\t\tif (!vao) continue;\n\t\t\t\tthis._disposeVAO(vao.object);\n\t\t\t}\n\n\t\t\tdelete geometryProperties._vaos;\n\t\t\tdelete this._vaoCache[geometry.id];\n\t\t}\n\t}\n\n\treleaseByProgram(program) {\n\t\tfor (const geometryId in this._vaoCache) {\n\t\t\tconst vaos = this._vaoCache[geometryId];\n\t\t\tif (vaos) {\n\t\t\t\tconst vao = vaos[program.id];\n\t\t\t\tif (!vao) continue;\n\t\t\t\tthis._disposeVAO(vao.object);\n\t\t\t\tdelete vaos[program.id];\n\t\t\t}\n\t\t}\n\t}\n\n\treset(force) {\n\t\tif (this._currentVAO !== null || force) {\n\t\t\tif (this._isWebGL2) {\n\t\t\t\tthis._gl.bindVertexArray(null);\n\t\t\t} else if (this._vaoExt) {\n\t\t\t\tthis._vaoExt.bindVertexArrayOES(null);\n\t\t\t}\n\n\t\t\tthis._currentVAO = null;\n\t\t}\n\n\t\tif (this._currentGeometryProgram !== emptyString) {\n\t\t\tthis._currentGeometryProgram = emptyString;\n\t\t}\n\t}\n\n\t_createVAO() {\n\t\tif (this._isWebGL2) {\n\t\t\treturn this._gl.createVertexArray();\n\t\t} else if (this._vaoExt) {\n\t\t\treturn this._vaoExt.createVertexArrayOES();\n\t\t}\n\t\treturn null;\n\t}\n\n\t_bindVAO(vao) {\n\t\tif (this._currentVAO !== vao) {\n\t\t\tif (this._isWebGL2) {\n\t\t\t\tthis._gl.bindVertexArray(vao);\n\t\t\t} else if (this._vaoExt) {\n\t\t\t\tthis._vaoExt.bindVertexArrayOES(vao);\n\t\t\t}\n\n\t\t\tthis._currentVAO = vao;\n\t\t}\n\t}\n\n\t_disposeVAO(vao) {\n\t\tif (this._isWebGL2) {\n\t\t\tthis._gl.deleteVertexArray(vao);\n\t\t} else if (this._vaoExt) {\n\t\t\tthis._vaoExt.deleteVertexArrayOES(vao);\n\t\t}\n\t}\n\n\t_setupVertexAttributes(program, geometry) {\n\t\tconst gl = this._gl;\n\t\tconst isWebGL2 = this._isWebGL2;\n\t\tconst attributes = program.getAttributes();\n\t\tconst capabilities = this._capabilities;\n\t\tconst buffers = this._buffers;\n\n\t\tfor (const key in attributes) {\n\t\t\tconst programAttribute = attributes[key];\n\t\t\tconst geometryAttribute = geometry.getAttribute(key);\n\t\t\tif (geometryAttribute) {\n\t\t\t\tconst size = geometryAttribute.size;\n\n\t\t\t\tif (programAttribute.count !== size) {\n\t\t\t\t\tconsole.warn('WebGLVertexArrayBindings: attribute ' + key + ' size not match! ' + programAttribute.count + ' : ' + size);\n\t\t\t\t}\n\n\t\t\t\tconst buffer = geometryAttribute.buffer;\n\t\t\t\tconst bufferProperties = buffers.get(buffer);\n\n\t\t\t\tconst type = bufferProperties.type;\n\n\t\t\t\tconst integer = isWebGL2 && (programAttribute.format === gl.INT || programAttribute.format === gl.UNSIGNED_INT);\n\n\t\t\t\tfor (let i = 0, l = programAttribute.locationSize; i < l; i++) {\n\t\t\t\t\tgl.enableVertexAttribArray(programAttribute.location + i);\n\t\t\t\t}\n\n\t\t\t\tif (geometryAttribute.divisor > 0) { // use instancing\n\t\t\t\t\tfor (let i = 0, l = programAttribute.locationSize; i < l; i++) {\n\t\t\t\t\t\tif (isWebGL2) {\n\t\t\t\t\t\t\tgl.vertexAttribDivisor(programAttribute.location + i, geometryAttribute.divisor);\n\t\t\t\t\t\t} else if (capabilities.getExtension('ANGLE_instanced_arrays')) {\n\t\t\t\t\t\t\tcapabilities.getExtension('ANGLE_instanced_arrays').vertexAttribDivisorANGLE(programAttribute.location + i, geometryAttribute.divisor);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tconsole.warn('vertexAttribDivisor not supported');\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tconst bytesPerElement = bufferProperties.bytesPerElement;\n\t\t\t\tconst glBuffer = bufferProperties.glBuffer;\n\t\t\t\tconst stride = buffer.stride;\n\t\t\t\tconst offset = geometryAttribute.offset;\n\t\t\t\tconst normalized = geometryAttribute.normalized;\n\n\t\t\t\tgl.bindBuffer(gl.ARRAY_BUFFER, glBuffer);\n\n\t\t\t\tif (programAttribute.count === stride && programAttribute.locationSize === 1) {\n\t\t\t\t\tthis._vertexAttribPointer(programAttribute.location, programAttribute.count, type, normalized, 0, 0, integer);\n\t\t\t\t} else {\n\t\t\t\t\tfor (let i = 0; i < programAttribute.locationSize; i++) {\n\t\t\t\t\t\tthis._vertexAttribPointer(\n\t\t\t\t\t\t\tprogramAttribute.location + i,\n\t\t\t\t\t\t\tprogramAttribute.count / programAttribute.locationSize,\n\t\t\t\t\t\t\ttype,\n\t\t\t\t\t\t\tnormalized,\n\t\t\t\t\t\t\tbytesPerElement * stride,\n\t\t\t\t\t\t\tbytesPerElement * (offset + (programAttribute.count / programAttribute.locationSize) * i),\n\t\t\t\t\t\t\tinteger\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// console.warn(\"WebGLVertexArrayBindings: geometry attribute \" + key + \" not found!\");\n\t\t\t}\n\t\t}\n\n\t\t// bind index if could\n\t\tif (geometry.index) {\n\t\t\tconst indexBufferProperties = buffers.get(geometry.index.buffer);\n\t\t\tgl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, indexBufferProperties.glBuffer);\n\t\t}\n\t}\n\n\t_vertexAttribPointer(index, size, type, normalized, stride, offset, integer) {\n\t\tconst gl = this._gl;\n\t\tif (integer) {\n\t\t\tgl.vertexAttribIPointer(index, size, type, stride, offset);\n\t\t} else {\n\t\t\tgl.vertexAttribPointer(index, size, type, normalized, stride, offset);\n\t\t}\n\t}\n\n}"
  },
  {
    "path": "tests/index.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n    <meta charset=\"utf-8\">\n    <title>T3D Unit Test</title>\n    <link rel=\"stylesheet\" href=\"../node_modules/qunit/qunit/qunit.css\">\n</head>\n<body>\n    <div id=\"qunit\"></div>\n    <div id=\"qunit-fixture\"></div>\n\n    <script src=\"../node_modules/qunit/qunit/qunit.js\"></script>\n\n\t<script type=\"importmap\">\n\t\t{\n\t\t\t\"imports\": {\n\t\t\t\t\"t3d\": \"../build/t3d.module.js\"\n\t\t\t}\n\t\t}\n\t</script>\n\n    <script src=\"./unit/source.unit.js\" type=\"module\"></script>\n</body>\n</html>"
  },
  {
    "path": "tests/unit/source.unit.js",
    "content": "import './src/math/Box2.tests.js';\nimport './src/math/Box3.tests.js';\nimport './src/math/Color3.tests.js';\nimport './src/math/Color4.tests.js';\nimport './src/math/MathUtils.tests.js';\nimport './src/math/Matrix3.tests.js';\nimport './src/math/Matrix4.tests.js';\nimport './src/math/Plane.tests.js';\nimport './src/math/Quaternion.tests.js';\nimport './src/math/Ray.tests.js';\nimport './src/math/Sphere.tests.js';\nimport './src/math/Vector2.tests.js';\nimport './src/math/Vector3.tests.js';\nimport './src/math/Vector4.tests.js';\n\nimport './src/EventDispatcher.tests.js';"
  },
  {
    "path": "tests/unit/src/EventDispatcher.tests.js",
    "content": "import { EventDispatcher } from 't3d';\n\nQUnit.module('EventDispatcher');\n\nQUnit.test('Instancing', assert => {\n\tconst object = new EventDispatcher();\n\tassert.ok(object, 'Can instantiate an EventDispatcher.');\n});\n\nQUnit.test('addEventListener', assert => {\n\tconst eventDispatcher = new EventDispatcher();\n\n\tconst listener = {};\n\teventDispatcher.addEventListener('anyType', listener);\n\n\tassert.ok(eventDispatcher._listeners.anyType.length === 1, 'listener with unknown type was added');\n\tassert.ok(eventDispatcher._listeners.anyType[0] === listener, 'listener with unknown type was added');\n\n\teventDispatcher.addEventListener('anyType', listener);\n\n\tassert.ok(eventDispatcher._listeners.anyType.length === 1, 'can\\'t add one listener twice to same type');\n\tassert.ok(eventDispatcher._listeners.anyType[0] === listener, 'listener is still there');\n});\n\nQUnit.test('removeEventListener', assert => {\n\tconst eventDispatcher = new EventDispatcher();\n\n\tconst listener = {};\n\n\tassert.ok(eventDispatcher._listeners === undefined, 'there are no listeners by default');\n\n\teventDispatcher.addEventListener('anyType', listener);\n\tassert.ok(Object.keys(eventDispatcher._listeners).length === 1 &&\n\t\teventDispatcher._listeners.anyType.length === 1, 'if a listener was added, there is a new key');\n\n\teventDispatcher.removeEventListener('anyType', listener);\n\tassert.ok(eventDispatcher._listeners.anyType.length === 0, 'listener was deleted');\n\n\teventDispatcher.removeEventListener('unknownType', listener);\n\tassert.ok(eventDispatcher._listeners.unknownType === undefined, 'unknown types will be ignored');\n\n\teventDispatcher.removeEventListener('anyType', undefined);\n\tassert.ok(eventDispatcher._listeners.anyType.length === 0, 'undefined listeners are ignored');\n});\n\nQUnit.test('dispatchEvent', assert => {\n\tconst eventDispatcher = new EventDispatcher();\n\n\tlet callCount = 0;\n\tconst listener = function() {\n\t\tcallCount++;\n\t};\n\n\teventDispatcher.addEventListener('anyType', listener);\n\tassert.ok(callCount === 0, 'no event, no call');\n\n\teventDispatcher.dispatchEvent({ type: 'anyType' });\n\tassert.ok(callCount === 1, 'one event, one call');\n\n\teventDispatcher.dispatchEvent({ type: 'anyType' });\n\tassert.ok(callCount === 2, 'two events, two calls');\n});"
  },
  {
    "path": "tests/unit/src/math/Box2.tests.js",
    "content": "import { Box2, Vector2 } from 't3d';\n\n// Define 2D constants for tests\nconst zero2 = new Vector2(0, 0);\nconst one2 = new Vector2(1, 1);\n\nQUnit.module('Box2');\n\nQUnit.test('constructor', assert => {\n\tlet a = new Box2();\n\tassert.ok(a.min.x == Infinity, 'Default min.x is Infinity');\n\tassert.ok(a.min.y == Infinity, 'Default min.y is Infinity');\n\tassert.ok(a.max.x == -Infinity, 'Default max.x is -Infinity');\n\tassert.ok(a.max.y == -Infinity, 'Default max.y is -Infinity');\n\n\ta = new Box2(zero2.clone(), one2.clone());\n\tassert.ok(a.min.equals(zero2), 'Min vector set correctly');\n\tassert.ok(a.max.equals(one2), 'Max vector set correctly');\n});\n\nQUnit.test('set', assert => {\n\tconst a = new Box2();\n\n\ta.set(0, 1, 2, 3);\n\tassert.strictEqual(a.min.x, 0, 'min.x set correctly');\n\tassert.strictEqual(a.min.y, 1, 'min.y set correctly');\n\tassert.strictEqual(a.max.x, 2, 'max.x set correctly');\n\tassert.strictEqual(a.max.y, 3, 'max.y set correctly');\n});\n\nQUnit.test('clone', assert => {\n\tconst a = new Box2(zero2.clone(), one2.clone());\n\tconst b = a.clone();\n\n\tassert.ok(b.min.equals(zero2), 'Min cloned correctly');\n\tassert.ok(b.max.equals(one2), 'Max cloned correctly');\n\tassert.ok(b !== a, 'New instance created via clone');\n\n\t// Ensure it's a deep copy\n\ta.min.set(1, 1);\n\ta.max.set(2, 2);\n\n\tassert.ok(!b.min.equals(a.min), 'Changes to original do not affect clone (min)');\n\tassert.ok(!b.max.equals(a.max), 'Changes to original do not affect clone (max)');\n});\n\nQUnit.test('copy', assert => {\n\tconst a = new Box2(zero2.clone(), one2.clone());\n\tconst b = new Box2().copy(a);\n\n\tassert.ok(b.min.equals(zero2), 'Min copied correctly');\n\tassert.ok(b.max.equals(one2), 'Max copied correctly');\n\tassert.ok(b !== a, 'Different instances');\n\n\t// Ensure it's a deep copy\n\ta.min.set(1, 1);\n\ta.max.set(2, 2);\n\n\tassert.ok(!b.min.equals(a.min), 'Changes to original do not affect copy (min)');\n\tassert.ok(!b.max.equals(a.max), 'Changes to original do not affect copy (max)');\n});"
  },
  {
    "path": "tests/unit/src/math/Box3.tests.js",
    "content": "import { Box3, Vector3, Matrix4, Sphere } from 't3d';\nimport { zero3, one3, two3, eps } from '../../utils/math-constants.js';\n\nQUnit.module('Box3');\n\nQUnit.test('constructor', assert => {\n\tlet a = new Box3();\n\tassert.ok(a.min.x == Infinity, 'Passed!');\n\tassert.ok(a.min.y == Infinity, 'Passed!');\n\tassert.ok(a.min.z == Infinity, 'Passed!');\n\tassert.ok(a.max.x == -Infinity, 'Passed!');\n\tassert.ok(a.max.y == -Infinity, 'Passed!');\n\tassert.ok(a.max.z == -Infinity, 'Passed!');\n\n\ta = new Box3(zero3.clone(), one3.clone());\n\tassert.ok(a.min.equals(zero3), 'Passed!');\n\tassert.ok(a.max.equals(one3), 'Passed!');\n});\n\nQUnit.test('set', assert => {\n\tconst a = new Box3();\n\n\ta.set(zero3, one3);\n\tassert.ok(a.min.equals(zero3), 'Passed!');\n\tassert.ok(a.max.equals(one3), 'Passed!');\n});\n\nQUnit.test('setFromPoints', assert => {\n\tconst a = new Box3();\n\n\ta.setFromPoints([zero3, one3, two3]);\n\tassert.ok(a.min.equals(zero3), 'Passed!');\n\tassert.ok(a.max.equals(two3), 'Passed!');\n\n\ta.setFromPoints([]);\n\tassert.ok(a.isEmpty(), 'Passed!');\n});\n\nQUnit.test('makeEmpty', assert => {\n\tconst a = new Box3();\n\n\ta.set(zero3, one3);\n\ta.makeEmpty();\n\tassert.ok(a.isEmpty(), 'Passed!');\n});\n\nQUnit.test('expandByPoint', assert => {\n\tconst a = new Box3(zero3.clone(), one3.clone());\n\tconst point = new Vector3(2, 2, 2);\n\tconst expectedResult = new Box3(zero3.clone(), point.clone());\n\n\ta.expandByPoint(point);\n\tassert.ok(a.equals(expectedResult), 'Passed!');\n});\n\nQUnit.test('expandByScalar', assert => {\n\tconst a = new Box3(zero3.clone(), one3.clone());\n\tconst scalar = 1;\n\tconst expectedResult = new Box3(\n\t\tnew Vector3(-1, -1, -1),\n\t\tnew Vector3(2, 2, 2)\n\t);\n\n\ta.expandByScalar(scalar);\n\tassert.ok(a.equals(expectedResult), 'Passed!');\n});\n\nQUnit.test('expandByBox3', assert => {\n\tconst a = new Box3(zero3.clone(), one3.clone());\n\tconst b = new Box3(\n\t\tnew Vector3(-1, -1, -1),\n\t\tnew Vector3(2, 2, 2)\n\t);\n\tconst expectedResult = new Box3(\n\t\tnew Vector3(-1, -1, -1),\n\t\tnew Vector3(2, 2, 2)\n\t);\n\n\ta.expandByBox3(b);\n\tassert.ok(a.equals(expectedResult), 'Passed!');\n});\n\nQUnit.test('setFromArray', assert => {\n\tconst a = new Box3();\n\tconst array = [0, 0, 0, 1, 1, 1, 2, 2, 2];\n\n\ta.setFromArray(array);\n\tassert.ok(a.min.equals(zero3), 'Passed!');\n\tassert.ok(a.max.equals(two3), 'Passed!');\n\n\ta.setFromArray(array, 3);\n\tassert.ok(a.min.equals(zero3), 'Passed!');\n\tassert.ok(a.max.equals(two3), 'Passed!');\n\n\ta.setFromArray(array, 3, 0);\n\tassert.ok(a.min.equals(zero3), 'Passed!');\n\tassert.ok(a.max.equals(two3), 'Passed!');\n\n\ta.setFromArray([]);\n\tassert.ok(a.isEmpty(), 'Passed!');\n});\n\nQUnit.test('clampPoint', assert => {\n\tconst a = new Box3(zero3.clone(), one3.clone());\n\tconst point = new Vector3(-1, -1, -1);\n\tconst expectedResult = zero3.clone();\n\tconst result = new Vector3();\n\n\ta.clampPoint(point, result);\n\tassert.ok(result.equals(expectedResult), 'Clamped point should be min boundary when point is below min');\n\n\tconst point2 = new Vector3(2, 2, 2);\n\tconst expectedResult2 = one3.clone();\n\n\ta.clampPoint(point2, result);\n\tassert.ok(result.equals(expectedResult2), 'Clamped point should be max boundary when point is above max');\n\n\tconst point3 = new Vector3(0.5, 0.5, 0.5);\n\tconst expectedResult3 = point3.clone();\n\n\ta.clampPoint(point3, result);\n\tassert.ok(result.equals(expectedResult3), 'Clamped point should be unchanged when point is inside box');\n});\n\nQUnit.test('distanceToPoint', assert => {\n\tconst a = new Box3(zero3.clone(), one3.clone());\n\n\tassert.ok(a.distanceToPoint(new Vector3(2, 2, 2)) === Math.sqrt(3), 'Correct distance to point outside box');\n\tassert.ok(a.distanceToPoint(new Vector3(0.5, 0.5, 0.5)) === 0, 'Distance to point inside box should be 0');\n\tassert.ok(a.distanceToPoint(new Vector3(1, 1, 1)) === 0, 'Distance to point on box boundary should be 0');\n\tassert.ok(a.distanceToPoint(new Vector3(1.5, 1.5, 1.5)) === Math.sqrt(0.75), 'Correct distance to point outside box');\n\tassert.ok(a.distanceToPoint(new Vector3(-0.5, -0.5, -0.5)) === Math.sqrt(0.75), 'Correct distance to point outside box');\n});\n\nQUnit.test('getBoundingSphere', assert => {\n\tconst a = new Box3(zero3.clone(), one3.clone());\n\tconst sphere = new Sphere();\n\tconst expectedCenter = new Vector3(0.5, 0.5, 0.5);\n\n\ta.getBoundingSphere(sphere);\n\n\tassert.ok(Math.abs(sphere.radius - Math.sqrt(3) * 0.5) <= eps, 'Bounding sphere radius is correct');\n\tassert.ok(sphere.center.equals(expectedCenter), 'Bounding sphere center is correct');\n\n\tconst emptyBox = new Box3();\n\temptyBox.makeEmpty();\n\temptyBox.getBoundingSphere(sphere);\n\n\tassert.ok(sphere.isEmpty(), 'Bounding sphere for empty box should be empty');\n});\n\nQUnit.test('isEmpty', assert => {\n\tconst a = new Box3();\n\n\tassert.ok(a.isEmpty(), 'Empty box should report isEmpty() === true');\n\n\tconst b = new Box3(zero3.clone(), one3.clone());\n\tassert.ok(!b.isEmpty(), 'Non-empty box should report isEmpty() === false');\n\n\t// Edge cases\n\tconst c = new Box3(one3.clone(), zero3.clone()); // min > max\n\tassert.ok(c.isEmpty(), 'Box with min > max should be considered empty');\n\n\tconst d = new Box3(zero3.clone(), zero3.clone()); // min === max\n\tassert.ok(!d.isEmpty(), 'Box with min === max should not be considered empty (contains one point)');\n});\n\nQUnit.test('equals', assert => {\n\tconst a = new Box3(zero3.clone(), one3.clone());\n\tconst b = new Box3(zero3.clone(), one3.clone());\n\n\tassert.ok(a.equals(b), 'Identical boxes should be equal');\n\n\tconst c = new Box3(zero3.clone(), two3.clone());\n\tassert.ok(!a.equals(c), 'Different boxes should not be equal');\n});\n\nQUnit.test('getCenter', assert => {\n\tconst a = new Box3(zero3.clone(), one3.clone());\n\tconst expectedCenter = new Vector3(0.5, 0.5, 0.5);\n\tconst result = new Vector3();\n\n\ta.getCenter(result);\n\n\tassert.ok(result.equals(expectedCenter), 'Center is correct for non-empty box');\n\n\tconst emptyBox = new Box3();\n\temptyBox.makeEmpty();\n\temptyBox.getCenter(result);\n\n\tassert.ok(result.equals(new Vector3(0, 0, 0)), 'Center defaults to (0,0,0) for empty box');\n});\n\nQUnit.test('getSize', assert => {\n\tconst a = new Box3(zero3.clone(), one3.clone());\n\tconst expectedSize = new Vector3(1, 1, 1);\n\tconst result = new Vector3();\n\n\ta.getSize(result);\n\n\tassert.ok(result.equals(expectedSize), 'Size is correct for non-empty box');\n\n\tconst emptyBox = new Box3();\n\temptyBox.makeEmpty();\n\temptyBox.getSize(result);\n\n\tassert.ok(result.equals(new Vector3(0, 0, 0)), 'Size defaults to (0,0,0) for empty box');\n});\n\nQUnit.test('getPoints', assert => {\n\tconst a = new Box3(\n\t\tnew Vector3(-1, -2, -3),\n\t\tnew Vector3(2, 3, 4)\n\t);\n\n\tconst points = Array(8).fill().map(() => new Vector3());\n\ta.getPoints(points);\n\n\tassert.ok(points[0].equals(new Vector3(2, 3, 4)), 'Corner point 0 is correct');\n\tassert.ok(points[1].equals(new Vector3(2, -2, 4)), 'Corner point 1 is correct');\n\tassert.ok(points[2].equals(new Vector3(2, -2, -3)), 'Corner point 2 is correct');\n\tassert.ok(points[3].equals(new Vector3(2, 3, -3)), 'Corner point 3 is correct');\n\tassert.ok(points[4].equals(new Vector3(-1, 3, 4)), 'Corner point 4 is correct');\n\tassert.ok(points[5].equals(new Vector3(-1, -2, 4)), 'Corner point 5 is correct');\n\tassert.ok(points[6].equals(new Vector3(-1, -2, -3)), 'Corner point 6 is correct');\n\tassert.ok(points[7].equals(new Vector3(-1, 3, -3)), 'Corner point 7 is correct');\n});\n\nQUnit.test('union', assert => {\n\tconst a = new Box3(zero3.clone(), one3.clone());\n\tconst b = new Box3(\n\t\tnew Vector3(-1, -1, -1),\n\t\tnew Vector3(2, 2, 2)\n\t);\n\tconst expectedResult = new Box3(\n\t\tnew Vector3(-1, -1, -1),\n\t\tnew Vector3(2, 2, 2)\n\t);\n\n\ta.union(b);\n\tassert.ok(a.equals(expectedResult), 'Union of overlapping boxes is correct');\n\n\tconst c = new Box3(\n\t\tnew Vector3(3, 3, 3),\n\t\tnew Vector3(4, 4, 4)\n\t);\n\tconst expectedResult2 = new Box3(\n\t\tnew Vector3(-1, -1, -1),\n\t\tnew Vector3(4, 4, 4)\n\t);\n\n\ta.union(c);\n\tassert.ok(a.equals(expectedResult2), 'Union of non-overlapping boxes is correct');\n});\n\nQUnit.test('applyMatrix4', assert => {\n\tconst a = new Box3(zero3.clone(), one3.clone());\n\tconst m = new Matrix4().makeTranslation(1, 2, 3);\n\tconst expectedResult = new Box3(\n\t\tnew Vector3(1, 2, 3),\n\t\tnew Vector3(2, 3, 4)\n\t);\n\n\ta.applyMatrix4(m);\n\tassert.ok(a.equals(expectedResult), 'Box translated correctly');\n\n\tconst b = new Box3(zero3.clone(), one3.clone());\n\t// Create a scale matrix\n\tconst m2 = new Matrix4().makeScale(2, 3, 4);\n\tconst expectedResult2 = new Box3(\n\t\tnew Vector3(0, 0, 0),\n\t\tnew Vector3(2, 3, 4)\n\t);\n\n\tb.applyMatrix4(m2);\n\tassert.ok(b.equals(expectedResult2), 'Box scaled correctly');\n\n\tconst emptyBox = new Box3();\n\temptyBox.makeEmpty();\n\temptyBox.applyMatrix4(m);\n\tassert.ok(emptyBox.isEmpty(), 'Empty box remains empty after transformation');\n});\n\nQUnit.test('containsPoint', assert => {\n\tconst a = new Box3(zero3.clone(), one3.clone());\n\n\tassert.ok(a.containsPoint(new Vector3(0.5, 0.5, 0.5)), 'Point inside box should return true');\n\tassert.ok(a.containsPoint(zero3), 'Point on min boundary should return true');\n\tassert.ok(a.containsPoint(one3), 'Point on max boundary should return true');\n\tassert.ok(!a.containsPoint(new Vector3(2, 2, 2)), 'Point outside box should return false');\n\n\tconst emptyBox = new Box3();\n\temptyBox.makeEmpty();\n\tassert.ok(!emptyBox.containsPoint(zero3), 'Empty box should not contain any points');\n});\n\nQUnit.test('intersectsTriangle', assert => {\n\tconst a = new Box3(zero3.clone(), one3.clone());\n\n\t// Triangle completely inside box\n\tconst insideTriangle = {\n\t\ta: new Vector3(0.1, 0.1, 0.1),\n\t\tb: new Vector3(0.5, 0.5, 0.5),\n\t\tc: new Vector3(0.9, 0.9, 0.9)\n\t};\n\tassert.ok(a.intersectsTriangle(insideTriangle), 'Triangle inside box should intersect');\n\n\t// Triangle intersecting box\n\tconst intersectingTriangle = {\n\t\ta: new Vector3(0.5, 0.5, 0.5),\n\t\tb: new Vector3(1.5, 0.5, 0.5),\n\t\tc: new Vector3(0.5, 1.5, 0.5)\n\t};\n\tassert.ok(a.intersectsTriangle(intersectingTriangle), 'Triangle intersecting box should intersect');\n\n\t// Triangle completely outside box\n\tconst outsideTriangle = {\n\t\ta: new Vector3(2, 2, 2),\n\t\tb: new Vector3(3, 2, 2),\n\t\tc: new Vector3(2, 3, 2)\n\t};\n\tassert.ok(!a.intersectsTriangle(outsideTriangle), 'Triangle outside box should not intersect');\n\n\t// Empty box should not intersect any triangle\n\tconst emptyBox = new Box3();\n\temptyBox.makeEmpty();\n\tassert.ok(!emptyBox.intersectsTriangle(insideTriangle), 'Empty box should not intersect any triangle');\n});\n\nQUnit.test('clone', assert => {\n\tconst a = new Box3(zero3.clone(), one3.clone());\n\tconst b = a.clone();\n\n\tassert.ok(b.min.equals(zero3), 'Min cloned correctly');\n\tassert.ok(b.max.equals(one3), 'Max cloned correctly');\n\tassert.ok(b !== a, 'New instance created via clone');\n\n\t// Ensure it's a deep copy\n\ta.min.set(1, 1, 1);\n\ta.max.set(2, 2, 2);\n\n\tassert.ok(!b.min.equals(a.min), 'Changes to original do not affect clone (min)');\n\tassert.ok(!b.max.equals(a.max), 'Changes to original do not affect clone (max)');\n});\n\nQUnit.test('copy', assert => {\n\tconst a = new Box3(zero3.clone(), one3.clone());\n\tconst b = new Box3().copy(a);\n\n\tassert.ok(b.min.equals(zero3), 'Min copied correctly');\n\tassert.ok(b.max.equals(one3), 'Max copied correctly');\n\tassert.ok(b !== a, 'Different instances');\n\n\t// Ensure it's a deep copy\n\ta.min.set(1, 1, 1);\n\ta.max.set(2, 2, 2);\n\n\tassert.ok(!b.min.equals(a.min), 'Changes to original do not affect copy (min)');\n\tassert.ok(!b.max.equals(a.max), 'Changes to original do not affect copy (max)');\n});"
  },
  {
    "path": "tests/unit/src/math/Color3.tests.js",
    "content": "import { Color3 } from 't3d';\nimport { eps } from '../../utils/math-constants.js';\n\nQUnit.module('Color3');\n\nQUnit.test('setHex', assert => {\n\tconst a = new Color3();\n\ta.setHex(0xff0000);\n\tassert.ok(a.r == 1, 'Passed!');\n\tassert.ok(a.g == 0, 'Passed!');\n\tassert.ok(a.b == 0, 'Passed!');\n});\n\nQUnit.test('setRGB', assert => {\n\tconst a = new Color3();\n\ta.setRGB(0.5, 0.5, 0.5);\n\tassert.ok(a.r == 0.5, 'Passed!');\n\tassert.ok(a.g == 0.5, 'Passed!');\n\tassert.ok(a.b == 0.5, 'Passed!');\n});\n\nQUnit.test('setHSL', assert => {\n\tconst a = new Color3();\n\ta.setHSL(0, 1, 0.5);\n\tassert.ok(Math.abs(a.r - 1) < eps, 'Passed!');\n\tassert.ok(Math.abs(a.g - 0) < eps, 'Passed!');\n\tassert.ok(Math.abs(a.b - 0) < eps, 'Passed!');\n});\n\nQUnit.test('clone', assert => {\n\tconst a = new Color3().clone();\n\tassert.ok(a.r == 0, 'Passed!');\n\tassert.ok(a.g == 0, 'Passed!');\n\tassert.ok(a.b == 0, 'Passed!');\n\n\tconst b = a.setRGB(0.3, 0.3, 0.3).clone();\n\tassert.ok(b.r == 0.3, 'Passed!');\n\tassert.ok(b.g == 0.3, 'Passed!');\n\tassert.ok(b.b == 0.3, 'Passed!');\n});\n\nQUnit.test('copy', assert => {\n\tconst a = new Color3(0.5, 0.5, 0.5);\n\tconst b = new Color3().copy(a);\n\tassert.ok(b.r == 0.5, 'Passed!');\n\tassert.ok(b.g == 0.5, 'Passed!');\n\tassert.ok(b.b == 0.5, 'Passed!');\n});\n\nQUnit.test('convertSRGBToLinear', assert => {\n\tconst a = new Color3(0.5, 0.5, 0.5).convertSRGBToLinear();\n\tassert.ok(a.r < 0.5, 'Passed!');\n\tassert.ok(a.g < 0.5, 'Passed!');\n\tassert.ok(a.b < 0.5, 'Passed!');\n});\n\nQUnit.test('convertLinearToSRGB', assert => {\n\tconst a = new Color3(0.5, 0.5, 0.5).convertLinearToSRGB();\n\tassert.ok(a.r > 0.5, 'Passed!');\n\tassert.ok(a.g > 0.5, 'Passed!');\n\tassert.ok(a.b > 0.5, 'Passed!');\n});\n\nQUnit.test('getHex', assert => {\n\tconst a = new Color3(1, 0, 0);\n\tassert.ok(a.getHex() == 0xff0000, 'Passed!');\n});\n\nQUnit.test('lerp', assert => {\n\tconst a = new Color3(0, 0, 0);\n\tconst b = new Color3(1, 1, 1);\n\ta.lerp(b, 0.5);\n\tassert.ok(a.r == 0.5, 'Passed!');\n\tassert.ok(a.g == 0.5, 'Passed!');\n\tassert.ok(a.b == 0.5, 'Passed!');\n});\n\nQUnit.test('lerpColors', assert => {\n\tconst a = new Color3();\n\tconst b = new Color3(0, 0, 0);\n\tconst c = new Color3(1, 1, 1);\n\ta.lerpColors(b, c, 0.5);\n\tassert.ok(a.r == 0.5, 'Passed!');\n\tassert.ok(a.g == 0.5, 'Passed!');\n\tassert.ok(a.b == 0.5, 'Passed!');\n});\n\nQUnit.test('fromArray', assert => {\n\tconst array = new Uint8Array([255, 255, 0]);\n\tconst a = new Color3();\n\ta.fromArray(array, 0, true);\n\tassert.ok(a.r == 1, 'Passed!');\n\tassert.ok(a.g == 1, 'Passed!');\n\tassert.ok(a.b == 0, 'Passed!');\n});\n\nQUnit.test('toArray', assert => {\n\tconst array = new Uint8Array(3);\n\tconst a = new Color3(1, 1, 0);\n\ta.toArray(array, 0, true);\n\tassert.ok(array[0] == 255, 'Passed!');\n\tassert.ok(array[1] == 255, 'Passed!');\n\tassert.ok(array[2] == 0, 'Passed!');\n});\n\nQUnit.test('iterable', assert => {\n\tconst c = new Color3(0.5, 0.75, 1);\n\tconst array = [...c];\n\tassert.strictEqual(array[0], 0.5, 'Color3 is iterable.');\n\tassert.strictEqual(array[1], 0.75, 'Color3 is iterable.');\n\tassert.strictEqual(array[2], 1, 'Color3 is iterable.');\n});"
  },
  {
    "path": "tests/unit/src/math/Color4.tests.js",
    "content": "import { Color4 } from 't3d';\n\nQUnit.module('Color4');\n\nQUnit.test('setRGBA', assert => {\n\tconst a = new Color4();\n\ta.setRGBA(0.5, 0.5, 0.5, 0.5);\n\tassert.ok(a.r == 0.5, 'Passed!');\n\tassert.ok(a.g == 0.5, 'Passed!');\n\tassert.ok(a.b == 0.5, 'Passed!');\n\tassert.ok(a.a == 0.5, 'Passed!');\n});\n\nQUnit.test('clone', assert => {\n\tconst a = new Color4().clone();\n\tassert.ok(a.r == 0, 'Passed!');\n\tassert.ok(a.g == 0, 'Passed!');\n\tassert.ok(a.b == 0, 'Passed!');\n\tassert.ok(a.a == 1, 'Passed!');\n\n\tconst b = a.setRGBA(0.3, 0.3, 0.3, 0.3).clone();\n\tassert.ok(b.r == 0.3, 'Passed!');\n\tassert.ok(b.g == 0.3, 'Passed!');\n\tassert.ok(b.b == 0.3, 'Passed!');\n\tassert.ok(b.a == 0.3, 'Passed!');\n});\n\nQUnit.test('copy', assert => {\n\tconst a = new Color4(0.5, 0.5, 0.5, 0.5);\n\tconst b = new Color4().copy(a);\n\tassert.ok(b.r == 0.5, 'Passed!');\n\tassert.ok(b.g == 0.5, 'Passed!');\n\tassert.ok(b.b == 0.5, 'Passed!');\n\tassert.ok(b.a == 0.5, 'Passed!');\n});\n\nQUnit.test('fromArray', assert => {\n\tconst array = new Uint8Array([255, 255, 0, 128]);\n\tconst a = new Color4();\n\ta.fromArray(array, 0, true);\n\tassert.ok(a.r == 1, 'Passed!');\n\tassert.ok(a.g == 1, 'Passed!');\n\tassert.ok(a.b == 0, 'Passed!');\n\tassert.ok(a.a == 0.5019607843137255, 'Passed!');\n});\n\nQUnit.test('toArray', assert => {\n\tconst array = new Uint8Array(4);\n\tconst a = new Color4(1, 1, 0, 0.5);\n\ta.toArray(array, 0, true);\n\tassert.ok(array[0] == 255, 'Passed!');\n\tassert.ok(array[1] == 255, 'Passed!');\n\tassert.ok(array[2] == 0, 'Passed!');\n\tassert.ok(array[3] == 128, 'Passed!');\n});\n\nQUnit.test('iterable', assert => {\n\tconst c = new Color4(0.5, 0.75, 1, 0.5);\n\tconst array = [...c];\n\tassert.strictEqual(array[0], 0.5, 'Color4 is iterable.');\n\tassert.strictEqual(array[1], 0.75, 'Color4 is iterable.');\n\tassert.strictEqual(array[2], 1, 'Color4 is iterable.');\n\tassert.strictEqual(array[3], 0.5, 'Color4 is iterable.');\n});\n"
  },
  {
    "path": "tests/unit/src/math/MathUtils.tests.js",
    "content": "import { MathUtils } from 't3d';\n\nQUnit.module('MathUtils');\n\nQUnit.test('generateUUID', assert => {\n\tconst a = MathUtils.generateUUID();\n\tconst regex = /[A-Z0-9]{8}-[A-Z0-9]{4}-4[A-Z0-9]{3}-[A-Z0-9]{4}-[A-Z0-9]{12}/i;\n\t// note the fixed '4' here ----------^\n\n\tassert.ok(regex.test(a), 'Generated UUID matches the expected pattern');\n});\n\nQUnit.test('clamp', assert => {\n\tassert.strictEqual(MathUtils.clamp(0.5, 0, 1), 0.5, 'Value already within limits');\n\tassert.strictEqual(MathUtils.clamp(0, 0, 1), 0, 'Value equal to one limit');\n\tassert.strictEqual(MathUtils.clamp(-0.1, 0, 1), 0, 'Value too low');\n\tassert.strictEqual(MathUtils.clamp(1.1, 0, 1), 1, 'Value too high');\n});\n\nQUnit.test('euclideanModulo', assert => {\n\tassert.ok(isNaN(MathUtils.euclideanModulo(6, 0)), 'Division by zero returns NaN');\n\tassert.strictEqual(MathUtils.euclideanModulo(6, 1), 0, 'Division by trivial divisor');\n\tassert.strictEqual(MathUtils.euclideanModulo(6, 2), 0, 'Division by non-trivial divisor');\n\tassert.strictEqual(MathUtils.euclideanModulo(6, 5), 1, 'Division by itself - 1');\n\tassert.strictEqual(MathUtils.euclideanModulo(6, 6), 0, 'Division by itself');\n\tassert.strictEqual(MathUtils.euclideanModulo(6, 7), 6, 'Division by itself + 1');\n});\n\nQUnit.test('mapLinear', assert => {\n\tassert.strictEqual(MathUtils.mapLinear(0.5, 0, 1, 0, 10), 5, 'Value within range');\n\tassert.strictEqual(MathUtils.mapLinear(0.0, 0, 1, 0, 10), 0, 'Value equal to lower boundary');\n\tassert.strictEqual(MathUtils.mapLinear(1.0, 0, 1, 0, 10), 10, 'Value equal to upper boundary');\n});\n\nQUnit.test('lerp', assert => {\n\tassert.strictEqual(MathUtils.lerp(1, 2, 0), 1, 'Value equal to lower boundary');\n\tassert.strictEqual(MathUtils.lerp(1, 2, 1), 2, 'Value equal to upper boundary');\n\tassert.strictEqual(MathUtils.lerp(1, 2, 0.4), 1.4, 'Value within range');\n});\n\nQUnit.todo('isPowerOfTwo', assert => {\n\tassert.ok(false, 'everything\\'s gonna be alright');\n});\n\nQUnit.todo('nearestPowerOfTwo', assert => {\n\tassert.ok(false, 'everything\\'s gonna be alright');\n});\n\nQUnit.todo('nextPowerOfTwo', assert => {\n\tassert.ok(false, 'everything\\'s gonna be alright');\n});\n\nQUnit.todo('nextPowerOfTwoSquareSize', assert => {\n\tassert.ok(false, 'everything\\'s gonna be alright');\n});\n\nQUnit.todo('denormalize/normalize', assert => {\n\tassert.ok(false, 'everything\\'s gonna be alright');\n});\n\nQUnit.todo('toHalfFloat/fromHalfFloat', assert => {\n\tassert.ok(false, 'everything\\'s gonna be alright');\n});"
  },
  {
    "path": "tests/unit/src/math/Matrix3.tests.js",
    "content": "import { Matrix3 } from 't3d';\n\nQUnit.module('Matrix3');\n\nfunction matrixEquals3(a, b, tolerance) {\n\ttolerance = tolerance || 0.0001;\n\tif (a.elements.length != b.elements.length) {\n\t\treturn false;\n\t}\n\n\tfor (let i = 0, il = a.elements.length; i < il; i++) {\n\t\tconst delta = a.elements[i] - b.elements[i];\n\t\tif (delta > tolerance) {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\treturn true;\n}\n\nQUnit.test('determinant', assert => {\n\tconst a = new Matrix3();\n\tassert.ok(a.determinant() == 1, 'Passed!');\n\n\ta.elements[0] = 2;\n\tassert.ok(a.determinant() == 2, 'Passed!');\n\n\ta.elements[0] = 0;\n\tassert.ok(a.determinant() == 0, 'Passed!');\n\n\t// calculated via http://www.euclideanspace.com/maths/algebra/matrix/functions/determinant/threeD/index.htm\n\ta.set(2, 3, 4, 5, 13, 7, 8, 9, 11);\n\tassert.ok(a.determinant() == -73, 'Passed!');\n});\n\nQUnit.test('clone', assert => {\n\tconst a = new Matrix3().set(0, 1, 2, 3, 4, 5, 6, 7, 8);\n\tconst b = a.clone();\n\n\tassert.ok(matrixEquals3(a, b), 'Passed!');\n\n\t// ensure that it is a true copy\n\ta.elements[0] = 2;\n\tassert.ok(!matrixEquals3(a, b), 'Passed!');\n});"
  },
  {
    "path": "tests/unit/src/math/Matrix4.tests.js",
    "content": "import { Vector3, Matrix3, Matrix4, Euler, Quaternion } from 't3d';\nimport { eps } from '../../utils/math-constants.js';\n\nQUnit.module('Matrix4');\n\nfunction matrixEquals4(a, b, tolerance) {\n\ttolerance = tolerance || 0.0001;\n\tif (a.elements.length != b.elements.length) {\n\t\treturn false;\n\t}\n\n\tfor (let i = 0, il = a.elements.length; i < il; i++) {\n\t\tconst delta = Math.abs(a.elements[i] - b.elements[i]);\n\t\tif (delta > tolerance) {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\treturn true;\n}\n\nfunction eulerEquals(a, b, tolerance) {\n\ttolerance = tolerance || 0.0001;\n\tconst diff = Math.abs(a.x - b.x) + Math.abs(a.y - b.y) + Math.abs(a.z - b.z);\n\treturn (diff < tolerance);\n}\n\nQUnit.test('set', assert => {\n\tconst b = new Matrix4();\n\tassert.ok(b.determinant() == 1, 'Passed!');\n\n\tb.set(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15);\n\tassert.ok(b.elements[0] == 0);\n\tassert.ok(b.elements[1] == 4);\n\tassert.ok(b.elements[2] == 8);\n\tassert.ok(b.elements[3] == 12);\n\tassert.ok(b.elements[4] == 1);\n\tassert.ok(b.elements[5] == 5);\n\tassert.ok(b.elements[6] == 9);\n\tassert.ok(b.elements[7] == 13);\n\tassert.ok(b.elements[8] == 2);\n\tassert.ok(b.elements[9] == 6);\n\tassert.ok(b.elements[10] == 10);\n\tassert.ok(b.elements[11] == 14);\n\tassert.ok(b.elements[12] == 3);\n\tassert.ok(b.elements[13] == 7);\n\tassert.ok(b.elements[14] == 11);\n\tassert.ok(b.elements[15] == 15);\n});\n\nQUnit.test('identity', assert => {\n\tconst b = new Matrix4().set(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15);\n\tassert.ok(b.elements[0] == 0);\n\tassert.ok(b.elements[1] == 4);\n\tassert.ok(b.elements[2] == 8);\n\tassert.ok(b.elements[3] == 12);\n\tassert.ok(b.elements[4] == 1);\n\tassert.ok(b.elements[5] == 5);\n\tassert.ok(b.elements[6] == 9);\n\tassert.ok(b.elements[7] == 13);\n\tassert.ok(b.elements[8] == 2);\n\tassert.ok(b.elements[9] == 6);\n\tassert.ok(b.elements[10] == 10);\n\tassert.ok(b.elements[11] == 14);\n\tassert.ok(b.elements[12] == 3);\n\tassert.ok(b.elements[13] == 7);\n\tassert.ok(b.elements[14] == 11);\n\tassert.ok(b.elements[15] == 15);\n\n\tconst a = new Matrix4();\n\tassert.ok(!matrixEquals4(a, b), 'Passed!');\n\n\tb.identity();\n\tassert.ok(matrixEquals4(a, b), 'Passed!');\n});\n\nQUnit.test('clone', assert => {\n\tconst a = new Matrix4().set(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15);\n\tconst b = a.clone();\n\n\tassert.ok(matrixEquals4(a, b), 'Passed!');\n\n\t// ensure that it is a true copy\n\ta.elements[0] = 2;\n\tassert.ok(!matrixEquals4(a, b), 'Passed!');\n});\n\nQUnit.test('copy', assert => {\n\tconst a = new Matrix4().set(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15);\n\tconst b = new Matrix4().copy(a);\n\n\tassert.ok(matrixEquals4(a, b), 'Passed!');\n\n\t// ensure that it is a true copy\n\ta.elements[0] = 2;\n\tassert.ok(!matrixEquals4(a, b), 'Passed!');\n});\n\nQUnit.test('setFromMatrix3', assert => {\n\tconst a = new Matrix3().set(\n\t\t0, 1, 2,\n\t\t3, 4, 5,\n\t\t6, 7, 8\n\t);\n\tconst b = new Matrix4();\n\tconst c = new Matrix4().set(\n\t\t0, 1, 2, 0,\n\t\t3, 4, 5, 0,\n\t\t6, 7, 8, 0,\n\t\t0, 0, 0, 1\n\t);\n\tb.setFromMatrix3(a);\n\tassert.ok(b.equals(c));\n});\n\nQUnit.test('makeBasis/extractBasis', assert => {\n\tconst identityBasis = [new Vector3(1, 0, 0), new Vector3(0, 1, 0), new Vector3(0, 0, 1)];\n\tconst a = new Matrix4().makeBasis(identityBasis[0], identityBasis[1], identityBasis[2]);\n\tconst identity = new Matrix4();\n\tassert.ok(matrixEquals4(a, identity), 'Passed!');\n\n\tconst testBases = [[new Vector3(0, 1, 0), new Vector3(-1, 0, 0), new Vector3(0, 0, 1)]];\n\tfor (let i = 0; i < testBases.length; i++) {\n\t\tconst testBasis = testBases[i];\n\t\tconst b = new Matrix4().makeBasis(testBasis[0], testBasis[1], testBasis[2]);\n\t\tconst outBasis = [new Vector3(), new Vector3(), new Vector3()];\n\t\tb.extractBasis(outBasis[0], outBasis[1], outBasis[2]);\n\t\t// check what goes in, is what comes out.\n\t\tfor (let j = 0; j < outBasis.length; j++) {\n\t\t\tassert.ok(outBasis[j].equals(testBasis[j]), 'Passed!');\n\t\t}\n\n\t\t// get the basis out the hard war\n\t\tfor (let j = 0; j < identityBasis.length; j++) {\n\t\t\toutBasis[j].copy(identityBasis[j]);\n\t\t\toutBasis[j].applyMatrix4(b);\n\t\t}\n\n\t\t// did the multiply method of basis extraction work?\n\t\tfor (let j = 0; j < outBasis.length; j++) {\n\t\t\tassert.ok(outBasis[j].equals(testBasis[j]), 'Passed!');\n\t\t}\n\t}\n});\n\nQUnit.test('makeRotationFromEuler/extractRotation', assert => {\n\tconst testValues = [\n\t\tnew Euler(0, 0, 0, 'XYZ'),\n\t\tnew Euler(1, 0, 0, 'XYZ'),\n\t\tnew Euler(0, 1, 0, 'ZYX'),\n\t\tnew Euler(0, 0, 0.5, 'YZX'),\n\t\tnew Euler(0, 0, -0.5, 'YZX')\n\t];\n\n\tfor (let i = 0; i < testValues.length; i++) {\n\t\tconst v = testValues[i];\n\n\t\tconst m = new Matrix4().makeRotationFromEuler(v);\n\n\t\tconst v2 = new Euler().setFromRotationMatrix(m, v.order);\n\t\tconst m2 = new Matrix4().makeRotationFromEuler(v2);\n\n\t\tassert.ok(matrixEquals4(m, m2, eps), 'makeRotationFromEuler #' + i + ': original and Euler-derived matrices are equal');\n\t\tassert.ok(eulerEquals(v, v2, eps), 'makeRotationFromEuler #' + i + ': original and matrix-derived Eulers are equal');\n\n\t\tconst m3 = new Matrix4().extractRotation(m2);\n\t\tconst v3 = new Euler().setFromRotationMatrix(m3, v.order);\n\n\t\tassert.ok(matrixEquals4(m, m3, eps), 'extractRotation #' + i + ': original and extracted matrices are equal');\n\t\tassert.ok(eulerEquals(v, v3, eps), 'extractRotation #' + i + ': original and extracted Eulers are equal');\n\t}\n});\n\nQUnit.todo('makeRotationFromQuaternion', assert => {\n\tassert.ok(false, 'everything\\'s gonna be alright');\n});\n\nQUnit.test('lookAtRH', assert => {\n\tconst a = new Matrix4();\n\tconst expected = new Matrix4().identity();\n\tconst eye = new Vector3(0, 0, 0);\n\tconst target = new Vector3(0, 1, -1);\n\tconst up = new Vector3(0, 1, 0);\n\n\ta.lookAtRH(eye, target, up);\n\tconst rotation = new Euler().setFromRotationMatrix(a);\n\tassert.ok(Math.abs(rotation.x * (180 / Math.PI) - 45) < eps, 'Check the rotation');\n\n\t// eye and target are in the same position\n\teye.copy(target);\n\ta.lookAtRH(eye, target, up);\n\tassert.ok(matrixEquals4(a, expected), 'Check the result for eye == target');\n\n\t// up and z are parallel\n\teye.set(0, 1, 0);\n\ttarget.set(0, 0, 0);\n\ta.lookAtRH(eye, target, up);\n\texpected.set(\n\t\t1, 0, 0, 0,\n\t\t0, 0.0001, 1, 0,\n\t\t0, -1, 0.0001, 0,\n\t\t0, 0, 0, 1\n\t);\n\tassert.ok(matrixEquals4(a, expected), 'Check the result for when up and z are parallel');\n});\n\nQUnit.test('multiply', assert => {\n\tconst lhs = new Matrix4().set(2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53);\n\tconst rhs = new Matrix4().set(59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131);\n\n\tlhs.multiply(rhs);\n\n\tassert.ok(lhs.elements[0] == 1585);\n\tassert.ok(lhs.elements[1] == 5318);\n\tassert.ok(lhs.elements[2] == 10514);\n\tassert.ok(lhs.elements[3] == 15894);\n\tassert.ok(lhs.elements[4] == 1655);\n\tassert.ok(lhs.elements[5] == 5562);\n\tassert.ok(lhs.elements[6] == 11006);\n\tassert.ok(lhs.elements[7] == 16634);\n\tassert.ok(lhs.elements[8] == 1787);\n\tassert.ok(lhs.elements[9] == 5980);\n\tassert.ok(lhs.elements[10] == 11840);\n\tassert.ok(lhs.elements[11] == 17888);\n\tassert.ok(lhs.elements[12] == 1861);\n\tassert.ok(lhs.elements[13] == 6246);\n\tassert.ok(lhs.elements[14] == 12378);\n\tassert.ok(lhs.elements[15] == 18710);\n});\n\nQUnit.test('premultiply', assert => {\n\tconst lhs = new Matrix4().set(2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53);\n\tconst rhs = new Matrix4().set(59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131);\n\n\trhs.premultiply(lhs);\n\n\tassert.ok(rhs.elements[0] == 1585);\n\tassert.ok(rhs.elements[1] == 5318);\n\tassert.ok(rhs.elements[2] == 10514);\n\tassert.ok(rhs.elements[3] == 15894);\n\tassert.ok(rhs.elements[4] == 1655);\n\tassert.ok(rhs.elements[5] == 5562);\n\tassert.ok(rhs.elements[6] == 11006);\n\tassert.ok(rhs.elements[7] == 16634);\n\tassert.ok(rhs.elements[8] == 1787);\n\tassert.ok(rhs.elements[9] == 5980);\n\tassert.ok(rhs.elements[10] == 11840);\n\tassert.ok(rhs.elements[11] == 17888);\n\tassert.ok(rhs.elements[12] == 1861);\n\tassert.ok(rhs.elements[13] == 6246);\n\tassert.ok(rhs.elements[14] == 12378);\n\tassert.ok(rhs.elements[15] == 18710);\n});\n\nQUnit.test('multiplyMatrices', assert => {\n\tconst lhs = new Matrix4().set(2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53);\n\tconst rhs = new Matrix4().set(59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131);\n\tconst ans = new Matrix4();\n\n\tans.multiplyMatrices(lhs, rhs);\n\n\tassert.ok(ans.elements[0] == 1585);\n\tassert.ok(ans.elements[1] == 5318);\n\tassert.ok(ans.elements[2] == 10514);\n\tassert.ok(ans.elements[3] == 15894);\n\tassert.ok(ans.elements[4] == 1655);\n\tassert.ok(ans.elements[5] == 5562);\n\tassert.ok(ans.elements[6] == 11006);\n\tassert.ok(ans.elements[7] == 16634);\n\tassert.ok(ans.elements[8] == 1787);\n\tassert.ok(ans.elements[9] == 5980);\n\tassert.ok(ans.elements[10] == 11840);\n\tassert.ok(ans.elements[11] == 17888);\n\tassert.ok(ans.elements[12] == 1861);\n\tassert.ok(ans.elements[13] == 6246);\n\tassert.ok(ans.elements[14] == 12378);\n\tassert.ok(ans.elements[15] == 18710);\n});\n\nQUnit.test('determinant', assert => {\n\tconst a = new Matrix4();\n\tassert.ok(a.determinant() == 1, 'Passed!');\n\n\ta.elements[0] = 2;\n\tassert.ok(a.determinant() == 2, 'Passed!');\n\n\ta.elements[0] = 0;\n\tassert.ok(a.determinant() == 0, 'Passed!');\n\n\ta.set(2, 3, 4, 5, -1, -21, -3, -4, 6, 7, 8, 10, -8, -9, -10, -12);\n\tassert.ok(a.determinant() == 76, 'Passed!');\n});\n\nQUnit.test('transpose', assert => {\n\tconst a = new Matrix4();\n\tlet b = a.clone().transpose();\n\tassert.ok(matrixEquals4(a, b), 'Passed!');\n\n\tb = new Matrix4().set(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15);\n\tconst c = b.clone().transpose();\n\tassert.ok(!matrixEquals4(b, c), 'Passed!');\n\tc.transpose();\n\tassert.ok(matrixEquals4(b, c), 'Passed!');\n});\n\nQUnit.test('setPosition', assert => {\n\tconst a = new Matrix4().set(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15);\n\tconst b = new Vector3(-1, -2, -3);\n\tconst c = new Matrix4().set(0, 1, 2, -1, 4, 5, 6, -2, 8, 9, 10, -3, 12, 13, 14, 15);\n\n\ta.setPosition(b);\n\tassert.ok(matrixEquals4(a, c), 'Passed!');\n\n\tconst d = new Matrix4().set(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15);\n\tconst e = new Matrix4().set(0, 1, 2, -1, 4, 5, 6, -2, 8, 9, 10, -3, 12, 13, 14, 15);\n\n\td.setPosition(-1, -2, -3);\n\tassert.ok(matrixEquals4(d, e), 'Passed!');\n});\n\nQUnit.todo('invert', assert => {\n\tassert.ok(false, 'everything\\'s gonna be alright');\n});\n\nQUnit.test('getMaxScaleOnAxis', assert => {\n\tconst a = new Matrix4().set(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16);\n\tconst expected = Math.sqrt(3 * 3 + 7 * 7 + 11 * 11);\n\n\tassert.ok(Math.abs(a.getMaxScaleOnAxis() - expected) <= eps, 'Check result');\n});\n\nQUnit.test('makeTranslation', assert => {\n\tconst a = new Matrix4();\n\tconst b = new Vector3(2, 3, 4);\n\tconst c = new Matrix4().set(1, 0, 0, 2, 0, 1, 0, 3, 0, 0, 1, 4, 0, 0, 0, 1);\n\n\ta.makeTranslation(b.x, b.y, b.z);\n\tassert.ok(matrixEquals4(a, c), 'Passed!');\n\n\ta.makeTranslation(b);\n\tassert.ok(matrixEquals4(a, c), 'Passed!');\n});\n\nQUnit.test('makeRotationAxis', assert => {\n\tconst axis = new Vector3(1.5, 0.0, 1.0).normalize();\n\tconst radians = 45 * (Math.PI / 180); // Convert degrees to radians\n\tconst a = new Matrix4().makeRotationAxis(axis, radians);\n\n\tconst expected = new Matrix4().set(\n\t\t0.9098790095958609, -0.39223227027636803, 0.13518148560620882, 0,\n\t\t0.39223227027636803, 0.7071067811865476, -0.588348405414552, 0,\n\t\t0.13518148560620882, 0.588348405414552, 0.7972277715906868, 0,\n\t\t0, 0, 0, 1\n\t);\n\n\tassert.ok(matrixEquals4(a, expected), 'Check numeric result');\n});\n\nQUnit.test('makeScale', assert => {\n\tconst a = new Matrix4();\n\tconst c = new Matrix4().set(2, 0, 0, 0, 0, 3, 0, 0, 0, 0, 4, 0, 0, 0, 0, 1);\n\n\ta.makeScale(2, 3, 4);\n\tassert.ok(matrixEquals4(a, c), 'Passed!');\n});\n\nQUnit.test('compose/decompose', assert => {\n\tconst tValues = [\n\t\tnew Vector3(),\n\t\tnew Vector3(3, 0, 0),\n\t\tnew Vector3(0, 4, 0),\n\t\tnew Vector3(0, 0, 5),\n\t\tnew Vector3(-6, 0, 0),\n\t\tnew Vector3(0, -7, 0),\n\t\tnew Vector3(0, 0, -8),\n\t\tnew Vector3(-2, 5, -9),\n\t\tnew Vector3(-2, -5, -9)\n\t];\n\n\tconst sValues = [\n\t\tnew Vector3(1, 1, 1),\n\t\tnew Vector3(2, 2, 2),\n\t\tnew Vector3(1, -1, 1),\n\t\tnew Vector3(-1, 1, 1),\n\t\tnew Vector3(1, 1, -1),\n\t\tnew Vector3(2, -2, 1),\n\t\tnew Vector3(-1, 2, -2),\n\t\tnew Vector3(-1, -1, -1),\n\t\tnew Vector3(-2, -2, -2)\n\t];\n\n\tconst rValues = [\n\t\tnew Quaternion(),\n\t\tnew Quaternion().setFromEuler(new Euler(1, 1, 0)),\n\t\tnew Quaternion().setFromEuler(new Euler(1, -1, 1)),\n\t\tnew Quaternion(0, 0.9238795292366128, 0, 0.38268342717215614)\n\t];\n\n\tfor (let ti = 0; ti < tValues.length; ti++) {\n\t\tfor (let si = 0; si < sValues.length; si++) {\n\t\t\tfor (let ri = 0; ri < rValues.length; ri++) {\n\t\t\t\tconst t = tValues[ti];\n\t\t\t\tconst s = sValues[si];\n\t\t\t\tconst r = rValues[ri];\n\n\t\t\t\tconst m = new Matrix4().compose(t, r, s);\n\t\t\t\tconst t2 = new Vector3();\n\t\t\t\tconst r2 = new Quaternion();\n\t\t\t\tconst s2 = new Vector3();\n\n\t\t\t\tm.decompose(t2, r2, s2);\n\n\t\t\t\tconst m2 = new Matrix4().compose(t2, r2, s2);\n\n\t\t\t\tassert.ok(matrixEquals4(m, m2), 'Passed!');\n\t\t\t}\n\t\t}\n\t}\n});\n\nQUnit.test('equals', assert => {\n\tconst a = new Matrix4().set(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16);\n\tconst b = new Matrix4().set(0, -1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16);\n\n\tassert.notOk(a.equals(b), 'Check that a does not equal b');\n\tassert.notOk(b.equals(a), 'Check that b does not equal a');\n\n\ta.copy(b);\n\tassert.ok(a.equals(b), 'Check that a equals b after copy()');\n\tassert.ok(b.equals(a), 'Check that b equals a after copy()');\n});\n\nQUnit.test('fromArray', assert => {\n\tconst a = new Matrix4();\n\tconst b = new Matrix4().set(1, 5, 9, 13, 2, 6, 10, 14, 3, 7, 11, 15, 4, 8, 12, 16);\n\n\ta.fromArray([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]);\n\tassert.ok(a.equals(b), 'Passed');\n});\n\nQUnit.test('toArray', assert => {\n\tconst a = new Matrix4().set(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16);\n\tconst noOffset = [1, 5, 9, 13, 2, 6, 10, 14, 3, 7, 11, 15, 4, 8, 12, 16];\n\tconst withOffset = [undefined, 1, 5, 9, 13, 2, 6, 10, 14, 3, 7, 11, 15, 4, 8, 12, 16];\n\n\tlet array = a.toArray();\n\tassert.deepEqual(array, noOffset, 'No array, no offset');\n\n\tarray = [];\n\ta.toArray(array);\n\tassert.deepEqual(array, noOffset, 'With array, no offset');\n\n\tarray = [];\n\ta.toArray(array, 1);\n\tassert.deepEqual(array, withOffset, 'With array, with offset');\n});"
  },
  {
    "path": "tests/unit/src/math/Plane.tests.js",
    "content": "import { Plane, Vector3 } from 't3d';\nimport { eps } from '../../utils/math-constants.js';\n\nQUnit.module('Plane');\n\nQUnit.test('intersectPlanes', assert => {\n\tconst p1 = new Plane(new Vector3(1, 0, 0), -1);\n\tconst p2 = new Plane(new Vector3(0, 1, 0), -1);\n\tconst p3 = new Plane(new Vector3(0, 0, 1), -1);\n\n\tconst point = Plane.intersectPlanes(p1, p2, p3, new Vector3());\n\n\tassert.ok(Math.abs(point.x - 1) <= eps, 'Passed!');\n\tassert.ok(Math.abs(point.y - 1) <= eps, 'Passed!');\n\tassert.ok(Math.abs(point.z - 1) <= eps, 'Passed!');\n});"
  },
  {
    "path": "tests/unit/src/math/Quaternion.tests.js",
    "content": "import { Quaternion, Vector3, Euler, Matrix4, Vector4 } from 't3d';\nimport { x, y, z, w, eps } from '../../utils/math-constants.js';\n\nQUnit.module('Quaternion');\n\nQUnit.test('constructor', assert => {\n\tlet a = new Quaternion();\n\tassert.ok(a.x == 0, 'Passed!');\n\tassert.ok(a.y == 0, 'Passed!');\n\tassert.ok(a.z == 0, 'Passed!');\n\tassert.ok(a.w == 1, 'Passed!');\n\n\ta = new Quaternion(x, y, z, w);\n\tassert.ok(a.x === x, 'Passed!');\n\tassert.ok(a.y === y, 'Passed!');\n\tassert.ok(a.z === z, 'Passed!');\n\tassert.ok(a.w === w, 'Passed!');\n});\n\nQUnit.test('slerp', assert => {\n\tslerpTestSkeleton(doSlerpObject, Number.EPSILON, assert);\n});\n\nQUnit.test('slerpFlat', assert => {\n\tslerpTestSkeleton(doSlerpArray, Number.EPSILON, assert);\n});\n\nQUnit.test('properties', assert => {\n\tassert.expect(8);\n\n\tconst a = new Quaternion();\n\ta.onChange(function() {\n\t\tassert.ok(true, 'onChange called');\n\t});\n\n\ta.x = x;\n\ta.y = y;\n\ta.z = z;\n\ta.w = w;\n\n\tassert.strictEqual(a.x, x, 'Check x');\n\tassert.strictEqual(a.y, y, 'Check y');\n\tassert.strictEqual(a.z, z, 'Check z');\n\tassert.strictEqual(a.w, w, 'Check w');\n});\n\nQUnit.test('x', assert => {\n\tlet a = new Quaternion();\n\tassert.ok(a.x === 0, 'Passed!');\n\n\ta = new Quaternion(1, 2, 3);\n\tassert.ok(a.x === 1, 'Passed!');\n\n\ta = new Quaternion(4, 5, 6, 1);\n\tassert.ok(a.x === 4, 'Passed!');\n\n\ta = new Quaternion(7, 8, 9);\n\ta.x = 10;\n\tassert.ok(a.x === 10, 'Passed!');\n\n\ta = new Quaternion(11, 12, 13);\n\tlet b = false;\n\ta.onChange(function() {\n\t\tb = true;\n\t});\n\tassert.ok(!b, 'Passed!');\n\ta.x = 14;\n\tassert.ok(b, 'Passed!');\n\tassert.ok(a.x === 14, 'Passed!');\n});\n\nQUnit.test('y', assert => {\n\tlet a = new Quaternion();\n\tassert.ok(a.y === 0, 'Passed!');\n\n\ta = new Quaternion(1, 2, 3);\n\tassert.ok(a.y === 2, 'Passed!');\n\n\ta = new Quaternion(4, 5, 6, 1);\n\tassert.ok(a.y === 5, 'Passed!');\n\n\ta = new Quaternion(7, 8, 9);\n\ta.y = 10;\n\tassert.ok(a.y === 10, 'Passed!');\n\n\ta = new Quaternion(11, 12, 13);\n\tlet b = false;\n\ta.onChange(function() {\n\t\tb = true;\n\t});\n\tassert.ok(!b, 'Passed!');\n\ta.y = 14;\n\tassert.ok(b, 'Passed!');\n\tassert.ok(a.y === 14, 'Passed!');\n});\n\nQUnit.test('z', assert => {\n\tlet a = new Quaternion();\n\tassert.ok(a.z === 0, 'Passed!');\n\n\ta = new Quaternion(1, 2, 3);\n\tassert.ok(a.z === 3, 'Passed!');\n\n\ta = new Quaternion(4, 5, 6, 1);\n\tassert.ok(a.z === 6, 'Passed!');\n\n\ta = new Quaternion(7, 8, 9);\n\ta.z = 10;\n\tassert.ok(a.z === 10, 'Passed!');\n\n\ta = new Quaternion(11, 12, 13);\n\tlet b = false;\n\ta.onChange(function() {\n\t\tb = true;\n\t});\n\tassert.ok(!b, 'Passed!');\n\ta.z = 14;\n\tassert.ok(b, 'Passed!');\n\tassert.ok(a.z === 14, 'Passed!');\n});\n\nQUnit.test('w', assert => {\n\tlet a = new Quaternion();\n\tassert.ok(a.w === 1, 'Passed!');\n\n\ta = new Quaternion(1, 2, 3);\n\tassert.ok(a.w === 1, 'Passed!');\n\n\ta = new Quaternion(4, 5, 6, 1);\n\tassert.ok(a.w === 1, 'Passed!');\n\n\ta = new Quaternion(7, 8, 9);\n\ta.w = 10;\n\tassert.ok(a.w === 10, 'Passed!');\n\n\ta = new Quaternion(11, 12, 13);\n\tlet b = false;\n\ta.onChange(function() {\n\t\tb = true;\n\t});\n\tassert.ok(!b, 'Passed!');\n\ta.w = 14;\n\tassert.ok(b, 'Passed!');\n\tassert.ok(a.w === 14, 'Passed!');\n});\n\nQUnit.test('isQuaternion', assert => {\n\tconst object = new Quaternion();\n\tassert.ok(object.isQuaternion, 'Quaternion.isQuaternion should be true');\n});\n\nQUnit.test('set', assert => {\n\tconst a = new Quaternion();\n\tassert.ok(a.x == 0, 'Passed!');\n\tassert.ok(a.y == 0, 'Passed!');\n\tassert.ok(a.z == 0, 'Passed!');\n\tassert.ok(a.w == 1, 'Passed!');\n\n\ta.set(x, y, z, w);\n\tassert.ok(a.x == x, 'Passed!');\n\tassert.ok(a.y == y, 'Passed!');\n\tassert.ok(a.z === z, 'Passed!');\n\tassert.ok(a.w === w, 'Passed!');\n});\n\nQUnit.test('clone', assert => {\n\tconst a = new Quaternion().clone();\n\tassert.ok(a.x == 0, 'Passed!');\n\tassert.ok(a.y == 0, 'Passed!');\n\tassert.ok(a.z == 0, 'Passed!');\n\tassert.ok(a.w == 1, 'Passed!');\n\n\tconst b = a.set(x, y, z, w).clone();\n\tassert.ok(b.x == x, 'Passed!');\n\tassert.ok(b.y == y, 'Passed!');\n\tassert.ok(b.z === z, 'Passed!');\n\tassert.ok(b.w === w, 'Passed!');\n});\n\nQUnit.test('copy', assert => {\n\tconst a = new Quaternion(x, y, z, w);\n\tconst b = new Quaternion().copy(a);\n\tassert.ok(b.x == x, 'Passed!');\n\tassert.ok(b.y == y, 'Passed!');\n\tassert.ok(b.z == z, 'Passed!');\n\tassert.ok(b.w == w, 'Passed!');\n\n\t// ensure that it is a true copy\n\ta.x = 0;\n\ta.y = -1;\n\ta.z = 0;\n\ta.w = -1;\n\tassert.ok(b.x == x, 'Passed!');\n\tassert.ok(b.y == y, 'Passed!');\n});\n\nQUnit.test('setFromEuler/setFromQuaternion', assert => {\n\tconst angles = [new Vector3(1, 0, 0), new Vector3(0, 1, 0), new Vector3(0, 0, 1)];\n\n\t// ensure euler conversion to/from Quaternion matches.\n\tfor (let i = 0; i < orders.length; i++) {\n\t\tfor (let j = 0; j < angles.length; j++) {\n\t\t\tconst eulers2 = new Euler().setFromQuaternion(new Quaternion().setFromEuler(new Euler(angles[j].x, angles[j].y, angles[j].z, orders[i])), orders[i]);\n\t\t\tconst newAngle = new Vector3(eulers2.x, eulers2.y, eulers2.z);\n\t\t\tassert.ok(newAngle.distanceTo(angles[j]) < 0.001, 'Passed!');\n\t\t}\n\t}\n});\n\nQUnit.test('setFromAxisAngle', assert => {\n\t// TODO: find cases to validate.\n\t// assert.ok( true, \"Passed!\" );\n\n\tconst zero = new Quaternion();\n\n\tlet a = new Quaternion().setFromAxisAngle(new Vector3(1, 0, 0), 0);\n\tassert.ok(a.equals(zero), 'Passed!');\n\ta = new Quaternion().setFromAxisAngle(new Vector3(0, 1, 0), 0);\n\tassert.ok(a.equals(zero), 'Passed!');\n\ta = new Quaternion().setFromAxisAngle(new Vector3(0, 0, 1), 0);\n\tassert.ok(a.equals(zero), 'Passed!');\n\n\tconst b1 = new Quaternion().setFromAxisAngle(new Vector3(1, 0, 0), Math.PI);\n\tassert.ok(!a.equals(b1), 'Passed!');\n\tconst b2 = new Quaternion().setFromAxisAngle(new Vector3(1, 0, 0), -Math.PI);\n\tassert.ok(!a.equals(b2), 'Passed!');\n\n\tb1.multiply(b2);\n\tassert.ok(a.equals(b1), 'Passed!');\n});\n\nQUnit.test('setFromEuler/setFromRotationMatrix', assert => {\n\t// ensure euler conversion for Quaternion matches that of Matrix4\n\tfor (let i = 0; i < orders.length; i++) {\n\t\tconst q = new Quaternion().setFromEuler(changeEulerOrder(eulerAngles, orders[i]));\n\t\tconst m = new Matrix4().makeRotationFromEuler(changeEulerOrder(eulerAngles, orders[i]));\n\t\tconst q2 = new Quaternion().setFromRotationMatrix(m);\n\n\t\tassert.ok(qSub(q, q2).length() < 0.001, 'Passed!');\n\t}\n});\n\nQUnit.test('setFromRotationMatrix', assert => {\n\t// contrived examples purely to please the god of code coverage...\n\t// match conditions in various 'else [if]' blocks\n\n\tconst a = new Quaternion();\n\tlet q = new Quaternion(-9, -2, 3, -4).normalize();\n\tconst m = new Matrix4().makeRotationFromQuaternion(q);\n\tlet expected = new Vector4(0.8581163303210332, 0.19069251784911848, -0.2860387767736777, 0.38138503569823695);\n\n\ta.setFromRotationMatrix(m);\n\tassert.ok(Math.abs(a.x - expected.x) <= eps, 'm11 > m22 && m11 > m33: check x');\n\tassert.ok(Math.abs(a.y - expected.y) <= eps, 'm11 > m22 && m11 > m33: check y');\n\tassert.ok(Math.abs(a.z - expected.z) <= eps, 'm11 > m22 && m11 > m33: check z');\n\tassert.ok(Math.abs(a.w - expected.w) <= eps, 'm11 > m22 && m11 > m33: check w');\n\n\tq = new Quaternion(-1, -2, 1, -1).normalize();\n\tm.makeRotationFromQuaternion(q);\n\texpected = new Vector4(0.37796447300922714, 0.7559289460184544, -0.37796447300922714, 0.37796447300922714);\n\n\ta.setFromRotationMatrix(m);\n\tassert.ok(Math.abs(a.x - expected.x) <= eps, 'm22 > m33: check x');\n\tassert.ok(Math.abs(a.y - expected.y) <= eps, 'm22 > m33: check y');\n\tassert.ok(Math.abs(a.z - expected.z) <= eps, 'm22 > m33: check z');\n\tassert.ok(Math.abs(a.w - expected.w) <= eps, 'm22 > m33: check w');\n});\n\nQUnit.test('setFromUnitVectors', assert => {\n\tconst a = new Quaternion();\n\tconst b = new Vector3(1, 0, 0);\n\tconst c = new Vector3(0, 1, 0);\n\tconst expected = new Quaternion(0, 0, Math.sqrt(2) / 2, Math.sqrt(2) / 2);\n\n\ta.setFromUnitVectors(b, c);\n\tassert.ok(Math.abs(a.x - expected.x) <= eps, 'Check x');\n\tassert.ok(Math.abs(a.y - expected.y) <= eps, 'Check y');\n\tassert.ok(Math.abs(a.z - expected.z) <= eps, 'Check z');\n\tassert.ok(Math.abs(a.w - expected.w) <= eps, 'Check w');\n});\n\nQUnit.test('angleTo', assert => {\n\tconst a = new Quaternion();\n\tconst b = new Quaternion().setFromEuler(new Euler(0, Math.PI, 0));\n\tconst c = new Quaternion().setFromEuler(new Euler(0, Math.PI * 2, 0));\n\n\tassert.ok(a.angleTo(a) === 0, 'Passed!');\n\tassert.ok(a.angleTo(b) === Math.PI, 'Passed!');\n\tassert.ok(a.angleTo(c) === 0, 'Passed!');\n});\n\nQUnit.test('identity', assert => {\n\tconst a = new Quaternion();\n\n\ta.set(x, y, z, w);\n\ta.identity();\n\n\tassert.ok(a.x == 0, 'Passed!');\n\tassert.ok(a.y == 0, 'Passed!');\n\tassert.ok(a.z === 0, 'Passed!');\n\tassert.ok(a.w === 1, 'Passed!');\n});\n\nQUnit.test('conjugate', assert => {\n\tconst a = new Quaternion(x, y, z, w);\n\n\t// TODO: add better validation here.\n\n\tconst b = a.clone().conjugate();\n\n\tassert.ok(a.x == -b.x, 'Passed!');\n\tassert.ok(a.y == -b.y, 'Passed!');\n\tassert.ok(a.z == -b.z, 'Passed!');\n\tassert.ok(a.w == b.w, 'Passed!');\n});\n\nQUnit.test('dot', assert => {\n\tlet a = new Quaternion();\n\tlet b = new Quaternion();\n\n\tassert.ok(a.dot(b) === 1, 'Passed!');\n\ta = new Quaternion(1, 2, 3, 1);\n\tb = new Quaternion(3, 2, 1, 1);\n\n\tassert.ok(a.dot(b) === 11, 'Passed!');\n});\n\nQUnit.test('normalize/length/lengthSq', assert => {\n\tconst a = new Quaternion(x, y, z, w);\n\n\tassert.ok(a.length() != 1, 'Passed!');\n\tassert.ok(a.lengthSq() != 1, 'Passed!');\n\ta.normalize();\n\tassert.ok(a.length() == 1, 'Passed!');\n\tassert.ok(a.lengthSq() == 1, 'Passed!');\n\n\ta.set(0, 0, 0, 0);\n\tassert.ok(a.lengthSq() == 0, 'Passed!');\n\tassert.ok(a.length() == 0, 'Passed!');\n\ta.normalize();\n\tassert.ok(a.lengthSq() == 1, 'Passed!');\n\tassert.ok(a.length() == 1, 'Passed!');\n});\n\nQUnit.test('multiplyQuaternions/multiply', assert => {\n\tconst angles = [new Euler(1, 0, 0), new Euler(0, 1, 0), new Euler(0, 0, 1)];\n\n\tconst q1 = new Quaternion().setFromEuler(changeEulerOrder(angles[0], 'XYZ'));\n\tconst q2 = new Quaternion().setFromEuler(changeEulerOrder(angles[1], 'XYZ'));\n\tconst q3 = new Quaternion().setFromEuler(changeEulerOrder(angles[2], 'XYZ'));\n\n\tconst q = new Quaternion().multiplyQuaternions(q1, q2).multiply(q3);\n\n\tconst m1 = new Matrix4().makeRotationFromEuler(changeEulerOrder(angles[0], 'XYZ'));\n\tconst m2 = new Matrix4().makeRotationFromEuler(changeEulerOrder(angles[1], 'XYZ'));\n\tconst m3 = new Matrix4().makeRotationFromEuler(changeEulerOrder(angles[2], 'XYZ'));\n\n\tconst m = new Matrix4().multiplyMatrices(m1, m2).multiply(m3);\n\n\tconst qFromM = new Quaternion().setFromRotationMatrix(m);\n\n\tassert.ok(qSub(q, qFromM).length() < 0.001, 'Passed!');\n});\n\nQUnit.test('premultiply', assert => {\n\tconst a = new Quaternion(x, y, z, w);\n\tconst b = new Quaternion(2 * x, -y, -2 * z, w);\n\tconst expected = new Quaternion(42, -32, -2, 58);\n\n\ta.premultiply(b);\n\tassert.ok(Math.abs(a.x - expected.x) <= eps, 'Check x');\n\tassert.ok(Math.abs(a.y - expected.y) <= eps, 'Check y');\n\tassert.ok(Math.abs(a.z - expected.z) <= eps, 'Check z');\n\tassert.ok(Math.abs(a.w - expected.w) <= eps, 'Check w');\n});\n\nQUnit.test('slerp', assert => {\n\tconst a = new Quaternion(x, y, z, w);\n\tconst b = new Quaternion(-x, -y, -z, -w);\n\n\tconst c = a.clone().slerp(b, 0);\n\tconst d = a.clone().slerp(b, 1);\n\n\tassert.ok(a.equals(c), 'Passed');\n\tassert.ok(b.equals(d), 'Passed');\n\n\n\tconst D = Math.SQRT1_2;\n\n\tconst e = new Quaternion(1, 0, 0, 0);\n\tconst f = new Quaternion(0, 0, 1, 0);\n\tlet expected = new Quaternion(D, 0, D, 0);\n\tlet result = e.clone().slerp(f, 0.5);\n\tassert.ok(Math.abs(result.x - expected.x) <= eps, 'Check x');\n\tassert.ok(Math.abs(result.y - expected.y) <= eps, 'Check y');\n\tassert.ok(Math.abs(result.z - expected.z) <= eps, 'Check z');\n\tassert.ok(Math.abs(result.w - expected.w) <= eps, 'Check w');\n\n\n\tconst g = new Quaternion(0, D, 0, D);\n\tconst h = new Quaternion(0, -D, 0, D);\n\texpected = new Quaternion(0, 0, 0, 1);\n\tresult = g.clone().slerp(h, 0.5);\n\n\tassert.ok(Math.abs(result.x - expected.x) <= eps, 'Check x');\n\tassert.ok(Math.abs(result.y - expected.y) <= eps, 'Check y');\n\tassert.ok(Math.abs(result.z - expected.z) <= eps, 'Check z');\n\tassert.ok(Math.abs(result.w - expected.w) <= eps, 'Check w');\n});\n\nQUnit.test('slerpQuaternions', assert => {\n\tconst e = new Quaternion(1, 0, 0, 0);\n\tconst f = new Quaternion(0, 0, 1, 0);\n\tconst expected = new Quaternion(Math.SQRT1_2, 0, Math.SQRT1_2, 0);\n\n\tconst a = new Quaternion();\n\ta.slerpQuaternions(e, f, 0.5);\n\n\tassert.ok(Math.abs(a.x - expected.x) <= eps, 'Check x');\n\tassert.ok(Math.abs(a.y - expected.y) <= eps, 'Check y');\n\tassert.ok(Math.abs(a.z - expected.z) <= eps, 'Check z');\n\tassert.ok(Math.abs(a.w - expected.w) <= eps, 'Check w');\n});\n\nQUnit.test('equals', assert => {\n\tconst a = new Quaternion(x, y, z, w);\n\tconst b = new Quaternion(-x, -y, -z, -w);\n\n\tassert.ok(a.x != b.x, 'Passed!');\n\tassert.ok(a.y != b.y, 'Passed!');\n\n\tassert.ok(!a.equals(b), 'Passed!');\n\tassert.ok(!b.equals(a), 'Passed!');\n\n\ta.copy(b);\n\tassert.ok(a.x == b.x, 'Passed!');\n\tassert.ok(a.y == b.y, 'Passed!');\n\n\tassert.ok(a.equals(b), 'Passed!');\n\tassert.ok(b.equals(a), 'Passed!');\n});\n\nQUnit.test('fromArray', assert => {\n\tconst a = new Quaternion();\n\ta.fromArray([x, y, z, w]);\n\tassert.ok(a.x == x, 'Passed!');\n\tassert.ok(a.y == y, 'Passed!');\n\tassert.ok(a.z === z, 'Passed!');\n\tassert.ok(a.w === w, 'Passed!');\n\n\ta.fromArray([undefined, x, y, z, w, undefined], 1);\n\tassert.ok(a.x == x, 'Passed!');\n\tassert.ok(a.y == y, 'Passed!');\n\tassert.ok(a.z === z, 'Passed!');\n\tassert.ok(a.w === w, 'Passed!');\n});\n\nQUnit.test('toArray', assert => {\n\tconst a = new Quaternion(x, y, z, w);\n\n\tlet array = a.toArray();\n\tassert.strictEqual(array[0], x, 'No array, no offset: check x');\n\tassert.strictEqual(array[1], y, 'No array, no offset: check y');\n\tassert.strictEqual(array[2], z, 'No array, no offset: check z');\n\tassert.strictEqual(array[3], w, 'No array, no offset: check w');\n\n\tarray = [];\n\ta.toArray(array);\n\tassert.strictEqual(array[0], x, 'With array, no offset: check x');\n\tassert.strictEqual(array[1], y, 'With array, no offset: check y');\n\tassert.strictEqual(array[2], z, 'With array, no offset: check z');\n\tassert.strictEqual(array[3], w, 'With array, no offset: check w');\n\n\tarray = [];\n\ta.toArray(array, 1);\n\tassert.strictEqual(array[0], undefined, 'With array and offset: check [0]');\n\tassert.strictEqual(array[1], x, 'With array and offset: check x');\n\tassert.strictEqual(array[2], y, 'With array and offset: check y');\n\tassert.strictEqual(array[3], z, 'With array and offset: check z');\n\tassert.strictEqual(array[4], w, 'With array and offset: check w');\n});\n\nQUnit.test('onChange', assert => {\n\tlet b = false;\n\tconst f = function() {\n\t\tb = true;\n\t};\n\n\tconst a = new Quaternion(11, 12, 13, 1);\n\ta.onChange(f);\n\tassert.ok(a.onChangeCallback === f, 'Passed!');\n\n\ta.onChangeCallback();\n\tassert.ok(b, 'Passed!');\n});\n\nQUnit.test('onChangeCallback', assert => {\n\tlet b = false;\n\tconst a = new Quaternion(11, 12, 13, 1);\n\tconst f = function() {\n\t\tb = true;\n\t\tassert.ok(a === this, 'Passed!');\n\t};\n\n\ta.onChangeCallback = f;\n\tassert.ok(a.onChangeCallback === f, 'Passed!');\n\n\n\ta.onChangeCallback();\n\tassert.ok(b, 'Passed!');\n});\n\nQUnit.test('iterable', assert => {\n\tconst q = new Quaternion(0, 0.5, 0.7, 1);\n\tconst array = [...q];\n\tassert.strictEqual(array[0], 0, 'Quaternion is iterable.');\n\tassert.strictEqual(array[1], 0.5, 'Quaternion is iterable.');\n\tassert.strictEqual(array[2], 0.7, 'Quaternion is iterable.');\n\tassert.strictEqual(array[3], 1, 'Quaternion is iterable.');\n});\n\nconst orders = ['XYZ', 'YXZ', 'ZXY', 'ZYX', 'YZX', 'XZY'];\nconst eulerAngles = new Euler(0.1, -0.3, 0.25);\n\nfunction qSub(a, b) {\n\tconst result = new Quaternion();\n\tresult.copy(a);\n\n\tresult.x -= b.x;\n\tresult.y -= b.y;\n\tresult.z -= b.z;\n\tresult.w -= b.w;\n\n\treturn result;\n}\n\nfunction doSlerpObject(aArr, bArr, t) {\n\tconst a = new Quaternion().fromArray(aArr),\n\t\tb = new Quaternion().fromArray(bArr),\n\t\tc = new Quaternion().fromArray(aArr);\n\n\tc.slerp(b, t);\n\n\treturn {\n\n\t\tequals: function(x, y, z, w, maxError) {\n\t\t\tif (maxError === undefined) maxError = Number.EPSILON;\n\n\t\t\treturn Math.abs(x - c.x) <= maxError &&\n\t\t\t\tMath.abs(y - c.y) <= maxError &&\n\t\t\t\tMath.abs(z - c.z) <= maxError &&\n\t\t\t\tMath.abs(w - c.w) <= maxError;\n\t\t},\n\n\t\tlength: c.length(),\n\n\t\tdotA: c.dot(a),\n\t\tdotB: c.dot(b)\n\n\t};\n}\n\nfunction doSlerpArray(a, b, t) {\n\tconst result = [0, 0, 0, 0];\n\n\tQuaternion.slerpFlat(result, 0, a, 0, b, 0, t);\n\n\tfunction arrDot(a, b) {\n\t\treturn a[0] * b[0] + a[1] * b[1] +\n\t\t\ta[2] * b[2] + a[3] * b[3];\n\t}\n\n\treturn {\n\n\t\tequals: function(x, y, z, w, maxError) {\n\t\t\tif (maxError === undefined) maxError = Number.EPSILON;\n\n\t\t\treturn Math.abs(x - result[0]) <= maxError &&\n\t\t\t\tMath.abs(y - result[1]) <= maxError &&\n\t\t\t\tMath.abs(z - result[2]) <= maxError &&\n\t\t\t\tMath.abs(w - result[3]) <= maxError;\n\t\t},\n\n\t\tlength: Math.sqrt(arrDot(result, result)),\n\n\t\tdotA: arrDot(result, a),\n\t\tdotB: arrDot(result, b)\n\n\t};\n}\n\nfunction slerpTestSkeleton(doSlerp, maxError, assert) {\n\tlet result;\n\n\tconst a = [\n\t\t0.6753410084407496,\n\t\t0.4087830051091744,\n\t\t0.32856700410659473,\n\t\t0.5185120064806223\n\t];\n\n\tconst b = [\n\t\t0.6602792107657797,\n\t\t0.43647413932562285,\n\t\t0.35119011210236006,\n\t\t0.5001871596632682\n\t];\n\n\tlet maxNormError = 0;\n\n\tfunction isNormal(result) {\n\t\tconst normError = Math.abs(1 - result.length);\n\t\tmaxNormError = Math.max(maxNormError, normError);\n\t\treturn normError <= maxError;\n\t}\n\n\tresult = doSlerp(a, b, 0);\n\tassert.ok(result.equals(\n\t\ta[0], a[1], a[2], a[3], 0), 'Exactly A @ t = 0');\n\n\tresult = doSlerp(a, b, 1);\n\tassert.ok(result.equals(\n\t\tb[0], b[1], b[2], b[3], 0), 'Exactly B @ t = 1');\n\n\tresult = doSlerp(a, b, 0.5);\n\tassert.ok(Math.abs(result.dotA - result.dotB) <= Number.EPSILON, 'Symmetry at 0.5');\n\tassert.ok(isNormal(result), 'Approximately normal (at 0.5)');\n\n\tresult = doSlerp(a, b, 0.25);\n\tassert.ok(result.dotA > result.dotB, 'Interpolating at 0.25');\n\tassert.ok(isNormal(result), 'Approximately normal (at 0.25)');\n\n\tresult = doSlerp(a, b, 0.75);\n\tassert.ok(result.dotA < result.dotB, 'Interpolating at 0.75');\n\tassert.ok(isNormal(result), 'Approximately normal (at 0.75)');\n\n\tconst D = Math.SQRT1_2;\n\n\tresult = doSlerp([1, 0, 0, 0], [0, 0, 1, 0], 0.5);\n\tassert.ok(result.equals(D, 0, D, 0), 'X/Z diagonal from axes');\n\tassert.ok(isNormal(result), 'Approximately normal (X/Z diagonal)');\n\n\tresult = doSlerp([0, D, 0, D], [0, -D, 0, D], 0.5);\n\tassert.ok(result.equals(0, 0, 0, 1), 'W-Unit from diagonals');\n\tassert.ok(isNormal(result), 'Approximately normal (W-Unit)');\n}\n\nfunction changeEulerOrder(euler, order) {\n\treturn new Euler(euler.x, euler.y, euler.z, order);\n}"
  },
  {
    "path": "tests/unit/src/math/Ray.tests.js",
    "content": "import { Ray, Vector3, Plane, Sphere, Box3 } from 't3d';\nimport { zero3,\n\tone3,\n\ttwo3,\n\teps,\n\tposInf3\n} from '../../utils/math-constants.js';\n\nQUnit.module('Ray');\n\nQUnit.test('Instancing', assert => {\n\tlet a = new Ray();\n\tassert.ok(a.origin.equals(zero3), 'Passed!');\n\tassert.ok(a.direction.equals(new Vector3(0, 0, -1)), 'Passed!');\n\n\ta = new Ray(two3.clone(), one3.clone());\n\tassert.ok(a.origin.equals(two3), 'Passed!');\n\tassert.ok(a.direction.equals(one3), 'Passed!');\n});\n\nQUnit.test('set', assert => {\n\tconst a = new Ray();\n\n\ta.set(one3, one3);\n\tassert.ok(a.origin.equals(one3), 'Passed!');\n\tassert.ok(a.direction.equals(one3), 'Passed!');\n});\n\nQUnit.test('recast/clone', assert => {\n\tconst a = new Ray(one3.clone(), new Vector3(0, 0, 1));\n\n\tassert.ok(a.recast(0).equals(a), 'Passed!');\n\n\tconst b = a.clone();\n\tassert.ok(b.recast(-1).equals(new Ray(new Vector3(1, 1, 0), new Vector3(0, 0, 1))), 'Passed!');\n\n\tconst c = a.clone();\n\tassert.ok(c.recast(1).equals(new Ray(new Vector3(1, 1, 2), new Vector3(0, 0, 1))), 'Passed!');\n\n\tconst d = a.clone();\n\tconst e = d.clone().recast(1);\n\tassert.ok(d.equals(a), 'Passed!');\n\tassert.ok(!e.equals(d), 'Passed!');\n\tassert.ok(e.equals(c), 'Passed!');\n});\n\nQUnit.test('copy/equals', assert => {\n\tconst a = new Ray(zero3.clone(), one3.clone());\n\tconst b = new Ray().copy(a);\n\tassert.ok(b.origin.equals(zero3), 'Passed!');\n\tassert.ok(b.direction.equals(one3), 'Passed!');\n\n\t// ensure that it is a true copy\n\ta.origin = zero3;\n\ta.direction = one3;\n\tassert.ok(b.origin.equals(zero3), 'Passed!');\n\tassert.ok(b.direction.equals(one3), 'Passed!');\n});\n\nQUnit.test('at', assert => {\n\tconst a = new Ray(one3.clone(), new Vector3(0, 0, 1));\n\tconst point = new Vector3();\n\n\ta.at(0, point);\n\tassert.ok(point.equals(one3), 'Passed!');\n\ta.at(-1, point);\n\tassert.ok(point.equals(new Vector3(1, 1, 0)), 'Passed!');\n\ta.at(1, point);\n\tassert.ok(point.equals(new Vector3(1, 1, 2)), 'Passed!');\n});\n\nQUnit.test('closestPointToPoint', assert => {\n\tconst a = new Ray(one3.clone(), new Vector3(0, 0, 1));\n\tconst point = new Vector3();\n\n\t// behind the ray\n\ta.closestPointToPoint(zero3, point);\n\tassert.ok(point.equals(one3), 'Passed!');\n\n\t// front of the ray\n\ta.closestPointToPoint(new Vector3(0, 0, 50), point);\n\tassert.ok(point.equals(new Vector3(1, 1, 50)), 'Passed!');\n\n\t// exactly on the ray\n\ta.closestPointToPoint(one3, point);\n\tassert.ok(point.equals(one3), 'Passed!');\n});\n\nQUnit.test('distanceToPoint', assert => {\n\tconst a = new Ray(one3.clone(), new Vector3(0, 0, 1));\n\n\t// behind the ray\n\tconst b = a.distanceToPoint(zero3);\n\tassert.ok(b === Math.sqrt(3), 'Passed!');\n\n\t// front of the ray\n\tconst c = a.distanceToPoint(new Vector3(0, 0, 50));\n\tassert.ok(c === Math.sqrt(2), 'Passed!');\n\n\t// exactly on the ray\n\tconst d = a.distanceToPoint(one3);\n\tassert.ok(d === 0, 'Passed!');\n});\n\nQUnit.test('distanceSqToPoint', assert => {\n\tconst a = new Ray(one3.clone(), new Vector3(0, 0, 1));\n\n\t// behind the ray\n\tconst b = a.distanceSqToPoint(zero3);\n\tassert.ok(b === 3, 'Passed!');\n\n\t// front of the ray\n\tconst c = a.distanceSqToPoint(new Vector3(0, 0, 50));\n\tassert.ok(c === 2, 'Passed!');\n\n\t// exactly on the ray\n\tconst d = a.distanceSqToPoint(one3);\n\tassert.ok(d === 0, 'Passed!');\n});\n\nQUnit.test('intersectSphere', assert => {\n\tconst TOL = 0.0001;\n\tconst point = new Vector3();\n\n\t// ray a0 origin located at ( 0, 0, 0 ) and points outward in negative-z direction\n\tconst a0 = new Ray(zero3.clone(), new Vector3(0, 0, -1));\n\t// ray a1 origin located at ( 1, 1, 1 ) and points left in negative-x direction\n\tconst a1 = new Ray(one3.clone(), new Vector3(-1, 0, 0));\n\n\t// sphere (radius of 2) located behind ray a0, should result in null\n\tlet b = new Sphere(new Vector3(0, 0, 3), 2);\n\ta0.intersectSphere(b, point.copy(posInf3));\n\tassert.ok(point.equals(posInf3), 'Passed!');\n\n\t// sphere (radius of 2) located in front of, but too far right of ray a0, should result in null\n\tb = new Sphere(new Vector3(3, 0, -1), 2);\n\ta0.intersectSphere(b, point.copy(posInf3));\n\tassert.ok(point.equals(posInf3), 'Passed!');\n\n\t// sphere (radius of 2) located below ray a1, should result in null\n\tb = new Sphere(new Vector3(1, -2, 1), 2);\n\ta1.intersectSphere(b, point.copy(posInf3));\n\tassert.ok(point.equals(posInf3), 'Passed!');\n\n\t// sphere (radius of 1) located to the left of ray a1, should result in intersection at 0, 1, 1\n\tb = new Sphere(new Vector3(-1, 1, 1), 1);\n\ta1.intersectSphere(b, point);\n\tassert.ok(point.distanceTo(new Vector3(0, 1, 1)) < TOL, 'Passed!');\n\n\t// sphere (radius of 1) located in front of ray a0, should result in intersection at 0, 0, -1\n\tb = new Sphere(new Vector3(0, 0, -2), 1);\n\ta0.intersectSphere(b, point);\n\tassert.ok(point.distanceTo(new Vector3(0, 0, -1)) < TOL, 'Passed!');\n\n\t// sphere (radius of 2) located in front & right of ray a0, should result in intersection at 0, 0, -1, or left-most edge of sphere\n\tb = new Sphere(new Vector3(2, 0, -1), 2);\n\ta0.intersectSphere(b, point);\n\tassert.ok(point.distanceTo(new Vector3(0, 0, -1)) < TOL, 'Passed!');\n\n\t// same situation as above, but move the sphere a fraction more to the right, and ray a0 should now just miss\n\tb = new Sphere(new Vector3(2.01, 0, -1), 2);\n\ta0.intersectSphere(b, point.copy(posInf3));\n\tassert.ok(point.equals(posInf3), 'Passed!');\n\n\t// following QUnit.tests are for situations where the ray origin is inside the sphere\n\n\t// sphere (radius of 1) center located at ray a0 origin / sphere surrounds the ray origin, so the first intersect point 0, 0, 1,\n\t// is behind ray a0.  Therefore, second exit point on back of sphere will be returned: 0, 0, -1\n\t// thus keeping the intersection point always in front of the ray.\n\tb = new Sphere(zero3.clone(), 1);\n\ta0.intersectSphere(b, point);\n\tassert.ok(point.distanceTo(new Vector3(0, 0, -1)) < TOL, 'Passed!');\n\n\t// sphere (radius of 4) center located behind ray a0 origin / sphere surrounds the ray origin, so the first intersect point 0, 0, 5,\n\t// is behind ray a0.  Therefore, second exit point on back of sphere will be returned: 0, 0, -3\n\t// thus keeping the intersection point always in front of the ray.\n\tb = new Sphere(new Vector3(0, 0, 1), 4);\n\ta0.intersectSphere(b, point);\n\tassert.ok(point.distanceTo(new Vector3(0, 0, -3)) < TOL, 'Passed!');\n\n\t// sphere (radius of 4) center located in front of ray a0 origin / sphere surrounds the ray origin, so the first intersect point 0, 0, 3,\n\t// is behind ray a0.  Therefore, second exit point on back of sphere will be returned: 0, 0, -5\n\t// thus keeping the intersection point always in front of the ray.\n\tb = new Sphere(new Vector3(0, 0, -1), 4);\n\ta0.intersectSphere(b, point);\n\tassert.ok(point.distanceTo(new Vector3(0, 0, -5)) < TOL, 'Passed!');\n});\n\nQUnit.test('intersectsSphere', assert => {\n\tconst a = new Ray(one3.clone(), new Vector3(0, 0, 1));\n\tconst b = new Sphere(zero3, 0.5);\n\tconst c = new Sphere(zero3, 1.5);\n\tconst d = new Sphere(one3, 0.1);\n\tconst e = new Sphere(two3, 0.1);\n\tconst f = new Sphere(two3, 1);\n\n\tassert.ok(!a.intersectsSphere(b), 'Passed!');\n\tassert.ok(!a.intersectsSphere(c), 'Passed!');\n\tassert.ok(a.intersectsSphere(d), 'Passed!');\n\tassert.ok(!a.intersectsSphere(e), 'Passed!');\n\tassert.ok(!a.intersectsSphere(f), 'Passed!');\n});\n\nQUnit.todo('distanceToPlane', assert => {\n\tassert.ok(false, 'everything\\'s gonna be alright');\n});\n\nQUnit.test('intersectPlane', assert => {\n\tconst a = new Ray(one3.clone(), new Vector3(0, 0, 1));\n\tconst point = new Vector3();\n\n\t// parallel plane behind\n\tconst b = new Plane().setFromNormalAndCoplanarPoint(new Vector3(0, 0, 1), new Vector3(1, 1, -1));\n\ta.intersectPlane(b, point.copy(posInf3));\n\tassert.ok(point.equals(posInf3), 'Passed!');\n\n\t// parallel plane coincident with origin\n\tconst c = new Plane().setFromNormalAndCoplanarPoint(new Vector3(0, 0, 1), new Vector3(1, 1, 0));\n\ta.intersectPlane(c, point.copy(posInf3));\n\tassert.ok(point.equals(posInf3), 'Passed!');\n\n\t// parallel plane in front\n\tconst d = new Plane().setFromNormalAndCoplanarPoint(new Vector3(0, 0, 1), new Vector3(1, 1, 1));\n\ta.intersectPlane(d, point.copy(posInf3));\n\tassert.ok(point.equals(a.origin), 'Passed!');\n\n\t// perpendicular ray that overlaps exactly\n\tconst e = new Plane().setFromNormalAndCoplanarPoint(new Vector3(1, 0, 0), one3);\n\ta.intersectPlane(e, point.copy(posInf3));\n\tassert.ok(point.equals(a.origin), 'Passed!');\n\n\t// perpendicular ray that doesn't overlap\n\tconst f = new Plane().setFromNormalAndCoplanarPoint(new Vector3(1, 0, 0), zero3);\n\ta.intersectPlane(f, point.copy(posInf3));\n\tassert.ok(point.equals(posInf3), 'Passed!');\n});\n\nQUnit.test('intersectsPlane', assert => {\n\tconst a = new Ray(one3.clone(), new Vector3(0, 0, 1));\n\n\t// parallel plane in front of the ray\n\tconst b = new Plane().setFromNormalAndCoplanarPoint(new Vector3(0, 0, 1), one3.clone().sub(new Vector3(0, 0, -1)));\n\tassert.ok(a.intersectsPlane(b), 'Passed!');\n\n\t// parallel plane coincident with origin\n\tconst c = new Plane().setFromNormalAndCoplanarPoint(new Vector3(0, 0, 1), one3.clone().sub(new Vector3(0, 0, 0)));\n\tassert.ok(a.intersectsPlane(c), 'Passed!');\n\n\t// parallel plane behind the ray\n\tconst d = new Plane().setFromNormalAndCoplanarPoint(new Vector3(0, 0, 1), one3.clone().sub(new Vector3(0, 0, 1)));\n\tassert.ok(!a.intersectsPlane(d), 'Passed!');\n\n\t// perpendicular ray that overlaps exactly\n\tconst e = new Plane().setFromNormalAndCoplanarPoint(new Vector3(1, 0, 0), one3);\n\tassert.ok(a.intersectsPlane(e), 'Passed!');\n\n\t// perpendicular ray that doesn't overlap\n\tconst f = new Plane().setFromNormalAndCoplanarPoint(new Vector3(1, 0, 0), zero3);\n\tassert.ok(!a.intersectsPlane(f), 'Passed!');\n});\n\nQUnit.test('intersectBox', assert => {\n\tconst TOL = 0.0001;\n\n\tconst box = new Box3(new Vector3(-1, -1, -1), new Vector3(1, 1, 1));\n\tconst point = new Vector3();\n\n\tconst a = new Ray(new Vector3(-2, 0, 0), new Vector3(1, 0, 0));\n\t// ray should intersect box at -1,0,0\n\tassert.ok(a.intersectsBox(box) === true, 'Passed!');\n\ta.intersectBox(box, point);\n\tassert.ok(point.distanceTo(new Vector3(-1, 0, 0)) < TOL, 'Passed!');\n\n\tconst b = new Ray(new Vector3(-2, 0, 0), new Vector3(-1, 0, 0));\n\t// ray is point away from box, it should not intersect\n\tassert.ok(b.intersectsBox(box) === false, 'Passed!');\n\tb.intersectBox(box, point.copy(posInf3));\n\tassert.ok(point.equals(posInf3), 'Passed!');\n\n\tconst c = new Ray(new Vector3(0, 0, 0), new Vector3(1, 0, 0));\n\t// ray is inside box, should return exit point\n\tassert.ok(c.intersectsBox(box) === true, 'Passed!');\n\tc.intersectBox(box, point);\n\tassert.ok(point.distanceTo(new Vector3(1, 0, 0)) < TOL, 'Passed!');\n\n\tconst d = new Ray(new Vector3(0, 2, 1), new Vector3(0, -1, -1).normalize());\n\t// tilted ray should intersect box at 0,1,0\n\tassert.ok(d.intersectsBox(box) === true, 'Passed!');\n\td.intersectBox(box, point);\n\tassert.ok(point.distanceTo(new Vector3(0, 1, 0)) < TOL, 'Passed!');\n\n\tconst e = new Ray(new Vector3(1, -2, 1), new Vector3(0, 1, 0).normalize());\n\t// handle case where ray is coplanar with one of the boxes side - box in front of ray\n\tassert.ok(e.intersectsBox(box) === true, 'Passed!');\n\te.intersectBox(box, point);\n\tassert.ok(point.distanceTo(new Vector3(1, -1, 1)) < TOL, 'Passed!');\n\n\tconst f = new Ray(new Vector3(1, -2, 0), new Vector3(0, -1, 0).normalize());\n\t// handle case where ray is coplanar with one of the boxes side - box behind ray\n\tassert.ok(f.intersectsBox(box) === false, 'Passed!');\n\tf.intersectBox(box, point.copy(posInf3));\n\tassert.ok(point.equals(posInf3), 'Passed!');\n});\n\nQUnit.todo('intersectsBox', assert => {\n\tassert.ok(false, 'everything\\'s gonna be alright');\n});\n\nQUnit.test('intersectTriangle', assert => {\n\tconst ray = new Ray();\n\tconst a = new Vector3(1, 1, 0);\n\tconst b = new Vector3(0, 1, 1);\n\tconst c = new Vector3(1, 0, 1);\n\tconst point = new Vector3();\n\n\t// DdN == 0\n\tray.set(ray.origin, zero3.clone());\n\tray.intersectTriangle(a, b, c, false, point.copy(posInf3));\n\tassert.ok(point.equals(posInf3), 'No intersection if direction == zero');\n\n\t// DdN > 0, backfaceCulling = true\n\tray.set(ray.origin, one3.clone());\n\tray.intersectTriangle(a, b, c, true, point.copy(posInf3));\n\tassert.ok(point.equals(posInf3), 'No intersection with backside faces if backfaceCulling is true');\n\n\t// DdN > 0\n\tray.set(ray.origin, one3.clone());\n\tray.intersectTriangle(a, b, c, false, point);\n\tassert.ok(Math.abs(point.x - 2 / 3) <= eps, 'Successful intersection: check x');\n\tassert.ok(Math.abs(point.y - 2 / 3) <= eps, 'Successful intersection: check y');\n\tassert.ok(Math.abs(point.z - 2 / 3) <= eps, 'Successful intersection: check z');\n\n\t// DdN > 0, DdQxE2 < 0\n\tb.multiplyScalar(-1);\n\tray.intersectTriangle(a, b, c, false, point.copy(posInf3));\n\tassert.ok(point.equals(posInf3), 'No intersection');\n\n\t// DdN > 0, DdE1xQ < 0\n\ta.multiplyScalar(-1);\n\tray.intersectTriangle(a, b, c, false, point.copy(posInf3));\n\tassert.ok(point.equals(posInf3), 'No intersection');\n\n\t// DdN > 0, DdQxE2 + DdE1xQ > DdN\n\tb.multiplyScalar(-1);\n\tray.intersectTriangle(a, b, c, false, point.copy(posInf3));\n\tassert.ok(point.equals(posInf3), 'No intersection');\n\n\t// DdN < 0, QdN < 0\n\ta.multiplyScalar(-1);\n\tb.multiplyScalar(-1);\n\tray.direction.multiplyScalar(-1);\n\tray.intersectTriangle(a, b, c, false, point.copy(posInf3));\n\tassert.ok(point.equals(posInf3), 'No intersection when looking in the wrong direction');\n});\n\nQUnit.todo('applyMatrix4', assert => {\n\t assert.ok(false, 'everything\\'s gonna be alright');\n});"
  },
  {
    "path": "tests/unit/src/math/Sphere.tests.js",
    "content": "import { Sphere, Vector3, Matrix4, Box3 } from 't3d';\nimport { zero3, one3, two3, eps } from '../../utils/math-constants.js';\n\nQUnit.module('Sphere');\n\nQUnit.test('constructor', assert => {\n\tlet a = new Sphere();\n\tassert.ok(a.center.equals(zero3), 'Passed!');\n\tassert.ok(a.radius == -1, 'Passed!');\n\n\ta = new Sphere(one3.clone(), 1);\n\tassert.ok(a.center.equals(one3), 'Passed!');\n\tassert.ok(a.radius == 1, 'Passed!');\n});\n\nQUnit.test('set', assert => {\n\tconst a = new Sphere();\n\tassert.ok(a.center.equals(zero3), 'Passed!');\n\tassert.ok(a.radius == -1, 'Passed!');\n\n\ta.set(one3, 1);\n\tassert.ok(a.center.equals(one3), 'Passed!');\n\tassert.ok(a.radius == 1, 'Passed!');\n});\n\nQUnit.test('setFromArray', assert => {\n\tconst a = new Sphere();\n\tconst expectedCenter = new Vector3(0.9330126941204071, 0, 0);\n\tconst expectedRadius = 1.3676668773461689;\n\tconst array = [\n\t\t1, 1, 0, 1, 1, 0,\n\t\t1, 1, 0, 1, 1, 0,\n\t\t1, 1, 0, 0.8660253882408142, 0.5, 0,\n\t\t-0, 0.5, 0.8660253882408142, 1.8660253882408142, 0.5, 0,\n\t\t0, 0.5, -0.8660253882408142, 0.8660253882408142, 0.5, -0,\n\t\t0.8660253882408142, -0.5, 0, -0, -0.5, 0.8660253882408142,\n\t\t1.8660253882408142, -0.5, 0, 0, -0.5, -0.8660253882408142,\n\t\t0.8660253882408142, -0.5, -0, -0, -1, 0,\n\t\t-0, -1, 0, 0, -1, 0,\n\t\t0, -1, -0, -0, -1, -0\n\t];\n\n\ta.setFromArray(array);\n\tassert.ok(Math.abs(a.center.x - expectedCenter.x) <= eps, 'Default center: check center.x');\n\tassert.ok(Math.abs(a.center.y - expectedCenter.y) <= eps, 'Default center: check center.y');\n\tassert.ok(Math.abs(a.center.z - expectedCenter.z) <= eps, 'Default center: check center.z');\n\tassert.ok(Math.abs(a.radius - expectedRadius) <= eps, 'Default center: check radius');\n});\n\nQUnit.test('setFromPoints', assert => {\n\tconst a = new Sphere();\n\tconst points = [\n\t\tnew Vector3(1, 1, 1),\n\t\tnew Vector3(2, 2, 2),\n\t\tnew Vector3(-1, -1, -1)\n\t];\n\n\t// Setting from points with automatic center calculation\n\ta.setFromPoints(points);\n\tassert.ok(a.center.equals(new Vector3(0.5, 0.5, 0.5)), 'Auto-center: check center');\n\tassert.ok(Math.abs(a.radius - Math.sqrt(1.5 * 1.5 + 1.5 * 1.5 + 1.5 * 1.5)) <= eps, 'Auto-center: check radius');\n\tconsole.log(a.radius);\n\n\t// Setting from points with specified center\n\tconst center = new Vector3(0, 0, 0);\n\ta.setFromPoints(points, center);\n\tassert.ok(a.center.equals(center), 'Specified center: check center');\n\tassert.ok(Math.abs(a.radius - Math.sqrt(2 * 2 + 2 * 2 + 2 * 2)) <= eps, 'Specified center: check radius');\n\tconsole.log(a.radius);\n});\n\nQUnit.test('applyMatrix4', assert => {\n\tconst a = new Sphere(one3.clone(), 1);\n\tconst m = new Matrix4().makeTranslation(1, -2, 1);\n\tconst aabb1 = new Box3();\n\tconst aabb2 = new Box3();\n\n\ta.clone().applyMatrix4(m).getBoundingBox(aabb1);\n\ta.getBoundingBox(aabb2);\n\n\tassert.ok(aabb1.equals(aabb2.applyMatrix4(m)), 'Passed!');\n});\n\nQUnit.test('getBoundingBox', assert => {\n\tconst a = new Sphere(one3.clone(), 1);\n\tconst aabb = new Box3();\n\n\ta.getBoundingBox(aabb);\n\tassert.ok(aabb.equals(new Box3(zero3, two3)), 'Passed!');\n\n\ta.set(zero3, 0);\n\ta.getBoundingBox(aabb);\n\tassert.ok(aabb.equals(new Box3(zero3, zero3)), 'Passed!');\n\n\t// Empty sphere produces empty bounding box\n\ta.makeEmpty();\n\ta.getBoundingBox(aabb);\n\tassert.ok(aabb.isEmpty(), 'Passed!');\n});\n\nQUnit.test('isEmpty', assert => {\n\tconst a = new Sphere();\n\tassert.ok(a.isEmpty(), 'Passed!');\n\n\ta.set(one3, 1);\n\tassert.ok(!a.isEmpty(), 'Passed!');\n\n\t// Negative radius contains no points\n\ta.set(one3, -1);\n\tassert.ok(a.isEmpty(), 'Passed!');\n\n\t// Zero radius contains only the center point\n\ta.set(one3, 0);\n\tassert.ok(!a.isEmpty(), 'Passed!');\n});\n\nQUnit.test('makeEmpty', assert => {\n\tconst a = new Sphere(one3.clone(), 1);\n\tassert.ok(!a.isEmpty(), 'Passed!');\n\n\ta.makeEmpty();\n\tassert.ok(a.isEmpty(), 'Passed!');\n\tassert.ok(a.center.equals(zero3), 'Passed!');\n});\n\nQUnit.test('containsPoint', assert => {\n\tconst a = new Sphere(one3.clone(), 1);\n\n\t// Point inside the sphere\n\tassert.ok(a.containsPoint(new Vector3(1.5, 1, 1)), 'Inside point: Passed!');\n\n\t// Point on the surface of the sphere\n\tconst surfacePoint = new Vector3(1, 1, 2);\n\tassert.ok(a.containsPoint(surfacePoint), 'Surface point: Passed!');\n\n\t// Point outside the sphere\n\tassert.ok(!a.containsPoint(new Vector3(3, 1, 1)), 'Outside point: Passed!');\n\n\t// With an empty sphere\n\ta.makeEmpty();\n\tassert.ok(!a.containsPoint(one3), 'Empty sphere contains no points: Passed!');\n});\n\nQUnit.test('distanceToPoint', assert => {\n\tconst a = new Sphere(one3.clone(), 1);\n\n\t// Point inside the sphere\n\tassert.ok(a.distanceToPoint(one3) === -1, 'Center point distance: Passed!');\n\tassert.ok(a.distanceToPoint(new Vector3(1.5, 1, 1)) < 0, 'Inside point distance is negative: Passed!');\n\n\t// Point on the surface of the sphere\n\tconst surfacePoint = new Vector3(1, 1, 2);\n\tassert.ok(Math.abs(a.distanceToPoint(surfacePoint)) <= eps, 'Surface point distance is zero: Passed!');\n\n\t// Point outside the sphere\n\tconst outsidePoint = new Vector3(1, 1, 3);\n\tassert.ok(Math.abs(a.distanceToPoint(outsidePoint) - 1) <= eps, 'Outside point distance: Passed!');\n});\n\nQUnit.test('expandByPoint', assert => {\n\t// Starting with default sphere\n\tconst a = new Sphere();\n\n\t// Expand empty sphere by point\n\ta.expandByPoint(one3);\n\tassert.ok(a.center.equals(one3), 'First point becomes center: Passed!');\n\tassert.ok(a.radius === 0, 'Radius is 0 after first point: Passed!');\n\n\t// Expand by another point\n\ta.expandByPoint(new Vector3(3, 1, 1));\n\tassert.ok(Math.abs(a.radius - 1) <= eps, 'Radius updates correctly: Passed!');\n\tassert.ok(a.center.distanceTo(new Vector3(2, 1, 1)) <= eps, 'Center updates correctly: Passed!');\n\n\t// Test with third point inside existing sphere\n\ta.expandByPoint(new Vector3(1.5, 1, 1));\n\tassert.ok(Math.abs(a.radius - 1) <= eps, 'Radius unchanged for inside point: Passed!');\n});\n\nQUnit.test('union', assert => {\n\t// Test combining two non-empty spheres\n\tconst a = new Sphere(zero3.clone(), 1);\n\tconst b = new Sphere(new Vector3(2, 0, 0), 1);\n\n\ta.union(b);\n\tassert.ok(a.center.equals(new Vector3(1, 0, 0)), 'Union centers: Passed!');\n\tassert.ok(Math.abs(a.radius - 2) <= eps, 'Union radius: Passed!');\n\n\t// Test with an empty sphere\n\tconst c = new Sphere();\n\tconst d = new Sphere(one3.clone(), 1);\n\n\tc.union(d);\n\tassert.ok(c.center.equals(one3), 'Empty with non-empty center: Passed!');\n\tassert.ok(c.radius === 1, 'Empty with non-empty radius: Passed!');\n\n\t// Test with spheres having the same center\n\tconst e = new Sphere(one3.clone(), 1);\n\tconst f = new Sphere(one3.clone(), 2);\n\n\te.union(f);\n\tassert.ok(e.center.equals(one3), 'Same center result: Passed!');\n\tassert.ok(e.radius === 2, 'Same center takes larger radius: Passed!');\n});\n\nQUnit.test('clone', assert => {\n\tconst a = new Sphere(one3.clone(), 1);\n\tconst b = a.clone();\n\n\tassert.ok(a.center.equals(b.center), 'Clone center: Passed!');\n\tassert.ok(a.radius === b.radius, 'Clone radius: Passed!');\n\n\t// Verify it's a true copy\n\ta.center.x = 0;\n\ta.radius = 0;\n\tassert.ok(!a.center.equals(b.center), 'Original change doesn\\'t affect clone center: Passed!');\n\tassert.ok(a.radius !== b.radius, 'Original change doesn\\'t affect clone radius: Passed!');\n});\n\nQUnit.test('copy', assert => {\n\tconst a = new Sphere(one3.clone(), 1);\n\tconst b = new Sphere().copy(a);\n\n\tassert.ok(b.center.equals(one3), 'Passed!');\n\tassert.ok(b.radius == 1, 'Passed!');\n\n\t// ensure that it is a true copy\n\ta.center = zero3;\n\ta.radius = 0;\n\tassert.ok(b.center.equals(one3), 'Passed!');\n\tassert.ok(b.radius == 1, 'Passed!');\n});"
  },
  {
    "path": "tests/unit/src/math/Vector2.tests.js",
    "content": "import { Vector2 } from 't3d';\nimport { x, y } from '../../utils/math-constants.js';\n\nQUnit.module('Vector2');\n\nQUnit.test('fromArray', assert => {\n\tconst array = new Float32Array([1, 2]);\n\tconst a = new Vector2();\n\ta.fromArray(array, 0, true);\n\tassert.ok(a.x == 1, 'Passed!');\n\tassert.ok(a.y == 2, 'Passed!');\n});\n\nQUnit.test('toArray', assert => {\n\tconst array = new Float32Array(2);\n\tconst a = new Vector2(1, 2);\n\ta.toArray(array, 0, true);\n\tassert.ok(array[0] == 1, 'Passed!');\n\tassert.ok(array[1] == 2, 'Passed!');\n});\n\nQUnit.test('clone', assert => {\n\tconst a = new Vector2().clone();\n\tassert.ok(a.x == 0, 'Passed!');\n\tassert.ok(a.y == 0, 'Passed!');\n\n\tconst b = a.set(x, y).clone();\n\tassert.ok(b.x == x, 'Passed!');\n\tassert.ok(b.y == y, 'Passed!');\n});\n\nQUnit.test('iterable', assert => {\n\tconst v = new Vector2(0, 1);\n\tconst array = [...v];\n\tassert.strictEqual(array[0], 0, 'Vector2 is iterable.');\n\tassert.strictEqual(array[1], 1, 'Vector2 is iterable.');\n});"
  },
  {
    "path": "tests/unit/src/math/Vector3.tests.js",
    "content": "import { Vector3, Matrix3, Matrix4, Quaternion, Spherical } from 't3d';\nimport { x, y, z, eps } from '../../utils/math-constants.js';\n\nQUnit.module('Vector3');\n\nQUnit.test('Instancing', assert => {\n\tlet a = new Vector3();\n\tassert.ok(a.x == 0, 'Passed!');\n\tassert.ok(a.y == 0, 'Passed!');\n\tassert.ok(a.z == 0, 'Passed!');\n\n\ta = new Vector3(x, y, z);\n\tassert.ok(a.x === x, 'Passed!');\n\tassert.ok(a.y === y, 'Passed!');\n\tassert.ok(a.z === z, 'Passed!');\n});\n\nQUnit.test('set', assert => {\n\tconst a = new Vector3();\n\tassert.ok(a.x == 0, 'Passed!');\n\tassert.ok(a.y == 0, 'Passed!');\n\tassert.ok(a.z == 0, 'Passed!');\n\n\ta.set(x, y, z);\n\tassert.ok(a.x == x, 'Passed!');\n\tassert.ok(a.y == y, 'Passed!');\n\tassert.ok(a.z == z, 'Passed!');\n});\n\nQUnit.test('clone', assert => {\n\tconst a = new Vector3().clone();\n\tassert.ok(a.x == 0, 'Passed!');\n\tassert.ok(a.y == 0, 'Passed!');\n\tassert.ok(a.z == 0, 'Passed!');\n\n\tconst b = a.set(x, y, z).clone();\n\tassert.ok(b.x == x, 'Passed!');\n\tassert.ok(b.y == y, 'Passed!');\n\tassert.ok(b.z === z, 'Passed!');\n});\n\nQUnit.test('copy', assert => {\n\tconst a = new Vector3(x, y, z);\n\tconst b = new Vector3().copy(a);\n\tassert.ok(b.x == x, 'Passed!');\n\tassert.ok(b.y == y, 'Passed!');\n\tassert.ok(b.z == z, 'Passed!');\n\n\t// ensure that it is a true copy\n\ta.x = 0;\n\ta.y = -1;\n\ta.z = -2;\n\tassert.ok(b.x == x, 'Passed!');\n\tassert.ok(b.y == y, 'Passed!');\n\tassert.ok(b.z == z, 'Passed!');\n});\n\nQUnit.test('add', assert => {\n\tconst a = new Vector3(x, y, z);\n\tconst b = new Vector3(-x, -y, -z);\n\n\ta.add(b);\n\tassert.ok(a.x == 0, 'Passed!');\n\tassert.ok(a.y == 0, 'Passed!');\n\tassert.ok(a.z == 0, 'Passed!');\n\n\tconst c = new Vector3().addVectors(b, b);\n\tassert.ok(c.x == -2 * x, 'Passed!');\n\tassert.ok(c.y == -2 * y, 'Passed!');\n\tassert.ok(c.z == -2 * z, 'Passed!');\n});\n\nQUnit.todo('addVectors', assert => {\n\tassert.ok(false, 'everything\\'s gonna be alright');\n});\n\nQUnit.test('addScaledVector', assert => {\n\tconst a = new Vector3(x, y, z);\n\tconst b = new Vector3(2, 3, 4);\n\tconst s = 3;\n\n\ta.addScaledVector(b, s);\n\tassert.strictEqual(a.x, x + b.x * s, 'Check x');\n\tassert.strictEqual(a.y, y + b.y * s, 'Check y');\n\tassert.strictEqual(a.z, z + b.z * s, 'Check z');\n});\n\nQUnit.test('sub', assert => {\n\tconst a = new Vector3(x, y, z);\n\tconst b = new Vector3(-x, -y, -z);\n\n\ta.sub(b);\n\tassert.ok(a.x == 2 * x, 'Passed!');\n\tassert.ok(a.y == 2 * y, 'Passed!');\n\tassert.ok(a.z == 2 * z, 'Passed!');\n\n\tconst c = new Vector3().subVectors(a, a);\n\tassert.ok(c.x == 0, 'Passed!');\n\tassert.ok(c.y == 0, 'Passed!');\n\tassert.ok(c.z == 0, 'Passed!');\n});\n\nQUnit.todo('subVectors', assert => {\n\tassert.ok(false, 'everything\\'s gonna be alright');\n});\n\nQUnit.test('applyMatrix3', assert => {\n\tconst a = new Vector3(x, y, z);\n\tconst m = new Matrix3().set(2, 3, 5, 7, 11, 13, 17, 19, 23);\n\n\ta.applyMatrix3(m);\n\tassert.strictEqual(a.x, 33, 'Check x');\n\tassert.strictEqual(a.y, 99, 'Check y');\n\tassert.strictEqual(a.z, 183, 'Check z');\n});\n\nQUnit.todo('applyMatrix4', assert => {\n\t assert.ok(false, 'everything\\'s gonna be alright');\n});\n\nQUnit.test('applyQuaternion', assert => {\n\tconst a = new Vector3(x, y, z);\n\n\ta.applyQuaternion(new Quaternion());\n\tassert.strictEqual(a.x, x, 'Identity rotation: check x');\n\tassert.strictEqual(a.y, y, 'Identity rotation: check y');\n\tassert.strictEqual(a.z, z, 'Identity rotation: check z');\n});\n\nQUnit.todo('project', assert => {\n\tassert.ok(false, 'everything\\'s gonna be alright');\n});\n\nQUnit.todo('unproject', assert => {\n\tassert.ok(false, 'everything\\'s gonna be alright');\n});\n\nQUnit.test('transformDirection', assert => {\n\tconst a = new Vector3(x, y, z);\n\tconst m = new Matrix4();\n\tconst transformed = new Vector3(0.3713906763541037, 0.5570860145311556, 0.7427813527082074);\n\n\ta.transformDirection(m);\n\tassert.ok(Math.abs(a.x - transformed.x) <= eps, 'Check x');\n\tassert.ok(Math.abs(a.y - transformed.y) <= eps, 'Check y');\n\tassert.ok(Math.abs(a.z - transformed.z) <= eps, 'Check z');\n});\n\nQUnit.test('negate', assert => {\n\tconst a = new Vector3(x, y, z);\n\n\ta.negate();\n\tassert.ok(a.x == -x, 'Passed!');\n\tassert.ok(a.y == -y, 'Passed!');\n\tassert.ok(a.z == -z, 'Passed!');\n});\n\nQUnit.test('dot', assert => {\n\tconst a = new Vector3(x, y, z);\n\tconst b = new Vector3(-x, -y, -z);\n\tconst c = new Vector3();\n\n\tlet result = a.dot(b);\n\tassert.ok(result == (-x * x - y * y - z * z), 'Passed!');\n\n\tresult = a.dot(c);\n\tassert.ok(result == 0, 'Passed!');\n});\n\nQUnit.test('normalize', assert => {\n\tconst a = new Vector3(x, 0, 0);\n\tconst b = new Vector3(0, -y, 0);\n\tconst c = new Vector3(0, 0, z);\n\n\ta.normalize();\n\tassert.ok(a.getLength() == 1, 'Passed!');\n\tassert.ok(a.x == 1, 'Passed!');\n\n\tb.normalize();\n\tassert.ok(b.getLength() == 1, 'Passed!');\n\tassert.ok(b.y == -1, 'Passed!');\n\n\tc.normalize();\n\tassert.ok(c.getLength() == 1, 'Passed!');\n\tassert.ok(c.z == 1, 'Passed!');\n});\n\nQUnit.todo('lerpVectors', assert => {\n\tassert.ok(false, 'everything\\'s gonna be alright');\n});\n\nQUnit.test('cross', assert => {\n\tconst a = new Vector3(x, y, z);\n\tconst b = new Vector3(2 * x, -y, 0.5 * z);\n\tconst crossed = new Vector3(18, 12, -18);\n\n\ta.cross(b);\n\tassert.ok(Math.abs(a.x - crossed.x) <= eps, 'Check x');\n\tassert.ok(Math.abs(a.y - crossed.y) <= eps, 'Check y');\n\tassert.ok(Math.abs(a.z - crossed.z) <= eps, 'Check z');\n});\n\nQUnit.test('crossVectors', assert => {\n\tconst a = new Vector3(x, y, z);\n\tconst b = new Vector3(x, -y, z);\n\tconst c = new Vector3();\n\tconst crossed = new Vector3(24, 0, -12);\n\n\tc.crossVectors(a, b);\n\tassert.ok(Math.abs(c.x - crossed.x) <= eps, 'Check x');\n\tassert.ok(Math.abs(c.y - crossed.y) <= eps, 'Check y');\n\tassert.ok(Math.abs(c.z - crossed.z) <= eps, 'Check z');\n});\n\nQUnit.test('reflect', assert => {\n\tconst a = new Vector3();\n\tconst normal = new Vector3(0, 1, 0);\n\tconst b = new Vector3();\n\n\ta.set(0, -1, 0);\n\tassert.ok(b.copy(a).reflect(normal).equals(new Vector3(0, 1, 0)), 'Passed!');\n\n\ta.set(1, -1, 0);\n\tassert.ok(b.copy(a).reflect(normal).equals(new Vector3(1, 1, 0)), 'Passed!');\n\n\ta.set(1, -1, 0);\n\tnormal.set(0, -1, 0);\n\tassert.ok(b.copy(a).reflect(normal).equals(new Vector3(1, 1, 0)), 'Passed!');\n});\n\nQUnit.test('angleTo', assert => {\n\tconst a = new Vector3(0, -0.18851655680720186, 0.9820700116639124);\n\tconst b = new Vector3(0, 0.18851655680720186, -0.9820700116639124);\n\n\tassert.equal(a.angleTo(a), 0);\n\tassert.equal(a.angleTo(b), Math.PI);\n\n\tconst x = new Vector3(1, 0, 0);\n\tconst y = new Vector3(0, 1, 0);\n\tconst z = new Vector3(0, 0, 1);\n\n\tassert.equal(x.angleTo(y), Math.PI / 2);\n\tassert.equal(x.angleTo(z), Math.PI / 2);\n\tassert.equal(z.angleTo(x), Math.PI / 2);\n\n\tassert.ok(Math.abs(x.angleTo(new Vector3(1, 1, 0)) - (Math.PI / 4)) < 0.0000001);\n});\n\nQUnit.test('setFromSpherical', assert => {\n\tconst a = new Vector3();\n\tconst phi = Math.acos(-0.5);\n\tconst theta = Math.sqrt(Math.PI) * phi;\n\tconst sph = new Spherical(10, phi, theta);\n\tconst expected = new Vector3(-4.677914006701843, -5, -7.288149322420796);\n\n\ta.setFromSpherical(sph);\n\tassert.ok(Math.abs(a.x - expected.x) <= eps, 'Check x');\n\tassert.ok(Math.abs(a.y - expected.y) <= eps, 'Check y');\n\tassert.ok(Math.abs(a.z - expected.z) <= eps, 'Check z');\n});\n\nQUnit.test('setFromMatrixPosition', assert => {\n\tconst a = new Vector3();\n\tconst m = new Matrix4().set(2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53);\n\n\ta.setFromMatrixPosition(m);\n\tassert.strictEqual(a.x, 7, 'Check x');\n\tassert.strictEqual(a.y, 19, 'Check y');\n\tassert.strictEqual(a.z, 37, 'Check z');\n});\n\nQUnit.test('setFromMatrixScale', assert => {\n\tconst a = new Vector3();\n\tconst m = new Matrix4().set(2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53);\n\tconst expected = new Vector3(25.573423705088842, 31.921779399024736, 35.70714214271425);\n\n\ta.setFromMatrixScale(m);\n\tassert.ok(Math.abs(a.x - expected.x) <= eps, 'Check x');\n\tassert.ok(Math.abs(a.y - expected.y) <= eps, 'Check y');\n\tassert.ok(Math.abs(a.z - expected.z) <= eps, 'Check z');\n});\n\nQUnit.test('setFromMatrixColumn', assert => {\n\tconst a = new Vector3();\n\tconst m = new Matrix4().set(2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53);\n\n\ta.setFromMatrixColumn(m, 0);\n\tassert.strictEqual(a.x, 2, 'Index 0: check x');\n\tassert.strictEqual(a.y, 11, 'Index 0: check y');\n\tassert.strictEqual(a.z, 23, 'Index 0: check z');\n\n\ta.setFromMatrixColumn(m, 2);\n\tassert.strictEqual(a.x, 5, 'Index 2: check x');\n\tassert.strictEqual(a.y, 17, 'Index 2: check y');\n\tassert.strictEqual(a.z, 31, 'Index 2: check z');\n});\n\nQUnit.test('equals', assert => {\n\tconst a = new Vector3(x, 0, z);\n\tconst b = new Vector3(0, -y, 0);\n\n\tassert.ok(a.x != b.x, 'Passed!');\n\tassert.ok(a.y != b.y, 'Passed!');\n\tassert.ok(a.z != b.z, 'Passed!');\n\n\tassert.ok(!a.equals(b), 'Passed!');\n\tassert.ok(!b.equals(a), 'Passed!');\n\n\ta.copy(b);\n\tassert.ok(a.x == b.x, 'Passed!');\n\tassert.ok(a.y == b.y, 'Passed!');\n\tassert.ok(a.z == b.z, 'Passed!');\n\n\tassert.ok(a.equals(b), 'Passed!');\n\tassert.ok(b.equals(a), 'Passed!');\n});\n\nQUnit.test('fromArray', assert => {\n\tconst a = new Vector3();\n\tconst array = [1, 2, 3, 4, 5, 6];\n\n\ta.fromArray(array);\n\tassert.strictEqual(a.x, 1, 'No offset: check x');\n\tassert.strictEqual(a.y, 2, 'No offset: check y');\n\tassert.strictEqual(a.z, 3, 'No offset: check z');\n\n\ta.fromArray(array, 3);\n\tassert.strictEqual(a.x, 4, 'With offset: check x');\n\tassert.strictEqual(a.y, 5, 'With offset: check y');\n\tassert.strictEqual(a.z, 6, 'With offset: check z');\n});\n\nQUnit.test('toArray', assert => {\n\tconst a = new Vector3(x, y, z);\n\n\tlet array = a.toArray();\n\tassert.strictEqual(array[0], x, 'No array, no offset: check x');\n\tassert.strictEqual(array[1], y, 'No array, no offset: check y');\n\tassert.strictEqual(array[2], z, 'No array, no offset: check z');\n\n\tarray = [];\n\ta.toArray(array);\n\tassert.strictEqual(array[0], x, 'With array, no offset: check x');\n\tassert.strictEqual(array[1], y, 'With array, no offset: check y');\n\tassert.strictEqual(array[2], z, 'With array, no offset: check z');\n\n\tarray = [];\n\ta.toArray(array, 1);\n\tassert.strictEqual(array[0], undefined, 'With array and offset: check [0]');\n\tassert.strictEqual(array[1], x, 'With array and offset: check x');\n\tassert.strictEqual(array[2], y, 'With array and offset: check y');\n\tassert.strictEqual(array[3], z, 'With array and offset: check z');\n});\n\nQUnit.test('distanceTo/distanceToSquared', assert => {\n\tconst a = new Vector3(x, 0, 0);\n\tconst b = new Vector3(0, -y, 0);\n\tconst c = new Vector3(0, 0, z);\n\tconst d = new Vector3();\n\n\tassert.ok(a.distanceTo(d) == x, 'Passed!');\n\tassert.ok(a.distanceToSquared(d) == x * x, 'Passed!');\n\n\tassert.ok(b.distanceTo(d) == y, 'Passed!');\n\tassert.ok(b.distanceToSquared(d) == y * y, 'Passed!');\n\n\tassert.ok(c.distanceTo(d) == z, 'Passed!');\n\tassert.ok(c.distanceToSquared(d) == z * z, 'Passed!');\n});\n\nQUnit.test('setScalar/addScalar', assert => {\n\tconst a = new Vector3();\n\tconst s = 3;\n\n\ta.setScalar(s);\n\tassert.strictEqual(a.x, s, 'setScalar: check x');\n\tassert.strictEqual(a.y, s, 'setScalar: check y');\n\tassert.strictEqual(a.z, s, 'setScalar: check z');\n\n\ta.addScalar(s);\n\tassert.strictEqual(a.x, 2 * s, 'addScalar: check x');\n\tassert.strictEqual(a.y, 2 * s, 'addScalar: check y');\n\tassert.strictEqual(a.z, 2 * s, 'addScalar: check z');\n});\n\nQUnit.test('multiply', assert => {\n\tconst a = new Vector3(x, y, z);\n\tconst b = new Vector3(2 * x, 2 * y, 2 * z);\n\n\ta.multiply(b);\n\tassert.strictEqual(a.x, x * b.x, 'multiply: check x');\n\tassert.strictEqual(a.y, y * b.y, 'multiply: check y');\n\tassert.strictEqual(a.z, z * b.z, 'multiply: check z');\n});\n\nQUnit.test('multiplyScalar', assert => {\n\tconst a = new Vector3(x, y, z);\n\tconst b = new Vector3(-x, -y, -z);\n\n\ta.multiplyScalar(-2);\n\tassert.ok(a.x == x * -2, 'Passed!');\n\tassert.ok(a.y == y * -2, 'Passed!');\n\tassert.ok(a.z == z * -2, 'Passed!');\n\n\tb.multiplyScalar(-2);\n\tassert.ok(b.x == 2 * x, 'Passed!');\n\tassert.ok(b.y == 2 * y, 'Passed!');\n\tassert.ok(b.z == 2 * z, 'Passed!');\n});\n\nQUnit.todo('project/unproject', assert => {\n\tassert.ok(false, 'everything\\'s gonna be alright');\n});\n\nQUnit.test('getLength/getLengthSquared', assert => {\n\tconst a = new Vector3(x, 0, 0);\n\tconst b = new Vector3(0, -y, 0);\n\tconst c = new Vector3(0, 0, z);\n\tconst d = new Vector3();\n\n\tassert.ok(a.getLength() == x, 'Passed!');\n\tassert.ok(a.getLengthSquared() == x * x, 'Passed!');\n\tassert.ok(b.getLength() == y, 'Passed!');\n\tassert.ok(b.getLengthSquared() == y * y, 'Passed!');\n\tassert.ok(c.getLength() == z, 'Passed!');\n\tassert.ok(c.getLengthSquared() == z * z, 'Passed!');\n\tassert.ok(d.getLength() == 0, 'Passed!');\n\tassert.ok(d.getLengthSquared() == 0, 'Passed!');\n\n\ta.set(x, y, z);\n\tassert.ok(a.getLength() == Math.sqrt(x * x + y * y + z * z), 'Passed!');\n\tassert.ok(a.getLengthSquared() == (x * x + y * y + z * z), 'Passed!');\n});\n\nQUnit.test('lerp/clone', assert => {\n\tconst a = new Vector3(x, 0, z);\n\tconst b = new Vector3(0, -y, 0);\n\n\tassert.ok(a.lerp(a, 0).equals(a.lerp(a, 0.5)), 'Passed!');\n\tassert.ok(a.lerp(a, 0).equals(a.lerp(a, 1)), 'Passed!');\n\n\tassert.ok(a.clone().lerp(b, 0).equals(a), 'Passed!');\n\n\tassert.ok(a.clone().lerp(b, 0.5).x == x * 0.5, 'Passed!');\n\tassert.ok(a.clone().lerp(b, 0.5).y == -y * 0.5, 'Passed!');\n\tassert.ok(a.clone().lerp(b, 0.5).z == z * 0.5, 'Passed!');\n\n\tassert.ok(a.clone().lerp(b, 1).equals(b), 'Passed!');\n});\n\nQUnit.test('iterable', assert => {\n\tconst v = new Vector3(0, 0.5, 1);\n\tconst array = [...v];\n\tassert.strictEqual(array[0], 0, 'Vector3 is iterable.');\n\tassert.strictEqual(array[1], 0.5, 'Vector3 is iterable.');\n\tassert.strictEqual(array[2], 1, 'Vector3 is iterable.');\n});"
  },
  {
    "path": "tests/unit/src/math/Vector4.tests.js",
    "content": "import { Vector4 } from 't3d';\nimport { x, y, z, w } from '../../utils/math-constants.js';\n\nQUnit.module('Vector4');\n\nQUnit.test('fromArray', assert => {\n\tconst array = new Float32Array([1, 2, 3, 4]);\n\tconst a = new Vector4();\n\ta.fromArray(array, 0, true);\n\tassert.ok(a.x == 1, 'Passed!');\n\tassert.ok(a.y == 2, 'Passed!');\n\tassert.ok(a.z == 3, 'Passed!');\n\tassert.ok(a.w == 4, 'Passed!');\n});\n\nQUnit.test('toArray', assert => {\n\tconst array = new Float32Array(4);\n\tconst a = new Vector4(1, 2, 3, 4);\n\ta.toArray(array, 0, true);\n\tassert.ok(array[0] == 1, 'Passed!');\n\tassert.ok(array[1] == 2, 'Passed!');\n\tassert.ok(array[2] == 3, 'Passed!');\n\tassert.ok(array[3] == 4, 'Passed!');\n});\n\nQUnit.test('clone', assert => {\n\tconst a = new Vector4().clone();\n\tassert.ok(a.x == 0, 'Passed!');\n\tassert.ok(a.y == 0, 'Passed!');\n\tassert.ok(a.z == 0, 'Passed!');\n\tassert.ok(a.w == 1, 'Passed!');\n\n\tconst b = a.set(x, y, z, w).clone();\n\tassert.ok(b.x == x, 'Passed!');\n\tassert.ok(b.y == y, 'Passed!');\n\tassert.ok(b.z === z, 'Passed!');\n\tassert.ok(b.w === w, 'Passed!');\n});\n\nQUnit.test('iterable', assert => {\n\tconst v = new Vector4(0, 0.3, 0.7, 1);\n\tconst array = [...v];\n\tassert.strictEqual(array[0], 0, 'Vector4 is iterable.');\n\tassert.strictEqual(array[1], 0.3, 'Vector4 is iterable.');\n\tassert.strictEqual(array[2], 0.7, 'Vector4 is iterable.');\n\tassert.strictEqual(array[3], 1, 'Vector4 is iterable.');\n});"
  },
  {
    "path": "tests/unit/utils/math-constants.js",
    "content": "import { Vector2, Vector3 } from 't3d';\n\nexport const x = 2;\nexport const y = 3;\nexport const z = 4;\nexport const w = 5;\n\nexport const negInf2 = new Vector2(-Infinity, -Infinity);\nexport const posInf2 = new Vector2(Infinity, Infinity);\n\nexport const negOne2 = new Vector2(-1, -1);\n\nexport const zero2 = new Vector2();\nexport const one2 = new Vector2(1, 1);\nexport const two2 = new Vector2(2, 2);\n\nexport const negInf3 = new Vector3(-Infinity, -Infinity, -Infinity);\nexport const posInf3 = new Vector3(Infinity, Infinity, Infinity);\n\nexport const zero3 = new Vector3();\nexport const one3 = new Vector3(1, 1, 1);\nexport const two3 = new Vector3(2, 2, 2);\n\nexport const eps = 0.0001;"
  },
  {
    "path": "tools/doc.config.json",
    "content": "{\n    \"source\": {\n        \"include\": [\"./src\"]\n    },\n    \"plugins\": [\"plugins/markdown\"],\n    \"templates\": {\n        \"default\": {\n            \"outputSourceFiles\": false\n        }\n    },\n    \"opts\":{\n        \"encoding\": \"utf8\",\n        \"destination\": \"./docs\",\n        \"recurse\": true,\n        \"verbose\": true,\n        \"readme\": \"./README.md\",\n        \"template\": \"node_modules/clean-jsdoc-theme\",\n        \"theme_opts\": {\n            \"favicon\": \"../examples/favicon.ico\",\n            \"title\": \"t3d.js\",\n            \"homepageTitle\": \"t3d.js API\",\n            \"default_theme\": \"fallback-light\",\n            \"exclude_inherited\": false,\n            \"menu\": [\n                {\n                    \"title\": \"Github\",\n                    \"link\": \"https://github.com/uinosoft/t3d.js\",\n                    \"target\": \"_blank\"\n                },\n                {\n                    \"title\": \"Npm\",\n                    \"link\": \"https://www.npmjs.com/package/t3d\",\n                    \"target\": \"_blank\"\n                }\n            ]\n        }\n    },\n    \"markdown\": {\n        \"hardwrap\": false,\n        \"idInHeadings\": true\n    }\n}\n"
  }
]